aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMarisa-Chan2014-06-13 21:43:04 +0700
committerMarisa-Chan2014-06-13 21:43:04 +0700
commit45589950c0fb1a449351e6a00ef10d42290d8bae (patch)
tree44e4eedcb7e69d5fc386155b000ed038af07251d
parent48360645dcd5f8fddb135b6e31ae5cae4be8d77f (diff)
parent5c005ad3a3f1df0bc968c85c1cf0fc48e36ab0b2 (diff)
downloadscummvm-rg350-45589950c0fb1a449351e6a00ef10d42290d8bae.tar.gz
scummvm-rg350-45589950c0fb1a449351e6a00ef10d42290d8bae.tar.bz2
scummvm-rg350-45589950c0fb1a449351e6a00ef10d42290d8bae.zip
Merge remote-tracking branch 'upstream/master' into zvision
Conflicts: engines/zvision/animation/rlf_animation.cpp engines/zvision/animation_control.h engines/zvision/core/console.cpp engines/zvision/core/events.cpp engines/zvision/cursors/cursor.cpp engines/zvision/cursors/cursor_manager.cpp engines/zvision/cursors/cursor_manager.h engines/zvision/fonts/truetype_font.cpp engines/zvision/graphics/render_manager.cpp engines/zvision/graphics/render_manager.h engines/zvision/inventory/inventory_manager.h engines/zvision/inventory_manager.h engines/zvision/meta_animation.h engines/zvision/module.mk engines/zvision/scripting/actions.cpp engines/zvision/scripting/control.h engines/zvision/scripting/controls/animation_control.cpp engines/zvision/scripting/controls/animation_control.h engines/zvision/scripting/controls/input_control.cpp engines/zvision/scripting/controls/lever_control.cpp engines/zvision/scripting/controls/timer_node.cpp engines/zvision/scripting/controls/timer_node.h engines/zvision/scripting/puzzle.h engines/zvision/scripting/scr_file_handling.cpp engines/zvision/scripting/script_manager.cpp engines/zvision/scripting/script_manager.h engines/zvision/sidefx.cpp engines/zvision/sound/zork_raw.cpp engines/zvision/sound/zork_raw.h engines/zvision/video/video.cpp engines/zvision/video/zork_avi_decoder.h engines/zvision/zvision.cpp engines/zvision/zvision.h
-rw-r--r--.gitignore10
-rw-r--r--AUTHORS401
-rw-r--r--COPYRIGHT2
-rw-r--r--Makefile16
-rw-r--r--Makefile.common11
-rw-r--r--NEWS59
-rw-r--r--README69
-rw-r--r--audio/audiostream.cpp4
-rw-r--r--audio/audiostream.h4
-rw-r--r--audio/decoders/adpcm.cpp4
-rw-r--r--audio/decoders/adpcm.h4
-rw-r--r--audio/decoders/adpcm_intern.h4
-rw-r--r--audio/decoders/aiff.cpp4
-rw-r--r--audio/decoders/aiff.h4
-rw-r--r--audio/decoders/flac.cpp4
-rw-r--r--audio/decoders/flac.h4
-rw-r--r--audio/decoders/iff_sound.cpp4
-rw-r--r--audio/decoders/iff_sound.h4
-rw-r--r--audio/decoders/mac_snd.cpp4
-rw-r--r--audio/decoders/mac_snd.h4
-rw-r--r--audio/decoders/mp3.cpp4
-rw-r--r--audio/decoders/mp3.h4
-rw-r--r--audio/decoders/qdm2.cpp4
-rw-r--r--audio/decoders/qdm2.h4
-rw-r--r--audio/decoders/qdm2data.h4
-rw-r--r--audio/decoders/quicktime.cpp8
-rw-r--r--audio/decoders/raw.cpp4
-rw-r--r--audio/decoders/raw.h4
-rw-r--r--audio/decoders/voc.cpp6
-rw-r--r--audio/decoders/voc.h4
-rw-r--r--audio/decoders/vorbis.cpp4
-rw-r--r--audio/decoders/vorbis.h4
-rw-r--r--audio/decoders/wave.cpp4
-rw-r--r--audio/decoders/wave.h4
-rw-r--r--audio/decoders/xa.cpp4
-rw-r--r--audio/decoders/xa.h4
-rw-r--r--audio/fmopl.cpp1
-rw-r--r--audio/fmopl.h1
-rw-r--r--audio/mididrv.cpp4
-rw-r--r--audio/mididrv.h4
-rw-r--r--audio/midiparser.cpp26
-rw-r--r--audio/midiparser.h6
-rw-r--r--audio/midiparser_qt.cpp4
-rw-r--r--audio/midiparser_qt.h4
-rw-r--r--audio/midiparser_smf.cpp4
-rw-r--r--audio/midiparser_xmidi.cpp4
-rw-r--r--audio/midiplayer.cpp4
-rw-r--r--audio/midiplayer.h4
-rw-r--r--audio/mixer.cpp12
-rw-r--r--audio/mixer.h4
-rw-r--r--audio/mixer_intern.h4
-rw-r--r--audio/mods/infogrames.cpp4
-rw-r--r--audio/mods/infogrames.h4
-rw-r--r--audio/mods/maxtrax.cpp4
-rw-r--r--audio/mods/maxtrax.h4
-rw-r--r--audio/mods/module.cpp4
-rw-r--r--audio/mods/module.h4
-rw-r--r--audio/mods/paula.cpp4
-rw-r--r--audio/mods/paula.h4
-rw-r--r--audio/mods/protracker.cpp4
-rw-r--r--audio/mods/protracker.h4
-rw-r--r--audio/mods/rjp1.cpp4
-rw-r--r--audio/mods/rjp1.h4
-rw-r--r--audio/mods/soundfx.cpp4
-rw-r--r--audio/mods/soundfx.h4
-rw-r--r--audio/mods/tfmx.cpp4
-rw-r--r--audio/mods/tfmx.h4
-rw-r--r--audio/mpu401.cpp1
-rw-r--r--audio/mpu401.h4
-rw-r--r--audio/musicplugin.cpp4
-rw-r--r--audio/musicplugin.h1
-rw-r--r--audio/null.cpp1
-rw-r--r--audio/null.h1
-rw-r--r--audio/rate.cpp4
-rw-r--r--audio/rate.h4
-rw-r--r--audio/rate_arm.cpp4
-rw-r--r--audio/rate_arm_asm.s9
-rw-r--r--audio/softsynth/adlib.cpp1
-rw-r--r--audio/softsynth/appleiigs.cpp40
-rw-r--r--audio/softsynth/cms.cpp1
-rw-r--r--audio/softsynth/cms.h1
-rw-r--r--audio/softsynth/eas.cpp3
-rw-r--r--audio/softsynth/emumidi.h1
-rw-r--r--audio/softsynth/fluidsynth.cpp4
-rw-r--r--audio/softsynth/fmtowns_pc98/towns_audio.cpp4
-rw-r--r--audio/softsynth/fmtowns_pc98/towns_audio.h4
-rw-r--r--audio/softsynth/fmtowns_pc98/towns_euphony.cpp4
-rw-r--r--audio/softsynth/fmtowns_pc98/towns_euphony.h4
-rw-r--r--audio/softsynth/fmtowns_pc98/towns_pc98_driver.cpp4
-rw-r--r--audio/softsynth/fmtowns_pc98/towns_pc98_driver.h4
-rw-r--r--audio/softsynth/fmtowns_pc98/towns_pc98_fmsynth.cpp4
-rw-r--r--audio/softsynth/fmtowns_pc98/towns_pc98_fmsynth.h4
-rw-r--r--audio/softsynth/mt32.cpp15
-rw-r--r--audio/softsynth/opl/dosbox.cpp1
-rw-r--r--audio/softsynth/opl/dosbox.h1
-rw-r--r--audio/softsynth/opl/mame.cpp5
-rw-r--r--audio/softsynth/opl/mame.h5
-rw-r--r--audio/softsynth/pcspk.cpp40
-rw-r--r--audio/softsynth/pcspk.h1
-rw-r--r--audio/softsynth/sid.cpp4
-rw-r--r--audio/softsynth/sid.h4
-rw-r--r--audio/softsynth/wave6581.cpp4
-rw-r--r--audio/timestamp.cpp4
-rw-r--r--audio/timestamp.h4
-rw-r--r--backends/audiocd/audiocd.h4
-rw-r--r--backends/audiocd/default/default-audiocd.cpp4
-rw-r--r--backends/audiocd/default/default-audiocd.h4
-rw-r--r--backends/audiocd/sdl/sdl-audiocd.cpp4
-rw-r--r--backends/audiocd/sdl/sdl-audiocd.h4
-rw-r--r--backends/base-backend.h4
-rw-r--r--backends/events/default/default-events.cpp4
-rw-r--r--backends/events/default/default-events.h4
-rw-r--r--backends/events/dinguxsdl/dinguxsdl-events.cpp4
-rw-r--r--backends/events/dinguxsdl/dinguxsdl-events.h4
-rw-r--r--backends/events/gph/gph-events.cpp4
-rw-r--r--backends/events/gph/gph-events.h4
-rw-r--r--backends/events/linuxmotosdl/linuxmotosdl-events.cpp4
-rw-r--r--backends/events/linuxmotosdl/linuxmotosdl-events.h4
-rw-r--r--backends/events/maemosdl/maemosdl-events.cpp6
-rw-r--r--backends/events/maemosdl/maemosdl-events.h4
-rw-r--r--backends/events/openpandora/op-events.cpp4
-rw-r--r--backends/events/openpandora/op-events.h4
-rw-r--r--backends/events/ps3sdl/ps3sdl-events.cpp4
-rw-r--r--backends/events/ps3sdl/ps3sdl-events.h4
-rw-r--r--backends/events/samsungtvsdl/samsungtvsdl-events.cpp4
-rw-r--r--backends/events/samsungtvsdl/samsungtvsdl-events.h4
-rw-r--r--backends/events/sdl/sdl-events.cpp15
-rw-r--r--backends/events/sdl/sdl-events.h4
-rw-r--r--backends/events/symbiansdl/symbiansdl-events.cpp4
-rw-r--r--backends/events/symbiansdl/symbiansdl-events.h4
-rw-r--r--backends/events/webossdl/webossdl-events.cpp4
-rw-r--r--backends/events/webossdl/webossdl-events.h4
-rw-r--r--backends/events/wincesdl/wincesdl-events.cpp4
-rw-r--r--backends/events/wincesdl/wincesdl-events.h4
-rw-r--r--backends/fs/abstract-fs.cpp1
-rw-r--r--backends/fs/abstract-fs.h1
-rw-r--r--backends/fs/amigaos4/amigaos4-fs-factory.cpp1
-rw-r--r--backends/fs/amigaos4/amigaos4-fs-factory.h1
-rw-r--r--backends/fs/amigaos4/amigaos4-fs.cpp28
-rw-r--r--backends/fs/amigaos4/amigaos4-fs.h7
-rw-r--r--backends/fs/ds/ds-fs-factory.cpp1
-rw-r--r--backends/fs/ds/ds-fs-factory.h1
-rw-r--r--backends/fs/ds/ds-fs.cpp4
-rw-r--r--backends/fs/ds/ds-fs.h4
-rw-r--r--backends/fs/fs-factory.h1
-rw-r--r--backends/fs/n64/n64-fs-factory.cpp1
-rw-r--r--backends/fs/n64/n64-fs-factory.h1
-rw-r--r--backends/fs/n64/n64-fs.h1
-rw-r--r--backends/fs/n64/romfsstream.cpp4
-rw-r--r--backends/fs/n64/romfsstream.h4
-rw-r--r--backends/fs/posix/posix-fs-factory.cpp1
-rw-r--r--backends/fs/posix/posix-fs-factory.h1
-rw-r--r--backends/fs/posix/posix-fs.cpp1
-rw-r--r--backends/fs/posix/posix-fs.h1
-rw-r--r--backends/fs/ps2/ps2-fs-factory.cpp1
-rw-r--r--backends/fs/ps2/ps2-fs-factory.h1
-rw-r--r--backends/fs/ps2/ps2-fs.cpp48
-rw-r--r--backends/fs/ps2/ps2-fs.h5
-rw-r--r--backends/fs/ps3/ps3-fs-factory.cpp1
-rw-r--r--backends/fs/ps3/ps3-fs-factory.h1
-rw-r--r--backends/fs/psp/psp-fs-factory.cpp1
-rw-r--r--backends/fs/psp/psp-fs-factory.h1
-rw-r--r--backends/fs/psp/psp-fs.cpp1
-rw-r--r--backends/fs/psp/psp-fs.h1
-rw-r--r--backends/fs/psp/psp-stream.cpp4
-rw-r--r--backends/fs/psp/psp-stream.h4
-rw-r--r--backends/fs/stdiostream.cpp4
-rw-r--r--backends/fs/stdiostream.h4
-rw-r--r--backends/fs/symbian/symbian-fs-factory.cpp1
-rw-r--r--backends/fs/symbian/symbian-fs-factory.h1
-rw-r--r--backends/fs/symbian/symbian-fs.cpp1
-rw-r--r--backends/fs/symbian/symbian-fs.h1
-rw-r--r--backends/fs/symbian/symbianstream.cpp4
-rw-r--r--backends/fs/symbian/symbianstream.h4
-rw-r--r--backends/fs/wii/wii-fs-factory.cpp15
-rw-r--r--backends/fs/wii/wii-fs.cpp44
-rw-r--r--backends/fs/wii/wii-fs.h3
-rw-r--r--backends/fs/windows/windows-fs-factory.cpp1
-rw-r--r--backends/fs/windows/windows-fs-factory.h1
-rw-r--r--backends/fs/windows/windows-fs.cpp1
-rw-r--r--backends/fs/windows/windows-fs.h1
-rw-r--r--backends/graphics/default-palette.h4
-rw-r--r--backends/graphics/dinguxsdl/dinguxsdl-graphics.cpp4
-rw-r--r--backends/graphics/dinguxsdl/dinguxsdl-graphics.h4
-rw-r--r--backends/graphics/gph/gph-graphics.cpp4
-rw-r--r--backends/graphics/gph/gph-graphics.h4
-rw-r--r--backends/graphics/graphics.h4
-rw-r--r--backends/graphics/linuxmotosdl/linuxmotosdl-graphics.cpp4
-rw-r--r--backends/graphics/linuxmotosdl/linuxmotosdl-graphics.h4
-rw-r--r--backends/graphics/maemosdl/maemosdl-graphics.cpp4
-rw-r--r--backends/graphics/maemosdl/maemosdl-graphics.h4
-rw-r--r--backends/graphics/null/null-graphics.h4
-rw-r--r--backends/graphics/opengl/debug.cpp65
-rw-r--r--backends/graphics/opengl/debug.h39
-rw-r--r--backends/graphics/opengl/extensions.cpp48
-rw-r--r--backends/graphics/opengl/extensions.h41
-rw-r--r--backends/graphics/opengl/gltexture.cpp225
-rw-r--r--backends/graphics/opengl/gltexture.h131
-rw-r--r--backends/graphics/opengl/opengl-graphics.cpp1842
-rw-r--r--backends/graphics/opengl/opengl-graphics.h511
-rw-r--r--backends/graphics/opengl/opengl-sys.h (renamed from backends/graphics/opengl/glerrorcheck.cpp)50
-rw-r--r--backends/graphics/opengl/texture.cpp374
-rw-r--r--backends/graphics/opengl/texture.h175
-rw-r--r--backends/graphics/openglsdl/openglsdl-graphics.cpp934
-rw-r--r--backends/graphics/openglsdl/openglsdl-graphics.h132
-rw-r--r--backends/graphics/openpandora/op-graphics.cpp4
-rw-r--r--backends/graphics/openpandora/op-graphics.h4
-rw-r--r--backends/graphics/samsungtvsdl/samsungtvsdl-graphics.cpp4
-rw-r--r--backends/graphics/samsungtvsdl/samsungtvsdl-graphics.h4
-rw-r--r--backends/graphics/sdl/sdl-graphics.cpp13
-rw-r--r--backends/graphics/sdl/sdl-graphics.h24
-rw-r--r--backends/graphics/surfacesdl/surfacesdl-graphics.cpp45
-rw-r--r--backends/graphics/surfacesdl/surfacesdl-graphics.h10
-rw-r--r--backends/graphics/symbiansdl/symbiansdl-graphics.cpp4
-rw-r--r--backends/graphics/symbiansdl/symbiansdl-graphics.h4
-rw-r--r--backends/graphics/wincesdl/wincesdl-graphics.cpp4
-rw-r--r--backends/graphics/wincesdl/wincesdl-graphics.h4
-rw-r--r--backends/keymapper/action.cpp40
-rw-r--r--backends/keymapper/action.h40
-rw-r--r--backends/keymapper/hardware-input.cpp40
-rw-r--r--backends/keymapper/hardware-input.h40
-rw-r--r--backends/keymapper/keymap.cpp40
-rw-r--r--backends/keymapper/keymap.h40
-rw-r--r--backends/keymapper/keymapper-defaults.h40
-rw-r--r--backends/keymapper/keymapper.cpp40
-rw-r--r--backends/keymapper/keymapper.h40
-rw-r--r--backends/keymapper/remap-dialog.cpp7
-rw-r--r--backends/keymapper/remap-dialog.h1
-rw-r--r--backends/midi/alsa.cpp1
-rw-r--r--backends/midi/camd.cpp11
-rw-r--r--backends/midi/coreaudio.cpp1
-rw-r--r--backends/midi/coremidi.cpp1
-rw-r--r--backends/midi/dmedia.cpp1
-rw-r--r--backends/midi/seq.cpp1
-rw-r--r--backends/midi/sndio.cpp1
-rw-r--r--backends/midi/stmidi.cpp1
-rw-r--r--backends/midi/timidity.cpp1
-rw-r--r--backends/midi/windows.cpp1
-rw-r--r--backends/mixer/doublebuffersdl/doublebuffersdl-mixer.cpp4
-rw-r--r--backends/mixer/doublebuffersdl/doublebuffersdl-mixer.h4
-rw-r--r--backends/mixer/nullmixer/nullsdl-mixer.cpp4
-rw-r--r--backends/mixer/nullmixer/nullsdl-mixer.h4
-rw-r--r--backends/mixer/sdl/sdl-mixer.cpp10
-rw-r--r--backends/mixer/sdl/sdl-mixer.h4
-rw-r--r--backends/mixer/sdl13/sdl13-mixer.cpp4
-rw-r--r--backends/mixer/sdl13/sdl13-mixer.h4
-rw-r--r--backends/mixer/symbiansdl/symbiansdl-mixer.cpp4
-rw-r--r--backends/mixer/symbiansdl/symbiansdl-mixer.h4
-rw-r--r--backends/mixer/wincesdl/wincesdl-mixer.cpp4
-rw-r--r--backends/mixer/wincesdl/wincesdl-mixer.h4
-rw-r--r--backends/modular-backend.cpp4
-rw-r--r--backends/modular-backend.h4
-rw-r--r--backends/module.mk25
-rw-r--r--backends/mutex/mutex.h4
-rw-r--r--backends/mutex/null/null-mutex.h4
-rw-r--r--backends/mutex/sdl/sdl-mutex.cpp4
-rw-r--r--backends/mutex/sdl/sdl-mutex.h4
-rw-r--r--backends/platform/android/android.cpp6
-rw-r--r--backends/platform/android/android.h6
-rw-r--r--backends/platform/android/android.mk1
-rw-r--r--backends/platform/android/asset-archive.cpp4
-rw-r--r--backends/platform/android/asset-archive.h4
-rw-r--r--backends/platform/android/events.cpp6
-rw-r--r--backends/platform/android/gfx.cpp23
-rw-r--r--backends/platform/android/jni.cpp6
-rw-r--r--backends/platform/android/jni.h6
-rw-r--r--backends/platform/android/org/scummvm/scummvm/ScummVM.java8
-rw-r--r--backends/platform/android/org/scummvm/scummvm/ScummVMActivity.java10
-rw-r--r--backends/platform/android/org/scummvm/scummvm/ScummVMEvents.java10
-rw-r--r--backends/platform/android/org/scummvm/scummvm/ScummVMEventsHoneycomb.java25
-rw-r--r--backends/platform/android/texture.cpp23
-rw-r--r--backends/platform/android/texture.h16
-rw-r--r--backends/platform/dc/DCLauncherDialog.h4
-rw-r--r--backends/platform/dc/audio.cpp4
-rw-r--r--backends/platform/dc/dc-fs.cpp3
-rw-r--r--backends/platform/dc/dc.h6
-rw-r--r--backends/platform/dc/dcloader.cpp4
-rw-r--r--backends/platform/dc/dcloader.h4
-rw-r--r--backends/platform/dc/dcmain.cpp10
-rw-r--r--backends/platform/dc/display.cpp4
-rw-r--r--backends/platform/dc/icon.cpp8
-rw-r--r--backends/platform/dc/icon.h4
-rw-r--r--backends/platform/dc/input.cpp15
-rw-r--r--backends/platform/dc/ip.txt.in2
-rw-r--r--backends/platform/dc/label.cpp4
-rw-r--r--backends/platform/dc/label.h4
-rw-r--r--backends/platform/dc/plugins.cpp4
-rw-r--r--backends/platform/dc/portdefs.h4
-rw-r--r--backends/platform/dc/selector.cpp4
-rw-r--r--backends/platform/dc/softkbd.cpp4
-rw-r--r--backends/platform/dc/softkbd.h5
-rw-r--r--backends/platform/dc/time.cpp4
-rw-r--r--backends/platform/dc/vmsave.cpp4
-rw-r--r--backends/platform/dingux/dingux.cpp4
-rw-r--r--backends/platform/dingux/dingux.h4
-rw-r--r--backends/platform/dingux/main.cpp4
-rw-r--r--backends/platform/ds/arm7/source/main.cpp4
-rw-r--r--backends/platform/ds/arm9/source/blitters.cpp4
-rw-r--r--backends/platform/ds/arm9/source/blitters.h4
-rw-r--r--backends/platform/ds/arm9/source/cdaudio.cpp4
-rw-r--r--backends/platform/ds/arm9/source/cdaudio.h4
-rw-r--r--backends/platform/ds/arm9/source/dsmain.cpp4
-rw-r--r--backends/platform/ds/arm9/source/dsmain.h4
-rw-r--r--backends/platform/ds/arm9/source/dsoptions.cpp4
-rw-r--r--backends/platform/ds/arm9/source/dsoptions.h4
-rw-r--r--backends/platform/ds/arm9/source/gbampsave.cpp4
-rw-r--r--backends/platform/ds/arm9/source/gbampsave.h4
-rw-r--r--backends/platform/ds/arm9/source/keys.h4
-rw-r--r--backends/platform/ds/arm9/source/osystem_ds.cpp3
-rw-r--r--backends/platform/ds/arm9/source/osystem_ds.h4
-rw-r--r--backends/platform/ds/arm9/source/portdefs.h4
-rw-r--r--backends/platform/ds/arm9/source/scummhelp.cpp4
-rw-r--r--backends/platform/ds/arm9/source/scummhelp.h4
-rw-r--r--backends/platform/ds/arm9/source/touchkeyboard.cpp3
-rw-r--r--backends/platform/ds/arm9/source/touchkeyboard.h4
-rw-r--r--backends/platform/ds/arm9/source/wordcompletion.cpp4
-rw-r--r--backends/platform/ds/arm9/source/wordcompletion.h4
-rw-r--r--backends/platform/ds/arm9/source/zipreader.cpp4
-rw-r--r--backends/platform/ds/arm9/source/zipreader.h4
-rw-r--r--backends/platform/ds/commoninclude/NDS/scummvm_ipc.h1
-rw-r--r--backends/platform/gph/gph-backend.cpp6
-rw-r--r--backends/platform/gph/gph-hw.cpp4
-rw-r--r--backends/platform/gph/gph-hw.h4
-rw-r--r--backends/platform/gph/gph-main.cpp4
-rw-r--r--backends/platform/gph/gph.h4
-rw-r--r--backends/platform/iphone/iphone_common.h4
-rw-r--r--backends/platform/iphone/iphone_keyboard.h4
-rw-r--r--backends/platform/iphone/iphone_keyboard.mm6
-rw-r--r--backends/platform/iphone/iphone_main.mm4
-rw-r--r--backends/platform/iphone/iphone_video.h5
-rw-r--r--backends/platform/iphone/iphone_video.mm25
-rw-r--r--backends/platform/iphone/osys_events.cpp4
-rw-r--r--backends/platform/iphone/osys_main.cpp4
-rw-r--r--backends/platform/iphone/osys_main.h4
-rw-r--r--backends/platform/iphone/osys_sound.cpp4
-rw-r--r--backends/platform/iphone/osys_video.mm4
-rw-r--r--backends/platform/linuxmoto/hardwarekeys.cpp4
-rw-r--r--backends/platform/linuxmoto/linuxmoto-main.cpp4
-rw-r--r--backends/platform/linuxmoto/linuxmoto-sdl.cpp4
-rw-r--r--backends/platform/linuxmoto/linuxmoto-sdl.h4
-rw-r--r--backends/platform/maemo/maemo-common.h4
-rw-r--r--backends/platform/maemo/maemo.cpp4
-rw-r--r--backends/platform/maemo/maemo.h4
-rw-r--r--backends/platform/maemo/main.cpp4
-rw-r--r--backends/platform/n64/framfs_save_manager.cpp4
-rw-r--r--backends/platform/n64/framfs_save_manager.h4
-rw-r--r--backends/platform/n64/nintendo64.cpp4
-rw-r--r--backends/platform/n64/osys_n64.h4
-rw-r--r--backends/platform/n64/osys_n64_base.cpp4
-rw-r--r--backends/platform/n64/osys_n64_events.cpp4
-rw-r--r--backends/platform/n64/osys_n64_utilities.cpp4
-rw-r--r--backends/platform/n64/pakfs_save_manager.cpp4
-rw-r--r--backends/platform/n64/pakfs_save_manager.h4
-rw-r--r--backends/platform/n64/portdefs.h4
-rw-r--r--backends/platform/null/null.cpp20
-rw-r--r--backends/platform/openpandora/op-backend.cpp6
-rw-r--r--backends/platform/openpandora/op-main.cpp4
-rw-r--r--backends/platform/openpandora/op-options.cpp4
-rw-r--r--backends/platform/openpandora/op-options.h4
-rw-r--r--backends/platform/openpandora/op-sdl.h4
-rw-r--r--backends/platform/ps2/DmaPipe.cpp12
-rw-r--r--backends/platform/ps2/DmaPipe.h4
-rw-r--r--backends/platform/ps2/Gs2dScreen.cpp265
-rw-r--r--backends/platform/ps2/Gs2dScreen.h19
-rw-r--r--backends/platform/ps2/GsDefs.h176
-rw-r--r--backends/platform/ps2/Makefile.gdb104
-rw-r--r--backends/platform/ps2/Makefile.ps2232
-rw-r--r--backends/platform/ps2/Makefile.ps2.dev170
-rw-r--r--backends/platform/ps2/README.PS2189
-rw-r--r--backends/platform/ps2/asyncfio.cpp18
-rw-r--r--backends/platform/ps2/asyncfio.h7
-rw-r--r--backends/platform/ps2/cd.c38
-rw-r--r--backends/platform/ps2/eecodyvdfs.h6
-rw-r--r--backends/platform/ps2/fileio.cpp52
-rw-r--r--backends/platform/ps2/fileio.h18
-rw-r--r--backends/platform/ps2/icon.cpp6
-rw-r--r--backends/platform/ps2/icon.h4
-rw-r--r--backends/platform/ps2/iop/CoDyVDfs/common/codyvdirx.h18
-rw-r--r--backends/platform/ps2/iop/CoDyVDfs/iop/cdtypes.h92
-rw-r--r--backends/platform/ps2/iop/CoDyVDfs/iop/codyvdfs.c72
-rw-r--r--backends/platform/ps2/iop/CoDyVDfs/iop/codyvdfs.h32
-rw-r--r--backends/platform/ps2/iop/CoDyVDfs/iop/fiofs.c12
-rw-r--r--backends/platform/ps2/iop/CoDyVDfs/iop/fiofs.h4
-rw-r--r--backends/platform/ps2/iop/CoDyVDfs/iop/irx_imports.h4
-rw-r--r--backends/platform/ps2/iop/CoDyVDfs/iop/rpcfs.c12
-rw-r--r--backends/platform/ps2/iop/rpckbd/include/ps2kbd.h4
-rw-r--r--backends/platform/ps2/iop/rpckbd/src/irx_imports.h4
-rw-r--r--backends/platform/ps2/iop/rpckbd/src/ps2kbd.c4
-rw-r--r--backends/platform/ps2/irxboot.cpp89
-rw-r--r--backends/platform/ps2/irxboot.h17
-rw-r--r--backends/platform/ps2/module.mk20
-rw-r--r--backends/platform/ps2/ps2debug.cpp7
-rw-r--r--backends/platform/ps2/ps2debug.h12
-rw-r--r--backends/platform/ps2/ps2input.cpp74
-rw-r--r--backends/platform/ps2/ps2input.h6
-rw-r--r--backends/platform/ps2/ps2mutex.cpp4
-rw-r--r--backends/platform/ps2/ps2pad.cpp12
-rw-r--r--backends/platform/ps2/ps2pad.h4
-rw-r--r--backends/platform/ps2/ps2temp.h4
-rw-r--r--backends/platform/ps2/ps2time.cpp10
-rw-r--r--backends/platform/ps2/rpckbd.c2
-rw-r--r--backends/platform/ps2/rpckbd.h4
-rw-r--r--backends/platform/ps2/savefilemgr.cpp37
-rw-r--r--backends/platform/ps2/savefilemgr.h4
-rw-r--r--backends/platform/ps2/sysdefs.h38
-rw-r--r--backends/platform/ps2/systemps2.cpp359
-rw-r--r--backends/platform/ps2/systemps2.h37
-rw-r--r--backends/platform/psp/audio.cpp4
-rw-r--r--backends/platform/psp/audio.h4
-rw-r--r--backends/platform/psp/cursor.cpp4
-rw-r--r--backends/platform/psp/cursor.h4
-rw-r--r--backends/platform/psp/default_display_client.cpp4
-rw-r--r--backends/platform/psp/default_display_client.h4
-rw-r--r--backends/platform/psp/display_client.cpp4
-rw-r--r--backends/platform/psp/display_client.h4
-rw-r--r--backends/platform/psp/display_manager.cpp4
-rw-r--r--backends/platform/psp/display_manager.h4
-rw-r--r--backends/platform/psp/dummy.cpp4
-rw-r--r--backends/platform/psp/image_viewer.cpp4
-rw-r--r--backends/platform/psp/image_viewer.h4
-rw-r--r--backends/platform/psp/input.cpp4
-rw-r--r--backends/platform/psp/input.h4
-rw-r--r--backends/platform/psp/memory.cpp4
-rw-r--r--backends/platform/psp/memory.h4
-rw-r--r--backends/platform/psp/mp3.cpp4
-rw-r--r--backends/platform/psp/mp3.h4
-rw-r--r--backends/platform/psp/osys_psp.cpp4
-rw-r--r--backends/platform/psp/osys_psp.h4
-rw-r--r--backends/platform/psp/png_loader.cpp4
-rw-r--r--backends/platform/psp/png_loader.h4
-rw-r--r--backends/platform/psp/portdefs.h4
-rw-r--r--backends/platform/psp/powerman.cpp4
-rw-r--r--backends/platform/psp/powerman.h4
-rw-r--r--backends/platform/psp/psp_main.cpp4
-rw-r--r--backends/platform/psp/pspkeyboard.cpp4
-rw-r--r--backends/platform/psp/pspkeyboard.h4
-rw-r--r--backends/platform/psp/psppixelformat.cpp4
-rw-r--r--backends/platform/psp/psppixelformat.h4
-rw-r--r--backends/platform/psp/rtc.cpp4
-rw-r--r--backends/platform/psp/rtc.h4
-rw-r--r--backends/platform/psp/tests.cpp4
-rw-r--r--backends/platform/psp/tests.h4
-rw-r--r--backends/platform/psp/thread.cpp4
-rw-r--r--backends/platform/psp/thread.h4
-rw-r--r--backends/platform/psp/trace.cpp4
-rw-r--r--backends/platform/psp/trace.h4
-rw-r--r--backends/platform/samsungtv/main.cpp4
-rw-r--r--backends/platform/samsungtv/samsungtv.cpp4
-rw-r--r--backends/platform/samsungtv/samsungtv.h4
-rw-r--r--backends/platform/sdl/amigaos/amigaos-main.cpp4
-rw-r--r--backends/platform/sdl/amigaos/amigaos.cpp4
-rw-r--r--backends/platform/sdl/amigaos/amigaos.h4
-rw-r--r--backends/platform/sdl/macosx/appmenu_osx.h4
-rw-r--r--backends/platform/sdl/macosx/appmenu_osx.mm4
-rw-r--r--backends/platform/sdl/macosx/macosx-main.cpp4
-rw-r--r--backends/platform/sdl/macosx/macosx.cpp19
-rw-r--r--backends/platform/sdl/macosx/macosx.h5
-rw-r--r--backends/platform/sdl/posix/posix-main.cpp4
-rw-r--r--backends/platform/sdl/posix/posix.cpp19
-rw-r--r--backends/platform/sdl/posix/posix.h4
-rw-r--r--backends/platform/sdl/ps3/ps3-main.cpp4
-rw-r--r--backends/platform/sdl/ps3/ps3.cpp4
-rw-r--r--backends/platform/sdl/ps3/ps3.h4
-rw-r--r--backends/platform/sdl/sdl-sys.h4
-rw-r--r--backends/platform/sdl/sdl.cpp320
-rw-r--r--backends/platform/sdl/sdl.h19
-rw-r--r--backends/platform/sdl/win32/win32-main.cpp4
-rw-r--r--backends/platform/sdl/win32/win32.cpp4
-rw-r--r--backends/platform/sdl/win32/win32.h4
-rw-r--r--backends/platform/symbian/AdaptAllMMPs.pl81
-rw-r--r--backends/platform/symbian/BuildPackageUpload_AllVersions.pl8
-rw-r--r--backends/platform/symbian/BuildPackageUpload_LocalSettings.pl119
-rw-r--r--backends/platform/symbian/README14
-rw-r--r--backends/platform/symbian/S60/ScummVM_S60.mmp.in2
-rw-r--r--backends/platform/symbian/S60/ScummVM_S60_App.mmp2
-rw-r--r--backends/platform/symbian/S60v3/BLD.INF.in1
-rw-r--r--backends/platform/symbian/S60v3/ScummVM_A0000658_S60v3.mmp.in8
-rw-r--r--backends/platform/symbian/S60v3/ScummVM_S60v3.mmp.in11
-rw-r--r--backends/platform/symbian/S60v3/scummvm-CVS-SymbianS60v3.pkg16
-rw-r--r--backends/platform/symbian/S60v3/scummvm-CVS-SymbianS60v3_split.pkg18
-rw-r--r--backends/platform/symbian/S80/ScummVM_S80.mmp.in2
-rw-r--r--backends/platform/symbian/S80/ScummVM_S80_App.mmp2
-rw-r--r--backends/platform/symbian/S90/Scummvm_S90.mmp.in2
-rw-r--r--backends/platform/symbian/S90/Scummvm_S90_App.mmp2
-rw-r--r--backends/platform/symbian/UIQ2/ScummVM.rss2
-rw-r--r--backends/platform/symbian/UIQ2/ScummVM_UIQ2.mmp.in2
-rw-r--r--backends/platform/symbian/UIQ3/ScummVM.rss2
-rw-r--r--backends/platform/symbian/UIQ3/ScummVM_A0000658.rss2
-rw-r--r--backends/platform/symbian/UIQ3/ScummVM_A0000658_UIQ3.mmp.in5
-rw-r--r--backends/platform/symbian/UIQ3/ScummVM_UIQ3.mmp.in5
-rw-r--r--backends/platform/symbian/UIQ3/scummvm-CVS-SymbianUIQ3.pkg2
-rw-r--r--backends/platform/symbian/UIQ3/scummvm-CVS-SymbianUIQ3_split.pkg2
-rw-r--r--backends/platform/symbian/UIQ3/scummvm_A0000658_loc.rss2
-rw-r--r--backends/platform/symbian/help/Custom.xml18
-rw-r--r--backends/platform/symbian/help/ScummVM.rtf341
-rw-r--r--backends/platform/symbian/help/ScummVM.xml19
-rw-r--r--backends/platform/symbian/help/build_help.mk29
-rw-r--r--backends/platform/symbian/mmp/scummvm_agi.mmp.in12
-rw-r--r--backends/platform/symbian/mmp/scummvm_agos.mmp.in12
-rw-r--r--backends/platform/symbian/mmp/scummvm_avalanche.mmp.in72
-rw-r--r--backends/platform/symbian/mmp/scummvm_base.mmp.in27
-rw-r--r--backends/platform/symbian/mmp/scummvm_bbvs.mmp.in72
-rw-r--r--backends/platform/symbian/mmp/scummvm_cge.mmp.in12
-rw-r--r--backends/platform/symbian/mmp/scummvm_cine.mmp.in13
-rw-r--r--backends/platform/symbian/mmp/scummvm_composer.mmp.in12
-rw-r--r--backends/platform/symbian/mmp/scummvm_cruise.mmp.in13
-rw-r--r--backends/platform/symbian/mmp/scummvm_draci.mmp.in12
-rw-r--r--backends/platform/symbian/mmp/scummvm_drascula.mmp.in13
-rw-r--r--backends/platform/symbian/mmp/scummvm_dreamweb.mmp.in72
-rw-r--r--backends/platform/symbian/mmp/scummvm_fullpipe.mmp.in72
-rw-r--r--backends/platform/symbian/mmp/scummvm_gob.mmp.in13
-rw-r--r--backends/platform/symbian/mmp/scummvm_groovie.mmp.in13
-rw-r--r--backends/platform/symbian/mmp/scummvm_hopkins.mmp.in12
-rw-r--r--backends/platform/symbian/mmp/scummvm_hugo.mmp.in12
-rw-r--r--backends/platform/symbian/mmp/scummvm_kyra.mmp.in20
-rw-r--r--backends/platform/symbian/mmp/scummvm_lastexpress.mmp.in12
-rw-r--r--backends/platform/symbian/mmp/scummvm_lure.mmp.in13
-rw-r--r--backends/platform/symbian/mmp/scummvm_m4.mmp.in12
-rw-r--r--backends/platform/symbian/mmp/scummvm_made.mmp.in13
-rw-r--r--backends/platform/symbian/mmp/scummvm_mads.mmp.in72
-rw-r--r--backends/platform/symbian/mmp/scummvm_mohawk.mmp.in31
-rw-r--r--backends/platform/symbian/mmp/scummvm_mortevielle.mmp.in72
-rw-r--r--backends/platform/symbian/mmp/scummvm_neverhood.mmp.in71
-rw-r--r--backends/platform/symbian/mmp/scummvm_parallaction.mmp.in12
-rw-r--r--backends/platform/symbian/mmp/scummvm_pegasus.mmp.in12
-rw-r--r--backends/platform/symbian/mmp/scummvm_queen.mmp.in13
-rw-r--r--backends/platform/symbian/mmp/scummvm_saga.mmp.in13
-rw-r--r--backends/platform/symbian/mmp/scummvm_sci.mmp.in20
-rw-r--r--backends/platform/symbian/mmp/scummvm_scumm.mmp.in7
-rw-r--r--backends/platform/symbian/mmp/scummvm_sky.mmp.in13
-rw-r--r--backends/platform/symbian/mmp/scummvm_sword1.mmp.in13
-rw-r--r--backends/platform/symbian/mmp/scummvm_sword2.mmp.in13
-rw-r--r--backends/platform/symbian/mmp/scummvm_sword25.mmp.in73
-rw-r--r--backends/platform/symbian/mmp/scummvm_teenagent.mmp.in12
-rw-r--r--backends/platform/symbian/mmp/scummvm_testbed.mmp.in72
-rw-r--r--backends/platform/symbian/mmp/scummvm_tinsel.mmp.in13
-rw-r--r--backends/platform/symbian/mmp/scummvm_toltecs.mmp.in12
-rw-r--r--backends/platform/symbian/mmp/scummvm_tony.mmp.in12
-rw-r--r--backends/platform/symbian/mmp/scummvm_toon.mmp.in12
-rw-r--r--backends/platform/symbian/mmp/scummvm_touche.mmp.in12
-rw-r--r--backends/platform/symbian/mmp/scummvm_tsage.mmp.in15
-rw-r--r--backends/platform/symbian/mmp/scummvm_tucker.mmp.in12
-rw-r--r--backends/platform/symbian/mmp/scummvm_voyeur.mmp.in71
-rw-r--r--backends/platform/symbian/mmp/scummvm_wintermute.mmp.in15
-rw-r--r--backends/platform/symbian/mmp/scummvm_zvision.mmp.in71
-rw-r--r--backends/platform/symbian/res/ScummVmAif.rss2
-rw-r--r--backends/platform/symbian/res/scummvm.rss2
-rw-r--r--backends/platform/symbian/res/scummvm_A0000658.rss2
-rw-r--r--backends/platform/symbian/src/ScummApp.cpp1
-rw-r--r--backends/platform/symbian/src/ScummApp.h1
-rw-r--r--backends/platform/symbian/src/ScummVm.hrh2
-rw-r--r--backends/platform/symbian/src/SymbianActions.cpp4
-rw-r--r--backends/platform/symbian/src/SymbianActions.h4
-rw-r--r--backends/platform/symbian/src/SymbianMain.cpp4
-rw-r--r--backends/platform/symbian/src/SymbianOS.cpp6
-rw-r--r--backends/platform/symbian/src/SymbianOS.h1
-rw-r--r--backends/platform/symbian/src/portdefs.h3
-rw-r--r--backends/platform/tizen/application.cpp2
-rw-r--r--backends/platform/tizen/application.h2
-rw-r--r--backends/platform/tizen/audio.cpp2
-rw-r--r--backends/platform/tizen/audio.h2
-rw-r--r--backends/platform/tizen/form.cpp2
-rw-r--r--backends/platform/tizen/form.h2
-rw-r--r--backends/platform/tizen/fs.cpp3
-rw-r--r--backends/platform/tizen/fs.h3
-rw-r--r--backends/platform/tizen/graphics.cpp109
-rw-r--r--backends/platform/tizen/graphics.h23
-rw-r--r--backends/platform/tizen/main.cpp2
-rw-r--r--backends/platform/tizen/missing.cpp2
-rw-r--r--backends/platform/tizen/portdefs.h2
-rw-r--r--backends/platform/tizen/sscanf.cpp2
-rw-r--r--backends/platform/tizen/system.cpp6
-rw-r--r--backends/platform/tizen/system.h4
-rw-r--r--backends/platform/webos/main.cpp4
-rw-r--r--backends/platform/webos/webos.cpp4
-rw-r--r--backends/platform/webos/webos.h4
-rw-r--r--backends/platform/wii/main.cpp8
-rw-r--r--backends/platform/wii/options.cpp2
-rw-r--r--backends/platform/wii/options.h2
-rw-r--r--backends/platform/wii/osystem.cpp5
-rw-r--r--backends/platform/wii/osystem.h5
-rw-r--r--backends/platform/wii/osystem_events.cpp7
-rw-r--r--backends/platform/wii/osystem_gfx.cpp9
-rw-r--r--backends/platform/wii/osystem_sfx.cpp5
-rw-r--r--backends/platform/wii/wii.mk4
-rw-r--r--backends/platform/wince/CEActionsPocket.cpp6
-rw-r--r--backends/platform/wince/CEActionsPocket.h4
-rw-r--r--backends/platform/wince/CEActionsSmartphone.cpp6
-rw-r--r--backends/platform/wince/CEActionsSmartphone.h4
-rw-r--r--backends/platform/wince/CEDevice.cpp4
-rw-r--r--backends/platform/wince/CEDevice.h4
-rw-r--r--backends/platform/wince/CEException.cpp4
-rw-r--r--backends/platform/wince/CEException.h4
-rw-r--r--backends/platform/wince/CELauncherDialog.cpp8
-rw-r--r--backends/platform/wince/CELauncherDialog.h4
-rw-r--r--backends/platform/wince/CEScaler.cpp4
-rw-r--r--backends/platform/wince/CEScaler.h4
-rw-r--r--backends/platform/wince/CEgui/CEGUI.h4
-rw-r--r--backends/platform/wince/CEgui/GUIElement.cpp4
-rw-r--r--backends/platform/wince/CEgui/GUIElement.h4
-rw-r--r--backends/platform/wince/CEgui/ItemAction.cpp4
-rw-r--r--backends/platform/wince/CEgui/ItemAction.h4
-rw-r--r--backends/platform/wince/CEgui/ItemSwitch.cpp4
-rw-r--r--backends/platform/wince/CEgui/ItemSwitch.h4
-rw-r--r--backends/platform/wince/CEgui/Panel.cpp4
-rw-r--r--backends/platform/wince/CEgui/Panel.h4
-rw-r--r--backends/platform/wince/CEgui/PanelItem.cpp4
-rw-r--r--backends/platform/wince/CEgui/PanelItem.h4
-rw-r--r--backends/platform/wince/CEgui/PanelKeyboard.cpp4
-rw-r--r--backends/platform/wince/CEgui/PanelKeyboard.h4
-rw-r--r--backends/platform/wince/CEgui/SDL_ImageResource.cpp4
-rw-r--r--backends/platform/wince/CEgui/SDL_ImageResource.h4
-rw-r--r--backends/platform/wince/CEgui/Toolbar.cpp4
-rw-r--r--backends/platform/wince/CEgui/Toolbar.h4
-rw-r--r--backends/platform/wince/CEgui/ToolbarHandler.cpp4
-rw-r--r--backends/platform/wince/CEgui/ToolbarHandler.h4
-rw-r--r--backends/platform/wince/CEkeys/CEKeys.h4
-rw-r--r--backends/platform/wince/CEkeys/EventsBuffer.cpp4
-rw-r--r--backends/platform/wince/CEkeys/EventsBuffer.h4
-rw-r--r--backends/platform/wince/missing/missing.cpp4
-rw-r--r--backends/platform/wince/portdefs.h4
-rw-r--r--backends/platform/wince/stub.cpp4
-rw-r--r--backends/platform/wince/wince-sdl.cpp18
-rw-r--r--backends/platform/wince/wince-sdl.h4
-rw-r--r--backends/plugins/ds/ds-provider.cpp4
-rw-r--r--backends/plugins/ds/ds-provider.h4
-rw-r--r--backends/plugins/dynamic-plugin.h4
-rw-r--r--backends/plugins/elf/arm-loader.cpp4
-rw-r--r--backends/plugins/elf/arm-loader.h4
-rw-r--r--backends/plugins/elf/elf-loader.cpp4
-rw-r--r--backends/plugins/elf/elf-loader.h4
-rw-r--r--backends/plugins/elf/elf-provider.cpp4
-rw-r--r--backends/plugins/elf/elf-provider.h4
-rw-r--r--backends/plugins/elf/elf32.h4
-rw-r--r--backends/plugins/elf/memory-manager.cpp4
-rw-r--r--backends/plugins/elf/memory-manager.h4
-rw-r--r--backends/plugins/elf/mips-loader.cpp4
-rw-r--r--backends/plugins/elf/mips-loader.h4
-rw-r--r--backends/plugins/elf/ppc-loader.cpp4
-rw-r--r--backends/plugins/elf/ppc-loader.h4
-rw-r--r--backends/plugins/elf/shorts-segment-manager.cpp4
-rw-r--r--backends/plugins/elf/shorts-segment-manager.h4
-rw-r--r--backends/plugins/elf/version.cpp12
-rw-r--r--backends/plugins/elf/version.h1
-rw-r--r--backends/plugins/posix/posix-provider.cpp4
-rw-r--r--backends/plugins/posix/posix-provider.h4
-rw-r--r--backends/plugins/ps2/ps2-provider.cpp4
-rw-r--r--backends/plugins/ps2/ps2-provider.h4
-rw-r--r--backends/plugins/psp/psp-provider.cpp4
-rw-r--r--backends/plugins/psp/psp-provider.h4
-rw-r--r--backends/plugins/sdl/sdl-provider.cpp4
-rw-r--r--backends/plugins/sdl/sdl-provider.h4
-rw-r--r--backends/plugins/wii/wii-provider.cpp4
-rw-r--r--backends/plugins/wii/wii-provider.h4
-rw-r--r--backends/plugins/win32/win32-provider.cpp4
-rw-r--r--backends/plugins/win32/win32-provider.h4
-rw-r--r--backends/saves/default/default-saves.cpp4
-rw-r--r--backends/saves/default/default-saves.h4
-rw-r--r--backends/saves/posix/posix-saves.cpp4
-rw-r--r--backends/saves/posix/posix-saves.h4
-rw-r--r--backends/saves/psp/psp-saves.cpp4
-rw-r--r--backends/saves/psp/psp-saves.h4
-rw-r--r--backends/saves/recorder/recorder-saves.cpp4
-rw-r--r--backends/saves/recorder/recorder-saves.h4
-rw-r--r--backends/saves/savefile.cpp4
-rw-r--r--backends/saves/windows/windows-saves.cpp4
-rw-r--r--backends/saves/windows/windows-saves.h4
-rw-r--r--backends/taskbar/macosx/macosx-taskbar.h57
-rw-r--r--backends/taskbar/macosx/macosx-taskbar.mm238
-rw-r--r--backends/taskbar/unity/unity-taskbar.cpp2
-rw-r--r--backends/taskbar/unity/unity-taskbar.h2
-rw-r--r--backends/timer/default/default-timer.cpp1
-rw-r--r--backends/timer/default/default-timer.h1
-rw-r--r--backends/timer/psp/timer.cpp4
-rw-r--r--backends/timer/psp/timer.h4
-rw-r--r--backends/timer/sdl/sdl-timer.cpp4
-rw-r--r--backends/timer/sdl/sdl-timer.h4
-rw-r--r--backends/timer/tizen/timer.cpp2
-rw-r--r--backends/timer/tizen/timer.h2
-rw-r--r--backends/updates/macosx/macosx-updates.h4
-rw-r--r--backends/updates/macosx/macosx-updates.mm4
-rw-r--r--backends/vkeybd/virtual-keyboard-gui.cpp40
-rw-r--r--backends/vkeybd/virtual-keyboard-gui.h40
-rw-r--r--backends/vkeybd/virtual-keyboard-parser.cpp4
-rw-r--r--base/commandLine.cpp4
-rw-r--r--base/commandLine.h4
-rw-r--r--base/main.cpp23
-rw-r--r--base/main.h4
-rw-r--r--base/plugins.cpp6
-rw-r--r--base/plugins.h4
-rw-r--r--base/version.cpp10
-rw-r--r--base/version.h1
-rw-r--r--common/EventDispatcher.cpp4
-rw-r--r--common/EventMapper.cpp10
-rw-r--r--common/algorithm.h1
-rw-r--r--common/archive.cpp4
-rw-r--r--common/archive.h4
-rw-r--r--common/array.h1
-rw-r--r--common/bitstream.h13
-rw-r--r--common/bufferedstream.h4
-rw-r--r--common/c++11-compat.h6
-rw-r--r--common/config-manager.cpp4
-rw-r--r--common/config-manager.h4
-rw-r--r--common/coroutines.cpp1
-rw-r--r--common/coroutines.h1
-rw-r--r--common/cosinetables.cpp4
-rw-r--r--common/cosinetables.h4
-rw-r--r--common/dcl.cpp4
-rw-r--r--common/dcl.h4
-rw-r--r--common/dct.cpp18
-rw-r--r--common/dct.h4
-rw-r--r--common/debug-channels.h12
-rw-r--r--common/debug.cpp17
-rw-r--r--common/debug.h1
-rw-r--r--common/endian.h4
-rw-r--r--common/error.cpp4
-rw-r--r--common/error.h4
-rw-r--r--common/events.h4
-rw-r--r--common/fft.cpp4
-rw-r--r--common/fft.h4
-rw-r--r--common/file.cpp4
-rw-r--r--common/file.h4
-rw-r--r--common/forbidden.h4
-rw-r--r--common/frac.h4
-rw-r--r--common/fs.cpp1
-rw-r--r--common/fs.h1
-rw-r--r--common/func.h1
-rw-r--r--common/gui_options.cpp4
-rw-r--r--common/gui_options.h4
-rw-r--r--common/hash-str.h1
-rw-r--r--common/hashmap.cpp4
-rw-r--r--common/hashmap.h4
-rw-r--r--common/huffman.cpp4
-rw-r--r--common/huffman.h4
-rw-r--r--common/iff_container.cpp4
-rw-r--r--common/iff_container.h1
-rw-r--r--common/ini-file.cpp8
-rw-r--r--common/ini-file.h8
-rw-r--r--common/installshield_cab.cpp4
-rw-r--r--common/installshield_cab.h4
-rw-r--r--common/keyboard.h4
-rw-r--r--common/language.cpp4
-rw-r--r--common/language.h4
-rw-r--r--common/list.h1
-rw-r--r--common/list_intern.h1
-rw-r--r--common/localization.cpp1
-rw-r--r--common/localization.h1
-rw-r--r--common/macresman.cpp4
-rw-r--r--common/macresman.h4
-rw-r--r--common/math.h8
-rw-r--r--common/md5.cpp1
-rw-r--r--common/md5.h1
-rw-r--r--common/memory.h1
-rw-r--r--common/memorypool.cpp4
-rw-r--r--common/memorypool.h4
-rw-r--r--common/memstream.h4
-rw-r--r--common/module.mk1
-rw-r--r--common/mutex.cpp4
-rw-r--r--common/mutex.h4
-rw-r--r--common/noncopyable.h4
-rw-r--r--common/pack-end.h1
-rw-r--r--common/pack-start.h1
-rw-r--r--common/platform.cpp1
-rw-r--r--common/platform.h1
-rw-r--r--common/ptr.h1
-rw-r--r--common/queue.h1
-rw-r--r--common/quicktime.cpp46
-rw-r--r--common/quicktime.h9
-rw-r--r--common/random.cpp1
-rw-r--r--common/random.h1
-rw-r--r--common/rational.cpp1
-rw-r--r--common/rational.h1
-rw-r--r--common/rdft.cpp18
-rw-r--r--common/rdft.h4
-rw-r--r--common/recorderfile.cpp6
-rw-r--r--common/recorderfile.h4
-rw-r--r--common/rect.h4
-rw-r--r--common/rendermode.cpp4
-rw-r--r--common/rendermode.h4
-rw-r--r--common/savefile.h4
-rw-r--r--common/scummsys.h11
-rw-r--r--common/serializer.h4
-rw-r--r--common/sinetables.cpp4
-rw-r--r--common/sinetables.h4
-rw-r--r--common/singleton.h4
-rw-r--r--common/stack.h1
-rw-r--r--common/str-array.h4
-rw-r--r--common/str.cpp1
-rw-r--r--common/str.h8
-rw-r--r--common/stream.cpp4
-rw-r--r--common/stream.h4
-rw-r--r--common/substream.h4
-rw-r--r--common/system.cpp4
-rw-r--r--common/system.h4
-rw-r--r--common/textconsole.cpp1
-rw-r--r--common/textconsole.h1
-rw-r--r--common/timer.h1
-rw-r--r--common/tokenizer.cpp1
-rw-r--r--common/tokenizer.h1
-rw-r--r--common/translation.cpp1
-rw-r--r--common/translation.h1
-rw-r--r--common/types.h1
-rw-r--r--common/unzip.cpp1
-rw-r--r--common/unzip.h1
-rw-r--r--common/updates.h4
-rw-r--r--common/ustr.cpp330
-rw-r--r--common/ustr.h195
-rw-r--r--common/util.cpp1
-rw-r--r--common/util.h1
-rw-r--r--common/winexe.cpp4
-rw-r--r--common/winexe.h4
-rw-r--r--common/winexe_ne.cpp6
-rw-r--r--common/winexe_ne.h6
-rw-r--r--common/winexe_pe.cpp4
-rw-r--r--common/winexe_pe.h4
-rw-r--r--common/zlib.cpp28
-rw-r--r--common/zlib.h4
-rwxr-xr-xconfigure303
-rw-r--r--devtools/convbdf.cpp4
-rw-r--r--devtools/create_drascula/create_drascula.cpp4
-rw-r--r--devtools/create_drascula/create_drascula.h4
-rw-r--r--devtools/create_drascula/staticdata.h4
-rw-r--r--devtools/create_hugo/create_hugo.cpp4
-rw-r--r--devtools/create_hugo/create_hugo.h4
-rw-r--r--devtools/create_hugo/staticdata.h4
-rw-r--r--devtools/create_hugo/staticdisplay.h4
-rw-r--r--devtools/create_hugo/staticengine.h4
-rw-r--r--devtools/create_hugo/staticfont.h4
-rw-r--r--devtools/create_hugo/staticintro.h4
-rw-r--r--devtools/create_hugo/staticmouse.h4
-rw-r--r--devtools/create_hugo/staticparser.h4
-rw-r--r--devtools/create_hugo/staticutil.h4
-rw-r--r--devtools/create_kyradat/create_kyradat.cpp2969
-rw-r--r--devtools/create_kyradat/create_kyradat.h178
-rw-r--r--devtools/create_kyradat/extract.cpp1237
-rw-r--r--devtools/create_kyradat/extract.h78
-rw-r--r--devtools/create_kyradat/games.cpp289
-rw-r--r--devtools/create_kyradat/md5.cpp4
-rw-r--r--devtools/create_kyradat/md5.h4
-rw-r--r--devtools/create_kyradat/module.mk5
-rw-r--r--devtools/create_kyradat/pak.cpp4
-rw-r--r--devtools/create_kyradat/pak.h4
-rw-r--r--devtools/create_kyradat/resources.cpp1950
-rw-r--r--devtools/create_kyradat/resources.h45
-rw-r--r--devtools/create_kyradat/resources/eob1_dos.h1765
-rw-r--r--devtools/create_kyradat/resources/eob1_dos_english.h891
-rw-r--r--devtools/create_kyradat/resources/eob1_dos_german.h893
-rw-r--r--devtools/create_kyradat/resources/eob2_dos.h2501
-rw-r--r--devtools/create_kyradat/resources/eob2_dos_english.h1347
-rw-r--r--devtools/create_kyradat/resources/eob2_dos_german.h1414
-rw-r--r--devtools/create_kyradat/resources/hof_dos.h769
-rw-r--r--devtools/create_kyradat/resources/hof_dos_cd.h1035
-rw-r--r--devtools/create_kyradat/resources/hof_dos_cd_english.h128
-rw-r--r--devtools/create_kyradat/resources/hof_dos_cd_french.h128
-rw-r--r--devtools/create_kyradat/resources/hof_dos_cd_german.h128
-rw-r--r--devtools/create_kyradat/resources/hof_dos_cd_italian.h128
-rw-r--r--devtools/create_kyradat/resources/hof_dos_cd_russian.h128
-rw-r--r--devtools/create_kyradat/resources/hof_dos_cddemo.h1035
-rw-r--r--devtools/create_kyradat/resources/hof_dos_cddemo_english.h139
-rw-r--r--devtools/create_kyradat/resources/hof_dos_cddemo_french.h139
-rw-r--r--devtools/create_kyradat/resources/hof_dos_cddemo_german.h139
-rw-r--r--devtools/create_kyradat/resources/hof_dos_demo.h77
-rw-r--r--devtools/create_kyradat/resources/hof_dos_english.h108
-rw-r--r--devtools/create_kyradat/resources/hof_dos_french.h108
-rw-r--r--devtools/create_kyradat/resources/hof_dos_german.h108
-rw-r--r--devtools/create_kyradat/resources/hof_dos_italian.h108
-rw-r--r--devtools/create_kyradat/resources/hof_dos_russian.h133
-rw-r--r--devtools/create_kyradat/resources/hof_fmtowns.h716
-rw-r--r--devtools/create_kyradat/resources/hof_fmtowns_english.h110
-rw-r--r--devtools/create_kyradat/resources/hof_fmtowns_japanese.h110
-rw-r--r--devtools/create_kyradat/resources/hof_pc98.h656
-rw-r--r--devtools/create_kyradat/resources/hof_pc98_english.h110
-rw-r--r--devtools/create_kyradat/resources/hof_pc98_japanese.h110
-rw-r--r--devtools/create_kyradat/resources/lok_amiga.h1763
-rw-r--r--devtools/create_kyradat/resources/lok_amiga_english.h497
-rw-r--r--devtools/create_kyradat/resources/lok_amiga_german.h492
-rw-r--r--devtools/create_kyradat/resources/lok_dos.h1925
-rw-r--r--devtools/create_kyradat/resources/lok_dos_cd.h1997
-rw-r--r--devtools/create_kyradat/resources/lok_dos_cd_english.h428
-rw-r--r--devtools/create_kyradat/resources/lok_dos_cd_french.h349
-rw-r--r--devtools/create_kyradat/resources/lok_dos_cd_german.h370
-rw-r--r--devtools/create_kyradat/resources/lok_dos_cd_italian.h346
-rw-r--r--devtools/create_kyradat/resources/lok_dos_cddemo.h593
-rw-r--r--devtools/create_kyradat/resources/lok_dos_cddemo_english.h56
-rw-r--r--devtools/create_kyradat/resources/lok_dos_demo.h112
-rw-r--r--devtools/create_kyradat/resources/lok_dos_demo_english.h37
-rw-r--r--devtools/create_kyradat/resources/lok_dos_english.h335
-rw-r--r--devtools/create_kyradat/resources/lok_dos_french.h341
-rw-r--r--devtools/create_kyradat/resources/lok_dos_german.h361
-rw-r--r--devtools/create_kyradat/resources/lok_dos_italian.h366
-rw-r--r--devtools/create_kyradat/resources/lok_dos_oldfloppy.h1911
-rw-r--r--devtools/create_kyradat/resources/lok_dos_oldfloppy_russian.h328
-rw-r--r--devtools/create_kyradat/resources/lok_dos_spanish.h333
-rw-r--r--devtools/create_kyradat/resources/lok_fmtowns.h11637
-rw-r--r--devtools/create_kyradat/resources/lok_fmtowns_english.h527
-rw-r--r--devtools/create_kyradat/resources/lok_fmtowns_japanese.h527
-rw-r--r--devtools/create_kyradat/resources/lok_pc98.h2000
-rw-r--r--devtools/create_kyradat/resources/lok_pc98_japanese.h558
-rw-r--r--devtools/create_kyradat/resources/lol_dos.h1558
-rw-r--r--devtools/create_kyradat/resources/lol_dos_cd.h1625
-rw-r--r--devtools/create_kyradat/resources/lol_dos_cd_english.h68
-rw-r--r--devtools/create_kyradat/resources/lol_dos_cd_french.h68
-rw-r--r--devtools/create_kyradat/resources/lol_dos_cd_german.h68
-rw-r--r--devtools/create_kyradat/resources/lol_dos_cd_italian.h68
-rw-r--r--devtools/create_kyradat/resources/lol_dos_cd_russian.h68
-rw-r--r--devtools/create_kyradat/resources/lol_dos_demo.h54
-rw-r--r--devtools/create_kyradat/resources/lol_dos_demo_english.h15
-rw-r--r--devtools/create_kyradat/resources/lol_dos_english.h68
-rw-r--r--devtools/create_kyradat/resources/lol_dos_french.h68
-rw-r--r--devtools/create_kyradat/resources/lol_dos_german.h68
-rw-r--r--devtools/create_kyradat/resources/lol_dos_russian.h68
-rw-r--r--devtools/create_kyradat/resources/lol_fmtowns.h1600
-rw-r--r--devtools/create_kyradat/resources/lol_fmtowns_japanese.h68
-rw-r--r--devtools/create_kyradat/resources/lol_pc98.h1598
-rw-r--r--devtools/create_kyradat/resources/lol_pc98_japanese.h68
-rw-r--r--devtools/create_kyradat/resources/mr_dos_cd.h556
-rw-r--r--devtools/create_kyradat/search.cpp215
-rw-r--r--devtools/create_kyradat/search.h116
-rw-r--r--devtools/create_kyradat/tables.cpp4479
-rw-r--r--devtools/create_kyradat/types.cpp663
-rw-r--r--devtools/create_kyradat/types.h238
-rw-r--r--devtools/create_kyradat/util.cpp4
-rw-r--r--devtools/create_kyradat/util.h4
-rw-r--r--devtools/create_lure/create_lure_dat.cpp8
-rw-r--r--devtools/create_lure/create_lure_dat.h4
-rw-r--r--devtools/create_lure/process_actions.cpp4
-rw-r--r--devtools/create_mortdat/create_mortdat.cpp6
-rw-r--r--devtools/create_mortdat/create_mortdat.h4
-rw-r--r--devtools/create_mortdat/enginetext.h4
-rw-r--r--devtools/create_mortdat/gametext.h4
-rw-r--r--devtools/create_mortdat/menudata.h4
-rw-r--r--devtools/create_neverhood/create_neverhood.cpp15
-rw-r--r--devtools/create_neverhood/create_neverhood.h4
-rw-r--r--devtools/create_neverhood/md5.cpp4
-rw-r--r--devtools/create_neverhood/md5.h4
-rw-r--r--devtools/create_neverhood/tables.h5
-rw-r--r--devtools/create_neverhood/util.cpp4
-rw-r--r--devtools/create_neverhood/util.h4
-rw-r--r--devtools/create_project/codeblocks.cpp1
-rw-r--r--devtools/create_project/config.h3
-rw-r--r--devtools/create_project/create_project.cpp227
-rw-r--r--devtools/create_project/create_project.h50
-rw-r--r--devtools/create_project/msbuild.cpp10
-rw-r--r--devtools/create_project/scripts/install-natvis.bat41
-rw-r--r--devtools/create_project/scripts/scummvm.natvis91
-rw-r--r--devtools/create_project/visualstudio.cpp2
-rw-r--r--devtools/create_project/xcode.cpp31
-rw-r--r--devtools/create_teenagent/create_teenagent.cpp4
-rw-r--r--devtools/create_teenagent/static_tables.h4
-rw-r--r--devtools/create_teenagent/util.cpp4
-rw-r--r--devtools/create_teenagent/util.h4
-rw-r--r--devtools/create_tony/create_tony.cpp4
-rw-r--r--devtools/create_tony/create_tony.h4
-rw-r--r--devtools/create_tony/staticdata.h4
-rw-r--r--devtools/create_toon/create_toon.cpp4
-rw-r--r--devtools/create_toon/create_toon.h4
-rw-r--r--devtools/create_toon/staticdata.h4
-rw-r--r--devtools/create_translations/create_translations.cpp4
-rw-r--r--devtools/create_translations/create_translations.h4
-rw-r--r--devtools/create_translations/po_parser.cpp4
-rw-r--r--devtools/create_translations/po_parser.h4
-rwxr-xr-xdevtools/credits.pl43
-rw-r--r--devtools/extract_mort/extract_mort.cpp8
-rw-r--r--devtools/sci/musicplayer.cpp4
-rw-r--r--devtools/sci/scidisasm.cpp4
-rw-r--r--devtools/sci/scipack.cpp4
-rw-r--r--devtools/skycpt/AsciiCptCompile.cpp4
-rw-r--r--devtools/skycpt/KmpSearch.cpp4
-rw-r--r--devtools/skycpt/KmpSearch.h4
-rw-r--r--devtools/skycpt/TextFile.cpp4
-rw-r--r--devtools/skycpt/TextFile.h4
-rw-r--r--devtools/skycpt/cptcompiler.cpp4
-rw-r--r--devtools/skycpt/cpthelp.cpp4
-rw-r--r--devtools/skycpt/cpthelp.h4
-rw-r--r--devtools/skycpt/idFinder.cpp4
-rw-r--r--devtools/skycpt/stdafx.cpp4
-rw-r--r--devtools/skycpt/stdafx.h4
-rw-r--r--dists/debian/copyright2
-rw-r--r--dists/engine-data/README5
-rw-r--r--dists/engine-data/kyra.datbin486382 -> 485978 bytes
-rw-r--r--dists/engine-data/lure.datbin637824 -> 637824 bytes
-rw-r--r--dists/engine-data/neverhood.datbin25416 -> 23804 bytes
-rw-r--r--dists/iphone/Info.plist6
-rw-r--r--dists/iphone/Info.plist.in6
-rw-r--r--dists/macosx/Info.plist4
-rw-r--r--dists/macosx/Info.plist.in4
-rw-r--r--dists/msvc11/readme.txt5
-rw-r--r--dists/msvc12/readme.txt5
-rw-r--r--dists/scummvm.rc2
-rw-r--r--dists/scummvm.rc.in2
-rw-r--r--dists/win32/ScummVM.iss2
-rw-r--r--dists/win32/migration.bat2
-rw-r--r--dists/win32/scummvm.nsi2
-rw-r--r--dists/win32/scummvm.nsi.in2
-rw-r--r--doc/cz/PrectiMe3438
-rw-r--r--engines/advancedDetector.cpp4
-rw-r--r--engines/advancedDetector.h4
-rw-r--r--engines/agi/agi.cpp4
-rw-r--r--engines/agi/agi.h4
-rw-r--r--engines/agi/checks.cpp4
-rw-r--r--engines/agi/configure.engine3
-rw-r--r--engines/agi/console.cpp96
-rw-r--r--engines/agi/console.h4
-rw-r--r--engines/agi/cycle.cpp4
-rw-r--r--engines/agi/detection.cpp4
-rw-r--r--engines/agi/detection_tables.h6
-rw-r--r--engines/agi/font.h4
-rw-r--r--engines/agi/global.cpp4
-rw-r--r--engines/agi/graphics.cpp4
-rw-r--r--engines/agi/graphics.h4
-rw-r--r--engines/agi/id.cpp4
-rw-r--r--engines/agi/inv.cpp4
-rw-r--r--engines/agi/keyboard.cpp4
-rw-r--r--engines/agi/keyboard.h4
-rw-r--r--engines/agi/loader_v1.cpp4
-rw-r--r--engines/agi/loader_v2.cpp4
-rw-r--r--engines/agi/loader_v3.cpp4
-rw-r--r--engines/agi/logic.cpp4
-rw-r--r--engines/agi/logic.h4
-rw-r--r--engines/agi/lzw.cpp4
-rw-r--r--engines/agi/lzw.h4
-rw-r--r--engines/agi/menu.cpp4
-rw-r--r--engines/agi/menu.h4
-rw-r--r--engines/agi/motion.cpp4
-rw-r--r--engines/agi/objects.cpp4
-rw-r--r--engines/agi/op_cmd.cpp4
-rw-r--r--engines/agi/op_dbg.cpp4
-rw-r--r--engines/agi/op_test.cpp4
-rw-r--r--engines/agi/opcodes.cpp4
-rw-r--r--engines/agi/opcodes.h4
-rw-r--r--engines/agi/picture.cpp4
-rw-r--r--engines/agi/picture.h4
-rw-r--r--engines/agi/preagi.cpp4
-rw-r--r--engines/agi/preagi.h4
-rw-r--r--engines/agi/preagi_mickey.cpp8
-rw-r--r--engines/agi/preagi_mickey.h4
-rw-r--r--engines/agi/preagi_troll.cpp4
-rw-r--r--engines/agi/preagi_troll.h4
-rw-r--r--engines/agi/preagi_winnie.cpp6
-rw-r--r--engines/agi/preagi_winnie.h4
-rw-r--r--engines/agi/saveload.cpp4
-rw-r--r--engines/agi/sound.cpp4
-rw-r--r--engines/agi/sound.h4
-rw-r--r--engines/agi/sound_2gs.cpp4
-rw-r--r--engines/agi/sound_2gs.h4
-rw-r--r--engines/agi/sound_coco3.cpp4
-rw-r--r--engines/agi/sound_coco3.h4
-rw-r--r--engines/agi/sound_midi.cpp4
-rw-r--r--engines/agi/sound_midi.h4
-rw-r--r--engines/agi/sound_pcjr.cpp4
-rw-r--r--engines/agi/sound_pcjr.h4
-rw-r--r--engines/agi/sound_sarien.cpp4
-rw-r--r--engines/agi/sound_sarien.h4
-rw-r--r--engines/agi/sprite.cpp4
-rw-r--r--engines/agi/sprite.h4
-rw-r--r--engines/agi/text.cpp4
-rw-r--r--engines/agi/view.cpp4
-rw-r--r--engines/agi/view.h4
-rw-r--r--engines/agi/wagparser.cpp4
-rw-r--r--engines/agi/wagparser.h4
-rw-r--r--engines/agi/words.cpp4
-rw-r--r--engines/agos/agos.cpp32
-rw-r--r--engines/agos/agos.h66
-rw-r--r--engines/agos/animation.cpp22
-rw-r--r--engines/agos/animation.h4
-rw-r--r--engines/agos/charset-fontdata.cpp4
-rw-r--r--engines/agos/charset.cpp4
-rw-r--r--engines/agos/configure.engine4
-rw-r--r--engines/agos/contain.cpp4
-rw-r--r--engines/agos/cursor.cpp4
-rw-r--r--engines/agos/debug.cpp41
-rw-r--r--engines/agos/debug.h224
-rw-r--r--engines/agos/debugger.cpp121
-rw-r--r--engines/agos/debugger.h5
-rw-r--r--engines/agos/detection.cpp13
-rw-r--r--engines/agos/detection_tables.h32
-rw-r--r--engines/agos/draw.cpp4
-rw-r--r--engines/agos/event.cpp22
-rw-r--r--engines/agos/feeble.cpp4
-rw-r--r--engines/agos/gfx.cpp9
-rw-r--r--engines/agos/icons.cpp10
-rw-r--r--engines/agos/input.cpp113
-rw-r--r--engines/agos/input_pn.cpp4
-rw-r--r--engines/agos/intern.h25
-rw-r--r--engines/agos/items.cpp4
-rw-r--r--engines/agos/menus.cpp4
-rw-r--r--engines/agos/midi.cpp8
-rw-r--r--engines/agos/midi.h4
-rw-r--r--engines/agos/midiparser_s1d.cpp4
-rw-r--r--engines/agos/oracle.cpp8
-rw-r--r--engines/agos/pn.cpp4
-rw-r--r--engines/agos/res.cpp177
-rw-r--r--engines/agos/res_ami.cpp4
-rw-r--r--engines/agos/res_snd.cpp25
-rw-r--r--engines/agos/rooms.cpp4
-rw-r--r--engines/agos/saveload.cpp88
-rw-r--r--engines/agos/script.cpp9
-rw-r--r--engines/agos/script_dp.cpp4
-rw-r--r--engines/agos/script_e1.cpp4
-rw-r--r--engines/agos/script_e2.cpp4
-rw-r--r--engines/agos/script_ff.cpp73
-rw-r--r--engines/agos/script_pn.cpp4
-rw-r--r--engines/agos/script_pp.cpp4
-rw-r--r--engines/agos/script_s1.cpp4
-rw-r--r--engines/agos/script_s2.cpp4
-rw-r--r--engines/agos/script_ww.cpp4
-rw-r--r--engines/agos/sound.cpp20
-rw-r--r--engines/agos/sound.h4
-rw-r--r--engines/agos/string.cpp4
-rw-r--r--engines/agos/string_pn.cpp4
-rw-r--r--engines/agos/subroutine.cpp16
-rw-r--r--engines/agos/verb.cpp19
-rw-r--r--engines/agos/verb_pn.cpp4
-rw-r--r--engines/agos/vga.cpp12
-rw-r--r--engines/agos/vga.h4
-rw-r--r--engines/agos/vga_e2.cpp4
-rw-r--r--engines/agos/vga_ff.cpp4
-rw-r--r--engines/agos/vga_pn.cpp4
-rw-r--r--engines/agos/vga_s1.cpp4
-rw-r--r--engines/agos/vga_s2.cpp4
-rw-r--r--engines/agos/vga_ww.cpp4
-rw-r--r--engines/agos/window.cpp4
-rw-r--r--engines/agos/zones.cpp6
-rw-r--r--engines/avalanche/animation.cpp149
-rw-r--r--engines/avalanche/animation.h20
-rw-r--r--engines/avalanche/avalanche.cpp236
-rw-r--r--engines/avalanche/avalanche.h91
-rw-r--r--engines/avalanche/avalot.cpp246
-rw-r--r--engines/avalanche/avalot.h41
-rw-r--r--engines/avalanche/background.cpp73
-rw-r--r--engines/avalanche/background.h8
-rw-r--r--engines/avalanche/clock.cpp116
-rw-r--r--engines/avalanche/clock.h60
-rw-r--r--engines/avalanche/closing.cpp4
-rw-r--r--engines/avalanche/closing.h4
-rw-r--r--engines/avalanche/configure.engine3
-rw-r--r--engines/avalanche/console.cpp11
-rw-r--r--engines/avalanche/console.h6
-rw-r--r--engines/avalanche/detection.cpp12
-rw-r--r--engines/avalanche/dialogs.cpp128
-rw-r--r--engines/avalanche/dialogs.h9
-rw-r--r--engines/avalanche/dropdown.cpp (renamed from engines/avalanche/menu.cpp)166
-rw-r--r--engines/avalanche/dropdown.h (renamed from engines/avalanche/menu.h)31
-rw-r--r--engines/avalanche/enums.h18
-rw-r--r--engines/avalanche/ghostroom.cpp398
-rw-r--r--engines/avalanche/ghostroom.h88
-rw-r--r--engines/avalanche/graphics.cpp588
-rw-r--r--engines/avalanche/graphics.h87
-rw-r--r--engines/avalanche/help.cpp270
-rw-r--r--engines/avalanche/help.h65
-rw-r--r--engines/avalanche/highscore.cpp110
-rw-r--r--engines/avalanche/highscore.h (renamed from engines/zvision/console.h)56
-rw-r--r--engines/avalanche/mainmenu.cpp116
-rw-r--r--engines/avalanche/mainmenu.h55
-rw-r--r--engines/avalanche/module.mk14
-rw-r--r--engines/avalanche/nim.cpp575
-rw-r--r--engines/avalanche/nim.h79
-rw-r--r--engines/avalanche/parser.cpp278
-rw-r--r--engines/avalanche/parser.h52
-rw-r--r--engines/avalanche/pingo.cpp106
-rw-r--r--engines/avalanche/sequence.cpp6
-rw-r--r--engines/avalanche/sequence.h4
-rw-r--r--engines/avalanche/shootemup.cpp693
-rw-r--r--engines/avalanche/shootemup.h134
-rw-r--r--engines/avalanche/sound.cpp5
-rw-r--r--engines/avalanche/sound.h4
-rw-r--r--engines/avalanche/timer.cpp161
-rw-r--r--engines/avalanche/timer.h8
-rw-r--r--engines/bbvs/bbvs.cpp1392
-rw-r--r--engines/bbvs/bbvs.h423
-rw-r--r--engines/bbvs/configure.engine3
-rw-r--r--engines/bbvs/detection.cpp162
-rw-r--r--engines/bbvs/dialogs.cpp182
-rw-r--r--engines/bbvs/dialogs.h81
-rw-r--r--engines/bbvs/gamemodule.cpp500
-rw-r--r--engines/bbvs/gamemodule.h251
-rw-r--r--engines/bbvs/graphics.cpp141
-rw-r--r--engines/bbvs/graphics.h61
-rw-r--r--engines/bbvs/logic.cpp265
-rw-r--r--engines/bbvs/minigames/bbairguitar.cpp1198
-rw-r--r--engines/bbvs/minigames/bbairguitar.h148
-rw-r--r--engines/bbvs/minigames/bbairguitar_anims.cpp186
-rw-r--r--engines/bbvs/minigames/bbant.cpp1317
-rw-r--r--engines/bbvs/minigames/bbant.h173
-rw-r--r--engines/bbvs/minigames/bbant_anims.cpp757
-rw-r--r--engines/bbvs/minigames/bbloogie.cpp1353
-rw-r--r--engines/bbvs/minigames/bbloogie.h141
-rw-r--r--engines/bbvs/minigames/bbloogie_anims.cpp138
-rw-r--r--engines/bbvs/minigames/bbtennis.cpp1274
-rw-r--r--engines/bbvs/minigames/bbtennis.h134
-rw-r--r--engines/bbvs/minigames/bbtennis_anims.cpp142
-rw-r--r--engines/bbvs/minigames/minigame.cpp112
-rw-r--r--engines/bbvs/minigames/minigame.h82
-rw-r--r--engines/bbvs/module.mk32
-rw-r--r--engines/bbvs/saveload.cpp278
-rw-r--r--engines/bbvs/scene.cpp227
-rw-r--r--engines/bbvs/sound.cpp107
-rw-r--r--engines/bbvs/sound.h63
-rw-r--r--engines/bbvs/spritemodule.cpp112
-rw-r--r--engines/bbvs/spritemodule.h68
-rw-r--r--engines/bbvs/videoplayer.cpp82
-rw-r--r--engines/bbvs/walk.cpp464
-rw-r--r--engines/cge/bitmap.cpp11
-rw-r--r--engines/cge/bitmap.h4
-rw-r--r--engines/cge/cge.cpp119
-rw-r--r--engines/cge/cge.h42
-rw-r--r--engines/cge/cge_main.cpp70
-rw-r--r--engines/cge/cge_main.h4
-rw-r--r--engines/cge/configure.engine3
-rw-r--r--engines/cge/console.cpp8
-rw-r--r--engines/cge/console.h4
-rw-r--r--engines/cge/detection.cpp71
-rw-r--r--engines/cge/events.cpp4
-rw-r--r--engines/cge/events.h4
-rw-r--r--engines/cge/fileio.cpp22
-rw-r--r--engines/cge/fileio.h14
-rw-r--r--engines/cge/game.cpp4
-rw-r--r--engines/cge/game.h4
-rw-r--r--engines/cge/general.h4
-rw-r--r--engines/cge/module.mk2
-rw-r--r--engines/cge/snail.cpp7
-rw-r--r--engines/cge/snail.h4
-rw-r--r--engines/cge/sound.cpp9
-rw-r--r--engines/cge/sound.h4
-rw-r--r--engines/cge/talk.cpp4
-rw-r--r--engines/cge/talk.h4
-rw-r--r--engines/cge/text.cpp9
-rw-r--r--engines/cge/text.h4
-rw-r--r--engines/cge/vga13h.cpp24
-rw-r--r--engines/cge/vga13h.h4
-rw-r--r--engines/cge/vmenu.cpp4
-rw-r--r--engines/cge/vmenu.h4
-rw-r--r--engines/cge/walk.cpp4
-rw-r--r--engines/cge/walk.h4
-rw-r--r--engines/cine/anim.cpp6
-rw-r--r--engines/cine/anim.h4
-rw-r--r--engines/cine/bg.cpp8
-rw-r--r--engines/cine/bg.h4
-rw-r--r--engines/cine/bg_list.cpp4
-rw-r--r--engines/cine/bg_list.h4
-rw-r--r--engines/cine/cine.cpp12
-rw-r--r--engines/cine/cine.h4
-rw-r--r--engines/cine/configure.engine3
-rw-r--r--engines/cine/console.cpp6
-rw-r--r--engines/cine/console.h4
-rw-r--r--engines/cine/detection.cpp4
-rw-r--r--engines/cine/detection_tables.h4
-rw-r--r--engines/cine/gfx.cpp41
-rw-r--r--engines/cine/gfx.h4
-rw-r--r--engines/cine/main_loop.cpp6
-rw-r--r--engines/cine/main_loop.h4
-rw-r--r--engines/cine/msg.cpp4
-rw-r--r--engines/cine/msg.h4
-rw-r--r--engines/cine/object.cpp4
-rw-r--r--engines/cine/object.h4
-rw-r--r--engines/cine/pal.cpp14
-rw-r--r--engines/cine/pal.h4
-rw-r--r--engines/cine/part.cpp6
-rw-r--r--engines/cine/part.h4
-rw-r--r--engines/cine/prc.cpp4
-rw-r--r--engines/cine/prc.h4
-rw-r--r--engines/cine/rel.cpp4
-rw-r--r--engines/cine/rel.h4
-rw-r--r--engines/cine/saveload.cpp4
-rw-r--r--engines/cine/saveload.h4
-rw-r--r--engines/cine/script.h4
-rw-r--r--engines/cine/script_fw.cpp12
-rw-r--r--engines/cine/script_os.cpp4
-rw-r--r--engines/cine/sound.cpp10
-rw-r--r--engines/cine/sound.h4
-rw-r--r--engines/cine/texte.cpp4
-rw-r--r--engines/cine/texte.h4
-rw-r--r--engines/cine/unpack.cpp4
-rw-r--r--engines/cine/unpack.h4
-rw-r--r--engines/cine/various.cpp118
-rw-r--r--engines/cine/various.h6
-rw-r--r--engines/composer/composer.cpp13
-rw-r--r--engines/composer/composer.h10
-rw-r--r--engines/composer/configure.engine3
-rw-r--r--engines/composer/console.cpp31
-rw-r--r--engines/composer/console.h (renamed from devtools/create_kyradat/tables.h)27
-rw-r--r--engines/composer/detection.cpp8
-rw-r--r--engines/composer/graphics.cpp4
-rw-r--r--engines/composer/graphics.h4
-rw-r--r--engines/composer/module.mk1
-rw-r--r--engines/composer/resource.cpp4
-rw-r--r--engines/composer/resource.h4
-rw-r--r--engines/composer/scripting.cpp4
-rw-r--r--engines/configure.engines57
-rw-r--r--engines/cruise/actor.cpp65
-rw-r--r--engines/cruise/actor.h4
-rw-r--r--engines/cruise/background.cpp10
-rw-r--r--engines/cruise/background.h4
-rw-r--r--engines/cruise/backgroundIncrust.cpp94
-rw-r--r--engines/cruise/backgroundIncrust.h4
-rw-r--r--engines/cruise/cell.cpp4
-rw-r--r--engines/cruise/cell.h4
-rw-r--r--engines/cruise/configure.engine3
-rw-r--r--engines/cruise/cruise.cpp28
-rw-r--r--engines/cruise/cruise.h6
-rw-r--r--engines/cruise/cruise_main.cpp171
-rw-r--r--engines/cruise/cruise_main.h7
-rw-r--r--engines/cruise/ctp.cpp23
-rw-r--r--engines/cruise/ctp.h4
-rw-r--r--engines/cruise/dataLoader.cpp186
-rw-r--r--engines/cruise/dataLoader.h4
-rw-r--r--engines/cruise/debugger.cpp14
-rw-r--r--engines/cruise/debugger.h4
-rw-r--r--engines/cruise/decompiler.cpp329
-rw-r--r--engines/cruise/delphine-unpack.cpp4
-rw-r--r--engines/cruise/detection.cpp8
-rw-r--r--engines/cruise/font.cpp22
-rw-r--r--engines/cruise/font.h4
-rw-r--r--engines/cruise/function.cpp121
-rw-r--r--engines/cruise/function.h4
-rw-r--r--engines/cruise/gfxModule.cpp21
-rw-r--r--engines/cruise/gfxModule.h4
-rw-r--r--engines/cruise/linker.cpp38
-rw-r--r--engines/cruise/linker.h4
-rw-r--r--engines/cruise/mainDraw.cpp53
-rw-r--r--engines/cruise/mainDraw.h6
-rw-r--r--engines/cruise/menu.cpp23
-rw-r--r--engines/cruise/menu.h4
-rw-r--r--engines/cruise/mouse.cpp4
-rw-r--r--engines/cruise/mouse.h4
-rw-r--r--engines/cruise/object.cpp20
-rw-r--r--engines/cruise/object.h4
-rw-r--r--engines/cruise/overlay.cpp134
-rw-r--r--engines/cruise/overlay.h4
-rw-r--r--engines/cruise/perso.cpp21
-rw-r--r--engines/cruise/perso.h4
-rw-r--r--engines/cruise/polys.cpp36
-rw-r--r--engines/cruise/polys.h4
-rw-r--r--engines/cruise/saveload.cpp60
-rw-r--r--engines/cruise/saveload.h4
-rw-r--r--engines/cruise/script.cpp257
-rw-r--r--engines/cruise/script.h4
-rw-r--r--engines/cruise/sound.cpp29
-rw-r--r--engines/cruise/sound.h4
-rw-r--r--engines/cruise/stack.cpp8
-rw-r--r--engines/cruise/stack.h4
-rw-r--r--engines/cruise/staticres.cpp4
-rw-r--r--engines/cruise/staticres.h4
-rw-r--r--engines/cruise/various.cpp8
-rw-r--r--engines/cruise/various.h8
-rw-r--r--engines/cruise/vars.cpp9
-rw-r--r--engines/cruise/vars.h9
-rw-r--r--engines/cruise/volume.cpp65
-rw-r--r--engines/cruise/volume.h4
-rw-r--r--engines/dialogs.cpp6
-rw-r--r--engines/dialogs.h1
-rw-r--r--engines/draci/animation.cpp4
-rw-r--r--engines/draci/animation.h4
-rw-r--r--engines/draci/barchive.cpp16
-rw-r--r--engines/draci/barchive.h4
-rw-r--r--engines/draci/configure.engine3
-rw-r--r--engines/draci/console.cpp4
-rw-r--r--engines/draci/console.h4
-rw-r--r--engines/draci/detection.cpp4
-rw-r--r--engines/draci/draci.cpp4
-rw-r--r--engines/draci/draci.h4
-rw-r--r--engines/draci/font.cpp4
-rw-r--r--engines/draci/font.h4
-rw-r--r--engines/draci/game.cpp166
-rw-r--r--engines/draci/game.h13
-rw-r--r--engines/draci/module.mk8
-rw-r--r--engines/draci/mouse.cpp4
-rw-r--r--engines/draci/mouse.h4
-rw-r--r--engines/draci/music.cpp4
-rw-r--r--engines/draci/music.h4
-rw-r--r--engines/draci/saveload.cpp11
-rw-r--r--engines/draci/saveload.h6
-rw-r--r--engines/draci/screen.cpp4
-rw-r--r--engines/draci/screen.h4
-rw-r--r--engines/draci/script.cpp135
-rw-r--r--engines/draci/script.h4
-rw-r--r--engines/draci/sound.cpp4
-rw-r--r--engines/draci/sound.h4
-rw-r--r--engines/draci/sprite.cpp4
-rw-r--r--engines/draci/sprite.h4
-rw-r--r--engines/draci/surface.cpp4
-rw-r--r--engines/draci/surface.h4
-rw-r--r--engines/draci/walking.cpp14
-rw-r--r--engines/draci/walking.h11
-rw-r--r--engines/drascula/actors.cpp4
-rw-r--r--engines/drascula/animation.cpp4
-rw-r--r--engines/drascula/configure.engine3
-rw-r--r--engines/drascula/console.cpp8
-rw-r--r--engines/drascula/console.h4
-rw-r--r--engines/drascula/converse.cpp4
-rw-r--r--engines/drascula/detection.cpp4
-rw-r--r--engines/drascula/drascula.cpp75
-rw-r--r--engines/drascula/drascula.h13
-rw-r--r--engines/drascula/graphics.cpp4
-rw-r--r--engines/drascula/interface.cpp4
-rw-r--r--engines/drascula/objects.cpp4
-rw-r--r--engines/drascula/palette.cpp4
-rw-r--r--engines/drascula/resource.cpp4
-rw-r--r--engines/drascula/rooms.cpp4
-rw-r--r--engines/drascula/saveload.cpp4
-rw-r--r--engines/drascula/sound.cpp4
-rw-r--r--engines/drascula/talk.cpp4
-rw-r--r--engines/dreamweb/backdrop.cpp4
-rw-r--r--engines/dreamweb/configure.engine3
-rw-r--r--engines/dreamweb/console.cpp4
-rw-r--r--engines/dreamweb/console.h4
-rw-r--r--engines/dreamweb/detection.cpp4
-rw-r--r--engines/dreamweb/detection_tables.h4
-rw-r--r--engines/dreamweb/dreamweb.cpp49
-rw-r--r--engines/dreamweb/dreamweb.h17
-rw-r--r--engines/dreamweb/keypad.cpp4
-rw-r--r--engines/dreamweb/monitor.cpp4
-rw-r--r--engines/dreamweb/mouse.cpp4
-rw-r--r--engines/dreamweb/newplace.cpp12
-rw-r--r--engines/dreamweb/object.cpp4
-rw-r--r--engines/dreamweb/pathfind.cpp4
-rw-r--r--engines/dreamweb/people.cpp4
-rw-r--r--engines/dreamweb/print.cpp4
-rw-r--r--engines/dreamweb/rain.cpp4
-rw-r--r--engines/dreamweb/saveload.cpp4
-rw-r--r--engines/dreamweb/sound.cpp4
-rw-r--r--engines/dreamweb/sound.h4
-rw-r--r--engines/dreamweb/sprite.cpp4
-rw-r--r--engines/dreamweb/structs.h4
-rw-r--r--engines/dreamweb/stubs.cpp10
-rw-r--r--engines/dreamweb/talk.cpp4
-rw-r--r--engines/dreamweb/titles.cpp4
-rw-r--r--engines/dreamweb/use.cpp8
-rw-r--r--engines/dreamweb/vgafades.cpp32
-rw-r--r--engines/dreamweb/vgagrafx.cpp10
-rw-r--r--engines/engine.cpp7
-rw-r--r--engines/engine.h12
-rw-r--r--engines/engines.mk263
-rw-r--r--engines/fullpipe/behavior.cpp68
-rw-r--r--engines/fullpipe/behavior.h10
-rw-r--r--engines/fullpipe/configure.engine3
-rw-r--r--engines/fullpipe/console.cpp (renamed from video/codecs/mjpeg.cpp)64
-rw-r--r--engines/fullpipe/console.h42
-rw-r--r--engines/fullpipe/constants.h1591
-rw-r--r--engines/fullpipe/detection.cpp68
-rw-r--r--engines/fullpipe/floaters.cpp255
-rw-r--r--engines/fullpipe/floaters.h75
-rw-r--r--engines/fullpipe/fullpipe.cpp155
-rw-r--r--engines/fullpipe/fullpipe.h90
-rw-r--r--engines/fullpipe/gameloader.cpp246
-rw-r--r--engines/fullpipe/gameloader.h25
-rw-r--r--engines/fullpipe/gfx.cpp193
-rw-r--r--engines/fullpipe/gfx.h24
-rw-r--r--engines/fullpipe/init.cpp38
-rw-r--r--engines/fullpipe/input.cpp117
-rw-r--r--engines/fullpipe/input.h4
-rw-r--r--engines/fullpipe/interaction.cpp68
-rw-r--r--engines/fullpipe/interaction.h9
-rw-r--r--engines/fullpipe/inventory.cpp63
-rw-r--r--engines/fullpipe/inventory.h10
-rw-r--r--engines/fullpipe/lift.cpp477
-rw-r--r--engines/fullpipe/messagehandlers.cpp800
-rw-r--r--engines/fullpipe/messages.cpp337
-rw-r--r--engines/fullpipe/messages.h41
-rw-r--r--engines/fullpipe/modal.cpp1774
-rw-r--r--engines/fullpipe/modal.h252
-rw-r--r--engines/fullpipe/module.mk45
-rw-r--r--engines/fullpipe/motion.cpp2801
-rw-r--r--engines/fullpipe/motion.h237
-rw-r--r--engines/fullpipe/ngiarchive.cpp4
-rw-r--r--engines/fullpipe/objectnames.h79
-rw-r--r--engines/fullpipe/objects.h6
-rw-r--r--engines/fullpipe/scene.cpp255
-rw-r--r--engines/fullpipe/scene.h20
-rw-r--r--engines/fullpipe/scenes.cpp1598
-rw-r--r--engines/fullpipe/scenes.h663
-rw-r--r--engines/fullpipe/scenes/scene01.cpp118
-rw-r--r--engines/fullpipe/scenes/scene02.cpp138
-rw-r--r--engines/fullpipe/scenes/scene03.cpp295
-rw-r--r--engines/fullpipe/scenes/scene04.cpp1562
-rw-r--r--engines/fullpipe/scenes/scene05.cpp386
-rw-r--r--engines/fullpipe/scenes/scene06.cpp770
-rw-r--r--engines/fullpipe/scenes/scene07.cpp175
-rw-r--r--engines/fullpipe/scenes/scene08.cpp546
-rw-r--r--engines/fullpipe/scenes/scene09.cpp747
-rw-r--r--engines/fullpipe/scenes/scene10.cpp220
-rw-r--r--engines/fullpipe/scenes/scene11.cpp786
-rw-r--r--engines/fullpipe/scenes/scene12.cpp85
-rw-r--r--engines/fullpipe/scenes/scene13.cpp380
-rw-r--r--engines/fullpipe/scenes/scene14.cpp849
-rw-r--r--engines/fullpipe/scenes/scene15.cpp209
-rw-r--r--engines/fullpipe/scenes/scene16.cpp484
-rw-r--r--engines/fullpipe/scenes/scene17.cpp285
-rw-r--r--engines/fullpipe/scenes/scene18and19.cpp932
-rw-r--r--engines/fullpipe/scenes/scene20.cpp155
-rw-r--r--engines/fullpipe/scenes/scene21.cpp148
-rw-r--r--engines/fullpipe/scenes/scene22.cpp395
-rw-r--r--engines/fullpipe/scenes/scene23.cpp555
-rw-r--r--engines/fullpipe/scenes/scene24.cpp129
-rw-r--r--engines/fullpipe/scenes/scene25.cpp723
-rw-r--r--engines/fullpipe/scenes/scene26.cpp355
-rw-r--r--engines/fullpipe/scenes/scene27.cpp759
-rw-r--r--engines/fullpipe/scenes/scene28.cpp474
-rw-r--r--engines/fullpipe/scenes/scene29.cpp1125
-rw-r--r--engines/fullpipe/scenes/scene30.cpp152
-rw-r--r--engines/fullpipe/scenes/scene31.cpp126
-rw-r--r--engines/fullpipe/scenes/scene32.cpp431
-rw-r--r--engines/fullpipe/scenes/scene33.cpp314
-rw-r--r--engines/fullpipe/scenes/scene34.cpp479
-rw-r--r--engines/fullpipe/scenes/scene35.cpp264
-rw-r--r--engines/fullpipe/scenes/scene36.cpp94
-rw-r--r--engines/fullpipe/scenes/scene37.cpp316
-rw-r--r--engines/fullpipe/scenes/scene38.cpp409
-rw-r--r--engines/fullpipe/scenes/sceneDbg.cpp108
-rw-r--r--engines/fullpipe/scenes/sceneFinal.cpp174
-rw-r--r--engines/fullpipe/scenes/sceneIntro.cpp110
-rw-r--r--engines/fullpipe/sound.cpp407
-rw-r--r--engines/fullpipe/sound.h23
-rw-r--r--engines/fullpipe/stateloader.cpp75
-rw-r--r--engines/fullpipe/statics.cpp720
-rw-r--r--engines/fullpipe/statics.h47
-rw-r--r--engines/fullpipe/utils.cpp25
-rw-r--r--engines/fullpipe/utils.h10
-rw-r--r--engines/game.cpp4
-rw-r--r--engines/game.h4
-rw-r--r--engines/gob/anifile.cpp4
-rw-r--r--engines/gob/anifile.h4
-rw-r--r--engines/gob/aniobject.cpp4
-rw-r--r--engines/gob/aniobject.h4
-rw-r--r--engines/gob/backbuffer.cpp4
-rw-r--r--engines/gob/backbuffer.h4
-rw-r--r--engines/gob/cheater.cpp4
-rw-r--r--engines/gob/cheater.h4
-rw-r--r--engines/gob/cheater_geisha.cpp6
-rw-r--r--engines/gob/cmpfile.cpp4
-rw-r--r--engines/gob/cmpfile.h4
-rw-r--r--engines/gob/configure.engine3
-rw-r--r--engines/gob/console.cpp52
-rw-r--r--engines/gob/console.h4
-rw-r--r--engines/gob/databases.cpp4
-rw-r--r--engines/gob/databases.h4
-rw-r--r--engines/gob/dataio.cpp4
-rw-r--r--engines/gob/dataio.h4
-rw-r--r--engines/gob/dbase.cpp4
-rw-r--r--engines/gob/dbase.h4
-rw-r--r--engines/gob/decfile.cpp4
-rw-r--r--engines/gob/decfile.h4
-rw-r--r--engines/gob/demos/batplayer.cpp4
-rw-r--r--engines/gob/demos/batplayer.h4
-rw-r--r--engines/gob/demos/demoplayer.cpp4
-rw-r--r--engines/gob/demos/demoplayer.h4
-rw-r--r--engines/gob/demos/scnplayer.cpp4
-rw-r--r--engines/gob/demos/scnplayer.h4
-rw-r--r--engines/gob/detection/detection.cpp4
-rw-r--r--engines/gob/detection/tables.h6
-rw-r--r--engines/gob/detection/tables_adi2.h4
-rw-r--r--engines/gob/detection/tables_adi4.h4
-rw-r--r--engines/gob/detection/tables_adibou.h4
-rw-r--r--engines/gob/detection/tables_ajworld.h4
-rw-r--r--engines/gob/detection/tables_bargon.h4
-rw-r--r--engines/gob/detection/tables_crousti.h45
-rw-r--r--engines/gob/detection/tables_dynasty.h4
-rw-r--r--engines/gob/detection/tables_fallback.h4
-rw-r--r--engines/gob/detection/tables_fascin.h4
-rw-r--r--engines/gob/detection/tables_geisha.h4
-rw-r--r--engines/gob/detection/tables_gob1.h4
-rw-r--r--engines/gob/detection/tables_gob2.h4
-rw-r--r--engines/gob/detection/tables_gob3.h4
-rw-r--r--engines/gob/detection/tables_inca2.h4
-rw-r--r--engines/gob/detection/tables_lit.h4
-rw-r--r--engines/gob/detection/tables_littlered.h4
-rw-r--r--engines/gob/detection/tables_onceupon.h4
-rw-r--r--engines/gob/detection/tables_playtoons.h4
-rw-r--r--engines/gob/detection/tables_urban.h4
-rw-r--r--engines/gob/detection/tables_ween.h4
-rw-r--r--engines/gob/detection/tables_woodruff.h4
-rw-r--r--engines/gob/draw.cpp9
-rw-r--r--engines/gob/draw.h5
-rw-r--r--engines/gob/draw_bargon.cpp4
-rw-r--r--engines/gob/draw_fascin.cpp8
-rw-r--r--engines/gob/draw_playtoons.cpp4
-rw-r--r--engines/gob/draw_v1.cpp4
-rw-r--r--engines/gob/draw_v2.cpp4
-rw-r--r--engines/gob/expression.cpp4
-rw-r--r--engines/gob/expression.h4
-rw-r--r--engines/gob/game.cpp4
-rw-r--r--engines/gob/game.h4
-rw-r--r--engines/gob/global.cpp4
-rw-r--r--engines/gob/global.h4
-rw-r--r--engines/gob/gob.cpp5
-rw-r--r--engines/gob/gob.h8
-rw-r--r--engines/gob/goblin.cpp4
-rw-r--r--engines/gob/goblin.h4
-rw-r--r--engines/gob/goblin_v1.cpp4
-rw-r--r--engines/gob/goblin_v2.cpp4
-rw-r--r--engines/gob/goblin_v3.cpp4
-rw-r--r--engines/gob/goblin_v4.cpp6
-rw-r--r--engines/gob/hotspots.cpp4
-rw-r--r--engines/gob/hotspots.h4
-rw-r--r--engines/gob/iniconfig.cpp4
-rw-r--r--engines/gob/iniconfig.h4
-rw-r--r--engines/gob/init.cpp4
-rw-r--r--engines/gob/init.h4
-rw-r--r--engines/gob/init_fascin.cpp4
-rw-r--r--engines/gob/init_geisha.cpp4
-rw-r--r--engines/gob/init_v1.cpp4
-rw-r--r--engines/gob/init_v2.cpp4
-rw-r--r--engines/gob/init_v3.cpp4
-rw-r--r--engines/gob/init_v4.cpp4
-rw-r--r--engines/gob/init_v6.cpp4
-rw-r--r--engines/gob/init_v7.cpp4
-rw-r--r--engines/gob/inter.cpp4
-rw-r--r--engines/gob/inter.h6
-rw-r--r--engines/gob/inter_bargon.cpp4
-rw-r--r--engines/gob/inter_fascin.cpp4
-rw-r--r--engines/gob/inter_geisha.cpp4
-rw-r--r--engines/gob/inter_inca2.cpp4
-rw-r--r--engines/gob/inter_littlered.cpp4
-rw-r--r--engines/gob/inter_playtoons.cpp4
-rw-r--r--engines/gob/inter_v1.cpp22
-rw-r--r--engines/gob/inter_v2.cpp187
-rw-r--r--engines/gob/inter_v3.cpp187
-rw-r--r--engines/gob/inter_v4.cpp4
-rw-r--r--engines/gob/inter_v5.cpp4
-rw-r--r--engines/gob/inter_v6.cpp4
-rw-r--r--engines/gob/inter_v7.cpp9
-rw-r--r--engines/gob/map.cpp4
-rw-r--r--engines/gob/map.h4
-rw-r--r--engines/gob/map_v1.cpp4
-rw-r--r--engines/gob/map_v2.cpp4
-rw-r--r--engines/gob/minigames/geisha/diving.cpp7
-rw-r--r--engines/gob/minigames/geisha/diving.h4
-rw-r--r--engines/gob/minigames/geisha/evilfish.cpp4
-rw-r--r--engines/gob/minigames/geisha/evilfish.h4
-rw-r--r--engines/gob/minigames/geisha/meter.cpp4
-rw-r--r--engines/gob/minigames/geisha/meter.h4
-rw-r--r--engines/gob/minigames/geisha/mouth.cpp4
-rw-r--r--engines/gob/minigames/geisha/mouth.h4
-rw-r--r--engines/gob/minigames/geisha/oko.cpp4
-rw-r--r--engines/gob/minigames/geisha/oko.h4
-rw-r--r--engines/gob/minigames/geisha/penetration.cpp7
-rw-r--r--engines/gob/minigames/geisha/penetration.h4
-rw-r--r--engines/gob/minigames/geisha/submarine.cpp4
-rw-r--r--engines/gob/minigames/geisha/submarine.h4
-rw-r--r--engines/gob/mult.cpp4
-rw-r--r--engines/gob/mult.h4
-rw-r--r--engines/gob/mult_v2.cpp4
-rw-r--r--engines/gob/palanim.cpp4
-rw-r--r--engines/gob/palanim.h4
-rw-r--r--engines/gob/pregob/gctfile.cpp4
-rw-r--r--engines/gob/pregob/gctfile.h4
-rw-r--r--engines/gob/pregob/onceupon/abracadabra.cpp4
-rw-r--r--engines/gob/pregob/onceupon/abracadabra.h4
-rw-r--r--engines/gob/pregob/onceupon/babayaga.cpp4
-rw-r--r--engines/gob/pregob/onceupon/babayaga.h4
-rw-r--r--engines/gob/pregob/onceupon/brokenstrings.h4
-rw-r--r--engines/gob/pregob/onceupon/chargenchild.cpp4
-rw-r--r--engines/gob/pregob/onceupon/chargenchild.h4
-rw-r--r--engines/gob/pregob/onceupon/onceupon.cpp4
-rw-r--r--engines/gob/pregob/onceupon/onceupon.h4
-rw-r--r--engines/gob/pregob/onceupon/palettes.h4
-rw-r--r--engines/gob/pregob/onceupon/parents.cpp4
-rw-r--r--engines/gob/pregob/onceupon/parents.h4
-rw-r--r--engines/gob/pregob/onceupon/stork.cpp4
-rw-r--r--engines/gob/pregob/onceupon/stork.h4
-rw-r--r--engines/gob/pregob/onceupon/title.cpp4
-rw-r--r--engines/gob/pregob/onceupon/title.h4
-rw-r--r--engines/gob/pregob/pregob.cpp4
-rw-r--r--engines/gob/pregob/pregob.h4
-rw-r--r--engines/gob/pregob/seqfile.cpp4
-rw-r--r--engines/gob/pregob/seqfile.h4
-rw-r--r--engines/gob/pregob/txtfile.cpp4
-rw-r--r--engines/gob/pregob/txtfile.h4
-rw-r--r--engines/gob/resources.cpp8
-rw-r--r--engines/gob/resources.h4
-rw-r--r--engines/gob/rxyfile.cpp4
-rw-r--r--engines/gob/rxyfile.h4
-rw-r--r--engines/gob/save/saveconverter.cpp4
-rw-r--r--engines/gob/save/saveconverter.h4
-rw-r--r--engines/gob/save/saveconverter_v2.cpp4
-rw-r--r--engines/gob/save/saveconverter_v3.cpp4
-rw-r--r--engines/gob/save/saveconverter_v4.cpp4
-rw-r--r--engines/gob/save/savefile.cpp4
-rw-r--r--engines/gob/save/savefile.h4
-rw-r--r--engines/gob/save/savehandler.cpp4
-rw-r--r--engines/gob/save/savehandler.h4
-rw-r--r--engines/gob/save/saveload.cpp4
-rw-r--r--engines/gob/save/saveload.h4
-rw-r--r--engines/gob/save/saveload_ajworld.cpp4
-rw-r--r--engines/gob/save/saveload_fascin.cpp4
-rw-r--r--engines/gob/save/saveload_geisha.cpp4
-rw-r--r--engines/gob/save/saveload_inca2.cpp4
-rw-r--r--engines/gob/save/saveload_playtoons.cpp4
-rw-r--r--engines/gob/save/saveload_v2.cpp4
-rw-r--r--engines/gob/save/saveload_v3.cpp4
-rw-r--r--engines/gob/save/saveload_v4.cpp4
-rw-r--r--engines/gob/save/saveload_v6.cpp4
-rw-r--r--engines/gob/save/saveload_v7.cpp4
-rw-r--r--engines/gob/scenery.cpp4
-rw-r--r--engines/gob/scenery.h4
-rw-r--r--engines/gob/scenery_v1.cpp4
-rw-r--r--engines/gob/scenery_v2.cpp4
-rw-r--r--engines/gob/script.cpp4
-rw-r--r--engines/gob/script.h4
-rw-r--r--engines/gob/sound/adlib.cpp4
-rw-r--r--engines/gob/sound/adlib.h4
-rw-r--r--engines/gob/sound/adlplayer.cpp4
-rw-r--r--engines/gob/sound/adlplayer.h4
-rw-r--r--engines/gob/sound/bgatmosphere.cpp4
-rw-r--r--engines/gob/sound/bgatmosphere.h4
-rw-r--r--engines/gob/sound/cdrom.cpp4
-rw-r--r--engines/gob/sound/cdrom.h4
-rw-r--r--engines/gob/sound/infogrames.cpp4
-rw-r--r--engines/gob/sound/infogrames.h4
-rw-r--r--engines/gob/sound/musplayer.cpp4
-rw-r--r--engines/gob/sound/musplayer.h4
-rw-r--r--engines/gob/sound/pcspeaker.cpp4
-rw-r--r--engines/gob/sound/pcspeaker.h4
-rw-r--r--engines/gob/sound/protracker.cpp4
-rw-r--r--engines/gob/sound/protracker.h4
-rw-r--r--engines/gob/sound/sound.cpp4
-rw-r--r--engines/gob/sound/sound.h4
-rw-r--r--engines/gob/sound/soundblaster.cpp4
-rw-r--r--engines/gob/sound/soundblaster.h4
-rw-r--r--engines/gob/sound/sounddesc.cpp4
-rw-r--r--engines/gob/sound/sounddesc.h4
-rw-r--r--engines/gob/sound/soundmixer.cpp4
-rw-r--r--engines/gob/sound/soundmixer.h4
-rw-r--r--engines/gob/surface.cpp9
-rw-r--r--engines/gob/surface.h4
-rw-r--r--engines/gob/totfile.cpp4
-rw-r--r--engines/gob/totfile.h4
-rw-r--r--engines/gob/util.cpp4
-rw-r--r--engines/gob/util.h4
-rw-r--r--engines/gob/variables.cpp4
-rw-r--r--engines/gob/variables.h4
-rw-r--r--engines/gob/video.cpp4
-rw-r--r--engines/gob/video.h4
-rw-r--r--engines/gob/video_v1.cpp4
-rw-r--r--engines/gob/video_v2.cpp4
-rw-r--r--engines/gob/video_v6.cpp4
-rw-r--r--engines/gob/videoplayer.cpp4
-rw-r--r--engines/gob/videoplayer.h4
-rw-r--r--engines/groovie/cell.cpp4
-rw-r--r--engines/groovie/cell.h4
-rw-r--r--engines/groovie/configure.engine4
-rw-r--r--engines/groovie/cursor.cpp36
-rw-r--r--engines/groovie/cursor.h4
-rw-r--r--engines/groovie/debug.cpp38
-rw-r--r--engines/groovie/debug.h4
-rw-r--r--engines/groovie/detection.cpp4
-rw-r--r--engines/groovie/detection.h4
-rw-r--r--engines/groovie/font.cpp8
-rw-r--r--engines/groovie/font.h10
-rw-r--r--engines/groovie/graphics.cpp4
-rw-r--r--engines/groovie/graphics.h4
-rw-r--r--engines/groovie/groovie.cpp49
-rw-r--r--engines/groovie/groovie.h30
-rw-r--r--engines/groovie/lzss.cpp4
-rw-r--r--engines/groovie/lzss.h4
-rw-r--r--engines/groovie/module.mk6
-rw-r--r--engines/groovie/music.cpp42
-rw-r--r--engines/groovie/music.h4
-rw-r--r--engines/groovie/player.cpp10
-rw-r--r--engines/groovie/player.h4
-rw-r--r--engines/groovie/resource.cpp14
-rw-r--r--engines/groovie/resource.h4
-rw-r--r--engines/groovie/roq.cpp194
-rw-r--r--engines/groovie/roq.h10
-rw-r--r--engines/groovie/saveload.cpp4
-rw-r--r--engines/groovie/saveload.h4
-rw-r--r--engines/groovie/script.cpp308
-rw-r--r--engines/groovie/script.h4
-rw-r--r--engines/groovie/stuffit.cpp4
-rw-r--r--engines/groovie/stuffit.h4
-rw-r--r--engines/groovie/vdx.cpp41
-rw-r--r--engines/groovie/vdx.h4
-rw-r--r--engines/hopkins/anim.cpp7
-rw-r--r--engines/hopkins/anim.h4
-rw-r--r--engines/hopkins/computer.cpp91
-rw-r--r--engines/hopkins/computer.h30
-rw-r--r--engines/hopkins/configure.engine3
-rw-r--r--engines/hopkins/debugger.cpp28
-rw-r--r--engines/hopkins/debugger.h6
-rw-r--r--engines/hopkins/detection.cpp36
-rw-r--r--engines/hopkins/detection_tables.h45
-rw-r--r--engines/hopkins/dialogs.cpp15
-rw-r--r--engines/hopkins/dialogs.h4
-rw-r--r--engines/hopkins/events.cpp6
-rw-r--r--engines/hopkins/events.h4
-rw-r--r--engines/hopkins/files.cpp23
-rw-r--r--engines/hopkins/files.h4
-rw-r--r--engines/hopkins/font.cpp4
-rw-r--r--engines/hopkins/font.h4
-rw-r--r--engines/hopkins/globals.cpp6
-rw-r--r--engines/hopkins/globals.h4
-rw-r--r--engines/hopkins/graphics.cpp18
-rw-r--r--engines/hopkins/graphics.h4
-rw-r--r--engines/hopkins/hopkins.cpp51
-rw-r--r--engines/hopkins/hopkins.h11
-rw-r--r--engines/hopkins/lines.cpp19
-rw-r--r--engines/hopkins/lines.h4
-rw-r--r--engines/hopkins/menu.cpp42
-rw-r--r--engines/hopkins/menu.h4
-rw-r--r--engines/hopkins/objects.cpp14
-rw-r--r--engines/hopkins/objects.h4
-rw-r--r--engines/hopkins/saveload.cpp4
-rw-r--r--engines/hopkins/saveload.h4
-rw-r--r--engines/hopkins/script.cpp22
-rw-r--r--engines/hopkins/script.h4
-rw-r--r--engines/hopkins/sound.cpp69
-rw-r--r--engines/hopkins/sound.h12
-rw-r--r--engines/hopkins/talk.cpp20
-rw-r--r--engines/hopkins/talk.h4
-rw-r--r--engines/hugo/configure.engine3
-rw-r--r--engines/hugo/console.cpp38
-rw-r--r--engines/hugo/console.h4
-rw-r--r--engines/hugo/detection.cpp11
-rw-r--r--engines/hugo/dialogs.cpp21
-rw-r--r--engines/hugo/dialogs.h4
-rw-r--r--engines/hugo/display.cpp12
-rw-r--r--engines/hugo/display.h4
-rw-r--r--engines/hugo/file.cpp15
-rw-r--r--engines/hugo/file.h4
-rw-r--r--engines/hugo/file_v1d.cpp4
-rw-r--r--engines/hugo/file_v1w.cpp4
-rw-r--r--engines/hugo/file_v2d.cpp4
-rw-r--r--engines/hugo/file_v2w.cpp4
-rw-r--r--engines/hugo/file_v3d.cpp4
-rw-r--r--engines/hugo/game.h4
-rw-r--r--engines/hugo/hugo.cpp50
-rw-r--r--engines/hugo/hugo.h9
-rw-r--r--engines/hugo/intro.cpp8
-rw-r--r--engines/hugo/intro.h4
-rw-r--r--engines/hugo/inventory.cpp8
-rw-r--r--engines/hugo/inventory.h4
-rw-r--r--engines/hugo/mouse.cpp19
-rw-r--r--engines/hugo/mouse.h4
-rw-r--r--engines/hugo/object.cpp58
-rw-r--r--engines/hugo/object.h4
-rw-r--r--engines/hugo/object_v1d.cpp4
-rw-r--r--engines/hugo/object_v1w.cpp4
-rw-r--r--engines/hugo/object_v2d.cpp4
-rw-r--r--engines/hugo/object_v3d.cpp4
-rw-r--r--engines/hugo/parser.cpp30
-rw-r--r--engines/hugo/parser.h4
-rw-r--r--engines/hugo/parser_v1d.cpp4
-rw-r--r--engines/hugo/parser_v1w.cpp4
-rw-r--r--engines/hugo/parser_v2d.cpp4
-rw-r--r--engines/hugo/parser_v3d.cpp4
-rw-r--r--engines/hugo/route.cpp21
-rw-r--r--engines/hugo/route.h8
-rw-r--r--engines/hugo/schedule.cpp80
-rw-r--r--engines/hugo/schedule.h4
-rw-r--r--engines/hugo/sound.cpp9
-rw-r--r--engines/hugo/sound.h4
-rw-r--r--engines/hugo/text.cpp41
-rw-r--r--engines/hugo/text.h4
-rw-r--r--engines/hugo/util.cpp4
-rw-r--r--engines/hugo/util.h4
-rw-r--r--engines/kyra/animator_hof.cpp4
-rw-r--r--engines/kyra/animator_lok.cpp6
-rw-r--r--engines/kyra/animator_lok.h4
-rw-r--r--engines/kyra/animator_mr.cpp4
-rw-r--r--engines/kyra/animator_tim.cpp4
-rw-r--r--engines/kyra/animator_v2.cpp4
-rw-r--r--engines/kyra/chargen.cpp8
-rw-r--r--engines/kyra/configure.engine5
-rw-r--r--engines/kyra/darkmoon.cpp4
-rw-r--r--engines/kyra/darkmoon.h4
-rw-r--r--engines/kyra/debugger.cpp338
-rw-r--r--engines/kyra/debugger.h64
-rw-r--r--engines/kyra/detection_tables.h1
-rw-r--r--engines/kyra/eob.cpp4
-rw-r--r--engines/kyra/eob.h4
-rw-r--r--engines/kyra/eobcommon.cpp4
-rw-r--r--engines/kyra/eobcommon.h4
-rw-r--r--engines/kyra/gui.cpp4
-rw-r--r--engines/kyra/gui.h4
-rw-r--r--engines/kyra/gui_eob.cpp4
-rw-r--r--engines/kyra/gui_eob.h4
-rw-r--r--engines/kyra/gui_hof.cpp6
-rw-r--r--engines/kyra/gui_hof.h4
-rw-r--r--engines/kyra/gui_lok.cpp4
-rw-r--r--engines/kyra/gui_lok.h4
-rw-r--r--engines/kyra/gui_lol.cpp4
-rw-r--r--engines/kyra/gui_lol.h4
-rw-r--r--engines/kyra/gui_mr.cpp4
-rw-r--r--engines/kyra/gui_mr.h4
-rw-r--r--engines/kyra/gui_rpg.cpp4
-rw-r--r--engines/kyra/gui_v1.cpp4
-rw-r--r--engines/kyra/gui_v1.h4
-rw-r--r--engines/kyra/gui_v2.cpp4
-rw-r--r--engines/kyra/gui_v2.h4
-rw-r--r--engines/kyra/item.h4
-rw-r--r--engines/kyra/items_eob.cpp4
-rw-r--r--engines/kyra/items_hof.cpp4
-rw-r--r--engines/kyra/items_lok.cpp4
-rw-r--r--engines/kyra/items_lol.cpp4
-rw-r--r--engines/kyra/items_mr.cpp4
-rw-r--r--engines/kyra/items_v2.cpp4
-rw-r--r--engines/kyra/kyra_hof.cpp4
-rw-r--r--engines/kyra/kyra_hof.h4
-rw-r--r--engines/kyra/kyra_lok.cpp4
-rw-r--r--engines/kyra/kyra_lok.h4
-rw-r--r--engines/kyra/kyra_mr.cpp5
-rw-r--r--engines/kyra/kyra_mr.h4
-rw-r--r--engines/kyra/kyra_rpg.cpp4
-rw-r--r--engines/kyra/kyra_rpg.h4
-rw-r--r--engines/kyra/kyra_v1.cpp4
-rw-r--r--engines/kyra/kyra_v1.h4
-rw-r--r--engines/kyra/kyra_v2.cpp4
-rw-r--r--engines/kyra/kyra_v2.h4
-rw-r--r--engines/kyra/lol.cpp4
-rw-r--r--engines/kyra/lol.h4
-rw-r--r--engines/kyra/magic_eob.cpp4
-rw-r--r--engines/kyra/resource.cpp12
-rw-r--r--engines/kyra/resource.h134
-rw-r--r--engines/kyra/resource_intern.cpp4
-rw-r--r--engines/kyra/resource_intern.h4
-rw-r--r--engines/kyra/saveload.cpp4
-rw-r--r--engines/kyra/saveload_eob.cpp4
-rw-r--r--engines/kyra/saveload_hof.cpp4
-rw-r--r--engines/kyra/saveload_lok.cpp4
-rw-r--r--engines/kyra/saveload_lol.cpp4
-rw-r--r--engines/kyra/saveload_mr.cpp4
-rw-r--r--engines/kyra/saveload_rpg.cpp4
-rw-r--r--engines/kyra/scene_eob.cpp4
-rw-r--r--engines/kyra/scene_hof.cpp4
-rw-r--r--engines/kyra/scene_lok.cpp4
-rw-r--r--engines/kyra/scene_lol.cpp29
-rw-r--r--engines/kyra/scene_mr.cpp4
-rw-r--r--engines/kyra/scene_rpg.cpp4
-rw-r--r--engines/kyra/scene_v1.cpp4
-rw-r--r--engines/kyra/scene_v2.cpp4
-rw-r--r--engines/kyra/screen.cpp4
-rw-r--r--engines/kyra/screen.h4
-rw-r--r--engines/kyra/screen_eob.cpp4
-rw-r--r--engines/kyra/screen_eob.h4
-rw-r--r--engines/kyra/screen_hof.cpp6
-rw-r--r--engines/kyra/screen_hof.h6
-rw-r--r--engines/kyra/screen_lok.cpp4
-rw-r--r--engines/kyra/screen_lok.h4
-rw-r--r--engines/kyra/screen_lol.cpp4
-rw-r--r--engines/kyra/screen_lol.h4
-rw-r--r--engines/kyra/screen_mr.cpp6
-rw-r--r--engines/kyra/screen_mr.h6
-rw-r--r--engines/kyra/screen_v2.cpp6
-rw-r--r--engines/kyra/screen_v2.h4
-rw-r--r--engines/kyra/script.cpp4
-rw-r--r--engines/kyra/script.h4
-rw-r--r--engines/kyra/script_eob.cpp4
-rw-r--r--engines/kyra/script_eob.h5
-rw-r--r--engines/kyra/script_hof.cpp4
-rw-r--r--engines/kyra/script_lok.cpp4
-rw-r--r--engines/kyra/script_lol.cpp4
-rw-r--r--engines/kyra/script_mr.cpp4
-rw-r--r--engines/kyra/script_tim.cpp4
-rw-r--r--engines/kyra/script_tim.h4
-rw-r--r--engines/kyra/script_v1.cpp4
-rw-r--r--engines/kyra/script_v2.cpp4
-rw-r--r--engines/kyra/seqplayer.cpp4
-rw-r--r--engines/kyra/seqplayer.h4
-rw-r--r--engines/kyra/sequences_darkmoon.cpp4
-rw-r--r--engines/kyra/sequences_eob.cpp4
-rw-r--r--engines/kyra/sequences_hof.cpp6
-rw-r--r--engines/kyra/sequences_hof.h4
-rw-r--r--engines/kyra/sequences_lok.cpp4
-rw-r--r--engines/kyra/sequences_lol.cpp4
-rw-r--r--engines/kyra/sequences_mr.cpp4
-rw-r--r--engines/kyra/sequences_v2.cpp4
-rw-r--r--engines/kyra/sound.cpp4
-rw-r--r--engines/kyra/sound_adlib.cpp8
-rw-r--r--engines/kyra/sound_amiga.cpp4
-rw-r--r--engines/kyra/sound_digital.cpp4
-rw-r--r--engines/kyra/sound_lok.cpp4
-rw-r--r--engines/kyra/sound_lol.cpp4
-rw-r--r--engines/kyra/sound_midi.cpp4
-rw-r--r--engines/kyra/sound_pcspk.cpp4
-rw-r--r--engines/kyra/sound_towns.cpp8
-rw-r--r--engines/kyra/sprites.cpp4
-rw-r--r--engines/kyra/sprites.h4
-rw-r--r--engines/kyra/sprites_eob.cpp4
-rw-r--r--engines/kyra/sprites_lol.cpp4
-rw-r--r--engines/kyra/sprites_rpg.cpp4
-rw-r--r--engines/kyra/staticres.cpp8
-rw-r--r--engines/kyra/staticres_eob.cpp9
-rw-r--r--engines/kyra/staticres_lol.cpp4
-rw-r--r--engines/kyra/staticres_rpg.cpp5
-rw-r--r--engines/kyra/text.cpp4
-rw-r--r--engines/kyra/text.h4
-rw-r--r--engines/kyra/text_hof.cpp4
-rw-r--r--engines/kyra/text_hof.h4
-rw-r--r--engines/kyra/text_lok.cpp4
-rw-r--r--engines/kyra/text_lol.cpp4
-rw-r--r--engines/kyra/text_lol.h4
-rw-r--r--engines/kyra/text_mr.cpp4
-rw-r--r--engines/kyra/text_mr.h4
-rw-r--r--engines/kyra/text_rpg.cpp5
-rw-r--r--engines/kyra/text_rpg.h6
-rw-r--r--engines/kyra/timer.cpp6
-rw-r--r--engines/kyra/timer.h6
-rw-r--r--engines/kyra/timer_eob.cpp6
-rw-r--r--engines/kyra/timer_hof.cpp6
-rw-r--r--engines/kyra/timer_lok.cpp6
-rw-r--r--engines/kyra/timer_lol.cpp6
-rw-r--r--engines/kyra/timer_mr.cpp6
-rw-r--r--engines/kyra/timer_rpg.cpp4
-rw-r--r--engines/kyra/util.cpp4
-rw-r--r--engines/kyra/util.h4
-rw-r--r--engines/kyra/vqa.cpp1021
-rw-r--r--engines/kyra/vqa.h143
-rw-r--r--engines/kyra/wsamovie.cpp4
-rw-r--r--engines/kyra/wsamovie.h4
-rw-r--r--engines/lastexpress/configure.engine3
-rw-r--r--engines/lastexpress/data/animation.cpp6
-rw-r--r--engines/lastexpress/data/animation.h5
-rw-r--r--engines/lastexpress/data/archive.cpp4
-rw-r--r--engines/lastexpress/data/archive.h4
-rw-r--r--engines/lastexpress/data/background.cpp4
-rw-r--r--engines/lastexpress/data/background.h4
-rw-r--r--engines/lastexpress/data/cursor.cpp4
-rw-r--r--engines/lastexpress/data/cursor.h4
-rw-r--r--engines/lastexpress/data/font.cpp4
-rw-r--r--engines/lastexpress/data/font.h4
-rw-r--r--engines/lastexpress/data/scene.cpp4
-rw-r--r--engines/lastexpress/data/scene.h4
-rw-r--r--engines/lastexpress/data/sequence.cpp2
-rw-r--r--engines/lastexpress/data/sequence.h5
-rw-r--r--engines/lastexpress/data/snd.cpp4
-rw-r--r--engines/lastexpress/data/snd.h4
-rw-r--r--engines/lastexpress/data/subtitle.cpp4
-rw-r--r--engines/lastexpress/data/subtitle.h4
-rw-r--r--engines/lastexpress/debug.cpp216
-rw-r--r--engines/lastexpress/debug.h4
-rw-r--r--engines/lastexpress/detection.cpp4
-rw-r--r--engines/lastexpress/drawable.h4
-rw-r--r--engines/lastexpress/entities/abbot.cpp166
-rw-r--r--engines/lastexpress/entities/abbot.h60
-rw-r--r--engines/lastexpress/entities/alexei.cpp234
-rw-r--r--engines/lastexpress/entities/alexei.h60
-rw-r--r--engines/lastexpress/entities/alouan.cpp52
-rw-r--r--engines/lastexpress/entities/alouan.h14
-rw-r--r--engines/lastexpress/entities/anna.cpp404
-rw-r--r--engines/lastexpress/entities/anna.h117
-rw-r--r--engines/lastexpress/entities/august.cpp36
-rw-r--r--engines/lastexpress/entities/august.h4
-rw-r--r--engines/lastexpress/entities/boutarel.cpp4
-rw-r--r--engines/lastexpress/entities/boutarel.h4
-rw-r--r--engines/lastexpress/entities/chapters.cpp36
-rw-r--r--engines/lastexpress/entities/chapters.h4
-rw-r--r--engines/lastexpress/entities/cooks.cpp4
-rw-r--r--engines/lastexpress/entities/cooks.h4
-rw-r--r--engines/lastexpress/entities/coudert.cpp58
-rw-r--r--engines/lastexpress/entities/coudert.h4
-rw-r--r--engines/lastexpress/entities/entity.cpp8
-rw-r--r--engines/lastexpress/entities/entity.h78
-rw-r--r--engines/lastexpress/entities/entity39.cpp4
-rw-r--r--engines/lastexpress/entities/entity39.h4
-rw-r--r--engines/lastexpress/entities/entity_intern.h4
-rw-r--r--engines/lastexpress/entities/francois.cpp154
-rw-r--r--engines/lastexpress/entities/francois.h33
-rw-r--r--engines/lastexpress/entities/gendarmes.cpp14
-rw-r--r--engines/lastexpress/entities/gendarmes.h4
-rw-r--r--engines/lastexpress/entities/hadija.cpp4
-rw-r--r--engines/lastexpress/entities/hadija.h4
-rw-r--r--engines/lastexpress/entities/ivo.cpp4
-rw-r--r--engines/lastexpress/entities/ivo.h4
-rw-r--r--engines/lastexpress/entities/kahina.cpp28
-rw-r--r--engines/lastexpress/entities/kahina.h4
-rw-r--r--engines/lastexpress/entities/kronos.cpp8
-rw-r--r--engines/lastexpress/entities/kronos.h4
-rw-r--r--engines/lastexpress/entities/mahmud.cpp4
-rw-r--r--engines/lastexpress/entities/mahmud.h4
-rw-r--r--engines/lastexpress/entities/max.cpp4
-rw-r--r--engines/lastexpress/entities/max.h4
-rw-r--r--engines/lastexpress/entities/mertens.cpp64
-rw-r--r--engines/lastexpress/entities/mertens.h4
-rw-r--r--engines/lastexpress/entities/milos.cpp34
-rw-r--r--engines/lastexpress/entities/milos.h4
-rw-r--r--engines/lastexpress/entities/mmeboutarel.cpp4
-rw-r--r--engines/lastexpress/entities/mmeboutarel.h4
-rw-r--r--engines/lastexpress/entities/pascale.cpp4
-rw-r--r--engines/lastexpress/entities/pascale.h4
-rw-r--r--engines/lastexpress/entities/rebecca.cpp12
-rw-r--r--engines/lastexpress/entities/rebecca.h4
-rw-r--r--engines/lastexpress/entities/salko.cpp4
-rw-r--r--engines/lastexpress/entities/salko.h4
-rw-r--r--engines/lastexpress/entities/servers0.cpp8
-rw-r--r--engines/lastexpress/entities/servers0.h4
-rw-r--r--engines/lastexpress/entities/servers1.cpp4
-rw-r--r--engines/lastexpress/entities/servers1.h4
-rw-r--r--engines/lastexpress/entities/sophie.cpp4
-rw-r--r--engines/lastexpress/entities/sophie.h4
-rw-r--r--engines/lastexpress/entities/tables.cpp4
-rw-r--r--engines/lastexpress/entities/tables.h4
-rw-r--r--engines/lastexpress/entities/tatiana.cpp18
-rw-r--r--engines/lastexpress/entities/tatiana.h4
-rw-r--r--engines/lastexpress/entities/train.cpp4
-rw-r--r--engines/lastexpress/entities/train.h4
-rw-r--r--engines/lastexpress/entities/vassili.cpp12
-rw-r--r--engines/lastexpress/entities/vassili.h4
-rw-r--r--engines/lastexpress/entities/verges.cpp8
-rw-r--r--engines/lastexpress/entities/verges.h4
-rw-r--r--engines/lastexpress/entities/vesna.cpp4
-rw-r--r--engines/lastexpress/entities/vesna.h4
-rw-r--r--engines/lastexpress/entities/yasmin.cpp78
-rw-r--r--engines/lastexpress/entities/yasmin.h20
-rw-r--r--engines/lastexpress/eventhandler.h4
-rw-r--r--engines/lastexpress/fight/fight.cpp6
-rw-r--r--engines/lastexpress/fight/fight.h4
-rw-r--r--engines/lastexpress/fight/fighter.cpp4
-rw-r--r--engines/lastexpress/fight/fighter.h4
-rw-r--r--engines/lastexpress/fight/fighter_anna.cpp4
-rw-r--r--engines/lastexpress/fight/fighter_anna.h4
-rw-r--r--engines/lastexpress/fight/fighter_ivo.cpp4
-rw-r--r--engines/lastexpress/fight/fighter_ivo.h4
-rw-r--r--engines/lastexpress/fight/fighter_milos.cpp4
-rw-r--r--engines/lastexpress/fight/fighter_milos.h4
-rw-r--r--engines/lastexpress/fight/fighter_salko.cpp4
-rw-r--r--engines/lastexpress/fight/fighter_salko.h4
-rw-r--r--engines/lastexpress/fight/fighter_vesna.cpp4
-rw-r--r--engines/lastexpress/fight/fighter_vesna.h4
-rw-r--r--engines/lastexpress/game/action.cpp120
-rw-r--r--engines/lastexpress/game/action.h32
-rw-r--r--engines/lastexpress/game/beetle.cpp4
-rw-r--r--engines/lastexpress/game/beetle.h4
-rw-r--r--engines/lastexpress/game/entities.cpp4
-rw-r--r--engines/lastexpress/game/entities.h12
-rw-r--r--engines/lastexpress/game/inventory.cpp60
-rw-r--r--engines/lastexpress/game/inventory.h24
-rw-r--r--engines/lastexpress/game/logic.cpp10
-rw-r--r--engines/lastexpress/game/logic.h6
-rw-r--r--engines/lastexpress/game/object.cpp33
-rw-r--r--engines/lastexpress/game/object.h32
-rw-r--r--engines/lastexpress/game/savegame.cpp4
-rw-r--r--engines/lastexpress/game/savegame.h58
-rw-r--r--engines/lastexpress/game/savepoint.cpp4
-rw-r--r--engines/lastexpress/game/savepoint.h4
-rw-r--r--engines/lastexpress/game/scenes.cpp12
-rw-r--r--engines/lastexpress/game/state.cpp4
-rw-r--r--engines/lastexpress/game/state.h16
-rw-r--r--engines/lastexpress/graphics.cpp4
-rw-r--r--engines/lastexpress/graphics.h4
-rw-r--r--engines/lastexpress/helpers.h4
-rw-r--r--engines/lastexpress/lastexpress.cpp4
-rw-r--r--engines/lastexpress/lastexpress.h4
-rw-r--r--engines/lastexpress/menu/clock.cpp4
-rw-r--r--engines/lastexpress/menu/clock.h4
-rw-r--r--engines/lastexpress/menu/menu.cpp4
-rw-r--r--engines/lastexpress/menu/menu.h4
-rw-r--r--engines/lastexpress/menu/trainline.cpp4
-rw-r--r--engines/lastexpress/menu/trainline.h4
-rw-r--r--engines/lastexpress/resource.cpp4
-rw-r--r--engines/lastexpress/resource.h4
-rw-r--r--engines/lastexpress/shared.h34
-rw-r--r--engines/lastexpress/sound/entry.cpp4
-rw-r--r--engines/lastexpress/sound/entry.h4
-rw-r--r--engines/lastexpress/sound/queue.cpp4
-rw-r--r--engines/lastexpress/sound/queue.h4
-rw-r--r--engines/lastexpress/sound/sound.cpp6
-rw-r--r--engines/lastexpress/sound/sound.h4
-rw-r--r--engines/lure/animseq.cpp4
-rw-r--r--engines/lure/animseq.h4
-rw-r--r--engines/lure/configure.engine3
-rw-r--r--engines/lure/debugger.cpp210
-rw-r--r--engines/lure/debugger.h4
-rw-r--r--engines/lure/decode.cpp4
-rw-r--r--engines/lure/decode.h4
-rw-r--r--engines/lure/detection.cpp4
-rw-r--r--engines/lure/disk.cpp4
-rw-r--r--engines/lure/disk.h4
-rw-r--r--engines/lure/events.cpp4
-rw-r--r--engines/lure/events.h4
-rw-r--r--engines/lure/fights.cpp4
-rw-r--r--engines/lure/fights.h4
-rw-r--r--engines/lure/game.cpp4
-rw-r--r--engines/lure/game.h4
-rw-r--r--engines/lure/hotspots.cpp4
-rw-r--r--engines/lure/hotspots.h4
-rw-r--r--engines/lure/intro.cpp4
-rw-r--r--engines/lure/intro.h4
-rw-r--r--engines/lure/lure.cpp4
-rw-r--r--engines/lure/lure.h4
-rw-r--r--engines/lure/luredefs.h4
-rw-r--r--engines/lure/memory.cpp4
-rw-r--r--engines/lure/memory.h4
-rw-r--r--engines/lure/menu.cpp6
-rw-r--r--engines/lure/menu.h4
-rw-r--r--engines/lure/palette.cpp4
-rw-r--r--engines/lure/palette.h4
-rw-r--r--engines/lure/res.cpp4
-rw-r--r--engines/lure/res.h4
-rw-r--r--engines/lure/res_struct.cpp4
-rw-r--r--engines/lure/res_struct.h4
-rw-r--r--engines/lure/room.cpp4
-rw-r--r--engines/lure/room.h4
-rw-r--r--engines/lure/screen.cpp4
-rw-r--r--engines/lure/screen.h4
-rw-r--r--engines/lure/scripts.cpp4
-rw-r--r--engines/lure/scripts.h4
-rw-r--r--engines/lure/sound.cpp4
-rw-r--r--engines/lure/sound.h4
-rw-r--r--engines/lure/strings.cpp4
-rw-r--r--engines/lure/strings.h4
-rw-r--r--engines/lure/surface.cpp4
-rw-r--r--engines/lure/surface.h4
-rw-r--r--engines/made/configure.engine3
-rw-r--r--engines/made/console.cpp4
-rw-r--r--engines/made/console.h4
-rw-r--r--engines/made/database.cpp4
-rw-r--r--engines/made/database.h4
-rw-r--r--engines/made/detection.cpp118
-rw-r--r--engines/made/graphics.cpp4
-rw-r--r--engines/made/graphics.h4
-rw-r--r--engines/made/made.cpp10
-rw-r--r--engines/made/made.h4
-rw-r--r--engines/made/music.cpp4
-rw-r--r--engines/made/music.h4
-rw-r--r--engines/made/pmvplayer.cpp4
-rw-r--r--engines/made/pmvplayer.h4
-rw-r--r--engines/made/redreader.cpp4
-rw-r--r--engines/made/redreader.h4
-rw-r--r--engines/made/resource.cpp4
-rw-r--r--engines/made/resource.h4
-rw-r--r--engines/made/screen.cpp4
-rw-r--r--engines/made/screen.h4
-rw-r--r--engines/made/screenfx.cpp6
-rw-r--r--engines/made/screenfx.h4
-rw-r--r--engines/made/script.cpp4
-rw-r--r--engines/made/script.h4
-rw-r--r--engines/made/scriptfuncs.cpp4
-rw-r--r--engines/made/scriptfuncs.h4
-rw-r--r--engines/made/sound.cpp6
-rw-r--r--engines/made/sound.h4
-rw-r--r--engines/mads/action.cpp708
-rw-r--r--engines/mads/action.h176
-rw-r--r--engines/mads/animation.cpp593
-rw-r--r--engines/mads/animation.h230
-rw-r--r--engines/mads/assets.cpp228
-rw-r--r--engines/mads/assets.h114
-rw-r--r--engines/mads/audio.cpp129
-rw-r--r--engines/mads/audio.h64
-rw-r--r--engines/mads/compression.cpp194
-rw-r--r--engines/mads/compression.h89
-rw-r--r--engines/mads/configure.engine3
-rw-r--r--engines/mads/debugger.cpp326
-rw-r--r--engines/mads/debugger.h61
-rw-r--r--engines/mads/detection.cpp194
-rw-r--r--engines/mads/detection_tables.h122
-rw-r--r--engines/mads/dialogs.cpp398
-rw-r--r--engines/mads/dialogs.h229
-rw-r--r--engines/mads/dragonsphere/dragonsphere_scenes.cpp236
-rw-r--r--engines/mads/dragonsphere/dragonsphere_scenes.h695
-rw-r--r--engines/mads/dragonsphere/game_dragonsphere.cpp159
-rw-r--r--engines/mads/dragonsphere/game_dragonsphere.h151
-rw-r--r--engines/mads/events.cpp256
-rw-r--r--engines/mads/events.h164
-rw-r--r--engines/mads/font.cpp256
-rw-r--r--engines/mads/font.h95
-rw-r--r--engines/mads/game.cpp573
-rw-r--r--engines/mads/game.h233
-rw-r--r--engines/mads/game_data.cpp66
-rw-r--r--engines/mads/game_data.h73
-rw-r--r--engines/mads/globals.cpp (renamed from backends/graphics/opengl/glerrorcheck.h)20
-rw-r--r--engines/mads/globals.h47
-rw-r--r--engines/mads/hotspots.cpp216
-rw-r--r--engines/mads/hotspots.h120
-rw-r--r--engines/mads/inventory.cpp225
-rw-r--r--engines/mads/inventory.h141
-rw-r--r--engines/mads/mads.cpp158
-rw-r--r--engines/mads/mads.h152
-rw-r--r--engines/mads/messages.cpp570
-rw-r--r--engines/mads/messages.h192
-rw-r--r--engines/mads/module.mk58
-rw-r--r--engines/mads/msurface.cpp556
-rw-r--r--engines/mads/msurface.h242
-rw-r--r--engines/mads/nebular/dialogs_nebular.cpp893
-rw-r--r--engines/mads/nebular/dialogs_nebular.h223
-rw-r--r--engines/mads/nebular/game_nebular.cpp856
-rw-r--r--engines/mads/nebular/game_nebular.h160
-rw-r--r--engines/mads/nebular/globals_nebular.cpp55
-rw-r--r--engines/mads/nebular/globals_nebular.h315
-rw-r--r--engines/mads/nebular/nebular_scenes.cpp628
-rw-r--r--engines/mads/nebular/nebular_scenes.h1418
-rw-r--r--engines/mads/nebular/nebular_scenes1.cpp3164
-rw-r--r--engines/mads/nebular/nebular_scenes1.h264
-rw-r--r--engines/mads/nebular/nebular_scenes2.cpp5380
-rw-r--r--engines/mads/nebular/nebular_scenes2.h325
-rw-r--r--engines/mads/nebular/nebular_scenes3.cpp5820
-rw-r--r--engines/mads/nebular/nebular_scenes3.h548
-rw-r--r--engines/mads/nebular/nebular_scenes4.cpp4194
-rw-r--r--engines/mads/nebular/nebular_scenes4.h258
-rw-r--r--engines/mads/nebular/nebular_scenes5.cpp2872
-rw-r--r--engines/mads/nebular/nebular_scenes5.h254
-rw-r--r--engines/mads/nebular/nebular_scenes6.cpp4742
-rw-r--r--engines/mads/nebular/nebular_scenes6.h322
-rw-r--r--engines/mads/nebular/nebular_scenes7.cpp2679
-rw-r--r--engines/mads/nebular/nebular_scenes7.h238
-rw-r--r--engines/mads/nebular/nebular_scenes8.cpp1618
-rw-r--r--engines/mads/nebular/nebular_scenes8.h165
-rw-r--r--engines/mads/nebular/sound_nebular.cpp3119
-rw-r--r--engines/mads/nebular/sound_nebular.h720
-rw-r--r--engines/mads/palette.cpp835
-rw-r--r--engines/mads/palette.h323
-rw-r--r--engines/mads/phantom/game_phantom.cpp147
-rw-r--r--engines/mads/phantom/game_phantom.h124
-rw-r--r--engines/mads/phantom/phantom_scenes.cpp204
-rw-r--r--engines/mads/phantom/phantom_scenes.h521
-rw-r--r--engines/mads/player.cpp794
-rw-r--r--engines/mads/player.h228
-rw-r--r--engines/mads/rails.cpp277
-rw-r--r--engines/mads/rails.h134
-rw-r--r--engines/mads/resources.cpp417
-rw-r--r--engines/mads/resources.h89
-rw-r--r--engines/mads/scene.cpp723
-rw-r--r--engines/mads/scene.h251
-rw-r--r--engines/mads/scene_data.cpp463
-rw-r--r--engines/mads/scene_data.h224
-rw-r--r--engines/mads/screen.cpp653
-rw-r--r--engines/mads/screen.h246
-rw-r--r--engines/mads/sequence.cpp541
-rw-r--r--engines/mads/sequence.h131
-rw-r--r--engines/mads/sound.cpp142
-rw-r--r--engines/mads/sound.h103
-rw-r--r--engines/mads/sprites.cpp417
-rw-r--r--engines/mads/sprites.h240
-rw-r--r--engines/mads/staticres.cpp58
-rw-r--r--engines/mads/staticres.h47
-rw-r--r--engines/mads/user_interface.cpp1096
-rw-r--r--engines/mads/user_interface.h306
-rw-r--r--engines/metaengine.h1
-rw-r--r--engines/mohawk/bitmap.cpp8
-rw-r--r--engines/mohawk/bitmap.h4
-rw-r--r--engines/mohawk/configure.engine6
-rw-r--r--engines/mohawk/console.cpp270
-rw-r--r--engines/mohawk/console.h4
-rw-r--r--engines/mohawk/cstime.cpp4
-rw-r--r--engines/mohawk/cstime.h4
-rw-r--r--engines/mohawk/cstime_cases.cpp4
-rw-r--r--engines/mohawk/cstime_cases.h4
-rw-r--r--engines/mohawk/cstime_game.cpp4
-rw-r--r--engines/mohawk/cstime_game.h4
-rw-r--r--engines/mohawk/cstime_graphics.cpp4
-rw-r--r--engines/mohawk/cstime_graphics.h4
-rw-r--r--engines/mohawk/cstime_ui.cpp4
-rw-r--r--engines/mohawk/cstime_ui.h4
-rw-r--r--engines/mohawk/cstime_view.cpp4
-rw-r--r--engines/mohawk/cstime_view.h4
-rw-r--r--engines/mohawk/cursors.cpp4
-rw-r--r--engines/mohawk/cursors.h4
-rw-r--r--engines/mohawk/detection.cpp4
-rw-r--r--engines/mohawk/detection_tables.h24
-rw-r--r--engines/mohawk/dialogs.cpp4
-rw-r--r--engines/mohawk/dialogs.h4
-rw-r--r--engines/mohawk/graphics.cpp4
-rw-r--r--engines/mohawk/graphics.h4
-rw-r--r--engines/mohawk/installer_archive.cpp4
-rw-r--r--engines/mohawk/installer_archive.h4
-rw-r--r--engines/mohawk/livingbooks.cpp4
-rw-r--r--engines/mohawk/livingbooks.h4
-rw-r--r--engines/mohawk/livingbooks_code.cpp4
-rw-r--r--engines/mohawk/livingbooks_code.h4
-rw-r--r--engines/mohawk/livingbooks_graphics.cpp4
-rw-r--r--engines/mohawk/livingbooks_graphics.h4
-rw-r--r--engines/mohawk/livingbooks_lbx.cpp4
-rw-r--r--engines/mohawk/livingbooks_lbx.h4
-rw-r--r--engines/mohawk/mohawk.cpp4
-rw-r--r--engines/mohawk/mohawk.h4
-rw-r--r--engines/mohawk/myst.cpp4
-rw-r--r--engines/mohawk/myst.h4
-rw-r--r--engines/mohawk/myst_areas.cpp4
-rw-r--r--engines/mohawk/myst_areas.h4
-rw-r--r--engines/mohawk/myst_graphics.cpp9
-rw-r--r--engines/mohawk/myst_graphics.h4
-rw-r--r--engines/mohawk/myst_scripts.cpp4
-rw-r--r--engines/mohawk/myst_scripts.h4
-rw-r--r--engines/mohawk/myst_stacks/channelwood.cpp4
-rw-r--r--engines/mohawk/myst_stacks/channelwood.h4
-rw-r--r--engines/mohawk/myst_stacks/credits.cpp4
-rw-r--r--engines/mohawk/myst_stacks/credits.h4
-rw-r--r--engines/mohawk/myst_stacks/demo.cpp4
-rw-r--r--engines/mohawk/myst_stacks/demo.h4
-rw-r--r--engines/mohawk/myst_stacks/dni.cpp4
-rw-r--r--engines/mohawk/myst_stacks/dni.h4
-rw-r--r--engines/mohawk/myst_stacks/intro.cpp4
-rw-r--r--engines/mohawk/myst_stacks/intro.h4
-rw-r--r--engines/mohawk/myst_stacks/makingof.cpp4
-rw-r--r--engines/mohawk/myst_stacks/makingof.h4
-rw-r--r--engines/mohawk/myst_stacks/mechanical.cpp10
-rw-r--r--engines/mohawk/myst_stacks/mechanical.h4
-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.cpp4
-rw-r--r--engines/mohawk/myst_stacks/preview.h4
-rw-r--r--engines/mohawk/myst_stacks/selenitic.cpp4
-rw-r--r--engines/mohawk/myst_stacks/selenitic.h4
-rw-r--r--engines/mohawk/myst_stacks/slides.cpp4
-rw-r--r--engines/mohawk/myst_stacks/slides.h4
-rw-r--r--engines/mohawk/myst_stacks/stoneship.cpp4
-rw-r--r--engines/mohawk/myst_stacks/stoneship.h4
-rw-r--r--engines/mohawk/myst_state.cpp4
-rw-r--r--engines/mohawk/myst_state.h4
-rw-r--r--engines/mohawk/resource.cpp4
-rw-r--r--engines/mohawk/resource.h4
-rw-r--r--engines/mohawk/resource_cache.cpp4
-rw-r--r--engines/mohawk/resource_cache.h4
-rw-r--r--engines/mohawk/riven.cpp86
-rw-r--r--engines/mohawk/riven.h26
-rw-r--r--engines/mohawk/riven_external.cpp10
-rw-r--r--engines/mohawk/riven_external.h4
-rw-r--r--engines/mohawk/riven_graphics.cpp6
-rw-r--r--engines/mohawk/riven_graphics.h4
-rw-r--r--engines/mohawk/riven_saveload.cpp83
-rw-r--r--engines/mohawk/riven_saveload.h4
-rw-r--r--engines/mohawk/riven_scripts.cpp8
-rw-r--r--engines/mohawk/riven_scripts.h4
-rw-r--r--engines/mohawk/riven_vars.cpp422
-rw-r--r--engines/mohawk/sound.cpp4
-rw-r--r--engines/mohawk/sound.h4
-rw-r--r--engines/mohawk/video.cpp12
-rw-r--r--engines/mohawk/video.h6
-rw-r--r--engines/mohawk/view.cpp4
-rw-r--r--engines/mohawk/view.h4
-rw-r--r--engines/mortevielle/actions.cpp258
-rw-r--r--engines/mortevielle/configure.engine3
-rw-r--r--engines/mortevielle/debugger.cpp19
-rw-r--r--engines/mortevielle/debugger.h9
-rw-r--r--engines/mortevielle/detection.cpp6
-rw-r--r--engines/mortevielle/detection_tables.h4
-rw-r--r--engines/mortevielle/dialogs.cpp109
-rw-r--r--engines/mortevielle/dialogs.h9
-rw-r--r--engines/mortevielle/graphics.cpp31
-rw-r--r--engines/mortevielle/graphics.h9
-rw-r--r--engines/mortevielle/menu.cpp110
-rw-r--r--engines/mortevielle/menu.h9
-rw-r--r--engines/mortevielle/module.mk2
-rw-r--r--engines/mortevielle/mortevielle.cpp116
-rw-r--r--engines/mortevielle/mortevielle.h34
-rw-r--r--engines/mortevielle/mouse.cpp24
-rw-r--r--engines/mortevielle/mouse.h10
-rw-r--r--engines/mortevielle/outtext.cpp42
-rw-r--r--engines/mortevielle/outtext.h9
-rw-r--r--engines/mortevielle/saveload.cpp20
-rw-r--r--engines/mortevielle/saveload.h9
-rw-r--r--engines/mortevielle/sound.cpp22
-rw-r--r--engines/mortevielle/sound.h10
-rw-r--r--engines/mortevielle/utils.cpp497
-rw-r--r--engines/neverhood/background.cpp4
-rw-r--r--engines/neverhood/background.h4
-rw-r--r--engines/neverhood/blbarchive.cpp4
-rw-r--r--engines/neverhood/blbarchive.h4
-rw-r--r--engines/neverhood/configure.engine3
-rw-r--r--engines/neverhood/console.cpp90
-rw-r--r--engines/neverhood/console.h4
-rw-r--r--engines/neverhood/detection.cpp31
-rw-r--r--engines/neverhood/diskplayerscene.cpp10
-rw-r--r--engines/neverhood/diskplayerscene.h4
-rw-r--r--engines/neverhood/entity.cpp4
-rw-r--r--engines/neverhood/entity.h4
-rw-r--r--engines/neverhood/gamemodule.cpp36
-rw-r--r--engines/neverhood/gamemodule.h6
-rw-r--r--engines/neverhood/gamevars.cpp6
-rw-r--r--engines/neverhood/gamevars.h4
-rw-r--r--engines/neverhood/graphics.cpp7
-rw-r--r--engines/neverhood/graphics.h4
-rw-r--r--engines/neverhood/klaymen.cpp215
-rw-r--r--engines/neverhood/klaymen.h11
-rw-r--r--engines/neverhood/menumodule.cpp37
-rw-r--r--engines/neverhood/menumodule.h4
-rw-r--r--engines/neverhood/messages.h52
-rw-r--r--engines/neverhood/microtiles.cpp5
-rw-r--r--engines/neverhood/microtiles.h5
-rw-r--r--engines/neverhood/module.cpp6
-rw-r--r--engines/neverhood/module.h4
-rw-r--r--engines/neverhood/modules/module1000.cpp70
-rw-r--r--engines/neverhood/modules/module1000.h6
-rw-r--r--engines/neverhood/modules/module1000_sprites.cpp461
-rw-r--r--engines/neverhood/modules/module1000_sprites.h9
-rw-r--r--engines/neverhood/modules/module1100.cpp25
-rw-r--r--engines/neverhood/modules/module1100.h4
-rw-r--r--engines/neverhood/modules/module1100_sprites.cpp20
-rw-r--r--engines/neverhood/modules/module1100_sprites.h4
-rw-r--r--engines/neverhood/modules/module1200.cpp22
-rw-r--r--engines/neverhood/modules/module1200.h4
-rw-r--r--engines/neverhood/modules/module1200_sprites.cpp62
-rw-r--r--engines/neverhood/modules/module1200_sprites.h4
-rw-r--r--engines/neverhood/modules/module1300.cpp116
-rw-r--r--engines/neverhood/modules/module1300.h4
-rw-r--r--engines/neverhood/modules/module1300_sprites.cpp86
-rw-r--r--engines/neverhood/modules/module1300_sprites.h4
-rw-r--r--engines/neverhood/modules/module1400.cpp50
-rw-r--r--engines/neverhood/modules/module1400.h4
-rw-r--r--engines/neverhood/modules/module1400_sprites.cpp92
-rw-r--r--engines/neverhood/modules/module1400_sprites.h4
-rw-r--r--engines/neverhood/modules/module1500.cpp10
-rw-r--r--engines/neverhood/modules/module1500.h4
-rw-r--r--engines/neverhood/modules/module1600.cpp38
-rw-r--r--engines/neverhood/modules/module1600.h4
-rw-r--r--engines/neverhood/modules/module1600_sprites.cpp70
-rw-r--r--engines/neverhood/modules/module1600_sprites.h4
-rw-r--r--engines/neverhood/modules/module1700.cpp6
-rw-r--r--engines/neverhood/modules/module1700.h4
-rw-r--r--engines/neverhood/modules/module1700_sprites.cpp16
-rw-r--r--engines/neverhood/modules/module1700_sprites.h4
-rw-r--r--engines/neverhood/modules/module1800.cpp4
-rw-r--r--engines/neverhood/modules/module1800.h4
-rw-r--r--engines/neverhood/modules/module1900.cpp8
-rw-r--r--engines/neverhood/modules/module1900.h4
-rw-r--r--engines/neverhood/modules/module1900_sprites.cpp18
-rw-r--r--engines/neverhood/modules/module1900_sprites.h4
-rw-r--r--engines/neverhood/modules/module2000.cpp6
-rw-r--r--engines/neverhood/modules/module2000.h4
-rw-r--r--engines/neverhood/modules/module2000_sprites.cpp12
-rw-r--r--engines/neverhood/modules/module2000_sprites.h4
-rw-r--r--engines/neverhood/modules/module2100.cpp16
-rw-r--r--engines/neverhood/modules/module2100.h4
-rw-r--r--engines/neverhood/modules/module2100_sprites.cpp30
-rw-r--r--engines/neverhood/modules/module2100_sprites.h4
-rw-r--r--engines/neverhood/modules/module2200.cpp74
-rw-r--r--engines/neverhood/modules/module2200.h4
-rw-r--r--engines/neverhood/modules/module2200_sprites.cpp132
-rw-r--r--engines/neverhood/modules/module2200_sprites.h4
-rw-r--r--engines/neverhood/modules/module2300.cpp32
-rw-r--r--engines/neverhood/modules/module2300.h8
-rw-r--r--engines/neverhood/modules/module2400.cpp32
-rw-r--r--engines/neverhood/modules/module2400.h4
-rw-r--r--engines/neverhood/modules/module2400_sprites.cpp64
-rw-r--r--engines/neverhood/modules/module2400_sprites.h4
-rw-r--r--engines/neverhood/modules/module2500.cpp38
-rw-r--r--engines/neverhood/modules/module2500.h4
-rw-r--r--engines/neverhood/modules/module2500_sprites.cpp12
-rw-r--r--engines/neverhood/modules/module2500_sprites.h4
-rw-r--r--engines/neverhood/modules/module2600.cpp12
-rw-r--r--engines/neverhood/modules/module2600.h4
-rw-r--r--engines/neverhood/modules/module2600_sprites.cpp10
-rw-r--r--engines/neverhood/modules/module2600_sprites.h4
-rw-r--r--engines/neverhood/modules/module2700.cpp101
-rw-r--r--engines/neverhood/modules/module2700.h4
-rw-r--r--engines/neverhood/modules/module2700_sprites.cpp4
-rw-r--r--engines/neverhood/modules/module2700_sprites.h4
-rw-r--r--engines/neverhood/modules/module2800.cpp178
-rw-r--r--engines/neverhood/modules/module2800.h4
-rw-r--r--engines/neverhood/modules/module2800_sprites.cpp150
-rw-r--r--engines/neverhood/modules/module2800_sprites.h4
-rw-r--r--engines/neverhood/modules/module2900.cpp11
-rw-r--r--engines/neverhood/modules/module2900.h4
-rw-r--r--engines/neverhood/modules/module2900_sprites.cpp4
-rw-r--r--engines/neverhood/modules/module2900_sprites.h4
-rw-r--r--engines/neverhood/modules/module3000.cpp69
-rw-r--r--engines/neverhood/modules/module3000.h8
-rw-r--r--engines/neverhood/modules/module3000_sprites.cpp14
-rw-r--r--engines/neverhood/modules/module3000_sprites.h4
-rw-r--r--engines/neverhood/mouse.cpp4
-rw-r--r--engines/neverhood/mouse.h4
-rw-r--r--engines/neverhood/navigationscene.cpp12
-rw-r--r--engines/neverhood/navigationscene.h4
-rw-r--r--engines/neverhood/neverhood.cpp20
-rw-r--r--engines/neverhood/neverhood.h8
-rw-r--r--engines/neverhood/palette.cpp17
-rw-r--r--engines/neverhood/palette.h5
-rw-r--r--engines/neverhood/resource.cpp4
-rw-r--r--engines/neverhood/resource.h4
-rw-r--r--engines/neverhood/resourceman.cpp38
-rw-r--r--engines/neverhood/resourceman.h4
-rw-r--r--engines/neverhood/saveload.cpp5
-rw-r--r--engines/neverhood/scene.cpp28
-rw-r--r--engines/neverhood/scene.h4
-rw-r--r--engines/neverhood/screen.cpp4
-rw-r--r--engines/neverhood/screen.h5
-rw-r--r--engines/neverhood/smackerplayer.cpp18
-rw-r--r--engines/neverhood/smackerplayer.h4
-rw-r--r--engines/neverhood/smackerscene.cpp10
-rw-r--r--engines/neverhood/smackerscene.h4
-rw-r--r--engines/neverhood/sound.cpp37
-rw-r--r--engines/neverhood/sound.h5
-rw-r--r--engines/neverhood/sprite.cpp10
-rw-r--r--engines/neverhood/sprite.h4
-rw-r--r--engines/neverhood/staticdata.cpp51
-rw-r--r--engines/neverhood/staticdata.h4
-rw-r--r--engines/obsolete.cpp4
-rw-r--r--engines/obsolete.h4
-rw-r--r--engines/parallaction/adlib.cpp4
-rw-r--r--engines/parallaction/balloons.cpp4
-rw-r--r--engines/parallaction/callables_br.cpp4
-rw-r--r--engines/parallaction/callables_ns.cpp4
-rw-r--r--engines/parallaction/configure.engine3
-rw-r--r--engines/parallaction/debug.cpp80
-rw-r--r--engines/parallaction/debug.h1
-rw-r--r--engines/parallaction/detection.cpp4
-rw-r--r--engines/parallaction/dialogue.cpp4
-rw-r--r--engines/parallaction/disk.h4
-rw-r--r--engines/parallaction/disk_br.cpp14
-rw-r--r--engines/parallaction/disk_ns.cpp14
-rw-r--r--engines/parallaction/exec.cpp4
-rw-r--r--engines/parallaction/exec.h6
-rw-r--r--engines/parallaction/exec_br.cpp4
-rw-r--r--engines/parallaction/exec_ns.cpp4
-rw-r--r--engines/parallaction/font.cpp7
-rw-r--r--engines/parallaction/gfxbase.cpp4
-rw-r--r--engines/parallaction/graphics.cpp6
-rw-r--r--engines/parallaction/graphics.h8
-rw-r--r--engines/parallaction/gui.cpp4
-rw-r--r--engines/parallaction/gui.h6
-rw-r--r--engines/parallaction/gui_br.cpp9
-rw-r--r--engines/parallaction/gui_ns.cpp7
-rw-r--r--engines/parallaction/input.cpp4
-rw-r--r--engines/parallaction/input.h6
-rw-r--r--engines/parallaction/inventory.cpp4
-rw-r--r--engines/parallaction/inventory.h4
-rw-r--r--engines/parallaction/objects.cpp4
-rw-r--r--engines/parallaction/objects.h10
-rw-r--r--engines/parallaction/parallaction.cpp34
-rw-r--r--engines/parallaction/parallaction.h8
-rw-r--r--engines/parallaction/parallaction_br.cpp16
-rw-r--r--engines/parallaction/parallaction_ns.cpp16
-rw-r--r--engines/parallaction/parser.cpp4
-rw-r--r--engines/parallaction/parser.h15
-rw-r--r--engines/parallaction/parser_br.cpp4
-rw-r--r--engines/parallaction/parser_ns.cpp4
-rw-r--r--engines/parallaction/saveload.cpp4
-rw-r--r--engines/parallaction/saveload.h8
-rw-r--r--engines/parallaction/sound.h10
-rw-r--r--engines/parallaction/sound_br.cpp5
-rw-r--r--engines/parallaction/sound_ns.cpp5
-rw-r--r--engines/parallaction/staticres.cpp4
-rw-r--r--engines/parallaction/walk.cpp4
-rw-r--r--engines/parallaction/walk.h4
-rw-r--r--engines/pegasus/ai/ai_area.cpp2
-rw-r--r--engines/pegasus/configure.engine3
-rw-r--r--engines/pegasus/console.cpp16
-rw-r--r--engines/pegasus/cursor.cpp6
-rw-r--r--engines/pegasus/energymonitor.cpp1
-rw-r--r--engines/pegasus/fader.cpp1
-rw-r--r--engines/pegasus/input.cpp27
-rw-r--r--engines/pegasus/input.h2
-rw-r--r--engines/pegasus/interface.cpp8
-rw-r--r--engines/pegasus/items/inventorypicture.cpp1
-rw-r--r--engines/pegasus/items/item.cpp14
-rw-r--r--engines/pegasus/items/item.h7
-rw-r--r--engines/pegasus/items/itemlist.cpp5
-rw-r--r--engines/pegasus/items/itemlist.h1
-rw-r--r--engines/pegasus/menu.cpp2
-rw-r--r--engines/pegasus/neighborhood/caldoria/caldoria.cpp28
-rw-r--r--engines/pegasus/neighborhood/caldoria/caldoriabomb.cpp15
-rw-r--r--engines/pegasus/neighborhood/caldoria/caldoriabomb.h3
-rw-r--r--engines/pegasus/neighborhood/caldoria/caldoriamessages.cpp6
-rw-r--r--engines/pegasus/neighborhood/caldoria/caldoriamessages.h2
-rw-r--r--engines/pegasus/neighborhood/mars/mars.cpp22
-rw-r--r--engines/pegasus/neighborhood/neighborhood.cpp15
-rw-r--r--engines/pegasus/neighborhood/neighborhood.h2
-rw-r--r--engines/pegasus/neighborhood/norad/delta/globegame.cpp5
-rw-r--r--engines/pegasus/neighborhood/norad/delta/globegame.h2
-rw-r--r--engines/pegasus/neighborhood/norad/delta/noraddelta.cpp18
-rw-r--r--engines/pegasus/neighborhood/norad/delta/noraddelta.h3
-rw-r--r--engines/pegasus/neighborhood/prehistoric/prehistoric.cpp20
-rw-r--r--engines/pegasus/neighborhood/tsa/fulltsa.cpp27
-rw-r--r--engines/pegasus/neighborhood/tsa/tinytsa.cpp23
-rw-r--r--engines/pegasus/neighborhood/wsc/wsc.cpp3
-rw-r--r--engines/pegasus/pegasus.cpp100
-rw-r--r--engines/pegasus/pegasus.h4
-rw-r--r--engines/pegasus/surface.cpp4
-rw-r--r--engines/pegasus/timers.cpp1
-rw-r--r--engines/plugins_table.h130
-rw-r--r--engines/queen/bankman.cpp4
-rw-r--r--engines/queen/bankman.h4
-rw-r--r--engines/queen/command.cpp4
-rw-r--r--engines/queen/command.h4
-rw-r--r--engines/queen/configure.engine3
-rw-r--r--engines/queen/credits.cpp4
-rw-r--r--engines/queen/credits.h4
-rw-r--r--engines/queen/cutaway.cpp7
-rw-r--r--engines/queen/cutaway.h4
-rw-r--r--engines/queen/debug.cpp118
-rw-r--r--engines/queen/debug.h4
-rw-r--r--engines/queen/defs.h4
-rw-r--r--engines/queen/detection.cpp508
-rw-r--r--engines/queen/display.cpp13
-rw-r--r--engines/queen/display.h4
-rw-r--r--engines/queen/graphics.cpp8
-rw-r--r--engines/queen/graphics.h4
-rw-r--r--engines/queen/grid.cpp4
-rw-r--r--engines/queen/grid.h4
-rw-r--r--engines/queen/input.cpp4
-rw-r--r--engines/queen/input.h4
-rw-r--r--engines/queen/journal.cpp4
-rw-r--r--engines/queen/journal.h4
-rw-r--r--engines/queen/logic.cpp4
-rw-r--r--engines/queen/logic.h4
-rw-r--r--engines/queen/midiadlib.cpp4
-rw-r--r--engines/queen/module.mk1
-rw-r--r--engines/queen/music.cpp4
-rw-r--r--engines/queen/music.h4
-rw-r--r--engines/queen/musicdata.cpp4
-rw-r--r--engines/queen/queen.cpp187
-rw-r--r--engines/queen/queen.h4
-rw-r--r--engines/queen/resource.cpp4
-rw-r--r--engines/queen/resource.h4
-rw-r--r--engines/queen/restables.cpp4
-rw-r--r--engines/queen/sound.cpp4
-rw-r--r--engines/queen/sound.h4
-rw-r--r--engines/queen/state.cpp4
-rw-r--r--engines/queen/state.h4
-rw-r--r--engines/queen/structs.h4
-rw-r--r--engines/queen/talk.cpp7
-rw-r--r--engines/queen/talk.h4
-rw-r--r--engines/queen/walk.cpp4
-rw-r--r--engines/queen/walk.h4
-rw-r--r--engines/saga/actor.cpp4
-rw-r--r--engines/saga/actor.h4
-rw-r--r--engines/saga/actor_path.cpp4
-rw-r--r--engines/saga/actor_walk.cpp6
-rw-r--r--engines/saga/animation.cpp12
-rw-r--r--engines/saga/animation.h4
-rw-r--r--engines/saga/configure.engine5
-rw-r--r--engines/saga/console.cpp80
-rw-r--r--engines/saga/console.h4
-rw-r--r--engines/saga/detection.cpp4
-rw-r--r--engines/saga/detection_tables.h4
-rw-r--r--engines/saga/displayinfo.h4
-rw-r--r--engines/saga/events.cpp4
-rw-r--r--engines/saga/events.h4
-rw-r--r--engines/saga/font.cpp4
-rw-r--r--engines/saga/font.h4
-rw-r--r--engines/saga/font_map.cpp4
-rw-r--r--engines/saga/gfx.cpp4
-rw-r--r--engines/saga/gfx.h4
-rw-r--r--engines/saga/image.cpp4
-rw-r--r--engines/saga/input.cpp4
-rw-r--r--engines/saga/interface.cpp4
-rw-r--r--engines/saga/interface.h4
-rw-r--r--engines/saga/introproc_ihnm.cpp4
-rw-r--r--engines/saga/introproc_ite.cpp4
-rw-r--r--engines/saga/introproc_saga2.cpp4
-rw-r--r--engines/saga/isomap.cpp4
-rw-r--r--engines/saga/isomap.h4
-rw-r--r--engines/saga/itedata.cpp4
-rw-r--r--engines/saga/itedata.h4
-rw-r--r--engines/saga/music.cpp4
-rw-r--r--engines/saga/music.h4
-rw-r--r--engines/saga/objectmap.cpp6
-rw-r--r--engines/saga/objectmap.h4
-rw-r--r--engines/saga/palanim.cpp4
-rw-r--r--engines/saga/palanim.h4
-rw-r--r--engines/saga/puzzle.cpp4
-rw-r--r--engines/saga/puzzle.h4
-rw-r--r--engines/saga/render.cpp4
-rw-r--r--engines/saga/render.h4
-rw-r--r--engines/saga/resource.cpp4
-rw-r--r--engines/saga/resource.h4
-rw-r--r--engines/saga/resource_hrs.cpp4
-rw-r--r--engines/saga/resource_res.cpp4
-rw-r--r--engines/saga/resource_rsc.cpp4
-rw-r--r--engines/saga/saga.cpp4
-rw-r--r--engines/saga/saga.h6
-rw-r--r--engines/saga/saveload.cpp4
-rw-r--r--engines/saga/scene.cpp10
-rw-r--r--engines/saga/scene.h4
-rw-r--r--engines/saga/script.cpp4
-rw-r--r--engines/saga/script.h4
-rw-r--r--engines/saga/sfuncs.cpp6
-rw-r--r--engines/saga/sfuncs_ihnm.cpp4
-rw-r--r--engines/saga/shorten.cpp4
-rw-r--r--engines/saga/shorten.h4
-rw-r--r--engines/saga/sndres.cpp4
-rw-r--r--engines/saga/sndres.h4
-rw-r--r--engines/saga/sound.cpp4
-rw-r--r--engines/saga/sound.h4
-rw-r--r--engines/saga/sprite.cpp4
-rw-r--r--engines/saga/sprite.h4
-rw-r--r--engines/saga/sthread.cpp4
-rw-r--r--engines/savestate.cpp4
-rw-r--r--engines/savestate.h4
-rw-r--r--engines/sci/configure.engine4
-rw-r--r--engines/sci/console.cpp1780
-rw-r--r--engines/sci/console.h4
-rw-r--r--engines/sci/debug.h4
-rw-r--r--engines/sci/decompressor.cpp4
-rw-r--r--engines/sci/decompressor.h4
-rw-r--r--engines/sci/detection.cpp4
-rw-r--r--engines/sci/detection_tables.h883
-rw-r--r--engines/sci/engine/features.cpp4
-rw-r--r--engines/sci/engine/features.h4
-rw-r--r--engines/sci/engine/file.cpp4
-rw-r--r--engines/sci/engine/file.h4
-rw-r--r--engines/sci/engine/gc.cpp4
-rw-r--r--engines/sci/engine/gc.h4
-rw-r--r--engines/sci/engine/kernel.cpp16
-rw-r--r--engines/sci/engine/kernel.h8
-rw-r--r--engines/sci/engine/kernel_tables.h12
-rw-r--r--engines/sci/engine/kevent.cpp16
-rw-r--r--engines/sci/engine/kfile.cpp44
-rw-r--r--engines/sci/engine/kgraphics.cpp7
-rw-r--r--engines/sci/engine/kgraphics32.cpp14
-rw-r--r--engines/sci/engine/klists.cpp4
-rw-r--r--engines/sci/engine/kmath.cpp4
-rw-r--r--engines/sci/engine/kmenu.cpp4
-rw-r--r--engines/sci/engine/kmisc.cpp7
-rw-r--r--engines/sci/engine/kmovement.cpp4
-rw-r--r--engines/sci/engine/kparse.cpp4
-rw-r--r--engines/sci/engine/kpathing.cpp6
-rw-r--r--engines/sci/engine/kscripts.cpp4
-rw-r--r--engines/sci/engine/ksound.cpp4
-rw-r--r--engines/sci/engine/kstring.cpp4
-rw-r--r--engines/sci/engine/kvideo.cpp4
-rw-r--r--engines/sci/engine/message.cpp4
-rw-r--r--engines/sci/engine/message.h4
-rw-r--r--engines/sci/engine/object.cpp5
-rw-r--r--engines/sci/engine/object.h4
-rw-r--r--engines/sci/engine/savegame.cpp64
-rw-r--r--engines/sci/engine/savegame.h4
-rw-r--r--engines/sci/engine/script.cpp11
-rw-r--r--engines/sci/engine/script.h13
-rw-r--r--engines/sci/engine/script_patches.cpp3557
-rw-r--r--engines/sci/engine/script_patches.h108
-rw-r--r--engines/sci/engine/scriptdebug.cpp78
-rw-r--r--engines/sci/engine/seg_manager.cpp21
-rw-r--r--engines/sci/engine/seg_manager.h9
-rw-r--r--engines/sci/engine/segment.cpp4
-rw-r--r--engines/sci/engine/segment.h4
-rw-r--r--engines/sci/engine/selector.cpp4
-rw-r--r--engines/sci/engine/selector.h4
-rw-r--r--engines/sci/engine/state.cpp6
-rw-r--r--engines/sci/engine/state.h4
-rw-r--r--engines/sci/engine/static_selectors.cpp4
-rw-r--r--engines/sci/engine/vm.cpp21
-rw-r--r--engines/sci/engine/vm.h4
-rw-r--r--engines/sci/engine/vm_types.cpp41
-rw-r--r--engines/sci/engine/vm_types.h29
-rw-r--r--engines/sci/engine/workarounds.cpp239
-rw-r--r--engines/sci/engine/workarounds.h7
-rw-r--r--engines/sci/event.cpp4
-rw-r--r--engines/sci/event.h4
-rw-r--r--engines/sci/graphics/animate.cpp6
-rw-r--r--engines/sci/graphics/animate.h4
-rw-r--r--engines/sci/graphics/cache.cpp4
-rw-r--r--engines/sci/graphics/cache.h4
-rw-r--r--engines/sci/graphics/compare.cpp14
-rw-r--r--engines/sci/graphics/compare.h6
-rw-r--r--engines/sci/graphics/controls16.cpp4
-rw-r--r--engines/sci/graphics/controls16.h4
-rw-r--r--engines/sci/graphics/controls32.cpp4
-rw-r--r--engines/sci/graphics/controls32.h4
-rw-r--r--engines/sci/graphics/coordadjuster.cpp4
-rw-r--r--engines/sci/graphics/coordadjuster.h4
-rw-r--r--engines/sci/graphics/cursor.cpp4
-rw-r--r--engines/sci/graphics/cursor.h4
-rw-r--r--engines/sci/graphics/font.cpp4
-rw-r--r--engines/sci/graphics/font.h4
-rw-r--r--engines/sci/graphics/fontsjis.cpp4
-rw-r--r--engines/sci/graphics/fontsjis.h4
-rw-r--r--engines/sci/graphics/frameout.cpp14
-rw-r--r--engines/sci/graphics/frameout.h4
-rw-r--r--engines/sci/graphics/helpers.h4
-rw-r--r--engines/sci/graphics/maciconbar.cpp8
-rw-r--r--engines/sci/graphics/maciconbar.h4
-rw-r--r--engines/sci/graphics/menu.cpp4
-rw-r--r--engines/sci/graphics/menu.h4
-rw-r--r--engines/sci/graphics/paint.cpp4
-rw-r--r--engines/sci/graphics/paint.h4
-rw-r--r--engines/sci/graphics/paint16.cpp4
-rw-r--r--engines/sci/graphics/paint16.h4
-rw-r--r--engines/sci/graphics/paint32.cpp12
-rw-r--r--engines/sci/graphics/paint32.h4
-rw-r--r--engines/sci/graphics/palette.cpp4
-rw-r--r--engines/sci/graphics/palette.h4
-rw-r--r--engines/sci/graphics/picture.cpp154
-rw-r--r--engines/sci/graphics/picture.h6
-rw-r--r--engines/sci/graphics/portrait.cpp265
-rw-r--r--engines/sci/graphics/portrait.h15
-rw-r--r--engines/sci/graphics/ports.cpp11
-rw-r--r--engines/sci/graphics/ports.h4
-rw-r--r--engines/sci/graphics/screen.cpp160
-rw-r--r--engines/sci/graphics/screen.h18
-rw-r--r--engines/sci/graphics/text16.cpp4
-rw-r--r--engines/sci/graphics/text16.h4
-rw-r--r--engines/sci/graphics/text32.cpp4
-rw-r--r--engines/sci/graphics/text32.h4
-rw-r--r--engines/sci/graphics/transitions.cpp4
-rw-r--r--engines/sci/graphics/transitions.h4
-rw-r--r--engines/sci/graphics/view.cpp116
-rw-r--r--engines/sci/graphics/view.h4
-rw-r--r--engines/sci/parser/grammar.cpp26
-rw-r--r--engines/sci/parser/said.cpp4
-rw-r--r--engines/sci/parser/vocabulary.cpp31
-rw-r--r--engines/sci/parser/vocabulary.h4
-rw-r--r--engines/sci/resource.cpp55
-rw-r--r--engines/sci/resource.h38
-rw-r--r--engines/sci/resource_audio.cpp126
-rw-r--r--engines/sci/resource_intern.h4
-rw-r--r--engines/sci/sci.cpp81
-rw-r--r--engines/sci/sci.h56
-rw-r--r--engines/sci/sound/audio.cpp60
-rw-r--r--engines/sci/sound/audio.h6
-rw-r--r--engines/sci/sound/drivers/adlib.cpp4
-rw-r--r--engines/sci/sound/drivers/amigamac.cpp4
-rw-r--r--engines/sci/sound/drivers/cms.cpp4
-rw-r--r--engines/sci/sound/drivers/fb01.cpp4
-rw-r--r--engines/sci/sound/drivers/fmtowns.cpp4
-rw-r--r--engines/sci/sound/drivers/gm_names.h4
-rw-r--r--engines/sci/sound/drivers/map-mt32-to-gm.h4
-rw-r--r--engines/sci/sound/drivers/midi.cpp4
-rw-r--r--engines/sci/sound/drivers/mididriver.h4
-rw-r--r--engines/sci/sound/drivers/pcjr.cpp4
-rw-r--r--engines/sci/sound/midiparser_sci.cpp239
-rw-r--r--engines/sci/sound/midiparser_sci.h26
-rw-r--r--engines/sci/sound/music.cpp638
-rw-r--r--engines/sci/sound/music.h50
-rw-r--r--engines/sci/sound/soundcmd.cpp22
-rw-r--r--engines/sci/sound/soundcmd.h4
-rw-r--r--engines/sci/util.cpp4
-rw-r--r--engines/sci/util.h4
-rw-r--r--engines/sci/video/robot_decoder.cpp8
-rw-r--r--engines/sci/video/robot_decoder.h4
-rw-r--r--engines/sci/video/seq_decoder.cpp4
-rw-r--r--engines/sci/video/seq_decoder.h4
-rw-r--r--engines/scumm/actor.cpp4
-rw-r--r--engines/scumm/actor.h4
-rw-r--r--engines/scumm/actor_he.h4
-rw-r--r--engines/scumm/akos.cpp4
-rw-r--r--engines/scumm/akos.h4
-rw-r--r--engines/scumm/base-costume.cpp4
-rw-r--r--engines/scumm/base-costume.h4
-rw-r--r--engines/scumm/bomp.cpp3
-rw-r--r--engines/scumm/bomp.h3
-rw-r--r--engines/scumm/boxes.cpp4
-rw-r--r--engines/scumm/boxes.h4
-rw-r--r--engines/scumm/camera.cpp3
-rw-r--r--engines/scumm/charset-fontdata.cpp1
-rw-r--r--engines/scumm/charset.cpp1
-rw-r--r--engines/scumm/charset.h1
-rw-r--r--engines/scumm/configure.engine5
-rw-r--r--engines/scumm/costume.cpp4
-rw-r--r--engines/scumm/costume.h1
-rw-r--r--engines/scumm/cursor.cpp3
-rw-r--r--engines/scumm/debugger.cpp262
-rw-r--r--engines/scumm/debugger.h5
-rw-r--r--engines/scumm/detection.cpp30
-rw-r--r--engines/scumm/detection.h4
-rw-r--r--engines/scumm/detection_tables.h4
-rw-r--r--engines/scumm/dialogs.cpp1
-rw-r--r--engines/scumm/dialogs.h1
-rw-r--r--engines/scumm/gfx.cpp5
-rw-r--r--engines/scumm/gfx.h4
-rw-r--r--engines/scumm/gfxARM.s2
-rw-r--r--engines/scumm/gfx_towns.cpp3
-rw-r--r--engines/scumm/he/animation_he.cpp10
-rw-r--r--engines/scumm/he/animation_he.h12
-rw-r--r--engines/scumm/he/cup_player_he.cpp4
-rw-r--r--engines/scumm/he/cup_player_he.h4
-rw-r--r--engines/scumm/he/floodfill_he.cpp4
-rw-r--r--engines/scumm/he/floodfill_he.h4
-rw-r--r--engines/scumm/he/intern_he.h19
-rw-r--r--engines/scumm/he/logic/baseball2001.cpp4
-rw-r--r--engines/scumm/he/logic/basketball.cpp4
-rw-r--r--engines/scumm/he/logic/football.cpp23
-rw-r--r--engines/scumm/he/logic/funshop.cpp4
-rw-r--r--engines/scumm/he/logic/moonbase.cpp4
-rw-r--r--engines/scumm/he/logic/puttrace.cpp4
-rw-r--r--engines/scumm/he/logic/soccer.cpp6
-rw-r--r--engines/scumm/he/logic_he.cpp4
-rw-r--r--engines/scumm/he/logic_he.h4
-rw-r--r--engines/scumm/he/palette_he.cpp4
-rw-r--r--engines/scumm/he/resource_he.cpp4
-rw-r--r--engines/scumm/he/resource_he.h4
-rw-r--r--engines/scumm/he/script_v100he.cpp11
-rw-r--r--engines/scumm/he/script_v60he.cpp274
-rw-r--r--engines/scumm/he/script_v70he.cpp4
-rw-r--r--engines/scumm/he/script_v71he.cpp4
-rw-r--r--engines/scumm/he/script_v72he.cpp70
-rw-r--r--engines/scumm/he/script_v80he.cpp53
-rw-r--r--engines/scumm/he/script_v90he.cpp9
-rw-r--r--engines/scumm/he/sound_he.cpp4
-rw-r--r--engines/scumm/he/sound_he.h1
-rw-r--r--engines/scumm/he/sprite_he.cpp4
-rw-r--r--engines/scumm/he/sprite_he.h4
-rw-r--r--engines/scumm/he/wiz_he.cpp35
-rw-r--r--engines/scumm/he/wiz_he.h4
-rw-r--r--engines/scumm/imuse/imuse.cpp4
-rw-r--r--engines/scumm/imuse/imuse.h4
-rw-r--r--engines/scumm/imuse/imuse_internal.h1
-rw-r--r--engines/scumm/imuse/imuse_part.cpp4
-rw-r--r--engines/scumm/imuse/imuse_player.cpp1
-rw-r--r--engines/scumm/imuse/instrument.cpp1
-rw-r--r--engines/scumm/imuse/instrument.h1
-rw-r--r--engines/scumm/imuse/mac_m68k.cpp1
-rw-r--r--engines/scumm/imuse/mac_m68k.h1
-rw-r--r--engines/scumm/imuse/pcspk.cpp1
-rw-r--r--engines/scumm/imuse/pcspk.h1
-rw-r--r--engines/scumm/imuse/sysex.h1
-rw-r--r--engines/scumm/imuse/sysex_samnmax.cpp1
-rw-r--r--engines/scumm/imuse/sysex_scumm.cpp1
-rw-r--r--engines/scumm/imuse_digi/dimuse.cpp1
-rw-r--r--engines/scumm/imuse_digi/dimuse.h1
-rw-r--r--engines/scumm/imuse_digi/dimuse_bndmgr.cpp1
-rw-r--r--engines/scumm/imuse_digi/dimuse_bndmgr.h1
-rw-r--r--engines/scumm/imuse_digi/dimuse_codecs.cpp1
-rw-r--r--engines/scumm/imuse_digi/dimuse_codecs.h1
-rw-r--r--engines/scumm/imuse_digi/dimuse_music.cpp1
-rw-r--r--engines/scumm/imuse_digi/dimuse_script.cpp1
-rw-r--r--engines/scumm/imuse_digi/dimuse_sndmgr.cpp3
-rw-r--r--engines/scumm/imuse_digi/dimuse_sndmgr.h1
-rw-r--r--engines/scumm/imuse_digi/dimuse_tables.cpp1
-rw-r--r--engines/scumm/imuse_digi/dimuse_tables.h1
-rw-r--r--engines/scumm/imuse_digi/dimuse_track.cpp1
-rw-r--r--engines/scumm/imuse_digi/dimuse_track.h1
-rw-r--r--engines/scumm/input.cpp4
-rw-r--r--engines/scumm/insane/insane.cpp4
-rw-r--r--engines/scumm/insane/insane.h4
-rw-r--r--engines/scumm/insane/insane_ben.cpp4
-rw-r--r--engines/scumm/insane/insane_enemy.cpp4
-rw-r--r--engines/scumm/insane/insane_iact.cpp4
-rw-r--r--engines/scumm/insane/insane_scenes.cpp4
-rw-r--r--engines/scumm/midiparser_ro.cpp4
-rw-r--r--engines/scumm/module.mk34
-rw-r--r--engines/scumm/music.h7
-rw-r--r--engines/scumm/nut_renderer.cpp1
-rw-r--r--engines/scumm/nut_renderer.h1
-rw-r--r--engines/scumm/object.cpp4
-rw-r--r--engines/scumm/object.h1
-rw-r--r--engines/scumm/palette.cpp3
-rw-r--r--engines/scumm/player_ad.cpp959
-rw-r--r--engines/scumm/players/player_ad.cpp1195
-rw-r--r--engines/scumm/players/player_ad.h (renamed from engines/scumm/player_ad.h)144
-rw-r--r--engines/scumm/players/player_apple2.cpp (renamed from engines/scumm/player_apple2.cpp)6
-rw-r--r--engines/scumm/players/player_apple2.h (renamed from engines/scumm/player_apple2.h)8
-rw-r--r--engines/scumm/players/player_mac.cpp (renamed from engines/scumm/player_mac.cpp)6
-rw-r--r--engines/scumm/players/player_mac.h (renamed from engines/scumm/player_mac.h)8
-rw-r--r--engines/scumm/players/player_mod.cpp (renamed from engines/scumm/player_mod.cpp)6
-rw-r--r--engines/scumm/players/player_mod.h (renamed from engines/scumm/player_mod.h)8
-rw-r--r--engines/scumm/players/player_nes.cpp (renamed from engines/scumm/player_nes.cpp)8
-rw-r--r--engines/scumm/players/player_nes.h (renamed from engines/scumm/player_nes.h)8
-rw-r--r--engines/scumm/players/player_pce.cpp (renamed from engines/scumm/player_pce.cpp)6
-rw-r--r--engines/scumm/players/player_pce.h (renamed from engines/scumm/player_pce.h)8
-rw-r--r--engines/scumm/players/player_sid.cpp (renamed from engines/scumm/player_sid.cpp)6
-rw-r--r--engines/scumm/players/player_sid.h (renamed from engines/scumm/player_sid.h)8
-rw-r--r--engines/scumm/players/player_towns.cpp (renamed from engines/scumm/player_towns.cpp)6
-rw-r--r--engines/scumm/players/player_towns.h (renamed from engines/scumm/player_towns.h)8
-rw-r--r--engines/scumm/players/player_v1.cpp (renamed from engines/scumm/player_v1.cpp)6
-rw-r--r--engines/scumm/players/player_v1.h (renamed from engines/scumm/player_v1.h)10
-rw-r--r--engines/scumm/players/player_v2.cpp (renamed from engines/scumm/player_v2.cpp)6
-rw-r--r--engines/scumm/players/player_v2.h (renamed from engines/scumm/player_v2.h)10
-rw-r--r--engines/scumm/players/player_v2a.cpp (renamed from engines/scumm/player_v2a.cpp)6
-rw-r--r--engines/scumm/players/player_v2a.h (renamed from engines/scumm/player_v2a.h)10
-rw-r--r--engines/scumm/players/player_v2base.cpp (renamed from engines/scumm/player_v2base.cpp)6
-rw-r--r--engines/scumm/players/player_v2base.h (renamed from engines/scumm/player_v2base.h)8
-rw-r--r--engines/scumm/players/player_v2cms.cpp (renamed from engines/scumm/player_v2cms.cpp)6
-rw-r--r--engines/scumm/players/player_v2cms.h (renamed from engines/scumm/player_v2cms.h)10
-rw-r--r--engines/scumm/players/player_v3a.cpp (renamed from engines/scumm/player_v3a.cpp)6
-rw-r--r--engines/scumm/players/player_v3a.h (renamed from engines/scumm/player_v3a.h)10
-rw-r--r--engines/scumm/players/player_v3m.cpp (renamed from engines/scumm/player_v3m.cpp)6
-rw-r--r--engines/scumm/players/player_v3m.h (renamed from engines/scumm/player_v3m.h)10
-rw-r--r--engines/scumm/players/player_v4a.cpp (renamed from engines/scumm/player_v4a.cpp)6
-rw-r--r--engines/scumm/players/player_v4a.h (renamed from engines/scumm/player_v4a.h)8
-rw-r--r--engines/scumm/players/player_v5m.cpp (renamed from engines/scumm/player_v5m.cpp)6
-rw-r--r--engines/scumm/players/player_v5m.h (renamed from engines/scumm/player_v5m.h)10
-rw-r--r--engines/scumm/proc3ARM.s17
-rw-r--r--engines/scumm/resource.cpp4
-rw-r--r--engines/scumm/resource.h1
-rw-r--r--engines/scumm/resource_v2.cpp4
-rw-r--r--engines/scumm/resource_v3.cpp4
-rw-r--r--engines/scumm/resource_v4.cpp4
-rw-r--r--engines/scumm/room.cpp4
-rw-r--r--engines/scumm/saveload.cpp182
-rw-r--r--engines/scumm/saveload.h6
-rw-r--r--engines/scumm/script.cpp4
-rw-r--r--engines/scumm/script.h4
-rw-r--r--engines/scumm/script_v0.cpp4
-rw-r--r--engines/scumm/script_v2.cpp4
-rw-r--r--engines/scumm/script_v3.cpp4
-rw-r--r--engines/scumm/script_v4.cpp4
-rw-r--r--engines/scumm/script_v5.cpp6
-rw-r--r--engines/scumm/script_v6.cpp4
-rw-r--r--engines/scumm/script_v8.cpp4
-rw-r--r--engines/scumm/scumm.cpp42
-rw-r--r--engines/scumm/scumm.h25
-rw-r--r--engines/scumm/scumm_v0.h4
-rw-r--r--engines/scumm/scumm_v2.h4
-rw-r--r--engines/scumm/scumm_v3.h4
-rw-r--r--engines/scumm/scumm_v4.h4
-rw-r--r--engines/scumm/scumm_v5.h4
-rw-r--r--engines/scumm/scumm_v6.h4
-rw-r--r--engines/scumm/scumm_v7.h4
-rw-r--r--engines/scumm/scumm_v8.h4
-rw-r--r--engines/scumm/smush/channel.cpp4
-rw-r--r--engines/scumm/smush/channel.h4
-rw-r--r--engines/scumm/smush/codec1.cpp4
-rw-r--r--engines/scumm/smush/codec37.cpp4
-rw-r--r--engines/scumm/smush/codec37.h4
-rw-r--r--engines/scumm/smush/codec47.cpp4
-rw-r--r--engines/scumm/smush/codec47.h4
-rw-r--r--engines/scumm/smush/codec47ARM.s1
-rw-r--r--engines/scumm/smush/imuse_channel.cpp4
-rw-r--r--engines/scumm/smush/saud_channel.cpp4
-rw-r--r--engines/scumm/smush/smush_font.cpp4
-rw-r--r--engines/scumm/smush/smush_font.h4
-rw-r--r--engines/scumm/smush/smush_mixer.cpp4
-rw-r--r--engines/scumm/smush/smush_mixer.h4
-rw-r--r--engines/scumm/smush/smush_player.cpp4
-rw-r--r--engines/scumm/smush/smush_player.h4
-rw-r--r--engines/scumm/sound.cpp6
-rw-r--r--engines/scumm/sound.h1
-rw-r--r--engines/scumm/string.cpp4
-rw-r--r--engines/scumm/vars.cpp6
-rw-r--r--engines/scumm/verbs.cpp4
-rw-r--r--engines/scumm/verbs.h1
-rw-r--r--engines/sky/autoroute.cpp4
-rw-r--r--engines/sky/autoroute.h4
-rw-r--r--engines/sky/configure.engine3
-rw-r--r--engines/sky/control.cpp4
-rw-r--r--engines/sky/control.h4
-rw-r--r--engines/sky/debug.cpp135
-rw-r--r--engines/sky/detection.cpp4
-rw-r--r--engines/sky/disk.cpp4
-rw-r--r--engines/sky/disk.h4
-rw-r--r--engines/sky/grid.cpp4
-rw-r--r--engines/sky/grid.h4
-rw-r--r--engines/sky/hufftext.cpp4
-rw-r--r--engines/sky/intro.cpp4
-rw-r--r--engines/sky/intro.h4
-rw-r--r--engines/sky/logic.cpp4
-rw-r--r--engines/sky/logic.h4
-rw-r--r--engines/sky/mouse.cpp4
-rw-r--r--engines/sky/mouse.h4
-rw-r--r--engines/sky/music/adlibchannel.cpp4
-rw-r--r--engines/sky/music/adlibchannel.h4
-rw-r--r--engines/sky/music/adlibmusic.cpp4
-rw-r--r--engines/sky/music/adlibmusic.h4
-rw-r--r--engines/sky/music/gmchannel.cpp4
-rw-r--r--engines/sky/music/gmchannel.h4
-rw-r--r--engines/sky/music/gmmusic.cpp4
-rw-r--r--engines/sky/music/gmmusic.h4
-rw-r--r--engines/sky/music/mt32music.cpp4
-rw-r--r--engines/sky/music/mt32music.h4
-rw-r--r--engines/sky/music/musicbase.cpp4
-rw-r--r--engines/sky/music/musicbase.h4
-rw-r--r--engines/sky/rnc_deco.cpp4
-rw-r--r--engines/sky/rnc_deco.h4
-rw-r--r--engines/sky/screen.cpp4
-rw-r--r--engines/sky/screen.h4
-rw-r--r--engines/sky/sky.cpp4
-rw-r--r--engines/sky/sky.h4
-rw-r--r--engines/sky/skydefs.h4
-rw-r--r--engines/sky/sound.cpp4
-rw-r--r--engines/sky/sound.h4
-rw-r--r--engines/sky/struc.h4
-rw-r--r--engines/sky/text.cpp4
-rw-r--r--engines/sky/text.h4
-rw-r--r--engines/sword1/animation.cpp4
-rw-r--r--engines/sword1/animation.h4
-rw-r--r--engines/sword1/collision.h4
-rw-r--r--engines/sword1/configure.engine3
-rw-r--r--engines/sword1/console.cpp4
-rw-r--r--engines/sword1/console.h4
-rw-r--r--engines/sword1/control.cpp4
-rw-r--r--engines/sword1/control.h4
-rw-r--r--engines/sword1/debug.cpp4
-rw-r--r--engines/sword1/debug.h4
-rw-r--r--engines/sword1/detection.cpp4
-rw-r--r--engines/sword1/eventman.cpp4
-rw-r--r--engines/sword1/eventman.h4
-rw-r--r--engines/sword1/logic.cpp4
-rw-r--r--engines/sword1/logic.h4
-rw-r--r--engines/sword1/memman.cpp4
-rw-r--r--engines/sword1/memman.h4
-rw-r--r--engines/sword1/menu.cpp4
-rw-r--r--engines/sword1/menu.h4
-rw-r--r--engines/sword1/module.mk2
-rw-r--r--engines/sword1/mouse.cpp4
-rw-r--r--engines/sword1/mouse.h4
-rw-r--r--engines/sword1/music.cpp10
-rw-r--r--engines/sword1/music.h6
-rw-r--r--engines/sword1/object.h4
-rw-r--r--engines/sword1/objectman.cpp4
-rw-r--r--engines/sword1/objectman.h4
-rw-r--r--engines/sword1/resman.cpp4
-rw-r--r--engines/sword1/resman.h4
-rw-r--r--engines/sword1/router.cpp4
-rw-r--r--engines/sword1/router.h4
-rw-r--r--engines/sword1/screen.cpp28
-rw-r--r--engines/sword1/screen.h4
-rw-r--r--engines/sword1/sound.cpp7
-rw-r--r--engines/sword1/sound.h4
-rw-r--r--engines/sword1/staticres.cpp10
-rw-r--r--engines/sword1/sword1.cpp15
-rw-r--r--engines/sword1/sword1.h4
-rw-r--r--engines/sword1/sworddefs.h4
-rw-r--r--engines/sword1/swordres.h4
-rw-r--r--engines/sword1/text.cpp4
-rw-r--r--engines/sword1/text.h4
-rw-r--r--engines/sword2/configure.engine3
-rw-r--r--engines/sword2/console.cpp264
-rw-r--r--engines/sword2/resman.cpp2
-rw-r--r--engines/sword2/sound.cpp2
-rw-r--r--engines/sword25/configure.engine3
-rw-r--r--engines/sword25/console.cpp4
-rw-r--r--engines/sword25/console.h4
-rw-r--r--engines/sword25/detection.cpp4
-rw-r--r--engines/sword25/detection_tables.h4
-rw-r--r--engines/sword25/fmv/movieplayer.cpp4
-rw-r--r--engines/sword25/fmv/movieplayer.h4
-rw-r--r--engines/sword25/fmv/movieplayer_script.cpp4
-rw-r--r--engines/sword25/gfx/animation.cpp4
-rw-r--r--engines/sword25/gfx/animation.h4
-rw-r--r--engines/sword25/gfx/animationdescription.cpp4
-rw-r--r--engines/sword25/gfx/animationdescription.h4
-rw-r--r--engines/sword25/gfx/animationresource.cpp4
-rw-r--r--engines/sword25/gfx/animationresource.h4
-rw-r--r--engines/sword25/gfx/animationtemplate.cpp4
-rw-r--r--engines/sword25/gfx/animationtemplate.h4
-rw-r--r--engines/sword25/gfx/animationtemplateregistry.cpp4
-rw-r--r--engines/sword25/gfx/animationtemplateregistry.h4
-rw-r--r--engines/sword25/gfx/bitmap.cpp4
-rw-r--r--engines/sword25/gfx/bitmap.h4
-rw-r--r--engines/sword25/gfx/bitmapresource.h4
-rw-r--r--engines/sword25/gfx/dynamicbitmap.cpp4
-rw-r--r--engines/sword25/gfx/dynamicbitmap.h4
-rw-r--r--engines/sword25/gfx/fontresource.cpp4
-rw-r--r--engines/sword25/gfx/fontresource.h4
-rw-r--r--engines/sword25/gfx/graphicengine.cpp4
-rw-r--r--engines/sword25/gfx/graphicengine.h4
-rw-r--r--engines/sword25/gfx/graphicengine_script.cpp4
-rw-r--r--engines/sword25/gfx/image/art.cpp7
-rw-r--r--engines/sword25/gfx/image/art.h4
-rw-r--r--engines/sword25/gfx/image/image.h4
-rw-r--r--engines/sword25/gfx/image/imgloader.cpp8
-rw-r--r--engines/sword25/gfx/image/imgloader.h4
-rw-r--r--engines/sword25/gfx/image/renderedimage.cpp4
-rw-r--r--engines/sword25/gfx/image/renderedimage.h4
-rw-r--r--engines/sword25/gfx/image/swimage.cpp4
-rw-r--r--engines/sword25/gfx/image/swimage.h4
-rw-r--r--engines/sword25/gfx/image/vectorimage.cpp4
-rw-r--r--engines/sword25/gfx/image/vectorimage.h4
-rw-r--r--engines/sword25/gfx/image/vectorimagerenderer.cpp4
-rw-r--r--engines/sword25/gfx/microtiles.cpp5
-rw-r--r--engines/sword25/gfx/microtiles.h5
-rw-r--r--engines/sword25/gfx/panel.cpp4
-rw-r--r--engines/sword25/gfx/panel.h4
-rw-r--r--engines/sword25/gfx/renderobject.cpp4
-rw-r--r--engines/sword25/gfx/renderobject.h4
-rw-r--r--engines/sword25/gfx/renderobjectmanager.cpp21
-rw-r--r--engines/sword25/gfx/renderobjectmanager.h4
-rw-r--r--engines/sword25/gfx/renderobjectptr.h4
-rw-r--r--engines/sword25/gfx/renderobjectregistry.h4
-rw-r--r--engines/sword25/gfx/rootrenderobject.h4
-rw-r--r--engines/sword25/gfx/screenshot.cpp4
-rw-r--r--engines/sword25/gfx/screenshot.h4
-rw-r--r--engines/sword25/gfx/staticbitmap.cpp4
-rw-r--r--engines/sword25/gfx/staticbitmap.h4
-rw-r--r--engines/sword25/gfx/text.cpp4
-rw-r--r--engines/sword25/gfx/text.h4
-rw-r--r--engines/sword25/gfx/timedrenderobject.cpp4
-rw-r--r--engines/sword25/gfx/timedrenderobject.h4
-rw-r--r--engines/sword25/input/inputengine.cpp4
-rw-r--r--engines/sword25/input/inputengine.h4
-rw-r--r--engines/sword25/input/inputengine_script.cpp4
-rw-r--r--engines/sword25/kernel/common.h4
-rw-r--r--engines/sword25/kernel/filesystemutil.cpp4
-rw-r--r--engines/sword25/kernel/filesystemutil.h4
-rw-r--r--engines/sword25/kernel/inputpersistenceblock.cpp4
-rw-r--r--engines/sword25/kernel/inputpersistenceblock.h4
-rw-r--r--engines/sword25/kernel/kernel.cpp4
-rw-r--r--engines/sword25/kernel/kernel.h4
-rw-r--r--engines/sword25/kernel/kernel_script.cpp4
-rw-r--r--engines/sword25/kernel/objectregistry.h4
-rw-r--r--engines/sword25/kernel/outputpersistenceblock.cpp4
-rw-r--r--engines/sword25/kernel/outputpersistenceblock.h4
-rw-r--r--engines/sword25/kernel/persistable.h4
-rw-r--r--engines/sword25/kernel/persistenceblock.h4
-rw-r--r--engines/sword25/kernel/persistenceservice.cpp4
-rw-r--r--engines/sword25/kernel/persistenceservice.h4
-rw-r--r--engines/sword25/kernel/resmanager.cpp4
-rw-r--r--engines/sword25/kernel/resmanager.h4
-rw-r--r--engines/sword25/kernel/resource.cpp4
-rw-r--r--engines/sword25/kernel/resource.h4
-rw-r--r--engines/sword25/kernel/resservice.h4
-rw-r--r--engines/sword25/kernel/service.h4
-rw-r--r--engines/sword25/math/geometry.h4
-rw-r--r--engines/sword25/math/geometry_script.cpp4
-rw-r--r--engines/sword25/math/line.h4
-rw-r--r--engines/sword25/math/polygon.cpp4
-rw-r--r--engines/sword25/math/polygon.h4
-rw-r--r--engines/sword25/math/region.cpp4
-rw-r--r--engines/sword25/math/region.h4
-rw-r--r--engines/sword25/math/regionregistry.cpp4
-rw-r--r--engines/sword25/math/regionregistry.h4
-rw-r--r--engines/sword25/math/vertex.cpp4
-rw-r--r--engines/sword25/math/vertex.h4
-rw-r--r--engines/sword25/math/walkregion.cpp4
-rw-r--r--engines/sword25/math/walkregion.h4
-rw-r--r--engines/sword25/package/packagemanager.cpp4
-rw-r--r--engines/sword25/package/packagemanager.h4
-rw-r--r--engines/sword25/package/packagemanager_script.cpp4
-rw-r--r--engines/sword25/script/lua_extensions.cpp4
-rw-r--r--engines/sword25/script/luabindhelper.cpp4
-rw-r--r--engines/sword25/script/luabindhelper.h4
-rw-r--r--engines/sword25/script/luacallback.cpp4
-rw-r--r--engines/sword25/script/luacallback.h4
-rw-r--r--engines/sword25/script/luascript.cpp4
-rw-r--r--engines/sword25/script/luascript.h4
-rw-r--r--engines/sword25/script/script.h4
-rw-r--r--engines/sword25/sfx/soundengine.cpp10
-rw-r--r--engines/sword25/sfx/soundengine.h4
-rw-r--r--engines/sword25/sfx/soundengine_script.cpp4
-rw-r--r--engines/sword25/sword25.cpp4
-rw-r--r--engines/sword25/sword25.h4
-rw-r--r--engines/sword25/util/lua/lopcodes.cpp2
-rw-r--r--engines/sword25/util/lua/loslib.cpp10
-rw-r--r--engines/sword25/util/lua/lua.h2
-rw-r--r--engines/sword25/util/lua/scummvm_file.cpp4
-rw-r--r--engines/sword25/util/lua/scummvm_file.h4
-rw-r--r--engines/sword25/util/pluto/pluto.cpp1
-rw-r--r--engines/teenagent/actor.cpp5
-rw-r--r--engines/teenagent/actor.h1
-rw-r--r--engines/teenagent/animation.cpp1
-rw-r--r--engines/teenagent/animation.h1
-rw-r--r--engines/teenagent/callbacks.cpp15
-rw-r--r--engines/teenagent/configure.engine3
-rw-r--r--engines/teenagent/console.cpp47
-rw-r--r--engines/teenagent/console.h1
-rw-r--r--engines/teenagent/detection.cpp5
-rw-r--r--engines/teenagent/dialog.cpp1
-rw-r--r--engines/teenagent/dialog.h1
-rw-r--r--engines/teenagent/font.cpp1
-rw-r--r--engines/teenagent/font.h1
-rw-r--r--engines/teenagent/inventory.cpp1
-rw-r--r--engines/teenagent/inventory.h1
-rw-r--r--engines/teenagent/music.cpp4
-rw-r--r--engines/teenagent/music.h4
-rw-r--r--engines/teenagent/objects.cpp1
-rw-r--r--engines/teenagent/objects.h1
-rw-r--r--engines/teenagent/pack.cpp1
-rw-r--r--engines/teenagent/pack.h1
-rw-r--r--engines/teenagent/resources.cpp1
-rw-r--r--engines/teenagent/resources.h3
-rw-r--r--engines/teenagent/scene.cpp1
-rw-r--r--engines/teenagent/scene.h1
-rw-r--r--engines/teenagent/segment.cpp1
-rw-r--r--engines/teenagent/segment.h1
-rw-r--r--engines/teenagent/surface.cpp1
-rw-r--r--engines/teenagent/surface.h1
-rw-r--r--engines/teenagent/surface_list.cpp1
-rw-r--r--engines/teenagent/surface_list.h1
-rw-r--r--engines/teenagent/teenagent.cpp1
-rw-r--r--engines/teenagent/teenagent.h7
-rw-r--r--engines/testbed/config-params.cpp1
-rw-r--r--engines/testbed/config-params.h1
-rw-r--r--engines/testbed/config.cpp1
-rw-r--r--engines/testbed/config.h1
-rw-r--r--engines/testbed/configure.engine3
-rw-r--r--engines/testbed/detection.cpp4
-rw-r--r--engines/testbed/events.cpp1
-rw-r--r--engines/testbed/events.h1
-rw-r--r--engines/testbed/fs.cpp1
-rw-r--r--engines/testbed/fs.h1
-rw-r--r--engines/testbed/graphics.cpp1
-rw-r--r--engines/testbed/graphics.h1
-rw-r--r--engines/testbed/midi.cpp1
-rw-r--r--engines/testbed/midi.h1
-rw-r--r--engines/testbed/misc.cpp1
-rw-r--r--engines/testbed/misc.h1
-rw-r--r--engines/testbed/savegame.cpp1
-rw-r--r--engines/testbed/savegame.h1
-rw-r--r--engines/testbed/sound.cpp1
-rw-r--r--engines/testbed/sound.h1
-rw-r--r--engines/testbed/template.h1
-rw-r--r--engines/testbed/testbed.cpp1
-rw-r--r--engines/testbed/testbed.h1
-rw-r--r--engines/testbed/testsuite.cpp1
-rw-r--r--engines/testbed/testsuite.h1
-rw-r--r--engines/tinsel/actors.cpp4
-rw-r--r--engines/tinsel/actors.h4
-rw-r--r--engines/tinsel/adpcm.cpp4
-rw-r--r--engines/tinsel/adpcm.h4
-rw-r--r--engines/tinsel/anim.cpp4
-rw-r--r--engines/tinsel/anim.h4
-rw-r--r--engines/tinsel/background.cpp4
-rw-r--r--engines/tinsel/background.h4
-rw-r--r--engines/tinsel/bg.cpp4
-rw-r--r--engines/tinsel/bmv.cpp4
-rw-r--r--engines/tinsel/bmv.h2
-rw-r--r--engines/tinsel/cliprect.cpp4
-rw-r--r--engines/tinsel/cliprect.h4
-rw-r--r--engines/tinsel/config.cpp4
-rw-r--r--engines/tinsel/config.h4
-rw-r--r--engines/tinsel/configure.engine3
-rw-r--r--engines/tinsel/cursor.cpp4
-rw-r--r--engines/tinsel/cursor.h4
-rw-r--r--engines/tinsel/debugger.cpp46
-rw-r--r--engines/tinsel/debugger.h4
-rw-r--r--engines/tinsel/detection.cpp4
-rw-r--r--engines/tinsel/detection_tables.h6
-rw-r--r--engines/tinsel/dialogs.cpp4
-rw-r--r--engines/tinsel/dialogs.h4
-rw-r--r--engines/tinsel/drives.cpp4
-rw-r--r--engines/tinsel/drives.h4
-rw-r--r--engines/tinsel/dw.h4
-rw-r--r--engines/tinsel/effect.cpp4
-rw-r--r--engines/tinsel/events.cpp4
-rw-r--r--engines/tinsel/events.h4
-rw-r--r--engines/tinsel/faders.cpp4
-rw-r--r--engines/tinsel/faders.h4
-rw-r--r--engines/tinsel/film.h4
-rw-r--r--engines/tinsel/font.cpp4
-rw-r--r--engines/tinsel/font.h4
-rw-r--r--engines/tinsel/graphics.cpp4
-rw-r--r--engines/tinsel/graphics.h2
-rw-r--r--engines/tinsel/handle.cpp4
-rw-r--r--engines/tinsel/handle.h4
-rw-r--r--engines/tinsel/heapmem.cpp4
-rw-r--r--engines/tinsel/heapmem.h4
-rw-r--r--engines/tinsel/mareels.cpp4
-rw-r--r--engines/tinsel/mareels.h4
-rw-r--r--engines/tinsel/move.cpp4
-rw-r--r--engines/tinsel/move.h4
-rw-r--r--engines/tinsel/multiobj.cpp4
-rw-r--r--engines/tinsel/multiobj.h4
-rw-r--r--engines/tinsel/music.cpp39
-rw-r--r--engines/tinsel/music.h4
-rw-r--r--engines/tinsel/object.cpp4
-rw-r--r--engines/tinsel/object.h2
-rw-r--r--engines/tinsel/palette.cpp4
-rw-r--r--engines/tinsel/palette.h2
-rw-r--r--engines/tinsel/pcode.cpp4
-rw-r--r--engines/tinsel/pcode.h2
-rw-r--r--engines/tinsel/pdisplay.cpp4
-rw-r--r--engines/tinsel/pdisplay.h2
-rw-r--r--engines/tinsel/pid.h2
-rw-r--r--engines/tinsel/play.cpp4
-rw-r--r--engines/tinsel/play.h2
-rw-r--r--engines/tinsel/polygons.cpp4
-rw-r--r--engines/tinsel/polygons.h2
-rw-r--r--engines/tinsel/rince.cpp4
-rw-r--r--engines/tinsel/rince.h2
-rw-r--r--engines/tinsel/saveload.cpp4
-rw-r--r--engines/tinsel/savescn.cpp4
-rw-r--r--engines/tinsel/savescn.h2
-rw-r--r--engines/tinsel/scene.cpp46
-rw-r--r--engines/tinsel/scene.h2
-rw-r--r--engines/tinsel/sched.cpp4
-rw-r--r--engines/tinsel/sched.h2
-rw-r--r--engines/tinsel/scn.cpp4
-rw-r--r--engines/tinsel/scn.h2
-rw-r--r--engines/tinsel/scroll.cpp4
-rw-r--r--engines/tinsel/scroll.h2
-rw-r--r--engines/tinsel/sound.cpp4
-rw-r--r--engines/tinsel/sound.h4
-rw-r--r--engines/tinsel/strres.cpp4
-rw-r--r--engines/tinsel/strres.h4
-rw-r--r--engines/tinsel/sysvar.cpp4
-rw-r--r--engines/tinsel/sysvar.h4
-rw-r--r--engines/tinsel/text.cpp4
-rw-r--r--engines/tinsel/text.h4
-rw-r--r--engines/tinsel/timers.cpp4
-rw-r--r--engines/tinsel/timers.h4
-rw-r--r--engines/tinsel/tinlib.cpp4
-rw-r--r--engines/tinsel/tinlib.h4
-rw-r--r--engines/tinsel/tinsel.cpp23
-rw-r--r--engines/tinsel/tinsel.h8
-rw-r--r--engines/tinsel/token.cpp4
-rw-r--r--engines/tinsel/token.h4
-rw-r--r--engines/toltecs/animation.cpp5
-rw-r--r--engines/toltecs/animation.h5
-rw-r--r--engines/toltecs/configure.engine3
-rw-r--r--engines/toltecs/console.cpp18
-rw-r--r--engines/toltecs/console.h4
-rw-r--r--engines/toltecs/detection.cpp7
-rw-r--r--engines/toltecs/menu.cpp17
-rw-r--r--engines/toltecs/menu.h5
-rw-r--r--engines/toltecs/microtiles.cpp14
-rw-r--r--engines/toltecs/microtiles.h5
-rw-r--r--engines/toltecs/movie.cpp5
-rw-r--r--engines/toltecs/movie.h5
-rw-r--r--engines/toltecs/music.cpp4
-rw-r--r--engines/toltecs/music.h4
-rw-r--r--engines/toltecs/palette.cpp9
-rw-r--r--engines/toltecs/palette.h5
-rw-r--r--engines/toltecs/render.cpp25
-rw-r--r--engines/toltecs/render.h5
-rw-r--r--engines/toltecs/resource.cpp5
-rw-r--r--engines/toltecs/resource.h5
-rw-r--r--engines/toltecs/saveload.cpp7
-rw-r--r--engines/toltecs/screen.cpp9
-rw-r--r--engines/toltecs/screen.h5
-rw-r--r--engines/toltecs/script.cpp15
-rw-r--r--engines/toltecs/script.h5
-rw-r--r--engines/toltecs/segmap.cpp5
-rw-r--r--engines/toltecs/segmap.h5
-rw-r--r--engines/toltecs/sound.cpp5
-rw-r--r--engines/toltecs/sound.h5
-rw-r--r--engines/toltecs/sprite.cpp5
-rw-r--r--engines/toltecs/toltecs.cpp13
-rw-r--r--engines/toltecs/toltecs.h12
-rw-r--r--engines/tony/configure.engine3
-rw-r--r--engines/tony/custom.cpp5
-rw-r--r--engines/tony/custom.h4
-rw-r--r--engines/tony/debugger.cpp18
-rw-r--r--engines/tony/debugger.h6
-rw-r--r--engines/tony/detection.cpp9
-rw-r--r--engines/tony/detection_tables.h23
-rw-r--r--engines/tony/font.cpp4
-rw-r--r--engines/tony/font.h5
-rw-r--r--engines/tony/game.cpp9
-rw-r--r--engines/tony/game.h5
-rw-r--r--engines/tony/gfxcore.cpp13
-rw-r--r--engines/tony/gfxcore.h6
-rw-r--r--engines/tony/gfxengine.cpp13
-rw-r--r--engines/tony/gfxengine.h4
-rw-r--r--engines/tony/globals.cpp4
-rw-r--r--engines/tony/globals.h4
-rw-r--r--engines/tony/input.cpp4
-rw-r--r--engines/tony/input.h4
-rw-r--r--engines/tony/inventory.cpp11
-rw-r--r--engines/tony/inventory.h6
-rw-r--r--engines/tony/loc.cpp17
-rw-r--r--engines/tony/loc.h6
-rw-r--r--engines/tony/mpal/expr.cpp5
-rw-r--r--engines/tony/mpal/expr.h5
-rw-r--r--engines/tony/mpal/loadmpc.cpp9
-rw-r--r--engines/tony/mpal/loadmpc.h5
-rw-r--r--engines/tony/mpal/lzo.cpp386
-rw-r--r--engines/tony/mpal/lzo.h26
-rw-r--r--engines/tony/mpal/memory.cpp5
-rw-r--r--engines/tony/mpal/memory.h5
-rw-r--r--engines/tony/mpal/mpal.cpp24
-rw-r--r--engines/tony/mpal/mpal.h11
-rw-r--r--engines/tony/mpal/mpaldll.h5
-rw-r--r--engines/tony/mpal/mpalutils.cpp5
-rw-r--r--engines/tony/mpal/mpalutils.h5
-rw-r--r--engines/tony/resid.h4
-rw-r--r--engines/tony/sound.cpp6
-rw-r--r--engines/tony/sound.h4
-rw-r--r--engines/tony/tony.cpp4
-rw-r--r--engines/tony/tony.h6
-rw-r--r--engines/tony/tonychar.cpp4
-rw-r--r--engines/tony/tonychar.h4
-rw-r--r--engines/tony/utils.cpp4
-rw-r--r--engines/tony/utils.h4
-rw-r--r--engines/tony/window.cpp16
-rw-r--r--engines/tony/window.h5
-rw-r--r--engines/toon/anim.cpp12
-rw-r--r--engines/toon/anim.h4
-rw-r--r--engines/toon/audio.cpp7
-rw-r--r--engines/toon/audio.h4
-rw-r--r--engines/toon/character.cpp55
-rw-r--r--engines/toon/character.h40
-rw-r--r--engines/toon/configure.engine3
-rw-r--r--engines/toon/console.cpp4
-rw-r--r--engines/toon/console.h4
-rw-r--r--engines/toon/conversation.cpp40
-rw-r--r--engines/toon/conversation.h40
-rw-r--r--engines/toon/detection.cpp7
-rw-r--r--engines/toon/drew.cpp4
-rw-r--r--engines/toon/drew.h40
-rw-r--r--engines/toon/flux.cpp40
-rw-r--r--engines/toon/flux.h40
-rw-r--r--engines/toon/font.cpp45
-rw-r--r--engines/toon/font.h40
-rw-r--r--engines/toon/hotspot.cpp40
-rw-r--r--engines/toon/hotspot.h40
-rw-r--r--engines/toon/movie.cpp49
-rw-r--r--engines/toon/movie.h43
-rw-r--r--engines/toon/path.cpp42
-rw-r--r--engines/toon/path.h40
-rw-r--r--engines/toon/picture.cpp50
-rw-r--r--engines/toon/picture.h40
-rw-r--r--engines/toon/resource.cpp41
-rw-r--r--engines/toon/resource.h41
-rw-r--r--engines/toon/script.cpp45
-rw-r--r--engines/toon/script.h40
-rw-r--r--engines/toon/script_func.cpp46
-rw-r--r--engines/toon/script_func.h40
-rw-r--r--engines/toon/state.cpp44
-rw-r--r--engines/toon/state.h40
-rw-r--r--engines/toon/text.cpp40
-rw-r--r--engines/toon/text.h40
-rw-r--r--engines/toon/tools.cpp47
-rw-r--r--engines/toon/tools.h40
-rw-r--r--engines/toon/toon.cpp111
-rw-r--r--engines/toon/toon.h40
-rw-r--r--engines/touche/configure.engine3
-rw-r--r--engines/touche/console.cpp10
-rw-r--r--engines/touche/console.h4
-rw-r--r--engines/touche/detection.cpp4
-rw-r--r--engines/touche/graphics.cpp4
-rw-r--r--engines/touche/graphics.h4
-rw-r--r--engines/touche/menu.cpp175
-rw-r--r--engines/touche/midi.cpp4
-rw-r--r--engines/touche/midi.h4
-rw-r--r--engines/touche/opcodes.cpp4
-rw-r--r--engines/touche/resource.cpp24
-rw-r--r--engines/touche/saveload.cpp4
-rw-r--r--engines/touche/staticres.cpp4
-rw-r--r--engines/touche/touche.cpp111
-rw-r--r--engines/touche/touche.h114
-rw-r--r--engines/tsage/blue_force/blueforce_dialogs.cpp6
-rw-r--r--engines/tsage/blue_force/blueforce_dialogs.h6
-rw-r--r--engines/tsage/blue_force/blueforce_logic.cpp49
-rw-r--r--engines/tsage/blue_force/blueforce_logic.h24
-rw-r--r--engines/tsage/blue_force/blueforce_scenes0.cpp17
-rw-r--r--engines/tsage/blue_force/blueforce_scenes0.h8
-rw-r--r--engines/tsage/blue_force/blueforce_scenes1.cpp24
-rw-r--r--engines/tsage/blue_force/blueforce_scenes1.h6
-rw-r--r--engines/tsage/blue_force/blueforce_scenes2.cpp12
-rw-r--r--engines/tsage/blue_force/blueforce_scenes2.h6
-rw-r--r--engines/tsage/blue_force/blueforce_scenes3.cpp99
-rw-r--r--engines/tsage/blue_force/blueforce_scenes3.h12
-rw-r--r--engines/tsage/blue_force/blueforce_scenes4.cpp130
-rw-r--r--engines/tsage/blue_force/blueforce_scenes4.h18
-rw-r--r--engines/tsage/blue_force/blueforce_scenes5.cpp45
-rw-r--r--engines/tsage/blue_force/blueforce_scenes5.h10
-rw-r--r--engines/tsage/blue_force/blueforce_scenes6.cpp10
-rw-r--r--engines/tsage/blue_force/blueforce_scenes6.h6
-rw-r--r--engines/tsage/blue_force/blueforce_scenes7.cpp8
-rw-r--r--engines/tsage/blue_force/blueforce_scenes7.h6
-rw-r--r--engines/tsage/blue_force/blueforce_scenes8.cpp36
-rw-r--r--engines/tsage/blue_force/blueforce_scenes8.h9
-rw-r--r--engines/tsage/blue_force/blueforce_scenes9.cpp74
-rw-r--r--engines/tsage/blue_force/blueforce_scenes9.h7
-rw-r--r--engines/tsage/blue_force/blueforce_speakers.cpp10
-rw-r--r--engines/tsage/blue_force/blueforce_speakers.h8
-rw-r--r--engines/tsage/configure.engine3
-rw-r--r--engines/tsage/converse.cpp102
-rw-r--r--engines/tsage/converse.h19
-rw-r--r--engines/tsage/core.cpp159
-rw-r--r--engines/tsage/core.h30
-rw-r--r--engines/tsage/debugger.cpp412
-rw-r--r--engines/tsage/debugger.h8
-rw-r--r--engines/tsage/detection.cpp27
-rw-r--r--engines/tsage/detection_tables.h23
-rw-r--r--engines/tsage/dialogs.cpp6
-rw-r--r--engines/tsage/dialogs.h6
-rw-r--r--engines/tsage/events.cpp10
-rw-r--r--engines/tsage/events.h8
-rw-r--r--engines/tsage/globals.cpp296
-rw-r--r--engines/tsage/globals.h60
-rw-r--r--engines/tsage/graphics.cpp104
-rw-r--r--engines/tsage/graphics.h15
-rw-r--r--engines/tsage/resources.cpp6
-rw-r--r--engines/tsage/resources.h6
-rw-r--r--engines/tsage/ringworld/ringworld_demo.cpp6
-rw-r--r--engines/tsage/ringworld/ringworld_demo.h6
-rw-r--r--engines/tsage/ringworld/ringworld_dialogs.cpp9
-rw-r--r--engines/tsage/ringworld/ringworld_dialogs.h6
-rw-r--r--engines/tsage/ringworld/ringworld_logic.cpp11
-rw-r--r--engines/tsage/ringworld/ringworld_logic.h6
-rw-r--r--engines/tsage/ringworld/ringworld_scenes1.cpp704
-rw-r--r--engines/tsage/ringworld/ringworld_scenes1.h88
-rw-r--r--engines/tsage/ringworld/ringworld_scenes10.cpp10
-rw-r--r--engines/tsage/ringworld/ringworld_scenes10.h6
-rw-r--r--engines/tsage/ringworld/ringworld_scenes2.cpp6
-rw-r--r--engines/tsage/ringworld/ringworld_scenes2.h6
-rw-r--r--engines/tsage/ringworld/ringworld_scenes3.cpp48
-rw-r--r--engines/tsage/ringworld/ringworld_scenes3.h8
-rw-r--r--engines/tsage/ringworld/ringworld_scenes4.cpp6
-rw-r--r--engines/tsage/ringworld/ringworld_scenes4.h6
-rw-r--r--engines/tsage/ringworld/ringworld_scenes5.cpp21
-rw-r--r--engines/tsage/ringworld/ringworld_scenes5.h8
-rw-r--r--engines/tsage/ringworld/ringworld_scenes6.cpp19
-rw-r--r--engines/tsage/ringworld/ringworld_scenes6.h12
-rw-r--r--engines/tsage/ringworld/ringworld_scenes8.cpp14
-rw-r--r--engines/tsage/ringworld/ringworld_scenes8.h8
-rw-r--r--engines/tsage/ringworld/ringworld_speakers.cpp6
-rw-r--r--engines/tsage/ringworld/ringworld_speakers.h6
-rw-r--r--engines/tsage/ringworld2/ringworld2_dialogs.cpp78
-rw-r--r--engines/tsage/ringworld2/ringworld2_dialogs.h11
-rw-r--r--engines/tsage/ringworld2/ringworld2_logic.cpp210
-rw-r--r--engines/tsage/ringworld2/ringworld2_logic.h24
-rw-r--r--engines/tsage/ringworld2/ringworld2_scenes0.cpp1374
-rw-r--r--engines/tsage/ringworld2/ringworld2_scenes0.h90
-rw-r--r--engines/tsage/ringworld2/ringworld2_scenes1.cpp8434
-rw-r--r--engines/tsage/ringworld2/ringworld2_scenes1.h554
-rw-r--r--engines/tsage/ringworld2/ringworld2_scenes2.cpp1203
-rw-r--r--engines/tsage/ringworld2/ringworld2_scenes2.h228
-rw-r--r--engines/tsage/ringworld2/ringworld2_scenes3.cpp2775
-rw-r--r--engines/tsage/ringworld2/ringworld2_scenes3.h288
-rw-r--r--engines/tsage/ringworld2/ringworld2_speakers.cpp630
-rw-r--r--engines/tsage/ringworld2/ringworld2_speakers.h156
-rw-r--r--engines/tsage/saveload.cpp50
-rw-r--r--engines/tsage/saveload.h25
-rw-r--r--engines/tsage/scenes.cpp25
-rw-r--r--engines/tsage/scenes.h10
-rw-r--r--engines/tsage/sound.cpp343
-rw-r--r--engines/tsage/sound.h27
-rw-r--r--engines/tsage/staticres.cpp20
-rw-r--r--engines/tsage/staticres.h18
-rw-r--r--engines/tsage/tsage.cpp45
-rw-r--r--engines/tsage/tsage.h9
-rw-r--r--engines/tsage/user_interface.cpp37
-rw-r--r--engines/tsage/user_interface.h9
-rw-r--r--engines/tucker/configure.engine3
-rw-r--r--engines/tucker/console.cpp6
-rw-r--r--engines/tucker/console.h4
-rw-r--r--engines/tucker/detection.cpp4
-rw-r--r--engines/tucker/graphics.cpp36
-rw-r--r--engines/tucker/graphics.h14
-rw-r--r--engines/tucker/locations.cpp1243
-rw-r--r--engines/tucker/resource.cpp307
-rw-r--r--engines/tucker/saveload.cpp8
-rw-r--r--engines/tucker/sequences.cpp43
-rw-r--r--engines/tucker/staticres.cpp4
-rw-r--r--engines/tucker/tucker.cpp904
-rw-r--r--engines/tucker/tucker.h269
-rw-r--r--engines/util.h1
-rw-r--r--engines/voyeur/animation.cpp501
-rw-r--r--engines/voyeur/animation.h195
-rw-r--r--engines/voyeur/configure.engine4
-rw-r--r--engines/voyeur/data.cpp371
-rw-r--r--engines/voyeur/data.h232
-rw-r--r--engines/voyeur/debugger.cpp174
-rw-r--r--engines/voyeur/debugger.h70
-rw-r--r--engines/voyeur/detection.cpp181
-rw-r--r--engines/voyeur/detection_tables.h42
-rw-r--r--engines/voyeur/events.cpp613
-rw-r--r--engines/voyeur/events.h145
-rw-r--r--engines/voyeur/files.cpp1626
-rw-r--r--engines/voyeur/files.h619
-rw-r--r--engines/voyeur/files_threads.cpp1731
-rw-r--r--engines/voyeur/graphics.cpp1054
-rw-r--r--engines/voyeur/graphics.h120
-rw-r--r--engines/voyeur/module.mk23
-rw-r--r--engines/voyeur/sound.cpp85
-rw-r--r--engines/voyeur/sound.h (renamed from engines/avalanche/pingo.h)58
-rw-r--r--engines/voyeur/staticres.cpp142
-rw-r--r--engines/voyeur/staticres.h63
-rw-r--r--engines/voyeur/voyeur.cpp924
-rw-r--r--engines/voyeur/voyeur.h325
-rw-r--r--engines/voyeur/voyeur_game.cpp1427
-rw-r--r--engines/wintermute/ad/ad_actor.cpp32
-rw-r--r--engines/wintermute/ad/ad_actor.h6
-rw-r--r--engines/wintermute/ad/ad_entity.cpp16
-rw-r--r--engines/wintermute/ad/ad_entity.h6
-rw-r--r--engines/wintermute/ad/ad_game.cpp30
-rw-r--r--engines/wintermute/ad/ad_game.h4
-rw-r--r--engines/wintermute/ad/ad_inventory.cpp6
-rw-r--r--engines/wintermute/ad/ad_inventory.h4
-rw-r--r--engines/wintermute/ad/ad_inventory_box.cpp22
-rw-r--r--engines/wintermute/ad/ad_inventory_box.h4
-rw-r--r--engines/wintermute/ad/ad_item.cpp20
-rw-r--r--engines/wintermute/ad/ad_item.h4
-rw-r--r--engines/wintermute/ad/ad_layer.cpp14
-rw-r--r--engines/wintermute/ad/ad_layer.h4
-rw-r--r--engines/wintermute/ad/ad_node_state.cpp16
-rw-r--r--engines/wintermute/ad/ad_node_state.h4
-rw-r--r--engines/wintermute/ad/ad_object.cpp40
-rw-r--r--engines/wintermute/ad/ad_object.h6
-rw-r--r--engines/wintermute/ad/ad_path.cpp8
-rw-r--r--engines/wintermute/ad/ad_path.h4
-rw-r--r--engines/wintermute/ad/ad_path_point.cpp8
-rw-r--r--engines/wintermute/ad/ad_path_point.h4
-rw-r--r--engines/wintermute/ad/ad_region.cpp10
-rw-r--r--engines/wintermute/ad/ad_region.h4
-rw-r--r--engines/wintermute/ad/ad_response.cpp12
-rw-r--r--engines/wintermute/ad/ad_response.h4
-rw-r--r--engines/wintermute/ad/ad_response_box.cpp22
-rw-r--r--engines/wintermute/ad/ad_response_box.h4
-rw-r--r--engines/wintermute/ad/ad_response_context.cpp8
-rw-r--r--engines/wintermute/ad/ad_response_context.h4
-rw-r--r--engines/wintermute/ad/ad_rot_level.cpp4
-rw-r--r--engines/wintermute/ad/ad_rot_level.h4
-rw-r--r--engines/wintermute/ad/ad_scale_level.cpp4
-rw-r--r--engines/wintermute/ad/ad_scale_level.h4
-rw-r--r--engines/wintermute/ad/ad_scene.cpp90
-rw-r--r--engines/wintermute/ad/ad_scene.h4
-rw-r--r--engines/wintermute/ad/ad_scene_node.cpp6
-rw-r--r--engines/wintermute/ad/ad_scene_node.h4
-rw-r--r--engines/wintermute/ad/ad_scene_state.cpp6
-rw-r--r--engines/wintermute/ad/ad_scene_state.h4
-rw-r--r--engines/wintermute/ad/ad_sentence.cpp30
-rw-r--r--engines/wintermute/ad/ad_sentence.h4
-rw-r--r--engines/wintermute/ad/ad_sprite_set.cpp4
-rw-r--r--engines/wintermute/ad/ad_sprite_set.h4
-rw-r--r--engines/wintermute/ad/ad_talk_def.cpp8
-rw-r--r--engines/wintermute/ad/ad_talk_def.h4
-rw-r--r--engines/wintermute/ad/ad_talk_holder.cpp4
-rw-r--r--engines/wintermute/ad/ad_talk_holder.h4
-rw-r--r--engines/wintermute/ad/ad_talk_node.cpp16
-rw-r--r--engines/wintermute/ad/ad_talk_node.h4
-rw-r--r--engines/wintermute/ad/ad_types.h4
-rw-r--r--engines/wintermute/ad/ad_waypoint_group.cpp12
-rw-r--r--engines/wintermute/ad/ad_waypoint_group.h4
-rw-r--r--engines/wintermute/base/base.cpp6
-rw-r--r--engines/wintermute/base/base.h6
-rw-r--r--engines/wintermute/base/base_active_rect.cpp8
-rw-r--r--engines/wintermute/base/base_active_rect.h4
-rw-r--r--engines/wintermute/base/base_dynamic_buffer.cpp4
-rw-r--r--engines/wintermute/base/base_dynamic_buffer.h4
-rw-r--r--engines/wintermute/base/base_engine.cpp4
-rw-r--r--engines/wintermute/base/base_engine.h4
-rw-r--r--engines/wintermute/base/base_fader.cpp24
-rw-r--r--engines/wintermute/base/base_fader.h4
-rw-r--r--engines/wintermute/base/base_file_manager.cpp90
-rw-r--r--engines/wintermute/base/base_file_manager.h4
-rw-r--r--engines/wintermute/base/base_frame.cpp22
-rw-r--r--engines/wintermute/base/base_frame.h4
-rw-r--r--engines/wintermute/base/base_game.cpp66
-rw-r--r--engines/wintermute/base/base_game.h7
-rw-r--r--engines/wintermute/base/base_game_music.cpp18
-rw-r--r--engines/wintermute/base/base_game_music.h4
-rw-r--r--engines/wintermute/base/base_game_settings.cpp4
-rw-r--r--engines/wintermute/base/base_game_settings.h4
-rw-r--r--engines/wintermute/base/base_keyboard_state.cpp30
-rw-r--r--engines/wintermute/base/base_keyboard_state.h4
-rw-r--r--engines/wintermute/base/base_named_object.cpp4
-rw-r--r--engines/wintermute/base/base_named_object.h4
-rw-r--r--engines/wintermute/base/base_object.cpp62
-rw-r--r--engines/wintermute/base/base_object.h6
-rw-r--r--engines/wintermute/base/base_parser.cpp8
-rw-r--r--engines/wintermute/base/base_parser.h4
-rw-r--r--engines/wintermute/base/base_persistence_manager.cpp61
-rw-r--r--engines/wintermute/base/base_persistence_manager.h27
-rw-r--r--engines/wintermute/base/base_point.cpp8
-rw-r--r--engines/wintermute/base/base_point.h4
-rw-r--r--engines/wintermute/base/base_quick_msg.cpp4
-rw-r--r--engines/wintermute/base/base_quick_msg.h4
-rw-r--r--engines/wintermute/base/base_region.cpp20
-rw-r--r--engines/wintermute/base/base_region.h4
-rw-r--r--engines/wintermute/base/base_script_holder.cpp12
-rw-r--r--engines/wintermute/base/base_script_holder.h4
-rw-r--r--engines/wintermute/base/base_scriptable.cpp6
-rw-r--r--engines/wintermute/base/base_scriptable.h4
-rw-r--r--engines/wintermute/base/base_sprite.cpp44
-rw-r--r--engines/wintermute/base/base_sprite.h4
-rw-r--r--engines/wintermute/base/base_string_table.cpp4
-rw-r--r--engines/wintermute/base/base_string_table.h4
-rw-r--r--engines/wintermute/base/base_sub_frame.cpp74
-rw-r--r--engines/wintermute/base/base_sub_frame.h4
-rw-r--r--engines/wintermute/base/base_surface_storage.cpp4
-rw-r--r--engines/wintermute/base/base_surface_storage.h4
-rw-r--r--engines/wintermute/base/base_transition_manager.cpp4
-rw-r--r--engines/wintermute/base/base_transition_manager.h4
-rw-r--r--engines/wintermute/base/base_viewport.cpp15
-rw-r--r--engines/wintermute/base/base_viewport.h4
-rw-r--r--engines/wintermute/base/file/base_disk_file.cpp4
-rw-r--r--engines/wintermute/base/file/base_disk_file.h4
-rw-r--r--engines/wintermute/base/file/base_file.cpp4
-rw-r--r--engines/wintermute/base/file/base_file.h4
-rw-r--r--engines/wintermute/base/file/base_file_entry.cpp4
-rw-r--r--engines/wintermute/base/file/base_file_entry.h4
-rw-r--r--engines/wintermute/base/file/base_package.cpp8
-rw-r--r--engines/wintermute/base/file/base_package.h4
-rw-r--r--engines/wintermute/base/file/base_save_thumb_file.cpp4
-rw-r--r--engines/wintermute/base/file/base_save_thumb_file.h4
-rw-r--r--engines/wintermute/base/file/dcpackage.h4
-rw-r--r--engines/wintermute/base/font/base_font.cpp4
-rw-r--r--engines/wintermute/base/font/base_font.h4
-rw-r--r--engines/wintermute/base/font/base_font_bitmap.cpp19
-rw-r--r--engines/wintermute/base/font/base_font_bitmap.h4
-rw-r--r--engines/wintermute/base/font/base_font_storage.cpp4
-rw-r--r--engines/wintermute/base/font/base_font_storage.h4
-rw-r--r--engines/wintermute/base/font/base_font_truetype.cpp82
-rw-r--r--engines/wintermute/base/font/base_font_truetype.h15
-rw-r--r--engines/wintermute/base/gfx/base_image.cpp24
-rw-r--r--engines/wintermute/base/gfx/base_image.h11
-rw-r--r--engines/wintermute/base/gfx/base_renderer.cpp20
-rw-r--r--engines/wintermute/base/gfx/base_renderer.h4
-rw-r--r--engines/wintermute/base/gfx/base_surface.cpp4
-rw-r--r--engines/wintermute/base/gfx/base_surface.h4
-rw-r--r--engines/wintermute/base/gfx/osystem/base_render_osystem.cpp27
-rw-r--r--engines/wintermute/base/gfx/osystem/base_render_osystem.h4
-rw-r--r--engines/wintermute/base/gfx/osystem/base_surface_osystem.cpp22
-rw-r--r--engines/wintermute/base/gfx/osystem/base_surface_osystem.h4
-rw-r--r--engines/wintermute/base/gfx/osystem/render_ticket.cpp8
-rw-r--r--engines/wintermute/base/gfx/osystem/render_ticket.h22
-rw-r--r--engines/wintermute/base/particles/part_emitter.cpp77
-rw-r--r--engines/wintermute/base/particles/part_emitter.h4
-rw-r--r--engines/wintermute/base/particles/part_force.cpp14
-rw-r--r--engines/wintermute/base/particles/part_force.h4
-rw-r--r--engines/wintermute/base/particles/part_particle.cpp40
-rw-r--r--engines/wintermute/base/particles/part_particle.h4
-rw-r--r--engines/wintermute/base/save_thumb_helper.cpp4
-rw-r--r--engines/wintermute/base/save_thumb_helper.h4
-rw-r--r--engines/wintermute/base/saveload.cpp5
-rw-r--r--engines/wintermute/base/saveload.h4
-rw-r--r--engines/wintermute/base/scriptables/dcscript.h4
-rw-r--r--engines/wintermute/base/scriptables/script.cpp41
-rw-r--r--engines/wintermute/base/scriptables/script.h4
-rw-r--r--engines/wintermute/base/scriptables/script_engine.cpp4
-rw-r--r--engines/wintermute/base/scriptables/script_engine.h4
-rw-r--r--engines/wintermute/base/scriptables/script_ext_array.cpp6
-rw-r--r--engines/wintermute/base/scriptables/script_ext_array.h4
-rw-r--r--engines/wintermute/base/scriptables/script_ext_date.cpp18
-rw-r--r--engines/wintermute/base/scriptables/script_ext_date.h4
-rw-r--r--engines/wintermute/base/scriptables/script_ext_file.cpp16
-rw-r--r--engines/wintermute/base/scriptables/script_ext_file.h4
-rw-r--r--engines/wintermute/base/scriptables/script_ext_math.cpp4
-rw-r--r--engines/wintermute/base/scriptables/script_ext_math.h4
-rw-r--r--engines/wintermute/base/scriptables/script_ext_mem_buffer.cpp6
-rw-r--r--engines/wintermute/base/scriptables/script_ext_mem_buffer.h4
-rw-r--r--engines/wintermute/base/scriptables/script_ext_object.cpp4
-rw-r--r--engines/wintermute/base/scriptables/script_ext_object.h4
-rw-r--r--engines/wintermute/base/scriptables/script_ext_string.cpp26
-rw-r--r--engines/wintermute/base/scriptables/script_ext_string.h4
-rw-r--r--engines/wintermute/base/scriptables/script_stack.cpp6
-rw-r--r--engines/wintermute/base/scriptables/script_stack.h4
-rw-r--r--engines/wintermute/base/scriptables/script_value.cpp26
-rw-r--r--engines/wintermute/base/scriptables/script_value.h4
-rw-r--r--engines/wintermute/base/sound/base_sound.cpp24
-rw-r--r--engines/wintermute/base/sound/base_sound.h4
-rw-r--r--engines/wintermute/base/sound/base_sound_buffer.cpp14
-rw-r--r--engines/wintermute/base/sound/base_sound_buffer.h5
-rw-r--r--engines/wintermute/base/sound/base_sound_manager.cpp4
-rw-r--r--engines/wintermute/base/sound/base_sound_manager.h4
-rw-r--r--engines/wintermute/base/timer.cpp10
-rw-r--r--engines/wintermute/base/timer.h4
-rw-r--r--engines/wintermute/coll_templ.h24
-rw-r--r--engines/wintermute/configure.engine3
-rw-r--r--engines/wintermute/dcgf.h4
-rw-r--r--engines/wintermute/dctypes.h7
-rw-r--r--engines/wintermute/debugger.cpp14
-rw-r--r--engines/wintermute/debugger.h4
-rw-r--r--engines/wintermute/detection.cpp13
-rw-r--r--engines/wintermute/detection_tables.h571
-rw-r--r--engines/wintermute/graphics/transform_struct.cpp76
-rw-r--r--engines/wintermute/graphics/transform_struct.h4
-rw-r--r--engines/wintermute/graphics/transform_tools.cpp4
-rw-r--r--engines/wintermute/graphics/transform_tools.h4
-rw-r--r--engines/wintermute/graphics/transparent_surface.cpp175
-rw-r--r--engines/wintermute/graphics/transparent_surface.h33
-rw-r--r--engines/wintermute/math/floatpoint.h4
-rw-r--r--engines/wintermute/math/math_util.cpp4
-rw-r--r--engines/wintermute/math/math_util.h4
-rw-r--r--engines/wintermute/math/matrix4.cpp4
-rw-r--r--engines/wintermute/math/matrix4.h4
-rw-r--r--engines/wintermute/math/rect32.h16
-rw-r--r--engines/wintermute/math/vector2.cpp4
-rw-r--r--engines/wintermute/math/vector2.h4
-rw-r--r--engines/wintermute/module.mk10
-rw-r--r--engines/wintermute/persistent.cpp4
-rw-r--r--engines/wintermute/persistent.h4
-rw-r--r--engines/wintermute/platform_osystem.cpp52
-rw-r--r--engines/wintermute/platform_osystem.h10
-rw-r--r--engines/wintermute/system/sys_class.cpp4
-rw-r--r--engines/wintermute/system/sys_class.h4
-rw-r--r--engines/wintermute/system/sys_class_registry.cpp4
-rw-r--r--engines/wintermute/system/sys_class_registry.h4
-rw-r--r--engines/wintermute/system/sys_instance.cpp4
-rw-r--r--engines/wintermute/system/sys_instance.h4
-rw-r--r--engines/wintermute/ui/ui_button.cpp18
-rw-r--r--engines/wintermute/ui/ui_button.h4
-rw-r--r--engines/wintermute/ui/ui_edit.cpp18
-rw-r--r--engines/wintermute/ui/ui_edit.h4
-rw-r--r--engines/wintermute/ui/ui_entity.cpp4
-rw-r--r--engines/wintermute/ui/ui_entity.h4
-rw-r--r--engines/wintermute/ui/ui_object.cpp31
-rw-r--r--engines/wintermute/ui/ui_object.h6
-rw-r--r--engines/wintermute/ui/ui_text.cpp8
-rw-r--r--engines/wintermute/ui/ui_text.h4
-rw-r--r--engines/wintermute/ui/ui_tiled_image.cpp94
-rw-r--r--engines/wintermute/ui/ui_tiled_image.h4
-rw-r--r--engines/wintermute/ui/ui_window.cpp42
-rw-r--r--engines/wintermute/ui/ui_window.h4
-rw-r--r--engines/wintermute/utils/path_util.cpp4
-rw-r--r--engines/wintermute/utils/path_util.h4
-rw-r--r--engines/wintermute/utils/string_util.cpp210
-rw-r--r--engines/wintermute/utils/string_util.h7
-rw-r--r--engines/wintermute/utils/utils.cpp4
-rw-r--r--engines/wintermute/utils/utils.h4
-rw-r--r--engines/wintermute/video/video_player.cpp4
-rw-r--r--engines/wintermute/video/video_player.h4
-rw-r--r--engines/wintermute/video/video_theora_player.cpp37
-rw-r--r--engines/wintermute/video/video_theora_player.h6
-rw-r--r--engines/wintermute/wintermute.cpp15
-rw-r--r--engines/wintermute/wintermute.h4
-rw-r--r--engines/wintermute/wintypes.h4
-rw-r--r--engines/zvision/animation/rlf_animation.cpp (renamed from engines/zvision/rlf_animation.cpp)0
-rw-r--r--engines/zvision/animation/rlf_animation.h (renamed from engines/zvision/rlf_animation.h)4
-rw-r--r--engines/zvision/archives/zfs_archive.cpp (renamed from engines/zvision/zfs_archive.cpp)6
-rw-r--r--engines/zvision/archives/zfs_archive.h (renamed from engines/zvision/zfs_archive.h)4
-rw-r--r--engines/zvision/configure.engine3
-rw-r--r--engines/zvision/core/console.cpp (renamed from engines/zvision/console.cpp)0
-rw-r--r--engines/zvision/core/console.h55
-rw-r--r--engines/zvision/core/events.cpp (renamed from engines/zvision/events.cpp)0
-rw-r--r--engines/zvision/core/menu.h (renamed from engines/zvision/menu.h)4
-rw-r--r--engines/zvision/core/save_manager.cpp (renamed from engines/zvision/save_manager.cpp)10
-rw-r--r--engines/zvision/core/save_manager.h (renamed from engines/zvision/save_manager.h)4
-rw-r--r--engines/zvision/cursors/cursor.cpp (renamed from engines/zvision/cursor.cpp)0
-rw-r--r--engines/zvision/cursors/cursor.h (renamed from engines/zvision/cursor.h)4
-rw-r--r--engines/zvision/cursors/cursor_manager.cpp (renamed from engines/zvision/cursor_manager.cpp)0
-rw-r--r--engines/zvision/cursors/cursor_manager.h (renamed from engines/zvision/cursor_manager.h)0
-rw-r--r--engines/zvision/detection.cpp5
-rw-r--r--engines/zvision/detection.h40
-rw-r--r--engines/zvision/fonts/truetype_font.cpp (renamed from engines/zvision/truetype_font.cpp)0
-rw-r--r--engines/zvision/fonts/truetype_font.h (renamed from engines/zvision/truetype_font.h)10
-rw-r--r--engines/zvision/graphics/render_manager.cpp (renamed from engines/zvision/render_manager.cpp)0
-rw-r--r--engines/zvision/graphics/render_manager.h (renamed from engines/zvision/render_manager.h)0
-rw-r--r--engines/zvision/graphics/render_table.cpp (renamed from engines/zvision/render_table.cpp)42
-rw-r--r--engines/zvision/graphics/render_table.h (renamed from engines/zvision/render_table.h)4
-rw-r--r--engines/zvision/scripting/actions.cpp (renamed from engines/zvision/actions.cpp)0
-rw-r--r--engines/zvision/scripting/actions.h (renamed from engines/zvision/actions.h)4
-rw-r--r--engines/zvision/scripting/control.cpp (renamed from engines/zvision/control.cpp)10
-rw-r--r--engines/zvision/scripting/control.h (renamed from engines/zvision/control.h)0
-rw-r--r--engines/zvision/scripting/controls/input_control.cpp (renamed from engines/zvision/input_control.cpp)0
-rw-r--r--engines/zvision/scripting/controls/input_control.h (renamed from engines/zvision/input_control.h)8
-rw-r--r--engines/zvision/scripting/controls/lever_control.cpp (renamed from engines/zvision/lever_control.cpp)0
-rw-r--r--engines/zvision/scripting/controls/lever_control.h (renamed from engines/zvision/lever_control.h)6
-rw-r--r--engines/zvision/scripting/controls/push_toggle_control.cpp (renamed from engines/zvision/push_toggle_control.cpp)12
-rw-r--r--engines/zvision/scripting/controls/push_toggle_control.h (renamed from engines/zvision/push_toggle_control.h)6
-rw-r--r--engines/zvision/scripting/controls/timer_node.cpp (renamed from engines/zvision/timer_node.cpp)0
-rw-r--r--engines/zvision/scripting/controls/timer_node.h (renamed from engines/zvision/timer_node.h)0
-rw-r--r--engines/zvision/scripting/puzzle.h (renamed from engines/zvision/puzzle.h)0
-rw-r--r--engines/zvision/scripting/scr_file_handling.cpp (renamed from engines/zvision/scr_file_handling.cpp)0
-rw-r--r--engines/zvision/scripting/script_manager.cpp (renamed from engines/zvision/script_manager.cpp)0
-rw-r--r--engines/zvision/scripting/script_manager.h (renamed from engines/zvision/script_manager.h)0
-rw-r--r--engines/zvision/sound/zork_raw.cpp (renamed from engines/zvision/zork_raw.cpp)0
-rw-r--r--engines/zvision/sound/zork_raw.h (renamed from engines/zvision/zork_raw.h)0
-rw-r--r--engines/zvision/strings/string_manager.cpp (renamed from engines/zvision/string_manager.cpp)8
-rw-r--r--engines/zvision/strings/string_manager.h (renamed from engines/zvision/string_manager.h)7
-rw-r--r--engines/zvision/subtitles/subtitles.h (renamed from engines/zvision/subtitles.h)5
-rw-r--r--engines/zvision/utility/clock.cpp (renamed from engines/zvision/clock.cpp)7
-rw-r--r--engines/zvision/utility/clock.h (renamed from engines/zvision/clock.h)5
-rw-r--r--engines/zvision/utility/lzss_read_stream.cpp (renamed from engines/zvision/lzss_read_stream.cpp)42
-rw-r--r--engines/zvision/utility/lzss_read_stream.h (renamed from engines/zvision/lzss_read_stream.h)40
-rw-r--r--engines/zvision/utility/single_value_container.cpp (renamed from engines/zvision/single_value_container.cpp)6
-rw-r--r--engines/zvision/utility/single_value_container.h (renamed from engines/zvision/single_value_container.h)4
-rw-r--r--engines/zvision/utility/utility.cpp (renamed from engines/zvision/utility.cpp)8
-rw-r--r--engines/zvision/utility/utility.h (renamed from engines/zvision/utility.h)5
-rw-r--r--engines/zvision/video/video.cpp (renamed from engines/zvision/video.cpp)0
-rw-r--r--engines/zvision/video/zork_avi_decoder.cpp (renamed from engines/zvision/zork_avi_decoder.cpp)9
-rw-r--r--engines/zvision/video/zork_avi_decoder.h (renamed from engines/zvision/zork_avi_decoder.h)0
-rw-r--r--graphics/VectorRendererSpec.cpp43
-rw-r--r--graphics/colormasks.h4
-rw-r--r--graphics/conversion.cpp1
-rw-r--r--graphics/conversion.h4
-rw-r--r--graphics/cursor.h4
-rw-r--r--graphics/cursorman.cpp1
-rw-r--r--graphics/cursorman.h1
-rw-r--r--graphics/font.cpp218
-rw-r--r--graphics/font.h11
-rw-r--r--graphics/fontman.cpp1
-rw-r--r--graphics/fontman.h1
-rw-r--r--graphics/fonts/bdf.cpp9
-rw-r--r--graphics/fonts/bdf.h7
-rw-r--r--graphics/fonts/ttf.cpp114
-rw-r--r--graphics/fonts/ttf.h41
-rw-r--r--graphics/fonts/winfont.cpp7
-rw-r--r--graphics/fonts/winfont.h7
-rw-r--r--graphics/maccursor.cpp4
-rw-r--r--graphics/maccursor.h4
-rw-r--r--graphics/module.mk9
-rw-r--r--graphics/palette.h4
-rw-r--r--graphics/pixelformat.h4
-rw-r--r--graphics/primitives.cpp1
-rw-r--r--graphics/primitives.h1
-rw-r--r--graphics/scaler.cpp4
-rw-r--r--graphics/scaler.h1
-rw-r--r--graphics/scaler/2xsai.cpp4
-rw-r--r--graphics/scaler/Normal2xARM.s2
-rw-r--r--graphics/scaler/aspect.cpp4
-rw-r--r--graphics/scaler/aspect.h1
-rw-r--r--graphics/scaler/downscaler.cpp4
-rw-r--r--graphics/scaler/downscaler.h4
-rw-r--r--graphics/scaler/downscalerARM.s1
-rw-r--r--graphics/scaler/hq2x.cpp4
-rw-r--r--graphics/scaler/hq3x.cpp4
-rw-r--r--graphics/scaler/intern.h4
-rw-r--r--graphics/scaler/scale2xARM.s3
-rw-r--r--graphics/scaler/thumbnail_intern.cpp4
-rw-r--r--graphics/sjis.cpp21
-rw-r--r--graphics/sjis.h1
-rw-r--r--graphics/surface.cpp1
-rw-r--r--graphics/surface.h5
-rw-r--r--graphics/thumbnail.cpp1
-rw-r--r--graphics/thumbnail.h1
-rw-r--r--graphics/wincursor.cpp4
-rw-r--r--graphics/wincursor.h4
-rw-r--r--gui/Actions.cpp4
-rw-r--r--gui/Actions.h4
-rw-r--r--gui/EventRecorder.cpp4
-rw-r--r--gui/EventRecorder.h4
-rw-r--r--gui/Key.cpp4
-rw-r--r--gui/Key.h4
-rw-r--r--gui/KeysDialog.cpp4
-rw-r--r--gui/KeysDialog.h4
-rw-r--r--gui/ThemeEngine.cpp17
-rw-r--r--gui/Tooltip.cpp1
-rw-r--r--gui/Tooltip.h1
-rw-r--r--gui/about.cpp3
-rw-r--r--gui/about.h1
-rw-r--r--gui/browser.cpp1
-rw-r--r--gui/browser.h1
-rw-r--r--gui/chooser.cpp1
-rw-r--r--gui/chooser.h1
-rw-r--r--gui/console.cpp24
-rw-r--r--gui/console.h7
-rw-r--r--gui/credits.h37
-rw-r--r--gui/debugger.cpp195
-rw-r--r--gui/debugger.h56
-rw-r--r--gui/dialog.cpp14
-rw-r--r--gui/dialog.h1
-rw-r--r--gui/editrecorddialog.cpp4
-rw-r--r--gui/editrecorddialog.h4
-rw-r--r--gui/error.cpp4
-rw-r--r--gui/error.h4
-rw-r--r--gui/fluidsynth-dialog.cpp1
-rw-r--r--gui/fluidsynth-dialog.h1
-rw-r--r--gui/gui-manager.cpp14
-rw-r--r--gui/gui-manager.h1
-rw-r--r--gui/launcher.cpp1
-rw-r--r--gui/launcher.h1
-rw-r--r--gui/massadd.cpp1
-rw-r--r--gui/massadd.h1
-rw-r--r--gui/message.cpp1
-rw-r--r--gui/message.h1
-rw-r--r--gui/object.cpp1
-rw-r--r--gui/object.h1
-rw-r--r--gui/onscreendialog.cpp4
-rw-r--r--gui/onscreendialog.h4
-rw-r--r--gui/options.cpp1
-rw-r--r--gui/options.h1
-rw-r--r--gui/predictivedialog.cpp7
-rw-r--r--gui/predictivedialog.h1
-rw-r--r--gui/recorderdialog.cpp1
-rw-r--r--gui/recorderdialog.h1
-rw-r--r--gui/saveload-dialog.cpp1
-rw-r--r--gui/saveload-dialog.h1
-rw-r--r--gui/saveload.cpp1
-rw-r--r--gui/saveload.h1
-rw-r--r--gui/themebrowser.cpp1
-rw-r--r--gui/themebrowser.h1
-rw-r--r--gui/themes/default.inc9
-rw-r--r--gui/themes/scummclassic.zipbin113348 -> 110107 bytes
-rw-r--r--gui/themes/scummclassic/classic_layout_lowres.stx77
-rwxr-xr-xgui/themes/scummtheme.py8
-rw-r--r--gui/themes/translations.datbin441486 -> 430660 bytes
-rw-r--r--gui/widget.cpp1
-rw-r--r--gui/widget.h1
-rw-r--r--gui/widgets/editable.cpp37
-rw-r--r--gui/widgets/editable.h6
-rw-r--r--gui/widgets/edittext.cpp3
-rw-r--r--gui/widgets/edittext.h1
-rw-r--r--gui/widgets/list.cpp3
-rw-r--r--gui/widgets/list.h1
-rw-r--r--gui/widgets/popup.cpp1
-rw-r--r--gui/widgets/popup.h1
-rw-r--r--gui/widgets/scrollbar.cpp1
-rw-r--r--gui/widgets/scrollbar.h1
-rw-r--r--gui/widgets/tab.cpp30
-rw-r--r--gui/widgets/tab.h8
-rw-r--r--image/bmp.cpp (renamed from graphics/decoders/bmp.cpp)103
-rw-r--r--image/bmp.h (renamed from graphics/decoders/bmp.h)23
-rw-r--r--image/codecs/bmp_raw.cpp113
-rw-r--r--image/codecs/bmp_raw.h51
-rw-r--r--image/codecs/cdtoons.cpp (renamed from video/codecs/cdtoons.cpp)120
-rw-r--r--image/codecs/cdtoons.h (renamed from video/codecs/cdtoons.h)19
-rw-r--r--image/codecs/cinepak.cpp (renamed from video/codecs/cinepak.cpp)106
-rw-r--r--image/codecs/cinepak.h (renamed from video/codecs/cinepak.h)24
-rw-r--r--image/codecs/codec.cpp117
-rw-r--r--image/codecs/codec.h (renamed from video/codecs/codec.h)41
-rw-r--r--image/codecs/indeo3.cpp (renamed from video/codecs/indeo3.cpp)62
-rw-r--r--image/codecs/indeo3.h (renamed from video/codecs/indeo3.h)21
-rw-r--r--image/codecs/mjpeg.cpp217
-rw-r--r--image/codecs/mjpeg.h (renamed from video/codecs/mjpeg.h)25
-rw-r--r--image/codecs/mpeg.cpp (renamed from video/codecs/mpeg.cpp)16
-rw-r--r--image/codecs/mpeg.h (renamed from video/codecs/mpeg.h)29
-rw-r--r--image/codecs/msrle.cpp (renamed from video/codecs/msrle.cpp)30
-rw-r--r--image/codecs/msrle.h (renamed from video/codecs/msrle.h)21
-rw-r--r--image/codecs/msvideo1.cpp (renamed from video/codecs/msvideo1.cpp)28
-rw-r--r--image/codecs/msvideo1.h (renamed from video/codecs/msvideo1.h)23
-rw-r--r--image/codecs/qtrle.cpp (renamed from video/codecs/qtrle.cpp)126
-rw-r--r--image/codecs/qtrle.h (renamed from video/codecs/qtrle.h)31
-rw-r--r--image/codecs/rpza.cpp (renamed from video/codecs/rpza.cpp)42
-rw-r--r--image/codecs/rpza.h (renamed from video/codecs/rpza.h)19
-rw-r--r--image/codecs/smc.cpp (renamed from video/codecs/smc.cpp)48
-rw-r--r--image/codecs/smc.h (renamed from video/codecs/smc.h)19
-rw-r--r--image/codecs/svq1.cpp (renamed from video/codecs/svq1.cpp)18
-rw-r--r--image/codecs/svq1.h (renamed from video/codecs/svq1.h)19
-rw-r--r--image/codecs/svq1_cb.h (renamed from video/codecs/svq1_cb.h)12
-rw-r--r--image/codecs/svq1_vlc.h (renamed from video/codecs/svq1_vlc.h)12
-rw-r--r--image/codecs/truemotion1.cpp (renamed from video/codecs/truemotion1.cpp)74
-rw-r--r--image/codecs/truemotion1.h (renamed from video/codecs/truemotion1.h)26
-rw-r--r--image/codecs/truemotion1data.h (renamed from video/codecs/truemotion1data.h)12
-rw-r--r--image/iff.cpp (renamed from graphics/decoders/iff.cpp)15
-rw-r--r--image/iff.h (renamed from graphics/decoders/iff.h)25
-rw-r--r--image/image_decoder.h (renamed from graphics/decoders/image_decoder.h)24
-rw-r--r--image/jpeg.cpp (renamed from graphics/decoders/jpeg.cpp)25
-rw-r--r--image/jpeg.h (renamed from graphics/decoders/jpeg.h)27
-rw-r--r--image/module.mk31
-rw-r--r--image/pcx.cpp (renamed from graphics/decoders/pcx.cpp)9
-rw-r--r--image/pcx.h (renamed from graphics/decoders/pcx.h)18
-rw-r--r--image/pict.cpp (renamed from graphics/decoders/pict.cpp)52
-rw-r--r--image/pict.h (renamed from graphics/decoders/pict.h)19
-rw-r--r--image/png.cpp (renamed from graphics/decoders/png.cpp)20
-rw-r--r--image/png.h (renamed from graphics/decoders/png.h)19
-rw-r--r--image/tga.cpp (renamed from graphics/decoders/tga.cpp)25
-rw-r--r--image/tga.h (renamed from graphics/decoders/tga.h)20
-rw-r--r--po/be_BY.po2850
-rw-r--r--po/ca_ES.po2846
-rw-r--r--po/cs_CZ.po2856
-rw-r--r--po/da_DA.po2845
-rw-r--r--po/de_DE.po2874
-rw-r--r--po/es_ES.po2853
-rw-r--r--po/eu.po2859
-rw-r--r--po/fi_FI.po2851
-rw-r--r--po/fr_FR.po2864
-rw-r--r--po/gl_ES.po2850
-rw-r--r--po/hu_HU.po2845
-rw-r--r--po/it_IT.po2851
-rw-r--r--po/nb_NO.po2847
-rw-r--r--po/nn_NO.po2828
-rw-r--r--po/pl_PL.po2841
-rw-r--r--po/pt_BR.po2889
-rw-r--r--po/ru_RU.po2846
-rw-r--r--po/scummvm.pot2477
-rw-r--r--po/se_SE.po2847
-rw-r--r--po/uk_UA.po2847
-rw-r--r--ports.mk25
-rw-r--r--test/common/util.h10
-rw-r--r--test/cxxtest_mingw.h2
-rw-r--r--video/avi_decoder.cpp244
-rw-r--r--video/avi_decoder.h35
-rw-r--r--video/bink_decoder.cpp14
-rw-r--r--video/bink_decoder.h6
-rw-r--r--video/binkdata.h4
-rw-r--r--video/coktel_decoder.cpp11
-rw-r--r--video/coktel_decoder.h12
-rw-r--r--video/dxa_decoder.cpp4
-rw-r--r--video/dxa_decoder.h4
-rw-r--r--video/flic_decoder.cpp6
-rw-r--r--video/flic_decoder.h4
-rw-r--r--video/module.mk18
-rw-r--r--video/psx_decoder.cpp4
-rw-r--r--video/psx_decoder.h4
-rw-r--r--video/qt_decoder.cpp51
-rw-r--r--video/qt_decoder.h12
-rw-r--r--video/smk_decoder.cpp44
-rw-r--r--video/smk_decoder.h6
-rw-r--r--video/theora_decoder.cpp4
-rw-r--r--video/theora_decoder.h4
-rw-r--r--video/video_decoder.cpp64
-rw-r--r--video/video_decoder.h48
4226 files changed, 251550 insertions, 79187 deletions
diff --git a/.gitignore b/.gitignore
index 0fe212098c..17012f3bb7 100644
--- a/.gitignore
+++ b/.gitignore
@@ -105,6 +105,9 @@ project.xcworkspace
/plugins
+/engines/plugins_table.h
+/engines/engines.mk
+
/test/runner
/test/runner.cpp
/test/*.dSYM
@@ -171,6 +174,9 @@ ipch/
LLVM32/
LLVM64/
+#Ignore gettext generated files
+/messages.mo
+
#Ignore Qt Creator project files
ScummVM.config
ScummVM.creator
@@ -182,3 +188,7 @@ ScummVM.includes
#Ignore Mac DS_Store files
.DS_Store
+
+#Ignore MS Visual C++ temporary files/subdirectories (except create_project.bat)
+dists/msvc*/**
+!dists/msvc*/create_project.bat
diff --git a/AUTHORS b/AUTHORS
index d22c69e7e8..da077dbbaa 100644
--- a/AUTHORS
+++ b/AUTHORS
@@ -6,9 +6,9 @@ ScummVM Team
PR Office
---------
- Arnaud Boutonne - Public Relations Officer, Project
- Administrator
- Eugene Sandulenko - Project Leader
+ Arnaud Boutonne - Public Relations Officer, Project
+ Administrator
+ Eugene Sandulenko - Project Leader
Core Team
---------
@@ -19,30 +19,30 @@ ScummVM Team
Retired Project Leaders
-----------------------
James Brown
- Vincent Hamm - ScummVM co-founder, Original Cruise/CinE
- author
+ Vincent Hamm - ScummVM co-founder, Original Cruise/CinE
+ author
Max Horn
- Ludvig Strigeus - Original ScummVM and SimonVM author
+ Ludvig Strigeus - Original ScummVM and SimonVM author
Engine Teams
------------
SCUMM:
Torbjorn Andersson
- James Brown - (retired)
- Jonathan Gray - (retired)
- Vincent Hamm - (retired)
- Max Horn - (retired)
+ James Brown - (retired)
+ Jonathan Gray - (retired)
+ Vincent Hamm - (retired)
+ Max Horn - (retired)
Travis Howell
- Pawel Kolodziejski - Codecs, iMUSE, Smush, etc.
- Gregory Montoir - (retired)
- Eugene Sandulenko - FT INSANE, MM NES, MM C64, game detection,
- Herc/CGA
- Ludvig Strigeus - (retired)
+ Pawel Kolodziejski - Codecs, iMUSE, Smush, etc.
+ Gregory Montoir - (retired)
+ Eugene Sandulenko - FT INSANE, MM NES, MM C64, game
+ detection, Herc/CGA
+ Ludvig Strigeus - (retired)
HE:
- Jonathan Gray - (retired)
+ Jonathan Gray - (retired)
Travis Howell
- Gregory Montoir - (retired)
+ Gregory Montoir - (retired)
Eugene Sandulenko
AGI:
@@ -50,19 +50,19 @@ ScummVM Team
Matthew Hoops
Filippos Karapetis
Pawel Kolodziejski
- Walter van Niftrik - (retired)
+ Walter van Niftrik - (retired)
Kari Salminen
Eugene Sandulenko
- David Symonds - (retired)
+ David Symonds - (retired)
AGOS:
Torbjorn Andersson
Paul Gilbert
Travis Howell
- Oliver Kiehl - (retired)
- Ludvig Strigeus - (retired)
+ Oliver Kiehl - (retired)
+ Ludvig Strigeus - (retired)
- AVALANCHE:
+ Avalanche:
Peter Bozso
Arnaud Boutonne
@@ -71,9 +71,9 @@ ScummVM Team
Paul Gilbert
Cine:
- Vincent Hamm - (retired)
+ Vincent Hamm - (retired)
Pawel Kolodziejski
- Gregory Montoir - (retired)
+ Gregory Montoir - (retired)
Kari Salminen
Eugene Sandulenko
@@ -82,7 +82,7 @@ ScummVM Team
CruisE:
Paul Gilbert
- Vincent Hamm - (retired)
+ Vincent Hamm - (retired)
Draci:
Denis Kasak
@@ -96,7 +96,7 @@ ScummVM Team
Torbjorn Andersson
Bertrand Augereau
Filippos Karapetis
- Vladimir Menshakov - (retired)
+ Vladimir Menshakov - (retired)
Willem Jan Palenstijn
Gob:
@@ -120,10 +120,10 @@ ScummVM Team
Eugene Sandulenko
Kyra:
- Torbjorn Andersson - VQA Player
+ Torbjorn Andersson - VQA Player
Oystein Eftevaag
Florian Kagerer
- Gregory Montoir - (retired)
+ Gregory Montoir - (retired)
Johannes Schickel
Lastexpress:
@@ -138,6 +138,11 @@ ScummVM Team
Benjamin Haisch
Filippos Karapetis
+ MADS:
+ Arnaud Boutonne
+ Paul Gilbert
+ Filippos Karapetis
+
Mohawk:
Bastien Bouclet
Matthew Hoops
@@ -161,14 +166,14 @@ ScummVM Team
Matthew Hoops
Queen:
- David Eriksson - (retired)
- Gregory Montoir - (retired)
+ David Eriksson - (retired)
+ Gregory Montoir - (retired)
Joost Peters
SAGA:
Torbjorn Andersson
- Daniel Balsom - Original engine reimplementation author
- (retired)
+ Daniel Balsom - Original engine reimplementation author
+ (retired)
Filippos Karapetis
Andrew Kurushin
Eugene Sandulenko
@@ -176,46 +181,46 @@ ScummVM Team
SCI:
Greg Frieger
Paul Gilbert
- Max Horn - (retired)
+ Max Horn - (retired)
Filippos Karapetis
Martin Kiewitz
- Walter van Niftrik - (retired)
+ Walter van Niftrik - (retired)
Willem Jan Palenstijn
Jordi Vilalta Prat
Lars Skovlund
Sky:
- Robert Goeffringmann - (retired)
- Oliver Kiehl - (retired)
+ Robert Goeffringmann - (retired)
+ Oliver Kiehl - (retired)
Joost Peters
Sword1:
- Fabio Battaglia - PSX version support
- Thierry Crozat - Mac version support
- Robert Goeffringmann - (retired)
+ Fabio Battaglia - PSX version support
+ Thierry Crozat - Mac version support
+ Robert Goeffringmann - (retired)
Sword2:
Torbjorn Andersson
- Fabio Battaglia - PSX version support
- Jonathan Gray - (retired)
+ Fabio Battaglia - PSX version support
+ Jonathan Gray - (retired)
Sword25:
Torbjorn Andersson
Paul Gilbert
- Max Horn - (retired)
+ Max Horn - (retired)
Filippos Karapetis
Eugene Sandulenko
TeenAgent:
- Robert Megone - Help with callback rewriting
- Vladimir Menshakov - (retired)
+ Robert Megone - Help with callback rewriting
+ Vladimir Menshakov - (retired)
Tinsel:
Torbjorn Andersson
- Fabio Battaglia - PSX version support
+ Fabio Battaglia - PSX version support
Paul Gilbert
Sven Hesse
- Max Horn - (retired)
+ Max Horn - (retired)
Filippos Karapetis
Joost Peters
@@ -232,14 +237,18 @@ ScummVM Team
Sylvain Dupont
Touche:
- Gregory Montoir - (retired)
+ Gregory Montoir - (retired)
TsAGE:
Arnaud Boutonne
Paul Gilbert
Tucker:
- Gregory Montoir - (retired)
+ Gregory Montoir - (retired)
+
+ Voyeur:
+ Arnaud Boutonne
+ Paul Gilbert
Wintermute:
Einar Johan T. Somaaen
@@ -266,26 +275,26 @@ ScummVM Team
Lubomyr Lisen
Maemo:
- Frantisek Dufka - (retired)
+ Frantisek Dufka - (retired)
Tarek Soliman
Nintendo 64:
Fabio Battaglia
Nintendo DS:
- Bertrand Augereau - HQ software scaler
+ Bertrand Augereau - HQ software scaler
Neil Millstone
OpenPandora:
John Willis
PocketPC / WinCE:
- Nicolas Bacca - (retired)
+ Nicolas Bacca - (retired)
Ismail Khatib
- Kostas Nakos - (retired)
+ Kostas Nakos - (retired)
PlayStation 2:
- Robert Goeffringmann - (retired)
+ Robert Goeffringmann - (retired)
Max Lingua
PSP (PlayStation Portable):
@@ -293,8 +302,8 @@ ScummVM Team
Joost Peters
SDL (Win/Linux/OS X/etc.):
- Max Horn - (retired)
- Eugene Sandulenko - Asm routines, GFX layers
+ Max Horn - (retired)
+ Eugene Sandulenko - Asm routines, GFX layers
SymbianOS:
Jurgen Braam
@@ -312,9 +321,9 @@ ScummVM Team
Other subsystems
----------------
Infrastructure:
- Max Horn - Backend & Engine APIs, file API, sound
- mixer, audiostreams, data structures, etc.
- (retired)
+ Max Horn - Backend & Engine APIs, file API, sound
+ mixer, audiostreams, data structures,
+ etc. (retired)
Eugene Sandulenko
Johannes Schickel
@@ -324,33 +333,35 @@ ScummVM Team
Johannes Schickel
Miscellaneous:
- David Corrales-Lopez - Filesystem access improvements (GSoC 2007
- task) (retired)
- Jerome Fisher - MT-32 emulator
- Benjamin Haisch - Heavily improved de-/encoder for DXA videos
- Jochen Hoenicke - Speaker & PCjr sound support, AdLib work
- (retired)
- Daniel ter Laan - Restoring original Drascula tracks, and
- writing convert_dxa.bat
- Chris Page - Return to launcher, savestate improvements,
- leak fixes, ... (GSoC 2008 task) (retired)
- Robin Watts - ARM assembly routines for nice speedups on
- several ports; improvements to the sound
- mixer
+ David Corrales-Lopez - Filesystem access improvements (GSoC
+ 2007 task) (retired)
+ Jerome Fisher - MT-32 emulator
+ Benjamin Haisch - Heavily improved de-/encoder for DXA
+ videos
+ Jochen Hoenicke - Speaker & PCjr sound support, AdLib
+ work (retired)
+ Daniel ter Laan - Restoring original Drascula tracks, and
+ writing convert_dxa.bat
+ Chris Page - Return to launcher, savestate
+ improvements, leak fixes, ... (GSoC
+ 2008 task) (retired)
+ Robin Watts - ARM assembly routines for nice speedups
+ on several ports; improvements to the
+ sound mixer
Website (code)
--------------
- Fredrik Wendel - (retired)
+ Fredrik Wendel - (retired)
Website (maintenance)
---------------------
- James Brown - IRC Logs maintainer
- Thierry Crozat - Wiki maintainer
- Andre Heider - Buildbot maintainer
- Joost Peters - Doxygen Project Documentation maintainer
- Jordi Vilalta Prat - Wiki maintainer
- Eugene Sandulenko - Forum, IRC channel, Screen Shots and Mailing
- list maintainer
+ James Brown - IRC Logs maintainer
+ Thierry Crozat - Wiki maintainer
+ Andre Heider - Buildbot maintainer
+ Joost Peters - Doxygen Project Documentation maintainer
+ Jordi Vilalta Prat - Wiki maintainer
+ Eugene Sandulenko - Forum, IRC channel, Screen Shots and
+ Mailing list maintainer
John Willis
Website (content)
@@ -359,31 +370,31 @@ ScummVM Team
Documentation
-------------
- Thierry Crozat - Numerous contributions to documentation
- Joachim Eberhard - Numerous contributions to documentation
- (retired)
- Matthew Hoops - Wiki editor
+ Thierry Crozat - Numerous contributions to documentation
+ Joachim Eberhard - Numerous contributions to documentation
+ (retired)
+ Matthew Hoops - Wiki editor
Retired Team Members
--------------------
- Chris Apers - Former PalmOS porter
- Ralph Brorsen - Help with GUI implementation
- Jamieson Christian - iMUSE, MIDI, all things musical
- Felix Jakschitsch - Zak256 reverse engineering
- Mutwin Kraus - Original MacOS porter
- Peter Moraliyski - Port: GP32
- Jeremy Newman - Former webmaster
- Lionel Ulmer - Port: X11
- Won Star - Former GP32 porter
+ Chris Apers - Former PalmOS porter
+ Ralph Brorsen - Help with GUI implementation
+ Jamieson Christian - iMUSE, MIDI, all things musical
+ Felix Jakschitsch - Zak256 reverse engineering
+ Mutwin Kraus - Original MacOS porter
+ Peter Moraliyski - Port: GP32
+ Jeremy Newman - Former webmaster
+ Lionel Ulmer - Port: X11
+ Won Star - Former GP32 porter
Other contributions
*******************
Packages
--------
AmigaOS 4:
- Hans-Joerg Frieden - (retired)
+ Hans-Joerg Frieden - (retired)
Hubert Maier
- Juha Niemimaki - (retired)
+ Juha Niemimaki - (retired)
Atari/FreeMiNT:
Keith Scroggins
@@ -393,22 +404,22 @@ Other contributions
Luc Schrijvers
Debian GNU/Linux:
- Tore Anderson - (retired)
+ Tore Anderson - (retired)
David Weinehall
Fedora / RedHat:
Willem Jan Palenstijn
Mac OS X:
- Max Horn - (retired)
+ Max Horn - (retired)
Oystein Eftevaag
Mandriva:
- Dominik Scherer - (retired)
+ Dominik Scherer - (retired)
MorphOS:
Fabien Coeurjoly
- Ruediger Hanke - (retired)
+ Ruediger Hanke - (retired)
OS/2:
Paul Smedley
@@ -426,12 +437,12 @@ Other contributions
Travis Howell
Win64:
- Chris Gray - (retired)
+ Chris Gray - (retired)
Johannes Schickel
- Translations
- ------------
- Thierry Crozat - Translation Lead
+ GUI Translations
+ ----------------
+ Thierry Crozat - Translation Lead
Basque:
Mikel Iturbe Urretxa
@@ -459,7 +470,7 @@ Other contributions
German:
Simon Sawatzki
- Lothar Serra Mari - (retired)
+ Lothar Serra Mari - (retired)
Hungarian:
Alex Bevilacqua
@@ -493,98 +504,118 @@ Other contributions
Ukrainian:
Lubomyr Lisen
+ Game Translations
+ -----------------
+ CGE:
+ Dan Serban - Soltys English translation
+ Victor Gonzalez - Soltys Spanish translation
+ Alejandro Gomez de la Munoza - Soltys Spanish translation
+
+ Drascula:
+ Thierry Crozat - Improve French translation
+
+ Mortevielle:
+ Hugo Labrande - Improve English translation
+ Thierry Crozat - Improve English translation
+
Websites (design)
-----------------
- Dobo Balazs - Website design
- William Claydon - Skins for doxygen, buildbot and wiki
- Yaroslav Fedevych - HTML/CSS for the website
- Jean Marc Gimenez - ScummVM logo
- David Jensen - SVG logo conversion
- Raina - ScummVM forum buttons
+ Dobo Balazs - Website design
+ William Claydon - Skins for doxygen, buildbot and wiki
+ Yaroslav Fedevych - HTML/CSS for the website
+ Jean Marc Gimenez - ScummVM logo
+ David Jensen - SVG logo conversion
+ Raina - ScummVM forum buttons
Code contributions
------------------
- Ori Avtalion - Subtitle control options in the GUI; BASS GUI
- fixes
- Stuart Caie - Decoders for Amiga and AtariST data files
- (AGOS engine)
- Paolo Costabel - PSP port contributions
- Martin Doucha - CinE engine objectification
- Thomas Fach-Pedersen - ProTracker module player, Smacker video
- decoder
- Tobias Gunkel - Sound support for C64 version of MM/Zak, Loom
- PCE support
- Janne Huttunen - V3 actor mask support, Dig/FT SMUSH audio
- Kovacs Endre Janos - Several fixes for Simon1
- Jeroen Janssen - Numerous readability and bugfix patches
- Keith Kaisershot - Several Pegasus Prime patches
- Andreas Karlsson - Initial port for SymbianOS
- Claudio Matsuoka - Daily Linux builds
- Thomas Mayer - PSP port contributions
- Sean Murray - ScummVM tools GUI application (GSoC 2007 task)
- n0p - Windows CE port aspect ratio correction scaler
- and right click input method
- Mikesch Nepomuk - MI1 VGA floppy patches
- Nicolas Noble - Config file and ALSA support
- Tim Phillips - Initial MI1 CD music support
- Quietust - Sound support for Amiga SCUMM V2/V3 games, MM
- NES support
- 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
- support
- Andre Souza - SDL-based OpenGL renderer
- Tom Frost - WebOS port contributions
+ Ori Avtalion - Subtitle control options in the GUI; BASS
+ GUI fixes
+ Stuart Caie - Decoders for Amiga and AtariST data files
+ (AGOS engine)
+ Paolo Costabel - PSP port contributions
+ Martin Doucha - CinE engine objectification
+ Thomas Fach-Pedersen - ProTracker module player, Smacker video
+ decoder
+ Tobias Gunkel - Sound support for C64 version of MM/Zak,
+ Loom PCE support
+ Janne Huttunen - V3 actor mask support, Dig/FT SMUSH audio
+ Kovacs Endre Janos - Several fixes for Simon1
+ Jeroen Janssen - Numerous readability and bugfix patches
+ Keith Kaisershot - Several Pegasus Prime patches
+ Andreas Karlsson - Initial port for SymbianOS
+ Claudio Matsuoka - Daily Linux builds
+ Thomas Mayer - PSP port contributions
+ Sean Murray - ScummVM tools GUI application (GSoC 2007
+ task)
+ n0p - Windows CE port aspect ratio correction
+ scaler and right click input method
+ Mikesch Nepomuk - MI1 VGA floppy patches
+ Nicolas Noble - Config file and ALSA support
+ Tim Phillips - Initial MI1 CD music support
+ Quietust - Sound support for Amiga SCUMM V2/V3
+ games, MM NES support
+ 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 support
+ Andre Souza - SDL-based OpenGL renderer
+ Tom Frost - WebOS port contributions
FreeSCI Contributors
--------------------
- Francois-R Boyer - MT-32 information and mapping code
- Rainer Canavan - IRIX MIDI driver and bug fixes
+ 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
- Christopher T. Lansdown - 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)
- 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
- Lars Skovlund - Project maintenance, most documentation,
- bugfixes, SCI1 support
- Rink Springer - Port to the DOS platform, several bug fixes
- Rainer De Temple - SCI research
+ 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
+ Christopher T. Lansdown - 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)
+ 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
+ Lars Skovlund - Project maintenance, most documentation,
+ bugfixes, SCI1 support
+ Rink Springer - Port to the DOS platform, several bug
+ fixes
+ 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
+ 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/COPYRIGHT b/COPYRIGHT
index e964d8c0a1..2050c6d98f 100644
--- a/COPYRIGHT
+++ b/COPYRIGHT
@@ -1,5 +1,5 @@
ScummVM
-Copyright (C) 2001-2013 by the following:
+Copyright (C) 2001-2014 by the following:
If you have contributed to this project then you deserve to be on this
list. Contact us (see: AUTHORS) and we'll add you.
diff --git a/Makefile b/Makefile
index 09c38b2598..93a84a5c7b 100644
--- a/Makefile
+++ b/Makefile
@@ -33,8 +33,9 @@ ifeq "$(HAVE_GCC)" "1"
#CXXFLAGS+= -Wmissing-format-attribute
ifneq "$(BACKEND)" "tizen"
- # Disable RTTI and exceptions. These settings cause tizen apps to crash
- CXXFLAGS+= -fno-rtti -fno-exceptions
+ # Disable exceptions. This setting causes tizen apps to crash
+ # TODO: Does this still apply after enabling RTTI again?
+ CXXFLAGS+= -fno-exceptions
endif
ifneq "$(HAVE_CLANG)" "1"
@@ -82,7 +83,8 @@ EXECUTABLE := $(EXEPRE)scummvm$(EXEEXT)
include $(srcdir)/Makefile.common
# check if configure has been run or has been changed since last run
-config.h config.mk: $(srcdir)/configure $(srcdir)/engines/configure.engines
+ENGINE_SUBDIRS_CONFIGURE := $(wildcard $(srcdir)/engines/*/configure.engine)
+config.h: $(srcdir)/configure $(ENGINE_SUBDIRS_CONFIGURE)
ifeq "$(findstring config.mk,$(MAKEFILE_LIST))" "config.mk"
@echo "Running $(srcdir)/configure with the last specified parameters"
@sleep 2
@@ -94,6 +96,14 @@ else
$(error You need to run $(srcdir)/configure before you can run make. Check $(srcdir)/configure --help for a list of parameters)
endif
+config.mk engines/plugins_table.h engines/engines.mk: config.h
+ @if test -f $@; then \
+ touch $@; \
+ else \
+ rm -f config.h; \
+ $(MAKE) config.h; \
+ fi
+
ifneq ($(origin port_mk), undefined)
include $(srcdir)/$(port_mk)
endif
diff --git a/Makefile.common b/Makefile.common
index 02c3408684..993b833f4e 100644
--- a/Makefile.common
+++ b/Makefile.common
@@ -16,7 +16,7 @@ all: $(EXECUTABLE) plugins
PLUGINS :=
MODULES := test devtools base $(MODULES)
--include $(srcdir)/engines/engines.mk
+-include engines/engines.mk
# After the game specific modules follow the shared modules
MODULES += \
@@ -25,6 +25,7 @@ MODULES += \
engines \
video \
graphics \
+ image \
audio \
common \
po
@@ -61,6 +62,7 @@ endif
ifneq ($(findstring $(MAKEFLAGS),s),s)
ifneq ($(VERBOSE_BUILD),1)
ifneq ($(VERBOSE_BUILD),yes)
+QUIET_CC = @echo ' ' C ' ' $@;
QUIET_CXX = @echo ' ' C++ ' ' $@;
QUIET_AS = @echo ' ' AS ' ' $@;
QUIET_NASM = @echo ' ' NASM ' ' $@;
@@ -79,7 +81,7 @@ $(EXECUTABLE): $(OBJS)
$(QUIET_LINK)$(LD) $(LDFLAGS) $(PRE_OBJS_FLAGS) $+ $(POST_OBJS_FLAGS) $(LIBS) -o $@
distclean: clean clean-devtools
- $(RM) config.h config.mk config.log
+ $(RM) config.h config.mk config.log engines/engines.mk engines/plugins_table.h
clean:
$(RM_REC) $(DEPDIRS)
@@ -94,6 +96,9 @@ ifdef CXX_UPDATE_DEP_FLAG
# Build rule for C++ files. Makes use of CXX_UPDATE_DEP_FLAG for advanced
# dependency tracking.
+%.o: %.c
+ $(QUIET)$(MKDIR) $(*D)/$(DEPDIR)
+ $(QUIET_CC)$(CC) $(CXX_UPDATE_DEP_FLAG) $(CFLAGS) $(CPPFLAGS) -c $(<) -o $*.o
%.o: %.cpp
$(QUIET)$(MKDIR) $(*D)/$(DEPDIR)
$(QUIET_CXX)$(CXX) $(CXX_UPDATE_DEP_FLAG) $(CXXFLAGS) $(CPPFLAGS) -c $(<) -o $*.o
@@ -147,7 +152,7 @@ endif
# recreate them (which it can't), and in particular from looking for potential
# source files. This can save quite a bit of disk access time.
.PHONY: $(wildcard $(addsuffix /*.d,$(DEPDIRS))) $(addprefix $(srcdir)/, $(addsuffix /module.mk,$(MODULES))) \
- $(srcdir)/$(port_mk) $(srcdir)/rules.mk $(srcdir)/engines/engines.mk
+ $(srcdir)/$(port_mk) $(srcdir)/rules.mk
######################################################################
# Get the current version information
diff --git a/NEWS b/NEWS
index 7a0487cdc9..3db2bd2b4a 100644
--- a/NEWS
+++ b/NEWS
@@ -2,17 +2,66 @@ For a more comprehensive changelog of the latest experimental code, see:
https://github.com/scummvm/scummvm/commits/
1.7.0 (????-??-??)
+ New Games:
+ - Added support for Chivalry is Not Dead.
+ - Added support for Return to Ringworld.
+ - Added support for The Neverhood.
+ - Added support for Mortville Manor.
+ - Added support for Voyeur
+
General:
- - Updated MT-32 emulation code to version 1.3.0.
+ - Updated Munt MT-32 emulation code to version 1.3.0.
+ - Switched from our custom JPEG and PNG decoders to libjpeg(-turbo) and
+ libpng, which are faster and can handle more images.
+ (NOTE: The change to libpng was done in version 1.6.0, but it was not
+ added to the NEWS file).
- Gob:
- - Improved video quality in Urban Runner
+ AGOS:
+ - Added mouse wheel support for inventory and save game lists.
+ - Enabled verb name display in Simon the Sorcerer 2.
+ - Fixed the Feeble Files loyalty rating in the English 4CD version. (This
+ was apparently a bug in the original game. It is currently unknown if
+ other versions still have the same problem.)
Broken Sword 1:
- - Added back support for MPEG-2 videos
+ - Added back support for MPEG-2 videos.
Broken Sword 2:
- - Added back support for MPEG-2 videos
+ - Added back support for MPEG-2 videos.
+
+ CGE:
+ - Added an option to enable "Color Blind Mode" to the ScummVM GUI.
+
+ Gob:
+ - Improved video quality in Urban Runner.
+
+ Hopkins:
+ - Added an option to toggle "Gore Mode" from the ScummVM GUI.
+ - Fixed bug that could cause the music to stop prematurely.
+
+ SCI:
+ - Added support for the more detailed RAVE lip syncing data in the Windows
+ version of King's Quest 6. Portraits should now be much more expressive
+ when talking.
+ - Added support for simultaneous speech and subtitles in the CD versions
+ of Laura Bow 2 and King's Quest 6 (toggled either in-game with the new
+ "Dual" audio state, or via the ScummVM audio options).
+ - Fixed music fading.
+ - Fixed several script bugs in Camelot, Crazy Nick's, Hoyle 3, QFG1VGA, KQ5,
+ KQ6, LB2, LSL2, LSL5, Pharkas, PQ1VGA, SQ4, SQ5.
+ - Improved the MIDI parser so that music event processing is done more
+ properly.
+
+ SCUMM:
+ - Changed the saved game naming scheme of HE games to always contain
+ the target name.
+ - Fixed having multiple coaches in Backyard Football.
+ - Improved AdLib support for Loom and Indiana Jones and the Last Crusade.
+ This makes sound effects like, for example, the typewriter and waterfall
+ in Indiana Jones and the Last Crusade sound like in the original.
+
+ Tinsel:
+ - Discworld 1 and 2 no longer crash on big-endian systems.
1.6.0 (2013-05-31)
New Games:
diff --git a/README b/README
index a6c3d9773a..a6070e4a34 100644
--- a/README
+++ b/README
@@ -33,7 +33,8 @@ Table of Contents:
* 3.17 Winnie the Pooh notes
* 3.18 Troll's Tale notes
* 3.19 Dragon History notes
- * 3.20 Known Problems
+ * 3.20 Simultaneous speech and subtitles in Sierra SCI games
+ * 3.21 Known Problems
4.0) Supported Platforms
5.0) Running ScummVM
* 5.1 Command Line Options
@@ -815,7 +816,55 @@ All game files and the walkthrough can be downloaded from
http://www.ucw.cz/draci-historie/index-en.html
-3.20) Known Problems:
+3.20) Simultaneous speech and subtitles in Sierra SCI games:
+----- ------------------------------------------------------
+Certain CD versions of Sierra SCI games had both speech and text
+resources. Some have an option to toggle between the two, but there are
+some cases where there wasn't any option to enable both simultaneously.
+In ScummVM, it is possible to enjoy a combined mode, where both speech
+and text are shown at the same time. This mode can be toggled in the
+ScummVM audio options, but each game has different behavior in-game
+regarding speech and text toggling.
+
+The CD games where speech and subtitles can be shown simultaneously
+are:
+ EcoQuest 1 CD
+ Freddy Pharkas CD
+ King's Quest 6 CD
+ Laura Bow 2 CD
+ Leisure Suit Larry 6 CD
+ Space Quest 4 CD
+
+EcoQuest 1 CD:
+ Speech and text can be toggled via the game's "Mode" option in the
+ options dialog, or via ScummVM's audio options.
+
+Freddy Pharkas CD:
+ There is no in-game option to toggle speech and text. Only ScummVM's
+ audio options can be used to toggle this feature. Note that some
+ spoken dialog is missing from the game texts.
+
+King's Quest 6 CD:
+ Speech and text can be toggled via the "Mode" button in the options
+ dialog (with an extra "Dual" setting added in ScummVM), or via
+ ScummVM's audio options.
+
+Laura Bow 2 CD:
+ Speech and text can be toggled via the "Mode" button in the options
+ dialog (with an extra "Dual" setting added in ScummVM), or via
+ ScummVM's audio options.
+
+Leisure Suit Larry 6 CD:
+ Either speech only or speech and text can be selected. There is no
+ in-game option to toggle text only. Only ScummVM's audio options can
+ be used to enable the text only mode.
+
+Space Quest 4 CD:
+ Speech and text can be toggled via the "Display Mode" button in the
+ options dialog, or via ScummVM's audio options.
+
+
+3.21) Known Problems:
----- ---------------
This release has the following known problems. There is no need to
report them, although patches to fix them are welcome. If you discover a
@@ -2110,6 +2159,9 @@ 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
+Hopkins FBI adds the following non-standard keyword:
+ enable_gore bool If true, enable some optional gore content in the game
+
Jones in the Fast Lane adds the following non-standard keyword:
music_mute bool If true, CD audio is used, if available,
@@ -2143,6 +2195,9 @@ Simon the Sorcerer 1 and 2 add the following non-standard keywords:
music_mute bool If true, music is muted
sfx_mute bool If true, sound effects are muted
+Soltys adds the following non-standard keyword:
+ enable_color_blind bool If true, original colors are replaced by a set of greys
+
The Legend of Kyrandia adds the following non-standard keyword:
walkspeed number The walk speed (0-4)
@@ -2164,6 +2219,16 @@ keywords:
helium_mode bool If true, people sound like they've inhaled
Helium
+The Neverhood adds the following non-standard keywords:
+
+ originalsaveload bool If true, the original save/load screens are
+ used instead of the enhanced ScummVM ones
+ skiphallofrecordsscenes bool
+ If true, allows the player to skip
+ past the Hall of Records storyboard scenes
+ scalemakingofvideos bool If true, the making of videos are scaled, so that
+ they use the whole screen
+
The 7th Guest adds the following non-standard keyword:
fast_movie_speed bool If true, movies are played at an increased
diff --git a/audio/audiostream.cpp b/audio/audiostream.cpp
index 8bd4b95c49..4dd5d236be 100644
--- a/audio/audiostream.cpp
+++ b/audio/audiostream.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/audio/audiostream.h b/audio/audiostream.h
index d6d4a16280..d5d7d0b6c7 100644
--- a/audio/audiostream.h
+++ b/audio/audiostream.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/audio/decoders/adpcm.cpp b/audio/decoders/adpcm.cpp
index 61b0abaaca..2f710f759d 100644
--- a/audio/decoders/adpcm.cpp
+++ b/audio/decoders/adpcm.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/audio/decoders/adpcm.h b/audio/decoders/adpcm.h
index d3c46574bf..bf6e7f759d 100644
--- a/audio/decoders/adpcm.h
+++ b/audio/decoders/adpcm.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/audio/decoders/adpcm_intern.h b/audio/decoders/adpcm_intern.h
index 66a1aa605f..92be704cca 100644
--- a/audio/decoders/adpcm_intern.h
+++ b/audio/decoders/adpcm_intern.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/audio/decoders/aiff.cpp b/audio/decoders/aiff.cpp
index f3b0dfb559..b714721c02 100644
--- a/audio/decoders/aiff.cpp
+++ b/audio/decoders/aiff.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/audio/decoders/aiff.h b/audio/decoders/aiff.h
index 0d96e73c26..afb0342cfd 100644
--- a/audio/decoders/aiff.h
+++ b/audio/decoders/aiff.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/audio/decoders/flac.cpp b/audio/decoders/flac.cpp
index bbaf5fd5ae..e0205a40b5 100644
--- a/audio/decoders/flac.cpp
+++ b/audio/decoders/flac.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/audio/decoders/flac.h b/audio/decoders/flac.h
index f5e31684fe..963753f2ec 100644
--- a/audio/decoders/flac.h
+++ b/audio/decoders/flac.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/audio/decoders/iff_sound.cpp b/audio/decoders/iff_sound.cpp
index b0c41f0180..e42918cb62 100644
--- a/audio/decoders/iff_sound.cpp
+++ b/audio/decoders/iff_sound.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/audio/decoders/iff_sound.h b/audio/decoders/iff_sound.h
index 28b2c67227..3eab58157e 100644
--- a/audio/decoders/iff_sound.h
+++ b/audio/decoders/iff_sound.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/audio/decoders/mac_snd.cpp b/audio/decoders/mac_snd.cpp
index 43253a9ddf..17495ad3f7 100644
--- a/audio/decoders/mac_snd.cpp
+++ b/audio/decoders/mac_snd.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/audio/decoders/mac_snd.h b/audio/decoders/mac_snd.h
index 4380808eae..e548df012d 100644
--- a/audio/decoders/mac_snd.h
+++ b/audio/decoders/mac_snd.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/audio/decoders/mp3.cpp b/audio/decoders/mp3.cpp
index 00669945c2..091f64569d 100644
--- a/audio/decoders/mp3.cpp
+++ b/audio/decoders/mp3.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/audio/decoders/mp3.h b/audio/decoders/mp3.h
index df2ee44805..609181bdba 100644
--- a/audio/decoders/mp3.h
+++ b/audio/decoders/mp3.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/audio/decoders/qdm2.cpp b/audio/decoders/qdm2.cpp
index b70fc39e48..743ca1cb7d 100644
--- a/audio/decoders/qdm2.cpp
+++ b/audio/decoders/qdm2.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/audio/decoders/qdm2.h b/audio/decoders/qdm2.h
index f0793e3c1e..7f1ab8ffde 100644
--- a/audio/decoders/qdm2.h
+++ b/audio/decoders/qdm2.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/audio/decoders/qdm2data.h b/audio/decoders/qdm2data.h
index d92bc0ff80..4761c53c2c 100644
--- a/audio/decoders/qdm2data.h
+++ b/audio/decoders/qdm2data.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/audio/decoders/quicktime.cpp b/audio/decoders/quicktime.cpp
index 787b547495..547abd2aa4 100644
--- a/audio/decoders/quicktime.cpp
+++ b/audio/decoders/quicktime.cpp
@@ -585,7 +585,7 @@ bool QuickTimeAudioDecoder::AudioSampleDesc::isAudioCodecSupported() const {
if (_codecTag == MKTAG('m', 'p', '4', 'a')) {
Common::String audioType;
- switch (_parentTrack->objectTypeMP4) {
+ switch (_objectTypeMP4) {
case 0x40: // AAC
#ifdef USE_FAAD
return true;
@@ -643,13 +643,13 @@ void QuickTimeAudioDecoder::AudioSampleDesc::initCodec() {
switch (_codecTag) {
case MKTAG('Q', 'D', 'M', '2'):
#ifdef AUDIO_QDM2_H
- _codec = makeQDM2Decoder(_parentTrack->extraData);
+ _codec = makeQDM2Decoder(_extraData);
#endif
break;
case MKTAG('m', 'p', '4', 'a'):
#ifdef USE_FAAD
- if (_parentTrack->objectTypeMP4 == 0x40)
- _codec = makeAACDecoder(_parentTrack->extraData);
+ if (_objectTypeMP4 == 0x40)
+ _codec = makeAACDecoder(_extraData);
#endif
break;
default:
diff --git a/audio/decoders/raw.cpp b/audio/decoders/raw.cpp
index d24e07926e..9a9f79092a 100644
--- a/audio/decoders/raw.cpp
+++ b/audio/decoders/raw.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/audio/decoders/raw.h b/audio/decoders/raw.h
index a06bebee10..14e7bd45fd 100644
--- a/audio/decoders/raw.h
+++ b/audio/decoders/raw.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/audio/decoders/voc.cpp b/audio/decoders/voc.cpp
index fa330c6f2c..c7ba7a2624 100644
--- a/audio/decoders/voc.cpp
+++ b/audio/decoders/voc.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -559,7 +559,7 @@ SeekableAudioStream *makeVOCStream(Common::SeekableReadStream *stream, byte flag
SeekableAudioStream *audioStream = new VocStream(stream, (flags & Audio::FLAG_UNSIGNED) != 0, disposeAfterUse);
- if (audioStream && audioStream->endOfData()) {
+ if (audioStream->endOfData()) {
delete audioStream;
return 0;
} else {
diff --git a/audio/decoders/voc.h b/audio/decoders/voc.h
index e16ffce42f..ef35f8bbf3 100644
--- a/audio/decoders/voc.h
+++ b/audio/decoders/voc.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/audio/decoders/vorbis.cpp b/audio/decoders/vorbis.cpp
index 64cacb4d58..c82d2840ca 100644
--- a/audio/decoders/vorbis.cpp
+++ b/audio/decoders/vorbis.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/audio/decoders/vorbis.h b/audio/decoders/vorbis.h
index 3a3052ed7c..2b9f6c3df9 100644
--- a/audio/decoders/vorbis.h
+++ b/audio/decoders/vorbis.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/audio/decoders/wave.cpp b/audio/decoders/wave.cpp
index 44188f84ca..adee749b37 100644
--- a/audio/decoders/wave.cpp
+++ b/audio/decoders/wave.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/audio/decoders/wave.h b/audio/decoders/wave.h
index c8ac7fe318..1dcaefd845 100644
--- a/audio/decoders/wave.h
+++ b/audio/decoders/wave.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/audio/decoders/xa.cpp b/audio/decoders/xa.cpp
index 818cd2df59..b18673411b 100644
--- a/audio/decoders/xa.cpp
+++ b/audio/decoders/xa.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/audio/decoders/xa.h b/audio/decoders/xa.h
index cf28d8001a..fb33512f7f 100644
--- a/audio/decoders/xa.h
+++ b/audio/decoders/xa.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/audio/fmopl.cpp b/audio/fmopl.cpp
index d2fe7dc0e8..c18e544410 100644
--- a/audio/fmopl.cpp
+++ b/audio/fmopl.cpp
@@ -17,6 +17,7 @@
* You should have received a copy of the GNU General Public 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 "audio/fmopl.h"
diff --git a/audio/fmopl.h b/audio/fmopl.h
index ad1794d873..85ac606c7a 100644
--- a/audio/fmopl.h
+++ b/audio/fmopl.h
@@ -17,6 +17,7 @@
* You should have received a copy of the GNU General Public 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 AUDIO_FMOPL_H
diff --git a/audio/mididrv.cpp b/audio/mididrv.cpp
index dea07a739b..f053ec8440 100644
--- a/audio/mididrv.cpp
+++ b/audio/mididrv.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/audio/mididrv.h b/audio/mididrv.h
index 56b4a265cb..1eaf415399 100644
--- a/audio/mididrv.h
+++ b/audio/mididrv.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/audio/midiparser.cpp b/audio/midiparser.cpp
index 2454575413..9a8f0f7a77 100644
--- a/audio/midiparser.cpp
+++ b/audio/midiparser.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -214,13 +214,16 @@ void MidiParser::onTimer() {
activeNote(info.channel(), info.basic.param1, true);
}
- processEvent(info);
-
- if (_abortParse)
- break;
+ // Player::metaEvent() in SCUMM will delete the parser object,
+ // so return immediately if that might have happened.
+ bool ret = processEvent(info);
+ if (!ret)
+ return;
- _position._lastEventTime = eventTime;
- parseNextEvent(_nextEvent);
+ if (!_abortParse) {
+ _position._lastEventTime = eventTime;
+ parseNextEvent(_nextEvent);
+ }
}
if (!_abortParse) {
@@ -229,7 +232,7 @@ void MidiParser::onTimer() {
}
}
-void MidiParser::processEvent(const EventInfo &info, bool fireEvents) {
+bool MidiParser::processEvent(const EventInfo &info, bool fireEvents) {
if (info.event == 0xF0) {
// SysEx event
// Check for trailing 0xF7 -- if present, remove it.
@@ -252,8 +255,7 @@ void MidiParser::processEvent(const EventInfo &info, bool fireEvents) {
if (fireEvents)
_driver->metaEvent(info.ext.type, info.ext.data, (uint16)info.length);
}
- _abortParse = true;
- return;
+ return false;
} else if (info.ext.type == 0x51) {
if (info.length >= 3) {
setTempo(info.ext.data[0] << 16 | info.ext.data[1] << 8 | info.ext.data[2]);
@@ -265,6 +267,8 @@ void MidiParser::processEvent(const EventInfo &info, bool fireEvents) {
if (fireEvents)
sendToDriver(info.event, info.basic.param1, info.basic.param2);
}
+
+ return true;
}
diff --git a/audio/midiparser.h b/audio/midiparser.h
index 05d0cbe1db..9c10462cd7 100644
--- a/audio/midiparser.h
+++ b/audio/midiparser.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -294,7 +294,7 @@ protected:
virtual void resetTracking();
virtual void allNotesOff();
virtual void parseNextEvent(EventInfo &info) = 0;
- virtual void processEvent(const EventInfo &info, bool fireEvents = true);
+ virtual bool processEvent(const EventInfo &info, bool fireEvents = true);
void activeNote(byte channel, byte note, bool active);
void hangingNote(byte channel, byte note, uint32 ticksLeft, bool recycle = true);
diff --git a/audio/midiparser_qt.cpp b/audio/midiparser_qt.cpp
index 6214d28f95..b97ea56df5 100644
--- a/audio/midiparser_qt.cpp
+++ b/audio/midiparser_qt.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/audio/midiparser_qt.h b/audio/midiparser_qt.h
index d6d0f40a48..1c811fdb36 100644
--- a/audio/midiparser_qt.h
+++ b/audio/midiparser_qt.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/audio/midiparser_smf.cpp b/audio/midiparser_smf.cpp
index 6c64d1e601..a614e5bd63 100644
--- a/audio/midiparser_smf.cpp
+++ b/audio/midiparser_smf.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/audio/midiparser_xmidi.cpp b/audio/midiparser_xmidi.cpp
index fcb45fa5ad..95aa5d72f3 100644
--- a/audio/midiparser_xmidi.cpp
+++ b/audio/midiparser_xmidi.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/audio/midiplayer.cpp b/audio/midiplayer.cpp
index 7fab02a5be..75a3b45fb8 100644
--- a/audio/midiplayer.cpp
+++ b/audio/midiplayer.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/audio/midiplayer.h b/audio/midiplayer.h
index e58c78cafd..5c06baeff2 100644
--- a/audio/midiplayer.h
+++ b/audio/midiplayer.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/audio/mixer.cpp b/audio/mixer.cpp
index 9e6e4596e2..16cf5640eb 100644
--- a/audio/mixer.cpp
+++ b/audio/mixer.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -333,7 +333,7 @@ void MixerImpl::stopHandle(SoundHandle handle) {
}
void MixerImpl::muteSoundType(SoundType type, bool mute) {
- assert(0 <= type && type < ARRAYSIZE(_soundTypeSettings));
+ assert(0 <= (int)type && (int)type < ARRAYSIZE(_soundTypeSettings));
_soundTypeSettings[type].mute = mute;
for (int i = 0; i != NUM_CHANNELS; ++i) {
@@ -343,7 +343,7 @@ void MixerImpl::muteSoundType(SoundType type, bool mute) {
}
bool MixerImpl::isSoundTypeMuted(SoundType type) const {
- assert(0 <= type && type < ARRAYSIZE(_soundTypeSettings));
+ assert(0 <= (int)type && (int)type < ARRAYSIZE(_soundTypeSettings));
return _soundTypeSettings[type].mute;
}
@@ -468,7 +468,7 @@ bool MixerImpl::hasActiveChannelOfType(SoundType type) {
}
void MixerImpl::setVolumeForSoundType(SoundType type, int volume) {
- assert(0 <= type && type < ARRAYSIZE(_soundTypeSettings));
+ assert(0 <= (int)type && (int)type < ARRAYSIZE(_soundTypeSettings));
// Check range
if (volume > kMaxMixerVolume)
@@ -489,7 +489,7 @@ void MixerImpl::setVolumeForSoundType(SoundType type, int volume) {
}
int MixerImpl::getVolumeForSoundType(SoundType type) const {
- assert(0 <= type && type < ARRAYSIZE(_soundTypeSettings));
+ assert(0 <= (int)type && (int)type < ARRAYSIZE(_soundTypeSettings));
return _soundTypeSettings[type].volume;
}
diff --git a/audio/mixer.h b/audio/mixer.h
index a0060f2e1a..9f114c330a 100644
--- a/audio/mixer.h
+++ b/audio/mixer.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/audio/mixer_intern.h b/audio/mixer_intern.h
index fce13a9812..a8b7981571 100644
--- a/audio/mixer_intern.h
+++ b/audio/mixer_intern.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/audio/mods/infogrames.cpp b/audio/mods/infogrames.cpp
index 5b4d39fe49..320261b1b0 100644
--- a/audio/mods/infogrames.cpp
+++ b/audio/mods/infogrames.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/audio/mods/infogrames.h b/audio/mods/infogrames.h
index 8b246eebe7..9a836d30a8 100644
--- a/audio/mods/infogrames.h
+++ b/audio/mods/infogrames.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/audio/mods/maxtrax.cpp b/audio/mods/maxtrax.cpp
index a2d470cdbf..c18812ee54 100644
--- a/audio/mods/maxtrax.cpp
+++ b/audio/mods/maxtrax.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/audio/mods/maxtrax.h b/audio/mods/maxtrax.h
index 8288aef186..9161b7c5ae 100644
--- a/audio/mods/maxtrax.h
+++ b/audio/mods/maxtrax.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/audio/mods/module.cpp b/audio/mods/module.cpp
index 8d09671d26..83fbc7cc72 100644
--- a/audio/mods/module.cpp
+++ b/audio/mods/module.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/audio/mods/module.h b/audio/mods/module.h
index eb7cbf260e..3418305892 100644
--- a/audio/mods/module.h
+++ b/audio/mods/module.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/audio/mods/paula.cpp b/audio/mods/paula.cpp
index d655428ed0..896a272ee9 100644
--- a/audio/mods/paula.cpp
+++ b/audio/mods/paula.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/audio/mods/paula.h b/audio/mods/paula.h
index 5d11cc7bb6..61a1a9edb8 100644
--- a/audio/mods/paula.h
+++ b/audio/mods/paula.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/audio/mods/protracker.cpp b/audio/mods/protracker.cpp
index c947f256e0..82067f67bd 100644
--- a/audio/mods/protracker.cpp
+++ b/audio/mods/protracker.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/audio/mods/protracker.h b/audio/mods/protracker.h
index 50528fc599..84d60cac05 100644
--- a/audio/mods/protracker.h
+++ b/audio/mods/protracker.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/audio/mods/rjp1.cpp b/audio/mods/rjp1.cpp
index 45c6caa106..f2b811c9ef 100644
--- a/audio/mods/rjp1.cpp
+++ b/audio/mods/rjp1.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/audio/mods/rjp1.h b/audio/mods/rjp1.h
index e7e54dafb3..7ad211738b 100644
--- a/audio/mods/rjp1.h
+++ b/audio/mods/rjp1.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/audio/mods/soundfx.cpp b/audio/mods/soundfx.cpp
index 767d1ce9c8..5744429856 100644
--- a/audio/mods/soundfx.cpp
+++ b/audio/mods/soundfx.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/audio/mods/soundfx.h b/audio/mods/soundfx.h
index d517c6c78f..40a8efd892 100644
--- a/audio/mods/soundfx.h
+++ b/audio/mods/soundfx.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/audio/mods/tfmx.cpp b/audio/mods/tfmx.cpp
index 5829ab5fda..db3dad88ef 100644
--- a/audio/mods/tfmx.cpp
+++ b/audio/mods/tfmx.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/audio/mods/tfmx.h b/audio/mods/tfmx.h
index a8852d7963..ef05fed9ff 100644
--- a/audio/mods/tfmx.h
+++ b/audio/mods/tfmx.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/audio/mpu401.cpp b/audio/mpu401.cpp
index 103a3501db..3e03ec53f1 100644
--- a/audio/mpu401.cpp
+++ b/audio/mpu401.cpp
@@ -17,6 +17,7 @@
* You should have received a copy of the GNU General Public 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 "audio/mpu401.h"
diff --git a/audio/mpu401.h b/audio/mpu401.h
index d4580b6e79..3a3142d441 100644
--- a/audio/mpu401.h
+++ b/audio/mpu401.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/audio/musicplugin.cpp b/audio/musicplugin.cpp
index 7c77c3455c..1903bc9bf1 100644
--- a/audio/musicplugin.cpp
+++ b/audio/musicplugin.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/audio/musicplugin.h b/audio/musicplugin.h
index 2a0f2f0a99..849d3f92cd 100644
--- a/audio/musicplugin.h
+++ b/audio/musicplugin.h
@@ -17,6 +17,7 @@
* You should have received a copy of the GNU General Public 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 AUDIO_MUSICPLUGIN_H
diff --git a/audio/null.cpp b/audio/null.cpp
index 36c894aa7c..a554838c3d 100644
--- a/audio/null.cpp
+++ b/audio/null.cpp
@@ -17,6 +17,7 @@
* You should have received a copy of the GNU General Public 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/error.h"
diff --git a/audio/null.h b/audio/null.h
index 90897be6af..90eba7368d 100644
--- a/audio/null.h
+++ b/audio/null.h
@@ -17,6 +17,7 @@
* You should have received a copy of the GNU General Public 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 AUDIO_NULL_H
diff --git a/audio/rate.cpp b/audio/rate.cpp
index 0fc23a8a54..19d9c8c61e 100644
--- a/audio/rate.cpp
+++ b/audio/rate.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/audio/rate.h b/audio/rate.h
index 9813b75b08..8c8b726c72 100644
--- a/audio/rate.h
+++ b/audio/rate.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/audio/rate_arm.cpp b/audio/rate_arm.cpp
index 4135cdd1af..4ad8d71a34 100644
--- a/audio/rate_arm.cpp
+++ b/audio/rate_arm.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/audio/rate_arm_asm.s b/audio/rate_arm_asm.s
index ac999f66e4..a727209d39 100644
--- a/audio/rate_arm_asm.s
+++ b/audio/rate_arm_asm.s
@@ -36,6 +36,7 @@
.global _ARM_LinearRate_S
.global _ARM_LinearRate_R
+ .align 2
_ARM_CopyRate_M:
@ r0 = len
@ r1 = obuf
@@ -73,6 +74,7 @@ CopyRate_M_loop:
LDMFD r13!,{r4-r7,PC}
+ .align 2
_ARM_CopyRate_S:
@ r0 = len
@ r1 = obuf
@@ -111,6 +113,7 @@ CopyRate_S_loop:
LDMFD r13!,{r4-r7,PC}
+ .align 2
_ARM_CopyRate_R:
@ r0 = len
@ r1 = obuf
@@ -149,6 +152,7 @@ CopyRate_R_loop:
LDMFD r13!,{r4-r7,PC}
+ .align 2
_ARM_SimpleRate_M:
@ r0 = AudioStream &input
@ r1 = input.readBuffer
@@ -229,6 +233,7 @@ SimpleRate_M_read:
B SimpleRate_M_read_return
+ .align 2
_ARM_SimpleRate_S:
@ r0 = AudioStream &input
@ r1 = input.readBuffer
@@ -308,6 +313,7 @@ SimpleRate_S_read:
+ .align 2
_ARM_SimpleRate_R:
@ r0 = AudioStream &input
@ r1 = input.readBuffer
@@ -386,6 +392,7 @@ SimpleRate_R_read:
B SimpleRate_R_read_return
+ .align 2
_ARM_LinearRate_M:
@ r0 = AudioStream &input
@ r1 = input.readBuffer
@@ -478,6 +485,7 @@ LinearRate_M_read:
BLT LinearRate_M_end
B LinearRate_M_read_return
+ .align 2
_ARM_LinearRate_S:
@ r0 = AudioStream &input
@ r1 = input.readBuffer
@@ -580,6 +588,7 @@ LinearRate_S_read:
BLT LinearRate_S_end
B LinearRate_S_read_return
+ .align 2
_ARM_LinearRate_R:
@ r0 = AudioStream &input
@ r1 = input.readBuffer
diff --git a/audio/softsynth/adlib.cpp b/audio/softsynth/adlib.cpp
index 0cadea7f22..98519343b4 100644
--- a/audio/softsynth/adlib.cpp
+++ b/audio/softsynth/adlib.cpp
@@ -17,6 +17,7 @@
* You should have received a copy of the GNU General Public 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 "audio/softsynth/emumidi.h"
diff --git a/audio/softsynth/appleiigs.cpp b/audio/softsynth/appleiigs.cpp
index bbb3f0b005..e07e282de6 100644
--- a/audio/softsynth/appleiigs.cpp
+++ b/audio/softsynth/appleiigs.cpp
@@ -1,24 +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.
-*
-*/
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public 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 "audio/null.h"
diff --git a/audio/softsynth/cms.cpp b/audio/softsynth/cms.cpp
index 681f08dfa3..206bd36d2d 100644
--- a/audio/softsynth/cms.cpp
+++ b/audio/softsynth/cms.cpp
@@ -17,6 +17,7 @@
* You should have received a copy of the GNU General Public 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 "audio/softsynth/cms.h"
diff --git a/audio/softsynth/cms.h b/audio/softsynth/cms.h
index 0aad856a9d..8c0f980b0a 100644
--- a/audio/softsynth/cms.h
+++ b/audio/softsynth/cms.h
@@ -17,6 +17,7 @@
* You should have received a copy of the GNU General Public 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 AUDIO_SOFTSYNTH_CMS_H
diff --git a/audio/softsynth/eas.cpp b/audio/softsynth/eas.cpp
index ea79b25329..9854c10d27 100644
--- a/audio/softsynth/eas.cpp
+++ b/audio/softsynth/eas.cpp
@@ -17,6 +17,7 @@
* You should have received a copy of the GNU General Public 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"
@@ -305,7 +306,7 @@ int MidiDriver_EAS::open() {
warning("error opening EAS dump file");
#endif
- g_system->getMixer()->playStream(Audio::Mixer::kMusicSoundType,
+ g_system->getMixer()->playStream(Audio::Mixer::kPlainSoundType,
&_soundHandle, this, -1,
Audio::Mixer::kMaxChannelVolume, 0,
DisposeAfterUse::NO, true);
diff --git a/audio/softsynth/emumidi.h b/audio/softsynth/emumidi.h
index 3e9d669933..8177cfd5e9 100644
--- a/audio/softsynth/emumidi.h
+++ b/audio/softsynth/emumidi.h
@@ -17,6 +17,7 @@
* You should have received a copy of the GNU General Public 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 AUDIO_SOFTSYNTH_EMUMIDI_H
diff --git a/audio/softsynth/fluidsynth.cpp b/audio/softsynth/fluidsynth.cpp
index efcf1be615..9b64d70f2b 100644
--- a/audio/softsynth/fluidsynth.cpp
+++ b/audio/softsynth/fluidsynth.cpp
@@ -17,6 +17,7 @@
* You should have received a copy of the GNU General Public 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"
@@ -184,8 +185,7 @@ int MidiDriver_FluidSynth::open() {
MidiDriver_Emulated::open();
- // The MT-32 emulator uses kSFXSoundType here. I don't know why.
- _mixer->playStream(Audio::Mixer::kMusicSoundType, &_mixerSoundHandle, this, -1, Audio::Mixer::kMaxChannelVolume, 0, DisposeAfterUse::NO, true);
+ _mixer->playStream(Audio::Mixer::kPlainSoundType, &_mixerSoundHandle, this, -1, Audio::Mixer::kMaxChannelVolume, 0, DisposeAfterUse::NO, true);
return 0;
}
diff --git a/audio/softsynth/fmtowns_pc98/towns_audio.cpp b/audio/softsynth/fmtowns_pc98/towns_audio.cpp
index d8300112bf..7fa55ef6c1 100644
--- a/audio/softsynth/fmtowns_pc98/towns_audio.cpp
+++ b/audio/softsynth/fmtowns_pc98/towns_audio.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/audio/softsynth/fmtowns_pc98/towns_audio.h b/audio/softsynth/fmtowns_pc98/towns_audio.h
index 211133a1fe..93eeafb046 100644
--- a/audio/softsynth/fmtowns_pc98/towns_audio.h
+++ b/audio/softsynth/fmtowns_pc98/towns_audio.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/audio/softsynth/fmtowns_pc98/towns_euphony.cpp b/audio/softsynth/fmtowns_pc98/towns_euphony.cpp
index bc2c88b236..fca3d19912 100644
--- a/audio/softsynth/fmtowns_pc98/towns_euphony.cpp
+++ b/audio/softsynth/fmtowns_pc98/towns_euphony.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/audio/softsynth/fmtowns_pc98/towns_euphony.h b/audio/softsynth/fmtowns_pc98/towns_euphony.h
index bff0e99660..d77217884d 100644
--- a/audio/softsynth/fmtowns_pc98/towns_euphony.h
+++ b/audio/softsynth/fmtowns_pc98/towns_euphony.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/audio/softsynth/fmtowns_pc98/towns_pc98_driver.cpp b/audio/softsynth/fmtowns_pc98/towns_pc98_driver.cpp
index 75e6bc3d10..6a492787b2 100644
--- a/audio/softsynth/fmtowns_pc98/towns_pc98_driver.cpp
+++ b/audio/softsynth/fmtowns_pc98/towns_pc98_driver.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/audio/softsynth/fmtowns_pc98/towns_pc98_driver.h b/audio/softsynth/fmtowns_pc98/towns_pc98_driver.h
index c0009e4957..918446f6c5 100644
--- a/audio/softsynth/fmtowns_pc98/towns_pc98_driver.h
+++ b/audio/softsynth/fmtowns_pc98/towns_pc98_driver.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/audio/softsynth/fmtowns_pc98/towns_pc98_fmsynth.cpp b/audio/softsynth/fmtowns_pc98/towns_pc98_fmsynth.cpp
index b4967a556f..685ee99e6f 100644
--- a/audio/softsynth/fmtowns_pc98/towns_pc98_fmsynth.cpp
+++ b/audio/softsynth/fmtowns_pc98/towns_pc98_fmsynth.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/audio/softsynth/fmtowns_pc98/towns_pc98_fmsynth.h b/audio/softsynth/fmtowns_pc98/towns_pc98_fmsynth.h
index 49700be5dc..5af92820ca 100644
--- a/audio/softsynth/fmtowns_pc98/towns_pc98_fmsynth.h
+++ b/audio/softsynth/fmtowns_pc98/towns_pc98_fmsynth.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/audio/softsynth/mt32.cpp b/audio/softsynth/mt32.cpp
index 29f5e3577c..b9799db618 100644
--- a/audio/softsynth/mt32.cpp
+++ b/audio/softsynth/mt32.cpp
@@ -17,6 +17,7 @@
* You should have received a copy of the GNU General Public 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"
@@ -80,15 +81,6 @@ protected:
void showLCDMessage(const char *message) {
g_system->displayMessageOnOSD(message);
}
- void onDeviceReset() {}
- void onDeviceReconfig() {}
- void onNewReverbMode(Bit8u /* mode */) {}
- void onNewReverbTime(Bit8u /* time */) {}
- void onNewReverbLevel(Bit8u /* level */) {}
- void onPartStateChanged(int /* partNum */, bool /* isActive */) {}
- void onPolyStateChanged(int /* partNum */) {}
- void onPartialStateChanged(int /* partialNum */, int /* oldPartialPhase */, int /* newPartialPhase */) {}
- void onProgramChanged(int /* partNum */, char * /* patchName */) {}
};
} // end of namespace MT32Emu
@@ -230,7 +222,7 @@ int MidiDriver_MT32::open() {
g_system->updateScreen();
- _mixer->playStream(Audio::Mixer::kSFXSoundType, &_mixerSoundHandle, this, -1, Audio::Mixer::kMaxChannelVolume, 0, DisposeAfterUse::NO, true);
+ _mixer->playStream(Audio::Mixer::kPlainSoundType, &_mixerSoundHandle, this, -1, Audio::Mixer::kMaxChannelVolume, 0, DisposeAfterUse::NO, true);
return 0;
}
@@ -460,9 +452,6 @@ bool MT32EmuMusicPlugin::checkDevice(MidiDriver::DeviceHandle) const {
}
Common::Error MT32EmuMusicPlugin::createInstance(MidiDriver **mididriver, MidiDriver::DeviceHandle) const {
- if (ConfMan.hasKey("extrapath"))
- SearchMan.addDirectory("extrapath", ConfMan.get("extrapath"));
-
*mididriver = new MidiDriver_MT32(g_system->getMixer());
return Common::kNoError;
diff --git a/audio/softsynth/opl/dosbox.cpp b/audio/softsynth/opl/dosbox.cpp
index a1a736f9de..5c3d833f54 100644
--- a/audio/softsynth/opl/dosbox.cpp
+++ b/audio/softsynth/opl/dosbox.cpp
@@ -17,6 +17,7 @@
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
*/
/*
diff --git a/audio/softsynth/opl/dosbox.h b/audio/softsynth/opl/dosbox.h
index 3adfe98852..513a49f6b8 100644
--- a/audio/softsynth/opl/dosbox.h
+++ b/audio/softsynth/opl/dosbox.h
@@ -17,6 +17,7 @@
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
*/
/*
diff --git a/audio/softsynth/opl/mame.cpp b/audio/softsynth/opl/mame.cpp
index 2db7d421b6..da75ba76ba 100644
--- a/audio/softsynth/opl/mame.cpp
+++ b/audio/softsynth/opl/mame.cpp
@@ -8,18 +8,19 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*
* LGPL licensed version of MAMEs fmopl (V0.37a modified) by
* Tatsuyuki Satoh. Included from LGPL'ed AdPlug.
+ *
*/
#include <stdio.h>
diff --git a/audio/softsynth/opl/mame.h b/audio/softsynth/opl/mame.h
index 3714fa4e0a..bd479d9e45 100644
--- a/audio/softsynth/opl/mame.h
+++ b/audio/softsynth/opl/mame.h
@@ -8,18 +8,19 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*
* LGPL licensed version of MAMEs fmopl (V0.37a modified) by
* Tatsuyuki Satoh. Included from LGPL'ed AdPlug.
+ *
*/
diff --git a/audio/softsynth/pcspk.cpp b/audio/softsynth/pcspk.cpp
index 66af968463..72f33a4761 100644
--- a/audio/softsynth/pcspk.cpp
+++ b/audio/softsynth/pcspk.cpp
@@ -1,24 +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.
-*
-*/
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public 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 "audio/softsynth/pcspk.h"
#include "audio/null.h"
diff --git a/audio/softsynth/pcspk.h b/audio/softsynth/pcspk.h
index f27eb94904..db64da5177 100644
--- a/audio/softsynth/pcspk.h
+++ b/audio/softsynth/pcspk.h
@@ -17,6 +17,7 @@
* You should have received a copy of the GNU General Public 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 AUDIO_SOFTSYNTH_PCSPK_H
diff --git a/audio/softsynth/sid.cpp b/audio/softsynth/sid.cpp
index b6f1c87c4b..bafbd4ab53 100644
--- a/audio/softsynth/sid.cpp
+++ b/audio/softsynth/sid.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/audio/softsynth/sid.h b/audio/softsynth/sid.h
index 88da0eb326..d07d25bc47 100644
--- a/audio/softsynth/sid.h
+++ b/audio/softsynth/sid.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/audio/softsynth/wave6581.cpp b/audio/softsynth/wave6581.cpp
index 832a7272ff..94381f6c72 100644
--- a/audio/softsynth/wave6581.cpp
+++ b/audio/softsynth/wave6581.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/audio/timestamp.cpp b/audio/timestamp.cpp
index 69b47d1628..1ce971631c 100644
--- a/audio/timestamp.cpp
+++ b/audio/timestamp.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/audio/timestamp.h b/audio/timestamp.h
index 1683b554cb..827a8e03f2 100644
--- a/audio/timestamp.h
+++ b/audio/timestamp.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/backends/audiocd/audiocd.h b/backends/audiocd/audiocd.h
index 76c3998862..db9a15505a 100644
--- a/backends/audiocd/audiocd.h
+++ b/backends/audiocd/audiocd.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/backends/audiocd/default/default-audiocd.cpp b/backends/audiocd/default/default-audiocd.cpp
index 819b9c4522..abf80ac4cd 100644
--- a/backends/audiocd/default/default-audiocd.cpp
+++ b/backends/audiocd/default/default-audiocd.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/backends/audiocd/default/default-audiocd.h b/backends/audiocd/default/default-audiocd.h
index 1971ed8f6e..9e4ba6b33e 100644
--- a/backends/audiocd/default/default-audiocd.h
+++ b/backends/audiocd/default/default-audiocd.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/backends/audiocd/sdl/sdl-audiocd.cpp b/backends/audiocd/sdl/sdl-audiocd.cpp
index b5f97571f3..5093c03a1c 100644
--- a/backends/audiocd/sdl/sdl-audiocd.cpp
+++ b/backends/audiocd/sdl/sdl-audiocd.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/backends/audiocd/sdl/sdl-audiocd.h b/backends/audiocd/sdl/sdl-audiocd.h
index 85bde353df..ff98fcdd77 100644
--- a/backends/audiocd/sdl/sdl-audiocd.h
+++ b/backends/audiocd/sdl/sdl-audiocd.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/backends/base-backend.h b/backends/base-backend.h
index c797e831a8..598f682b32 100644
--- a/backends/base-backend.h
+++ b/backends/base-backend.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/backends/events/default/default-events.cpp b/backends/events/default/default-events.cpp
index 30f3b3790c..c7c39da069 100644
--- a/backends/events/default/default-events.cpp
+++ b/backends/events/default/default-events.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/backends/events/default/default-events.h b/backends/events/default/default-events.h
index 4d89b78861..f378fb9ff0 100644
--- a/backends/events/default/default-events.h
+++ b/backends/events/default/default-events.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/backends/events/dinguxsdl/dinguxsdl-events.cpp b/backends/events/dinguxsdl/dinguxsdl-events.cpp
index 64d8fbeb62..46089a4fcd 100644
--- a/backends/events/dinguxsdl/dinguxsdl-events.cpp
+++ b/backends/events/dinguxsdl/dinguxsdl-events.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/backends/events/dinguxsdl/dinguxsdl-events.h b/backends/events/dinguxsdl/dinguxsdl-events.h
index b348bafa78..0ed0a9923e 100644
--- a/backends/events/dinguxsdl/dinguxsdl-events.h
+++ b/backends/events/dinguxsdl/dinguxsdl-events.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/backends/events/gph/gph-events.cpp b/backends/events/gph/gph-events.cpp
index 91118d36c1..90b6a2a29d 100644
--- a/backends/events/gph/gph-events.cpp
+++ b/backends/events/gph/gph-events.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/backends/events/gph/gph-events.h b/backends/events/gph/gph-events.h
index 3b1e6f090a..507aa94828 100644
--- a/backends/events/gph/gph-events.h
+++ b/backends/events/gph/gph-events.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/backends/events/linuxmotosdl/linuxmotosdl-events.cpp b/backends/events/linuxmotosdl/linuxmotosdl-events.cpp
index 5d9f032e19..ce34662612 100644
--- a/backends/events/linuxmotosdl/linuxmotosdl-events.cpp
+++ b/backends/events/linuxmotosdl/linuxmotosdl-events.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/backends/events/linuxmotosdl/linuxmotosdl-events.h b/backends/events/linuxmotosdl/linuxmotosdl-events.h
index 7b0c8fcc73..87eab3ffaa 100644
--- a/backends/events/linuxmotosdl/linuxmotosdl-events.h
+++ b/backends/events/linuxmotosdl/linuxmotosdl-events.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/backends/events/maemosdl/maemosdl-events.cpp b/backends/events/maemosdl/maemosdl-events.cpp
index dcdf0384e3..5045363286 100644
--- a/backends/events/maemosdl/maemosdl-events.cpp
+++ b/backends/events/maemosdl/maemosdl-events.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -188,7 +188,7 @@ bool MaemoSdlEventSource::handleMouseButtonUp(SDL_Event &ev, Common::Event &even
bool MaemoSdlEventSource::toggleClickMode() {
_clickEnabled = !_clickEnabled;
- ((SurfaceSdlGraphicsManager *) _graphicsManager)->displayMessageOnOSD(
+ _graphicsManager->displayMessageOnOSD(
_clickEnabled ? _("Clicking Enabled") : _("Clicking Disabled"));
return _clickEnabled;
diff --git a/backends/events/maemosdl/maemosdl-events.h b/backends/events/maemosdl/maemosdl-events.h
index f3f05feeca..6024031249 100644
--- a/backends/events/maemosdl/maemosdl-events.h
+++ b/backends/events/maemosdl/maemosdl-events.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/backends/events/openpandora/op-events.cpp b/backends/events/openpandora/op-events.cpp
index fc63cdf74f..b9d5fa8c7b 100644
--- a/backends/events/openpandora/op-events.cpp
+++ b/backends/events/openpandora/op-events.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/backends/events/openpandora/op-events.h b/backends/events/openpandora/op-events.h
index 25f79e68d7..e45ac80e2a 100644
--- a/backends/events/openpandora/op-events.h
+++ b/backends/events/openpandora/op-events.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/backends/events/ps3sdl/ps3sdl-events.cpp b/backends/events/ps3sdl/ps3sdl-events.cpp
index 723942af11..1a854436f1 100644
--- a/backends/events/ps3sdl/ps3sdl-events.cpp
+++ b/backends/events/ps3sdl/ps3sdl-events.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/backends/events/ps3sdl/ps3sdl-events.h b/backends/events/ps3sdl/ps3sdl-events.h
index 8cf2f43426..d28ce7fcf8 100644
--- a/backends/events/ps3sdl/ps3sdl-events.h
+++ b/backends/events/ps3sdl/ps3sdl-events.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/backends/events/samsungtvsdl/samsungtvsdl-events.cpp b/backends/events/samsungtvsdl/samsungtvsdl-events.cpp
index 5e3659839a..f5b919a060 100644
--- a/backends/events/samsungtvsdl/samsungtvsdl-events.cpp
+++ b/backends/events/samsungtvsdl/samsungtvsdl-events.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/backends/events/samsungtvsdl/samsungtvsdl-events.h b/backends/events/samsungtvsdl/samsungtvsdl-events.h
index 4b9ccc9bf8..be3dfef8fd 100644
--- a/backends/events/samsungtvsdl/samsungtvsdl-events.h
+++ b/backends/events/samsungtvsdl/samsungtvsdl-events.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/backends/events/sdl/sdl-events.cpp b/backends/events/sdl/sdl-events.cpp
index e2ef7f6bf6..2480e7c370 100644
--- a/backends/events/sdl/sdl-events.cpp
+++ b/backends/events/sdl/sdl-events.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -391,8 +391,17 @@ bool SdlEventSource::dispatchSDLEvent(SDL_Event &ev, Common::Event &event) {
return false;
case SDL_VIDEORESIZE:
- if (_graphicsManager)
+ if (_graphicsManager) {
_graphicsManager->notifyResize(ev.resize.w, ev.resize.h);
+
+ // If the screen changed, send an Common::EVENT_SCREEN_CHANGED
+ int screenID = ((OSystem_SDL *)g_system)->getGraphicsManager()->getScreenChangeID();
+ if (screenID != _lastScreenID) {
+ _lastScreenID = screenID;
+ event.type = Common::EVENT_SCREEN_CHANGED;
+ return true;
+ }
+ }
return false;
case SDL_QUIT:
diff --git a/backends/events/sdl/sdl-events.h b/backends/events/sdl/sdl-events.h
index ca4835126f..a1b6d5ec3c 100644
--- a/backends/events/sdl/sdl-events.h
+++ b/backends/events/sdl/sdl-events.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/backends/events/symbiansdl/symbiansdl-events.cpp b/backends/events/symbiansdl/symbiansdl-events.cpp
index 308621e697..36018f1024 100644
--- a/backends/events/symbiansdl/symbiansdl-events.cpp
+++ b/backends/events/symbiansdl/symbiansdl-events.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/backends/events/symbiansdl/symbiansdl-events.h b/backends/events/symbiansdl/symbiansdl-events.h
index 66c0b451eb..2664bc267d 100644
--- a/backends/events/symbiansdl/symbiansdl-events.h
+++ b/backends/events/symbiansdl/symbiansdl-events.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/backends/events/webossdl/webossdl-events.cpp b/backends/events/webossdl/webossdl-events.cpp
index 286289f7a6..72106789a5 100644
--- a/backends/events/webossdl/webossdl-events.cpp
+++ b/backends/events/webossdl/webossdl-events.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/backends/events/webossdl/webossdl-events.h b/backends/events/webossdl/webossdl-events.h
index 1ba5c6fcbf..043acfdf6f 100644
--- a/backends/events/webossdl/webossdl-events.h
+++ b/backends/events/webossdl/webossdl-events.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/backends/events/wincesdl/wincesdl-events.cpp b/backends/events/wincesdl/wincesdl-events.cpp
index e73a4e66dd..d3141ee50c 100644
--- a/backends/events/wincesdl/wincesdl-events.cpp
+++ b/backends/events/wincesdl/wincesdl-events.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/backends/events/wincesdl/wincesdl-events.h b/backends/events/wincesdl/wincesdl-events.h
index 5eff630c2a..38327681a5 100644
--- a/backends/events/wincesdl/wincesdl-events.h
+++ b/backends/events/wincesdl/wincesdl-events.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/backends/fs/abstract-fs.cpp b/backends/fs/abstract-fs.cpp
index 372c7423dd..c3991ee8f4 100644
--- a/backends/fs/abstract-fs.cpp
+++ b/backends/fs/abstract-fs.cpp
@@ -17,6 +17,7 @@
* You should have received a copy of the GNU General Public 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/abstract-fs.h"
diff --git a/backends/fs/abstract-fs.h b/backends/fs/abstract-fs.h
index 2b66a6e6e1..34a8120caa 100644
--- a/backends/fs/abstract-fs.h
+++ b/backends/fs/abstract-fs.h
@@ -17,6 +17,7 @@
* You should have received a copy of the GNU General Public 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_ABSTRACT_FS_H
diff --git a/backends/fs/amigaos4/amigaos4-fs-factory.cpp b/backends/fs/amigaos4/amigaos4-fs-factory.cpp
index a62b581f39..4ca65e53a5 100644
--- a/backends/fs/amigaos4/amigaos4-fs-factory.cpp
+++ b/backends/fs/amigaos4/amigaos4-fs-factory.cpp
@@ -17,6 +17,7 @@
* You should have received a copy of the GNU General Public 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(__amigaos4__)
diff --git a/backends/fs/amigaos4/amigaos4-fs-factory.h b/backends/fs/amigaos4/amigaos4-fs-factory.h
index 0390e85072..432caf6fcf 100644
--- a/backends/fs/amigaos4/amigaos4-fs-factory.h
+++ b/backends/fs/amigaos4/amigaos4-fs-factory.h
@@ -17,6 +17,7 @@
* You should have received a copy of the GNU General Public 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 AMIGAOS_FILESYSTEM_FACTORY_H
diff --git a/backends/fs/amigaos4/amigaos4-fs.cpp b/backends/fs/amigaos4/amigaos4-fs.cpp
index fe388c2a6e..5a66cdaa2f 100644
--- a/backends/fs/amigaos4/amigaos4-fs.cpp
+++ b/backends/fs/amigaos4/amigaos4-fs.cpp
@@ -17,6 +17,7 @@
* You should have received a copy of the GNU General Public 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(__amigaos4__)
@@ -81,6 +82,7 @@ AmigaOSFilesystemNode::AmigaOSFilesystemNode(const Common::String &p) {
_sDisplayName = ::lastPathComponent(_sPath);
_pFileLock = 0;
_bIsDirectory = false;
+ _bIsValid = false;
// Check whether the node exists and if it is a directory
struct ExamineData * pExd = IDOS->ExamineObjectTags(EX_StringNameInput,_sPath.c_str(),TAG_END);
@@ -305,12 +307,6 @@ bool AmigaOSFilesystemNode::getChildren(AbstractFSList &myList, ListMode mode, b
AbstractFSNode *AmigaOSFilesystemNode::getParent() const {
ENTER();
- if (!_bIsDirectory) {
- debug(6, "Not a directory");
- LEAVE();
- return 0;
- }
-
if (_pFileLock == 0) {
debug(6, "Root node");
LEAVE();
@@ -332,19 +328,25 @@ AbstractFSNode *AmigaOSFilesystemNode::getParent() const {
}
bool AmigaOSFilesystemNode::isReadable() const {
+ if (!_bIsValid)
+ return false;
+
// Regular RWED protection flags are low-active or inverted, thus the negation.
// moreover pseudo root filesystem (null _pFileLock) is readable whatever the
// protection says
- bool readable = !(_nProt & EXDF_READ) || _pFileLock == 0;
+ bool readable = !(_nProt & EXDF_OTR_READ) || _pFileLock == 0;
return readable;
}
bool AmigaOSFilesystemNode::isWritable() const {
+ if (!_bIsValid)
+ return false;
+
// Regular RWED protection flags are low-active or inverted, thus the negation.
// moreover pseudo root filesystem (null _pFileLock) is never writable whatever
// the protection says (because of the pseudo nature)
- bool writable = !(_nProt & EXDF_WRITE) && _pFileLock !=0;
+ bool writable = !(_nProt & EXDF_OTR_WRITE) && _pFileLock !=0;
return writable;
}
@@ -367,8 +369,14 @@ AbstractFSList AmigaOSFilesystemNode::listVolumes() const {
dosList = IDOS->NextDosEntry(dosList, LDF_VOLUMES);
while (dosList) {
if (dosList->dol_Type == DLT_VOLUME &&
- dosList->dol_Name &&
- dosList->dol_Task) {
+ dosList->dol_Name) {
+
+ // Original was
+ // dosList->dol_Name &&
+ // dosList->dol_Task) {
+ // which errored using SDK 53.24 with a 'struct dosList' has no member called 'dol_Task'
+ // I removed dol_Task because it's not used anywhere else
+ // and it neither brought up further errors nor crashes or regressions.
// Copy name to buffer
IDOS->CopyStringBSTRToC(dosList->dol_Name, buffer, MAXPATHLEN);
diff --git a/backends/fs/amigaos4/amigaos4-fs.h b/backends/fs/amigaos4/amigaos4-fs.h
index c5ca61476f..bbe88b2716 100644
--- a/backends/fs/amigaos4/amigaos4-fs.h
+++ b/backends/fs/amigaos4/amigaos4-fs.h
@@ -17,6 +17,7 @@
* You should have received a copy of the GNU General Public 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 AMIGAOS_FILESYSTEM_H
@@ -43,7 +44,13 @@
*/
class AmigaOSFilesystemNode : public AbstractFSNode {
protected:
+ /**
+ * The main file lock.
+ * If this is NULL but _bIsValid is true, then this Node references
+ * the virtual filesystem root.
+ */
BPTR _pFileLock;
+
Common::String _sDisplayName;
Common::String _sPath;
bool _bIsDirectory;
diff --git a/backends/fs/ds/ds-fs-factory.cpp b/backends/fs/ds/ds-fs-factory.cpp
index 4e09c3446b..98c522f1d6 100644
--- a/backends/fs/ds/ds-fs-factory.cpp
+++ b/backends/fs/ds/ds-fs-factory.cpp
@@ -17,6 +17,7 @@
* You should have received a copy of the GNU General Public 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 for FILE as that is used in FLAC headers
diff --git a/backends/fs/ds/ds-fs-factory.h b/backends/fs/ds/ds-fs-factory.h
index ed5804b94a..7c42145518 100644
--- a/backends/fs/ds/ds-fs-factory.h
+++ b/backends/fs/ds/ds-fs-factory.h
@@ -17,6 +17,7 @@
* You should have received a copy of the GNU General Public 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 DS_FILESYSTEM_FACTORY_H
diff --git a/backends/fs/ds/ds-fs.cpp b/backends/fs/ds/ds-fs.cpp
index e3f282df05..3782caf432 100644
--- a/backends/fs/ds/ds-fs.cpp
+++ b/backends/fs/ds/ds-fs.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/backends/fs/ds/ds-fs.h b/backends/fs/ds/ds-fs.h
index 862f4c39d2..b9ccfcbe9c 100644
--- a/backends/fs/ds/ds-fs.h
+++ b/backends/fs/ds/ds-fs.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/backends/fs/fs-factory.h b/backends/fs/fs-factory.h
index 6d378955ec..fce82a9847 100644
--- a/backends/fs/fs-factory.h
+++ b/backends/fs/fs-factory.h
@@ -17,6 +17,7 @@
* You should have received a copy of the GNU General Public 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 FILESYSTEM_FACTORY_H
diff --git a/backends/fs/n64/n64-fs-factory.cpp b/backends/fs/n64/n64-fs-factory.cpp
index 5c588c5eb5..e662d6fd9b 100644
--- a/backends/fs/n64/n64-fs-factory.cpp
+++ b/backends/fs/n64/n64-fs-factory.cpp
@@ -17,6 +17,7 @@
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
*/
#ifdef __N64__
diff --git a/backends/fs/n64/n64-fs-factory.h b/backends/fs/n64/n64-fs-factory.h
index 5dec7c7eab..0a6ac8f41e 100644
--- a/backends/fs/n64/n64-fs-factory.h
+++ b/backends/fs/n64/n64-fs-factory.h
@@ -17,6 +17,7 @@
* You should have received a copy of the GNU General Public 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 N64_FILESYSTEM_FACTORY_H
diff --git a/backends/fs/n64/n64-fs.h b/backends/fs/n64/n64-fs.h
index d177cae9b4..d503a6601e 100644
--- a/backends/fs/n64/n64-fs.h
+++ b/backends/fs/n64/n64-fs.h
@@ -17,6 +17,7 @@
* You should have received a copy of the GNU General Public 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 N64_FILESYSTEM_H
diff --git a/backends/fs/n64/romfsstream.cpp b/backends/fs/n64/romfsstream.cpp
index 570f25932d..8661f8e9ab 100644
--- a/backends/fs/n64/romfsstream.cpp
+++ b/backends/fs/n64/romfsstream.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/backends/fs/n64/romfsstream.h b/backends/fs/n64/romfsstream.h
index b0f27db13e..7c64bce3f3 100644
--- a/backends/fs/n64/romfsstream.h
+++ b/backends/fs/n64/romfsstream.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/backends/fs/posix/posix-fs-factory.cpp b/backends/fs/posix/posix-fs-factory.cpp
index 776ea86155..d6266c78c9 100644
--- a/backends/fs/posix/posix-fs-factory.cpp
+++ b/backends/fs/posix/posix-fs-factory.cpp
@@ -17,6 +17,7 @@
* You should have received a copy of the GNU General Public 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(POSIX) || defined(PLAYSTATION3)
diff --git a/backends/fs/posix/posix-fs-factory.h b/backends/fs/posix/posix-fs-factory.h
index c7cec6fab5..7aedde5b01 100644
--- a/backends/fs/posix/posix-fs-factory.h
+++ b/backends/fs/posix/posix-fs-factory.h
@@ -17,6 +17,7 @@
* You should have received a copy of the GNU General Public 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 POSIX_FILESYSTEM_FACTORY_H
diff --git a/backends/fs/posix/posix-fs.cpp b/backends/fs/posix/posix-fs.cpp
index 320c5a6f39..4baf9f14fe 100644
--- a/backends/fs/posix/posix-fs.cpp
+++ b/backends/fs/posix/posix-fs.cpp
@@ -17,6 +17,7 @@
* You should have received a copy of the GNU General Public 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(POSIX) || defined(PLAYSTATION3)
diff --git a/backends/fs/posix/posix-fs.h b/backends/fs/posix/posix-fs.h
index e124829c02..bd07749010 100644
--- a/backends/fs/posix/posix-fs.h
+++ b/backends/fs/posix/posix-fs.h
@@ -17,6 +17,7 @@
* You should have received a copy of the GNU General Public 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 POSIX_FILESYSTEM_H
diff --git a/backends/fs/ps2/ps2-fs-factory.cpp b/backends/fs/ps2/ps2-fs-factory.cpp
index ef7b2013a3..9c12d27a6e 100644
--- a/backends/fs/ps2/ps2-fs-factory.cpp
+++ b/backends/fs/ps2/ps2-fs-factory.cpp
@@ -17,6 +17,7 @@
* You should have received a copy of the GNU General Public 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(__PLAYSTATION2__)
diff --git a/backends/fs/ps2/ps2-fs-factory.h b/backends/fs/ps2/ps2-fs-factory.h
index 9c6709cccf..d6745a64d3 100644
--- a/backends/fs/ps2/ps2-fs-factory.h
+++ b/backends/fs/ps2/ps2-fs-factory.h
@@ -17,6 +17,7 @@
* You should have received a copy of the GNU General Public 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 PS2_FILESYSTEM_FACTORY_H
diff --git a/backends/fs/ps2/ps2-fs.cpp b/backends/fs/ps2/ps2-fs.cpp
index 3a86cb3d9c..9b6e1270f1 100644
--- a/backends/fs/ps2/ps2-fs.cpp
+++ b/backends/fs/ps2/ps2-fs.cpp
@@ -17,13 +17,14 @@
* You should have received a copy of the GNU General Public 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(__PLAYSTATION2__)
-// Disable symbol overrides so that we can use system headers.
-#define FORBIDDEN_SYMBOL_ALLOW_ALL
-
+// Disable symbol overrides so that we can use "FILE"
+#define FORBIDDEN_SYMBOL_EXCEPTION_FILE
+#define FORBIDDEN_SYMBOL_EXCEPTION_printf
#include "backends/fs/ps2/ps2-fs.h"
@@ -57,13 +58,13 @@ const char *_lastPathComponent(const Common::String &str) {
cur++;
- // printf("lastPathComponent path=%s token=%s\n", start, cur);
+ // dbg_printf("lastPathComponent path=%s token=%s\n", start, cur);
return cur;
}
Ps2FilesystemNode::Ps2FilesystemNode() {
- printf("NEW FSNODE()\n");
+ dbg_printf("NEW FSNODE()\n");
_isHere = true;
_isDirectory = true;
@@ -74,7 +75,7 @@ Ps2FilesystemNode::Ps2FilesystemNode() {
}
Ps2FilesystemNode::Ps2FilesystemNode(const Common::String &path) {
- printf("NEW FSNODE(%s)\n", path.c_str());
+ dbg_printf("NEW FSNODE(%s)\n", path.c_str());
_path = path;
@@ -106,7 +107,7 @@ Ps2FilesystemNode::Ps2FilesystemNode(const Common::String &path) {
}
Ps2FilesystemNode::Ps2FilesystemNode(const Common::String &path, bool verify) {
- printf("NEW FSNODE(%s, %d)\n", path.c_str(), verify);
+ dbg_printf("NEW FSNODE(%s, %d)\n", path.c_str(), verify);
_path = path;
@@ -163,24 +164,24 @@ void Ps2FilesystemNode::doverify(void) {
_verified = true;
- printf(" verify: %s -> ", _path.c_str());
+ dbg_printf(" verify: %s -> ", _path.c_str());
#if 0
if (_path.empty()) {
- printf("PlayStation 2 Root !\n");
+ dbg_printf("PlayStation 2 Root !\n");
_verified = true;
return;
}
if (_path.lastChar() == ':') {
- printf("Dev: %s\n", _path.c_str());
+ dbg_printf("Dev: %s\n", _path.c_str());
_verified = true;
return;
}
#endif
if (_path[3] != ':' && _path[4] != ':') {
- printf("relative path !\n");
+ dbg_printf("relative path !\n");
_isHere = false;
_isDirectory = false;
return;
@@ -203,7 +204,7 @@ void Ps2FilesystemNode::doverify(void) {
fileXioWaitAsync(FXIO_WAIT, &fd);
if (!fd) {
- printf(" yes [stat]\n");
+ dbg_printf(" yes [stat]\n");
return true;
}
break;
@@ -217,11 +218,11 @@ void Ps2FilesystemNode::doverify(void) {
#if 1
fd = fio.open(_path.c_str(), O_RDONLY);
- printf("_path = %s -- fio.open -> %d\n", _path.c_str(), fd);
+ dbg_printf("_path = %s -- fio.open -> %d\n", _path.c_str(), fd);
if (fd >=0) {
fio.close(fd);
- printf(" yes [open]\n");
+ dbg_printf(" yes [open]\n");
_isHere = true;
if (medium==MC_DEV && _path.lastChar()=='/')
_isDirectory = true;
@@ -233,7 +234,7 @@ void Ps2FilesystemNode::doverify(void) {
fd = fio.dopen(_path.c_str());
if (fd >=0) {
fio.dclose(fd);
- printf(" yes [dopen]\n");
+ dbg_printf(" yes [dopen]\n");
_isHere = true;
_isDirectory = true;
return;
@@ -266,13 +267,13 @@ void Ps2FilesystemNode::doverify(void) {
_isHere = false;
_isDirectory = false;
- printf(" no\n");
+ dbg_printf(" no\n");
return;
}
AbstractFSNode *Ps2FilesystemNode::getChild(const Common::String &n) const {
- printf("getChild : %s\n", n.c_str());
+ dbg_printf("getChild : %s\n", n.c_str());
if (!_isDirectory)
return NULL;
@@ -327,13 +328,14 @@ AbstractFSNode *Ps2FilesystemNode::getChild(const Common::String &n) const {
bool Ps2FilesystemNode::getChildren(AbstractFSList &list, ListMode mode, bool hidden) const {
//TODO: honor the hidden flag
- // printf("getChildren\n");
+ // dbg_printf("getChildren\n");
if (!_isDirectory)
return false;
if (_isRoot) {
- list.push_back(new Ps2FilesystemNode("cdfs:"));
+ if (g_systemPs2->cdPresent())
+ list.push_back(new Ps2FilesystemNode("cdfs:"));
if (g_systemPs2->hddPresent())
list.push_back(new Ps2FilesystemNode("pfs0:"));
@@ -341,7 +343,7 @@ bool Ps2FilesystemNode::getChildren(AbstractFSList &list, ListMode mode, bool hi
if (g_systemPs2->usbMassPresent())
list.push_back(new Ps2FilesystemNode("mass:"));
- if (g_systemPs2->getBootDevice()==HOST_DEV || g_systemPs2->netPresent())
+ if (g_systemPs2->netPresent())
list.push_back(new Ps2FilesystemNode("host:"));
if (g_systemPs2->mcPresent())
@@ -356,7 +358,7 @@ bool Ps2FilesystemNode::getChildren(AbstractFSList &list, ListMode mode, bool hi
else
fd = fio.dopen(_path.c_str());
- // printf("dopen = %d\n", fd);
+ // dbg_printf("dopen = %d\n", fd);
if (fd >= 0) {
iox_dirent_t dirent;
@@ -398,7 +400,7 @@ bool Ps2FilesystemNode::getChildren(AbstractFSList &list, ListMode mode, bool hi
}
AbstractFSNode *Ps2FilesystemNode::getParent() const {
- // printf("Ps2FilesystemNode::getParent : path = %s\n", _path.c_str());
+ // dbg_printf("Ps2FilesystemNode::getParent : path = %s\n", _path.c_str());
if (_isRoot)
return new Ps2FilesystemNode(this); // FIXME : 0 ???
@@ -410,7 +412,7 @@ AbstractFSNode *Ps2FilesystemNode::getParent() const {
const char *end = _lastPathComponent(_path);
Common::String str(start, end - start);
- // printf(" parent = %s\n", str.c_str());
+ // dbg_printf(" parent = %s\n", str.c_str());
return new Ps2FilesystemNode(str, true);
}
diff --git a/backends/fs/ps2/ps2-fs.h b/backends/fs/ps2/ps2-fs.h
index df78f9f68a..63b866ba5b 100644
--- a/backends/fs/ps2/ps2-fs.h
+++ b/backends/fs/ps2/ps2-fs.h
@@ -17,6 +17,7 @@
* You should have received a copy of the GNU General Public 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 PS2_FILESYSTEM_H
@@ -69,12 +70,12 @@ public:
virtual Common::String getPath() const { return _path; }
virtual bool exists() const {
- // printf("%s : is %d\n", _path.c_str(), _isHere);
+ // dbg_printf("%s : is %d\n", _path.c_str(), _isHere);
return _isHere;
}
virtual bool isDirectory() const {
- // printf("%s : dir %d\n", _path.c_str(), _isDirectory);
+ // dbg_printf("%s : dir %d\n", _path.c_str(), _isDirectory);
return _isDirectory;
}
diff --git a/backends/fs/ps3/ps3-fs-factory.cpp b/backends/fs/ps3/ps3-fs-factory.cpp
index 3257246c50..565452596f 100644
--- a/backends/fs/ps3/ps3-fs-factory.cpp
+++ b/backends/fs/ps3/ps3-fs-factory.cpp
@@ -17,6 +17,7 @@
* You should have received a copy of the GNU General Public 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"
diff --git a/backends/fs/ps3/ps3-fs-factory.h b/backends/fs/ps3/ps3-fs-factory.h
index 6c1988b1c9..f7d54a90fd 100644
--- a/backends/fs/ps3/ps3-fs-factory.h
+++ b/backends/fs/ps3/ps3-fs-factory.h
@@ -17,6 +17,7 @@
* You should have received a copy of the GNU General Public 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
diff --git a/backends/fs/psp/psp-fs-factory.cpp b/backends/fs/psp/psp-fs-factory.cpp
index bb3aca8ee6..303ea242c5 100644
--- a/backends/fs/psp/psp-fs-factory.cpp
+++ b/backends/fs/psp/psp-fs-factory.cpp
@@ -17,6 +17,7 @@
* You should have received a copy of the GNU General Public 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(__PSP__)
diff --git a/backends/fs/psp/psp-fs-factory.h b/backends/fs/psp/psp-fs-factory.h
index d57c8fb655..26888487c2 100644
--- a/backends/fs/psp/psp-fs-factory.h
+++ b/backends/fs/psp/psp-fs-factory.h
@@ -17,6 +17,7 @@
* You should have received a copy of the GNU General Public 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 PSP_FILESYSTEM_FACTORY_H
diff --git a/backends/fs/psp/psp-fs.cpp b/backends/fs/psp/psp-fs.cpp
index 67f4cd59a7..e8aad9fa98 100644
--- a/backends/fs/psp/psp-fs.cpp
+++ b/backends/fs/psp/psp-fs.cpp
@@ -17,6 +17,7 @@
* You should have received a copy of the GNU General Public 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(__PSP__)
diff --git a/backends/fs/psp/psp-fs.h b/backends/fs/psp/psp-fs.h
index 146debb5f1..1bb4543d19 100644
--- a/backends/fs/psp/psp-fs.h
+++ b/backends/fs/psp/psp-fs.h
@@ -17,6 +17,7 @@
* You should have received a copy of the GNU General Public 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 PSP_FILESYSTEM_H
diff --git a/backends/fs/psp/psp-stream.cpp b/backends/fs/psp/psp-stream.cpp
index da5a46eedb..c9b2fc7d8c 100644
--- a/backends/fs/psp/psp-stream.cpp
+++ b/backends/fs/psp/psp-stream.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/backends/fs/psp/psp-stream.h b/backends/fs/psp/psp-stream.h
index 395b27392d..734cb66184 100644
--- a/backends/fs/psp/psp-stream.h
+++ b/backends/fs/psp/psp-stream.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/backends/fs/stdiostream.cpp b/backends/fs/stdiostream.cpp
index 3ea0f9898b..8206bd180f 100644
--- a/backends/fs/stdiostream.cpp
+++ b/backends/fs/stdiostream.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/backends/fs/stdiostream.h b/backends/fs/stdiostream.h
index 1d45600d9c..f2495feac8 100644
--- a/backends/fs/stdiostream.h
+++ b/backends/fs/stdiostream.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/backends/fs/symbian/symbian-fs-factory.cpp b/backends/fs/symbian/symbian-fs-factory.cpp
index 7a60109742..311a0bfd82 100644
--- a/backends/fs/symbian/symbian-fs-factory.cpp
+++ b/backends/fs/symbian/symbian-fs-factory.cpp
@@ -17,6 +17,7 @@
* You should have received a copy of the GNU General Public 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(__SYMBIAN32__)
diff --git a/backends/fs/symbian/symbian-fs-factory.h b/backends/fs/symbian/symbian-fs-factory.h
index b99d3fb0ec..940b58e22f 100644
--- a/backends/fs/symbian/symbian-fs-factory.h
+++ b/backends/fs/symbian/symbian-fs-factory.h
@@ -17,6 +17,7 @@
* You should have received a copy of the GNU General Public 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 SYMBIAN_FILESYSTEM_FACTORY_H
diff --git a/backends/fs/symbian/symbian-fs.cpp b/backends/fs/symbian/symbian-fs.cpp
index 7a652fa43c..8fbc3a402a 100644
--- a/backends/fs/symbian/symbian-fs.cpp
+++ b/backends/fs/symbian/symbian-fs.cpp
@@ -17,6 +17,7 @@
* You should have received a copy of the GNU General Public 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(__SYMBIAN32__)
diff --git a/backends/fs/symbian/symbian-fs.h b/backends/fs/symbian/symbian-fs.h
index 0db9a88940..339e998a28 100644
--- a/backends/fs/symbian/symbian-fs.h
+++ b/backends/fs/symbian/symbian-fs.h
@@ -17,6 +17,7 @@
* You should have received a copy of the GNU General Public 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 SYMBIAN_FILESYSTEM_H
diff --git a/backends/fs/symbian/symbianstream.cpp b/backends/fs/symbian/symbianstream.cpp
index fa7842d3b1..549bc54452 100644
--- a/backends/fs/symbian/symbianstream.cpp
+++ b/backends/fs/symbian/symbianstream.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/backends/fs/symbian/symbianstream.h b/backends/fs/symbian/symbianstream.h
index 3ca612e39b..f0ec095fea 100644
--- a/backends/fs/symbian/symbianstream.h
+++ b/backends/fs/symbian/symbianstream.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/backends/fs/wii/wii-fs-factory.cpp b/backends/fs/wii/wii-fs-factory.cpp
index 760e5316e7..f234c1e300 100644
--- a/backends/fs/wii/wii-fs-factory.cpp
+++ b/backends/fs/wii/wii-fs-factory.cpp
@@ -33,6 +33,9 @@
#ifdef USE_WII_DI
#include <di/di.h>
#include <iso9660.h>
+#ifdef GAMECUBE
+#include <ogc/dvd.h>
+#endif
#endif
#ifdef USE_WII_SMB
@@ -125,6 +128,14 @@ bool WiiFilesystemFactory::failedToMount(FileSystemType type) {
return false;
}
+#ifdef USE_WII_DI
+#ifndef GAMECUBE
+ const DISC_INTERFACE* dvd = &__io_wiidvd;
+#else
+ const DISC_INTERFACE* dvd = &__io_gcdvd;
+#endif
+#endif
+
void WiiFilesystemFactory::mount(FileSystemType type) {
switch (type) {
case kDVD:
@@ -133,7 +144,7 @@ void WiiFilesystemFactory::mount(FileSystemType type) {
break;
printf("mount dvd\n");
- if (ISO9660_Mount()) {
+ if (ISO9660_Mount("dvd", dvd)) {
_dvdMounted = true;
_dvdError = false;
printf("ISO9660 mounted\n");
@@ -179,7 +190,7 @@ void WiiFilesystemFactory::umount(FileSystemType type) {
printf("umount dvd\n");
- ISO9660_Unmount();
+ ISO9660_Unmount("dvd:");
_dvdMounted = false;
_dvdError = false;
diff --git a/backends/fs/wii/wii-fs.cpp b/backends/fs/wii/wii-fs.cpp
index 4a19e18240..43f4f592b7 100644
--- a/backends/fs/wii/wii-fs.cpp
+++ b/backends/fs/wii/wii-fs.cpp
@@ -80,9 +80,9 @@ void WiiFilesystemNode::clearFlags() {
void WiiFilesystemNode::setFlags(const struct stat *st) {
_exists = true;
- _isDirectory = S_ISDIR(st->st_mode);
- _isReadable = (st->st_mode & S_IRUSR) > 0;
- _isWritable = (st->st_mode & S_IWUSR) > 0;
+ _isDirectory = ( (st->st_mode & S_IFDIR) != 0 );
+ _isReadable = ( (st->st_mode & S_IRUSR) != 0 );
+ _isWritable = ( (st->st_mode & S_IWUSR) != 0 );
}
WiiFilesystemNode::WiiFilesystemNode() {
@@ -106,7 +106,7 @@ WiiFilesystemNode::WiiFilesystemNode(const Common::String &p) {
_displayName = lastPathComponent(_path, '/');
struct stat st;
- if (!stat(_path.c_str(), &st))
+ if(stat(_path.c_str(), &st) != -1)
setFlags(&st);
else
clearFlags();
@@ -152,33 +152,45 @@ bool WiiFilesystemNode::getChildren(AbstractFSList &list, ListMode mode, bool hi
if (_path.empty())
return getDevopChildren(list, mode, hidden);
- DIR_ITER* dp = diropen (_path.c_str());
+ DIR* dp = opendir (_path.c_str());
+ DIR* tmpdir;
if (dp == NULL)
return false;
- char filename[MAXPATHLEN];
- struct stat st;
+ struct dirent *pent;
- while (dirnext(dp, filename, &st) == 0) {
- if (strcmp(filename, ".") == 0 || strcmp(filename, "..") == 0)
+ while ((pent = readdir(dp)) != NULL) {
+ if (strcmp(pent->d_name, ".") == 0 || strcmp(pent->d_name, "..") == 0)
continue;
Common::String newPath(_path);
if (newPath.lastChar() != '/')
- newPath += '/';
- newPath += filename;
-
- bool isDir = S_ISDIR(st.st_mode);
-
+ newPath += '/';
+ newPath += pent->d_name;
+
+ bool isDir = false;
+ tmpdir = opendir(newPath.c_str());
+ if(tmpdir)
+ {
+ isDir = true;
+ closedir(tmpdir);
+ }
+
if ((mode == Common::FSNode::kListFilesOnly && isDir) ||
(mode == Common::FSNode::kListDirectoriesOnly && !isDir))
continue;
-
+
+ struct stat st;
+ st.st_mode = 0;
+ st.st_mode |= ( isDir ? S_IFDIR : 0 );
+ st.st_mode |= S_IRUSR;
+ st.st_mode |= S_IWUSR;
+
list.push_back(new WiiFilesystemNode(newPath, &st));
}
- dirclose(dp);
+ closedir(dp);
return true;
}
diff --git a/backends/fs/wii/wii-fs.h b/backends/fs/wii/wii-fs.h
index 11679d0c36..c77c543dae 100644
--- a/backends/fs/wii/wii-fs.h
+++ b/backends/fs/wii/wii-fs.h
@@ -17,6 +17,7 @@
* You should have received a copy of the GNU General Public 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 WII_FILESYSTEM_H
@@ -51,7 +52,7 @@ public:
*
* @param path Common::String with the path the new node should point to.
*/
- WiiFilesystemNode(const Common::String &path);
+ WiiFilesystemNode(const Common::String &p);
WiiFilesystemNode(const Common::String &p, const struct stat *st);
virtual bool exists() const;
diff --git a/backends/fs/windows/windows-fs-factory.cpp b/backends/fs/windows/windows-fs-factory.cpp
index 46df253748..9d1b13a0c9 100644
--- a/backends/fs/windows/windows-fs-factory.cpp
+++ b/backends/fs/windows/windows-fs-factory.cpp
@@ -17,6 +17,7 @@
* You should have received a copy of the GNU General Public 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(WIN32)
diff --git a/backends/fs/windows/windows-fs-factory.h b/backends/fs/windows/windows-fs-factory.h
index e7c70f1b55..b5df5406a8 100644
--- a/backends/fs/windows/windows-fs-factory.h
+++ b/backends/fs/windows/windows-fs-factory.h
@@ -17,6 +17,7 @@
* You should have received a copy of the GNU General Public 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 WINDOWS_FILESYSTEM_FACTORY_H
diff --git a/backends/fs/windows/windows-fs.cpp b/backends/fs/windows/windows-fs.cpp
index 030f394f81..49549b83cb 100644
--- a/backends/fs/windows/windows-fs.cpp
+++ b/backends/fs/windows/windows-fs.cpp
@@ -17,6 +17,7 @@
* You should have received a copy of the GNU General Public 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(WIN32)
diff --git a/backends/fs/windows/windows-fs.h b/backends/fs/windows/windows-fs.h
index 351307bef0..d06044603a 100644
--- a/backends/fs/windows/windows-fs.h
+++ b/backends/fs/windows/windows-fs.h
@@ -17,6 +17,7 @@
* You should have received a copy of the GNU General Public 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 WINDOWS_FILESYSTEM_H
diff --git a/backends/graphics/default-palette.h b/backends/graphics/default-palette.h
index 8f3fcb2db1..a66e1862b7 100644
--- a/backends/graphics/default-palette.h
+++ b/backends/graphics/default-palette.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/backends/graphics/dinguxsdl/dinguxsdl-graphics.cpp b/backends/graphics/dinguxsdl/dinguxsdl-graphics.cpp
index bd87c9fafd..343efa4da6 100644
--- a/backends/graphics/dinguxsdl/dinguxsdl-graphics.cpp
+++ b/backends/graphics/dinguxsdl/dinguxsdl-graphics.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/backends/graphics/dinguxsdl/dinguxsdl-graphics.h b/backends/graphics/dinguxsdl/dinguxsdl-graphics.h
index ecdd01d166..fc70e721cf 100644
--- a/backends/graphics/dinguxsdl/dinguxsdl-graphics.h
+++ b/backends/graphics/dinguxsdl/dinguxsdl-graphics.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/backends/graphics/gph/gph-graphics.cpp b/backends/graphics/gph/gph-graphics.cpp
index 92553564bf..247e5ed490 100644
--- a/backends/graphics/gph/gph-graphics.cpp
+++ b/backends/graphics/gph/gph-graphics.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/backends/graphics/gph/gph-graphics.h b/backends/graphics/gph/gph-graphics.h
index f1f3d18b41..4a68ea6eed 100644
--- a/backends/graphics/gph/gph-graphics.h
+++ b/backends/graphics/gph/gph-graphics.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/backends/graphics/graphics.h b/backends/graphics/graphics.h
index 24397228e6..3671b9f0b9 100644
--- a/backends/graphics/graphics.h
+++ b/backends/graphics/graphics.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/backends/graphics/linuxmotosdl/linuxmotosdl-graphics.cpp b/backends/graphics/linuxmotosdl/linuxmotosdl-graphics.cpp
index a005d74919..22b271ae1a 100644
--- a/backends/graphics/linuxmotosdl/linuxmotosdl-graphics.cpp
+++ b/backends/graphics/linuxmotosdl/linuxmotosdl-graphics.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/backends/graphics/linuxmotosdl/linuxmotosdl-graphics.h b/backends/graphics/linuxmotosdl/linuxmotosdl-graphics.h
index ee2a566d71..8760c5004d 100644
--- a/backends/graphics/linuxmotosdl/linuxmotosdl-graphics.h
+++ b/backends/graphics/linuxmotosdl/linuxmotosdl-graphics.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/backends/graphics/maemosdl/maemosdl-graphics.cpp b/backends/graphics/maemosdl/maemosdl-graphics.cpp
index 527ef82b9d..07d6d32d3a 100644
--- a/backends/graphics/maemosdl/maemosdl-graphics.cpp
+++ b/backends/graphics/maemosdl/maemosdl-graphics.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/backends/graphics/maemosdl/maemosdl-graphics.h b/backends/graphics/maemosdl/maemosdl-graphics.h
index 81064d2d5f..c255e94653 100644
--- a/backends/graphics/maemosdl/maemosdl-graphics.h
+++ b/backends/graphics/maemosdl/maemosdl-graphics.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/backends/graphics/null/null-graphics.h b/backends/graphics/null/null-graphics.h
index 276be7d3fa..67306c29f3 100644
--- a/backends/graphics/null/null-graphics.h
+++ b/backends/graphics/null/null-graphics.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/backends/graphics/opengl/debug.cpp b/backends/graphics/opengl/debug.cpp
new file mode 100644
index 0000000000..d5d73fb5ec
--- /dev/null
+++ b/backends/graphics/opengl/debug.cpp
@@ -0,0 +1,65 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ */
+
+#include "backends/graphics/opengl/debug.h"
+#include "backends/graphics/opengl/opengl-sys.h"
+
+#include "common/str.h"
+#include "common/textconsole.h"
+
+#ifdef OPENGL_DEBUG
+
+namespace OpenGL {
+
+namespace {
+Common::String getGLErrStr(GLenum error) {
+ switch (error) {
+ case GL_INVALID_ENUM:
+ return "GL_INVALID_ENUM";
+ case GL_INVALID_VALUE:
+ return "GL_INVALID_VALUE";
+ case GL_INVALID_OPERATION:
+ return "GL_INVALID_OPERATION";
+ case GL_STACK_OVERFLOW:
+ return "GL_STACK_OVERFLOW";
+ case GL_STACK_UNDERFLOW:
+ return "GL_STACK_UNDERFLOW";
+ case GL_OUT_OF_MEMORY:
+ return "GL_OUT_OF_MEMORY";
+ }
+
+ return Common::String::format("(Unknown GL error code 0x%X)", error);
+}
+} // End of anonymous namespace
+
+void checkGLError(const char *expr, const char *file, int line) {
+ GLenum error;
+
+ while ((error = glGetError()) != GL_NO_ERROR) {
+ // We cannot use error here because we do not know whether we have a
+ // working screen or not.
+ warning("GL ERROR: %s on %s (%s:%d)", getGLErrStr(error).c_str(), expr, file, line);
+ }
+}
+} // End of namespace OpenGL
+
+#endif
diff --git a/backends/graphics/opengl/debug.h b/backends/graphics/opengl/debug.h
new file mode 100644
index 0000000000..ff6b678870
--- /dev/null
+++ b/backends/graphics/opengl/debug.h
@@ -0,0 +1,39 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public 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_OPENGL_DEBUG_H
+#define BACKENDS_GRAPHICS_OPENGL_DEBUG_H
+
+#define OPENGL_DEBUG
+
+#ifdef OPENGL_DEBUG
+
+namespace OpenGL {
+void checkGLError(const char *expr, const char *file, int line);
+} // End of namespace OpenGL
+
+#define GLCALL(x) do { (x); OpenGL::checkGLError(#x, __FILE__, __LINE__); } while (false)
+#else
+#define GLCALL(x) do { (x); } while (false)
+#endif
+
+#endif
diff --git a/backends/graphics/opengl/extensions.cpp b/backends/graphics/opengl/extensions.cpp
new file mode 100644
index 0000000000..4482ef82b5
--- /dev/null
+++ b/backends/graphics/opengl/extensions.cpp
@@ -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.
+ *
+ */
+
+#include "backends/graphics/opengl/extensions.h"
+#include "backends/graphics/opengl/opengl-sys.h"
+
+#include "common/tokenizer.h"
+
+namespace OpenGL {
+
+bool g_extNPOTSupported = false;
+
+void initializeGLExtensions() {
+ const char *extString = (const char *)glGetString(GL_EXTENSIONS);
+
+ // Initialize default state.
+ g_extNPOTSupported = false;
+
+ Common::StringTokenizer tokenizer(extString, " ");
+ while (!tokenizer.empty()) {
+ Common::String token = tokenizer.nextToken();
+
+ if (token == "GL_ARB_texture_non_power_of_two") {
+ g_extNPOTSupported = true;
+ }
+ }
+}
+
+} // End of namespace OpenGL
diff --git a/backends/graphics/opengl/extensions.h b/backends/graphics/opengl/extensions.h
new file mode 100644
index 0000000000..87452429e2
--- /dev/null
+++ b/backends/graphics/opengl/extensions.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.
+ *
+ */
+
+#ifndef BACKENDS_GRAPHICS_OPENGL_EXTENSIONS_H
+#define BACKENDS_GRAPHICS_OPENGL_EXTENSIONS_H
+
+namespace OpenGL {
+
+/**
+ * Checks for availability of extensions we want to use and initializes them
+ * when available.
+ */
+void initializeGLExtensions();
+
+/**
+ * Whether non power of two textures are supported
+ */
+extern bool g_extNPOTSupported;
+
+} // End of namespace OpenGL
+
+#endif
diff --git a/backends/graphics/opengl/gltexture.cpp b/backends/graphics/opengl/gltexture.cpp
deleted file mode 100644
index ca674563df..0000000000
--- a/backends/graphics/opengl/gltexture.cpp
+++ /dev/null
@@ -1,225 +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 "common/scummsys.h"
-
-#if defined(USE_OPENGL)
-
-#include "backends/graphics/opengl/gltexture.h"
-#include "backends/graphics/opengl/glerrorcheck.h"
-
-#include "common/rect.h"
-#include "common/array.h"
-#include "common/util.h"
-#include "common/tokenizer.h"
-
-// Supported GL extensions
-static bool npot_supported = false;
-static bool glext_inited = false;
-
-/*static inline GLint xdiv(int numerator, int denominator) {
- assert(numerator < (1 << 16));
- return (numerator << 16) / denominator;
-}*/
-
-static GLuint nextHigher2(GLuint v) {
- if (v == 0)
- return 1;
- v--;
- v |= v >> 1;
- v |= v >> 2;
- v |= v >> 4;
- v |= v >> 8;
- v |= v >> 16;
- return ++v;
-}
-
-void GLTexture::initGLExtensions() {
-
- // Return if extensions were already checked
- if (glext_inited)
- return;
-
- // Get a string with all extensions
- const char *ext_string = (const char *)glGetString(GL_EXTENSIONS);
- CHECK_GL_ERROR();
- Common::StringTokenizer tokenizer(ext_string, " ");
- // Iterate all string tokens
- while (!tokenizer.empty()) {
- Common::String token = tokenizer.nextToken();
- if (token == "GL_ARB_texture_non_power_of_two")
- npot_supported = true;
- }
-
- glext_inited = true;
-}
-
-GLTexture::GLTexture(byte bpp, GLenum internalFormat, GLenum format, GLenum type)
- :
- _bytesPerPixel(bpp),
- _internalFormat(internalFormat),
- _glFormat(format),
- _glType(type),
- _textureWidth(0),
- _textureHeight(0),
- _realWidth(0),
- _realHeight(0),
- _refresh(false),
- _filter(GL_NEAREST) {
-
- // Generate the texture ID
- glGenTextures(1, &_textureName); CHECK_GL_ERROR();
-}
-
-GLTexture::~GLTexture() {
- // Delete the texture
- glDeleteTextures(1, &_textureName); CHECK_GL_ERROR();
-}
-
-void GLTexture::refresh() {
- // Delete previous texture
- glDeleteTextures(1, &_textureName); CHECK_GL_ERROR();
-
- // Generate the texture ID
- glGenTextures(1, &_textureName); CHECK_GL_ERROR();
- _refresh = true;
-}
-
-void GLTexture::allocBuffer(GLuint w, GLuint h) {
- _realWidth = w;
- _realHeight = h;
-
- if (!_refresh) {
- if (npot_supported && _filter == GL_LINEAR) {
- // Check if we already allocated a correctly-sized buffer
- // This is so we don't need to duplicate the last row/column
- if (w == _textureWidth && h == _textureHeight)
- return;
- } else {
- // Check if we already have a large enough buffer
- if (w <= _textureWidth && h <= _textureHeight)
- return;
- }
- }
-
- if (npot_supported) {
- _textureWidth = w;
- _textureHeight = h;
- } else {
- _textureWidth = nextHigher2(w);
- _textureHeight = nextHigher2(h);
- }
-
- // Select this OpenGL texture
- glBindTexture(GL_TEXTURE_2D, _textureName); CHECK_GL_ERROR();
-
- // Set the texture parameters
- glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, _filter); CHECK_GL_ERROR();
- glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, _filter); CHECK_GL_ERROR();
- glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); CHECK_GL_ERROR();
- glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); CHECK_GL_ERROR();
-
- // Allocate room for the texture
- glTexImage2D(GL_TEXTURE_2D, 0, _internalFormat,
- _textureWidth, _textureHeight, 0, _glFormat, _glType, NULL); CHECK_GL_ERROR();
-
- _refresh = false;
-}
-
-void GLTexture::updateBuffer(const void *buf, int pitch, GLuint x, GLuint y, GLuint w, GLuint h) {
- // Skip empty updates.
- if (w * h == 0)
- return;
-
- // Select this OpenGL texture
- glBindTexture(GL_TEXTURE_2D, _textureName); CHECK_GL_ERROR();
-
- // Check if the buffer has its data contiguously
- if ((int)w * _bytesPerPixel == pitch) {
- glTexSubImage2D(GL_TEXTURE_2D, 0, x, y, w, h,
- _glFormat, _glType, buf); CHECK_GL_ERROR();
- } else {
- // Update the texture row by row
- const byte *src = (const byte *)buf;
- GLuint curY = y;
- GLuint height = h;
- do {
- glTexSubImage2D(GL_TEXTURE_2D, 0, x, curY,
- w, 1, _glFormat, _glType, src); CHECK_GL_ERROR();
- curY++;
- src += pitch;
- } while (--height);
- }
-
- // If we're in linear filter mode, repeat the last row/column if the real dimensions
- // doesn't match the texture dimensions.
- if (_filter == GL_LINEAR) {
- if (_realWidth != _textureWidth && x + w == _realWidth) {
- const byte *src = (const byte *)buf + (w - 1) * _bytesPerPixel;
- GLuint curY = y;
- GLuint height = h;
-
- do {
- glTexSubImage2D(GL_TEXTURE_2D, 0, x + w,
- curY, 1, 1, _glFormat, _glType, src); CHECK_GL_ERROR();
-
- curY++;
- src += pitch;
- } while (--height);
- }
-
- if (_realHeight != _textureHeight && y + h == _realHeight) {
- glTexSubImage2D(GL_TEXTURE_2D, 0, x, y + h,
- w, 1, _glFormat, _glType, (const byte *)buf + pitch * (h - 1)); CHECK_GL_ERROR();
- }
- }
-}
-
-void GLTexture::drawTexture(GLshort x, GLshort y, GLshort w, GLshort h) {
- // Select this OpenGL texture
- glBindTexture(GL_TEXTURE_2D, _textureName); CHECK_GL_ERROR();
-
- // Calculate the texture rect that will be drawn
- const GLfloat texWidth = (GLfloat)_realWidth / _textureWidth;//xdiv(_surface.w, _textureWidth);
- const GLfloat texHeight = (GLfloat)_realHeight / _textureHeight;//xdiv(_surface.h, _textureHeight);
- const GLfloat texcoords[] = {
- 0, 0,
- texWidth, 0,
- 0, texHeight,
- texWidth, texHeight,
- };
- glTexCoordPointer(2, GL_FLOAT, 0, texcoords); CHECK_GL_ERROR();
-
- // Calculate the screen rect where the texture will be drawn
- const GLshort vertices[] = {
- x, y,
- (GLshort)(x + w), y,
- x, (GLshort)(y + h),
- (GLshort)(x + w), (GLshort)(y + h),
- };
- glVertexPointer(2, GL_SHORT, 0, vertices); CHECK_GL_ERROR();
-
- // Draw the texture to the screen buffer
- glDrawArrays(GL_TRIANGLE_STRIP, 0, 4); CHECK_GL_ERROR();
-}
-
-#endif
diff --git a/backends/graphics/opengl/gltexture.h b/backends/graphics/opengl/gltexture.h
deleted file mode 100644
index 6ef80923ae..0000000000
--- a/backends/graphics/opengl/gltexture.h
+++ /dev/null
@@ -1,131 +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 BACKENDS_GRAPHICS_OPENGL_GLTEXTURE_H
-#define BACKENDS_GRAPHICS_OPENGL_GLTEXTURE_H
-
-#include "common/scummsys.h"
-
-#ifdef WIN32
-#if defined(ARRAYSIZE) && !defined(_WINDOWS_)
-#undef ARRAYSIZE
-#endif
-#define WIN32_LEAN_AND_MEAN
-#include <windows.h>
-#undef ARRAYSIZE
-#endif
-
-// 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(TIZEN)
-#include <FGraphicsOpengl.h>
-using namespace Tizen::Graphics::Opengl;
-#elif defined(USE_GLES)
-#include <GLES/gl.h>
-#elif defined(SDL_BACKEND)
-#include <SDL_opengl.h>
-#else
-#include <GL/gl.h>
-#endif
-
-#include "graphics/surface.h"
-
-/**
- * OpenGL texture manager class
- */
-class GLTexture {
-public:
- /**
- * Initialize OpenGL Extensions
- */
- static void initGLExtensions();
-
- GLTexture(byte bpp, GLenum internalFormat, GLenum format, GLenum type);
- ~GLTexture();
-
- /**
- * Refresh the texture after a context change. The
- * process will be completed on next allocBuffer call.
- */
- void refresh();
-
- /**
- * Allocates memory needed for the given size.
- */
- void allocBuffer(GLuint width, GLuint height);
-
- /**
- * Updates the texture pixels.
- */
- void updateBuffer(const void *buf, int pitch, GLuint x, GLuint y,
- GLuint w, GLuint h);
-
- /**
- * Draws the texture to the screen buffer.
- */
- void drawTexture(GLshort x, GLshort y, GLshort w, GLshort h);
-
- /**
- * Get the texture width.
- */
- GLuint getWidth() const { return _realWidth; }
-
- /**
- * Get the texture height.
- */
- GLuint getHeight() const { return _realHeight; }
-
- /**
- * Get the bytes per pixel.
- */
- uint getBytesPerPixel() const { return _bytesPerPixel; }
-
- /**
- * Set the texture filter.
- * @filter the filter type, GL_NEAREST or GL_LINEAR
- */
- void setFilter(GLint filter) { _filter = filter; }
-
-private:
- const byte _bytesPerPixel;
- const GLenum _internalFormat;
- const GLenum _glFormat;
- const GLenum _glType;
-
- GLuint _realWidth;
- GLuint _realHeight;
- GLuint _textureName;
- GLuint _textureWidth;
- GLuint _textureHeight;
- GLint _filter;
- bool _refresh;
-};
-
-#endif
diff --git a/backends/graphics/opengl/opengl-graphics.cpp b/backends/graphics/opengl/opengl-graphics.cpp
index 84be83d524..cbd06e9161 100644
--- a/backends/graphics/opengl/opengl-graphics.cpp
+++ b/backends/graphics/opengl/opengl-graphics.cpp
@@ -8,102 +8,90 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public 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(USE_OPENGL)
#include "backends/graphics/opengl/opengl-graphics.h"
-#include "backends/graphics/opengl/glerrorcheck.h"
-#include "common/config-manager.h"
-#include "common/file.h"
-#include "common/mutex.h"
+#include "backends/graphics/opengl/texture.h"
+#include "backends/graphics/opengl/debug.h"
+#include "backends/graphics/opengl/extensions.h"
+
#include "common/textconsole.h"
#include "common/translation.h"
+#include "common/algorithm.h"
+#include "common/file.h"
#ifdef USE_OSD
#include "common/tokenizer.h"
+#include "common/rect.h"
#endif
-#include "graphics/font.h"
+
+#include "graphics/conversion.h"
+#ifdef USE_OSD
#include "graphics/fontman.h"
+#include "graphics/font.h"
+#endif
+
+namespace OpenGL {
OpenGLGraphicsManager::OpenGLGraphicsManager()
- :
+ : _currentState(), _oldState(), _transactionMode(kTransactionNone), _screenChangeID(1 << (sizeof(int) * 8 - 2)),
+ _outputScreenWidth(0), _outputScreenHeight(0), _displayX(0), _displayY(0),
+ _displayWidth(0), _displayHeight(0), _defaultFormat(), _defaultFormatAlpha(),
+ _gameScreen(nullptr), _gameScreenShakeOffset(0), _overlay(nullptr),
+ _overlayVisible(false), _cursor(nullptr),
+ _cursorX(0), _cursorY(0), _cursorHotspotX(0), _cursorHotspotY(0), _cursorHotspotXScaled(0),
+ _cursorHotspotYScaled(0), _cursorWidthScaled(0), _cursorHeightScaled(0), _cursorKeyColor(0),
+ _cursorVisible(false), _cursorDontScale(false), _cursorPaletteEnabled(false)
#ifdef USE_OSD
- _osdTexture(0), _osdAlpha(0), _osdFadeStartTime(0), _requireOSDUpdate(false),
+ , _osdAlpha(0), _osdFadeStartTime(0), _osd(nullptr)
#endif
- _gameTexture(0), _overlayTexture(0), _cursorTexture(0),
- _screenChangeCount(1 << (sizeof(int) * 8 - 2)), _screenNeedsRedraw(false),
- _shakePos(0),
- _overlayVisible(false), _overlayNeedsRedraw(false),
- _transactionMode(kTransactionNone),
- _cursorNeedsRedraw(false), _cursorPaletteDisabled(true),
- _cursorVisible(false), _cursorKeyColor(0),
- _cursorDontScale(false),
- _formatBGR(false),
- _displayX(0), _displayY(0), _displayWidth(0), _displayHeight(0) {
-
- memset(&_oldVideoMode, 0, sizeof(_oldVideoMode));
- memset(&_videoMode, 0, sizeof(_videoMode));
- memset(&_transactionDetails, 0, sizeof(_transactionDetails));
-
- _videoMode.mode = OpenGL::GFX_NORMAL;
- _videoMode.scaleFactor = 2;
- _videoMode.fullscreen = ConfMan.getBool("fullscreen");
- _videoMode.antialiasing = false;
-
- _gamePalette = (byte *)calloc(sizeof(byte) * 3, 256);
- _cursorPalette = (byte *)calloc(sizeof(byte) * 3, 256);
+ {
+ memset(_gamePalette, 0, sizeof(_gamePalette));
}
OpenGLGraphicsManager::~OpenGLGraphicsManager() {
- free(_gamePalette);
- free(_cursorPalette);
-
- _screenData.free();
- _overlayData.free();
- _cursorData.free();
- _osdSurface.free();
-
- delete _gameTexture;
- delete _overlayTexture;
- delete _cursorTexture;
+ delete _gameScreen;
+ delete _overlay;
+ delete _cursor;
+#ifdef USE_OSD
+ delete _osd;
+#endif
}
-//
-// Feature
-//
-
bool OpenGLGraphicsManager::hasFeature(OSystem::Feature f) {
- return
- (f == OSystem::kFeatureAspectRatioCorrection) ||
- (f == OSystem::kFeatureCursorPalette);
+ switch (f) {
+ case OSystem::kFeatureAspectRatioCorrection:
+ case OSystem::kFeatureCursorPalette:
+ return true;
+
+ case OSystem::kFeatureOverlaySupportsAlpha:
+ return _defaultFormatAlpha.aBits() > 3;
+
+ default:
+ return false;
+ }
}
void OpenGLGraphicsManager::setFeatureState(OSystem::Feature f, bool enable) {
switch (f) {
- case OSystem::kFeatureFullscreenMode:
- setFullscreenMode(enable);
- break;
-
case OSystem::kFeatureAspectRatioCorrection:
- _videoMode.aspectRatioCorrection = enable;
- _transactionDetails.needRefresh = true;
+ assert(_transactionMode != kTransactionNone);
+ _currentState.aspectRatioCorrection = enable;
break;
case OSystem::kFeatureCursorPalette:
- _cursorPaletteDisabled = !enable;
- _cursorNeedsRedraw = true;
+ _cursorPaletteEnabled = enable;
+ updateCursorPalette();
break;
default:
@@ -113,1189 +101,1038 @@ void OpenGLGraphicsManager::setFeatureState(OSystem::Feature f, bool enable) {
bool OpenGLGraphicsManager::getFeatureState(OSystem::Feature f) {
switch (f) {
- case OSystem::kFeatureFullscreenMode:
- return _videoMode.fullscreen;
-
case OSystem::kFeatureAspectRatioCorrection:
- return _videoMode.aspectRatioCorrection;
+ return _currentState.aspectRatioCorrection;
case OSystem::kFeatureCursorPalette:
- return !_cursorPaletteDisabled;
+ return _cursorPaletteEnabled;
default:
return false;
}
}
-//
-// Screen format and modes
-//
+namespace {
-static const OSystem::GraphicsMode s_supportedGraphicsModes[] = {
- {"gl1", _s("OpenGL Normal"), OpenGL::GFX_NORMAL},
- {"gl2", _s("OpenGL Conserve"), OpenGL::GFX_CONSERVE},
- {"gl4", _s("OpenGL Original"), OpenGL::GFX_ORIGINAL},
- {0, 0, 0}
+const OSystem::GraphicsMode glGraphicsModes[] = {
+ { "opengl_linear", _s("OpenGL"), GFX_LINEAR },
+ { "opengl_nearest", _s("OpenGL (No filtering)"), GFX_NEAREST },
+ { nullptr, nullptr, 0 }
};
-const OSystem::GraphicsMode *OpenGLGraphicsManager::supportedGraphicsModes() {
- return s_supportedGraphicsModes;
-}
+} // End of anonymous namespace
const OSystem::GraphicsMode *OpenGLGraphicsManager::getSupportedGraphicsModes() const {
- return s_supportedGraphicsModes;
+ return glGraphicsModes;
}
int OpenGLGraphicsManager::getDefaultGraphicsMode() const {
- return OpenGL::GFX_NORMAL;
+ return GFX_LINEAR;
}
bool OpenGLGraphicsManager::setGraphicsMode(int mode) {
- assert(_transactionMode == kTransactionActive);
+ assert(_transactionMode != kTransactionNone);
- setScale(2);
+ switch (mode) {
+ case GFX_LINEAR:
+ case GFX_NEAREST:
+ _currentState.graphicsMode = mode;
+
+ if (_gameScreen) {
+ _gameScreen->enableLinearFiltering(mode == GFX_LINEAR);
+ }
+
+ if (_cursor) {
+ _cursor->enableLinearFiltering(mode == GFX_LINEAR);
+ }
- if (_oldVideoMode.setup && _oldVideoMode.mode == mode)
return true;
- switch (mode) {
- case OpenGL::GFX_NORMAL:
- case OpenGL::GFX_CONSERVE:
- case OpenGL::GFX_ORIGINAL:
- break;
default:
- warning("Unknown gfx mode %d", mode);
+ warning("OpenGLGraphicsManager::setGraphicsMode(%d): Unknown graphics mode", mode);
return false;
}
-
- _videoMode.mode = mode;
- _transactionDetails.needRefresh = true;
-
- return true;
}
int OpenGLGraphicsManager::getGraphicsMode() const {
- assert(_transactionMode == kTransactionNone);
- return _videoMode.mode;
-}
-
-void OpenGLGraphicsManager::resetGraphicsScale() {
- setScale(1);
+ return _currentState.graphicsMode;
}
#ifdef USE_RGB_COLOR
Graphics::PixelFormat OpenGLGraphicsManager::getScreenFormat() const {
- return _screenFormat;
+ return _currentState.gameFormat;
}
#endif
-void OpenGLGraphicsManager::initSize(uint width, uint height, const Graphics::PixelFormat *format) {
- assert(_transactionMode == kTransactionActive);
-
-#ifdef USE_RGB_COLOR
- Graphics::PixelFormat newFormat;
- if (!format)
- newFormat = Graphics::PixelFormat::createFormatCLUT8();
- else
- newFormat = *format;
-
- assert(newFormat.bytesPerPixel > 0);
-
- // Avoid redundant format changes
- if (newFormat != _videoMode.format) {
- _videoMode.format = newFormat;
- _transactionDetails.formatChanged = true;
- _screenFormat = newFormat;
- }
-#endif
-
- // Avoid redundant res changes
- if ((int)width == _videoMode.screenWidth && (int)height == _videoMode.screenHeight)
- return;
-
- _videoMode.screenWidth = width;
- _videoMode.screenHeight = height;
+void OpenGLGraphicsManager::beginGFXTransaction() {
+ assert(_transactionMode == kTransactionNone);
- _transactionDetails.sizeChanged = true;
+ // Start a transaction.
+ _oldState = _currentState;
+ _transactionMode = kTransactionActive;
}
-int OpenGLGraphicsManager::getScreenChangeID() const {
- return _screenChangeCount;
-}
+OSystem::TransactionError OpenGLGraphicsManager::endGFXTransaction() {
+ assert(_transactionMode == kTransactionActive);
-//
-// GFX
-//
+ uint transactionError = OSystem::kTransactionSuccess;
-void OpenGLGraphicsManager::beginGFXTransaction() {
- assert(_transactionMode == kTransactionNone);
+ bool setupNewGameScreen = false;
+ if ( _oldState.gameWidth != _currentState.gameWidth
+ || _oldState.gameHeight != _currentState.gameHeight) {
+ setupNewGameScreen = true;
+ }
- _transactionMode = kTransactionActive;
- _transactionDetails.sizeChanged = false;
- _transactionDetails.needRefresh = false;
- _transactionDetails.needUpdatescreen = false;
- _transactionDetails.filterChanged = false;
#ifdef USE_RGB_COLOR
- _transactionDetails.formatChanged = false;
+ if (_oldState.gameFormat != _currentState.gameFormat) {
+ setupNewGameScreen = true;
+ }
+
+ // Check whether the requested format can actually be used.
+ Common::List<Graphics::PixelFormat> supportedFormats = getSupportedFormats();
+ // In case the requested format is not usable we will fall back to CLUT8.
+ if (Common::find(supportedFormats.begin(), supportedFormats.end(), _currentState.gameFormat) == supportedFormats.end()) {
+ _currentState.gameFormat = Graphics::PixelFormat::createFormatCLUT8();
+ transactionError |= OSystem::kTransactionFormatNotSupported;
+ }
#endif
- _oldVideoMode = _videoMode;
-}
+ do {
+ uint requestedWidth = _currentState.gameWidth;
+ uint requestedHeight = _currentState.gameHeight;
+ const uint desiredAspect = getDesiredGameScreenAspect();
+ requestedHeight = intToFrac(requestedWidth) / desiredAspect;
-OSystem::TransactionError OpenGLGraphicsManager::endGFXTransaction() {
- int errors = OSystem::kTransactionSuccess;
+ if (!loadVideoMode(requestedWidth, requestedHeight,
+#ifdef USE_RGB_COLOR
+ _currentState.gameFormat
+#else
+ Graphics::PixelFormat::createFormatCLUT8()
+#endif
+ )
+ // HACK: This is really nasty but we don't have any guarantees of
+ // a context existing before, which means we don't know the maximum
+ // supported texture size before this. Thus, we check whether the
+ // requested game resolution is supported over here.
+ || ( _currentState.gameWidth > (uint)Texture::getMaximumTextureSize()
+ || _currentState.gameHeight > (uint)Texture::getMaximumTextureSize())) {
+ if (_transactionMode == kTransactionActive) {
+ // Try to setup the old state in case its valid and is
+ // actually different from the new one.
+ if (_oldState.valid && _oldState != _currentState) {
+ // Give some hints on what failed to set up.
+ if ( _oldState.gameWidth != _currentState.gameWidth
+ || _oldState.gameHeight != _currentState.gameHeight) {
+ transactionError |= OSystem::kTransactionSizeChangeFailed;
+ }
- assert(_transactionMode != kTransactionNone);
+#ifdef USE_RGB_COLOR
+ if (_oldState.gameFormat != _currentState.gameFormat) {
+ transactionError |= OSystem::kTransactionFormatNotSupported;
+ }
+#endif
- if (_transactionMode == kTransactionRollback) {
- if (_videoMode.fullscreen != _oldVideoMode.fullscreen) {
- errors |= OSystem::kTransactionFullscreenFailed;
+ if (_oldState.aspectRatioCorrection != _currentState.aspectRatioCorrection) {
+ transactionError |= OSystem::kTransactionAspectRatioFailed;
+ }
- _videoMode.fullscreen = _oldVideoMode.fullscreen;
- } else if (_videoMode.mode != _oldVideoMode.mode) {
- errors |= OSystem::kTransactionModeSwitchFailed;
+ if (_oldState.graphicsMode != _currentState.graphicsMode) {
+ transactionError |= OSystem::kTransactionModeSwitchFailed;
+ }
- _videoMode.mode = _oldVideoMode.mode;
- _videoMode.scaleFactor = _oldVideoMode.scaleFactor;
-#ifdef USE_RGB_COLOR
- } else if (_videoMode.format != _oldVideoMode.format) {
- errors |= OSystem::kTransactionFormatNotSupported;
+ // Roll back to the old state.
+ _currentState = _oldState;
+ _transactionMode = kTransactionRollback;
- _videoMode.format = _oldVideoMode.format;
- _screenFormat = _videoMode.format;
-#endif
- } else if (_videoMode.screenWidth != _oldVideoMode.screenWidth || _videoMode.screenHeight != _oldVideoMode.screenHeight) {
- errors |= OSystem::kTransactionSizeChangeFailed;
+ // Try to set up the old state.
+ continue;
+ }
+ }
- _videoMode.screenWidth = _oldVideoMode.screenWidth;
- _videoMode.screenHeight = _oldVideoMode.screenHeight;
- _videoMode.overlayWidth = _oldVideoMode.overlayWidth;
- _videoMode.overlayHeight = _oldVideoMode.overlayHeight;
+ // DON'T use error(), as this tries to bring up the debug
+ // console, which WON'T WORK now that we might no have a
+ // proper screen.
+ warning("OpenGLGraphicsManager::endGFXTransaction: Could not load any graphics mode!");
+ g_system->quit();
}
- if (_videoMode.fullscreen == _oldVideoMode.fullscreen &&
- _videoMode.mode == _oldVideoMode.mode &&
- _videoMode.screenWidth == _oldVideoMode.screenWidth &&
- _videoMode.screenHeight == _oldVideoMode.screenHeight) {
+ // In case we reach this we have a valid state, yay.
+ _transactionMode = kTransactionNone;
+ _currentState.valid = true;
+ } while (_transactionMode == kTransactionRollback);
+
+ if (setupNewGameScreen) {
+ delete _gameScreen;
+ _gameScreen = nullptr;
- _oldVideoMode.setup = false;
+#ifdef USE_RGB_COLOR
+ _gameScreen = createTexture(_currentState.gameFormat);
+#else
+ _gameScreen = createTexture(Graphics::PixelFormat::createFormatCLUT8());
+#endif
+ assert(_gameScreen);
+ if (_gameScreen->hasPalette()) {
+ _gameScreen->setPalette(0, 256, _gamePalette);
}
- }
- if (_transactionDetails.sizeChanged || _transactionDetails.needRefresh) {
- unloadGFXMode();
- if (!loadGFXMode()) {
- if (_oldVideoMode.setup) {
- _transactionMode = kTransactionRollback;
- errors |= endGFXTransaction();
- }
+ _gameScreen->allocate(_currentState.gameWidth, _currentState.gameHeight);
+ _gameScreen->enableLinearFiltering(_currentState.graphicsMode == GFX_LINEAR);
+ // We fill the screen to all black or index 0 for CLUT8.
+#ifdef USE_RGB_COLOR
+ if (_currentState.gameFormat.bytesPerPixel == 1) {
+ _gameScreen->fill(0);
} else {
- clearOverlay();
-
- _videoMode.setup = true;
- _screenChangeCount++;
+ _gameScreen->fill(_gameScreen->getSurface()->format.RGBToColor(0, 0, 0));
}
-#ifdef USE_RGB_COLOR
- } else if (_transactionDetails.filterChanged || _transactionDetails.formatChanged) {
#else
- } else if (_transactionDetails.filterChanged) {
+ _gameScreen->fill(0);
#endif
- loadTextures();
- internUpdateScreen();
- } else if (_transactionDetails.needUpdatescreen) {
- internUpdateScreen();
}
- _transactionMode = kTransactionNone;
- return (OSystem::TransactionError)errors;
-}
+ // Update our display area and cursor scaling. This makes sure we pick up
+ // aspect ratio correction and game screen changes correctly.
+ recalculateDisplayArea();
+ recalculateCursorScaling();
-//
-// Screen
-//
+ // Something changed, so update the screen change ID.
+ ++_screenChangeID;
-int16 OpenGLGraphicsManager::getHeight() {
- return _videoMode.screenHeight;
+ // Since transactionError is a ORd list of TransactionErrors this is
+ // clearly wrong. But our API is simply broken.
+ return (OSystem::TransactionError)transactionError;
}
-int16 OpenGLGraphicsManager::getWidth() {
- return _videoMode.screenWidth;
+int OpenGLGraphicsManager::getScreenChangeID() const {
+ return _screenChangeID;
}
-void OpenGLGraphicsManager::setPalette(const byte *colors, uint start, uint num) {
- assert(colors);
-
+void OpenGLGraphicsManager::initSize(uint width, uint height, const Graphics::PixelFormat *format) {
+ Graphics::PixelFormat requestedFormat;
#ifdef USE_RGB_COLOR
- assert(_screenFormat.bytesPerPixel == 1);
+ if (!format) {
+ requestedFormat = Graphics::PixelFormat::createFormatCLUT8();
+ } else {
+ requestedFormat = *format;
+ }
+ _currentState.gameFormat = requestedFormat;
#endif
- // Save the screen palette
- memcpy(_gamePalette + start * 3, colors, num * 3);
+ _currentState.gameWidth = width;
+ _currentState.gameHeight = height;
+}
- _screenNeedsRedraw = true;
+int16 OpenGLGraphicsManager::getWidth() {
+ return _currentState.gameWidth;
+}
- if (_cursorPaletteDisabled)
- _cursorNeedsRedraw = true;
+int16 OpenGLGraphicsManager::getHeight() {
+ return _currentState.gameHeight;
}
-void OpenGLGraphicsManager::grabPalette(byte *colors, uint start, uint num) {
- assert(colors);
+void OpenGLGraphicsManager::copyRectToScreen(const void *buf, int pitch, int x, int y, int w, int h) {
+ _gameScreen->copyRectToTexture(x, y, w, h, buf, pitch);
+}
-#ifdef USE_RGB_COLOR
- assert(_screenFormat.bytesPerPixel == 1);
-#endif
+void OpenGLGraphicsManager::fillScreen(uint32 col) {
+ // FIXME: This does not conform to the OSystem specs because fillScreen
+ // is always taking CLUT8 color values and use color indexed mode. This is,
+ // however, plain odd and probably was a forgotten when we introduced
+ // RGB support. Thus, we simply do the "sane" thing here and hope OSystem
+ // gets fixed one day.
+ _gameScreen->fill(col);
+}
- // Copies current palette to buffer
- memcpy(colors, _gamePalette + start * 3, num * 3);
+void OpenGLGraphicsManager::setShakePos(int shakeOffset) {
+ _gameScreenShakeOffset = shakeOffset;
}
-void OpenGLGraphicsManager::copyRectToScreen(const void *buf, int pitch, int x, int y, int w, int h) {
- assert(x >= 0 && x < _screenData.w);
- assert(y >= 0 && y < _screenData.h);
- assert(h > 0 && y + h <= _screenData.h);
- assert(w > 0 && x + w <= _screenData.w);
-
- // Copy buffer data to game screen internal buffer
- const byte *src = (const byte *)buf;
- byte *dst = (byte *)_screenData.getBasePtr(x, y);
- for (int i = 0; i < h; i++) {
- memcpy(dst, src, w * _screenData.format.bytesPerPixel);
- src += pitch;
- dst += _screenData.pitch;
+void OpenGLGraphicsManager::updateScreen() {
+ if (!_gameScreen) {
+ return;
}
- // Extend dirty area if not full screen redraw is flagged
- if (!_screenNeedsRedraw) {
- const Common::Rect dirtyRect(x, y, x + w, y + h);
- _screenDirtyRect.extend(dirtyRect);
+ // Clear the screen buffer
+ GLCALL(glClear(GL_COLOR_BUFFER_BIT));
+
+ const GLfloat shakeOffset = _gameScreenShakeOffset * (GLfloat)_displayHeight / _gameScreen->getHeight();
+
+ // First step: Draw the (virtual) game screen.
+ _gameScreen->draw(_displayX, _displayY + shakeOffset, _displayWidth, _displayHeight);
+
+ // Second step: Draw the overlay if visible.
+ if (_overlayVisible) {
+ _overlay->draw(0, 0, _outputScreenWidth, _outputScreenHeight);
}
-}
-Graphics::Surface *OpenGLGraphicsManager::lockScreen() {
- return &_screenData;
-}
+ // Third step: Draw the cursor if visible.
+ if (_cursorVisible && _cursor) {
+ // Adjust game screen shake position, but only when the overlay is not
+ // visible.
+ const GLfloat cursorOffset = _overlayVisible ? 0 : shakeOffset;
-void OpenGLGraphicsManager::unlockScreen() {
- _screenNeedsRedraw = true;
-}
+ _cursor->draw(_cursorX - _cursorHotspotXScaled, _cursorY - _cursorHotspotYScaled + cursorOffset,
+ _cursorWidthScaled, _cursorHeightScaled);
+ }
-void OpenGLGraphicsManager::fillScreen(uint32 col) {
- if (_gameTexture == NULL)
- return;
+#ifdef USE_OSD
+ // Fourth step: Draw the OSD.
+ if (_osdAlpha > 0) {
+ Common::StackLock lock(_osdMutex);
-#ifdef USE_RGB_COLOR
- if (_screenFormat.bytesPerPixel == 1) {
- memset(_screenData.getPixels(), col, _screenData.h * _screenData.pitch);
- } else if (_screenFormat.bytesPerPixel == 2) {
- uint16 *pixels = (uint16 *)_screenData.getPixels();
- uint16 col16 = (uint16)col;
- for (int i = 0; i < _screenData.w * _screenData.h; i++) {
- pixels[i] = col16;
- }
- } else if (_screenFormat.bytesPerPixel == 3) {
- uint8 *pixels = (uint8 *)_screenData.getPixels();
- byte r = (col >> 16) & 0xFF;
- byte g = (col >> 8) & 0xFF;
- byte b = col & 0xFF;
- for (int i = 0; i < _screenData.w * _screenData.h; i++) {
- pixels[0] = r;
- pixels[1] = g;
- pixels[2] = b;
- pixels += 3;
- }
- } else if (_screenFormat.bytesPerPixel == 4) {
- uint32 *pixels = (uint32 *)_screenData.getPixels();
- for (int i = 0; i < _screenData.w * _screenData.h; i++) {
- pixels[i] = col;
+ // Update alpha value.
+ const int diff = g_system->getMillis(false) - _osdFadeStartTime;
+ if (diff > 0) {
+ if (diff >= kOSDFadeOutDuration) {
+ // Back to full transparency.
+ _osdAlpha = 0;
+ } else {
+ // Do a fade out.
+ _osdAlpha = kOSDInitialAlpha - diff * kOSDInitialAlpha / kOSDFadeOutDuration;
+ }
}
+
+ // Set the OSD transparency.
+ GLCALL(glColor4f(1.0f, 1.0f, 1.0f, _osdAlpha / 100.0f));
+
+ // Draw the OSD texture.
+ _osd->draw(0, 0, _outputScreenWidth, _outputScreenHeight);
+
+ // Reset color.
+ GLCALL(glColor4f(1.0f, 1.0f, 1.0f, 1.0f));
}
-#else
- memset(_screenData.getPixels(), col, _screenData.h * _screenData.pitch);
#endif
- _screenNeedsRedraw = true;
}
-void OpenGLGraphicsManager::updateScreen() {
- assert(_transactionMode == kTransactionNone);
- internUpdateScreen();
+Graphics::Surface *OpenGLGraphicsManager::lockScreen() {
+ return _gameScreen->getSurface();
}
-void OpenGLGraphicsManager::setShakePos(int shakeOffset) {
- assert(_transactionMode == kTransactionNone);
- _shakePos = shakeOffset;
+void OpenGLGraphicsManager::unlockScreen() {
+ _gameScreen->flagDirty();
}
-void OpenGLGraphicsManager::setFocusRectangle(const Common::Rect &rect) {
+void OpenGLGraphicsManager::setFocusRectangle(const Common::Rect& rect) {
}
void OpenGLGraphicsManager::clearFocusRectangle() {
}
-//
-// Overlay
-//
-
-void OpenGLGraphicsManager::showOverlay() {
- assert(_transactionMode == kTransactionNone);
+int16 OpenGLGraphicsManager::getOverlayWidth() {
+ if (_overlay) {
+ return _overlay->getWidth();
+ } else {
+ return 0;
+ }
+}
- if (_overlayVisible)
- return;
+int16 OpenGLGraphicsManager::getOverlayHeight() {
+ if (_overlay) {
+ return _overlay->getHeight();
+ } else {
+ return 0;
+ }
+}
+void OpenGLGraphicsManager::showOverlay() {
_overlayVisible = true;
-
- clearOverlay();
}
void OpenGLGraphicsManager::hideOverlay() {
- assert(_transactionMode == kTransactionNone);
-
- if (!_overlayVisible)
- return;
-
_overlayVisible = false;
-
- clearOverlay();
}
Graphics::PixelFormat OpenGLGraphicsManager::getOverlayFormat() const {
- return _overlayFormat;
+ return _overlay->getFormat();
}
-void OpenGLGraphicsManager::clearOverlay() {
- // Set all pixels to 0
- memset(_overlayData.getPixels(), 0, _overlayData.h * _overlayData.pitch);
- _overlayNeedsRedraw = true;
+void OpenGLGraphicsManager::copyRectToOverlay(const void *buf, int pitch, int x, int y, int w, int h) {
+ _overlay->copyRectToTexture(x, y, w, h, buf, pitch);
}
-void OpenGLGraphicsManager::grabOverlay(void *buf, int pitch) {
- const byte *src = (byte *)_overlayData.getPixels();
- byte *dst = (byte *)buf;
- for (int i = 0; i < _overlayData.h; i++) {
- // Copy overlay data to buffer
- memcpy(dst, src, _overlayData.pitch);
- dst += pitch;
- src += _overlayData.pitch;
- }
+void OpenGLGraphicsManager::clearOverlay() {
+ _overlay->fill(0);
}
-void OpenGLGraphicsManager::copyRectToOverlay(const void *buf, int pitch, int x, int y, int w, int h) {
- assert(_transactionMode == kTransactionNone);
-
- if (_overlayTexture == NULL)
- return;
-
- const byte *src = (const byte *)buf;
-
- // Clip the coordinates
- if (x < 0) {
- w += x;
- src -= x * 2;
- x = 0;
- }
-
- if (y < 0) {
- h += y;
- src -= y * pitch;
- y = 0;
- }
-
- if (w > _overlayData.w - x)
- w = _overlayData.w - x;
-
- if (h > _overlayData.h - y)
- h = _overlayData.h - y;
-
- if (w <= 0 || h <= 0)
- return;
+void OpenGLGraphicsManager::grabOverlay(void *buf, int pitch) {
+ const Graphics::Surface *overlayData = _overlay->getSurface();
- // Copy buffer data to internal overlay surface
- byte *dst = (byte *)_overlayData.getBasePtr(0, y);
- for (int i = 0; i < h; i++) {
- memcpy(dst + x * _overlayData.format.bytesPerPixel, src, w * _overlayData.format.bytesPerPixel);
- src += pitch;
- dst += _overlayData.pitch;
- }
+ const byte *src = (const byte *)overlayData->getPixels();
+ byte *dst = (byte *)buf;
- // Extend dirty area if not full screen redraw is flagged
- if (!_overlayNeedsRedraw) {
- const Common::Rect dirtyRect(x, y, x + w, y + h);
- _overlayDirtyRect.extend(dirtyRect);
+ for (uint h = overlayData->h; h > 0; --h) {
+ memcpy(dst, src, overlayData->w * overlayData->format.bytesPerPixel);
+ dst += pitch;
+ src += overlayData->pitch;
}
}
-int16 OpenGLGraphicsManager::getOverlayHeight() {
- return _videoMode.overlayHeight;
-}
-
-int16 OpenGLGraphicsManager::getOverlayWidth() {
- return _videoMode.overlayWidth;
-}
-
-//
-// Cursor
-//
-
bool OpenGLGraphicsManager::showMouse(bool visible) {
- if (_cursorVisible == visible)
- return visible;
-
bool last = _cursorVisible;
_cursorVisible = visible;
-
return last;
}
void OpenGLGraphicsManager::warpMouse(int x, int y) {
- int scaledX = x;
- int scaledY = y;
-
- int16 currentX = _cursorState.x;
- int16 currentY = _cursorState.y;
-
+ int16 currentX = _cursorX;
+ int16 currentY = _cursorY;
adjustMousePosition(currentX, currentY);
- // Do not adjust the real screen position, when the current game / overlay
- // coordinates match the requested coordinates. This avoids a slight
- // movement which might occur otherwise when the mouse is at a subpixel
- // position.
- if (x == currentX && y == currentY)
+ // Check whether the (virtual) coordinate actually changed. If not, then
+ // simply do nothing. This avoids ugly "jittering" due to the actual
+ // output screen having a bigger resolution than the virtual coordinates.
+ if (currentX == x && currentY == y) {
return;
+ }
- if (_videoMode.mode == OpenGL::GFX_NORMAL) {
- if (_videoMode.hardwareWidth != _videoMode.overlayWidth)
- scaledX = scaledX * _videoMode.hardwareWidth / _videoMode.overlayWidth;
- if (_videoMode.hardwareHeight != _videoMode.overlayHeight)
- scaledY = scaledY * _videoMode.hardwareHeight / _videoMode.overlayHeight;
-
- if (!_overlayVisible) {
- scaledX *= _videoMode.scaleFactor;
- scaledY *= _videoMode.scaleFactor;
+ // Scale the virtual coordinates into actual physical coordinates.
+ if (_overlayVisible) {
+ if (!_overlay) {
+ return;
}
+
+ // It might be confusing that we actually have to handle something
+ // here when the overlay is visible. This is because for very small
+ // resolutions we have a minimal overlay size and have to adjust
+ // for that.
+ x = (x * _outputScreenWidth) / _overlay->getWidth();
+ y = (y * _outputScreenHeight) / _overlay->getHeight();
} else {
- if (_overlayVisible) {
- if (_displayWidth != _videoMode.overlayWidth)
- scaledX = scaledX * _displayWidth / _videoMode.overlayWidth;
- if (_displayHeight != _videoMode.overlayHeight)
- scaledY = scaledY * _displayHeight / _videoMode.overlayHeight;
- } else {
- if (_displayWidth != _videoMode.screenWidth)
- scaledX = scaledX * _displayWidth / _videoMode.screenWidth;
- if (_displayHeight != _videoMode.screenHeight)
- scaledY = scaledY * _displayHeight / _videoMode.screenHeight;
+ if (!_gameScreen) {
+ return;
}
- scaledX += _displayX;
- scaledY += _displayY;
+ x = (x * _displayWidth) / _gameScreen->getWidth();
+ y = (y * _displayHeight) / _gameScreen->getHeight();
+
+ x += _displayX;
+ y += _displayY;
}
- setMousePosition(scaledX, scaledY);
- setInternalMousePosition(scaledX, scaledY);
+ setMousePosition(x, y);
+ setInternalMousePosition(x, y);
+}
+
+namespace {
+template<typename DstPixel, typename SrcPixel>
+void applyColorKey(DstPixel *dst, const SrcPixel *src, uint w, uint h, uint dstPitch, uint srcPitch, SrcPixel keyColor, DstPixel alphaMask) {
+ const uint srcAdd = srcPitch - w * sizeof(SrcPixel);
+ const uint dstAdd = dstPitch - w * sizeof(DstPixel);
+
+ while (h-- > 0) {
+ for (uint x = w; x > 0; --x, ++dst, ++src) {
+ if (*src == keyColor) {
+ *dst &= ~alphaMask;
+ }
+ }
+
+ dst = (DstPixel *)((byte *)dst + dstAdd);
+ src = (const SrcPixel *)((const byte *)src + srcAdd);
+ }
}
+} // End of anonymous namespace
void OpenGLGraphicsManager::setMouseCursor(const void *buf, uint w, uint h, int hotspotX, int hotspotY, uint32 keycolor, bool dontScale, const Graphics::PixelFormat *format) {
+ Graphics::PixelFormat inputFormat;
#ifdef USE_RGB_COLOR
- if (format)
- _cursorFormat = *format;
- else
- _cursorFormat = Graphics::PixelFormat::createFormatCLUT8();
+ if (format) {
+ inputFormat = *format;
+ } else {
+ inputFormat = Graphics::PixelFormat::createFormatCLUT8();
+ }
#else
- assert(keycolor <= 255);
- _cursorFormat = Graphics::PixelFormat::createFormatCLUT8();
+ inputFormat = Graphics::PixelFormat::createFormatCLUT8();
#endif
- // Allocate space for cursor data
- if (_cursorData.w != w || _cursorData.h != h ||
- _cursorData.format.bytesPerPixel != _cursorFormat.bytesPerPixel)
- _cursorData.create(w, h, _cursorFormat);
-
- // Save cursor data
- memcpy(_cursorData.getPixels(), buf, h * _cursorData.pitch);
+ // In case the color format has changed we will need to create the texture.
+ if (!_cursor || _cursor->getFormat() != inputFormat) {
+ delete _cursor;
+ _cursor = nullptr;
+
+ GLenum glIntFormat, glFormat, glType;
+
+ Graphics::PixelFormat textureFormat;
+ if (inputFormat.bytesPerPixel == 1 || (inputFormat.aBits() && getGLPixelFormat(inputFormat, glIntFormat, glFormat, glType))) {
+ // There is two cases when we can use the cursor format directly.
+ // The first is when it's CLUT8, here color key handling can
+ // always be applied because we use the alpha channel of
+ // _defaultFormatAlpha for that.
+ // The other is when the input format has alpha bits and
+ // furthermore is directly supported.
+ textureFormat = inputFormat;
+ } else {
+ textureFormat = _defaultFormatAlpha;
+ }
+ _cursor = createTexture(textureFormat, true);
+ assert(_cursor);
+ _cursor->enableLinearFiltering(_currentState.graphicsMode == GFX_LINEAR);
+ }
- // Set cursor info
- _cursorState.w = w;
- _cursorState.h = h;
- _cursorState.hotX = hotspotX;
- _cursorState.hotY = hotspotY;
_cursorKeyColor = keycolor;
+ _cursorHotspotX = hotspotX;
+ _cursorHotspotY = hotspotY;
_cursorDontScale = dontScale;
- _cursorNeedsRedraw = true;
- refreshCursorScale();
+ _cursor->allocate(w, h);
+ if (inputFormat.bytesPerPixel == 1) {
+ // For CLUT8 cursors we can simply copy the input data into the
+ // texture.
+ _cursor->copyRectToTexture(0, 0, w, h, buf, w * inputFormat.bytesPerPixel);
+ } else {
+ // Otherwise it is a bit more ugly because we have to handle a key
+ // color properly.
+
+ Graphics::Surface *dst = _cursor->getSurface();
+ const uint srcPitch = w * inputFormat.bytesPerPixel;
+
+ // Copy the cursor data to the actual texture surface. This will make
+ // sure that the data is also converted to the expected format.
+ Graphics::crossBlit((byte *)dst->getPixels(), (const byte *)buf, dst->pitch, srcPitch,
+ w, h, dst->format, inputFormat);
+
+ // We apply the color key by setting the alpha bits of the pixels to
+ // fully transparent.
+ const uint32 aMask = (0xFF >> dst->format.aLoss) << dst->format.aShift;
+ if (dst->format.bytesPerPixel == 2) {
+ if (inputFormat.bytesPerPixel == 2) {
+ applyColorKey<uint16, uint16>((uint16 *)dst->getPixels(), (const uint16 *)buf, w, h,
+ dst->pitch, srcPitch, keycolor, aMask);
+ } else if (inputFormat.bytesPerPixel == 4) {
+ applyColorKey<uint16, uint32>((uint16 *)dst->getPixels(), (const uint32 *)buf, w, h,
+ dst->pitch, srcPitch, keycolor, aMask);
+ }
+ } else {
+ if (inputFormat.bytesPerPixel == 2) {
+ applyColorKey<uint32, uint16>((uint32 *)dst->getPixels(), (const uint16 *)buf, w, h,
+ dst->pitch, srcPitch, keycolor, aMask);
+ } else if (inputFormat.bytesPerPixel == 4) {
+ applyColorKey<uint32, uint32>((uint32 *)dst->getPixels(), (const uint32 *)buf, w, h,
+ dst->pitch, srcPitch, keycolor, aMask);
+ }
+ }
+
+ // Flag the texture as dirty.
+ _cursor->flagDirty();
+ }
+
+ // In case we actually use a palette set that up properly.
+ if (inputFormat.bytesPerPixel == 1) {
+ updateCursorPalette();
+ }
+
+ // Update the scaling.
+ recalculateCursorScaling();
}
void OpenGLGraphicsManager::setCursorPalette(const byte *colors, uint start, uint num) {
- assert(colors);
+ // FIXME: For some reason client code assumes that usage of this function
+ // automatically enables the cursor palette.
+ _cursorPaletteEnabled = true;
- // Save the cursor palette
memcpy(_cursorPalette + start * 3, colors, num * 3);
-
- _cursorPaletteDisabled = false;
- _cursorNeedsRedraw = true;
+ updateCursorPalette();
}
-//
-// Misc
-//
-
void OpenGLGraphicsManager::displayMessageOnOSD(const char *msg) {
- assert(_transactionMode == kTransactionNone);
- assert(msg);
-
#ifdef USE_OSD
- // Split the message into separate lines.
- _osdLines.clear();
+ // HACK: Actually no client code should use graphics functions from
+ // another thread. But the MT-32 emulator still does, thus we need to
+ // make sure this doesn't happen while a updateScreen call is done.
+ Common::StackLock lock(_osdMutex);
+ // Slip up the lines.
+ Common::Array<Common::String> osdLines;
Common::StringTokenizer tokenizer(msg, "\n");
- while (!tokenizer.empty())
- _osdLines.push_back(tokenizer.nextToken());
+ while (!tokenizer.empty()) {
+ osdLines.push_back(tokenizer.nextToken());
+ }
- // Request update of the texture
- _requireOSDUpdate = true;
+ // Do the actual drawing like the SDL backend.
+ const Graphics::Font *font = getFontOSD();
+ Graphics::Surface *dst = _osd->getSurface();
+ _osd->fill(0);
+ _osd->flagDirty();
+
+ // Determine a rect which would contain the message string (clipped to the
+ // screen dimensions).
+ const int vOffset = 6;
+ const int lineSpacing = 1;
+ const int lineHeight = font->getFontHeight() + 2 * lineSpacing;
+ int width = 0;
+ int height = lineHeight * osdLines.size() + 2 * vOffset;
+ for (uint i = 0; i < osdLines.size(); i++) {
+ width = MAX(width, font->getStringWidth(osdLines[i]) + 14);
+ }
+
+ // Clip the rect
+ width = MIN<int>(width, dst->w);
+ height = MIN<int>(height, dst->h);
+
+ int dstX = (dst->w - width) / 2;
+ int dstY = (dst->h - height) / 2;
+
+ // Draw a dark gray rect.
+ const uint32 color = dst->format.RGBToColor(40, 40, 40);
+ dst->fillRect(Common::Rect(dstX, dstY, dstX + width, dstY + height), color);
+
+ // Render the message, centered, and in white
+ const uint32 white = dst->format.RGBToColor(255, 255, 255);
+ for (uint i = 0; i < osdLines.size(); ++i) {
+ font->drawString(dst, osdLines[i],
+ dstX, dstY + i * lineHeight + vOffset + lineSpacing, width,
+ white, Graphics::kTextAlignCenter);
+ }
- // Init the OSD display parameters, and the fade out
+ // Init the OSD display parameters.
_osdAlpha = kOSDInitialAlpha;
_osdFadeStartTime = g_system->getMillis() + kOSDFadeOutDelay;
#endif
}
-//
-// Intern
-//
+void OpenGLGraphicsManager::setPalette(const byte *colors, uint start, uint num) {
+ assert(_gameScreen->hasPalette());
-void OpenGLGraphicsManager::setFullscreenMode(bool enable) {
- assert(_transactionMode == kTransactionActive);
+ memcpy(_gamePalette + start * 3, colors, num * 3);
+ _gameScreen->setPalette(start, num, colors);
- if (_oldVideoMode.setup && _oldVideoMode.fullscreen == enable)
- return;
+ // We might need to update the cursor palette here.
+ updateCursorPalette();
+}
- if (_transactionMode == kTransactionActive) {
- _videoMode.fullscreen = enable;
- _transactionDetails.needRefresh = true;
- }
+void OpenGLGraphicsManager::grabPalette(byte *colors, uint start, uint num) {
+ assert(_gameScreen->hasPalette());
+
+ memcpy(colors, _gamePalette + start * 3, num * 3);
}
-void OpenGLGraphicsManager::refreshGameScreen() {
- if (_screenNeedsRedraw)
- _screenDirtyRect = Common::Rect(0, 0, _screenData.w, _screenData.h);
-
- int x = _screenDirtyRect.left;
- int y = _screenDirtyRect.top;
- int w = _screenDirtyRect.width();
- int h = _screenDirtyRect.height();
-
- if (_screenData.format.bytesPerPixel == 1) {
- // Create a temporary RGB888 surface
- byte *surface = new byte[w * h * 3];
-
- // Convert the paletted buffer to RGB888
- const byte *src = (byte *)_screenData.getBasePtr(0, y);
- src += x * _screenData.format.bytesPerPixel;
- byte *dst = surface;
- for (int i = 0; i < h; i++) {
- for (int j = 0; j < w; j++) {
- dst[0] = _gamePalette[src[j] * 3];
- dst[1] = _gamePalette[src[j] * 3 + 1];
- dst[2] = _gamePalette[src[j] * 3 + 2];
- dst += 3;
- }
- src += _screenData.pitch;
+void OpenGLGraphicsManager::setActualScreenSize(uint width, uint height) {
+ _outputScreenWidth = width;
+ _outputScreenHeight = height;
+
+ // Setup coordinates system.
+ GLCALL(glViewport(0, 0, _outputScreenWidth, _outputScreenHeight));
+
+ GLCALL(glMatrixMode(GL_PROJECTION));
+ GLCALL(glLoadIdentity());
+#ifdef USE_GLES
+ GLCALL(glOrthof(0, _outputScreenWidth, _outputScreenHeight, 0, -1, 1));
+#else
+ GLCALL(glOrtho(0, _outputScreenWidth, _outputScreenHeight, 0, -1, 1));
+#endif
+ GLCALL(glMatrixMode(GL_MODELVIEW));
+ GLCALL(glLoadIdentity());
+
+ uint overlayWidth = width;
+ uint overlayHeight = height;
+
+ // WORKAROUND: We can only support surfaces up to the maximum supported
+ // texture size. Thus, in case we encounter a physical size bigger than
+ // this maximum texture size we will simply use an overlay as big as
+ // possible and then scale it to the physical display size. This sounds
+ // bad but actually all recent chips should support full HD resolution
+ // anyway. Thus, it should not be a real issue for modern hardware.
+ if ( overlayWidth > (uint)Texture::getMaximumTextureSize()
+ || overlayHeight > (uint)Texture::getMaximumTextureSize()) {
+ const frac_t outputAspect = intToFrac(_outputScreenWidth) / _outputScreenHeight;
+
+ if (outputAspect > (frac_t)FRAC_ONE) {
+ overlayWidth = Texture::getMaximumTextureSize();
+ overlayHeight = intToFrac(overlayWidth) / outputAspect;
+ } else {
+ overlayHeight = Texture::getMaximumTextureSize();
+ overlayWidth = fracToInt(overlayHeight * outputAspect);
}
+ }
- // Update the texture
- _gameTexture->updateBuffer(surface, w * 3, x, y, w, h);
+ // HACK: We limit the minimal overlay size to 256x200, which is the
+ // minimum of the dimensions of the two resolutions 256x240 (NES) and
+ // 320x200 (many DOS games use this). This hopefully assure that our
+ // GUI has working layouts.
+ overlayWidth = MAX<uint>(overlayWidth, 256);
+ overlayHeight = MAX<uint>(overlayHeight, 200);
+
+ if (!_overlay || _overlay->getFormat() != _defaultFormatAlpha) {
+ delete _overlay;
+ _overlay = nullptr;
+
+ _overlay = createTexture(_defaultFormatAlpha);
+ assert(_overlay);
+ // We always filter the overlay with GL_LINEAR. This assures it's
+ // readable in case it needs to be scaled and does not affect it
+ // otherwise.
+ _overlay->enableLinearFiltering(true);
+ }
+ _overlay->allocate(overlayWidth, overlayHeight);
+ _overlay->fill(0);
- // Free the temp surface
- delete[] surface;
- } else {
- // Update the texture
- _gameTexture->updateBuffer((byte *)_screenData.getBasePtr(x, y), _screenData.pitch, x, y, w, h);
+#ifdef USE_OSD
+ if (!_osd || _osd->getFormat() != _defaultFormatAlpha) {
+ delete _osd;
+ _osd = nullptr;
+
+ _osd = createTexture(_defaultFormatAlpha);
+ assert(_osd);
+ // We always filter the osd with GL_LINEAR. This assures it's
+ // readable in case it needs to be scaled and does not affect it
+ // otherwise.
+ _osd->enableLinearFiltering(true);
}
+ _osd->allocate(_overlay->getWidth(), _overlay->getHeight());
+ _osd->fill(0);
+#endif
- _screenNeedsRedraw = false;
- _screenDirtyRect = Common::Rect();
+ // Re-setup the scaling for the screen and cursor
+ recalculateDisplayArea();
+ recalculateCursorScaling();
+
+ // Something changed, so update the screen change ID.
+ ++_screenChangeID;
}
-void OpenGLGraphicsManager::refreshOverlay() {
- if (_overlayNeedsRedraw)
- _overlayDirtyRect = Common::Rect(0, 0, _overlayData.w, _overlayData.h);
-
- int x = _overlayDirtyRect.left;
- int y = _overlayDirtyRect.top;
- int w = _overlayDirtyRect.width();
- int h = _overlayDirtyRect.height();
-
- if (_overlayData.format.bytesPerPixel == 1) {
- // Create a temporary RGB888 surface
- byte *surface = new byte[w * h * 3];
-
- // Convert the paletted buffer to RGB888
- const byte *src = (byte *)_overlayData.getBasePtr(0, y);
- src += x * _overlayData.format.bytesPerPixel;
- byte *dst = surface;
- for (int i = 0; i < h; i++) {
- for (int j = 0; j < w; j++) {
- dst[0] = _gamePalette[src[j] * 3];
- dst[1] = _gamePalette[src[j] * 3 + 1];
- dst[2] = _gamePalette[src[j] * 3 + 2];
- dst += 3;
- }
- src += _screenData.pitch;
- }
+void OpenGLGraphicsManager::notifyContextCreate(const Graphics::PixelFormat &defaultFormat, const Graphics::PixelFormat &defaultFormatAlpha) {
+ // Initialize all extensions.
+ initializeGLExtensions();
- // Update the texture
- _overlayTexture->updateBuffer(surface, w * 3, x, y, w, h);
+ // Disable 3D properties.
+ GLCALL(glDisable(GL_CULL_FACE));
+ GLCALL(glDisable(GL_DEPTH_TEST));
+ GLCALL(glDisable(GL_LIGHTING));
+ GLCALL(glDisable(GL_FOG));
+ GLCALL(glDisable(GL_DITHER));
+ GLCALL(glShadeModel(GL_FLAT));
+ GLCALL(glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_FASTEST));
- // Free the temp surface
- delete[] surface;
- } else {
- // Update the texture
- _overlayTexture->updateBuffer((byte *)_overlayData.getBasePtr(x, y), _overlayData.pitch, x, y, w, h);
+ // Default to black as clear color.
+ GLCALL(glClearColor(0.0f, 0.0f, 0.0f, 0.0f));
+ GLCALL(glColor4f(1.0f, 1.0f, 1.0f, 1.0f));
+
+ // Setup alpha blend (for overlay and cursor).
+ GLCALL(glEnable(GL_BLEND));
+ GLCALL(glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA));
+
+ // Enable rendering with vertex and coord arrays.
+ GLCALL(glEnableClientState(GL_VERTEX_ARRAY));
+ GLCALL(glEnableClientState(GL_TEXTURE_COORD_ARRAY));
+
+ GLCALL(glEnable(GL_TEXTURE_2D));
+
+ // We use a "pack" alignment (when reading from textures) to 4 here,
+ // since the only place where we really use it is the BMP screenshot
+ // code and that requires the same alignment too.
+ GLCALL(glPixelStorei(GL_PACK_ALIGNMENT, 4));
+
+ // Query information needed by textures.
+ Texture::queryTextureInformation();
+
+ // Refresh the output screen dimensions if some are set up.
+ if (_outputScreenWidth != 0 && _outputScreenHeight != 0) {
+ setActualScreenSize(_outputScreenWidth, _outputScreenHeight);
}
- _overlayNeedsRedraw = false;
- _overlayDirtyRect = Common::Rect();
-}
+ // TODO: Should we try to convert textures into one of those formats if
+ // possible? For example, when _gameScreen is CLUT8 we might want to use
+ // defaultFormat now.
+ _defaultFormat = defaultFormat;
+ _defaultFormatAlpha = defaultFormatAlpha;
-void OpenGLGraphicsManager::refreshCursor() {
- _cursorNeedsRedraw = false;
-
- // Allocate a texture big enough for cursor
- _cursorTexture->allocBuffer(_cursorState.w, _cursorState.h);
-
- // Create a temporary RGBA8888 surface
- byte *surface = new byte[_cursorState.w * _cursorState.h * 4];
- memset(surface, 0, _cursorState.w * _cursorState.h * 4);
-
- byte *dst = surface;
-
- // Convert the paletted cursor to RGBA8888
- if (_cursorFormat.bytesPerPixel == 1) {
- // Select palette
- byte *palette;
- if (_cursorPaletteDisabled)
- palette = _gamePalette;
- else
- palette = _cursorPalette;
-
- // Convert the paletted cursor to RGBA8888
- const byte *src = (byte *)_cursorData.getPixels();
- for (int i = 0; i < _cursorState.w * _cursorState.h; i++) {
- // Check for keycolor
- if (src[i] != _cursorKeyColor) {
- dst[0] = palette[src[i] * 3];
- dst[1] = palette[src[i] * 3 + 1];
- dst[2] = palette[src[i] * 3 + 2];
- dst[3] = 255;
- }
- dst += 4;
- }
- } else {
- const bool gotNoAlpha = (_cursorFormat.aLoss == 8);
-
- // Convert the RGB cursor to RGBA8888
- if (_cursorFormat.bytesPerPixel == 2) {
- const uint16 *src = (uint16 *)_cursorData.getPixels();
- for (int i = 0; i < _cursorState.w * _cursorState.h; i++) {
- // Check for keycolor
- if (src[i] != _cursorKeyColor) {
- _cursorFormat.colorToARGB(src[i], dst[3], dst[0], dst[1], dst[2]);
-
- if (gotNoAlpha)
- dst[3] = 255;
- }
- dst += 4;
- }
- } else if (_cursorFormat.bytesPerPixel == 4) {
- const uint32 *src = (uint32 *)_cursorData.getPixels();
- for (int i = 0; i < _cursorState.w * _cursorState.h; i++) {
- // Check for keycolor
- if (src[i] != _cursorKeyColor) {
- _cursorFormat.colorToARGB(src[i], dst[3], dst[0], dst[1], dst[2]);
-
- if (gotNoAlpha)
- dst[3] = 255;
- }
- dst += 4;
- }
- }
+ if (_gameScreen) {
+ _gameScreen->recreateInternalTexture();
}
- // Update the texture with new cursor
- _cursorTexture->updateBuffer(surface, _cursorState.w * 4, 0, 0, _cursorState.w, _cursorState.h);
+ if (_overlay) {
+ _overlay->recreateInternalTexture();
+ }
+
+ if (_cursor) {
+ _cursor->recreateInternalTexture();
+ }
- // Free the temp surface
- delete[] surface;
+#ifdef USE_OSD
+ if (_osd) {
+ _osd->recreateInternalTexture();
+ }
+#endif
}
-void OpenGLGraphicsManager::refreshCursorScale() {
- // Calculate the scale factors of the screen.
- // We also totally ignore the aspect of the overlay cursor, since aspect
- // ratio correction only applies to the game screen.
- // TODO: It might make sense to always ignore scaling of the mouse cursor
- // when the overlay is visible.
- uint screenScaleFactorX = _videoMode.hardwareWidth * 10000 / _videoMode.screenWidth;
- uint screenScaleFactorY = _videoMode.hardwareHeight * 10000 / _videoMode.screenHeight;
-
- // Ignore scaling when the cursor should not be scaled.
- if (_cursorDontScale) {
- screenScaleFactorX = 10000;
- screenScaleFactorY = 10000;
+void OpenGLGraphicsManager::notifyContextDestroy() {
+ if (_gameScreen) {
+ _gameScreen->releaseInternalTexture();
}
- // Apply them (without any possible) aspect ratio correction to the
- // overlay.
- _cursorState.rW = (int16)(_cursorState.w * screenScaleFactorX / 10000);
- _cursorState.rH = (int16)(_cursorState.h * screenScaleFactorY / 10000);
- _cursorState.rHotX = (int16)(_cursorState.hotX * screenScaleFactorX / 10000);
- _cursorState.rHotY = (int16)(_cursorState.hotY * screenScaleFactorY / 10000);
-
- // Only apply scaling when it's desired.
- if (_cursorDontScale) {
- screenScaleFactorX = 10000;
- screenScaleFactorY = 10000;
- } else {
- // Make sure we properly scale the cursor according to the desired aspect.
- int width, height;
- calculateDisplaySize(width, height);
- screenScaleFactorX = (width * 10000 / _videoMode.screenWidth);
- screenScaleFactorY = (height * 10000 / _videoMode.screenHeight);
+ if (_overlay) {
+ _overlay->releaseInternalTexture();
}
- // Apply the scale cursor scaling for the game screen.
- _cursorState.vW = (int16)(_cursorState.w * screenScaleFactorX / 10000);
- _cursorState.vH = (int16)(_cursorState.h * screenScaleFactorY / 10000);
- _cursorState.vHotX = (int16)(_cursorState.hotX * screenScaleFactorX / 10000);
- _cursorState.vHotY = (int16)(_cursorState.hotY * screenScaleFactorY / 10000);
+ if (_cursor) {
+ _cursor->releaseInternalTexture();
+ }
+
+#ifdef USE_OSD
+ if (_osd) {
+ _osd->releaseInternalTexture();
+ }
+#endif
}
-void OpenGLGraphicsManager::calculateDisplaySize(int &width, int &height) {
- if (_videoMode.mode == OpenGL::GFX_ORIGINAL) {
- width = _videoMode.screenWidth;
- height = _videoMode.screenHeight;
- } else {
- width = _videoMode.hardwareWidth;
- height = _videoMode.hardwareHeight;
+void OpenGLGraphicsManager::adjustMousePosition(int16 &x, int16 &y) {
+ if (_overlayVisible) {
+ // It might be confusing that we actually have to handle something
+ // here when the overlay is visible. This is because for very small
+ // resolutions we have a minimal overlay size and have to adjust
+ // for that.
+ // This can also happen when the overlay is smaller than the actual
+ // display size because of texture size limitations.
+ if (_overlay) {
+ x = (x * _overlay->getWidth()) / _outputScreenWidth;
+ y = (y * _overlay->getHeight()) / _outputScreenHeight;
+ }
+ } else if (_gameScreen) {
+ x -= _displayX;
+ y -= _displayY;
+
+ const int16 width = _gameScreen->getWidth();
+ const int16 height = _gameScreen->getHeight();
- uint aspectRatio = (_videoMode.hardwareWidth * 10000 + 5000) / _videoMode.hardwareHeight;
- uint desiredAspectRatio = getAspectRatio();
+ x = (x * width) / _displayWidth;
+ y = (y * height) / _displayHeight;
- // Adjust one screen dimension for mantaining the aspect ratio
- if (aspectRatio < desiredAspectRatio)
- height = (width * 10000 + 5000) / desiredAspectRatio;
- else if (aspectRatio > desiredAspectRatio)
- width = (height * desiredAspectRatio + 5000) / 10000;
+ // Make sure we only supply valid coordinates.
+ x = CLIP<int16>(x, 0, width - 1);
+ y = CLIP<int16>(y, 0, height - 1);
}
}
-void OpenGLGraphicsManager::refreshDisplaySize() {
- calculateDisplaySize(_displayWidth, _displayHeight);
-
- // Adjust x and y for centering the screen
- _displayX = (_videoMode.hardwareWidth - _displayWidth) / 2;
- _displayY = (_videoMode.hardwareHeight - _displayHeight) / 2;
+Texture *OpenGLGraphicsManager::createTexture(const Graphics::PixelFormat &format, bool wantAlpha) {
+ GLenum glIntFormat, glFormat, glType;
+ if (format.bytesPerPixel == 1) {
+ const Graphics::PixelFormat &virtFormat = wantAlpha ? _defaultFormatAlpha : _defaultFormat;
+ const bool supported = getGLPixelFormat(virtFormat, glIntFormat, glFormat, glType);
+ if (!supported) {
+ return nullptr;
+ } else {
+ return new TextureCLUT8(glIntFormat, glFormat, glType, virtFormat);
+ }
+ } else {
+ const bool supported = getGLPixelFormat(format, glIntFormat, glFormat, glType);
+ if (!supported) {
+ return nullptr;
+ } else {
+ return new Texture(glIntFormat, glFormat, glType, format);
+ }
+ }
}
-void OpenGLGraphicsManager::getGLPixelFormat(Graphics::PixelFormat pixelFormat, byte &bpp, GLenum &intFormat, GLenum &glFormat, GLenum &gltype) {
+bool OpenGLGraphicsManager::getGLPixelFormat(const Graphics::PixelFormat &pixelFormat, GLenum &glIntFormat, GLenum &glFormat, GLenum &glType) const {
+#ifdef SCUMM_LITTLE_ENDIAN
+ if (pixelFormat == Graphics::PixelFormat(4, 8, 8, 8, 8, 0, 8, 16, 24)) { // ABGR8888
+#else
if (pixelFormat == Graphics::PixelFormat(4, 8, 8, 8, 8, 24, 16, 8, 0)) { // RGBA8888
- bpp = 4;
- intFormat = GL_RGBA;
+#endif
+ glIntFormat = GL_RGBA;
glFormat = GL_RGBA;
- gltype = GL_UNSIGNED_INT_8_8_8_8;
- } else if (pixelFormat == Graphics::PixelFormat(3, 8, 8, 8, 0, 16, 8, 0, 0)) { // RGB888
- bpp = 3;
- intFormat = GL_RGB;
- glFormat = GL_RGB;
- gltype = GL_UNSIGNED_BYTE;
+ glType = GL_UNSIGNED_BYTE;
+ return true;
} else if (pixelFormat == Graphics::PixelFormat(2, 5, 6, 5, 0, 11, 5, 0, 0)) { // RGB565
- bpp = 2;
- intFormat = GL_RGB;
+ glIntFormat = GL_RGB;
glFormat = GL_RGB;
- gltype = GL_UNSIGNED_SHORT_5_6_5;
- } else if (pixelFormat == Graphics::PixelFormat(2, 5, 5, 5, 1, 11, 6, 1, 0)) { // RGB5551
- bpp = 2;
- intFormat = GL_RGBA;
+ glType = GL_UNSIGNED_SHORT_5_6_5;
+ return true;
+ } else if (pixelFormat == Graphics::PixelFormat(2, 5, 5, 5, 1, 11, 6, 1, 0)) { // RGBA5551
+ glIntFormat = GL_RGBA;
glFormat = GL_RGBA;
- gltype = GL_UNSIGNED_SHORT_5_5_5_1;
+ glType = GL_UNSIGNED_SHORT_5_5_5_1;
+ return true;
} else if (pixelFormat == Graphics::PixelFormat(2, 4, 4, 4, 4, 12, 8, 4, 0)) { // RGBA4444
- bpp = 2;
- intFormat = GL_RGBA;
+ glIntFormat = GL_RGBA;
glFormat = GL_RGBA;
- gltype = GL_UNSIGNED_SHORT_4_4_4_4;
- } else if (pixelFormat.bytesPerPixel == 1) { // CLUT8
- // If uses a palette, create texture as RGB888. The pixel data will be converted
- // later.
- bpp = 3;
- intFormat = GL_RGB;
- glFormat = GL_RGB;
- gltype = GL_UNSIGNED_BYTE;
+ glType = GL_UNSIGNED_SHORT_4_4_4_4;
+ return true;
#ifndef USE_GLES
+#ifdef SCUMM_LITTLE_ENDIAN
+ } else if (pixelFormat == Graphics::PixelFormat(4, 8, 8, 8, 8, 24, 16, 8, 0)) { // RGBA8888
+ glIntFormat = GL_RGBA;
+ glFormat = GL_RGBA;
+ glType = GL_UNSIGNED_INT_8_8_8_8;
+ return true;
+#endif
} else if (pixelFormat == Graphics::PixelFormat(2, 5, 5, 5, 0, 10, 5, 0, 0)) { // RGB555
// GL_BGRA does not exist in every GLES implementation so should not be configured if
// USE_GLES is set.
- bpp = 2;
- intFormat = GL_RGB;
+ glIntFormat = GL_RGB;
glFormat = GL_BGRA;
- gltype = GL_UNSIGNED_SHORT_1_5_5_5_REV;
+ glType = GL_UNSIGNED_SHORT_1_5_5_5_REV;
+ return true;
} else if (pixelFormat == Graphics::PixelFormat(4, 8, 8, 8, 8, 16, 8, 0, 24)) { // ARGB8888
- bpp = 4;
- intFormat = GL_RGBA;
+ glIntFormat = GL_RGBA;
glFormat = GL_BGRA;
- gltype = GL_UNSIGNED_INT_8_8_8_8_REV;
+ glType = GL_UNSIGNED_INT_8_8_8_8_REV;
+ return true;
} else if (pixelFormat == Graphics::PixelFormat(2, 4, 4, 4, 4, 8, 4, 0, 12)) { // ARGB4444
- bpp = 2;
- intFormat = GL_RGBA;
+ glIntFormat = GL_RGBA;
glFormat = GL_BGRA;
- gltype = GL_UNSIGNED_SHORT_4_4_4_4_REV;
+ glType = GL_UNSIGNED_SHORT_4_4_4_4_REV;
+ return true;
+#ifdef SCUMM_BIG_ENDIAN
} else if (pixelFormat == Graphics::PixelFormat(4, 8, 8, 8, 8, 0, 8, 16, 24)) { // ABGR8888
- bpp = 4;
- intFormat = GL_RGBA;
+ glIntFormat = GL_RGBA;
glFormat = GL_RGBA;
- gltype = GL_UNSIGNED_INT_8_8_8_8_REV;
+ glType = GL_UNSIGNED_INT_8_8_8_8_REV;
+ return true;
+#endif
} else if (pixelFormat == Graphics::PixelFormat(4, 8, 8, 8, 8, 8, 16, 24, 0)) { // BGRA8888
- bpp = 4;
- intFormat = GL_RGBA;
+ glIntFormat = GL_RGBA;
glFormat = GL_BGRA;
- gltype = GL_UNSIGNED_BYTE;
- } else if (pixelFormat == Graphics::PixelFormat(3, 8, 8, 8, 0, 0, 8, 16, 0)) { // BGR888
- bpp = 3;
- intFormat = GL_RGB;
- glFormat = GL_BGR;
- gltype = GL_UNSIGNED_BYTE;
+ glType = GL_UNSIGNED_INT_8_8_8_8;
+ return true;
} else if (pixelFormat == Graphics::PixelFormat(2, 5, 6, 5, 0, 0, 5, 11, 0)) { // BGR565
- bpp = 2;
- intFormat = GL_RGB;
+ glIntFormat = GL_RGB;
glFormat = GL_BGR;
- gltype = GL_UNSIGNED_SHORT_5_6_5;
+ glType = GL_UNSIGNED_SHORT_5_6_5;
+ return true;
} else if (pixelFormat == Graphics::PixelFormat(2, 5, 5, 5, 1, 1, 6, 11, 0)) { // BGRA5551
- bpp = 2;
- intFormat = GL_RGBA;
+ glIntFormat = GL_RGBA;
glFormat = GL_BGRA;
- gltype = GL_UNSIGNED_SHORT_5_5_5_1;
+ glType = GL_UNSIGNED_SHORT_5_5_5_1;
+ return true;
} else if (pixelFormat == Graphics::PixelFormat(2, 4, 4, 4, 4, 0, 4, 8, 12)) { // ABGR4444
- bpp = 2;
- intFormat = GL_RGBA;
+ glIntFormat = GL_RGBA;
glFormat = GL_RGBA;
- gltype = GL_UNSIGNED_SHORT_4_4_4_4_REV;
+ glType = GL_UNSIGNED_SHORT_4_4_4_4_REV;
+ return true;
} else if (pixelFormat == Graphics::PixelFormat(2, 4, 4, 4, 4, 4, 8, 12, 0)) { // BGRA4444
- bpp = 2;
- intFormat = GL_RGBA;
+ glIntFormat = GL_RGBA;
glFormat = GL_BGRA;
- gltype = GL_UNSIGNED_SHORT_4_4_4_4;
+ glType = GL_UNSIGNED_SHORT_4_4_4_4;
+ return true;
#endif
} else {
- error("OpenGLGraphicsManager: Pixel format not supported");
+ return false;
}
}
-void OpenGLGraphicsManager::internUpdateScreen() {
- // Clear the screen buffer
- glClear(GL_COLOR_BUFFER_BIT); CHECK_GL_ERROR();
-
- if (_screenNeedsRedraw || !_screenDirtyRect.isEmpty())
- // Refresh texture if dirty
- refreshGameScreen();
-
- int scaleFactor = _videoMode.hardwareHeight / _videoMode.screenHeight;
-
- glPushMatrix();
-
- // Adjust game screen shake position
- glTranslatef(0, _shakePos * scaleFactor, 0); CHECK_GL_ERROR();
-
- // Draw the game screen
- _gameTexture->drawTexture(_displayX, _displayY, _displayWidth, _displayHeight);
-
- glPopMatrix();
-
- if (_overlayVisible) {
- if (_overlayNeedsRedraw || !_overlayDirtyRect.isEmpty())
- // Refresh texture if dirty
- refreshOverlay();
-
- // Draw the overlay
- _overlayTexture->drawTexture(0, 0, _videoMode.overlayWidth, _videoMode.overlayHeight);
- }
-
- if (_cursorVisible) {
- if (_cursorNeedsRedraw)
- // Refresh texture if dirty
- refreshCursor();
+frac_t OpenGLGraphicsManager::getDesiredGameScreenAspect() const {
+ const uint width = _currentState.gameWidth;
+ const uint height = _currentState.gameHeight;
- glPushMatrix();
-
- // Adjust mouse shake position, unless the overlay is visible
- glTranslatef(0, _overlayVisible ? 0 : _shakePos * scaleFactor, 0); CHECK_GL_ERROR();
-
- // Draw the cursor
- if (_overlayVisible)
- _cursorTexture->drawTexture(_cursorState.x - _cursorState.rHotX,
- _cursorState.y - _cursorState.rHotY, _cursorState.rW, _cursorState.rH);
- else
- _cursorTexture->drawTexture(_cursorState.x - _cursorState.vHotX,
- _cursorState.y - _cursorState.vHotY, _cursorState.vW, _cursorState.vH);
-
- glPopMatrix();
- }
-
-#ifdef USE_OSD
- if (_osdAlpha > 0) {
- if (_requireOSDUpdate) {
- updateOSD();
- _requireOSDUpdate = false;
- }
-
- // Update alpha value
- const int diff = g_system->getMillis() - _osdFadeStartTime;
- if (diff > 0) {
- if (diff >= kOSDFadeOutDuration) {
- // Back to full transparency
- _osdAlpha = 0;
- } else {
- // Do a fade out
- _osdAlpha = kOSDInitialAlpha - diff * kOSDInitialAlpha / kOSDFadeOutDuration;
- }
+ if (_currentState.aspectRatioCorrection) {
+ // 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.
+ if ((width == 320 && height == 200) || (width == 640 && height == 400)) {
+ return intToFrac(4) / 3;
}
- // Set the osd transparency
- glColor4f(1.0f, 1.0f, 1.0f, _osdAlpha / 100.0f); CHECK_GL_ERROR();
-
- // Draw the osd texture
- _osdTexture->drawTexture(0, 0, _videoMode.hardwareWidth, _videoMode.hardwareHeight);
-
- // Reset color
- glColor4f(1.0f, 1.0f, 1.0f, 1.0f); CHECK_GL_ERROR();
}
-#endif
-}
-
-void OpenGLGraphicsManager::initGL() {
- // Check available GL Extensions
- GLTexture::initGLExtensions();
-
- // Disable 3D properties
- glDisable(GL_CULL_FACE); CHECK_GL_ERROR();
- glDisable(GL_DEPTH_TEST); CHECK_GL_ERROR();
- glDisable(GL_LIGHTING); CHECK_GL_ERROR();
- glDisable(GL_FOG); CHECK_GL_ERROR();
- glDisable(GL_DITHER); CHECK_GL_ERROR();
- glShadeModel(GL_FLAT); CHECK_GL_ERROR();
- glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_FASTEST); CHECK_GL_ERROR();
-
- // Setup alpha blend (For overlay and cursor)
- glEnable(GL_BLEND); CHECK_GL_ERROR();
- glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); CHECK_GL_ERROR();
-
- // Enable rendering with vertex and coord arrays
- glEnableClientState(GL_VERTEX_ARRAY); CHECK_GL_ERROR();
- glEnableClientState(GL_TEXTURE_COORD_ARRAY); CHECK_GL_ERROR();
- glEnable(GL_TEXTURE_2D); CHECK_GL_ERROR();
-
- // Setup the GL viewport
- glViewport(0, 0, _videoMode.hardwareWidth, _videoMode.hardwareHeight); CHECK_GL_ERROR();
-
- // Setup coordinates system
- glMatrixMode(GL_PROJECTION); CHECK_GL_ERROR();
- glLoadIdentity(); CHECK_GL_ERROR();
-#ifdef USE_GLES
- glOrthof(0, _videoMode.hardwareWidth, _videoMode.hardwareHeight, 0, -1, 1); CHECK_GL_ERROR();
-#else
- glOrtho(0, _videoMode.hardwareWidth, _videoMode.hardwareHeight, 0, -1, 1); CHECK_GL_ERROR();
-#endif
- glMatrixMode(GL_MODELVIEW); CHECK_GL_ERROR();
- glLoadIdentity(); CHECK_GL_ERROR();
+ return intToFrac(width) / height;
}
-void OpenGLGraphicsManager::loadTextures() {
-#ifdef USE_RGB_COLOR
- if (_transactionDetails.formatChanged && _gameTexture) {
- delete _gameTexture;
- _gameTexture = 0;
+void OpenGLGraphicsManager::recalculateDisplayArea() {
+ if (!_gameScreen || _outputScreenHeight == 0) {
+ return;
}
-#endif
- if (!_gameTexture) {
- byte bpp;
- GLenum intformat;
- GLenum format;
- GLenum type;
-#ifdef USE_RGB_COLOR
- getGLPixelFormat(_screenFormat, bpp, intformat, format, type);
-#else
- getGLPixelFormat(Graphics::PixelFormat::createFormatCLUT8(), bpp, intformat, format, type);
-#endif
- _gameTexture = new GLTexture(bpp, intformat, format, type);
- } else
- _gameTexture->refresh();
-
- _overlayFormat = Graphics::PixelFormat(2, 5, 5, 5, 1, 11, 6, 1, 0);
-
- if (!_overlayTexture) {
- byte bpp;
- GLenum intformat;
- GLenum format;
- GLenum type;
- getGLPixelFormat(_overlayFormat, bpp, intformat, format, type);
- _overlayTexture = new GLTexture(bpp, intformat, format, type);
- } else
- _overlayTexture->refresh();
-
- if (!_cursorTexture)
- _cursorTexture = new GLTexture(4, GL_RGBA, GL_RGBA, GL_UNSIGNED_BYTE);
- else
- _cursorTexture->refresh();
-
- GLint filter = _videoMode.antialiasing ? GL_LINEAR : GL_NEAREST;
- _gameTexture->setFilter(filter);
- _overlayTexture->setFilter(filter);
- _cursorTexture->setFilter(filter);
-
- // Allocate texture memory and finish refreshing
- _gameTexture->allocBuffer(_videoMode.screenWidth, _videoMode.screenHeight);
- _overlayTexture->allocBuffer(_videoMode.overlayWidth, _videoMode.overlayHeight);
- _cursorTexture->allocBuffer(_cursorState.w, _cursorState.h);
-
- if (
-#ifdef USE_RGB_COLOR
- _transactionDetails.formatChanged ||
-#endif
- _oldVideoMode.screenWidth != _videoMode.screenWidth ||
- _oldVideoMode.screenHeight != _videoMode.screenHeight)
- _screenData.create(_videoMode.screenWidth, _videoMode.screenHeight,
-#ifdef USE_RGB_COLOR
- _screenFormat
-#else
- Graphics::PixelFormat::createFormatCLUT8()
-#endif
- );
-
-
- if (_oldVideoMode.overlayWidth != _videoMode.overlayWidth ||
- _oldVideoMode.overlayHeight != _videoMode.overlayHeight)
- _overlayData.create(_videoMode.overlayWidth, _videoMode.overlayHeight,
- _overlayFormat);
+ const frac_t outputAspect = intToFrac(_outputScreenWidth) / _outputScreenHeight;
+ const frac_t desiredAspect = getDesiredGameScreenAspect();
- _screenNeedsRedraw = true;
- _overlayNeedsRedraw = true;
- _cursorNeedsRedraw = true;
+ _displayWidth = _outputScreenWidth;
+ _displayHeight = _outputScreenHeight;
- // We need to setup a proper unpack alignment value here, else we will
- // get problems with the texture updates, in case the surface data is
- // not properly aligned.
- // It is noteworthy this assumes the OSD uses the same BPP as the overlay
- // and that the cursor works with any alignment setting.
- int newAlignment = Common::gcd(_gameTexture->getBytesPerPixel(), _overlayTexture->getBytesPerPixel());
- assert(newAlignment == 1 || newAlignment == 2 || newAlignment == 4);
- glPixelStorei(GL_UNPACK_ALIGNMENT, newAlignment);
-
- // We use a "pack" alignment (when reading from textures) to 4 here,
- // since the only place where we really use it is the BMP screenshot
- // code and that requires the same alignment too.
- glPixelStorei(GL_PACK_ALIGNMENT, 4);
-
-#ifdef USE_OSD
- if (!_osdTexture)
- _osdTexture = new GLTexture(2, GL_RGBA, GL_RGBA, GL_UNSIGNED_SHORT_5_5_5_1);
- else
- _osdTexture->refresh();
-
- _osdTexture->allocBuffer(_videoMode.overlayWidth, _videoMode.overlayHeight);
+ // Adjust one dimension for mantaining the aspect ratio.
+ if (outputAspect < desiredAspect) {
+ _displayHeight = intToFrac(_displayWidth) / desiredAspect;
+ } else if (outputAspect > desiredAspect) {
+ _displayWidth = fracToInt(_displayHeight * desiredAspect);
+ }
- // Update the OSD in case it is used right now
- _requireOSDUpdate = true;
-#endif
+ // We center the screen in the middle for now.
+ _displayX = (_outputScreenWidth - _displayWidth ) / 2;
+ _displayY = (_outputScreenHeight - _displayHeight) / 2;
}
-bool OpenGLGraphicsManager::loadGFXMode() {
- // Initialize OpenGL settings
- initGL();
-
- loadTextures();
-
- refreshCursorScale();
-
- refreshDisplaySize();
-
- internUpdateScreen();
-
- return true;
-}
+void OpenGLGraphicsManager::updateCursorPalette() {
+ if (!_cursor || !_cursor->hasPalette()) {
+ return;
+ }
-void OpenGLGraphicsManager::unloadGFXMode() {
+ if (_cursorPaletteEnabled) {
+ _cursor->setPalette(0, 256, _cursorPalette);
+ } else {
+ _cursor->setPalette(0, 256, _gamePalette);
+ }
+ // We remove all alpha bits from the palette entry of the color key.
+ // This makes sure its properly handled as color key.
+ const Graphics::PixelFormat &hardwareFormat = _cursor->getHardwareFormat();
+ const uint32 aMask = (0xFF >> hardwareFormat.aLoss) << hardwareFormat.aShift;
+
+ if (hardwareFormat.bytesPerPixel == 2) {
+ uint16 *palette = (uint16 *)_cursor->getPalette() + _cursorKeyColor;
+ *palette &= ~aMask;
+ } else if (hardwareFormat.bytesPerPixel == 4) {
+ uint32 *palette = (uint32 *)_cursor->getPalette() + _cursorKeyColor;
+ *palette &= ~aMask;
+ } else {
+ warning("OpenGLGraphicsManager::updateCursorPalette: Unsupported pixel depth %d", hardwareFormat.bytesPerPixel);
+ }
}
-void OpenGLGraphicsManager::setScale(int newScale) {
- assert(_transactionMode == kTransactionActive);
-
- if (newScale == _videoMode.scaleFactor)
+void OpenGLGraphicsManager::recalculateCursorScaling() {
+ if (!_cursor || !_gameScreen) {
return;
+ }
- _videoMode.scaleFactor = newScale;
- _transactionDetails.sizeChanged = true;
-}
+ // By default we use the unscaled versions.
+ _cursorHotspotXScaled = _cursorHotspotX;
+ _cursorHotspotYScaled = _cursorHotspotY;
+ _cursorWidthScaled = _cursor->getWidth();
+ _cursorHeightScaled = _cursor->getHeight();
-void OpenGLGraphicsManager::toggleAntialiasing() {
- assert(_transactionMode == kTransactionActive);
+ // In case scaling is actually enabled we will scale the cursor according
+ // to the game screen.
+ if (!_cursorDontScale) {
+ const frac_t screenScaleFactorX = intToFrac(_displayWidth) / _gameScreen->getWidth();
+ const frac_t screenScaleFactorY = intToFrac(_displayHeight) / _gameScreen->getHeight();
- _videoMode.antialiasing = !_videoMode.antialiasing;
- _transactionDetails.filterChanged = true;
-}
+ _cursorHotspotXScaled = fracToInt(_cursorHotspotXScaled * screenScaleFactorX);
+ _cursorWidthScaled = fracToInt(_cursorWidthScaled * screenScaleFactorX);
-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
- && ((_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;
- else
- return _videoMode.screenWidth * 10000 / _videoMode.screenHeight;
+ _cursorHotspotYScaled = fracToInt(_cursorHotspotYScaled * screenScaleFactorY);
+ _cursorHeightScaled = fracToInt(_cursorHeightScaled * screenScaleFactorY);
+ }
}
-void OpenGLGraphicsManager::adjustMousePosition(int16 &x, int16 &y) {
- if (_overlayVisible)
- return;
-
- x -= _displayX;
- y -= _displayY;
-
- if (_displayWidth != _videoMode.screenWidth)
- x = x * _videoMode.screenWidth / _displayWidth;
- if (_displayHeight != _videoMode.screenHeight)
- y = y * _videoMode.screenHeight / _displayHeight;
+#ifdef USE_OSD
+const Graphics::Font *OpenGLGraphicsManager::getFontOSD() {
+ return FontMan.getFontByUsage(Graphics::FontManager::kLocalizedFont);
}
+#endif
-bool OpenGLGraphicsManager::saveScreenshot(const char *filename) {
- int width = _videoMode.hardwareWidth;
- int height = _videoMode.hardwareHeight;
+void OpenGLGraphicsManager::saveScreenshot(const Common::String &filename) const {
+ const uint width = _outputScreenWidth;
+ const uint height = _outputScreenHeight;
// A line of a BMP image must have a size divisible by 4.
// We calculate the padding bytes needed here.
// Since we use a 3 byte per pixel mode, we can use width % 4 here, since
// it is equal to 4 - (width * 3) % 4. (4 - (width * Bpp) % 4, is the
// usual way of computing the padding bytes required).
- const int linePaddingSize = width % 4;
- const int lineSize = width * 3 + linePaddingSize;
+ const uint linePaddingSize = width % 4;
+ const uint lineSize = width * 3 + linePaddingSize;
// Allocate memory for screenshot
uint8 *pixels = new uint8[lineSize * height];
// Get pixel data from OpenGL buffer
-#ifdef USE_GLES
- glReadPixels(0, 0, width, height, GL_RGB, GL_UNSIGNED_BYTE, pixels); CHECK_GL_ERROR();
-#else
- if (_formatBGR) {
- glReadPixels(0, 0, width, height, GL_BGR, GL_UNSIGNED_BYTE, pixels); CHECK_GL_ERROR();
- } else {
- glReadPixels(0, 0, width, height, GL_RGB, GL_UNSIGNED_BYTE, pixels); CHECK_GL_ERROR();
+ GLCALL(glReadPixels(0, 0, width, height, GL_RGB, GL_UNSIGNED_BYTE, pixels));
+
+ // BMP stores as BGR. Since we can't assume that GL_BGR is supported we
+ // will swap the components from the RGB we read to BGR on our own.
+ for (uint y = height; y-- > 0;) {
+ uint8 *line = pixels + y * lineSize;
+
+ for (uint x = width; x > 0; --x, line += 3) {
+ SWAP(line[0], line[2]);
+ }
}
-#endif
// Open file
Common::DumpFile out;
@@ -1324,73 +1161,6 @@ bool OpenGLGraphicsManager::saveScreenshot(const char *filename) {
// Free allocated memory
delete[] pixels;
-
- return true;
}
-const char *OpenGLGraphicsManager::getCurrentModeName() {
- const char *modeName = 0;
- const OSystem::GraphicsMode *g = getSupportedGraphicsModes();
- while (g->name) {
- if (g->id == _videoMode.mode) {
- modeName = g->description;
- break;
- }
- g++;
- }
- return modeName;
-}
-
-#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 = getFontOSD();
-
- if (_osdSurface.w != _osdTexture->getWidth() || _osdSurface.h != _osdTexture->getHeight())
- _osdSurface.create(_osdTexture->getWidth(), _osdTexture->getHeight(), _overlayFormat);
- else
- // Clear everything
- memset(_osdSurface.getPixels(), 0, _osdSurface.h * _osdSurface.pitch);
-
- // Determine a rect which would contain the message string (clipped to the
- // screen dimensions).
- const int vOffset = 6;
- const int lineSpacing = 1;
- const int lineHeight = font->getFontHeight() + 2 * lineSpacing;
- int width = 0;
- int height = lineHeight * _osdLines.size() + 2 * vOffset;
- for (uint i = 0; i < _osdLines.size(); i++) {
- width = MAX(width, font->getStringWidth(_osdLines[i]) + 14);
- }
-
- // Clip the rect
- if (width > _osdSurface.w)
- width = _osdSurface.w;
- if (height > _osdSurface.h)
- height = _osdSurface.h;
-
- int dstX = (_osdSurface.w - width) / 2;
- int dstY = (_osdSurface.h - height) / 2;
-
- // Draw a dark gray rect (R = 40, G = 40, B = 40)
- const uint16 color = 0x294B;
- _osdSurface.fillRect(Common::Rect(dstX, dstY, dstX + width, dstY + height), color);
-
- // Render the message, centered, and in white
- for (uint i = 0; i < _osdLines.size(); i++) {
- font->drawString(&_osdSurface, _osdLines[i],
- dstX, dstY + i * lineHeight + vOffset + lineSpacing, width,
- 0xFFFF, Graphics::kTextAlignCenter);
- }
-
- // Update the texture
- _osdTexture->updateBuffer(_osdSurface.getPixels(), _osdSurface.pitch, 0, 0,
- _osdSurface.w, _osdSurface.h);
-}
-#endif
-
-#endif
+} // End of namespace OpenGL
diff --git a/backends/graphics/opengl/opengl-graphics.h b/backends/graphics/opengl/opengl-graphics.h
index 9d8d418d11..d16f92d148 100644
--- a/backends/graphics/opengl/opengl-graphics.h
+++ b/backends/graphics/opengl/opengl-graphics.h
@@ -8,338 +8,483 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public 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_OPENGL_H
-#define BACKENDS_GRAPHICS_OPENGL_H
+#ifndef BACKENDS_GRAPHICS_OPENGL_OPENGL_GRAPHICS_H
+#define BACKENDS_GRAPHICS_OPENGL_OPENGL_GRAPHICS_H
-#include "backends/graphics/opengl/gltexture.h"
+#include "backends/graphics/opengl/opengl-sys.h"
#include "backends/graphics/graphics.h"
-#include "common/array.h"
-#include "common/rect.h"
-#include "graphics/font.h"
-#include "graphics/pixelformat.h"
-// Uncomment this to enable the 'on screen display' code.
-#define USE_OSD 1
+#include "common/frac.h"
+#include "common/mutex.h"
+
+namespace Graphics {
+class Font;
+} // End of namespace Graphics
namespace OpenGL {
-// The OpenGL GFX modes. They have to be inside the OpenGL namespace so they
-// do not clash with the SDL GFX modes.
+
+// HACK: We use glColor in the OSD code. This might not be working on GL ES but
+// we still enable it because Tizen already shipped with it. Also, the
+// SurfaceSDL backend enables it and disabling it can cause issues in sdl.cpp.
+#define USE_OSD 1
+
+class Texture;
+
enum {
- GFX_NORMAL = 0,
- GFX_CONSERVE = 1,
- GFX_ORIGINAL = 2
+ GFX_LINEAR = 0,
+ GFX_NEAREST = 1
};
-}
-
-/**
- * OpenGL graphics manager. This is an abstract class, it does not do the
- * window and OpenGL context initialization.
- * Derived classes should at least override internUpdateScreen for doing
- * 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 {
+class OpenGLGraphicsManager : virtual public GraphicsManager {
public:
OpenGLGraphicsManager();
virtual ~OpenGLGraphicsManager();
+ // GraphicsManager API
virtual bool hasFeature(OSystem::Feature f);
virtual void setFeatureState(OSystem::Feature f, bool enable);
virtual bool getFeatureState(OSystem::Feature f);
- static const OSystem::GraphicsMode *supportedGraphicsModes();
virtual const OSystem::GraphicsMode *getSupportedGraphicsModes() const;
virtual int getDefaultGraphicsMode() const;
virtual bool setGraphicsMode(int mode);
virtual int getGraphicsMode() const;
- virtual void resetGraphicsScale();
+
+ virtual void resetGraphicsScale() {}
+
#ifdef USE_RGB_COLOR
virtual Graphics::PixelFormat getScreenFormat() const;
virtual Common::List<Graphics::PixelFormat> getSupportedFormats() const = 0;
#endif
- virtual void initSize(uint width, uint height, const Graphics::PixelFormat *format = NULL);
- virtual int getScreenChangeID() const;
virtual void beginGFXTransaction();
virtual OSystem::TransactionError endGFXTransaction();
- virtual int16 getHeight();
+ virtual int getScreenChangeID() const;
+
+ virtual void initSize(uint width, uint height, const Graphics::PixelFormat *format);
+
virtual int16 getWidth();
-protected:
- // PaletteManager API
- virtual void setPalette(const byte *colors, uint start, uint num);
- virtual void grabPalette(byte *colors, uint start, uint num);
+ virtual int16 getHeight();
-public:
virtual void copyRectToScreen(const void *buf, int pitch, int x, int y, int w, int h);
- virtual Graphics::Surface *lockScreen();
- virtual void unlockScreen();
virtual void fillScreen(uint32 col);
- virtual void updateScreen();
+
virtual void setShakePos(int shakeOffset);
- virtual void setFocusRectangle(const Common::Rect &rect);
+
+ virtual void updateScreen();
+
+ virtual Graphics::Surface *lockScreen();
+ virtual void unlockScreen();
+
+ virtual void setFocusRectangle(const Common::Rect& rect);
virtual void clearFocusRectangle();
+ virtual int16 getOverlayWidth();
+ virtual int16 getOverlayHeight();
+
virtual void showOverlay();
virtual void hideOverlay();
+
virtual Graphics::PixelFormat getOverlayFormat() const;
+
+ virtual void copyRectToOverlay(const void *buf, int pitch, int x, int y, int w, int h);
virtual void clearOverlay();
virtual void grabOverlay(void *buf, int pitch);
- virtual void copyRectToOverlay(const void *buf, int pitch, int x, int y, int w, int h);
- virtual int16 getOverlayHeight();
- virtual int16 getOverlayWidth();
virtual bool showMouse(bool visible);
virtual void warpMouse(int x, int y);
- virtual void setMouseCursor(const void *buf, uint w, uint h, int hotspotX, int hotspotY, uint32 keycolor, bool dontScale = false, const Graphics::PixelFormat *format = NULL);
+ virtual void setMouseCursor(const void *buf, uint w, uint h, int hotspotX, int hotspotY, uint32 keycolor, bool dontScale, const Graphics::PixelFormat *format);
virtual void setCursorPalette(const byte *colors, uint start, uint num);
virtual void displayMessageOnOSD(const char *msg);
+
+ // PaletteManager interface
+ virtual void setPalette(const byte *colors, uint start, uint num);
+ virtual void grabPalette(byte *colors, uint start, uint num);
+
protected:
/**
- * Setup OpenGL settings
+ * Set up the actual screen size available for the OpenGL code to do any
+ * drawing.
+ *
+ * @param width The width of the screen.
+ * @param height The height of the screen.
+ */
+ void setActualScreenSize(uint width, uint height);
+
+ /**
+ * Notify the manager of a OpenGL context change. This should be the first
+ * thing to call after you created an OpenGL (ES) context!
+ *
+ * @param defaultFormat The new default format for the game screen
+ * (this is used for the CLUT8 game screens).
+ * @param defaultFromatAlpha The new default format with an alpha channel
+ * (this is used for the overlay and cursor).
+ */
+ void notifyContextCreate(const Graphics::PixelFormat &defaultFormat, const Graphics::PixelFormat &defaultFormatAlpha);
+
+ /**
+ * Notify the manager that the OpenGL context is about to be destroyed.
+ * This will free up/reset internal OpenGL related state and *must* be
+ * called whenever a context might be created again after destroying a
+ * context.
*/
- virtual void initGL();
+ void notifyContextDestroy();
/**
- * Creates and refreshs OpenGL textures.
+ * Adjust the physical mouse coordinates according to the currently visible screen.
*/
- virtual void loadTextures();
+ void adjustMousePosition(int16 &x, int16 &y);
+
+ /**
+ * Set up the mouse position for graphics output.
+ *
+ * @param x X coordinate in physical coordinates.
+ * @param y Y coordinate in physical coordinates.
+ */
+ void setMousePosition(int x, int y) { _cursorX = x; _cursorY = y; }
+
+ /**
+ * Query the mouse position in physical coordinates.
+ */
+ void getMousePosition(int16 &x, int16 &y) const { x = _cursorX; y = _cursorY; }
+
+ /**
+ * Set up the mouse position for the (event) system.
+ *
+ * @param x X coordinate in physical coordinates.
+ * @param y Y coordinate in physical coordinates.
+ */
+ virtual void setInternalMousePosition(int x, int y) = 0;
+
+private:
+ /**
+ * Create a texture with the specified pixel format.
+ *
+ * @param format The pixel format the Texture object should accept as
+ * input.
+ * @param wantAlpha For CLUT8 textures this marks whether an alpha
+ * channel should be used.
+ * @return A pointer to the texture or nullptr on failure.
+ */
+ Texture *createTexture(const Graphics::PixelFormat &format, bool wantAlpha = false);
//
- // GFX and video
+ // Transaction support
//
- enum {
- kTransactionNone = 0,
- kTransactionActive = 1,
- kTransactionRollback = 2
- };
-
- struct TransactionDetails {
- bool sizeChanged;
- bool needRefresh;
- bool needUpdatescreen;
- bool filterChanged;
+ struct VideoState {
+ VideoState() : valid(false), gameWidth(0), gameHeight(0),
#ifdef USE_RGB_COLOR
- bool formatChanged;
+ gameFormat(),
#endif
- };
- TransactionDetails _transactionDetails;
- int _transactionMode;
-
- struct VideoState {
- bool setup;
+ aspectRatioCorrection(false), graphicsMode(GFX_LINEAR) {
+ }
- bool fullscreen;
+ bool valid;
- int mode;
- int scaleFactor;
- bool antialiasing;
+ uint gameWidth, gameHeight;
+#ifdef USE_RGB_COLOR
+ Graphics::PixelFormat gameFormat;
+#endif
bool aspectRatioCorrection;
+ int graphicsMode;
- int screenWidth, screenHeight;
- int overlayWidth, overlayHeight;
- int hardwareWidth, hardwareHeight;
+ bool operator==(const VideoState &right) {
+ return gameWidth == right.gameWidth && gameHeight == right.gameHeight
#ifdef USE_RGB_COLOR
- Graphics::PixelFormat format;
+ && gameFormat == right.gameFormat
#endif
+ && aspectRatioCorrection == right.aspectRatioCorrection
+ && graphicsMode == right.graphicsMode;
+ }
+
+ bool operator!=(const VideoState &right) {
+ return !(*this == right);
+ }
};
- VideoState _videoMode, _oldVideoMode;
/**
- * Sets the OpenGL texture format for the given pixel format. If format is not support will raise an error.
+ * The currently setup video state.
+ */
+ VideoState _currentState;
+
+ /**
+ * The old video state used when doing a transaction rollback.
*/
- virtual void getGLPixelFormat(Graphics::PixelFormat pixelFormat, byte &bpp, GLenum &intFormat, GLenum &glFormat, GLenum &type);
+ VideoState _oldState;
+
+protected:
+ enum TransactionMode {
+ kTransactionNone = 0,
+ kTransactionActive = 1,
+ kTransactionRollback = 2
+ };
- virtual void internUpdateScreen();
- virtual bool loadGFXMode();
- virtual void unloadGFXMode();
+ TransactionMode getTransactionMode() const { return _transactionMode; }
+private:
/**
- * Setup the fullscreen mode state.
+ * The current transaction mode.
*/
- void setFullscreenMode(bool enable);
+ TransactionMode _transactionMode;
/**
- * Query the fullscreen state.
+ * The current screen change ID.
*/
- inline bool getFullscreenMode() const { return _videoMode.fullscreen; }
+ int _screenChangeID;
+protected:
/**
- * Set the scale factor.
+ * Set up the requested video mode. This takes parameters which describe
+ * what resolution the game screen requests (this is possibly aspect ratio
+ * corrected!).
*
- * This can only be used in a GFX transaction.
+ * A sub-class should take these parameters as hints. It might very well
+ * set up a mode which it thinks suites the situation best.
*
- * @param newScale New scale factor.
+ * @parma requestedWidth This is the requested actual game screen width.
+ * @param requestedHeight This is the requested actual game screen height.
+ * @param format This is the requested pixel format of the virtual game screen.
+ * @return true on success, false otherwise
*/
- void setScale(int newScale);
+ virtual bool loadVideoMode(uint requestedWidth, uint requestedHeight, const Graphics::PixelFormat &format) = 0;
/**
- * Query the scale factor.
+ * Save a screenshot of the full display as BMP to the given file. This
+ * uses Common::DumpFile for writing the screenshot.
+ *
+ * @param filename The output filename.
*/
- inline int getScale() const { return _videoMode.scaleFactor; }
+ void saveScreenshot(const Common::String &filename) const;
+
+private:
+ //
+ // OpenGL utilities
+ //
/**
- * Toggle the antialiasing state of the current video mode.
+ * Try to determine the internal parameters for a given pixel format.
*
- * This can only be used in a GFX transaction.
+ * @return true when the format can be used, false otherwise.
*/
- void toggleAntialiasing();
+ bool getGLPixelFormat(const Graphics::PixelFormat &pixelFormat, GLenum &glIntFormat, GLenum &glFormat, GLenum &glType) const;
+
+ //
+ // Actual hardware screen
+ //
/**
- * Query the antialiasing state.
+ * The width of the physical output.
*/
- inline bool getAntialiasingState() const { return _videoMode.antialiasing; }
+ uint _outputScreenWidth;
- // Drawing coordinates for the current display mode and scale
- int _displayX;
- int _displayY;
- int _displayWidth;
- int _displayHeight;
+ /**
+ * The height of the physical output.
+ */
+ uint _outputScreenHeight;
- virtual const char *getCurrentModeName();
+ /**
+ * @return The desired aspect of the game screen.
+ */
+ frac_t getDesiredGameScreenAspect() const;
- virtual void calculateDisplaySize(int &width, int &height);
- virtual void refreshDisplaySize();
+ /**
+ * Recalculates the area used to display the game screen.
+ */
+ void recalculateDisplayArea();
- uint getAspectRatio() const;
+ /**
+ * The X coordinate of the game screen.
+ */
+ uint _displayX;
- void setFormatIsBGR(bool isBGR) { _formatBGR = isBGR; }
- bool _formatBGR;
+ /**
+ * The Y coordinate of the game screen.
+ */
+ uint _displayY;
+
+ /**
+ * The width of the game screen in physical coordinates.
+ */
+ uint _displayWidth;
+
+ /**
+ * The height of the game screen in physical coordinates.
+ */
+ uint _displayHeight;
+
+ /**
+ * The default pixel format of the backend.
+ */
+ Graphics::PixelFormat _defaultFormat;
+
+ /**
+ * The default pixel format with an alpha channel.
+ */
+ Graphics::PixelFormat _defaultFormatAlpha;
//
// Game screen
//
- GLTexture *_gameTexture;
- Graphics::Surface _screenData;
- int _screenChangeCount;
- bool _screenNeedsRedraw;
- Common::Rect _screenDirtyRect;
-#ifdef USE_RGB_COLOR
- Graphics::PixelFormat _screenFormat;
-#endif
- byte *_gamePalette;
+ /**
+ * The virtual game screen.
+ */
+ Texture *_gameScreen;
- virtual void refreshGameScreen();
+ /**
+ * The game palette if in CLUT8 mode.
+ */
+ byte _gamePalette[3 * 256];
- // Shake mode
- int _shakePos;
+ /**
+ * The offset by which the screen is moved vertically.
+ */
+ int _gameScreenShakeOffset;
//
// Overlay
//
- GLTexture *_overlayTexture;
- Graphics::Surface _overlayData;
- Graphics::PixelFormat _overlayFormat;
- bool _overlayVisible;
- bool _overlayNeedsRedraw;
- Common::Rect _overlayDirtyRect;
- virtual void refreshOverlay();
+ /**
+ * The overlay screen.
+ */
+ Texture *_overlay;
+
+ /**
+ * Whether the overlay is visible or not.
+ */
+ bool _overlayVisible;
//
- // Mouse
+ // Cursor
//
- struct MousePos {
- // The mouse position in hardware screen coordinates.
- int16 x, y;
- // The size and hotspot of the original cursor image.
- int16 w, h;
- int16 hotX, hotY;
+ /**
+ * Set up the correct cursor palette.
+ */
+ void updateCursorPalette();
- // The size and hotspot of the scaled cursor, in real coordinates.
- int16 rW, rH;
- int16 rHotX, rHotY;
+ /**
+ * The cursor image.
+ */
+ Texture *_cursor;
- // The size and hotspot of the scaled cursor, in game coordinates.
- int16 vW, vH;
- int16 vHotX, vHotY;
+ /**
+ * X coordinate of the cursor in phyiscal coordinates.
+ */
+ int _cursorX;
- MousePos() : x(0), y(0), w(0), h(0), hotX(0), hotY(0),
- rW(0), rH(0), rHotX(0), rHotY(0), vW(0), vH(0),
- vHotX(0), vHotY(0) {}
- };
+ /**
+ * Y coordinate of the cursor in physical coordinates.
+ */
+ int _cursorY;
- GLTexture *_cursorTexture;
- Graphics::Surface _cursorData;
- Graphics::PixelFormat _cursorFormat;
- byte *_cursorPalette;
- bool _cursorPaletteDisabled;
- MousePos _cursorState;
- bool _cursorVisible;
+ /**
+ * The X offset for the cursor hotspot in unscaled coordinates.
+ */
+ int _cursorHotspotX;
+
+ /**
+ * The Y offset for the cursor hotspot in unscaled coordinates.
+ */
+ int _cursorHotspotY;
+
+ /**
+ * Recalculate the cursor scaling. Scaling is always done according to
+ * the game screen.
+ */
+ void recalculateCursorScaling();
+
+ /**
+ * The X offset for the cursor hotspot in scaled coordinates.
+ */
+ int _cursorHotspotXScaled;
+
+ /**
+ * The Y offset for the cursor hotspot in scaled coordinates.
+ */
+ int _cursorHotspotYScaled;
+
+ /**
+ * The width of the cursor scaled coordinates.
+ */
+ uint _cursorWidthScaled;
+
+ /**
+ * The height of the cursor scaled coordinates.
+ */
+ uint _cursorHeightScaled;
+
+ /**
+ * The key color.
+ */
uint32 _cursorKeyColor;
- bool _cursorDontScale;
- bool _cursorNeedsRedraw;
/**
- * Set up the mouse position for graphics output.
- *
- * @param x X coordinate in native coordinates.
- * @param y Y coordinate in native coordinates.
+ * Whether the cursor is actually visible.
*/
- void setMousePosition(int x, int y) { _cursorState.x = x; _cursorState.y = y; }
+ bool _cursorVisible;
- virtual void refreshCursor();
- virtual void refreshCursorScale();
+ /**
+ * Whether no cursor scaling should be applied.
+ */
+ bool _cursorDontScale;
/**
- * Set up the mouse position for the (event) system.
- *
- * @param x X coordinate in native coordinates.
- * @param y Y coordinate in native coordinates.
+ * Whether the special cursor palette is enabled.
*/
- virtual void setInternalMousePosition(int x, int y) = 0;
+ bool _cursorPaletteEnabled;
/**
- * Adjusts hardware screen coordinates to either overlay or game screen
- * coordinates depending on whether the overlay is visible or not.
- *
- * @param x X coordinate of the mouse position.
- * @param y Y coordinate of the mouse position.
+ * The special cursor palette in case enabled.
*/
- virtual void adjustMousePosition(int16 &x, int16 &y);
+ byte _cursorPalette[3 * 256];
+#ifdef USE_OSD
//
- // Misc
+ // OSD
//
- virtual bool saveScreenshot(const char *filename);
-
-#ifdef USE_OSD
+protected:
/**
* Returns the font used for on screen display
*/
virtual const Graphics::Font *getFontOSD();
+private:
/**
- * Update the OSD texture / surface.
+ * The OSD's contents.
*/
- void updateOSD();
+ Texture *_osd;
/**
- * The OSD contents.
+ * Current opacity level of the OSD.
*/
- Common::Array<Common::String> _osdLines;
-
- GLTexture *_osdTexture;
- Graphics::Surface _osdSurface;
uint8 _osdAlpha;
+
+ /**
+ * When fading the OSD has started.
+ */
uint32 _osdFadeStartTime;
- bool _requireOSDUpdate;
+
+ /**
+ * Mutex to allow displayMessageOnOSD to be used from the audio thread.
+ */
+ Common::Mutex _osdMutex;
+
enum {
kOSDFadeOutDelay = 2 * 1000,
kOSDFadeOutDuration = 500,
@@ -348,4 +493,6 @@ protected:
#endif
};
+} // End of namespace OpenGL
+
#endif
diff --git a/backends/graphics/opengl/glerrorcheck.cpp b/backends/graphics/opengl/opengl-sys.h
index 439593577d..a3524b28d2 100644
--- a/backends/graphics/opengl/glerrorcheck.cpp
+++ b/backends/graphics/opengl/opengl-sys.h
@@ -8,25 +8,25 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope 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.
*
*/
-#include "common/scummsys.h"
+#ifndef BACKENDS_GRAPHICS_OPENGL_OPENGL_H
+#define BACKENDS_GRAPHICS_OPENGL_OPENGL_H
-#if defined(DEBUG) && defined(USE_OPENGL)
+// The purpose of this header is to include the OpenGL headers in an uniform
+// fashion. A notable example for a non standard port is the Tizen port.
-#include "backends/graphics/opengl/glerrorcheck.h"
-#include "common/textconsole.h"
-#include "common/str.h"
+#include "common/scummsys.h"
#ifdef WIN32
#if defined(ARRAYSIZE) && !defined(_WINDOWS_)
@@ -37,31 +37,21 @@
#undef ARRAYSIZE
#endif
-#if defined(USE_GLES)
+// HACK: In case common/util.h has been included already we need to make sure
+// to define ARRAYSIZE again in case of Windows.
+#if !defined(ARRAYSIZE) && defined(COMMON_UTIL_H)
+#define ARRAYSIZE(x) ((int)(sizeof(x) / sizeof(x[0])))
+#endif
+
+#if defined(TIZEN)
+#include <FGraphicsOpengl.h>
+using namespace Tizen::Graphics::Opengl;
+#elif defined(USE_GLES)
#include <GLES/gl.h>
-#elif defined(MACOSX)
-#include <OpenGL/gl.h>
+#elif defined(SDL_BACKEND)
+#include <SDL_opengl.h>
#else
#include <GL/gl.h>
#endif
-static Common::String getGlErrStr(GLenum error) {
- switch (error) {
- case GL_NO_ERROR: return "GL_NO_ERROR";
- case GL_INVALID_ENUM: return "GL_INVALID_ENUM";
- case GL_INVALID_OPERATION: return "GL_INVALID_OPERATION";
- case GL_STACK_OVERFLOW: return "GL_STACK_OVERFLOW";
- case GL_STACK_UNDERFLOW: return "GL_STACK_UNDERFLOW";
- case GL_OUT_OF_MEMORY: return "GL_OUT_OF_MEMORY";
- }
-
- return Common::String::format("(Unknown GL error code 0x%x)", error);
-}
-
-void checkGlError(const char *file, int line) {
- GLenum error = glGetError();
- if (error != GL_NO_ERROR)
- warning("%s:%d: GL error: %s", file, line, getGlErrStr(error).c_str());
-}
-
#endif
diff --git a/backends/graphics/opengl/texture.cpp b/backends/graphics/opengl/texture.cpp
new file mode 100644
index 0000000000..7b0b22d630
--- /dev/null
+++ b/backends/graphics/opengl/texture.cpp
@@ -0,0 +1,374 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public 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/opengl/texture.h"
+#include "backends/graphics/opengl/extensions.h"
+#include "backends/graphics/opengl/debug.h"
+
+#include "common/rect.h"
+#include "common/textconsole.h"
+
+namespace OpenGL {
+
+static GLuint nextHigher2(GLuint v) {
+ if (v == 0)
+ return 1;
+ v--;
+ v |= v >> 1;
+ v |= v >> 2;
+ v |= v >> 4;
+ v |= v >> 8;
+ v |= v >> 16;
+ return ++v;
+}
+
+GLint Texture::_maxTextureSize = 0;
+
+void Texture::queryTextureInformation() {
+ glGetIntegerv(GL_MAX_TEXTURE_SIZE, &_maxTextureSize);
+ debug(5, "OpenGL maximum texture size: %d", _maxTextureSize);
+}
+
+Texture::Texture(GLenum glIntFormat, GLenum glFormat, GLenum glType, const Graphics::PixelFormat &format)
+ : _glIntFormat(glIntFormat), _glFormat(glFormat), _glType(glType), _format(format), _glFilter(GL_NEAREST),
+ _glTexture(0), _textureData(), _userPixelData(), _allDirty(false) {
+ recreateInternalTexture();
+}
+
+Texture::~Texture() {
+ releaseInternalTexture();
+ _textureData.free();
+}
+
+void Texture::releaseInternalTexture() {
+ GLCALL(glDeleteTextures(1, &_glTexture));
+ _glTexture = 0;
+}
+
+void Texture::recreateInternalTexture() {
+ // Release old texture name in case it exists.
+ releaseInternalTexture();
+
+ // Get a new texture name.
+ GLCALL(glGenTextures(1, &_glTexture));
+
+ // Set up all texture parameters.
+ GLCALL(glBindTexture(GL_TEXTURE_2D, _glTexture));
+ GLCALL(glPixelStorei(GL_UNPACK_ALIGNMENT, 1));
+ GLCALL(glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, _glFilter));
+ GLCALL(glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, _glFilter));
+ GLCALL(glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE));
+ GLCALL(glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE));
+
+ // In case there is an actual texture setup we reinitialize it.
+ if (_textureData.getPixels()) {
+ // Allocate storage for OpenGL texture.
+ GLCALL(glTexImage2D(GL_TEXTURE_2D, 0, _glIntFormat, _textureData.w,
+ _textureData.h, 0, _glFormat, _glType, NULL));
+
+ // Mark dirts such that it will be completely refreshed the next time.
+ flagDirty();
+ }
+}
+
+void Texture::enableLinearFiltering(bool enable) {
+ if (enable) {
+ _glFilter = GL_LINEAR;
+ } else {
+ _glFilter = GL_NEAREST;
+ }
+
+ GLCALL(glBindTexture(GL_TEXTURE_2D, _glTexture));
+
+ GLCALL(glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, _glFilter));
+ GLCALL(glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, _glFilter));
+}
+
+void Texture::allocate(uint width, uint height) {
+ uint texWidth = width, texHeight = height;
+ if (!g_extNPOTSupported) {
+ texWidth = nextHigher2(texWidth);
+ texHeight = nextHigher2(texHeight);
+ }
+
+ // In case the needed texture dimension changed we will reinitialize the
+ // texture.
+ if (texWidth != _textureData.w || texHeight != _textureData.h) {
+ // Create a buffer for the texture data.
+ _textureData.create(texWidth, texHeight, _format);
+
+ // Set the texture.
+ GLCALL(glBindTexture(GL_TEXTURE_2D, _glTexture));
+
+ // Allocate storage for OpenGL texture.
+ GLCALL(glTexImage2D(GL_TEXTURE_2D, 0, _glIntFormat, _textureData.w,
+ _textureData.h, 0, _glFormat, _glType, NULL));
+ }
+
+ // Create a sub-buffer for raw access.
+ _userPixelData = _textureData.getSubArea(Common::Rect(width, height));
+}
+
+void Texture::copyRectToTexture(uint x, uint y, uint w, uint h, const void *srcPtr, uint srcPitch) {
+ Graphics::Surface *dstSurf = getSurface();
+ assert(x + w <= dstSurf->w);
+ assert(y + h <= dstSurf->h);
+
+ // *sigh* Common::Rect::extend behaves unexpected whenever one of the two
+ // parameters is an empty rect. Thus, we check whether the current dirty
+ // area is valid. In case it is not we simply use the parameters as new
+ // dirty area. Otherwise, we simply call extend.
+ if (_dirtyArea.isEmpty()) {
+ _dirtyArea = Common::Rect(x, y, x + w, y + h);
+ } else {
+ _dirtyArea.extend(Common::Rect(x, y, x + w, y + h));
+ }
+
+ const byte *src = (const byte *)srcPtr;
+ byte *dst = (byte *)dstSurf->getBasePtr(x, y);
+ const uint pitch = dstSurf->pitch;
+ const uint bytesPerPixel = dstSurf->format.bytesPerPixel;
+
+ if (srcPitch == pitch && x == 0 && w == dstSurf->w) {
+ memcpy(dst, src, h * pitch);
+ } else {
+ while (h-- > 0) {
+ memcpy(dst, src, w * bytesPerPixel);
+ dst += pitch;
+ src += srcPitch;
+ }
+ }
+}
+
+void Texture::fill(uint32 color) {
+ Graphics::Surface *dst = getSurface();
+ dst->fillRect(Common::Rect(dst->w, dst->h), color);
+
+ flagDirty();
+}
+
+void Texture::draw(GLfloat x, GLfloat y, GLfloat w, GLfloat h) {
+ // Only do any processing when the Texture is initialized.
+ if (!_textureData.getPixels()) {
+ return;
+ }
+
+ // First update any potentional changes.
+ updateTexture();
+
+ // Set the texture.
+ GLCALL(glBindTexture(GL_TEXTURE_2D, _glTexture));
+
+ // Calculate the texture rect that will be drawn.
+ const GLfloat texWidth = (GLfloat)_userPixelData.w / _textureData.w;
+ const GLfloat texHeight = (GLfloat)_userPixelData.h / _textureData.h;
+ const GLfloat texcoords[4*2] = {
+ 0, 0,
+ texWidth, 0,
+ 0, texHeight,
+ texWidth, texHeight
+ };
+ GLCALL(glTexCoordPointer(2, GL_FLOAT, 0, texcoords));
+
+ // Calculate the screen rect where the texture will be drawn.
+ const GLfloat vertices[4*2] = {
+ x, y,
+ x + w, y,
+ x, y + h,
+ x + w, y + h
+ };
+ GLCALL(glVertexPointer(2, GL_FLOAT, 0, vertices));
+
+ // Draw the texture to the screen buffer.
+ GLCALL(glDrawArrays(GL_TRIANGLE_STRIP, 0, 4));
+}
+
+void Texture::updateTexture() {
+ if (!isDirty()) {
+ return;
+ }
+
+ Common::Rect dirtyArea = getDirtyArea();
+
+ // In case we use linear filtering we might need to duplicate the last
+ // pixel row/column to avoid glitches with filtering.
+ if (_glFilter == GL_LINEAR) {
+ if (dirtyArea.right == _userPixelData.w && _userPixelData.w != _textureData.w) {
+ uint height = dirtyArea.height();
+
+ const byte *src = (const byte *)_textureData.getBasePtr(_userPixelData.w - 1, dirtyArea.top);
+ byte *dst = (byte *)_textureData.getBasePtr(_userPixelData.w, dirtyArea.top);
+
+ while (height-- > 0) {
+ memcpy(dst, src, _textureData.format.bytesPerPixel);
+ dst += _textureData.pitch;
+ src += _textureData.pitch;
+ }
+
+ // Extend the dirty area.
+ ++dirtyArea.right;
+ }
+
+ if (dirtyArea.bottom == _userPixelData.h && _userPixelData.h != _textureData.h) {
+ const byte *src = (const byte *)_textureData.getBasePtr(dirtyArea.left, _userPixelData.h - 1);
+ byte *dst = (byte *)_textureData.getBasePtr(dirtyArea.left, _userPixelData.h);
+ memcpy(dst, src, dirtyArea.width() * _textureData.format.bytesPerPixel);
+
+ // Extend the dirty area.
+ ++dirtyArea.bottom;
+ }
+ }
+
+ // Set the texture.
+ GLCALL(glBindTexture(GL_TEXTURE_2D, _glTexture));
+
+ // Update the actual texture.
+ // Although we keep track of the dirty part of the texture buffer we
+ // cannot take advantage of the left/right boundries here because it is
+ // not possible to specify a pitch to glTexSubImage2D. To be precise, with
+ // plain OpenGL we could set GL_UNPACK_ROW_LENGTH to achieve this. However,
+ // OpenGL ES 1.0 does not support GL_UNPACK_ROW_LENGTH. Thus, we are left
+ // with the following options:
+ //
+ // 1) (As we do right now) Simply always update the whole texture lines of
+ // rect changed. This is simplest to implement. In case performance is
+ // really an issue we can think of switching to another method.
+ //
+ // 2) Copy the dirty rect to a temporary buffer and upload that by using
+ // glTexSubImage2D. This is what the Android backend does. It is more
+ // complicated though.
+ //
+ // 3) Use glTexSubImage2D per line changed. This is what the old OpenGL
+ // graphics manager did but it is much slower! Thus, we do not use it.
+ GLCALL(glTexSubImage2D(GL_TEXTURE_2D, 0, 0, dirtyArea.top, _textureData.w, dirtyArea.height(),
+ _glFormat, _glType, _textureData.getBasePtr(0, dirtyArea.top)));
+
+ // We should have handled everything, thus not dirty anymore.
+ clearDirty();
+}
+
+Common::Rect Texture::getDirtyArea() const {
+ if (_allDirty) {
+ return Common::Rect(_userPixelData.w, _userPixelData.h);
+ } else {
+ return _dirtyArea;
+ }
+}
+
+TextureCLUT8::TextureCLUT8(GLenum glIntFormat, GLenum glFormat, GLenum glType, const Graphics::PixelFormat &format)
+ : Texture(glIntFormat, glFormat, glType, format), _clut8Data(), _palette(new byte[256 * format.bytesPerPixel]) {
+ memset(_palette, 0, sizeof(byte) * format.bytesPerPixel);
+}
+
+TextureCLUT8::~TextureCLUT8() {
+ delete[] _palette;
+ _palette = nullptr;
+ _clut8Data.free();
+}
+
+void TextureCLUT8::allocate(uint width, uint height) {
+ Texture::allocate(width, height);
+
+ // We only need to reinitialize our CLUT8 surface when the output size
+ // changed.
+ if (width == _clut8Data.w && height == _clut8Data.h) {
+ return;
+ }
+
+ _clut8Data.create(width, height, Graphics::PixelFormat::createFormatCLUT8());
+}
+
+Graphics::PixelFormat TextureCLUT8::getFormat() const {
+ return Graphics::PixelFormat::createFormatCLUT8();
+}
+
+namespace {
+template<typename ColorType>
+inline void convertPalette(ColorType *dst, const byte *src, uint colors, const Graphics::PixelFormat &format) {
+ while (colors-- > 0) {
+ *dst++ = format.RGBToColor(src[0], src[1], src[2]);
+ src += 3;
+ }
+}
+} // End of anonymous namespace
+
+void TextureCLUT8::setPalette(uint start, uint colors, const byte *palData) {
+ const Graphics::PixelFormat &hardwareFormat = getHardwareFormat();
+
+ if (hardwareFormat.bytesPerPixel == 2) {
+ convertPalette<uint16>((uint16 *)_palette + start, palData, colors, hardwareFormat);
+ } else if (hardwareFormat.bytesPerPixel == 4) {
+ convertPalette<uint32>((uint32 *)_palette + start, palData, colors, hardwareFormat);
+ } else {
+ warning("TextureCLUT8::setPalette: Unsupported pixel depth: %d", hardwareFormat.bytesPerPixel);
+ }
+
+ // A palette changes means we need to refresh the whole surface.
+ flagDirty();
+}
+
+namespace {
+template<typename PixelType>
+inline void doPaletteLookUp(PixelType *dst, const byte *src, uint width, uint height, uint dstPitch, uint srcPitch, const PixelType *palette) {
+ uint srcAdd = srcPitch - width;
+ uint dstAdd = dstPitch - width * sizeof(PixelType);
+
+ while (height-- > 0) {
+ for (uint x = width; x > 0; --x) {
+ *dst++ = palette[*src++];
+ }
+
+ dst = (PixelType *)((byte *)dst + dstAdd);
+ src += srcAdd;
+ }
+}
+} // End of anonymous namespace
+
+void TextureCLUT8::updateTexture() {
+ if (!isDirty()) {
+ return;
+ }
+
+ // Do the palette look up
+ Graphics::Surface *outSurf = Texture::getSurface();
+
+ Common::Rect dirtyArea = getDirtyArea();
+
+ if (outSurf->format.bytesPerPixel == 2) {
+ doPaletteLookUp<uint16>((uint16 *)outSurf->getBasePtr(dirtyArea.left, dirtyArea.top),
+ (const byte *)_clut8Data.getBasePtr(dirtyArea.left, dirtyArea.top),
+ dirtyArea.width(), dirtyArea.height(),
+ outSurf->pitch, _clut8Data.pitch, (const uint16 *)_palette);
+ } else if (outSurf->format.bytesPerPixel == 4) {
+ doPaletteLookUp<uint32>((uint32 *)outSurf->getBasePtr(dirtyArea.left, dirtyArea.top),
+ (const byte *)_clut8Data.getBasePtr(dirtyArea.left, dirtyArea.top),
+ dirtyArea.width(), dirtyArea.height(),
+ outSurf->pitch, _clut8Data.pitch, (const uint32 *)_palette);
+ } else {
+ warning("TextureCLUT8::updateTexture: Unsupported pixel depth: %d", outSurf->format.bytesPerPixel);
+ }
+
+ // Do generic handling of updating the texture.
+ Texture::updateTexture();
+}
+
+} // End of namespace OpenGL
diff --git a/backends/graphics/opengl/texture.h b/backends/graphics/opengl/texture.h
new file mode 100644
index 0000000000..ad70833544
--- /dev/null
+++ b/backends/graphics/opengl/texture.h
@@ -0,0 +1,175 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public 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_OPENGL_TEXTURE_H
+#define BACKENDS_GRAPHICS_OPENGL_TEXTURE_H
+
+#include "backends/graphics/opengl/opengl-sys.h"
+
+#include "graphics/pixelformat.h"
+#include "graphics/surface.h"
+
+#include "common/rect.h"
+
+namespace OpenGL {
+
+/**
+ * An OpenGL texture wrapper. It automatically takes care of all OpenGL
+ * texture handling issues and also provides access to the texture data.
+ */
+class Texture {
+public:
+ /**
+ * Create a new texture with the specific internal format.
+ *
+ * @param glIntFormat The internal format to use.
+ * @param glFormat The input format.
+ * @param glType The input type.
+ * @param format The format used for the texture input.
+ */
+ Texture(GLenum glIntFormat, GLenum glFormat, GLenum glType, const Graphics::PixelFormat &format);
+ virtual ~Texture();
+
+ /**
+ * Destroy the OpenGL texture name.
+ */
+ void releaseInternalTexture();
+
+ /**
+ * Create the OpenGL texture name and flag the whole texture as dirty.
+ */
+ void recreateInternalTexture();
+
+ /**
+ * Enable or disable linear texture filtering.
+ *
+ * @param enable true to enable and false to disable.
+ */
+ void enableLinearFiltering(bool enable);
+
+ /**
+ * Allocate texture space for the desired dimensions. This wraps any
+ * handling of requirements for POT textures.
+ *
+ * @param width The desired logical width.
+ * @param height The desired logical height.
+ */
+ virtual void allocate(uint width, uint height);
+
+ void copyRectToTexture(uint x, uint y, uint w, uint h, const void *src, uint srcPitch);
+
+ void fill(uint32 color);
+
+ void draw(GLfloat x, GLfloat y, GLfloat w, GLfloat h);
+
+ void flagDirty() { _allDirty = true; }
+ bool isDirty() const { return _allDirty || !_dirtyArea.isEmpty(); }
+
+ uint getWidth() const { return _userPixelData.w; }
+ uint getHeight() const { return _userPixelData.h; }
+
+ /**
+ * @return The hardware format of the texture data.
+ */
+ const Graphics::PixelFormat &getHardwareFormat() const { return _format; }
+
+ /**
+ * @return The logical format of the texture data.
+ */
+ virtual Graphics::PixelFormat getFormat() const { return _format; }
+
+ virtual Graphics::Surface *getSurface() { return &_userPixelData; }
+ virtual const Graphics::Surface *getSurface() const { return &_userPixelData; }
+
+ /**
+ * @return Whether the texture data is using a palette.
+ */
+ virtual bool hasPalette() const { return false; }
+
+ virtual void setPalette(uint start, uint colors, const byte *palData) {}
+
+ virtual void *getPalette() { return 0; }
+ virtual const void *getPalette() const { return 0; }
+
+ /**
+ * Query texture related OpenGL information from the context. This only
+ * queries the maximum texture size for now.
+ */
+ static void queryTextureInformation();
+
+ /**
+ * @return Return the maximum texture dimensions supported.
+ */
+ static GLint getMaximumTextureSize() { return _maxTextureSize; }
+protected:
+ virtual void updateTexture();
+
+ Common::Rect getDirtyArea() const;
+private:
+ const GLenum _glIntFormat;
+ const GLenum _glFormat;
+ const GLenum _glType;
+ const Graphics::PixelFormat _format;
+
+ GLint _glFilter;
+ GLuint _glTexture;
+
+ Graphics::Surface _textureData;
+ Graphics::Surface _userPixelData;
+
+ bool _allDirty;
+ Common::Rect _dirtyArea;
+ void clearDirty() { _allDirty = false; _dirtyArea = Common::Rect(); }
+
+ static GLint _maxTextureSize;
+};
+
+class TextureCLUT8 : public Texture {
+public:
+ TextureCLUT8(GLenum glIntFormat, GLenum glFormat, GLenum glType, const Graphics::PixelFormat &format);
+ virtual ~TextureCLUT8();
+
+ virtual void allocate(uint width, uint height);
+
+ virtual Graphics::PixelFormat getFormat() const;
+
+ virtual bool hasPalette() const { return true; }
+
+ virtual void setPalette(uint start, uint colors, const byte *palData);
+
+ virtual void *getPalette() { return _palette; }
+ virtual const void *getPalette() const { return _palette; }
+
+ virtual Graphics::Surface *getSurface() { return &_clut8Data; }
+ virtual const Graphics::Surface *getSurface() const { return &_clut8Data; }
+
+protected:
+ virtual void updateTexture();
+
+private:
+ Graphics::Surface _clut8Data;
+ byte *_palette;
+};
+
+} // End of namespace OpenGL
+
+#endif
diff --git a/backends/graphics/openglsdl/openglsdl-graphics.cpp b/backends/graphics/openglsdl/openglsdl-graphics.cpp
index c5605cae87..3f42d62a3a 100644
--- a/backends/graphics/openglsdl/openglsdl-graphics.cpp
+++ b/backends/graphics/openglsdl/openglsdl-graphics.cpp
@@ -8,496 +8,386 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public 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) && defined(USE_OPENGL)
-
#include "backends/graphics/openglsdl/openglsdl-graphics.h"
-#include "backends/platform/sdl/sdl.h"
-#include "common/config-manager.h"
+
#include "common/textconsole.h"
+#include "common/config-manager.h"
+#ifdef USE_OSD
#include "common/translation.h"
+#endif
+
+OpenGLSdlGraphicsManager::OpenGLSdlGraphicsManager(uint desktopWidth, uint desktopHeight, SdlEventSource *eventSource)
+ : SdlGraphicsManager(eventSource), _lastVideoModeLoad(0), _hwScreen(nullptr), _lastRequestedWidth(0), _lastRequestedHeight(0),
+ _graphicsScale(2), _ignoreLoadVideoMode(false), _gotResize(false), _wantsFullScreen(false), _ignoreResizeEvents(0),
+ _desiredFullscreenWidth(0), _desiredFullscreenHeight(0) {
+ // Setup OpenGL attributes for SDL
+ SDL_GL_SetAttribute(SDL_GL_RED_SIZE, 8);
+ SDL_GL_SetAttribute(SDL_GL_GREEN_SIZE, 8);
+ SDL_GL_SetAttribute(SDL_GL_BLUE_SIZE, 8);
+ SDL_GL_SetAttribute(SDL_GL_DEPTH_SIZE, 16);
+ SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER, 1);
+
+ // Retrieve a list of working fullscreen modes
+ const SDL_Rect *const *availableModes = SDL_ListModes(NULL, SDL_OPENGL | SDL_FULLSCREEN);
+ if (availableModes != (void *)-1) {
+ for (;*availableModes; ++availableModes) {
+ const SDL_Rect *mode = *availableModes;
+
+ _fullscreenVideoModes.push_back(VideoMode(mode->w, mode->h));
+ }
-OpenGLSdlGraphicsManager::OpenGLSdlGraphicsManager(SdlEventSource *eventSource)
- :
- SdlGraphicsManager(eventSource),
- _hwscreen(0),
- _screenResized(false),
- _activeFullscreenMode(-2),
- _lastFullscreenModeWidth(0),
- _lastFullscreenModeHeight(0),
- _desktopWidth(0),
- _desktopHeight(0),
- _ignoreResizeFrames(0) {
-
- // Initialize SDL video subsystem
- if (SDL_InitSubSystem(SDL_INIT_VIDEO) == -1) {
- error("Could not initialize SDL: %s", SDL_GetError());
+ // Sort the modes in ascending order.
+ Common::sort(_fullscreenVideoModes.begin(), _fullscreenVideoModes.end());
}
- // This is also called in initSDL(), but initializing graphics
- // may reset it.
- SDL_EnableUNICODE(1);
-
- // Disable OS cursor
- SDL_ShowCursor(SDL_DISABLE);
-
- // Get desktop resolution
- // TODO: In case the OpenGL manager is created *after* a plain SDL manager
- // has been used, this will return the last setup graphics mode rather
- // than the desktop resolution. We should really look into a way to
- // properly retrieve the desktop resolution.
- const SDL_VideoInfo *videoInfo = SDL_GetVideoInfo();
- if (videoInfo->current_w > 0 && videoInfo->current_h > 0) {
- _desktopWidth = videoInfo->current_w;
- _desktopHeight = videoInfo->current_h;
+ // In case SDL is fine with every mode we will force the desktop mode.
+ // TODO? We could also try to add some default resolutions here.
+ if (_fullscreenVideoModes.empty() && desktopWidth && desktopHeight) {
+ _fullscreenVideoModes.push_back(VideoMode(desktopWidth, desktopHeight));
}
- if (ConfMan.hasKey("last_fullscreen_mode_width") && ConfMan.hasKey("last_fullscreen_mode_height")) {
- _lastFullscreenModeWidth = ConfMan.getInt("last_fullscreen_mode_width");
- _lastFullscreenModeHeight = ConfMan.getInt("last_fullscreen_mode_height");
+ // Get information about display sizes from the previous runs.
+ if (ConfMan.hasKey("last_fullscreen_mode_width", Common::ConfigManager::kApplicationDomain) && ConfMan.hasKey("last_fullscreen_mode_height", Common::ConfigManager::kApplicationDomain)) {
+ _desiredFullscreenWidth = ConfMan.getInt("last_fullscreen_mode_width", Common::ConfigManager::kApplicationDomain);
+ _desiredFullscreenHeight = ConfMan.getInt("last_fullscreen_mode_height", Common::ConfigManager::kApplicationDomain);
+ } else {
+ // Use the desktop resolutions when no previous default has been setup.
+ _desiredFullscreenWidth = desktopWidth;
+ _desiredFullscreenHeight = desktopHeight;
}
}
OpenGLSdlGraphicsManager::~OpenGLSdlGraphicsManager() {
- // Unregister the event observer
- if (g_system->getEventManager()->getEventDispatcher() != NULL)
- g_system->getEventManager()->getEventDispatcher()->unregisterObserver(this);
}
-void OpenGLSdlGraphicsManager::initEventObserver() {
+void OpenGLSdlGraphicsManager::activateManager() {
+ SdlGraphicsManager::activateManager();
+
// Register the graphics manager as a event observer
g_system->getEventManager()->getEventDispatcher()->registerObserver(this, 10, false);
}
+void OpenGLSdlGraphicsManager::deactivateManager() {
+ // Unregister the event observer
+ if (g_system->getEventManager()->getEventDispatcher()) {
+ g_system->getEventManager()->getEventDispatcher()->unregisterObserver(this);
+ }
+
+ SdlGraphicsManager::deactivateManager();
+}
+
bool OpenGLSdlGraphicsManager::hasFeature(OSystem::Feature f) {
- return
- (f == OSystem::kFeatureFullscreenMode) ||
- (f == OSystem::kFeatureIconifyWindow) ||
- OpenGLGraphicsManager::hasFeature(f);
+ switch (f) {
+ case OSystem::kFeatureFullscreenMode:
+ case OSystem::kFeatureIconifyWindow:
+ return true;
+
+ default:
+ return OpenGLGraphicsManager::hasFeature(f);
+ }
}
void OpenGLSdlGraphicsManager::setFeatureState(OSystem::Feature f, bool enable) {
switch (f) {
+ case OSystem::kFeatureFullscreenMode:
+ assert(getTransactionMode() != kTransactionNone);
+ _wantsFullScreen = enable;
+ break;
+
case OSystem::kFeatureIconifyWindow:
- if (enable)
+ if (enable) {
SDL_WM_IconifyWindow();
+ }
break;
+
default:
OpenGLGraphicsManager::setFeatureState(f, enable);
}
}
-#ifdef USE_RGB_COLOR
+bool OpenGLSdlGraphicsManager::getFeatureState(OSystem::Feature f) {
+ switch (f) {
+ case OSystem::kFeatureFullscreenMode:
+ if (_hwScreen) {
+ return (_hwScreen->flags & SDL_FULLSCREEN) != 0;
+ } else {
+ return _wantsFullScreen;
+ }
-Common::List<Graphics::PixelFormat> OpenGLSdlGraphicsManager::getSupportedFormats() const {
- assert(!_supportedFormats.empty());
- return _supportedFormats;
+ default:
+ return OpenGLGraphicsManager::getFeatureState(f);
+ }
}
-void OpenGLSdlGraphicsManager::detectSupportedFormats() {
-
- // Clear old list
- _supportedFormats.clear();
-
- // Some tables with standard formats that we always list
- // as "supported". If frontend code tries to use one of
- // these, we will perform the necessary format
- // conversion in the background. Of course this incurs a
- // performance hit, but on desktop ports this should not
- // matter. We still push the currently active format to
- // the front, so if frontend code just uses the first
- // available format, it will get one that is "cheap" to
- // use.
- const Graphics::PixelFormat RGBList[] = {
-#if defined(ENABLE_32BIT)
- Graphics::PixelFormat(4, 8, 8, 8, 8, 24, 16, 8, 0), // RGBA8888
-#ifndef USE_GLES
- Graphics::PixelFormat(4, 8, 8, 8, 8, 16, 8, 0, 24), // ARGB8888
-#endif
- Graphics::PixelFormat(3, 8, 8, 8, 0, 16, 8, 0, 0), // RGB888
-#endif
- Graphics::PixelFormat(2, 5, 6, 5, 0, 11, 5, 0, 0), // RGB565
- Graphics::PixelFormat(2, 5, 5, 5, 1, 11, 6, 1, 0), // RGB5551
- Graphics::PixelFormat(2, 5, 5, 5, 0, 10, 5, 0, 0), // RGB555
- Graphics::PixelFormat(2, 4, 4, 4, 4, 12, 8, 4, 0), // RGBA4444
-#ifndef USE_GLES
- Graphics::PixelFormat(2, 4, 4, 4, 4, 8, 4, 0, 12) // ARGB4444
-#endif
- };
-#ifndef USE_GLES
- const Graphics::PixelFormat BGRList[] = {
-#ifdef ENABLE_32BIT
- Graphics::PixelFormat(4, 8, 8, 8, 8, 0, 8, 16, 24), // ABGR8888
- Graphics::PixelFormat(4, 8, 8, 8, 8, 8, 16, 24, 0), // BGRA8888
- Graphics::PixelFormat(3, 8, 8, 8, 0, 0, 8, 16, 0), // BGR888
-#endif
- Graphics::PixelFormat(2, 5, 6, 5, 0, 0, 5, 11, 0), // BGR565
- Graphics::PixelFormat(2, 5, 5, 5, 1, 1, 6, 11, 0), // BGRA5551
- Graphics::PixelFormat(2, 4, 4, 4, 4, 0, 4, 8, 12), // ABGR4444
- Graphics::PixelFormat(2, 4, 4, 4, 4, 4, 8, 12, 0) // BGRA4444
- };
-#endif
+bool OpenGLSdlGraphicsManager::setGraphicsMode(int mode) {
+ // HACK: This is stupid but the SurfaceSDL backend defaults to 2x. This
+ // assures that the launcher (which requests 320x200) has a reasonable
+ // size. It also makes small games have a reasonable size (i.e. at least
+ // 640x400). We follow the same logic here until we have a better way to
+ // give hints to our backend for that.
+ _graphicsScale = 2;
- Graphics::PixelFormat format = Graphics::PixelFormat::createFormatCLUT8();
- if (_hwscreen) {
- // Get our currently set hardware format
- format = Graphics::PixelFormat(_hwscreen->format->BytesPerPixel,
- 8 - _hwscreen->format->Rloss, 8 - _hwscreen->format->Gloss,
- 8 - _hwscreen->format->Bloss, 8 - _hwscreen->format->Aloss,
- _hwscreen->format->Rshift, _hwscreen->format->Gshift,
- _hwscreen->format->Bshift, _hwscreen->format->Ashift);
-
- // Workaround to SDL not providing an accurate Aloss value on Mac OS X.
- if (_hwscreen->format->Amask == 0)
- format.aLoss = 8;
-
- // Push it first, as the prefered format if available
- for (int i = 0; i < ARRAYSIZE(RGBList); i++) {
- if (RGBList[i] == format) {
- _supportedFormats.push_back(format);
- break;
- }
- }
-#ifndef USE_GLES
- for (int i = 0; i < ARRAYSIZE(BGRList); i++) {
- if (BGRList[i] == format) {
- _supportedFormats.push_back(format);
- break;
- }
- }
+ return OpenGLGraphicsManager::setGraphicsMode(mode);
+}
+
+void OpenGLSdlGraphicsManager::resetGraphicsScale() {
+ OpenGLGraphicsManager::resetGraphicsScale();
+
+ // HACK: See OpenGLSdlGraphicsManager::setGraphicsMode.
+ _graphicsScale = 1;
+}
+
+#ifdef USE_RGB_COLOR
+Common::List<Graphics::PixelFormat> OpenGLSdlGraphicsManager::getSupportedFormats() const {
+ Common::List<Graphics::PixelFormat> formats;
+
+ // Our default mode is (memory layout wise) RGBA8888 which is a different
+ // logical layout depending on the endianness. We chose this mode because
+ // it is the only 32bit color mode we can safely assume to be present in
+ // OpenGL and OpenGL ES implementations. Thus, we need to supply different
+ // logical formats based on endianness.
+#ifdef SCUMM_LITTLE_ENDIAN
+ // ABGR8888
+ formats.push_back(Graphics::PixelFormat(4, 8, 8, 8, 8, 0, 8, 16, 24));
+#else
+ // RGBA8888
+ formats.push_back(Graphics::PixelFormat(4, 8, 8, 8, 8, 24, 16, 8, 0));
#endif
- }
+ // RGB565
+ formats.push_back(Graphics::PixelFormat(2, 5, 6, 5, 0, 11, 5, 0, 0));
+ // RGBA5551
+ formats.push_back(Graphics::PixelFormat(2, 5, 5, 5, 1, 11, 6, 1, 0));
+ // RGBA4444
+ formats.push_back(Graphics::PixelFormat(2, 4, 4, 4, 4, 12, 8, 4, 0));
- // Push some RGB formats
- for (int i = 0; i < ARRAYSIZE(RGBList); i++) {
- if (_hwscreen && (RGBList[i].bytesPerPixel > format.bytesPerPixel))
- continue;
- if (RGBList[i] != format)
- _supportedFormats.push_back(RGBList[i]);
- }
#ifndef USE_GLES
- // Push some BGR formats
- for (int i = 0; i < ARRAYSIZE(BGRList); i++) {
- if (_hwscreen && (BGRList[i].bytesPerPixel > format.bytesPerPixel))
- continue;
- if (BGRList[i] != format)
- _supportedFormats.push_back(BGRList[i]);
- }
+#ifdef SCUMM_LITTLE_ENDIAN
+ // RGBA8888
+ formats.push_back(Graphics::PixelFormat(4, 8, 8, 8, 8, 24, 16, 8, 0));
+#else
+ // ABGR8888
+ formats.push_back(Graphics::PixelFormat(4, 8, 8, 8, 8, 0, 8, 16, 24));
#endif
- _supportedFormats.push_back(Graphics::PixelFormat::createFormatCLUT8());
-}
+ // ARGB8888, this should not be here, but Sword25 requires it. :-/
+ formats.push_back(Graphics::PixelFormat(4, 8, 8, 8, 8, 16, 8, 0, 24));
+ // RGB555, this is used by SCUMM HE 16 bit games.
+ formats.push_back(Graphics::PixelFormat(2, 5, 5, 5, 0, 10, 5, 0, 0));
#endif
-void OpenGLSdlGraphicsManager::setInternalMousePosition(int x, int y) {
- SDL_WarpMouse(x, y);
+ formats.push_back(Graphics::PixelFormat::createFormatCLUT8());
+
+ return formats;
}
+#endif
void OpenGLSdlGraphicsManager::updateScreen() {
- if (_ignoreResizeFrames)
- _ignoreResizeFrames -= 1;
+ if (_ignoreResizeEvents) {
+ --_ignoreResizeEvents;
+ }
OpenGLGraphicsManager::updateScreen();
-}
-//
-// Intern
-//
+ // Swap OpenGL buffers
+ SDL_GL_SwapBuffers();
+}
-bool OpenGLSdlGraphicsManager::setupFullscreenMode() {
- SDL_Rect const* const*availableModes = SDL_ListModes(NULL, SDL_FULLSCREEN | SDL_OPENGL);
+void OpenGLSdlGraphicsManager::notifyVideoExpose() {
+}
- // SDL_ListModes() returns -1 in case any dimension is okay. In that
- // case we'll reuse the current desktop resolution for fullscreen.
- if (availableModes == (void *)-1) {
- _videoMode.hardwareWidth = _desktopWidth;
- _videoMode.hardwareHeight = _desktopHeight;
- _activeFullscreenMode = -2;
- return true;
+void OpenGLSdlGraphicsManager::notifyResize(const uint width, const uint height) {
+ if (!_ignoreResizeEvents && _hwScreen && !(_hwScreen->flags & SDL_FULLSCREEN)) {
+ // We save that we handled a resize event here. We need to know this
+ // so we do not overwrite the users requested window size whenever we
+ // switch aspect ratio or similar.
+ _gotResize = true;
+ if (!setupMode(width, height)) {
+ warning("OpenGLSdlGraphicsManager::notifyResize: Resize failed ('%s')", SDL_GetError());
+ g_system->quit();
+ }
}
+}
- // If -2, autodetect the fullscreen mode
- // The last used fullscreen mode will be prioritized, if there is no last fullscreen
- // mode, the desktop resolution will be used, and in case the desktop resolution
- // is not available as a fullscreen mode, the one with smallest metric will be selected.
- if (_activeFullscreenMode == -2) {
- // Desktop resolution
- int desktopModeIndex = -1;
-
- // Best metric mode
- const SDL_Rect *bestMode = availableModes[0];
- int bestModeIndex = 0;
- uint bestMetric = (uint)-1;
-
- // Iterate over all available fullscreen modes
- for (int i = 0; const SDL_Rect *mode = availableModes[i]; i++) {
- // Try to setup the last used fullscreen mode
- if (mode->w == _lastFullscreenModeWidth && mode->h == _lastFullscreenModeHeight) {
- _videoMode.hardwareWidth = _lastFullscreenModeWidth;
- _videoMode.hardwareHeight = _lastFullscreenModeHeight;
- _activeFullscreenMode = i;
- return true;
- }
-
- if (mode->w == _desktopWidth && mode->h == _desktopHeight)
- desktopModeIndex = i;
-
- if (mode->w < _videoMode.overlayWidth)
- continue;
- if (mode->h < _videoMode.overlayHeight)
- continue;
+void OpenGLSdlGraphicsManager::transformMouseCoordinates(Common::Point &point) {
+ adjustMousePosition(point.x, point.y);
+}
- uint metric = mode->w * mode->h - _videoMode.overlayWidth * _videoMode.overlayHeight;
- if (metric < bestMetric) {
- bestMode = mode;
- bestMetric = metric;
- bestModeIndex = i;
- }
- }
+void OpenGLSdlGraphicsManager::notifyMousePos(Common::Point mouse) {
+ setMousePosition(mouse.x, mouse.y);
+}
- if (desktopModeIndex >= 0) {
- _videoMode.hardwareWidth = _desktopWidth;
- _videoMode.hardwareHeight = _desktopHeight;
+void OpenGLSdlGraphicsManager::setInternalMousePosition(int x, int y) {
+ SDL_WarpMouse(x, y);
+}
- _activeFullscreenMode = desktopModeIndex;
- return true;
- } else if (bestMode) {
- _videoMode.hardwareWidth = bestMode->w;
- _videoMode.hardwareHeight = bestMode->h;
+bool OpenGLSdlGraphicsManager::loadVideoMode(uint requestedWidth, uint requestedHeight, const Graphics::PixelFormat &format) {
+ // In some cases we might not want to load the requested video mode. This
+ // will assure that the window size is not altered.
+ if (_ignoreLoadVideoMode) {
+ _ignoreLoadVideoMode = false;
+ return true;
+ }
- _activeFullscreenMode = bestModeIndex;
- return true;
- }
- } else {
- // Use last fullscreen mode if looping backwards from the first mode
- if (_activeFullscreenMode == -1) {
- do {
- _activeFullscreenMode++;
- } while(availableModes[_activeFullscreenMode]);
- _activeFullscreenMode--;
- }
+ // This function should never be called from notifyResize thus we know
+ // that the requested size came from somewhere else.
+ _gotResize = false;
- // Use first fullscreen mode if looping from last mode
- if (!availableModes[_activeFullscreenMode])
- _activeFullscreenMode = 0;
+ // Save the requested dimensions.
+ _lastRequestedWidth = requestedWidth;
+ _lastRequestedHeight = requestedHeight;
- // Check if the fullscreen mode is valid
- if (availableModes[_activeFullscreenMode]) {
- _videoMode.hardwareWidth = availableModes[_activeFullscreenMode]->w;
- _videoMode.hardwareHeight = availableModes[_activeFullscreenMode]->h;
- return true;
- }
- }
+ // Apply the currently saved scale setting.
+ requestedWidth *= _graphicsScale;
+ requestedHeight *= _graphicsScale;
- // Could not find any suiting fullscreen mode, return false.
- return false;
+ // Set up the mode.
+ return setupMode(requestedWidth, requestedHeight);
}
-bool OpenGLSdlGraphicsManager::loadGFXMode() {
- // If the screen was resized, do not change its size
- if (!_screenResized) {
- const int scaleFactor = getScale();
- _videoMode.overlayWidth = _videoMode.hardwareWidth = _videoMode.screenWidth * scaleFactor;
- _videoMode.overlayHeight = _videoMode.hardwareHeight = _videoMode.screenHeight * scaleFactor;
-
- // 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) {
- if (_videoMode.screenWidth == 320 && _videoMode.screenHeight == 200)
- _videoMode.overlayHeight = _videoMode.hardwareHeight = 240 * scaleFactor;
- else if (_videoMode.screenWidth == 640 && _videoMode.screenHeight == 400)
- _videoMode.overlayHeight = _videoMode.hardwareHeight = 480 * scaleFactor;
+bool OpenGLSdlGraphicsManager::setupMode(uint width, uint height) {
+ // In case we request a fullscreen mode we will use the mode the user
+ // has chosen last time or the biggest mode available.
+ if (_wantsFullScreen) {
+ if (_desiredFullscreenWidth && _desiredFullscreenHeight) {
+ // In case only a distinct set of modes is available we check
+ // whether the requested mode is actually available.
+ if (!_fullscreenVideoModes.empty()) {
+ VideoModeArray::const_iterator i = Common::find(_fullscreenVideoModes.begin(),
+ _fullscreenVideoModes.end(),
+ VideoMode(_desiredFullscreenWidth, _desiredFullscreenHeight));
+ // It's not available fall back to default.
+ if (i == _fullscreenVideoModes.end()) {
+ _desiredFullscreenWidth = 0;
+ _desiredFullscreenHeight = 0;
+ }
+ }
}
- }
- _screenResized = false;
-
- // Setup OpenGL attributes for SDL
- SDL_GL_SetAttribute(SDL_GL_RED_SIZE, 8);
- SDL_GL_SetAttribute(SDL_GL_GREEN_SIZE, 8);
- SDL_GL_SetAttribute(SDL_GL_BLUE_SIZE, 8);
- SDL_GL_SetAttribute(SDL_GL_DEPTH_SIZE, 16);
- SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER, 1);
+ // In case no desired mode has been set we default to the biggest mode
+ // available or the requested mode in case we don't know any
+ // any fullscreen modes.
+ if (!_desiredFullscreenWidth || !_desiredFullscreenHeight) {
+ if (!_fullscreenVideoModes.empty()) {
+ VideoModeArray::const_iterator i = _fullscreenVideoModes.end();
+ --i;
+
+ _desiredFullscreenWidth = i->width;
+ _desiredFullscreenHeight = i->height;
+ } else {
+ _desiredFullscreenWidth = width;
+ _desiredFullscreenHeight = height;
+ }
+ }
- const bool isFullscreen = getFullscreenMode();
+ // Remember our choice.
+ ConfMan.setInt("last_fullscreen_mode_width", _desiredFullscreenWidth, Common::ConfigManager::kApplicationDomain);
+ ConfMan.setInt("last_fullscreen_mode_height", _desiredFullscreenHeight, Common::ConfigManager::kApplicationDomain);
- // In case we have an fullscreen mode and we are not in a rollback, detect
- // a proper mode to use. In case we are in a rollback, we already detected
- // a proper mode when setting up that mode, thus there is no need to run
- // the detection again.
- if (isFullscreen && _transactionMode != kTransactionRollback) {
- if (!setupFullscreenMode())
- // Failed setuping a fullscreen mode
- return false;
+ // Use our choice.
+ width = _desiredFullscreenWidth;
+ height = _desiredFullscreenHeight;
}
- _videoMode.overlayWidth = _videoMode.hardwareWidth;
- _videoMode.overlayHeight = _videoMode.hardwareHeight;
+ // WORKAROUND: Working around infamous SDL bugs when switching
+ // resolutions too fast. This might cause the event system to supply
+ // incorrect mouse position events otherwise.
+ // Reference: http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=665779
+ const uint32 curTime = SDL_GetTicks();
+ if (_hwScreen && (curTime < _lastVideoModeLoad || curTime - _lastVideoModeLoad < 100)) {
+ for (int i = 10; i > 0; --i) {
+ SDL_PumpEvents();
+ SDL_Delay(10);
+ }
+ }
+ _lastVideoModeLoad = curTime;
uint32 flags = SDL_OPENGL;
-
- if (isFullscreen)
+ if (_wantsFullScreen) {
flags |= SDL_FULLSCREEN;
- else
+ } else {
flags |= SDL_RESIZABLE;
-
- // Create our window
- _hwscreen = SDL_SetVideoMode(_videoMode.hardwareWidth, _videoMode.hardwareHeight, 32, flags);
-#ifdef USE_RGB_COLOR
- detectSupportedFormats();
-#endif
-
- if (_hwscreen == NULL) {
- // DON'T use error(), as this tries to bring up the debug
- // console, which WON'T WORK now that _hwscreen is hosed.
-
- if (!_oldVideoMode.setup) {
- warning("SDL_SetVideoMode says we can't switch to that mode (%s)", SDL_GetError());
- g_system->quit();
- } else
- // Cancel GFX load, and go back to last mode
- return false;
}
- // Check if the screen is BGR format
- setFormatIsBGR(_hwscreen->format->Rshift != 0);
-
- if (isFullscreen) {
- _lastFullscreenModeWidth = _videoMode.hardwareWidth;
- _lastFullscreenModeHeight = _videoMode.hardwareHeight;
- ConfMan.setInt("last_fullscreen_mode_width", _lastFullscreenModeWidth);
- ConfMan.setInt("last_fullscreen_mode_height", _lastFullscreenModeHeight);
+ if (_hwScreen) {
+ // When a video mode has been setup already we notify the manager that
+ // the context is about to be destroyed.
+ // We do this because on Windows SDL_SetVideoMode can destroy and
+ // recreate the OpenGL context.
+ notifyContextDestroy();
}
- // Call and return parent implementation of this method
- return OpenGLGraphicsManager::loadGFXMode();
-}
+ _hwScreen = SDL_SetVideoMode(width, height, 32, flags);
-void OpenGLSdlGraphicsManager::unloadGFXMode() {
- if (_hwscreen) {
- SDL_FreeSurface(_hwscreen);
- _hwscreen = NULL;
+ if (!_hwScreen) {
+ // We treat fullscreen requests as a "hint" for now. This means in
+ // case it is not available we simply ignore it.
+ if (_wantsFullScreen) {
+ _hwScreen = SDL_SetVideoMode(width, height, 32, SDL_OPENGL | SDL_RESIZABLE);
+ }
}
-}
-
-void OpenGLSdlGraphicsManager::internUpdateScreen() {
- // Call to parent implementation of this method
- OpenGLGraphicsManager::internUpdateScreen();
-
- // Swap OpenGL buffers
- SDL_GL_SwapBuffers();
-}
-#ifdef USE_OSD
-void OpenGLSdlGraphicsManager::displayModeChangedMsg() {
- const char *newModeName = getCurrentModeName();
- if (newModeName) {
- const int scaleFactor = getScale();
-
- Common::String osdMessage = Common::String::format(
- "%s: %s\n%d x %d -> %d x %d",
- _("Current display mode"),
- newModeName,
- _videoMode.screenWidth * scaleFactor,
- _videoMode.screenHeight * scaleFactor,
- _hwscreen->w, _hwscreen->h
- );
- displayMessageOnOSD(osdMessage.c_str());
- }
-}
-void OpenGLSdlGraphicsManager::displayScaleChangedMsg() {
- const int scaleFactor = getScale();
- Common::String osdMessage = Common::String::format(
- "%s: x%d\n%d x %d -> %d x %d",
- _("Current scale"),
- scaleFactor,
- _videoMode.screenWidth, _videoMode.screenHeight,
- _videoMode.overlayWidth, _videoMode.overlayHeight
- );
- displayMessageOnOSD(osdMessage.c_str());
-}
+ if (_hwScreen) {
+ // This is pretty confusing since RGBA8888 talks about the memory
+ // layout here. This is a different logical layout depending on
+ // whether we run on little endian or big endian. However, we can
+ // only safely assume that RGBA8888 in memory layout is supported.
+ // Thus, we chose this one.
+ const Graphics::PixelFormat rgba8888 =
+#ifdef SCUMM_LITTLE_ENDIAN
+ Graphics::PixelFormat(4, 8, 8, 8, 8, 0, 8, 16, 24);
+#else
+ Graphics::PixelFormat(4, 8, 8, 8, 8, 24, 16, 8, 0);
#endif
-
-bool OpenGLSdlGraphicsManager::isHotkey(const Common::Event &event) {
- if ((event.kbd.flags & (Common::KBD_CTRL|Common::KBD_ALT)) == (Common::KBD_CTRL|Common::KBD_ALT)) {
- if (event.kbd.keycode == Common::KEYCODE_PLUS || event.kbd.keycode == Common::KEYCODE_MINUS ||
- event.kbd.keycode == Common::KEYCODE_KP_PLUS || event.kbd.keycode == Common::KEYCODE_KP_MINUS ||
- event.kbd.keycode == 'a' || event.kbd.keycode == 'f')
- return true;
- } else if ((event.kbd.flags & (Common::KBD_CTRL|Common::KBD_SHIFT)) == (Common::KBD_CTRL|Common::KBD_SHIFT)) {
- if (event.kbd.keycode == 'a' || event.kbd.keycode == 'f')
- return true;
- } else if ((event.kbd.flags & (Common::KBD_ALT)) == (Common::KBD_ALT) && event.kbd.keycode == 's') {
- return true;
+ notifyContextCreate(rgba8888, rgba8888);
+ setActualScreenSize(_hwScreen->w, _hwScreen->h);
}
- return false;
-}
-
-void OpenGLSdlGraphicsManager::toggleFullScreen(int loop) {
- beginGFXTransaction();
- const bool isFullscreen = getFullscreenMode();
-
- if (isFullscreen && loop) {
- _activeFullscreenMode += loop;
- setFullscreenMode(true);
- } else {
- _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
- _ignoreResizeFrames = 10;
+ // Ignore resize events (from SDL) for a few frames. This avoids
+ // bad resizes to a (former) resolution for which we haven't
+ // processed an event yet.
+ _ignoreResizeEvents = 10;
-#ifdef USE_OSD
- Common::String osdMessage;
- if (getFullscreenMode())
- osdMessage = Common::String::format("%s\n%d x %d",
- _("Fullscreen mode"),
- _hwscreen->w, _hwscreen->h
- );
- else
- osdMessage = Common::String::format("%s\n%d x %d",
- _("Windowed mode"),
- _hwscreen->w, _hwscreen->h
- );
- displayMessageOnOSD(osdMessage.c_str());
-#endif
+ return _hwScreen != nullptr;
}
bool OpenGLSdlGraphicsManager::notifyEvent(const Common::Event &event) {
switch (event.type) {
+ case Common::EVENT_KEYUP:
+ return isHotkey(event);
+
case Common::EVENT_KEYDOWN:
if (event.kbd.hasFlags(Common::KBD_ALT)) {
- // Alt-Return and Alt-Enter toggle full screen mode
- if (event.kbd.keycode == Common::KEYCODE_RETURN ||
- event.kbd.keycode == (Common::KeyCode)SDLK_KP_ENTER) {
- toggleFullScreen(0);
+ if ( event.kbd.keycode == Common::KEYCODE_RETURN
+ || event.kbd.keycode == (Common::KeyCode)SDLK_KP_ENTER) {
+ // Alt-Return and Alt-Enter toggle full screen mode
+ beginGFXTransaction();
+ setFeatureState(OSystem::kFeatureFullscreenMode, !getFeatureState(OSystem::kFeatureFullscreenMode));
+ endGFXTransaction();
+
+#ifdef USE_OSD
+ if (getFeatureState(OSystem::kFeatureFullscreenMode)) {
+ displayMessageOnOSD("Fullscreen mode");
+ } else {
+ displayMessageOnOSD("Windowed mode");
+ }
+#endif
return true;
}
- // Alt-S create a screenshot
- if (event.kbd.keycode == 's') {
+ if (event.kbd.keycode == Common::KEYCODE_s) {
+ // Alt-s creates a screenshot
Common::String filename;
for (int n = 0;; n++) {
@@ -509,169 +399,167 @@ bool OpenGLSdlGraphicsManager::notifyEvent(const Common::Event &event) {
break;
SDL_RWclose(file);
}
- if (saveScreenshot(filename.c_str()))
- debug("Saved screenshot '%s'", filename.c_str());
- else
- warning("Could not save screenshot");
- return true;
- }
- }
- if (event.kbd.hasFlags(Common::KBD_CTRL|Common::KBD_ALT)) {
- // Ctrl-Alt-Return and Ctrl-Alt-Enter switch between full screen modes
- if (event.kbd.keycode == Common::KEYCODE_RETURN ||
- event.kbd.keycode == (Common::KeyCode)SDLK_KP_ENTER) {
- toggleFullScreen(1);
+ saveScreenshot(filename.c_str());
+ debug("Saved screenshot '%s'", filename.c_str());
+
return true;
}
+ } else if (event.kbd.hasFlags(Common::KBD_CTRL | Common::KBD_ALT)) {
+ if ( event.kbd.keycode == Common::KEYCODE_PLUS || event.kbd.keycode == Common::KEYCODE_MINUS
+ || event.kbd.keycode == Common::KEYCODE_KP_PLUS || event.kbd.keycode == Common::KEYCODE_KP_MINUS) {
+ // Ctrl+Alt+Plus/Minus Increase/decrease the size
+ const int direction = (event.kbd.keycode == Common::KEYCODE_PLUS || event.kbd.keycode == Common::KEYCODE_KP_PLUS) ? +1 : -1;
+
+ if (getFeatureState(OSystem::kFeatureFullscreenMode)) {
+ // In case we are in fullscreen we will choose the previous
+ // or next mode.
+
+ // In case no modes are available we do nothing.
+ if (_fullscreenVideoModes.empty()) {
+ return true;
+ }
+
+ // Look for the current mode.
+ VideoModeArray::const_iterator i = Common::find(_fullscreenVideoModes.begin(),
+ _fullscreenVideoModes.end(),
+ VideoMode(_desiredFullscreenWidth, _desiredFullscreenHeight));
+ if (i == _fullscreenVideoModes.end()) {
+ return true;
+ }
+
+ // Cycle through the modes in the specified direction.
+ if (direction > 0) {
+ ++i;
+ if (i == _fullscreenVideoModes.end()) {
+ i = _fullscreenVideoModes.begin();
+ }
+ } else {
+ if (i == _fullscreenVideoModes.begin()) {
+ i = _fullscreenVideoModes.end();
+ }
+ --i;
+ }
+
+ _desiredFullscreenWidth = i->width;
+ _desiredFullscreenHeight = i->height;
+
+ // Try to setup the mode.
+ if (!setupMode(_lastRequestedWidth, _lastRequestedHeight)) {
+ warning("OpenGLSdlGraphicsManager::notifyEvent: Fullscreen resize failed ('%s')", SDL_GetError());
+ g_system->quit();
+ }
+ } else {
+ // Calculate the next scaling setting. We approximate the
+ // current scale setting in case the user resized the
+ // window. Then we apply the direction change.
+ _graphicsScale = MAX<int>(_hwScreen->w / _lastRequestedWidth, _hwScreen->h / _lastRequestedHeight);
+ _graphicsScale = MAX<int>(_graphicsScale + direction, 1);
+
+ // Since we overwrite a user resize here we reset its
+ // flag here. This makes enabling AR smoother because it
+ // will change the window size like in surface SDL.
+ _gotResize = false;
+
+ // Try to setup the mode.
+ if (!setupMode(_lastRequestedWidth * _graphicsScale, _lastRequestedHeight * _graphicsScale)) {
+ warning("OpenGLSdlGraphicsManager::notifyEvent: Window resize failed ('%s')", SDL_GetError());
+ g_system->quit();
+ }
+ }
- // Ctrl-Alt-a switch between display modes
- if (event.kbd.keycode == 'a') {
- beginGFXTransaction();
- setFeatureState(OSystem::kFeatureAspectRatioCorrection, !getFeatureState(OSystem::kFeatureAspectRatioCorrection));
- endGFXTransaction();
#ifdef USE_OSD
- Common::String osdMessage;
- if (getFeatureState(OSystem::kFeatureAspectRatioCorrection))
- osdMessage = Common::String::format("%s\n%d x %d -> %d x %d",
- _("Enabled aspect ratio correction"),
- _videoMode.screenWidth, _videoMode.screenHeight,
- _hwscreen->w, _hwscreen->h);
- else
- osdMessage = Common::String::format("%s\n%d x %d -> %d x %d",
- _("Disabled aspect ratio correction"),
- _videoMode.screenWidth, _videoMode.screenHeight,
- _hwscreen->w, _hwscreen->h);
- displayMessageOnOSD(osdMessage.c_str());
+ const Common::String osdMsg = Common::String::format("Resolution: %dx%d", _hwScreen->w, _hwScreen->h);
+ displayMessageOnOSD(osdMsg.c_str());
#endif
- internUpdateScreen();
+
return true;
- }
+ } else if (event.kbd.keycode == Common::KEYCODE_a) {
+ // In case the user changed the window size manually we will
+ // not change the window size again here.
+ _ignoreLoadVideoMode = _gotResize;
- // Ctrl-Alt-f toggles antialiasing
- if (event.kbd.keycode == 'f') {
+ // Ctrl+Alt+a toggles the aspect ratio correction state.
beginGFXTransaction();
- toggleAntialiasing();
+ setFeatureState(OSystem::kFeatureAspectRatioCorrection, !getFeatureState(OSystem::kFeatureAspectRatioCorrection));
endGFXTransaction();
+ // Make sure we do not ignore the next resize. This
+ // effectively checks whether loadVideoMode has been called.
+ assert(!_ignoreLoadVideoMode);
+
#ifdef USE_OSD
- // TODO: This makes guesses about what internal antialiasing
- // modes we use, we might want to consider a better way of
- // displaying information to the user.
- if (getAntialiasingState())
- displayMessageOnOSD(_("Active filter mode: Linear"));
- else
- displayMessageOnOSD(_("Active filter mode: Nearest"));
+ Common::String osdMsg = "Aspect ratio correction: ";
+ osdMsg += getFeatureState(OSystem::kFeatureAspectRatioCorrection) ? "enabled" : "disabled";
+ displayMessageOnOSD(osdMsg.c_str());
#endif
+
return true;
- }
+ } else if (event.kbd.keycode == Common::KEYCODE_f) {
+ // Ctrl+Alt+f toggles the graphics modes.
+
+ // We are crazy we will allow the OpenGL base class to
+ // introduce new graphics modes like shaders for special
+ // filtering. If some other OpenGL subclass needs this,
+ // we can think of refactoring this.
+ int mode = getGraphicsMode();
+ const OSystem::GraphicsMode *supportedModes = getSupportedGraphicsModes();
+ const OSystem::GraphicsMode *modeDesc = nullptr;
+
+ // Search the current mode.
+ for (; supportedModes->name; ++supportedModes) {
+ if (supportedModes->id == mode) {
+ modeDesc = supportedModes;
+ break;
+ }
+ }
+ assert(modeDesc);
- SDLKey sdlKey = (SDLKey)event.kbd.keycode;
-
- // Ctrl+Alt+Plus/Minus Increase/decrease the scale factor
- if ((sdlKey == SDLK_EQUALS || sdlKey == SDLK_PLUS || sdlKey == SDLK_MINUS ||
- sdlKey == SDLK_KP_PLUS || sdlKey == SDLK_KP_MINUS)) {
- int factor = getScale();
- factor += (sdlKey == SDLK_MINUS || sdlKey == SDLK_KP_MINUS) ? -1 : +1;
- if (0 < factor && factor < 4) {
- // Check if the desktop resolution has been detected
- if (_desktopWidth > 0 && _desktopHeight > 0)
- // If the new scale factor is too big, do not scale
- if (_videoMode.screenWidth * factor > _desktopWidth ||
- _videoMode.screenHeight * factor > _desktopHeight)
- return false;
-
- beginGFXTransaction();
- setScale(factor);
- endGFXTransaction();
-#ifdef USE_OSD
- displayScaleChangedMsg();
-#endif
- return true;
+ // Try to use the next mode in the list.
+ ++modeDesc;
+ if (!modeDesc->name) {
+ modeDesc = getSupportedGraphicsModes();
}
- }
- const bool isNormalNumber = (SDLK_1 <= sdlKey && sdlKey <= SDLK_3);
- const bool isKeypadNumber = (SDLK_KP1 <= sdlKey && sdlKey <= SDLK_KP3);
+ // Never ever try to resize the window when we simply want to
+ // switch the graphics mode. This assures that the window size
+ // does not change.
+ _ignoreLoadVideoMode = true;
+
+ beginGFXTransaction();
+ setGraphicsMode(modeDesc->id);
+ endGFXTransaction();
+
+ // Make sure we do not ignore the next resize. This
+ // effectively checks whether loadVideoMode has been called.
+ assert(!_ignoreLoadVideoMode);
- // Ctrl-Alt-<number key> will change the GFX mode
- if (isNormalNumber || isKeypadNumber) {
- if (sdlKey - (isNormalNumber ? SDLK_1 : SDLK_KP1) <= 3) {
-#ifdef USE_OSD
- int lastMode = _videoMode.mode;
-#endif
- // We need to query the scale and set it up, because
- // setGraphicsMode sets the default scale to 2
- int oldScale = getScale();
- beginGFXTransaction();
- setGraphicsMode(sdlKey - (isNormalNumber ? SDLK_1 : SDLK_KP1));
- setScale(oldScale);
- endGFXTransaction();
#ifdef USE_OSD
- if (lastMode != _videoMode.mode)
- displayModeChangedMsg();
+ const Common::String osdMsg = Common::String::format("Graphics mode: %s", _(modeDesc->description));
+ displayMessageOnOSD(osdMsg.c_str());
#endif
- internUpdateScreen();
- }
- }
- }
- if (event.kbd.hasFlags(Common::KBD_CTRL|Common::KBD_SHIFT)) {
- // Ctrl-Shift-Return and Ctrl-Shift-Enter switch backwards between full screen modes
- if (event.kbd.keycode == Common::KEYCODE_RETURN ||
- event.kbd.keycode == (Common::KeyCode)SDLK_KP_ENTER) {
- toggleFullScreen(-1);
return true;
}
}
- break;
-
- case Common::EVENT_KEYUP:
- return isHotkey(event);
+ // Fall through
default:
- break;
+ return false;
}
-
- return false;
-}
-
-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);
-
- if (getScale() != scale) {
- scaleChanged = true;
- setScale(MAX(MIN(scale, 3), 1));
- }
-
- _transactionDetails.sizeChanged = true;
- endGFXTransaction();
-#ifdef USE_OSD
- if (scaleChanged)
- displayScaleChangedMsg();
-#endif
+bool OpenGLSdlGraphicsManager::isHotkey(const Common::Event &event) {
+ if (event.kbd.hasFlags(Common::KBD_ALT)) {
+ return event.kbd.keycode == Common::KEYCODE_RETURN
+ || event.kbd.keycode == (Common::KeyCode)SDLK_KP_ENTER
+ || event.kbd.keycode == Common::KEYCODE_s;
+ } else if (event.kbd.hasFlags(Common::KBD_CTRL | Common::KBD_ALT)) {
+ return event.kbd.keycode == Common::KEYCODE_PLUS || event.kbd.keycode == Common::KEYCODE_MINUS
+ || event.kbd.keycode == Common::KEYCODE_KP_PLUS || event.kbd.keycode == Common::KEYCODE_KP_MINUS
+ || event.kbd.keycode == Common::KEYCODE_a
+ || event.kbd.keycode == Common::KEYCODE_f;
}
-}
-
-void OpenGLSdlGraphicsManager::transformMouseCoordinates(Common::Point &point) {
- adjustMousePosition(point.x, point.y);
-}
-void OpenGLSdlGraphicsManager::notifyMousePos(Common::Point mouse) {
- setMousePosition(mouse.x, mouse.y);
+ return false;
}
-
-#endif
diff --git a/backends/graphics/openglsdl/openglsdl-graphics.h b/backends/graphics/openglsdl/openglsdl-graphics.h
index 1587183328..9934ca79e2 100644
--- a/backends/graphics/openglsdl/openglsdl-graphics.h
+++ b/backends/graphics/openglsdl/openglsdl-graphics.h
@@ -8,117 +8,109 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public 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_OPENGLSDL_H
-#define BACKENDS_GRAPHICS_OPENGLSDL_H
+#ifndef BACKENDS_GRAPHICS_OPENGLSDL_OPENGLSDL_GRAPHICS_H
+#define BACKENDS_GRAPHICS_OPENGLSDL_OPENGLSDL_GRAPHICS_H
-#include "backends/platform/sdl/sdl-sys.h"
-#if defined(ARRAYSIZE) && !defined(_WINDOWS_)
-#undef ARRAYSIZE
-#endif
-#include "backends/graphics/sdl/sdl-graphics.h"
#include "backends/graphics/opengl/opengl-graphics.h"
+#include "backends/graphics/sdl/sdl-graphics.h"
+#include "backends/platform/sdl/sdl-sys.h"
+#include "common/array.h"
#include "common/events.h"
-/**
- * SDL OpenGL graphics manager
- */
-class OpenGLSdlGraphicsManager : public OpenGLGraphicsManager, public SdlGraphicsManager, public Common::EventObserver {
+class OpenGLSdlGraphicsManager : public OpenGL::OpenGLGraphicsManager, public SdlGraphicsManager, public Common::EventObserver {
public:
- OpenGLSdlGraphicsManager(SdlEventSource *eventSource);
+ OpenGLSdlGraphicsManager(uint desktopWidth, uint desktopHeight, SdlEventSource *eventSource);
virtual ~OpenGLSdlGraphicsManager();
+ // GraphicsManager API
+ virtual void activateManager();
+ virtual void deactivateManager();
+
virtual bool hasFeature(OSystem::Feature f);
virtual void setFeatureState(OSystem::Feature f, bool enable);
+ virtual bool getFeatureState(OSystem::Feature f);
+
+ virtual bool setGraphicsMode(int mode);
+ virtual void resetGraphicsScale();
#ifdef USE_RGB_COLOR
virtual Common::List<Graphics::PixelFormat> getSupportedFormats() const;
#endif
- virtual void initEventObserver();
- virtual bool notifyEvent(const Common::Event &event);
-
virtual void updateScreen();
- // SdlGraphicsManager interface
+ // EventObserver API
+ virtual bool notifyEvent(const Common::Event &event);
+
+ // SdlGraphicsManager API
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();
+ virtual void setInternalMousePosition(int x, int y);
- virtual bool loadGFXMode();
- virtual void unloadGFXMode();
- virtual bool isHotkey(const Common::Event &event);
+ virtual bool loadVideoMode(uint requestedWidth, uint requestedHeight, const Graphics::PixelFormat &format);
+private:
+ bool setupMode(uint width, uint height);
-#ifdef USE_RGB_COLOR
- Common::List<Graphics::PixelFormat> _supportedFormats;
+ uint32 _lastVideoModeLoad;
+ SDL_Surface *_hwScreen;
- /**
- * Update the list of supported pixel formats.
- * This method is invoked by loadGFXMode().
- */
- void detectSupportedFormats();
-#endif
+ uint _lastRequestedWidth;
+ uint _lastRequestedHeight;
+ uint _graphicsScale;
+ bool _ignoreLoadVideoMode;
+ bool _gotResize;
- /**
- * Toggles fullscreen.
- * @loop loop direction for switching fullscreen mode, if 0 toggles it.
- */
- virtual void toggleFullScreen(int loop);
+ bool _wantsFullScreen;
+ uint _ignoreResizeEvents;
- int _activeFullscreenMode;
+ struct VideoMode {
+ VideoMode() : width(0), height(0) {}
+ VideoMode(uint w, uint h) : width(w), height(h) {}
- /**
- * Setup the fullscreen mode.
- * @return false if failed finding a mode, true otherwise.
- */
- virtual bool setupFullscreenMode();
+ bool operator<(const VideoMode &right) const {
+ if (width < right.width) {
+ return true;
+ } else if (width == right.width && height < right.height) {
+ return true;
+ } else {
+ return false;
+ }
+ }
- virtual void setInternalMousePosition(int x, int y);
+ bool operator==(const VideoMode &right) const {
+ return width == right.width && height == right.height;
+ }
- int _lastFullscreenModeWidth;
- int _lastFullscreenModeHeight;
- int _desktopWidth;
- int _desktopHeight;
-
- // Hardware screen
- SDL_Surface *_hwscreen;
-
- // If screen was resized by the user
- bool _screenResized;
-
- // Ignore resize events for the number of updateScreen() calls.
- // Normaly resize events are user generated when resizing the window
- // from its borders, but in some cases a resize event can be generated
- // after a fullscreen change.
- int _ignoreResizeFrames;
-
-#ifdef USE_OSD
- /**
- * Displays a mode change message in OSD
- */
- void displayModeChangedMsg();
-
- /**
- * Displays a scale change message in OSD
- */
- void displayScaleChangedMsg();
-#endif
+ bool operator!=(const VideoMode &right) const {
+ return !(*this == right);
+ }
+
+ uint width, height;
+ };
+ typedef Common::Array<VideoMode> VideoModeArray;
+ VideoModeArray _fullscreenVideoModes;
+
+ uint _desiredFullscreenWidth;
+ uint _desiredFullscreenHeight;
+
+ virtual bool isHotkey(const Common::Event &event);
};
#endif
diff --git a/backends/graphics/openpandora/op-graphics.cpp b/backends/graphics/openpandora/op-graphics.cpp
index f371081fde..1ded1614de 100644
--- a/backends/graphics/openpandora/op-graphics.cpp
+++ b/backends/graphics/openpandora/op-graphics.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/backends/graphics/openpandora/op-graphics.h b/backends/graphics/openpandora/op-graphics.h
index 2e3d63e3ad..8b498d632b 100644
--- a/backends/graphics/openpandora/op-graphics.h
+++ b/backends/graphics/openpandora/op-graphics.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/backends/graphics/samsungtvsdl/samsungtvsdl-graphics.cpp b/backends/graphics/samsungtvsdl/samsungtvsdl-graphics.cpp
index 95e0875f55..3603d8a861 100644
--- a/backends/graphics/samsungtvsdl/samsungtvsdl-graphics.cpp
+++ b/backends/graphics/samsungtvsdl/samsungtvsdl-graphics.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/backends/graphics/samsungtvsdl/samsungtvsdl-graphics.h b/backends/graphics/samsungtvsdl/samsungtvsdl-graphics.h
index 2d0ff636f4..15ba3dca48 100644
--- a/backends/graphics/samsungtvsdl/samsungtvsdl-graphics.h
+++ b/backends/graphics/samsungtvsdl/samsungtvsdl-graphics.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/backends/graphics/sdl/sdl-graphics.cpp b/backends/graphics/sdl/sdl-graphics.cpp
index 2eca4b8aab..b5e49fa397 100644
--- a/backends/graphics/sdl/sdl-graphics.cpp
+++ b/backends/graphics/sdl/sdl-graphics.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -26,10 +26,15 @@
SdlGraphicsManager::SdlGraphicsManager(SdlEventSource *source)
: _eventSource(source) {
- _eventSource->setGraphicsManager(this);
}
SdlGraphicsManager::~SdlGraphicsManager() {
- _eventSource->setGraphicsManager(0);
}
+void SdlGraphicsManager::activateManager() {
+ _eventSource->setGraphicsManager(this);
+}
+
+void SdlGraphicsManager::deactivateManager() {
+ _eventSource->setGraphicsManager(0);
+}
diff --git a/backends/graphics/sdl/sdl-graphics.h b/backends/graphics/sdl/sdl-graphics.h
index ea9149fccb..3ef540708a 100644
--- a/backends/graphics/sdl/sdl-graphics.h
+++ b/backends/graphics/sdl/sdl-graphics.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -23,6 +23,8 @@
#ifndef BACKENDS_GRAPHICS_SDL_SDLGRAPHICS_H
#define BACKENDS_GRAPHICS_SDL_SDLGRAPHICS_H
+#include "backends/graphics/graphics.h"
+
#include "common/rect.h"
class SdlEventSource;
@@ -31,16 +33,26 @@ 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 {
+class SdlGraphicsManager : virtual public GraphicsManager {
public:
SdlGraphicsManager(SdlEventSource *source);
virtual ~SdlGraphicsManager();
/**
+ * Makes this graphics manager active. That means it should be ready to
+ * process inputs now. However, even without being active it should be
+ * able to query the supported modes and other bits.
+ */
+ virtual void activateManager();
+
+ /**
+ * Makes this graphics manager inactive. This should allow another
+ * graphics manager to become active again.
+ */
+ virtual void deactivateManager();
+
+ /**
* Notify the graphics manager that the graphics needs to be redrawn, since
* the application window was modified.
*
diff --git a/backends/graphics/surfacesdl/surfacesdl-graphics.cpp b/backends/graphics/surfacesdl/surfacesdl-graphics.cpp
index 871c6c49b2..7f3c99fcea 100644
--- a/backends/graphics/surfacesdl/surfacesdl-graphics.cpp
+++ b/backends/graphics/surfacesdl/surfacesdl-graphics.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -142,14 +142,6 @@ SurfaceSdlGraphicsManager::SurfaceSdlGraphicsManager(SdlEventSource *sdlEventSou
#endif
_transactionMode(kTransactionNone) {
- if (SDL_InitSubSystem(SDL_INIT_VIDEO) == -1) {
- error("Could not initialize SDL: %s", SDL_GetError());
- }
-
- // This is also called in initSDL(), but initializing graphics
- // may reset it.
- SDL_EnableUNICODE(1);
-
// allocate palette storage
_currentPalette = (SDL_Color *)calloc(sizeof(SDL_Color), 256);
_cursorPalette = (SDL_Color *)calloc(sizeof(SDL_Color), 256);
@@ -165,8 +157,6 @@ SurfaceSdlGraphicsManager::SurfaceSdlGraphicsManager(SdlEventSource *sdlEventSou
_enableFocusRectDebugCode = ConfMan.getBool("use_sdl_debug_focusrect");
#endif
- SDL_ShowCursor(SDL_DISABLE);
-
memset(&_oldVideoMode, 0, sizeof(_oldVideoMode));
memset(&_videoMode, 0, sizeof(_videoMode));
memset(&_transactionDetails, 0, sizeof(_transactionDetails));
@@ -193,10 +183,6 @@ SurfaceSdlGraphicsManager::SurfaceSdlGraphicsManager(SdlEventSource *sdlEventSou
}
SurfaceSdlGraphicsManager::~SurfaceSdlGraphicsManager() {
- // Unregister the event observer
- if (g_system->getEventManager()->getEventDispatcher() != NULL)
- g_system->getEventManager()->getEventDispatcher()->unregisterObserver(this);
-
unloadGFXMode();
if (_mouseSurface)
SDL_FreeSurface(_mouseSurface);
@@ -211,11 +197,22 @@ SurfaceSdlGraphicsManager::~SurfaceSdlGraphicsManager() {
free(_mouseData);
}
-void SurfaceSdlGraphicsManager::initEventObserver() {
+void SurfaceSdlGraphicsManager::activateManager() {
+ SdlGraphicsManager::activateManager();
+
// Register the graphics manager as a event observer
g_system->getEventManager()->getEventDispatcher()->registerObserver(this, 10, false);
}
+void SurfaceSdlGraphicsManager::deactivateManager() {
+ // Unregister the event observer
+ if (g_system->getEventManager()->getEventDispatcher()) {
+ g_system->getEventManager()->getEventDispatcher()->unregisterObserver(this);
+ }
+
+ SdlGraphicsManager::deactivateManager();
+}
+
bool SurfaceSdlGraphicsManager::hasFeature(OSystem::Feature f) {
return
(f == OSystem::kFeatureFullscreenMode) ||
@@ -263,16 +260,16 @@ bool SurfaceSdlGraphicsManager::getFeatureState(OSystem::Feature f) {
}
}
-const OSystem::GraphicsMode *SurfaceSdlGraphicsManager::supportedGraphicsModes() {
- return s_supportedGraphicsModes;
-}
-
const OSystem::GraphicsMode *SurfaceSdlGraphicsManager::getSupportedGraphicsModes() const {
return s_supportedGraphicsModes;
}
int SurfaceSdlGraphicsManager::getDefaultGraphicsMode() const {
+#ifdef USE_SCALERS
return GFX_DOUBLESIZE;
+#else
+ return GFX_NORMAL;
+#endif
}
void SurfaceSdlGraphicsManager::resetGraphicsScale() {
@@ -747,6 +744,8 @@ bool SurfaceSdlGraphicsManager::loadGFXMode() {
if (_screen == NULL)
error("allocating _screen failed");
+ // Avoid having SDL_SRCALPHA set even if we supplied an alpha-channel in the format.
+ SDL_SetAlpha(_screen, 0, 255);
#else
_screen = SDL_CreateRGBSurface(SDL_SWSURFACE, _videoMode.screenWidth, _videoMode.screenHeight, 8, 0, 0, 0, 0);
if (_screen == NULL)
@@ -1081,7 +1080,9 @@ void SurfaceSdlGraphicsManager::internUpdateScreen() {
for (r = _dirtyRectList; r != lastRect; ++r) {
register int dst_y = r->y + _currentShakePos;
register int dst_h = 0;
+#ifdef USE_SCALERS
register int orig_dst_y = 0;
+#endif
register int rx1 = r->x * scale1;
if (dst_y < height) {
@@ -1089,7 +1090,9 @@ void SurfaceSdlGraphicsManager::internUpdateScreen() {
if (dst_h > height - dst_y)
dst_h = height - dst_y;
+#ifdef USE_SCALERS
orig_dst_y = dst_y;
+#endif
dst_y = dst_y * scale1;
if (_videoMode.aspectRatioCorrection && !_overlayVisible)
diff --git a/backends/graphics/surfacesdl/surfacesdl-graphics.h b/backends/graphics/surfacesdl/surfacesdl-graphics.h
index 97de0f9c97..49bd66b3e5 100644
--- a/backends/graphics/surfacesdl/surfacesdl-graphics.h
+++ b/backends/graphics/surfacesdl/surfacesdl-graphics.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -75,18 +75,18 @@ public:
/**
* SDL graphics manager
*/
-class SurfaceSdlGraphicsManager : public GraphicsManager, public SdlGraphicsManager, public Common::EventObserver {
+class SurfaceSdlGraphicsManager : public SdlGraphicsManager, public Common::EventObserver {
public:
SurfaceSdlGraphicsManager(SdlEventSource *sdlEventSource);
virtual ~SurfaceSdlGraphicsManager();
- virtual void initEventObserver();
+ virtual void activateManager();
+ virtual void deactivateManager();
virtual bool hasFeature(OSystem::Feature f);
virtual void setFeatureState(OSystem::Feature f, bool enable);
virtual bool getFeatureState(OSystem::Feature f);
- static const OSystem::GraphicsMode *supportedGraphicsModes();
virtual const OSystem::GraphicsMode *getSupportedGraphicsModes() const;
virtual int getDefaultGraphicsMode() const;
virtual bool setGraphicsMode(int mode);
diff --git a/backends/graphics/symbiansdl/symbiansdl-graphics.cpp b/backends/graphics/symbiansdl/symbiansdl-graphics.cpp
index 5fe8b19887..e339fecd1c 100644
--- a/backends/graphics/symbiansdl/symbiansdl-graphics.cpp
+++ b/backends/graphics/symbiansdl/symbiansdl-graphics.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/backends/graphics/symbiansdl/symbiansdl-graphics.h b/backends/graphics/symbiansdl/symbiansdl-graphics.h
index 73e810a629..f514db286c 100644
--- a/backends/graphics/symbiansdl/symbiansdl-graphics.h
+++ b/backends/graphics/symbiansdl/symbiansdl-graphics.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/backends/graphics/wincesdl/wincesdl-graphics.cpp b/backends/graphics/wincesdl/wincesdl-graphics.cpp
index f075f8cf8a..8e4685dbd8 100644
--- a/backends/graphics/wincesdl/wincesdl-graphics.cpp
+++ b/backends/graphics/wincesdl/wincesdl-graphics.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/backends/graphics/wincesdl/wincesdl-graphics.h b/backends/graphics/wincesdl/wincesdl-graphics.h
index 2897ca5f40..50b422c10d 100644
--- a/backends/graphics/wincesdl/wincesdl-graphics.h
+++ b/backends/graphics/wincesdl/wincesdl-graphics.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/backends/keymapper/action.cpp b/backends/keymapper/action.cpp
index 33f5c423b0..5108590f0c 100644
--- a/backends/keymapper/action.cpp
+++ b/backends/keymapper/action.cpp
@@ -1,24 +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.
-*
-*/
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public 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/keymapper/action.h"
diff --git a/backends/keymapper/action.h b/backends/keymapper/action.h
index 5e69ed3918..ed4bb86ce6 100644
--- a/backends/keymapper/action.h
+++ b/backends/keymapper/action.h
@@ -1,24 +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.
-*
-*/
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public 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_ACTION_H
#define COMMON_ACTION_H
diff --git a/backends/keymapper/hardware-input.cpp b/backends/keymapper/hardware-input.cpp
index d1f8822ac0..d4b5ff5da0 100644
--- a/backends/keymapper/hardware-input.cpp
+++ b/backends/keymapper/hardware-input.cpp
@@ -1,24 +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.
-*
-*/
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public 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/keymapper/hardware-input.h"
diff --git a/backends/keymapper/hardware-input.h b/backends/keymapper/hardware-input.h
index 51d4accb5b..064d7e9da0 100644
--- a/backends/keymapper/hardware-input.h
+++ b/backends/keymapper/hardware-input.h
@@ -1,24 +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.
-*
-*/
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public 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_HARDWARE_KEY_H
#define COMMON_HARDWARE_KEY_H
diff --git a/backends/keymapper/keymap.cpp b/backends/keymapper/keymap.cpp
index e95dd6afb5..eaa774c972 100644
--- a/backends/keymapper/keymap.cpp
+++ b/backends/keymapper/keymap.cpp
@@ -1,24 +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.
-*
-*/
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public 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/keymapper/keymap.h"
diff --git a/backends/keymapper/keymap.h b/backends/keymapper/keymap.h
index 6eaec7dcaf..0694dc31e1 100644
--- a/backends/keymapper/keymap.h
+++ b/backends/keymapper/keymap.h
@@ -1,24 +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.
-*
-*/
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public 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_KEYMAP_H
#define COMMON_KEYMAP_H
diff --git a/backends/keymapper/keymapper-defaults.h b/backends/keymapper/keymapper-defaults.h
index bd4afd4e3a..aedde873dc 100644
--- a/backends/keymapper/keymapper-defaults.h
+++ b/backends/keymapper/keymapper-defaults.h
@@ -1,24 +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.
-*
-*/
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ */
#ifdef ENABLE_KEYMAPPER
diff --git a/backends/keymapper/keymapper.cpp b/backends/keymapper/keymapper.cpp
index dcb021f2d8..aba00c500d 100644
--- a/backends/keymapper/keymapper.cpp
+++ b/backends/keymapper/keymapper.cpp
@@ -1,24 +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.
-*
-*/
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public 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/keymapper/keymapper.h"
diff --git a/backends/keymapper/keymapper.h b/backends/keymapper/keymapper.h
index a54a2acbdc..ea6fc14e35 100644
--- a/backends/keymapper/keymapper.h
+++ b/backends/keymapper/keymapper.h
@@ -1,24 +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.
-*
-*/
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public 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_KEYMAPPER_H
#define COMMON_KEYMAPPER_H
diff --git a/backends/keymapper/remap-dialog.cpp b/backends/keymapper/remap-dialog.cpp
index 009c2201a9..3aa3647048 100644
--- a/backends/keymapper/remap-dialog.cpp
+++ b/backends/keymapper/remap-dialog.cpp
@@ -17,6 +17,7 @@
* You should have received a copy of the GNU General Public 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/keymapper/remap-dialog.h"
@@ -257,6 +258,12 @@ void RemapDialog::startRemapping(uint i) {
if (_topAction + i >= _currentActions.size())
return;
+ if (_keymapper->isRemapping()) {
+ // Handle a second click on the button as a stop to remapping
+ stopRemapping(true);
+ return;
+ }
+
_remapTimeout = g_system->getMillis() + kRemapTimeoutDelay;
Action *activeRemapAction = _currentActions[_topAction + i].action;
_keymapWidgets[i].keyButton->setLabel("...");
diff --git a/backends/keymapper/remap-dialog.h b/backends/keymapper/remap-dialog.h
index 82c68405db..054a471064 100644
--- a/backends/keymapper/remap-dialog.h
+++ b/backends/keymapper/remap-dialog.h
@@ -17,6 +17,7 @@
* You should have received a copy of the GNU General Public 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 REMAP_DIALOG_H
diff --git a/backends/midi/alsa.cpp b/backends/midi/alsa.cpp
index c006b6b6bf..14889b2942 100644
--- a/backends/midi/alsa.cpp
+++ b/backends/midi/alsa.cpp
@@ -17,6 +17,7 @@
* You should have received a copy of the GNU General Public 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.
diff --git a/backends/midi/camd.cpp b/backends/midi/camd.cpp
index 88973488ca..d91aef5533 100644
--- a/backends/midi/camd.cpp
+++ b/backends/midi/camd.cpp
@@ -17,6 +17,7 @@
* You should have received a copy of the GNU General Public 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.
@@ -30,11 +31,13 @@
#include "common/error.h"
#include "common/endian.h"
#include "common/util.h"
+#include "common/str.h"
#include "audio/musicplugin.h"
#include "audio/mpu401.h"
#include <proto/camd.h>
#include <proto/exec.h>
+#include <proto/dos.h>
/*
* CAMD sequencer driver
@@ -55,6 +58,7 @@ private:
struct Library *_CamdBase;
struct CamdIFace *_ICamd;
struct MidiLink *_midi_link;
+ char _outport[128];
char *getDevice();
void closeAll();
@@ -154,13 +158,18 @@ char *MidiDriver_CAMD::getDevice() {
if (strstr(dev, "out") != NULL) {
// This is an output device, return this
- retname = dev;
+ Common::strlcpy(_outport, dev, sizeof(_outport));
+ retname = _outport;
} else {
// Search the next one
cluster = _ICamd->NextCluster(cluster);
}
}
+ // If the user has a preference outport set, use this instead
+ if(IDOS->GetVar("DefMidiOut", _outport, 128, 0))
+ retname = _outport;
+
_ICamd->UnlockCAMD(key);
}
diff --git a/backends/midi/coreaudio.cpp b/backends/midi/coreaudio.cpp
index e42b8ca313..74c590c654 100644
--- a/backends/midi/coreaudio.cpp
+++ b/backends/midi/coreaudio.cpp
@@ -17,6 +17,7 @@
* You should have received a copy of the GNU General Public 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.
diff --git a/backends/midi/coremidi.cpp b/backends/midi/coremidi.cpp
index 1d61dceba2..e2ec8405e9 100644
--- a/backends/midi/coremidi.cpp
+++ b/backends/midi/coremidi.cpp
@@ -17,6 +17,7 @@
* You should have received a copy of the GNU General Public 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.
diff --git a/backends/midi/dmedia.cpp b/backends/midi/dmedia.cpp
index 68e957f9aa..eac2d34b58 100644
--- a/backends/midi/dmedia.cpp
+++ b/backends/midi/dmedia.cpp
@@ -17,6 +17,7 @@
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
*/
/*
diff --git a/backends/midi/seq.cpp b/backends/midi/seq.cpp
index 37986520bf..2ce25b726c 100644
--- a/backends/midi/seq.cpp
+++ b/backends/midi/seq.cpp
@@ -17,6 +17,7 @@
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
*/
/*
diff --git a/backends/midi/sndio.cpp b/backends/midi/sndio.cpp
index a065a658e1..5efec4b899 100644
--- a/backends/midi/sndio.cpp
+++ b/backends/midi/sndio.cpp
@@ -17,6 +17,7 @@
* You should have received a copy of the GNU General Public 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.
diff --git a/backends/midi/stmidi.cpp b/backends/midi/stmidi.cpp
index 5a6326877e..28350b3cc2 100644
--- a/backends/midi/stmidi.cpp
+++ b/backends/midi/stmidi.cpp
@@ -17,6 +17,7 @@
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
*/
/*
diff --git a/backends/midi/timidity.cpp b/backends/midi/timidity.cpp
index d2c60bec9d..d10b808bdb 100644
--- a/backends/midi/timidity.cpp
+++ b/backends/midi/timidity.cpp
@@ -17,6 +17,7 @@
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
*/
/*
diff --git a/backends/midi/windows.cpp b/backends/midi/windows.cpp
index f4c5431d6e..e2b327ffa7 100644
--- a/backends/midi/windows.cpp
+++ b/backends/midi/windows.cpp
@@ -17,6 +17,7 @@
* You should have received a copy of the GNU General Public 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.
diff --git a/backends/mixer/doublebuffersdl/doublebuffersdl-mixer.cpp b/backends/mixer/doublebuffersdl/doublebuffersdl-mixer.cpp
index 3e5b9940e0..d59b0ebdfc 100644
--- a/backends/mixer/doublebuffersdl/doublebuffersdl-mixer.cpp
+++ b/backends/mixer/doublebuffersdl/doublebuffersdl-mixer.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/backends/mixer/doublebuffersdl/doublebuffersdl-mixer.h b/backends/mixer/doublebuffersdl/doublebuffersdl-mixer.h
index c95294e2c0..e3019fe11b 100644
--- a/backends/mixer/doublebuffersdl/doublebuffersdl-mixer.h
+++ b/backends/mixer/doublebuffersdl/doublebuffersdl-mixer.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/backends/mixer/nullmixer/nullsdl-mixer.cpp b/backends/mixer/nullmixer/nullsdl-mixer.cpp
index 2fd652e19f..97b59bb2ed 100644
--- a/backends/mixer/nullmixer/nullsdl-mixer.cpp
+++ b/backends/mixer/nullmixer/nullsdl-mixer.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/backends/mixer/nullmixer/nullsdl-mixer.h b/backends/mixer/nullmixer/nullsdl-mixer.h
index 94248ced66..2fc46efc39 100644
--- a/backends/mixer/nullmixer/nullsdl-mixer.h
+++ b/backends/mixer/nullmixer/nullsdl-mixer.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/backends/mixer/sdl/sdl-mixer.cpp b/backends/mixer/sdl/sdl-mixer.cpp
index 3c79290b50..7c709e91a3 100644
--- a/backends/mixer/sdl/sdl-mixer.cpp
+++ b/backends/mixer/sdl/sdl-mixer.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -58,6 +58,12 @@ void SdlMixerManager::init() {
error("Could not initialize SDL: %s", SDL_GetError());
}
+ const int maxNameLen = 20;
+ char sdlDriverName[maxNameLen];
+ sdlDriverName[0] = '\0';
+ SDL_AudioDriverName(sdlDriverName, maxNameLen);
+ debug(1, "Using SDL Audio Driver \"%s\"", sdlDriverName);
+
// Get the desired audio specs
SDL_AudioSpec desired = getAudioSpec(SAMPLES_PER_SEC);
diff --git a/backends/mixer/sdl/sdl-mixer.h b/backends/mixer/sdl/sdl-mixer.h
index 6fee26bd1f..088ebe109e 100644
--- a/backends/mixer/sdl/sdl-mixer.h
+++ b/backends/mixer/sdl/sdl-mixer.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/backends/mixer/sdl13/sdl13-mixer.cpp b/backends/mixer/sdl13/sdl13-mixer.cpp
index 24d3434fde..f9894a6f91 100644
--- a/backends/mixer/sdl13/sdl13-mixer.cpp
+++ b/backends/mixer/sdl13/sdl13-mixer.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/backends/mixer/sdl13/sdl13-mixer.h b/backends/mixer/sdl13/sdl13-mixer.h
index 9e07ea8673..ff2bb43084 100644
--- a/backends/mixer/sdl13/sdl13-mixer.h
+++ b/backends/mixer/sdl13/sdl13-mixer.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/backends/mixer/symbiansdl/symbiansdl-mixer.cpp b/backends/mixer/symbiansdl/symbiansdl-mixer.cpp
index e978e9207f..debbb74c4f 100644
--- a/backends/mixer/symbiansdl/symbiansdl-mixer.cpp
+++ b/backends/mixer/symbiansdl/symbiansdl-mixer.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/backends/mixer/symbiansdl/symbiansdl-mixer.h b/backends/mixer/symbiansdl/symbiansdl-mixer.h
index d59c98753b..4203d59350 100644
--- a/backends/mixer/symbiansdl/symbiansdl-mixer.h
+++ b/backends/mixer/symbiansdl/symbiansdl-mixer.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/backends/mixer/wincesdl/wincesdl-mixer.cpp b/backends/mixer/wincesdl/wincesdl-mixer.cpp
index db5ab59446..2c70ee76c7 100644
--- a/backends/mixer/wincesdl/wincesdl-mixer.cpp
+++ b/backends/mixer/wincesdl/wincesdl-mixer.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/backends/mixer/wincesdl/wincesdl-mixer.h b/backends/mixer/wincesdl/wincesdl-mixer.h
index fb51f6ac64..56883fa080 100644
--- a/backends/mixer/wincesdl/wincesdl-mixer.h
+++ b/backends/mixer/wincesdl/wincesdl-mixer.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/backends/modular-backend.cpp b/backends/modular-backend.cpp
index 6afe06aeca..d8be9ca7ed 100644
--- a/backends/modular-backend.cpp
+++ b/backends/modular-backend.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/backends/modular-backend.h b/backends/modular-backend.h
index b43769c716..20e8b7357d 100644
--- a/backends/modular-backend.h
+++ b/backends/modular-backend.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/backends/module.mk b/backends/module.mk
index 31ac444750..34e2928419 100644
--- a/backends/module.mk
+++ b/backends/module.mk
@@ -40,14 +40,6 @@ MODULE_OBJS += \
keymapper/remap-dialog.o
endif
-ifdef USE_OPENGL
-MODULE_OBJS += \
- graphics/opengl/glerrorcheck.o \
- graphics/opengl/gltexture.o \
- graphics/opengl/opengl-graphics.o \
- graphics/openglsdl/openglsdl-graphics.o
-endif
-
ifdef ENABLE_VKEYBD
MODULE_OBJS += \
vkeybd/image-map.o \
@@ -57,6 +49,15 @@ MODULE_OBJS += \
vkeybd/virtual-keyboard-parser.o
endif
+# OpenGL specific source files.
+ifdef USE_OPENGL
+MODULE_OBJS += \
+ graphics/opengl/debug.o \
+ graphics/opengl/extensions.o \
+ graphics/opengl/opengl-graphics.o \
+ graphics/opengl/texture.o
+endif
+
# SDL specific source files.
# We cannot just check $BACKEND = sdl, as various other backends
# derive from the SDL backend, and they all need the following files.
@@ -76,6 +77,11 @@ ifndef USE_SDL13
MODULE_OBJS += \
audiocd/sdl/sdl-audiocd.o
endif
+
+ifdef USE_OPENGL
+MODULE_OBJS += \
+ graphics/openglsdl/openglsdl-graphics.o
+endif
endif
ifdef POSIX
@@ -91,7 +97,8 @@ ifdef MACOSX
MODULE_OBJS += \
midi/coreaudio.o \
midi/coremidi.o \
- updates/macosx/macosx-updates.o
+ updates/macosx/macosx-updates.o \
+ taskbar/macosx/macosx-taskbar.o
endif
ifdef WIN32
diff --git a/backends/mutex/mutex.h b/backends/mutex/mutex.h
index 9cc16c7a2c..26a6d47e09 100644
--- a/backends/mutex/mutex.h
+++ b/backends/mutex/mutex.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/backends/mutex/null/null-mutex.h b/backends/mutex/null/null-mutex.h
index 7ae10cedb8..218b1adf02 100644
--- a/backends/mutex/null/null-mutex.h
+++ b/backends/mutex/null/null-mutex.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/backends/mutex/sdl/sdl-mutex.cpp b/backends/mutex/sdl/sdl-mutex.cpp
index a51e6f0e38..be10d30500 100644
--- a/backends/mutex/sdl/sdl-mutex.cpp
+++ b/backends/mutex/sdl/sdl-mutex.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/backends/mutex/sdl/sdl-mutex.h b/backends/mutex/sdl/sdl-mutex.h
index 914c2a19db..6fcae05cee 100644
--- a/backends/mutex/sdl/sdl-mutex.h
+++ b/backends/mutex/sdl/sdl-mutex.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/backends/platform/android/android.cpp b/backends/platform/android/android.cpp
index 5e3d1d0db6..3ff1b939ef 100644
--- a/backends/platform/android/android.cpp
+++ b/backends/platform/android/android.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope 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.
diff --git a/backends/platform/android/android.h b/backends/platform/android/android.h
index 704ce12f60..28016f5e3e 100644
--- a/backends/platform/android/android.h
+++ b/backends/platform/android/android.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope 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.
diff --git a/backends/platform/android/android.mk b/backends/platform/android/android.mk
index 915bf8ac60..7c4fe01d54 100644
--- a/backends/platform/android/android.mk
+++ b/backends/platform/android/android.mk
@@ -7,6 +7,7 @@ ANDROID_PLUGIN_VERSIONCODE = 6
JAVA_FILES = \
ScummVM.java \
ScummVMEvents.java \
+ ScummVMEventsHoneycomb.java \
ScummVMApplication.java \
ScummVMActivity.java \
EditableSurfaceView.java \
diff --git a/backends/platform/android/asset-archive.cpp b/backends/platform/android/asset-archive.cpp
index da378fb082..52c2c084bd 100644
--- a/backends/platform/android/asset-archive.cpp
+++ b/backends/platform/android/asset-archive.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/backends/platform/android/asset-archive.h b/backends/platform/android/asset-archive.h
index c5e43555e0..6a0033d24e 100644
--- a/backends/platform/android/asset-archive.h
+++ b/backends/platform/android/asset-archive.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/backends/platform/android/events.cpp b/backends/platform/android/events.cpp
index 5c42db9347..c60626ec36 100644
--- a/backends/platform/android/events.cpp
+++ b/backends/platform/android/events.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope 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.
diff --git a/backends/platform/android/gfx.cpp b/backends/platform/android/gfx.cpp
index 882dcff9a4..d7713f99d8 100644
--- a/backends/platform/android/gfx.cpp
+++ b/backends/platform/android/gfx.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope 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.
@@ -94,6 +94,7 @@ Common::List<Graphics::PixelFormat> OSystem_Android::getSupportedFormats() const
Common::List<Graphics::PixelFormat> res;
res.push_back(GLES565Texture::pixelFormat());
res.push_back(GLES5551Texture::pixelFormat());
+ res.push_back(GLES8888Texture::pixelFormat());
res.push_back(GLES4444Texture::pixelFormat());
res.push_back(Graphics::PixelFormat::createFormatCLUT8());
@@ -147,6 +148,8 @@ void OSystem_Android::initTexture(GLESBaseTexture **texture,
*texture = new GLES565Texture();
else if (format_new == GLES5551Texture::pixelFormat())
*texture = new GLES5551Texture();
+ else if (format_new == GLES8888Texture::pixelFormat())
+ *texture = new GLES8888Texture();
else if (format_new == GLES4444Texture::pixelFormat())
*texture = new GLES4444Texture();
else {
@@ -233,7 +236,7 @@ void OSystem_Android::initViewport() {
GLCALL(glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_FASTEST));
GLCALL(glEnable(GL_BLEND));
- GLCALL(glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA));
+ GLCALL(glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA));
GLCALL(glEnableClientState(GL_VERTEX_ARRAY));
GLCALL(glEnableClientState(GL_TEXTURE_COORD_ARRAY));
@@ -726,7 +729,7 @@ void OSystem_Android::setMouseCursor(const void *buf, uint w, uint h,
_mouse_keycolor = keycolor;
p = _mouse_texture_palette->palette() + _mouse_keycolor * 2;
- WRITE_UINT16(p, READ_UINT16(p) & ~1);
+ WRITE_UINT16(p, 0);
}
if (w == 0 || h == 0)
@@ -752,12 +755,12 @@ void OSystem_Android::setMouseCursor(const void *buf, uint w, uint h,
return;
}
- uint16 *s = (uint16 *)buf;
+ const uint16 *s = (const uint16 *)buf;
uint16 *d = (uint16 *)tmp;
for (uint16 y = 0; y < h; ++y, d += pitch / 2 - w)
for (uint16 x = 0; x < w; ++x, d++)
- if (*s++ != (keycolor & 0xffff))
- *d |= 1;
+ if (*s++ == (keycolor & 0xffff))
+ *d = 0;
_mouse_texture->updateBuffer(0, 0, w, h, tmp, pitch);
@@ -779,7 +782,7 @@ void OSystem_Android::setCursorPaletteInternal(const byte *colors,
WRITE_UINT16(p, pf.RGBToColor(colors[0], colors[1], colors[2]));
p = _mouse_texture_palette->palette() + _mouse_keycolor * 2;
- WRITE_UINT16(p, READ_UINT16(p) & ~1);
+ WRITE_UINT16(p, 0);
}
void OSystem_Android::setCursorPalette(const byte *colors,
@@ -821,7 +824,7 @@ void OSystem_Android::disableCursorPalette() {
}
byte *p = _mouse_texture_palette->palette() + _mouse_keycolor * 2;
- WRITE_UINT16(p, READ_UINT16(p) & ~1);
+ WRITE_UINT16(p, 0);
}
}
diff --git a/backends/platform/android/jni.cpp b/backends/platform/android/jni.cpp
index 2b738dd63f..764c84ce1c 100644
--- a/backends/platform/android/jni.cpp
+++ b/backends/platform/android/jni.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope 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.
diff --git a/backends/platform/android/jni.h b/backends/platform/android/jni.h
index 52698e0f35..326869b1ee 100644
--- a/backends/platform/android/jni.h
+++ b/backends/platform/android/jni.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope 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.
diff --git a/backends/platform/android/org/scummvm/scummvm/ScummVM.java b/backends/platform/android/org/scummvm/scummvm/ScummVM.java
index 3a25b54eeb..5047502e61 100644
--- a/backends/platform/android/org/scummvm/scummvm/ScummVM.java
+++ b/backends/platform/android/org/scummvm/scummvm/ScummVM.java
@@ -86,13 +86,15 @@ public abstract class ScummVM implements SurfaceHolder.Callback, Runnable {
Log.d(LOG_TAG, String.format("surfaceChanged: %dx%d (%d)",
width, height, format));
+ // store values for the native code
+ // make sure to do it before notifying the lock
+ // as it leads to a race condition otherwise
+ setSurface(width, height);
+
synchronized(_sem_surface) {
_surface_holder = holder;
_sem_surface.notifyAll();
}
-
- // store values for the native code
- setSurface(width, height);
}
// SurfaceHolder callback
diff --git a/backends/platform/android/org/scummvm/scummvm/ScummVMActivity.java b/backends/platform/android/org/scummvm/scummvm/ScummVMActivity.java
index 5d041dafd2..5964d5bfde 100644
--- a/backends/platform/android/org/scummvm/scummvm/ScummVMActivity.java
+++ b/backends/platform/android/org/scummvm/scummvm/ScummVMActivity.java
@@ -4,6 +4,7 @@ import android.app.Activity;
import android.app.AlertDialog;
import android.content.DialogInterface;
import android.media.AudioManager;
+import android.os.Build;
import android.os.Bundle;
import android.os.Environment;
import android.util.DisplayMetrics;
@@ -169,7 +170,14 @@ public class ScummVMActivity extends Activity {
_mouseHelper.attach(main_surface);
}
- _events = new ScummVMEvents(this, _scummvm, _mouseHelper);
+ if (Build.VERSION.SDK_INT < Build.VERSION_CODES.HONEYCOMB_MR1)
+ {
+ _events = new ScummVMEvents(this, _scummvm, _mouseHelper);
+ }
+ else
+ {
+ _events = new ScummVMEventsHoneycomb(this, _scummvm, _mouseHelper);
+ }
main_surface.setOnKeyListener(_events);
main_surface.setOnTouchListener(_events);
diff --git a/backends/platform/android/org/scummvm/scummvm/ScummVMEvents.java b/backends/platform/android/org/scummvm/scummvm/ScummVMEvents.java
index 702215341b..32c65d3395 100644
--- a/backends/platform/android/org/scummvm/scummvm/ScummVMEvents.java
+++ b/backends/platform/android/org/scummvm/scummvm/ScummVMEvents.java
@@ -68,15 +68,7 @@ public class ScummVMEvents implements
return true;
}
- public boolean onGenericMotionEvent(final MotionEvent e) {
- if((e.getSource() & InputDevice.SOURCE_CLASS_JOYSTICK) != 0) {
- _scummvm.pushEvent(JE_JOYSTICK, e.getAction(),
- (int)(e.getAxisValue(MotionEvent.AXIS_X)*100),
- (int)(e.getAxisValue(MotionEvent.AXIS_Y)*100),
- 0, 0);
- return true;
- }
-
+ public boolean onGenericMotionEvent(MotionEvent e) {
return false;
}
diff --git a/backends/platform/android/org/scummvm/scummvm/ScummVMEventsHoneycomb.java b/backends/platform/android/org/scummvm/scummvm/ScummVMEventsHoneycomb.java
new file mode 100644
index 0000000000..ab85429040
--- /dev/null
+++ b/backends/platform/android/org/scummvm/scummvm/ScummVMEventsHoneycomb.java
@@ -0,0 +1,25 @@
+package org.scummvm.scummvm;
+
+import android.content.Context;
+import android.view.MotionEvent;
+import android.view.InputDevice;
+
+public class ScummVMEventsHoneycomb extends ScummVMEvents {
+
+ public ScummVMEventsHoneycomb(Context context, ScummVM scummvm, MouseHelper mouseHelper) {
+ super(context, scummvm, mouseHelper);
+ }
+
+ @Override
+ public boolean onGenericMotionEvent(MotionEvent e) {
+ if((e.getSource() & InputDevice.SOURCE_CLASS_JOYSTICK) != 0) {
+ _scummvm.pushEvent(JE_JOYSTICK, e.getAction(),
+ (int)(e.getAxisValue(MotionEvent.AXIS_X)*100),
+ (int)(e.getAxisValue(MotionEvent.AXIS_Y)*100),
+ 0, 0);
+ return true;
+ }
+
+ return false;
+ }
+}
diff --git a/backends/platform/android/texture.cpp b/backends/platform/android/texture.cpp
index cc41c0d8a6..165396b82b 100644
--- a/backends/platform/android/texture.cpp
+++ b/backends/platform/android/texture.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope 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.
@@ -259,11 +259,15 @@ void GLESTexture::fillBuffer(uint32 color) {
assert(_surface.getPixels());
if (_pixelFormat.bytesPerPixel == 1 ||
- ((color & 0xff) == ((color >> 8) & 0xff)))
+ (_pixelFormat.bytesPerPixel == 2 &&
+ ((color & 0xff) == ((color >> 8) & 0xff))))
memset(_pixels, color & 0xff, _surface.pitch * _surface.h);
- else
- Common::fill(_pixels, _pixels + _surface.pitch * _surface.h,
+ else if (_pixelFormat.bytesPerPixel == 2)
+ Common::fill((uint16 *)_pixels, (uint16 *)(_pixels + _surface.pitch * _surface.h),
(uint16)color);
+ else
+ Common::fill((uint32 *)_pixels, (uint32 *)(_pixels + _surface.pitch * _surface.h),
+ color);
setDirty();
}
@@ -334,6 +338,13 @@ GLES565Texture::GLES565Texture() :
GLES565Texture::~GLES565Texture() {
}
+GLES8888Texture::GLES8888Texture() :
+ GLESTexture(GL_RGBA, GL_UNSIGNED_BYTE, pixelFormat()) {
+}
+
+GLES8888Texture::~GLES8888Texture() {
+}
+
GLESFakePaletteTexture::GLESFakePaletteTexture(GLenum glFormat, GLenum glType,
Graphics::PixelFormat pixelFormat) :
GLESBaseTexture(glFormat, glType, pixelFormat),
diff --git a/backends/platform/android/texture.h b/backends/platform/android/texture.h
index 4307b5a1bc..4b05dfd5d4 100644
--- a/backends/platform/android/texture.h
+++ b/backends/platform/android/texture.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -224,6 +224,18 @@ public:
}
};
+// RGBA8888 texture
+class GLES8888Texture : public GLESTexture {
+public:
+ GLES8888Texture();
+ virtual ~GLES8888Texture();
+
+ static inline Graphics::PixelFormat pixelFormat() {
+ // We assume LE since all Android platforms are LE.
+ return Graphics::PixelFormat(4, 8, 8, 8, 8, 0, 8, 16, 24);
+ }
+};
+
class GLESFakePaletteTexture : public GLESBaseTexture {
protected:
GLESFakePaletteTexture(GLenum glFormat, GLenum glType,
diff --git a/backends/platform/dc/DCLauncherDialog.h b/backends/platform/dc/DCLauncherDialog.h
index 519524222f..5131482cb6 100644
--- a/backends/platform/dc/DCLauncherDialog.h
+++ b/backends/platform/dc/DCLauncherDialog.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/backends/platform/dc/audio.cpp b/backends/platform/dc/audio.cpp
index 4f01531486..4759ddb799 100644
--- a/backends/platform/dc/audio.cpp
+++ b/backends/platform/dc/audio.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/backends/platform/dc/dc-fs.cpp b/backends/platform/dc/dc-fs.cpp
index 36f5a1465c..77fe4143dd 100644
--- a/backends/platform/dc/dc-fs.cpp
+++ b/backends/platform/dc/dc-fs.cpp
@@ -17,6 +17,7 @@
* You should have received a copy of the GNU General Public 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_ALLOW_ALL
@@ -27,7 +28,9 @@
#include <ronin/cdfs.h>
#include <stdio.h>
+#define usleep usleep_unistd
#include <unistd.h>
+#undef usleep
/**
* Implementation of the ScummVM file system API based on Ronin.
diff --git a/backends/platform/dc/dc.h b/backends/platform/dc/dc.h
index d62ced02e1..d8ab549c3a 100644
--- a/backends/platform/dc/dc.h
+++ b/backends/platform/dc/dc.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -43,7 +43,9 @@ class Interactive
public:
virtual int key(int k, byte &shiftFlags) = 0;
virtual void mouse(int x, int y) = 0;
+ virtual ~Interactive() = 0;
};
+inline Interactive::~Interactive() { }
#include "softkbd.h"
diff --git a/backends/platform/dc/dcloader.cpp b/backends/platform/dc/dcloader.cpp
index 56193c282a..bc5e3a733b 100644
--- a/backends/platform/dc/dcloader.cpp
+++ b/backends/platform/dc/dcloader.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/backends/platform/dc/dcloader.h b/backends/platform/dc/dcloader.h
index 1782467acd..074ae7aa29 100644
--- a/backends/platform/dc/dcloader.h
+++ b/backends/platform/dc/dcloader.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/backends/platform/dc/dcmain.cpp b/backends/platform/dc/dcmain.cpp
index bec1fdae3a..eede796991 100644
--- a/backends/platform/dc/dcmain.cpp
+++ b/backends/platform/dc/dcmain.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -79,13 +79,14 @@ static bool find_track(int track, int &first_sec, int &last_sec)
if (first < 1 || last > 99 || first > last)
return false;
for (i=first; i<=last; i++)
- if (!(TOC_CTRL(toc->entry[i-1])&4))
+ if (!(TOC_CTRL(toc->entry[i-1])&4)) {
if (track==1) {
first_sec = TOC_LBA(toc->entry[i-1]);
last_sec = TOC_LBA(toc->entry[i]);
return true;
} else
--track;
+ }
return false;
}
@@ -281,7 +282,7 @@ namespace DC_Flash {
if((r = syscall_read_flash(info[0] + (bmb++ << 6), bm, 64))<0)
return r;
}
- if(!(bm[(b>>3)&63] & (0x80>>(b&7))))
+ if(!(bm[(b>>3)&63] & (0x80>>(b&7)))) {
if((r = syscall_read_flash(info[0] + ((b+1) << 6), buf, 64))<0)
return r;
else if((s=*(unsigned short *)(buf+0)) == sec &&
@@ -289,6 +290,7 @@ namespace DC_Flash {
memcpy(dst+(s-sec)*60, buf+2, 60);
got=1;
}
+ }
}
return got;
}
diff --git a/backends/platform/dc/display.cpp b/backends/platform/dc/display.cpp
index 54ee6000ed..1785c3c416 100644
--- a/backends/platform/dc/display.cpp
+++ b/backends/platform/dc/display.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/backends/platform/dc/icon.cpp b/backends/platform/dc/icon.cpp
index cf7afc82e0..ba621883a9 100644
--- a/backends/platform/dc/icon.cpp
+++ b/backends/platform/dc/icon.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -47,8 +47,8 @@ void Icon::create_vmicon(void *buffer)
void Icon::create_texture()
{
- static char tt[16] = { 0, 1, 4, 5, 16, 17, 20, 21,
- 64, 65, 68, 69, 80, 81, 84, 85 };
+ static unsigned char tt[16] = { 0, 1, 4, 5, 16, 17, 20, 21,
+ 64, 65, 68, 69, 80, 81, 84, 85 };
unsigned short *tex = (unsigned short *)ta_txalloc(512);
unsigned short *linebase;
unsigned char *src = bitmap+sizeof(bitmap)-17;
diff --git a/backends/platform/dc/icon.h b/backends/platform/dc/icon.h
index e412e67a84..253455fe30 100644
--- a/backends/platform/dc/icon.h
+++ b/backends/platform/dc/icon.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/backends/platform/dc/input.cpp b/backends/platform/dc/input.cpp
index 7b21c76efa..a69bb3b78f 100644
--- a/backends/platform/dc/input.cpp
+++ b/backends/platform/dc/input.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -50,10 +50,10 @@ int handleInput(struct mapledev *pad, int &mouse_x, int &mouse_y,
else if (!(buttons & 512)) newkey = ' ';
else if (!(buttons & 1024)) newkey = numpadmap[(buttons>>4)&15];
- if (!(buttons & 128)) if (inter) newkey = 1001; else mouse_x++;
- if (!(buttons & 64)) if (inter) newkey = 1002; else mouse_x--;
- if (!(buttons & 32)) if (inter) newkey = 1003; else mouse_y++;
- if (!(buttons & 16)) if (inter) newkey = 1004; else mouse_y--;
+ if (!(buttons & 128)) { if (inter) newkey = 1001; else mouse_x++; }
+ if (!(buttons & 64)) { if (inter) newkey = 1002; else mouse_x--; }
+ if (!(buttons & 32)) { if (inter) newkey = 1003; else mouse_y++; }
+ if (!(buttons & 16)) { if (inter) newkey = 1004; else mouse_y--; }
mouse_x += ((int)pad->cond.controller.joyx-128)>>4;
mouse_y += ((int)pad->cond.controller.joyy-128)>>4;
@@ -157,7 +157,7 @@ int handleInput(struct mapledev *pad, int &mouse_x, int &mouse_y,
return -Common::EVENT_RBUTTONUP;
}
- if (mouse_wheel != lastwheel)
+ if (mouse_wheel != lastwheel) {
if (((int8)(mouse_wheel - lastwheel)) > 0) {
lastwheel++;
return -Common::EVENT_WHEELDOWN;
@@ -165,6 +165,7 @@ int handleInput(struct mapledev *pad, int &mouse_x, int &mouse_y,
--lastwheel;
return -Common::EVENT_WHEELUP;
}
+ }
if (newkey && inter && newkey != lastkey) {
int transkey = inter->key(newkey, shiftFlags);
diff --git a/backends/platform/dc/ip.txt.in b/backends/platform/dc/ip.txt.in
index 23424e0950..539d29dd1e 100644
--- a/backends/platform/dc/ip.txt.in
+++ b/backends/platform/dc/ip.txt.in
@@ -7,5 +7,5 @@ Product No : T0000
Version : @VERSION@
Release Date : @DATE@
Boot Filename : SCUMMVM.BIN
-SW Maker Name : The ScummVM team
+SW Maker Name : The ScummVM Team
Game Title : ScummVM
diff --git a/backends/platform/dc/label.cpp b/backends/platform/dc/label.cpp
index 5db031958f..46bff0db11 100644
--- a/backends/platform/dc/label.cpp
+++ b/backends/platform/dc/label.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/backends/platform/dc/label.h b/backends/platform/dc/label.h
index 6b96175d29..2a7e7b35ea 100644
--- a/backends/platform/dc/label.h
+++ b/backends/platform/dc/label.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/backends/platform/dc/plugins.cpp b/backends/platform/dc/plugins.cpp
index 2942a4f155..93689157f3 100644
--- a/backends/platform/dc/plugins.cpp
+++ b/backends/platform/dc/plugins.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/backends/platform/dc/portdefs.h b/backends/platform/dc/portdefs.h
index 1f5c8f566a..191bbea09c 100644
--- a/backends/platform/dc/portdefs.h
+++ b/backends/platform/dc/portdefs.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/backends/platform/dc/selector.cpp b/backends/platform/dc/selector.cpp
index 4026c7dde6..6717ca494b 100644
--- a/backends/platform/dc/selector.cpp
+++ b/backends/platform/dc/selector.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/backends/platform/dc/softkbd.cpp b/backends/platform/dc/softkbd.cpp
index 076f826d1c..19f7b409a1 100644
--- a/backends/platform/dc/softkbd.cpp
+++ b/backends/platform/dc/softkbd.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/backends/platform/dc/softkbd.h b/backends/platform/dc/softkbd.h
index 8f87d12baa..c7c4357a44 100644
--- a/backends/platform/dc/softkbd.h
+++ b/backends/platform/dc/softkbd.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -40,6 +40,7 @@ class SoftKeyboard : public Interactive
public:
SoftKeyboard(const OSystem_Dreamcast *os);
+ virtual ~SoftKeyboard() {}
void draw(float x, float y, int transp = 0);
int key(int k, byte &shiftFlags);
diff --git a/backends/platform/dc/time.cpp b/backends/platform/dc/time.cpp
index 1e5f44ec85..ada53bf755 100644
--- a/backends/platform/dc/time.cpp
+++ b/backends/platform/dc/time.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/backends/platform/dc/vmsave.cpp b/backends/platform/dc/vmsave.cpp
index ba3b787942..5f5cdff24f 100644
--- a/backends/platform/dc/vmsave.cpp
+++ b/backends/platform/dc/vmsave.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/backends/platform/dingux/dingux.cpp b/backends/platform/dingux/dingux.cpp
index 674c2ea780..2f11dd31ad 100644
--- a/backends/platform/dingux/dingux.cpp
+++ b/backends/platform/dingux/dingux.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/backends/platform/dingux/dingux.h b/backends/platform/dingux/dingux.h
index 2a07a8a46a..add74fa039 100644
--- a/backends/platform/dingux/dingux.h
+++ b/backends/platform/dingux/dingux.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/backends/platform/dingux/main.cpp b/backends/platform/dingux/main.cpp
index 4fc67d874f..98b5058c06 100644
--- a/backends/platform/dingux/main.cpp
+++ b/backends/platform/dingux/main.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/backends/platform/ds/arm7/source/main.cpp b/backends/platform/ds/arm7/source/main.cpp
index 6e714b22fa..c4a22b8f68 100644
--- a/backends/platform/ds/arm7/source/main.cpp
+++ b/backends/platform/ds/arm7/source/main.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/backends/platform/ds/arm9/source/blitters.cpp b/backends/platform/ds/arm9/source/blitters.cpp
index ef2dc9c3b8..44de0ed0f6 100644
--- a/backends/platform/ds/arm9/source/blitters.cpp
+++ b/backends/platform/ds/arm9/source/blitters.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/backends/platform/ds/arm9/source/blitters.h b/backends/platform/ds/arm9/source/blitters.h
index de6e218778..602cde4755 100644
--- a/backends/platform/ds/arm9/source/blitters.h
+++ b/backends/platform/ds/arm9/source/blitters.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/backends/platform/ds/arm9/source/cdaudio.cpp b/backends/platform/ds/arm9/source/cdaudio.cpp
index 277e1f4ae7..c963f4d8bd 100644
--- a/backends/platform/ds/arm9/source/cdaudio.cpp
+++ b/backends/platform/ds/arm9/source/cdaudio.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/backends/platform/ds/arm9/source/cdaudio.h b/backends/platform/ds/arm9/source/cdaudio.h
index 8a0e0c5174..77766bae8e 100644
--- a/backends/platform/ds/arm9/source/cdaudio.h
+++ b/backends/platform/ds/arm9/source/cdaudio.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/backends/platform/ds/arm9/source/dsmain.cpp b/backends/platform/ds/arm9/source/dsmain.cpp
index 9dc66e80d7..b7c9c108a6 100644
--- a/backends/platform/ds/arm9/source/dsmain.cpp
+++ b/backends/platform/ds/arm9/source/dsmain.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/backends/platform/ds/arm9/source/dsmain.h b/backends/platform/ds/arm9/source/dsmain.h
index 5e91fae13a..fec97d878e 100644
--- a/backends/platform/ds/arm9/source/dsmain.h
+++ b/backends/platform/ds/arm9/source/dsmain.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/backends/platform/ds/arm9/source/dsoptions.cpp b/backends/platform/ds/arm9/source/dsoptions.cpp
index ac552bd826..733592e958 100644
--- a/backends/platform/ds/arm9/source/dsoptions.cpp
+++ b/backends/platform/ds/arm9/source/dsoptions.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/backends/platform/ds/arm9/source/dsoptions.h b/backends/platform/ds/arm9/source/dsoptions.h
index 9949b8b7d2..35e30a87d5 100644
--- a/backends/platform/ds/arm9/source/dsoptions.h
+++ b/backends/platform/ds/arm9/source/dsoptions.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/backends/platform/ds/arm9/source/gbampsave.cpp b/backends/platform/ds/arm9/source/gbampsave.cpp
index 3192e2d277..ef6091e2a2 100644
--- a/backends/platform/ds/arm9/source/gbampsave.cpp
+++ b/backends/platform/ds/arm9/source/gbampsave.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/backends/platform/ds/arm9/source/gbampsave.h b/backends/platform/ds/arm9/source/gbampsave.h
index 0d9d9aca8c..d86db2ec70 100644
--- a/backends/platform/ds/arm9/source/gbampsave.h
+++ b/backends/platform/ds/arm9/source/gbampsave.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/backends/platform/ds/arm9/source/keys.h b/backends/platform/ds/arm9/source/keys.h
index 9d6b41c746..d118b37f28 100644
--- a/backends/platform/ds/arm9/source/keys.h
+++ b/backends/platform/ds/arm9/source/keys.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/backends/platform/ds/arm9/source/osystem_ds.cpp b/backends/platform/ds/arm9/source/osystem_ds.cpp
index f109983fbc..c53f57523d 100644
--- a/backends/platform/ds/arm9/source/osystem_ds.cpp
+++ b/backends/platform/ds/arm9/source/osystem_ds.cpp
@@ -16,7 +16,8 @@
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
*/
diff --git a/backends/platform/ds/arm9/source/osystem_ds.h b/backends/platform/ds/arm9/source/osystem_ds.h
index 4550e22b2c..f4dbac66f7 100644
--- a/backends/platform/ds/arm9/source/osystem_ds.h
+++ b/backends/platform/ds/arm9/source/osystem_ds.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/backends/platform/ds/arm9/source/portdefs.h b/backends/platform/ds/arm9/source/portdefs.h
index e40849a513..0a20c459ab 100644
--- a/backends/platform/ds/arm9/source/portdefs.h
+++ b/backends/platform/ds/arm9/source/portdefs.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/backends/platform/ds/arm9/source/scummhelp.cpp b/backends/platform/ds/arm9/source/scummhelp.cpp
index a3fdaacfaa..a0fb9bd0ab 100644
--- a/backends/platform/ds/arm9/source/scummhelp.cpp
+++ b/backends/platform/ds/arm9/source/scummhelp.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/backends/platform/ds/arm9/source/scummhelp.h b/backends/platform/ds/arm9/source/scummhelp.h
index 41fc8f9c91..4e8d709c4f 100644
--- a/backends/platform/ds/arm9/source/scummhelp.h
+++ b/backends/platform/ds/arm9/source/scummhelp.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/backends/platform/ds/arm9/source/touchkeyboard.cpp b/backends/platform/ds/arm9/source/touchkeyboard.cpp
index 77da9cc22a..30c46dbf06 100644
--- a/backends/platform/ds/arm9/source/touchkeyboard.cpp
+++ b/backends/platform/ds/arm9/source/touchkeyboard.cpp
@@ -16,9 +16,10 @@
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*
*/
+
#include <nds.h>
#include "NDS/scummvm_ipc.h"
#include "touchkeyboard.h"
diff --git a/backends/platform/ds/arm9/source/touchkeyboard.h b/backends/platform/ds/arm9/source/touchkeyboard.h
index dc20601023..f64d531b82 100644
--- a/backends/platform/ds/arm9/source/touchkeyboard.h
+++ b/backends/platform/ds/arm9/source/touchkeyboard.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/backends/platform/ds/arm9/source/wordcompletion.cpp b/backends/platform/ds/arm9/source/wordcompletion.cpp
index 51f93df7ff..36fa31247c 100644
--- a/backends/platform/ds/arm9/source/wordcompletion.cpp
+++ b/backends/platform/ds/arm9/source/wordcompletion.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/backends/platform/ds/arm9/source/wordcompletion.h b/backends/platform/ds/arm9/source/wordcompletion.h
index c355d29293..d6e7224186 100644
--- a/backends/platform/ds/arm9/source/wordcompletion.h
+++ b/backends/platform/ds/arm9/source/wordcompletion.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/backends/platform/ds/arm9/source/zipreader.cpp b/backends/platform/ds/arm9/source/zipreader.cpp
index 49552a86b2..0de2b0c981 100644
--- a/backends/platform/ds/arm9/source/zipreader.cpp
+++ b/backends/platform/ds/arm9/source/zipreader.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/backends/platform/ds/arm9/source/zipreader.h b/backends/platform/ds/arm9/source/zipreader.h
index 70f000eb4b..0078919d5f 100644
--- a/backends/platform/ds/arm9/source/zipreader.h
+++ b/backends/platform/ds/arm9/source/zipreader.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/backends/platform/ds/commoninclude/NDS/scummvm_ipc.h b/backends/platform/ds/commoninclude/NDS/scummvm_ipc.h
index 360b7b03dc..540348ca0b 100644
--- a/backends/platform/ds/commoninclude/NDS/scummvm_ipc.h
+++ b/backends/platform/ds/commoninclude/NDS/scummvm_ipc.h
@@ -17,6 +17,7 @@
* You should have received a copy of the GNU General Public 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 SCUMMVM_IPC_INCLUDE
diff --git a/backends/platform/gph/gph-backend.cpp b/backends/platform/gph/gph-backend.cpp
index 485780b472..d033191d54 100644
--- a/backends/platform/gph/gph-backend.cpp
+++ b/backends/platform/gph/gph-backend.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -172,7 +172,7 @@ void OSystem_GPH::initSDL() {
// Check if SDL has not been initialized
if (!_initedSDL) {
- uint32 sdlFlags = SDL_INIT_EVENTTHREAD;
+ uint32 sdlFlags = SDL_INIT_EVENTTHREAD | SDL_INIT_VIDEO;
if (ConfMan.hasKey("disable_sdl_parachute"))
sdlFlags |= SDL_INIT_NOPARACHUTE;
diff --git a/backends/platform/gph/gph-hw.cpp b/backends/platform/gph/gph-hw.cpp
index cde50dc6b4..7b004f1739 100644
--- a/backends/platform/gph/gph-hw.cpp
+++ b/backends/platform/gph/gph-hw.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/backends/platform/gph/gph-hw.h b/backends/platform/gph/gph-hw.h
index f9584ca37e..c6d0094cf1 100644
--- a/backends/platform/gph/gph-hw.h
+++ b/backends/platform/gph/gph-hw.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/backends/platform/gph/gph-main.cpp b/backends/platform/gph/gph-main.cpp
index 876de0f358..5fce37179e 100644
--- a/backends/platform/gph/gph-main.cpp
+++ b/backends/platform/gph/gph-main.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/backends/platform/gph/gph.h b/backends/platform/gph/gph.h
index 90a798154f..d7004f1582 100644
--- a/backends/platform/gph/gph.h
+++ b/backends/platform/gph/gph.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/backends/platform/iphone/iphone_common.h b/backends/platform/iphone/iphone_common.h
index 9c45a240cb..59dca84b85 100644
--- a/backends/platform/iphone/iphone_common.h
+++ b/backends/platform/iphone/iphone_common.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/backends/platform/iphone/iphone_keyboard.h b/backends/platform/iphone/iphone_keyboard.h
index 2d1238c92f..d54df9ac96 100644
--- a/backends/platform/iphone/iphone_keyboard.h
+++ b/backends/platform/iphone/iphone_keyboard.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/backends/platform/iphone/iphone_keyboard.mm b/backends/platform/iphone/iphone_keyboard.mm
index b00930ab31..39d68aff81 100644
--- a/backends/platform/iphone/iphone_keyboard.mm
+++ b/backends/platform/iphone/iphone_keyboard.mm
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -39,7 +39,7 @@
@implementation TextInputHandler
-- (id)initWithKeyboard:(SoftKeyboard *)keyboard; {
+- (id)initWithKeyboard:(SoftKeyboard *)keyboard {
self = [super initWithFrame:CGRectMake(0.0f, 0.0f, 0.0f, 0.0f)];
softKeyboard = keyboard;
diff --git a/backends/platform/iphone/iphone_main.mm b/backends/platform/iphone/iphone_main.mm
index e76ffe866e..3707f10a29 100644
--- a/backends/platform/iphone/iphone_main.mm
+++ b/backends/platform/iphone/iphone_main.mm
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/backends/platform/iphone/iphone_video.h b/backends/platform/iphone/iphone_video.h
index 6b8c25ebcf..7dbf3c57ab 100644
--- a/backends/platform/iphone/iphone_video.h
+++ b/backends/platform/iphone/iphone_video.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -70,6 +70,7 @@
GLfloat _mouseScaleX, _mouseScaleY;
int _scaledShakeOffsetY;
+ CGFloat _contentScaleFactor;
UITouch *_firstTouch;
UITouch *_secondTouch;
diff --git a/backends/platform/iphone/iphone_video.mm b/backends/platform/iphone/iphone_video.mm
index f2c1527658..5048b57328 100644
--- a/backends/platform/iphone/iphone_video.mm
+++ b/backends/platform/iphone/iphone_video.mm
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -161,9 +161,23 @@ const char *iPhone_getDocumentsDir() {
- (id)initWithFrame:(struct CGRect)frame {
self = [super initWithFrame: frame];
+ _contentScaleFactor = 1;
if ([[UIScreen mainScreen] respondsToSelector:@selector(scale)]) {
if ([self respondsToSelector:@selector(setContentScaleFactor:)]) {
- [self setContentScaleFactor:[[UIScreen mainScreen] scale]];
+ // Horrible and crazy method to get the proper return value of
+ // scale when the SDK used for building does not know anything
+ // about the selector scale...
+ NSMethodSignature *scaleSignature = [UIScreen instanceMethodSignatureForSelector:@selector(scale)];
+ NSInvocation *scaleInvocation = [NSInvocation invocationWithMethodSignature:scaleSignature];
+ [scaleInvocation setTarget:[UIScreen mainScreen]];
+ [scaleInvocation setSelector:@selector(scale)];
+ [scaleInvocation invoke];
+
+ NSInteger returnLength = [[scaleInvocation methodSignature] methodReturnLength];
+ if (returnLength == sizeof(CGFloat)) {
+ [scaleInvocation getReturnValue:&_contentScaleFactor];
+ [self setContentScaleFactor:_contentScaleFactor];
+ }
}
}
@@ -613,6 +627,11 @@ const char *iPhone_getDocumentsDir() {
}
- (bool)getMouseCoords:(CGPoint)point eventX:(int *)x eventY:(int *)y {
+ // We scale the input according to our scale factor to get actual screen
+ // cooridnates.
+ point.x *= _contentScaleFactor;
+ point.y *= _contentScaleFactor;
+
if (![self convertToRotatedCoords:point result:&point])
return false;
diff --git a/backends/platform/iphone/osys_events.cpp b/backends/platform/iphone/osys_events.cpp
index 9cfca0836e..95ca25a2d2 100644
--- a/backends/platform/iphone/osys_events.cpp
+++ b/backends/platform/iphone/osys_events.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/backends/platform/iphone/osys_main.cpp b/backends/platform/iphone/osys_main.cpp
index a814495b80..0ce21b44c1 100644
--- a/backends/platform/iphone/osys_main.cpp
+++ b/backends/platform/iphone/osys_main.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/backends/platform/iphone/osys_main.h b/backends/platform/iphone/osys_main.h
index 811a8ddb2e..0159eee1be 100644
--- a/backends/platform/iphone/osys_main.h
+++ b/backends/platform/iphone/osys_main.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/backends/platform/iphone/osys_sound.cpp b/backends/platform/iphone/osys_sound.cpp
index 405543e380..bfee06c6f2 100644
--- a/backends/platform/iphone/osys_sound.cpp
+++ b/backends/platform/iphone/osys_sound.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/backends/platform/iphone/osys_video.mm b/backends/platform/iphone/osys_video.mm
index ce7f94f5bd..c76f432dda 100644
--- a/backends/platform/iphone/osys_video.mm
+++ b/backends/platform/iphone/osys_video.mm
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/backends/platform/linuxmoto/hardwarekeys.cpp b/backends/platform/linuxmoto/hardwarekeys.cpp
index e1a5757430..70e55c86c0 100644
--- a/backends/platform/linuxmoto/hardwarekeys.cpp
+++ b/backends/platform/linuxmoto/hardwarekeys.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/backends/platform/linuxmoto/linuxmoto-main.cpp b/backends/platform/linuxmoto/linuxmoto-main.cpp
index 835ccb03ef..507be9fa95 100644
--- a/backends/platform/linuxmoto/linuxmoto-main.cpp
+++ b/backends/platform/linuxmoto/linuxmoto-main.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/backends/platform/linuxmoto/linuxmoto-sdl.cpp b/backends/platform/linuxmoto/linuxmoto-sdl.cpp
index 844bd19a83..a0310079de 100644
--- a/backends/platform/linuxmoto/linuxmoto-sdl.cpp
+++ b/backends/platform/linuxmoto/linuxmoto-sdl.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/backends/platform/linuxmoto/linuxmoto-sdl.h b/backends/platform/linuxmoto/linuxmoto-sdl.h
index 27f4e744bc..b0bf7b4df7 100644
--- a/backends/platform/linuxmoto/linuxmoto-sdl.h
+++ b/backends/platform/linuxmoto/linuxmoto-sdl.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/backends/platform/maemo/maemo-common.h b/backends/platform/maemo/maemo-common.h
index 0442b9c0ae..6d3c64402a 100644
--- a/backends/platform/maemo/maemo-common.h
+++ b/backends/platform/maemo/maemo-common.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/backends/platform/maemo/maemo.cpp b/backends/platform/maemo/maemo.cpp
index 6bd229177b..e81a208f7b 100644
--- a/backends/platform/maemo/maemo.cpp
+++ b/backends/platform/maemo/maemo.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/backends/platform/maemo/maemo.h b/backends/platform/maemo/maemo.h
index 43bc262ade..532a2de08c 100644
--- a/backends/platform/maemo/maemo.h
+++ b/backends/platform/maemo/maemo.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/backends/platform/maemo/main.cpp b/backends/platform/maemo/main.cpp
index 7e8a316eb5..4735ae30ed 100644
--- a/backends/platform/maemo/main.cpp
+++ b/backends/platform/maemo/main.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/backends/platform/n64/framfs_save_manager.cpp b/backends/platform/n64/framfs_save_manager.cpp
index 78f5333f2e..de645223e9 100644
--- a/backends/platform/n64/framfs_save_manager.cpp
+++ b/backends/platform/n64/framfs_save_manager.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/backends/platform/n64/framfs_save_manager.h b/backends/platform/n64/framfs_save_manager.h
index 0a88c8666b..a066854aab 100644
--- a/backends/platform/n64/framfs_save_manager.h
+++ b/backends/platform/n64/framfs_save_manager.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/backends/platform/n64/nintendo64.cpp b/backends/platform/n64/nintendo64.cpp
index bc416157e6..a3e8c016f4 100644
--- a/backends/platform/n64/nintendo64.cpp
+++ b/backends/platform/n64/nintendo64.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/backends/platform/n64/osys_n64.h b/backends/platform/n64/osys_n64.h
index 10138b230a..ad49c2981f 100644
--- a/backends/platform/n64/osys_n64.h
+++ b/backends/platform/n64/osys_n64.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/backends/platform/n64/osys_n64_base.cpp b/backends/platform/n64/osys_n64_base.cpp
index 36e5085764..16eeae5b7e 100644
--- a/backends/platform/n64/osys_n64_base.cpp
+++ b/backends/platform/n64/osys_n64_base.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/backends/platform/n64/osys_n64_events.cpp b/backends/platform/n64/osys_n64_events.cpp
index c83eb194ac..2aa228cab0 100644
--- a/backends/platform/n64/osys_n64_events.cpp
+++ b/backends/platform/n64/osys_n64_events.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/backends/platform/n64/osys_n64_utilities.cpp b/backends/platform/n64/osys_n64_utilities.cpp
index f007a1bd25..b3b6d50667 100644
--- a/backends/platform/n64/osys_n64_utilities.cpp
+++ b/backends/platform/n64/osys_n64_utilities.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/backends/platform/n64/pakfs_save_manager.cpp b/backends/platform/n64/pakfs_save_manager.cpp
index bf2fe8b1bc..5a83dab9d8 100644
--- a/backends/platform/n64/pakfs_save_manager.cpp
+++ b/backends/platform/n64/pakfs_save_manager.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/backends/platform/n64/pakfs_save_manager.h b/backends/platform/n64/pakfs_save_manager.h
index 6e67fb0f5f..ec66c80b73 100644
--- a/backends/platform/n64/pakfs_save_manager.h
+++ b/backends/platform/n64/pakfs_save_manager.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/backends/platform/n64/portdefs.h b/backends/platform/n64/portdefs.h
index 10f5ed6488..63ec989a8d 100644
--- a/backends/platform/n64/portdefs.h
+++ b/backends/platform/n64/portdefs.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/backends/platform/null/null.cpp b/backends/platform/null/null.cpp
index 9e05539799..a5eea06f7a 100644
--- a/backends/platform/null/null.cpp
+++ b/backends/platform/null/null.cpp
@@ -8,24 +8,35 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*
*/
+// We use some stdio.h functionality here thus we need to allow some
+// symbols. Alternatively, we could simply allow everything by defining
+// FORBIDDEN_SYMBOL_ALLOW_ALL
+#define FORBIDDEN_SYMBOL_EXCEPTION_FILE
+#define FORBIDDEN_SYMBOL_EXCEPTION_stdout
+#define FORBIDDEN_SYMBOL_EXCEPTION_stderr
+#define FORBIDDEN_SYMBOL_EXCEPTION_fputs
+
#include "backends/modular-backend.h"
#include "base/main.h"
#if defined(USE_NULL_DRIVER)
#include "backends/saves/default/default-saves.h"
#include "backends/timer/default/default-timer.h"
+#include "backends/events/default/default-events.h"
+#include "backends/mutex/null/null-mutex.h"
+#include "backends/graphics/null/null-graphics.h"
#include "audio/mixer_intern.h"
#include "common/scummsys.h"
@@ -40,13 +51,14 @@
#include "backends/fs/windows/windows-fs-factory.h"
#endif
-class OSystem_NULL : public ModularBackend {
+class OSystem_NULL : public ModularBackend, Common::EventSource {
public:
OSystem_NULL();
virtual ~OSystem_NULL();
virtual void initBackend();
+ virtual Common::EventSource *getDefaultEventSource() { return this; }
virtual bool pollEvent(Common::Event &event);
virtual uint32 getMillis(bool skipRecord = false);
@@ -92,7 +104,7 @@ bool OSystem_NULL::pollEvent(Common::Event &event) {
return false;
}
-uint32 OSystem_NULL::getMillis() {
+uint32 OSystem_NULL::getMillis(bool skipRecord) {
return 0;
}
diff --git a/backends/platform/openpandora/op-backend.cpp b/backends/platform/openpandora/op-backend.cpp
index 354aa24b24..abe288f5d7 100644
--- a/backends/platform/openpandora/op-backend.cpp
+++ b/backends/platform/openpandora/op-backend.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -160,7 +160,7 @@ void OSystem_OP::initSDL() {
// Check if SDL has not been initialized
if (!_initedSDL) {
- uint32 sdlFlags = SDL_INIT_EVENTTHREAD;
+ uint32 sdlFlags = SDL_INIT_EVENTTHREAD | SDL_INIT_VIDEO;
if (ConfMan.hasKey("disable_sdl_parachute"))
sdlFlags |= SDL_INIT_NOPARACHUTE;
diff --git a/backends/platform/openpandora/op-main.cpp b/backends/platform/openpandora/op-main.cpp
index ebe018f570..99026b89f6 100644
--- a/backends/platform/openpandora/op-main.cpp
+++ b/backends/platform/openpandora/op-main.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/backends/platform/openpandora/op-options.cpp b/backends/platform/openpandora/op-options.cpp
index 005a76b76c..d2e7860962 100644
--- a/backends/platform/openpandora/op-options.cpp
+++ b/backends/platform/openpandora/op-options.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/backends/platform/openpandora/op-options.h b/backends/platform/openpandora/op-options.h
index 919d217f4b..8eae420af2 100644
--- a/backends/platform/openpandora/op-options.h
+++ b/backends/platform/openpandora/op-options.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/backends/platform/openpandora/op-sdl.h b/backends/platform/openpandora/op-sdl.h
index 1eddad5c4a..dd239e58f8 100644
--- a/backends/platform/openpandora/op-sdl.h
+++ b/backends/platform/openpandora/op-sdl.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/backends/platform/ps2/DmaPipe.cpp b/backends/platform/ps2/DmaPipe.cpp
index a346a67566..a4bcf6299e 100644
--- a/backends/platform/ps2/DmaPipe.cpp
+++ b/backends/platform/ps2/DmaPipe.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -50,7 +50,7 @@ DmaPipe::DmaPipe(uint32 size) {
size &= ~0x1F;
_buf = (uint64 *)memalign(64, size);
_curPipe = 0;
- _pipes[0] = new SinglePipe(_buf, size >> 4);
+ _pipes[0] = new SinglePipe(_buf, size >> 4);
_pipes[1] = new SinglePipe(_buf + (size >> 4), size >> 4);
// reset DMAC Channel 2
@@ -80,7 +80,7 @@ void DmaPipe::uploadTex(uint32 dest, uint16 bufWidth, uint16 destOfsX, uint16 de
*(_pipes[_curPipe]->_chainHead) |= (1 << 28);
_pipes[_curPipe]->setGifLoopTag(4);
_pipes[_curPipe]->setReg(GPR_BITBLTBUF, GS_SET_DEST_BLTBUF((dest/256) & 0x3fff, (bufWidth/64) & 0x3f, pixelFmt & 0x3f));
- _pipes[_curPipe]->setReg( GPR_TRXPOS, GS_SET_DEST_TRXPOS(destOfsX, destOfsY));
+ _pipes[_curPipe]->setReg( GPR_TRXPOS, GS_SET_DEST_TRXPOS(destOfsX, destOfsY));
_pipes[_curPipe]->setReg( GPR_TRXREG, GS_SET_TRXREG(width, height));
_pipes[_curPipe]->setReg( GPR_TRXDIR, 0);
@@ -194,7 +194,7 @@ void DmaPipe::setConfig(uint8 prModeCont, uint8 dither, uint8 colClamp) {
// set some defaults
// alpha blending formula: (A-B) * C + D
- // set: A = dest pixel, b = 0, C = source alpha, D = source pixel, fix = don't care
+ // set: A = dest pixel, b = 0, C = source alpha, D = source pixel, fix = don't care
_pipes[_curPipe]->setReg(GPR_ALPHA_1, GS_SET_ALPHA(DEST_COLOR, ZERO_COLOR, SOURCE_ALPHA, SOURCE_COLOR, 0));
_pipes[_curPipe]->setReg( GPR_PRIM, 0);
@@ -279,7 +279,7 @@ void SinglePipe::appendChain(uint64 dmaTag) {
void SinglePipe::setReg(uint64 reg, uint64 value) {
*_bufPos++ = value;
*_bufPos++ = reg;
- (*_chainSize)++;
+ (*_chainSize)++;
}
void SinglePipe::setListReg(uint64 value1, uint64 value2) {
diff --git a/backends/platform/ps2/DmaPipe.h b/backends/platform/ps2/DmaPipe.h
index c99da1c395..ad5993923e 100644
--- a/backends/platform/ps2/DmaPipe.h
+++ b/backends/platform/ps2/DmaPipe.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/backends/platform/ps2/Gs2dScreen.cpp b/backends/platform/ps2/Gs2dScreen.cpp
index 58667c0230..a4ec23329a 100644
--- a/backends/platform/ps2/Gs2dScreen.cpp
+++ b/backends/platform/ps2/Gs2dScreen.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -32,6 +32,7 @@
#include "DmaPipe.h"
#include "GsDefs.h"
#include "graphics/surface.h"
+#include "graphics/colormasks.h"
#include "backends/platform/ps2/ps2debug.h"
extern void *_gp;
@@ -43,12 +44,49 @@ enum Buffers {
PRINTF
};
+/*
+ Supported modes:
+
+ Mode #1 = SDTV progressive (NTSC: 224p / PAL: 256p)
+ Mode #2 = SDTV interlaced (NTSC: 448i / PAL: 512i) <- default
+ Mode #3 = EDTV progressive (NTSC: 480p / PAL: 576p)
+ Mode #4 = HDTV progressive (720p)
+ Mode #5 = HDTV interlaced (1080i)
+ Mode #6 = VESA (640x480@60)
+ Mode #7 = VESA (800x600@60)
+ Mode #8 = VESA (1024x768@60)
+*/
+
+static ps2_mode_t ps2_mode[] = {
+
+ // -> w, h, interlaced, pitch, mode, vck, magh, magv, dx, dy
+
+ /* #1 : SDTV - progressive */
+ { 640, 224, 0, 640, 0x02, 2560, 4, 0, 160 /*158*/, 25 /*22*/ }, /* NTSC */
+ { 640, 256, 0, 640, 0x03, 2560, 4, 0, 170 /*163*/, 35 /*36*/ }, /* PAL */
+
+ /* #2 : SDTV - interlaced */
+ { 640, 448, 1, 640, 0x02, 2560, 4, 0, 156 /*158*/, 50 /*45*/ }, /* NTSC */
+ { 640, 512, 1, 640, 0x03, 2560, 4, 0, 170 /*163*/, 70 /*72*/ }, /* PAL */
+
+ /* #3 : EDTV */
+ { 720, 480, 0, 768, 0x50, 1440, 2, 0, 58, 35 }, /* NTSC */
+ /* { 720, 576, 0, 768, 0x53, 1440, 2, 0, 62, 45 }, */ /* PAL : full */
+ /* { 656, 576, 0, 704, 0x53, 1312, 2, 0, 62, 45 }, */ /* PAL : redux @ (0,0) */
+ { 656, 576, 0, 704, 0x53, 1312, 2, 0, 78 /*314*/, 45 }, /* PAL : redux @ center'd */
+
+ /* #4/#5 : HDTV */
+ { 1280, 720, 0, 1280, 0x52, 1280, 1, 0, 76 /*302*/, 24 },
+ { 1920, 1080, 1, 1920, 0x51, 1920, 1, 0, 60 /*236*/ /*238*/, 40 },
+
+ /* #6/#7/#8 : VESA 4:3 @ 60Hz */
+ { 640, 480, 0, 640, 0x1A, 1280, 2, 0, 70 /*276*/, 34 },
+ { 800, 600, 0, 832, 0x2B, 1600, 2, 0, 105 /*420*/, 26 },
+ { 1024, 768, 0, 1024, 0x3B, 2048, 2, 0, 144 /*580*/, 34 }
+};
+
#define ANIM_STACK_SIZE (1024 * 32)
-#define DEFAULT_PAL_X 175
-#define DEFAULT_PAL_Y 72 // 60
-#define DEFAULT_NTSC_X 165
-#define DEFAULT_NTSC_Y 45
#define ORG_X 256
#define ORG_Y 256
#define ORIGIN_X (ORG_X << 4)
@@ -77,7 +115,7 @@ void runAnimThread(Gs2dScreen *param);
int vblankStartHandler(int cause) {
// start of VBlank period
- if (g_VblankCmd) { // is there a new image waiting?
+ if (g_VblankCmd) { // is there a new image waiting?
GS_DISPFB1 = g_VblankCmd; // show it.
g_VblankCmd = 0;
iSignalSema(g_VblankSema);
@@ -87,8 +125,8 @@ int vblankStartHandler(int cause) {
int dmacHandler(int channel) {
if (g_DmacCmd && (channel == 2)) { // GS DMA transfer finished,
- g_VblankCmd = g_DmacCmd; // we want to show the image
- g_DmacCmd = 0; // when the next vblank occurs
+ g_VblankCmd = g_DmacCmd; // we want to show the image
+ g_DmacCmd = 0; // when the next vblank occurs
iSignalSema(g_DmacSema);
}
return 0;
@@ -102,7 +140,8 @@ int vblankEndHandler(int cause) {
void createAnimThread(Gs2dScreen *screen);
-Gs2dScreen::Gs2dScreen(uint16 width, uint16 height, TVMode mode) {
+Gs2dScreen::Gs2dScreen(uint16 width, uint16 height) {
+
_systemQuit = false;
ee_sema_t newSema;
newSema.init_count = 1;
@@ -125,12 +164,15 @@ Gs2dScreen::Gs2dScreen(uint16 width, uint16 height, TVMode mode) {
EnableIntc(INT_VBLANK_END);
EnableDmac(2);
+ _tvMode = 0; // force detection
+ _gfxMode = 0;
+
_width = width;
_height = height;
_pitch = (width + 127) & ~127;
_screenBuf = (uint8 *)memalign(64, _width * _height);
- _overlayBuf = (uint16 *)memalign(64, _width * _height * 2);
+ _overlayBuf = (uint16 *)memalign(64, _pitch * _height * 2);
_clut = (uint32 *)memalign(64, 256 * 4);
memset(_screenBuf, 0, _width * _height);
@@ -138,32 +180,102 @@ Gs2dScreen::Gs2dScreen(uint16 width, uint16 height, TVMode mode) {
_clut[1] = GS_RGBA(0xC0, 0xC0, 0xC0, 0);
clearOverlay();
- if (mode == TV_DONT_CARE) {
-#if 1
char romver[8];
+ uint16 biosver;
int fd = fioOpen("rom0:ROMVER", O_RDONLY);
fioRead(fd, &romver, 8);
fioClose(fd);
+ biosver=atoi(romver);
+ printf("ROMVER = %s\n", romver);
+ printf("ver = %d\n", atoi(romver));
+
+ if (!_tvMode) { // determine TV standard first
+ if (ConfMan.hasKey("tv_mode", "PlayStation2")) {
+ const char *tvname = ConfMan.get("tv_mode", "PlayStation2").c_str();
+
+ if (strcmp("ntsc", tvname) == 0) {
+ _tvMode = 2;
+ }
+ else if (strcmp("pal", tvname) == 0) {
+ _tvMode = 1;
+ }
+ else
+ _tvMode = 0;
+ }
+
+ if (!_tvMode) {
+ if (romver[4] == 'E')
+ _tvMode = TV_PAL;
+ else
+ _tvMode = TV_NTSC;
+
+ printf("Auto-detect TV mode: PSX:%c PS2:%c\n", *(char *)(0x1FC7FF52), romver[4]);
+ }
+ }
- if (romver[4] == 'E')
- _tvMode = TV_PAL;
- else
- _tvMode = TV_NTSC;
-#else
- if (PAL_NTSC_FLAG == 'E')
- _tvMode = TV_PAL;
+ uint8 mode;
+ if (!_gfxMode) { // determine GFX mode next
+ if (ConfMan.hasKey("gfx_mode", "PlayStation2")) {
+ _gfxMode = ConfMan.getInt("gfx_mode", "PlayStation2");
+ // TODO: free more video mem to support these modes
+ if (_gfxMode == 4 || _gfxMode == 5) {
+ printf("Not enough video mem: using EDTV (3)\n");
+ _gfxMode = 3;
+ }
+ else
+ if (_gfxMode == 7 || _gfxMode == 8) {
+ printf("Not enough video mem: using VGA (6)\n");
+ _gfxMode = 6;
+ }
+
+ if (_gfxMode < 1 || _gfxMode > 8) _gfxMode = 2;
+ else
+ if (_gfxMode == 4 || _gfxMode == 5) _tvMode = TV_HDTV;
+ else
+ if (_gfxMode > 5) _tvMode = TV_VESA;
+ }
else
- _tvMode = TV_NTSC;
-#endif
- } else
- _tvMode = mode;
+ _gfxMode = 2;
+ }
+
+ // Remap Mode Index
+ mode = _gfxMode;
+ if (_tvMode == TV_NTSC) {
+ mode = (mode * 2) - 1;
+ }
+ else if (_tvMode == TV_PAL) {
+ mode = (mode * 2);
+ }
+ else if (_tvMode == TV_HDTV) {
+ mode += 3;
+ }
+ else /* VESA */ {
+ _tvMode = TV_VESA;
+ mode += 3;
+ }
+ mode--;
+
+ switch (_tvMode) {
+ case TV_NTSC:
+ printf("Setting up TV mode: NTSC\n");
+ break;
+ case TV_PAL:
+ printf("Setting up TV mode: PAL\n");
+ break;
+ case TV_HDTV:
+ printf("Setting up TV mode: HDTV\n");
+ break;
+ case TV_VESA:
+ printf("Setting up TV mode: VESA\n");
+ break;
+ }
+
+ _tvWidth = ps2_mode[mode].w;
+ _tvHeight = ps2_mode[mode].h;
+ _tvPitch = ps2_mode[mode].pitch;
- // _tvMode = TV_NTSC;
- printf("Setting up %s mode\n", (_tvMode == TV_PAL) ? "PAL" : "NTSC");
+ printf("Setting up GFX mode: %d x %d\n", _tvWidth, _tvHeight);
- // set screen size, 640x512 for pal, 640x448 for ntsc
- _tvWidth = 640;
- _tvHeight = ((_tvMode == TV_PAL) ? 512 /*544*/ : 448);
kFullScreen[0].z = kFullScreen[1].z = 0;
kFullScreen[0].x = ORIGIN_X;
kFullScreen[0].y = ORIGIN_Y;
@@ -176,7 +288,7 @@ Gs2dScreen::Gs2dScreen(uint16 width, uint16 height, TVMode mode) {
_texCoords[1].u = SCALE(_width);
_texCoords[1].v = SCALE(_height);
- uint32 tvFrameSize = _tvWidth * _tvHeight * 4; // 32 bits per pixel
+ uint32 tvFrameSize = _tvPitch * _tvHeight * 4; // 32 bits per pixel
// setup frame buffer pointers
_frameBufPtr[0] = 0;
@@ -186,7 +298,7 @@ Gs2dScreen::Gs2dScreen(uint16 width, uint16 height, TVMode mode) {
_clutPtrs[TEXT] = _clutPtrs[SCREEN] + 0x2000;
_texPtrs[SCREEN] = _clutPtrs[SCREEN] + 0x3000;
_texPtrs[TEXT] = 0; // these buffers are stored in the alpha gaps of the frame buffers
- _texPtrs[MOUSE] = 128 * 256 * 4;
+ _texPtrs[MOUSE] = 128 * 256 * 4;
_texPtrs[PRINTF] = _texPtrs[MOUSE] + M_SIZE * M_SIZE * 4;
_showOverlay = false;
@@ -202,12 +314,12 @@ Gs2dScreen::Gs2dScreen(uint16 width, uint16 height, TVMode mode) {
_overlayFormat.rLoss = 3;
_overlayFormat.gLoss = 3;
_overlayFormat.bLoss = 3;
- _overlayFormat.aLoss = 7;
+ _overlayFormat.aLoss = 8; // 7
_overlayFormat.rShift = 0;
_overlayFormat.gShift = 5;
_overlayFormat.bShift = 10;
- _overlayFormat.aShift = 15;
+ _overlayFormat.aShift = 0; // 15
// setup hardware now.
GS_CSR = CSR_RESET; // Reset GS
@@ -215,22 +327,39 @@ Gs2dScreen::Gs2dScreen(uint16 width, uint16 height, TVMode mode) {
GS_CSR = 0;
GsPutIMR(0x7F00);
- uint16 dispPosX, dispPosY;
- if (_tvMode == TV_PAL) {
- SetGsCrt(GS_INTERLACED, 3, 0);
- dispPosX = DEFAULT_PAL_X;
- dispPosY = DEFAULT_PAL_Y;
- } else {
- SetGsCrt(GS_INTERLACED, 2, 0);
- dispPosX = DEFAULT_NTSC_X;
- dispPosY = DEFAULT_NTSC_Y;
+ if (biosver < 220 && ps2_mode[mode].mode == 0x53) { // EDTV PAL : mode not in BIOS < 2.20
+ // no worries... we work in magic ;-)
+ /* 720x576p */
+ asm ("di");
+ asm ("sync.l; sync.p");
+ GS_PMODE = 0;
+ asm ("sync.l; sync.p");
+ GS_SMODE1 = 0x1742890504;
+ asm ("sync.l; sync.p");
+ GS_SMODE2 = 0;
+ GS_SYNCH1 = 0x402E02003C827;
+ asm ("sync.l; sync.p");
+ GS_SYNCH2 = 0x19CA67;
+ asm ("sync.l; sync.p");
+ GS_SYNCV = 0xA9000002700005;
+ asm ("sync.l; sync.p");
+ GS_SRFSH = 4;
+ asm ("sync.l; sync.p");
+ GS_SMODE1 = 0x1742880504;
+ asm ("sync.l; sync.p");
+ asm ("sync.l; sync.p");
+ GS_SMODE2 = 0;
+ asm("ei");
+ }
+ else { // BIOS
+ SetGsCrt(ps2_mode[mode].interlaced, ps2_mode[mode].mode, 0); // ps2_mode[mode].interlaced);
}
asm("di");
GS_PMODE = GS_SET_PMODE(1, 0, 1, 1, 0, 255);
GS_BGCOLOUR = GS_RGBA(0, 0, 0, 0);
- GS_DISPLAY1 = GS_SET_DISPLAY(_tvWidth, _tvHeight, dispPosX, dispPosY);
+ GS_DISPLAY1 = GS_SET_DISPLAY_MODE(ps2_mode[mode]);
asm("ei");
_curDrawBuf = 0;
@@ -238,7 +367,7 @@ Gs2dScreen::Gs2dScreen(uint16 width, uint16 height, TVMode mode) {
_dmaPipe->setOrigin(ORIGIN_X, ORIGIN_Y);
_dmaPipe->setConfig(1, 0, 1);
_dmaPipe->setScissorRect(0, 0, _tvWidth - 1, _tvHeight - 1);
- _dmaPipe->setDrawBuffer(_frameBufPtr[_curDrawBuf], _tvWidth, GS_PSMCT24, 0);
+ _dmaPipe->setDrawBuffer(_frameBufPtr[_curDrawBuf], _tvPitch, GS_PSMCT24, 0);
_dmaPipe->flush();
_clutChanged = _screenChanged = _overlayChanged = true;
@@ -249,24 +378,33 @@ Gs2dScreen::Gs2dScreen(uint16 width, uint16 height, TVMode mode) {
createAnimTextures();
// create animation thread
- ee_thread_t animationThread, thisThread;
+ #ifdef __NEW_PS2SDK__
+ ee_thread_t animThread;
+ ee_thread_status_t thisThread;
+ #else
+ ee_thread_t animThread, thisThread;
+ #endif
ReferThreadStatus(GetThreadId(), &thisThread);
- _animStack = malloc(ANIM_STACK_SIZE);
- animationThread.initial_priority = thisThread.current_priority - 3;
- animationThread.stack = _animStack;
- animationThread.stack_size = ANIM_STACK_SIZE;
- animationThread.func = (void *)runAnimThread;
- animationThread.gp_reg = &_gp;
+ _animStack = memalign(64, ANIM_STACK_SIZE);
+ animThread.initial_priority = thisThread.current_priority - 3;
+ animThread.stack = _animStack;
+ animThread.stack_size = ANIM_STACK_SIZE;
+ animThread.func = (void *)runAnimThread;
+ animThread.gp_reg = &_gp;
- _animTid = CreateThread(&animationThread);
+ _animTid = CreateThread(&animThread);
assert(_animTid >= 0);
StartThread(_animTid, this);
}
void Gs2dScreen::quit(void) {
_systemQuit = true;
+ #ifdef __NEW_PS2SDK__
+ ee_thread_status_t statAnim;
+ #else
ee_thread_t statAnim;
+ #endif
do { // wait until thread called ExitThread()
SignalSema(g_AnimSema);
ReferThreadStatus(_animTid, &statAnim);
@@ -296,15 +434,15 @@ void Gs2dScreen::createAnimTextures(void) {
for (int i = 0; i < 16; i++) {
uint32 *destPos = (uint32 *)buf;
for (int ch = 15; ch >= 0; ch--) {
- const uint32 *src = (const uint32*)(_binaryData + ((_binaryPattern[i] >> ch) & 1) * 4 * 14);
+ const uint32 *src = (const uint32 *)(_binaryData + ((_binaryPattern[i] >> ch) & 1) * 4 * 14);
for (int line = 0; line < 14; line++)
destPos[line << 4] = src[line];
destPos++;
}
if (!(i & 1))
- _dmaPipe->uploadTex( vramDest, 128, 0, 0, GS_PSMT4HH, buf, 128, 16);
+ _dmaPipe->uploadTex( vramDest, 128, 0, 0, GS_PSMT4HH, buf, 128, 16);
else {
- _dmaPipe->uploadTex( vramDest, 128, 0, 0, GS_PSMT4HL, buf, 128, 16);
+ _dmaPipe->uploadTex( vramDest, 128, 0, 0, GS_PSMT4HL, buf, 128, 16);
vramDest += 128 * 16 * 4;
}
_dmaPipe->flush();
@@ -506,10 +644,10 @@ void Gs2dScreen::updateScreen(void) {
WaitSema(g_DmacSema); // wait for dma transfer, if there's one running
WaitSema(g_VblankSema); // wait if there's already an image waiting for vblank
- g_DmacCmd = GS_SET_DISPFB(_frameBufPtr[_curDrawBuf], _tvWidth, GS_PSMCT24); // put it here for dmac/vblank handler
+ g_DmacCmd = GS_SET_DISPFB(_frameBufPtr[_curDrawBuf], _tvPitch, GS_PSMCT24); // put it here for dmac/vblank handler
_dmaPipe->flush();
_curDrawBuf ^= 1;
- _dmaPipe->setDrawBuffer(_frameBufPtr[_curDrawBuf], _tvWidth, GS_PSMCT24, 0);
+ _dmaPipe->setDrawBuffer(_frameBufPtr[_curDrawBuf], _tvPitch, GS_PSMCT24, 0);
} else
_dmaPipe->flush();
SignalSema(_screenSema);
@@ -527,6 +665,7 @@ void Gs2dScreen::hideOverlay(void) {
Graphics::PixelFormat Gs2dScreen::getOverlayFormat(void) {
return _overlayFormat;
+ // return Graphics::createPixelFormat<1555>();
}
int16 Gs2dScreen::getOverlayWidth(void) {
@@ -633,11 +772,11 @@ void Gs2dScreen::setMouseXy(int16 x, int16 y) {
_mouseX = x;
_mouseY = y;
}
-
+/*
uint8 Gs2dScreen::tvMode(void) {
return _tvMode;
}
-
+*/
uint16 Gs2dScreen::getWidth(void) {
return _width;
}
@@ -655,7 +794,7 @@ void Gs2dScreen::wantAnim(bool runIt) {
#define V 1000
#define Z_TRANSL 65
-void Gs2dScreen::animThread(void) {
+void Gs2dScreen::playAnim(void) {
// animate zeros and ones while game accesses memory card, etc.
g_RunAnim = false;
float yPos = 0.0;
@@ -750,10 +889,10 @@ void Gs2dScreen::animThread(void) {
drawY += LINE_SPACE;
}
- g_DmacCmd = GS_SET_DISPFB(_frameBufPtr[_curDrawBuf], _tvWidth, GS_PSMCT24); // put it here for dmac/vblank handler
+ g_DmacCmd = GS_SET_DISPFB(_frameBufPtr[_curDrawBuf], _tvPitch, GS_PSMCT24); // put it here for dmac/vblank handler
_dmaPipe->flush();
_curDrawBuf ^= 1;
- _dmaPipe->setDrawBuffer(_frameBufPtr[_curDrawBuf], _tvWidth, GS_PSMCT24, 0);
+ _dmaPipe->setDrawBuffer(_frameBufPtr[_curDrawBuf], _tvPitch, GS_PSMCT24, 0);
_dmaPipe->setAlphaBlend(DEST_COLOR, ZERO_COLOR, SOURCE_ALPHA, SOURCE_COLOR, 0);
SignalSema(_screenSema);
@@ -763,7 +902,7 @@ void Gs2dScreen::animThread(void) {
}
void runAnimThread(Gs2dScreen *param) {
- param->animThread();
+ param->playAnim();
}
// data for the animated zeros and ones...
diff --git a/backends/platform/ps2/Gs2dScreen.h b/backends/platform/ps2/Gs2dScreen.h
index 1a70dad170..ea2b1e5f78 100644
--- a/backends/platform/ps2/Gs2dScreen.h
+++ b/backends/platform/ps2/Gs2dScreen.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -25,6 +25,7 @@
#include "sysdefs.h"
#include "backends/base-backend.h"
+#include "common/config-manager.h"
#include "backends/platform/ps2/DmaPipe.h"
#include "graphics/surface.h"
@@ -32,7 +33,9 @@
enum TVMode {
TV_DONT_CARE = 0,
TV_PAL,
- TV_NTSC
+ TV_NTSC,
+ TV_HDTV, /* internal */
+ TV_VESA /* internal */
};
enum GsInterlace {
@@ -42,14 +45,14 @@ enum GsInterlace {
class Gs2dScreen {
public:
- Gs2dScreen(uint16 width, uint16 height, TVMode mode);
+ Gs2dScreen(uint16 width, uint16 height);
~Gs2dScreen(void);
void newScreenSize(uint16 width, uint16 height);
- uint8 tvMode(void);
+ // uint8 tvMode(void);
uint16 getWidth(void);
uint16 getHeight(void);
- void copyPrintfOverlay(const uint8* buf);
+ void copyPrintfOverlay(const uint8 *buf);
void clearPrintfOverlay(void);
Graphics::Surface *lockScreen();
@@ -75,7 +78,7 @@ public:
void setMouseXy(int16 x, int16 y);
void setShakePos(int shake);
- void animThread(void);
+ void playAnim(void);
void wantAnim(bool runIt);
void quit(void);
@@ -85,8 +88,10 @@ private:
void createAnimTextures(void);
DmaPipe *_dmaPipe;
+ uint8 _gfxMode;
uint8 _tvMode;
uint16 _tvWidth, _tvHeight;
+ uint16 _tvPitch;
GsVertex _blitCoords[2];
TexVertex _texCoords[2];
diff --git a/backends/platform/ps2/GsDefs.h b/backends/platform/ps2/GsDefs.h
index fab0c40b35..9adf6acfcc 100644
--- a/backends/platform/ps2/GsDefs.h
+++ b/backends/platform/ps2/GsDefs.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -27,16 +27,23 @@
// Gs2dScreen defines:
-#define PAL_NTSC_FLAG (*(volatile uint8*)0x1FC7FF52)
+#define PAL_NTSC_FLAG (*(volatile uint8 *)0x1FC7FF52)
-#define GS_PMODE *((volatile uint64*)0x12000000)
-#define GS_CSR *((volatile uint64*)0x12001000)
-#define GS_DISPFB1 *((volatile uint64*)0x12000070)
-#define GS_DISPLAY1 *((volatile uint64*)0x12000080)
-#define GS_BGCOLOUR *((volatile uint64*)0x120000E0)
+#define GS_PMODE *((volatile uint64 *)0x12000000)
+#define GS_CSR *((volatile uint64 *)0x12001000)
+#define GS_DISPFB1 *((volatile uint64 *)0x12000070)
+#define GS_DISPLAY1 *((volatile uint64 *)0x12000080)
+#define GS_BGCOLOUR *((volatile uint64 *)0x120000E0)
+
+#define GS_SMODE1 *((volatile uint64 *)0x12000010)
+#define GS_SMODE2 *((volatile uint64 *)0x12000020)
+#define GS_SYNCH1 *((volatile uint64 *)0x12000040)
+#define GS_SYNCH2 *((volatile uint64 *)0x12000050)
+#define GS_SYNCV *((volatile uint64 *)0x12000060)
+#define GS_SRFSH *((volatile uint64 *)0x12000030)
enum GS_CSR_FIELDS {
- CSR_SIGNAL = 1 << 0,
+ CSR_SIGNAL = 1 << 0,
CSR_FINISH = 1 << 1,
CSR_HSYNC = 1 << 2,
CSR_VSYNC = 1 << 3,
@@ -44,6 +51,19 @@ enum GS_CSR_FIELDS {
CSR_RESET = 1 << 9
};
+typedef struct {
+ u16 w;
+ u16 h;
+ u16 interlaced;
+ u16 pitch;
+ u16 mode;
+ u16 vclk;
+ u16 magh;
+ u16 magv;
+ u16 dx;
+ u16 dy;
+} ps2_mode_t;
+
#define GS_SET_PMODE(readC1, readC2, alphaSel, alphaOut, alphaBlend, alphaFixed) \
((readC1) | ((readC2) << 1) | ((alphaSel) << 5) | ((alphaOut) << 6) | ((alphaBlend) << 7) | ((alphaFixed) << 8))
@@ -52,6 +72,10 @@ enum GS_CSR_FIELDS {
((((2560 + (width - 1)) / width) - 1)<<23) | \
(ypos << 12) | (xpos * (2560 / width)))
+#define GS_SET_DISPLAY_MODE(mode) \
+ (((uint64)(mode.h - 1) << 44) | ((uint64)(mode.vclk - 1) << 32) | \
+ ((mode.magh - 1) << 23) | (mode.dy << 12) | (mode.dx << 2))
+
#define GS_SET_DISPFB(frameBufPtr, frameBufWidth, psm) \
(((frameBufPtr) / 8192) | (((frameBufWidth) / 64) << 9) | ((psm) << 15))
@@ -61,63 +85,63 @@ enum GS_CSR_FIELDS {
//DmaPipe defines:
enum GsRegs {
- GPR_PRIM = 0x00, // Select and configure current drawing primitive
- GPR_RGBAQ, // Setup current vertex color
- GPR_ST, // ...
- GPR_UV, // Specify Vertex Texture Coordinates
- GPR_XYZF2, // Set vertex coordinate
- GPR_XYZ2, // Set vertex coordinate and 'kick' drawing
- GPR_TEX0_1, // Texture Buffer Setup (Context 1)
- GPR_TEX0_2, // Texture Buffer Setup (Context 2)
- GPR_CLAMP_1, // ...
- GPR_CLAMP_2, // ...
- GPR_FOG, // ...
-
- GPR_XYZF3 = 0x0C, // ...
- GPR_XYZ3, // ...
-
- GPR_TEX1_1 = 0x14, // ...
- GPR_TEX1_2, // ...
- GPR_TEX2_1, // ...
- GPR_TEX2_2, // ...
- GPR_XYOFFSET_1, // Mapping from Primitive to Window coordinate system (Context 1)
- GPR_XYOFFSET_2, // Mapping from Primitive to Window coordinate system (Context 2)
- GPR_PRMODECONT, // ...
- GPR_PRMODE, // ...
- GPR_TEXCLUT, // ...
-
- GPR_SCANMSK = 0x22, // ...
-
- GPR_MIPTBP1_1 = 0x34, // ...
- GPR_MIPTBP1_2, // ...
- GPR_MIPTBP2_1, // ...
- GPR_MIPTBP2_2, // ...
-
- GPR_TEXA = 0x3b, // ...
-
- GPR_FOGCOL = 0x3d, // ...
-
- GPR_TEXFLUSH = 0x3f,// Write to this register before using newly loaded texture
- GPR_SCISSOR_1, // Setup clipping rectangle (Context 1)
- GPR_SCISSOR_2, // Setup clipping rectangle (Context 2)
- GPR_ALPHA_1, // Setup Alpha Blending Parameters (Context 1)
- GPR_ALPHA_2, // Setup Alpha Blending Parameters (Context 2)
- GPR_DIMX, // ...
- GPR_DTHE, // ...
- GPR_COLCLAMP, // ...
- GPR_TEST_1, // ...
- GPR_TEST_2, // ...
- GPR_PABE, // ...
- GPR_FBA_1, // ...
- GPR_FBA_2, // ...
- GPR_FRAME_1, // Frame buffer settings (Context 1)
- GPR_FRAME_2, // Frame buffer settings (Context 2)
- GPR_ZBUF_1, // ...
- GPR_ZBUF_2, // ...
- GPR_BITBLTBUF, // Setup Image Transfer Between EE and GS
- GPR_TRXPOS, // Setup Image Transfer Coordinates
- GPR_TRXREG, // Setup Image Transfer Size
- GPR_TRXDIR, // Set Image Transfer Directon + Start Transfer
+ GPR_PRIM = 0x00, // Select and configure current drawing primitive
+ GPR_RGBAQ, // Setup current vertex color
+ GPR_ST, // ...
+ GPR_UV, // Specify Vertex Texture Coordinates
+ GPR_XYZF2, // Set vertex coordinate
+ GPR_XYZ2, // Set vertex coordinate and 'kick' drawing
+ GPR_TEX0_1, // Texture Buffer Setup (Context 1)
+ GPR_TEX0_2, // Texture Buffer Setup (Context 2)
+ GPR_CLAMP_1, // ...
+ GPR_CLAMP_2, // ...
+ GPR_FOG, // ...
+
+ GPR_XYZF3 = 0x0C, // ...
+ GPR_XYZ3, // ...
+
+ GPR_TEX1_1 = 0x14, // ...
+ GPR_TEX1_2, // ...
+ GPR_TEX2_1, // ...
+ GPR_TEX2_2, // ...
+ GPR_XYOFFSET_1, // Mapping from Primitive to Window coordinate system (Context 1)
+ GPR_XYOFFSET_2, // Mapping from Primitive to Window coordinate system (Context 2)
+ GPR_PRMODECONT, // ...
+ GPR_PRMODE, // ...
+ GPR_TEXCLUT, // ...
+
+ GPR_SCANMSK = 0x22, // ...
+
+ GPR_MIPTBP1_1 = 0x34, // ...
+ GPR_MIPTBP1_2, // ...
+ GPR_MIPTBP2_1, // ...
+ GPR_MIPTBP2_2, // ...
+
+ GPR_TEXA = 0x3b, // ...
+
+ GPR_FOGCOL = 0x3d, // ...
+
+ GPR_TEXFLUSH = 0x3f, // Write to this register before using newly loaded texture
+ GPR_SCISSOR_1, // Setup clipping rectangle (Context 1)
+ GPR_SCISSOR_2, // Setup clipping rectangle (Context 2)
+ GPR_ALPHA_1, // Setup Alpha Blending Parameters (Context 1)
+ GPR_ALPHA_2, // Setup Alpha Blending Parameters (Context 2)
+ GPR_DIMX, // ...
+ GPR_DTHE, // ...
+ GPR_COLCLAMP, // ...
+ GPR_TEST_1, // ...
+ GPR_TEST_2, // ...
+ GPR_PABE, // ...
+ GPR_FBA_1, // ...
+ GPR_FBA_2, // ...
+ GPR_FRAME_1, // Frame buffer settings (Context 1)
+ GPR_FRAME_2, // Frame buffer settings (Context 2)
+ GPR_ZBUF_1, // ...
+ GPR_ZBUF_2, // ...
+ GPR_BITBLTBUF, // Setup Image Transfer Between EE and GS
+ GPR_TRXPOS, // Setup Image Transfer Coordinates
+ GPR_TRXREG, // Setup Image Transfer Size
+ GPR_TRXDIR, // Set Image Transfer Directon + Start Transfer
GPR_HWREG,
GPR_SIGNAL = 0x60,
@@ -135,15 +159,15 @@ enum PrimTypes {
PR_SPRITE
};
-#define GS_PSMCT32 0x00
-#define GS_PSMCT24 0x01
-#define GS_PSMCT16 0x02
-#define GS_PSMCT16S 0x0A
-#define GS_PSMT8 0x13
-#define GS_PSMT4 0x14
-#define GS_PSMT4HL 0x24
-#define GS_PSMT4HH 0x2C
-#define GS_PSMT8H 0x1B
+#define GS_PSMCT32 0x00
+#define GS_PSMCT24 0x01
+#define GS_PSMCT16 0x02
+#define GS_PSMCT16S 0x0A
+#define GS_PSMT8 0x13
+#define GS_PSMT4 0x14
+#define GS_PSMT4HL 0x24
+#define GS_PSMT4HH 0x2C
+#define GS_PSMT8H 0x1B
/*#define GS_SET_BITBLTBUF(sbp, sbw, spsm, dbp, dbw, dpsm) \
((uint64)(sbp) | ((uint64)(sbw) << 16) | \
@@ -210,7 +234,7 @@ enum AlphaBlendColor {
enum AlphaBlendAlpha {
SOURCE_ALPHA = 0,
DEST_ALPHA,
- FIXED_ALPHA
+ FIXED_ALPHA
};
#define GS_SET_ALPHA(a, b, c, d, fix) \
diff --git a/backends/platform/ps2/Makefile.gdb b/backends/platform/ps2/Makefile.gdb
deleted file mode 100644
index 8ca47cd9f1..0000000000
--- a/backends/platform/ps2/Makefile.gdb
+++ /dev/null
@@ -1,104 +0,0 @@
-# $Header: Exp $
- include $(PS2SDK)/Defs.make
-
-PS2_EXTRA = /works/devel/ps2/sdk-extra
-PS2_EXTRA_INCS = /zlib/include /libmad/ee/include /SjPcm/ee/src /tremor
-PS2_EXTRA_LIBS = /zlib/lib /libmad/ee/lib /SjPcm/ee/lib /tremor/tremor
-
-ENABLED=STATIC_PLUGIN
-
-ENABLE_SCUMM = $(ENABLED)
-ENABLE_SCUMM_7_8 = $(ENABLED)
-# ENABLE_HE = $(ENABLED)
-# ENABLE_AGI = $(ENABLED)
-# ENABLE_AGOS = $(ENABLED)
-# ENABLE_AGOS2 = $(ENABLED)
-# ENABLE_CINE = $(ENABLED)
-# ENABLE_CRUISE = $(ENABLED)
-# ENABLE_DRACI = $(ENABLED)
-# ENABLE_DRASCULA = $(ENABLED)
-# ENABLE_GOB = $(ENABLED)
-# ENABLE_GROOVIE = $(ENABLED)
-## ENABLE_GROOVIE2 = $(ENABLED)
-# ENABLE_HUGO = $(ENABLED)
-# ENABLE_IHNM = $(ENABLED)
-# ENABLE_KYRA = $(ENABLED)
-## ENABLE_LOL = $(ENABLED)
-# ENABLE_LURE = $(ENABLED)
-## ENABLE_M4 = $(ENABLED)
-# ENABLE_MADE = $(ENABLED)
-# ENABLE_MOHAWK = $(ENABLED)
-# ENABLE_PARALLACTION = $(ENABLED)
-# ENABLE_QUEEN = $(ENABLED)
-# ENABLE_SAGA = $(ENABLED)
-# ENABLE_SAGA2 = $(ENABLED)
-# ENABLE_SCI = $(ENABLED)
-## ENABLE_SCI32 = $(ENABLED)
-# ENABLE_SKY = $(ENABLED)
-# ENABLE_SWORD1 = $(ENABLED)
-# ENABLE_SWORD2 = $(ENABLED)
-# ENABLE_TEENAGENT = $(ENABLED)
-# ENABLE_TINSEL = $(ENABLED)
-# ENABLE_TOON = $(ENABLED)
-# ENABLE_TOUCHE = $(ENABLED)
-# ENABLE_TUCKER = $(ENABLED)
-
-
-HAVE_GCC3 = true
-
-CC = ee-gcc
-CXX = ee-g++
-AS = ee-gcc
-LD = ee-gcc
-AR = ee-ar cru
-RANLIB = ee-ranlib
-STRIP = ee-strip
-MKDIR = mkdir -p
-RM = rm -f
-
-srcdir = ../../..
-VPATH = $(srcdir)
-INCDIR = ../../../
-# DEPDIR = .deps
-
-DEFINES = -DUSE_VORBIS -DUSE_TREMOR -DUSE_MAD -DUSE_ZLIB -DFORCE_RTL -DDISABLE_SAVEGAME_SORTING -D_EE -D__PLAYSTATION2__ -D__PS2_DEBUG__ -g -Wall -Wno-multichar -fno-rtti -fno-exceptions # -DNO_ADAPTOR
-# for release builds:
-#DEFINES += -DRELEASE_BUILD
-
-INCLUDES = $(addprefix -I$(PS2_EXTRA),$(PS2_EXTRA_INCS))
-INCLUDES += -I $(PS2GDB)/ee -I $(PS2SDK)/ee/include -I $(PS2SDK)/common/include -I ./common -I . -I $(srcdir) -I $(srcdir)/engines
-
-CXX_UPDATE_DEP_FLAG = -Wp,-MMD,"$(*D)/$(DEPDIR)/$(*F).d",-MQ,"$@",-MP
-
-TARGET = elf/scummvm.elf
-
-OBJS := $(srcdir)/backends/platform/ps2/DmaPipe.o \
- $(srcdir)/backends/platform/ps2/Gs2dScreen.o \
- $(srcdir)/backends/platform/ps2/irxboot.o \
- $(srcdir)/backends/platform/ps2/ps2input.o \
- $(srcdir)/backends/platform/ps2/ps2pad.o \
- $(srcdir)/backends/platform/ps2/savefilemgr.o \
- $(srcdir)/backends/platform/ps2/fileio.o \
- $(srcdir)/backends/platform/ps2/asyncfio.o \
- $(srcdir)/backends/platform/ps2/icon.o \
- $(srcdir)/backends/platform/ps2/cd.o \
- $(srcdir)/backends/platform/ps2/eecodyvdfs.o \
- $(srcdir)/backends/platform/ps2/rpckbd.o \
- $(srcdir)/backends/platform/ps2/systemps2.o \
- $(srcdir)/backends/platform/ps2/ps2mutex.o \
- $(srcdir)/backends/platform/ps2/ps2time.o \
- $(srcdir)/backends/platform/ps2/ps2debug.o
-
-MODULE_DIRS += .
-
-include $(srcdir)/Makefile.common
-
-LDFLAGS += -mno-crt0 $(PS2SDK)/ee/startup/crt0.o -T $(PS2SDK)/ee/startup/linkfile
-LDFLAGS += -L $(PS2GDB)/lib -L $(PS2SDK)/ee/lib -L .
-LDFLAGS += $(addprefix -L$(PS2_EXTRA),$(PS2_EXTRA_LIBS))
-LDFLAGS += -lmc -lpad -lmouse -lhdd -lpoweroff -lsjpcm -lmad -ltremor -lz -lm -lc -lfileXio -lps2gdbStub -lps2ip -ldebug -lkernel -lstdc++
-
-all: $(TARGET)
-
-$(TARGET): $(OBJS)
- $(LD) $^ $(LDFLAGS) -o $@
diff --git a/backends/platform/ps2/Makefile.ps2 b/backends/platform/ps2/Makefile.ps2
index d6ce08ae84..3631c653f6 100644
--- a/backends/platform/ps2/Makefile.ps2
+++ b/backends/platform/ps2/Makefile.ps2
@@ -1,107 +1,217 @@
-# $Header: Exp $
- include $(PS2SDK)/Defs.make
+# SCUMMVM-PS2 MakeFile
-PS2_EXTRA = /works/devel/ps2/sdk-extra
-PS2_EXTRA_INCS = /zlib/include /libmad/ee/include /SjPcm/ee/src /tremor
-PS2_EXTRA_LIBS = /zlib/lib /libmad/ee/lib /SjPcm/ee/lib /tremor/tremor
-ENABLED=STATIC_PLUGIN
+# Use only this section to modify how the makefile behaves ------------
-ENABLE_SCUMM = $(ENABLED)
-ENABLE_SCUMM_7_8 = $(ENABLED)
-ENABLE_HE = $(ENABLED)
+# Scummvm engine config: choose which engines are enabled
ENABLE_AGI = $(ENABLED)
ENABLE_AGOS = $(ENABLED)
-ENABLE_AGOS2 = $(ENABLED)
+ENABLE_AGOS2 = 1
+# ENABLE_AVALANCHE = $(ENABLED)
+ENABLE_CGE = $(ENABLED)
ENABLE_CINE = $(ENABLED)
+ENABLE_COMPOSER = $(ENABLED)
ENABLE_CRUISE = $(ENABLED)
ENABLE_DRACI = $(ENABLED)
ENABLE_DRASCULA = $(ENABLED)
+ENABLE_DREAMWEB = $(ENABLED)
+# ENABLE_FULLPIPE = $(ENABLED)
ENABLE_GOB = $(ENABLED)
ENABLE_GROOVIE = $(ENABLED)
# ENABLE_GROOVIE2 = $(ENABLED)
+# ENABLE_HOPKINS = $(ENABLED)
ENABLE_HUGO = $(ENABLED)
-ENABLE_IHNM = $(ENABLED)
ENABLE_KYRA = $(ENABLED)
-# ENABLE_LOL = $(ENABLED)
+ENABLE_LOL = 1
+ENABLE_EOB = 1
+# ENABLE_LASTEXPRESS = $(ENABLED)
ENABLE_LURE = $(ENABLED)
-# ENABLE_M4 = $(ENABLED)
ENABLE_MADE = $(ENABLED)
ENABLE_MOHAWK = $(ENABLED)
+# ENABLE_CSTIME = $(ENABLED)
+# ENABLE_RIVEN = $(ENABLED)
+# ENABLE_MYST = $(ENABLED)
+ENABLE_MORTEVIELLE = $(ENABLED)
+ENABLE_NEVERHOOD = $(ENABLED)
ENABLE_PARALLACTION = $(ENABLED)
+# ENABLE_PEGASUS = $(ENABLED)
ENABLE_QUEEN = $(ENABLED)
ENABLE_SAGA = $(ENABLED)
+ENABLE_IHNM = 1
# ENABLE_SAGA2 = $(ENABLED)
ENABLE_SCI = $(ENABLED)
# ENABLE_SCI32 = $(ENABLED)
+ENABLE_SCUMM = $(ENABLED)
+ENABLE_SCUMM_7_8 = 1
+ENABLE_HE = 1
ENABLE_SKY = $(ENABLED)
ENABLE_SWORD1 = $(ENABLED)
ENABLE_SWORD2 = $(ENABLED)
+# ENABLE_SWORD25 = $(ENABLED)
ENABLE_TEENAGENT = $(ENABLED)
+# ENABLE_TESTBED = $(ENABLED)
ENABLE_TINSEL = $(ENABLED)
+ENABLE_TOLTECS = $(ENABLED)
+# ENABLE_TONY = $(ENABLED)
ENABLE_TOON = $(ENABLED)
ENABLE_TOUCHE = $(ENABLED)
+ENABLE_TSAGE = $(ENABLED)
ENABLE_TUCKER = $(ENABLED)
-
-
-HAVE_GCC3 = true
-
-CC = ee-gcc
-CXX = ee-g++
-AS = ee-gcc
-LD = ee-gcc
+# ENABLE_WINTERMUTE = $(ENABLED)
+# ENABLE_ZVISION = $(ENABLED)
+
+# Set to 1 to enable seeing the commands to gcc
+VERBOSE_BUILD = 0
+# Set to 1 to enable, 0 to disable dynamic modules
+DYNAMIC_MODULES = 1
+# Set to 1 to enable debugging
+ENABLE_DEBUG = 0
+# Set to 1 to enable profiling
+ENABLE_PROFILING = 0
+# Set to 1 to disable HDD+NET
+DISABLE_NETWORK = 0
+# Set to 1 to enable, 0 to disable libmad and libogg
+USE_LIBMAD = 1
+USE_LIBOGG = 1
+
+# ---------------------------------------------------------------------
+
+
+# General variables
+srcdir = ../../..
+VPATH = $(srcdir)
+TARGET = scummvm.elf
+# PS2 SDK location variables
+# PS2SDK = /works/tools/devel/ps2/sdk
+
+# Check PS2SDK presence
+ifeq ($(PS2SDK),)
+$(error $$(PS2SDK) needs to be set.)
+endif
+
+# Variables for common Scummvm makefile
+CC = ee-gcc
+CXX = ee-g++
+FLAGS = -pedantic -Wall -W
+FLAGS += -Wcast-qual -Wconversion -Wpointer-arith -Wshadow -Wwrite-strings
+FLAGS += -Wno-long-long -Wno-multichar -Wno-unknown-pragmas -Wno-unused-parameter
+CFLAGS = $(FLAGS) -std=c99
+CXXFLAGS = $(FLAGS) -Wnon-virtual-dtor -Wno-reorder -fno-exceptions -fno-rtti
+
+DEFINES = -D_EE -D__PLAYSTATION2__ -D__NEW_PS2SDK__ -DUSE_ZLIB -DFORCE_RTL -DDATA_PATH=\"host:data\"
+DEFINES += -DDISABLE_SAVEGAME_SORTING -DDISABLE_TEXT_CONSOLE -DDISABLE_COMMAND_LINE -DDISABLE_DOSBOX_OPL -DDISABLE_SID -DDISABLE_NES_APU
+# DEFINES += -DLOGORRHEIC
+
+INCDIR := $(PS2SDK)/ee/include $(PS2SDK)/common/include $(PS2SDK)/ports/include . $(srcdir) $(srcdir)/engines
+INCLUDES := $(addprefix -I, $(INCDIR))
+DEPDIR = .deps
+MODULE_DIRS += ./
+MKDIR = mkdir -p
+RM = rm -f
+RM_REC = rm -rf
AR = ee-ar cru
RANLIB = ee-ranlib
STRIP = ee-strip
-MKDIR = mkdir -p
-RM = rm -f
-
-srcdir = ../../..
-VPATH = $(srcdir)
-INCDIR = ../../../
-# DEPDIR = .deps
-
-DEFINES = -DUSE_VORBIS -DUSE_TREMOR -DUSE_MAD -DUSE_ZLIB -DFORCE_RTL -DDISABLE_SAVEGAME_SORTING -D_EE -D__PLAYSTATION2__ -G2 -O2 -Wall -Wno-multichar -fno-rtti -fno-exceptions # -DNO_ADAPTOR
-# for release builds:
-#DEFINES += -DRELEASE_BUILD
-
-INCLUDES = $(addprefix -I$(PS2_EXTRA),$(PS2_EXTRA_INCS))
-INCLUDES += -I $(PS2SDK)/ee/include -I $(PS2SDK)/common/include -I ./common -I . -I $(srcdir) -I $(srcdir)/engines
-
-CXX_UPDATE_DEP_FLAG = -Wp,-MMD,"$(*D)/$(DEPDIR)/$(*F).d",-MQ,"$@",-MP
-
-TARGET = elf/scummvm.elf
+AS = ee-gcc
+LD = ee-gcc
+HAVE_GCC3 = true
+CXX_UPDATE_DEP_FLAG = -MMD -MF "$(*D)/$(DEPDIR)/$(*F).d" -MQ "$@" -MP
+
+# Variables for dynamic plugin building
+PLUGIN_PREFIX =
+PLUGIN_SUFFIX = .plg
+PLUGIN_EXTRA_DEPS = $(TARGET)
+PLUGIN_LDFLAGS = -nostartfiles $(srcdir)/backends/plugins/elf/version.o -Wl,-q,--just-symbols,$(TARGET),--retain-symbols-file,$(srcdir)/backends/plugins/elf/plugin.syms
+PLUGIN_LDFLAGS += -mno-crt0 $(PS2SDK)/ee/startup/crt0.o -Wl,-T$(srcdir)/backends/plugins/ps2/plugin.ld -lstdc++ -lc
+
+# Test for adding different libs
+ifeq ($(USE_LIBMAD),1)
+DEFINES += -DUSE_MAD
+LIBS += -lmad
+endif
+ifeq ($(USE_LIBOGG), 1)
+DEFINES += -DUSE_VORBIS -DUSE_TREMOR
+LIBS += -ltremor
+endif
+
+# Test for dynamic plugins
+ifeq ($(DYNAMIC_MODULES),1)
+ENABLED = DYNAMIC_PLUGIN
+DEFINES += -DDYNAMIC_MODULES -DUSE_ELF_LOADER -DMIPS_TARGET -DUNCACHED_PLUGINS -DPLUGIN_DIRECTORY=\"host:plugins\"
+PRE_OBJS_FLAGS = -Wl,--whole-archive
+POST_OBJS_FLAGS = -Wl,--no-whole-archive
+else
+ENABLED = STATIC_PLUGIN
+endif
+
+# Test for debug
+ifeq ($(ENABLE_DEBUG),1)
+DEFINES += -D__PS2_DEBUG__
+FLAGS += -G2 -g
+LIBS += -lps2gdbStub -lps2ip -ldebug
+else
+DEFINES += -DRELEASE_BUILD
+FLAGS += -G2 -O2 -s -Wuninitialized
+# LDFLAGS += -s
+endif
+
+# Test for profiling
+ifeq ($(ENABLE_PROFILING),1)
+DEFINES += -DENABLE_PROFILING
+FLAGS += -G2 -pg -g
+LDFLAGS += -pg
+endif
+
+# Test for net support
+ifeq ($(DISABLE_NETWORK),1)
+DEFINES += -DNO_ADAPTOR
+endif
+
+# PS2 LIBS
+PS2LIBS = -lmc -lpad -lmouse -lhdd -lpoweroff -lsjpcm -lz -lm -lc -lfileXio -lkernel -lstdc++
+
+# Add in PS2SDK includes and libraries.
+LIBS += $(PS2LIBS)
OBJS := $(srcdir)/backends/platform/ps2/DmaPipe.o \
- $(srcdir)/backends/platform/ps2/Gs2dScreen.o \
- $(srcdir)/backends/platform/ps2/irxboot.o \
- $(srcdir)/backends/platform/ps2/ps2input.o \
- $(srcdir)/backends/platform/ps2/ps2pad.o \
- $(srcdir)/backends/platform/ps2/savefilemgr.o \
- $(srcdir)/backends/platform/ps2/fileio.o \
- $(srcdir)/backends/platform/ps2/asyncfio.o \
- $(srcdir)/backends/platform/ps2/icon.o \
- $(srcdir)/backends/platform/ps2/cd.o \
- $(srcdir)/backends/platform/ps2/eecodyvdfs.o \
- $(srcdir)/backends/platform/ps2/rpckbd.o \
- $(srcdir)/backends/platform/ps2/systemps2.o \
- $(srcdir)/backends/platform/ps2/ps2mutex.o \
- $(srcdir)/backends/platform/ps2/ps2time.o \
- $(srcdir)/backends/platform/ps2/ps2debug.o
-
-MODULE_DIRS += .
+ $(srcdir)/backends/platform/ps2/Gs2dScreen.o \
+ $(srcdir)/backends/platform/ps2/irxboot.o \
+ $(srcdir)/backends/platform/ps2/ps2input.o \
+ $(srcdir)/backends/platform/ps2/ps2pad.o \
+ $(srcdir)/backends/platform/ps2/savefilemgr.o \
+ $(srcdir)/backends/platform/ps2/fileio.o \
+ $(srcdir)/backends/platform/ps2/asyncfio.o \
+ $(srcdir)/backends/platform/ps2/icon.o \
+ $(srcdir)/backends/platform/ps2/cd.o \
+ $(srcdir)/backends/platform/ps2/eecodyvdfs.o \
+ $(srcdir)/backends/platform/ps2/rpckbd.o \
+ $(srcdir)/backends/platform/ps2/systemps2.o \
+ $(srcdir)/backends/platform/ps2/ps2mutex.o \
+ $(srcdir)/backends/platform/ps2/ps2time.o \
+ $(srcdir)/backends/platform/ps2/ps2debug.o
+
+ifeq ($(DYNAMIC_MODULES),1)
+OBJS += $(srcdir)/backends/plugins/elf/elf-loader.o \
+ $(srcdir)/backends/plugins/elf/elf-provider.o \
+ $(srcdir)/backends/plugins/elf/shorts-segment-manager.o \
+ $(srcdir)/backends/plugins/elf/memory-manager.o \
+ $(srcdir)/backends/plugins/elf/mips-loader.o \
+ $(srcdir)/backends/plugins/elf/version.o
+endif
BACKEND := ps2
+# Include common Scummvm makefile
include $(srcdir)/Makefile.common
+LDFLAGS += -L$(PS2SDK)/ee/lib -L$(PS2SDK)/ports/lib
+ifeq ($(DYNAMIC_MODULES),1)
+LDFLAGS += -mno-crt0 $(PS2SDK)/ee/startup/crt0.o -Wl,-T$(srcdir)/backends/plugins/ps2/main_prog.ld
+else
LDFLAGS += -mno-crt0 $(PS2SDK)/ee/startup/crt0.o -T $(PS2SDK)/ee/startup/linkfile
-LDFLAGS += -L $(PS2SDK)/ee/lib -L .
-LDFLAGS += $(addprefix -L$(PS2_EXTRA),$(PS2_EXTRA_LIBS))
-LDFLAGS += -lmc -lpad -lmouse -lhdd -lpoweroff -lsjpcm -lmad -ltremor -lz -lm -lc -lfileXio -lkernel -lstdc++
-LDFLAGS += -s
+endif
all: $(TARGET)
$(TARGET): $(OBJS)
- $(LD) $^ $(LDFLAGS) -o $@
+ $(LD) $(PRE_OBJS_FLAGS) $(OBJS) $(POST_OBJS_FLAGS) $(LDFLAGS) $(LIBS) -o $@
diff --git a/backends/platform/ps2/Makefile.ps2.dev b/backends/platform/ps2/Makefile.ps2.dev
new file mode 100644
index 0000000000..cd9432e2df
--- /dev/null
+++ b/backends/platform/ps2/Makefile.ps2.dev
@@ -0,0 +1,170 @@
+# SCUMMVM-PS2 MakeFile
+
+
+# Use only this section to modify how the makefile behaves ------------
+
+# Scummvm engine config: choose which engines are enabled
+ENABLE_SCUMM = $(ENABLED)
+ENABLE_SCUMM_7_8 = 1
+# ENABLE_HE = 1
+ENABLE_SCI = $(ENABLED)
+# ENABLE_SCI32 = $(ENABLED)
+# ENABLE_SKY = $(ENABLED)
+# ENABLE_SWORD1 = $(ENABLED)
+# ENABLE_SWORD2 = $(ENABLED)
+
+# Set to 1 to enable seeing the commands to gcc
+VERBOSE_BUILD = 1
+# Set to 1 to enable, 0 to disable dynamic modules
+DYNAMIC_MODULES = 0
+# Set to 1 to enable debugging
+ENABLE_DEBUG = 0
+# Set to 1 to enable profiling
+ENABLE_PROFILING = 1
+# Set to 1 to disable HDD+NET
+DISABLE_NETWORK = 0
+# Set to 1 to enable, 0 to disable libmad and libogg
+USE_LIBMAD = 1
+USE_LIBOGG = 1
+
+# ---------------------------------------------------------------------
+
+
+# General variables
+srcdir = ../../..
+VPATH = $(srcdir)
+TARGET = scummvm.elf
+# PS2 SDK location variables
+# PS2SDK = /works/tools/devel/ps2/sdk
+
+# Check PS2SDK presence
+ifeq ($(PS2SDK),)
+$(error $$(PS2SDK) needs to be set.)
+endif
+
+# Variables for common Scummvm makefile
+CC = ee-gcc
+CXX = ee-g++
+FLAGS = -pedantic -Wall -W
+FLAGS += -Wcast-qual -Wconversion -Wpointer-arith -Wshadow -Wwrite-strings
+FLAGS += -Wno-long-long -Wno-multichar -Wno-unknown-pragmas -Wno-unused-parameter
+CFLAGS = $(FLAGS) -std=c99
+CXXFLAGS = $(FLAGS) -Wnon-virtual-dtor -Wno-reorder -fno-exceptions -fno-rtti
+
+DEFINES = -D_EE -D__PLAYSTATION2__ -D__NEW_PS2SDK__ -DUSE_ZLIB -DFORCE_RTL -DDATA_PATH=\"host:data\"
+DEFINES += -DDISABLE_SAVEGAME_SORTING -DDISABLE_TEXT_CONSOLE -DDISABLE_COMMAND_LINE -DDISABLE_DOSBOX_OPL -DDISABLE_SID -DDISABLE_NES_APU
+# DEFINES += -DLOGORRHEIC
+
+INCDIR := $(PS2SDK)/ee/include $(PS2SDK)/common/include $(PS2SDK)/ports/include . $(srcdir) $(srcdir)/engines
+INCLUDES := $(addprefix -I, $(INCDIR))
+DEPDIR = .deps
+MODULE_DIRS += ./
+MKDIR = mkdir -p
+RM = rm -f
+RM_REC = rm -rf
+AR = ee-ar cru
+RANLIB = ee-ranlib
+STRIP = ee-strip
+AS = ee-gcc
+LD = ee-gcc
+HAVE_GCC3 = true
+CXX_UPDATE_DEP_FLAG = -MMD -MF "$(*D)/$(DEPDIR)/$(*F).d" -MQ "$@" -MP
+
+# Variables for dynamic plugin building
+PLUGIN_PREFIX =
+PLUGIN_SUFFIX = .plg
+PLUGIN_EXTRA_DEPS = $(TARGET)
+PLUGIN_LDFLAGS = -nostartfiles $(srcdir)/backends/plugins/elf/version.o -Wl,-q,--just-symbols,$(TARGET),--retain-symbols-file,$(srcdir)/backends/plugins/elf/plugin.syms
+PLUGIN_LDFLAGS += -mno-crt0 $(PS2SDK)/ee/startup/crt0.o -Wl,-T$(srcdir)/backends/plugins/ps2/plugin.ld -lstdc++ -lc
+
+# Test for adding different libs
+ifeq ($(USE_LIBMAD),1)
+DEFINES += -DUSE_MAD
+LIBS += -lmad
+endif
+ifeq ($(USE_LIBOGG), 1)
+DEFINES += -DUSE_VORBIS -DUSE_TREMOR
+LIBS += -ltremor
+endif
+
+# Test for dynamic plugins
+ifeq ($(DYNAMIC_MODULES),1)
+ENABLED = DYNAMIC_PLUGIN
+DEFINES += -DDYNAMIC_MODULES -DUSE_ELF_LOADER -DMIPS_TARGET -DUNCACHED_PLUGINS -DPLUGIN_DIRECTORY=\"host:plugins\"
+PRE_OBJS_FLAGS = -Wl,--whole-archive
+POST_OBJS_FLAGS = -Wl,--no-whole-archive
+else
+ENABLED = STATIC_PLUGIN
+endif
+
+# Test for debug
+ifeq ($(ENABLE_DEBUG),1)
+DEFINES += -D__PS2_DEBUG__
+FLAGS += -G2 -g
+LIBS += -lps2gdbStub -lps2ip -ldebug
+else
+DEFINES += -DRELEASE_BUILD
+FLAGS += -G2 -O2 -s -Wuninitialized
+# LDFLAGS += -s
+endif
+
+# Test for profiling
+ifeq ($(ENABLE_PROFILING),1)
+DEFINES += -DENABLE_PROFILING
+FLAGS += -G2 -pg -g
+LDFLAGS += -pg
+endif
+
+# Test for net support
+ifeq ($(DISABLE_NETWORK),1)
+DEFINES += -DNO_ADAPTOR
+endif
+
+# PS2 LIBS
+PS2LIBS = -lmc -lpad -lmouse -lhdd -lpoweroff -lsjpcm -lz -lm -lc -lfileXio -lkernel -lstdc++
+
+# Add in PS2SDK includes and libraries.
+LIBS += $(PS2LIBS)
+
+OBJS := $(srcdir)/backends/platform/ps2/DmaPipe.o \
+ $(srcdir)/backends/platform/ps2/Gs2dScreen.o \
+ $(srcdir)/backends/platform/ps2/irxboot.o \
+ $(srcdir)/backends/platform/ps2/ps2input.o \
+ $(srcdir)/backends/platform/ps2/ps2pad.o \
+ $(srcdir)/backends/platform/ps2/savefilemgr.o \
+ $(srcdir)/backends/platform/ps2/fileio.o \
+ $(srcdir)/backends/platform/ps2/asyncfio.o \
+ $(srcdir)/backends/platform/ps2/icon.o \
+ $(srcdir)/backends/platform/ps2/cd.o \
+ $(srcdir)/backends/platform/ps2/eecodyvdfs.o \
+ $(srcdir)/backends/platform/ps2/rpckbd.o \
+ $(srcdir)/backends/platform/ps2/systemps2.o \
+ $(srcdir)/backends/platform/ps2/ps2mutex.o \
+ $(srcdir)/backends/platform/ps2/ps2time.o \
+ $(srcdir)/backends/platform/ps2/ps2debug.o
+
+ifeq ($(DYNAMIC_MODULES),1)
+OBJS += $(srcdir)/backends/plugins/elf/elf-loader.o \
+ $(srcdir)/backends/plugins/elf/elf-provider.o \
+ $(srcdir)/backends/plugins/elf/shorts-segment-manager.o \
+ $(srcdir)/backends/plugins/elf/memory-manager.o \
+ $(srcdir)/backends/plugins/elf/mips-loader.o \
+ $(srcdir)/backends/plugins/elf/version.o
+endif
+
+BACKEND := ps2
+
+# Include common Scummvm makefile
+include $(srcdir)/Makefile.common
+
+LDFLAGS += -L$(PS2SDK)/ee/lib -L$(PS2SDK)/ports/lib
+ifeq ($(DYNAMIC_MODULES),1)
+LDFLAGS += -mno-crt0 $(PS2SDK)/ee/startup/crt0.o -Wl,-T$(srcdir)/backends/plugins/ps2/main_prog.ld
+else
+LDFLAGS += -mno-crt0 $(PS2SDK)/ee/startup/crt0.o -T $(PS2SDK)/ee/startup/linkfile
+endif
+
+all: $(TARGET)
+
+$(TARGET): $(OBJS)
+ $(LD) $(PRE_OBJS_FLAGS) $(OBJS) $(POST_OBJS_FLAGS) $(LDFLAGS) $(LIBS) -o $@
diff --git a/backends/platform/ps2/README.PS2 b/backends/platform/ps2/README.PS2
new file mode 100644
index 0000000000..141a79eaca
--- /dev/null
+++ b/backends/platform/ps2/README.PS2
@@ -0,0 +1,189 @@
+Dear PS2 ScummVM enthusiast user,
+
+here you will find the latest and the greatest PS2 backend ever!
+
+
+ *** Release Notes ***
+
+Released 2 builds: SCUMMVM.ELF and SCUMMVM-S.ELF. The latter has engine
+modules statically linked into (that's what the "-S" is for), the former
+uses dynamic modules (uncached). The dynamic one is much faster to start
+and has more resources available for the games. The catch is that games
+detection, when you are adding a new one, is painstakingly slow...
+(as it needs to load, test, unload the plugins one by one).
+
+Until we have an optimization for that in place I would suggest you add
+new games with "SCUMMVM-S.ELF", and when you are done adding you then
+play them with "SCUMMVM.ELF", as this will give you the best of both.
+
+We no longer have a separate ELF build with hdd & net adapter disabled,
+as we now do it in the smart way, allowing users to disable it in their
+ScummVM.ini. See under in "Configuration" for details.
+
+We also have an improved Makefile.ps2 in ps2 folder which will allow
+you to create: static, dynamic, profile and debug build version.
+
+You can now also cleanly compile using "configure" and specifying:
+
+./configure --backend=ps2 --host=ps2 ...
+
+
+ *** Installation ***
+
+Some media drivers require all capitalized letter, so to be on the
+safe side store the files (SCUMMVM.ELF and *.IRX) in upper case.
+
+Here comes a full list of the required *.IRX (don't worry they are all
+provided pre-compiled in the binary release ;-)
+
+ IOMANX.IRX
+ FILEXIO.IRX
+ CODYVDFS.IRX
+ SJPCM.IRX
+ USBD.IRX
+ USB_MASS.IRX
+ PS2MOUSE.IRX
+ RPCKBD.IRX
+ POWEROFF.IRX
+ PS2DEV9.IRX
+ PS2ATAD.IRX
+ PS2HDD.IRX
+ PS2FS.IRX
+ PS2IP.IRX
+ PS2SMAP.IRX
+ PS2HOST.IRX
+
+Make sure they are all stored in the folder that contains your SCUMMVM.ELF!
+
+If you are starting ScummVM from CD/DVD then it will look for ScummVM.ini
+a ScummVM.ini on the media folder from where you started SCUMMVM.ELF.
+
+Notes:
+
+ - depending on the media you install Scummvm/PS2 onto, it might be
+ picky about files cases, so I'd leave those *.IRX uppercase and
+ scummmodern.zip lower ;0)
+
+ - make sure you selected a save path before you start playing!
+
+ - we added PS2IPS.IRX in case you wanted to test a debug build
+ (use Makefile.gdb)
+
+
+ *** Configuration ***
+
+There is now a [PlayStation2] section in ScummVM.ini which can be used
+to make your wildest dreams come true ;-)
+
+It accepts these entries:
+
+tv_mode = [pal] [ntsc]
+gfx_mode = [mode number] [*]
+hdd_part = [partition name] [disable]
+net_addr = [PS2 IP addr] [**]
+usb_mass = [0] [disable]
+
+[*] Currently supported gfx modes are:
+
+ # 1 -> SDTV progressive (NTSC: 224p / PAL: 256p)
+ # 2 -> SDTV interlaced (NTSC: 448i / PAL: 512i) <- default
+ # 3 -> EDTV progressive (NTSC: 480p / PAL: 576p)
+ # 6 -> VESA (640x480@60)
+
+If no tv_mode is specified it will be autodected based on PS2 model.
+
+The non-interlaced (progressive) modes look much better and sharper.
+You can check the difference starting COMI and choosing About from
+the GMM (press "start" then choose "about"). You can easily see the
+difference between progressive and interlaced in scrolling text.
+
+You can use mode 6 (VGA 640x480) if you are connecting your PS2 to
+a RGB monitor. Some TVs also supports this signal.
+
+We also do some bad-ass things, like detecting the BIOS version and
+setting the GS registers by hand, for console models where a mode
+is not supported ;-)
+
+If SCUMMVM.ELF hangs at start for you try disabling the adapter by
+setting in ScummVM.ini
+
+hdd_part = 0
+net_addr = 0
+
+You can now also choose the hdd partition used for ScummVM games
+(default "+ScummVM") passing it as an argument to hdd_part:
+
+hdd_part = MyPartition (witout the "+")
+
+If you have an adapter with hdd & net, but you don't use them you
+can just set both to 0 to disable, and have a leaner and meaner
+ScummVM booting much faster!
+
+[**] TODO
+
+ *** Remote ***
+
+You will need "PS2IP.IRX", "PS2SMAP.IRX" and "PS2HOST.IRX" drivers too
+in the folder where you are starting SCUMMVM.ELF if you want to use
+the remote capability.
+
+The IP 192.168.1.20 (ps2link default) is hardcoded in the source as
+"netArg" in irxboot.cpp, feel free to modify it to match your network
+configuration.
+
+In a future release you will be able to set in ScummVM.ini using
+
+net_addr = xxx.yyy.zzz.www
+
+If you are starting SCUMMVM.ELF over the net using ps2client then you
+are already set. If you are starting it in any other way, then you
+will have to "export" the folder where you are storing ScummVM games
+and data by starting ps2client from inside that folder. Eg. from a
+terminal:
+
+> ./ps2client -h [your ps2 ip] listen
+
+Do this -after- ScummVM is up and running otherwise it will fail to
+establish a connection.
+
+
+ *** Gamepad ***
+
+The mapping is:
+
+Start Button - GMM
+R1 - 'y'
+L1 - 'n'
+R2 - '.'
+L2 - Numpad 0
+Triangle - Escape
+Square - Enter
+Cross - Left mouse button
+Circle - Right mouse button
+
+
+ *** Bugs ***
+
+Though we made our best to make this release as bug free as possible
+there are still a few bugs left:
+
+ - file handling speed : (not really a bug, but a nuisance) : there
+ is probably space for some more optimization in the current file
+ management. The only case when it really bogs me it's when you
+ try to select a saved game and there is some lag.
+
+ Some game will start faster too when this is optimized.
+
+ - feel free to add your bug, suggestion, secret wish to this list!
+
+ - SCI games have smooth audio and intro, but moving the pointer
+ and in-game animation speed might be a challenge.
+
+ - it has been reported USB media greater than 8 GB might not work
+
+Now enough reading, rush to your PlayStation2 and start playing!
+
+Are you still reading?
+
+Have a lot of fun,
+ -Max Lingua
diff --git a/backends/platform/ps2/asyncfio.cpp b/backends/platform/ps2/asyncfio.cpp
index 3f20349107..6f15dcc628 100644
--- a/backends/platform/ps2/asyncfio.cpp
+++ b/backends/platform/ps2/asyncfio.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -33,7 +33,7 @@
AsyncFio::AsyncFio(void) {
_runningOp = NULL;
- memset((int *)_ioSlots, 0, MAX_HANDLES * sizeof(int));
+ memset(const_cast<int *>(_ioSlots), 0, MAX_HANDLES * sizeof(int));
ee_sema_t newSema;
newSema.init_count = 1;
newSema.max_count = 1;
@@ -63,7 +63,7 @@ int AsyncFio::open(const char *name, int ioMode, int mode) {
fileXioWaitAsync(FXIO_WAIT, &res);
SignalSema(_ioSema);
// dbg_printf("FIO: open ext(%s, %d, %d) => %d", name, ioMode, mode, res);
- return res;
+ return res;
}
void AsyncFio::close(int handle) {
@@ -80,7 +80,7 @@ void AsyncFio::close(int handle) {
void AsyncFio::checkSync(void) {
if (_runningOp) {
- fileXioWaitAsync(FXIO_WAIT, (int *)_runningOp);
+ fileXioWaitAsync(FXIO_WAIT, const_cast<int *>(_runningOp));
_runningOp = NULL;
}
}
@@ -90,7 +90,7 @@ void AsyncFio::read(int fd, void *dest, unsigned int len) {
checkSync();
assert(fd < MAX_HANDLES);
_runningOp = _ioSlots + fd;
- fileXioRead(fd, (unsigned char*)dest, len);
+ fileXioRead(fd, (unsigned char *)dest, len);
SignalSema(_ioSema);
}
@@ -99,7 +99,7 @@ void AsyncFio::write(int fd, const void *src, unsigned int len) {
checkSync();
assert(fd < MAX_HANDLES);
_runningOp = _ioSlots + fd;
- fileXioWrite(fd, (unsigned char*)src, len);
+ fileXioWrite(fd, (unsigned char *)const_cast<void *>(src), len);
SignalSema(_ioSema);
}
@@ -210,7 +210,7 @@ bool AsyncFio::poll(int fd) {
bool retVal = false;
if (PollSema(_ioSema) >= 0) {
if (_runningOp == _ioSlots + fd) {
- if (fileXioWaitAsync(FXIO_NOWAIT, (int *)_runningOp) == FXIO_COMPLETE) {
+ if (fileXioWaitAsync(FXIO_NOWAIT, const_cast<int *>(_runningOp)) == FXIO_COMPLETE) {
_runningOp = NULL;
retVal = true;
} else
@@ -226,7 +226,7 @@ bool AsyncFio::fioAvail(void) {
bool retVal = false;
if (PollSema(_ioSema) > 0) {
if (_runningOp) {
- if (fileXioWaitAsync(FXIO_NOWAIT, (int *)_runningOp) == FXIO_COMPLETE) {
+ if (fileXioWaitAsync(FXIO_NOWAIT, const_cast<int *>(_runningOp)) == FXIO_COMPLETE) {
_runningOp = NULL;
retVal = true;
} else
diff --git a/backends/platform/ps2/asyncfio.h b/backends/platform/ps2/asyncfio.h
index 31684d4349..6f84742da0 100644
--- a/backends/platform/ps2/asyncfio.h
+++ b/backends/platform/ps2/asyncfio.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -23,6 +23,9 @@
#define MAX_HANDLES 32
#include <sys/stat.h>
+#undef chdir // we define our own
+#undef mkdir
+
class AsyncFio {
public:
AsyncFio(void);
diff --git a/backends/platform/ps2/cd.c b/backends/platform/ps2/cd.c
index cd44b3d034..e08437d34f 100644
--- a/backends/platform/ps2/cd.c
+++ b/backends/platform/ps2/cd.c
@@ -19,35 +19,35 @@ int cdvdInitialised = 0;
void cdvdExit(void)
{
- cdvdInitialised = 0;
+ cdvdInitialised = 0;
}
int cdvdInit(int mode)
{
int i=0,len=0,ret=0;
- u8 *pkt;
-
- cdvdCd.server = NULL;
-
- do {
- if ((ret = SifBindRpc(&cdvdCd, CDVD_INIT_BIND_RPC, 0)) < 0) {
- return -1;
- }
- if (!cdvdCd.server) {
- nopdelay();
- }
- }
+ u8 *pkt;
+
+ cdvdCd.server = NULL;
+
+ do {
+ if ((ret = SifBindRpc(&cdvdCd, (signed)CDVD_INIT_BIND_RPC, 0)) < 0) {
+ return -1;
+ }
+ if (!cdvdCd.server) {
+ nopdelay();
+ }
+ }
while(!cdvdCd.server);
- pkt = sendBuffer;
- PUSHDATA( int, pkt, mode, i);
- pkt += i; len += i;
+ pkt = (unsigned char *)sendBuffer;
+ PUSHDATA(int, pkt, mode, i);
+ pkt += i; len += i;
if ((ret = SifCallRpc(&cdvdCd, 0, 0, sendBuffer, len, NULL, 0, 0, 0)) < 0)
- return -1;
+ return -1;
- cdvdInitialised = 1;
+ cdvdInitialised = 1;
- return 0;
+ return 0;
}
diff --git a/backends/platform/ps2/eecodyvdfs.h b/backends/platform/ps2/eecodyvdfs.h
index 1d43fb662f..f439c42125 100644
--- a/backends/platform/ps2/eecodyvdfs.h
+++ b/backends/platform/ps2/eecodyvdfs.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -40,7 +40,7 @@ struct CdClock {
#ifdef __cplusplus
extern "C" {
#endif
- int initCdvdFs(void);
+ int initCdvdFs(void);
void readRTC(struct CdClock *dest);
int driveStop(void);
int driveStandby(void);
diff --git a/backends/platform/ps2/fileio.cpp b/backends/platform/ps2/fileio.cpp
index 1ec16a3817..205a688438 100644
--- a/backends/platform/ps2/fileio.cpp
+++ b/backends/platform/ps2/fileio.cpp
@@ -8,20 +8,21 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public 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
+// Disable symbol overrides so that we can use "FILE"
+#define FORBIDDEN_SYMBOL_EXCEPTION_FILE
+#define FORBIDDEN_SYMBOL_EXCEPTION_printf
#include "backends/platform/ps2/fileio.h"
@@ -78,12 +79,12 @@ Ps2File::~Ps2File() {
fio.seek(_fd, 0, SEEK_SET);
fio.write(_fd, _cacheBuf, _filePos);
w = fio.sync(_fd);
- printf("flushed wbuf: %x of %x\n", w, _filePos);
+ dbg_printf("flushed wbuf: %x of %x\n", w, _filePos);
}
fio.close(_fd);
uint32 r = fio.sync(_fd);
- printf("close [%d] - sync'd = %d\n", _fd, r);
+ dbg_printf("close [%d] - sync'd = %d\n", _fd, r);
}
free(_cacheBuf);
@@ -97,7 +98,7 @@ bool Ps2File::open(const char *name, int mode) {
#if 1
_fd = fio.open(name, mode);
- printf("open %s [%d]\n", name, _fd);
+ dbg_printf("open %s [%d]\n", name, _fd);
if (_fd >= 0) {
_mode = mode;
@@ -110,9 +111,9 @@ bool Ps2File::open(const char *name, int mode) {
else
_fileSize = 0;
- printf(" _mode = %x\n", _mode);
- printf(" _fileSize = %d\n", _fileSize);
- // printf(" _filePos = %d\n", _filePos);
+ dbg_printf(" _mode = %x\n", _mode);
+ dbg_printf(" _fileSize = %d\n", _fileSize);
+ // dbg_printf(" _filePos = %d\n", _filePos);
return true;
}
@@ -130,7 +131,7 @@ bool Ps2File::open(const char *name, int mode) {
if (_fileSize && mode != O_RDONLY) {
fio.read(_fd, _cacheBuf, _fileSize);
r = fio.sync(_fd);
- printf(" sz=%d, read=%d\n", _fileSize, r);
+ dbg_printf(" sz=%d, read=%d\n", _fileSize, r);
assert(r == _fileSize);
}
@@ -141,7 +142,7 @@ bool Ps2File::open(const char *name, int mode) {
_fd = fio.open(name, mode);
- printf("open %s [%d]\n", name, _fd);
+ dbg_printf("open %s [%d]\n", name, _fd);
if (_fd >= 0) {
_mode = mode;
@@ -160,16 +161,16 @@ bool Ps2File::open(const char *name, int mode) {
if (mode != O_RDONLY) {
fio.read(_fd, _cacheBuf, _fileSize);
r = fio.sync(_fd);
- printf(" sz=%d, read=%d\n", _fileSize, r);
+ dbg_printf(" sz=%d, read=%d\n", _fileSize, r);
assert(r == _fileSize);
// _fileSize = fio.seek(_fd, 0, SEEK_END);
}
#endif
}
- printf(" _mode = %x\n", _mode);
- printf(" _fileSize = %d\n", _fileSize);
- printf(" _filePos = %d\n", _filePos);
+ dbg_printf(" _mode = %x\n", _mode);
+ dbg_printf(" _fileSize = %d\n", _fileSize);
+ dbg_printf(" _filePos = %d\n", _filePos);
return true;
} else
@@ -208,7 +209,7 @@ bool Ps2File::eof() {
#ifdef __PS2_FILE_SEMA__
SignalSema(_sema);
- // printf(" EOF [%d] : %d of %d -> %d\n", _fd, _filePos, _fileSize, res);
+ // dbg_printf(" EOF [%d] : %d of %d -> %d\n", _fd, _filePos, _fileSize, res);
#endif
return res;
}
@@ -255,8 +256,8 @@ int Ps2File::seek(int32 offset, int origin) {
_eof = true;
}
- // printf("seek [%d] %d %d\n", _fd, offset, origin);
- // printf(" res = %d\n", res);
+ // dbg_printf("seek [%d] %d %d\n", _fd, offset, origin);
+ // dbg_printf(" res = %d\n", res);
#ifdef __PS2_FILE_SEMA__
SignalSema(_sema);
@@ -338,8 +339,8 @@ uint32 Ps2File::read(void *dest, uint32 len) {
#endif
#ifdef __PS2_FILE_DEBUG__
- printf("read (1) : _filePos = %d\n", _filePos);
- printf("read (1) : _cachePos = %d\n", _cachePos);
+ dbg_printf("read (1) : _filePos = %d\n", _filePos);
+ dbg_printf("read (1) : _cachePos = %d\n", _cachePos);
#endif
if (len == 0) {
@@ -409,7 +410,10 @@ uint32 Ps2File::read(void *dest, uint32 len) {
break; // EOF
}
}
+#ifndef ENABLE_PROFILING
+ // doesn't play nice with -pg
cacheReadAhead();
+#endif
#ifdef __PS2_FILE_SEMA__
SignalSema(_sema);
#endif
@@ -473,7 +477,7 @@ uint32 PS2FileStream::write(const void *ptr, uint32 len) {
}
bool PS2FileStream::flush() {
- // printf("flush not implemented\n");
+ // dbg_printf("flush not implemented\n");
return true;
}
@@ -481,7 +485,7 @@ bool PS2FileStream::err() const {
bool errVal = _handle->getErr();
if (errVal) {
- printf("ferror -> %d\n", errVal);
+ dbg_printf("ferror -> %d\n", errVal);
}
return errVal;
@@ -501,7 +505,7 @@ FILE *ps2_fopen(const char *fname, const char *mode) {
Ps2File *file = new Ps2File();
int _mode = O_RDONLY;
- printf("fopen(%s, %s)\n", fname, mode);
+ dbg_printf("fopen(%s, %s)\n", fname, mode);
if (mode[0] == 'r' && mode [1] == 'w')
_mode = O_RDWR;
diff --git a/backends/platform/ps2/fileio.h b/backends/platform/ps2/fileio.h
index afa2ca1f24..16eb7f212a 100644
--- a/backends/platform/ps2/fileio.h
+++ b/backends/platform/ps2/fileio.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -30,13 +30,13 @@
#include "common/stream.h"
enum {
- CACHE_SIZE = 2048 * 32,
- MAX_READ_STEP = 2048 * 16,
- MAX_CACHED_FILES = 6,
- CACHE_READ_THRESHOLD = 16 * 2048,
- CACHE_FILL_MIN = 2048 * 24,
- READ_ALIGN = 64, // align all reads to the size of an EE cache line
- READ_ALIGN_MASK = READ_ALIGN - 1
+ CACHE_SIZE = 2048 * 32,
+ MAX_READ_STEP = 2048 * 16,
+ MAX_CACHED_FILES = 6,
+ CACHE_READ_THRESHOLD = 16 * 2048,
+ CACHE_FILL_MIN = 2048 * 24,
+ READ_ALIGN = 64, // align all reads to the size of an EE cache line
+ READ_ALIGN_MASK = READ_ALIGN - 1
};
// TODO: Make this a subclass of SeekableReadStream & WriteStream
diff --git a/backends/platform/ps2/icon.cpp b/backends/platform/ps2/icon.cpp
index bda4843647..9319d9f4d9 100644
--- a/backends/platform/ps2/icon.cpp
+++ b/backends/platform/ps2/icon.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -937,7 +937,7 @@ uint16 PS2Icon::decompressData(uint16 **data) {
uint16 inPos = 1;
const uint16 *rleData = (const uint16 *)_rleIcoData;
uint16 resSize = rleData[0];
- uint16 *resData = (uint16 *)malloc(resSize * sizeof(uint16));
+ uint16 *resData = (uint16 *)memalign(64, resSize * sizeof(uint16));
uint16 outPos = 0;
while (outPos < resSize) {
diff --git a/backends/platform/ps2/icon.h b/backends/platform/ps2/icon.h
index 3ad19910d3..9413b8466c 100644
--- a/backends/platform/ps2/icon.h
+++ b/backends/platform/ps2/icon.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/backends/platform/ps2/iop/CoDyVDfs/common/codyvdirx.h b/backends/platform/ps2/iop/CoDyVDfs/common/codyvdirx.h
index e94e7dc8d6..6ac5a0bb65 100644
--- a/backends/platform/ps2/iop/CoDyVDfs/common/codyvdirx.h
+++ b/backends/platform/ps2/iop/CoDyVDfs/common/codyvdirx.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -26,13 +26,13 @@
#define CDVDFS_IRX_ID 0xD004352
// commands:
-#define READ_RTC 0
-#define SET_READ_SPEED 1
-#define DRIVE_STOP 2
-#define DRIVE_STANDBY 3
+#define READ_RTC 0
+#define SET_READ_SPEED 1
+#define DRIVE_STOP 2
+#define DRIVE_STANDBY 3
-#define CdTrayOpen 0
-#define CdTrayClose 1
-#define CdTrayCheck 2
+#define CdTrayOpen 0
+#define CdTrayClose 1
+#define CdTrayCheck 2
#endif // CDVDFS_COMMON_H
diff --git a/backends/platform/ps2/iop/CoDyVDfs/iop/cdtypes.h b/backends/platform/ps2/iop/CoDyVDfs/iop/cdtypes.h
index ad86631cfd..d9bd5287c6 100644
--- a/backends/platform/ps2/iop/CoDyVDfs/iop/cdtypes.h
+++ b/backends/platform/ps2/iop/CoDyVDfs/iop/cdtypes.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -39,24 +39,24 @@ typedef struct {
} ISOPathTableRecord __attribute__ ((packed));
typedef struct {
- uint8 year; // Number of years since 1900
- uint8 month; // Month of the year from 1 to 12
- uint8 day; // Day of the Month from 1 to 31
- uint8 hour; // Hour of the day from 0 to 23
- uint8 min; // Minute of the hour from 0 to 59
- uint8 sec; // second of the minute from 0 to 59
- uint8 gmtOff; // Offset from Greenwich Mean Time in number of 15 minute intervals from -48(West) to +52(East)
+ uint8 year; // Number of years since 1900
+ uint8 month; // Month of the year from 1 to 12
+ uint8 day; // Day of the Month from 1 to 31
+ uint8 hour; // Hour of the day from 0 to 23
+ uint8 min; // Minute of the hour from 0 to 59
+ uint8 sec; // second of the minute from 0 to 59
+ uint8 gmtOff; // Offset from Greenwich Mean Time in number of 15 minute intervals from -48(West) to +52(East)
uint8 padding[10];
} ISOTime __attribute__ ((packed));
typedef struct {
- uint8 year; // Number of years since 1900
- uint8 month; // Month of the year from 1 to 12
- uint8 day; // Day of the Month from 1 to 31
- uint8 hour; // Hour of the day from 0 to 23
- uint8 min; // Minute of the hour from 0 to 59
- uint8 sec; // second of the minute from 0 to 59
- uint8 gmtOff; // Offset from Greenwich Mean Time in number of 15 minute intervals from -48(West) to +52(East)
+ uint8 year; // Number of years since 1900
+ uint8 month; // Month of the year from 1 to 12
+ uint8 day; // Day of the Month from 1 to 31
+ uint8 hour; // Hour of the day from 0 to 23
+ uint8 min; // Minute of the hour from 0 to 59
+ uint8 sec; // second of the minute from 0 to 59
+ uint8 gmtOff; // Offset from Greenwich Mean Time in number of 15 minute intervals from -48(West) to +52(East)
//uint8 padding[10];
} ISOFileTime __attribute__ ((packed));
@@ -96,38 +96,38 @@ typedef struct {
uint8 reserved[6];
uint8 reserved2;
uint8 reserved3;
-} ISORoot __attribute__((packed)); // 0x22
+} ISORoot __attribute__((packed)); // 0x22
typedef struct {
- uint8 type; // 0x00
- char identifier[5]; // 0x01
- uint8 version; // 0x06
- uint8 reserved1; // 0x07
- char systemIdentifier[32]; // 0x08
+ uint8 type; // 0x00
+ char identifier[5]; // 0x01
+ uint8 version; // 0x06
+ uint8 reserved1; // 0x07
+ char systemIdentifier[32]; // 0x08
char volumeIdentifier[32]; // 0x28
- uint8 reserved2[8]; // 0x48
- uint32 volumeSpaceSize; // 0x50
- uint32 volumeSpaceSizeBE; // 0x54
- char reserved3[32]; // 0x58
- uint32 volumeSetSize; // 0x78
- uint32 volumeSequenceNumber; // 0x7C
- uint32 logicalBlockSize; // 0x80
- uint32 pathTableSize; // 0x84
- uint32 pathTableSizeBE; // 0x88
- uint32 pathTablePos; // 0x8C
- uint32 pathTable2Pos; // 0x90
- uint32 pathTablePosBE; // 0x94
- uint32 pathTable2PosBE; // 0x98
- ISORoot rootDir; // 0x9C
- ISOIds ids; // 0xBE
- ISOTime creation; // 0x32D
- ISOTime modification; // 0x33E
- ISOTime expiration; // 0x34F
- ISOTime effective; // 0x360
- uint8 fileStructureVersion; // 0x371
- uint8 reserved4; // 0x372
- uint8 applicationUse[512]; // 0x373
- uint8 reserved5[653]; // 0x573
-} ISOPvd __attribute__ ((packed)); // 0x800
+ uint8 reserved2[8]; // 0x48
+ uint32 volumeSpaceSize; // 0x50
+ uint32 volumeSpaceSizeBE; // 0x54
+ char reserved3[32]; // 0x58
+ uint32 volumeSetSize; // 0x78
+ uint32 volumeSequenceNumber; // 0x7C
+ uint32 logicalBlockSize; // 0x80
+ uint32 pathTableSize; // 0x84
+ uint32 pathTableSizeBE; // 0x88
+ uint32 pathTablePos; // 0x8C
+ uint32 pathTable2Pos; // 0x90
+ uint32 pathTablePosBE; // 0x94
+ uint32 pathTable2PosBE; // 0x98
+ ISORoot rootDir; // 0x9C
+ ISOIds ids; // 0xBE
+ ISOTime creation; // 0x32D
+ ISOTime modification; // 0x33E
+ ISOTime expiration; // 0x34F
+ ISOTime effective; // 0x360
+ uint8 fileStructureVersion; // 0x371
+ uint8 reserved4; // 0x372
+ uint8 applicationUse[512]; // 0x373
+ uint8 reserved5[653]; // 0x573
+} 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 e55e62853b..2a94560843 100644
--- a/backends/platform/ps2/iop/CoDyVDfs/iop/codyvdfs.c
+++ b/backends/platform/ps2/iop/CoDyVDfs/iop/codyvdfs.c
@@ -59,7 +59,7 @@ int verifyDriveReady(void) {
return -1; // drive still not ready
}
}
- if (mediaType == DISC_NONE)
+ if (mediaType == DISC_NONE)
return -1;
return 0;
}
@@ -72,14 +72,14 @@ int cacheEnterDir(ISODirectoryRecord *dir) {
cachedDirOfs = 0;
cacheName = cachedDir + strlen(cachedDir);
memcpy(cacheName, dir->name, dir->len_fi);
- cacheName[dir->len_fi] = '/';
+ cacheName[dir->len_fi] = '/';
cacheName[dir->len_fi + 1] = '\0';
return cdReadSectors(cachedDirLba, 1, cacheBuf, &rmode);
}
int initRootCache(void) {
CdRMode rmode = { 16, 0, CdSect2048, 0 };
- ISODirectoryRecord *root = (ISODirectoryRecord*)cacheBuf;
+ ISODirectoryRecord *root = (ISODirectoryRecord *)cacheBuf;
if (cdReadSectors(fsRootLba, 1, cacheBuf, &rmode) == 0) {
cachedDir[0] = '\0';
@@ -104,10 +104,10 @@ ISODirectoryRecord *findEntryInCache(const char *name, int nameLen) {
if (i != cachedDirOfs) {
if (cdReadSectors(cachedDirLba + i, 1, cacheBuf, &rmode) < 0)
return NULL;
- cachedDirOfs = i;
+ cachedDirOfs = i;
}
- while (entry->len_dr && ((uint8*)entry < cacheBuf + SECTOR_SIZE)) {
+ while (entry->len_dr && ((uint8 *)entry < cacheBuf + SECTOR_SIZE)) {
if ((entry->len_fi > 2) && (entry->name[entry->len_fi - 2] == ';') && (entry->name[entry->len_fi - 1] == '1')) {
if ((nameLen == entry->len_fi - 2) && (strnicmp(name, entry->name, entry->len_fi - 2) == 0))
return entry;
@@ -115,10 +115,10 @@ ISODirectoryRecord *findEntryInCache(const char *name, int nameLen) {
if ((nameLen == entry->len_fi) && (strnicmp(name, entry->name, entry->len_fi) == 0))
return entry;
}
- entry = (ISODirectoryRecord *)( (uint8*)entry + entry->len_dr );
+ entry = (ISODirectoryRecord *)( (uint8 *)entry + entry->len_dr );
}
}
- return NULL;
+ return NULL;
}
ISODirectoryRecord *findPath(const char *path) {
@@ -225,12 +225,12 @@ int initDisc(void) {
case 1:
discType = DISC_MODE1;
printf("Disc: Mode1\n");
- pvd = (ISOPvd*)(cacheBuf + 4);
+ pvd = (ISOPvd *)(cacheBuf + 4);
break;
case 2:
discType = DISC_MODE2;
printf("Disc: Mode2\n");
- pvd = (ISOPvd*)(cacheBuf + 12);
+ pvd = (ISOPvd *)(cacheBuf + 12);
break;
default:
DBG_PRINTF("Unknown Sector Type %02X\n", cacheBuf[3]);
@@ -257,7 +257,7 @@ int initDisc(void) {
mediaType = discType;
DBG_PRINTF("Root directory in sector %d\n", fsRootLba);
- return initRootCache();
+ return initRootCache();
}
}
}
@@ -290,46 +290,46 @@ int cd_init(iop_device_t *dev) {
}
iop_device_ops_t FS_ops = {
- (void *) cd_init,
- (void *) cd_dummy,
- (void *) cd_dummy,
- (void *) cd_open,
- (void *) cd_close,
- (void *) cd_read,
- (void *) cd_dummy,
- (void *) cd_lseek,
- (void *) cd_dummy,
- (void *) cd_dummy,
- (void *) cd_dummy,
- (void *) cd_dummy,
- (void *) cd_dopen,
- (void *) cd_dclose,
- (void *) cd_dread,
- (void *) cd_dummy,
- (void *) cd_dummy,
+ (void *) cd_init,
+ (void *) cd_dummy,
+ (void *) cd_dummy,
+ (void *) cd_open,
+ (void *) cd_close,
+ (void *) cd_read,
+ (void *) cd_dummy,
+ (void *) cd_lseek,
+ (void *) cd_dummy,
+ (void *) cd_dummy,
+ (void *) cd_dummy,
+ (void *) cd_dummy,
+ (void *) cd_dopen,
+ (void *) cd_dclose,
+ (void *) cd_dread,
+ (void *) cd_dummy,
+ (void *) cd_dummy,
};
#define FS_NAME "cdfs"
#define FS_DESC "CD-ROM"
iop_device_t fsdriver = {
- FS_NAME,
- IOP_DT_FS | IOP_DT_FSEXT,
- 1,
- FS_DESC,
- &FS_ops
+ FS_NAME,
+ IOP_DT_FS | IOP_DT_FSEXT,
+ 1,
+ FS_DESC,
+ &FS_ops
};
int _start(void) {
- printf("CoDyVDfs v0.01\n");
+ printf("CoDyVDfs v0.01\n");
CdInit(1);
- DelDrv(FS_NAME);
- AddDrv(&fsdriver);
+ DelDrv(FS_NAME);
+ AddDrv(&fsdriver);
initRpc();
initFio();
- return(0);
+ return(0);
}
int strnicmp(const char *s1, const char *s2, int n) {
diff --git a/backends/platform/ps2/iop/CoDyVDfs/iop/codyvdfs.h b/backends/platform/ps2/iop/CoDyVDfs/iop/codyvdfs.h
index b9f1edc194..cc903ea841 100644
--- a/backends/platform/ps2/iop/CoDyVDfs/iop/codyvdfs.h
+++ b/backends/platform/ps2/iop/CoDyVDfs/iop/codyvdfs.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -51,20 +51,20 @@ enum ReadModes {
};
enum {
- CdDiskNone = 0x00,
- CdDiskDetect, // 0x01
- CdDiskDetectCD, // 0x02
- CdDiskDetectDVD, // 0x03
- CdDiskDetectUnk = 0x05,
- CdDiskCDPS1 = 0x10,
- CdDiskCDDAPS1 = 0x11,
- CdDiskCDPS2 = 0x12,
- CdDiskCDDAPS2 = 0x13,
- CdDiskDVDPS2 = 0x14,
- CdDiskDVDV2 = 0xFC,
- CdDiskCDDA = 0xFD,
- CdDiskDVDV = 0xFE,
- CdDiskIllegal = 0xFF
+ CdDiskNone = 0x00,
+ CdDiskDetect, // 0x01
+ CdDiskDetectCD, // 0x02
+ CdDiskDetectDVD, // 0x03
+ CdDiskDetectUnk = 0x05,
+ CdDiskCDPS1 = 0x10,
+ CdDiskCDDAPS1 = 0x11,
+ CdDiskCDPS2 = 0x12,
+ CdDiskCDDAPS2 = 0x13,
+ CdDiskDVDPS2 = 0x14,
+ CdDiskDVDV2 = 0xFC,
+ CdDiskCDDA = 0xFD,
+ CdDiskDVDV = 0xFE,
+ CdDiskIllegal = 0xFF
};
#define DISC_NOT_READY(type) ((type > CdDiskNone) && (type < CdDiskCDPS1) && (type != CdDiskDetectUnk))
diff --git a/backends/platform/ps2/iop/CoDyVDfs/iop/fiofs.c b/backends/platform/ps2/iop/CoDyVDfs/iop/fiofs.c
index f0a06f927b..611211a715 100644
--- a/backends/platform/ps2/iop/CoDyVDfs/iop/fiofs.c
+++ b/backends/platform/ps2/iop/CoDyVDfs/iop/fiofs.c
@@ -104,7 +104,7 @@ int cd_open(iop_file_t *handle, const char *name, int mode) {
fd->pos = 0;
fd->cachedLba = 0;
- handle->privdata = (void*)fdSlot;
+ handle->privdata = (void *)fdSlot;
return 0;
}
@@ -135,7 +135,7 @@ int cd_read(iop_file_t *handle, void *dest, int length) {
FioHandle *fd = fioHandles + (int)handle->privdata;
CdRMode rmode = { 16, 0, CdSect2048, 0 };
int readLba, readPos, bytesLeft;
- uint8 *destPos = (uint8*)dest;
+ uint8 *destPos = (uint8 *)dest;
int doCopy;
int numLba;
readLba = fd->lba + (fd->pos >> 11);
@@ -171,13 +171,13 @@ int cd_read(iop_file_t *handle, void *dest, int length) {
numLba = bytesLeft >> 11;
if (cdReadSectors(readLba, numLba, destPos, &rmode) != 0)
break;
- readLba += numLba;
+ readLba += numLba;
fd->pos += numLba << 11;
destPos += numLba << 11;
bytesLeft &= 0x7FF;
}
}
- return destPos - (uint8*)dest;
+ return destPos - (uint8 *)dest;
}
int cd_close(iop_file_t *handle) {
@@ -219,7 +219,7 @@ int cd_dopen(iop_file_t *handle, const char *path) {
}
dioHandles[fdSlot].curOfs = 0;
dioHandles[fdSlot].lbaOfs = 0;
- handle->privdata = (void*)fdSlot;
+ handle->privdata = (void *)fdSlot;
return fdSlot;
}
@@ -252,7 +252,7 @@ int cd_dread(iop_file_t *handle, iox_dirent_t *buf) {
}
}
}
- return 0;
+ return 0;
}
int cd_dclose(iop_file_t *handle) {
diff --git a/backends/platform/ps2/iop/CoDyVDfs/iop/fiofs.h b/backends/platform/ps2/iop/CoDyVDfs/iop/fiofs.h
index db942b0b7e..058594a126 100644
--- a/backends/platform/ps2/iop/CoDyVDfs/iop/fiofs.h
+++ b/backends/platform/ps2/iop/CoDyVDfs/iop/fiofs.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/backends/platform/ps2/iop/CoDyVDfs/iop/irx_imports.h b/backends/platform/ps2/iop/CoDyVDfs/iop/irx_imports.h
index 69bbc012f8..393a7ee9a5 100644
--- a/backends/platform/ps2/iop/CoDyVDfs/iop/irx_imports.h
+++ b/backends/platform/ps2/iop/CoDyVDfs/iop/irx_imports.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/backends/platform/ps2/iop/CoDyVDfs/iop/rpcfs.c b/backends/platform/ps2/iop/CoDyVDfs/iop/rpcfs.c
index 5b760faa06..983ae38716 100644
--- a/backends/platform/ps2/iop/CoDyVDfs/iop/rpcfs.c
+++ b/backends/platform/ps2/iop/CoDyVDfs/iop/rpcfs.c
@@ -69,11 +69,11 @@ void *rpcReadClock(void *data) {
void *driveStop(void *data) {
if (CdStop() == 1) {
if (CdSync(0) == 0) {
- *(int*)data = CdGetError();
+ *(int *)data = CdGetError();
} else
- *(int*)data = -0x100;
+ *(int *)data = -0x100;
} else
- *(int*)data = -0x101;
+ *(int *)data = -0x101;
return data;
}
@@ -81,11 +81,11 @@ void *driveStandby(void *data) {
int type;
if (CdStandby() == 1) {
if (CdSync(0) == 0) {
- *(int*)data = CdGetError();
+ *(int *)data = CdGetError();
} else
- *(int*)data = -0x100;
+ *(int *)data = -0x100;
} else
- *(int*)data = -0x101;
+ *(int *)data = -0x101;
do { // wait until drive detected disc type
type = CdGetDiskType();
diff --git a/backends/platform/ps2/iop/rpckbd/include/ps2kbd.h b/backends/platform/ps2/iop/rpckbd/include/ps2kbd.h
index 07d9c3d7f9..6bef7caefa 100644
--- a/backends/platform/ps2/iop/rpckbd/include/ps2kbd.h
+++ b/backends/platform/ps2/iop/rpckbd/include/ps2kbd.h
@@ -87,8 +87,8 @@ typedef struct _kbd_keymap
#define KBD_RPC_SETSPECIALMAP 7 /* Sets the special key mapping */
#define KBD_RPC_FLUSHBUFFER 9 /* Flush the internal buffer, probably best after a keymap change */
#define KBD_RPC_RESETKEYMAP 10 /* Reset keymaps to default states */
-#define KBD_RPC_READKEY 11
-#define KBD_RPC_READRAW 12
+#define KBD_RPC_READKEY 11
+#define KBD_RPC_READRAW 12
/* Note on keymaps. In normal keymap a 0 would indicate no key */
/* Key maps are represented by 3 256*8bit tables. First table maps USB key to a char when not shifted */
diff --git a/backends/platform/ps2/iop/rpckbd/src/irx_imports.h b/backends/platform/ps2/iop/rpckbd/src/irx_imports.h
index f7d0656bda..193db4f02a 100644
--- a/backends/platform/ps2/iop/rpckbd/src/irx_imports.h
+++ b/backends/platform/ps2/iop/rpckbd/src/irx_imports.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/backends/platform/ps2/iop/rpckbd/src/ps2kbd.c b/backends/platform/ps2/iop/rpckbd/src/ps2kbd.c
index 7266afdce5..838ce9fe85 100644
--- a/backends/platform/ps2/iop/rpckbd/src/ps2kbd.c
+++ b/backends/platform/ps2/iop/rpckbd/src/ps2kbd.c
@@ -1089,7 +1089,7 @@ void *ps2kbd_rpc_server(int fno, void *data, int size) {
ps2kbd_rpc_flushbuffer();
break;
case KBD_RPC_SETLEDS:
- ps2kbd_rpc_setleds(*(u8*) data);
+ ps2kbd_rpc_setleds(*(u8 *) data);
break;
case KBD_RPC_RESETKEYMAP:
ps2kbd_rpc_resetkeymap();
@@ -1129,7 +1129,7 @@ int ps2kbd_init_rpc(void) {
int th;
param.attr = 0x02000000;
- param.thread = (void*)ps2kbd_start_rpc;
+ param.thread = (void *)ps2kbd_start_rpc;
param.priority = 40;
param.stacksize = 0x800;
param.option = 0;
diff --git a/backends/platform/ps2/irxboot.cpp b/backends/platform/ps2/irxboot.cpp
index aa904d4f5b..0e05047c6e 100644
--- a/backends/platform/ps2/irxboot.cpp
+++ b/backends/platform/ps2/irxboot.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -34,37 +34,65 @@
static const char hddArg[] = "-o" "\0" "8" "\0" "-n" "\0" "20";
static const char pfsArg[] = "-m" "\0" "2" "\0" "-o" "\0" "32" "\0" "-n" "\0" "72"; // "\0" "-debug";
-static const char netArg[] = "192.168.0.10" "\0" "255.255.255.0" "\0" "192.168.0.1";
-
-IrxFile irxFiles[] = {
- { "SIO2MAN", BIOS, NOTHING, NULL, 0 },
- { "MCMAN", BIOS, NOTHING, NULL, 0 },
- { "MCSERV", BIOS, NOTHING, NULL, 0 },
- { "PADMAN", BIOS, NOTHING, NULL, 0 },
- { "LIBSD", BIOS, NOTHING, NULL, 0 },
-
- { "IOMANX.IRX", SYSTEM, NOTHING, NULL, 0 },
- { "FILEXIO.IRX", SYSTEM, NOTHING, NULL, 0 },
- { "CODYVDFS.IRX", SYSTEM, NOTHING, NULL, 0 },
+static const char netArg[] = "192.168.1.20" "\0" "255.255.255.0" "\0" "192.168.1.1"; // TODO: set in ScummVM.ini
+
+IrxFile irxCore[] = { // core modules
+ // Memory Card
+ { "SIO2MAN", BIOS, NOTHING, NULL, 0 },
+ { "MCMAN", BIOS, NOTHING, NULL, 0 },
+ { "MCSERV", BIOS, NOTHING, NULL, 0 },
+ // Joypad
+ { "PADMAN", BIOS, NOTHING, NULL, 0 },
+ // Sound
+ { "LIBSD", BIOS, NOTHING, NULL, 0 },
{ "SJPCM.IRX", SYSTEM, NOTHING, NULL, 0 },
+ // Files I/O
+ { "IOMANX.IRX", SYSTEM, NOTHING, NULL, 0 },
+ { "FILEXIO.IRX", SYSTEM, NOTHING, NULL, 0 }
+};
+
+IrxFile irxCdrom[] = { // cdrom modules
+ // CD-Rom FS
+ { "CODYVDFS.IRX", SYSTEM, CD_DRIVER, NULL, 0 }
+};
+IrxFile irxUSB[] = { // USB mass
+ // USB drv & key
{ "USBD.IRX", USB | OPTIONAL | DEPENDANCY, USB_DRIVER, NULL, 0 },
- { "USB_MASS.IRX", USB | OPTIONAL, MASS_DRIVER, NULL, 0 },
+ { "USB_MASS.IRX", USB | OPTIONAL, MASS_DRIVER, NULL, 0 }
+};
+
+IrxFile irxInput[] = { // USB input
+ // USB mouse & kbd
{ "PS2MOUSE.IRX", USB | OPTIONAL, MOUSE_DRIVER, NULL, 0 },
- { "RPCKBD.IRX", USB | OPTIONAL, KBD_DRIVER, NULL, 0 },
-#ifndef NO_ADAPTOR
+ { "RPCKBD.IRX", USB | OPTIONAL, KBD_DRIVER, NULL, 0 }
+};
+
+IrxFile irxHDD[] = { // modules to support HDD
+ // hdd modules
{ "POWEROFF.IRX", HDD | OPTIONAL | NOT_HOST | DEPENDANCY, HDD_DRIVER, NULL, 0 },
{ "PS2DEV9.IRX", HDD | OPTIONAL | NOT_HOST | DEPENDANCY, HDD_DRIVER, NULL, 0 },
{ "PS2ATAD.IRX", HDD | OPTIONAL | DEPENDANCY, HDD_DRIVER, NULL, 0 },
{ "PS2HDD.IRX", HDD | OPTIONAL | DEPENDANCY, HDD_DRIVER, hddArg, sizeof(hddArg) },
- { "PS2FS.IRX", HDD | OPTIONAL | DEPENDANCY, HDD_DRIVER, pfsArg, sizeof(pfsArg) },
+ { "PS2FS.IRX", HDD | OPTIONAL | DEPENDANCY, HDD_DRIVER, pfsArg, sizeof(pfsArg) }
+};
+
+IrxFile irxNet[] = { // modules to support NET
+ // net modules
{ "PS2IP.IRX", NET | OPTIONAL | NOT_HOST | DEPENDANCY, NET_DRIVER, NULL, 0 },
{ "PS2SMAP.IRX", NET | OPTIONAL | NOT_HOST | DEPENDANCY, NET_DRIVER, netArg, sizeof(netArg) },
{ "PS2HOST.IRX", NET | OPTIONAL | NOT_HOST | DEPENDANCY, NET_DRIVER, NULL, 0 }
-#endif
};
-static const int numIrxFiles = sizeof(irxFiles) / sizeof(irxFiles[0]);
+IrxFile *irxType[IRX_MAX] = { irxCore, irxCdrom, irxUSB, irxInput, irxHDD, irxNet };
+
+static const int numIrx[IRX_MAX] = { sizeof(irxCore) / sizeof(IrxFile),
+ sizeof(irxCdrom) / sizeof(IrxFile),
+ sizeof(irxUSB) / sizeof(IrxFile),
+ sizeof(irxInput) / sizeof(IrxFile),
+ sizeof(irxHDD) / sizeof(IrxFile),
+ sizeof(irxNet) / sizeof(IrxFile)
+};
PS2Device detectBootPath(const char *elfPath, char *bootPath) {
@@ -113,19 +141,26 @@ PS2Device detectBootPath(const char *elfPath, char *bootPath) {
return device;
}
-int loadIrxModules(int device, const char *irxPath, IrxReference **modules) {
+int loadIrxModules(int device, const char *irxPath, IrxReference **modules, IrxType type) {
+
+ IrxReference *resModules;
+ IrxReference *curModule;
+ IrxFile *irxFiles;
+ int numFiles;
- IrxReference *resModules = (IrxReference *)malloc(numIrxFiles * sizeof(IrxReference));
- IrxReference *curModule = resModules;
+ irxFiles = irxType[type];
+ numFiles = numIrx[type];
+ resModules = (IrxReference *)memalign(64, numFiles * sizeof(IrxReference));
+ curModule = resModules;
- for (int i = 0; i < numIrxFiles; i++) {
+ for (int i = 0; i < numFiles; i++) {
curModule->fileRef = irxFiles + i;
if ((device == HOST_DEV) && (irxFiles[i].flags & NOT_HOST))
continue;
if ((irxFiles[i].flags & TYPEMASK) == BIOS) {
curModule->loc = IRX_FILE;
- curModule->path = (char *)malloc(32);
+ curModule->path = (char *)memalign(64, 32);
sprintf(curModule->path, "rom0:%s", irxFiles[i].name);
curModule->buffer = NULL;
curModule->size = 0;
@@ -134,7 +169,7 @@ int loadIrxModules(int device, const char *irxPath, IrxReference **modules) {
curModule->errorCode = 0;
} else {
curModule->loc = IRX_BUFFER;
- curModule->path = (char *)malloc(256);
+ curModule->path = (char *)memalign(64, 256);
sprintf(curModule->path, "%s%s%s", irxPath, irxFiles[i].name, (device == CD_DEV) ? ";1" : "");
int fd = fioOpen(curModule->path, O_RDONLY);
@@ -191,7 +226,7 @@ int loadIrxModules(int device, const char *irxPath, IrxReference **modules) {
pos++;
}
// and skip any remaining modules that depend on the missing one, too.
- while ((i < numIrxFiles - 1) && ((irxFiles[i + 1].flags & TYPEMASK) == (curModule->fileRef->flags & TYPEMASK)))
+ while ((i < numFiles - 1) && ((irxFiles[i + 1].flags & TYPEMASK) == (curModule->fileRef->flags & TYPEMASK)))
i++;
// the module that actually failed (curModule) is kept in the array for displaying an error message
}
diff --git a/backends/platform/ps2/irxboot.h b/backends/platform/ps2/irxboot.h
index 81b47a37c6..487d335553 100644
--- a/backends/platform/ps2/irxboot.h
+++ b/backends/platform/ps2/irxboot.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -25,6 +25,16 @@
#include "common/scummsys.h"
+enum IrxType {
+ IRX_CORE = 0,
+ IRX_CDROM,
+ IRX_USB,
+ IRX_INPUT,
+ IRX_HDD,
+ IRX_NET,
+ IRX_MAX
+};
+
enum IrxFlags {
BIOS = 0,
SYSTEM = 1,
@@ -40,6 +50,7 @@ enum IrxFlags {
enum IrxPurpose {
NOTHING,
+ CD_DRIVER,
HDD_DRIVER,
USB_DRIVER,
MOUSE_DRIVER,
@@ -81,6 +92,6 @@ struct IrxReference {
int errorCode;
};
-int loadIrxModules(int device, const char *irxPath, IrxReference **modules);
+int loadIrxModules(int device, const char *irxPath, IrxReference **modules, IrxType type);
#endif // __IRXBOOT_H__
diff --git a/backends/platform/ps2/module.mk b/backends/platform/ps2/module.mk
index bf95a5501d..7bcc60e58d 100644
--- a/backends/platform/ps2/module.mk
+++ b/backends/platform/ps2/module.mk
@@ -2,20 +2,20 @@ MODULE := backends/platform/ps2
MODULE_OBJS := \
DmaPipe.o \
- Gs2dScreen.o \
- irxboot.o \
+ Gs2dScreen.o \
+ irxboot.o \
ps2input.o \
ps2pad.o \
savefilemgr.o \
- fileio.o \
- asyncfio.o \
+ fileio.o \
+ asyncfio.o \
icon.o \
- cd.o \
- eecodyvdfs.o \
- rpckbd.o \
- systemps2.o \
- ps2mutex.o \
- ps2time.o \
+ cd.o \
+ eecodyvdfs.o \
+ rpckbd.o \
+ systemps2.o \
+ ps2mutex.o \
+ ps2time.o \
ps2debug.o
# We don't use rules.mk but rather manually update OBJS and MODULE_DIRS.
diff --git a/backends/platform/ps2/ps2debug.cpp b/backends/platform/ps2/ps2debug.cpp
index 300e18316f..84c3649faf 100644
--- a/backends/platform/ps2/ps2debug.cpp
+++ b/backends/platform/ps2/ps2debug.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -22,10 +22,10 @@
#include "ps2debug.h"
#include <stdio.h>
-#include <stdlib.h>
#include <sio.h>
void sioprintf(const char *zFormat, ...) {
+ #if 0 // doesn't seem to work with ps2link...
va_list ap;
char resStr[2048];
@@ -43,4 +43,5 @@ void sioprintf(const char *zFormat, ...) {
sio_putc(*pos);
pos++;
}
+ #endif
}
diff --git a/backends/platform/ps2/ps2debug.h b/backends/platform/ps2/ps2debug.h
index 02831e0623..45db850ebf 100644
--- a/backends/platform/ps2/ps2debug.h
+++ b/backends/platform/ps2/ps2debug.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -23,7 +23,13 @@
#ifndef __PS2DEBUG_H__
#define __PS2DEBUG_H__
-#define dbg_printf printf
+#ifdef LOGORRHEIC
+ #define FORBIDDEN_SYMBOL_EXCEPTION_printf
+ // #define dbg_printf sio_printf
+ #define dbg_printf printf
+#else
+ #define dbg_printf(...) /* ... */
+#endif
void sioprintf(const char *zFormat, ...);
diff --git a/backends/platform/ps2/ps2input.cpp b/backends/platform/ps2/ps2input.cpp
index 6f36c5ff90..636176e06c 100644
--- a/backends/platform/ps2/ps2input.cpp
+++ b/backends/platform/ps2/ps2input.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -170,7 +170,7 @@ bool Ps2Input::pollEvent(Common::Event *event) {
}
if (checkPadMouse || checkPadKbd) {
// no usb mouse, simulate it using the pad
- uint16 buttons;
+ uint16 buttons;
int16 joyh, joyv;
_pad->readPad(&buttons, &joyh, &joyv);
uint16 btnChange = buttons ^ _padLastButtons;
@@ -474,11 +474,11 @@ const Common::KeyCode Ps2Input::_usbToSdlk[0x100] = {
/* DD */ Common::KEYCODE_INVALID,
/* DE */ Common::KEYCODE_INVALID,
/* DF */ Common::KEYCODE_INVALID,
- /* E0 */ Common::KEYCODE_LCTRL,
+ /* E0 */ Common::KEYCODE_LCTRL,
/* E1 */ Common::KEYCODE_LSHIFT,
/* E2 */ Common::KEYCODE_LALT,
/* E3 */ Common::KEYCODE_INVALID,
- /* E4 */ Common::KEYCODE_RCTRL,
+ /* E4 */ Common::KEYCODE_RCTRL,
/* E5 */ Common::KEYCODE_RSHIFT,
/* E6 */ Common::KEYCODE_RALT,
/* E7 */ Common::KEYCODE_INVALID,
@@ -509,39 +509,39 @@ const Common::KeyCode Ps2Input::_usbToSdlk[0x100] = {
};
const Common::KeyCode Ps2Input::_padCodes[16] = {
- Common::KEYCODE_1, // Select
- Common::KEYCODE_INVALID, // L3
- Common::KEYCODE_INVALID, // R3
- Common::KEYCODE_F5, // Start
- Common::KEYCODE_INVALID, // Up
- Common::KEYCODE_INVALID, // Right
- Common::KEYCODE_INVALID, // Down
- Common::KEYCODE_INVALID, // Left
- Common::KEYCODE_KP0, // L2
- Common::KEYCODE_PERIOD, // R2
- Common::KEYCODE_n, // L1
- Common::KEYCODE_y, // R1
- Common::KEYCODE_ESCAPE, // Triangle
- Common::KEYCODE_INVALID, // Circle => Right mouse button
- Common::KEYCODE_INVALID, // Cross => Left mouse button
- Common::KEYCODE_RETURN // Square
+ Common::KEYCODE_1, // Select
+ Common::KEYCODE_INVALID, // L3
+ Common::KEYCODE_INVALID, // R3
+ Common::KEYCODE_F5, // Start
+ Common::KEYCODE_INVALID, // Up
+ Common::KEYCODE_INVALID, // Right
+ Common::KEYCODE_INVALID, // Down
+ Common::KEYCODE_INVALID, // Left
+ Common::KEYCODE_KP0, // L2
+ Common::KEYCODE_PERIOD, // R2
+ Common::KEYCODE_n, // L1
+ Common::KEYCODE_y, // R1
+ Common::KEYCODE_ESCAPE, // Triangle
+ Common::KEYCODE_INVALID, // Circle => Right mouse button
+ Common::KEYCODE_INVALID, // Cross => Left mouse button
+ Common::KEYCODE_RETURN // Square
};
const Common::KeyCode Ps2Input::_padFlags[16] = {
- Common::KEYCODE_INVALID, // Select
- Common::KEYCODE_INVALID, // L3
- Common::KEYCODE_INVALID, // R3
- Common::KEYCODE_INVALID, // Start
- Common::KEYCODE_INVALID, // Up
- Common::KEYCODE_INVALID, // Right
- Common::KEYCODE_INVALID, // Down
- Common::KEYCODE_INVALID, // Left
- Common::KEYCODE_INVALID, // L2
- Common::KEYCODE_INVALID, // R2
- Common::KEYCODE_INVALID, // L1
- Common::KEYCODE_INVALID, // R1
- Common::KEYCODE_INVALID, // Triangle
- Common::KEYCODE_INVALID, // Circle
- Common::KEYCODE_INVALID, // Cross
- Common::KEYCODE_INVALID // Square
+ Common::KEYCODE_INVALID, // Select
+ Common::KEYCODE_INVALID, // L3
+ Common::KEYCODE_INVALID, // R3
+ Common::KEYCODE_INVALID, // Start
+ Common::KEYCODE_INVALID, // Up
+ Common::KEYCODE_INVALID, // Right
+ Common::KEYCODE_INVALID, // Down
+ Common::KEYCODE_INVALID, // Left
+ Common::KEYCODE_INVALID, // L2
+ Common::KEYCODE_INVALID, // R2
+ Common::KEYCODE_INVALID, // L1
+ Common::KEYCODE_INVALID, // R1
+ Common::KEYCODE_INVALID, // Triangle
+ Common::KEYCODE_INVALID, // Circle
+ Common::KEYCODE_INVALID, // Cross
+ Common::KEYCODE_INVALID // Square
};
diff --git a/backends/platform/ps2/ps2input.h b/backends/platform/ps2/ps2input.h
index b97daac042..af413d262c 100644
--- a/backends/platform/ps2/ps2input.h
+++ b/backends/platform/ps2/ps2input.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -44,7 +44,7 @@ private:
int mapKey(int key, int mod);
bool getKeyEvent(Common::Event *event, uint16 buttonCode, bool down);
OSystem_PS2 *_system;
- Ps2Pad *_pad;
+ Ps2Pad *_pad;
uint16 _minx, _maxx, _miny, _maxy;
diff --git a/backends/platform/ps2/ps2mutex.cpp b/backends/platform/ps2/ps2mutex.cpp
index ae63fe5724..440a7e2cce 100644
--- a/backends/platform/ps2/ps2mutex.cpp
+++ b/backends/platform/ps2/ps2mutex.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/backends/platform/ps2/ps2pad.cpp b/backends/platform/ps2/ps2pad.cpp
index 607b614691..d990690331 100644
--- a/backends/platform/ps2/ps2pad.cpp
+++ b/backends/platform/ps2/ps2pad.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -34,7 +34,7 @@ Ps2Pad::Ps2Pad(OSystem_PS2 *system) {
_padStatus = STAT_NONE;
padInit(0); // initialize library
- _port = _slot = 0; // first controller, no multitap
+ _port = _slot = 0; // first controller, no multitap
initPad();
}
@@ -51,9 +51,6 @@ void Ps2Pad::initPad(void) {
} else {
if (checkPadReady(_port, _slot)) {
switch (_padStatus) {
- case STAT_NONE:
- printf("Pad Status is None. Shouldn't happen\n");
- break;
case STAT_OPEN:
_padStatus = STAT_DETECT;
break;
@@ -104,7 +101,8 @@ void Ps2Pad::initPad(void) {
_padStatus = STAT_OKAY;
break;
case STAT_OKAY:
- // pad is already initialized
+ case STAT_NONE:
+ // pad is already initialized (or not there)
break;
}
} else {
diff --git a/backends/platform/ps2/ps2pad.h b/backends/platform/ps2/ps2pad.h
index aebb3c6339..0457cd46bb 100644
--- a/backends/platform/ps2/ps2pad.h
+++ b/backends/platform/ps2/ps2pad.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/backends/platform/ps2/ps2temp.h b/backends/platform/ps2/ps2temp.h
index afffc6de2b..acfd3c7800 100644
--- a/backends/platform/ps2/ps2temp.h
+++ b/backends/platform/ps2/ps2temp.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/backends/platform/ps2/ps2time.cpp b/backends/platform/ps2/ps2time.cpp
index 1cddd230a0..e072ce9483 100644
--- a/backends/platform/ps2/ps2time.cpp
+++ b/backends/platform/ps2/ps2time.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -30,9 +30,9 @@
#define FROM_BCD(a) ((a >> 4) * 10 + (a & 0xF))
-static int g_timeSecs;
-static int g_day, g_month, g_year;
-static int g_lastTimeCheck;
+static int g_timeSecs;
+static int g_day, g_month, g_year;
+static int g_lastTimeCheck;
extern volatile uint32 msecCount;
void buildNewDate(int dayDiff) {
diff --git a/backends/platform/ps2/rpckbd.c b/backends/platform/ps2/rpckbd.c
index 0bb45208f5..e7975ab484 100644
--- a/backends/platform/ps2/rpckbd.c
+++ b/backends/platform/ps2/rpckbd.c
@@ -17,7 +17,7 @@
#include <string.h>
#include "backends/platform/ps2/rpckbd.h"
-static int curr_readmode = PS2KBD_READMODE_NORMAL;
+static unsigned int curr_readmode = PS2KBD_READMODE_NORMAL;
static int kbdRpcSema = -1;
static int kbdInitialized = 0;
diff --git a/backends/platform/ps2/rpckbd.h b/backends/platform/ps2/rpckbd.h
index bffd8e5be5..22cbbb4d21 100644
--- a/backends/platform/ps2/rpckbd.h
+++ b/backends/platform/ps2/rpckbd.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/backends/platform/ps2/savefilemgr.cpp b/backends/platform/ps2/savefilemgr.cpp
index 46af42e193..4fd2b1c72b 100644
--- a/backends/platform/ps2/savefilemgr.cpp
+++ b/backends/platform/ps2/savefilemgr.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -21,8 +21,6 @@
*/
#define FORBIDDEN_SYMBOL_EXCEPTION_printf
-#define FORBIDDEN_SYMBOL_EXCEPTION_mkdir
-#define FORBIDDEN_SYMBOL_EXCEPTION_unistd_h
#include "common/config-manager.h"
#include "common/zlib.h"
@@ -37,6 +35,7 @@
#include "savefilemgr.h"
#include "Gs2dScreen.h"
#include "ps2temp.h"
+#include "ps2debug.h"
extern AsyncFio fio;
@@ -57,20 +56,20 @@ bool Ps2SaveFileManager::mcCheck(const char *path) {
// int res;
- printf("mcCheck\n");
+ dbg_printf("mcCheck\n");
if (!dir.exists()) {
- printf("! exist -> create : ");
+ dbg_printf("! exist -> create : ");
#ifdef __USE_LIBMC__
- printf("%s\n", path+4);
+ dbg_printf("%s\n", path+4);
// WaitSema(_sema);
mcSync(0, NULL, NULL);
mcMkDir(0 /*port*/, 0 /*slot*/, path+4);
mcSync(0, NULL, &res);
- printf("sync : %d\n", res);
+ dbg_printf("sync : %d\n", res);
// SignalSema(_sema);
#else
- printf("%s\n", path);
+ dbg_printf("%s\n", path);
fio.mkdir(path);
#endif
}
@@ -108,7 +107,7 @@ Common::InSaveFile *Ps2SaveFileManager::openForLoading(const Common::String &fil
}
else {
char temp[32];
- printf("MC : filename = %s\n", filename.c_str());
+ dbg_printf("MC : filename = %s\n", filename.c_str());
strcpy(temp, filename.c_str());
// mcSplit(temp, game, ext);
@@ -149,7 +148,7 @@ Common::OutSaveFile *Ps2SaveFileManager::openForSaving(const Common::String &fil
Common::FSNode savePath(ConfMan.get("savepath")); // TODO: is this fast?
Common::WriteStream *sf;
- printf("openForSaving : %s\n", filename.c_str());
+ dbg_printf("openForSaving : %s\n", filename.c_str());
if (!savePath.exists() || !savePath.isDirectory())
return NULL;
@@ -166,10 +165,10 @@ Common::OutSaveFile *Ps2SaveFileManager::openForSaving(const Common::String &fil
sprintf(path, "mc0:ScummVM/indy4/iq-points");
}
// FIXME : hack for bs1 saved games
- else if (filename == "SAVEGAME.INF") {
- mcCheck("mc0:ScummVM/sword1");
- sprintf(path, "mc0:ScummVM/sword1/SAVEGAME.INF");
- }
+ else if (filename == "SAVEGAME.INF") {
+ mcCheck("mc0:ScummVM/sword1");
+ sprintf(path, "mc0:ScummVM/sword1/SAVEGAME.INF");
+ }
else {
char temp[32];
strcpy(temp, filename.c_str());
@@ -240,7 +239,7 @@ Common::StringArray Ps2SaveFileManager::listSavefiles(const Common::String &patt
if (!savePath.exists() || !savePath.isDirectory())
return Common::StringArray();
- printf("listSavefiles = %s\n", pattern.c_str());
+ dbg_printf("listSavefiles = %s\n", pattern.c_str());
if (_mc) {
strcpy(temp, pattern.c_str());
@@ -263,7 +262,7 @@ Common::StringArray Ps2SaveFileManager::listSavefiles(const Common::String &patt
Common::ArchiveMemberList savefiles;
Common::StringArray results;
- printf("dir = %s --- reg = %s\n", _dir.c_str(), search.c_str());
+ dbg_printf("dir = %s --- reg = %s\n", _dir.c_str(), search.c_str());
if (dir.listMatchingMembers(savefiles, search) > 0) {
for (Common::ArchiveMemberList::const_iterator file = savefiles.begin(); file != savefiles.end(); ++file) {
@@ -272,11 +271,11 @@ Common::StringArray Ps2SaveFileManager::listSavefiles(const Common::String &patt
temp[3] = '\0';
sprintf(path, "%s.%s", game, temp);
results.push_back(path);
- printf(" --> found = %s -> %s\n", (*file)->getName().c_str(), path);
+ dbg_printf(" --> found = %s -> %s\n", (*file)->getName().c_str(), path);
}
else {
results.push_back((*file)->getName());
- printf(" --> found = %s\n", (*file)->getName().c_str());
+ dbg_printf(" --> found = %s\n", (*file)->getName().c_str());
}
}
}
diff --git a/backends/platform/ps2/savefilemgr.h b/backends/platform/ps2/savefilemgr.h
index 163706eace..547f16fa77 100644
--- a/backends/platform/ps2/savefilemgr.h
+++ b/backends/platform/ps2/savefilemgr.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/backends/platform/ps2/sysdefs.h b/backends/platform/ps2/sysdefs.h
index 0114402233..c886d70eef 100644
--- a/backends/platform/ps2/sysdefs.h
+++ b/backends/platform/ps2/sysdefs.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -40,30 +40,30 @@ enum Interrupts {
};
// dma 2 registers
-#define D2_CHCR (*(volatile uint32*)0x1000A000)
-#define D2_QWC (*(volatile uint32*)0x1000A020)
-#define D2_TADR (*(volatile uint32*)0x1000A030)
-#define D2_MADR (*(volatile uint32*)0x1000A010)
-#define D2_ASR1 (*(volatile uint32*)0x1000A050)
-#define D2_ASR0 (*(volatile uint32*)0x1000A040)
+#define D2_CHCR (*(volatile uint32 *)0x1000A000)
+#define D2_QWC (*(volatile uint32 *)0x1000A020)
+#define D2_TADR (*(volatile uint32 *)0x1000A030)
+#define D2_MADR (*(volatile uint32 *)0x1000A010)
+#define D2_ASR1 (*(volatile uint32 *)0x1000A050)
+#define D2_ASR0 (*(volatile uint32 *)0x1000A040)
-#define D_CTRL (*(volatile uint32*)0x1000E000)
-#define D_STAT (*(volatile uint32*)0x1000E010)
-#define D_PCR (*(volatile uint32*)0x1000E020)
-#define D_SQWC (*(volatile uint32*)0x1000E030)
-#define D_RBSR (*(volatile uint32*)0x1000E040)
-#define D_RBOR (*(volatile uint32*)0x1000E050)
-#define D_STADR (*(volatile uint32*)0x1000E060)
+#define D_CTRL (*(volatile uint32 *)0x1000E000)
+#define D_STAT (*(volatile uint32 *)0x1000E010)
+#define D_PCR (*(volatile uint32 *)0x1000E020)
+#define D_SQWC (*(volatile uint32 *)0x1000E030)
+#define D_RBSR (*(volatile uint32 *)0x1000E040)
+#define D_RBOR (*(volatile uint32 *)0x1000E050)
+#define D_STADR (*(volatile uint32 *)0x1000E060)
#define CIM2 (1 << 18)
#define CIS2 (1 << 2)
// timer 0 registers
-#define T0_COUNT (*(volatile uint32*)0x10000000)
-#define T0_MODE (*(volatile uint32*)0x10000010)
-#define T0_COMP (*(volatile uint32*)0x10000020)
-#define T0_HOLD (*(volatile uint32*)0x10000030)
+#define T0_COUNT (*(volatile uint32 *)0x10000000)
+#define T0_MODE (*(volatile uint32 *)0x10000010)
+#define T0_COMP (*(volatile uint32 *)0x10000020)
+#define T0_HOLD (*(volatile uint32 *)0x10000030)
#define TIMER_MODE(clks, gate, gates, gatem, zeroret, cue, cmpe, ovfe, equf, ovff) \
((clks) | ((gate) << 2) | ((gates) << 3) | ((gatem) << 4) | ((zeroret) << 6) | \
diff --git a/backends/platform/ps2/systemps2.cpp b/backends/platform/ps2/systemps2.cpp
index a7d782b07c..1aa74b7d9b 100644
--- a/backends/platform/ps2/systemps2.cpp
+++ b/backends/platform/ps2/systemps2.cpp
@@ -8,20 +8,21 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public 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
+// Disable symbol overrides so that we can use "FILE"
+#define FORBIDDEN_SYMBOL_EXCEPTION_FILE
+#define FORBIDDEN_SYMBOL_EXCEPTION_printf
#include <kernel.h>
#include <stdio.h>
@@ -50,7 +51,6 @@
#include "backends/platform/ps2/cd.h"
#include "backends/platform/ps2/fileio.h"
#include "backends/platform/ps2/Gs2dScreen.h"
-#include "backends/platform/ps2/irxboot.h"
#include "backends/platform/ps2/ps2debug.h"
#include "backends/platform/ps2/ps2input.h"
#include "backends/platform/ps2/savefilemgr.h"
@@ -112,7 +112,11 @@ extern "C" int scummvm_main(int argc, char *argv[]);
extern "C" int main(int argc, char *argv[]) {
SifInitRpc(0);
+ #ifdef __NEW_PS2SDK__
+ ee_thread_status_t thisThread;
+ #else
ee_thread_t thisThread;
+ #endif
int tid = GetThreadId();
ReferThreadStatus(tid, &thisThread);
@@ -147,6 +151,10 @@ extern "C" int main(int argc, char *argv[]) {
g_systemPs2->quit();
+#ifdef ENABLE_PROFILING
+ // make sure we can flush "gmon.out"
+ fileXioSetBlockMode(FXIO_WAIT);
+#endif
// control never gets here
return res;
}
@@ -184,13 +192,11 @@ void systemSoundThread(OSystem_PS2 *system) {
}
void gluePowerOffCallback(void *system) {
- ((OSystem_PS2*)system)->powerOffCallback();
+ ((OSystem_PS2 *)system)->powerOffCallback();
}
void OSystem_PS2::startIrxModules(int numModules, IrxReference *modules) {
- _usbMassLoaded = _useMouse = _useKbd = _useHdd = _useNet = false;
-
int res = 0, rv = 0;
for (int i = 0; i < numModules; i++) {
if (modules[i].loc == IRX_FILE) {
@@ -216,6 +222,9 @@ void OSystem_PS2::startIrxModules(int numModules, IrxReference *modules) {
case KBD_DRIVER:
_useKbd = true;
break;
+ case CD_DRIVER:
+ _useCd = true;
+ break;
case HDD_DRIVER:
_useHdd = true;
break;
@@ -241,20 +250,79 @@ void OSystem_PS2::startIrxModules(int numModules, IrxReference *modules) {
}
if (modules[i].buffer)
- free(modules[i].buffer);
+ ; // free(modules[i].buffer);
} else {
sioprintf("module %d of %d damaged, loc %d, path %s\n", i, numModules, modules[i].loc, modules[i].path);
}
- free(modules[i].path);
+ // free(modules[i].path);
}
- free(modules);
+ // free(modules);
sioprintf("done\n");
sioprintf("UsbMass: %sloaded\n", _usbMassLoaded ? "" : "not ");
sioprintf("Mouse: %sloaded\n", _useMouse ? "" : "not ");
sioprintf("Kbd: %sloaded\n", _useKbd ? "" : "not ");
+ sioprintf("Cd: %sloaded\n", _useCd ? "" : "not ");
sioprintf("Hdd: %sloaded\n", _useHdd ? "" : "not ");
}
+bool OSystem_PS2::loadDrivers(IrxType type)
+{
+ IrxReference *modules;
+ int numModules;
+ int res;
+
+ numModules = loadIrxModules(_bootDevice, _bootPath, &modules, type);
+ // TODO: for IRX_NET allows override IP addr
+ startIrxModules(numModules, modules);
+
+ switch (type) {
+ case IRX_CORE:
+ /* Init I/O */
+ if ((res = fileXioInit()) < 0) {
+ msgPrintf(FOREVER, "FXIO init failed: %d", res);
+ quit();
+ }
+ /* Init sound */
+ if ((res = SjPCM_Init(0)) < 0) {
+ msgPrintf(FOREVER, "SjPCM bind failed: %d\n", res);
+ quit();
+ }
+ break;
+
+ case IRX_CDROM:
+ /* Init CDROM & RTC Clock */
+ if ((res = initCdvdFs()) < 0) {
+ msgPrintf(FOREVER, "CoDyVDfs bind failed: %d", res);
+ quit();
+ }
+ sioprintf("Reading RTC\n");
+ readRtcTime(); /* depends on CDROM driver! */
+ break;
+
+ case IRX_HDD:
+ /* Check HD is available and formatted */
+ if ((hddCheckPresent() < 0) || (hddCheckFormatted() < 0)) {
+ _useHdd = false;
+ }
+ else {
+ poweroffInit();
+ poweroffSetCallback(gluePowerOffCallback, this);
+ }
+ break;
+
+ case IRX_NET:
+ if (_bootDevice == HOST_DEV) // net is pre-loaded on host
+ _useNet = true; // so we need to set by hand
+ break;
+
+ default:
+ /* zzz */
+ break;
+ }
+
+ return true;
+}
+
OSystem_PS2::OSystem_PS2(const char *elfPath) {
_soundStack = _timerStack = NULL;
_printY = 0;
@@ -262,20 +330,19 @@ OSystem_PS2::OSystem_PS2(const char *elfPath) {
_systemQuit = false;
_modeChanged = false;
_screenChangeCount = 0;
+ _mouseVisible = false;
- _screen = new Gs2dScreen(320, 200, TV_DONT_CARE);
+ // _screen = new Gs2dScreen(320, 200, TV_DONT_CARE); // moved to ::initSize
sioprintf("Initializing system...\n");
- _screen->wantAnim(true);
+ // _screen->wantAnim(true);
- _bootPath = (char *)malloc(128);
+ _bootPath = (char *)memalign(64, 128);
_bootDevice = detectBootPath(elfPath, _bootPath);
- IrxReference *modules;
- int numModules = loadIrxModules(_bootDevice, _bootPath, &modules);
-
if (_bootDevice != HOST_DEV) {
+ // TODO: reset funx
sioprintf("Resetting IOP.\n");
cdvdInit(CDVD_EXIT);
cdvdExit();
@@ -298,50 +365,12 @@ OSystem_PS2::OSystem_PS2(const char *elfPath) {
// TODO: ps2link 1.46 will stall on "poweroff" init / cb
}
- startIrxModules(numModules, modules);
-
- int res;
- if ((res = fileXioInit()) < 0) {
- msgPrintf(FOREVER, "FXIO Init failed: %d", res);
- quit();
- }
-
- if ((res = initCdvdFs()) < 0) {
- msgPrintf(FOREVER, "CoDyVDfs bind failed: %d", res);
- quit();
- }
-
- if ((res = SjPCM_Init(0)) < 0) {
- msgPrintf(FOREVER, "SjPCM Bind failed: %d\n", res);
- quit();
- }
-
- if (_useHdd) {
- if ((hddCheckPresent() < 0) || (hddCheckFormatted() < 0))
- _useHdd = false;
-
- //hddPreparePoweroff();
- poweroffInit();
+ _usbMassLoaded = _useMouse = _useKbd = _useCd = _useHdd = _useNet = false;
- //hddSetUserPoweroffCallback(gluePowerOffCallback, this);
- poweroffSetCallback(gluePowerOffCallback, this);
- }
+ loadDrivers(IRX_CORE);
+ loadDrivers(IRX_CDROM); // consider CDROM as "core", as RTC depends on it
fileXioSetBlockMode(FXIO_NOWAIT);
-
- _mouseVisible = false;
-
- sioprintf("reading RTC\n");
- readRtcTime();
-
- if (_useHdd) {
- // TODO : make partition path configurable
- if (fio.mount("pfs0:", "hdd0:+ScummVM", 0) >= 0)
- printf("Successfully mounted!\n");
- else
- _useHdd = false;
- }
-
initMutexes();
}
@@ -356,14 +385,67 @@ void OSystem_PS2::init(void) {
sioprintf("Starting SavefileManager\n");
_savefileManager = new Ps2SaveFileManager(this, _screen);
- sioprintf("Initializing ps2Input\n");
- _input = new Ps2Input(this, _useMouse, _useKbd);
-
prepMC();
makeConfigPath();
- _screen->wantAnim(false);
- fillScreen(0);
+ // _screen->wantAnim(false);
+ // fillScreen(0);
+}
+
+void OSystem_PS2::config(void) {
+ #ifndef NO_ADAPTOR
+ if (ConfMan.hasKey("hdd_part", "PlayStation2")) { // "hdd" ?
+ const char *hdd = ConfMan.get("hdd_part", "PlayStation2").c_str();
+
+ if ( !strcmp(hdd, "0") || !strcmp(hdd, "no") || !strcmp(hdd, "disable") ) {
+ _useHdd = false;
+ }
+ else {
+ loadDrivers(IRX_HDD);
+ hddMount(hdd);
+ }
+ }
+ else { // check for HDD and assume partition is +ScummVM
+ loadDrivers(IRX_HDD);
+ hddMount("ScummVM");
+ }
+
+ if (ConfMan.hasKey("net_addr", "PlayStation2")) { // "net" ?
+ const char *net = ConfMan.get("net_addr", "PlayStation2").c_str();
+
+ if ( !strcmp(net, "0") || !strcmp(net, "no") || !strcmp(net, "disable") ) {
+ _useNet = false;
+ }
+ else {
+ loadDrivers(IRX_NET);
+ // TODO: netInit("xxx.xxx.xxx.xxx");
+ }
+ }
+ else { // setup net - IP hardcoded 192.168.1.20
+ loadDrivers(IRX_NET);
+ }
+ #endif
+
+ // why USB drivers only load correctly post HDD ?
+ if (ConfMan.hasKey("usb_mass", "PlayStation2")) { // "usb" ?
+ const char *usb = ConfMan.get("usb_mass", "PlayStation2").c_str();
+
+ if ( !strcmp(usb, "0") || !strcmp(usb, "no") || !strcmp(usb, "disable") ) {
+ _usbMassLoaded = false;
+ }
+ else {
+ loadDrivers(IRX_USB);
+ loadDrivers(IRX_INPUT);
+ sioprintf("Initializing ps2Input\n");
+ _input = new Ps2Input(this, _useMouse, _useKbd);
+ }
+ }
+ else { // load USB drivers (mass & input(
+ loadDrivers(IRX_USB);
+ loadDrivers(IRX_INPUT);
+ sioprintf("Initializing ps2Input\n");
+ _input = new Ps2Input(this, _useMouse, _useKbd);
+ }
}
OSystem_PS2::~OSystem_PS2(void) {
@@ -380,26 +462,40 @@ void OSystem_PS2::initTimer(void) {
g_TimerThreadSema = CreateSema(&threadSema);
g_SoundThreadSema = CreateSema(&threadSema);
assert((g_TimerThreadSema >= 0) && (g_SoundThreadSema >= 0));
-
+ #ifdef __NEW_PS2SDK__
+ ee_thread_t timerThread, soundThread;
+ ee_thread_status_t thisThread;
+ #else
ee_thread_t timerThread, soundThread, thisThread;
+ #endif
ReferThreadStatus(GetThreadId(), &thisThread);
- _timerStack = (uint8 *)malloc(TIMER_STACK_SIZE);
- _soundStack = (uint8 *)malloc(SOUND_STACK_SIZE);
+ _timerStack = (uint8 *)memalign(64, TIMER_STACK_SIZE);
+ _soundStack = (uint8 *)memalign(64, SOUND_STACK_SIZE);
+ // gprof doesn't cope with higher thread priority too well
+ #ifdef ENABLE_PROFILING
+ timerThread.initial_priority = thisThread.current_priority;
+ #else
// give timer thread a higher priority than main thread
timerThread.initial_priority = thisThread.current_priority - 1;
+ #endif
timerThread.stack = _timerStack;
timerThread.stack_size = TIMER_STACK_SIZE;
timerThread.func = (void *)systemTimerThread;
- timerThread.gp_reg = &_gp;
+ timerThread.gp_reg = &_gp;
+ // gprof doesn't cope with higher thread priority too well
+ #ifdef ENABLE_PROFILING
+ soundThread.initial_priority = thisThread.current_priority;
+ #else
// soundthread's priority is higher than main- and timerthread
soundThread.initial_priority = thisThread.current_priority - 2;
+ #endif
soundThread.stack = _soundStack;
soundThread.stack_size = SOUND_STACK_SIZE;
soundThread.func = (void *)systemSoundThread;
- soundThread.gp_reg = &_gp;
+ soundThread.gp_reg = &_gp;
_timerTid = CreateThread(&timerThread);
_soundTid = CreateThread(&soundThread);
@@ -459,39 +555,39 @@ void OSystem_PS2::soundThreadCallback(void) {
// demux data into 2 buffers, L and R
__asm__ (
- "move $t2, %1\n\t" // dest buffer right
- "move $t3, %0\n\t" // dest buffer left
- "lui $t8, 0x7000\n\t" // muxed buffer, fixed at 0x70000000
- "addiu $t9, $0, 100\n\t" // number of loops
- "mtsab $0, 2\n\t" // set qword shift = 2 byte
+ "move $t2, %1\n\t" // dest buffer right
+ "move $t3, %0\n\t" // dest buffer left
+ "lui $t8, 0x7000\n\t" // muxed buffer, fixed at 0x70000000
+ "addiu $t9, $0, 100\n\t" // number of loops
+ "mtsab $0, 2\n\t" // set qword shift = 2 byte
"loop:\n\t"
- " lq $t4, 0($t8)\n\t" // load 8 muxed samples
- " lq $t5, 16($t8)\n\t" // load 8 more muxed samples
+ " lq $t4, 0($t8)\n\t" // load 8 muxed samples
+ " lq $t5, 16($t8)\n\t" // load 8 more muxed samples
- " qfsrv $t6, $0, $t4\n\t" // shift right for second
- " qfsrv $t7, $0, $t5\n\t" // packing step (right channel)
+ " qfsrv $t6, $0, $t4\n\t" // shift right for second
+ " qfsrv $t7, $0, $t5\n\t" // packing step (right channel)
- " ppach $t4, $t5, $t4\n\t" // combine left channel data
- " ppach $t6, $t7, $t6\n\t" // right channel data
+ " ppach $t4, $t5, $t4\n\t" // combine left channel data
+ " ppach $t6, $t7, $t6\n\t" // right channel data
- " sq $t4, 0($t3)\n\t" // write back
- " sq $t6, 0($t2)\n\t" //
+ " sq $t4, 0($t3)\n\t" // write back
+ " sq $t6, 0($t2)\n\t" //
- " addiu $t9, -1\n\t" // decrement loop counter
- " addiu $t2, 16\n\t" // increment pointers
+ " addiu $t9, -1\n\t" // decrement loop counter
+ " addiu $t2, 16\n\t" // increment pointers
" addiu $t3, 16\n\t"
" addiu $t8, 32\n\t"
- " bnez $t9, loop\n\t" // loop
+ " bnez $t9, loop\n\t" // loop
: // outputs
: "r"(soundBufL), "r"(soundBufR) // inputs
- // : "$t2", "$t3", "$t4", "$t5", "$t6", "$t7", "$t8", "$t9" // destroyed
+ // : "$t2", "$t3", "$t4", "$t5", "$t6", "$t7", "$t8", "$t9" // destroyed
: "$10", "$11", "$12", "$13", "$14", "$15", "$24", "$25" // destroyed
);
// and feed it into the SPU
// non-blocking call, the function will return before the buffer's content
// was transferred.
- SjPCM_Enqueue((short int*)soundBufL, (short int*)soundBufR, SMP_PER_BLOCK, 0);
+ SjPCM_Enqueue((short int *)soundBufL, (short int *)soundBufR, SMP_PER_BLOCK, 0);
bufferedSamples += SMP_PER_BLOCK;
}
}
@@ -510,6 +606,10 @@ bool OSystem_PS2::mcPresent(void) {
return false;
}
+bool OSystem_PS2::cdPresent(void) {
+ return _useCd;
+}
+
bool OSystem_PS2::hddPresent(void) {
return _useHdd;
}
@@ -528,11 +628,39 @@ bool OSystem_PS2::usbMassPresent(void) {
}
bool OSystem_PS2::netPresent(void) {
- return _useNet;
+ if (_useNet)
+ return true;
+
+ return false;
+}
+
+bool OSystem_PS2::hddMount(const char *partition) {
+ char name[64] = "hdd0:+ScummVM";
+
+ if (partition)
+ strcpy(name+6, partition);
+
+ if (fio.mount("pfs0:", name, 0) >= 0) {
+ dbg_printf("Successfully mounted (%s)!\n", name);
+ return true;
+ }
+ else {
+ dbg_printf("Failed to mount (%s).\n", name);
+ _useHdd = false;
+ return false;
+ }
}
void OSystem_PS2::initSize(uint width, uint height, const Graphics::PixelFormat *format) {
- printf("initializing new size: (%d/%d)...", width, height);
+ dbg_printf("initializing new size: (%d/%d)...", width, height);
+
+ /* ugly hack: we know we can parse ScummVM.ini now */
+ if (!_screenChangeCount) { // first round
+ config();
+ _screen = new Gs2dScreen(width, height);
+ fillScreen(0);
+ }
+
_screen->newScreenSize(width, height);
_screen->setMouseXy(width / 2, height / 2);
_input->newRange(0, 0, width - 1, height - 1);
@@ -543,7 +671,7 @@ void OSystem_PS2::initSize(uint width, uint height, const Graphics::PixelFormat
_modeChanged = true;
_screenChangeCount++;
- printf("done\n");
+ dbg_printf("done\n");
}
void OSystem_PS2::setPalette(const byte *colors, uint start, uint num) {
@@ -555,7 +683,7 @@ void OSystem_PS2::grabPalette(byte *colors, uint start, uint num) {
}
void OSystem_PS2::copyRectToScreen(const void *buf, int pitch, int x, int y, int w, int h) {
- _screen->copyScreenRect((const uint8*)buf, pitch, x, y, w, h);
+ _screen->copyScreenRect((const uint8 *)buf, pitch, x, y, w, h);
}
void OSystem_PS2::updateScreen(void) {
@@ -568,7 +696,7 @@ void OSystem_PS2::updateScreen(void) {
void OSystem_PS2::displayMessageOnOSD(const char *msg) {
/* TODO : check */
- printf("displayMessageOnOSD: %s\n", msg);
+ dbg_printf("displayMessageOnOSD: %s\n", msg);
}
uint32 OSystem_PS2::getMillis(bool skipRecord) {
@@ -666,7 +794,7 @@ void OSystem_PS2::unlockScreen(void) {
const OSystem::GraphicsMode OSystem_PS2::_graphicsMode = { NULL, NULL, 0 };
const OSystem::GraphicsMode *OSystem_PS2::getSupportedGraphicsModes(void) const {
- return &_graphicsMode;
+ return &_graphicsMode;
}
bool OSystem_PS2::setGraphicsMode(int mode) {
@@ -735,7 +863,7 @@ void OSystem_PS2::msgPrintf(int millis, const char *format, ...) {
Graphics::g_sysfont.drawString(&surf, str, posX, posY, 300 - posX, 1);
posY += 14;
- lnSta = lnEnd + 1;
+ lnSta = lnEnd + 1;
}
uint8 *scrBuf = (uint8 *)memalign(64, 320 * 200);
@@ -768,12 +896,14 @@ void OSystem_PS2::powerOffCallback(void) {
}
void OSystem_PS2::quit(void) {
- printf("OSystem_PS2::quit called\n");
+ dbg_printf("OSystem_PS2::quit called\n");
if (_bootDevice == HOST_DEV) {
- printf("OSystem_PS2::quit (HOST)\n");
+ dbg_printf("OSystem_PS2::quit (HOST)\n");
+ #ifndef ENABLE_PROFILING
SleepThread();
+ #endif
} else {
- printf("OSystem_PS2::quit (bootdev=%d)\n", _bootDevice);
+ dbg_printf("OSystem_PS2::quit (bootdev=%d)\n", _bootDevice);
if (_useHdd) {
driveStandby();
fio.umount("pfs0:");
@@ -781,18 +911,22 @@ void OSystem_PS2::quit(void) {
//setTimerCallback(NULL, 0);
_screen->wantAnim(false);
_systemQuit = true;
+ #ifdef __NEW_PS2SDK__
+ ee_thread_status_t statSound, statTimer;
+ #else
ee_thread_t statSound, statTimer;
- printf("Waiting for timer and sound thread to end\n");
+ #endif
+ dbg_printf("Waiting for timer and sound thread to end\n");
do { // wait until both threads called ExitThread()
ReferThreadStatus(_timerTid, &statTimer);
ReferThreadStatus(_soundTid, &statSound);
} while ((statSound.status != 0x10) || (statTimer.status != 0x10));
- printf("Done\n");
+ dbg_printf("Done\n");
DeleteThread(_timerTid);
DeleteThread(_soundTid);
free(_timerStack);
free(_soundStack);
- printf("Stopping timer\n");
+ dbg_printf("Stopping timer\n");
DisableIntc(INT_TIMER0);
RemoveIntcHandler(INT_TIMER0, _intrId);
@@ -801,7 +935,7 @@ void OSystem_PS2::quit(void) {
padEnd(); // stop pad library
cdvdInit(CDVD_EXIT);
- printf("resetting iop\n");
+ dbg_printf("resetting iop\n");
SifIopReset(NULL, 0);
SifExitRpc();
while (!SifIopSync());
@@ -829,7 +963,7 @@ void OSystem_PS2::quit(void) {
" li $3, 0x04;"
" syscall;"
" nop;"
- );
+ );
*/
/*
@@ -839,7 +973,7 @@ void OSystem_PS2::quit(void) {
*/
#else
// reset + load ELF from CD
- printf("Restarting ScummVM\n");
+ dbg_printf("Restarting ScummVM\n");
LoadExecPS2("cdrom0:\\SCUMMVM.ELF", 0, NULL);
#endif
}
@@ -856,12 +990,12 @@ bool OSystem_PS2::prepMC() {
if (!mcPresent())
return prep;
- printf("prepMC 0\n");
+ dbg_printf("prepMC 0\n");
// Common::String str("mc0:ScummVM/")
// Common::FSNode scumDir(str);
Common::FSNode scumDir("mc0:ScummVM/");
- printf("prepMC 00\n");
+ dbg_printf("prepMC 00\n");
if (!scumDir.exists()) {
uint16 *data, size;
@@ -869,11 +1003,11 @@ bool OSystem_PS2::prepMC() {
PS2Icon _ico;
mcIcon icon;
- printf("prepMC I\n");
+ dbg_printf("prepMC I\n");
size = _ico.decompressData(&data);
- printf("prepMC II\n");
+ dbg_printf("prepMC II\n");
_ico.setup(&icon);
@@ -888,21 +1022,21 @@ bool OSystem_PS2::prepMC() {
fio.mkdir("mc0:ScummVM");
f = ps2_fopen("mc0:ScummVM/scummvm.icn", "w");
- printf("f = %p\n", (const void *)f);
+ dbg_printf("f = %p\n", (const void *)f);
ps2_fwrite(data, size, 2, f);
ps2_fclose(f);
f = ps2_fopen("mc0:ScummVM/icon.sys", "w");
- printf("f = %p\n", (const void *)f);
+ dbg_printf("f = %p\n", (const void *)f);
ps2_fwrite(&icon, sizeof(icon), 1, f);
ps2_fclose(f);
#endif
free(data);
- printf("prepMC II\n");
+ dbg_printf("prepMC II\n");
prep = true;
}
@@ -911,7 +1045,7 @@ bool OSystem_PS2::prepMC() {
}
void OSystem_PS2::makeConfigPath() {
- FILE *src, *dst;
+ FILE *src, *dst;
char path[128], *buf;
int32 size;
@@ -926,7 +1060,7 @@ void OSystem_PS2::makeConfigPath() {
src = ps2_fopen("cdfs:ScummVM.ini", "r");
if (src) {
size = ((Ps2File *)src)->size();
- buf = (char *)malloc(size);
+ buf = (char *)memalign(64, size);
ps2_fread(buf, size, 1, src);
ps2_fclose(src);
@@ -970,6 +1104,5 @@ Common::String OSystem_PS2::getDefaultConfigFileName() {
}
void OSystem_PS2::logMessage(LogMessageType::Type type, const char *message) {
- printf("%s", message);
- sioprintf("%s", message);
+ dbg_printf("%s", message);
}
diff --git a/backends/platform/ps2/systemps2.h b/backends/platform/ps2/systemps2.h
index 3ba40a70f9..45b7dfae36 100644
--- a/backends/platform/ps2/systemps2.h
+++ b/backends/platform/ps2/systemps2.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -25,6 +25,7 @@
#include "common/system.h"
#include "backends/base-backend.h"
+#include "backends/platform/ps2/irxboot.h"
#include "graphics/palette.h"
class Gs2dScreen;
@@ -51,6 +52,7 @@ public:
virtual void initSize(uint width, uint height, const Graphics::PixelFormat *format);
void init(void);
+ void config(void);
virtual int16 getHeight(void);
virtual int16 getWidth(void);
@@ -119,14 +121,17 @@ public:
void powerOffCallback(void);
bool mcPresent(void);
+ bool cdPresent(void);
bool hddPresent(void);
bool usbMassPresent(void);
bool netPresent(void);
+ bool hddMount(const char *partition);
bool runningFromHost(void);
int getBootDevice() { return _bootDevice; }
private:
+ bool loadDrivers(IrxType type);
void startIrxModules(int numModules, IrxReference *modules);
void initMutexes(void);
@@ -136,28 +141,28 @@ private:
Audio::MixerImpl *_scummMixer;
bool _mouseVisible;
- bool _useMouse, _useKbd, _useHdd, _usbMassLoaded, _useNet;
+ bool _useMouse, _useKbd, _useCd, _useHdd, _usbMassLoaded, _useNet;
- Gs2dScreen *_screen;
- Ps2Input *_input;
- uint16 _oldMouseX, _oldMouseY;
- uint32 _msgClearTime;
- uint16 _printY;
+ Gs2dScreen *_screen;
+ Ps2Input *_input;
+ uint16 _oldMouseX, _oldMouseY;
+ uint32 _msgClearTime;
+ uint16 _printY;
bool _modeChanged;
int _screenChangeCount;
- int _mutexSema;
- Ps2Mutex _mutex[MAX_MUTEXES];
+ int _mutexSema;
+ Ps2Mutex _mutex[MAX_MUTEXES];
- uint8 *_timerStack, *_soundStack;
- int _timerTid, _soundTid;
- int _intrId;
+ uint8 *_timerStack, *_soundStack;
+ int _timerTid, _soundTid;
+ int _intrId;
volatile bool _systemQuit;
static const GraphicsMode _graphicsMode;
- int _bootDevice;
- char *_bootPath;
- char *_configFile;
+ int _bootDevice;
+ char *_bootPath;
+ char *_configFile;
};
#endif // SYSTEMPS2_H
diff --git a/backends/platform/psp/audio.cpp b/backends/platform/psp/audio.cpp
index dcbf0b2239..53423b6bbb 100644
--- a/backends/platform/psp/audio.cpp
+++ b/backends/platform/psp/audio.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/backends/platform/psp/audio.h b/backends/platform/psp/audio.h
index 34ded5c638..04f8954840 100644
--- a/backends/platform/psp/audio.h
+++ b/backends/platform/psp/audio.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/backends/platform/psp/cursor.cpp b/backends/platform/psp/cursor.cpp
index b295507de1..0760bd1354 100644
--- a/backends/platform/psp/cursor.cpp
+++ b/backends/platform/psp/cursor.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/backends/platform/psp/cursor.h b/backends/platform/psp/cursor.h
index f79968243b..85a6cbcc34 100644
--- a/backends/platform/psp/cursor.h
+++ b/backends/platform/psp/cursor.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/backends/platform/psp/default_display_client.cpp b/backends/platform/psp/default_display_client.cpp
index 6d6eb641f7..f2d8a7c03c 100644
--- a/backends/platform/psp/default_display_client.cpp
+++ b/backends/platform/psp/default_display_client.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/backends/platform/psp/default_display_client.h b/backends/platform/psp/default_display_client.h
index 95c52e2352..d46b7f1a8a 100644
--- a/backends/platform/psp/default_display_client.h
+++ b/backends/platform/psp/default_display_client.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/backends/platform/psp/display_client.cpp b/backends/platform/psp/display_client.cpp
index bc29166895..b238631e62 100644
--- a/backends/platform/psp/display_client.cpp
+++ b/backends/platform/psp/display_client.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/backends/platform/psp/display_client.h b/backends/platform/psp/display_client.h
index e384bfb82b..5e81947e20 100644
--- a/backends/platform/psp/display_client.h
+++ b/backends/platform/psp/display_client.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/backends/platform/psp/display_manager.cpp b/backends/platform/psp/display_manager.cpp
index c2ff84c7f5..2e995c809e 100644
--- a/backends/platform/psp/display_manager.cpp
+++ b/backends/platform/psp/display_manager.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/backends/platform/psp/display_manager.h b/backends/platform/psp/display_manager.h
index 38c43d60a3..b1b748a68c 100644
--- a/backends/platform/psp/display_manager.h
+++ b/backends/platform/psp/display_manager.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/backends/platform/psp/dummy.cpp b/backends/platform/psp/dummy.cpp
index 998ecf1488..240a1e25b5 100644
--- a/backends/platform/psp/dummy.cpp
+++ b/backends/platform/psp/dummy.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/backends/platform/psp/image_viewer.cpp b/backends/platform/psp/image_viewer.cpp
index 98205ddee9..8a1a256469 100644
--- a/backends/platform/psp/image_viewer.cpp
+++ b/backends/platform/psp/image_viewer.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/backends/platform/psp/image_viewer.h b/backends/platform/psp/image_viewer.h
index 91a70b85cc..66b640b6f3 100644
--- a/backends/platform/psp/image_viewer.h
+++ b/backends/platform/psp/image_viewer.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/backends/platform/psp/input.cpp b/backends/platform/psp/input.cpp
index 5e20fb1e43..4d7577eb94 100644
--- a/backends/platform/psp/input.cpp
+++ b/backends/platform/psp/input.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/backends/platform/psp/input.h b/backends/platform/psp/input.h
index ef2e1b84a4..05b575e0b0 100644
--- a/backends/platform/psp/input.h
+++ b/backends/platform/psp/input.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/backends/platform/psp/memory.cpp b/backends/platform/psp/memory.cpp
index 5419d60eb3..72a526c0ff 100644
--- a/backends/platform/psp/memory.cpp
+++ b/backends/platform/psp/memory.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/backends/platform/psp/memory.h b/backends/platform/psp/memory.h
index 5b728460fc..d7c5420d64 100644
--- a/backends/platform/psp/memory.h
+++ b/backends/platform/psp/memory.h
@@ -9,12 +9,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/backends/platform/psp/mp3.cpp b/backends/platform/psp/mp3.cpp
index 3dbf31112a..6db2a73a4b 100644
--- a/backends/platform/psp/mp3.cpp
+++ b/backends/platform/psp/mp3.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/backends/platform/psp/mp3.h b/backends/platform/psp/mp3.h
index f7bfdda254..86dfc4c37d 100644
--- a/backends/platform/psp/mp3.h
+++ b/backends/platform/psp/mp3.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/backends/platform/psp/osys_psp.cpp b/backends/platform/psp/osys_psp.cpp
index 8559066e53..67cb72d9d4 100644
--- a/backends/platform/psp/osys_psp.cpp
+++ b/backends/platform/psp/osys_psp.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/backends/platform/psp/osys_psp.h b/backends/platform/psp/osys_psp.h
index f4591e476d..6f9238b84e 100644
--- a/backends/platform/psp/osys_psp.h
+++ b/backends/platform/psp/osys_psp.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/backends/platform/psp/png_loader.cpp b/backends/platform/psp/png_loader.cpp
index 4de13d1e73..e54541b75d 100644
--- a/backends/platform/psp/png_loader.cpp
+++ b/backends/platform/psp/png_loader.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/backends/platform/psp/png_loader.h b/backends/platform/psp/png_loader.h
index 48a3220d78..b84bef4efe 100644
--- a/backends/platform/psp/png_loader.h
+++ b/backends/platform/psp/png_loader.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/backends/platform/psp/portdefs.h b/backends/platform/psp/portdefs.h
index 620a27a601..3e7b559666 100644
--- a/backends/platform/psp/portdefs.h
+++ b/backends/platform/psp/portdefs.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/backends/platform/psp/powerman.cpp b/backends/platform/psp/powerman.cpp
index b72d05809d..3cd663e3c7 100644
--- a/backends/platform/psp/powerman.cpp
+++ b/backends/platform/psp/powerman.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/backends/platform/psp/powerman.h b/backends/platform/psp/powerman.h
index e62b1ada8e..77cfb26720 100644
--- a/backends/platform/psp/powerman.h
+++ b/backends/platform/psp/powerman.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/backends/platform/psp/psp_main.cpp b/backends/platform/psp/psp_main.cpp
index a83a5bae71..8901f4ecd3 100644
--- a/backends/platform/psp/psp_main.cpp
+++ b/backends/platform/psp/psp_main.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/backends/platform/psp/pspkeyboard.cpp b/backends/platform/psp/pspkeyboard.cpp
index 66efe9145d..7b5637e52f 100644
--- a/backends/platform/psp/pspkeyboard.cpp
+++ b/backends/platform/psp/pspkeyboard.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/backends/platform/psp/pspkeyboard.h b/backends/platform/psp/pspkeyboard.h
index bd270da26f..ece769e0ce 100644
--- a/backends/platform/psp/pspkeyboard.h
+++ b/backends/platform/psp/pspkeyboard.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/backends/platform/psp/psppixelformat.cpp b/backends/platform/psp/psppixelformat.cpp
index e1649791a1..2d7d524b45 100644
--- a/backends/platform/psp/psppixelformat.cpp
+++ b/backends/platform/psp/psppixelformat.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/backends/platform/psp/psppixelformat.h b/backends/platform/psp/psppixelformat.h
index ca85e76211..ede5a97d6f 100644
--- a/backends/platform/psp/psppixelformat.h
+++ b/backends/platform/psp/psppixelformat.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/backends/platform/psp/rtc.cpp b/backends/platform/psp/rtc.cpp
index 4f15e45535..d01bd8f83a 100644
--- a/backends/platform/psp/rtc.cpp
+++ b/backends/platform/psp/rtc.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/backends/platform/psp/rtc.h b/backends/platform/psp/rtc.h
index d2689681dd..58d70f4ab2 100644
--- a/backends/platform/psp/rtc.h
+++ b/backends/platform/psp/rtc.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/backends/platform/psp/tests.cpp b/backends/platform/psp/tests.cpp
index 5c5ebb7a80..92a18e58d0 100644
--- a/backends/platform/psp/tests.cpp
+++ b/backends/platform/psp/tests.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/backends/platform/psp/tests.h b/backends/platform/psp/tests.h
index 3779cb6bb2..718287b9dd 100644
--- a/backends/platform/psp/tests.h
+++ b/backends/platform/psp/tests.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/backends/platform/psp/thread.cpp b/backends/platform/psp/thread.cpp
index 57370f7685..669a682c21 100644
--- a/backends/platform/psp/thread.cpp
+++ b/backends/platform/psp/thread.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/backends/platform/psp/thread.h b/backends/platform/psp/thread.h
index ca94b8c82c..a0d53e8638 100644
--- a/backends/platform/psp/thread.h
+++ b/backends/platform/psp/thread.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/backends/platform/psp/trace.cpp b/backends/platform/psp/trace.cpp
index 008b508b7e..50459dcea5 100644
--- a/backends/platform/psp/trace.cpp
+++ b/backends/platform/psp/trace.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/backends/platform/psp/trace.h b/backends/platform/psp/trace.h
index e27d06d8d3..43ccaea52a 100644
--- a/backends/platform/psp/trace.h
+++ b/backends/platform/psp/trace.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/backends/platform/samsungtv/main.cpp b/backends/platform/samsungtv/main.cpp
index 8274bb00a2..a390bd0f0b 100644
--- a/backends/platform/samsungtv/main.cpp
+++ b/backends/platform/samsungtv/main.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/backends/platform/samsungtv/samsungtv.cpp b/backends/platform/samsungtv/samsungtv.cpp
index 9718eed1fe..a1d15930f2 100644
--- a/backends/platform/samsungtv/samsungtv.cpp
+++ b/backends/platform/samsungtv/samsungtv.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/backends/platform/samsungtv/samsungtv.h b/backends/platform/samsungtv/samsungtv.h
index b7a78a96cd..fdd1015c8a 100644
--- a/backends/platform/samsungtv/samsungtv.h
+++ b/backends/platform/samsungtv/samsungtv.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/backends/platform/sdl/amigaos/amigaos-main.cpp b/backends/platform/sdl/amigaos/amigaos-main.cpp
index da83756a40..0743b3f9a0 100644
--- a/backends/platform/sdl/amigaos/amigaos-main.cpp
+++ b/backends/platform/sdl/amigaos/amigaos-main.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/backends/platform/sdl/amigaos/amigaos.cpp b/backends/platform/sdl/amigaos/amigaos.cpp
index 94daacfd14..fdd26cd256 100644
--- a/backends/platform/sdl/amigaos/amigaos.cpp
+++ b/backends/platform/sdl/amigaos/amigaos.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/backends/platform/sdl/amigaos/amigaos.h b/backends/platform/sdl/amigaos/amigaos.h
index 391a0bfa9a..76cc656364 100644
--- a/backends/platform/sdl/amigaos/amigaos.h
+++ b/backends/platform/sdl/amigaos/amigaos.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/backends/platform/sdl/macosx/appmenu_osx.h b/backends/platform/sdl/macosx/appmenu_osx.h
index 005414b789..22088184fb 100644
--- a/backends/platform/sdl/macosx/appmenu_osx.h
+++ b/backends/platform/sdl/macosx/appmenu_osx.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/backends/platform/sdl/macosx/appmenu_osx.mm b/backends/platform/sdl/macosx/appmenu_osx.mm
index 0d2a2ab7f2..d083fb8483 100644
--- a/backends/platform/sdl/macosx/appmenu_osx.mm
+++ b/backends/platform/sdl/macosx/appmenu_osx.mm
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/backends/platform/sdl/macosx/macosx-main.cpp b/backends/platform/sdl/macosx/macosx-main.cpp
index b89264f9e9..1b9fc1b82c 100644
--- a/backends/platform/sdl/macosx/macosx-main.cpp
+++ b/backends/platform/sdl/macosx/macosx-main.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/backends/platform/sdl/macosx/macosx.cpp b/backends/platform/sdl/macosx/macosx.cpp
index 85342d62fd..c48076c42f 100644
--- a/backends/platform/sdl/macosx/macosx.cpp
+++ b/backends/platform/sdl/macosx/macosx.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -31,6 +31,7 @@
#include "backends/mixer/doublebuffersdl/doublebuffersdl-mixer.h"
#include "backends/platform/sdl/macosx/appmenu_osx.h"
#include "backends/updates/macosx/macosx-updates.h"
+#include "backends/taskbar/macosx/macosx-taskbar.h"
#include "common/archive.h"
#include "common/config-manager.h"
@@ -45,6 +46,16 @@ OSystem_MacOSX::OSystem_MacOSX()
OSystem_POSIX("Library/Preferences/ScummVM Preferences") {
}
+void OSystem_MacOSX::init() {
+#if defined(USE_TASKBAR)
+ // Initialize taskbar manager
+ _taskbarManager = new MacOSXTaskbarManager();
+#endif
+
+ // Invoke parent implementation of this method
+ OSystem_POSIX::init();
+}
+
void OSystem_MacOSX::initBackend() {
// Create the mixer manager
if (_mixer == 0) {
@@ -134,7 +145,7 @@ Common::String OSystem_MacOSX::getSystemLanguage() const {
for (CFIndex i = 0 ; i < localizationsSize ; ++i) {
CFStringRef language = (CFStringRef)CFArrayGetValueAtIndex(preferredLocalizations, i);
char buffer[10];
- CFStringGetCString(language, buffer, 50, kCFStringEncodingASCII);
+ CFStringGetCString(language, buffer, sizeof(buffer), kCFStringEncodingASCII);
int32 languageId = TransMan.findMatchingLanguage(buffer);
if (languageId != -1) {
CFRelease(preferredLocalizations);
@@ -145,7 +156,7 @@ Common::String OSystem_MacOSX::getSystemLanguage() const {
if (localizationsSize > 0) {
CFStringRef language = (CFStringRef)CFArrayGetValueAtIndex(preferredLocalizations, 0);
char buffer[10];
- CFStringGetCString(language, buffer, 50, kCFStringEncodingASCII);
+ CFStringGetCString(language, buffer, sizeof(buffer), kCFStringEncodingASCII);
CFRelease(preferredLocalizations);
return buffer;
}
diff --git a/backends/platform/sdl/macosx/macosx.h b/backends/platform/sdl/macosx/macosx.h
index d9cb28b973..50cef60353 100644
--- a/backends/platform/sdl/macosx/macosx.h
+++ b/backends/platform/sdl/macosx/macosx.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -35,6 +35,7 @@ public:
virtual Common::String getSystemLanguage() const;
+ virtual void init();
virtual void initBackend();
virtual void addSysArchivesToSearchSet(Common::SearchSet &s, int priority = 0);
virtual void setupIcon();
diff --git a/backends/platform/sdl/posix/posix-main.cpp b/backends/platform/sdl/posix/posix-main.cpp
index 5f0914e04f..d07db11b0c 100644
--- a/backends/platform/sdl/posix/posix-main.cpp
+++ b/backends/platform/sdl/posix/posix-main.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/backends/platform/sdl/posix/posix.cpp b/backends/platform/sdl/posix/posix.cpp
index 7a8b1e7b70..a711c3a96b 100644
--- a/backends/platform/sdl/posix/posix.cpp
+++ b/backends/platform/sdl/posix/posix.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -50,7 +50,7 @@ void OSystem_POSIX::init() {
// Initialze File System Factory
_fsFactory = new POSIXFilesystemFactory();
-#if defined(USE_TASKBAR) && defined(USE_TASKBAR_UNITY)
+#if defined(USE_TASKBAR) && defined(USE_UNITY)
// Initialize taskbar manager
_taskbarManager = new UnityTaskbarManager();
#endif
@@ -67,7 +67,7 @@ void OSystem_POSIX::initBackend() {
// Invoke parent implementation of this method
OSystem_SDL::initBackend();
-#if defined(USE_TASKBAR) && defined(USE_TASKBAR_UNITY)
+#if defined(USE_TASKBAR) && defined(USE_UNITY)
// Register the taskbar manager as an event source (this is necessary for the glib event loop to be run)
_eventManager->getEventDispatcher()->registerSource((UnityTaskbarManager *)_taskbarManager, false);
#endif
@@ -80,15 +80,16 @@ bool OSystem_POSIX::hasFeature(Feature f) {
}
Common::String OSystem_POSIX::getDefaultConfigFileName() {
- char configFile[MAXPATHLEN];
+ Common::String configFile;
// On POSIX type systems, by default we store the config file inside
// to the HOME directory of the user.
const char *home = getenv("HOME");
- if (home != NULL && strlen(home) < MAXPATHLEN)
- snprintf(configFile, MAXPATHLEN, "%s/%s", home, _baseConfigName.c_str());
- else
- strcpy(configFile, _baseConfigName.c_str());
+ if (home != NULL && (strlen(home) + 1 + _baseConfigName.size()) < MAXPATHLEN) {
+ configFile = Common::String::format("%s/%s", home, _baseConfigName.c_str());
+ } else {
+ configFile = _baseConfigName;
+ }
return configFile;
}
diff --git a/backends/platform/sdl/posix/posix.h b/backends/platform/sdl/posix/posix.h
index 59909a958f..01a01528cd 100644
--- a/backends/platform/sdl/posix/posix.h
+++ b/backends/platform/sdl/posix/posix.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/backends/platform/sdl/ps3/ps3-main.cpp b/backends/platform/sdl/ps3/ps3-main.cpp
index ba548a3749..92c4a02865 100644
--- a/backends/platform/sdl/ps3/ps3-main.cpp
+++ b/backends/platform/sdl/ps3/ps3-main.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/backends/platform/sdl/ps3/ps3.cpp b/backends/platform/sdl/ps3/ps3.cpp
index 33586ce693..f111379794 100644
--- a/backends/platform/sdl/ps3/ps3.cpp
+++ b/backends/platform/sdl/ps3/ps3.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/backends/platform/sdl/ps3/ps3.h b/backends/platform/sdl/ps3/ps3.h
index daed7599a9..d812a13548 100644
--- a/backends/platform/sdl/ps3/ps3.h
+++ b/backends/platform/sdl/ps3/ps3.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/backends/platform/sdl/sdl-sys.h b/backends/platform/sdl/sdl-sys.h
index eccf73815d..eec3741ed6 100644
--- a/backends/platform/sdl/sdl-sys.h
+++ b/backends/platform/sdl/sdl-sys.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/backends/platform/sdl/sdl.cpp b/backends/platform/sdl/sdl.cpp
index 7ab367d4a4..41610dc0c7 100644
--- a/backends/platform/sdl/sdl.cpp
+++ b/backends/platform/sdl/sdl.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -65,10 +65,13 @@
OSystem_SDL::OSystem_SDL()
:
#ifdef USE_OPENGL
- _graphicsModes(0),
+ _desktopWidth(0),
+ _desktopHeight(0),
+ _graphicsModes(),
_graphicsMode(0),
- _sdlModesCount(0),
- _glModesCount(0),
+ _firstGLMode(0),
+ _defaultSDLMode(0),
+ _defaultGLMode(0),
#endif
_inited(false),
_initedSDL(false),
@@ -87,6 +90,9 @@ OSystem_SDL::~OSystem_SDL() {
// Hence, we perform the destruction on our own.
delete _savefileManager;
_savefileManager = 0;
+ if (_graphicsManager) {
+ dynamic_cast<SdlGraphicsManager *>(_graphicsManager)->deactivateManager();
+ }
delete _graphicsManager;
_graphicsManager = 0;
delete _eventManager;
@@ -110,10 +116,6 @@ OSystem_SDL::~OSystem_SDL() {
delete _mutexManager;
_mutexManager = 0;
-#ifdef USE_OPENGL
- delete[] _graphicsModes;
-#endif
-
delete _logger;
_logger = 0;
@@ -124,6 +126,12 @@ void OSystem_SDL::init() {
// Initialize SDL
initSDL();
+ // Enable unicode support if possible
+ SDL_EnableUNICODE(1);
+
+ // Disable OS cursor
+ SDL_ShowCursor(SDL_DISABLE);
+
if (!_logger)
_logger = new Backends::Log::Log(this);
@@ -144,50 +152,60 @@ void OSystem_SDL::init() {
_taskbarManager = new Common::TaskbarManager();
#endif
-#ifdef USE_OPENGL
- // Setup a list with both SDL and OpenGL graphics modes
- setupGraphicsModes();
-#endif
}
void OSystem_SDL::initBackend() {
// Check if backend has not been initialized
assert(!_inited);
+ const int maxNameLen = 20;
+ char sdlDriverName[maxNameLen];
+ sdlDriverName[0] = '\0';
+ SDL_VideoDriverName(sdlDriverName, maxNameLen);
+ // Using printf rather than debug() here as debug()/logging
+ // is not active by this point.
+ debug(1, "Using SDL Video Driver \"%s\"", sdlDriverName);
+
// Create the default event source, in case a custom backend
// manager didn't provide one yet.
if (_eventSource == 0)
_eventSource = new SdlEventSource();
- int graphicsManagerType = 0;
+#ifdef USE_OPENGL
+ // Query the desktop resolution. We simply hope nothing tried to change
+ // the resolution so far.
+ const SDL_VideoInfo *videoInfo = SDL_GetVideoInfo();
+ if (videoInfo && videoInfo->current_w > 0 && videoInfo->current_h > 0) {
+ _desktopWidth = videoInfo->current_w;
+ _desktopHeight = videoInfo->current_h;
+ }
+#endif
if (_graphicsManager == 0) {
#ifdef USE_OPENGL
+ // Setup a list with both SDL and OpenGL graphics modes. We only do
+ // this whenever the subclass did not already set up an graphics
+ // manager yet. This is because we don't know the type of the graphics
+ // manager of the subclass, thus we cannot easily switch between the
+ // OpenGL one and the set up one. It also is to be expected that the
+ // subclass does not want any switching of graphics managers anyway.
+ setupGraphicsModes();
+
if (ConfMan.hasKey("gfx_mode")) {
+ // If the gfx_mode is from OpenGL, create the OpenGL graphics manager
Common::String gfxMode(ConfMan.get("gfx_mode"));
- bool use_opengl = false;
- const OSystem::GraphicsMode *mode = OpenGLSdlGraphicsManager::supportedGraphicsModes();
- int i = 0;
- while (mode->name) {
- if (scumm_stricmp(mode->name, gfxMode.c_str()) == 0) {
- _graphicsMode = i + _sdlModesCount;
- use_opengl = true;
+ for (uint i = _firstGLMode; i < _graphicsModeIds.size(); ++i) {
+ if (!scumm_stricmp(_graphicsModes[i].name, gfxMode.c_str())) {
+ _graphicsManager = new OpenGLSdlGraphicsManager(_desktopWidth, _desktopHeight, _eventSource);
+ _graphicsMode = i;
+ break;
}
-
- mode++;
- ++i;
- }
-
- // If the gfx_mode is from OpenGL, create the OpenGL graphics manager
- if (use_opengl) {
- _graphicsManager = new OpenGLSdlGraphicsManager(_eventSource);
- graphicsManagerType = 1;
}
}
#endif
+
if (_graphicsManager == 0) {
_graphicsManager = new SurfaceSdlGraphicsManager(_eventSource);
- graphicsManagerType = 0;
}
}
@@ -230,13 +248,7 @@ void OSystem_SDL::initBackend() {
// so the virtual keyboard can be initialized, but we have to add the
// graphics manager as an event observer after initializing the event
// manager.
- if (graphicsManagerType == 0)
- ((SurfaceSdlGraphicsManager *)_graphicsManager)->initEventObserver();
-#ifdef USE_OPENGL
- else if (graphicsManagerType == 1)
- ((OpenGLSdlGraphicsManager *)_graphicsManager)->initEventObserver();
-#endif
-
+ dynamic_cast<SdlGraphicsManager *>(_graphicsManager)->activateManager();
}
#if defined(USE_TASKBAR)
@@ -257,22 +269,19 @@ void OSystem_SDL::engineDone() {
void OSystem_SDL::initSDL() {
// Check if SDL has not been initialized
if (!_initedSDL) {
- uint32 sdlFlags = 0;
+ // We always initialize the video subsystem because we will need it to
+ // be initialized before the graphics managers to retrieve the desktop
+ // resolution, for example. WebOS also requires this initialization
+ // or otherwise the application won't start.
+ uint32 sdlFlags = SDL_INIT_VIDEO;
+
if (ConfMan.hasKey("disable_sdl_parachute"))
sdlFlags |= SDL_INIT_NOPARACHUTE;
-#ifdef WEBOS
- // WebOS needs this flag or otherwise the application won't start
- sdlFlags |= SDL_INIT_VIDEO;
-#endif
-
// Initialize SDL (SDL Subsystems are initiliazed in the corresponding sdl managers)
if (SDL_Init(sdlFlags) == -1)
error("Could not initialize SDL: %s", SDL_GetError());
- // Enable unicode support if possible
- SDL_EnableUNICODE(1);
-
_initedSDL = true;
}
}
@@ -368,17 +377,6 @@ Common::String OSystem_SDL::getSystemLanguage() const {
const LCID languageIdentifier = GetThreadLocale();
- // GetLocalInfo is only supported starting from Windows 2000, according to this:
- // http://msdn.microsoft.com/en-us/library/dd318101%28VS.85%29.aspx
- // On the other hand the locale constants used, seem to exist on Windows 98 too,
- // check this for that: http://msdn.microsoft.com/en-us/library/dd464799%28v=VS.85%29.aspx
- //
- // I am not exactly sure what is the truth now, it might be very well that this breaks
- // support for systems older than Windows 2000....
- //
- // TODO: Check whether this (or ScummVM at all ;-) works on a system with Windows 98 for
- // example and if it does not and we still want Windows 9x support, we should definitly
- // think of another solution.
if (GetLocaleInfo(languageIdentifier, LOCALE_SISO639LANGNAME, langName, sizeof(langName)) != 0 &&
GetLocaleInfo(languageIdentifier, LOCALE_SISO3166CTRYNAME, ctryName, sizeof(ctryName)) != 0) {
Common::String localeName = langName;
@@ -391,10 +389,15 @@ Common::String OSystem_SDL::getSystemLanguage() const {
}
#else // WIN32
// Activating current locale settings
- const char *locale = setlocale(LC_ALL, "");
+ const Common::String locale = setlocale(LC_ALL, "");
+
+ // Restore default C locale to prevent issues with
+ // portability of sscanf(), atof(), etc.
+ // See bug #3615148
+ setlocale(LC_ALL, "C");
// Detect the language from the locale
- if (!locale) {
+ if (locale.empty()) {
return ModularBackend::getSystemLanguage();
} else {
int length = 0;
@@ -403,14 +406,14 @@ Common::String OSystem_SDL::getSystemLanguage() const {
// ".UTF-8" or the like. We do this, since
// our translation languages are usually
// specified without any charset information.
- for (int i = 0; locale[i]; ++i, ++length) {
+ for (int size = locale.size(); length < size; ++length) {
// TODO: Check whether "@" should really be checked
// here.
- if (locale[i] == '.' || locale[i] == ' ' || locale[i] == '@')
+ if (locale[length] == '.' || locale[length] == ' ' || locale[length] == '@')
break;
}
- return Common::String(locale, length);
+ return Common::String(locale.c_str(), length);
}
#endif // WIN32
#else // USE_DETECTLANG
@@ -535,28 +538,33 @@ Common::TimerManager *OSystem_SDL::getTimerManager() {
#ifdef USE_OPENGL
const OSystem::GraphicsMode *OSystem_SDL::getSupportedGraphicsModes() const {
- return _graphicsModes;
+ if (_graphicsModes.empty()) {
+ return _graphicsManager->getSupportedGraphicsModes();
+ } else {
+ return _graphicsModes.begin();
+ }
}
int OSystem_SDL::getDefaultGraphicsMode() const {
- // Return the default graphics mode from the current graphics manager
- if (_graphicsMode < _sdlModesCount)
+ if (_graphicsModes.empty()) {
return _graphicsManager->getDefaultGraphicsMode();
- else
- return _graphicsManager->getDefaultGraphicsMode() + _sdlModesCount;
+ } else {
+ // Return the default graphics mode from the current graphics manager
+ if (_graphicsMode < _firstGLMode)
+ return _defaultSDLMode;
+ else
+ return _defaultGLMode;
+ }
}
bool OSystem_SDL::setGraphicsMode(int mode) {
- const OSystem::GraphicsMode *srcMode;
- int i;
+ if (_graphicsModes.empty()) {
+ return _graphicsManager->setGraphicsMode(mode);
+ }
- // Check if mode is from SDL or OpenGL
- if (mode < _sdlModesCount) {
- srcMode = SurfaceSdlGraphicsManager::supportedGraphicsModes();
- i = 0;
- } else {
- srcMode = OpenGLSdlGraphicsManager::supportedGraphicsModes();
- i = _sdlModesCount;
+ // Check whether a invalid mode is requested.
+ if (mode < 0 || (uint)mode >= _graphicsModeIds.size()) {
+ return false;
}
// Very hacky way to set up the old graphics manager state, in case we
@@ -575,113 +583,121 @@ bool OSystem_SDL::setGraphicsMode(int mode) {
bool switchedManager = false;
- // Loop through modes
- while (srcMode->name) {
- if (i == mode) {
- // If the new mode and the current mode are not from the same graphics
- // manager, delete and create the new mode graphics manager
- if (_graphicsMode >= _sdlModesCount && mode < _sdlModesCount) {
- debug(1, "switching to plain SDL graphics");
- delete _graphicsManager;
- _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(_eventSource);
- ((OpenGLSdlGraphicsManager *)_graphicsManager)->initEventObserver();
- _graphicsManager->beginGFXTransaction();
-
- switchedManager = true;
- }
+ // If the new mode and the current mode are not from the same graphics
+ // manager, delete and create the new mode graphics manager
+ if (_graphicsMode >= _firstGLMode && mode < _firstGLMode) {
+ debug(1, "switching to plain SDL graphics");
+ dynamic_cast<SdlGraphicsManager *>(_graphicsManager)->deactivateManager();
+ delete _graphicsManager;
+ _graphicsManager = new SurfaceSdlGraphicsManager(_eventSource);
+
+ switchedManager = true;
+ } else if (_graphicsMode < _firstGLMode && mode >= _firstGLMode) {
+ debug(1, "switching to OpenGL graphics");
+ dynamic_cast<SdlGraphicsManager *>(_graphicsManager)->deactivateManager();
+ delete _graphicsManager;
+ _graphicsManager = new OpenGLSdlGraphicsManager(_desktopWidth, _desktopHeight, _eventSource);
+
+ switchedManager = true;
+ }
- _graphicsMode = mode;
+ _graphicsMode = mode;
- if (switchedManager) {
+ if (switchedManager) {
+ dynamic_cast<SdlGraphicsManager *>(_graphicsManager)->activateManager();
+
+ _graphicsManager->beginGFXTransaction();
#ifdef USE_RGB_COLOR
- _graphicsManager->initSize(screenWidth, screenHeight, &pixelFormat);
+ _graphicsManager->initSize(screenWidth, screenHeight, &pixelFormat);
#else
- _graphicsManager->initSize(screenWidth, screenHeight, 0);
+ _graphicsManager->initSize(screenWidth, screenHeight, 0);
#endif
- _graphicsManager->setFeatureState(kFeatureAspectRatioCorrection, arState);
- _graphicsManager->setFeatureState(kFeatureFullscreenMode, fullscreen);
- _graphicsManager->setFeatureState(kFeatureCursorPalette, cursorPalette);
+ _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
+ // 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;
- }
+ // 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 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);
- }
+ // Next setup cursor palette if needed
+ if (cursorPalette) {
+ CursorMan.pushCursorPalette(0, 0, 0);
+ CursorMan.popCursorPalette();
}
- i++;
- srcMode++;
+ _graphicsManager->beginGFXTransaction();
+ // Oh my god if this failed the client code might just explode.
+ return _graphicsManager->setGraphicsMode(_graphicsModeIds[mode]);
+ } else {
+ return _graphicsManager->setGraphicsMode(_graphicsModeIds[mode]);
}
-
- return false;
}
int OSystem_SDL::getGraphicsMode() const {
- return _graphicsMode;
+ if (_graphicsModes.empty()) {
+ return _graphicsManager->getGraphicsMode();
+ } else {
+ return _graphicsMode;
+ }
}
void OSystem_SDL::setupGraphicsModes() {
- const OSystem::GraphicsMode *sdlGraphicsModes = SurfaceSdlGraphicsManager::supportedGraphicsModes();
- const OSystem::GraphicsMode *openglGraphicsModes = OpenGLSdlGraphicsManager::supportedGraphicsModes();
- _sdlModesCount = 0;
- _glModesCount = 0;
+ _graphicsModes.clear();
+ _graphicsModeIds.clear();
+ _defaultSDLMode = _defaultGLMode = -1;
// Count the number of graphics modes
- const OSystem::GraphicsMode *srcMode = sdlGraphicsModes;
+ const OSystem::GraphicsMode *srcMode;
+ int defaultMode;
+
+ GraphicsManager *manager = new SurfaceSdlGraphicsManager(_eventSource);
+ srcMode = manager->getSupportedGraphicsModes();
+ defaultMode = manager->getDefaultGraphicsMode();
while (srcMode->name) {
- _sdlModesCount++;
+ if (defaultMode == srcMode->id) {
+ _defaultSDLMode = _graphicsModes.size();
+ }
+ _graphicsModes.push_back(*srcMode);
srcMode++;
}
- srcMode = openglGraphicsModes;
+ delete manager;
+ assert(_defaultSDLMode != -1);
+
+ _firstGLMode = _graphicsModes.size();
+ manager = new OpenGLSdlGraphicsManager(_desktopWidth, _desktopHeight, _eventSource);
+ srcMode = manager->getSupportedGraphicsModes();
+ defaultMode = manager->getDefaultGraphicsMode();
while (srcMode->name) {
- _glModesCount++;
+ if (defaultMode == srcMode->id) {
+ _defaultGLMode = _graphicsModes.size();
+ }
+ _graphicsModes.push_back(*srcMode);
srcMode++;
}
-
- // Allocate enough space for merged array of modes
- _graphicsModes = new OSystem::GraphicsMode[_glModesCount + _sdlModesCount + 1];
-
- // Copy SDL graphics modes
- memcpy((void *)_graphicsModes, sdlGraphicsModes, _sdlModesCount * sizeof(OSystem::GraphicsMode));
-
- // Copy OpenGL graphics modes
- memcpy((void *)(_graphicsModes + _sdlModesCount), openglGraphicsModes, _glModesCount * sizeof(OSystem::GraphicsMode));
+ delete manager;
+ manager = nullptr;
+ assert(_defaultGLMode != -1);
// Set a null mode at the end
- memset((void *)(_graphicsModes + _sdlModesCount + _glModesCount), 0, sizeof(OSystem::GraphicsMode));
+ GraphicsMode nullMode;
+ memset(&nullMode, 0, sizeof(nullMode));
+ _graphicsModes.push_back(nullMode);
// Set new internal ids for all modes
int i = 0;
- OSystem::GraphicsMode *mode = _graphicsModes;
+ OSystem::GraphicsMode *mode = _graphicsModes.begin();
while (mode->name) {
+ _graphicsModeIds.push_back(mode->id);
mode->id = i++;
mode++;
}
diff --git a/backends/platform/sdl/sdl.h b/backends/platform/sdl/sdl.h
index 840e73ff09..5dcc269e55 100644
--- a/backends/platform/sdl/sdl.h
+++ b/backends/platform/sdl/sdl.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -30,6 +30,8 @@
#include "backends/events/sdl/sdl-events.h"
#include "backends/log/log.h"
+#include "common/array.h"
+
/**
* Base OSystem class for all SDL ports.
*/
@@ -106,15 +108,20 @@ protected:
Backends::Log::Log *_logger;
#ifdef USE_OPENGL
- OSystem::GraphicsMode *_graphicsModes;
+ int _desktopWidth, _desktopHeight;
+
+ typedef Common::Array<GraphicsMode> GraphicsModeArray;
+ GraphicsModeArray _graphicsModes;
+ Common::Array<int> _graphicsModeIds;
int _graphicsMode;
- int _sdlModesCount;
- int _glModesCount;
+ int _firstGLMode;
+ int _defaultSDLMode;
+ int _defaultGLMode;
/**
* Creates the merged graphics modes list
*/
- virtual void setupGraphicsModes();
+ void setupGraphicsModes();
virtual const OSystem::GraphicsMode *getSupportedGraphicsModes() const;
virtual int getDefaultGraphicsMode() const;
diff --git a/backends/platform/sdl/win32/win32-main.cpp b/backends/platform/sdl/win32/win32-main.cpp
index 2b3e18e9f0..e5b26c3ff0 100644
--- a/backends/platform/sdl/win32/win32-main.cpp
+++ b/backends/platform/sdl/win32/win32-main.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/backends/platform/sdl/win32/win32.cpp b/backends/platform/sdl/win32/win32.cpp
index 453d566c7b..5f860ad32d 100644
--- a/backends/platform/sdl/win32/win32.cpp
+++ b/backends/platform/sdl/win32/win32.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/backends/platform/sdl/win32/win32.h b/backends/platform/sdl/win32/win32.h
index b56997a63b..d72d80bc26 100644
--- a/backends/platform/sdl/win32/win32.h
+++ b/backends/platform/sdl/win32/win32.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/backends/platform/symbian/AdaptAllMMPs.pl b/backends/platform/symbian/AdaptAllMMPs.pl
index ffc4e88aff..18a464b580 100644
--- a/backends/platform/symbian/AdaptAllMMPs.pl
+++ b/backends/platform/symbian/AdaptAllMMPs.pl
@@ -14,36 +14,48 @@ chdir("../../../");
"mmp/scummvm_cine.mmp",
"mmp/scummvm_composer.mmp",
"mmp/scummvm_cruise.mmp",
+ "mmp/scummvm_draci.mmp",
"mmp/scummvm_drascula.mmp",
"mmp/scummvm_gob.mmp",
"mmp/scummvm_groovie.mmp",
+ "mmp/scummvm_hopkins.mmp",
+ "mmp/scummvm_hugo.mmp",
"mmp/scummvm_kyra.mmp",
"mmp/scummvm_lure.mmp",
"mmp/scummvm_m4.mmp",
"mmp/scummvm_made.mmp",
+ "mmp/scummvm_mohawk.mmp",
+ "mmp/scummvm_neverhood.mmp",
"mmp/scummvm_parallaction.mmp",
+ "mmp/scummvm_pegasus.mmp",
"mmp/scummvm_queen.mmp",
"mmp/scummvm_saga.mmp",
+ "mmp/scummvm_sci.mmp",
"mmp/scummvm_scumm.mmp",
"mmp/scummvm_sky.mmp",
"mmp/scummvm_sword1.mmp",
"mmp/scummvm_sword2.mmp",
- "mmp/scummvm_touche.mmp",
- "mmp/scummvm_tinsel.mmp",
- "mmp/scummvm_tucker.mmp",
- "mmp/scummvm_sci.mmp",
- "mmp/scummvm_draci.mmp",
"mmp/scummvm_teenagent.mmp",
- "mmp/scummvm_mohawk.mmp",
- "mmp/scummvm_hugo.mmp",
+ "mmp/scummvm_tinsel.mmp",
+ "mmp/scummvm_toltecs.mmp",
+ "mmp/scummvm_tony.mmp",
"mmp/scummvm_toon.mmp",
- "mmp/scummvm_lastexpress.mmp",
+ "mmp/scummvm_touche.mmp",
"mmp/scummvm_tsage.mmp",
- "mmp/scummvm_tony.mmp",
- "mmp/scummvm_hopkins.mmp",
- "mmp/scummvm_toltecs.mmp",
- "mmp/scummvm_pegasus.mmp",
+ "mmp/scummvm_tucker.mmp",
"mmp/scummvm_wintermute.mmp",
+ # New engines
+ "mmp/scummvm_avalanche.mmp",
+ "mmp/scummvm_bbvs.mmp",
+ "mmp/scummvm_dreamweb.mmp",
+ "mmp/scummvm_fullpipe.mmp",
+ "mmp/scummvm_lastexpress.mmp",
+ "mmp/scummvm_mads.mmp",
+ "mmp/scummvm_mortevielle.mmp",
+ "mmp/scummvm_sword25.mmp",
+ "mmp/scummvm_testbed.mmp",
+ "mmp/scummvm_zvision.mmp",
+ "mmp/scummvm_voyeur.mmp",
# Target Platform Project Files
"S60/ScummVM_S60.mmp",
"S60v3/ScummVM_S60v3.mmp",
@@ -79,10 +91,14 @@ Preparing to update all the Symbian MMP project files with objects from module.m
# some modules.mk files have #ifndef ENABLE_XXXX blocks:
my @section_empty = (""); # section standard: no #ifdef's in module.mk files
-my @sections_scumm = ("", "ENABLE_SCUMM_7_8", "ENABLE_HE"); # special sections for engine SCUMM
-my @sections_saga = ("", "ENABLE_IHNM", "ENABLE_SAGA2"); # special sections for engine SAGA
-my @sections_kyra = ("", "ENABLE_LOL","ENABLE_EOB"); # special sections for engine KYRA
my @sections_agos = ("", "ENABLE_AGOS2"); # special sections for engine AGOS
+my @section_video = ("", "USE_BINK"); # special sections for engine VIDEO ###, "USE_THEORADEC"
+my @sections_groovie = ("", "ENABLE_GROOVIE2"); # special sections for engine GROOVIE
+my @sections_kyra = ("", "ENABLE_LOL","ENABLE_EOB"); # special sections for engine KYRA
+my @sections_mohawk = ("", "ENABLE_CSTIME", "ENABLE_MYST", "ENABLE_RIVEN"); # special sections for engine MOHAWK
+my @sections_saga = ("", "ENABLE_IHNM", "ENABLE_SAGA2"); # special sections for engine SAGA
+my @sections_sci = ("", "ENABLE_SCI32"); # special sections for engine SCI
+my @sections_scumm = ("", "ENABLE_SCUMM_7_8", "ENABLE_HE"); # special sections for engine SCUMM
# files excluded from build, case insensitive, will be matched in filename string only
my @excludes_snd = (
@@ -126,20 +142,21 @@ my @excludes_scumm = (
);
-#arseModule(mmpStr, dirStr, ifdefArray, [exclusionsArray])
+#ParseModule(mmpStr, dirStr, ifdefArray, [exclusionsArray])
ParseModule("_base", "base", \@section_empty); # now in ./TRG/ScummVM_TRG.mmp, these never change anyways...
ParseModule("_base", "common", \@section_empty);
ParseModule("_base", "gui", \@section_empty, \@excludes_gui);
ParseModule("_base", "graphics", \@section_empty, \@excludes_graphics);
+ParseModule("_base", "image", \@section_empty);
ParseModule("_base", "audio", \@section_empty, \@excludes_snd);
-ParseModule("_base", "video", \@section_empty);
+ParseModule("_base", "video", \@section_video); #
chdir("engines/");
ParseModule("_scumm", "scumm", \@sections_scumm, \@excludes_scumm );
ParseModule("_queen", "queen", \@section_empty);
ParseModule("_agos", "agos", \@sections_agos);
-ParseModule("_sky", "sky", \@section_empty);
-ParseModule("_gob", "gob", \@section_empty);
+ParseModule("_sky", "sky", \@section_empty);
+ParseModule("_gob", "gob", \@section_empty);
ParseModule("_saga", "saga", \@sections_saga);
ParseModule("_kyra", "kyra", \@sections_kyra);
ParseModule("_sword1", "sword1", \@section_empty);
@@ -148,29 +165,41 @@ ParseModule("_lure", "lure", \@section_empty);
ParseModule("_cine", "cine", \@section_empty);
ParseModule("_cge", "cge", \@section_empty);
ParseModule("_composer","composer", \@section_empty);
-ParseModule("_agi", "agi", \@section_empty);
+ParseModule("_agi", "agi", \@section_empty);
ParseModule("_touche", "touche", \@section_empty);
ParseModule("_parallaction","parallaction",\@section_empty);
ParseModule("_cruise", "cruise", \@section_empty);
ParseModule("_drascula","drascula", \@section_empty);
ParseModule("_made", "made", \@section_empty);
-ParseModule("_m4", "m4", \@section_empty);
+ParseModule("_m4", "m4", \@section_empty);
ParseModule("_tinsel", "tinsel", \@section_empty);
-ParseModule("_groovie", "groovie", \@section_empty);
+ParseModule("_groovie", "groovie", \@sections_groovie);
ParseModule("_tucker", "tucker", \@section_empty);
-ParseModule("_sci", "sci", \@section_empty);
+ParseModule("_sci", "sci", \@sections_sci);
ParseModule("_draci", "draci", \@section_empty);
ParseModule("_teenagent","teenagent", \@section_empty);
-ParseModule("_mohawk" ,"mohawk", \@section_empty);
+ParseModule("_mohawk" ,"mohawk", \@sections_mohawk);
ParseModule("_hugo" ,"hugo", \@section_empty);
ParseModule("_toon" ,"toon", \@section_empty);
ParseModule("_lastexpress","lastexpress", \@section_empty);
-ParseModule("_tsage","tsage", \@section_empty);
-ParseModule("_tony","tony", \@section_empty);
+ParseModule("_tsage", "tsage", \@section_empty);
+ParseModule("_tony", "tony", \@section_empty);
ParseModule("_toltecs","toltecs", \@section_empty);
ParseModule("_hopkins","hopkins", \@section_empty);
ParseModule("_pegasus","pegasus", \@section_empty);
ParseModule("_wintermute","wintermute", \@section_empty);
+##### new engines
+ParseModule("_avalanche" ,"avalanche", \@section_empty);
+ParseModule("_dreamweb" ,"dreamweb", \@section_empty);
+ParseModule("_fullpipe" ,"fullpipe", \@section_empty);
+ParseModule("_mads" ,"mads", \@section_empty);
+ParseModule("_mortevielle" ,"mortevielle", \@section_empty);
+ParseModule("_neverhood" ,"neverhood", \@section_empty);
+ParseModule("_sword25" ,"sword25", \@section_empty);
+ParseModule("_testbed" ,"testbed", \@section_empty);
+ParseModule("_zvision" ,"zvision", \@section_empty);
+ParseModule("_voyeur" ,"voyeur", \@section_empty);
+ParseModule("_bbvs" ,"bbvs", \@section_empty);
print "
=======================================================================================
Done. Enjoy :P
diff --git a/backends/platform/symbian/BuildPackageUpload_AllVersions.pl b/backends/platform/symbian/BuildPackageUpload_AllVersions.pl
index 3062068852..a038bd90f8 100644
--- a/backends/platform/symbian/BuildPackageUpload_AllVersions.pl
+++ b/backends/platform/symbian/BuildPackageUpload_AllVersions.pl
@@ -1,6 +1,7 @@
use Cwd;
use Switch;
+#use feature "switch";
system("cls");
require "BuildPackageUpload_LocalSettings.pl";
@@ -59,9 +60,14 @@ $ftp_url = "FTP://$FTP_User\@$FTP_Host/$FTP_Dir/";
# these macros are always defined:
$ExtraMacros = "MACRO NONSTANDARD_PORT\n";
-$ExtraMacros .= "MACRO ENABLE_VKEYBD\n";
+$ExtraMacros .= "MACRO ENABLE_VKEYBD\n";
$ExtraMacros .= "MACRO DISABLE_FANCY_THEMES\n";
$ExtraMacros .= "MACRO USE_TRANSLATION\n";
+$ExtraMacros .= "MACRO USE_BINK\n";
+#$ExtraMacros .= "MACRO USE_THEORADEC\n";
+#$ExtraMacros .= "MACRO USE_MPEG2\n";
+# $ExtraMacros .= "MACRO \n";
+# candidates are : , USE_TIMIDITY,
# prep nice list of SDKs
#while( ($SDK, $RootDir) = each(%SDK_RootDirs) )
diff --git a/backends/platform/symbian/BuildPackageUpload_LocalSettings.pl b/backends/platform/symbian/BuildPackageUpload_LocalSettings.pl
index ded4ef198f..12fc2668e3 100644
--- a/backends/platform/symbian/BuildPackageUpload_LocalSettings.pl
+++ b/backends/platform/symbian/BuildPackageUpload_LocalSettings.pl
@@ -2,24 +2,33 @@
##################################################################################################################
@WorkingEngines = qw(
- scumm agos sky queen gob groovie saga drascula
- kyra lure agi touche parallaction cine
- cruise made tinsel tucker sword1 sword2 draci sci teenagent mohawk hugo toon lastexpress tsage cge
- composer toltecs tony wintermute pegasus
+ agos agi bbvs cine cge composer cruise draci
+ drascula hugo gob groovie kyra lastexpress
+ lure made mohawk parallaction pegasus queen
+ saga sci scumm sky sword1 sword2 teenagent tinsel
+ toltecs tony toon touche tsage tucker wintermute
+ dreamweb fullpipe hopkins mortevielle mads
+ neverhood testbed avalanche zvision voyeur
);
+#### New engines
+#### sword25
@WorkingEngines_1st = qw(
- scumm queen groovie saga drascula
- touche parallaction cine
-? cruise made tucker lastexpress composer wintermute
+ cine composer cruise drascula groovie
+ lastexpress made parallaction queen
+ saga scumm touche tucker wintermute
+ avalanche zvision voyeur
);
@WorkingEngines_2nd = qw(
- agos sky gob kyra lure
- agi tinsel sword1 sword2
- draci sci teenagent hugo toon
- tsage cge toltecs tony pegasus
+ agi agos bbvs cge draci gob hopkins
+ hugo kyra lure mohawk pegasus sci
+ sky sword1 sword2 teenagent mads
+ tinsel tsage toltecs tony toon
+ dreamweb fullpipe mortevielle
+ neverhood testbed
);
+#### sword25
@TestingEngines = qw(
@@ -34,20 +43,34 @@
lol
agos2
eob
+ cstime
+ myst
+ riven
+ saga2
+ sci32
+ groovie2
);
#disabled subengines lol saga2 personal nightmare
+ # see configure.engines
%UseableFeatures = (
- 'zlib' => 'zlib.lib',
+ 'freetype2' => 'freetype.lib',
+ 'faad' => 'libFAAD2.lib',
+ 'flac' => 'libflacdec.lib',
+ 'jpeg' => 'libjpeg.lib',
'mad' => 'libmad.lib',
+ 'mpeg2' => 'libmpeg2.lib',
+ 'png' => 'libpng.lib',
'tremor' => 'libtremor.lib',
- 'flac' => 'libflac.lib'
+ 'theoradec' => 'theora.lib',
+ 'zlib' => 'zlib.lib'
);
# these are normally enabled for each variation
#$DefaultFeatures = qw(zlib,mad);
- $DefaultFeatures = qw(zlib,mad,tremor,flac);
+ #$DefaultFeatures = qw(zlib,mad,tremor,);
+ $DefaultFeatures = qw(faad,flac,freetype2,jpeg,mad,mpeg2,png,theoradec,tremor,zlib,);
##################################################################################################################
##
@@ -64,7 +87,8 @@
$HaltOnError = 0;
$SkipExistingPackages = 0;
$ReallyQuiet = 0;
- $DevBase = "C:\\S";
+ $DevBase = "D:\\Symbian";
+ $Compiler = "D:\\Program/ Files\\CodeSourcery\\Sourcery/ G++ Lite";
# specify an optional FTP server to upload to after each Build+Package (can leave empty)
#$FTP_Host = "host.com";
@@ -77,14 +101,14 @@
# Note1: the \epoc32 directory needs to be in these rootdirs
# Note2: these paths do NOT end in a backslash!
# $SDK_RootDirs{'UIQ2'} = "$DevBase\\UIQ_21";
- $SDK_RootDirs{'UIQ3'} = "$DevBase\\UIQ3";
+ # $SDK_RootDirs{'UIQ3'} = "$DevBase\\UIQ3";
# $SDK_RootDirs{'S60v1'} = "$DevBase\\S60v1";
# $SDK_RootDirs{'S60v2'} = "$DevBase\\S60v2";
- $SDK_RootDirs{'S60v3'} = "$DevBase\\S60v3";
+ $SDK_RootDirs{'S60v3'} = "$DevBase\\S60v5";
# $SDK_RootDirs{'S80'} = "$DevBase\\S80";
# $SDK_RootDirs{'S90'} = "$DevBase\\S90";
- $SDK_ToolchainDirs{'S60v3'} = "$DevBase\\arm-symbianelf\\bin";
+ $SDK_ToolchainDirs{'S60v3'} = "$Compiler\\arm-symbianelf\\bin";
$SDK_ToolchainDirs{'UIQ2'} = "$DevBase\\ECompXL\\bin"; # only needed for UIQ2/UIQ3
$SDK_ToolchainDirs{'UIQ3'} = "$DevBase\\ECompXL\\bin"; # only needed for UIQ2/UIQ3
@@ -94,14 +118,14 @@
{
## Standard libraries
$SDK_LibraryDirs{'ALL'}{'zlib.lib'} = "$DevBase\\zlib-1.2.2\\epoc";
- #$SDK_LibraryDirs{'ALL'}{'libmad.lib'} = "$DevBase\\libmad-0.15.1b\\group";
+ $SDK_LibraryDirs{'ALL'}{'libmad.lib'} = "$DevBase\\libmad-0.15.1b\\group";
$SDK_LibraryDirs{'ALL'}{'libtremor.lib'}= "$DevBase\\tremor\\epoc";
## SDL 1.2.12 / AnotherGuest / Symbian version
my $SdlBase = "$DevBase\\SDL-1.2.12-ag\\Symbian";
#$SDK_LibraryDirs{'S60v1'}{'esdl.lib'} = "$SdlBase\\S60"; // unsupported?
#$SDK_LibraryDirs{'S60v2'}{'esdl.lib'} = "$SdlBase\\S60v2";
- $SDK_LibraryDirs{'S60v3'}{'esdl.lib'} = "$SdlBase\\S60v3";
+ $SDK_LibraryDirs{'S60v3'}{'esdl.lib'} = "$SdlBase\\S60v5";
#$SDK_LibraryDirs{'S80'}{'esdl.lib'} = "$SdlBase\\S80";
#$SDK_LibraryDirs{'S90'}{'esdl.lib'} = "$SdlBase\\S90";
#$SDK_LibraryDirs{'UIQ2'}{'esdl.lib'} = "$SdlBase\\UIQ2"
@@ -186,7 +210,7 @@
# now you can add $VariationSets only built on this PC below this line :)
}
- elsif ($ENV{'COMPUTERNAME'} eq "EMBEDDEV-LAPE") #################################################################
+ elsif ($ENV{'COMPUTERNAME'} eq "EMBEDDEV-VAIO2") #################################################################
{
$Producer = "AnotherGuest";
$RedirectSTDERR = 1;
@@ -206,7 +230,7 @@
$SDK_RootDirs{'S60v3'}= "G:\\S60v3";
#$SDK_RootDirs{'S80'}= "D:\\S80";
#$SDK_RootDirs{'S90'}= "D:\\S90";
- $ECompXL_BinDir= "D:\\ECompXL\\";
+ #$ECompXL_BinDir= "D:\\ECompXL\\";
if (0) # so we can turn them on/off easily
{
# $SDK_LibraryDirs{'ALL'}{'zlib.lib'} = "C:\\S\\zlib-1.2.2\\epoc";
@@ -223,38 +247,42 @@
# now you can add $VariationSets only built on this PC below this line :)
}
- elsif ($ENV{'COMPUTERNAME'} eq "EMBEDDEV_VAIO1") #################################################################
+ elsif ($ENV{'COMPUTERNAME'} eq "FEDOR4EVER") #################################################################
{
- $Producer = "AnotherGuest";
+ $Producer = "Fedor";
$RedirectSTDERR = 1;
$HaltOnError = 0;
- $SkipExistingPackages = 1;
- $ReallyQuiet = 1;
+ $SkipExistingPackages = 0;
+ $ReallyQuiet = 0;
+ $Compiler = "D:\\Program/ Files\\CodeSourcery\\Sourcery/ G++/ Lite";
#$FTP_Host = "host.com";
#$FTP_User = "ag@host.com";
#$FTP_Pass = "password";
#$FTP_Dir = "cvsbuilds";
- #$SDK_RootDirs{'UIQ2'}= "D:\\UIQ2";
- $SDK_RootDirs{'UIQ3'}= "G:\\UIQ3";
- #$SDK_RootDirs{'S60v1'}= "D:\\S60v1";
- #$SDK_RootDirs{'S60v2'}= "D:\\S60v2";
- $SDK_RootDirs{'S60v3'}= "G:\\S60v3";
- #$SDK_RootDirs{'S80'}= "D:\\S80";
- #$SDK_RootDirs{'S90'}= "D:\\S90";
- #$ECompXL_BinDir= "D:\\ECompXL\\";
+ #$SDK_RootDirs{'UIQ2'}= "C:\\UIQ2";
+ #$SDK_RootDirs{'UIQ3'}= "C:\\UIQ3";
+ #$SDK_RootDirs{'S60v1'}= "C:\\S60v1";
+ #$SDK_RootDirs{'S60v2'}= "C:\\S60v2";
+ #$SDK_RootDirs{'S80'}= "C:\\S80";
+ #$SDK_RootDirs{'S90'}= "C:\\S90";
+ #$ECompXL_BinDir= "C:\\ECompXL\\";
+
+ $SDK_RootDirs{'S60v3'}= "D:\\Symbian\\S60_5th_Edition_SDK_v1.0";
+ $SDK_ToolchainDirs{'S60v3'} = "$Compiler\\arm-symbianelf\\bin";
+
+ # these supporting libraries get built first, then all the Variations
+ # Note: the string {'xxx.lib'} is used in checking in build success: so needs to be accurate!
if (0) # so we can turn them on/off easily
{
# $SDK_LibraryDirs{'ALL'}{'zlib.lib'} = "C:\\S\\zlib-1.2.2\\epoc";
-# $SDK_LibraryDirs{'ALL'}{'libmad.lib'} = "C:\\S\\libmad-0.15.1b\\group";
-# $SDK_LibraryDirs{'ALL'}{'libtremor.lib'}= "C:\\tremor\\epoc";
- $SDK_LibraryDirs{'UIQ2'}{'esdl.lib'} = "E:\\WICKED\\ESDL\\epoc\\UIQ";
- $SDK_LibraryDirs{'S60v1'}{'esdl.lib'} = $SDK_LibraryDirs{'S60v2'}{'esdl.lib'} = "E:\\WICKED\\ESDL\\epoc\\S60";
- $SDK_LibraryDirs{'S80'}{'esdl.lib'} = "E:\\WICKED\\ESDL\\epoc\\S80";
- $SDK_LibraryDirs{'S90'}{'esdl.lib'} = "E:\\WICKED\\ESDL\\epoc\\S90";
- $SDK_LibraryDirs{'S60v3'}{'esdl.lib'} = "E:\\WICKED\\ESDL\\epoc\\S60\\S60V3";
- $SDK_LibraryDirs{'UIQ3'}{'esdl.lib'} = "E:\\WICKED\\ESDL\\epoc\\UIQ\\UIQ3";
+ $SDK_LibraryDirs{'ALL'}{'libmad.lib'} = "D:\\Symbian\\Projects\\SDL\\libs\\libmad-0.15.1b\\epoc";
+# $SDK_LibraryDirs{'ALL'}{'libtremor.lib'}= "D:\\Symbian\\Projects\\SDL\\libs\\Tremor\\epoc";
+# $SDK_LibraryDirs{'UIQ2'}{'esdl.lib'} = $SDK_LibraryDirs{'UIQ3'}{'esdl.lib'} = "C:\\S\\ESDL\\epoc\\UIQ";
+# $SDK_LibraryDirs{'S60v1'}{'esdl.lib'} = $SDK_LibraryDirs{'S60v2'}{'esdl.lib'} = $SDK_LibraryDirs{'S60v3'}{'esdl.lib'} = "C:\\S\\ESDL\\epoc\\S60";
+# $SDK_LibraryDirs{'S80'}{'esdl.lib'} = "C:\\S\\ESDL\\epoc\\S80";
+# $SDK_LibraryDirs{'S90'}{'esdl.lib'} = "C:\\S\\ESDL\\epoc\\S90";
}
# now you can add $VariationSets only built on this PC below this line :)
@@ -297,9 +325,10 @@
{
# the first one includes all SDKs & release-ready engines
- $VariationSets{'ALL'}{'all'} = "$DefaultFeatures @WorkingEngines @EnablableSubEngines";
-# $VariationSets{'ALL'}{'1St'} = "$DefaultFeatures @WorkingEngines_1st @EnablableSubEngines";
-# $VariationSets{'ALL'}{'2nd'} = "$DefaultFeatures @WorkingEngines_2nd @EnablableSubEngines";
+ # $VariationSets{'ALL'}{'all'} = "$DefaultFeatures @WorkingEngines @EnablableSubEngines";
+ $VariationSets{'ALL'}{'split'} = "$DefaultFeatures @WorkingEngines @EnablableSubEngines";
+ # $VariationSets{'ALL'}{'1St'} = "$DefaultFeatures @WorkingEngines_1st @EnablableSubEngines";
+ # $VariationSets{'ALL'}{'2nd'} = "$DefaultFeatures @WorkingEngines_2nd @EnablableSubEngines";
# now one for each ready-for-release engine
if (0)
{
diff --git a/backends/platform/symbian/README b/backends/platform/symbian/README
index 58cbc7814a..8a44e9399d 100644
--- a/backends/platform/symbian/README
+++ b/backends/platform/symbian/README
@@ -1,8 +1,9 @@
ScummVM - ScummVM ported to EPOC/SymbianOS
- Copyright (C) 2008-2013 ScummVM Team
- Copyright (C) 2003-2008 Lars 'AnotherGuest' Persson
+ Copyright (C) 2008-2014 ScummVM Team
+ Copyright (C) 2013-2013 Fedor Strizhniou aka zanac
+ Copyright (C) 2003-2013 Lars 'AnotherGuest' Persson
Copyright (C) 2002-2008 Jurgen 'SumthinWicked' Braam
Copyright (C) 2003-2005 Andreas 'Sprawl' Karlsson
@@ -24,6 +25,15 @@ 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.7.0
+ * Nothing significant in the Symbian port, except SDL improvements (new SDL version used)
+
+Release version: 1.6.0
+ * Nothing significant in the Symbian port, except SDL improvements (new SDL version used)
+
+ Release version: 1.5.0
+ * Nothing significant in the Symbian port, except SDL improvements (new SDL version used)
+
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
diff --git a/backends/platform/symbian/S60/ScummVM_S60.mmp.in b/backends/platform/symbian/S60/ScummVM_S60.mmp.in
index 28bd11dec6..ca2ec7f930 100644
--- a/backends/platform/symbian/S60/ScummVM_S60.mmp.in
+++ b/backends/platform/symbian/S60/ScummVM_S60.mmp.in
@@ -2,7 +2,7 @@
* Copyright (C) 2003-2005 Andreas 'Sprawl' Karlsson - Original EPOC port, ESDL
* Copyright (C) 2003-2005 Lars 'AnotherGuest' Persson - Original EPOC port, Audio System
* Copyright (C) 2005 Jurgen 'SumthinWicked' Braam - EPOC/CVS maintainer
- * Copyright (C) 2005-2013 The ScummVM project
+ * Copyright (C) 2005-2014 The ScummVM Team
*
* ScummVM is the legal property of its developers, whose names
* are too numerous to list here. Please refer to the COPYRIGHT
diff --git a/backends/platform/symbian/S60/ScummVM_S60_App.mmp b/backends/platform/symbian/S60/ScummVM_S60_App.mmp
index 38d6f19590..2fc39c6838 100644
--- a/backends/platform/symbian/S60/ScummVM_S60_App.mmp
+++ b/backends/platform/symbian/S60/ScummVM_S60_App.mmp
@@ -2,7 +2,7 @@
* Copyright (C) 2003-2005 Andreas 'Sprawl' Karlsson - Original EPOC port, ESDL
* Copyright (C) 2003-2005 Lars 'AnotherGuest' Persson - Original EPOC port, Audio System
* Copyright (C) 2005 Jurgen 'SumthinWicked' Braam - EPOC/CVS maintainer
- * Copyright (C) 2005-2013 The ScummVM project
+ * Copyright (C) 2005-2014 The ScummVM Team
*
* ScummVM is the legal property of its developers, whose names
* are too numerous to list here. Please refer to the COPYRIGHT
diff --git a/backends/platform/symbian/S60v3/BLD.INF.in b/backends/platform/symbian/S60v3/BLD.INF.in
index 78d130cb08..e21bcc7d01 100644
--- a/backends/platform/symbian/S60v3/BLD.INF.in
+++ b/backends/platform/symbian/S60v3/BLD.INF.in
@@ -8,5 +8,6 @@ PRJ_MMPFILES
//STOP_AUTO_PROJECTS//
gnumakefile icons.mk
+gnumakefile ..\help\build_help.mk
.\ScummVM_A0000658_S60v3.mmp
.\ScummVM_S60v3.mmp
diff --git a/backends/platform/symbian/S60v3/ScummVM_A0000658_S60v3.mmp.in b/backends/platform/symbian/S60v3/ScummVM_A0000658_S60v3.mmp.in
index 99b89efba8..cbb9679340 100644
--- a/backends/platform/symbian/S60v3/ScummVM_A0000658_S60v3.mmp.in
+++ b/backends/platform/symbian/S60v3/ScummVM_A0000658_S60v3.mmp.in
@@ -34,6 +34,8 @@ TARGET ScummVM_A0000658.exe
TARGETPATH sys\bin
TARGETTYPE exe
OPTION GCCE -Wno-multichar -Wno-reorder -Wno-unused -Wno-format -fsigned-char
+// fixes error "section .data loaded at [...] overlaps section .text loaded at [...]"
+LINKEROPTION GCCE -Tdata 0xAA00000
UID 0x100039ce 0xA0000658
@@ -90,9 +92,15 @@ STATICLIBRARY esdl.lib
USERINCLUDE ..\..\..\.. ..\..\..\..\gui ..\..\..\..\engines
USERINCLUDE ..\..\..\..\backends\fs ..\src ..\..\..\..\backends\platform\sdl ..\..\..\..\audio
+SYSTEMINCLUDE \epoc32\include\freetype
+SYSTEMINCLUDE \epoc32\include\mpeg2dec
+SYSTEMINCLUDE \epoc32\include\jpeg
+SYSTEMINCLUDE \epoc32\include\png
SYSTEMINCLUDE \epoc32\include\ESDL
SYSTEMINCLUDE \epoc32\include\ZLIB // before \epoc32\include because symbian already has older version
SYSTEMINCLUDE \epoc32\include\libc
+SYSTEMINCLUDE \epoc32\include\theora
+SYSTEMINCLUDE \epoc32\include\tremor
SYSTEMINCLUDE \epoc32\include
SYSTEMINCLUDE \epoc32\include\mw
SYSTEMINCLUDE \epoc32\include\platform
diff --git a/backends/platform/symbian/S60v3/ScummVM_S60v3.mmp.in b/backends/platform/symbian/S60v3/ScummVM_S60v3.mmp.in
index 1e0f282bc4..899d10dbe3 100644
--- a/backends/platform/symbian/S60v3/ScummVM_S60v3.mmp.in
+++ b/backends/platform/symbian/S60v3/ScummVM_S60v3.mmp.in
@@ -35,6 +35,9 @@ TARGETPATH sys\bin
TARGETTYPE exe
OPTION GCCE -Wno-multichar -Wno-reorder -Wno-unused -Wno-format -fsigned-char
+// fixes error "section .data loaded at [...] overlaps section .text loaded at [...]"
+LINKEROPTION GCCE -Tdata 0xAA00000
+
UID 0x100039ce 0xA0000657
START RESOURCE ScummVM_reg.rss
@@ -90,9 +93,15 @@ STATICLIBRARY esdl.lib
USERINCLUDE ..\..\..\.. ..\..\..\..\gui ..\..\..\..\engines
USERINCLUDE ..\..\..\..\backends\fs ..\src ..\..\..\..\backends\platform\sdl ..\..\..\..\audio
+SYSTEMINCLUDE \epoc32\include\freetype
+SYSTEMINCLUDE \epoc32\include\mpeg2dec
+SYSTEMINCLUDE \epoc32\include\jpeg
+SYSTEMINCLUDE \epoc32\include\png
SYSTEMINCLUDE \epoc32\include\ESDL
SYSTEMINCLUDE \epoc32\include\ZLIB // before \epoc32\include because symbian already has older version
SYSTEMINCLUDE \epoc32\include\libc
+SYSTEMINCLUDE \epoc32\include\theora
+SYSTEMINCLUDE \epoc32\include\tremor
SYSTEMINCLUDE \epoc32\include
SYSTEMINCLUDE \epoc32\include\mw
SYSTEMINCLUDE \epoc32\include\platform
@@ -140,7 +149,7 @@ source engines\obsolete.cpp
LIBRARY cone.lib eikcore.lib
LIBRARY euser.lib apparc.lib fbscli.lib
LIBRARY estlib.lib apgrfx.lib
-LIBRARY gdi.lib hal.lib bitgdi.lib
+LIBRARY gdi.lib hal.lib bitgdi.lib esock.lib
LIBRARY mediaclientaudiostream.lib efsrv.lib ws32.lib
library avkon.lib bafl.lib remconcoreapi.lib remconinterfacebase.lib
diff --git a/backends/platform/symbian/S60v3/scummvm-CVS-SymbianS60v3.pkg b/backends/platform/symbian/S60v3/scummvm-CVS-SymbianS60v3.pkg
index 4c6b1b05f8..5f74bee1c7 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,60,0
+#{"ScummVM S60v3"},(0xA0000657),1,70,0
;Supports Series 60 v 3.0
[0x101F7961], 0, 0, 0, {"Series60ProductID"}
@@ -57,16 +57,22 @@
"..\..\..\..\README"-"!:\resource\apps\scummvm\README"
"..\..\..\..\NEWS"-"!:\resource\apps\scummvm\NEWS"
+; Scummvm help
+"..\help\ScummVM.hlp"-"!:\resource\help\ScummVM.hlp"
+
; 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\drascula.dat"-"c:\data\scummvm\drascula.dat"
"..\..\..\..\dists\engine-data\hugo.dat"-"c:\data\scummvm\hugo.dat"
+"..\..\..\..\dists\engine-data\kyra.dat"-"c:\data\scummvm\kyra.dat"
"..\..\..\..\dists\engine-data\lure.dat"-"c:\data\scummvm\lure.dat"
-"..\..\..\..\dists\engine-data\drascula.dat"-"c:\data\scummvm\drascula.dat"
+"..\..\..\..\dists\engine-data\mort.dat"-"c:\data\scummvm\mort.dat"
+"..\..\..\..\dists\engine-data\neverhood.dat"-"c:\data\scummvm\neverhood.dat"
+"..\..\..\..\dists\engine-data\queen.tbl"-"c:\data\scummvm\queen.tbl"
+"..\..\..\..\dists\engine-data\sky.cpt"-"c:\data\scummvm\sky.cpt"
"..\..\..\..\dists\engine-data\teenagent.dat"-"c:\data\scummvm\teenagent.dat"
+"..\..\..\..\dists\engine-data\tony.dat"-"c:\data\scummvm\tony.dat"
"..\..\..\..\dists\engine-data\toon.dat"-"c:\data\scummvm\toon.dat"
"..\..\..\..\dists\engine-data\wintermute.zip"-"c:\data\scummvm\wintermute.zip"
-"..\..\..\..\dists\engine-data\tony.dat"-"c:\data\scummvm\tony.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"
diff --git a/backends/platform/symbian/S60v3/scummvm-CVS-SymbianS60v3_split.pkg b/backends/platform/symbian/S60v3/scummvm-CVS-SymbianS60v3_split.pkg
index d3fd0450fa..4ef085d600 100644
--- a/backends/platform/symbian/S60v3/scummvm-CVS-SymbianS60v3_split.pkg
+++ b/backends/platform/symbian/S60v3/scummvm-CVS-SymbianS60v3_split.pkg
@@ -36,7 +36,7 @@
:"ScummVM"
; UID is the app's UID
-#{"ScummVM S60v3"},(0xA0000657),1,60,0
+#{"ScummVM S60v3"},(0xA0000657),1,70,6
;Supports Series 60 v 3.0
[0x101F7961], 0, 0, 0, {"Series60ProductID"}
@@ -65,16 +65,22 @@
"..\..\..\..\README"-"!:\resource\apps\scummvm\README"
"..\..\..\..\NEWS"-"!:\resource\apps\scummvm\NEWS"
+; Scummvm help
+"..\help\ScummVM.hlp"-"!:\resource\help\ScummVM.hlp"
+
; 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\drascula.dat"-"c:\data\scummvm\drascula.dat"
"..\..\..\..\dists\engine-data\hugo.dat"-"c:\data\scummvm\hugo.dat"
+"..\..\..\..\dists\engine-data\kyra.dat"-"c:\data\scummvm\kyra.dat"
"..\..\..\..\dists\engine-data\lure.dat"-"c:\data\scummvm\lure.dat"
-"..\..\..\..\dists\engine-data\drascula.dat"-"c:\data\scummvm\drascula.dat"
+"..\..\..\..\dists\engine-data\mort.dat"-"c:\data\scummvm\mort.dat"
+"..\..\..\..\dists\engine-data\neverhood.dat"-"c:\data\scummvm\neverhood.dat"
+"..\..\..\..\dists\engine-data\queen.tbl"-"c:\data\scummvm\queen.tbl"
+"..\..\..\..\dists\engine-data\sky.cpt"-"c:\data\scummvm\sky.cpt"
"..\..\..\..\dists\engine-data\teenagent.dat"-"c:\data\scummvm\teenagent.dat"
+"..\..\..\..\dists\engine-data\tony.dat"-"c:\data\scummvm\tony.dat"
"..\..\..\..\dists\engine-data\toon.dat"-"c:\data\scummvm\toon.dat"
-"..\..\..\..\dists\engine-data\wintermute.zip-"c:\data\scummvm\wintermute.zip"
-"..\..\..\..\dists\engine-data\tony.dat-"c:\data\scummvm\tony.dat"
+"..\..\..\..\dists\engine-data\wintermute.zip"-"c:\data\scummvm\wintermute.zip"
"..\..\..\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"
diff --git a/backends/platform/symbian/S80/ScummVM_S80.mmp.in b/backends/platform/symbian/S80/ScummVM_S80.mmp.in
index d9b9a5c948..34d1979fe5 100644
--- a/backends/platform/symbian/S80/ScummVM_S80.mmp.in
+++ b/backends/platform/symbian/S80/ScummVM_S80.mmp.in
@@ -2,7 +2,7 @@
* Copyright (C) 2003-2005 Andreas 'Sprawl' Karlsson - Original EPOC port, ESDL
* Copyright (C) 2003-2005 Lars 'AnotherGuest' Persson - Original EPOC port, Audio System
* Copyright (C) 2005 Jurgen 'SumthinWicked' Braam - EPOC/CVS maintainer
- * Copyright (C) 2005-2013 The ScummVM project
+ * Copyright (C) 2005-2014 The ScummVM Team
*
* ScummVM is the legal property of its developers, whose names
* are too numerous to list here. Please refer to the COPYRIGHT
diff --git a/backends/platform/symbian/S80/ScummVM_S80_App.mmp b/backends/platform/symbian/S80/ScummVM_S80_App.mmp
index 30b1c3f58b..de96963d80 100644
--- a/backends/platform/symbian/S80/ScummVM_S80_App.mmp
+++ b/backends/platform/symbian/S80/ScummVM_S80_App.mmp
@@ -2,7 +2,7 @@
* Copyright (C) 2003-2005 Andreas 'Sprawl' Karlsson - Original EPOC port, ESDL
* Copyright (C) 2003-2005 Lars 'AnotherGuest' Persson - Original EPOC port, Audio System
* Copyright (C) 2005 Jurgen 'SumthinWicked' Braam - EPOC/CVS maintainer
- * Copyright (C) 2005-2013 The ScummVM project
+ * Copyright (C) 2005-2014 The ScummVM Team
*
* ScummVM is the legal property of its developers, whose names
* are too numerous to list here. Please refer to the COPYRIGHT
diff --git a/backends/platform/symbian/S90/Scummvm_S90.mmp.in b/backends/platform/symbian/S90/Scummvm_S90.mmp.in
index 790dca14f0..e65397b145 100644
--- a/backends/platform/symbian/S90/Scummvm_S90.mmp.in
+++ b/backends/platform/symbian/S90/Scummvm_S90.mmp.in
@@ -2,7 +2,7 @@
* Copyright (C) 2003-2005 Andreas 'Sprawl' Karlsson - Original EPOC port, ESDL
* Copyright (C) 2003-2005 Lars 'AnotherGuest' Persson - Original EPOC port, Audio System
* Copyright (C) 2005 Jurgen 'SumthinWicked' Braam - EPOC/CVS maintainer
- * Copyright (C) 2005-2013 The ScummVM project
+ * Copyright (C) 2005-2014 The ScummVM Team
*
* ScummVM is the legal property of its developers, whose names
* are too numerous to list here. Please refer to the COPYRIGHT
diff --git a/backends/platform/symbian/S90/Scummvm_S90_App.mmp b/backends/platform/symbian/S90/Scummvm_S90_App.mmp
index cf17f103ef..88a3e4d221 100644
--- a/backends/platform/symbian/S90/Scummvm_S90_App.mmp
+++ b/backends/platform/symbian/S90/Scummvm_S90_App.mmp
@@ -2,7 +2,7 @@
* Copyright (C) 2003-2005 Andreas 'Sprawl' Karlsson - Original EPOC port, ESDL
* Copyright (C) 2003-2005 Lars 'AnotherGuest' Persson - Original EPOC port, Audio System
* Copyright (C) 2005 Jurgen 'SumthinWicked' Braam - EPOC/CVS maintainer
- * Copyright (C) 2005-2013 The ScummVM project
+ * Copyright (C) 2005-2014 The ScummVM Team
*
* ScummVM is the legal property of its developers, whose names
* are too numerous to list here. Please refer to the COPYRIGHT
diff --git a/backends/platform/symbian/UIQ2/ScummVM.rss b/backends/platform/symbian/UIQ2/ScummVM.rss
index bfdd07e898..2e02f1da1d 100644
--- a/backends/platform/symbian/UIQ2/ScummVM.rss
+++ b/backends/platform/symbian/UIQ2/ScummVM.rss
@@ -2,7 +2,7 @@
* Copyright (C) 2003-2005 Andreas 'Sprawl' Karlsson - Original EPOC port, ESDL
* Copyright (C) 2003-2005 Lars 'AnotherGuest' Persson - Original EPOC port, Audio System
* Copyright (C) 2005 Jurgen 'SumthinWicked' Braam - EPOC/CVS maintainer
- * Copyright (C) 2005-2013 The ScummVM project
+ * Copyright (C) 2005-2014 The ScummVM Team
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
diff --git a/backends/platform/symbian/UIQ2/ScummVM_UIQ2.mmp.in b/backends/platform/symbian/UIQ2/ScummVM_UIQ2.mmp.in
index 80ba37d694..68f5bd0cab 100644
--- a/backends/platform/symbian/UIQ2/ScummVM_UIQ2.mmp.in
+++ b/backends/platform/symbian/UIQ2/ScummVM_UIQ2.mmp.in
@@ -2,7 +2,7 @@
* Copyright (C) 2003-2005 Andreas 'Sprawl' Karlsson - Original EPOC port, ESDL
* Copyright (C) 2003-2005 Lars 'AnotherGuest' Persson - Original EPOC port, Audio System
* Copyright (C) 2005 Jurgen 'SumthinWicked' Braam - EPOC/CVS maintainer
- * Copyright (C) 2005-2006 The ScummVM project
+ * Copyright (C) 2005-2006 The ScummVM Team
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
diff --git a/backends/platform/symbian/UIQ3/ScummVM.rss b/backends/platform/symbian/UIQ3/ScummVM.rss
index b7f0a17113..11cc767671 100644
--- a/backends/platform/symbian/UIQ3/ScummVM.rss
+++ b/backends/platform/symbian/UIQ3/ScummVM.rss
@@ -2,7 +2,7 @@
* Copyright (C) 2003-2005 Andreas 'Sprawl' Karlsson - Original EPOC port, ESDL
* Copyright (C) 2003-2005 Lars 'AnotherGuest' Persson - Original EPOC port, Audio System
* Copyright (C) 2005 Jurgen 'SumthinWicked' Braam - EPOC/CVS maintainer
- * Copyright (C) 2005-2013 The ScummVM project
+ * Copyright (C) 2005-2014 The ScummVM Team
*
* ScummVM is the legal property of its developers, whose names
* are too numerous to list here. Please refer to the COPYRIGHT
diff --git a/backends/platform/symbian/UIQ3/ScummVM_A0000658.rss b/backends/platform/symbian/UIQ3/ScummVM_A0000658.rss
index b7f0a17113..11cc767671 100644
--- a/backends/platform/symbian/UIQ3/ScummVM_A0000658.rss
+++ b/backends/platform/symbian/UIQ3/ScummVM_A0000658.rss
@@ -2,7 +2,7 @@
* Copyright (C) 2003-2005 Andreas 'Sprawl' Karlsson - Original EPOC port, ESDL
* Copyright (C) 2003-2005 Lars 'AnotherGuest' Persson - Original EPOC port, Audio System
* Copyright (C) 2005 Jurgen 'SumthinWicked' Braam - EPOC/CVS maintainer
- * Copyright (C) 2005-2013 The ScummVM project
+ * Copyright (C) 2005-2014 The ScummVM Team
*
* ScummVM is the legal property of its developers, whose names
* are too numerous to list here. Please refer to the COPYRIGHT
diff --git a/backends/platform/symbian/UIQ3/ScummVM_A0000658_UIQ3.mmp.in b/backends/platform/symbian/UIQ3/ScummVM_A0000658_UIQ3.mmp.in
index fac178ad15..7c9e9032d4 100644
--- a/backends/platform/symbian/UIQ3/ScummVM_A0000658_UIQ3.mmp.in
+++ b/backends/platform/symbian/UIQ3/ScummVM_A0000658_UIQ3.mmp.in
@@ -2,7 +2,7 @@
* Copyright (C) 2003-2005 Andreas 'Sprawl' Karlsson - Original EPOC port, ESDL
* Copyright (C) 2003-2009 Lars 'AnotherGuest' Persson - Original EPOC port, Audio System
* Copyright (C) 2009 Jurgen 'SumthinWicked' Braam - EPOC/CVS maintainer
- * Copyright (C) 2005-2013 The ScummVM project
+ * Copyright (C) 2005-2014 The ScummVM Team
*
* ScummVM is the legal property of its developers, whose names
* are too numerous to list here. Please refer to the COPYRIGHT
@@ -35,6 +35,9 @@ TARGETPATH sys\bin
TARGETTYPE exe
OPTION GCCE -Wno-multichar -Wno-reorder -Wno-unused -Wno-format -fsigned-char
+// fixes error "section .data loaded at [...] overlaps section .text loaded at [...]"
+// in future simple add 'a'
+LINKEROPTION GCCE -Tdata 0xAA00000
UID 0x100039ce 0xA0000658
diff --git a/backends/platform/symbian/UIQ3/ScummVM_UIQ3.mmp.in b/backends/platform/symbian/UIQ3/ScummVM_UIQ3.mmp.in
index 0f1ec7f60f..ab2956af55 100644
--- a/backends/platform/symbian/UIQ3/ScummVM_UIQ3.mmp.in
+++ b/backends/platform/symbian/UIQ3/ScummVM_UIQ3.mmp.in
@@ -2,7 +2,7 @@
* Copyright (C) 2003-2005 Andreas 'Sprawl' Karlsson - Original EPOC port, ESDL
* Copyright (C) 2003-2005 Lars 'AnotherGuest' Persson - Original EPOC port, Audio System
* Copyright (C) 2005 Jurgen 'SumthinWicked' Braam - EPOC/CVS maintainer
- * Copyright (C) 2005-2013 The ScummVM project
+ * Copyright (C) 2005-2014 The ScummVM Team
*
* ScummVM is the legal property of its developers, whose names
* are too numerous to list here. Please refer to the COPYRIGHT
@@ -35,6 +35,9 @@ TARGETPATH sys\bin
TARGETTYPE exe
OPTION GCCE -Wno-multichar -Wno-reorder -Wno-unused -Wno-format -fsigned-char
+// fixes error "section .data loaded at [...] overlaps section .text loaded at [...]"
+// in future simple add 'a'
+LINKEROPTION GCCE -Tdata 0xAA00000
UID 0x100039ce 0xA0000657
diff --git a/backends/platform/symbian/UIQ3/scummvm-CVS-SymbianUIQ3.pkg b/backends/platform/symbian/UIQ3/scummvm-CVS-SymbianUIQ3.pkg
index c62d25dafa..b4f1cfdd5c 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,60,0
+#{"ScummVM UIQ3"},(0xA0000657),1,70,0
; ProductID for UIQ 3.0
; Product/platform version UID, Major, Minor, Build, Product ID
diff --git a/backends/platform/symbian/UIQ3/scummvm-CVS-SymbianUIQ3_split.pkg b/backends/platform/symbian/UIQ3/scummvm-CVS-SymbianUIQ3_split.pkg
index a37e0b0533..722e23a1b8 100644
--- a/backends/platform/symbian/UIQ3/scummvm-CVS-SymbianUIQ3_split.pkg
+++ b/backends/platform/symbian/UIQ3/scummvm-CVS-SymbianUIQ3_split.pkg
@@ -35,7 +35,7 @@
:"ScummVM"
; UID is the app's UID
-#{"ScummVM UIQ3"},(0xA0000657),1,60,0
+#{"ScummVM UIQ3"},(0xA0000657),1,70,0
; ProductID for UIQ 3.0
; Product/platform version UID, Major, Minor, Build, Product ID
diff --git a/backends/platform/symbian/UIQ3/scummvm_A0000658_loc.rss b/backends/platform/symbian/UIQ3/scummvm_A0000658_loc.rss
index 47e7c44642..f54bcc24d3 100644
--- a/backends/platform/symbian/UIQ3/scummvm_A0000658_loc.rss
+++ b/backends/platform/symbian/UIQ3/scummvm_A0000658_loc.rss
@@ -2,7 +2,7 @@
* Copyright (C) 2003-2005 Andreas 'Sprawl' Karlsson - Original EPOC port, ESDL
* Copyright (C) 2003-2005 Lars 'AnotherGuest' Persson - Original EPOC port, Audio System
* Copyright (C) 2005 Jurgen 'SumthinWicked' Braam - EPOC/CVS maintainer
- * Copyright (C) 2005-2013 The ScummVM project
+ * Copyright (C) 2005-2014 The ScummVM Team
*
* ScummVM is the legal property of its developers, whose names
* are too numerous to list here. Please refer to the COPYRIGHT
diff --git a/backends/platform/symbian/help/Custom.xml b/backends/platform/symbian/help/Custom.xml
new file mode 100644
index 0000000000..8bc518e036
--- /dev/null
+++ b/backends/platform/symbian/help/Custom.xml
@@ -0,0 +1,18 @@
+<?xml version="1.0"?>
+<!DOCTYPE cshcust SYSTEM "/cshlpcmp/dtd/CSHcust.dtd">
+<?xml:stylesheet href="/cshlpcmp/xsl/cshcust.xsl" title="CS-Help customization" type="text/xsl"?>
+<cshcust>
+<parastyle name="body" font="sansserif" size="10"/>
+<parastyle name="tip" font="sansserif" size="10" left="20"></parastyle>
+<parastyle name="note" font="sansserif" size="10" left="20"></parastyle>
+<parastyle name="important" font="sansserif" size="10" left="20"></parastyle>
+<body style="body"/>
+<titlestyle fontstyle="sansserif" size="10"/>
+<listbullet1style bulletchar="8226"/>
+<listbullet2style bulletchar="8226"/>
+<lists leftindent="20"/>
+</cshcust>
+
+
+
+
diff --git a/backends/platform/symbian/help/ScummVM.rtf b/backends/platform/symbian/help/ScummVM.rtf
new file mode 100644
index 0000000000..352e2e8776
--- /dev/null
+++ b/backends/platform/symbian/help/ScummVM.rtf
@@ -0,0 +1,341 @@
+{\rtf1\ansi\ansicpg1251\uc1 \deff1\deflang1049\deflangfe1049{\fonttbl{\f0\froman\fcharset204\fprq2{\*\panose 02020603050405020304}Times New Roman;}{\f1\fswiss\fcharset204\fprq2{\*\panose 020b0604020202020204}Arial;}
+{\f2\fmodern\fcharset204\fprq1{\*\panose 02070309020205020404}Courier New;}{\f3\froman\fcharset2\fprq2{\*\panose 05050102010706020507}Symbol;}{\f8\froman\fcharset0\fprq2{\*\panose 00000000000000000000}Tms Rmn;}
+{\f14\fnil\fcharset2\fprq2{\*\panose 05000000000000000000}Wingdings;}{\f28\fswiss\fcharset204\fprq2{\*\panose 020b0604020202020204}Arial CYR;}{\f29\fmodern\fcharset204\fprq1{\*\panose 02070309020205020404}Courier New CYR;}
+{\f30\froman\fcharset2\fprq2{\*\panose 05030102010509060703}Webdings;}{\f31\fswiss\fcharset204\fprq2{\*\panose 020b0506020202030204}Arial Narrow;}{\f44\froman\fcharset0\fprq2 Times New Roman;}{\f42\froman\fcharset238\fprq2 Times New Roman CE;}
+{\f45\froman\fcharset161\fprq2 Times New Roman Greek;}{\f46\froman\fcharset162\fprq2 Times New Roman Tur;}{\f47\froman\fcharset177\fprq2 Times New Roman (Hebrew);}{\f48\froman\fcharset178\fprq2 Times New Roman (Arabic);}
+{\f49\froman\fcharset186\fprq2 Times New Roman Baltic;}{\f52\fswiss\fcharset0\fprq2 Arial;}{\f50\fswiss\fcharset238\fprq2 Arial CE;}{\f53\fswiss\fcharset161\fprq2 Arial Greek;}{\f54\fswiss\fcharset162\fprq2 Arial Tur;}
+{\f55\fswiss\fcharset177\fprq2 Arial (Hebrew);}{\f56\fswiss\fcharset178\fprq2 Arial (Arabic);}{\f57\fswiss\fcharset186\fprq2 Arial Baltic;}{\f60\fmodern\fcharset0\fprq1 Courier New;}{\f58\fmodern\fcharset238\fprq1 Courier New CE;}
+{\f61\fmodern\fcharset161\fprq1 Courier New Greek;}{\f62\fmodern\fcharset162\fprq1 Courier New Tur;}{\f63\fmodern\fcharset177\fprq1 Courier New (Hebrew);}{\f64\fmodern\fcharset178\fprq1 Courier New (Arabic);}
+{\f65\fmodern\fcharset186\fprq1 Courier New Baltic;}{\f268\fswiss\fcharset0\fprq2 Arial CYR;}{\f266\fswiss\fcharset238\fprq2 Arial CYR CE;}{\f269\fswiss\fcharset161\fprq2 Arial CYR Greek;}{\f270\fswiss\fcharset162\fprq2 Arial CYR Tur;}
+{\f271\fswiss\fcharset177\fprq2 Arial CYR (Hebrew);}{\f272\fswiss\fcharset178\fprq2 Arial CYR (Arabic);}{\f273\fswiss\fcharset186\fprq2 Arial CYR Baltic;}{\f276\fmodern\fcharset0\fprq1 Courier New CYR;}{\f274\fmodern\fcharset238\fprq1 Courier New CYR CE;}
+{\f277\fmodern\fcharset161\fprq1 Courier New CYR Greek;}{\f278\fmodern\fcharset162\fprq1 Courier New CYR Tur;}{\f279\fmodern\fcharset177\fprq1 Courier New CYR (Hebrew);}{\f280\fmodern\fcharset178\fprq1 Courier New CYR (Arabic);}
+{\f281\fmodern\fcharset186\fprq1 Courier New CYR Baltic;}{\f292\fswiss\fcharset0\fprq2 Arial Narrow;}{\f290\fswiss\fcharset238\fprq2 Arial Narrow CE;}{\f293\fswiss\fcharset161\fprq2 Arial Narrow Greek;}{\f294\fswiss\fcharset162\fprq2 Arial Narrow Tur;}
+{\f297\fswiss\fcharset186\fprq2 Arial Narrow Baltic;}}{\colortbl;\red0\green0\blue0;\red0\green0\blue255;\red0\green255\blue255;\red0\green255\blue0;\red255\green0\blue255;\red255\green0\blue0;\red255\green255\blue0;\red255\green255\blue255;
+\red0\green0\blue128;\red0\green128\blue128;\red0\green128\blue0;\red128\green0\blue128;\red128\green0\blue0;\red128\green128\blue0;\red128\green128\blue128;\red192\green192\blue192;}{\stylesheet{
+\ql \li0\ri0\sa120\widctlpar\nooverflow\faroman\rin0\lin0\itap0 \f1\fs20\lang2057\langfe1033\cgrid\langnp2057\langfenp1033 \snext0 Normal;}{\s1\ql \li0\ri0\sb360\sa240\keepn\widctlpar\nooverflow\faroman\rin0\lin0\itap0
+\b\f1\fs32\lang2057\langfe1033\kerning28\cgrid\langnp2057\langfenp1033 \sbasedon0 \snext0 heading 1;}{\s2\ql \li0\ri0\sb120\sa120\keepn\widctlpar\brdrt\brdrs\brdrw30\brsp20 \brdrb\brdrs\brdrw30\brsp20 \tqr\tx9072\nooverflow\faroman\rin0\lin0\itap0
+\b\f1\fs24\lang2057\langfe1033\cgrid\langnp2057\langfenp1033 \sbasedon0 \snext0 heading 2;}{\s3\ql \li0\ri0\sb120\sa120\keepn\widctlpar\brdrt\brdrs\brdrw30\brsp20 \tqr\tx9072\nooverflow\faroman\rin0\lin0\itap0
+\b\f1\fs28\lang2057\langfe1033\cgrid\langnp2057\langfenp1033 \sbasedon0 \snext0 heading 3;}{\s4\ql \li0\ri0\sb120\sa120\keepn\widctlpar\brdrt\brdrs\brdrw15\brsp20 \tqr\tx9072\nooverflow\faroman\rin0\lin0\itap0
+\b\f1\fs24\lang2057\langfe1033\cgrid\langnp2057\langfenp1033 \sbasedon0 \snext0 heading 4;}{\s5\ql \li0\ri0\sa120\keepn\widctlpar\nooverflow\faroman\rin0\lin0\itap0 \b\f1\fs20\lang2057\langfe1033\cgrid\langnp2057\langfenp1033 \sbasedon0 \snext0
+heading 5;}{\s6\ql \li0\ri0\sb240\sa60\widctlpar\nooverflow\faroman\rin0\lin0\itap0 \i\f1\fs22\lang2057\langfe1033\cgrid\langnp2057\langfenp1033 \sbasedon0 \snext0 heading 6;}{\s7\ql \li0\ri0\sb240\sa60\widctlpar\nooverflow\faroman\rin0\lin0\itap0
+\f1\fs20\lang2057\langfe1033\cgrid\langnp2057\langfenp1033 \sbasedon0 \snext0 heading 7;}{\s8\ql \li0\ri0\sb240\sa60\widctlpar\nooverflow\faroman\rin0\lin0\itap0 \i\f1\fs20\lang2057\langfe1033\cgrid\langnp2057\langfenp1033 \sbasedon0 \snext0 heading 8;}{
+\s9\ql \li0\ri0\sb240\sa60\widctlpar\nooverflow\faroman\rin0\lin0\itap0 \i\f1\fs18\lang2057\langfe1033\cgrid\langnp2057\langfenp1033 \sbasedon0 \snext0 heading 9;}{\*\cs10 \additive Default Paragraph Font;}{\*\cs15 \additive \b\f1\fs20 \sbasedon10
+App Text;}{\s16\ql \li0\ri0\sb360\sa240\keepn\widctlpar\nooverflow\faroman\rin0\lin0\itap0 \b\f1\fs32\cf9\lang2057\langfe1033\kerning28\cgrid\langnp2057\langfenp1033 \sbasedon0 \snext16 Category UID;}{
+\s17\ql \li0\ri0\sa120\widctlpar\nooverflow\faroman\rin0\lin0\itap0 \i\f1\fs20\lang2057\langfe1033\cgrid\langnp2057\langfenp1033 \sbasedon0 \snext17 Comment;}{\s18\ql \fi-283\li283\ri0\sa120\widctlpar\brdrb\brdrs\brdrw15\brsp20 {\*\pn
+\pnlvlblt\ilvl10\ls2047\pnrnot0\pnf30\pnstart1\pnindent283\pnhang{\pntxtb \'a2}}\nooverflow\faroman\ls2047\ilvl10\rin0\lin283\itap0 \f1\fs20\lang2057\langfe1033\cgrid\langnp2057\langfenp1033 \sbasedon0 \snext18 Context;}{\*\cs19 \additive
+\i\f1\fs20\ulnone\cf0\nosupersub \sbasedon10 Context Comment;}{\s20\ql \li0\ri0\sa120\widctlpar\nooverflow\faroman\rin0\lin0\itap0 \f1\fs20\cf11\lang2057\langfe1033\cgrid\langnp2057\langfenp1033 \sbasedon0 \snext20 Definition Term;}{
+\s21\ql \li0\ri0\sa120\widctlpar\nooverflow\faroman\rin0\lin0\itap0 \f1\fs20\cf11\lang2057\langfe1033\cgrid\langnp2057\langfenp1033 \sbasedon20 \snext21 Definition Definition;}{\*\cs22 \additive \scaps\f31\fs20\cf13 \sbasedon10 Graphic Link;}{
+\s23\ql \fi-283\li283\ri0\sa120\widctlpar{\*\pn \pnlvlblt\ilvl10\ls2047\pnrnot0\pnf14\pnstart1\pnindent283\pnhang{\pntxtb F}}\nooverflow\faroman\ls2047\ilvl10\rin0\lin283\itap0 \f1\fs20\lang2057\langfe1033\cgrid\langnp2057\langfenp1033
+\sbasedon0 \snext23 Tip;}{\s24\ql \fi-283\li283\ri0\sa120\widctlpar{\*\pn \pnlvlblt\ilvl10\ls2047\pnrnot0\pnf14\pnstart1\pnindent283\pnhang{\pntxtb ?}}\nooverflow\faroman\ls2047\ilvl10\rin0\lin283\itap0
+\f1\fs20\lang2057\langfe1033\cgrid\langnp2057\langfenp1033 \sbasedon23 \snext24 Note;}{\s25\ql \fi-283\li283\ri0\sa120\widctlpar{\*\pn \pnlvlblt\ilvl10\ls2047\pnrnot0\pnf30\pnstart1\pnindent283\pnhang{\pntxtb ~}}
+\nooverflow\faroman\ls2047\ilvl10\rin0\lin283\itap0 \f1\fs20\lang2057\langfe1033\cgrid\langnp2057\langfenp1033 \sbasedon24 \snext25 Important;}{\s26\ql \fi-283\li283\ri0\sa120\widctlpar\brdrb\brdrs\brdrw15\brsp20 {\*\pn \pnlvlblt\ilvl10\ls2047\pnrnot0
+\pnf30\pnstart1\pnindent283\pnhang{\pntxtb i}}\nooverflow\faroman\ls2047\ilvl10\rin0\lin283\itap0 \f1\fs20\lang2057\langfe1033\cgrid\langnp2057\langfenp1033 \sbasedon0 \snext26 Index;}{\*\cs27 \additive \b\f2\fs20 \sbasedon10 Key Name;}{
+\s28\ql \fi-284\li284\ri0\sa120\widctlpar{\*\pn \pnlvlbody\ilvl11\ls2047\pnrnot0\pndec\pnstart1\pnindent283\pnhang{\pntxta .}}\nooverflow\faroman\ls2047\ilvl11\rin0\lin284\itap0 \f1\fs20\lang2057\langfe1033\cgrid\langnp2057\langfenp1033
+\sbasedon0 \snext28 List Number;}{\s29\ql \fi-284\li284\ri0\sa120\widctlpar\tx284{\*\pn \pnlvlbody\ilvl0\ls2047\pnrnot0\pndec\pnf8 }\nooverflow\faroman\ls2047\rin0\lin284\itap0 \f1\fs20\lang2057\langfe1033\cgrid\langnp2057\langfenp1033
+\sbasedon28 \snext29 List Manual;}{\s30\ql \fi-284\li568\ri0\sa120\widctlpar{\*\pn \pnlvlbody\ilvl11\ls2047\pnrnot0\pndec\pnstart1\pnindent283\pnhang{\pntxta .}}\nooverflow\faroman\ls2047\ilvl11\rin0\lin568\itap0
+\f1\fs20\lang2057\langfe1033\cgrid\langnp2057\langfenp1033 \sbasedon0 \snext30 List Number 2;}{\s31\ql \fi-284\li568\ri0\sa120\widctlpar\tx284{\*\pn \pnlvlbody\ilvl0\ls2047\pnrnot0\pndec\pnf8 }\nooverflow\faroman\ls2047\rin0\lin568\itap0
+\f1\fs20\lang2057\langfe1033\cgrid\langnp2057\langfenp1033 \sbasedon30 \snext31 List Manual 2;}{\s32\ql \li0\ri0\sa120\widctlpar\nooverflow\faroman\rin0\lin0\itap0 \f1\fs20\cf13\lang2057\langfe1033\cgrid\langnp2057\langfenp1033 \sbasedon0 \snext32
+Synonyms;}{\*\cs33 \additive \super \sbasedon10 endnote reference;}{\s34\ql \fi-284\li284\ri0\sa120\widctlpar\tx284{\*\pn \pnlvlblt\ilvl10\ls2047\pnrnot0\pnf3\pnstart1\pnindent283\pnhang{\pntxtb \'b7}}\nooverflow\faroman\ls2047\ilvl10\rin0\lin284\itap0
+\f1\fs20\lang2057\langfe1033\cgrid\langnp2057\langfenp1033 \sbasedon0 \snext34 \sautoupd List Bullet;}{\s35\ql \fi-284\li568\ri0\sa120\widctlpar{\*\pn \pnlvlblt\ilvl10\ls2047\pnrnot0\pnf3\pnstart1\pnindent283\pnhang{\pntxtb \'b7}}
+\nooverflow\faroman\ls2047\ilvl10\rin0\lin568\itap0 \f1\fs20\lang2057\langfe1033\cgrid\langnp2057\langfenp1033 \sbasedon0 \snext35 \sautoupd List Bullet 2;}{\s36\ql \li0\ri0\sa120\widctlpar\tqc\tx4153\tqr\tx8306\nooverflow\faroman\rin0\lin0\itap0
+\f1\fs20\lang2057\langfe1033\cgrid\langnp2057\langfenp1033 \sbasedon0 \snext36 footer;}{\s37\ql \li284\ri0\sa120\widctlpar\nooverflow\faroman\rin0\lin284\itap0 \f1\fs20\lang2057\langfe1033\cgrid\langnp2057\langfenp1033 \sbasedon0 \snext37 List Continue;}{
+\s38\ql \li566\ri0\sa120\widctlpar\nooverflow\faroman\rin0\lin566\itap0 \f1\fs20\lang2057\langfe1033\cgrid\langnp2057\langfenp1033 \sbasedon0 \snext38 List Continue 2;}}{\*\listtable{\list\listtemplateid-737142542\listsimple{\listlevel\levelnfc0
+\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'00.;}{\levelnumbers\'01;}\chbrdr\brdrnone\brdrcf1 \chshdng0\chcfpat1\chcbpat1 \fi-360\li643\jclisttab\tx643 }{\listname ;}\listid-129}
+{\list\listtemplateid1907811784\listsimple{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'01\u-3913 ?;}{\levelnumbers;}\f3\chbrdr\brdrnone\brdrcf1 \chshdng0\chcfpat1\chcbpat1\fbias0
+\fi-360\li643\jclisttab\tx643 }{\listname ;}\listid-125}{\list\listtemplateid1912741052\listsimple{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'00.;}{\levelnumbers\'01;}\chbrdr
+\brdrnone\brdrcf1 \chshdng0\chcfpat1\chcbpat1 \fi-360\li360\jclisttab\tx360 }{\listname ;}\listid-120}{\list\listtemplateid-51363132\listsimple{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0
+{\leveltext\'01\u-3913 ?;}{\levelnumbers;}\f3\chbrdr\brdrnone\brdrcf1 \chshdng0\chcfpat1\chcbpat1\fbias0 \fi-360\li360\jclisttab\tx360 }{\listname ;}\listid-119}{\list\listtemplateid947971744\listsimple{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0
+\levelfollow0\levelstartat0\levelspace0\levelindent0{\leveltext\'01*;}{\levelnumbers;}\chbrdr\brdrnone\brdrcf1 \chshdng0\chcfpat1\chcbpat1 }{\listname ;}\listid-2}}{\*\listoverridetable{\listoverride\listid-120\listoverridecount0\ls1}
+{\listoverride\listid-129\listoverridecount0\ls2}{\listoverride\listid-119\listoverridecount0\ls3}{\listoverride\listid-125\listoverridecount0\ls4}{\listoverride\listid-120\listoverridecount0\ls5}{\listoverride\listid-129\listoverridecount0\ls6}
+{\listoverride\listid-119\listoverridecount0\ls7}{\listoverride\listid-125\listoverridecount0\ls8}{\listoverride\listid-120\listoverridecount0\ls9}{\listoverride\listid-129\listoverridecount0\ls10}{\listoverride\listid-119\listoverridecount0\ls11}
+{\listoverride\listid-125\listoverridecount0\ls12}{\listoverride\listid-120\listoverridecount0\ls13}{\listoverride\listid-129\listoverridecount0\ls14}{\listoverride\listid-119\listoverridecount0\ls15}{\listoverride\listid-125\listoverridecount0\ls16}
+{\listoverride\listid-120\listoverridecount0\ls17}{\listoverride\listid-129\listoverridecount0\ls18}{\listoverride\listid-119\listoverridecount0\ls19}{\listoverride\listid-125\listoverridecount0\ls20}{\listoverride\listid-2\listoverridecount1{\lfolevel
+\listoverrideformat{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelold\levelspace0\levelindent283{\leveltext\'01\u-3991 ?;}{\levelnumbers;}\f30\chbrdr\brdrnone\brdrcf1 \chshdng0\chcfpat1\chcbpat1\fbias0 \fi-283\li283
+}}\ls21}{\listoverride\listid-2\listoverridecount1{\lfolevel\listoverrideformat{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelold\levelspace0\levelindent283{\leveltext\'01\u-3991 ?;}{\levelnumbers;}\f30\chbrdr
+\brdrnone\brdrcf1 \chshdng0\chcfpat1\chcbpat1\fbias0 \fi-283\li283 }}\ls22}}{\info{\author Fedor}{\operator Fedor}{\creatim\yr2013\mo11\dy30\hr23\min4}{\revtim\yr2014\mo5\dy28\hr12\min17}{\version97}{\edmins91}{\nofpages8}{\nofwords1514}{\nofchars8634}
+{\*\company DEV}{\nofcharsws0}{\vern8249}}\margl1701\margr850\margt1134\margb1134 \deftab708\widowctrl\ftnbj\aenddoc\noxlattoyen\expshrtn\noultrlspc\dntblnsbdb\nospaceforul\hyphcaps0\horzdoc\dghspace120\dgvspace120\dghorigin1701\dgvorigin1984\dghshow0
+\dgvshow3\jcompress\viewkind4\viewscale100\nolnhtadjtbl \fet0{\*\template E:\\Documents and Settings\\Administrator\\Application Data\\Microsoft\\\'d8\'e0\'e1\'eb\'ee\'ed\'fb\\cshelp2000.dot}\sectd \linex0\sectdefaultcl {\*\pnseclvl1
+\pnucrm\pnstart1\pnindent720\pnhang{\pntxta .}}{\*\pnseclvl2\pnucltr\pnstart1\pnindent720\pnhang{\pntxta .}}{\*\pnseclvl3\pndec\pnstart1\pnindent720\pnhang{\pntxta .}}{\*\pnseclvl4\pnlcltr\pnstart1\pnindent720\pnhang{\pntxta )}}{\*\pnseclvl5
+\pndec\pnstart1\pnindent720\pnhang{\pntxtb (}{\pntxta )}}{\*\pnseclvl6\pnlcltr\pnstart1\pnindent720\pnhang{\pntxtb (}{\pntxta )}}{\*\pnseclvl7\pnlcrm\pnstart1\pnindent720\pnhang{\pntxtb (}{\pntxta )}}{\*\pnseclvl8\pnlcltr\pnstart1\pnindent720\pnhang
+{\pntxtb (}{\pntxta )}}{\*\pnseclvl9\pnlcrm\pnstart1\pnindent720\pnhang{\pntxtb (}{\pntxta )}}\pard\plain \s17\ql \li0\ri0\sa120\widctlpar\nooverflow\faroman\rin0\lin0\itap0 \i\f1\fs20\lang2057\langfe1033\cgrid\langnp2057\langfenp1033 {
+\lang1033\langfe1033\langnp1033 Author: Fedor Strizhniou.}{\f28
+\par }{\lang1033\langfe1033\langnp1033 Date: November 2013}{\f28
+\par }{\lang1033\langfe1033\langnp1033 Version: 1.7.0
+\par }\pard\plain \s1\ql \li0\ri0\sb360\sa240\keepn\widctlpar\nooverflow\faroman\outlinelevel0\rin0\lin0\itap0 \b\f1\fs32\lang2057\langfe1033\kerning28\cgrid\langnp2057\langfenp1033 {ScummVM Help
+\par }\pard\plain \s16\ql \li0\ri0\sb360\sa240\keepn\widctlpar\nooverflow\faroman\rin0\lin0\itap0 \b\f1\fs32\cf9\lang2057\langfe1033\kerning28\cgrid\langnp2057\langfenp1033 {\lang1033\langfe1033\langnp1033 0x100039ce}{\lang1059\langfe1033\langnp1059
+\par }\pard\plain \ql \li0\ri0\sa120\widctlpar\nooverflow\faroman\rin0\lin0\itap0 \f1\fs20\lang2057\langfe1033\cgrid\langnp2057\langfenp1033 {\f28
+\par }\pard\plain \s2\ql \li0\ri0\sb120\sa120\keepn\widctlpar\brdrt\brdrs\brdrw30\brsp20 \brdrb\brdrs\brdrw30\brsp20 \tqr\tx9072\nooverflow\faroman\outlinelevel1\rin0\lin0\itap0 \b\f1\fs24\lang2057\langfe1033\cgrid\langnp2057\langfenp1033 {\b0\f28
+About ScummVM Help
+\par {\pntext\pard\plain\s26 \f30\fs20\lang2057\langfe1033\langnp2057\langfenp1033 \loch\af30\dbch\af0\hich\f30 \'69\tab}}\pard\plain \s26\ql \fi-283\li283\ri0\sa120\widctlpar\brdrb\brdrs\brdrw15\brsp20 {\*\pn \pnlvlblt\ilvl0\ls21\pnrnot0
+\pnf30\pnstart1\pnindent283\pnhang{\pntxtb i}}\nooverflow\faroman\ls21\rin0\lin283\itap0 \f1\fs20\lang2057\langfe1033\cgrid\langnp2057\langfenp1033 {About ScummVM Help
+\par }\pard\plain \ql \li0\ri0\sa120\widctlpar{\*\pn \pnlvlcont\ilvl0\ls0\pnrnot0\pndec }\nooverflow\faroman\rin0\lin0\itap0 \f1\fs20\lang2057\langfe1033\cgrid\langnp2057\langfenp1033 {\f28
+\par }{
+This help file based on ScummVM forum thread with some elaborations(in Anotherguest section) and text correction. If you wish add some text or translate you may download and modify source document from https://sourceforge.net/projects/scummvms60git/ and t
+hen send me to fedor_qd@mail.ru
+\par Feel free to replace, merge or write you own instead 1st, 2nd and 3rd guides. Other sections require strict translations. And don\rquote t forget add your name :-)
+\par First guide contain help by Anotherguest, second - VincentJ, third - murgo. This doc created by Fedor Strizhniou.
+\par Enjoys, cheers! Always yours =)}{\lang1059\langfe1033\langnp1059
+\par }{\f29
+\par }\pard\plain \s2\ql \li0\ri0\sb120\sa120\keepn\widctlpar\brdrt\brdrs\brdrw30\brsp20 \brdrb\brdrs\brdrw30\brsp20 \tqr\tx9072{\*\pn \pnlvlcont\ilvl0\ls0\pnrnot0\pndec }\nooverflow\faroman\outlinelevel1\rin0\lin0\itap0
+\b\f1\fs24\lang2057\langfe1033\cgrid\langnp2057\langfenp1033 {\b0\f28 1st guide
+\par {\pntext\pard\plain\s26 \f30\fs20\lang2057\langfe1033\langnp2057\langfenp1033 \loch\af30\dbch\af0\hich\f30 \'69\tab}}\pard\plain \s26\ql \fi-283\li283\ri0\sa120\widctlpar\brdrb\brdrs\brdrw15\brsp20 {\*\pn \pnlvlblt\ilvl0\ls21\pnrnot0
+\pnf30\pnstart1\pnindent283\pnhang{\pntxtb i}}\nooverflow\faroman\ls21\rin0\lin283\itap0 \f1\fs20\lang2057\langfe1033\cgrid\langnp2057\langfenp1033 {Controls, Virtual keyboard, Shortcuts, ScummVM, Tips, S60, UIQ, UIQ3, S80, s80, S90, s90
+\par }\pard\plain \ql \li0\ri0\sa120\widctlpar{\*\pn \pnlvlcont\ilvl0\ls0\pnrnot0\pndec }\nooverflow\faroman\rin0\lin0\itap0 \f1\fs20\lang2057\langfe1033\cgrid\langnp2057\langfenp1033 {\f28
+\par }{UIQ3 devices: To the top right (holding the phone portrait) you four icons, from the top they are
+\par
+\par * Toggle control mode, in control mode you can change text input , screen orientation and screen scaling
+\par * Mouse button, toggles between left, right and no button when tapping the screen. If no button is selected, 7 & Space works as left mouse button and 9 & Enter works as the right mouse button.
+\par * Esc, tap this to simulate ESC key being pressed. Same functionally on devices with 'C' key.
+\par * Virtual keyboard toggle, toggles the virtual keyboard, if not enabled when selecting '1'/'7' in control mode.
+\par * When Virtual keyboard is enabled you have more onscreen keys available
+\par * Enter key
+\par * Backspace
+\par * Arrow Up/Down to scroll the keys available
+\par * Virtual keyboard, tap letters to simulate key presses.
+\par
+\par S60 and UIQ3 devices: (Control Key = Green Phone key, to activate/deactivate control mode in SDL)
+\par }{\f29
+\par }{* 1 = change Input Mode: Joystick | Keyboard | Cursor
+\par * 2,'p' = change Video Mode: Landscape | Portrait
+\par * 3,'f' = change Orientation Mode for Landscape: 90\'b0 Left | 90\'b0 Right
+\par * 4,'s' = Toggle between stretched and non-stretched modes
+\par * 5 = Toggle between interpolating stretch or not
+\par * 7,'t' = Text/Multitap input
+\par * 8,'c' = Cursor input
+\par * 9,'j' = Joystick input
+\par * 0,'m' = Mouse input
+\par * Up/Down = Alter global volume when not in 1-1 VGA mode. Pan around in VGA 1-1 Mode
+\par * # = On/Off screen keyboard transparency in some games
+\par
+\par S80 devices:
+\par
+\par * Side key 1 = Fire Joystick 1 button (JoyMode)
+\par * Side key 2 = Fire Joystick 2 button (JoyMode) or change Video Mode: Upscaled | Normal (CursorMode)
+\par * Side key 3 = change Input Mode: Joystick | Cursor
+\par
+\par S90 devices: (Control Key = OK, pressed simultaneously with other keys to activate the mode changes in SDL)
+\par
+\par * OK+1 = change Input Mode: Joystick | Cursor
+\par * OK+2 = change Video Mode: Upscaled | Normal
+\par
+\par What are these Joystick, Keyboard and Cursor modes anyway?
+\par }{\f28
+\par }{Joystick mode sends SDL joystick events to ScummVM which acts as a mouse control in ScummVM. Cursor mode sends keyboard arrows instead, so for example it can be used to navigate
+through directorylist (one hand use perhaps!?) or save games etc. Keyboard mode is only available for S60 and enables multi-tap to enter text characters in save dialogs. These modes are implemented at the underlying SDL level, so this determines the types
+ of events that ScummVM receives from SDL.
+\par What are these Shrinked, Zoomed and Upscaled modes anyway?
+\par
+\par Shrink displays the game on your screen but in a shrinked way, either in Portrait or Landscape mode, so not all the pixels can be seen. Zoom mode uses the maximum resolution of your phone displaying a smaller part of the game zoomed at 1:1 pixels. For scr
+olling in S60 Zoom mode: 0+Cursor keys to scroll around, 0+Ok button to center view. Upscale tries to fill the larger screens on S80/S90 devices in a better way for low resolution games. Currently it uses a pixel interpolation upscaling routine.
+\par
+\par You can also use a bluetooth mouse with S60v3 devices to control your game. You need the bluetooth hid library from Hinkka http://koti.mbnet.fi/hinkka/Download.html to get it to work properly.
+\par }{\f29
+\par
+\par }\pard\plain \s2\ql \li0\ri0\sb120\sa120\keepn\widctlpar\brdrt\brdrs\brdrw30\brsp20 \brdrb\brdrs\brdrw30\brsp20 \tqr\tx9072{\*\pn \pnlvlcont\ilvl0\ls0\pnrnot0\pndec }\nooverflow\faroman\outlinelevel1\rin0\lin0\itap0
+\b\f1\fs24\lang2057\langfe1033\cgrid\langnp2057\langfenp1033 {\b0\f28 2nd guide
+\par {\pntext\pard\plain\s26 \f30\fs20\lang2057\langfe1033\langnp2057\langfenp1033 \loch\af30\dbch\af0\hich\f30 \'69\tab}}\pard\plain \s26\ql \fi-283\li283\ri0\sa120\widctlpar\brdrb\brdrs\brdrw15\brsp20 {\*\pn \pnlvlblt\ilvl0\ls21\pnrnot0
+\pnf30\pnstart1\pnindent283\pnhang{\pntxtb i}}\nooverflow\faroman\ls21\rin0\lin283\itap0 \f1\fs20\lang2057\langfe1033\cgrid\langnp2057\langfenp1033 {Controls, Virtual keyboard, Shortcuts, ScummVM, Tips, S60, s60
+\par }\pard\plain \ql \li0\ri0\sa120\widctlpar{\*\pn \pnlvlcont\ilvl0\ls0\pnrnot0\pndec }\nooverflow\faroman\rin0\lin0\itap0 \f1\fs20\lang2057\langfe1033\cgrid\langnp2057\langfenp1033 {\f28
+\par
+\par }{More user-friendly guide for Nokia phones (based on N96 but should apply to most phones)
+\par
+\par Left Soft Key - Left Click
+\par }{\f28
+\par }{Right Soft Key - Right Click
+\par }{\f28
+\par }{Navigation buttons - Move pointer on screen
+\par }{\f28
+\par }{"C" or "Delete Key" - Space Bar (i.e. skip dialogue/cutscene)
+\par }{\f28
+\par }{* - Bring up Menu (to Save, Load and change the game's options e.g. enable subtitles, speech etc. Varies from game to game)
+\par
+\par The <> is a toggling left right mode. I.e. first click is left, next is right, next is left etc.
+\par
+\par Call Button - Enter/Exit Configuration Mode
+\par }{\f28
+\par }{Configuration Mode, when activated, shows the word "CTRL" in green in the upper right corner of the screen. It allows to quickly switch between various functions of ScummVM. The following buttons on your keypad are activated when "CTRL" is displayed :
+
+\par }{\f29
+\par }{1 - Change Input.
+\par This is the option you'll probably use the most. There are three settings; A,C and J.
+\par
+\par A - This is the "Text Input" mode. It allows you to type directl
+y into ScummVM as if you were using a keyboard. Type the same way you would when sending a text message off of your phone. Please note that the pointer is disabled when in this mode. Don't forget to exit Configuration Mode before typing!
+\par
+\par C - This is the "Cursor" mode. This emulates the arrow keys of the keyboard. Some games require using this instead of the mouse (e.g. the destruction derby section towards the end of Full Throttle).
+\par
+\par J - This is the "Joystick/Mouse" mode. Simply put, it allows you to use the navigation buttons to move the pointer around the screen. The left and right mouse buttons are used by the left and right Soft keys.
+\par
+\par The "C" button emulates the space bar, i.e. skip line of dialogue, skip cutscene or pause game (depending on the game, some games simply use the left mouse button to skip dialogue in which case it will pause the game instead)
+\par }{\f29
+\par }{2 - Toggle Landscape and Portrait
+\par Switches the screen output between having the phone held normally (Portrait) or on its side (Landscape). You'll probably never take it off Landscape mode as it offers the better display area.
+\par
+\par 3 - Change Landscape Orientation
+\par Only applies to Landscape mode, simply swaps the screen output between having the phone tilted on its left side or on its right side.
+\par
+\par 4 - Toggle Zoom On and Off
+\par Zooms in on a portion of the screen. Handy for when you are looking through a screen for items or having trouble reading subtitles. Use the navigation buttons for panning around the play area. Don't forget you'll have to exit out of Confi
+guration Mode before you can move the pointer again. Exiting Configuration Mode does not reset the zoom level.
+\par }{\f29
+\par }{5 & 6 - Unused
+\par
+\par 7 - "Text Input" mode. Shortcut for entering "Text Input" mode directly instead of cycling through the other input types using the "1" key.
+\par
+\par 8 - "Cursor" mode. Shortcut for entering "Cursor" mode directly instead of cycling through the other input types using the "1" key.
+\par
+\par 9 - "Joystick/Mouse" mode. Shortcut for entering "Joystick/Mouse" mode directly instead of cycling through the other input types using the
+\par
+\par "1" key.
+\par
+\par 0 & * - Unused (The "*" Menu is disabled in Configuration Mode")
+\par
+\par Up Navigation Button - Increase ScummVM sound volume. Note that the game itself may have its own independent sound settings (usually found under the * menu)
+\par
+\par Down Navigation Button - Decrease ScummVM sound volume. Note that the game itself may have its own independent sound settings (usually found under the * menu)
+\par }{\f29
+\par
+\par }\pard\plain \s2\ql \li0\ri0\sb120\sa120\keepn\widctlpar\brdrt\brdrs\brdrw30\brsp20 \brdrb\brdrs\brdrw30\brsp20 \tqr\tx9072{\*\pn \pnlvlcont\ilvl0\ls0\pnrnot0\pndec }\nooverflow\faroman\outlinelevel1\rin0\lin0\itap0
+\b\f1\fs24\lang2057\langfe1033\cgrid\langnp2057\langfenp1033 {\b0\f28 3rd guide
+\par {\pntext\pard\plain\s26 \f30\fs20\lang2057\langfe1033\langnp2057\langfenp1033 \loch\af30\dbch\af0\hich\f30 \'69\tab}}\pard\plain \s26\ql \fi-283\li283\ri0\sa120\widctlpar\brdrb\brdrs\brdrw15\brsp20 {\*\pn \pnlvlblt\ilvl0\ls21\pnrnot0
+\pnf30\pnstart1\pnindent283\pnhang{\pntxtb i}}\nooverflow\faroman\ls21\rin0\lin283\itap0 \f1\fs20\lang2057\langfe1033\cgrid\langnp2057\langfenp1033 {Controls, Virtual keyboard, Shortcuts, ScummVM, Tips, S60, s60
+\par }\pard\plain \ql \li0\ri0\sa120\widctlpar{\*\pn \pnlvlcont\ilvl0\ls0\pnrnot0\pndec }\nooverflow\faroman\rin0\lin0\itap0 \f1\fs20\lang2057\langfe1033\cgrid\langnp2057\langfenp1033 {\f28
+\par
+\par }{ScummVM keys on Nokia e71 (most likely on any other qwerty-device, too), tested on version 0.14.0svn (Feb. 18 2009
+ 05:56:07). Number keys are inserted by first pressing fn-key (leftmost key at bottom row on E71) and then pressing correct key (e.g. 5 is fn+g). You don't have to press both keys simultaneously.
+\par
+\par Basic keys:
+\par
+\par Joystick -- Move cursor (in joystick mode) / arrow keys (in keyboard / cursor mode)
+\par Joystick button -- Skip text
+\par Left soft key -- Left mouse button
+\par Right soft key -- Right mouse button (context sensitive actions in Lucas Arts' games, something else in others)
+\par Backspace -- Esc / Skips demos / Removes selected action
+\par * (fn+u) -- Menu
+\par Space -- Pause
+\par Enter -- Enter (usually same as left soft key)
+\par
+\par In main menu:
+\par Shift -- Shift (can be used to mass-add games)
+\par You can press the first letter of the game name to jump there in the games list.
+\par
+\par CTRL-keys:
+\par To use these, first click on green answer key once, so that text CTRL shows up in the northwest corner of the screen, then click the key.
+\par
+\par p / 2 -- Screen orientation
+\par s / 5 -- Screen size
+\par k / 7 -- Input mode: keyboard
+\par c / 8 -- Input mode: cursor
+\par j / 9 -- Input mode: joystick
+\par joystick up -- Volume up
+\par joystick down -- Volume down
+\par 1 -- Toggle input mode
+\par
+\par Game specific:
+\par Most games have some specific keys (the same as in desktop model of ScummVM?). For instance in Day of the Tentacle:
+\par
+\par w -- Walk to
+\par l -- Look at
+\par p -- Pick up
+\par c -- Close
+\par o -- Open
+\par g -- Give
+\par t -- Talk to
+\par s -- Push
+\par y -- Pull
+\par }{\f29
+\par }{and in Full Throttle (from the top of my head):
+\par
+\par k -- kick (foot)
+\par t -- talk (mouth)
+\par l -- look (eyes)
+\par p -- punch (hand)
+\par
+\par AGI games (King's Quest, Police Quest etc.):
+\par The games work beautifully on the E71, but there's some stupid bugs (in input). I recall finding some debug keys and "last sentence" / "inventory" -keys in earlier version, but I can't find them any more. Also you can't turn on sirens in Police Quest, whi
+ch kinda makes it unplayable.
+\par
+\par There's good side and bad side to each input mode:
+\par Keyboard (I use this primarily)
+\par }{\f29
+\par }{* goes to menu
+\par + you can erase text
+\par + moving is relatively easy
+\par - you can't type in UPPER CASE
+\par - you can't type numbers
+\par - worthless 'current key' -display on left top corner
+\par
+\par Joystick / Cursor:
+\par }{\f29
+\par }{+ you can access menus
+\par + you can type numbers (just make sure f-letter in left top corner is red before clicking "numbers". It works kinda funnily, but you'll get hang of it.)
+\par - you move mouse cursor which makes walking harder (joystick mode)
+\par - you can't erase text
+\par }{\f28
+\par }\pard\plain \s2\ql \li0\ri0\sb120\sa120\keepn\widctlpar\brdrt\brdrs\brdrw30\brsp20 \brdrb\brdrs\brdrw30\brsp20 \tqr\tx9072{\*\pn \pnlvlcont\ilvl0\ls0\pnrnot0\pndec }\nooverflow\faroman\outlinelevel1\rin0\lin0\itap0
+\b\f1\fs24\lang2057\langfe1033\cgrid\langnp2057\langfenp1033 {ScummVM1 engines list
+\par {\pntext\pard\plain\s26 \f30\fs20\lang2057\langfe1033\langnp2057\langfenp1033 \loch\af30\dbch\af0\hich\f30 \'69\tab}}\pard\plain \s26\ql \fi-283\li283\ri0\sa120\widctlpar\brdrb\brdrs\brdrw15\brsp20 {\*\pn \pnlvlblt\ilvl0\ls22\pnrnot0
+\pnf30\pnstart1\pnindent283\pnhang{\pntxtb i}}\nooverflow\faroman\ls22\rin0\lin283\itap0 \f1\fs20\lang2057\langfe1033\cgrid\langnp2057\langfenp1033 {Supported engines
+\par }\pard\plain \ql \li0\ri0\sa120\widctlpar{\*\pn \pnlvlcont\ilvl0\ls0\pnrnot0\pndec }\nooverflow\faroman\rin0\lin0\itap0 \f1\fs20\lang2057\langfe1033\cgrid\langnp2057\langfenp1033 {agi
+\par agos
+\par \tab AGOS2
+\par cine
+\par composer
+\par cruise
+\par drascula
+\par gob
+\par groovie
+\par \tab GROOVIE2
+\par kyra
+\par \tab EOB
+\par \tab LOL
+\par lastexpress
+\par made
+\par neverhood
+\par parallaction
+\par queen
+\par saga
+\par \tab IHNM
+\par \tab SAGA2
+\par scumm
+\par \tab HE
+\par \tab SCUMM_7_8
+\par touche
+\par tucker
+\par wintermute
+\par
+\par }\pard\plain \s2\ql \li0\ri0\sb120\sa120\keepn\widctlpar\brdrt\brdrs\brdrw30\brsp20 \brdrb\brdrs\brdrw30\brsp20 \tqr\tx9072{\*\pn \pnlvlcont\ilvl0\ls0\pnrnot0\pndec }\nooverflow\faroman\outlinelevel1\rin0\lin0\itap0
+\b\f1\fs24\lang2057\langfe1033\cgrid\langnp2057\langfenp1033 {ScummVM2 engines list
+\par {\pntext\pard\plain\s26 \f30\fs20\lang2057\langfe1033\langnp2057\langfenp1033 \loch\af30\dbch\af0\hich\f30 \'69\tab}}\pard\plain \s26\ql \fi-283\li283\ri0\sa120\widctlpar\brdrb\brdrs\brdrw15\brsp20 {\*\pn \pnlvlblt\ilvl0\ls22\pnrnot0
+\pnf30\pnstart1\pnindent283\pnhang{\pntxtb i}}\nooverflow\faroman\ls22\rin0\lin283\itap0 \f1\fs20\lang2057\langfe1033\cgrid\langnp2057\langfenp1033 {Supported engines
+\par }\pard\plain \ql \li0\ri0\sa120\widctlpar\nooverflow\faroman\rin0\lin0\itap0 \f1\fs20\lang2057\langfe1033\cgrid\langnp2057\langfenp1033 {avalanche
+\par cge
+\par composer
+\par draci
+\par dreamweb
+\par fullpipe
+\par hopkins
+\par hugo
+\par lure
+\par mads
+\par mohawk
+\par \tab CSTIME
+\par \tab MYST
+\par \tab RIVEN
+\par mortevielle
+\par pegasus
+\par sci
+\par \tab SCI32
+\par sky
+\par sword1
+\par sword2
+\par sword25(Not supported)
+\par teenagent
+\par testbed
+\par tinsel
+\par toltecs
+\par tony
+\par toon
+\par tsage
+\par zvision
+\par }} \ No newline at end of file
diff --git a/backends/platform/symbian/help/ScummVM.xml b/backends/platform/symbian/help/ScummVM.xml
new file mode 100644
index 0000000000..a1a787012a
--- /dev/null
+++ b/backends/platform/symbian/help/ScummVM.xml
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<?xml:stylesheet href="\epoc32\tools\cshlpcmp\xsl\CSHproj.xsl" title="CS Help project" type="text/xsl"?>
+<!DOCTYPE cshproj SYSTEM "\epoc32\tools\cshlpcmp\dtd\CSHproj.dtd">
+
+<cshproj>
+ <helpfileUID>0x100039ce</helpfileUID> <!-- From help file -->
+ <directories>
+ <input></input>
+ <output></output>
+ <working></working>
+ </directories>
+ <files>
+ <source>
+ <file>ScummVM.rtf</file>
+ </source>
+ <destination>ScummVM.hlp</destination>
+ <customization>custom.xml</customization>
+ </files>
+</cshproj>
diff --git a/backends/platform/symbian/help/build_help.mk b/backends/platform/symbian/help/build_help.mk
new file mode 100644
index 0000000000..7a18ad8252
--- /dev/null
+++ b/backends/platform/symbian/help/build_help.mk
@@ -0,0 +1,29 @@
+# ============================================================================
+# Name : help.mk
+# Part of : ScummVM
+#
+# Description: This is file for creating .hlp file
+#
+# ============================================================================
+
+
+makmake :
+ cshlpcmp ScummVM.xml
+
+ifeq (WINS,$(findstring WINS, $(PLATFORM)))
+ copy ScummVM.hlp $(EPOCROOT)epoc32\$(PLATFORM)\c\resource\help
+endif
+
+clean :
+ del ScummVM.hlp
+ del ScummVM.hlp.hrh
+
+bld :
+ cshlpcmp ScummVM.xml
+
+ifeq (WINS,$(findstring WINS, $(PLATFORM)))
+ copy ScummVM.hlp $(EPOCROOT)epoc32\$(PLATFORM)\c\resource\help
+endif
+
+freeze lib cleanlib final resource savespace releasables :
+
diff --git a/backends/platform/symbian/mmp/scummvm_agi.mmp.in b/backends/platform/symbian/mmp/scummvm_agi.mmp.in
index 892ed57732..d6f9e54b7d 100644
--- a/backends/platform/symbian/mmp/scummvm_agi.mmp.in
+++ b/backends/platform/symbian/mmp/scummvm_agi.mmp.in
@@ -57,5 +57,15 @@ SOURCEPATH ..\..\..\..\engines\agi
USERINCLUDE ..\..\..\..\engines
USERINCLUDE ..\..\..\.. ..\..\..\..\gui ..\..\..\..\audio ..\src
+
+SYSTEMINCLUDE \epoc32\include\freetype
+SYSTEMINCLUDE \epoc32\include\mpeg2dec
+SYSTEMINCLUDE \epoc32\include\jpeg
+SYSTEMINCLUDE \epoc32\include\png
+SYSTEMINCLUDE \epoc32\include\ESDL
SYSTEMINCLUDE \epoc32\include\ZLIB // before \epoc32\include because symbian already has older version
-SYSTEMINCLUDE \epoc32\include \epoc32\include\libc ..\src
+SYSTEMINCLUDE \epoc32\include\libc
+SYSTEMINCLUDE \epoc32\include\theora
+SYSTEMINCLUDE \epoc32\include\tremor
+SYSTEMINCLUDE \epoc32\include
+SYSTEMINCLUDE ..\src // for portdefs.h
diff --git a/backends/platform/symbian/mmp/scummvm_agos.mmp.in b/backends/platform/symbian/mmp/scummvm_agos.mmp.in
index d3bc84ed51..d2b1329a24 100644
--- a/backends/platform/symbian/mmp/scummvm_agos.mmp.in
+++ b/backends/platform/symbian/mmp/scummvm_agos.mmp.in
@@ -63,5 +63,15 @@ SOURCEPATH ..\..\..\..\engines\agos
USERINCLUDE ..\..\..\..\engines
USERINCLUDE ..\..\..\.. ..\..\..\..\gui ..\..\..\..\audio ..\src
+
+SYSTEMINCLUDE \epoc32\include\freetype
+SYSTEMINCLUDE \epoc32\include\mpeg2dec
+SYSTEMINCLUDE \epoc32\include\jpeg
+SYSTEMINCLUDE \epoc32\include\png
+SYSTEMINCLUDE \epoc32\include\ESDL
SYSTEMINCLUDE \epoc32\include\ZLIB // before \epoc32\include because symbian already has older version
-SYSTEMINCLUDE \epoc32\include \epoc32\include\libc ..\src
+SYSTEMINCLUDE \epoc32\include\libc
+SYSTEMINCLUDE \epoc32\include\theora
+SYSTEMINCLUDE \epoc32\include\tremor
+SYSTEMINCLUDE \epoc32\include
+SYSTEMINCLUDE ..\src // for portdefs.h
diff --git a/backends/platform/symbian/mmp/scummvm_avalanche.mmp.in b/backends/platform/symbian/mmp/scummvm_avalanche.mmp.in
new file mode 100644
index 0000000000..5260edc79d
--- /dev/null
+++ b/backends/platform/symbian/mmp/scummvm_avalanche.mmp.in
@@ -0,0 +1,72 @@
+/* ScummVM - Graphic Adventure Engine
+ * Copyright (C) 2003-2005 Andreas 'Sprawl' Karlsson - Original EPOC port, ESDL
+ * Copyright (C) 2003-2005 Lars 'AnotherGuest' Persson - Original EPOC port, Audio System
+ * Copyright (C) 2005 Jurgen 'SumthinWicked' Braam - EPOC/CVS maintainer
+ * Copyright (C) 2005-2013 The ScummVM project
+ * Copyright (C) 2013 Strizniou Fedor
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ */
+
+//
+// EPOC MMP makefile project for ScummVM
+//
+
+// *** Definitions
+
+TARGET scummvm_avalanche.lib
+TARGETTYPE lib
+OPTION MSVC /QIfist /Ob1 /Oy /GF // /QIfist disables use of __ftol2 to avoid linker probs with MS libc: http://msdn.microsoft.com/library/default.asp?url=/library/en-us/vccore/html/vcrefQIfistSuppress_ftol.asp
+OPTION GCC -Wno-multichar -Wno-reorder // don't optimize for ARM, platform way too sensitive for that :( just turn off some common warnings
+OPTION GCCE -Wno-multichar -Wno-reorder -Wno-unused -Wno-format -fsigned-char
+ALWAYS_BUILD_AS_ARM
+
+//START_AUTO_MACROS_SLAVE//
+
+ // empty base file, will be updated by Perl build scripts
+
+//STOP_AUTO_MACROS_SLAVE//
+
+// *** SOURCE files
+
+SOURCEPATH ..\..\..\..\engines\avalanche
+
+//START_AUTO_OBJECTS_AVALANCHE_//
+
+ // empty base file, will be updated by Perl build scripts
+
+//STOP_AUTO_OBJECTS_AVALANCHE_//
+
+// *** Include paths
+
+USERINCLUDE ..\..\..\..\engines
+USERINCLUDE ..\..\..\.. ..\..\..\..\gui ..\..\..\..\audio ..\src
+
+SYSTEMINCLUDE \epoc32\include\freetype
+SYSTEMINCLUDE \epoc32\include\mpeg2dec
+SYSTEMINCLUDE \epoc32\include\jpeg
+SYSTEMINCLUDE \epoc32\include\png
+SYSTEMINCLUDE \epoc32\include\ESDL
+SYSTEMINCLUDE \epoc32\include\ZLIB // before \epoc32\include because symbian already has older version
+SYSTEMINCLUDE \epoc32\include\libc
+SYSTEMINCLUDE \epoc32\include\theora
+SYSTEMINCLUDE \epoc32\include\tremor
+SYSTEMINCLUDE \epoc32\include
+SYSTEMINCLUDE ..\src // for portdefs.h
diff --git a/backends/platform/symbian/mmp/scummvm_base.mmp.in b/backends/platform/symbian/mmp/scummvm_base.mmp.in
index d6dfafd014..37c68bf237 100644
--- a/backends/platform/symbian/mmp/scummvm_base.mmp.in
+++ b/backends/platform/symbian/mmp/scummvm_base.mmp.in
@@ -34,7 +34,9 @@ TARGET scummvm_base.lib
TARGETTYPE lib
OPTION MSVC /QIfist /Ob1 /Oy /GF // /QIfist disables use of __ftol2 to avoid linker probs with MS libc: http://msdn.microsoft.com/library/default.asp?url=/library/en-us/vccore/html/vcrefQIfistSuppress_ftol.asp
OPTION GCC -Wno-multichar -Wno-reorder // don't optimize for ARM, platform way too sensitive for that :( just turn off some common warnings
-OPTION GCCE -Wno-multichar -Wno-reorder -Wno-unused -Wno-format -fsigned-char
+// using option -Wno-psabi to supress warning "note: the mangling of 'va_list' has changed in GCC 4.4"
+// compiler must use png.h from libpng.lib instead ScummVM's
+OPTION GCCE -Wno-multichar -Wno-reorder -Wno-unused -Wno-format -fsigned-char -Wno-psabi -I'/Symbian/S60_5th_Edition_SDK_v1.0/epoc32/include/png'
ALWAYS_BUILD_AS_ARM
// Note: the LIB:*.lib statements are used by AdaptAllMMPs.pl, so don't remove them!
@@ -50,15 +52,18 @@ ALWAYS_BUILD_AS_ARM
USERINCLUDE ..\..\..\.. ..\..\..\..\gui ..\..\..\..\audio
USERINCLUDE ..\..\..\..\backends\fs ..\src ..\..\..\..\backends\platform\sdl
+USERINCLUDE \epoc32\include\mpeg2dec //\epoc32\include\theora
+SYSTEMINCLUDE \epoc32\include\freetype
+SYSTEMINCLUDE \epoc32\include\mpeg2dec
+SYSTEMINCLUDE \epoc32\include\jpeg
+SYSTEMINCLUDE \epoc32\include\png
SYSTEMINCLUDE \epoc32\include\ESDL
SYSTEMINCLUDE \epoc32\include\ZLIB // before \epoc32\include because symbian already has older version
SYSTEMINCLUDE \epoc32\include\libc
+SYSTEMINCLUDE \epoc32\include\theora
SYSTEMINCLUDE \epoc32\include\tremor
SYSTEMINCLUDE \epoc32\include
-SYSTEMINCLUDE \epoc32\include\mw
-SYSTEMINCLUDE \epoc32\include\platform
-SYSTEMINCLUDE \epoc32\include\platform\mw
SYSTEMINCLUDE ..\src // for portdefs.h
// *** SOURCE files
@@ -80,6 +85,14 @@ SOURCEPATH ..\..\..\..\graphics
//STOP_AUTO_OBJECTS_GRAPHICS_//
+SOURCEPATH ..\..\..\..\image
+//START_AUTO_OBJECTS_IMAGE_//
+
+ // empty base file, will be updated by Perl build scripts
+
+//STOP_AUTO_OBJECTS_IMAGE_//
+
+
SOURCEPATH ..\..\..\..\gui
//START_AUTO_OBJECTS_GUI_//
@@ -115,6 +128,11 @@ SOURCEPATH ..\..\..\..\video
//STOP_AUTO_OBJECTS_VIDEO_//
// add a few files manually, since they are not parsed from modules.mk files
+SOURCE theora_decoder.cpp
+SOURCE bink_decoder.cpp
+// add a few files manually, since they are not parsed from modules.mk files
+SOURCE codecs\mpeg.cpp
+
SOURCEPATH ..\..\..\..
SOURCE backends\events\default\default-events.cpp
SOURCE backends\timer\default\default-timer.cpp
@@ -156,4 +174,5 @@ SOURCE backends\vkeybd\virtual-keyboard.cpp
// Downscaler
SOURCE graphics\scaler\downscaler.cpp
+SOURCE graphics\scaler\downscalerARM.s
MACRO SDL_BACKEND
diff --git a/backends/platform/symbian/mmp/scummvm_bbvs.mmp.in b/backends/platform/symbian/mmp/scummvm_bbvs.mmp.in
new file mode 100644
index 0000000000..b4981e6eec
--- /dev/null
+++ b/backends/platform/symbian/mmp/scummvm_bbvs.mmp.in
@@ -0,0 +1,72 @@
+/* ScummVM - Graphic Adventure Engine
+ * Copyright (C) 2003-2005 Andreas 'Sprawl' Karlsson - Original EPOC port, ESDL
+ * Copyright (C) 2003-2005 Lars 'AnotherGuest' Persson - Original EPOC port, Audio System
+ * Copyright (C) 2005 Jurgen 'SumthinWicked' Braam - EPOC/CVS maintainer
+ * Copyright (C) 2005-2014 The ScummVM Team
+ * Copyright (C) 2014 Fedor Strizhniou - Epoc project file
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ */
+
+//
+// EPOC MMP makefile project for ScummVM
+//
+
+// *** Definitions
+
+TARGET scummvm_bbvs.lib
+TARGETTYPE lib
+OPTION MSVC /QIfist /Ob1 /Oy /GF // /QIfist disables use of __ftol2 to avoid linker probs with MS libc: http://msdn.microsoft.com/library/default.asp?url=/library/en-us/vccore/html/vcrefQIfistSuppress_ftol.asp
+OPTION GCC -Wno-multichar -Wno-reorder // don't optimize for ARM, platform way too sensitive for that :( just turn off some common warnings
+OPTION GCCE -Wno-multichar -Wno-reorder -Wno-unused -Wno-format -fsigned-char
+ALWAYS_BUILD_AS_ARM
+
+//START_AUTO_MACROS_SLAVE//
+
+ // empty base file, will be updated by Perl build scripts
+
+//STOP_AUTO_MACROS_SLAVE//
+
+// *** SOURCE files
+
+SOURCEPATH ..\..\..\..\engines\bbvs
+
+//START_AUTO_OBJECTS_BBVS_//
+
+ // empty base file, will be updated by Perl build scripts
+
+//STOP_AUTO_OBJECTS_BBVS_//
+
+// *** Include paths
+
+USERINCLUDE ..\..\..\..\engines
+USERINCLUDE ..\..\..\.. ..\..\..\..\gui ..\..\..\..\audio ..\src
+
+SYSTEMINCLUDE \epoc32\include\freetype
+SYSTEMINCLUDE \epoc32\include\mpeg2dec
+SYSTEMINCLUDE \epoc32\include\jpeg
+SYSTEMINCLUDE \epoc32\include\png
+SYSTEMINCLUDE \epoc32\include\ESDL
+SYSTEMINCLUDE \epoc32\include\ZLIB // before \epoc32\include because symbian already has older version
+SYSTEMINCLUDE \epoc32\include\libc
+SYSTEMINCLUDE \epoc32\include\theora
+SYSTEMINCLUDE \epoc32\include\tremor
+SYSTEMINCLUDE \epoc32\include
+SYSTEMINCLUDE ..\src // for portdefs.h
diff --git a/backends/platform/symbian/mmp/scummvm_cge.mmp.in b/backends/platform/symbian/mmp/scummvm_cge.mmp.in
index 66a689efd8..35cb0f2f98 100644
--- a/backends/platform/symbian/mmp/scummvm_cge.mmp.in
+++ b/backends/platform/symbian/mmp/scummvm_cge.mmp.in
@@ -57,5 +57,15 @@ SOURCEPATH ..\..\..\..\engines\cge
USERINCLUDE ..\..\..\..\engines
USERINCLUDE ..\..\..\.. ..\..\..\..\gui ..\..\..\..\audio ..\src
+
+SYSTEMINCLUDE \epoc32\include\freetype
+SYSTEMINCLUDE \epoc32\include\mpeg2dec
+SYSTEMINCLUDE \epoc32\include\jpeg
+SYSTEMINCLUDE \epoc32\include\png
+SYSTEMINCLUDE \epoc32\include\ESDL
SYSTEMINCLUDE \epoc32\include\ZLIB // before \epoc32\include because symbian already has older version
-SYSTEMINCLUDE \epoc32\include \epoc32\include\libc ..\src
+SYSTEMINCLUDE \epoc32\include\libc
+SYSTEMINCLUDE \epoc32\include\theora
+SYSTEMINCLUDE \epoc32\include\tremor
+SYSTEMINCLUDE \epoc32\include
+SYSTEMINCLUDE ..\src // for portdefs.h
diff --git a/backends/platform/symbian/mmp/scummvm_cine.mmp.in b/backends/platform/symbian/mmp/scummvm_cine.mmp.in
index cb7143b837..99b45cddb8 100644
--- a/backends/platform/symbian/mmp/scummvm_cine.mmp.in
+++ b/backends/platform/symbian/mmp/scummvm_cine.mmp.in
@@ -57,4 +57,15 @@ SOURCEPATH ..\..\..\..\engines\cine
USERINCLUDE ..\..\..\..\engines
USERINCLUDE ..\..\..\.. ..\..\..\..\gui ..\..\..\..\audio ..\src
-SYSTEMINCLUDE \epoc32\include \epoc32\include\libc ..\src
+
+SYSTEMINCLUDE \epoc32\include\freetype
+SYSTEMINCLUDE \epoc32\include\mpeg2dec
+SYSTEMINCLUDE \epoc32\include\jpeg
+SYSTEMINCLUDE \epoc32\include\png
+SYSTEMINCLUDE \epoc32\include\ESDL
+SYSTEMINCLUDE \epoc32\include\ZLIB // before \epoc32\include because symbian already has older version
+SYSTEMINCLUDE \epoc32\include\libc
+SYSTEMINCLUDE \epoc32\include\theora
+SYSTEMINCLUDE \epoc32\include\tremor
+SYSTEMINCLUDE \epoc32\include
+SYSTEMINCLUDE ..\src // for portdefs.h
diff --git a/backends/platform/symbian/mmp/scummvm_composer.mmp.in b/backends/platform/symbian/mmp/scummvm_composer.mmp.in
index 19215f65a6..5a215f2d8d 100644
--- a/backends/platform/symbian/mmp/scummvm_composer.mmp.in
+++ b/backends/platform/symbian/mmp/scummvm_composer.mmp.in
@@ -57,5 +57,15 @@ SOURCEPATH ..\..\..\..\engines\COMPOSER
USERINCLUDE ..\..\..\..\engines
USERINCLUDE ..\..\..\.. ..\..\..\..\gui ..\..\..\..\audio ..\src
+
+SYSTEMINCLUDE \epoc32\include\freetype
+SYSTEMINCLUDE \epoc32\include\mpeg2dec
+SYSTEMINCLUDE \epoc32\include\jpeg
+SYSTEMINCLUDE \epoc32\include\png
+SYSTEMINCLUDE \epoc32\include\ESDL
SYSTEMINCLUDE \epoc32\include\ZLIB // before \epoc32\include because symbian already has older version
-SYSTEMINCLUDE \epoc32\include \epoc32\include\libc ..\src
+SYSTEMINCLUDE \epoc32\include\libc
+SYSTEMINCLUDE \epoc32\include\theora
+SYSTEMINCLUDE \epoc32\include\tremor
+SYSTEMINCLUDE \epoc32\include
+SYSTEMINCLUDE ..\src // for portdefs.h
diff --git a/backends/platform/symbian/mmp/scummvm_cruise.mmp.in b/backends/platform/symbian/mmp/scummvm_cruise.mmp.in
index c26e93dedc..21a674dc1f 100644
--- a/backends/platform/symbian/mmp/scummvm_cruise.mmp.in
+++ b/backends/platform/symbian/mmp/scummvm_cruise.mmp.in
@@ -57,4 +57,15 @@ SOURCEPATH ..\..\..\..\engines\cruise
USERINCLUDE ..\..\..\..\engines
USERINCLUDE ..\..\..\.. ..\..\..\..\gui ..\..\..\..\audio ..\src
-SYSTEMINCLUDE \epoc32\include \epoc32\include\libc ..\src
+
+SYSTEMINCLUDE \epoc32\include\freetype
+SYSTEMINCLUDE \epoc32\include\mpeg2dec
+SYSTEMINCLUDE \epoc32\include\jpeg
+SYSTEMINCLUDE \epoc32\include\png
+SYSTEMINCLUDE \epoc32\include\ESDL
+SYSTEMINCLUDE \epoc32\include\ZLIB // before \epoc32\include because symbian already has older version
+SYSTEMINCLUDE \epoc32\include\libc
+SYSTEMINCLUDE \epoc32\include\theora
+SYSTEMINCLUDE \epoc32\include\tremor
+SYSTEMINCLUDE \epoc32\include
+SYSTEMINCLUDE ..\src // for portdefs.h
diff --git a/backends/platform/symbian/mmp/scummvm_draci.mmp.in b/backends/platform/symbian/mmp/scummvm_draci.mmp.in
index 52f862bc6f..fe899a91ff 100644
--- a/backends/platform/symbian/mmp/scummvm_draci.mmp.in
+++ b/backends/platform/symbian/mmp/scummvm_draci.mmp.in
@@ -57,5 +57,15 @@ SOURCEPATH ..\..\..\..\engines\draci
USERINCLUDE ..\..\..\..\engines
USERINCLUDE ..\..\..\.. ..\..\..\..\gui ..\..\..\..\audio ..\src
+
+SYSTEMINCLUDE \epoc32\include\freetype
+SYSTEMINCLUDE \epoc32\include\mpeg2dec
+SYSTEMINCLUDE \epoc32\include\jpeg
+SYSTEMINCLUDE \epoc32\include\png
+SYSTEMINCLUDE \epoc32\include\ESDL
SYSTEMINCLUDE \epoc32\include\ZLIB // before \epoc32\include because symbian already has older version
-SYSTEMINCLUDE \epoc32\include \epoc32\include\libc ..\src
+SYSTEMINCLUDE \epoc32\include\libc
+SYSTEMINCLUDE \epoc32\include\theora
+SYSTEMINCLUDE \epoc32\include\tremor
+SYSTEMINCLUDE \epoc32\include
+SYSTEMINCLUDE ..\src // for portdefs.h
diff --git a/backends/platform/symbian/mmp/scummvm_drascula.mmp.in b/backends/platform/symbian/mmp/scummvm_drascula.mmp.in
index 9ea02fefe8..8f532d4498 100644
--- a/backends/platform/symbian/mmp/scummvm_drascula.mmp.in
+++ b/backends/platform/symbian/mmp/scummvm_drascula.mmp.in
@@ -57,4 +57,15 @@ SOURCEPATH ..\..\..\..\engines\drascula
USERINCLUDE ..\..\..\..\engines
USERINCLUDE ..\..\..\.. ..\..\..\..\gui ..\..\..\..\audio ..\src
-SYSTEMINCLUDE \epoc32\include \epoc32\include\libc ..\src
+
+SYSTEMINCLUDE \epoc32\include\freetype
+SYSTEMINCLUDE \epoc32\include\mpeg2dec
+SYSTEMINCLUDE \epoc32\include\jpeg
+SYSTEMINCLUDE \epoc32\include\png
+SYSTEMINCLUDE \epoc32\include\ESDL
+SYSTEMINCLUDE \epoc32\include\ZLIB // before \epoc32\include because symbian already has older version
+SYSTEMINCLUDE \epoc32\include\libc
+SYSTEMINCLUDE \epoc32\include\theora
+SYSTEMINCLUDE \epoc32\include\tremor
+SYSTEMINCLUDE \epoc32\include
+SYSTEMINCLUDE ..\src // for portdefs.h
diff --git a/backends/platform/symbian/mmp/scummvm_dreamweb.mmp.in b/backends/platform/symbian/mmp/scummvm_dreamweb.mmp.in
new file mode 100644
index 0000000000..89ffd23ebd
--- /dev/null
+++ b/backends/platform/symbian/mmp/scummvm_dreamweb.mmp.in
@@ -0,0 +1,72 @@
+/* ScummVM - Graphic Adventure Engine
+ * Copyright (C) 2003-2005 Andreas 'Sprawl' Karlsson - Original EPOC port, ESDL
+ * Copyright (C) 2003-2005 Lars 'AnotherGuest' Persson - Original EPOC port, Audio System
+ * Copyright (C) 2005 Jurgen 'SumthinWicked' Braam - EPOC/CVS maintainer
+ * Copyright (C) 2005-2013 The ScummVM project
+ * Copyright (C) 2013 Strizniou Fedor
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ */
+
+//
+// EPOC MMP makefile project for ScummVM
+//
+
+// *** Definitions
+
+TARGET scummvm_dreamweb.lib
+TARGETTYPE lib
+OPTION MSVC /QIfist /Ob1 /Oy /GF // /QIfist disables use of __ftol2 to avoid linker probs with MS libc: http://msdn.microsoft.com/library/default.asp?url=/library/en-us/vccore/html/vcrefQIfistSuppress_ftol.asp
+OPTION GCC -Wno-multichar -Wno-reorder // don't optimize for ARM, platform way too sensitive for that :( just turn off some common warnings
+OPTION GCCE -Wno-multichar -Wno-reorder -Wno-unused -Wno-format -fsigned-char
+ALWAYS_BUILD_AS_ARM
+
+//START_AUTO_MACROS_SLAVE//
+
+ // empty base file, will be updated by Perl build scripts
+
+//STOP_AUTO_MACROS_SLAVE//
+
+// *** SOURCE files
+
+SOURCEPATH ..\..\..\..\engines\dreamweb
+
+//START_AUTO_OBJECTS_DREAMWEB_//
+
+ // empty base file, will be updated by Perl build scripts
+
+//STOP_AUTO_OBJECTS_DREAMWEB_//
+
+// *** Include paths
+
+USERINCLUDE ..\..\..\..\engines
+USERINCLUDE ..\..\..\.. ..\..\..\..\gui ..\..\..\..\audio ..\src
+
+SYSTEMINCLUDE \epoc32\include\freetype
+SYSTEMINCLUDE \epoc32\include\mpeg2dec
+SYSTEMINCLUDE \epoc32\include\jpeg
+SYSTEMINCLUDE \epoc32\include\png
+SYSTEMINCLUDE \epoc32\include\ESDL
+SYSTEMINCLUDE \epoc32\include\ZLIB // before \epoc32\include because symbian already has older version
+SYSTEMINCLUDE \epoc32\include\libc
+SYSTEMINCLUDE \epoc32\include\theora
+SYSTEMINCLUDE \epoc32\include\tremor
+SYSTEMINCLUDE \epoc32\include
+SYSTEMINCLUDE ..\src // for portdefs.h
diff --git a/backends/platform/symbian/mmp/scummvm_fullpipe.mmp.in b/backends/platform/symbian/mmp/scummvm_fullpipe.mmp.in
new file mode 100644
index 0000000000..7612ad2bae
--- /dev/null
+++ b/backends/platform/symbian/mmp/scummvm_fullpipe.mmp.in
@@ -0,0 +1,72 @@
+/* ScummVM - Graphic Adventure Engine
+ * Copyright (C) 2003-2005 Andreas 'Sprawl' Karlsson - Original EPOC port, ESDL
+ * Copyright (C) 2003-2005 Lars 'AnotherGuest' Persson - Original EPOC port, Audio System
+ * Copyright (C) 2005 Jurgen 'SumthinWicked' Braam - EPOC/CVS maintainer
+ * Copyright (C) 2005-2013 The ScummVM project
+ * Copyright (C) 2013 Strizniou Fedor
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ */
+
+//
+// EPOC MMP makefile project for ScummVM
+//
+
+// *** Definitions
+
+TARGET scummvm_fullpipe.lib
+TARGETTYPE lib
+OPTION MSVC /QIfist /Ob1 /Oy /GF // /QIfist disables use of __ftol2 to avoid linker probs with MS libc: http://msdn.microsoft.com/library/default.asp?url=/library/en-us/vccore/html/vcrefQIfistSuppress_ftol.asp
+OPTION GCC -Wno-multichar -Wno-reorder // don't optimize for ARM, platform way too sensitive for that :( just turn off some common warnings
+OPTION GCCE -Wno-multichar -Wno-reorder -Wno-unused -Wno-format -fsigned-char
+ALWAYS_BUILD_AS_ARM
+
+//START_AUTO_MACROS_SLAVE//
+
+ // empty base file, will be updated by Perl build scripts
+
+//STOP_AUTO_MACROS_SLAVE//
+
+// *** SOURCE files
+
+SOURCEPATH ..\..\..\..\engines\fullpipe
+
+//START_AUTO_OBJECTS_FULLPIPE_//
+
+ // empty base file, will be updated by Perl build scripts
+
+//STOP_AUTO_OBJECTS_FULLPIPE_//
+
+// *** Include paths
+
+USERINCLUDE ..\..\..\..\engines
+USERINCLUDE ..\..\..\.. ..\..\..\..\gui ..\..\..\..\audio ..\src
+
+SYSTEMINCLUDE \epoc32\include\freetype
+SYSTEMINCLUDE \epoc32\include\mpeg2dec
+SYSTEMINCLUDE \epoc32\include\jpeg
+SYSTEMINCLUDE \epoc32\include\png
+SYSTEMINCLUDE \epoc32\include\ESDL
+SYSTEMINCLUDE \epoc32\include\ZLIB // before \epoc32\include because symbian already has older version
+SYSTEMINCLUDE \epoc32\include\libc
+SYSTEMINCLUDE \epoc32\include\theora
+SYSTEMINCLUDE \epoc32\include\tremor
+SYSTEMINCLUDE \epoc32\include
+SYSTEMINCLUDE ..\src // for portdefs.h
diff --git a/backends/platform/symbian/mmp/scummvm_gob.mmp.in b/backends/platform/symbian/mmp/scummvm_gob.mmp.in
index 906d54b487..884b06c61a 100644
--- a/backends/platform/symbian/mmp/scummvm_gob.mmp.in
+++ b/backends/platform/symbian/mmp/scummvm_gob.mmp.in
@@ -57,4 +57,15 @@ SOURCEPATH ..\..\..\..\engines\gob
USERINCLUDE ..\..\..\..\engines
USERINCLUDE ..\..\..\.. ..\..\..\..\gui ..\..\..\..\audio ..\src
-SYSTEMINCLUDE \epoc32\include \epoc32\include\libc ..\src
+
+SYSTEMINCLUDE \epoc32\include\freetype
+SYSTEMINCLUDE \epoc32\include\mpeg2dec
+SYSTEMINCLUDE \epoc32\include\jpeg
+SYSTEMINCLUDE \epoc32\include\png
+SYSTEMINCLUDE \epoc32\include\ESDL
+SYSTEMINCLUDE \epoc32\include\ZLIB // before \epoc32\include because symbian already has older version
+SYSTEMINCLUDE \epoc32\include\libc
+SYSTEMINCLUDE \epoc32\include\theora
+SYSTEMINCLUDE \epoc32\include\tremor
+SYSTEMINCLUDE \epoc32\include
+SYSTEMINCLUDE ..\src // for portdefs.h
diff --git a/backends/platform/symbian/mmp/scummvm_groovie.mmp.in b/backends/platform/symbian/mmp/scummvm_groovie.mmp.in
index e7f70bc110..53fb33fef0 100644
--- a/backends/platform/symbian/mmp/scummvm_groovie.mmp.in
+++ b/backends/platform/symbian/mmp/scummvm_groovie.mmp.in
@@ -52,10 +52,21 @@ SOURCEPATH ..\..\..\..\engines\groovie
// empty base file, will be updated by Perl build scripts
//STOP_AUTO_OBJECTS_GROOVIE_//
+SOURCE roq.cpp
// *** Include paths
USERINCLUDE ..\..\..\..\engines
USERINCLUDE ..\..\..\.. ..\..\..\..\gui ..\..\..\..\audio ..\src
+
+SYSTEMINCLUDE \epoc32\include\freetype
+SYSTEMINCLUDE \epoc32\include\mpeg2dec
+SYSTEMINCLUDE \epoc32\include\jpeg
+SYSTEMINCLUDE \epoc32\include\png
+SYSTEMINCLUDE \epoc32\include\ESDL
SYSTEMINCLUDE \epoc32\include\ZLIB // before \epoc32\include because symbian already has older version
-SYSTEMINCLUDE \epoc32\include \epoc32\include\libc ..\src
+SYSTEMINCLUDE \epoc32\include\libc
+SYSTEMINCLUDE \epoc32\include\theora
+SYSTEMINCLUDE \epoc32\include\tremor
+SYSTEMINCLUDE \epoc32\include
+SYSTEMINCLUDE ..\src // for portdefs.h
diff --git a/backends/platform/symbian/mmp/scummvm_hopkins.mmp.in b/backends/platform/symbian/mmp/scummvm_hopkins.mmp.in
index 4509026b6c..bafc11e65f 100644
--- a/backends/platform/symbian/mmp/scummvm_hopkins.mmp.in
+++ b/backends/platform/symbian/mmp/scummvm_hopkins.mmp.in
@@ -57,5 +57,15 @@ SOURCEPATH ..\..\..\..\engines\HOPKINS
USERINCLUDE ..\..\..\..\engines
USERINCLUDE ..\..\..\.. ..\..\..\..\gui ..\..\..\..\audio ..\src
+
+SYSTEMINCLUDE \epoc32\include\freetype
+SYSTEMINCLUDE \epoc32\include\mpeg2dec
+SYSTEMINCLUDE \epoc32\include\jpeg
+SYSTEMINCLUDE \epoc32\include\png
+SYSTEMINCLUDE \epoc32\include\ESDL
SYSTEMINCLUDE \epoc32\include\ZLIB // before \epoc32\include because symbian already has older version
-SYSTEMINCLUDE \epoc32\include \epoc32\include\libc ..\src
+SYSTEMINCLUDE \epoc32\include\libc
+SYSTEMINCLUDE \epoc32\include\theora
+SYSTEMINCLUDE \epoc32\include\tremor
+SYSTEMINCLUDE \epoc32\include
+SYSTEMINCLUDE ..\src // for portdefs.h \ No newline at end of file
diff --git a/backends/platform/symbian/mmp/scummvm_hugo.mmp.in b/backends/platform/symbian/mmp/scummvm_hugo.mmp.in
index 13dd7efa1e..58622a83fd 100644
--- a/backends/platform/symbian/mmp/scummvm_hugo.mmp.in
+++ b/backends/platform/symbian/mmp/scummvm_hugo.mmp.in
@@ -57,5 +57,15 @@ SOURCEPATH ..\..\..\..\engines\hugo
USERINCLUDE ..\..\..\..\engines
USERINCLUDE ..\..\..\.. ..\..\..\..\gui ..\..\..\..\audio ..\src
+
+SYSTEMINCLUDE \epoc32\include\freetype
+SYSTEMINCLUDE \epoc32\include\mpeg2dec
+SYSTEMINCLUDE \epoc32\include\jpeg
+SYSTEMINCLUDE \epoc32\include\png
+SYSTEMINCLUDE \epoc32\include\ESDL
SYSTEMINCLUDE \epoc32\include\ZLIB // before \epoc32\include because symbian already has older version
-SYSTEMINCLUDE \epoc32\include \epoc32\include\libc ..\src
+SYSTEMINCLUDE \epoc32\include\libc
+SYSTEMINCLUDE \epoc32\include\theora
+SYSTEMINCLUDE \epoc32\include\tremor
+SYSTEMINCLUDE \epoc32\include
+SYSTEMINCLUDE ..\src // for portdefs.h \ No newline at end of file
diff --git a/backends/platform/symbian/mmp/scummvm_kyra.mmp.in b/backends/platform/symbian/mmp/scummvm_kyra.mmp.in
index 5772bfaad0..3fa05e856d 100644
--- a/backends/platform/symbian/mmp/scummvm_kyra.mmp.in
+++ b/backends/platform/symbian/mmp/scummvm_kyra.mmp.in
@@ -59,8 +59,26 @@ SOURCEPATH ..\..\..\..\engines\kyra
//STOP_AUTO_OBJECTS_KYRA_ENABLE_LOL//
+
+//START_AUTO_OBJECTS_KYRA_ENABLE_EOB//
+
+ // empty base file, will be updated by Perl build scripts
+
+//STOP_AUTO_OBJECTS_KYRA_ENABLE_EOB//
+
// *** Include paths
USERINCLUDE ..\..\..\..\engines
USERINCLUDE ..\..\..\.. ..\..\..\..\gui ..\..\..\..\audio ..\src
-SYSTEMINCLUDE \epoc32\include \epoc32\include\libc ..\src
+
+SYSTEMINCLUDE \epoc32\include\freetype
+SYSTEMINCLUDE \epoc32\include\mpeg2dec
+SYSTEMINCLUDE \epoc32\include\jpeg
+SYSTEMINCLUDE \epoc32\include\png
+SYSTEMINCLUDE \epoc32\include\ESDL
+SYSTEMINCLUDE \epoc32\include\ZLIB // before \epoc32\include because symbian already has older version
+SYSTEMINCLUDE \epoc32\include\libc
+SYSTEMINCLUDE \epoc32\include\theora
+SYSTEMINCLUDE \epoc32\include\tremor
+SYSTEMINCLUDE \epoc32\include
+SYSTEMINCLUDE ..\src // for portdefs.h
diff --git a/backends/platform/symbian/mmp/scummvm_lastexpress.mmp.in b/backends/platform/symbian/mmp/scummvm_lastexpress.mmp.in
index b8db95ea0c..8e0b3026c7 100644
--- a/backends/platform/symbian/mmp/scummvm_lastexpress.mmp.in
+++ b/backends/platform/symbian/mmp/scummvm_lastexpress.mmp.in
@@ -57,5 +57,15 @@ SOURCEPATH ..\..\..\..\engines\lastexpress
USERINCLUDE ..\..\..\..\engines
USERINCLUDE ..\..\..\.. ..\..\..\..\gui ..\..\..\..\audio ..\src
+
+SYSTEMINCLUDE \epoc32\include\freetype
+SYSTEMINCLUDE \epoc32\include\mpeg2dec
+SYSTEMINCLUDE \epoc32\include\jpeg
+SYSTEMINCLUDE \epoc32\include\png
+SYSTEMINCLUDE \epoc32\include\ESDL
SYSTEMINCLUDE \epoc32\include\ZLIB // before \epoc32\include because symbian already has older version
-SYSTEMINCLUDE \epoc32\include \epoc32\include\libc ..\src
+SYSTEMINCLUDE \epoc32\include\libc
+SYSTEMINCLUDE \epoc32\include\theora
+SYSTEMINCLUDE \epoc32\include\tremor
+SYSTEMINCLUDE \epoc32\include
+SYSTEMINCLUDE ..\src // for portdefs.h
diff --git a/backends/platform/symbian/mmp/scummvm_lure.mmp.in b/backends/platform/symbian/mmp/scummvm_lure.mmp.in
index 84c3eecd5e..89c93d058d 100644
--- a/backends/platform/symbian/mmp/scummvm_lure.mmp.in
+++ b/backends/platform/symbian/mmp/scummvm_lure.mmp.in
@@ -57,4 +57,15 @@ SOURCEPATH ..\..\..\..\engines\lure
USERINCLUDE ..\..\..\..\engines
USERINCLUDE ..\..\..\.. ..\..\..\..\gui ..\..\..\..\audio ..\src
-SYSTEMINCLUDE \epoc32\include \epoc32\include\libc ..\src
+
+SYSTEMINCLUDE \epoc32\include\freetype
+SYSTEMINCLUDE \epoc32\include\mpeg2dec
+SYSTEMINCLUDE \epoc32\include\jpeg
+SYSTEMINCLUDE \epoc32\include\png
+SYSTEMINCLUDE \epoc32\include\ESDL
+SYSTEMINCLUDE \epoc32\include\ZLIB // before \epoc32\include because symbian already has older version
+SYSTEMINCLUDE \epoc32\include\libc
+SYSTEMINCLUDE \epoc32\include\theora
+SYSTEMINCLUDE \epoc32\include\tremor
+SYSTEMINCLUDE \epoc32\include
+SYSTEMINCLUDE ..\src // for portdefs.h
diff --git a/backends/platform/symbian/mmp/scummvm_m4.mmp.in b/backends/platform/symbian/mmp/scummvm_m4.mmp.in
index e69b40ceb0..b3024c93c3 100644
--- a/backends/platform/symbian/mmp/scummvm_m4.mmp.in
+++ b/backends/platform/symbian/mmp/scummvm_m4.mmp.in
@@ -57,5 +57,15 @@ SOURCEPATH ..\..\..\..\engines\m4
USERINCLUDE ..\..\..\..\engines
USERINCLUDE ..\..\..\.. ..\..\..\..\gui ..\..\..\..\audio ..\src
+
+SYSTEMINCLUDE \epoc32\include\freetype
+SYSTEMINCLUDE \epoc32\include\mpeg2dec
+SYSTEMINCLUDE \epoc32\include\jpeg
+SYSTEMINCLUDE \epoc32\include\png
+SYSTEMINCLUDE \epoc32\include\ESDL
SYSTEMINCLUDE \epoc32\include\ZLIB // before \epoc32\include because symbian already has older version
-SYSTEMINCLUDE \epoc32\include \epoc32\include\libc ..\src
+SYSTEMINCLUDE \epoc32\include\libc
+SYSTEMINCLUDE \epoc32\include\theora
+SYSTEMINCLUDE \epoc32\include\tremor
+SYSTEMINCLUDE \epoc32\include
+SYSTEMINCLUDE ..\src // for portdefs.h
diff --git a/backends/platform/symbian/mmp/scummvm_made.mmp.in b/backends/platform/symbian/mmp/scummvm_made.mmp.in
index b52d9cc6cb..d4a63f8d87 100644
--- a/backends/platform/symbian/mmp/scummvm_made.mmp.in
+++ b/backends/platform/symbian/mmp/scummvm_made.mmp.in
@@ -57,5 +57,16 @@ SOURCEPATH ..\..\..\..\engines\made
USERINCLUDE ..\..\..\..\engines
USERINCLUDE ..\..\..\.. ..\..\..\..\gui ..\..\..\..\audio ..\src
+
+SYSTEMINCLUDE \epoc32\include\freetype
+SYSTEMINCLUDE \epoc32\include\mpeg2dec
+SYSTEMINCLUDE \epoc32\include\jpeg
+SYSTEMINCLUDE \epoc32\include\png
+SYSTEMINCLUDE \epoc32\include\ESDL
SYSTEMINCLUDE \epoc32\include\ZLIB // before \epoc32\include because symbian already has older version
-SYSTEMINCLUDE \epoc32\include \epoc32\include\libc ..\src
+SYSTEMINCLUDE \epoc32\include\libc
+SYSTEMINCLUDE \epoc32\include\theora
+SYSTEMINCLUDE \epoc32\include\tremor
+SYSTEMINCLUDE \epoc32\include
+SYSTEMINCLUDE ..\src // for portdefs.h
+
diff --git a/backends/platform/symbian/mmp/scummvm_mads.mmp.in b/backends/platform/symbian/mmp/scummvm_mads.mmp.in
new file mode 100644
index 0000000000..d0d6091f83
--- /dev/null
+++ b/backends/platform/symbian/mmp/scummvm_mads.mmp.in
@@ -0,0 +1,72 @@
+/* ScummVM - Graphic Adventure Engine
+ * Copyright (C) 2003-2005 Andreas 'Sprawl' Karlsson - Original EPOC port, ESDL
+ * Copyright (C) 2003-2005 Lars 'AnotherGuest' Persson - Original EPOC port, Audio System
+ * Copyright (C) 2005 Jurgen 'SumthinWicked' Braam - EPOC/CVS maintainer
+ * Copyright (C) 2005-2013 The ScummVM project
+ * Copyright (C) 2014 Fedor Strizhniou - Epoc project file
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ */
+
+//
+// EPOC MMP makefile project for ScummVM
+//
+
+// *** Definitions
+
+TARGET scummvm_mads.lib
+TARGETTYPE lib
+OPTION MSVC /QIfist /Ob1 /Oy /GF // /QIfist disables use of __ftol2 to avoid linker probs with MS libc: http://msdn.microsoft.com/library/default.asp?url=/library/en-us/vccore/html/vcrefQIfistSuppress_ftol.asp
+OPTION GCC -Wno-multichar -Wno-reorder // don't optimize for ARM, platform way too sensitive for that :( just turn off some common warnings
+OPTION GCCE -Wno-multichar -Wno-reorder -Wno-unused -Wno-format -fsigned-char
+ALWAYS_BUILD_AS_ARM
+
+//START_AUTO_MACROS_SLAVE//
+
+ // empty base file, will be updated by Perl build scripts
+
+//STOP_AUTO_MACROS_SLAVE//
+
+// *** SOURCE files
+
+SOURCEPATH ..\..\..\..\engines\mads
+
+//START_AUTO_OBJECTS_MADS_//
+
+ // empty base file, will be updated by Perl build scripts
+
+//STOP_AUTO_OBJECTS_MADS_//
+
+// *** Include paths
+
+USERINCLUDE ..\..\..\..\engines
+USERINCLUDE ..\..\..\.. ..\..\..\..\gui ..\..\..\..\audio ..\src
+
+SYSTEMINCLUDE \epoc32\include\freetype
+SYSTEMINCLUDE \epoc32\include\mpeg2dec
+SYSTEMINCLUDE \epoc32\include\jpeg
+SYSTEMINCLUDE \epoc32\include\png
+SYSTEMINCLUDE \epoc32\include\ESDL
+SYSTEMINCLUDE \epoc32\include\ZLIB // before \epoc32\include because symbian already has older version
+SYSTEMINCLUDE \epoc32\include\libc
+SYSTEMINCLUDE \epoc32\include\theora
+SYSTEMINCLUDE \epoc32\include\tremor
+SYSTEMINCLUDE \epoc32\include
+SYSTEMINCLUDE ..\src // for portdefs.h
diff --git a/backends/platform/symbian/mmp/scummvm_mohawk.mmp.in b/backends/platform/symbian/mmp/scummvm_mohawk.mmp.in
index 5f7bd4e144..e9175593ec 100644
--- a/backends/platform/symbian/mmp/scummvm_mohawk.mmp.in
+++ b/backends/platform/symbian/mmp/scummvm_mohawk.mmp.in
@@ -53,9 +53,38 @@ SOURCEPATH ..\..\..\..\engines\mohawk
//STOP_AUTO_OBJECTS_MOHAWK_//
+
+//START_AUTO_OBJECTS_MOHAWK_ENABLE_MYST//
+
+ // empty base file, will be updated by Perl build scripts
+
+//STOP_AUTO_OBJECTS_MOHAWK_ENABLE_MYST//
+
+//START_AUTO_OBJECTS_MOHAWK_ENABLE_RIVEN//
+
+ // empty base file, will be updated by Perl build scripts
+
+//STOP_AUTO_OBJECTS_MOHAWK_ENABLE_RIVEN//
+
+//START_AUTO_OBJECTS_MOHAWK_ENABLE_CSTIME//
+
+ // empty base file, will be updated by Perl build scripts
+
+//STOP_AUTO_OBJECTS_MOHAWK_ENABLE_CSTIME//
+
// *** Include paths
USERINCLUDE ..\..\..\..\engines
USERINCLUDE ..\..\..\.. ..\..\..\..\gui ..\..\..\..\audio ..\src
+
+SYSTEMINCLUDE \epoc32\include\freetype
+SYSTEMINCLUDE \epoc32\include\mpeg2dec
+SYSTEMINCLUDE \epoc32\include\jpeg
+SYSTEMINCLUDE \epoc32\include\png
+SYSTEMINCLUDE \epoc32\include\ESDL
SYSTEMINCLUDE \epoc32\include\ZLIB // before \epoc32\include because symbian already has older version
-SYSTEMINCLUDE \epoc32\include \epoc32\include\libc ..\src
+SYSTEMINCLUDE \epoc32\include\libc
+SYSTEMINCLUDE \epoc32\include\theora
+SYSTEMINCLUDE \epoc32\include\tremor
+SYSTEMINCLUDE \epoc32\include
+SYSTEMINCLUDE ..\src // for portdefs.h
diff --git a/backends/platform/symbian/mmp/scummvm_mortevielle.mmp.in b/backends/platform/symbian/mmp/scummvm_mortevielle.mmp.in
new file mode 100644
index 0000000000..f118ddbef0
--- /dev/null
+++ b/backends/platform/symbian/mmp/scummvm_mortevielle.mmp.in
@@ -0,0 +1,72 @@
+/* ScummVM - Graphic Adventure Engine
+ * Copyright (C) 2003-2005 Andreas 'Sprawl' Karlsson - Original EPOC port, ESDL
+ * Copyright (C) 2003-2005 Lars 'AnotherGuest' Persson - Original EPOC port, Audio System
+ * Copyright (C) 2005 Jurgen 'SumthinWicked' Braam - EPOC/CVS maintainer
+ * Copyright (C) 2005-2013 The ScummVM project
+ * Copyright (C) 2013 Strizniou Fedor
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ */
+
+//
+// EPOC MMP makefile project for ScummVM
+//
+
+// *** Definitions
+
+TARGET scummvm_mortevielle.lib
+TARGETTYPE lib
+OPTION MSVC /QIfist /Ob1 /Oy /GF // /QIfist disables use of __ftol2 to avoid linker probs with MS libc: http://msdn.microsoft.com/library/default.asp?url=/library/en-us/vccore/html/vcrefQIfistSuppress_ftol.asp
+OPTION GCC -Wno-multichar -Wno-reorder // don't optimize for ARM, platform way too sensitive for that :( just turn off some common warnings
+OPTION GCCE -Wno-multichar -Wno-reorder -Wno-unused -Wno-format -fsigned-char
+ALWAYS_BUILD_AS_ARM
+
+//START_AUTO_MACROS_SLAVE//
+
+ // empty base file, will be updated by Perl build scripts
+
+//STOP_AUTO_MACROS_SLAVE//
+
+// *** SOURCE files
+
+SOURCEPATH ..\..\..\..\engines\mortevielle
+
+//START_AUTO_OBJECTS_MORTEVIELLE_//
+
+ // empty base file, will be updated by Perl build scripts
+
+//STOP_AUTO_OBJECTS_MORTEVIELLE_//
+
+// *** Include paths
+
+USERINCLUDE ..\..\..\..\engines
+USERINCLUDE ..\..\..\.. ..\..\..\..\gui ..\..\..\..\audio ..\src
+
+SYSTEMINCLUDE \epoc32\include\freetype
+SYSTEMINCLUDE \epoc32\include\mpeg2dec
+SYSTEMINCLUDE \epoc32\include\jpeg
+SYSTEMINCLUDE \epoc32\include\png
+SYSTEMINCLUDE \epoc32\include\ESDL
+SYSTEMINCLUDE \epoc32\include\ZLIB // before \epoc32\include because symbian already has older version
+SYSTEMINCLUDE \epoc32\include\libc
+SYSTEMINCLUDE \epoc32\include\theora
+SYSTEMINCLUDE \epoc32\include\tremor
+SYSTEMINCLUDE \epoc32\include
+SYSTEMINCLUDE ..\src // for portdefs.h
diff --git a/backends/platform/symbian/mmp/scummvm_neverhood.mmp.in b/backends/platform/symbian/mmp/scummvm_neverhood.mmp.in
new file mode 100644
index 0000000000..a57161577f
--- /dev/null
+++ b/backends/platform/symbian/mmp/scummvm_neverhood.mmp.in
@@ -0,0 +1,71 @@
+/* ScummVM - Graphic Adventure Engine
+ * Copyright (C) 2003-2005 Andreas 'Sprawl' Karlsson - Original EPOC port, ESDL
+ * Copyright (C) 2003-2005 Lars 'AnotherGuest' Persson - Original EPOC port, Audio System
+ * Copyright (C) 2005 Jurgen 'SumthinWicked' Braam - EPOC/CVS maintainer
+ * Copyright (C) 2005-2013 The ScummVM project
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ */
+
+//
+// EPOC MMP makefile project for ScummVM
+//
+
+// *** Definitions
+
+TARGET scummvm_neverhood.lib
+TARGETTYPE lib
+OPTION MSVC /QIfist /Ob1 /Oy /GF // /QIfist disables use of __ftol2 to avoid linker probs with MS libc: http://msdn.microsoft.com/library/default.asp?url=/library/en-us/vccore/html/vcrefQIfistSuppress_ftol.asp
+OPTION GCC -Wno-multichar -Wno-reorder // don't optimize for ARM, platform way too sensitive for that :( just turn off some common warnings
+OPTION GCCE -Wno-multichar -Wno-reorder -Wno-unused -Wno-format -fsigned-char
+ALWAYS_BUILD_AS_ARM
+
+//START_AUTO_MACROS_SLAVE//
+
+ // empty base file, will be updated by Perl build scripts
+
+//STOP_AUTO_MACROS_SLAVE//
+
+// *** SOURCE files
+
+SOURCEPATH ..\..\..\..\engines\neverhood
+
+//START_AUTO_OBJECTS_NEVERHOOD_//
+
+ // empty base file, will be updated by Perl build scripts
+
+//STOP_AUTO_OBJECTS_NEVERHOOD_//
+
+// *** Include paths
+
+USERINCLUDE ..\..\..\..\engines
+USERINCLUDE ..\..\..\.. ..\..\..\..\gui ..\..\..\..\audio ..\src
+
+SYSTEMINCLUDE \epoc32\include\freetype
+SYSTEMINCLUDE \epoc32\include\mpeg2dec
+SYSTEMINCLUDE \epoc32\include\jpeg
+SYSTEMINCLUDE \epoc32\include\png
+SYSTEMINCLUDE \epoc32\include\ESDL
+SYSTEMINCLUDE \epoc32\include\ZLIB // before \epoc32\include because symbian already has older version
+SYSTEMINCLUDE \epoc32\include\libc
+SYSTEMINCLUDE \epoc32\include\theora
+SYSTEMINCLUDE \epoc32\include\tremor
+SYSTEMINCLUDE \epoc32\include
+SYSTEMINCLUDE ..\src // for portdefs.h
diff --git a/backends/platform/symbian/mmp/scummvm_parallaction.mmp.in b/backends/platform/symbian/mmp/scummvm_parallaction.mmp.in
index f8ee389577..cefdd1b282 100644
--- a/backends/platform/symbian/mmp/scummvm_parallaction.mmp.in
+++ b/backends/platform/symbian/mmp/scummvm_parallaction.mmp.in
@@ -57,5 +57,15 @@ SOURCEPATH ..\..\..\..\engines\parallaction
USERINCLUDE ..\..\..\..\engines
USERINCLUDE ..\..\..\.. ..\..\..\..\gui ..\..\..\..\audio ..\src
+
+SYSTEMINCLUDE \epoc32\include\freetype
+SYSTEMINCLUDE \epoc32\include\mpeg2dec
+SYSTEMINCLUDE \epoc32\include\jpeg
+SYSTEMINCLUDE \epoc32\include\png
+SYSTEMINCLUDE \epoc32\include\ESDL
SYSTEMINCLUDE \epoc32\include\ZLIB // before \epoc32\include because symbian already has older version
-SYSTEMINCLUDE \epoc32\include \epoc32\include\libc ..\src
+SYSTEMINCLUDE \epoc32\include\libc
+SYSTEMINCLUDE \epoc32\include\theora
+SYSTEMINCLUDE \epoc32\include\tremor
+SYSTEMINCLUDE \epoc32\include
+SYSTEMINCLUDE ..\src // for portdefs.h
diff --git a/backends/platform/symbian/mmp/scummvm_pegasus.mmp.in b/backends/platform/symbian/mmp/scummvm_pegasus.mmp.in
index fefc63e936..68b2c12774 100644
--- a/backends/platform/symbian/mmp/scummvm_pegasus.mmp.in
+++ b/backends/platform/symbian/mmp/scummvm_pegasus.mmp.in
@@ -57,5 +57,15 @@ SOURCEPATH ..\..\..\..\engines\PEGASUS
USERINCLUDE ..\..\..\..\engines
USERINCLUDE ..\..\..\.. ..\..\..\..\gui ..\..\..\..\audio ..\src
+
+SYSTEMINCLUDE \epoc32\include\freetype
+SYSTEMINCLUDE \epoc32\include\mpeg2dec
+SYSTEMINCLUDE \epoc32\include\jpeg
+SYSTEMINCLUDE \epoc32\include\png
+SYSTEMINCLUDE \epoc32\include\ESDL
SYSTEMINCLUDE \epoc32\include\ZLIB // before \epoc32\include because symbian already has older version
-SYSTEMINCLUDE \epoc32\include \epoc32\include\libc ..\src
+SYSTEMINCLUDE \epoc32\include\libc
+SYSTEMINCLUDE \epoc32\include\theora
+SYSTEMINCLUDE \epoc32\include\tremor
+SYSTEMINCLUDE \epoc32\include
+SYSTEMINCLUDE ..\src // for portdefs.h \ No newline at end of file
diff --git a/backends/platform/symbian/mmp/scummvm_queen.mmp.in b/backends/platform/symbian/mmp/scummvm_queen.mmp.in
index f507f482f9..94835aae90 100644
--- a/backends/platform/symbian/mmp/scummvm_queen.mmp.in
+++ b/backends/platform/symbian/mmp/scummvm_queen.mmp.in
@@ -57,4 +57,15 @@ SOURCEPATH ..\..\..\..\engines\queen
USERINCLUDE ..\..\..\..\engines
USERINCLUDE ..\..\..\.. ..\..\..\..\gui ..\..\..\..\audio ..\src
-SYSTEMINCLUDE \epoc32\include \epoc32\include\libc ..\src
+
+SYSTEMINCLUDE \epoc32\include\freetype
+SYSTEMINCLUDE \epoc32\include\mpeg2dec
+SYSTEMINCLUDE \epoc32\include\jpeg
+SYSTEMINCLUDE \epoc32\include\png
+SYSTEMINCLUDE \epoc32\include\ESDL
+SYSTEMINCLUDE \epoc32\include\ZLIB // before \epoc32\include because symbian already has older version
+SYSTEMINCLUDE \epoc32\include\libc
+SYSTEMINCLUDE \epoc32\include\theora
+SYSTEMINCLUDE \epoc32\include\tremor
+SYSTEMINCLUDE \epoc32\include
+SYSTEMINCLUDE ..\src // for portdefs.h
diff --git a/backends/platform/symbian/mmp/scummvm_saga.mmp.in b/backends/platform/symbian/mmp/scummvm_saga.mmp.in
index cd158556dc..77bf839efe 100644
--- a/backends/platform/symbian/mmp/scummvm_saga.mmp.in
+++ b/backends/platform/symbian/mmp/scummvm_saga.mmp.in
@@ -69,4 +69,15 @@ SOURCEPATH ..\..\..\..\engines\saga
USERINCLUDE ..\..\..\..\engines
USERINCLUDE ..\..\..\.. ..\..\..\..\gui ..\..\..\..\audio ..\src
-SYSTEMINCLUDE \epoc32\include \epoc32\include\libc ..\src
+
+SYSTEMINCLUDE \epoc32\include\freetype
+SYSTEMINCLUDE \epoc32\include\mpeg2dec
+SYSTEMINCLUDE \epoc32\include\jpeg
+SYSTEMINCLUDE \epoc32\include\png
+SYSTEMINCLUDE \epoc32\include\ESDL
+SYSTEMINCLUDE \epoc32\include\ZLIB // before \epoc32\include because symbian already has older version
+SYSTEMINCLUDE \epoc32\include\libc
+SYSTEMINCLUDE \epoc32\include\theora
+SYSTEMINCLUDE \epoc32\include\tremor
+SYSTEMINCLUDE \epoc32\include
+SYSTEMINCLUDE ..\src // for portdefs.h
diff --git a/backends/platform/symbian/mmp/scummvm_sci.mmp.in b/backends/platform/symbian/mmp/scummvm_sci.mmp.in
index 5749c66e10..d08501e471 100644
--- a/backends/platform/symbian/mmp/scummvm_sci.mmp.in
+++ b/backends/platform/symbian/mmp/scummvm_sci.mmp.in
@@ -53,9 +53,27 @@ SOURCEPATH ..\..\..\..\engines\sci
//STOP_AUTO_OBJECTS_SCI_//
+
+//START_AUTO_OBJECTS_SCI_ENABLE_SCI32//
+
+ // empty base file, will be updated by Perl build scripts
+
+//STOP_AUTO_OBJECTS_SCI_ENABLE_SCI32//
+
+
// *** Include paths
USERINCLUDE ..\..\..\..\engines
USERINCLUDE ..\..\..\.. ..\..\..\..\gui ..\..\..\..\audio ..\src
+
+SYSTEMINCLUDE \epoc32\include\freetype
+SYSTEMINCLUDE \epoc32\include\mpeg2dec
+SYSTEMINCLUDE \epoc32\include\jpeg
+SYSTEMINCLUDE \epoc32\include\png
+SYSTEMINCLUDE \epoc32\include\ESDL
SYSTEMINCLUDE \epoc32\include\ZLIB // before \epoc32\include because symbian already has older version
-SYSTEMINCLUDE \epoc32\include \epoc32\include\libc ..\src
+SYSTEMINCLUDE \epoc32\include\libc
+SYSTEMINCLUDE \epoc32\include\theora
+SYSTEMINCLUDE \epoc32\include\tremor
+SYSTEMINCLUDE \epoc32\include
+SYSTEMINCLUDE ..\src // for portdefs.h
diff --git a/backends/platform/symbian/mmp/scummvm_scumm.mmp.in b/backends/platform/symbian/mmp/scummvm_scumm.mmp.in
index c07725e002..a11dd071d3 100644
--- a/backends/platform/symbian/mmp/scummvm_scumm.mmp.in
+++ b/backends/platform/symbian/mmp/scummvm_scumm.mmp.in
@@ -81,7 +81,14 @@ SOURCE smush/codec47ARM.s // ARM version: add ASM routines
USERINCLUDE ..\..\..\..\engines ..\..\..\..\engines\scumm\smush ..\..\..\..\engines\scumm\insane
USERINCLUDE ..\..\..\.. ..\..\..\..\gui ..\..\..\..\audio ..\src
+SYSTEMINCLUDE \epoc32\include\freetype
+SYSTEMINCLUDE \epoc32\include\mpeg2dec
+SYSTEMINCLUDE \epoc32\include\jpeg
+SYSTEMINCLUDE \epoc32\include\png
+SYSTEMINCLUDE \epoc32\include\ESDL
SYSTEMINCLUDE \epoc32\include\ZLIB // before \epoc32\include because symbian already has older version
SYSTEMINCLUDE \epoc32\include\libc
+SYSTEMINCLUDE \epoc32\include\theora
+SYSTEMINCLUDE \epoc32\include\tremor
SYSTEMINCLUDE \epoc32\include
SYSTEMINCLUDE ..\src // for portdefs.h
diff --git a/backends/platform/symbian/mmp/scummvm_sky.mmp.in b/backends/platform/symbian/mmp/scummvm_sky.mmp.in
index b5048106dc..37fdc89f99 100644
--- a/backends/platform/symbian/mmp/scummvm_sky.mmp.in
+++ b/backends/platform/symbian/mmp/scummvm_sky.mmp.in
@@ -57,4 +57,15 @@ SOURCEPATH ..\..\..\..\engines\sky
USERINCLUDE ..\..\..\..\engines ..\..\..\..\engines\sky\music
USERINCLUDE ..\..\..\.. ..\..\..\..\gui ..\..\..\..\audio ..\src
-SYSTEMINCLUDE \epoc32\include \epoc32\include\libc ..\src
+
+SYSTEMINCLUDE \epoc32\include\freetype
+SYSTEMINCLUDE \epoc32\include\mpeg2dec
+SYSTEMINCLUDE \epoc32\include\jpeg
+SYSTEMINCLUDE \epoc32\include\png
+SYSTEMINCLUDE \epoc32\include\ESDL
+SYSTEMINCLUDE \epoc32\include\ZLIB // before \epoc32\include because symbian already has older version
+SYSTEMINCLUDE \epoc32\include\libc
+SYSTEMINCLUDE \epoc32\include\theora
+SYSTEMINCLUDE \epoc32\include\tremor
+SYSTEMINCLUDE \epoc32\include
+SYSTEMINCLUDE ..\src // for portdefs.h
diff --git a/backends/platform/symbian/mmp/scummvm_sword1.mmp.in b/backends/platform/symbian/mmp/scummvm_sword1.mmp.in
index 578839e8c4..352cbe59f0 100644
--- a/backends/platform/symbian/mmp/scummvm_sword1.mmp.in
+++ b/backends/platform/symbian/mmp/scummvm_sword1.mmp.in
@@ -57,4 +57,15 @@ SOURCEPATH ..\..\..\..\engines\sword1
USERINCLUDE ..\..\..\..\engines
USERINCLUDE ..\..\..\.. ..\..\..\..\gui ..\..\..\..\audio ..\src
-SYSTEMINCLUDE \epoc32\include \epoc32\include\libc ..\src
+
+SYSTEMINCLUDE \epoc32\include\freetype
+SYSTEMINCLUDE \epoc32\include\mpeg2dec
+SYSTEMINCLUDE \epoc32\include\jpeg
+SYSTEMINCLUDE \epoc32\include\png
+SYSTEMINCLUDE \epoc32\include\ESDL
+SYSTEMINCLUDE \epoc32\include\ZLIB // before \epoc32\include because symbian already has older version
+SYSTEMINCLUDE \epoc32\include\libc
+SYSTEMINCLUDE \epoc32\include\theora
+SYSTEMINCLUDE \epoc32\include\tremor
+SYSTEMINCLUDE \epoc32\include
+SYSTEMINCLUDE ..\src // for portdefs.h
diff --git a/backends/platform/symbian/mmp/scummvm_sword2.mmp.in b/backends/platform/symbian/mmp/scummvm_sword2.mmp.in
index 23a055c99c..7b79bf7f5c 100644
--- a/backends/platform/symbian/mmp/scummvm_sword2.mmp.in
+++ b/backends/platform/symbian/mmp/scummvm_sword2.mmp.in
@@ -57,4 +57,15 @@ SOURCEPATH ..\..\..\..\engines\sword2
USERINCLUDE ..\..\..\..\engines
USERINCLUDE ..\..\..\.. ..\..\..\..\gui ..\..\..\..\audio ..\src
-SYSTEMINCLUDE \epoc32\include \epoc32\include\libc ..\src
+
+SYSTEMINCLUDE \epoc32\include\freetype
+SYSTEMINCLUDE \epoc32\include\mpeg2dec
+SYSTEMINCLUDE \epoc32\include\jpeg
+SYSTEMINCLUDE \epoc32\include\png
+SYSTEMINCLUDE \epoc32\include\ESDL
+SYSTEMINCLUDE \epoc32\include\ZLIB // before \epoc32\include because symbian already has older version
+SYSTEMINCLUDE \epoc32\include\libc
+SYSTEMINCLUDE \epoc32\include\theora
+SYSTEMINCLUDE \epoc32\include\tremor
+SYSTEMINCLUDE \epoc32\include
+SYSTEMINCLUDE ..\src // for portdefs.h
diff --git a/backends/platform/symbian/mmp/scummvm_sword25.mmp.in b/backends/platform/symbian/mmp/scummvm_sword25.mmp.in
new file mode 100644
index 0000000000..4159350bce
--- /dev/null
+++ b/backends/platform/symbian/mmp/scummvm_sword25.mmp.in
@@ -0,0 +1,73 @@
+/* ScummVM - Graphic Adventure Engine
+ * Copyright (C) 2003-2005 Andreas 'Sprawl' Karlsson - Original EPOC port, ESDL
+ * Copyright (C) 2003-2005 Lars 'AnotherGuest' Persson - Original EPOC port, Audio System
+ * Copyright (C) 2005 Jurgen 'SumthinWicked' Braam - EPOC/CVS maintainer
+ * Copyright (C) 2005-2013 The ScummVM project
+ * Copyright (C) 2013 Strizniou Fedor
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ */
+
+//
+// EPOC MMP makefile project for ScummVM
+//
+
+// *** Definitions
+
+TARGET scummvm_sword25.lib
+TARGETTYPE lib
+OPTION MSVC /QIfist /Ob1 /Oy /GF // /QIfist disables use of __ftol2 to avoid linker probs with MS libc: http://msdn.microsoft.com/library/default.asp?url=/library/en-us/vccore/html/vcrefQIfistSuppress_ftol.asp
+OPTION GCC -Wno-multichar -Wno-reorder // don't optimize for ARM, platform way too sensitive for that :( just turn off some common warnings
+OPTION GCCE -Wno-multichar -Wno-reorder -Wno-unused -Wno-format -fsigned-char
+ALWAYS_BUILD_AS_ARM
+
+//START_AUTO_MACROS_SLAVE//
+
+ // empty base file, will be updated by Perl build scripts
+
+//STOP_AUTO_MACROS_SLAVE//
+
+// *** SOURCE files
+
+SOURCEPATH ..\..\..\..\engines\sword25
+
+//START_AUTO_OBJECTS_SWORD25_//
+
+ // empty base file, will be updated by Perl build scripts
+
+//STOP_AUTO_OBJECTS_SWORD25_//
+
+// *** Include paths
+
+USERINCLUDE ..\..\..\..\engines
+USERINCLUDE ..\..\..\.. ..\..\..\..\gui ..\..\..\..\audio ..\src
+USERINCLUDE ..\..\..\..\engines\sword25\util\lua ..\..\..\..\engines\sword25\util\pluto
+
+SYSTEMINCLUDE \epoc32\include\freetype
+SYSTEMINCLUDE \epoc32\include\mpeg2dec
+SYSTEMINCLUDE \epoc32\include\jpeg
+SYSTEMINCLUDE \epoc32\include\png
+SYSTEMINCLUDE \epoc32\include\ESDL
+SYSTEMINCLUDE \epoc32\include\ZLIB // before \epoc32\include because symbian already has older version
+SYSTEMINCLUDE \epoc32\include\libc
+SYSTEMINCLUDE \epoc32\include\theora
+SYSTEMINCLUDE \epoc32\include\tremor
+SYSTEMINCLUDE \epoc32\include
+SYSTEMINCLUDE ..\src // for portdefs.h
diff --git a/backends/platform/symbian/mmp/scummvm_teenagent.mmp.in b/backends/platform/symbian/mmp/scummvm_teenagent.mmp.in
index 58bfa4c337..332b9f20ac 100644
--- a/backends/platform/symbian/mmp/scummvm_teenagent.mmp.in
+++ b/backends/platform/symbian/mmp/scummvm_teenagent.mmp.in
@@ -57,5 +57,15 @@ SOURCEPATH ..\..\..\..\engines\teenagent
USERINCLUDE ..\..\..\..\engines
USERINCLUDE ..\..\..\.. ..\..\..\..\gui ..\..\..\..\audio ..\src
+
+SYSTEMINCLUDE \epoc32\include\freetype
+SYSTEMINCLUDE \epoc32\include\mpeg2dec
+SYSTEMINCLUDE \epoc32\include\jpeg
+SYSTEMINCLUDE \epoc32\include\png
+SYSTEMINCLUDE \epoc32\include\ESDL
SYSTEMINCLUDE \epoc32\include\ZLIB // before \epoc32\include because symbian already has older version
-SYSTEMINCLUDE \epoc32\include \epoc32\include\libc ..\src
+SYSTEMINCLUDE \epoc32\include\libc
+SYSTEMINCLUDE \epoc32\include\theora
+SYSTEMINCLUDE \epoc32\include\tremor
+SYSTEMINCLUDE \epoc32\include
+SYSTEMINCLUDE ..\src // for portdefs.h
diff --git a/backends/platform/symbian/mmp/scummvm_testbed.mmp.in b/backends/platform/symbian/mmp/scummvm_testbed.mmp.in
new file mode 100644
index 0000000000..20d3789a31
--- /dev/null
+++ b/backends/platform/symbian/mmp/scummvm_testbed.mmp.in
@@ -0,0 +1,72 @@
+/* ScummVM - Graphic Adventure Engine
+ * Copyright (C) 2003-2005 Andreas 'Sprawl' Karlsson - Original EPOC port, ESDL
+ * Copyright (C) 2003-2005 Lars 'AnotherGuest' Persson - Original EPOC port, Audio System
+ * Copyright (C) 2005 Jurgen 'SumthinWicked' Braam - EPOC/CVS maintainer
+ * Copyright (C) 2005-2013 The ScummVM project
+ * Copyright (C) 2013 Strizniou Fedor
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ */
+
+//
+// EPOC MMP makefile project for ScummVM
+//
+
+// *** Definitions
+
+TARGET scummvm_testbed.lib
+TARGETTYPE lib
+OPTION MSVC /QIfist /Ob1 /Oy /GF // /QIfist disables use of __ftol2 to avoid linker probs with MS libc: http://msdn.microsoft.com/library/default.asp?url=/library/en-us/vccore/html/vcrefQIfistSuppress_ftol.asp
+OPTION GCC -Wno-multichar -Wno-reorder // don't optimize for ARM, platform way too sensitive for that :( just turn off some common warnings
+OPTION GCCE -Wno-multichar -Wno-reorder -Wno-unused -Wno-format -fsigned-char
+ALWAYS_BUILD_AS_ARM
+
+//START_AUTO_MACROS_SLAVE//
+
+ // empty base file, will be updated by Perl build scripts
+
+//STOP_AUTO_MACROS_SLAVE//
+
+// *** SOURCE files
+
+SOURCEPATH ..\..\..\..\engines\testbed
+
+//START_AUTO_OBJECTS_TESTBED_//
+
+ // empty base file, will be updated by Perl build scripts
+
+//STOP_AUTO_OBJECTS_TESTBED_//
+
+// *** Include paths
+
+USERINCLUDE ..\..\..\..\engines
+USERINCLUDE ..\..\..\.. ..\..\..\..\gui ..\..\..\..\audio ..\src
+
+SYSTEMINCLUDE \epoc32\include\freetype
+SYSTEMINCLUDE \epoc32\include\mpeg2dec
+SYSTEMINCLUDE \epoc32\include\jpeg
+SYSTEMINCLUDE \epoc32\include\png
+SYSTEMINCLUDE \epoc32\include\ESDL
+SYSTEMINCLUDE \epoc32\include\ZLIB // before \epoc32\include because symbian already has older version
+SYSTEMINCLUDE \epoc32\include\libc
+SYSTEMINCLUDE \epoc32\include\theora
+SYSTEMINCLUDE \epoc32\include\tremor
+SYSTEMINCLUDE \epoc32\include
+SYSTEMINCLUDE ..\src // for portdefs.h
diff --git a/backends/platform/symbian/mmp/scummvm_tinsel.mmp.in b/backends/platform/symbian/mmp/scummvm_tinsel.mmp.in
index 4cdd0bd774..15c5850cee 100644
--- a/backends/platform/symbian/mmp/scummvm_tinsel.mmp.in
+++ b/backends/platform/symbian/mmp/scummvm_tinsel.mmp.in
@@ -57,4 +57,15 @@ SOURCEPATH ..\..\..\..\engines\tinsel
USERINCLUDE ..\..\..\..\engines
USERINCLUDE ..\..\..\.. ..\..\..\..\gui ..\..\..\..\audio ..\src
-SYSTEMINCLUDE \epoc32\include \epoc32\include\libc ..\src
+
+SYSTEMINCLUDE \epoc32\include\freetype
+SYSTEMINCLUDE \epoc32\include\mpeg2dec
+SYSTEMINCLUDE \epoc32\include\jpeg
+SYSTEMINCLUDE \epoc32\include\png
+SYSTEMINCLUDE \epoc32\include\ESDL
+SYSTEMINCLUDE \epoc32\include\ZLIB // before \epoc32\include because symbian already has older version
+SYSTEMINCLUDE \epoc32\include\libc
+SYSTEMINCLUDE \epoc32\include\theora
+SYSTEMINCLUDE \epoc32\include\tremor
+SYSTEMINCLUDE \epoc32\include
+SYSTEMINCLUDE ..\src // for portdefs.h \ No newline at end of file
diff --git a/backends/platform/symbian/mmp/scummvm_toltecs.mmp.in b/backends/platform/symbian/mmp/scummvm_toltecs.mmp.in
index 9f9d1c1dda..df75290d81 100644
--- a/backends/platform/symbian/mmp/scummvm_toltecs.mmp.in
+++ b/backends/platform/symbian/mmp/scummvm_toltecs.mmp.in
@@ -57,5 +57,15 @@ SOURCEPATH ..\..\..\..\engines\TOLTECS
USERINCLUDE ..\..\..\..\engines
USERINCLUDE ..\..\..\.. ..\..\..\..\gui ..\..\..\..\audio ..\src
+
+SYSTEMINCLUDE \epoc32\include\freetype
+SYSTEMINCLUDE \epoc32\include\mpeg2dec
+SYSTEMINCLUDE \epoc32\include\jpeg
+SYSTEMINCLUDE \epoc32\include\png
+SYSTEMINCLUDE \epoc32\include\ESDL
SYSTEMINCLUDE \epoc32\include\ZLIB // before \epoc32\include because symbian already has older version
-SYSTEMINCLUDE \epoc32\include \epoc32\include\libc ..\src
+SYSTEMINCLUDE \epoc32\include\libc
+SYSTEMINCLUDE \epoc32\include\theora
+SYSTEMINCLUDE \epoc32\include\tremor
+SYSTEMINCLUDE \epoc32\include
+SYSTEMINCLUDE ..\src // for portdefs.h
diff --git a/backends/platform/symbian/mmp/scummvm_tony.mmp.in b/backends/platform/symbian/mmp/scummvm_tony.mmp.in
index d80d82a9c5..bcdbc1c979 100644
--- a/backends/platform/symbian/mmp/scummvm_tony.mmp.in
+++ b/backends/platform/symbian/mmp/scummvm_tony.mmp.in
@@ -57,5 +57,15 @@ SOURCEPATH ..\..\..\..\engines\TONY
USERINCLUDE ..\..\..\..\engines
USERINCLUDE ..\..\..\.. ..\..\..\..\gui ..\..\..\..\audio ..\src
+
+SYSTEMINCLUDE \epoc32\include\freetype
+SYSTEMINCLUDE \epoc32\include\mpeg2dec
+SYSTEMINCLUDE \epoc32\include\jpeg
+SYSTEMINCLUDE \epoc32\include\png
+SYSTEMINCLUDE \epoc32\include\ESDL
SYSTEMINCLUDE \epoc32\include\ZLIB // before \epoc32\include because symbian already has older version
-SYSTEMINCLUDE \epoc32\include \epoc32\include\libc ..\src
+SYSTEMINCLUDE \epoc32\include\libc
+SYSTEMINCLUDE \epoc32\include\theora
+SYSTEMINCLUDE \epoc32\include\tremor
+SYSTEMINCLUDE \epoc32\include
+SYSTEMINCLUDE ..\src // for portdefs.h
diff --git a/backends/platform/symbian/mmp/scummvm_toon.mmp.in b/backends/platform/symbian/mmp/scummvm_toon.mmp.in
index 00f84d2bec..7bfec38dc5 100644
--- a/backends/platform/symbian/mmp/scummvm_toon.mmp.in
+++ b/backends/platform/symbian/mmp/scummvm_toon.mmp.in
@@ -57,5 +57,15 @@ SOURCEPATH ..\..\..\..\engines\toon
USERINCLUDE ..\..\..\..\engines
USERINCLUDE ..\..\..\.. ..\..\..\..\gui ..\..\..\..\audio ..\src
+
+SYSTEMINCLUDE \epoc32\include\freetype
+SYSTEMINCLUDE \epoc32\include\mpeg2dec
+SYSTEMINCLUDE \epoc32\include\jpeg
+SYSTEMINCLUDE \epoc32\include\png
+SYSTEMINCLUDE \epoc32\include\ESDL
SYSTEMINCLUDE \epoc32\include\ZLIB // before \epoc32\include because symbian already has older version
-SYSTEMINCLUDE \epoc32\include \epoc32\include\libc ..\src
+SYSTEMINCLUDE \epoc32\include\libc
+SYSTEMINCLUDE \epoc32\include\theora
+SYSTEMINCLUDE \epoc32\include\tremor
+SYSTEMINCLUDE \epoc32\include
+SYSTEMINCLUDE ..\src // for portdefs.h
diff --git a/backends/platform/symbian/mmp/scummvm_touche.mmp.in b/backends/platform/symbian/mmp/scummvm_touche.mmp.in
index e59dd0cd00..407e275ae3 100644
--- a/backends/platform/symbian/mmp/scummvm_touche.mmp.in
+++ b/backends/platform/symbian/mmp/scummvm_touche.mmp.in
@@ -57,5 +57,15 @@ SOURCEPATH ..\..\..\..\engines\touche
USERINCLUDE ..\..\..\..\engines
USERINCLUDE ..\..\..\.. ..\..\..\..\gui ..\..\..\..\audio ..\src
+
+SYSTEMINCLUDE \epoc32\include\freetype
+SYSTEMINCLUDE \epoc32\include\mpeg2dec
+SYSTEMINCLUDE \epoc32\include\jpeg
+SYSTEMINCLUDE \epoc32\include\png
+SYSTEMINCLUDE \epoc32\include\ESDL
SYSTEMINCLUDE \epoc32\include\ZLIB // before \epoc32\include because symbian already has older version
-SYSTEMINCLUDE \epoc32\include \epoc32\include\libc ..\src
+SYSTEMINCLUDE \epoc32\include\libc
+SYSTEMINCLUDE \epoc32\include\theora
+SYSTEMINCLUDE \epoc32\include\tremor
+SYSTEMINCLUDE \epoc32\include
+SYSTEMINCLUDE ..\src // for portdefs.h
diff --git a/backends/platform/symbian/mmp/scummvm_tsage.mmp.in b/backends/platform/symbian/mmp/scummvm_tsage.mmp.in
index cd4aa158dc..c0705d7aad 100644
--- a/backends/platform/symbian/mmp/scummvm_tsage.mmp.in
+++ b/backends/platform/symbian/mmp/scummvm_tsage.mmp.in
@@ -34,7 +34,8 @@ TARGET scummvm_tsage.lib
TARGETTYPE lib
OPTION MSVC /QIfist /Ob1 /Oy /GF // /QIfist disables use of __ftol2 to avoid linker probs with MS libc: http://msdn.microsoft.com/library/default.asp?url=/library/en-us/vccore/html/vcrefQIfistSuppress_ftol.asp
OPTION GCC -Wno-multichar -Wno-reorder // don't optimize for ARM, platform way too sensitive for that :( just turn off some common warnings
-OPTION GCCE -Wno-multichar -Wno-reorder -Wno-unused -Wno-format -fsigned-char
+// -Wno-psabi turn off "note: the mangling of 'va_list' has changed in GCC 4.4"
+OPTION GCCE -Wno-multichar -Wno-reorder -Wno-unused -Wno-format -fsigned-char -Wno-psabi
ALWAYS_BUILD_AS_ARM
//START_AUTO_MACROS_SLAVE//
@@ -57,5 +58,15 @@ SOURCEPATH ..\..\..\..\engines\tsage
USERINCLUDE ..\..\..\..\engines
USERINCLUDE ..\..\..\.. ..\..\..\..\gui ..\..\..\..\audio ..\src
+
+SYSTEMINCLUDE \epoc32\include\freetype
+SYSTEMINCLUDE \epoc32\include\mpeg2dec
+SYSTEMINCLUDE \epoc32\include\jpeg
+SYSTEMINCLUDE \epoc32\include\png
+SYSTEMINCLUDE \epoc32\include\ESDL
SYSTEMINCLUDE \epoc32\include\ZLIB // before \epoc32\include because symbian already has older version
-SYSTEMINCLUDE \epoc32\include \epoc32\include\libc ..\src
+SYSTEMINCLUDE \epoc32\include\libc
+SYSTEMINCLUDE \epoc32\include\theora
+SYSTEMINCLUDE \epoc32\include\tremor
+SYSTEMINCLUDE \epoc32\include
+SYSTEMINCLUDE ..\src // for portdefs.h
diff --git a/backends/platform/symbian/mmp/scummvm_tucker.mmp.in b/backends/platform/symbian/mmp/scummvm_tucker.mmp.in
index 0ff8eb9920..c457dd4083 100644
--- a/backends/platform/symbian/mmp/scummvm_tucker.mmp.in
+++ b/backends/platform/symbian/mmp/scummvm_tucker.mmp.in
@@ -57,5 +57,15 @@ SOURCEPATH ..\..\..\..\engines\tucker
USERINCLUDE ..\..\..\..\engines
USERINCLUDE ..\..\..\.. ..\..\..\..\gui ..\..\..\..\audio ..\src
+
+SYSTEMINCLUDE \epoc32\include\freetype
+SYSTEMINCLUDE \epoc32\include\mpeg2dec
+SYSTEMINCLUDE \epoc32\include\jpeg
+SYSTEMINCLUDE \epoc32\include\png
+SYSTEMINCLUDE \epoc32\include\ESDL
SYSTEMINCLUDE \epoc32\include\ZLIB // before \epoc32\include because symbian already has older version
-SYSTEMINCLUDE \epoc32\include \epoc32\include\libc ..\src
+SYSTEMINCLUDE \epoc32\include\libc
+SYSTEMINCLUDE \epoc32\include\theora
+SYSTEMINCLUDE \epoc32\include\tremor
+SYSTEMINCLUDE \epoc32\include
+SYSTEMINCLUDE ..\src // for portdefs.h
diff --git a/backends/platform/symbian/mmp/scummvm_voyeur.mmp.in b/backends/platform/symbian/mmp/scummvm_voyeur.mmp.in
new file mode 100644
index 0000000000..86dc32b3f8
--- /dev/null
+++ b/backends/platform/symbian/mmp/scummvm_voyeur.mmp.in
@@ -0,0 +1,71 @@
+/* ScummVM - Graphic Adventure Engine
+ * Copyright (C) 2003-2005 Andreas 'Sprawl' Karlsson - Original EPOC port, ESDL
+ * Copyright (C) 2003-2005 Lars 'AnotherGuest' Persson - Original EPOC port, Audio System
+ * Copyright (C) 2005 Jurgen 'SumthinWicked' Braam - EPOC/CVS maintainer
+ * Copyright (C) 2005-2014 The ScummVM Team
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ */
+
+//
+// EPOC MMP makefile project for ScummVM
+//
+
+// *** Definitions
+
+TARGET scummvm_voyeur.lib
+TARGETTYPE lib
+OPTION MSVC /QIfist /Ob1 /Oy /GF // /QIfist disables use of __ftol2 to avoid linker probs with MS libc: http://msdn.microsoft.com/library/default.asp?url=/library/en-us/vccore/html/vcrefQIfistSuppress_ftol.asp
+OPTION GCC -Wno-multichar -Wno-reorder // don't optimize for ARM, platform way too sensitive for that :( just turn off some common warnings
+OPTION GCCE -Wno-multichar -Wno-reorder -Wno-unused -Wno-format -fsigned-char
+ALWAYS_BUILD_AS_ARM
+
+//START_AUTO_MACROS_SLAVE//
+
+// empty base file, will be updated by Perl build scripts
+
+//STOP_AUTO_MACROS_SLAVE//
+
+// *** SOURCE files
+
+SOURCEPATH ..\..\..\..\engines\voyeur
+
+//START_AUTO_OBJECTS_VOYEUR_//
+
+ // empty base file, will be updated by Perl build scripts
+
+//STOP_AUTO_OBJECTS_VOYEUR_//
+
+// *** Include paths
+
+USERINCLUDE ..\..\..\..\engines
+USERINCLUDE ..\..\..\.. ..\..\..\..\gui ..\..\..\..\audio ..\src
+
+SYSTEMINCLUDE \epoc32\include\freetype
+SYSTEMINCLUDE \epoc32\include\mpeg2dec
+SYSTEMINCLUDE \epoc32\include\jpeg
+SYSTEMINCLUDE \epoc32\include\png
+SYSTEMINCLUDE \epoc32\include\ESDL
+SYSTEMINCLUDE \epoc32\include\ZLIB // before \epoc32\include because symbian already has older version
+SYSTEMINCLUDE \epoc32\include\libc
+SYSTEMINCLUDE \epoc32\include\theora
+SYSTEMINCLUDE \epoc32\include\tremor
+SYSTEMINCLUDE \epoc32\include
+SYSTEMINCLUDE ..\src // for portdefs.h
diff --git a/backends/platform/symbian/mmp/scummvm_wintermute.mmp.in b/backends/platform/symbian/mmp/scummvm_wintermute.mmp.in
index ebe762fe36..63dd7d39d8 100644
--- a/backends/platform/symbian/mmp/scummvm_wintermute.mmp.in
+++ b/backends/platform/symbian/mmp/scummvm_wintermute.mmp.in
@@ -34,7 +34,8 @@ TARGET scummvm_wintermute.lib
TARGETTYPE lib
OPTION MSVC /QIfist /Ob1 /Oy /GF // /QIfist disables use of __ftol2 to avoid linker probs with MS libc: http://msdn.microsoft.com/library/default.asp?url=/library/en-us/vccore/html/vcrefQIfistSuppress_ftol.asp
OPTION GCC -Wno-multichar -Wno-reorder // don't optimize for ARM, platform way too sensitive for that :( just turn off some common warnings
-OPTION GCCE -Wno-multichar -Wno-reorder -Wno-unused -Wno-format -fsigned-char
+// -Wno-psabi turn off "note: the mangling of 'va_list' has changed in GCC 4.4"
+OPTION GCCE -Wno-multichar -Wno-reorder -Wno-unused -Wno-format -fsigned-char -Wno-psabi
ALWAYS_BUILD_AS_ARM
//START_AUTO_MACROS_SLAVE//
@@ -57,5 +58,15 @@ SOURCEPATH ..\..\..\..\engines\wintermute
USERINCLUDE ..\..\..\..\engines
USERINCLUDE ..\..\..\.. ..\..\..\..\gui ..\..\..\..\audio ..\src
+
+SYSTEMINCLUDE \epoc32\include\freetype
+SYSTEMINCLUDE \epoc32\include\mpeg2dec
+SYSTEMINCLUDE \epoc32\include\jpeg
+SYSTEMINCLUDE \epoc32\include\png
+SYSTEMINCLUDE \epoc32\include\ESDL
SYSTEMINCLUDE \epoc32\include\ZLIB // before \epoc32\include because symbian already has older version
-SYSTEMINCLUDE \epoc32\include \epoc32\include\libc ..\src
+SYSTEMINCLUDE \epoc32\include\libc
+SYSTEMINCLUDE \epoc32\include\theora
+SYSTEMINCLUDE \epoc32\include\tremor
+SYSTEMINCLUDE \epoc32\include
+SYSTEMINCLUDE ..\src // for portdefs.h
diff --git a/backends/platform/symbian/mmp/scummvm_zvision.mmp.in b/backends/platform/symbian/mmp/scummvm_zvision.mmp.in
new file mode 100644
index 0000000000..642f659551
--- /dev/null
+++ b/backends/platform/symbian/mmp/scummvm_zvision.mmp.in
@@ -0,0 +1,71 @@
+/* ScummVM - Graphic Adventure Engine
+ * Copyright (C) 2003-2005 Andreas 'Sprawl' Karlsson - Original EPOC port, ESDL
+ * Copyright (C) 2003-2005 Lars 'AnotherGuest' Persson - Original EPOC port, Audio System
+ * Copyright (C) 2005 Jurgen 'SumthinWicked' Braam - EPOC/CVS maintainer
+ * Copyright (C) 2005-2013 The ScummVM project
+ * Copyright (C) 2013 Strizniou Fedor - Epoc project file
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ */
+
+//
+// EPOC MMP makefile project for ScummVM
+//
+
+// *** Definitions
+
+TARGET scummvm_zvision.lib
+TARGETTYPE lib
+OPTION MSVC /QIfist /Ob1 /Oy /GF // /QIfist disables use of __ftol2 to avoid linker probs with MS libc: http://msdn.microsoft.com/library/default.asp?url=/library/en-us/vccore/html/vcrefQIfistSuppress_ftol.asp
+OPTION GCC -Wno-multichar -Wno-reorder // don't optimize for ARM, platform way too sensitive for that :( just turn off some common warnings
+OPTION GCCE -Wno-multichar -Wno-reorder -Wno-unused -Wno-format -fsigned-char
+ALWAYS_BUILD_AS_ARM
+
+//START_AUTO_MACROS_SLAVE//
+
+ // empty base file, will be updated by Perl build scripts
+
+//STOP_AUTO_MACROS_SLAVE//
+
+// *** SOURCE files
+
+SOURCEPATH ..\..\..\..\engines\zvision
+
+//START_AUTO_OBJECTS_ZVISION_//
+
+ // empty base file, will be updated by Perl build scripts
+
+//STOP_AUTO_OBJECTS_ZVISION_//
+
+// *** Include paths
+
+USERINCLUDE ..\..\..\..\engines
+USERINCLUDE ..\..\..\.. ..\..\..\..\gui ..\..\..\..\audio ..\src
+SYSTEMINCLUDE \epoc32\include\freetype
+SYSTEMINCLUDE \epoc32\include\mpeg2dec
+SYSTEMINCLUDE \epoc32\include\jpeg
+SYSTEMINCLUDE \epoc32\include\png
+SYSTEMINCLUDE \epoc32\include\ESDL
+SYSTEMINCLUDE \epoc32\include\ZLIB // before \epoc32\include because symbian already has older version
+SYSTEMINCLUDE \epoc32\include\libc
+SYSTEMINCLUDE \epoc32\include\theora
+SYSTEMINCLUDE \epoc32\include\tremor
+SYSTEMINCLUDE \epoc32\include
+SYSTEMINCLUDE ..\src // for portdefs.h
diff --git a/backends/platform/symbian/res/ScummVmAif.rss b/backends/platform/symbian/res/ScummVmAif.rss
index fab2cadbb8..2dbf436a8f 100644
--- a/backends/platform/symbian/res/ScummVmAif.rss
+++ b/backends/platform/symbian/res/ScummVmAif.rss
@@ -2,7 +2,7 @@
* Copyright (C) 2003-2005 Andreas 'Sprawl' Karlsson - Original EPOC port, ESDL
* Copyright (C) 2003-2005 Lars 'AnotherGuest' Persson - Original EPOC port, Audio System
* Copyright (C) 2005 Jurgen 'SumthinWicked' Braam - EPOC/CVS maintainer
- * Copyright (C) 2005-2013 The ScummVM project
+ * Copyright (C) 2005-2014 The ScummVM Team
*
* ScummVM is the legal property of its developers, whose names
* are too numerous to list here. Please refer to the COPYRIGHT
diff --git a/backends/platform/symbian/res/scummvm.rss b/backends/platform/symbian/res/scummvm.rss
index 7e667f1cf3..6a0ab24ff0 100644
--- a/backends/platform/symbian/res/scummvm.rss
+++ b/backends/platform/symbian/res/scummvm.rss
@@ -2,7 +2,7 @@
* Copyright (C) 2003-2005 Andreas 'Sprawl' Karlsson - Original EPOC port, ESDL
* Copyright (C) 2003-2005 Lars 'AnotherGuest' Persson - Original EPOC port, Audio System
* Copyright (C) 2005 Jurgen 'SumthinWicked' Braam - EPOC/CVS maintainer
- * Copyright (C) 2005-2013 The ScummVM project
+ * Copyright (C) 2005-2014 The ScummVM Team
*
* ScummVM is the legal property of its developers, whose names
* are too numerous to list here. Please refer to the COPYRIGHT
diff --git a/backends/platform/symbian/res/scummvm_A0000658.rss b/backends/platform/symbian/res/scummvm_A0000658.rss
index 3325d72249..562fef54c6 100644
--- a/backends/platform/symbian/res/scummvm_A0000658.rss
+++ b/backends/platform/symbian/res/scummvm_A0000658.rss
@@ -2,7 +2,7 @@
* Copyright (C) 2003-2005 Andreas 'Sprawl' Karlsson - Original EPOC port, ESDL
* Copyright (C) 2003-2005 Lars 'AnotherGuest' Persson - Original EPOC port, Audio System
* Copyright (C) 2005 Jurgen 'SumthinWicked' Braam - EPOC/CVS maintainer
- * Copyright (C) 2005-2013 The ScummVM project
+ * Copyright (C) 2005-2014 The ScummVM Team
*
* ScummVM is the legal property of its developers, whose names
* are too numerous to list here. Please refer to the COPYRIGHT
diff --git a/backends/platform/symbian/src/ScummApp.cpp b/backends/platform/symbian/src/ScummApp.cpp
index b952177f9a..5256c81dcc 100644
--- a/backends/platform/symbian/src/ScummApp.cpp
+++ b/backends/platform/symbian/src/ScummApp.cpp
@@ -17,6 +17,7 @@
* You should have received a copy of the GNU General Public 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/platform/symbian/src/ScummApp.h"
diff --git a/backends/platform/symbian/src/ScummApp.h b/backends/platform/symbian/src/ScummApp.h
index 00d03e6d7b..db643f61b6 100644
--- a/backends/platform/symbian/src/ScummApp.h
+++ b/backends/platform/symbian/src/ScummApp.h
@@ -17,6 +17,7 @@
* You should have received a copy of the GNU General Public 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 SCUMMAPP_H
diff --git a/backends/platform/symbian/src/ScummVm.hrh b/backends/platform/symbian/src/ScummVm.hrh
index c43a9da118..316e4d08f6 100644
--- a/backends/platform/symbian/src/ScummVm.hrh
+++ b/backends/platform/symbian/src/ScummVm.hrh
@@ -2,7 +2,7 @@
* Copyright (C) 2003-2005 Andreas 'Sprawl' Karlsson - Original EPOC port, ESDL
* Copyright (C) 2003-2005 Lars 'AnotherGuest' Persson - Original EPOC port, Audio System
* Copyright (C) 2005 Jurgen 'SumthinWicked' Braam - EPOC/CVS maintainer
- * Copyright (C) 2005-2013 The ScummVM project
+ * Copyright (C) 2005-2014 The ScummVM Team
*
* ScummVM is the legal property of its developers, whose names
* are too numerous to list here. Please refer to the COPYRIGHT
diff --git a/backends/platform/symbian/src/SymbianActions.cpp b/backends/platform/symbian/src/SymbianActions.cpp
index c47bd93772..0810b382d2 100644
--- a/backends/platform/symbian/src/SymbianActions.cpp
+++ b/backends/platform/symbian/src/SymbianActions.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/backends/platform/symbian/src/SymbianActions.h b/backends/platform/symbian/src/SymbianActions.h
index 2b65c6c950..fc68091c74 100644
--- a/backends/platform/symbian/src/SymbianActions.h
+++ b/backends/platform/symbian/src/SymbianActions.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/backends/platform/symbian/src/SymbianMain.cpp b/backends/platform/symbian/src/SymbianMain.cpp
index 8da2b239f4..d7ad26d769 100644
--- a/backends/platform/symbian/src/SymbianMain.cpp
+++ b/backends/platform/symbian/src/SymbianMain.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/backends/platform/symbian/src/SymbianOS.cpp b/backends/platform/symbian/src/SymbianOS.cpp
index b1bd976f9e..1fca7f5df5 100644
--- a/backends/platform/symbian/src/SymbianOS.cpp
+++ b/backends/platform/symbian/src/SymbianOS.cpp
@@ -17,6 +17,7 @@
* You should have received a copy of the GNU General Public 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 <sdlapp.h> // for CSDLApp::GetExecutablePathCStr() @ Symbian::GetExecutablePath()
@@ -197,3 +198,8 @@ void* scumm_bsearch(const void *key, const void *base, size_t nmemb, size_t size
return NULL;
}
+
+int remove(const char *path)
+{
+ return unlink(path);
+}
diff --git a/backends/platform/symbian/src/SymbianOS.h b/backends/platform/symbian/src/SymbianOS.h
index 74a102dc15..57a471f1a9 100644
--- a/backends/platform/symbian/src/SymbianOS.h
+++ b/backends/platform/symbian/src/SymbianOS.h
@@ -17,6 +17,7 @@
* You should have received a copy of the GNU General Public 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_SYMBIAN_H
diff --git a/backends/platform/symbian/src/portdefs.h b/backends/platform/symbian/src/portdefs.h
index 1f9128a54f..1fb941963b 100644
--- a/backends/platform/symbian/src/portdefs.h
+++ b/backends/platform/symbian/src/portdefs.h
@@ -17,6 +17,7 @@
* You should have received a copy of the GNU General Public 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 SYMBIAN_PORTDEFS_H
@@ -60,6 +61,8 @@ typedef signed long int int32;
#define SMALL_SCREEN_DEVICE
#define DISABLE_COMMAND_LINE
+#define USE_RGB_COLOR
+int remove(const char *path);
#if defined(USE_TREMOR) && !defined(USE_VORBIS)
#define USE_VORBIS // make sure this one is defined together with USE_TREMOR!
diff --git a/backends/platform/tizen/application.cpp b/backends/platform/tizen/application.cpp
index a73efacf58..d7832ca1da 100644
--- a/backends/platform/tizen/application.cpp
+++ b/backends/platform/tizen/application.cpp
@@ -11,7 +11,7 @@
*
* This program is distributed in the hope 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
diff --git a/backends/platform/tizen/application.h b/backends/platform/tizen/application.h
index f18ccb175b..c46684eafb 100644
--- a/backends/platform/tizen/application.h
+++ b/backends/platform/tizen/application.h
@@ -11,7 +11,7 @@
*
* This program is distributed in the hope 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
diff --git a/backends/platform/tizen/audio.cpp b/backends/platform/tizen/audio.cpp
index f9ac80a583..b2e061baef 100644
--- a/backends/platform/tizen/audio.cpp
+++ b/backends/platform/tizen/audio.cpp
@@ -11,7 +11,7 @@
*
* This program is distributed in the hope 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
diff --git a/backends/platform/tizen/audio.h b/backends/platform/tizen/audio.h
index a304231578..de4724eb3c 100644
--- a/backends/platform/tizen/audio.h
+++ b/backends/platform/tizen/audio.h
@@ -11,7 +11,7 @@
*
* This program is distributed in the hope 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
diff --git a/backends/platform/tizen/form.cpp b/backends/platform/tizen/form.cpp
index 10d51cc610..3f7b918102 100644
--- a/backends/platform/tizen/form.cpp
+++ b/backends/platform/tizen/form.cpp
@@ -11,7 +11,7 @@
*
* This program is distributed in the hope 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
diff --git a/backends/platform/tizen/form.h b/backends/platform/tizen/form.h
index e419c14d24..3e34b8989e 100644
--- a/backends/platform/tizen/form.h
+++ b/backends/platform/tizen/form.h
@@ -11,7 +11,7 @@
*
* This program is distributed in the hope 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
diff --git a/backends/platform/tizen/fs.cpp b/backends/platform/tizen/fs.cpp
index 8145cd5638..c6cd8f0a71 100644
--- a/backends/platform/tizen/fs.cpp
+++ b/backends/platform/tizen/fs.cpp
@@ -11,12 +11,13 @@
*
* This program is distributed in the hope 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.
+ *
*/
#include "config.h"
diff --git a/backends/platform/tizen/fs.h b/backends/platform/tizen/fs.h
index 0356aaad33..8c1677fa7b 100644
--- a/backends/platform/tizen/fs.h
+++ b/backends/platform/tizen/fs.h
@@ -11,12 +11,13 @@
*
* This program is distributed in the hope 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 TIZEN_FILESYSTEM_H
diff --git a/backends/platform/tizen/graphics.cpp b/backends/platform/tizen/graphics.cpp
index 2cafb9f781..9b23e3fe78 100644
--- a/backends/platform/tizen/graphics.cpp
+++ b/backends/platform/tizen/graphics.cpp
@@ -11,7 +11,7 @@
*
* This program is distributed in the hope 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
@@ -37,13 +37,13 @@ TizenGraphicsManager::TizenGraphicsManager(TizenAppForm *appForm) :
_eglContext(EGL_NO_CONTEXT),
_initState(true) {
assert(appForm != NULL);
- _videoMode.fullscreen = true;
}
TizenGraphicsManager::~TizenGraphicsManager() {
logEntered();
if (_eglDisplay != EGL_NO_DISPLAY) {
+ notifyContextDestroy();
eglMakeCurrent(_eglDisplay, NULL, NULL, NULL);
if (_eglContext != EGL_NO_CONTEXT) {
eglDestroyContext(_eglDisplay, _eglContext);
@@ -51,17 +51,34 @@ TizenGraphicsManager::~TizenGraphicsManager() {
}
}
+result TizenGraphicsManager::Construct() {
+ // Initialize our OpenGL ES context.
+ loadEgl();
+
+ // Notify the OpenGL code about our context.
+
+ // We default to RGB565 and RGBA5551 which is closest to the actual output
+ // mode we setup.
+ notifyContextCreate(Graphics::PixelFormat(2, 5, 6, 5, 0, 11, 5, 0, 0), Graphics::PixelFormat(2, 5, 5, 5, 1, 11, 6, 1, 0));
+
+ // Tell our size.
+ int x, y, width, height;
+ _appForm->GetBounds(x, y, width, height);
+ AppLog("screen size: %dx%d", width, height);
+ setActualScreenSize(width, height);
+ return E_SUCCESS;
+}
+
const Graphics::Font *TizenGraphicsManager::getFontOSD() {
return FontMan.getFontByUsage(Graphics::FontManager::kBigGUIFont);
}
bool TizenGraphicsManager::moveMouse(int16 &x, int16 &y) {
- int16 currentX = _cursorState.x;
- int16 currentY = _cursorState.y;
+ int16 currentX, currentY;
+ getMousePosition(currentX, currentY);
// save the current hardware coordinates
- _cursorState.x = x;
- _cursorState.y = y;
+ setMousePosition(x, y);
// return x/y as game coordinates
adjustMousePosition(x, y);
@@ -85,15 +102,17 @@ Common::List<Graphics::PixelFormat> TizenGraphicsManager::getSupportedFormats()
}
bool TizenGraphicsManager::hasFeature(OSystem::Feature f) {
- bool result = (f == OSystem::kFeatureFullscreenMode ||
- f == OSystem::kFeatureVirtualKeyboard ||
+ bool result =
+ (f == OSystem::kFeatureVirtualKeyboard ||
OpenGLGraphicsManager::hasFeature(f));
return result;
}
void TizenGraphicsManager::setFeatureState(OSystem::Feature f, bool enable) {
- if (f == OSystem::kFeatureVirtualKeyboard && enable) {
- _appForm->showKeypad();
+ if (f == OSystem::kFeatureVirtualKeyboard) {
+ if (enable) {
+ _appForm->showKeypad();
+ }
} else {
OpenGLGraphicsManager::setFeatureState(f, enable);
}
@@ -106,8 +125,9 @@ void TizenGraphicsManager::setReady() {
}
void TizenGraphicsManager::updateScreen() {
- if (_transactionMode == kTransactionNone) {
- internUpdateScreen();
+ if (!_initState) {
+ OpenGLGraphicsManager::updateScreen();
+ eglSwapBuffers(_eglDisplay, _eglSurface);
}
}
@@ -133,10 +153,6 @@ bool TizenGraphicsManager::loadEgl() {
eglBindAPI(EGL_OPENGL_ES_API);
- if (_eglDisplay) {
- unloadGFXMode();
- }
-
_eglDisplay = eglGetDisplay((EGLNativeDisplayType) EGL_DEFAULT_DISPLAY);
if (EGL_NO_DISPLAY == _eglDisplay) {
systemError("eglGetDisplay() failed");
@@ -178,65 +194,12 @@ bool TizenGraphicsManager::loadEgl() {
systemError("eglMakeCurrent() failed");
return false;
}
- if (!_initState) {
- _appForm->GetVisualElement()->SetShowState(true);
- }
logLeaving();
return true;
}
-bool TizenGraphicsManager::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 = 4; // for proportional sized cursor in the launcher
-
- AppLog("screen size: %dx%d", _videoMode.hardwareWidth, _videoMode.hardwareHeight);
- return OpenGLGraphicsManager::loadGFXMode();
-}
-
-void TizenGraphicsManager::loadTextures() {
- logEntered();
- OpenGLGraphicsManager::loadTextures();
-}
-
-void TizenGraphicsManager::internUpdateScreen() {
- if (!_initState) {
- OpenGLGraphicsManager::internUpdateScreen();
- eglSwapBuffers(_eglDisplay, _eglSurface);
- }
-}
-
-void TizenGraphicsManager::unloadGFXMode() {
- logEntered();
- _appForm->GetVisualElement()->SetShowState(false);
-
- if (_eglDisplay != EGL_NO_DISPLAY) {
- 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();
+bool TizenGraphicsManager::loadVideoMode(uint requestedWidth, uint requestedHeight, const Graphics::PixelFormat &format) {
+ // We get this whenever a new resolution is requested. Since Tizen is
+ // using a fixed output size we do nothing like that here.
+ return true;
}
diff --git a/backends/platform/tizen/graphics.h b/backends/platform/tizen/graphics.h
index 27e5a6aaeb..f1d4498650 100644
--- a/backends/platform/tizen/graphics.h
+++ b/backends/platform/tizen/graphics.h
@@ -11,7 +11,7 @@
*
* This program is distributed in the hope 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
@@ -39,28 +39,31 @@ using namespace Tizen::Graphics;
using namespace Tizen::Graphics::Opengl;
using namespace Tizen::App;
-class TizenGraphicsManager : public OpenGLGraphicsManager {
+class TizenGraphicsManager : public OpenGL::OpenGLGraphicsManager {
public:
TizenGraphicsManager(TizenAppForm *appForm);
virtual ~TizenGraphicsManager();
+ result Construct();
+
Common::List<Graphics::PixelFormat> getSupportedFormats() const;
bool hasFeature(OSystem::Feature f);
- void updateScreen();
void setFeatureState(OSystem::Feature f, bool enable);
+ void updateScreen();
+
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();
+protected:
void setInternalMousePosition(int x, int y) {}
- void showSplash();
+ bool loadVideoMode(uint requestedWidth, uint requestedHeight, const Graphics::PixelFormat &format);
+
+ const Graphics::Font *getFontOSD();
+
+private:
bool loadEgl();
TizenAppForm *_appForm;
EGLDisplay _eglDisplay;
diff --git a/backends/platform/tizen/main.cpp b/backends/platform/tizen/main.cpp
index b12cc3adc9..50baa5b977 100644
--- a/backends/platform/tizen/main.cpp
+++ b/backends/platform/tizen/main.cpp
@@ -11,7 +11,7 @@
*
* This program is distributed in the hope 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
diff --git a/backends/platform/tizen/missing.cpp b/backends/platform/tizen/missing.cpp
index 5ac55d0f6c..f24ba5655c 100644
--- a/backends/platform/tizen/missing.cpp
+++ b/backends/platform/tizen/missing.cpp
@@ -11,7 +11,7 @@
*
* This program is distributed in the hope 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
diff --git a/backends/platform/tizen/portdefs.h b/backends/platform/tizen/portdefs.h
index 050ce7d1e0..f5efe85f92 100644
--- a/backends/platform/tizen/portdefs.h
+++ b/backends/platform/tizen/portdefs.h
@@ -11,7 +11,7 @@
*
* This program is distributed in the hope 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
diff --git a/backends/platform/tizen/sscanf.cpp b/backends/platform/tizen/sscanf.cpp
index 75f009cc61..b52389c91c 100644
--- a/backends/platform/tizen/sscanf.cpp
+++ b/backends/platform/tizen/sscanf.cpp
@@ -11,7 +11,7 @@
*
* This program is distributed in the hope 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
diff --git a/backends/platform/tizen/system.cpp b/backends/platform/tizen/system.cpp
index 3448dc1421..a235456670 100644
--- a/backends/platform/tizen/system.cpp
+++ b/backends/platform/tizen/system.cpp
@@ -11,7 +11,7 @@
*
* This program is distributed in the hope 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
@@ -266,8 +266,8 @@ result TizenSystem::initModules() {
return E_OUT_OF_MEMORY;
}
- _graphicsManager = (GraphicsManager *)new TizenGraphicsManager(_appForm);
- if (!_graphicsManager) {
+ _graphicsManager = new TizenGraphicsManager(_appForm);
+ if (!_graphicsManager || getGraphics()->Construct() != E_SUCCESS) {
return E_OUT_OF_MEMORY;
}
diff --git a/backends/platform/tizen/system.h b/backends/platform/tizen/system.h
index b38940cc95..3f668baf34 100644
--- a/backends/platform/tizen/system.h
+++ b/backends/platform/tizen/system.h
@@ -11,7 +11,7 @@
*
* This program is distributed in the hope 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
@@ -73,7 +73,7 @@ public:
bool isClosing() { return _appForm->isClosing(); }
TizenGraphicsManager *getGraphics() {
- return (TizenGraphicsManager *)_graphicsManager;
+ return dynamic_cast<TizenGraphicsManager *>(_graphicsManager);
}
private:
diff --git a/backends/platform/webos/main.cpp b/backends/platform/webos/main.cpp
index 43c7ba18af..70b3fe1674 100644
--- a/backends/platform/webos/main.cpp
+++ b/backends/platform/webos/main.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/backends/platform/webos/webos.cpp b/backends/platform/webos/webos.cpp
index fc18628235..da60b27713 100644
--- a/backends/platform/webos/webos.cpp
+++ b/backends/platform/webos/webos.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/backends/platform/webos/webos.h b/backends/platform/webos/webos.h
index dda56a70da..a2535ddc08 100644
--- a/backends/platform/webos/webos.h
+++ b/backends/platform/webos/webos.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/backends/platform/wii/main.cpp b/backends/platform/wii/main.cpp
index affe053b6a..35d800a527 100644
--- a/backends/platform/wii/main.cpp
+++ b/backends/platform/wii/main.cpp
@@ -8,15 +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.
+ *
*/
#define FORBIDDEN_SYMBOL_EXCEPTION_chdir
@@ -225,7 +226,8 @@ int main(int argc, char *argv[]) {
printf("shutdown\n");
SYS_UnregisterResetFunc(&resetinfo);
- fatUnmountDefault();
+ fatUnmount("usb:/");
+ fatUnmount("sd:/");
if (res)
show_console(res);
diff --git a/backends/platform/wii/options.cpp b/backends/platform/wii/options.cpp
index ede81343ca..731e979ec0 100644
--- a/backends/platform/wii/options.cpp
+++ b/backends/platform/wii/options.cpp
@@ -16,7 +16,7 @@
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*
*/
diff --git a/backends/platform/wii/options.h b/backends/platform/wii/options.h
index 9b500ef29f..1fa4acd50e 100644
--- a/backends/platform/wii/options.h
+++ b/backends/platform/wii/options.h
@@ -16,7 +16,7 @@
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*
*/
diff --git a/backends/platform/wii/osystem.cpp b/backends/platform/wii/osystem.cpp
index 9d3a7473e3..ab2f2c6f0f 100644
--- a/backends/platform/wii/osystem.cpp
+++ b/backends/platform/wii/osystem.cpp
@@ -8,15 +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.
+ *
*/
#define FORBIDDEN_SYMBOL_ALLOW_ALL
diff --git a/backends/platform/wii/osystem.h b/backends/platform/wii/osystem.h
index 287c70ad6b..f1591614bf 100644
--- a/backends/platform/wii/osystem.h
+++ b/backends/platform/wii/osystem.h
@@ -8,15 +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.
+ *
*/
#ifndef _WII_OSYSTEM_H_
diff --git a/backends/platform/wii/osystem_events.cpp b/backends/platform/wii/osystem_events.cpp
index 3ba66aed89..2da1d80917 100644
--- a/backends/platform/wii/osystem_events.cpp
+++ b/backends/platform/wii/osystem_events.cpp
@@ -8,15 +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.
+ *
*/
#define FORBIDDEN_SYMBOL_EXCEPTION_printf
@@ -188,7 +189,7 @@ void OSystem_Wii::initEvents() {
_padAcceleration = 9 - ConfMan.getInt("wii_pad_acceleration");
#ifdef USE_WII_KBD
- _kbd_active = KEYBOARD_Init() >= 0;
+ _kbd_active = KEYBOARD_Init(NULL) >= 0;
#endif
}
diff --git a/backends/platform/wii/osystem_gfx.cpp b/backends/platform/wii/osystem_gfx.cpp
index 92c890b0a9..bb91242f98 100644
--- a/backends/platform/wii/osystem_gfx.cpp
+++ b/backends/platform/wii/osystem_gfx.cpp
@@ -8,15 +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.
+ *
*/
#define FORBIDDEN_SYMBOL_EXCEPTION_printf
@@ -716,8 +717,8 @@ void OSystem_Wii::setMouseCursor(const void *buf, uint w, uint h, int hotspotX,
u16 *d = (u16 *) tmp;
for (u16 y = 0; y < h; ++y) {
for (u16 x = 0; x < w; ++x) {
- if (*s++ != _mouseKeyColor)
- *d++ |= 7 << 12;
+ if (*s++ == _mouseKeyColor)
+ *d++ &= ~(7 << 12);
else
d++;
}
diff --git a/backends/platform/wii/osystem_sfx.cpp b/backends/platform/wii/osystem_sfx.cpp
index 2e658e47aa..70a440a600 100644
--- a/backends/platform/wii/osystem_sfx.cpp
+++ b/backends/platform/wii/osystem_sfx.cpp
@@ -8,15 +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.
+ *
*/
#define FORBIDDEN_SYMBOL_EXCEPTION_printf
diff --git a/backends/platform/wii/wii.mk b/backends/platform/wii/wii.mk
index 7d2db68b4e..99ef46338c 100644
--- a/backends/platform/wii/wii.mk
+++ b/backends/platform/wii/wii.mk
@@ -17,10 +17,10 @@ geckoupload: $(WII_EXE_STRIPPED)
$(DEVKITPPC)/bin/geckoupload $<
wiigdb:
- $(DEVKITPPC)/bin/powerpc-gekko-gdb -n $(EXECUTABLE)
+ $(DEVKITPPC)/bin/powerpc-eabi-gdb -n $(EXECUTABLE)
wiidebug:
- $(DEVKITPPC)/bin/powerpc-gekko-gdb -n $(EXECUTABLE) -x $(srcdir)/backends/platform/wii/gdb.txt
+ $(DEVKITPPC)/bin/powerpc-eabi-gdb -n $(EXECUTABLE) -x $(srcdir)/backends/platform/wii/gdb.txt
# target to create a Wii snapshot
wiidist: all
diff --git a/backends/platform/wince/CEActionsPocket.cpp b/backends/platform/wince/CEActionsPocket.cpp
index 5980a41caa..09286f2e9f 100644
--- a/backends/platform/wince/CEActionsPocket.cpp
+++ b/backends/platform/wince/CEActionsPocket.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -236,7 +236,7 @@ CEActionsPocket::~CEActionsPocket() {
bool CEActionsPocket::perform(GUI::ActionType action, bool pushed) {
static bool keydialogrunning = false, quitdialog = false;
- _graphicsMan = ((WINCESdlGraphicsManager *)((OSystem_SDL *)g_system)->getGraphicsManager());
+ _graphicsMan = dynamic_cast<WINCESdlGraphicsManager *>(((OSystem_SDL *)g_system)->getGraphicsManager());
if (!pushed) {
switch (action) {
diff --git a/backends/platform/wince/CEActionsPocket.h b/backends/platform/wince/CEActionsPocket.h
index e1f52b6b88..f2952c059a 100644
--- a/backends/platform/wince/CEActionsPocket.h
+++ b/backends/platform/wince/CEActionsPocket.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/backends/platform/wince/CEActionsSmartphone.cpp b/backends/platform/wince/CEActionsSmartphone.cpp
index 2cce288323..95957707e3 100644
--- a/backends/platform/wince/CEActionsSmartphone.cpp
+++ b/backends/platform/wince/CEActionsSmartphone.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -202,7 +202,7 @@ CEActionsSmartphone::~CEActionsSmartphone() {
bool CEActionsSmartphone::perform(GUI::ActionType action, bool pushed) {
static bool keydialogrunning = false, quitdialog = false;
- _graphicsMan = ((WINCESdlGraphicsManager *)((OSystem_SDL *)g_system)->getGraphicsManager());
+ _graphicsMan = dynamic_cast<WINCESdlGraphicsManager *>(((OSystem_SDL *)g_system)->getGraphicsManager());
if (!pushed) {
switch (action) {
diff --git a/backends/platform/wince/CEActionsSmartphone.h b/backends/platform/wince/CEActionsSmartphone.h
index 3da46d3923..46529bbd99 100644
--- a/backends/platform/wince/CEActionsSmartphone.h
+++ b/backends/platform/wince/CEActionsSmartphone.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/backends/platform/wince/CEDevice.cpp b/backends/platform/wince/CEDevice.cpp
index 640b1e9169..ffadfeb993 100644
--- a/backends/platform/wince/CEDevice.cpp
+++ b/backends/platform/wince/CEDevice.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/backends/platform/wince/CEDevice.h b/backends/platform/wince/CEDevice.h
index b9f815ac71..2032b7fb27 100644
--- a/backends/platform/wince/CEDevice.h
+++ b/backends/platform/wince/CEDevice.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/backends/platform/wince/CEException.cpp b/backends/platform/wince/CEException.cpp
index 4a03354112..46bb618e39 100644
--- a/backends/platform/wince/CEException.cpp
+++ b/backends/platform/wince/CEException.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/backends/platform/wince/CEException.h b/backends/platform/wince/CEException.h
index 3d4616f282..8ce6bd7dc0 100644
--- a/backends/platform/wince/CEException.h
+++ b/backends/platform/wince/CEException.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/backends/platform/wince/CELauncherDialog.cpp b/backends/platform/wince/CELauncherDialog.cpp
index dd6076e0af..f7795dfdef 100644
--- a/backends/platform/wince/CELauncherDialog.cpp
+++ b/backends/platform/wince/CELauncherDialog.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -65,12 +65,12 @@ public:
};
CELauncherDialog::CELauncherDialog() : GUI::LauncherDialog() {
- ((WINCESdlGraphicsManager *)((OSystem_SDL *)g_system)->getGraphicsManager())->reset_panel();
+ dynamic_cast<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();
+ dynamic_cast<WINCESdlGraphicsManager *>(((OSystem_SDL *)g_system)->getGraphicsManager())->init_panel();
}
LauncherDialog::handleCommand(sender, cmd, data);
if (cmd == 'ABOU') {
diff --git a/backends/platform/wince/CELauncherDialog.h b/backends/platform/wince/CELauncherDialog.h
index ac84cd3e21..9f69b8500f 100644
--- a/backends/platform/wince/CELauncherDialog.h
+++ b/backends/platform/wince/CELauncherDialog.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/backends/platform/wince/CEScaler.cpp b/backends/platform/wince/CEScaler.cpp
index 66f7809a3a..321bdd92a9 100644
--- a/backends/platform/wince/CEScaler.cpp
+++ b/backends/platform/wince/CEScaler.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/backends/platform/wince/CEScaler.h b/backends/platform/wince/CEScaler.h
index de001f7348..fc6540a33c 100644
--- a/backends/platform/wince/CEScaler.h
+++ b/backends/platform/wince/CEScaler.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/backends/platform/wince/CEgui/CEGUI.h b/backends/platform/wince/CEgui/CEGUI.h
index 8b2e3528e3..8b6db6b099 100644
--- a/backends/platform/wince/CEgui/CEGUI.h
+++ b/backends/platform/wince/CEgui/CEGUI.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/backends/platform/wince/CEgui/GUIElement.cpp b/backends/platform/wince/CEgui/GUIElement.cpp
index c8e68b87fd..e33e7f7f9d 100644
--- a/backends/platform/wince/CEgui/GUIElement.cpp
+++ b/backends/platform/wince/CEgui/GUIElement.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/backends/platform/wince/CEgui/GUIElement.h b/backends/platform/wince/CEgui/GUIElement.h
index 44c4b3f275..6695029877 100644
--- a/backends/platform/wince/CEgui/GUIElement.h
+++ b/backends/platform/wince/CEgui/GUIElement.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/backends/platform/wince/CEgui/ItemAction.cpp b/backends/platform/wince/CEgui/ItemAction.cpp
index 7d6316748b..89ca48efdc 100644
--- a/backends/platform/wince/CEgui/ItemAction.cpp
+++ b/backends/platform/wince/CEgui/ItemAction.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/backends/platform/wince/CEgui/ItemAction.h b/backends/platform/wince/CEgui/ItemAction.h
index 7b36eaf11a..8de0046d4c 100644
--- a/backends/platform/wince/CEgui/ItemAction.h
+++ b/backends/platform/wince/CEgui/ItemAction.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/backends/platform/wince/CEgui/ItemSwitch.cpp b/backends/platform/wince/CEgui/ItemSwitch.cpp
index 444826201c..7bb0a23a7b 100644
--- a/backends/platform/wince/CEgui/ItemSwitch.cpp
+++ b/backends/platform/wince/CEgui/ItemSwitch.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/backends/platform/wince/CEgui/ItemSwitch.h b/backends/platform/wince/CEgui/ItemSwitch.h
index 724d31363c..e54b4b1b99 100644
--- a/backends/platform/wince/CEgui/ItemSwitch.h
+++ b/backends/platform/wince/CEgui/ItemSwitch.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/backends/platform/wince/CEgui/Panel.cpp b/backends/platform/wince/CEgui/Panel.cpp
index 0853bae8f2..273d06a054 100644
--- a/backends/platform/wince/CEgui/Panel.cpp
+++ b/backends/platform/wince/CEgui/Panel.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/backends/platform/wince/CEgui/Panel.h b/backends/platform/wince/CEgui/Panel.h
index 514ee5b8af..db38751073 100644
--- a/backends/platform/wince/CEgui/Panel.h
+++ b/backends/platform/wince/CEgui/Panel.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/backends/platform/wince/CEgui/PanelItem.cpp b/backends/platform/wince/CEgui/PanelItem.cpp
index 2849e256fb..186b5161ef 100644
--- a/backends/platform/wince/CEgui/PanelItem.cpp
+++ b/backends/platform/wince/CEgui/PanelItem.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/backends/platform/wince/CEgui/PanelItem.h b/backends/platform/wince/CEgui/PanelItem.h
index 8305311ff2..a0a72c2525 100644
--- a/backends/platform/wince/CEgui/PanelItem.h
+++ b/backends/platform/wince/CEgui/PanelItem.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/backends/platform/wince/CEgui/PanelKeyboard.cpp b/backends/platform/wince/CEgui/PanelKeyboard.cpp
index cab02150c5..34ba8d6473 100644
--- a/backends/platform/wince/CEgui/PanelKeyboard.cpp
+++ b/backends/platform/wince/CEgui/PanelKeyboard.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/backends/platform/wince/CEgui/PanelKeyboard.h b/backends/platform/wince/CEgui/PanelKeyboard.h
index 69d6a89bd2..a0daca81e3 100644
--- a/backends/platform/wince/CEgui/PanelKeyboard.h
+++ b/backends/platform/wince/CEgui/PanelKeyboard.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/backends/platform/wince/CEgui/SDL_ImageResource.cpp b/backends/platform/wince/CEgui/SDL_ImageResource.cpp
index 507f9ad7fe..ec430fc848 100644
--- a/backends/platform/wince/CEgui/SDL_ImageResource.cpp
+++ b/backends/platform/wince/CEgui/SDL_ImageResource.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/backends/platform/wince/CEgui/SDL_ImageResource.h b/backends/platform/wince/CEgui/SDL_ImageResource.h
index 08807a5c1f..4fd7932743 100644
--- a/backends/platform/wince/CEgui/SDL_ImageResource.h
+++ b/backends/platform/wince/CEgui/SDL_ImageResource.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/backends/platform/wince/CEgui/Toolbar.cpp b/backends/platform/wince/CEgui/Toolbar.cpp
index 0e8e82f1f4..9e04a30210 100644
--- a/backends/platform/wince/CEgui/Toolbar.cpp
+++ b/backends/platform/wince/CEgui/Toolbar.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/backends/platform/wince/CEgui/Toolbar.h b/backends/platform/wince/CEgui/Toolbar.h
index c7e62bb3d9..d0ac2cdcb3 100644
--- a/backends/platform/wince/CEgui/Toolbar.h
+++ b/backends/platform/wince/CEgui/Toolbar.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/backends/platform/wince/CEgui/ToolbarHandler.cpp b/backends/platform/wince/CEgui/ToolbarHandler.cpp
index f3e42e11fa..534b338cdb 100644
--- a/backends/platform/wince/CEgui/ToolbarHandler.cpp
+++ b/backends/platform/wince/CEgui/ToolbarHandler.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/backends/platform/wince/CEgui/ToolbarHandler.h b/backends/platform/wince/CEgui/ToolbarHandler.h
index 5709cf3f1a..36f4022bd8 100644
--- a/backends/platform/wince/CEgui/ToolbarHandler.h
+++ b/backends/platform/wince/CEgui/ToolbarHandler.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/backends/platform/wince/CEkeys/CEKeys.h b/backends/platform/wince/CEkeys/CEKeys.h
index cf71b982f3..31f5ba839c 100644
--- a/backends/platform/wince/CEkeys/CEKeys.h
+++ b/backends/platform/wince/CEkeys/CEKeys.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/backends/platform/wince/CEkeys/EventsBuffer.cpp b/backends/platform/wince/CEkeys/EventsBuffer.cpp
index c993798dc8..b4fdc0010d 100644
--- a/backends/platform/wince/CEkeys/EventsBuffer.cpp
+++ b/backends/platform/wince/CEkeys/EventsBuffer.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/backends/platform/wince/CEkeys/EventsBuffer.h b/backends/platform/wince/CEkeys/EventsBuffer.h
index 235a3e7afd..6c1b12cc24 100644
--- a/backends/platform/wince/CEkeys/EventsBuffer.h
+++ b/backends/platform/wince/CEkeys/EventsBuffer.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/backends/platform/wince/missing/missing.cpp b/backends/platform/wince/missing/missing.cpp
index ba35f15bb7..0355f35a69 100644
--- a/backends/platform/wince/missing/missing.cpp
+++ b/backends/platform/wince/missing/missing.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/backends/platform/wince/portdefs.h b/backends/platform/wince/portdefs.h
index 289406c2a4..3304ee0893 100644
--- a/backends/platform/wince/portdefs.h
+++ b/backends/platform/wince/portdefs.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/backends/platform/wince/stub.cpp b/backends/platform/wince/stub.cpp
index 9f42dc76aa..aba3fb973e 100644
--- a/backends/platform/wince/stub.cpp
+++ b/backends/platform/wince/stub.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/backends/platform/wince/wince-sdl.cpp b/backends/platform/wince/wince-sdl.cpp
index 3897731db4..96c9313c5d 100644
--- a/backends/platform/wince/wince-sdl.cpp
+++ b/backends/platform/wince/wince-sdl.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -422,7 +422,7 @@ void OSystem_WINCE3::initBackend() {
if (_graphicsManager == 0)
_graphicsManager = new WINCESdlGraphicsManager(_eventSource);
- ((WINCESdlEventSource *)_eventSource)->init((WINCESdlGraphicsManager *)_graphicsManager);
+ ((WINCESdlEventSource *)_eventSource)->init(dynamic_cast<WINCESdlGraphicsManager *>(_graphicsManager));
// Call parent implementation of this method
OSystem_SDL::initBackend();
@@ -486,15 +486,16 @@ void OSystem_WINCE3::swap_sound_master() {
//WINCESdlGraphicsManager _graphicsManager
- if (((WINCESdlGraphicsManager *)_graphicsManager)->_toolbarHandler.activeName() == NAME_MAIN_PANEL)
- ((WINCESdlGraphicsManager *)_graphicsManager)->_toolbarHandler.forceRedraw(); // redraw sound icon
+ WINCESdlGraphicsManager *graphicsManager = dynamic_cast<WINCESdlGraphicsManager *>(_graphicsManager);
+ if (graphicsManager->_toolbarHandler.activeName() == NAME_MAIN_PANEL)
+ graphicsManager->_toolbarHandler.forceRedraw(); // redraw sound icon
}
void OSystem_WINCE3::engineInit() {
check_mappings(); // called here to initialize virtual keys handling
- ((WINCESdlGraphicsManager *)_graphicsManager)->update_game_settings();
+ dynamic_cast<WINCESdlGraphicsManager *>(_graphicsManager)->update_game_settings();
// finalize mixer init
_mixerManager->init();
}
@@ -563,7 +564,7 @@ void OSystem_WINCE3::setGraphicsModeIntern() {
void OSystem_WINCE3::initSDL() {
// Check if SDL has not been initialized
if (!_initedSDL) {
- uint32 sdlFlags = SDL_INIT_EVENTTHREAD;
+ uint32 sdlFlags = SDL_INIT_EVENTTHREAD | SDL_INIT_VIDEO;
if (ConfMan.hasKey("disable_sdl_parachute"))
sdlFlags |= SDL_INIT_NOPARACHUTE;
@@ -576,9 +577,6 @@ void OSystem_WINCE3::initSDL() {
if (SDL_Init(sdlFlags) == -1)
error("Could not initialize SDL: %s", SDL_GetError());
- // Enable unicode support if possible
- SDL_EnableUNICODE(1);
-
_initedSDL = true;
}
}
diff --git a/backends/platform/wince/wince-sdl.h b/backends/platform/wince/wince-sdl.h
index b4f323c9e2..2d5a02a23d 100644
--- a/backends/platform/wince/wince-sdl.h
+++ b/backends/platform/wince/wince-sdl.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/backends/plugins/ds/ds-provider.cpp b/backends/plugins/ds/ds-provider.cpp
index 21ec157e5f..1c9744518e 100644
--- a/backends/plugins/ds/ds-provider.cpp
+++ b/backends/plugins/ds/ds-provider.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/backends/plugins/ds/ds-provider.h b/backends/plugins/ds/ds-provider.h
index 1d806a03bd..4eae89383b 100644
--- a/backends/plugins/ds/ds-provider.h
+++ b/backends/plugins/ds/ds-provider.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/backends/plugins/dynamic-plugin.h b/backends/plugins/dynamic-plugin.h
index d68321b2a9..5aca44b676 100644
--- a/backends/plugins/dynamic-plugin.h
+++ b/backends/plugins/dynamic-plugin.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/backends/plugins/elf/arm-loader.cpp b/backends/plugins/elf/arm-loader.cpp
index f8deac9c88..3aabf44452 100644
--- a/backends/plugins/elf/arm-loader.cpp
+++ b/backends/plugins/elf/arm-loader.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/backends/plugins/elf/arm-loader.h b/backends/plugins/elf/arm-loader.h
index 598517d2ef..6f7ae2601d 100644
--- a/backends/plugins/elf/arm-loader.h
+++ b/backends/plugins/elf/arm-loader.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/backends/plugins/elf/elf-loader.cpp b/backends/plugins/elf/elf-loader.cpp
index d60ddce57e..5198fa8088 100644
--- a/backends/plugins/elf/elf-loader.cpp
+++ b/backends/plugins/elf/elf-loader.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/backends/plugins/elf/elf-loader.h b/backends/plugins/elf/elf-loader.h
index 58cc7714cf..17ca35482a 100644
--- a/backends/plugins/elf/elf-loader.h
+++ b/backends/plugins/elf/elf-loader.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/backends/plugins/elf/elf-provider.cpp b/backends/plugins/elf/elf-provider.cpp
index f637596d8d..28536eee94 100644
--- a/backends/plugins/elf/elf-provider.cpp
+++ b/backends/plugins/elf/elf-provider.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/backends/plugins/elf/elf-provider.h b/backends/plugins/elf/elf-provider.h
index a966f371f6..1270949f42 100644
--- a/backends/plugins/elf/elf-provider.h
+++ b/backends/plugins/elf/elf-provider.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/backends/plugins/elf/elf32.h b/backends/plugins/elf/elf32.h
index 1ecc68a8f0..9f6f92fe95 100644
--- a/backends/plugins/elf/elf32.h
+++ b/backends/plugins/elf/elf32.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/backends/plugins/elf/memory-manager.cpp b/backends/plugins/elf/memory-manager.cpp
index 47b77a3ec2..5014718ae8 100644
--- a/backends/plugins/elf/memory-manager.cpp
+++ b/backends/plugins/elf/memory-manager.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/backends/plugins/elf/memory-manager.h b/backends/plugins/elf/memory-manager.h
index 032ecb2be5..12373556df 100644
--- a/backends/plugins/elf/memory-manager.h
+++ b/backends/plugins/elf/memory-manager.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/backends/plugins/elf/mips-loader.cpp b/backends/plugins/elf/mips-loader.cpp
index 6c0e688783..47ae00a8ea 100644
--- a/backends/plugins/elf/mips-loader.cpp
+++ b/backends/plugins/elf/mips-loader.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/backends/plugins/elf/mips-loader.h b/backends/plugins/elf/mips-loader.h
index 1103e939ce..44b4468bb5 100644
--- a/backends/plugins/elf/mips-loader.h
+++ b/backends/plugins/elf/mips-loader.h
@@ -9,12 +9,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/backends/plugins/elf/ppc-loader.cpp b/backends/plugins/elf/ppc-loader.cpp
index 4c9290ad5e..dffd95993b 100644
--- a/backends/plugins/elf/ppc-loader.cpp
+++ b/backends/plugins/elf/ppc-loader.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/backends/plugins/elf/ppc-loader.h b/backends/plugins/elf/ppc-loader.h
index 8614476a92..e99c57117c 100644
--- a/backends/plugins/elf/ppc-loader.h
+++ b/backends/plugins/elf/ppc-loader.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/backends/plugins/elf/shorts-segment-manager.cpp b/backends/plugins/elf/shorts-segment-manager.cpp
index 993a538f6c..4fa03cc79c 100644
--- a/backends/plugins/elf/shorts-segment-manager.cpp
+++ b/backends/plugins/elf/shorts-segment-manager.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/backends/plugins/elf/shorts-segment-manager.h b/backends/plugins/elf/shorts-segment-manager.h
index 34e233a2f4..0e9268a769 100644
--- a/backends/plugins/elf/shorts-segment-manager.h
+++ b/backends/plugins/elf/shorts-segment-manager.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/backends/plugins/elf/version.cpp b/backends/plugins/elf/version.cpp
index 9f64870500..ac999e1d7c 100644
--- a/backends/plugins/elf/version.cpp
+++ b/backends/plugins/elf/version.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -23,6 +23,10 @@
#include "backends/plugins/elf/version.h"
#ifdef USE_ELF_LOADER
-const char *gScummVMPluginBuildDate __attribute__((visibility("hidden"))) =
- __DATE__ " " __TIME__ ;
+ #ifdef __PLAYSTATION2__
+ const char *gScummVMPluginBuildDate = "Git Master"; /* ScummVM Git Master */
+ #else
+ const char *gScummVMPluginBuildDate __attribute__((visibility("hidden"))) =
+ __DATE__ " " __TIME__ ;
+ #endif
#endif
diff --git a/backends/plugins/elf/version.h b/backends/plugins/elf/version.h
index 1f6924028b..1e901bc162 100644
--- a/backends/plugins/elf/version.h
+++ b/backends/plugins/elf/version.h
@@ -17,6 +17,7 @@
* You should have received a copy of the GNU General Public 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_PLUGINS_ELF_VERSION_H
diff --git a/backends/plugins/posix/posix-provider.cpp b/backends/plugins/posix/posix-provider.cpp
index a68a792fa4..b484842ea5 100644
--- a/backends/plugins/posix/posix-provider.cpp
+++ b/backends/plugins/posix/posix-provider.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/backends/plugins/posix/posix-provider.h b/backends/plugins/posix/posix-provider.h
index b1186ccf3f..f5fc96eac4 100644
--- a/backends/plugins/posix/posix-provider.h
+++ b/backends/plugins/posix/posix-provider.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/backends/plugins/ps2/ps2-provider.cpp b/backends/plugins/ps2/ps2-provider.cpp
index 50cddb05e0..a4a9877c61 100644
--- a/backends/plugins/ps2/ps2-provider.cpp
+++ b/backends/plugins/ps2/ps2-provider.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/backends/plugins/ps2/ps2-provider.h b/backends/plugins/ps2/ps2-provider.h
index f4498204b4..6c95cc395a 100644
--- a/backends/plugins/ps2/ps2-provider.h
+++ b/backends/plugins/ps2/ps2-provider.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/backends/plugins/psp/psp-provider.cpp b/backends/plugins/psp/psp-provider.cpp
index 1d8cad6b50..217a58e48d 100644
--- a/backends/plugins/psp/psp-provider.cpp
+++ b/backends/plugins/psp/psp-provider.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/backends/plugins/psp/psp-provider.h b/backends/plugins/psp/psp-provider.h
index 4ace3e7f4b..6211ac6f64 100644
--- a/backends/plugins/psp/psp-provider.h
+++ b/backends/plugins/psp/psp-provider.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/backends/plugins/sdl/sdl-provider.cpp b/backends/plugins/sdl/sdl-provider.cpp
index 00520b48b0..5749a2afa2 100644
--- a/backends/plugins/sdl/sdl-provider.cpp
+++ b/backends/plugins/sdl/sdl-provider.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/backends/plugins/sdl/sdl-provider.h b/backends/plugins/sdl/sdl-provider.h
index 881aa5cc19..8b5ae31c17 100644
--- a/backends/plugins/sdl/sdl-provider.h
+++ b/backends/plugins/sdl/sdl-provider.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/backends/plugins/wii/wii-provider.cpp b/backends/plugins/wii/wii-provider.cpp
index f96254eabe..4d7391b44e 100644
--- a/backends/plugins/wii/wii-provider.cpp
+++ b/backends/plugins/wii/wii-provider.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/backends/plugins/wii/wii-provider.h b/backends/plugins/wii/wii-provider.h
index fb847e1024..49eba82e8b 100644
--- a/backends/plugins/wii/wii-provider.h
+++ b/backends/plugins/wii/wii-provider.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/backends/plugins/win32/win32-provider.cpp b/backends/plugins/win32/win32-provider.cpp
index 0a08e48e6f..5f4d405da4 100644
--- a/backends/plugins/win32/win32-provider.cpp
+++ b/backends/plugins/win32/win32-provider.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/backends/plugins/win32/win32-provider.h b/backends/plugins/win32/win32-provider.h
index 42c04e6d59..71e6cf098c 100644
--- a/backends/plugins/win32/win32-provider.h
+++ b/backends/plugins/win32/win32-provider.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/backends/saves/default/default-saves.cpp b/backends/saves/default/default-saves.cpp
index 64e7e778b6..1b955a5021 100644
--- a/backends/saves/default/default-saves.cpp
+++ b/backends/saves/default/default-saves.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/backends/saves/default/default-saves.h b/backends/saves/default/default-saves.h
index c7fca279bc..81f45f96b8 100644
--- a/backends/saves/default/default-saves.h
+++ b/backends/saves/default/default-saves.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/backends/saves/posix/posix-saves.cpp b/backends/saves/posix/posix-saves.cpp
index e04609be5b..96828320a6 100644
--- a/backends/saves/posix/posix-saves.cpp
+++ b/backends/saves/posix/posix-saves.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/backends/saves/posix/posix-saves.h b/backends/saves/posix/posix-saves.h
index 160075d3db..2477bd60e7 100644
--- a/backends/saves/posix/posix-saves.h
+++ b/backends/saves/posix/posix-saves.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/backends/saves/psp/psp-saves.cpp b/backends/saves/psp/psp-saves.cpp
index 65003e9fb9..9d9affbc1b 100644
--- a/backends/saves/psp/psp-saves.cpp
+++ b/backends/saves/psp/psp-saves.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/backends/saves/psp/psp-saves.h b/backends/saves/psp/psp-saves.h
index de2d8a693e..a0e4c38ecf 100644
--- a/backends/saves/psp/psp-saves.h
+++ b/backends/saves/psp/psp-saves.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/backends/saves/recorder/recorder-saves.cpp b/backends/saves/recorder/recorder-saves.cpp
index 49b4672913..e2cdc5c1c2 100644
--- a/backends/saves/recorder/recorder-saves.cpp
+++ b/backends/saves/recorder/recorder-saves.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/backends/saves/recorder/recorder-saves.h b/backends/saves/recorder/recorder-saves.h
index 692aeca329..b5bf02fc83 100644
--- a/backends/saves/recorder/recorder-saves.h
+++ b/backends/saves/recorder/recorder-saves.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/backends/saves/savefile.cpp b/backends/saves/savefile.cpp
index edfdd9bc20..b04c53d832 100644
--- a/backends/saves/savefile.cpp
+++ b/backends/saves/savefile.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/backends/saves/windows/windows-saves.cpp b/backends/saves/windows/windows-saves.cpp
index d520632394..b84ab1312d 100644
--- a/backends/saves/windows/windows-saves.cpp
+++ b/backends/saves/windows/windows-saves.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/backends/saves/windows/windows-saves.h b/backends/saves/windows/windows-saves.h
index a705aa2b7f..d22033273a 100644
--- a/backends/saves/windows/windows-saves.h
+++ b/backends/saves/windows/windows-saves.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/backends/taskbar/macosx/macosx-taskbar.h b/backends/taskbar/macosx/macosx-taskbar.h
new file mode 100644
index 0000000000..5d5b9d02cd
--- /dev/null
+++ b/backends/taskbar/macosx/macosx-taskbar.h
@@ -0,0 +1,57 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ */
+
+#ifndef BACKEND_MACOSX_TASKBAR_H
+#define BACKEND_MACOSX_TASKBAR_H
+
+#if defined(MACOSX) && defined(USE_TASKBAR)
+
+#include "common/str.h"
+#include "common/taskbar.h"
+
+class MacOSXTaskbarManager : public Common::TaskbarManager {
+public:
+ MacOSXTaskbarManager();
+ virtual ~MacOSXTaskbarManager();
+
+ 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 notifyError();
+ virtual void clearError();
+
+private:
+ Common::String getIconPath(const Common::String&);
+
+ void initApplicationIconView();
+ void clearApplicationIconView();
+
+ void initOverlayIconView();
+ void clearOverlayIconView();
+
+ double _progress;
+};
+
+#endif
+
+#endif // BACKEND_MACOSX_TASKBAR_H
diff --git a/backends/taskbar/macosx/macosx-taskbar.mm b/backends/taskbar/macosx/macosx-taskbar.mm
new file mode 100644
index 0000000000..ae087dfb85
--- /dev/null
+++ b/backends/taskbar/macosx/macosx-taskbar.mm
@@ -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.
+ *
+ */
+
+// Disable symbol overrides so that we can use system headers
+#define FORBIDDEN_SYMBOL_ALLOW_ALL
+#include "common/scummsys.h"
+
+#if defined(MACOSX) && defined(USE_TASKBAR)
+
+// NSDockTile was introduced with Mac OS X 10.5.
+// Try provide backward compatibility by avoiding NSDockTile symbols.
+
+// TODO: Implement recent list, maybe as a custom menu on dock tile when app is not running
+// See Dock Tile plug-in at https://developer.apple.com/library/mac/documentation/Carbon/Conceptual/customizing_docktile/CreatingaDockTilePlug-in/CreatingaDockTilePlug-in.html
+
+#include "backends/taskbar/macosx/macosx-taskbar.h"
+#include "common/config-manager.h"
+#include "common/file.h"
+
+#include <AppKit/NSApplication.h>
+#include <AppKit/NSImage.h>
+#include <Foundation/NSString.h>
+#include <AppKit/NSImageView.h>
+#include <AppKit/NSColor.h>
+#include <AppKit/NSBezierPath.h>
+#include <CoreFoundation/CFString.h>
+
+id _dockTile;
+NSImageView *_applicationIconView;
+NSImageView *_overlayIconView;
+
+// Using a NSProgressIndicator as a sub-view of the NSDockTile view does not work properly.
+// The progress indicator is grayed out and display no progress. So instead the bar is drawn
+// manually, which is a bit more work :(
+
+MacOSXTaskbarManager::MacOSXTaskbarManager() : _progress(-1.0) {
+ if ([NSApp respondsToSelector:@selector(dockTile)])
+ _dockTile = [NSApp dockTile];
+ _applicationIconView = nil;
+ _overlayIconView = nil;
+}
+
+MacOSXTaskbarManager::~MacOSXTaskbarManager() {
+ clearApplicationIconView();
+}
+
+void MacOSXTaskbarManager::initApplicationIconView() {
+ if (_dockTile == nil)
+ return;
+ if (_applicationIconView == nil) {
+ _applicationIconView = [[NSImageView alloc] init];
+ [_applicationIconView setImage:[NSApp applicationIconImage]];
+ [_dockTile performSelector:@selector(setContentView:) withObject:_applicationIconView];
+ }
+}
+
+void MacOSXTaskbarManager::clearApplicationIconView() {
+ if (_dockTile == nil)
+ return;
+ [_dockTile performSelector:@selector(setContentView:) withObject:nil];
+ [_applicationIconView release];
+ _applicationIconView = nil;
+}
+
+void MacOSXTaskbarManager::initOverlayIconView() {
+ if (_dockTile == nil)
+ return;
+ if (_overlayIconView == nil) {
+ const double overlaySize = 0.75;
+ initApplicationIconView();
+ NSSize size = [_applicationIconView frame].size;
+ _overlayIconView = [[NSImageView alloc] initWithFrame:NSMakeRect(size.width * (1.0-overlaySize), 0.0f, size.width * overlaySize, size.height * overlaySize)];
+ [_overlayIconView setImageAlignment:NSImageAlignBottomRight];
+ [_applicationIconView addSubview:_overlayIconView];
+ [_overlayIconView release];
+ }
+}
+
+void MacOSXTaskbarManager::clearOverlayIconView() {
+ if (_progress < 0.0)
+ clearApplicationIconView();
+ else
+ [_overlayIconView removeFromSuperview];
+ _overlayIconView = nil;
+}
+
+void MacOSXTaskbarManager::setOverlayIcon(const Common::String &name, const Common::String &description) {
+ if (_dockTile == nil)
+ return;
+
+ if (name.empty()) {
+ clearOverlayIconView();
+ [_dockTile performSelector:@selector(display)];
+ return;
+ }
+
+ Common::String path = getIconPath(name);
+ if (path.empty())
+ return;
+
+ initOverlayIconView();
+
+ CFStringRef imageFile = CFStringCreateWithCString(0, path.c_str(), kCFStringEncodingASCII);
+ NSImage* image = [[NSImage alloc] initWithContentsOfFile:(NSString *)imageFile];
+ [_overlayIconView setImage:image];
+ [image release];
+ CFRelease(imageFile);
+
+ [_dockTile performSelector:@selector(display)];
+}
+
+void MacOSXTaskbarManager::setProgressValue(int completed, int total) {
+ if (_dockTile == nil)
+ return;
+
+ if (total > 0)
+ _progress = (double)completed / (double)total;
+ else if (_progress < 0)
+ _progress = 0.0;
+
+ NSImage *mainIcon = [[NSApp applicationIconImage] copy];
+ double barSize = [mainIcon size].width;
+ double progressSize = barSize * _progress;
+ [mainIcon lockFocus];
+ [[NSColor colorWithDeviceRed:(40.0/255.0) green:(120.0/255.0) blue:(255.0/255.0) alpha:0.78] set];
+ [NSBezierPath fillRect:NSMakeRect(0, 0, progressSize, 11)];
+ [[NSColor colorWithDeviceRed:(241.0/255.0) green:(241.0/255.0) blue:(241.0/255.0) alpha:0.78] set];
+ [NSBezierPath fillRect:NSMakeRect(progressSize, 0, barSize-progressSize, 11)];
+ [mainIcon unlockFocus];
+
+ initApplicationIconView();
+ [_applicationIconView setImage:mainIcon];
+ [mainIcon release];
+
+ [_dockTile performSelector:@selector(display)];
+}
+
+void MacOSXTaskbarManager::setProgressState(TaskbarProgressState state) {
+ if (_dockTile == nil)
+ return;
+
+ // Only support two states: visible and not visible.
+ if (state == kTaskbarNoProgress) {
+ _progress = -1.0;
+ if (_overlayIconView == nil)
+ clearApplicationIconView();
+ else if (_applicationIconView != nil)
+ [_applicationIconView setImage:[NSApp applicationIconImage]];
+ return;
+ }
+
+ setProgressValue(-1, -1);
+}
+
+void MacOSXTaskbarManager::setCount(int count) {
+ if (_dockTile == nil)
+ return;
+
+ if (count > 0)
+ [_dockTile performSelector:@selector(setBadgeLabel:) withObject:[NSString stringWithFormat:@"%d", count]];
+ else
+ [_dockTile performSelector:@selector(setBadgeLabel:) withObject:nil];
+}
+
+void MacOSXTaskbarManager::notifyError() {
+ if (_dockTile == nil)
+ return;
+
+ // NSImageNameCaution was introduced in 10.6.
+ // For compatibility with older systems we should use something else (e.g. overlay label
+ // or our own icon).
+ //initOverlayIconView();
+ //[_overlayIconView setImage:[NSImage imageNamed:NSImageNameCaution]];
+ //[_dockTile performSelector:@selector(display)];
+}
+
+void MacOSXTaskbarManager::clearError() {
+ if (_dockTile == nil)
+ return;
+
+ clearOverlayIconView();
+ [_dockTile performSelector:@selector(display)];
+ return;
+}
+
+Common::String MacOSXTaskbarManager::getIconPath(const Common::String& target) {
+ // We first try to look for a iconspath configuration variable then
+ // fallback to the extra path
+ //
+ // Icons can be either in a subfolder named "icons" or directly in the path
+
+ Common::String iconsPath = ConfMan.get("iconspath");
+ Common::String extraPath = ConfMan.get("extrapath");
+
+#define TRY_ICON_PATH(path) { \
+Common::FSNode node((path)); \
+if (node.exists()) \
+return (path); \
+}
+
+ if (!iconsPath.empty()) {
+ TRY_ICON_PATH(iconsPath + "/" + target + ".png");
+ TRY_ICON_PATH(iconsPath + "/" + ConfMan.get("gameid") + ".png");
+ TRY_ICON_PATH(iconsPath + "/icons/" + target + ".png");
+ TRY_ICON_PATH(iconsPath + "/icons/" + ConfMan.get("gameid") + ".png");
+ }
+
+ if (!extraPath.empty()) {
+ TRY_ICON_PATH(extraPath + "/" + target + ".png");
+ TRY_ICON_PATH(extraPath + "/" + ConfMan.get("gameid") + ".png");
+ TRY_ICON_PATH(extraPath + "/icons/" + target + ".png");
+ TRY_ICON_PATH(extraPath + "/icons/" + ConfMan.get("gameid") + ".png");
+ }
+
+ return "";
+}
+
+
+#endif
diff --git a/backends/taskbar/unity/unity-taskbar.cpp b/backends/taskbar/unity/unity-taskbar.cpp
index f36e2bf628..1b82e58c8a 100644
--- a/backends/taskbar/unity/unity-taskbar.cpp
+++ b/backends/taskbar/unity/unity-taskbar.cpp
@@ -24,7 +24,7 @@
#define FORBIDDEN_SYMBOL_EXCEPTION_time_h
#include "common/scummsys.h"
-#if defined(POSIX) && defined(USE_TASKBAR) && defined(USE_TASKBAR_UNITY)
+#if defined(POSIX) && defined(USE_TASKBAR) && defined(USE_UNITY)
#include "backends/taskbar/unity/unity-taskbar.h"
diff --git a/backends/taskbar/unity/unity-taskbar.h b/backends/taskbar/unity/unity-taskbar.h
index d1d9430bcd..d818ed9ff1 100644
--- a/backends/taskbar/unity/unity-taskbar.h
+++ b/backends/taskbar/unity/unity-taskbar.h
@@ -23,7 +23,7 @@
#ifndef BACKEND_UNITY_TASKBAR_H
#define BACKEND_UNITY_TASKBAR_H
-#if defined(POSIX) && defined(USE_TASKBAR) && defined(USE_TASKBAR_UNITY)
+#if defined(POSIX) && defined(USE_TASKBAR) && defined(USE_UNITY)
#include "common/events.h"
#include "common/str.h"
diff --git a/backends/timer/default/default-timer.cpp b/backends/timer/default/default-timer.cpp
index ce93320f3d..8964d5a7c7 100644
--- a/backends/timer/default/default-timer.cpp
+++ b/backends/timer/default/default-timer.cpp
@@ -17,6 +17,7 @@
* You should have received a copy of the GNU General Public 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"
diff --git a/backends/timer/default/default-timer.h b/backends/timer/default/default-timer.h
index 5884979da0..8b23fb744f 100644
--- a/backends/timer/default/default-timer.h
+++ b/backends/timer/default/default-timer.h
@@ -17,6 +17,7 @@
* You should have received a copy of the GNU General Public 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_TIMER_DEFAULT_H
diff --git a/backends/timer/psp/timer.cpp b/backends/timer/psp/timer.cpp
index 6f8e4b6643..278f50581c 100644
--- a/backends/timer/psp/timer.cpp
+++ b/backends/timer/psp/timer.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/backends/timer/psp/timer.h b/backends/timer/psp/timer.h
index 76eebfd6a4..45b32e0e14 100644
--- a/backends/timer/psp/timer.h
+++ b/backends/timer/psp/timer.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/backends/timer/sdl/sdl-timer.cpp b/backends/timer/sdl/sdl-timer.cpp
index 33596f4bd8..22d4bb985f 100644
--- a/backends/timer/sdl/sdl-timer.cpp
+++ b/backends/timer/sdl/sdl-timer.cpp
@@ -9,12 +9,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/backends/timer/sdl/sdl-timer.h b/backends/timer/sdl/sdl-timer.h
index 069a266e45..278df515cd 100644
--- a/backends/timer/sdl/sdl-timer.h
+++ b/backends/timer/sdl/sdl-timer.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/backends/timer/tizen/timer.cpp b/backends/timer/tizen/timer.cpp
index fa226ce747..dfa558615a 100644
--- a/backends/timer/tizen/timer.cpp
+++ b/backends/timer/tizen/timer.cpp
@@ -11,7 +11,7 @@
*
* This program is distributed in the hope 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
diff --git a/backends/timer/tizen/timer.h b/backends/timer/tizen/timer.h
index 4b2596401a..ff5ea1a35f 100644
--- a/backends/timer/tizen/timer.h
+++ b/backends/timer/tizen/timer.h
@@ -11,7 +11,7 @@
*
* This program is distributed in the hope 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
diff --git a/backends/updates/macosx/macosx-updates.h b/backends/updates/macosx/macosx-updates.h
index 8c9ac1f743..fd2d1f46f5 100644
--- a/backends/updates/macosx/macosx-updates.h
+++ b/backends/updates/macosx/macosx-updates.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/backends/updates/macosx/macosx-updates.mm b/backends/updates/macosx/macosx-updates.mm
index f3b221cabf..a94f1c21fd 100644
--- a/backends/updates/macosx/macosx-updates.mm
+++ b/backends/updates/macosx/macosx-updates.mm
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/backends/vkeybd/virtual-keyboard-gui.cpp b/backends/vkeybd/virtual-keyboard-gui.cpp
index ec4cbf1de2..1d2b8285f5 100644
--- a/backends/vkeybd/virtual-keyboard-gui.cpp
+++ b/backends/vkeybd/virtual-keyboard-gui.cpp
@@ -1,24 +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.
-*
-*/
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public 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"
diff --git a/backends/vkeybd/virtual-keyboard-gui.h b/backends/vkeybd/virtual-keyboard-gui.h
index a2000adea0..c328d1e25d 100644
--- a/backends/vkeybd/virtual-keyboard-gui.h
+++ b/backends/vkeybd/virtual-keyboard-gui.h
@@ -1,24 +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.
-*
-*/
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public 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_VIRTUAL_KEYBOARD_GUI_H
#define COMMON_VIRTUAL_KEYBOARD_GUI_H
diff --git a/backends/vkeybd/virtual-keyboard-parser.cpp b/backends/vkeybd/virtual-keyboard-parser.cpp
index bb8286d1f5..25c0161ae6 100644
--- a/backends/vkeybd/virtual-keyboard-parser.cpp
+++ b/backends/vkeybd/virtual-keyboard-parser.cpp
@@ -34,7 +34,7 @@
#include "common/tokenizer.h"
#include "common/stream.h"
-#include "graphics/decoders/bmp.h"
+#include "image/bmp.h"
namespace Common {
@@ -267,7 +267,7 @@ bool VirtualKeyboardParser::parserCallback_layout(ParserNode *node) {
const Graphics::PixelFormat format = g_system->getOverlayFormat();
{
- Graphics::BitmapDecoder bmp;
+ Image::BitmapDecoder bmp;
if (!bmp.loadStream(*file))
return parserError("Error loading bitmap '" + _mode->bitmapName + "'");
diff --git a/base/commandLine.cpp b/base/commandLine.cpp
index a032f37a25..d883323976 100644
--- a/base/commandLine.cpp
+++ b/base/commandLine.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/base/commandLine.h b/base/commandLine.h
index 2798ab0934..cf04d74c1d 100644
--- a/base/commandLine.h
+++ b/base/commandLine.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/base/main.cpp b/base/main.cpp
index 103d743bbc..7451c007a4 100644
--- a/base/main.cpp
+++ b/base/main.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -134,6 +134,19 @@ static Common::Error runGame(const EnginePlugin *plugin, OSystem &system, const
Common::Error err = Common::kNoError;
Engine *engine = 0;
+#if defined(SDL_BACKEND) && defined(USE_OPENGL) && defined(USE_RGB_COLOR)
+ // HACK: We set up the requested graphics mode setting here to allow the
+ // backend to switch from Surface SDL to OpenGL if necessary. This is
+ // needed because otherwise the g_system->getSupportedFormats might return
+ // bad values.
+ g_system->beginGFXTransaction();
+ g_system->setGraphicsMode(ConfMan.get("gfx_mode").c_str());
+ if (g_system->endGFXTransaction() != OSystem::kTransactionSuccess) {
+ warning("Switching graphics mode to '%s' failed", ConfMan.get("gfx_mode").c_str());
+ return Common::kUnknownError;
+ }
+#endif
+
// Verify that the game path refers to an actual directory
if (!(dir.exists() && dir.isDirectory()))
err = Common::kPathNotDirectory;
@@ -184,7 +197,7 @@ static Common::Error runGame(const EnginePlugin *plugin, OSystem &system, const
//
// Add the game path to the directory search list
- SearchMan.addDirectory(dir.getPath(), dir, 0, 4);
+ engine->initializePath(dir);
// Add extrapath (if any) to the directory search list
if (ConfMan.hasKey("extrapath")) {
@@ -209,7 +222,9 @@ static Common::Error runGame(const EnginePlugin *plugin, OSystem &system, const
Common::StringTokenizer tokenizer(edebuglevels, " ,");
while (!tokenizer.empty()) {
Common::String token = tokenizer.nextToken();
- if (!DebugMan.enableDebugChannel(token))
+ if (token.equalsIgnoreCase("all"))
+ DebugMan.enableAllDebugChannels();
+ else if (!DebugMan.enableDebugChannel(token))
warning(_("Engine does not support debug level '%s'"), token.c_str());
}
diff --git a/base/main.h b/base/main.h
index 3d75931454..431fcfbbed 100644
--- a/base/main.h
+++ b/base/main.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/base/plugins.cpp b/base/plugins.cpp
index b8cd097683..39aaf2f73e 100644
--- a/base/plugins.cpp
+++ b/base/plugins.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -295,7 +295,7 @@ bool PluginManagerUncached::loadPluginFromGameId(const Common::String &gameId) {
if (domain->contains(gameId)) {
Common::String filename = (*domain)[gameId];
- if (loadPluginByFileName(filename)) {
+ if (loadPluginByFileName(filename)) {
return true;
}
}
diff --git a/base/plugins.h b/base/plugins.h
index e0673ce636..6037fc2d71 100644
--- a/base/plugins.h
+++ b/base/plugins.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/base/version.cpp b/base/version.cpp
index c55bd63323..fba3554f67 100644
--- a/base/version.cpp
+++ b/base/version.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -56,9 +56,15 @@
* to properly work in exports (i.e. release tar balls etc.).
*/
const char *gScummVMVersion = SCUMMVM_VERSION;
+#ifdef __PLAYSTATION2__
+const char *gScummVMBuildDate = "Git Master"; /* ScummVM Git Master */
+const char *gScummVMVersionDate = SCUMMVM_VERSION " - PlayStation2";
+const char *gScummVMFullVersion = "ScummVM " SCUMMVM_VERSION " - PlayStation2";
+#else
const char *gScummVMBuildDate = __DATE__ " " __TIME__;
const char *gScummVMVersionDate = SCUMMVM_VERSION " (" __DATE__ " " __TIME__ ")";
const char *gScummVMFullVersion = "ScummVM " SCUMMVM_VERSION " (" __DATE__ " " __TIME__ ")";
+#endif
const char *gScummVMFeatures = ""
#ifdef TAINTED_BUILD
// TAINTED means the build contains engines/subengines not enabled by default
diff --git a/base/version.h b/base/version.h
index a5c25c03f4..2e362b5c72 100644
--- a/base/version.h
+++ b/base/version.h
@@ -17,6 +17,7 @@
* You should have received a copy of the GNU General Public 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 BASE_VERSION_H
diff --git a/common/EventDispatcher.cpp b/common/EventDispatcher.cpp
index e60c1aa7ff..2650d795b7 100644
--- a/common/EventDispatcher.cpp
+++ b/common/EventDispatcher.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/common/EventMapper.cpp b/common/EventMapper.cpp
index 5f6771a71d..30896d7514 100644
--- a/common/EventMapper.cpp
+++ b/common/EventMapper.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -37,11 +37,17 @@ List<Event> DefaultEventMapper::mapEvent(const Event &ev, EventSource *source) {
#ifdef ENABLE_VKEYBD
else if (ev.kbd.keycode == KEYCODE_F7 && ev.kbd.hasFlags(0)) {
mappedEvent.type = EVENT_VIRTUAL_KEYBOARD;
+
+ // Avoid blocking F7 events from engine.
+ addDelayedEvent(100, ev);
}
#endif
#ifdef ENABLE_KEYMAPPER
else if (ev.kbd.keycode == KEYCODE_F8 && ev.kbd.hasFlags(0)) {
mappedEvent.type = EVENT_KEYMAPPER_REMAP;
+
+ // Avoid blocking F8 events from engine.
+ addDelayedEvent(100, ev);
}
#endif
}
diff --git a/common/algorithm.h b/common/algorithm.h
index 7a0eed89ce..6453073ae5 100644
--- a/common/algorithm.h
+++ b/common/algorithm.h
@@ -17,6 +17,7 @@
* You should have received a copy of the GNU General Public 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_ALGORITHM_H
diff --git a/common/archive.cpp b/common/archive.cpp
index 57ebeb2ca6..36d420561f 100644
--- a/common/archive.cpp
+++ b/common/archive.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/common/archive.h b/common/archive.h
index 2f9736f032..9293b937af 100644
--- a/common/archive.h
+++ b/common/archive.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/common/array.h b/common/array.h
index ca89523a0b..f240a9c2f5 100644
--- a/common/array.h
+++ b/common/array.h
@@ -17,6 +17,7 @@
* You should have received a copy of the GNU General Public 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_ARRAY_H
diff --git a/common/bitstream.h b/common/bitstream.h
index c8c8c11fca..b789f2ac8d 100644
--- a/common/bitstream.h
+++ b/common/bitstream.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -52,6 +52,9 @@ public:
/** Skip the specified amount of bits. */
virtual void skip(uint32 n) = 0;
+ /** Skip the bits to closest data value border. */
+ virtual void align() = 0;
+
/** Read a bit from the bit stream. */
virtual uint32 getBit() = 0;
@@ -276,6 +279,12 @@ public:
getBit();
}
+ /** Skip the bits to closest data value border. */
+ void align() {
+ while (_inValue)
+ getBit();
+ }
+
/** Return the stream position in bits. */
uint32 pos() const {
if (_stream->pos() == 0)
diff --git a/common/bufferedstream.h b/common/bufferedstream.h
index 6c859c98fe..bbd25722a8 100644
--- a/common/bufferedstream.h
+++ b/common/bufferedstream.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/common/c++11-compat.h b/common/c++11-compat.h
index 50d79bd79e..14e0642821 100644
--- a/common/c++11-compat.h
+++ b/common/c++11-compat.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -31,7 +31,9 @@
// Custom nullptr replacement. This is not type safe as the real C++11 nullptr
// though.
//
+#if !defined(nullptr) // XCode 5.0.1 has __cplusplus=199711 but defines this
#define nullptr 0
+#endif
//
// Replacement for the override keyword. This allows compilation of code
diff --git a/common/config-manager.cpp b/common/config-manager.cpp
index aaa812bc94..feb3ddcf56 100644
--- a/common/config-manager.cpp
+++ b/common/config-manager.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/common/config-manager.h b/common/config-manager.h
index 6bf56749c5..14f911f69d 100644
--- a/common/config-manager.h
+++ b/common/config-manager.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/common/coroutines.cpp b/common/coroutines.cpp
index 849b881177..248777febd 100644
--- a/common/coroutines.cpp
+++ b/common/coroutines.cpp
@@ -17,6 +17,7 @@
* You should have received a copy of the GNU General Public 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/coroutines.h"
diff --git a/common/coroutines.h b/common/coroutines.h
index 30b9bb6a99..4fef1a0d4e 100644
--- a/common/coroutines.h
+++ b/common/coroutines.h
@@ -17,6 +17,7 @@
* You should have received a copy of the GNU General Public 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_COROUTINES_H
diff --git a/common/cosinetables.cpp b/common/cosinetables.cpp
index 3b245750fa..4bee1f24ea 100644
--- a/common/cosinetables.cpp
+++ b/common/cosinetables.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/common/cosinetables.h b/common/cosinetables.h
index f5c95ec003..0ff01e40d6 100644
--- a/common/cosinetables.h
+++ b/common/cosinetables.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/common/dcl.cpp b/common/dcl.cpp
index 87ec0ad915..bb4e283de5 100644
--- a/common/dcl.cpp
+++ b/common/dcl.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/common/dcl.h b/common/dcl.h
index 78ffa631ed..0e96f74c07 100644
--- a/common/dcl.h
+++ b/common/dcl.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/common/dct.cpp b/common/dct.cpp
index 38b4fbcff2..27e0c0bf41 100644
--- a/common/dct.cpp
+++ b/common/dct.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -73,7 +73,7 @@ void DCT::calc(float *data) {
void DCT::calcDCTI(float *data) {
int n = 1 << _bits;
- float next = -0.5 * (data[0] - data[n]);
+ float next = -0.5f * (data[0] - data[n]);
for (int i = 0; i < (n / 2); i++) {
float tmp1 = data[i ];
@@ -87,7 +87,7 @@ void DCT::calcDCTI(float *data) {
next += c;
- tmp1 = (tmp1 + tmp2) * 0.5;
+ tmp1 = (tmp1 + tmp2) * 0.5f;
data[i ] = tmp1 - s;
data[n - i] = tmp1 + s;
@@ -113,7 +113,7 @@ void DCT::calcDCTII(float *data) {
s *= tmp1 - tmp2;
- tmp1 = (tmp1 + tmp2) * 0.5;
+ tmp1 = (tmp1 + tmp2) * 0.5f;
data[i ] = tmp1 + s;
data[n - i - 1] = tmp1 - s;
@@ -121,7 +121,7 @@ void DCT::calcDCTII(float *data) {
_rdft->calc(data);
- float next = data[1] * 0.5;
+ float next = data[1] * 0.5f;
data[1] *= -1;
@@ -143,7 +143,7 @@ void DCT::calcDCTIII(float *data) {
int n = 1 << _bits;
float next = data[n - 1];
- float inv_n = 1.0 / n;
+ float inv_n = 1.0f / n;
for (int i = n - 2; i >= 2; i -= 2) {
float val1 = data[i ];
@@ -184,7 +184,7 @@ void DCT::calcDSTI(float *data) {
float s = SIN(n, 2 * i);
s *= tmp1 + tmp2;
- tmp1 = (tmp1 - tmp2) * 0.5;
+ tmp1 = (tmp1 - tmp2) * 0.5f;
data[i ] = s + tmp1;
data[n - i] = s - tmp1;
@@ -194,7 +194,7 @@ void DCT::calcDSTI(float *data) {
_rdft->calc(data);
- data[0] *= 0.5;
+ data[0] *= 0.5f;
for (int i = 1; i < (n - 2); i += 2) {
data[i + 1] += data[i - 1];
diff --git a/common/dct.h b/common/dct.h
index 085423ddff..882856a8a9 100644
--- a/common/dct.h
+++ b/common/dct.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/common/debug-channels.h b/common/debug-channels.h
index 40d1ea667e..1414a1053a 100644
--- a/common/debug-channels.h
+++ b/common/debug-channels.h
@@ -17,6 +17,7 @@
* You should have received a copy of the GNU General Public 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_DEBUG_CHANNELS_H
@@ -94,8 +95,6 @@ public:
*/
bool disableDebugChannel(const String &name);
-
-
typedef List<DebugChannel> DebugChannelList;
/**
@@ -105,6 +104,15 @@ public:
*/
DebugChannelList listDebugChannels();
+ /**
+ * Enable all debug channels.
+ */
+ void enableAllDebugChannels();
+
+ /**
+ * Disable all debug channels.
+ */
+ void disableAllDebugChannels();
/**
* Test whether the given debug channel is enabled.
diff --git a/common/debug.cpp b/common/debug.cpp
index ba5479c34d..182b28afdf 100644
--- a/common/debug.cpp
+++ b/common/debug.cpp
@@ -17,6 +17,7 @@
* You should have received a copy of the GNU General Public 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/debug.h"
@@ -45,6 +46,11 @@ struct DebugLevelComperator {
} // end of anonymous namespace
bool DebugManager::addDebugChannel(uint32 channel, const String &name, const String &description) {
+ if (name.equalsIgnoreCase("all")) {
+ warning("Debug channel 'all' is reserved for internal use");
+ return false;
+ }
+
if (gDebugChannels.contains(name))
warning("Duplicate declaration of engine debug channel '%s'", name.c_str());
@@ -84,7 +90,6 @@ bool DebugManager::disableDebugChannel(const String &name) {
}
}
-
DebugManager::DebugChannelList DebugManager::listDebugChannels() {
DebugChannelList tmp;
for (DebugChannelMap::iterator i = gDebugChannels.begin(); i != gDebugChannels.end(); ++i)
@@ -94,6 +99,16 @@ DebugManager::DebugChannelList DebugManager::listDebugChannels() {
return tmp;
}
+void DebugManager::enableAllDebugChannels() {
+ for (DebugChannelMap::iterator i = gDebugChannels.begin(); i != gDebugChannels.end(); ++i)
+ enableDebugChannel(i->_value.name);
+}
+
+void DebugManager::disableAllDebugChannels() {
+ for (DebugChannelMap::iterator i = gDebugChannels.begin(); i != gDebugChannels.end(); ++i)
+ disableDebugChannel(i->_value.name);
+}
+
bool DebugManager::isDebugChannelEnabled(uint32 channel) {
// Debug level 11 turns on all special debug level messages
if (gDebugLevel == 11)
diff --git a/common/debug.h b/common/debug.h
index 859f3c41b3..b6e0679a12 100644
--- a/common/debug.h
+++ b/common/debug.h
@@ -17,6 +17,7 @@
* You should have received a copy of the GNU General Public 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_DEBUG_H
diff --git a/common/endian.h b/common/endian.h
index 759513efef..529e7f5ac0 100644
--- a/common/endian.h
+++ b/common/endian.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/common/error.cpp b/common/error.cpp
index 78178f8e27..53cd8cec55 100644
--- a/common/error.cpp
+++ b/common/error.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/common/error.h b/common/error.h
index 7043862eea..3e0a7b556f 100644
--- a/common/error.h
+++ b/common/error.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/common/events.h b/common/events.h
index 9029a4096a..488d586b3f 100644
--- a/common/events.h
+++ b/common/events.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/common/fft.cpp b/common/fft.cpp
index a9c58ead9b..ac7386083f 100644
--- a/common/fft.cpp
+++ b/common/fft.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/common/fft.h b/common/fft.h
index ef5f6e95ad..6eb72c3f84 100644
--- a/common/fft.h
+++ b/common/fft.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/common/file.cpp b/common/file.cpp
index 7ad6bc2e81..16e6a0df1a 100644
--- a/common/file.cpp
+++ b/common/file.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/common/file.h b/common/file.h
index b6319dfc3c..29f12b255d 100644
--- a/common/file.h
+++ b/common/file.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/common/forbidden.h b/common/forbidden.h
index 9050114442..d6fd9c42fe 100644
--- a/common/forbidden.h
+++ b/common/forbidden.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/common/frac.h b/common/frac.h
index d402878825..d71d31645b 100644
--- a/common/frac.h
+++ b/common/frac.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/common/fs.cpp b/common/fs.cpp
index 19a01074ea..3a7026b1cc 100644
--- a/common/fs.cpp
+++ b/common/fs.cpp
@@ -17,6 +17,7 @@
* You should have received a copy of the GNU General Public 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/system.h"
diff --git a/common/fs.h b/common/fs.h
index fadd672bb1..b5b88ba8cb 100644
--- a/common/fs.h
+++ b/common/fs.h
@@ -17,6 +17,7 @@
* You should have received a copy of the GNU General Public 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_FS_H
diff --git a/common/func.h b/common/func.h
index a4a80e5406..b58474b2f3 100644
--- a/common/func.h
+++ b/common/func.h
@@ -17,6 +17,7 @@
* You should have received a copy of the GNU General Public 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_FUNC_H
diff --git a/common/gui_options.cpp b/common/gui_options.cpp
index e463232276..d79bf1b82f 100644
--- a/common/gui_options.cpp
+++ b/common/gui_options.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/common/gui_options.h b/common/gui_options.h
index 447fff43ed..78e9cc7199 100644
--- a/common/gui_options.h
+++ b/common/gui_options.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/common/hash-str.h b/common/hash-str.h
index 190e6922eb..82af6cca93 100644
--- a/common/hash-str.h
+++ b/common/hash-str.h
@@ -17,6 +17,7 @@
* You should have received a copy of the GNU General Public 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_HASH_STR_H
diff --git a/common/hashmap.cpp b/common/hashmap.cpp
index e505d1dd25..99840993ce 100644
--- a/common/hashmap.cpp
+++ b/common/hashmap.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/common/hashmap.h b/common/hashmap.h
index 42509d67e5..d7ba100571 100644
--- a/common/hashmap.h
+++ b/common/hashmap.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/common/huffman.cpp b/common/huffman.cpp
index a8ebe4142a..afb4fa00b6 100644
--- a/common/huffman.cpp
+++ b/common/huffman.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/common/huffman.h b/common/huffman.h
index 3b23340b2e..5ba7deca87 100644
--- a/common/huffman.h
+++ b/common/huffman.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/common/iff_container.cpp b/common/iff_container.cpp
index 9c6e5f124a..1eee7ad71e 100644
--- a/common/iff_container.cpp
+++ b/common/iff_container.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/common/iff_container.h b/common/iff_container.h
index a730930b2c..e684f253b2 100644
--- a/common/iff_container.h
+++ b/common/iff_container.h
@@ -17,6 +17,7 @@
* You should have received a copy of the GNU General Public 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_IFF_CONTAINER_H
diff --git a/common/ini-file.cpp b/common/ini-file.cpp
index be5247dcfb..7fa17da76c 100644
--- a/common/ini-file.cpp
+++ b/common/ini-file.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -53,7 +53,7 @@ bool INIFile::loadFromFile(const String &filename) {
return false;
}
-bool INIFile::loadFromSaveFile(const char *filename) {
+bool INIFile::loadFromSaveFile(const String &filename) {
assert(g_system);
SaveFileManager *saveFileMan = g_system->getSavefileManager();
SeekableReadStream *loadFile;
@@ -181,7 +181,7 @@ bool INIFile::saveToFile(const String &filename) {
return false;
}
-bool INIFile::saveToSaveFile(const char *filename) {
+bool INIFile::saveToSaveFile(const String &filename) {
assert(g_system);
SaveFileManager *saveFileMan = g_system->getSavefileManager();
WriteStream *saveFile;
diff --git a/common/ini-file.h b/common/ini-file.h
index 1d94ce7bdc..f27a8b9425 100644
--- a/common/ini-file.h
+++ b/common/ini-file.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -94,10 +94,10 @@ public:
void clear();
bool loadFromFile(const String &filename);
- bool loadFromSaveFile(const char *filename);
+ bool loadFromSaveFile(const String &filename);
bool loadFromStream(SeekableReadStream &stream);
bool saveToFile(const String &filename);
- bool saveToSaveFile(const char *filename);
+ bool saveToSaveFile(const String &filename);
bool saveToStream(WriteStream &stream);
bool hasSection(const String &section) const;
diff --git a/common/installshield_cab.cpp b/common/installshield_cab.cpp
index e25d14741a..e9e8586185 100644
--- a/common/installshield_cab.cpp
+++ b/common/installshield_cab.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/common/installshield_cab.h b/common/installshield_cab.h
index 7c4f294578..d3c584815e 100644
--- a/common/installshield_cab.h
+++ b/common/installshield_cab.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/common/keyboard.h b/common/keyboard.h
index 3262a15c3f..e6e1f5948b 100644
--- a/common/keyboard.h
+++ b/common/keyboard.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/common/language.cpp b/common/language.cpp
index 898adf8d0e..97c515b45a 100644
--- a/common/language.cpp
+++ b/common/language.cpp
@@ -17,6 +17,7 @@
* You should have received a copy of the GNU General Public 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/language.h"
@@ -28,6 +29,7 @@ namespace Common {
const LanguageDescription g_languages[] = {
{ "zh-cn", "zh_CN", "Chinese (China)", ZH_CNA },
{ "zh", "zh_TW", "Chinese (Taiwan)", ZH_TWN },
+ { "hr", "hr_HR", "Croatian", HR_HRV },
{ "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)
@@ -38,11 +40,11 @@ const LanguageDescription g_languages[] = {
{ "gr", "el_GR", "Greek", GR_GRE },
{ "he", "he_IL", "Hebrew", HE_ISR },
{ "hb", "he_IL", "Hebrew", HE_ISR }, // Deprecated
- { "hr", "hr_HR", "Croatian", HR_HRV },
{ "hu", "hu_HU", "Hungarian", HU_HUN },
{ "it", "it_IT", "Italian", IT_ITA },
{ "jp", "ja_JP", "Japanese", JA_JPN },
{ "kr", "ko_KR", "Korean", KO_KOR },
+ { "lv", "lv_LV", "Latvian", LV_LAT },
{ "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 },
diff --git a/common/language.h b/common/language.h
index 03b9ebaf8e..ac3c7267ab 100644
--- a/common/language.h
+++ b/common/language.h
@@ -17,6 +17,7 @@
* You should have received a copy of the GNU General Public 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_LANGUAGE_H
@@ -34,6 +35,7 @@ class String;
enum Language {
ZH_CNA,
ZH_TWN,
+ HR_HRV,
CZ_CZE,
NL_NLD,
EN_ANY, // Generic English (when only one game version exist)
@@ -43,11 +45,11 @@ enum Language {
DE_DEU,
GR_GRE,
HE_ISR,
- HR_HRV,
HU_HUN,
IT_ITA,
JA_JPN,
KO_KOR,
+ LV_LAT,
NB_NOR,
PL_POL,
PT_BRA,
diff --git a/common/list.h b/common/list.h
index 9792042239..1bb4a2a5df 100644
--- a/common/list.h
+++ b/common/list.h
@@ -17,6 +17,7 @@
* You should have received a copy of the GNU General Public 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_LIST_H
diff --git a/common/list_intern.h b/common/list_intern.h
index fef32fbe1e..b4f347561b 100644
--- a/common/list_intern.h
+++ b/common/list_intern.h
@@ -17,6 +17,7 @@
* You should have received a copy of the GNU General Public 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_LIST_INTERN_H
diff --git a/common/localization.cpp b/common/localization.cpp
index afd31b8d22..d08583d955 100644
--- a/common/localization.cpp
+++ b/common/localization.cpp
@@ -17,6 +17,7 @@
* You should have received a copy of the GNU General Public 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"
diff --git a/common/localization.h b/common/localization.h
index e908485b99..096c5e95f5 100644
--- a/common/localization.h
+++ b/common/localization.h
@@ -17,6 +17,7 @@
* You should have received a copy of the GNU General Public 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
diff --git a/common/macresman.cpp b/common/macresman.cpp
index ba44caafd9..d83bde8fd8 100644
--- a/common/macresman.cpp
+++ b/common/macresman.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/common/macresman.h b/common/macresman.h
index cca6592f21..373545795e 100644
--- a/common/macresman.h
+++ b/common/macresman.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/common/math.h b/common/math.h
index ba137101e4..f91f7a2eec 100644
--- a/common/math.h
+++ b/common/math.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -108,11 +108,11 @@ inline int intLog2(uint32 v) {
#endif
inline float rad2deg(float rad) {
- return rad * 180.0 / M_PI;
+ return rad * 180.0f / (float)M_PI;
}
inline float deg2rad(float deg) {
- return deg * M_PI / 180.0;
+ return deg * (float)M_PI / 180.0f;
}
} // End of namespace Common
diff --git a/common/md5.cpp b/common/md5.cpp
index 52fe8b8f8d..6a6eeaf048 100644
--- a/common/md5.cpp
+++ b/common/md5.cpp
@@ -17,6 +17,7 @@
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
*/
/*
diff --git a/common/md5.h b/common/md5.h
index d1be8c8e39..640326efe7 100644
--- a/common/md5.h
+++ b/common/md5.h
@@ -17,6 +17,7 @@
* You should have received a copy of the GNU General Public 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_MD5_H
diff --git a/common/memory.h b/common/memory.h
index 0e5a97c20b..c32af42ba5 100644
--- a/common/memory.h
+++ b/common/memory.h
@@ -17,6 +17,7 @@
* You should have received a copy of the GNU General Public 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_MEMORY_H
diff --git a/common/memorypool.cpp b/common/memorypool.cpp
index e3742eeae0..1a9bfe2e29 100644
--- a/common/memorypool.cpp
+++ b/common/memorypool.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/common/memorypool.h b/common/memorypool.h
index 1cd725b99d..b84012232c 100644
--- a/common/memorypool.h
+++ b/common/memorypool.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/common/memstream.h b/common/memstream.h
index 7fa6500753..5ecc553454 100644
--- a/common/memstream.h
+++ b/common/memstream.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/common/module.mk b/common/module.mk
index 1b34d151d0..67c498df00 100644
--- a/common/module.mk
+++ b/common/module.mk
@@ -35,6 +35,7 @@ MODULE_OBJS := \
translation.o \
unarj.o \
unzip.o \
+ ustr.o \
util.o \
winexe.o \
winexe_ne.o \
diff --git a/common/mutex.cpp b/common/mutex.cpp
index f912e79591..a7b34eb334 100644
--- a/common/mutex.cpp
+++ b/common/mutex.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/common/mutex.h b/common/mutex.h
index 26f69a3996..6e467cfddf 100644
--- a/common/mutex.h
+++ b/common/mutex.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/common/noncopyable.h b/common/noncopyable.h
index 0cbe41388a..24021f42a6 100644
--- a/common/noncopyable.h
+++ b/common/noncopyable.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/common/pack-end.h b/common/pack-end.h
index 04633b7635..5fed5e577b 100644
--- a/common/pack-end.h
+++ b/common/pack-end.h
@@ -17,6 +17,7 @@
* You should have received a copy of the GNU General Public 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(SCUMMVM_USE_PRAGMA_PACK)
diff --git a/common/pack-start.h b/common/pack-start.h
index 631a6529d3..cfb8968a57 100644
--- a/common/pack-start.h
+++ b/common/pack-start.h
@@ -17,6 +17,7 @@
* You should have received a copy of the GNU General Public 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(SCUMMVM_USE_PRAGMA_PACK)
diff --git a/common/platform.cpp b/common/platform.cpp
index 20ed970385..636c1ddb52 100644
--- a/common/platform.cpp
+++ b/common/platform.cpp
@@ -17,6 +17,7 @@
* You should have received a copy of the GNU General Public 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/platform.h"
diff --git a/common/platform.h b/common/platform.h
index ac8772fa94..17a332b851 100644
--- a/common/platform.h
+++ b/common/platform.h
@@ -17,6 +17,7 @@
* You should have received a copy of the GNU General Public 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_PLATFORM_H
diff --git a/common/ptr.h b/common/ptr.h
index f734ec133f..ebdd77cf3c 100644
--- a/common/ptr.h
+++ b/common/ptr.h
@@ -17,6 +17,7 @@
* You should have received a copy of the GNU General Public 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_PTR_H
diff --git a/common/queue.h b/common/queue.h
index 3a2d6aad4b..ee14d5b364 100644
--- a/common/queue.h
+++ b/common/queue.h
@@ -17,6 +17,7 @@
* You should have received a copy of the GNU General Public 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_QUEUE_H
diff --git a/common/quicktime.cpp b/common/quicktime.cpp
index a3efc2b443..76880e1016 100644
--- a/common/quicktime.cpp
+++ b/common/quicktime.cpp
@@ -368,9 +368,6 @@ int QuickTimeParser::readMVHD(Atom atom) {
int QuickTimeParser::readTRAK(Atom atom) {
Track *track = new Track();
- if (!track)
- return -1;
-
track->codecType = CODEC_TYPE_MOV_OTHER;
track->startTime = 0; // XXX: check
_tracks.push_back(track);
@@ -532,7 +529,7 @@ int QuickTimeParser::readSTSD(Atom atom) {
_fd->readByte(); _fd->readByte(); _fd->readByte(); // flags
uint32 entryCount = _fd->readUint32BE();
- track->sampleDescs.resize(entryCount);
+ track->sampleDescs.reserve(entryCount);
for (uint32 i = 0; i < entryCount; i++) { // Parsing Sample description table
Atom a = { 0, 0, 0 };
@@ -544,7 +541,7 @@ int QuickTimeParser::readSTSD(Atom atom) {
_fd->readUint16BE(); // reserved
_fd->readUint16BE(); // index
- track->sampleDescs[i] = readSampleDesc(track, format, size - 16);
+ track->sampleDescs.push_back(readSampleDesc(track, format, size - 16));
debug(0, "size=%d 4CC= %s codec_type=%d", size, tag2str(format), track->codecType);
@@ -695,8 +692,14 @@ int QuickTimeParser::readWAVE(Atom atom) {
if (atom.size > (1 << 30))
return -1;
- if (track->sampleDescs[0]->getCodecTag() == MKTAG('Q', 'D', 'M', '2')) // Read extra data for QDM2
- track->extraData = _fd->readStream(atom.size);
+ // We should only get here within an stsd atom
+ if (track->sampleDescs.empty())
+ return -1;
+
+ SampleDesc *sampleDesc = track->sampleDescs.back();
+
+ if (sampleDesc->getCodecTag() == MKTAG('Q', 'D', 'M', '2')) // Read extra data for QDM2
+ sampleDesc->_extraData = _fd->readStream(atom.size);
else if (atom.size > 8)
return readDefault(atom);
else
@@ -738,6 +741,12 @@ int QuickTimeParser::readESDS(Atom atom) {
Track *track = _tracks.back();
+ // We should only get here within an stsd atom
+ if (track->sampleDescs.empty())
+ return -1;
+
+ SampleDesc *sampleDesc = track->sampleDescs.back();
+
_fd->readUint32BE(); // version + flags
byte tag;
@@ -753,7 +762,7 @@ int QuickTimeParser::readESDS(Atom atom) {
if (tag != kMP4DecConfigDescTag)
return 0;
- track->objectTypeMP4 = _fd->readByte();
+ sampleDesc->_objectTypeMP4 = _fd->readByte();
_fd->readByte(); // stream type
_fd->readUint16BE(); _fd->readByte(); // buffer size
_fd->readUint32BE(); // max bitrate
@@ -764,9 +773,9 @@ int QuickTimeParser::readESDS(Atom atom) {
if (tag != kMP4DecSpecificDescTag)
return 0;
- track->extraData = _fd->readStream(length);
+ sampleDesc->_extraData = _fd->readStream(length);
- debug(0, "MPEG-4 object type = %02x", track->objectTypeMP4);
+ debug(0, "MPEG-4 object type = %02x", sampleDesc->_objectTypeMP4);
return 0;
}
@@ -776,8 +785,14 @@ int QuickTimeParser::readSMI(Atom atom) {
Track *track = _tracks.back();
+ // We should only get here within an stsd atom
+ if (track->sampleDescs.empty())
+ return -1;
+
+ SampleDesc *sampleDesc = track->sampleDescs.back();
+
// This atom just contains SVQ3 extra data
- track->extraData = _fd->readStream(atom.size);
+ sampleDesc->_extraData = _fd->readStream(atom.size);
return 0;
}
@@ -797,6 +812,12 @@ void QuickTimeParser::close() {
QuickTimeParser::SampleDesc::SampleDesc(Track *parentTrack, uint32 codecTag) {
_parentTrack = parentTrack;
_codecTag = codecTag;
+ _extraData = 0;
+ _objectTypeMP4 = 0;
+}
+
+QuickTimeParser::SampleDesc::~SampleDesc() {
+ delete _extraData;
}
QuickTimeParser::Track::Track() {
@@ -817,11 +838,9 @@ QuickTimeParser::Track::Track() {
codecType = CODEC_TYPE_MOV_OTHER;
editCount = 0;
editList = 0;
- extraData = 0;
frameCount = 0;
duration = 0;
startTime = 0;
- objectTypeMP4 = 0;
mediaDuration = 0;
}
@@ -832,7 +851,6 @@ QuickTimeParser::Track::~Track() {
delete[] sampleSizes;
delete[] keyframes;
delete[] editList;
- delete extraData;
for (uint32 i = 0; i < sampleDescs.size(); i++)
delete sampleDescs[i];
diff --git a/common/quicktime.h b/common/quicktime.h
index caa92578b1..f5fd578e3a 100644
--- a/common/quicktime.h
+++ b/common/quicktime.h
@@ -108,10 +108,13 @@ protected:
class SampleDesc {
public:
SampleDesc(Track *parentTrack, uint32 codecTag);
- virtual ~SampleDesc() {}
+ virtual ~SampleDesc();
uint32 getCodecTag() const { return _codecTag; }
+ SeekableReadStream *_extraData;
+ byte _objectTypeMP4;
+
protected:
Track *_parentTrack;
uint32 _codecTag;
@@ -150,16 +153,12 @@ protected:
uint32 editCount;
EditListEntry *editList;
- SeekableReadStream *extraData;
-
uint32 frameCount;
uint32 duration;
uint32 mediaDuration;
uint32 startTime;
Rational scaleFactorX;
Rational scaleFactorY;
-
- byte objectTypeMP4;
};
virtual SampleDesc *readSampleDesc(Track *track, uint32 format, uint32 descSize) = 0;
diff --git a/common/random.cpp b/common/random.cpp
index de1269b485..86bde77e82 100644
--- a/common/random.cpp
+++ b/common/random.cpp
@@ -17,6 +17,7 @@
* You should have received a copy of the GNU General Public 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/random.h"
diff --git a/common/random.h b/common/random.h
index c8aec58946..48cde26dc5 100644
--- a/common/random.h
+++ b/common/random.h
@@ -17,6 +17,7 @@
* You should have received a copy of the GNU General Public 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_RANDOM_H
diff --git a/common/rational.cpp b/common/rational.cpp
index f5495da3a9..90e44576a7 100644
--- a/common/rational.cpp
+++ b/common/rational.cpp
@@ -17,6 +17,7 @@
* You should have received a copy of the GNU General Public 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/debug.h"
diff --git a/common/rational.h b/common/rational.h
index 8270d2194e..55fb361774 100644
--- a/common/rational.h
+++ b/common/rational.h
@@ -17,6 +17,7 @@
* You should have received a copy of the GNU General Public 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_RATIONAL_H
diff --git a/common/rdft.cpp b/common/rdft.cpp
index bfd6818fbd..89d39112e6 100644
--- a/common/rdft.cpp
+++ b/common/rdft.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -29,7 +29,7 @@
namespace Common {
RDFT::RDFT(int bits, TransformType trans) : _bits(bits), _sin(bits), _cos(bits), _fft(0) {
- assert ((_bits >= 4) && (_bits <= 16));
+ assert((_bits >= 4) && (_bits <= 16));
_inverse = trans == IDFT_C2R || trans == DFT_C2R;
_signConvention = trans == IDFT_R2C || trans == DFT_C2R ? 1 : -1;
@@ -49,12 +49,12 @@ RDFT::~RDFT() {
void RDFT::calc(float *data) {
const int n = 1 << _bits;
- const float k1 = 0.5;
- const float k2 = 0.5 - _inverse;
+ const float k1 = 0.5f;
+ const float k2 = 0.5f - _inverse;
if (!_inverse) {
- _fft->permute((Complex *) data);
- _fft->calc ((Complex *) data);
+ _fft->permute((Complex *)data);
+ _fft->calc ((Complex *)data);
}
Complex ev, od;
@@ -91,8 +91,8 @@ void RDFT::calc(float *data) {
data[0] *= k1;
data[1] *= k1;
- _fft->permute((Complex *) data);
- _fft->calc ((Complex *) data);
+ _fft->permute((Complex *)data);
+ _fft->calc ((Complex *)data);
}
}
diff --git a/common/rdft.h b/common/rdft.h
index 76e95c363a..ae06c72ef8 100644
--- a/common/rdft.h
+++ b/common/rdft.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/common/recorderfile.cpp b/common/recorderfile.cpp
index d08bc599f1..71f8272b44 100644
--- a/common/recorderfile.cpp
+++ b/common/recorderfile.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -45,6 +45,8 @@ PlaybackFile::PlaybackFile() : _tmpRecordFile(_tmpBuffer, kRecordBuffSize), _tmp
_recordCount = 0;
_eventsSize = 0;
memset(_tmpBuffer, 1, kRecordBuffSize);
+
+ _playbackParseState = kFileStateCheckFormat;
}
PlaybackFile::~PlaybackFile() {
diff --git a/common/recorderfile.h b/common/recorderfile.h
index 1c95e5a915..d34a442604 100644
--- a/common/recorderfile.h
+++ b/common/recorderfile.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/common/rect.h b/common/rect.h
index 5790cf7c0f..32424d3e6a 100644
--- a/common/rect.h
+++ b/common/rect.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/common/rendermode.cpp b/common/rendermode.cpp
index e8f3146630..6115666399 100644
--- a/common/rendermode.cpp
+++ b/common/rendermode.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/common/rendermode.h b/common/rendermode.h
index 945c4e7d9d..59fa860c6c 100644
--- a/common/rendermode.h
+++ b/common/rendermode.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/common/savefile.h b/common/savefile.h
index 19536da54f..b0c4d31f53 100644
--- a/common/savefile.h
+++ b/common/savefile.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/common/scummsys.h b/common/scummsys.h
index b15a76e5b9..c30bc4a52a 100644
--- a/common/scummsys.h
+++ b/common/scummsys.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -405,6 +405,13 @@
typedef unsigned int uint32;
typedef signed int int32;
typedef unsigned int uint;
+ #ifdef __PLAYSTATION2__
+ typedef signed long int64;
+ typedef unsigned long uint64;
+ #else
+ typedef signed long long int64;
+ typedef unsigned long long uint64;
+ #endif
#endif
diff --git a/common/serializer.h b/common/serializer.h
index 4d97c9e930..ef8fca9906 100644
--- a/common/serializer.h
+++ b/common/serializer.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/common/sinetables.cpp b/common/sinetables.cpp
index 7338166d39..c01705e3dc 100644
--- a/common/sinetables.cpp
+++ b/common/sinetables.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/common/sinetables.h b/common/sinetables.h
index 3489663661..67225c0bcb 100644
--- a/common/sinetables.h
+++ b/common/sinetables.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/common/singleton.h b/common/singleton.h
index 6e47f119ba..13bdb0c3a3 100644
--- a/common/singleton.h
+++ b/common/singleton.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/common/stack.h b/common/stack.h
index bc5de9ac7f..cba3fb124d 100644
--- a/common/stack.h
+++ b/common/stack.h
@@ -17,6 +17,7 @@
* You should have received a copy of the GNU General Public 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_STACK_H
diff --git a/common/str-array.h b/common/str-array.h
index 57c76bf305..7a52a314e1 100644
--- a/common/str-array.h
+++ b/common/str-array.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/common/str.cpp b/common/str.cpp
index 4a10792373..faf84d722f 100644
--- a/common/str.cpp
+++ b/common/str.cpp
@@ -17,6 +17,7 @@
* You should have received a copy of the GNU General Public 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/hash-str.h"
diff --git a/common/str.h b/common/str.h
index 6b4475e1c4..a2451f2f69 100644
--- a/common/str.h
+++ b/common/str.h
@@ -17,6 +17,7 @@
* You should have received a copy of the GNU General Public 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_STRING_H
@@ -234,6 +235,13 @@ public:
static String vformat(const char *fmt, va_list args);
public:
+ typedef char value_type;
+ /**
+ * Unsigned version of the underlying type. This can be used to cast
+ * individual string characters to bigger integer types without sign
+ * extension happening.
+ */
+ typedef unsigned char unsigned_type;
typedef char * iterator;
typedef const char * const_iterator;
diff --git a/common/stream.cpp b/common/stream.cpp
index f49603c882..45060b9db5 100644
--- a/common/stream.cpp
+++ b/common/stream.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/common/stream.h b/common/stream.h
index 33ebc95a86..238844a860 100644
--- a/common/stream.h
+++ b/common/stream.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/common/substream.h b/common/substream.h
index 01686529aa..e3161c0a53 100644
--- a/common/substream.h
+++ b/common/substream.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/common/system.cpp b/common/system.cpp
index d86b5b2b81..53f28cafa1 100644
--- a/common/system.cpp
+++ b/common/system.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/common/system.h b/common/system.h
index 81c4bdf34e..8896554f76 100644
--- a/common/system.h
+++ b/common/system.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/common/textconsole.cpp b/common/textconsole.cpp
index a721c121d5..5c69e42379 100644
--- a/common/textconsole.cpp
+++ b/common/textconsole.cpp
@@ -17,6 +17,7 @@
* You should have received a copy of the GNU General Public 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_exit
diff --git a/common/textconsole.h b/common/textconsole.h
index 12f15e5e4b..e7654dd7e5 100644
--- a/common/textconsole.h
+++ b/common/textconsole.h
@@ -17,6 +17,7 @@
* You should have received a copy of the GNU General Public 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_CONSOLE_H
diff --git a/common/timer.h b/common/timer.h
index 3db32df76a..2db163327d 100644
--- a/common/timer.h
+++ b/common/timer.h
@@ -17,6 +17,7 @@
* You should have received a copy of the GNU General Public 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_TIMER_H
diff --git a/common/tokenizer.cpp b/common/tokenizer.cpp
index 46ba7a8d8b..2547f88168 100644
--- a/common/tokenizer.cpp
+++ b/common/tokenizer.cpp
@@ -17,6 +17,7 @@
* You should have received a copy of the GNU General Public 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/tokenizer.h"
diff --git a/common/tokenizer.h b/common/tokenizer.h
index 8485094997..dd831f3431 100644
--- a/common/tokenizer.h
+++ b/common/tokenizer.h
@@ -17,6 +17,7 @@
* You should have received a copy of the GNU General Public 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_TOKENIZER_H
diff --git a/common/translation.cpp b/common/translation.cpp
index 2bc31c617b..01665bf876 100644
--- a/common/translation.cpp
+++ b/common/translation.cpp
@@ -17,6 +17,7 @@
* You should have received a copy of the GNU General Public 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(WIN32)
diff --git a/common/translation.h b/common/translation.h
index 77e2fdfc07..e316507fdb 100644
--- a/common/translation.h
+++ b/common/translation.h
@@ -17,6 +17,7 @@
* You should have received a copy of the GNU General Public 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_TRANSLATION_H
diff --git a/common/types.h b/common/types.h
index ab86f3afc2..dd5408daa5 100644
--- a/common/types.h
+++ b/common/types.h
@@ -17,6 +17,7 @@
* You should have received a copy of the GNU General Public 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_TYPES_H
diff --git a/common/unzip.cpp b/common/unzip.cpp
index 69b9ff67cb..716c8c2d5e 100644
--- a/common/unzip.cpp
+++ b/common/unzip.cpp
@@ -17,6 +17,7 @@
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
*/
/* unzip.c -- IO on .zip files using zlib
diff --git a/common/unzip.h b/common/unzip.h
index 2e0dae831a..f249c5db19 100644
--- a/common/unzip.h
+++ b/common/unzip.h
@@ -17,6 +17,7 @@
* You should have received a copy of the GNU General Public 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_UNZIP_H
diff --git a/common/updates.h b/common/updates.h
index 0012808a17..4c30987c38 100644
--- a/common/updates.h
+++ b/common/updates.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/common/ustr.cpp b/common/ustr.cpp
new file mode 100644
index 0000000000..35b5502a6d
--- /dev/null
+++ b/common/ustr.cpp
@@ -0,0 +1,330 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public 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/ustr.h"
+#include "common/memorypool.h"
+#include "common/util.h"
+
+namespace Common {
+
+extern MemoryPool *g_refCountPool;
+
+static uint32 computeCapacity(uint32 len) {
+ // By default, for the capacity we use the next multiple of 32
+ return ((len + 32 - 1) & ~0x1F);
+}
+
+U32String::U32String(const value_type *str) : _size(0), _str(_storage) {
+ if (str == 0) {
+ _storage[0] = 0;
+ _size = 0;
+ } else {
+ uint32 len = 0;
+ const value_type *s = str;
+ while (*s++) {
+ ++len;
+ }
+ initWithCStr(str, len);
+ }
+}
+
+U32String::U32String(const value_type *str, uint32 len) : _size(0), _str(_storage) {
+ initWithCStr(str, len);
+}
+
+U32String::U32String(const value_type *beginP, const value_type *endP) : _size(0), _str(_storage) {
+ assert(endP >= beginP);
+ initWithCStr(beginP, endP - beginP);
+}
+
+U32String::U32String(const U32String &str)
+ : _size(str._size) {
+ if (str.isStorageIntern()) {
+ // String in internal storage: just copy it
+ memcpy(_storage, str._storage, _builtinCapacity * sizeof(value_type));
+ _str = _storage;
+ } else {
+ // String in external storage: use refcount mechanism
+ str.incRefCount();
+ _extern._refCount = str._extern._refCount;
+ _extern._capacity = str._extern._capacity;
+ _str = str._str;
+ }
+ assert(_str != 0);
+}
+
+U32String::~U32String() {
+ decRefCount(_extern._refCount);
+}
+
+U32String &U32String::operator=(const U32String &str) {
+ if (&str == this)
+ return *this;
+
+ if (str.isStorageIntern()) {
+ decRefCount(_extern._refCount);
+ _size = str._size;
+ _str = _storage;
+ memcpy(_str, str._str, (_size + 1) * sizeof(value_type));
+ } else {
+ str.incRefCount();
+ decRefCount(_extern._refCount);
+
+ _extern._refCount = str._extern._refCount;
+ _extern._capacity = str._extern._capacity;
+ _size = str._size;
+ _str = str._str;
+ }
+
+ return *this;
+}
+
+U32String &U32String::operator+=(const U32String &str) {
+ if (&str == this) {
+ return operator+=(U32String(str));
+ }
+
+ int len = str._size;
+ if (len > 0) {
+ ensureCapacity(_size + len, true);
+
+ memcpy(_str + _size, str._str, (len + 1) * sizeof(value_type));
+ _size += len;
+ }
+ return *this;
+}
+
+U32String &U32String::operator+=(value_type c) {
+ ensureCapacity(_size + 1, true);
+
+ _str[_size++] = c;
+ _str[_size] = 0;
+
+ return *this;
+}
+
+bool U32String::equals(const U32String &x) const {
+ if (this == &x || _str == x._str) {
+ return true;
+ }
+
+ if (x.size() != _size) {
+ return false;
+ }
+
+ return !memcmp(_str, x._str, _size * sizeof(value_type));
+}
+
+bool U32String::contains(value_type x) const {
+ for (uint32 i = 0; i < _size; ++i) {
+ if (_str[i] == x) {
+ return true;
+ }
+ }
+
+ return false;
+}
+
+void U32String::deleteChar(uint32 p) {
+ assert(p < _size);
+
+ makeUnique();
+ while (p++ < _size)
+ _str[p - 1] = _str[p];
+ _size--;
+}
+
+void U32String::clear() {
+ decRefCount(_extern._refCount);
+
+ _size = 0;
+ _str = _storage;
+ _storage[0] = 0;
+}
+
+void U32String::toLowercase() {
+ makeUnique();
+ for (uint32 i = 0; i < _size; ++i) {
+ if (_str[i] < 128) {
+ _str[i] = tolower(_str[i]);
+ }
+ }
+}
+
+void U32String::toUppercase() {
+ makeUnique();
+ for (uint32 i = 0; i < _size; ++i) {
+ if (_str[i] < 128) {
+ _str[i] = toupper(_str[i]);
+ }
+ }
+}
+
+uint32 U32String::find(const U32String &str, uint32 pos) const {
+ if (pos >= _size) {
+ return npos;
+ }
+
+ const value_type *strP = str.c_str();
+
+ for (const_iterator cur = begin() + pos; *cur; ++cur) {
+ uint i = 0;
+ while (true) {
+ if (!strP[i]) {
+ return cur - begin();
+ }
+
+ if (cur[i] != strP[i]) {
+ break;
+ }
+
+ ++i;
+ }
+ }
+
+ return npos;
+}
+
+void U32String::makeUnique() {
+ ensureCapacity(_size, true);
+}
+
+void U32String::ensureCapacity(uint32 new_size, bool keep_old) {
+ bool isShared;
+ uint32 curCapacity, newCapacity;
+ value_type *newStorage;
+ int *oldRefCount = _extern._refCount;
+
+ if (isStorageIntern()) {
+ isShared = false;
+ curCapacity = _builtinCapacity;
+ } else {
+ isShared = (oldRefCount && *oldRefCount > 1);
+ curCapacity = _extern._capacity;
+ }
+
+ // Special case: If there is enough space, and we do not share
+ // the storage, then there is nothing to do.
+ if (!isShared && new_size < curCapacity)
+ return;
+
+ if (isShared && new_size < _builtinCapacity) {
+ // We share the storage, but there is enough internal storage: Use that.
+ newStorage = _storage;
+ newCapacity = _builtinCapacity;
+ } else {
+ // We need to allocate storage on the heap!
+
+ // Compute a suitable new capacity limit
+ // If the current capacity is sufficient we use the same capacity
+ if (new_size < curCapacity)
+ newCapacity = curCapacity;
+ else
+ newCapacity = MAX(curCapacity * 2, computeCapacity(new_size+1));
+
+ // Allocate new storage
+ newStorage = new value_type[newCapacity];
+ assert(newStorage);
+ }
+
+ // Copy old data if needed, elsewise reset the new storage.
+ if (keep_old) {
+ assert(_size < newCapacity);
+ memcpy(newStorage, _str, (_size + 1) * sizeof(value_type));
+ } else {
+ _size = 0;
+ newStorage[0] = 0;
+ }
+
+ // Release hold on the old storage ...
+ decRefCount(oldRefCount);
+
+ // ... in favor of the new storage
+ _str = newStorage;
+
+ if (!isStorageIntern()) {
+ // Set the ref count & capacity if we use an external storage.
+ // It is important to do this *after* copying any old content,
+ // else we would override data that has not yet been copied!
+ _extern._refCount = 0;
+ _extern._capacity = newCapacity;
+ }
+}
+
+void U32String::incRefCount() const {
+ assert(!isStorageIntern());
+ if (_extern._refCount == 0) {
+ if (g_refCountPool == 0) {
+ g_refCountPool = new MemoryPool(sizeof(int));
+ assert(g_refCountPool);
+ }
+
+ _extern._refCount = (int *)g_refCountPool->allocChunk();
+ *_extern._refCount = 2;
+ } else {
+ ++(*_extern._refCount);
+ }
+}
+
+void U32String::decRefCount(int *oldRefCount) {
+ if (isStorageIntern())
+ return;
+
+ if (oldRefCount) {
+ --(*oldRefCount);
+ }
+ if (!oldRefCount || *oldRefCount <= 0) {
+ // The ref count reached zero, so we free the string storage
+ // and the ref count storage.
+ if (oldRefCount) {
+ assert(g_refCountPool);
+ g_refCountPool->freeChunk(oldRefCount);
+ }
+ delete[] _str;
+
+ // Even though _str points to a freed memory block now,
+ // we do not change its value, because any code that calls
+ // decRefCount will have to do this afterwards anyway.
+ }
+}
+
+void U32String::initWithCStr(const value_type *str, uint32 len) {
+ assert(str);
+
+ _storage[0] = 0;
+
+ _size = len;
+
+ if (len >= _builtinCapacity) {
+ // Not enough internal storage, so allocate more
+ _extern._capacity = computeCapacity(len+1);
+ _extern._refCount = 0;
+ _str = new value_type[_extern._capacity];
+ assert(_str != 0);
+ }
+
+ // Copy the string into the storage area
+ memmove(_str, str, len * sizeof(value_type));
+ _str[len] = 0;
+}
+
+} // End of namespace Common
diff --git a/common/ustr.h b/common/ustr.h
new file mode 100644
index 0000000000..0059a1eb96
--- /dev/null
+++ b/common/ustr.h
@@ -0,0 +1,195 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public 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_USTR_H
+#define COMMON_USTR_H
+
+#include "common/scummsys.h"
+
+namespace Common {
+
+/**
+ * Very simple string class for UTF-32 strings in ScummVM. The main intention
+ * behind this class is to feature a simple way of displaying UTF-32 strings
+ * through the Graphics::Font API.
+ *
+ * Please note that operations like equals, deleteCharacter, toUppercase, etc.
+ * are only very simplified convenience operations. They might not fully work
+ * as you would expect for a proper UTF-32 string class.
+ *
+ * The presence of \0 characters in the string will cause undefined
+ * behavior in some operations.
+ */
+class U32String {
+public:
+ static const uint32 npos = 0xFFFFFFFF;
+
+ typedef uint32 value_type;
+ typedef uint32 unsigned_type;
+private:
+ /**
+ * The size of the internal storage. Increasing this means less heap
+ * allocations are needed, at the cost of more stack memory usage,
+ * and of course lots of wasted memory.
+ */
+ static const uint32 _builtinCapacity = 32;
+
+ /**
+ * Length of the string.
+ */
+ uint32 _size;
+
+ /**
+ * Pointer to the actual string storage. Either points to _storage,
+ * or to a block allocated on the heap via malloc.
+ */
+ value_type *_str;
+
+
+ union {
+ /**
+ * Internal string storage.
+ */
+ value_type _storage[_builtinCapacity];
+ /**
+ * External string storage data -- the refcounter, and the
+ * capacity of the string _str points to.
+ */
+ struct {
+ mutable int *_refCount;
+ uint32 _capacity;
+ } _extern;
+ };
+
+ inline bool isStorageIntern() const {
+ return _str == _storage;
+ }
+
+public:
+ /** Construct a new empty string. */
+ U32String() : _size(0), _str(_storage) { _storage[0] = 0; }
+
+ /** Construct a new string from the given NULL-terminated C string. */
+ explicit U32String(const value_type *str);
+
+ /** Construct a new string containing exactly len characters read from address str. */
+ U32String(const value_type *str, uint32 len);
+
+ /** Construct a new string containing the characters between beginP (including) and endP (excluding). */
+ U32String(const value_type *beginP, const value_type *endP);
+
+ /** Construct a copy of the given string. */
+ U32String(const U32String &str);
+
+ ~U32String();
+
+ U32String &operator=(const U32String &str);
+ U32String &operator+=(const U32String &str);
+ U32String &operator+=(value_type c);
+
+ /**
+ * Equivalence comparison operator.
+ * @see equals
+ */
+ bool operator==(const U32String &x) const { return equals(x); }
+
+ /**
+ * Compares whether two U32String are the same based on memory comparison.
+ * This does *not* do comparison based on canonical equivalence.
+ */
+ bool equals(const U32String &x) const;
+
+ bool contains(value_type x) const;
+
+ inline const value_type *c_str() const { return _str; }
+ inline uint32 size() const { return _size; }
+
+ inline bool empty() const { return (_size == 0); }
+
+ value_type operator[](int idx) const {
+ assert(_str && idx >= 0 && idx < (int)_size);
+ return _str[idx];
+ }
+
+ /**
+ * Removes the value at position p from the string.
+ * Using this on decomposed characters will not remove the whole
+ * character!
+ */
+ void deleteChar(uint32 p);
+
+ /** Clears the string, making it empty. */
+ void clear();
+
+ /**
+ * Convert all characters in the string to lowercase.
+ *
+ * Be aware that this only affects the case of ASCII characters. All
+ * other characters will not be touched at all.
+ */
+ void toLowercase();
+
+ /**
+ * Convert all characters in the string to uppercase.
+ *
+ * Be aware that this only affects the case of ASCII characters. All
+ * other characters will not be touched at all.
+ */
+ void toUppercase();
+
+ uint32 find(const U32String &str, uint32 pos = 0) const;
+
+ typedef value_type * iterator;
+ typedef const value_type * const_iterator;
+
+ iterator begin() {
+ // Since the user could potentially
+ // change the string via the returned
+ // iterator we have to assure we are
+ // pointing to a unique storage.
+ makeUnique();
+
+ return _str;
+ }
+
+ iterator end() {
+ return begin() + size();
+ }
+
+ const_iterator begin() const {
+ return _str;
+ }
+
+ const_iterator end() const {
+ return begin() + size();
+ }
+private:
+ void makeUnique();
+ void ensureCapacity(uint32 new_size, bool keep_old);
+ void incRefCount() const;
+ void decRefCount(int *oldRefCount);
+ void initWithCStr(const value_type *str, uint32 len);
+};
+
+} // End of namespace Common
+
+#endif
diff --git a/common/util.cpp b/common/util.cpp
index 3d40fffff5..8e0a2fd61f 100644
--- a/common/util.cpp
+++ b/common/util.cpp
@@ -17,6 +17,7 @@
* You should have received a copy of the GNU General Public 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_isalnum
diff --git a/common/util.h b/common/util.h
index 392ced1ffe..1c0e45662e 100644
--- a/common/util.h
+++ b/common/util.h
@@ -17,6 +17,7 @@
* You should have received a copy of the GNU General Public 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_UTIL_H
diff --git a/common/winexe.cpp b/common/winexe.cpp
index 877ab6baa1..fc389f6ea6 100644
--- a/common/winexe.cpp
+++ b/common/winexe.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/common/winexe.h b/common/winexe.h
index bec156d2e7..cfadbf882d 100644
--- a/common/winexe.h
+++ b/common/winexe.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/common/winexe_ne.cpp b/common/winexe_ne.cpp
index c3698d5fce..ccf1fd17e5 100644
--- a/common/winexe_ne.cpp
+++ b/common/winexe_ne.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -187,7 +187,7 @@ uint32 NEResources::getResourceTableOffset() {
static const char *s_resTypeNames[] = {
"", "cursor", "bitmap", "icon", "menu", "dialog", "string",
"font_dir", "font", "accelerator", "rc_data", "msg_table",
- "group_cursor", "group_icon", "", "", "version", "dlg_include",
+ "group_cursor", "", "group_icon", "", "version", "dlg_include",
"", "plug_play", "vxd", "ani_cursor", "ani_icon", "html",
"manifest"
};
diff --git a/common/winexe_ne.h b/common/winexe_ne.h
index f00941412f..d6698e6cf0 100644
--- a/common/winexe_ne.h
+++ b/common/winexe_ne.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -46,7 +46,7 @@ enum NEResourceType {
kNERCData = 0x0A,
kNEMessageTable = 0x0B,
kNEGroupCursor = 0x0C,
- kNEGroupIcon = 0x0D,
+ kNEGroupIcon = 0x0E,
kNEVersion = 0x10,
kNEDlgInclude = 0x11,
kNEPlugPlay = 0x13,
diff --git a/common/winexe_pe.cpp b/common/winexe_pe.cpp
index b3c45ffe73..969ea5d923 100644
--- a/common/winexe_pe.cpp
+++ b/common/winexe_pe.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/common/winexe_pe.h b/common/winexe_pe.h
index b38f2f78f5..b163bd15d2 100644
--- a/common/winexe_pe.h
+++ b/common/winexe_pe.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/common/zlib.cpp b/common/zlib.cpp
index 920338e57e..c22ea1e660 100644
--- a/common/zlib.cpp
+++ b/common/zlib.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -27,6 +27,8 @@
#include "common/ptr.h"
#include "common/util.h"
#include "common/stream.h"
+#include "common/debug.h"
+#include "common/textconsole.h"
#if defined(USE_ZLIB)
#ifdef __SYMBIAN32__
@@ -139,6 +141,10 @@ bool inflateZlibInstallShield(byte *dst, uint dstLen, const byte *src, uint srcL
return true;
}
+#ifndef RELEASE_BUILD
+static bool _shownBackwardSeekingWarning = false;
+#endif
+
/**
* A simple wrapper class which can be used to wrap around an arbitrary
* other SeekableReadStream and will then provide on-the-fly decompression support.
@@ -241,13 +247,17 @@ public:
}
bool seek(int32 offset, int whence = SEEK_SET) {
int32 newPos = 0;
- assert(whence != SEEK_END); // SEEK_END not supported
switch (whence) {
case SEEK_SET:
newPos = offset;
break;
case SEEK_CUR:
newPos = _pos + offset;
+ break;
+ case SEEK_END:
+ // NOTE: This can be an expensive operation (see below).
+ newPos = size() + offset;
+ break;
}
assert(newPos >= 0);
@@ -256,9 +266,17 @@ public:
// To search backward, we have to restart the whole decompression
// from the start of the file. A rather wasteful operation, best
// to avoid it. :/
-#if DEBUG
- warning("Backward seeking in GZipReadStream detected");
+
+#ifndef RELEASE_BUILD
+ if (!_shownBackwardSeekingWarning) {
+ // We only throw this warning once per stream, to avoid
+ // getting the console swarmed with warnings when consecutive
+ // seeks are made.
+ debug(1, "Backward seeking in GZipReadStream detected");
+ _shownBackwardSeekingWarning = true;
+ }
#endif
+
_pos = 0;
_wrapped->seek(0, SEEK_SET);
_zlibErr = inflateReset(&_stream);
diff --git a/common/zlib.h b/common/zlib.h
index d940f3f3a1..e2936a334a 100644
--- a/common/zlib.h
+++ b/common/zlib.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/configure b/configure
index cb0b8902fc..46edeafa4e 100755
--- a/configure
+++ b/configure
@@ -97,7 +97,9 @@ add_feature() {
_srcdir=`dirname $0`
# Read list of engines
-. $_srcdir/engines/configure.engines
+for i in $_srcdir/engines/*/configure.engine; do
+ . "$i"
+done
#
# Default settings
@@ -124,7 +126,7 @@ _opengl=auto
_opengles=auto
_readline=auto
_freetype2=auto
-_taskbar=yes
+_taskbar=auto
_updates=no
_libunity=auto
# Default option behavior yes/no
@@ -848,7 +850,9 @@ Fine tuning of the installation directories:
Special configuration feature:
--host=HOST cross-compile to target HOST (arm-linux, ...)
- special targets: android for Android
+ special targets: android-arm for Android ARM
+ android-mips for Android MIPS
+ android-x86 for Android x86
tizen for Samsung Tizen
caanoo for Caanoo
dingux for Dingux
@@ -963,6 +967,7 @@ Optional Libraries:
--with-freetype2-prefix=DIR Prefix where the freetype-config script is
installed (optional)
+ --disable-freetype2 disable freetype2 TTF library usage [autodetect]
--with-nasm-prefix=DIR Prefix where nasm executable is installed (optional)
--disable-nasm disable assembly language optimizations [autodetect]
@@ -1269,11 +1274,21 @@ get_system_exe_extension $guessed_host
NATIVEEXEEXT=$_exeext
case $_host in
-android | android-v7a | ouya)
+android | android-arm | android-v7a | android-arm-v7a | ouya)
_host_os=android
_host_cpu=arm
_host_alias=arm-linux-androideabi
;;
+android-mips)
+ _host_os=android
+ _host_cpu=mipsel
+ _host_alias=mipsel-linux-android
+ ;;
+android-x86)
+ _host_os=android
+ _host_cpu=i686
+ _host_alias=i686-linux-android
+ ;;
arm-riscos)
_host_os=riscos
_host_cpu=arm
@@ -1303,7 +1318,7 @@ ds)
gamecube)
_host_os=gamecube
_host_cpu=ppc
- _host_alias=powerpc-gekko
+ _host_alias=powerpc-eabi
;;
gp2x)
_host_os=gph-linux
@@ -1376,6 +1391,9 @@ ps2)
_host_os=ps2
_host_cpu=mips64r5900el
_host_alias=ee
+ # PS2 bogus dirs: they actually depend on launch medium
+ datadir='host:data'
+ docdir='host:docs'
;;
ps3)
_host_os=ps3
@@ -1426,7 +1444,7 @@ webos)
wii)
_host_os=wii
_host_cpu=ppc
- _host_alias=powerpc-gekko
+ _host_alias=powerpc-eabi
;;
wince)
_host_os=wince
@@ -1473,8 +1491,16 @@ caanoo | gp2x | gp2xwiz | openpandora | ps2)
esac
if test "$_debug_build" != no; then
- # debug mode not explicitly disabled -> compile with -g
- CXXFLAGS="$CXXFLAGS -g"
+ # debug mode not explicitly disabled -> compile with debug information
+ case $_host_os in
+ amigaos*)
+ # AmigaOS debugger uses plain stabs, with no gdb extensions.
+ CXXFLAGS="$CXXFLAGS -gstabs"
+ ;;
+ *)
+ # Use the system default format for debug info.
+ CXXFLAGS="$CXXFLAGS -g"
+ esac
fi
if test "$_release_build" = yes; then
@@ -1817,6 +1843,15 @@ if test "$_global_constructors" = yes; then
fi
echo $_global_constructors
+echo_n "Checking for $_host_alias-strings... " >> "$TMPLOG"
+if test ! "x$(which $_host_alias-strings 2>/dev/null)" = "x"; then
+_strings=$_host_alias-strings
+echo yes >> "$TMPLOG"
+else
+_strings=strings
+echo no >> "$TMPLOG"
+fi
+
#
# Check for endianness
#
@@ -1831,9 +1866,9 @@ void _ebcdic() { char* s = (char*) ebcdic_mm; s = (char*) ebcdic_ii; }
int main() { _ascii (); _ebcdic (); return 0; }
EOF
$CXX $CXXFLAGS -c -o $TMPO.o tmp_endianness_check.cpp
-if strings $TMPO.o | grep BIGenDianSyS >/dev/null; then
+if $_strings $TMPO.o | grep BIGenDianSyS >/dev/null; then
_endian=big
-elif strings $TMPO.o | grep LiTTleEnDian >/dev/null; then
+elif $_strings $TMPO.o | grep LiTTleEnDian >/dev/null; then
_endian=little
fi
echo $_endian;
@@ -2031,34 +2066,65 @@ echo_n "Checking hosttype... "
echo $_host_os
case $_host_os in
amigaos*)
- LDFLAGS="$LDFLAGS -use-dynld"
+ LDFLAGS="$LDFLAGS -use-dynld -Wl,--export-dynamic"
LDFLAGS="$LDFLAGS -L/sdk/local/newlib/lib"
# We have to use 'long' for our 4 byte typedef because AmigaOS already typedefs (u)int32
# as (unsigned) long, and consequently we'd get a compiler error otherwise.
type_4_byte='long'
+ # Supress format warnings as the long 4 byte causes noisy warnings.
+ CXXFLAGS="$CXXFLAGS -Wno-format"
add_line_to_config_mk 'AMIGAOS = 1'
;;
android)
case $_host in
- android)
+ android | android-arm)
CXXFLAGS="$CXXFLAGS -march=armv5te"
CXXFLAGS="$CXXFLAGS -mtune=xscale"
CXXFLAGS="$CXXFLAGS -msoft-float"
+ ABI="armeabi"
+ ANDROID_PLATFORM=4
+ ANDROID_PLATFORM_ARCH="arm"
;;
- android-v7a)
+ android-v7a | android-arm-v7a)
CXXFLAGS="$CXXFLAGS -march=armv7-a"
CXXFLAGS="$CXXFLAGS -mfloat-abi=softfp"
CXXFLAGS="$CXXFLAGS -mfpu=vfp"
LDFLAGS="$LDFLAGS -Wl,--fix-cortex-a8"
+ ABI="armeabi-v7a"
+ ANDROID_PLATFORM=4
+ ANDROID_PLATFORM_ARCH="arm"
+ ;;
+ android-mips)
+ CXXFLAGS="$CXXFLAGS -march=mips32"
+ CXXFLAGS="$CXXFLAGS -mtune=mips32"
+ ABI="mips"
+ # Platform version 9 is needed as earlier versions of platform do not support this arch.
+ ANDROID_PLATFORM=9
+ ANDROID_PLATFORM_ARCH="mips"
+ ;;
+ android-x86)
+ CXXFLAGS="$CXXFLAGS -march=i686"
+ CXXFLAGS="$CXXFLAGS -mtune=i686"
+ ABI="x86"
+ # Platform version 9 is needed as earlier versions of platform do not support this arch.
+ ANDROID_PLATFORM=9
+ ANDROID_PLATFORM_ARCH="x86"
;;
ouya)
CXXFLAGS="$CXXFLAGS -march=armv7-a"
CXXFLAGS="$CXXFLAGS -mtune=cortex-a9"
CXXFLAGS="$CXXFLAGS -mfloat-abi=softfp"
CXXFLAGS="$CXXFLAGS -mfpu=neon"
+ ABI="armeabi-v7a"
+ ANDROID_PLATFORM=4
+ ANDROID_PLATFORM_ARCH="arm"
;;
esac
- CXXFLAGS="$CXXFLAGS --sysroot=$ANDROID_NDK/platforms/android-4/arch-arm"
+
+ # Setup platform version and arch
+ CXXFLAGS="$CXXFLAGS --sysroot=$ANDROID_NDK/platforms/android-$ANDROID_PLATFORM/arch-$ANDROID_PLATFORM_ARCH"
+ LDFLAGS="$LDFLAGS --sysroot=$ANDROID_NDK/platforms/android-$ANDROID_PLATFORM/arch-$ANDROID_PLATFORM_ARCH"
+
CXXFLAGS="$CXXFLAGS -fpic"
CXXFLAGS="$CXXFLAGS -ffunction-sections"
CXXFLAGS="$CXXFLAGS -funwind-tables"
@@ -2071,16 +2137,25 @@ case $_host_os in
fi
CXXFLAGS="$CXXFLAGS -finline-limit=300"
_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__"
- CXXFLAGS="$CXXFLAGS -D__ARM_ARCH_5T__"
- CXXFLAGS="$CXXFLAGS -D__ARM_ARCH_5E__"
- CXXFLAGS="$CXXFLAGS -D__ARM_ARCH_5TE__"
- # supress 'mangling of 'va_list' has changed in GCC 4.4'
+
+ if test "$_host" = android -o "$_host" = android-arm; then
+ 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__"
+ CXXFLAGS="$CXXFLAGS -D__ARM_ARCH_5T__"
+ CXXFLAGS="$CXXFLAGS -D__ARM_ARCH_5E__"
+ CXXFLAGS="$CXXFLAGS -D__ARM_ARCH_5TE__"
+ fi
+
+ # surpress 'mangling of 'va_list' has changed in GCC 4.4' warning
CXXFLAGS="$CXXFLAGS -Wno-psabi"
- LDFLAGS="$LDFLAGS --sysroot=$ANDROID_NDK/platforms/android-4/arch-arm"
- LDFLAGS="$LDFLAGS -mthumb-interwork"
+
+ if test "$_host" = android -o "$_host" = android-arm; then
+ LDFLAGS="$LDFLAGS -mthumb-interwork"
+ fi
+
+ LDFLAGS="$LDFLAGS -L$ANDROID_NDK/sources/cxx-stl/gnu-libstdc++/`$CXX -dumpversion`/libs/$ABI/"
+ LIBS="$LIBS -lsupc++"
add_line_to_config_mk "ANDROID_SDK = $ANDROID_SDK"
_seq_midi=no
;;
@@ -2128,6 +2203,49 @@ case $_host_os in
echo "Set staticlib-prefix to ${_staticlibpath}"
fi
fi
+
+ # Fink
+ # There is no way to get the prefix, so implementing a hack here
+ fink_version=`fink -V 2>/dev/null`
+ if test "$?" -eq 0; then
+ fink_version="`echo "${fink_version}" | sed -ne 's/Package manager version: \([0-9.]*\)/\1/gp'`"
+ echo_n "You seem to be running Fink version ${fink_version}..."
+
+ fink_prefix=`which fink`
+ # strip off /bin/fink from /sw/bin/port
+ fink_prefix=`dirname ${fink_prefix}`
+ fink_prefix=`dirname ${fink_prefix}`
+
+ echo "adding ${fink_prefix} to paths"
+
+ LDFLAGS="-L${fink_prefix}/lib $LDFLAGS"
+ CXXFLAGS="-I${fink_prefix}/include $CXXFLAGS"
+
+ if test -z "$_staticlibpath"; then
+ _staticlibpath=${fink_prefix}
+ echo "Set staticlib-prefix to ${_staticlibpath}"
+ fi
+ fi
+
+ # Homebrew
+ brew_version=`brew -v 2>/dev/null`
+ if test "$?" -eq 0; then
+ brew_version="`echo "${brew_version}" | sed -ne 's/Homebrew \([0-9.]*\)/\1/gp'`"
+ echo_n "You seem to be running Homebrew version ${brew_version}..."
+
+ brew_prefix=`brew --prefix`
+
+ echo "adding ${brew_prefix} to paths"
+
+ LDFLAGS="-L${brew_prefix}/lib $LDFLAGS"
+ CXXFLAGS="-I${brew_prefix}/include $CXXFLAGS"
+
+ if test -z "$_staticlibpath"; then
+ _staticlibpath=${brew_prefix}
+ echo "Set staticlib-prefix to ${_staticlibpath}"
+ fi
+ fi
+
# If _staticlibpath is not set yet try first /sw (fink) then /usr/local
# (the macports case is handled above).
if test -z "$_staticlibpath"; then
@@ -2250,6 +2368,9 @@ case $_host_os in
CXXFLAGS="$CXXFLAGS -G2"
DEFINES="$DEFINES -D_EE"
DEFINES="$DEFINES -D__PLAYSTATION2__"
+ if test -z "$PS2SDK_OLD"; then
+ DEFINES="$DEFINES -D__NEW_PS2SDK__"
+ fi
;;
ps3)
# Force use of SDL and freetype from the ps3 toolchain
@@ -2345,7 +2466,7 @@ if test -n "$_host"; then
# Cross-compiling mode - add your target here if needed
echo "Cross-compiling to $_host"
case "$_host" in
- android | android-v7a | ouya)
+ android | android-arm | android-v7a | android-arm-v7a | android-mips | android-x86 | ouya)
# we link a .so as default
LDFLAGS="$LDFLAGS -shared"
LDFLAGS="$LDFLAGS -Wl,-Bsymbolic,--no-undefined"
@@ -2421,6 +2542,8 @@ if test -n "$_host"; then
CXXFLAGS="$CXXFLAGS -fschedule-insns2"
CXXFLAGS="$CXXFLAGS -fomit-frame-pointer"
CXXFLAGS="$CXXFLAGS -fdelete-null-pointer-checks"
+ # no-delayed-branch is a workaround for GCC bug #42841 - "SH: Assembler complains pcrel too far."
+ CXXFLAGS="$CXXFLAGS -fno-delayed-branch"
_backend="dc"
_build_scalers=no
_mad=yes
@@ -2488,6 +2611,7 @@ if test -n "$_host"; then
;;
iphone)
DEFINES="$DEFINES -DIPHONE"
+ ASFLAGS="$ASFLAGS -arch armv6"
_backend="iphone"
_build_scalers=no
_mt32emu=no
@@ -2629,6 +2753,8 @@ if test -n "$_host"; then
DEFINES="$DEFINES -DDISABLE_DOSBOX_OPL"
DEFINES="$DEFINES -DDISABLE_SID"
DEFINES="$DEFINES -DDISABLE_NES_APU"
+ CXXFLAGS="$CXXFLAGS -fno-exceptions"
+ CXXFLAGS="$CXXFLAGS -fno-rtti"
_backend="ps2"
_build_scalers=no
_mt32emu=no
@@ -2636,10 +2762,15 @@ if test -n "$_host"; then
# This trick doesn't work for tremor right now, as the PS2 port the resulting library
# libtremor, while our code later on expects it to be called libvorbisidec.
# TODO: Enable tremor, e.g. by adding -ltremor or by renaming the lib.
+ # Disable this for older SDK as this breaks the build otherwise...
+ if test -z "$PS2SDK_OLD"; then
+ _tremor=yes
+ fi
_mad=yes
_zlib=yes
# HACK to fix compilation of C source files for now.
- add_line_to_config_mk 'CC = ee-gcc'
+ add_line_to_config_mk 'CC := ee-gcc'
+ add_line_to_config_mk 'CFLAGS := -std=c99 -W -Wno-unused-parameter -Wconversion -pedantic -G2 -s -O2 -Wuninitialized'
# HACK to fix linking for now. It seems ee-g++ does not handle linking correctly.
LD=ee-gcc
@@ -2681,7 +2812,6 @@ if test -n "$_host"; then
_backend="tizen"
_port_mk="backends/platform/tizen/tizen.mk"
_arm_asm=yes
- _taskbar=no
_build_scalers=no
_seq_midi=no
_mt32emu=no
@@ -2771,8 +2901,8 @@ case $_backend in
;;
iphone)
LIBS="$LIBS -lobjc -framework UIKit -framework CoreGraphics -framework OpenGLES"
- LIBS="$LIBS -framework QuartzCore -framework GraphicsServices -framework CoreFoundation"
- LIBS="$LIBS -framework Foundation -framework AudioToolbox -framework CoreAudio"
+ LIBS="$LIBS -framework QuartzCore -framework CoreFoundation -framework Foundation"
+ LIBS="$LIBS -framework AudioToolbox -framework CoreAudio"
;;
linuxmoto)
DEFINES="$DEFINES -DLINUXMOTO"
@@ -3157,9 +3287,10 @@ POST_OBJS_FLAGS := -Wl,--export-all-symbols -Wl,--no-whole-archive -Wl,--out-im
;;
ps2)
_elf_loader=yes
+ DEFINES="$DEFINES -DUNCACHED_PLUGINS"
_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
+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
'
;;
psp)
@@ -3295,6 +3426,8 @@ if test "$_tremor" = yes && test "$_vorbis" = no; then
if test "$_tremolo" = yes ; then
add_line_to_config_h '#define USE_TREMOLO'
LIBS="$LIBS $TREMOR_LIBS -ltremolo"
+ elif test "$_host" = ps2 ; then
+ LIBS="-ltremor $LIBS"
else
LIBS="$LIBS $TREMOR_LIBS -lvorbisidec"
fi
@@ -3665,6 +3798,25 @@ fi
if test "$_readline" = yes ; then
LIBS="$LIBS $READLINE_LIBS $_READLINE_LIBS"
INCLUDES="$INCLUDES $READLINE_CFLAGS"
+
+ #
+ # Check the type of rl_completion_entry_function.
+ # It can be int(*)(const char *, int) or char *(*)(const char *, int).
+ #
+ cat > $TMPC << EOF
+#include <stdio.h>
+#include <readline/readline.h>
+#include <readline/history.h>
+
+int readline_completionFunction(const char *, int);
+
+int main(void) {
+ char *x = readline("");
+ rl_completion_entry_function = &readline_completionFunction;
+}
+EOF
+ cc_check -c && add_line_to_config_h '#define USE_READLINE_INT_COMPLETION'
+
fi
define_in_config_h_if_yes "$_readline" 'USE_READLINE'
@@ -3703,7 +3855,7 @@ if test "$_libunity" = yes ; then
LIBS="$LIBS $LIBUNITY_LIBS"
INCLUDES="$INCLUDES $LIBUNITY_CFLAGS"
fi
-define_in_config_h_if_yes "$_libunity" 'USE_TASKBAR_UNITY'
+define_in_config_h_if_yes "$_libunity" 'USE_UNITY'
fi
echo "$_libunity"
@@ -3965,24 +4117,31 @@ fi
# Check whether to build taskbar integration support
#
echo_n "Building taskbar integration support... "
-define_in_config_if_yes $_taskbar 'USE_TASKBAR'
-if test "$_taskbar" = yes; then
+if test "$_taskbar" = "no"; then
+ echo "no"
+else
case $_host_os in
mingw*)
LIBS="$LIBS -lole32 -luuid"
echo "win32"
+ _taskbar=yes
+ ;;
+ darwin*)
+ echo "osx"
+ _taskbar=yes
;;
*)
if test "$_libunity" = yes; then
echo "unity"
+ _taskbar=yes
else
- echo "$_taskbar"
+ echo "no"
+ _taskbar=no
fi
;;
esac
-else
- echo "$_taskbar"
fi
+define_in_config_if_yes $_taskbar 'USE_TASKBAR'
#
# Check whether to build Bink video support
@@ -4031,6 +4190,10 @@ case $_backend in
# without a scummvm sub directory.
DEFINES="$DEFINES -DPLUGIN_DIRECTORY=\\\"$libdir\\\""
;;
+ ps2)
+ # PS2 bogus dir: it actually depends on launch medium
+ DEFINES="$DEFINES -DPLUGIN_DIRECTORY=\\\"host:plugins\\\""
+ ;;
*)
DEFINES="$DEFINES -DPLUGIN_DIRECTORY=\\\"$libdir/scummvm\\\""
;;
@@ -4197,8 +4360,18 @@ for engine in $_engines; do
fi
done
-# Prepare the information to be shown
+# Sort engines to place our headline engine at start...
+# No technical reason, just historical convention
+headline_engine=scumm
+_sorted_engines="${headline_engine}"
for engine in $_engines; do
+ if test "${engine}" != "${headline_engine}" ; then
+ _sorted_engines="${_sorted_engines} ${engine}"
+ fi
+done
+
+# Prepare the information to be shown
+for engine in $_sorted_engines; do
if test "`get_engine_sub $engine`" = "no" ; then
# It's a main engine
prepare_engine_build_strings $engine
@@ -4380,3 +4553,59 @@ include \$(srcdir)/Makefile
EOF
fi
+
+# Ensure engines folder exists prior to trying to generate
+# files into it (used for out-of-tree-builds)
+mkdir -p engines
+
+echo "Creating engines/engines.mk"
+cat > engines/engines.mk << EOF
+# This file is automatically generated by configure
+# DO NOT EDIT MANUALLY
+# This file is being included by "Makefile.common"
+EOF
+
+for engine in $_sorted_engines; do
+ j=`echo $engine | tr '[:lower:]' '[:upper:]'`
+ if test "`get_engine_sub $engine`" = "no" ; then
+ # main engine
+ cat >> engines/engines.mk << EOF
+
+ifdef ENABLE_$j
+DEFINES += -DENABLE_$j=\$(ENABLE_$j)
+MODULES += engines/$engine
+EOF
+
+ for subeng in `get_engine_subengines $engine` ; do
+ k=`echo $subeng | tr '[:lower:]' '[:upper:]'`
+ cat >> engines/engines.mk << EOF
+
+ifdef ENABLE_$k
+DEFINES += -DENABLE_$k
+endif
+EOF
+ done
+
+ cat >> engines/engines.mk << EOF
+endif
+EOF
+ fi
+done
+
+echo "Creating engines/plugins_table.h"
+cat > engines/plugins_table.h << EOF
+/* This file is automatically generated by configure */
+/* DO NOT EDIT MANUALLY */
+// This file is being included by "base/plugins.cpp"
+EOF
+
+for engine in $_sorted_engines; do
+ if test "`get_engine_sub $engine`" = "no" ; then
+ j=`echo $engine | tr '[:lower:]' '[:upper:]'`
+ cat >> engines/plugins_table.h << EOF
+#if PLUGIN_ENABLED_STATIC($j)
+LINK_PLUGIN($j)
+#endif
+EOF
+ fi
+done
diff --git a/devtools/convbdf.cpp b/devtools/convbdf.cpp
index 69728eb9fd..21c8af8234 100644
--- a/devtools/convbdf.cpp
+++ b/devtools/convbdf.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/devtools/create_drascula/create_drascula.cpp b/devtools/create_drascula/create_drascula.cpp
index 20b60ab05f..2ed7e4fb4c 100644
--- a/devtools/create_drascula/create_drascula.cpp
+++ b/devtools/create_drascula/create_drascula.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/devtools/create_drascula/create_drascula.h b/devtools/create_drascula/create_drascula.h
index 754050c172..82abdceacb 100644
--- a/devtools/create_drascula/create_drascula.h
+++ b/devtools/create_drascula/create_drascula.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/devtools/create_drascula/staticdata.h b/devtools/create_drascula/staticdata.h
index e0e4f9da10..7cafe58703 100644
--- a/devtools/create_drascula/staticdata.h
+++ b/devtools/create_drascula/staticdata.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/devtools/create_hugo/create_hugo.cpp b/devtools/create_hugo/create_hugo.cpp
index 63b57f9c8f..780f85278d 100644
--- a/devtools/create_hugo/create_hugo.cpp
+++ b/devtools/create_hugo/create_hugo.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/devtools/create_hugo/create_hugo.h b/devtools/create_hugo/create_hugo.h
index e176dbb195..4f759feba6 100644
--- a/devtools/create_hugo/create_hugo.h
+++ b/devtools/create_hugo/create_hugo.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/devtools/create_hugo/staticdata.h b/devtools/create_hugo/staticdata.h
index 0ead2109d0..6e9c614943 100644
--- a/devtools/create_hugo/staticdata.h
+++ b/devtools/create_hugo/staticdata.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/devtools/create_hugo/staticdisplay.h b/devtools/create_hugo/staticdisplay.h
index 99d155dc13..0b5c10786c 100644
--- a/devtools/create_hugo/staticdisplay.h
+++ b/devtools/create_hugo/staticdisplay.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/devtools/create_hugo/staticengine.h b/devtools/create_hugo/staticengine.h
index 0091182c3c..7a45b23f8d 100644
--- a/devtools/create_hugo/staticengine.h
+++ b/devtools/create_hugo/staticengine.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/devtools/create_hugo/staticfont.h b/devtools/create_hugo/staticfont.h
index 9fa87d194a..f474f5be51 100644
--- a/devtools/create_hugo/staticfont.h
+++ b/devtools/create_hugo/staticfont.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/devtools/create_hugo/staticintro.h b/devtools/create_hugo/staticintro.h
index d9880b707c..fbf727c2a1 100644
--- a/devtools/create_hugo/staticintro.h
+++ b/devtools/create_hugo/staticintro.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/devtools/create_hugo/staticmouse.h b/devtools/create_hugo/staticmouse.h
index b4d784210b..e51e9f54a0 100644
--- a/devtools/create_hugo/staticmouse.h
+++ b/devtools/create_hugo/staticmouse.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/devtools/create_hugo/staticparser.h b/devtools/create_hugo/staticparser.h
index a2e28c1790..857dd3e960 100644
--- a/devtools/create_hugo/staticparser.h
+++ b/devtools/create_hugo/staticparser.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/devtools/create_hugo/staticutil.h b/devtools/create_hugo/staticutil.h
index 9003788ec9..ac2a824315 100644
--- a/devtools/create_hugo/staticutil.h
+++ b/devtools/create_hugo/staticutil.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/devtools/create_kyradat/create_kyradat.cpp b/devtools/create_kyradat/create_kyradat.cpp
index 01cde620e7..7da7bd4ef0 100644
--- a/devtools/create_kyradat/create_kyradat.cpp
+++ b/devtools/create_kyradat/create_kyradat.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -30,24 +30,22 @@
#endif // main
#include "create_kyradat.h"
+#include "resources.h"
+#include "types.h"
-#include "search.h"
#include "pak.h"
-#include "tables.h"
-#include "extract.h"
-
#include "md5.h"
#include "common/language.h"
#include "common/platform.h"
+#include <vector>
#include <string>
-#include <map>
#include <algorithm>
-#include <map>
+
enum {
- kKyraDatVersion = 84
+ kKyraDatVersion = 85
};
const ExtractFilename extractFilenames[] = {
@@ -55,647 +53,647 @@ const ExtractFilename extractFilenames[] = {
{ kIdMap, -1, true },
// INTRO / OUTRO sequences
- { k1ForestSeq, kTypeForestSeqData, false },
- { k1KallakWritingSeq, kTypeRawData, false },
- { k1KyrandiaLogoSeq, kTypeRawData, false },
- { k1KallakMalcolmSeq, kTypeRawData, false },
- { k1MalcolmTreeSeq, kTypeRawData, false },
- { k1WestwoodLogoSeq, kTypeRawData, false },
- { k1Demo1Seq, kTypeRawData, false },
- { k1Demo2Seq, kTypeRawData, false },
- { k1Demo3Seq, kTypeRawData, false },
- { k1Demo4Seq, kTypeRawData, false },
- { k1OutroReunionSeq, kTypeRawData, false },
+ { k1ForestSeq, kRawData, false },
+ { k1KallakWritingSeq, kRawData, false },
+ { k1KyrandiaLogoSeq, kRawData, false },
+ { k1KallakMalcolmSeq, kRawData, false },
+ { k1MalcolmTreeSeq, kRawData, false },
+ { k1WestwoodLogoSeq, kRawData, false },
+ { k1Demo1Seq, kRawData, false },
+ { k1Demo2Seq, kRawData, false },
+ { k1Demo3Seq, kRawData, false },
+ { k1Demo4Seq, kRawData, false },
+ { k1OutroReunionSeq, kRawData, false },
// INTRO / OUTRO strings
- { k1IntroCPSStrings, kTypeStringList, false },
- { k1IntroCOLStrings, kTypeStringList, false },
- { k1IntroWSAStrings, kTypeStringList, false },
- { k1IntroStrings, kTypeStringList, true },
- { k1OutroHomeString, kTypeStringList, true },
+ { k1IntroCPSStrings, kStringList, false },
+ { k1IntroCOLStrings, kStringList, false },
+ { k1IntroWSAStrings, kStringList, false },
+ { k1IntroStrings, kStringList, true },
+ { k1OutroHomeString, kStringList, true },
// INGAME strings
- { k1ItemNames, kTypeStringList, true },
- { k1TakenStrings, kTypeStringList, true },
- { k1PlacedStrings, kTypeStringList, true },
- { k1DroppedStrings, kTypeStringList, true },
- { k1NoDropStrings, kTypeStringList, true },
- { k1PutDownString, kTypeStringList, true },
- { k1WaitAmuletString, kTypeStringList, true },
- { k1BlackJewelString, kTypeStringList, true },
- { k1PoisonGoneString, kTypeStringList, true },
- { k1HealingTipString, kTypeStringList, true },
- { k1ThePoisonStrings, kTypeStringList, true },
- { k1FluteStrings, kTypeStringList, true },
- { k1WispJewelStrings, kTypeStringList, true },
- { k1MagicJewelStrings, kTypeStringList, true },
- { k1FlaskFullString, kTypeStringList, true },
- { k1FullFlaskString, kTypeStringList, true },
- { k1VeryCleverString, kTypeStringList, true },
- { k1NewGameString, kTypeStringList, true },
+ { k1ItemNames, kStringList, true },
+ { k1TakenStrings, kStringList, true },
+ { k1PlacedStrings, kStringList, true },
+ { k1DroppedStrings, kStringList, true },
+ { k1NoDropStrings, kStringList, true },
+ { k1PutDownString, kStringList, true },
+ { k1WaitAmuletString, kStringList, true },
+ { k1BlackJewelString, kStringList, true },
+ { k1PoisonGoneString, kStringList, true },
+ { k1HealingTipString, kStringList, true },
+ { k1ThePoisonStrings, kStringList, true },
+ { k1FluteStrings, kStringList, true },
+ { k1WispJewelStrings, kStringList, true },
+ { k1MagicJewelStrings, kStringList, true },
+ { k1FlaskFullString, kStringList, true },
+ { k1FullFlaskString, kStringList, true },
+ { k1VeryCleverString, kStringList, true },
+ { k1NewGameString, kStringList, true },
// GUI strings table
- { k1GUIStrings, kTypeStringList, true },
- { k1ConfigStrings, kTypeStringList, true },
+ { k1GUIStrings, kStringList, true },
+ { k1ConfigStrings, kStringList, true },
// ROOM table/filenames
- { k1RoomList, kTypeRoomList, false },
- { k1RoomFilenames, kTypeStringList, false },
+ { k1RoomList, kRoomList, false },
+ { k1RoomFilenames, kStringList, false },
// SHAPE tables
- { k1DefaultShapes, kTypeShapeList, false },
- { k1Healing1Shapes, kTypeShapeList, false },
- { k1Healing2Shapes, kTypeShapeList, false },
- { k1PoisonDeathShapes, kTypeShapeList, false },
- { k1FluteShapes, kTypeShapeList, false },
- { k1Winter1Shapes, kTypeShapeList, false },
- { k1Winter2Shapes, kTypeShapeList, false },
- { k1Winter3Shapes, kTypeShapeList, false },
- { k1DrinkShapes, kTypeShapeList, false },
- { k1WispShapes, kTypeShapeList, false },
- { k1MagicAnimShapes, kTypeShapeList, false },
- { k1BranStoneShapes, kTypeShapeList, false },
+ { k1DefaultShapes, kShapeList, false },
+ { k1Healing1Shapes, kShapeList, false },
+ { k1Healing2Shapes, kShapeList, false },
+ { k1PoisonDeathShapes, kShapeList, false },
+ { k1FluteShapes, kShapeList, false },
+ { k1Winter1Shapes, kShapeList, false },
+ { k1Winter2Shapes, kShapeList, false },
+ { k1Winter3Shapes, kShapeList, false },
+ { k1DrinkShapes, kShapeList, false },
+ { k1WispShapes, kShapeList, false },
+ { k1MagicAnimShapes, kShapeList, false },
+ { k1BranStoneShapes, kShapeList, false },
// IMAGE filename table
- { k1CharacterImageFilenames, kTypeStringList, false },
+ { k1CharacterImageFilenames, kStringList, false },
// AUDIO filename table
- { k1AudioTracks, kTypeStringList, false },
- { k1AudioTracks2, kTypeStringList, false },
- { k1AudioTracksIntro, kTypeStringList, false },
+ { k1AudioTracks, kStringList, false },
+ { k1AudioTracks2, kStringList, false },
+ { k1AudioTracksIntro, kStringList, false },
// AMULET anim
- { k1AmuleteAnimSeq, kTypeRawData, false },
+ { k1AmuleteAnimSeq, kRawData, false },
// PALETTE table
- { k1SpecialPalette1, kTypeRawData, false },
- { k1SpecialPalette2, kTypeRawData, false },
- { k1SpecialPalette3, kTypeRawData, false },
- { k1SpecialPalette4, kTypeRawData, false },
- { k1SpecialPalette5, kTypeRawData, false },
- { k1SpecialPalette6, kTypeRawData, false },
- { k1SpecialPalette7, kTypeRawData, false },
- { k1SpecialPalette8, kTypeRawData, false },
- { k1SpecialPalette9, kTypeRawData, false },
- { k1SpecialPalette10, kTypeRawData, false },
- { k1SpecialPalette11, kTypeRawData, false },
- { k1SpecialPalette12, kTypeRawData, false },
- { k1SpecialPalette13, kTypeRawData, false },
- { k1SpecialPalette14, kTypeRawData, false },
- { k1SpecialPalette15, kTypeRawData, false },
- { k1SpecialPalette16, kTypeRawData, false },
- { k1SpecialPalette17, kTypeRawData, false },
- { k1SpecialPalette18, kTypeRawData, false },
- { k1SpecialPalette19, kTypeRawData, false },
- { k1SpecialPalette20, kTypeRawData, false },
- { k1SpecialPalette21, kTypeRawData, false },
- { k1SpecialPalette22, kTypeRawData, false },
- { k1SpecialPalette23, kTypeRawData, false },
- { k1SpecialPalette24, kTypeRawData, false },
- { k1SpecialPalette25, kTypeRawData, false },
- { k1SpecialPalette26, kTypeRawData, false },
- { k1SpecialPalette27, kTypeRawData, false },
- { k1SpecialPalette28, kTypeRawData, false },
- { k1SpecialPalette29, kTypeRawData, false },
- { k1SpecialPalette30, kTypeRawData, false },
- { k1SpecialPalette31, kTypeRawData, false },
- { k1SpecialPalette32, kTypeRawData, false },
- { k1SpecialPalette33, kTypeRawData, false },
+ { k1SpecialPalette1, kRawData, false },
+ { k1SpecialPalette2, kRawData, false },
+ { k1SpecialPalette3, kRawData, false },
+ { k1SpecialPalette4, kRawData, false },
+ { k1SpecialPalette5, kRawData, false },
+ { k1SpecialPalette6, kRawData, false },
+ { k1SpecialPalette7, kRawData, false },
+ { k1SpecialPalette8, kRawData, false },
+ { k1SpecialPalette9, kRawData, false },
+ { k1SpecialPalette10, kRawData, false },
+ { k1SpecialPalette11, kRawData, false },
+ { k1SpecialPalette12, kRawData, false },
+ { k1SpecialPalette13, kRawData, false },
+ { k1SpecialPalette14, kRawData, false },
+ { k1SpecialPalette15, kRawData, false },
+ { k1SpecialPalette16, kRawData, false },
+ { k1SpecialPalette17, kRawData, false },
+ { k1SpecialPalette18, kRawData, false },
+ { k1SpecialPalette19, kRawData, false },
+ { k1SpecialPalette20, kRawData, false },
+ { k1SpecialPalette21, kRawData, false },
+ { k1SpecialPalette22, kRawData, false },
+ { k1SpecialPalette23, kRawData, false },
+ { k1SpecialPalette24, kRawData, false },
+ { k1SpecialPalette25, kRawData, false },
+ { k1SpecialPalette26, kRawData, false },
+ { k1SpecialPalette27, kRawData, false },
+ { k1SpecialPalette28, kRawData, false },
+ { k1SpecialPalette29, kRawData, false },
+ { k1SpecialPalette30, kRawData, false },
+ { k1SpecialPalette31, kRawData, false },
+ { k1SpecialPalette32, kRawData, false },
+ { k1SpecialPalette33, kRawData, false },
// CREDITS (used in FM-TOWNS and AMIGA)
- { k1CreditsStrings, kTypeRawData, true },
+ { k1CreditsStrings, kRawData, true },
// FM-TOWNS specific
- { k1TownsMusicFadeTable, k3TypeRaw16to8, false },
- { k1TownsSFXwdTable, kTypeTownsWDSfxTable, false },
- { k1TownsSFXbtTable, kTypeRawData, false },
- { k1TownsCDATable, kTypeRawData, false },
+ { k1TownsMusicFadeTable, kRawData, false },
+ { k1TownsSFXwdTable, kRawData, false },
+ { k1TownsSFXbtTable, kRawData, false },
+ { k1TownsCDATable, kRawData, false },
// PC98 specific
- { k1PC98StoryStrings, kTypeStringList, true },
- { k1PC98IntroSfx, kTypeRawData, false },
+ { k1PC98StoryStrings, kStringList, true },
+ { k1PC98IntroSfx, kRawData, false },
// AMIGA specific
- { k1AmigaIntroSFXTable, kTypeAmigaSfxTable, false },
- { k1AmigaGameSFXTable, kTypeAmigaSfxTable, false },
+ { k1AmigaIntroSFXTable, kAmigaSfxTable, false },
+ { k1AmigaGameSFXTable, kAmigaSfxTable, false },
// HAND OF FATE
// Sequence Player
- { k2SeqplayPakFiles, kTypeStringList, false },
- { k2SeqplayCredits, kTypeRawData, false },
- { k2SeqplayCreditsSpecial, kTypeStringList, false },
- { k2SeqplayStrings, kTypeStringList, true },
- { k2SeqplaySfxFiles, k2TypeSoundList, false },
- { k2SeqplayTlkFiles, k2TypeLangSoundList, true },
- { k2SeqplaySeqData, k2TypeSeqData, false },
- { k2SeqplayIntroTracks, kTypeStringList, false },
- { k2SeqplayFinaleTracks, kTypeStringList, false },
- { k2SeqplayIntroCDA, kTypeRawData, false },
- { k2SeqplayFinaleCDA, kTypeRawData, false },
- { k2SeqplayShapeAnimData, k2TypeShpDataV1, false },
+ { k2SeqplayPakFiles, kStringList, false },
+ { k2SeqplayCredits, kRawData, false },
+ { k2SeqplayCreditsSpecial, kStringList, false },
+ { k2SeqplayStrings, kStringList, true },
+ { k2SeqplaySfxFiles, kStringList, false },
+ { k2SeqplayTlkFiles, kStringList, true },
+ { k2SeqplaySeqData, k2SeqData, false },
+ { k2SeqplayIntroTracks, kStringList, false },
+ { k2SeqplayFinaleTracks, kStringList, false },
+ { k2SeqplayIntroCDA, kRawData, false },
+ { k2SeqplayFinaleCDA, kRawData, false },
+ { k2SeqplayShapeAnimData, k2SeqItemAnimData, false },
// Ingame
- { k2IngamePakFiles, kTypeStringList, false },
- { k2IngameSfxFiles, k2TypeSize10StringList, false },
- { k2IngameSfxIndex, kTypeRawData, false },
- { k2IngameTracks, kTypeStringList, false },
- { k2IngameCDA, kTypeRawData, false },
- { k2IngameTalkObjIndex, kTypeRawData, false },
- { k2IngameTimJpStrings, kTypeStringList, false },
- { k2IngameShapeAnimData, k2TypeShpDataV2, false },
- { k2IngameTlkDemoStrings, kTypeStringList, true },
+ { k2IngamePakFiles, kStringList, false },
+ { k2IngameSfxFiles, kStringList, false },
+ { k2IngameSfxIndex, kRawData, false },
+ { k2IngameTracks, kStringList, false },
+ { k2IngameCDA, kRawData, false },
+ { k2IngameTalkObjIndex, kRawData, false },
+ { k2IngameTimJpStrings, kStringList, false },
+ { k2IngameShapeAnimData, k2ItemAnimDefinition, false },
+ { k2IngameTlkDemoStrings, kStringList, true },
// MALCOLM'S REVENGE
- { k3MainMenuStrings, kTypeStringList, false },
- { k3MusicFiles, k2TypeSoundList, false },
- { k3ScoreTable, kTypeRawData, false },
- { k3SfxFiles, k2TypeSfxList, false },
- { k3SfxMap, k3TypeRaw16to8, false },
- { k3ItemAnimData, k3TypeShpData, false },
- { k3ItemMagicTable, k3TypeRaw16to8, false },
- { k3ItemStringMap, kTypeRawData, false },
+ { k3MainMenuStrings, kStringList, false },
+ { k3MusicFiles, kStringList, false },
+ { k3ScoreTable, kRawData, false },
+ { k3SfxFiles, kStringList, false },
+ { k3SfxMap, kRawData, false },
+ { k3ItemAnimData, k2ItemAnimDefinition, false },
+ { k3ItemMagicTable, kRawData, false },
+ { k3ItemStringMap, kRawData, false },
// EYE OF THE BEHOLDER COMMON
- { kEoBBaseChargenStrings1, kTypeStringList, true },
- { kEoBBaseChargenStrings2, kTypeStringList, true },
- { kEoBBaseChargenStartLevels, kTypeRawData, false },
- { kEoBBaseChargenStatStrings, kTypeStringList, true},
- { kEoBBaseChargenRaceSexStrings, kTypeStringList, true },
- { kEoBBaseChargenClassStrings, kTypeStringList, true },
- { kEoBBaseChargenAlignmentStrings, kTypeStringList, true },
- { kEoBBaseChargenEnterGameStrings, kTypeStringList, true },
- { kEoBBaseChargenClassMinStats, k3TypeRaw16to8, false },
- { kEoBBaseChargenRaceMinStats, k3TypeRaw16to8, false },
- { kEoBBaseChargenRaceMaxStats, kLoLTypeRaw16, false },
-
- { kEoBBaseSaveThrowTable1, kTypeRawData, false },
- { kEoBBaseSaveThrowTable2, kTypeRawData, false },
- { kEoBBaseSaveThrowTable3, kTypeRawData, false },
- { kEoBBaseSaveThrowTable4, kTypeRawData, false },
- { kEoBBaseSaveThrwLvlIndex, kTypeRawData, false },
- { kEoBBaseSaveThrwModDiv, kTypeRawData, false },
- { kEoBBaseSaveThrwModExt, kTypeRawData, false },
-
- { kEoBBasePryDoorStrings, kTypeStringList, true },
- { kEoBBaseWarningStrings, kTypeStringList, true },
-
- { kEoBBaseItemSuffixStringsRings, kTypeStringList, true },
- { kEoBBaseItemSuffixStringsPotions, kTypeStringList, true },
- { kEoBBaseItemSuffixStringsWands, kTypeStringList, true },
-
- { kEoBBaseRipItemStrings, kTypeStringList, true },
- { kEoBBaseCursedString, kTypeStringList, true },
- { kEoBBaseEnchantedString, kTypeStringList, false },
- { kEoBBaseMagicObjectStrings, kTypeStringList, true },
- { kEoBBaseMagicObject5String, kTypeStringList, true },
- { kEoBBasePatternSuffix, kTypeStringList, true },
- { kEoBBasePatternGrFix1, kTypeStringList, true },
- { kEoBBasePatternGrFix2, kTypeStringList, true },
- { kEoBBaseValidateArmorString, kTypeStringList, true },
- { kEoBBaseValidateCursedString, kTypeStringList, true },
- { kEoBBaseValidateNoDropString, kTypeStringList, true },
- { kEoBBasePotionStrings, kTypeStringList, true },
- { kEoBBaseWandString, kTypeStringList, true },
- { kEoBBaseItemMisuseStrings, kTypeStringList, true },
-
- { kEoBBaseTakenStrings, kTypeStringList, true },
- { kEoBBasePotionEffectStrings, kTypeStringList, true },
-
- { kEoBBaseYesNoStrings, kTypeStringList, true },
- { kRpgCommonMoreStrings, kTypeStringList, true },
- { kEoBBaseNpcMaxStrings, kTypeStringList, true },
- { kEoBBaseOkStrings, kTypeStringList, true },
- { kEoBBaseNpcJoinStrings, kTypeStringList, true },
- { kEoBBaseCancelStrings, kTypeStringList, true },
- { kEoBBaseAbortStrings, kTypeStringList, true },
-
- { kEoBBaseMenuStringsMain, kTypeStringList, true },
- { kEoBBaseMenuStringsSaveLoad, kTypeStringList, true },
- { kEoBBaseMenuStringsOnOff, kTypeStringList, true },
- { kEoBBaseMenuStringsSpells, kTypeStringList, true },
- { kEoBBaseMenuStringsRest, kTypeStringList, true },
- { kEoBBaseMenuStringsDrop, kTypeStringList, true },
- { kEoBBaseMenuStringsExit, kTypeStringList, true },
- { kEoBBaseMenuStringsStarve, kTypeStringList, true },
- { kEoBBaseMenuStringsScribe, kTypeStringList, true },
- { kEoBBaseMenuStringsDrop2, kTypeStringList, true },
- { kEoBBaseMenuStringsHead, kTypeStringList, true },
- { kEoBBaseMenuStringsPoison, kTypeStringList, true },
- { kEoBBaseMenuStringsMgc, kTypeStringList, true },
- { kEoBBaseMenuStringsPrefs, kTypeStringList, true },
- { kEoBBaseMenuStringsRest2, kTypeStringList, true },
- { kEoBBaseMenuStringsRest3, kTypeStringList, true },
- { kEoBBaseMenuStringsRest4, kTypeStringList, true },
- { kEoBBaseMenuStringsDefeat, kTypeStringList, true },
- { kEoBBaseMenuStringsTransfer, kTypeStringList, true },
- { kEoBBaseMenuStringsSpec, kTypeStringList, true },
- { kEoBBaseMenuStringsSpellNo, kTypeStringList, false },
- { kEoBBaseMenuYesNoStrings, kTypeStringList, true },
-
- { kEoBBaseSpellLevelsMage, kTypeRawData, false },
- { kEoBBaseSpellLevelsCleric, kTypeRawData, false },
- { kEoBBaseNumSpellsCleric, kTypeRawData, false },
- { kEoBBaseNumSpellsWisAdj, kTypeRawData, false },
- { kEoBBaseNumSpellsPal, kTypeRawData, false },
- { kEoBBaseNumSpellsMage, kTypeRawData, false },
-
- { kEoBBaseCharGuiStringsHp, kTypeStringList, true },
- { kEoBBaseCharGuiStringsWp1, kTypeStringList, true },
- { kEoBBaseCharGuiStringsWp2, kTypeStringList, true },
- { kEoBBaseCharGuiStringsWr, kTypeStringList, true },
- { kEoBBaseCharGuiStringsSt1, kTypeStringList, true },
- { kEoBBaseCharGuiStringsSt2, kTypeStringList, true },
- { kEoBBaseCharGuiStringsIn, kTypeStringList, true },
-
- { kEoBBaseCharStatusStrings7, kTypeStringList, true },
- { kEoBBaseCharStatusStrings81, kTypeStringList, true },
- { kEoBBaseCharStatusStrings82, kTypeStringList, true },
- { kEoBBaseCharStatusStrings9, kTypeStringList, true },
- { kEoBBaseCharStatusStrings12, kTypeStringList, true },
- { kEoBBaseCharStatusStrings131, kTypeStringList, true },
- { kEoBBaseCharStatusStrings132, kTypeStringList, true },
-
- { kEoBBaseLevelGainStrings, kTypeStringList, true },
- { kEoBBaseExperienceTable0, kLoLTypeRaw32, false },
- { kEoBBaseExperienceTable1, kLoLTypeRaw32, false },
- { kEoBBaseExperienceTable2, kLoLTypeRaw32, false },
- { kEoBBaseExperienceTable3, kLoLTypeRaw32, false },
- { kEoBBaseExperienceTable4, kLoLTypeRaw32, false },
-
- { kEoBBaseWllFlagPreset, kTypeRawData, false },
- { kEoBBaseDscShapeCoords, kLoLTypeRaw16, false },
- { kEoBBaseDscDoorScaleOffs, kTypeRawData, false },
- { kEoBBaseDscDoorScaleMult1, kTypeRawData, false },
- { kEoBBaseDscDoorScaleMult2, kTypeRawData, false },
- { kEoBBaseDscDoorScaleMult3, kTypeRawData, false },
- { kEoBBaseDscDoorScaleMult4, kTypeRawData, false },
- { kEoBBaseDscDoorScaleMult5, kTypeRawData, false },
- { kEoBBaseDscDoorScaleMult6, kTypeRawData, false },
- { kEoBBaseDscDoorType5Offs, kTypeRawData, false },
- { kEoBBaseDscDoorXE, kTypeRawData, false },
- { kEoBBaseDscDoorY1, kTypeRawData, false },
- { kEoBBaseDscDoorY3, kTypeRawData, false },
- { kEoBBaseDscDoorY4, kTypeRawData, false },
- { kEoBBaseDscDoorY5, kTypeRawData, false },
- { kEoBBaseDscDoorY6, kTypeRawData, false },
- { kEoBBaseDscDoorY7, kTypeRawData, false },
- { kEoBBaseDscDoorCoordsExt, kLoLTypeRaw16, false },
-
- { kEoBBaseDscItemPosIndex, kTypeRawData, false },
- { kEoBBaseDscItemShpX, kLoLTypeRaw16, false },
- { kEoBBaseDscItemPosUnk, kTypeRawData, false },
- { kEoBBaseDscItemTileIndex, kTypeRawData, false },
- { kEoBBaseDscItemShapeMap, kTypeRawData, false },
- { kEoBBaseDscTelptrShpCoords, kTypeRawData, false },
-
- { kEoBBasePortalSeqData, kTypeRawData, false },
- { kEoBBaseManDef, kTypeRawData, true },
- { kEoBBaseManWord, kTypeStringList, true },
- { kEoBBaseManPrompt, kTypeStringList, true },
-
- { kEoBBaseDscMonsterFrmOffsTbl1, kTypeRawData, false },
- { kEoBBaseDscMonsterFrmOffsTbl2, kTypeRawData, false },
-
- { kEoBBaseInvSlotX, kLoLTypeRaw16, false },
- { kEoBBaseInvSlotY, kTypeRawData, false },
- { kEoBBaseSlotValidationFlags, kLoLTypeRaw16, false },
-
- { kEoBBaseProjectileWeaponTypes, kTypeRawData, false },
- { kEoBBaseWandTypes, kTypeRawData, false },
-
- { kEoBBaseDrawObjPosIndex, kTypeRawData, false },
- { kEoBBaseFlightObjFlipIndex, kTypeRawData, false },
- { kEoBBaseFlightObjShpMap, kTypeRawData, false },
- { kEoBBaseFlightObjSclIndex, kTypeRawData, false },
-
- { kEoBBaseBookNumbers, kTypeStringList, true },
- { kEoBBaseMageSpellsList, kTypeStringList, true },
- { kEoBBaseClericSpellsList, kTypeStringList, true },
- { kEoBBaseSpellNames, kTypeStringList, true },
-
- { kEoBBaseMagicStrings1, kTypeStringList, true },
- { kEoBBaseMagicStrings2, kTypeStringList, true },
- { kEoBBaseMagicStrings3, kTypeStringList, true },
- { kEoBBaseMagicStrings4, kTypeStringList, true },
- { kEoBBaseMagicStrings6, kTypeStringList, true },
- { kEoBBaseMagicStrings7, kTypeStringList, true },
- { kEoBBaseMagicStrings8, kTypeStringList, true },
-
- { kEoBBaseExpObjectTlMode, kTypeRawData, false },
- { kEoBBaseExpObjectTblIndex, kTypeRawData, false },
- { kEoBBaseExpObjectShpStart, kTypeRawData, false },
- { kEoBBaseExpObjectTbl1, kTypeRawData, false },
- { kEoBBaseExpObjectTbl2, kTypeRawData, false },
- { kEoBBaseExpObjectTbl3, kTypeRawData, false },
- { kEoBBaseExpObjectY, k3TypeRaw16to8, false },
-
- { kEoBBaseSparkDefSteps, kTypeRawData, false },
- { kEoBBaseSparkDefSubSteps, kTypeRawData, false },
- { kEoBBaseSparkDefShift, kTypeRawData, false },
- { kEoBBaseSparkDefAdd, kTypeRawData, false },
- { kEoBBaseSparkDefX, k3TypeRaw16to8, false },
- { kEoBBaseSparkDefY, kTypeRawData, false },
- { kEoBBaseSparkOfFlags1, kLoLTypeRaw32, false },
- { kEoBBaseSparkOfFlags2, kLoLTypeRaw32, false },
- { kEoBBaseSparkOfShift, kTypeRawData, false },
- { kEoBBaseSparkOfX, kTypeRawData, false },
- { kEoBBaseSparkOfY, kTypeRawData, false },
- { kEoBBaseSpellProperties, kTypeRawData, false },
- { kEoBBaseMagicFlightProps, kTypeRawData, false },
- { kEoBBaseTurnUndeadEffect, kTypeRawData, false },
- { kEoBBaseBurningHandsDest, kTypeRawData, false },
- { kEoBBaseConeOfColdDest1, kTypeRawData, false },
- { kEoBBaseConeOfColdDest2, kTypeRawData, false },
- { kEoBBaseConeOfColdDest3, kTypeRawData, false },
- { kEoBBaseConeOfColdDest4, kTypeRawData, false },
- { kEoBBaseConeOfColdGfxTbl, k3TypeRaw16to8, false },
+ { kEoBBaseChargenStrings1, kStringList, true },
+ { kEoBBaseChargenStrings2, kStringList, true },
+ { kEoBBaseChargenStartLevels, kRawData, false },
+ { kEoBBaseChargenStatStrings, kStringList, true},
+ { kEoBBaseChargenRaceSexStrings, kStringList, true },
+ { kEoBBaseChargenClassStrings, kStringList, true },
+ { kEoBBaseChargenAlignmentStrings, kStringList, true },
+ { kEoBBaseChargenEnterGameStrings, kStringList, true },
+ { kEoBBaseChargenClassMinStats, kRawData, false },
+ { kEoBBaseChargenRaceMinStats, kRawData, false },
+ { kEoBBaseChargenRaceMaxStats, kRawDataBe16, false },
+
+ { kEoBBaseSaveThrowTable1, kRawData, false },
+ { kEoBBaseSaveThrowTable2, kRawData, false },
+ { kEoBBaseSaveThrowTable3, kRawData, false },
+ { kEoBBaseSaveThrowTable4, kRawData, false },
+ { kEoBBaseSaveThrwLvlIndex, kRawData, false },
+ { kEoBBaseSaveThrwModDiv, kRawData, false },
+ { kEoBBaseSaveThrwModExt, kRawData, false },
+
+ { kEoBBasePryDoorStrings, kStringList, true },
+ { kEoBBaseWarningStrings, kStringList, true },
+
+ { kEoBBaseItemSuffixStringsRings, kStringList, true },
+ { kEoBBaseItemSuffixStringsPotions, kStringList, true },
+ { kEoBBaseItemSuffixStringsWands, kStringList, true },
+
+ { kEoBBaseRipItemStrings, kStringList, true },
+ { kEoBBaseCursedString, kStringList, true },
+ { kEoBBaseEnchantedString, kStringList, false },
+ { kEoBBaseMagicObjectStrings, kStringList, true },
+ { kEoBBaseMagicObjectString5, kStringList, true },
+ { kEoBBasePatternSuffix, kStringList, true },
+ { kEoBBasePatternGrFix1, kStringList, true },
+ { kEoBBasePatternGrFix2, kStringList, true },
+ { kEoBBaseValidateArmorString, kStringList, true },
+ { kEoBBaseValidateCursedString, kStringList, true },
+ { kEoBBaseValidateNoDropString, kStringList, true },
+ { kEoBBasePotionStrings, kStringList, true },
+ { kEoBBaseWandStrings, kStringList, true },
+ { kEoBBaseItemMisuseStrings, kStringList, true },
+
+ { kEoBBaseTakenStrings, kStringList, true },
+ { kEoBBasePotionEffectStrings, kStringList, true },
+
+ { kEoBBaseYesNoStrings, kStringList, true },
+ { kRpgCommonMoreStrings, kStringList, true },
+ { kEoBBaseNpcMaxStrings, kStringList, true },
+ { kEoBBaseOkStrings, kStringList, true },
+ { kEoBBaseNpcJoinStrings, kStringList, true },
+ { kEoBBaseCancelStrings, kStringList, true },
+ { kEoBBaseAbortStrings, kStringList, true },
+
+ { kEoBBaseMenuStringsMain, kStringList, true },
+ { kEoBBaseMenuStringsSaveLoad, kStringList, true },
+ { kEoBBaseMenuStringsOnOff, kStringList, true },
+ { kEoBBaseMenuStringsSpells, kStringList, true },
+ { kEoBBaseMenuStringsRest, kStringList, true },
+ { kEoBBaseMenuStringsDrop, kStringList, true },
+ { kEoBBaseMenuStringsExit, kStringList, true },
+ { kEoBBaseMenuStringsStarve, kStringList, true },
+ { kEoBBaseMenuStringsScribe, kStringList, true },
+ { kEoBBaseMenuStringsDrop2, kStringList, true },
+ { kEoBBaseMenuStringsHead, kStringList, true },
+ { kEoBBaseMenuStringsPoison, kStringList, true },
+ { kEoBBaseMenuStringsMgc, kStringList, true },
+ { kEoBBaseMenuStringsPrefs, kStringList, true },
+ { kEoBBaseMenuStringsRest2, kStringList, true },
+ { kEoBBaseMenuStringsRest3, kStringList, true },
+ { kEoBBaseMenuStringsRest4, kStringList, true },
+ { kEoBBaseMenuStringsDefeat, kStringList, true },
+ { kEoBBaseMenuStringsTransfer, kStringList, true },
+ { kEoBBaseMenuStringsSpec, kStringList, true },
+ { kEoBBaseMenuStringsSpellNo, kStringList, false },
+ { kEoBBaseMenuYesNoStrings, kStringList, true },
+
+ { kEoBBaseSpellLevelsMage, kRawData, false },
+ { kEoBBaseSpellLevelsCleric, kRawData, false },
+ { kEoBBaseNumSpellsCleric, kRawData, false },
+ { kEoBBaseNumSpellsWisAdj, kRawData, false },
+ { kEoBBaseNumSpellsPal, kRawData, false },
+ { kEoBBaseNumSpellsMage, kRawData, false },
+
+ { kEoBBaseCharGuiStringsHp, kStringList, true },
+ { kEoBBaseCharGuiStringsWp1, kStringList, true },
+ { kEoBBaseCharGuiStringsWp2, kStringList, true },
+ { kEoBBaseCharGuiStringsWr, kStringList, true },
+ { kEoBBaseCharGuiStringsSt1, kStringList, true },
+ { kEoBBaseCharGuiStringsSt2, kStringList, true },
+ { kEoBBaseCharGuiStringsIn, kStringList, true },
+
+ { kEoBBaseCharStatusStrings7, kStringList, true },
+ { kEoBBaseCharStatusStrings81, kStringList, true },
+ { kEoBBaseCharStatusStrings82, kStringList, true },
+ { kEoBBaseCharStatusStrings9, kStringList, true },
+ { kEoBBaseCharStatusStrings12, kStringList, true },
+ { kEoBBaseCharStatusStrings131, kStringList, true },
+ { kEoBBaseCharStatusStrings132, kStringList, true },
+
+ { kEoBBaseLevelGainStrings, kStringList, true },
+ { kEoBBaseExperienceTable0, kRawDataBe32, false },
+ { kEoBBaseExperienceTable1, kRawDataBe32, false },
+ { kEoBBaseExperienceTable2, kRawDataBe32, false },
+ { kEoBBaseExperienceTable3, kRawDataBe32, false },
+ { kEoBBaseExperienceTable4, kRawDataBe32, false },
+
+ { kEoBBaseWllFlagPreset, kRawData, false },
+ { kEoBBaseDscShapeCoords, kRawDataBe16, false },
+ { kEoBBaseDscDoorScaleOffs, kRawData, false },
+ { kEoBBaseDscDoorScaleMult1, kRawData, false },
+ { kEoBBaseDscDoorScaleMult2, kRawData, false },
+ { kEoBBaseDscDoorScaleMult3, kRawData, false },
+ { kEoBBaseDscDoorScaleMult4, kRawData, false },
+ { kEoBBaseDscDoorScaleMult5, kRawData, false },
+ { kEoBBaseDscDoorScaleMult6, kRawData, false },
+ { kEoBBaseDscDoorType5Offs, kRawData, false },
+ { kEoBBaseDscDoorXE, kRawData, false },
+ { kEoBBaseDscDoorY1, kRawData, false },
+ { kEoBBaseDscDoorY3, kRawData, false },
+ { kEoBBaseDscDoorY4, kRawData, false },
+ { kEoBBaseDscDoorY5, kRawData, false },
+ { kEoBBaseDscDoorY6, kRawData, false },
+ { kEoBBaseDscDoorY7, kRawData, false },
+ { kEoBBaseDscDoorCoordsExt, kRawDataBe16, false },
+
+ { kEoBBaseDscItemPosIndex, kRawData, false },
+ { kEoBBaseDscItemShpX, kRawDataBe16, false },
+ { kEoBBaseDscItemScaleIndex, kRawData, false },
+ { kEoBBaseDscItemTileIndex, kRawData, false },
+ { kEoBBaseDscItemShapeMap, kRawData, false },
+ { kEoBBaseDscTelptrShpCoords, kRawData, false },
+
+ { kEoBBasePortalSeqData, kRawData, false },
+ { kEoBBaseManDef, kRawData, true },
+ { kEoBBaseManWord, kStringList, true },
+ { kEoBBaseManPrompt, kStringList, true },
+
+ { kEoBBaseDscMonsterFrmOffsTbl1, kRawData, false },
+ { kEoBBaseDscMonsterFrmOffsTbl2, kRawData, false },
+
+ { kEoBBaseInvSlotX, kRawDataBe16, false },
+ { kEoBBaseInvSlotY, kRawData, false },
+ { kEoBBaseSlotValidationFlags, kRawDataBe16, false },
+
+ { kEoBBaseProjectileWeaponTypes, kRawData, false },
+ { kEoBBaseWandTypes, kRawData, false },
+
+ { kEoBBaseDrawObjPosIndex, kRawData, false },
+ { kEoBBaseFlightObjFlipIndex, kRawData, false },
+ { kEoBBaseFlightObjShpMap, kRawData, false },
+ { kEoBBaseFlightObjSclIndex, kRawData, false },
+
+ { kEoBBaseBookNumbers, kStringList, true },
+ { kEoBBaseMageSpellsList, kStringList, true },
+ { kEoBBaseClericSpellsList, kStringList, true },
+ { kEoBBaseSpellNames, kStringList, true },
+
+ { kEoBBaseMagicStrings1, kStringList, true },
+ { kEoBBaseMagicStrings2, kStringList, true },
+ { kEoBBaseMagicStrings3, kStringList, true },
+ { kEoBBaseMagicStrings4, kStringList, true },
+ { kEoBBaseMagicStrings6, kStringList, true },
+ { kEoBBaseMagicStrings7, kStringList, true },
+ { kEoBBaseMagicStrings8, kStringList, true },
+
+ { kEoBBaseExpObjectTlMode, kRawData, false },
+ { kEoBBaseExpObjectTblIndex, kRawData, false },
+ { kEoBBaseExpObjectShpStart, kRawData, false },
+ { kEoBBaseExpObjectTbl1, kRawData, false },
+ { kEoBBaseExpObjectTbl2, kRawData, false },
+ { kEoBBaseExpObjectTbl3, kRawData, false },
+ { kEoBBaseExpObjectY, kRawData, false },
+
+ { kEoBBaseSparkDefSteps, kRawData, false },
+ { kEoBBaseSparkDefSubSteps, kRawData, false },
+ { kEoBBaseSparkDefShift, kRawData, false },
+ { kEoBBaseSparkDefAdd, kRawData, false },
+ { kEoBBaseSparkDefX, kRawData, false },
+ { kEoBBaseSparkDefY, kRawData, false },
+ { kEoBBaseSparkOfFlags1, kRawDataBe32, false },
+ { kEoBBaseSparkOfFlags2, kRawDataBe32, false },
+ { kEoBBaseSparkOfShift, kRawData, false },
+ { kEoBBaseSparkOfX, kRawData, false },
+ { kEoBBaseSparkOfY, kRawData, false },
+ { kEoBBaseSpellProperties, kRawData, false },
+ { kEoBBaseMagicFlightProps, kRawData, false },
+ { kEoBBaseTurnUndeadEffect, kRawData, false },
+ { kEoBBaseBurningHandsDest, kRawData, false },
+ { kEoBBaseConeOfColdDest1, kRawData, false },
+ { kEoBBaseConeOfColdDest2, kRawData, false },
+ { kEoBBaseConeOfColdDest3, kRawData, false },
+ { kEoBBaseConeOfColdDest4, kRawData, false },
+ { kEoBBaseConeOfColdGfxTbl, kRawData, false },
// EYE OF THE BEHOLDER I
- { kEoB1MainMenuStrings, kTypeStringList, true },
- { kEoB1BonusStrings, kTypeStringList, true },
-
- { kEoB1IntroFilesOpening, kTypeStringList, false },
- { kEoB1IntroFilesTower, kTypeStringList, false },
- { kEoB1IntroFilesOrb, kTypeStringList, false },
- { kEoB1IntroFilesWdEntry, kTypeStringList, false },
- { kEoB1IntroFilesKing, kTypeStringList, false },
- { kEoB1IntroFilesHands, kTypeStringList, false },
- { kEoB1IntroFilesWdExit, kTypeStringList, false },
- { kEoB1IntroFilesTunnel, kTypeStringList, false },
- { kEoB1IntroOpeningFrmDelay, k3TypeRaw16to8, false },
- { kEoB1IntroWdEncodeX, kTypeRawData, false },
- { kEoB1IntroWdEncodeY, kTypeRawData, false },
- { kEoB1IntroWdEncodeWH, kTypeRawData, false },
- { kEoB1IntroWdDsX, kLoLTypeRaw16, false },
- { kEoB1IntroWdDsY, kTypeRawData, false },
- { kEoB1IntroTvlX1, kTypeRawData, false },
- { kEoB1IntroTvlY1, kTypeRawData, false },
- { kEoB1IntroTvlX2, kTypeRawData, false },
- { kEoB1IntroTvlY2, kTypeRawData, false },
- { kEoB1IntroTvlW, kTypeRawData, false },
- { kEoB1IntroTvlH, kTypeRawData, false },
-
- { kEoB1DoorShapeDefs, kTypeRawData, false },
- { kEoB1DoorSwitchShapeDefs, kTypeRawData, false },
- { kEoB1DoorSwitchCoords, kTypeRawData, false },
- { kEoB1MonsterProperties, kTypeRawData, false },
- { kEoB1EnemyMageSpellList, kTypeRawData, false },
- { kEoB1EnemyMageSfx, kTypeRawData, false },
- { kEoB1BeholderSpellList, kTypeRawData, false },
- { kEoB1BeholderSfx, kTypeRawData, false },
- { kEoB1TurnUndeadString, kTypeStringList, true },
-
- { kEoB1CgaMappingDefault, kTypeRawData, false },
- { kEoB1CgaMappingAlt, kTypeRawData, false },
- { kEoB1CgaMappingInv, kTypeRawData, false },
- { kEoB1CgaMappingItemsL, kTypeRawData, false },
- { kEoB1CgaMappingItemsS, kTypeRawData, false },
- { kEoB1CgaMappingThrown, kTypeRawData, false },
- { kEoB1CgaMappingIcons, kTypeRawData, false },
- { kEoB1CgaMappingDeco, kTypeRawData, false },
- { kEoB1CgaLevelMappingIndex, kTypeRawData, false },
- { kEoB1CgaMappingLevel0, kTypeRawData, false },
- { kEoB1CgaMappingLevel1, kTypeRawData, false },
- { kEoB1CgaMappingLevel2, kTypeRawData, false },
- { kEoB1CgaMappingLevel3, kTypeRawData, false },
- { kEoB1CgaMappingLevel4, kTypeRawData, false },
-
- { kEoB1NpcShpData, kTypeRawData, false },
- { kEoB1NpcSubShpIndex1, kTypeRawData, false },
- { kEoB1NpcSubShpIndex2, kTypeRawData, false },
- { kEoB1NpcSubShpY, kTypeRawData, false },
- { kEoB1Npc0Strings, kTypeStringList, true },
- { kEoB1Npc11Strings, kTypeStringList, true },
- { kEoB1Npc12Strings, kTypeStringList, true },
- { kEoB1Npc21Strings, kTypeStringList, true },
- { kEoB1Npc22Strings, kTypeStringList, true },
- { kEoB1Npc31Strings, kTypeStringList, true },
- { kEoB1Npc32Strings, kTypeStringList, true },
- { kEoB1Npc4Strings, kTypeStringList, true },
- { kEoB1Npc5Strings, kTypeStringList, true },
- { kEoB1Npc6Strings, kTypeStringList, true },
- { kEoB1Npc7Strings, kTypeStringList, true },
+ { kEoB1MainMenuStrings, kStringList, true },
+ { kEoB1BonusStrings, kStringList, true },
+
+ { kEoB1IntroFilesOpening, kStringList, false },
+ { kEoB1IntroFilesTower, kStringList, false },
+ { kEoB1IntroFilesOrb, kStringList, false },
+ { kEoB1IntroFilesWdEntry, kStringList, false },
+ { kEoB1IntroFilesKing, kStringList, false },
+ { kEoB1IntroFilesHands, kStringList, false },
+ { kEoB1IntroFilesWdExit, kStringList, false },
+ { kEoB1IntroFilesTunnel, kStringList, false },
+ { kEoB1IntroOpeningFrmDelay, kRawData, false },
+ { kEoB1IntroWdEncodeX, kRawData, false },
+ { kEoB1IntroWdEncodeY, kRawData, false },
+ { kEoB1IntroWdEncodeWH, kRawData, false },
+ { kEoB1IntroWdDsX, kRawDataBe16, false },
+ { kEoB1IntroWdDsY, kRawData, false },
+ { kEoB1IntroTvlX1, kRawData, false },
+ { kEoB1IntroTvlY1, kRawData, false },
+ { kEoB1IntroTvlX2, kRawData, false },
+ { kEoB1IntroTvlY2, kRawData, false },
+ { kEoB1IntroTvlW, kRawData, false },
+ { kEoB1IntroTvlH, kRawData, false },
+
+ { kEoB1DoorShapeDefs, kRawData, false },
+ { kEoB1DoorSwitchShapeDefs, kRawData, false },
+ { kEoB1DoorSwitchCoords, kRawData, false },
+ { kEoB1MonsterProperties, kRawData, false },
+ { kEoB1EnemyMageSpellList, kRawData, false },
+ { kEoB1EnemyMageSfx, kRawData, false },
+ { kEoB1BeholderSpellList, kRawData, false },
+ { kEoB1BeholderSfx, kRawData, false },
+ { kEoB1TurnUndeadString, kStringList, true },
+
+ { kEoB1CgaMappingDefault, kRawData, false },
+ { kEoB1CgaMappingAlt, kRawData, false },
+ { kEoB1CgaMappingInv, kRawData, false },
+ { kEoB1CgaMappingItemsL, kRawData, false },
+ { kEoB1CgaMappingItemsS, kRawData, false },
+ { kEoB1CgaMappingThrown, kRawData, false },
+ { kEoB1CgaMappingIcons, kRawData, false },
+ { kEoB1CgaMappingDeco, kRawData, false },
+ { kEoB1CgaLevelMappingIndex, kRawData, false },
+ { kEoB1CgaMappingLevel0, kRawData, false },
+ { kEoB1CgaMappingLevel1, kRawData, false },
+ { kEoB1CgaMappingLevel2, kRawData, false },
+ { kEoB1CgaMappingLevel3, kRawData, false },
+ { kEoB1CgaMappingLevel4, kRawData, false },
+
+ { kEoB1NpcShpData, kRawData, false },
+ { kEoB1NpcSubShpIndex1, kRawData, false },
+ { kEoB1NpcSubShpIndex2, kRawData, false },
+ { kEoB1NpcSubShpY, kRawData, false },
+ { kEoB1Npc0Strings, kStringList, true },
+ { kEoB1Npc11Strings, kStringList, true },
+ { kEoB1Npc12Strings, kStringList, true },
+ { kEoB1Npc21Strings, kStringList, true },
+ { kEoB1Npc22Strings, kStringList, true },
+ { kEoB1Npc31Strings, kStringList, true },
+ { kEoB1Npc32Strings, kStringList, true },
+ { kEoB1Npc4Strings, kStringList, true },
+ { kEoB1Npc5Strings, kStringList, true },
+ { kEoB1Npc6Strings, kStringList, true },
+ { kEoB1Npc7Strings, kStringList, true },
// EYE OF THE BEHOLDER II
- { kEoB2MainMenuStrings, kTypeStringList, true },
-
- { kEoB2TransferPortraitFrames, kLoLTypeRaw16, false },
- { kEoB2TransferConvertTable, kTypeRawData, false },
- { kEoB2TransferItemTable, kTypeRawData, false },
- { kEoB2TransferExpTable, kLoLTypeRaw32, false },
- { kEoB2TransferStrings1, kTypeStringList, true },
- { kEoB2TransferStrings2, kTypeStringList, true },
- { kEoB2TransferLabels, kTypeStringList, true },
-
- { kEoB2IntroStrings, k2TypeSfxList, true },
- { kEoB2IntroCPSFiles, kTypeStringList, true },
- { kEob2IntroAnimData00, kEoB2TypeSeqData, false },
- { kEob2IntroAnimData01, kEoB2TypeSeqData, false },
- { kEob2IntroAnimData02, kEoB2TypeSeqData, false },
- { kEob2IntroAnimData03, kEoB2TypeSeqData, false },
- { kEob2IntroAnimData04, kEoB2TypeSeqData, false },
- { kEob2IntroAnimData05, kEoB2TypeSeqData, false },
- { kEob2IntroAnimData06, kEoB2TypeSeqData, false },
- { kEob2IntroAnimData07, kEoB2TypeSeqData, false },
- { kEob2IntroAnimData08, kEoB2TypeSeqData, false },
- { kEob2IntroAnimData09, kEoB2TypeSeqData, false },
- { kEob2IntroAnimData10, kEoB2TypeSeqData, false },
- { kEob2IntroAnimData11, kEoB2TypeSeqData, false },
- { kEob2IntroAnimData12, kEoB2TypeSeqData, false },
- { kEob2IntroAnimData13, kEoB2TypeSeqData, false },
- { kEob2IntroAnimData14, kEoB2TypeSeqData, false },
- { kEob2IntroAnimData15, kEoB2TypeSeqData, false },
- { kEob2IntroAnimData16, kEoB2TypeSeqData, false },
- { kEob2IntroAnimData17, kEoB2TypeSeqData, false },
- { kEob2IntroAnimData18, kEoB2TypeSeqData, false },
- { kEob2IntroAnimData19, kEoB2TypeSeqData, false },
- { kEob2IntroAnimData20, kEoB2TypeSeqData, false },
- { kEob2IntroAnimData21, kEoB2TypeSeqData, false },
- { kEob2IntroAnimData22, kEoB2TypeSeqData, false },
- { kEob2IntroAnimData23, kEoB2TypeSeqData, false },
- { kEob2IntroAnimData24, kEoB2TypeSeqData, false },
- { kEob2IntroAnimData25, kEoB2TypeSeqData, false },
- { kEob2IntroAnimData26, kEoB2TypeSeqData, false },
- { kEob2IntroAnimData27, kEoB2TypeSeqData, false },
- { kEob2IntroAnimData28, kEoB2TypeSeqData, false },
- { kEob2IntroAnimData29, kEoB2TypeSeqData, false },
- { kEob2IntroAnimData30, kEoB2TypeSeqData, false },
- { kEob2IntroAnimData31, kEoB2TypeSeqData, false },
- { kEob2IntroAnimData32, kEoB2TypeSeqData, false },
- { kEob2IntroAnimData33, kEoB2TypeSeqData, false },
- { kEob2IntroAnimData34, kEoB2TypeSeqData, false },
- { kEob2IntroAnimData35, kEoB2TypeSeqData, false },
- { kEob2IntroAnimData36, kEoB2TypeSeqData, false },
- { kEob2IntroAnimData37, kEoB2TypeSeqData, false },
- { kEob2IntroAnimData38, kEoB2TypeSeqData, false },
- { kEob2IntroAnimData39, kEoB2TypeSeqData, false },
- { kEob2IntroAnimData40, kEoB2TypeSeqData, false },
- { kEob2IntroAnimData41, kEoB2TypeSeqData, false },
- { kEob2IntroAnimData42, kEoB2TypeSeqData, false },
- { kEob2IntroAnimData43, kEoB2TypeSeqData, false },
- { kEoB2IntroShapes00, kEoB2TypeShapeData, false },
- { kEoB2IntroShapes01, kEoB2TypeShapeData, false },
- { kEoB2IntroShapes04, kEoB2TypeShapeData, false },
- { kEoB2IntroShapes07, kEoB2TypeShapeData, false },
-
- { kEoB2FinaleStrings, k2TypeSfxList, true },
- { kEoB2CreditsData, kTypeRawData, true },
- { kEoB2FinaleCPSFiles, kTypeStringList, true },
- { kEob2FinaleAnimData00, kEoB2TypeSeqData, false },
- { kEob2FinaleAnimData01, kEoB2TypeSeqData, false },
- { kEob2FinaleAnimData02, kEoB2TypeSeqData, false },
- { kEob2FinaleAnimData03, kEoB2TypeSeqData, false },
- { kEob2FinaleAnimData04, kEoB2TypeSeqData, false },
- { kEob2FinaleAnimData05, kEoB2TypeSeqData, false },
- { kEob2FinaleAnimData06, kEoB2TypeSeqData, false },
- { kEob2FinaleAnimData07, kEoB2TypeSeqData, false },
- { kEob2FinaleAnimData08, kEoB2TypeSeqData, false },
- { kEob2FinaleAnimData09, kEoB2TypeSeqData, false },
- { kEob2FinaleAnimData10, kEoB2TypeSeqData, false },
- { kEob2FinaleAnimData11, kEoB2TypeSeqData, false },
- { kEob2FinaleAnimData12, kEoB2TypeSeqData, false },
- { kEob2FinaleAnimData13, kEoB2TypeSeqData, false },
- { kEob2FinaleAnimData14, kEoB2TypeSeqData, false },
- { kEob2FinaleAnimData15, kEoB2TypeSeqData, false },
- { kEob2FinaleAnimData16, kEoB2TypeSeqData, false },
- { kEob2FinaleAnimData17, kEoB2TypeSeqData, false },
- { kEob2FinaleAnimData18, kEoB2TypeSeqData, false },
- { kEob2FinaleAnimData19, kEoB2TypeSeqData, false },
- { kEob2FinaleAnimData20, kEoB2TypeSeqData, false },
- { kEoB2FinaleShapes00, kEoB2TypeShapeData, false },
- { kEoB2FinaleShapes03, kEoB2TypeShapeData, false },
- { kEoB2FinaleShapes07, kEoB2TypeShapeData, false },
- { kEoB2FinaleShapes09, kEoB2TypeShapeData, false },
- { kEoB2FinaleShapes10, kEoB2TypeShapeData, false },
- { kEoB2NpcShapeData, kTypeRawData, false },
- { kEoBBaseClassModifierFlags, kTypeRawData, false },
- { kEoBBaseMonsterStepTable01, kTypeRawData, false },
- { kEoBBaseMonsterStepTable02, kTypeRawData, false },
- { kEoBBaseMonsterStepTable1, kTypeRawData, false },
- { kEoBBaseMonsterStepTable2, k3TypeRaw16to8, false },
- { kEoBBaseMonsterStepTable3, k3TypeRaw16to8, false },
- { kEoBBaseMonsterCloseAttPosTable1, kTypeRawData, false },
- { kEoBBaseMonsterCloseAttPosTable21, kTypeRawData, false },
- { kEoBBaseMonsterCloseAttPosTable22, kTypeRawData, false },
- { kEoBBaseMonsterCloseAttUnkTable, kTypeRawData, false },
- { kEoBBaseMonsterCloseAttChkTable1, kTypeRawData, false },
- { kEoBBaseMonsterCloseAttChkTable2, kTypeRawData, false },
- { kEoBBaseMonsterCloseAttDstTable1, kTypeRawData, false },
- { kEoBBaseMonsterCloseAttDstTable2, kTypeRawData, false },
- { kEoBBaseMonsterProximityTable, kTypeRawData, false },
- { kEoBBaseFindBlockMonstersTable, kTypeRawData, false },
- { kEoBBaseMonsterDirChangeTable, kTypeRawData, false },
- { kEoBBaseMonsterDistAttStrings, kTypeStringList, true },
- { kEoBBaseEncodeMonsterDefs, kLoLTypeRaw16, false },
- { kEoBBaseNpcPresets, kEoBTypeNpcData, false },
- { kEoB2Npc1Strings, kTypeStringList, true },
- { kEoB2Npc2Strings, kTypeStringList, true },
- { kEoB2MonsterDustStrings, kTypeStringList, true },
- { kEoB2DreamSteps, kTypeRawData, false },
- { kEoB2KheldranStrings, kTypeStringList, true },
- { kEoB2HornStrings, kTypeStringList, true },
- { kEoB2HornSounds, kTypeRawData, false },
- { kEoB2WallOfForceDsX, kLoLTypeRaw16, false },
- { kEoB2WallOfForceDsY, kTypeRawData, false },
- { kEoB2WallOfForceNumW, kTypeRawData, false },
- { kEoB2WallOfForceNumH, kTypeRawData, false },
- { kEoB2WallOfForceShpId, kTypeRawData, false },
+ { kEoB2MainMenuStrings, kStringList, true },
+
+ { kEoB2TransferPortraitFrames, kRawDataBe16, false },
+ { kEoB2TransferConvertTable, kRawData, false },
+ { kEoB2TransferItemTable, kRawData, false },
+ { kEoB2TransferExpTable, kRawDataBe32, false },
+ { kEoB2TransferStrings1, kStringList, true },
+ { kEoB2TransferStrings2, kStringList, true },
+ { kEoB2TransferLabels, kStringList, true },
+
+ { kEoB2IntroStrings, kStringList, true },
+ { kEoB2IntroCPSFiles, kStringList, true },
+ { kEoB2IntroAnimData00, kEoB2SequenceData, false },
+ { kEoB2IntroAnimData01, kEoB2SequenceData, false },
+ { kEoB2IntroAnimData02, kEoB2SequenceData, false },
+ { kEoB2IntroAnimData03, kEoB2SequenceData, false },
+ { kEoB2IntroAnimData04, kEoB2SequenceData, false },
+ { kEoB2IntroAnimData05, kEoB2SequenceData, false },
+ { kEoB2IntroAnimData06, kEoB2SequenceData, false },
+ { kEoB2IntroAnimData07, kEoB2SequenceData, false },
+ { kEoB2IntroAnimData08, kEoB2SequenceData, false },
+ { kEoB2IntroAnimData09, kEoB2SequenceData, false },
+ { kEoB2IntroAnimData10, kEoB2SequenceData, false },
+ { kEoB2IntroAnimData11, kEoB2SequenceData, false },
+ { kEoB2IntroAnimData12, kEoB2SequenceData, false },
+ { kEoB2IntroAnimData13, kEoB2SequenceData, false },
+ { kEoB2IntroAnimData14, kEoB2SequenceData, false },
+ { kEoB2IntroAnimData15, kEoB2SequenceData, false },
+ { kEoB2IntroAnimData16, kEoB2SequenceData, false },
+ { kEoB2IntroAnimData17, kEoB2SequenceData, false },
+ { kEoB2IntroAnimData18, kEoB2SequenceData, false },
+ { kEoB2IntroAnimData19, kEoB2SequenceData, false },
+ { kEoB2IntroAnimData20, kEoB2SequenceData, false },
+ { kEoB2IntroAnimData21, kEoB2SequenceData, false },
+ { kEoB2IntroAnimData22, kEoB2SequenceData, false },
+ { kEoB2IntroAnimData23, kEoB2SequenceData, false },
+ { kEoB2IntroAnimData24, kEoB2SequenceData, false },
+ { kEoB2IntroAnimData25, kEoB2SequenceData, false },
+ { kEoB2IntroAnimData26, kEoB2SequenceData, false },
+ { kEoB2IntroAnimData27, kEoB2SequenceData, false },
+ { kEoB2IntroAnimData28, kEoB2SequenceData, false },
+ { kEoB2IntroAnimData29, kEoB2SequenceData, false },
+ { kEoB2IntroAnimData30, kEoB2SequenceData, false },
+ { kEoB2IntroAnimData31, kEoB2SequenceData, false },
+ { kEoB2IntroAnimData32, kEoB2SequenceData, false },
+ { kEoB2IntroAnimData33, kEoB2SequenceData, false },
+ { kEoB2IntroAnimData34, kEoB2SequenceData, false },
+ { kEoB2IntroAnimData35, kEoB2SequenceData, false },
+ { kEoB2IntroAnimData36, kEoB2SequenceData, false },
+ { kEoB2IntroAnimData37, kEoB2SequenceData, false },
+ { kEoB2IntroAnimData38, kEoB2SequenceData, false },
+ { kEoB2IntroAnimData39, kEoB2SequenceData, false },
+ { kEoB2IntroAnimData40, kEoB2SequenceData, false },
+ { kEoB2IntroAnimData41, kEoB2SequenceData, false },
+ { kEoB2IntroAnimData42, kEoB2SequenceData, false },
+ { kEoB2IntroAnimData43, kEoB2SequenceData, false },
+ { kEoB2IntroShapes00, kEoB2ShapeData, false },
+ { kEoB2IntroShapes01, kEoB2ShapeData, false },
+ { kEoB2IntroShapes04, kEoB2ShapeData, false },
+ { kEoB2IntroShapes07, kEoB2ShapeData, false },
+
+ { kEoB2FinaleStrings, kStringList, true },
+ { kEoB2CreditsData, kRawData, true },
+ { kEoB2FinaleCPSFiles, kStringList, true },
+ { kEoB2FinaleAnimData00, kEoB2SequenceData, false },
+ { kEoB2FinaleAnimData01, kEoB2SequenceData, false },
+ { kEoB2FinaleAnimData02, kEoB2SequenceData, false },
+ { kEoB2FinaleAnimData03, kEoB2SequenceData, false },
+ { kEoB2FinaleAnimData04, kEoB2SequenceData, false },
+ { kEoB2FinaleAnimData05, kEoB2SequenceData, false },
+ { kEoB2FinaleAnimData06, kEoB2SequenceData, false },
+ { kEoB2FinaleAnimData07, kEoB2SequenceData, false },
+ { kEoB2FinaleAnimData08, kEoB2SequenceData, false },
+ { kEoB2FinaleAnimData09, kEoB2SequenceData, false },
+ { kEoB2FinaleAnimData10, kEoB2SequenceData, false },
+ { kEoB2FinaleAnimData11, kEoB2SequenceData, false },
+ { kEoB2FinaleAnimData12, kEoB2SequenceData, false },
+ { kEoB2FinaleAnimData13, kEoB2SequenceData, false },
+ { kEoB2FinaleAnimData14, kEoB2SequenceData, false },
+ { kEoB2FinaleAnimData15, kEoB2SequenceData, false },
+ { kEoB2FinaleAnimData16, kEoB2SequenceData, false },
+ { kEoB2FinaleAnimData17, kEoB2SequenceData, false },
+ { kEoB2FinaleAnimData18, kEoB2SequenceData, false },
+ { kEoB2FinaleAnimData19, kEoB2SequenceData, false },
+ { kEoB2FinaleAnimData20, kEoB2SequenceData, false },
+ { kEoB2FinaleShapes00, kEoB2ShapeData, false },
+ { kEoB2FinaleShapes03, kEoB2ShapeData, false },
+ { kEoB2FinaleShapes07, kEoB2ShapeData, false },
+ { kEoB2FinaleShapes09, kEoB2ShapeData, false },
+ { kEoB2FinaleShapes10, kEoB2ShapeData, false },
+ { kEoB2NpcShapeData, kRawData, false },
+ { kEoBBaseClassModifierFlags, kRawData, false },
+ { kEoBBaseMonsterStepTable01, kRawData, false },
+ { kEoBBaseMonsterStepTable02, kRawData, false },
+ { kEoBBaseMonsterStepTable1, kRawData, false },
+ { kEoBBaseMonsterStepTable2, kRawData, false },
+ { kEoBBaseMonsterStepTable3, kRawData, false },
+ { kEoBBaseMonsterCloseAttPosTable1, kRawData, false },
+ { kEoBBaseMonsterCloseAttPosTable21, kRawData, false },
+ { kEoBBaseMonsterCloseAttPosTable22, kRawData, false },
+ { kEoBBaseMonsterCloseAttUnkTable, kRawData, false },
+ { kEoBBaseMonsterCloseAttChkTable1, kRawData, false },
+ { kEoBBaseMonsterCloseAttChkTable2, kRawData, false },
+ { kEoBBaseMonsterCloseAttDstTable1, kRawData, false },
+ { kEoBBaseMonsterCloseAttDstTable2, kRawData, false },
+ { kEoBBaseMonsterProximityTable, kRawData, false },
+ { kEoBBaseFindBlockMonstersTable, kRawData, false },
+ { kEoBBaseMonsterDirChangeTable, kRawData, false },
+ { kEoBBaseMonsterDistAttStrings, kStringList, true },
+ { kEoBBaseEncodeMonsterDefs, kRawDataBe16, false },
+ { kEoBBaseNpcPresets, kEoBNpcData, false },
+ { kEoB2Npc1Strings, kStringList, true },
+ { kEoB2Npc2Strings, kStringList, true },
+ { kEoB2MonsterDustStrings, kStringList, true },
+ { kEoB2DreamSteps, kRawData, false },
+ { kEoB2KheldranStrings, kStringList, true },
+ { kEoB2HornStrings, kStringList, true },
+ { kEoB2HornSounds, kRawData, false },
+ { kEoB2WallOfForceDsX, kRawDataBe16, false },
+ { kEoB2WallOfForceDsY, kRawData, false },
+ { kEoB2WallOfForceNumW, kRawData, false },
+ { kEoB2WallOfForceNumH, kRawData, false },
+ { kEoB2WallOfForceShpId, kRawData, false },
// LANDS OF LORE
// Ingame
- { kLoLIngamePakFiles, k2TypeSfxList, false },
-
- { kLoLCharacterDefs, kLoLTypeCharData, true },
- { kLoLIngameSfxFiles, k2TypeSfxList, false },
- { kLoLIngameSfxIndex, kTypeRawData, false },
- { kLoLMusicTrackMap, kTypeRawData, false },
- { kLoLIngameGMSfxIndex, kTypeRawData, false },
- { kLoLIngameMT32SfxIndex, kTypeRawData, false },
- { kLoLIngamePcSpkSfxIndex, kTypeRawData, false },
- { kLoLSpellProperties, kLoLTypeSpellData, false },
- { kLoLGameShapeMap, kTypeRawData, false },
- { kLoLSceneItemOffs, kTypeRawData, false },
- { kLoLCharInvIndex, k3TypeRaw16to8, false },
- { kLoLCharInvDefs, kTypeRawData, false },
- { kLoLCharDefsMan, kLoLTypeRaw16, false },
- { kLoLCharDefsWoman, kLoLTypeRaw16, false },
- { kLoLCharDefsKieran, kLoLTypeRaw16, false },
- { kLoLCharDefsAkshel, kLoLTypeRaw16, false },
- { kLoLExpRequirements, kLoLTypeRaw32, false },
- { kLoLMonsterModifiers1, kLoLTypeRaw16, false },
- { kLoLMonsterModifiers2, kLoLTypeRaw16, false },
- { kLoLMonsterModifiers3, kLoLTypeRaw16, false },
- { kLoLMonsterModifiers4, kLoLTypeRaw16, false },
- { kLoLMonsterShiftOffsets, kTypeRawData, false },
- { kLoLMonsterDirFlags, kTypeRawData, false },
- { kLoLMonsterScaleY, kTypeRawData, false },
- { kLoLMonsterScaleX, kTypeRawData, false },
- { kLoLMonsterScaleWH, kLoLTypeRaw16, false },
- { kLoLFlyingObjectShp, kLoLTypeFlightShpData, false },
- { kLoLInventoryDesc, kLoLTypeRaw16, false },
- { kLoLLevelShpList, k2TypeSfxList, false },
- { kLoLLevelDatList, k2TypeSfxList, false },
- { kLoLCompassDefs, kLoLTypeCompassData, false },
- { kLoLItemPrices, kLoLTypeRaw16, false },
- { kLoLStashSetup, kTypeRawData, false },
-
- { kLoLDscWalls, kTypeRawData, false },
- { kRpgCommonDscShapeIndex, kTypeRawData, false },
- { kLoLDscOvlMap, kTypeRawData, false },
- { kLoLDscScaleWidthData, kLoLTypeRaw16, false },
- { kLoLDscScaleHeightData, kLoLTypeRaw16, false },
- { kRpgCommonDscX, kLoLTypeRaw16, false },
- { kLoLDscY, kTypeRawData, false },
- { kRpgCommonDscTileIndex, kTypeRawData, false },
- { kRpgCommonDscUnk2, kTypeRawData, false },
- { kRpgCommonDscDoorShapeIndex, kTypeRawData, false },
- { kRpgCommonDscDimData1, kTypeRawData, false },
- { kRpgCommonDscDimData2, kTypeRawData, false },
- { kRpgCommonDscBlockMap, kTypeRawData, false },
- { kRpgCommonDscDimMap, kTypeRawData, false },
- { kLoLDscDoorScale, kLoLTypeRaw16, false },
- { kLoLDscOvlIndex, k3TypeRaw16to8, false },
- { kRpgCommonDscBlockIndex, kTypeRawData, false },
- { kLoLDscDoor4, kLoLTypeRaw16, false },
- { kRpgCommonDscDoorY2, kTypeRawData, false },
- { kRpgCommonDscDoorFrameY1, kTypeRawData, false },
- { kRpgCommonDscDoorFrameY2, kTypeRawData, false },
- { kRpgCommonDscDoorFrameIndex1, kTypeRawData, false },
- { kRpgCommonDscDoorFrameIndex2, kTypeRawData, false },
- { kLoLDscDoorX, kLoLTypeRaw16, false },
- { kLoLDscDoorY, kLoLTypeRaw16, false },
-
- { kLoLScrollXTop, k3TypeRaw16to8, false },
- { kLoLScrollYTop, k3TypeRaw16to8, false },
- { kLoLScrollXBottom, k3TypeRaw16to8, false },
- { kLoLScrollYBottom, k3TypeRaw16to8, false },
-
- { kLoLButtonDefs, kLoLTypeButtonDef, false },
- { kLoLButtonList1, k3TypeRaw16to8, false },
- { kLoLButtonList2, k3TypeRaw16to8, false },
- { kLoLButtonList3, k3TypeRaw16to8, false },
- { kLoLButtonList4, k3TypeRaw16to8, false },
- { kLoLButtonList5, k3TypeRaw16to8, false },
- { kLoLButtonList6, k3TypeRaw16to8, false },
- { kLoLButtonList7, k3TypeRaw16to8, false },
- { kLoLButtonList8, k3TypeRaw16to8, false },
-
- { kLoLLegendData, kTypeRawData, false },
- { kLoLMapCursorOvl, kTypeRawData, false },
- { kLoLMapStringId, kLoLTypeRaw16, false },
-
- { kLoLSpellbookAnim, k3TypeRaw16to8, false },
- { kLoLSpellbookCoords, k3TypeRaw16to8, false },
- { kLoLHealShapeFrames, kTypeRawData, false },
- { kLoLLightningDefs, kTypeRawData, false },
- { kLoLFireballCoords, kLoLTypeRaw16, false },
-
- { kLoLCredits, kTypeRawData, false },
-
- { kLoLHistory, kTypeRawData, false },
+ { kLoLIngamePakFiles, kStringList, false },
+
+ { kLoLCharacterDefs, kLoLCharData, true },
+ { kLoLIngameSfxFiles, kStringList, false },
+ { kLoLIngameSfxIndex, kRawData, false },
+ { kLoLMusicTrackMap, kRawData, false },
+ { kLoLIngameGMSfxIndex, kRawData, false },
+ { kLoLIngameMT32SfxIndex, kRawData, false },
+ { kLoLIngamePcSpkSfxIndex, kRawData, false },
+ { kLoLSpellProperties, kLoLSpellData, false },
+ { kLoLGameShapeMap, kRawData, false },
+ { kLoLSceneItemOffs, kRawData, false },
+ { kLoLCharInvIndex, kRawData, false },
+ { kLoLCharInvDefs, kRawData, false },
+ { kLoLCharDefsMan, kRawDataBe16, false },
+ { kLoLCharDefsWoman, kRawDataBe16, false },
+ { kLoLCharDefsKieran, kRawDataBe16, false },
+ { kLoLCharDefsAkshel, kRawDataBe16, false },
+ { kLoLExpRequirements, kRawDataBe32, false },
+ { kLoLMonsterModifiers1, kRawDataBe16, false },
+ { kLoLMonsterModifiers2, kRawDataBe16, false },
+ { kLoLMonsterModifiers3, kRawDataBe16, false },
+ { kLoLMonsterModifiers4, kRawDataBe16, false },
+ { kLoLMonsterShiftOffsets, kRawData, false },
+ { kLoLMonsterDirFlags, kRawData, false },
+ { kLoLMonsterScaleY, kRawData, false },
+ { kLoLMonsterScaleX, kRawData, false },
+ { kLoLMonsterScaleWH, kRawDataBe16, false },
+ { kLoLFlyingObjectShp, kLoLFlightShpData, false },
+ { kLoLInventoryDesc, kRawDataBe16, false },
+ { kLoLLevelShpList, kStringList, false },
+ { kLoLLevelDatList, kStringList, false },
+ { kLoLCompassDefs, kLoLCompassData, false },
+ { kLoLItemPrices, kRawDataBe16, false },
+ { kLoLStashSetup, kRawData, false },
+
+ { kLoLDscWalls, kRawData, false },
+ { kRpgCommonDscShapeIndex, kRawData, false },
+ { kLoLDscOvlMap, kRawData, false },
+ { kLoLDscScaleWidthData, kRawDataBe16, false },
+ { kLoLDscScaleHeightData, kRawDataBe16, false },
+ { kRpgCommonDscX, kRawDataBe16, false },
+ { kLoLBaseDscY, kRawData, false },
+ { kRpgCommonDscTileIndex, kRawData, false },
+ { kRpgCommonDscUnk2, kRawData, false },
+ { kRpgCommonDscDoorShapeIndex, kRawData, false },
+ { kRpgCommonDscDimData1, kRawData, false },
+ { kRpgCommonDscDimData2, kRawData, false },
+ { kRpgCommonDscBlockMap, kRawData, false },
+ { kRpgCommonDscDimMap, kRawData, false },
+ { kLoLDscDoorScale, kRawDataBe16, false },
+ { kLoLDscOvlIndex, kRawData, false },
+ { kRpgCommonDscBlockIndex, kRawData, false },
+ { kLoLDscDoor4, kRawDataBe16, false },
+ { kRpgCommonDscDoorY2, kRawData, false },
+ { kRpgCommonDscDoorFrameY1, kRawData, false },
+ { kRpgCommonDscDoorFrameY2, kRawData, false },
+ { kRpgCommonDscDoorFrameIndex1, kRawData, false },
+ { kRpgCommonDscDoorFrameIndex2, kRawData, false },
+ { kLoLDscDoorX, kRawDataBe16, false },
+ { kLoLDscDoorY, kRawDataBe16, false },
+
+ { kLoLScrollXTop, kRawData, false },
+ { kLoLScrollYTop, kRawData, false },
+ { kLoLScrollXBottom, kRawData, false },
+ { kLoLScrollYBottom, kRawData, false },
+
+ { kLoLButtonDefs, kLoLButtonData, false },
+ { kLoLButtonList1, kRawData, false },
+ { kLoLButtonList2, kRawData, false },
+ { kLoLButtonList3, kRawData, false },
+ { kLoLButtonList4, kRawData, false },
+ { kLoLButtonList5, kRawData, false },
+ { kLoLButtonList6, kRawData, false },
+ { kLoLButtonList7, kRawData, false },
+ { kLoLButtonList8, kRawData, false },
+
+ { kLoLLegendData, kRawData, false },
+ { kLoLMapCursorOvl, kRawData, false },
+ { kLoLMapStringId, kRawDataBe16, false },
+
+ { kLoLSpellbookAnim, kRawData, false },
+ { kLoLSpellbookCoords, kRawData, false },
+ { kLoLHealShapeFrames, kRawData, false },
+ { kLoLLightningDefs, kRawData, false },
+ { kLoLFireballCoords, kRawDataBe16, false },
+
+ { kLoLCredits, kRawData, false },
+
+ { kLoLHistory, kRawData, false },
{ -1, 0, 0 }
};
@@ -775,256 +773,86 @@ byte getSpecialID(int special) {
// filename processing
-uint32 getFilename(const ExtractInformation *info, const int id) {
+uint32 getFilename(int game, int plat, int spec, int lang, const ExtractFilename *fDesc) {
+ // GAME, PLATFORM, SPECIAL, ID, LANG
+ return ((getGameID(game) & 0xF) << 24) |
+ ((getPlatformID(plat) & 0xF) << 20) |
+ ((getSpecialID(spec) & 0xF) << 16) |
+ ((fDesc->id & 0xFFF) << 4) |
+ ((getLanguageID(fDesc->langSpecific ? lang : UNK_LANG) & 0xF) << 0);
+}
+
+uint32 getFilename(const Game *g, const int id) {
const ExtractFilename *fDesc = getFilenameDesc(id);
if (!fDesc)
return 0;
- // GAME, PLATFORM, SPECIAL, ID, LANG
- return ((getGameID(info->game) & 0xF) << 24) |
- ((getPlatformID(info->platform) & 0xF) << 20) |
- ((getSpecialID(info->special) & 0xF) << 16) |
- ((id & 0xFFF) << 4) |
- ((getLanguageID(fDesc->langSpecific ? info->lang : UNK_LANG) & 0xF) << 0);
-}
-
-// TODO: Get rid of this
-bool getFilename(char *dstFilename, const ExtractInformation *info, const int id) {
- sprintf(dstFilename, "%08X", getFilename(info, id));
- return true;
+ return getFilename(g->game, g->platform, g->special, g->lang, fDesc);
}
-// index generation
-
-typedef uint16 GameDef;
-
-GameDef createGameDef(const ExtractInformation *eI) {
- return ((getGameID(eI->game) & 0xF) << 12) |
- ((getPlatformID(eI->platform) & 0xF) << 8) |
- ((getSpecialID(eI->special) & 0xF) << 4) |
- ((getLanguageID(eI->lang) & 0xF) << 0);
+uint32 getFilename(const ResourceProvider *provider, const ExtractFilename *fDesc) {
+ return getFilename(provider->game, provider->platform, provider->special, provider->language, fDesc);
}
-struct Index {
- Index() : version(0), includedGames(0), gameList() {}
-
- uint32 version;
- uint32 includedGames;
-
- typedef std::list<GameDef> GameList;
- GameList gameList;
-};
-
-Index parseIndex(const uint8 *data, uint32 size) {
- Index result;
-
- if (size < 8)
- return result;
-
- result.version = READ_BE_UINT32(data); data += 4;
- result.includedGames = READ_BE_UINT32(data); data += 4;
-
- if (result.includedGames * 2 + 8 != size) {
- result.version = result.includedGames = 0;
- return result;
- }
-
- for (uint32 i = 0; i < result.includedGames; ++i) {
- GameDef game = READ_BE_UINT16(data); data += 2;
- result.gameList.push_back(game);
- }
-
- return result;
-}
-
-bool updateIndex(PAKFile &out, const ExtractInformation *eI) {
- uint32 size = 0;
- const uint8 *data = out.getFileData("INDEX", &size);
-
- Index index;
- if (data)
- index = parseIndex(data, size);
-
- GameDef gameDef = createGameDef(eI);
- if (index.version == kKyraDatVersion) {
- if (std::find(index.gameList.begin(), index.gameList.end(), gameDef) == index.gameList.end()) {
- ++index.includedGames;
- index.gameList.push_back(gameDef);
- } else {
- // Already included in the game list, thus we do not need any further processing here.
- return true;
- }
- } else {
- index.version = kKyraDatVersion;
- index.includedGames = 1;
- index.gameList.push_back(gameDef);
- }
-
- const uint32 indexBufferSize = 8 + index.includedGames * 2;
- uint8 *indexBuffer = new uint8[indexBufferSize];
- assert(indexBuffer);
- uint8 *dst = indexBuffer;
- WRITE_BE_UINT32(dst, index.version); dst += 4;
- WRITE_BE_UINT32(dst, index.includedGames); dst += 4;
- for (Index::GameList::const_iterator i = index.gameList.begin(); i != index.gameList.end(); ++i) {
- WRITE_BE_UINT16(dst, *i); dst += 2;
- }
-
- out.removeFile("INDEX");
- if (!out.addFile("INDEX", indexBuffer, indexBufferSize)) {
- fprintf(stderr, "ERROR: couldn't update kyra.dat INDEX\n");
- delete[] indexBuffer;
- return false;
- }
-
+bool getFilename(char *dstFilename, const Game *g, const int id) {
+ sprintf(dstFilename, "%08X", getFilename(g, id));
return true;
}
-bool checkIndex(PAKFile &file) {
- uint32 size = 0;
- const uint8 *data = file.getFileData("INDEX", &size);
- if (!data)
- return false;
-
- Index index = parseIndex(data, size);
+// index generation
- if (index.version != kKyraDatVersion)
- return false;
- if (index.includedGames * 2 + 8 != size)
- return false;
+typedef uint16 GameDef;
- return true;
+GameDef createGameDef(const Game *g) {
+ return ((getGameID(g->game) & 0xF) << 12) |
+ ((getPlatformID(g->platform) & 0xF) << 8) |
+ ((getSpecialID(g->special) & 0xF) << 4) |
+ ((getLanguageID(g->lang) & 0xF) << 0);
+ return 0;
}
// main processing
void printHelp(const char *f) {
printf("Usage:\n");
- printf("%s output inputfiles ...\n", f);
+ printf("%s output\n", f);
}
-bool process(PAKFile &out, const Game *g, const byte *data, const uint32 size);
-const Game *findGame(const byte *buffer, const uint32 size);
-
-typedef std::map<std::string, std::string> MD5Map;
-MD5Map createMD5Sums(int files, const char * const *filenames);
-
-struct File {
- File() : data(0), size(0) {}
- File(uint8 *d, uint32 s) : data(d), size(s) {}
-
- uint8 *data;
- uint32 size;
-};
-typedef std::map<const Game *, File> GameMap;
-GameMap createGameMap(const MD5Map &map);
+void outputAllResources(PAKFile &out);
+void outputAllGames(PAKFile &out, std::vector<GameDef> &games);
int main(int argc, char *argv[]) {
- if (argc < 3) {
+ if (argc != 2) {
printHelp(argv[0]);
return -1;
}
- // Special case for developer mode of this tool:
- // With "--create filename offset size" the tool will output
- // a search entry for the specifed data in the specified file.
- if (!strcmp(argv[1], "--create")) {
- if (argc < 5) {
- printf("Developer usage: %s --create input_file hex_offset hex_size\n", argv[0]);
- return -1;
- }
-
- uint32 offset, size;
- sscanf(argv[3], "%x", &offset);
- sscanf(argv[4], "%x", &size);
-
- FILE *input = fopen(argv[2], "rb");
- if (!input)
- error("Couldn't open file '%s'", argv[2]);
-
- byte *buffer = new byte[size];
- fseek(input, offset, SEEK_SET);
- if (fread(buffer, 1, size, input) != size) {
- delete[] buffer;
- error("Couldn't read from file '%s'", argv[2]);
- }
-
- fclose(input);
-
- SearchData d = SearchCreator::create(buffer, size);
- delete[] buffer;
-
- printf("{ 0x%.08X, 0x%.08X, { {", d.size, d.byteSum);
- for (int j = 0; j < 16; ++j) {
- printf(" 0x%.2X", d.hash.digest[j]);
- if (j != 15)
- printf(",");
- else
- printf(" } } }\n");
- }
-
- return 0;
- }
-
PAKFile out;
- out.loadFile(argv[1], false);
- // When the output file is no valid kyra.dat file, we will delete
- // all the output.
- if (!checkIndex(out))
- out.clearFile();
+ // First step: Write out all resources.
+ outputAllResources(out);
- MD5Map inputFiles = createMD5Sums(argc - 2, &argv[2]);
+ // Second step: Write all game version information
+ std::vector<GameDef> games;
+ outputAllGames(out, games);
- GameMap games = createGameMap(inputFiles);
-
- // Check for unused input files
- MD5Map unusedFiles = inputFiles;
- for (GameMap::const_iterator i = games.begin(); i != games.end(); ++i) {
- unusedFiles.erase(i->first->md5[0]);
- if (i->first->md5[1])
- unusedFiles.erase(i->first->md5[1]);
+ // Third step: Write index file
+ byte *const indexBuffer = new byte[8 + 2 * games.size()];
+ byte *dst = indexBuffer;
+ WRITE_BE_UINT32(dst, kKyraDatVersion); dst += 4;
+ WRITE_BE_UINT32(dst, games.size()); dst += 4;
+ for (std::vector<GameDef>::const_iterator i = games.begin(), end = games.end(); i != end; ++i) {
+ WRITE_BE_UINT16(dst, *i); dst += 2;
}
-
- for (MD5Map::const_iterator i = unusedFiles.begin(); i != unusedFiles.end(); ++i)
- printf("Input file '%s' with md5 sum '%s' is not known.\n", i->second.c_str(), i->first.c_str());
-
- unusedFiles.clear();
-
- // Short circuit, in case no games are found.
- if (games.empty()) {
- printf("No games found. Exiting prematurely\n");
- return -1;
+ if (!out.addFile("INDEX", indexBuffer, 8 + 2 * games.size())) {
+ error("couldn't write INDEX file");
}
- // Process all games found
- for (GameMap::const_iterator i = games.begin(); i != games.end(); ++i) {
- MD5Map::const_iterator f1 = inputFiles.find(i->first->md5[0]);
- MD5Map::const_iterator f2 = inputFiles.end();
- if (i->first->md5[1])
- f2 = inputFiles.find(i->first->md5[1]);
-
- if (f2 != inputFiles.end())
- printf("Processing files '%s' and '%s'...\n", f1->second.c_str(), f2->second.c_str());
- else
- printf("Processing file '%s'...\n", f1->second.c_str());
-
- if (!process(out, i->first, i->second.data, i->second.size))
- printf("FAILED\n");
- else
- printf("OK\n");
+ if (!out.saveFile(argv[1])) {
+ error("couldn't save changes to '%s'", argv[1]);
}
- // Free up memory
- for (GameMap::iterator i = games.begin(); i != games.end(); ++i)
- delete[] i->second.data;
- games.clear();
- inputFiles.clear();
-
- if (!out.saveFile(argv[1]))
- error("couldn't save changes to '%s'", argv[1]);
-
uint8 digest[16];
if (!md5_file(argv[1], digest, 0))
error("couldn't calc. md5 for file '%s'", argv[1]);
@@ -1038,1309 +866,46 @@ int main(int argc, char *argv[]) {
return 0;
}
-MD5Map createMD5Sums(int files, const char * const *filenames) {
- MD5Map result;
-
- while (files--) {
- const char *inputFile = *filenames++;
- FILE *input = fopen(inputFile, "rb");
-
- uint32 size = fileSize(input);
- fseek(input, 0, SEEK_SET);
-
- byte *buffer = new uint8[size];
- assert(buffer);
-
- if (fread(buffer, 1, size, input) != size) {
- warning("couldn't read from file '%s', skipping it", inputFile);
- delete[] buffer;
- fclose(input);
- continue;
- }
- fclose(input);
-
- md5_context ctx;
- uint8 digest[16];
- char md5Str[33];
-
- md5_starts(&ctx);
- md5_update(&ctx, buffer, size);
- md5_finish(&ctx, digest);
-
- for (int j = 0; j < 16; ++j)
- sprintf(md5Str + j*2, "%02x", (int)digest[j]);
+void outputAllResources(PAKFile &out) {
+ char filename[128];
+ for (const ResourceProvider *resource = obtainResourceProviders();
+ resource->id != kMaxResIDs; ++resource) {
+ const ExtractFilename *desc = getFilenameDesc(resource->id);
- delete[] buffer;
+ snprintf(filename, sizeof(filename), "%08X", getFilename(resource, desc));
- result[md5Str] = inputFile;
+ writeResource(out, filename, (ResTypes)desc->type, resource->provider);
}
-
- return result;
}
-GameMap createGameMap(const MD5Map &map) {
- GameMap result;
-
- for (const Game * const *g = gameDescs; *g != 0; ++g) {
- for (const Game *sub = *g; sub->game != -1; ++sub) {
- MD5Map::const_iterator file1 = map.find(sub->md5[0]);
- if (file1 == map.end())
- continue;
+bool createIDMap(PAKFile &out, const Game *g, const int *needList);
- MD5Map::const_iterator file2 = map.end();
- if (sub->md5[1] != 0) {
- file2 = map.find(sub->md5[1]);
- if (file2 == map.end())
- continue;
+void outputAllGames(PAKFile &out, std::vector<GameDef> &games) {
+ for (const Game *const *descs = gameDescs;
+ *descs; ++descs) {
+ for (const Game *game = *descs;
+ game->game != -1; ++game) {
+ const GameDef gameDef = createGameDef(game);
+ if (!createIDMap(out, game, getNeedList(game))) {
+ error("Could not create ID map for game %04X", gameDef);
}
-
- FILE *f1 = fopen(file1->second.c_str(), "rb");
- FILE *f2 = 0;
-
- if (file2 != map.end())
- f2 = fopen(file2->second.c_str(), "rb");
-
- uint32 file1Size = fileSize(f1);
- uint32 file2Size = 0;
- if (f2)
- file2Size = fileSize(f2);
-
- uint8 *buffer = new uint8[file1Size + file2Size];
- assert(buffer);
-
- fread(buffer, 1, file1Size, f1);
- if (f2)
- fread(buffer + file1Size, 1, file2Size, f2);
-
- fclose(f1);
- if (f2)
- fclose(f2);
-
- result[sub] = File(buffer, file1Size + file2Size);
+ games.push_back(gameDef);
}
}
-
- return result;
-}
-
-const char *getIdString(const int id) {
- switch (id) {
- case k1ForestSeq:
- return "k1ForestSeq";
- case k1KallakWritingSeq:
- return "k1KallakWritingSeq";
- case k1KyrandiaLogoSeq:
- return "k1KyrandiaLogoSeq";
- case k1KallakMalcolmSeq:
- return "k1KallakMalcolmSeq";
- case k1MalcolmTreeSeq:
- return "k1MalcolmTreeSeq";
- case k1WestwoodLogoSeq:
- return "k1WestwoodLogoSeq";
- case k1Demo1Seq:
- return "k1Demo1Seq";
- case k1Demo2Seq:
- return "k1Demo2Seq";
- case k1Demo3Seq:
- return "k1Demo3Seq";
- case k1Demo4Seq:
- return "k1Demo4Seq";
- case k1AmuleteAnimSeq:
- return "k1AmuleteAnimSeq";
- case k1OutroReunionSeq:
- return "k1OutroReunionSeq";
- case k1IntroCPSStrings:
- return "k1IntroCPSStrings";
- case k1IntroCOLStrings:
- return "k1IntroCOLStrings";
- case k1IntroWSAStrings:
- return "k1IntroWSAStrings";
- case k1IntroStrings:
- return "k1IntroStrings";
- case k1OutroHomeString:
- return "k1OutroHomeString";
- case k1RoomFilenames:
- return "k1RoomFilenames";
- case k1RoomList:
- return "k1RoomList";
- case k1CharacterImageFilenames:
- return "k1CharacterImageFilenames";
- case k1AudioTracks:
- return "k1AudioTracks";
- case k1AudioTracks2:
- return "k1AudioTracks2";
- case k1AudioTracksIntro:
- return "k1AudioTracksIntro";
- case k1ItemNames:
- return "k1ItemNames";
- case k1TakenStrings:
- return "k1TakenStrings";
- case k1PlacedStrings:
- return "k1PlacedStrings";
- case k1DroppedStrings:
- return "k1DroppedStrings";
- case k1NoDropStrings:
- return "k1NoDropStrings";
- case k1PutDownString:
- return "k1PutDownString";
- case k1WaitAmuletString:
- return "k1WaitAmuletString";
- case k1BlackJewelString:
- return "k1BlackJewelString";
- case k1PoisonGoneString:
- return "k1PoisonGoneString";
- case k1HealingTipString:
- return "k1HealingTipString";
- case k1WispJewelStrings:
- return "k1WispJewelStrings";
- case k1MagicJewelStrings:
- return "k1MagicJewelStrings";
- case k1ThePoisonStrings:
- return "k1ThePoisonStrings";
- case k1FluteStrings:
- return "k1FluteStrings";
- case k1FlaskFullString:
- return "k1FlaskFullString";
- case k1FullFlaskString:
- return "k1FullFlaskString";
- case k1VeryCleverString:
- return "k1VeryCleverString";
- case k1NewGameString:
- return "k1NewGameString";
- case k1DefaultShapes:
- return "k1DefaultShapes";
- case k1Healing1Shapes:
- return "k1Healing1Shapes";
- case k1Healing2Shapes:
- return "k1Healing2Shapes";
- case k1PoisonDeathShapes:
- return "k1PoisonDeathShapes";
- case k1FluteShapes:
- return "k1FluteShapes";
- case k1Winter1Shapes:
- return "k1Winter1Shapes";
- case k1Winter2Shapes:
- return "k1Winter2Shapes";
- case k1Winter3Shapes:
- return "k1Winter3Shapes";
- case k1DrinkShapes:
- return "k1DrinkShapes";
- case k1WispShapes:
- return "k1WispShapes";
- case k1MagicAnimShapes:
- return "k1MagicAnimShapes";
- case k1BranStoneShapes:
- return "k1BranStoneShapes";
- case k1SpecialPalette1:
- return "k1SpecialPalette1";
- case k1SpecialPalette2:
- return "k1SpecialPalette2";
- case k1SpecialPalette3:
- return "k1SpecialPalette3";
- case k1SpecialPalette4:
- return "k1SpecialPalette4";
- case k1SpecialPalette5:
- return "k1SpecialPalette5";
- case k1SpecialPalette6:
- return "k1SpecialPalette6";
- case k1SpecialPalette7:
- return "k1SpecialPalette7";
- case k1SpecialPalette8:
- return "k1SpecialPalette8";
- case k1SpecialPalette9:
- return "k1SpecialPalette9";
- case k1SpecialPalette10:
- return "k1SpecialPalette10";
- case k1SpecialPalette11:
- return "k1SpecialPalette11";
- case k1SpecialPalette12:
- return "k1SpecialPalette12";
- case k1SpecialPalette13:
- return "k1SpecialPalette13";
- case k1SpecialPalette14:
- return "k1SpecialPalette14";
- case k1SpecialPalette15:
- return "k1SpecialPalette15";
- case k1SpecialPalette16:
- return "k1SpecialPalette16";
- case k1SpecialPalette17:
- return "k1SpecialPalette17";
- case k1SpecialPalette18:
- return "k1SpecialPalette18";
- case k1SpecialPalette19:
- return "k1SpecialPalette19";
- case k1SpecialPalette20:
- return "k1SpecialPalette20";
- case k1SpecialPalette21:
- return "k1SpecialPalette21";
- case k1SpecialPalette22:
- return "k1SpecialPalette22";
- case k1SpecialPalette23:
- return "k1SpecialPalette23";
- case k1SpecialPalette24:
- return "k1SpecialPalette24";
- case k1SpecialPalette25:
- return "k1SpecialPalette25";
- case k1SpecialPalette26:
- return "k1SpecialPalette26";
- case k1SpecialPalette27:
- return "k1SpecialPalette27";
- case k1SpecialPalette28:
- return "k1SpecialPalette28";
- case k1SpecialPalette29:
- return "k1SpecialPalette29";
- case k1SpecialPalette30:
- return "k1SpecialPalette30";
- case k1SpecialPalette31:
- return "k1SpecialPalette31";
- case k1SpecialPalette32:
- return "k1SpecialPalette32";
- case k1SpecialPalette33:
- return "k1SpecialPalette33";
- case k1GUIStrings:
- return "k1GUIStrings";
- case k1ConfigStrings:
- return "k1ConfigStrings";
- case k1TownsMusicFadeTable:
- return "k1TownsMusicFadeTable";
- case k1TownsSFXwdTable:
- return "k1TownsSFXwdTable";
- case k1TownsSFXbtTable:
- return "k1TownsSFXbtTable";
- case k1TownsCDATable:
- return "k1TownsCDATable";
- case k1PC98StoryStrings:
- return "k1PC98StoryStrings";
- case k1PC98IntroSfx:
- return "k1PC98IntroSfx";
- case k1CreditsStrings:
- return "k1CreditsStrings";
- case k1AmigaIntroSFXTable:
- return "k1AmigaIntroSFXTable";
- case k1AmigaGameSFXTable:
- return "k1AmigaGameSFXTable";
- case k2SeqplayPakFiles:
- return "k2SeqplayPakFiles";
- case k2SeqplayStrings:
- return "k2SeqplayStrings";
- case k2SeqplaySfxFiles:
- return "k2SeqplaySfxFiles";
- case k2SeqplayTlkFiles:
- return "k2SeqplayTlkFiles";
- case k2SeqplaySeqData:
- return "k2SeqplaySeqData";
- case k2SeqplayCredits:
- return "k2SeqplayCredits";
- case k2SeqplayCreditsSpecial:
- return "k2SeqplayCreditsSpecial";
- case k2SeqplayIntroTracks:
- return "k2SeqplayIntroTracks";
- case k2SeqplayFinaleTracks:
- return "k2SeqplayFinaleTracks";
- case k2SeqplayIntroCDA:
- return "k2SeqplayIntroCDA";
- case k2SeqplayFinaleCDA:
- return "k2SeqplayFinaleCDA";
- case k2SeqplayShapeAnimData:
- return "k2SeqplayShapeAnimData";
- case k2IngamePakFiles:
- return "k2IngamePakFiles";
- case k2IngameSfxFiles:
- return "k2IngameSfxFiles";
- case k2IngameSfxIndex:
- return "k2IngameSfxIndex";
- case k2IngameTracks:
- return "k2IngameTracks";
- case k2IngameCDA:
- return "k2IngameCDA";
- case k2IngameTalkObjIndex:
- return "k2IngameTalkObjIndex";
- case k2IngameTimJpStrings:
- return "k2IngameTimJpStrings";
- case k2IngameShapeAnimData:
- return "k2IngameShapeAnimData";
- case k2IngameTlkDemoStrings:
- return "k2IngameTlkDemoStrings";
- case k3MainMenuStrings:
- return "k3MainMenuStrings";
- case k3MusicFiles:
- return "k3MusicFiles";
- case k3ScoreTable:
- return "k3ScoreTable";
- case k3SfxFiles:
- return "k3SfxFiles";
- case k3SfxMap:
- return "k3SfxMap";
- case k3ItemAnimData:
- return "k3ItemAnimData";
- case k3ItemMagicTable:
- return "k3ItemMagicTable";
- case k3ItemStringMap:
- return "k3ItemStringMap";
- case kEoBBaseChargenStrings1:
- return "kEoBBaseChargenStrings1";
- case kEoBBaseChargenStrings2:
- return "kEoBBaseChargenStrings2";
- case kEoBBaseChargenStartLevels:
- return "kEoBBaseChargenStartLevels";
- case kEoBBaseChargenStatStrings:
- return "kEoBBaseChargenStatStrings";
- case kEoBBaseChargenRaceSexStrings:
- return "kEoBBaseChargenRaceSexStrings";
- case kEoBBaseChargenClassStrings:
- return "kEoBBaseChargenClassStrings";
- case kEoBBaseChargenAlignmentStrings:
- return "kEoBBaseChargenAlignmentStrings";
- case kEoBBaseChargenEnterGameStrings:
- return "kEoBBaseChargenEnterGameStrings";
- case kEoBBaseChargenClassMinStats:
- return "kEoBBaseChargenClassMinStats";
- case kEoBBaseChargenRaceMinStats:
- return "kEoBBaseChargenRaceMinStats";
- case kEoBBaseChargenRaceMaxStats:
- return "kEoBBaseChargenRaceMaxStats";
- case kEoBBaseSaveThrowTable1:
- return "kEoBBaseSaveThrowTable1";
- case kEoBBaseSaveThrowTable2:
- return "kEoBBaseSaveThrowTable2";
- case kEoBBaseSaveThrowTable3:
- return "kEoBBaseSaveThrowTable3";
- case kEoBBaseSaveThrowTable4:
- return "kEoBBaseSaveThrowTable4";
- case kEoBBaseSaveThrwLvlIndex:
- return "kEoBBaseSaveThrwLvlIndex";
- case kEoBBaseSaveThrwModDiv:
- return "kEoBBaseSaveThrwModDiv";
- case kEoBBaseSaveThrwModExt:
- return "kEoBBaseSaveThrwModExt";
- case kEoBBasePryDoorStrings:
- return "kEoBBasePryDoorStrings";
- case kEoBBaseWarningStrings:
- return "kEoBBaseWarningStrings";
- case kEoBBaseItemSuffixStringsRings:
- return "kEoBBaseItemSuffixStringsRings";
- case kEoBBaseItemSuffixStringsPotions:
- return "kEoBBaseItemSuffixStringsPotions";
- case kEoBBaseItemSuffixStringsWands:
- return "kEoBBaseItemSuffixStringsWands";
- case kEoBBaseRipItemStrings:
- return "kEoBBaseRipItemStrings";
- case kEoBBaseCursedString:
- return "kEoBBaseCursedString";
- case kEoBBaseEnchantedString:
- return "kEoBBaseEnchantedString";
- case kEoBBaseMagicObjectStrings:
- return "kEoBBaseMagicObjectStrings";
- case kEoBBaseMagicObject5String:
- return "kEoBBaseMagicObject5String";
- case kEoBBasePatternSuffix:
- return "kEoBBasePatternSuffix";
- case kEoBBasePatternGrFix1:
- return "kEoBBasePatternGrFix1";
- case kEoBBasePatternGrFix2:
- return "kEoBBasePatternGrFix2";
- case kEoBBaseValidateArmorString:
- return "kEoBBaseValidateArmorString";
- case kEoBBaseValidateCursedString:
- return "kEoBBaseValidateCursedString";
- case kEoBBaseValidateNoDropString:
- return "kEoBBaseValidateNoDropString";
- case kEoBBasePotionStrings:
- return "kEoBBasePotionStrings";
- case kEoBBaseWandString:
- return "kEoBBaseWandString";
- case kEoBBaseItemMisuseStrings:
- return "kEoBBaseItemMisuseStrings";
- case kEoBBaseTakenStrings:
- return "kEoBBaseTakenStrings";
- case kEoBBasePotionEffectStrings:
- return "kEoBBasePotionEffectStrings";
- case kEoBBaseYesNoStrings:
- return "kEoBBaseYesNoStrings";
- case kRpgCommonMoreStrings:
- return "kRpgCommonMoreStrings";
- case kEoBBaseNpcMaxStrings:
- return "kEoBBaseNpcMaxStrings";
- case kEoBBaseOkStrings:
- return "kEoBBaseOkStrings";
- case kEoBBaseNpcJoinStrings:
- return "kEoBBaseNpcJoinStrings";
- case kEoBBaseCancelStrings:
- return "kEoBBaseCancelStrings";
- case kEoBBaseAbortStrings:
- return "kEoBBaseAbortStrings";
- case kEoBBaseMenuStringsMain:
- return "kEoBBaseMenuStringsMain";
- case kEoBBaseMenuStringsSaveLoad:
- return "kEoBBaseMenuStringsSaveLoad";
- case kEoBBaseMenuStringsOnOff:
- return "kEoBBaseMenuStringsOnOff";
- case kEoBBaseMenuStringsSpells:
- return "kEoBBaseMenuStringsSpells";
- case kEoBBaseMenuStringsRest:
- return "kEoBBaseMenuStringsRest";
- case kEoBBaseMenuStringsDrop:
- return "kEoBBaseMenuStringsDrop";
- case kEoBBaseMenuStringsExit:
- return "kEoBBaseMenuStringsExit";
- case kEoBBaseMenuStringsStarve:
- return "kEoBBaseMenuStringsStarve";
- case kEoBBaseMenuStringsScribe:
- return "kEoBBaseMenuStringsScribe";
- case kEoBBaseMenuStringsDrop2:
- return "kEoBBaseMenuStringsDrop2";
- case kEoBBaseMenuStringsHead:
- return "kEoBBaseMenuStringsHead";
- case kEoBBaseMenuStringsPoison:
- return "kEoBBaseMenuStringsPoison";
- case kEoBBaseMenuStringsMgc:
- return "kEoBBaseMenuStringsMgc";
- case kEoBBaseMenuStringsPrefs:
- return "kEoBBaseMenuStringsPrefs";
- case kEoBBaseMenuStringsRest2:
- return "kEoBBaseMenuStringsRest2";
- case kEoBBaseMenuStringsRest3:
- return "kEoBBaseMenuStringsRest3";
- case kEoBBaseMenuStringsRest4:
- return "kEoBBaseMenuStringsRest4";
- case kEoBBaseMenuStringsDefeat:
- return "kEoBBaseMenuStringsDefeat";
- case kEoBBaseMenuStringsTransfer:
- return "kEoBBaseMenuStringsTransfer";
- case kEoBBaseMenuStringsSpec:
- return "kEoBBaseMenuStringsSpec";
- case kEoBBaseMenuStringsSpellNo:
- return "kEoBBaseMenuStringsSpellNo";
- case kEoBBaseMenuYesNoStrings:
- return "kEoBBaseMenuYesNoStrings";
- case kEoBBaseSpellLevelsMage:
- return "kEoBBaseSpellLevelsMage";
- case kEoBBaseSpellLevelsCleric:
- return "kEoBBaseSpellLevelsCleric";
- case kEoBBaseNumSpellsCleric:
- return "kEoBBaseNumSpellsCleric";
- case kEoBBaseNumSpellsWisAdj:
- return "kEoBBaseNumSpellsWisAdj";
- case kEoBBaseNumSpellsPal:
- return "kEoBBaseNumSpellsPal";
- case kEoBBaseNumSpellsMage:
- return "kEoBBaseNumSpellsMage";
- case kEoBBaseCharGuiStringsHp:
- return "kEoBBaseCharGuiStringsHp";
- case kEoBBaseCharGuiStringsWp1:
- return "kEoBBaseCharGuiStringsWp1";
- case kEoBBaseCharGuiStringsWp2:
- return "kEoBBaseCharGuiStringsWp2";
- case kEoBBaseCharGuiStringsWr:
- return "kEoBBaseCharGuiStringsWr";
- case kEoBBaseCharGuiStringsSt1:
- return "kEoBBaseCharGuiStringsSt1";
- case kEoBBaseCharGuiStringsSt2:
- return "kEoBBaseCharGuiStringsSt2";
- case kEoBBaseCharGuiStringsIn:
- return "kEoBBaseCharGuiStringsIn";
- case kEoBBaseCharStatusStrings7:
- return "kEoBBaseCharStatusStrings7";
- case kEoBBaseCharStatusStrings81:
- return "kEoBBaseCharStatusStrings81";
- case kEoBBaseCharStatusStrings82:
- return "kEoBBaseCharStatusStrings82";
- case kEoBBaseCharStatusStrings9:
- return "kEoBBaseCharStatusStrings9";
- case kEoBBaseCharStatusStrings12:
- return "kEoBBaseCharStatusStrings12";
- case kEoBBaseCharStatusStrings131:
- return "kEoBBaseCharStatusStrings131";
- case kEoBBaseCharStatusStrings132:
- return "kEoBBaseCharStatusStrings132";
- case kEoBBaseLevelGainStrings:
- return "kEoBBaseLevelGainStrings";
- case kEoBBaseExperienceTable0:
- return "kEoBBaseExperienceTable0";
- case kEoBBaseExperienceTable1:
- return "kEoBBaseExperienceTable1";
- case kEoBBaseExperienceTable2:
- return "kEoBBaseExperienceTable2";
- case kEoBBaseExperienceTable3:
- return "kEoBBaseExperienceTable3";
- case kEoBBaseExperienceTable4:
- return "kEoBBaseExperienceTable4";
- case kEoBBaseWllFlagPreset:
- return "kEoBBaseWllFlagPreset";
- case kEoBBaseDscShapeCoords:
- return "kEoBBaseDscShapeCoords";
- case kEoBBaseDscDoorScaleOffs:
- return "kEoBBaseDscDoorScaleOffs";
- case kEoBBaseDscDoorScaleMult1:
- return "kEoBBaseDscDoorScaleMult1";
- case kEoBBaseDscDoorScaleMult2:
- return "kEoBBaseDscDoorScaleMult2";
- case kEoBBaseDscDoorScaleMult3:
- return "kEoBBaseDscDoorScaleMult3";
- case kEoBBaseDscDoorScaleMult4:
- return "kEoBBaseDscDoorScaleMult4";
- case kEoBBaseDscDoorScaleMult5:
- return "kEoBBaseDscDoorScaleMult5";
- case kEoBBaseDscDoorScaleMult6:
- return "kEoBBaseDscDoorScaleMult6";
- case kEoBBaseDscDoorType5Offs:
- return "kEoBBaseDscDoorType5Offs";
- case kEoBBaseDscDoorXE:
- return "kEoBBaseDscDoorXE";
- case kEoBBaseDscDoorY1:
- return "kEoBBaseDscDoorY1";
- case kEoBBaseDscDoorY3:
- return "kEoBBaseDscDoorY3";
- case kEoBBaseDscDoorY4:
- return "kEoBBaseDscDoorY4";
- case kEoBBaseDscDoorY5:
- return "kEoBBaseDscDoorY5";
- case kEoBBaseDscDoorY6:
- return "kEoBBaseDscDoorY6";
- case kEoBBaseDscDoorY7:
- return "kEoBBaseDscDoorY7";
- case kEoBBaseDscDoorCoordsExt:
- return "kEoBBaseDscDoorCoordsExt";
- case kEoBBaseDscItemPosIndex:
- return "kEoBBaseDscItemPosIndex";
- case kEoBBaseDscItemShpX:
- return "kEoBBaseDscItemShpX";
- case kEoBBaseDscItemPosUnk:
- return "kEoBBaseDscItemPosUnk";
- case kEoBBaseDscItemTileIndex:
- return "kEoBBaseDscItemTileIndex";
- case kEoBBaseDscItemShapeMap:
- return "kEoBBaseDscItemShapeMap";
- case kEoBBaseDscMonsterFrmOffsTbl1:
- return "kEoBBaseDscMonsterFrmOffsTbl1";
- case kEoBBaseDscMonsterFrmOffsTbl2:
- return "kEoBBaseDscMonsterFrmOffsTbl2";
- case kEoBBaseInvSlotX:
- return "kEoBBaseInvSlotX";
- case kEoBBaseInvSlotY:
- return "kEoBBaseInvSlotY";
- case kEoBBaseSlotValidationFlags:
- return "kEoBBaseSlotValidationFlags";
- case kEoBBaseProjectileWeaponTypes:
- return "kEoBBaseProjectileWeaponTypes";
- case kEoBBaseWandTypes:
- return "kEoBBaseWandTypes";
- case kEoBBaseDrawObjPosIndex:
- return "kEoBBaseDrawObjPosIndex";
- case kEoBBaseFlightObjFlipIndex:
- return "kEoBBaseFlightObjFlipIndex";
- case kEoBBaseFlightObjShpMap:
- return "kEoBBaseFlightObjShpMap";
- case kEoBBaseFlightObjSclIndex:
- return "kEoBBaseFlightObjSclIndex";
- case kEoBBaseDscTelptrShpCoords:
- return "kEoBBaseDscTelptrShpCoords";
- case kEoBBasePortalSeqData:
- return "kEoBBasePortalSeqData";
- case kEoBBaseManDef:
- return "kEoBBaseManDef";
- case kEoBBaseManWord:
- return "kEoBBaseManWord";
- case kEoBBaseManPrompt:
- return "kEoBBaseManPrompt";
- case kEoBBaseBookNumbers:
- return "kEoBBaseBookNumbers";
- case kEoBBaseMageSpellsList:
- return "kEoBBaseMageSpellsList";
- case kEoBBaseClericSpellsList:
- return "kEoBBaseClericSpellsList";
- case kEoBBaseSpellNames:
- return "kEoBBaseSpellNames";
-
- case kEoBBaseMagicStrings1:
- return "kEoBBaseMagicStrings1";
- case kEoBBaseMagicStrings2:
- return "kEoBBaseMagicStrings2";
- case kEoBBaseMagicStrings3:
- return "kEoBBaseMagicStrings3";
- case kEoBBaseMagicStrings4:
- return "kEoBBaseMagicStrings4";
- case kEoBBaseMagicStrings6:
- return "kEoBBaseMagicStrings6";
- case kEoBBaseMagicStrings7:
- return "kEoBBaseMagicStrings7";
- case kEoBBaseMagicStrings8:
- return "kEoBBaseMagicStrings8";
- case kEoBBaseExpObjectTlMode:
- return "kEoBBaseExpObjectTlMode";
- case kEoBBaseExpObjectTblIndex:
- return "kEoBBaseExpObjectTblIndex";
- case kEoBBaseExpObjectShpStart:
- return "kEoBBaseExpObjectShpStart";
- case kEoBBaseExpObjectTbl1:
- return "kEoBBaseExpObjectTbl1";
- case kEoBBaseExpObjectTbl2:
- return "kEoBBaseExpObjectTbl2";
- case kEoBBaseExpObjectTbl3:
- return "kEoBBaseExpObjectTbl3";
- case kEoBBaseExpObjectY:
- return "kEoBBaseExpObjectY";
- case kEoBBaseSparkDefSteps:
- return "kEoBBaseSparkDefSteps";
- case kEoBBaseSparkDefSubSteps:
- return "kEoBBaseSparkDefSubSteps";
- case kEoBBaseSparkDefShift:
- return "kEoBBaseSparkDefShift";
- case kEoBBaseSparkDefAdd:
- return "kEoBBaseSparkDefAdd";
- case kEoBBaseSparkDefX:
- return "kEoBBaseSparkDefX";
- case kEoBBaseSparkDefY:
- return "kEoBBaseSparkDefY";
- case kEoBBaseSparkOfFlags1:
- return "kEoBBaseSparkOfFlags1";
- case kEoBBaseSparkOfFlags2:
- return "kEoBBaseSparkOfFlags2";
- case kEoBBaseSparkOfShift:
- return "kEoBBaseSparkOfShift";
- case kEoBBaseSparkOfX:
- return "kEoBBaseSparkOfX";
- case kEoBBaseSparkOfY:
- return "kEoBBaseSparkOfY";
- case kEoBBaseSpellProperties:
- return "kEoBBaseSpellProperties";
- case kEoBBaseMagicFlightProps:
- return "kEoBBaseMagicFlightProps";
- case kEoBBaseTurnUndeadEffect:
- return "kEoBBaseTurnUndeadEffect";
- case kEoBBaseBurningHandsDest:
- return "kEoBBaseBurningHandsDest";
- case kEoBBaseConeOfColdDest1:
- return "kEoBBaseConeOfColdDest1";
- case kEoBBaseConeOfColdDest2:
- return "kEoBBaseConeOfColdDest2";
- case kEoBBaseConeOfColdDest3:
- return "kEoBBaseConeOfColdDest3";
- case kEoBBaseConeOfColdDest4:
- return "kEoBBaseConeOfColdDest4";
- case kEoBBaseConeOfColdGfxTbl:
- return "kEoBBaseConeOfColdGfxTbl";
- case kEoB1MainMenuStrings:
- return "kEoB1MainMenuStrings";
- case kEoB1BonusStrings:
- return "kEoB1BonusStrings";
- case kEoB1IntroFilesOpening:
- return "kEoB1IntroFilesOpening";
- case kEoB1IntroFilesTower:
- return "kEoB1IntroFilesTower";
- case kEoB1IntroFilesOrb:
- return "kEoB1IntroFilesOrb";
- case kEoB1IntroFilesWdEntry:
- return "kEoB1IntroFilesWdEntry";
- case kEoB1IntroFilesKing:
- return "kEoB1IntroFilesKing";
- case kEoB1IntroFilesHands:
- return "kEoB1IntroFilesHands";
- case kEoB1IntroFilesWdExit:
- return "kEoB1IntroFilesWdExit";
- case kEoB1IntroFilesTunnel:
- return "kEoB1IntroFilesTunnel";
- case kEoB1IntroOpeningFrmDelay:
- return "kEoB1IntroOpeningFrmDelay";
- case kEoB1IntroWdEncodeX:
- return "kEoB1IntroWdEncodeX";
- case kEoB1IntroWdEncodeY:
- return "kEoB1IntroWdEncodeY";
- case kEoB1IntroWdEncodeWH:
- return "kEoB1IntroWdEncodeWH";
- case kEoB1IntroWdDsX:
- return "kEoB1IntroWdDsX";
- case kEoB1IntroWdDsY:
- return "kEoB1IntroWdDsY";
- case kEoB1IntroTvlX1:
- return "kEoB1IntroTvlX1";
- case kEoB1IntroTvlY1:
- return "kEoB1IntroTvlY1";
- case kEoB1IntroTvlX2:
- return "kEoB1IntroTvlX2";
- case kEoB1IntroTvlY2:
- return "kEoB1IntroTvlY2";
- case kEoB1IntroTvlW:
- return "kEoB1IntroTvlW";
- case kEoB1IntroTvlH:
- return "kEoB1IntroTvlH";
- case kEoB1DoorShapeDefs:
- return "kEoB1DoorShapeDefs";
- case kEoB1DoorSwitchCoords:
- return "kEoB1DoorSwitchCoords";
- case kEoB1MonsterProperties:
- return "kEoB1MonsterProperties";
- case kEoB1EnemyMageSpellList:
- return "kEoB1EnemyMageSpellList";
- case kEoB1EnemyMageSfx:
- return "kEoB1EnemyMageSfx";
- case kEoB1BeholderSpellList:
- return "kEoB1BeholderSpellList";
- case kEoB1BeholderSfx:
- return "kEoB1BeholderSfx";
- case kEoB1TurnUndeadString:
- return "kEoB1TurnUndeadString";
- case kEoB1CgaMappingDefault:
- return "kEoB1CgaMappingDefault";
- case kEoB1CgaMappingAlt:
- return "kEoB1CgaMappingAlt";
- case kEoB1CgaMappingInv:
- return "kEoB1CgaMappingInv";
- case kEoB1CgaMappingItemsL:
- return "kEoB1CgaMappingItemsL";
- case kEoB1CgaMappingItemsS:
- return "kEoB1CgaMappingItemsS";
- case kEoB1CgaMappingThrown:
- return "kEoB1CgaMappingThrown";
- case kEoB1CgaMappingIcons:
- return "kEoB1CgaMappingIcons";
- case kEoB1CgaMappingDeco:
- return "kEoB1CgaMappingDeco";
- case kEoB1CgaLevelMappingIndex:
- return "kEoB1CgaLevelMappingIndex";
- case kEoB1CgaMappingLevel0:
- return "kEoB1CgaMappingLevel0";
- case kEoB1CgaMappingLevel1:
- return "kEoB1CgaMappingLevel1";
- case kEoB1CgaMappingLevel2:
- return "kEoB1CgaMappingLevel2";
- case kEoB1CgaMappingLevel3:
- return "kEoB1CgaMappingLevel3";
- case kEoB1CgaMappingLevel4:
- return "kEoB1CgaMappingLevel4";
- case kEoB1NpcShpData:
- return "kEoB1NpcShpData";
- case kEoB1NpcSubShpIndex1:
- return "kEoB1NpcSubShpIndex1";
- case kEoB1NpcSubShpIndex2:
- return "kEoB1NpcSubShpIndex2";
- case kEoB1NpcSubShpY:
- return "kEoB1NpcSubShpY";
- case kEoB1Npc0Strings:
- return "kEoB1Npc0Strings";
- case kEoB1Npc11Strings:
- return "kEoB1Npc11Strings";
- case kEoB1Npc12Strings:
- return "kEoB1Npc12Strings";
- case kEoB1Npc21Strings:
- return "kEoB1Npc21Strings";
- case kEoB1Npc22Strings:
- return "kEoB1Npc22Strings";
- case kEoB1Npc31Strings:
- return "kEoB1Npc31Strings";
- case kEoB1Npc32Strings:
- return "kEoB1Npc32Strings";
- case kEoB1Npc4Strings:
- return "kEoB1Npc4Strings";
- case kEoB1Npc5Strings:
- return "kEoB1Npc5Strings";
- case kEoB1Npc6Strings:
- return "kEoB1Npc6Strings";
- case kEoB1Npc7Strings:
- return "kEoB1Npc7Strings";
- case kEoB2MainMenuStrings:
- return "kEoB2MainMenuStrings";
- case kEoB2TransferPortraitFrames:
- return "kEoB2TransferPortraitFrames";
- case kEoB2TransferConvertTable:
- return "kEoB2TransferConvertTable";
- case kEoB2TransferItemTable:
- return "kEoB2TransferItemTable";
- case kEoB2TransferExpTable:
- return "kEoB2TransferExpTable";
- case kEoB2TransferStrings1:
- return "kEoB2TransferStrings1";
- case kEoB2TransferStrings2:
- return "kEoB2TransferStrings2";
- case kEoB2TransferLabels:
- return "kEoB2TransferLabels";
- case kEoB2IntroStrings:
- return "kEoB2IntroStrings";
- case kEoB2IntroCPSFiles:
- return "kEoB2IntroCPSFiles";
- case kEob2IntroAnimData00:
- return "kEob2IntroAnimData00";
- case kEob2IntroAnimData01:
- return "kEob2IntroAnimData01";
- case kEob2IntroAnimData02:
- return "kEob2IntroAnimData02";
- case kEob2IntroAnimData03:
- return "kEob2IntroAnimData03";
- case kEob2IntroAnimData04:
- return "kEob2IntroAnimData04";
- case kEob2IntroAnimData05:
- return "kEob2IntroAnimData05";
- case kEob2IntroAnimData06:
- return "kEob2IntroAnimData06";
- case kEob2IntroAnimData07:
- return "kEob2IntroAnimData07";
- case kEob2IntroAnimData08:
- return "kEob2IntroAnimData08";
- case kEob2IntroAnimData09:
- return "kEob2IntroAnimData09";
- case kEob2IntroAnimData10:
- return "kEob2IntroAnimData10";
- case kEob2IntroAnimData11:
- return "kEob2IntroAnimData11";
- case kEob2IntroAnimData12:
- return "kEob2IntroAnimData12";
- case kEob2IntroAnimData13:
- return "kEob2IntroAnimData13";
- case kEob2IntroAnimData14:
- return "kEob2IntroAnimData14";
- case kEob2IntroAnimData15:
- return "kEob2IntroAnimData15";
- case kEob2IntroAnimData16:
- return "kEob2IntroAnimData16";
- case kEob2IntroAnimData17:
- return "kEob2IntroAnimData17";
- case kEob2IntroAnimData18:
- return "kEob2IntroAnimData18";
- case kEob2IntroAnimData19:
- return "kEob2IntroAnimData19";
- case kEob2IntroAnimData20:
- return "kEob2IntroAnimData20";
- case kEob2IntroAnimData21:
- return "kEob2IntroAnimData21";
- case kEob2IntroAnimData22:
- return "kEob2IntroAnimData22";
- case kEob2IntroAnimData23:
- return "kEob2IntroAnimData23";
- case kEob2IntroAnimData24:
- return "kEob2IntroAnimData24";
- case kEob2IntroAnimData25:
- return "kEob2IntroAnimData25";
- case kEob2IntroAnimData26:
- return "kEob2IntroAnimData26";
- case kEob2IntroAnimData27:
- return "kEob2IntroAnimData27";
- case kEob2IntroAnimData28:
- return "kEob2IntroAnimData28";
- case kEob2IntroAnimData29:
- return "kEob2IntroAnimData29";
- case kEob2IntroAnimData30:
- return "kEob2IntroAnimData30";
- case kEob2IntroAnimData31:
- return "kEob2IntroAnimData31";
- case kEob2IntroAnimData32:
- return "kEob2IntroAnimData32";
- case kEob2IntroAnimData33:
- return "kEob2IntroAnimData33";
- case kEob2IntroAnimData34:
- return "kEob2IntroAnimData34";
- case kEob2IntroAnimData35:
- return "kEob2IntroAnimData35";
- case kEob2IntroAnimData36:
- return "kEob2IntroAnimData36";
- case kEob2IntroAnimData37:
- return "kEob2IntroAnimData37";
- case kEob2IntroAnimData38:
- return "kEob2IntroAnimData38";
- case kEob2IntroAnimData39:
- return "kEob2IntroAnimData39";
- case kEob2IntroAnimData40:
- return "kEob2IntroAnimData40";
- case kEob2IntroAnimData41:
- return "kEob2IntroAnimData41";
- case kEob2IntroAnimData42:
- return "kEob2IntroAnimData42";
- case kEob2IntroAnimData43:
- return "kEob2IntroAnimData43";
- case kEoB2IntroShapes00:
- return "kEoB2IntroShapes00";
- case kEoB2IntroShapes01:
- return "kEoB2IntroShapes01";
- case kEoB2IntroShapes04:
- return "kEoB2IntroShapes04";
- case kEoB2IntroShapes07:
- return "kEoB2IntroShapes07";
- case kEoB2FinaleStrings:
- return "kEoB2FinaleStrings";
- case kEoB2CreditsData:
- return "kEoB2CreditsData";
- case kEoB2FinaleCPSFiles:
- return "kEoB2FinaleCPSFiles";
- case kEob2FinaleAnimData00:
- return "kEob2FinaleAnimData00";
- case kEob2FinaleAnimData01:
- return "kEob2FinaleAnimData01";
- case kEob2FinaleAnimData02:
- return "kEob2FinaleAnimData02";
- case kEob2FinaleAnimData03:
- return "kEob2FinaleAnimData03";
- case kEob2FinaleAnimData04:
- return "kEob2FinaleAnimData04";
- case kEob2FinaleAnimData05:
- return "kEob2FinaleAnimData05";
- case kEob2FinaleAnimData06:
- return "kEob2FinaleAnimData06";
- case kEob2FinaleAnimData07:
- return "kEob2FinaleAnimData07";
- case kEob2FinaleAnimData08:
- return "kEob2FinaleAnimData08";
- case kEob2FinaleAnimData09:
- return "kEob2FinaleAnimData09";
- case kEob2FinaleAnimData10:
- return "kEob2FinaleAnimData10";
- case kEob2FinaleAnimData11:
- return "kEob2FinaleAnimData11";
- case kEob2FinaleAnimData12:
- return "kEob2FinaleAnimData12";
- case kEob2FinaleAnimData13:
- return "kEob2FinaleAnimData13";
- case kEob2FinaleAnimData14:
- return "kEob2FinaleAnimData14";
- case kEob2FinaleAnimData15:
- return "kEob2FinaleAnimData15";
- case kEob2FinaleAnimData16:
- return "kEob2FinaleAnimData16";
- case kEob2FinaleAnimData17:
- return "kEob2FinaleAnimData17";
- case kEob2FinaleAnimData18:
- return "kEob2FinaleAnimData18";
- case kEob2FinaleAnimData19:
- return "kEob2FinaleAnimData19";
- case kEob2FinaleAnimData20:
- return "kEob2FinaleAnimData20";
- case kEoB2FinaleShapes00:
- return "kEoB2FinaleShapes00";
- case kEoB2FinaleShapes03:
- return "kEoB2FinaleShapes03";
- case kEoB2FinaleShapes07:
- return "kEoB2FinaleShapes07";
- case kEoB2FinaleShapes09:
- return "kEoB2FinaleShapes09";
- case kEoB2FinaleShapes10:
- return "kEoB2FinaleShapes10";
- case kEoB2NpcShapeData:
- return "kEoB2NpcShapeData";
- case kEoBBaseClassModifierFlags:
- return "kEoBBaseClassModifierFlags";
- case kEoBBaseMonsterStepTable01:
- return "kEoBBaseMonsterStepTable01";
- case kEoBBaseMonsterStepTable02:
- return "kEoBBaseMonsterStepTable02";
- case kEoBBaseMonsterStepTable1:
- return "kEoBBaseMonsterStepTable1";
- case kEoBBaseMonsterStepTable2:
- return "kEoBBaseMonsterStepTable2";
- case kEoBBaseMonsterStepTable3:
- return "kEoBBaseMonsterStepTable3";
- case kEoBBaseMonsterCloseAttPosTable1:
- return "kEoBBaseMonsterCloseAttPosTable1";
- case kEoBBaseMonsterCloseAttPosTable21:
- return "kEoBBaseMonsterCloseAttPosTable21";
- case kEoBBaseMonsterCloseAttPosTable22:
- return "kEoBBaseMonsterCloseAttPosTable22";
- case kEoBBaseMonsterCloseAttUnkTable:
- return "kEoBBaseMonsterCloseAttUnkTable";
- case kEoBBaseMonsterCloseAttChkTable1:
- return "kEoBBaseMonsterCloseAttChkTable1";
- case kEoBBaseMonsterCloseAttChkTable2:
- return "kEoBBaseMonsterCloseAttChkTable2";
- case kEoBBaseMonsterCloseAttDstTable1:
- return "kEoBBaseMonsterCloseAttDstTable1";
- case kEoBBaseMonsterCloseAttDstTable2:
- return "kEoBBaseMonsterCloseAttDstTable2";
- case kEoBBaseMonsterProximityTable:
- return "kEoBBaseMonsterProximityTable";
- case kEoBBaseFindBlockMonstersTable:
- return "kEoBBaseFindBlockMonstersTable";
- case kEoBBaseMonsterDirChangeTable:
- return "kEoBBaseMonsterDirChangeTable";
- case kEoBBaseMonsterDistAttStrings:
- return "kEoBBaseMonsterDistAttStrings";
- case kEoBBaseEncodeMonsterDefs:
- return "kEoBBaseEncodeMonsterDefs";
- case kEoBBaseNpcPresets:
- return "kEoBBaseNpcPresets";
- case kEoB2Npc1Strings:
- return "kEoB2Npc1Strings";
- case kEoB2Npc2Strings:
- return "kEoB2Npc2Strings";
- case kEoB2MonsterDustStrings:
- return "kEoB2MonsterDustStrings";
- case kEoB2DreamSteps:
- return "kEoB2DreamSteps";
- case kEoB2KheldranStrings:
- return "kEoB2KheldranStrings";
- case kEoB2HornStrings:
- return "kEoB2HornStrings";
- case kEoB2HornSounds:
- return "kEoB2HornSounds";
- case kEoB2WallOfForceDsX:
- return "kEoB2WallOfForceDsX";
- case kEoB2WallOfForceDsY:
- return "kEoB2WallOfForceDsY";
- case kEoB2WallOfForceNumW:
- return "kEoB2WallOfForceNumW";
- case kEoB2WallOfForceNumH:
- return "kEoB2WallOfForceNumH";
- case kEoB2WallOfForceShpId:
- return "kEoB2WallOfForceShpId";
- case kLoLIngamePakFiles:
- return "kLoLIngamePakFiles";
- case kLoLCharacterDefs:
- return "kLoLCharacterDefs";
- case kLoLIngameSfxFiles:
- return "kLoLIngameSfxFiles";
- case kLoLIngameSfxIndex:
- return "kLoLIngameSfxIndex";
- case kLoLMusicTrackMap:
- return "kLoLMusicTrackMap";
- case kLoLIngameGMSfxIndex:
- return "kLoLIngameGMSfxIndex";
- case kLoLIngameMT32SfxIndex:
- return "kLoLIngameMT32SfxIndex";
- case kLoLIngamePcSpkSfxIndex:
- return "kLoLIngamePcSpkSfxIndex";
- case kLoLSpellProperties:
- return "kLoLSpellProperties";
- case kLoLGameShapeMap:
- return "kLoLGameShapeMap";
- case kLoLSceneItemOffs:
- return "kLoLSceneItemOffs";
- case kLoLCharInvIndex:
- return "kLoLCharInvIndex";
- case kLoLCharInvDefs:
- return "kLoLCharInvDefs";
- case kLoLCharDefsMan:
- return "kLoLCharDefsMan";
- case kLoLCharDefsWoman:
- return "kLoLCharDefsWoman";
- case kLoLCharDefsKieran:
- return "kLoLCharDefsKieran";
- case kLoLCharDefsAkshel:
- return "kLoLCharDefsAkshel";
- case kLoLExpRequirements:
- return "kLoLExpRequirements";
- case kLoLMonsterModifiers1:
- return "kLoLMonsterModifiers1";
- case kLoLMonsterModifiers2:
- return "kLoLMonsterModifiers2";
- case kLoLMonsterModifiers3:
- return "kLoLMonsterModifiers3";
- case kLoLMonsterModifiers4:
- return "kLoLMonsterModifiers4";
- case kLoLMonsterShiftOffsets:
- return "kLoLMonsterShiftOffsets";
- case kLoLMonsterDirFlags:
- return "kLoLMonsterDirFlags";
- case kLoLMonsterScaleY:
- return "kLoLMonsterScaleY";
- case kLoLMonsterScaleX:
- return "kLoLMonsterScaleX";
- case kLoLMonsterScaleWH:
- return "kLoLMonsterScaleWH";
- case kLoLFlyingObjectShp:
- return "kLoLFlyingObjectShp";
- case kLoLInventoryDesc:
- return "kLoLInventoryDesc";
- case kLoLLevelShpList:
- return "kLoLLevelShpList";
- case kLoLLevelDatList:
- return "kLoLLevelDatList";
- case kLoLCompassDefs:
- return "kLoLCompassDefs";
- case kLoLItemPrices:
- return "kLoLItemPrices";
- case kLoLStashSetup:
- return "kLoLStashSetup";
- case kLoLDscWalls:
- return "kLoLDscWalls";
- case kRpgCommonDscShapeIndex:
- return "kRpgCommonDscShapeIndex";
- case kLoLDscOvlMap:
- return "kLoLDscOvlMap";
- case kLoLDscScaleWidthData:
- return "kLoLDscScaleWidthData";
- case kLoLDscScaleHeightData:
- return "kLoLDscScaleHeightData";
- case kRpgCommonDscX:
- return "kRpgCommonDscX";
- case kLoLDscY:
- return "kLoLDscY";
- case kRpgCommonDscTileIndex:
- return "kRpgCommonDscTileIndex";
- case kRpgCommonDscUnk2:
- return "kRpgCommonDscUnk2";
- case kRpgCommonDscDoorShapeIndex:
- return "kRpgCommonDscDoorShapeIndex";
- case kRpgCommonDscDimData1:
- return "kRpgCommonDscDimData1";
- case kRpgCommonDscDimData2:
- return "kRpgCommonDscDimData2";
- case kRpgCommonDscBlockMap:
- return "kRpgCommonDscBlockMap";
- case kRpgCommonDscDimMap:
- return "kRpgCommonDscDimMap";
- case kLoLDscOvlIndex:
- return "kLoLDscOvlIndex";
- case kRpgCommonDscBlockIndex:
- return "kRpgCommonDscBlockIndex";
- case kRpgCommonDscDoorY2:
- return "kRpgCommonDscDoorY2";
- case kRpgCommonDscDoorFrameY1:
- return "kRpgCommonDscDoorFrameY1";
- case kRpgCommonDscDoorFrameY2:
- return "kRpgCommonDscDoorFrameY2";
- case kRpgCommonDscDoorFrameIndex1:
- return "kRpgCommonDscDoorFrameIndex1";
- case kRpgCommonDscDoorFrameIndex2:
- return "kRpgCommonDscDoorFrameIndex2";
- case kLoLDscDoorScale:
- return "kLoLDscDoorScale";
- case kLoLDscDoor4:
- return "kLoLDscDoor4";
- case kLoLDscDoorX:
- return "kLoLDscDoorX";
- case kLoLDscDoorY:
- return "kLoLDscDoorY";
- case kLoLScrollXTop:
- return "kLoLScrollXTop";
- case kLoLScrollYTop:
- return "kLoLScrollYTop";
- case kLoLScrollXBottom:
- return "kLoLScrollXBottom";
- case kLoLScrollYBottom:
- return "kLoLScrollYBottom";
- case kLoLButtonDefs:
- return "kLoLButtonDefs";
- case kLoLButtonList1:
- return "kLoLButtonList1";
- case kLoLButtonList2:
- return "kLoLButtonList2";
- case kLoLButtonList3:
- return "kLoLButtonList3";
- case kLoLButtonList4:
- return "kLoLButtonList4";
- case kLoLButtonList5:
- return "kLoLButtonList5";
- case kLoLButtonList6:
- return "kLoLButtonList6";
- case kLoLButtonList7:
- return "kLoLButtonList7";
- case kLoLButtonList8:
- return "kLoLButtonList8";
- case kLoLLegendData:
- return "kLoLLegendData";
- case kLoLMapCursorOvl:
- return "kLoLMapCursorOvl";
- case kLoLMapStringId:
- return "kLoLMapStringId";
- case kLoLSpellbookAnim:
- return "kLoLSpellbookAnim";
- case kLoLSpellbookCoords:
- return "kLoLSpellbookCoords";
- case kLoLHealShapeFrames:
- return "kLoLHealShapeFrames";
- case kLoLLightningDefs:
- return "kLoLLightningDefs";
- case kLoLFireballCoords:
- return "kLoLFireballCoords";
- case kLoLCredits:
- return "kLoLCredits";
- case kLoLHistory:
- return "kLoLHistory";
- default:
- return "Unknown";
- }
}
-struct ExtractData {
- ExtractData() : desc(), offset() {}
- ExtractData(ExtractEntrySearchData d, uint32 o) : desc(d), offset(o) {}
-
- ExtractEntrySearchData desc;
- uint32 offset;
-};
-
-typedef std::pair<int, ExtractEntrySearchData> SearchMapEntry;
-typedef std::multimap<int, ExtractEntrySearchData> SearchMap;
-
-typedef std::pair<int, ExtractData> ExtractMapEntry;
-typedef std::multimap<int, ExtractData> ExtractMap;
-
-bool getExtractionData(const Game *g, Search &search, ExtractMap &map);
-
-bool createIDMap(PAKFile &out, const ExtractInformation *eI, const int *needList);
-
-bool process(PAKFile &out, const Game *g, const byte *data, const uint32 size) {
- char filename[128];
-
- Search search(data, size);
- ExtractMap ids;
-
- if (!getExtractionData(g, search, ids))
- return false;
-
- const int *needList = getNeedList(g);
- if (!needList) {
- fprintf(stderr, "ERROR: No entry need list available\n");
- return false;
- }
-
- ExtractInformation extractInfo;
- extractInfo.game = g->game;
- extractInfo.platform = g->platform;
- extractInfo.special = g->special;
-
- for (ExtractMap::const_iterator i = ids.begin(); i != ids.end(); ++i) {
- const int id = i->first;
- extractInfo.lang = i->second.desc.lang;
-
- const ExtractFilename *fDesc = getFilenameDesc(id);
-
- if (!fDesc) {
- fprintf(stderr, "ERROR: couldn't find file description for id %d/%s\n", id, getIdString(id));
- return false;
- }
-
- filename[0] = 0;
- if (!getFilename(filename, &extractInfo, id)) {
- fprintf(stderr, "ERROR: couldn't get filename for id %d/%s\n", id, getIdString(id));
- return false;
- }
-
- const ExtractType *tDesc = findExtractType(fDesc->type);
-
- if (!tDesc) {
- fprintf(stderr, "ERROR: couldn't find type description for id %d/%s (%d)\n", id, getIdString(id), fDesc->type);
- return false;
- }
-
- PAKFile::cFileList *list = out.getFileList();
- if (list && list->findEntry(filename) != 0)
- continue;
-
- if (!tDesc->extract(out, &extractInfo, data + i->second.offset, i->second.desc.hint.size, filename, id)) {
- fprintf(stderr, "ERROR: couldn't extract id %d/%s\n", id, getIdString(id));
- return false;
- }
- }
-
- for (int i = 0; i < 3; ++i) {
- if (g->lang[i] == -1)
- continue;
-
- extractInfo.lang = g->lang[i];
- if (!createIDMap(out, &extractInfo, needList))
- return false;
-
- if (!updateIndex(out, &extractInfo)) {
- error("couldn't update INDEX file, stop processing of all files");
+bool createIDMap(PAKFile &out, const Game *g, const int *needList) {
+ int dataEntries = 0;
+ // Count entries in the need list and check whether the resources are
+ // present
+ for (const int *n = needList; *n != -1; ++n) {
+ char filename[12];
+ if (!getFilename(filename, g, *n) || !out.getFileList()->findEntry(filename)) {
+ fprintf(stderr, "ERROR: Could not find need %d for game %04X", *n, createGameDef(g));
return false;
}
- }
-
- return true;
-}
-
-bool createIDMap(PAKFile &out, const ExtractInformation *eI, const int *needList) {
- int dataEntries = 0;
- // Count entries in the need list
- for (const int *n = needList; *n != -1; ++n)
++dataEntries;
+ }
const int mapSize = 2 + dataEntries * (2 + 1 + 4);
uint8 *map = new uint8[mapSize];
@@ -2354,206 +919,22 @@ bool createIDMap(PAKFile &out, const ExtractInformation *eI, const int *needList
delete[] map;
return false;
}
- *dst++ = getTypeID(fDesc->type);
- WRITE_BE_UINT32(dst, getFilename(eI, *id)); dst += 4;
+ *dst++ = fDesc->type;
+ WRITE_BE_UINT32(dst, getFilename(g, *id)); dst += 4;
}
char filename[12];
- if (!getFilename(filename, eI, 0)) {
+ if (!getFilename(filename, g, 0)) {
fprintf(stderr, "ERROR: Could not create ID map for game\n");
delete[] map;
return false;
}
- out.removeFile(filename);
if (!out.addFile(filename, map, mapSize)) {
fprintf(stderr, "ERROR: Could not add ID map \"%s\" to kyra.dat\n", filename);
delete[] map;
return false;
}
- delete[] map;
return true;
}
-
-// Uncomment this to get various debug information about the detection table entries.
-//#define DEBUG_EXTRACTION_TABLES
-
-bool setupSearch(const Game *g, const int *needList, Search &search, SearchMap &searchData) {
- for (const int *entry = needList; *entry != -1; ++entry) {
- ExtractEntryList providers = getProvidersForId(*entry);
-
- if (providers.empty()) {
- fprintf(stderr, "ERROR: No provider for id %d/%s\n", *entry, getIdString(*entry));
- return false;
- } else {
- for (ExtractEntryList::const_iterator i = providers.begin(); i != providers.end(); ++i) {
- // Only add generic or partly matching providers here.
-#ifndef DEBUG_EXTRACTION_TABLES
- if ((i->lang == UNK_LANG || i->lang == g->lang[0] || i->lang == g->lang[1] || i->lang == g->lang[2]) &&
- (i->platform == kPlatformUnknown || (i->platform == g->platform))) {
-#endif
- search.addData(i->hint);
- searchData.insert(SearchMapEntry(*entry, *i));
-#ifndef DEBUG_EXTRACTION_TABLES
- }
-#endif
- }
- }
- }
-
- return true;
-}
-
-typedef std::list<ExtractMap::const_iterator> MatchList;
-MatchList filterPlatformMatches(const Game *g, std::pair<ExtractMap::const_iterator, ExtractMap::const_iterator> range) {
- bool hasPlatformMatch = false;
- for (ExtractMap::const_iterator i = range.first; i != range.second; ++i) {
- if (i->second.desc.platform == g->platform) {
- hasPlatformMatch = true;
- break;
- }
- }
-
- MatchList result;
- if (hasPlatformMatch) {
- for (ExtractMap::const_iterator i = range.first; i != range.second; ++i) {
- if (i->second.desc.platform == g->platform)
- result.push_back(i);
- }
- } else {
- for (ExtractMap::const_iterator i = range.first; i != range.second; ++i)
- result.push_back(i);
- }
-
- return result;
-}
-
-MatchList filterLanguageMatches(const int lang, const MatchList &input) {
- std::list<ExtractMap::const_iterator> result;
-
- for (MatchList::const_iterator i = input.begin(); i != input.end(); ++i) {
- if ((*i)->second.desc.lang == lang)
- result.push_back(*i);
- }
-
- return result;
-}
-
-MatchList::const_iterator filterOutBestMatch(const MatchList &input) {
- MatchList::const_iterator result = input.begin();
-
- if (input.size() > 1)
- warning("Multiple entries found for id %d/%s", (*result)->first, getIdString((*result)->first));
-
- for (MatchList::const_iterator i = input.begin(); i != input.end(); ++i) {
- // Reduce all entries to one single entry.
- //
- // We use the following rules for this (in this order):
- // - Prefer the entry with the higest size
- // - Prefer the entry, which starts at the smallest offest
- //
- // TODO: These rules might not be safe for all games, but hopefully
- // they will work fine. If there are any problems it should be rather
- // easy to identify them, since we print out a warning for multiple
- // entries found.
- if ((*result)->second.desc.hint.size <= (*i)->second.desc.hint.size) {
- if ((*result)->second.offset >= (*i)->second.offset)
- result = i;
- }
- }
-
- return result;
-}
-
-bool getExtractionData(const Game *g, Search &search, ExtractMap &map) {
- SearchMap searchMap;
-
- const int *needList = getNeedList(g);
- if (!needList) {
- fprintf(stderr, "ERROR: No entry need list available\n");
- return false;
- }
-
- if (!setupSearch(g, needList, search, searchMap))
- return false;
-
- // Process the data search
- Search::ResultList results;
- search.search(results);
-
- if (results.empty()) {
- fprintf(stderr, "ERROR: Couldn't find any required data\n");
- return false;
- }
-
- ExtractMap temporaryExtractMap;
- for (const int *entry = needList; *entry != -1; ++entry) {
- typedef std::pair<SearchMap::const_iterator, SearchMap::const_iterator> KeyRange;
- KeyRange idRange = searchMap.equal_range(*entry);
-
- for (Search::ResultList::const_iterator i = results.begin(); i != results.end(); ++i) {
- for (SearchMap::const_iterator j = idRange.first; j != idRange.second; ++j) {
- if (j->second.hint == i->data)
- temporaryExtractMap.insert(ExtractMapEntry(*entry, ExtractData(j->second, i->offset)));
- }
- }
- }
-
- // Free up some memory
- results.clear();
- searchMap.clear();
-
- bool result = true;
-
- for (const int *entry = needList; *entry != -1; ++entry) {
- MatchList possibleMatches = filterPlatformMatches(g, temporaryExtractMap.equal_range(*entry));
-
- if (possibleMatches.empty()) {
- fprintf(stderr, "ERROR: No entry found for id %d/%s\n", *entry, getIdString(*entry));
- result = false;
- continue;
- }
-
- if (isLangSpecific(*entry)) {
- for (int i = 0; i < 3; ++i) {
- if (g->lang[i] == -1)
- continue;
-
- MatchList langMatches = filterLanguageMatches(g->lang[i], possibleMatches);
- MatchList::const_iterator bestMatch = filterOutBestMatch(langMatches);
-
- if (bestMatch == langMatches.end()) {
- // TODO: Add nice language name to output message.
- fprintf(stderr, "ERROR: No entry found for id %d/%s for language %d\n", *entry, getIdString(*entry), g->lang[i]);
- result = false;
- continue;
- }
-
-#ifdef DEBUG_EXTRACTION_TABLES
- if (((*bestMatch)->second.desc.platform != kPlatformUnknown && (*bestMatch)->second.desc.platform != g->platform))
- printf("%s: %.8X %.8X %d %d\n", getIdString(*entry), (*bestMatch)->second.desc.hint.size, (*bestMatch)->second.desc.hint.byteSum, (*bestMatch)->second.desc.lang, (*bestMatch)->second.desc.platform);
-#endif
-
- map.insert(**bestMatch);
- }
- } else {
- MatchList::const_iterator bestMatch = filterOutBestMatch(possibleMatches);
-
- if (bestMatch == possibleMatches.end()) {
- fprintf(stderr, "ERROR: No entry found for id %d/%s\n", *entry, getIdString(*entry));
- result = false;
- continue;
- }
-
-#ifdef DEBUG_EXTRACTION_TABLES
- if (((*bestMatch)->second.desc.platform != kPlatformUnknown && (*bestMatch)->second.desc.platform != g->platform))
- printf("%s: %.8X %.8X %d %d\n", getIdString(*entry), (*bestMatch)->second.desc.hint.size, (*bestMatch)->second.desc.hint.byteSum, (*bestMatch)->second.desc.lang, (*bestMatch)->second.desc.platform);
-#endif
-
- map.insert(**bestMatch);
- }
- }
-
- return result;
-}
diff --git a/devtools/create_kyradat/create_kyradat.h b/devtools/create_kyradat/create_kyradat.h
index 6d5059cabe..a6bee6f75c 100644
--- a/devtools/create_kyradat/create_kyradat.h
+++ b/devtools/create_kyradat/create_kyradat.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -23,7 +23,7 @@
#ifndef CREATE_KYRADAT_CREATE_KYRADAT_H
#define CREATE_KYRADAT_CREATE_KYRADAT_H
-#include "util.h"
+#include "common/scummsys.h"
// This list has to match orderwise (and thus value wise) the static data list of "engines/kyra/resource.h"!
enum kExtractID {
@@ -227,7 +227,7 @@ enum kExtractID {
kEoBBaseCursedString,
kEoBBaseEnchantedString,
kEoBBaseMagicObjectStrings,
- kEoBBaseMagicObject5String,
+ kEoBBaseMagicObjectString5,
kEoBBasePatternSuffix,
kEoBBasePatternGrFix1,
kEoBBasePatternGrFix2,
@@ -235,7 +235,7 @@ enum kExtractID {
kEoBBaseValidateCursedString,
kEoBBaseValidateNoDropString,
kEoBBasePotionStrings,
- kEoBBaseWandString,
+ kEoBBaseWandStrings,
kEoBBaseItemMisuseStrings,
kEoBBaseTakenStrings,
@@ -347,7 +347,7 @@ enum kExtractID {
kEoBBaseDscItemPosIndex,
kEoBBaseDscItemShpX,
- kEoBBaseDscItemPosUnk,
+ kEoBBaseDscItemScaleIndex,
kEoBBaseDscItemTileIndex,
kEoBBaseDscItemShapeMap,
@@ -493,50 +493,50 @@ enum kExtractID {
kEoB2IntroStrings,
kEoB2IntroCPSFiles,
- kEob2IntroAnimData00,
- kEob2IntroAnimData01,
- kEob2IntroAnimData02,
- kEob2IntroAnimData03,
- kEob2IntroAnimData04,
- kEob2IntroAnimData05,
- kEob2IntroAnimData06,
- kEob2IntroAnimData07,
- kEob2IntroAnimData08,
- kEob2IntroAnimData09,
- kEob2IntroAnimData10,
- kEob2IntroAnimData11,
- kEob2IntroAnimData12,
- kEob2IntroAnimData13,
- kEob2IntroAnimData14,
- kEob2IntroAnimData15,
- kEob2IntroAnimData16,
- kEob2IntroAnimData17,
- kEob2IntroAnimData18,
- kEob2IntroAnimData19,
- kEob2IntroAnimData20,
- kEob2IntroAnimData21,
- kEob2IntroAnimData22,
- kEob2IntroAnimData23,
- kEob2IntroAnimData24,
- kEob2IntroAnimData25,
- kEob2IntroAnimData26,
- kEob2IntroAnimData27,
- kEob2IntroAnimData28,
- kEob2IntroAnimData29,
- kEob2IntroAnimData30,
- kEob2IntroAnimData31,
- kEob2IntroAnimData32,
- kEob2IntroAnimData33,
- kEob2IntroAnimData34,
- kEob2IntroAnimData35,
- kEob2IntroAnimData36,
- kEob2IntroAnimData37,
- kEob2IntroAnimData38,
- kEob2IntroAnimData39,
- kEob2IntroAnimData40,
- kEob2IntroAnimData41,
- kEob2IntroAnimData42,
- kEob2IntroAnimData43,
+ kEoB2IntroAnimData00,
+ kEoB2IntroAnimData01,
+ kEoB2IntroAnimData02,
+ kEoB2IntroAnimData03,
+ kEoB2IntroAnimData04,
+ kEoB2IntroAnimData05,
+ kEoB2IntroAnimData06,
+ kEoB2IntroAnimData07,
+ kEoB2IntroAnimData08,
+ kEoB2IntroAnimData09,
+ kEoB2IntroAnimData10,
+ kEoB2IntroAnimData11,
+ kEoB2IntroAnimData12,
+ kEoB2IntroAnimData13,
+ kEoB2IntroAnimData14,
+ kEoB2IntroAnimData15,
+ kEoB2IntroAnimData16,
+ kEoB2IntroAnimData17,
+ kEoB2IntroAnimData18,
+ kEoB2IntroAnimData19,
+ kEoB2IntroAnimData20,
+ kEoB2IntroAnimData21,
+ kEoB2IntroAnimData22,
+ kEoB2IntroAnimData23,
+ kEoB2IntroAnimData24,
+ kEoB2IntroAnimData25,
+ kEoB2IntroAnimData26,
+ kEoB2IntroAnimData27,
+ kEoB2IntroAnimData28,
+ kEoB2IntroAnimData29,
+ kEoB2IntroAnimData30,
+ kEoB2IntroAnimData31,
+ kEoB2IntroAnimData32,
+ kEoB2IntroAnimData33,
+ kEoB2IntroAnimData34,
+ kEoB2IntroAnimData35,
+ kEoB2IntroAnimData36,
+ kEoB2IntroAnimData37,
+ kEoB2IntroAnimData38,
+ kEoB2IntroAnimData39,
+ kEoB2IntroAnimData40,
+ kEoB2IntroAnimData41,
+ kEoB2IntroAnimData42,
+ kEoB2IntroAnimData43,
kEoB2IntroShapes00,
kEoB2IntroShapes01,
kEoB2IntroShapes04,
@@ -545,27 +545,27 @@ enum kExtractID {
kEoB2FinaleStrings,
kEoB2CreditsData,
kEoB2FinaleCPSFiles,
- kEob2FinaleAnimData00,
- kEob2FinaleAnimData01,
- kEob2FinaleAnimData02,
- kEob2FinaleAnimData03,
- kEob2FinaleAnimData04,
- kEob2FinaleAnimData05,
- kEob2FinaleAnimData06,
- kEob2FinaleAnimData07,
- kEob2FinaleAnimData08,
- kEob2FinaleAnimData09,
- kEob2FinaleAnimData10,
- kEob2FinaleAnimData11,
- kEob2FinaleAnimData12,
- kEob2FinaleAnimData13,
- kEob2FinaleAnimData14,
- kEob2FinaleAnimData15,
- kEob2FinaleAnimData16,
- kEob2FinaleAnimData17,
- kEob2FinaleAnimData18,
- kEob2FinaleAnimData19,
- kEob2FinaleAnimData20,
+ kEoB2FinaleAnimData00,
+ kEoB2FinaleAnimData01,
+ kEoB2FinaleAnimData02,
+ kEoB2FinaleAnimData03,
+ kEoB2FinaleAnimData04,
+ kEoB2FinaleAnimData05,
+ kEoB2FinaleAnimData06,
+ kEoB2FinaleAnimData07,
+ kEoB2FinaleAnimData08,
+ kEoB2FinaleAnimData09,
+ kEoB2FinaleAnimData10,
+ kEoB2FinaleAnimData11,
+ kEoB2FinaleAnimData12,
+ kEoB2FinaleAnimData13,
+ kEoB2FinaleAnimData14,
+ kEoB2FinaleAnimData15,
+ kEoB2FinaleAnimData16,
+ kEoB2FinaleAnimData17,
+ kEoB2FinaleAnimData18,
+ kEoB2FinaleAnimData19,
+ kEoB2FinaleAnimData20,
kEoB2FinaleShapes00,
kEoB2FinaleShapes03,
kEoB2FinaleShapes07,
@@ -628,7 +628,7 @@ enum kExtractID {
kLoLDscOvlMap,
kLoLDscScaleWidthData,
kLoLDscScaleHeightData,
- kLoLDscY,
+ kLoLBaseDscY,
kLoLDscDoorScale,
kLoLDscDoor4,
@@ -668,6 +668,30 @@ enum kExtractID {
kMaxResIDs
};
+enum ResTypes {
+ kStringList = 0,
+ kRawData = 1,
+ kRoomList = 2,
+ kShapeList = 3,
+ kAmigaSfxTable = 4,
+
+ k2SeqData = 5,
+ k2SeqItemAnimData = 6,
+ k2ItemAnimDefinition = 7,
+
+ kLoLCharData = 8,
+ kLoLSpellData = 9,
+ kLoLCompassData = 10,
+ kLoLFlightShpData = 11,
+ kLoLButtonData = 12,
+ kRawDataBe16 = 13,
+ kRawDataBe32 = 14,
+
+ kEoB2SequenceData = 15,
+ kEoB2ShapeData = 16,
+ kEoBNpcData = 17
+};
+
struct ExtractFilename {
int id;
int type;
@@ -686,21 +710,19 @@ enum kGame {
kKyra1 = 0,
kKyra2,
kKyra3,
- kLoL,
kEoB1,
- kEoB2
+ kEoB2,
+ kLoL
};
struct Game {
int game;
- int lang[3];
int platform;
int special;
-
- const char *md5[2];
+ int lang;
};
-#define GAME_DUMMY_ENTRY { -1, { -1, -1, -1 }, -1, -1, { 0, 0 } }
+#define GAME_DUMMY_ENTRY { -1, -1, -1, -1 }
extern const Game * const gameDescs[];
diff --git a/devtools/create_kyradat/extract.cpp b/devtools/create_kyradat/extract.cpp
deleted file mode 100644
index b2f520d0d3..0000000000
--- a/devtools/create_kyradat/extract.cpp
+++ /dev/null
@@ -1,1237 +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.
- *
- */
-
-// Disable symbol overrides so that we can use system headers.
-#define FORBIDDEN_SYMBOL_ALLOW_ALL
-
-#include "extract.h"
-#include "common/language.h"
-#include "common/platform.h"
-
-#include <algorithm>
-
-namespace {
-
-// Extraction function prototypes
-
-bool extractRaw(PAKFile &out, const ExtractInformation *info, const byte *data, const uint32 size, const char *filename, int id);
-bool extractStrings(PAKFile &out, const ExtractInformation *info, const byte *data, const uint32 size, const char *filename, int id);
-bool extractStrings10(PAKFile &out, const ExtractInformation *info, const byte *data, const uint32 size, const char *filename, int id);
-bool extractRooms(PAKFile &out, const ExtractInformation *info, const byte *data, const uint32 size, const char *filename, int id);
-bool extractShapes(PAKFile &out, const ExtractInformation *info, const byte *data, const uint32 size, const char *filename, int id);
-bool extractKyraForestSeqData(PAKFile &out, const ExtractInformation *info, const byte *data, const uint32 size, const char *filename, int id);
-bool extractAmigaSfx(PAKFile &out, const ExtractInformation *info, const byte *data, const uint32 size, const char *filename, int id);
-bool extractWdSfx(PAKFile &out, const ExtractInformation *info, const byte *data, const uint32 size, const char *filename, int id);
-
-bool extractHofSeqData(PAKFile &out, const ExtractInformation *info, const byte *data, const uint32 size, const char *filename, int id);
-bool extractHofShapeAnimDataV1(PAKFile &out, const ExtractInformation *info, const byte *data, const uint32 size, const char *filename, int id);
-bool extractHofShapeAnimDataV2(PAKFile &out, const ExtractInformation *info, const byte *data, const uint32 size, const char *filename, int id);
-
-bool extractStringsWoSuffix(PAKFile &out, const ExtractInformation *info, const byte *data, const uint32 size, const char *filename, int id);
-bool extractPaddedStrings(PAKFile &out, const ExtractInformation *info, const byte *data, const uint32 size, const char *filename, int id);
-bool extractRaw16to8(PAKFile &out, const ExtractInformation *info, const byte *data, const uint32 size, const char *filename, int id);
-bool extractMrShapeAnimData(PAKFile &out, const ExtractInformation *info, const byte *data, const uint32 size, const char *filename, int id);
-bool extractRaw16(PAKFile &out, const ExtractInformation *info, const byte *data, const uint32 size, const char *filename, int id);
-bool extractRaw32(PAKFile &out, const ExtractInformation *info, const byte *data, const uint32 size, const char *filename, int id);
-bool extractLoLButtonDefs(PAKFile &out, const ExtractInformation *info, const byte *data, const uint32 size, const char *filename, int id);
-bool extractLoLFlyingShpDefs(PAKFile &out, const ExtractInformation *info, const byte *data, const uint32 size, const char *filename, int id);
-
-bool extractEoB2SeqData(PAKFile &out, const ExtractInformation *info, const byte *data, const uint32 size, const char *filename, int id);
-bool extractEoB2ShapeData(PAKFile &out, const ExtractInformation *info, const byte *data, const uint32 size, const char *filename, int id);
-bool extractEoBNpcData(PAKFile &out, const ExtractInformation *info, const byte *data, const uint32 size, const char *filename, int id);
-// Extraction type table
-
-const ExtractType extractTypeTable[] = {
- { kTypeStringList, extractStrings },
- { kTypeRoomList, extractRooms },
- { kTypeShapeList, extractShapes },
- { kTypeRawData, extractRaw },
- { kTypeForestSeqData, extractKyraForestSeqData },
- { kTypeAmigaSfxTable, extractAmigaSfx },
- { kTypeTownsWDSfxTable, extractWdSfx },
-
- { k2TypeSeqData, extractHofSeqData },
- { k2TypeShpDataV1, extractHofShapeAnimDataV1 },
- { k2TypeShpDataV2, extractHofShapeAnimDataV2 },
- { k2TypeSoundList, extractStringsWoSuffix },
- { k2TypeLangSoundList, extractStringsWoSuffix },
- { k2TypeSize10StringList, extractStrings10 },
- { k2TypeSfxList, extractPaddedStrings },
- { k3TypeRaw16to8, extractRaw16to8 },
- { k3TypeShpData, extractMrShapeAnimData },
-
- { kLoLTypeCharData, extractRaw },
- { kLoLTypeSpellData, extractRaw },
- { kLoLTypeCompassData, extractRaw16to8 },
- { kLoLTypeFlightShpData, extractLoLFlyingShpDefs },
- { kLoLTypeRaw16, extractRaw16 },
- { kLoLTypeRaw32, extractRaw32 },
- { kLoLTypeButtonDef, extractLoLButtonDefs },
-
- { kEoB2TypeSeqData, extractEoB2SeqData },
- { kEoB2TypeShapeData, extractEoB2ShapeData },
- { kEoBTypeNpcData, extractEoBNpcData },
-
- { -1, 0 }
-};
-
-// TODO: Clean up the mess of data types we have... it seems some special types
-// we have (even in the main KYRA code, is just raw data access, but used specially
-// to have a nice wrapper from inside StaticResource...).
-const TypeTable typeTable[] = {
- { kTypeStringList, 0 },
- { kTypeRawData, 1 },
- { kTypeRoomList, 2 },
- { kTypeShapeList, 3 },
- { kTypeForestSeqData, 1 },
- { kTypeAmigaSfxTable, 4 },
- { kTypeTownsWDSfxTable, 1 },
- { k2TypeSeqData, 5 },
- { k2TypeShpDataV1, 6 },
- { k2TypeShpDataV2, 7 },
- { k2TypeSoundList, 0 },
- { k2TypeLangSoundList, 0 },
- { k2TypeSize10StringList, 0 },
- { k2TypeSfxList, 0 },
- { k3TypeRaw16to8, 1 },
- { k3TypeShpData, 7 },
- { kLoLTypeRaw16, 13 },
- { kLoLTypeRaw32, 14 },
- { kLoLTypeButtonDef, 12 },
- { kLoLTypeCharData, 8 },
- { kLoLTypeSpellData, 9 },
- { kLoLTypeCompassData, 10 },
- { kLoLTypeFlightShpData, 11 },
- { kEoB2TypeSeqData, 15 },
- { kEoB2TypeShapeData, 16 },
- { kEoBTypeNpcData, 17},
- { -1, 1 }
-};
-
-} // end of anonymous namespace
-
-// misc
-
-const ExtractType *findExtractType(const int type) {
- for (const ExtractType *i = extractTypeTable; i->type != -1; ++i) {
- if (i->type == type)
- return i;
- }
- return 0;
-}
-
-byte getTypeID(int type) {
- return std::find(typeTable, ARRAYEND(typeTable) - 1, type)->value;
-}
-// Extractor implementation
-
-namespace {
-
-bool extractRaw(PAKFile &out, const ExtractInformation *info, const byte *data, const uint32 size, const char *filename, int id) {
- uint8 *buffer = new uint8[size];
- assert(buffer);
- memcpy(buffer, data, size);
-
- return out.addFile(filename, buffer, size);
-}
-
-bool extractStrings(PAKFile &out, const ExtractInformation *info, const byte *data, const uint32 size, const char *filename, int id) {
- // 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;
- uint 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)
- patch = 1;
- else if (id == k1IntroStrings)
- patch = 2;
- else if (id == k2SeqplayStrings)
- patch = 3;
- } else if (info->platform == kPlatformDOS) {
- if (id == k2IngamePakFiles)
- patch = 4;
-
- if (info->lang == Common::RU_RUS && info->special == kNoSpecial) {
- 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)
- return extractStringsWoSuffix(out, info, data, size, filename, id);
- }
-
- uint32 entries = 0;
- uint32 targetsize = size + 4;
- for (uint32 i = 0; i < size; ++i) {
- if (!data[i]) {
- if (info->platform == kPlatformAmiga) {
- if (i + 1 >= size)
- ++entries;
- else if (!data[i+1] && !(i & 1))
- continue;
- else
- ++entries;
- } else {
- ++entries;
- }
-
- if (info->platform == kPlatformFMTowns) {
- // prevents creation of empty entries (which we have mostly between all strings in the FM-TOWNS version)
- while (!data[++i]) {
- if (i == size)
- break;
- targetsize--;
- }
- 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].
- // We simply skip every other string
- if (i == size)
- continue;
- uint32 len = strlen((const char*) data + i);
- i += len;
-
- targetsize = targetsize - 1 - len;
-
- while (!data[++i]) {
- if (i == len)
- break;
- 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 (patch == 2) {
- if (info->lang == EN_ANY) {
- targetsize--;
- entries += 1;
- } else if (info->lang == JA_JPN) {
- targetsize += 2;
- entries += 2;
- }
- }
-
- if (patch == 3) {
- entries++;
- targetsize++;
- }
-
- if (patch == 4) {
- targetsize -= 9;
- }
-
- uint8 *buffer = new uint8[targetsize];
- assert(buffer);
- 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 (patch == 2 && input - data == 0x3C0 && input[0x10] == 0x32) {
- memcpy(output, input, 0x0F);
- input += 0x11; output += 0x0F;
- }
-
- strcpy((char *) output, (const char*) input);
- uint32 stringsize = strlen((const char*)output) + 1;
- input += stringsize; output += stringsize;
- // skip empty entries
- while (!*input) {
- // Write one empty string into intro strings file
- 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 (patch == 3) {
- if ((info->lang == EN_ANY && input - data == 0x695) ||
- (info->lang == JA_JPN && input - data == 0x598))
- *output++ = *input;
- }
-
- if (++input == c)
- break;
- }
-
- 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].
- // We simply skip every other string
- if (input == c)
- continue;
- input += strlen((const char*)input);
- while (!*input) {
- if (++input == c)
- break;
- }
- }
-
- } while (input < c);
- } else if (info->platform == kPlatformAmiga) {
- // we need to strip some aligment zeros out here
- int dstPos = 0;
- for (uint32 i = 0; i < size; ++i) {
- if (!data[i] && !(i & 1)) {
- if (i + 1 > size)
- continue;
- else if (i + 1 < size && !data[i+1])
- continue;
- }
-
- *output++ = data[i];
- ++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 (patch == 4) {
- memcpy(output, data, 44);
- output += 44;
- data += 44;
- for (int t = 1; t != 10; t++) {
- sprintf((char *) output, "COST%d_SH.PAK", t);
- output += 13;
- }
- data += 126;
- copySize -= 170;
- }
- memcpy(output, data, copySize);
- }
-
- return out.addFile(filename, buffer, targetsize);
-}
-
-bool extractStrings10(PAKFile &out, const ExtractInformation *info, const byte *data, const uint32 size, const char *filename, int id) {
- // HACK...
- if (info->platform == kPlatformFMTowns && id == k2IngameSfxFiles)
- return extractStringsWoSuffix(out, info, data, size, filename, id);
-
- const int strSize = 10;
- uint32 entries = (size + (strSize - 1)) / strSize;
-
- uint8 *buffer = new uint8[size + 4];
- assert(buffer);
- uint8 *output = buffer;
- WRITE_BE_UINT32(output, entries); output += 4;
-
- for (uint32 i = 0; i < entries; ++i) {
- const byte *src = data + i * strSize;
-
- while (*src)
- *output++ = *src++;
- *output++ = '\0';
- }
-
- return out.addFile(filename, buffer, output - buffer);
-}
-
-bool extractRooms(PAKFile &out, const ExtractInformation *info, const byte *data, const uint32 size, const char *filename, int id) {
- // different entry size for the FM-TOWNS version
- const int roomEntrySize = (info->platform == kPlatformFMTowns) ? (0x69) : ((info->platform == kPlatformAmiga) ? 0x52 : 0x51);
- const int countRooms = size / roomEntrySize;
-
- uint8 *buffer = new uint8[countRooms * 9 + 4];
- assert(buffer);
- uint8 *output = buffer;
-
- WRITE_BE_UINT32(output, countRooms); output += 4;
-
- const byte *src = data;
- if (info->platform == kPlatformAmiga) {
- for (int i = 0; i < countRooms; ++i) {
- *output++ = *src++; assert(*src == 0); ++src;
- memcpy(output, src, 8); output += 0x8;
- src += roomEntrySize - 0x2;
- }
- } else {
- for (int i = 0; i < countRooms; ++i) {
- *output++ = *src++;
- WRITE_BE_UINT16(output, READ_LE_UINT16(src)); output += 2; src += 2;
- WRITE_BE_UINT16(output, READ_LE_UINT16(src)); output += 2; src += 2;
- WRITE_BE_UINT16(output, READ_LE_UINT16(src)); output += 2; src += 2;
- WRITE_BE_UINT16(output, READ_LE_UINT16(src)); output += 2; src += 2;
- src += roomEntrySize - 0x9;
- }
- }
-
- return out.addFile(filename, buffer, countRooms * 9 + 4);
-}
-
-bool extractShapes(PAKFile &out, const ExtractInformation *info, const byte *data, const uint32 size, const char *filename, int id) {
- byte *buffer = new byte[size + 1 * 4];
- assert(buffer);
- byte *output = buffer;
-
- const int count = size / 0x07;
- WRITE_BE_UINT32(output, count); output += 4;
- memcpy(output, data, size);
-
- return out.addFile(filename, buffer, size + 1 * 4);
-}
-
-bool extractKyraForestSeqData(PAKFile &out, const ExtractInformation *info, const byte *data, const uint32 size, const char *filename, int id) {
- if (info->platform != kPlatformPC98)
- return extractRaw(out, info, data, size, filename, id);
-
- struct PatchEntry {
- uint16 pos;
- uint8 val;
- };
-
- // This data has been taken from the FM-Towns version
- static const PatchEntry patchData[] = {
- { 0x0019, 0x06 }, { 0x001A, 0x09 }, { 0x001B, 0x00 }, { 0x002E, 0x06 }, { 0x002F, 0x09 }, { 0x0030, 0x00 },
- { 0x003D, 0x06 }, { 0x003E, 0x09 }, { 0x003F, 0x00 }, { 0x004C, 0x06 }, { 0x004D, 0x09 }, { 0x004E, 0x00 },
- { 0x005B, 0x06 }, { 0x005C, 0x09 }, { 0x005D, 0x00 }, { 0x0064, 0x06 }, { 0x0065, 0x09 }, { 0x0066, 0x00 },
- { 0x0079, 0x06 }, { 0x007A, 0x09 }, { 0x007B, 0x00 }, { 0x0088, 0x06 }, { 0x0089, 0x09 }, { 0x008A, 0x00 },
- { 0x0097, 0x06 }, { 0x0098, 0x09 }, { 0x0099, 0x00 }, { 0x00A6, 0x06 }, { 0x00A7, 0x09 }, { 0x00A8, 0x00 },
- { 0x00AD, 0x06 }, { 0x00AE, 0x09 }, { 0x00AF, 0x00 }, { 0x00B4, 0x06 }, { 0x00B5, 0x09 }, { 0x00B6, 0x00 },
- { 0x00C3, 0x06 }, { 0x00C4, 0x09 }, { 0x00C5, 0x00 }, { 0x00CA, 0x06 }, { 0x00CB, 0x09 }, { 0x00CC, 0x00 },
- { 0x00D1, 0x06 }, { 0x00D2, 0x09 }, { 0x00D3, 0x00 }, { 0x00E0, 0x06 }, { 0x00E1, 0x09 }, { 0x00E2, 0x00 },
- { 0x00E7, 0x06 }, { 0x00E8, 0x09 }, { 0x00E9, 0x00 }, { 0x00EE, 0x06 }, { 0x00EF, 0x09 }, { 0x00F0, 0x00 },
- { 0x00FD, 0x06 }, { 0x00FE, 0x09 }, { 0x00FF, 0x00 }, { 0x010A, 0x06 }, { 0x010B, 0x09 }, { 0x010C, 0x00 },
- { 0x011D, 0x06 }, { 0x011E, 0x09 }, { 0x011F, 0x00 }, { 0x012C, 0x06 }, { 0x012D, 0x09 }, { 0x012E, 0x00 },
- { 0x013D, 0x06 }, { 0x013E, 0x09 }, { 0x013F, 0x00 }, { 0x0148, 0x06 }, { 0x0149, 0x09 }, { 0x014A, 0x00 },
- { 0x0153, 0x06 }, { 0x0154, 0x09 }, { 0x0155, 0x00 }, { 0x015E, 0x06 }, { 0x015F, 0x09 }, { 0x0160, 0x00 },
- { 0x0169, 0x06 }, { 0x016A, 0x09 }, { 0x016B, 0x00 }, { 0x016C, 0x06 }, { 0x016D, 0x12 }, { 0x016E, 0x00 },
- { 0x017B, 0x06 }, { 0x017C, 0x09 }, { 0x017D, 0x00 }, { 0x0188, 0x06 }, { 0x0189, 0x09 }, { 0x018A, 0x00 },
- { 0x0190, 0x13 }, { 0x0000, 0x00 }
- };
-
- uint32 outsize = size + (ARRAYSIZE(patchData) - 1);
- uint8 *buffer = new uint8[outsize];
- assert(buffer);
-
- const uint8 *src = data;
- uint8 *dst = buffer;
- const PatchEntry *patchPos = patchData;
-
- while (dst < (buffer + outsize)) {
- if ((dst - buffer) == patchPos->pos) {
- *dst++ = patchPos->val;
- patchPos++;
- } else {
- *dst++ = *src++;
- }
- }
-
- return out.addFile(filename, buffer, outsize);
-}
-
-bool extractAmigaSfx(PAKFile &out, const ExtractInformation *info, const byte *data, const uint32 size, const char *filename, int id) {
- const uint32 entries = size / 8;
- byte *buffer = new byte[entries * 6 + 1 * 4];
-
- byte *output = buffer;
- WRITE_BE_UINT32(output, entries); output += 4;
-
- for (uint32 i = 0; i < entries; ++i) {
- *output++ = *data++; // Note
- *output++ = *data++; // Patch
- data += 2; // Unused
- WRITE_BE_UINT16(output, READ_BE_UINT16(data)); output += 2; data += 2; // Duration
- *output++ = *data++; // Volume
- *output++ = *data++; // Pan
- }
-
- return out.addFile(filename, buffer, entries * 6 + 1 * 4);
-}
-
-bool extractWdSfx(PAKFile &out, const ExtractInformation *info, const byte *data, const uint32 size, const char *filename, int id) {
- const int bufferSize = 0x12602;
-
- uint8 *buffer = new uint8[0x12602];
- assert(buffer);
- memcpy(buffer, data, 0x7EE5);
- memcpy(buffer + 0x7EE5, data + 0x7EE7, 0x7FFF);
- memcpy(buffer + 0xFEE4, data + 0xFEE8, 0x271E);
-
- return out.addFile(filename, buffer, bufferSize);
-}
-
-int extractHofSeqData_checkString(const void *ptr, uint8 checkSize);
-int extractHofSeqData_isSequence(const void *ptr, const ExtractInformation *info, uint32 maxCheckSize);
-int extractHofSeqData_isControl(const void *ptr, uint32 size);
-
-bool extractHofSeqData(PAKFile &out, const ExtractInformation *info, const byte *data, const uint32 size, const char *filename, int id) {
- int numSequences = 0;
- int numNestedSequences = 0;
-
- uint16 headerSize = 50 * sizeof(uint16);
- uint16 bufferSize = size + headerSize;
- byte *buffer = new byte[bufferSize];
- assert(buffer);
- memset(buffer, 0, bufferSize );
- uint16 *header = (uint16 *) buffer;
- byte *output = buffer + headerSize;
- uint16 *hdout = header;
-
- //debug(1, "\nProcessing Hand of Fate sequence data:\n--------------------------------------\n");
- for (int cycle = 0; cycle < 2; cycle++) {
- const byte *ptr = data;
- hdout++;
-
- const byte *endOffs = (const byte *)(data + size);
-
- // detect sequence structs
- while (ptr < endOffs) {
- if (ptr[1]) {
- error("invalid sequence data encountered");
- delete[] buffer;
- return false;
- }
-
- int v = extractHofSeqData_isSequence(ptr, info, endOffs - ptr);
-
- if (cycle == 0 && v == 1) {
- if ((info->platform == kPlatformDOS && info->special == kNoSpecial && *ptr == 5) || (info->special == kDemoVersion && (ptr - data == 312))) {
- // patch for floppy version: skips invalid ferb sequence
- // patch for demo: skips invalid title sequence
- ptr += 54;
- continue;
- }
-
- numSequences++;
- uint16 relOffs = (uint16) (output - buffer);
- WRITE_BE_UINT16(hdout, relOffs);
- hdout++;
-
- WRITE_BE_UINT16(output, READ_LE_UINT16(ptr)); // flags
- ptr += 2;
- output += 2;
-
- memcpy(output, ptr, 28); // wsa and cps file names
- ptr += 28;
- output += 28;
-
- if (info->platform == kPlatformFMTowns) { // startupCommand + finalCommand
- memcpy(output, ptr, 2);
- ptr += 2;
- output += 2;
- } else {
- *output++ = READ_LE_UINT16(ptr) & 0xff;
- ptr += 2;
- *output++ = READ_LE_UINT16(ptr) & 0xff;
- ptr += 2;
- }
-
- for (int w = 0; w < 7; w++) { //stringIndex1 to yPos
- WRITE_BE_UINT16(output, READ_LE_UINT16(ptr));
- ptr += 2;
- output += 2;
- }
-
- ptr += 4;
- WRITE_BE_UINT16(output, READ_LE_UINT16(ptr)); // duration
- ptr += 2;
- output+= 2;
-
- } else if (cycle == 1 && v != 1 && v != -2) {
- uint16 controlOffs = 0;
- uint16 ctrSize = 0;
- if (v) {
- const byte *ctrStart = ptr;
- while (v && v != -2) {
- ptr++;
- v = extractHofSeqData_isSequence(ptr, info, endOffs - ptr);
- }
-
- if (v == -2)
- break;
-
- ctrSize = (uint16)(ptr - ctrStart);
-
- if (info->special != kDemoVersion &&
- extractHofSeqData_isControl(ctrStart, ctrSize)) {
- controlOffs = (uint16) (output - buffer);
- *output++ = ctrSize >> 2;
-
- for (int cc = 0; cc < ctrSize; cc += 2)
- WRITE_BE_UINT16(output + cc, READ_LE_UINT16(ctrStart + cc)); // frame control
- output += ctrSize;
- }
- }
-
- numNestedSequences++;
- uint16 relOffs = (uint16) (output - buffer);
- WRITE_BE_UINT16(hdout, relOffs);
- hdout++;
-
- WRITE_BE_UINT16(output, READ_LE_UINT16(ptr)); // flags
- ptr += 2;
- output += 2;
-
- memcpy(output, ptr, 14); // wsa file name
- ptr += 14;
- output += 14;
-
- // startframe
- WRITE_BE_UINT16(output, READ_LE_UINT16(ptr));
- ptr += 2;
- output += 2;
-
- // endFrame
- WRITE_BE_UINT16(output, (ctrSize && ((ctrSize >> 2) < READ_LE_UINT16(ptr))) ? (ctrSize >> 2) : READ_LE_UINT16(ptr));
- ptr += 2;
- output += 2;
-
- // frameDelay
- WRITE_BE_UINT16(output, READ_LE_UINT16(ptr));
- ptr += 2;
- output += 2;
-
- ptr += 4;
-
- for (int w = 0; w < 2; w++) { //x, y
- WRITE_BE_UINT16(output, READ_LE_UINT16(ptr));
- ptr += 2;
- output += 2;
- }
-
- if (!READ_LE_UINT32(ptr))
- controlOffs = 0;
-
- WRITE_BE_UINT16(output, controlOffs);
- if (info->special != kDemoVersion)
- ptr += 4;
- output += 2;
-
- if (info->special != kDemoVersion) {
- for (int w = 0; w < 2; w++) { //startupCommand, finalCommand
- WRITE_BE_UINT16(output, READ_LE_UINT16(ptr));
- ptr += 2;
- output += 2;
- }
- } else {
- memset(output, 0, 4);
- output += 4;
- }
-
- if (info->platform == kPlatformFMTowns)
- ptr += 2;
-
- } else if (cycle == 0) {
- while (v != 1 && v != -2) {
- ptr++;
- v = extractHofSeqData_isSequence(ptr, info, endOffs - ptr);
- }
-
- if (v == -2)
- break;
-
-
- } else if (cycle == 1) {
- while (v == 1 && v != -2) {
- ptr++;
- v = extractHofSeqData_isSequence(ptr, info, endOffs - ptr);
- }
-
- if (v == -2)
- break;
- }
- }
- }
-
- uint16 finHeaderSize = (2 + numSequences + numNestedSequences) * sizeof(uint16);
- uint16 finBufferSize = ((output - buffer) - headerSize) + finHeaderSize;
- byte *finBuffer = new byte[finBufferSize];
- assert(finBuffer);
- uint16 diff = headerSize - finHeaderSize;
- uint16 *finHeader = (uint16 *) finBuffer;
-
- for (int i = 1; i < finHeaderSize; i++)
- WRITE_BE_UINT16(&finHeader[i], (READ_BE_UINT16(&header[i]) - diff));
- WRITE_BE_UINT16(finHeader, numSequences);
- WRITE_BE_UINT16(&finHeader[numSequences + 1], numNestedSequences);
- memcpy (finBuffer + finHeaderSize, buffer + headerSize, finBufferSize - finHeaderSize);
- delete[] buffer;
-
- finHeader = (uint16 *) (finBuffer + ((numSequences + 2) * sizeof(uint16)));
- for (int i = 0; i < numNestedSequences; i++) {
- uint8 * offs = finBuffer + READ_BE_UINT16(finHeader++) + 26;
- uint16 ctrl = READ_BE_UINT16(offs);
- if (ctrl)
- ctrl -= diff;
- WRITE_BE_UINT16(offs, ctrl);
- }
-
- return out.addFile(filename, finBuffer, finBufferSize);
-}
-
-int extractHofSeqData_checkString(const void *ptr, uint8 checkSize) {
- // return values: 1 = text; 0 = zero string; -1 = other
-
- int t = 0;
- int c = checkSize;
- const uint8 *s = (const uint8*)ptr;
-
- // check for character string
- while (c--) {
- if (*s > 31 && *s < 123)
- t++;
- s++;
- }
-
- if (t == checkSize)
- return 1;
-
- // check for zero string
- c = checkSize;
- uint32 sum = 0;
- s = (const uint8*)ptr;
- while (c--)
- sum += *s++;
-
- return (sum) ? -1 : 0;
-}
-
-int extractHofSeqData_isSequence(const void *ptr, const ExtractInformation *info, uint32 maxCheckSize) {
- // return values: 1 = Sequence; 0 = Nested Sequence; -1 = other; -2 = overflow
-
- if (maxCheckSize < 30)
- return -2;
-
- const uint8 * s = (const uint8*)ptr;
- int c1 = extractHofSeqData_checkString(s + 2, 6);
- int c2 = extractHofSeqData_checkString(s + 16, 6);
- int c3 = extractHofSeqData_checkString(s + 2, 14);
- int c4 = extractHofSeqData_checkString(s + 16, 14);
- int c0 = s[1];
- int c5 = s[0];
-
- if (c0 == 0 && c5 && ((c1 + c2) >= 1) && (!(c3 == 0 && c2 != 1)) && (!(c4 == 0 && c1 != 1))) {
- if (maxCheckSize < 41)
- return -2;
-
- if (info->platform == kPlatformFMTowns) {
- if (!(s[37] | s[39]) && s[38] > s[36])
- return 1;
- } else {
- if (!(s[39] | s[41]) && s[40] > s[38])
- return 1;
- }
- }
-
- if (c0 == 0 && c5 == 4 && c3 == 0 && c4 == 0) {
- if (maxCheckSize >= 41 && READ_LE_UINT32(s + 34) && !(s[39] | s[41]) && s[40] > s[38])
- return 1;
- }
-
- if (c0 == 0 && c5 && c1 == 1 && c4 == -1 && s[20])
- return 0;
-
- return -1;
-}
-
-int extractHofSeqData_isControl(const void *ptr, uint32 size) {
- // return values: 1 = possible frame control data; 0 = definitely not frame control data
-
- const uint8 *s = (const uint8*)ptr;
- for (uint32 i = 2; i < size; i += 4) {
- if (!s[i])
- return 0;
- }
-
- for (uint32 i = 1; i < size; i += 2) {
- if (s[i])
- return 0;
- }
- return 1;
-}
-
-bool extractHofShapeAnimDataV1(PAKFile &out, const ExtractInformation *info, const byte *data, const uint32 size, const char *filename, int id) {
- int outsize = 1;
- uint8 *buffer = new uint8[size + 1];
- const uint8 *src = data;
- uint8 *dst = buffer + 1;
-
- for (int i = 0; i < 4; i++) {
- WRITE_BE_UINT16(dst, READ_LE_UINT16(src));
- src += 2;
- dst += 2;
- WRITE_BE_UINT16(dst, READ_LE_UINT16(src));
- src += 4;
- dst += 2;
- outsize += 4;
-
- for (int j = 0; j < 20; j++) {
- WRITE_BE_UINT16(dst, READ_LE_UINT16(src));
- src += 2;
- dst += 2;
- outsize += 2;
- }
-
- };
-
- *buffer = 4; // number of items
-
- return out.addFile(filename, buffer, outsize);
-}
-
-bool extractHofShapeAnimDataV2(PAKFile &out, const ExtractInformation *info, const byte *data, const uint32 size, const char *filename, int id) {
- int outsize = 1;
- uint8 *buffer = new uint8[size + 1];
- const uint8 *src = data;
- uint8 *dst = buffer + 1;
- const uint8 *fin = data + size;
- int count = 0;
-
- do {
- if (READ_LE_UINT16(src) == 0xffff)
- break;
-
- count++;
-
- WRITE_BE_UINT16(dst, READ_LE_UINT16(src));
- src += 2;
- dst += 2;
-
- uint8 numFrames = *src;
- *dst++ = numFrames;
- src += 6;
- outsize += 3;
-
- for (int i = 0; i < (numFrames << 1); i++) {
- WRITE_BE_UINT16(dst, READ_LE_UINT16(src));
- src += 2;
- dst += 2;
- outsize += 2;
- }
-
- src += (48 - (numFrames << 2));
-
- } while (src < fin);
-
- *buffer = count; // number of items
-
- return out.addFile(filename, buffer, outsize);
-}
-
-bool extractStringsWoSuffix(PAKFile &out, const ExtractInformation *info, const byte *data, const uint32 size, const char *filename, int id) {
- int outsize = size + 4;
- uint8 *buffer = new uint8[outsize];
- const uint8 *src = data;
- uint8 *dst = buffer + 4;
- const uint8 *fin = src + size;
- int entries = 0;
-
- while (src < fin) {
- while (!*src && src < fin)
- src++;
- while (*src && *src != '.' && src < fin)
- *dst++ = *src++;
-
- *dst++ = '\0';
- entries++;
-
- if (*src == '.') {
- while (*src && src < fin)
- src++;
- }
- }
-
- WRITE_BE_UINT32(buffer, entries);
- outsize = dst - buffer;
-
- return out.addFile(filename, buffer, outsize);
-}
-
-bool extractPaddedStrings(PAKFile &out, const ExtractInformation *info, const byte *data, const uint32 size, const char *filename, int id) {
- int outsize = size + 4;
- uint8 *buffer = new uint8[outsize];
- const uint8 *src = data;
- uint8 *dst = buffer + 4;
- const uint8 *fin = src + size;
- int entries = 0;
-
- while (src < fin) {
- while (!*src && src < fin)
- src++;
- while (*src && src < fin)
- *dst++ = *src++;
- if (src < fin)
- *dst++ = *src++;
- entries++;
- }
-
- WRITE_BE_UINT32(buffer, entries);
-
- outsize = dst - buffer;
-
- return out.addFile(filename, buffer, outsize);
-}
-
-bool extractRaw16to8(PAKFile &out, const ExtractInformation *info, const byte *data, const uint32 size, const char *filename, int id) {
- // Hack for some LOL FM-Towns entries
- if (info->platform == Common::kPlatformFMTowns && ((id >= kLoLButtonList1 && id <= kLoLButtonList8) || id == kLoLCharInvIndex))
- return extractRaw(out, info, data, size, filename, id);
-
- int outsize = size >> 1;
- uint8 *buffer = new uint8[outsize];
- const uint8 *src = data;
- uint8 *dst = buffer;
-
- for (int i = 0; i < outsize; i++) {
- *dst++ = *src++;
- src++;
- }
-
- return out.addFile(filename, buffer, outsize);
-}
-
-bool extractRaw16(PAKFile &out, const ExtractInformation *info, const byte *data, const uint32 size, const char *filename, int id) {
- uint8 *buffer = new uint8[size];
- const uint8 *src = data;
- uint8 *dst = buffer;
-
- for (uint32 i = 0; i < (size >> 1); i++) {
- WRITE_BE_UINT16(dst, READ_LE_UINT16(src));
- src += 2;
- dst += 2;
- }
-
- return out.addFile(filename, buffer, size);
-}
-
-bool extractRaw32(PAKFile &out, const ExtractInformation *info, const byte *data, const uint32 size, const char *filename, int id) {
- uint8 *buffer = new uint8[size];
- const uint8 *src = data;
- uint8 *dst = buffer;
-
- for (uint32 i = 0; i < (size >> 2); i++) {
- WRITE_BE_UINT32(dst, READ_LE_UINT32(src));
- src += 4;
- dst += 4;
- }
-
- return out.addFile(filename, buffer, size);
-}
-
-bool extractLoLButtonDefs(PAKFile &out, const ExtractInformation *info, const byte *data, const uint32 size, const char *filename, int id) {
- int num = size / 22;
- uint8 *buffer = new uint8[size];
- uint32 outsize = num * 18;
- const uint8 *src = data;
- uint8 *dst = buffer;
-
- for (int i = 0; i < num; i++) {
- WRITE_BE_UINT16(dst, READ_LE_UINT16(src));
- src += 2; dst += 2;
- WRITE_BE_UINT16(dst, READ_LE_UINT16(src));
- src += 2; dst += 2;
- WRITE_BE_UINT16(dst, READ_LE_UINT16(src));
- src += 6; dst += 2;
- WRITE_BE_UINT16(dst, READ_LE_UINT16(src));
- src += 2; dst += 2;
- WRITE_BE_UINT16(dst, READ_LE_UINT16(src));
- src += 2; dst += 2;
- WRITE_BE_UINT16(dst, READ_LE_UINT16(src));
- src += 2; dst += 2;
- WRITE_BE_UINT16(dst, READ_LE_UINT16(src));
- src += 2; dst += 2;
- WRITE_BE_UINT16(dst, READ_LE_UINT16(src));
- src += 2; dst += 2;
- WRITE_BE_UINT16(dst, READ_LE_UINT16(src));
- src += 2; dst += 2;
- }
-
- return out.addFile(filename, buffer, outsize);
-}
-
-bool extractLoLFlyingShpDefs(PAKFile &out, const ExtractInformation *info, const byte *data, const uint32 size, const char *filename, int id) {
- if (info->platform != Common::kPlatformFMTowns)
- return extractRaw16to8(out, info, data, size, filename, id);
-
- int outsize = size / 9 * 5;
- uint8 *buffer = new uint8[outsize];
- const uint8 *src = data;
- uint8 *dst = buffer;
-
- for (int i = outsize / 5; i; --i) {
- *dst++ = *src++;
- src++;
- *dst++ = *src++;
- src++;
- *dst++ = *src++;
- src++;
- *dst++ = *src++;
- *dst++ = *src++;
- src++;
- }
-
- return out.addFile(filename, buffer, outsize);
-}
-
-bool extractEoB2SeqData(PAKFile &out, const ExtractInformation *info, const byte *data, const uint32 size, const char *filename, int id) {
- int num = size / 11;
- uint8 *buffer = new uint8[size];
- const uint8 *src = data;
- uint8 *dst = buffer;
-
- for (int i = 0; i < num; i++) {
- memcpy(dst, src, 2);
- src += 2; dst += 2;
- WRITE_BE_UINT16(dst, READ_LE_UINT16(src));
- src += 2; dst += 2;
- memcpy(dst, src, 7);
- src += 7; dst += 7;
- }
-
- return out.addFile(filename, buffer, size);
-}
-
-bool extractEoB2ShapeData(PAKFile &out, const ExtractInformation *info, const byte *data, const uint32 size, const char *filename, int id) {
- int num = size / 6;
- uint8 *buffer = new uint8[size];
- const uint8 *src = data;
- uint8 *dst = buffer;
-
- for (int i = 0; i < num; i++) {
- WRITE_BE_UINT16(dst, READ_LE_UINT16(src));
- src += 2; dst += 2;
- memcpy(dst, src, 4);
- src += 4; dst += 4;
- }
-
- return out.addFile(filename, buffer, size);
-}
-
-bool extractEoBNpcData(PAKFile &out, const ExtractInformation *info, const byte *data, const uint32 size, const char *filename, int id) {
- // We use one extraction routine for both EOB 1 and EOB 2 (in spite of the data format differences)
- // since it is easy enough to generate a common output usable by both engines
-
- uint8 *buffer = 0;
- uint32 outsize = 0;
-
- if (info->game == kEoB1) {
- uint16 num = size / 243;
- outsize = num * 111 + 2;
- buffer = new uint8[outsize];
- const uint8 *src = data;
- uint8 *dst = buffer;
-
- WRITE_BE_UINT16(dst, num);
- dst += 2;
-
- for (int i = 0; i < num; i++) {
- memcpy(dst, src, 27);
- src += 27; dst += 27;
- WRITE_BE_UINT16(dst, *src++);
- dst += 2;
- WRITE_BE_UINT16(dst, *src++);
- dst += 2;
- memcpy(dst, src, 10);
- src += 10; dst += 10;
- WRITE_BE_UINT32(dst, READ_LE_UINT32(src));
- src += 4; dst += 4;
- WRITE_BE_UINT32(dst, READ_LE_UINT32(src));
- src += 4; dst += 4;
- WRITE_BE_UINT32(dst, READ_LE_UINT32(src));
- src += 4; dst += 4;
- // skipping lots of zero space
- src += 64;
- WRITE_BE_UINT32(dst, READ_LE_UINT32(src));
- src += 4; dst += 4;
- for (int ii = 0; ii < 27; ii++) {
- WRITE_BE_UINT16(dst, READ_LE_UINT16(src));
- src += 2; dst += 2;
- }
- // skipping more zero space
- src += 70;
- }
- } else {
- uint16 num = size / 345;
- outsize = num * 111 + 2;
- buffer = new uint8[outsize];
- const uint8 *src = data;
- uint8 *dst = buffer;
-
- WRITE_BE_UINT16(dst, num);
- dst += 2;
-
- for (int i = 0; i < num; i++) {
- memcpy(dst, src, 27);
- src += 27; dst += 27;
- WRITE_BE_UINT16(dst, READ_LE_UINT16(src));
- src += 2; dst += 2;
- WRITE_BE_UINT16(dst, READ_LE_UINT16(src));
- src += 2; dst += 2;
- memcpy(dst, src, 10);
- src += 10; dst += 10;
- WRITE_BE_UINT32(dst, READ_LE_UINT32(src));
- src += 4; dst += 4;
- WRITE_BE_UINT32(dst, READ_LE_UINT32(src));
- src += 4; dst += 4;
- WRITE_BE_UINT32(dst, READ_LE_UINT32(src));
- src += 4; dst += 4;
- // skipping lots of zero space
- src += 164;
- WRITE_BE_UINT32(dst, READ_LE_UINT32(src));
- src += 4; dst += 4;
- for (int ii = 0; ii < 27; ii++) {
- WRITE_BE_UINT16(dst, READ_LE_UINT16(src));
- src += 2; dst += 2;
- }
- // skipping more zero space
- src += 70;
- }
- }
-
- return out.addFile(filename, buffer, outsize);
-}
-
-bool extractMrShapeAnimData(PAKFile &out, const ExtractInformation *info, const byte *data, const uint32 size, const char *filename, int id) {
- int outsize = 1;
- uint8 *buffer = new uint8[size + 1];
- const uint8 *src2 = data;
- const uint8 *src1 = data + 324;
- uint8 *dst = buffer + 1;
- const uint8 *fin = data + size;
- int count = 0;
-
- do {
- if (READ_LE_UINT16(src1) == 0xffff)
- break;
-
- count++;
-
- WRITE_BE_UINT16(dst, READ_LE_UINT16(src1));
- src1 += 2;
- dst += 2;
-
- uint8 numFrames = *src1;
- *dst++ = numFrames;
- src1 += 10;
- outsize += 3;
-
- for (int i = 0; i < (numFrames << 1); i++) {
- WRITE_BE_UINT16(dst, READ_LE_UINT16(src2));
- src2 += 2;
- dst += 2;
- outsize += 2;
- }
- } while (src1 < fin);
-
- *buffer = count; // number of items
-
- return out.addFile(filename, buffer, outsize);
-}
-
-} // end of anonymous namespace
diff --git a/devtools/create_kyradat/extract.h b/devtools/create_kyradat/extract.h
deleted file mode 100644
index 4af9a146f4..0000000000
--- a/devtools/create_kyradat/extract.h
+++ /dev/null
@@ -1,78 +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 CREATE_KYRADAT_EXTRACT_H
-#define CREATE_KYRADAT_EXTRACT_H
-
-#include "create_kyradat.h"
-#include "pak.h"
-#include "util.h"
-
-enum kExtractType {
- kTypeStringList = 0,
- kTypeRoomList,
- kTypeShapeList,
- kTypeRawData,
- kTypeForestSeqData,
- kTypeAmigaSfxTable,
- kTypeTownsWDSfxTable,
-
- k2TypeSeqData,
- k2TypeShpDataV1,
- k2TypeShpDataV2,
- k2TypeSoundList,
- k2TypeLangSoundList,
- k2TypeSize10StringList,
- k2TypeSfxList,
-
- k3TypeRaw16to8,
- k3TypeShpData,
-
- kLoLTypeRaw16,
- kLoLTypeRaw32,
- kLoLTypeButtonDef,
- kLoLTypeCharData,
- kLoLTypeSpellData,
- kLoLTypeCompassData,
- kLoLTypeFlightShpData,
-
- kEoB2TypeSeqData,
- kEoB2TypeShapeData,
- kEoBTypeNpcData
-};
-
-struct ExtractInformation {
- int game;
- int platform;
- int lang;
- int special;
-};
-
-struct ExtractType {
- int type;
- bool (*extract)(PAKFile &out, const ExtractInformation *info, const byte *data, const uint32 size, const char *filename, int id);
-};
-
-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 e2ad4f7263..0162bda8ad 100644
--- a/devtools/create_kyradat/games.cpp
+++ b/devtools/create_kyradat/games.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -24,113 +24,110 @@
#define FORBIDDEN_SYMBOL_ALLOW_ALL
#include "create_kyradat.h"
-#include "common/language.h"
-#include "common/platform.h"
+#include "resources.h"
// Game tables
namespace {
const Game kyra1Games[] = {
- // Demos
- { kKyra1, { EN_ANY, -1, -1 }, kPlatformDOS, kDemoVersion, { "7b7504c8560ffc914d34c44c71b3094c", 0 } },
- { kKyra1, { EN_ANY, -1, -1 }, kPlatformDOS, kTalkieDemoVersion, { "226fdba99cb11ef1047131d9a50e6292", 0 } },
-
- // Amiga
- { kKyra1, { EN_ANY, -1, -1 }, kPlatformAmiga, kNoSpecial, { "b620564b6b7e0787b053ca9e35bd9f52", 0 } },
- { kKyra1, { DE_DEU, -1, -1 }, kPlatformAmiga, kNoSpecial, { "ceddb4bd4df51698e3851e75106d117a", 0 } },
-
- // Floppy
- { kKyra1, { EN_ANY, -1, -1 }, kPlatformDOS, kNoSpecial, { "76a4fc84e173cadb6369785787e1546e", 0 } },
- { kKyra1, { DE_DEU, -1, -1 }, kPlatformDOS, kNoSpecial, { "9442d6f7db6a41f3dd4aa4de5d36e107", 0 } },
- { kKyra1, { FR_FRA, -1, -1 }, kPlatformDOS, kNoSpecial, { "aa9d6d78d8b199deaf48efeca6d19af2", 0 } },
- { kKyra1, { IT_ITA, -1, -1 }, kPlatformDOS, kNoSpecial, { "5d7550306b369a3492f9f3402702477c", 0 } },
- { kKyra1, { ES_ESP, -1, -1 }, kPlatformDOS, kNoSpecial, { "9ff130d2558bcd674d4074849d93c362", 0 } },
- { kKyra1, { RU_RUS, -1, -1 }, kPlatformDOS, kOldFloppy, { "3b4719e1f8a4d67813b7ada29774aead", 0 } },
-
- // Talkie
- { kKyra1, { EN_ANY, -1, -1 }, kPlatformDOS, kTalkieVersion, { "1ebc18f3e7fbb72474a55cb0fa089ed4", 0 } },
- { kKyra1, { DE_DEU, -1, -1 }, kPlatformDOS, kTalkieVersion, { "c65d381184f98ac26d9efd2d45baef51", 0 } },
- { kKyra1, { FR_FRA, -1, -1 }, kPlatformDOS, kTalkieVersion, { "307c5d4a554d9068ac3d326e350ae4a6", 0 } },
- { kKyra1, { IT_ITA, -1, -1 }, kPlatformDOS, kTalkieVersion, { "d0f1752098236083d81b9497bd2b6989", 0 } }, // Italian fan translation
-
- // FM-TOWNS
- { kKyra1, { EN_ANY, JA_JPN, -1 }, kPlatformFMTowns, kNoSpecial, { "5a3ad60ccd0f2e29463e0368cd14a60d", 0 } },
-
- // PC-98
- { kKyra1, { JA_JPN, -1, -1 }, kPlatformPC98, kNoSpecial, { "b9c06ac5177f5bf1f1acc0eea3937f6d", 0 } },
+ { kKyra1, kPlatformDOS, kDemoVersion, EN_ANY },
+
+ { kKyra1, kPlatformDOS, kTalkieDemoVersion, EN_ANY },
+
+ { kKyra1, kPlatformAmiga, kNoSpecial, EN_ANY },
+ { kKyra1, kPlatformAmiga, kNoSpecial, DE_DEU },
+
+ { kKyra1, kPlatformDOS, kNoSpecial, EN_ANY },
+ { kKyra1, kPlatformDOS, kNoSpecial, DE_DEU },
+ { kKyra1, kPlatformDOS, kNoSpecial, FR_FRA },
+ { kKyra1, kPlatformDOS, kNoSpecial, IT_ITA },
+ { kKyra1, kPlatformDOS, kNoSpecial, ES_ESP },
+ { kKyra1, kPlatformDOS, kOldFloppy, RU_RUS },
+
+ { kKyra1, kPlatformDOS, kTalkieVersion, EN_ANY },
+ { kKyra1, kPlatformDOS, kTalkieVersion, DE_DEU },
+ { kKyra1, kPlatformDOS, kTalkieVersion, FR_FRA },
+ { kKyra1, kPlatformDOS, kTalkieVersion, IT_ITA },
+
+ { kKyra1, kPlatformFMTowns, kNoSpecial, EN_ANY },
+ { kKyra1, kPlatformFMTowns, kNoSpecial, JA_JPN },
+
+ { kKyra1, kPlatformPC98, kNoSpecial, JA_JPN },
GAME_DUMMY_ENTRY
};
const Game kyra2Games[] = {
- // demos
- { kKyra2, { EN_ANY, -1, -1 }, kPlatformDOS, kDemoVersion, { "a620a37579dd44ab0403482285e3897f", 0 } },
+ { kKyra2, kPlatformDOS, kDemoVersion, EN_ANY },
- { kKyra2, { EN_ANY, FR_FRA, DE_DEU }, kPlatformDOS, kTalkieDemoVersion, { "85bbc1cc6c4cef6ad31fc6ee79518efb", "fa54d8abfe05f9186c05f7de7eaf1480" } },
+ { kKyra2, kPlatformDOS, kTalkieDemoVersion, EN_ANY },
+ { kKyra2, kPlatformDOS, kTalkieDemoVersion, FR_FRA },
+ { kKyra2, kPlatformDOS, kTalkieDemoVersion, DE_DEU },
- // floppy games
- { kKyra2, { EN_ANY, -1, -1 }, kPlatformDOS, kNoSpecial, { "9b0f5e57b5a2ed88b5b989cbb402b6c7", "7c3eadbe5122722cf2e5e1611e19dfb9" } },
- { kKyra2, { FR_FRA, -1, -1 }, kPlatformDOS, kNoSpecial, { "df31cc9e37e1cf68df2fdc75ddf2d87b", "fc2c6782778e6c6d5a553d1cb73c98ad" } },
- { kKyra2, { DE_DEU, -1, -1 }, kPlatformDOS, kNoSpecial, { "0ca4f9a1438264a4c63c3218e064ed3b", "0d9b0eb7b0ad889ec942d74d80dde1bf" } },
- { kKyra2, { IT_ITA, -1, -1 }, kPlatformDOS, kNoSpecial, { "178d3ab913f61bfba21d2fb196405e8c", "3a61ed6b7c00ddae383a0361799e2ba6" } },
- { kKyra2, { RU_RUS, -1, -1 }, kPlatformDOS, kNoSpecial, { "fd6a388c01de9a578e24e3bbeacd8012", "3a61ed6b7c00ddae383a0361799e2ba6" } },
+ { kKyra2, kPlatformDOS, kNoSpecial, EN_ANY },
+ { kKyra2, kPlatformDOS, kNoSpecial, FR_FRA },
+ { kKyra2, kPlatformDOS, kNoSpecial, DE_DEU },
+ { kKyra2, kPlatformDOS, kNoSpecial, IT_ITA },
+ { kKyra2, kPlatformDOS, kNoSpecial, RU_RUS },
- // talkie games
- { kKyra2, { EN_ANY, FR_FRA, DE_DEU }, kPlatformDOS, kTalkieVersion, { "85bbc1cc6c4cef6ad31fc6ee79518efb", "e20d0d2e500f01e399ec588247a7e213" } },
- { kKyra2, { IT_ITA, FR_FRA, DE_DEU }, kPlatformDOS, kTalkieVersion, { "130795aa8f2333250c895dae9028b9bb", "e20d0d2e500f01e399ec588247a7e213" } }, // Italian Fan Translation
- { kKyra2, { RU_RUS, FR_FRA, DE_DEU }, kPlatformDOS, kTalkieVersion, { "c3afd22959f515355b2a33cde950f418", "e20d0d2e500f01e399ec588247a7e213" } }, // Russian Fan Translation
+ { kKyra2, kPlatformDOS, kTalkieVersion, EN_ANY },
+ { kKyra2, kPlatformDOS, kTalkieVersion, FR_FRA },
+ { kKyra2, kPlatformDOS, kTalkieVersion, DE_DEU },
+ { kKyra2, kPlatformDOS, kTalkieVersion, IT_ITA },
+ { kKyra2, kPlatformDOS, kTalkieVersion, RU_RUS },
- // FM-TOWNS games
- { kKyra2, { EN_ANY, JA_JPN, -1 }, kPlatformFMTowns, kNoSpecial, { "74f50d79c919cc8e7196c24942ce43d7", "a9a7fd4f05d00090e9e8bda073e6d431" } },
+ { kKyra2, kPlatformFMTowns, kNoSpecial, EN_ANY },
+ { kKyra2, kPlatformFMTowns, kNoSpecial, JA_JPN },
- // PC-98
- { kKyra2, { EN_ANY, JA_JPN, -1 }, kPlatformPC98, kNoSpecial, { "9bbf9a69be956db072b485929b416082", "f55fda3e60c4956ce6e72b24d2ae1a07" } },
+ { kKyra2, kPlatformPC98, kNoSpecial, EN_ANY },
+ { kKyra2, kPlatformPC98, kNoSpecial, JA_JPN },
GAME_DUMMY_ENTRY
};
const Game kyra3Games[] = {
- // DOS CD (multi language version, with no language specific strings)
- { kKyra3, { EN_ANY, FR_FRA, DE_DEU }, kPlatformDOS, kTalkieVersion, { "bf68701eb591d0b72219f314c0d32688", 0 } },
- { kKyra3, { EN_ANY, IT_ITA, DE_DEU }, kPlatformDOS, kTalkieVersion, { "bf68701eb591d0b72219f314c0d32688", 0 } }, // Fan translation // TODO: Verify md5sum
- { kKyra3, { ES_ESP, FR_FRA, DE_DEU }, kPlatformDOS, kTalkieVersion, { "bf68701eb591d0b72219f314c0d32688", 0 } }, // Fan translation // TODO: Verify md5sum
+ { kKyra3, kPlatformDOS, kTalkieVersion, EN_ANY },
+ { kKyra3, kPlatformDOS, kTalkieVersion, FR_FRA },
+ { kKyra3, kPlatformDOS, kTalkieVersion, DE_DEU },
+ { kKyra3, kPlatformDOS, kTalkieVersion, IT_ITA },
+ { kKyra3, kPlatformDOS, kTalkieVersion, ES_ESP },
GAME_DUMMY_ENTRY
};
const Game eob1Games[] = {
- { kEoB1, { EN_ANY, -1, -1 }, kPlatformDOS, kNoSpecial, { "1bde1dd37b40ab6de8ad11be33a44c5a", "d760a605d1a1302d06975a1f209fdd72" } },
- { kEoB1, { DE_DEU, -1, -1 }, kPlatformDOS, kNoSpecial, { "0fa3c6e00a81171b9f2adb3fdeb8eea3", "756f300c62aabf1dbd3c26b3b04f8c00" } },
+ { kEoB1, kPlatformDOS, kNoSpecial, EN_ANY },
+ { kEoB1, kPlatformDOS, kNoSpecial, DE_DEU },
+
GAME_DUMMY_ENTRY
};
const Game eob2Games[] = {
- { kEoB2, { EN_ANY, -1, -1 }, kPlatformDOS, kNoSpecial, { "e006d031c2d854f748947f777e0c59b0", 0 } },
- { kEoB2, { DE_DEU, -1, -1 }, kPlatformDOS, kNoSpecial, { "6c6c4168deb2a4cb3dee3f1be2d39746", 0 } },
+ { kEoB2, kPlatformDOS, kNoSpecial, EN_ANY },
+ { kEoB2, kPlatformDOS, kNoSpecial, DE_DEU },
+
GAME_DUMMY_ENTRY
};
const Game lolGames[] = {
- // DOS demo
- { kLoL, { EN_ANY, -1, -1 }, kPlatformDOS, kDemoVersion, { "30bb5af87d38adb47d3e6ce06b1cb042", 0 } },
+ { kLoL, kPlatformDOS, kDemoVersion, EN_ANY },
+
+ { kLoL, kPlatformDOS, kNoSpecial, EN_ANY },
+ { kLoL, kPlatformDOS, kNoSpecial, RU_RUS },
+ { kLoL, kPlatformDOS, kNoSpecial, DE_DEU },
+ { kLoL, kPlatformDOS, kNoSpecial, FR_FRA },
- // DOS floppy (no language specifc strings except character presets)
- { kLoL, { EN_ANY, -1, -1 }, kPlatformDOS, kNoSpecial, { "0cc764a204f7ba8cefe1a5f14c479619", 0 } },
- { kLoL, { RU_RUS, -1, -1 }, kPlatformDOS, kNoSpecial, { "80a9f9bf243bc6ed36d98584fc6988c4", 0 } },
- { kLoL, { DE_DEU, -1, -1 }, kPlatformDOS, kNoSpecial, { "6b843869772c1b779e1386be868c15dd", 0 } },
- { kLoL, { FR_FRA, -1, -1 }, kPlatformDOS, kNoSpecial, { "6b843869772c1b779e1386be868c15dd", 0 } },
+ { kLoL, kPlatformDOS, kTalkieVersion, EN_ANY },
+ { kLoL, kPlatformDOS, kTalkieVersion, FR_FRA },
+ { kLoL, kPlatformDOS, kTalkieVersion, DE_DEU },
+ { kLoL, kPlatformDOS, kTalkieVersion, IT_ITA },
+ { kLoL, kPlatformDOS, kTalkieVersion, RU_RUS },
- // PC98 (no language specifc strings)
- { kLoL, { JA_JPN, -1, -1 }, kPlatformPC98, kNoSpecial, { "6d5bd4a2f5ce433365734ca6b7a8d984", "1b0a457c48ae6908da301b656fe0aab4" } },
+ { kLoL, kPlatformPC98, kNoSpecial, JA_JPN },
- // FM-Towns (no language specifc strings)
- { kLoL, { JA_JPN, -1, -1 }, kPlatformFMTowns, kNoSpecial, { "a281c7143bf2b6c5d4daa107a4b0427e", "34b4cecce179990e3bcaaa2d31484a90"} },
+ { kLoL, kPlatformFMTowns, kNoSpecial, JA_JPN },
- // DOS CD (multi language version, with no language specific strings)
- { kLoL, { EN_ANY, FR_FRA, DE_DEU }, kPlatformDOS, kTalkieVersion, { "9d1778314de80598c0b0d032e2a1a1cf", "263998ec600afca1cc7b935c473df670" } },
- { kLoL, { IT_ITA, FR_FRA, DE_DEU }, kPlatformDOS, kTalkieVersion, { "9d1778314de80598c0b0d032e2a1a1cf", "f2af366e00f79dbf832fa19701d71ed9" } }, // Italian fan translation
- { kLoL, { EN_ANY, FR_FRA, RU_RUS }, kPlatformDOS, kTalkieVersion, { "9d1778314de80598c0b0d032e2a1a1cf", "5b33478718968676343803911dd5e3e4" } }, // Russian fan translation
GAME_DUMMY_ENTRY
};
@@ -824,7 +821,7 @@ const int lolFloppyNeed[] = {
kLoLDscScaleWidthData,
kLoLDscScaleHeightData,
kRpgCommonDscX,
- kLoLDscY,
+ kLoLBaseDscY,
kRpgCommonDscTileIndex,
kRpgCommonDscUnk2,
kRpgCommonDscDoorShapeIndex,
@@ -907,7 +904,7 @@ const int lolPC98Need[] = {
kLoLDscScaleWidthData,
kLoLDscScaleHeightData,
kRpgCommonDscX,
- kLoLDscY,
+ kLoLBaseDscY,
kRpgCommonDscTileIndex,
kRpgCommonDscUnk2,
kRpgCommonDscDoorShapeIndex,
@@ -991,7 +988,7 @@ const int lolFMTownsNeed[] = {
kLoLDscScaleWidthData,
kLoLDscScaleHeightData,
kRpgCommonDscX,
- kLoLDscY,
+ kLoLBaseDscY,
kRpgCommonDscTileIndex,
kRpgCommonDscUnk2,
kRpgCommonDscDoorShapeIndex,
@@ -1080,7 +1077,7 @@ const int lolCDNeed[] = {
kLoLDscScaleWidthData,
kLoLDscScaleHeightData,
kRpgCommonDscX,
- kLoLDscY,
+ kLoLBaseDscY,
kRpgCommonDscTileIndex,
kRpgCommonDscUnk2,
kRpgCommonDscDoorShapeIndex,
@@ -1231,14 +1228,14 @@ const int eob1FloppyNeed[] = {
kEoBBaseCursedString,
kEoBBaseEnchantedString,
kEoBBaseMagicObjectStrings,
- kEoBBaseMagicObject5String,
+ kEoBBaseMagicObjectString5,
kEoBBasePatternSuffix,
kEoBBasePatternGrFix1,
kEoBBasePatternGrFix2,
kEoBBaseValidateArmorString,
kEoBBaseValidateNoDropString,
kEoBBasePotionStrings,
- kEoBBaseWandString,
+ kEoBBaseWandStrings,
kEoBBaseItemMisuseStrings,
kEoBBaseTakenStrings,
@@ -1360,7 +1357,7 @@ const int eob1FloppyNeed[] = {
kEoBBaseDscItemPosIndex,
kEoBBaseDscItemShpX,
- kEoBBaseDscItemPosUnk,
+ kEoBBaseDscItemScaleIndex,
kEoBBaseDscItemTileIndex,
kEoBBaseDscItemShapeMap,
kEoBBaseDscTelptrShpCoords,
@@ -1452,7 +1449,7 @@ const int eob2FloppyNeed[] = {
kEoBBaseCursedString,
kEoBBaseEnchantedString,
kEoBBaseMagicObjectStrings,
- kEoBBaseMagicObject5String,
+ kEoBBaseMagicObjectString5,
kEoBBasePatternSuffix,
kEoBBasePatternGrFix1,
kEoBBasePatternGrFix2,
@@ -1460,7 +1457,7 @@ const int eob2FloppyNeed[] = {
kEoBBaseValidateCursedString,
kEoBBaseValidateNoDropString,
kEoBBasePotionStrings,
- kEoBBaseWandString,
+ kEoBBaseWandStrings,
kEoBBaseItemMisuseStrings,
kEoBBaseTakenStrings,
@@ -1581,7 +1578,7 @@ const int eob2FloppyNeed[] = {
kEoBBaseDscItemPosIndex,
kEoBBaseDscItemShpX,
- kEoBBaseDscItemPosUnk,
+ kEoBBaseDscItemScaleIndex,
kEoBBaseDscItemTileIndex,
kEoBBaseDscItemShapeMap,
kEoBBaseDscTelptrShpCoords,
@@ -1618,50 +1615,50 @@ const int eob2FloppyNeed[] = {
kEoB2IntroStrings,
kEoB2IntroCPSFiles,
- kEob2IntroAnimData00,
- kEob2IntroAnimData01,
- kEob2IntroAnimData02,
- kEob2IntroAnimData03,
- kEob2IntroAnimData04,
- kEob2IntroAnimData05,
- kEob2IntroAnimData06,
- kEob2IntroAnimData07,
- kEob2IntroAnimData08,
- kEob2IntroAnimData09,
- kEob2IntroAnimData10,
- kEob2IntroAnimData11,
- kEob2IntroAnimData12,
- kEob2IntroAnimData13,
- kEob2IntroAnimData14,
- kEob2IntroAnimData15,
- kEob2IntroAnimData16,
- kEob2IntroAnimData17,
- kEob2IntroAnimData18,
- kEob2IntroAnimData19,
- kEob2IntroAnimData20,
- kEob2IntroAnimData21,
- kEob2IntroAnimData22,
- kEob2IntroAnimData23,
- kEob2IntroAnimData24,
- kEob2IntroAnimData25,
- kEob2IntroAnimData26,
- kEob2IntroAnimData27,
- kEob2IntroAnimData28,
- kEob2IntroAnimData29,
- kEob2IntroAnimData30,
- kEob2IntroAnimData31,
- kEob2IntroAnimData32,
- kEob2IntroAnimData33,
- kEob2IntroAnimData34,
- kEob2IntroAnimData35,
- kEob2IntroAnimData36,
- kEob2IntroAnimData37,
- kEob2IntroAnimData38,
- kEob2IntroAnimData39,
- kEob2IntroAnimData40,
- kEob2IntroAnimData41,
- kEob2IntroAnimData42,
- kEob2IntroAnimData43,
+ kEoB2IntroAnimData00,
+ kEoB2IntroAnimData01,
+ kEoB2IntroAnimData02,
+ kEoB2IntroAnimData03,
+ kEoB2IntroAnimData04,
+ kEoB2IntroAnimData05,
+ kEoB2IntroAnimData06,
+ kEoB2IntroAnimData07,
+ kEoB2IntroAnimData08,
+ kEoB2IntroAnimData09,
+ kEoB2IntroAnimData10,
+ kEoB2IntroAnimData11,
+ kEoB2IntroAnimData12,
+ kEoB2IntroAnimData13,
+ kEoB2IntroAnimData14,
+ kEoB2IntroAnimData15,
+ kEoB2IntroAnimData16,
+ kEoB2IntroAnimData17,
+ kEoB2IntroAnimData18,
+ kEoB2IntroAnimData19,
+ kEoB2IntroAnimData20,
+ kEoB2IntroAnimData21,
+ kEoB2IntroAnimData22,
+ kEoB2IntroAnimData23,
+ kEoB2IntroAnimData24,
+ kEoB2IntroAnimData25,
+ kEoB2IntroAnimData26,
+ kEoB2IntroAnimData27,
+ kEoB2IntroAnimData28,
+ kEoB2IntroAnimData29,
+ kEoB2IntroAnimData30,
+ kEoB2IntroAnimData31,
+ kEoB2IntroAnimData32,
+ kEoB2IntroAnimData33,
+ kEoB2IntroAnimData34,
+ kEoB2IntroAnimData35,
+ kEoB2IntroAnimData36,
+ kEoB2IntroAnimData37,
+ kEoB2IntroAnimData38,
+ kEoB2IntroAnimData39,
+ kEoB2IntroAnimData40,
+ kEoB2IntroAnimData41,
+ kEoB2IntroAnimData42,
+ kEoB2IntroAnimData43,
kEoB2IntroShapes00,
kEoB2IntroShapes01,
@@ -1671,27 +1668,27 @@ const int eob2FloppyNeed[] = {
kEoB2FinaleStrings,
kEoB2CreditsData,
kEoB2FinaleCPSFiles,
- kEob2FinaleAnimData00,
- kEob2FinaleAnimData01,
- kEob2FinaleAnimData02,
- kEob2FinaleAnimData03,
- kEob2FinaleAnimData04,
- kEob2FinaleAnimData05,
- kEob2FinaleAnimData06,
- kEob2FinaleAnimData07,
- kEob2FinaleAnimData08,
- kEob2FinaleAnimData09,
- kEob2FinaleAnimData10,
- kEob2FinaleAnimData11,
- kEob2FinaleAnimData12,
- kEob2FinaleAnimData13,
- kEob2FinaleAnimData14,
- kEob2FinaleAnimData15,
- kEob2FinaleAnimData16,
- kEob2FinaleAnimData17,
- kEob2FinaleAnimData18,
- kEob2FinaleAnimData19,
- kEob2FinaleAnimData20,
+ kEoB2FinaleAnimData00,
+ kEoB2FinaleAnimData01,
+ kEoB2FinaleAnimData02,
+ kEoB2FinaleAnimData03,
+ kEoB2FinaleAnimData04,
+ kEoB2FinaleAnimData05,
+ kEoB2FinaleAnimData06,
+ kEoB2FinaleAnimData07,
+ kEoB2FinaleAnimData08,
+ kEoB2FinaleAnimData09,
+ kEoB2FinaleAnimData10,
+ kEoB2FinaleAnimData11,
+ kEoB2FinaleAnimData12,
+ kEoB2FinaleAnimData13,
+ kEoB2FinaleAnimData14,
+ kEoB2FinaleAnimData15,
+ kEoB2FinaleAnimData16,
+ kEoB2FinaleAnimData17,
+ kEoB2FinaleAnimData18,
+ kEoB2FinaleAnimData19,
+ kEoB2FinaleAnimData20,
kEoB2FinaleShapes00,
kEoB2FinaleShapes03,
kEoB2FinaleShapes07,
diff --git a/devtools/create_kyradat/md5.cpp b/devtools/create_kyradat/md5.cpp
index 9f90122981..705275f73b 100644
--- a/devtools/create_kyradat/md5.cpp
+++ b/devtools/create_kyradat/md5.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/devtools/create_kyradat/md5.h b/devtools/create_kyradat/md5.h
index 3746521002..8ec85a73fa 100644
--- a/devtools/create_kyradat/md5.h
+++ b/devtools/create_kyradat/md5.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/devtools/create_kyradat/module.mk b/devtools/create_kyradat/module.mk
index fb458b43ff..af80f5d4d7 100644
--- a/devtools/create_kyradat/module.mk
+++ b/devtools/create_kyradat/module.mk
@@ -3,12 +3,11 @@ MODULE := devtools/create_kyradat
MODULE_OBJS := \
create_kyradat.o \
- extract.o \
games.o \
md5.o \
pak.o \
- search.o \
- tables.o \
+ resources.o \
+ types.o \
util.o
# Set the name of the executable
diff --git a/devtools/create_kyradat/pak.cpp b/devtools/create_kyradat/pak.cpp
index 0d085f563c..52e1a2fc3b 100644
--- a/devtools/create_kyradat/pak.cpp
+++ b/devtools/create_kyradat/pak.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/devtools/create_kyradat/pak.h b/devtools/create_kyradat/pak.h
index cf415676dd..8e14bba42d 100644
--- a/devtools/create_kyradat/pak.h
+++ b/devtools/create_kyradat/pak.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/devtools/create_kyradat/resources.cpp b/devtools/create_kyradat/resources.cpp
new file mode 100644
index 0000000000..66db495caf
--- /dev/null
+++ b/devtools/create_kyradat/resources.cpp
@@ -0,0 +1,1950 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public 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 "resources.h"
+#include "types.h"
+
+// The Legend of Kyrandia
+#include "resources/lok_amiga.h"
+#include "resources/lok_amiga_english.h"
+#include "resources/lok_amiga_german.h"
+
+#include "resources/lok_dos_demo.h"
+#include "resources/lok_dos_demo_english.h"
+
+#include "resources/lok_dos.h"
+#include "resources/lok_dos_english.h"
+#include "resources/lok_dos_french.h"
+#include "resources/lok_dos_german.h"
+#include "resources/lok_dos_italian.h"
+#include "resources/lok_dos_oldfloppy.h"
+#include "resources/lok_dos_oldfloppy_russian.h"
+#include "resources/lok_dos_spanish.h"
+
+#include "resources/lok_dos_cd.h"
+#include "resources/lok_dos_cd_english.h"
+#include "resources/lok_dos_cd_french.h"
+#include "resources/lok_dos_cd_german.h"
+#include "resources/lok_dos_cd_italian.h"
+
+#include "resources/lok_dos_cddemo.h"
+#include "resources/lok_dos_cddemo_english.h"
+
+#include "resources/lok_fmtowns.h"
+#include "resources/lok_fmtowns_english.h"
+#include "resources/lok_fmtowns_japanese.h"
+
+#include "resources/lok_pc98.h"
+#include "resources/lok_pc98_japanese.h"
+
+// The Hand of Fate
+#include "resources/hof_dos_demo.h"
+
+#include "resources/hof_dos.h"
+#include "resources/hof_dos_english.h"
+#include "resources/hof_dos_french.h"
+#include "resources/hof_dos_german.h"
+#include "resources/hof_dos_italian.h"
+#include "resources/hof_dos_russian.h"
+
+#include "resources/hof_dos_cddemo.h"
+#include "resources/hof_dos_cddemo_english.h"
+#include "resources/hof_dos_cddemo_french.h"
+#include "resources/hof_dos_cddemo_german.h"
+
+#include "resources/hof_dos_cd.h"
+#include "resources/hof_dos_cd_english.h"
+#include "resources/hof_dos_cd_french.h"
+#include "resources/hof_dos_cd_german.h"
+#include "resources/hof_dos_cd_italian.h"
+#include "resources/hof_dos_cd_russian.h"
+
+#include "resources/hof_fmtowns.h"
+#include "resources/hof_fmtowns_english.h"
+#include "resources/hof_fmtowns_japanese.h"
+
+#include "resources/hof_pc98.h"
+#include "resources/hof_pc98_english.h"
+#include "resources/hof_pc98_japanese.h"
+
+// Malcolm's Revenge
+#include "resources/mr_dos_cd.h"
+
+// Eye of the Beholder
+#include "resources/eob1_dos.h"
+#include "resources/eob1_dos_english.h"
+#include "resources/eob1_dos_german.h"
+
+// Eye of the Beholder: The Legend of Darkmoon
+#include "resources/eob2_dos.h"
+#include "resources/eob2_dos_english.h"
+#include "resources/eob2_dos_german.h"
+
+// Lands of Lore
+#include "resources/lol_dos_demo.h"
+#include "resources/lol_dos_demo_english.h"
+
+#include "resources/lol_dos.h"
+#include "resources/lol_dos_english.h"
+#include "resources/lol_dos_french.h"
+#include "resources/lol_dos_german.h"
+#include "resources/lol_dos_russian.h"
+
+#include "resources/lol_dos_cd.h"
+#include "resources/lol_dos_cd_english.h"
+#include "resources/lol_dos_cd_french.h"
+#include "resources/lol_dos_cd_german.h"
+#include "resources/lol_dos_cd_italian.h"
+#include "resources/lol_dos_cd_russian.h"
+
+#include "resources/lol_pc98.h"
+#include "resources/lol_pc98_japanese.h"
+
+#include "resources/lol_fmtowns.h"
+#include "resources/lol_fmtowns_japanese.h"
+
+static const ResourceProvider resourceProviders[] = {
+ { k1WestwoodLogoSeq, kKyra1, kPlatformDOS, kDemoVersion, UNK_LANG, &k1WestwoodLogoSeqDOSDemoProvider },
+ { k1KyrandiaLogoSeq, kKyra1, kPlatformDOS, kDemoVersion, UNK_LANG, &k1KyrandiaLogoSeqDOSDemoProvider },
+ { k1IntroCPSStrings, kKyra1, kPlatformDOS, kDemoVersion, UNK_LANG, &k1IntroCPSStringsDOSDemoProvider },
+ { k1IntroCOLStrings, kKyra1, kPlatformDOS, kDemoVersion, UNK_LANG, &k1IntroCOLStringsDOSDemoProvider },
+ { k1IntroWSAStrings, kKyra1, kPlatformDOS, kDemoVersion, UNK_LANG, &k1IntroWSAStringsDOSDemoProvider },
+ { k1IntroStrings, kKyra1, kPlatformDOS, kDemoVersion, EN_ANY, &k1IntroStringsDOSDemoEnglishProvider },
+ { k1Demo1Seq, kKyra1, kPlatformDOS, kDemoVersion, UNK_LANG, &k1Demo1SeqDOSDemoProvider },
+ { k1Demo2Seq, kKyra1, kPlatformDOS, kDemoVersion, UNK_LANG, &k1Demo2SeqDOSDemoProvider },
+ { k1Demo3Seq, kKyra1, kPlatformDOS, kDemoVersion, UNK_LANG, &k1Demo3SeqDOSDemoProvider },
+ { k1Demo4Seq, kKyra1, kPlatformDOS, kDemoVersion, UNK_LANG, &k1Demo4SeqDOSDemoProvider },
+ { k1AudioTracksIntro, kKyra1, kPlatformDOS, kDemoVersion, UNK_LANG, &k1AudioTracksIntroDOSDemoProvider },
+ { k1KallakWritingSeq, kKyra1, kPlatformDOS, kTalkieDemoVersion, UNK_LANG, &k1KallakWritingSeqDOSCDDemoProvider },
+ { k1MalcolmTreeSeq, kKyra1, kPlatformDOS, kTalkieDemoVersion, UNK_LANG, &k1MalcolmTreeSeqDOSCDDemoProvider },
+ { k1WestwoodLogoSeq, kKyra1, kPlatformDOS, kTalkieDemoVersion, UNK_LANG, &k1WestwoodLogoSeqDOSCDDemoProvider },
+ { k1KyrandiaLogoSeq, kKyra1, kPlatformDOS, kTalkieDemoVersion, UNK_LANG, &k1KyrandiaLogoSeqDOSCDDemoProvider },
+ { k1KallakMalcolmSeq, kKyra1, kPlatformDOS, kTalkieDemoVersion, UNK_LANG, &k1KallakMalcolmSeqDOSCDDemoProvider },
+ { k1ForestSeq, kKyra1, kPlatformDOS, kTalkieDemoVersion, UNK_LANG, &k1ForestSeqDOSCDDemoProvider },
+ { k1IntroCPSStrings, kKyra1, kPlatformDOS, kTalkieDemoVersion, UNK_LANG, &k1IntroCPSStringsDOSCDDemoProvider },
+ { k1IntroCOLStrings, kKyra1, kPlatformDOS, kTalkieDemoVersion, UNK_LANG, &k1IntroCOLStringsDOSCDDemoProvider },
+ { k1IntroWSAStrings, kKyra1, kPlatformDOS, kTalkieDemoVersion, UNK_LANG, &k1IntroWSAStringsDOSCDDemoProvider },
+ { k1IntroStrings, kKyra1, kPlatformDOS, kTalkieDemoVersion, EN_ANY, &k1IntroStringsDOSCDDemoEnglishProvider },
+ { k1AudioTracksIntro, kKyra1, kPlatformDOS, kTalkieDemoVersion, UNK_LANG, &k1AudioTracksIntroDOSCDDemoProvider },
+ { k1KallakWritingSeq, kKyra1, kPlatformAmiga, kNoSpecial, UNK_LANG, &k1KallakWritingSeqAmigaProvider },
+ { k1MalcolmTreeSeq, kKyra1, kPlatformAmiga, kNoSpecial, UNK_LANG, &k1MalcolmTreeSeqAmigaProvider },
+ { k1WestwoodLogoSeq, kKyra1, kPlatformAmiga, kNoSpecial, UNK_LANG, &k1WestwoodLogoSeqAmigaProvider },
+ { k1KyrandiaLogoSeq, kKyra1, kPlatformAmiga, kNoSpecial, UNK_LANG, &k1KyrandiaLogoSeqAmigaProvider },
+ { k1KallakMalcolmSeq, kKyra1, kPlatformAmiga, kNoSpecial, UNK_LANG, &k1KallakMalcolmSeqAmigaProvider },
+ { k1ForestSeq, kKyra1, kPlatformAmiga, kNoSpecial, UNK_LANG, &k1ForestSeqAmigaProvider },
+ { k1IntroCPSStrings, kKyra1, kPlatformAmiga, kNoSpecial, UNK_LANG, &k1IntroCPSStringsAmigaProvider },
+ { k1IntroWSAStrings, kKyra1, kPlatformAmiga, kNoSpecial, UNK_LANG, &k1IntroWSAStringsAmigaProvider },
+ { k1IntroCOLStrings, kKyra1, kPlatformAmiga, kNoSpecial, UNK_LANG, &k1IntroCOLStringsAmigaProvider },
+ { k1IntroStrings, kKyra1, kPlatformAmiga, kNoSpecial, EN_ANY, &k1IntroStringsAmigaEnglishProvider },
+ { k1RoomList, kKyra1, kPlatformAmiga, kNoSpecial, UNK_LANG, &k1RoomListAmigaProvider },
+ { k1RoomFilenames, kKyra1, kPlatformAmiga, kNoSpecial, UNK_LANG, &k1RoomFilenamesAmigaProvider },
+ { k1CharacterImageFilenames, kKyra1, kPlatformAmiga, kNoSpecial, UNK_LANG, &k1CharacterImageFilenamesAmigaProvider },
+ { k1DefaultShapes, kKyra1, kPlatformAmiga, kNoSpecial, UNK_LANG, &k1DefaultShapesAmigaProvider },
+ { k1ItemNames, kKyra1, kPlatformAmiga, kNoSpecial, EN_ANY, &k1ItemNamesAmigaEnglishProvider },
+ { k1TakenStrings, kKyra1, kPlatformAmiga, kNoSpecial, EN_ANY, &k1TakenStringsAmigaEnglishProvider },
+ { k1PlacedStrings, kKyra1, kPlatformAmiga, kNoSpecial, EN_ANY, &k1PlacedStringsAmigaEnglishProvider },
+ { k1DroppedStrings, kKyra1, kPlatformAmiga, kNoSpecial, EN_ANY, &k1DroppedStringsAmigaEnglishProvider },
+ { k1NoDropStrings, kKyra1, kPlatformAmiga, kNoSpecial, EN_ANY, &k1NoDropStringsAmigaEnglishProvider },
+ { k1AmuleteAnimSeq, kKyra1, kPlatformAmiga, kNoSpecial, UNK_LANG, &k1AmuleteAnimSeqAmigaProvider },
+ { k1PutDownString, kKyra1, kPlatformAmiga, kNoSpecial, EN_ANY, &k1PutDownStringAmigaEnglishProvider },
+ { k1WaitAmuletString, kKyra1, kPlatformAmiga, kNoSpecial, EN_ANY, &k1WaitAmuletStringAmigaEnglishProvider },
+ { k1BlackJewelString, kKyra1, kPlatformAmiga, kNoSpecial, EN_ANY, &k1BlackJewelStringAmigaEnglishProvider },
+ { k1HealingTipString, kKyra1, kPlatformAmiga, kNoSpecial, EN_ANY, &k1HealingTipStringAmigaEnglishProvider },
+ { k1PoisonGoneString, kKyra1, kPlatformAmiga, kNoSpecial, EN_ANY, &k1PoisonGoneStringAmigaEnglishProvider },
+ { k1Healing1Shapes, kKyra1, kPlatformAmiga, kNoSpecial, UNK_LANG, &k1Healing1ShapesAmigaProvider },
+ { k1Healing2Shapes, kKyra1, kPlatformAmiga, kNoSpecial, UNK_LANG, &k1Healing2ShapesAmigaProvider },
+ { k1ThePoisonStrings, kKyra1, kPlatformAmiga, kNoSpecial, EN_ANY, &k1ThePoisonStringsAmigaEnglishProvider },
+ { k1FluteStrings, kKyra1, kPlatformAmiga, kNoSpecial, EN_ANY, &k1FluteStringsAmigaEnglishProvider },
+ { k1PoisonDeathShapes, kKyra1, kPlatformAmiga, kNoSpecial, UNK_LANG, &k1PoisonDeathShapesAmigaProvider },
+ { k1FluteShapes, kKyra1, kPlatformAmiga, kNoSpecial, UNK_LANG, &k1FluteShapesAmigaProvider },
+ { k1Winter1Shapes, kKyra1, kPlatformAmiga, kNoSpecial, UNK_LANG, &k1Winter1ShapesAmigaProvider },
+ { k1Winter2Shapes, kKyra1, kPlatformAmiga, kNoSpecial, UNK_LANG, &k1Winter2ShapesAmigaProvider },
+ { k1Winter3Shapes, kKyra1, kPlatformAmiga, kNoSpecial, UNK_LANG, &k1Winter3ShapesAmigaProvider },
+ { k1DrinkShapes, kKyra1, kPlatformAmiga, kNoSpecial, UNK_LANG, &k1DrinkShapesAmigaProvider },
+ { k1WispShapes, kKyra1, kPlatformAmiga, kNoSpecial, UNK_LANG, &k1WispShapesAmigaProvider },
+ { k1MagicAnimShapes, kKyra1, kPlatformAmiga, kNoSpecial, UNK_LANG, &k1MagicAnimShapesAmigaProvider },
+ { k1BranStoneShapes, kKyra1, kPlatformAmiga, kNoSpecial, UNK_LANG, &k1BranStoneShapesAmigaProvider },
+ { k1WispJewelStrings, kKyra1, kPlatformAmiga, kNoSpecial, EN_ANY, &k1WispJewelStringsAmigaEnglishProvider },
+ { k1MagicJewelStrings, kKyra1, kPlatformAmiga, kNoSpecial, EN_ANY, &k1MagicJewelStringsAmigaEnglishProvider },
+ { k1FlaskFullString, kKyra1, kPlatformAmiga, kNoSpecial, EN_ANY, &k1FlaskFullStringAmigaEnglishProvider },
+ { k1FullFlaskString, kKyra1, kPlatformAmiga, kNoSpecial, EN_ANY, &k1FullFlaskStringAmigaEnglishProvider },
+ { k1OutroReunionSeq, kKyra1, kPlatformAmiga, kNoSpecial, UNK_LANG, &k1OutroReunionSeqAmigaProvider },
+ { k1OutroHomeString, kKyra1, kPlatformAmiga, kNoSpecial, EN_ANY, &k1OutroHomeStringAmigaEnglishProvider },
+ { k1VeryCleverString, kKyra1, kPlatformAmiga, kNoSpecial, EN_ANY, &k1VeryCleverStringAmigaEnglishProvider },
+ { k1GUIStrings, kKyra1, kPlatformAmiga, kNoSpecial, EN_ANY, &k1GUIStringsAmigaEnglishProvider },
+ { k1NewGameString, kKyra1, kPlatformAmiga, kNoSpecial, EN_ANY, &k1NewGameStringAmigaEnglishProvider },
+ { k1ConfigStrings, kKyra1, kPlatformAmiga, kNoSpecial, EN_ANY, &k1ConfigStringsAmigaEnglishProvider },
+ { k1CreditsStrings, kKyra1, kPlatformAmiga, kNoSpecial, EN_ANY, &k1CreditsStringsAmigaEnglishProvider },
+ { k1AmigaIntroSFXTable, kKyra1, kPlatformAmiga, kNoSpecial, UNK_LANG, &k1AmigaIntroSFXTableAmigaProvider },
+ { k1AmigaGameSFXTable, kKyra1, kPlatformAmiga, kNoSpecial, UNK_LANG, &k1AmigaGameSFXTableAmigaProvider },
+ { k1IntroStrings, kKyra1, kPlatformAmiga, kNoSpecial, DE_DEU, &k1IntroStringsAmigaGermanProvider },
+ { k1ItemNames, kKyra1, kPlatformAmiga, kNoSpecial, DE_DEU, &k1ItemNamesAmigaGermanProvider },
+ { k1TakenStrings, kKyra1, kPlatformAmiga, kNoSpecial, DE_DEU, &k1TakenStringsAmigaGermanProvider },
+ { k1PlacedStrings, kKyra1, kPlatformAmiga, kNoSpecial, DE_DEU, &k1PlacedStringsAmigaGermanProvider },
+ { k1DroppedStrings, kKyra1, kPlatformAmiga, kNoSpecial, DE_DEU, &k1DroppedStringsAmigaGermanProvider },
+ { k1NoDropStrings, kKyra1, kPlatformAmiga, kNoSpecial, DE_DEU, &k1NoDropStringsAmigaGermanProvider },
+ { k1PutDownString, kKyra1, kPlatformAmiga, kNoSpecial, DE_DEU, &k1PutDownStringAmigaGermanProvider },
+ { k1WaitAmuletString, kKyra1, kPlatformAmiga, kNoSpecial, DE_DEU, &k1WaitAmuletStringAmigaGermanProvider },
+ { k1BlackJewelString, kKyra1, kPlatformAmiga, kNoSpecial, DE_DEU, &k1BlackJewelStringAmigaGermanProvider },
+ { k1HealingTipString, kKyra1, kPlatformAmiga, kNoSpecial, DE_DEU, &k1HealingTipStringAmigaGermanProvider },
+ { k1PoisonGoneString, kKyra1, kPlatformAmiga, kNoSpecial, DE_DEU, &k1PoisonGoneStringAmigaGermanProvider },
+ { k1ThePoisonStrings, kKyra1, kPlatformAmiga, kNoSpecial, DE_DEU, &k1ThePoisonStringsAmigaGermanProvider },
+ { k1FluteStrings, kKyra1, kPlatformAmiga, kNoSpecial, DE_DEU, &k1FluteStringsAmigaGermanProvider },
+ { k1WispJewelStrings, kKyra1, kPlatformAmiga, kNoSpecial, DE_DEU, &k1WispJewelStringsAmigaGermanProvider },
+ { k1MagicJewelStrings, kKyra1, kPlatformAmiga, kNoSpecial, DE_DEU, &k1MagicJewelStringsAmigaGermanProvider },
+ { k1FlaskFullString, kKyra1, kPlatformAmiga, kNoSpecial, DE_DEU, &k1FlaskFullStringAmigaGermanProvider },
+ { k1FullFlaskString, kKyra1, kPlatformAmiga, kNoSpecial, DE_DEU, &k1FullFlaskStringAmigaGermanProvider },
+ { k1OutroHomeString, kKyra1, kPlatformAmiga, kNoSpecial, DE_DEU, &k1OutroHomeStringAmigaGermanProvider },
+ { k1VeryCleverString, kKyra1, kPlatformAmiga, kNoSpecial, DE_DEU, &k1VeryCleverStringAmigaGermanProvider },
+ { k1GUIStrings, kKyra1, kPlatformAmiga, kNoSpecial, DE_DEU, &k1GUIStringsAmigaGermanProvider },
+ { k1NewGameString, kKyra1, kPlatformAmiga, kNoSpecial, DE_DEU, &k1NewGameStringAmigaGermanProvider },
+ { k1ConfigStrings, kKyra1, kPlatformAmiga, kNoSpecial, DE_DEU, &k1ConfigStringsAmigaGermanProvider },
+ { k1CreditsStrings, kKyra1, kPlatformAmiga, kNoSpecial, DE_DEU, &k1CreditsStringsAmigaGermanProvider },
+ { k1KallakWritingSeq, kKyra1, kPlatformDOS, kNoSpecial, UNK_LANG, &k1KallakWritingSeqDOSProvider },
+ { k1MalcolmTreeSeq, kKyra1, kPlatformDOS, kNoSpecial, UNK_LANG, &k1MalcolmTreeSeqDOSProvider },
+ { k1WestwoodLogoSeq, kKyra1, kPlatformDOS, kNoSpecial, UNK_LANG, &k1WestwoodLogoSeqDOSProvider },
+ { k1KyrandiaLogoSeq, kKyra1, kPlatformDOS, kNoSpecial, UNK_LANG, &k1KyrandiaLogoSeqDOSProvider },
+ { k1KallakMalcolmSeq, kKyra1, kPlatformDOS, kNoSpecial, UNK_LANG, &k1KallakMalcolmSeqDOSProvider },
+ { k1ForestSeq, kKyra1, kPlatformDOS, kNoSpecial, UNK_LANG, &k1ForestSeqDOSProvider },
+ { k1IntroCPSStrings, kKyra1, kPlatformDOS, kNoSpecial, UNK_LANG, &k1IntroCPSStringsDOSProvider },
+ { k1IntroCOLStrings, kKyra1, kPlatformDOS, kNoSpecial, UNK_LANG, &k1IntroCOLStringsDOSProvider },
+ { k1IntroWSAStrings, kKyra1, kPlatformDOS, kNoSpecial, UNK_LANG, &k1IntroWSAStringsDOSProvider },
+ { k1IntroStrings, kKyra1, kPlatformDOS, kNoSpecial, EN_ANY, &k1IntroStringsDOSEnglishProvider },
+ { k1RoomList, kKyra1, kPlatformDOS, kNoSpecial, UNK_LANG, &k1RoomListDOSProvider },
+ { k1RoomFilenames, kKyra1, kPlatformDOS, kNoSpecial, UNK_LANG, &k1RoomFilenamesDOSProvider },
+ { k1CharacterImageFilenames, kKyra1, kPlatformDOS, kNoSpecial, UNK_LANG, &k1CharacterImageFilenamesDOSProvider },
+ { k1DefaultShapes, kKyra1, kPlatformDOS, kNoSpecial, UNK_LANG, &k1DefaultShapesDOSProvider },
+ { k1ItemNames, kKyra1, kPlatformDOS, kNoSpecial, EN_ANY, &k1ItemNamesDOSEnglishProvider },
+ { k1TakenStrings, kKyra1, kPlatformDOS, kNoSpecial, EN_ANY, &k1TakenStringsDOSEnglishProvider },
+ { k1PlacedStrings, kKyra1, kPlatformDOS, kNoSpecial, EN_ANY, &k1PlacedStringsDOSEnglishProvider },
+ { k1DroppedStrings, kKyra1, kPlatformDOS, kNoSpecial, EN_ANY, &k1DroppedStringsDOSEnglishProvider },
+ { k1NoDropStrings, kKyra1, kPlatformDOS, kNoSpecial, EN_ANY, &k1NoDropStringsDOSEnglishProvider },
+ { k1AmuleteAnimSeq, kKyra1, kPlatformDOS, kNoSpecial, UNK_LANG, &k1AmuleteAnimSeqDOSProvider },
+ { k1SpecialPalette1, kKyra1, kPlatformDOS, kNoSpecial, UNK_LANG, &k1SpecialPalette1DOSProvider },
+ { k1SpecialPalette2, kKyra1, kPlatformDOS, kNoSpecial, UNK_LANG, &k1SpecialPalette2DOSProvider },
+ { k1SpecialPalette3, kKyra1, kPlatformDOS, kNoSpecial, UNK_LANG, &k1SpecialPalette3DOSProvider },
+ { k1SpecialPalette4, kKyra1, kPlatformDOS, kNoSpecial, UNK_LANG, &k1SpecialPalette4DOSProvider },
+ { k1SpecialPalette5, kKyra1, kPlatformDOS, kNoSpecial, UNK_LANG, &k1SpecialPalette5DOSProvider },
+ { k1SpecialPalette6, kKyra1, kPlatformDOS, kNoSpecial, UNK_LANG, &k1SpecialPalette6DOSProvider },
+ { k1SpecialPalette7, kKyra1, kPlatformDOS, kNoSpecial, UNK_LANG, &k1SpecialPalette7DOSProvider },
+ { k1SpecialPalette8, kKyra1, kPlatformDOS, kNoSpecial, UNK_LANG, &k1SpecialPalette8DOSProvider },
+ { k1SpecialPalette9, kKyra1, kPlatformDOS, kNoSpecial, UNK_LANG, &k1SpecialPalette9DOSProvider },
+ { k1SpecialPalette10, kKyra1, kPlatformDOS, kNoSpecial, UNK_LANG, &k1SpecialPalette10DOSProvider },
+ { k1SpecialPalette11, kKyra1, kPlatformDOS, kNoSpecial, UNK_LANG, &k1SpecialPalette11DOSProvider },
+ { k1SpecialPalette12, kKyra1, kPlatformDOS, kNoSpecial, UNK_LANG, &k1SpecialPalette12DOSProvider },
+ { k1SpecialPalette13, kKyra1, kPlatformDOS, kNoSpecial, UNK_LANG, &k1SpecialPalette13DOSProvider },
+ { k1SpecialPalette14, kKyra1, kPlatformDOS, kNoSpecial, UNK_LANG, &k1SpecialPalette14DOSProvider },
+ { k1SpecialPalette15, kKyra1, kPlatformDOS, kNoSpecial, UNK_LANG, &k1SpecialPalette15DOSProvider },
+ { k1SpecialPalette16, kKyra1, kPlatformDOS, kNoSpecial, UNK_LANG, &k1SpecialPalette16DOSProvider },
+ { k1SpecialPalette17, kKyra1, kPlatformDOS, kNoSpecial, UNK_LANG, &k1SpecialPalette17DOSProvider },
+ { k1SpecialPalette18, kKyra1, kPlatformDOS, kNoSpecial, UNK_LANG, &k1SpecialPalette18DOSProvider },
+ { k1SpecialPalette19, kKyra1, kPlatformDOS, kNoSpecial, UNK_LANG, &k1SpecialPalette19DOSProvider },
+ { k1SpecialPalette20, kKyra1, kPlatformDOS, kNoSpecial, UNK_LANG, &k1SpecialPalette20DOSProvider },
+ { k1SpecialPalette21, kKyra1, kPlatformDOS, kNoSpecial, UNK_LANG, &k1SpecialPalette21DOSProvider },
+ { k1SpecialPalette22, kKyra1, kPlatformDOS, kNoSpecial, UNK_LANG, &k1SpecialPalette22DOSProvider },
+ { k1SpecialPalette23, kKyra1, kPlatformDOS, kNoSpecial, UNK_LANG, &k1SpecialPalette23DOSProvider },
+ { k1SpecialPalette24, kKyra1, kPlatformDOS, kNoSpecial, UNK_LANG, &k1SpecialPalette24DOSProvider },
+ { k1SpecialPalette25, kKyra1, kPlatformDOS, kNoSpecial, UNK_LANG, &k1SpecialPalette25DOSProvider },
+ { k1SpecialPalette26, kKyra1, kPlatformDOS, kNoSpecial, UNK_LANG, &k1SpecialPalette26DOSProvider },
+ { k1SpecialPalette27, kKyra1, kPlatformDOS, kNoSpecial, UNK_LANG, &k1SpecialPalette27DOSProvider },
+ { k1SpecialPalette28, kKyra1, kPlatformDOS, kNoSpecial, UNK_LANG, &k1SpecialPalette28DOSProvider },
+ { k1SpecialPalette29, kKyra1, kPlatformDOS, kNoSpecial, UNK_LANG, &k1SpecialPalette29DOSProvider },
+ { k1SpecialPalette30, kKyra1, kPlatformDOS, kNoSpecial, UNK_LANG, &k1SpecialPalette30DOSProvider },
+ { k1SpecialPalette31, kKyra1, kPlatformDOS, kNoSpecial, UNK_LANG, &k1SpecialPalette31DOSProvider },
+ { k1SpecialPalette32, kKyra1, kPlatformDOS, kNoSpecial, UNK_LANG, &k1SpecialPalette32DOSProvider },
+ { k1SpecialPalette33, kKyra1, kPlatformDOS, kNoSpecial, UNK_LANG, &k1SpecialPalette33DOSProvider },
+ { k1PutDownString, kKyra1, kPlatformDOS, kNoSpecial, EN_ANY, &k1PutDownStringDOSEnglishProvider },
+ { k1WaitAmuletString, kKyra1, kPlatformDOS, kNoSpecial, EN_ANY, &k1WaitAmuletStringDOSEnglishProvider },
+ { k1BlackJewelString, kKyra1, kPlatformDOS, kNoSpecial, EN_ANY, &k1BlackJewelStringDOSEnglishProvider },
+ { k1HealingTipString, kKyra1, kPlatformDOS, kNoSpecial, EN_ANY, &k1HealingTipStringDOSEnglishProvider },
+ { k1PoisonGoneString, kKyra1, kPlatformDOS, kNoSpecial, EN_ANY, &k1PoisonGoneStringDOSEnglishProvider },
+ { k1Healing1Shapes, kKyra1, kPlatformDOS, kNoSpecial, UNK_LANG, &k1Healing1ShapesDOSProvider },
+ { k1Healing2Shapes, kKyra1, kPlatformDOS, kNoSpecial, UNK_LANG, &k1Healing2ShapesDOSProvider },
+ { k1ThePoisonStrings, kKyra1, kPlatformDOS, kNoSpecial, EN_ANY, &k1ThePoisonStringsDOSEnglishProvider },
+ { k1FluteStrings, kKyra1, kPlatformDOS, kNoSpecial, EN_ANY, &k1FluteStringsDOSEnglishProvider },
+ { k1PoisonDeathShapes, kKyra1, kPlatformDOS, kNoSpecial, UNK_LANG, &k1PoisonDeathShapesDOSProvider },
+ { k1FluteShapes, kKyra1, kPlatformDOS, kNoSpecial, UNK_LANG, &k1FluteShapesDOSProvider },
+ { k1Winter1Shapes, kKyra1, kPlatformDOS, kNoSpecial, UNK_LANG, &k1Winter1ShapesDOSProvider },
+ { k1Winter2Shapes, kKyra1, kPlatformDOS, kNoSpecial, UNK_LANG, &k1Winter2ShapesDOSProvider },
+ { k1Winter3Shapes, kKyra1, kPlatformDOS, kNoSpecial, UNK_LANG, &k1Winter3ShapesDOSProvider },
+ { k1DrinkShapes, kKyra1, kPlatformDOS, kNoSpecial, UNK_LANG, &k1DrinkShapesDOSProvider },
+ { k1WispShapes, kKyra1, kPlatformDOS, kNoSpecial, UNK_LANG, &k1WispShapesDOSProvider },
+ { k1MagicAnimShapes, kKyra1, kPlatformDOS, kNoSpecial, UNK_LANG, &k1MagicAnimShapesDOSProvider },
+ { k1BranStoneShapes, kKyra1, kPlatformDOS, kNoSpecial, UNK_LANG, &k1BranStoneShapesDOSProvider },
+ { k1WispJewelStrings, kKyra1, kPlatformDOS, kNoSpecial, EN_ANY, &k1WispJewelStringsDOSEnglishProvider },
+ { k1MagicJewelStrings, kKyra1, kPlatformDOS, kNoSpecial, EN_ANY, &k1MagicJewelStringsDOSEnglishProvider },
+ { k1FlaskFullString, kKyra1, kPlatformDOS, kNoSpecial, EN_ANY, &k1FlaskFullStringDOSEnglishProvider },
+ { k1FullFlaskString, kKyra1, kPlatformDOS, kNoSpecial, EN_ANY, &k1FullFlaskStringDOSEnglishProvider },
+ { k1OutroReunionSeq, kKyra1, kPlatformDOS, kNoSpecial, UNK_LANG, &k1OutroReunionSeqDOSProvider },
+ { k1OutroHomeString, kKyra1, kPlatformDOS, kNoSpecial, EN_ANY, &k1OutroHomeStringDOSEnglishProvider },
+ { k1VeryCleverString, kKyra1, kPlatformDOS, kNoSpecial, EN_ANY, &k1VeryCleverStringDOSEnglishProvider },
+ { k1GUIStrings, kKyra1, kPlatformDOS, kNoSpecial, EN_ANY, &k1GUIStringsDOSEnglishProvider },
+ { k1NewGameString, kKyra1, kPlatformDOS, kNoSpecial, EN_ANY, &k1NewGameStringDOSEnglishProvider },
+ { k1ConfigStrings, kKyra1, kPlatformDOS, kNoSpecial, EN_ANY, &k1ConfigStringsDOSEnglishProvider },
+ { k1AudioTracks, kKyra1, kPlatformDOS, kNoSpecial, UNK_LANG, &k1AudioTracksDOSProvider },
+ { k1AudioTracks2, kKyra1, kPlatformDOS, kNoSpecial, UNK_LANG, &k1AudioTracks2DOSProvider },
+ { k1AudioTracksIntro, kKyra1, kPlatformDOS, kNoSpecial, UNK_LANG, &k1AudioTracksIntroDOSProvider },
+ { k1IntroStrings, kKyra1, kPlatformDOS, kNoSpecial, DE_DEU, &k1IntroStringsDOSGermanProvider },
+ { k1ItemNames, kKyra1, kPlatformDOS, kNoSpecial, DE_DEU, &k1ItemNamesDOSGermanProvider },
+ { k1TakenStrings, kKyra1, kPlatformDOS, kNoSpecial, DE_DEU, &k1TakenStringsDOSGermanProvider },
+ { k1PlacedStrings, kKyra1, kPlatformDOS, kNoSpecial, DE_DEU, &k1PlacedStringsDOSGermanProvider },
+ { k1DroppedStrings, kKyra1, kPlatformDOS, kNoSpecial, DE_DEU, &k1DroppedStringsDOSGermanProvider },
+ { k1NoDropStrings, kKyra1, kPlatformDOS, kNoSpecial, DE_DEU, &k1NoDropStringsDOSGermanProvider },
+ { k1PutDownString, kKyra1, kPlatformDOS, kNoSpecial, DE_DEU, &k1PutDownStringDOSGermanProvider },
+ { k1WaitAmuletString, kKyra1, kPlatformDOS, kNoSpecial, DE_DEU, &k1WaitAmuletStringDOSGermanProvider },
+ { k1BlackJewelString, kKyra1, kPlatformDOS, kNoSpecial, DE_DEU, &k1BlackJewelStringDOSGermanProvider },
+ { k1HealingTipString, kKyra1, kPlatformDOS, kNoSpecial, DE_DEU, &k1HealingTipStringDOSGermanProvider },
+ { k1PoisonGoneString, kKyra1, kPlatformDOS, kNoSpecial, DE_DEU, &k1PoisonGoneStringDOSGermanProvider },
+ { k1ThePoisonStrings, kKyra1, kPlatformDOS, kNoSpecial, DE_DEU, &k1ThePoisonStringsDOSGermanProvider },
+ { k1FluteStrings, kKyra1, kPlatformDOS, kNoSpecial, DE_DEU, &k1FluteStringsDOSGermanProvider },
+ { k1WispJewelStrings, kKyra1, kPlatformDOS, kNoSpecial, DE_DEU, &k1WispJewelStringsDOSGermanProvider },
+ { k1MagicJewelStrings, kKyra1, kPlatformDOS, kNoSpecial, DE_DEU, &k1MagicJewelStringsDOSGermanProvider },
+ { k1FlaskFullString, kKyra1, kPlatformDOS, kNoSpecial, DE_DEU, &k1FlaskFullStringDOSGermanProvider },
+ { k1FullFlaskString, kKyra1, kPlatformDOS, kNoSpecial, DE_DEU, &k1FullFlaskStringDOSGermanProvider },
+ { k1OutroHomeString, kKyra1, kPlatformDOS, kNoSpecial, DE_DEU, &k1OutroHomeStringDOSGermanProvider },
+ { k1VeryCleverString, kKyra1, kPlatformDOS, kNoSpecial, DE_DEU, &k1VeryCleverStringDOSGermanProvider },
+ { k1GUIStrings, kKyra1, kPlatformDOS, kNoSpecial, DE_DEU, &k1GUIStringsDOSGermanProvider },
+ { k1NewGameString, kKyra1, kPlatformDOS, kNoSpecial, DE_DEU, &k1NewGameStringDOSGermanProvider },
+ { k1ConfigStrings, kKyra1, kPlatformDOS, kNoSpecial, DE_DEU, &k1ConfigStringsDOSGermanProvider },
+ { k1IntroStrings, kKyra1, kPlatformDOS, kNoSpecial, FR_FRA, &k1IntroStringsDOSFrenchProvider },
+ { k1ItemNames, kKyra1, kPlatformDOS, kNoSpecial, FR_FRA, &k1ItemNamesDOSFrenchProvider },
+ { k1TakenStrings, kKyra1, kPlatformDOS, kNoSpecial, FR_FRA, &k1TakenStringsDOSFrenchProvider },
+ { k1PlacedStrings, kKyra1, kPlatformDOS, kNoSpecial, FR_FRA, &k1PlacedStringsDOSFrenchProvider },
+ { k1DroppedStrings, kKyra1, kPlatformDOS, kNoSpecial, FR_FRA, &k1DroppedStringsDOSFrenchProvider },
+ { k1NoDropStrings, kKyra1, kPlatformDOS, kNoSpecial, FR_FRA, &k1NoDropStringsDOSFrenchProvider },
+ { k1PutDownString, kKyra1, kPlatformDOS, kNoSpecial, FR_FRA, &k1PutDownStringDOSFrenchProvider },
+ { k1WaitAmuletString, kKyra1, kPlatformDOS, kNoSpecial, FR_FRA, &k1WaitAmuletStringDOSFrenchProvider },
+ { k1BlackJewelString, kKyra1, kPlatformDOS, kNoSpecial, FR_FRA, &k1BlackJewelStringDOSFrenchProvider },
+ { k1HealingTipString, kKyra1, kPlatformDOS, kNoSpecial, FR_FRA, &k1HealingTipStringDOSFrenchProvider },
+ { k1PoisonGoneString, kKyra1, kPlatformDOS, kNoSpecial, FR_FRA, &k1PoisonGoneStringDOSFrenchProvider },
+ { k1ThePoisonStrings, kKyra1, kPlatformDOS, kNoSpecial, FR_FRA, &k1ThePoisonStringsDOSFrenchProvider },
+ { k1FluteStrings, kKyra1, kPlatformDOS, kNoSpecial, FR_FRA, &k1FluteStringsDOSFrenchProvider },
+ { k1WispJewelStrings, kKyra1, kPlatformDOS, kNoSpecial, FR_FRA, &k1WispJewelStringsDOSFrenchProvider },
+ { k1MagicJewelStrings, kKyra1, kPlatformDOS, kNoSpecial, FR_FRA, &k1MagicJewelStringsDOSFrenchProvider },
+ { k1FlaskFullString, kKyra1, kPlatformDOS, kNoSpecial, FR_FRA, &k1FlaskFullStringDOSFrenchProvider },
+ { k1FullFlaskString, kKyra1, kPlatformDOS, kNoSpecial, FR_FRA, &k1FullFlaskStringDOSFrenchProvider },
+ { k1OutroHomeString, kKyra1, kPlatformDOS, kNoSpecial, FR_FRA, &k1OutroHomeStringDOSFrenchProvider },
+ { k1VeryCleverString, kKyra1, kPlatformDOS, kNoSpecial, FR_FRA, &k1VeryCleverStringDOSFrenchProvider },
+ { k1GUIStrings, kKyra1, kPlatformDOS, kNoSpecial, FR_FRA, &k1GUIStringsDOSFrenchProvider },
+ { k1NewGameString, kKyra1, kPlatformDOS, kNoSpecial, FR_FRA, &k1NewGameStringDOSFrenchProvider },
+ { k1ConfigStrings, kKyra1, kPlatformDOS, kNoSpecial, FR_FRA, &k1ConfigStringsDOSFrenchProvider },
+ { k1IntroStrings, kKyra1, kPlatformDOS, kNoSpecial, IT_ITA, &k1IntroStringsDOSItalianProvider },
+ { k1ItemNames, kKyra1, kPlatformDOS, kNoSpecial, IT_ITA, &k1ItemNamesDOSItalianProvider },
+ { k1TakenStrings, kKyra1, kPlatformDOS, kNoSpecial, IT_ITA, &k1TakenStringsDOSItalianProvider },
+ { k1PlacedStrings, kKyra1, kPlatformDOS, kNoSpecial, IT_ITA, &k1PlacedStringsDOSItalianProvider },
+ { k1DroppedStrings, kKyra1, kPlatformDOS, kNoSpecial, IT_ITA, &k1DroppedStringsDOSItalianProvider },
+ { k1NoDropStrings, kKyra1, kPlatformDOS, kNoSpecial, IT_ITA, &k1NoDropStringsDOSItalianProvider },
+ { k1PutDownString, kKyra1, kPlatformDOS, kNoSpecial, IT_ITA, &k1PutDownStringDOSItalianProvider },
+ { k1WaitAmuletString, kKyra1, kPlatformDOS, kNoSpecial, IT_ITA, &k1WaitAmuletStringDOSItalianProvider },
+ { k1BlackJewelString, kKyra1, kPlatformDOS, kNoSpecial, IT_ITA, &k1BlackJewelStringDOSItalianProvider },
+ { k1HealingTipString, kKyra1, kPlatformDOS, kNoSpecial, IT_ITA, &k1HealingTipStringDOSItalianProvider },
+ { k1PoisonGoneString, kKyra1, kPlatformDOS, kNoSpecial, IT_ITA, &k1PoisonGoneStringDOSItalianProvider },
+ { k1ThePoisonStrings, kKyra1, kPlatformDOS, kNoSpecial, IT_ITA, &k1ThePoisonStringsDOSItalianProvider },
+ { k1FluteStrings, kKyra1, kPlatformDOS, kNoSpecial, IT_ITA, &k1FluteStringsDOSItalianProvider },
+ { k1WispJewelStrings, kKyra1, kPlatformDOS, kNoSpecial, IT_ITA, &k1WispJewelStringsDOSItalianProvider },
+ { k1MagicJewelStrings, kKyra1, kPlatformDOS, kNoSpecial, IT_ITA, &k1MagicJewelStringsDOSItalianProvider },
+ { k1FlaskFullString, kKyra1, kPlatformDOS, kNoSpecial, IT_ITA, &k1FlaskFullStringDOSItalianProvider },
+ { k1FullFlaskString, kKyra1, kPlatformDOS, kNoSpecial, IT_ITA, &k1FullFlaskStringDOSItalianProvider },
+ { k1OutroHomeString, kKyra1, kPlatformDOS, kNoSpecial, IT_ITA, &k1OutroHomeStringDOSItalianProvider },
+ { k1VeryCleverString, kKyra1, kPlatformDOS, kNoSpecial, IT_ITA, &k1VeryCleverStringDOSItalianProvider },
+ { k1GUIStrings, kKyra1, kPlatformDOS, kNoSpecial, IT_ITA, &k1GUIStringsDOSItalianProvider },
+ { k1NewGameString, kKyra1, kPlatformDOS, kNoSpecial, IT_ITA, &k1NewGameStringDOSItalianProvider },
+ { k1ConfigStrings, kKyra1, kPlatformDOS, kNoSpecial, IT_ITA, &k1ConfigStringsDOSItalianProvider },
+ { k1IntroStrings, kKyra1, kPlatformDOS, kNoSpecial, ES_ESP, &k1IntroStringsDOSSpanishProvider },
+ { k1ItemNames, kKyra1, kPlatformDOS, kNoSpecial, ES_ESP, &k1ItemNamesDOSSpanishProvider },
+ { k1TakenStrings, kKyra1, kPlatformDOS, kNoSpecial, ES_ESP, &k1TakenStringsDOSSpanishProvider },
+ { k1PlacedStrings, kKyra1, kPlatformDOS, kNoSpecial, ES_ESP, &k1PlacedStringsDOSSpanishProvider },
+ { k1DroppedStrings, kKyra1, kPlatformDOS, kNoSpecial, ES_ESP, &k1DroppedStringsDOSSpanishProvider },
+ { k1NoDropStrings, kKyra1, kPlatformDOS, kNoSpecial, ES_ESP, &k1NoDropStringsDOSSpanishProvider },
+ { k1PutDownString, kKyra1, kPlatformDOS, kNoSpecial, ES_ESP, &k1PutDownStringDOSSpanishProvider },
+ { k1WaitAmuletString, kKyra1, kPlatformDOS, kNoSpecial, ES_ESP, &k1WaitAmuletStringDOSSpanishProvider },
+ { k1BlackJewelString, kKyra1, kPlatformDOS, kNoSpecial, ES_ESP, &k1BlackJewelStringDOSSpanishProvider },
+ { k1HealingTipString, kKyra1, kPlatformDOS, kNoSpecial, ES_ESP, &k1HealingTipStringDOSSpanishProvider },
+ { k1PoisonGoneString, kKyra1, kPlatformDOS, kNoSpecial, ES_ESP, &k1PoisonGoneStringDOSSpanishProvider },
+ { k1ThePoisonStrings, kKyra1, kPlatformDOS, kNoSpecial, ES_ESP, &k1ThePoisonStringsDOSSpanishProvider },
+ { k1FluteStrings, kKyra1, kPlatformDOS, kNoSpecial, ES_ESP, &k1FluteStringsDOSSpanishProvider },
+ { k1WispJewelStrings, kKyra1, kPlatformDOS, kNoSpecial, ES_ESP, &k1WispJewelStringsDOSSpanishProvider },
+ { k1MagicJewelStrings, kKyra1, kPlatformDOS, kNoSpecial, ES_ESP, &k1MagicJewelStringsDOSSpanishProvider },
+ { k1FlaskFullString, kKyra1, kPlatformDOS, kNoSpecial, ES_ESP, &k1FlaskFullStringDOSSpanishProvider },
+ { k1FullFlaskString, kKyra1, kPlatformDOS, kNoSpecial, ES_ESP, &k1FullFlaskStringDOSSpanishProvider },
+ { k1OutroHomeString, kKyra1, kPlatformDOS, kNoSpecial, ES_ESP, &k1OutroHomeStringDOSSpanishProvider },
+ { k1VeryCleverString, kKyra1, kPlatformDOS, kNoSpecial, ES_ESP, &k1VeryCleverStringDOSSpanishProvider },
+ { k1GUIStrings, kKyra1, kPlatformDOS, kNoSpecial, ES_ESP, &k1GUIStringsDOSSpanishProvider },
+ { k1NewGameString, kKyra1, kPlatformDOS, kNoSpecial, ES_ESP, &k1NewGameStringDOSSpanishProvider },
+ { k1ConfigStrings, kKyra1, kPlatformDOS, kNoSpecial, ES_ESP, &k1ConfigStringsDOSSpanishProvider },
+ { k1KallakWritingSeq, kKyra1, kPlatformDOS, kOldFloppy, UNK_LANG, &k1KallakWritingSeqDOSOldFloppyProvider },
+ { k1MalcolmTreeSeq, kKyra1, kPlatformDOS, kOldFloppy, UNK_LANG, &k1MalcolmTreeSeqDOSOldFloppyProvider },
+ { k1WestwoodLogoSeq, kKyra1, kPlatformDOS, kOldFloppy, UNK_LANG, &k1WestwoodLogoSeqDOSOldFloppyProvider },
+ { k1KyrandiaLogoSeq, kKyra1, kPlatformDOS, kOldFloppy, UNK_LANG, &k1KyrandiaLogoSeqDOSOldFloppyProvider },
+ { k1KallakMalcolmSeq, kKyra1, kPlatformDOS, kOldFloppy, UNK_LANG, &k1KallakMalcolmSeqDOSOldFloppyProvider },
+ { k1ForestSeq, kKyra1, kPlatformDOS, kOldFloppy, UNK_LANG, &k1ForestSeqDOSOldFloppyProvider },
+ { k1IntroCPSStrings, kKyra1, kPlatformDOS, kOldFloppy, UNK_LANG, &k1IntroCPSStringsDOSOldFloppyProvider },
+ { k1IntroCOLStrings, kKyra1, kPlatformDOS, kOldFloppy, UNK_LANG, &k1IntroCOLStringsDOSOldFloppyProvider },
+ { k1IntroWSAStrings, kKyra1, kPlatformDOS, kOldFloppy, UNK_LANG, &k1IntroWSAStringsDOSOldFloppyProvider },
+ { k1IntroStrings, kKyra1, kPlatformDOS, kOldFloppy, RU_RUS, &k1IntroStringsDOSOldFloppyRussianProvider },
+ { k1RoomList, kKyra1, kPlatformDOS, kOldFloppy, UNK_LANG, &k1RoomListDOSOldFloppyProvider },
+ { k1RoomFilenames, kKyra1, kPlatformDOS, kOldFloppy, UNK_LANG, &k1RoomFilenamesDOSOldFloppyProvider },
+ { k1CharacterImageFilenames, kKyra1, kPlatformDOS, kOldFloppy, UNK_LANG, &k1CharacterImageFilenamesDOSOldFloppyProvider },
+ { k1DefaultShapes, kKyra1, kPlatformDOS, kOldFloppy, UNK_LANG, &k1DefaultShapesDOSOldFloppyProvider },
+ { k1ItemNames, kKyra1, kPlatformDOS, kOldFloppy, RU_RUS, &k1ItemNamesDOSOldFloppyRussianProvider },
+ { k1TakenStrings, kKyra1, kPlatformDOS, kOldFloppy, RU_RUS, &k1TakenStringsDOSOldFloppyRussianProvider },
+ { k1PlacedStrings, kKyra1, kPlatformDOS, kOldFloppy, RU_RUS, &k1PlacedStringsDOSOldFloppyRussianProvider },
+ { k1DroppedStrings, kKyra1, kPlatformDOS, kOldFloppy, RU_RUS, &k1DroppedStringsDOSOldFloppyRussianProvider },
+ { k1AmuleteAnimSeq, kKyra1, kPlatformDOS, kOldFloppy, UNK_LANG, &k1AmuleteAnimSeqDOSOldFloppyProvider },
+ { k1SpecialPalette1, kKyra1, kPlatformDOS, kOldFloppy, UNK_LANG, &k1SpecialPalette1DOSOldFloppyProvider },
+ { k1SpecialPalette2, kKyra1, kPlatformDOS, kOldFloppy, UNK_LANG, &k1SpecialPalette2DOSOldFloppyProvider },
+ { k1SpecialPalette3, kKyra1, kPlatformDOS, kOldFloppy, UNK_LANG, &k1SpecialPalette3DOSOldFloppyProvider },
+ { k1SpecialPalette4, kKyra1, kPlatformDOS, kOldFloppy, UNK_LANG, &k1SpecialPalette4DOSOldFloppyProvider },
+ { k1SpecialPalette5, kKyra1, kPlatformDOS, kOldFloppy, UNK_LANG, &k1SpecialPalette5DOSOldFloppyProvider },
+ { k1SpecialPalette6, kKyra1, kPlatformDOS, kOldFloppy, UNK_LANG, &k1SpecialPalette6DOSOldFloppyProvider },
+ { k1SpecialPalette7, kKyra1, kPlatformDOS, kOldFloppy, UNK_LANG, &k1SpecialPalette7DOSOldFloppyProvider },
+ { k1SpecialPalette8, kKyra1, kPlatformDOS, kOldFloppy, UNK_LANG, &k1SpecialPalette8DOSOldFloppyProvider },
+ { k1SpecialPalette9, kKyra1, kPlatformDOS, kOldFloppy, UNK_LANG, &k1SpecialPalette9DOSOldFloppyProvider },
+ { k1SpecialPalette10, kKyra1, kPlatformDOS, kOldFloppy, UNK_LANG, &k1SpecialPalette10DOSOldFloppyProvider },
+ { k1SpecialPalette11, kKyra1, kPlatformDOS, kOldFloppy, UNK_LANG, &k1SpecialPalette11DOSOldFloppyProvider },
+ { k1SpecialPalette12, kKyra1, kPlatformDOS, kOldFloppy, UNK_LANG, &k1SpecialPalette12DOSOldFloppyProvider },
+ { k1SpecialPalette13, kKyra1, kPlatformDOS, kOldFloppy, UNK_LANG, &k1SpecialPalette13DOSOldFloppyProvider },
+ { k1SpecialPalette14, kKyra1, kPlatformDOS, kOldFloppy, UNK_LANG, &k1SpecialPalette14DOSOldFloppyProvider },
+ { k1SpecialPalette15, kKyra1, kPlatformDOS, kOldFloppy, UNK_LANG, &k1SpecialPalette15DOSOldFloppyProvider },
+ { k1SpecialPalette16, kKyra1, kPlatformDOS, kOldFloppy, UNK_LANG, &k1SpecialPalette16DOSOldFloppyProvider },
+ { k1SpecialPalette17, kKyra1, kPlatformDOS, kOldFloppy, UNK_LANG, &k1SpecialPalette17DOSOldFloppyProvider },
+ { k1SpecialPalette18, kKyra1, kPlatformDOS, kOldFloppy, UNK_LANG, &k1SpecialPalette18DOSOldFloppyProvider },
+ { k1SpecialPalette19, kKyra1, kPlatformDOS, kOldFloppy, UNK_LANG, &k1SpecialPalette19DOSOldFloppyProvider },
+ { k1SpecialPalette20, kKyra1, kPlatformDOS, kOldFloppy, UNK_LANG, &k1SpecialPalette20DOSOldFloppyProvider },
+ { k1SpecialPalette21, kKyra1, kPlatformDOS, kOldFloppy, UNK_LANG, &k1SpecialPalette21DOSOldFloppyProvider },
+ { k1SpecialPalette22, kKyra1, kPlatformDOS, kOldFloppy, UNK_LANG, &k1SpecialPalette22DOSOldFloppyProvider },
+ { k1SpecialPalette23, kKyra1, kPlatformDOS, kOldFloppy, UNK_LANG, &k1SpecialPalette23DOSOldFloppyProvider },
+ { k1SpecialPalette24, kKyra1, kPlatformDOS, kOldFloppy, UNK_LANG, &k1SpecialPalette24DOSOldFloppyProvider },
+ { k1SpecialPalette25, kKyra1, kPlatformDOS, kOldFloppy, UNK_LANG, &k1SpecialPalette25DOSOldFloppyProvider },
+ { k1SpecialPalette26, kKyra1, kPlatformDOS, kOldFloppy, UNK_LANG, &k1SpecialPalette26DOSOldFloppyProvider },
+ { k1SpecialPalette27, kKyra1, kPlatformDOS, kOldFloppy, UNK_LANG, &k1SpecialPalette27DOSOldFloppyProvider },
+ { k1SpecialPalette28, kKyra1, kPlatformDOS, kOldFloppy, UNK_LANG, &k1SpecialPalette28DOSOldFloppyProvider },
+ { k1SpecialPalette29, kKyra1, kPlatformDOS, kOldFloppy, UNK_LANG, &k1SpecialPalette29DOSOldFloppyProvider },
+ { k1SpecialPalette30, kKyra1, kPlatformDOS, kOldFloppy, UNK_LANG, &k1SpecialPalette30DOSOldFloppyProvider },
+ { k1SpecialPalette31, kKyra1, kPlatformDOS, kOldFloppy, UNK_LANG, &k1SpecialPalette31DOSOldFloppyProvider },
+ { k1SpecialPalette32, kKyra1, kPlatformDOS, kOldFloppy, UNK_LANG, &k1SpecialPalette32DOSOldFloppyProvider },
+ { k1PutDownString, kKyra1, kPlatformDOS, kOldFloppy, RU_RUS, &k1PutDownStringDOSOldFloppyRussianProvider },
+ { k1WaitAmuletString, kKyra1, kPlatformDOS, kOldFloppy, RU_RUS, &k1WaitAmuletStringDOSOldFloppyRussianProvider },
+ { k1BlackJewelString, kKyra1, kPlatformDOS, kOldFloppy, RU_RUS, &k1BlackJewelStringDOSOldFloppyRussianProvider },
+ { k1HealingTipString, kKyra1, kPlatformDOS, kOldFloppy, RU_RUS, &k1HealingTipStringDOSOldFloppyRussianProvider },
+ { k1PoisonGoneString, kKyra1, kPlatformDOS, kOldFloppy, RU_RUS, &k1PoisonGoneStringDOSOldFloppyRussianProvider },
+ { k1Healing1Shapes, kKyra1, kPlatformDOS, kOldFloppy, UNK_LANG, &k1Healing1ShapesDOSOldFloppyProvider },
+ { k1Healing2Shapes, kKyra1, kPlatformDOS, kOldFloppy, UNK_LANG, &k1Healing2ShapesDOSOldFloppyProvider },
+ { k1ThePoisonStrings, kKyra1, kPlatformDOS, kOldFloppy, RU_RUS, &k1ThePoisonStringsDOSOldFloppyRussianProvider },
+ { k1FluteStrings, kKyra1, kPlatformDOS, kOldFloppy, RU_RUS, &k1FluteStringsDOSOldFloppyRussianProvider },
+ { k1PoisonDeathShapes, kKyra1, kPlatformDOS, kOldFloppy, UNK_LANG, &k1PoisonDeathShapesDOSOldFloppyProvider },
+ { k1FluteShapes, kKyra1, kPlatformDOS, kOldFloppy, UNK_LANG, &k1FluteShapesDOSOldFloppyProvider },
+ { k1Winter1Shapes, kKyra1, kPlatformDOS, kOldFloppy, UNK_LANG, &k1Winter1ShapesDOSOldFloppyProvider },
+ { k1Winter2Shapes, kKyra1, kPlatformDOS, kOldFloppy, UNK_LANG, &k1Winter2ShapesDOSOldFloppyProvider },
+ { k1Winter3Shapes, kKyra1, kPlatformDOS, kOldFloppy, UNK_LANG, &k1Winter3ShapesDOSOldFloppyProvider },
+ { k1DrinkShapes, kKyra1, kPlatformDOS, kOldFloppy, UNK_LANG, &k1DrinkShapesDOSOldFloppyProvider },
+ { k1WispShapes, kKyra1, kPlatformDOS, kOldFloppy, UNK_LANG, &k1WispShapesDOSOldFloppyProvider },
+ { k1MagicAnimShapes, kKyra1, kPlatformDOS, kOldFloppy, UNK_LANG, &k1MagicAnimShapesDOSOldFloppyProvider },
+ { k1BranStoneShapes, kKyra1, kPlatformDOS, kOldFloppy, UNK_LANG, &k1BranStoneShapesDOSOldFloppyProvider },
+ { k1WispJewelStrings, kKyra1, kPlatformDOS, kOldFloppy, RU_RUS, &k1WispJewelStringsDOSOldFloppyRussianProvider },
+ { k1MagicJewelStrings, kKyra1, kPlatformDOS, kOldFloppy, RU_RUS, &k1MagicJewelStringsDOSOldFloppyRussianProvider },
+ { k1FlaskFullString, kKyra1, kPlatformDOS, kOldFloppy, RU_RUS, &k1FlaskFullStringDOSOldFloppyRussianProvider },
+ { k1FullFlaskString, kKyra1, kPlatformDOS, kOldFloppy, RU_RUS, &k1FullFlaskStringDOSOldFloppyRussianProvider },
+ { k1OutroReunionSeq, kKyra1, kPlatformDOS, kOldFloppy, UNK_LANG, &k1OutroReunionSeqDOSOldFloppyProvider },
+ { k1OutroHomeString, kKyra1, kPlatformDOS, kOldFloppy, RU_RUS, &k1OutroHomeStringDOSOldFloppyRussianProvider },
+ { k1VeryCleverString, kKyra1, kPlatformDOS, kOldFloppy, RU_RUS, &k1VeryCleverStringDOSOldFloppyRussianProvider },
+ { k1GUIStrings, kKyra1, kPlatformDOS, kOldFloppy, RU_RUS, &k1GUIStringsDOSOldFloppyRussianProvider },
+ { k1NewGameString, kKyra1, kPlatformDOS, kOldFloppy, RU_RUS, &k1NewGameStringDOSOldFloppyRussianProvider },
+ { k1ConfigStrings, kKyra1, kPlatformDOS, kOldFloppy, RU_RUS, &k1ConfigStringsDOSOldFloppyRussianProvider },
+ { k1AudioTracks, kKyra1, kPlatformDOS, kOldFloppy, UNK_LANG, &k1AudioTracksDOSOldFloppyProvider },
+ { k1AudioTracks2, kKyra1, kPlatformDOS, kOldFloppy, UNK_LANG, &k1AudioTracks2DOSOldFloppyProvider },
+ { k1AudioTracksIntro, kKyra1, kPlatformDOS, kOldFloppy, UNK_LANG, &k1AudioTracksIntroDOSOldFloppyProvider },
+ { k1KallakWritingSeq, kKyra1, kPlatformDOS, kTalkieVersion, UNK_LANG, &k1KallakWritingSeqDOSCDProvider },
+ { k1MalcolmTreeSeq, kKyra1, kPlatformDOS, kTalkieVersion, UNK_LANG, &k1MalcolmTreeSeqDOSCDProvider },
+ { k1WestwoodLogoSeq, kKyra1, kPlatformDOS, kTalkieVersion, UNK_LANG, &k1WestwoodLogoSeqDOSCDProvider },
+ { k1KyrandiaLogoSeq, kKyra1, kPlatformDOS, kTalkieVersion, UNK_LANG, &k1KyrandiaLogoSeqDOSCDProvider },
+ { k1KallakMalcolmSeq, kKyra1, kPlatformDOS, kTalkieVersion, UNK_LANG, &k1KallakMalcolmSeqDOSCDProvider },
+ { k1ForestSeq, kKyra1, kPlatformDOS, kTalkieVersion, UNK_LANG, &k1ForestSeqDOSCDProvider },
+ { k1IntroCPSStrings, kKyra1, kPlatformDOS, kTalkieVersion, UNK_LANG, &k1IntroCPSStringsDOSCDProvider },
+ { k1IntroCOLStrings, kKyra1, kPlatformDOS, kTalkieVersion, UNK_LANG, &k1IntroCOLStringsDOSCDProvider },
+ { k1IntroWSAStrings, kKyra1, kPlatformDOS, kTalkieVersion, UNK_LANG, &k1IntroWSAStringsDOSCDProvider },
+ { k1IntroStrings, kKyra1, kPlatformDOS, kTalkieVersion, EN_ANY, &k1IntroStringsDOSCDEnglishProvider },
+ { k1RoomList, kKyra1, kPlatformDOS, kTalkieVersion, UNK_LANG, &k1RoomListDOSCDProvider },
+ { k1RoomFilenames, kKyra1, kPlatformDOS, kTalkieVersion, UNK_LANG, &k1RoomFilenamesDOSCDProvider },
+ { k1CharacterImageFilenames, kKyra1, kPlatformDOS, kTalkieVersion, UNK_LANG, &k1CharacterImageFilenamesDOSCDProvider },
+ { k1DefaultShapes, kKyra1, kPlatformDOS, kTalkieVersion, UNK_LANG, &k1DefaultShapesDOSCDProvider },
+ { k1ItemNames, kKyra1, kPlatformDOS, kTalkieVersion, EN_ANY, &k1ItemNamesDOSCDEnglishProvider },
+ { k1TakenStrings, kKyra1, kPlatformDOS, kTalkieVersion, EN_ANY, &k1TakenStringsDOSCDEnglishProvider },
+ { k1PlacedStrings, kKyra1, kPlatformDOS, kTalkieVersion, EN_ANY, &k1PlacedStringsDOSCDEnglishProvider },
+ { k1DroppedStrings, kKyra1, kPlatformDOS, kTalkieVersion, EN_ANY, &k1DroppedStringsDOSCDEnglishProvider },
+ { k1NoDropStrings, kKyra1, kPlatformDOS, kTalkieVersion, EN_ANY, &k1NoDropStringsDOSCDEnglishProvider },
+ { k1AmuleteAnimSeq, kKyra1, kPlatformDOS, kTalkieVersion, UNK_LANG, &k1AmuleteAnimSeqDOSCDProvider },
+ { k1SpecialPalette1, kKyra1, kPlatformDOS, kTalkieVersion, UNK_LANG, &k1SpecialPalette1DOSCDProvider },
+ { k1SpecialPalette2, kKyra1, kPlatformDOS, kTalkieVersion, UNK_LANG, &k1SpecialPalette2DOSCDProvider },
+ { k1SpecialPalette3, kKyra1, kPlatformDOS, kTalkieVersion, UNK_LANG, &k1SpecialPalette3DOSCDProvider },
+ { k1SpecialPalette4, kKyra1, kPlatformDOS, kTalkieVersion, UNK_LANG, &k1SpecialPalette4DOSCDProvider },
+ { k1SpecialPalette5, kKyra1, kPlatformDOS, kTalkieVersion, UNK_LANG, &k1SpecialPalette5DOSCDProvider },
+ { k1SpecialPalette6, kKyra1, kPlatformDOS, kTalkieVersion, UNK_LANG, &k1SpecialPalette6DOSCDProvider },
+ { k1SpecialPalette7, kKyra1, kPlatformDOS, kTalkieVersion, UNK_LANG, &k1SpecialPalette7DOSCDProvider },
+ { k1SpecialPalette8, kKyra1, kPlatformDOS, kTalkieVersion, UNK_LANG, &k1SpecialPalette8DOSCDProvider },
+ { k1SpecialPalette9, kKyra1, kPlatformDOS, kTalkieVersion, UNK_LANG, &k1SpecialPalette9DOSCDProvider },
+ { k1SpecialPalette10, kKyra1, kPlatformDOS, kTalkieVersion, UNK_LANG, &k1SpecialPalette10DOSCDProvider },
+ { k1SpecialPalette11, kKyra1, kPlatformDOS, kTalkieVersion, UNK_LANG, &k1SpecialPalette11DOSCDProvider },
+ { k1SpecialPalette12, kKyra1, kPlatformDOS, kTalkieVersion, UNK_LANG, &k1SpecialPalette12DOSCDProvider },
+ { k1SpecialPalette13, kKyra1, kPlatformDOS, kTalkieVersion, UNK_LANG, &k1SpecialPalette13DOSCDProvider },
+ { k1SpecialPalette14, kKyra1, kPlatformDOS, kTalkieVersion, UNK_LANG, &k1SpecialPalette14DOSCDProvider },
+ { k1SpecialPalette15, kKyra1, kPlatformDOS, kTalkieVersion, UNK_LANG, &k1SpecialPalette15DOSCDProvider },
+ { k1SpecialPalette16, kKyra1, kPlatformDOS, kTalkieVersion, UNK_LANG, &k1SpecialPalette16DOSCDProvider },
+ { k1SpecialPalette17, kKyra1, kPlatformDOS, kTalkieVersion, UNK_LANG, &k1SpecialPalette17DOSCDProvider },
+ { k1SpecialPalette18, kKyra1, kPlatformDOS, kTalkieVersion, UNK_LANG, &k1SpecialPalette18DOSCDProvider },
+ { k1SpecialPalette19, kKyra1, kPlatformDOS, kTalkieVersion, UNK_LANG, &k1SpecialPalette19DOSCDProvider },
+ { k1SpecialPalette20, kKyra1, kPlatformDOS, kTalkieVersion, UNK_LANG, &k1SpecialPalette20DOSCDProvider },
+ { k1SpecialPalette21, kKyra1, kPlatformDOS, kTalkieVersion, UNK_LANG, &k1SpecialPalette21DOSCDProvider },
+ { k1SpecialPalette22, kKyra1, kPlatformDOS, kTalkieVersion, UNK_LANG, &k1SpecialPalette22DOSCDProvider },
+ { k1SpecialPalette23, kKyra1, kPlatformDOS, kTalkieVersion, UNK_LANG, &k1SpecialPalette23DOSCDProvider },
+ { k1SpecialPalette24, kKyra1, kPlatformDOS, kTalkieVersion, UNK_LANG, &k1SpecialPalette24DOSCDProvider },
+ { k1SpecialPalette25, kKyra1, kPlatformDOS, kTalkieVersion, UNK_LANG, &k1SpecialPalette25DOSCDProvider },
+ { k1SpecialPalette26, kKyra1, kPlatformDOS, kTalkieVersion, UNK_LANG, &k1SpecialPalette26DOSCDProvider },
+ { k1SpecialPalette27, kKyra1, kPlatformDOS, kTalkieVersion, UNK_LANG, &k1SpecialPalette27DOSCDProvider },
+ { k1SpecialPalette28, kKyra1, kPlatformDOS, kTalkieVersion, UNK_LANG, &k1SpecialPalette28DOSCDProvider },
+ { k1SpecialPalette29, kKyra1, kPlatformDOS, kTalkieVersion, UNK_LANG, &k1SpecialPalette29DOSCDProvider },
+ { k1SpecialPalette30, kKyra1, kPlatformDOS, kTalkieVersion, UNK_LANG, &k1SpecialPalette30DOSCDProvider },
+ { k1SpecialPalette31, kKyra1, kPlatformDOS, kTalkieVersion, UNK_LANG, &k1SpecialPalette31DOSCDProvider },
+ { k1SpecialPalette32, kKyra1, kPlatformDOS, kTalkieVersion, UNK_LANG, &k1SpecialPalette32DOSCDProvider },
+ { k1SpecialPalette33, kKyra1, kPlatformDOS, kTalkieVersion, UNK_LANG, &k1SpecialPalette33DOSCDProvider },
+ { k1PutDownString, kKyra1, kPlatformDOS, kTalkieVersion, EN_ANY, &k1PutDownStringDOSCDEnglishProvider },
+ { k1WaitAmuletString, kKyra1, kPlatformDOS, kTalkieVersion, EN_ANY, &k1WaitAmuletStringDOSCDEnglishProvider },
+ { k1BlackJewelString, kKyra1, kPlatformDOS, kTalkieVersion, EN_ANY, &k1BlackJewelStringDOSCDEnglishProvider },
+ { k1HealingTipString, kKyra1, kPlatformDOS, kTalkieVersion, EN_ANY, &k1HealingTipStringDOSCDEnglishProvider },
+ { k1PoisonGoneString, kKyra1, kPlatformDOS, kTalkieVersion, EN_ANY, &k1PoisonGoneStringDOSCDEnglishProvider },
+ { k1Healing1Shapes, kKyra1, kPlatformDOS, kTalkieVersion, UNK_LANG, &k1Healing1ShapesDOSCDProvider },
+ { k1Healing2Shapes, kKyra1, kPlatformDOS, kTalkieVersion, UNK_LANG, &k1Healing2ShapesDOSCDProvider },
+ { k1ThePoisonStrings, kKyra1, kPlatformDOS, kTalkieVersion, EN_ANY, &k1ThePoisonStringsDOSCDEnglishProvider },
+ { k1FluteStrings, kKyra1, kPlatformDOS, kTalkieVersion, EN_ANY, &k1FluteStringsDOSCDEnglishProvider },
+ { k1PoisonDeathShapes, kKyra1, kPlatformDOS, kTalkieVersion, UNK_LANG, &k1PoisonDeathShapesDOSCDProvider },
+ { k1FluteShapes, kKyra1, kPlatformDOS, kTalkieVersion, UNK_LANG, &k1FluteShapesDOSCDProvider },
+ { k1Winter1Shapes, kKyra1, kPlatformDOS, kTalkieVersion, UNK_LANG, &k1Winter1ShapesDOSCDProvider },
+ { k1Winter2Shapes, kKyra1, kPlatformDOS, kTalkieVersion, UNK_LANG, &k1Winter2ShapesDOSCDProvider },
+ { k1Winter3Shapes, kKyra1, kPlatformDOS, kTalkieVersion, UNK_LANG, &k1Winter3ShapesDOSCDProvider },
+ { k1DrinkShapes, kKyra1, kPlatformDOS, kTalkieVersion, UNK_LANG, &k1DrinkShapesDOSCDProvider },
+ { k1WispShapes, kKyra1, kPlatformDOS, kTalkieVersion, UNK_LANG, &k1WispShapesDOSCDProvider },
+ { k1MagicAnimShapes, kKyra1, kPlatformDOS, kTalkieVersion, UNK_LANG, &k1MagicAnimShapesDOSCDProvider },
+ { k1BranStoneShapes, kKyra1, kPlatformDOS, kTalkieVersion, UNK_LANG, &k1BranStoneShapesDOSCDProvider },
+ { k1WispJewelStrings, kKyra1, kPlatformDOS, kTalkieVersion, EN_ANY, &k1WispJewelStringsDOSCDEnglishProvider },
+ { k1MagicJewelStrings, kKyra1, kPlatformDOS, kTalkieVersion, EN_ANY, &k1MagicJewelStringsDOSCDEnglishProvider },
+ { k1FlaskFullString, kKyra1, kPlatformDOS, kTalkieVersion, EN_ANY, &k1FlaskFullStringDOSCDEnglishProvider },
+ { k1FullFlaskString, kKyra1, kPlatformDOS, kTalkieVersion, EN_ANY, &k1FullFlaskStringDOSCDEnglishProvider },
+ { k1OutroReunionSeq, kKyra1, kPlatformDOS, kTalkieVersion, UNK_LANG, &k1OutroReunionSeqDOSCDProvider },
+ { k1OutroHomeString, kKyra1, kPlatformDOS, kTalkieVersion, EN_ANY, &k1OutroHomeStringDOSCDEnglishProvider },
+ { k1VeryCleverString, kKyra1, kPlatformDOS, kTalkieVersion, EN_ANY, &k1VeryCleverStringDOSCDEnglishProvider },
+ { k1GUIStrings, kKyra1, kPlatformDOS, kTalkieVersion, EN_ANY, &k1GUIStringsDOSCDEnglishProvider },
+ { k1NewGameString, kKyra1, kPlatformDOS, kTalkieVersion, EN_ANY, &k1NewGameStringDOSCDEnglishProvider },
+ { k1ConfigStrings, kKyra1, kPlatformDOS, kTalkieVersion, EN_ANY, &k1ConfigStringsDOSCDEnglishProvider },
+ { k1AudioTracks, kKyra1, kPlatformDOS, kTalkieVersion, UNK_LANG, &k1AudioTracksDOSCDProvider },
+ { k1AudioTracks2, kKyra1, kPlatformDOS, kTalkieVersion, UNK_LANG, &k1AudioTracks2DOSCDProvider },
+ { k1AudioTracksIntro, kKyra1, kPlatformDOS, kTalkieVersion, UNK_LANG, &k1AudioTracksIntroDOSCDProvider },
+ { k1IntroStrings, kKyra1, kPlatformDOS, kTalkieVersion, DE_DEU, &k1IntroStringsDOSCDGermanProvider },
+ { k1ItemNames, kKyra1, kPlatformDOS, kTalkieVersion, DE_DEU, &k1ItemNamesDOSCDGermanProvider },
+ { k1TakenStrings, kKyra1, kPlatformDOS, kTalkieVersion, DE_DEU, &k1TakenStringsDOSCDGermanProvider },
+ { k1PlacedStrings, kKyra1, kPlatformDOS, kTalkieVersion, DE_DEU, &k1PlacedStringsDOSCDGermanProvider },
+ { k1DroppedStrings, kKyra1, kPlatformDOS, kTalkieVersion, DE_DEU, &k1DroppedStringsDOSCDGermanProvider },
+ { k1NoDropStrings, kKyra1, kPlatformDOS, kTalkieVersion, DE_DEU, &k1NoDropStringsDOSCDGermanProvider },
+ { k1PutDownString, kKyra1, kPlatformDOS, kTalkieVersion, DE_DEU, &k1PutDownStringDOSCDGermanProvider },
+ { k1WaitAmuletString, kKyra1, kPlatformDOS, kTalkieVersion, DE_DEU, &k1WaitAmuletStringDOSCDGermanProvider },
+ { k1BlackJewelString, kKyra1, kPlatformDOS, kTalkieVersion, DE_DEU, &k1BlackJewelStringDOSCDGermanProvider },
+ { k1HealingTipString, kKyra1, kPlatformDOS, kTalkieVersion, DE_DEU, &k1HealingTipStringDOSCDGermanProvider },
+ { k1PoisonGoneString, kKyra1, kPlatformDOS, kTalkieVersion, DE_DEU, &k1PoisonGoneStringDOSCDGermanProvider },
+ { k1ThePoisonStrings, kKyra1, kPlatformDOS, kTalkieVersion, DE_DEU, &k1ThePoisonStringsDOSCDGermanProvider },
+ { k1FluteStrings, kKyra1, kPlatformDOS, kTalkieVersion, DE_DEU, &k1FluteStringsDOSCDGermanProvider },
+ { k1WispJewelStrings, kKyra1, kPlatformDOS, kTalkieVersion, DE_DEU, &k1WispJewelStringsDOSCDGermanProvider },
+ { k1MagicJewelStrings, kKyra1, kPlatformDOS, kTalkieVersion, DE_DEU, &k1MagicJewelStringsDOSCDGermanProvider },
+ { k1FlaskFullString, kKyra1, kPlatformDOS, kTalkieVersion, DE_DEU, &k1FlaskFullStringDOSCDGermanProvider },
+ { k1FullFlaskString, kKyra1, kPlatformDOS, kTalkieVersion, DE_DEU, &k1FullFlaskStringDOSCDGermanProvider },
+ { k1OutroHomeString, kKyra1, kPlatformDOS, kTalkieVersion, DE_DEU, &k1OutroHomeStringDOSCDGermanProvider },
+ { k1VeryCleverString, kKyra1, kPlatformDOS, kTalkieVersion, DE_DEU, &k1VeryCleverStringDOSCDGermanProvider },
+ { k1GUIStrings, kKyra1, kPlatformDOS, kTalkieVersion, DE_DEU, &k1GUIStringsDOSCDGermanProvider },
+ { k1NewGameString, kKyra1, kPlatformDOS, kTalkieVersion, DE_DEU, &k1NewGameStringDOSCDGermanProvider },
+ { k1ConfigStrings, kKyra1, kPlatformDOS, kTalkieVersion, DE_DEU, &k1ConfigStringsDOSCDGermanProvider },
+ { k1IntroStrings, kKyra1, kPlatformDOS, kTalkieVersion, FR_FRA, &k1IntroStringsDOSCDFrenchProvider },
+ { k1ItemNames, kKyra1, kPlatformDOS, kTalkieVersion, FR_FRA, &k1ItemNamesDOSCDFrenchProvider },
+ { k1TakenStrings, kKyra1, kPlatformDOS, kTalkieVersion, FR_FRA, &k1TakenStringsDOSCDFrenchProvider },
+ { k1PlacedStrings, kKyra1, kPlatformDOS, kTalkieVersion, FR_FRA, &k1PlacedStringsDOSCDFrenchProvider },
+ { k1DroppedStrings, kKyra1, kPlatformDOS, kTalkieVersion, FR_FRA, &k1DroppedStringsDOSCDFrenchProvider },
+ { k1NoDropStrings, kKyra1, kPlatformDOS, kTalkieVersion, FR_FRA, &k1NoDropStringsDOSCDFrenchProvider },
+ { k1PutDownString, kKyra1, kPlatformDOS, kTalkieVersion, FR_FRA, &k1PutDownStringDOSCDFrenchProvider },
+ { k1WaitAmuletString, kKyra1, kPlatformDOS, kTalkieVersion, FR_FRA, &k1WaitAmuletStringDOSCDFrenchProvider },
+ { k1BlackJewelString, kKyra1, kPlatformDOS, kTalkieVersion, FR_FRA, &k1BlackJewelStringDOSCDFrenchProvider },
+ { k1HealingTipString, kKyra1, kPlatformDOS, kTalkieVersion, FR_FRA, &k1HealingTipStringDOSCDFrenchProvider },
+ { k1PoisonGoneString, kKyra1, kPlatformDOS, kTalkieVersion, FR_FRA, &k1PoisonGoneStringDOSCDFrenchProvider },
+ { k1ThePoisonStrings, kKyra1, kPlatformDOS, kTalkieVersion, FR_FRA, &k1ThePoisonStringsDOSCDFrenchProvider },
+ { k1FluteStrings, kKyra1, kPlatformDOS, kTalkieVersion, FR_FRA, &k1FluteStringsDOSCDFrenchProvider },
+ { k1WispJewelStrings, kKyra1, kPlatformDOS, kTalkieVersion, FR_FRA, &k1WispJewelStringsDOSCDFrenchProvider },
+ { k1MagicJewelStrings, kKyra1, kPlatformDOS, kTalkieVersion, FR_FRA, &k1MagicJewelStringsDOSCDFrenchProvider },
+ { k1FlaskFullString, kKyra1, kPlatformDOS, kTalkieVersion, FR_FRA, &k1FlaskFullStringDOSCDFrenchProvider },
+ { k1FullFlaskString, kKyra1, kPlatformDOS, kTalkieVersion, FR_FRA, &k1FullFlaskStringDOSCDFrenchProvider },
+ { k1OutroHomeString, kKyra1, kPlatformDOS, kTalkieVersion, FR_FRA, &k1OutroHomeStringDOSCDFrenchProvider },
+ { k1VeryCleverString, kKyra1, kPlatformDOS, kTalkieVersion, FR_FRA, &k1VeryCleverStringDOSCDFrenchProvider },
+ { k1GUIStrings, kKyra1, kPlatformDOS, kTalkieVersion, FR_FRA, &k1GUIStringsDOSCDFrenchProvider },
+ { k1NewGameString, kKyra1, kPlatformDOS, kTalkieVersion, FR_FRA, &k1NewGameStringDOSCDFrenchProvider },
+ { k1ConfigStrings, kKyra1, kPlatformDOS, kTalkieVersion, FR_FRA, &k1ConfigStringsDOSCDFrenchProvider },
+ { k1IntroStrings, kKyra1, kPlatformDOS, kTalkieVersion, IT_ITA, &k1IntroStringsDOSCDItalianProvider },
+ { k1ItemNames, kKyra1, kPlatformDOS, kTalkieVersion, IT_ITA, &k1ItemNamesDOSCDItalianProvider },
+ { k1TakenStrings, kKyra1, kPlatformDOS, kTalkieVersion, IT_ITA, &k1TakenStringsDOSCDItalianProvider },
+ { k1PlacedStrings, kKyra1, kPlatformDOS, kTalkieVersion, IT_ITA, &k1PlacedStringsDOSCDItalianProvider },
+ { k1DroppedStrings, kKyra1, kPlatformDOS, kTalkieVersion, IT_ITA, &k1DroppedStringsDOSCDItalianProvider },
+ { k1NoDropStrings, kKyra1, kPlatformDOS, kTalkieVersion, IT_ITA, &k1NoDropStringsDOSCDItalianProvider },
+ { k1PutDownString, kKyra1, kPlatformDOS, kTalkieVersion, IT_ITA, &k1PutDownStringDOSCDItalianProvider },
+ { k1WaitAmuletString, kKyra1, kPlatformDOS, kTalkieVersion, IT_ITA, &k1WaitAmuletStringDOSCDItalianProvider },
+ { k1BlackJewelString, kKyra1, kPlatformDOS, kTalkieVersion, IT_ITA, &k1BlackJewelStringDOSCDItalianProvider },
+ { k1HealingTipString, kKyra1, kPlatformDOS, kTalkieVersion, IT_ITA, &k1HealingTipStringDOSCDItalianProvider },
+ { k1PoisonGoneString, kKyra1, kPlatformDOS, kTalkieVersion, IT_ITA, &k1PoisonGoneStringDOSCDItalianProvider },
+ { k1ThePoisonStrings, kKyra1, kPlatformDOS, kTalkieVersion, IT_ITA, &k1ThePoisonStringsDOSCDItalianProvider },
+ { k1FluteStrings, kKyra1, kPlatformDOS, kTalkieVersion, IT_ITA, &k1FluteStringsDOSCDItalianProvider },
+ { k1WispJewelStrings, kKyra1, kPlatformDOS, kTalkieVersion, IT_ITA, &k1WispJewelStringsDOSCDItalianProvider },
+ { k1MagicJewelStrings, kKyra1, kPlatformDOS, kTalkieVersion, IT_ITA, &k1MagicJewelStringsDOSCDItalianProvider },
+ { k1FlaskFullString, kKyra1, kPlatformDOS, kTalkieVersion, IT_ITA, &k1FlaskFullStringDOSCDItalianProvider },
+ { k1FullFlaskString, kKyra1, kPlatformDOS, kTalkieVersion, IT_ITA, &k1FullFlaskStringDOSCDItalianProvider },
+ { k1OutroHomeString, kKyra1, kPlatformDOS, kTalkieVersion, IT_ITA, &k1OutroHomeStringDOSCDItalianProvider },
+ { k1VeryCleverString, kKyra1, kPlatformDOS, kTalkieVersion, IT_ITA, &k1VeryCleverStringDOSCDItalianProvider },
+ { k1GUIStrings, kKyra1, kPlatformDOS, kTalkieVersion, IT_ITA, &k1GUIStringsDOSCDItalianProvider },
+ { k1NewGameString, kKyra1, kPlatformDOS, kTalkieVersion, IT_ITA, &k1NewGameStringDOSCDItalianProvider },
+ { k1ConfigStrings, kKyra1, kPlatformDOS, kTalkieVersion, IT_ITA, &k1ConfigStringsDOSCDItalianProvider },
+ { k1KallakWritingSeq, kKyra1, kPlatformFMTowns, kNoSpecial, UNK_LANG, &k1KallakWritingSeqFMTownsProvider },
+ { k1MalcolmTreeSeq, kKyra1, kPlatformFMTowns, kNoSpecial, UNK_LANG, &k1MalcolmTreeSeqFMTownsProvider },
+ { k1WestwoodLogoSeq, kKyra1, kPlatformFMTowns, kNoSpecial, UNK_LANG, &k1WestwoodLogoSeqFMTownsProvider },
+ { k1KyrandiaLogoSeq, kKyra1, kPlatformFMTowns, kNoSpecial, UNK_LANG, &k1KyrandiaLogoSeqFMTownsProvider },
+ { k1KallakMalcolmSeq, kKyra1, kPlatformFMTowns, kNoSpecial, UNK_LANG, &k1KallakMalcolmSeqFMTownsProvider },
+ { k1ForestSeq, kKyra1, kPlatformFMTowns, kNoSpecial, UNK_LANG, &k1ForestSeqFMTownsProvider },
+ { k1IntroCPSStrings, kKyra1, kPlatformFMTowns, kNoSpecial, UNK_LANG, &k1IntroCPSStringsFMTownsProvider },
+ { k1IntroCOLStrings, kKyra1, kPlatformFMTowns, kNoSpecial, UNK_LANG, &k1IntroCOLStringsFMTownsProvider },
+ { k1IntroWSAStrings, kKyra1, kPlatformFMTowns, kNoSpecial, UNK_LANG, &k1IntroWSAStringsFMTownsProvider },
+ { k1IntroStrings, kKyra1, kPlatformFMTowns, kNoSpecial, EN_ANY, &k1IntroStringsFMTownsEnglishProvider },
+ { k1RoomList, kKyra1, kPlatformFMTowns, kNoSpecial, UNK_LANG, &k1RoomListFMTownsProvider },
+ { k1RoomFilenames, kKyra1, kPlatformFMTowns, kNoSpecial, UNK_LANG, &k1RoomFilenamesFMTownsProvider },
+ { k1CharacterImageFilenames, kKyra1, kPlatformFMTowns, kNoSpecial, UNK_LANG, &k1CharacterImageFilenamesFMTownsProvider },
+ { k1DefaultShapes, kKyra1, kPlatformFMTowns, kNoSpecial, UNK_LANG, &k1DefaultShapesFMTownsProvider },
+ { k1ItemNames, kKyra1, kPlatformFMTowns, kNoSpecial, EN_ANY, &k1ItemNamesFMTownsEnglishProvider },
+ { k1TakenStrings, kKyra1, kPlatformFMTowns, kNoSpecial, EN_ANY, &k1TakenStringsFMTownsEnglishProvider },
+ { k1PlacedStrings, kKyra1, kPlatformFMTowns, kNoSpecial, EN_ANY, &k1PlacedStringsFMTownsEnglishProvider },
+ { k1DroppedStrings, kKyra1, kPlatformFMTowns, kNoSpecial, EN_ANY, &k1DroppedStringsFMTownsEnglishProvider },
+ { k1NoDropStrings, kKyra1, kPlatformFMTowns, kNoSpecial, EN_ANY, &k1NoDropStringsFMTownsEnglishProvider },
+ { k1AmuleteAnimSeq, kKyra1, kPlatformFMTowns, kNoSpecial, UNK_LANG, &k1AmuleteAnimSeqFMTownsProvider },
+ { k1SpecialPalette1, kKyra1, kPlatformFMTowns, kNoSpecial, UNK_LANG, &k1SpecialPalette1FMTownsProvider },
+ { k1SpecialPalette2, kKyra1, kPlatformFMTowns, kNoSpecial, UNK_LANG, &k1SpecialPalette2FMTownsProvider },
+ { k1SpecialPalette3, kKyra1, kPlatformFMTowns, kNoSpecial, UNK_LANG, &k1SpecialPalette3FMTownsProvider },
+ { k1SpecialPalette4, kKyra1, kPlatformFMTowns, kNoSpecial, UNK_LANG, &k1SpecialPalette4FMTownsProvider },
+ { k1SpecialPalette5, kKyra1, kPlatformFMTowns, kNoSpecial, UNK_LANG, &k1SpecialPalette5FMTownsProvider },
+ { k1SpecialPalette6, kKyra1, kPlatformFMTowns, kNoSpecial, UNK_LANG, &k1SpecialPalette6FMTownsProvider },
+ { k1SpecialPalette7, kKyra1, kPlatformFMTowns, kNoSpecial, UNK_LANG, &k1SpecialPalette7FMTownsProvider },
+ { k1SpecialPalette8, kKyra1, kPlatformFMTowns, kNoSpecial, UNK_LANG, &k1SpecialPalette8FMTownsProvider },
+ { k1SpecialPalette9, kKyra1, kPlatformFMTowns, kNoSpecial, UNK_LANG, &k1SpecialPalette9FMTownsProvider },
+ { k1SpecialPalette10, kKyra1, kPlatformFMTowns, kNoSpecial, UNK_LANG, &k1SpecialPalette10FMTownsProvider },
+ { k1SpecialPalette11, kKyra1, kPlatformFMTowns, kNoSpecial, UNK_LANG, &k1SpecialPalette11FMTownsProvider },
+ { k1SpecialPalette12, kKyra1, kPlatformFMTowns, kNoSpecial, UNK_LANG, &k1SpecialPalette12FMTownsProvider },
+ { k1SpecialPalette13, kKyra1, kPlatformFMTowns, kNoSpecial, UNK_LANG, &k1SpecialPalette13FMTownsProvider },
+ { k1SpecialPalette14, kKyra1, kPlatformFMTowns, kNoSpecial, UNK_LANG, &k1SpecialPalette14FMTownsProvider },
+ { k1SpecialPalette15, kKyra1, kPlatformFMTowns, kNoSpecial, UNK_LANG, &k1SpecialPalette15FMTownsProvider },
+ { k1SpecialPalette16, kKyra1, kPlatformFMTowns, kNoSpecial, UNK_LANG, &k1SpecialPalette16FMTownsProvider },
+ { k1SpecialPalette17, kKyra1, kPlatformFMTowns, kNoSpecial, UNK_LANG, &k1SpecialPalette17FMTownsProvider },
+ { k1SpecialPalette18, kKyra1, kPlatformFMTowns, kNoSpecial, UNK_LANG, &k1SpecialPalette18FMTownsProvider },
+ { k1SpecialPalette19, kKyra1, kPlatformFMTowns, kNoSpecial, UNK_LANG, &k1SpecialPalette19FMTownsProvider },
+ { k1SpecialPalette20, kKyra1, kPlatformFMTowns, kNoSpecial, UNK_LANG, &k1SpecialPalette20FMTownsProvider },
+ { k1SpecialPalette21, kKyra1, kPlatformFMTowns, kNoSpecial, UNK_LANG, &k1SpecialPalette21FMTownsProvider },
+ { k1SpecialPalette22, kKyra1, kPlatformFMTowns, kNoSpecial, UNK_LANG, &k1SpecialPalette22FMTownsProvider },
+ { k1SpecialPalette23, kKyra1, kPlatformFMTowns, kNoSpecial, UNK_LANG, &k1SpecialPalette23FMTownsProvider },
+ { k1SpecialPalette24, kKyra1, kPlatformFMTowns, kNoSpecial, UNK_LANG, &k1SpecialPalette24FMTownsProvider },
+ { k1SpecialPalette25, kKyra1, kPlatformFMTowns, kNoSpecial, UNK_LANG, &k1SpecialPalette25FMTownsProvider },
+ { k1SpecialPalette26, kKyra1, kPlatformFMTowns, kNoSpecial, UNK_LANG, &k1SpecialPalette26FMTownsProvider },
+ { k1SpecialPalette27, kKyra1, kPlatformFMTowns, kNoSpecial, UNK_LANG, &k1SpecialPalette27FMTownsProvider },
+ { k1SpecialPalette28, kKyra1, kPlatformFMTowns, kNoSpecial, UNK_LANG, &k1SpecialPalette28FMTownsProvider },
+ { k1SpecialPalette29, kKyra1, kPlatformFMTowns, kNoSpecial, UNK_LANG, &k1SpecialPalette29FMTownsProvider },
+ { k1SpecialPalette30, kKyra1, kPlatformFMTowns, kNoSpecial, UNK_LANG, &k1SpecialPalette30FMTownsProvider },
+ { k1SpecialPalette31, kKyra1, kPlatformFMTowns, kNoSpecial, UNK_LANG, &k1SpecialPalette31FMTownsProvider },
+ { k1SpecialPalette32, kKyra1, kPlatformFMTowns, kNoSpecial, UNK_LANG, &k1SpecialPalette32FMTownsProvider },
+ { k1SpecialPalette33, kKyra1, kPlatformFMTowns, kNoSpecial, UNK_LANG, &k1SpecialPalette33FMTownsProvider },
+ { k1PutDownString, kKyra1, kPlatformFMTowns, kNoSpecial, EN_ANY, &k1PutDownStringFMTownsEnglishProvider },
+ { k1WaitAmuletString, kKyra1, kPlatformFMTowns, kNoSpecial, EN_ANY, &k1WaitAmuletStringFMTownsEnglishProvider },
+ { k1BlackJewelString, kKyra1, kPlatformFMTowns, kNoSpecial, EN_ANY, &k1BlackJewelStringFMTownsEnglishProvider },
+ { k1HealingTipString, kKyra1, kPlatformFMTowns, kNoSpecial, EN_ANY, &k1HealingTipStringFMTownsEnglishProvider },
+ { k1PoisonGoneString, kKyra1, kPlatformFMTowns, kNoSpecial, EN_ANY, &k1PoisonGoneStringFMTownsEnglishProvider },
+ { k1Healing1Shapes, kKyra1, kPlatformFMTowns, kNoSpecial, UNK_LANG, &k1Healing1ShapesFMTownsProvider },
+ { k1Healing2Shapes, kKyra1, kPlatformFMTowns, kNoSpecial, UNK_LANG, &k1Healing2ShapesFMTownsProvider },
+ { k1ThePoisonStrings, kKyra1, kPlatformFMTowns, kNoSpecial, EN_ANY, &k1ThePoisonStringsFMTownsEnglishProvider },
+ { k1FluteStrings, kKyra1, kPlatformFMTowns, kNoSpecial, EN_ANY, &k1FluteStringsFMTownsEnglishProvider },
+ { k1PoisonDeathShapes, kKyra1, kPlatformFMTowns, kNoSpecial, UNK_LANG, &k1PoisonDeathShapesFMTownsProvider },
+ { k1FluteShapes, kKyra1, kPlatformFMTowns, kNoSpecial, UNK_LANG, &k1FluteShapesFMTownsProvider },
+ { k1Winter1Shapes, kKyra1, kPlatformFMTowns, kNoSpecial, UNK_LANG, &k1Winter1ShapesFMTownsProvider },
+ { k1Winter2Shapes, kKyra1, kPlatformFMTowns, kNoSpecial, UNK_LANG, &k1Winter2ShapesFMTownsProvider },
+ { k1Winter3Shapes, kKyra1, kPlatformFMTowns, kNoSpecial, UNK_LANG, &k1Winter3ShapesFMTownsProvider },
+ { k1DrinkShapes, kKyra1, kPlatformFMTowns, kNoSpecial, UNK_LANG, &k1DrinkShapesFMTownsProvider },
+ { k1WispShapes, kKyra1, kPlatformFMTowns, kNoSpecial, UNK_LANG, &k1WispShapesFMTownsProvider },
+ { k1MagicAnimShapes, kKyra1, kPlatformFMTowns, kNoSpecial, UNK_LANG, &k1MagicAnimShapesFMTownsProvider },
+ { k1BranStoneShapes, kKyra1, kPlatformFMTowns, kNoSpecial, UNK_LANG, &k1BranStoneShapesFMTownsProvider },
+ { k1WispJewelStrings, kKyra1, kPlatformFMTowns, kNoSpecial, EN_ANY, &k1WispJewelStringsFMTownsEnglishProvider },
+ { k1MagicJewelStrings, kKyra1, kPlatformFMTowns, kNoSpecial, EN_ANY, &k1MagicJewelStringsFMTownsEnglishProvider },
+ { k1FlaskFullString, kKyra1, kPlatformFMTowns, kNoSpecial, EN_ANY, &k1FlaskFullStringFMTownsEnglishProvider },
+ { k1FullFlaskString, kKyra1, kPlatformFMTowns, kNoSpecial, EN_ANY, &k1FullFlaskStringFMTownsEnglishProvider },
+ { k1OutroReunionSeq, kKyra1, kPlatformFMTowns, kNoSpecial, UNK_LANG, &k1OutroReunionSeqFMTownsProvider },
+ { k1OutroHomeString, kKyra1, kPlatformFMTowns, kNoSpecial, EN_ANY, &k1OutroHomeStringFMTownsEnglishProvider },
+ { k1VeryCleverString, kKyra1, kPlatformFMTowns, kNoSpecial, EN_ANY, &k1VeryCleverStringFMTownsEnglishProvider },
+ { k1GUIStrings, kKyra1, kPlatformFMTowns, kNoSpecial, EN_ANY, &k1GUIStringsFMTownsEnglishProvider },
+ { k1NewGameString, kKyra1, kPlatformFMTowns, kNoSpecial, EN_ANY, &k1NewGameStringFMTownsEnglishProvider },
+ { k1ConfigStrings, kKyra1, kPlatformFMTowns, kNoSpecial, EN_ANY, &k1ConfigStringsFMTownsEnglishProvider },
+ { k1TownsMusicFadeTable, kKyra1, kPlatformFMTowns, kNoSpecial, UNK_LANG, &k1TownsMusicFadeTableFMTownsProvider },
+ { k1TownsSFXwdTable, kKyra1, kPlatformFMTowns, kNoSpecial, UNK_LANG, &k1TownsSFXwdTableFMTownsProvider },
+ { k1TownsSFXbtTable, kKyra1, kPlatformFMTowns, kNoSpecial, UNK_LANG, &k1TownsSFXbtTableFMTownsProvider },
+ { k1TownsCDATable, kKyra1, kPlatformFMTowns, kNoSpecial, UNK_LANG, &k1TownsCDATableFMTownsProvider },
+ { k1AudioTracks, kKyra1, kPlatformFMTowns, kNoSpecial, UNK_LANG, &k1AudioTracksFMTownsProvider },
+ { k1CreditsStrings, kKyra1, kPlatformFMTowns, kNoSpecial, EN_ANY, &k1CreditsStringsFMTownsEnglishProvider },
+ { k1IntroStrings, kKyra1, kPlatformFMTowns, kNoSpecial, JA_JPN, &k1IntroStringsFMTownsJapaneseProvider },
+ { k1ItemNames, kKyra1, kPlatformFMTowns, kNoSpecial, JA_JPN, &k1ItemNamesFMTownsJapaneseProvider },
+ { k1TakenStrings, kKyra1, kPlatformFMTowns, kNoSpecial, JA_JPN, &k1TakenStringsFMTownsJapaneseProvider },
+ { k1PlacedStrings, kKyra1, kPlatformFMTowns, kNoSpecial, JA_JPN, &k1PlacedStringsFMTownsJapaneseProvider },
+ { k1DroppedStrings, kKyra1, kPlatformFMTowns, kNoSpecial, JA_JPN, &k1DroppedStringsFMTownsJapaneseProvider },
+ { k1NoDropStrings, kKyra1, kPlatformFMTowns, kNoSpecial, JA_JPN, &k1NoDropStringsFMTownsJapaneseProvider },
+ { k1PutDownString, kKyra1, kPlatformFMTowns, kNoSpecial, JA_JPN, &k1PutDownStringFMTownsJapaneseProvider },
+ { k1WaitAmuletString, kKyra1, kPlatformFMTowns, kNoSpecial, JA_JPN, &k1WaitAmuletStringFMTownsJapaneseProvider },
+ { k1BlackJewelString, kKyra1, kPlatformFMTowns, kNoSpecial, JA_JPN, &k1BlackJewelStringFMTownsJapaneseProvider },
+ { k1HealingTipString, kKyra1, kPlatformFMTowns, kNoSpecial, JA_JPN, &k1HealingTipStringFMTownsJapaneseProvider },
+ { k1PoisonGoneString, kKyra1, kPlatformFMTowns, kNoSpecial, JA_JPN, &k1PoisonGoneStringFMTownsJapaneseProvider },
+ { k1ThePoisonStrings, kKyra1, kPlatformFMTowns, kNoSpecial, JA_JPN, &k1ThePoisonStringsFMTownsJapaneseProvider },
+ { k1FluteStrings, kKyra1, kPlatformFMTowns, kNoSpecial, JA_JPN, &k1FluteStringsFMTownsJapaneseProvider },
+ { k1WispJewelStrings, kKyra1, kPlatformFMTowns, kNoSpecial, JA_JPN, &k1WispJewelStringsFMTownsJapaneseProvider },
+ { k1MagicJewelStrings, kKyra1, kPlatformFMTowns, kNoSpecial, JA_JPN, &k1MagicJewelStringsFMTownsJapaneseProvider },
+ { k1FlaskFullString, kKyra1, kPlatformFMTowns, kNoSpecial, JA_JPN, &k1FlaskFullStringFMTownsJapaneseProvider },
+ { k1FullFlaskString, kKyra1, kPlatformFMTowns, kNoSpecial, JA_JPN, &k1FullFlaskStringFMTownsJapaneseProvider },
+ { k1OutroHomeString, kKyra1, kPlatformFMTowns, kNoSpecial, JA_JPN, &k1OutroHomeStringFMTownsJapaneseProvider },
+ { k1VeryCleverString, kKyra1, kPlatformFMTowns, kNoSpecial, JA_JPN, &k1VeryCleverStringFMTownsJapaneseProvider },
+ { k1GUIStrings, kKyra1, kPlatformFMTowns, kNoSpecial, JA_JPN, &k1GUIStringsFMTownsJapaneseProvider },
+ { k1NewGameString, kKyra1, kPlatformFMTowns, kNoSpecial, JA_JPN, &k1NewGameStringFMTownsJapaneseProvider },
+ { k1ConfigStrings, kKyra1, kPlatformFMTowns, kNoSpecial, JA_JPN, &k1ConfigStringsFMTownsJapaneseProvider },
+ { k1CreditsStrings, kKyra1, kPlatformFMTowns, kNoSpecial, JA_JPN, &k1CreditsStringsFMTownsJapaneseProvider },
+ { k1KallakWritingSeq, kKyra1, kPlatformPC98, kNoSpecial, UNK_LANG, &k1KallakWritingSeqPC98Provider },
+ { k1MalcolmTreeSeq, kKyra1, kPlatformPC98, kNoSpecial, UNK_LANG, &k1MalcolmTreeSeqPC98Provider },
+ { k1WestwoodLogoSeq, kKyra1, kPlatformPC98, kNoSpecial, UNK_LANG, &k1WestwoodLogoSeqPC98Provider },
+ { k1KyrandiaLogoSeq, kKyra1, kPlatformPC98, kNoSpecial, UNK_LANG, &k1KyrandiaLogoSeqPC98Provider },
+ { k1KallakMalcolmSeq, kKyra1, kPlatformPC98, kNoSpecial, UNK_LANG, &k1KallakMalcolmSeqPC98Provider },
+ { k1ForestSeq, kKyra1, kPlatformPC98, kNoSpecial, UNK_LANG, &k1ForestSeqPC98Provider },
+ { k1IntroCPSStrings, kKyra1, kPlatformPC98, kNoSpecial, UNK_LANG, &k1IntroCPSStringsPC98Provider },
+ { k1IntroCOLStrings, kKyra1, kPlatformPC98, kNoSpecial, UNK_LANG, &k1IntroCOLStringsPC98Provider },
+ { k1IntroWSAStrings, kKyra1, kPlatformPC98, kNoSpecial, UNK_LANG, &k1IntroWSAStringsPC98Provider },
+ { k1IntroStrings, kKyra1, kPlatformPC98, kNoSpecial, JA_JPN, &k1IntroStringsPC98JapaneseProvider },
+ { k1RoomList, kKyra1, kPlatformPC98, kNoSpecial, UNK_LANG, &k1RoomListPC98Provider },
+ { k1RoomFilenames, kKyra1, kPlatformPC98, kNoSpecial, UNK_LANG, &k1RoomFilenamesPC98Provider },
+ { k1CharacterImageFilenames, kKyra1, kPlatformPC98, kNoSpecial, UNK_LANG, &k1CharacterImageFilenamesPC98Provider },
+ { k1DefaultShapes, kKyra1, kPlatformPC98, kNoSpecial, UNK_LANG, &k1DefaultShapesPC98Provider },
+ { k1ItemNames, kKyra1, kPlatformPC98, kNoSpecial, JA_JPN, &k1ItemNamesPC98JapaneseProvider },
+ { k1TakenStrings, kKyra1, kPlatformPC98, kNoSpecial, JA_JPN, &k1TakenStringsPC98JapaneseProvider },
+ { k1PlacedStrings, kKyra1, kPlatformPC98, kNoSpecial, JA_JPN, &k1PlacedStringsPC98JapaneseProvider },
+ { k1DroppedStrings, kKyra1, kPlatformPC98, kNoSpecial, JA_JPN, &k1DroppedStringsPC98JapaneseProvider },
+ { k1NoDropStrings, kKyra1, kPlatformPC98, kNoSpecial, JA_JPN, &k1NoDropStringsPC98JapaneseProvider },
+ { k1AmuleteAnimSeq, kKyra1, kPlatformPC98, kNoSpecial, UNK_LANG, &k1AmuleteAnimSeqPC98Provider },
+ { k1SpecialPalette1, kKyra1, kPlatformPC98, kNoSpecial, UNK_LANG, &k1SpecialPalette1PC98Provider },
+ { k1SpecialPalette2, kKyra1, kPlatformPC98, kNoSpecial, UNK_LANG, &k1SpecialPalette2PC98Provider },
+ { k1SpecialPalette3, kKyra1, kPlatformPC98, kNoSpecial, UNK_LANG, &k1SpecialPalette3PC98Provider },
+ { k1SpecialPalette4, kKyra1, kPlatformPC98, kNoSpecial, UNK_LANG, &k1SpecialPalette4PC98Provider },
+ { k1SpecialPalette5, kKyra1, kPlatformPC98, kNoSpecial, UNK_LANG, &k1SpecialPalette5PC98Provider },
+ { k1SpecialPalette6, kKyra1, kPlatformPC98, kNoSpecial, UNK_LANG, &k1SpecialPalette6PC98Provider },
+ { k1SpecialPalette7, kKyra1, kPlatformPC98, kNoSpecial, UNK_LANG, &k1SpecialPalette7PC98Provider },
+ { k1SpecialPalette8, kKyra1, kPlatformPC98, kNoSpecial, UNK_LANG, &k1SpecialPalette8PC98Provider },
+ { k1SpecialPalette9, kKyra1, kPlatformPC98, kNoSpecial, UNK_LANG, &k1SpecialPalette9PC98Provider },
+ { k1SpecialPalette10, kKyra1, kPlatformPC98, kNoSpecial, UNK_LANG, &k1SpecialPalette10PC98Provider },
+ { k1SpecialPalette11, kKyra1, kPlatformPC98, kNoSpecial, UNK_LANG, &k1SpecialPalette11PC98Provider },
+ { k1SpecialPalette12, kKyra1, kPlatformPC98, kNoSpecial, UNK_LANG, &k1SpecialPalette12PC98Provider },
+ { k1SpecialPalette13, kKyra1, kPlatformPC98, kNoSpecial, UNK_LANG, &k1SpecialPalette13PC98Provider },
+ { k1SpecialPalette14, kKyra1, kPlatformPC98, kNoSpecial, UNK_LANG, &k1SpecialPalette14PC98Provider },
+ { k1SpecialPalette15, kKyra1, kPlatformPC98, kNoSpecial, UNK_LANG, &k1SpecialPalette15PC98Provider },
+ { k1SpecialPalette16, kKyra1, kPlatformPC98, kNoSpecial, UNK_LANG, &k1SpecialPalette16PC98Provider },
+ { k1SpecialPalette17, kKyra1, kPlatformPC98, kNoSpecial, UNK_LANG, &k1SpecialPalette17PC98Provider },
+ { k1SpecialPalette18, kKyra1, kPlatformPC98, kNoSpecial, UNK_LANG, &k1SpecialPalette18PC98Provider },
+ { k1SpecialPalette19, kKyra1, kPlatformPC98, kNoSpecial, UNK_LANG, &k1SpecialPalette19PC98Provider },
+ { k1SpecialPalette20, kKyra1, kPlatformPC98, kNoSpecial, UNK_LANG, &k1SpecialPalette20PC98Provider },
+ { k1SpecialPalette21, kKyra1, kPlatformPC98, kNoSpecial, UNK_LANG, &k1SpecialPalette21PC98Provider },
+ { k1SpecialPalette22, kKyra1, kPlatformPC98, kNoSpecial, UNK_LANG, &k1SpecialPalette22PC98Provider },
+ { k1SpecialPalette23, kKyra1, kPlatformPC98, kNoSpecial, UNK_LANG, &k1SpecialPalette23PC98Provider },
+ { k1SpecialPalette24, kKyra1, kPlatformPC98, kNoSpecial, UNK_LANG, &k1SpecialPalette24PC98Provider },
+ { k1SpecialPalette25, kKyra1, kPlatformPC98, kNoSpecial, UNK_LANG, &k1SpecialPalette25PC98Provider },
+ { k1SpecialPalette26, kKyra1, kPlatformPC98, kNoSpecial, UNK_LANG, &k1SpecialPalette26PC98Provider },
+ { k1SpecialPalette27, kKyra1, kPlatformPC98, kNoSpecial, UNK_LANG, &k1SpecialPalette27PC98Provider },
+ { k1SpecialPalette28, kKyra1, kPlatformPC98, kNoSpecial, UNK_LANG, &k1SpecialPalette28PC98Provider },
+ { k1SpecialPalette29, kKyra1, kPlatformPC98, kNoSpecial, UNK_LANG, &k1SpecialPalette29PC98Provider },
+ { k1SpecialPalette30, kKyra1, kPlatformPC98, kNoSpecial, UNK_LANG, &k1SpecialPalette30PC98Provider },
+ { k1SpecialPalette31, kKyra1, kPlatformPC98, kNoSpecial, UNK_LANG, &k1SpecialPalette31PC98Provider },
+ { k1SpecialPalette32, kKyra1, kPlatformPC98, kNoSpecial, UNK_LANG, &k1SpecialPalette32PC98Provider },
+ { k1SpecialPalette33, kKyra1, kPlatformPC98, kNoSpecial, UNK_LANG, &k1SpecialPalette33PC98Provider },
+ { k1PutDownString, kKyra1, kPlatformPC98, kNoSpecial, JA_JPN, &k1PutDownStringPC98JapaneseProvider },
+ { k1WaitAmuletString, kKyra1, kPlatformPC98, kNoSpecial, JA_JPN, &k1WaitAmuletStringPC98JapaneseProvider },
+ { k1BlackJewelString, kKyra1, kPlatformPC98, kNoSpecial, JA_JPN, &k1BlackJewelStringPC98JapaneseProvider },
+ { k1HealingTipString, kKyra1, kPlatformPC98, kNoSpecial, JA_JPN, &k1HealingTipStringPC98JapaneseProvider },
+ { k1PoisonGoneString, kKyra1, kPlatformPC98, kNoSpecial, JA_JPN, &k1PoisonGoneStringPC98JapaneseProvider },
+ { k1Healing1Shapes, kKyra1, kPlatformPC98, kNoSpecial, UNK_LANG, &k1Healing1ShapesPC98Provider },
+ { k1Healing2Shapes, kKyra1, kPlatformPC98, kNoSpecial, UNK_LANG, &k1Healing2ShapesPC98Provider },
+ { k1ThePoisonStrings, kKyra1, kPlatformPC98, kNoSpecial, JA_JPN, &k1ThePoisonStringsPC98JapaneseProvider },
+ { k1FluteStrings, kKyra1, kPlatformPC98, kNoSpecial, JA_JPN, &k1FluteStringsPC98JapaneseProvider },
+ { k1PoisonDeathShapes, kKyra1, kPlatformPC98, kNoSpecial, UNK_LANG, &k1PoisonDeathShapesPC98Provider },
+ { k1FluteShapes, kKyra1, kPlatformPC98, kNoSpecial, UNK_LANG, &k1FluteShapesPC98Provider },
+ { k1Winter1Shapes, kKyra1, kPlatformPC98, kNoSpecial, UNK_LANG, &k1Winter1ShapesPC98Provider },
+ { k1Winter2Shapes, kKyra1, kPlatformPC98, kNoSpecial, UNK_LANG, &k1Winter2ShapesPC98Provider },
+ { k1Winter3Shapes, kKyra1, kPlatformPC98, kNoSpecial, UNK_LANG, &k1Winter3ShapesPC98Provider },
+ { k1DrinkShapes, kKyra1, kPlatformPC98, kNoSpecial, UNK_LANG, &k1DrinkShapesPC98Provider },
+ { k1WispShapes, kKyra1, kPlatformPC98, kNoSpecial, UNK_LANG, &k1WispShapesPC98Provider },
+ { k1MagicAnimShapes, kKyra1, kPlatformPC98, kNoSpecial, UNK_LANG, &k1MagicAnimShapesPC98Provider },
+ { k1BranStoneShapes, kKyra1, kPlatformPC98, kNoSpecial, UNK_LANG, &k1BranStoneShapesPC98Provider },
+ { k1WispJewelStrings, kKyra1, kPlatformPC98, kNoSpecial, JA_JPN, &k1WispJewelStringsPC98JapaneseProvider },
+ { k1MagicJewelStrings, kKyra1, kPlatformPC98, kNoSpecial, JA_JPN, &k1MagicJewelStringsPC98JapaneseProvider },
+ { k1FlaskFullString, kKyra1, kPlatformPC98, kNoSpecial, JA_JPN, &k1FlaskFullStringPC98JapaneseProvider },
+ { k1FullFlaskString, kKyra1, kPlatformPC98, kNoSpecial, JA_JPN, &k1FullFlaskStringPC98JapaneseProvider },
+ { k1OutroReunionSeq, kKyra1, kPlatformPC98, kNoSpecial, UNK_LANG, &k1OutroReunionSeqPC98Provider },
+ { k1OutroHomeString, kKyra1, kPlatformPC98, kNoSpecial, JA_JPN, &k1OutroHomeStringPC98JapaneseProvider },
+ { k1VeryCleverString, kKyra1, kPlatformPC98, kNoSpecial, JA_JPN, &k1VeryCleverStringPC98JapaneseProvider },
+ { k1GUIStrings, kKyra1, kPlatformPC98, kNoSpecial, JA_JPN, &k1GUIStringsPC98JapaneseProvider },
+ { k1NewGameString, kKyra1, kPlatformPC98, kNoSpecial, JA_JPN, &k1NewGameStringPC98JapaneseProvider },
+ { k1ConfigStrings, kKyra1, kPlatformPC98, kNoSpecial, JA_JPN, &k1ConfigStringsPC98JapaneseProvider },
+ { k1PC98StoryStrings, kKyra1, kPlatformPC98, kNoSpecial, JA_JPN, &k1PC98StoryStringsPC98JapaneseProvider },
+ { k1PC98IntroSfx, kKyra1, kPlatformPC98, kNoSpecial, UNK_LANG, &k1PC98IntroSfxPC98Provider },
+ { k1CreditsStrings, kKyra1, kPlatformPC98, kNoSpecial, JA_JPN, &k1CreditsStringsPC98JapaneseProvider },
+ { k2SeqplayPakFiles, kKyra2, kPlatformDOS, kDemoVersion, UNK_LANG, &k2SeqplayPakFilesDOSDemoProvider },
+ { k2SeqplaySeqData, kKyra2, kPlatformDOS, kDemoVersion, UNK_LANG, &k2SeqplaySeqDataDOSDemoProvider },
+ { k2SeqplaySfxFiles, kKyra2, kPlatformDOS, kDemoVersion, UNK_LANG, &k2SeqplaySfxFilesDOSDemoProvider },
+ { k2SeqplayIntroTracks, kKyra2, kPlatformDOS, kDemoVersion, UNK_LANG, &k2SeqplayIntroTracksDOSDemoProvider },
+ { k2SeqplayShapeAnimData, kKyra2, kPlatformDOS, kDemoVersion, UNK_LANG, &k2SeqplayShapeAnimDataDOSDemoProvider },
+ { k2SeqplayPakFiles, kKyra2, kPlatformDOS, kTalkieDemoVersion, UNK_LANG, &k2SeqplayPakFilesDOSCDDemoProvider },
+ { k2SeqplayCredits, kKyra2, kPlatformDOS, kTalkieDemoVersion, UNK_LANG, &k2SeqplayCreditsDOSCDDemoProvider },
+ { k2SeqplayCreditsSpecial, kKyra2, kPlatformDOS, kTalkieDemoVersion, UNK_LANG, &k2SeqplayCreditsSpecialDOSCDDemoProvider },
+ { k2SeqplayStrings, kKyra2, kPlatformDOS, kTalkieDemoVersion, EN_ANY, &k2SeqplayStringsDOSCDDemoEnglishProvider },
+ { k2SeqplaySfxFiles, kKyra2, kPlatformDOS, kTalkieDemoVersion, UNK_LANG, &k2SeqplaySfxFilesDOSCDDemoProvider },
+ { k2SeqplayTlkFiles, kKyra2, kPlatformDOS, kTalkieDemoVersion, EN_ANY, &k2SeqplayTlkFilesDOSCDDemoEnglishProvider },
+ { k2SeqplaySeqData, kKyra2, kPlatformDOS, kTalkieDemoVersion, UNK_LANG, &k2SeqplaySeqDataDOSCDDemoProvider },
+ { k2SeqplayIntroTracks, kKyra2, kPlatformDOS, kTalkieDemoVersion, UNK_LANG, &k2SeqplayIntroTracksDOSCDDemoProvider },
+ { k2SeqplayFinaleTracks, kKyra2, kPlatformDOS, kTalkieDemoVersion, UNK_LANG, &k2SeqplayFinaleTracksDOSCDDemoProvider },
+ { k2IngameSfxFiles, kKyra2, kPlatformDOS, kTalkieDemoVersion, UNK_LANG, &k2IngameSfxFilesDOSCDDemoProvider },
+ { k2IngameSfxIndex, kKyra2, kPlatformDOS, kTalkieDemoVersion, UNK_LANG, &k2IngameSfxIndexDOSCDDemoProvider },
+ { k2IngameTracks, kKyra2, kPlatformDOS, kTalkieDemoVersion, UNK_LANG, &k2IngameTracksDOSCDDemoProvider },
+ { k2IngameTalkObjIndex, kKyra2, kPlatformDOS, kTalkieDemoVersion, UNK_LANG, &k2IngameTalkObjIndexDOSCDDemoProvider },
+ { k2IngameShapeAnimData, kKyra2, kPlatformDOS, kTalkieDemoVersion, UNK_LANG, &k2IngameShapeAnimDataDOSCDDemoProvider },
+ { k2IngameTlkDemoStrings, kKyra2, kPlatformDOS, kTalkieDemoVersion, EN_ANY, &k2IngameTlkDemoStringsDOSCDDemoEnglishProvider },
+ { k2SeqplayStrings, kKyra2, kPlatformDOS, kTalkieDemoVersion, FR_FRA, &k2SeqplayStringsDOSCDDemoFrenchProvider },
+ { k2SeqplayTlkFiles, kKyra2, kPlatformDOS, kTalkieDemoVersion, FR_FRA, &k2SeqplayTlkFilesDOSCDDemoFrenchProvider },
+ { k2IngameTlkDemoStrings, kKyra2, kPlatformDOS, kTalkieDemoVersion, FR_FRA, &k2IngameTlkDemoStringsDOSCDDemoFrenchProvider },
+ { k2SeqplayStrings, kKyra2, kPlatformDOS, kTalkieDemoVersion, DE_DEU, &k2SeqplayStringsDOSCDDemoGermanProvider },
+ { k2SeqplayTlkFiles, kKyra2, kPlatformDOS, kTalkieDemoVersion, DE_DEU, &k2SeqplayTlkFilesDOSCDDemoGermanProvider },
+ { k2IngameTlkDemoStrings, kKyra2, kPlatformDOS, kTalkieDemoVersion, DE_DEU, &k2IngameTlkDemoStringsDOSCDDemoGermanProvider },
+ { k2SeqplayPakFiles, kKyra2, kPlatformDOS, kNoSpecial, UNK_LANG, &k2SeqplayPakFilesDOSProvider },
+ { k2SeqplayStrings, kKyra2, kPlatformDOS, kNoSpecial, EN_ANY, &k2SeqplayStringsDOSEnglishProvider },
+ { k2SeqplaySfxFiles, kKyra2, kPlatformDOS, kNoSpecial, UNK_LANG, &k2SeqplaySfxFilesDOSProvider },
+ { k2SeqplayIntroTracks, kKyra2, kPlatformDOS, kNoSpecial, UNK_LANG, &k2SeqplayIntroTracksDOSProvider },
+ { k2SeqplayFinaleTracks, kKyra2, kPlatformDOS, kNoSpecial, UNK_LANG, &k2SeqplayFinaleTracksDOSProvider },
+ { k2SeqplaySeqData, kKyra2, kPlatformDOS, kNoSpecial, UNK_LANG, &k2SeqplaySeqDataDOSProvider },
+ { k2IngamePakFiles, kKyra2, kPlatformDOS, kNoSpecial, UNK_LANG, &k2IngamePakFilesDOSProvider },
+ { k2IngameSfxFiles, kKyra2, kPlatformDOS, kNoSpecial, UNK_LANG, &k2IngameSfxFilesDOSProvider },
+ { k2IngameSfxIndex, kKyra2, kPlatformDOS, kNoSpecial, UNK_LANG, &k2IngameSfxIndexDOSProvider },
+ { k2IngameTracks, kKyra2, kPlatformDOS, kNoSpecial, UNK_LANG, &k2IngameTracksDOSProvider },
+ { k2IngameTalkObjIndex, kKyra2, kPlatformDOS, kNoSpecial, UNK_LANG, &k2IngameTalkObjIndexDOSProvider },
+ { k2IngameShapeAnimData, kKyra2, kPlatformDOS, kNoSpecial, UNK_LANG, &k2IngameShapeAnimDataDOSProvider },
+ { k2SeqplayStrings, kKyra2, kPlatformDOS, kNoSpecial, FR_FRA, &k2SeqplayStringsDOSFrenchProvider },
+ { k2SeqplayStrings, kKyra2, kPlatformDOS, kNoSpecial, DE_DEU, &k2SeqplayStringsDOSGermanProvider },
+ { k2SeqplayStrings, kKyra2, kPlatformDOS, kNoSpecial, IT_ITA, &k2SeqplayStringsDOSItalianProvider },
+ { k2SeqplayStrings, kKyra2, kPlatformDOS, kNoSpecial, RU_RUS, &k2SeqplayStringsDOSRussianProvider },
+ { k2SeqplayPakFiles, kKyra2, kPlatformDOS, kTalkieVersion, UNK_LANG, &k2SeqplayPakFilesDOSCDProvider },
+ { k2SeqplayCredits, kKyra2, kPlatformDOS, kTalkieVersion, UNK_LANG, &k2SeqplayCreditsDOSCDProvider },
+ { k2SeqplayCreditsSpecial, kKyra2, kPlatformDOS, kTalkieVersion, UNK_LANG, &k2SeqplayCreditsSpecialDOSCDProvider },
+ { k2SeqplayStrings, kKyra2, kPlatformDOS, kTalkieVersion, EN_ANY, &k2SeqplayStringsDOSCDEnglishProvider },
+ { k2SeqplaySfxFiles, kKyra2, kPlatformDOS, kTalkieVersion, UNK_LANG, &k2SeqplaySfxFilesDOSCDProvider },
+ { k2SeqplayTlkFiles, kKyra2, kPlatformDOS, kTalkieVersion, EN_ANY, &k2SeqplayTlkFilesDOSCDEnglishProvider },
+ { k2SeqplaySeqData, kKyra2, kPlatformDOS, kTalkieVersion, UNK_LANG, &k2SeqplaySeqDataDOSCDProvider },
+ { k2SeqplayIntroTracks, kKyra2, kPlatformDOS, kTalkieVersion, UNK_LANG, &k2SeqplayIntroTracksDOSCDProvider },
+ { k2SeqplayFinaleTracks, kKyra2, kPlatformDOS, kTalkieVersion, UNK_LANG, &k2SeqplayFinaleTracksDOSCDProvider },
+ { k2IngameSfxFiles, kKyra2, kPlatformDOS, kTalkieVersion, UNK_LANG, &k2IngameSfxFilesDOSCDProvider },
+ { k2IngameSfxIndex, kKyra2, kPlatformDOS, kTalkieVersion, UNK_LANG, &k2IngameSfxIndexDOSCDProvider },
+ { k2IngameTracks, kKyra2, kPlatformDOS, kTalkieVersion, UNK_LANG, &k2IngameTracksDOSCDProvider },
+ { k2IngameTalkObjIndex, kKyra2, kPlatformDOS, kTalkieVersion, UNK_LANG, &k2IngameTalkObjIndexDOSCDProvider },
+ { k2IngameShapeAnimData, kKyra2, kPlatformDOS, kTalkieVersion, UNK_LANG, &k2IngameShapeAnimDataDOSCDProvider },
+ { k2SeqplayStrings, kKyra2, kPlatformDOS, kTalkieVersion, FR_FRA, &k2SeqplayStringsDOSCDFrenchProvider },
+ { k2SeqplayTlkFiles, kKyra2, kPlatformDOS, kTalkieVersion, FR_FRA, &k2SeqplayTlkFilesDOSCDFrenchProvider },
+ { k2SeqplayStrings, kKyra2, kPlatformDOS, kTalkieVersion, DE_DEU, &k2SeqplayStringsDOSCDGermanProvider },
+ { k2SeqplayTlkFiles, kKyra2, kPlatformDOS, kTalkieVersion, DE_DEU, &k2SeqplayTlkFilesDOSCDGermanProvider },
+ { k2SeqplayStrings, kKyra2, kPlatformDOS, kTalkieVersion, IT_ITA, &k2SeqplayStringsDOSCDItalianProvider },
+ { k2SeqplayTlkFiles, kKyra2, kPlatformDOS, kTalkieVersion, IT_ITA, &k2SeqplayTlkFilesDOSCDItalianProvider },
+ { k2SeqplayStrings, kKyra2, kPlatformDOS, kTalkieVersion, RU_RUS, &k2SeqplayStringsDOSCDRussianProvider },
+ { k2SeqplayTlkFiles, kKyra2, kPlatformDOS, kTalkieVersion, RU_RUS, &k2SeqplayTlkFilesDOSCDRussianProvider },
+ { k2SeqplayPakFiles, kKyra2, kPlatformFMTowns, kNoSpecial, UNK_LANG, &k2SeqplayPakFilesFMTownsProvider },
+ { k2SeqplayStrings, kKyra2, kPlatformFMTowns, kNoSpecial, EN_ANY, &k2SeqplayStringsFMTownsEnglishProvider },
+ { k2SeqplaySfxFiles, kKyra2, kPlatformFMTowns, kNoSpecial, UNK_LANG, &k2SeqplaySfxFilesFMTownsProvider },
+ { k2SeqplaySeqData, kKyra2, kPlatformFMTowns, kNoSpecial, UNK_LANG, &k2SeqplaySeqDataFMTownsProvider },
+ { k2SeqplayIntroCDA, kKyra2, kPlatformFMTowns, kNoSpecial, UNK_LANG, &k2SeqplayIntroCDAFMTownsProvider },
+ { k2SeqplayFinaleCDA, kKyra2, kPlatformFMTowns, kNoSpecial, UNK_LANG, &k2SeqplayFinaleCDAFMTownsProvider },
+ { k2IngamePakFiles, kKyra2, kPlatformFMTowns, kNoSpecial, UNK_LANG, &k2IngamePakFilesFMTownsProvider },
+ { k2IngameSfxFiles, kKyra2, kPlatformFMTowns, kNoSpecial, UNK_LANG, &k2IngameSfxFilesFMTownsProvider },
+ { k2IngameSfxIndex, kKyra2, kPlatformFMTowns, kNoSpecial, UNK_LANG, &k2IngameSfxIndexFMTownsProvider },
+ { k2IngameCDA, kKyra2, kPlatformFMTowns, kNoSpecial, UNK_LANG, &k2IngameCDAFMTownsProvider },
+ { k2IngameTalkObjIndex, kKyra2, kPlatformFMTowns, kNoSpecial, UNK_LANG, &k2IngameTalkObjIndexFMTownsProvider },
+ { k2IngameTimJpStrings, kKyra2, kPlatformFMTowns, kNoSpecial, UNK_LANG, &k2IngameTimJpStringsFMTownsProvider },
+ { k2IngameShapeAnimData, kKyra2, kPlatformFMTowns, kNoSpecial, UNK_LANG, &k2IngameShapeAnimDataFMTownsProvider },
+ { k2SeqplayStrings, kKyra2, kPlatformFMTowns, kNoSpecial, JA_JPN, &k2SeqplayStringsFMTownsJapaneseProvider },
+ { k2SeqplayPakFiles, kKyra2, kPlatformPC98, kNoSpecial, UNK_LANG, &k2SeqplayPakFilesPC98Provider },
+ { k2SeqplayStrings, kKyra2, kPlatformPC98, kNoSpecial, EN_ANY, &k2SeqplayStringsPC98EnglishProvider },
+ { k2SeqplaySfxFiles, kKyra2, kPlatformPC98, kNoSpecial, UNK_LANG, &k2SeqplaySfxFilesPC98Provider },
+ { k2SeqplaySeqData, kKyra2, kPlatformPC98, kNoSpecial, UNK_LANG, &k2SeqplaySeqDataPC98Provider },
+ { k2IngamePakFiles, kKyra2, kPlatformPC98, kNoSpecial, UNK_LANG, &k2IngamePakFilesPC98Provider },
+ { k2IngameSfxFiles, kKyra2, kPlatformPC98, kNoSpecial, UNK_LANG, &k2IngameSfxFilesPC98Provider },
+ { k2IngameSfxIndex, kKyra2, kPlatformPC98, kNoSpecial, UNK_LANG, &k2IngameSfxIndexPC98Provider },
+ { k2IngameTalkObjIndex, kKyra2, kPlatformPC98, kNoSpecial, UNK_LANG, &k2IngameTalkObjIndexPC98Provider },
+ { k2IngameTimJpStrings, kKyra2, kPlatformPC98, kNoSpecial, UNK_LANG, &k2IngameTimJpStringsPC98Provider },
+ { k2IngameShapeAnimData, kKyra2, kPlatformPC98, kNoSpecial, UNK_LANG, &k2IngameShapeAnimDataPC98Provider },
+ { k2SeqplayStrings, kKyra2, kPlatformPC98, kNoSpecial, JA_JPN, &k2SeqplayStringsPC98JapaneseProvider },
+ { k3MainMenuStrings, kKyra3, kPlatformDOS, kTalkieVersion, UNK_LANG, &k3MainMenuStringsDOSCDProvider },
+ { k3MusicFiles, kKyra3, kPlatformDOS, kTalkieVersion, UNK_LANG, &k3MusicFilesDOSCDProvider },
+ { k3ScoreTable, kKyra3, kPlatformDOS, kTalkieVersion, UNK_LANG, &k3ScoreTableDOSCDProvider },
+ { k3SfxFiles, kKyra3, kPlatformDOS, kTalkieVersion, UNK_LANG, &k3SfxFilesDOSCDProvider },
+ { k3SfxMap, kKyra3, kPlatformDOS, kTalkieVersion, UNK_LANG, &k3SfxMapDOSCDProvider },
+ { k3ItemAnimData, kKyra3, kPlatformDOS, kTalkieVersion, UNK_LANG, &k3ItemAnimDataDOSCDProvider },
+ { k3ItemMagicTable, kKyra3, kPlatformDOS, kTalkieVersion, UNK_LANG, &k3ItemMagicTableDOSCDProvider },
+ { k3ItemStringMap, kKyra3, kPlatformDOS, kTalkieVersion, UNK_LANG, &k3ItemStringMapDOSCDProvider },
+ { kEoBBaseChargenStrings1, kEoB1, kPlatformDOS, kNoSpecial, EN_ANY, &kEoB1ChargenStrings1DOSEnglishProvider },
+ { kEoBBaseChargenStrings2, kEoB1, kPlatformDOS, kNoSpecial, EN_ANY, &kEoB1ChargenStrings2DOSEnglishProvider },
+ { kEoBBaseChargenStartLevels, kEoB1, kPlatformDOS, kNoSpecial, UNK_LANG, &kEoB1ChargenStartLevelsDOSProvider },
+ { kEoBBaseChargenStatStrings, kEoB1, kPlatformDOS, kNoSpecial, EN_ANY, &kEoB1ChargenStatStringsDOSEnglishProvider },
+ { kEoBBaseChargenRaceSexStrings, kEoB1, kPlatformDOS, kNoSpecial, EN_ANY, &kEoB1ChargenRaceSexStringsDOSEnglishProvider },
+ { kEoBBaseChargenClassStrings, kEoB1, kPlatformDOS, kNoSpecial, EN_ANY, &kEoB1ChargenClassStringsDOSEnglishProvider },
+ { kEoBBaseChargenAlignmentStrings, kEoB1, kPlatformDOS, kNoSpecial, EN_ANY, &kEoB1ChargenAlignmentStringsDOSEnglishProvider },
+ { kEoBBaseChargenEnterGameStrings, kEoB1, kPlatformDOS, kNoSpecial, EN_ANY, &kEoB1ChargenEnterGameStringsDOSEnglishProvider },
+ { kEoBBaseChargenClassMinStats, kEoB1, kPlatformDOS, kNoSpecial, UNK_LANG, &kEoB1ChargenClassMinStatsDOSProvider },
+ { kEoBBaseChargenRaceMinStats, kEoB1, kPlatformDOS, kNoSpecial, UNK_LANG, &kEoB1ChargenRaceMinStatsDOSProvider },
+ { kEoBBaseChargenRaceMaxStats, kEoB1, kPlatformDOS, kNoSpecial, UNK_LANG, &kEoB1ChargenRaceMaxStatsDOSProvider },
+ { kEoBBaseSaveThrowTable1, kEoB1, kPlatformDOS, kNoSpecial, UNK_LANG, &kEoB1SaveThrowTable1DOSProvider },
+ { kEoBBaseSaveThrowTable2, kEoB1, kPlatformDOS, kNoSpecial, UNK_LANG, &kEoB1SaveThrowTable2DOSProvider },
+ { kEoBBaseSaveThrowTable3, kEoB1, kPlatformDOS, kNoSpecial, UNK_LANG, &kEoB1SaveThrowTable3DOSProvider },
+ { kEoBBaseSaveThrowTable4, kEoB1, kPlatformDOS, kNoSpecial, UNK_LANG, &kEoB1SaveThrowTable4DOSProvider },
+ { kEoBBaseSaveThrwLvlIndex, kEoB1, kPlatformDOS, kNoSpecial, UNK_LANG, &kEoB1SaveThrwLvlIndexDOSProvider },
+ { kEoBBaseSaveThrwModDiv, kEoB1, kPlatformDOS, kNoSpecial, UNK_LANG, &kEoB1SaveThrwModDivDOSProvider },
+ { kEoBBaseSaveThrwModExt, kEoB1, kPlatformDOS, kNoSpecial, UNK_LANG, &kEoB1SaveThrwModExtDOSProvider },
+ { kEoB1MainMenuStrings, kEoB1, kPlatformDOS, kNoSpecial, EN_ANY, &kEoB1MainMenuStringsDOSEnglishProvider },
+ { kEoB1BonusStrings, kEoB1, kPlatformDOS, kNoSpecial, EN_ANY, &kEoB1BonusStringsDOSEnglishProvider },
+ { kEoB1IntroFilesOpening, kEoB1, kPlatformDOS, kNoSpecial, UNK_LANG, &kEoB1IntroFilesOpeningDOSProvider },
+ { kEoB1IntroFilesTower, kEoB1, kPlatformDOS, kNoSpecial, UNK_LANG, &kEoB1IntroFilesTowerDOSProvider },
+ { kEoB1IntroFilesOrb, kEoB1, kPlatformDOS, kNoSpecial, UNK_LANG, &kEoB1IntroFilesOrbDOSProvider },
+ { kEoB1IntroFilesWdEntry, kEoB1, kPlatformDOS, kNoSpecial, UNK_LANG, &kEoB1IntroFilesWdEntryDOSProvider },
+ { kEoB1IntroFilesKing, kEoB1, kPlatformDOS, kNoSpecial, UNK_LANG, &kEoB1IntroFilesKingDOSProvider },
+ { kEoB1IntroFilesHands, kEoB1, kPlatformDOS, kNoSpecial, UNK_LANG, &kEoB1IntroFilesHandsDOSProvider },
+ { kEoB1IntroFilesWdExit, kEoB1, kPlatformDOS, kNoSpecial, UNK_LANG, &kEoB1IntroFilesWdExitDOSProvider },
+ { kEoB1IntroFilesTunnel, kEoB1, kPlatformDOS, kNoSpecial, UNK_LANG, &kEoB1IntroFilesTunnelDOSProvider },
+ { kEoB1IntroOpeningFrmDelay, kEoB1, kPlatformDOS, kNoSpecial, UNK_LANG, &kEoB1IntroOpeningFrmDelayDOSProvider },
+ { kEoB1IntroWdEncodeX, kEoB1, kPlatformDOS, kNoSpecial, UNK_LANG, &kEoB1IntroWdEncodeXDOSProvider },
+ { kEoB1IntroWdEncodeY, kEoB1, kPlatformDOS, kNoSpecial, UNK_LANG, &kEoB1IntroWdEncodeYDOSProvider },
+ { kEoB1IntroWdEncodeWH, kEoB1, kPlatformDOS, kNoSpecial, UNK_LANG, &kEoB1IntroWdEncodeWHDOSProvider },
+ { kEoB1IntroWdDsX, kEoB1, kPlatformDOS, kNoSpecial, UNK_LANG, &kEoB1IntroWdDsXDOSProvider },
+ { kEoB1IntroWdDsY, kEoB1, kPlatformDOS, kNoSpecial, UNK_LANG, &kEoB1IntroWdDsYDOSProvider },
+ { kEoB1IntroTvlX1, kEoB1, kPlatformDOS, kNoSpecial, UNK_LANG, &kEoB1IntroTvlX1DOSProvider },
+ { kEoB1IntroTvlY1, kEoB1, kPlatformDOS, kNoSpecial, UNK_LANG, &kEoB1IntroTvlY1DOSProvider },
+ { kEoB1IntroTvlX2, kEoB1, kPlatformDOS, kNoSpecial, UNK_LANG, &kEoB1IntroTvlX2DOSProvider },
+ { kEoB1IntroTvlY2, kEoB1, kPlatformDOS, kNoSpecial, UNK_LANG, &kEoB1IntroTvlY2DOSProvider },
+ { kEoB1IntroTvlW, kEoB1, kPlatformDOS, kNoSpecial, UNK_LANG, &kEoB1IntroTvlWDOSProvider },
+ { kEoB1IntroTvlH, kEoB1, kPlatformDOS, kNoSpecial, UNK_LANG, &kEoB1IntroTvlHDOSProvider },
+ { kEoB1DoorShapeDefs, kEoB1, kPlatformDOS, kNoSpecial, UNK_LANG, &kEoB1DoorShapeDefsDOSProvider },
+ { kEoB1DoorSwitchShapeDefs, kEoB1, kPlatformDOS, kNoSpecial, UNK_LANG, &kEoB1DoorSwitchShapeDefsDOSProvider },
+ { kEoB1DoorSwitchCoords, kEoB1, kPlatformDOS, kNoSpecial, UNK_LANG, &kEoB1DoorSwitchCoordsDOSProvider },
+ { kEoB1MonsterProperties, kEoB1, kPlatformDOS, kNoSpecial, UNK_LANG, &kEoB1MonsterPropertiesDOSProvider },
+ { kEoB1EnemyMageSpellList, kEoB1, kPlatformDOS, kNoSpecial, UNK_LANG, &kEoB1EnemyMageSpellListDOSProvider },
+ { kEoB1EnemyMageSfx, kEoB1, kPlatformDOS, kNoSpecial, UNK_LANG, &kEoB1EnemyMageSfxDOSProvider },
+ { kEoB1BeholderSpellList, kEoB1, kPlatformDOS, kNoSpecial, UNK_LANG, &kEoB1BeholderSpellListDOSProvider },
+ { kEoB1BeholderSfx, kEoB1, kPlatformDOS, kNoSpecial, UNK_LANG, &kEoB1BeholderSfxDOSProvider },
+ { kEoB1TurnUndeadString, kEoB1, kPlatformDOS, kNoSpecial, EN_ANY, &kEoB1TurnUndeadStringDOSEnglishProvider },
+ { kEoB1CgaMappingDefault, kEoB1, kPlatformDOS, kNoSpecial, UNK_LANG, &kEoB1CgaMappingDefaultDOSProvider },
+ { kEoB1CgaMappingAlt, kEoB1, kPlatformDOS, kNoSpecial, UNK_LANG, &kEoB1CgaMappingAltDOSProvider },
+ { kEoB1CgaMappingInv, kEoB1, kPlatformDOS, kNoSpecial, UNK_LANG, &kEoB1CgaMappingInvDOSProvider },
+ { kEoB1CgaMappingItemsL, kEoB1, kPlatformDOS, kNoSpecial, UNK_LANG, &kEoB1CgaMappingItemsLDOSProvider },
+ { kEoB1CgaMappingItemsS, kEoB1, kPlatformDOS, kNoSpecial, UNK_LANG, &kEoB1CgaMappingItemsSDOSProvider },
+ { kEoB1CgaMappingThrown, kEoB1, kPlatformDOS, kNoSpecial, UNK_LANG, &kEoB1CgaMappingThrownDOSProvider },
+ { kEoB1CgaMappingIcons, kEoB1, kPlatformDOS, kNoSpecial, UNK_LANG, &kEoB1CgaMappingIconsDOSProvider },
+ { kEoB1CgaMappingDeco, kEoB1, kPlatformDOS, kNoSpecial, UNK_LANG, &kEoB1CgaMappingDecoDOSProvider },
+ { kEoB1CgaLevelMappingIndex, kEoB1, kPlatformDOS, kNoSpecial, UNK_LANG, &kEoB1CgaLevelMappingIndexDOSProvider },
+ { kEoB1CgaMappingLevel0, kEoB1, kPlatformDOS, kNoSpecial, UNK_LANG, &kEoB1CgaMappingLevel0DOSProvider },
+ { kEoB1CgaMappingLevel1, kEoB1, kPlatformDOS, kNoSpecial, UNK_LANG, &kEoB1CgaMappingLevel1DOSProvider },
+ { kEoB1CgaMappingLevel2, kEoB1, kPlatformDOS, kNoSpecial, UNK_LANG, &kEoB1CgaMappingLevel2DOSProvider },
+ { kEoB1CgaMappingLevel3, kEoB1, kPlatformDOS, kNoSpecial, UNK_LANG, &kEoB1CgaMappingLevel3DOSProvider },
+ { kEoB1CgaMappingLevel4, kEoB1, kPlatformDOS, kNoSpecial, UNK_LANG, &kEoB1CgaMappingLevel4DOSProvider },
+ { kEoB1NpcShpData, kEoB1, kPlatformDOS, kNoSpecial, UNK_LANG, &kEoB1NpcShpDataDOSProvider },
+ { kEoB1NpcSubShpIndex1, kEoB1, kPlatformDOS, kNoSpecial, UNK_LANG, &kEoB1NpcSubShpIndex1DOSProvider },
+ { kEoB1NpcSubShpIndex2, kEoB1, kPlatformDOS, kNoSpecial, UNK_LANG, &kEoB1NpcSubShpIndex2DOSProvider },
+ { kEoB1NpcSubShpY, kEoB1, kPlatformDOS, kNoSpecial, UNK_LANG, &kEoB1NpcSubShpYDOSProvider },
+ { kEoB1Npc0Strings, kEoB1, kPlatformDOS, kNoSpecial, EN_ANY, &kEoB1Npc0StringsDOSEnglishProvider },
+ { kEoB1Npc11Strings, kEoB1, kPlatformDOS, kNoSpecial, EN_ANY, &kEoB1Npc11StringsDOSEnglishProvider },
+ { kEoB1Npc12Strings, kEoB1, kPlatformDOS, kNoSpecial, EN_ANY, &kEoB1Npc12StringsDOSEnglishProvider },
+ { kEoB1Npc21Strings, kEoB1, kPlatformDOS, kNoSpecial, EN_ANY, &kEoB1Npc21StringsDOSEnglishProvider },
+ { kEoB1Npc22Strings, kEoB1, kPlatformDOS, kNoSpecial, EN_ANY, &kEoB1Npc22StringsDOSEnglishProvider },
+ { kEoB1Npc31Strings, kEoB1, kPlatformDOS, kNoSpecial, EN_ANY, &kEoB1Npc31StringsDOSEnglishProvider },
+ { kEoB1Npc32Strings, kEoB1, kPlatformDOS, kNoSpecial, EN_ANY, &kEoB1Npc32StringsDOSEnglishProvider },
+ { kEoB1Npc4Strings, kEoB1, kPlatformDOS, kNoSpecial, EN_ANY, &kEoB1Npc4StringsDOSEnglishProvider },
+ { kEoB1Npc5Strings, kEoB1, kPlatformDOS, kNoSpecial, EN_ANY, &kEoB1Npc5StringsDOSEnglishProvider },
+ { kEoB1Npc6Strings, kEoB1, kPlatformDOS, kNoSpecial, EN_ANY, &kEoB1Npc6StringsDOSEnglishProvider },
+ { kEoB1Npc7Strings, kEoB1, kPlatformDOS, kNoSpecial, EN_ANY, &kEoB1Npc7StringsDOSEnglishProvider },
+ { kEoBBasePryDoorStrings, kEoB1, kPlatformDOS, kNoSpecial, EN_ANY, &kEoB1PryDoorStringsDOSEnglishProvider },
+ { kEoBBaseWarningStrings, kEoB1, kPlatformDOS, kNoSpecial, EN_ANY, &kEoB1WarningStringsDOSEnglishProvider },
+ { kEoBBaseItemSuffixStringsRings, kEoB1, kPlatformDOS, kNoSpecial, EN_ANY, &kEoB1ItemSuffixStringsRingsDOSEnglishProvider },
+ { kEoBBaseItemSuffixStringsPotions, kEoB1, kPlatformDOS, kNoSpecial, EN_ANY, &kEoB1ItemSuffixStringsPotionsDOSEnglishProvider },
+ { kEoBBaseItemSuffixStringsWands, kEoB1, kPlatformDOS, kNoSpecial, EN_ANY, &kEoB1ItemSuffixStringsWandsDOSEnglishProvider },
+ { kEoBBaseRipItemStrings, kEoB1, kPlatformDOS, kNoSpecial, EN_ANY, &kEoB1RipItemStringsDOSEnglishProvider },
+ { kEoBBaseCursedString, kEoB1, kPlatformDOS, kNoSpecial, EN_ANY, &kEoB1CursedStringDOSEnglishProvider },
+ { kEoBBaseEnchantedString, kEoB1, kPlatformDOS, kNoSpecial, UNK_LANG, &kEoB1EnchantedStringDOSProvider },
+ { kEoBBaseMagicObjectStrings, kEoB1, kPlatformDOS, kNoSpecial, EN_ANY, &kEoB1MagicObjectStringsDOSEnglishProvider },
+ { kEoBBaseMagicObjectString5, kEoB1, kPlatformDOS, kNoSpecial, EN_ANY, &kEoB1MagicObjectString5DOSEnglishProvider },
+ { kEoBBasePatternSuffix, kEoB1, kPlatformDOS, kNoSpecial, EN_ANY, &kEoB1PatternSuffixDOSEnglishProvider },
+ { kEoBBasePatternGrFix1, kEoB1, kPlatformDOS, kNoSpecial, EN_ANY, &kEoB1PatternGrFix1DOSEnglishProvider },
+ { kEoBBasePatternGrFix2, kEoB1, kPlatformDOS, kNoSpecial, EN_ANY, &kEoB1PatternGrFix2DOSEnglishProvider },
+ { kEoBBaseValidateArmorString, kEoB1, kPlatformDOS, kNoSpecial, EN_ANY, &kEoB1ValidateArmorStringDOSEnglishProvider },
+ { kEoBBaseValidateNoDropString, kEoB1, kPlatformDOS, kNoSpecial, EN_ANY, &kEoB1ValidateNoDropStringDOSEnglishProvider },
+ { kEoBBasePotionStrings, kEoB1, kPlatformDOS, kNoSpecial, EN_ANY, &kEoB1PotionStringsDOSEnglishProvider },
+ { kEoBBaseWandStrings, kEoB1, kPlatformDOS, kNoSpecial, EN_ANY, &kEoB1WandStringsDOSEnglishProvider },
+ { kEoBBaseItemMisuseStrings, kEoB1, kPlatformDOS, kNoSpecial, EN_ANY, &kEoB1ItemMisuseStringsDOSEnglishProvider },
+ { kEoBBaseTakenStrings, kEoB1, kPlatformDOS, kNoSpecial, EN_ANY, &kEoB1TakenStringsDOSEnglishProvider },
+ { kEoBBasePotionEffectStrings, kEoB1, kPlatformDOS, kNoSpecial, EN_ANY, &kEoB1PotionEffectStringsDOSEnglishProvider },
+ { kEoBBaseYesNoStrings, kEoB1, kPlatformDOS, kNoSpecial, EN_ANY, &kEoB1YesNoStringsDOSEnglishProvider },
+ { kRpgCommonMoreStrings, kEoB1, kPlatformDOS, kNoSpecial, EN_ANY, &kEoB1MoreStringsDOSEnglishProvider },
+ { kEoBBaseNpcMaxStrings, kEoB1, kPlatformDOS, kNoSpecial, EN_ANY, &kEoB1NpcMaxStringsDOSEnglishProvider },
+ { kEoBBaseNpcJoinStrings, kEoB1, kPlatformDOS, kNoSpecial, EN_ANY, &kEoB1NpcJoinStringsDOSEnglishProvider },
+ { kEoBBaseCancelStrings, kEoB1, kPlatformDOS, kNoSpecial, EN_ANY, &kEoB1CancelStringsDOSEnglishProvider },
+ { kEoBBaseMenuStringsMain, kEoB1, kPlatformDOS, kNoSpecial, EN_ANY, &kEoB1MenuStringsMainDOSEnglishProvider },
+ { kEoBBaseMenuStringsSaveLoad, kEoB1, kPlatformDOS, kNoSpecial, EN_ANY, &kEoB1MenuStringsSaveLoadDOSEnglishProvider },
+ { kEoBBaseMenuStringsOnOff, kEoB1, kPlatformDOS, kNoSpecial, EN_ANY, &kEoB1MenuStringsOnOffDOSEnglishProvider },
+ { kEoBBaseMenuStringsSpells, kEoB1, kPlatformDOS, kNoSpecial, EN_ANY, &kEoB1MenuStringsSpellsDOSEnglishProvider },
+ { kEoBBaseMenuStringsRest, kEoB1, kPlatformDOS, kNoSpecial, EN_ANY, &kEoB1MenuStringsRestDOSEnglishProvider },
+ { kEoBBaseMenuStringsDrop, kEoB1, kPlatformDOS, kNoSpecial, EN_ANY, &kEoB1MenuStringsDropDOSEnglishProvider },
+ { kEoBBaseMenuStringsExit, kEoB1, kPlatformDOS, kNoSpecial, EN_ANY, &kEoB1MenuStringsExitDOSEnglishProvider },
+ { kEoBBaseMenuStringsStarve, kEoB1, kPlatformDOS, kNoSpecial, EN_ANY, &kEoB1MenuStringsStarveDOSEnglishProvider },
+ { kEoBBaseMenuStringsScribe, kEoB1, kPlatformDOS, kNoSpecial, EN_ANY, &kEoB1MenuStringsScribeDOSEnglishProvider },
+ { kEoBBaseMenuStringsDrop2, kEoB1, kPlatformDOS, kNoSpecial, EN_ANY, &kEoB1MenuStringsDrop2DOSEnglishProvider },
+ { kEoBBaseMenuStringsHead, kEoB1, kPlatformDOS, kNoSpecial, EN_ANY, &kEoB1MenuStringsHeadDOSEnglishProvider },
+ { kEoBBaseMenuStringsPoison, kEoB1, kPlatformDOS, kNoSpecial, EN_ANY, &kEoB1MenuStringsPoisonDOSEnglishProvider },
+ { kEoBBaseMenuStringsMgc, kEoB1, kPlatformDOS, kNoSpecial, EN_ANY, &kEoB1MenuStringsMgcDOSEnglishProvider },
+ { kEoBBaseMenuStringsPrefs, kEoB1, kPlatformDOS, kNoSpecial, EN_ANY, &kEoB1MenuStringsPrefsDOSEnglishProvider },
+ { kEoBBaseMenuStringsRest2, kEoB1, kPlatformDOS, kNoSpecial, EN_ANY, &kEoB1MenuStringsRest2DOSEnglishProvider },
+ { kEoBBaseMenuStringsRest4, kEoB1, kPlatformDOS, kNoSpecial, EN_ANY, &kEoB1MenuStringsRest4DOSEnglishProvider },
+ { kEoBBaseMenuStringsDefeat, kEoB1, kPlatformDOS, kNoSpecial, EN_ANY, &kEoB1MenuStringsDefeatDOSEnglishProvider },
+ { kEoBBaseMenuYesNoStrings, kEoB1, kPlatformDOS, kNoSpecial, EN_ANY, &kEoB1MenuYesNoStringsDOSEnglishProvider },
+ { kEoBBaseSpellLevelsMage, kEoB1, kPlatformDOS, kNoSpecial, UNK_LANG, &kEoB1SpellLevelsMageDOSProvider },
+ { kEoBBaseSpellLevelsCleric, kEoB1, kPlatformDOS, kNoSpecial, UNK_LANG, &kEoB1SpellLevelsClericDOSProvider },
+ { kEoBBaseNumSpellsCleric, kEoB1, kPlatformDOS, kNoSpecial, UNK_LANG, &kEoB1NumSpellsClericDOSProvider },
+ { kEoBBaseNumSpellsWisAdj, kEoB1, kPlatformDOS, kNoSpecial, UNK_LANG, &kEoB1NumSpellsWisAdjDOSProvider },
+ { kEoBBaseNumSpellsPal, kEoB1, kPlatformDOS, kNoSpecial, UNK_LANG, &kEoB1NumSpellsPalDOSProvider },
+ { kEoBBaseNumSpellsMage, kEoB1, kPlatformDOS, kNoSpecial, UNK_LANG, &kEoB1NumSpellsMageDOSProvider },
+ { kEoBBaseCharGuiStringsHp, kEoB1, kPlatformDOS, kNoSpecial, EN_ANY, &kEoB1CharGuiStringsHpDOSEnglishProvider },
+ { kEoBBaseCharGuiStringsWp1, kEoB1, kPlatformDOS, kNoSpecial, EN_ANY, &kEoB1CharGuiStringsWp1DOSEnglishProvider },
+ { kEoBBaseCharGuiStringsWr, kEoB1, kPlatformDOS, kNoSpecial, EN_ANY, &kEoB1CharGuiStringsWrDOSEnglishProvider },
+ { kEoBBaseCharGuiStringsSt1, kEoB1, kPlatformDOS, kNoSpecial, EN_ANY, &kEoB1CharGuiStringsSt1DOSEnglishProvider },
+ { kEoBBaseCharGuiStringsIn, kEoB1, kPlatformDOS, kNoSpecial, EN_ANY, &kEoB1CharGuiStringsInDOSEnglishProvider },
+ { kEoBBaseCharStatusStrings7, kEoB1, kPlatformDOS, kNoSpecial, EN_ANY, &kEoB1CharStatusStrings7DOSEnglishProvider },
+ { kEoBBaseCharStatusStrings81, kEoB1, kPlatformDOS, kNoSpecial, EN_ANY, &kEoB1CharStatusStrings81DOSEnglishProvider },
+ { kEoBBaseCharStatusStrings9, kEoB1, kPlatformDOS, kNoSpecial, EN_ANY, &kEoB1CharStatusStrings9DOSEnglishProvider },
+ { kEoBBaseCharStatusStrings131, kEoB1, kPlatformDOS, kNoSpecial, EN_ANY, &kEoB1CharStatusStrings131DOSEnglishProvider },
+ { kEoBBaseLevelGainStrings, kEoB1, kPlatformDOS, kNoSpecial, EN_ANY, &kEoB1LevelGainStringsDOSEnglishProvider },
+ { kEoBBaseExperienceTable0, kEoB1, kPlatformDOS, kNoSpecial, UNK_LANG, &kEoB1ExperienceTable0DOSProvider },
+ { kEoBBaseExperienceTable1, kEoB1, kPlatformDOS, kNoSpecial, UNK_LANG, &kEoB1ExperienceTable1DOSProvider },
+ { kEoBBaseExperienceTable2, kEoB1, kPlatformDOS, kNoSpecial, UNK_LANG, &kEoB1ExperienceTable2DOSProvider },
+ { kEoBBaseExperienceTable3, kEoB1, kPlatformDOS, kNoSpecial, UNK_LANG, &kEoB1ExperienceTable3DOSProvider },
+ { kEoBBaseExperienceTable4, kEoB1, kPlatformDOS, kNoSpecial, UNK_LANG, &kEoB1ExperienceTable4DOSProvider },
+ { kEoBBaseBookNumbers, kEoB1, kPlatformDOS, kNoSpecial, EN_ANY, &kEoB1BookNumbersDOSEnglishProvider },
+ { kEoBBaseMageSpellsList, kEoB1, kPlatformDOS, kNoSpecial, EN_ANY, &kEoB1MageSpellsListDOSEnglishProvider },
+ { kEoBBaseClericSpellsList, kEoB1, kPlatformDOS, kNoSpecial, EN_ANY, &kEoB1ClericSpellsListDOSEnglishProvider },
+ { kEoBBaseSpellNames, kEoB1, kPlatformDOS, kNoSpecial, EN_ANY, &kEoB1SpellNamesDOSEnglishProvider },
+ { kEoBBaseMagicStrings1, kEoB1, kPlatformDOS, kNoSpecial, EN_ANY, &kEoB1MagicStrings1DOSEnglishProvider },
+ { kEoBBaseMagicStrings2, kEoB1, kPlatformDOS, kNoSpecial, EN_ANY, &kEoB1MagicStrings2DOSEnglishProvider },
+ { kEoBBaseMagicStrings3, kEoB1, kPlatformDOS, kNoSpecial, EN_ANY, &kEoB1MagicStrings3DOSEnglishProvider },
+ { kEoBBaseMagicStrings4, kEoB1, kPlatformDOS, kNoSpecial, EN_ANY, &kEoB1MagicStrings4DOSEnglishProvider },
+ { kEoBBaseMagicStrings6, kEoB1, kPlatformDOS, kNoSpecial, EN_ANY, &kEoB1MagicStrings6DOSEnglishProvider },
+ { kEoBBaseMagicStrings7, kEoB1, kPlatformDOS, kNoSpecial, EN_ANY, &kEoB1MagicStrings7DOSEnglishProvider },
+ { kEoBBaseMagicStrings8, kEoB1, kPlatformDOS, kNoSpecial, EN_ANY, &kEoB1MagicStrings8DOSEnglishProvider },
+ { kEoBBaseExpObjectTblIndex, kEoB1, kPlatformDOS, kNoSpecial, UNK_LANG, &kEoB1ExpObjectTblIndexDOSProvider },
+ { kEoBBaseExpObjectShpStart, kEoB1, kPlatformDOS, kNoSpecial, UNK_LANG, &kEoB1ExpObjectShpStartDOSProvider },
+ { kEoBBaseExpObjectTbl1, kEoB1, kPlatformDOS, kNoSpecial, UNK_LANG, &kEoB1ExpObjectTbl1DOSProvider },
+ { kEoBBaseExpObjectTbl2, kEoB1, kPlatformDOS, kNoSpecial, UNK_LANG, &kEoB1ExpObjectTbl2DOSProvider },
+ { kEoBBaseExpObjectTbl3, kEoB1, kPlatformDOS, kNoSpecial, UNK_LANG, &kEoB1ExpObjectTbl3DOSProvider },
+ { kEoBBaseExpObjectY, kEoB1, kPlatformDOS, kNoSpecial, UNK_LANG, &kEoB1ExpObjectYDOSProvider },
+ { kEoBBaseSparkDefSteps, kEoB1, kPlatformDOS, kNoSpecial, UNK_LANG, &kEoB1SparkDefStepsDOSProvider },
+ { kEoBBaseSparkDefSubSteps, kEoB1, kPlatformDOS, kNoSpecial, UNK_LANG, &kEoB1SparkDefSubStepsDOSProvider },
+ { kEoBBaseSparkDefShift, kEoB1, kPlatformDOS, kNoSpecial, UNK_LANG, &kEoB1SparkDefShiftDOSProvider },
+ { kEoBBaseSparkDefAdd, kEoB1, kPlatformDOS, kNoSpecial, UNK_LANG, &kEoB1SparkDefAddDOSProvider },
+ { kEoBBaseSparkDefX, kEoB1, kPlatformDOS, kNoSpecial, UNK_LANG, &kEoB1SparkDefXDOSProvider },
+ { kEoBBaseSparkDefY, kEoB1, kPlatformDOS, kNoSpecial, UNK_LANG, &kEoB1SparkDefYDOSProvider },
+ { kEoBBaseSparkOfFlags1, kEoB1, kPlatformDOS, kNoSpecial, UNK_LANG, &kEoB1SparkOfFlags1DOSProvider },
+ { kEoBBaseSparkOfFlags2, kEoB1, kPlatformDOS, kNoSpecial, UNK_LANG, &kEoB1SparkOfFlags2DOSProvider },
+ { kEoBBaseSparkOfShift, kEoB1, kPlatformDOS, kNoSpecial, UNK_LANG, &kEoB1SparkOfShiftDOSProvider },
+ { kEoBBaseSparkOfX, kEoB1, kPlatformDOS, kNoSpecial, UNK_LANG, &kEoB1SparkOfXDOSProvider },
+ { kEoBBaseSparkOfY, kEoB1, kPlatformDOS, kNoSpecial, UNK_LANG, &kEoB1SparkOfYDOSProvider },
+ { kEoBBaseSpellProperties, kEoB1, kPlatformDOS, kNoSpecial, UNK_LANG, &kEoB1SpellPropertiesDOSProvider },
+ { kEoBBaseMagicFlightProps, kEoB1, kPlatformDOS, kNoSpecial, UNK_LANG, &kEoB1MagicFlightPropsDOSProvider },
+ { kEoBBaseTurnUndeadEffect, kEoB1, kPlatformDOS, kNoSpecial, UNK_LANG, &kEoB1TurnUndeadEffectDOSProvider },
+ { kEoBBaseBurningHandsDest, kEoB1, kPlatformDOS, kNoSpecial, UNK_LANG, &kEoB1BurningHandsDestDOSProvider },
+ { kEoBBaseConeOfColdDest1, kEoB1, kPlatformDOS, kNoSpecial, UNK_LANG, &kEoB1ConeOfColdDest1DOSProvider },
+ { kEoBBaseConeOfColdDest2, kEoB1, kPlatformDOS, kNoSpecial, UNK_LANG, &kEoB1ConeOfColdDest2DOSProvider },
+ { kEoBBaseConeOfColdDest3, kEoB1, kPlatformDOS, kNoSpecial, UNK_LANG, &kEoB1ConeOfColdDest3DOSProvider },
+ { kEoBBaseConeOfColdDest4, kEoB1, kPlatformDOS, kNoSpecial, UNK_LANG, &kEoB1ConeOfColdDest4DOSProvider },
+ { kEoBBaseConeOfColdGfxTbl, kEoB1, kPlatformDOS, kNoSpecial, UNK_LANG, &kEoB1ConeOfColdGfxTblDOSProvider },
+ { kRpgCommonDscDoorShapeIndex, kEoB1, kPlatformDOS, kNoSpecial, UNK_LANG, &kEoB1DscDoorShapeIndexDOSProvider },
+ { kEoBBaseWllFlagPreset, kEoB1, kPlatformDOS, kNoSpecial, UNK_LANG, &kEoB1WllFlagPresetDOSProvider },
+ { kEoBBaseDscShapeCoords, kEoB1, kPlatformDOS, kNoSpecial, UNK_LANG, &kEoB1DscShapeCoordsDOSProvider },
+ { kEoBBaseDscDoorScaleOffs, kEoB1, kPlatformDOS, kNoSpecial, UNK_LANG, &kEoB1DscDoorScaleOffsDOSProvider },
+ { kEoBBaseDscDoorScaleMult1, kEoB1, kPlatformDOS, kNoSpecial, UNK_LANG, &kEoB1DscDoorScaleMult1DOSProvider },
+ { kEoBBaseDscDoorScaleMult2, kEoB1, kPlatformDOS, kNoSpecial, UNK_LANG, &kEoB1DscDoorScaleMult2DOSProvider },
+ { kEoBBaseDscDoorScaleMult3, kEoB1, kPlatformDOS, kNoSpecial, UNK_LANG, &kEoB1DscDoorScaleMult3DOSProvider },
+ { kEoBBaseDscDoorScaleMult4, kEoB1, kPlatformDOS, kNoSpecial, UNK_LANG, &kEoB1DscDoorScaleMult4DOSProvider },
+ { kEoBBaseDscDoorScaleMult5, kEoB1, kPlatformDOS, kNoSpecial, UNK_LANG, &kEoB1DscDoorScaleMult5DOSProvider },
+ { kEoBBaseDscDoorScaleMult6, kEoB1, kPlatformDOS, kNoSpecial, UNK_LANG, &kEoB1DscDoorScaleMult6DOSProvider },
+ { kEoBBaseDscDoorXE, kEoB1, kPlatformDOS, kNoSpecial, UNK_LANG, &kEoB1DscDoorXEDOSProvider },
+ { kEoBBaseDscDoorY1, kEoB1, kPlatformDOS, kNoSpecial, UNK_LANG, &kEoB1DscDoorY1DOSProvider },
+ { kEoBBaseDscDoorY3, kEoB1, kPlatformDOS, kNoSpecial, UNK_LANG, &kEoB1DscDoorY3DOSProvider },
+ { kEoBBaseDscDoorY4, kEoB1, kPlatformDOS, kNoSpecial, UNK_LANG, &kEoB1DscDoorY4DOSProvider },
+ { kEoBBaseDscDoorY5, kEoB1, kPlatformDOS, kNoSpecial, UNK_LANG, &kEoB1DscDoorY5DOSProvider },
+ { kEoBBaseDscDoorY6, kEoB1, kPlatformDOS, kNoSpecial, UNK_LANG, &kEoB1DscDoorY6DOSProvider },
+ { kEoBBaseDscDoorY7, kEoB1, kPlatformDOS, kNoSpecial, UNK_LANG, &kEoB1DscDoorY7DOSProvider },
+ { kEoBBaseDscDoorCoordsExt, kEoB1, kPlatformDOS, kNoSpecial, UNK_LANG, &kEoB1DscDoorCoordsExtDOSProvider },
+ { kRpgCommonDscDoorFrameY1, kEoB1, kPlatformDOS, kNoSpecial, UNK_LANG, &kEoB1DscDoorFrameY1DOSProvider },
+ { kRpgCommonDscDoorFrameY2, kEoB1, kPlatformDOS, kNoSpecial, UNK_LANG, &kEoB1DscDoorFrameY2DOSProvider },
+ { kRpgCommonDscDoorFrameIndex1, kEoB1, kPlatformDOS, kNoSpecial, UNK_LANG, &kEoB1DscDoorFrameIndex1DOSProvider },
+ { kRpgCommonDscDoorFrameIndex2, kEoB1, kPlatformDOS, kNoSpecial, UNK_LANG, &kEoB1DscDoorFrameIndex2DOSProvider },
+ { kEoBBaseDscItemPosIndex, kEoB1, kPlatformDOS, kNoSpecial, UNK_LANG, &kEoB1DscItemPosIndexDOSProvider },
+ { kEoBBaseDscItemShpX, kEoB1, kPlatformDOS, kNoSpecial, UNK_LANG, &kEoB1DscItemShpXDOSProvider },
+ { kEoBBaseDscItemScaleIndex, kEoB1, kPlatformDOS, kNoSpecial, UNK_LANG, &kEoB1DscItemScaleIndexDOSProvider },
+ { kEoBBaseDscItemTileIndex, kEoB1, kPlatformDOS, kNoSpecial, UNK_LANG, &kEoB1DscItemTileIndexDOSProvider },
+ { kEoBBaseDscItemShapeMap, kEoB1, kPlatformDOS, kNoSpecial, UNK_LANG, &kEoB1DscItemShapeMapDOSProvider },
+ { kEoBBaseDscTelptrShpCoords, kEoB1, kPlatformDOS, kNoSpecial, UNK_LANG, &kEoB1DscTelptrShpCoordsDOSProvider },
+ { kEoBBasePortalSeqData, kEoB1, kPlatformDOS, kNoSpecial, UNK_LANG, &kEoB1PortalSeqDataDOSProvider },
+ { kEoBBaseManDef, kEoB1, kPlatformDOS, kNoSpecial, EN_ANY, &kEoB1ManDefDOSEnglishProvider },
+ { kEoBBaseManWord, kEoB1, kPlatformDOS, kNoSpecial, EN_ANY, &kEoB1ManWordDOSEnglishProvider },
+ { kEoBBaseManPrompt, kEoB1, kPlatformDOS, kNoSpecial, EN_ANY, &kEoB1ManPromptDOSEnglishProvider },
+ { kEoBBaseDscMonsterFrmOffsTbl1, kEoB1, kPlatformDOS, kNoSpecial, UNK_LANG, &kEoB1DscMonsterFrmOffsTbl1DOSProvider },
+ { kEoBBaseDscMonsterFrmOffsTbl2, kEoB1, kPlatformDOS, kNoSpecial, UNK_LANG, &kEoB1DscMonsterFrmOffsTbl2DOSProvider },
+ { kEoBBaseInvSlotX, kEoB1, kPlatformDOS, kNoSpecial, UNK_LANG, &kEoB1InvSlotXDOSProvider },
+ { kEoBBaseInvSlotY, kEoB1, kPlatformDOS, kNoSpecial, UNK_LANG, &kEoB1InvSlotYDOSProvider },
+ { kEoBBaseSlotValidationFlags, kEoB1, kPlatformDOS, kNoSpecial, UNK_LANG, &kEoB1SlotValidationFlagsDOSProvider },
+ { kEoBBaseProjectileWeaponTypes, kEoB1, kPlatformDOS, kNoSpecial, UNK_LANG, &kEoB1ProjectileWeaponTypesDOSProvider },
+ { kEoBBaseWandTypes, kEoB1, kPlatformDOS, kNoSpecial, UNK_LANG, &kEoB1WandTypesDOSProvider },
+ { kEoBBaseDrawObjPosIndex, kEoB1, kPlatformDOS, kNoSpecial, UNK_LANG, &kEoB1DrawObjPosIndexDOSProvider },
+ { kEoBBaseFlightObjFlipIndex, kEoB1, kPlatformDOS, kNoSpecial, UNK_LANG, &kEoB1FlightObjFlipIndexDOSProvider },
+ { kEoBBaseFlightObjShpMap, kEoB1, kPlatformDOS, kNoSpecial, UNK_LANG, &kEoB1FlightObjShpMapDOSProvider },
+ { kEoBBaseFlightObjSclIndex, kEoB1, kPlatformDOS, kNoSpecial, UNK_LANG, &kEoB1FlightObjSclIndexDOSProvider },
+ { kRpgCommonDscShapeIndex, kEoB1, kPlatformDOS, kNoSpecial, UNK_LANG, &kEoB1DscShapeIndexDOSProvider },
+ { kRpgCommonDscX, kEoB1, kPlatformDOS, kNoSpecial, UNK_LANG, &kEoB1DscXDOSProvider },
+ { kRpgCommonDscTileIndex, kEoB1, kPlatformDOS, kNoSpecial, UNK_LANG, &kEoB1DscTileIndexDOSProvider },
+ { kRpgCommonDscUnk2, kEoB1, kPlatformDOS, kNoSpecial, UNK_LANG, &kEoB1DscUnk2DOSProvider },
+ { kRpgCommonDscDimData1, kEoB1, kPlatformDOS, kNoSpecial, UNK_LANG, &kEoB1DscDimData1DOSProvider },
+ { kRpgCommonDscDimData2, kEoB1, kPlatformDOS, kNoSpecial, UNK_LANG, &kEoB1DscDimData2DOSProvider },
+ { kRpgCommonDscBlockMap, kEoB1, kPlatformDOS, kNoSpecial, UNK_LANG, &kEoB1DscBlockMapDOSProvider },
+ { kRpgCommonDscDimMap, kEoB1, kPlatformDOS, kNoSpecial, UNK_LANG, &kEoB1DscDimMapDOSProvider },
+ { kRpgCommonDscBlockIndex, kEoB1, kPlatformDOS, kNoSpecial, UNK_LANG, &kEoB1DscBlockIndexDOSProvider },
+ { kEoBBaseClassModifierFlags, kEoB1, kPlatformDOS, kNoSpecial, UNK_LANG, &kEoB1ClassModifierFlagsDOSProvider },
+ { kEoBBaseMonsterStepTable01, kEoB1, kPlatformDOS, kNoSpecial, UNK_LANG, &kEoB1MonsterStepTable01DOSProvider },
+ { kEoBBaseMonsterStepTable2, kEoB1, kPlatformDOS, kNoSpecial, UNK_LANG, &kEoB1MonsterStepTable2DOSProvider },
+ { kEoBBaseMonsterStepTable3, kEoB1, kPlatformDOS, kNoSpecial, UNK_LANG, &kEoB1MonsterStepTable3DOSProvider },
+ { kEoBBaseMonsterCloseAttPosTable1, kEoB1, kPlatformDOS, kNoSpecial, UNK_LANG, &kEoB1MonsterCloseAttPosTable1DOSProvider },
+ { kEoBBaseMonsterCloseAttPosTable21, kEoB1, kPlatformDOS, kNoSpecial, UNK_LANG, &kEoB1MonsterCloseAttPosTable21DOSProvider },
+ { kEoBBaseMonsterCloseAttChkTable1, kEoB1, kPlatformDOS, kNoSpecial, UNK_LANG, &kEoB1MonsterCloseAttChkTable1DOSProvider },
+ { kEoBBaseMonsterCloseAttChkTable2, kEoB1, kPlatformDOS, kNoSpecial, UNK_LANG, &kEoB1MonsterCloseAttChkTable2DOSProvider },
+ { kEoBBaseMonsterCloseAttDstTable1, kEoB1, kPlatformDOS, kNoSpecial, UNK_LANG, &kEoB1MonsterCloseAttDstTable1DOSProvider },
+ { kEoBBaseMonsterCloseAttDstTable2, kEoB1, kPlatformDOS, kNoSpecial, UNK_LANG, &kEoB1MonsterCloseAttDstTable2DOSProvider },
+ { kEoBBaseMonsterProximityTable, kEoB1, kPlatformDOS, kNoSpecial, UNK_LANG, &kEoB1MonsterProximityTableDOSProvider },
+ { kEoBBaseFindBlockMonstersTable, kEoB1, kPlatformDOS, kNoSpecial, UNK_LANG, &kEoB1FindBlockMonstersTableDOSProvider },
+ { kEoBBaseMonsterDirChangeTable, kEoB1, kPlatformDOS, kNoSpecial, UNK_LANG, &kEoB1MonsterDirChangeTableDOSProvider },
+ { kEoBBaseMonsterDistAttStrings, kEoB1, kPlatformDOS, kNoSpecial, EN_ANY, &kEoB1MonsterDistAttStringsDOSEnglishProvider },
+ { kEoBBaseEncodeMonsterDefs, kEoB1, kPlatformDOS, kNoSpecial, UNK_LANG, &kEoB1EncodeMonsterDefsDOSProvider },
+ { kEoBBaseNpcPresets, kEoB1, kPlatformDOS, kNoSpecial, UNK_LANG, &kEoB1NpcPresetsDOSProvider },
+ { kEoBBaseChargenStrings1, kEoB1, kPlatformDOS, kNoSpecial, DE_DEU, &kEoB1ChargenStrings1DOSGermanProvider },
+ { kEoBBaseChargenStrings2, kEoB1, kPlatformDOS, kNoSpecial, DE_DEU, &kEoB1ChargenStrings2DOSGermanProvider },
+ { kEoBBaseChargenStatStrings, kEoB1, kPlatformDOS, kNoSpecial, DE_DEU, &kEoB1ChargenStatStringsDOSGermanProvider },
+ { kEoBBaseChargenRaceSexStrings, kEoB1, kPlatformDOS, kNoSpecial, DE_DEU, &kEoB1ChargenRaceSexStringsDOSGermanProvider },
+ { kEoBBaseChargenClassStrings, kEoB1, kPlatformDOS, kNoSpecial, DE_DEU, &kEoB1ChargenClassStringsDOSGermanProvider },
+ { kEoBBaseChargenAlignmentStrings, kEoB1, kPlatformDOS, kNoSpecial, DE_DEU, &kEoB1ChargenAlignmentStringsDOSGermanProvider },
+ { kEoBBaseChargenEnterGameStrings, kEoB1, kPlatformDOS, kNoSpecial, DE_DEU, &kEoB1ChargenEnterGameStringsDOSGermanProvider },
+ { kEoB1MainMenuStrings, kEoB1, kPlatformDOS, kNoSpecial, DE_DEU, &kEoB1MainMenuStringsDOSGermanProvider },
+ { kEoB1BonusStrings, kEoB1, kPlatformDOS, kNoSpecial, DE_DEU, &kEoB1BonusStringsDOSGermanProvider },
+ { kEoB1TurnUndeadString, kEoB1, kPlatformDOS, kNoSpecial, DE_DEU, &kEoB1TurnUndeadStringDOSGermanProvider },
+ { kEoB1Npc0Strings, kEoB1, kPlatformDOS, kNoSpecial, DE_DEU, &kEoB1Npc0StringsDOSGermanProvider },
+ { kEoB1Npc11Strings, kEoB1, kPlatformDOS, kNoSpecial, DE_DEU, &kEoB1Npc11StringsDOSGermanProvider },
+ { kEoB1Npc12Strings, kEoB1, kPlatformDOS, kNoSpecial, DE_DEU, &kEoB1Npc12StringsDOSGermanProvider },
+ { kEoB1Npc21Strings, kEoB1, kPlatformDOS, kNoSpecial, DE_DEU, &kEoB1Npc21StringsDOSGermanProvider },
+ { kEoB1Npc22Strings, kEoB1, kPlatformDOS, kNoSpecial, DE_DEU, &kEoB1Npc22StringsDOSGermanProvider },
+ { kEoB1Npc31Strings, kEoB1, kPlatformDOS, kNoSpecial, DE_DEU, &kEoB1Npc31StringsDOSGermanProvider },
+ { kEoB1Npc32Strings, kEoB1, kPlatformDOS, kNoSpecial, DE_DEU, &kEoB1Npc32StringsDOSGermanProvider },
+ { kEoB1Npc4Strings, kEoB1, kPlatformDOS, kNoSpecial, DE_DEU, &kEoB1Npc4StringsDOSGermanProvider },
+ { kEoB1Npc5Strings, kEoB1, kPlatformDOS, kNoSpecial, DE_DEU, &kEoB1Npc5StringsDOSGermanProvider },
+ { kEoB1Npc6Strings, kEoB1, kPlatformDOS, kNoSpecial, DE_DEU, &kEoB1Npc6StringsDOSGermanProvider },
+ { kEoB1Npc7Strings, kEoB1, kPlatformDOS, kNoSpecial, DE_DEU, &kEoB1Npc7StringsDOSGermanProvider },
+ { kEoBBasePryDoorStrings, kEoB1, kPlatformDOS, kNoSpecial, DE_DEU, &kEoB1PryDoorStringsDOSGermanProvider },
+ { kEoBBaseWarningStrings, kEoB1, kPlatformDOS, kNoSpecial, DE_DEU, &kEoB1WarningStringsDOSGermanProvider },
+ { kEoBBaseItemSuffixStringsRings, kEoB1, kPlatformDOS, kNoSpecial, DE_DEU, &kEoB1ItemSuffixStringsRingsDOSGermanProvider },
+ { kEoBBaseItemSuffixStringsPotions, kEoB1, kPlatformDOS, kNoSpecial, DE_DEU, &kEoB1ItemSuffixStringsPotionsDOSGermanProvider },
+ { kEoBBaseItemSuffixStringsWands, kEoB1, kPlatformDOS, kNoSpecial, DE_DEU, &kEoB1ItemSuffixStringsWandsDOSGermanProvider },
+ { kEoBBaseRipItemStrings, kEoB1, kPlatformDOS, kNoSpecial, DE_DEU, &kEoB1RipItemStringsDOSGermanProvider },
+ { kEoBBaseCursedString, kEoB1, kPlatformDOS, kNoSpecial, DE_DEU, &kEoB1CursedStringDOSGermanProvider },
+ { kEoBBaseMagicObjectStrings, kEoB1, kPlatformDOS, kNoSpecial, DE_DEU, &kEoB1MagicObjectStringsDOSGermanProvider },
+ { kEoBBaseMagicObjectString5, kEoB1, kPlatformDOS, kNoSpecial, DE_DEU, &kEoB1MagicObjectString5DOSGermanProvider },
+ { kEoBBasePatternSuffix, kEoB1, kPlatformDOS, kNoSpecial, DE_DEU, &kEoB1PatternSuffixDOSGermanProvider },
+ { kEoBBasePatternGrFix1, kEoB1, kPlatformDOS, kNoSpecial, DE_DEU, &kEoB1PatternGrFix1DOSGermanProvider },
+ { kEoBBasePatternGrFix2, kEoB1, kPlatformDOS, kNoSpecial, DE_DEU, &kEoB1PatternGrFix2DOSGermanProvider },
+ { kEoBBaseValidateArmorString, kEoB1, kPlatformDOS, kNoSpecial, DE_DEU, &kEoB1ValidateArmorStringDOSGermanProvider },
+ { kEoBBaseValidateNoDropString, kEoB1, kPlatformDOS, kNoSpecial, DE_DEU, &kEoB1ValidateNoDropStringDOSGermanProvider },
+ { kEoBBasePotionStrings, kEoB1, kPlatformDOS, kNoSpecial, DE_DEU, &kEoB1PotionStringsDOSGermanProvider },
+ { kEoBBaseWandStrings, kEoB1, kPlatformDOS, kNoSpecial, DE_DEU, &kEoB1WandStringsDOSGermanProvider },
+ { kEoBBaseItemMisuseStrings, kEoB1, kPlatformDOS, kNoSpecial, DE_DEU, &kEoB1ItemMisuseStringsDOSGermanProvider },
+ { kEoBBaseTakenStrings, kEoB1, kPlatformDOS, kNoSpecial, DE_DEU, &kEoB1TakenStringsDOSGermanProvider },
+ { kEoBBasePotionEffectStrings, kEoB1, kPlatformDOS, kNoSpecial, DE_DEU, &kEoB1PotionEffectStringsDOSGermanProvider },
+ { kEoBBaseYesNoStrings, kEoB1, kPlatformDOS, kNoSpecial, DE_DEU, &kEoB1YesNoStringsDOSGermanProvider },
+ { kRpgCommonMoreStrings, kEoB1, kPlatformDOS, kNoSpecial, DE_DEU, &kEoB1MoreStringsDOSGermanProvider },
+ { kEoBBaseNpcMaxStrings, kEoB1, kPlatformDOS, kNoSpecial, DE_DEU, &kEoB1NpcMaxStringsDOSGermanProvider },
+ { kEoBBaseNpcJoinStrings, kEoB1, kPlatformDOS, kNoSpecial, DE_DEU, &kEoB1NpcJoinStringsDOSGermanProvider },
+ { kEoBBaseCancelStrings, kEoB1, kPlatformDOS, kNoSpecial, DE_DEU, &kEoB1CancelStringsDOSGermanProvider },
+ { kEoBBaseMenuStringsMain, kEoB1, kPlatformDOS, kNoSpecial, DE_DEU, &kEoB1MenuStringsMainDOSGermanProvider },
+ { kEoBBaseMenuStringsSaveLoad, kEoB1, kPlatformDOS, kNoSpecial, DE_DEU, &kEoB1MenuStringsSaveLoadDOSGermanProvider },
+ { kEoBBaseMenuStringsOnOff, kEoB1, kPlatformDOS, kNoSpecial, DE_DEU, &kEoB1MenuStringsOnOffDOSGermanProvider },
+ { kEoBBaseMenuStringsSpells, kEoB1, kPlatformDOS, kNoSpecial, DE_DEU, &kEoB1MenuStringsSpellsDOSGermanProvider },
+ { kEoBBaseMenuStringsRest, kEoB1, kPlatformDOS, kNoSpecial, DE_DEU, &kEoB1MenuStringsRestDOSGermanProvider },
+ { kEoBBaseMenuStringsDrop, kEoB1, kPlatformDOS, kNoSpecial, DE_DEU, &kEoB1MenuStringsDropDOSGermanProvider },
+ { kEoBBaseMenuStringsExit, kEoB1, kPlatformDOS, kNoSpecial, DE_DEU, &kEoB1MenuStringsExitDOSGermanProvider },
+ { kEoBBaseMenuStringsStarve, kEoB1, kPlatformDOS, kNoSpecial, DE_DEU, &kEoB1MenuStringsStarveDOSGermanProvider },
+ { kEoBBaseMenuStringsScribe, kEoB1, kPlatformDOS, kNoSpecial, DE_DEU, &kEoB1MenuStringsScribeDOSGermanProvider },
+ { kEoBBaseMenuStringsDrop2, kEoB1, kPlatformDOS, kNoSpecial, DE_DEU, &kEoB1MenuStringsDrop2DOSGermanProvider },
+ { kEoBBaseMenuStringsHead, kEoB1, kPlatformDOS, kNoSpecial, DE_DEU, &kEoB1MenuStringsHeadDOSGermanProvider },
+ { kEoBBaseMenuStringsPoison, kEoB1, kPlatformDOS, kNoSpecial, DE_DEU, &kEoB1MenuStringsPoisonDOSGermanProvider },
+ { kEoBBaseMenuStringsMgc, kEoB1, kPlatformDOS, kNoSpecial, DE_DEU, &kEoB1MenuStringsMgcDOSGermanProvider },
+ { kEoBBaseMenuStringsPrefs, kEoB1, kPlatformDOS, kNoSpecial, DE_DEU, &kEoB1MenuStringsPrefsDOSGermanProvider },
+ { kEoBBaseMenuStringsRest2, kEoB1, kPlatformDOS, kNoSpecial, DE_DEU, &kEoB1MenuStringsRest2DOSGermanProvider },
+ { kEoBBaseMenuStringsRest4, kEoB1, kPlatformDOS, kNoSpecial, DE_DEU, &kEoB1MenuStringsRest4DOSGermanProvider },
+ { kEoBBaseMenuStringsDefeat, kEoB1, kPlatformDOS, kNoSpecial, DE_DEU, &kEoB1MenuStringsDefeatDOSGermanProvider },
+ { kEoBBaseMenuYesNoStrings, kEoB1, kPlatformDOS, kNoSpecial, DE_DEU, &kEoB1MenuYesNoStringsDOSGermanProvider },
+ { kEoBBaseCharGuiStringsHp, kEoB1, kPlatformDOS, kNoSpecial, DE_DEU, &kEoB1CharGuiStringsHpDOSGermanProvider },
+ { kEoBBaseCharGuiStringsWp1, kEoB1, kPlatformDOS, kNoSpecial, DE_DEU, &kEoB1CharGuiStringsWp1DOSGermanProvider },
+ { kEoBBaseCharGuiStringsWr, kEoB1, kPlatformDOS, kNoSpecial, DE_DEU, &kEoB1CharGuiStringsWrDOSGermanProvider },
+ { kEoBBaseCharGuiStringsSt1, kEoB1, kPlatformDOS, kNoSpecial, DE_DEU, &kEoB1CharGuiStringsSt1DOSGermanProvider },
+ { kEoBBaseCharGuiStringsIn, kEoB1, kPlatformDOS, kNoSpecial, DE_DEU, &kEoB1CharGuiStringsInDOSGermanProvider },
+ { kEoBBaseCharStatusStrings7, kEoB1, kPlatformDOS, kNoSpecial, DE_DEU, &kEoB1CharStatusStrings7DOSGermanProvider },
+ { kEoBBaseCharStatusStrings81, kEoB1, kPlatformDOS, kNoSpecial, DE_DEU, &kEoB1CharStatusStrings81DOSGermanProvider },
+ { kEoBBaseCharStatusStrings9, kEoB1, kPlatformDOS, kNoSpecial, DE_DEU, &kEoB1CharStatusStrings9DOSGermanProvider },
+ { kEoBBaseCharStatusStrings131, kEoB1, kPlatformDOS, kNoSpecial, DE_DEU, &kEoB1CharStatusStrings131DOSGermanProvider },
+ { kEoBBaseLevelGainStrings, kEoB1, kPlatformDOS, kNoSpecial, DE_DEU, &kEoB1LevelGainStringsDOSGermanProvider },
+ { kEoBBaseBookNumbers, kEoB1, kPlatformDOS, kNoSpecial, DE_DEU, &kEoB1BookNumbersDOSGermanProvider },
+ { kEoBBaseMageSpellsList, kEoB1, kPlatformDOS, kNoSpecial, DE_DEU, &kEoB1MageSpellsListDOSGermanProvider },
+ { kEoBBaseClericSpellsList, kEoB1, kPlatformDOS, kNoSpecial, DE_DEU, &kEoB1ClericSpellsListDOSGermanProvider },
+ { kEoBBaseSpellNames, kEoB1, kPlatformDOS, kNoSpecial, DE_DEU, &kEoB1SpellNamesDOSGermanProvider },
+ { kEoBBaseMagicStrings1, kEoB1, kPlatformDOS, kNoSpecial, DE_DEU, &kEoB1MagicStrings1DOSGermanProvider },
+ { kEoBBaseMagicStrings2, kEoB1, kPlatformDOS, kNoSpecial, DE_DEU, &kEoB1MagicStrings2DOSGermanProvider },
+ { kEoBBaseMagicStrings3, kEoB1, kPlatformDOS, kNoSpecial, DE_DEU, &kEoB1MagicStrings3DOSGermanProvider },
+ { kEoBBaseMagicStrings4, kEoB1, kPlatformDOS, kNoSpecial, DE_DEU, &kEoB1MagicStrings4DOSGermanProvider },
+ { kEoBBaseMagicStrings6, kEoB1, kPlatformDOS, kNoSpecial, DE_DEU, &kEoB1MagicStrings6DOSGermanProvider },
+ { kEoBBaseMagicStrings7, kEoB1, kPlatformDOS, kNoSpecial, DE_DEU, &kEoB1MagicStrings7DOSGermanProvider },
+ { kEoBBaseMagicStrings8, kEoB1, kPlatformDOS, kNoSpecial, DE_DEU, &kEoB1MagicStrings8DOSGermanProvider },
+ { kEoBBaseManDef, kEoB1, kPlatformDOS, kNoSpecial, DE_DEU, &kEoB1ManDefDOSGermanProvider },
+ { kEoBBaseManWord, kEoB1, kPlatformDOS, kNoSpecial, DE_DEU, &kEoB1ManWordDOSGermanProvider },
+ { kEoBBaseManPrompt, kEoB1, kPlatformDOS, kNoSpecial, DE_DEU, &kEoB1ManPromptDOSGermanProvider },
+ { kEoBBaseMonsterDistAttStrings, kEoB1, kPlatformDOS, kNoSpecial, DE_DEU, &kEoB1MonsterDistAttStringsDOSGermanProvider },
+ { kEoBBaseChargenStrings1, kEoB2, kPlatformDOS, kNoSpecial, EN_ANY, &kEoB2ChargenStrings1DOSEnglishProvider },
+ { kEoBBaseChargenStrings2, kEoB2, kPlatformDOS, kNoSpecial, EN_ANY, &kEoB2ChargenStrings2DOSEnglishProvider },
+ { kEoBBaseChargenStartLevels, kEoB2, kPlatformDOS, kNoSpecial, UNK_LANG, &kEoB2ChargenStartLevelsDOSProvider },
+ { kEoBBaseChargenStatStrings, kEoB2, kPlatformDOS, kNoSpecial, EN_ANY, &kEoB2ChargenStatStringsDOSEnglishProvider },
+ { kEoBBaseChargenRaceSexStrings, kEoB2, kPlatformDOS, kNoSpecial, EN_ANY, &kEoB2ChargenRaceSexStringsDOSEnglishProvider },
+ { kEoBBaseChargenClassStrings, kEoB2, kPlatformDOS, kNoSpecial, EN_ANY, &kEoB2ChargenClassStringsDOSEnglishProvider },
+ { kEoBBaseChargenAlignmentStrings, kEoB2, kPlatformDOS, kNoSpecial, EN_ANY, &kEoB2ChargenAlignmentStringsDOSEnglishProvider },
+ { kEoBBaseChargenEnterGameStrings, kEoB2, kPlatformDOS, kNoSpecial, EN_ANY, &kEoB2ChargenEnterGameStringsDOSEnglishProvider },
+ { kEoBBaseChargenClassMinStats, kEoB2, kPlatformDOS, kNoSpecial, UNK_LANG, &kEoB2ChargenClassMinStatsDOSProvider },
+ { kEoBBaseChargenRaceMinStats, kEoB2, kPlatformDOS, kNoSpecial, UNK_LANG, &kEoB2ChargenRaceMinStatsDOSProvider },
+ { kEoBBaseChargenRaceMaxStats, kEoB2, kPlatformDOS, kNoSpecial, UNK_LANG, &kEoB2ChargenRaceMaxStatsDOSProvider },
+ { kEoBBaseSaveThrowTable1, kEoB2, kPlatformDOS, kNoSpecial, UNK_LANG, &kEoB2SaveThrowTable1DOSProvider },
+ { kEoBBaseSaveThrowTable2, kEoB2, kPlatformDOS, kNoSpecial, UNK_LANG, &kEoB2SaveThrowTable2DOSProvider },
+ { kEoBBaseSaveThrowTable3, kEoB2, kPlatformDOS, kNoSpecial, UNK_LANG, &kEoB2SaveThrowTable3DOSProvider },
+ { kEoBBaseSaveThrowTable4, kEoB2, kPlatformDOS, kNoSpecial, UNK_LANG, &kEoB2SaveThrowTable4DOSProvider },
+ { kEoBBaseSaveThrwLvlIndex, kEoB2, kPlatformDOS, kNoSpecial, UNK_LANG, &kEoB2SaveThrwLvlIndexDOSProvider },
+ { kEoBBaseSaveThrwModDiv, kEoB2, kPlatformDOS, kNoSpecial, UNK_LANG, &kEoB2SaveThrwModDivDOSProvider },
+ { kEoBBaseSaveThrwModExt, kEoB2, kPlatformDOS, kNoSpecial, UNK_LANG, &kEoB2SaveThrwModExtDOSProvider },
+ { kEoBBasePryDoorStrings, kEoB2, kPlatformDOS, kNoSpecial, EN_ANY, &kEoB2PryDoorStringsDOSEnglishProvider },
+ { kEoBBaseWarningStrings, kEoB2, kPlatformDOS, kNoSpecial, EN_ANY, &kEoB2WarningStringsDOSEnglishProvider },
+ { kEoBBaseItemSuffixStringsRings, kEoB2, kPlatformDOS, kNoSpecial, EN_ANY, &kEoB2ItemSuffixStringsRingsDOSEnglishProvider },
+ { kEoBBaseItemSuffixStringsPotions, kEoB2, kPlatformDOS, kNoSpecial, EN_ANY, &kEoB2ItemSuffixStringsPotionsDOSEnglishProvider },
+ { kEoBBaseItemSuffixStringsWands, kEoB2, kPlatformDOS, kNoSpecial, EN_ANY, &kEoB2ItemSuffixStringsWandsDOSEnglishProvider },
+ { kEoBBaseRipItemStrings, kEoB2, kPlatformDOS, kNoSpecial, EN_ANY, &kEoB2RipItemStringsDOSEnglishProvider },
+ { kEoBBaseCursedString, kEoB2, kPlatformDOS, kNoSpecial, EN_ANY, &kEoB2CursedStringDOSEnglishProvider },
+ { kEoBBaseEnchantedString, kEoB2, kPlatformDOS, kNoSpecial, UNK_LANG, &kEoB2EnchantedStringDOSProvider },
+ { kEoBBaseMagicObjectStrings, kEoB2, kPlatformDOS, kNoSpecial, EN_ANY, &kEoB2MagicObjectStringsDOSEnglishProvider },
+ { kEoBBaseMagicObjectString5, kEoB2, kPlatformDOS, kNoSpecial, EN_ANY, &kEoB2MagicObjectString5DOSEnglishProvider },
+ { kEoBBasePatternSuffix, kEoB2, kPlatformDOS, kNoSpecial, EN_ANY, &kEoB2PatternSuffixDOSEnglishProvider },
+ { kEoBBasePatternGrFix1, kEoB2, kPlatformDOS, kNoSpecial, EN_ANY, &kEoB2PatternGrFix1DOSEnglishProvider },
+ { kEoBBasePatternGrFix2, kEoB2, kPlatformDOS, kNoSpecial, EN_ANY, &kEoB2PatternGrFix2DOSEnglishProvider },
+ { kEoBBaseValidateArmorString, kEoB2, kPlatformDOS, kNoSpecial, EN_ANY, &kEoB2ValidateArmorStringDOSEnglishProvider },
+ { kEoBBaseValidateCursedString, kEoB2, kPlatformDOS, kNoSpecial, EN_ANY, &kEoB2ValidateCursedStringDOSEnglishProvider },
+ { kEoBBaseValidateNoDropString, kEoB2, kPlatformDOS, kNoSpecial, EN_ANY, &kEoB2ValidateNoDropStringDOSEnglishProvider },
+ { kEoBBasePotionStrings, kEoB2, kPlatformDOS, kNoSpecial, EN_ANY, &kEoB2PotionStringsDOSEnglishProvider },
+ { kEoBBaseWandStrings, kEoB2, kPlatformDOS, kNoSpecial, EN_ANY, &kEoB2WandStringsDOSEnglishProvider },
+ { kEoBBaseItemMisuseStrings, kEoB2, kPlatformDOS, kNoSpecial, EN_ANY, &kEoB2ItemMisuseStringsDOSEnglishProvider },
+ { kEoBBaseTakenStrings, kEoB2, kPlatformDOS, kNoSpecial, EN_ANY, &kEoB2TakenStringsDOSEnglishProvider },
+ { kEoBBasePotionEffectStrings, kEoB2, kPlatformDOS, kNoSpecial, EN_ANY, &kEoB2PotionEffectStringsDOSEnglishProvider },
+ { kEoBBaseYesNoStrings, kEoB2, kPlatformDOS, kNoSpecial, EN_ANY, &kEoB2YesNoStringsDOSEnglishProvider },
+ { kRpgCommonMoreStrings, kEoB2, kPlatformDOS, kNoSpecial, EN_ANY, &kEoB2MoreStringsDOSEnglishProvider },
+ { kEoBBaseNpcMaxStrings, kEoB2, kPlatformDOS, kNoSpecial, EN_ANY, &kEoB2NpcMaxStringsDOSEnglishProvider },
+ { kEoBBaseOkStrings, kEoB2, kPlatformDOS, kNoSpecial, EN_ANY, &kEoB2OkStringsDOSEnglishProvider },
+ { kEoBBaseNpcJoinStrings, kEoB2, kPlatformDOS, kNoSpecial, EN_ANY, &kEoB2NpcJoinStringsDOSEnglishProvider },
+ { kEoBBaseCancelStrings, kEoB2, kPlatformDOS, kNoSpecial, EN_ANY, &kEoB2CancelStringsDOSEnglishProvider },
+ { kEoBBaseAbortStrings, kEoB2, kPlatformDOS, kNoSpecial, EN_ANY, &kEoB2AbortStringsDOSEnglishProvider },
+ { kEoBBaseMenuStringsMain, kEoB2, kPlatformDOS, kNoSpecial, EN_ANY, &kEoB2MenuStringsMainDOSEnglishProvider },
+ { kEoBBaseMenuStringsSaveLoad, kEoB2, kPlatformDOS, kNoSpecial, EN_ANY, &kEoB2MenuStringsSaveLoadDOSEnglishProvider },
+ { kEoBBaseMenuStringsOnOff, kEoB2, kPlatformDOS, kNoSpecial, EN_ANY, &kEoB2MenuStringsOnOffDOSEnglishProvider },
+ { kEoBBaseMenuStringsSpells, kEoB2, kPlatformDOS, kNoSpecial, EN_ANY, &kEoB2MenuStringsSpellsDOSEnglishProvider },
+ { kEoBBaseMenuStringsRest, kEoB2, kPlatformDOS, kNoSpecial, EN_ANY, &kEoB2MenuStringsRestDOSEnglishProvider },
+ { kEoBBaseMenuStringsDrop, kEoB2, kPlatformDOS, kNoSpecial, EN_ANY, &kEoB2MenuStringsDropDOSEnglishProvider },
+ { kEoBBaseMenuStringsExit, kEoB2, kPlatformDOS, kNoSpecial, EN_ANY, &kEoB2MenuStringsExitDOSEnglishProvider },
+ { kEoBBaseMenuStringsStarve, kEoB2, kPlatformDOS, kNoSpecial, EN_ANY, &kEoB2MenuStringsStarveDOSEnglishProvider },
+ { kEoBBaseMenuStringsScribe, kEoB2, kPlatformDOS, kNoSpecial, EN_ANY, &kEoB2MenuStringsScribeDOSEnglishProvider },
+ { kEoBBaseMenuStringsDrop2, kEoB2, kPlatformDOS, kNoSpecial, EN_ANY, &kEoB2MenuStringsDrop2DOSEnglishProvider },
+ { kEoBBaseMenuStringsHead, kEoB2, kPlatformDOS, kNoSpecial, EN_ANY, &kEoB2MenuStringsHeadDOSEnglishProvider },
+ { kEoBBaseMenuStringsPoison, kEoB2, kPlatformDOS, kNoSpecial, EN_ANY, &kEoB2MenuStringsPoisonDOSEnglishProvider },
+ { kEoBBaseMenuStringsMgc, kEoB2, kPlatformDOS, kNoSpecial, EN_ANY, &kEoB2MenuStringsMgcDOSEnglishProvider },
+ { kEoBBaseMenuStringsPrefs, kEoB2, kPlatformDOS, kNoSpecial, EN_ANY, &kEoB2MenuStringsPrefsDOSEnglishProvider },
+ { kEoBBaseMenuStringsRest2, kEoB2, kPlatformDOS, kNoSpecial, EN_ANY, &kEoB2MenuStringsRest2DOSEnglishProvider },
+ { kEoBBaseMenuStringsRest3, kEoB2, kPlatformDOS, kNoSpecial, EN_ANY, &kEoB2MenuStringsRest3DOSEnglishProvider },
+ { kEoBBaseMenuStringsRest4, kEoB2, kPlatformDOS, kNoSpecial, EN_ANY, &kEoB2MenuStringsRest4DOSEnglishProvider },
+ { kEoBBaseMenuStringsDefeat, kEoB2, kPlatformDOS, kNoSpecial, EN_ANY, &kEoB2MenuStringsDefeatDOSEnglishProvider },
+ { kEoBBaseMenuStringsTransfer, kEoB2, kPlatformDOS, kNoSpecial, EN_ANY, &kEoB2MenuStringsTransferDOSEnglishProvider },
+ { kEoBBaseMenuStringsSpec, kEoB2, kPlatformDOS, kNoSpecial, EN_ANY, &kEoB2MenuStringsSpecDOSEnglishProvider },
+ { kEoBBaseMenuStringsSpellNo, kEoB2, kPlatformDOS, kNoSpecial, UNK_LANG, &kEoB2MenuStringsSpellNoDOSProvider },
+ { kEoBBaseMenuYesNoStrings, kEoB2, kPlatformDOS, kNoSpecial, EN_ANY, &kEoB2MenuYesNoStringsDOSEnglishProvider },
+ { kEoBBaseSpellLevelsMage, kEoB2, kPlatformDOS, kNoSpecial, UNK_LANG, &kEoB2SpellLevelsMageDOSProvider },
+ { kEoBBaseSpellLevelsCleric, kEoB2, kPlatformDOS, kNoSpecial, UNK_LANG, &kEoB2SpellLevelsClericDOSProvider },
+ { kEoBBaseNumSpellsCleric, kEoB2, kPlatformDOS, kNoSpecial, UNK_LANG, &kEoB2NumSpellsClericDOSProvider },
+ { kEoBBaseNumSpellsWisAdj, kEoB2, kPlatformDOS, kNoSpecial, UNK_LANG, &kEoB2NumSpellsWisAdjDOSProvider },
+ { kEoBBaseNumSpellsPal, kEoB2, kPlatformDOS, kNoSpecial, UNK_LANG, &kEoB2NumSpellsPalDOSProvider },
+ { kEoBBaseNumSpellsMage, kEoB2, kPlatformDOS, kNoSpecial, UNK_LANG, &kEoB2NumSpellsMageDOSProvider },
+ { kEoBBaseCharGuiStringsHp, kEoB2, kPlatformDOS, kNoSpecial, EN_ANY, &kEoB2CharGuiStringsHpDOSEnglishProvider },
+ { kEoBBaseCharGuiStringsWp2, kEoB2, kPlatformDOS, kNoSpecial, EN_ANY, &kEoB2CharGuiStringsWp2DOSEnglishProvider },
+ { kEoBBaseCharGuiStringsWr, kEoB2, kPlatformDOS, kNoSpecial, EN_ANY, &kEoB2CharGuiStringsWrDOSEnglishProvider },
+ { kEoBBaseCharGuiStringsSt2, kEoB2, kPlatformDOS, kNoSpecial, EN_ANY, &kEoB2CharGuiStringsSt2DOSEnglishProvider },
+ { kEoBBaseCharGuiStringsIn, kEoB2, kPlatformDOS, kNoSpecial, EN_ANY, &kEoB2CharGuiStringsInDOSEnglishProvider },
+ { kEoBBaseCharStatusStrings7, kEoB2, kPlatformDOS, kNoSpecial, EN_ANY, &kEoB2CharStatusStrings7DOSEnglishProvider },
+ { kEoBBaseCharStatusStrings82, kEoB2, kPlatformDOS, kNoSpecial, EN_ANY, &kEoB2CharStatusStrings82DOSEnglishProvider },
+ { kEoBBaseCharStatusStrings9, kEoB2, kPlatformDOS, kNoSpecial, EN_ANY, &kEoB2CharStatusStrings9DOSEnglishProvider },
+ { kEoBBaseCharStatusStrings12, kEoB2, kPlatformDOS, kNoSpecial, EN_ANY, &kEoB2CharStatusStrings12DOSEnglishProvider },
+ { kEoBBaseCharStatusStrings132, kEoB2, kPlatformDOS, kNoSpecial, EN_ANY, &kEoB2CharStatusStrings132DOSEnglishProvider },
+ { kEoBBaseLevelGainStrings, kEoB2, kPlatformDOS, kNoSpecial, EN_ANY, &kEoB2LevelGainStringsDOSEnglishProvider },
+ { kEoBBaseExperienceTable0, kEoB2, kPlatformDOS, kNoSpecial, UNK_LANG, &kEoB2ExperienceTable0DOSProvider },
+ { kEoBBaseExperienceTable1, kEoB2, kPlatformDOS, kNoSpecial, UNK_LANG, &kEoB2ExperienceTable1DOSProvider },
+ { kEoBBaseExperienceTable2, kEoB2, kPlatformDOS, kNoSpecial, UNK_LANG, &kEoB2ExperienceTable2DOSProvider },
+ { kEoBBaseExperienceTable3, kEoB2, kPlatformDOS, kNoSpecial, UNK_LANG, &kEoB2ExperienceTable3DOSProvider },
+ { kEoBBaseExperienceTable4, kEoB2, kPlatformDOS, kNoSpecial, UNK_LANG, &kEoB2ExperienceTable4DOSProvider },
+ { kEoBBaseBookNumbers, kEoB2, kPlatformDOS, kNoSpecial, EN_ANY, &kEoB2BookNumbersDOSEnglishProvider },
+ { kEoBBaseMageSpellsList, kEoB2, kPlatformDOS, kNoSpecial, EN_ANY, &kEoB2MageSpellsListDOSEnglishProvider },
+ { kEoBBaseClericSpellsList, kEoB2, kPlatformDOS, kNoSpecial, EN_ANY, &kEoB2ClericSpellsListDOSEnglishProvider },
+ { kEoBBaseSpellNames, kEoB2, kPlatformDOS, kNoSpecial, EN_ANY, &kEoB2SpellNamesDOSEnglishProvider },
+ { kEoBBaseMagicStrings1, kEoB2, kPlatformDOS, kNoSpecial, EN_ANY, &kEoB2MagicStrings1DOSEnglishProvider },
+ { kEoBBaseMagicStrings2, kEoB2, kPlatformDOS, kNoSpecial, EN_ANY, &kEoB2MagicStrings2DOSEnglishProvider },
+ { kEoBBaseMagicStrings3, kEoB2, kPlatformDOS, kNoSpecial, EN_ANY, &kEoB2MagicStrings3DOSEnglishProvider },
+ { kEoBBaseMagicStrings4, kEoB2, kPlatformDOS, kNoSpecial, EN_ANY, &kEoB2MagicStrings4DOSEnglishProvider },
+ { kEoBBaseMagicStrings6, kEoB2, kPlatformDOS, kNoSpecial, EN_ANY, &kEoB2MagicStrings6DOSEnglishProvider },
+ { kEoBBaseMagicStrings7, kEoB2, kPlatformDOS, kNoSpecial, EN_ANY, &kEoB2MagicStrings7DOSEnglishProvider },
+ { kEoBBaseMagicStrings8, kEoB2, kPlatformDOS, kNoSpecial, EN_ANY, &kEoB2MagicStrings8DOSEnglishProvider },
+ { kEoBBaseExpObjectTlMode, kEoB2, kPlatformDOS, kNoSpecial, UNK_LANG, &kEoB2ExpObjectTlModeDOSProvider },
+ { kEoBBaseExpObjectTblIndex, kEoB2, kPlatformDOS, kNoSpecial, UNK_LANG, &kEoB2ExpObjectTblIndexDOSProvider },
+ { kEoBBaseExpObjectShpStart, kEoB2, kPlatformDOS, kNoSpecial, UNK_LANG, &kEoB2ExpObjectShpStartDOSProvider },
+ { kEoBBaseExpObjectTbl1, kEoB2, kPlatformDOS, kNoSpecial, UNK_LANG, &kEoB2ExpObjectTbl1DOSProvider },
+ { kEoBBaseExpObjectTbl2, kEoB2, kPlatformDOS, kNoSpecial, UNK_LANG, &kEoB2ExpObjectTbl2DOSProvider },
+ { kEoBBaseExpObjectTbl3, kEoB2, kPlatformDOS, kNoSpecial, UNK_LANG, &kEoB2ExpObjectTbl3DOSProvider },
+ { kEoBBaseExpObjectY, kEoB2, kPlatformDOS, kNoSpecial, UNK_LANG, &kEoB2ExpObjectYDOSProvider },
+ { kEoBBaseSparkDefSteps, kEoB2, kPlatformDOS, kNoSpecial, UNK_LANG, &kEoB2SparkDefStepsDOSProvider },
+ { kEoBBaseSparkDefSubSteps, kEoB2, kPlatformDOS, kNoSpecial, UNK_LANG, &kEoB2SparkDefSubStepsDOSProvider },
+ { kEoBBaseSparkDefShift, kEoB2, kPlatformDOS, kNoSpecial, UNK_LANG, &kEoB2SparkDefShiftDOSProvider },
+ { kEoBBaseSparkDefAdd, kEoB2, kPlatformDOS, kNoSpecial, UNK_LANG, &kEoB2SparkDefAddDOSProvider },
+ { kEoBBaseSparkDefX, kEoB2, kPlatformDOS, kNoSpecial, UNK_LANG, &kEoB2SparkDefXDOSProvider },
+ { kEoBBaseSparkDefY, kEoB2, kPlatformDOS, kNoSpecial, UNK_LANG, &kEoB2SparkDefYDOSProvider },
+ { kEoBBaseSparkOfFlags1, kEoB2, kPlatformDOS, kNoSpecial, UNK_LANG, &kEoB2SparkOfFlags1DOSProvider },
+ { kEoBBaseSparkOfFlags2, kEoB2, kPlatformDOS, kNoSpecial, UNK_LANG, &kEoB2SparkOfFlags2DOSProvider },
+ { kEoBBaseSparkOfShift, kEoB2, kPlatformDOS, kNoSpecial, UNK_LANG, &kEoB2SparkOfShiftDOSProvider },
+ { kEoBBaseSparkOfX, kEoB2, kPlatformDOS, kNoSpecial, UNK_LANG, &kEoB2SparkOfXDOSProvider },
+ { kEoBBaseSparkOfY, kEoB2, kPlatformDOS, kNoSpecial, UNK_LANG, &kEoB2SparkOfYDOSProvider },
+ { kEoBBaseSpellProperties, kEoB2, kPlatformDOS, kNoSpecial, UNK_LANG, &kEoB2SpellPropertiesDOSProvider },
+ { kEoBBaseMagicFlightProps, kEoB2, kPlatformDOS, kNoSpecial, UNK_LANG, &kEoB2MagicFlightPropsDOSProvider },
+ { kEoBBaseTurnUndeadEffect, kEoB2, kPlatformDOS, kNoSpecial, UNK_LANG, &kEoB2TurnUndeadEffectDOSProvider },
+ { kEoBBaseBurningHandsDest, kEoB2, kPlatformDOS, kNoSpecial, UNK_LANG, &kEoB2BurningHandsDestDOSProvider },
+ { kEoBBaseConeOfColdDest1, kEoB2, kPlatformDOS, kNoSpecial, UNK_LANG, &kEoB2ConeOfColdDest1DOSProvider },
+ { kEoBBaseConeOfColdDest2, kEoB2, kPlatformDOS, kNoSpecial, UNK_LANG, &kEoB2ConeOfColdDest2DOSProvider },
+ { kEoBBaseConeOfColdDest3, kEoB2, kPlatformDOS, kNoSpecial, UNK_LANG, &kEoB2ConeOfColdDest3DOSProvider },
+ { kEoBBaseConeOfColdDest4, kEoB2, kPlatformDOS, kNoSpecial, UNK_LANG, &kEoB2ConeOfColdDest4DOSProvider },
+ { kEoBBaseConeOfColdGfxTbl, kEoB2, kPlatformDOS, kNoSpecial, UNK_LANG, &kEoB2ConeOfColdGfxTblDOSProvider },
+ { kRpgCommonDscDoorShapeIndex, kEoB2, kPlatformDOS, kNoSpecial, UNK_LANG, &kEoB2DscDoorShapeIndexDOSProvider },
+ { kEoBBaseWllFlagPreset, kEoB2, kPlatformDOS, kNoSpecial, UNK_LANG, &kEoB2WllFlagPresetDOSProvider },
+ { kEoBBaseDscShapeCoords, kEoB2, kPlatformDOS, kNoSpecial, UNK_LANG, &kEoB2DscShapeCoordsDOSProvider },
+ { kEoBBaseDscDoorScaleOffs, kEoB2, kPlatformDOS, kNoSpecial, UNK_LANG, &kEoB2DscDoorScaleOffsDOSProvider },
+ { kEoBBaseDscDoorScaleMult1, kEoB2, kPlatformDOS, kNoSpecial, UNK_LANG, &kEoB2DscDoorScaleMult1DOSProvider },
+ { kEoBBaseDscDoorScaleMult2, kEoB2, kPlatformDOS, kNoSpecial, UNK_LANG, &kEoB2DscDoorScaleMult2DOSProvider },
+ { kEoBBaseDscDoorScaleMult3, kEoB2, kPlatformDOS, kNoSpecial, UNK_LANG, &kEoB2DscDoorScaleMult3DOSProvider },
+ { kEoBBaseDscDoorType5Offs, kEoB2, kPlatformDOS, kNoSpecial, UNK_LANG, &kEoB2DscDoorType5OffsDOSProvider },
+ { kEoBBaseDscDoorY1, kEoB2, kPlatformDOS, kNoSpecial, UNK_LANG, &kEoB2DscDoorY1DOSProvider },
+ { kRpgCommonDscDoorY2, kEoB2, kPlatformDOS, kNoSpecial, UNK_LANG, &kEoB2DscDoorY2DOSProvider },
+ { kRpgCommonDscDoorFrameY1, kEoB2, kPlatformDOS, kNoSpecial, UNK_LANG, &kEoB2DscDoorFrameY1DOSProvider },
+ { kRpgCommonDscDoorFrameY2, kEoB2, kPlatformDOS, kNoSpecial, UNK_LANG, &kEoB2DscDoorFrameY2DOSProvider },
+ { kEoBBaseDscItemPosIndex, kEoB2, kPlatformDOS, kNoSpecial, UNK_LANG, &kEoB2DscItemPosIndexDOSProvider },
+ { kEoBBaseDscItemShpX, kEoB2, kPlatformDOS, kNoSpecial, UNK_LANG, &kEoB2DscItemShpXDOSProvider },
+ { kEoBBaseDscItemScaleIndex, kEoB2, kPlatformDOS, kNoSpecial, UNK_LANG, &kEoB2DscItemScaleIndexDOSProvider },
+ { kEoBBaseDscItemTileIndex, kEoB2, kPlatformDOS, kNoSpecial, UNK_LANG, &kEoB2DscItemTileIndexDOSProvider },
+ { kEoBBaseDscItemShapeMap, kEoB2, kPlatformDOS, kNoSpecial, UNK_LANG, &kEoB2DscItemShapeMapDOSProvider },
+ { kEoBBaseDscTelptrShpCoords, kEoB2, kPlatformDOS, kNoSpecial, UNK_LANG, &kEoB2DscTelptrShpCoordsDOSProvider },
+ { kEoBBasePortalSeqData, kEoB2, kPlatformDOS, kNoSpecial, UNK_LANG, &kEoB2PortalSeqDataDOSProvider },
+ { kEoBBaseManDef, kEoB2, kPlatformDOS, kNoSpecial, EN_ANY, &kEoB2ManDefDOSEnglishProvider },
+ { kEoBBaseManWord, kEoB2, kPlatformDOS, kNoSpecial, EN_ANY, &kEoB2ManWordDOSEnglishProvider },
+ { kEoBBaseManPrompt, kEoB2, kPlatformDOS, kNoSpecial, EN_ANY, &kEoB2ManPromptDOSEnglishProvider },
+ { kEoBBaseDscMonsterFrmOffsTbl1, kEoB2, kPlatformDOS, kNoSpecial, UNK_LANG, &kEoB2DscMonsterFrmOffsTbl1DOSProvider },
+ { kEoBBaseDscMonsterFrmOffsTbl2, kEoB2, kPlatformDOS, kNoSpecial, UNK_LANG, &kEoB2DscMonsterFrmOffsTbl2DOSProvider },
+ { kEoBBaseInvSlotX, kEoB2, kPlatformDOS, kNoSpecial, UNK_LANG, &kEoB2InvSlotXDOSProvider },
+ { kEoBBaseInvSlotY, kEoB2, kPlatformDOS, kNoSpecial, UNK_LANG, &kEoB2InvSlotYDOSProvider },
+ { kEoBBaseSlotValidationFlags, kEoB2, kPlatformDOS, kNoSpecial, UNK_LANG, &kEoB2SlotValidationFlagsDOSProvider },
+ { kEoBBaseProjectileWeaponTypes, kEoB2, kPlatformDOS, kNoSpecial, UNK_LANG, &kEoB2ProjectileWeaponTypesDOSProvider },
+ { kEoBBaseWandTypes, kEoB2, kPlatformDOS, kNoSpecial, UNK_LANG, &kEoB2WandTypesDOSProvider },
+ { kEoBBaseDrawObjPosIndex, kEoB2, kPlatformDOS, kNoSpecial, UNK_LANG, &kEoB2DrawObjPosIndexDOSProvider },
+ { kEoBBaseFlightObjFlipIndex, kEoB2, kPlatformDOS, kNoSpecial, UNK_LANG, &kEoB2FlightObjFlipIndexDOSProvider },
+ { kEoBBaseFlightObjShpMap, kEoB2, kPlatformDOS, kNoSpecial, UNK_LANG, &kEoB2FlightObjShpMapDOSProvider },
+ { kEoBBaseFlightObjSclIndex, kEoB2, kPlatformDOS, kNoSpecial, UNK_LANG, &kEoB2FlightObjSclIndexDOSProvider },
+ { kEoB2MainMenuStrings, kEoB2, kPlatformDOS, kNoSpecial, EN_ANY, &kEoB2MainMenuStringsDOSEnglishProvider },
+ { kEoB2TransferPortraitFrames, kEoB2, kPlatformDOS, kNoSpecial, UNK_LANG, &kEoB2TransferPortraitFramesDOSProvider },
+ { kEoB2TransferConvertTable, kEoB2, kPlatformDOS, kNoSpecial, UNK_LANG, &kEoB2TransferConvertTableDOSProvider },
+ { kEoB2TransferItemTable, kEoB2, kPlatformDOS, kNoSpecial, UNK_LANG, &kEoB2TransferItemTableDOSProvider },
+ { kEoB2TransferExpTable, kEoB2, kPlatformDOS, kNoSpecial, UNK_LANG, &kEoB2TransferExpTableDOSProvider },
+ { kEoB2TransferStrings1, kEoB2, kPlatformDOS, kNoSpecial, EN_ANY, &kEoB2TransferStrings1DOSEnglishProvider },
+ { kEoB2TransferStrings2, kEoB2, kPlatformDOS, kNoSpecial, EN_ANY, &kEoB2TransferStrings2DOSEnglishProvider },
+ { kEoB2TransferLabels, kEoB2, kPlatformDOS, kNoSpecial, EN_ANY, &kEoB2TransferLabelsDOSEnglishProvider },
+ { kEoB2IntroStrings, kEoB2, kPlatformDOS, kNoSpecial, EN_ANY, &kEoB2IntroStringsDOSEnglishProvider },
+ { kEoB2IntroCPSFiles, kEoB2, kPlatformDOS, kNoSpecial, EN_ANY, &kEoB2IntroCPSFilesDOSEnglishProvider },
+ { kEoB2IntroAnimData00, kEoB2, kPlatformDOS, kNoSpecial, UNK_LANG, &kEoB2IntroAnimData00DOSProvider },
+ { kEoB2IntroAnimData01, kEoB2, kPlatformDOS, kNoSpecial, UNK_LANG, &kEoB2IntroAnimData01DOSProvider },
+ { kEoB2IntroAnimData02, kEoB2, kPlatformDOS, kNoSpecial, UNK_LANG, &kEoB2IntroAnimData02DOSProvider },
+ { kEoB2IntroAnimData03, kEoB2, kPlatformDOS, kNoSpecial, UNK_LANG, &kEoB2IntroAnimData03DOSProvider },
+ { kEoB2IntroAnimData04, kEoB2, kPlatformDOS, kNoSpecial, UNK_LANG, &kEoB2IntroAnimData04DOSProvider },
+ { kEoB2IntroAnimData05, kEoB2, kPlatformDOS, kNoSpecial, UNK_LANG, &kEoB2IntroAnimData05DOSProvider },
+ { kEoB2IntroAnimData06, kEoB2, kPlatformDOS, kNoSpecial, UNK_LANG, &kEoB2IntroAnimData06DOSProvider },
+ { kEoB2IntroAnimData07, kEoB2, kPlatformDOS, kNoSpecial, UNK_LANG, &kEoB2IntroAnimData07DOSProvider },
+ { kEoB2IntroAnimData08, kEoB2, kPlatformDOS, kNoSpecial, UNK_LANG, &kEoB2IntroAnimData08DOSProvider },
+ { kEoB2IntroAnimData09, kEoB2, kPlatformDOS, kNoSpecial, UNK_LANG, &kEoB2IntroAnimData09DOSProvider },
+ { kEoB2IntroAnimData10, kEoB2, kPlatformDOS, kNoSpecial, UNK_LANG, &kEoB2IntroAnimData10DOSProvider },
+ { kEoB2IntroAnimData11, kEoB2, kPlatformDOS, kNoSpecial, UNK_LANG, &kEoB2IntroAnimData11DOSProvider },
+ { kEoB2IntroAnimData12, kEoB2, kPlatformDOS, kNoSpecial, UNK_LANG, &kEoB2IntroAnimData12DOSProvider },
+ { kEoB2IntroAnimData13, kEoB2, kPlatformDOS, kNoSpecial, UNK_LANG, &kEoB2IntroAnimData13DOSProvider },
+ { kEoB2IntroAnimData14, kEoB2, kPlatformDOS, kNoSpecial, UNK_LANG, &kEoB2IntroAnimData14DOSProvider },
+ { kEoB2IntroAnimData15, kEoB2, kPlatformDOS, kNoSpecial, UNK_LANG, &kEoB2IntroAnimData15DOSProvider },
+ { kEoB2IntroAnimData16, kEoB2, kPlatformDOS, kNoSpecial, UNK_LANG, &kEoB2IntroAnimData16DOSProvider },
+ { kEoB2IntroAnimData17, kEoB2, kPlatformDOS, kNoSpecial, UNK_LANG, &kEoB2IntroAnimData17DOSProvider },
+ { kEoB2IntroAnimData18, kEoB2, kPlatformDOS, kNoSpecial, UNK_LANG, &kEoB2IntroAnimData18DOSProvider },
+ { kEoB2IntroAnimData19, kEoB2, kPlatformDOS, kNoSpecial, UNK_LANG, &kEoB2IntroAnimData19DOSProvider },
+ { kEoB2IntroAnimData20, kEoB2, kPlatformDOS, kNoSpecial, UNK_LANG, &kEoB2IntroAnimData20DOSProvider },
+ { kEoB2IntroAnimData21, kEoB2, kPlatformDOS, kNoSpecial, UNK_LANG, &kEoB2IntroAnimData21DOSProvider },
+ { kEoB2IntroAnimData22, kEoB2, kPlatformDOS, kNoSpecial, UNK_LANG, &kEoB2IntroAnimData22DOSProvider },
+ { kEoB2IntroAnimData23, kEoB2, kPlatformDOS, kNoSpecial, UNK_LANG, &kEoB2IntroAnimData23DOSProvider },
+ { kEoB2IntroAnimData24, kEoB2, kPlatformDOS, kNoSpecial, UNK_LANG, &kEoB2IntroAnimData24DOSProvider },
+ { kEoB2IntroAnimData25, kEoB2, kPlatformDOS, kNoSpecial, UNK_LANG, &kEoB2IntroAnimData25DOSProvider },
+ { kEoB2IntroAnimData26, kEoB2, kPlatformDOS, kNoSpecial, UNK_LANG, &kEoB2IntroAnimData26DOSProvider },
+ { kEoB2IntroAnimData27, kEoB2, kPlatformDOS, kNoSpecial, UNK_LANG, &kEoB2IntroAnimData27DOSProvider },
+ { kEoB2IntroAnimData28, kEoB2, kPlatformDOS, kNoSpecial, UNK_LANG, &kEoB2IntroAnimData28DOSProvider },
+ { kEoB2IntroAnimData29, kEoB2, kPlatformDOS, kNoSpecial, UNK_LANG, &kEoB2IntroAnimData29DOSProvider },
+ { kEoB2IntroAnimData30, kEoB2, kPlatformDOS, kNoSpecial, UNK_LANG, &kEoB2IntroAnimData30DOSProvider },
+ { kEoB2IntroAnimData31, kEoB2, kPlatformDOS, kNoSpecial, UNK_LANG, &kEoB2IntroAnimData31DOSProvider },
+ { kEoB2IntroAnimData32, kEoB2, kPlatformDOS, kNoSpecial, UNK_LANG, &kEoB2IntroAnimData32DOSProvider },
+ { kEoB2IntroAnimData33, kEoB2, kPlatformDOS, kNoSpecial, UNK_LANG, &kEoB2IntroAnimData33DOSProvider },
+ { kEoB2IntroAnimData34, kEoB2, kPlatformDOS, kNoSpecial, UNK_LANG, &kEoB2IntroAnimData34DOSProvider },
+ { kEoB2IntroAnimData35, kEoB2, kPlatformDOS, kNoSpecial, UNK_LANG, &kEoB2IntroAnimData35DOSProvider },
+ { kEoB2IntroAnimData36, kEoB2, kPlatformDOS, kNoSpecial, UNK_LANG, &kEoB2IntroAnimData36DOSProvider },
+ { kEoB2IntroAnimData37, kEoB2, kPlatformDOS, kNoSpecial, UNK_LANG, &kEoB2IntroAnimData37DOSProvider },
+ { kEoB2IntroAnimData38, kEoB2, kPlatformDOS, kNoSpecial, UNK_LANG, &kEoB2IntroAnimData38DOSProvider },
+ { kEoB2IntroAnimData39, kEoB2, kPlatformDOS, kNoSpecial, UNK_LANG, &kEoB2IntroAnimData39DOSProvider },
+ { kEoB2IntroAnimData40, kEoB2, kPlatformDOS, kNoSpecial, UNK_LANG, &kEoB2IntroAnimData40DOSProvider },
+ { kEoB2IntroAnimData41, kEoB2, kPlatformDOS, kNoSpecial, UNK_LANG, &kEoB2IntroAnimData41DOSProvider },
+ { kEoB2IntroAnimData42, kEoB2, kPlatformDOS, kNoSpecial, UNK_LANG, &kEoB2IntroAnimData42DOSProvider },
+ { kEoB2IntroAnimData43, kEoB2, kPlatformDOS, kNoSpecial, UNK_LANG, &kEoB2IntroAnimData43DOSProvider },
+ { kEoB2IntroShapes00, kEoB2, kPlatformDOS, kNoSpecial, UNK_LANG, &kEoB2IntroShapes00DOSProvider },
+ { kEoB2IntroShapes01, kEoB2, kPlatformDOS, kNoSpecial, UNK_LANG, &kEoB2IntroShapes01DOSProvider },
+ { kEoB2IntroShapes04, kEoB2, kPlatformDOS, kNoSpecial, UNK_LANG, &kEoB2IntroShapes04DOSProvider },
+ { kEoB2IntroShapes07, kEoB2, kPlatformDOS, kNoSpecial, UNK_LANG, &kEoB2IntroShapes07DOSProvider },
+ { kEoB2FinaleStrings, kEoB2, kPlatformDOS, kNoSpecial, EN_ANY, &kEoB2FinaleStringsDOSEnglishProvider },
+ { kEoB2CreditsData, kEoB2, kPlatformDOS, kNoSpecial, EN_ANY, &kEoB2CreditsDataDOSEnglishProvider },
+ { kEoB2FinaleCPSFiles, kEoB2, kPlatformDOS, kNoSpecial, EN_ANY, &kEoB2FinaleCPSFilesDOSEnglishProvider },
+ { kEoB2FinaleAnimData00, kEoB2, kPlatformDOS, kNoSpecial, UNK_LANG, &kEoB2FinaleAnimData00DOSProvider },
+ { kEoB2FinaleAnimData01, kEoB2, kPlatformDOS, kNoSpecial, UNK_LANG, &kEoB2FinaleAnimData01DOSProvider },
+ { kEoB2FinaleAnimData02, kEoB2, kPlatformDOS, kNoSpecial, UNK_LANG, &kEoB2FinaleAnimData02DOSProvider },
+ { kEoB2FinaleAnimData03, kEoB2, kPlatformDOS, kNoSpecial, UNK_LANG, &kEoB2FinaleAnimData03DOSProvider },
+ { kEoB2FinaleAnimData04, kEoB2, kPlatformDOS, kNoSpecial, UNK_LANG, &kEoB2FinaleAnimData04DOSProvider },
+ { kEoB2FinaleAnimData05, kEoB2, kPlatformDOS, kNoSpecial, UNK_LANG, &kEoB2FinaleAnimData05DOSProvider },
+ { kEoB2FinaleAnimData06, kEoB2, kPlatformDOS, kNoSpecial, UNK_LANG, &kEoB2FinaleAnimData06DOSProvider },
+ { kEoB2FinaleAnimData07, kEoB2, kPlatformDOS, kNoSpecial, UNK_LANG, &kEoB2FinaleAnimData07DOSProvider },
+ { kEoB2FinaleAnimData08, kEoB2, kPlatformDOS, kNoSpecial, UNK_LANG, &kEoB2FinaleAnimData08DOSProvider },
+ { kEoB2FinaleAnimData09, kEoB2, kPlatformDOS, kNoSpecial, UNK_LANG, &kEoB2FinaleAnimData09DOSProvider },
+ { kEoB2FinaleAnimData10, kEoB2, kPlatformDOS, kNoSpecial, UNK_LANG, &kEoB2FinaleAnimData10DOSProvider },
+ { kEoB2FinaleAnimData11, kEoB2, kPlatformDOS, kNoSpecial, UNK_LANG, &kEoB2FinaleAnimData11DOSProvider },
+ { kEoB2FinaleAnimData12, kEoB2, kPlatformDOS, kNoSpecial, UNK_LANG, &kEoB2FinaleAnimData12DOSProvider },
+ { kEoB2FinaleAnimData13, kEoB2, kPlatformDOS, kNoSpecial, UNK_LANG, &kEoB2FinaleAnimData13DOSProvider },
+ { kEoB2FinaleAnimData14, kEoB2, kPlatformDOS, kNoSpecial, UNK_LANG, &kEoB2FinaleAnimData14DOSProvider },
+ { kEoB2FinaleAnimData15, kEoB2, kPlatformDOS, kNoSpecial, UNK_LANG, &kEoB2FinaleAnimData15DOSProvider },
+ { kEoB2FinaleAnimData16, kEoB2, kPlatformDOS, kNoSpecial, UNK_LANG, &kEoB2FinaleAnimData16DOSProvider },
+ { kEoB2FinaleAnimData17, kEoB2, kPlatformDOS, kNoSpecial, UNK_LANG, &kEoB2FinaleAnimData17DOSProvider },
+ { kEoB2FinaleAnimData18, kEoB2, kPlatformDOS, kNoSpecial, UNK_LANG, &kEoB2FinaleAnimData18DOSProvider },
+ { kEoB2FinaleAnimData19, kEoB2, kPlatformDOS, kNoSpecial, UNK_LANG, &kEoB2FinaleAnimData19DOSProvider },
+ { kEoB2FinaleAnimData20, kEoB2, kPlatformDOS, kNoSpecial, UNK_LANG, &kEoB2FinaleAnimData20DOSProvider },
+ { kEoB2FinaleShapes00, kEoB2, kPlatformDOS, kNoSpecial, UNK_LANG, &kEoB2FinaleShapes00DOSProvider },
+ { kEoB2FinaleShapes03, kEoB2, kPlatformDOS, kNoSpecial, UNK_LANG, &kEoB2FinaleShapes03DOSProvider },
+ { kEoB2FinaleShapes07, kEoB2, kPlatformDOS, kNoSpecial, UNK_LANG, &kEoB2FinaleShapes07DOSProvider },
+ { kEoB2FinaleShapes09, kEoB2, kPlatformDOS, kNoSpecial, UNK_LANG, &kEoB2FinaleShapes09DOSProvider },
+ { kEoB2FinaleShapes10, kEoB2, kPlatformDOS, kNoSpecial, UNK_LANG, &kEoB2FinaleShapes10DOSProvider },
+ { kEoB2NpcShapeData, kEoB2, kPlatformDOS, kNoSpecial, UNK_LANG, &kEoB2NpcShapeDataDOSProvider },
+ { kEoBBaseClassModifierFlags, kEoB2, kPlatformDOS, kNoSpecial, UNK_LANG, &kEoB2ClassModifierFlagsDOSProvider },
+ { kEoBBaseMonsterStepTable02, kEoB2, kPlatformDOS, kNoSpecial, UNK_LANG, &kEoB2MonsterStepTable02DOSProvider },
+ { kEoBBaseMonsterStepTable1, kEoB2, kPlatformDOS, kNoSpecial, UNK_LANG, &kEoB2MonsterStepTable1DOSProvider },
+ { kEoBBaseMonsterStepTable2, kEoB2, kPlatformDOS, kNoSpecial, UNK_LANG, &kEoB2MonsterStepTable2DOSProvider },
+ { kEoBBaseMonsterStepTable3, kEoB2, kPlatformDOS, kNoSpecial, UNK_LANG, &kEoB2MonsterStepTable3DOSProvider },
+ { kEoBBaseMonsterCloseAttPosTable1, kEoB2, kPlatformDOS, kNoSpecial, UNK_LANG, &kEoB2MonsterCloseAttPosTable1DOSProvider },
+ { kEoBBaseMonsterCloseAttPosTable22, kEoB2, kPlatformDOS, kNoSpecial, UNK_LANG, &kEoB2MonsterCloseAttPosTable22DOSProvider },
+ { kEoBBaseMonsterCloseAttUnkTable, kEoB2, kPlatformDOS, kNoSpecial, UNK_LANG, &kEoB2MonsterCloseAttUnkTableDOSProvider },
+ { kEoBBaseMonsterCloseAttChkTable1, kEoB2, kPlatformDOS, kNoSpecial, UNK_LANG, &kEoB2MonsterCloseAttChkTable1DOSProvider },
+ { kEoBBaseMonsterCloseAttChkTable2, kEoB2, kPlatformDOS, kNoSpecial, UNK_LANG, &kEoB2MonsterCloseAttChkTable2DOSProvider },
+ { kEoBBaseMonsterCloseAttDstTable1, kEoB2, kPlatformDOS, kNoSpecial, UNK_LANG, &kEoB2MonsterCloseAttDstTable1DOSProvider },
+ { kEoBBaseMonsterCloseAttDstTable2, kEoB2, kPlatformDOS, kNoSpecial, UNK_LANG, &kEoB2MonsterCloseAttDstTable2DOSProvider },
+ { kEoBBaseMonsterProximityTable, kEoB2, kPlatformDOS, kNoSpecial, UNK_LANG, &kEoB2MonsterProximityTableDOSProvider },
+ { kEoBBaseFindBlockMonstersTable, kEoB2, kPlatformDOS, kNoSpecial, UNK_LANG, &kEoB2FindBlockMonstersTableDOSProvider },
+ { kEoBBaseMonsterDirChangeTable, kEoB2, kPlatformDOS, kNoSpecial, UNK_LANG, &kEoB2MonsterDirChangeTableDOSProvider },
+ { kEoBBaseMonsterDistAttStrings, kEoB2, kPlatformDOS, kNoSpecial, EN_ANY, &kEoB2MonsterDistAttStringsDOSEnglishProvider },
+ { kEoBBaseEncodeMonsterDefs, kEoB2, kPlatformDOS, kNoSpecial, UNK_LANG, &kEoB2EncodeMonsterDefsDOSProvider },
+ { kEoBBaseNpcPresets, kEoB2, kPlatformDOS, kNoSpecial, UNK_LANG, &kEoB2NpcPresetsDOSProvider },
+ { kEoB2Npc1Strings, kEoB2, kPlatformDOS, kNoSpecial, EN_ANY, &kEoB2Npc1StringsDOSEnglishProvider },
+ { kEoB2Npc2Strings, kEoB2, kPlatformDOS, kNoSpecial, EN_ANY, &kEoB2Npc2StringsDOSEnglishProvider },
+ { kEoB2MonsterDustStrings, kEoB2, kPlatformDOS, kNoSpecial, EN_ANY, &kEoB2MonsterDustStringsDOSEnglishProvider },
+ { kEoB2DreamSteps, kEoB2, kPlatformDOS, kNoSpecial, UNK_LANG, &kEoB2DreamStepsDOSProvider },
+ { kEoB2KheldranStrings, kEoB2, kPlatformDOS, kNoSpecial, EN_ANY, &kEoB2KheldranStringsDOSEnglishProvider },
+ { kEoB2HornStrings, kEoB2, kPlatformDOS, kNoSpecial, EN_ANY, &kEoB2HornStringsDOSEnglishProvider },
+ { kEoB2HornSounds, kEoB2, kPlatformDOS, kNoSpecial, UNK_LANG, &kEoB2HornSoundsDOSProvider },
+ { kEoB2WallOfForceDsX, kEoB2, kPlatformDOS, kNoSpecial, UNK_LANG, &kEoB2WallOfForceDsXDOSProvider },
+ { kEoB2WallOfForceDsY, kEoB2, kPlatformDOS, kNoSpecial, UNK_LANG, &kEoB2WallOfForceDsYDOSProvider },
+ { kEoB2WallOfForceNumW, kEoB2, kPlatformDOS, kNoSpecial, UNK_LANG, &kEoB2WallOfForceNumWDOSProvider },
+ { kEoB2WallOfForceNumH, kEoB2, kPlatformDOS, kNoSpecial, UNK_LANG, &kEoB2WallOfForceNumHDOSProvider },
+ { kEoB2WallOfForceShpId, kEoB2, kPlatformDOS, kNoSpecial, UNK_LANG, &kEoB2WallOfForceShpIdDOSProvider },
+ { kRpgCommonDscShapeIndex, kEoB2, kPlatformDOS, kNoSpecial, UNK_LANG, &kEoB2DscShapeIndexDOSProvider },
+ { kRpgCommonDscX, kEoB2, kPlatformDOS, kNoSpecial, UNK_LANG, &kEoB2DscXDOSProvider },
+ { kRpgCommonDscTileIndex, kEoB2, kPlatformDOS, kNoSpecial, UNK_LANG, &kEoB2DscTileIndexDOSProvider },
+ { kRpgCommonDscUnk2, kEoB2, kPlatformDOS, kNoSpecial, UNK_LANG, &kEoB2DscUnk2DOSProvider },
+ { kRpgCommonDscDimData1, kEoB2, kPlatformDOS, kNoSpecial, UNK_LANG, &kEoB2DscDimData1DOSProvider },
+ { kRpgCommonDscDimData2, kEoB2, kPlatformDOS, kNoSpecial, UNK_LANG, &kEoB2DscDimData2DOSProvider },
+ { kRpgCommonDscBlockMap, kEoB2, kPlatformDOS, kNoSpecial, UNK_LANG, &kEoB2DscBlockMapDOSProvider },
+ { kRpgCommonDscDimMap, kEoB2, kPlatformDOS, kNoSpecial, UNK_LANG, &kEoB2DscDimMapDOSProvider },
+ { kRpgCommonDscBlockIndex, kEoB2, kPlatformDOS, kNoSpecial, UNK_LANG, &kEoB2DscBlockIndexDOSProvider },
+ { kEoBBaseChargenStrings1, kEoB2, kPlatformDOS, kNoSpecial, DE_DEU, &kEoB2ChargenStrings1DOSGermanProvider },
+ { kEoBBaseChargenStrings2, kEoB2, kPlatformDOS, kNoSpecial, DE_DEU, &kEoB2ChargenStrings2DOSGermanProvider },
+ { kEoBBaseChargenStatStrings, kEoB2, kPlatformDOS, kNoSpecial, DE_DEU, &kEoB2ChargenStatStringsDOSGermanProvider },
+ { kEoBBaseChargenRaceSexStrings, kEoB2, kPlatformDOS, kNoSpecial, DE_DEU, &kEoB2ChargenRaceSexStringsDOSGermanProvider },
+ { kEoBBaseChargenClassStrings, kEoB2, kPlatformDOS, kNoSpecial, DE_DEU, &kEoB2ChargenClassStringsDOSGermanProvider },
+ { kEoBBaseChargenAlignmentStrings, kEoB2, kPlatformDOS, kNoSpecial, DE_DEU, &kEoB2ChargenAlignmentStringsDOSGermanProvider },
+ { kEoBBaseChargenEnterGameStrings, kEoB2, kPlatformDOS, kNoSpecial, DE_DEU, &kEoB2ChargenEnterGameStringsDOSGermanProvider },
+ { kEoBBasePryDoorStrings, kEoB2, kPlatformDOS, kNoSpecial, DE_DEU, &kEoB2PryDoorStringsDOSGermanProvider },
+ { kEoBBaseWarningStrings, kEoB2, kPlatformDOS, kNoSpecial, DE_DEU, &kEoB2WarningStringsDOSGermanProvider },
+ { kEoBBaseItemSuffixStringsRings, kEoB2, kPlatformDOS, kNoSpecial, DE_DEU, &kEoB2ItemSuffixStringsRingsDOSGermanProvider },
+ { kEoBBaseItemSuffixStringsPotions, kEoB2, kPlatformDOS, kNoSpecial, DE_DEU, &kEoB2ItemSuffixStringsPotionsDOSGermanProvider },
+ { kEoBBaseItemSuffixStringsWands, kEoB2, kPlatformDOS, kNoSpecial, DE_DEU, &kEoB2ItemSuffixStringsWandsDOSGermanProvider },
+ { kEoBBaseRipItemStrings, kEoB2, kPlatformDOS, kNoSpecial, DE_DEU, &kEoB2RipItemStringsDOSGermanProvider },
+ { kEoBBaseCursedString, kEoB2, kPlatformDOS, kNoSpecial, DE_DEU, &kEoB2CursedStringDOSGermanProvider },
+ { kEoBBaseMagicObjectStrings, kEoB2, kPlatformDOS, kNoSpecial, DE_DEU, &kEoB2MagicObjectStringsDOSGermanProvider },
+ { kEoBBaseMagicObjectString5, kEoB2, kPlatformDOS, kNoSpecial, DE_DEU, &kEoB2MagicObjectString5DOSGermanProvider },
+ { kEoBBasePatternSuffix, kEoB2, kPlatformDOS, kNoSpecial, DE_DEU, &kEoB2PatternSuffixDOSGermanProvider },
+ { kEoBBasePatternGrFix1, kEoB2, kPlatformDOS, kNoSpecial, DE_DEU, &kEoB2PatternGrFix1DOSGermanProvider },
+ { kEoBBasePatternGrFix2, kEoB2, kPlatformDOS, kNoSpecial, DE_DEU, &kEoB2PatternGrFix2DOSGermanProvider },
+ { kEoBBaseValidateArmorString, kEoB2, kPlatformDOS, kNoSpecial, DE_DEU, &kEoB2ValidateArmorStringDOSGermanProvider },
+ { kEoBBaseValidateCursedString, kEoB2, kPlatformDOS, kNoSpecial, DE_DEU, &kEoB2ValidateCursedStringDOSGermanProvider },
+ { kEoBBaseValidateNoDropString, kEoB2, kPlatformDOS, kNoSpecial, DE_DEU, &kEoB2ValidateNoDropStringDOSGermanProvider },
+ { kEoBBasePotionStrings, kEoB2, kPlatformDOS, kNoSpecial, DE_DEU, &kEoB2PotionStringsDOSGermanProvider },
+ { kEoBBaseWandStrings, kEoB2, kPlatformDOS, kNoSpecial, DE_DEU, &kEoB2WandStringsDOSGermanProvider },
+ { kEoBBaseItemMisuseStrings, kEoB2, kPlatformDOS, kNoSpecial, DE_DEU, &kEoB2ItemMisuseStringsDOSGermanProvider },
+ { kEoBBaseTakenStrings, kEoB2, kPlatformDOS, kNoSpecial, DE_DEU, &kEoB2TakenStringsDOSGermanProvider },
+ { kEoBBasePotionEffectStrings, kEoB2, kPlatformDOS, kNoSpecial, DE_DEU, &kEoB2PotionEffectStringsDOSGermanProvider },
+ { kEoBBaseYesNoStrings, kEoB2, kPlatformDOS, kNoSpecial, DE_DEU, &kEoB2YesNoStringsDOSGermanProvider },
+ { kRpgCommonMoreStrings, kEoB2, kPlatformDOS, kNoSpecial, DE_DEU, &kEoB2MoreStringsDOSGermanProvider },
+ { kEoBBaseNpcMaxStrings, kEoB2, kPlatformDOS, kNoSpecial, DE_DEU, &kEoB2NpcMaxStringsDOSGermanProvider },
+ { kEoBBaseOkStrings, kEoB2, kPlatformDOS, kNoSpecial, DE_DEU, &kEoB2OkStringsDOSGermanProvider },
+ { kEoBBaseNpcJoinStrings, kEoB2, kPlatformDOS, kNoSpecial, DE_DEU, &kEoB2NpcJoinStringsDOSGermanProvider },
+ { kEoBBaseCancelStrings, kEoB2, kPlatformDOS, kNoSpecial, DE_DEU, &kEoB2CancelStringsDOSGermanProvider },
+ { kEoBBaseAbortStrings, kEoB2, kPlatformDOS, kNoSpecial, DE_DEU, &kEoB2AbortStringsDOSGermanProvider },
+ { kEoBBaseMenuStringsMain, kEoB2, kPlatformDOS, kNoSpecial, DE_DEU, &kEoB2MenuStringsMainDOSGermanProvider },
+ { kEoBBaseMenuStringsSaveLoad, kEoB2, kPlatformDOS, kNoSpecial, DE_DEU, &kEoB2MenuStringsSaveLoadDOSGermanProvider },
+ { kEoBBaseMenuStringsOnOff, kEoB2, kPlatformDOS, kNoSpecial, DE_DEU, &kEoB2MenuStringsOnOffDOSGermanProvider },
+ { kEoBBaseMenuStringsSpells, kEoB2, kPlatformDOS, kNoSpecial, DE_DEU, &kEoB2MenuStringsSpellsDOSGermanProvider },
+ { kEoBBaseMenuStringsRest, kEoB2, kPlatformDOS, kNoSpecial, DE_DEU, &kEoB2MenuStringsRestDOSGermanProvider },
+ { kEoBBaseMenuStringsDrop, kEoB2, kPlatformDOS, kNoSpecial, DE_DEU, &kEoB2MenuStringsDropDOSGermanProvider },
+ { kEoBBaseMenuStringsExit, kEoB2, kPlatformDOS, kNoSpecial, DE_DEU, &kEoB2MenuStringsExitDOSGermanProvider },
+ { kEoBBaseMenuStringsStarve, kEoB2, kPlatformDOS, kNoSpecial, DE_DEU, &kEoB2MenuStringsStarveDOSGermanProvider },
+ { kEoBBaseMenuStringsScribe, kEoB2, kPlatformDOS, kNoSpecial, DE_DEU, &kEoB2MenuStringsScribeDOSGermanProvider },
+ { kEoBBaseMenuStringsDrop2, kEoB2, kPlatformDOS, kNoSpecial, DE_DEU, &kEoB2MenuStringsDrop2DOSGermanProvider },
+ { kEoBBaseMenuStringsHead, kEoB2, kPlatformDOS, kNoSpecial, DE_DEU, &kEoB2MenuStringsHeadDOSGermanProvider },
+ { kEoBBaseMenuStringsPoison, kEoB2, kPlatformDOS, kNoSpecial, DE_DEU, &kEoB2MenuStringsPoisonDOSGermanProvider },
+ { kEoBBaseMenuStringsMgc, kEoB2, kPlatformDOS, kNoSpecial, DE_DEU, &kEoB2MenuStringsMgcDOSGermanProvider },
+ { kEoBBaseMenuStringsPrefs, kEoB2, kPlatformDOS, kNoSpecial, DE_DEU, &kEoB2MenuStringsPrefsDOSGermanProvider },
+ { kEoBBaseMenuStringsRest2, kEoB2, kPlatformDOS, kNoSpecial, DE_DEU, &kEoB2MenuStringsRest2DOSGermanProvider },
+ { kEoBBaseMenuStringsRest3, kEoB2, kPlatformDOS, kNoSpecial, DE_DEU, &kEoB2MenuStringsRest3DOSGermanProvider },
+ { kEoBBaseMenuStringsRest4, kEoB2, kPlatformDOS, kNoSpecial, DE_DEU, &kEoB2MenuStringsRest4DOSGermanProvider },
+ { kEoBBaseMenuStringsDefeat, kEoB2, kPlatformDOS, kNoSpecial, DE_DEU, &kEoB2MenuStringsDefeatDOSGermanProvider },
+ { kEoBBaseMenuStringsTransfer, kEoB2, kPlatformDOS, kNoSpecial, DE_DEU, &kEoB2MenuStringsTransferDOSGermanProvider },
+ { kEoBBaseMenuStringsSpec, kEoB2, kPlatformDOS, kNoSpecial, DE_DEU, &kEoB2MenuStringsSpecDOSGermanProvider },
+ { kEoBBaseMenuYesNoStrings, kEoB2, kPlatformDOS, kNoSpecial, DE_DEU, &kEoB2MenuYesNoStringsDOSGermanProvider },
+ { kEoBBaseCharGuiStringsHp, kEoB2, kPlatformDOS, kNoSpecial, DE_DEU, &kEoB2CharGuiStringsHpDOSGermanProvider },
+ { kEoBBaseCharGuiStringsWp2, kEoB2, kPlatformDOS, kNoSpecial, DE_DEU, &kEoB2CharGuiStringsWp2DOSGermanProvider },
+ { kEoBBaseCharGuiStringsWr, kEoB2, kPlatformDOS, kNoSpecial, DE_DEU, &kEoB2CharGuiStringsWrDOSGermanProvider },
+ { kEoBBaseCharGuiStringsSt2, kEoB2, kPlatformDOS, kNoSpecial, DE_DEU, &kEoB2CharGuiStringsSt2DOSGermanProvider },
+ { kEoBBaseCharGuiStringsIn, kEoB2, kPlatformDOS, kNoSpecial, DE_DEU, &kEoB2CharGuiStringsInDOSGermanProvider },
+ { kEoBBaseCharStatusStrings7, kEoB2, kPlatformDOS, kNoSpecial, DE_DEU, &kEoB2CharStatusStrings7DOSGermanProvider },
+ { kEoBBaseCharStatusStrings82, kEoB2, kPlatformDOS, kNoSpecial, DE_DEU, &kEoB2CharStatusStrings82DOSGermanProvider },
+ { kEoBBaseCharStatusStrings9, kEoB2, kPlatformDOS, kNoSpecial, DE_DEU, &kEoB2CharStatusStrings9DOSGermanProvider },
+ { kEoBBaseCharStatusStrings12, kEoB2, kPlatformDOS, kNoSpecial, DE_DEU, &kEoB2CharStatusStrings12DOSGermanProvider },
+ { kEoBBaseCharStatusStrings132, kEoB2, kPlatformDOS, kNoSpecial, DE_DEU, &kEoB2CharStatusStrings132DOSGermanProvider },
+ { kEoBBaseLevelGainStrings, kEoB2, kPlatformDOS, kNoSpecial, DE_DEU, &kEoB2LevelGainStringsDOSGermanProvider },
+ { kEoBBaseBookNumbers, kEoB2, kPlatformDOS, kNoSpecial, DE_DEU, &kEoB2BookNumbersDOSGermanProvider },
+ { kEoBBaseMageSpellsList, kEoB2, kPlatformDOS, kNoSpecial, DE_DEU, &kEoB2MageSpellsListDOSGermanProvider },
+ { kEoBBaseClericSpellsList, kEoB2, kPlatformDOS, kNoSpecial, DE_DEU, &kEoB2ClericSpellsListDOSGermanProvider },
+ { kEoBBaseSpellNames, kEoB2, kPlatformDOS, kNoSpecial, DE_DEU, &kEoB2SpellNamesDOSGermanProvider },
+ { kEoBBaseMagicStrings1, kEoB2, kPlatformDOS, kNoSpecial, DE_DEU, &kEoB2MagicStrings1DOSGermanProvider },
+ { kEoBBaseMagicStrings2, kEoB2, kPlatformDOS, kNoSpecial, DE_DEU, &kEoB2MagicStrings2DOSGermanProvider },
+ { kEoBBaseMagicStrings3, kEoB2, kPlatformDOS, kNoSpecial, DE_DEU, &kEoB2MagicStrings3DOSGermanProvider },
+ { kEoBBaseMagicStrings4, kEoB2, kPlatformDOS, kNoSpecial, DE_DEU, &kEoB2MagicStrings4DOSGermanProvider },
+ { kEoBBaseMagicStrings6, kEoB2, kPlatformDOS, kNoSpecial, DE_DEU, &kEoB2MagicStrings6DOSGermanProvider },
+ { kEoBBaseMagicStrings7, kEoB2, kPlatformDOS, kNoSpecial, DE_DEU, &kEoB2MagicStrings7DOSGermanProvider },
+ { kEoBBaseMagicStrings8, kEoB2, kPlatformDOS, kNoSpecial, DE_DEU, &kEoB2MagicStrings8DOSGermanProvider },
+ { kEoBBaseManDef, kEoB2, kPlatformDOS, kNoSpecial, DE_DEU, &kEoB2ManDefDOSGermanProvider },
+ { kEoBBaseManWord, kEoB2, kPlatformDOS, kNoSpecial, DE_DEU, &kEoB2ManWordDOSGermanProvider },
+ { kEoBBaseManPrompt, kEoB2, kPlatformDOS, kNoSpecial, DE_DEU, &kEoB2ManPromptDOSGermanProvider },
+ { kEoB2MainMenuStrings, kEoB2, kPlatformDOS, kNoSpecial, DE_DEU, &kEoB2MainMenuStringsDOSGermanProvider },
+ { kEoB2TransferStrings1, kEoB2, kPlatformDOS, kNoSpecial, DE_DEU, &kEoB2TransferStrings1DOSGermanProvider },
+ { kEoB2TransferStrings2, kEoB2, kPlatformDOS, kNoSpecial, DE_DEU, &kEoB2TransferStrings2DOSGermanProvider },
+ { kEoB2TransferLabels, kEoB2, kPlatformDOS, kNoSpecial, DE_DEU, &kEoB2TransferLabelsDOSGermanProvider },
+ { kEoB2IntroStrings, kEoB2, kPlatformDOS, kNoSpecial, DE_DEU, &kEoB2IntroStringsDOSGermanProvider },
+ { kEoB2IntroCPSFiles, kEoB2, kPlatformDOS, kNoSpecial, DE_DEU, &kEoB2IntroCPSFilesDOSGermanProvider },
+ { kEoB2FinaleStrings, kEoB2, kPlatformDOS, kNoSpecial, DE_DEU, &kEoB2FinaleStringsDOSGermanProvider },
+ { kEoB2CreditsData, kEoB2, kPlatformDOS, kNoSpecial, DE_DEU, &kEoB2CreditsDataDOSGermanProvider },
+ { kEoB2FinaleCPSFiles, kEoB2, kPlatformDOS, kNoSpecial, DE_DEU, &kEoB2FinaleCPSFilesDOSGermanProvider },
+ { kEoBBaseMonsterDistAttStrings, kEoB2, kPlatformDOS, kNoSpecial, DE_DEU, &kEoB2MonsterDistAttStringsDOSGermanProvider },
+ { kEoB2Npc1Strings, kEoB2, kPlatformDOS, kNoSpecial, DE_DEU, &kEoB2Npc1StringsDOSGermanProvider },
+ { kEoB2Npc2Strings, kEoB2, kPlatformDOS, kNoSpecial, DE_DEU, &kEoB2Npc2StringsDOSGermanProvider },
+ { kEoB2MonsterDustStrings, kEoB2, kPlatformDOS, kNoSpecial, DE_DEU, &kEoB2MonsterDustStringsDOSGermanProvider },
+ { kEoB2KheldranStrings, kEoB2, kPlatformDOS, kNoSpecial, DE_DEU, &kEoB2KheldranStringsDOSGermanProvider },
+ { kEoB2HornStrings, kEoB2, kPlatformDOS, kNoSpecial, DE_DEU, &kEoB2HornStringsDOSGermanProvider },
+ { k2SeqplayPakFiles, kLoL, kPlatformDOS, kDemoVersion, UNK_LANG, &kLoLSeqplayPakFilesDOSDemoProvider },
+ { k2SeqplayStrings, kLoL, kPlatformDOS, kDemoVersion, EN_ANY, &kLoLSeqplayStringsDOSDemoEnglishProvider },
+ { k2SeqplaySeqData, kLoL, kPlatformDOS, kDemoVersion, UNK_LANG, &kLoLSeqplaySeqDataDOSDemoProvider },
+ { k2SeqplaySfxFiles, kLoL, kPlatformDOS, kDemoVersion, UNK_LANG, &kLoLSeqplaySfxFilesDOSDemoProvider },
+ { k2SeqplayIntroTracks, kLoL, kPlatformDOS, kDemoVersion, UNK_LANG, &kLoLSeqplayIntroTracksDOSDemoProvider },
+ { kLoLIngamePakFiles, kLoL, kPlatformDOS, kNoSpecial, UNK_LANG, &kLoLIngamePakFilesDOSProvider },
+ { kLoLCharacterDefs, kLoL, kPlatformDOS, kNoSpecial, EN_ANY, &kLoLCharacterDefsDOSEnglishProvider },
+ { kLoLIngameSfxFiles, kLoL, kPlatformDOS, kNoSpecial, UNK_LANG, &kLoLIngameSfxFilesDOSProvider },
+ { kLoLIngameSfxIndex, kLoL, kPlatformDOS, kNoSpecial, UNK_LANG, &kLoLIngameSfxIndexDOSProvider },
+ { kLoLMusicTrackMap, kLoL, kPlatformDOS, kNoSpecial, UNK_LANG, &kLoLMusicTrackMapDOSProvider },
+ { kLoLIngameGMSfxIndex, kLoL, kPlatformDOS, kNoSpecial, UNK_LANG, &kLoLIngameGMSfxIndexDOSProvider },
+ { kLoLIngameMT32SfxIndex, kLoL, kPlatformDOS, kNoSpecial, UNK_LANG, &kLoLIngameMT32SfxIndexDOSProvider },
+ { kLoLIngamePcSpkSfxIndex, kLoL, kPlatformDOS, kNoSpecial, UNK_LANG, &kLoLIngamePcSpkSfxIndexDOSProvider },
+ { kLoLSpellProperties, kLoL, kPlatformDOS, kNoSpecial, UNK_LANG, &kLoLSpellPropertiesDOSProvider },
+ { kLoLGameShapeMap, kLoL, kPlatformDOS, kNoSpecial, UNK_LANG, &kLoLGameShapeMapDOSProvider },
+ { kLoLSceneItemOffs, kLoL, kPlatformDOS, kNoSpecial, UNK_LANG, &kLoLSceneItemOffsDOSProvider },
+ { kLoLCharInvIndex, kLoL, kPlatformDOS, kNoSpecial, UNK_LANG, &kLoLCharInvIndexDOSProvider },
+ { kLoLCharInvDefs, kLoL, kPlatformDOS, kNoSpecial, UNK_LANG, &kLoLCharInvDefsDOSProvider },
+ { kLoLCharDefsMan, kLoL, kPlatformDOS, kNoSpecial, UNK_LANG, &kLoLCharDefsManDOSProvider },
+ { kLoLCharDefsWoman, kLoL, kPlatformDOS, kNoSpecial, UNK_LANG, &kLoLCharDefsWomanDOSProvider },
+ { kLoLCharDefsKieran, kLoL, kPlatformDOS, kNoSpecial, UNK_LANG, &kLoLCharDefsKieranDOSProvider },
+ { kLoLCharDefsAkshel, kLoL, kPlatformDOS, kNoSpecial, UNK_LANG, &kLoLCharDefsAkshelDOSProvider },
+ { kLoLExpRequirements, kLoL, kPlatformDOS, kNoSpecial, UNK_LANG, &kLoLExpRequirementsDOSProvider },
+ { kLoLMonsterModifiers1, kLoL, kPlatformDOS, kNoSpecial, UNK_LANG, &kLoLMonsterModifiers1DOSProvider },
+ { kLoLMonsterModifiers2, kLoL, kPlatformDOS, kNoSpecial, UNK_LANG, &kLoLMonsterModifiers2DOSProvider },
+ { kLoLMonsterModifiers3, kLoL, kPlatformDOS, kNoSpecial, UNK_LANG, &kLoLMonsterModifiers3DOSProvider },
+ { kLoLMonsterShiftOffsets, kLoL, kPlatformDOS, kNoSpecial, UNK_LANG, &kLoLMonsterShiftOffsetsDOSProvider },
+ { kLoLMonsterDirFlags, kLoL, kPlatformDOS, kNoSpecial, UNK_LANG, &kLoLMonsterDirFlagsDOSProvider },
+ { kLoLMonsterScaleY, kLoL, kPlatformDOS, kNoSpecial, UNK_LANG, &kLoLMonsterScaleYDOSProvider },
+ { kLoLMonsterScaleX, kLoL, kPlatformDOS, kNoSpecial, UNK_LANG, &kLoLMonsterScaleXDOSProvider },
+ { kLoLMonsterScaleWH, kLoL, kPlatformDOS, kNoSpecial, UNK_LANG, &kLoLMonsterScaleWHDOSProvider },
+ { kLoLFlyingObjectShp, kLoL, kPlatformDOS, kNoSpecial, UNK_LANG, &kLoLFlyingObjectShpDOSProvider },
+ { kLoLInventoryDesc, kLoL, kPlatformDOS, kNoSpecial, UNK_LANG, &kLoLInventoryDescDOSProvider },
+ { kLoLLevelShpList, kLoL, kPlatformDOS, kNoSpecial, UNK_LANG, &kLoLLevelShpListDOSProvider },
+ { kLoLLevelDatList, kLoL, kPlatformDOS, kNoSpecial, UNK_LANG, &kLoLLevelDatListDOSProvider },
+ { kLoLCompassDefs, kLoL, kPlatformDOS, kNoSpecial, UNK_LANG, &kLoLCompassDefsDOSProvider },
+ { kLoLStashSetup, kLoL, kPlatformDOS, kNoSpecial, UNK_LANG, &kLoLStashSetupDOSProvider },
+ { kLoLDscWalls, kLoL, kPlatformDOS, kNoSpecial, UNK_LANG, &kLoLDscWallsDOSProvider },
+ { kRpgCommonDscShapeIndex, kLoL, kPlatformDOS, kNoSpecial, UNK_LANG, &kLoLDscShapeIndexDOSProvider },
+ { kLoLDscOvlMap, kLoL, kPlatformDOS, kNoSpecial, UNK_LANG, &kLoLDscOvlMapDOSProvider },
+ { kLoLDscScaleWidthData, kLoL, kPlatformDOS, kNoSpecial, UNK_LANG, &kLoLDscScaleWidthDataDOSProvider },
+ { kLoLDscScaleHeightData, kLoL, kPlatformDOS, kNoSpecial, UNK_LANG, &kLoLDscScaleHeightDataDOSProvider },
+ { kRpgCommonDscX, kLoL, kPlatformDOS, kNoSpecial, UNK_LANG, &kLoLDscXDOSProvider },
+ { kLoLBaseDscY, kLoL, kPlatformDOS, kNoSpecial, UNK_LANG, &kLoLBaseDscYDOSProvider },
+ { kRpgCommonDscTileIndex, kLoL, kPlatformDOS, kNoSpecial, UNK_LANG, &kLoLDscTileIndexDOSProvider },
+ { kRpgCommonDscUnk2, kLoL, kPlatformDOS, kNoSpecial, UNK_LANG, &kLoLDscUnk2DOSProvider },
+ { kRpgCommonDscDoorShapeIndex, kLoL, kPlatformDOS, kNoSpecial, UNK_LANG, &kLoLDscDoorShapeIndexDOSProvider },
+ { kRpgCommonDscDimData1, kLoL, kPlatformDOS, kNoSpecial, UNK_LANG, &kLoLDscDimData1DOSProvider },
+ { kRpgCommonDscDimData2, kLoL, kPlatformDOS, kNoSpecial, UNK_LANG, &kLoLDscDimData2DOSProvider },
+ { kRpgCommonDscBlockMap, kLoL, kPlatformDOS, kNoSpecial, UNK_LANG, &kLoLDscBlockMapDOSProvider },
+ { kRpgCommonDscDimMap, kLoL, kPlatformDOS, kNoSpecial, UNK_LANG, &kLoLDscDimMapDOSProvider },
+ { kLoLDscOvlIndex, kLoL, kPlatformDOS, kNoSpecial, UNK_LANG, &kLoLDscOvlIndexDOSProvider },
+ { kRpgCommonDscBlockIndex, kLoL, kPlatformDOS, kNoSpecial, UNK_LANG, &kLoLDscBlockIndexDOSProvider },
+ { kRpgCommonDscDoorY2, kLoL, kPlatformDOS, kNoSpecial, UNK_LANG, &kLoLDscDoorY2DOSProvider },
+ { kRpgCommonDscDoorFrameY1, kLoL, kPlatformDOS, kNoSpecial, UNK_LANG, &kLoLDscDoorFrameY1DOSProvider },
+ { kRpgCommonDscDoorFrameY2, kLoL, kPlatformDOS, kNoSpecial, UNK_LANG, &kLoLDscDoorFrameY2DOSProvider },
+ { kLoLDscDoorScale, kLoL, kPlatformDOS, kNoSpecial, UNK_LANG, &kLoLDscDoorScaleDOSProvider },
+ { kLoLDscDoor4, kLoL, kPlatformDOS, kNoSpecial, UNK_LANG, &kLoLDscDoor4DOSProvider },
+ { kLoLDscDoorX, kLoL, kPlatformDOS, kNoSpecial, UNK_LANG, &kLoLDscDoorXDOSProvider },
+ { kLoLDscDoorY, kLoL, kPlatformDOS, kNoSpecial, UNK_LANG, &kLoLDscDoorYDOSProvider },
+ { kLoLScrollXTop, kLoL, kPlatformDOS, kNoSpecial, UNK_LANG, &kLoLScrollXTopDOSProvider },
+ { kLoLScrollYTop, kLoL, kPlatformDOS, kNoSpecial, UNK_LANG, &kLoLScrollYTopDOSProvider },
+ { kLoLScrollXBottom, kLoL, kPlatformDOS, kNoSpecial, UNK_LANG, &kLoLScrollXBottomDOSProvider },
+ { kLoLScrollYBottom, kLoL, kPlatformDOS, kNoSpecial, UNK_LANG, &kLoLScrollYBottomDOSProvider },
+ { kLoLButtonDefs, kLoL, kPlatformDOS, kNoSpecial, UNK_LANG, &kLoLButtonDefsDOSProvider },
+ { kLoLButtonList1, kLoL, kPlatformDOS, kNoSpecial, UNK_LANG, &kLoLButtonList1DOSProvider },
+ { kLoLButtonList2, kLoL, kPlatformDOS, kNoSpecial, UNK_LANG, &kLoLButtonList2DOSProvider },
+ { kLoLButtonList3, kLoL, kPlatformDOS, kNoSpecial, UNK_LANG, &kLoLButtonList3DOSProvider },
+ { kLoLButtonList4, kLoL, kPlatformDOS, kNoSpecial, UNK_LANG, &kLoLButtonList4DOSProvider },
+ { kLoLButtonList5, kLoL, kPlatformDOS, kNoSpecial, UNK_LANG, &kLoLButtonList5DOSProvider },
+ { kLoLButtonList6, kLoL, kPlatformDOS, kNoSpecial, UNK_LANG, &kLoLButtonList6DOSProvider },
+ { kLoLButtonList7, kLoL, kPlatformDOS, kNoSpecial, UNK_LANG, &kLoLButtonList7DOSProvider },
+ { kLoLButtonList8, kLoL, kPlatformDOS, kNoSpecial, UNK_LANG, &kLoLButtonList8DOSProvider },
+ { kLoLLegendData, kLoL, kPlatformDOS, kNoSpecial, UNK_LANG, &kLoLLegendDataDOSProvider },
+ { kLoLMapCursorOvl, kLoL, kPlatformDOS, kNoSpecial, UNK_LANG, &kLoLMapCursorOvlDOSProvider },
+ { kLoLMapStringId, kLoL, kPlatformDOS, kNoSpecial, UNK_LANG, &kLoLMapStringIdDOSProvider },
+ { kLoLSpellbookAnim, kLoL, kPlatformDOS, kNoSpecial, UNK_LANG, &kLoLSpellbookAnimDOSProvider },
+ { kLoLSpellbookCoords, kLoL, kPlatformDOS, kNoSpecial, UNK_LANG, &kLoLSpellbookCoordsDOSProvider },
+ { kLoLHealShapeFrames, kLoL, kPlatformDOS, kNoSpecial, UNK_LANG, &kLoLHealShapeFramesDOSProvider },
+ { kLoLLightningDefs, kLoL, kPlatformDOS, kNoSpecial, UNK_LANG, &kLoLLightningDefsDOSProvider },
+ { kLoLFireballCoords, kLoL, kPlatformDOS, kNoSpecial, UNK_LANG, &kLoLFireballCoordsDOSProvider },
+ { kLoLCharacterDefs, kLoL, kPlatformDOS, kNoSpecial, RU_RUS, &kLoLCharacterDefsDOSRussianProvider },
+ { kLoLCharacterDefs, kLoL, kPlatformDOS, kNoSpecial, DE_DEU, &kLoLCharacterDefsDOSGermanProvider },
+ { kLoLCharacterDefs, kLoL, kPlatformDOS, kNoSpecial, FR_FRA, &kLoLCharacterDefsDOSFrenchProvider },
+ { kLoLIngamePakFiles, kLoL, kPlatformPC98, kNoSpecial, UNK_LANG, &kLoLIngamePakFilesPC98Provider },
+ { kLoLCharacterDefs, kLoL, kPlatformPC98, kNoSpecial, JA_JPN, &kLoLCharacterDefsPC98JapaneseProvider },
+ { kLoLIngameSfxFiles, kLoL, kPlatformPC98, kNoSpecial, UNK_LANG, &kLoLIngameSfxFilesPC98Provider },
+ { kLoLIngameSfxIndex, kLoL, kPlatformPC98, kNoSpecial, UNK_LANG, &kLoLIngameSfxIndexPC98Provider },
+ { kLoLSpellProperties, kLoL, kPlatformPC98, kNoSpecial, UNK_LANG, &kLoLSpellPropertiesPC98Provider },
+ { kLoLGameShapeMap, kLoL, kPlatformPC98, kNoSpecial, UNK_LANG, &kLoLGameShapeMapPC98Provider },
+ { kLoLSceneItemOffs, kLoL, kPlatformPC98, kNoSpecial, UNK_LANG, &kLoLSceneItemOffsPC98Provider },
+ { kLoLCharInvIndex, kLoL, kPlatformPC98, kNoSpecial, UNK_LANG, &kLoLCharInvIndexPC98Provider },
+ { kLoLCharInvDefs, kLoL, kPlatformPC98, kNoSpecial, UNK_LANG, &kLoLCharInvDefsPC98Provider },
+ { kLoLCharDefsMan, kLoL, kPlatformPC98, kNoSpecial, UNK_LANG, &kLoLCharDefsManPC98Provider },
+ { kLoLCharDefsWoman, kLoL, kPlatformPC98, kNoSpecial, UNK_LANG, &kLoLCharDefsWomanPC98Provider },
+ { kLoLCharDefsKieran, kLoL, kPlatformPC98, kNoSpecial, UNK_LANG, &kLoLCharDefsKieranPC98Provider },
+ { kLoLCharDefsAkshel, kLoL, kPlatformPC98, kNoSpecial, UNK_LANG, &kLoLCharDefsAkshelPC98Provider },
+ { kLoLExpRequirements, kLoL, kPlatformPC98, kNoSpecial, UNK_LANG, &kLoLExpRequirementsPC98Provider },
+ { kLoLMonsterModifiers1, kLoL, kPlatformPC98, kNoSpecial, UNK_LANG, &kLoLMonsterModifiers1PC98Provider },
+ { kLoLMonsterModifiers2, kLoL, kPlatformPC98, kNoSpecial, UNK_LANG, &kLoLMonsterModifiers2PC98Provider },
+ { kLoLMonsterModifiers3, kLoL, kPlatformPC98, kNoSpecial, UNK_LANG, &kLoLMonsterModifiers3PC98Provider },
+ { kLoLMonsterShiftOffsets, kLoL, kPlatformPC98, kNoSpecial, UNK_LANG, &kLoLMonsterShiftOffsetsPC98Provider },
+ { kLoLMonsterDirFlags, kLoL, kPlatformPC98, kNoSpecial, UNK_LANG, &kLoLMonsterDirFlagsPC98Provider },
+ { kLoLMonsterScaleY, kLoL, kPlatformPC98, kNoSpecial, UNK_LANG, &kLoLMonsterScaleYPC98Provider },
+ { kLoLMonsterScaleX, kLoL, kPlatformPC98, kNoSpecial, UNK_LANG, &kLoLMonsterScaleXPC98Provider },
+ { kLoLMonsterScaleWH, kLoL, kPlatformPC98, kNoSpecial, UNK_LANG, &kLoLMonsterScaleWHPC98Provider },
+ { kLoLFlyingObjectShp, kLoL, kPlatformPC98, kNoSpecial, UNK_LANG, &kLoLFlyingObjectShpPC98Provider },
+ { kLoLInventoryDesc, kLoL, kPlatformPC98, kNoSpecial, UNK_LANG, &kLoLInventoryDescPC98Provider },
+ { kLoLLevelShpList, kLoL, kPlatformPC98, kNoSpecial, UNK_LANG, &kLoLLevelShpListPC98Provider },
+ { kLoLLevelDatList, kLoL, kPlatformPC98, kNoSpecial, UNK_LANG, &kLoLLevelDatListPC98Provider },
+ { kLoLCompassDefs, kLoL, kPlatformPC98, kNoSpecial, UNK_LANG, &kLoLCompassDefsPC98Provider },
+ { kLoLStashSetup, kLoL, kPlatformPC98, kNoSpecial, UNK_LANG, &kLoLStashSetupPC98Provider },
+ { kLoLDscWalls, kLoL, kPlatformPC98, kNoSpecial, UNK_LANG, &kLoLDscWallsPC98Provider },
+ { kRpgCommonDscShapeIndex, kLoL, kPlatformPC98, kNoSpecial, UNK_LANG, &kLoLDscShapeIndexPC98Provider },
+ { kLoLDscOvlMap, kLoL, kPlatformPC98, kNoSpecial, UNK_LANG, &kLoLDscOvlMapPC98Provider },
+ { kLoLDscScaleWidthData, kLoL, kPlatformPC98, kNoSpecial, UNK_LANG, &kLoLDscScaleWidthDataPC98Provider },
+ { kLoLDscScaleHeightData, kLoL, kPlatformPC98, kNoSpecial, UNK_LANG, &kLoLDscScaleHeightDataPC98Provider },
+ { kRpgCommonDscX, kLoL, kPlatformPC98, kNoSpecial, UNK_LANG, &kLoLDscXPC98Provider },
+ { kLoLBaseDscY, kLoL, kPlatformPC98, kNoSpecial, UNK_LANG, &kLoLBaseDscYPC98Provider },
+ { kRpgCommonDscTileIndex, kLoL, kPlatformPC98, kNoSpecial, UNK_LANG, &kLoLDscTileIndexPC98Provider },
+ { kRpgCommonDscUnk2, kLoL, kPlatformPC98, kNoSpecial, UNK_LANG, &kLoLDscUnk2PC98Provider },
+ { kRpgCommonDscDoorShapeIndex, kLoL, kPlatformPC98, kNoSpecial, UNK_LANG, &kLoLDscDoorShapeIndexPC98Provider },
+ { kRpgCommonDscDimData1, kLoL, kPlatformPC98, kNoSpecial, UNK_LANG, &kLoLDscDimData1PC98Provider },
+ { kRpgCommonDscDimData2, kLoL, kPlatformPC98, kNoSpecial, UNK_LANG, &kLoLDscDimData2PC98Provider },
+ { kRpgCommonDscBlockMap, kLoL, kPlatformPC98, kNoSpecial, UNK_LANG, &kLoLDscBlockMapPC98Provider },
+ { kRpgCommonDscDimMap, kLoL, kPlatformPC98, kNoSpecial, UNK_LANG, &kLoLDscDimMapPC98Provider },
+ { kLoLDscOvlIndex, kLoL, kPlatformPC98, kNoSpecial, UNK_LANG, &kLoLDscOvlIndexPC98Provider },
+ { kRpgCommonDscBlockIndex, kLoL, kPlatformPC98, kNoSpecial, UNK_LANG, &kLoLDscBlockIndexPC98Provider },
+ { kRpgCommonDscDoorY2, kLoL, kPlatformPC98, kNoSpecial, UNK_LANG, &kLoLDscDoorY2PC98Provider },
+ { kRpgCommonDscDoorFrameY1, kLoL, kPlatformPC98, kNoSpecial, UNK_LANG, &kLoLDscDoorFrameY1PC98Provider },
+ { kRpgCommonDscDoorFrameY2, kLoL, kPlatformPC98, kNoSpecial, UNK_LANG, &kLoLDscDoorFrameY2PC98Provider },
+ { kLoLDscDoorScale, kLoL, kPlatformPC98, kNoSpecial, UNK_LANG, &kLoLDscDoorScalePC98Provider },
+ { kLoLDscDoor4, kLoL, kPlatformPC98, kNoSpecial, UNK_LANG, &kLoLDscDoor4PC98Provider },
+ { kLoLDscDoorX, kLoL, kPlatformPC98, kNoSpecial, UNK_LANG, &kLoLDscDoorXPC98Provider },
+ { kLoLDscDoorY, kLoL, kPlatformPC98, kNoSpecial, UNK_LANG, &kLoLDscDoorYPC98Provider },
+ { kLoLScrollXTop, kLoL, kPlatformPC98, kNoSpecial, UNK_LANG, &kLoLScrollXTopPC98Provider },
+ { kLoLScrollYTop, kLoL, kPlatformPC98, kNoSpecial, UNK_LANG, &kLoLScrollYTopPC98Provider },
+ { kLoLScrollXBottom, kLoL, kPlatformPC98, kNoSpecial, UNK_LANG, &kLoLScrollXBottomPC98Provider },
+ { kLoLScrollYBottom, kLoL, kPlatformPC98, kNoSpecial, UNK_LANG, &kLoLScrollYBottomPC98Provider },
+ { kLoLButtonDefs, kLoL, kPlatformPC98, kNoSpecial, UNK_LANG, &kLoLButtonDefsPC98Provider },
+ { kLoLButtonList1, kLoL, kPlatformPC98, kNoSpecial, UNK_LANG, &kLoLButtonList1PC98Provider },
+ { kLoLButtonList2, kLoL, kPlatformPC98, kNoSpecial, UNK_LANG, &kLoLButtonList2PC98Provider },
+ { kLoLButtonList3, kLoL, kPlatformPC98, kNoSpecial, UNK_LANG, &kLoLButtonList3PC98Provider },
+ { kLoLButtonList4, kLoL, kPlatformPC98, kNoSpecial, UNK_LANG, &kLoLButtonList4PC98Provider },
+ { kLoLButtonList5, kLoL, kPlatformPC98, kNoSpecial, UNK_LANG, &kLoLButtonList5PC98Provider },
+ { kLoLButtonList6, kLoL, kPlatformPC98, kNoSpecial, UNK_LANG, &kLoLButtonList6PC98Provider },
+ { kLoLButtonList7, kLoL, kPlatformPC98, kNoSpecial, UNK_LANG, &kLoLButtonList7PC98Provider },
+ { kLoLButtonList8, kLoL, kPlatformPC98, kNoSpecial, UNK_LANG, &kLoLButtonList8PC98Provider },
+ { kLoLLegendData, kLoL, kPlatformPC98, kNoSpecial, UNK_LANG, &kLoLLegendDataPC98Provider },
+ { kLoLMapStringId, kLoL, kPlatformPC98, kNoSpecial, UNK_LANG, &kLoLMapStringIdPC98Provider },
+ { kLoLSpellbookAnim, kLoL, kPlatformPC98, kNoSpecial, UNK_LANG, &kLoLSpellbookAnimPC98Provider },
+ { kLoLSpellbookCoords, kLoL, kPlatformPC98, kNoSpecial, UNK_LANG, &kLoLSpellbookCoordsPC98Provider },
+ { kLoLHealShapeFrames, kLoL, kPlatformPC98, kNoSpecial, UNK_LANG, &kLoLHealShapeFramesPC98Provider },
+ { kLoLLightningDefs, kLoL, kPlatformPC98, kNoSpecial, UNK_LANG, &kLoLLightningDefsPC98Provider },
+ { kLoLFireballCoords, kLoL, kPlatformPC98, kNoSpecial, UNK_LANG, &kLoLFireballCoordsPC98Provider },
+ { kLoLCredits, kLoL, kPlatformPC98, kNoSpecial, UNK_LANG, &kLoLCreditsPC98Provider },
+ { kLoLIngamePakFiles, kLoL, kPlatformFMTowns, kNoSpecial, UNK_LANG, &kLoLIngamePakFilesFMTownsProvider },
+ { kLoLCharacterDefs, kLoL, kPlatformFMTowns, kNoSpecial, JA_JPN, &kLoLCharacterDefsFMTownsJapaneseProvider },
+ { kLoLIngameSfxFiles, kLoL, kPlatformFMTowns, kNoSpecial, UNK_LANG, &kLoLIngameSfxFilesFMTownsProvider },
+ { kLoLIngameSfxIndex, kLoL, kPlatformFMTowns, kNoSpecial, UNK_LANG, &kLoLIngameSfxIndexFMTownsProvider },
+ { kLoLSpellProperties, kLoL, kPlatformFMTowns, kNoSpecial, UNK_LANG, &kLoLSpellPropertiesFMTownsProvider },
+ { kLoLGameShapeMap, kLoL, kPlatformFMTowns, kNoSpecial, UNK_LANG, &kLoLGameShapeMapFMTownsProvider },
+ { kLoLSceneItemOffs, kLoL, kPlatformFMTowns, kNoSpecial, UNK_LANG, &kLoLSceneItemOffsFMTownsProvider },
+ { kLoLCharInvIndex, kLoL, kPlatformFMTowns, kNoSpecial, UNK_LANG, &kLoLCharInvIndexFMTownsProvider },
+ { kLoLCharInvDefs, kLoL, kPlatformFMTowns, kNoSpecial, UNK_LANG, &kLoLCharInvDefsFMTownsProvider },
+ { kLoLCharDefsMan, kLoL, kPlatformFMTowns, kNoSpecial, UNK_LANG, &kLoLCharDefsManFMTownsProvider },
+ { kLoLCharDefsWoman, kLoL, kPlatformFMTowns, kNoSpecial, UNK_LANG, &kLoLCharDefsWomanFMTownsProvider },
+ { kLoLCharDefsKieran, kLoL, kPlatformFMTowns, kNoSpecial, UNK_LANG, &kLoLCharDefsKieranFMTownsProvider },
+ { kLoLCharDefsAkshel, kLoL, kPlatformFMTowns, kNoSpecial, UNK_LANG, &kLoLCharDefsAkshelFMTownsProvider },
+ { kLoLExpRequirements, kLoL, kPlatformFMTowns, kNoSpecial, UNK_LANG, &kLoLExpRequirementsFMTownsProvider },
+ { kLoLMonsterModifiers1, kLoL, kPlatformFMTowns, kNoSpecial, UNK_LANG, &kLoLMonsterModifiers1FMTownsProvider },
+ { kLoLMonsterModifiers2, kLoL, kPlatformFMTowns, kNoSpecial, UNK_LANG, &kLoLMonsterModifiers2FMTownsProvider },
+ { kLoLMonsterModifiers3, kLoL, kPlatformFMTowns, kNoSpecial, UNK_LANG, &kLoLMonsterModifiers3FMTownsProvider },
+ { kLoLMonsterShiftOffsets, kLoL, kPlatformFMTowns, kNoSpecial, UNK_LANG, &kLoLMonsterShiftOffsetsFMTownsProvider },
+ { kLoLMonsterDirFlags, kLoL, kPlatformFMTowns, kNoSpecial, UNK_LANG, &kLoLMonsterDirFlagsFMTownsProvider },
+ { kLoLMonsterScaleY, kLoL, kPlatformFMTowns, kNoSpecial, UNK_LANG, &kLoLMonsterScaleYFMTownsProvider },
+ { kLoLMonsterScaleX, kLoL, kPlatformFMTowns, kNoSpecial, UNK_LANG, &kLoLMonsterScaleXFMTownsProvider },
+ { kLoLMonsterScaleWH, kLoL, kPlatformFMTowns, kNoSpecial, UNK_LANG, &kLoLMonsterScaleWHFMTownsProvider },
+ { kLoLFlyingObjectShp, kLoL, kPlatformFMTowns, kNoSpecial, UNK_LANG, &kLoLFlyingObjectShpFMTownsProvider },
+ { kLoLInventoryDesc, kLoL, kPlatformFMTowns, kNoSpecial, UNK_LANG, &kLoLInventoryDescFMTownsProvider },
+ { kLoLLevelShpList, kLoL, kPlatformFMTowns, kNoSpecial, UNK_LANG, &kLoLLevelShpListFMTownsProvider },
+ { kLoLLevelDatList, kLoL, kPlatformFMTowns, kNoSpecial, UNK_LANG, &kLoLLevelDatListFMTownsProvider },
+ { kLoLCompassDefs, kLoL, kPlatformFMTowns, kNoSpecial, UNK_LANG, &kLoLCompassDefsFMTownsProvider },
+ { kLoLStashSetup, kLoL, kPlatformFMTowns, kNoSpecial, UNK_LANG, &kLoLStashSetupFMTownsProvider },
+ { kLoLDscWalls, kLoL, kPlatformFMTowns, kNoSpecial, UNK_LANG, &kLoLDscWallsFMTownsProvider },
+ { kRpgCommonDscShapeIndex, kLoL, kPlatformFMTowns, kNoSpecial, UNK_LANG, &kLoLDscShapeIndexFMTownsProvider },
+ { kLoLDscOvlMap, kLoL, kPlatformFMTowns, kNoSpecial, UNK_LANG, &kLoLDscOvlMapFMTownsProvider },
+ { kLoLDscScaleWidthData, kLoL, kPlatformFMTowns, kNoSpecial, UNK_LANG, &kLoLDscScaleWidthDataFMTownsProvider },
+ { kLoLDscScaleHeightData, kLoL, kPlatformFMTowns, kNoSpecial, UNK_LANG, &kLoLDscScaleHeightDataFMTownsProvider },
+ { kRpgCommonDscX, kLoL, kPlatformFMTowns, kNoSpecial, UNK_LANG, &kLoLDscXFMTownsProvider },
+ { kLoLBaseDscY, kLoL, kPlatformFMTowns, kNoSpecial, UNK_LANG, &kLoLBaseDscYFMTownsProvider },
+ { kRpgCommonDscTileIndex, kLoL, kPlatformFMTowns, kNoSpecial, UNK_LANG, &kLoLDscTileIndexFMTownsProvider },
+ { kRpgCommonDscUnk2, kLoL, kPlatformFMTowns, kNoSpecial, UNK_LANG, &kLoLDscUnk2FMTownsProvider },
+ { kRpgCommonDscDoorShapeIndex, kLoL, kPlatformFMTowns, kNoSpecial, UNK_LANG, &kLoLDscDoorShapeIndexFMTownsProvider },
+ { kRpgCommonDscDimData1, kLoL, kPlatformFMTowns, kNoSpecial, UNK_LANG, &kLoLDscDimData1FMTownsProvider },
+ { kRpgCommonDscDimData2, kLoL, kPlatformFMTowns, kNoSpecial, UNK_LANG, &kLoLDscDimData2FMTownsProvider },
+ { kRpgCommonDscBlockMap, kLoL, kPlatformFMTowns, kNoSpecial, UNK_LANG, &kLoLDscBlockMapFMTownsProvider },
+ { kRpgCommonDscDimMap, kLoL, kPlatformFMTowns, kNoSpecial, UNK_LANG, &kLoLDscDimMapFMTownsProvider },
+ { kLoLDscOvlIndex, kLoL, kPlatformFMTowns, kNoSpecial, UNK_LANG, &kLoLDscOvlIndexFMTownsProvider },
+ { kRpgCommonDscBlockIndex, kLoL, kPlatformFMTowns, kNoSpecial, UNK_LANG, &kLoLDscBlockIndexFMTownsProvider },
+ { kRpgCommonDscDoorY2, kLoL, kPlatformFMTowns, kNoSpecial, UNK_LANG, &kLoLDscDoorY2FMTownsProvider },
+ { kRpgCommonDscDoorFrameY1, kLoL, kPlatformFMTowns, kNoSpecial, UNK_LANG, &kLoLDscDoorFrameY1FMTownsProvider },
+ { kRpgCommonDscDoorFrameY2, kLoL, kPlatformFMTowns, kNoSpecial, UNK_LANG, &kLoLDscDoorFrameY2FMTownsProvider },
+ { kLoLDscDoorScale, kLoL, kPlatformFMTowns, kNoSpecial, UNK_LANG, &kLoLDscDoorScaleFMTownsProvider },
+ { kLoLDscDoor4, kLoL, kPlatformFMTowns, kNoSpecial, UNK_LANG, &kLoLDscDoor4FMTownsProvider },
+ { kLoLDscDoorX, kLoL, kPlatformFMTowns, kNoSpecial, UNK_LANG, &kLoLDscDoorXFMTownsProvider },
+ { kLoLDscDoorY, kLoL, kPlatformFMTowns, kNoSpecial, UNK_LANG, &kLoLDscDoorYFMTownsProvider },
+ { kLoLScrollXTop, kLoL, kPlatformFMTowns, kNoSpecial, UNK_LANG, &kLoLScrollXTopFMTownsProvider },
+ { kLoLScrollYTop, kLoL, kPlatformFMTowns, kNoSpecial, UNK_LANG, &kLoLScrollYTopFMTownsProvider },
+ { kLoLScrollXBottom, kLoL, kPlatformFMTowns, kNoSpecial, UNK_LANG, &kLoLScrollXBottomFMTownsProvider },
+ { kLoLScrollYBottom, kLoL, kPlatformFMTowns, kNoSpecial, UNK_LANG, &kLoLScrollYBottomFMTownsProvider },
+ { kLoLButtonDefs, kLoL, kPlatformFMTowns, kNoSpecial, UNK_LANG, &kLoLButtonDefsFMTownsProvider },
+ { kLoLButtonList1, kLoL, kPlatformFMTowns, kNoSpecial, UNK_LANG, &kLoLButtonList1FMTownsProvider },
+ { kLoLButtonList2, kLoL, kPlatformFMTowns, kNoSpecial, UNK_LANG, &kLoLButtonList2FMTownsProvider },
+ { kLoLButtonList3, kLoL, kPlatformFMTowns, kNoSpecial, UNK_LANG, &kLoLButtonList3FMTownsProvider },
+ { kLoLButtonList4, kLoL, kPlatformFMTowns, kNoSpecial, UNK_LANG, &kLoLButtonList4FMTownsProvider },
+ { kLoLButtonList5, kLoL, kPlatformFMTowns, kNoSpecial, UNK_LANG, &kLoLButtonList5FMTownsProvider },
+ { kLoLButtonList6, kLoL, kPlatformFMTowns, kNoSpecial, UNK_LANG, &kLoLButtonList6FMTownsProvider },
+ { kLoLButtonList7, kLoL, kPlatformFMTowns, kNoSpecial, UNK_LANG, &kLoLButtonList7FMTownsProvider },
+ { kLoLButtonList8, kLoL, kPlatformFMTowns, kNoSpecial, UNK_LANG, &kLoLButtonList8FMTownsProvider },
+ { kLoLLegendData, kLoL, kPlatformFMTowns, kNoSpecial, UNK_LANG, &kLoLLegendDataFMTownsProvider },
+ { kLoLMapStringId, kLoL, kPlatformFMTowns, kNoSpecial, UNK_LANG, &kLoLMapStringIdFMTownsProvider },
+ { kLoLSpellbookAnim, kLoL, kPlatformFMTowns, kNoSpecial, UNK_LANG, &kLoLSpellbookAnimFMTownsProvider },
+ { kLoLSpellbookCoords, kLoL, kPlatformFMTowns, kNoSpecial, UNK_LANG, &kLoLSpellbookCoordsFMTownsProvider },
+ { kLoLHealShapeFrames, kLoL, kPlatformFMTowns, kNoSpecial, UNK_LANG, &kLoLHealShapeFramesFMTownsProvider },
+ { kLoLLightningDefs, kLoL, kPlatformFMTowns, kNoSpecial, UNK_LANG, &kLoLLightningDefsFMTownsProvider },
+ { kLoLFireballCoords, kLoL, kPlatformFMTowns, kNoSpecial, UNK_LANG, &kLoLFireballCoordsFMTownsProvider },
+ { kLoLCredits, kLoL, kPlatformFMTowns, kNoSpecial, UNK_LANG, &kLoLCreditsFMTownsProvider },
+ { kLoLHistory, kLoL, kPlatformDOS, kTalkieVersion, UNK_LANG, &kLoLHistoryDOSCDProvider },
+ { kLoLCharacterDefs, kLoL, kPlatformDOS, kTalkieVersion, EN_ANY, &kLoLCharacterDefsDOSCDEnglishProvider },
+ { kLoLIngameSfxFiles, kLoL, kPlatformDOS, kTalkieVersion, UNK_LANG, &kLoLIngameSfxFilesDOSCDProvider },
+ { kLoLIngameSfxIndex, kLoL, kPlatformDOS, kTalkieVersion, UNK_LANG, &kLoLIngameSfxIndexDOSCDProvider },
+ { kLoLMusicTrackMap, kLoL, kPlatformDOS, kTalkieVersion, UNK_LANG, &kLoLMusicTrackMapDOSCDProvider },
+ { kLoLIngameGMSfxIndex, kLoL, kPlatformDOS, kTalkieVersion, UNK_LANG, &kLoLIngameGMSfxIndexDOSCDProvider },
+ { kLoLIngameMT32SfxIndex, kLoL, kPlatformDOS, kTalkieVersion, UNK_LANG, &kLoLIngameMT32SfxIndexDOSCDProvider },
+ { kLoLIngamePcSpkSfxIndex, kLoL, kPlatformDOS, kTalkieVersion, UNK_LANG, &kLoLIngamePcSpkSfxIndexDOSCDProvider },
+ { kLoLSpellProperties, kLoL, kPlatformDOS, kTalkieVersion, UNK_LANG, &kLoLSpellPropertiesDOSCDProvider },
+ { kLoLGameShapeMap, kLoL, kPlatformDOS, kTalkieVersion, UNK_LANG, &kLoLGameShapeMapDOSCDProvider },
+ { kLoLSceneItemOffs, kLoL, kPlatformDOS, kTalkieVersion, UNK_LANG, &kLoLSceneItemOffsDOSCDProvider },
+ { kLoLCharInvIndex, kLoL, kPlatformDOS, kTalkieVersion, UNK_LANG, &kLoLCharInvIndexDOSCDProvider },
+ { kLoLCharInvDefs, kLoL, kPlatformDOS, kTalkieVersion, UNK_LANG, &kLoLCharInvDefsDOSCDProvider },
+ { kLoLCharDefsMan, kLoL, kPlatformDOS, kTalkieVersion, UNK_LANG, &kLoLCharDefsManDOSCDProvider },
+ { kLoLCharDefsWoman, kLoL, kPlatformDOS, kTalkieVersion, UNK_LANG, &kLoLCharDefsWomanDOSCDProvider },
+ { kLoLCharDefsKieran, kLoL, kPlatformDOS, kTalkieVersion, UNK_LANG, &kLoLCharDefsKieranDOSCDProvider },
+ { kLoLCharDefsAkshel, kLoL, kPlatformDOS, kTalkieVersion, UNK_LANG, &kLoLCharDefsAkshelDOSCDProvider },
+ { kLoLExpRequirements, kLoL, kPlatformDOS, kTalkieVersion, UNK_LANG, &kLoLExpRequirementsDOSCDProvider },
+ { kLoLMonsterModifiers1, kLoL, kPlatformDOS, kTalkieVersion, UNK_LANG, &kLoLMonsterModifiers1DOSCDProvider },
+ { kLoLMonsterModifiers2, kLoL, kPlatformDOS, kTalkieVersion, UNK_LANG, &kLoLMonsterModifiers2DOSCDProvider },
+ { kLoLMonsterModifiers3, kLoL, kPlatformDOS, kTalkieVersion, UNK_LANG, &kLoLMonsterModifiers3DOSCDProvider },
+ { kLoLMonsterModifiers4, kLoL, kPlatformDOS, kTalkieVersion, UNK_LANG, &kLoLMonsterModifiers4DOSCDProvider },
+ { kLoLMonsterShiftOffsets, kLoL, kPlatformDOS, kTalkieVersion, UNK_LANG, &kLoLMonsterShiftOffsetsDOSCDProvider },
+ { kLoLMonsterDirFlags, kLoL, kPlatformDOS, kTalkieVersion, UNK_LANG, &kLoLMonsterDirFlagsDOSCDProvider },
+ { kLoLMonsterScaleY, kLoL, kPlatformDOS, kTalkieVersion, UNK_LANG, &kLoLMonsterScaleYDOSCDProvider },
+ { kLoLMonsterScaleX, kLoL, kPlatformDOS, kTalkieVersion, UNK_LANG, &kLoLMonsterScaleXDOSCDProvider },
+ { kLoLMonsterScaleWH, kLoL, kPlatformDOS, kTalkieVersion, UNK_LANG, &kLoLMonsterScaleWHDOSCDProvider },
+ { kLoLFlyingObjectShp, kLoL, kPlatformDOS, kTalkieVersion, UNK_LANG, &kLoLFlyingObjectShpDOSCDProvider },
+ { kLoLInventoryDesc, kLoL, kPlatformDOS, kTalkieVersion, UNK_LANG, &kLoLInventoryDescDOSCDProvider },
+ { kLoLLevelShpList, kLoL, kPlatformDOS, kTalkieVersion, UNK_LANG, &kLoLLevelShpListDOSCDProvider },
+ { kLoLLevelDatList, kLoL, kPlatformDOS, kTalkieVersion, UNK_LANG, &kLoLLevelDatListDOSCDProvider },
+ { kLoLCompassDefs, kLoL, kPlatformDOS, kTalkieVersion, UNK_LANG, &kLoLCompassDefsDOSCDProvider },
+ { kLoLItemPrices, kLoL, kPlatformDOS, kTalkieVersion, UNK_LANG, &kLoLItemPricesDOSCDProvider },
+ { kLoLStashSetup, kLoL, kPlatformDOS, kTalkieVersion, UNK_LANG, &kLoLStashSetupDOSCDProvider },
+ { kLoLDscWalls, kLoL, kPlatformDOS, kTalkieVersion, UNK_LANG, &kLoLDscWallsDOSCDProvider },
+ { kRpgCommonDscShapeIndex, kLoL, kPlatformDOS, kTalkieVersion, UNK_LANG, &kLoLDscShapeIndexDOSCDProvider },
+ { kLoLDscOvlMap, kLoL, kPlatformDOS, kTalkieVersion, UNK_LANG, &kLoLDscOvlMapDOSCDProvider },
+ { kLoLDscScaleWidthData, kLoL, kPlatformDOS, kTalkieVersion, UNK_LANG, &kLoLDscScaleWidthDataDOSCDProvider },
+ { kLoLDscScaleHeightData, kLoL, kPlatformDOS, kTalkieVersion, UNK_LANG, &kLoLDscScaleHeightDataDOSCDProvider },
+ { kRpgCommonDscX, kLoL, kPlatformDOS, kTalkieVersion, UNK_LANG, &kLoLDscXDOSCDProvider },
+ { kLoLBaseDscY, kLoL, kPlatformDOS, kTalkieVersion, UNK_LANG, &kLoLBaseDscYDOSCDProvider },
+ { kRpgCommonDscTileIndex, kLoL, kPlatformDOS, kTalkieVersion, UNK_LANG, &kLoLDscTileIndexDOSCDProvider },
+ { kRpgCommonDscUnk2, kLoL, kPlatformDOS, kTalkieVersion, UNK_LANG, &kLoLDscUnk2DOSCDProvider },
+ { kRpgCommonDscDoorShapeIndex, kLoL, kPlatformDOS, kTalkieVersion, UNK_LANG, &kLoLDscDoorShapeIndexDOSCDProvider },
+ { kRpgCommonDscDimData1, kLoL, kPlatformDOS, kTalkieVersion, UNK_LANG, &kLoLDscDimData1DOSCDProvider },
+ { kRpgCommonDscDimData2, kLoL, kPlatformDOS, kTalkieVersion, UNK_LANG, &kLoLDscDimData2DOSCDProvider },
+ { kRpgCommonDscBlockMap, kLoL, kPlatformDOS, kTalkieVersion, UNK_LANG, &kLoLDscBlockMapDOSCDProvider },
+ { kRpgCommonDscDimMap, kLoL, kPlatformDOS, kTalkieVersion, UNK_LANG, &kLoLDscDimMapDOSCDProvider },
+ { kLoLDscOvlIndex, kLoL, kPlatformDOS, kTalkieVersion, UNK_LANG, &kLoLDscOvlIndexDOSCDProvider },
+ { kRpgCommonDscBlockIndex, kLoL, kPlatformDOS, kTalkieVersion, UNK_LANG, &kLoLDscBlockIndexDOSCDProvider },
+ { kRpgCommonDscDoorY2, kLoL, kPlatformDOS, kTalkieVersion, UNK_LANG, &kLoLDscDoorY2DOSCDProvider },
+ { kRpgCommonDscDoorFrameY1, kLoL, kPlatformDOS, kTalkieVersion, UNK_LANG, &kLoLDscDoorFrameY1DOSCDProvider },
+ { kRpgCommonDscDoorFrameY2, kLoL, kPlatformDOS, kTalkieVersion, UNK_LANG, &kLoLDscDoorFrameY2DOSCDProvider },
+ { kLoLDscDoorScale, kLoL, kPlatformDOS, kTalkieVersion, UNK_LANG, &kLoLDscDoorScaleDOSCDProvider },
+ { kLoLDscDoor4, kLoL, kPlatformDOS, kTalkieVersion, UNK_LANG, &kLoLDscDoor4DOSCDProvider },
+ { kLoLDscDoorX, kLoL, kPlatformDOS, kTalkieVersion, UNK_LANG, &kLoLDscDoorXDOSCDProvider },
+ { kLoLDscDoorY, kLoL, kPlatformDOS, kTalkieVersion, UNK_LANG, &kLoLDscDoorYDOSCDProvider },
+ { kLoLScrollXTop, kLoL, kPlatformDOS, kTalkieVersion, UNK_LANG, &kLoLScrollXTopDOSCDProvider },
+ { kLoLScrollYTop, kLoL, kPlatformDOS, kTalkieVersion, UNK_LANG, &kLoLScrollYTopDOSCDProvider },
+ { kLoLScrollXBottom, kLoL, kPlatformDOS, kTalkieVersion, UNK_LANG, &kLoLScrollXBottomDOSCDProvider },
+ { kLoLScrollYBottom, kLoL, kPlatformDOS, kTalkieVersion, UNK_LANG, &kLoLScrollYBottomDOSCDProvider },
+ { kLoLButtonDefs, kLoL, kPlatformDOS, kTalkieVersion, UNK_LANG, &kLoLButtonDefsDOSCDProvider },
+ { kLoLButtonList1, kLoL, kPlatformDOS, kTalkieVersion, UNK_LANG, &kLoLButtonList1DOSCDProvider },
+ { kLoLButtonList2, kLoL, kPlatformDOS, kTalkieVersion, UNK_LANG, &kLoLButtonList2DOSCDProvider },
+ { kLoLButtonList3, kLoL, kPlatformDOS, kTalkieVersion, UNK_LANG, &kLoLButtonList3DOSCDProvider },
+ { kLoLButtonList4, kLoL, kPlatformDOS, kTalkieVersion, UNK_LANG, &kLoLButtonList4DOSCDProvider },
+ { kLoLButtonList5, kLoL, kPlatformDOS, kTalkieVersion, UNK_LANG, &kLoLButtonList5DOSCDProvider },
+ { kLoLButtonList6, kLoL, kPlatformDOS, kTalkieVersion, UNK_LANG, &kLoLButtonList6DOSCDProvider },
+ { kLoLButtonList7, kLoL, kPlatformDOS, kTalkieVersion, UNK_LANG, &kLoLButtonList7DOSCDProvider },
+ { kLoLButtonList8, kLoL, kPlatformDOS, kTalkieVersion, UNK_LANG, &kLoLButtonList8DOSCDProvider },
+ { kLoLLegendData, kLoL, kPlatformDOS, kTalkieVersion, UNK_LANG, &kLoLLegendDataDOSCDProvider },
+ { kLoLMapCursorOvl, kLoL, kPlatformDOS, kTalkieVersion, UNK_LANG, &kLoLMapCursorOvlDOSCDProvider },
+ { kLoLMapStringId, kLoL, kPlatformDOS, kTalkieVersion, UNK_LANG, &kLoLMapStringIdDOSCDProvider },
+ { kLoLSpellbookAnim, kLoL, kPlatformDOS, kTalkieVersion, UNK_LANG, &kLoLSpellbookAnimDOSCDProvider },
+ { kLoLSpellbookCoords, kLoL, kPlatformDOS, kTalkieVersion, UNK_LANG, &kLoLSpellbookCoordsDOSCDProvider },
+ { kLoLHealShapeFrames, kLoL, kPlatformDOS, kTalkieVersion, UNK_LANG, &kLoLHealShapeFramesDOSCDProvider },
+ { kLoLLightningDefs, kLoL, kPlatformDOS, kTalkieVersion, UNK_LANG, &kLoLLightningDefsDOSCDProvider },
+ { kLoLFireballCoords, kLoL, kPlatformDOS, kTalkieVersion, UNK_LANG, &kLoLFireballCoordsDOSCDProvider },
+ { kLoLCharacterDefs, kLoL, kPlatformDOS, kTalkieVersion, FR_FRA, &kLoLCharacterDefsDOSCDFrenchProvider },
+ { kLoLCharacterDefs, kLoL, kPlatformDOS, kTalkieVersion, DE_DEU, &kLoLCharacterDefsDOSCDGermanProvider },
+ { kLoLCharacterDefs, kLoL, kPlatformDOS, kTalkieVersion, IT_ITA, &kLoLCharacterDefsDOSCDItalianProvider },
+ { kLoLCharacterDefs, kLoL, kPlatformDOS, kTalkieVersion, RU_RUS, &kLoLCharacterDefsDOSCDRussianProvider },
+ { kMaxResIDs, kKyra1, kPlatformDOS, kNoSpecial, UNK_LANG, NULL }
+};
+
+const ResourceProvider *obtainResourceProviders() {
+ return resourceProviders;
+}
diff --git a/devtools/create_kyradat/resources.h b/devtools/create_kyradat/resources.h
new file mode 100644
index 0000000000..c9ab232b02
--- /dev/null
+++ b/devtools/create_kyradat/resources.h
@@ -0,0 +1,45 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ */
+
+#ifndef CREATE_KYRADAT_RESOURCES_H
+#define CREATE_KYRADAT_RESOURCES_H
+
+#include "create_kyradat.h"
+
+#include "common/util.h"
+#include "common/language.h"
+#include "common/platform.h"
+
+using namespace Common;
+
+struct ResourceProvider {
+ kExtractID id;
+ kGame game;
+ Platform platform;
+ kSpecial special;
+ Language language;
+ const void *provider;
+};
+
+const ResourceProvider *obtainResourceProviders();
+
+#endif
diff --git a/devtools/create_kyradat/resources/eob1_dos.h b/devtools/create_kyradat/resources/eob1_dos.h
new file mode 100644
index 0000000000..b2aa8845de
--- /dev/null
+++ b/devtools/create_kyradat/resources/eob1_dos.h
@@ -0,0 +1,1765 @@
+static const byte kEoB1ChargenStartLevelsDOS[60] = {
+ 0x03, 0x00, 0x00, 0x01, 0x03, 0x00, 0x00, 0x01,
+ 0x03, 0x00, 0x00, 0x01, 0x03, 0x00, 0x00, 0x01,
+ 0x03, 0x00, 0x00, 0x01, 0x04, 0x00, 0x00, 0x01,
+ 0x02, 0x02, 0x00, 0x02, 0x02, 0x03, 0x00, 0x02,
+ 0x02, 0x02, 0x00, 0x02, 0x01, 0x01, 0x02, 0x03,
+ 0x03, 0x02, 0x00, 0x02, 0x02, 0x03, 0x00, 0x02,
+ 0x01, 0x02, 0x01, 0x03, 0x02, 0x02, 0x00, 0x02,
+ 0x02, 0x02, 0x00, 0x02
+};
+
+static const ByteProvider kEoB1ChargenStartLevelsDOSProvider = { ARRAYSIZE(kEoB1ChargenStartLevelsDOS), kEoB1ChargenStartLevelsDOS };
+
+static const byte kEoB1ChargenClassMinStatsDOS[90] = {
+ 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0D, 0x00,
+ 0x0E, 0x0D, 0x0E, 0x00, 0x0C, 0x00, 0x0D, 0x00,
+ 0x09, 0x11, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x09, 0x00, 0x00, 0x09, 0x00, 0x09, 0x00,
+ 0x00, 0x00, 0x09, 0x00, 0x00, 0x09, 0x00, 0x00,
+ 0x09, 0x09, 0x00, 0x00, 0x00, 0x00, 0x09, 0x09,
+ 0x00, 0x09, 0x00, 0x00, 0x00, 0x09, 0x00, 0x09,
+ 0x00, 0x00, 0x00, 0x00, 0x09, 0x09, 0x00, 0x00,
+ 0x09, 0x09, 0x09, 0x00, 0x00, 0x00, 0x0D, 0x00,
+ 0x0E, 0x0D, 0x0E, 0x00, 0x00, 0x09, 0x09, 0x00,
+ 0x00, 0x00
+};
+
+static const ByteProvider kEoB1ChargenClassMinStatsDOSProvider = { ARRAYSIZE(kEoB1ChargenClassMinStatsDOS), kEoB1ChargenClassMinStatsDOS };
+
+static const byte kEoB1ChargenRaceMinStatsDOS[36] = {
+ 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x08,
+ 0x03, 0x07, 0x06, 0x08, 0x03, 0x04, 0x03, 0x06,
+ 0x06, 0x03, 0x08, 0x03, 0x03, 0x03, 0x0C, 0x02,
+ 0x06, 0x07, 0x02, 0x03, 0x08, 0x03, 0x07, 0x06,
+ 0x03, 0x08, 0x0A, 0x06
+};
+
+static const ByteProvider kEoB1ChargenRaceMinStatsDOSProvider = { ARRAYSIZE(kEoB1ChargenRaceMinStatsDOS), kEoB1ChargenRaceMinStatsDOS };
+
+static const uint16 kEoB1ChargenRaceMaxStatsDOS[36] = {
+ 0x6412, 0x0012, 0x0012, 0x0012, 0x0012, 0x0012, 0x6412, 0x0012,
+ 0x0012, 0x0013, 0x0011, 0x0012, 0x6412, 0x0012, 0x0012, 0x0012,
+ 0x0012, 0x0012, 0x6412, 0x0012, 0x0012, 0x0011, 0x0013, 0x0010,
+ 0x6412, 0x0013, 0x0011, 0x0012, 0x0012, 0x0012, 0x0011, 0x0012,
+ 0x0011, 0x0013, 0x0012, 0x0012
+};
+
+static const Uint16Provider kEoB1ChargenRaceMaxStatsDOSProvider = { ARRAYSIZE(kEoB1ChargenRaceMaxStatsDOS), kEoB1ChargenRaceMaxStatsDOS };
+
+static const byte kEoB1SaveThrowTable1DOS[50] = {
+ 0x10, 0x0E, 0x0D, 0x0B, 0x0A, 0x08, 0x07, 0x05,
+ 0x04, 0x03, 0x12, 0x10, 0x0F, 0x0D, 0x0C, 0x0A,
+ 0x09, 0x07, 0x06, 0x05, 0x11, 0x0F, 0x0E, 0x0C,
+ 0x0B, 0x09, 0x08, 0x06, 0x05, 0x04, 0x14, 0x11,
+ 0x10, 0x0D, 0x0C, 0x09, 0x08, 0x05, 0x04, 0x04,
+ 0x13, 0x11, 0x10, 0x0E, 0x0D, 0x0B, 0x0A, 0x08,
+ 0x07, 0x06
+};
+
+static const ByteProvider kEoB1SaveThrowTable1DOSProvider = { ARRAYSIZE(kEoB1SaveThrowTable1DOS), kEoB1SaveThrowTable1DOS };
+
+static const byte kEoB1SaveThrowTable2DOS[25] = {
+ 0x0E, 0x0D, 0x0B, 0x0A, 0x08, 0x0B, 0x09, 0x07,
+ 0x05, 0x03, 0x0D, 0x0B, 0x09, 0x07, 0x05, 0x0F,
+ 0x0D, 0x0B, 0x09, 0x07, 0x0C, 0x0A, 0x08, 0x06,
+ 0x04
+};
+
+static const ByteProvider kEoB1SaveThrowTable2DOSProvider = { ARRAYSIZE(kEoB1SaveThrowTable2DOS), kEoB1SaveThrowTable2DOS };
+
+static const byte kEoB1SaveThrowTable3DOS[35] = {
+ 0x0A, 0x09, 0x07, 0x06, 0x05, 0x04, 0x02, 0x0E,
+ 0x0D, 0x0B, 0x0A, 0x09, 0x08, 0x06, 0x0D, 0x0C,
+ 0x0A, 0x09, 0x08, 0x07, 0x05, 0x10, 0x0F, 0x0D,
+ 0x0C, 0x0B, 0x0A, 0x08, 0x0F, 0x0E, 0x0C, 0x0B,
+ 0x0A, 0x09, 0x07
+};
+
+static const ByteProvider kEoB1SaveThrowTable3DOSProvider = { ARRAYSIZE(kEoB1SaveThrowTable3DOS), kEoB1SaveThrowTable3DOS };
+
+static const byte kEoB1SaveThrowTable4DOS[30] = {
+ 0x0D, 0x0C, 0x0B, 0x0A, 0x09, 0x08, 0x0E, 0x0C,
+ 0x0A, 0x08, 0x06, 0x07, 0x0C, 0x0B, 0x0A, 0x09,
+ 0x08, 0x04, 0x10, 0x0F, 0x0E, 0x0D, 0x0C, 0x0B,
+ 0x0F, 0x0D, 0x0B, 0x09, 0x07, 0x05
+};
+
+static const ByteProvider kEoB1SaveThrowTable4DOSProvider = { ARRAYSIZE(kEoB1SaveThrowTable4DOS), kEoB1SaveThrowTable4DOS };
+
+static const byte kEoB1SaveThrwLvlIndexDOS[6] = {
+ 0x11, 0x15, 0x13, 0x15, 0x11, 0x11
+};
+
+static const ByteProvider kEoB1SaveThrwLvlIndexDOSProvider = { ARRAYSIZE(kEoB1SaveThrwLvlIndexDOS), kEoB1SaveThrwLvlIndexDOS };
+
+static const byte kEoB1SaveThrwModDivDOS[6] = {
+ 0x02, 0x05, 0x03, 0x04, 0x02, 0x02
+};
+
+static const ByteProvider kEoB1SaveThrwModDivDOSProvider = { ARRAYSIZE(kEoB1SaveThrwModDivDOS), kEoB1SaveThrwModDivDOS };
+
+static const byte kEoB1SaveThrwModExtDOS[6] = {
+ 0x0A, 0x05, 0x07, 0x06, 0x0A, 0x0A
+};
+
+static const ByteProvider kEoB1SaveThrwModExtDOSProvider = { ARRAYSIZE(kEoB1SaveThrwModExtDOS), kEoB1SaveThrwModExtDOS };
+
+static const char *const kEoB1IntroFilesOpeningDOS[6] = {
+ "AND.CMP",
+ "SSI.CMP",
+ "PRESENT.CMP",
+ "DAND.CMP",
+ "WESTWOOD.CMP",
+ "WESTWOOD.COL"
+};
+
+static const StringListProvider kEoB1IntroFilesOpeningDOSProvider = { ARRAYSIZE(kEoB1IntroFilesOpeningDOS), kEoB1IntroFilesOpeningDOS };
+
+static const char *const kEoB1IntroFilesTowerDOS[2] = {
+ "TOWRMAGE.COL",
+ "TOWRMAGE.CMP"
+};
+
+static const StringListProvider kEoB1IntroFilesTowerDOSProvider = { ARRAYSIZE(kEoB1IntroFilesTowerDOS), kEoB1IntroFilesTowerDOS };
+
+static const char *const kEoB1IntroFilesOrbDOS[2] = {
+ "ORB.CMP",
+ "TOWRMAGE.CMP"
+};
+
+static const StringListProvider kEoB1IntroFilesOrbDOSProvider = { ARRAYSIZE(kEoB1IntroFilesOrbDOS), kEoB1IntroFilesOrbDOS };
+
+static const char *const kEoB1IntroFilesWdEntryDOS[4] = {
+ "WTRDP2.COL",
+ "WTRDP1.CMP",
+ "WTRDP2.CMP",
+ "WTRDP3.CMP"
+};
+
+static const StringListProvider kEoB1IntroFilesWdEntryDOSProvider = { ARRAYSIZE(kEoB1IntroFilesWdEntryDOS), kEoB1IntroFilesWdEntryDOS };
+
+static const char *const kEoB1IntroFilesKingDOS[2] = {
+ "KING.CMP",
+ "ADVENTUR.CMP"
+};
+
+static const StringListProvider kEoB1IntroFilesKingDOSProvider = { ARRAYSIZE(kEoB1IntroFilesKingDOS), kEoB1IntroFilesKingDOS };
+
+static const char *const kEoB1IntroFilesHandsDOS[1] = {
+ "HANDS.CMP"
+};
+
+static const StringListProvider kEoB1IntroFilesHandsDOSProvider = { ARRAYSIZE(kEoB1IntroFilesHandsDOS), kEoB1IntroFilesHandsDOS };
+
+static const char *const kEoB1IntroFilesWdExitDOS[5] = {
+ "WTRDP3.CMP",
+ "ORB.COL",
+ "ORB.CMP",
+ "TUNNEL.CMP",
+ "ZOOMTUNL.COL"
+};
+
+static const StringListProvider kEoB1IntroFilesWdExitDOSProvider = { ARRAYSIZE(kEoB1IntroFilesWdExitDOS), kEoB1IntroFilesWdExitDOS };
+
+static const char *const kEoB1IntroFilesTunnelDOS[2] = {
+ "AVALANCH.CMP",
+ "ZOOMTUNL.CMP"
+};
+
+static const StringListProvider kEoB1IntroFilesTunnelDOSProvider = { ARRAYSIZE(kEoB1IntroFilesTunnelDOS), kEoB1IntroFilesTunnelDOS };
+
+static const byte kEoB1IntroOpeningFrmDelayDOS[5] = {
+ 0x8C, 0x32, 0x64, 0x32, 0x8C
+};
+
+static const ByteProvider kEoB1IntroOpeningFrmDelayDOSProvider = { ARRAYSIZE(kEoB1IntroOpeningFrmDelayDOS), kEoB1IntroOpeningFrmDelayDOS };
+
+static const byte kEoB1IntroWdEncodeXDOS[31] = {
+ 0x00, 0x18, 0x02, 0x04, 0x1A, 0x05, 0x10, 0x06,
+ 0x10, 0x07, 0x11, 0x04, 0x13, 0x05, 0x06, 0x13,
+ 0x09, 0x14, 0x0B, 0x0D, 0x16, 0x0D, 0x16, 0x0E,
+ 0x1A, 0x0E, 0x17, 0x0F, 0x1B, 0x0F, 0x17
+};
+
+static const ByteProvider kEoB1IntroWdEncodeXDOSProvider = { ARRAYSIZE(kEoB1IntroWdEncodeXDOS), kEoB1IntroWdEncodeXDOS };
+
+static const byte kEoB1IntroWdEncodeYDOS[31] = {
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x01, 0x00, 0x00, 0x01, 0x00, 0x01, 0x01, 0x01,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00,
+ 0x01, 0x01, 0x00, 0x00, 0x00, 0x01, 0x01
+};
+
+static const ByteProvider kEoB1IntroWdEncodeYDOSProvider = { ARRAYSIZE(kEoB1IntroWdEncodeYDOS), kEoB1IntroWdEncodeYDOS };
+
+static const byte kEoB1IntroWdEncodeWHDOS[31] = {
+ 0x02, 0x02, 0x02, 0x01, 0x01, 0x01, 0x01, 0x01,
+ 0x01, 0x02, 0x02, 0x01, 0x01, 0x01, 0x01, 0x01,
+ 0x02, 0x02, 0x02, 0x01, 0x01, 0x01, 0x01, 0x01,
+ 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01
+};
+
+static const ByteProvider kEoB1IntroWdEncodeWHDOSProvider = { ARRAYSIZE(kEoB1IntroWdEncodeWHDOS), kEoB1IntroWdEncodeWHDOS };
+
+static const uint16 kEoB1IntroWdDsXDOS[31] = {
+ 0x0120, 0x0120, 0x0120, 0x0130, 0x0130, 0x00B2, 0x00B2, 0x00BC,
+ 0x00BC, 0x00AE, 0x00AE, 0x0125, 0x0125, 0x0125, 0x0101, 0x0101,
+ 0x00E9, 0x00E9, 0x00E9, 0x00AB, 0x00AB, 0x00CC, 0x00CC, 0x00F0,
+ 0x00F0, 0x010C, 0x010C, 0x00E0, 0x00E0, 0x00BA, 0x00BA
+};
+
+static const Uint16Provider kEoB1IntroWdDsXDOSProvider = { ARRAYSIZE(kEoB1IntroWdDsXDOS), kEoB1IntroWdDsXDOS };
+
+static const byte kEoB1IntroWdDsYDOS[31] = {
+ 0x28, 0x28, 0x28, 0x38, 0x38, 0x26, 0x26, 0x1D,
+ 0x1D, 0x34, 0x34, 0x50, 0x50, 0x50, 0x50, 0x50,
+ 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x2A, 0x2A, 0x66,
+ 0x66, 0x67, 0x67, 0x1C, 0x1C, 0x44, 0x44
+};
+
+static const ByteProvider kEoB1IntroWdDsYDOSProvider = { ARRAYSIZE(kEoB1IntroWdDsYDOS), kEoB1IntroWdDsYDOS };
+
+static const byte kEoB1IntroTvlX1DOS[6] = {
+ 0x00, 0x08, 0x10, 0x00, 0x0F, 0x00
+};
+
+static const ByteProvider kEoB1IntroTvlX1DOSProvider = { ARRAYSIZE(kEoB1IntroTvlX1DOS), kEoB1IntroTvlX1DOS };
+
+static const byte kEoB1IntroTvlY1DOS[6] = {
+ 0x00, 0x00, 0x00, 0x30, 0x36, 0x86
+};
+
+static const ByteProvider kEoB1IntroTvlY1DOSProvider = { ARRAYSIZE(kEoB1IntroTvlY1DOS), kEoB1IntroTvlY1DOS };
+
+static const byte kEoB1IntroTvlX2DOS[6] = {
+ 0x10, 0x10, 0x0F, 0x0C, 0x0B, 0x0B
+};
+
+static const ByteProvider kEoB1IntroTvlX2DOSProvider = { ARRAYSIZE(kEoB1IntroTvlX2DOS), kEoB1IntroTvlX2DOS };
+
+static const byte kEoB1IntroTvlY2DOS[6] = {
+ 0x35, 0x35, 0x35, 0x35, 0x35, 0x61
+};
+
+static const ByteProvider kEoB1IntroTvlY2DOSProvider = { ARRAYSIZE(kEoB1IntroTvlY2DOS), kEoB1IntroTvlY2DOS };
+
+static const byte kEoB1IntroTvlWDOS[6] = {
+ 0x08, 0x08, 0x0B, 0x0F, 0x12, 0x12
+};
+
+static const ByteProvider kEoB1IntroTvlWDOSProvider = { ARRAYSIZE(kEoB1IntroTvlWDOS), kEoB1IntroTvlWDOS };
+
+static const byte kEoB1IntroTvlHDOS[6] = {
+ 0x1A, 0x30, 0x36, 0x45, 0x50, 0x28
+};
+
+static const ByteProvider kEoB1IntroTvlHDOSProvider = { ARRAYSIZE(kEoB1IntroTvlHDOS), kEoB1IntroTvlHDOS };
+
+static const byte kEoB1DoorShapeDefsDOS[96] = {
+ 0x00, 0x00, 0x0A, 0x48, 0x11, 0x98, 0x07, 0x2F,
+ 0x19, 0x48, 0x04, 0x1D, 0x0A, 0x00, 0x0A, 0x48,
+ 0x1D, 0x48, 0x07, 0x2F, 0x19, 0x68, 0x04, 0x1D,
+ 0x14, 0x00, 0x06, 0x48, 0x24, 0x48, 0x04, 0x2F,
+ 0x1E, 0x78, 0x03, 0x1D, 0x1A, 0x00, 0x0C, 0x48,
+ 0x00, 0x90, 0x07, 0x29, 0x21, 0x78, 0x04, 0x1B,
+ 0x00, 0xBC, 0x0A, 0x0C, 0x0A, 0xBC, 0x06, 0x08,
+ 0x0A, 0xC4, 0x04, 0x02, 0x07, 0x4A, 0x09, 0x37,
+ 0x00, 0x4A, 0x07, 0x25, 0x07, 0xA0, 0x05, 0x17,
+ 0x07, 0x82, 0x09, 0x1C, 0x00, 0x70, 0x07, 0x13,
+ 0x0C, 0xA0, 0x05, 0x0B, 0x10, 0x48, 0x09, 0x4B,
+ 0x18, 0x98, 0x07, 0x2E, 0x1F, 0x98, 0x04, 0x1D
+};
+
+static const ByteProvider kEoB1DoorShapeDefsDOSProvider = { ARRAYSIZE(kEoB1DoorShapeDefsDOS), kEoB1DoorShapeDefsDOS };
+
+static const byte kEoB1DoorSwitchShapeDefsDOS[96] = {
+ 0x25, 0x78, 0x01, 0x07, 0x25, 0x88, 0x01, 0x03,
+ 0x25, 0x90, 0x01, 0x01, 0x25, 0x78, 0x01, 0x07,
+ 0x25, 0x88, 0x01, 0x03, 0x25, 0x90, 0x01, 0x01,
+ 0x26, 0x78, 0x01, 0x0B, 0x26, 0x88, 0x01, 0x06,
+ 0x26, 0x90, 0x01, 0x04, 0x27, 0x78, 0x01, 0x0E,
+ 0x27, 0x88, 0x01, 0x08, 0x25, 0x90, 0x01, 0x01,
+ 0x25, 0x78, 0x01, 0x07, 0x25, 0x88, 0x01, 0x03,
+ 0x25, 0x90, 0x01, 0x01, 0x25, 0x98, 0x01, 0x0B,
+ 0x25, 0xA8, 0x01, 0x06, 0x25, 0xB0, 0x01, 0x04,
+ 0x25, 0x98, 0x01, 0x0B, 0x25, 0xA8, 0x01, 0x05,
+ 0x25, 0xB0, 0x01, 0x04, 0x26, 0x98, 0x01, 0x0A,
+ 0x26, 0xA8, 0x01, 0x04, 0x25, 0x90, 0x01, 0x01
+};
+
+static const ByteProvider kEoB1DoorSwitchShapeDefsDOSProvider = { ARRAYSIZE(kEoB1DoorSwitchShapeDefsDOS), kEoB1DoorSwitchShapeDefsDOS };
+
+static const byte kEoB1DoorSwitchCoordsDOS[48] = {
+ 0x82, 0x24, 0x74, 0x27, 0x00, 0x00, 0x82, 0x24,
+ 0x74, 0x27, 0x00, 0x00, 0x5B, 0x36, 0x5A, 0x33,
+ 0x5A, 0x2D, 0x88, 0x26, 0x74, 0x29, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7E, 0x24,
+ 0x73, 0x26, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x80, 0x2B, 0x74, 0x2B, 0x00, 0x00
+};
+
+static const ByteProvider kEoB1DoorSwitchCoordsDOSProvider = { ARRAYSIZE(kEoB1DoorSwitchCoordsDOS), kEoB1DoorSwitchCoordsDOS };
+
+static const byte kEoB1MonsterPropertiesDOS[594] = {
+ 0x07, 0x12, 0xFF, 0x01, 0x01, 0x04, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03,
+ 0x00, 0x00, 0x00, 0x0F, 0x00, 0x00, 0x02, 0x4B,
+ 0x02, 0xFF, 0x00, 0x07, 0x11, 0x02, 0x01, 0x01,
+ 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x02, 0x02, 0x00, 0x00, 0x00, 0x78, 0x00,
+ 0x01, 0x38, 0x39, 0x00, 0xFF, 0x00, 0x05, 0x11,
+ 0x01, 0x01, 0x01, 0x06, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x01, 0x0C, 0x04, 0x00, 0x00,
+ 0x00, 0x41, 0x00, 0x00, 0x42, 0x43, 0x00, 0x02,
+ 0x00, 0x08, 0x0F, 0x02, 0x01, 0x01, 0x08, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x04, 0x00, 0x00, 0x00, 0x41, 0x00, 0x00, 0x49,
+ 0x4A, 0x00, 0x03, 0x00, 0x04, 0x10, 0x02, 0x02,
+ 0x01, 0x04, 0x01, 0x01, 0x04, 0x01, 0x00, 0x00,
+ 0x00, 0x00, 0x42, 0x00, 0x00, 0x00, 0x00, 0xAF,
+ 0x00, 0x02, 0x36, 0x37, 0x04, 0xFF, 0x14, 0x05,
+ 0x11, 0x03, 0x01, 0x01, 0x08, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x03, 0x00,
+ 0x00, 0x00, 0x41, 0x00, 0x00, 0x2F, 0x30, 0x00,
+ 0xFF, 0x00, 0x06, 0x13, 0x02, 0x01, 0x01, 0x08,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x12, 0x02, 0x00, 0x00, 0x00, 0x8A, 0x02, 0x02,
+ 0x31, 0x26, 0x00, 0xFF, 0x00, 0x03, 0x0C, 0x07,
+ 0x01, 0x01, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00,
+ 0xDA, 0x02, 0x00, 0x2D, 0x2E, 0x00, 0xFF, 0x00,
+ 0x05, 0x07, 0x0A, 0x01, 0x01, 0x08, 0x06, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0C, 0x04,
+ 0x00, 0x00, 0x00, 0xDC, 0x05, 0x00, 0x40, 0x41,
+ 0x00, 0x07, 0x00, 0x04, 0x0F, 0x06, 0x02, 0x01,
+ 0x08, 0x00, 0x01, 0x08, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x02, 0x03, 0x00, 0x00, 0x00, 0xCF, 0x03,
+ 0x01, 0x27, 0x28, 0x00, 0xFF, 0x00, 0x05, 0x0D,
+ 0x06, 0x03, 0x01, 0x08, 0x00, 0x01, 0x04, 0x00,
+ 0x01, 0x04, 0x00, 0x00, 0x28, 0x03, 0x00, 0x00,
+ 0x00, 0x78, 0x05, 0x02, 0x25, 0x24, 0x00, 0xFF,
+ 0x00, 0x04, 0x0D, 0x05, 0x02, 0x01, 0x04, 0x00,
+ 0x01, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x01, 0x00, 0x00, 0x00, 0xE2, 0x04, 0x00, 0x3E,
+ 0x3F, 0x00, 0xFF, 0x00, 0x04, 0x0F, 0x04, 0x01,
+ 0x01, 0x08, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x20, 0x01, 0x00, 0x00, 0x00, 0x8A,
+ 0x02, 0x00, 0x2B, 0x2C, 0x00, 0xFF, 0x3C, 0xFF,
+ 0x07, 0x0A, 0x01, 0x03, 0x08, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x02, 0x00,
+ 0x00, 0x00, 0x10, 0x27, 0x02, 0x44, 0x45, 0x00,
+ 0xFF, 0x64, 0xFF, 0x07, 0x09, 0x01, 0x03, 0x04,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x42, 0x03, 0x00, 0x00, 0x00, 0xD0, 0x07, 0x00,
+ 0x1F, 0xFF, 0x08, 0xFF, 0x00, 0x03, 0x0D, 0x07,
+ 0x01, 0x01, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x40, 0x02, 0x00, 0x00, 0x00,
+ 0x88, 0x13, 0x02, 0x29, 0x2A, 0x02, 0xFF, 0x3C,
+ 0x05, 0x0D, 0x07, 0x01, 0x01, 0x06, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x02,
+ 0x00, 0x00, 0x00, 0x88, 0x13, 0x00, 0x34, 0x35,
+ 0x02, 0xFF, 0x00, 0x05, 0x0B, 0x08, 0x01, 0x05,
+ 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x42, 0x00, 0x00, 0x00, 0x00, 0x40, 0x1F,
+ 0x00, 0x3A, 0x3B, 0xFF, 0xFF, 0x5A, 0x02, 0x0F,
+ 0x05, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x82, 0x02, 0x00, 0x00,
+ 0x00, 0x0E, 0x01, 0x02, 0x3C, 0x3D, 0x00, 0xFF,
+ 0x00, 0xFE, 0x0D, 0x08, 0x01, 0x06, 0x04, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02,
+ 0x02, 0x00, 0x00, 0x00, 0xA0, 0x0F, 0x02, 0x48,
+ 0x47, 0x00, 0xFF, 0x32, 0x04, 0x0D, 0x07, 0x01,
+ 0x01, 0x0A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x02, 0x02, 0x00, 0x00, 0x00, 0xCF,
+ 0x03, 0x01, 0x33, 0x32, 0x00, 0xFF, 0x28, 0x00,
+ 0x05, 0x23, 0x01, 0x01, 0x64, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x42, 0x00, 0x00,
+ 0x00, 0x00, 0xB0, 0x36, 0x02, 0xFF, 0xFF, 0xFF,
+ 0xFF, 0x64
+};
+
+static const ByteProvider kEoB1MonsterPropertiesDOSProvider = { ARRAYSIZE(kEoB1MonsterPropertiesDOS), kEoB1MonsterPropertiesDOS };
+
+static const byte kEoB1EnemyMageSpellListDOS[10] = {
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x02, 0x05,
+ 0x06, 0x00
+};
+
+static const ByteProvider kEoB1EnemyMageSpellListDOSProvider = { ARRAYSIZE(kEoB1EnemyMageSpellListDOS), kEoB1EnemyMageSpellListDOS };
+
+static const byte kEoB1EnemyMageSfxDOS[10] = {
+ 0x00, 0x55, 0x55, 0x55, 0x55, 0x62, 0x62, 0x1F,
+ 0x62, 0x02
+};
+
+static const ByteProvider kEoB1EnemyMageSfxDOSProvider = { ARRAYSIZE(kEoB1EnemyMageSfxDOS), kEoB1EnemyMageSfxDOS };
+
+static const byte kEoB1BeholderSpellListDOS[4] = {
+ 0x02, 0x0A, 0x0B, 0x62
+};
+
+static const ByteProvider kEoB1BeholderSpellListDOSProvider = { ARRAYSIZE(kEoB1BeholderSpellListDOS), kEoB1BeholderSpellListDOS };
+
+static const byte kEoB1BeholderSfxDOS[4] = {
+ 0x62, 0x53, 0x40, 0x00
+};
+
+static const ByteProvider kEoB1BeholderSfxDOSProvider = { ARRAYSIZE(kEoB1BeholderSfxDOS), kEoB1BeholderSfxDOS };
+
+static const byte kEoB1CgaMappingDefaultDOS[32] = {
+ 0x00, 0x02, 0x02, 0x01, 0x01, 0x00, 0x01, 0x02,
+ 0x03, 0x01, 0x01, 0x01, 0x00, 0x02, 0x02, 0x03,
+ 0x00, 0x02, 0x02, 0x01, 0x01, 0x00, 0x01, 0x02,
+ 0x03, 0x03, 0x01, 0x01, 0x00, 0x00, 0x02, 0x03
+};
+
+static const ByteProvider kEoB1CgaMappingDefaultDOSProvider = { ARRAYSIZE(kEoB1CgaMappingDefaultDOS), kEoB1CgaMappingDefaultDOS };
+
+static const byte kEoB1CgaMappingAltDOS[32] = {
+ 0x00, 0x02, 0x03, 0x01, 0x01, 0x03, 0x02, 0x03,
+ 0x02, 0x01, 0x02, 0x00, 0x00, 0x02, 0x01, 0x03,
+ 0x00, 0x02, 0x01, 0x00, 0x01, 0x03, 0x02, 0x02,
+ 0x00, 0x03, 0x02, 0x00, 0x00, 0x02, 0x01, 0x03
+};
+
+static const ByteProvider kEoB1CgaMappingAltDOSProvider = { ARRAYSIZE(kEoB1CgaMappingAltDOS), kEoB1CgaMappingAltDOS };
+
+static const byte kEoB1CgaMappingInvDOS[32] = {
+ 0x00, 0x02, 0x02, 0x01, 0x01, 0x00, 0x01, 0x02,
+ 0x03, 0x03, 0x01, 0x01, 0x00, 0x01, 0x02, 0x03,
+ 0x00, 0x02, 0x02, 0x01, 0x01, 0x00, 0x01, 0x02,
+ 0x03, 0x03, 0x01, 0x01, 0x00, 0x01, 0x02, 0x03
+};
+
+static const ByteProvider kEoB1CgaMappingInvDOSProvider = { ARRAYSIZE(kEoB1CgaMappingInvDOS), kEoB1CgaMappingInvDOS };
+
+static const byte kEoB1CgaMappingItemsLDOS[32] = {
+ 0x00, 0x02, 0x02, 0x01, 0x01, 0x00, 0x01, 0x02,
+ 0x02, 0x01, 0x02, 0x01, 0x00, 0x02, 0x02, 0x03,
+ 0x00, 0x02, 0x02, 0x01, 0x01, 0x00, 0x01, 0x02,
+ 0x00, 0x03, 0x02, 0x01, 0x00, 0x00, 0x02, 0x03
+};
+
+static const ByteProvider kEoB1CgaMappingItemsLDOSProvider = { ARRAYSIZE(kEoB1CgaMappingItemsLDOS), kEoB1CgaMappingItemsLDOS };
+
+static const byte kEoB1CgaMappingItemsSDOS[32] = {
+ 0x00, 0x02, 0x02, 0x01, 0x01, 0x03, 0x03, 0x02,
+ 0x03, 0x01, 0x01, 0x01, 0x00, 0x02, 0x01, 0x03,
+ 0x00, 0x02, 0x02, 0x01, 0x01, 0x03, 0x03, 0x02,
+ 0x03, 0x03, 0x01, 0x01, 0x00, 0x02, 0x01, 0x03
+};
+
+static const ByteProvider kEoB1CgaMappingItemsSDOSProvider = { ARRAYSIZE(kEoB1CgaMappingItemsSDOS), kEoB1CgaMappingItemsSDOS };
+
+static const byte kEoB1CgaMappingThrownDOS[32] = {
+ 0x00, 0x02, 0x02, 0x01, 0x01, 0x03, 0x01, 0x02,
+ 0x02, 0x01, 0x01, 0x01, 0x00, 0x02, 0x02, 0x03,
+ 0x00, 0x02, 0x02, 0x01, 0x01, 0x03, 0x01, 0x02,
+ 0x02, 0x03, 0x01, 0x01, 0x00, 0x00, 0x02, 0x03
+};
+
+static const ByteProvider kEoB1CgaMappingThrownDOSProvider = { ARRAYSIZE(kEoB1CgaMappingThrownDOS), kEoB1CgaMappingThrownDOS };
+
+static const byte kEoB1CgaMappingIconsDOS[32] = {
+ 0x00, 0x02, 0x02, 0x01, 0x03, 0x02, 0x03, 0x01,
+ 0x03, 0x01, 0x01, 0x01, 0x00, 0x02, 0x02, 0x03,
+ 0x00, 0x02, 0x02, 0x01, 0x03, 0x02, 0x03, 0x01,
+ 0x03, 0x03, 0x01, 0x01, 0x00, 0x02, 0x03, 0x03
+};
+
+static const ByteProvider kEoB1CgaMappingIconsDOSProvider = { ARRAYSIZE(kEoB1CgaMappingIconsDOS), kEoB1CgaMappingIconsDOS };
+
+static const byte kEoB1CgaMappingDecoDOS[32] = {
+ 0x00, 0x00, 0x02, 0x00, 0x01, 0x03, 0x01, 0x02,
+ 0x02, 0x03, 0x02, 0x02, 0x00, 0x01, 0x03, 0x03,
+ 0x00, 0x01, 0x02, 0x03, 0x00, 0x03, 0x02, 0x02,
+ 0x00, 0x03, 0x02, 0x03, 0x00, 0x01, 0x03, 0x03
+};
+
+static const ByteProvider kEoB1CgaMappingDecoDOSProvider = { ARRAYSIZE(kEoB1CgaMappingDecoDOS), kEoB1CgaMappingDecoDOS };
+
+static const byte kEoB1CgaLevelMappingIndexDOS[12] = {
+ 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x02, 0x02,
+ 0x02, 0x03, 0x03, 0x04
+};
+
+static const ByteProvider kEoB1CgaLevelMappingIndexDOSProvider = { ARRAYSIZE(kEoB1CgaLevelMappingIndexDOS), kEoB1CgaLevelMappingIndexDOS };
+
+static const byte kEoB1CgaMappingLevel0DOS[32] = {
+ 0x00, 0x00, 0x01, 0x01, 0x02, 0x00, 0x03, 0x03,
+ 0x02, 0x03, 0x02, 0x02, 0x00, 0x03, 0x03, 0x03,
+ 0x00, 0x01, 0x01, 0x01, 0x00, 0x00, 0x03, 0x03,
+ 0x02, 0x03, 0x02, 0x03, 0x00, 0x01, 0x02, 0x03
+};
+
+static const ByteProvider kEoB1CgaMappingLevel0DOSProvider = { ARRAYSIZE(kEoB1CgaMappingLevel0DOS), kEoB1CgaMappingLevel0DOS };
+
+static const byte kEoB1CgaMappingLevel1DOS[32] = {
+ 0x00, 0x00, 0x01, 0x00, 0x01, 0x03, 0x01, 0x02,
+ 0x03, 0x01, 0x02, 0x00, 0x00, 0x02, 0x03, 0x03,
+ 0x00, 0x01, 0x01, 0x03, 0x00, 0x03, 0x01, 0x02,
+ 0x03, 0x01, 0x02, 0x01, 0x00, 0x02, 0x03, 0x03
+};
+
+static const ByteProvider kEoB1CgaMappingLevel1DOSProvider = { ARRAYSIZE(kEoB1CgaMappingLevel1DOS), kEoB1CgaMappingLevel1DOS };
+
+static const byte kEoB1CgaMappingLevel2DOS[32] = {
+ 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x03, 0x02,
+ 0x02, 0x02, 0x02, 0x02, 0x00, 0x02, 0x03, 0x03,
+ 0x00, 0x01, 0x02, 0x03, 0x00, 0x01, 0x03, 0x02,
+ 0x02, 0x01, 0x02, 0x03, 0x00, 0x00, 0x02, 0x03
+};
+
+static const ByteProvider kEoB1CgaMappingLevel2DOSProvider = { ARRAYSIZE(kEoB1CgaMappingLevel2DOS), kEoB1CgaMappingLevel2DOS };
+
+static const byte kEoB1CgaMappingLevel3DOS[32] = {
+ 0x00, 0x00, 0x01, 0x03, 0x03, 0x01, 0x01, 0x01,
+ 0x02, 0x03, 0x01, 0x01, 0x00, 0x02, 0x02, 0x03,
+ 0x00, 0x01, 0x01, 0x01, 0x03, 0x01, 0x02, 0x03,
+ 0x00, 0x03, 0x01, 0x01, 0x00, 0x02, 0x02, 0x03
+};
+
+static const ByteProvider kEoB1CgaMappingLevel3DOSProvider = { ARRAYSIZE(kEoB1CgaMappingLevel3DOS), kEoB1CgaMappingLevel3DOS };
+
+static const byte kEoB1CgaMappingLevel4DOS[32] = {
+ 0x00, 0x02, 0x00, 0x00, 0x01, 0x01, 0x01, 0x03,
+ 0x02, 0x02, 0x02, 0x02, 0x00, 0x02, 0x01, 0x03,
+ 0x00, 0x02, 0x02, 0x03, 0x00, 0x01, 0x02, 0x03,
+ 0x02, 0x01, 0x02, 0x03, 0x00, 0x02, 0x01, 0x03
+};
+
+static const ByteProvider kEoB1CgaMappingLevel4DOSProvider = { ARRAYSIZE(kEoB1CgaMappingLevel4DOS), kEoB1CgaMappingLevel4DOS };
+
+static const byte kEoB1NpcShpDataDOS[76] = {
+ 0x00, 0x00, 0x06, 0x40, 0x06, 0x00, 0x07, 0x48,
+ 0x0D, 0x00, 0x06, 0x30, 0x13, 0x00, 0x05, 0x38,
+ 0x18, 0x00, 0x05, 0x38, 0x1D, 0x00, 0x05, 0x38,
+ 0x22, 0x00, 0x06, 0x48, 0x00, 0x48, 0x06, 0x56,
+ 0x06, 0x48, 0x05, 0x40, 0x0B, 0x48, 0x05, 0x40,
+ 0x10, 0x48, 0x05, 0x30, 0x06, 0x88, 0x03, 0x18,
+ 0x09, 0x88, 0x03, 0x18, 0x0C, 0x88, 0x03, 0x18,
+ 0x0F, 0x88, 0x03, 0x18, 0x12, 0x88, 0x03, 0x18,
+ 0x15, 0x88, 0x03, 0x18, 0x18, 0x48, 0x06, 0x58,
+ 0x1E, 0x48, 0x0A, 0x48
+};
+
+static const ByteProvider kEoB1NpcShpDataDOSProvider = { ARRAYSIZE(kEoB1NpcShpDataDOS), kEoB1NpcShpDataDOS };
+
+static const byte kEoB1NpcSubShpIndex1DOS[6] = {
+ 0x09, 0x08, 0x08, 0x09, 0x09, 0x0A
+};
+
+static const ByteProvider kEoB1NpcSubShpIndex1DOSProvider = { ARRAYSIZE(kEoB1NpcSubShpIndex1DOS), kEoB1NpcSubShpIndex1DOS };
+
+static const byte kEoB1NpcSubShpIndex2DOS[6] = {
+ 0x0D, 0x0B, 0x0C, 0x0E, 0x0F, 0x10
+};
+
+static const ByteProvider kEoB1NpcSubShpIndex2DOSProvider = { ARRAYSIZE(kEoB1NpcSubShpIndex2DOS), kEoB1NpcSubShpIndex2DOS };
+
+static const byte kEoB1NpcSubShpYDOS[6] = {
+ 0x34, 0x31, 0x31, 0x34, 0x34, 0x45
+};
+
+static const ByteProvider kEoB1NpcSubShpYDOSProvider = { ARRAYSIZE(kEoB1NpcSubShpYDOS), kEoB1NpcSubShpYDOS };
+
+static const char *const kEoB1EnchantedStringDOS[1] = {
+ "%s +%d"
+};
+
+static const StringListProvider kEoB1EnchantedStringDOSProvider = { ARRAYSIZE(kEoB1EnchantedStringDOS), kEoB1EnchantedStringDOS };
+
+static const byte kEoB1SpellLevelsMageDOS[26] = {
+ 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02,
+ 0x02, 0x02, 0x02, 0x03, 0x03, 0x03, 0x03, 0x03,
+ 0x03, 0x03, 0x03, 0x04, 0x04, 0x04, 0x05, 0x05,
+ 0x05, 0x00
+};
+
+static const ByteProvider kEoB1SpellLevelsMageDOSProvider = { ARRAYSIZE(kEoB1SpellLevelsMageDOS), kEoB1SpellLevelsMageDOS };
+
+static const byte kEoB1SpellLevelsClericDOS[25] = {
+ 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x02,
+ 0x02, 0x03, 0x03, 0x03, 0x03, 0x03, 0x04, 0x04,
+ 0x04, 0x04, 0x04, 0x05, 0x05, 0x05, 0x05, 0x01,
+ 0x00
+};
+
+static const ByteProvider kEoB1SpellLevelsClericDOSProvider = { ARRAYSIZE(kEoB1SpellLevelsClericDOS), kEoB1SpellLevelsClericDOS };
+
+static const byte kEoB1NumSpellsClericDOS[50] = {
+ 0x01, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00,
+ 0x00, 0x00, 0x02, 0x01, 0x00, 0x00, 0x00, 0x03,
+ 0x02, 0x00, 0x00, 0x00, 0x03, 0x03, 0x01, 0x00,
+ 0x00, 0x03, 0x03, 0x02, 0x00, 0x00, 0x03, 0x03,
+ 0x02, 0x01, 0x00, 0x03, 0x03, 0x03, 0x02, 0x00,
+ 0x04, 0x04, 0x03, 0x02, 0x01, 0x04, 0x04, 0x03,
+ 0x03, 0x02
+};
+
+static const ByteProvider kEoB1NumSpellsClericDOSProvider = { ARRAYSIZE(kEoB1NumSpellsClericDOS), kEoB1NumSpellsClericDOS };
+
+static const byte kEoB1NumSpellsWisAdjDOS[40] = {
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00,
+ 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x02,
+ 0x01, 0x00, 0x00, 0x00, 0x02, 0x02, 0x00, 0x00,
+ 0x00, 0x02, 0x02, 0x01, 0x00, 0x00, 0x02, 0x02,
+ 0x01, 0x01, 0x00, 0x03, 0x02, 0x01, 0x02, 0x00
+};
+
+static const ByteProvider kEoB1NumSpellsWisAdjDOSProvider = { ARRAYSIZE(kEoB1NumSpellsWisAdjDOS), kEoB1NumSpellsWisAdjDOS };
+
+static const byte kEoB1NumSpellsPalDOS[60] = {
+ 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00,
+ 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01,
+ 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
+ 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00,
+ 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00,
+ 0x01, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00,
+ 0x00, 0x00, 0x02, 0x01, 0x00, 0x00, 0x00, 0x02,
+ 0x02, 0x00, 0x00, 0x00
+};
+
+static const ByteProvider kEoB1NumSpellsPalDOSProvider = { ARRAYSIZE(kEoB1NumSpellsPalDOS), kEoB1NumSpellsPalDOS };
+
+static const byte kEoB1NumSpellsMageDOS[55] = {
+ 0x01, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00,
+ 0x00, 0x00, 0x02, 0x01, 0x00, 0x00, 0x00, 0x03,
+ 0x02, 0x00, 0x00, 0x00, 0x04, 0x02, 0x01, 0x00,
+ 0x00, 0x04, 0x02, 0x02, 0x00, 0x00, 0x04, 0x03,
+ 0x02, 0x01, 0x00, 0x04, 0x03, 0x03, 0x02, 0x00,
+ 0x04, 0x03, 0x03, 0x02, 0x01, 0x04, 0x04, 0x03,
+ 0x02, 0x02, 0x04, 0x04, 0x04, 0x03, 0x03
+};
+
+static const ByteProvider kEoB1NumSpellsMageDOSProvider = { ARRAYSIZE(kEoB1NumSpellsMageDOS), kEoB1NumSpellsMageDOS };
+
+static const uint32 kEoB1ExperienceTable0DOS[12] = {
+ 0x00000000, 0x000007D0, 0x00000FA0, 0x00001F40, 0x00003E80, 0x00007D00, 0x0000FA00, 0x0001E848,
+ 0x0003D090, 0x0007A120, 0x000B71B0, 0xFFFFFFFF
+};
+
+static const Uint32Provider kEoB1ExperienceTable0DOSProvider = { ARRAYSIZE(kEoB1ExperienceTable0DOS), kEoB1ExperienceTable0DOS };
+
+static const uint32 kEoB1ExperienceTable1DOS[12] = {
+ 0x00000000, 0x000009C4, 0x00001388, 0x00002710, 0x00004E20, 0x00009C40, 0x0000EA60, 0x00015F90,
+ 0x00020F58, 0x0003D090, 0x0005B8D8, 0xFFFFFFFF
+};
+
+static const Uint32Provider kEoB1ExperienceTable1DOSProvider = { ARRAYSIZE(kEoB1ExperienceTable1DOS), kEoB1ExperienceTable1DOS };
+
+static const uint32 kEoB1ExperienceTable2DOS[11] = {
+ 0x00000000, 0x000005DC, 0x00000BB8, 0x00001770, 0x000032C8, 0x00006B6C, 0x0000D6D8, 0x0001ADB0,
+ 0x00036EE8, 0x0006DDD0, 0xFFFFFFFF
+};
+
+static const Uint32Provider kEoB1ExperienceTable2DOSProvider = { ARRAYSIZE(kEoB1ExperienceTable2DOS), kEoB1ExperienceTable2DOS };
+
+static const uint32 kEoB1ExperienceTable3DOS[12] = {
+ 0x00000000, 0x000004E2, 0x000009C4, 0x00001388, 0x00002710, 0x00004E20, 0x00009C40, 0x00011170,
+ 0x0001ADB0, 0x00027100, 0x00035B60, 0xFFFFFFFF
+};
+
+static const Uint32Provider kEoB1ExperienceTable3DOSProvider = { ARRAYSIZE(kEoB1ExperienceTable3DOS), kEoB1ExperienceTable3DOS };
+
+static const uint32 kEoB1ExperienceTable4DOS[12] = {
+ 0x00000000, 0x000008CA, 0x00001194, 0x00002328, 0x00004650, 0x00008CA0, 0x000124F8, 0x000249F0,
+ 0x000493E0, 0x000927C0, 0x000DBBA0, 0xFFFFFFFF
+};
+
+static const Uint32Provider kEoB1ExperienceTable4DOSProvider = { ARRAYSIZE(kEoB1ExperienceTable4DOS), kEoB1ExperienceTable4DOS };
+
+static const byte kEoB1ExpObjectTblIndexDOS[9] = {
+ 0x02, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x01,
+ 0x00
+};
+
+static const ByteProvider kEoB1ExpObjectTblIndexDOSProvider = { ARRAYSIZE(kEoB1ExpObjectTblIndexDOS), kEoB1ExpObjectTblIndexDOS };
+
+static const byte kEoB1ExpObjectShpStartDOS[4] = {
+ 0x07, 0x0C, 0x0F, 0x12
+};
+
+static const ByteProvider kEoB1ExpObjectShpStartDOSProvider = { ARRAYSIZE(kEoB1ExpObjectShpStartDOS), kEoB1ExpObjectShpStartDOS };
+
+static const byte kEoB1ExpObjectTbl1DOS[13] = {
+ 0x0F, 0x05, 0x0F, 0x05, 0x06, 0x05, 0x06, 0x08,
+ 0x06, 0x08, 0x06, 0x08, 0x00
+};
+
+static const ByteProvider kEoB1ExpObjectTbl1DOSProvider = { ARRAYSIZE(kEoB1ExpObjectTbl1DOS), kEoB1ExpObjectTbl1DOS };
+
+static const byte kEoB1ExpObjectTbl2DOS[10] = {
+ 0x0F, 0x09, 0x0F, 0x09, 0x02, 0x0A, 0x0B, 0x0A,
+ 0x0B, 0x00
+};
+
+static const ByteProvider kEoB1ExpObjectTbl2DOSProvider = { ARRAYSIZE(kEoB1ExpObjectTbl2DOS), kEoB1ExpObjectTbl2DOS };
+
+static const byte kEoB1ExpObjectTbl3DOS[11] = {
+ 0x05, 0x03, 0x05, 0x03, 0x03, 0x03, 0x03, 0x0B,
+ 0x03, 0x0B, 0x00
+};
+
+static const ByteProvider kEoB1ExpObjectTbl3DOSProvider = { ARRAYSIZE(kEoB1ExpObjectTbl3DOS), kEoB1ExpObjectTbl3DOS };
+
+static const byte kEoB1ExpObjectYDOS[4] = {
+ 0x77, 0x67, 0x4F, 0x3F
+};
+
+static const ByteProvider kEoB1ExpObjectYDOSProvider = { ARRAYSIZE(kEoB1ExpObjectYDOS), kEoB1ExpObjectYDOS };
+
+static const byte kEoB1SparkDefStepsDOS[8] = {
+ 0x40, 0x90, 0xE4, 0xB9, 0x6E, 0x1B, 0x06, 0x01
+};
+
+static const ByteProvider kEoB1SparkDefStepsDOSProvider = { ARRAYSIZE(kEoB1SparkDefStepsDOS), kEoB1SparkDefStepsDOS };
+
+static const byte kEoB1SparkDefSubStepsDOS[4] = {
+ 0xC0, 0x30, 0x0C, 0x03
+};
+
+static const ByteProvider kEoB1SparkDefSubStepsDOSProvider = { ARRAYSIZE(kEoB1SparkDefSubStepsDOS), kEoB1SparkDefSubStepsDOS };
+
+static const byte kEoB1SparkDefShiftDOS[4] = {
+ 0x06, 0x04, 0x02, 0x00
+};
+
+static const ByteProvider kEoB1SparkDefShiftDOSProvider = { ARRAYSIZE(kEoB1SparkDefShiftDOS), kEoB1SparkDefShiftDOS };
+
+static const byte kEoB1SparkDefAddDOS[8] = {
+ 0x08, 0x06, 0x1C, 0x14, 0x0D, 0x18, 0x0D, 0x0F
+};
+
+static const ByteProvider kEoB1SparkDefAddDOSProvider = { ARRAYSIZE(kEoB1SparkDefAddDOS), kEoB1SparkDefAddDOS };
+
+static const byte kEoB1SparkDefXDOS[6] = {
+ 0x17, 0x20, 0x17, 0x20, 0x17, 0x20
+};
+
+static const ByteProvider kEoB1SparkDefXDOSProvider = { ARRAYSIZE(kEoB1SparkDefXDOS), kEoB1SparkDefXDOS };
+
+static const byte kEoB1SparkDefYDOS[6] = {
+ 0x02, 0x02, 0x34, 0x34, 0x66, 0x66
+};
+
+static const ByteProvider kEoB1SparkDefYDOSProvider = { ARRAYSIZE(kEoB1SparkDefYDOS), kEoB1SparkDefYDOS };
+
+static const uint32 kEoB1SparkOfFlags1DOS[11] = {
+ 0x40000000, 0x95000000, 0xEA550000, 0xBFAA5400, 0x6AFFA954, 0x15AAFEA9, 0x0055ABFE, 0x000056AB,
+ 0x00000156, 0x00000001, 0x00000000
+};
+
+static const Uint32Provider kEoB1SparkOfFlags1DOSProvider = { ARRAYSIZE(kEoB1SparkOfFlags1DOS), kEoB1SparkOfFlags1DOS };
+
+static const uint32 kEoB1SparkOfFlags2DOS[16] = {
+ 0xC0000000, 0x30000000, 0x0C000000, 0x03000000, 0x00C00000, 0x00300000, 0x000C0000, 0x00030000,
+ 0x0000C000, 0x00003000, 0x00000C00, 0x00000300, 0x000000C0, 0x00000030, 0x0000000C, 0x00000003
+};
+
+static const Uint32Provider kEoB1SparkOfFlags2DOSProvider = { ARRAYSIZE(kEoB1SparkOfFlags2DOS), kEoB1SparkOfFlags2DOS };
+
+static const byte kEoB1SparkOfShiftDOS[16] = {
+ 0x1E, 0x1C, 0x1A, 0x18, 0x16, 0x14, 0x12, 0x10,
+ 0x0E, 0x0C, 0x0A, 0x08, 0x06, 0x04, 0x02, 0x00
+};
+
+static const ByteProvider kEoB1SparkOfShiftDOSProvider = { ARRAYSIZE(kEoB1SparkOfShiftDOS), kEoB1SparkOfShiftDOS };
+
+static const byte kEoB1SparkOfXDOS[16] = {
+ 0x50, 0x70, 0x30, 0x68, 0x20, 0x60, 0x38, 0x78,
+ 0x80, 0x48, 0x58, 0x28, 0x60, 0x40, 0x70, 0x48
+};
+
+static const ByteProvider kEoB1SparkOfXDOSProvider = { ARRAYSIZE(kEoB1SparkOfXDOS), kEoB1SparkOfXDOS };
+
+static const byte kEoB1SparkOfYDOS[16] = {
+ 0x31, 0x2B, 0x48, 0x17, 0x16, 0x48, 0x35, 0x1B,
+ 0x43, 0x2E, 0x24, 0x28, 0x38, 0x1C, 0x16, 0x44
+};
+
+static const ByteProvider kEoB1SparkOfYDOSProvider = { ARRAYSIZE(kEoB1SparkOfYDOS), kEoB1SparkOfYDOS };
+
+static const byte kEoB1SpellPropertiesDOS[1007] = {
+ 0x4D, 0x2C, 0x2E, 0x21, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x4E, 0x2C, 0x2E, 0x21, 0x01,
+ 0x0B, 0x0F, 0xF3, 0x0E, 0x00, 0x00, 0x00, 0x00,
+ 0x86, 0x0F, 0xF3, 0x0E, 0x5C, 0x00, 0x54, 0x2C,
+ 0x2E, 0x21, 0x00, 0x99, 0x0F, 0xF3, 0x0E, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x57,
+ 0x01, 0x62, 0x2C, 0x2E, 0x21, 0x08, 0x69, 0x10,
+ 0xF3, 0x0E, 0x00, 0x00, 0x00, 0x00, 0xAE, 0x10,
+ 0xF3, 0x0E, 0x5F, 0x00, 0x6F, 0x2C, 0x2E, 0x21,
+ 0x00, 0xD2, 0x10, 0xF3, 0x0E, 0xF2, 0x10, 0xF3,
+ 0x0E, 0x00, 0x00, 0x00, 0x00, 0x55, 0x01, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x7D, 0x2C, 0x2E, 0x21, 0x04, 0x22,
+ 0x11, 0xF3, 0x0E, 0x00, 0x00, 0x00, 0x00, 0x76,
+ 0x11, 0xF3, 0x0E, 0x5C, 0x00, 0x84, 0x2C, 0x2E,
+ 0x21, 0x02, 0x97, 0x11, 0xF3, 0x0E, 0x00, 0x00,
+ 0x00, 0x00, 0x33, 0x12, 0xF3, 0x0E, 0x58, 0x00,
+ 0x93, 0x2C, 0x2E, 0x21, 0x01, 0x7F, 0x12, 0xF3,
+ 0x0E, 0x00, 0x00, 0x00, 0x00, 0xA1, 0x12, 0xF3,
+ 0x0E, 0x5E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xA0, 0x2C,
+ 0x2E, 0x21, 0x00, 0xC2, 0x12, 0xF3, 0x0E, 0xE3,
+ 0x12, 0xF3, 0x0E, 0x00, 0x00, 0x00, 0x00, 0x60,
+ 0x01, 0xB2, 0x2C, 0x2E, 0x21, 0x00, 0x15, 0x13,
+ 0xF3, 0x0E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x01, 0xC1, 0x2C, 0x2E, 0x21,
+ 0x01, 0x1A, 0x13, 0xF3, 0x0E, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x61, 0x00, 0xCE,
+ 0x2C, 0x2E, 0x21, 0x00, 0xFD, 0x13, 0xF3, 0x0E,
+ 0x1E, 0x14, 0xF3, 0x0E, 0x00, 0x00, 0x00, 0x00,
+ 0x62, 0x01, 0xD7, 0x2C, 0x2E, 0x21, 0x00, 0x4A,
+ 0x14, 0xF3, 0x0E, 0x6B, 0x14, 0xF3, 0x0E, 0x00,
+ 0x00, 0x00, 0x00, 0x63, 0x01, 0xE3, 0x2C, 0x2E,
+ 0x21, 0x08, 0x97, 0x14, 0xF3, 0x0E, 0x00, 0x00,
+ 0x00, 0x00, 0xF9, 0x14, 0xF3, 0x0E, 0x64, 0x00,
+ 0xE9, 0x2C, 0x2E, 0x21, 0x00, 0x0F, 0x15, 0xF3,
+ 0x0E, 0x30, 0x15, 0xF3, 0x0E, 0x00, 0x00, 0x00,
+ 0x00, 0x65, 0x01, 0xF5, 0x2C, 0x2E, 0x21, 0x08,
+ 0xD0, 0x15, 0xF3, 0x0E, 0x00, 0x00, 0x00, 0x00,
+ 0xA1, 0x12, 0xF3, 0x0E, 0x5E, 0x00, 0x0D, 0x2D,
+ 0x2E, 0x21, 0x00, 0x09, 0x16, 0xF3, 0x0E, 0x2A,
+ 0x16, 0xF3, 0x0E, 0x00, 0x00, 0x00, 0x00, 0x1F,
+ 0x01, 0x1C, 0x2D, 0x2E, 0x21, 0x02, 0x56, 0x16,
+ 0xF3, 0x0E, 0x00, 0x00, 0x00, 0x00, 0xDC, 0x16,
+ 0xF3, 0x0E, 0x66, 0x00, 0x2B, 0x2D, 0x2E, 0x21,
+ 0x00, 0x02, 0x17, 0xF3, 0x0E, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x67, 0x01, 0x30,
+ 0x2D, 0x2E, 0x21, 0x00, 0xB7, 0x17, 0xF3, 0x0E,
+ 0xD8, 0x17, 0xF3, 0x0E, 0x00, 0x00, 0x00, 0x00,
+ 0x59, 0x01, 0x3A, 0x2D, 0x2E, 0x21, 0x01, 0x65,
+ 0x18, 0xF3, 0x0E, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x5D, 0x00, 0x44, 0x2D, 0x2E,
+ 0x21, 0x00, 0xD3, 0x18, 0xF3, 0x0E, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01,
+ 0x4E, 0x2D, 0x2E, 0x21, 0x00, 0xD8, 0x18, 0xF3,
+ 0x0E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x76, 0x01, 0x5B, 0x2D, 0x2E, 0x21, 0x00,
+ 0x0F, 0x1A, 0xF3, 0x0E, 0x30, 0x1A, 0xF3, 0x0E,
+ 0x00, 0x00, 0x00, 0x00, 0x65, 0x01, 0x68, 0x2D,
+ 0x2E, 0x21, 0x08, 0xD0, 0x1A, 0xF3, 0x0E, 0x00,
+ 0x00, 0x00, 0x00, 0x13, 0x1B, 0xF3, 0x0E, 0x5B,
+ 0x00, 0x6E, 0x2D, 0x2E, 0x21, 0x01, 0x20, 0x1B,
+ 0xF3, 0x0E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x68, 0x00, 0x80, 0x2D, 0x2E, 0x21,
+ 0x00, 0x43, 0x1B, 0xF3, 0x0E, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x6B, 0x01, 0x93,
+ 0x2D, 0x2E, 0x21, 0x08, 0x69, 0x10, 0xF3, 0x0E,
+ 0x00, 0x00, 0x00, 0x00, 0xAE, 0x10, 0xF3, 0x0E,
+ 0x5F, 0x00, 0xA0, 0x2D, 0x2E, 0x21, 0x01, 0x5A,
+ 0x1B, 0xF3, 0x0E, 0x00, 0x00, 0x00, 0x00, 0x8D,
+ 0x1B, 0xF3, 0x0E, 0x6E, 0x00, 0xB5, 0x2D, 0x2E,
+ 0x21, 0x01, 0xA3, 0x1B, 0xF3, 0x0E, 0x00, 0x00,
+ 0x00, 0x00, 0x45, 0x1C, 0xF3, 0x0E, 0x5B, 0x00,
+ 0xB9, 0x2D, 0x2E, 0x21, 0x02, 0x38, 0x1D, 0xF3,
+ 0x0E, 0x00, 0x00, 0x00, 0x00, 0x33, 0x12, 0xF3,
+ 0x0E, 0x63, 0x00, 0xC5, 0x2D, 0x2E, 0x21, 0x00,
+ 0x0F, 0x15, 0xF3, 0x0E, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x65, 0x01, 0xD1, 0x2D,
+ 0x2E, 0x21, 0x01, 0x75, 0x1C, 0xF3, 0x0E, 0x00,
+ 0x00, 0x00, 0x00, 0xD2, 0x1C, 0xF3, 0x0E, 0x6F,
+ 0x00, 0xDD, 0x2D, 0x2E, 0x21, 0x08, 0xC0, 0x1D,
+ 0xF3, 0x0E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x70, 0x00, 0xE9, 0x2D, 0x2E, 0x21,
+ 0x01, 0x1A, 0x13, 0xF3, 0x0E, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x61, 0x00, 0xF6,
+ 0x2D, 0x2E, 0x21, 0x04, 0xDF, 0x1D, 0xF3, 0x0E,
+ 0x00, 0x00, 0x00, 0x00, 0x1D, 0x1E, 0xF3, 0x0E,
+ 0x71, 0x00, 0x07, 0x2E, 0x2E, 0x21, 0x08, 0x3E,
+ 0x1E, 0xF3, 0x0E, 0x00, 0x00, 0x00, 0x00, 0x6C,
+ 0x1E, 0xF3, 0x0E, 0x5B, 0x00, 0x0E, 0x2E, 0x2E,
+ 0x21, 0x08, 0x7E, 0x1E, 0xF3, 0x0E, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x72, 0x00,
+ 0x1F, 0x2E, 0x2E, 0x21, 0x01, 0xCC, 0x1E, 0xF3,
+ 0x0E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x69, 0x00, 0x33, 0x2E, 0x2E, 0x21, 0x00,
+ 0xF3, 0x1E, 0xF3, 0x0E, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x6C, 0x01, 0x48, 0x2E,
+ 0x2E, 0x21, 0x01, 0x0B, 0x1F, 0xF3, 0x0E, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x73,
+ 0x00, 0x5A, 0x2E, 0x2E, 0x21, 0x08, 0x33, 0x1F,
+ 0xF3, 0x0E, 0x00, 0x00, 0x00, 0x00, 0x8F, 0x1F,
+ 0xF3, 0x0E, 0x6E, 0x00, 0x7A, 0x2E, 0x2E, 0x21,
+ 0x04, 0xC8, 0x1F, 0xF3, 0x0E, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x74, 0x00, 0x94,
+ 0x2E, 0x2E, 0x21, 0x01, 0xD2, 0x1F, 0xF3, 0x0E,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x6A, 0x00, 0xA9, 0x2E, 0x2E, 0x21, 0x00, 0xF9,
+ 0x1F, 0xF3, 0x0E, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x6C, 0x01, 0xBF, 0x2E, 0x2E,
+ 0x21, 0x00, 0x11, 0x20, 0xF3, 0x0E, 0x32, 0x20,
+ 0xF3, 0x0E, 0x00, 0x00, 0x00, 0x00, 0x62, 0x01,
+ 0xCC, 0x2E, 0x2E, 0x21, 0x01, 0x50, 0x20, 0xF3,
+ 0x0E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x75, 0x00, 0xD7, 0x2E, 0x2E, 0x21, 0x01,
+ 0xBC, 0x21, 0xF3, 0x0E, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x68, 0x00, 0xE4, 0x2E,
+ 0x2E, 0x21, 0x00, 0x00, 0x00, 0x00, 0x00, 0x8A,
+ 0x20, 0xF3, 0x0E, 0x00, 0x00, 0x00, 0x00, 0x75,
+ 0x00, 0xE5, 0x2E, 0x2E, 0x21, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0xA8, 0x20, 0xF3, 0x0E, 0x00, 0x00,
+ 0x00, 0x00, 0x75, 0x00, 0xE6, 0x2E, 0x2E, 0x21,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x45, 0x21, 0xF3,
+ 0x0E, 0x00, 0x00, 0x00, 0x00, 0x75, 0x00
+};
+
+static const ByteProvider kEoB1SpellPropertiesDOSProvider = { ARRAYSIZE(kEoB1SpellPropertiesDOS), kEoB1SpellPropertiesDOS };
+
+static const byte kEoB1MagicFlightPropsDOS[96] = {
+ 0x04, 0xFF, 0x41, 0x09, 0x0A, 0xFF, 0x04, 0x05,
+ 0x0D, 0xFF, 0x7A, 0x06, 0x0E, 0xFF, 0x0C, 0x05,
+ 0x10, 0xFF, 0x4A, 0x0A, 0x12, 0x06, 0x38, 0x07,
+ 0x15, 0x06, 0x7A, 0x08, 0x19, 0xFF, 0x4A, 0x0A,
+ 0x2F, 0xFF, 0x4B, 0x06, 0x32, 0xFF, 0x09, 0x07,
+ 0x33, 0xFF, 0x09, 0x0A, 0x34, 0xFF, 0x09, 0x0A,
+ 0x01, 0x01, 0x00, 0x00, 0x03, 0xFD, 0x02, 0xFE,
+ 0x01, 0xFF, 0x00, 0x00, 0x98, 0x00, 0x18, 0x00,
+ 0x78, 0x00, 0x38, 0x00, 0x58, 0x00, 0x40, 0x40,
+ 0x38, 0x38, 0x38, 0x38, 0xE0, 0x20, 0x01, 0xFF,
+ 0x0F, 0x00, 0x09, 0x00, 0x0F, 0x00, 0x09, 0x00,
+ 0x02, 0x00, 0x0A, 0x00, 0x02, 0x00, 0x00, 0x00
+};
+
+static const ByteProvider kEoB1MagicFlightPropsDOSProvider = { ARRAYSIZE(kEoB1MagicFlightPropsDOS), kEoB1MagicFlightPropsDOS };
+
+static const byte kEoB1TurnUndeadEffectDOS[140] = {
+ 0x0A, 0x07, 0x04, 0x00, 0x00, 0xFF, 0xFF, 0xFF,
+ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x0D, 0x0A,
+ 0x07, 0x04, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF,
+ 0xFF, 0xFF, 0xFF, 0xFF, 0x10, 0x0D, 0x0A, 0x07,
+ 0x04, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+ 0xFF, 0xFF, 0x13, 0x10, 0x0D, 0x0A, 0x07, 0x04,
+ 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+ 0x14, 0x13, 0x10, 0x0D, 0x0A, 0x07, 0x04, 0x00,
+ 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x63, 0x14,
+ 0x13, 0x10, 0x0D, 0x0A, 0x07, 0x04, 0x00, 0x00,
+ 0x00, 0xFF, 0xFF, 0x00, 0x63, 0x63, 0x14, 0x13,
+ 0x10, 0x0D, 0x0A, 0x07, 0x04, 0x00, 0x00, 0x00,
+ 0x00, 0xFF, 0x63, 0x63, 0x63, 0x14, 0x13, 0x10,
+ 0x0D, 0x0A, 0x07, 0x04, 0x04, 0x00, 0x00, 0x00,
+ 0x63, 0x63, 0x63, 0x63, 0x14, 0x13, 0x10, 0x0D,
+ 0x0A, 0x07, 0x07, 0x04, 0x04, 0x00, 0x63, 0x63,
+ 0x63, 0x63, 0x63, 0x14, 0x13, 0x10, 0x0D, 0x0A,
+ 0x0A, 0x07, 0x07, 0x04
+};
+
+static const ByteProvider kEoB1TurnUndeadEffectDOSProvider = { ARRAYSIZE(kEoB1TurnUndeadEffectDOS), kEoB1TurnUndeadEffectDOS };
+
+static const byte kEoB1BurningHandsDestDOS[8] = {
+ 0x02, 0x03, 0x00, 0x02, 0x00, 0x01, 0x01, 0x03
+};
+
+static const ByteProvider kEoB1BurningHandsDestDOSProvider = { ARRAYSIZE(kEoB1BurningHandsDestDOS), kEoB1BurningHandsDestDOS };
+
+static const byte kEoB1ConeOfColdDest1DOS[7] = {
+ 0xE0, 0xC0, 0xC1, 0xBF, 0xA0, 0x9F, 0xA1
+};
+
+static const ByteProvider kEoB1ConeOfColdDest1DOSProvider = { ARRAYSIZE(kEoB1ConeOfColdDest1DOS), kEoB1ConeOfColdDest1DOS };
+
+static const byte kEoB1ConeOfColdDest2DOS[7] = {
+ 0x01, 0x02, 0xE2, 0x22, 0x03, 0xE3, 0x23
+};
+
+static const ByteProvider kEoB1ConeOfColdDest2DOSProvider = { ARRAYSIZE(kEoB1ConeOfColdDest2DOS), kEoB1ConeOfColdDest2DOS };
+
+static const byte kEoB1ConeOfColdDest3DOS[7] = {
+ 0x20, 0x40, 0x3F, 0x41, 0x60, 0x5F, 0x61
+};
+
+static const ByteProvider kEoB1ConeOfColdDest3DOSProvider = { ARRAYSIZE(kEoB1ConeOfColdDest3DOS), kEoB1ConeOfColdDest3DOS };
+
+static const byte kEoB1ConeOfColdDest4DOS[7] = {
+ 0xFF, 0xFE, 0x1E, 0xDE, 0xFD, 0x1D, 0xDD
+};
+
+static const ByteProvider kEoB1ConeOfColdDest4DOSProvider = { ARRAYSIZE(kEoB1ConeOfColdDest4DOS), kEoB1ConeOfColdDest4DOS };
+
+static const byte kEoB1ConeOfColdGfxTblDOS[8] = {
+ 0x0F, 0x09, 0x0F, 0x09, 0x02, 0x0A, 0x02, 0x00
+};
+
+static const ByteProvider kEoB1ConeOfColdGfxTblDOSProvider = { ARRAYSIZE(kEoB1ConeOfColdGfxTblDOS), kEoB1ConeOfColdGfxTblDOS };
+
+static const byte kEoB1DscDoorShapeIndexDOS[32] = {
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x03, 0x03,
+ 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03
+};
+
+static const ByteProvider kEoB1DscDoorShapeIndexDOSProvider = { ARRAYSIZE(kEoB1DscDoorShapeIndexDOS), kEoB1DscDoorShapeIndexDOS };
+
+static const byte kEoB1WllFlagPresetDOS[25] = {
+ 0x07, 0x00, 0x40, 0xA8, 0x88, 0x88, 0x88, 0x9F,
+ 0xA8, 0x88, 0x88, 0x88, 0x9F, 0xAA, 0x8A, 0x8A,
+ 0x8A, 0x9F, 0xAA, 0x8A, 0x8A, 0x8A, 0x9F, 0x03,
+ 0x03
+};
+
+static const ByteProvider kEoB1WllFlagPresetDOSProvider = { ARRAYSIZE(kEoB1WllFlagPresetDOS), kEoB1WllFlagPresetDOS };
+
+static const uint16 kEoB1DscShapeCoordsDOS[180] = {
+ 0xFF91, 0xFFC1, 0xFFA1, 0xFFC1, 0xFF75, 0xFFC5, 0xFF8B, 0xFFC5,
+ 0xFF88, 0xFFC3, 0xFFB4, 0xFFC1, 0xFFC4, 0xFFC1, 0xFFA1, 0xFFC5,
+ 0xFFB6, 0xFFC5, 0xFFB0, 0xFFC3, 0xFFD5, 0xFFC1, 0xFFE5, 0xFFC1,
+ 0xFFCB, 0xFFC5, 0xFFE1, 0xFFC5, 0xFFD8, 0xFFC3, 0xFFF8, 0xFFC1,
+ 0x0008, 0xFFC1, 0xFFF6, 0xFFC5, 0x000A, 0xFFC5, 0x0000, 0xFFC3,
+ 0x001B, 0xFFC1, 0x002B, 0xFFC1, 0x001F, 0xFFC5, 0x0035, 0xFFC5,
+ 0x0028, 0xFFC3, 0x003C, 0xFFC1, 0x004C, 0xFFC1, 0x004A, 0xFFC5,
+ 0x005F, 0xFFC5, 0x0050, 0xFFC3, 0x005F, 0xFFC1, 0x006F, 0xFFC1,
+ 0x0075, 0xFFC5, 0x008B, 0xFFC5, 0x0078, 0xFFC3, 0xFF8A, 0xFFCB,
+ 0xFFA4, 0xFFCB, 0xFF68, 0xFFD3, 0xFF88, 0xFFD3, 0xFF8A, 0xFFCE,
+ 0xFFBE, 0xFFCB, 0xFFD8, 0xFFCB, 0xFFAC, 0xFFD3, 0xFFCD, 0xFFD3,
+ 0xFFC5, 0xFFCE, 0xFFF3, 0xFFCB, 0x000D, 0xFFCB, 0xFFF0, 0xFFD3,
+ 0x0010, 0xFFD3, 0x0000, 0xFFCE, 0x0028, 0xFFCB, 0x0042, 0xFFCB,
+ 0x0033, 0xFFD3, 0x0054, 0xFFD3, 0x003B, 0xFFCE, 0x005C, 0xFFCB,
+ 0x0076, 0xFFCB, 0x0078, 0xFFD3, 0x0098, 0xFFD3, 0x0076, 0xFFCE,
+ 0xFF92, 0xFFDD, 0xFFBD, 0xFFDD, 0xFF74, 0xFFEA, 0xFFAD, 0xFFEA,
+ 0xFF9E, 0xFFE2, 0xFFEA, 0xFFDD, 0x0016, 0xFFDD, 0xFFE5, 0xFFEA,
+ 0x001B, 0xFFEA, 0x0000, 0xFFE2, 0x0043, 0xFFDD, 0x006E, 0xFFDD,
+ 0x0053, 0xFFEA, 0x008C, 0xFFEA, 0x0062, 0xFFE2, 0xFF80, 0xFFFC,
+ 0x0080, 0xFFFC, 0xFF80, 0xFFBE, 0x0080, 0xFFBE, 0x0080, 0x0000,
+ 0xFFDA, 0xFFFC, 0x0026, 0xFFFC, 0xFFDA, 0xFFBE, 0x0026, 0xFFBE,
+ 0x0000, 0x0000, 0xFF80, 0xFFFC, 0x0080, 0xFFFC, 0xFF80, 0xFFBE,
+ 0x0080, 0xFFBE, 0x0080, 0x0000
+};
+
+static const Uint16Provider kEoB1DscShapeCoordsDOSProvider = { ARRAYSIZE(kEoB1DscShapeCoordsDOS), kEoB1DscShapeCoordsDOS };
+
+static const byte kEoB1DscDoorScaleOffsDOS[32] = {
+ 0x00, 0x00, 0x00, 0x03, 0x03, 0x03, 0x03, 0x03,
+ 0x08, 0x08, 0x08, 0x08, 0x08, 0x0D, 0x0D, 0x0D,
+ 0x0D, 0x0D, 0x12, 0x12, 0x12, 0x12, 0x12, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1E, 0x1F
+};
+
+static const ByteProvider kEoB1DscDoorScaleOffsDOSProvider = { ARRAYSIZE(kEoB1DscDoorScaleOffsDOS), kEoB1DscDoorScaleOffsDOS };
+
+static const byte kEoB1DscDoorScaleMult1DOS[4] = {
+ 0x08, 0x0C, 0x12, 0x00
+};
+
+static const ByteProvider kEoB1DscDoorScaleMult1DOSProvider = { ARRAYSIZE(kEoB1DscDoorScaleMult1DOS), kEoB1DscDoorScaleMult1DOS };
+
+static const byte kEoB1DscDoorScaleMult2DOS[4] = {
+ 0x00, 0x02, 0x04, 0x00
+};
+
+static const ByteProvider kEoB1DscDoorScaleMult2DOSProvider = { ARRAYSIZE(kEoB1DscDoorScaleMult2DOS), kEoB1DscDoorScaleMult2DOS };
+
+static const byte kEoB1DscDoorScaleMult3DOS[4] = {
+ 0x04, 0x06, 0x09, 0x00
+};
+
+static const ByteProvider kEoB1DscDoorScaleMult3DOSProvider = { ARRAYSIZE(kEoB1DscDoorScaleMult3DOS), kEoB1DscDoorScaleMult3DOS };
+
+static const byte kEoB1DscDoorScaleMult4DOS[4] = {
+ 0x00, 0x02, 0x04, 0x00
+};
+
+static const ByteProvider kEoB1DscDoorScaleMult4DOSProvider = { ARRAYSIZE(kEoB1DscDoorScaleMult4DOS), kEoB1DscDoorScaleMult4DOS };
+
+static const byte kEoB1DscDoorScaleMult5DOS[4] = {
+ 0x07, 0x0B, 0x0E, 0x00
+};
+
+static const ByteProvider kEoB1DscDoorScaleMult5DOSProvider = { ARRAYSIZE(kEoB1DscDoorScaleMult5DOS), kEoB1DscDoorScaleMult5DOS };
+
+static const byte kEoB1DscDoorScaleMult6DOS[4] = {
+ 0x00, 0x02, 0x04, 0x00
+};
+
+static const ByteProvider kEoB1DscDoorScaleMult6DOSProvider = { ARRAYSIZE(kEoB1DscDoorScaleMult6DOS), kEoB1DscDoorScaleMult6DOS };
+
+static const byte kEoB1DscDoorXEDOS[32] = {
+ 0x00, 0x00, 0x00, 0x03, 0x03, 0x03, 0x03, 0x03,
+ 0x08, 0x08, 0x08, 0x08, 0x08, 0x0D, 0x0D, 0x0D,
+ 0x0D, 0x0D, 0x12, 0x12, 0x12, 0x12, 0x12, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1E, 0x1F
+};
+
+static const ByteProvider kEoB1DscDoorXEDOSProvider = { ARRAYSIZE(kEoB1DscDoorXEDOS), kEoB1DscDoorXEDOS };
+
+static const byte kEoB1DscDoorY1DOS[4] = {
+ 0x3A, 0x47, 0x56, 0x00
+};
+
+static const ByteProvider kEoB1DscDoorY1DOSProvider = { ARRAYSIZE(kEoB1DscDoorY1DOS), kEoB1DscDoorY1DOS };
+
+static const byte kEoB1DscDoorY3DOS[4] = {
+ 0x20, 0x20, 0x18, 0x00
+};
+
+static const ByteProvider kEoB1DscDoorY3DOSProvider = { ARRAYSIZE(kEoB1DscDoorY3DOS), kEoB1DscDoorY3DOS };
+
+static const byte kEoB1DscDoorY4DOS[4] = {
+ 0x1E, 0x18, 0x10, 0x30
+};
+
+static const ByteProvider kEoB1DscDoorY4DOSProvider = { ARRAYSIZE(kEoB1DscDoorY4DOS), kEoB1DscDoorY4DOS };
+
+static const byte kEoB1DscDoorY5DOS[4] = {
+ 0x30, 0x34, 0x3B, 0x3A
+};
+
+static const ByteProvider kEoB1DscDoorY5DOSProvider = { ARRAYSIZE(kEoB1DscDoorY5DOS), kEoB1DscDoorY5DOS };
+
+static const byte kEoB1DscDoorY6DOS[4] = {
+ 0x3A, 0x45, 0x5A, 0x00
+};
+
+static const ByteProvider kEoB1DscDoorY6DOSProvider = { ARRAYSIZE(kEoB1DscDoorY6DOS), kEoB1DscDoorY6DOS };
+
+static const byte kEoB1DscDoorY7DOS[4] = {
+ 0x3B, 0x47, 0x58, 0x00
+};
+
+static const ByteProvider kEoB1DscDoorY7DOSProvider = { ARRAYSIZE(kEoB1DscDoorY7DOS), kEoB1DscDoorY7DOS };
+
+static const uint16 kEoB1DscDoorCoordsExtDOS[36] = {
+ 0x0000, 0x0000, 0xFFE8, 0x0010, 0x0020, 0x0040, 0x0048, 0x0068,
+ 0x0070, 0x0090, 0x00A0, 0x00C8, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0xFFE8, 0x0030, 0x0038, 0x0078, 0x0080, 0x00C8, 0x0000, 0x0000,
+ 0xFFA8, 0x0020, 0x0028, 0x0088, 0x0090, 0x0108, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000
+};
+
+static const Uint16Provider kEoB1DscDoorCoordsExtDOSProvider = { ARRAYSIZE(kEoB1DscDoorCoordsExtDOS), kEoB1DscDoorCoordsExtDOS };
+
+static const byte kEoB1DscDoorFrameY1DOS[32] = {
+ 0x20, 0x18, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x20, 0x20, 0x18, 0x00, 0x1E, 0x18, 0x10, 0x00,
+ 0x3A, 0x48, 0x60, 0x78, 0x3A, 0x46, 0x56, 0x00,
+ 0x78, 0x78, 0x78, 0x78, 0x1F, 0x18, 0x0F, 0x00
+};
+
+static const ByteProvider kEoB1DscDoorFrameY1DOSProvider = { ARRAYSIZE(kEoB1DscDoorFrameY1DOS), kEoB1DscDoorFrameY1DOS };
+
+static const byte kEoB1DscDoorFrameY2DOS[32] = {
+ 0x20, 0x18, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x20, 0x20, 0x18, 0x00, 0x1E, 0x18, 0x10, 0x00,
+ 0x3A, 0x48, 0x60, 0x78, 0x3A, 0x46, 0x56, 0x00,
+ 0x78, 0x78, 0x78, 0x78, 0x1F, 0x18, 0x0F, 0x00
+};
+
+static const ByteProvider kEoB1DscDoorFrameY2DOSProvider = { ARRAYSIZE(kEoB1DscDoorFrameY2DOS), kEoB1DscDoorFrameY2DOS };
+
+static const byte kEoB1DscDoorFrameIndex1DOS[12] = {
+ 0x00, 0x00, 0x00, 0x04, 0x04, 0x04, 0x08, 0x08,
+ 0x08, 0x0C, 0x0C, 0x1C
+};
+
+static const ByteProvider kEoB1DscDoorFrameIndex1DOSProvider = { ARRAYSIZE(kEoB1DscDoorFrameIndex1DOS), kEoB1DscDoorFrameIndex1DOS };
+
+static const byte kEoB1DscDoorFrameIndex2DOS[12] = {
+ 0x10, 0x10, 0x10, 0x18, 0x18, 0x18, 0x10, 0x10,
+ 0x10, 0x14, 0x14, 0x18
+};
+
+static const ByteProvider kEoB1DscDoorFrameIndex2DOSProvider = { ARRAYSIZE(kEoB1DscDoorFrameIndex2DOS), kEoB1DscDoorFrameIndex2DOS };
+
+static const byte kEoB1DscItemPosIndexDOS[16] = {
+ 0x00, 0x01, 0x02, 0x03, 0x02, 0x00, 0x03, 0x01,
+ 0x03, 0x02, 0x01, 0x00, 0x01, 0x03, 0x00, 0x02
+};
+
+static const ByteProvider kEoB1DscItemPosIndexDOSProvider = { ARRAYSIZE(kEoB1DscItemPosIndexDOS), kEoB1DscItemPosIndexDOS };
+
+static const uint16 kEoB1DscItemShpXDOS[18] = {
+ 0xFFC8, 0xFFF8, 0x0028, 0x0058, 0x0088, 0x00B8, 0x00E8, 0xFFB8,
+ 0x0008, 0x0058, 0x00A8, 0x00F8, 0xFFD8, 0x0058, 0x00D8, 0xFFA8,
+ 0x0058, 0x0108
+};
+
+static const Uint16Provider kEoB1DscItemShpXDOSProvider = { ARRAYSIZE(kEoB1DscItemShpXDOS), kEoB1DscItemShpXDOS };
+
+static const byte kEoB1DscItemScaleIndexDOS[18] = {
+ 0xFF, 0xFF, 0x03, 0x03, 0x02, 0x02, 0x02, 0x02,
+ 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0xFF, 0xFF,
+ 0x25, 0x00
+};
+
+static const ByteProvider kEoB1DscItemScaleIndexDOSProvider = { ARRAYSIZE(kEoB1DscItemScaleIndexDOS), kEoB1DscItemScaleIndexDOS };
+
+static const byte kEoB1DscItemTileIndexDOS[18] = {
+ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+ 0xFF, 0x03, 0xFF, 0xFF, 0xFF, 0x09, 0xFF, 0x0B,
+ 0x0C, 0x0D
+};
+
+static const ByteProvider kEoB1DscItemTileIndexDOSProvider = { ARRAYSIZE(kEoB1DscItemTileIndexDOS), kEoB1DscItemTileIndexDOS };
+
+static const byte kEoB1DscItemShapeMapDOS[90] = {
+ 0x00, 0x00, 0x00, 0x04, 0x01, 0x02, 0x03, 0x04,
+ 0x05, 0x06, 0x07, 0x07, 0x12, 0x06, 0x0F, 0x12,
+ 0x14, 0x17, 0x13, 0x11, 0x15, 0x0D, 0x09, 0x09,
+ 0x16, 0x1F, 0x0C, 0x23, 0x0C, 0x0C, 0x0C, 0x0B,
+ 0x0A, 0x1C, 0x1C, 0x1A, 0x1B, 0x21, 0x1D, 0x1D,
+ 0x22, 0x22, 0x22, 0x00, 0x08, 0x00, 0x25, 0x18,
+ 0x16, 0x17, 0x16, 0x17, 0x16, 0x17, 0x19, 0x23,
+ 0x10, 0x1E, 0x24, 0x18, 0x1C, 0x20, 0x12, 0x21,
+ 0x1E, 0x23, 0x1C, 0x00, 0x20, 0x11, 0x11, 0x0D,
+ 0x1F, 0x09, 0x09, 0x15, 0x15, 0x0F, 0x05, 0x0C,
+ 0x1E, 0x1E, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x1B,
+ 0x1B, 0x00
+};
+
+static const ByteProvider kEoB1DscItemShapeMapDOSProvider = { ARRAYSIZE(kEoB1DscItemShapeMapDOS), kEoB1DscItemShapeMapDOS };
+
+static const byte kEoB1DscTelptrShpCoordsDOS[156] = {
+ 0x0C, 0x07, 0x1A, 0x01, 0x3E, 0x03, 0x0C, 0x1A,
+ 0x2A, 0x13, 0x40, 0x18, 0x02, 0x2D, 0x16, 0x25,
+ 0x28, 0x32, 0x36, 0x27, 0x0A, 0x3E, 0x16, 0x49,
+ 0x3E, 0x44, 0x06, 0x06, 0x2A, 0x04, 0x37, 0x0A,
+ 0x04, 0x1B, 0x1A, 0x16, 0x37, 0x1D, 0x0E, 0x2A,
+ 0x1B, 0x35, 0x2E, 0x28, 0x42, 0x30, 0x06, 0x47,
+ 0x06, 0x47, 0x2D, 0x4C, 0x0A, 0x04, 0x14, 0x00,
+ 0x2E, 0x01, 0x0C, 0x10, 0x1F, 0x10, 0x2F, 0x10,
+ 0x12, 0x18, 0x28, 0x1D, 0x01, 0x21, 0x08, 0x2A,
+ 0x11, 0x32, 0x2F, 0x2E, 0x1F, 0x25, 0x02, 0x02,
+ 0x01, 0x11, 0x01, 0x2F, 0x08, 0x1E, 0x11, 0x0E,
+ 0x11, 0x26, 0x1C, 0x01, 0x1E, 0x19, 0x1F, 0x33,
+ 0x24, 0x11, 0x26, 0x05, 0x28, 0x2B, 0x2F, 0x22,
+ 0x00, 0x13, 0x05, 0x01, 0x06, 0x08, 0x09, 0x0C,
+ 0x04, 0x1A, 0x08, 0x1F, 0x12, 0x05, 0x12, 0x15,
+ 0x16, 0x10, 0x1A, 0x08, 0x1A, 0x1D, 0x0A, 0x00,
+ 0x0A, 0x00, 0x00, 0x09, 0x00, 0x1E, 0x04, 0x11,
+ 0x08, 0x16, 0x08, 0x06, 0x10, 0x00, 0x11, 0x0D,
+ 0x12, 0x20, 0x15, 0x02, 0x14, 0x09, 0x16, 0x1B,
+ 0x1A, 0x14, 0x1A, 0x14
+};
+
+static const ByteProvider kEoB1DscTelptrShpCoordsDOSProvider = { ARRAYSIZE(kEoB1DscTelptrShpCoordsDOS), kEoB1DscTelptrShpCoordsDOS };
+
+static const byte kEoB1PortalSeqDataDOS[126] = {
+ 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x01, 0x00, 0x02, 0x00, 0x01, 0x00,
+ 0x00, 0x00, 0x01, 0x00, 0x02, 0x00, 0x03, 0x00,
+ 0x02, 0x00, 0x01, 0x00, 0x02, 0x00, 0x03, 0x00,
+ 0x04, 0x00, 0x03, 0x00, 0x02, 0x00, 0x01, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00,
+ 0x00, 0x01, 0x00, 0x02, 0x00, 0x01, 0x00, 0x00,
+ 0x00, 0x01, 0x00, 0x02, 0x00, 0x03, 0x00, 0x04,
+ 0x00, 0x01, 0x01, 0x00, 0x02, 0x01, 0x03, 0x02,
+ 0x02, 0x03, 0x01, 0x04, 0x00, 0x02, 0x01, 0x03,
+ 0x02, 0x04, 0x03, 0x02, 0x04, 0x03, 0x03, 0x04,
+ 0x02, 0x02, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x01, 0x01, 0x02, 0x02, 0x03, 0x03,
+ 0x04, 0x04, 0x04, 0x05, 0x04, 0x06, 0x03, 0x07,
+ 0x02, 0x08, 0x02, 0x08, 0x01, 0x09, 0x01, 0x09,
+ 0x01, 0x09, 0x00, 0x0A, 0xFF, 0xFF
+};
+
+static const ByteProvider kEoB1PortalSeqDataDOSProvider = { ARRAYSIZE(kEoB1PortalSeqDataDOS), kEoB1PortalSeqDataDOS };
+
+static const byte kEoB1DscMonsterFrmOffsTbl1DOS[32] = {
+ 0x04, 0xFE, 0x01, 0x03, 0x03, 0x04, 0xFE, 0x01,
+ 0x01, 0x03, 0x04, 0xFE, 0xFE, 0x01, 0x03, 0x04,
+ 0xFC, 0xFD, 0xFF, 0x02, 0x02, 0xFC, 0xFD, 0xFF,
+ 0xFF, 0x02, 0xFC, 0xFD, 0xFD, 0xFF, 0x02, 0xFC
+};
+
+static const ByteProvider kEoB1DscMonsterFrmOffsTbl1DOSProvider = { ARRAYSIZE(kEoB1DscMonsterFrmOffsTbl1DOS), kEoB1DscMonsterFrmOffsTbl1DOS };
+
+static const byte kEoB1DscMonsterFrmOffsTbl2DOS[32] = {
+ 0x04, 0xFE, 0x01, 0x03, 0x03, 0x04, 0xFE, 0x01,
+ 0x01, 0x03, 0x04, 0xFE, 0xFE, 0x01, 0x03, 0x04,
+ 0x04, 0xFD, 0x01, 0x02, 0x02, 0x04, 0xFD, 0x01,
+ 0x01, 0x02, 0x04, 0xFD, 0xFD, 0x01, 0x02, 0x04
+};
+
+static const ByteProvider kEoB1DscMonsterFrmOffsTbl2DOSProvider = { ARRAYSIZE(kEoB1DscMonsterFrmOffsTbl2DOS), kEoB1DscMonsterFrmOffsTbl2DOS };
+
+static const uint16 kEoB1InvSlotXDOS[27] = {
+ 0x00E6, 0x0116, 0x00B5, 0x00C7, 0x00B5, 0x00C7, 0x00B5, 0x00C7,
+ 0x00B5, 0x00C7, 0x00B5, 0x00C7, 0x00B5, 0x00C7, 0x00B5, 0x00C7,
+ 0x00E1, 0x00E0, 0x00E1, 0x012A, 0x011F, 0x0115, 0x012C, 0x012C,
+ 0x012C, 0x00E4, 0x00F0
+};
+
+static const Uint16Provider kEoB1InvSlotXDOSProvider = { ARRAYSIZE(kEoB1InvSlotXDOS), kEoB1InvSlotXDOS };
+
+static const byte kEoB1InvSlotYDOS[27] = {
+ 0x74, 0x74, 0x28, 0x28, 0x3A, 0x3A, 0x4C, 0x4C,
+ 0x5E, 0x5E, 0x70, 0x70, 0x82, 0x82, 0x94, 0x94,
+ 0x38, 0x4C, 0x60, 0x37, 0x4B, 0x89, 0x5E, 0x70,
+ 0x82, 0x88, 0x88
+};
+
+static const ByteProvider kEoB1InvSlotYDOSProvider = { ARRAYSIZE(kEoB1InvSlotYDOS), kEoB1InvSlotYDOS };
+
+static const uint16 kEoB1SlotValidationFlagsDOS[27] = {
+ 0x0008, 0x0008, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF,
+ 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF,
+ 0x0001, 0x0002, 0x0004, 0x0020, 0x0040, 0x0010, 0xFFFF, 0x0080,
+ 0x0080, 0x0100, 0x0100
+};
+
+static const Uint16Provider kEoB1SlotValidationFlagsDOSProvider = { ARRAYSIZE(kEoB1SlotValidationFlagsDOS), kEoB1SlotValidationFlagsDOS };
+
+static const byte kEoB1ProjectileWeaponTypesDOS[8] = {
+ 0x10, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x12
+};
+
+static const ByteProvider kEoB1ProjectileWeaponTypesDOSProvider = { ARRAYSIZE(kEoB1ProjectileWeaponTypesDOS), kEoB1ProjectileWeaponTypesDOS };
+
+static const byte kEoB1WandTypesDOS[7] = {
+ 0x00, 0x12, 0x18, 0x28, 0x0D, 0xFF, 0x04
+};
+
+static const ByteProvider kEoB1WandTypesDOSProvider = { ARRAYSIZE(kEoB1WandTypesDOS), kEoB1WandTypesDOS };
+
+static const byte kEoB1DrawObjPosIndexDOS[20] = {
+ 0x00, 0x01, 0x02, 0x03, 0x04, 0x02, 0x00, 0x03,
+ 0x01, 0x04, 0x02, 0x03, 0x00, 0x01, 0x04, 0x01,
+ 0x03, 0x00, 0x02, 0x04
+};
+
+static const ByteProvider kEoB1DrawObjPosIndexDOSProvider = { ARRAYSIZE(kEoB1DrawObjPosIndexDOS), kEoB1DrawObjPosIndexDOS };
+
+static const byte kEoB1FlightObjFlipIndexDOS[16] = {
+ 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x01, 0x01,
+ 0x01, 0x00, 0x01, 0x00, 0x01, 0x01, 0x00, 0x00
+};
+
+static const ByteProvider kEoB1FlightObjFlipIndexDOSProvider = { ARRAYSIZE(kEoB1FlightObjFlipIndexDOS), kEoB1FlightObjFlipIndexDOS };
+
+static const byte kEoB1FlightObjShpMapDOS[88] = {
+ 0xFF, 0xFF, 0xFF, 0x00, 0xFF, 0xFF, 0xFF, 0xFF,
+ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x01,
+ 0xFF, 0xFF, 0x03, 0xFF, 0x05, 0xFF, 0xFF, 0xFF,
+ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+ 0x04, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+ 0xFF, 0xFF, 0xFF, 0xFF, 0x02, 0xFF, 0xFF, 0xFF,
+ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF
+};
+
+static const ByteProvider kEoB1FlightObjShpMapDOSProvider = { ARRAYSIZE(kEoB1FlightObjShpMapDOS), kEoB1FlightObjShpMapDOS };
+
+static const byte kEoB1FlightObjSclIndexDOS[72] = {
+ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x03,
+ 0xFF, 0xFF, 0x03, 0x03, 0xFF, 0xFF, 0x03, 0x03,
+ 0xFF, 0xFF, 0x03, 0x03, 0xFF, 0xFF, 0x03, 0xFF,
+ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+ 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02,
+ 0x02, 0x02, 0x02, 0x02, 0xFF, 0xFF, 0xFF, 0xFF,
+ 0xFF, 0x01, 0xFF, 0x01, 0x01, 0x01, 0x01, 0x01,
+ 0x01, 0xFF, 0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+ 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF
+};
+
+static const ByteProvider kEoB1FlightObjSclIndexDOSProvider = { ARRAYSIZE(kEoB1FlightObjSclIndexDOS), kEoB1FlightObjSclIndexDOS };
+
+static const byte kEoB1DscShapeIndexDOS[36] = {
+ 0x01, 0x01, 0x04, 0x0A, 0x04, 0x08, 0x04, 0x01,
+ 0x04, 0xF8, 0x04, 0xF6, 0x00, 0x00, 0x03, 0x09,
+ 0x03, 0x07, 0x03, 0x01, 0x03, 0xF9, 0x03, 0xF7,
+ 0x02, 0x06, 0x02, 0x01, 0x02, 0xFA, 0x01, 0x05,
+ 0x01, 0x01, 0x01, 0xFB
+};
+
+static const ByteProvider kEoB1DscShapeIndexDOSProvider = { ARRAYSIZE(kEoB1DscShapeIndexDOS), kEoB1DscShapeIndexDOS };
+
+static const uint16 kEoB1DscXDOS[18] = {
+ 0xFF70, 0xFFA0, 0xFFD0, 0x0000, 0x0030, 0x0060, 0x0090, 0xFF60,
+ 0xFFB0, 0x0000, 0x0050, 0x00A0, 0xFF80, 0x0000, 0x0080, 0x0000,
+ 0x0000, 0x0000
+};
+
+static const Uint16Provider kEoB1DscXDOSProvider = { ARRAYSIZE(kEoB1DscXDOS), kEoB1DscXDOS };
+
+static const byte kEoB1DscTileIndexDOS[18] = {
+ 0x00, 0x06, 0x01, 0x05, 0x02, 0x04, 0x03, 0x07,
+ 0x0B, 0x08, 0x0A, 0x09, 0x0C, 0x0E, 0x0D, 0x0F,
+ 0x11, 0x10
+};
+
+static const ByteProvider kEoB1DscTileIndexDOSProvider = { ARRAYSIZE(kEoB1DscTileIndexDOS), kEoB1DscTileIndexDOS };
+
+static const byte kEoB1DscUnk2DOS[23] = {
+ 0x00, 0x00, 0x00, 0x03, 0x03, 0x03, 0x03, 0x03,
+ 0x08, 0x08, 0x08, 0x08, 0x08, 0x0D, 0x0D, 0x0D,
+ 0x0D, 0x0D, 0x12, 0x12, 0x12, 0x12, 0x12
+};
+
+static const ByteProvider kEoB1DscUnk2DOSProvider = { ARRAYSIZE(kEoB1DscUnk2DOS), kEoB1DscUnk2DOS };
+
+static const byte kEoB1DscDimData1DOS[324] = {
+ 0xD7, 0xD7, 0xD7, 0xD7, 0xD7, 0xD7, 0xD7, 0xD7,
+ 0xD7, 0xD7, 0xD7, 0xD7, 0xD7, 0xD7, 0xD7, 0xD7,
+ 0xD8, 0xD7, 0xD8, 0xD8, 0x02, 0xD8, 0xD8, 0xD8,
+ 0xD8, 0xFE, 0xD7, 0xD8, 0xD8, 0xD8, 0xD7, 0x03,
+ 0xD8, 0xFD, 0xD8, 0xD8, 0xD8, 0xFE, 0xD8, 0x08,
+ 0xD8, 0xD8, 0xD8, 0xFE, 0xD7, 0x06, 0xD8, 0xD8,
+ 0xFA, 0x03, 0xD8, 0xFD, 0xD8, 0xD8, 0xD8, 0xD8,
+ 0xD8, 0xD8, 0xD8, 0xD8, 0xD8, 0xD8, 0xFA, 0xD7,
+ 0x10, 0xD8, 0xFD, 0xD7, 0x13, 0xD8, 0xD8, 0xD8,
+ 0xD8, 0xD8, 0xD8, 0xF2, 0xD8, 0x14, 0xD8, 0xD8,
+ 0xD8, 0xF0, 0xD7, 0x14, 0xD8, 0xED, 0x10, 0xD8,
+ 0xD8, 0x13, 0xD8, 0xD8, 0xD8, 0xD8, 0xEC, 0xD8,
+ 0xD8, 0xD8, 0xD8, 0xD8, 0xD7, 0x14, 0xD8, 0xED,
+ 0xD7, 0xD8, 0xD8, 0x13, 0xD7, 0xD7, 0xD7, 0xD7,
+ 0xD7, 0xD7, 0xD7, 0xD7, 0xD7, 0xD7, 0xD7, 0xD7,
+ 0xD7, 0xD7, 0xD7, 0xD7, 0xD8, 0xD7, 0xD7, 0xD7,
+ 0xD7, 0xD7, 0xD7, 0xD7, 0xD7, 0xD7, 0xD7, 0xD7,
+ 0xD7, 0xD7, 0xD7, 0xD7, 0xD7, 0xD7, 0xD8, 0xD7,
+ 0xD8, 0xD8, 0xD8, 0xD8, 0xD8, 0xD8, 0xD8, 0xD8,
+ 0xD8, 0x06, 0xD8, 0xD8, 0xFA, 0x03, 0xD8, 0xFD,
+ 0xD8, 0xD8, 0xD8, 0xD8, 0xD8, 0xD8, 0xD8, 0xD8,
+ 0xD8, 0xD8, 0xFA, 0xD8, 0x10, 0xD8, 0xFD, 0xD7,
+ 0x13, 0xFD, 0xD8, 0x13, 0xD8, 0xD8, 0xD8, 0xD8,
+ 0xD8, 0xD8, 0xD8, 0xD8, 0xD8, 0xF0, 0xD8, 0xD8,
+ 0xD8, 0xED, 0x10, 0xD8, 0xD8, 0x13, 0xD7, 0xD7,
+ 0xD7, 0xD7, 0xD7, 0xD7, 0xD7, 0xD7, 0xD7, 0xD7,
+ 0xD7, 0xD7, 0xD7, 0xD7, 0xD7, 0xD7, 0xD8, 0xD7,
+ 0xD8, 0xD8, 0xD8, 0xD8, 0xD8, 0xD8, 0xD8, 0xD8,
+ 0xD8, 0xD8, 0xD8, 0xD8, 0xD8, 0x03, 0xD8, 0xFD,
+ 0xD8, 0xD8, 0xD8, 0xD8, 0xD8, 0xD8, 0xD8, 0xD8,
+ 0xD8, 0xD8, 0xD8, 0xD8, 0xD8, 0xD8, 0xFD, 0xD8,
+ 0x13, 0xFD, 0xD8, 0x13, 0xD8, 0xD8, 0xD8, 0xD8,
+ 0xD8, 0xD8, 0xD8, 0xD8, 0xD8, 0xD8, 0xD8, 0xD8,
+ 0xD8, 0xED, 0xD8, 0xD8, 0xD8, 0x13, 0xD8, 0xD8,
+ 0xD8, 0xD8, 0xD8, 0xD8, 0xD8, 0xD8, 0xD8, 0xD8,
+ 0xD8, 0xD8, 0xD8, 0xD8, 0xD8, 0xD8, 0xD8, 0xD8,
+ 0xD8, 0xD8, 0xD8, 0xD8, 0xD8, 0xD8, 0xD8, 0xD8,
+ 0xD8, 0xD8, 0xD8, 0xD8, 0xD8, 0xD8, 0xD8, 0xD8,
+ 0xD8, 0xD8, 0xD8, 0xD8, 0xD8, 0xD8, 0xD8, 0xD8,
+ 0xD8, 0xD8, 0xD8, 0xD8, 0xD8, 0xD8, 0xD8, 0xD8,
+ 0xD8, 0xD8, 0xD8, 0xD8
+};
+
+static const ByteProvider kEoB1DscDimData1DOSProvider = { ARRAYSIZE(kEoB1DscDimData1DOS), kEoB1DscDimData1DOS };
+
+static const byte kEoB1DscDimData2DOS[648] = {
+ 0x16, 0x00, 0x16, 0x00, 0x16, 0x00, 0x16, 0x00,
+ 0x16, 0x00, 0x16, 0x00, 0x16, 0x00, 0x16, 0x00,
+ 0x16, 0x00, 0x16, 0x00, 0x16, 0x00, 0x16, 0x00,
+ 0x16, 0x00, 0x16, 0x00, 0x16, 0x00, 0x16, 0x00,
+ 0x00, 0x16, 0x16, 0x00, 0x00, 0x16, 0x00, 0x16,
+ 0x00, 0x02, 0x00, 0x16, 0x00, 0x16, 0x00, 0x16,
+ 0x00, 0x16, 0x02, 0x16, 0x00, 0x04, 0x00, 0x16,
+ 0x00, 0x16, 0x00, 0x16, 0x16, 0x00, 0x00, 0x03,
+ 0x00, 0x16, 0x03, 0x16, 0x00, 0x16, 0x00, 0x16,
+ 0x00, 0x16, 0x02, 0x16, 0x00, 0x16, 0x00, 0x08,
+ 0x00, 0x16, 0x00, 0x16, 0x00, 0x16, 0x00, 0x02,
+ 0x16, 0x00, 0x00, 0x06, 0x00, 0x16, 0x00, 0x16,
+ 0x06, 0x16, 0x00, 0x03, 0x00, 0x16, 0x03, 0x00,
+ 0x00, 0x16, 0x00, 0x16, 0x00, 0x16, 0x00, 0x16,
+ 0x00, 0x16, 0x00, 0x16, 0x00, 0x16, 0x00, 0x16,
+ 0x00, 0x16, 0x00, 0x16, 0x06, 0x16, 0x08, 0x0E,
+ 0x00, 0x10, 0x00, 0x16, 0x03, 0x16, 0x06, 0x10,
+ 0x00, 0x13, 0x00, 0x16, 0x00, 0x16, 0x00, 0x16,
+ 0x00, 0x16, 0x00, 0x16, 0x00, 0x16, 0x0E, 0x16,
+ 0x00, 0x16, 0x00, 0x14, 0x00, 0x16, 0x00, 0x16,
+ 0x00, 0x16, 0x10, 0x16, 0x16, 0x00, 0x00, 0x14,
+ 0x00, 0x16, 0x13, 0x16, 0x00, 0x10, 0x00, 0x16,
+ 0x00, 0x16, 0x00, 0x13, 0x00, 0x16, 0x00, 0x16,
+ 0x00, 0x16, 0x00, 0x16, 0x14, 0x16, 0x00, 0x16,
+ 0x00, 0x16, 0x00, 0x16, 0x00, 0x16, 0x00, 0x16,
+ 0x12, 0x16, 0x14, 0x16, 0x00, 0x16, 0x13, 0x16,
+ 0x16, 0x00, 0x00, 0x16, 0x00, 0x16, 0x00, 0x13,
+ 0x16, 0x00, 0x16, 0x00, 0x16, 0x00, 0x16, 0x00,
+ 0x16, 0x00, 0x16, 0x00, 0x16, 0x00, 0x16, 0x00,
+ 0x16, 0x00, 0x16, 0x00, 0x16, 0x00, 0x16, 0x00,
+ 0x16, 0x00, 0x16, 0x00, 0x16, 0x00, 0x16, 0x00,
+ 0x00, 0x16, 0x16, 0x00, 0x16, 0x00, 0x16, 0x00,
+ 0x16, 0x00, 0x16, 0x00, 0x16, 0x00, 0x16, 0x00,
+ 0x16, 0x00, 0x16, 0x00, 0x16, 0x00, 0x16, 0x00,
+ 0x16, 0x00, 0x16, 0x00, 0x16, 0x00, 0x16, 0x00,
+ 0x16, 0x00, 0x16, 0x00, 0x00, 0x16, 0x16, 0x00,
+ 0x00, 0x16, 0x00, 0x16, 0x00, 0x16, 0x00, 0x16,
+ 0x00, 0x16, 0x00, 0x16, 0x00, 0x16, 0x00, 0x16,
+ 0x00, 0x16, 0x00, 0x06, 0x00, 0x16, 0x00, 0x16,
+ 0x06, 0x16, 0x00, 0x03, 0x00, 0x16, 0x03, 0x16,
+ 0x00, 0x16, 0x00, 0x16, 0x00, 0x16, 0x00, 0x16,
+ 0x00, 0x16, 0x00, 0x16, 0x00, 0x16, 0x00, 0x16,
+ 0x00, 0x16, 0x00, 0x16, 0x06, 0x16, 0x00, 0x16,
+ 0x00, 0x10, 0x00, 0x16, 0x03, 0x16, 0x07, 0x0F,
+ 0x00, 0x13, 0x03, 0x16, 0x00, 0x16, 0x00, 0x13,
+ 0x00, 0x16, 0x00, 0x16, 0x00, 0x16, 0x00, 0x16,
+ 0x00, 0x16, 0x00, 0x16, 0x00, 0x16, 0x00, 0x16,
+ 0x00, 0x16, 0x10, 0x16, 0x00, 0x16, 0x00, 0x16,
+ 0x00, 0x16, 0x13, 0x16, 0x00, 0x10, 0x00, 0x16,
+ 0x00, 0x16, 0x00, 0x13, 0x16, 0x00, 0x16, 0x00,
+ 0x16, 0x00, 0x16, 0x00, 0x16, 0x00, 0x16, 0x00,
+ 0x16, 0x00, 0x16, 0x00, 0x16, 0x00, 0x16, 0x00,
+ 0x16, 0x00, 0x16, 0x00, 0x16, 0x00, 0x16, 0x00,
+ 0x16, 0x00, 0x16, 0x00, 0x00, 0x16, 0x16, 0x00,
+ 0x00, 0x16, 0x00, 0x16, 0x00, 0x16, 0x00, 0x16,
+ 0x00, 0x16, 0x00, 0x16, 0x00, 0x16, 0x00, 0x16,
+ 0x00, 0x16, 0x00, 0x16, 0x00, 0x16, 0x00, 0x16,
+ 0x00, 0x16, 0x00, 0x03, 0x00, 0x16, 0x03, 0x16,
+ 0x00, 0x16, 0x00, 0x16, 0x00, 0x16, 0x00, 0x16,
+ 0x00, 0x16, 0x00, 0x16, 0x00, 0x16, 0x00, 0x16,
+ 0x00, 0x16, 0x00, 0x16, 0x00, 0x16, 0x00, 0x16,
+ 0x00, 0x16, 0x00, 0x16, 0x03, 0x16, 0x00, 0x16,
+ 0x00, 0x13, 0x03, 0x16, 0x00, 0x16, 0x00, 0x13,
+ 0x00, 0x16, 0x00, 0x16, 0x00, 0x16, 0x00, 0x16,
+ 0x00, 0x16, 0x00, 0x16, 0x00, 0x16, 0x00, 0x16,
+ 0x00, 0x16, 0x00, 0x16, 0x00, 0x16, 0x00, 0x16,
+ 0x00, 0x16, 0x13, 0x16, 0x00, 0x16, 0x00, 0x16,
+ 0x00, 0x16, 0x00, 0x13, 0x00, 0x16, 0x00, 0x16,
+ 0x00, 0x16, 0x00, 0x16, 0x00, 0x16, 0x00, 0x16,
+ 0x00, 0x16, 0x00, 0x16, 0x00, 0x16, 0x00, 0x16,
+ 0x00, 0x16, 0x00, 0x16, 0x00, 0x16, 0x00, 0x16,
+ 0x00, 0x16, 0x00, 0x16, 0x00, 0x16, 0x00, 0x16,
+ 0x00, 0x16, 0x00, 0x16, 0x00, 0x16, 0x00, 0x16,
+ 0x00, 0x16, 0x00, 0x16, 0x00, 0x16, 0x00, 0x16,
+ 0x00, 0x16, 0x00, 0x16, 0x00, 0x16, 0x00, 0x16,
+ 0x00, 0x16, 0x00, 0x16, 0x00, 0x16, 0x00, 0x16,
+ 0x00, 0x16, 0x00, 0x16, 0x00, 0x16, 0x00, 0x16,
+ 0x00, 0x16, 0x00, 0x16, 0x00, 0x16, 0x00, 0x16,
+ 0x00, 0x16, 0x00, 0x16, 0x00, 0x16, 0x00, 0x16,
+ 0x00, 0x16, 0x00, 0x16, 0x00, 0x16, 0x00, 0x16,
+ 0x00, 0x16, 0x00, 0x16, 0x00, 0x16, 0x00, 0x16
+};
+
+static const ByteProvider kEoB1DscDimData2DOSProvider = { ARRAYSIZE(kEoB1DscDimData2DOS), kEoB1DscDimData2DOS };
+
+static const byte kEoB1DscBlockMapDOS[12] = {
+ 0x02, 0x03, 0x00, 0x01, 0x01, 0x02, 0x03, 0x00,
+ 0x03, 0x00, 0x01, 0x02
+};
+
+static const ByteProvider kEoB1DscBlockMapDOSProvider = { ARRAYSIZE(kEoB1DscBlockMapDOS), kEoB1DscBlockMapDOS };
+
+static const byte kEoB1DscDimMapDOS[18] = {
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01,
+ 0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x02, 0x03,
+ 0x03, 0x03
+};
+
+static const ByteProvider kEoB1DscDimMapDOSProvider = { ARRAYSIZE(kEoB1DscDimMapDOS), kEoB1DscDimMapDOS };
+
+static const byte kEoB1DscBlockIndexDOS[72] = {
+ 0x9D, 0x9E, 0x9F, 0xA0, 0xA1, 0xA2, 0xA3, 0xBE,
+ 0xBF, 0xC0, 0xC1, 0xC2, 0xDF, 0xE0, 0xE1, 0xFF,
+ 0x00, 0x01, 0xA3, 0xC3, 0xE3, 0x03, 0x23, 0x43,
+ 0x63, 0xC2, 0xE2, 0x02, 0x22, 0x42, 0xE1, 0x01,
+ 0x21, 0xE0, 0x00, 0x20, 0x63, 0x62, 0x61, 0x60,
+ 0x5F, 0x5E, 0x5D, 0x42, 0x41, 0x40, 0x3F, 0x3E,
+ 0x21, 0x20, 0x1F, 0x01, 0x00, 0xFF, 0x5D, 0x3D,
+ 0x1D, 0xFD, 0xDD, 0xBD, 0x9D, 0x3E, 0x1E, 0xFE,
+ 0xDE, 0xBE, 0x1F, 0xFF, 0xDF, 0x20, 0x00, 0xE0
+};
+
+static const ByteProvider kEoB1DscBlockIndexDOSProvider = { ARRAYSIZE(kEoB1DscBlockIndexDOS), kEoB1DscBlockIndexDOS };
+
+static const byte kEoB1ClassModifierFlagsDOS[15] = {
+ 0x01, 0x01, 0x05, 0x02, 0x04, 0x08, 0x05, 0x09,
+ 0x03, 0x0B, 0x0A, 0x0C, 0x07, 0x05, 0x06
+};
+
+static const ByteProvider kEoB1ClassModifierFlagsDOSProvider = { ARRAYSIZE(kEoB1ClassModifierFlagsDOS), kEoB1ClassModifierFlagsDOS };
+
+static const byte kEoB1MonsterStepTable01DOS[4] = {
+ 0xE0, 0x01, 0x20, 0xFF
+};
+
+static const ByteProvider kEoB1MonsterStepTable01DOSProvider = { ARRAYSIZE(kEoB1MonsterStepTable01DOS), kEoB1MonsterStepTable01DOS };
+
+static const byte kEoB1MonsterStepTable2DOS[8] = {
+ 0x07, 0xFA, 0x05, 0xFC, 0x03, 0xFE, 0x01, 0x00
+};
+
+static const ByteProvider kEoB1MonsterStepTable2DOSProvider = { ARRAYSIZE(kEoB1MonsterStepTable2DOS), kEoB1MonsterStepTable2DOS };
+
+static const byte kEoB1MonsterStepTable3DOS[8] = {
+ 0xF9, 0x06, 0xFB, 0x04, 0xFD, 0x02, 0xFF, 0x00
+};
+
+static const ByteProvider kEoB1MonsterStepTable3DOSProvider = { ARRAYSIZE(kEoB1MonsterStepTable3DOS), kEoB1MonsterStepTable3DOS };
+
+static const byte kEoB1MonsterCloseAttPosTable1DOS[4] = {
+ 0x00, 0x01, 0x03, 0x02
+};
+
+static const ByteProvider kEoB1MonsterCloseAttPosTable1DOSProvider = { ARRAYSIZE(kEoB1MonsterCloseAttPosTable1DOS), kEoB1MonsterCloseAttPosTable1DOS };
+
+static const byte kEoB1MonsterCloseAttPosTable21DOS[8] = {
+ 0x00, 0x01, 0x02, 0x03, 0x00, 0x02, 0x01, 0x03
+};
+
+static const ByteProvider kEoB1MonsterCloseAttPosTable21DOSProvider = { ARRAYSIZE(kEoB1MonsterCloseAttPosTable21DOS), kEoB1MonsterCloseAttPosTable21DOS };
+
+static const byte kEoB1MonsterCloseAttChkTable1DOS[16] = {
+ 0x01, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01,
+ 0x00, 0x00, 0x01, 0x01, 0x01, 0x00, 0x01, 0x00
+};
+
+static const ByteProvider kEoB1MonsterCloseAttChkTable1DOSProvider = { ARRAYSIZE(kEoB1MonsterCloseAttChkTable1DOS), kEoB1MonsterCloseAttChkTable1DOS };
+
+static const byte kEoB1MonsterCloseAttChkTable2DOS[16] = {
+ 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x01, 0x01,
+ 0x01, 0x00, 0x01, 0x00, 0x01, 0x01, 0x00, 0x00
+};
+
+static const ByteProvider kEoB1MonsterCloseAttChkTable2DOSProvider = { ARRAYSIZE(kEoB1MonsterCloseAttChkTable2DOS), kEoB1MonsterCloseAttChkTable2DOS };
+
+static const byte kEoB1MonsterCloseAttDstTable1DOS[16] = {
+ 0x02, 0x03, 0x00, 0x01, 0x01, 0x02, 0x03, 0x00,
+ 0x00, 0x01, 0x02, 0x03, 0x03, 0x00, 0x01, 0x02
+};
+
+static const ByteProvider kEoB1MonsterCloseAttDstTable1DOSProvider = { ARRAYSIZE(kEoB1MonsterCloseAttDstTable1DOS), kEoB1MonsterCloseAttDstTable1DOS };
+
+static const byte kEoB1MonsterCloseAttDstTable2DOS[48] = {
+ 0x01, 0x00, 0x03, 0x02, 0x05, 0x04, 0x00, 0x01,
+ 0x02, 0x03, 0x04, 0x05, 0x05, 0x03, 0x01, 0x04,
+ 0x02, 0x00, 0x01, 0x03, 0x05, 0x00, 0x02, 0x04,
+ 0x04, 0x05, 0x02, 0x03, 0x00, 0x01, 0x05, 0x04,
+ 0x03, 0x02, 0x01, 0x00, 0x00, 0x02, 0x04, 0x01,
+ 0x03, 0x05, 0x04, 0x02, 0x00, 0x05, 0x03, 0x01
+};
+
+static const ByteProvider kEoB1MonsterCloseAttDstTable2DOSProvider = { ARRAYSIZE(kEoB1MonsterCloseAttDstTable2DOS), kEoB1MonsterCloseAttDstTable2DOS };
+
+static const byte kEoB1MonsterProximityTableDOS[32] = {
+ 0x02, 0x03, 0x00, 0x01, 0x03, 0x02, 0x01, 0x00,
+ 0x00, 0x02, 0x01, 0x03, 0x02, 0x00, 0x03, 0x01,
+ 0x01, 0x00, 0x03, 0x02, 0x00, 0x01, 0x02, 0x03,
+ 0x03, 0x01, 0x00, 0x02, 0x01, 0x03, 0x02, 0x00
+};
+
+static const ByteProvider kEoB1MonsterProximityTableDOSProvider = { ARRAYSIZE(kEoB1MonsterProximityTableDOS), kEoB1MonsterProximityTableDOS };
+
+static const byte kEoB1FindBlockMonstersTableDOS[64] = {
+ 0x04, 0x02, 0x01, 0x03, 0x04, 0x03, 0x00, 0x02,
+ 0x04, 0x00, 0x03, 0x01, 0x04, 0x01, 0x02, 0x00,
+ 0x04, 0x01, 0x02, 0x03, 0x04, 0x00, 0x03, 0x02,
+ 0x04, 0x03, 0x00, 0x01, 0x04, 0x02, 0x01, 0x00,
+ 0x04, 0x02, 0x01, 0x03, 0x04, 0x03, 0x00, 0x02,
+ 0x04, 0x00, 0x03, 0x01, 0x04, 0x01, 0x02, 0x00,
+ 0x04, 0x01, 0x02, 0x03, 0x04, 0x00, 0x03, 0x02,
+ 0x04, 0x03, 0x00, 0x01, 0x04, 0x02, 0x01, 0x00
+};
+
+static const ByteProvider kEoB1FindBlockMonstersTableDOSProvider = { ARRAYSIZE(kEoB1FindBlockMonstersTableDOS), kEoB1FindBlockMonstersTableDOS };
+
+static const byte kEoB1MonsterDirChangeTableDOS[48] = {
+ 0xFF, 0x06, 0x02, 0xFF, 0x04, 0x05, 0x03, 0xFF,
+ 0x00, 0x07, 0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+ 0xDF, 0xFF, 0xE0, 0xFF, 0xE1, 0xFF, 0xFF, 0xFF,
+ 0x01, 0x00, 0x1F, 0x00, 0x20, 0x00, 0x21, 0x00,
+ 0xC0, 0xFF, 0xA0, 0xFF, 0x02, 0x00, 0x03, 0x00,
+ 0x40, 0x00, 0x60, 0x00, 0xFE, 0xFF, 0xFD, 0xFF
+};
+
+static const ByteProvider kEoB1MonsterDirChangeTableDOSProvider = { ARRAYSIZE(kEoB1MonsterDirChangeTableDOS), kEoB1MonsterDirChangeTableDOS };
+
+static const uint16 kEoB1EncodeMonsterDefsDOS[168] = {
+ 0x0000, 0x0000, 0x0007, 0x0060, 0x0007, 0x0028, 0x000C, 0x0038,
+ 0x0013, 0x0028, 0x000C, 0x0038, 0x001F, 0x0000, 0x0007, 0x0060,
+ 0x0000, 0x0060, 0x0007, 0x0060, 0x0007, 0x0060, 0x0007, 0x0060,
+ 0x000E, 0x0060, 0x0005, 0x0038, 0x0007, 0x0000, 0x0007, 0x0028,
+ 0x000E, 0x0000, 0x0007, 0x0028, 0x0013, 0x0060, 0x0005, 0x0038,
+ 0x0018, 0x0060, 0x0005, 0x0038, 0x001D, 0x0060, 0x0005, 0x0038,
+ 0x000E, 0x0098, 0x0003, 0x0020, 0x0011, 0x00A0, 0x0004, 0x0018,
+ 0x0015, 0x00A0, 0x0004, 0x0018, 0x0019, 0x0098, 0x0003, 0x0020,
+ 0x001C, 0x0098, 0x0003, 0x0020, 0x001F, 0x0098, 0x0003, 0x0020,
+ 0x0000, 0x0000, 0x0007, 0x0060, 0x0007, 0x0000, 0x0007, 0x0060,
+ 0x000E, 0x0000, 0x0007, 0x0060, 0x0015, 0x0000, 0x0007, 0x0060,
+ 0x001C, 0x0000, 0x0007, 0x0060, 0x0000, 0x0060, 0x0007, 0x0060,
+ 0x0007, 0x0060, 0x0005, 0x0038, 0x000C, 0x0060, 0x0005, 0x0038,
+ 0x0011, 0x0060, 0x0005, 0x0038, 0x0016, 0x0060, 0x0005, 0x0038,
+ 0x001B, 0x0060, 0x0005, 0x0038, 0x0020, 0x0060, 0x0005, 0x0038,
+ 0x0007, 0x0098, 0x0003, 0x0020, 0x000A, 0x0098, 0x0003, 0x0020,
+ 0x000D, 0x0098, 0x0003, 0x0020, 0x0010, 0x0098, 0x0003, 0x0020,
+ 0x0013, 0x0098, 0x0003, 0x0020, 0x0016, 0x0098, 0x0003, 0x0020,
+ 0x0000, 0x0000, 0x000A, 0x0058, 0x000A, 0x0000, 0x000A, 0x0058,
+ 0x0014, 0x0000, 0x000A, 0x0058, 0x001E, 0x0000, 0x000A, 0x0058,
+ 0x0000, 0x0058, 0x000A, 0x0058, 0x000A, 0x0058, 0x000A, 0x0058
+};
+
+static const Uint16Provider kEoB1EncodeMonsterDefsDOSProvider = { ARRAYSIZE(kEoB1EncodeMonsterDefsDOS), kEoB1EncodeMonsterDefsDOS };
+
+static const EoBCharacter kEoB1NpcPresetsDOS[9] = {
+ { 0x00, 0x01, "Anya",
+ 18, 18, 59, 59, 5, 5, 11, 11, 14, 14, 16, 16, 9, 9,
+ 45, 45, 10, 0, 1, 0, 2, -1, 100, { 4, 0, 0 },
+ { 0x00001F40, 0x00000000, 0x00000000 }, 0x00000000,
+ { 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000 } },
+ { 0x00, 0x01, "Beohram",
+ 17, 17, 0, 0, 9, 9, 15, 15, 13, 13, 18, 18, 17, 17,
+ 55, 55, 10, 0, 0, 0, 0, -2, 100, { 7, 0, 0 },
+ { 0x000130B0, 0x00000000, 0x00000000 }, 0x00000000,
+ { 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000 } },
+ { 0x00, 0x01, "Kirath",
+ 11, 11, 0, 0, 17, 17, 13, 13, 18, 18, 8, 8, 12, 12,
+ 20, 20, 10, 0, 4, 3, 4, -3, 100, { 7, 0, 0 },
+ { 0x00011170, 0x00000000, 0x00000000 }, 0x00B3126B,
+ { 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000 } },
+ { 0x00, 0x01, "Ileria",
+ 10, 10, 0, 0, 12, 12, 9, 9, 15, 15, 17, 17, 17, 17,
+ 52, 52, 10, 0, 4, 4, 0, -4, 100, { 6, 0, 0 },
+ { 0x00004E20, 0x00000000, 0x00000000 }, 0xFFFFFFFF,
+ { 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000 } },
+ { 0x00, 0x01, "Tyrra",
+ 16, 16, 0, 0, 14, 14, 16, 16, 18, 18, 17, 17, 7, 7,
+ 45, 45, 10, 0, 1, 1, 2, -5, 100, { 6, 0, 0 },
+ { 0x0000CF08, 0x00000000, 0x00000000 }, 0x00000000,
+ { 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000 } },
+ { 0x00, 0x01, "Tod Uphill",
+ 17, 17, 0, 0, 11, 11, 14, 14, 19, 19, 18, 18, 16, 16,
+ 32, 32, 10, 0, 10, 5, 5, -6, 100, { 5, 0, 0 },
+ { 0x00002D3F, 0x00000000, 0x00000000 }, 0x00000000,
+ { 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000 } },
+ { 0x00, 0x01, "Taghor",
+ 17, 17, 0, 0, 11, 11, 15, 15, 15, 15, 19, 19, 9, 9,
+ 3, 45, 3, 0, 6, 0, 1, -7, 25, { 5, 0, 0 },
+ { 0x00003F6A, 0x00000000, 0x00000000 }, 0x00000000,
+ { 0x0024, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0029, 0x0000, 0x002B, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000 } },
+ { 0x00, 0x01, "Dohrum",
+ 18, 18, 29, 29, 13, 13, 11, 11, 16, 16, 17, 17, 14, 14,
+ 28, 28, 10, 0, 6, 0, 0, -8, 100, { 3, 0, 0 },
+ { 0x000013A0, 0x00000000, 0x00000000 }, 0x00000000,
+ { 0x0024, 0x0000, 0x0030, 0x0037, 0x0037, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0029, 0x0000, 0x002B, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000 } },
+ { 0x00, 0x01, "Keirgar",
+ 18, 18, 92, 92, 15, 15, 15, 15, 12, 12, 19, 19, 17, 17,
+ 3, 45, 3, 0, 6, 0, 1, -9, 25, { 5, 0, 0 },
+ { 0x00001F40, 0x00000000, 0x00000000 }, 0x00000000,
+ { 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000 } }
+};
+
+static const EoBCharacterProvider kEoB1NpcPresetsDOSProvider = { ARRAYSIZE(kEoB1NpcPresetsDOS), kEoB1NpcPresetsDOS };
+
diff --git a/devtools/create_kyradat/resources/eob1_dos_english.h b/devtools/create_kyradat/resources/eob1_dos_english.h
new file mode 100644
index 0000000000..8a9dfebc8f
--- /dev/null
+++ b/devtools/create_kyradat/resources/eob1_dos_english.h
@@ -0,0 +1,891 @@
+static const char *const kEoB1ChargenStrings1DOSEnglish[9] = {
+ "Your party is\rcomplete. Select\rthe PLAY button\ror press 'P' to\rstart the game.",
+ " ",
+ "AC\rHP\rLVL",
+ "%s\r%d\r%d\r%d\r%d\r%d",
+ "%d\r%d",
+ "%d",
+ "%d/%d",
+ "%d/%d/%d",
+ "Select the box of\rthe character you\rwish to create or\rview."
+};
+
+static const StringListProvider kEoB1ChargenStrings1DOSEnglishProvider = { ARRAYSIZE(kEoB1ChargenStrings1DOSEnglish), kEoB1ChargenStrings1DOSEnglish };
+
+static const char *const kEoB1ChargenStrings2DOSEnglish[12] = {
+ "%s",
+ "%d",
+ "%s",
+ "%d",
+ "%d",
+ "%d",
+ "%s",
+ "%d",
+ "SELECT RACE:",
+ "SELECT CLASS:",
+ "SELECT ALIGNMENT:",
+ "Name:"
+};
+
+static const StringListProvider kEoB1ChargenStrings2DOSEnglishProvider = { ARRAYSIZE(kEoB1ChargenStrings2DOSEnglish), kEoB1ChargenStrings2DOSEnglish };
+
+static const char *const kEoB1ChargenStatStringsDOSEnglish[12] = {
+ "STR",
+ "INT",
+ "WIS",
+ "DEX",
+ "CON",
+ "CHA",
+ "STRENGTH",
+ "INTELLIGENCE",
+ "WISDOM",
+ "DEXTERITY",
+ "CONSTITUTION",
+ "CHARISMA"
+};
+
+static const StringListProvider kEoB1ChargenStatStringsDOSEnglishProvider = { ARRAYSIZE(kEoB1ChargenStatStringsDOSEnglish), kEoB1ChargenStatStringsDOSEnglish };
+
+static const char *const kEoB1ChargenRaceSexStringsDOSEnglish[12] = {
+ "HUMAN MALE",
+ "HUMAN FEMALE",
+ "ELF MALE",
+ "ELF FEMALE",
+ "HALF-ELF MALE",
+ "HALF-ELF FEMALE",
+ "DWARF MALE",
+ "DWARF FEMALE",
+ "GNOME MALE",
+ "GNOME FEMALE",
+ "HALFLING MALE",
+ "HALFLING FEMALE"
+};
+
+static const StringListProvider kEoB1ChargenRaceSexStringsDOSEnglishProvider = { ARRAYSIZE(kEoB1ChargenRaceSexStringsDOSEnglish), kEoB1ChargenRaceSexStringsDOSEnglish };
+
+static const char *const kEoB1ChargenClassStringsDOSEnglish[21] = {
+ "FIGHTER",
+ "RANGER",
+ "PALADIN",
+ "MAGE",
+ "CLERIC",
+ "THIEF",
+ "FIGHTER/CLERIC",
+ "FIGHTER/THIEF",
+ "FIGHTER/MAGE",
+ "FIGHTER/MAGE/THIEF",
+ "THIEF/MAGE",
+ "CLERIC/THIEF",
+ "FIGHTER/CLERIC/MAGE",
+ "RANGER/CLERIC",
+ "CLERIC/MAGE",
+ "FIGHTER",
+ "MAGE",
+ "CLERIC",
+ "THIEF",
+ "PALADIN",
+ "RANGER"
+};
+
+static const StringListProvider kEoB1ChargenClassStringsDOSEnglishProvider = { ARRAYSIZE(kEoB1ChargenClassStringsDOSEnglish), kEoB1ChargenClassStringsDOSEnglish };
+
+static const char *const kEoB1ChargenAlignmentStringsDOSEnglish[9] = {
+ "LAWFUL GOOD",
+ "NEUTRAL GOOD",
+ "CHAOTIC GOOD",
+ "LAWFUL NEUTRAL",
+ "TRUE NEUTRAL",
+ "CHAOTIC NEUTRAL",
+ "LAWFUL EVIL",
+ "NEUTRAL EVIL",
+ "CHAOTIC EVIL"
+};
+
+static const StringListProvider kEoB1ChargenAlignmentStringsDOSEnglishProvider = { ARRAYSIZE(kEoB1ChargenAlignmentStringsDOSEnglish), kEoB1ChargenAlignmentStringsDOSEnglish };
+
+static const char *const kEoB1ChargenEnterGameStringsDOSEnglish[1] = {
+ " Entering game.\r Please wait."
+};
+
+static const StringListProvider kEoB1ChargenEnterGameStringsDOSEnglishProvider = { ARRAYSIZE(kEoB1ChargenEnterGameStringsDOSEnglish), kEoB1ChargenEnterGameStringsDOSEnglish };
+
+static const char *const kEoB1MainMenuStringsDOSEnglish[3] = {
+ "LOAD GAME IN PROGRESS\r",
+ "START A NEW PARTY\r",
+ "EXIT TO DOS\r"
+};
+
+static const StringListProvider kEoB1MainMenuStringsDOSEnglishProvider = { ARRAYSIZE(kEoB1MainMenuStringsDOSEnglish), kEoB1MainMenuStringsDOSEnglish };
+
+static const char *const kEoB1BonusStringsDOSEnglish[3] = {
+ "Congratulations on completing all 12 Beholder Bonuses.\r\rThe names of the character in your winning Beholder Bonus party are:\r\r",
+ "\r",
+ "\r\rPassword: %04x\r"
+};
+
+static const StringListProvider kEoB1BonusStringsDOSEnglishProvider = { ARRAYSIZE(kEoB1BonusStringsDOSEnglish), kEoB1BonusStringsDOSEnglish };
+
+static const char *const kEoB1TurnUndeadStringDOSEnglish[1] = {
+ "\x06\x06""%s uses the power to turn undead!""\x06\x0F""\r"
+};
+
+static const StringListProvider kEoB1TurnUndeadStringDOSEnglishProvider = { ARRAYSIZE(kEoB1TurnUndeadStringDOSEnglish), kEoB1TurnUndeadStringDOSEnglish };
+
+static const char *const kEoB1Npc0StringsDOSEnglish[2] = {
+ "\r I wish you luck in your travels.",
+ "Which should be resurrected?"
+};
+
+static const StringListProvider kEoB1Npc0StringsDOSEnglishProvider = { ARRAYSIZE(kEoB1Npc0StringsDOSEnglish), kEoB1Npc0StringsDOSEnglish };
+
+static const char *const kEoB1Npc11StringsDOSEnglish[3] = {
+ "Tend his wounds",
+ "Talk",
+ "Leave"
+};
+
+static const StringListProvider kEoB1Npc11StringsDOSEnglishProvider = { ARRAYSIZE(kEoB1Npc11StringsDOSEnglish), kEoB1Npc11StringsDOSEnglish };
+
+static const char *const kEoB1Npc12StringsDOSEnglish[2] = {
+ "Tend his wounds",
+ "Leave"
+};
+
+static const StringListProvider kEoB1Npc12StringsDOSEnglishProvider = { ARRAYSIZE(kEoB1Npc12StringsDOSEnglish), kEoB1Npc12StringsDOSEnglish };
+
+static const char *const kEoB1Npc21StringsDOSEnglish[2] = {
+ "Hear proposal",
+ "Leave"
+};
+
+static const StringListProvider kEoB1Npc21StringsDOSEnglishProvider = { ARRAYSIZE(kEoB1Npc21StringsDOSEnglish), kEoB1Npc21StringsDOSEnglish };
+
+static const char *const kEoB1Npc22StringsDOSEnglish[2] = {
+ "Help him",
+ "Leave"
+};
+
+static const StringListProvider kEoB1Npc22StringsDOSEnglishProvider = { ARRAYSIZE(kEoB1Npc22StringsDOSEnglish), kEoB1Npc22StringsDOSEnglish };
+
+static const char *const kEoB1Npc31StringsDOSEnglish[2] = {
+ "Heal Party",
+ "Leave"
+};
+
+static const StringListProvider kEoB1Npc31StringsDOSEnglishProvider = { ARRAYSIZE(kEoB1Npc31StringsDOSEnglish), kEoB1Npc31StringsDOSEnglish };
+
+static const char *const kEoB1Npc32StringsDOSEnglish[3] = {
+ "Heal Party",
+ "Resurrect Dead",
+ "Leave"
+};
+
+static const StringListProvider kEoB1Npc32StringsDOSEnglishProvider = { ARRAYSIZE(kEoB1Npc32StringsDOSEnglish), kEoB1Npc32StringsDOSEnglish };
+
+static const char *const kEoB1Npc4StringsDOSEnglish[2] = {
+ "Attack",
+ "Bribe"
+};
+
+static const StringListProvider kEoB1Npc4StringsDOSEnglishProvider = { ARRAYSIZE(kEoB1Npc4StringsDOSEnglish), kEoB1Npc4StringsDOSEnglish };
+
+static const char *const kEoB1Npc5StringsDOSEnglish[3] = {
+ "Kill her",
+ "Hear her out",
+ "Let her go"
+};
+
+static const StringListProvider kEoB1Npc5StringsDOSEnglishProvider = { ARRAYSIZE(kEoB1Npc5StringsDOSEnglish), kEoB1Npc5StringsDOSEnglish };
+
+static const char *const kEoB1Npc6StringsDOSEnglish[2] = {
+ "Surrender",
+ "Attack"
+};
+
+static const StringListProvider kEoB1Npc6StringsDOSEnglishProvider = { ARRAYSIZE(kEoB1Npc6StringsDOSEnglish), kEoB1Npc6StringsDOSEnglish };
+
+static const char *const kEoB1Npc7StringsDOSEnglish[3] = {
+ "Free Him",
+ "Kill Him",
+ "Leave"
+};
+
+static const StringListProvider kEoB1Npc7StringsDOSEnglishProvider = { ARRAYSIZE(kEoB1Npc7StringsDOSEnglish), kEoB1Npc7StringsDOSEnglish };
+
+static const char *const kEoB1PryDoorStringsDOSEnglish[7] = {
+ "Nobody is able to force the door.\r",
+ "The party forces the door.\r",
+ "%s forces the door!\r",
+ "The party tries to force the door and fails.\r",
+ "You can't put that item there.\r",
+ "The item is too large to fit.\r",
+ "No one is able to pry this door open.\r"
+};
+
+static const StringListProvider kEoB1PryDoorStringsDOSEnglishProvider = { ARRAYSIZE(kEoB1PryDoorStringsDOSEnglish), kEoB1PryDoorStringsDOSEnglish };
+
+static const char *const kEoB1WarningStringsDOSEnglish[3] = {
+ "You can't go that way.\r",
+ "%s isn't capable of eating food!\r",
+ "You may only eat food!\r"
+};
+
+static const StringListProvider kEoB1WarningStringsDOSEnglishProvider = { ARRAYSIZE(kEoB1WarningStringsDOSEnglish), kEoB1WarningStringsDOSEnglish };
+
+static const char *const kEoB1ItemSuffixStringsRingsDOSEnglish[4] = {
+ "Adornment",
+ "Wizardry",
+ "Sustenance",
+ "Feather Fall"
+};
+
+static const StringListProvider kEoB1ItemSuffixStringsRingsDOSEnglishProvider = { ARRAYSIZE(kEoB1ItemSuffixStringsRingsDOSEnglish), kEoB1ItemSuffixStringsRingsDOSEnglish };
+
+static const char *const kEoB1ItemSuffixStringsPotionsDOSEnglish[8] = {
+ "Giant Strength",
+ "Healing",
+ "Extra Healing",
+ "Poison",
+ "Vitality",
+ "Speed",
+ "Invisibility",
+ "Cure Poison"
+};
+
+static const StringListProvider kEoB1ItemSuffixStringsPotionsDOSEnglishProvider = { ARRAYSIZE(kEoB1ItemSuffixStringsPotionsDOSEnglish), kEoB1ItemSuffixStringsPotionsDOSEnglish };
+
+static const char *const kEoB1ItemSuffixStringsWandsDOSEnglish[7] = {
+ "Stick",
+ "Lightning",
+ "Frost",
+ "Curing",
+ "Fireball",
+ "Silvias",
+ "Magic Missile"
+};
+
+static const StringListProvider kEoB1ItemSuffixStringsWandsDOSEnglishProvider = { ARRAYSIZE(kEoB1ItemSuffixStringsWandsDOSEnglish), kEoB1ItemSuffixStringsWandsDOSEnglish };
+
+static const char *const kEoB1RipItemStringsDOSEnglish[3] = {
+ "%s has lost her ",
+ "%s has lost his ",
+ ".\r"
+};
+
+static const StringListProvider kEoB1RipItemStringsDOSEnglishProvider = { ARRAYSIZE(kEoB1RipItemStringsDOSEnglish), kEoB1RipItemStringsDOSEnglish };
+
+static const char *const kEoB1CursedStringDOSEnglish[1] = {
+ "Cursed %s %d"
+};
+
+static const StringListProvider kEoB1CursedStringDOSEnglishProvider = { ARRAYSIZE(kEoB1CursedStringDOSEnglish), kEoB1CursedStringDOSEnglish };
+
+static const char *const kEoB1MagicObjectStringsDOSEnglish[5] = {
+ "Mage Scroll",
+ "Cleric Scroll",
+ "Ring",
+ "Potion",
+ "Wand"
+};
+
+static const StringListProvider kEoB1MagicObjectStringsDOSEnglishProvider = { ARRAYSIZE(kEoB1MagicObjectStringsDOSEnglish), kEoB1MagicObjectStringsDOSEnglish };
+
+static const char *const kEoB1MagicObjectString5DOSEnglish[1] = {
+ "Stick"
+};
+
+static const StringListProvider kEoB1MagicObjectString5DOSEnglishProvider = { ARRAYSIZE(kEoB1MagicObjectString5DOSEnglish), kEoB1MagicObjectString5DOSEnglish };
+
+static const char *const kEoB1PatternSuffixDOSEnglish[1] = {
+ "%s of %s"
+};
+
+static const StringListProvider kEoB1PatternSuffixDOSEnglishProvider = { ARRAYSIZE(kEoB1PatternSuffixDOSEnglish), kEoB1PatternSuffixDOSEnglish };
+
+static const char *const kEoB1PatternGrFix1DOSEnglish[1] = {
+ "%s of %s"
+};
+
+static const StringListProvider kEoB1PatternGrFix1DOSEnglishProvider = { ARRAYSIZE(kEoB1PatternGrFix1DOSEnglish), kEoB1PatternGrFix1DOSEnglish };
+
+static const char *const kEoB1PatternGrFix2DOSEnglish[1] = {
+ "%s of %s"
+};
+
+static const StringListProvider kEoB1PatternGrFix2DOSEnglishProvider = { ARRAYSIZE(kEoB1PatternGrFix2DOSEnglish), kEoB1PatternGrFix2DOSEnglish };
+
+static const char *const kEoB1ValidateArmorStringDOSEnglish[1] = {
+ "%s can't wear that type of armor.\r"
+};
+
+static const StringListProvider kEoB1ValidateArmorStringDOSEnglishProvider = { ARRAYSIZE(kEoB1ValidateArmorStringDOSEnglish), kEoB1ValidateArmorStringDOSEnglish };
+
+static const char *const kEoB1ValidateNoDropStringDOSEnglish[1] = {
+ "You cant put that item there.\r"
+};
+
+static const StringListProvider kEoB1ValidateNoDropStringDOSEnglishProvider = { ARRAYSIZE(kEoB1ValidateNoDropStringDOSEnglish), kEoB1ValidateNoDropStringDOSEnglish };
+
+static const char *const kEoB1PotionStringsDOSEnglish[2] = {
+ "poisoned",
+ "%s feels %s!\r"
+};
+
+static const StringListProvider kEoB1PotionStringsDOSEnglishProvider = { ARRAYSIZE(kEoB1PotionStringsDOSEnglish), kEoB1PotionStringsDOSEnglish };
+
+static const char *const kEoB1WandStringsDOSEnglish[2] = {
+ "The wand has no apparent magical effect\r",
+ "no effect.\r"
+};
+
+static const StringListProvider kEoB1WandStringsDOSEnglishProvider = { ARRAYSIZE(kEoB1WandStringsDOSEnglish), kEoB1WandStringsDOSEnglish };
+
+static const char *const kEoB1ItemMisuseStringsDOSEnglish[3] = {
+ " can not use this item.\r",
+ "This item automatically used when worn.\r",
+ "This item is not used in this way.\r"
+};
+
+static const StringListProvider kEoB1ItemMisuseStringsDOSEnglishProvider = { ARRAYSIZE(kEoB1ItemMisuseStringsDOSEnglish), kEoB1ItemMisuseStringsDOSEnglish };
+
+static const char *const kEoB1TakenStringsDOSEnglish[1] = {
+ " taken.\r"
+};
+
+static const StringListProvider kEoB1TakenStringsDOSEnglishProvider = { ARRAYSIZE(kEoB1TakenStringsDOSEnglish), kEoB1TakenStringsDOSEnglish };
+
+static const char *const kEoB1PotionEffectStringsDOSEnglish[8] = {
+ "much stronger",
+ "better",
+ "much better",
+ "ill for a moment",
+ "no longer hungry",
+ "fast and agile",
+ "transparent",
+ "better"
+};
+
+static const StringListProvider kEoB1PotionEffectStringsDOSEnglishProvider = { ARRAYSIZE(kEoB1PotionEffectStringsDOSEnglish), kEoB1PotionEffectStringsDOSEnglish };
+
+static const char *const kEoB1YesNoStringsDOSEnglish[2] = {
+ "yes",
+ "no"
+};
+
+static const StringListProvider kEoB1YesNoStringsDOSEnglishProvider = { ARRAYSIZE(kEoB1YesNoStringsDOSEnglish), kEoB1YesNoStringsDOSEnglish };
+
+static const char *const kEoB1MoreStringsDOSEnglish[1] = {
+ "MORE"
+};
+
+static const StringListProvider kEoB1MoreStringsDOSEnglishProvider = { ARRAYSIZE(kEoB1MoreStringsDOSEnglish), kEoB1MoreStringsDOSEnglish };
+
+static const char *const kEoB1NpcMaxStringsDOSEnglish[1] = {
+ "You may only have six characters in your party. Select the one you wish to drop."
+};
+
+static const StringListProvider kEoB1NpcMaxStringsDOSEnglishProvider = { ARRAYSIZE(kEoB1NpcMaxStringsDOSEnglish), kEoB1NpcMaxStringsDOSEnglish };
+
+static const char *const kEoB1NpcJoinStringsDOSEnglish[1] = {
+ "%s joins the party.\r"
+};
+
+static const StringListProvider kEoB1NpcJoinStringsDOSEnglishProvider = { ARRAYSIZE(kEoB1NpcJoinStringsDOSEnglish), kEoB1NpcJoinStringsDOSEnglish };
+
+static const char *const kEoB1CancelStringsDOSEnglish[1] = {
+ "CANCEL"
+};
+
+static const StringListProvider kEoB1CancelStringsDOSEnglishProvider = { ARRAYSIZE(kEoB1CancelStringsDOSEnglish), kEoB1CancelStringsDOSEnglish };
+
+static const char *const kEoB1MenuStringsMainDOSEnglish[8] = {
+ "Select Option:",
+ "Rest Party",
+ "Memorize Spells",
+ "Pray for Spells",
+ "Scribe Scrolls",
+ "Preferences",
+ "Game Options",
+ "Exit"
+};
+
+static const StringListProvider kEoB1MenuStringsMainDOSEnglishProvider = { ARRAYSIZE(kEoB1MenuStringsMainDOSEnglish), kEoB1MenuStringsMainDOSEnglish };
+
+static const char *const kEoB1MenuStringsSaveLoadDOSEnglish[8] = {
+ "Load Game",
+ "Save Game",
+ "Drop Character",
+ "Quit Game",
+ "Game Options:",
+ "\r Game saved.",
+ "\r Save game\r failure!",
+ "\r Load game\r failure!"
+};
+
+static const StringListProvider kEoB1MenuStringsSaveLoadDOSEnglishProvider = { ARRAYSIZE(kEoB1MenuStringsSaveLoadDOSEnglish), kEoB1MenuStringsSaveLoadDOSEnglish };
+
+static const char *const kEoB1MenuStringsOnOffDOSEnglish[2] = {
+ "ON",
+ "OFF"
+};
+
+static const StringListProvider kEoB1MenuStringsOnOffDOSEnglishProvider = { ARRAYSIZE(kEoB1MenuStringsOnOffDOSEnglish), kEoB1MenuStringsOnOffDOSEnglish };
+
+static const char *const kEoB1MenuStringsSpellsDOSEnglish[17] = {
+ "\r\r Select a character\r from your party who\r would like to learn\r spells.",
+ "\r Your Paladin is \r too low a level\r for spells.",
+ "\r\r The Mage has no\r Spell Book!",
+ "\r\r\r Select a character\r from your party\r who would like to\r pray for spells.",
+ "\r You don't have\r any Cleric able\r to pray in your\r party.",
+ "\r You don't have\r any Mage able to\r learn spells.",
+ " An unconscious\r or dead Mage\r cannot memorize\r spells.",
+ " An unconscious\r or dead Cleric\r cannot pray for\r spells.",
+ "1",
+ "2",
+ "3",
+ "4",
+ "5",
+ "Clear",
+ "Spells Available:",
+ "Yes",
+ "No"
+};
+
+static const StringListProvider kEoB1MenuStringsSpellsDOSEnglishProvider = { ARRAYSIZE(kEoB1MenuStringsSpellsDOSEnglish), kEoB1MenuStringsSpellsDOSEnglish };
+
+static const char *const kEoB1MenuStringsRestDOSEnglish[5] = {
+ "\rWill your healers\rheal the party?",
+ " Someone is still\r injured. Rest\r until healed?",
+ "Resting party.",
+ "\r All characters\r are fully\r rested.",
+ " Your party needs\r to rest to gain\r spells."
+};
+
+static const StringListProvider kEoB1MenuStringsRestDOSEnglishProvider = { ARRAYSIZE(kEoB1MenuStringsRestDOSEnglish), kEoB1MenuStringsRestDOSEnglish };
+
+static const char *const kEoB1MenuStringsDropDOSEnglish[1] = {
+ " You cannot have\r less than four\r characters."
+};
+
+static const StringListProvider kEoB1MenuStringsDropDOSEnglishProvider = { ARRAYSIZE(kEoB1MenuStringsDropDOSEnglish), kEoB1MenuStringsDropDOSEnglish };
+
+static const char *const kEoB1MenuStringsExitDOSEnglish[1] = {
+ " Are you sure you\r wish to exit the\r game?"
+};
+
+static const StringListProvider kEoB1MenuStringsExitDOSEnglishProvider = { ARRAYSIZE(kEoB1MenuStringsExitDOSEnglish), kEoB1MenuStringsExitDOSEnglish };
+
+static const char *const kEoB1MenuStringsStarveDOSEnglish[1] = {
+ " Your party is\r starving. Do you\r wish to continue\r resting?"
+};
+
+static const StringListProvider kEoB1MenuStringsStarveDOSEnglishProvider = { ARRAYSIZE(kEoB1MenuStringsStarveDOSEnglish), kEoB1MenuStringsStarveDOSEnglish };
+
+static const char *const kEoB1MenuStringsScribeDOSEnglish[5] = {
+ "Select the scroll(s)\ryou wish to scribe.",
+ "\r\r\r Select a Mage\r from your party\r who would like to\r scribe spells.",
+ " You don't have\r any scolls to be\r scribed.",
+ " You don't have\r any scrolls that\r this Mage needs.",
+ "\r You don't have\r any Mage able to\r scribe scrolls."
+};
+
+static const StringListProvider kEoB1MenuStringsScribeDOSEnglishProvider = { ARRAYSIZE(kEoB1MenuStringsScribeDOSEnglish), kEoB1MenuStringsScribeDOSEnglish };
+
+static const char *const kEoB1MenuStringsDrop2DOSEnglish[3] = {
+ " Select the\r character you\r wish to drop.",
+ " Are you sure you\r wish to SAVE the\r game?",
+ " Are you sure you\r wish to LOAD a\r saved game?"
+};
+
+static const StringListProvider kEoB1MenuStringsDrop2DOSEnglishProvider = { ARRAYSIZE(kEoB1MenuStringsDrop2DOSEnglish), kEoB1MenuStringsDrop2DOSEnglish };
+
+static const char *const kEoB1MenuStringsHeadDOSEnglish[3] = {
+ "Camp:",
+ "Preferences:",
+ "Game Options:"
+};
+
+static const StringListProvider kEoB1MenuStringsHeadDOSEnglishProvider = { ARRAYSIZE(kEoB1MenuStringsHeadDOSEnglish), kEoB1MenuStringsHeadDOSEnglish };
+
+static const char *const kEoB1MenuStringsPoisonDOSEnglish[1] = {
+ "Poisoned party\rmembers will die!\rRest anyway?"
+};
+
+static const StringListProvider kEoB1MenuStringsPoisonDOSEnglishProvider = { ARRAYSIZE(kEoB1MenuStringsPoisonDOSEnglish), kEoB1MenuStringsPoisonDOSEnglish };
+
+static const char *const kEoB1MenuStringsMgcDOSEnglish[2] = {
+ "%-18s %1d",
+ "%d of %d Remaining. "
+};
+
+static const StringListProvider kEoB1MenuStringsMgcDOSEnglishProvider = { ARRAYSIZE(kEoB1MenuStringsMgcDOSEnglish), kEoB1MenuStringsMgcDOSEnglish };
+
+static const char *const kEoB1MenuStringsPrefsDOSEnglish[4] = {
+ "Tunes are %-3s",
+ "Sounds are %-3s",
+ "Bar Graphs are %-3s",
+ "Mouse is %-3s"
+};
+
+static const StringListProvider kEoB1MenuStringsPrefsDOSEnglishProvider = { ARRAYSIZE(kEoB1MenuStringsPrefsDOSEnglish), kEoB1MenuStringsPrefsDOSEnglish };
+
+static const char *const kEoB1MenuStringsRest2DOSEnglish[4] = {
+ "%s gained %s.\r",
+ "%s memorized %s.\r",
+ "%s casts healing on %s.\r",
+ "Hours rested: %-4d"
+};
+
+static const StringListProvider kEoB1MenuStringsRest2DOSEnglishProvider = { ARRAYSIZE(kEoB1MenuStringsRest2DOSEnglish), kEoB1MenuStringsRest2DOSEnglish };
+
+static const char *const kEoB1MenuStringsRest4DOSEnglish[1] = {
+ "\rYou can't rest here, monsters are near."
+};
+
+static const StringListProvider kEoB1MenuStringsRest4DOSEnglishProvider = { ARRAYSIZE(kEoB1MenuStringsRest4DOSEnglish), kEoB1MenuStringsRest4DOSEnglish };
+
+static const char *const kEoB1MenuStringsDefeatDOSEnglish[1] = {
+ "All of your party has been defeated. The minions of evil will be able to carry out their plans unhindered!\r"
+};
+
+static const StringListProvider kEoB1MenuStringsDefeatDOSEnglishProvider = { ARRAYSIZE(kEoB1MenuStringsDefeatDOSEnglish), kEoB1MenuStringsDefeatDOSEnglish };
+
+static const char *const kEoB1MenuYesNoStringsDOSEnglish[2] = {
+ "Yes",
+ "No"
+};
+
+static const StringListProvider kEoB1MenuYesNoStringsDOSEnglishProvider = { ARRAYSIZE(kEoB1MenuYesNoStringsDOSEnglish), kEoB1MenuYesNoStringsDOSEnglish };
+
+static const char *const kEoB1CharGuiStringsHpDOSEnglish[2] = {
+ "HP",
+ "%3d of %-3d"
+};
+
+static const StringListProvider kEoB1CharGuiStringsHpDOSEnglishProvider = { ARRAYSIZE(kEoB1CharGuiStringsHpDOSEnglish), kEoB1CharGuiStringsHpDOSEnglish };
+
+static const char *const kEoB1CharGuiStringsWp1DOSEnglish[2] = {
+ "MISS",
+ "HACK"
+};
+
+static const StringListProvider kEoB1CharGuiStringsWp1DOSEnglishProvider = { ARRAYSIZE(kEoB1CharGuiStringsWp1DOSEnglish), kEoB1CharGuiStringsWp1DOSEnglish };
+
+static const char *const kEoB1CharGuiStringsWrDOSEnglish[4] = {
+ "CAN'T",
+ "REACH",
+ "NO",
+ "AMMO"
+};
+
+static const StringListProvider kEoB1CharGuiStringsWrDOSEnglishProvider = { ARRAYSIZE(kEoB1CharGuiStringsWrDOSEnglish), kEoB1CharGuiStringsWrDOSEnglish };
+
+static const char *const kEoB1CharGuiStringsSt1DOSEnglish[6] = {
+ "Swapping",
+ "DEAD",
+ "UNCONSCIOUS",
+ "POISON (SLOW)",
+ "POISONED",
+ "PARALYZED"
+};
+
+static const StringListProvider kEoB1CharGuiStringsSt1DOSEnglishProvider = { ARRAYSIZE(kEoB1CharGuiStringsSt1DOSEnglish), kEoB1CharGuiStringsSt1DOSEnglish };
+
+static const char *const kEoB1CharGuiStringsInDOSEnglish[4] = {
+ "CHARACTER INFO",
+ "ARMOR CLASS",
+ "EXP",
+ "LVL"
+};
+
+static const StringListProvider kEoB1CharGuiStringsInDOSEnglishProvider = { ARRAYSIZE(kEoB1CharGuiStringsInDOSEnglish), kEoB1CharGuiStringsInDOSEnglish };
+
+static const char *const kEoB1CharStatusStrings7DOSEnglish[1] = {
+ "%s no longer has giant strength.\r"
+};
+
+static const StringListProvider kEoB1CharStatusStrings7DOSEnglishProvider = { ARRAYSIZE(kEoB1CharStatusStrings7DOSEnglish), kEoB1CharStatusStrings7DOSEnglish };
+
+static const char *const kEoB1CharStatusStrings81DOSEnglish[1] = {
+ "%s feels the effects of poison!\r"
+};
+
+static const StringListProvider kEoB1CharStatusStrings81DOSEnglishProvider = { ARRAYSIZE(kEoB1CharStatusStrings81DOSEnglish), kEoB1CharStatusStrings81DOSEnglish };
+
+static const char *const kEoB1CharStatusStrings9DOSEnglish[1] = {
+ "%s is no longer paralyzed!\r"
+};
+
+static const StringListProvider kEoB1CharStatusStrings9DOSEnglishProvider = { ARRAYSIZE(kEoB1CharStatusStrings9DOSEnglish), kEoB1CharStatusStrings9DOSEnglish };
+
+static const char *const kEoB1CharStatusStrings131DOSEnglish[1] = {
+ "%s is %s!\r"
+};
+
+static const StringListProvider kEoB1CharStatusStrings131DOSEnglishProvider = { ARRAYSIZE(kEoB1CharStatusStrings131DOSEnglish), kEoB1CharStatusStrings131DOSEnglish };
+
+static const char *const kEoB1LevelGainStringsDOSEnglish[1] = {
+ "\x06\x01""%s has gained a level of experience.""\x06\x0F""\r"
+};
+
+static const StringListProvider kEoB1LevelGainStringsDOSEnglishProvider = { ARRAYSIZE(kEoB1LevelGainStringsDOSEnglish), kEoB1LevelGainStringsDOSEnglish };
+
+static const char *const kEoB1BookNumbersDOSEnglish[5] = {
+ "First",
+ "Second",
+ "Third",
+ "Fourth",
+ "Fifth"
+};
+
+static const StringListProvider kEoB1BookNumbersDOSEnglishProvider = { ARRAYSIZE(kEoB1BookNumbersDOSEnglish), kEoB1BookNumbersDOSEnglish };
+
+static const char *const kEoB1MageSpellsListDOSEnglish[26] = {
+ "",
+ "Armor",
+ "Burning Hands",
+ "Detect Magic",
+ "Magic Missile",
+ "Read Magic",
+ "Shield",
+ "Shocking Grasp",
+ "Invisibility",
+ "Knock",
+ "M's Acid Arrow",
+ "Stinking Cloud",
+ "Dispel Magic",
+ "Fireball",
+ "Flame Arrow",
+ "Haste",
+ "Hold Person",
+ "Invisibility 10'",
+ "Lightning Bolt",
+ "Vampiric Touch",
+ "Fear",
+ "Ice Storm",
+ "Stoneskin",
+ "Cloudkill",
+ "Cone of Cold",
+ "Hold Monster"
+};
+
+static const StringListProvider kEoB1MageSpellsListDOSEnglishProvider = { ARRAYSIZE(kEoB1MageSpellsListDOSEnglish), kEoB1MageSpellsListDOSEnglish };
+
+static const char *const kEoB1ClericSpellsListDOSEnglish[25] = {
+ "",
+ "Bless",
+ "Cure Light Wnds",
+ "Cause Light Wnds",
+ "Detect Magic",
+ "Protect-Evil",
+ "Aid",
+ "Flame Blade",
+ "Hold Person",
+ "Slow Poison",
+ "Create Food",
+ "Dispel Magic",
+ "Magical Vestment",
+ "Prayer",
+ "Remove Paralysis",
+ "Cure Serious",
+ "Cause Serious",
+ "Neutral-Poison",
+ "Protect-Evil 10'",
+ "Protect-Lightning",
+ "Cure Critical",
+ "Cause Critical",
+ "Flame Strike",
+ "Raise Dead",
+ "Lay on Hands"
+};
+
+static const StringListProvider kEoB1ClericSpellsListDOSEnglishProvider = { ARRAYSIZE(kEoB1ClericSpellsListDOSEnglish), kEoB1ClericSpellsListDOSEnglish };
+
+static const char *const kEoB1SpellNamesDOSEnglish[51] = {
+ "",
+ "armor",
+ "burning hands",
+ "detect magic",
+ "magic missile",
+ "shield",
+ "shocking grasp",
+ "invisibility",
+ "melf's acid arrow",
+ "stinking cloud",
+ "dispel magic",
+ "fireball",
+ "flame arrow",
+ "haste",
+ "hold person",
+ "invisibility 10' radius",
+ "lightning bolt",
+ "vampiric touch",
+ "fear",
+ "ice storm",
+ "stoneskin",
+ "cloudkill",
+ "cone of cold",
+ "hold monster",
+ "bless",
+ "cure light wounds",
+ "cause light wounds",
+ "detect magic",
+ "protection from evil",
+ "aid",
+ "flame blade",
+ "hold person",
+ "slow poison",
+ "create food",
+ "dispel magic",
+ "magical vestment",
+ "prayer",
+ "remove paralysis",
+ "cure serious wounds",
+ "cause serious wounds",
+ "neutralize poison",
+ "protection from evil 10' radius",
+ "protection from lightning",
+ "cure critical wounds",
+ "cause critical wounds",
+ "flame strike",
+ "raise dead",
+ "lay on hands",
+ "",
+ "",
+ ""
+};
+
+static const StringListProvider kEoB1SpellNamesDOSEnglishProvider = { ARRAYSIZE(kEoB1SpellNamesDOSEnglish), kEoB1SpellNamesDOSEnglish };
+
+static const char *const kEoB1MagicStrings1DOSEnglish[6] = {
+ "ABORT SPELL",
+ "ABORT SPELL",
+ "You must have a free hand for this spell.\r",
+ "You can't have two of this spell type active.\r",
+ "%s casts %s.\r",
+ "ok\r"
+};
+
+static const StringListProvider kEoB1MagicStrings1DOSEnglishProvider = { ARRAYSIZE(kEoB1MagicStrings1DOSEnglish), kEoB1MagicStrings1DOSEnglish };
+
+static const char *const kEoB1MagicStrings2DOSEnglish[3] = {
+ "no effect\r",
+ "%s has been disintegrated!\r",
+ "The party has been hit by a death spell!\r"
+};
+
+static const StringListProvider kEoB1MagicStrings2DOSEnglishProvider = { ARRAYSIZE(kEoB1MagicStrings2DOSEnglish), kEoB1MagicStrings2DOSEnglish };
+
+static const char *const kEoB1MagicStrings3DOSEnglish[6] = {
+ "Cast spell on which character? ",
+ "\rok\r",
+ "\rSpell aborted.\r",
+ "%s's %s spell expires.\r",
+ "%s missed the monster.\r",
+ "%s must be in the front ranks to hit!\r"
+};
+
+static const StringListProvider kEoB1MagicStrings3DOSEnglishProvider = { ARRAYSIZE(kEoB1MagicStrings3DOSEnglish), kEoB1MagicStrings3DOSEnglish };
+
+static const char *const kEoB1MagicStrings4DOSEnglish[1] = {
+ "no effect.\r"
+};
+
+static const StringListProvider kEoB1MagicStrings4DOSEnglishProvider = { ARRAYSIZE(kEoB1MagicStrings4DOSEnglish), kEoB1MagicStrings4DOSEnglish };
+
+static const char *const kEoB1MagicStrings6DOSEnglish[1] = {
+ "%s already has a high base armor class.\r"
+};
+
+static const StringListProvider kEoB1MagicStrings6DOSEnglishProvider = { ARRAYSIZE(kEoB1MagicStrings6DOSEnglish), kEoB1MagicStrings6DOSEnglish };
+
+static const char *const kEoB1MagicStrings7DOSEnglish[5] = {
+ "1ST",
+ "2ND",
+ "3RD",
+ "4TH",
+ "5TH"
+};
+
+static const StringListProvider kEoB1MagicStrings7DOSEnglishProvider = { ARRAYSIZE(kEoB1MagicStrings7DOSEnglish), kEoB1MagicStrings7DOSEnglish };
+
+static const char *const kEoB1MagicStrings8DOSEnglish[3] = {
+ "All spells on %s are dispelled.\r",
+ "The party is already blessed!\r",
+ "The aid spell fails!\r"
+};
+
+static const StringListProvider kEoB1MagicStrings8DOSEnglishProvider = { ARRAYSIZE(kEoB1MagicStrings8DOSEnglish), kEoB1MagicStrings8DOSEnglish };
+
+static const byte kEoB1ManDefDOSEnglish[120] = {
+ 0x09, 0x0A, 0x02, 0x00, 0x09, 0x04, 0x03, 0x00,
+ 0x09, 0x06, 0x06, 0x00, 0x09, 0x03, 0x03, 0x00,
+ 0x09, 0x04, 0x02, 0x00, 0x09, 0x01, 0x02, 0x00,
+ 0x09, 0x05, 0x01, 0x00, 0x09, 0x09, 0x02, 0x00,
+ 0x09, 0x06, 0x02, 0x00, 0x23, 0x01, 0x05, 0x00,
+ 0x23, 0x02, 0x02, 0x00, 0x23, 0x03, 0x06, 0x00,
+ 0x23, 0x05, 0x01, 0x00, 0x23, 0x06, 0x03, 0x00,
+ 0x23, 0x07, 0x01, 0x00, 0x1A, 0x01, 0x01, 0x00,
+ 0x1A, 0x03, 0x02, 0x00, 0x1A, 0x06, 0x01, 0x00,
+ 0x24, 0x01, 0x03, 0x00, 0x24, 0x03, 0x04, 0x00,
+ 0x24, 0x03, 0x01, 0x00, 0x02, 0x04, 0x03, 0x00,
+ 0x02, 0x03, 0x03, 0x00, 0x02, 0x05, 0x03, 0x00,
+ 0x01, 0x01, 0x01, 0x00, 0x01, 0x05, 0x03, 0x00,
+ 0x01, 0x04, 0x03, 0x00, 0x0C, 0x02, 0x01, 0x00,
+ 0x0C, 0x03, 0x03, 0x00, 0x0C, 0x04, 0x02, 0x00
+};
+
+static const ByteProvider kEoB1ManDefDOSEnglishProvider = { ARRAYSIZE(kEoB1ManDefDOSEnglish), kEoB1ManDefDOSEnglish };
+
+static const char *const kEoB1ManWordDOSEnglish[31] = {
+ "attacks",
+ "short",
+ "line",
+ "weapons",
+ "certain",
+ "rank",
+ "rear",
+ "can",
+ "away",
+ "dungeon",
+ "cursor",
+ "feature",
+ "information",
+ "displayed",
+ "below",
+ "around",
+ "carefree",
+ "gnomes",
+ "clerics",
+ "mystic",
+ "pummel",
+ "fitness",
+ "using",
+ "toughness",
+ "wealth",
+ "wizard",
+ "officials",
+ "hound",
+ "disturbing",
+ "flaming",
+ ""
+};
+
+static const StringListProvider kEoB1ManWordDOSEnglishProvider = { ARRAYSIZE(kEoB1ManWordDOSEnglish), kEoB1ManWordDOSEnglish };
+
+static const char *const kEoB1ManPromptDOSEnglish[1] = {
+ "\r\r\r\rOn the page with this symbol...\r\rFind line %d\rEnter word %d\r"
+};
+
+static const StringListProvider kEoB1ManPromptDOSEnglishProvider = { ARRAYSIZE(kEoB1ManPromptDOSEnglish), kEoB1ManPromptDOSEnglish };
+
+static const char *const kEoB1MonsterDistAttStringsDOSEnglish[5] = {
+ "%s is hit by a cause serious wounds spell!\r",
+ "The party is hit with a psychic mind blast!\r",
+ "paralyzed",
+ "poisoned",
+ "paralyzed"
+};
+
+static const StringListProvider kEoB1MonsterDistAttStringsDOSEnglishProvider = { ARRAYSIZE(kEoB1MonsterDistAttStringsDOSEnglish), kEoB1MonsterDistAttStringsDOSEnglish };
+
diff --git a/devtools/create_kyradat/resources/eob1_dos_german.h b/devtools/create_kyradat/resources/eob1_dos_german.h
new file mode 100644
index 0000000000..ba2e4876c8
--- /dev/null
+++ b/devtools/create_kyradat/resources/eob1_dos_german.h
@@ -0,0 +1,893 @@
+static const char *const kEoB1ChargenStrings1DOSGerman[9] = {
+ "Ihr Team ist\rkomplett. SPIEL-\rKnopf oder 'P'\rdruecken, um zu\rbeginnen.",
+ " ",
+ "RK\rHP\rEBN",
+ "%s\r%d\r%d\r%d\r%d\r%d",
+ "%d\r%d",
+ "%d",
+ "%d/%d",
+ "%d/%d/%d",
+ "Waehle das Feld\rdes Charakters\rzum erstellen oder\ranschauen."
+};
+
+static const StringListProvider kEoB1ChargenStrings1DOSGermanProvider = { ARRAYSIZE(kEoB1ChargenStrings1DOSGerman), kEoB1ChargenStrings1DOSGerman };
+
+static const char *const kEoB1ChargenStrings2DOSGerman[12] = {
+ "%s",
+ "%d",
+ "%s",
+ "%d",
+ "%d",
+ "%d",
+ "%s",
+ "%d",
+ "WAEHLE RASSE:",
+ "WAEHLE KLASSE:",
+ "GESINNUNG WAEHLEN:",
+ "Name:"
+};
+
+static const StringListProvider kEoB1ChargenStrings2DOSGermanProvider = { ARRAYSIZE(kEoB1ChargenStrings2DOSGerman), kEoB1ChargenStrings2DOSGerman };
+
+static const char *const kEoB1ChargenStatStringsDOSGerman[12] = {
+ "STR",
+ "INT",
+ "WEI",
+ "GEW",
+ "KON",
+ "CHA",
+ "STAERKE",
+ "INTELLIGENZ",
+ "WEISHEIT",
+ "GEWANDHEIT",
+ "KONSTITUTION",
+ "CHARISMA"
+};
+
+static const StringListProvider kEoB1ChargenStatStringsDOSGermanProvider = { ARRAYSIZE(kEoB1ChargenStatStringsDOSGerman), kEoB1ChargenStatStringsDOSGerman };
+
+static const char *const kEoB1ChargenRaceSexStringsDOSGerman[12] = {
+ "MENSCH MAENNL.",
+ "MENSCH WEIBL.",
+ "ELF MAENNL.",
+ "ELF WEIBL.",
+ "HALB-ELF MAENNL.",
+ "HALB-ELF WEIBL.",
+ "ZWERG MAENNL.",
+ "ZWERG WEIBL.",
+ "GNOM MAENNL.",
+ "GNOM WEIBL.",
+ "HALBLING MAENNL.",
+ "HALBLING WEIBL."
+};
+
+static const StringListProvider kEoB1ChargenRaceSexStringsDOSGermanProvider = { ARRAYSIZE(kEoB1ChargenRaceSexStringsDOSGerman), kEoB1ChargenRaceSexStringsDOSGerman };
+
+static const char *const kEoB1ChargenClassStringsDOSGerman[21] = {
+ "KAEMPFER",
+ "WALDLAEUFER",
+ "PALADIN",
+ "MAGIER",
+ "KLERIKER",
+ "DIEB",
+ "KAEMPFER/KLERIKER",
+ "KAEMPFER/DIEB",
+ "KAEMPFER/MAGIER",
+ "KAEMPF./MAGIER/DIEB",
+ "DIEB/MAGIER",
+ "KLERIKER/DIEB",
+ "KAEMPF./KLE./MAGIER",
+ "WALDLAEUF./KLERIKER",
+ "KLERIKER/MAGIER",
+ "KAEMPFER",
+ "MAGIER",
+ "KLERIKER",
+ "DIEB",
+ "PALADIN",
+ "WALDLAEUFER"
+};
+
+static const StringListProvider kEoB1ChargenClassStringsDOSGermanProvider = { ARRAYSIZE(kEoB1ChargenClassStringsDOSGerman), kEoB1ChargenClassStringsDOSGerman };
+
+static const char *const kEoB1ChargenAlignmentStringsDOSGerman[9] = {
+ "RECHTSCH. GUT",
+ "NEUTRAL GUT",
+ "CHAOTISCH GUT",
+ "RECHTSCH. NEUTRAL",
+ "ABSOLUT NEUTRAL",
+ "CHAOTISCH NEUTRAL",
+ "RECHTSCH. BOESE",
+ "NEUTRAL BOESE",
+ "CHAOTISCH BOESE"
+};
+
+static const StringListProvider kEoB1ChargenAlignmentStringsDOSGermanProvider = { ARRAYSIZE(kEoB1ChargenAlignmentStringsDOSGerman), kEoB1ChargenAlignmentStringsDOSGerman };
+
+static const char *const kEoB1ChargenEnterGameStringsDOSGerman[1] = {
+ " Spiel startet.\r Bitte warten."
+};
+
+static const StringListProvider kEoB1ChargenEnterGameStringsDOSGermanProvider = { ARRAYSIZE(kEoB1ChargenEnterGameStringsDOSGerman), kEoB1ChargenEnterGameStringsDOSGerman };
+
+static const char *const kEoB1MainMenuStringsDOSGerman[3] = {
+ "ALTES SPIEL LADEN\r",
+ "NEUES TEAM AUFBAUEN\r",
+ "ENDE > DOS\r"
+};
+
+static const StringListProvider kEoB1MainMenuStringsDOSGermanProvider = { ARRAYSIZE(kEoB1MainMenuStringsDOSGerman), kEoB1MainMenuStringsDOSGerman };
+
+static const char *const kEoB1BonusStringsDOSGerman[3] = {
+ "Herzlichen Glueckwunsch fuer das Auffinden aller 12 Beholder-Boni.\r\rDie beteiligten Charaktere des gluecklichen Teams waren:\r\r",
+ "\r",
+ "\r\rPasswort: %04x\r"
+};
+
+static const StringListProvider kEoB1BonusStringsDOSGermanProvider = { ARRAYSIZE(kEoB1BonusStringsDOSGerman), kEoB1BonusStringsDOSGerman };
+
+static const char *const kEoB1TurnUndeadStringDOSGerman[1] = {
+ "\x06\x06""%s benutzt Magie, um Untote zu vertreiben!""\x06\x0F""\r"
+};
+
+static const StringListProvider kEoB1TurnUndeadStringDOSGermanProvider = { ARRAYSIZE(kEoB1TurnUndeadStringDOSGerman), kEoB1TurnUndeadStringDOSGerman };
+
+static const char *const kEoB1Npc0StringsDOSGerman[2] = {
+ "\r Ich wuensche Euch Glueck auf Euren Reisen.",
+ "Wer soll wiedererweckt werden?"
+};
+
+static const StringListProvider kEoB1Npc0StringsDOSGermanProvider = { ARRAYSIZE(kEoB1Npc0StringsDOSGerman), kEoB1Npc0StringsDOSGerman };
+
+static const char *const kEoB1Npc11StringsDOSGerman[3] = {
+ "Wunden heilen",
+ "Reden",
+ "Gehen"
+};
+
+static const StringListProvider kEoB1Npc11StringsDOSGermanProvider = { ARRAYSIZE(kEoB1Npc11StringsDOSGerman), kEoB1Npc11StringsDOSGerman };
+
+static const char *const kEoB1Npc12StringsDOSGerman[2] = {
+ "Wunden heilen",
+ "Gehen"
+};
+
+static const StringListProvider kEoB1Npc12StringsDOSGermanProvider = { ARRAYSIZE(kEoB1Npc12StringsDOSGerman), kEoB1Npc12StringsDOSGerman };
+
+static const char *const kEoB1Npc21StringsDOSGerman[2] = {
+ "Angebot hoeren",
+ "Gehen"
+};
+
+static const StringListProvider kEoB1Npc21StringsDOSGermanProvider = { ARRAYSIZE(kEoB1Npc21StringsDOSGerman), kEoB1Npc21StringsDOSGerman };
+
+static const char *const kEoB1Npc22StringsDOSGerman[2] = {
+ "Helfen",
+ "Gehen"
+};
+
+static const StringListProvider kEoB1Npc22StringsDOSGermanProvider = { ARRAYSIZE(kEoB1Npc22StringsDOSGerman), kEoB1Npc22StringsDOSGerman };
+
+static const char *const kEoB1Npc31StringsDOSGerman[2] = {
+ "Team heilen",
+ "Gehen"
+};
+
+static const StringListProvider kEoB1Npc31StringsDOSGermanProvider = { ARRAYSIZE(kEoB1Npc31StringsDOSGerman), kEoB1Npc31StringsDOSGerman };
+
+static const char *const kEoB1Npc32StringsDOSGerman[3] = {
+ "Team heilen",
+ "Tote erwecken",
+ "Gehen"
+};
+
+static const StringListProvider kEoB1Npc32StringsDOSGermanProvider = { ARRAYSIZE(kEoB1Npc32StringsDOSGerman), kEoB1Npc32StringsDOSGerman };
+
+static const char *const kEoB1Npc4StringsDOSGerman[2] = {
+ "Angreifen",
+ "Bestechen"
+};
+
+static const StringListProvider kEoB1Npc4StringsDOSGermanProvider = { ARRAYSIZE(kEoB1Npc4StringsDOSGerman), kEoB1Npc4StringsDOSGerman };
+
+static const char *const kEoB1Npc5StringsDOSGerman[3] = {
+ "toeten",
+ "anhoeren",
+ "gehen lassen"
+};
+
+static const StringListProvider kEoB1Npc5StringsDOSGermanProvider = { ARRAYSIZE(kEoB1Npc5StringsDOSGerman), kEoB1Npc5StringsDOSGerman };
+
+static const char *const kEoB1Npc6StringsDOSGerman[2] = {
+ "Ergeben",
+ "Angreifen"
+};
+
+static const StringListProvider kEoB1Npc6StringsDOSGermanProvider = { ARRAYSIZE(kEoB1Npc6StringsDOSGerman), kEoB1Npc6StringsDOSGerman };
+
+static const char *const kEoB1Npc7StringsDOSGerman[3] = {
+ "befreien",
+ "toeten",
+ "Gehen"
+};
+
+static const StringListProvider kEoB1Npc7StringsDOSGermanProvider = { ARRAYSIZE(kEoB1Npc7StringsDOSGerman), kEoB1Npc7StringsDOSGerman };
+
+static const char *const kEoB1PryDoorStringsDOSGerman[8] = {
+ "Niemand schafft es, die Tuer aufzubrechen.\r",
+ "Das Team bricht die Tuer auf.\r",
+ "%s bricht die Tuer auf!\r",
+ "Das Team versucht die Tuer aufzubrechen, doch es schlaegt fehl.\r",
+ "Dieser Gegenstand kann hier nicht plaziert werden.\r",
+ "Dieser Gegenstand ist zu gross.\r",
+ "Niemand schafft es, die Tuer aufzubrechen.\r",
+ "\r"
+};
+
+static const StringListProvider kEoB1PryDoorStringsDOSGermanProvider = { ARRAYSIZE(kEoB1PryDoorStringsDOSGerman), kEoB1PryDoorStringsDOSGerman };
+
+static const char *const kEoB1WarningStringsDOSGerman[3] = {
+ "Hier geht es nicht weiter.\r",
+ "%s kann keine Nahrung zu sich nehmen!\r",
+ "Dies kann man nicht essen!\r"
+};
+
+static const StringListProvider kEoB1WarningStringsDOSGermanProvider = { ARRAYSIZE(kEoB1WarningStringsDOSGerman), kEoB1WarningStringsDOSGerman };
+
+static const char *const kEoB1ItemSuffixStringsRingsDOSGerman[4] = {
+ "Schmuck",
+ "Zauber",
+ "Nahrungs",
+ "Federfall"
+};
+
+static const StringListProvider kEoB1ItemSuffixStringsRingsDOSGermanProvider = { ARRAYSIZE(kEoB1ItemSuffixStringsRingsDOSGerman), kEoB1ItemSuffixStringsRingsDOSGerman };
+
+static const char *const kEoB1ItemSuffixStringsPotionsDOSGerman[8] = {
+ "Riesenstaerke",
+ "Heilungs",
+ "Extra Heilungs",
+ "Gift",
+ "Vitalitaets",
+ "Schnelligkeits",
+ "Unsichtbarkeits",
+ "Gift-Heilungs"
+};
+
+static const StringListProvider kEoB1ItemSuffixStringsPotionsDOSGermanProvider = { ARRAYSIZE(kEoB1ItemSuffixStringsPotionsDOSGerman), kEoB1ItemSuffixStringsPotionsDOSGerman };
+
+static const char *const kEoB1ItemSuffixStringsWandsDOSGerman[7] = {
+ "Stock",
+ "Blitz",
+ "Frost",
+ "Heilungs",
+ "Feuerball",
+ "Silvias",
+ "Magischer Geschoss"
+};
+
+static const StringListProvider kEoB1ItemSuffixStringsWandsDOSGermanProvider = { ARRAYSIZE(kEoB1ItemSuffixStringsWandsDOSGerman), kEoB1ItemSuffixStringsWandsDOSGerman };
+
+static const char *const kEoB1RipItemStringsDOSGerman[3] = {
+ "%s verlor ihre ",
+ "%s verlor seine ",
+ ".\r"
+};
+
+static const StringListProvider kEoB1RipItemStringsDOSGermanProvider = { ARRAYSIZE(kEoB1RipItemStringsDOSGerman), kEoB1RipItemStringsDOSGerman };
+
+static const char *const kEoB1CursedStringDOSGerman[1] = {
+ "Verflucht %s %d"
+};
+
+static const StringListProvider kEoB1CursedStringDOSGermanProvider = { ARRAYSIZE(kEoB1CursedStringDOSGerman), kEoB1CursedStringDOSGerman };
+
+static const char *const kEoB1MagicObjectStringsDOSGerman[5] = {
+ "Magier-Schriftrolle",
+ "Kleriker-Schriftrolle",
+ "Ring",
+ "Trank",
+ "Stab"
+};
+
+static const StringListProvider kEoB1MagicObjectStringsDOSGermanProvider = { ARRAYSIZE(kEoB1MagicObjectStringsDOSGerman), kEoB1MagicObjectStringsDOSGerman };
+
+static const char *const kEoB1MagicObjectString5DOSGerman[1] = {
+ "Stock"
+};
+
+static const StringListProvider kEoB1MagicObjectString5DOSGermanProvider = { ARRAYSIZE(kEoB1MagicObjectString5DOSGerman), kEoB1MagicObjectString5DOSGerman };
+
+static const char *const kEoB1PatternSuffixDOSGerman[1] = {
+ "%s-%s"
+};
+
+static const StringListProvider kEoB1PatternSuffixDOSGermanProvider = { ARRAYSIZE(kEoB1PatternSuffixDOSGerman), kEoB1PatternSuffixDOSGerman };
+
+static const char *const kEoB1PatternGrFix1DOSGerman[1] = {
+ "%s-%s"
+};
+
+static const StringListProvider kEoB1PatternGrFix1DOSGermanProvider = { ARRAYSIZE(kEoB1PatternGrFix1DOSGerman), kEoB1PatternGrFix1DOSGerman };
+
+static const char *const kEoB1PatternGrFix2DOSGerman[1] = {
+ "%s-%s"
+};
+
+static const StringListProvider kEoB1PatternGrFix2DOSGermanProvider = { ARRAYSIZE(kEoB1PatternGrFix2DOSGerman), kEoB1PatternGrFix2DOSGerman };
+
+static const char *const kEoB1ValidateArmorStringDOSGerman[1] = {
+ "%s kann diese Ruestung nicht tragen.\r"
+};
+
+static const StringListProvider kEoB1ValidateArmorStringDOSGermanProvider = { ARRAYSIZE(kEoB1ValidateArmorStringDOSGerman), kEoB1ValidateArmorStringDOSGerman };
+
+static const char *const kEoB1ValidateNoDropStringDOSGerman[1] = {
+ "Das koennt Ihr hier nicht ablegen.\r"
+};
+
+static const StringListProvider kEoB1ValidateNoDropStringDOSGermanProvider = { ARRAYSIZE(kEoB1ValidateNoDropStringDOSGerman), kEoB1ValidateNoDropStringDOSGerman };
+
+static const char *const kEoB1PotionStringsDOSGerman[2] = {
+ "vergiftet",
+ "%s fuehlt sich %s!\r"
+};
+
+static const StringListProvider kEoB1PotionStringsDOSGermanProvider = { ARRAYSIZE(kEoB1PotionStringsDOSGerman), kEoB1PotionStringsDOSGerman };
+
+static const char *const kEoB1WandStringsDOSGerman[2] = {
+ "Der Stab hat keinen offensichtlichen magischen Effekt.\r",
+ "kein effekt.\r"
+};
+
+static const StringListProvider kEoB1WandStringsDOSGermanProvider = { ARRAYSIZE(kEoB1WandStringsDOSGerman), kEoB1WandStringsDOSGerman };
+
+static const char *const kEoB1ItemMisuseStringsDOSGerman[3] = {
+ " kann dies nicht benutzen.\r",
+ "Dies wird automatisch benutzt, wenn angelegt.\r",
+ "Dies wird nicht so benutzt.\r"
+};
+
+static const StringListProvider kEoB1ItemMisuseStringsDOSGermanProvider = { ARRAYSIZE(kEoB1ItemMisuseStringsDOSGerman), kEoB1ItemMisuseStringsDOSGerman };
+
+static const char *const kEoB1TakenStringsDOSGerman[1] = {
+ " aufgenommen.\r"
+};
+
+static const StringListProvider kEoB1TakenStringsDOSGermanProvider = { ARRAYSIZE(kEoB1TakenStringsDOSGerman), kEoB1TakenStringsDOSGerman };
+
+static const char *const kEoB1PotionEffectStringsDOSGerman[8] = {
+ "viel staerker",
+ "besser",
+ "viel besser",
+ "einen Moment uebel",
+ "nicht laenger hungrig",
+ "schnell und agil",
+ "transparent",
+ "besser"
+};
+
+static const StringListProvider kEoB1PotionEffectStringsDOSGermanProvider = { ARRAYSIZE(kEoB1PotionEffectStringsDOSGerman), kEoB1PotionEffectStringsDOSGerman };
+
+static const char *const kEoB1YesNoStringsDOSGerman[2] = {
+ "ja",
+ "nein"
+};
+
+static const StringListProvider kEoB1YesNoStringsDOSGermanProvider = { ARRAYSIZE(kEoB1YesNoStringsDOSGerman), kEoB1YesNoStringsDOSGerman };
+
+static const char *const kEoB1MoreStringsDOSGerman[1] = {
+ "MEHR"
+};
+
+static const StringListProvider kEoB1MoreStringsDOSGermanProvider = { ARRAYSIZE(kEoB1MoreStringsDOSGerman), kEoB1MoreStringsDOSGerman };
+
+static const char *const kEoB1NpcMaxStringsDOSGerman[1] = {
+ "Es sind nur sechs Charaktere in einem Team erlaubt. Waehlen Sie aus, welchen Sie entlassen wollen."
+};
+
+static const StringListProvider kEoB1NpcMaxStringsDOSGermanProvider = { ARRAYSIZE(kEoB1NpcMaxStringsDOSGerman), kEoB1NpcMaxStringsDOSGerman };
+
+static const char *const kEoB1NpcJoinStringsDOSGerman[1] = {
+ "%s wird in's Team aufgenommen.\r"
+};
+
+static const StringListProvider kEoB1NpcJoinStringsDOSGermanProvider = { ARRAYSIZE(kEoB1NpcJoinStringsDOSGerman), kEoB1NpcJoinStringsDOSGerman };
+
+static const char *const kEoB1CancelStringsDOSGerman[1] = {
+ "ABBRECHEN"
+};
+
+static const StringListProvider kEoB1CancelStringsDOSGermanProvider = { ARRAYSIZE(kEoB1CancelStringsDOSGerman), kEoB1CancelStringsDOSGerman };
+
+static const char *const kEoB1MenuStringsMainDOSGerman[8] = {
+ "Option Waehlen:",
+ "Ausruhen",
+ "Zauber lernen",
+ "Fuer Zauber beten",
+ "Schriftrollen",
+ "Einstellungen",
+ "Spieloptionen",
+ "Ende"
+};
+
+static const StringListProvider kEoB1MenuStringsMainDOSGermanProvider = { ARRAYSIZE(kEoB1MenuStringsMainDOSGerman), kEoB1MenuStringsMainDOSGerman };
+
+static const char *const kEoB1MenuStringsSaveLoadDOSGerman[8] = {
+ "Spiel laden",
+ "Spiel speichern",
+ "Charakter entlassen",
+ "Spielende",
+ "Spieloptionen:",
+ "\r Gespeichert.",
+ "\r Speichern\r Fehler!",
+ "\r Spiel laden\r Fehler!"
+};
+
+static const StringListProvider kEoB1MenuStringsSaveLoadDOSGermanProvider = { ARRAYSIZE(kEoB1MenuStringsSaveLoadDOSGerman), kEoB1MenuStringsSaveLoadDOSGerman };
+
+static const char *const kEoB1MenuStringsOnOffDOSGerman[2] = {
+ "AN",
+ "AUS"
+};
+
+static const StringListProvider kEoB1MenuStringsOnOffDOSGermanProvider = { ARRAYSIZE(kEoB1MenuStringsOnOffDOSGerman), kEoB1MenuStringsOnOffDOSGerman };
+
+static const char *const kEoB1MenuStringsSpellsDOSGerman[17] = {
+ "\r\r Charakter aus dem\r Team waehlen, der\r zaubern moechte.\r ",
+ "\r Der Paladin ist \r noch zu \r unerfahren.",
+ "\r\r Der Magier hat\r kein Zauberbuch!",
+ "\r\r\r Charakter aus dem\r Team waehlen, der\r beten moechte.\r ",
+ "\r Das Team hat kei-\r nen Kleriker, der\r beten koennte.\r ",
+ "\r Das Team hat kei-\r nen Magier, der\r zaubern koennte.",
+ " Ein bewusstloser\r oder toter Magier\r kann keine Zauber\r lernen.",
+ " Ein bewusstloser\r oder toter Kleriker\r kann nicht fuer Zauber\r beten.",
+ "1",
+ "2",
+ "3",
+ "4",
+ "5",
+ "Loesch",
+ "Verfuegbare Zauber:",
+ "Ja",
+ "Nein"
+};
+
+static const StringListProvider kEoB1MenuStringsSpellsDOSGermanProvider = { ARRAYSIZE(kEoB1MenuStringsSpellsDOSGerman), kEoB1MenuStringsSpellsDOSGerman };
+
+static const char *const kEoB1MenuStringsRestDOSGerman[5] = {
+ "\rWerden die Heiler\rdas Team heilen?",
+ " Jemand ist noch\r verletzt. Rasten,\r bis geheilt?",
+ "Ausruhen.",
+ "\r Alle Charaktere\r sind ganz\r ausgeruht.",
+ " Das Team muss\r fuer neue Zauber\r rasten."
+};
+
+static const StringListProvider kEoB1MenuStringsRestDOSGermanProvider = { ARRAYSIZE(kEoB1MenuStringsRestDOSGerman), kEoB1MenuStringsRestDOSGerman };
+
+static const char *const kEoB1MenuStringsDropDOSGerman[1] = {
+ " Sie muessen min-\r destens vier\r Charaktere be-\r sitzen."
+};
+
+static const StringListProvider kEoB1MenuStringsDropDOSGermanProvider = { ARRAYSIZE(kEoB1MenuStringsDropDOSGerman), kEoB1MenuStringsDropDOSGerman };
+
+static const char *const kEoB1MenuStringsExitDOSGerman[1] = {
+ " Wollen Sie wirk-\r lich das Spiel\r beenden?\r"
+};
+
+static const StringListProvider kEoB1MenuStringsExitDOSGermanProvider = { ARRAYSIZE(kEoB1MenuStringsExitDOSGerman), kEoB1MenuStringsExitDOSGerman };
+
+static const char *const kEoB1MenuStringsStarveDOSGerman[1] = {
+ " Ihr Team verhungert.\r Soll weiter gerastet\r werden?\r "
+};
+
+static const StringListProvider kEoB1MenuStringsStarveDOSGermanProvider = { ARRAYSIZE(kEoB1MenuStringsStarveDOSGerman), kEoB1MenuStringsStarveDOSGerman };
+
+static const char *const kEoB1MenuStringsScribeDOSGerman[5] = {
+ "Schriftrolle(n) waeh-\rlen,die notiert wer-\rden soll(en).",
+ "\r\r\r Welcher Magier des\r Teams soll\r Schriftrollen\r notieren?",
+ " Es gibt keine\r Schriftrollen zum\r Notieren.",
+ " Sie haben keine\r Schriftrolle fuer\r diesen Magier.",
+ "\r Keiner Ihrer Magier\r kann Schriftrollen\r notieren."
+};
+
+static const StringListProvider kEoB1MenuStringsScribeDOSGermanProvider = { ARRAYSIZE(kEoB1MenuStringsScribeDOSGerman), kEoB1MenuStringsScribeDOSGerman };
+
+static const char *const kEoB1MenuStringsDrop2DOSGerman[3] = {
+ " Waehlen Sie den\r zu entlassenden\r Charakter.",
+ " Wollen Sie wirk-\r lich das Spiel\r SPEICHERN?",
+ " Wollen Sie wirk-\r lich ein altes\r Spiel LADEN?"
+};
+
+static const StringListProvider kEoB1MenuStringsDrop2DOSGermanProvider = { ARRAYSIZE(kEoB1MenuStringsDrop2DOSGerman), kEoB1MenuStringsDrop2DOSGerman };
+
+static const char *const kEoB1MenuStringsHeadDOSGerman[3] = {
+ "Camp:",
+ "Einstellungen:",
+ "Spieloptionen:"
+};
+
+static const StringListProvider kEoB1MenuStringsHeadDOSGermanProvider = { ARRAYSIZE(kEoB1MenuStringsHeadDOSGerman), kEoB1MenuStringsHeadDOSGerman };
+
+static const char *const kEoB1MenuStringsPoisonDOSGerman[1] = {
+ "Vergiftete Team-\rmitglieder sterben!\rTrotzdem rasten?"
+};
+
+static const StringListProvider kEoB1MenuStringsPoisonDOSGermanProvider = { ARRAYSIZE(kEoB1MenuStringsPoisonDOSGerman), kEoB1MenuStringsPoisonDOSGerman };
+
+static const char *const kEoB1MenuStringsMgcDOSGerman[2] = {
+ "%-18s %1d",
+ "%d von %d Uebrigen. "
+};
+
+static const StringListProvider kEoB1MenuStringsMgcDOSGermanProvider = { ARRAYSIZE(kEoB1MenuStringsMgcDOSGerman), kEoB1MenuStringsMgcDOSGerman };
+
+static const char *const kEoB1MenuStringsPrefsDOSGerman[4] = {
+ "Musik ist %-3s",
+ "Geraeusche sind %-3s",
+ "Graphikzeilen %-3s",
+ "Maus ist %-3s"
+};
+
+static const StringListProvider kEoB1MenuStringsPrefsDOSGermanProvider = { ARRAYSIZE(kEoB1MenuStringsPrefsDOSGerman), kEoB1MenuStringsPrefsDOSGerman };
+
+static const char *const kEoB1MenuStringsRest2DOSGerman[4] = {
+ "%s erhaelt %s.\r",
+ "%s lernt %s.\r",
+ "%s spricht heilung auf %s.\r",
+ "Ruhestunden: %-4d"
+};
+
+static const StringListProvider kEoB1MenuStringsRest2DOSGermanProvider = { ARRAYSIZE(kEoB1MenuStringsRest2DOSGerman), kEoB1MenuStringsRest2DOSGerman };
+
+static const char *const kEoB1MenuStringsRest4DOSGerman[1] = {
+ "\rRast ist nicht moeglich, Monster sind in der Naehe."
+};
+
+static const StringListProvider kEoB1MenuStringsRest4DOSGermanProvider = { ARRAYSIZE(kEoB1MenuStringsRest4DOSGerman), kEoB1MenuStringsRest4DOSGerman };
+
+static const char *const kEoB1MenuStringsDefeatDOSGerman[1] = {
+ " Dein ganzes team ist geschlagen. Die Helfer des boesen koennen ihre Plaene ungehindert erfuellen! \r"
+};
+
+static const StringListProvider kEoB1MenuStringsDefeatDOSGermanProvider = { ARRAYSIZE(kEoB1MenuStringsDefeatDOSGerman), kEoB1MenuStringsDefeatDOSGerman };
+
+static const char *const kEoB1MenuYesNoStringsDOSGerman[2] = {
+ "Ja",
+ "Nein"
+};
+
+static const StringListProvider kEoB1MenuYesNoStringsDOSGermanProvider = { ARRAYSIZE(kEoB1MenuYesNoStringsDOSGerman), kEoB1MenuYesNoStringsDOSGerman };
+
+static const char *const kEoB1CharGuiStringsHpDOSGerman[2] = {
+ "HP",
+ "%3d / %-3d"
+};
+
+static const StringListProvider kEoB1CharGuiStringsHpDOSGermanProvider = { ARRAYSIZE(kEoB1CharGuiStringsHpDOSGerman), kEoB1CharGuiStringsHpDOSGerman };
+
+static const char *const kEoB1CharGuiStringsWp1DOSGerman[2] = {
+ "FEHL",
+ "HACK"
+};
+
+static const StringListProvider kEoB1CharGuiStringsWp1DOSGermanProvider = { ARRAYSIZE(kEoB1CharGuiStringsWp1DOSGerman), kEoB1CharGuiStringsWp1DOSGerman };
+
+static const char *const kEoB1CharGuiStringsWrDOSGerman[4] = {
+ " ZU ",
+ "WEIT",
+ "KEINE",
+ " MUN"
+};
+
+static const StringListProvider kEoB1CharGuiStringsWrDOSGermanProvider = { ARRAYSIZE(kEoB1CharGuiStringsWrDOSGerman), kEoB1CharGuiStringsWrDOSGerman };
+
+static const char *const kEoB1CharGuiStringsSt1DOSGerman[6] = {
+ "Tausche",
+ "TOT",
+ "BEWUSSTLOS",
+ "GIFT (LANGSAM)",
+ "VERGIFTED",
+ "BETAEUBT"
+};
+
+static const StringListProvider kEoB1CharGuiStringsSt1DOSGermanProvider = { ARRAYSIZE(kEoB1CharGuiStringsSt1DOSGerman), kEoB1CharGuiStringsSt1DOSGerman };
+
+static const char *const kEoB1CharGuiStringsInDOSGerman[4] = {
+ "CHARAKTER INFO",
+ "RUESTUNG",
+ "ERF",
+ "EBN"
+};
+
+static const StringListProvider kEoB1CharGuiStringsInDOSGermanProvider = { ARRAYSIZE(kEoB1CharGuiStringsInDOSGerman), kEoB1CharGuiStringsInDOSGerman };
+
+static const char *const kEoB1CharStatusStrings7DOSGerman[1] = {
+ "%s besitzt nun keine Riesen-Staerke mehr.\r"
+};
+
+static const StringListProvider kEoB1CharStatusStrings7DOSGermanProvider = { ARRAYSIZE(kEoB1CharStatusStrings7DOSGerman), kEoB1CharStatusStrings7DOSGerman };
+
+static const char *const kEoB1CharStatusStrings81DOSGerman[1] = {
+ "%s fuehlt, wie das Gift wirkt!\r"
+};
+
+static const StringListProvider kEoB1CharStatusStrings81DOSGermanProvider = { ARRAYSIZE(kEoB1CharStatusStrings81DOSGerman), kEoB1CharStatusStrings81DOSGerman };
+
+static const char *const kEoB1CharStatusStrings9DOSGerman[1] = {
+ "%s ist nicht mehr gelaehmt!\r"
+};
+
+static const StringListProvider kEoB1CharStatusStrings9DOSGermanProvider = { ARRAYSIZE(kEoB1CharStatusStrings9DOSGerman), kEoB1CharStatusStrings9DOSGerman };
+
+static const char *const kEoB1CharStatusStrings131DOSGerman[1] = {
+ "%s ist %s!\r"
+};
+
+static const StringListProvider kEoB1CharStatusStrings131DOSGermanProvider = { ARRAYSIZE(kEoB1CharStatusStrings131DOSGerman), kEoB1CharStatusStrings131DOSGerman };
+
+static const char *const kEoB1LevelGainStringsDOSGerman[1] = {
+ "\x06\x01""%s steigt eine erfahrungsstufe auf.""\x06\x0F""\r"
+};
+
+static const StringListProvider kEoB1LevelGainStringsDOSGermanProvider = { ARRAYSIZE(kEoB1LevelGainStringsDOSGerman), kEoB1LevelGainStringsDOSGerman };
+
+static const char *const kEoB1BookNumbersDOSGerman[5] = {
+ "Erster",
+ "Zweiter",
+ "Dritter",
+ "Vierter",
+ "Fuenfter"
+};
+
+static const StringListProvider kEoB1BookNumbersDOSGermanProvider = { ARRAYSIZE(kEoB1BookNumbersDOSGerman), kEoB1BookNumbersDOSGerman };
+
+static const char *const kEoB1MageSpellsListDOSGerman[26] = {
+ "",
+ "Ruestung",
+ "Brennende Haende",
+ "Magie entdecken",
+ "Magisch. Geschoss",
+ "Magie lesen",
+ "Schild",
+ "Schockgriff",
+ "Unsichtbarkeit",
+ "Klopfen",
+ "Ms Saeurepfeil",
+ "Stinkende Wolke",
+ "Magie bannen",
+ "Feuerball",
+ "Flammenpfeil",
+ "Hast",
+ "Person festhalten",
+ "Usichtbarkeit 3m",
+ "Blitzstrahl",
+ "Vampirgriff",
+ "Furcht",
+ "Eissturm",
+ "Steinhaut",
+ "Todeswolke",
+ "Kaeltekegel",
+ "Monster festhalten"
+};
+
+static const StringListProvider kEoB1MageSpellsListDOSGermanProvider = { ARRAYSIZE(kEoB1MageSpellsListDOSGerman), kEoB1MageSpellsListDOSGerman };
+
+static const char *const kEoB1ClericSpellsListDOSGerman[25] = {
+ "",
+ "Segen",
+ "L. Wnd. heilen",
+ "l. Wnd. verurs.",
+ "Magie entdecken",
+ "Schutz v. Boesem",
+ "Staerkung",
+ "Flammenklinge",
+ "Person festhalten",
+ "Gift verlangsamen",
+ "Nahrung erschaffen",
+ "Magie bannen",
+ "Schutzgewand",
+ "Gebet",
+ "Laehmung aufheben",
+ "Schwere W. heilen",
+ "Schwere W. verurs.",
+ "Gift neutral.",
+ "Schutz v.Boesem 3m",
+ "Schutz v. Blitzen",
+ "Krit. W. heilen",
+ "Krit. W. verurs.",
+ "Flammenschlag",
+ "Tote erwecken",
+ "Haende auflegen"
+};
+
+static const StringListProvider kEoB1ClericSpellsListDOSGermanProvider = { ARRAYSIZE(kEoB1ClericSpellsListDOSGerman), kEoB1ClericSpellsListDOSGerman };
+
+static const char *const kEoB1SpellNamesDOSGerman[51] = {
+ "",
+ "Ruestung",
+ "brennende Haende",
+ "Magie entdecken",
+ "magisches Geschoss",
+ "Schild",
+ "Schockgriff",
+ "Unsichtbarkeit",
+ "Ms saeurepfeil",
+ "stinkende Wolke",
+ "Magie bannen",
+ "Feuerball",
+ "Flammenpfeil",
+ "hast",
+ "Person festhalten",
+ "Unsichtbarkeit 3m",
+ "Blitzstrahl",
+ "Vampirgriff",
+ "Furcht",
+ "Eissturm",
+ "Steinhaut",
+ "Todeswolke",
+ "Kaeltekegel",
+ "Monster festhalten",
+ "Segen",
+ "leichte Wunden heilen",
+ "leichte Wunden verursachen",
+ "Magie entdecken",
+ "Schutz vor boesem",
+ "Staerkung",
+ "Flammenklinge",
+ "Person festhalten",
+ "Gift verlangsamen",
+ "Nahrung erschaffen",
+ "Magie bannen",
+ "Schutzgewand",
+ "Gebet",
+ "Laehmung aufheben",
+ "schwere Wunden heilen",
+ "schwere Wunden verursachen",
+ "Gift neutralisieren",
+ "Schutz vor boesem 3m",
+ "Schutz vor Blitzen",
+ "kritische Wunden heilen",
+ "kritische Wunden verursachen",
+ "Flammenschlag",
+ "Tote erwecken",
+ "Haende auflegen",
+ "",
+ "",
+ ""
+};
+
+static const StringListProvider kEoB1SpellNamesDOSGermanProvider = { ARRAYSIZE(kEoB1SpellNamesDOSGerman), kEoB1SpellNamesDOSGerman };
+
+static const char *const kEoB1MagicStrings1DOSGerman[6] = {
+ "KEIN ZAUBER",
+ "KEIN ZAUBER",
+ "Fuer diesen Zauber musst du eine Hand frei haben.\r",
+ "Zwei Sprueche dieses Typs koennen nicht gleichzeitig wirken.\r",
+ "%s zaubert %s.\r",
+ "ok\r"
+};
+
+static const StringListProvider kEoB1MagicStrings1DOSGermanProvider = { ARRAYSIZE(kEoB1MagicStrings1DOSGerman), kEoB1MagicStrings1DOSGerman };
+
+static const char *const kEoB1MagicStrings2DOSGerman[3] = {
+ "Kein Effekt\r",
+ "%s wurde aufgeloest!\r",
+ "Das Team wurde mit einem Todesbann belegt!\r"
+};
+
+static const StringListProvider kEoB1MagicStrings2DOSGermanProvider = { ARRAYSIZE(kEoB1MagicStrings2DOSGerman), kEoB1MagicStrings2DOSGerman };
+
+static const char *const kEoB1MagicStrings3DOSGerman[6] = {
+ "Zauber auf welchen Charakter anwenden? ",
+ "\rok\r",
+ "\rZauber abgebrochen.\r",
+ "%s's %s Zauber laesst nach.\r",
+ "%s traf das Monster nicht.\r",
+ "%s kann nur in vorderen Reihen zuschlagen!\r"
+};
+
+static const StringListProvider kEoB1MagicStrings3DOSGermanProvider = { ARRAYSIZE(kEoB1MagicStrings3DOSGerman), kEoB1MagicStrings3DOSGerman };
+
+static const char *const kEoB1MagicStrings4DOSGerman[2] = {
+ "Kein Effekt.\r",
+ "Kein Effekt\r"
+};
+
+static const StringListProvider kEoB1MagicStrings4DOSGermanProvider = { ARRAYSIZE(kEoB1MagicStrings4DOSGerman), kEoB1MagicStrings4DOSGerman };
+
+static const char *const kEoB1MagicStrings6DOSGerman[1] = {
+ "%s hat bereits eine hochrangige Ruestungsklasse.\r"
+};
+
+static const StringListProvider kEoB1MagicStrings6DOSGermanProvider = { ARRAYSIZE(kEoB1MagicStrings6DOSGerman), kEoB1MagicStrings6DOSGerman };
+
+static const char *const kEoB1MagicStrings7DOSGerman[5] = {
+ "1.",
+ "2.",
+ "3.",
+ "4.",
+ "5."
+};
+
+static const StringListProvider kEoB1MagicStrings7DOSGermanProvider = { ARRAYSIZE(kEoB1MagicStrings7DOSGerman), kEoB1MagicStrings7DOSGerman };
+
+static const char *const kEoB1MagicStrings8DOSGerman[3] = {
+ "Alle Zauber auf %s wurden abgewehrt.\r",
+ "Das Team ist schon gesegnet!\r",
+ "Der Heilungszauber versagt!\r"
+};
+
+static const StringListProvider kEoB1MagicStrings8DOSGermanProvider = { ARRAYSIZE(kEoB1MagicStrings8DOSGerman), kEoB1MagicStrings8DOSGerman };
+
+static const byte kEoB1ManDefDOSGerman[120] = {
+ 0x09, 0x0A, 0x01, 0x00, 0x09, 0x04, 0x03, 0x00,
+ 0x09, 0x06, 0x01, 0x00, 0x09, 0x03, 0x03, 0x00,
+ 0x09, 0x04, 0x02, 0x00, 0x09, 0x01, 0x02, 0x00,
+ 0x09, 0x05, 0x01, 0x00, 0x09, 0x09, 0x02, 0x00,
+ 0x09, 0x01, 0x03, 0x00, 0x23, 0x01, 0x05, 0x00,
+ 0x23, 0x02, 0x02, 0x00, 0x23, 0x03, 0x06, 0x00,
+ 0x23, 0x05, 0x01, 0x00, 0x23, 0x06, 0x03, 0x00,
+ 0x23, 0x07, 0x01, 0x00, 0x1A, 0x02, 0x01, 0x00,
+ 0x1A, 0x03, 0x02, 0x00, 0x1A, 0x06, 0x01, 0x00,
+ 0x24, 0x01, 0x03, 0x00, 0x24, 0x03, 0x03, 0x00,
+ 0x24, 0x03, 0x01, 0x00, 0x02, 0x04, 0x03, 0x00,
+ 0x02, 0x03, 0x03, 0x00, 0x02, 0x07, 0x02, 0x00,
+ 0x01, 0x01, 0x01, 0x00, 0x01, 0x05, 0x03, 0x00,
+ 0x01, 0x04, 0x03, 0x00, 0x0C, 0x02, 0x01, 0x00,
+ 0x0C, 0x03, 0x03, 0x00, 0x0C, 0x02, 0x04, 0x00
+};
+
+static const ByteProvider kEoB1ManDefDOSGermanProvider = { ARRAYSIZE(kEoB1ManDefDOSGerman), kEoB1ManDefDOSGerman };
+
+static const char *const kEoB1ManWordDOSGerman[31] = {
+ "dargestellt",
+ "nur",
+ "attackieren",
+ "sie",
+ "handwaffen",
+ "monster",
+ "diese",
+ "wird",
+ "jedoch",
+ "sie",
+ "getragene",
+ "sobald",
+ "klerikale",
+ "getragene",
+ "sich",
+ "elternteile",
+ "gesicht",
+ "nicht",
+ "ihrer",
+ "magische",
+ "einige",
+ "sich",
+ "charaktere",
+ "gesinnung",
+ "versammlung",
+ "wachen",
+ "des",
+ "werden",
+ "seinen",
+ "greift",
+ ""
+};
+
+static const StringListProvider kEoB1ManWordDOSGermanProvider = { ARRAYSIZE(kEoB1ManWordDOSGerman), kEoB1ManWordDOSGerman };
+
+static const char *const kEoB1ManPromptDOSGerman[1] = {
+ "\r\r\r\rAuf der Seite mit diesem Symbol...\r\rFinde Zeile %d\rGib Wort %d ein\r"
+};
+
+static const StringListProvider kEoB1ManPromptDOSGermanProvider = { ARRAYSIZE(kEoB1ManPromptDOSGerman), kEoB1ManPromptDOSGerman };
+
+static const char *const kEoB1MonsterDistAttStringsDOSGerman[5] = {
+ "%s wurde von einem Schwere-Wunden-Zauber getroffen!\r",
+ "Das Team wurde von einem psychischen Hirnstoss getroffen!\r",
+ "gelaehmt",
+ "vergiftet",
+ "gelaehmt"
+};
+
+static const StringListProvider kEoB1MonsterDistAttStringsDOSGermanProvider = { ARRAYSIZE(kEoB1MonsterDistAttStringsDOSGerman), kEoB1MonsterDistAttStringsDOSGerman };
+
diff --git a/devtools/create_kyradat/resources/eob2_dos.h b/devtools/create_kyradat/resources/eob2_dos.h
new file mode 100644
index 0000000000..f260913e3c
--- /dev/null
+++ b/devtools/create_kyradat/resources/eob2_dos.h
@@ -0,0 +1,2501 @@
+static const byte kEoB2ChargenStartLevelsDOS[60] = {
+ 0x07, 0x00, 0x00, 0x01, 0x06, 0x00, 0x00, 0x01,
+ 0x06, 0x00, 0x00, 0x01, 0x07, 0x00, 0x00, 0x01,
+ 0x07, 0x00, 0x00, 0x01, 0x07, 0x00, 0x00, 0x01,
+ 0x06, 0x06, 0x00, 0x02, 0x06, 0x06, 0x00, 0x02,
+ 0x06, 0x05, 0x00, 0x02, 0x05, 0x05, 0x06, 0x03,
+ 0x06, 0x05, 0x00, 0x02, 0x06, 0x06, 0x00, 0x02,
+ 0x05, 0x05, 0x05, 0x03, 0x05, 0x06, 0x00, 0x02,
+ 0x06, 0x05, 0x00, 0x02
+};
+
+static const ByteProvider kEoB2ChargenStartLevelsDOSProvider = { ARRAYSIZE(kEoB2ChargenStartLevelsDOS), kEoB2ChargenStartLevelsDOS };
+
+static const byte kEoB2ChargenClassMinStatsDOS[90] = {
+ 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0D, 0x00,
+ 0x0E, 0x0D, 0x0E, 0x00, 0x0C, 0x00, 0x0D, 0x00,
+ 0x09, 0x11, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x09, 0x00, 0x00, 0x09, 0x00, 0x09, 0x00,
+ 0x00, 0x00, 0x09, 0x00, 0x00, 0x09, 0x00, 0x00,
+ 0x09, 0x09, 0x00, 0x00, 0x00, 0x00, 0x09, 0x09,
+ 0x00, 0x09, 0x00, 0x00, 0x00, 0x09, 0x00, 0x09,
+ 0x00, 0x00, 0x00, 0x00, 0x09, 0x09, 0x00, 0x00,
+ 0x09, 0x09, 0x09, 0x00, 0x00, 0x00, 0x0D, 0x00,
+ 0x0E, 0x0D, 0x0E, 0x00, 0x00, 0x09, 0x09, 0x00,
+ 0x00, 0x00
+};
+
+static const ByteProvider kEoB2ChargenClassMinStatsDOSProvider = { ARRAYSIZE(kEoB2ChargenClassMinStatsDOS), kEoB2ChargenClassMinStatsDOS };
+
+static const byte kEoB2ChargenRaceMinStatsDOS[36] = {
+ 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x08,
+ 0x03, 0x07, 0x06, 0x08, 0x03, 0x04, 0x03, 0x06,
+ 0x06, 0x03, 0x08, 0x03, 0x03, 0x03, 0x0C, 0x02,
+ 0x06, 0x07, 0x02, 0x03, 0x08, 0x03, 0x07, 0x06,
+ 0x03, 0x08, 0x0A, 0x06
+};
+
+static const ByteProvider kEoB2ChargenRaceMinStatsDOSProvider = { ARRAYSIZE(kEoB2ChargenRaceMinStatsDOS), kEoB2ChargenRaceMinStatsDOS };
+
+static const uint16 kEoB2ChargenRaceMaxStatsDOS[36] = {
+ 0x6412, 0x0012, 0x0012, 0x0012, 0x0012, 0x0012, 0x6412, 0x0012,
+ 0x0012, 0x0013, 0x0011, 0x0012, 0x6412, 0x0012, 0x0012, 0x0012,
+ 0x0012, 0x0012, 0x6412, 0x0012, 0x0012, 0x0011, 0x0013, 0x0010,
+ 0x6412, 0x0013, 0x0011, 0x0012, 0x0012, 0x0012, 0x0011, 0x0012,
+ 0x0011, 0x0013, 0x0012, 0x0012
+};
+
+static const Uint16Provider kEoB2ChargenRaceMaxStatsDOSProvider = { ARRAYSIZE(kEoB2ChargenRaceMaxStatsDOS), kEoB2ChargenRaceMaxStatsDOS };
+
+static const byte kEoB2SaveThrowTable1DOS[50] = {
+ 0x10, 0x0E, 0x0D, 0x0B, 0x0A, 0x08, 0x07, 0x05,
+ 0x04, 0x03, 0x12, 0x10, 0x0F, 0x0D, 0x0C, 0x0A,
+ 0x09, 0x07, 0x06, 0x05, 0x11, 0x0F, 0x0E, 0x0C,
+ 0x0B, 0x09, 0x08, 0x06, 0x05, 0x04, 0x14, 0x11,
+ 0x10, 0x0D, 0x0C, 0x09, 0x08, 0x05, 0x04, 0x04,
+ 0x13, 0x11, 0x10, 0x0E, 0x0D, 0x0B, 0x0A, 0x08,
+ 0x07, 0x06
+};
+
+static const ByteProvider kEoB2SaveThrowTable1DOSProvider = { ARRAYSIZE(kEoB2SaveThrowTable1DOS), kEoB2SaveThrowTable1DOS };
+
+static const byte kEoB2SaveThrowTable2DOS[25] = {
+ 0x0E, 0x0D, 0x0B, 0x0A, 0x08, 0x0B, 0x09, 0x07,
+ 0x05, 0x03, 0x0D, 0x0B, 0x09, 0x07, 0x05, 0x0F,
+ 0x0D, 0x0B, 0x09, 0x07, 0x0C, 0x0A, 0x08, 0x06,
+ 0x04
+};
+
+static const ByteProvider kEoB2SaveThrowTable2DOSProvider = { ARRAYSIZE(kEoB2SaveThrowTable2DOS), kEoB2SaveThrowTable2DOS };
+
+static const byte kEoB2SaveThrowTable3DOS[35] = {
+ 0x0A, 0x09, 0x07, 0x06, 0x05, 0x04, 0x02, 0x0E,
+ 0x0D, 0x0B, 0x0A, 0x09, 0x08, 0x06, 0x0D, 0x0C,
+ 0x0A, 0x09, 0x08, 0x07, 0x05, 0x10, 0x0F, 0x0D,
+ 0x0C, 0x0B, 0x0A, 0x08, 0x0F, 0x0E, 0x0C, 0x0B,
+ 0x0A, 0x09, 0x07
+};
+
+static const ByteProvider kEoB2SaveThrowTable3DOSProvider = { ARRAYSIZE(kEoB2SaveThrowTable3DOS), kEoB2SaveThrowTable3DOS };
+
+static const byte kEoB2SaveThrowTable4DOS[30] = {
+ 0x0D, 0x0C, 0x0B, 0x0A, 0x09, 0x08, 0x0E, 0x0C,
+ 0x0A, 0x08, 0x06, 0x07, 0x0C, 0x0B, 0x0A, 0x09,
+ 0x08, 0x04, 0x10, 0x0F, 0x0E, 0x0D, 0x0C, 0x0B,
+ 0x0F, 0x0D, 0x0B, 0x09, 0x07, 0x05
+};
+
+static const ByteProvider kEoB2SaveThrowTable4DOSProvider = { ARRAYSIZE(kEoB2SaveThrowTable4DOS), kEoB2SaveThrowTable4DOS };
+
+static const byte kEoB2SaveThrwLvlIndexDOS[6] = {
+ 0x11, 0x15, 0x13, 0x15, 0x11, 0x11
+};
+
+static const ByteProvider kEoB2SaveThrwLvlIndexDOSProvider = { ARRAYSIZE(kEoB2SaveThrwLvlIndexDOS), kEoB2SaveThrwLvlIndexDOS };
+
+static const byte kEoB2SaveThrwModDivDOS[6] = {
+ 0x02, 0x05, 0x03, 0x04, 0x02, 0x02
+};
+
+static const ByteProvider kEoB2SaveThrwModDivDOSProvider = { ARRAYSIZE(kEoB2SaveThrwModDivDOS), kEoB2SaveThrwModDivDOS };
+
+static const byte kEoB2SaveThrwModExtDOS[6] = {
+ 0x0A, 0x05, 0x07, 0x06, 0x0A, 0x0A
+};
+
+static const ByteProvider kEoB2SaveThrwModExtDOSProvider = { ARRAYSIZE(kEoB2SaveThrwModExtDOS), kEoB2SaveThrwModExtDOS };
+
+static const char *const kEoB2EnchantedStringDOS[1] = {
+ "+%d %s"
+};
+
+static const StringListProvider kEoB2EnchantedStringDOSProvider = { ARRAYSIZE(kEoB2EnchantedStringDOS), kEoB2EnchantedStringDOS };
+
+static const char *const kEoB2MenuStringsSpellNoDOS[3] = {
+ "6",
+ "7",
+ "8"
+};
+
+static const StringListProvider kEoB2MenuStringsSpellNoDOSProvider = { ARRAYSIZE(kEoB2MenuStringsSpellNoDOS), kEoB2MenuStringsSpellNoDOS };
+
+static const byte kEoB2SpellLevelsMageDOS[35] = {
+ 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, 0x02,
+ 0x02, 0x02, 0x02, 0x03, 0x03, 0x03, 0x03, 0x03,
+ 0x03, 0x03, 0x04, 0x04, 0x04, 0x04, 0x05, 0x05,
+ 0x05, 0x06, 0x06, 0x06, 0x06, 0x07, 0x07, 0x08,
+ 0x00, 0x01, 0x01
+};
+
+static const ByteProvider kEoB2SpellLevelsMageDOSProvider = { ARRAYSIZE(kEoB2SpellLevelsMageDOS), kEoB2SpellLevelsMageDOS };
+
+static const byte kEoB2SpellLevelsClericDOS[29] = {
+ 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x02,
+ 0x02, 0x03, 0x03, 0x03, 0x03, 0x03, 0x04, 0x04,
+ 0x04, 0x04, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05,
+ 0x06, 0x06, 0x08, 0x08, 0x00
+};
+
+static const ByteProvider kEoB2SpellLevelsClericDOSProvider = { ARRAYSIZE(kEoB2SpellLevelsClericDOS), kEoB2SpellLevelsClericDOS };
+
+static const byte kEoB2NumSpellsClericDOS[136] = {
+ 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x02, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x03, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x03, 0x03, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x03, 0x03, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x03, 0x03, 0x02, 0x01, 0x00, 0x00, 0x00, 0x00,
+ 0x03, 0x03, 0x03, 0x02, 0x00, 0x00, 0x00, 0x00,
+ 0x04, 0x04, 0x03, 0x02, 0x01, 0x00, 0x00, 0x00,
+ 0x04, 0x04, 0x03, 0x02, 0x02, 0x00, 0x00, 0x00,
+ 0x05, 0x04, 0x04, 0x03, 0x02, 0x01, 0x00, 0x00,
+ 0x06, 0x05, 0x05, 0x03, 0x02, 0x02, 0x00, 0x00,
+ 0x06, 0x06, 0x06, 0x04, 0x02, 0x02, 0x00, 0x00,
+ 0x06, 0x06, 0x06, 0x05, 0x03, 0x02, 0x01, 0x00,
+ 0x06, 0x06, 0x06, 0x06, 0x04, 0x02, 0x01, 0x00,
+ 0x07, 0x07, 0x07, 0x06, 0x04, 0x03, 0x01, 0x00,
+ 0x07, 0x07, 0x07, 0x07, 0x05, 0x03, 0x02, 0x00
+};
+
+static const ByteProvider kEoB2NumSpellsClericDOSProvider = { ARRAYSIZE(kEoB2NumSpellsClericDOS), kEoB2NumSpellsClericDOS };
+
+static const byte kEoB2NumSpellsWisAdjDOS[64] = {
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x02, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x02, 0x02, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x02, 0x02, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00,
+ 0x03, 0x02, 0x01, 0x02, 0x00, 0x00, 0x00, 0x00
+};
+
+static const ByteProvider kEoB2NumSpellsWisAdjDOSProvider = { ARRAYSIZE(kEoB2NumSpellsWisAdjDOS), kEoB2NumSpellsWisAdjDOS };
+
+static const byte kEoB2NumSpellsPalDOS[136] = {
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x02, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x02, 0x02, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x03, 0x02, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x03, 0x02, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00,
+ 0x03, 0x03, 0x02, 0x01, 0x00, 0x00, 0x00, 0x00,
+ 0x03, 0x03, 0x03, 0x01, 0x00, 0x00, 0x00, 0x00
+};
+
+static const ByteProvider kEoB2NumSpellsPalDOSProvider = { ARRAYSIZE(kEoB2NumSpellsPalDOS), kEoB2NumSpellsPalDOS };
+
+static const byte kEoB2NumSpellsMageDOS[276] = {
+ 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x02, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x03, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x04, 0x02, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x04, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x04, 0x03, 0x02, 0x01, 0x00, 0x00, 0x00, 0x00,
+ 0x04, 0x03, 0x03, 0x02, 0x00, 0x00, 0x00, 0x00,
+ 0x04, 0x03, 0x03, 0x02, 0x01, 0x00, 0x00, 0x00,
+ 0x04, 0x04, 0x03, 0x02, 0x02, 0x00, 0x00, 0x00,
+ 0x04, 0x04, 0x04, 0x03, 0x03, 0x00, 0x00, 0x00,
+ 0x04, 0x04, 0x04, 0x04, 0x04, 0x01, 0x00, 0x00,
+ 0x05, 0x05, 0x05, 0x04, 0x04, 0x02, 0x00, 0x00,
+ 0x05, 0x05, 0x05, 0x04, 0x04, 0x02, 0x01, 0x00,
+ 0x05, 0x05, 0x05, 0x05, 0x05, 0x02, 0x01, 0x00,
+ 0x05, 0x05, 0x05, 0x05, 0x05, 0x03, 0x02, 0x01,
+ 0x05, 0x05, 0x05, 0x05, 0x05, 0x03, 0x03, 0x02,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00
+};
+
+static const ByteProvider kEoB2NumSpellsMageDOSProvider = { ARRAYSIZE(kEoB2NumSpellsMageDOS), kEoB2NumSpellsMageDOS };
+
+static const uint32 kEoB2ExperienceTable0DOS[14] = {
+ 0x00000000, 0x000007D0, 0x00000FA0, 0x00001F40, 0x00003E80, 0x00007D00, 0x0000FA00, 0x0001E848,
+ 0x0003D090, 0x0007A120, 0x000B71B0, 0x000F4240, 0x001312D0, 0xFFFFFFFF
+};
+
+static const Uint32Provider kEoB2ExperienceTable0DOSProvider = { ARRAYSIZE(kEoB2ExperienceTable0DOS), kEoB2ExperienceTable0DOS };
+
+static const uint32 kEoB2ExperienceTable1DOS[14] = {
+ 0x00000000, 0x000009C4, 0x00001388, 0x00002710, 0x00004E20, 0x00009C40, 0x0000EA60, 0x00015F90,
+ 0x00020F58, 0x0003D090, 0x0005B8D8, 0x000B71B0, 0x00112A88, 0xFFFFFFFF
+};
+
+static const Uint32Provider kEoB2ExperienceTable1DOSProvider = { ARRAYSIZE(kEoB2ExperienceTable1DOS), kEoB2ExperienceTable1DOS };
+
+static const uint32 kEoB2ExperienceTable2DOS[14] = {
+ 0x00000000, 0x000005DC, 0x00000BB8, 0x00001770, 0x000032C8, 0x00006B6C, 0x0000D6D8, 0x0001ADB0,
+ 0x00036EE8, 0x0006DDD0, 0x000A4CB8, 0x000DBBA0, 0x00112A88, 0xFFFFFFFF
+};
+
+static const Uint32Provider kEoB2ExperienceTable2DOSProvider = { ARRAYSIZE(kEoB2ExperienceTable2DOS), kEoB2ExperienceTable2DOS };
+
+static const uint32 kEoB2ExperienceTable3DOS[14] = {
+ 0x00000000, 0x000004E2, 0x000009C4, 0x00001388, 0x00002710, 0x00004E20, 0x00009C40, 0x00011170,
+ 0x0001ADB0, 0x00027100, 0x00035B60, 0x0006B6C0, 0x000A1220, 0xFFFFFFFF
+};
+
+static const Uint32Provider kEoB2ExperienceTable3DOSProvider = { ARRAYSIZE(kEoB2ExperienceTable3DOS), kEoB2ExperienceTable3DOS };
+
+static const uint32 kEoB2ExperienceTable4DOS[14] = {
+ 0x00000000, 0x000008CA, 0x00001194, 0x00002328, 0x00004650, 0x00008CA0, 0x000124F8, 0x000249F0,
+ 0x000493E0, 0x000927C0, 0x000DBBA0, 0x00124F80, 0x0016E360, 0xFFFFFFFF
+};
+
+static const Uint32Provider kEoB2ExperienceTable4DOSProvider = { ARRAYSIZE(kEoB2ExperienceTable4DOS), kEoB2ExperienceTable4DOS };
+
+static const byte kEoB2ExpObjectTlModeDOS[18] = {
+ 0x00, 0x00, 0x01, 0x02, 0x01, 0x00, 0x00, 0x00,
+ 0x01, 0x02, 0x01, 0x00, 0x00, 0x02, 0x00, 0x00,
+ 0x02, 0x00
+};
+
+static const ByteProvider kEoB2ExpObjectTlModeDOSProvider = { ARRAYSIZE(kEoB2ExpObjectTlModeDOS), kEoB2ExpObjectTlModeDOS };
+
+static const byte kEoB2ExpObjectTblIndexDOS[14] = {
+ 0x02, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+};
+
+static const ByteProvider kEoB2ExpObjectTblIndexDOSProvider = { ARRAYSIZE(kEoB2ExpObjectTblIndexDOS), kEoB2ExpObjectTblIndexDOS };
+
+static const byte kEoB2ExpObjectShpStartDOS[4] = {
+ 0x07, 0x0C, 0x0F, 0x12
+};
+
+static const ByteProvider kEoB2ExpObjectShpStartDOSProvider = { ARRAYSIZE(kEoB2ExpObjectShpStartDOS), kEoB2ExpObjectShpStartDOS };
+
+static const byte kEoB2ExpObjectTbl1DOS[13] = {
+ 0x0F, 0x05, 0x0F, 0x05, 0x06, 0x05, 0x06, 0x08,
+ 0x06, 0x08, 0x06, 0x08, 0x00
+};
+
+static const ByteProvider kEoB2ExpObjectTbl1DOSProvider = { ARRAYSIZE(kEoB2ExpObjectTbl1DOS), kEoB2ExpObjectTbl1DOS };
+
+static const byte kEoB2ExpObjectTbl2DOS[10] = {
+ 0x0F, 0x09, 0x0F, 0x09, 0x02, 0x0A, 0x0B, 0x0A,
+ 0x0B, 0x00
+};
+
+static const ByteProvider kEoB2ExpObjectTbl2DOSProvider = { ARRAYSIZE(kEoB2ExpObjectTbl2DOS), kEoB2ExpObjectTbl2DOS };
+
+static const byte kEoB2ExpObjectTbl3DOS[11] = {
+ 0x05, 0x03, 0x05, 0x03, 0x03, 0x03, 0x03, 0x0B,
+ 0x03, 0x0B, 0x00
+};
+
+static const ByteProvider kEoB2ExpObjectTbl3DOSProvider = { ARRAYSIZE(kEoB2ExpObjectTbl3DOS), kEoB2ExpObjectTbl3DOS };
+
+static const byte kEoB2ExpObjectYDOS[4] = {
+ 0x77, 0x67, 0x4F, 0x3F
+};
+
+static const ByteProvider kEoB2ExpObjectYDOSProvider = { ARRAYSIZE(kEoB2ExpObjectYDOS), kEoB2ExpObjectYDOS };
+
+static const byte kEoB2SparkDefStepsDOS[8] = {
+ 0x40, 0x90, 0xE4, 0xB9, 0x6E, 0x1B, 0x06, 0x01
+};
+
+static const ByteProvider kEoB2SparkDefStepsDOSProvider = { ARRAYSIZE(kEoB2SparkDefStepsDOS), kEoB2SparkDefStepsDOS };
+
+static const byte kEoB2SparkDefSubStepsDOS[4] = {
+ 0xC0, 0x30, 0x0C, 0x03
+};
+
+static const ByteProvider kEoB2SparkDefSubStepsDOSProvider = { ARRAYSIZE(kEoB2SparkDefSubStepsDOS), kEoB2SparkDefSubStepsDOS };
+
+static const byte kEoB2SparkDefShiftDOS[4] = {
+ 0x06, 0x04, 0x02, 0x00
+};
+
+static const ByteProvider kEoB2SparkDefShiftDOSProvider = { ARRAYSIZE(kEoB2SparkDefShiftDOS), kEoB2SparkDefShiftDOS };
+
+static const byte kEoB2SparkDefAddDOS[8] = {
+ 0x08, 0x06, 0x1C, 0x14, 0x0D, 0x18, 0x0D, 0x0F
+};
+
+static const ByteProvider kEoB2SparkDefAddDOSProvider = { ARRAYSIZE(kEoB2SparkDefAddDOS), kEoB2SparkDefAddDOS };
+
+static const byte kEoB2SparkDefXDOS[6] = {
+ 0x17, 0x20, 0x17, 0x20, 0x17, 0x20
+};
+
+static const ByteProvider kEoB2SparkDefXDOSProvider = { ARRAYSIZE(kEoB2SparkDefXDOS), kEoB2SparkDefXDOS };
+
+static const byte kEoB2SparkDefYDOS[6] = {
+ 0x02, 0x02, 0x34, 0x34, 0x66, 0x66
+};
+
+static const ByteProvider kEoB2SparkDefYDOSProvider = { ARRAYSIZE(kEoB2SparkDefYDOS), kEoB2SparkDefYDOS };
+
+static const uint32 kEoB2SparkOfFlags1DOS[11] = {
+ 0x40000000, 0x95000000, 0xEA550000, 0xBFAA5400, 0x6AFFA954, 0x15AAFEA9, 0x0055ABFE, 0x000056AB,
+ 0x00000156, 0x00000001, 0x00000000
+};
+
+static const Uint32Provider kEoB2SparkOfFlags1DOSProvider = { ARRAYSIZE(kEoB2SparkOfFlags1DOS), kEoB2SparkOfFlags1DOS };
+
+static const uint32 kEoB2SparkOfFlags2DOS[16] = {
+ 0xC0000000, 0x30000000, 0x0C000000, 0x03000000, 0x00C00000, 0x00300000, 0x000C0000, 0x00030000,
+ 0x0000C000, 0x00003000, 0x00000C00, 0x00000300, 0x000000C0, 0x00000030, 0x0000000C, 0x00000003
+};
+
+static const Uint32Provider kEoB2SparkOfFlags2DOSProvider = { ARRAYSIZE(kEoB2SparkOfFlags2DOS), kEoB2SparkOfFlags2DOS };
+
+static const byte kEoB2SparkOfShiftDOS[16] = {
+ 0x1E, 0x1C, 0x1A, 0x18, 0x16, 0x14, 0x12, 0x10,
+ 0x0E, 0x0C, 0x0A, 0x08, 0x06, 0x04, 0x02, 0x00
+};
+
+static const ByteProvider kEoB2SparkOfShiftDOSProvider = { ARRAYSIZE(kEoB2SparkOfShiftDOS), kEoB2SparkOfShiftDOS };
+
+static const byte kEoB2SparkOfXDOS[16] = {
+ 0x50, 0x70, 0x30, 0x68, 0x20, 0x60, 0x38, 0x78,
+ 0x80, 0x48, 0x58, 0x28, 0x60, 0x40, 0x70, 0x48
+};
+
+static const ByteProvider kEoB2SparkOfXDOSProvider = { ARRAYSIZE(kEoB2SparkOfXDOS), kEoB2SparkOfXDOS };
+
+static const byte kEoB2SparkOfYDOS[16] = {
+ 0x31, 0x2B, 0x48, 0x17, 0x16, 0x48, 0x35, 0x1B,
+ 0x43, 0x2E, 0x24, 0x28, 0x38, 0x1C, 0x16, 0x44
+};
+
+static const ByteProvider kEoB2SparkOfYDOSProvider = { ARRAYSIZE(kEoB2SparkOfYDOS), kEoB2SparkOfYDOS };
+
+static const byte kEoB2SpellPropertiesDOS[1750] = {
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0xFE, 0x2B, 0x16, 0x2B, 0x60, 0x00, 0xA7,
+ 0x13, 0x33, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x5C, 0x01, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x04, 0x2C, 0x16, 0x2B, 0xC3, 0x00,
+ 0xA7, 0x13, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x57, 0x00, 0x00, 0x00,
+ 0x00, 0x21, 0x00, 0x12, 0x2C, 0x16, 0x2B, 0x9D,
+ 0x01, 0xA7, 0x13, 0x4C, 0x00, 0x00, 0x00, 0x95,
+ 0x29, 0xBB, 0x01, 0xA7, 0x13, 0x5F, 0x02, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x1F, 0x2C, 0x16, 0x2B,
+ 0xD9, 0x01, 0xA7, 0x13, 0x00, 0x01, 0x00, 0x00,
+ 0x00, 0x00, 0xFA, 0x01, 0xA7, 0x13, 0x55, 0x00,
+ 0x00, 0x00, 0x00, 0x01, 0x00, 0x2D, 0x2C, 0x16,
+ 0x2B, 0x00, 0x00, 0x00, 0x00, 0x8B, 0x00, 0x00,
+ 0x00, 0x96, 0x29, 0x00, 0x00, 0x00, 0x00, 0x5C,
+ 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x34, 0x2C,
+ 0x16, 0x2B, 0x2D, 0x02, 0xA7, 0x13, 0x88, 0x04,
+ 0x00, 0x00, 0x97, 0x29, 0xE4, 0x02, 0xA7, 0x13,
+ 0x58, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x43,
+ 0x2C, 0x16, 0x2B, 0x00, 0x00, 0x00, 0x00, 0x89,
+ 0x00, 0x00, 0x00, 0x98, 0x29, 0x00, 0x00, 0x00,
+ 0x00, 0x4B, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x48, 0x2C, 0x16, 0x2B, 0x00, 0x00, 0x00, 0x00,
+ 0x4C, 0x00, 0x00, 0x00, 0x9A, 0x29, 0x00, 0x00,
+ 0x00, 0x00, 0x5F, 0x20, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x5C, 0x2C, 0x16, 0x2B, 0x2C, 0x00, 0xA7,
+ 0x13, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x14, 0x40, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x6E, 0x2C, 0x16, 0x2B, 0x00, 0x00,
+ 0x00, 0x00, 0x21, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x5E, 0x40, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x7B, 0x2C, 0x16, 0x2B, 0x2B,
+ 0x03, 0xA7, 0x13, 0x00, 0x01, 0x00, 0x00, 0x00,
+ 0x00, 0x4D, 0x03, 0xA7, 0x13, 0x60, 0x00, 0x00,
+ 0x00, 0x00, 0x11, 0x00, 0x8D, 0x2C, 0x16, 0x2B,
+ 0x02, 0x00, 0xA7, 0x13, 0x00, 0x10, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x61, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x9A, 0x2C, 0x16,
+ 0x2B, 0x82, 0x03, 0xA7, 0x13, 0x00, 0x01, 0x00,
+ 0x00, 0x00, 0x00, 0xA4, 0x03, 0xA7, 0x13, 0x63,
+ 0x00, 0x00, 0x00, 0x00, 0x21, 0x00, 0xA3, 0x2C,
+ 0x16, 0x2B, 0x00, 0x00, 0x00, 0x00, 0x48, 0x02,
+ 0x00, 0x00, 0x99, 0x29, 0x00, 0x00, 0x00, 0x00,
+ 0x64, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0xA9,
+ 0x2C, 0x16, 0x2B, 0xD3, 0x03, 0xA7, 0x13, 0x00,
+ 0x01, 0x00, 0x00, 0x00, 0x00, 0xF5, 0x03, 0xA7,
+ 0x13, 0x65, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0xB5, 0x2C, 0x16, 0x2B, 0x00, 0x00, 0x00, 0x00,
+ 0x40, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x5E, 0x40, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0xCD, 0x2C, 0x16, 0x2B, 0xFA, 0x04, 0xA7,
+ 0x13, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x1C,
+ 0x05, 0xA7, 0x13, 0x47, 0x00, 0x00, 0x00, 0x00,
+ 0x03, 0x00, 0xDC, 0x2C, 0x16, 0x2B, 0x4B, 0x05,
+ 0xA7, 0x13, 0x88, 0x04, 0x00, 0x00, 0x9B, 0x29,
+ 0x04, 0x06, 0xA7, 0x13, 0x66, 0x00, 0x00, 0x00,
+ 0x00, 0x01, 0x00, 0xEB, 0x2C, 0x16, 0x2B, 0x2B,
+ 0x06, 0xA7, 0x13, 0x00, 0x01, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x67, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xF0, 0x2C, 0x16, 0x2B,
+ 0x89, 0x06, 0xA7, 0x13, 0x00, 0x01, 0x00, 0x00,
+ 0x00, 0x00, 0xAB, 0x06, 0xA7, 0x13, 0x59, 0x00,
+ 0x00, 0x00, 0x00, 0x41, 0x00, 0xFA, 0x2C, 0x16,
+ 0x2B, 0x00, 0x00, 0x00, 0x00, 0x29, 0x00, 0x00,
+ 0x00, 0x9C, 0x29, 0x00, 0x00, 0x00, 0x00, 0x08,
+ 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x10, 0x2D,
+ 0x16, 0x2B, 0x3C, 0x07, 0xA7, 0x13, 0x20, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x53, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1D,
+ 0x2D, 0x16, 0x2B, 0x9F, 0x07, 0xA7, 0x13, 0x00,
+ 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x76, 0x00, 0x00, 0x00, 0x00, 0x41, 0x00,
+ 0x2A, 0x2D, 0x16, 0x2B, 0x94, 0x08, 0xA7, 0x13,
+ 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0xB6, 0x08,
+ 0xA7, 0x13, 0x65, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x37, 0x2D, 0x16, 0x2B, 0xD0, 0x09, 0xA7,
+ 0x13, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x4A, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x45, 0x2D, 0x16, 0x2B, 0x25, 0x0B,
+ 0xA7, 0x13, 0x00, 0x11, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x77, 0x00, 0x00, 0x00,
+ 0x00, 0x01, 0x00, 0x52, 0x2D, 0x16, 0x2B, 0x89,
+ 0x0B, 0xA7, 0x13, 0x00, 0x01, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x44, 0x00, 0x00,
+ 0x00, 0x00, 0x01, 0x00, 0x61, 0x2D, 0x16, 0x2B,
+ 0xF1, 0x0B, 0xA7, 0x13, 0x20, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x45, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x70, 0x2D, 0x16,
+ 0x2B, 0x0D, 0x0C, 0xA7, 0x13, 0x4C, 0x00, 0x00,
+ 0x00, 0x9D, 0x29, 0x1C, 0x0C, 0xA7, 0x13, 0x49,
+ 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x7C, 0x2D,
+ 0x16, 0x2B, 0x2B, 0x0C, 0xA7, 0x13, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x8C,
+ 0x2D, 0x16, 0x2B, 0x98, 0x0C, 0xA7, 0x13, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x9C, 0x2D, 0x16, 0x2B, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0xB2, 0x2D, 0x16, 0x2B, 0x00, 0x00,
+ 0x00, 0x00, 0x5C, 0x00, 0x00, 0x00, 0x9E, 0x29,
+ 0x00, 0x00, 0x00, 0x00, 0x5B, 0x00, 0x04, 0x00,
+ 0x00, 0x00, 0x00, 0xB8, 0x2D, 0x16, 0x2B, 0xDE,
+ 0x0C, 0xA7, 0x13, 0x00, 0x01, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x6B, 0x00, 0x00,
+ 0x00, 0x00, 0x01, 0x00, 0xCB, 0x2D, 0x16, 0x2B,
+ 0xF6, 0x0C, 0xA7, 0x13, 0x20, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x68, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0xDD, 0x2D, 0x16,
+ 0x2B, 0x9D, 0x01, 0xA7, 0x13, 0x4C, 0x00, 0x00,
+ 0x00, 0x95, 0x29, 0xBB, 0x01, 0xA7, 0x13, 0x5F,
+ 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0xEA, 0x2D,
+ 0x16, 0x2B, 0x00, 0x00, 0x00, 0x00, 0x29, 0x00,
+ 0x00, 0x00, 0x9F, 0x29, 0x00, 0x00, 0x00, 0x00,
+ 0x6E, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0xFF,
+ 0x2D, 0x16, 0x2B, 0x1A, 0x0D, 0xA7, 0x13, 0x39,
+ 0x00, 0x00, 0x00, 0xA0, 0x29, 0xC9, 0x0D, 0xA7,
+ 0x13, 0x5B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x03, 0x2E, 0x16, 0x2B, 0xEF, 0x0D, 0xA7, 0x13,
+ 0x08, 0x24, 0x00, 0x00, 0xA1, 0x29, 0xE4, 0x02,
+ 0xA7, 0x13, 0x63, 0x00, 0x00, 0x00, 0x00, 0x21,
+ 0x00, 0x0F, 0x2E, 0x16, 0x2B, 0xD3, 0x03, 0xA7,
+ 0x13, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0xF5,
+ 0x03, 0xA7, 0x13, 0x65, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x1B, 0x2E, 0x16, 0x2B, 0x99, 0x0E,
+ 0xA7, 0x13, 0x28, 0x00, 0x00, 0x00, 0xA2, 0x29,
+ 0xF2, 0x0E, 0xA7, 0x13, 0x6F, 0x00, 0x20, 0x00,
+ 0x00, 0x00, 0x00, 0x27, 0x2E, 0x16, 0x2B, 0x08,
+ 0x0F, 0xA7, 0x13, 0x40, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x70, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x33, 0x2E, 0x16, 0x2B,
+ 0x02, 0x00, 0xA7, 0x13, 0x00, 0x10, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x61, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x2E, 0x16,
+ 0x2B, 0x00, 0x00, 0x00, 0x00, 0x99, 0x00, 0x00,
+ 0x00, 0xA3, 0x29, 0x00, 0x00, 0x00, 0x00, 0x71,
+ 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x51, 0x2E,
+ 0x16, 0x2B, 0x00, 0x00, 0x00, 0x00, 0x4C, 0x00,
+ 0x00, 0x00, 0xA4, 0x29, 0x00, 0x00, 0x00, 0x00,
+ 0x5B, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x58,
+ 0x2E, 0x16, 0x2B, 0x38, 0x0F, 0xA7, 0x13, 0x40,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x72, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x69, 0x2E, 0x16, 0x2B, 0x95, 0x0F, 0xA7, 0x13,
+ 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x6C, 0x00, 0x00, 0x00, 0x00, 0x01,
+ 0x00, 0x7E, 0x2E, 0x16, 0x2B, 0x71, 0x0F, 0xA7,
+ 0x13, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x69, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x92, 0x2E, 0x16, 0x2B, 0xAE, 0x0F,
+ 0xA7, 0x13, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x73, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0xA4, 0x2E, 0x16, 0x2B, 0x00,
+ 0x00, 0x00, 0x00, 0x48, 0x02, 0x00, 0x00, 0x9F,
+ 0x29, 0x00, 0x00, 0x00, 0x00, 0x6E, 0x00, 0x08,
+ 0x00, 0x00, 0x00, 0x00, 0xC4, 0x2E, 0x16, 0x2B,
+ 0xD1, 0x0F, 0xA7, 0x13, 0x00, 0x01, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x6D, 0x00,
+ 0x00, 0x00, 0x00, 0x01, 0x00, 0xDA, 0x2E, 0x16,
+ 0x2B, 0xEA, 0x0F, 0xA7, 0x13, 0x20, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x6A,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xEF, 0x2E,
+ 0x16, 0x2B, 0x0E, 0x10, 0xA7, 0x13, 0x00, 0x01,
+ 0x00, 0x00, 0x00, 0x00, 0x30, 0x10, 0xA7, 0x13,
+ 0x62, 0x00, 0x00, 0x00, 0x00, 0x21, 0x00, 0xFC,
+ 0x2E, 0x16, 0x2B, 0x4F, 0x10, 0xA7, 0x13, 0x20,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x75, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x07, 0x2F, 0x16, 0x2B, 0x2B, 0x0C, 0xA7, 0x13,
+ 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x48, 0x00, 0x00, 0x00, 0x00, 0x01,
+ 0x00, 0x13, 0x2F, 0x16, 0x2B, 0x0D, 0x0C, 0xA7,
+ 0x13, 0x4C, 0x00, 0x00, 0x00, 0x9D, 0x29, 0x1C,
+ 0x0C, 0xA7, 0x13, 0x49, 0x00, 0x02, 0x00, 0x00,
+ 0x00, 0x00, 0x1F, 0x2F, 0x16, 0x2B, 0x84, 0x10,
+ 0xA7, 0x13, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x46, 0x00, 0x00, 0x00,
+ 0x00, 0x01, 0x00, 0x24, 0x2F, 0x16, 0x2B, 0x97,
+ 0x10, 0xA7, 0x13, 0x20, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x54, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x29, 0x2F, 0x16, 0x2B,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x36, 0x2F, 0x16,
+ 0x2B, 0xA8, 0x13, 0xA7, 0x13, 0x20, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5B,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x43, 0x2F,
+ 0x16, 0x2B, 0xE6, 0x10, 0xA7, 0x13, 0x00, 0x10,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x67, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4F,
+ 0x2F, 0x16, 0x2B, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0xCD, 0x13, 0xA7,
+ 0x13, 0x62, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x50, 0x2F, 0x16, 0x2B, 0x00, 0x00, 0x00, 0x00,
+ 0x4C, 0x00, 0x00, 0x00, 0xA5, 0x29, 0x00, 0x00,
+ 0x00, 0x00, 0x5B, 0x00, 0x00, 0x02, 0x00, 0x00,
+ 0x00, 0x5F, 0x2F, 0x16, 0x2B, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3D,
+ 0x14, 0xA7, 0x13, 0x62, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x60, 0x2F, 0x16, 0x2B, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x6A, 0x12, 0xA7, 0x13, 0x65, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x61, 0x2F, 0x16, 0x2B, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0xF6, 0x11, 0xA7, 0x13, 0x65, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x62, 0x2F, 0x16, 0x2B,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0xE1, 0x12, 0xA7, 0x13, 0x65, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x63, 0x2F, 0x16,
+ 0x2B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x43, 0x13, 0xA7, 0x13, 0x65,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+};
+
+static const ByteProvider kEoB2SpellPropertiesDOSProvider = { ARRAYSIZE(kEoB2SpellPropertiesDOS), kEoB2SpellPropertiesDOS };
+
+static const byte kEoB2MagicFlightPropsDOS[56] = {
+ 0x04, 0xFF, 0x41, 0x0C, 0x0B, 0xFF, 0x04, 0x06,
+ 0x0D, 0xFF, 0x7A, 0x09, 0x0F, 0xFF, 0x4A, 0x08,
+ 0x11, 0x06, 0x38, 0x0A, 0x14, 0x06, 0x7A, 0x0B,
+ 0x18, 0xFF, 0x4A, 0x08, 0x36, 0xFF, 0x4B, 0x09,
+ 0x3F, 0xFF, 0x4B, 0x09, 0x41, 0x06, 0x4B, 0x09,
+ 0x42, 0x06, 0x4B, 0x08, 0x43, 0x06, 0x4B, 0x08,
+ 0x44, 0x06, 0x4B, 0x08, 0x45, 0x06, 0x4B, 0x08
+};
+
+static const ByteProvider kEoB2MagicFlightPropsDOSProvider = { ARRAYSIZE(kEoB2MagicFlightPropsDOS), kEoB2MagicFlightPropsDOS };
+
+static const byte kEoB2TurnUndeadEffectDOS[140] = {
+ 0x0A, 0x07, 0x04, 0x00, 0x00, 0xFF, 0xFF, 0xFF,
+ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x0D, 0x0A,
+ 0x07, 0x04, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF,
+ 0xFF, 0xFF, 0xFF, 0xFF, 0x10, 0x0D, 0x0A, 0x07,
+ 0x04, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+ 0xFF, 0xFF, 0x13, 0x10, 0x0D, 0x0A, 0x07, 0x04,
+ 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+ 0x14, 0x13, 0x10, 0x0D, 0x0A, 0x07, 0x04, 0x00,
+ 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x63, 0x14,
+ 0x13, 0x10, 0x0D, 0x0A, 0x07, 0x04, 0x00, 0x00,
+ 0x00, 0xFF, 0xFF, 0x00, 0x63, 0x63, 0x14, 0x13,
+ 0x10, 0x0D, 0x0A, 0x07, 0x04, 0x00, 0x00, 0x00,
+ 0x00, 0xFF, 0x63, 0x63, 0x63, 0x14, 0x13, 0x10,
+ 0x0D, 0x0A, 0x07, 0x04, 0x04, 0x00, 0x00, 0x00,
+ 0x63, 0x63, 0x63, 0x63, 0x14, 0x13, 0x10, 0x0D,
+ 0x0A, 0x07, 0x07, 0x04, 0x04, 0x00, 0x63, 0x63,
+ 0x63, 0x63, 0x63, 0x14, 0x13, 0x10, 0x0D, 0x0A,
+ 0x0A, 0x07, 0x07, 0x04
+};
+
+static const ByteProvider kEoB2TurnUndeadEffectDOSProvider = { ARRAYSIZE(kEoB2TurnUndeadEffectDOS), kEoB2TurnUndeadEffectDOS };
+
+static const byte kEoB2BurningHandsDestDOS[32] = {
+ 0x02, 0x03, 0x04, 0x01, 0x02, 0x05, 0x00, 0x00,
+ 0x00, 0x02, 0x04, 0x01, 0x03, 0x05, 0x00, 0x00,
+ 0x00, 0x01, 0x04, 0x02, 0x03, 0x05, 0x00, 0x00,
+ 0x01, 0x03, 0x04, 0x00, 0x02, 0x05, 0x00, 0x00
+};
+
+static const ByteProvider kEoB2BurningHandsDestDOSProvider = { ARRAYSIZE(kEoB2BurningHandsDestDOS), kEoB2BurningHandsDestDOS };
+
+static const byte kEoB2ConeOfColdDest1DOS[7] = {
+ 0xE0, 0xC0, 0xC1, 0xBF, 0xA0, 0x9F, 0xA1
+};
+
+static const ByteProvider kEoB2ConeOfColdDest1DOSProvider = { ARRAYSIZE(kEoB2ConeOfColdDest1DOS), kEoB2ConeOfColdDest1DOS };
+
+static const byte kEoB2ConeOfColdDest2DOS[7] = {
+ 0x01, 0x02, 0xE2, 0x22, 0x03, 0xE3, 0x23
+};
+
+static const ByteProvider kEoB2ConeOfColdDest2DOSProvider = { ARRAYSIZE(kEoB2ConeOfColdDest2DOS), kEoB2ConeOfColdDest2DOS };
+
+static const byte kEoB2ConeOfColdDest3DOS[7] = {
+ 0x20, 0x40, 0x3F, 0x41, 0x60, 0x5F, 0x61
+};
+
+static const ByteProvider kEoB2ConeOfColdDest3DOSProvider = { ARRAYSIZE(kEoB2ConeOfColdDest3DOS), kEoB2ConeOfColdDest3DOS };
+
+static const byte kEoB2ConeOfColdDest4DOS[7] = {
+ 0xFF, 0xFE, 0x1E, 0xDE, 0xFD, 0x1D, 0xDD
+};
+
+static const ByteProvider kEoB2ConeOfColdDest4DOSProvider = { ARRAYSIZE(kEoB2ConeOfColdDest4DOS), kEoB2ConeOfColdDest4DOS };
+
+static const byte kEoB2ConeOfColdGfxTblDOS[8] = {
+ 0x0F, 0x09, 0x0F, 0x09, 0x02, 0x0A, 0x02, 0x00
+};
+
+static const ByteProvider kEoB2ConeOfColdGfxTblDOSProvider = { ARRAYSIZE(kEoB2ConeOfColdGfxTblDOS), kEoB2ConeOfColdGfxTblDOS };
+
+static const byte kEoB2DscDoorShapeIndexDOS[53] = {
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01,
+ 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x01
+};
+
+static const ByteProvider kEoB2DscDoorShapeIndexDOSProvider = { ARRAYSIZE(kEoB2DscDoorShapeIndexDOS), kEoB2DscDoorShapeIndexDOS };
+
+static const byte kEoB2WllFlagPresetDOS[25] = {
+ 0x07, 0x00, 0x40, 0xA8, 0x88, 0x88, 0x88, 0x9F,
+ 0xA8, 0x88, 0x88, 0x88, 0x9F, 0xA8, 0x88, 0x88,
+ 0x88, 0x9F, 0xA8, 0x88, 0x88, 0x88, 0x9F, 0x03,
+ 0x03
+};
+
+static const ByteProvider kEoB2WllFlagPresetDOSProvider = { ARRAYSIZE(kEoB2WllFlagPresetDOS), kEoB2WllFlagPresetDOS };
+
+static const uint16 kEoB2DscShapeCoordsDOS[180] = {
+ 0xFF91, 0xFFC1, 0xFFA1, 0xFFC1, 0xFF75, 0xFFC5, 0xFF8B, 0xFFC5,
+ 0xFF88, 0xFFC3, 0xFFB4, 0xFFC1, 0xFFC4, 0xFFC1, 0xFFA1, 0xFFC5,
+ 0xFFB6, 0xFFC5, 0xFFB0, 0xFFC3, 0xFFD5, 0xFFC1, 0xFFE5, 0xFFC1,
+ 0xFFCB, 0xFFC5, 0xFFE1, 0xFFC5, 0xFFD8, 0xFFC3, 0xFFF8, 0xFFC1,
+ 0x0008, 0xFFC1, 0xFFF6, 0xFFC5, 0x000A, 0xFFC5, 0x0000, 0xFFC3,
+ 0x001B, 0xFFC1, 0x002B, 0xFFC1, 0x001F, 0xFFC5, 0x0035, 0xFFC5,
+ 0x0028, 0xFFC3, 0x003C, 0xFFC1, 0x004C, 0xFFC1, 0x004A, 0xFFC5,
+ 0x005F, 0xFFC5, 0x0050, 0xFFC3, 0x005F, 0xFFC1, 0x006F, 0xFFC1,
+ 0x0075, 0xFFC5, 0x008B, 0xFFC5, 0x0078, 0xFFC3, 0xFF8A, 0xFFCB,
+ 0xFFA4, 0xFFCB, 0xFF68, 0xFFD3, 0xFF88, 0xFFD3, 0xFF8A, 0xFFCE,
+ 0xFFBE, 0xFFCB, 0xFFD8, 0xFFCB, 0xFFAC, 0xFFD3, 0xFFCD, 0xFFD3,
+ 0xFFC5, 0xFFCE, 0xFFF3, 0xFFCB, 0x000D, 0xFFCB, 0xFFF0, 0xFFD3,
+ 0x0010, 0xFFD3, 0x0000, 0xFFCE, 0x0028, 0xFFCB, 0x0042, 0xFFCB,
+ 0x0033, 0xFFD3, 0x0054, 0xFFD3, 0x003B, 0xFFCE, 0x005C, 0xFFCB,
+ 0x0076, 0xFFCB, 0x0078, 0xFFD3, 0x0098, 0xFFD3, 0x0076, 0xFFCE,
+ 0xFF92, 0xFFDD, 0xFFBD, 0xFFDD, 0xFF74, 0xFFEA, 0xFFAD, 0xFFEA,
+ 0xFF9E, 0xFFE2, 0xFFEA, 0xFFDD, 0x0016, 0xFFDD, 0xFFE5, 0xFFEA,
+ 0x001B, 0xFFEA, 0x0000, 0xFFE2, 0x0043, 0xFFDD, 0x006E, 0xFFDD,
+ 0x0053, 0xFFEA, 0x008C, 0xFFEA, 0x0062, 0xFFE2, 0xFF80, 0xFFFC,
+ 0x0080, 0xFFFC, 0xFF80, 0xFFBE, 0x0080, 0xFFBE, 0x0080, 0x0000,
+ 0xFFDA, 0xFFFC, 0x0026, 0xFFFC, 0xFFDA, 0xFFBE, 0x0026, 0xFFBE,
+ 0x0000, 0x0000, 0xFF80, 0xFFFC, 0x0080, 0xFFFC, 0xFF80, 0xFFBE,
+ 0x0080, 0xFFBE, 0x0080, 0x0000
+};
+
+static const Uint16Provider kEoB2DscShapeCoordsDOSProvider = { ARRAYSIZE(kEoB2DscShapeCoordsDOS), kEoB2DscShapeCoordsDOS };
+
+static const byte kEoB2DscDoorScaleOffsDOS[53] = {
+ 0x00, 0x00, 0x00, 0x03, 0x03, 0x03, 0x03, 0x03,
+ 0x08, 0x08, 0x08, 0x08, 0x08, 0x0D, 0x0D, 0x0D,
+ 0x0D, 0x0D, 0x12, 0x12, 0x12, 0x12, 0x12, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x33, 0x34
+};
+
+static const ByteProvider kEoB2DscDoorScaleOffsDOSProvider = { ARRAYSIZE(kEoB2DscDoorScaleOffsDOS), kEoB2DscDoorScaleOffsDOS };
+
+static const byte kEoB2DscDoorScaleMult1DOS[4] = {
+ 0x08, 0x0C, 0x12, 0x00
+};
+
+static const ByteProvider kEoB2DscDoorScaleMult1DOSProvider = { ARRAYSIZE(kEoB2DscDoorScaleMult1DOS), kEoB2DscDoorScaleMult1DOS };
+
+static const byte kEoB2DscDoorScaleMult2DOS[4] = {
+ 0x00, 0x02, 0x04, 0x00
+};
+
+static const ByteProvider kEoB2DscDoorScaleMult2DOSProvider = { ARRAYSIZE(kEoB2DscDoorScaleMult2DOS), kEoB2DscDoorScaleMult2DOS };
+
+static const byte kEoB2DscDoorScaleMult3DOS[4] = {
+ 0x05, 0x08, 0x0C, 0x00
+};
+
+static const ByteProvider kEoB2DscDoorScaleMult3DOSProvider = { ARRAYSIZE(kEoB2DscDoorScaleMult3DOS), kEoB2DscDoorScaleMult3DOS };
+
+static const byte kEoB2DscDoorType5OffsDOS[6] = {
+ 0x05, 0x03, 0x01, 0x05, 0x03, 0x01
+};
+
+static const ByteProvider kEoB2DscDoorType5OffsDOSProvider = { ARRAYSIZE(kEoB2DscDoorType5OffsDOS), kEoB2DscDoorType5OffsDOS };
+
+static const byte kEoB2DscDoorY1DOS[4] = {
+ 0x3B, 0x47, 0x56, 0x00
+};
+
+static const ByteProvider kEoB2DscDoorY1DOSProvider = { ARRAYSIZE(kEoB2DscDoorY1DOS), kEoB2DscDoorY1DOS };
+
+static const byte kEoB2DscDoorY2DOS[4] = {
+ 0x1F, 0x18, 0x0F, 0x00
+};
+
+static const ByteProvider kEoB2DscDoorY2DOSProvider = { ARRAYSIZE(kEoB2DscDoorY2DOS), kEoB2DscDoorY2DOS };
+
+static const byte kEoB2DscDoorFrameY1DOS[4] = {
+ 0x1E, 0x18, 0x10, 0x00
+};
+
+static const ByteProvider kEoB2DscDoorFrameY1DOSProvider = { ARRAYSIZE(kEoB2DscDoorFrameY1DOS), kEoB2DscDoorFrameY1DOS };
+
+static const byte kEoB2DscDoorFrameY2DOS[4] = {
+ 0x3B, 0x47, 0x56, 0x78
+};
+
+static const ByteProvider kEoB2DscDoorFrameY2DOSProvider = { ARRAYSIZE(kEoB2DscDoorFrameY2DOS), kEoB2DscDoorFrameY2DOS };
+
+static const byte kEoB2DscItemPosIndexDOS[16] = {
+ 0x00, 0x01, 0x02, 0x03, 0x02, 0x00, 0x03, 0x01,
+ 0x03, 0x02, 0x01, 0x00, 0x01, 0x03, 0x00, 0x02
+};
+
+static const ByteProvider kEoB2DscItemPosIndexDOSProvider = { ARRAYSIZE(kEoB2DscItemPosIndexDOS), kEoB2DscItemPosIndexDOS };
+
+static const uint16 kEoB2DscItemShpXDOS[18] = {
+ 0xFFC8, 0xFFF8, 0x0028, 0x0058, 0x0088, 0x00B8, 0x00E8, 0xFFB8,
+ 0x0008, 0x0058, 0x00A8, 0x00F8, 0xFFD8, 0x0058, 0x00D8, 0xFFA8,
+ 0x0058, 0x0108
+};
+
+static const Uint16Provider kEoB2DscItemShpXDOSProvider = { ARRAYSIZE(kEoB2DscItemShpXDOS), kEoB2DscItemShpXDOS };
+
+static const byte kEoB2DscItemScaleIndexDOS[18] = {
+ 0xFF, 0xFF, 0x03, 0x03, 0x02, 0x02, 0x02, 0x02,
+ 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0xFF, 0xFF,
+ 0x25, 0x00
+};
+
+static const ByteProvider kEoB2DscItemScaleIndexDOSProvider = { ARRAYSIZE(kEoB2DscItemScaleIndexDOS), kEoB2DscItemScaleIndexDOS };
+
+static const byte kEoB2DscItemTileIndexDOS[18] = {
+ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+ 0xFF, 0x03, 0xFF, 0xFF, 0xFF, 0x09, 0xFF, 0x0B,
+ 0x0C, 0x0D
+};
+
+static const ByteProvider kEoB2DscItemTileIndexDOSProvider = { ARRAYSIZE(kEoB2DscItemTileIndexDOS), kEoB2DscItemTileIndexDOS };
+
+static const byte kEoB2DscItemShapeMapDOS[113] = {
+ 0x00, 0x00, 0x00, 0x05, 0x01, 0x02, 0x03, 0x04,
+ 0x03, 0x05, 0x06, 0x06, 0x12, 0x05, 0x0F, 0x12,
+ 0x14, 0x08, 0x13, 0x11, 0x15, 0x18, 0x07, 0x07,
+ 0x07, 0x1F, 0x09, 0x23, 0x09, 0x09, 0x09, 0x09,
+ 0x08, 0x1C, 0x1C, 0x1A, 0x1B, 0x21, 0x1D, 0x1D,
+ 0x22, 0x22, 0x22, 0x00, 0x16, 0x00, 0x00, 0x17,
+ 0x17, 0x17, 0x17, 0x17, 0x22, 0x21, 0x19, 0x23,
+ 0x10, 0x1E, 0x17, 0x25, 0x17, 0x26, 0x12, 0x21,
+ 0x17, 0x23, 0x1C, 0x00, 0x20, 0x25, 0x12, 0x18,
+ 0x1F, 0x07, 0x07, 0x15, 0x15, 0x0F, 0x03, 0x09,
+ 0x1E, 0x1E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1B,
+ 0x1B, 0x17, 0x17, 0x16, 0x16, 0x21, 0x08, 0x25,
+ 0x25, 0x25, 0x25, 0x28, 0x03, 0x04, 0x21, 0x00,
+ 0x17, 0x00, 0x20, 0x24, 0x27, 0x27, 0x1C, 0x27,
+ 0x00
+};
+
+static const ByteProvider kEoB2DscItemShapeMapDOSProvider = { ARRAYSIZE(kEoB2DscItemShapeMapDOS), kEoB2DscItemShapeMapDOS };
+
+static const byte kEoB2DscTelptrShpCoordsDOS[156] = {
+ 0x0C, 0x07, 0x1A, 0x01, 0x3E, 0x03, 0x0C, 0x1A,
+ 0x2A, 0x13, 0x40, 0x18, 0x02, 0x2D, 0x16, 0x25,
+ 0x28, 0x32, 0x36, 0x27, 0x0A, 0x3E, 0x16, 0x49,
+ 0x3E, 0x44, 0x06, 0x06, 0x2A, 0x04, 0x37, 0x0A,
+ 0x04, 0x1B, 0x1A, 0x16, 0x37, 0x1D, 0x0E, 0x2A,
+ 0x1B, 0x35, 0x2E, 0x28, 0x42, 0x30, 0x06, 0x47,
+ 0x06, 0x47, 0x2D, 0x4C, 0x0A, 0x04, 0x14, 0x00,
+ 0x2E, 0x01, 0x0C, 0x10, 0x1F, 0x10, 0x2F, 0x10,
+ 0x12, 0x18, 0x28, 0x1D, 0x01, 0x21, 0x08, 0x2A,
+ 0x11, 0x32, 0x2F, 0x2E, 0x1F, 0x25, 0x02, 0x02,
+ 0x01, 0x11, 0x01, 0x2F, 0x08, 0x1E, 0x11, 0x0E,
+ 0x11, 0x26, 0x1C, 0x01, 0x1E, 0x19, 0x1F, 0x33,
+ 0x24, 0x11, 0x26, 0x05, 0x28, 0x2B, 0x2F, 0x22,
+ 0x00, 0x13, 0x05, 0x01, 0x06, 0x08, 0x09, 0x0C,
+ 0x04, 0x1A, 0x08, 0x1F, 0x12, 0x05, 0x12, 0x15,
+ 0x16, 0x10, 0x1A, 0x08, 0x1A, 0x1D, 0x0A, 0x00,
+ 0x0A, 0x00, 0x00, 0x09, 0x00, 0x1E, 0x04, 0x11,
+ 0x08, 0x16, 0x08, 0x06, 0x10, 0x00, 0x11, 0x0D,
+ 0x12, 0x20, 0x15, 0x02, 0x14, 0x09, 0x16, 0x1B,
+ 0x1A, 0x14, 0x1A, 0x14
+};
+
+static const ByteProvider kEoB2DscTelptrShpCoordsDOSProvider = { ARRAYSIZE(kEoB2DscTelptrShpCoordsDOS), kEoB2DscTelptrShpCoordsDOS };
+
+static const byte kEoB2PortalSeqDataDOS[126] = {
+ 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x01, 0x00, 0x02, 0x00, 0x01, 0x00,
+ 0x00, 0x00, 0x01, 0x00, 0x02, 0x00, 0x03, 0x00,
+ 0x02, 0x00, 0x01, 0x00, 0x02, 0x00, 0x03, 0x00,
+ 0x04, 0x00, 0x03, 0x00, 0x02, 0x00, 0x01, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00,
+ 0x00, 0x01, 0x00, 0x02, 0x00, 0x01, 0x00, 0x00,
+ 0x00, 0x01, 0x00, 0x02, 0x00, 0x03, 0x00, 0x04,
+ 0x00, 0x01, 0x01, 0x00, 0x02, 0x01, 0x03, 0x02,
+ 0x02, 0x03, 0x01, 0x04, 0x00, 0x02, 0x01, 0x03,
+ 0x02, 0x04, 0x03, 0x02, 0x04, 0x03, 0x03, 0x04,
+ 0x02, 0x02, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x01, 0x01, 0x02, 0x02, 0x03, 0x03,
+ 0x04, 0x04, 0x04, 0x05, 0x04, 0x06, 0x03, 0x07,
+ 0x02, 0x08, 0x02, 0x08, 0x01, 0x09, 0x01, 0x09,
+ 0x01, 0x09, 0x00, 0x0A, 0xFF, 0xFF
+};
+
+static const ByteProvider kEoB2PortalSeqDataDOSProvider = { ARRAYSIZE(kEoB2PortalSeqDataDOS), kEoB2PortalSeqDataDOS };
+
+static const byte kEoB2DscMonsterFrmOffsTbl1DOS[32] = {
+ 0x04, 0xFE, 0x01, 0x03, 0x03, 0x04, 0xFE, 0x01,
+ 0x01, 0x03, 0x04, 0xFE, 0xFE, 0x01, 0x03, 0x04,
+ 0xFC, 0xFD, 0xFF, 0x02, 0x02, 0xFC, 0xFD, 0xFF,
+ 0xFF, 0x02, 0xFC, 0xFD, 0xFD, 0xFF, 0x02, 0xFC
+};
+
+static const ByteProvider kEoB2DscMonsterFrmOffsTbl1DOSProvider = { ARRAYSIZE(kEoB2DscMonsterFrmOffsTbl1DOS), kEoB2DscMonsterFrmOffsTbl1DOS };
+
+static const byte kEoB2DscMonsterFrmOffsTbl2DOS[32] = {
+ 0x04, 0xFE, 0x01, 0x03, 0x03, 0x04, 0xFE, 0x01,
+ 0x01, 0x03, 0x04, 0xFE, 0xFE, 0x01, 0x03, 0x04,
+ 0x04, 0xFD, 0x01, 0x02, 0x02, 0x04, 0xFD, 0x01,
+ 0x01, 0x02, 0x04, 0xFD, 0xFD, 0x01, 0x02, 0x04
+};
+
+static const ByteProvider kEoB2DscMonsterFrmOffsTbl2DOSProvider = { ARRAYSIZE(kEoB2DscMonsterFrmOffsTbl2DOS), kEoB2DscMonsterFrmOffsTbl2DOS };
+
+static const uint16 kEoB2InvSlotXDOS[27] = {
+ 0x00E6, 0x0116, 0x00B5, 0x00C7, 0x00B5, 0x00C7, 0x00B5, 0x00C7,
+ 0x00B5, 0x00C7, 0x00B5, 0x00C7, 0x00B5, 0x00C7, 0x00B5, 0x00C7,
+ 0x00E1, 0x00E0, 0x00E1, 0x012A, 0x011F, 0x0115, 0x012C, 0x012C,
+ 0x012C, 0x00E4, 0x00F0
+};
+
+static const Uint16Provider kEoB2InvSlotXDOSProvider = { ARRAYSIZE(kEoB2InvSlotXDOS), kEoB2InvSlotXDOS };
+
+static const byte kEoB2InvSlotYDOS[27] = {
+ 0x74, 0x74, 0x28, 0x28, 0x3A, 0x3A, 0x4C, 0x4C,
+ 0x5E, 0x5E, 0x70, 0x70, 0x82, 0x82, 0x94, 0x94,
+ 0x38, 0x4C, 0x60, 0x37, 0x4B, 0x89, 0x5E, 0x70,
+ 0x82, 0x88, 0x88
+};
+
+static const ByteProvider kEoB2InvSlotYDOSProvider = { ARRAYSIZE(kEoB2InvSlotYDOS), kEoB2InvSlotYDOS };
+
+static const uint16 kEoB2SlotValidationFlagsDOS[27] = {
+ 0x0008, 0x0008, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF,
+ 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF,
+ 0x0001, 0x0002, 0x0004, 0x0020, 0x0040, 0x0010, 0xFFFF, 0x0080,
+ 0x0080, 0x0100, 0x0100
+};
+
+static const Uint16Provider kEoB2SlotValidationFlagsDOSProvider = { ARRAYSIZE(kEoB2SlotValidationFlagsDOS), kEoB2SlotValidationFlagsDOS };
+
+static const byte kEoB2ProjectileWeaponTypesDOS[15] = {
+ 0xFF, 0x01, 0xFF, 0x02, 0x04, 0x03, 0x05, 0x10,
+ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x12
+};
+
+static const ByteProvider kEoB2ProjectileWeaponTypesDOSProvider = { ARRAYSIZE(kEoB2ProjectileWeaponTypesDOS), kEoB2ProjectileWeaponTypesDOS };
+
+static const byte kEoB2WandTypesDOS[8] = {
+ 0x00, 0x11, 0x17, 0x31, 0x0D, 0xFF, 0x04, 0x0C
+};
+
+static const ByteProvider kEoB2WandTypesDOSProvider = { ARRAYSIZE(kEoB2WandTypesDOS), kEoB2WandTypesDOS };
+
+static const byte kEoB2DrawObjPosIndexDOS[20] = {
+ 0x00, 0x01, 0x02, 0x03, 0x04, 0x02, 0x00, 0x03,
+ 0x01, 0x04, 0x02, 0x03, 0x00, 0x01, 0x04, 0x01,
+ 0x03, 0x00, 0x02, 0x04
+};
+
+static const ByteProvider kEoB2DrawObjPosIndexDOSProvider = { ARRAYSIZE(kEoB2DrawObjPosIndexDOS), kEoB2DrawObjPosIndexDOS };
+
+static const byte kEoB2FlightObjFlipIndexDOS[16] = {
+ 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x01, 0x01,
+ 0x01, 0x00, 0x01, 0x00, 0x01, 0x01, 0x00, 0x00
+};
+
+static const ByteProvider kEoB2FlightObjFlipIndexDOSProvider = { ARRAYSIZE(kEoB2FlightObjFlipIndexDOS), kEoB2FlightObjFlipIndexDOS };
+
+static const byte kEoB2FlightObjShpMapDOS[45] = {
+ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x02,
+ 0xFF, 0xFF, 0x04, 0xFF, 0x06, 0xFF, 0xFF, 0xFF,
+ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+ 0xFF, 0x00, 0x00, 0x00, 0x00
+};
+
+static const ByteProvider kEoB2FlightObjShpMapDOSProvider = { ARRAYSIZE(kEoB2FlightObjShpMapDOS), kEoB2FlightObjShpMapDOS };
+
+static const byte kEoB2FlightObjSclIndexDOS[72] = {
+ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x03,
+ 0xFF, 0xFF, 0x03, 0x03, 0xFF, 0xFF, 0x03, 0x03,
+ 0xFF, 0xFF, 0x03, 0x03, 0xFF, 0xFF, 0x03, 0xFF,
+ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+ 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02,
+ 0x02, 0x02, 0x02, 0x02, 0xFF, 0xFF, 0xFF, 0xFF,
+ 0xFF, 0x01, 0xFF, 0x01, 0x01, 0x01, 0x01, 0x01,
+ 0x01, 0xFF, 0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+ 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF
+};
+
+static const ByteProvider kEoB2FlightObjSclIndexDOSProvider = { ARRAYSIZE(kEoB2FlightObjSclIndexDOS), kEoB2FlightObjSclIndexDOS };
+
+static const uint16 kEoB2TransferPortraitFramesDOS[32] = {
+ 0x0004, 0x0018, 0x009D, 0x0038, 0x00A2, 0x0018, 0x013C, 0x0039,
+ 0x0004, 0x0040, 0x009D, 0x0060, 0x00A2, 0x0040, 0x013C, 0x0060,
+ 0x0004, 0x0068, 0x009D, 0x0089, 0x00A2, 0x0068, 0x013C, 0x0089,
+ 0x0004, 0x0094, 0x002E, 0x009E, 0x0110, 0x0094, 0x013A, 0x009E
+};
+
+static const Uint16Provider kEoB2TransferPortraitFramesDOSProvider = { ARRAYSIZE(kEoB2TransferPortraitFramesDOS), kEoB2TransferPortraitFramesDOS };
+
+static const byte kEoB2TransferConvertTableDOS[49] = {
+ 0x00, 0x01, 0x02, 0x03, 0x04, 0x00, 0x05, 0x06,
+ 0x0A, 0x00, 0x0B, 0x00, 0x0C, 0x0D, 0x00, 0x0E,
+ 0x0F, 0x10, 0x11, 0x12, 0x13, 0x14, 0x00, 0x00,
+ 0x17, 0x18, 0x22, 0x24, 0x23, 0x25, 0x26, 0x27,
+ 0x28, 0x29, 0x2A, 0x2B, 0x2C, 0x2D, 0x2E, 0x2F,
+ 0x31, 0x30, 0x32, 0x33, 0x00, 0x35, 0x34, 0x36,
+ 0x37
+};
+
+static const ByteProvider kEoB2TransferConvertTableDOSProvider = { ARRAYSIZE(kEoB2TransferConvertTableDOS), kEoB2TransferConvertTableDOS };
+
+static const byte kEoB2TransferItemTableDOS[60] = {
+ 0x01, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
+ 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
+ 0x01, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x00,
+ 0x01, 0x01, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01,
+ 0x01, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x01,
+ 0x00, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x01,
+ 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00
+};
+
+static const ByteProvider kEoB2TransferItemTableDOSProvider = { ARRAYSIZE(kEoB2TransferItemTableDOS), kEoB2TransferItemTableDOS };
+
+static const uint32 kEoB2TransferExpTableDOS[6] = {
+ 0x000F423F, 0x000B71AF, 0x000DBB9F, 0x0006B6BF, 0x000DBB9F, 0x000DBB9F
+};
+
+static const Uint32Provider kEoB2TransferExpTableDOSProvider = { ARRAYSIZE(kEoB2TransferExpTableDOS), kEoB2TransferExpTableDOS };
+
+static const DarkMoonAnimCommand kEoB2IntroAnimData00DOS[5] = {
+ { 0x01, 0, 208, 16, 1, 1, 0, 0, 0, 0 },
+ { 0x01, 0, 208, 16, 1, 1, 0, 0, 0, 0 },
+ { 0x00, 0, 216, 51, 8, 0, 0, 0, 0, 0 },
+ { 0x06, 3, 0, 0, 0, 0, 0, 0, 0, 0 },
+ { 0xFF, 0, 0, 0, 0, 0, 0, 0, 0, 0 }
+};
+
+static const DarkMoonAnimCommandProvider kEoB2IntroAnimData00DOSProvider = { ARRAYSIZE(kEoB2IntroAnimData00DOS), kEoB2IntroAnimData00DOS };
+
+static const DarkMoonAnimCommand kEoB2IntroAnimData01DOS[5] = {
+ { 0x01, 1, 184, 8, 1, 1, 0, 0, 0, 0 },
+ { 0x01, 1, 184, 8, 1, 1, 0, 0, 0, 0 },
+ { 0x00, 0, 216, 51, 7, 0, 0, 0, 0, 0 },
+ { 0x06, 4, 0, 0, 0, 0, 0, 0, 0, 0 },
+ { 0xFF, 0, 0, 0, 0, 0, 0, 0, 0, 0 }
+};
+
+static const DarkMoonAnimCommandProvider kEoB2IntroAnimData01DOSProvider = { ARRAYSIZE(kEoB2IntroAnimData01DOS), kEoB2IntroAnimData01DOS };
+
+static const DarkMoonAnimCommand kEoB2IntroAnimData02DOS[5] = {
+ { 0x01, 2, 216, 51, 1, 0, 0, 0, 0, 0 },
+ { 0x01, 2, 216, 51, 1, 0, 0, 0, 0, 0 },
+ { 0x00, 0, 216, 51, 18, 0, 0, 0, 0, 0 },
+ { 0x06, 6, 0, 0, 0, 0, 0, 0, 0, 0 },
+ { 0xFF, 0, 0, 0, 0, 0, 0, 0, 0, 0 }
+};
+
+static const DarkMoonAnimCommandProvider kEoB2IntroAnimData02DOSProvider = { ARRAYSIZE(kEoB2IntroAnimData02DOS), kEoB2IntroAnimData02DOS };
+
+static const DarkMoonAnimCommand kEoB2IntroAnimData03DOS[4] = {
+ { 0x00, 0, 0, 0, 1, 2, 0, 0, 0, 0 },
+ { 0x06, 3, 0, 0, 0, 0, 0, 0, 0, 0 },
+ { 0x00, 0, 0, 0, 1, 2, 0, 0, 0, 0 },
+ { 0xFF, 0, 0, 0, 0, 0, 0, 0, 0, 0 }
+};
+
+static const DarkMoonAnimCommandProvider kEoB2IntroAnimData03DOSProvider = { ARRAYSIZE(kEoB2IntroAnimData03DOS), kEoB2IntroAnimData03DOS };
+
+static const DarkMoonAnimCommand kEoB2IntroAnimData04DOS[3] = {
+ { 0x01, 0, 282, 8, 1, 0, 0, 0, 0, 0 },
+ { 0x01, 0, 282, 8, 1, 0, 0, 0, 0, 0 },
+ { 0xFF, 0, 0, 0, 0, 0, 0, 0, 0, 0 }
+};
+
+static const DarkMoonAnimCommandProvider kEoB2IntroAnimData04DOSProvider = { ARRAYSIZE(kEoB2IntroAnimData04DOS), kEoB2IntroAnimData04DOS };
+
+static const DarkMoonAnimCommand kEoB2IntroAnimData05DOS[4] = {
+ { 0x00, 0, 0, 0, 1, 1, 0, 0, 0, 0 },
+ { 0x00, 0, 0, 0, 1, 1, 0, 0, 0, 0 },
+ { 0x06, 5, 0, 0, 0, 0, 0, 0, 0, 0 },
+ { 0xFF, 0, 0, 0, 0, 0, 0, 0, 0, 0 }
+};
+
+static const DarkMoonAnimCommandProvider kEoB2IntroAnimData05DOSProvider = { ARRAYSIZE(kEoB2IntroAnimData05DOS), kEoB2IntroAnimData05DOS };
+
+static const DarkMoonAnimCommand kEoB2IntroAnimData06DOS[16] = {
+ { 0x01, 12, 170, 11, 2, 0, 0, 0, 0, 0 },
+ { 0x01, 12, 188, 38, 2, 0, 0, 0, 0, 0 },
+ { 0x01, 12, 203, 63, 2, 0, 0, 0, 0, 0 },
+ { 0x01, 12, 218, 85, 2, 0, 0, 0, 0, 0 },
+ { 0x01, 12, 232, 107, 2, 0, 0, 0, 0, 0 },
+ { 0x06, 9, 0, 0, 0, 0, 0, 0, 0, 0 },
+ { 0x01, 3, 242, 125, 2, 0, 0, 0, 0, 0 },
+ { 0x01, 4, 240, 125, 3, 0, 0, 0, 0, 0 },
+ { 0x01, 5, 238, 124, 3, 0, 0, 0, 0, 0 },
+ { 0x01, 6, 236, 123, 3, 0, 0, 0, 0, 0 },
+ { 0x01, 7, 232, 121, 3, 0, 0, 0, 0, 0 },
+ { 0x01, 8, 226, 120, 4, 0, 0, 0, 0, 0 },
+ { 0x01, 9, 220, 119, 4, 0, 0, 0, 0, 0 },
+ { 0x01, 10, 241, 115, 4, 0, 0, 0, 0, 0 },
+ { 0x01, 11, 241, 115, 4, 0, 0, 0, 0, 0 },
+ { 0xFF, 0, 0, 0, 0, 0, 0, 0, 0, 0 }
+};
+
+static const DarkMoonAnimCommandProvider kEoB2IntroAnimData06DOSProvider = { ARRAYSIZE(kEoB2IntroAnimData06DOS), kEoB2IntroAnimData06DOS };
+
+static const DarkMoonAnimCommand kEoB2IntroAnimData07DOS[5] = {
+ { 0x01, 12, 54, 17, 2, 0, 0, 0, 0, 0 },
+ { 0x01, 12, 80, 53, 2, 0, 0, 0, 0, 0 },
+ { 0x01, 12, 104, 87, 2, 0, 0, 0, 0, 0 },
+ { 0x01, 12, 130, 124, 2, 0, 0, 0, 0, 0 },
+ { 0xFF, 0, 0, 0, 0, 0, 0, 0, 0, 0 }
+};
+
+static const DarkMoonAnimCommandProvider kEoB2IntroAnimData07DOSProvider = { ARRAYSIZE(kEoB2IntroAnimData07DOS), kEoB2IntroAnimData07DOS };
+
+static const DarkMoonAnimCommand kEoB2IntroAnimData08DOS[6] = {
+ { 0x01, 12, 112, 8, 2, 0, 0, 0, 0, 0 },
+ { 0x01, 12, 126, 34, 2, 0, 0, 0, 0, 0 },
+ { 0x01, 12, 142, 60, 2, 0, 0, 0, 0, 0 },
+ { 0x01, 12, 170, 109, 2, 0, 0, 0, 0, 0 },
+ { 0x06, 8, 0, 0, 0, 0, 0, 0, 0, 0 },
+ { 0xFF, 0, 0, 0, 0, 0, 0, 0, 0, 0 }
+};
+
+static const DarkMoonAnimCommandProvider kEoB2IntroAnimData08DOSProvider = { ARRAYSIZE(kEoB2IntroAnimData08DOS), kEoB2IntroAnimData08DOS };
+
+static const DarkMoonAnimCommand kEoB2IntroAnimData09DOS[4] = {
+ { 0x05, 0, 184, 64, 6, 0, 30, 8, 3, 16 },
+ { 0x05, 0, 184, 64, 6, 0, 33, 8, 3, 16 },
+ { 0x05, 0, 184, 64, 6, 0, 36, 8, 3, 16 },
+ { 0xFF, 0, 0, 0, 0, 0, 0, 0, 0, 0 }
+};
+
+static const DarkMoonAnimCommandProvider kEoB2IntroAnimData09DOSProvider = { ARRAYSIZE(kEoB2IntroAnimData09DOS), kEoB2IntroAnimData09DOS };
+
+static const DarkMoonAnimCommand kEoB2IntroAnimData10DOS[10] = {
+ { 0x05, 0, 184, 64, 0, 0, 30, 8, 3, 16 },
+ { 0x05, 0, 128, 88, 3, 0, 30, 32, 4, 24 },
+ { 0x05, 0, 128, 88, 3, 0, 34, 32, 4, 24 },
+ { 0x05, 0, 184, 64, 0, 0, 33, 8, 3, 16 },
+ { 0x05, 0, 128, 88, 3, 0, 30, 32, 4, 24 },
+ { 0x05, 0, 128, 88, 3, 0, 34, 32, 4, 24 },
+ { 0x05, 0, 184, 64, 0, 0, 36, 8, 3, 16 },
+ { 0x05, 0, 128, 88, 3, 0, 30, 32, 4, 24 },
+ { 0x05, 0, 128, 88, 3, 0, 34, 32, 4, 24 },
+ { 0xFF, 0, 0, 0, 0, 0, 0, 0, 0, 0 }
+};
+
+static const DarkMoonAnimCommandProvider kEoB2IntroAnimData10DOSProvider = { ARRAYSIZE(kEoB2IntroAnimData10DOS), kEoB2IntroAnimData10DOS };
+
+static const DarkMoonAnimCommand kEoB2IntroAnimData11DOS[16] = {
+ { 0x03, 15, 36, 48, 1, 1, 0, 0, 0, 0 },
+ { 0x03, 15, 36, 48, 1, 2, 0, 0, 0, 0 },
+ { 0x03, 15, 36, 48, 1, 3, 0, 0, 0, 0 },
+ { 0x03, 15, 36, 48, 1, 4, 0, 0, 0, 0 },
+ { 0x06, 11, 0, 0, 0, 0, 0, 0, 0, 0 },
+ { 0x03, 15, 36, 48, 1, 5, 0, 0, 0, 0 },
+ { 0x03, 15, 36, 48, 1, 6, 0, 0, 0, 0 },
+ { 0x03, 15, 36, 48, 90, 7, 0, 0, 0, 0 },
+ { 0x03, 15, 36, 48, 1, 6, 0, 0, 0, 0 },
+ { 0x03, 15, 36, 48, 1, 5, 0, 0, 0, 0 },
+ { 0x03, 15, 36, 48, 1, 4, 0, 0, 0, 0 },
+ { 0x03, 15, 36, 48, 1, 3, 0, 0, 0, 0 },
+ { 0x03, 15, 36, 48, 1, 2, 0, 0, 0, 0 },
+ { 0x03, 15, 36, 48, 1, 1, 0, 0, 0, 0 },
+ { 0x03, 15, 36, 48, 1, 0, 0, 0, 0, 0 },
+ { 0xFF, 0, 0, 0, 0, 0, 0, 0, 0, 0 }
+};
+
+static const DarkMoonAnimCommandProvider kEoB2IntroAnimData11DOSProvider = { ARRAYSIZE(kEoB2IntroAnimData11DOS), kEoB2IntroAnimData11DOS };
+
+static const DarkMoonAnimCommand kEoB2IntroAnimData12DOS[3] = {
+ { 0x02, 15, 36, 48, 90, 0, 0, 0, 0, 0 },
+ { 0x07, 15, 36, 48, 0, 0, 0, 0, 0, 0 },
+ { 0xFF, 0, 0, 0, 0, 0, 0, 0, 0, 0 }
+};
+
+static const DarkMoonAnimCommandProvider kEoB2IntroAnimData12DOSProvider = { ARRAYSIZE(kEoB2IntroAnimData12DOS), kEoB2IntroAnimData12DOS };
+
+static const DarkMoonAnimCommand kEoB2IntroAnimData13DOS[4] = {
+ { 0x06, 10, 0, 0, 0, 0, 0, 0, 0, 0 },
+ { 0x05, 0, 104, 24, 5, 0, 0, 8, 15, 112 },
+ { 0x05, 0, 104, 24, 5, 0, 15, 8, 15, 112 },
+ { 0xFF, 0, 0, 0, 0, 0, 0, 0, 0, 0 }
+};
+
+static const DarkMoonAnimCommandProvider kEoB2IntroAnimData13DOSProvider = { ARRAYSIZE(kEoB2IntroAnimData13DOS), kEoB2IntroAnimData13DOS };
+
+static const DarkMoonAnimCommand kEoB2IntroAnimData14DOS[6] = {
+ { 0x05, 0, 184, 64, 0, 0, 30, 8, 3, 16 },
+ { 0x05, 0, 104, 72, 5, 0, 10, 120, 10, 64 },
+ { 0x05, 0, 184, 64, 0, 0, 33, 8, 3, 16 },
+ { 0x05, 0, 104, 72, 5, 0, 20, 120, 10, 64 },
+ { 0x05, 0, 184, 64, 0, 0, 36, 8, 3, 16 },
+ { 0xFF, 0, 0, 0, 0, 0, 0, 0, 0, 0 }
+};
+
+static const DarkMoonAnimCommandProvider kEoB2IntroAnimData14DOSProvider = { ARRAYSIZE(kEoB2IntroAnimData14DOS), kEoB2IntroAnimData14DOS };
+
+static const DarkMoonAnimCommand kEoB2IntroAnimData15DOS[4] = {
+ { 0x05, 0, 104, 0, 8, 0, 0, 0, 13, 200 },
+ { 0x05, 0, 104, 0, 8, 0, 13, 0, 13, 200 },
+ { 0x05, 0, 104, 0, 8, 0, 26, 0, 13, 200 },
+ { 0xFF, 0, 0, 0, 0, 0, 0, 0, 0, 0 }
+};
+
+static const DarkMoonAnimCommandProvider kEoB2IntroAnimData15DOSProvider = { ARRAYSIZE(kEoB2IntroAnimData15DOS), kEoB2IntroAnimData15DOS };
+
+static const DarkMoonAnimCommand kEoB2IntroAnimData16DOS[11] = {
+ { 0x06, 255, 0, 0, 0, 0, 0, 0, 0, 0 },
+ { 0x02, 9, 224, 72, 0, 0, 0, 0, 0, 0 },
+ { 0x02, 3, 240, 40, 0, 0, 0, 0, 0, 0 },
+ { 0x02, 6, 112, 72, 6, 0, 0, 0, 0, 0 },
+ { 0x02, 1, 224, 72, 0, 0, 0, 0, 0, 0 },
+ { 0x02, 4, 240, 40, 0, 0, 0, 0, 0, 0 },
+ { 0x02, 7, 112, 72, 6, 0, 0, 0, 0, 0 },
+ { 0x02, 2, 224, 72, 0, 0, 0, 0, 0, 0 },
+ { 0x02, 5, 240, 40, 0, 0, 0, 0, 0, 0 },
+ { 0x02, 8, 112, 72, 6, 0, 0, 0, 0, 0 },
+ { 0xFF, 0, 0, 0, 0, 0, 0, 0, 0, 0 }
+};
+
+static const DarkMoonAnimCommandProvider kEoB2IntroAnimData16DOSProvider = { ARRAYSIZE(kEoB2IntroAnimData16DOS), kEoB2IntroAnimData16DOS };
+
+static const DarkMoonAnimCommand kEoB2IntroAnimData17DOS[12] = {
+ { 0x06, 255, 0, 0, 0, 0, 0, 0, 0, 0 },
+ { 0x02, 9, 224, 72, 0, 0, 0, 0, 0, 0 },
+ { 0x02, 3, 240, 40, 6, 0, 0, 0, 0, 0 },
+ { 0x06, 5, 0, 0, 0, 0, 0, 0, 0, 0 },
+ { 0x00, 0, 0, 0, 1, 3, 0, 0, 0, 0 },
+ { 0x00, 0, 0, 0, 1, 3, 0, 0, 0, 0 },
+ { 0x00, 0, 0, 0, 1, 3, 0, 0, 0, 0 },
+ { 0x02, 1, 224, 72, 0, 0, 0, 0, 0, 0 },
+ { 0x02, 4, 240, 40, 6, 0, 0, 0, 0, 0 },
+ { 0x02, 2, 224, 72, 0, 0, 0, 0, 0, 0 },
+ { 0x02, 5, 240, 40, 6, 0, 0, 0, 0, 0 },
+ { 0xFF, 0, 0, 0, 0, 0, 0, 0, 0, 0 }
+};
+
+static const DarkMoonAnimCommandProvider kEoB2IntroAnimData17DOSProvider = { ARRAYSIZE(kEoB2IntroAnimData17DOS), kEoB2IntroAnimData17DOS };
+
+static const DarkMoonAnimCommand kEoB2IntroAnimData18DOS[8] = {
+ { 0x06, 255, 0, 0, 0, 0, 0, 0, 0, 0 },
+ { 0x02, 9, 224, 72, 0, 0, 0, 0, 0, 0 },
+ { 0x02, 3, 240, 40, 6, 0, 0, 0, 0, 0 },
+ { 0x02, 1, 224, 72, 0, 0, 0, 0, 0, 0 },
+ { 0x02, 4, 240, 40, 6, 0, 0, 0, 0, 0 },
+ { 0x02, 2, 224, 72, 0, 0, 0, 0, 0, 0 },
+ { 0x02, 5, 240, 40, 6, 0, 0, 0, 0, 0 },
+ { 0xFF, 0, 0, 0, 0, 0, 0, 0, 0, 0 }
+};
+
+static const DarkMoonAnimCommandProvider kEoB2IntroAnimData18DOSProvider = { ARRAYSIZE(kEoB2IntroAnimData18DOS), kEoB2IntroAnimData18DOS };
+
+static const DarkMoonAnimCommand kEoB2IntroAnimData19DOS[14] = {
+ { 0x06, 255, 0, 0, 0, 0, 0, 0, 0, 0 },
+ { 0x02, 10, 136, 40, 0, 0, 0, 0, 0, 0 },
+ { 0x02, 9, 224, 72, 0, 0, 0, 0, 0, 0 },
+ { 0x02, 3, 240, 40, 3, 0, 0, 0, 0, 0 },
+ { 0x02, 11, 136, 40, 3, 0, 0, 0, 0, 0 },
+ { 0x02, 12, 136, 40, 0, 0, 0, 0, 0, 0 },
+ { 0x02, 1, 224, 72, 0, 0, 0, 0, 0, 0 },
+ { 0x02, 4, 240, 40, 3, 0, 0, 0, 0, 0 },
+ { 0x02, 13, 136, 40, 3, 0, 0, 0, 0, 0 },
+ { 0x02, 10, 136, 40, 0, 0, 0, 0, 0, 0 },
+ { 0x02, 2, 224, 72, 0, 0, 0, 0, 0, 0 },
+ { 0x02, 5, 240, 40, 3, 0, 0, 0, 0, 0 },
+ { 0x02, 13, 136, 40, 3, 0, 0, 0, 0, 0 },
+ { 0xFF, 0, 0, 0, 0, 0, 0, 0, 0, 0 }
+};
+
+static const DarkMoonAnimCommandProvider kEoB2IntroAnimData19DOSProvider = { ARRAYSIZE(kEoB2IntroAnimData19DOS), kEoB2IntroAnimData19DOS };
+
+static const DarkMoonAnimCommand kEoB2IntroAnimData20DOS[14] = {
+ { 0x06, 255, 0, 0, 0, 0, 0, 0, 0, 0 },
+ { 0x02, 11, 136, 40, 0, 0, 0, 0, 0, 0 },
+ { 0x02, 9, 224, 72, 0, 0, 0, 0, 0, 0 },
+ { 0x02, 3, 240, 40, 3, 0, 0, 0, 0, 0 },
+ { 0x02, 10, 136, 40, 3, 0, 0, 0, 0, 0 },
+ { 0x02, 13, 136, 40, 0, 0, 0, 0, 0, 0 },
+ { 0x02, 1, 224, 72, 0, 0, 0, 0, 0, 0 },
+ { 0x02, 4, 240, 40, 3, 0, 0, 0, 0, 0 },
+ { 0x02, 12, 136, 40, 3, 0, 0, 0, 0, 0 },
+ { 0x02, 11, 136, 40, 0, 0, 0, 0, 0, 0 },
+ { 0x02, 2, 224, 72, 0, 0, 0, 0, 0, 0 },
+ { 0x02, 5, 240, 40, 3, 0, 0, 0, 0, 0 },
+ { 0x02, 13, 136, 40, 3, 0, 0, 0, 0, 0 },
+ { 0xFF, 0, 0, 0, 0, 0, 0, 0, 0, 0 }
+};
+
+static const DarkMoonAnimCommandProvider kEoB2IntroAnimData20DOSProvider = { ARRAYSIZE(kEoB2IntroAnimData20DOS), kEoB2IntroAnimData20DOS };
+
+static const DarkMoonAnimCommand kEoB2IntroAnimData21DOS[14] = {
+ { 0x06, 255, 0, 0, 0, 0, 0, 0, 0, 0 },
+ { 0x02, 14, 136, 40, 0, 0, 0, 0, 0, 0 },
+ { 0x02, 9, 224, 72, 0, 0, 0, 0, 0, 0 },
+ { 0x02, 3, 240, 40, 3, 0, 0, 0, 0, 0 },
+ { 0x02, 15, 136, 40, 3, 0, 0, 0, 0, 0 },
+ { 0x02, 16, 136, 40, 0, 0, 0, 0, 0, 0 },
+ { 0x02, 1, 224, 72, 0, 0, 0, 0, 0, 0 },
+ { 0x02, 4, 240, 40, 3, 0, 0, 0, 0, 0 },
+ { 0x02, 17, 136, 40, 3, 0, 0, 0, 0, 0 },
+ { 0x02, 14, 136, 40, 0, 0, 0, 0, 0, 0 },
+ { 0x02, 2, 224, 72, 0, 0, 0, 0, 0, 0 },
+ { 0x02, 5, 240, 40, 3, 0, 0, 0, 0, 0 },
+ { 0x02, 17, 136, 40, 3, 0, 0, 0, 0, 0 },
+ { 0xFF, 0, 0, 0, 0, 0, 0, 0, 0, 0 }
+};
+
+static const DarkMoonAnimCommandProvider kEoB2IntroAnimData21DOSProvider = { ARRAYSIZE(kEoB2IntroAnimData21DOS), kEoB2IntroAnimData21DOS };
+
+static const DarkMoonAnimCommand kEoB2IntroAnimData22DOS[2] = {
+ { 0x05, 0, 104, 32, 0, 0, 10, 0, 10, 96 },
+ { 0xFF, 0, 0, 0, 0, 0, 0, 0, 0, 0 }
+};
+
+static const DarkMoonAnimCommandProvider kEoB2IntroAnimData22DOSProvider = { ARRAYSIZE(kEoB2IntroAnimData22DOS), kEoB2IntroAnimData22DOS };
+
+static const DarkMoonAnimCommand kEoB2IntroAnimData23DOS[2] = {
+ { 0x05, 0, 104, 32, 3, 0, 20, 0, 10, 96 },
+ { 0xFF, 0, 0, 0, 0, 0, 0, 0, 0, 0 }
+};
+
+static const DarkMoonAnimCommandProvider kEoB2IntroAnimData23DOSProvider = { ARRAYSIZE(kEoB2IntroAnimData23DOS), kEoB2IntroAnimData23DOS };
+
+static const DarkMoonAnimCommand kEoB2IntroAnimData24DOS[2] = {
+ { 0x05, 0, 104, 32, 0, 0, 30, 0, 10, 96 },
+ { 0xFF, 0, 0, 0, 0, 0, 0, 0, 0, 0 }
+};
+
+static const DarkMoonAnimCommandProvider kEoB2IntroAnimData24DOSProvider = { ARRAYSIZE(kEoB2IntroAnimData24DOS), kEoB2IntroAnimData24DOS };
+
+static const DarkMoonAnimCommand kEoB2IntroAnimData25DOS[2] = {
+ { 0x05, 0, 104, 32, 0, 0, 0, 96, 10, 96 },
+ { 0xFF, 0, 0, 0, 0, 0, 0, 0, 0, 0 }
+};
+
+static const DarkMoonAnimCommandProvider kEoB2IntroAnimData25DOSProvider = { ARRAYSIZE(kEoB2IntroAnimData25DOS), kEoB2IntroAnimData25DOS };
+
+static const DarkMoonAnimCommand kEoB2IntroAnimData26DOS[2] = {
+ { 0x05, 0, 104, 32, 3, 0, 10, 96, 10, 96 },
+ { 0xFF, 0, 0, 0, 0, 0, 0, 0, 0, 0 }
+};
+
+static const DarkMoonAnimCommandProvider kEoB2IntroAnimData26DOSProvider = { ARRAYSIZE(kEoB2IntroAnimData26DOS), kEoB2IntroAnimData26DOS };
+
+static const DarkMoonAnimCommand kEoB2IntroAnimData27DOS[2] = {
+ { 0x05, 0, 104, 32, 0, 0, 20, 96, 10, 96 },
+ { 0xFF, 0, 0, 0, 0, 0, 0, 0, 0, 0 }
+};
+
+static const DarkMoonAnimCommandProvider kEoB2IntroAnimData27DOSProvider = { ARRAYSIZE(kEoB2IntroAnimData27DOS), kEoB2IntroAnimData27DOS };
+
+static const DarkMoonAnimCommand kEoB2IntroAnimData28DOS[2] = {
+ { 0x05, 0, 104, 32, 0, 0, 0, 0, 10, 96 },
+ { 0xFF, 0, 0, 0, 0, 0, 0, 0, 0, 0 }
+};
+
+static const DarkMoonAnimCommandProvider kEoB2IntroAnimData28DOSProvider = { ARRAYSIZE(kEoB2IntroAnimData28DOS), kEoB2IntroAnimData28DOS };
+
+static const DarkMoonAnimCommand kEoB2IntroAnimData29DOS[2] = {
+ { 0x05, 0, 104, 32, 3, 0, 0, 0, 10, 96 },
+ { 0xFF, 0, 0, 0, 0, 0, 0, 0, 0, 0 }
+};
+
+static const DarkMoonAnimCommandProvider kEoB2IntroAnimData29DOSProvider = { ARRAYSIZE(kEoB2IntroAnimData29DOS), kEoB2IntroAnimData29DOS };
+
+static const DarkMoonAnimCommand kEoB2IntroAnimData30DOS[2] = {
+ { 0x05, 0, 104, 32, 4, 0, 10, 0, 10, 96 },
+ { 0xFF, 0, 0, 0, 0, 0, 0, 0, 0, 0 }
+};
+
+static const DarkMoonAnimCommandProvider kEoB2IntroAnimData30DOSProvider = { ARRAYSIZE(kEoB2IntroAnimData30DOS), kEoB2IntroAnimData30DOS };
+
+static const DarkMoonAnimCommand kEoB2IntroAnimData31DOS[2] = {
+ { 0x05, 0, 104, 32, 8, 0, 20, 0, 10, 96 },
+ { 0xFF, 0, 0, 0, 0, 0, 0, 0, 0, 0 }
+};
+
+static const DarkMoonAnimCommandProvider kEoB2IntroAnimData31DOSProvider = { ARRAYSIZE(kEoB2IntroAnimData31DOS), kEoB2IntroAnimData31DOS };
+
+static const DarkMoonAnimCommand kEoB2IntroAnimData32DOS[5] = {
+ { 0x06, 255, 0, 0, 0, 0, 0, 0, 0, 0 },
+ { 0x05, 0, 176, 56, 3, 0, 19, 136, 2, 8 },
+ { 0x05, 0, 176, 56, 3, 0, 21, 136, 2, 8 },
+ { 0x05, 0, 176, 56, 3, 0, 23, 136, 2, 8 },
+ { 0xFF, 0, 0, 0, 0, 0, 0, 0, 0, 0 }
+};
+
+static const DarkMoonAnimCommandProvider kEoB2IntroAnimData32DOSProvider = { ARRAYSIZE(kEoB2IntroAnimData32DOS), kEoB2IntroAnimData32DOS };
+
+static const DarkMoonAnimCommand kEoB2IntroAnimData33DOS[14] = {
+ { 0x06, 255, 0, 0, 0, 0, 0, 0, 0, 0 },
+ { 0x05, 0, 176, 56, 0, 0, 19, 136, 2, 8 },
+ { 0x05, 0, 144, 88, 5, 0, 1, 136, 6, 40 },
+ { 0x05, 0, 176, 56, 0, 0, 21, 136, 2, 8 },
+ { 0x05, 0, 144, 88, 3, 0, 7, 136, 6, 40 },
+ { 0x05, 0, 176, 56, 2, 0, 23, 136, 2, 8 },
+ { 0x05, 0, 144, 88, 3, 0, 13, 136, 6, 40 },
+ { 0x05, 0, 176, 56, 0, 0, 19, 136, 2, 8 },
+ { 0x05, 0, 144, 88, 6, 0, 1, 136, 6, 40 },
+ { 0x05, 0, 176, 56, 0, 0, 21, 136, 2, 8 },
+ { 0x05, 0, 144, 88, 3, 0, 7, 136, 6, 40 },
+ { 0x05, 0, 176, 56, 0, 0, 23, 136, 2, 8 },
+ { 0x05, 0, 144, 88, 3, 0, 1, 136, 6, 40 },
+ { 0xFF, 0, 0, 0, 0, 0, 0, 0, 0, 0 }
+};
+
+static const DarkMoonAnimCommandProvider kEoB2IntroAnimData33DOSProvider = { ARRAYSIZE(kEoB2IntroAnimData33DOS), kEoB2IntroAnimData33DOS };
+
+static const DarkMoonAnimCommand kEoB2IntroAnimData34DOS[8] = {
+ { 0x06, 255, 0, 0, 0, 0, 0, 0, 0, 0 },
+ { 0x05, 0, 80, 64, 0, 0, 1, 136, 2, 16 },
+ { 0x05, 0, 248, 64, 3, 0, 7, 136, 2, 16 },
+ { 0x05, 0, 80, 64, 0, 0, 3, 136, 2, 16 },
+ { 0x05, 0, 248, 64, 3, 0, 9, 136, 2, 16 },
+ { 0x05, 0, 80, 64, 0, 0, 5, 136, 2, 16 },
+ { 0x05, 0, 248, 64, 3, 0, 11, 136, 2, 16 },
+ { 0xFF, 0, 0, 0, 0, 0, 0, 0, 0, 0 }
+};
+
+static const DarkMoonAnimCommandProvider kEoB2IntroAnimData34DOSProvider = { ARRAYSIZE(kEoB2IntroAnimData34DOS), kEoB2IntroAnimData34DOS };
+
+static const DarkMoonAnimCommand kEoB2IntroAnimData35DOS[5] = {
+ { 0x06, 255, 0, 0, 0, 0, 0, 0, 0, 0 },
+ { 0x05, 0, 16, 48, 0, 0, 0, 152, 14, 48 },
+ { 0x05, 0, 192, 48, 4, 0, 14, 128, 13, 48 },
+ { 0x05, 0, 16, 48, 0, 0, 1, 40, 35, 48 },
+ { 0xFF, 0, 0, 0, 0, 0, 0, 0, 0, 0 }
+};
+
+static const DarkMoonAnimCommandProvider kEoB2IntroAnimData35DOSProvider = { ARRAYSIZE(kEoB2IntroAnimData35DOS), kEoB2IntroAnimData35DOS };
+
+static const DarkMoonAnimCommand kEoB2IntroAnimData36DOS[6] = {
+ { 0x06, 1, 0, 0, 0, 0, 0, 0, 0, 0 },
+ { 0x05, 0, 168, 24, 3, 0, 0, 128, 2, 32 },
+ { 0x05, 0, 152, 16, 3, 0, 0, 88, 5, 40 },
+ { 0x05, 0, 128, 0, 3, 0, 0, 0, 10, 88 },
+ { 0x05, 0, 104, 0, 3, 0, 13, 0, 14, 88 },
+ { 0xFF, 0, 0, 0, 0, 0, 0, 0, 0, 0 }
+};
+
+static const DarkMoonAnimCommandProvider kEoB2IntroAnimData36DOSProvider = { ARRAYSIZE(kEoB2IntroAnimData36DOS), kEoB2IntroAnimData36DOS };
+
+static const DarkMoonAnimCommand kEoB2IntroAnimData37DOS[2] = {
+ { 0x05, 0, 104, 0, 0, 0, 13, 0, 13, 200 },
+ { 0xFF, 0, 0, 0, 0, 0, 0, 0, 0, 0 }
+};
+
+static const DarkMoonAnimCommandProvider kEoB2IntroAnimData37DOSProvider = { ARRAYSIZE(kEoB2IntroAnimData37DOS), kEoB2IntroAnimData37DOS };
+
+static const DarkMoonAnimCommand kEoB2IntroAnimData38DOS[43] = {
+ { 0x03, 17, 36, 48, 0, 1, 0, 0, 0, 0 },
+ { 0x03, 16, 142, 80, 0, 1, 0, 0, 0, 0 },
+ { 0x03, 19, 151, 28, 1, 1, 0, 0, 0, 0 },
+ { 0x03, 17, 36, 48, 0, 2, 0, 0, 0, 0 },
+ { 0x03, 16, 142, 80, 0, 2, 0, 0, 0, 0 },
+ { 0x03, 19, 151, 28, 1, 2, 0, 0, 0, 0 },
+ { 0x03, 17, 36, 48, 0, 3, 0, 0, 0, 0 },
+ { 0x03, 16, 142, 80, 0, 3, 0, 0, 0, 0 },
+ { 0x03, 19, 151, 28, 1, 3, 0, 0, 0, 0 },
+ { 0x03, 17, 36, 48, 0, 4, 0, 0, 0, 0 },
+ { 0x03, 16, 142, 80, 0, 4, 0, 0, 0, 0 },
+ { 0x03, 19, 151, 28, 1, 4, 0, 0, 0, 0 },
+ { 0x03, 17, 36, 48, 0, 5, 0, 0, 0, 0 },
+ { 0x03, 16, 142, 80, 0, 5, 0, 0, 0, 0 },
+ { 0x03, 19, 151, 28, 1, 5, 0, 0, 0, 0 },
+ { 0x03, 17, 36, 48, 0, 6, 0, 0, 0, 0 },
+ { 0x03, 16, 142, 80, 0, 6, 0, 0, 0, 0 },
+ { 0x03, 19, 151, 28, 1, 6, 0, 0, 0, 0 },
+ { 0x03, 17, 36, 48, 0, 7, 0, 0, 0, 0 },
+ { 0x03, 16, 142, 80, 0, 7, 0, 0, 0, 0 },
+ { 0x03, 19, 151, 28, 54, 7, 0, 0, 0, 0 },
+ { 0x03, 17, 36, 48, 0, 6, 0, 0, 0, 0 },
+ { 0x03, 16, 142, 80, 0, 6, 0, 0, 0, 0 },
+ { 0x03, 19, 151, 28, 1, 6, 0, 0, 0, 0 },
+ { 0x03, 17, 36, 48, 0, 5, 0, 0, 0, 0 },
+ { 0x03, 16, 142, 80, 0, 5, 0, 0, 0, 0 },
+ { 0x03, 19, 151, 28, 1, 5, 0, 0, 0, 0 },
+ { 0x03, 17, 36, 48, 0, 4, 0, 0, 0, 0 },
+ { 0x03, 16, 142, 80, 0, 4, 0, 0, 0, 0 },
+ { 0x03, 19, 151, 28, 1, 4, 0, 0, 0, 0 },
+ { 0x03, 17, 36, 48, 0, 3, 0, 0, 0, 0 },
+ { 0x03, 16, 142, 80, 0, 3, 0, 0, 0, 0 },
+ { 0x03, 19, 151, 28, 1, 3, 0, 0, 0, 0 },
+ { 0x03, 17, 36, 48, 0, 2, 0, 0, 0, 0 },
+ { 0x03, 16, 142, 80, 0, 2, 0, 0, 0, 0 },
+ { 0x03, 19, 151, 28, 1, 2, 0, 0, 0, 0 },
+ { 0x03, 17, 36, 48, 0, 1, 0, 0, 0, 0 },
+ { 0x03, 16, 142, 80, 0, 1, 0, 0, 0, 0 },
+ { 0x03, 19, 151, 28, 1, 1, 0, 0, 0, 0 },
+ { 0x03, 17, 36, 48, 0, 0, 0, 0, 0, 0 },
+ { 0x03, 16, 142, 80, 0, 0, 0, 0, 0, 0 },
+ { 0x03, 19, 151, 28, 1, 0, 0, 0, 0, 0 },
+ { 0xFF, 0, 0, 0, 0, 0, 0, 0, 0, 0 }
+};
+
+static const DarkMoonAnimCommandProvider kEoB2IntroAnimData38DOSProvider = { ARRAYSIZE(kEoB2IntroAnimData38DOS), kEoB2IntroAnimData38DOS };
+
+static const DarkMoonAnimCommand kEoB2IntroAnimData39DOS[7] = {
+ { 0x02, 17, 36, 48, 0, 0, 0, 0, 0, 0 },
+ { 0x02, 16, 142, 80, 0, 0, 0, 0, 0, 0 },
+ { 0x02, 19, 151, 28, 54, 0, 0, 0, 0, 0 },
+ { 0x07, 17, 36, 48, 0, 0, 0, 0, 0, 0 },
+ { 0x07, 16, 142, 80, 0, 0, 0, 0, 0, 0 },
+ { 0x07, 19, 151, 28, 0, 0, 0, 0, 0, 0 },
+ { 0xFF, 0, 0, 0, 0, 0, 0, 0, 0, 0 }
+};
+
+static const DarkMoonAnimCommandProvider kEoB2IntroAnimData39DOSProvider = { ARRAYSIZE(kEoB2IntroAnimData39DOS), kEoB2IntroAnimData39DOS };
+
+static const DarkMoonAnimCommand kEoB2IntroAnimData40DOS[32] = {
+ { 0x03, 22, 21, 32, 0, 1, 0, 0, 0, 0 },
+ { 0x03, 23, 67, 80, 1, 1, 0, 0, 0, 0 },
+ { 0x03, 22, 21, 32, 0, 2, 0, 0, 0, 0 },
+ { 0x03, 23, 67, 80, 1, 1, 0, 0, 0, 0 },
+ { 0x03, 22, 21, 32, 0, 3, 0, 0, 0, 0 },
+ { 0x03, 23, 67, 80, 1, 2, 0, 0, 0, 0 },
+ { 0x03, 22, 21, 32, 0, 4, 0, 0, 0, 0 },
+ { 0x03, 23, 67, 80, 1, 3, 0, 0, 0, 0 },
+ { 0x06, 11, 0, 0, 0, 0, 0, 0, 0, 0 },
+ { 0x03, 22, 21, 32, 0, 5, 0, 0, 0, 0 },
+ { 0x03, 23, 67, 80, 1, 4, 0, 0, 0, 0 },
+ { 0x03, 22, 21, 32, 0, 6, 0, 0, 0, 0 },
+ { 0x03, 23, 67, 80, 1, 5, 0, 0, 0, 0 },
+ { 0x03, 22, 21, 32, 0, 7, 0, 0, 0, 0 },
+ { 0x03, 23, 67, 80, 18, 6, 0, 0, 0, 0 },
+ { 0x03, 22, 21, 32, 0, 7, 0, 0, 0, 0 },
+ { 0x03, 23, 67, 80, 90, 6, 0, 0, 0, 0 },
+ { 0x03, 22, 21, 32, 0, 6, 0, 0, 0, 0 },
+ { 0x03, 23, 67, 80, 1, 5, 0, 0, 0, 0 },
+ { 0x03, 22, 21, 32, 0, 5, 0, 0, 0, 0 },
+ { 0x03, 23, 67, 80, 1, 4, 0, 0, 0, 0 },
+ { 0x03, 22, 21, 32, 0, 4, 0, 0, 0, 0 },
+ { 0x03, 23, 67, 80, 1, 3, 0, 0, 0, 0 },
+ { 0x03, 22, 21, 32, 0, 3, 0, 0, 0, 0 },
+ { 0x03, 23, 67, 80, 1, 2, 0, 0, 0, 0 },
+ { 0x03, 22, 21, 32, 0, 2, 0, 0, 0, 0 },
+ { 0x03, 23, 67, 80, 1, 1, 0, 0, 0, 0 },
+ { 0x03, 22, 21, 32, 0, 1, 0, 0, 0, 0 },
+ { 0x03, 23, 67, 80, 1, 1, 0, 0, 0, 0 },
+ { 0x03, 22, 21, 32, 0, 0, 0, 0, 0, 0 },
+ { 0x03, 23, 67, 80, 1, 0, 0, 0, 0, 0 },
+ { 0xFF, 0, 0, 0, 0, 0, 0, 0, 0, 0 }
+};
+
+static const DarkMoonAnimCommandProvider kEoB2IntroAnimData40DOSProvider = { ARRAYSIZE(kEoB2IntroAnimData40DOS), kEoB2IntroAnimData40DOS };
+
+static const DarkMoonAnimCommand kEoB2IntroAnimData41DOS[5] = {
+ { 0x02, 22, 21, 32, 0, 0, 0, 0, 0, 0 },
+ { 0x02, 23, 67, 80, 90, 0, 0, 0, 0, 0 },
+ { 0x07, 22, 21, 32, 0, 0, 0, 0, 0, 0 },
+ { 0x07, 23, 67, 80, 0, 0, 0, 0, 0, 0 },
+ { 0xFF, 0, 0, 0, 0, 0, 0, 0, 0, 0 }
+};
+
+static const DarkMoonAnimCommandProvider kEoB2IntroAnimData41DOSProvider = { ARRAYSIZE(kEoB2IntroAnimData41DOS), kEoB2IntroAnimData41DOS };
+
+static const DarkMoonAnimCommand kEoB2IntroAnimData42DOS[3] = {
+ { 0x06, 3, 0, 0, 0, 0, 0, 0, 0, 0 },
+ { 0x00, 0, 0, 0, 1, 2, 0, 0, 0, 0 },
+ { 0xFF, 0, 0, 0, 0, 0, 0, 0, 0, 0 }
+};
+
+static const DarkMoonAnimCommandProvider kEoB2IntroAnimData42DOSProvider = { ARRAYSIZE(kEoB2IntroAnimData42DOS), kEoB2IntroAnimData42DOS };
+
+static const DarkMoonAnimCommand kEoB2IntroAnimData43DOS[5] = {
+ { 0x06, 5, 0, 0, 0, 0, 0, 0, 0, 0 },
+ { 0x00, 0, 0, 0, 1, 3, 0, 0, 0, 0 },
+ { 0x00, 0, 0, 0, 1, 3, 0, 0, 0, 0 },
+ { 0x00, 0, 0, 0, 1, 3, 0, 0, 0, 0 },
+ { 0xFF, 0, 0, 0, 0, 0, 0, 0, 0, 0 }
+};
+
+static const DarkMoonAnimCommandProvider kEoB2IntroAnimData43DOSProvider = { ARRAYSIZE(kEoB2IntroAnimData43DOS), kEoB2IntroAnimData43DOS };
+
+static const DarkMoonShapeDef kEoB2IntroShapes00DOS[15] = {
+ { 0, 1, 137, 4, 43 },
+ { 1, 5, 137, 4, 54 },
+ { 2, 9, 140, 4, 8 },
+ { 3, 1, 181, 1, 3 },
+ { 4, 9, 154, 1, 3 },
+ { 5, 9, 158, 2, 5 },
+ { 6, 9, 164, 3, 7 },
+ { 7, 9, 172, 3, 11 },
+ { 8, 9, 184, 5, 13 },
+ { 9, 15, 137, 6, 15 },
+ { 10, 15, 153, 2, 21 },
+ { 11, 17, 153, 2, 21 },
+ { 12, 1, 185, 1, 4 },
+ { 13, 1, 190, 1, 1 },
+ { 0, 0, 0, 0, 0 }
+};
+
+static const DarkMoonShapeDefProvider kEoB2IntroShapes00DOSProvider = { ARRAYSIZE(kEoB2IntroShapes00DOS), kEoB2IntroShapes00DOS };
+
+static const DarkMoonShapeDef kEoB2IntroShapes01DOS[2] = {
+ { 0, 1, 137, 1, 16 },
+ { 0, 0, 0, 0, 0 }
+};
+
+static const DarkMoonShapeDefProvider kEoB2IntroShapes01DOSProvider = { ARRAYSIZE(kEoB2IntroShapes01DOS), kEoB2IntroShapes01DOS };
+
+static const DarkMoonShapeDef kEoB2IntroShapes04DOS[10] = {
+ { 15, 2, 0, 32, 14 },
+ { 16, 5, 16, 5, 8 },
+ { 17, 2, 27, 32, 18 },
+ { 18, 0, 140, 35, 10 },
+ { 19, 21, 16, 3, 8 },
+ { 20, 0, 47, 22, 10 },
+ { 21, 0, 59, 31, 10 },
+ { 22, 0, 71, 35, 39 },
+ { 23, 0, 119, 24, 15 },
+ { 0, 0, 0, 0, 0 }
+};
+
+static const DarkMoonShapeDefProvider kEoB2IntroShapes04DOSProvider = { ARRAYSIZE(kEoB2IntroShapes04DOS), kEoB2IntroShapes04DOS };
+
+static const DarkMoonShapeDef kEoB2IntroShapes07DOS[18] = {
+ { -9, 1, 136, 6, 40 },
+ { -1, 7, 136, 6, 40 },
+ { -2, 13, 136, 6, 40 },
+ { 3, 19, 136, 2, 16 },
+ { 4, 21, 136, 2, 16 },
+ { 5, 23, 136, 2, 16 },
+ { 6, 19, 152, 1, 8 },
+ { 7, 20, 152, 1, 8 },
+ { 8, 21, 152, 1, 8 },
+ { -10, 25, 136, 2, 16 },
+ { -11, 27, 136, 2, 16 },
+ { -12, 29, 136, 2, 16 },
+ { -13, 31, 136, 2, 16 },
+ { -14, 25, 152, 2, 16 },
+ { -15, 27, 152, 2, 16 },
+ { -16, 29, 152, 2, 16 },
+ { -17, 31, 152, 2, 16 },
+ { 0, 0, 0, 0, 0 }
+};
+
+static const DarkMoonShapeDefProvider kEoB2IntroShapes07DOSProvider = { ARRAYSIZE(kEoB2IntroShapes07DOS), kEoB2IntroShapes07DOS };
+
+static const DarkMoonAnimCommand kEoB2FinaleAnimData00DOS[11] = {
+ { 0x06, 4, 0, 0, 0, 0, 0, 0, 0, 0 },
+ { 0x05, 0, 136, 8, 8, 0, 5, 136, 11, 48 },
+ { 0x02, 1, 136, 8, 0, 0, 0, 0, 0, 0 },
+ { 0x05, 0, 80, 8, 0, 0, 0, 136, 5, 40 },
+ { 0x06, 5, 0, 0, 0, 0, 0, 0, 0, 0 },
+ { 0x05, 0, 232, 88, 4, 0, 0, 88, 8, 48 },
+ { 0x02, 3, 80, 8, 0, 0, 0, 0, 0, 0 },
+ { 0x05, 0, 232, 88, 4, 0, 8, 88, 8, 48 },
+ { 0x05, 0, 232, 88, 4, 0, 16, 88, 8, 48 },
+ { 0x02, 2, 232, 88, 4, 0, 0, 0, 0, 0 },
+ { 0xFF, 0, 0, 0, 0, 0, 0, 0, 0, 0 }
+};
+
+static const DarkMoonAnimCommandProvider kEoB2FinaleAnimData00DOSProvider = { ARRAYSIZE(kEoB2FinaleAnimData00DOS), kEoB2FinaleAnimData00DOS };
+
+static const DarkMoonAnimCommand kEoB2FinaleAnimData01DOS[9] = {
+ { 0x06, 4, 0, 0, 0, 0, 0, 0, 0, 0 },
+ { 0x05, 0, 136, 8, 12, 0, 5, 136, 11, 48 },
+ { 0x02, 1, 136, 8, 0, 0, 0, 0, 0, 0 },
+ { 0x06, 5, 0, 0, 0, 0, 0, 0, 0, 0 },
+ { 0x05, 0, 232, 88, 6, 0, 0, 88, 8, 48 },
+ { 0x05, 0, 232, 88, 6, 0, 8, 88, 8, 48 },
+ { 0x05, 0, 232, 88, 6, 0, 16, 88, 8, 48 },
+ { 0x02, 2, 232, 88, 6, 0, 0, 0, 0, 0 },
+ { 0xFF, 0, 0, 0, 0, 0, 0, 0, 0, 0 }
+};
+
+static const DarkMoonAnimCommandProvider kEoB2FinaleAnimData01DOSProvider = { ARRAYSIZE(kEoB2FinaleAnimData01DOS), kEoB2FinaleAnimData01DOS };
+
+static const DarkMoonAnimCommand kEoB2FinaleAnimData02DOS[4] = {
+ { 0x05, 0, 232, 112, 6, 0, 24, 176, 3, 16 },
+ { 0x05, 0, 232, 112, 6, 0, 27, 176, 3, 16 },
+ { 0x05, 0, 232, 112, 6, 0, 30, 176, 3, 16 },
+ { 0xFF, 0, 0, 0, 0, 0, 0, 0, 0, 0 }
+};
+
+static const DarkMoonAnimCommandProvider kEoB2FinaleAnimData02DOSProvider = { ARRAYSIZE(kEoB2FinaleAnimData02DOS), kEoB2FinaleAnimData02DOS };
+
+static const DarkMoonAnimCommand kEoB2FinaleAnimData03DOS[6] = {
+ { 0x05, 0, 80, 8, 0, 0, 0, 136, 5, 40 },
+ { 0x05, 0, 232, 112, 3, 0, 24, 176, 3, 16 },
+ { 0x02, 3, 80, 8, 3, 0, 0, 0, 0, 0 },
+ { 0x05, 0, 232, 112, 3, 0, 27, 176, 3, 16 },
+ { 0x05, 0, 232, 112, 3, 0, 30, 176, 3, 16 },
+ { 0xFF, 0, 0, 0, 0, 0, 0, 0, 0, 0 }
+};
+
+static const DarkMoonAnimCommandProvider kEoB2FinaleAnimData03DOSProvider = { ARRAYSIZE(kEoB2FinaleAnimData03DOS), kEoB2FinaleAnimData03DOS };
+
+static const DarkMoonAnimCommand kEoB2FinaleAnimData04DOS[8] = {
+ { 0x06, 6, 0, 0, 0, 0, 0, 0, 0, 0 },
+ { 0x05, 0, 104, 40, 3, 0, 32, 88, 8, 88 },
+ { 0x05, 0, 104, 40, 3, 0, 32, 0, 8, 88 },
+ { 0x05, 0, 104, 40, 3, 0, 24, 0, 8, 88 },
+ { 0x05, 0, 104, 40, 3, 0, 16, 0, 8, 88 },
+ { 0x05, 0, 104, 40, 3, 0, 0, 0, 8, 88 },
+ { 0x05, 0, 104, 40, 3, 0, 24, 88, 8, 88 },
+ { 0xFF, 0, 0, 0, 0, 0, 0, 0, 0, 0 }
+};
+
+static const DarkMoonAnimCommandProvider kEoB2FinaleAnimData04DOSProvider = { ARRAYSIZE(kEoB2FinaleAnimData04DOS), kEoB2FinaleAnimData04DOS };
+
+static const DarkMoonAnimCommand kEoB2FinaleAnimData05DOS[7] = {
+ { 0x05, 0, 232, 112, 0, 0, 24, 176, 3, 16 },
+ { 0x05, 0, 128, 40, 4, 0, 33, 176, 2, 16 },
+ { 0x05, 0, 232, 112, 0, 0, 27, 176, 3, 16 },
+ { 0x05, 0, 128, 40, 4, 0, 35, 176, 2, 16 },
+ { 0x05, 0, 232, 112, 0, 0, 30, 176, 3, 16 },
+ { 0x05, 0, 128, 40, 4, 0, 37, 176, 2, 16 },
+ { 0xFF, 0, 0, 0, 0, 0, 0, 0, 0, 0 }
+};
+
+static const DarkMoonAnimCommandProvider kEoB2FinaleAnimData05DOSProvider = { ARRAYSIZE(kEoB2FinaleAnimData05DOS), kEoB2FinaleAnimData05DOS };
+
+static const DarkMoonAnimCommand kEoB2FinaleAnimData06DOS[2] = {
+ { 0x05, 0, 104, 40, 0, 0, 16, 136, 8, 48 },
+ { 0xFF, 0, 0, 0, 0, 0, 0, 0, 0, 0 }
+};
+
+static const DarkMoonAnimCommandProvider kEoB2FinaleAnimData06DOSProvider = { ARRAYSIZE(kEoB2FinaleAnimData06DOS), kEoB2FinaleAnimData06DOS };
+
+static const DarkMoonAnimCommand kEoB2FinaleAnimData07DOS[6] = {
+ { 0x05, 0, 208, 80, 4, 0, 0, 128, 6, 56 },
+ { 0x05, 0, 208, 80, 4, 0, 6, 128, 6, 56 },
+ { 0x05, 0, 208, 80, 4, 0, 12, 128, 6, 56 },
+ { 0x05, 0, 208, 80, 4, 0, 18, 128, 6, 56 },
+ { 0x05, 0, 208, 80, 4, 0, 24, 128, 6, 56 },
+ { 0xFF, 0, 0, 0, 0, 0, 0, 0, 0, 0 }
+};
+
+static const DarkMoonAnimCommandProvider kEoB2FinaleAnimData07DOSProvider = { ARRAYSIZE(kEoB2FinaleAnimData07DOS), kEoB2FinaleAnimData07DOS };
+
+static const DarkMoonAnimCommand kEoB2FinaleAnimData08DOS[3] = {
+ { 0x05, 0, 224, 56, 3, 0, 0, 184, 4, 16 },
+ { 0x05, 0, 224, 56, 0, 0, 4, 184, 4, 16 },
+ { 0xFF, 0, 0, 0, 0, 0, 0, 0, 0, 0 }
+};
+
+static const DarkMoonAnimCommandProvider kEoB2FinaleAnimData08DOSProvider = { ARRAYSIZE(kEoB2FinaleAnimData08DOS), kEoB2FinaleAnimData08DOS };
+
+static const DarkMoonAnimCommand kEoB2FinaleAnimData09DOS[8] = {
+ { 0x01, 1, -10, 40, 2, 0, 0, 0, 0, 0 },
+ { 0x01, 1, 0, 40, 2, 0, 0, 0, 0, 0 },
+ { 0x01, 1, 10, 40, 2, 0, 0, 0, 0, 0 },
+ { 0x01, 1, 20, 40, 2, 0, 0, 0, 0, 0 },
+ { 0x01, 1, 30, 40, 2, 0, 0, 0, 0, 0 },
+ { 0x01, 1, 40, 40, 2, 0, 0, 0, 0, 0 },
+ { 0x02, 2, 48, 40, 2, 0, 0, 0, 0, 0 },
+ { 0xFF, 0, 0, 0, 0, 0, 0, 0, 0, 0 }
+};
+
+static const DarkMoonAnimCommandProvider kEoB2FinaleAnimData09DOSProvider = { ARRAYSIZE(kEoB2FinaleAnimData09DOS), kEoB2FinaleAnimData09DOS };
+
+static const DarkMoonAnimCommand kEoB2FinaleAnimData10DOS[14] = {
+ { 0x05, 1, 8, 40, 0, 0, 32, 0, 8, 80 },
+ { 0x05, 1, 280, 96, 0, 0, 24, 160, 4, 40 },
+ { 0x05, 1, 96, 96, 3, 0, 12, 80, 1, 16 },
+ { 0x05, 1, 8, 40, 0, 0, 32, 80, 8, 80 },
+ { 0x05, 1, 280, 96, 0, 0, 28, 160, 4, 40 },
+ { 0x05, 1, 96, 96, 3, 0, 13, 80, 1, 16 },
+ { 0x05, 1, 8, 40, 0, 0, 24, 80, 8, 80 },
+ { 0x05, 1, 280, 96, 0, 0, 32, 160, 4, 40 },
+ { 0x05, 1, 96, 96, 3, 0, 14, 80, 1, 16 },
+ { 0x06, 8, 0, 0, 0, 0, 0, 0, 0, 0 },
+ { 0x05, 1, 40, 32, 0, 0, 0, 40, 16, 40 },
+ { 0x05, 1, 248, 88, 0, 0, 12, 176, 6, 24 },
+ { 0x05, 1, 96, 80, 3, 0, 0, 128, 12, 24 },
+ { 0xFF, 0, 0, 0, 0, 0, 0, 0, 0, 0 }
+};
+
+static const DarkMoonAnimCommandProvider kEoB2FinaleAnimData10DOSProvider = { ARRAYSIZE(kEoB2FinaleAnimData10DOS), kEoB2FinaleAnimData10DOS };
+
+static const DarkMoonAnimCommand kEoB2FinaleAnimData11DOS[18] = {
+ { 0x05, 1, 40, 32, 0, 0, 16, 40, 16, 40 },
+ { 0x05, 1, 248, 88, 0, 0, 18, 176, 6, 24 },
+ { 0x05, 1, 96, 80, 0, 0, 0, 152, 12, 24 },
+ { 0x05, 1, 8, 40, 0, 0, 24, 80, 8, 80 },
+ { 0x05, 1, 280, 96, 0, 0, 32, 160, 4, 40 },
+ { 0x05, 1, 96, 96, 0, 0, 14, 80, 1, 16 },
+ { 0x05, 0, 168, 16, 0, 0, 32, 0, 8, 80 },
+ { 0x05, 0, 232, 16, 0, 0, 32, 80, 8, 80 },
+ { 0x05, 1, 8, 40, 0, 0, 24, 80, 8, 80 },
+ { 0x05, 1, 280, 96, 0, 0, 32, 160, 4, 40 },
+ { 0x05, 1, 96, 96, 3, 0, 14, 80, 1, 16 },
+ { 0x05, 1, 8, 40, 0, 0, 32, 0, 8, 80 },
+ { 0x05, 1, 280, 96, 0, 0, 24, 160, 4, 40 },
+ { 0x05, 1, 96, 96, 3, 0, 12, 80, 1, 16 },
+ { 0x05, 1, 8, 40, 0, 0, 16, 80, 8, 80 },
+ { 0x05, 1, 280, 96, 0, 0, 36, 160, 4, 40 },
+ { 0x05, 1, 96, 96, 3, 0, 15, 80, 1, 16 },
+ { 0xFF, 0, 0, 0, 0, 0, 0, 0, 0, 0 }
+};
+
+static const DarkMoonAnimCommandProvider kEoB2FinaleAnimData11DOSProvider = { ARRAYSIZE(kEoB2FinaleAnimData11DOS), kEoB2FinaleAnimData11DOS };
+
+static const DarkMoonAnimCommand kEoB2FinaleAnimData12DOS[23] = {
+ { 0x05, 1, 40, 32, 0, 0, 16, 40, 16, 40 },
+ { 0x05, 1, 248, 88, 0, 0, 18, 176, 6, 24 },
+ { 0x05, 1, 96, 80, 0, 0, 0, 152, 12, 24 },
+ { 0x05, 1, 8, 40, 0, 0, 24, 80, 8, 80 },
+ { 0x05, 1, 280, 96, 0, 0, 32, 160, 4, 40 },
+ { 0x05, 1, 96, 96, 0, 0, 14, 80, 1, 16 },
+ { 0x05, 0, 168, 16, 0, 0, 32, 0, 8, 80 },
+ { 0x05, 0, 232, 16, 0, 0, 32, 80, 8, 80 },
+ { 0x06, 15, 0, 0, 0, 0, 0, 0, 0, 0 },
+ { 0x02, 2, 168, 16, 0, 0, 0, 0, 0, 0 },
+ { 0x05, 1, 8, 40, 0, 0, 32, 0, 8, 80 },
+ { 0x05, 1, 280, 96, 0, 0, 24, 160, 4, 40 },
+ { 0x05, 1, 96, 96, 3, 0, 12, 80, 1, 16 },
+ { 0x05, 0, 168, 16, 0, 0, 32, 0, 8, 80 },
+ { 0x05, 0, 232, 16, 0, 0, 32, 80, 8, 80 },
+ { 0x06, 15, 0, 0, 0, 0, 0, 0, 0, 0 },
+ { 0x02, 3, 168, 16, 0, 0, 0, 0, 0, 0 },
+ { 0x05, 1, 8, 40, 0, 0, 16, 80, 8, 80 },
+ { 0x05, 1, 280, 96, 0, 0, 36, 160, 4, 40 },
+ { 0x05, 1, 96, 96, 3, 0, 15, 80, 1, 16 },
+ { 0x05, 0, 168, 16, 0, 0, 32, 0, 8, 80 },
+ { 0x05, 0, 232, 16, 0, 0, 32, 80, 8, 80 },
+ { 0xFF, 0, 0, 0, 0, 0, 0, 0, 0, 0 }
+};
+
+static const DarkMoonAnimCommandProvider kEoB2FinaleAnimData12DOSProvider = { ARRAYSIZE(kEoB2FinaleAnimData12DOS), kEoB2FinaleAnimData12DOS };
+
+static const DarkMoonAnimCommand kEoB2FinaleAnimData13DOS[23] = {
+ { 0x06, 15, 0, 0, 0, 0, 0, 0, 0, 0 },
+ { 0x02, 1, 168, 16, 0, 0, 0, 0, 0, 0 },
+ { 0x06, 9, 0, 0, 0, 0, 0, 0, 0, 0 },
+ { 0x05, 1, 40, 32, 0, 0, 0, 0, 16, 40 },
+ { 0x05, 1, 248, 88, 0, 0, 0, 176, 6, 24 },
+ { 0x05, 1, 96, 80, 3, 0, 0, 80, 12, 24 },
+ { 0x05, 0, 168, 16, 0, 0, 32, 0, 8, 80 },
+ { 0x05, 0, 232, 16, 0, 0, 32, 80, 8, 80 },
+ { 0x06, 15, 0, 0, 0, 0, 0, 0, 0, 0 },
+ { 0x02, 3, 168, 16, 0, 0, 0, 0, 0, 0 },
+ { 0x05, 1, 40, 32, 0, 0, 16, 0, 16, 40 },
+ { 0x05, 1, 248, 88, 0, 0, 6, 176, 6, 24 },
+ { 0x05, 1, 96, 80, 3, 0, 0, 104, 12, 24 },
+ { 0x05, 0, 168, 16, 0, 0, 32, 0, 8, 80 },
+ { 0x05, 0, 232, 16, 0, 0, 32, 80, 8, 80 },
+ { 0x06, 15, 0, 0, 0, 0, 0, 0, 0, 0 },
+ { 0x02, 2, 168, 16, 0, 0, 0, 0, 0, 0 },
+ { 0x05, 1, 40, 32, 0, 0, 0, 40, 16, 40 },
+ { 0x05, 1, 248, 88, 0, 0, 12, 176, 6, 24 },
+ { 0x05, 1, 96, 80, 3, 0, 0, 128, 12, 24 },
+ { 0x05, 0, 168, 16, 0, 0, 32, 0, 8, 80 },
+ { 0x05, 0, 232, 16, 0, 0, 32, 80, 8, 80 },
+ { 0xFF, 0, 0, 0, 0, 0, 0, 0, 0, 0 }
+};
+
+static const DarkMoonAnimCommandProvider kEoB2FinaleAnimData13DOSProvider = { ARRAYSIZE(kEoB2FinaleAnimData13DOS), kEoB2FinaleAnimData13DOS };
+
+static const DarkMoonAnimCommand kEoB2FinaleAnimData14DOS[24] = {
+ { 0x06, 15, 0, 0, 0, 0, 0, 0, 0, 0 },
+ { 0x02, 1, 168, 16, 0, 0, 0, 0, 0, 0 },
+ { 0x06, 9, 0, 0, 0, 0, 0, 0, 0, 0 },
+ { 0x05, 1, 40, 32, 0, 0, 0, 0, 16, 40 },
+ { 0x05, 1, 248, 88, 0, 0, 0, 176, 6, 24 },
+ { 0x05, 1, 96, 80, 3, 0, 0, 80, 12, 24 },
+ { 0x05, 0, 168, 16, 0, 0, 32, 0, 8, 80 },
+ { 0x05, 0, 232, 16, 0, 0, 32, 80, 8, 80 },
+ { 0x06, 15, 0, 0, 0, 0, 0, 0, 0, 0 },
+ { 0x02, 3, 168, 16, 0, 0, 0, 0, 0, 0 },
+ { 0x05, 1, 40, 32, 0, 0, 16, 0, 16, 40 },
+ { 0x05, 1, 248, 88, 0, 0, 6, 176, 6, 24 },
+ { 0x05, 1, 96, 80, 3, 0, 0, 104, 12, 24 },
+ { 0x05, 0, 168, 16, 0, 0, 32, 0, 8, 80 },
+ { 0x05, 0, 232, 16, 0, 0, 32, 80, 8, 80 },
+ { 0x06, 15, 0, 0, 0, 0, 0, 0, 0, 0 },
+ { 0x02, 2, 168, 16, 0, 0, 0, 0, 0, 0 },
+ { 0x06, 9, 0, 0, 0, 0, 0, 0, 0, 0 },
+ { 0x05, 1, 40, 32, 0, 0, 0, 40, 16, 40 },
+ { 0x05, 1, 248, 88, 0, 0, 12, 176, 6, 24 },
+ { 0x05, 1, 96, 80, 3, 0, 0, 128, 12, 24 },
+ { 0x05, 0, 168, 16, 0, 0, 32, 0, 8, 80 },
+ { 0x05, 0, 232, 16, 0, 0, 32, 80, 8, 80 },
+ { 0xFF, 0, 0, 0, 0, 0, 0, 0, 0, 0 }
+};
+
+static const DarkMoonAnimCommandProvider kEoB2FinaleAnimData14DOSProvider = { ARRAYSIZE(kEoB2FinaleAnimData14DOS), kEoB2FinaleAnimData14DOS };
+
+static const DarkMoonAnimCommand kEoB2FinaleAnimData15DOS[19] = {
+ { 0x05, 1, 40, 32, 0, 0, 0, 0, 16, 40 },
+ { 0x05, 1, 248, 88, 0, 0, 0, 176, 6, 24 },
+ { 0x05, 1, 96, 80, 3, 0, 0, 80, 12, 24 },
+ { 0x05, 0, 168, 16, 0, 0, 32, 0, 8, 80 },
+ { 0x05, 0, 232, 16, 0, 0, 32, 80, 8, 80 },
+ { 0x06, 15, 0, 0, 0, 0, 0, 0, 0, 0 },
+ { 0x02, 3, 168, 16, 0, 0, 0, 0, 0, 0 },
+ { 0x05, 1, 40, 32, 0, 0, 16, 0, 16, 40 },
+ { 0x05, 1, 248, 88, 0, 0, 6, 176, 6, 24 },
+ { 0x05, 1, 96, 80, 3, 0, 0, 104, 12, 24 },
+ { 0x05, 0, 168, 16, 0, 0, 32, 0, 8, 80 },
+ { 0x05, 0, 232, 16, 0, 0, 32, 80, 8, 80 },
+ { 0x06, 9, 0, 0, 0, 0, 0, 0, 0, 0 },
+ { 0x05, 1, 40, 32, 0, 0, 0, 40, 16, 40 },
+ { 0x05, 1, 248, 88, 0, 0, 12, 176, 6, 24 },
+ { 0x05, 1, 96, 80, 3, 0, 0, 128, 12, 24 },
+ { 0x05, 0, 168, 16, 0, 0, 32, 0, 8, 80 },
+ { 0x05, 0, 232, 16, 0, 0, 32, 80, 8, 80 },
+ { 0xFF, 0, 0, 0, 0, 0, 0, 0, 0, 0 }
+};
+
+static const DarkMoonAnimCommandProvider kEoB2FinaleAnimData15DOSProvider = { ARRAYSIZE(kEoB2FinaleAnimData15DOS), kEoB2FinaleAnimData15DOS };
+
+static const DarkMoonAnimCommand kEoB2FinaleAnimData16DOS[13] = {
+ { 0x06, 15, 0, 0, 0, 0, 0, 0, 0, 0 },
+ { 0x02, 1, 168, 16, 3, 0, 0, 0, 0, 0 },
+ { 0x05, 0, 168, 16, 0, 0, 32, 0, 8, 80 },
+ { 0x05, 0, 232, 16, 0, 0, 32, 80, 8, 80 },
+ { 0x06, 15, 0, 0, 0, 0, 0, 0, 0, 0 },
+ { 0x02, 2, 168, 16, 3, 0, 0, 0, 0, 0 },
+ { 0x05, 0, 168, 16, 0, 0, 32, 0, 8, 80 },
+ { 0x05, 0, 232, 16, 0, 0, 32, 80, 8, 80 },
+ { 0x06, 15, 0, 0, 0, 0, 0, 0, 0, 0 },
+ { 0x02, 3, 168, 16, 3, 0, 0, 0, 0, 0 },
+ { 0x05, 0, 168, 16, 0, 0, 32, 0, 8, 80 },
+ { 0x05, 0, 232, 16, 0, 0, 32, 80, 8, 80 },
+ { 0xFF, 0, 0, 0, 0, 0, 0, 0, 0, 0 }
+};
+
+static const DarkMoonAnimCommandProvider kEoB2FinaleAnimData16DOSProvider = { ARRAYSIZE(kEoB2FinaleAnimData16DOS), kEoB2FinaleAnimData16DOS };
+
+static const DarkMoonAnimCommand kEoB2FinaleAnimData17DOS[20] = {
+ { 0x05, 0, 168, 16, 1, 0, 0, 0, 16, 80 },
+ { 0x05, 0, 168, 16, 2, 0, 16, 0, 16, 80 },
+ { 0x05, 0, 168, 16, 3, 0, 0, 0, 16, 80 },
+ { 0x05, 0, 168, 16, 1, 0, 0, 0, 16, 80 },
+ { 0x05, 0, 168, 16, 2, 0, 16, 0, 16, 80 },
+ { 0x05, 0, 168, 16, 3, 0, 0, 80, 16, 80 },
+ { 0x05, 0, 168, 16, 1, 0, 16, 0, 16, 80 },
+ { 0x05, 0, 168, 16, 2, 0, 0, 80, 16, 80 },
+ { 0x05, 0, 168, 16, 3, 0, 16, 0, 16, 80 },
+ { 0x05, 0, 168, 16, 1, 0, 0, 0, 16, 80 },
+ { 0x05, 0, 168, 16, 2, 0, 16, 0, 16, 80 },
+ { 0x06, 10, 0, 0, 0, 0, 0, 0, 0, 0 },
+ { 0x05, 0, 168, 16, 3, 0, 0, 0, 16, 80 },
+ { 0x05, 0, 168, 16, 1, 0, 16, 0, 16, 80 },
+ { 0x05, 0, 168, 16, 2, 0, 0, 80, 16, 80 },
+ { 0x05, 0, 168, 16, 3, 0, 16, 0, 16, 80 },
+ { 0x05, 0, 168, 16, 1, 0, 0, 80, 16, 80 },
+ { 0x05, 0, 168, 16, 2, 0, 16, 0, 16, 80 },
+ { 0x05, 0, 168, 16, 3, 0, 16, 0, 16, 80 },
+ { 0xFF, 0, 0, 0, 0, 0, 0, 0, 0, 0 }
+};
+
+static const DarkMoonAnimCommandProvider kEoB2FinaleAnimData17DOSProvider = { ARRAYSIZE(kEoB2FinaleAnimData17DOS), kEoB2FinaleAnimData17DOS };
+
+static const DarkMoonAnimCommand kEoB2FinaleAnimData18DOS[28] = {
+ { 0x05, 0, 168, 16, 1, 0, 0, 80, 16, 80 },
+ { 0x05, 0, 168, 16, 2, 0, 0, 80, 16, 80 },
+ { 0x05, 0, 168, 16, 3, 0, 16, 80, 16, 80 },
+ { 0x05, 0, 168, 16, 1, 0, 0, 80, 16, 80 },
+ { 0x05, 0, 168, 16, 2, 0, 16, 80, 16, 80 },
+ { 0x05, 0, 168, 16, 3, 0, 0, 80, 16, 80 },
+ { 0x05, 0, 168, 16, 1, 0, 16, 0, 16, 80 },
+ { 0x05, 0, 168, 16, 2, 0, 0, 80, 16, 80 },
+ { 0x05, 0, 168, 16, 3, 0, 16, 80, 16, 80 },
+ { 0x05, 0, 168, 16, 1, 0, 0, 80, 16, 80 },
+ { 0x05, 0, 168, 16, 2, 0, 16, 0, 16, 80 },
+ { 0x05, 0, 168, 16, 3, 0, 0, 0, 16, 80 },
+ { 0x05, 0, 168, 16, 1, 0, 0, 0, 16, 80 },
+ { 0x05, 0, 168, 16, 2, 0, 16, 0, 16, 80 },
+ { 0x05, 0, 168, 16, 3, 0, 0, 80, 16, 80 },
+ { 0x05, 0, 168, 16, 1, 0, 16, 80, 16, 80 },
+ { 0x05, 0, 168, 16, 2, 0, 0, 80, 16, 80 },
+ { 0x05, 0, 168, 16, 3, 0, 16, 0, 16, 80 },
+ { 0x05, 0, 168, 16, 1, 0, 0, 80, 16, 80 },
+ { 0x05, 0, 168, 16, 2, 0, 16, 80, 16, 80 },
+ { 0x05, 0, 168, 16, 3, 0, 0, 80, 16, 80 },
+ { 0x05, 0, 168, 16, 1, 0, 16, 80, 16, 80 },
+ { 0x05, 0, 168, 16, 2, 0, 0, 80, 16, 80 },
+ { 0x05, 0, 168, 16, 3, 0, 16, 0, 16, 80 },
+ { 0x05, 0, 168, 16, 1, 0, 0, 80, 16, 80 },
+ { 0x05, 0, 168, 16, 2, 0, 16, 80, 16, 80 },
+ { 0x05, 0, 168, 16, 0, 0, 16, 80, 16, 80 },
+ { 0xFF, 0, 0, 0, 0, 0, 0, 0, 0, 0 }
+};
+
+static const DarkMoonAnimCommandProvider kEoB2FinaleAnimData18DOSProvider = { ARRAYSIZE(kEoB2FinaleAnimData18DOS), kEoB2FinaleAnimData18DOS };
+
+static const DarkMoonAnimCommand kEoB2FinaleAnimData19DOS[7] = {
+ { 0x05, 0, 80, 80, 4, 0, 0, 128, 6, 56 },
+ { 0x05, 0, 80, 80, 4, 0, 6, 128, 6, 56 },
+ { 0x05, 0, 80, 80, 4, 0, 12, 128, 6, 56 },
+ { 0x05, 0, 80, 80, 4, 0, 18, 128, 6, 56 },
+ { 0x05, 0, 80, 80, 4, 0, 24, 128, 6, 56 },
+ { 0x05, 0, 80, 80, 4, 0, 30, 128, 6, 56 },
+ { 0xFF, 0, 0, 0, 0, 0, 0, 0, 0, 0 }
+};
+
+static const DarkMoonAnimCommandProvider kEoB2FinaleAnimData19DOSProvider = { ARRAYSIZE(kEoB2FinaleAnimData19DOS), kEoB2FinaleAnimData19DOS };
+
+static const DarkMoonAnimCommand kEoB2FinaleAnimData20DOS[3] = {
+ { 0x05, 0, 96, 56, 3, 0, 0, 184, 4, 16 },
+ { 0x05, 0, 96, 56, 0, 0, 4, 184, 4, 16 },
+ { 0xFF, 0, 0, 0, 0, 0, 0, 0, 0, 0 }
+};
+
+static const DarkMoonAnimCommandProvider kEoB2FinaleAnimData20DOSProvider = { ARRAYSIZE(kEoB2FinaleAnimData20DOS), kEoB2FinaleAnimData20DOS };
+
+static const DarkMoonShapeDef kEoB2FinaleShapes00DOS[4] = {
+ { -1, 16, 0, 11, 48 },
+ { -2, 28, 80, 8, 48 },
+ { -3, 9, 0, 5, 40 },
+ { 0, 0, 0, 0, 0 }
+};
+
+static const DarkMoonShapeDefProvider kEoB2FinaleShapes00DOSProvider = { ARRAYSIZE(kEoB2FinaleShapes00DOS), kEoB2FinaleShapes00DOS };
+
+static const DarkMoonShapeDef kEoB2FinaleShapes03DOS[3] = {
+ { -1, 30, 0, 8, 96 },
+ { -2, 30, 104, 10, 96 },
+ { 0, 0, 0, 0, 0 }
+};
+
+static const DarkMoonShapeDefProvider kEoB2FinaleShapes03DOSProvider = { ARRAYSIZE(kEoB2FinaleShapes03DOS), kEoB2FinaleShapes03DOS };
+
+static const DarkMoonShapeDef kEoB2FinaleShapes07DOS[4] = {
+ { 1, 0, 0, 16, 72 },
+ { 2, 16, 0, 16, 72 },
+ { 3, 0, 72, 16, 72 },
+ { 0, 0, 0, 0, 0 }
+};
+
+static const DarkMoonShapeDefProvider kEoB2FinaleShapes07DOSProvider = { ARRAYSIZE(kEoB2FinaleShapes07DOS), kEoB2FinaleShapes07DOS };
+
+static const DarkMoonShapeDef kEoB2FinaleShapes09DOS[9] = {
+ { 0, 0, 0, 32, 16 },
+ { 2, 0, 36, 35, 41 },
+ { 3, 0, 77, 24, 17 },
+ { 4, 0, 94, 15, 33 },
+ { 5, 24, 77, 10, 17 },
+ { 6, 16, 99, 23, 69 },
+ { -10, 0, 136, 8, 64 },
+ { -11, 8, 136, 8, 64 },
+ { 0, 0, 0, 0, 0 }
+};
+
+static const DarkMoonShapeDefProvider kEoB2FinaleShapes09DOSProvider = { ARRAYSIZE(kEoB2FinaleShapes09DOS), kEoB2FinaleShapes09DOS };
+
+static const DarkMoonShapeDef kEoB2FinaleShapes10DOS[4] = {
+ { 1, 0, 0, 40, 30 },
+ { 15, 9, 37, 21, 48 },
+ { 16, 16, 88, 6, 56 },
+ { 0, 0, 0, 0, 0 }
+};
+
+static const DarkMoonShapeDefProvider kEoB2FinaleShapes10DOSProvider = { ARRAYSIZE(kEoB2FinaleShapes10DOS), kEoB2FinaleShapes10DOS };
+
+static const byte kEoB2NpcShapeDataDOS[24] = {
+ 0x00, 0x00, 0x00, 0x05, 0x39, 0x00, 0x00, 0xFF,
+ 0x00, 0x00, 0x64, 0x05, 0x4F, 0x00, 0x00, 0xFF,
+ 0x00, 0x00, 0x39, 0x06, 0x2B, 0x00, 0x00, 0xFF
+};
+
+static const ByteProvider kEoB2NpcShapeDataDOSProvider = { ARRAYSIZE(kEoB2NpcShapeDataDOS), kEoB2NpcShapeDataDOS };
+
+static const byte kEoB2ClassModifierFlagsDOS[15] = {
+ 0x01, 0x20, 0x10, 0x02, 0x04, 0x08, 0x05, 0x09,
+ 0x03, 0x0B, 0x0A, 0x0C, 0x07, 0x05, 0x06
+};
+
+static const ByteProvider kEoB2ClassModifierFlagsDOSProvider = { ARRAYSIZE(kEoB2ClassModifierFlagsDOS), kEoB2ClassModifierFlagsDOS };
+
+static const byte kEoB2MonsterStepTable02DOS[8] = {
+ 0xE0, 0xE1, 0x01, 0x21, 0x20, 0x1F, 0xFF, 0xDF
+};
+
+static const ByteProvider kEoB2MonsterStepTable02DOSProvider = { ARRAYSIZE(kEoB2MonsterStepTable02DOS), kEoB2MonsterStepTable02DOS };
+
+static const byte kEoB2MonsterStepTable1DOS[16] = {
+ 0x01, 0xE0, 0x00, 0x00, 0x00, 0x20, 0x01, 0x00,
+ 0x00, 0x00, 0xFF, 0x20, 0xFF, 0x00, 0x00, 0xE0
+};
+
+static const ByteProvider kEoB2MonsterStepTable1DOSProvider = { ARRAYSIZE(kEoB2MonsterStepTable1DOS), kEoB2MonsterStepTable1DOS };
+
+static const byte kEoB2MonsterStepTable2DOS[8] = {
+ 0x07, 0xFA, 0x05, 0xFC, 0x03, 0xFE, 0x01, 0x00
+};
+
+static const ByteProvider kEoB2MonsterStepTable2DOSProvider = { ARRAYSIZE(kEoB2MonsterStepTable2DOS), kEoB2MonsterStepTable2DOS };
+
+static const byte kEoB2MonsterStepTable3DOS[8] = {
+ 0xF9, 0x06, 0xFB, 0x04, 0xFD, 0x02, 0xFF, 0x00
+};
+
+static const ByteProvider kEoB2MonsterStepTable3DOSProvider = { ARRAYSIZE(kEoB2MonsterStepTable3DOS), kEoB2MonsterStepTable3DOS };
+
+static const byte kEoB2MonsterCloseAttPosTable1DOS[4] = {
+ 0x00, 0x01, 0x03, 0x02
+};
+
+static const ByteProvider kEoB2MonsterCloseAttPosTable1DOSProvider = { ARRAYSIZE(kEoB2MonsterCloseAttPosTable1DOS), kEoB2MonsterCloseAttPosTable1DOS };
+
+static const byte kEoB2MonsterCloseAttPosTable22DOS[16] = {
+ 0x00, 0x01, 0x02, 0x03, 0x00, 0x02, 0x01, 0x03,
+ 0x00, 0x01, 0x02, 0x03, 0x03, 0x01, 0x02, 0x00
+};
+
+static const ByteProvider kEoB2MonsterCloseAttPosTable22DOSProvider = { ARRAYSIZE(kEoB2MonsterCloseAttPosTable22DOS), kEoB2MonsterCloseAttPosTable22DOS };
+
+static const byte kEoB2MonsterCloseAttUnkTableDOS[12] = {
+ 0xFF, 0x03, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+ 0x00, 0x02, 0xFF, 0x01
+};
+
+static const ByteProvider kEoB2MonsterCloseAttUnkTableDOSProvider = { ARRAYSIZE(kEoB2MonsterCloseAttUnkTableDOS), kEoB2MonsterCloseAttUnkTableDOS };
+
+static const byte kEoB2MonsterCloseAttChkTable1DOS[16] = {
+ 0x01, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01,
+ 0x00, 0x00, 0x01, 0x01, 0x01, 0x00, 0x01, 0x00
+};
+
+static const ByteProvider kEoB2MonsterCloseAttChkTable1DOSProvider = { ARRAYSIZE(kEoB2MonsterCloseAttChkTable1DOS), kEoB2MonsterCloseAttChkTable1DOS };
+
+static const byte kEoB2MonsterCloseAttChkTable2DOS[16] = {
+ 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x01, 0x01,
+ 0x01, 0x00, 0x01, 0x00, 0x01, 0x01, 0x00, 0x00
+};
+
+static const ByteProvider kEoB2MonsterCloseAttChkTable2DOSProvider = { ARRAYSIZE(kEoB2MonsterCloseAttChkTable2DOS), kEoB2MonsterCloseAttChkTable2DOS };
+
+static const byte kEoB2MonsterCloseAttDstTable1DOS[16] = {
+ 0x02, 0x03, 0x00, 0x01, 0x01, 0x02, 0x03, 0x00,
+ 0x00, 0x01, 0x02, 0x03, 0x03, 0x00, 0x01, 0x02
+};
+
+static const ByteProvider kEoB2MonsterCloseAttDstTable1DOSProvider = { ARRAYSIZE(kEoB2MonsterCloseAttDstTable1DOS), kEoB2MonsterCloseAttDstTable1DOS };
+
+static const byte kEoB2MonsterCloseAttDstTable2DOS[48] = {
+ 0x01, 0x00, 0x03, 0x02, 0x05, 0x04, 0x00, 0x01,
+ 0x02, 0x03, 0x04, 0x05, 0x05, 0x03, 0x01, 0x04,
+ 0x02, 0x00, 0x01, 0x03, 0x05, 0x00, 0x02, 0x04,
+ 0x04, 0x05, 0x02, 0x03, 0x00, 0x01, 0x05, 0x04,
+ 0x03, 0x02, 0x01, 0x00, 0x00, 0x02, 0x04, 0x01,
+ 0x03, 0x05, 0x04, 0x02, 0x00, 0x05, 0x03, 0x01
+};
+
+static const ByteProvider kEoB2MonsterCloseAttDstTable2DOSProvider = { ARRAYSIZE(kEoB2MonsterCloseAttDstTable2DOS), kEoB2MonsterCloseAttDstTable2DOS };
+
+static const byte kEoB2MonsterProximityTableDOS[32] = {
+ 0x02, 0x03, 0x00, 0x01, 0x03, 0x02, 0x01, 0x00,
+ 0x00, 0x02, 0x01, 0x03, 0x02, 0x00, 0x03, 0x01,
+ 0x01, 0x00, 0x03, 0x02, 0x00, 0x01, 0x02, 0x03,
+ 0x03, 0x01, 0x00, 0x02, 0x01, 0x03, 0x02, 0x00
+};
+
+static const ByteProvider kEoB2MonsterProximityTableDOSProvider = { ARRAYSIZE(kEoB2MonsterProximityTableDOS), kEoB2MonsterProximityTableDOS };
+
+static const byte kEoB2FindBlockMonstersTableDOS[64] = {
+ 0x04, 0x02, 0x01, 0x03, 0x04, 0x03, 0x00, 0x02,
+ 0x04, 0x00, 0x03, 0x01, 0x04, 0x01, 0x02, 0x00,
+ 0x04, 0x01, 0x02, 0x03, 0x04, 0x00, 0x03, 0x02,
+ 0x04, 0x03, 0x00, 0x01, 0x04, 0x02, 0x01, 0x00,
+ 0x04, 0x02, 0x01, 0x03, 0x04, 0x03, 0x00, 0x02,
+ 0x04, 0x00, 0x03, 0x01, 0x04, 0x01, 0x02, 0x00,
+ 0x04, 0x01, 0x02, 0x03, 0x04, 0x00, 0x03, 0x02,
+ 0x04, 0x03, 0x00, 0x01, 0x04, 0x02, 0x01, 0x00
+};
+
+static const ByteProvider kEoB2FindBlockMonstersTableDOSProvider = { ARRAYSIZE(kEoB2FindBlockMonstersTableDOS), kEoB2FindBlockMonstersTableDOS };
+
+static const byte kEoB2MonsterDirChangeTableDOS[48] = {
+ 0xFF, 0x06, 0x02, 0xFF, 0x04, 0x05, 0x03, 0xFF,
+ 0x00, 0x07, 0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+ 0xDF, 0xFF, 0xE0, 0xFF, 0xE1, 0xFF, 0xFF, 0xFF,
+ 0x01, 0x00, 0x1F, 0x00, 0x20, 0x00, 0x21, 0x00,
+ 0xC0, 0xFF, 0xA0, 0xFF, 0x02, 0x00, 0x03, 0x00,
+ 0x40, 0x00, 0x60, 0x00, 0xFE, 0xFF, 0xFD, 0xFF
+};
+
+static const ByteProvider kEoB2MonsterDirChangeTableDOSProvider = { ARRAYSIZE(kEoB2MonsterDirChangeTableDOS), kEoB2MonsterDirChangeTableDOS };
+
+static const uint16 kEoB2EncodeMonsterDefsDOS[168] = {
+ 0x0000, 0x0000, 0x0007, 0x0060, 0x0007, 0x0028, 0x000C, 0x0038,
+ 0x0013, 0x0028, 0x000C, 0x0038, 0x001F, 0x0000, 0x0007, 0x0060,
+ 0x0000, 0x0060, 0x0007, 0x0060, 0x0007, 0x0060, 0x0007, 0x0060,
+ 0x000E, 0x0060, 0x0005, 0x0038, 0x0007, 0x0000, 0x0007, 0x0028,
+ 0x000E, 0x0000, 0x0007, 0x0028, 0x0013, 0x0060, 0x0005, 0x0038,
+ 0x0018, 0x0060, 0x0005, 0x0038, 0x001D, 0x0060, 0x0005, 0x0038,
+ 0x000E, 0x0098, 0x0003, 0x0020, 0x0011, 0x00A0, 0x0004, 0x0018,
+ 0x0015, 0x00A0, 0x0004, 0x0018, 0x0019, 0x0098, 0x0003, 0x0020,
+ 0x001C, 0x0098, 0x0003, 0x0020, 0x001F, 0x0098, 0x0003, 0x0020,
+ 0x0000, 0x0000, 0x0007, 0x0060, 0x0007, 0x0000, 0x0007, 0x0060,
+ 0x000E, 0x0000, 0x0007, 0x0060, 0x0015, 0x0000, 0x0007, 0x0060,
+ 0x001C, 0x0000, 0x0007, 0x0060, 0x0000, 0x0060, 0x0007, 0x0060,
+ 0x0007, 0x0060, 0x0005, 0x0038, 0x000C, 0x0060, 0x0005, 0x0038,
+ 0x0011, 0x0060, 0x0005, 0x0038, 0x0016, 0x0060, 0x0005, 0x0038,
+ 0x001B, 0x0060, 0x0005, 0x0038, 0x0020, 0x0060, 0x0005, 0x0038,
+ 0x0007, 0x0098, 0x0003, 0x0020, 0x000A, 0x0098, 0x0003, 0x0020,
+ 0x000D, 0x0098, 0x0003, 0x0020, 0x0010, 0x0098, 0x0003, 0x0020,
+ 0x0013, 0x0098, 0x0003, 0x0020, 0x0016, 0x0098, 0x0003, 0x0020,
+ 0x0000, 0x0000, 0x000A, 0x0058, 0x000A, 0x0000, 0x000A, 0x0058,
+ 0x0014, 0x0000, 0x000A, 0x0058, 0x001E, 0x0000, 0x000A, 0x0058,
+ 0x0000, 0x0058, 0x000A, 0x0058, 0x000A, 0x0058, 0x000A, 0x0058
+};
+
+static const Uint16Provider kEoB2EncodeMonsterDefsDOSProvider = { ARRAYSIZE(kEoB2EncodeMonsterDefsDOS), kEoB2EncodeMonsterDefsDOS };
+
+static const EoBCharacter kEoB2NpcPresetsDOS[6] = {
+ { 0x00, 0x01, "Insal",
+ 15, 15, 0, 0, 13, 13, 11, 11, 17, 17, 16, 16, 9, 9,
+ 3, 39, 10, 0, 10, 5, 5, -1, 8, { 6, 0, 0 },
+ { 0x00006ADA, 0x00000000, 0x00000000 }, 0x00000000,
+ { 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000 } },
+ { 0x00, 0x01, "Calandra",
+ 18, 18, 36, 36, 13, 13, 8, 8, 15, 15, 16, 16, 14, 14,
+ 4, 76, 10, 0, 1, 0, 2, -2, 12, { 9, 0, 0 },
+ { 0x0003DF35, 0x00000000, 0x00000000 }, 0x00000000,
+ { 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000 } },
+ { 0x00, 0x01, "Shorn",
+ 15, 15, 0, 0, 14, 14, 13, 13, 14, 14, 13, 13, 16, 16,
+ 40, 40, 10, 0, 6, 4, 3, -3, 100, { 8, 0, 0 },
+ { 0x00021730, 0x00000000, 0x00000000 }, 0x00000000,
+ { 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000 } },
+ { 0x00, 0x01, "San-raal",
+ 11, 11, 0, 0, 18, 18, 13, 13, 14, 14, 16, 16, 9, 9,
+ 28, 28, 10, 0, 2, 3, 5, -4, 100, { 8, 0, 0 },
+ { 0x00017AF0, 0x00000000, 0x00000000 }, 0x096B4566,
+ { 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000 } },
+ { 0x00, 0x01, "Tanglor",
+ 16, 16, 0, 0, 13, 13, 16, 16, 15, 15, 11, 11, 12, 12,
+ 53, 53, 9, 0, 4, 6, 1, -5, 100, { 7, 7, 0 },
+ { 0x00010FC2, 0x00010FC2, 0x00000000 }, 0xFFFFFFFF,
+ { 0x0004, 0x0008, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0024, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000 } },
+ { 0x00, 0x01, "Amber",
+ 14, 14, 0, 0, 17, 17, 12, 12, 18, 18, 9, 9, 17, 17,
+ 36, 36, 10, 0, 3, 10, 1, -6, 100, { 7, 7, 0 },
+ { 0x0000FAE6, 0x0000FAE6, 0x00000000 }, 0x00294566,
+ { 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000 } }
+};
+
+static const EoBCharacterProvider kEoB2NpcPresetsDOSProvider = { ARRAYSIZE(kEoB2NpcPresetsDOS), kEoB2NpcPresetsDOS };
+
+static const byte kEoB2DreamStepsDOS[14] = {
+ 0x01, 0x02, 0x03, 0x02, 0x01, 0x00, 0x01, 0x02,
+ 0x03, 0x03, 0x02, 0x01, 0x00, 0xFF
+};
+
+static const ByteProvider kEoB2DreamStepsDOSProvider = { ARRAYSIZE(kEoB2DreamStepsDOS), kEoB2DreamStepsDOS };
+
+static const byte kEoB2HornSoundsDOS[4] = {
+ 0x40, 0x41, 0x42, 0x43
+};
+
+static const ByteProvider kEoB2HornSoundsDOSProvider = { ARRAYSIZE(kEoB2HornSoundsDOS), kEoB2HornSoundsDOS };
+
+static const uint16 kEoB2WallOfForceDsXDOS[18] = {
+ 0xFFCC, 0xFFF4, 0x001C, 0x0044, 0x006C, 0x0094, 0x00BC, 0xFFB8,
+ 0xFFF8, 0x0038, 0x0078, 0x00B8, 0xFFC8, 0x0028, 0x0088, 0x0000,
+ 0x0000, 0x0000
+};
+
+static const Uint16Provider kEoB2WallOfForceDsXDOSProvider = { ARRAYSIZE(kEoB2WallOfForceDsXDOS), kEoB2WallOfForceDsXDOS };
+
+static const byte kEoB2WallOfForceDsYDOS[3] = {
+ 0x20, 0x18, 0x10
+};
+
+static const ByteProvider kEoB2WallOfForceDsYDOSProvider = { ARRAYSIZE(kEoB2WallOfForceDsYDOS), kEoB2WallOfForceDsYDOS };
+
+static const byte kEoB2WallOfForceNumWDOS[3] = {
+ 0x01, 0x02, 0x03
+};
+
+static const ByteProvider kEoB2WallOfForceNumWDOSProvider = { ARRAYSIZE(kEoB2WallOfForceNumWDOS), kEoB2WallOfForceNumWDOS };
+
+static const byte kEoB2WallOfForceNumHDOS[3] = {
+ 0x02, 0x06, 0x09
+};
+
+static const ByteProvider kEoB2WallOfForceNumHDOSProvider = { ARRAYSIZE(kEoB2WallOfForceNumHDOS), kEoB2WallOfForceNumHDOS };
+
+static const byte kEoB2WallOfForceShpIdDOS[3] = {
+ 0x04, 0x02, 0x00
+};
+
+static const ByteProvider kEoB2WallOfForceShpIdDOSProvider = { ARRAYSIZE(kEoB2WallOfForceShpIdDOS), kEoB2WallOfForceShpIdDOS };
+
+static const byte kEoB2DscShapeIndexDOS[36] = {
+ 0x01, 0x01, 0x04, 0x0A, 0x04, 0x08, 0x04, 0x01,
+ 0x04, 0xF8, 0x04, 0xF6, 0x00, 0x00, 0x03, 0x09,
+ 0x03, 0x07, 0x03, 0x01, 0x03, 0xF9, 0x03, 0xF7,
+ 0x02, 0x06, 0x02, 0x01, 0x02, 0xFA, 0x01, 0x05,
+ 0x01, 0x01, 0x01, 0xFB
+};
+
+static const ByteProvider kEoB2DscShapeIndexDOSProvider = { ARRAYSIZE(kEoB2DscShapeIndexDOS), kEoB2DscShapeIndexDOS };
+
+static const uint16 kEoB2DscXDOS[18] = {
+ 0xFF70, 0xFFA0, 0xFFD0, 0x0000, 0x0030, 0x0060, 0x0090, 0xFF60,
+ 0xFFB0, 0x0000, 0x0050, 0x00A0, 0xFF80, 0x0000, 0x0080, 0x0000,
+ 0x0000, 0x0000
+};
+
+static const Uint16Provider kEoB2DscXDOSProvider = { ARRAYSIZE(kEoB2DscXDOS), kEoB2DscXDOS };
+
+static const byte kEoB2DscTileIndexDOS[18] = {
+ 0x00, 0x06, 0x01, 0x05, 0x02, 0x04, 0x03, 0x07,
+ 0x0B, 0x08, 0x0A, 0x09, 0x0C, 0x0E, 0x0D, 0x0F,
+ 0x11, 0x10
+};
+
+static const ByteProvider kEoB2DscTileIndexDOSProvider = { ARRAYSIZE(kEoB2DscTileIndexDOS), kEoB2DscTileIndexDOS };
+
+static const byte kEoB2DscUnk2DOS[23] = {
+ 0x00, 0x00, 0x00, 0x03, 0x03, 0x03, 0x03, 0x03,
+ 0x08, 0x08, 0x08, 0x08, 0x08, 0x0D, 0x0D, 0x0D,
+ 0x0D, 0x0D, 0x12, 0x12, 0x12, 0x12, 0x12
+};
+
+static const ByteProvider kEoB2DscUnk2DOSProvider = { ARRAYSIZE(kEoB2DscUnk2DOS), kEoB2DscUnk2DOS };
+
+static const byte kEoB2DscDimData1DOS[324] = {
+ 0xD7, 0xD7, 0xD7, 0xD7, 0xD7, 0xD7, 0xD7, 0xD7,
+ 0xD7, 0xD7, 0xD7, 0xD7, 0xD7, 0xD7, 0xD7, 0xD7,
+ 0xD8, 0xD7, 0xD8, 0xD8, 0x02, 0xD8, 0xD8, 0xD8,
+ 0xD8, 0xFE, 0xD7, 0xD8, 0xD8, 0xD8, 0xD7, 0x03,
+ 0xD8, 0xFD, 0xD8, 0xD8, 0xD8, 0xFE, 0xD8, 0x08,
+ 0xD8, 0xD8, 0xD8, 0xFE, 0xD7, 0x06, 0xD8, 0xD8,
+ 0xFA, 0x03, 0xD8, 0xFD, 0xD8, 0xD8, 0xD8, 0xD8,
+ 0xD8, 0xD8, 0xD8, 0xD8, 0xD8, 0xD8, 0xFA, 0xD7,
+ 0x10, 0xD8, 0xFD, 0xD7, 0x13, 0xD8, 0xD8, 0xD8,
+ 0xD8, 0xD8, 0xD8, 0xF2, 0xD8, 0x14, 0xD8, 0xD8,
+ 0xD8, 0xF0, 0xD7, 0x14, 0xD8, 0xED, 0x10, 0xD8,
+ 0xD8, 0x13, 0xD8, 0xD8, 0xD8, 0xD8, 0xEC, 0xD8,
+ 0xD8, 0xD8, 0xD8, 0xD8, 0xD7, 0x14, 0xD8, 0xED,
+ 0xD7, 0xD8, 0xD8, 0x13, 0xD7, 0xD7, 0xD7, 0xD7,
+ 0xD7, 0xD7, 0xD7, 0xD7, 0xD7, 0xD7, 0xD7, 0xD7,
+ 0xD7, 0xD7, 0xD7, 0xD7, 0xD8, 0xD7, 0xD7, 0xD7,
+ 0xD7, 0xD7, 0xD7, 0xD7, 0xD7, 0xD7, 0xD7, 0xD7,
+ 0xD7, 0xD7, 0xD7, 0xD7, 0xD7, 0xD7, 0xD8, 0xD7,
+ 0xD8, 0xD8, 0xD8, 0xD8, 0xD8, 0xD8, 0xD8, 0xD8,
+ 0xD8, 0x06, 0xD8, 0xD8, 0xFA, 0x03, 0xD8, 0xFD,
+ 0xD8, 0xD8, 0xD8, 0xD8, 0xD8, 0xD8, 0xD8, 0xD8,
+ 0xD8, 0xD8, 0xFA, 0xD8, 0x10, 0xD8, 0xFD, 0xD7,
+ 0x13, 0xFD, 0xD8, 0x13, 0xD8, 0xD8, 0xD8, 0xD8,
+ 0xD8, 0xD8, 0xD8, 0xD8, 0xD8, 0xF0, 0xD8, 0xD8,
+ 0xD8, 0xED, 0x10, 0xD8, 0xD8, 0x13, 0xD7, 0xD7,
+ 0xD7, 0xD7, 0xD7, 0xD7, 0xD7, 0xD7, 0xD7, 0xD7,
+ 0xD7, 0xD7, 0xD7, 0xD7, 0xD7, 0xD7, 0xD8, 0xD7,
+ 0xD8, 0xD8, 0xD8, 0xD8, 0xD8, 0xD8, 0xD8, 0xD8,
+ 0xD8, 0xD8, 0xD8, 0xD8, 0xD8, 0x03, 0xD8, 0xFD,
+ 0xD8, 0xD8, 0xD8, 0xD8, 0xD8, 0xD8, 0xD8, 0xD8,
+ 0xD8, 0xD8, 0xD8, 0xD8, 0xD8, 0xD8, 0xFD, 0xD8,
+ 0x13, 0xFD, 0xD8, 0x13, 0xD8, 0xD8, 0xD8, 0xD8,
+ 0xD8, 0xD8, 0xD8, 0xD8, 0xD8, 0xD8, 0xD8, 0xD8,
+ 0xD8, 0xED, 0xD8, 0xD8, 0xD8, 0x13, 0xD8, 0xD8,
+ 0xD8, 0xD8, 0xD8, 0xD8, 0xD8, 0xD8, 0xD8, 0xD8,
+ 0xD8, 0xD8, 0xD8, 0xD8, 0xD8, 0xD8, 0xD8, 0xD8,
+ 0xD8, 0xD8, 0xD8, 0xD8, 0xD8, 0xD8, 0xD8, 0xD8,
+ 0xD8, 0xD8, 0xD8, 0xD8, 0xD8, 0xD8, 0xD8, 0xD8,
+ 0xD8, 0xD8, 0xD8, 0xD8, 0xD8, 0xD8, 0xD8, 0xD8,
+ 0xD8, 0xD8, 0xD8, 0xD8, 0xD8, 0xD8, 0xD8, 0xD8,
+ 0xD8, 0xD8, 0xD8, 0xD8
+};
+
+static const ByteProvider kEoB2DscDimData1DOSProvider = { ARRAYSIZE(kEoB2DscDimData1DOS), kEoB2DscDimData1DOS };
+
+static const byte kEoB2DscDimData2DOS[648] = {
+ 0x16, 0x00, 0x16, 0x00, 0x16, 0x00, 0x16, 0x00,
+ 0x16, 0x00, 0x16, 0x00, 0x16, 0x00, 0x16, 0x00,
+ 0x16, 0x00, 0x16, 0x00, 0x16, 0x00, 0x16, 0x00,
+ 0x16, 0x00, 0x16, 0x00, 0x16, 0x00, 0x16, 0x00,
+ 0x00, 0x16, 0x16, 0x00, 0x00, 0x16, 0x00, 0x16,
+ 0x00, 0x02, 0x00, 0x16, 0x00, 0x16, 0x00, 0x16,
+ 0x00, 0x16, 0x02, 0x16, 0x00, 0x04, 0x00, 0x16,
+ 0x00, 0x16, 0x00, 0x16, 0x16, 0x00, 0x00, 0x03,
+ 0x00, 0x16, 0x03, 0x16, 0x00, 0x16, 0x00, 0x16,
+ 0x00, 0x16, 0x02, 0x16, 0x00, 0x16, 0x00, 0x08,
+ 0x00, 0x16, 0x00, 0x16, 0x00, 0x16, 0x00, 0x02,
+ 0x16, 0x00, 0x00, 0x06, 0x00, 0x16, 0x00, 0x16,
+ 0x06, 0x16, 0x00, 0x03, 0x00, 0x16, 0x03, 0x00,
+ 0x00, 0x16, 0x00, 0x16, 0x00, 0x16, 0x00, 0x16,
+ 0x00, 0x16, 0x00, 0x16, 0x00, 0x16, 0x00, 0x16,
+ 0x00, 0x16, 0x00, 0x16, 0x06, 0x16, 0x08, 0x0E,
+ 0x00, 0x10, 0x00, 0x16, 0x03, 0x16, 0x06, 0x10,
+ 0x00, 0x13, 0x00, 0x16, 0x00, 0x16, 0x00, 0x16,
+ 0x00, 0x16, 0x00, 0x16, 0x00, 0x16, 0x0E, 0x16,
+ 0x00, 0x16, 0x00, 0x14, 0x00, 0x16, 0x00, 0x16,
+ 0x00, 0x16, 0x10, 0x16, 0x16, 0x00, 0x00, 0x14,
+ 0x00, 0x16, 0x13, 0x16, 0x00, 0x10, 0x00, 0x16,
+ 0x00, 0x16, 0x00, 0x13, 0x00, 0x16, 0x00, 0x16,
+ 0x00, 0x16, 0x00, 0x16, 0x14, 0x16, 0x00, 0x16,
+ 0x00, 0x16, 0x00, 0x16, 0x00, 0x16, 0x00, 0x16,
+ 0x12, 0x16, 0x14, 0x16, 0x00, 0x16, 0x13, 0x16,
+ 0x16, 0x00, 0x00, 0x16, 0x00, 0x16, 0x00, 0x13,
+ 0x16, 0x00, 0x16, 0x00, 0x16, 0x00, 0x16, 0x00,
+ 0x16, 0x00, 0x16, 0x00, 0x16, 0x00, 0x16, 0x00,
+ 0x16, 0x00, 0x16, 0x00, 0x16, 0x00, 0x16, 0x00,
+ 0x16, 0x00, 0x16, 0x00, 0x16, 0x00, 0x16, 0x00,
+ 0x00, 0x16, 0x16, 0x00, 0x16, 0x00, 0x16, 0x00,
+ 0x16, 0x00, 0x16, 0x00, 0x16, 0x00, 0x16, 0x00,
+ 0x16, 0x00, 0x16, 0x00, 0x16, 0x00, 0x16, 0x00,
+ 0x16, 0x00, 0x16, 0x00, 0x16, 0x00, 0x16, 0x00,
+ 0x16, 0x00, 0x16, 0x00, 0x00, 0x16, 0x16, 0x00,
+ 0x00, 0x16, 0x00, 0x16, 0x00, 0x16, 0x00, 0x16,
+ 0x00, 0x16, 0x00, 0x16, 0x00, 0x16, 0x00, 0x16,
+ 0x00, 0x16, 0x00, 0x06, 0x00, 0x16, 0x00, 0x16,
+ 0x06, 0x16, 0x00, 0x03, 0x00, 0x16, 0x03, 0x16,
+ 0x00, 0x16, 0x00, 0x16, 0x00, 0x16, 0x00, 0x16,
+ 0x00, 0x16, 0x00, 0x16, 0x00, 0x16, 0x00, 0x16,
+ 0x00, 0x16, 0x00, 0x16, 0x06, 0x16, 0x00, 0x16,
+ 0x00, 0x10, 0x00, 0x16, 0x03, 0x16, 0x07, 0x0F,
+ 0x00, 0x13, 0x03, 0x16, 0x00, 0x16, 0x00, 0x13,
+ 0x00, 0x16, 0x00, 0x16, 0x00, 0x16, 0x00, 0x16,
+ 0x00, 0x16, 0x00, 0x16, 0x00, 0x16, 0x00, 0x16,
+ 0x00, 0x16, 0x10, 0x16, 0x00, 0x16, 0x00, 0x16,
+ 0x00, 0x16, 0x13, 0x16, 0x00, 0x10, 0x00, 0x16,
+ 0x00, 0x16, 0x00, 0x13, 0x16, 0x00, 0x16, 0x00,
+ 0x16, 0x00, 0x16, 0x00, 0x16, 0x00, 0x16, 0x00,
+ 0x16, 0x00, 0x16, 0x00, 0x16, 0x00, 0x16, 0x00,
+ 0x16, 0x00, 0x16, 0x00, 0x16, 0x00, 0x16, 0x00,
+ 0x16, 0x00, 0x16, 0x00, 0x00, 0x16, 0x16, 0x00,
+ 0x00, 0x16, 0x00, 0x16, 0x00, 0x16, 0x00, 0x16,
+ 0x00, 0x16, 0x00, 0x16, 0x00, 0x16, 0x00, 0x16,
+ 0x00, 0x16, 0x00, 0x16, 0x00, 0x16, 0x00, 0x16,
+ 0x00, 0x16, 0x00, 0x03, 0x00, 0x16, 0x03, 0x16,
+ 0x00, 0x16, 0x00, 0x16, 0x00, 0x16, 0x00, 0x16,
+ 0x00, 0x16, 0x00, 0x16, 0x00, 0x16, 0x00, 0x16,
+ 0x00, 0x16, 0x00, 0x16, 0x00, 0x16, 0x00, 0x16,
+ 0x00, 0x16, 0x00, 0x16, 0x03, 0x16, 0x00, 0x16,
+ 0x00, 0x13, 0x03, 0x16, 0x00, 0x16, 0x00, 0x13,
+ 0x00, 0x16, 0x00, 0x16, 0x00, 0x16, 0x00, 0x16,
+ 0x00, 0x16, 0x00, 0x16, 0x00, 0x16, 0x00, 0x16,
+ 0x00, 0x16, 0x00, 0x16, 0x00, 0x16, 0x00, 0x16,
+ 0x00, 0x16, 0x13, 0x16, 0x00, 0x16, 0x00, 0x16,
+ 0x00, 0x16, 0x00, 0x13, 0x00, 0x16, 0x00, 0x16,
+ 0x00, 0x16, 0x00, 0x16, 0x00, 0x16, 0x00, 0x16,
+ 0x00, 0x16, 0x00, 0x16, 0x00, 0x16, 0x00, 0x16,
+ 0x00, 0x16, 0x00, 0x16, 0x00, 0x16, 0x00, 0x16,
+ 0x00, 0x16, 0x00, 0x16, 0x00, 0x16, 0x00, 0x16,
+ 0x00, 0x16, 0x00, 0x16, 0x00, 0x16, 0x00, 0x16,
+ 0x00, 0x16, 0x00, 0x16, 0x00, 0x16, 0x00, 0x16,
+ 0x00, 0x16, 0x00, 0x16, 0x00, 0x16, 0x00, 0x16,
+ 0x00, 0x16, 0x00, 0x16, 0x00, 0x16, 0x00, 0x16,
+ 0x00, 0x16, 0x00, 0x16, 0x00, 0x16, 0x00, 0x16,
+ 0x00, 0x16, 0x00, 0x16, 0x00, 0x16, 0x00, 0x16,
+ 0x00, 0x16, 0x00, 0x16, 0x00, 0x16, 0x00, 0x16,
+ 0x00, 0x16, 0x00, 0x16, 0x00, 0x16, 0x00, 0x16,
+ 0x00, 0x16, 0x00, 0x16, 0x00, 0x16, 0x00, 0x16
+};
+
+static const ByteProvider kEoB2DscDimData2DOSProvider = { ARRAYSIZE(kEoB2DscDimData2DOS), kEoB2DscDimData2DOS };
+
+static const byte kEoB2DscBlockMapDOS[12] = {
+ 0x02, 0x03, 0x00, 0x01, 0x01, 0x02, 0x03, 0x00,
+ 0x03, 0x00, 0x01, 0x02
+};
+
+static const ByteProvider kEoB2DscBlockMapDOSProvider = { ARRAYSIZE(kEoB2DscBlockMapDOS), kEoB2DscBlockMapDOS };
+
+static const byte kEoB2DscDimMapDOS[18] = {
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01,
+ 0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x02, 0x03,
+ 0x03, 0x03
+};
+
+static const ByteProvider kEoB2DscDimMapDOSProvider = { ARRAYSIZE(kEoB2DscDimMapDOS), kEoB2DscDimMapDOS };
+
+static const byte kEoB2DscBlockIndexDOS[72] = {
+ 0x9D, 0x9E, 0x9F, 0xA0, 0xA1, 0xA2, 0xA3, 0xBE,
+ 0xBF, 0xC0, 0xC1, 0xC2, 0xDF, 0xE0, 0xE1, 0xFF,
+ 0x00, 0x01, 0xA3, 0xC3, 0xE3, 0x03, 0x23, 0x43,
+ 0x63, 0xC2, 0xE2, 0x02, 0x22, 0x42, 0xE1, 0x01,
+ 0x21, 0xE0, 0x00, 0x20, 0x63, 0x62, 0x61, 0x60,
+ 0x5F, 0x5E, 0x5D, 0x42, 0x41, 0x40, 0x3F, 0x3E,
+ 0x21, 0x20, 0x1F, 0x01, 0x00, 0xFF, 0x5D, 0x3D,
+ 0x1D, 0xFD, 0xDD, 0xBD, 0x9D, 0x3E, 0x1E, 0xFE,
+ 0xDE, 0xBE, 0x1F, 0xFF, 0xDF, 0x20, 0x00, 0xE0
+};
+
+static const ByteProvider kEoB2DscBlockIndexDOSProvider = { ARRAYSIZE(kEoB2DscBlockIndexDOS), kEoB2DscBlockIndexDOS };
+
diff --git a/devtools/create_kyradat/resources/eob2_dos_english.h b/devtools/create_kyradat/resources/eob2_dos_english.h
new file mode 100644
index 0000000000..1bcf794131
--- /dev/null
+++ b/devtools/create_kyradat/resources/eob2_dos_english.h
@@ -0,0 +1,1347 @@
+static const char *const kEoB2ChargenStrings1DOSEnglish[9] = {
+ "Your party is\rcomplete. Select\rthe PLAY button\ror press 'P' to\rstart the game.",
+ " ",
+ "AC\rHP\rLVL",
+ "%s\r%d\r%d\r%d\r%d\r%d",
+ "%d\r%d",
+ "%d",
+ "%d/%d",
+ "%d/%d/%d",
+ "Select the box of\rthe character you\rwish to create or\rview."
+};
+
+static const StringListProvider kEoB2ChargenStrings1DOSEnglishProvider = { ARRAYSIZE(kEoB2ChargenStrings1DOSEnglish), kEoB2ChargenStrings1DOSEnglish };
+
+static const char *const kEoB2ChargenStrings2DOSEnglish[12] = {
+ "%s",
+ "%d",
+ "%s",
+ "%d",
+ "%d",
+ "%d",
+ "%s",
+ "%d",
+ "SELECT RACE:",
+ "SELECT CLASS:",
+ "SELECT ALIGNMENT:",
+ "Name:"
+};
+
+static const StringListProvider kEoB2ChargenStrings2DOSEnglishProvider = { ARRAYSIZE(kEoB2ChargenStrings2DOSEnglish), kEoB2ChargenStrings2DOSEnglish };
+
+static const char *const kEoB2ChargenStatStringsDOSEnglish[12] = {
+ "STR",
+ "INT",
+ "WIS",
+ "DEX",
+ "CON",
+ "CHA",
+ "STRENGTH",
+ "INTELLIGENCE",
+ "WISDOM",
+ "DEXTERITY",
+ "CONSTITUTION",
+ "CHARISMA"
+};
+
+static const StringListProvider kEoB2ChargenStatStringsDOSEnglishProvider = { ARRAYSIZE(kEoB2ChargenStatStringsDOSEnglish), kEoB2ChargenStatStringsDOSEnglish };
+
+static const char *const kEoB2ChargenRaceSexStringsDOSEnglish[12] = {
+ "HUMAN MALE",
+ "HUMAN FEMALE",
+ "ELF MALE",
+ "ELF FEMALE",
+ "HALF-ELF MALE",
+ "HALF-ELF FEMALE",
+ "DWARF MALE",
+ "DWARF FEMALE",
+ "GNOME MALE",
+ "GNOME FEMALE",
+ "HALFLING MALE",
+ "HALFLING FEMALE"
+};
+
+static const StringListProvider kEoB2ChargenRaceSexStringsDOSEnglishProvider = { ARRAYSIZE(kEoB2ChargenRaceSexStringsDOSEnglish), kEoB2ChargenRaceSexStringsDOSEnglish };
+
+static const char *const kEoB2ChargenClassStringsDOSEnglish[21] = {
+ "FIGHTER",
+ "RANGER",
+ "PALADIN",
+ "MAGE",
+ "CLERIC",
+ "THIEF",
+ "FIGHTER/CLERIC",
+ "FIGHTER/THIEF",
+ "FIGHTER/MAGE",
+ "FIGHTER/MAGE/THIEF",
+ "THIEF/MAGE",
+ "CLERIC/THIEF",
+ "FIGHTER/CLERIC/MAGE",
+ "RANGER/CLERIC",
+ "CLERIC/MAGE",
+ "FIGHTER",
+ "MAGE",
+ "CLERIC",
+ "THIEF",
+ "PALADIN",
+ "RANGER"
+};
+
+static const StringListProvider kEoB2ChargenClassStringsDOSEnglishProvider = { ARRAYSIZE(kEoB2ChargenClassStringsDOSEnglish), kEoB2ChargenClassStringsDOSEnglish };
+
+static const char *const kEoB2ChargenAlignmentStringsDOSEnglish[9] = {
+ "LAWFUL GOOD",
+ "NEUTRAL GOOD",
+ "CHAOTIC GOOD",
+ "LAWFUL NEUTRAL",
+ "TRUE NEUTRAL",
+ "CHAOTIC NEUTRAL",
+ "LAWFUL EVIL",
+ "NEUTRAL EVIL",
+ "CHAOTIC EVIL"
+};
+
+static const StringListProvider kEoB2ChargenAlignmentStringsDOSEnglishProvider = { ARRAYSIZE(kEoB2ChargenAlignmentStringsDOSEnglish), kEoB2ChargenAlignmentStringsDOSEnglish };
+
+static const char *const kEoB2ChargenEnterGameStringsDOSEnglish[1] = {
+ " Entering game.\r Please wait."
+};
+
+static const StringListProvider kEoB2ChargenEnterGameStringsDOSEnglishProvider = { ARRAYSIZE(kEoB2ChargenEnterGameStringsDOSEnglish), kEoB2ChargenEnterGameStringsDOSEnglish };
+
+static const char *const kEoB2PryDoorStringsDOSEnglish[8] = {
+ "\r",
+ "You are not capable of forcing the door.\r",
+ "\x06\x04""You force the door.\r",
+ "\x06\x06""You try to force the door but fail.\r",
+ "You can't put that item there.\r",
+ "The item is too large to fit.\r",
+ "No one is able to pry this door open.\r",
+ "\r"
+};
+
+static const StringListProvider kEoB2PryDoorStringsDOSEnglishProvider = { ARRAYSIZE(kEoB2PryDoorStringsDOSEnglish), kEoB2PryDoorStringsDOSEnglish };
+
+static const char *const kEoB2WarningStringsDOSEnglish[4] = {
+ "You can't go that way.\r",
+ "%s isn't capable of eating food!\r",
+ "That food is rotten! You don't want to eat that!\r",
+ "You may only eat food!\r"
+};
+
+static const StringListProvider kEoB2WarningStringsDOSEnglishProvider = { ARRAYSIZE(kEoB2WarningStringsDOSEnglish), kEoB2WarningStringsDOSEnglish };
+
+static const char *const kEoB2ItemSuffixStringsRingsDOSEnglish[4] = {
+ "Adornment",
+ "Wizardry",
+ "Sustenance",
+ "Feather Fall"
+};
+
+static const StringListProvider kEoB2ItemSuffixStringsRingsDOSEnglishProvider = { ARRAYSIZE(kEoB2ItemSuffixStringsRingsDOSEnglish), kEoB2ItemSuffixStringsRingsDOSEnglish };
+
+static const char *const kEoB2ItemSuffixStringsPotionsDOSEnglish[8] = {
+ "Giant Strength",
+ "Healing",
+ "Extra Healing",
+ "Poison",
+ "Vitality",
+ "Speed",
+ "Invisibility",
+ "Cure Poison"
+};
+
+static const StringListProvider kEoB2ItemSuffixStringsPotionsDOSEnglishProvider = { ARRAYSIZE(kEoB2ItemSuffixStringsPotionsDOSEnglish), kEoB2ItemSuffixStringsPotionsDOSEnglish };
+
+static const char *const kEoB2ItemSuffixStringsWandsDOSEnglish[8] = {
+ "Stick",
+ "Lightning",
+ "Frost",
+ "Curing",
+ "Fireball",
+ "Starfire",
+ "Magic Missile",
+ "Dispel Magic"
+};
+
+static const StringListProvider kEoB2ItemSuffixStringsWandsDOSEnglishProvider = { ARRAYSIZE(kEoB2ItemSuffixStringsWandsDOSEnglish), kEoB2ItemSuffixStringsWandsDOSEnglish };
+
+static const char *const kEoB2RipItemStringsDOSEnglish[3] = {
+ "%s has lost her ",
+ "%s has lost his ",
+ ".\r"
+};
+
+static const StringListProvider kEoB2RipItemStringsDOSEnglishProvider = { ARRAYSIZE(kEoB2RipItemStringsDOSEnglish), kEoB2RipItemStringsDOSEnglish };
+
+static const char *const kEoB2CursedStringDOSEnglish[1] = {
+ "%d Cursed %s"
+};
+
+static const StringListProvider kEoB2CursedStringDOSEnglishProvider = { ARRAYSIZE(kEoB2CursedStringDOSEnglish), kEoB2CursedStringDOSEnglish };
+
+static const char *const kEoB2MagicObjectStringsDOSEnglish[5] = {
+ "Mage Scroll",
+ "Cleric Scroll",
+ "Ring",
+ "Potion",
+ "Wand"
+};
+
+static const StringListProvider kEoB2MagicObjectStringsDOSEnglishProvider = { ARRAYSIZE(kEoB2MagicObjectStringsDOSEnglish), kEoB2MagicObjectStringsDOSEnglish };
+
+static const char *const kEoB2MagicObjectString5DOSEnglish[1] = {
+ "Stick"
+};
+
+static const StringListProvider kEoB2MagicObjectString5DOSEnglishProvider = { ARRAYSIZE(kEoB2MagicObjectString5DOSEnglish), kEoB2MagicObjectString5DOSEnglish };
+
+static const char *const kEoB2PatternSuffixDOSEnglish[1] = {
+ "%s of %s"
+};
+
+static const StringListProvider kEoB2PatternSuffixDOSEnglishProvider = { ARRAYSIZE(kEoB2PatternSuffixDOSEnglish), kEoB2PatternSuffixDOSEnglish };
+
+static const char *const kEoB2PatternGrFix1DOSEnglish[1] = {
+ "%s of %s"
+};
+
+static const StringListProvider kEoB2PatternGrFix1DOSEnglishProvider = { ARRAYSIZE(kEoB2PatternGrFix1DOSEnglish), kEoB2PatternGrFix1DOSEnglish };
+
+static const char *const kEoB2PatternGrFix2DOSEnglish[1] = {
+ "%s of %s"
+};
+
+static const StringListProvider kEoB2PatternGrFix2DOSEnglishProvider = { ARRAYSIZE(kEoB2PatternGrFix2DOSEnglish), kEoB2PatternGrFix2DOSEnglish };
+
+static const char *const kEoB2ValidateArmorStringDOSEnglish[1] = {
+ "%s can't wear that type of armor.\r"
+};
+
+static const StringListProvider kEoB2ValidateArmorStringDOSEnglishProvider = { ARRAYSIZE(kEoB2ValidateArmorStringDOSEnglish), kEoB2ValidateArmorStringDOSEnglish };
+
+static const char *const kEoB2ValidateCursedStringDOSEnglish[1] = {
+ "%s cannot release the weapon! It is cursed!\r"
+};
+
+static const StringListProvider kEoB2ValidateCursedStringDOSEnglishProvider = { ARRAYSIZE(kEoB2ValidateCursedStringDOSEnglish), kEoB2ValidateCursedStringDOSEnglish };
+
+static const char *const kEoB2ValidateNoDropStringDOSEnglish[1] = {
+ "You can't put that item there.\r"
+};
+
+static const StringListProvider kEoB2ValidateNoDropStringDOSEnglishProvider = { ARRAYSIZE(kEoB2ValidateNoDropStringDOSEnglish), kEoB2ValidateNoDropStringDOSEnglish };
+
+static const char *const kEoB2PotionStringsDOSEnglish[2] = {
+ "poisoned",
+ "%s feels %s!\r"
+};
+
+static const StringListProvider kEoB2PotionStringsDOSEnglishProvider = { ARRAYSIZE(kEoB2PotionStringsDOSEnglish), kEoB2PotionStringsDOSEnglish };
+
+static const char *const kEoB2WandStringsDOSEnglish[1] = {
+ "The wand has no apparent magical effect\r"
+};
+
+static const StringListProvider kEoB2WandStringsDOSEnglishProvider = { ARRAYSIZE(kEoB2WandStringsDOSEnglish), kEoB2WandStringsDOSEnglish };
+
+static const char *const kEoB2ItemMisuseStringsDOSEnglish[3] = {
+ " can not use this item.\r",
+ "This item automatically used when worn.\r",
+ "This item is not used in this way.\r"
+};
+
+static const StringListProvider kEoB2ItemMisuseStringsDOSEnglishProvider = { ARRAYSIZE(kEoB2ItemMisuseStringsDOSEnglish), kEoB2ItemMisuseStringsDOSEnglish };
+
+static const char *const kEoB2TakenStringsDOSEnglish[1] = {
+ " taken.\r"
+};
+
+static const StringListProvider kEoB2TakenStringsDOSEnglishProvider = { ARRAYSIZE(kEoB2TakenStringsDOSEnglish), kEoB2TakenStringsDOSEnglish };
+
+static const char *const kEoB2PotionEffectStringsDOSEnglish[8] = {
+ "much stronger",
+ "better",
+ "much better",
+ "ill for a moment",
+ "satiated",
+ "fast and agile",
+ "transparent",
+ "better"
+};
+
+static const StringListProvider kEoB2PotionEffectStringsDOSEnglishProvider = { ARRAYSIZE(kEoB2PotionEffectStringsDOSEnglish), kEoB2PotionEffectStringsDOSEnglish };
+
+static const char *const kEoB2YesNoStringsDOSEnglish[2] = {
+ "yes",
+ "no"
+};
+
+static const StringListProvider kEoB2YesNoStringsDOSEnglishProvider = { ARRAYSIZE(kEoB2YesNoStringsDOSEnglish), kEoB2YesNoStringsDOSEnglish };
+
+static const char *const kEoB2MoreStringsDOSEnglish[1] = {
+ "MORE"
+};
+
+static const StringListProvider kEoB2MoreStringsDOSEnglishProvider = { ARRAYSIZE(kEoB2MoreStringsDOSEnglish), kEoB2MoreStringsDOSEnglish };
+
+static const char *const kEoB2NpcMaxStringsDOSEnglish[1] = {
+ "You may only have six characters in your party. Select the one you wish to drop."
+};
+
+static const StringListProvider kEoB2NpcMaxStringsDOSEnglishProvider = { ARRAYSIZE(kEoB2NpcMaxStringsDOSEnglish), kEoB2NpcMaxStringsDOSEnglish };
+
+static const char *const kEoB2OkStringsDOSEnglish[1] = {
+ "OK"
+};
+
+static const StringListProvider kEoB2OkStringsDOSEnglishProvider = { ARRAYSIZE(kEoB2OkStringsDOSEnglish), kEoB2OkStringsDOSEnglish };
+
+static const char *const kEoB2NpcJoinStringsDOSEnglish[1] = {
+ "%s joins the party.\r"
+};
+
+static const StringListProvider kEoB2NpcJoinStringsDOSEnglishProvider = { ARRAYSIZE(kEoB2NpcJoinStringsDOSEnglish), kEoB2NpcJoinStringsDOSEnglish };
+
+static const char *const kEoB2CancelStringsDOSEnglish[1] = {
+ "CANCEL"
+};
+
+static const StringListProvider kEoB2CancelStringsDOSEnglishProvider = { ARRAYSIZE(kEoB2CancelStringsDOSEnglish), kEoB2CancelStringsDOSEnglish };
+
+static const char *const kEoB2AbortStringsDOSEnglish[1] = {
+ "ABORT"
+};
+
+static const StringListProvider kEoB2AbortStringsDOSEnglishProvider = { ARRAYSIZE(kEoB2AbortStringsDOSEnglish), kEoB2AbortStringsDOSEnglish };
+
+static const char *const kEoB2MenuStringsMainDOSEnglish[8] = {
+ "Select Option:",
+ "Rest Party",
+ "Memorize Spells",
+ "Pray for Spells",
+ "Scribe Scrolls",
+ "Preferences",
+ "Game Options",
+ "Exit"
+};
+
+static const StringListProvider kEoB2MenuStringsMainDOSEnglishProvider = { ARRAYSIZE(kEoB2MenuStringsMainDOSEnglish), kEoB2MenuStringsMainDOSEnglish };
+
+static const char *const kEoB2MenuStringsSaveLoadDOSEnglish[8] = {
+ "Load Game",
+ "Save Game",
+ "Drop Character",
+ "Quit Game",
+ "Game Options:",
+ "\r Game saved.",
+ "Attempts to save your\rgame have failed!",
+ "Cannot load your\rsave game. The\rfile may be corrupt!"
+};
+
+static const StringListProvider kEoB2MenuStringsSaveLoadDOSEnglishProvider = { ARRAYSIZE(kEoB2MenuStringsSaveLoadDOSEnglish), kEoB2MenuStringsSaveLoadDOSEnglish };
+
+static const char *const kEoB2MenuStringsOnOffDOSEnglish[2] = {
+ "ON",
+ "OFF"
+};
+
+static const StringListProvider kEoB2MenuStringsOnOffDOSEnglishProvider = { ARRAYSIZE(kEoB2MenuStringsOnOffDOSEnglish), kEoB2MenuStringsOnOffDOSEnglish };
+
+static const char *const kEoB2MenuStringsSpellsDOSEnglish[17] = {
+ "\r\r Select a character\r from your party who\r would like to learn\r spells.",
+ "\r Your Paladin is \r too low a level\r for spells.",
+ "\r\r The Mage has no\r Spell Book!",
+ "\r\r\r Select a character\r from your party\r who would like to\r pray for spells.",
+ "\r No party members\r are capable of\r praying for new\r spells.",
+ "\r No party members\r are capable of\r memorizing new\r spells.",
+ " An unconscious\r or dead Mage\r cannot memorize\r spells.",
+ " An unconscious\r or dead Cleric\r cannot pray for\r spells.",
+ "1",
+ "2",
+ "3",
+ "4",
+ "5",
+ "Clear",
+ "Spells Available:",
+ "Yes",
+ "No"
+};
+
+static const StringListProvider kEoB2MenuStringsSpellsDOSEnglishProvider = { ARRAYSIZE(kEoB2MenuStringsSpellsDOSEnglish), kEoB2MenuStringsSpellsDOSEnglish };
+
+static const char *const kEoB2MenuStringsRestDOSEnglish[5] = {
+ "\rWill your healers\rheal the party?",
+ " Someone is still\r injured. Rest\r until healed?",
+ "Resting party.",
+ "\r All characters\r are fully\r rested.",
+ " Your party needs\r to rest to gain\r spells."
+};
+
+static const StringListProvider kEoB2MenuStringsRestDOSEnglishProvider = { ARRAYSIZE(kEoB2MenuStringsRestDOSEnglish), kEoB2MenuStringsRestDOSEnglish };
+
+static const char *const kEoB2MenuStringsDropDOSEnglish[1] = {
+ " You cannot have\r less than four\r characters."
+};
+
+static const StringListProvider kEoB2MenuStringsDropDOSEnglishProvider = { ARRAYSIZE(kEoB2MenuStringsDropDOSEnglish), kEoB2MenuStringsDropDOSEnglish };
+
+static const char *const kEoB2MenuStringsExitDOSEnglish[1] = {
+ " Are you sure you\r wish to exit the\r game?"
+};
+
+static const StringListProvider kEoB2MenuStringsExitDOSEnglishProvider = { ARRAYSIZE(kEoB2MenuStringsExitDOSEnglish), kEoB2MenuStringsExitDOSEnglish };
+
+static const char *const kEoB2MenuStringsStarveDOSEnglish[1] = {
+ " Your party is\r starving. Do you\r wish to continue\r resting?"
+};
+
+static const StringListProvider kEoB2MenuStringsStarveDOSEnglishProvider = { ARRAYSIZE(kEoB2MenuStringsStarveDOSEnglish), kEoB2MenuStringsStarveDOSEnglish };
+
+static const char *const kEoB2MenuStringsScribeDOSEnglish[5] = {
+ "Select the scroll(s)\ryou wish to scribe.",
+ "\r\r\r Select a Mage\r from your party\r who would like to\r scribe spells.",
+ " You don't have\r any scolls to be\r scribed.",
+ " You don't have\r any scrolls that\r this Mage needs.",
+ "\r You don't have\r any Mage able to\r scribe scrolls."
+};
+
+static const StringListProvider kEoB2MenuStringsScribeDOSEnglishProvider = { ARRAYSIZE(kEoB2MenuStringsScribeDOSEnglish), kEoB2MenuStringsScribeDOSEnglish };
+
+static const char *const kEoB2MenuStringsDrop2DOSEnglish[3] = {
+ " Select the\r character you\r wish to drop.",
+ " You must specify\r a name for your\r save game!",
+ " Are you sure you\r wish to replace\r your saved game?"
+};
+
+static const StringListProvider kEoB2MenuStringsDrop2DOSEnglishProvider = { ARRAYSIZE(kEoB2MenuStringsDrop2DOSEnglish), kEoB2MenuStringsDrop2DOSEnglish };
+
+static const char *const kEoB2MenuStringsHeadDOSEnglish[3] = {
+ "Camp:",
+ "Preferences:",
+ "Game Options:"
+};
+
+static const StringListProvider kEoB2MenuStringsHeadDOSEnglishProvider = { ARRAYSIZE(kEoB2MenuStringsHeadDOSEnglish), kEoB2MenuStringsHeadDOSEnglish };
+
+static const char *const kEoB2MenuStringsPoisonDOSEnglish[1] = {
+ "Poisoned party\rmembers may die!\rRest anyway?"
+};
+
+static const StringListProvider kEoB2MenuStringsPoisonDOSEnglishProvider = { ARRAYSIZE(kEoB2MenuStringsPoisonDOSEnglish), kEoB2MenuStringsPoisonDOSEnglish };
+
+static const char *const kEoB2MenuStringsMgcDOSEnglish[2] = {
+ "%-18s %1d",
+ "%d of %d Remaining. "
+};
+
+static const StringListProvider kEoB2MenuStringsMgcDOSEnglishProvider = { ARRAYSIZE(kEoB2MenuStringsMgcDOSEnglish), kEoB2MenuStringsMgcDOSEnglish };
+
+static const char *const kEoB2MenuStringsPrefsDOSEnglish[4] = {
+ "Tunes are %-3s",
+ "Sounds are %-3s",
+ "Bar Graphs are %-3s",
+ "Mouse is %-3s"
+};
+
+static const StringListProvider kEoB2MenuStringsPrefsDOSEnglishProvider = { ARRAYSIZE(kEoB2MenuStringsPrefsDOSEnglish), kEoB2MenuStringsPrefsDOSEnglish };
+
+static const char *const kEoB2MenuStringsRest2DOSEnglish[5] = {
+ "%s gained %s.\r",
+ "%s memorized %s.\r",
+ "%s casts healing on %s.\r",
+ "Hours rested: %-4d",
+ "\r%s\r"
+};
+
+static const StringListProvider kEoB2MenuStringsRest2DOSEnglishProvider = { ARRAYSIZE(kEoB2MenuStringsRest2DOSEnglish), kEoB2MenuStringsRest2DOSEnglish };
+
+static const char *const kEoB2MenuStringsRest3DOSEnglish[1] = {
+ "\x06\x06""You do not feel it is safe to rest here."
+};
+
+static const StringListProvider kEoB2MenuStringsRest3DOSEnglishProvider = { ARRAYSIZE(kEoB2MenuStringsRest3DOSEnglish), kEoB2MenuStringsRest3DOSEnglish };
+
+static const char *const kEoB2MenuStringsRest4DOSEnglish[1] = {
+ "\x06\x06""You can't rest here, monsters are near."
+};
+
+static const StringListProvider kEoB2MenuStringsRest4DOSEnglishProvider = { ARRAYSIZE(kEoB2MenuStringsRest4DOSEnglish), kEoB2MenuStringsRest4DOSEnglish };
+
+static const char *const kEoB2MenuStringsDefeatDOSEnglish[1] = {
+ "\rYour entire party\rhas been defeated!\rWould you like to\rload a previously\rsaved game?"
+};
+
+static const StringListProvider kEoB2MenuStringsDefeatDOSEnglishProvider = { ARRAYSIZE(kEoB2MenuStringsDefeatDOSEnglish), kEoB2MenuStringsDefeatDOSEnglish };
+
+static const char *const kEoB2MenuStringsTransferDOSEnglish[5] = {
+ "You must transfer\rfour party members\rbefore you may play!",
+ "You may only transfer\rfour party members to\rEOB II!",
+ "Items which are not\ruseful or unbalance\rthe game will be\rdeleted.",
+ " \r You do not have\r a mage in your\r party.",
+ " \r You do not have\r a cleric or\r paladin in your\r party."
+};
+
+static const StringListProvider kEoB2MenuStringsTransferDOSEnglishProvider = { ARRAYSIZE(kEoB2MenuStringsTransferDOSEnglish), kEoB2MenuStringsTransferDOSEnglish };
+
+static const char *const kEoB2MenuStringsSpecDOSEnglish[2] = {
+ "As you awaken, you\rdiscover that Insal\rthe thief is gone!",
+ "A quick inventory\rreveals equipment\rhas been stolen!"
+};
+
+static const StringListProvider kEoB2MenuStringsSpecDOSEnglishProvider = { ARRAYSIZE(kEoB2MenuStringsSpecDOSEnglish), kEoB2MenuStringsSpecDOSEnglish };
+
+static const char *const kEoB2MenuYesNoStringsDOSEnglish[2] = {
+ "Yes",
+ "No"
+};
+
+static const StringListProvider kEoB2MenuYesNoStringsDOSEnglishProvider = { ARRAYSIZE(kEoB2MenuYesNoStringsDOSEnglish), kEoB2MenuYesNoStringsDOSEnglish };
+
+static const char *const kEoB2CharGuiStringsHpDOSEnglish[2] = {
+ "HP",
+ "%3d of %-3d"
+};
+
+static const StringListProvider kEoB2CharGuiStringsHpDOSEnglishProvider = { ARRAYSIZE(kEoB2CharGuiStringsHpDOSEnglish), kEoB2CharGuiStringsHpDOSEnglish };
+
+static const char *const kEoB2CharGuiStringsWp2DOSEnglish[3] = {
+ "MISS",
+ "HACK",
+ "BASH"
+};
+
+static const StringListProvider kEoB2CharGuiStringsWp2DOSEnglishProvider = { ARRAYSIZE(kEoB2CharGuiStringsWp2DOSEnglish), kEoB2CharGuiStringsWp2DOSEnglish };
+
+static const char *const kEoB2CharGuiStringsWrDOSEnglish[4] = {
+ "CAN'T",
+ "REACH",
+ "NO",
+ "AMMO"
+};
+
+static const StringListProvider kEoB2CharGuiStringsWrDOSEnglishProvider = { ARRAYSIZE(kEoB2CharGuiStringsWrDOSEnglish), kEoB2CharGuiStringsWrDOSEnglish };
+
+static const char *const kEoB2CharGuiStringsSt2DOSEnglish[7] = {
+ "Swapping",
+ "DEAD",
+ "UNCONSCIOUS",
+ "POISON (SLOW)",
+ "POISONED",
+ "PARALYZED",
+ "PETRIFIED"
+};
+
+static const StringListProvider kEoB2CharGuiStringsSt2DOSEnglishProvider = { ARRAYSIZE(kEoB2CharGuiStringsSt2DOSEnglish), kEoB2CharGuiStringsSt2DOSEnglish };
+
+static const char *const kEoB2CharGuiStringsInDOSEnglish[4] = {
+ "CHARACTER INFO",
+ "ARMOR CLASS",
+ "EXP",
+ "LVL"
+};
+
+static const StringListProvider kEoB2CharGuiStringsInDOSEnglishProvider = { ARRAYSIZE(kEoB2CharGuiStringsInDOSEnglish), kEoB2CharGuiStringsInDOSEnglish };
+
+static const char *const kEoB2CharStatusStrings7DOSEnglish[1] = {
+ "%s no longer has giant strength.\r"
+};
+
+static const StringListProvider kEoB2CharStatusStrings7DOSEnglishProvider = { ARRAYSIZE(kEoB2CharStatusStrings7DOSEnglish), kEoB2CharStatusStrings7DOSEnglish };
+
+static const char *const kEoB2CharStatusStrings82DOSEnglish[1] = {
+ "\x06\x06""%s feels the effects of poison!\r"
+};
+
+static const StringListProvider kEoB2CharStatusStrings82DOSEnglishProvider = { ARRAYSIZE(kEoB2CharStatusStrings82DOSEnglish), kEoB2CharStatusStrings82DOSEnglish };
+
+static const char *const kEoB2CharStatusStrings9DOSEnglish[1] = {
+ "%s is no longer paralyzed!\r"
+};
+
+static const StringListProvider kEoB2CharStatusStrings9DOSEnglishProvider = { ARRAYSIZE(kEoB2CharStatusStrings9DOSEnglish), kEoB2CharStatusStrings9DOSEnglish };
+
+static const char *const kEoB2CharStatusStrings12DOSEnglish[1] = {
+ "%s slows down.\r"
+};
+
+static const StringListProvider kEoB2CharStatusStrings12DOSEnglishProvider = { ARRAYSIZE(kEoB2CharStatusStrings12DOSEnglish), kEoB2CharStatusStrings12DOSEnglish };
+
+static const char *const kEoB2CharStatusStrings132DOSEnglish[1] = {
+ "\x06\x06""%s is %s!\r"
+};
+
+static const StringListProvider kEoB2CharStatusStrings132DOSEnglishProvider = { ARRAYSIZE(kEoB2CharStatusStrings132DOSEnglish), kEoB2CharStatusStrings132DOSEnglish };
+
+static const char *const kEoB2LevelGainStringsDOSEnglish[1] = {
+ "\x06\x01""%s has gained a level.""\x06\x0F""\r"
+};
+
+static const StringListProvider kEoB2LevelGainStringsDOSEnglishProvider = { ARRAYSIZE(kEoB2LevelGainStringsDOSEnglish), kEoB2LevelGainStringsDOSEnglish };
+
+static const char *const kEoB2BookNumbersDOSEnglish[5] = {
+ "First",
+ "Second",
+ "Third",
+ "Fourth",
+ "Fifth"
+};
+
+static const StringListProvider kEoB2BookNumbersDOSEnglishProvider = { ARRAYSIZE(kEoB2BookNumbersDOSEnglish), kEoB2BookNumbersDOSEnglish };
+
+static const char *const kEoB2MageSpellsListDOSEnglish[33] = {
+ "",
+ "Armor",
+ "Burning Hands",
+ "Detect Magic",
+ "Magic Missile",
+ "Shield",
+ "Shocking Grasp",
+ "Blur",
+ "Detect Invisible",
+ "Imp Identify",
+ "Invisibility",
+ "M's Acid Arrow",
+ "Dispel Magic",
+ "Fireball",
+ "Haste",
+ "Hold Person",
+ "Invisibility 10'",
+ "Lightning Bolt",
+ "Vampiric Touch",
+ "Fear",
+ "Ice Storm",
+ "Imp Invisibility",
+ "Remove Curse",
+ "Cone of Cold",
+ "Hold Monster",
+ "Wall of Force",
+ "Disintegrate",
+ "Flesh to Stone",
+ "Stone to Flesh",
+ "True Seeing",
+ "Finger of Death",
+ "Power Word Stun",
+ "Bigby's Fist"
+};
+
+static const StringListProvider kEoB2MageSpellsListDOSEnglishProvider = { ARRAYSIZE(kEoB2MageSpellsListDOSEnglish), kEoB2MageSpellsListDOSEnglish };
+
+static const char *const kEoB2ClericSpellsListDOSEnglish[30] = {
+ "",
+ "Bless",
+ "Cause Light Wnds",
+ "Cure Light Wnds",
+ "Detect Magic",
+ "Protect-Evil",
+ "Aid",
+ "Flame Blade",
+ "Hold Person",
+ "Slow Poison",
+ "Create Food",
+ "Dispel Magic",
+ "Magical Vestment",
+ "Prayer",
+ "Remove Paralysis",
+ "Cause Serious",
+ "Cure Serious",
+ "Neutral-Poison",
+ "Protect-Evil 10'",
+ "Cause Critical",
+ "Cure Critical",
+ "Flame Strike",
+ "Raise Dead",
+ "Slay Living",
+ "True Seeing",
+ "Harm",
+ "Heal",
+ "Ressurection",
+ "Lay on Hands",
+ "Turn undead"
+};
+
+static const StringListProvider kEoB2ClericSpellsListDOSEnglishProvider = { ARRAYSIZE(kEoB2ClericSpellsListDOSEnglish), kEoB2ClericSpellsListDOSEnglish };
+
+static const char *const kEoB2SpellNamesDOSEnglish[68] = {
+ "armor",
+ "burning hands",
+ "detect magic",
+ "magic missile",
+ "shield",
+ "shocking grasp",
+ "blur",
+ "detect invisibility",
+ "improved identify",
+ "invisibility",
+ "melf's acid arrow",
+ "dispel magic",
+ "fireball",
+ "haste",
+ "Hold Person",
+ "invisibility 10' radius",
+ "lightning bolt",
+ "vampiric touch",
+ "fear",
+ "ice storm",
+ "improved invisibility",
+ "remove curse",
+ "cone of cold",
+ "hold monster",
+ "wall of force",
+ "disintegrate",
+ "flesh to stone",
+ "stone to flesh",
+ "true seeing",
+ "finger of death",
+ "power word stun",
+ "bigby's clenched fist",
+ "bless",
+ "cause light wounds",
+ "cure light wounds",
+ "detect magic",
+ "protection from evil",
+ "aid",
+ "flame blade",
+ "hold person",
+ "slow poison",
+ "create food",
+ "dispel magic",
+ "magical vestment",
+ "prayer",
+ "remove paralysis",
+ "cause serious wounds",
+ "cure serious wounds",
+ "neutralize poison",
+ "protection from evil 10' radius",
+ "cause critical wounds",
+ "cure critical wounds",
+ "flame strike",
+ "raise dead",
+ "slay living",
+ "true seeing",
+ "harm",
+ "heal",
+ "ressurection",
+ "lay on hands",
+ "turn undead",
+ "",
+ "mystic defense",
+ "",
+ "",
+ "",
+ "",
+ ""
+};
+
+static const StringListProvider kEoB2SpellNamesDOSEnglishProvider = { ARRAYSIZE(kEoB2SpellNamesDOSEnglish), kEoB2SpellNamesDOSEnglish };
+
+static const char *const kEoB2MagicStrings1DOSEnglish[6] = {
+ "ABORT SPELL",
+ "ABORT SPELL",
+ "You must have a free hand for this spell.\r",
+ "You can't have two of this spell type active.\r",
+ "%s casts %s.\r",
+ "\rok\r"
+};
+
+static const StringListProvider kEoB2MagicStrings1DOSEnglishProvider = { ARRAYSIZE(kEoB2MagicStrings1DOSEnglish), kEoB2MagicStrings1DOSEnglish };
+
+static const char *const kEoB2MagicStrings2DOSEnglish[5] = {
+ "The spell fails!\r",
+ "%s has been disintegrated!\r",
+ "\x06\x06""The party has been hit by a death spell!\r",
+ "\x06\x06""%s has been hit by cause serious wounds.\r",
+ "PETRIFIED"
+};
+
+static const StringListProvider kEoB2MagicStrings2DOSEnglishProvider = { ARRAYSIZE(kEoB2MagicStrings2DOSEnglish), kEoB2MagicStrings2DOSEnglish };
+
+static const char *const kEoB2MagicStrings3DOSEnglish[5] = {
+ "Cast spell on which character? ",
+ "\rSpell aborted.\r",
+ "%s's %s spell expires.\r",
+ "%s missed the monster.\r",
+ "%s must be in the front ranks to hit!\r"
+};
+
+static const StringListProvider kEoB2MagicStrings3DOSEnglishProvider = { ARRAYSIZE(kEoB2MagicStrings3DOSEnglish), kEoB2MagicStrings3DOSEnglish };
+
+static const char *const kEoB2MagicStrings4DOSEnglish[1] = {
+ "no effect.\r"
+};
+
+static const StringListProvider kEoB2MagicStrings4DOSEnglishProvider = { ARRAYSIZE(kEoB2MagicStrings4DOSEnglish), kEoB2MagicStrings4DOSEnglish };
+
+static const char *const kEoB2MagicStrings6DOSEnglish[1] = {
+ "%s already has an armor class better than AC 6."
+};
+
+static const StringListProvider kEoB2MagicStrings6DOSEnglishProvider = { ARRAYSIZE(kEoB2MagicStrings6DOSEnglish), kEoB2MagicStrings6DOSEnglish };
+
+static const char *const kEoB2MagicStrings7DOSEnglish[2] = {
+ "%s is already under the effect of a %s spell.\r",
+ "The party is already under the effect of a %s spell.\r"
+};
+
+static const StringListProvider kEoB2MagicStrings7DOSEnglishProvider = { ARRAYSIZE(kEoB2MagicStrings7DOSEnglish), kEoB2MagicStrings7DOSEnglish };
+
+static const char *const kEoB2MagicStrings8DOSEnglish[6] = {
+ "The spell fails!\r",
+ "held",
+ "The spell fails!\r",
+ "The spell fails\r",
+ "No monster within reach!\r",
+ "%s is already under the effect of an aid spell.\r"
+};
+
+static const StringListProvider kEoB2MagicStrings8DOSEnglishProvider = { ARRAYSIZE(kEoB2MagicStrings8DOSEnglish), kEoB2MagicStrings8DOSEnglish };
+
+static const byte kEoB2ManDefDOSEnglish[200] = {
+ 0x09, 0x03, 0x04, 0x00, 0x09, 0x0D, 0x02, 0x00,
+ 0x09, 0x07, 0x07, 0x00, 0x14, 0x06, 0x05, 0x00,
+ 0x14, 0x10, 0x06, 0x00, 0x14, 0x1C, 0x03, 0x00,
+ 0x1A, 0x04, 0x06, 0x00, 0x1A, 0x0A, 0x05, 0x00,
+ 0x1A, 0x0C, 0x05, 0x00, 0x15, 0x03, 0x04, 0x00,
+ 0x15, 0x05, 0x05, 0x00, 0x15, 0x0F, 0x02, 0x00,
+ 0x15, 0x14, 0x03, 0x00, 0x15, 0x1B, 0x02, 0x00,
+ 0x15, 0x1D, 0x03, 0x00, 0x23, 0x01, 0x03, 0x00,
+ 0x23, 0x03, 0x03, 0x00, 0x23, 0x08, 0x03, 0x00,
+ 0x23, 0x19, 0x02, 0x00, 0x23, 0x1F, 0x04, 0x00,
+ 0x23, 0x26, 0x04, 0x00, 0x26, 0x03, 0x02, 0x00,
+ 0x26, 0x05, 0x06, 0x00, 0x26, 0x12, 0x03, 0x00,
+ 0x26, 0x18, 0x01, 0x00, 0x26, 0x1E, 0x01, 0x00,
+ 0x26, 0x21, 0x04, 0x00, 0x17, 0x01, 0x03, 0x00,
+ 0x17, 0x03, 0x06, 0x00, 0x17, 0x06, 0x02, 0x00,
+ 0x17, 0x0F, 0x05, 0x00, 0x17, 0x1B, 0x01, 0x00,
+ 0x17, 0x21, 0x06, 0x00, 0x12, 0x03, 0x02, 0x00,
+ 0x12, 0x05, 0x04, 0x00, 0x12, 0x09, 0x02, 0x00,
+ 0x12, 0x0B, 0x04, 0x00, 0x12, 0x0D, 0x06, 0x00,
+ 0x12, 0x0F, 0x03, 0x00, 0x12, 0x11, 0x05, 0x00,
+ 0x12, 0x12, 0x02, 0x00, 0x1F, 0x02, 0x04, 0x00,
+ 0x1F, 0x02, 0x07, 0x00, 0x1F, 0x04, 0x03, 0x00,
+ 0x1F, 0x06, 0x03, 0x00, 0x1F, 0x09, 0x03, 0x00,
+ 0x1F, 0x0A, 0x01, 0x00, 0x1C, 0x03, 0x03, 0x00,
+ 0x1C, 0x04, 0x02, 0x00, 0x1C, 0x05, 0x06, 0x00
+};
+
+static const ByteProvider kEoB2ManDefDOSEnglishProvider = { ARRAYSIZE(kEoB2ManDefDOSEnglish), kEoB2ManDefDOSEnglish };
+
+static const char *const kEoB2ManWordDOSEnglish[51] = {
+ "cursor",
+ "majority",
+ "right",
+ "unusable",
+ "greyed",
+ "thrown",
+ "spellcasters",
+ "button",
+ "characters",
+ "carefree",
+ "practical",
+ "inherit",
+ "while",
+ "combinations",
+ "charm",
+ "individuals",
+ "gestures",
+ "pummel",
+ "paladins",
+ "skill",
+ "advancement",
+ "also",
+ "counters",
+ "knowledge",
+ "greater",
+ "assume",
+ "several",
+ "laying",
+ "reach",
+ "swiftly",
+ "allows",
+ "limited",
+ "jack",
+ "thrown",
+ "weapons",
+ "note",
+ "certain",
+ "damage",
+ "done",
+ "bonus",
+ "may",
+ "over",
+ "box",
+ "put",
+ "portrait",
+ "backpack",
+ "inside",
+ "causes",
+ "until",
+ "outright",
+ ""
+};
+
+static const StringListProvider kEoB2ManWordDOSEnglishProvider = { ARRAYSIZE(kEoB2ManWordDOSEnglish), kEoB2ManWordDOSEnglish };
+
+static const char *const kEoB2ManPromptDOSEnglish[1] = {
+ "\r\r\r\rOn the page with this symbol...\r\rFind line %d\rEnter word %d\r"
+};
+
+static const StringListProvider kEoB2ManPromptDOSEnglishProvider = { ARRAYSIZE(kEoB2ManPromptDOSEnglish), kEoB2ManPromptDOSEnglish };
+
+static const char *const kEoB2MainMenuStringsDOSEnglish[5] = {
+ "LOAD GAME IN PROGRESS\r",
+ "START A NEW PARTY\r",
+ "TRANSFER EOB I PARTY\r",
+ "RUN INTRODUCTION\r",
+ "EXIT TO DOS\r"
+};
+
+static const StringListProvider kEoB2MainMenuStringsDOSEnglishProvider = { ARRAYSIZE(kEoB2MainMenuStringsDOSEnglish), kEoB2MainMenuStringsDOSEnglish };
+
+static const char *const kEoB2TransferStrings1DOSEnglish[2] = {
+ "Level: %d",
+ " / %d"
+};
+
+static const StringListProvider kEoB2TransferStrings1DOSEnglishProvider = { ARRAYSIZE(kEoB2TransferStrings1DOSEnglish), kEoB2TransferStrings1DOSEnglish };
+
+static const char *const kEoB2TransferStrings2DOSEnglish[2] = {
+ "You may only take four characters on your adventure.",
+ "Select OK when you are finished choosing your party."
+};
+
+static const StringListProvider kEoB2TransferStrings2DOSEnglishProvider = { ARRAYSIZE(kEoB2TransferStrings2DOSEnglish), kEoB2TransferStrings2DOSEnglish };
+
+static const char *const kEoB2TransferLabelsDOSEnglish[2] = {
+ "CANCEL",
+ "OK"
+};
+
+static const StringListProvider kEoB2TransferLabelsDOSEnglishProvider = { ARRAYSIZE(kEoB2TransferLabelsDOSEnglish), kEoB2TransferLabelsDOSEnglish };
+
+static const char *const kEoB2IntroStringsDOSEnglish[20] = {
+ "You were settling in for an evening \rby the fire.",
+ "Then a note was slipped to you.",
+ "It was from your friend Khelben \rBlackstaff, Archmage of the city.",
+ "The message was urgent.",
+ "What could Khelben want?",
+ "Welcome, please come in.",
+ "Khelben awaits you in his study.",
+ "Thank you for coming so quickly.",
+ "I am troubled my friend.",
+ "Ancient Evil stirs in the \rTemple Darkmoon.",
+ "I fear for the safety of our city.",
+ "I need your help.",
+ "Three nights ago \rI sent forth a scout.",
+ "She has not yet returned.",
+ "I fear for her safety.",
+ "Take this coin.",
+ "I will use it to contact you.",
+ "You must act quickly.",
+ "I will teleport you near Darkmoon.",
+ "May luck be with you, my friend."
+};
+
+static const StringListProvider kEoB2IntroStringsDOSEnglishProvider = { ARRAYSIZE(kEoB2IntroStringsDOSEnglish), kEoB2IntroStringsDOSEnglish };
+
+static const char *const kEoB2IntroCPSFilesDOSEnglish[13] = {
+ "STREET1.CPS",
+ "STREET2.CPS",
+ "DOORWAY1.CPS",
+ "DOORWAY2.CPS",
+ "WESTWOOD.CPS",
+ "WINDING.CPS",
+ "KHELBAN2.CPS",
+ "KHELBAN1.CPS",
+ "KHELBAN3.CPS",
+ "KHELBAN4.CPS",
+ "COIN.CPS",
+ "KHELBAN5.CPS",
+ "KHELBAN6.CPS"
+};
+
+static const StringListProvider kEoB2IntroCPSFilesDOSEnglishProvider = { ARRAYSIZE(kEoB2IntroCPSFilesDOSEnglish), kEoB2IntroCPSFilesDOSEnglish };
+
+static const char *const kEoB2FinaleStringsDOSEnglish[20] = {
+ "Finally, Dran has been defeated.",
+ "Suddenly, your friend Khelben appears.",
+ "Greetings, my victorious friends.",
+ "You have defeated Dran!",
+ "I did not know Dran was a dragon.",
+ "He must have been over 300 years old!",
+ "His power is gone.",
+ "But Darkmoon is still a source\rof great evil.",
+ "And many of his minions remain.",
+ "Now we must leave this place.",
+ "So my forces can destroy it\ronce and for all.",
+ "Follow me.",
+ "Powerful mages stand ready\rfor the final assault\ron Darkmoon.",
+ "The Temple's evil is very strong.",
+ "It must not be allowed to survive!",
+ "The Temple ceases to exist.",
+ "My friends, our work is done.",
+ "Thank you.",
+ "You have earned my deepest respect.",
+ "We will remember you always."
+};
+
+static const StringListProvider kEoB2FinaleStringsDOSEnglishProvider = { ARRAYSIZE(kEoB2FinaleStringsDOSEnglish), kEoB2FinaleStringsDOSEnglish };
+
+static const byte kEoB2CreditsDataDOSEnglish[2316] = {
+ 0x02, 0x05, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D,
+ 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D,
+ 0x0D, 0x02, 0x10, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D,
+ 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D,
+ 0x02, 0x03, 0x0D, 0x02, 0x04, 0x0D, 0x0D, 0x0D,
+ 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x02,
+ 0x06, 0x0D, 0x0D, 0x0D, 0x02, 0x01, 0x0D, 0x0D,
+ 0x0D, 0x0D, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x44, 0x69, 0x72, 0x65,
+ 0x63, 0x74, 0x6F, 0x72, 0x3A, 0x20, 0x42, 0x72,
+ 0x65, 0x74, 0x74, 0x20, 0x57, 0x2E, 0x20, 0x53,
+ 0x70, 0x65, 0x72, 0x72, 0x79, 0x20, 0x20, 0x20,
+ 0x0D, 0x0D, 0x0D, 0x0D, 0x20, 0x20, 0x4F, 0x72,
+ 0x69, 0x67, 0x69, 0x6E, 0x61, 0x6C, 0x20, 0x43,
+ 0x6F, 0x6E, 0x63, 0x65, 0x70, 0x74, 0x3A, 0x20,
+ 0x50, 0x68, 0x69, 0x6C, 0x69, 0x70, 0x20, 0x57,
+ 0x2E, 0x20, 0x47, 0x6F, 0x72, 0x72, 0x6F, 0x77,
+ 0x20, 0x20, 0x0D, 0x0D, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x42, 0x72, 0x65, 0x74, 0x74, 0x20, 0x57, 0x2E,
+ 0x20, 0x53, 0x70, 0x65, 0x72, 0x72, 0x79, 0x20,
+ 0x20, 0x20, 0x0D, 0x0D, 0x0D, 0x0D, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x47, 0x61, 0x6D,
+ 0x65, 0x20, 0x44, 0x65, 0x73, 0x69, 0x67, 0x6E,
+ 0x3A, 0x20, 0x42, 0x72, 0x65, 0x74, 0x74, 0x20,
+ 0x57, 0x2E, 0x20, 0x53, 0x70, 0x65, 0x72, 0x72,
+ 0x79, 0x20, 0x20, 0x20, 0x0D, 0x0D, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x50, 0x61, 0x75, 0x6C, 0x20, 0x53,
+ 0x2E, 0x20, 0x4D, 0x75, 0x64, 0x72, 0x61, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x0D, 0x0D, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x42, 0x69, 0x6C, 0x6C, 0x20, 0x53,
+ 0x74, 0x6F, 0x6B, 0x65, 0x73, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x0D, 0x0D, 0x0D, 0x0D,
+ 0x20, 0x20, 0x20, 0x4C, 0x65, 0x61, 0x64, 0x20,
+ 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x6D,
+ 0x65, 0x72, 0x3A, 0x20, 0x50, 0x68, 0x69, 0x6C,
+ 0x69, 0x70, 0x20, 0x57, 0x2E, 0x20, 0x47, 0x6F,
+ 0x72, 0x72, 0x6F, 0x77, 0x20, 0x20, 0x0D, 0x0D,
+ 0x0D, 0x0D, 0x20, 0x20, 0x4C, 0x65, 0x76, 0x65,
+ 0x6C, 0x20, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61,
+ 0x6D, 0x6D, 0x65, 0x72, 0x3A, 0x20, 0x42, 0x69,
+ 0x6C, 0x6C, 0x20, 0x53, 0x74, 0x6F, 0x6B, 0x65,
+ 0x73, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x0D, 0x0D, 0x0D, 0x0D, 0x20, 0x20, 0x41, 0x6D,
+ 0x69, 0x67, 0x61, 0x20, 0x50, 0x72, 0x6F, 0x67,
+ 0x72, 0x61, 0x6D, 0x6D, 0x65, 0x72, 0x3A, 0x20,
+ 0x42, 0x69, 0x6C, 0x6C, 0x20, 0x53, 0x74, 0x6F,
+ 0x6B, 0x65, 0x73, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x0D, 0x0D, 0x0D, 0x0D, 0x20, 0x49,
+ 0x6E, 0x74, 0x72, 0x6F, 0x20, 0x26, 0x20, 0x46,
+ 0x69, 0x6E, 0x61, 0x6C, 0x65, 0x20, 0x62, 0x79,
+ 0x3A, 0x20, 0x4A, 0x6F, 0x65, 0x20, 0x42, 0x6F,
+ 0x73, 0x74, 0x69, 0x63, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x0D, 0x0D, 0x0D, 0x0D,
+ 0x20, 0x20, 0x20, 0x20, 0x41, 0x72, 0x74, 0x20,
+ 0x26, 0x20, 0x47, 0x72, 0x61, 0x70, 0x68, 0x69,
+ 0x63, 0x73, 0x3A, 0x20, 0x52, 0x69, 0x63, 0x6B,
+ 0x20, 0x50, 0x61, 0x72, 0x6B, 0x73, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0D, 0x0D,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x41, 0x61, 0x72, 0x6F,
+ 0x6E, 0x20, 0x50, 0x6F, 0x77, 0x65, 0x6C, 0x6C,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0D, 0x0D,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x4A, 0x6F, 0x73, 0x65,
+ 0x70, 0x68, 0x20, 0x48, 0x65, 0x77, 0x69, 0x74,
+ 0x74, 0x20, 0x49, 0x56, 0x20, 0x20, 0x0D, 0x0D,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x52, 0x65, 0x6E, 0x20,
+ 0x4F, 0x6C, 0x73, 0x65, 0x6E, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0D, 0x0D,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x4C, 0x6F, 0x75, 0x69,
+ 0x73, 0x65, 0x20, 0x53, 0x61, 0x6E, 0x64, 0x6F,
+ 0x76, 0x61, 0x6C, 0x20, 0x20, 0x20, 0x0D, 0x0D,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x4A, 0x75, 0x64, 0x69,
+ 0x74, 0x68, 0x20, 0x50, 0x65, 0x74, 0x65, 0x72,
+ 0x73, 0x6F, 0x6E, 0x20, 0x20, 0x20, 0x0D, 0x0D,
+ 0x0D, 0x0D, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x4D,
+ 0x75, 0x73, 0x69, 0x63, 0x3A, 0x20, 0x46, 0x72,
+ 0x61, 0x6E, 0x6B, 0x20, 0x4B, 0x6C, 0x65, 0x70,
+ 0x61, 0x63, 0x6B, 0x69, 0x20, 0x20, 0x20, 0x20,
+ 0x0D, 0x0D, 0x0D, 0x0D, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x53, 0x6F, 0x75, 0x6E, 0x64, 0x20, 0x45,
+ 0x66, 0x66, 0x65, 0x63, 0x74, 0x73, 0x3A, 0x20,
+ 0x50, 0x61, 0x75, 0x6C, 0x20, 0x53, 0x2E, 0x20,
+ 0x4D, 0x75, 0x64, 0x72, 0x61, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x0D, 0x0D, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x44, 0x77, 0x69, 0x67, 0x68, 0x74, 0x20, 0x4F,
+ 0x6B, 0x61, 0x68, 0x61, 0x72, 0x61, 0x20, 0x20,
+ 0x20, 0x20, 0x0D, 0x0D, 0x0D, 0x0D, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x57, 0x72, 0x69, 0x74, 0x65, 0x72,
+ 0x3A, 0x20, 0x4D, 0x61, 0x72, 0x63, 0x20, 0x43,
+ 0x72, 0x61, 0x6D, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x0D, 0x0D, 0x0D, 0x0D,
+ 0x20, 0x51, 0x75, 0x61, 0x6C, 0x69, 0x74, 0x79,
+ 0x20, 0x41, 0x73, 0x73, 0x75, 0x72, 0x61, 0x6E,
+ 0x63, 0x65, 0x3A, 0x20, 0x47, 0x6C, 0x65, 0x6E,
+ 0x6E, 0x20, 0x53, 0x70, 0x65, 0x72, 0x72, 0x79,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0D, 0x0D,
+ 0x0D, 0x0D, 0x0D, 0x0D, 0x53, 0x70, 0x65, 0x63,
+ 0x69, 0x61, 0x6C, 0x20, 0x54, 0x68, 0x61, 0x6E,
+ 0x6B, 0x73, 0x20, 0x74, 0x6F, 0x0D, 0x0D, 0x0D,
+ 0x43, 0x68, 0x75, 0x63, 0x6B, 0x20, 0x4B, 0x72,
+ 0x6F, 0x65, 0x67, 0x65, 0x6C, 0x0D, 0x0D, 0x58,
+ 0x61, 0x6E, 0x61, 0x74, 0x68, 0x61, 0x72, 0x20,
+ 0x74, 0x68, 0x65, 0x20, 0x42, 0x65, 0x68, 0x6F,
+ 0x6C, 0x64, 0x65, 0x72, 0x0D, 0x0D, 0x61, 0x6E,
+ 0x64, 0x0D, 0x0D, 0x4D, 0x69, 0x6B, 0x65, 0x27,
+ 0x73, 0x20, 0x63, 0x61, 0x74, 0x2C, 0x20, 0x53,
+ 0x70, 0x61, 0x72, 0x6B, 0x79, 0x0D, 0x0D, 0x0D,
+ 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D,
+ 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x50, 0x75, 0x62,
+ 0x6C, 0x69, 0x73, 0x68, 0x65, 0x64, 0x20, 0x62,
+ 0x79, 0x0D, 0x0D, 0x02, 0x02, 0x0D, 0x0D, 0x0D,
+ 0x0D, 0x0D, 0x0D, 0x0D, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x50, 0x72, 0x6F,
+ 0x64, 0x75, 0x63, 0x65, 0x72, 0x73, 0x3A, 0x20,
+ 0x44, 0x61, 0x6E, 0x20, 0x43, 0x65, 0x72, 0x6D,
+ 0x61, 0x6B, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x0D, 0x0D, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x47, 0x65, 0x6F, 0x72, 0x67, 0x65, 0x20, 0x4D,
+ 0x61, 0x63, 0x44, 0x6F, 0x6E, 0x61, 0x6C, 0x64,
+ 0x20, 0x20, 0x0D, 0x0D, 0x0D, 0x0D, 0x20, 0x20,
+ 0x47, 0x61, 0x6D, 0x65, 0x20, 0x44, 0x65, 0x76,
+ 0x65, 0x6C, 0x6F, 0x70, 0x6D, 0x65, 0x6E, 0x74,
+ 0x3A, 0x20, 0x4E, 0x69, 0x63, 0x68, 0x6F, 0x6C,
+ 0x61, 0x73, 0x20, 0x42, 0x65, 0x6C, 0x69, 0x61,
+ 0x65, 0x66, 0x66, 0x20, 0x0D, 0x0D, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x44, 0x61, 0x76, 0x69, 0x64, 0x20,
+ 0x41, 0x2E, 0x20, 0x4C, 0x75, 0x63, 0x63, 0x61,
+ 0x20, 0x20, 0x20, 0x20, 0x0D, 0x0D, 0x0D, 0x0D,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x50, 0x6C,
+ 0x61, 0x79, 0x20, 0x54, 0x65, 0x73, 0x74, 0x65,
+ 0x72, 0x73, 0x3A, 0x20, 0x50, 0x68, 0x69, 0x6C,
+ 0x20, 0x41, 0x6C, 0x6E, 0x65, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0D, 0x0D,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x4A, 0x6F, 0x68, 0x6E,
+ 0x20, 0x42, 0x6F, 0x6F, 0x63, 0x6B, 0x68, 0x6F,
+ 0x6C, 0x64, 0x74, 0x20, 0x20, 0x20, 0x0D, 0x0D,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x47, 0x6C, 0x65, 0x6E,
+ 0x20, 0x43, 0x75, 0x72, 0x65, 0x74, 0x6F, 0x6E,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0D, 0x0D,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x4D, 0x61, 0x72, 0x6B,
+ 0x20, 0x48, 0x61, 0x6C, 0x6C, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0D, 0x0D,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x42, 0x72, 0x69, 0x61,
+ 0x6E, 0x20, 0x4C, 0x6F, 0x77, 0x65, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0D, 0x0D,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x52, 0x6F, 0x62, 0x65,
+ 0x72, 0x74, 0x20, 0x4C, 0x75, 0x70, 0x6F, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0D, 0x0D,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x41, 0x6C, 0x61, 0x6E,
+ 0x20, 0x4D, 0x61, 0x72, 0x65, 0x6E, 0x63, 0x6F,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0D, 0x0D,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x4A, 0x61, 0x73, 0x6F,
+ 0x6E, 0x20, 0x52, 0x61, 0x79, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0D, 0x0D,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x4A, 0x65, 0x66, 0x66,
+ 0x20, 0x53, 0x68, 0x6F, 0x74, 0x77, 0x65, 0x6C,
+ 0x6C, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0D, 0x0D,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x41, 0x6E, 0x64, 0x72,
+ 0x65, 0x20, 0x56, 0x72, 0x69, 0x67, 0x6E, 0x61,
+ 0x75, 0x64, 0x20, 0x20, 0x20, 0x20, 0x0D, 0x0D,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x43, 0x68, 0x72, 0x69,
+ 0x73, 0x20, 0x57, 0x61, 0x72, 0x73, 0x68, 0x61,
+ 0x75, 0x65, 0x72, 0x20, 0x20, 0x20, 0x0D, 0x0D,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x61, 0x6E, 0x64, 0x20,
+ 0x54, 0x53, 0x43, 0x53, 0x2C, 0x20, 0x49, 0x6E,
+ 0x63, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0D, 0x0D,
+ 0x0D, 0x0D, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x54, 0x65, 0x73, 0x74, 0x20, 0x53, 0x75, 0x70,
+ 0x70, 0x6F, 0x72, 0x74, 0x3A, 0x20, 0x4B, 0x79,
+ 0x6D, 0x20, 0x47, 0x6F, 0x79, 0x65, 0x72, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D,
+ 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D,
+ 0x0D, 0x0D, 0x0D, 0x43, 0x61, 0x73, 0x74, 0x20,
+ 0x6F, 0x66, 0x20, 0x43, 0x68, 0x61, 0x72, 0x61,
+ 0x63, 0x74, 0x65, 0x72, 0x73, 0x0D, 0x0D, 0x0D,
+ 0x54, 0x68, 0x65, 0x20, 0x46, 0x6F, 0x72, 0x63,
+ 0x65, 0x73, 0x20, 0x6F, 0x66, 0x20, 0x44, 0x61,
+ 0x72, 0x6B, 0x6E, 0x65, 0x73, 0x73, 0x0D, 0x0D,
+ 0x0D, 0x44, 0x72, 0x61, 0x6E, 0x20, 0x44, 0x72,
+ 0x61, 0x67, 0x67, 0x6F, 0x72, 0x65, 0x20, 0x28,
+ 0x54, 0x68, 0x65, 0x20, 0x42, 0x69, 0x67, 0x20,
+ 0x42, 0x61, 0x64, 0x20, 0x44, 0x72, 0x61, 0x67,
+ 0x6F, 0x6E, 0x29, 0x0D, 0x0D, 0x4E, 0x61, 0x64,
+ 0x69, 0x61, 0x20, 0x26, 0x20, 0x4A, 0x6F, 0x72,
+ 0x69, 0x6C, 0x20, 0x28, 0x54, 0x68, 0x65, 0x20,
+ 0x54, 0x77, 0x6F, 0x2D, 0x46, 0x61, 0x63, 0x65,
+ 0x64, 0x20, 0x43, 0x6C, 0x65, 0x72, 0x69, 0x63,
+ 0x73, 0x29, 0x0D, 0x0D, 0x44, 0x79, 0x69, 0x6E,
+ 0x67, 0x20, 0x53, 0x65, 0x72, 0x76, 0x61, 0x6E,
+ 0x74, 0x20, 0x28, 0x44, 0x72, 0x61, 0x6E, 0x27,
+ 0x73, 0x20, 0x52, 0x69, 0x67, 0x68, 0x74, 0x20,
+ 0x48, 0x61, 0x6E, 0x64, 0x20, 0x4D, 0x61, 0x6E,
+ 0x29, 0x0D, 0x0D, 0x54, 0x72, 0x61, 0x70, 0x70,
+ 0x65, 0x64, 0x20, 0x43, 0x6C, 0x65, 0x72, 0x69,
+ 0x63, 0x20, 0x28, 0x54, 0x68, 0x65, 0x20, 0x52,
+ 0x65, 0x64, 0x20, 0x48, 0x65, 0x72, 0x72, 0x69,
+ 0x6E, 0x67, 0x29, 0x0D, 0x0D, 0x4B, 0x69, 0x6E,
+ 0x67, 0x20, 0x6F, 0x66, 0x20, 0x74, 0x68, 0x65,
+ 0x20, 0x46, 0x72, 0x6F, 0x73, 0x74, 0x20, 0x47,
+ 0x69, 0x61, 0x6E, 0x74, 0x73, 0x0D, 0x0D, 0x0D,
+ 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D,
+ 0x0D, 0x54, 0x68, 0x65, 0x20, 0x46, 0x6F, 0x72,
+ 0x63, 0x65, 0x73, 0x20, 0x6F, 0x66, 0x20, 0x47,
+ 0x6F, 0x6F, 0x64, 0x0D, 0x0D, 0x0D, 0x4B, 0x68,
+ 0x65, 0x6C, 0x62, 0x65, 0x6E, 0x20, 0x42, 0x6C,
+ 0x61, 0x63, 0x6B, 0x73, 0x74, 0x61, 0x66, 0x66,
+ 0x0D, 0x0D, 0x41, 0x6D, 0x62, 0x65, 0x72, 0x20,
+ 0x28, 0x4B, 0x68, 0x65, 0x6C, 0x62, 0x65, 0x6E,
+ 0x27, 0x73, 0x20, 0x53, 0x63, 0x6F, 0x75, 0x74,
+ 0x29, 0x0D, 0x0D, 0x53, 0x68, 0x6F, 0x72, 0x6E,
+ 0x20, 0x44, 0x69, 0x65, 0x72, 0x67, 0x61, 0x72,
+ 0x20, 0x28, 0x50, 0x65, 0x73, 0x6B, 0x79, 0x20,
+ 0x44, 0x77, 0x61, 0x72, 0x66, 0x29, 0x0D, 0x0D,
+ 0x49, 0x6E, 0x73, 0x61, 0x6C, 0x20, 0x74, 0x68,
+ 0x65, 0x20, 0x54, 0x68, 0x69, 0x65, 0x66, 0x20,
+ 0x28, 0x54, 0x68, 0x65, 0x20, 0x4E, 0x75, 0x69,
+ 0x73, 0x61, 0x6E, 0x63, 0x65, 0x29, 0x0D, 0x0D,
+ 0x43, 0x61, 0x6C, 0x61, 0x6E, 0x64, 0x72, 0x61,
+ 0x20, 0x28, 0x49, 0x72, 0x61, 0x27, 0x73, 0x20,
+ 0x4C, 0x6F, 0x73, 0x74, 0x20, 0x53, 0x69, 0x73,
+ 0x74, 0x65, 0x72, 0x29, 0x0D, 0x0D, 0x41, 0x6C,
+ 0x61, 0x69, 0x6E, 0x20, 0x28, 0x54, 0x68, 0x65,
+ 0x20, 0x41, 0x6E, 0x63, 0x69, 0x65, 0x6E, 0x74,
+ 0x20, 0x4F, 0x6E, 0x65, 0x29, 0x0D, 0x0D, 0x53,
+ 0x61, 0x6E, 0x2D, 0x52, 0x61, 0x61, 0x6C, 0x20,
+ 0x28, 0x44, 0x72, 0x6F, 0x77, 0x20, 0x4D, 0x61,
+ 0x67, 0x65, 0x29, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D,
+ 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D,
+ 0x0D, 0x0D, 0x01, 0x41, 0x6E, 0x79, 0x20, 0x63,
+ 0x68, 0x61, 0x72, 0x61, 0x63, 0x74, 0x65, 0x72,
+ 0x73, 0x20, 0x69, 0x6E, 0x20, 0x74, 0x68, 0x69,
+ 0x73, 0x20, 0x67, 0x61, 0x6D, 0x65, 0x20, 0x77,
+ 0x68, 0x6F, 0x20, 0x62, 0x65, 0x61, 0x72, 0x0D,
+ 0x01, 0x72, 0x65, 0x73, 0x65, 0x6D, 0x62, 0x6C,
+ 0x61, 0x6E, 0x63, 0x65, 0x20, 0x74, 0x6F, 0x20,
+ 0x70, 0x65, 0x72, 0x73, 0x6F, 0x6E, 0x73, 0x20,
+ 0x6C, 0x69, 0x76, 0x69, 0x6E, 0x67, 0x20, 0x6F,
+ 0x72, 0x0D, 0x01, 0x64, 0x65, 0x61, 0x64, 0x20,
+ 0x61, 0x72, 0x65, 0x20, 0x70, 0x75, 0x72, 0x65,
+ 0x6C, 0x79, 0x20, 0x63, 0x6F, 0x69, 0x6E, 0x63,
+ 0x69, 0x64, 0x65, 0x6E, 0x74, 0x61, 0x6C, 0x2E,
+ 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D,
+ 0x0D, 0x0D, 0x0D, 0x02, 0x11, 0x0D, 0x0D, 0x0D,
+ 0x0D, 0x0D, 0x0D, 0x00
+};
+
+static const ByteProvider kEoB2CreditsDataDOSEnglishProvider = { ARRAYSIZE(kEoB2CreditsDataDOSEnglish), kEoB2CreditsDataDOSEnglish };
+
+static const char *const kEoB2FinaleCPSFilesDOSEnglish[13] = {
+ "DRAGON1.CPS",
+ "DRAGON2.CPS",
+ "HURRY1.CPS",
+ "HURRY2.CPS",
+ "DESTROY0.CPS",
+ "DESTROY1.CPS",
+ "DESTROY2.CPS",
+ "MAGIC.CPS",
+ "DESTROY3.CPS",
+ "CREDITS2.CPS",
+ "CREDITS3.CPS",
+ "HEROES.CPS",
+ "THANKS.CPS"
+};
+
+static const StringListProvider kEoB2FinaleCPSFilesDOSEnglishProvider = { ARRAYSIZE(kEoB2FinaleCPSFilesDOSEnglish), kEoB2FinaleCPSFilesDOSEnglish };
+
+static const char *const kEoB2MonsterDistAttStringsDOSEnglish[5] = {
+ "The party is hit with a psychic mind blast!\r",
+ "paralyzed",
+ "poisoned",
+ "paralyzed",
+ "PETRIFIED"
+};
+
+static const StringListProvider kEoB2MonsterDistAttStringsDOSEnglishProvider = { ARRAYSIZE(kEoB2MonsterDistAttStringsDOSEnglish), kEoB2MonsterDistAttStringsDOSEnglish };
+
+static const char *const kEoB2Npc1StringsDOSEnglish[2] = {
+ "talk",
+ "leave"
+};
+
+static const StringListProvider kEoB2Npc1StringsDOSEnglishProvider = { ARRAYSIZE(kEoB2Npc1StringsDOSEnglish), kEoB2Npc1StringsDOSEnglish };
+
+static const char *const kEoB2Npc2StringsDOSEnglish[2] = {
+ "release him",
+ "leave"
+};
+
+static const StringListProvider kEoB2Npc2StringsDOSEnglishProvider = { ARRAYSIZE(kEoB2Npc2StringsDOSEnglish), kEoB2Npc2StringsDOSEnglish };
+
+static const char *const kEoB2MonsterDustStringsDOSEnglish[1] = {
+ "The monster crumbles to dust!\r"
+};
+
+static const StringListProvider kEoB2MonsterDustStringsDOSEnglishProvider = { ARRAYSIZE(kEoB2MonsterDustStringsDOSEnglish), kEoB2MonsterDustStringsDOSEnglish };
+
+static const char *const kEoB2KheldranStringsDOSEnglish[1] = {
+ " Such trusting whelps!"
+};
+
+static const StringListProvider kEoB2KheldranStringsDOSEnglishProvider = { ARRAYSIZE(kEoB2KheldranStringsDOSEnglish), kEoB2KheldranStringsDOSEnglish };
+
+static const char *const kEoB2HornStringsDOSEnglish[4] = {
+ "A bellowing sound comes from the horn.\r",
+ "A hollow sound comes from the horn.\r",
+ "A melodious sound comes from the horn.\r",
+ "An eerie sound comes from the horn.\r"
+};
+
+static const StringListProvider kEoB2HornStringsDOSEnglishProvider = { ARRAYSIZE(kEoB2HornStringsDOSEnglish), kEoB2HornStringsDOSEnglish };
+
diff --git a/devtools/create_kyradat/resources/eob2_dos_german.h b/devtools/create_kyradat/resources/eob2_dos_german.h
new file mode 100644
index 0000000000..6967eac8a4
--- /dev/null
+++ b/devtools/create_kyradat/resources/eob2_dos_german.h
@@ -0,0 +1,1414 @@
+static const char *const kEoB2ChargenStrings1DOSGerman[9] = {
+ "Die Party ist\rkomplett. W""\x84""hle\rSPIEL oder\rdr""\x81""cke 'P' um\rzu starten.",
+ " ",
+ "RK\rTP\rSTF",
+ "%s\r%d\r%d\r%d\r%d\r%d",
+ "%d\r%d",
+ "%d",
+ "%d/%d",
+ "%d/%d/%d",
+ "W""\x84""hle die Box des\rCharakters, den du\rerschaffen oder\ransehen willst."
+};
+
+static const StringListProvider kEoB2ChargenStrings1DOSGermanProvider = { ARRAYSIZE(kEoB2ChargenStrings1DOSGerman), kEoB2ChargenStrings1DOSGerman };
+
+static const char *const kEoB2ChargenStrings2DOSGerman[12] = {
+ "%s",
+ "%d",
+ "%s",
+ "%d",
+ "%d",
+ "%d",
+ "%s",
+ "%d",
+ "W""\x8E""HLE RASSE:",
+ "W""\x8E""HLE KLASSE:",
+ "W""\x8E""HLE GESINNUNG:",
+ "Name:"
+};
+
+static const StringListProvider kEoB2ChargenStrings2DOSGermanProvider = { ARRAYSIZE(kEoB2ChargenStrings2DOSGerman), kEoB2ChargenStrings2DOSGerman };
+
+static const char *const kEoB2ChargenStatStringsDOSGerman[12] = {
+ "ST""\x8E",
+ "INT",
+ "WEI",
+ "GES",
+ "KON",
+ "CHA",
+ "ST""\x8E""RKE",
+ "INTELLIGENZ",
+ "WEISHEIT",
+ "GESCHICK",
+ "KONSTITUTION",
+ "CHARISMA"
+};
+
+static const StringListProvider kEoB2ChargenStatStringsDOSGermanProvider = { ARRAYSIZE(kEoB2ChargenStatStringsDOSGerman), kEoB2ChargenStatStringsDOSGerman };
+
+static const char *const kEoB2ChargenRaceSexStringsDOSGerman[12] = {
+ "MENSCH, MANN",
+ "MENSCH, FRAU",
+ "ELF, MANN",
+ "ELF, FRAU",
+ "HALB-ELF, MANN",
+ "HALB-ELF, FRAU",
+ "ZWERG, MANN",
+ "ZWERG, FRAU",
+ "GNOM, MANN",
+ "GNOM, FRAU",
+ "HALBLING, MANN",
+ "HALBLING, FRAU"
+};
+
+static const StringListProvider kEoB2ChargenRaceSexStringsDOSGermanProvider = { ARRAYSIZE(kEoB2ChargenRaceSexStringsDOSGerman), kEoB2ChargenRaceSexStringsDOSGerman };
+
+static const char *const kEoB2ChargenClassStringsDOSGerman[21] = {
+ "K""\x8E""MPFER",
+ "WALDL""\x8E""UFER",
+ "PALADIN",
+ "MAGIER",
+ "KLERIKER",
+ "DIEB",
+ "K""\x8E""MPFER/KLERIKER",
+ "K""\x8E""MPFER/DIEB",
+ "K""\x8E""MPFER/MAGIER",
+ "K""\x8E""MPFER/MAGIER/DIEB",
+ "DIEB/MAGIER",
+ "KLERIKER/DIEB",
+ "K""\x8E""MPFER/KLER./MAG.",
+ "WALDL./KLER.",
+ "KLER./MAGIER",
+ "K""\x8E""MPFER",
+ "MAGIER",
+ "KLERIKER",
+ "DIEB",
+ "PALADIN",
+ "WALDL."
+};
+
+static const StringListProvider kEoB2ChargenClassStringsDOSGermanProvider = { ARRAYSIZE(kEoB2ChargenClassStringsDOSGerman), kEoB2ChargenClassStringsDOSGerman };
+
+static const char *const kEoB2ChargenAlignmentStringsDOSGerman[9] = {
+ "RECHTSCH. GUT",
+ "NEUTRAL GUT",
+ "CHAOTISCH GUT",
+ "RECHTSCH. NEUTRAL",
+ "NEUTRAL",
+ "CHAOTISCH NEUTRAL",
+ "RECHTSCH. B""\x99""SE",
+ "NEUTRAL B""\x99""SE",
+ "CHAOTISCH B""\x99""SE"
+};
+
+static const StringListProvider kEoB2ChargenAlignmentStringsDOSGermanProvider = { ARRAYSIZE(kEoB2ChargenAlignmentStringsDOSGerman), kEoB2ChargenAlignmentStringsDOSGerman };
+
+static const char *const kEoB2ChargenEnterGameStringsDOSGerman[1] = {
+ " Lade Spiel.\r Bitte warten."
+};
+
+static const StringListProvider kEoB2ChargenEnterGameStringsDOSGermanProvider = { ARRAYSIZE(kEoB2ChargenEnterGameStringsDOSGerman), kEoB2ChargenEnterGameStringsDOSGerman };
+
+static const char *const kEoB2PryDoorStringsDOSGerman[9] = {
+ "\r",
+ "Ihr k""\x94""nnt die T""\x81""r nicht aufbrechen.\r",
+ "\x06\x04""Ihr brecht die T""\x81""r auf.\r",
+ "\x06\x06""Ihr versucht vergeblich die T""\x81""r gewaltsam zu\r""\x94""ffnen.\r",
+ "Das kann man hier nicht ablegen.\r",
+ "Das passt hier nicht.\r",
+ "Niemand kann die T""\x81""r aufbrechen.\r",
+ "\r",
+ "\r"
+};
+
+static const StringListProvider kEoB2PryDoorStringsDOSGermanProvider = { ARRAYSIZE(kEoB2PryDoorStringsDOSGerman), kEoB2PryDoorStringsDOSGerman };
+
+static const char *const kEoB2WarningStringsDOSGerman[4] = {
+ "Da geht's nicht lang.\r",
+ "%s kann nichts zu sich nehmen!\r",
+ "Das Zeug ist vergammelt! Das will doch kein Mensch essen.\r",
+ "Euch bekommt nur richtige Nahrung!\r"
+};
+
+static const StringListProvider kEoB2WarningStringsDOSGermanProvider = { ARRAYSIZE(kEoB2WarningStringsDOSGerman), kEoB2WarningStringsDOSGerman };
+
+static const char *const kEoB2ItemSuffixStringsRingsDOSGerman[4] = {
+ "s Schmuckes",
+ "r Zauberei",
+ "r Nahrung",
+ "s Federfalls"
+};
+
+static const StringListProvider kEoB2ItemSuffixStringsRingsDOSGermanProvider = { ARRAYSIZE(kEoB2ItemSuffixStringsRingsDOSGerman), kEoB2ItemSuffixStringsRingsDOSGerman };
+
+static const char *const kEoB2ItemSuffixStringsPotionsDOSGerman[8] = {
+ "r Riesenkraft",
+ "r Heilung",
+ "r Extra Heilung",
+ "s Giftes",
+ "r Lebenskraft",
+ "r Geschwindigkeit",
+ "r Unsichtbarkeit",
+ "r Entgiftung"
+};
+
+static const StringListProvider kEoB2ItemSuffixStringsPotionsDOSGermanProvider = { ARRAYSIZE(kEoB2ItemSuffixStringsPotionsDOSGerman), kEoB2ItemSuffixStringsPotionsDOSGerman };
+
+static const char *const kEoB2ItemSuffixStringsWandsDOSGerman[8] = {
+ "r L""\x84""hmung",
+ "s Gewitters",
+ "r K""\x84""lte",
+ "r Heilung",
+ "s Feurballs",
+ "Sternenfeuer",
+ "r Magischen Geschosse",
+ "r gebannten Magie"
+};
+
+static const StringListProvider kEoB2ItemSuffixStringsWandsDOSGermanProvider = { ARRAYSIZE(kEoB2ItemSuffixStringsWandsDOSGerman), kEoB2ItemSuffixStringsWandsDOSGerman };
+
+static const char *const kEoB2RipItemStringsDOSGerman[4] = {
+ "%s verlor: ",
+ "%s verlor: ",
+ ".\r",
+ "%d %s (verflucht) "
+};
+
+static const StringListProvider kEoB2RipItemStringsDOSGermanProvider = { ARRAYSIZE(kEoB2RipItemStringsDOSGerman), kEoB2RipItemStringsDOSGerman };
+
+static const char *const kEoB2CursedStringDOSGerman[1] = {
+ "%d %s (verflucht) "
+};
+
+static const StringListProvider kEoB2CursedStringDOSGermanProvider = { ARRAYSIZE(kEoB2CursedStringDOSGerman), kEoB2CursedStringDOSGerman };
+
+static const char *const kEoB2MagicObjectStringsDOSGerman[5] = {
+ "Magierrolle",
+ "Klerikerrolle",
+ "Ring",
+ "Trank",
+ "Stab"
+};
+
+static const StringListProvider kEoB2MagicObjectStringsDOSGermanProvider = { ARRAYSIZE(kEoB2MagicObjectStringsDOSGerman), kEoB2MagicObjectStringsDOSGerman };
+
+static const char *const kEoB2MagicObjectString5DOSGerman[1] = {
+ "Zepter"
+};
+
+static const StringListProvider kEoB2MagicObjectString5DOSGermanProvider = { ARRAYSIZE(kEoB2MagicObjectString5DOSGerman), kEoB2MagicObjectString5DOSGerman };
+
+static const char *const kEoB2PatternSuffixDOSGerman[1] = {
+ "%s de%s"
+};
+
+static const StringListProvider kEoB2PatternSuffixDOSGermanProvider = { ARRAYSIZE(kEoB2PatternSuffixDOSGerman), kEoB2PatternSuffixDOSGerman };
+
+static const char *const kEoB2PatternGrFix1DOSGerman[1] = {
+ "%s: %s"
+};
+
+static const StringListProvider kEoB2PatternGrFix1DOSGermanProvider = { ARRAYSIZE(kEoB2PatternGrFix1DOSGerman), kEoB2PatternGrFix1DOSGerman };
+
+static const char *const kEoB2PatternGrFix2DOSGerman[1] = {
+ "%s %s"
+};
+
+static const StringListProvider kEoB2PatternGrFix2DOSGermanProvider = { ARRAYSIZE(kEoB2PatternGrFix2DOSGerman), kEoB2PatternGrFix2DOSGerman };
+
+static const char *const kEoB2ValidateArmorStringDOSGerman[1] = {
+ "%s kann diese R""\x81""stungsart nicht tragen.\r"
+};
+
+static const StringListProvider kEoB2ValidateArmorStringDOSGermanProvider = { ARRAYSIZE(kEoB2ValidateArmorStringDOSGerman), kEoB2ValidateArmorStringDOSGerman };
+
+static const char *const kEoB2ValidateCursedStringDOSGerman[1] = {
+ "%s kann die Waffe nicht loslassen! Sie ist verflucht!\r"
+};
+
+static const StringListProvider kEoB2ValidateCursedStringDOSGermanProvider = { ARRAYSIZE(kEoB2ValidateCursedStringDOSGerman), kEoB2ValidateCursedStringDOSGerman };
+
+static const char *const kEoB2ValidateNoDropStringDOSGerman[1] = {
+ "Diesen Gegenstand hier nicht ablegen.\r"
+};
+
+static const StringListProvider kEoB2ValidateNoDropStringDOSGermanProvider = { ARRAYSIZE(kEoB2ValidateNoDropStringDOSGerman), kEoB2ValidateNoDropStringDOSGerman };
+
+static const char *const kEoB2PotionStringsDOSGerman[2] = {
+ "vergiftet",
+ "%s f""\x81""hlt sich %s!\r"
+};
+
+static const StringListProvider kEoB2PotionStringsDOSGermanProvider = { ARRAYSIZE(kEoB2PotionStringsDOSGerman), kEoB2PotionStringsDOSGerman };
+
+static const char *const kEoB2WandStringsDOSGerman[1] = {
+ "Der Stab hat offenbar keinen magischen Effekt\r"
+};
+
+static const StringListProvider kEoB2WandStringsDOSGermanProvider = { ARRAYSIZE(kEoB2WandStringsDOSGerman), kEoB2WandStringsDOSGerman };
+
+static const char *const kEoB2ItemMisuseStringsDOSGerman[3] = {
+ " kann diesen Gegenstand nicht nutzen.\r",
+ "Der Gegenstand wird automatisch beim tragen benutzt.\r",
+ "Das kann man so nicht benutzen.\r"
+};
+
+static const StringListProvider kEoB2ItemMisuseStringsDOSGermanProvider = { ARRAYSIZE(kEoB2ItemMisuseStringsDOSGerman), kEoB2ItemMisuseStringsDOSGerman };
+
+static const char *const kEoB2TakenStringsDOSGerman[1] = {
+ " aufgenommen.\r"
+};
+
+static const StringListProvider kEoB2TakenStringsDOSGermanProvider = { ARRAYSIZE(kEoB2TakenStringsDOSGerman), kEoB2TakenStringsDOSGerman };
+
+static const char *const kEoB2PotionEffectStringsDOSGerman[8] = {
+ "viel st""\x84""rker",
+ "besser",
+ "viel besser",
+ "etwas krank",
+ "pappsatt",
+ "schnell und agil",
+ "transparent",
+ "besser"
+};
+
+static const StringListProvider kEoB2PotionEffectStringsDOSGermanProvider = { ARRAYSIZE(kEoB2PotionEffectStringsDOSGerman), kEoB2PotionEffectStringsDOSGerman };
+
+static const char *const kEoB2YesNoStringsDOSGerman[2] = {
+ "ja",
+ "nein"
+};
+
+static const StringListProvider kEoB2YesNoStringsDOSGermanProvider = { ARRAYSIZE(kEoB2YesNoStringsDOSGerman), kEoB2YesNoStringsDOSGerman };
+
+static const char *const kEoB2MoreStringsDOSGerman[1] = {
+ "MEHR"
+};
+
+static const StringListProvider kEoB2MoreStringsDOSGermanProvider = { ARRAYSIZE(kEoB2MoreStringsDOSGerman), kEoB2MoreStringsDOSGerman };
+
+static const char *const kEoB2NpcMaxStringsDOSGerman[1] = {
+ "Maximal sechs Charaktere pro Party. Wen wollt Ihr entlassen?"
+};
+
+static const StringListProvider kEoB2NpcMaxStringsDOSGermanProvider = { ARRAYSIZE(kEoB2NpcMaxStringsDOSGerman), kEoB2NpcMaxStringsDOSGerman };
+
+static const char *const kEoB2OkStringsDOSGerman[1] = {
+ "OK"
+};
+
+static const StringListProvider kEoB2OkStringsDOSGermanProvider = { ARRAYSIZE(kEoB2OkStringsDOSGerman), kEoB2OkStringsDOSGerman };
+
+static const char *const kEoB2NpcJoinStringsDOSGerman[1] = {
+ "%s wird partymitglied.\r"
+};
+
+static const StringListProvider kEoB2NpcJoinStringsDOSGermanProvider = { ARRAYSIZE(kEoB2NpcJoinStringsDOSGerman), kEoB2NpcJoinStringsDOSGerman };
+
+static const char *const kEoB2CancelStringsDOSGerman[1] = {
+ "ABBR."
+};
+
+static const StringListProvider kEoB2CancelStringsDOSGermanProvider = { ARRAYSIZE(kEoB2CancelStringsDOSGerman), kEoB2CancelStringsDOSGerman };
+
+static const char *const kEoB2AbortStringsDOSGerman[1] = {
+ "ABBR."
+};
+
+static const StringListProvider kEoB2AbortStringsDOSGermanProvider = { ARRAYSIZE(kEoB2AbortStringsDOSGerman), kEoB2AbortStringsDOSGerman };
+
+static const char *const kEoB2MenuStringsMainDOSGerman[8] = {
+ "W""\x84""hle Option:",
+ "Rasten",
+ "Spr""\x81""che merken",
+ "Um Spr""\x81""che beten",
+ "Rollen notieren",
+ "Voreinstellungen",
+ "Spieloptionen",
+ "Ende"
+};
+
+static const StringListProvider kEoB2MenuStringsMainDOSGermanProvider = { ARRAYSIZE(kEoB2MenuStringsMainDOSGerman), kEoB2MenuStringsMainDOSGerman };
+
+static const char *const kEoB2MenuStringsSaveLoadDOSGerman[8] = {
+ "Spiel laden",
+ "Spiel speichern",
+ "Charakter entl.",
+ "Beenden",
+ "Spieloptionen:",
+ "\r Gespeichert.",
+ "Speicherversuch\rfehlgeschlagen!",
+ "Ladeversuch\rfehlgeschlagen.\rEvtl. Disk-Error!"
+};
+
+static const StringListProvider kEoB2MenuStringsSaveLoadDOSGermanProvider = { ARRAYSIZE(kEoB2MenuStringsSaveLoadDOSGerman), kEoB2MenuStringsSaveLoadDOSGerman };
+
+static const char *const kEoB2MenuStringsOnOffDOSGerman[2] = {
+ "AN",
+ "AUS"
+};
+
+static const StringListProvider kEoB2MenuStringsOnOffDOSGermanProvider = { ARRAYSIZE(kEoB2MenuStringsOnOffDOSGerman), kEoB2MenuStringsOnOffDOSGerman };
+
+static const char *const kEoB2MenuStringsSpellsDOSGerman[17] = {
+ "\r\r W""\x84""hlt einen Charak-\r ter aus der Party,\r der Spr""\x81""che lernen\r soll.",
+ "\r Der Paladin ist\r eine Stufe zu nied-\r rig zum zaubern.",
+ "\r\r Der Magier hat\r kein Spruchbuch!",
+ "\r\r\r W""\x84""hlt einen Charak-\r ter aus der Party,\r der f""\x81""r Spr""\x81""che\r beten will.",
+ "\r Niemand in der\r Party ist in der\r Lage, f""\x81""r Spr""\x81""che\r zu beten.",
+ "\r Niemand in der\r Party ist in der\r Lage, sich Spr""\x81""che\r zu merken.",
+ " Jemand der bewu""\xE1""t-\r los oder tot ist\r kann keine Spr""\x81""che\r merken.",
+ " Jemand der bewu""\xE1""t-\r los oder tot ist\r kann nicht um\r Spr""\x81""che beten.",
+ "1",
+ "2",
+ "3",
+ "4",
+ "5",
+ "Neu",
+ "Verf""\x81""gbare Zauber:",
+ "Ja",
+ "Nein"
+};
+
+static const StringListProvider kEoB2MenuStringsSpellsDOSGermanProvider = { ARRAYSIZE(kEoB2MenuStringsSpellsDOSGerman), kEoB2MenuStringsSpellsDOSGerman };
+
+static const char *const kEoB2MenuStringsRestDOSGerman[5] = {
+ "\rWerden eure Heiler\rdie Party heilen?",
+ " Jemand ist noch\r verletzt. Weiter-\r rasten ?",
+ "Die Party rastet.",
+ "\r Alle Spieler\r sind voll\r ausgeruht.",
+ " Eure Party braucht\r Rast, um Spr""\x81""che\r zu erhalten."
+};
+
+static const StringListProvider kEoB2MenuStringsRestDOSGermanProvider = { ARRAYSIZE(kEoB2MenuStringsRestDOSGerman), kEoB2MenuStringsRestDOSGerman };
+
+static const char *const kEoB2MenuStringsDropDOSGerman[1] = {
+ " Weniger als vier\r Charaktere sind\r nicht erlaubt."
+};
+
+static const StringListProvider kEoB2MenuStringsDropDOSGermanProvider = { ARRAYSIZE(kEoB2MenuStringsDropDOSGerman), kEoB2MenuStringsDropDOSGerman };
+
+static const char *const kEoB2MenuStringsExitDOSGerman[1] = {
+ " Ganz bestimmt\r das Spiel\r abbrechen?"
+};
+
+static const StringListProvider kEoB2MenuStringsExitDOSGermanProvider = { ARRAYSIZE(kEoB2MenuStringsExitDOSGerman), kEoB2MenuStringsExitDOSGerman };
+
+static const char *const kEoB2MenuStringsStarveDOSGerman[1] = {
+ " Eure Party hungert.\r Wollt Ihr weiter\r rasten?"
+};
+
+static const StringListProvider kEoB2MenuStringsStarveDOSGermanProvider = { ARRAYSIZE(kEoB2MenuStringsStarveDOSGerman), kEoB2MenuStringsStarveDOSGerman };
+
+static const char *const kEoB2MenuStringsScribeDOSGerman[5] = {
+ "W""\x84""hlt die Rolle(n)\rzum notieren.",
+ "\r\r\r W""\x84""hlt den Magier\r aus der Party,\r der Spr""\x81""che\r notieren m""\x94""chte.",
+ " Ihr habt keine\r ""\x81""bertragbaren\r Schriftrollen.",
+ " Ihr habt keine\r Rolle, die dieser\r Magier braucht.",
+ "\r Ihr habt keinen\r Magier, der Rollen\r ""\x81""bertragen kann."
+};
+
+static const StringListProvider kEoB2MenuStringsScribeDOSGermanProvider = { ARRAYSIZE(kEoB2MenuStringsScribeDOSGerman), kEoB2MenuStringsScribeDOSGerman };
+
+static const char *const kEoB2MenuStringsDrop2DOSGerman[3] = {
+ " W""\x84""hlt den Charak-\r ter, den Ihr\r entfernen m""\x94""chtet.",
+ " Spielst""\x84""nde m""\x81""ssen\r einen Namen haben!",
+ " Ganz sicher den\r alten Spielstand\r ""\x81""berschreiben?"
+};
+
+static const StringListProvider kEoB2MenuStringsDrop2DOSGermanProvider = { ARRAYSIZE(kEoB2MenuStringsDrop2DOSGerman), kEoB2MenuStringsDrop2DOSGerman };
+
+static const char *const kEoB2MenuStringsHeadDOSGerman[3] = {
+ "Rast:",
+ "Voreinstellung:",
+ "Spieloptionen:"
+};
+
+static const StringListProvider kEoB2MenuStringsHeadDOSGermanProvider = { ARRAYSIZE(kEoB2MenuStringsHeadDOSGerman), kEoB2MenuStringsHeadDOSGerman };
+
+static const char *const kEoB2MenuStringsPoisonDOSGerman[1] = {
+ "Vergiftete Spieler\rk""\x94""nnten sterben!\rTrotzdem rasten?"
+};
+
+static const StringListProvider kEoB2MenuStringsPoisonDOSGermanProvider = { ARRAYSIZE(kEoB2MenuStringsPoisonDOSGerman), kEoB2MenuStringsPoisonDOSGerman };
+
+static const char *const kEoB2MenuStringsMgcDOSGerman[2] = {
+ "%-18s %1d",
+ "%d von %d verf""\x81""gbar. "
+};
+
+static const StringListProvider kEoB2MenuStringsMgcDOSGermanProvider = { ARRAYSIZE(kEoB2MenuStringsMgcDOSGerman), kEoB2MenuStringsMgcDOSGerman };
+
+static const char *const kEoB2MenuStringsPrefsDOSGerman[4] = {
+ "Musik ist %-3s",
+ "FX sind %-3s",
+ "Balkengrafik: %-3s",
+ "Maus ist %-3s"
+};
+
+static const StringListProvider kEoB2MenuStringsPrefsDOSGermanProvider = { ARRAYSIZE(kEoB2MenuStringsPrefsDOSGerman), kEoB2MenuStringsPrefsDOSGerman };
+
+static const char *const kEoB2MenuStringsRest2DOSGerman[5] = {
+ "%s erhielt %s.\r",
+ "%s merkt sich %s.\r",
+ "%s heilt %s.\r",
+ "Raststunden: %-4d ",
+ "\r%s\r"
+};
+
+static const StringListProvider kEoB2MenuStringsRest2DOSGermanProvider = { ARRAYSIZE(kEoB2MenuStringsRest2DOSGerman), kEoB2MenuStringsRest2DOSGerman };
+
+static const char *const kEoB2MenuStringsRest3DOSGerman[1] = {
+ "\x06\x06""Es ist zu gef""\x84""hrlich hier zu rasten."
+};
+
+static const StringListProvider kEoB2MenuStringsRest3DOSGermanProvider = { ARRAYSIZE(kEoB2MenuStringsRest3DOSGerman), kEoB2MenuStringsRest3DOSGerman };
+
+static const char *const kEoB2MenuStringsRest4DOSGerman[1] = {
+ "\x06\x06""In der N""\x84""he von Monstern k""\x94""nnt Ihr nicht rasten."
+};
+
+static const StringListProvider kEoB2MenuStringsRest4DOSGermanProvider = { ARRAYSIZE(kEoB2MenuStringsRest4DOSGerman), kEoB2MenuStringsRest4DOSGerman };
+
+static const char *const kEoB2MenuStringsDefeatDOSGerman[1] = {
+ "\rDie gesamte Party\rwurde besiegt!\rEinen alten Spiel-\rstand laden?"
+};
+
+static const StringListProvider kEoB2MenuStringsDefeatDOSGermanProvider = { ARRAYSIZE(kEoB2MenuStringsDefeatDOSGerman), kEoB2MenuStringsDefeatDOSGerman };
+
+static const char *const kEoB2MenuStringsTransferDOSGerman[5] = {
+ "Mindestens vier\rSpieler vor Spiel-\rbeginn transferieren!",
+ "Nur vier Spieler\rtransferieren!",
+ "Bestimmte Habselig-\rkeiten werden\rgel""\x94""scht.",
+ " \r Kein Magier in\r der Party.",
+ " \r Kein Kleriker\r oder Paladin\r in der Party."
+};
+
+static const StringListProvider kEoB2MenuStringsTransferDOSGermanProvider = { ARRAYSIZE(kEoB2MenuStringsTransferDOSGerman), kEoB2MenuStringsTransferDOSGerman };
+
+static const char *const kEoB2MenuStringsSpecDOSGerman[2] = {
+ "Beim Aufwachen bem-\rerkt Ihr die Ab-\rwesenheit von Insal!",
+ "Eine kurzer Blick\rzeigt, das Ausr""\x81""st-\rung gestohlen wurde!"
+};
+
+static const StringListProvider kEoB2MenuStringsSpecDOSGermanProvider = { ARRAYSIZE(kEoB2MenuStringsSpecDOSGerman), kEoB2MenuStringsSpecDOSGerman };
+
+static const char *const kEoB2MenuYesNoStringsDOSGerman[2] = {
+ "Ja",
+ "Nein"
+};
+
+static const StringListProvider kEoB2MenuYesNoStringsDOSGermanProvider = { ARRAYSIZE(kEoB2MenuYesNoStringsDOSGerman), kEoB2MenuYesNoStringsDOSGerman };
+
+static const char *const kEoB2CharGuiStringsHpDOSGerman[2] = {
+ "TP",
+ "%3d / %-3d"
+};
+
+static const StringListProvider kEoB2CharGuiStringsHpDOSGermanProvider = { ARRAYSIZE(kEoB2CharGuiStringsHpDOSGerman), kEoB2CharGuiStringsHpDOSGerman };
+
+static const char *const kEoB2CharGuiStringsWp2DOSGerman[3] = {
+ "WUSCH",
+ "HACK",
+ "FATZ"
+};
+
+static const StringListProvider kEoB2CharGuiStringsWp2DOSGermanProvider = { ARRAYSIZE(kEoB2CharGuiStringsWp2DOSGerman), kEoB2CharGuiStringsWp2DOSGerman };
+
+static const char *const kEoB2CharGuiStringsWrDOSGerman[4] = {
+ "ZU",
+ "WEIT",
+ "OHNE",
+ "MUN"
+};
+
+static const StringListProvider kEoB2CharGuiStringsWrDOSGermanProvider = { ARRAYSIZE(kEoB2CharGuiStringsWrDOSGerman), kEoB2CharGuiStringsWrDOSGerman };
+
+static const char *const kEoB2CharGuiStringsSt2DOSGerman[7] = {
+ "TAUSCHE",
+ "TOT",
+ "BEWUSSTLOS",
+ "GIFT (LANGSAM)",
+ "VERGIFTET",
+ "BET""\x8E""UBT",
+ "AUS STEIN"
+};
+
+static const StringListProvider kEoB2CharGuiStringsSt2DOSGermanProvider = { ARRAYSIZE(kEoB2CharGuiStringsSt2DOSGerman), kEoB2CharGuiStringsSt2DOSGerman };
+
+static const char *const kEoB2CharGuiStringsInDOSGerman[4] = {
+ "CHARAKTER INFO",
+ "R""\x9A""STUNGSKL.",
+ "ERF",
+ "STF"
+};
+
+static const StringListProvider kEoB2CharGuiStringsInDOSGermanProvider = { ARRAYSIZE(kEoB2CharGuiStringsInDOSGerman), kEoB2CharGuiStringsInDOSGerman };
+
+static const char *const kEoB2CharStatusStrings7DOSGerman[1] = {
+ "%s hat nicht l""\x84""nger riesenkr""\x84""fte.\r"
+};
+
+static const StringListProvider kEoB2CharStatusStrings7DOSGermanProvider = { ARRAYSIZE(kEoB2CharStatusStrings7DOSGerman), kEoB2CharStatusStrings7DOSGerman };
+
+static const char *const kEoB2CharStatusStrings82DOSGerman[1] = {
+ "\x06\x06""%s f""\x81""hlt Gift in sich!\r"
+};
+
+static const StringListProvider kEoB2CharStatusStrings82DOSGermanProvider = { ARRAYSIZE(kEoB2CharStatusStrings82DOSGerman), kEoB2CharStatusStrings82DOSGerman };
+
+static const char *const kEoB2CharStatusStrings9DOSGerman[1] = {
+ "%s ist nicht l""\x84""nger bet""\x84""ubt!\r"
+};
+
+static const StringListProvider kEoB2CharStatusStrings9DOSGermanProvider = { ARRAYSIZE(kEoB2CharStatusStrings9DOSGerman), kEoB2CharStatusStrings9DOSGerman };
+
+static const char *const kEoB2CharStatusStrings12DOSGerman[1] = {
+ "%s wird langsamer.\r"
+};
+
+static const StringListProvider kEoB2CharStatusStrings12DOSGermanProvider = { ARRAYSIZE(kEoB2CharStatusStrings12DOSGerman), kEoB2CharStatusStrings12DOSGerman };
+
+static const char *const kEoB2CharStatusStrings132DOSGerman[1] = {
+ "\x06\x06""%s %s!\r"
+};
+
+static const StringListProvider kEoB2CharStatusStrings132DOSGermanProvider = { ARRAYSIZE(kEoB2CharStatusStrings132DOSGerman), kEoB2CharStatusStrings132DOSGerman };
+
+static const char *const kEoB2LevelGainStringsDOSGerman[1] = {
+ "\x06\x01""%s steigt eine Stufe auf.""\x06\x0F""\r"
+};
+
+static const StringListProvider kEoB2LevelGainStringsDOSGermanProvider = { ARRAYSIZE(kEoB2LevelGainStringsDOSGerman), kEoB2LevelGainStringsDOSGerman };
+
+static const char *const kEoB2BookNumbersDOSGerman[5] = {
+ "Erste",
+ "Zweite",
+ "Dritte",
+ "Vierte",
+ "F""\x81""nfte"
+};
+
+static const StringListProvider kEoB2BookNumbersDOSGermanProvider = { ARRAYSIZE(kEoB2BookNumbersDOSGerman), kEoB2BookNumbersDOSGerman };
+
+static const char *const kEoB2MageSpellsListDOSGerman[33] = {
+ "",
+ "Panzer",
+ "Brennende H""\x84""nde",
+ "Magie entdecken",
+ "Magisch. Geschoss",
+ "Schild",
+ "Schockgriff",
+ "Verschwimmen",
+ "Unsichtb. entd.",
+ "Identifizieren+",
+ "Unsichtbarkeit",
+ "M's S""\x84""urepfeil",
+ "Magie bannen",
+ "Feuerball",
+ "Hast",
+ "Person halten",
+ "Unsichtb. 3m",
+ "Blitzstrahl",
+ "Vampirgriff",
+ "Furcht",
+ "Eissturm",
+ "Unsichtbarkeit+",
+ "Fluch brechen",
+ "K""\x84""ltekegel",
+ "Monster halten",
+ "Kraftfeld",
+ "Aufl""\x94""sung",
+ "Fleisch zu Stein",
+ "Stein zu Fleisch",
+ "Wahrer Blick",
+ "Todesfinger",
+ "Wort:Bet""\x84""ubung",
+ "Bigbys Faust"
+};
+
+static const StringListProvider kEoB2MageSpellsListDOSGermanProvider = { ARRAYSIZE(kEoB2MageSpellsListDOSGerman), kEoB2MageSpellsListDOSGerman };
+
+static const char *const kEoB2ClericSpellsListDOSGerman[30] = {
+ "",
+ "Segen",
+ "Leicht verwunden",
+ "L. Wunden heilen",
+ "Magie entdecken",
+ "Schutz v. B""\x94""sem",
+ "St""\x84""rkung",
+ "Flammenklinge",
+ "Person halten",
+ "Gift verlangs.",
+ "Nahr. erschaffen",
+ "Magie bannen",
+ "Schutzgewand",
+ "Gebet",
+ "L""\x84""hmung aufheben",
+ "Schwer verwunden",
+ "S. Wunden heilen",
+ "Gift neutr.",
+ "Schutz-B""\x94""ses 3m",
+ "Kritisch verw.",
+ "K. Wunden heilen",
+ "Flammenschlag",
+ "Tote erwecken",
+ "Schneller Tod",
+ "Wahrer Blick",
+ "Leid",
+ "Heilung",
+ "Auferstehung",
+ "Handauflegen",
+ "Untote abwenden"
+};
+
+static const StringListProvider kEoB2ClericSpellsListDOSGermanProvider = { ARRAYSIZE(kEoB2ClericSpellsListDOSGerman), kEoB2ClericSpellsListDOSGerman };
+
+static const char *const kEoB2SpellNamesDOSGerman[68] = {
+ "panzer",
+ "brennende H""\x84""nde",
+ "magie entdecken",
+ "magisches Geschoss",
+ "schild",
+ "schockgriff",
+ "verschwimmen",
+ "unsichtbares entdecken",
+ "verbessertes identifizieren",
+ "unsichtbarkeit",
+ "melfs S""\x84""urepfeil",
+ "magie bannen",
+ "feuerball",
+ "hast",
+ "person halten",
+ "unsichtbarkeit 3m",
+ "blitzschlag",
+ "vampirgriff",
+ "furcht",
+ "eissturm",
+ "verbesserte Unsichtbarkeit",
+ "fluch brechen",
+ "k""\x84""ltekegel",
+ "monster halten",
+ "kraftfeld",
+ "aufl""\x94""sung",
+ "fleisch zu stein",
+ "stein zu fleisch",
+ "wahrer Blick",
+ "Todesfinger",
+ "wort der Macht: Bet""\x84""ubung",
+ "bigbys geballte Faust",
+ "segen",
+ "leichte Wunden verursachen",
+ "leichte Wunden heilen",
+ "magie entdecken",
+ "schutz vor B""\x94""sem",
+ "st""\x84""rkung",
+ "flammenklinge",
+ "person halten",
+ "gift verlangsamen",
+ "nahrung erschaffen",
+ "magie bannen",
+ "schutzgewand",
+ "gebet",
+ "l""\x84""hmung aufheben",
+ "schwere wunden verursachen",
+ "schwere wunden heilen",
+ "gift neutralisieren",
+ "schutz vor b""\x94""sem 3m",
+ "kritische wunden verursachen",
+ "kritische wunden heilen",
+ "flammenschlag",
+ "tote erwecken",
+ "schneller tot",
+ "wahrer blick",
+ "leid",
+ "heilung",
+ "auferstehung",
+ "hand auflegen",
+ "untote abwenden",
+ "",
+ "mystische abwehr",
+ "",
+ "",
+ "",
+ "",
+ ""
+};
+
+static const StringListProvider kEoB2SpellNamesDOSGermanProvider = { ARRAYSIZE(kEoB2SpellNamesDOSGerman), kEoB2SpellNamesDOSGerman };
+
+static const char *const kEoB2MagicStrings1DOSGerman[6] = {
+ "ABBRECHEN",
+ "ABBRECHEN",
+ "Man braucht eine freie hand f""\x81""r diesen zauber.\r",
+ "Von diesen Zaubern kann man nur einen aktivieren.\r",
+ "%s zaubert %s.\r",
+ "\rok\r"
+};
+
+static const StringListProvider kEoB2MagicStrings1DOSGermanProvider = { ARRAYSIZE(kEoB2MagicStrings1DOSGerman), kEoB2MagicStrings1DOSGerman };
+
+static const char *const kEoB2MagicStrings2DOSGerman[5] = {
+ "Der Zauber versagt!\r",
+ "%s wurde aufgel""\x94""st!\r",
+ "\x06\x06""Die Party wurde von einem Todeszauber getroffen!\r",
+ "\x06\x06""%s wurde von einem schwer verwunden Zauber getroffen.\r",
+ "AUS STEIN"
+};
+
+static const StringListProvider kEoB2MagicStrings2DOSGermanProvider = { ARRAYSIZE(kEoB2MagicStrings2DOSGerman), kEoB2MagicStrings2DOSGerman };
+
+static const char *const kEoB2MagicStrings3DOSGerman[5] = {
+ "Wen verzaubern? ",
+ "\rSpruch abgebrochen.\r",
+ "%s's %s Zauber l""\x84""sst nach.\r",
+ "%s verfehlt das Monster.\r",
+ "%s muss vorn stehen um zu treffen!\r"
+};
+
+static const StringListProvider kEoB2MagicStrings3DOSGermanProvider = { ARRAYSIZE(kEoB2MagicStrings3DOSGerman), kEoB2MagicStrings3DOSGerman };
+
+static const char *const kEoB2MagicStrings4DOSGerman[1] = {
+ "keine Wirkung.\r"
+};
+
+static const StringListProvider kEoB2MagicStrings4DOSGermanProvider = { ARRAYSIZE(kEoB2MagicStrings4DOSGerman), kEoB2MagicStrings4DOSGerman };
+
+static const char *const kEoB2MagicStrings6DOSGerman[1] = {
+ "%s hat schon eine R""\x81""stunksklasse ""\x81""ber 6."
+};
+
+static const StringListProvider kEoB2MagicStrings6DOSGermanProvider = { ARRAYSIZE(kEoB2MagicStrings6DOSGerman), kEoB2MagicStrings6DOSGerman };
+
+static const char *const kEoB2MagicStrings7DOSGerman[2] = {
+ "%s steht schon unter dem effekt eines %s spruches.\r",
+ "Die Party steht schon unter dem effekt eines %s spruches.\r"
+};
+
+static const StringListProvider kEoB2MagicStrings7DOSGermanProvider = { ARRAYSIZE(kEoB2MagicStrings7DOSGerman), kEoB2MagicStrings7DOSGerman };
+
+static const char *const kEoB2MagicStrings8DOSGerman[6] = {
+ "Der Zauber versagt!\r",
+ "ist gel""\x84""hmt",
+ "Der Zauber versagt!\r",
+ "Der Zauber versagt\r",
+ "Kein Monster in Reichweite!\r",
+ "%s steht bereits unter einem St""\x84""rkungszauber.\r"
+};
+
+static const StringListProvider kEoB2MagicStrings8DOSGermanProvider = { ARRAYSIZE(kEoB2MagicStrings8DOSGerman), kEoB2MagicStrings8DOSGerman };
+
+static const byte kEoB2ManDefDOSGerman[200] = {
+ 0x09, 0x01, 0x03, 0x00, 0x09, 0x01, 0x06, 0x00,
+ 0x09, 0x02, 0x07, 0x00, 0x14, 0x01, 0x01, 0x00,
+ 0x14, 0x02, 0x01, 0x00, 0x14, 0x04, 0x02, 0x00,
+ 0x1A, 0x01, 0x03, 0x00, 0x1A, 0x02, 0x02, 0x00,
+ 0x1A, 0x07, 0x04, 0x00, 0x15, 0x01, 0x02, 0x00,
+ 0x15, 0x01, 0x05, 0x00, 0x15, 0x02, 0x01, 0x00,
+ 0x15, 0x03, 0x04, 0x00, 0x15, 0x04, 0x01, 0x00,
+ 0x15, 0x05, 0x05, 0x00, 0x23, 0x01, 0x02, 0x00,
+ 0x23, 0x01, 0x05, 0x00, 0x23, 0x02, 0x03, 0x00,
+ 0x23, 0x03, 0x01, 0x00, 0x23, 0x06, 0x03, 0x00,
+ 0x23, 0x0A, 0x06, 0x00, 0x26, 0x01, 0x01, 0x00,
+ 0x26, 0x01, 0x03, 0x00, 0x26, 0x01, 0x05, 0x00,
+ 0x26, 0x02, 0x04, 0x00, 0x26, 0x03, 0x02, 0x00,
+ 0x26, 0x04, 0x01, 0x00, 0x17, 0x01, 0x02, 0x00,
+ 0x17, 0x01, 0x04, 0x00, 0x17, 0x01, 0x05, 0x00,
+ 0x17, 0x02, 0x02, 0x00, 0x17, 0x03, 0x03, 0x00,
+ 0x17, 0x07, 0x01, 0x00, 0x12, 0x01, 0x02, 0x00,
+ 0x12, 0x01, 0x07, 0x00, 0x12, 0x03, 0x01, 0x00,
+ 0x12, 0x04, 0x02, 0x00, 0x12, 0x05, 0x02, 0x00,
+ 0x12, 0x06, 0x05, 0x00, 0x12, 0x07, 0x03, 0x00,
+ 0x12, 0x08, 0x01, 0x00, 0x1F, 0x01, 0x05, 0x00,
+ 0x1F, 0x02, 0x06, 0x00, 0x1F, 0x03, 0x02, 0x00,
+ 0x1F, 0x03, 0x01, 0x00, 0x1F, 0x04, 0x01, 0x00,
+ 0x1F, 0x04, 0x03, 0x00, 0x1C, 0x01, 0x01, 0x00,
+ 0x1C, 0x01, 0x03, 0x00, 0x1C, 0x02, 0x01, 0x00
+};
+
+static const ByteProvider kEoB2ManDefDOSGermanProvider = { ARRAYSIZE(kEoB2ManDefDOSGerman), kEoB2ManDefDOSGerman };
+
+static const char *const kEoB2ManWordDOSGerman[51] = {
+ "teil",
+ "geht",
+ "maus",
+ "um",
+ "einer",
+ "kann",
+ "das",
+ "schalter",
+ "der",
+ "einem",
+ "gnome",
+ "magieresistent",
+ "intelligenz",
+ "weisheit",
+ "dieb",
+ "weiter",
+ "setzen",
+ "ein",
+ "magier",
+ "diese",
+ "sind",
+ "eines",
+ "wodurch",
+ "schwerer",
+ "gute",
+ "bonus",
+ "bogen",
+ "und",
+ "dadurch",
+ "oft",
+ "raubt",
+ "keine",
+ "schrift",
+ "waffen",
+ "unterteilt",
+ "vordersten",
+ "nur",
+ "sie",
+ "klassen",
+ "zeigt",
+ "gegen",
+ "mausknopf",
+ "nahrungsbalken",
+ "charakters",
+ "des",
+ "um",
+ "gegenstand",
+ "durch",
+ "spruch",
+ "unsichtbar",
+ ""
+};
+
+static const StringListProvider kEoB2ManWordDOSGermanProvider = { ARRAYSIZE(kEoB2ManWordDOSGerman), kEoB2ManWordDOSGerman };
+
+static const char *const kEoB2ManPromptDOSGerman[1] = {
+ "\r\r\r\rAuf der Seite mit diesem Zeichen...\r\rSuche Zeile %d (ohne ""\x9A""berschrift)\rGib Wort %d ein\r"
+};
+
+static const StringListProvider kEoB2ManPromptDOSGermanProvider = { ARRAYSIZE(kEoB2ManPromptDOSGerman), kEoB2ManPromptDOSGerman };
+
+static const char *const kEoB2MainMenuStringsDOSGerman[5] = {
+ "ALTES SPIEL LADEN\r",
+ "NEUE PARTY ERSTELLEN\r",
+ "EOB I PARTY TRANSFER\r",
+ "INTRO ANSEHEN\r",
+ "ZUR""\x9A""CK ZUM DOS\r"
+};
+
+static const StringListProvider kEoB2MainMenuStringsDOSGermanProvider = { ARRAYSIZE(kEoB2MainMenuStringsDOSGerman), kEoB2MainMenuStringsDOSGerman };
+
+static const char *const kEoB2TransferStrings1DOSGerman[2] = {
+ "Stufe: %d",
+ " / %d"
+};
+
+static const StringListProvider kEoB2TransferStrings1DOSGermanProvider = { ARRAYSIZE(kEoB2TransferStrings1DOSGerman), kEoB2TransferStrings1DOSGerman };
+
+static const char *const kEoB2TransferStrings2DOSGerman[2] = {
+ "Dieses Abenteuer ist nur f""\x81""r vier Charaktere.",
+ "OK w""\x84""hlen, wenn Partyerstellung beendet."
+};
+
+static const StringListProvider kEoB2TransferStrings2DOSGermanProvider = { ARRAYSIZE(kEoB2TransferStrings2DOSGerman), kEoB2TransferStrings2DOSGerman };
+
+static const char *const kEoB2TransferLabelsDOSGerman[2] = {
+ "ABBR.",
+ "OK"
+};
+
+static const StringListProvider kEoB2TransferLabelsDOSGermanProvider = { ARRAYSIZE(kEoB2TransferLabelsDOSGerman), kEoB2TransferLabelsDOSGerman };
+
+static const char *const kEoB2IntroStringsDOSGerman[20] = {
+ "Ihr hattet euch gerade gem""\x81""tlich am \rKamin niedergelassen.",
+ "Da wurde euch eine Botschaft\rzugespielt.",
+ "Sie war von eurem Freund Khelben \rBlackstaff, dem Erzmagier der Stadt.",
+ "Die Mitteilung war dringend.",
+ "Was konnte Khelben nur wollen?",
+ "Willkommen, bitte tretet ein.",
+ "Khelben erwartet euch im Studierzimmer.",
+ "Danke f""\x81""r euer schnelles Kommen.",
+ "Meine Freunde, ich bin besorgt.",
+ "Uralte, b""\x94""se M""\x84""chte rumoren im \rTempel Darkmoon.",
+ "Ich f""\x81""rchte um die Sicherheit \runserer Stadt.",
+ "Ich brauche eure Hilfe...",
+ "Vor drei N""\x84""chten \rentsandte ich einen Kundschafter.",
+ "Sie kam niemals zur""\x81""ck.",
+ "Ich f""\x81""rchte um ihr Leben.",
+ "Nehmt diese M""\x81""nze.",
+ "Mit ihrer Hilfe werde \rich euch erreichen.",
+ "Ihr m""\x81\xE1""t schnell handeln.",
+ "Ich teleportiere euch nun in \rdie N""\x84""he von Darkmoon.",
+ "M""\x94""ge das Gl""\x81""ck auf eurer Seite\rsein, Freunde."
+};
+
+static const StringListProvider kEoB2IntroStringsDOSGermanProvider = { ARRAYSIZE(kEoB2IntroStringsDOSGerman), kEoB2IntroStringsDOSGerman };
+
+static const char *const kEoB2IntroCPSFilesDOSGerman[13] = {
+ "STREET1.CPS",
+ "STREET2.CPS",
+ "DOORWAY1.CPS",
+ "DOORWAY2.CPS",
+ "XESTWOOD.CPS",
+ "WINDING.CPS",
+ "KHELBAN2.CPS",
+ "KHELBAN1.CPS",
+ "KHELBAN3.CPS",
+ "KHELBAN4.CPS",
+ "COIN.CPS",
+ "KHELBAN5.CPS",
+ "KHELBAN6.CPS"
+};
+
+static const StringListProvider kEoB2IntroCPSFilesDOSGermanProvider = { ARRAYSIZE(kEoB2IntroCPSFilesDOSGerman), kEoB2IntroCPSFilesDOSGerman };
+
+static const char *const kEoB2FinaleStringsDOSGerman[20] = {
+ "Nun endlich wurde Dran besiegt.",
+ "Pl""\x94""tzlich erscheint euer Freund \rKhelben.",
+ "Seid gegr""\x81\xE1""t, meine siegreichen \rFreunde.",
+ "Ihr seid die Bezwinger von Dran!",
+ "Ich hatte keine Ahnung, da""\xE1"" \rDran ein Drache war.",
+ "Er mu""\xE1"" ""\x81""ber 300 Jahre alt \rgewesen sein!",
+ "Seine Macht ist vergangen.",
+ "Aber noch immer ist Darkmoon\reine Quelle des B""\x94""sen.",
+ "Und ein Teil seines Gefolges\rexistiert noch.",
+ "Daher m""\x81""ssen wir diesen Platz\rnun verlassen.",
+ "So da""\xE1"" meine Kr""\x84""fte ihn ein\r f""\x81""r allemal\rzerst""\x94""ren k""\x94""nnen.",
+ "Folgt mir.",
+ "M""\x84""chtige Magier sind bereit\rf""\x81""r den letzten Schlag\rgegen Darkmoon.",
+ "Das B""\x94""se im Tempel ist sehr stark.",
+ "Es darf keinesfalls weiter\rbestehen!",
+ "Der Tempel h""\x94""rt auf zu\rexistieren.",
+ "Unsere Arbeit ist nun getan,\rmeine Freunde.",
+ "Seid bedankt.",
+ "Ihr habt Euch meinen tiefen\rRespekt erk""\x84""mpft.",
+ "Wir werden Euch nie vergessen."
+};
+
+static const StringListProvider kEoB2FinaleStringsDOSGermanProvider = { ARRAYSIZE(kEoB2FinaleStringsDOSGerman), kEoB2FinaleStringsDOSGerman };
+
+static const byte kEoB2CreditsDataDOSGerman[2833] = {
+ 0x02, 0x05, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D,
+ 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D,
+ 0x0D, 0x02, 0x10, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D,
+ 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D,
+ 0x02, 0x03, 0x0D, 0x02, 0x04, 0x0D, 0x0D, 0x0D,
+ 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x02,
+ 0x06, 0x0D, 0x0D, 0x0D, 0x02, 0x01, 0x0D, 0x0D,
+ 0x0D, 0x0D, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x44, 0x69, 0x72, 0x65,
+ 0x6B, 0x74, 0x6F, 0x72, 0x3A, 0x20, 0x42, 0x72,
+ 0x65, 0x74, 0x74, 0x20, 0x57, 0x2E, 0x20, 0x53,
+ 0x70, 0x65, 0x72, 0x72, 0x79, 0x20, 0x20, 0x20,
+ 0x0D, 0x0D, 0x0D, 0x0D, 0x20, 0x20, 0x20, 0x4F,
+ 0x72, 0x69, 0x67, 0x69, 0x6E, 0x61, 0x6C, 0x6B,
+ 0x6F, 0x6E, 0x7A, 0x65, 0x70, 0x74, 0x3A, 0x20,
+ 0x50, 0x68, 0x69, 0x6C, 0x69, 0x70, 0x20, 0x57,
+ 0x2E, 0x20, 0x47, 0x6F, 0x72, 0x72, 0x6F, 0x77,
+ 0x20, 0x20, 0x0D, 0x0D, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x42, 0x72, 0x65, 0x74, 0x74, 0x20, 0x57, 0x2E,
+ 0x20, 0x53, 0x70, 0x65, 0x72, 0x72, 0x79, 0x20,
+ 0x20, 0x20, 0x0D, 0x0D, 0x0D, 0x0D, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x53, 0x70, 0x69,
+ 0x65, 0x6C, 0x64, 0x65, 0x73, 0x69, 0x67, 0x6E,
+ 0x3A, 0x20, 0x42, 0x72, 0x65, 0x74, 0x74, 0x20,
+ 0x57, 0x2E, 0x20, 0x53, 0x70, 0x65, 0x72, 0x72,
+ 0x79, 0x20, 0x20, 0x20, 0x0D, 0x0D, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x50, 0x61, 0x75, 0x6C, 0x20, 0x53,
+ 0x2E, 0x20, 0x4D, 0x75, 0x64, 0x72, 0x61, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x0D, 0x0D, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x42, 0x69, 0x6C, 0x6C, 0x20, 0x53,
+ 0x74, 0x6F, 0x6B, 0x65, 0x73, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x0D, 0x0D, 0x0D, 0x0D,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x50, 0x72, 0x6F,
+ 0x67, 0x72, 0x61, 0x6D, 0x6D, 0x69, 0x65, 0x72,
+ 0x65, 0x72, 0x3A, 0x20, 0x50, 0x68, 0x69, 0x6C,
+ 0x69, 0x70, 0x20, 0x57, 0x2E, 0x20, 0x47, 0x6F,
+ 0x72, 0x72, 0x6F, 0x77, 0x20, 0x20, 0x0D, 0x0D,
+ 0x0D, 0x0D, 0x20, 0x20, 0x20, 0x20, 0x4C, 0x65,
+ 0x76, 0x65, 0x6C, 0x70, 0x72, 0x6F, 0x67, 0x72,
+ 0x61, 0x6D, 0x6D, 0x65, 0x3A, 0x20, 0x42, 0x69,
+ 0x6C, 0x6C, 0x20, 0x53, 0x74, 0x6F, 0x6B, 0x65,
+ 0x73, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x0D, 0x0D, 0x0D, 0x0D, 0x20, 0x20, 0x09, 0x20,
+ 0x41, 0x6D, 0x69, 0x67, 0x61, 0x20, 0x50, 0x72,
+ 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x6D, 0x3A, 0x20,
+ 0x42, 0x69, 0x6C, 0x6C, 0x20, 0x53, 0x74, 0x6F,
+ 0x6B, 0x65, 0x73, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x0D, 0x0D, 0x0D, 0x0D, 0x49, 0x6E,
+ 0x74, 0x72, 0x6F, 0x20, 0x26, 0x20, 0x46, 0x69,
+ 0x6E, 0x61, 0x6C, 0x65, 0x20, 0x76, 0x6F, 0x6E,
+ 0x3A, 0x20, 0x4A, 0x6F, 0x65, 0x20, 0x42, 0x6F,
+ 0x73, 0x74, 0x69, 0x63, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x0D, 0x0D, 0x0D, 0x0D,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x41, 0x72,
+ 0x74, 0x20, 0x26, 0x20, 0x47, 0x72, 0x61, 0x66,
+ 0x69, 0x6B, 0x3A, 0x20, 0x52, 0x69, 0x63, 0x6B,
+ 0x20, 0x50, 0x61, 0x72, 0x6B, 0x73, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0D, 0x0D,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x41, 0x61, 0x72, 0x6F,
+ 0x6E, 0x20, 0x50, 0x6F, 0x77, 0x65, 0x6C, 0x6C,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0D, 0x0D,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x4A, 0x6F, 0x73, 0x65,
+ 0x70, 0x68, 0x20, 0x48, 0x65, 0x77, 0x69, 0x74,
+ 0x74, 0x20, 0x49, 0x56, 0x20, 0x20, 0x0D, 0x0D,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x52, 0x65, 0x6E, 0x20,
+ 0x4F, 0x6C, 0x73, 0x65, 0x6E, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0D, 0x0D,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x4C, 0x6F, 0x75, 0x69,
+ 0x73, 0x65, 0x20, 0x53, 0x61, 0x6E, 0x64, 0x6F,
+ 0x76, 0x61, 0x6C, 0x20, 0x20, 0x20, 0x0D, 0x0D,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x4A, 0x75, 0x64, 0x69,
+ 0x74, 0x68, 0x20, 0x50, 0x65, 0x74, 0x65, 0x72,
+ 0x73, 0x6F, 0x6E, 0x20, 0x20, 0x20, 0x0D, 0x0D,
+ 0x0D, 0x0D, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x4D,
+ 0x75, 0x73, 0x69, 0x6B, 0x3A, 0x20, 0x46, 0x72,
+ 0x61, 0x6E, 0x6B, 0x20, 0x4B, 0x6C, 0x65, 0x70,
+ 0x61, 0x63, 0x6B, 0x69, 0x20, 0x20, 0x20, 0x20,
+ 0x0D, 0x0D, 0x0D, 0x0D, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x53, 0x6F, 0x75, 0x6E, 0x64, 0x65,
+ 0x66, 0x66, 0x65, 0x6B, 0x74, 0x65, 0x3A, 0x20,
+ 0x50, 0x61, 0x75, 0x6C, 0x20, 0x53, 0x2E, 0x20,
+ 0x4D, 0x75, 0x64, 0x72, 0x61, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x0D, 0x0D, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x44, 0x77, 0x69, 0x67, 0x68, 0x74, 0x20, 0x4F,
+ 0x6B, 0x61, 0x68, 0x61, 0x72, 0x61, 0x20, 0x20,
+ 0x20, 0x20, 0x0D, 0x0D, 0x0D, 0x0D, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x41, 0x75, 0x74, 0x6F, 0x72,
+ 0x3A, 0x20, 0x4D, 0x61, 0x72, 0x63, 0x20, 0x43,
+ 0x72, 0x61, 0x6D, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x0D, 0x0D, 0x0D, 0x0D,
+ 0x20, 0x20, 0x51, 0x75, 0x61, 0x6C, 0x69, 0x74,
+ 0x84, 0x74, 0x73, 0x70, 0x72, 0x81, 0x66, 0x75,
+ 0x6E, 0x67, 0x3A, 0x20, 0x47, 0x6C, 0x65, 0x6E,
+ 0x6E, 0x20, 0x53, 0x70, 0x65, 0x72, 0x72, 0x79,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0D, 0x0D,
+ 0x0D, 0x0D, 0x0D, 0x0D, 0x53, 0x70, 0x65, 0x63,
+ 0x69, 0x61, 0x6C, 0x20, 0x54, 0x68, 0x61, 0x6E,
+ 0x6B, 0x73, 0x0D, 0x0D, 0x0D, 0x43, 0x68, 0x75,
+ 0x63, 0x6B, 0x20, 0x4B, 0x72, 0x6F, 0x65, 0x67,
+ 0x65, 0x6C, 0x0D, 0x0D, 0x58, 0x61, 0x6E, 0x61,
+ 0x74, 0x68, 0x61, 0x72, 0x20, 0x74, 0x68, 0x65,
+ 0x20, 0x42, 0x65, 0x68, 0x6F, 0x6C, 0x64, 0x65,
+ 0x72, 0x0D, 0x0D, 0x75, 0x6E, 0x64, 0x0D, 0x0D,
+ 0x4D, 0x69, 0x6B, 0x65, 0x27, 0x73, 0x20, 0x63,
+ 0x61, 0x74, 0x2C, 0x20, 0x53, 0x70, 0x61, 0x72,
+ 0x6B, 0x79, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D,
+ 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D,
+ 0x0D, 0x0D, 0x50, 0x75, 0x62, 0x6C, 0x69, 0x73,
+ 0x68, 0x65, 0x64, 0x20, 0x62, 0x79, 0x0D, 0x0D,
+ 0x02, 0x02, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D,
+ 0x0D, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x50, 0x72, 0x6F, 0x64, 0x75,
+ 0x63, 0x65, 0x72, 0x3A, 0x20, 0x44, 0x61, 0x6E,
+ 0x20, 0x43, 0x65, 0x72, 0x6D, 0x61, 0x6B, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0D,
+ 0x0D, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x47, 0x65, 0x6F,
+ 0x72, 0x67, 0x65, 0x20, 0x4D, 0x61, 0x63, 0x44,
+ 0x6F, 0x6E, 0x61, 0x6C, 0x64, 0x20, 0x20, 0x0D,
+ 0x0D, 0x0D, 0x0D, 0x20, 0x20, 0x53, 0x70, 0x69,
+ 0x65, 0x6C, 0x65, 0x6E, 0x74, 0x77, 0x69, 0x63,
+ 0x6B, 0x6C, 0x75, 0x6E, 0x67, 0x3A, 0x20, 0x4E,
+ 0x69, 0x63, 0x68, 0x6F, 0x6C, 0x61, 0x73, 0x20,
+ 0x42, 0x65, 0x6C, 0x69, 0x61, 0x65, 0x66, 0x66,
+ 0x20, 0x0D, 0x0D, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x44,
+ 0x61, 0x76, 0x69, 0x64, 0x20, 0x41, 0x2E, 0x20,
+ 0x4C, 0x75, 0x63, 0x63, 0x61, 0x20, 0x20, 0x20,
+ 0x20, 0x0D, 0x0D, 0x0D, 0x0D, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x53, 0x70, 0x69, 0x65, 0x6C,
+ 0x65, 0x74, 0x65, 0x73, 0x74, 0x65, 0x72, 0x3A,
+ 0x20, 0x50, 0x68, 0x69, 0x6C, 0x20, 0x41, 0x6C,
+ 0x6E, 0x65, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x0D, 0x0D, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x4A, 0x6F, 0x68, 0x6E, 0x20, 0x42, 0x6F,
+ 0x6F, 0x63, 0x6B, 0x68, 0x6F, 0x6C, 0x64, 0x74,
+ 0x20, 0x20, 0x20, 0x0D, 0x0D, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x47, 0x6C, 0x65, 0x6E, 0x20, 0x43, 0x75,
+ 0x72, 0x65, 0x74, 0x6F, 0x6E, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x0D, 0x0D, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x4D, 0x61, 0x72, 0x6B, 0x20, 0x48, 0x61,
+ 0x6C, 0x6C, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x0D, 0x0D, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x42, 0x72, 0x69, 0x61, 0x6E, 0x20, 0x4C,
+ 0x6F, 0x77, 0x65, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x0D, 0x0D, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x52, 0x6F, 0x62, 0x65, 0x72, 0x74, 0x20,
+ 0x4C, 0x75, 0x70, 0x6F, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x0D, 0x0D, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x41, 0x6C, 0x61, 0x6E, 0x20, 0x4D, 0x61,
+ 0x72, 0x65, 0x6E, 0x63, 0x6F, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x0D, 0x0D, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x4A, 0x61, 0x73, 0x6F, 0x6E, 0x20, 0x52,
+ 0x61, 0x79, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x0D, 0x0D, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x4A, 0x65, 0x66, 0x66, 0x20, 0x53, 0x68,
+ 0x6F, 0x74, 0x77, 0x65, 0x6C, 0x6C, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x0D, 0x0D, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x41, 0x6E, 0x64, 0x72, 0x65, 0x20, 0x56,
+ 0x72, 0x69, 0x67, 0x6E, 0x61, 0x75, 0x64, 0x20,
+ 0x20, 0x20, 0x20, 0x0D, 0x0D, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x43, 0x68, 0x72, 0x69, 0x73, 0x20, 0x57,
+ 0x61, 0x72, 0x73, 0x68, 0x61, 0x75, 0x65, 0x72,
+ 0x20, 0x20, 0x20, 0x0D, 0x0D, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x61, 0x6E, 0x64, 0x20, 0x54, 0x53, 0x43,
+ 0x53, 0x2C, 0x20, 0x49, 0x6E, 0x63, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x0D, 0x0D, 0x0D, 0x0D, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x54, 0x65, 0x73,
+ 0x74, 0x20, 0x53, 0x75, 0x70, 0x70, 0x6F, 0x72,
+ 0x74, 0x3A, 0x20, 0x4B, 0x79, 0x6D, 0x20, 0x47,
+ 0x6F, 0x79, 0x65, 0x72, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x0D, 0x0D, 0x0D,
+ 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x20, 0x20, 0x44,
+ 0x65, 0x75, 0x74, 0x73, 0x63, 0x68, 0x65, 0x20,
+ 0x56, 0x65, 0x72, 0x73, 0x69, 0x6F, 0x6E, 0x3A,
+ 0x20, 0x53, 0x6F, 0x66, 0x74, 0x67, 0x6F, 0x6C,
+ 0x64, 0x20, 0x47, 0x6D, 0x62, 0x48, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x0D, 0x0D, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x50,
+ 0x72, 0x6F, 0x64, 0x75, 0x63, 0x65, 0x72, 0x3A,
+ 0x20, 0x54, 0x68, 0x6F, 0x6D, 0x61, 0x73, 0x20,
+ 0x42, 0x72, 0x6F, 0x63, 0x6B, 0x68, 0x61, 0x67,
+ 0x65, 0x20, 0x20, 0x0D, 0x0D, 0x20, 0x4C, 0x65,
+ 0x76, 0x65, 0x6C, 0x20, 0x75, 0x2E, 0x20, 0x48,
+ 0x61, 0x6E, 0x64, 0x62, 0x75, 0x63, 0x68, 0x3A,
+ 0x20, 0x4A, 0x61, 0x73, 0x70, 0x65, 0x72, 0x20,
+ 0x42, 0x6F, 0x6E, 0x67, 0x65, 0x72, 0x74, 0x7A,
+ 0x20, 0x20, 0x20, 0x0D, 0x0D, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x53, 0x70, 0x69, 0x65, 0x6C,
+ 0x65, 0x74, 0x65, 0x73, 0x74, 0x65, 0x72, 0x3A,
+ 0x20, 0x53, 0x63, 0x68, 0x69, 0x65, 0x76, 0x69,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x0D, 0x0D, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x41, 0x6C, 0x65, 0x78, 0x61, 0x6E, 0x64,
+ 0x65, 0x72, 0x20, 0x42, 0x6F, 0x68, 0x6C, 0x20,
+ 0x20, 0x20, 0x20, 0x0D, 0x0D, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x4D, 0x61, 0x72, 0x6B, 0x75, 0x73, 0x20,
+ 0x4C, 0x75, 0x64, 0x6F, 0x6C, 0x66, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x0D, 0x0D, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x54, 0x68, 0x6F, 0x72, 0x73, 0x74, 0x65,
+ 0x6E, 0x20, 0x4E, 0x65, 0x75, 0x6D, 0x61, 0x6E,
+ 0x6E, 0x20, 0x20, 0x0D, 0x0D, 0x20, 0x20, 0x20,
+ 0x20, 0x53, 0x70, 0x65, 0x63, 0x69, 0x61, 0x6C,
+ 0x20, 0x54, 0x68, 0x61, 0x6E, 0x6B, 0x73, 0x3A,
+ 0x20, 0x4A, 0x94, 0x72, 0x67, 0x20, 0x47, 0x72,
+ 0x84, 0x66, 0x69, 0x6E, 0x67, 0x68, 0x6F, 0x6C,
+ 0x74, 0x20, 0x20, 0x0D, 0x0D, 0x09, 0x09, 0x09,
+ 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x20,
+ 0x4B, 0x72, 0x69, 0x73, 0x74, 0x69, 0x6E, 0x20,
+ 0x44, 0x6F, 0x64, 0x74, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x0D, 0x0D, 0x09, 0x09, 0x09, 0x09,
+ 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x20, 0x54,
+ 0x68, 0x6F, 0x72, 0x62, 0x65, 0x6E, 0x20, 0x57,
+ 0x94, 0x68, 0x6C, 0x65, 0x72, 0x20, 0x20, 0x20,
+ 0x20, 0x0D, 0x0D, 0x09, 0x09, 0x09, 0x09, 0x09,
+ 0x09, 0x09, 0x09, 0x09, 0x09, 0x20, 0x42, 0x65,
+ 0x72, 0x6E, 0x61, 0x72, 0x64, 0x20, 0x4D, 0x6F,
+ 0x72, 0x65, 0x6C, 0x6C, 0x20, 0x20, 0x20, 0x20,
+ 0x0D, 0x0D, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x53, 0x75,
+ 0x73, 0x61, 0x6E, 0x6E, 0x65, 0x20, 0x44, 0x69,
+ 0x65, 0x63, 0x6B, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x0D, 0x0D, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x56, 0x6F,
+ 0x6C, 0x6B, 0x65, 0x72, 0x20, 0x45, 0x6C, 0x6F,
+ 0x65, 0x73, 0x73, 0x65, 0x72, 0x20, 0x20, 0x20,
+ 0x0D, 0x0D, 0x75, 0x6E, 0x64, 0x20, 0x64, 0x65,
+ 0x72, 0x20, 0x44, 0x72, 0x61, 0x63, 0x68, 0x65,
+ 0x6E, 0x74, 0x94, 0x74, 0x65, 0x72, 0x0D, 0x0D,
+ 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D,
+ 0x0D, 0x0D, 0x0D, 0x43, 0x61, 0x73, 0x74, 0x20,
+ 0x6F, 0x66, 0x20, 0x43, 0x68, 0x61, 0x72, 0x61,
+ 0x63, 0x74, 0x65, 0x72, 0x73, 0x0D, 0x0D, 0x0D,
+ 0x44, 0x69, 0x65, 0x20, 0x4D, 0x84, 0x63, 0x68,
+ 0x74, 0x65, 0x20, 0x64, 0x65, 0x73, 0x20, 0x42,
+ 0x94, 0x73, 0x65, 0x6E, 0x0D, 0x0D, 0x0D, 0x44,
+ 0x72, 0x61, 0x6E, 0x20, 0x44, 0x72, 0x61, 0x67,
+ 0x67, 0x6F, 0x72, 0x65, 0x20, 0x28, 0x44, 0x65,
+ 0x72, 0x20, 0x67, 0x72, 0x6F, 0xE1, 0x65, 0x20,
+ 0x62, 0x94, 0x73, 0x65, 0x20, 0x44, 0x72, 0x61,
+ 0x63, 0x68, 0x65, 0x29, 0x0D, 0x0D, 0x4E, 0x61,
+ 0x64, 0x69, 0x61, 0x20, 0x26, 0x20, 0x4A, 0x6F,
+ 0x72, 0x69, 0x6C, 0x20, 0x28, 0x44, 0x69, 0x65,
+ 0x20, 0x62, 0x94, 0x73, 0x65, 0x6E, 0x20, 0x4B,
+ 0x6C, 0x65, 0x72, 0x69, 0x6B, 0x65, 0x72, 0x29,
+ 0x0D, 0x0D, 0x44, 0x69, 0x65, 0x6E, 0x65, 0x72,
+ 0x20, 0x28, 0x44, 0x72, 0x61, 0x6E, 0x73, 0x20,
+ 0x62, 0x94, 0x73, 0x65, 0x20, 0x72, 0x65, 0x63,
+ 0x68, 0x74, 0x65, 0x20, 0x48, 0x61, 0x6E, 0x64,
+ 0x29, 0x0D, 0x0D, 0x4B, 0x6C, 0x65, 0x72, 0x69,
+ 0x6B, 0x65, 0x72, 0x20, 0x28, 0x44, 0x65, 0x72,
+ 0x20, 0x66, 0x69, 0x65, 0x73, 0x65, 0x20, 0x72,
+ 0x6F, 0x74, 0x65, 0x20, 0x48, 0x65, 0x72, 0x69,
+ 0x6E, 0x67, 0x29, 0x0D, 0x0D, 0x44, 0x65, 0x72,
+ 0x20, 0x4B, 0x94, 0x6E, 0x69, 0x67, 0x20, 0x64,
+ 0x65, 0x72, 0x20, 0x46, 0x72, 0x6F, 0x73, 0x74,
+ 0x72, 0x69, 0x65, 0x73, 0x65, 0x6E, 0x0D, 0x0D,
+ 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D,
+ 0x0D, 0x0D, 0x44, 0x69, 0x65, 0x20, 0x4D, 0x84,
+ 0x63, 0x68, 0x74, 0x65, 0x20, 0x64, 0x65, 0x73,
+ 0x20, 0x47, 0x75, 0x74, 0x65, 0x6E, 0x0D, 0x0D,
+ 0x0D, 0x4B, 0x68, 0x65, 0x6C, 0x62, 0x65, 0x6E,
+ 0x20, 0x42, 0x6C, 0x61, 0x63, 0x6B, 0x73, 0x74,
+ 0x61, 0x66, 0x66, 0x0D, 0x0D, 0x41, 0x6D, 0x62,
+ 0x65, 0x72, 0x20, 0x28, 0x4B, 0x68, 0x65, 0x6C,
+ 0x62, 0x65, 0x6E, 0x73, 0x20, 0x4B, 0x75, 0x6E,
+ 0x64, 0x73, 0x63, 0x68, 0x61, 0x66, 0x74, 0x65,
+ 0x72, 0x29, 0x0D, 0x0D, 0x53, 0x68, 0x6F, 0x72,
+ 0x6E, 0x20, 0x44, 0x69, 0x65, 0x72, 0x67, 0x61,
+ 0x72, 0x20, 0x28, 0x6C, 0x84, 0x73, 0x74, 0x69,
+ 0x67, 0x65, 0x72, 0x20, 0x5A, 0x77, 0x65, 0x72,
+ 0x67, 0x29, 0x0D, 0x0D, 0x49, 0x6E, 0x73, 0x61,
+ 0x6C, 0x20, 0x64, 0x65, 0x72, 0x20, 0x44, 0x69,
+ 0x65, 0x62, 0x20, 0x28, 0x44, 0x69, 0x65, 0x20,
+ 0x50, 0x6C, 0x61, 0x67, 0x65, 0x29, 0x0D, 0x0D,
+ 0x43, 0x61, 0x6C, 0x61, 0x6E, 0x64, 0x72, 0x61,
+ 0x20, 0x28, 0x49, 0x72, 0x61, 0x73, 0x20, 0x76,
+ 0x65, 0x72, 0x6C, 0x6F, 0x72, 0x65, 0x6E, 0x65,
+ 0x20, 0x53, 0x63, 0x68, 0x77, 0x65, 0x73, 0x74,
+ 0x65, 0x72, 0x29, 0x0D, 0x0D, 0x41, 0x6C, 0x61,
+ 0x69, 0x6E, 0x20, 0x28, 0x44, 0x65, 0x72, 0x20,
+ 0x55, 0x72, 0x61, 0x6C, 0x74, 0x65, 0x29, 0x0D,
+ 0x0D, 0x53, 0x61, 0x6E, 0x2D, 0x52, 0x61, 0x61,
+ 0x6C, 0x20, 0x28, 0x44, 0x75, 0x6E, 0x6B, 0x65,
+ 0x6C, 0x65, 0x6C, 0x66, 0x65, 0x6E, 0x6D, 0x61,
+ 0x67, 0x69, 0x65, 0x72, 0x29, 0x0D, 0x0D, 0x0D,
+ 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D,
+ 0x0D, 0x0D, 0x0D, 0x0D, 0x01, 0x4A, 0x65, 0x64,
+ 0x65, 0x20, 0x8E, 0x68, 0x6E, 0x6C, 0x69, 0x63,
+ 0x68, 0x6B, 0x65, 0x69, 0x74, 0x20, 0x76, 0x6F,
+ 0x6E, 0x20, 0x43, 0x68, 0x61, 0x72, 0x61, 0x6B,
+ 0x74, 0x65, 0x72, 0x65, 0x6E, 0x2C, 0x0D, 0x01,
+ 0x6F, 0x62, 0x20, 0x54, 0x6F, 0x74, 0x20, 0x6F,
+ 0x64, 0x65, 0x72, 0x20, 0x4C, 0x65, 0x62, 0x65,
+ 0x6E, 0x64, 0x69, 0x67, 0x2C, 0x20, 0x77, 0x84,
+ 0x72, 0x65, 0x20, 0x72, 0x65, 0x69, 0x6E, 0x0D,
+ 0x01, 0x7A, 0x75, 0x66, 0x84, 0x6C, 0x6C, 0x69,
+ 0x67, 0x20, 0x75, 0x6E, 0x64, 0x20, 0x75, 0x6E,
+ 0x62, 0x65, 0x61, 0x62, 0x73, 0x69, 0x63, 0x68,
+ 0x74, 0x69, 0x67, 0x74, 0x2E, 0x0D, 0x0D, 0x0D,
+ 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D,
+ 0x02, 0x11, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D,
+ 0x00
+};
+
+static const ByteProvider kEoB2CreditsDataDOSGermanProvider = { ARRAYSIZE(kEoB2CreditsDataDOSGerman), kEoB2CreditsDataDOSGerman };
+
+static const char *const kEoB2FinaleCPSFilesDOSGerman[13] = {
+ "DRAGON1.CPS",
+ "DRAGON2.CPS",
+ "HURRY1.CPS",
+ "HURRY2.CPS",
+ "DESTROY0.CPS",
+ "DESTROY1.CPS",
+ "DESTROY2.CPS",
+ "MAGIC.CPS",
+ "DESTROY3.CPS",
+ "XREDITS2.CPS",
+ "CREDITS3.CPS",
+ "XEROES.CPS",
+ "THANKS.CPS"
+};
+
+static const StringListProvider kEoB2FinaleCPSFilesDOSGermanProvider = { ARRAYSIZE(kEoB2FinaleCPSFilesDOSGerman), kEoB2FinaleCPSFilesDOSGerman };
+
+static const char *const kEoB2MonsterDistAttStringsDOSGerman[5] = {
+ "Die Party wurde von einem psychischen Abgriff getroffen!\r",
+ "paralysiert",
+ "vergiftet",
+ "bet""\x84""ubt",
+ "aus stein"
+};
+
+static const StringListProvider kEoB2MonsterDistAttStringsDOSGermanProvider = { ARRAYSIZE(kEoB2MonsterDistAttStringsDOSGerman), kEoB2MonsterDistAttStringsDOSGerman };
+
+static const char *const kEoB2Npc1StringsDOSGerman[2] = {
+ "reden",
+ "weiter"
+};
+
+static const StringListProvider kEoB2Npc1StringsDOSGermanProvider = { ARRAYSIZE(kEoB2Npc1StringsDOSGerman), kEoB2Npc1StringsDOSGerman };
+
+static const char *const kEoB2Npc2StringsDOSGerman[2] = {
+ "Freilassen",
+ "Weiterziehen"
+};
+
+static const StringListProvider kEoB2Npc2StringsDOSGermanProvider = { ARRAYSIZE(kEoB2Npc2StringsDOSGerman), kEoB2Npc2StringsDOSGerman };
+
+static const char *const kEoB2MonsterDustStringsDOSGerman[1] = {
+ "Das Monster vergeht zu Staub!\r"
+};
+
+static const StringListProvider kEoB2MonsterDustStringsDOSGermanProvider = { ARRAYSIZE(kEoB2MonsterDustStringsDOSGerman), kEoB2MonsterDustStringsDOSGerman };
+
+static const char *const kEoB2KheldranStringsDOSGerman[1] = {
+ " Diese Narren!"
+};
+
+static const StringListProvider kEoB2KheldranStringsDOSGermanProvider = { ARRAYSIZE(kEoB2KheldranStringsDOSGerman), kEoB2KheldranStringsDOSGerman };
+
+static const char *const kEoB2HornStringsDOSGerman[4] = {
+ "Ein br""\x81""llendes Ger""\x84""usch kommt aus dem Horn.\r",
+ "Ein hohler Ton dringt aus dem Horn.\r",
+ "Ein melodischer Ton klingt aus dem Horn.\r",
+ "Ein unheimliches Ger""\x84""usch kommt aus dem Horn.\r"
+};
+
+static const StringListProvider kEoB2HornStringsDOSGermanProvider = { ARRAYSIZE(kEoB2HornStringsDOSGerman), kEoB2HornStringsDOSGerman };
+
diff --git a/devtools/create_kyradat/resources/hof_dos.h b/devtools/create_kyradat/resources/hof_dos.h
new file mode 100644
index 0000000000..a90acd4803
--- /dev/null
+++ b/devtools/create_kyradat/resources/hof_dos.h
@@ -0,0 +1,769 @@
+static const char *const k2SeqplayPakFilesDOS[3] = {
+ "INTROGEN.PAK",
+ "INTROVOC.PAK",
+ "VOC.PAK"
+};
+
+static const StringListProvider k2SeqplayPakFilesDOSProvider = { ARRAYSIZE(k2SeqplayPakFilesDOS), k2SeqplayPakFilesDOS };
+
+static const char *const k2SeqplaySfxFilesDOS[33] = {
+ "intro1",
+ "intro2",
+ "intro3",
+ "intro4",
+ "intro5",
+ "intro6",
+ "intro7",
+ "intro8",
+ "intro9",
+ "intro10",
+ "intro11",
+ "intro12",
+ "glow",
+ "asong",
+ "crowcaw",
+ "eyerub2",
+ "pluck3",
+ "rodnreel",
+ "frog1",
+ "scavmov2",
+ "lambmom3",
+ "lambkid1",
+ "thunder2",
+ "thunder3",
+ "wind6",
+ "h2odrop2",
+ "gasleak",
+ "polgulp1",
+ "hndslap1",
+ "burp1",
+ "scream1",
+ "theend",
+ ""
+};
+
+static const StringListProvider k2SeqplaySfxFilesDOSProvider = { ARRAYSIZE(k2SeqplaySfxFilesDOS), k2SeqplaySfxFilesDOS };
+
+static const char *const k2SeqplayIntroTracksDOS[2] = {
+ "k2intro",
+ "k2intro"
+};
+
+static const StringListProvider k2SeqplayIntroTracksDOSProvider = { ARRAYSIZE(k2SeqplayIntroTracksDOS), k2SeqplayIntroTracksDOS };
+
+static const char *const k2SeqplayFinaleTracksDOS[2] = {
+ "k2finale",
+ "k2finale"
+};
+
+static const StringListProvider k2SeqplayFinaleTracksDOSProvider = { ARRAYSIZE(k2SeqplayFinaleTracksDOS), k2SeqplayFinaleTracksDOS };
+
+static const HoFSequence k2SeqplaySeqDataDOSSeq[16] = {
+ { 0x0002, "", "virgin.cps", 4, 0, 0xFFFF, 0xFFFF, 0x0000, 0x0001, 0x0064, 0, 0, 0x001E },
+ { 0x0001, "westwood.wsa", "", 4, 0, 0xFFFF, 0xFFFF, 0x0000, 0x0012, 0x0006, 0, 0, 0x00A0 },
+ { 0x0001, "title.wsa", "", 4, 0, 0xFFFF, 0xFFFF, 0x0000, 0x001A, 0x0006, 0, 0, 0x000A },
+ { 0x0002, "", "over.cps", 4, 0, 0xFFFF, 0xFFFF, 0x0000, 0x0001, 0x0E10, 0, 0, 0x001E },
+ { 0x0002, "", "library.cps", 4, 0, 0xFFFF, 0xFFFF, 0x0000, 0x0001, 0x0E10, 0, 0, 0x001E },
+ { 0x0002, "", "hand.cps", 4, 0, 0xFFFF, 0xFFFF, 0x0000, 0x0001, 0x0E10, 0, 0, 0x005A },
+ { 0x0001, "point.wsa", "", 4, 8, 0xFFFF, 0xFFFF, 0x0000, 0x0026, 0x0007, 0, 0, 0x00C8 },
+ { 0x0001, "zanfaun.wsa", "", 4, 0, 0xFFFF, 0xFFFF, 0x0000, 0x0033, 0x0010, 0, 0, 0x00F0 },
+ { 0x0001, "funters.wsa", "", 4, 0, 0xFFFF, 0xFFFF, 0x0000, 0x001B, 0x000C, 0, 0, 0x001E },
+ { 0x0001, "ferb.wsa", "", 4, 0, 0xFFFF, 0xFFFF, 0x0000, 0x001B, 0x0010, 0, 0, 0x001E },
+ { 0x0001, "fish.wsa", "", 4, 0, 0xFFFF, 0xFFFF, 0x0000, 0x0038, 0x000C, 0, 0, 0x001E },
+ { 0x0001, "fheep.wsa", "", 4, 0, 0xFFFF, 0xFFFF, 0x0000, 0x000B, 0x000C, 0, 0, 0x001E },
+ { 0x0001, "farmer.wsa", "", 4, 0, 0xFFFF, 0xFFFF, 0x0000, 0x0016, 0x000C, 0, 0, 0x0064 },
+ { 0x0001, "fuards.wsa", "", 4, 0, 0xFFFF, 0xFFFF, 0x0000, 0x0018, 0x000E, 0, 0, 0x001E },
+ { 0x0001, "firates.wsa", "", 4, 0, 0xFFFF, 0xFFFF, 0x0000, 0x0025, 0x000C, 0, 0, 0x001E },
+ { 0x0001, "frash.wsa", "", 4, 0, 0xFFFF, 0xFFFF, 0x0000, 0x000C, 0x000A, 0, 0, 0x0154 }
+};
+
+static const FrameControl k2SeqplaySeqDataDOSSeqNestedControl7[18] = {
+ { 0, 10 },
+ { 1, 10 },
+ { 2, 10 },
+ { 3, 10 },
+ { 4, 10 },
+ { 5, 10 },
+ { 6, 10 },
+ { 7, 10 },
+ { 8, 10 },
+ { 9, 10 },
+ { 8, 10 },
+ { 7, 10 },
+ { 6, 10 },
+ { 5, 40 },
+ { 4, 10 },
+ { 3, 10 },
+ { 2, 10 },
+ { 1, 10 }
+};
+
+static const FrameControl k2SeqplaySeqDataDOSSeqNestedControl10[17] = {
+ { 0, 6 },
+ { 1, 6 },
+ { 2, 6 },
+ { 3, 6 },
+ { 4, 6 },
+ { 5, 6 },
+ { 6, 6 },
+ { 7, 6 },
+ { 8, 6 },
+ { 9, 6 },
+ { 10, 6 },
+ { 11, 6 },
+ { 11, 12 },
+ { 12, 12 },
+ { 13, 12 },
+ { 12, 12 },
+ { 11, 12 }
+};
+
+static const FrameControl k2SeqplaySeqDataDOSSeqNestedControl11[9] = {
+ { 0, 6 },
+ { 1, 6 },
+ { 2, 6 },
+ { 3, 6 },
+ { 4, 6 },
+ { 3, 6 },
+ { 4, 6 },
+ { 5, 64 },
+ { 5, 6 }
+};
+
+static const FrameControl k2SeqplaySeqDataDOSSeqNestedControl12[16] = {
+ { 0, 6 },
+ { 1, 6 },
+ { 0, 6 },
+ { 1, 6 },
+ { 0, 6 },
+ { 1, 6 },
+ { 0, 6 },
+ { 1, 6 },
+ { 0, 6 },
+ { 1, 6 },
+ { 0, 6 },
+ { 1, 6 },
+ { 0, 6 },
+ { 1, 6 },
+ { 0, 6 },
+ { 1, 6 }
+};
+
+static const FrameControl k2SeqplaySeqDataDOSSeqNestedControl13[5] = {
+ { 0, 6 },
+ { 1, 6 },
+ { 2, 6 },
+ { 1, 6 },
+ { 0, 1 }
+};
+
+static const FrameControl k2SeqplaySeqDataDOSSeqNestedControl14[8] = {
+ { 0, 6 },
+ { 1, 6 },
+ { 2, 6 },
+ { 3, 6 },
+ { 4, 6 },
+ { 3, 6 },
+ { 2, 6 },
+ { 1, 6 }
+};
+
+static const HoFNestedSequence k2SeqplaySeqDataDOSSeqNested[15] = {
+ { 0x000C, "figgle.wsa", 0, 3, 60, 0, 0, 0, NULL, 0, 0 },
+ { 0x0008, "over1.wsa", 0, 10, 10, 0, 0, 0, NULL, 0, 0 },
+ { 0x0008, "over2.wsa", 0, 11, 9, 0, 0, 0, NULL, 0, 0 },
+ { 0x0008, "forest.wsa", 0, 22, 6, 0, 0, 0, NULL, 1, 3 },
+ { 0x0008, "dragon.wsa", 0, 11, 6, 0, 0, 0, NULL, 2, 0 },
+ { 0x0002, "darm.wsa", 0, 19, 9, 0, 0, 0, NULL, 4, 0 },
+ { 0x0002, "library.wsa", 0, 33, 9, 0, 0, 0, NULL, 4, 0 },
+ { 0x002A, "library.wsa", 0, 18, 9, 0, 0, ARRAYSIZE(k2SeqplaySeqDataDOSSeqNestedControl7), k2SeqplaySeqDataDOSSeqNestedControl7, 0, 0 },
+ { 0x000A, "marco.wsa", 0, 37, 9, 0, 0, 0, NULL, 4, 0 },
+ { 0x0002, "hand1a.wsa", 0, 34, 9, 0, 0, 0, NULL, 0, 0 },
+ { 0x002A, "hand1b.wsa", 0, 16, 9, 0, 0, ARRAYSIZE(k2SeqplaySeqDataDOSSeqNestedControl10), k2SeqplaySeqDataDOSSeqNestedControl10, 0, 0 },
+ { 0x002A, "hand1c.wsa", 0, 9, 9, 0, 0, ARRAYSIZE(k2SeqplaySeqDataDOSSeqNestedControl11), k2SeqplaySeqDataDOSSeqNestedControl11, 0, 0 },
+ { 0x002C, "hand2.wsa", 0, 2, 9, 0, 0, ARRAYSIZE(k2SeqplaySeqDataDOSSeqNestedControl12), k2SeqplaySeqDataDOSSeqNestedControl12, 5, 0 },
+ { 0x002C, "hand3.wsa", 0, 4, 9, 0, 0, ARRAYSIZE(k2SeqplaySeqDataDOSSeqNestedControl13), k2SeqplaySeqDataDOSSeqNestedControl13, 5, 0 },
+ { 0x002C, "hand4.wsa", 0, 8, 9, 0, 0, ARRAYSIZE(k2SeqplaySeqDataDOSSeqNestedControl14), k2SeqplaySeqDataDOSSeqNestedControl14, 5, 0 }
+};
+
+static const HoFSequenceProvider k2SeqplaySeqDataDOSProvider = { ARRAYSIZE(k2SeqplaySeqDataDOSSeq), k2SeqplaySeqDataDOSSeq, ARRAYSIZE(k2SeqplaySeqDataDOSSeqNested), k2SeqplaySeqDataDOSSeqNested };
+
+static const char *const k2IngamePakFilesDOS[108] = {
+ "MISC_EMC.PAK",
+ "VOC.PAK",
+ "MISC_CPS.PAK",
+ "OTHER.PAK",
+ "COST1_SH.PAK",
+ "COST2_SH.PAK",
+ "COST3_SH.PAK",
+ "COST4_SH.PAK",
+ "COST5_SH.PAK",
+ "COST6_SH.PAK",
+ "COST7_SH.PAK",
+ "COST8_SH.PAK",
+ "COST9_SH.PAK",
+ "DRIVERS.PAK",
+ "CAULDRON.PAK",
+ "AUDIO.PAK",
+ "ALLEY.PAK",
+ "ALTAR.PAK",
+ "ANCHOR.PAK",
+ "BRIDGE.PAK",
+ "CELLAR.PAK",
+ "CLEARNG.PAK",
+ "CLIFF.PAK",
+ "CLOSE.PAK",
+ "CRICKET.PAK",
+ "CROC.PAK",
+ "DINOA.PAK",
+ "DINOB.PAK",
+ "DINOC.PAK",
+ "DINOD.PAK",
+ "DOCK.PAK",
+ "DOOR.PAK",
+ "FALL.PAK",
+ "FATE.PAK",
+ "FERRY.PAK",
+ "FIGHT.PAK",
+ "FISHER.PAK",
+ "FLOAT.PAK",
+ "FLYTRAP.PAK",
+ "FOOT.PAK",
+ "GARDEN.PAK",
+ "GEARS.PAK",
+ "GNARL.PAK",
+ "HANOI.PAK",
+ "HOLE.PAK",
+ "INCAVE.PAK",
+ "INGATE.PAK",
+ "INHERB.PAK",
+ "INHOME.PAK",
+ "INJAIL.PAK",
+ "INSHOP.PAK",
+ "INSTORE.PAK",
+ "ISLE.PAK",
+ "JUNGLE.PAK",
+ "MARKHME.PAK",
+ "MEADOW.PAK",
+ "MYSTRM.PAK",
+ "NEST.PAK",
+ "ONBOAT.PAK",
+ "OUTCAVE.PAK",
+ "OUTFARM.PAK",
+ "OUTGATE.PAK",
+ "OUTHERB.PAK",
+ "OUTHOME.PAK",
+ "PHONE_A.PAK",
+ "PHONE_B.PAK",
+ "PHONE_C.PAK",
+ "PHONE_D.PAK",
+ "QUICK.PAK",
+ "RAINA.PAK",
+ "RAINB.PAK",
+ "RAT.PAK",
+ "ROAD.PAK",
+ "ROPE.PAK",
+ "SCORCH.PAK",
+ "SKULL.PAK",
+ "SKY.PAK",
+ "STATION.PAK",
+ "STREET.PAK",
+ "SULFUR.PAK",
+ "TAVERN.PAK",
+ "TIMBER.PAK",
+ "TRAM.PAK",
+ "TREE.PAK",
+ "VOLC_A.PAK",
+ "VOLC_B.PAK",
+ "VOLC_C.PAK",
+ "VOLC_D.PAK",
+ "VOLC_E.PAK",
+ "VOLC_F.PAK",
+ "VOLC_G.PAK",
+ "VOLC_H.PAK",
+ "VOLC_I.PAK",
+ "VOLC_J.PAK",
+ "VOLC_K.PAK",
+ "VOLC_L.PAK",
+ "VOLC_M.PAK",
+ "VOLC_N.PAK",
+ "VOLC_O.PAK",
+ "VOLC_P.PAK",
+ "VOLCANO.PAK",
+ "WHARF.PAK",
+ "WHEEL.PAK",
+ "GEARS2.PAK",
+ "GEARS3.PAK",
+ "OUTCAVE2.PAK",
+ "INJAIL2.PAK",
+ "TREE2.PAK"
+};
+
+static const StringListProvider k2IngamePakFilesDOSProvider = { ARRAYSIZE(k2IngamePakFilesDOS), k2IngamePakFilesDOS };
+
+static const char *const k2IngameSfxFilesDOS[178] = {
+ "ALCHEMY2",
+ "BIGSLAM",
+ "BITE1",
+ "BLINK1",
+ "BOING1",
+ "BUBBLE1",
+ "BUBBLE2",
+ "BURP1",
+ "BUTTON6",
+ "CAULDRN2",
+ "CHEST",
+ "CLOTHES1",
+ "CROCLAF4",
+ "CRY1",
+ "CRY2",
+ "DOORMTCL",
+ "DOORMTOP",
+ "DOORWDCL",
+ "DOORWDOP",
+ "DRUM1",
+ "DRUM2",
+ "DRUM3",
+ "DRUM4",
+ "DRUM5",
+ "DRUM6",
+ "DRUM7",
+ "EYERUB2",
+ "FALL1",
+ "FALL3",
+ "FNGRSNAP",
+ "FORMSPL1",
+ "FROG1",
+ "FROGMIX2",
+ "GASLEAK",
+ "GLOWY1",
+ "GOOD3",
+ "GOOD5",
+ "GROWTWIG",
+ "H2ODROP2",
+ "H2OPLANT",
+ "HACHUCKD",
+ "HAYFALL2",
+ "HAYSRCH4",
+ "ICECUBE",
+ "KEYOPEN",
+ "LAMBKID1",
+ "LAMBMOM3",
+ "LAUGH1",
+ "LAUGH3",
+ "LAUGH4",
+ "LIZLISP",
+ "MAKESPL1",
+ "MSTDOOM1",
+ "ORCMOVE",
+ "PLUCK3",
+ "POLGULP1",
+ "PORTCUL",
+ "POURH20",
+ "RIP2",
+ "RODNREEL",
+ "ROWBOAT1",
+ "RUCKUS1",
+ "SCAVMOV2",
+ "SCRATCH1",
+ "SNAKSPEL",
+ "SNEEZE1",
+ "SNIFF1",
+ "SNOREIN3",
+ "SNOROUT",
+ "SPLASH1",
+ "SQUEAK1",
+ "SQUEAK2",
+ "SQUEAK3",
+ "SQUISH1",
+ "SQUISH2",
+ "STEAM",
+ "STEAM3",
+ "STRETCH1",
+ "SWING",
+ "TREZA1",
+ "TURNPAG2",
+ "TWIGSNAP",
+ "UGH1",
+ "WHEEL4",
+ "WINGS1",
+ "YAWN1",
+ "ZOOM5",
+ "FILBOTL",
+ "H2OPOUR1",
+ "JAILDOR1",
+ "JAILLOK1",
+ "CASHREG1",
+ "SWISH1",
+ "TURNBOAT",
+ "CLAPPING",
+ "CRUNCH1",
+ "WHEEL6",
+ "LITEMAG",
+ "SHELDOWN",
+ "SHELSLID",
+ "ZOW2",
+ "ZANLOOP1",
+ "SCREECH2",
+ "PANTING",
+ "TREX1",
+ "TREX5",
+ "TREX3",
+ "QUAKE",
+ "WRINGH2O",
+ "SPLAT2",
+ "OCEAN1",
+ "SPLAT3",
+ "CROCLAF5",
+ "FALL5",
+ "ZCMON2",
+ "ZWAIT3",
+ "ZNO2",
+ "CROCLAF7",
+ "CRICKET1",
+ "FIREBRTH",
+ "COW2",
+ "SAP2",
+ "PMTLHI",
+ "FROGSIGH",
+ "CRICEND",
+ "CRY3",
+ "CRY4",
+ "SHROOM1",
+ "DRIP1",
+ "SWIM4",
+ "CUCKOO2",
+ "PUNCH1",
+ "SNORT3",
+ "STAMPER2",
+ "WALLFALL",
+ "WOODFAL1",
+ "SPRAY1",
+ "OHNO1",
+ "YAHOO1",
+ "YIPEE1",
+ "WIND1",
+ "WIND3",
+ "WIND6",
+ "BLOWUP2",
+ "BOATLOP2",
+ "ZGIGGL1",
+ "ZCOUGH1",
+ "CRUSH",
+ "ALARM3",
+ "APPLEAT",
+ "BABYCRY1",
+ "BABYLAF1",
+ "BABYLIK1",
+ "GEARMX3",
+ "GLASBRK2",
+ "HANDKIL1",
+ "HNDSLAP1",
+ "ICEPICK1",
+ "KISS3",
+ "LOLIFAL1",
+ "PAGEBURN",
+ "PRTYHORN",
+ "SCREAM1",
+ "SPARKHIT",
+ "SPRING2",
+ "ZANLAND1",
+ "BIGBOW",
+ "BOWFORM",
+ "BULBHIT",
+ "EYELITE",
+ "ROOFBOW",
+ "FBIGFOT1",
+ "BIGFOOT4",
+ "DORSTNCL",
+ "CROWCAW",
+ "THUNDER2",
+ "THUNDER3",
+ "TOILET"
+};
+
+static const StringListProvider k2IngameSfxFilesDOSProvider = { ARRAYSIZE(k2IngameSfxFilesDOS), k2IngameSfxFilesDOS };
+
+static const byte k2IngameSfxIndexDOS[856] = {
+ 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00,
+ 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00,
+ 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00,
+ 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00,
+ 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00,
+ 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00,
+ 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00,
+ 0xFF, 0xFF, 0x00, 0x00, 0x0B, 0x00, 0x00, 0x00,
+ 0x37, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00,
+ 0x47, 0x00, 0x05, 0x00, 0x22, 0x00, 0x00, 0x00,
+ 0x1F, 0x00, 0x00, 0x00, 0x51, 0x00, 0x00, 0x00,
+ 0x25, 0x00, 0x00, 0x00, 0x26, 0x00, 0x00, 0x00,
+ 0x36, 0x00, 0x05, 0x00, 0x07, 0x00, 0x00, 0x00,
+ 0x3F, 0x00, 0x00, 0x00, 0x54, 0x00, 0x00, 0x00,
+ 0x45, 0x00, 0x00, 0x00, 0x4D, 0x00, 0x00, 0x00,
+ 0x7B, 0x00, 0x00, 0x00, 0x32, 0x00, 0x00, 0x00,
+ 0xFF, 0xFF, 0x00, 0x00, 0x3C, 0x00, 0x00, 0x00,
+ 0x3C, 0x00, 0x00, 0x00, 0x3B, 0x00, 0x00, 0x00,
+ 0x4E, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00,
+ 0x04, 0x00, 0x00, 0x00, 0x43, 0x00, 0x04, 0x00,
+ 0x56, 0x00, 0x00, 0x00, 0x40, 0x00, 0x05, 0x00,
+ 0x40, 0x00, 0x05, 0x00, 0xFF, 0xFF, 0x00, 0x00,
+ 0x64, 0x00, 0x00, 0x00, 0x4C, 0x00, 0x00, 0x00,
+ 0x12, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00,
+ 0x37, 0x00, 0x00, 0x00, 0x42, 0x00, 0x00, 0x00,
+ 0x1D, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00,
+ 0x49, 0x00, 0x00, 0x00, 0x52, 0x00, 0x00, 0x00,
+ 0x0A, 0x00, 0x00, 0x00, 0x4A, 0x00, 0x00, 0x00,
+ 0x09, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00,
+ 0x0D, 0x00, 0x00, 0x00, 0x0E, 0x00, 0x00, 0x00,
+ 0x53, 0x00, 0x00, 0x00, 0x35, 0x00, 0x00, 0x00,
+ 0x0C, 0x00, 0x00, 0x00, 0x4B, 0x00, 0x00, 0x00,
+ 0x21, 0x00, 0x00, 0x00, 0x53, 0x00, 0x00, 0x00,
+ 0x32, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00,
+ 0x1B, 0x00, 0x00, 0x00, 0x1C, 0x00, 0x00, 0x00,
+ 0x13, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00,
+ 0x15, 0x00, 0x00, 0x00, 0x16, 0x00, 0x00, 0x00,
+ 0x17, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00,
+ 0x19, 0x00, 0x00, 0x00, 0x0A, 0x00, 0x00, 0x00,
+ 0x1A, 0x00, 0x00, 0x00, 0x41, 0x00, 0x00, 0x00,
+ 0x77, 0x00, 0x00, 0x00, 0x3D, 0x00, 0x00, 0x00,
+ 0x55, 0x00, 0x00, 0x00, 0x29, 0x00, 0x00, 0x00,
+ 0x2A, 0x00, 0x00, 0x00, 0x2E, 0x00, 0x00, 0x00,
+ 0x2D, 0x00, 0x00, 0x00, 0x27, 0x00, 0x05, 0x00,
+ 0x25, 0x00, 0x00, 0x00, 0x46, 0x00, 0x05, 0x00,
+ 0x60, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00,
+ 0x34, 0x00, 0x00, 0x00, 0x12, 0x00, 0x00, 0x00,
+ 0x4F, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00,
+ 0x0F, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00,
+ 0x0A, 0x00, 0x00, 0x00, 0x78, 0x00, 0x06, 0x00,
+ 0x50, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
+ 0x33, 0x00, 0x06, 0x00, 0x3A, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00,
+ 0x1E, 0x00, 0x00, 0x00, 0x79, 0x00, 0x00, 0x00,
+ 0x23, 0x00, 0x05, 0x00, 0x24, 0x00, 0x05, 0x00,
+ 0x3E, 0x00, 0x00, 0x00, 0x2C, 0x00, 0x00, 0x00,
+ 0x48, 0x00, 0x05, 0x00, 0x20, 0x00, 0x00, 0x00,
+ 0x63, 0x00, 0x00, 0x00, 0x62, 0x00, 0x00, 0x00,
+ 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00,
+ 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00,
+ 0x7A, 0x00, 0x00, 0x00, 0x5E, 0x00, 0x00, 0x00,
+ 0x5B, 0x00, 0x00, 0x00, 0x5A, 0x00, 0x00, 0x00,
+ 0x10, 0x00, 0x00, 0x00, 0x59, 0x00, 0x00, 0x00,
+ 0x5D, 0x00, 0x00, 0x00, 0x5C, 0x00, 0x00, 0x00,
+ 0x57, 0x00, 0x00, 0x00, 0x2F, 0x00, 0x00, 0x00,
+ 0x30, 0x00, 0x00, 0x00, 0x31, 0x00, 0x00, 0x00,
+ 0x61, 0x00, 0x05, 0x00, 0x58, 0x00, 0x00, 0x00,
+ 0x5F, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00,
+ 0x65, 0x00, 0x00, 0x00, 0x66, 0x00, 0x00, 0x00,
+ 0x67, 0x00, 0x00, 0x00, 0x68, 0x00, 0x05, 0x00,
+ 0x69, 0x00, 0x05, 0x00, 0x6A, 0x00, 0x05, 0x00,
+ 0x01, 0x00, 0x05, 0x00, 0x6B, 0x00, 0x00, 0x00,
+ 0x6C, 0x00, 0x00, 0x00, 0x6D, 0x00, 0x00, 0x00,
+ 0x90, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00,
+ 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00,
+ 0x6F, 0x00, 0x00, 0x00, 0x70, 0x00, 0x00, 0x00,
+ 0x71, 0x00, 0x00, 0x00, 0x72, 0x00, 0x00, 0x00,
+ 0x73, 0x00, 0x00, 0x00, 0x74, 0x00, 0x00, 0x00,
+ 0x75, 0x00, 0x00, 0x00, 0x76, 0x00, 0x00, 0x00,
+ 0x7F, 0x00, 0x06, 0x00, 0x7D, 0x00, 0x00, 0x00,
+ 0x7E, 0x00, 0x00, 0x00, 0x7C, 0x00, 0x00, 0x00,
+ 0x80, 0x00, 0x00, 0x00, 0x81, 0x00, 0x00, 0x00,
+ 0xFF, 0xFF, 0x00, 0x00, 0x85, 0x00, 0x00, 0x00,
+ 0x84, 0x00, 0x00, 0x00, 0x83, 0x00, 0x00, 0x00,
+ 0x82, 0x00, 0x05, 0x00, 0x86, 0x00, 0x00, 0x00,
+ 0x88, 0x00, 0x00, 0x00, 0x89, 0x00, 0x00, 0x00,
+ 0x8A, 0x00, 0x00, 0x00, 0x8B, 0x00, 0x00, 0x00,
+ 0x87, 0x00, 0x00, 0x00, 0x8C, 0x00, 0x00, 0x00,
+ 0x8D, 0x00, 0x00, 0x00, 0x8E, 0x00, 0x00, 0x00,
+ 0x8F, 0x00, 0x00, 0x00, 0x90, 0x00, 0x00, 0x00,
+ 0x91, 0x00, 0x00, 0x00, 0x92, 0x00, 0x00, 0x00,
+ 0x93, 0x00, 0x05, 0x00, 0x94, 0x00, 0x00, 0x00,
+ 0x5F, 0x00, 0x00, 0x00, 0x96, 0x00, 0x05, 0x00,
+ 0x97, 0x00, 0x00, 0x00, 0x98, 0x00, 0x04, 0x00,
+ 0x99, 0x00, 0x00, 0x00, 0x9A, 0x00, 0x00, 0x00,
+ 0x9B, 0x00, 0x00, 0x00, 0x9C, 0x00, 0x00, 0x00,
+ 0x9D, 0x00, 0x00, 0x00, 0x9E, 0x00, 0x00, 0x00,
+ 0x9F, 0x00, 0x00, 0x00, 0xA0, 0x00, 0x00, 0x00,
+ 0xA1, 0x00, 0x00, 0x00, 0xA2, 0x00, 0x00, 0x00,
+ 0xA3, 0x00, 0x00, 0x00, 0xA4, 0x00, 0x00, 0x00,
+ 0xA5, 0x00, 0x00, 0x00, 0xA6, 0x00, 0x00, 0x00,
+ 0xA7, 0x00, 0x00, 0x00, 0xA8, 0x00, 0x00, 0x00,
+ 0xA9, 0x00, 0x00, 0x00, 0xAA, 0x00, 0x00, 0x00,
+ 0xAB, 0x00, 0x00, 0x00, 0xAC, 0x00, 0x00, 0x00,
+ 0xAD, 0x00, 0x00, 0x00, 0xAE, 0x00, 0x05, 0x00,
+ 0xAF, 0x00, 0x00, 0x00, 0xB0, 0x00, 0x00, 0x00,
+ 0xB1, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00
+};
+
+static const ByteProvider k2IngameSfxIndexDOSProvider = { ARRAYSIZE(k2IngameSfxIndexDOS), k2IngameSfxIndexDOS };
+
+static const char *const k2IngameTracksDOS[15] = {
+ "K2TEST1",
+ "K2TEST2",
+ "K2TEST3",
+ "K2TEST4",
+ "K2TEST5",
+ "K2TEST6",
+ "K2TEST7",
+ "K2TEST8",
+ "K2TEST9",
+ "K2TEST10",
+ "K2TEST11",
+ "K2TEST12",
+ "K2TEST13",
+ "K2TEST14",
+ "K2TEST15"
+};
+
+static const StringListProvider k2IngameTracksDOSProvider = { ARRAYSIZE(k2IngameTracksDOS), k2IngameTracksDOS };
+
+static const byte k2IngameTalkObjIndexDOS[120] = {
+ 0x20, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6C, 0x65,
+ 0x64, 0x00, 0x00, 0x00, 0x00, 0x00, 0x12, 0x00,
+ 0x18, 0x00, 0x26, 0x00, 0x41, 0x00, 0x00, 0x00,
+ 0x01, 0x00, 0x02, 0x00, 0x03, 0x00, 0x04, 0x00,
+ 0x05, 0x00, 0x06, 0x00, 0x07, 0x00, 0x08, 0x00,
+ 0x09, 0x00, 0x0A, 0x00, 0x11, 0x00, 0x12, 0x00,
+ 0x13, 0x00, 0x14, 0x00, 0x15, 0x00, 0x2A, 0x00,
+ 0x17, 0x00, 0x18, 0x00, 0x19, 0x00, 0x1A, 0x00,
+ 0x1B, 0x00, 0x1C, 0x00, 0x1D, 0x00, 0x1E, 0x00,
+ 0x1F, 0x00, 0x20, 0x00, 0x21, 0x00, 0x22, 0x00,
+ 0x23, 0x00, 0x24, 0x00, 0x30, 0x00, 0x35, 0x00,
+ 0x36, 0x00, 0x37, 0x00, 0x39, 0x00, 0x3A, 0x00,
+ 0x3B, 0x00, 0x3D, 0x00, 0x3E, 0x00, 0x3F, 0x00,
+ 0x40, 0x00, 0x41, 0x00, 0x42, 0x00, 0x43, 0x00,
+ 0x44, 0x00, 0x45, 0x00, 0x46, 0x00, 0x47, 0x00
+};
+
+static const ByteProvider k2IngameTalkObjIndexDOSProvider = { ARRAYSIZE(k2IngameTalkObjIndexDOS), k2IngameTalkObjIndexDOS };
+
+static const FrameControl k2IngameShapeAnimDataDOS0FrameControl[12] = {
+ { 0x0006, 0x00F0 },
+ { 0x002A, 0x000E },
+ { 0x002B, 0x000E },
+ { 0x002C, 0x000E },
+ { 0x0006, 0x000E },
+ { 0x002A, 0x000E },
+ { 0x002B, 0x000E },
+ { 0x002C, 0x000E },
+ { 0x0006, 0x000E },
+ { 0x002A, 0x000E },
+ { 0x002B, 0x000E },
+ { 0x002C, 0x000E }
+};
+
+static const FrameControl k2IngameShapeAnimDataDOS1FrameControl[6] = {
+ { 0x0002, 0x012C },
+ { 0x002D, 0x012C },
+ { 0x002E, 0x012C },
+ { 0x002F, 0x012C },
+ { 0x002E, 0x012C },
+ { 0x002D, 0x012C }
+};
+
+static const FrameControl k2IngameShapeAnimDataDOS2FrameControl[6] = {
+ { 0x000B, 0x0258 },
+ { 0x0030, 0x0005 },
+ { 0x0031, 0x0005 },
+ { 0x0032, 0x0005 },
+ { 0x0031, 0x0005 },
+ { 0x0030, 0x0005 }
+};
+
+static const FrameControl k2IngameShapeAnimDataDOS3FrameControl[4] = {
+ { 0x001C, 0x0014 },
+ { 0x004E, 0x0014 },
+ { 0x004F, 0x0014 },
+ { 0x0050, 0x0014 }
+};
+
+static const FrameControl k2IngameShapeAnimDataDOS4FrameControl[4] = {
+ { 0x0017, 0x0007 },
+ { 0x0051, 0x0007 },
+ { 0x0052, 0x0007 },
+ { 0x0053, 0x0007 }
+};
+
+static const FrameControl k2IngameShapeAnimDataDOS5FrameControl[4] = {
+ { 0x0016, 0x0014 },
+ { 0x0054, 0x0014 },
+ { 0x0055, 0x0014 },
+ { 0x0056, 0x0014 }
+};
+
+static const FrameControl k2IngameShapeAnimDataDOS6FrameControl[4] = {
+ { 0x003A, 0x003C },
+ { 0x0057, 0x003C },
+ { 0x0058, 0x003C },
+ { 0x0059, 0x003C }
+};
+
+static const FrameControl k2IngameShapeAnimDataDOS7FrameControl[4] = {
+ { 0x001A, 0x0032 },
+ { 0x005A, 0x0032 },
+ { 0x005B, 0x0032 },
+ { 0x005C, 0x0032 }
+};
+
+static const FrameControl k2IngameShapeAnimDataDOS8FrameControl[4] = {
+ { 0x006D, 0x000C },
+ { 0x006E, 0x000C },
+ { 0x006F, 0x000C },
+ { 0x0070, 0x000C }
+};
+
+static const FrameControl k2IngameShapeAnimDataDOS9FrameControl[4] = {
+ { 0x0079, 0x0008 },
+ { 0x007A, 0x0008 },
+ { 0x007B, 0x0008 },
+ { 0x007C, 0x0008 }
+};
+
+static const FrameControl k2IngameShapeAnimDataDOS10FrameControl[4] = {
+ { 0x007E, 0x0008 },
+ { 0x007F, 0x0008 },
+ { 0x0080, 0x0008 },
+ { 0x0081, 0x0008 }
+};
+
+static const FrameControl k2IngameShapeAnimDataDOS11FrameControl[6] = {
+ { 0x0091, 0x01A4 },
+ { 0x0092, 0x0004 },
+ { 0x0093, 0x0004 },
+ { 0x0094, 0x0004 },
+ { 0x0093, 0x0004 },
+ { 0x0092, 0x0004 }
+};
+
+static const FrameControl k2IngameShapeAnimDataDOS12FrameControl[4] = {
+ { 0x0095, 0x0006 },
+ { 0x0096, 0x0006 },
+ { 0x0097, 0x0006 },
+ { 0x0098, 0x0006 }
+};
+
+static const FrameControl k2IngameShapeAnimDataDOS13FrameControl[4] = {
+ { 0x0099, 0x002D },
+ { 0x009A, 0x002D },
+ { 0x009B, 0x002D },
+ { 0x009C, 0x002D }
+};
+
+static const ItemAnimDefinition k2IngameShapeAnimDataDOS[14] = {
+ { 6, 12, k2IngameShapeAnimDataDOS0FrameControl },
+ { 2, 6, k2IngameShapeAnimDataDOS1FrameControl },
+ { 11, 6, k2IngameShapeAnimDataDOS2FrameControl },
+ { 28, 4, k2IngameShapeAnimDataDOS3FrameControl },
+ { 23, 4, k2IngameShapeAnimDataDOS4FrameControl },
+ { 22, 4, k2IngameShapeAnimDataDOS5FrameControl },
+ { 58, 4, k2IngameShapeAnimDataDOS6FrameControl },
+ { 26, 4, k2IngameShapeAnimDataDOS7FrameControl },
+ { 109, 4, k2IngameShapeAnimDataDOS8FrameControl },
+ { 121, 4, k2IngameShapeAnimDataDOS9FrameControl },
+ { 126, 4, k2IngameShapeAnimDataDOS10FrameControl },
+ { 145, 6, k2IngameShapeAnimDataDOS11FrameControl },
+ { 149, 4, k2IngameShapeAnimDataDOS12FrameControl },
+ { 153, 4, k2IngameShapeAnimDataDOS13FrameControl }
+};
+
+static const ItemAnimDefinitionProvider k2IngameShapeAnimDataDOSProvider = { ARRAYSIZE(k2IngameShapeAnimDataDOS), k2IngameShapeAnimDataDOS };
+
diff --git a/devtools/create_kyradat/resources/hof_dos_cd.h b/devtools/create_kyradat/resources/hof_dos_cd.h
new file mode 100644
index 0000000000..17c401c254
--- /dev/null
+++ b/devtools/create_kyradat/resources/hof_dos_cd.h
@@ -0,0 +1,1035 @@
+static const char *const k2SeqplayPakFilesDOSCD[6] = {
+ "INTROGEN.PAK",
+ "TALKENG.PAK",
+ "TALKFRE.PAK",
+ "TALKGER.PAK",
+ "VOC.PAK",
+ "INTROTLK.PAK"
+};
+
+static const StringListProvider k2SeqplayPakFilesDOSCDProvider = { ARRAYSIZE(k2SeqplayPakFilesDOSCD), k2SeqplayPakFilesDOSCD };
+
+static const byte k2SeqplayCreditsDOSCD[2792] = {
+ 0x0D, 0x0D, 0x02, 0x54, 0x48, 0x45, 0x20, 0x50,
+ 0x4C, 0x41, 0x59, 0x45, 0x52, 0x53, 0x0D, 0x0D,
+ 0x03, 0x5A, 0x61, 0x6E, 0x74, 0x68, 0x69, 0x61,
+ 0x20, 0x20, 0x20, 0x05, 0x04, 0x42, 0x4F, 0x4E,
+ 0x4E, 0x49, 0x45, 0x20, 0x4C, 0x59, 0x4E, 0x4E,
+ 0x20, 0x54, 0x4F, 0x55, 0x50, 0x53, 0x0D, 0x03,
+ 0x46, 0x61, 0x75, 0x6E, 0x20, 0x20, 0x20, 0x05,
+ 0x04, 0x45, 0x4C, 0x45, 0x4E, 0x41, 0x20, 0x46,
+ 0x45, 0x52, 0x52, 0x41, 0x4E, 0x54, 0x45, 0x0D,
+ 0x03, 0x4D, 0x61, 0x72, 0x6B, 0x6F, 0x20, 0x20,
+ 0x20, 0x05, 0x04, 0x45, 0x52, 0x49, 0x43, 0x20,
+ 0x52, 0x41, 0x4E, 0x44, 0x41, 0x4C, 0x4C, 0x0D,
+ 0x03, 0x4E, 0x61, 0x72, 0x72, 0x61, 0x74, 0x6F,
+ 0x72, 0x20, 0x20, 0x20, 0x05, 0x04, 0x48, 0x69,
+ 0x73, 0x20, 0x52, 0x6F, 0x79, 0x61, 0x6C, 0x20,
+ 0x48, 0x69, 0x67, 0x68, 0x6E, 0x65, 0x73, 0x73,
+ 0x0D, 0x05, 0x04, 0x42, 0x52, 0x41, 0x4E, 0x44,
+ 0x4F, 0x4E, 0x2C, 0x20, 0x4B, 0x69, 0x6E, 0x67,
+ 0x20, 0x6F, 0x66, 0x0D, 0x05, 0x04, 0x4B, 0x79,
+ 0x72, 0x61, 0x6E, 0x64, 0x69, 0x61, 0x2C, 0x20,
+ 0x44, 0x65, 0x66, 0x65, 0x6E, 0x64, 0x65, 0x72,
+ 0x20, 0x6F, 0x66, 0x0D, 0x05, 0x04, 0x74, 0x68,
+ 0x65, 0x20, 0x4B, 0x79, 0x72, 0x61, 0x67, 0x65,
+ 0x6D, 0x2C, 0x20, 0x56, 0x61, 0x6E, 0x71, 0x75,
+ 0x69, 0x73, 0x68, 0x65, 0x72, 0x0D, 0x05, 0x04,
+ 0x6F, 0x66, 0x20, 0x4D, 0x61, 0x6C, 0x63, 0x6F,
+ 0x6C, 0x6D, 0x2C, 0x20, 0x50, 0x61, 0x74, 0x72,
+ 0x6F, 0x6E, 0x20, 0x6F, 0x66, 0x0D, 0x05, 0x04,
+ 0x74, 0x68, 0x65, 0x20, 0x41, 0x72, 0x74, 0x73,
+ 0x2C, 0x20, 0x57, 0x65, 0x61, 0x72, 0x65, 0x72,
+ 0x20, 0x6F, 0x66, 0x20, 0x74, 0x68, 0x65, 0x0D,
+ 0x05, 0x04, 0x53, 0x61, 0x6E, 0x64, 0x61, 0x6C,
+ 0x2C, 0x20, 0x61, 0x6E, 0x64, 0x20, 0x4D, 0x61,
+ 0x6A, 0x6F, 0x72, 0x69, 0x74, 0x79, 0x0D, 0x05,
+ 0x04, 0x53, 0x74, 0x6F, 0x63, 0x6B, 0x20, 0x4F,
+ 0x77, 0x6E, 0x65, 0x72, 0x20, 0x61, 0x6E, 0x64,
+ 0x20, 0x43, 0x45, 0x4F, 0x20, 0x6F, 0x66, 0x0D,
+ 0x05, 0x04, 0x54, 0x69, 0x6D, 0x62, 0x65, 0x72,
+ 0x6D, 0x69, 0x73, 0x74, 0x20, 0x43, 0x61, 0x73,
+ 0x75, 0x61, 0x6C, 0x0D, 0x05, 0x04, 0x46, 0x6F,
+ 0x6F, 0x74, 0x77, 0x65, 0x61, 0x72, 0x2C, 0x20,
+ 0x49, 0x6E, 0x63, 0x2E, 0x0D, 0x03, 0x54, 0x68,
+ 0x65, 0x20, 0x48, 0x61, 0x6E, 0x64, 0x20, 0x20,
+ 0x20, 0x05, 0x04, 0x4D, 0x49, 0x43, 0x48, 0x41,
+ 0x45, 0x4C, 0x20, 0x4B, 0x55, 0x43, 0x41, 0x4E,
+ 0x0D, 0x0D, 0x0D, 0x02, 0x44, 0x41, 0x52, 0x4B,
+ 0x4D, 0x4F, 0x4F, 0x52, 0x20, 0x53, 0x57, 0x41,
+ 0x4D, 0x50, 0x0D, 0x0D, 0x03, 0x48, 0x65, 0x72,
+ 0x62, 0x20, 0x20, 0x20, 0x20, 0x05, 0x04, 0x43,
+ 0x48, 0x41, 0x52, 0x4C, 0x45, 0x53, 0x20, 0x4D,
+ 0x4F, 0x53, 0x48, 0x45, 0x52, 0x0D, 0x03, 0x42,
+ 0x72, 0x65, 0x75, 0x74, 0x68, 0x20, 0x20, 0x20,
+ 0x20, 0x05, 0x04, 0x42, 0x52, 0x49, 0x41, 0x4E,
+ 0x20, 0x53, 0x54, 0x52, 0x4F, 0x4D, 0x0D, 0x03,
+ 0x53, 0x77, 0x61, 0x6D, 0x70, 0x20, 0x52, 0x61,
+ 0x74, 0x20, 0x20, 0x20, 0x20, 0x05, 0x04, 0x45,
+ 0x52, 0x49, 0x43, 0x20, 0x4D, 0x41, 0x52, 0x54,
+ 0x49, 0x4E, 0x0D, 0x03, 0x44, 0x72, 0x61, 0x67,
+ 0x6F, 0x6E, 0x66, 0x6C, 0x79, 0x20, 0x20, 0x20,
+ 0x20, 0x05, 0x04, 0x43, 0x4C, 0x49, 0x46, 0x46,
+ 0x20, 0x4C, 0x41, 0x57, 0x52, 0x45, 0x4E, 0x43,
+ 0x45, 0x0D, 0x03, 0x46, 0x69, 0x73, 0x68, 0x65,
+ 0x72, 0x6D, 0x61, 0x6E, 0x20, 0x20, 0x20, 0x20,
+ 0x05, 0x04, 0x45, 0x52, 0x49, 0x43, 0x20, 0x4D,
+ 0x41, 0x52, 0x54, 0x49, 0x4E, 0x0D, 0x03, 0x4F,
+ 0x74, 0x68, 0x65, 0x72, 0x20, 0x46, 0x69, 0x73,
+ 0x68, 0x65, 0x72, 0x6D, 0x61, 0x6E, 0x20, 0x20,
+ 0x20, 0x20, 0x05, 0x04, 0x52, 0x41, 0x59, 0x20,
+ 0x46, 0x41, 0x56, 0x45, 0x52, 0x4F, 0x0D, 0x03,
+ 0x54, 0x6F, 0x61, 0x64, 0x20, 0x20, 0x20, 0x20,
+ 0x05, 0x04, 0x4D, 0x41, 0x52, 0x43, 0x55, 0x53,
+ 0x20, 0x56, 0x41, 0x55, 0x47, 0x48, 0x4E, 0x0D,
+ 0x03, 0x4F, 0x74, 0x68, 0x65, 0x72, 0x20, 0x54,
+ 0x6F, 0x61, 0x64, 0x20, 0x20, 0x20, 0x20, 0x05,
+ 0x04, 0x42, 0x49, 0x4C, 0x4C, 0x20, 0x43, 0x4F,
+ 0x4C, 0x4C, 0x49, 0x4E, 0x53, 0x0D, 0x03, 0x54,
+ 0x68, 0x65, 0x20, 0x48, 0x61, 0x6E, 0x64, 0x20,
+ 0x20, 0x20, 0x20, 0x05, 0x04, 0x4D, 0x41, 0x52,
+ 0x49, 0x41, 0x20, 0x44, 0x45, 0x4C, 0x20, 0x4D,
+ 0x41, 0x52, 0x20, 0x4C, 0x45, 0x47, 0x47, 0x0D,
+ 0x0D, 0x0D, 0x02, 0x4D, 0x4F, 0x52, 0x4E, 0x49,
+ 0x4E, 0x47, 0x4D, 0x49, 0x53, 0x54, 0x20, 0x56,
+ 0x41, 0x4C, 0x4C, 0x45, 0x59, 0x0D, 0x0D, 0x03,
+ 0x46, 0x61, 0x72, 0x6D, 0x65, 0x72, 0x20, 0x47,
+ 0x72, 0x65, 0x65, 0x6E, 0x62, 0x65, 0x72, 0x72,
+ 0x79, 0x20, 0x20, 0x20, 0x20, 0x05, 0x04, 0x45,
+ 0x52, 0x49, 0x43, 0x20, 0x4D, 0x41, 0x52, 0x54,
+ 0x49, 0x4E, 0x0D, 0x03, 0x47, 0x68, 0x6F, 0x73,
+ 0x74, 0x20, 0x20, 0x20, 0x20, 0x05, 0x04, 0x4D,
+ 0x41, 0x52, 0x43, 0x55, 0x53, 0x20, 0x56, 0x41,
+ 0x55, 0x47, 0x48, 0x4E, 0x0D, 0x03, 0x53, 0x63,
+ 0x61, 0x72, 0x65, 0x63, 0x72, 0x6F, 0x77, 0x20,
+ 0x20, 0x20, 0x20, 0x05, 0x04, 0x4D, 0x41, 0x52,
+ 0x43, 0x55, 0x53, 0x20, 0x56, 0x41, 0x55, 0x47,
+ 0x48, 0x4E, 0x0D, 0x03, 0x46, 0x61, 0x74, 0x20,
+ 0x47, 0x75, 0x61, 0x72, 0x64, 0x20, 0x20, 0x20,
+ 0x20, 0x05, 0x04, 0x4D, 0x49, 0x43, 0x48, 0x41,
+ 0x45, 0x4C, 0x20, 0x4C, 0x45, 0x47, 0x47, 0x0D,
+ 0x03, 0x53, 0x6B, 0x69, 0x6E, 0x6E, 0x79, 0x20,
+ 0x47, 0x75, 0x61, 0x72, 0x64, 0x20, 0x20, 0x20,
+ 0x20, 0x05, 0x04, 0x52, 0x49, 0x43, 0x4B, 0x20,
+ 0x22, 0x43, 0x4F, 0x43, 0x4F, 0x22, 0x20, 0x47,
+ 0x55, 0x53, 0x48, 0x0D, 0x03, 0x54, 0x68, 0x65,
+ 0x20, 0x48, 0x61, 0x6E, 0x64, 0x20, 0x20, 0x20,
+ 0x20, 0x05, 0x04, 0x4D, 0x49, 0x43, 0x48, 0x41,
+ 0x45, 0x4C, 0x20, 0x47, 0x52, 0x41, 0x59, 0x46,
+ 0x4F, 0x52, 0x44, 0x0D, 0x0D, 0x0D, 0x02, 0x54,
+ 0x4F, 0x57, 0x4E, 0x45, 0x20, 0x4F, 0x46, 0x20,
+ 0x48, 0x49, 0x47, 0x48, 0x4D, 0x4F, 0x4F, 0x4E,
+ 0x0D, 0x0D, 0x03, 0x53, 0x68, 0x65, 0x72, 0x69,
+ 0x66, 0x66, 0x20, 0x20, 0x20, 0x20, 0x05, 0x04,
+ 0x52, 0x41, 0x59, 0x20, 0x46, 0x41, 0x56, 0x45,
+ 0x52, 0x4F, 0x0D, 0x03, 0x43, 0x61, 0x70, 0x27,
+ 0x6E, 0x20, 0x42, 0x6F, 0x62, 0x20, 0x20, 0x20,
+ 0x20, 0x05, 0x04, 0x42, 0x52, 0x49, 0x41, 0x4E,
+ 0x20, 0x53, 0x54, 0x52, 0x4F, 0x4D, 0x0D, 0x03,
+ 0x4F, 0x63, 0x74, 0x6F, 0x70, 0x75, 0x73, 0x20,
+ 0x20, 0x20, 0x20, 0x05, 0x04, 0x43, 0x4C, 0x49,
+ 0x46, 0x46, 0x20, 0x4C, 0x41, 0x57, 0x52, 0x45,
+ 0x4E, 0x43, 0x45, 0x0D, 0x03, 0x50, 0x69, 0x72,
+ 0x61, 0x74, 0x65, 0x20, 0x20, 0x20, 0x20, 0x05,
+ 0x04, 0x44, 0x4F, 0x55, 0x47, 0x20, 0x42, 0x41,
+ 0x4B, 0x45, 0x52, 0x0D, 0x03, 0x4F, 0x74, 0x68,
+ 0x65, 0x72, 0x20, 0x50, 0x69, 0x72, 0x61, 0x74,
+ 0x65, 0x20, 0x20, 0x20, 0x20, 0x05, 0x04, 0x45,
+ 0x52, 0x49, 0x43, 0x20, 0x4D, 0x41, 0x52, 0x54,
+ 0x49, 0x4E, 0x0D, 0x03, 0x41, 0x6E, 0x6F, 0x74,
+ 0x68, 0x65, 0x72, 0x20, 0x50, 0x69, 0x72, 0x61,
+ 0x74, 0x65, 0x20, 0x20, 0x20, 0x20, 0x05, 0x04,
+ 0x45, 0x52, 0x49, 0x43, 0x20, 0x52, 0x41, 0x4E,
+ 0x44, 0x41, 0x4C, 0x4C, 0x0D, 0x03, 0x53, 0x71,
+ 0x75, 0x61, 0x77, 0x6B, 0x79, 0x20, 0x74, 0x68,
+ 0x65, 0x20, 0x50, 0x61, 0x72, 0x72, 0x6F, 0x74,
+ 0x20, 0x20, 0x20, 0x20, 0x05, 0x04, 0x43, 0x4C,
+ 0x49, 0x46, 0x46, 0x20, 0x4C, 0x41, 0x57, 0x52,
+ 0x45, 0x4E, 0x43, 0x45, 0x0D, 0x03, 0x53, 0x61,
+ 0x69, 0x6C, 0x6F, 0x72, 0x20, 0x20, 0x20, 0x20,
+ 0x05, 0x04, 0x54, 0x49, 0x4D, 0x20, 0x43, 0x4C,
+ 0x41, 0x52, 0x4B, 0x0D, 0x03, 0x4F, 0x74, 0x68,
+ 0x65, 0x72, 0x20, 0x53, 0x61, 0x69, 0x6C, 0x6F,
+ 0x72, 0x20, 0x20, 0x20, 0x20, 0x05, 0x04, 0x4D,
+ 0x41, 0x52, 0x43, 0x55, 0x53, 0x20, 0x56, 0x41,
+ 0x55, 0x47, 0x48, 0x4E, 0x0D, 0x03, 0x54, 0x68,
+ 0x65, 0x20, 0x48, 0x61, 0x6E, 0x64, 0x20, 0x20,
+ 0x20, 0x20, 0x05, 0x04, 0x4A, 0x45, 0x4E, 0x4E,
+ 0x59, 0x20, 0x4B, 0x55, 0x43, 0x41, 0x4E, 0x0D,
+ 0x0D, 0x0D, 0x02, 0x56, 0x4F, 0x4C, 0x43, 0x41,
+ 0x4E, 0x49, 0x41, 0x0D, 0x0D, 0x03, 0x4A, 0x65,
+ 0x73, 0x73, 0x69, 0x63, 0x61, 0x20, 0x20, 0x20,
+ 0x20, 0x05, 0x04, 0x4A, 0x55, 0x4C, 0x49, 0x45,
+ 0x20, 0x43, 0x48, 0x49, 0x52, 0x49, 0x4C, 0x41,
+ 0x0D, 0x03, 0x53, 0x6D, 0x61, 0x72, 0x6D, 0x79,
+ 0x20, 0x20, 0x20, 0x20, 0x05, 0x04, 0x44, 0x4F,
+ 0x55, 0x47, 0x20, 0x42, 0x41, 0x4B, 0x45, 0x52,
+ 0x0D, 0x03, 0x42, 0x75, 0x72, 0x65, 0x61, 0x75,
+ 0x63, 0x72, 0x61, 0x74, 0x20, 0x20, 0x20, 0x20,
+ 0x05, 0x04, 0x45, 0x52, 0x49, 0x43, 0x20, 0x52,
+ 0x41, 0x4E, 0x44, 0x41, 0x4C, 0x4C, 0x0D, 0x03,
+ 0x42, 0x75, 0x72, 0x65, 0x61, 0x75, 0x63, 0x72,
+ 0x61, 0x74, 0x72, 0x65, 0x73, 0x73, 0x20, 0x20,
+ 0x20, 0x20, 0x05, 0x04, 0x4A, 0x55, 0x4C, 0x49,
+ 0x45, 0x20, 0x42, 0x41, 0x4C, 0x53, 0x41, 0x4D,
+ 0x4F, 0x0D, 0x03, 0x4D, 0x61, 0x20, 0x20, 0x20,
+ 0x20, 0x05, 0x04, 0x44, 0x45, 0x4E, 0x49, 0x53,
+ 0x45, 0x20, 0x53, 0x43, 0x48, 0x41, 0x46, 0x45,
+ 0x52, 0x0D, 0x03, 0x50, 0x61, 0x20, 0x20, 0x20,
+ 0x20, 0x05, 0x04, 0x4B, 0x45, 0x4E, 0x4E, 0x45,
+ 0x54, 0x48, 0x20, 0x4A, 0x2E, 0x20, 0x4B, 0x55,
+ 0x43, 0x41, 0x4E, 0x0D, 0x03, 0x54, 0x68, 0x65,
+ 0x20, 0x48, 0x61, 0x6E, 0x64, 0x20, 0x20, 0x20,
+ 0x20, 0x05, 0x04, 0x52, 0x41, 0x4D, 0x49, 0x4E,
+ 0x20, 0x46, 0x41, 0x54, 0x48, 0x49, 0x45, 0x0D,
+ 0x0D, 0x0D, 0x02, 0x45, 0x4E, 0x43, 0x48, 0x41,
+ 0x4E, 0x54, 0x45, 0x44, 0x20, 0x46, 0x4F, 0x52,
+ 0x45, 0x53, 0x54, 0x0D, 0x0D, 0x03, 0x4B, 0x6E,
+ 0x69, 0x67, 0x68, 0x74, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x05, 0x04, 0x45, 0x52, 0x49, 0x43, 0x20,
+ 0x4D, 0x41, 0x52, 0x54, 0x49, 0x4E, 0x0D, 0x03,
+ 0x50, 0x65, 0x74, 0x72, 0x69, 0x66, 0x69, 0x65,
+ 0x64, 0x20, 0x54, 0x72, 0x65, 0x65, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x05, 0x04, 0x44, 0x4F, 0x55,
+ 0x47, 0x20, 0x42, 0x41, 0x4B, 0x45, 0x52, 0x0D,
+ 0x03, 0x55, 0x6E, 0x69, 0x6F, 0x6E, 0x20, 0x53,
+ 0x71, 0x75, 0x69, 0x72, 0x72, 0x65, 0x6C, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x05, 0x04, 0x54, 0x49,
+ 0x4D, 0x20, 0x43, 0x4C, 0x41, 0x52, 0x4B, 0x0D,
+ 0x03, 0x4D, 0x79, 0x73, 0x74, 0x69, 0x63, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x05, 0x04, 0x43, 0x48,
+ 0x41, 0x52, 0x4C, 0x45, 0x53, 0x20, 0x4D, 0x4F,
+ 0x53, 0x48, 0x45, 0x52, 0x0D, 0x03, 0x4F, 0x74,
+ 0x68, 0x65, 0x72, 0x20, 0x4D, 0x79, 0x73, 0x74,
+ 0x69, 0x63, 0x20, 0x20, 0x20, 0x20, 0x20, 0x05,
+ 0x04, 0x43, 0x4F, 0x4E, 0x4E, 0x45, 0x52, 0x20,
+ 0x46, 0x52, 0x45, 0x46, 0x46, 0x20, 0x43, 0x4F,
+ 0x43, 0x48, 0x52, 0x41, 0x4E, 0x0D, 0x03, 0x54,
+ 0x68, 0x65, 0x20, 0x48, 0x61, 0x6E, 0x64, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x05, 0x04, 0x4C, 0x59,
+ 0x4E, 0x44, 0x41, 0x20, 0x57, 0x41, 0x53, 0x4B,
+ 0x4F, 0x4D, 0x0D, 0x0D, 0x0D, 0x02, 0x41, 0x4C,
+ 0x50, 0x49, 0x4E, 0x49, 0x41, 0x0D, 0x0D, 0x03,
+ 0x41, 0x62, 0x6F, 0x6D, 0x69, 0x6E, 0x61, 0x62,
+ 0x6C, 0x65, 0x20, 0x53, 0x6E, 0x6F, 0x77, 0x6D,
+ 0x61, 0x6E, 0x20, 0x20, 0x20, 0x20, 0x20, 0x05,
+ 0x04, 0x44, 0x4F, 0x55, 0x47, 0x20, 0x42, 0x41,
+ 0x4B, 0x45, 0x52, 0x0D, 0x03, 0x4D, 0x6F, 0x6D,
+ 0x6D, 0x79, 0x20, 0x20, 0x20, 0x20, 0x20, 0x05,
+ 0x04, 0x44, 0x45, 0x4E, 0x49, 0x53, 0x45, 0x20,
+ 0x53, 0x43, 0x48, 0x41, 0x46, 0x45, 0x52, 0x0D,
+ 0x03, 0x42, 0x61, 0x62, 0x79, 0x20, 0x41, 0x6C,
+ 0x62, 0x65, 0x72, 0x74, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x05, 0x04, 0x54, 0x48, 0x45, 0x4F, 0x44,
+ 0x4F, 0x52, 0x45, 0x20, 0x4D, 0x4F, 0x52, 0x52,
+ 0x49, 0x53, 0x0D, 0x03, 0x48, 0x75, 0x6E, 0x74,
+ 0x65, 0x72, 0x20, 0x20, 0x20, 0x20, 0x20, 0x05,
+ 0x04, 0x42, 0x49, 0x4C, 0x4C, 0x20, 0x43, 0x4F,
+ 0x4C, 0x4C, 0x49, 0x4E, 0x53, 0x0D, 0x03, 0x4F,
+ 0x74, 0x68, 0x65, 0x72, 0x20, 0x48, 0x75, 0x6E,
+ 0x74, 0x65, 0x72, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x05, 0x04, 0x42, 0x4F, 0x42, 0x20, 0x42, 0x4C,
+ 0x4F, 0x4D, 0x47, 0x52, 0x45, 0x4E, 0x0D, 0x03,
+ 0x46, 0x6F, 0x6F, 0x74, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x05, 0x04, 0x53, 0x50, 0x45, 0x45, 0x44,
+ 0x59, 0x20, 0x44, 0x41, 0x57, 0x4E, 0x20, 0x48,
+ 0x55, 0x4E, 0x54, 0x5A, 0x49, 0x4E, 0x47, 0x45,
+ 0x52, 0x0D, 0x03, 0x53, 0x74, 0x75, 0x6E, 0x74,
+ 0x20, 0x48, 0x61, 0x6E, 0x64, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x05, 0x04, 0x44, 0x41, 0x4E, 0x49,
+ 0x45, 0x4C, 0x20, 0x4B, 0x55, 0x43, 0x41, 0x4E,
+ 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D,
+ 0x02, 0x54, 0x48, 0x45, 0x20, 0x48, 0x41, 0x4E,
+ 0x44, 0x20, 0x4F, 0x46, 0x20, 0x46, 0x41, 0x54,
+ 0x45, 0x0D, 0x02, 0x54, 0x45, 0x41, 0x4D, 0x20,
+ 0x43, 0x44, 0x0D, 0x0D, 0x0D, 0x0D, 0x02, 0x43,
+ 0x6F, 0x64, 0x65, 0x6A, 0x61, 0x6D, 0x6D, 0x65,
+ 0x72, 0x73, 0x0D, 0x02, 0x4D, 0x49, 0x4B, 0x45,
+ 0x20, 0x61, 0x6E, 0x64, 0x20, 0x4D, 0x49, 0x4B,
+ 0x45, 0x0D, 0x0D, 0x02, 0x56, 0x6F, 0x63, 0x61,
+ 0x6C, 0x20, 0x44, 0x69, 0x72, 0x65, 0x63, 0x74,
+ 0x69, 0x6F, 0x6E, 0x20, 0x62, 0x79, 0x0D, 0x02,
+ 0x4A, 0x4F, 0x45, 0x20, 0x4B, 0x55, 0x43, 0x41,
+ 0x4E, 0x0D, 0x0D, 0x02, 0x44, 0x69, 0x67, 0x69,
+ 0x74, 0x61, 0x6C, 0x20, 0x53, 0x61, 0x6D, 0x70,
+ 0x6C, 0x69, 0x6E, 0x67, 0x20, 0x62, 0x79, 0x0D,
+ 0x02, 0x50, 0x41, 0x54, 0x20, 0x43, 0x4F, 0x4C,
+ 0x4C, 0x49, 0x4E, 0x53, 0x20, 0x61, 0x6E, 0x64,
+ 0x20, 0x44, 0x57, 0x49, 0x47, 0x48, 0x54, 0x20,
+ 0x4F, 0x4B, 0x41, 0x48, 0x41, 0x52, 0x41, 0x0D,
+ 0x0D, 0x02, 0x41, 0x75, 0x64, 0x69, 0x6F, 0x20,
+ 0x44, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F,
+ 0x6E, 0x20, 0x62, 0x79, 0x0D, 0x02, 0x50, 0x41,
+ 0x55, 0x4C, 0x20, 0x4D, 0x55, 0x44, 0x52, 0x41,
+ 0x0D, 0x0D, 0x02, 0x52, 0x65, 0x63, 0x6F, 0x72,
+ 0x64, 0x65, 0x64, 0x20, 0x61, 0x6E, 0x64, 0x20,
+ 0x45, 0x6E, 0x67, 0x69, 0x6E, 0x65, 0x65, 0x72,
+ 0x65, 0x64, 0x20, 0x62, 0x79, 0x0D, 0x02, 0x54,
+ 0x4F, 0x54, 0x4F, 0x20, 0x5A, 0x41, 0x52, 0x41,
+ 0x20, 0x61, 0x74, 0x20, 0x4D, 0x69, 0x64, 0x69,
+ 0x57, 0x6F, 0x72, 0x6B, 0x73, 0x0D, 0x0D, 0x02,
+ 0x53, 0x70, 0x65, 0x63, 0x69, 0x61, 0x6C, 0x20,
+ 0x54, 0x65, 0x63, 0x68, 0x6E, 0x6F, 0x2D, 0x57,
+ 0x69, 0x7A, 0x61, 0x72, 0x64, 0x72, 0x79, 0x20,
+ 0x62, 0x79, 0x0D, 0x02, 0x53, 0x43, 0x4F, 0x54,
+ 0x54, 0x20, 0x42, 0x4F, 0x57, 0x45, 0x4E, 0x2C,
+ 0x20, 0x44, 0x41, 0x56, 0x49, 0x44, 0x20, 0x44,
+ 0x45, 0x54, 0x54, 0x4D, 0x45, 0x52, 0x2C, 0x0D,
+ 0x02, 0x61, 0x6E, 0x64, 0x20, 0x4A, 0x4F, 0x45,
+ 0x20, 0x42, 0x4F, 0x53, 0x54, 0x49, 0x43, 0x0D,
+ 0x0D, 0x02, 0x53, 0x75, 0x70, 0x65, 0x72, 0x76,
+ 0x69, 0x73, 0x69, 0x6E, 0x67, 0x20, 0x50, 0x72,
+ 0x6F, 0x64, 0x75, 0x63, 0x65, 0x72, 0x0D, 0x02,
+ 0x52, 0x49, 0x43, 0x4B, 0x20, 0x47, 0x55, 0x53,
+ 0x48, 0x0D, 0x0D, 0x02, 0x50, 0x72, 0x6F, 0x64,
+ 0x75, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x20, 0x41,
+ 0x73, 0x73, 0x69, 0x73, 0x74, 0x61, 0x6E, 0x74,
+ 0x0D, 0x02, 0x44, 0x41, 0x56, 0x49, 0x44, 0x20,
+ 0x50, 0x4F, 0x4B, 0x4F, 0x52, 0x4E, 0x59, 0x0D,
+ 0x0D, 0x02, 0x50, 0x72, 0x6F, 0x64, 0x75, 0x63,
+ 0x74, 0x20, 0x43, 0x6F, 0x6F, 0x72, 0x64, 0x69,
+ 0x6E, 0x61, 0x74, 0x6F, 0x72, 0x0D, 0x02, 0x4A,
+ 0x45, 0x46, 0x46, 0x20, 0x5A, 0x49, 0x45, 0x4C,
+ 0x0D, 0x0D, 0x02, 0x51, 0x75, 0x61, 0x6C, 0x69,
+ 0x74, 0x79, 0x20, 0x41, 0x73, 0x73, 0x75, 0x72,
+ 0x61, 0x6E, 0x63, 0x65, 0x0D, 0x02, 0x47, 0x4C,
+ 0x45, 0x4E, 0x4E, 0x20, 0x22, 0x47, 0x4C, 0x45,
+ 0x4E, 0x4E, 0x42, 0x4F, 0x22, 0x20, 0x53, 0x50,
+ 0x45, 0x52, 0x52, 0x59, 0x0D, 0x02, 0x42, 0x52,
+ 0x41, 0x44, 0x20, 0x22, 0x53, 0x54, 0x49, 0x4E,
+ 0x47, 0x22, 0x20, 0x52, 0x4F, 0x42, 0x45, 0x52,
+ 0x54, 0x53, 0x0D, 0x02, 0x43, 0x48, 0x41, 0x44,
+ 0x20, 0x53, 0x4F, 0x41, 0x52, 0x45, 0x53, 0x0D,
+ 0x02, 0x43, 0x48, 0x52, 0x49, 0x53, 0x20, 0x4D,
+ 0x63, 0x46, 0x41, 0x52, 0x4C, 0x41, 0x4E, 0x44,
+ 0x0D, 0x02, 0x43, 0x48, 0x52, 0x49, 0x53, 0x20,
+ 0x22, 0x44, 0x4F, 0x4F, 0x4D, 0x22, 0x20, 0x52,
+ 0x55, 0x42, 0x59, 0x4F, 0x52, 0x0D, 0x02, 0x44,
+ 0x41, 0x56, 0x45, 0x20, 0x4D, 0x41, 0x58, 0x45,
+ 0x59, 0x0D, 0x02, 0x4A, 0x45, 0x46, 0x46, 0x20,
+ 0x42, 0x55, 0x43, 0x43, 0x45, 0x4C, 0x4C, 0x41,
+ 0x54, 0x4F, 0x0D, 0x02, 0x4A, 0x45, 0x53, 0x53,
+ 0x45, 0x20, 0x22, 0x4C, 0x41, 0x52, 0x47, 0x45,
+ 0x59, 0x22, 0x20, 0x43, 0x4C, 0x45, 0x4D, 0x49,
+ 0x54, 0x0D, 0x02, 0x4A, 0x4F, 0x48, 0x4E, 0x20,
+ 0x53, 0x57, 0x45, 0x45, 0x4E, 0x59, 0x0D, 0x02,
+ 0x4A, 0x4F, 0x4E, 0x20, 0x57, 0x49, 0x4C, 0x4C,
+ 0x49, 0x41, 0x4D, 0x53, 0x0D, 0x02, 0x4B, 0x45,
+ 0x4E, 0x4E, 0x45, 0x54, 0x48, 0x20, 0x22, 0x45,
+ 0x58, 0x54, 0x45, 0x52, 0x4D, 0x49, 0x4E, 0x41,
+ 0x54, 0x4F, 0x52, 0x22, 0x20, 0x44, 0x55, 0x4E,
+ 0x4E, 0x45, 0x0D, 0x02, 0x4D, 0x49, 0x4B, 0x45,
+ 0x20, 0x22, 0x44, 0x41, 0x52, 0x4B, 0x4E, 0x49,
+ 0x47, 0x48, 0x54, 0x22, 0x20, 0x4C, 0x49, 0x47,
+ 0x48, 0x54, 0x4E, 0x45, 0x52, 0x0D, 0x02, 0x4D,
+ 0x49, 0x54, 0x43, 0x48, 0x20, 0x46, 0x45, 0x4C,
+ 0x44, 0x4D, 0x41, 0x4E, 0x0D, 0x02, 0x50, 0x41,
+ 0x55, 0x4C, 0x20, 0x53, 0x48, 0x4F, 0x45, 0x4E,
+ 0x45, 0x52, 0x0D, 0x02, 0x53, 0x43, 0x4F, 0x54,
+ 0x54, 0x20, 0x4D, 0x41, 0x4E, 0x4E, 0x49, 0x4E,
+ 0x47, 0x0D, 0x02, 0x54, 0x49, 0x4D, 0x20, 0x22,
+ 0x44, 0x41, 0x52, 0x4B, 0x57, 0x4F, 0x4C, 0x46,
+ 0x22, 0x20, 0x46, 0x52, 0x49, 0x54, 0x5A, 0x0D,
+ 0x02, 0x54, 0x52, 0x4F, 0x59, 0x20, 0x4C, 0x45,
+ 0x4F, 0x4E, 0x41, 0x52, 0x44, 0x0D, 0x0D, 0x02,
+ 0x53, 0x70, 0x65, 0x63, 0x69, 0x61, 0x6C, 0x20,
+ 0x54, 0x68, 0x61, 0x6E, 0x6B, 0x73, 0x20, 0x74,
+ 0x6F, 0x0D, 0x02, 0x42, 0x41, 0x52, 0x42, 0x41,
+ 0x52, 0x41, 0x20, 0x52, 0x49, 0x43, 0x48, 0x4D,
+ 0x41, 0x4E, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D,
+ 0x0D, 0x0D, 0x02, 0x41, 0x6E, 0x79, 0x20, 0x72,
+ 0x65, 0x73, 0x65, 0x6D, 0x62, 0x6C, 0x61, 0x6E,
+ 0x63, 0x65, 0x20, 0x69, 0x6E, 0x20, 0x74, 0x68,
+ 0x69, 0x73, 0x20, 0x67, 0x61, 0x6D, 0x65, 0x20,
+ 0x74, 0x6F, 0x20, 0x0D, 0x02, 0x70, 0x65, 0x72,
+ 0x73, 0x6F, 0x6E, 0x73, 0x20, 0x6F, 0x72, 0x20,
+ 0x61, 0x70, 0x70, 0x65, 0x6E, 0x64, 0x61, 0x67,
+ 0x65, 0x73, 0x2C, 0x20, 0x6C, 0x69, 0x76, 0x69,
+ 0x6E, 0x67, 0x20, 0x6F, 0x72, 0x0D, 0x02, 0x64,
+ 0x65, 0x61, 0x64, 0x2C, 0x20, 0x69, 0x73, 0x20,
+ 0x70, 0x75, 0x72, 0x65, 0x6C, 0x79, 0x20, 0x63,
+ 0x6F, 0x69, 0x6E, 0x63, 0x69, 0x64, 0x65, 0x6E,
+ 0x74, 0x61, 0x6C, 0x2E, 0x0D, 0x0D, 0x02, 0x43,
+ 0x6F, 0x70, 0x79, 0x72, 0x69, 0x67, 0x68, 0x74,
+ 0x20, 0x28, 0x43, 0x29, 0x20, 0x31, 0x39, 0x39,
+ 0x34, 0x2C, 0x20, 0x57, 0x65, 0x73, 0x74, 0x77,
+ 0x6F, 0x6F, 0x64, 0x20, 0x53, 0x74, 0x75, 0x64,
+ 0x69, 0x6F, 0x73, 0x2C, 0x20, 0x49, 0x6E, 0x63,
+ 0x2E, 0x0D, 0x02, 0x41, 0x6C, 0x6C, 0x20, 0x72,
+ 0x69, 0x67, 0x68, 0x74, 0x73, 0x20, 0x72, 0x65,
+ 0x73, 0x65, 0x72, 0x76, 0x65, 0x64, 0x2E, 0x0D,
+ 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x00
+};
+
+static const ByteProvider k2SeqplayCreditsDOSCDProvider = { ARRAYSIZE(k2SeqplayCreditsDOSCD), k2SeqplayCreditsDOSCD };
+
+static const char *const k2SeqplayCreditsSpecialDOSCD[2] = {
+ "Codejammers",
+ "MIKE and MIKE"
+};
+
+static const StringListProvider k2SeqplayCreditsSpecialDOSCDProvider = { ARRAYSIZE(k2SeqplayCreditsSpecialDOSCD), k2SeqplayCreditsSpecialDOSCD };
+
+static const char *const k2SeqplaySfxFilesDOSCD[48] = {
+ "eintro1",
+ "eintro2",
+ "eintro3",
+ "eintro4",
+ "eintro5",
+ "eintro6",
+ "eintro7",
+ "eintro8",
+ "eintro9",
+ "eintro10",
+ "eintro11",
+ "eintro12",
+ "eglow",
+ "0000210",
+ "0000130",
+ "0000180",
+ "0000160",
+ "asong",
+ "crowcaw",
+ "eyerub2",
+ "pluck3",
+ "rodnreel",
+ "frog1",
+ "scavmov2",
+ "lambmom3",
+ "lambkid1",
+ "thunder2",
+ "thunder3",
+ "wind6",
+ "h2odrop2",
+ "gasleak",
+ "polgulp1",
+ "hndslap1",
+ "burp1",
+ "0000220",
+ "0000230",
+ "0000250",
+ "0000260",
+ "0000270",
+ "0000280",
+ "0000290",
+ "0000300",
+ "0000310",
+ "0000320",
+ "0000330",
+ "scream1",
+ "theend",
+ ""
+};
+
+static const StringListProvider k2SeqplaySfxFilesDOSCDProvider = { ARRAYSIZE(k2SeqplaySfxFilesDOSCD), k2SeqplaySfxFilesDOSCD };
+
+static const HoFSequence k2SeqplaySeqDataDOSCDSeq[16] = {
+ { 0x0002, "", "virgin.cps", 4, 0, 0xFFFF, 0xFFFF, 0x0000, 0x0001, 0x0064, 0, 0, 0x001E },
+ { 0x0001, "westwood.wsa", "", 4, 0, 0xFFFF, 0xFFFF, 0x0000, 0x0012, 0x0006, 0, 0, 0x00A0 },
+ { 0x0001, "title.wsa", "", 4, 0, 0xFFFF, 0xFFFF, 0x0000, 0x001A, 0x0006, 0, 0, 0x000A },
+ { 0x0002, "", "over.cps", 4, 0, 0xFFFF, 0xFFFF, 0x0000, 0x0001, 0x0E10, 0, 0, 0x001E },
+ { 0x0002, "", "library.cps", 4, 0, 0xFFFF, 0xFFFF, 0x0000, 0x0001, 0x0E10, 0, 0, 0x001E },
+ { 0x0002, "", "hand.cps", 4, 0, 0xFFFF, 0xFFFF, 0x0000, 0x0001, 0x0E10, 0, 0, 0x005A },
+ { 0x0001, "point.wsa", "", 4, 8, 0xFFFF, 0xFFFF, 0x0000, 0x0026, 0x0007, 0, 0, 0x00C8 },
+ { 0x0001, "zanfaun.wsa", "", 4, 0, 0xFFFF, 0xFFFF, 0x0000, 0x0033, 0x0010, 0, 0, 0x00F0 },
+ { 0x0001, "funters.wsa", "", 4, 0, 0xFFFF, 0xFFFF, 0x0000, 0x001B, 0x000C, 0, 0, 0x001E },
+ { 0x0001, "ferb.wsa", "", 4, 0, 0xFFFF, 0xFFFF, 0x0000, 0x001B, 0x0010, 0, 0, 0x001E },
+ { 0x0001, "fish.wsa", "", 4, 0, 0xFFFF, 0xFFFF, 0x0000, 0x0038, 0x000C, 0, 0, 0x001E },
+ { 0x0001, "fheep.wsa", "", 4, 0, 0xFFFF, 0xFFFF, 0x0000, 0x000B, 0x000C, 0, 0, 0x001E },
+ { 0x0001, "farmer.wsa", "", 4, 0, 0xFFFF, 0xFFFF, 0x0000, 0x0016, 0x000C, 0, 0, 0x0064 },
+ { 0x0001, "fuards.wsa", "", 4, 0, 0xFFFF, 0xFFFF, 0x0000, 0x0018, 0x000E, 0, 0, 0x001E },
+ { 0x0001, "firates.wsa", "", 4, 0, 0xFFFF, 0xFFFF, 0x0000, 0x0025, 0x000C, 0, 0, 0x001E },
+ { 0x0001, "frash.wsa", "", 4, 0, 0xFFFF, 0xFFFF, 0x0000, 0x000C, 0x000A, 0, 0, 0x0154 }
+};
+
+static const FrameControl k2SeqplaySeqDataDOSCDSeqNestedControl7[18] = {
+ { 0, 10 },
+ { 1, 10 },
+ { 2, 10 },
+ { 3, 10 },
+ { 4, 10 },
+ { 5, 10 },
+ { 6, 10 },
+ { 7, 10 },
+ { 8, 10 },
+ { 9, 10 },
+ { 8, 10 },
+ { 7, 10 },
+ { 6, 10 },
+ { 5, 40 },
+ { 4, 10 },
+ { 3, 10 },
+ { 2, 10 },
+ { 1, 10 }
+};
+
+static const FrameControl k2SeqplaySeqDataDOSCDSeqNestedControl10[17] = {
+ { 0, 6 },
+ { 1, 6 },
+ { 2, 6 },
+ { 3, 6 },
+ { 4, 6 },
+ { 5, 6 },
+ { 6, 6 },
+ { 7, 6 },
+ { 8, 6 },
+ { 9, 6 },
+ { 10, 6 },
+ { 11, 6 },
+ { 11, 12 },
+ { 12, 12 },
+ { 13, 12 },
+ { 12, 12 },
+ { 11, 12 }
+};
+
+static const FrameControl k2SeqplaySeqDataDOSCDSeqNestedControl11[9] = {
+ { 0, 6 },
+ { 1, 6 },
+ { 2, 6 },
+ { 3, 6 },
+ { 4, 6 },
+ { 3, 6 },
+ { 4, 6 },
+ { 5, 64 },
+ { 5, 6 }
+};
+
+static const FrameControl k2SeqplaySeqDataDOSCDSeqNestedControl12[16] = {
+ { 0, 6 },
+ { 1, 6 },
+ { 0, 6 },
+ { 1, 6 },
+ { 0, 6 },
+ { 1, 6 },
+ { 0, 6 },
+ { 1, 6 },
+ { 0, 6 },
+ { 1, 6 },
+ { 0, 6 },
+ { 1, 6 },
+ { 0, 6 },
+ { 1, 6 },
+ { 0, 6 },
+ { 1, 6 }
+};
+
+static const FrameControl k2SeqplaySeqDataDOSCDSeqNestedControl13[5] = {
+ { 0, 6 },
+ { 1, 6 },
+ { 2, 6 },
+ { 1, 6 },
+ { 0, 1 }
+};
+
+static const FrameControl k2SeqplaySeqDataDOSCDSeqNestedControl14[8] = {
+ { 0, 6 },
+ { 1, 6 },
+ { 2, 6 },
+ { 3, 6 },
+ { 4, 6 },
+ { 3, 6 },
+ { 2, 6 },
+ { 1, 6 }
+};
+
+static const HoFNestedSequence k2SeqplaySeqDataDOSCDSeqNested[15] = {
+ { 0x000C, "figgle.wsa", 0, 3, 60, 0, 0, 0, NULL, 0, 0 },
+ { 0x0008, "over1.wsa", 0, 10, 10, 0, 0, 0, NULL, 0, 0 },
+ { 0x0008, "over2.wsa", 0, 11, 9, 0, 0, 0, NULL, 0, 0 },
+ { 0x0008, "forest.wsa", 0, 22, 6, 0, 0, 0, NULL, 1, 3 },
+ { 0x0008, "dragon.wsa", 0, 11, 6, 0, 0, 0, NULL, 2, 0 },
+ { 0x0002, "darm.wsa", 0, 19, 9, 0, 0, 0, NULL, 4, 0 },
+ { 0x0002, "library.wsa", 0, 33, 9, 0, 0, 0, NULL, 4, 0 },
+ { 0x002A, "library.wsa", 0, 18, 9, 0, 0, ARRAYSIZE(k2SeqplaySeqDataDOSCDSeqNestedControl7), k2SeqplaySeqDataDOSCDSeqNestedControl7, 0, 0 },
+ { 0x000A, "marco.wsa", 0, 37, 9, 0, 0, 0, NULL, 4, 0 },
+ { 0x0002, "hand1a.wsa", 0, 34, 9, 0, 0, 0, NULL, 0, 0 },
+ { 0x002A, "hand1b.wsa", 0, 16, 9, 0, 0, ARRAYSIZE(k2SeqplaySeqDataDOSCDSeqNestedControl10), k2SeqplaySeqDataDOSCDSeqNestedControl10, 0, 0 },
+ { 0x002A, "hand1c.wsa", 0, 9, 9, 0, 0, ARRAYSIZE(k2SeqplaySeqDataDOSCDSeqNestedControl11), k2SeqplaySeqDataDOSCDSeqNestedControl11, 0, 0 },
+ { 0x002C, "hand2.wsa", 0, 2, 9, 0, 0, ARRAYSIZE(k2SeqplaySeqDataDOSCDSeqNestedControl12), k2SeqplaySeqDataDOSCDSeqNestedControl12, 5, 0 },
+ { 0x002C, "hand3.wsa", 0, 4, 9, 0, 0, ARRAYSIZE(k2SeqplaySeqDataDOSCDSeqNestedControl13), k2SeqplaySeqDataDOSCDSeqNestedControl13, 5, 0 },
+ { 0x002C, "hand4.wsa", 0, 8, 9, 0, 0, ARRAYSIZE(k2SeqplaySeqDataDOSCDSeqNestedControl14), k2SeqplaySeqDataDOSCDSeqNestedControl14, 5, 0 }
+};
+
+static const HoFSequenceProvider k2SeqplaySeqDataDOSCDProvider = { ARRAYSIZE(k2SeqplaySeqDataDOSCDSeq), k2SeqplaySeqDataDOSCDSeq, ARRAYSIZE(k2SeqplaySeqDataDOSCDSeqNested), k2SeqplaySeqDataDOSCDSeqNested };
+
+static const char *const k2SeqplayIntroTracksDOSCD[1] = {
+ "k2intro"
+};
+
+static const StringListProvider k2SeqplayIntroTracksDOSCDProvider = { ARRAYSIZE(k2SeqplayIntroTracksDOSCD), k2SeqplayIntroTracksDOSCD };
+
+static const char *const k2SeqplayFinaleTracksDOSCD[1] = {
+ "k2finale"
+};
+
+static const StringListProvider k2SeqplayFinaleTracksDOSCDProvider = { ARRAYSIZE(k2SeqplayFinaleTracksDOSCD), k2SeqplayFinaleTracksDOSCD };
+
+static const char *const k2IngameSfxFilesDOSCD[178] = {
+ "ALCHEMY2",
+ "BIGSLAM",
+ "BITE1",
+ "BLINK1",
+ "BOING1",
+ "BUBBLE1",
+ "BUBBLE2",
+ "BURP1",
+ "BUTTON6",
+ "CAULDRN2",
+ "CHEST",
+ "CLOTHES1",
+ "CROCLAF4",
+ "CRY1",
+ "CRY2",
+ "DOORMTCL",
+ "DOORMTOP",
+ "DOORWDCL",
+ "DOORWDOP",
+ "DRUM1",
+ "DRUM2",
+ "DRUM3",
+ "DRUM4",
+ "DRUM5",
+ "DRUM6",
+ "DRUM7",
+ "EYERUB2",
+ "FALL1",
+ "FALL3",
+ "FNGRSNAP",
+ "FORMSPL1",
+ "FROG1",
+ "FROGMIX2",
+ "GASLEAK",
+ "GLOWY1",
+ "GOOD3",
+ "GOOD5",
+ "GROWTWIG",
+ "H2ODROP2",
+ "H2OPLANT",
+ "HACHUCKD",
+ "HAYFALL2",
+ "HAYSRCH4",
+ "ICECUBE",
+ "KEYOPEN",
+ "LAMBKID1",
+ "LAMBMOM3",
+ "LAUGH1",
+ "LAUGH3",
+ "LAUGH4",
+ "LIZLISP",
+ "MAKESPL1",
+ "MSTDOOM1",
+ "ORCMOVE",
+ "PLUCK3",
+ "POLGULP1",
+ "PORTCUL",
+ "POURH20",
+ "RIP2",
+ "RODNREEL",
+ "ROWBOAT1",
+ "RUCKUS1",
+ "SCAVMOV2",
+ "SCRATCH1",
+ "SNAKSPEL",
+ "SNEEZE1",
+ "SNIFF1",
+ "SNOREIN3",
+ "SNOROUT",
+ "SPLASH1",
+ "SQUEAK1",
+ "SQUEAK2",
+ "SQUEAK3",
+ "SQUISH1",
+ "SQUISH2",
+ "STEAM",
+ "STEAM3",
+ "STRETCH1",
+ "SWING",
+ "TREZA1",
+ "TURNPAG2",
+ "TWIGSNAP",
+ "UGH1",
+ "WHEEL4",
+ "WINGS1",
+ "YAWN1",
+ "ZOOM5",
+ "FILBOTL",
+ "H2OPOUR1",
+ "JAILDOR1",
+ "JAILLOK1",
+ "CASHREG1",
+ "SWISH1",
+ "TURNBOAT",
+ "CLAPPING",
+ "CRUNCH1",
+ "WHEEL6",
+ "LITEMAG",
+ "SHELDOWN",
+ "SHELSLID",
+ "ZOW2",
+ "ZANLOOP1",
+ "SCREECH2",
+ "PANTING",
+ "TREX1",
+ "TREX5",
+ "TREX3",
+ "QUAKE",
+ "WRINGH2O",
+ "SPLAT2",
+ "OCEAN1",
+ "SPLAT3",
+ "CROCLAF5",
+ "FALL5",
+ "ZCMON2",
+ "ZWAIT3",
+ "ZNO2",
+ "CROCLAF7",
+ "CRICKET1",
+ "FIREBRTH",
+ "COW2",
+ "SAP2",
+ "PMTLHI",
+ "FROGSIGH",
+ "CRICEND",
+ "CRY3",
+ "CRY4",
+ "SHROOM1",
+ "DRIP1",
+ "SWIM4",
+ "CUCKOO2",
+ "PUNCH1",
+ "SNORT3",
+ "STAMPER2",
+ "WALLFALL",
+ "WOODFAL1",
+ "SPRAY1",
+ "OHNO1",
+ "YAHOO1",
+ "YIPEE1",
+ "WIND1",
+ "WIND3",
+ "WIND6",
+ "BLOWUP2",
+ "BOATLOP2",
+ "ZGIGGL1",
+ "ZCOUGH1",
+ "CRUSH",
+ "ALARM3",
+ "APPLEAT",
+ "BABYCRY1",
+ "BABYLAF1",
+ "BABYLIK1",
+ "GEARMX3",
+ "GLASBRK2",
+ "HANDKIL1",
+ "HNDSLAP1",
+ "ICEPICK1",
+ "KISS3",
+ "LOLIFAL1",
+ "PAGEBURN",
+ "PRTYHORN",
+ "SCREAM1",
+ "SPARKHIT",
+ "SPRING2",
+ "ZANLAND1",
+ "BIGBOW",
+ "BOWFORM",
+ "BULBHIT",
+ "EYELITE",
+ "ROOFBOW",
+ "FBIGFOT1",
+ "BIGFOOT4",
+ "DORSTNCL",
+ "CROWCAW",
+ "THUNDER2",
+ "THUNDER3",
+ "TOILET"
+};
+
+static const StringListProvider k2IngameSfxFilesDOSCDProvider = { ARRAYSIZE(k2IngameSfxFilesDOSCD), k2IngameSfxFilesDOSCD };
+
+static const byte k2IngameSfxIndexDOSCD[856] = {
+ 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00,
+ 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00,
+ 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00,
+ 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00,
+ 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00,
+ 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00,
+ 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00,
+ 0xFF, 0xFF, 0x00, 0x00, 0x0B, 0x00, 0x00, 0x00,
+ 0x37, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00,
+ 0x47, 0x00, 0x05, 0x00, 0x22, 0x00, 0x00, 0x00,
+ 0x1F, 0x00, 0x00, 0x00, 0x51, 0x00, 0x00, 0x00,
+ 0x25, 0x00, 0x00, 0x00, 0x26, 0x00, 0x00, 0x00,
+ 0x36, 0x00, 0x05, 0x00, 0x07, 0x00, 0x00, 0x00,
+ 0x3F, 0x00, 0x00, 0x00, 0x54, 0x00, 0x00, 0x00,
+ 0x45, 0x00, 0x00, 0x00, 0x4D, 0x00, 0x00, 0x00,
+ 0x7B, 0x00, 0x00, 0x00, 0x32, 0x00, 0x00, 0x00,
+ 0xFF, 0xFF, 0x00, 0x00, 0x3C, 0x00, 0x00, 0x00,
+ 0x3C, 0x00, 0x00, 0x00, 0x3B, 0x00, 0x00, 0x00,
+ 0x4E, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00,
+ 0x04, 0x00, 0x00, 0x00, 0x43, 0x00, 0x04, 0x00,
+ 0x56, 0x00, 0x00, 0x00, 0x40, 0x00, 0x05, 0x00,
+ 0x40, 0x00, 0x05, 0x00, 0xFF, 0xFF, 0x00, 0x00,
+ 0x64, 0x00, 0x00, 0x00, 0x4C, 0x00, 0x00, 0x00,
+ 0x12, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00,
+ 0x37, 0x00, 0x00, 0x00, 0x42, 0x00, 0x00, 0x00,
+ 0x1D, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00,
+ 0x49, 0x00, 0x00, 0x00, 0x52, 0x00, 0x00, 0x00,
+ 0x0A, 0x00, 0x00, 0x00, 0x4A, 0x00, 0x00, 0x00,
+ 0x09, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00,
+ 0x0D, 0x00, 0x00, 0x00, 0x0E, 0x00, 0x00, 0x00,
+ 0x53, 0x00, 0x00, 0x00, 0x35, 0x00, 0x00, 0x00,
+ 0x0C, 0x00, 0x00, 0x00, 0x4B, 0x00, 0x00, 0x00,
+ 0x21, 0x00, 0x00, 0x00, 0x53, 0x00, 0x00, 0x00,
+ 0x32, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00,
+ 0x1B, 0x00, 0x00, 0x00, 0x1C, 0x00, 0x00, 0x00,
+ 0x13, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00,
+ 0x15, 0x00, 0x00, 0x00, 0x16, 0x00, 0x00, 0x00,
+ 0x17, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00,
+ 0x19, 0x00, 0x00, 0x00, 0x0A, 0x00, 0x00, 0x00,
+ 0x1A, 0x00, 0x00, 0x00, 0x41, 0x00, 0x00, 0x00,
+ 0x77, 0x00, 0x00, 0x00, 0x3D, 0x00, 0x00, 0x00,
+ 0x55, 0x00, 0x00, 0x00, 0x29, 0x00, 0x00, 0x00,
+ 0x2A, 0x00, 0x00, 0x00, 0x2E, 0x00, 0x00, 0x00,
+ 0x2D, 0x00, 0x00, 0x00, 0x27, 0x00, 0x05, 0x00,
+ 0x25, 0x00, 0x00, 0x00, 0x46, 0x00, 0x05, 0x00,
+ 0x60, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00,
+ 0x34, 0x00, 0x00, 0x00, 0x12, 0x00, 0x00, 0x00,
+ 0x4F, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00,
+ 0x0F, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00,
+ 0x0A, 0x00, 0x00, 0x00, 0x78, 0x00, 0x06, 0x00,
+ 0x50, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
+ 0x33, 0x00, 0x06, 0x00, 0x3A, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00,
+ 0x1E, 0x00, 0x00, 0x00, 0x79, 0x00, 0x00, 0x00,
+ 0x23, 0x00, 0x05, 0x00, 0x24, 0x00, 0x05, 0x00,
+ 0x3E, 0x00, 0x00, 0x00, 0x2C, 0x00, 0x00, 0x00,
+ 0x48, 0x00, 0x05, 0x00, 0x20, 0x00, 0x00, 0x00,
+ 0x63, 0x00, 0x00, 0x00, 0x62, 0x00, 0x00, 0x00,
+ 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00,
+ 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00,
+ 0x7A, 0x00, 0x00, 0x00, 0x5E, 0x00, 0x00, 0x00,
+ 0x5B, 0x00, 0x00, 0x00, 0x5A, 0x00, 0x00, 0x00,
+ 0x10, 0x00, 0x00, 0x00, 0x59, 0x00, 0x00, 0x00,
+ 0x5D, 0x00, 0x00, 0x00, 0x5C, 0x00, 0x00, 0x00,
+ 0x57, 0x00, 0x00, 0x00, 0x2F, 0x00, 0x00, 0x00,
+ 0x30, 0x00, 0x00, 0x00, 0x31, 0x00, 0x00, 0x00,
+ 0x61, 0x00, 0x05, 0x00, 0x58, 0x00, 0x00, 0x00,
+ 0x5F, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00,
+ 0x65, 0x00, 0x00, 0x00, 0x66, 0x00, 0x00, 0x00,
+ 0x67, 0x00, 0x00, 0x00, 0x68, 0x00, 0x05, 0x00,
+ 0x69, 0x00, 0x05, 0x00, 0x6A, 0x00, 0x05, 0x00,
+ 0x01, 0x00, 0x05, 0x00, 0x6B, 0x00, 0x00, 0x00,
+ 0x6C, 0x00, 0x00, 0x00, 0x6D, 0x00, 0x00, 0x00,
+ 0x90, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00,
+ 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00,
+ 0x6F, 0x00, 0x00, 0x00, 0x70, 0x00, 0x00, 0x00,
+ 0x71, 0x00, 0x00, 0x00, 0x72, 0x00, 0x00, 0x00,
+ 0x73, 0x00, 0x00, 0x00, 0x74, 0x00, 0x00, 0x00,
+ 0x75, 0x00, 0x00, 0x00, 0x76, 0x00, 0x00, 0x00,
+ 0x7F, 0x00, 0x06, 0x00, 0x7D, 0x00, 0x00, 0x00,
+ 0x7E, 0x00, 0x00, 0x00, 0x7C, 0x00, 0x00, 0x00,
+ 0x80, 0x00, 0x00, 0x00, 0x81, 0x00, 0x00, 0x00,
+ 0xFF, 0xFF, 0x00, 0x00, 0x85, 0x00, 0x00, 0x00,
+ 0x84, 0x00, 0x00, 0x00, 0x83, 0x00, 0x00, 0x00,
+ 0x82, 0x00, 0x05, 0x00, 0x86, 0x00, 0x00, 0x00,
+ 0x88, 0x00, 0x00, 0x00, 0x89, 0x00, 0x00, 0x00,
+ 0x8A, 0x00, 0x00, 0x00, 0x8B, 0x00, 0x00, 0x00,
+ 0x87, 0x00, 0x00, 0x00, 0x8C, 0x00, 0x00, 0x00,
+ 0x8D, 0x00, 0x00, 0x00, 0x8E, 0x00, 0x00, 0x00,
+ 0x8F, 0x00, 0x00, 0x00, 0x90, 0x00, 0x00, 0x00,
+ 0x91, 0x00, 0x00, 0x00, 0x92, 0x00, 0x00, 0x00,
+ 0x93, 0x00, 0x05, 0x00, 0x94, 0x00, 0x00, 0x00,
+ 0x5F, 0x00, 0x00, 0x00, 0x96, 0x00, 0x05, 0x00,
+ 0x97, 0x00, 0x00, 0x00, 0x98, 0x00, 0x04, 0x00,
+ 0x99, 0x00, 0x00, 0x00, 0x9A, 0x00, 0x00, 0x00,
+ 0x9B, 0x00, 0x00, 0x00, 0x9C, 0x00, 0x00, 0x00,
+ 0x9D, 0x00, 0x00, 0x00, 0x9E, 0x00, 0x00, 0x00,
+ 0x9F, 0x00, 0x00, 0x00, 0xA0, 0x00, 0x00, 0x00,
+ 0xA1, 0x00, 0x00, 0x00, 0xA2, 0x00, 0x00, 0x00,
+ 0xA3, 0x00, 0x00, 0x00, 0xA4, 0x00, 0x00, 0x00,
+ 0xA5, 0x00, 0x00, 0x00, 0xA6, 0x00, 0x00, 0x00,
+ 0xA7, 0x00, 0x00, 0x00, 0xA8, 0x00, 0x00, 0x00,
+ 0xA9, 0x00, 0x00, 0x00, 0xAA, 0x00, 0x00, 0x00,
+ 0xAB, 0x00, 0x00, 0x00, 0xAC, 0x00, 0x00, 0x00,
+ 0xAD, 0x00, 0x00, 0x00, 0xAE, 0x00, 0x05, 0x00,
+ 0xAF, 0x00, 0x00, 0x00, 0xB0, 0x00, 0x00, 0x00,
+ 0xB1, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00
+};
+
+static const ByteProvider k2IngameSfxIndexDOSCDProvider = { ARRAYSIZE(k2IngameSfxIndexDOSCD), k2IngameSfxIndexDOSCD };
+
+static const char *const k2IngameTracksDOSCD[15] = {
+ "K2TEST1",
+ "K2TEST2",
+ "K2TEST3",
+ "K2TEST4",
+ "K2TEST5",
+ "K2TEST6",
+ "K2TEST7",
+ "K2TEST8",
+ "K2TEST9",
+ "K2TEST10",
+ "K2TEST11",
+ "K2TEST12",
+ "K2TEST13",
+ "K2TEST14",
+ "K2TEST15"
+};
+
+static const StringListProvider k2IngameTracksDOSCDProvider = { ARRAYSIZE(k2IngameTracksDOSCD), k2IngameTracksDOSCD };
+
+static const byte k2IngameTalkObjIndexDOSCD[132] = {
+ 0x20, 0x43, 0x6F, 0x72, 0x72, 0x75, 0x70, 0x74,
+ 0x21, 0x21, 0x21, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x12, 0x00, 0x18, 0x00, 0x26, 0x00, 0x41, 0x00,
+ 0x00, 0x00, 0x01, 0x00, 0x02, 0x00, 0x03, 0x00,
+ 0x04, 0x00, 0x05, 0x00, 0x06, 0x00, 0x07, 0x00,
+ 0x08, 0x00, 0x09, 0x00, 0x0A, 0x00, 0x11, 0x00,
+ 0x12, 0x00, 0x13, 0x00, 0x14, 0x00, 0x15, 0x00,
+ 0x2A, 0x00, 0x17, 0x00, 0x18, 0x00, 0x19, 0x00,
+ 0x1A, 0x00, 0x1B, 0x00, 0x1C, 0x00, 0x1D, 0x00,
+ 0x1E, 0x00, 0x1F, 0x00, 0x20, 0x00, 0x21, 0x00,
+ 0x22, 0x00, 0x23, 0x00, 0x24, 0x00, 0x30, 0x00,
+ 0x35, 0x00, 0x36, 0x00, 0x37, 0x00, 0x39, 0x00,
+ 0x3A, 0x00, 0x3B, 0x00, 0x3D, 0x00, 0x3E, 0x00,
+ 0x3F, 0x00, 0x40, 0x00, 0x41, 0x00, 0x42, 0x00,
+ 0x43, 0x00, 0x44, 0x00, 0x45, 0x00, 0x46, 0x00,
+ 0x47, 0x00, 0x5B, 0x00, 0x69, 0x00, 0x6E, 0x00,
+ 0x72, 0x00, 0x76, 0x00
+};
+
+static const ByteProvider k2IngameTalkObjIndexDOSCDProvider = { ARRAYSIZE(k2IngameTalkObjIndexDOSCD), k2IngameTalkObjIndexDOSCD };
+
+static const FrameControl k2IngameShapeAnimDataDOSCD0FrameControl[12] = {
+ { 0x0006, 0x00F0 },
+ { 0x002A, 0x000E },
+ { 0x002B, 0x000E },
+ { 0x002C, 0x000E },
+ { 0x0006, 0x000E },
+ { 0x002A, 0x000E },
+ { 0x002B, 0x000E },
+ { 0x002C, 0x000E },
+ { 0x0006, 0x000E },
+ { 0x002A, 0x000E },
+ { 0x002B, 0x000E },
+ { 0x002C, 0x000E }
+};
+
+static const FrameControl k2IngameShapeAnimDataDOSCD1FrameControl[6] = {
+ { 0x0002, 0x012C },
+ { 0x002D, 0x012C },
+ { 0x002E, 0x012C },
+ { 0x002F, 0x012C },
+ { 0x002E, 0x012C },
+ { 0x002D, 0x012C }
+};
+
+static const FrameControl k2IngameShapeAnimDataDOSCD2FrameControl[6] = {
+ { 0x000B, 0x0258 },
+ { 0x0030, 0x0005 },
+ { 0x0031, 0x0005 },
+ { 0x0032, 0x0005 },
+ { 0x0031, 0x0005 },
+ { 0x0030, 0x0005 }
+};
+
+static const FrameControl k2IngameShapeAnimDataDOSCD3FrameControl[4] = {
+ { 0x001C, 0x0014 },
+ { 0x004E, 0x0014 },
+ { 0x004F, 0x0014 },
+ { 0x0050, 0x0014 }
+};
+
+static const FrameControl k2IngameShapeAnimDataDOSCD4FrameControl[4] = {
+ { 0x0017, 0x0007 },
+ { 0x0051, 0x0007 },
+ { 0x0052, 0x0007 },
+ { 0x0053, 0x0007 }
+};
+
+static const FrameControl k2IngameShapeAnimDataDOSCD5FrameControl[4] = {
+ { 0x0016, 0x0014 },
+ { 0x0054, 0x0014 },
+ { 0x0055, 0x0014 },
+ { 0x0056, 0x0014 }
+};
+
+static const FrameControl k2IngameShapeAnimDataDOSCD6FrameControl[4] = {
+ { 0x003A, 0x003C },
+ { 0x0057, 0x003C },
+ { 0x0058, 0x003C },
+ { 0x0059, 0x003C }
+};
+
+static const FrameControl k2IngameShapeAnimDataDOSCD7FrameControl[4] = {
+ { 0x001A, 0x0032 },
+ { 0x005A, 0x0032 },
+ { 0x005B, 0x0032 },
+ { 0x005C, 0x0032 }
+};
+
+static const FrameControl k2IngameShapeAnimDataDOSCD8FrameControl[4] = {
+ { 0x006D, 0x000C },
+ { 0x006E, 0x000C },
+ { 0x006F, 0x000C },
+ { 0x0070, 0x000C }
+};
+
+static const FrameControl k2IngameShapeAnimDataDOSCD9FrameControl[4] = {
+ { 0x0079, 0x0008 },
+ { 0x007A, 0x0008 },
+ { 0x007B, 0x0008 },
+ { 0x007C, 0x0008 }
+};
+
+static const FrameControl k2IngameShapeAnimDataDOSCD10FrameControl[4] = {
+ { 0x007E, 0x0008 },
+ { 0x007F, 0x0008 },
+ { 0x0080, 0x0008 },
+ { 0x0081, 0x0008 }
+};
+
+static const FrameControl k2IngameShapeAnimDataDOSCD11FrameControl[6] = {
+ { 0x0091, 0x01A4 },
+ { 0x0092, 0x0004 },
+ { 0x0093, 0x0004 },
+ { 0x0094, 0x0004 },
+ { 0x0093, 0x0004 },
+ { 0x0092, 0x0004 }
+};
+
+static const FrameControl k2IngameShapeAnimDataDOSCD12FrameControl[4] = {
+ { 0x0095, 0x0006 },
+ { 0x0096, 0x0006 },
+ { 0x0097, 0x0006 },
+ { 0x0098, 0x0006 }
+};
+
+static const FrameControl k2IngameShapeAnimDataDOSCD13FrameControl[4] = {
+ { 0x0099, 0x002D },
+ { 0x009A, 0x002D },
+ { 0x009B, 0x002D },
+ { 0x009C, 0x002D }
+};
+
+static const ItemAnimDefinition k2IngameShapeAnimDataDOSCD[14] = {
+ { 6, 12, k2IngameShapeAnimDataDOSCD0FrameControl },
+ { 2, 6, k2IngameShapeAnimDataDOSCD1FrameControl },
+ { 11, 6, k2IngameShapeAnimDataDOSCD2FrameControl },
+ { 28, 4, k2IngameShapeAnimDataDOSCD3FrameControl },
+ { 23, 4, k2IngameShapeAnimDataDOSCD4FrameControl },
+ { 22, 4, k2IngameShapeAnimDataDOSCD5FrameControl },
+ { 58, 4, k2IngameShapeAnimDataDOSCD6FrameControl },
+ { 26, 4, k2IngameShapeAnimDataDOSCD7FrameControl },
+ { 109, 4, k2IngameShapeAnimDataDOSCD8FrameControl },
+ { 121, 4, k2IngameShapeAnimDataDOSCD9FrameControl },
+ { 126, 4, k2IngameShapeAnimDataDOSCD10FrameControl },
+ { 145, 6, k2IngameShapeAnimDataDOSCD11FrameControl },
+ { 149, 4, k2IngameShapeAnimDataDOSCD12FrameControl },
+ { 153, 4, k2IngameShapeAnimDataDOSCD13FrameControl }
+};
+
+static const ItemAnimDefinitionProvider k2IngameShapeAnimDataDOSCDProvider = { ARRAYSIZE(k2IngameShapeAnimDataDOSCD), k2IngameShapeAnimDataDOSCD };
+
diff --git a/devtools/create_kyradat/resources/hof_dos_cd_english.h b/devtools/create_kyradat/resources/hof_dos_cd_english.h
new file mode 100644
index 0000000000..88db113a4a
--- /dev/null
+++ b/devtools/create_kyradat/resources/hof_dos_cd_english.h
@@ -0,0 +1,128 @@
+static const char *const k2SeqplayStringsDOSCDEnglish[104] = {
+ "Kyrandia is disappearing!",
+ "Rock by rock...",
+ "...and tree by tree.",
+ "Kyrandia ceases to exist!",
+ "The Royal Mystics are baffled.",
+ "Every reference has been consulted.",
+ "Even Marko and his new valet have been allowed into the conference.",
+ "Luckily, the Hand was experienced in these matters.",
+ "And finally a plan was approved...",
+ "...that required a magic Anchor Stone...",
+ "...to be retrieved from the center of the world.",
+ "Zanthia, youngest of the Kyrandian Mystics, has been selected to retrieve the Stone.",
+ "Thank you for playing The Hand of Fate.",
+ "This should be enough blueberries to open a portal to the center of the world.",
+ " DUMMY STRING... ",
+ " DUMMY STRING... ",
+ "Hey! All my equipment has been stolen!",
+ " DUMMY STRING... ",
+ "If they think I'm going to walk all the way down there, they're nuts!",
+ " DUMMY STRING... ",
+ " DUMMY STRING... ",
+ "Hurry up Faun!",
+ "Boy, that was a close call!",
+ "You said it pal. I, for one, am never going hunting again!",
+ "Ribbit.",
+ "How many times do I have to tell you? You're a toad.",
+ "Oh no! We're out of cheese!",
+ "Let's try this earwax. It's orange.",
+ "Mommy, when do I get the ivy?",
+ "Get out of here, shoo!",
+ "You cut, and I'll choose.",
+ "No. You cut and I'll choose.",
+ "I still say it was derivative drivel.",
+ "Aw, you still wouldn't recognize iambic pentameter if it bit you on the butt!",
+ "Executive Producer",
+ "Brett W. Sperry",
+ "Direction & Design",
+ "Rick Gush",
+ "Lead Programmer",
+ "Michael Legg",
+ "Art Management",
+ "Louis Castle",
+ "Joseph B. Hewitt IV",
+ "Lead Artist",
+ "Rick Parks",
+ "Additional Coding by",
+ "Philip W. Gorrow",
+ "Mike Grayford",
+ "Mark McCubbin",
+ "Artists",
+ "Cameron Chun",
+ "Cary Averett",
+ "Cindy Chinn",
+ "Elie Arabian",
+ "Fei Cheng",
+ "Ferby Miguel",
+ "Frank Mendeola",
+ "Jack Martin",
+ "Jerry Moore",
+ "DUMMY STRING... ",
+ "Judith Peterson",
+ "Larry Miller",
+ "Lenny Lee",
+ "Louise Sandoval",
+ "Ren Olsen",
+ "Music & Sounds by",
+ "Paul Mudra",
+ "Frank Klepacki",
+ "Dwight Okahara",
+ "Pat Collins",
+ "Quality Assurance by",
+ "Glenn Sperry",
+ "Michael Lightner",
+ "William Foster",
+ "Jesse Clemit",
+ "Jeff Fillhaber",
+ "Manual, Package Design",
+ "& Fulfillment",
+ "Eydie Laramore",
+ "Lisa Marcinko",
+ "Lauren Rifkin",
+ "Congratulations!",
+ "Thank you for playing The Hand of Fate!",
+ "Guest Coding",
+ "Producer Liaison",
+ "Scott Duckett",
+ "Irvine Testers",
+ "Chris McFarland",
+ "Paul Moore",
+ "Chad Soares",
+ "Jared Brinkley",
+ "Jon Willliams",
+ "Chris Toft",
+ "Joe Kucan's Hair by",
+ "Theodore A. Morris",
+ "Load a game",
+ "Introduction",
+ "Start a new game",
+ "Exit the game",
+ "Special Thanks to",
+ "Sake Joe Bostic-san",
+ "Tim Fritz",
+ "Kenny Dunne",
+ "Thank you for playing \"The Hand of Fate.\"\n"
+};
+
+static const StringListProvider k2SeqplayStringsDOSCDEnglishProvider = { ARRAYSIZE(k2SeqplayStringsDOSCDEnglish), k2SeqplayStringsDOSCDEnglish };
+
+static const char *const k2SeqplayTlkFilesDOSCDEnglish[14] = {
+ "EINTRO1",
+ "EINTRO2",
+ "EINTRO3",
+ "EINTRO4",
+ "EINTRO5",
+ "EINTRO6",
+ "EINTRO7",
+ "EINTRO8",
+ "EINTRO9",
+ "EINTRO10",
+ "EINTRO11",
+ "EINTRO12",
+ "EGLOW",
+ ""
+};
+
+static const StringListProvider k2SeqplayTlkFilesDOSCDEnglishProvider = { ARRAYSIZE(k2SeqplayTlkFilesDOSCDEnglish), k2SeqplayTlkFilesDOSCDEnglish };
+
diff --git a/devtools/create_kyradat/resources/hof_dos_cd_french.h b/devtools/create_kyradat/resources/hof_dos_cd_french.h
new file mode 100644
index 0000000000..fbfdbe9984
--- /dev/null
+++ b/devtools/create_kyradat/resources/hof_dos_cd_french.h
@@ -0,0 +1,128 @@
+static const char *const k2SeqplayStringsDOSCDFrench[104] = {
+ "Kyrandia est en train de dispara""\x8C""tre!",
+ "Pierre apr""\x8A""s pierre...",
+ "Arbre apr""\x8A""s arbre.",
+ "Kyrandia va cesser d'exister!",
+ "Les Grands Mystiques Royaux sont perplexes...",
+ "Ils ont consult""\x82"" tous les ouvrages!",
+ "M""\x88""me Marko et son nouveau valet ont ""\x82""t""\x82"" admis dans la conf""\x82""rence.",
+ "Heureusement, la Main connaissait bien ce sujet.",
+ "Un plan fut finalement approuv""\x82""...",
+ "Il n""\x82""cessitait une Ancre de Pierre magique...",
+ "Qu'il fallait aller chercher au centre du monde!",
+ "Zanthia, la plus jeune des Mystiques de Kyrandia, a ""\x82""t""\x82"" choisie pour r""\x82""cup""\x82""rer cette pierre.",
+ "Merci d'avoir jou""\x82"" ""\x85"" The Hand of Fate.",
+ "Je devrais avoir assez de myrtilles pour ouvrir un portail vers le centre du monde...",
+ " DUMMY STRING... ",
+ " DUMMY STRING... ",
+ "H""\x82""! On m'a vol""\x82"" tout mon ""\x82""quipement!",
+ " DUMMY STRING... ",
+ "S'ils croient que je vais y aller ""\x85"" pied, ils peuvent toujours courir!",
+ " DUMMY STRING... ",
+ " DUMMY STRING... ",
+ "Vite, Faun!",
+ "Mon vieux, nous l'avons ""\x82""chapp""\x82"" belle!",
+ "Tu l'as dit! En ce qui me concerne, j'abandonne la chasse!",
+ "Crooa.",
+ "Combien de fois faudra-t-il que je te le dise? Tu n'es qu'un sale crapaud!",
+ "Oh non! Nous n'avons plus de fromage!",
+ "On n'a qu'""\x85"" essayer ""\x87""a. C'est orange.",
+ "Maman, quand est-ce qu'on mangera du lierre?",
+ "Sortez d'ici! Allez! Filez!",
+ "Tu coupes, et je choisis.",
+ "Non. TU coupes et JE choisis.",
+ "Je maintiens que c'""\x82""tait du radotage sans int""\x82""r""\x88""t.",
+ "Tu ne reconna""\x8C""trais toujours pas un po""\x8A""me ""\x8B""ambique, m""\x88""me s'il te mordait les fesses!",
+ "Producteur Ex""\x82""cutif",
+ "Brett W. Sperry",
+ "Con""\x87""u et Dirig""\x82"" par",
+ "Rick Gush",
+ "Programmeur Principal",
+ "Michael Legg",
+ "Direction Artistique",
+ "Louis Castle",
+ "Joseph B. Hewitt IV",
+ "Graphiste principal",
+ "Rick Parks",
+ "Programmation acrobatie",
+ "Philip W. Gorrow",
+ "Michael Grayford",
+ "Mark McCubbin",
+ "Graphistes",
+ "Cameron Chun",
+ "Cary Averett",
+ "Cindy Chinn",
+ "Elie Arabian",
+ "Fei Cheng",
+ "Ferby Miguel",
+ "Frank Mendeola",
+ "Jack Martin",
+ "Jerry Moore",
+ "DUMMY STRING... ",
+ "Judith Peterson",
+ "Larry Miller",
+ "Lenny Lee",
+ "Louise Sandoval",
+ "Ren Olsen",
+ "Musique et sons",
+ "Paul Mudra",
+ "Frank Klepacki",
+ "Dwight Okahara",
+ "Pat Collins",
+ "Tests de Qualit""\x82",
+ "Glenn Sperry",
+ "Michael Lightner",
+ "William Foster",
+ "Jesse Clemit",
+ "Pierre Cardin",
+ "Conception du Manuel,",
+ "Emballage & Ex""\x82""cution",
+ "Eydie Laramore",
+ "Lisa Marcinko",
+ "Lauren Rifkin",
+ "F""\x82""licitations!",
+ "Merci d'avoir jou""\x82"" ""\x85"" The Hand of Fate!",
+ "Programmeur invit""\x82",
+ "Coordination Production",
+ "Scott Duckett",
+ "Testeurs - Irvine",
+ "Chris McFarland",
+ "Paul Moore",
+ "Chad Soares",
+ "Jared Brinkley",
+ "Jon Williams",
+ "Chris Toft",
+ "Adaptation fran""\x87""aise",
+ "Art Of Words",
+ "Charger une partie",
+ "Introduction",
+ "Nouvelle Partie",
+ "Quitter le jeu",
+ "Remerciements sp""\x82""ciaux",
+ "Sake Joe Bostic-san",
+ "Tim Fritz",
+ "Kenny Dunne",
+ "Merci d'avoir jou""\x82"" ""\x85""\"The Hand of Fate.\"\n"
+};
+
+static const StringListProvider k2SeqplayStringsDOSCDFrenchProvider = { ARRAYSIZE(k2SeqplayStringsDOSCDFrench), k2SeqplayStringsDOSCDFrench };
+
+static const char *const k2SeqplayTlkFilesDOSCDFrench[14] = {
+ "FINTRO1",
+ "FINTRO2",
+ "FINTRO3",
+ "FINTRO4",
+ "FINTRO5",
+ "FINTRO6",
+ "FINTRO7",
+ "FINTRO8",
+ "FINTRO9",
+ "FINTRO10",
+ "FINTRO11",
+ "FINTRO12",
+ "FGLOW",
+ ""
+};
+
+static const StringListProvider k2SeqplayTlkFilesDOSCDFrenchProvider = { ARRAYSIZE(k2SeqplayTlkFilesDOSCDFrench), k2SeqplayTlkFilesDOSCDFrench };
+
diff --git a/devtools/create_kyradat/resources/hof_dos_cd_german.h b/devtools/create_kyradat/resources/hof_dos_cd_german.h
new file mode 100644
index 0000000000..e6120040d2
--- /dev/null
+++ b/devtools/create_kyradat/resources/hof_dos_cd_german.h
@@ -0,0 +1,128 @@
+static const char *const k2SeqplayStringsDOSCDGerman[104] = {
+ "Kyrandia l""\x94""st sich auf!",
+ "Stein f""\x81""r Stein...",
+ "...und Baum f""\x81""r Baum.",
+ "Kyrandia h""\x94""rt auf zu existieren!",
+ "Die k""\x94""niglichen Mystiker sind verzweifelt.",
+ "Jede Informationsquelle wurde zu Rate gezogen.",
+ "Sogar Marko und sein neuer Kammerdiener durften den Konferenzen beiwohnen.",
+ "Gl""\x81""cklicherweise, hatte die Hand Erfahrungen in solchen Dingen.",
+ "Und letztendlich konnte man sich auf einen Plan einigen.",
+ "Zu dessen Durchf""\x81""hrung es eines magischen Ankerstein bedarf...",
+ "...der aus der Mitte der Welt geholt werden mu""\xE1"".",
+ "Zanthia, j""\x81""ngste der kyrandianischen Mystiker, wurde ausgew""\x84""hlt, um diesen Stein zu holen.",
+ "Vielen Dank, da""\xE1"" Du die Hand des Schicksals spielst.",
+ "Dies sollten gen""\x81""gend Blaubeeren sein, um ein Portal zur Mitte der Erde zu ""\x94""ffnen.",
+ " DUMMY STRING... ",
+ " DUMMY STRING... ",
+ "Hey! Meine gesamte Ausr""\x81""stung wurde gestohlen!",
+ " DUMMY STRING... ",
+ "Wenn die glauben, da""\xE1"" ich den ganzen Weg nach unten laufe, haben die sich aber in den Finger geschnitten!",
+ " DUMMY STRING... ",
+ " DUMMY STRING... ",
+ "Beeile Dich, Faun!",
+ "Junge, Junge das war aber knapp!",
+ "Da hast Du recht, Kumpel. Ich werde nie wieder jagen gehen!",
+ "Quuaaak.",
+ "Wie oft mu""\xE1"" ich es Dir noch sagen? Du bist eine Kr""\x94""te.",
+ "Oh nein! Der K""\x84""se ist alle!",
+ "Versuchen wir es mal mit dem Ohrenwachs. Es ist orange.",
+ "Mama, wann bekomme ich das Efeu?",
+ "Husch husch, komm hier raus!",
+ "Du schneidest, und ich suche aus.",
+ "Nein. Du schneidest und ich werde aussuchen.",
+ "Ich bin immernoch der\rMeinung, da""\xE1"" er es nur\rso dahingeplappert hat.",
+ "Argh, Du w""\x81""rdest ein jambisches Pentameter nicht erkennen, wenn es Dich in den Hintern bei""\xE1""en w""\x81""rde!",
+ "Executive Producer",
+ "Brett W. Sperry",
+ "Director & Designer",
+ "Rick Gush",
+ "Lead Programmer",
+ "Michael Legg",
+ "Art Management",
+ "Louis Castle",
+ "Joseph B. Hewitt IV",
+ "Lead Artist",
+ "Rick Parks",
+ "Additional Coding by",
+ "Philip W. Gorrow",
+ "Michael Grayford",
+ "Mark McCubbin",
+ "Artists",
+ "Cameron Chun",
+ "Cary Averett",
+ "Cindy Chinn",
+ "Elie Arabian",
+ "Fei Cheng",
+ "Ferby Miguel",
+ "Frank Mendeola",
+ "Jack Martin",
+ "Jerry Moore",
+ "DUMMY STRING... ",
+ "Judith Peterson",
+ "Larry Miller",
+ "Lenny Lee",
+ "Louise Sandoval",
+ "Ren Olsen",
+ "Music & Sounds by",
+ "Paul Mudra",
+ "Frank Klepacki",
+ "Dwight Okahara",
+ "Pat Collins",
+ "Quality Assurance by",
+ "Glenn Sperry",
+ "Michael Lightner",
+ "William Foster",
+ "Jesse Clemit",
+ "Black Pete",
+ "Manual, Package Design",
+ "& Fulfillment by",
+ "Eydie Laramore",
+ "Lisa Marcinko",
+ "Lauren Rifkin",
+ "Unseren Gl""\x81""ckw""\x81""nsch!",
+ "Vielen Dank, da""\xE1"" Sie The Hand of Fate gespielt haben!",
+ "Guest Coding",
+ "Producer Liaison",
+ "Scott Duckett",
+ "Irvine Testers",
+ "Chris McFarland",
+ "Paul Moore",
+ "Chad Soares",
+ "Jared Brinkley",
+ "Jon Willliams",
+ "Chris Toft",
+ "Ants! Ants! Ants!",
+ "Ted Morris",
+ "Spielstand laden",
+ "Intro",
+ "Neues Spiel starten",
+ "Spiel beenden",
+ "Vielen Dank an",
+ "tom schmidt",
+ "Tim Fritz",
+ "Kenny Dunne",
+ "Vielen Dank, da""\xE1"" Sie \"The Hand of Fate\" gespielt haben.\n"
+};
+
+static const StringListProvider k2SeqplayStringsDOSCDGermanProvider = { ARRAYSIZE(k2SeqplayStringsDOSCDGerman), k2SeqplayStringsDOSCDGerman };
+
+static const char *const k2SeqplayTlkFilesDOSCDGerman[14] = {
+ "GINTRO1",
+ "GINTRO2",
+ "GINTRO3",
+ "GINTRO4",
+ "GINTRO5",
+ "GINTRO6",
+ "GINTRO7",
+ "GINTRO8",
+ "GINTRO9",
+ "GINTRO10",
+ "GINTRO11",
+ "GINTRO12",
+ "GGLOW",
+ ""
+};
+
+static const StringListProvider k2SeqplayTlkFilesDOSCDGermanProvider = { ARRAYSIZE(k2SeqplayTlkFilesDOSCDGerman), k2SeqplayTlkFilesDOSCDGerman };
+
diff --git a/devtools/create_kyradat/resources/hof_dos_cd_italian.h b/devtools/create_kyradat/resources/hof_dos_cd_italian.h
new file mode 100644
index 0000000000..0b2789af4b
--- /dev/null
+++ b/devtools/create_kyradat/resources/hof_dos_cd_italian.h
@@ -0,0 +1,128 @@
+static const char *const k2SeqplayStringsDOSCDItalian[104] = {
+ "Kyrandia sta svanendo!",
+ "Roccia dopo roccia...",
+ "...ed albero dopo albero.",
+ "Kyrandia cessa di esistere!",
+ "I mistici Reali sono sconcertati.",
+ "Ogni libro ""\x8A"" stato consultato.",
+ "Perfino Marko ed il suo nuovo aiutante sono stati invitati alla conferenza.",
+ "Fortunatamente, la Mano era ferrata in materia.",
+ "E finalmente un piano ""\x8A"" stato approvato.",
+ "Bisogna recuperare un'Ancora di pietra",
+ "dal centro della terra.",
+ "Zanthia, la pi""\x97"" giovane trai Mistici, ""\x8A"" stata scelta per recuperare l'artefatto.",
+ "Grazie per aver giocato a Hand of Fate.",
+ "Questi mirtilli dovrebbero bastare ad aprire un portale per il centro della terra.",
+ "X",
+ "X",
+ "Hey! Hanno rubato tutto il mio equipaggiamento!",
+ "X",
+ "Se pensano che vada fin laggi""\x97"" a piedi, si sbagliano di grosso!",
+ "X",
+ "X",
+ "Sbrigati Fauno!",
+ "Ragazzi, c'""\x8A"" mancato un pelo!",
+ "Puoi dirlo forte. Io ho chiuso con la caccia!",
+ "Ribbit.",
+ "Quante volte devo dirtelo? Sei un rospo.",
+ "Oh no! Abbiamo finito il formaggio!",
+ "Proviamo con questo cerume. E' arancione.",
+ "Mamy, mi dai l'edera?",
+ "Via di qui, scio'!",
+ "Tu taglio, e io scelgo.",
+ "No. TU tagli e IO scelgo.",
+ "Sono sempre convinto che fosse un'emerita cretinata.",
+ "Non riconosceresti un pentametro in verso giambico nemmeno se ti mordesse le chiappe!",
+ "Produttore Esecutivo",
+ "Brett W. Sperry",
+ "Direzione&Progetto",
+ "Rick Gush",
+ "Capo Programmatore",
+ "Michael Legg",
+ "Supervisione Artistica",
+ "Louis Castle",
+ "Joseph B. Hewitt IV",
+ "Artista",
+ "Rick Parks",
+ "Codice aggiuntivo",
+ "Philip W. Gorrow",
+ "Mike Grayford",
+ "Mark McCubbin",
+ "Artisti",
+ "Cameron Chun",
+ "Cary Averett",
+ "Cindy Chinn",
+ "Elie Arabian",
+ "Fei Cheng",
+ "Ferby Miguel",
+ "Frank Mendeola",
+ "Jack Martin",
+ "Jerry Moore",
+ "X",
+ "Judith Peterson",
+ "Larry Miller",
+ "Lenny Lee",
+ "Louise Sandoval",
+ "Ren Olsen",
+ "Musica & Suoni",
+ "Paul Mudra",
+ "Frank Klepacki",
+ "Dwight Okahara",
+ "Pat Collins",
+ "Controllo Qualit""\x85",
+ "Glenn Sperry",
+ "Michael Lightner",
+ "William Foster",
+ "Jesse Clemit",
+ "Jeff Fillhaber",
+ "Manuale, Confezione",
+ "& Realizzazione",
+ "Eydie Laramore",
+ "Lisa Marcinko",
+ "Lauren Rifkin",
+ "Congratulazioni!",
+ "Grazie per aver giocato a Hand of Fate!",
+ "Codice extra",
+ " contatti ",
+ "Scott Duckett",
+ "Irvine Testers",
+ "Chris McFarland",
+ "Paul Moore",
+ "Chad Soares",
+ "Jared Brinkley",
+ "Jon Willliams",
+ "Chris Toft",
+ "Capelli di Joe Kucan di",
+ " Theodore A. Morris",
+ "Carica un gioco",
+ "Introduzione",
+ "Inizia nuovo gioco",
+ "Esci dal gioco",
+ "Ringraziamenti speciali a",
+ "Sake Joe Bostic-san",
+ "Tim Fritz",
+ "Kenny Dunne",
+ "Grazie per aver giocato a \"The Hand of Fate.\"\n "
+};
+
+static const StringListProvider k2SeqplayStringsDOSCDItalianProvider = { ARRAYSIZE(k2SeqplayStringsDOSCDItalian), k2SeqplayStringsDOSCDItalian };
+
+static const char *const k2SeqplayTlkFilesDOSCDItalian[14] = {
+ "EINTRO1",
+ "EINTRO2",
+ "EINTRO3",
+ "EINTRO4",
+ "EINTRO5",
+ "EINTRO6",
+ "EINTRO7",
+ "EINTRO8",
+ "EINTRO9",
+ "EINTRO10",
+ "EINTRO11",
+ "EINTRO12",
+ "EGLOW",
+ ""
+};
+
+static const StringListProvider k2SeqplayTlkFilesDOSCDItalianProvider = { ARRAYSIZE(k2SeqplayTlkFilesDOSCDItalian), k2SeqplayTlkFilesDOSCDItalian };
+
diff --git a/devtools/create_kyradat/resources/hof_dos_cd_russian.h b/devtools/create_kyradat/resources/hof_dos_cd_russian.h
new file mode 100644
index 0000000000..e29beb4d3d
--- /dev/null
+++ b/devtools/create_kyradat/resources/hof_dos_cd_russian.h
@@ -0,0 +1,128 @@
+static const char *const k2SeqplayStringsDOSCDRussian[104] = {
+ "Kyrandia is disappearing!",
+ "Rock by rock...",
+ "...and tree by tree.",
+ "Kyrandia ceases to exist!",
+ "The Royal Mystics are baffled.",
+ "Every reference has been consulted.",
+ "Even Marko and his new valet have been allowed into the conference.",
+ "Luckily, the Hand was experienced in these matters.",
+ "And finally a plan was approved...",
+ "...that required a magic Anchor Stone...",
+ "...to be retrieved from the center of the world.",
+ "Zanthia, youngest of the Kyrandian Mystics, has been selected to retrieve the Stone.",
+ "Thank you for playing The Hand of Fate.",
+ "This should be enough blueberries to open a portal to the center of the world.",
+ " DUMMY STRING... ",
+ " DUMMY STRING... ",
+ "Hey! All my equipment has been stolen!",
+ " DUMMY STRING... ",
+ "If they think I'm going to walk all the way down there, they're nuts!",
+ " DUMMY STRING... ",
+ " DUMMY STRING... ",
+ "Hurry up Faun!",
+ "Boy, that was a close call!",
+ "You said it pal. I, for one, am never going hunting again!",
+ "Ribbit.",
+ "How many times do I have to tell you? You're a toad.",
+ "Oh no! We're out of cheese!",
+ "Let's try this earwax. It's orange.",
+ "Mommy, when do I get the ivy?",
+ "Get out of here, shoo!",
+ "You cut, and I'll choose.",
+ "No. You cut and I'll choose.",
+ "I still say it was derivative drivel.",
+ "Aw, you still wouldn't recognize iambic pentameter if it bit you on the butt!",
+ "Executive Producer",
+ "Brett W. Sperry",
+ "Direction & Design",
+ "Rick Gush",
+ "Lead Programmer",
+ "Michael Legg",
+ "Art Management",
+ "Louis Castle",
+ "Joseph B. Hewitt IV",
+ "Lead Artist",
+ "Rick Parks",
+ "Additional Coding by",
+ "Philip W. Gorrow",
+ "Mike Grayford",
+ "Mark McCubbin",
+ "Artists",
+ "Cameron Chun",
+ "Cary Averett",
+ "Cindy Chinn",
+ "Elie Arabian",
+ "Fei Cheng",
+ "Ferby Miguel",
+ "Frank Mendeola",
+ "Jack Martin",
+ "Jerry Moore",
+ "DUMMY STRING... ",
+ "Judith Peterson",
+ "Larry Miller",
+ "Lenny Lee",
+ "Louise Sandoval",
+ "Ren Olsen",
+ "Music & Sounds by",
+ "Paul Mudra",
+ "Frank Klepacki",
+ "Dwight Okahara",
+ "Pat Collins",
+ "Quality Assurance by",
+ "Glenn Sperry",
+ "Michael Lightner",
+ "William Foster",
+ "Jesse Clemit",
+ "Jeff Fillhaber",
+ "Manual, Package Design",
+ "& Fulfillment",
+ "Eydie Laramore",
+ "Lisa Marcinko",
+ "Lauren Rifkin",
+ "Congratulations!",
+ "Thank you for playing The Hand of Fate!",
+ "Guest Coding",
+ "Producer Liaison",
+ "Scott Duckett",
+ "Irvine Testers",
+ "Chris McFarland",
+ "Paul Moore",
+ "Chad Soares",
+ "Jared Brinkley",
+ "Jon Willliams",
+ "Chris Toft",
+ "Joe Kucan's Hair by",
+ "Theodore A. Morris",
+ "\xC7\xE0\xE3\xF0\xF3\xE7\xE8\xF2\xFC"" ""\xE8\xE3\xF0\xF3",
+ "\xC2\xE2\xE5\xE4\xE5\xED\xE8\xE5",
+ "\xCD\xE0\xF7\xE0\xF2\xFC"" ""\xED\xEE\xE2\xF3\xFE"" ""\xE8\xE3\xF0\xF3",
+ "\xC2\xFB\xE9\xF2\xE8"" ""\xE8\xE7"" ""\xE8\xE3\xF0\xFB",
+ "Special Thanks to",
+ "Sake Joe Bostic-san",
+ "Tim Fritz",
+ "Kenny Dunne",
+ "Thank you for playing \"The Hand of Fate.\"\n"
+};
+
+static const StringListProvider k2SeqplayStringsDOSCDRussianProvider = { ARRAYSIZE(k2SeqplayStringsDOSCDRussian), k2SeqplayStringsDOSCDRussian };
+
+static const char *const k2SeqplayTlkFilesDOSCDRussian[14] = {
+ "EINTRO1",
+ "EINTRO2",
+ "EINTRO3",
+ "EINTRO4",
+ "EINTRO5",
+ "EINTRO6",
+ "EINTRO7",
+ "EINTRO8",
+ "EINTRO9",
+ "EINTRO10",
+ "EINTRO11",
+ "EINTRO12",
+ "EGLOW",
+ ""
+};
+
+static const StringListProvider k2SeqplayTlkFilesDOSCDRussianProvider = { ARRAYSIZE(k2SeqplayTlkFilesDOSCDRussian), k2SeqplayTlkFilesDOSCDRussian };
+
diff --git a/devtools/create_kyradat/resources/hof_dos_cddemo.h b/devtools/create_kyradat/resources/hof_dos_cddemo.h
new file mode 100644
index 0000000000..229184853a
--- /dev/null
+++ b/devtools/create_kyradat/resources/hof_dos_cddemo.h
@@ -0,0 +1,1035 @@
+static const char *const k2SeqplayPakFilesDOSCDDemo[6] = {
+ "INTROGEN.PAK",
+ "TALKENG.PAK",
+ "TALKFRE.PAK",
+ "TALKGER.PAK",
+ "VOC.PAK",
+ "INTROTLK.PAK"
+};
+
+static const StringListProvider k2SeqplayPakFilesDOSCDDemoProvider = { ARRAYSIZE(k2SeqplayPakFilesDOSCDDemo), k2SeqplayPakFilesDOSCDDemo };
+
+static const byte k2SeqplayCreditsDOSCDDemo[2792] = {
+ 0x0D, 0x0D, 0x02, 0x54, 0x48, 0x45, 0x20, 0x50,
+ 0x4C, 0x41, 0x59, 0x45, 0x52, 0x53, 0x0D, 0x0D,
+ 0x03, 0x5A, 0x61, 0x6E, 0x74, 0x68, 0x69, 0x61,
+ 0x20, 0x20, 0x20, 0x05, 0x04, 0x42, 0x4F, 0x4E,
+ 0x4E, 0x49, 0x45, 0x20, 0x4C, 0x59, 0x4E, 0x4E,
+ 0x20, 0x54, 0x4F, 0x55, 0x50, 0x53, 0x0D, 0x03,
+ 0x46, 0x61, 0x75, 0x6E, 0x20, 0x20, 0x20, 0x05,
+ 0x04, 0x45, 0x4C, 0x45, 0x4E, 0x41, 0x20, 0x46,
+ 0x45, 0x52, 0x52, 0x41, 0x4E, 0x54, 0x45, 0x0D,
+ 0x03, 0x4D, 0x61, 0x72, 0x6B, 0x6F, 0x20, 0x20,
+ 0x20, 0x05, 0x04, 0x45, 0x52, 0x49, 0x43, 0x20,
+ 0x52, 0x41, 0x4E, 0x44, 0x41, 0x4C, 0x4C, 0x0D,
+ 0x03, 0x4E, 0x61, 0x72, 0x72, 0x61, 0x74, 0x6F,
+ 0x72, 0x20, 0x20, 0x20, 0x05, 0x04, 0x48, 0x69,
+ 0x73, 0x20, 0x52, 0x6F, 0x79, 0x61, 0x6C, 0x20,
+ 0x48, 0x69, 0x67, 0x68, 0x6E, 0x65, 0x73, 0x73,
+ 0x0D, 0x05, 0x04, 0x42, 0x52, 0x41, 0x4E, 0x44,
+ 0x4F, 0x4E, 0x2C, 0x20, 0x4B, 0x69, 0x6E, 0x67,
+ 0x20, 0x6F, 0x66, 0x0D, 0x05, 0x04, 0x4B, 0x79,
+ 0x72, 0x61, 0x6E, 0x64, 0x69, 0x61, 0x2C, 0x20,
+ 0x44, 0x65, 0x66, 0x65, 0x6E, 0x64, 0x65, 0x72,
+ 0x20, 0x6F, 0x66, 0x0D, 0x05, 0x04, 0x74, 0x68,
+ 0x65, 0x20, 0x4B, 0x79, 0x72, 0x61, 0x67, 0x65,
+ 0x6D, 0x2C, 0x20, 0x56, 0x61, 0x6E, 0x71, 0x75,
+ 0x69, 0x73, 0x68, 0x65, 0x72, 0x0D, 0x05, 0x04,
+ 0x6F, 0x66, 0x20, 0x4D, 0x61, 0x6C, 0x63, 0x6F,
+ 0x6C, 0x6D, 0x2C, 0x20, 0x50, 0x61, 0x74, 0x72,
+ 0x6F, 0x6E, 0x20, 0x6F, 0x66, 0x0D, 0x05, 0x04,
+ 0x74, 0x68, 0x65, 0x20, 0x41, 0x72, 0x74, 0x73,
+ 0x2C, 0x20, 0x57, 0x65, 0x61, 0x72, 0x65, 0x72,
+ 0x20, 0x6F, 0x66, 0x20, 0x74, 0x68, 0x65, 0x0D,
+ 0x05, 0x04, 0x53, 0x61, 0x6E, 0x64, 0x61, 0x6C,
+ 0x2C, 0x20, 0x61, 0x6E, 0x64, 0x20, 0x4D, 0x61,
+ 0x6A, 0x6F, 0x72, 0x69, 0x74, 0x79, 0x0D, 0x05,
+ 0x04, 0x53, 0x74, 0x6F, 0x63, 0x6B, 0x20, 0x4F,
+ 0x77, 0x6E, 0x65, 0x72, 0x20, 0x61, 0x6E, 0x64,
+ 0x20, 0x43, 0x45, 0x4F, 0x20, 0x6F, 0x66, 0x0D,
+ 0x05, 0x04, 0x54, 0x69, 0x6D, 0x62, 0x65, 0x72,
+ 0x6D, 0x69, 0x73, 0x74, 0x20, 0x43, 0x61, 0x73,
+ 0x75, 0x61, 0x6C, 0x0D, 0x05, 0x04, 0x46, 0x6F,
+ 0x6F, 0x74, 0x77, 0x65, 0x61, 0x72, 0x2C, 0x20,
+ 0x49, 0x6E, 0x63, 0x2E, 0x0D, 0x03, 0x54, 0x68,
+ 0x65, 0x20, 0x48, 0x61, 0x6E, 0x64, 0x20, 0x20,
+ 0x20, 0x05, 0x04, 0x4D, 0x49, 0x43, 0x48, 0x41,
+ 0x45, 0x4C, 0x20, 0x4B, 0x55, 0x43, 0x41, 0x4E,
+ 0x0D, 0x0D, 0x0D, 0x02, 0x44, 0x41, 0x52, 0x4B,
+ 0x4D, 0x4F, 0x4F, 0x52, 0x20, 0x53, 0x57, 0x41,
+ 0x4D, 0x50, 0x0D, 0x0D, 0x03, 0x48, 0x65, 0x72,
+ 0x62, 0x20, 0x20, 0x20, 0x20, 0x05, 0x04, 0x43,
+ 0x48, 0x41, 0x52, 0x4C, 0x45, 0x53, 0x20, 0x4D,
+ 0x4F, 0x53, 0x48, 0x45, 0x52, 0x0D, 0x03, 0x42,
+ 0x72, 0x65, 0x75, 0x74, 0x68, 0x20, 0x20, 0x20,
+ 0x20, 0x05, 0x04, 0x42, 0x52, 0x49, 0x41, 0x4E,
+ 0x20, 0x53, 0x54, 0x52, 0x4F, 0x4D, 0x0D, 0x03,
+ 0x53, 0x77, 0x61, 0x6D, 0x70, 0x20, 0x52, 0x61,
+ 0x74, 0x20, 0x20, 0x20, 0x20, 0x05, 0x04, 0x45,
+ 0x52, 0x49, 0x43, 0x20, 0x4D, 0x41, 0x52, 0x54,
+ 0x49, 0x4E, 0x0D, 0x03, 0x44, 0x72, 0x61, 0x67,
+ 0x6F, 0x6E, 0x66, 0x6C, 0x79, 0x20, 0x20, 0x20,
+ 0x20, 0x05, 0x04, 0x43, 0x4C, 0x49, 0x46, 0x46,
+ 0x20, 0x4C, 0x41, 0x57, 0x52, 0x45, 0x4E, 0x43,
+ 0x45, 0x0D, 0x03, 0x46, 0x69, 0x73, 0x68, 0x65,
+ 0x72, 0x6D, 0x61, 0x6E, 0x20, 0x20, 0x20, 0x20,
+ 0x05, 0x04, 0x45, 0x52, 0x49, 0x43, 0x20, 0x4D,
+ 0x41, 0x52, 0x54, 0x49, 0x4E, 0x0D, 0x03, 0x4F,
+ 0x74, 0x68, 0x65, 0x72, 0x20, 0x46, 0x69, 0x73,
+ 0x68, 0x65, 0x72, 0x6D, 0x61, 0x6E, 0x20, 0x20,
+ 0x20, 0x20, 0x05, 0x04, 0x52, 0x41, 0x59, 0x20,
+ 0x46, 0x41, 0x56, 0x45, 0x52, 0x4F, 0x0D, 0x03,
+ 0x54, 0x6F, 0x61, 0x64, 0x20, 0x20, 0x20, 0x20,
+ 0x05, 0x04, 0x4D, 0x41, 0x52, 0x43, 0x55, 0x53,
+ 0x20, 0x56, 0x41, 0x55, 0x47, 0x48, 0x4E, 0x0D,
+ 0x03, 0x4F, 0x74, 0x68, 0x65, 0x72, 0x20, 0x54,
+ 0x6F, 0x61, 0x64, 0x20, 0x20, 0x20, 0x20, 0x05,
+ 0x04, 0x42, 0x49, 0x4C, 0x4C, 0x20, 0x43, 0x4F,
+ 0x4C, 0x4C, 0x49, 0x4E, 0x53, 0x0D, 0x03, 0x54,
+ 0x68, 0x65, 0x20, 0x48, 0x61, 0x6E, 0x64, 0x20,
+ 0x20, 0x20, 0x20, 0x05, 0x04, 0x4D, 0x41, 0x52,
+ 0x49, 0x41, 0x20, 0x44, 0x45, 0x4C, 0x20, 0x4D,
+ 0x41, 0x52, 0x20, 0x4C, 0x45, 0x47, 0x47, 0x0D,
+ 0x0D, 0x0D, 0x02, 0x4D, 0x4F, 0x52, 0x4E, 0x49,
+ 0x4E, 0x47, 0x4D, 0x49, 0x53, 0x54, 0x20, 0x56,
+ 0x41, 0x4C, 0x4C, 0x45, 0x59, 0x0D, 0x0D, 0x03,
+ 0x46, 0x61, 0x72, 0x6D, 0x65, 0x72, 0x20, 0x47,
+ 0x72, 0x65, 0x65, 0x6E, 0x62, 0x65, 0x72, 0x72,
+ 0x79, 0x20, 0x20, 0x20, 0x20, 0x05, 0x04, 0x45,
+ 0x52, 0x49, 0x43, 0x20, 0x4D, 0x41, 0x52, 0x54,
+ 0x49, 0x4E, 0x0D, 0x03, 0x47, 0x68, 0x6F, 0x73,
+ 0x74, 0x20, 0x20, 0x20, 0x20, 0x05, 0x04, 0x4D,
+ 0x41, 0x52, 0x43, 0x55, 0x53, 0x20, 0x56, 0x41,
+ 0x55, 0x47, 0x48, 0x4E, 0x0D, 0x03, 0x53, 0x63,
+ 0x61, 0x72, 0x65, 0x63, 0x72, 0x6F, 0x77, 0x20,
+ 0x20, 0x20, 0x20, 0x05, 0x04, 0x4D, 0x41, 0x52,
+ 0x43, 0x55, 0x53, 0x20, 0x56, 0x41, 0x55, 0x47,
+ 0x48, 0x4E, 0x0D, 0x03, 0x46, 0x61, 0x74, 0x20,
+ 0x47, 0x75, 0x61, 0x72, 0x64, 0x20, 0x20, 0x20,
+ 0x20, 0x05, 0x04, 0x4D, 0x49, 0x43, 0x48, 0x41,
+ 0x45, 0x4C, 0x20, 0x4C, 0x45, 0x47, 0x47, 0x0D,
+ 0x03, 0x53, 0x6B, 0x69, 0x6E, 0x6E, 0x79, 0x20,
+ 0x47, 0x75, 0x61, 0x72, 0x64, 0x20, 0x20, 0x20,
+ 0x20, 0x05, 0x04, 0x52, 0x49, 0x43, 0x4B, 0x20,
+ 0x22, 0x43, 0x4F, 0x43, 0x4F, 0x22, 0x20, 0x47,
+ 0x55, 0x53, 0x48, 0x0D, 0x03, 0x54, 0x68, 0x65,
+ 0x20, 0x48, 0x61, 0x6E, 0x64, 0x20, 0x20, 0x20,
+ 0x20, 0x05, 0x04, 0x4D, 0x49, 0x43, 0x48, 0x41,
+ 0x45, 0x4C, 0x20, 0x47, 0x52, 0x41, 0x59, 0x46,
+ 0x4F, 0x52, 0x44, 0x0D, 0x0D, 0x0D, 0x02, 0x54,
+ 0x4F, 0x57, 0x4E, 0x45, 0x20, 0x4F, 0x46, 0x20,
+ 0x48, 0x49, 0x47, 0x48, 0x4D, 0x4F, 0x4F, 0x4E,
+ 0x0D, 0x0D, 0x03, 0x53, 0x68, 0x65, 0x72, 0x69,
+ 0x66, 0x66, 0x20, 0x20, 0x20, 0x20, 0x05, 0x04,
+ 0x52, 0x41, 0x59, 0x20, 0x46, 0x41, 0x56, 0x45,
+ 0x52, 0x4F, 0x0D, 0x03, 0x43, 0x61, 0x70, 0x27,
+ 0x6E, 0x20, 0x42, 0x6F, 0x62, 0x20, 0x20, 0x20,
+ 0x20, 0x05, 0x04, 0x42, 0x52, 0x49, 0x41, 0x4E,
+ 0x20, 0x53, 0x54, 0x52, 0x4F, 0x4D, 0x0D, 0x03,
+ 0x4F, 0x63, 0x74, 0x6F, 0x70, 0x75, 0x73, 0x20,
+ 0x20, 0x20, 0x20, 0x05, 0x04, 0x43, 0x4C, 0x49,
+ 0x46, 0x46, 0x20, 0x4C, 0x41, 0x57, 0x52, 0x45,
+ 0x4E, 0x43, 0x45, 0x0D, 0x03, 0x50, 0x69, 0x72,
+ 0x61, 0x74, 0x65, 0x20, 0x20, 0x20, 0x20, 0x05,
+ 0x04, 0x44, 0x4F, 0x55, 0x47, 0x20, 0x42, 0x41,
+ 0x4B, 0x45, 0x52, 0x0D, 0x03, 0x4F, 0x74, 0x68,
+ 0x65, 0x72, 0x20, 0x50, 0x69, 0x72, 0x61, 0x74,
+ 0x65, 0x20, 0x20, 0x20, 0x20, 0x05, 0x04, 0x45,
+ 0x52, 0x49, 0x43, 0x20, 0x4D, 0x41, 0x52, 0x54,
+ 0x49, 0x4E, 0x0D, 0x03, 0x41, 0x6E, 0x6F, 0x74,
+ 0x68, 0x65, 0x72, 0x20, 0x50, 0x69, 0x72, 0x61,
+ 0x74, 0x65, 0x20, 0x20, 0x20, 0x20, 0x05, 0x04,
+ 0x45, 0x52, 0x49, 0x43, 0x20, 0x52, 0x41, 0x4E,
+ 0x44, 0x41, 0x4C, 0x4C, 0x0D, 0x03, 0x53, 0x71,
+ 0x75, 0x61, 0x77, 0x6B, 0x79, 0x20, 0x74, 0x68,
+ 0x65, 0x20, 0x50, 0x61, 0x72, 0x72, 0x6F, 0x74,
+ 0x20, 0x20, 0x20, 0x20, 0x05, 0x04, 0x43, 0x4C,
+ 0x49, 0x46, 0x46, 0x20, 0x4C, 0x41, 0x57, 0x52,
+ 0x45, 0x4E, 0x43, 0x45, 0x0D, 0x03, 0x53, 0x61,
+ 0x69, 0x6C, 0x6F, 0x72, 0x20, 0x20, 0x20, 0x20,
+ 0x05, 0x04, 0x54, 0x49, 0x4D, 0x20, 0x43, 0x4C,
+ 0x41, 0x52, 0x4B, 0x0D, 0x03, 0x4F, 0x74, 0x68,
+ 0x65, 0x72, 0x20, 0x53, 0x61, 0x69, 0x6C, 0x6F,
+ 0x72, 0x20, 0x20, 0x20, 0x20, 0x05, 0x04, 0x4D,
+ 0x41, 0x52, 0x43, 0x55, 0x53, 0x20, 0x56, 0x41,
+ 0x55, 0x47, 0x48, 0x4E, 0x0D, 0x03, 0x54, 0x68,
+ 0x65, 0x20, 0x48, 0x61, 0x6E, 0x64, 0x20, 0x20,
+ 0x20, 0x20, 0x05, 0x04, 0x4A, 0x45, 0x4E, 0x4E,
+ 0x59, 0x20, 0x4B, 0x55, 0x43, 0x41, 0x4E, 0x0D,
+ 0x0D, 0x0D, 0x02, 0x56, 0x4F, 0x4C, 0x43, 0x41,
+ 0x4E, 0x49, 0x41, 0x0D, 0x0D, 0x03, 0x4A, 0x65,
+ 0x73, 0x73, 0x69, 0x63, 0x61, 0x20, 0x20, 0x20,
+ 0x20, 0x05, 0x04, 0x4A, 0x55, 0x4C, 0x49, 0x45,
+ 0x20, 0x43, 0x48, 0x49, 0x52, 0x49, 0x4C, 0x41,
+ 0x0D, 0x03, 0x53, 0x6D, 0x61, 0x72, 0x6D, 0x79,
+ 0x20, 0x20, 0x20, 0x20, 0x05, 0x04, 0x44, 0x4F,
+ 0x55, 0x47, 0x20, 0x42, 0x41, 0x4B, 0x45, 0x52,
+ 0x0D, 0x03, 0x42, 0x75, 0x72, 0x65, 0x61, 0x75,
+ 0x63, 0x72, 0x61, 0x74, 0x20, 0x20, 0x20, 0x20,
+ 0x05, 0x04, 0x45, 0x52, 0x49, 0x43, 0x20, 0x52,
+ 0x41, 0x4E, 0x44, 0x41, 0x4C, 0x4C, 0x0D, 0x03,
+ 0x42, 0x75, 0x72, 0x65, 0x61, 0x75, 0x63, 0x72,
+ 0x61, 0x74, 0x72, 0x65, 0x73, 0x73, 0x20, 0x20,
+ 0x20, 0x20, 0x05, 0x04, 0x4A, 0x55, 0x4C, 0x49,
+ 0x45, 0x20, 0x42, 0x41, 0x4C, 0x53, 0x41, 0x4D,
+ 0x4F, 0x0D, 0x03, 0x4D, 0x61, 0x20, 0x20, 0x20,
+ 0x20, 0x05, 0x04, 0x44, 0x45, 0x4E, 0x49, 0x53,
+ 0x45, 0x20, 0x53, 0x43, 0x48, 0x41, 0x46, 0x45,
+ 0x52, 0x0D, 0x03, 0x50, 0x61, 0x20, 0x20, 0x20,
+ 0x20, 0x05, 0x04, 0x4B, 0x45, 0x4E, 0x4E, 0x45,
+ 0x54, 0x48, 0x20, 0x4A, 0x2E, 0x20, 0x4B, 0x55,
+ 0x43, 0x41, 0x4E, 0x0D, 0x03, 0x54, 0x68, 0x65,
+ 0x20, 0x48, 0x61, 0x6E, 0x64, 0x20, 0x20, 0x20,
+ 0x20, 0x05, 0x04, 0x52, 0x41, 0x4D, 0x49, 0x4E,
+ 0x20, 0x46, 0x41, 0x54, 0x48, 0x49, 0x45, 0x0D,
+ 0x0D, 0x0D, 0x02, 0x45, 0x4E, 0x43, 0x48, 0x41,
+ 0x4E, 0x54, 0x45, 0x44, 0x20, 0x46, 0x4F, 0x52,
+ 0x45, 0x53, 0x54, 0x0D, 0x0D, 0x03, 0x4B, 0x6E,
+ 0x69, 0x67, 0x68, 0x74, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x05, 0x04, 0x45, 0x52, 0x49, 0x43, 0x20,
+ 0x4D, 0x41, 0x52, 0x54, 0x49, 0x4E, 0x0D, 0x03,
+ 0x50, 0x65, 0x74, 0x72, 0x69, 0x66, 0x69, 0x65,
+ 0x64, 0x20, 0x54, 0x72, 0x65, 0x65, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x05, 0x04, 0x44, 0x4F, 0x55,
+ 0x47, 0x20, 0x42, 0x41, 0x4B, 0x45, 0x52, 0x0D,
+ 0x03, 0x55, 0x6E, 0x69, 0x6F, 0x6E, 0x20, 0x53,
+ 0x71, 0x75, 0x69, 0x72, 0x72, 0x65, 0x6C, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x05, 0x04, 0x54, 0x49,
+ 0x4D, 0x20, 0x43, 0x4C, 0x41, 0x52, 0x4B, 0x0D,
+ 0x03, 0x4D, 0x79, 0x73, 0x74, 0x69, 0x63, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x05, 0x04, 0x43, 0x48,
+ 0x41, 0x52, 0x4C, 0x45, 0x53, 0x20, 0x4D, 0x4F,
+ 0x53, 0x48, 0x45, 0x52, 0x0D, 0x03, 0x4F, 0x74,
+ 0x68, 0x65, 0x72, 0x20, 0x4D, 0x79, 0x73, 0x74,
+ 0x69, 0x63, 0x20, 0x20, 0x20, 0x20, 0x20, 0x05,
+ 0x04, 0x43, 0x4F, 0x4E, 0x4E, 0x45, 0x52, 0x20,
+ 0x46, 0x52, 0x45, 0x46, 0x46, 0x20, 0x43, 0x4F,
+ 0x43, 0x48, 0x52, 0x41, 0x4E, 0x0D, 0x03, 0x54,
+ 0x68, 0x65, 0x20, 0x48, 0x61, 0x6E, 0x64, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x05, 0x04, 0x4C, 0x59,
+ 0x4E, 0x44, 0x41, 0x20, 0x57, 0x41, 0x53, 0x4B,
+ 0x4F, 0x4D, 0x0D, 0x0D, 0x0D, 0x02, 0x41, 0x4C,
+ 0x50, 0x49, 0x4E, 0x49, 0x41, 0x0D, 0x0D, 0x03,
+ 0x41, 0x62, 0x6F, 0x6D, 0x69, 0x6E, 0x61, 0x62,
+ 0x6C, 0x65, 0x20, 0x53, 0x6E, 0x6F, 0x77, 0x6D,
+ 0x61, 0x6E, 0x20, 0x20, 0x20, 0x20, 0x20, 0x05,
+ 0x04, 0x44, 0x4F, 0x55, 0x47, 0x20, 0x42, 0x41,
+ 0x4B, 0x45, 0x52, 0x0D, 0x03, 0x4D, 0x6F, 0x6D,
+ 0x6D, 0x79, 0x20, 0x20, 0x20, 0x20, 0x20, 0x05,
+ 0x04, 0x44, 0x45, 0x4E, 0x49, 0x53, 0x45, 0x20,
+ 0x53, 0x43, 0x48, 0x41, 0x46, 0x45, 0x52, 0x0D,
+ 0x03, 0x42, 0x61, 0x62, 0x79, 0x20, 0x41, 0x6C,
+ 0x62, 0x65, 0x72, 0x74, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x05, 0x04, 0x54, 0x48, 0x45, 0x4F, 0x44,
+ 0x4F, 0x52, 0x45, 0x20, 0x4D, 0x4F, 0x52, 0x52,
+ 0x49, 0x53, 0x0D, 0x03, 0x48, 0x75, 0x6E, 0x74,
+ 0x65, 0x72, 0x20, 0x20, 0x20, 0x20, 0x20, 0x05,
+ 0x04, 0x42, 0x49, 0x4C, 0x4C, 0x20, 0x43, 0x4F,
+ 0x4C, 0x4C, 0x49, 0x4E, 0x53, 0x0D, 0x03, 0x4F,
+ 0x74, 0x68, 0x65, 0x72, 0x20, 0x48, 0x75, 0x6E,
+ 0x74, 0x65, 0x72, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x05, 0x04, 0x42, 0x4F, 0x42, 0x20, 0x42, 0x4C,
+ 0x4F, 0x4D, 0x47, 0x52, 0x45, 0x4E, 0x0D, 0x03,
+ 0x46, 0x6F, 0x6F, 0x74, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x05, 0x04, 0x53, 0x50, 0x45, 0x45, 0x44,
+ 0x59, 0x20, 0x44, 0x41, 0x57, 0x4E, 0x20, 0x48,
+ 0x55, 0x4E, 0x54, 0x5A, 0x49, 0x4E, 0x47, 0x45,
+ 0x52, 0x0D, 0x03, 0x53, 0x74, 0x75, 0x6E, 0x74,
+ 0x20, 0x48, 0x61, 0x6E, 0x64, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x05, 0x04, 0x44, 0x41, 0x4E, 0x49,
+ 0x45, 0x4C, 0x20, 0x4B, 0x55, 0x43, 0x41, 0x4E,
+ 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D,
+ 0x02, 0x54, 0x48, 0x45, 0x20, 0x48, 0x41, 0x4E,
+ 0x44, 0x20, 0x4F, 0x46, 0x20, 0x46, 0x41, 0x54,
+ 0x45, 0x0D, 0x02, 0x54, 0x45, 0x41, 0x4D, 0x20,
+ 0x43, 0x44, 0x0D, 0x0D, 0x0D, 0x0D, 0x02, 0x43,
+ 0x6F, 0x64, 0x65, 0x6A, 0x61, 0x6D, 0x6D, 0x65,
+ 0x72, 0x73, 0x0D, 0x02, 0x4D, 0x49, 0x4B, 0x45,
+ 0x20, 0x61, 0x6E, 0x64, 0x20, 0x4D, 0x49, 0x4B,
+ 0x45, 0x0D, 0x0D, 0x02, 0x56, 0x6F, 0x63, 0x61,
+ 0x6C, 0x20, 0x44, 0x69, 0x72, 0x65, 0x63, 0x74,
+ 0x69, 0x6F, 0x6E, 0x20, 0x62, 0x79, 0x0D, 0x02,
+ 0x4A, 0x4F, 0x45, 0x20, 0x4B, 0x55, 0x43, 0x41,
+ 0x4E, 0x0D, 0x0D, 0x02, 0x44, 0x69, 0x67, 0x69,
+ 0x74, 0x61, 0x6C, 0x20, 0x53, 0x61, 0x6D, 0x70,
+ 0x6C, 0x69, 0x6E, 0x67, 0x20, 0x62, 0x79, 0x0D,
+ 0x02, 0x50, 0x41, 0x54, 0x20, 0x43, 0x4F, 0x4C,
+ 0x4C, 0x49, 0x4E, 0x53, 0x20, 0x61, 0x6E, 0x64,
+ 0x20, 0x44, 0x57, 0x49, 0x47, 0x48, 0x54, 0x20,
+ 0x4F, 0x4B, 0x41, 0x48, 0x41, 0x52, 0x41, 0x0D,
+ 0x0D, 0x02, 0x41, 0x75, 0x64, 0x69, 0x6F, 0x20,
+ 0x44, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F,
+ 0x6E, 0x20, 0x62, 0x79, 0x0D, 0x02, 0x50, 0x41,
+ 0x55, 0x4C, 0x20, 0x4D, 0x55, 0x44, 0x52, 0x41,
+ 0x0D, 0x0D, 0x02, 0x52, 0x65, 0x63, 0x6F, 0x72,
+ 0x64, 0x65, 0x64, 0x20, 0x61, 0x6E, 0x64, 0x20,
+ 0x45, 0x6E, 0x67, 0x69, 0x6E, 0x65, 0x65, 0x72,
+ 0x65, 0x64, 0x20, 0x62, 0x79, 0x0D, 0x02, 0x54,
+ 0x4F, 0x54, 0x4F, 0x20, 0x5A, 0x41, 0x52, 0x41,
+ 0x20, 0x61, 0x74, 0x20, 0x4D, 0x69, 0x64, 0x69,
+ 0x57, 0x6F, 0x72, 0x6B, 0x73, 0x0D, 0x0D, 0x02,
+ 0x53, 0x70, 0x65, 0x63, 0x69, 0x61, 0x6C, 0x20,
+ 0x54, 0x65, 0x63, 0x68, 0x6E, 0x6F, 0x2D, 0x57,
+ 0x69, 0x7A, 0x61, 0x72, 0x64, 0x72, 0x79, 0x20,
+ 0x62, 0x79, 0x0D, 0x02, 0x53, 0x43, 0x4F, 0x54,
+ 0x54, 0x20, 0x42, 0x4F, 0x57, 0x45, 0x4E, 0x2C,
+ 0x20, 0x44, 0x41, 0x56, 0x49, 0x44, 0x20, 0x44,
+ 0x45, 0x54, 0x54, 0x4D, 0x45, 0x52, 0x2C, 0x0D,
+ 0x02, 0x61, 0x6E, 0x64, 0x20, 0x4A, 0x4F, 0x45,
+ 0x20, 0x42, 0x4F, 0x53, 0x54, 0x49, 0x43, 0x0D,
+ 0x0D, 0x02, 0x53, 0x75, 0x70, 0x65, 0x72, 0x76,
+ 0x69, 0x73, 0x69, 0x6E, 0x67, 0x20, 0x50, 0x72,
+ 0x6F, 0x64, 0x75, 0x63, 0x65, 0x72, 0x0D, 0x02,
+ 0x52, 0x49, 0x43, 0x4B, 0x20, 0x47, 0x55, 0x53,
+ 0x48, 0x0D, 0x0D, 0x02, 0x50, 0x72, 0x6F, 0x64,
+ 0x75, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x20, 0x41,
+ 0x73, 0x73, 0x69, 0x73, 0x74, 0x61, 0x6E, 0x74,
+ 0x0D, 0x02, 0x44, 0x41, 0x56, 0x49, 0x44, 0x20,
+ 0x50, 0x4F, 0x4B, 0x4F, 0x52, 0x4E, 0x59, 0x0D,
+ 0x0D, 0x02, 0x50, 0x72, 0x6F, 0x64, 0x75, 0x63,
+ 0x74, 0x20, 0x43, 0x6F, 0x6F, 0x72, 0x64, 0x69,
+ 0x6E, 0x61, 0x74, 0x6F, 0x72, 0x0D, 0x02, 0x4A,
+ 0x45, 0x46, 0x46, 0x20, 0x5A, 0x49, 0x45, 0x4C,
+ 0x0D, 0x0D, 0x02, 0x51, 0x75, 0x61, 0x6C, 0x69,
+ 0x74, 0x79, 0x20, 0x41, 0x73, 0x73, 0x75, 0x72,
+ 0x61, 0x6E, 0x63, 0x65, 0x0D, 0x02, 0x47, 0x4C,
+ 0x45, 0x4E, 0x4E, 0x20, 0x22, 0x47, 0x4C, 0x45,
+ 0x4E, 0x4E, 0x42, 0x4F, 0x22, 0x20, 0x53, 0x50,
+ 0x45, 0x52, 0x52, 0x59, 0x0D, 0x02, 0x42, 0x52,
+ 0x41, 0x44, 0x20, 0x22, 0x53, 0x54, 0x49, 0x4E,
+ 0x47, 0x22, 0x20, 0x52, 0x4F, 0x42, 0x45, 0x52,
+ 0x54, 0x53, 0x0D, 0x02, 0x43, 0x48, 0x41, 0x44,
+ 0x20, 0x53, 0x4F, 0x41, 0x52, 0x45, 0x53, 0x0D,
+ 0x02, 0x43, 0x48, 0x52, 0x49, 0x53, 0x20, 0x4D,
+ 0x63, 0x46, 0x41, 0x52, 0x4C, 0x41, 0x4E, 0x44,
+ 0x0D, 0x02, 0x43, 0x48, 0x52, 0x49, 0x53, 0x20,
+ 0x22, 0x44, 0x4F, 0x4F, 0x4D, 0x22, 0x20, 0x52,
+ 0x55, 0x42, 0x59, 0x4F, 0x52, 0x0D, 0x02, 0x44,
+ 0x41, 0x56, 0x45, 0x20, 0x4D, 0x41, 0x58, 0x45,
+ 0x59, 0x0D, 0x02, 0x4A, 0x45, 0x46, 0x46, 0x20,
+ 0x42, 0x55, 0x43, 0x43, 0x45, 0x4C, 0x4C, 0x41,
+ 0x54, 0x4F, 0x0D, 0x02, 0x4A, 0x45, 0x53, 0x53,
+ 0x45, 0x20, 0x22, 0x4C, 0x41, 0x52, 0x47, 0x45,
+ 0x59, 0x22, 0x20, 0x43, 0x4C, 0x45, 0x4D, 0x49,
+ 0x54, 0x0D, 0x02, 0x4A, 0x4F, 0x48, 0x4E, 0x20,
+ 0x53, 0x57, 0x45, 0x45, 0x4E, 0x59, 0x0D, 0x02,
+ 0x4A, 0x4F, 0x4E, 0x20, 0x57, 0x49, 0x4C, 0x4C,
+ 0x49, 0x41, 0x4D, 0x53, 0x0D, 0x02, 0x4B, 0x45,
+ 0x4E, 0x4E, 0x45, 0x54, 0x48, 0x20, 0x22, 0x45,
+ 0x58, 0x54, 0x45, 0x52, 0x4D, 0x49, 0x4E, 0x41,
+ 0x54, 0x4F, 0x52, 0x22, 0x20, 0x44, 0x55, 0x4E,
+ 0x4E, 0x45, 0x0D, 0x02, 0x4D, 0x49, 0x4B, 0x45,
+ 0x20, 0x22, 0x44, 0x41, 0x52, 0x4B, 0x4E, 0x49,
+ 0x47, 0x48, 0x54, 0x22, 0x20, 0x4C, 0x49, 0x47,
+ 0x48, 0x54, 0x4E, 0x45, 0x52, 0x0D, 0x02, 0x4D,
+ 0x49, 0x54, 0x43, 0x48, 0x20, 0x46, 0x45, 0x4C,
+ 0x44, 0x4D, 0x41, 0x4E, 0x0D, 0x02, 0x50, 0x41,
+ 0x55, 0x4C, 0x20, 0x53, 0x48, 0x4F, 0x45, 0x4E,
+ 0x45, 0x52, 0x0D, 0x02, 0x53, 0x43, 0x4F, 0x54,
+ 0x54, 0x20, 0x4D, 0x41, 0x4E, 0x4E, 0x49, 0x4E,
+ 0x47, 0x0D, 0x02, 0x54, 0x49, 0x4D, 0x20, 0x22,
+ 0x44, 0x41, 0x52, 0x4B, 0x57, 0x4F, 0x4C, 0x46,
+ 0x22, 0x20, 0x46, 0x52, 0x49, 0x54, 0x5A, 0x0D,
+ 0x02, 0x54, 0x52, 0x4F, 0x59, 0x20, 0x4C, 0x45,
+ 0x4F, 0x4E, 0x41, 0x52, 0x44, 0x0D, 0x0D, 0x02,
+ 0x53, 0x70, 0x65, 0x63, 0x69, 0x61, 0x6C, 0x20,
+ 0x54, 0x68, 0x61, 0x6E, 0x6B, 0x73, 0x20, 0x74,
+ 0x6F, 0x0D, 0x02, 0x42, 0x41, 0x52, 0x42, 0x41,
+ 0x52, 0x41, 0x20, 0x52, 0x49, 0x43, 0x48, 0x4D,
+ 0x41, 0x4E, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D,
+ 0x0D, 0x0D, 0x02, 0x41, 0x6E, 0x79, 0x20, 0x72,
+ 0x65, 0x73, 0x65, 0x6D, 0x62, 0x6C, 0x61, 0x6E,
+ 0x63, 0x65, 0x20, 0x69, 0x6E, 0x20, 0x74, 0x68,
+ 0x69, 0x73, 0x20, 0x67, 0x61, 0x6D, 0x65, 0x20,
+ 0x74, 0x6F, 0x20, 0x0D, 0x02, 0x70, 0x65, 0x72,
+ 0x73, 0x6F, 0x6E, 0x73, 0x20, 0x6F, 0x72, 0x20,
+ 0x61, 0x70, 0x70, 0x65, 0x6E, 0x64, 0x61, 0x67,
+ 0x65, 0x73, 0x2C, 0x20, 0x6C, 0x69, 0x76, 0x69,
+ 0x6E, 0x67, 0x20, 0x6F, 0x72, 0x0D, 0x02, 0x64,
+ 0x65, 0x61, 0x64, 0x2C, 0x20, 0x69, 0x73, 0x20,
+ 0x70, 0x75, 0x72, 0x65, 0x6C, 0x79, 0x20, 0x63,
+ 0x6F, 0x69, 0x6E, 0x63, 0x69, 0x64, 0x65, 0x6E,
+ 0x74, 0x61, 0x6C, 0x2E, 0x0D, 0x0D, 0x02, 0x43,
+ 0x6F, 0x70, 0x79, 0x72, 0x69, 0x67, 0x68, 0x74,
+ 0x20, 0x28, 0x43, 0x29, 0x20, 0x31, 0x39, 0x39,
+ 0x34, 0x2C, 0x20, 0x57, 0x65, 0x73, 0x74, 0x77,
+ 0x6F, 0x6F, 0x64, 0x20, 0x53, 0x74, 0x75, 0x64,
+ 0x69, 0x6F, 0x73, 0x2C, 0x20, 0x49, 0x6E, 0x63,
+ 0x2E, 0x0D, 0x02, 0x41, 0x6C, 0x6C, 0x20, 0x72,
+ 0x69, 0x67, 0x68, 0x74, 0x73, 0x20, 0x72, 0x65,
+ 0x73, 0x65, 0x72, 0x76, 0x65, 0x64, 0x2E, 0x0D,
+ 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x00
+};
+
+static const ByteProvider k2SeqplayCreditsDOSCDDemoProvider = { ARRAYSIZE(k2SeqplayCreditsDOSCDDemo), k2SeqplayCreditsDOSCDDemo };
+
+static const char *const k2SeqplayCreditsSpecialDOSCDDemo[2] = {
+ "Codejammers",
+ "MIKE and MIKE"
+};
+
+static const StringListProvider k2SeqplayCreditsSpecialDOSCDDemoProvider = { ARRAYSIZE(k2SeqplayCreditsSpecialDOSCDDemo), k2SeqplayCreditsSpecialDOSCDDemo };
+
+static const char *const k2SeqplaySfxFilesDOSCDDemo[48] = {
+ "eintro1",
+ "eintro2",
+ "eintro3",
+ "eintro4",
+ "eintro5",
+ "eintro6",
+ "eintro7",
+ "eintro8",
+ "eintro9",
+ "eintro10",
+ "eintro11",
+ "eintro12",
+ "eglow",
+ "0000210",
+ "0000130",
+ "0000180",
+ "0000160",
+ "asong",
+ "crowcaw",
+ "eyerub2",
+ "pluck3",
+ "rodnreel",
+ "frog1",
+ "scavmov2",
+ "lambmom3",
+ "lambkid1",
+ "thunder2",
+ "thunder3",
+ "wind6",
+ "h2odrop2",
+ "gasleak",
+ "polgulp1",
+ "hndslap1",
+ "burp1",
+ "0000220",
+ "0000230",
+ "0000250",
+ "0000260",
+ "0000270",
+ "0000280",
+ "0000290",
+ "0000300",
+ "0000310",
+ "0000320",
+ "0000330",
+ "scream1",
+ "theend",
+ ""
+};
+
+static const StringListProvider k2SeqplaySfxFilesDOSCDDemoProvider = { ARRAYSIZE(k2SeqplaySfxFilesDOSCDDemo), k2SeqplaySfxFilesDOSCDDemo };
+
+static const HoFSequence k2SeqplaySeqDataDOSCDDemoSeq[16] = {
+ { 0x0002, "", "virgin.cps", 4, 0, 0xFFFF, 0xFFFF, 0x0000, 0x0001, 0x0064, 0, 0, 0x001E },
+ { 0x0001, "westwood.wsa", "", 4, 0, 0xFFFF, 0xFFFF, 0x0000, 0x0012, 0x0006, 0, 0, 0x00A0 },
+ { 0x0001, "title.wsa", "", 4, 0, 0xFFFF, 0xFFFF, 0x0000, 0x001A, 0x0006, 0, 0, 0x000A },
+ { 0x0002, "", "over.cps", 4, 0, 0xFFFF, 0xFFFF, 0x0000, 0x0001, 0x0E10, 0, 0, 0x001E },
+ { 0x0002, "", "library.cps", 4, 0, 0xFFFF, 0xFFFF, 0x0000, 0x0001, 0x0E10, 0, 0, 0x001E },
+ { 0x0002, "", "hand.cps", 4, 0, 0xFFFF, 0xFFFF, 0x0000, 0x0001, 0x0E10, 0, 0, 0x005A },
+ { 0x0001, "point.wsa", "", 4, 8, 0xFFFF, 0xFFFF, 0x0000, 0x0026, 0x0007, 0, 0, 0x00C8 },
+ { 0x0001, "zanfaun.wsa", "", 4, 0, 0xFFFF, 0xFFFF, 0x0000, 0x0033, 0x0010, 0, 0, 0x00F0 },
+ { 0x0001, "funters.wsa", "", 4, 0, 0xFFFF, 0xFFFF, 0x0000, 0x001B, 0x000C, 0, 0, 0x001E },
+ { 0x0001, "ferb.wsa", "", 4, 0, 0xFFFF, 0xFFFF, 0x0000, 0x001B, 0x0010, 0, 0, 0x001E },
+ { 0x0001, "fish.wsa", "", 4, 0, 0xFFFF, 0xFFFF, 0x0000, 0x0038, 0x000C, 0, 0, 0x001E },
+ { 0x0001, "fheep.wsa", "", 4, 0, 0xFFFF, 0xFFFF, 0x0000, 0x000B, 0x000C, 0, 0, 0x001E },
+ { 0x0001, "farmer.wsa", "", 4, 0, 0xFFFF, 0xFFFF, 0x0000, 0x0016, 0x000C, 0, 0, 0x0064 },
+ { 0x0001, "fuards.wsa", "", 4, 0, 0xFFFF, 0xFFFF, 0x0000, 0x0018, 0x000E, 0, 0, 0x001E },
+ { 0x0001, "firates.wsa", "", 4, 0, 0xFFFF, 0xFFFF, 0x0000, 0x0025, 0x000C, 0, 0, 0x001E },
+ { 0x0001, "frash.wsa", "", 4, 0, 0xFFFF, 0xFFFF, 0x0000, 0x000C, 0x000A, 0, 0, 0x0154 }
+};
+
+static const FrameControl k2SeqplaySeqDataDOSCDDemoSeqNestedControl7[18] = {
+ { 0, 10 },
+ { 1, 10 },
+ { 2, 10 },
+ { 3, 10 },
+ { 4, 10 },
+ { 5, 10 },
+ { 6, 10 },
+ { 7, 10 },
+ { 8, 10 },
+ { 9, 10 },
+ { 8, 10 },
+ { 7, 10 },
+ { 6, 10 },
+ { 5, 40 },
+ { 4, 10 },
+ { 3, 10 },
+ { 2, 10 },
+ { 1, 10 }
+};
+
+static const FrameControl k2SeqplaySeqDataDOSCDDemoSeqNestedControl10[17] = {
+ { 0, 6 },
+ { 1, 6 },
+ { 2, 6 },
+ { 3, 6 },
+ { 4, 6 },
+ { 5, 6 },
+ { 6, 6 },
+ { 7, 6 },
+ { 8, 6 },
+ { 9, 6 },
+ { 10, 6 },
+ { 11, 6 },
+ { 11, 12 },
+ { 12, 12 },
+ { 13, 12 },
+ { 12, 12 },
+ { 11, 12 }
+};
+
+static const FrameControl k2SeqplaySeqDataDOSCDDemoSeqNestedControl11[9] = {
+ { 0, 6 },
+ { 1, 6 },
+ { 2, 6 },
+ { 3, 6 },
+ { 4, 6 },
+ { 3, 6 },
+ { 4, 6 },
+ { 5, 64 },
+ { 5, 6 }
+};
+
+static const FrameControl k2SeqplaySeqDataDOSCDDemoSeqNestedControl12[16] = {
+ { 0, 6 },
+ { 1, 6 },
+ { 0, 6 },
+ { 1, 6 },
+ { 0, 6 },
+ { 1, 6 },
+ { 0, 6 },
+ { 1, 6 },
+ { 0, 6 },
+ { 1, 6 },
+ { 0, 6 },
+ { 1, 6 },
+ { 0, 6 },
+ { 1, 6 },
+ { 0, 6 },
+ { 1, 6 }
+};
+
+static const FrameControl k2SeqplaySeqDataDOSCDDemoSeqNestedControl13[5] = {
+ { 0, 6 },
+ { 1, 6 },
+ { 2, 6 },
+ { 1, 6 },
+ { 0, 1 }
+};
+
+static const FrameControl k2SeqplaySeqDataDOSCDDemoSeqNestedControl14[8] = {
+ { 0, 6 },
+ { 1, 6 },
+ { 2, 6 },
+ { 3, 6 },
+ { 4, 6 },
+ { 3, 6 },
+ { 2, 6 },
+ { 1, 6 }
+};
+
+static const HoFNestedSequence k2SeqplaySeqDataDOSCDDemoSeqNested[15] = {
+ { 0x000C, "figgle.wsa", 0, 3, 60, 0, 0, 0, NULL, 0, 0 },
+ { 0x0008, "over1.wsa", 0, 10, 10, 0, 0, 0, NULL, 0, 0 },
+ { 0x0008, "over2.wsa", 0, 11, 9, 0, 0, 0, NULL, 0, 0 },
+ { 0x0008, "forest.wsa", 0, 22, 6, 0, 0, 0, NULL, 1, 3 },
+ { 0x0008, "dragon.wsa", 0, 11, 6, 0, 0, 0, NULL, 2, 0 },
+ { 0x0002, "darm.wsa", 0, 19, 9, 0, 0, 0, NULL, 4, 0 },
+ { 0x0002, "library.wsa", 0, 33, 9, 0, 0, 0, NULL, 4, 0 },
+ { 0x002A, "library.wsa", 0, 18, 9, 0, 0, ARRAYSIZE(k2SeqplaySeqDataDOSCDDemoSeqNestedControl7), k2SeqplaySeqDataDOSCDDemoSeqNestedControl7, 0, 0 },
+ { 0x000A, "marco.wsa", 0, 37, 9, 0, 0, 0, NULL, 4, 0 },
+ { 0x0002, "hand1a.wsa", 0, 34, 9, 0, 0, 0, NULL, 0, 0 },
+ { 0x002A, "hand1b.wsa", 0, 16, 9, 0, 0, ARRAYSIZE(k2SeqplaySeqDataDOSCDDemoSeqNestedControl10), k2SeqplaySeqDataDOSCDDemoSeqNestedControl10, 0, 0 },
+ { 0x002A, "hand1c.wsa", 0, 9, 9, 0, 0, ARRAYSIZE(k2SeqplaySeqDataDOSCDDemoSeqNestedControl11), k2SeqplaySeqDataDOSCDDemoSeqNestedControl11, 0, 0 },
+ { 0x002C, "hand2.wsa", 0, 2, 9, 0, 0, ARRAYSIZE(k2SeqplaySeqDataDOSCDDemoSeqNestedControl12), k2SeqplaySeqDataDOSCDDemoSeqNestedControl12, 5, 0 },
+ { 0x002C, "hand3.wsa", 0, 4, 9, 0, 0, ARRAYSIZE(k2SeqplaySeqDataDOSCDDemoSeqNestedControl13), k2SeqplaySeqDataDOSCDDemoSeqNestedControl13, 5, 0 },
+ { 0x002C, "hand4.wsa", 0, 8, 9, 0, 0, ARRAYSIZE(k2SeqplaySeqDataDOSCDDemoSeqNestedControl14), k2SeqplaySeqDataDOSCDDemoSeqNestedControl14, 5, 0 }
+};
+
+static const HoFSequenceProvider k2SeqplaySeqDataDOSCDDemoProvider = { ARRAYSIZE(k2SeqplaySeqDataDOSCDDemoSeq), k2SeqplaySeqDataDOSCDDemoSeq, ARRAYSIZE(k2SeqplaySeqDataDOSCDDemoSeqNested), k2SeqplaySeqDataDOSCDDemoSeqNested };
+
+static const char *const k2SeqplayIntroTracksDOSCDDemo[1] = {
+ "k2intro"
+};
+
+static const StringListProvider k2SeqplayIntroTracksDOSCDDemoProvider = { ARRAYSIZE(k2SeqplayIntroTracksDOSCDDemo), k2SeqplayIntroTracksDOSCDDemo };
+
+static const char *const k2SeqplayFinaleTracksDOSCDDemo[1] = {
+ "k2finale"
+};
+
+static const StringListProvider k2SeqplayFinaleTracksDOSCDDemoProvider = { ARRAYSIZE(k2SeqplayFinaleTracksDOSCDDemo), k2SeqplayFinaleTracksDOSCDDemo };
+
+static const char *const k2IngameSfxFilesDOSCDDemo[178] = {
+ "ALCHEMY2",
+ "BIGSLAM",
+ "BITE1",
+ "BLINK1",
+ "BOING1",
+ "BUBBLE1",
+ "BUBBLE2",
+ "BURP1",
+ "BUTTON6",
+ "CAULDRN2",
+ "CHEST",
+ "CLOTHES1",
+ "CROCLAF4",
+ "CRY1",
+ "CRY2",
+ "DOORMTCL",
+ "DOORMTOP",
+ "DOORWDCL",
+ "DOORWDOP",
+ "DRUM1",
+ "DRUM2",
+ "DRUM3",
+ "DRUM4",
+ "DRUM5",
+ "DRUM6",
+ "DRUM7",
+ "EYERUB2",
+ "FALL1",
+ "FALL3",
+ "FNGRSNAP",
+ "FORMSPL1",
+ "FROG1",
+ "FROGMIX2",
+ "GASLEAK",
+ "GLOWY1",
+ "GOOD3",
+ "GOOD5",
+ "GROWTWIG",
+ "H2ODROP2",
+ "H2OPLANT",
+ "HACHUCKD",
+ "HAYFALL2",
+ "HAYSRCH4",
+ "ICECUBE",
+ "KEYOPEN",
+ "LAMBKID1",
+ "LAMBMOM3",
+ "LAUGH1",
+ "LAUGH3",
+ "LAUGH4",
+ "LIZLISP",
+ "MAKESPL1",
+ "MSTDOOM1",
+ "ORCMOVE",
+ "PLUCK3",
+ "POLGULP1",
+ "PORTCUL",
+ "POURH20",
+ "RIP2",
+ "RODNREEL",
+ "ROWBOAT1",
+ "RUCKUS1",
+ "SCAVMOV2",
+ "SCRATCH1",
+ "SNAKSPEL",
+ "SNEEZE1",
+ "SNIFF1",
+ "SNOREIN3",
+ "SNOROUT",
+ "SPLASH1",
+ "SQUEAK1",
+ "SQUEAK2",
+ "SQUEAK3",
+ "SQUISH1",
+ "SQUISH2",
+ "STEAM",
+ "STEAM3",
+ "STRETCH1",
+ "SWING",
+ "TREZA1",
+ "TURNPAG2",
+ "TWIGSNAP",
+ "UGH1",
+ "WHEEL4",
+ "WINGS1",
+ "YAWN1",
+ "ZOOM5",
+ "FILBOTL",
+ "H2OPOUR1",
+ "JAILDOR1",
+ "JAILLOK1",
+ "CASHREG1",
+ "SWISH1",
+ "TURNBOAT",
+ "CLAPPING",
+ "CRUNCH1",
+ "WHEEL6",
+ "LITEMAG",
+ "SHELDOWN",
+ "SHELSLID",
+ "ZOW2",
+ "ZANLOOP1",
+ "SCREECH2",
+ "PANTING",
+ "TREX1",
+ "TREX5",
+ "TREX3",
+ "QUAKE",
+ "WRINGH2O",
+ "SPLAT2",
+ "OCEAN1",
+ "SPLAT3",
+ "CROCLAF5",
+ "FALL5",
+ "ZCMON2",
+ "ZWAIT3",
+ "ZNO2",
+ "CROCLAF7",
+ "CRICKET1",
+ "FIREBRTH",
+ "COW2",
+ "SAP2",
+ "PMTLHI",
+ "FROGSIGH",
+ "CRICEND",
+ "CRY3",
+ "CRY4",
+ "SHROOM1",
+ "DRIP1",
+ "SWIM4",
+ "CUCKOO2",
+ "PUNCH1",
+ "SNORT3",
+ "STAMPER2",
+ "WALLFALL",
+ "WOODFAL1",
+ "SPRAY1",
+ "OHNO1",
+ "YAHOO1",
+ "YIPEE1",
+ "WIND1",
+ "WIND3",
+ "WIND6",
+ "BLOWUP2",
+ "BOATLOP2",
+ "ZGIGGL1",
+ "ZCOUGH1",
+ "CRUSH",
+ "ALARM3",
+ "APPLEAT",
+ "BABYCRY1",
+ "BABYLAF1",
+ "BABYLIK1",
+ "GEARMX3",
+ "GLASBRK2",
+ "HANDKIL1",
+ "HNDSLAP1",
+ "ICEPICK1",
+ "KISS3",
+ "LOLIFAL1",
+ "PAGEBURN",
+ "PRTYHORN",
+ "SCREAM1",
+ "SPARKHIT",
+ "SPRING2",
+ "ZANLAND1",
+ "BIGBOW",
+ "BOWFORM",
+ "BULBHIT",
+ "EYELITE",
+ "ROOFBOW",
+ "FBIGFOT1",
+ "BIGFOOT4",
+ "DORSTNCL",
+ "CROWCAW",
+ "THUNDER2",
+ "THUNDER3",
+ "TOILET"
+};
+
+static const StringListProvider k2IngameSfxFilesDOSCDDemoProvider = { ARRAYSIZE(k2IngameSfxFilesDOSCDDemo), k2IngameSfxFilesDOSCDDemo };
+
+static const byte k2IngameSfxIndexDOSCDDemo[856] = {
+ 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00,
+ 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00,
+ 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00,
+ 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00,
+ 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00,
+ 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00,
+ 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00,
+ 0xFF, 0xFF, 0x00, 0x00, 0x0B, 0x00, 0x00, 0x00,
+ 0x37, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00,
+ 0x47, 0x00, 0x05, 0x00, 0x22, 0x00, 0x00, 0x00,
+ 0x1F, 0x00, 0x00, 0x00, 0x51, 0x00, 0x00, 0x00,
+ 0x25, 0x00, 0x00, 0x00, 0x26, 0x00, 0x00, 0x00,
+ 0x36, 0x00, 0x05, 0x00, 0x07, 0x00, 0x00, 0x00,
+ 0x3F, 0x00, 0x00, 0x00, 0x54, 0x00, 0x00, 0x00,
+ 0x45, 0x00, 0x00, 0x00, 0x4D, 0x00, 0x00, 0x00,
+ 0x7B, 0x00, 0x00, 0x00, 0x32, 0x00, 0x00, 0x00,
+ 0xFF, 0xFF, 0x00, 0x00, 0x3C, 0x00, 0x00, 0x00,
+ 0x3C, 0x00, 0x00, 0x00, 0x3B, 0x00, 0x00, 0x00,
+ 0x4E, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00,
+ 0x04, 0x00, 0x00, 0x00, 0x43, 0x00, 0x04, 0x00,
+ 0x56, 0x00, 0x00, 0x00, 0x40, 0x00, 0x05, 0x00,
+ 0x40, 0x00, 0x05, 0x00, 0xFF, 0xFF, 0x00, 0x00,
+ 0x64, 0x00, 0x00, 0x00, 0x4C, 0x00, 0x00, 0x00,
+ 0x12, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00,
+ 0x37, 0x00, 0x00, 0x00, 0x42, 0x00, 0x00, 0x00,
+ 0x1D, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00,
+ 0x49, 0x00, 0x00, 0x00, 0x52, 0x00, 0x00, 0x00,
+ 0x0A, 0x00, 0x00, 0x00, 0x4A, 0x00, 0x00, 0x00,
+ 0x09, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00,
+ 0x0D, 0x00, 0x00, 0x00, 0x0E, 0x00, 0x00, 0x00,
+ 0x53, 0x00, 0x00, 0x00, 0x35, 0x00, 0x00, 0x00,
+ 0x0C, 0x00, 0x00, 0x00, 0x4B, 0x00, 0x00, 0x00,
+ 0x21, 0x00, 0x00, 0x00, 0x53, 0x00, 0x00, 0x00,
+ 0x32, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00,
+ 0x1B, 0x00, 0x00, 0x00, 0x1C, 0x00, 0x00, 0x00,
+ 0x13, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00,
+ 0x15, 0x00, 0x00, 0x00, 0x16, 0x00, 0x00, 0x00,
+ 0x17, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00,
+ 0x19, 0x00, 0x00, 0x00, 0x0A, 0x00, 0x00, 0x00,
+ 0x1A, 0x00, 0x00, 0x00, 0x41, 0x00, 0x00, 0x00,
+ 0x77, 0x00, 0x00, 0x00, 0x3D, 0x00, 0x00, 0x00,
+ 0x55, 0x00, 0x00, 0x00, 0x29, 0x00, 0x00, 0x00,
+ 0x2A, 0x00, 0x00, 0x00, 0x2E, 0x00, 0x00, 0x00,
+ 0x2D, 0x00, 0x00, 0x00, 0x27, 0x00, 0x05, 0x00,
+ 0x25, 0x00, 0x00, 0x00, 0x46, 0x00, 0x05, 0x00,
+ 0x60, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00,
+ 0x34, 0x00, 0x00, 0x00, 0x12, 0x00, 0x00, 0x00,
+ 0x4F, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00,
+ 0x0F, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00,
+ 0x0A, 0x00, 0x00, 0x00, 0x78, 0x00, 0x06, 0x00,
+ 0x50, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
+ 0x33, 0x00, 0x06, 0x00, 0x3A, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00,
+ 0x1E, 0x00, 0x00, 0x00, 0x79, 0x00, 0x00, 0x00,
+ 0x23, 0x00, 0x05, 0x00, 0x24, 0x00, 0x05, 0x00,
+ 0x3E, 0x00, 0x00, 0x00, 0x2C, 0x00, 0x00, 0x00,
+ 0x48, 0x00, 0x05, 0x00, 0x20, 0x00, 0x00, 0x00,
+ 0x63, 0x00, 0x00, 0x00, 0x62, 0x00, 0x00, 0x00,
+ 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00,
+ 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00,
+ 0x7A, 0x00, 0x00, 0x00, 0x5E, 0x00, 0x00, 0x00,
+ 0x5B, 0x00, 0x00, 0x00, 0x5A, 0x00, 0x00, 0x00,
+ 0x10, 0x00, 0x00, 0x00, 0x59, 0x00, 0x00, 0x00,
+ 0x5D, 0x00, 0x00, 0x00, 0x5C, 0x00, 0x00, 0x00,
+ 0x57, 0x00, 0x00, 0x00, 0x2F, 0x00, 0x00, 0x00,
+ 0x30, 0x00, 0x00, 0x00, 0x31, 0x00, 0x00, 0x00,
+ 0x61, 0x00, 0x05, 0x00, 0x58, 0x00, 0x00, 0x00,
+ 0x5F, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00,
+ 0x65, 0x00, 0x00, 0x00, 0x66, 0x00, 0x00, 0x00,
+ 0x67, 0x00, 0x00, 0x00, 0x68, 0x00, 0x05, 0x00,
+ 0x69, 0x00, 0x05, 0x00, 0x6A, 0x00, 0x05, 0x00,
+ 0x01, 0x00, 0x05, 0x00, 0x6B, 0x00, 0x00, 0x00,
+ 0x6C, 0x00, 0x00, 0x00, 0x6D, 0x00, 0x00, 0x00,
+ 0x90, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00,
+ 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00,
+ 0x6F, 0x00, 0x00, 0x00, 0x70, 0x00, 0x00, 0x00,
+ 0x71, 0x00, 0x00, 0x00, 0x72, 0x00, 0x00, 0x00,
+ 0x73, 0x00, 0x00, 0x00, 0x74, 0x00, 0x00, 0x00,
+ 0x75, 0x00, 0x00, 0x00, 0x76, 0x00, 0x00, 0x00,
+ 0x7F, 0x00, 0x06, 0x00, 0x7D, 0x00, 0x00, 0x00,
+ 0x7E, 0x00, 0x00, 0x00, 0x7C, 0x00, 0x00, 0x00,
+ 0x80, 0x00, 0x00, 0x00, 0x81, 0x00, 0x00, 0x00,
+ 0xFF, 0xFF, 0x00, 0x00, 0x85, 0x00, 0x00, 0x00,
+ 0x84, 0x00, 0x00, 0x00, 0x83, 0x00, 0x00, 0x00,
+ 0x82, 0x00, 0x05, 0x00, 0x86, 0x00, 0x00, 0x00,
+ 0x88, 0x00, 0x00, 0x00, 0x89, 0x00, 0x00, 0x00,
+ 0x8A, 0x00, 0x00, 0x00, 0x8B, 0x00, 0x00, 0x00,
+ 0x87, 0x00, 0x00, 0x00, 0x8C, 0x00, 0x00, 0x00,
+ 0x8D, 0x00, 0x00, 0x00, 0x8E, 0x00, 0x00, 0x00,
+ 0x8F, 0x00, 0x00, 0x00, 0x90, 0x00, 0x00, 0x00,
+ 0x91, 0x00, 0x00, 0x00, 0x92, 0x00, 0x00, 0x00,
+ 0x93, 0x00, 0x05, 0x00, 0x94, 0x00, 0x00, 0x00,
+ 0x5F, 0x00, 0x00, 0x00, 0x96, 0x00, 0x05, 0x00,
+ 0x97, 0x00, 0x00, 0x00, 0x98, 0x00, 0x04, 0x00,
+ 0x99, 0x00, 0x00, 0x00, 0x9A, 0x00, 0x00, 0x00,
+ 0x9B, 0x00, 0x00, 0x00, 0x9C, 0x00, 0x00, 0x00,
+ 0x9D, 0x00, 0x00, 0x00, 0x9E, 0x00, 0x00, 0x00,
+ 0x9F, 0x00, 0x00, 0x00, 0xA0, 0x00, 0x00, 0x00,
+ 0xA1, 0x00, 0x00, 0x00, 0xA2, 0x00, 0x00, 0x00,
+ 0xA3, 0x00, 0x00, 0x00, 0xA4, 0x00, 0x00, 0x00,
+ 0xA5, 0x00, 0x00, 0x00, 0xA6, 0x00, 0x00, 0x00,
+ 0xA7, 0x00, 0x00, 0x00, 0xA8, 0x00, 0x00, 0x00,
+ 0xA9, 0x00, 0x00, 0x00, 0xAA, 0x00, 0x00, 0x00,
+ 0xAB, 0x00, 0x00, 0x00, 0xAC, 0x00, 0x00, 0x00,
+ 0xAD, 0x00, 0x00, 0x00, 0xAE, 0x00, 0x05, 0x00,
+ 0xAF, 0x00, 0x00, 0x00, 0xB0, 0x00, 0x00, 0x00,
+ 0xB1, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00
+};
+
+static const ByteProvider k2IngameSfxIndexDOSCDDemoProvider = { ARRAYSIZE(k2IngameSfxIndexDOSCDDemo), k2IngameSfxIndexDOSCDDemo };
+
+static const char *const k2IngameTracksDOSCDDemo[15] = {
+ "K2TEST1",
+ "K2TEST2",
+ "K2TEST3",
+ "K2TEST4",
+ "K2TEST5",
+ "K2TEST6",
+ "K2TEST7",
+ "K2TEST8",
+ "K2TEST9",
+ "K2TEST10",
+ "K2TEST11",
+ "K2TEST12",
+ "K2TEST13",
+ "K2TEST14",
+ "K2TEST15"
+};
+
+static const StringListProvider k2IngameTracksDOSCDDemoProvider = { ARRAYSIZE(k2IngameTracksDOSCDDemo), k2IngameTracksDOSCDDemo };
+
+static const byte k2IngameTalkObjIndexDOSCDDemo[132] = {
+ 0x20, 0x43, 0x6F, 0x72, 0x72, 0x75, 0x70, 0x74,
+ 0x21, 0x21, 0x21, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x12, 0x00, 0x18, 0x00, 0x26, 0x00, 0x41, 0x00,
+ 0x00, 0x00, 0x01, 0x00, 0x02, 0x00, 0x03, 0x00,
+ 0x04, 0x00, 0x05, 0x00, 0x06, 0x00, 0x07, 0x00,
+ 0x08, 0x00, 0x09, 0x00, 0x0A, 0x00, 0x11, 0x00,
+ 0x12, 0x00, 0x13, 0x00, 0x14, 0x00, 0x15, 0x00,
+ 0x2A, 0x00, 0x17, 0x00, 0x18, 0x00, 0x19, 0x00,
+ 0x1A, 0x00, 0x1B, 0x00, 0x1C, 0x00, 0x1D, 0x00,
+ 0x1E, 0x00, 0x1F, 0x00, 0x20, 0x00, 0x21, 0x00,
+ 0x22, 0x00, 0x23, 0x00, 0x24, 0x00, 0x30, 0x00,
+ 0x35, 0x00, 0x36, 0x00, 0x37, 0x00, 0x39, 0x00,
+ 0x3A, 0x00, 0x3B, 0x00, 0x3D, 0x00, 0x3E, 0x00,
+ 0x3F, 0x00, 0x40, 0x00, 0x41, 0x00, 0x42, 0x00,
+ 0x43, 0x00, 0x44, 0x00, 0x45, 0x00, 0x46, 0x00,
+ 0x47, 0x00, 0x5B, 0x00, 0x69, 0x00, 0x6E, 0x00,
+ 0x72, 0x00, 0x76, 0x00
+};
+
+static const ByteProvider k2IngameTalkObjIndexDOSCDDemoProvider = { ARRAYSIZE(k2IngameTalkObjIndexDOSCDDemo), k2IngameTalkObjIndexDOSCDDemo };
+
+static const FrameControl k2IngameShapeAnimDataDOSCDDemo0FrameControl[12] = {
+ { 0x0006, 0x00F0 },
+ { 0x002A, 0x000E },
+ { 0x002B, 0x000E },
+ { 0x002C, 0x000E },
+ { 0x0006, 0x000E },
+ { 0x002A, 0x000E },
+ { 0x002B, 0x000E },
+ { 0x002C, 0x000E },
+ { 0x0006, 0x000E },
+ { 0x002A, 0x000E },
+ { 0x002B, 0x000E },
+ { 0x002C, 0x000E }
+};
+
+static const FrameControl k2IngameShapeAnimDataDOSCDDemo1FrameControl[6] = {
+ { 0x0002, 0x012C },
+ { 0x002D, 0x012C },
+ { 0x002E, 0x012C },
+ { 0x002F, 0x012C },
+ { 0x002E, 0x012C },
+ { 0x002D, 0x012C }
+};
+
+static const FrameControl k2IngameShapeAnimDataDOSCDDemo2FrameControl[6] = {
+ { 0x000B, 0x0258 },
+ { 0x0030, 0x0005 },
+ { 0x0031, 0x0005 },
+ { 0x0032, 0x0005 },
+ { 0x0031, 0x0005 },
+ { 0x0030, 0x0005 }
+};
+
+static const FrameControl k2IngameShapeAnimDataDOSCDDemo3FrameControl[4] = {
+ { 0x001C, 0x0014 },
+ { 0x004E, 0x0014 },
+ { 0x004F, 0x0014 },
+ { 0x0050, 0x0014 }
+};
+
+static const FrameControl k2IngameShapeAnimDataDOSCDDemo4FrameControl[4] = {
+ { 0x0017, 0x0007 },
+ { 0x0051, 0x0007 },
+ { 0x0052, 0x0007 },
+ { 0x0053, 0x0007 }
+};
+
+static const FrameControl k2IngameShapeAnimDataDOSCDDemo5FrameControl[4] = {
+ { 0x0016, 0x0014 },
+ { 0x0054, 0x0014 },
+ { 0x0055, 0x0014 },
+ { 0x0056, 0x0014 }
+};
+
+static const FrameControl k2IngameShapeAnimDataDOSCDDemo6FrameControl[4] = {
+ { 0x003A, 0x003C },
+ { 0x0057, 0x003C },
+ { 0x0058, 0x003C },
+ { 0x0059, 0x003C }
+};
+
+static const FrameControl k2IngameShapeAnimDataDOSCDDemo7FrameControl[4] = {
+ { 0x001A, 0x0032 },
+ { 0x005A, 0x0032 },
+ { 0x005B, 0x0032 },
+ { 0x005C, 0x0032 }
+};
+
+static const FrameControl k2IngameShapeAnimDataDOSCDDemo8FrameControl[4] = {
+ { 0x006D, 0x000C },
+ { 0x006E, 0x000C },
+ { 0x006F, 0x000C },
+ { 0x0070, 0x000C }
+};
+
+static const FrameControl k2IngameShapeAnimDataDOSCDDemo9FrameControl[4] = {
+ { 0x0079, 0x0008 },
+ { 0x007A, 0x0008 },
+ { 0x007B, 0x0008 },
+ { 0x007C, 0x0008 }
+};
+
+static const FrameControl k2IngameShapeAnimDataDOSCDDemo10FrameControl[4] = {
+ { 0x007E, 0x0008 },
+ { 0x007F, 0x0008 },
+ { 0x0080, 0x0008 },
+ { 0x0081, 0x0008 }
+};
+
+static const FrameControl k2IngameShapeAnimDataDOSCDDemo11FrameControl[6] = {
+ { 0x0091, 0x01A4 },
+ { 0x0092, 0x0004 },
+ { 0x0093, 0x0004 },
+ { 0x0094, 0x0004 },
+ { 0x0093, 0x0004 },
+ { 0x0092, 0x0004 }
+};
+
+static const FrameControl k2IngameShapeAnimDataDOSCDDemo12FrameControl[4] = {
+ { 0x0095, 0x0006 },
+ { 0x0096, 0x0006 },
+ { 0x0097, 0x0006 },
+ { 0x0098, 0x0006 }
+};
+
+static const FrameControl k2IngameShapeAnimDataDOSCDDemo13FrameControl[4] = {
+ { 0x0099, 0x002D },
+ { 0x009A, 0x002D },
+ { 0x009B, 0x002D },
+ { 0x009C, 0x002D }
+};
+
+static const ItemAnimDefinition k2IngameShapeAnimDataDOSCDDemo[14] = {
+ { 6, 12, k2IngameShapeAnimDataDOSCDDemo0FrameControl },
+ { 2, 6, k2IngameShapeAnimDataDOSCDDemo1FrameControl },
+ { 11, 6, k2IngameShapeAnimDataDOSCDDemo2FrameControl },
+ { 28, 4, k2IngameShapeAnimDataDOSCDDemo3FrameControl },
+ { 23, 4, k2IngameShapeAnimDataDOSCDDemo4FrameControl },
+ { 22, 4, k2IngameShapeAnimDataDOSCDDemo5FrameControl },
+ { 58, 4, k2IngameShapeAnimDataDOSCDDemo6FrameControl },
+ { 26, 4, k2IngameShapeAnimDataDOSCDDemo7FrameControl },
+ { 109, 4, k2IngameShapeAnimDataDOSCDDemo8FrameControl },
+ { 121, 4, k2IngameShapeAnimDataDOSCDDemo9FrameControl },
+ { 126, 4, k2IngameShapeAnimDataDOSCDDemo10FrameControl },
+ { 145, 6, k2IngameShapeAnimDataDOSCDDemo11FrameControl },
+ { 149, 4, k2IngameShapeAnimDataDOSCDDemo12FrameControl },
+ { 153, 4, k2IngameShapeAnimDataDOSCDDemo13FrameControl }
+};
+
+static const ItemAnimDefinitionProvider k2IngameShapeAnimDataDOSCDDemoProvider = { ARRAYSIZE(k2IngameShapeAnimDataDOSCDDemo), k2IngameShapeAnimDataDOSCDDemo };
+
diff --git a/devtools/create_kyradat/resources/hof_dos_cddemo_english.h b/devtools/create_kyradat/resources/hof_dos_cddemo_english.h
new file mode 100644
index 0000000000..4b6293363a
--- /dev/null
+++ b/devtools/create_kyradat/resources/hof_dos_cddemo_english.h
@@ -0,0 +1,139 @@
+static const char *const k2SeqplayStringsDOSCDDemoEnglish[104] = {
+ "Kyrandia is disappearing!",
+ "Rock by rock...",
+ "...and tree by tree.",
+ "Kyrandia ceases to exist!",
+ "The Royal Mystics are baffled.",
+ "Every reference has been consulted.",
+ "Even Marko and his new valet have been allowed into the conference.",
+ "Luckily, the Hand was experienced in these matters.",
+ "And finally a plan was approved...",
+ "...that required a magic Anchor Stone...",
+ "...to be retrieved from the center of the world.",
+ "Zanthia, youngest of the Kyrandian Mystics, has been selected to retrieve the Stone.",
+ "Thank you for playing The Hand of Fate.",
+ "This should be enough blueberries to open a portal to the center of the world.",
+ " DUMMY STRING... ",
+ " DUMMY STRING... ",
+ "Hey! All my equipment has been stolen!",
+ " DUMMY STRING... ",
+ "If they think I'm going to walk all the way down there, they're nuts!",
+ " DUMMY STRING... ",
+ " DUMMY STRING... ",
+ "Hurry up Faun!",
+ "Boy, that was a close call!",
+ "You said it pal. I, for one, am never going hunting again!",
+ "Ribbit.",
+ "How many times do I have to tell you? You're a toad.",
+ "Oh no! We're out of cheese!",
+ "Let's try this earwax. It's orange.",
+ "Mommy, when do I get the ivy?",
+ "Get out of here, shoo!",
+ "You cut, and I'll choose.",
+ "No. You cut and I'll choose.",
+ "I still say it was derivative drivel.",
+ "Aw, you still wouldn't recognize iambic pentameter if it bit you on the butt!",
+ "Executive Producer",
+ "Brett W. Sperry",
+ "Direction & Design",
+ "Rick Gush",
+ "Lead Programmer",
+ "Michael Legg",
+ "Art Management",
+ "Louis Castle",
+ "Joseph B. Hewitt IV",
+ "Lead Artist",
+ "Rick Parks",
+ "Additional Coding by",
+ "Philip W. Gorrow",
+ "Mike Grayford",
+ "Mark McCubbin",
+ "Artists",
+ "Cameron Chun",
+ "Cary Averett",
+ "Cindy Chinn",
+ "Elie Arabian",
+ "Fei Cheng",
+ "Ferby Miguel",
+ "Frank Mendeola",
+ "Jack Martin",
+ "Jerry Moore",
+ "DUMMY STRING... ",
+ "Judith Peterson",
+ "Larry Miller",
+ "Lenny Lee",
+ "Louise Sandoval",
+ "Ren Olsen",
+ "Music & Sounds by",
+ "Paul Mudra",
+ "Frank Klepacki",
+ "Dwight Okahara",
+ "Pat Collins",
+ "Quality Assurance by",
+ "Glenn Sperry",
+ "Michael Lightner",
+ "William Foster",
+ "Jesse Clemit",
+ "Jeff Fillhaber",
+ "Manual, Package Design",
+ "& Fulfillment",
+ "Eydie Laramore",
+ "Lisa Marcinko",
+ "Lauren Rifkin",
+ "Congratulations!",
+ "Thank you for playing The Hand of Fate!",
+ "Guest Coding",
+ "Producer Liaison",
+ "Scott Duckett",
+ "Irvine Testers",
+ "Chris McFarland",
+ "Paul Moore",
+ "Chad Soares",
+ "Jared Brinkley",
+ "Jon Willliams",
+ "Chris Toft",
+ "Joe Kucan's Hair by",
+ "Theodore A. Morris",
+ "Load a game",
+ "Introduction",
+ "Start a new game",
+ "Exit the game",
+ "Special Thanks to",
+ "Sake Joe Bostic-san",
+ "Tim Fritz",
+ "Kenny Dunne",
+ "Thank you for playing \"The Hand of Fate.\"\n"
+};
+
+static const StringListProvider k2SeqplayStringsDOSCDDemoEnglishProvider = { ARRAYSIZE(k2SeqplayStringsDOSCDDemoEnglish), k2SeqplayStringsDOSCDDemoEnglish };
+
+static const char *const k2SeqplayTlkFilesDOSCDDemoEnglish[14] = {
+ "EINTRO1",
+ "EINTRO2",
+ "EINTRO3",
+ "EINTRO4",
+ "EINTRO5",
+ "EINTRO6",
+ "EINTRO7",
+ "EINTRO8",
+ "EINTRO9",
+ "EINTRO10",
+ "EINTRO11",
+ "EINTRO12",
+ "EGLOW",
+ ""
+};
+
+static const StringListProvider k2SeqplayTlkFilesDOSCDDemoEnglishProvider = { ARRAYSIZE(k2SeqplayTlkFilesDOSCDDemoEnglish), k2SeqplayTlkFilesDOSCDDemoEnglish };
+
+static const char *const k2IngameTlkDemoStringsDOSCDDemoEnglish[6] = {
+ "Congratulations! Thank you for guiding",
+ "Zanthia safely through Darkmoor Swamp.",
+ "To continue her adventures, look for",
+ "Kyrandia 2: The Hand of Fate on PC",
+ "CD-ROM or floppy disk, at your local",
+ "software store."
+};
+
+static const StringListProvider k2IngameTlkDemoStringsDOSCDDemoEnglishProvider = { ARRAYSIZE(k2IngameTlkDemoStringsDOSCDDemoEnglish), k2IngameTlkDemoStringsDOSCDDemoEnglish };
+
diff --git a/devtools/create_kyradat/resources/hof_dos_cddemo_french.h b/devtools/create_kyradat/resources/hof_dos_cddemo_french.h
new file mode 100644
index 0000000000..399cf2e287
--- /dev/null
+++ b/devtools/create_kyradat/resources/hof_dos_cddemo_french.h
@@ -0,0 +1,139 @@
+static const char *const k2SeqplayStringsDOSCDDemoFrench[104] = {
+ "Kyrandia est en train de dispara""\x8C""tre!",
+ "Pierre apr""\x8A""s pierre...",
+ "Arbre apr""\x8A""s arbre.",
+ "Kyrandia va cesser d'exister!",
+ "Les Grands Mystiques Royaux sont perplexes...",
+ "Ils ont consult""\x82"" tous les ouvrages!",
+ "M""\x88""me Marko et son nouveau valet ont ""\x82""t""\x82"" admis dans la conf""\x82""rence.",
+ "Heureusement, la Main connaissait bien ce sujet.",
+ "Un plan fut finalement approuv""\x82""...",
+ "Il n""\x82""cessitait une Ancre de Pierre magique...",
+ "Qu'il fallait aller chercher au centre du monde!",
+ "Zanthia, la plus jeune des Mystiques de Kyrandia, a ""\x82""t""\x82"" choisie pour r""\x82""cup""\x82""rer cette pierre.",
+ "Merci d'avoir jou""\x82"" ""\x85"" The Hand of Fate.",
+ "Je devrais avoir assez de myrtilles pour ouvrir un portail vers le centre du monde...",
+ " DUMMY STRING... ",
+ " DUMMY STRING... ",
+ "H""\x82""! On m'a vol""\x82"" tout mon ""\x82""quipement!",
+ " DUMMY STRING... ",
+ "S'ils croient que je vais y aller ""\x85"" pied, ils peuvent toujours courir!",
+ " DUMMY STRING... ",
+ " DUMMY STRING... ",
+ "Vite, Faun!",
+ "Mon vieux, nous l'avons ""\x82""chapp""\x82"" belle!",
+ "Tu l'as dit! En ce qui me concerne, j'abandonne la chasse!",
+ "Crooa.",
+ "Combien de fois faudra-t-il que je te le dise? Tu n'es qu'un sale crapaud!",
+ "Oh non! Nous n'avons plus de fromage!",
+ "On n'a qu'""\x85"" essayer ""\x87""a. C'est orange.",
+ "Maman, quand est-ce qu'on mangera du lierre?",
+ "Sortez d'ici! Allez! Filez!",
+ "Tu coupes, et je choisis.",
+ "Non. TU coupes et JE choisis.",
+ "Je maintiens que c'""\x82""tait du radotage sans int""\x82""r""\x88""t.",
+ "Tu ne reconna""\x8C""trais toujours pas un po""\x8A""me ""\x8B""ambique, m""\x88""me s'il te mordait les fesses!",
+ "Producteur Ex""\x82""cutif",
+ "Brett W. Sperry",
+ "Con""\x87""u et Dirig""\x82"" par",
+ "Rick Gush",
+ "Programmeur Principal",
+ "Michael Legg",
+ "Direction Artistique",
+ "Louis Castle",
+ "Joseph B. Hewitt IV",
+ "Graphiste principal",
+ "Rick Parks",
+ "Programmation acrobatie",
+ "Philip W. Gorrow",
+ "Michael Grayford",
+ "Mark McCubbin",
+ "Graphistes",
+ "Cameron Chun",
+ "Cary Averett",
+ "Cindy Chinn",
+ "Elie Arabian",
+ "Fei Cheng",
+ "Ferby Miguel",
+ "Frank Mendeola",
+ "Jack Martin",
+ "Jerry Moore",
+ "DUMMY STRING... ",
+ "Judith Peterson",
+ "Larry Miller",
+ "Lenny Lee",
+ "Louise Sandoval",
+ "Ren Olsen",
+ "Musique et sons",
+ "Paul Mudra",
+ "Frank Klepacki",
+ "Dwight Okahara",
+ "Pat Collins",
+ "Tests de Qualit""\x82",
+ "Glenn Sperry",
+ "Michael Lightner",
+ "William Foster",
+ "Jesse Clemit",
+ "Pierre Cardin",
+ "Conception du Manuel,",
+ "Emballage & Ex""\x82""cution",
+ "Eydie Laramore",
+ "Lisa Marcinko",
+ "Lauren Rifkin",
+ "F""\x82""licitations!",
+ "Merci d'avoir jou""\x82"" ""\x85"" The Hand of Fate!",
+ "Programmeur invit""\x82",
+ "Coordination Production",
+ "Scott Duckett",
+ "Testeurs - Irvine",
+ "Chris McFarland",
+ "Paul Moore",
+ "Chad Soares",
+ "Jared Brinkley",
+ "Jon Williams",
+ "Chris Toft",
+ "Adaptation fran""\x87""aise",
+ "Art Of Words",
+ "Charger une partie",
+ "Introduction",
+ "Nouvelle Partie",
+ "Quitter le jeu",
+ "Remerciements sp""\x82""ciaux",
+ "Sake Joe Bostic-san",
+ "Tim Fritz",
+ "Kenny Dunne",
+ "Merci d'avoir jou""\x82"" ""\x85""\"The Hand of Fate.\"\n"
+};
+
+static const StringListProvider k2SeqplayStringsDOSCDDemoFrenchProvider = { ARRAYSIZE(k2SeqplayStringsDOSCDDemoFrench), k2SeqplayStringsDOSCDDemoFrench };
+
+static const char *const k2SeqplayTlkFilesDOSCDDemoFrench[14] = {
+ "FINTRO1",
+ "FINTRO2",
+ "FINTRO3",
+ "FINTRO4",
+ "FINTRO5",
+ "FINTRO6",
+ "FINTRO7",
+ "FINTRO8",
+ "FINTRO9",
+ "FINTRO10",
+ "FINTRO11",
+ "FINTRO12",
+ "FGLOW",
+ ""
+};
+
+static const StringListProvider k2SeqplayTlkFilesDOSCDDemoFrenchProvider = { ARRAYSIZE(k2SeqplayTlkFilesDOSCDDemoFrench), k2SeqplayTlkFilesDOSCDDemoFrench };
+
+static const char *const k2IngameTlkDemoStringsDOSCDDemoFrench[6] = {
+ "F""\x82""licitations! Merci d'avoir guider",
+ "Zanthia a travers le marals de Darkmoor.",
+ "Pour continuer votre aventure, allez vous",
+ "procurer la version CD-ROM de The Hand of",
+ "Fate chez votre revendeur.",
+ " "
+};
+
+static const StringListProvider k2IngameTlkDemoStringsDOSCDDemoFrenchProvider = { ARRAYSIZE(k2IngameTlkDemoStringsDOSCDDemoFrench), k2IngameTlkDemoStringsDOSCDDemoFrench };
+
diff --git a/devtools/create_kyradat/resources/hof_dos_cddemo_german.h b/devtools/create_kyradat/resources/hof_dos_cddemo_german.h
new file mode 100644
index 0000000000..e32c88de40
--- /dev/null
+++ b/devtools/create_kyradat/resources/hof_dos_cddemo_german.h
@@ -0,0 +1,139 @@
+static const char *const k2SeqplayStringsDOSCDDemoGerman[104] = {
+ "Kyrandia l""\x94""st sich auf!",
+ "Stein f""\x81""r Stein...",
+ "...und Baum f""\x81""r Baum.",
+ "Kyrandia h""\x94""rt auf zu existieren!",
+ "Die k""\x94""niglichen Mystiker sind verzweifelt.",
+ "Jede Informationsquelle wurde zu Rate gezogen.",
+ "Sogar Marko und sein neuer Kammerdiener durften den Konferenzen beiwohnen.",
+ "Gl""\x81""cklicherweise, hatte die Hand Erfahrungen in solchen Dingen.",
+ "Und letztendlich konnte man sich auf einen Plan einigen.",
+ "Zu dessen Durchf""\x81""hrung es eines magischen Ankerstein bedarf...",
+ "...der aus der Mitte der Welt geholt werden mu""\xE1"".",
+ "Zanthia, j""\x81""ngste der kyrandianischen Mystiker, wurde ausgew""\x84""hlt, um diesen Stein zu holen.",
+ "Vielen Dank, da""\xE1"" Du die Hand des Schicksals spielst.",
+ "Dies sollten gen""\x81""gend Blaubeeren sein, um ein Portal zur Mitte der Erde zu ""\x94""ffnen.",
+ " DUMMY STRING... ",
+ " DUMMY STRING... ",
+ "Hey! Meine gesamte Ausr""\x81""stung wurde gestohlen!",
+ " DUMMY STRING... ",
+ "Wenn die glauben, da""\xE1"" ich den ganzen Weg nach unten laufe, haben die sich aber in den Finger geschnitten!",
+ " DUMMY STRING... ",
+ " DUMMY STRING... ",
+ "Beeile Dich, Faun!",
+ "Junge, Junge das war aber knapp!",
+ "Da hast Du recht, Kumpel. Ich werde nie wieder jagen gehen!",
+ "Quuaaak.",
+ "Wie oft mu""\xE1"" ich es Dir noch sagen? Du bist eine Kr""\x94""te.",
+ "Oh nein! Der K""\x84""se ist alle!",
+ "Versuchen wir es mal mit dem Ohrenwachs. Es ist orange.",
+ "Mama, wann bekomme ich das Efeu?",
+ "Husch husch, komm hier raus!",
+ "Du schneidest, und ich suche aus.",
+ "Nein. Du schneidest und ich werde aussuchen.",
+ "Ich bin immernoch der\rMeinung, da""\xE1"" er es nur\rso dahingeplappert hat.",
+ "Argh, Du w""\x81""rdest ein jambisches Pentameter nicht erkennen, wenn es Dich in den Hintern bei""\xE1""en w""\x81""rde!",
+ "Executive Producer",
+ "Brett W. Sperry",
+ "Director & Designer",
+ "Rick Gush",
+ "Lead Programmer",
+ "Michael Legg",
+ "Art Management",
+ "Louis Castle",
+ "Joseph B. Hewitt IV",
+ "Lead Artist",
+ "Rick Parks",
+ "Additional Coding by",
+ "Philip W. Gorrow",
+ "Michael Grayford",
+ "Mark McCubbin",
+ "Artists",
+ "Cameron Chun",
+ "Cary Averett",
+ "Cindy Chinn",
+ "Elie Arabian",
+ "Fei Cheng",
+ "Ferby Miguel",
+ "Frank Mendeola",
+ "Jack Martin",
+ "Jerry Moore",
+ "DUMMY STRING... ",
+ "Judith Peterson",
+ "Larry Miller",
+ "Lenny Lee",
+ "Louise Sandoval",
+ "Ren Olsen",
+ "Music & Sounds by",
+ "Paul Mudra",
+ "Frank Klepacki",
+ "Dwight Okahara",
+ "Pat Collins",
+ "Quality Assurance by",
+ "Glenn Sperry",
+ "Michael Lightner",
+ "William Foster",
+ "Jesse Clemit",
+ "Black Pete",
+ "Manual, Package Design",
+ "& Fulfillment by",
+ "Eydie Laramore",
+ "Lisa Marcinko",
+ "Lauren Rifkin",
+ "Unseren Gl""\x81""ckw""\x81""nsch!",
+ "Vielen Dank, da""\xE1"" Sie The Hand of Fate gespielt haben!",
+ "Guest Coding",
+ "Producer Liaison",
+ "Scott Duckett",
+ "Irvine Testers",
+ "Chris McFarland",
+ "Paul Moore",
+ "Chad Soares",
+ "Jared Brinkley",
+ "Jon Willliams",
+ "Chris Toft",
+ "Ants! Ants! Ants!",
+ "Ted Morris",
+ "Spielstand laden",
+ "Intro",
+ "Neues Spiel starten",
+ "Spiel beenden",
+ "Vielen Dank an",
+ "tom schmidt",
+ "Tim Fritz",
+ "Kenny Dunne",
+ "Vielen Dank, da""\xE1"" Sie \"The Hand of Fate\" gespielt haben.\n"
+};
+
+static const StringListProvider k2SeqplayStringsDOSCDDemoGermanProvider = { ARRAYSIZE(k2SeqplayStringsDOSCDDemoGerman), k2SeqplayStringsDOSCDDemoGerman };
+
+static const char *const k2SeqplayTlkFilesDOSCDDemoGerman[14] = {
+ "GINTRO1",
+ "GINTRO2",
+ "GINTRO3",
+ "GINTRO4",
+ "GINTRO5",
+ "GINTRO6",
+ "GINTRO7",
+ "GINTRO8",
+ "GINTRO9",
+ "GINTRO10",
+ "GINTRO11",
+ "GINTRO12",
+ "GGLOW",
+ ""
+};
+
+static const StringListProvider k2SeqplayTlkFilesDOSCDDemoGermanProvider = { ARRAYSIZE(k2SeqplayTlkFilesDOSCDDemoGerman), k2SeqplayTlkFilesDOSCDDemoGerman };
+
+static const char *const k2IngameTlkDemoStringsDOSCDDemoGerman[6] = {
+ "Herzlichen Gl""\x81""ckwunsch! Wir danken Dir,",
+ "da""\xE1"" Du Zanthia sicher durch Darkmoor",
+ "Swamp geleitet hast. Du kannst ihr",
+ "Abenteuer auf der The Hand of Fate",
+ "CD-ROM fortf""\x81""hren. Erkundige Dich bei",
+ "Deinem H""\x84""ndler nach dieser CD-ROM."
+};
+
+static const StringListProvider k2IngameTlkDemoStringsDOSCDDemoGermanProvider = { ARRAYSIZE(k2IngameTlkDemoStringsDOSCDDemoGerman), k2IngameTlkDemoStringsDOSCDDemoGerman };
+
diff --git a/devtools/create_kyradat/resources/hof_dos_demo.h b/devtools/create_kyradat/resources/hof_dos_demo.h
new file mode 100644
index 0000000000..00e8d3ff05
--- /dev/null
+++ b/devtools/create_kyradat/resources/hof_dos_demo.h
@@ -0,0 +1,77 @@
+static const char *const k2SeqplayPakFilesDOSDemo[2] = {
+ "GENERAL.PAK",
+ "VOC.PAK"
+};
+
+static const StringListProvider k2SeqplayPakFilesDOSDemoProvider = { ARRAYSIZE(k2SeqplayPakFilesDOSDemo), k2SeqplayPakFilesDOSDemo };
+
+static const HoFSequence k2SeqplaySeqDataDOSDemoSeq[8] = {
+ { 0x0002, "", "virgin.cps", 4, 0, 0xFFFF, 0xFFFF, 0x0000, 0x0001, 0x0064, 0, 0, 0x001E },
+ { 0x0001, "westwood.wsa", "", 4, 0, 0xFFFF, 0xFFFF, 0x0000, 0x0012, 0x000C, 0, 0, 0x001E },
+ { 0x0001, "title.wsa", "", 4, 0, 0xFFFF, 0xFFFF, 0x0000, 0x001A, 0x0006, 0, 0, 0x0064 },
+ { 0x0001, "hill.wsa", "", 4, 0, 0xFFFF, 0xFFFF, 0x0000, 0x0082, 0x0007, 0, 0, 0x001E },
+ { 0x0003, "outhome.wsa", "outhome.cps", 4, 0, 0xFFFF, 0xFFFF, 0x0000, 0x009A, 0x0005, 0, 0, 0x001E },
+ { 0x0001, "wharf.wsa", "", 5, 0, 0xFFFF, 0xFFFF, 0x0000, 0x001C, 0x000A, 0, 0, 0x001E },
+ { 0x0001, "dinob.wsa", "", 5, 0, 0xFFFF, 0xFFFF, 0x0000, 0x0004, 0x0008, 0, 0, 0x001E },
+ { 0x0002, "", "fisher.cps", 4, 0, 0xFFFF, 0xFFFF, 0x0000, 0x0001, 0x0FA0, 0, 0, 0x0004 }
+};
+
+static const HoFNestedSequence k2SeqplaySeqDataDOSDemoSeqNested[5] = {
+ { 0x0002, "wharf2.wsa", 0, 70, 1, 0, 0, 0, NULL, 0, 0 },
+ { 0x0002, "dinob2.wsa", 0, 80, 2, 0, 0, 0, NULL, 0, 0 },
+ { 0x0004, "water.wsa", 0, 11, 4, 0, 0, 0, NULL, 0, 0 },
+ { 0x0004, "bail.wsa", 0, 16, 24, 0, 0, 0, NULL, 0, 0 },
+ { 0x0004, "dig.wsa", 0, 12, 18, 0, 0, 0, NULL, 0, 0 }
+};
+
+static const HoFSequenceProvider k2SeqplaySeqDataDOSDemoProvider = { ARRAYSIZE(k2SeqplaySeqDataDOSDemoSeq), k2SeqplaySeqDataDOSDemoSeq, ARRAYSIZE(k2SeqplaySeqDataDOSDemoSeqNested), k2SeqplaySeqDataDOSDemoSeqNested };
+
+static const char *const k2SeqplaySfxFilesDOSDemo[20] = {
+ "bigslam",
+ "clothes1",
+ "doormtop",
+ "fngrsnap",
+ "frogmix2",
+ "frogsigh",
+ "h2odrop2",
+ "orcmove",
+ "rowboat1",
+ "squish1",
+ "stretch1",
+ "ocean1",
+ "splash1",
+ "trex1",
+ "trex3",
+ "trex5",
+ "zno2",
+ "big",
+ "dreamer",
+ ""
+};
+
+static const StringListProvider k2SeqplaySfxFilesDOSDemoProvider = { ARRAYSIZE(k2SeqplaySfxFilesDOSDemo), k2SeqplaySfxFilesDOSDemo };
+
+static const char *const k2SeqplayIntroTracksDOSDemo[2] = {
+ "k2_demo",
+ "k2_demo"
+};
+
+static const StringListProvider k2SeqplayIntroTracksDOSDemoProvider = { ARRAYSIZE(k2SeqplayIntroTracksDOSDemo), k2SeqplayIntroTracksDOSDemo };
+
+static const HoFSeqItemAnimData k2SeqplayShapeAnimDataDOSDemo[4] = {
+ { 0, 67,
+ { 0x0000, 0x0001, 0x0002, 0x0003, 0x0002, 0x0001, 0x0000, 0x0001, 0x0002, 0x0003,
+ 0x0002, 0x0001, 0x0000, 0x0001, 0x0002, 0x0003, 0x0002, 0x0001, 0x0000, 0x0000 } },
+ { 4, 109,
+ { 0x0000, 0x0001, 0x0002, 0x0003, 0x0000, 0x0001, 0x0002, 0x0003, 0x0000, 0x0001,
+ 0x0002, 0x0003, 0x0000, 0x0001, 0x0002, 0x0003, 0x0000, 0x0001, 0x0002, 0x0003 } },
+ { 8, 145,
+ { 0x0000, 0x0001, 0x0002, 0x0003, 0x0003, 0x0002, 0x0001, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 } },
+ { 12, 180,
+ { 0x0000, 0x0001, 0x0002, 0x0003, 0x0000, 0x0001, 0x0002, 0x0003, 0x0000, 0x0001,
+ 0x0002, 0x0003, 0x0000, 0x0001, 0x0002, 0x0003, 0x0000, 0x0001, 0x0002, 0x0003 } }
+};
+
+static const HoFSeqItemAnimDataProvider k2SeqplayShapeAnimDataDOSDemoProvider = { ARRAYSIZE(k2SeqplayShapeAnimDataDOSDemo), k2SeqplayShapeAnimDataDOSDemo };
+
diff --git a/devtools/create_kyradat/resources/hof_dos_english.h b/devtools/create_kyradat/resources/hof_dos_english.h
new file mode 100644
index 0000000000..35ba8eac15
--- /dev/null
+++ b/devtools/create_kyradat/resources/hof_dos_english.h
@@ -0,0 +1,108 @@
+static const char *const k2SeqplayStringsDOSEnglish[103] = {
+ "Kyrandia is disappearing!",
+ "Rock by rock,",
+ "And tree by tree.",
+ "Kyrandia ceases to exist!",
+ "The Royal Mystics are baffled.",
+ "Every reference has been consulted.",
+ "Even Marko and his new valet, have been allowed into the conference.",
+ "Luckily, the Hand was experienced in these matters.",
+ "And finally a plan was approved,",
+ "That required a magic Anchor Stone,",
+ "To be retrieved from the center of the world.",
+ "Zanthia, youngest of the Kyrandian Mystics, has been selected to retrieve the Stone.",
+ "Thank you for playing The Hand of Fate.",
+ "This should be enough blueberries to open a portal to the center of the world.",
+ " DUMMY STRING... ",
+ " DUMMY STRING... ",
+ "Hey! All my equipment has been stolen!",
+ " DUMMY STRING... ",
+ "If they think I'm going to walk all the way down there, they're nuts!",
+ " DUMMY STRING... ",
+ " DUMMY STRING... ",
+ "Hurry up Faun!",
+ "Boy, that was a close call!",
+ "You said it pal. I, for one, am never going hunting again!",
+ "Ribbit.",
+ "How many times do I have to tell you? You're a toad.",
+ "Oh no! We're out of cheese!",
+ "Let's try this earwax. It's orange.",
+ "Mommy, when do I get the ivy?",
+ "Get out of here, shoo!",
+ "You cut, and I'll choose.",
+ "No. You cut and I'll choose.",
+ "I still say it was derivative drivel.",
+ "Aw, you still wouldn't recognize iambic pentameter if it bit you on the butt!",
+ "Executive Producer",
+ "Brett W. Sperry",
+ "Designed & Directed by",
+ "Rick Gush",
+ "Lead Programmer",
+ "Michael Legg",
+ "Art Management",
+ "Louis Castle",
+ "Joseph B. Hewitt IV",
+ "Lead Artist",
+ "Rick Parks",
+ "Additional Coding by",
+ "Philip W. Gorrow",
+ "Matt Collins",
+ "Mark McCubbin",
+ "Artists",
+ "Cameron Chun",
+ "Cary Averett",
+ "Cindy Chinn",
+ "Elie Arabian",
+ "Fei Cheng",
+ "Ferby Miguel",
+ "Frank Mendeola",
+ "Jack Martin",
+ "Jerry Moore",
+ "",
+ "Judith Peterson",
+ "Larry Miller",
+ "Lenny Lee",
+ "Louise Sandoval",
+ "Ren Olsen",
+ "Music & Sounds by",
+ "Paul Mudra",
+ "Frank Klepacki",
+ "Dwight Okahara",
+ "Pat Collins",
+ "Qualilty Assurance by",
+ "Glenn Sperry",
+ "Michael Lightner",
+ "William Foster",
+ "Jesse Clemit",
+ "Jeff Fillhaber",
+ "Manual, Package Design",
+ "& Fulfillment",
+ "Eydie Laramore",
+ "Lisa Marcinko",
+ "Lauren Rifkin",
+ "Congratulations!",
+ "Thank you for playing The Hand of Fate!",
+ "Guest Coding",
+ "Producer Liaison",
+ "Scott Duckett",
+ "Irvine Testers",
+ "Chris McFarland",
+ "Paul Moore",
+ "Chad Soares",
+ "Jared Brinkley",
+ "Jon Willliams",
+ "Chris Toft",
+ "Chris's Hair by",
+ "Cumulo Nimbus",
+ "Load a game",
+ "Introduction",
+ "Start a new game",
+ "Exit the game",
+ "Special Thanks to",
+ "Sake Joe Bostic-san",
+ "Tim Fritz",
+ "Kenny Dunne"
+};
+
+static const StringListProvider k2SeqplayStringsDOSEnglishProvider = { ARRAYSIZE(k2SeqplayStringsDOSEnglish), k2SeqplayStringsDOSEnglish };
+
diff --git a/devtools/create_kyradat/resources/hof_dos_french.h b/devtools/create_kyradat/resources/hof_dos_french.h
new file mode 100644
index 0000000000..fc21dc0601
--- /dev/null
+++ b/devtools/create_kyradat/resources/hof_dos_french.h
@@ -0,0 +1,108 @@
+static const char *const k2SeqplayStringsDOSFrench[103] = {
+ "Kyrandia est en train de dispara""\x8C""tre!",
+ "Pierre apr""\x8A""s pierre...",
+ "Arbre apr""\x8A""s arbre.",
+ "Kyrandia va cesser d'exister!",
+ "Les Grands Mystiques Royaux sont perplexes...",
+ "Ils ont consult""\x82"" tous les ouvrages!",
+ "M""\x88""me Marko et son nouveau valet ont ""\x82""t""\x82"" admis dans la conf""\x82""rence.",
+ "Heureusement, la Main connaissait bien ce sujet.",
+ "Un plan fut finalement approuv""\x82""...",
+ "Il n""\x82""cessitait une Ancre de Pierre magique...",
+ "Qu'il fallait aller chercher... au centre du monde!",
+ "Zanthia, la plus jeune des Mystiques de Kyrandia, a ""\x82""t""\x82"" choisie pour r""\x82""cup""\x82""rer cette pierre.",
+ "Merci d'avoir jou""\x82"" ""\x85"" The Hand of Fate.",
+ "Je devrais avoir assez de myrtilles pour ouvrir un portail vers le centre du monde...",
+ " DUMMY STRING... ",
+ " DUMMY STRING... ",
+ "H""\x82""! On m'a vol""\x82"" tout mon ""\x82""quipement!",
+ " DUMMY STRING... ",
+ "S'ils croient que je vais y aller ""\x85"" pied, ils peuvent toujours courir!",
+ " DUMMY STRING... ",
+ " DUMMY STRING... ",
+ "Vite, Faun!",
+ "Mon vieux, nous l'avons ""\x82""chapp""\x82"" belle!",
+ "Tu l'as dit! En ce qui me concerne, j'abandonne la chasse!",
+ "Crooa.",
+ "Combien de fois faudra-t-il que je te le dise? Tu n'es qu'un sale crapaud!",
+ "Oh non! Nous n'avons plus de fromage!",
+ "On n'a qu'""\x85"" essayer ""\x87""a. C'est orange.",
+ "Maman, quand est-ce qu'on mangera du lierre?",
+ "Sortez d'ici! Allez! Filez!",
+ "Tu coupes, et je choisis.",
+ "Non. TU coupes et JE choisis.",
+ "Je maintiens que c'""\x82""tait du radotage sans int""\x82""r""\x88""t.",
+ "Tu ne reconna""\x8C""trais toujours pas un po""\x8A""me ""\x8B""ambique, m""\x88""me s'il te mordait les fesses!",
+ "Producteur Ex""\x82""cutif",
+ "Brett W. Sperry",
+ "Con""\x87""u et Dirig""\x82"" par",
+ "Rick Gush",
+ "Programmeur Principal",
+ "Michael Legg",
+ "Direction Artistique",
+ "Louis Castle",
+ "Joseph B. Hewitt IV",
+ "Graphiste principal",
+ "Rick Parks",
+ "Programmation acrobatie",
+ "Philip W. Gorrow",
+ "Michael Grayford",
+ "Mark McCubbin",
+ "Graphistes",
+ "Cameron Chun",
+ "Cary Averett",
+ "Cindy Chinn",
+ "Elie Arabian",
+ "Fei Cheng",
+ "Ferby Miguel",
+ "Frank Mendeola",
+ "Jack Martin",
+ "Jerry Moore",
+ "",
+ "Judith Peterson",
+ "Larry Miller",
+ "Lenny Lee",
+ "Louise Sandoval",
+ "Ren Olsen",
+ "Musique et sons:",
+ "Paul Mudra",
+ "Frank Klepacki",
+ "Dwight Okahara",
+ "Pat Collins",
+ "Tests de Qualit""\x82",
+ "Glenn Sperry",
+ "Michael Lightner",
+ "William Foster",
+ "Jesse Clemit",
+ "Pierre Cardin",
+ "Conception du Manuel,",
+ "Emballage & Ex""\x82""cution",
+ "Eydie Laramore",
+ "Lisa Marcinko",
+ "Lauren Rifkin",
+ "F""\x82""licitations!",
+ "Merci d'avoir jou""\x82"" ""\x85"" The Hand of Fate!",
+ "Programmeur invit""\x82",
+ "Coordination Production",
+ "Scott Duckett",
+ "Testeurs - Irvine",
+ "Chris McFarland",
+ "Paul Moore",
+ "Chad Soares",
+ "Jared Brinkley",
+ "Jon Williams",
+ "Chris Toft",
+ "Adaptation fran""\x87""aise:",
+ "Art Of Words",
+ "Charger une partie",
+ "Introduction",
+ "Nouvelle Partie",
+ "Quitter le jeu",
+ "Remerciements sp""\x82""ciaux",
+ "Sake Joe Bostic-san",
+ "Tim Fritz",
+ "Kenny Dunne"
+};
+
+static const StringListProvider k2SeqplayStringsDOSFrenchProvider = { ARRAYSIZE(k2SeqplayStringsDOSFrench), k2SeqplayStringsDOSFrench };
+
diff --git a/devtools/create_kyradat/resources/hof_dos_german.h b/devtools/create_kyradat/resources/hof_dos_german.h
new file mode 100644
index 0000000000..8529ed03da
--- /dev/null
+++ b/devtools/create_kyradat/resources/hof_dos_german.h
@@ -0,0 +1,108 @@
+static const char *const k2SeqplayStringsDOSGerman[103] = {
+ "Kyrandia l""\x94""st sich auf!",
+ "Stein f""\x81""r Stein,",
+ "Und Baum f""\x81""r Baum.",
+ "Kyrandia h""\x94""rt auf zu existieren!",
+ "Die k""\x94""niglichen Mystiker sind verzweifelt.",
+ "Jede Informationsquelle wurde zu Rate gezogen.",
+ "Sogar Marko und sein neuer Kammerdiener durften den Konferenzen beiwohnen.",
+ "Gl""\x81""cklicherweise, hatte die Hand Erfahrungen in solchen Dingen.",
+ "Und letztendlich konnte man sich auf einen Plan einigen,",
+ "Zu dessen Durchf""\x81""hrung es eines magischen Ankerstein bedarf,",
+ "Der aus der Mitte der Welt geholt werden mu""\xE1"".",
+ "Zanthia, j""\x81""ngste der kyrandianischen Mystiker, wurde ausgew""\x84""hlt, um diesen Stein zu holen.",
+ "Vielen Dank, da""\xE1"" Du die Hand des Schicksals spielst.",
+ "Dies sollten gen""\x81""gend Blaubeeren sein, um ein Portal zur Mitte der Erde zu ""\x94""ffnen.",
+ " DUMMY STRING... ",
+ " DUMMY STRING... ",
+ "Hey! Meine gesamte Ausr""\x81""stung wurde gestohlen!",
+ " DUMMY STRING... ",
+ "Wenn die glauben, da""\xE1"" ich den ganzen Weg nach unten laufe, haben die sich aber in den Finger geschnitten!",
+ " DUMMY STRING... ",
+ " DUMMY STRING... ",
+ "Beeile Dich, Faun!",
+ "Junge, Junge das war aber knapp!",
+ "Da hast Du recht, Kumpel. Ich werde nie wieder jagen gehen!",
+ "Quuaaak.",
+ "Wie oft mu""\xE1"" ich es Dir noch sagen? Du bist eine Kr""\x94""te.",
+ "Oh nein! Der K""\x84""se ist alle!",
+ "Versuchen wir es mal mit dem Ohrenwachs. Es ist orange.",
+ "Mama, wann bekomme ich das Efeu?",
+ "Husch husch, komm hier raus!",
+ "Du schneidest, und ich suche aus.",
+ "Nein. Du schneidest und ich werde aussuchen.",
+ "Ich bin immernoch der\rMeinung, da""\xE1"" er es nur\rso dahingeplappert hat.",
+ "Argh, Du w""\x81""rdest ein jambisches Pentameter nicht erkennen, wenn es Dich in den Hintern bei""\xE1""en w""\x81""rde!",
+ "Executive Producer",
+ "Brett W. Sperry",
+ "Director & Designer",
+ "Rick Gush",
+ "Lead Programmer",
+ "Michael Legg",
+ "Art Management",
+ "Louis Castle",
+ "Joseph B. Hewitt IV",
+ "Lead Artist",
+ "Rick Parks",
+ "Additional Coding by",
+ "Philip W. Gorrow",
+ "Michael Grayford",
+ "Mark McCubbin",
+ "Artists",
+ "Cameron Chun",
+ "Cary Averett",
+ "Cindy Chinn",
+ "Elie Arabian",
+ "Fei Cheng",
+ "Ferby Miguel",
+ "Frank Mendeola",
+ "Jack Martin",
+ "Jerry Moore",
+ "",
+ "Judith Peterson",
+ "Larry Miller",
+ "Lenny Lee",
+ "Louise Sandoval",
+ "Ren Olsen",
+ "Music & Sounds by",
+ "Paul Mudra",
+ "Frank Klepacki",
+ "Dwight Okahara",
+ "Pat Collins",
+ "Quality Assurance by",
+ "Glenn Sperry",
+ "Michael Lightner",
+ "William Foster",
+ "Jesse Clemit",
+ "Black Pete",
+ "Manual, Package Design",
+ "& Fulfillment by",
+ "Eydie Laramore",
+ "Lisa Marcinko",
+ "Lauren Rifkin",
+ "Unseren Gl""\x81""ckw""\x81""nsch!",
+ "Vielen Dank, da""\xE1"" Sie The Hand of Fate gespielt haben!",
+ "Guest Coding",
+ "Producer Liaison",
+ "Scott Duckett",
+ "Irvine Testers",
+ "Chris McFarland",
+ "Paul Moore",
+ "Chad Soares",
+ "Jared Brinkley",
+ "Jon Willliams",
+ "Chris Toft",
+ "Ants! Ants! Ants!",
+ "Ted Morris",
+ "Spielstand laden",
+ "Intro",
+ "Neues Spiel starten",
+ "Spiel beenden",
+ "Vielen Dank an",
+ "tom schmidt",
+ "Tim Fritz",
+ "Kenny Dunne"
+};
+
+static const StringListProvider k2SeqplayStringsDOSGermanProvider = { ARRAYSIZE(k2SeqplayStringsDOSGerman), k2SeqplayStringsDOSGerman };
+
diff --git a/devtools/create_kyradat/resources/hof_dos_italian.h b/devtools/create_kyradat/resources/hof_dos_italian.h
new file mode 100644
index 0000000000..825c6231f2
--- /dev/null
+++ b/devtools/create_kyradat/resources/hof_dos_italian.h
@@ -0,0 +1,108 @@
+static const char *const k2SeqplayStringsDOSItalian[103] = {
+ "Kyrandia sta scomparendo!",
+ "Roccia dopo roccia...",
+ "...e albero dopo albero.",
+ "Kyrandia cessa di esistere!",
+ "I Mistici Reali sono sconcertati.",
+ "Ogni testo ""\x8A"" stato consultato.",
+ "Perfino Marko e il suo nuovo assistente sono stati invitati alla conferenza.",
+ "Per fortuna, Mano ha esperienza in queste situazioni.",
+ "E finalmente un piano viene approvato...",
+ "...occorre un'Ancora magica di Pietra...",
+ "...da recuperare al centro della terra.",
+ "Zanthia, la pi""\x97"" giovane tra i Mistici di Kyrandia, ""\x8A"" stata scelta per recuperare la Pietra.",
+ "Grazie per aver giocato a The Hand of Fate.",
+ "Questi mirtilli dovrebbero bastare ad aprire un portale per il centro della terra.",
+ " MY ",
+ " MY ",
+ "Hey! Hanno rubato tutto il mio equipaggiamento!",
+ " MY ",
+ "Se pensano che ci arrivi a piedi fin laggi""\x97"", sono proprio dei pazzi!",
+ " MY ",
+ " DUMMY STRNG... ",
+ "Muoviti Fauno!",
+ "C'""\x8A"" mancato un pelo!",
+ "L'hai detto amico. Io ho smesso con la caccia!",
+ "Ribbit.",
+ "Quante volte devo dirtelo? Sei un rospo.",
+ "Oh no! Abbiamo finito il formaggio!",
+ "Proviamo con questo cerume. E' arancione.",
+ "Mami, non ""\x8A"" che alla fine mi trasformano in un golf?",
+ "Via di qui, shoo!",
+ "Tu tagli, e io scelgo.",
+ "No. Tu tagli e io scelgo.",
+ "Sono sempre convinta che si trattasse di un'assoluta cretinata.",
+ "Aw, non capirai mai niente di poesia. Facciamoci un'altra birra che ""\x8A"" meglio!",
+ "Executive Producer",
+ "Brett W. Sperry",
+ "Director",
+ "Rick Gush",
+ "Lead Programmer",
+ "Michael Legg",
+ "Art Management",
+ "Louis Castle",
+ "Joseph B. Hewitt IV",
+ "Lead Artist",
+ "Rick Parks",
+ "Additional Coding by",
+ "Philip W. Gorrow",
+ "Matt Collins",
+ "Mark McCubbin",
+ "Artists",
+ "Cameron Chun",
+ "Cary Averett",
+ "Cindy Chinn",
+ "Elie Arabian",
+ "Fei Cheng",
+ "Ferby Miguel",
+ "Frank Mendeola",
+ "Jack Martin",
+ "Jerry Moore",
+ "",
+ "Judith Peterson",
+ "Larry Miller",
+ "Lenny Lee",
+ "Louise Sandoval",
+ "Ren Olsen",
+ "Music & Sounds by",
+ "Paul Mudra",
+ "Frank Klepacki",
+ "Dwight Okahara",
+ "Pat Collins",
+ "Qualilty Assurance by",
+ "Glenn Sperry",
+ "Michael Lightner",
+ "William Foster",
+ "Jesse Clemit",
+ "Jeff Fillhaber",
+ "Manual, Package Design",
+ "& Fulfillment",
+ "Eydie Laramore",
+ "Lisa Marcinko",
+ "Lauren Rifkin",
+ "Congratulazioni!",
+ "Grazie per aver giocato a The Hand of Fate!",
+ "Guest Coding",
+ "Producer Liaison",
+ "Scott Duckett",
+ "Irvine Testers",
+ "Chris McFarland",
+ "Paul Moore",
+ "Chad Soares",
+ "Jared Brinkley",
+ "Jon Willliams",
+ "Chris Toft",
+ "Chris's Hair by",
+ "Cumulo Nimbus",
+ "Carica gioco",
+ "Introduzione",
+ "Nuovo gioco",
+ "Esci",
+ "Special Thanks to",
+ "Sake Joe Bostic-san",
+ "Tim Fritz",
+ "Kenny Dunne"
+};
+
+static const StringListProvider k2SeqplayStringsDOSItalianProvider = { ARRAYSIZE(k2SeqplayStringsDOSItalian), k2SeqplayStringsDOSItalian };
+
diff --git a/devtools/create_kyradat/resources/hof_dos_russian.h b/devtools/create_kyradat/resources/hof_dos_russian.h
new file mode 100644
index 0000000000..12df4ed31e
--- /dev/null
+++ b/devtools/create_kyradat/resources/hof_dos_russian.h
@@ -0,0 +1,133 @@
+static const char *const k2SeqplayStringsDOSRussian[128] = {
+ "K""\x18""pa""\x1D\x16\x18""~ ""\x18""c\\e""\x17""ae""\x1F""!",
+ "Ka""\x1C\x1D\x18""...",
+ "\x0F""epe""\x14""{~...",
+ "K""\x18""pa""\x1D\x16\x18\x18"" c#opo ""\x1D""e c""\x1F""a""\x1D""e""\x1F""!",
+ "Bo""\x10""]e""\x13\x1D\x18""#""\x18"" c""\x13\x18\x1F""` c ""\x1F""o""\x10""#y.",
+ "\x06\x16""e""\x1F"" ""\x1D""ay\\""\x1D""a~ ""\x16\x18""c#ycc""\x18""~.",
+ "\x0F""a""\x7F""e Map#o ""\x18"" e""\x15""o ""\x1D""o""\x14""`""\x19"" c""\x10""y""\x15""a, ""\x1E""p""\x18\x15\x10""a]e""\x1D""` ""\x1D""a o""\x13""cy""\x7F\x16""e""\x1D\x18""e.",
+ "K c\\ac""\x1F""{}, Py#a ""\x18\x1C""ee""\x1F"" o""\x1E""`""\x1F"" ""\x14"" |""\x1F\x18""x ""\x16""e""\x10""ax.",
+ "\x06"", ""\x1D""a#o""\x1D""e[, y""\x1F\x14""ep""\x7F\x16""e""\x1D"" ""\x1E\x10""a""\x1D"",",
+ "\x16\x10""~ #o""\x1F""opo""\x15""o ""\x1D""y""\x7F""e""\x1D"" ""\x12""#op""\x1D""`""\x19"" Ka""\x1C""e""\x1D""{,",
+ "\x18\x17\x14\x10""e\\e""\x1D\x1D""`""\x19"" ""\x18\x17"" [e""\x1D\x1F""pa ""\x17""e""\x1C\x10\x18"".",
+ "Ha""\x19\x1F\x18"" #a""\x1C""e""\x1D""{ ""\x1E""pe""\x16""c""\x1F""o""\x18\x1F"" ""\x05""a""\x1D""[""\x18\x18"", ca""\x1C""o""\x19"" ""\x1C\x10""a""\x16""]e""\x19"" ""\x14""o""\x10""]e""\x13\x1D\x18""[e K""\x18""pa""\x1D\x16\x18\x18"".",
+ "Thank you for playing The Hand of Fate.",
+ "\x08""o""\x1D""a""\x16""o""\x13\x18\x1F""{c~ ""\x1C\x1D""o""\x15""o c""\x18\x1D\x18""x ~""\x15""o""\x16"", \\""\x1F""o""\x13""` o""\x1F""#p`""\x1F""{ ""\x1E""op""\x1F""a""\x10"" ""\x14"" [e""\x1D\x1F""pe ""\x17""e""\x1C\x10\x18"".",
+ " DUMMY STRING... ",
+ " DUMMY STRING... ",
+ "O""\x19""! Bce o""\x13""opy""\x16""o""\x14""a""\x1D\x18""e y#pa""\x16""e""\x1D""o!",
+ " DUMMY STRING... ",
+ "Ec""\x10\x18"" o""\x1D\x18"" ""\x16""y""\x1C""a}""\x1F"", \\""\x1F""o ~ ""\x1E""o""\x19\x16""y ""\x1F""y""\x16""a ""\x1E""e]#o""\x1C"", ""\x1F""o o""\x1D\x18"" co]""\x10\x18"" c y""\x1C""a!",
+ " DUMMY STRING... ",
+ " DUMMY STRING... ",
+ "Topo""\x1E\x18""c{ \nay""\x1D""!",
+ "Ha |""\x1F""o""\x1F"" pa""\x17"" ""\x1E""po""\x1D""ec""\x10""o!",
+ "\x12"" ""\x13""o""\x10""{]e ""\x1D""a oxo""\x1F""y ""\x1D""e ""\x1E""o""\x19\x16""y!",
+ "K""\x14""a-#""\x14""a",
+ "C#o""\x10""{#o pa""\x17"" ""\x1F""e""\x13""e ""\x15""o""\x14""op""\x18\x1F""{? T` ""\x7F""a""\x13""a.",
+ "O ""\x1D""e""\x1F""! \t ""\x1D""ac\r#o""\x1D""\\""\x18\x10""c~ c`p!",
+ "\x08""o""\x1E""po""\x13""y""\x19"" y]""\x1D""y} cepy. O""\x1D""a opa""\x1D\x7F""e""\x14""a~.",
+ "Ma""\x1C""a, #o""\x15\x16""a ""\x1C\x1D""e\r""\x16""a""\x16""y""\x1F"" ""\x1E\x10""}^a?",
+ "K`]! K`]! ""\x01""yyy!",
+ "T` pa""\x17""pe""\x7F""{, a ~ ""\x14""`""\x13""epy.",
+ "He""\x1F"". T` pa""\x17""pe""\x7F""{, a ~ ""\x14""`""\x13""epy.",
+ "\x12"" ""\x14""ce ""\x7F""e y""\x1F\x14""ep""\x7F\x16""a}, \\""\x1F""o |""\x1F""o \\e""\x1E""yxa.",
+ "A, ""\x1F""` ""\x14""ce e^e ""\x1D""e ""\x1C""o""\x7F""e]{\rpac""\x1E""o""\x17\x1D""a""\x1F""{ ~""\x1C\x13\x18""\\ec#""\x18\x19"" ""\x1E""e""\x1D\x1F""a""\x1C""e""\x1F""p!",
+ "Executive Producer",
+ "Brett W. Sperry",
+ "Designed & Directed by",
+ "Rick Gush",
+ "Lead Programmer",
+ "Michael Legg",
+ "Art Management",
+ "Louis Castle",
+ "Joseph B. Hewitt IV",
+ "Lead Artist",
+ "Rick Parks",
+ "Additional Coding by",
+ "Philip W. Gorrow",
+ "Matt Collins",
+ "Mark McCubbin",
+ "Artists",
+ "Cameron Chun",
+ "Cary Averett",
+ "Cindy Chinn",
+ "Elie Arabian",
+ "Fei Cheng",
+ "Ferby Miguel",
+ "Frank Mendeola",
+ "Jack Martin",
+ "Jerry Moore",
+ "",
+ "Judith Peterson",
+ "Larry Miller",
+ "Lenny Lee",
+ "Louise Sandoval",
+ "Ren Olsen",
+ "Music & Sounds by",
+ "Paul Mudra",
+ "Frank Klepacki",
+ "Dwight Okahara",
+ "Pat Collins",
+ "Qualilty Assurance by",
+ "Glenn Sperry",
+ "Michael Lightner",
+ "William Foster",
+ "Jesse Clemit",
+ "Jeff Fillhaber",
+ "Manual, Package Design",
+ "& Fulfillment",
+ "Eydie Laramore",
+ "Lisa Marcinko",
+ "Lauren Rifkin",
+ "\x08""o""\x17\x16""pa""\x14\x10""~e""\x1C""!",
+ "\x08""epe""\x14""o""\x16"": Tapac Ka""\x1F""#o""\x14"". K""\x18""e""\x14"". 296-19-77.",
+ "Guest Coding",
+ "Producer Liaison",
+ "Scott Duckett",
+ "Irvine Testers",
+ "Chris McFarland",
+ "Paul Moore",
+ "Chad Soares",
+ "Jared Brinkley",
+ "Jon Willliams",
+ "Chris Toft",
+ "Chris's Hair by",
+ "Cumulo Nimbus",
+ "\x05""a""\x15""py""\x17\x18\x1F""{",
+ "B""\x14""e""\x16""e""\x1D\x18""e",
+ "Ho""\x14""a~ ""\x18\x15""pa",
+ "B`""\x19\x1F\x18"" ""\x18\x17"" ""\x18\x15""p`",
+ "Special Thanks to",
+ "Sake Joe Bostic-san",
+ "Tim Fritz",
+ "Kenny Dunne",
+ "",
+ "",
+ "",
+ "",
+ "",
+ "",
+ "",
+ "",
+ "",
+ "",
+ "",
+ "",
+ "",
+ "",
+ "",
+ "",
+ "",
+ "",
+ "",
+ "",
+ "",
+ "",
+ "",
+ "",
+ ""
+};
+
+static const StringListProvider k2SeqplayStringsDOSRussianProvider = { ARRAYSIZE(k2SeqplayStringsDOSRussian), k2SeqplayStringsDOSRussian };
+
diff --git a/devtools/create_kyradat/resources/hof_fmtowns.h b/devtools/create_kyradat/resources/hof_fmtowns.h
new file mode 100644
index 0000000000..b254946492
--- /dev/null
+++ b/devtools/create_kyradat/resources/hof_fmtowns.h
@@ -0,0 +1,716 @@
+static const char *const k2SeqplayPakFilesFMTowns[4] = {
+ "INTROGEN.PAK",
+ "INTROVOC.PAK",
+ "VOC.PAK",
+ "WSCORE.PAK"
+};
+
+static const StringListProvider k2SeqplayPakFilesFMTownsProvider = { ARRAYSIZE(k2SeqplayPakFilesFMTowns), k2SeqplayPakFilesFMTowns };
+
+static const char *const k2SeqplaySfxFilesFMTowns[33] = {
+ "intro1",
+ "intro2",
+ "intro3",
+ "intro4",
+ "intro5",
+ "intro6",
+ "intro7",
+ "intro8",
+ "intro9",
+ "intro10",
+ "intro11",
+ "intro12",
+ "glow",
+ "asong",
+ "crowcaw",
+ "eyerub2",
+ "pluck3",
+ "rodnreel",
+ "frog1",
+ "scavmov2",
+ "lambmom3",
+ "lambkid1",
+ "thunder2",
+ "thunder3",
+ "wind6",
+ "h2odrop2",
+ "gasleak",
+ "polgulp1",
+ "hndslap1",
+ "burp1",
+ "scream1",
+ "theend",
+ ""
+};
+
+static const StringListProvider k2SeqplaySfxFilesFMTownsProvider = { ARRAYSIZE(k2SeqplaySfxFilesFMTowns), k2SeqplaySfxFilesFMTowns };
+
+static const HoFSequence k2SeqplaySeqDataFMTownsSeq[16] = {
+ { 0x0002, "", "virgin.cps", 4, 0, 0xFFFF, 0xFFFF, 0x0000, 0x0001, 0x0064, 0, 0, 0x001E },
+ { 0x0001, "westwood.wsa", "", 4, 0, 0xFFFF, 0xFFFF, 0x0000, 0x0012, 0x000C, 0, 0, 0x00A0 },
+ { 0x0001, "title.wsa", "", 4, 0, 0xFFFF, 0xFFFF, 0x0000, 0x001A, 0x000C, 0, 0, 0x000A },
+ { 0x0002, "", "over.cps", 4, 0, 0xFFFF, 0xFFFF, 0x0000, 0x0001, 0x0E10, 0, 0, 0x001E },
+ { 0x0002, "", "library.cps", 4, 0, 0xFFFF, 0xFFFF, 0x0000, 0x0001, 0x0E10, 0, 0, 0x001E },
+ { 0x0002, "", "hand.cps", 4, 0, 0xFFFF, 0xFFFF, 0x0000, 0x0001, 0x0E10, 0, 0, 0x005A },
+ { 0x0001, "point.wsa", "", 4, 8, 0xFFFF, 0xFFFF, 0x0000, 0x0026, 0x0007, 0, 0, 0x00C8 },
+ { 0x0001, "zanfaun.wsa", "", 4, 0, 0xFFFF, 0xFFFF, 0x0000, 0x0033, 0x0010, 0, 0, 0x00F0 },
+ { 0x0001, "funters.wsa", "", 4, 0, 0xFFFF, 0xFFFF, 0x0000, 0x001B, 0x000C, 0, 0, 0x001E },
+ { 0x0001, "ferb.wsa", "", 4, 0, 0xFFFF, 0xFFFF, 0x0000, 0x001B, 0x0010, 0, 0, 0x001E },
+ { 0x0001, "fish.wsa", "", 4, 0, 0xFFFF, 0xFFFF, 0x0000, 0x0038, 0x000C, 0, 0, 0x001E },
+ { 0x0001, "fheep.wsa", "", 4, 0, 0xFFFF, 0xFFFF, 0x0000, 0x000B, 0x000C, 0, 0, 0x001E },
+ { 0x0001, "farmer.wsa", "", 4, 0, 0xFFFF, 0xFFFF, 0x0000, 0x0016, 0x000C, 0, 0, 0x0064 },
+ { 0x0001, "fuards.wsa", "", 4, 0, 0xFFFF, 0xFFFF, 0x0000, 0x0018, 0x000E, 0, 0, 0x001E },
+ { 0x0001, "firates.wsa", "", 4, 0, 0xFFFF, 0xFFFF, 0x0000, 0x0025, 0x000C, 0, 0, 0x001E },
+ { 0x0001, "frash.wsa", "", 4, 0, 0xFFFF, 0xFFFF, 0x0000, 0x000C, 0x000A, 0, 0, 0x0154 }
+};
+
+static const FrameControl k2SeqplaySeqDataFMTownsSeqNestedControl7[18] = {
+ { 0, 10 },
+ { 1, 10 },
+ { 2, 10 },
+ { 3, 10 },
+ { 4, 10 },
+ { 5, 10 },
+ { 6, 10 },
+ { 7, 10 },
+ { 8, 10 },
+ { 9, 10 },
+ { 8, 10 },
+ { 7, 10 },
+ { 6, 10 },
+ { 5, 40 },
+ { 4, 10 },
+ { 3, 10 },
+ { 2, 10 },
+ { 1, 10 }
+};
+
+static const FrameControl k2SeqplaySeqDataFMTownsSeqNestedControl10[17] = {
+ { 0, 6 },
+ { 1, 6 },
+ { 2, 6 },
+ { 3, 6 },
+ { 4, 6 },
+ { 5, 6 },
+ { 6, 6 },
+ { 7, 6 },
+ { 8, 6 },
+ { 9, 6 },
+ { 10, 6 },
+ { 11, 6 },
+ { 11, 12 },
+ { 12, 12 },
+ { 13, 12 },
+ { 12, 12 },
+ { 11, 12 }
+};
+
+static const FrameControl k2SeqplaySeqDataFMTownsSeqNestedControl11[9] = {
+ { 0, 6 },
+ { 1, 6 },
+ { 2, 6 },
+ { 3, 6 },
+ { 4, 6 },
+ { 3, 6 },
+ { 4, 6 },
+ { 5, 64 },
+ { 5, 6 }
+};
+
+static const FrameControl k2SeqplaySeqDataFMTownsSeqNestedControl12[16] = {
+ { 0, 6 },
+ { 1, 6 },
+ { 0, 6 },
+ { 1, 6 },
+ { 0, 6 },
+ { 1, 6 },
+ { 0, 6 },
+ { 1, 6 },
+ { 0, 6 },
+ { 1, 6 },
+ { 0, 6 },
+ { 1, 6 },
+ { 0, 6 },
+ { 1, 6 },
+ { 0, 6 },
+ { 1, 6 }
+};
+
+static const FrameControl k2SeqplaySeqDataFMTownsSeqNestedControl13[5] = {
+ { 0, 6 },
+ { 1, 6 },
+ { 2, 6 },
+ { 1, 6 },
+ { 0, 1 }
+};
+
+static const FrameControl k2SeqplaySeqDataFMTownsSeqNestedControl14[8] = {
+ { 0, 6 },
+ { 1, 6 },
+ { 2, 6 },
+ { 3, 6 },
+ { 4, 6 },
+ { 3, 6 },
+ { 2, 6 },
+ { 1, 6 }
+};
+
+static const HoFNestedSequence k2SeqplaySeqDataFMTownsSeqNested[15] = {
+ { 0x000C, "figgle.wsa", 0, 3, 60, 0, 0, 0, NULL, 0, 0 },
+ { 0x0008, "over1.wsa", 0, 10, 10, 0, 0, 0, NULL, 0, 0 },
+ { 0x0008, "over2.wsa", 0, 11, 9, 0, 0, 0, NULL, 0, 0 },
+ { 0x0008, "forest.wsa", 0, 22, 6, 0, 0, 0, NULL, 1, 3 },
+ { 0x0008, "dragon.wsa", 0, 11, 6, 0, 0, 0, NULL, 2, 0 },
+ { 0x0002, "darm.wsa", 0, 19, 9, 0, 0, 0, NULL, 4, 0 },
+ { 0x0002, "library.wsa", 0, 33, 9, 0, 0, 0, NULL, 4, 0 },
+ { 0x002A, "library.wsa", 0, 18, 9, 0, 0, ARRAYSIZE(k2SeqplaySeqDataFMTownsSeqNestedControl7), k2SeqplaySeqDataFMTownsSeqNestedControl7, 0, 0 },
+ { 0x000A, "marco.wsa", 0, 37, 9, 0, 0, 0, NULL, 4, 0 },
+ { 0x0002, "hand1a.wsa", 0, 34, 9, 0, 0, 0, NULL, 0, 0 },
+ { 0x002A, "hand1b.wsa", 0, 16, 9, 0, 0, ARRAYSIZE(k2SeqplaySeqDataFMTownsSeqNestedControl10), k2SeqplaySeqDataFMTownsSeqNestedControl10, 0, 0 },
+ { 0x002A, "hand1c.wsa", 0, 9, 9, 0, 0, ARRAYSIZE(k2SeqplaySeqDataFMTownsSeqNestedControl11), k2SeqplaySeqDataFMTownsSeqNestedControl11, 0, 0 },
+ { 0x002C, "hand2.wsa", 0, 2, 9, 0, 0, ARRAYSIZE(k2SeqplaySeqDataFMTownsSeqNestedControl12), k2SeqplaySeqDataFMTownsSeqNestedControl12, 5, 0 },
+ { 0x002C, "hand3.wsa", 0, 4, 9, 0, 0, ARRAYSIZE(k2SeqplaySeqDataFMTownsSeqNestedControl13), k2SeqplaySeqDataFMTownsSeqNestedControl13, 5, 0 },
+ { 0x002C, "hand4.wsa", 0, 8, 9, 0, 0, ARRAYSIZE(k2SeqplaySeqDataFMTownsSeqNestedControl14), k2SeqplaySeqDataFMTownsSeqNestedControl14, 5, 0 }
+};
+
+static const HoFSequenceProvider k2SeqplaySeqDataFMTownsProvider = { ARRAYSIZE(k2SeqplaySeqDataFMTownsSeq), k2SeqplaySeqDataFMTownsSeq, ARRAYSIZE(k2SeqplaySeqDataFMTownsSeqNested), k2SeqplaySeqDataFMTownsSeqNested };
+
+static const byte k2SeqplayIntroCDAFMTowns[24] = {
+ 0x03, 0x00, 0x01, 0x00, 0x04, 0x00, 0x02, 0x00,
+ 0x05, 0x00, 0x03, 0x00, 0x06, 0x00, 0x04, 0x00,
+ 0x07, 0x00, 0x05, 0x00, 0x08, 0x00, 0x06, 0x00
+};
+
+static const ByteProvider k2SeqplayIntroCDAFMTownsProvider = { ARRAYSIZE(k2SeqplayIntroCDAFMTowns), k2SeqplayIntroCDAFMTowns };
+
+static const byte k2SeqplayFinaleCDAFMTowns[8] = {
+ 0x03, 0x00, 0x53, 0x00, 0x04, 0x00, 0x54, 0x00
+};
+
+static const ByteProvider k2SeqplayFinaleCDAFMTownsProvider = { ARRAYSIZE(k2SeqplayFinaleCDAFMTowns), k2SeqplayFinaleCDAFMTowns };
+
+static const char *const k2IngamePakFilesFMTowns[20] = {
+ "MISC_EMC.PAK",
+ "VOC.PAK",
+ "MISC_CPS.PAK",
+ "OTHER.PAK",
+ "COST1_SH.PAK",
+ "COST2_SH.PAK",
+ "COST3_SH.PAK",
+ "COST4_SH.PAK",
+ "COST5_SH.PAK",
+ "COST6_SH.PAK",
+ "COST7_SH.PAK",
+ "COST8_SH.PAK",
+ "COST9_SH.PAK",
+ "CAULDRON.PAK",
+ "WSCORE.PAK",
+ "HOFCH_1.PAK",
+ "HOFCH_2.PAK",
+ "HOFCH_3.PAK",
+ "HOFCH_4.PAK",
+ "HOFCH_5.PAK"
+};
+
+static const StringListProvider k2IngamePakFilesFMTownsProvider = { ARRAYSIZE(k2IngamePakFilesFMTowns), k2IngamePakFilesFMTowns };
+
+static const char *const k2IngameSfxFilesFMTowns[179] = {
+ "ALCHEMY2",
+ "BIGSLAM",
+ "BITE1",
+ "BLINK1",
+ "BOING1",
+ "BUBBLE1",
+ "BUBBLE2",
+ "BURP1",
+ "BUTTON6",
+ "CAULDRN2",
+ "CHEST",
+ "CLOTHES1",
+ "CROCLAF4",
+ "CRY1",
+ "CRY2",
+ "DOORMTCL",
+ "DOORMTOP",
+ "DOORWDCL",
+ "DOORWDOP",
+ "DRUM1",
+ "DRUM2",
+ "DRUM3",
+ "DRUM4",
+ "DRUM5",
+ "DRUM6",
+ "DRUM7",
+ "EYERUB2",
+ "FALL1",
+ "FALL3",
+ "FNGRSNAP",
+ "FORMSPL1",
+ "FROG1",
+ "FROGMIX2",
+ "GASLEAK",
+ "GLOWY1",
+ "GOOD3",
+ "GOOD5",
+ "GROWTWIG",
+ "H2ODROP2",
+ "H2OPLANT",
+ "HACHUCKD",
+ "HAYFALL2",
+ "HAYSRCH4",
+ "ICECUBE",
+ "KEYOPEN",
+ "LAMBKID1",
+ "LAMBMOM3",
+ "LAUGH1",
+ "LAUGH3",
+ "LAUGH4",
+ "LIZLISP",
+ "MAKESPL1",
+ "MSTDOOM1",
+ "ORCMOVE",
+ "PLUCK3",
+ "POLGULP1",
+ "PORTCUL",
+ "POURH20",
+ "RIP2",
+ "RODNREEL",
+ "ROWBOAT1",
+ "RUCKUS1",
+ "SCAVMOV2",
+ "SCRATCH1",
+ "SNAKSPEL",
+ "SNEEZE1",
+ "SNIFF1",
+ "SNOREIN3",
+ "SNOROUT",
+ "SPLASH1",
+ "SQUEAK1",
+ "SQUEAK2",
+ "SQUEAK3",
+ "SQUISH1",
+ "SQUISH2",
+ "STEAM",
+ "STEAM3",
+ "STRETCH1",
+ "SWING",
+ "TREZA1",
+ "TURNPAG2",
+ "TWIGSNAP",
+ "UGH1",
+ "WHEEL4",
+ "WINGS1",
+ "YAWN1",
+ "ZOOM5",
+ "FILBOTL",
+ "H2OPOUR1",
+ "JAILDOR1",
+ "JAILLOK1",
+ "CASHREG1",
+ "SWISH1",
+ "TURNBOAT",
+ "CLAPPING",
+ "CRUNCH1",
+ "WHEEL6",
+ "LITEMAG",
+ "SHELDOWN",
+ "SHELSLID",
+ "ZOW2",
+ "ZANLOOP1",
+ "SCREECH2",
+ "PANTING",
+ "TREX1",
+ "TREX5",
+ "TREX3",
+ "QUAKE",
+ "WRINGH2O",
+ "SPLAT2",
+ "OCEAN1",
+ "SPLAT3",
+ "CROCLAF5",
+ "FALL5",
+ "ZCMON2",
+ "ZWAIT3",
+ "ZNO2",
+ "CROCLAF7",
+ "CRICKET1",
+ "FIREBRTH",
+ "COW2",
+ "SAP2",
+ "PMTLHI",
+ "FROGSIGH",
+ "CRICEND",
+ "CRY3",
+ "CRY4",
+ "SHROOM1",
+ "DRIP1",
+ "SWIM4",
+ "CUCKOO2",
+ "PUNCH1",
+ "SNORT3",
+ "STAMPER2",
+ "WALLFALL",
+ "WOODFAL1",
+ "SPRAY1",
+ "OHNO1",
+ "YAHOO1",
+ "YIPEE1",
+ "WIND1",
+ "WIND3",
+ "WIND6",
+ "BLOWUP2",
+ "BOATLOP2",
+ "ZGIGGL1",
+ "ZCOUGH1",
+ "CRUSH",
+ "ALARM3",
+ "APPLEAT",
+ "BABYCRY1",
+ "BABYLAF1",
+ "BABYLIK1",
+ "GEARMX3",
+ "GLASBRK2",
+ "HANDKIL1",
+ "HNDSLAP1",
+ "ICEPICK1",
+ "KISS3",
+ "LOLIFAL1",
+ "PAGEBURN",
+ "PRTYHORN",
+ "SCREAM1",
+ "SPARKHIT",
+ "SPRING2",
+ "ZANLAND1",
+ "BIGBOW",
+ "BOWFORM",
+ "BULBHIT",
+ "EYELITE",
+ "ROOFBOW",
+ "FBIGFOT1",
+ "BIGFOOT4",
+ "DORSTNCL",
+ "CROWCAW",
+ "THUNDER2",
+ "THUNDER3",
+ "TOILET",
+ ""
+};
+
+static const StringListProvider k2IngameSfxFilesFMTownsProvider = { ARRAYSIZE(k2IngameSfxFilesFMTowns), k2IngameSfxFilesFMTowns };
+
+static const byte k2IngameSfxIndexFMTowns[856] = {
+ 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00,
+ 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00,
+ 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00,
+ 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00,
+ 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00,
+ 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00,
+ 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00,
+ 0xFF, 0xFF, 0x00, 0x00, 0x0B, 0x00, 0x00, 0x00,
+ 0x37, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00,
+ 0x47, 0x00, 0x05, 0x00, 0x22, 0x00, 0x00, 0x00,
+ 0x1F, 0x00, 0x00, 0x00, 0x51, 0x00, 0x00, 0x00,
+ 0x25, 0x00, 0x00, 0x00, 0x26, 0x00, 0x00, 0x00,
+ 0x36, 0x00, 0x05, 0x00, 0x07, 0x00, 0x00, 0x00,
+ 0x3F, 0x00, 0x00, 0x00, 0x54, 0x00, 0x00, 0x00,
+ 0x45, 0x00, 0x00, 0x00, 0x4D, 0x00, 0x00, 0x00,
+ 0x7B, 0x00, 0x00, 0x00, 0x32, 0x00, 0x00, 0x00,
+ 0xFF, 0xFF, 0x00, 0x00, 0x3C, 0x00, 0x00, 0x00,
+ 0x3C, 0x00, 0x00, 0x00, 0x3B, 0x00, 0x00, 0x00,
+ 0x4E, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00,
+ 0x04, 0x00, 0x00, 0x00, 0x43, 0x00, 0x04, 0x00,
+ 0x56, 0x00, 0x00, 0x00, 0x40, 0x00, 0x05, 0x00,
+ 0x40, 0x00, 0x05, 0x00, 0xFF, 0xFF, 0x00, 0x00,
+ 0x64, 0x00, 0x00, 0x00, 0x4C, 0x00, 0x00, 0x00,
+ 0x12, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00,
+ 0x37, 0x00, 0x00, 0x00, 0x42, 0x00, 0x00, 0x00,
+ 0x1D, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00,
+ 0x49, 0x00, 0x00, 0x00, 0x52, 0x00, 0x00, 0x00,
+ 0x0A, 0x00, 0x00, 0x00, 0x4A, 0x00, 0x00, 0x00,
+ 0x09, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00,
+ 0x0D, 0x00, 0x00, 0x00, 0x0E, 0x00, 0x00, 0x00,
+ 0x53, 0x00, 0x00, 0x00, 0x35, 0x00, 0x00, 0x00,
+ 0x0C, 0x00, 0x00, 0x00, 0x4B, 0x00, 0x00, 0x00,
+ 0x21, 0x00, 0x00, 0x00, 0x53, 0x00, 0x00, 0x00,
+ 0x32, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00,
+ 0x1B, 0x00, 0x00, 0x00, 0x1C, 0x00, 0x00, 0x00,
+ 0x13, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00,
+ 0x15, 0x00, 0x00, 0x00, 0x16, 0x00, 0x00, 0x00,
+ 0x17, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00,
+ 0x19, 0x00, 0x00, 0x00, 0x0A, 0x00, 0x00, 0x00,
+ 0x1A, 0x00, 0x00, 0x00, 0x41, 0x00, 0x00, 0x00,
+ 0x77, 0x00, 0x00, 0x00, 0x3D, 0x00, 0x00, 0x00,
+ 0x55, 0x00, 0x00, 0x00, 0x29, 0x00, 0x00, 0x00,
+ 0x2A, 0x00, 0x00, 0x00, 0x2E, 0x00, 0x00, 0x00,
+ 0x2D, 0x00, 0x00, 0x00, 0x27, 0x00, 0x05, 0x00,
+ 0x25, 0x00, 0x00, 0x00, 0x46, 0x00, 0x05, 0x00,
+ 0x60, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00,
+ 0x34, 0x00, 0x00, 0x00, 0x12, 0x00, 0x00, 0x00,
+ 0x4F, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00,
+ 0x0F, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00,
+ 0x0A, 0x00, 0x00, 0x00, 0x78, 0x00, 0x06, 0x00,
+ 0x50, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
+ 0x33, 0x00, 0x06, 0x00, 0x3A, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00,
+ 0x1E, 0x00, 0x00, 0x00, 0x79, 0x00, 0x00, 0x00,
+ 0x23, 0x00, 0x05, 0x00, 0x24, 0x00, 0x05, 0x00,
+ 0x3E, 0x00, 0x00, 0x00, 0x2C, 0x00, 0x00, 0x00,
+ 0x48, 0x00, 0x05, 0x00, 0x20, 0x00, 0x00, 0x00,
+ 0x63, 0x00, 0x00, 0x00, 0x62, 0x00, 0x00, 0x00,
+ 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00,
+ 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00,
+ 0x7A, 0x00, 0x00, 0x00, 0x5E, 0x00, 0x00, 0x00,
+ 0x5B, 0x00, 0x00, 0x00, 0x5A, 0x00, 0x00, 0x00,
+ 0x10, 0x00, 0x00, 0x00, 0x59, 0x00, 0x00, 0x00,
+ 0x5D, 0x00, 0x00, 0x00, 0x5C, 0x00, 0x00, 0x00,
+ 0x57, 0x00, 0x00, 0x00, 0x2F, 0x00, 0x00, 0x00,
+ 0x30, 0x00, 0x00, 0x00, 0x31, 0x00, 0x00, 0x00,
+ 0x61, 0x00, 0x05, 0x00, 0x58, 0x00, 0x00, 0x00,
+ 0x5F, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00,
+ 0x65, 0x00, 0x00, 0x00, 0x66, 0x00, 0x00, 0x00,
+ 0x67, 0x00, 0x00, 0x00, 0x68, 0x00, 0x05, 0x00,
+ 0x69, 0x00, 0x05, 0x00, 0x6A, 0x00, 0x05, 0x00,
+ 0x01, 0x00, 0x05, 0x00, 0x6B, 0x00, 0x00, 0x00,
+ 0x6C, 0x00, 0x00, 0x00, 0x6D, 0x00, 0x00, 0x00,
+ 0x90, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00,
+ 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00,
+ 0x6F, 0x00, 0x00, 0x00, 0x70, 0x00, 0x00, 0x00,
+ 0x71, 0x00, 0x00, 0x00, 0x72, 0x00, 0x00, 0x00,
+ 0x73, 0x00, 0x00, 0x00, 0x74, 0x00, 0x00, 0x00,
+ 0x75, 0x00, 0x00, 0x00, 0x76, 0x00, 0x00, 0x00,
+ 0x09, 0x00, 0x06, 0x00, 0x7D, 0x00, 0x00, 0x00,
+ 0x7E, 0x00, 0x00, 0x00, 0x7C, 0x00, 0x00, 0x00,
+ 0x80, 0x00, 0x00, 0x00, 0x81, 0x00, 0x00, 0x00,
+ 0xFF, 0xFF, 0x00, 0x00, 0x85, 0x00, 0x00, 0x00,
+ 0x84, 0x00, 0x00, 0x00, 0x83, 0x00, 0x00, 0x00,
+ 0x82, 0x00, 0x05, 0x00, 0x86, 0x00, 0x00, 0x00,
+ 0x88, 0x00, 0x00, 0x00, 0x89, 0x00, 0x00, 0x00,
+ 0x8A, 0x00, 0x00, 0x00, 0x8B, 0x00, 0x00, 0x00,
+ 0x87, 0x00, 0x00, 0x00, 0x8C, 0x00, 0x00, 0x00,
+ 0x8D, 0x00, 0x00, 0x00, 0x8E, 0x00, 0x00, 0x00,
+ 0x8F, 0x00, 0x00, 0x00, 0x90, 0x00, 0x00, 0x00,
+ 0x91, 0x00, 0x00, 0x00, 0x92, 0x00, 0x00, 0x00,
+ 0x93, 0x00, 0x05, 0x00, 0x94, 0x00, 0x00, 0x00,
+ 0x5F, 0x00, 0x00, 0x00, 0x96, 0x00, 0x05, 0x00,
+ 0x97, 0x00, 0x00, 0x00, 0x98, 0x00, 0x04, 0x00,
+ 0x99, 0x00, 0x00, 0x00, 0x9A, 0x00, 0x00, 0x00,
+ 0x9B, 0x00, 0x00, 0x00, 0x9C, 0x00, 0x00, 0x00,
+ 0x9D, 0x00, 0x00, 0x00, 0x9E, 0x00, 0x00, 0x00,
+ 0x9F, 0x00, 0x00, 0x00, 0xA0, 0x00, 0x00, 0x00,
+ 0xA1, 0x00, 0x00, 0x00, 0xA2, 0x00, 0x00, 0x00,
+ 0xA3, 0x00, 0x00, 0x00, 0xA4, 0x00, 0x00, 0x00,
+ 0xA5, 0x00, 0x00, 0x00, 0xA6, 0x00, 0x00, 0x00,
+ 0xA7, 0x00, 0x00, 0x00, 0xA8, 0x00, 0x00, 0x00,
+ 0xA9, 0x00, 0x00, 0x00, 0xAA, 0x00, 0x00, 0x00,
+ 0xAB, 0x00, 0x00, 0x00, 0xAC, 0x00, 0x00, 0x00,
+ 0xAD, 0x00, 0x00, 0x00, 0xAE, 0x00, 0x05, 0x00,
+ 0xAF, 0x00, 0x00, 0x00, 0xB0, 0x00, 0x00, 0x00,
+ 0xB1, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00
+};
+
+static const ByteProvider k2IngameSfxIndexFMTownsProvider = { ARRAYSIZE(k2IngameSfxIndexFMTowns), k2IngameSfxIndexFMTowns };
+
+static const byte k2IngameCDAFMTowns[304] = {
+ 0x02, 0x00, 0x07, 0x00, 0x03, 0x00, 0x08, 0x00,
+ 0x04, 0x00, 0x09, 0x00, 0x07, 0x00, 0x0A, 0x00,
+ 0x0C, 0x00, 0x0B, 0x00, 0x0D, 0x00, 0x0C, 0x00,
+ 0x0E, 0x00, 0x0D, 0x00, 0x0F, 0x00, 0x0E, 0x00,
+ 0x10, 0x00, 0x0F, 0x00, 0x12, 0x00, 0x10, 0x00,
+ 0x13, 0x00, 0x11, 0x00, 0x15, 0x00, 0x12, 0x00,
+ 0x17, 0x00, 0x13, 0x00, 0x18, 0x00, 0x14, 0x00,
+ 0x19, 0x00, 0x15, 0x00, 0x1A, 0x00, 0x16, 0x00,
+ 0x1B, 0x00, 0x17, 0x00, 0x1C, 0x00, 0x18, 0x00,
+ 0x1D, 0x00, 0x19, 0x00, 0x1E, 0x00, 0x1A, 0x00,
+ 0x1F, 0x00, 0x1B, 0x00, 0x21, 0x00, 0x1C, 0x00,
+ 0x22, 0x00, 0x1D, 0x00, 0x23, 0x00, 0x1E, 0x00,
+ 0x24, 0x00, 0x1F, 0x00, 0x25, 0x00, 0x20, 0x00,
+ 0x26, 0x00, 0x21, 0x00, 0x27, 0x00, 0x22, 0x00,
+ 0x28, 0x00, 0x23, 0x00, 0x29, 0x00, 0x24, 0x00,
+ 0x2A, 0x00, 0x25, 0x00, 0x2B, 0x00, 0x26, 0x00,
+ 0x2C, 0x00, 0x27, 0x00, 0x2D, 0x00, 0x28, 0x00,
+ 0x2E, 0x00, 0x29, 0x00, 0x2F, 0x00, 0x2A, 0x00,
+ 0x30, 0x00, 0x2B, 0x00, 0x31, 0x00, 0x2C, 0x00,
+ 0x32, 0x00, 0x2D, 0x00, 0x33, 0x00, 0x2E, 0x00,
+ 0x34, 0x00, 0x2F, 0x00, 0x35, 0x00, 0x30, 0x00,
+ 0x36, 0x00, 0x31, 0x00, 0x37, 0x00, 0x32, 0x00,
+ 0x38, 0x00, 0x33, 0x00, 0x39, 0x00, 0x34, 0x00,
+ 0x3A, 0x00, 0x35, 0x00, 0x3B, 0x00, 0x36, 0x00,
+ 0x3C, 0x00, 0x37, 0x00, 0x3D, 0x00, 0x38, 0x00,
+ 0x3E, 0x00, 0x39, 0x00, 0x3F, 0x00, 0x3A, 0x00,
+ 0x40, 0x00, 0x3B, 0x00, 0x41, 0x00, 0x3C, 0x00,
+ 0x42, 0x00, 0x3D, 0x00, 0x43, 0x00, 0x3E, 0x00,
+ 0x44, 0x00, 0x3F, 0x00, 0x45, 0x00, 0x40, 0x00,
+ 0x46, 0x00, 0x41, 0x00, 0x47, 0x00, 0x42, 0x00,
+ 0x48, 0x00, 0x43, 0x00, 0x49, 0x00, 0x44, 0x00,
+ 0x4A, 0x00, 0x45, 0x00, 0x4B, 0x00, 0x46, 0x00,
+ 0x4C, 0x00, 0x47, 0x00, 0x4D, 0x00, 0x48, 0x00,
+ 0x4E, 0x00, 0x49, 0x00, 0x4F, 0x00, 0x4A, 0x00,
+ 0x50, 0x00, 0x4B, 0x00, 0x51, 0x00, 0x4C, 0x00,
+ 0x52, 0x00, 0x4D, 0x00, 0x53, 0x00, 0x4E, 0x00,
+ 0x54, 0x00, 0x4F, 0x00, 0x55, 0x00, 0x50, 0x00,
+ 0x56, 0x00, 0x51, 0x00, 0x57, 0x00, 0x52, 0x00
+};
+
+static const ByteProvider k2IngameCDAFMTownsProvider = { ARRAYSIZE(k2IngameCDAFMTowns), k2IngameCDAFMTowns };
+
+static const byte k2IngameTalkObjIndexFMTowns[122] = {
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x12, 0x00,
+ 0x18, 0x00, 0x26, 0x00, 0x41, 0x00, 0x00, 0x00,
+ 0x01, 0x00, 0x02, 0x00, 0x03, 0x00, 0x04, 0x00,
+ 0x05, 0x00, 0x06, 0x00, 0x07, 0x00, 0x08, 0x00,
+ 0x09, 0x00, 0x0A, 0x00, 0x11, 0x00, 0x12, 0x00,
+ 0x13, 0x00, 0x14, 0x00, 0x15, 0x00, 0x2A, 0x00,
+ 0x17, 0x00, 0x18, 0x00, 0x19, 0x00, 0x1A, 0x00,
+ 0x1B, 0x00, 0x1C, 0x00, 0x1D, 0x00, 0x1E, 0x00,
+ 0x1F, 0x00, 0x20, 0x00, 0x21, 0x00, 0x22, 0x00,
+ 0x23, 0x00, 0x24, 0x00, 0x30, 0x00, 0x35, 0x00,
+ 0x36, 0x00, 0x37, 0x00, 0x39, 0x00, 0x3A, 0x00,
+ 0x3B, 0x00, 0x3D, 0x00, 0x3E, 0x00, 0x3F, 0x00,
+ 0x40, 0x00, 0x41, 0x00, 0x42, 0x00, 0x43, 0x00,
+ 0x44, 0x00, 0x45, 0x00, 0x46, 0x00, 0x47, 0x00,
+ 0x00, 0x00
+};
+
+static const ByteProvider k2IngameTalkObjIndexFMTownsProvider = { ARRAYSIZE(k2IngameTalkObjIndexFMTowns), k2IngameTalkObjIndexFMTowns };
+
+static const char *const k2IngameTimJpStringsFMTowns[4] = {
+ "Yippee!",
+ "\x82\xE2\x82\xC1\x82\xBD\x81""[""\x81""I",
+ "Hop on!",
+ "\x82\xB3\x82\xA0\x81""A""\x8D""s""\x82\xB1\x82\xA4\x82\xE6\x81""I"
+};
+
+static const StringListProvider k2IngameTimJpStringsFMTownsProvider = { ARRAYSIZE(k2IngameTimJpStringsFMTowns), k2IngameTimJpStringsFMTowns };
+
+static const FrameControl k2IngameShapeAnimDataFMTowns0FrameControl[12] = {
+ { 0x0006, 0x00F0 },
+ { 0x002A, 0x000E },
+ { 0x002B, 0x000E },
+ { 0x002C, 0x000E },
+ { 0x0006, 0x000E },
+ { 0x002A, 0x000E },
+ { 0x002B, 0x000E },
+ { 0x002C, 0x000E },
+ { 0x0006, 0x000E },
+ { 0x002A, 0x000E },
+ { 0x002B, 0x000E },
+ { 0x002C, 0x000E }
+};
+
+static const FrameControl k2IngameShapeAnimDataFMTowns1FrameControl[6] = {
+ { 0x0002, 0x012C },
+ { 0x002D, 0x012C },
+ { 0x002E, 0x012C },
+ { 0x002F, 0x012C },
+ { 0x002E, 0x012C },
+ { 0x002D, 0x012C }
+};
+
+static const FrameControl k2IngameShapeAnimDataFMTowns2FrameControl[6] = {
+ { 0x000B, 0x0258 },
+ { 0x0030, 0x0005 },
+ { 0x0031, 0x0005 },
+ { 0x0032, 0x0005 },
+ { 0x0031, 0x0005 },
+ { 0x0030, 0x0005 }
+};
+
+static const FrameControl k2IngameShapeAnimDataFMTowns3FrameControl[4] = {
+ { 0x001C, 0x0014 },
+ { 0x004E, 0x0014 },
+ { 0x004F, 0x0014 },
+ { 0x0050, 0x0014 }
+};
+
+static const FrameControl k2IngameShapeAnimDataFMTowns4FrameControl[4] = {
+ { 0x0017, 0x0007 },
+ { 0x0051, 0x0007 },
+ { 0x0052, 0x0007 },
+ { 0x0053, 0x0007 }
+};
+
+static const FrameControl k2IngameShapeAnimDataFMTowns5FrameControl[4] = {
+ { 0x0016, 0x0014 },
+ { 0x0054, 0x0014 },
+ { 0x0055, 0x0014 },
+ { 0x0056, 0x0014 }
+};
+
+static const FrameControl k2IngameShapeAnimDataFMTowns6FrameControl[4] = {
+ { 0x003A, 0x003C },
+ { 0x0057, 0x003C },
+ { 0x0058, 0x003C },
+ { 0x0059, 0x003C }
+};
+
+static const FrameControl k2IngameShapeAnimDataFMTowns7FrameControl[4] = {
+ { 0x001A, 0x0032 },
+ { 0x005A, 0x0032 },
+ { 0x005B, 0x0032 },
+ { 0x005C, 0x0032 }
+};
+
+static const FrameControl k2IngameShapeAnimDataFMTowns8FrameControl[4] = {
+ { 0x006D, 0x000C },
+ { 0x006E, 0x000C },
+ { 0x006F, 0x000C },
+ { 0x0070, 0x000C }
+};
+
+static const FrameControl k2IngameShapeAnimDataFMTowns9FrameControl[4] = {
+ { 0x0079, 0x0008 },
+ { 0x007A, 0x0008 },
+ { 0x007B, 0x0008 },
+ { 0x007C, 0x0008 }
+};
+
+static const FrameControl k2IngameShapeAnimDataFMTowns10FrameControl[4] = {
+ { 0x007E, 0x0008 },
+ { 0x007F, 0x0008 },
+ { 0x0080, 0x0008 },
+ { 0x0081, 0x0008 }
+};
+
+static const FrameControl k2IngameShapeAnimDataFMTowns11FrameControl[6] = {
+ { 0x0091, 0x01A4 },
+ { 0x0092, 0x0004 },
+ { 0x0093, 0x0004 },
+ { 0x0094, 0x0004 },
+ { 0x0093, 0x0004 },
+ { 0x0092, 0x0004 }
+};
+
+static const FrameControl k2IngameShapeAnimDataFMTowns12FrameControl[4] = {
+ { 0x0095, 0x0006 },
+ { 0x0096, 0x0006 },
+ { 0x0097, 0x0006 },
+ { 0x0098, 0x0006 }
+};
+
+static const FrameControl k2IngameShapeAnimDataFMTowns13FrameControl[4] = {
+ { 0x0099, 0x002D },
+ { 0x009A, 0x002D },
+ { 0x009B, 0x002D },
+ { 0x009C, 0x002D }
+};
+
+static const ItemAnimDefinition k2IngameShapeAnimDataFMTowns[14] = {
+ { 6, 12, k2IngameShapeAnimDataFMTowns0FrameControl },
+ { 2, 6, k2IngameShapeAnimDataFMTowns1FrameControl },
+ { 11, 6, k2IngameShapeAnimDataFMTowns2FrameControl },
+ { 28, 4, k2IngameShapeAnimDataFMTowns3FrameControl },
+ { 23, 4, k2IngameShapeAnimDataFMTowns4FrameControl },
+ { 22, 4, k2IngameShapeAnimDataFMTowns5FrameControl },
+ { 58, 4, k2IngameShapeAnimDataFMTowns6FrameControl },
+ { 26, 4, k2IngameShapeAnimDataFMTowns7FrameControl },
+ { 109, 4, k2IngameShapeAnimDataFMTowns8FrameControl },
+ { 121, 4, k2IngameShapeAnimDataFMTowns9FrameControl },
+ { 126, 4, k2IngameShapeAnimDataFMTowns10FrameControl },
+ { 145, 6, k2IngameShapeAnimDataFMTowns11FrameControl },
+ { 149, 4, k2IngameShapeAnimDataFMTowns12FrameControl },
+ { 153, 4, k2IngameShapeAnimDataFMTowns13FrameControl }
+};
+
+static const ItemAnimDefinitionProvider k2IngameShapeAnimDataFMTownsProvider = { ARRAYSIZE(k2IngameShapeAnimDataFMTowns), k2IngameShapeAnimDataFMTowns };
+
diff --git a/devtools/create_kyradat/resources/hof_fmtowns_english.h b/devtools/create_kyradat/resources/hof_fmtowns_english.h
new file mode 100644
index 0000000000..e2904c70ad
--- /dev/null
+++ b/devtools/create_kyradat/resources/hof_fmtowns_english.h
@@ -0,0 +1,110 @@
+static const char *const k2SeqplayStringsFMTownsEnglish[105] = {
+ "Kyrandia is disappearing!",
+ "Rock by rock,",
+ "And tree by tree.",
+ "Kyrandia ceases to exist!",
+ "The Royal Mystics are baffled.",
+ "Every reference has been consulted.",
+ "Even Marko and his new valet, have been allowed into the conference.",
+ "Luckily, the Hand was experienced in these matters.",
+ "And finally a plan was approved,",
+ "That required a magic Anchor Stone,",
+ "To be retrieved from the center of the world.",
+ "Zanthia, youngest of the Kyrandian Mystics, has been selected to retrieve the Stone.",
+ "Thank you for playing The Hand of Fate.",
+ "This should be enough blueberries to open a portal to the center of the world.",
+ " DUMMY STRING... ",
+ " DUMMY STRING... ",
+ "Hey! All my equipment has been stolen!",
+ " DUMMY STRING... ",
+ "If they think I'm going to walk all the way down there, they're nuts!",
+ " DUMMY STRING... ",
+ " DUMMY STRING... ",
+ "Hurry up Faun!",
+ "Boy, that was a close call!",
+ "You said it pal. I, for one, am never going hunting again!",
+ "Ribbit.",
+ "How many times do I have to tell you? You're a toad.",
+ "Oh no! We're out of cheese!",
+ "Let's try this earwax. It's orange.",
+ "Mommy, when do I get the ivy?",
+ "Get out of here, shoo!",
+ "You cut, and I'll choose.",
+ "No. You cut and I'll choose.",
+ "I still say it was derivative drivel.",
+ "Aw, you still wouldn't recognize iambic pentameter if it bit you on the butt!",
+ "Executive Producer",
+ "Brett W. Sperry",
+ "Designed & Directed by",
+ "Rick Gush",
+ "Lead Programmer",
+ "Michael Legg",
+ "Art Management",
+ "Louis Castle",
+ "Joseph B. Hewitt IV",
+ "Lead Artist",
+ "Rick Parks",
+ "Additional Coding by",
+ "Philip W. Gorrow",
+ "Matt Collins",
+ "Mark McCubbin",
+ "Artists",
+ "Cameron Chun",
+ "Cary Averett",
+ "Cindy Chinn",
+ "Elie Arabian",
+ "Fei Cheng",
+ "Ferby Miguel",
+ "Frank Mendeola",
+ "Jack Martin",
+ "Jerry Moore",
+ "",
+ "Judith Peterson",
+ "Larry Miller",
+ "Lenny Lee",
+ "Louise Sandoval",
+ "Ren Olsen",
+ "Music & Sounds by",
+ "Paul Mudra",
+ "Frank Klepacki",
+ "Dwight Okahara",
+ "Pat Collins",
+ "Qualilty Assurance by",
+ "Glenn Sperry",
+ "Michael Lightner",
+ "William Foster",
+ "Jesse Clemit",
+ "Jeff Fillhaber",
+ "Manual, Package Design",
+ "& Fulfillment",
+ "Eydie Laramore",
+ "Lisa Marcinko",
+ "Lauren Rifkin",
+ "Congratulations!",
+ "Thank you for playing The Hand of Fate!",
+ "Guest Coding",
+ "Producer Liaison",
+ "Scott Duckett",
+ "Irvine Testers",
+ "Chris McFarland",
+ "Paul Moore",
+ "Chad Soares",
+ "Jared Brinkley",
+ "Jon Willliams",
+ "Chris Toft",
+ "Chris's Hair by",
+ "Cumulo Nimbus",
+ "Load a game",
+ "Introduction",
+ "Start a new game",
+ "Exit the game",
+ "Special Thanks to",
+ "Sake Joe Bostic-san",
+ "Tim Fritz",
+ "Kenny Dunne",
+ "Yukio Sekiguchi (Japan)",
+ "Takeshi Abo (Japan)"
+};
+
+static const StringListProvider k2SeqplayStringsFMTownsEnglishProvider = { ARRAYSIZE(k2SeqplayStringsFMTownsEnglish), k2SeqplayStringsFMTownsEnglish };
+
diff --git a/devtools/create_kyradat/resources/hof_fmtowns_japanese.h b/devtools/create_kyradat/resources/hof_fmtowns_japanese.h
new file mode 100644
index 0000000000..4029b01d03
--- /dev/null
+++ b/devtools/create_kyradat/resources/hof_fmtowns_japanese.h
@@ -0,0 +1,110 @@
+static const char *const k2SeqplayStringsFMTownsJapanese[105] = {
+ "\x83""L""\x83\x89\x83\x93\x83""f""\x83""B""\x83""A""\x82\xAA\x8F\xC1\x82\xA6\x82\xC4\x82\xA2\x82\xAD\x81""I",
+ "\x8A\xE2\x81""X""\x82\xE2\x81""A",
+ "\x96\xD8\x81""X""\x82\xDC\x82\xC5\x82\xE0\x81""B",
+ "\x83""L""\x83\x89\x83\x93\x83""f""\x83""B""\x83""A""\x82\xF0\x8B""~""\x82\xED\x82\xC8\x82\xAF\x82\xEA\x82\xCE\x82\xC8\x82\xE7\x82\xC8\x82\xA2\x81""I",
+ "\x96\x82\x8F""p""\x8E""t""\x82\xBD\x82\xBF\x82\xCD\x94""Y""\x82\xF1\x82\xBE\x81""B",
+ "\x82\xA0\x82\xE7\x82\xE4\x82\xE9\x91\xCE\x8D\xF4\x82\xAA\x8B\xA6\x8B""c""\x82\xB3\x82\xEA\x82\xBD\x82\xAA\x81""E""\x81""E""\x81""E",
+ "\x83""}""\x83\x8B\x83""R""\x82\xC6\x83""n""\x83\x93\x83""h""\x82\xAA\x81""A""\x82\xB1\x82\xCC\x96\xE2\x91\xE8\x82\xF0\x94""C""\x82\xB3\x82\xEA\x82\xBD\x81""B",
+ "\x83""n""\x83\x93\x83""h""\x82\xAA\x94\xAD\x88\xC4\x82\xB5\x82\xC4\x81""A",
+ "\x82\xC2\x82\xA2\x82\xC9\x81""A""\x89\xF0\x8C\x88\x8D\xF4\x82\xAA\x8C\x88\x92\xE8\x82\xB5\x82\xBD\x81""B",
+ "\x83""L""\x83\x89\x83\x93\x83""f""\x83""B""\x83""A""\x82\xF0\x8B""~""\x82\xA4\x82\xC9\x82\xCD\x81""A",
+ "\x90\xA2\x8A""E""\x82\xCC\x92\x86\x90""S""\x82\xC9\x82\xA0\x82\xE9\x81""h""\x96\x82\x96""@""\x82\xCC\x82\xA2\x82\xA9\x82\xE8\x90\xCE\x81""h""\x82\xAA\x95""K""\x97""v""\x82\xBE\x81""B",
+ "\x83""U""\x83\x93\x83""V""\x83""A""\x81""A""\x8C""N""\x82\xAA\x8D\xCC\x82\xE8\x82\xC9\x8D""s""\x82\xAD\x82\xCC\x82\xBE\x81""B",
+ "Thank you for playing The Hand of Fate.",
+ "\x90\xA2\x8A""E""\x82\xCC\x92\x86\x90""S""\x82\xD6\x8D""s""\x82\xAD\x82\xC9\x82\xCD\x81""A""\x83""u""\x83\x8B\x81""[""\x83""x""\x83\x8A\x81""[""\x82\xE0\x95""K""\x97""v""\x82\xBE\x82\xC6\x8E""v""\x82\xA4\x82\xED\x81""B",
+ " DUMMY STRING... ",
+ " DUMMY STRING... ",
+ "\x82\xA0\x82\x9F\x81""A""\x8E\x84\x82\xCC\x8E\x9D\x82\xBF\x95\xA8\x82\xAA\x82\xB7\x82\xD7\x82\xC4\x93\x90\x82\xDC\x82\xEA\x82\xC4\x82\xA2\x82\xE9\x81""I",
+ " DUMMY STRING... ",
+ "\x82\xBE\x82\xC1\x82\xC4\x81""A""\x90\xA2\x8A""E""\x82\xCC\x92\x86\x90""S""\x82\xDC\x82\xC5\x95\xE0\x82\xA2\x82\xC4\x8D""s""\x82\xAD\x82\xC8\x82\xF1\x82\xC4\x81""A""\x8B""C""\x82\xAA\x89\x93\x82\xAD\x82\xC8\x82\xE9\x82\xB6\x82\xE1\x82\xC8\x82\xA2\x81""I",
+ " DUMMY STRING... ",
+ " DUMMY STRING... ",
+ "\x8B""}""\x82\xAE\x82\xCC\x82\xE6\x81""A""\x83""t""\x83""H""\x81""[""\x83\x93\x81""I",
+ "\x82\xE2\x82\xC1\x82\xCF\x82\xE8\x81""A""\x97\x88\x82\xE9\x82\xF1\x82\xB6\x82\xE1\x82\xC8\x82\xA9\x82\xC1\x82\xBD\x81""I",
+ "\x82\xE0\x82\xA4\x81""A""\x93\xF1\x93""x""\x82\xC6\x97\xC2\x82\xC9\x8D""s""\x82\xA9\x82\xCB\x82\xA6\x81""I",
+ "\x83""Q""\x83\x8D\x83""Q""\x81""[""\x83\x8D\x81""B",
+ "\x8A""^""\x82\xCC\x8E""q""\x82\xCD\x8A""^""\x82\xBE\x81""B""\x81""@",
+ "\x82\xC8\x82\xF1\x82\xBE\x81""A""\x82\xE0\x82\xA4\x83""`""\x81""[""\x83""Y""\x82\xCD\x82\xC8\x82\xA2\x82\xBC\x81""I",
+ "\x82\xE6\x82\xB5\x81""A""\x83""I""\x83\x8C\x83\x93\x83""W""\x82\xCC\x94\xE7\x82\xC5\x82\xE2\x82\xEB\x82\xA4\x81""B",
+ "\x83""}""\x83""}""\x81""A""\x96""l""\x82\xCC\x96\xD1\x82\xE0\x82\xD3\x82\xB3\x82\xD3\x82\xB3\x81""H",
+ "\x82\xA8\x82\xA2\x82\xB1\x82\xE7\x81""A""\x82\xB1\x82\xB1\x82\xA9\x82\xE7\x8F""o""\x82\xC4\x8D""s""\x82\xAF\x81""I",
+ "\x82\xA8\x91""O""\x82\xAA\x94\xBC\x95\xAA\x82\xC9\x90\xD8\x82\xEA\x82\xE6\x81""A""\x89\xB4\x82\xAA\x91""I""\x82\xD4\x82\xA9\x82\xE7\x82\xB3\x81""B",
+ "\x82\xA2\x82\xE2\x81""A""\x82\xA8\x91""O""\x82\xAA\x94\xBC\x95\xAA\x82\xC9\x90\xD8\x82\xEA\x82\xCE\x81""A""\x89\xB4\x82\xAA\x91""I""\x82\xD4\x81""B",
+ "\x89\xB4\x82\xCD\x82\xDC\x82\xBE\x81""A""\x94""[""\x93\xBE\x82\xB5\x82\xBF\x82\xE1\x82\xA2\x82\xC8\x82\xA2\x82\xBA\x81""B",
+ "\x82\xA2\x82\xA2\x89\xC1\x8C\xB8\x82\xC9\x82\xB5\x82\xEB\x81""A""\x82\xDC\x82\xBD\x89\xA3\x82\xE9\x82\xBC\x81""I",
+ "Executive Producer",
+ "Brett W. Sperry",
+ "Designed & Directed by",
+ "Rick Gush",
+ "Lead Programmer",
+ "Michael Legg",
+ "Art Management",
+ "Louis Castle",
+ "Joseph B. Hewitt IV",
+ "Lead Artist",
+ "Rick Parks",
+ "Additional Coding by",
+ "Philip W. Gorrow",
+ "Matt Collins",
+ "Mark McCubbin",
+ "Artists",
+ "Cameron Chun",
+ "Cary Averett",
+ "Cindy Chinn",
+ "Elie Arabian",
+ "Fei Cheng",
+ "Ferby Miguel",
+ "Frank Mendeola",
+ "Jack Martin",
+ "Jerry Moore",
+ "",
+ "Judith Peterson",
+ "Larry Miller",
+ "Lenny Lee",
+ "Louise Sandoval",
+ "Ren Olsen",
+ "Music & Sounds by",
+ "Paul Mudra",
+ "Frank Klepacki",
+ "Dwight Okahara",
+ "Pat Collins",
+ "Qualilty Assurance by",
+ "Glenn Sperry",
+ "Michael Lightner",
+ "William Foster",
+ "Jesse Clemit",
+ "Jeff Fillhaber",
+ "Manual, Package Design",
+ "& Fulfillment",
+ "Eydie Laramore",
+ "Lisa Marcinko",
+ "Lauren Rifkin",
+ "Congratulations!",
+ "Thank you for playing The Hand of Fate!",
+ "Guest Coding",
+ "Producer Liaison",
+ "Scott Duckett",
+ "Irvine Testers",
+ "Chris McFarland",
+ "Paul Moore",
+ "Chad Soares",
+ "Jared Brinkley",
+ "Jon Willliams",
+ "Chris Toft",
+ "Chris's Hair by",
+ "Cumulo Nimbus",
+ "\x83""f""\x81""[""\x83""^""\x82\xF0\x83\x8D\x81""[""\x83""h""\x82\xB7\x82\xE9",
+ "\x83""C""\x83\x93\x83""g""\x83\x8D\x83""_""\x83""N""\x83""V""\x83\x87\x83\x93",
+ "\x90""V""\x82\xBD\x82\xC9\x83""Q""\x81""[""\x83\x80\x82\xF0\x8E""n""\x82\xDF\x82\xE9",
+ "\x83""Q""\x81""[""\x83\x80\x82\xF0\x8F""I""\x97\xB9\x82\xB7\x82\xE9",
+ "Special Thanks to",
+ "Sake Joe Bostic-san",
+ "Tim Fritz",
+ "Kenny Dunne",
+ "Yukio Sekiguchi (Japan)",
+ "Takeshi Abo (Japan)"
+};
+
+static const StringListProvider k2SeqplayStringsFMTownsJapaneseProvider = { ARRAYSIZE(k2SeqplayStringsFMTownsJapanese), k2SeqplayStringsFMTownsJapanese };
+
diff --git a/devtools/create_kyradat/resources/hof_pc98.h b/devtools/create_kyradat/resources/hof_pc98.h
new file mode 100644
index 0000000000..3ff072f5e9
--- /dev/null
+++ b/devtools/create_kyradat/resources/hof_pc98.h
@@ -0,0 +1,656 @@
+static const char *const k2SeqplayPakFilesPC98[3] = {
+ "INTROGEN.PAK",
+ "INTROVOC.PAK",
+ "VOC.PAK"
+};
+
+static const StringListProvider k2SeqplayPakFilesPC98Provider = { ARRAYSIZE(k2SeqplayPakFilesPC98), k2SeqplayPakFilesPC98 };
+
+static const char *const k2SeqplaySfxFilesPC98[33] = {
+ "intro1",
+ "intro2",
+ "intro3",
+ "intro4",
+ "intro5",
+ "intro6",
+ "intro7",
+ "intro8",
+ "intro9",
+ "intro10",
+ "intro11",
+ "intro12",
+ "glow",
+ "asong",
+ "crowcaw",
+ "eyerub2",
+ "pluck3",
+ "rodnreel",
+ "frog1",
+ "scavmov2",
+ "lambmom3",
+ "lambkid1",
+ "thunder2",
+ "thunder3",
+ "wind6",
+ "h2odrop2",
+ "gasleak",
+ "polgulp1",
+ "hndslap1",
+ "burp1",
+ "scream1",
+ "theend",
+ ""
+};
+
+static const StringListProvider k2SeqplaySfxFilesPC98Provider = { ARRAYSIZE(k2SeqplaySfxFilesPC98), k2SeqplaySfxFilesPC98 };
+
+static const HoFSequence k2SeqplaySeqDataPC98Seq[16] = {
+ { 0x0002, "", "virgin.cps", 4, 0, 0xFFFF, 0xFFFF, 0x0000, 0x0001, 0x0064, 0, 0, 0x001E },
+ { 0x0001, "westwood.wsa", "", 4, 0, 0xFFFF, 0xFFFF, 0x0000, 0x0012, 0x000C, 0, 0, 0x00A0 },
+ { 0x0001, "title.wsa", "", 4, 0, 0xFFFF, 0xFFFF, 0x0000, 0x001A, 0x000C, 0, 0, 0x000A },
+ { 0x0002, "", "over.cps", 4, 0, 0xFFFF, 0xFFFF, 0x0000, 0x0001, 0x0E10, 0, 0, 0x001E },
+ { 0x0002, "", "library.cps", 4, 0, 0xFFFF, 0xFFFF, 0x0000, 0x0001, 0x0E10, 0, 0, 0x001E },
+ { 0x0002, "", "hand.cps", 4, 0, 0xFFFF, 0xFFFF, 0x0000, 0x0001, 0x0E10, 0, 0, 0x005A },
+ { 0x0001, "point.wsa", "", 4, 8, 0xFFFF, 0xFFFF, 0x0000, 0x0026, 0x0007, 0, 0, 0x00C8 },
+ { 0x0001, "zanfaun.wsa", "", 4, 0, 0xFFFF, 0xFFFF, 0x0000, 0x0033, 0x0010, 0, 0, 0x00F0 },
+ { 0x0001, "funters.wsa", "", 4, 0, 0xFFFF, 0xFFFF, 0x0000, 0x001B, 0x000C, 0, 0, 0x001E },
+ { 0x0001, "ferb.wsa", "", 4, 0, 0xFFFF, 0xFFFF, 0x0000, 0x001B, 0x0010, 0, 0, 0x001E },
+ { 0x0001, "fish.wsa", "", 4, 0, 0xFFFF, 0xFFFF, 0x0000, 0x0038, 0x000C, 0, 0, 0x001E },
+ { 0x0001, "fheep.wsa", "", 4, 0, 0xFFFF, 0xFFFF, 0x0000, 0x000B, 0x000C, 0, 0, 0x001E },
+ { 0x0001, "farmer.wsa", "", 4, 0, 0xFFFF, 0xFFFF, 0x0000, 0x0016, 0x000C, 0, 0, 0x0064 },
+ { 0x0001, "fuards.wsa", "", 4, 0, 0xFFFF, 0xFFFF, 0x0000, 0x0018, 0x000E, 0, 0, 0x001E },
+ { 0x0001, "firates.wsa", "", 4, 0, 0xFFFF, 0xFFFF, 0x0000, 0x0025, 0x000C, 0, 0, 0x001E },
+ { 0x0001, "frash.wsa", "", 4, 0, 0xFFFF, 0xFFFF, 0x0000, 0x000C, 0x000A, 0, 0, 0x0154 }
+};
+
+static const FrameControl k2SeqplaySeqDataPC98SeqNestedControl7[18] = {
+ { 0, 10 },
+ { 1, 10 },
+ { 2, 10 },
+ { 3, 10 },
+ { 4, 10 },
+ { 5, 10 },
+ { 6, 10 },
+ { 7, 10 },
+ { 8, 10 },
+ { 9, 10 },
+ { 8, 10 },
+ { 7, 10 },
+ { 6, 10 },
+ { 5, 40 },
+ { 4, 10 },
+ { 3, 10 },
+ { 2, 10 },
+ { 1, 10 }
+};
+
+static const FrameControl k2SeqplaySeqDataPC98SeqNestedControl10[17] = {
+ { 0, 6 },
+ { 1, 6 },
+ { 2, 6 },
+ { 3, 6 },
+ { 4, 6 },
+ { 5, 6 },
+ { 6, 6 },
+ { 7, 6 },
+ { 8, 6 },
+ { 9, 6 },
+ { 10, 6 },
+ { 11, 6 },
+ { 11, 12 },
+ { 12, 12 },
+ { 13, 12 },
+ { 12, 12 },
+ { 11, 12 }
+};
+
+static const FrameControl k2SeqplaySeqDataPC98SeqNestedControl11[9] = {
+ { 0, 6 },
+ { 1, 6 },
+ { 2, 6 },
+ { 3, 6 },
+ { 4, 6 },
+ { 3, 6 },
+ { 4, 6 },
+ { 5, 64 },
+ { 5, 6 }
+};
+
+static const FrameControl k2SeqplaySeqDataPC98SeqNestedControl12[16] = {
+ { 0, 6 },
+ { 1, 6 },
+ { 0, 6 },
+ { 1, 6 },
+ { 0, 6 },
+ { 1, 6 },
+ { 0, 6 },
+ { 1, 6 },
+ { 0, 6 },
+ { 1, 6 },
+ { 0, 6 },
+ { 1, 6 },
+ { 0, 6 },
+ { 1, 6 },
+ { 0, 6 },
+ { 1, 6 }
+};
+
+static const FrameControl k2SeqplaySeqDataPC98SeqNestedControl13[5] = {
+ { 0, 6 },
+ { 1, 6 },
+ { 2, 6 },
+ { 1, 6 },
+ { 0, 1 }
+};
+
+static const FrameControl k2SeqplaySeqDataPC98SeqNestedControl14[8] = {
+ { 0, 6 },
+ { 1, 6 },
+ { 2, 6 },
+ { 3, 6 },
+ { 4, 6 },
+ { 3, 6 },
+ { 2, 6 },
+ { 1, 6 }
+};
+
+static const HoFNestedSequence k2SeqplaySeqDataPC98SeqNested[15] = {
+ { 0x000C, "figgle.wsa", 0, 3, 60, 0, 0, 0, NULL, 0, 0 },
+ { 0x0008, "over1.wsa", 0, 10, 10, 0, 0, 0, NULL, 0, 0 },
+ { 0x0008, "over2.wsa", 0, 11, 9, 0, 0, 0, NULL, 0, 0 },
+ { 0x0008, "forest.wsa", 0, 22, 6, 0, 0, 0, NULL, 1, 3 },
+ { 0x0008, "dragon.wsa", 0, 11, 6, 0, 0, 0, NULL, 2, 0 },
+ { 0x0002, "darm.wsa", 0, 19, 9, 0, 0, 0, NULL, 4, 0 },
+ { 0x0002, "library.wsa", 0, 33, 9, 0, 0, 0, NULL, 4, 0 },
+ { 0x002A, "library.wsa", 0, 18, 9, 0, 0, ARRAYSIZE(k2SeqplaySeqDataPC98SeqNestedControl7), k2SeqplaySeqDataPC98SeqNestedControl7, 0, 0 },
+ { 0x000A, "marco.wsa", 0, 37, 9, 0, 0, 0, NULL, 4, 0 },
+ { 0x0002, "hand1a.wsa", 0, 34, 9, 0, 0, 0, NULL, 0, 0 },
+ { 0x002A, "hand1b.wsa", 0, 16, 9, 0, 0, ARRAYSIZE(k2SeqplaySeqDataPC98SeqNestedControl10), k2SeqplaySeqDataPC98SeqNestedControl10, 0, 0 },
+ { 0x002A, "hand1c.wsa", 0, 9, 9, 0, 0, ARRAYSIZE(k2SeqplaySeqDataPC98SeqNestedControl11), k2SeqplaySeqDataPC98SeqNestedControl11, 0, 0 },
+ { 0x002C, "hand2.wsa", 0, 2, 9, 0, 0, ARRAYSIZE(k2SeqplaySeqDataPC98SeqNestedControl12), k2SeqplaySeqDataPC98SeqNestedControl12, 5, 0 },
+ { 0x002C, "hand3.wsa", 0, 4, 9, 0, 0, ARRAYSIZE(k2SeqplaySeqDataPC98SeqNestedControl13), k2SeqplaySeqDataPC98SeqNestedControl13, 5, 0 },
+ { 0x002C, "hand4.wsa", 0, 8, 9, 0, 0, ARRAYSIZE(k2SeqplaySeqDataPC98SeqNestedControl14), k2SeqplaySeqDataPC98SeqNestedControl14, 5, 0 }
+};
+
+static const HoFSequenceProvider k2SeqplaySeqDataPC98Provider = { ARRAYSIZE(k2SeqplaySeqDataPC98Seq), k2SeqplaySeqDataPC98Seq, ARRAYSIZE(k2SeqplaySeqDataPC98SeqNested), k2SeqplaySeqDataPC98SeqNested };
+
+static const char *const k2IngamePakFilesPC98[20] = {
+ "MISC_EMC.PAK",
+ "VOC.PAK",
+ "MISC_CPS.PAK",
+ "OTHER.PAK",
+ "COST1_SH.PAK",
+ "COST2_SH.PAK",
+ "COST3_SH.PAK",
+ "COST4_SH.PAK",
+ "COST5_SH.PAK",
+ "COST6_SH.PAK",
+ "COST7_SH.PAK",
+ "COST8_SH.PAK",
+ "COST9_SH.PAK",
+ "CAULDRON.PAK",
+ "AUDIO.PAK",
+ "HOFCH_1.PAK",
+ "HOFCH_2.PAK",
+ "HOFCH_3.PAK",
+ "HOFCH_4.PAK",
+ "HOFCH_5.PAK"
+};
+
+static const StringListProvider k2IngamePakFilesPC98Provider = { ARRAYSIZE(k2IngamePakFilesPC98), k2IngamePakFilesPC98 };
+
+static const char *const k2IngameSfxFilesPC98[178] = {
+ "ALCHEMY2",
+ "BIGSLAM",
+ "BITE1",
+ "BLINK1",
+ "BOING1",
+ "BUBBLE1",
+ "BUBBLE2",
+ "BURP1",
+ "BUTTON6",
+ "CAULDRN2",
+ "CHEST",
+ "CLOTHES1",
+ "CROCLAF4",
+ "CRY1",
+ "CRY2",
+ "DOORMTCL",
+ "DOORMTOP",
+ "DOORWDCL",
+ "DOORWDOP",
+ "DRUM1",
+ "DRUM2",
+ "DRUM3",
+ "DRUM4",
+ "DRUM5",
+ "DRUM6",
+ "DRUM7",
+ "EYERUB2",
+ "FALL1",
+ "FALL3",
+ "FNGRSNAP",
+ "FORMSPL1",
+ "FROG1",
+ "FROGMIX2",
+ "GASLEAK",
+ "GLOWY1",
+ "GOOD3",
+ "GOOD5",
+ "GROWTWIG",
+ "H2ODROP2",
+ "H2OPLANT",
+ "HACHUCKD",
+ "HAYFALL2",
+ "HAYSRCH4",
+ "ICECUBE",
+ "KEYOPEN",
+ "LAMBKID1",
+ "LAMBMOM3",
+ "LAUGH1",
+ "LAUGH3",
+ "LAUGH4",
+ "LIZLISP",
+ "MAKESPL1",
+ "MSTDOOM1",
+ "ORCMOVE",
+ "PLUCK3",
+ "POLGULP1",
+ "PORTCUL",
+ "POURH20",
+ "RIP2",
+ "RODNREEL",
+ "ROWBOAT1",
+ "RUCKUS1",
+ "SCAVMOV2",
+ "SCRATCH1",
+ "SNAKSPEL",
+ "SNEEZE1",
+ "SNIFF1",
+ "SNOREIN3",
+ "SNOROUT",
+ "SPLASH1",
+ "SQUEAK1",
+ "SQUEAK2",
+ "SQUEAK3",
+ "SQUISH1",
+ "SQUISH2",
+ "STEAM",
+ "STEAM3",
+ "STRETCH1",
+ "SWING",
+ "TREZA1",
+ "TURNPAG2",
+ "TWIGSNAP",
+ "UGH1",
+ "WHEEL4",
+ "WINGS1",
+ "YAWN1",
+ "ZOOM5",
+ "FILBOTL",
+ "H2OPOUR1",
+ "JAILDOR1",
+ "JAILLOK1",
+ "CASHREG1",
+ "SWISH1",
+ "TURNBOAT",
+ "CLAPPING",
+ "CRUNCH1",
+ "WHEEL6",
+ "LITEMAG",
+ "SHELDOWN",
+ "SHELSLID",
+ "ZOW2",
+ "ZANLOOP1",
+ "SCREECH2",
+ "PANTING",
+ "TREX1",
+ "TREX5",
+ "TREX3",
+ "QUAKE",
+ "WRINGH2O",
+ "SPLAT2",
+ "OCEAN1",
+ "SPLAT3",
+ "CROCLAF5",
+ "FALL5",
+ "ZCMON2",
+ "ZWAIT3",
+ "ZNO2",
+ "CROCLAF7",
+ "CRICKET1",
+ "FIREBRTH",
+ "COW2",
+ "SAP2",
+ "PMTLHI",
+ "FROGSIGH",
+ "CRICEND",
+ "CRY3",
+ "CRY4",
+ "SHROOM1",
+ "DRIP1",
+ "SWIM4",
+ "CUCKOO2",
+ "PUNCH1",
+ "SNORT3",
+ "STAMPER2",
+ "WALLFALL",
+ "WOODFAL1",
+ "SPRAY1",
+ "OHNO1",
+ "YAHOO1",
+ "YIPEE1",
+ "WIND1",
+ "WIND3",
+ "WIND6",
+ "BLOWUP2",
+ "BOATLOP2",
+ "ZGIGGL1",
+ "ZCOUGH1",
+ "CRUSH",
+ "ALARM3",
+ "APPLEAT",
+ "BABYCRY1",
+ "BABYLAF1",
+ "BABYLIK1",
+ "GEARMX3",
+ "GLASBRK2",
+ "HANDKIL1",
+ "HNDSLAP1",
+ "ICEPICK1",
+ "KISS3",
+ "LOLIFAL1",
+ "PAGEBURN",
+ "PRTYHORN",
+ "SCREAM1",
+ "SPARKHIT",
+ "SPRING2",
+ "ZANLAND1",
+ "BIGBOW",
+ "BOWFORM",
+ "BULBHIT",
+ "EYELITE",
+ "ROOFBOW",
+ "FBIGFOT1",
+ "BIGFOOT4",
+ "DORSTNCL",
+ "CROWCAW",
+ "THUNDER2",
+ "THUNDER3",
+ "TOILET"
+};
+
+static const StringListProvider k2IngameSfxFilesPC98Provider = { ARRAYSIZE(k2IngameSfxFilesPC98), k2IngameSfxFilesPC98 };
+
+static const byte k2IngameSfxIndexPC98[856] = {
+ 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00,
+ 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00,
+ 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00,
+ 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00,
+ 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00,
+ 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00,
+ 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00,
+ 0xFF, 0xFF, 0x00, 0x00, 0x0B, 0x00, 0x00, 0x00,
+ 0x37, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00,
+ 0x47, 0x00, 0x05, 0x00, 0x22, 0x00, 0x00, 0x00,
+ 0x1F, 0x00, 0x00, 0x00, 0x51, 0x00, 0x00, 0x00,
+ 0x25, 0x00, 0x00, 0x00, 0x26, 0x00, 0x00, 0x00,
+ 0x36, 0x00, 0x05, 0x00, 0x07, 0x00, 0x00, 0x00,
+ 0x3F, 0x00, 0x00, 0x00, 0x54, 0x00, 0x00, 0x00,
+ 0x45, 0x00, 0x00, 0x00, 0x4D, 0x00, 0x00, 0x00,
+ 0x7B, 0x00, 0x00, 0x00, 0x32, 0x00, 0x00, 0x00,
+ 0xFF, 0xFF, 0x00, 0x00, 0x3C, 0x00, 0x00, 0x00,
+ 0x3C, 0x00, 0x00, 0x00, 0x3B, 0x00, 0x00, 0x00,
+ 0x4E, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00,
+ 0x04, 0x00, 0x00, 0x00, 0x43, 0x00, 0x04, 0x00,
+ 0x56, 0x00, 0x00, 0x00, 0x40, 0x00, 0x05, 0x00,
+ 0x40, 0x00, 0x05, 0x00, 0xFF, 0xFF, 0x00, 0x00,
+ 0x64, 0x00, 0x00, 0x00, 0x4C, 0x00, 0x00, 0x00,
+ 0x12, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00,
+ 0x37, 0x00, 0x00, 0x00, 0x42, 0x00, 0x00, 0x00,
+ 0x1D, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00,
+ 0x49, 0x00, 0x00, 0x00, 0x52, 0x00, 0x00, 0x00,
+ 0x0A, 0x00, 0x00, 0x00, 0x4A, 0x00, 0x00, 0x00,
+ 0x09, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00,
+ 0x0D, 0x00, 0x00, 0x00, 0x0E, 0x00, 0x00, 0x00,
+ 0x53, 0x00, 0x00, 0x00, 0x35, 0x00, 0x00, 0x00,
+ 0x0C, 0x00, 0x00, 0x00, 0x4B, 0x00, 0x00, 0x00,
+ 0x21, 0x00, 0x00, 0x00, 0x53, 0x00, 0x00, 0x00,
+ 0x32, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00,
+ 0x1B, 0x00, 0x00, 0x00, 0x1C, 0x00, 0x00, 0x00,
+ 0x13, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00,
+ 0x15, 0x00, 0x00, 0x00, 0x16, 0x00, 0x00, 0x00,
+ 0x17, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00,
+ 0x19, 0x00, 0x00, 0x00, 0x0A, 0x00, 0x00, 0x00,
+ 0x1A, 0x00, 0x00, 0x00, 0x41, 0x00, 0x00, 0x00,
+ 0x77, 0x00, 0x00, 0x00, 0x3D, 0x00, 0x00, 0x00,
+ 0x55, 0x00, 0x00, 0x00, 0x29, 0x00, 0x00, 0x00,
+ 0x2A, 0x00, 0x00, 0x00, 0x2E, 0x00, 0x00, 0x00,
+ 0x2D, 0x00, 0x00, 0x00, 0x27, 0x00, 0x05, 0x00,
+ 0x25, 0x00, 0x00, 0x00, 0x46, 0x00, 0x05, 0x00,
+ 0x60, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00,
+ 0x34, 0x00, 0x00, 0x00, 0x12, 0x00, 0x00, 0x00,
+ 0x4F, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00,
+ 0x0F, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00,
+ 0x0A, 0x00, 0x00, 0x00, 0x78, 0x00, 0x06, 0x00,
+ 0x50, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
+ 0x33, 0x00, 0x06, 0x00, 0x3A, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00,
+ 0x1E, 0x00, 0x00, 0x00, 0x79, 0x00, 0x00, 0x00,
+ 0x23, 0x00, 0x05, 0x00, 0x24, 0x00, 0x05, 0x00,
+ 0x3E, 0x00, 0x00, 0x00, 0x2C, 0x00, 0x00, 0x00,
+ 0x48, 0x00, 0x05, 0x00, 0x20, 0x00, 0x00, 0x00,
+ 0x63, 0x00, 0x00, 0x00, 0x62, 0x00, 0x00, 0x00,
+ 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00,
+ 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00,
+ 0x7A, 0x00, 0x00, 0x00, 0x5E, 0x00, 0x00, 0x00,
+ 0x5B, 0x00, 0x00, 0x00, 0x5A, 0x00, 0x00, 0x00,
+ 0x10, 0x00, 0x00, 0x00, 0x59, 0x00, 0x00, 0x00,
+ 0x5D, 0x00, 0x00, 0x00, 0x5C, 0x00, 0x00, 0x00,
+ 0x57, 0x00, 0x00, 0x00, 0x2F, 0x00, 0x00, 0x00,
+ 0x30, 0x00, 0x00, 0x00, 0x31, 0x00, 0x00, 0x00,
+ 0x61, 0x00, 0x05, 0x00, 0x58, 0x00, 0x00, 0x00,
+ 0x5F, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00,
+ 0x65, 0x00, 0x00, 0x00, 0x66, 0x00, 0x00, 0x00,
+ 0x67, 0x00, 0x00, 0x00, 0x68, 0x00, 0x05, 0x00,
+ 0x69, 0x00, 0x05, 0x00, 0x6A, 0x00, 0x05, 0x00,
+ 0x01, 0x00, 0x05, 0x00, 0x6B, 0x00, 0x00, 0x00,
+ 0x6C, 0x00, 0x00, 0x00, 0x6D, 0x00, 0x00, 0x00,
+ 0x90, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00,
+ 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00,
+ 0x6F, 0x00, 0x00, 0x00, 0x70, 0x00, 0x00, 0x00,
+ 0x71, 0x00, 0x00, 0x00, 0x72, 0x00, 0x00, 0x00,
+ 0x73, 0x00, 0x00, 0x00, 0x74, 0x00, 0x00, 0x00,
+ 0x75, 0x00, 0x00, 0x00, 0x76, 0x00, 0x00, 0x00,
+ 0x09, 0x00, 0x06, 0x00, 0x7D, 0x00, 0x00, 0x00,
+ 0x7E, 0x00, 0x00, 0x00, 0x7C, 0x00, 0x00, 0x00,
+ 0x80, 0x00, 0x00, 0x00, 0x81, 0x00, 0x00, 0x00,
+ 0xFF, 0xFF, 0x00, 0x00, 0x85, 0x00, 0x00, 0x00,
+ 0x84, 0x00, 0x00, 0x00, 0x83, 0x00, 0x00, 0x00,
+ 0x82, 0x00, 0x05, 0x00, 0x86, 0x00, 0x00, 0x00,
+ 0x88, 0x00, 0x00, 0x00, 0x89, 0x00, 0x00, 0x00,
+ 0x8A, 0x00, 0x00, 0x00, 0x8B, 0x00, 0x00, 0x00,
+ 0x87, 0x00, 0x00, 0x00, 0x8C, 0x00, 0x00, 0x00,
+ 0x8D, 0x00, 0x00, 0x00, 0x8E, 0x00, 0x00, 0x00,
+ 0x8F, 0x00, 0x00, 0x00, 0x90, 0x00, 0x00, 0x00,
+ 0x91, 0x00, 0x00, 0x00, 0x92, 0x00, 0x00, 0x00,
+ 0x93, 0x00, 0x05, 0x00, 0x94, 0x00, 0x00, 0x00,
+ 0x5F, 0x00, 0x00, 0x00, 0x96, 0x00, 0x05, 0x00,
+ 0x97, 0x00, 0x00, 0x00, 0x98, 0x00, 0x04, 0x00,
+ 0x99, 0x00, 0x00, 0x00, 0x9A, 0x00, 0x00, 0x00,
+ 0x9B, 0x00, 0x00, 0x00, 0x9C, 0x00, 0x00, 0x00,
+ 0x9D, 0x00, 0x00, 0x00, 0x9E, 0x00, 0x00, 0x00,
+ 0x9F, 0x00, 0x00, 0x00, 0xA0, 0x00, 0x00, 0x00,
+ 0xA1, 0x00, 0x00, 0x00, 0xA2, 0x00, 0x00, 0x00,
+ 0xA3, 0x00, 0x00, 0x00, 0xA4, 0x00, 0x00, 0x00,
+ 0xA5, 0x00, 0x00, 0x00, 0xA6, 0x00, 0x00, 0x00,
+ 0xA7, 0x00, 0x00, 0x00, 0xA8, 0x00, 0x00, 0x00,
+ 0xA9, 0x00, 0x00, 0x00, 0xAA, 0x00, 0x00, 0x00,
+ 0xAB, 0x00, 0x00, 0x00, 0xAC, 0x00, 0x00, 0x00,
+ 0xAD, 0x00, 0x00, 0x00, 0xAE, 0x00, 0x05, 0x00,
+ 0xAF, 0x00, 0x00, 0x00, 0xB0, 0x00, 0x00, 0x00,
+ 0xB1, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00
+};
+
+static const ByteProvider k2IngameSfxIndexPC98Provider = { ARRAYSIZE(k2IngameSfxIndexPC98), k2IngameSfxIndexPC98 };
+
+static const byte k2IngameTalkObjIndexPC98[120] = {
+ 0x6B, 0x6D, 0x25, 0x30, 0x32, 0x64, 0x2E, 0x32,
+ 0x36, 0x00, 0x00, 0x00, 0x00, 0x00, 0x12, 0x00,
+ 0x18, 0x00, 0x26, 0x00, 0x41, 0x00, 0x00, 0x00,
+ 0x01, 0x00, 0x02, 0x00, 0x03, 0x00, 0x04, 0x00,
+ 0x05, 0x00, 0x06, 0x00, 0x07, 0x00, 0x08, 0x00,
+ 0x09, 0x00, 0x0A, 0x00, 0x11, 0x00, 0x12, 0x00,
+ 0x13, 0x00, 0x14, 0x00, 0x15, 0x00, 0x2A, 0x00,
+ 0x17, 0x00, 0x18, 0x00, 0x19, 0x00, 0x1A, 0x00,
+ 0x1B, 0x00, 0x1C, 0x00, 0x1D, 0x00, 0x1E, 0x00,
+ 0x1F, 0x00, 0x20, 0x00, 0x21, 0x00, 0x22, 0x00,
+ 0x23, 0x00, 0x24, 0x00, 0x30, 0x00, 0x35, 0x00,
+ 0x36, 0x00, 0x37, 0x00, 0x39, 0x00, 0x3A, 0x00,
+ 0x3B, 0x00, 0x3D, 0x00, 0x3E, 0x00, 0x3F, 0x00,
+ 0x40, 0x00, 0x41, 0x00, 0x42, 0x00, 0x43, 0x00,
+ 0x44, 0x00, 0x45, 0x00, 0x46, 0x00, 0x47, 0x00
+};
+
+static const ByteProvider k2IngameTalkObjIndexPC98Provider = { ARRAYSIZE(k2IngameTalkObjIndexPC98), k2IngameTalkObjIndexPC98 };
+
+static const char *const k2IngameTimJpStringsPC98[4] = {
+ "Yippee!",
+ "\x82\xE2\x82\xC1\x82\xBD\x81""[""\x81""I",
+ "Hop on!",
+ "\x82\xB3\x82\xA0\x81""A""\x8D""s""\x82\xB1\x82\xA4\x82\xE6\x81""I"
+};
+
+static const StringListProvider k2IngameTimJpStringsPC98Provider = { ARRAYSIZE(k2IngameTimJpStringsPC98), k2IngameTimJpStringsPC98 };
+
+static const FrameControl k2IngameShapeAnimDataPC980FrameControl[12] = {
+ { 0x0006, 0x00F0 },
+ { 0x002A, 0x000E },
+ { 0x002B, 0x000E },
+ { 0x002C, 0x000E },
+ { 0x0006, 0x000E },
+ { 0x002A, 0x000E },
+ { 0x002B, 0x000E },
+ { 0x002C, 0x000E },
+ { 0x0006, 0x000E },
+ { 0x002A, 0x000E },
+ { 0x002B, 0x000E },
+ { 0x002C, 0x000E }
+};
+
+static const FrameControl k2IngameShapeAnimDataPC981FrameControl[6] = {
+ { 0x0002, 0x012C },
+ { 0x002D, 0x012C },
+ { 0x002E, 0x012C },
+ { 0x002F, 0x012C },
+ { 0x002E, 0x012C },
+ { 0x002D, 0x012C }
+};
+
+static const FrameControl k2IngameShapeAnimDataPC982FrameControl[6] = {
+ { 0x000B, 0x0258 },
+ { 0x0030, 0x0005 },
+ { 0x0031, 0x0005 },
+ { 0x0032, 0x0005 },
+ { 0x0031, 0x0005 },
+ { 0x0030, 0x0005 }
+};
+
+static const FrameControl k2IngameShapeAnimDataPC983FrameControl[4] = {
+ { 0x001C, 0x0014 },
+ { 0x004E, 0x0014 },
+ { 0x004F, 0x0014 },
+ { 0x0050, 0x0014 }
+};
+
+static const FrameControl k2IngameShapeAnimDataPC984FrameControl[4] = {
+ { 0x0017, 0x0007 },
+ { 0x0051, 0x0007 },
+ { 0x0052, 0x0007 },
+ { 0x0053, 0x0007 }
+};
+
+static const FrameControl k2IngameShapeAnimDataPC985FrameControl[4] = {
+ { 0x0016, 0x0014 },
+ { 0x0054, 0x0014 },
+ { 0x0055, 0x0014 },
+ { 0x0056, 0x0014 }
+};
+
+static const FrameControl k2IngameShapeAnimDataPC986FrameControl[4] = {
+ { 0x003A, 0x003C },
+ { 0x0057, 0x003C },
+ { 0x0058, 0x003C },
+ { 0x0059, 0x003C }
+};
+
+static const FrameControl k2IngameShapeAnimDataPC987FrameControl[4] = {
+ { 0x001A, 0x0032 },
+ { 0x005A, 0x0032 },
+ { 0x005B, 0x0032 },
+ { 0x005C, 0x0032 }
+};
+
+static const FrameControl k2IngameShapeAnimDataPC988FrameControl[4] = {
+ { 0x006D, 0x000C },
+ { 0x006E, 0x000C },
+ { 0x006F, 0x000C },
+ { 0x0070, 0x000C }
+};
+
+static const FrameControl k2IngameShapeAnimDataPC989FrameControl[4] = {
+ { 0x0079, 0x0008 },
+ { 0x007A, 0x0008 },
+ { 0x007B, 0x0008 },
+ { 0x007C, 0x0008 }
+};
+
+static const FrameControl k2IngameShapeAnimDataPC9810FrameControl[4] = {
+ { 0x007E, 0x0008 },
+ { 0x007F, 0x0008 },
+ { 0x0080, 0x0008 },
+ { 0x0081, 0x0008 }
+};
+
+static const FrameControl k2IngameShapeAnimDataPC9811FrameControl[6] = {
+ { 0x0091, 0x01A4 },
+ { 0x0092, 0x0004 },
+ { 0x0093, 0x0004 },
+ { 0x0094, 0x0004 },
+ { 0x0093, 0x0004 },
+ { 0x0092, 0x0004 }
+};
+
+static const FrameControl k2IngameShapeAnimDataPC9812FrameControl[4] = {
+ { 0x0095, 0x0006 },
+ { 0x0096, 0x0006 },
+ { 0x0097, 0x0006 },
+ { 0x0098, 0x0006 }
+};
+
+static const FrameControl k2IngameShapeAnimDataPC9813FrameControl[4] = {
+ { 0x0099, 0x002D },
+ { 0x009A, 0x002D },
+ { 0x009B, 0x002D },
+ { 0x009C, 0x002D }
+};
+
+static const ItemAnimDefinition k2IngameShapeAnimDataPC98[14] = {
+ { 6, 12, k2IngameShapeAnimDataPC980FrameControl },
+ { 2, 6, k2IngameShapeAnimDataPC981FrameControl },
+ { 11, 6, k2IngameShapeAnimDataPC982FrameControl },
+ { 28, 4, k2IngameShapeAnimDataPC983FrameControl },
+ { 23, 4, k2IngameShapeAnimDataPC984FrameControl },
+ { 22, 4, k2IngameShapeAnimDataPC985FrameControl },
+ { 58, 4, k2IngameShapeAnimDataPC986FrameControl },
+ { 26, 4, k2IngameShapeAnimDataPC987FrameControl },
+ { 109, 4, k2IngameShapeAnimDataPC988FrameControl },
+ { 121, 4, k2IngameShapeAnimDataPC989FrameControl },
+ { 126, 4, k2IngameShapeAnimDataPC9810FrameControl },
+ { 145, 6, k2IngameShapeAnimDataPC9811FrameControl },
+ { 149, 4, k2IngameShapeAnimDataPC9812FrameControl },
+ { 153, 4, k2IngameShapeAnimDataPC9813FrameControl }
+};
+
+static const ItemAnimDefinitionProvider k2IngameShapeAnimDataPC98Provider = { ARRAYSIZE(k2IngameShapeAnimDataPC98), k2IngameShapeAnimDataPC98 };
+
diff --git a/devtools/create_kyradat/resources/hof_pc98_english.h b/devtools/create_kyradat/resources/hof_pc98_english.h
new file mode 100644
index 0000000000..8d121ec2d5
--- /dev/null
+++ b/devtools/create_kyradat/resources/hof_pc98_english.h
@@ -0,0 +1,110 @@
+static const char *const k2SeqplayStringsPC98English[105] = {
+ "Kyrandia is disappearing!",
+ "Rock by rock,",
+ "And tree by tree.",
+ "Kyrandia ceases to exist!",
+ "The Royal Mystics are baffled.",
+ "Every reference has been consulted.",
+ "Even Marko and his new valet, have been allowed into the conference.",
+ "Luckily, the Hand was experienced in these matters.",
+ "And finally a plan was approved,",
+ "That required a magic Anchor Stone,",
+ "To be retrieved from the center of the world.",
+ "Zanthia, youngest of the Kyrandian Mystics, has been selected to retrieve the Stone.",
+ "Thank you for playing The Hand of Fate.",
+ "This should be enough blueberries to open a portal to the center of the world.",
+ " DUMMY STRING... ",
+ " DUMMY STRING... ",
+ "Hey! All my equipment has been stolen!",
+ " DUMMY STRING... ",
+ "If they think I'm going to walk all the way down there, they're nuts!",
+ " DUMMY STRING... ",
+ " DUMMY STRING... ",
+ "Hurry up Faun!",
+ "Boy, that was a close call!",
+ "You said it pal. I, for one, am never going hunting again!",
+ "Ribbit.",
+ "How many times do I have to tell you? You're a toad.",
+ "Oh no! We're out of cheese!",
+ "Let's try this earwax. It's orange.",
+ "Mommy, when do I get the ivy?",
+ "Get out of here, shoo!",
+ "You cut, and I'll choose.",
+ "No. You cut and I'll choose.",
+ "I still say it was derivative drivel.",
+ "Aw, you still wouldn't recognize iambic pentameter if it bit you on the butt!",
+ "Executive Producer",
+ "Brett W. Sperry",
+ "Designed & Directed by",
+ "Rick Gush",
+ "Lead Programmer",
+ "Michael Legg",
+ "Art Management",
+ "Louis Castle",
+ "Joseph B. Hewitt IV",
+ "Lead Artist",
+ "Rick Parks",
+ "Additional Coding by",
+ "Philip W. Gorrow",
+ "Matt Collins",
+ "Mark McCubbin",
+ "Artists",
+ "Cameron Chun",
+ "Cary Averett",
+ "Cindy Chinn",
+ "Elie Arabian",
+ "Fei Cheng",
+ "Ferby Miguel",
+ "Frank Mendeola",
+ "Jack Martin",
+ "Jerry Moore",
+ "",
+ "Judith Peterson",
+ "Larry Miller",
+ "Lenny Lee",
+ "Louise Sandoval",
+ "Ren Olsen",
+ "Music & Sounds by",
+ "Paul Mudra",
+ "Frank Klepacki",
+ "Dwight Okahara",
+ "Pat Collins",
+ "Qualilty Assurance by",
+ "Glenn Sperry",
+ "Michael Lightner",
+ "William Foster",
+ "Jesse Clemit",
+ "Jeff Fillhaber",
+ "Manual, Package Design",
+ "& Fulfillment",
+ "Eydie Laramore",
+ "Lisa Marcinko",
+ "Lauren Rifkin",
+ "Congratulations!",
+ "Thank you for playing The Hand of Fate!",
+ "Guest Coding",
+ "Producer Liaison",
+ "Scott Duckett",
+ "Irvine Testers",
+ "Chris McFarland",
+ "Paul Moore",
+ "Chad Soares",
+ "Jared Brinkley",
+ "Jon Willliams",
+ "Chris Toft",
+ "Chris's Hair by",
+ "Cumulo Nimbus",
+ "Load a game",
+ "Introduction",
+ "Start a new game",
+ "Exit the game",
+ "Special Thanks to",
+ "Sake Joe Bostic-san",
+ "Tim Fritz",
+ "Kenny Dunne",
+ "Yukio Sekiguchi (Japan)",
+ "Takeshi Abo (Japan)"
+};
+
+static const StringListProvider k2SeqplayStringsPC98EnglishProvider = { ARRAYSIZE(k2SeqplayStringsPC98English), k2SeqplayStringsPC98English };
+
diff --git a/devtools/create_kyradat/resources/hof_pc98_japanese.h b/devtools/create_kyradat/resources/hof_pc98_japanese.h
new file mode 100644
index 0000000000..3ea4e5df96
--- /dev/null
+++ b/devtools/create_kyradat/resources/hof_pc98_japanese.h
@@ -0,0 +1,110 @@
+static const char *const k2SeqplayStringsPC98Japanese[105] = {
+ "\x83""L""\x83\x89\x83\x93\x83""f""\x83""B""\x83""A""\x82\xAA\x8F\xC1\x82\xA6\x82\xC4\x82\xA2\x82\xAD\x81""I",
+ "\x8A\xE2\x81""X""\x82\xE2\x81""A",
+ "\x96\xD8\x81""X""\x82\xDC\x82\xC5\x82\xE0\x81""B",
+ "\x83""L""\x83\x89\x83\x93\x83""f""\x83""B""\x83""A""\x82\xF0\x8B""~""\x82\xED\x82\xC8\x82\xAF\x82\xEA\x82\xCE\x82\xC8\x82\xE7\x82\xC8\x82\xA2\x81""I",
+ "\x96\x82\x8F""p""\x8E""t""\x82\xBD\x82\xBF\x82\xCD\x94""Y""\x82\xF1\x82\xBE\x81""B",
+ "\x82\xA0\x82\xE7\x82\xE4\x82\xE9\x91\xCE\x8D\xF4\x82\xAA\x8B\xA6\x8B""c""\x82\xB3\x82\xEA\x82\xBD\x82\xAA\x81""E""\x81""E""\x81""E",
+ "\x83""}""\x83\x8B\x83""R""\x82\xC6\x83""n""\x83\x93\x83""h""\x82\xAA\x81""A""\x82\xB1\x82\xCC\x96\xE2\x91\xE8\x82\xF0\x94""C""\x82\xB3\x82\xEA\x82\xBD\x81""B",
+ "\x83""n""\x83\x93\x83""h""\x82\xAA\x94\xAD\x88\xC4\x82\xB5\x82\xC4\x81""A",
+ "\x82\xC2\x82\xA2\x82\xC9\x81""A""\x89\xF0\x8C\x88\x8D\xF4\x82\xAA\x8C\x88\x92\xE8\x82\xB5\x82\xBD\x81""B",
+ "\x83""L""\x83\x89\x83\x93\x83""f""\x83""B""\x83""A""\x82\xF0\x8B""~""\x82\xA4\x82\xC9\x82\xCD\x81""A",
+ "\x90\xA2\x8A""E""\x82\xCC\x92\x86\x90""S""\x82\xC9\x82\xA0\x82\xE9\x81""h""\x96\x82\x96""@""\x82\xCC\x82\xA2\x82\xA9\x82\xE8\x90\xCE\x81""h""\x82\xAA\x95""K""\x97""v""\x82\xBE\x81""B",
+ "\x83""U""\x83\x93\x83""V""\x83""A""\x81""A""\x8C""N""\x82\xAA\x8D\xCC\x82\xE8\x82\xC9\x8D""s""\x82\xAD\x82\xCC\x82\xBE\x81""B",
+ "Thank you for playing The Hand of Fate.",
+ "\x90\xA2\x8A""E""\x82\xCC\x92\x86\x90""S""\x82\xD6\x8D""s""\x82\xAD\x82\xC9\x82\xCD\x81""A""\x83""u""\x83\x8B\x81""[""\x83""x""\x83\x8A\x81""[""\x82\xE0\x95""K""\x97""v""\x82\xBE\x82\xC6\x8E""v""\x82\xA4\x82\xED\x81""B",
+ " DUMMY STRING... ",
+ " DUMMY STRING... ",
+ "\x82\xA0\x82\x9F\x81""A""\x8E\x84\x82\xCC\x8E\x9D\x82\xBF\x95\xA8\x82\xAA\x82\xB7\x82\xD7\x82\xC4\x93\x90\x82\xDC\x82\xEA\x82\xC4\x82\xA2\x82\xE9\x81""I",
+ " DUMMY STRING... ",
+ "\x82\xBE\x82\xC1\x82\xC4\x81""A""\x90\xA2\x8A""E""\x82\xCC\x92\x86\x90""S""\x82\xDC\x82\xC5\x95\xE0\x82\xA2\x82\xC4\x8D""s""\x82\xAD\x82\xC8\x82\xF1\x82\xC4\x81""A""\x8B""C""\x82\xAA\x89\x93\x82\xAD\x82\xC8\x82\xE9\x82\xB6\x82\xE1\x82\xC8\x82\xA2\x81""I",
+ " DUMMY STRING... ",
+ " DUMMY STRING... ",
+ "\x8B""}""\x82\xAE\x82\xCC\x82\xE6\x81""A""\x83""t""\x83""H""\x81""[""\x83\x93\x81""I",
+ "\x82\xE2\x82\xC1\x82\xCF\x82\xE8\x81""A""\x97\x88\x82\xE9\x82\xF1\x82\xB6\x82\xE1\x82\xC8\x82\xA9\x82\xC1\x82\xBD\x81""I",
+ "\x82\xE0\x82\xA4\x81""A""\x93\xF1\x93""x""\x82\xC6\x97\xC2\x82\xC9\x8D""s""\x82\xA9\x82\xCB\x82\xA6\x81""I",
+ "\x83""Q""\x83\x8D\x83""Q""\x81""[""\x83\x8D\x81""B",
+ "\x8A""^""\x82\xCC\x8E""q""\x82\xCD\x8A""^""\x82\xBE\x81""B""\x81""@",
+ "\x82\xC8\x82\xF1\x82\xBE\x81""A""\x82\xE0\x82\xA4\x83""`""\x81""[""\x83""Y""\x82\xCD\x82\xC8\x82\xA2\x82\xBC\x81""I",
+ "\x82\xE6\x82\xB5\x81""A""\x83""I""\x83\x8C\x83\x93\x83""W""\x82\xCC\x94\xE7\x82\xC5\x82\xE2\x82\xEB\x82\xA4\x81""B",
+ "\x83""}""\x83""}""\x81""A""\x96""l""\x82\xCC\x96\xD1\x82\xE0\x82\xD3\x82\xB3\x82\xD3\x82\xB3\x81""H",
+ "\x82\xA8\x82\xA2\x82\xB1\x82\xE7\x81""A""\x82\xB1\x82\xB1\x82\xA9\x82\xE7\x8F""o""\x82\xC4\x8D""s""\x82\xAF\x81""I",
+ "\x82\xA8\x91""O""\x82\xAA\x94\xBC\x95\xAA\x82\xC9\x90\xD8\x82\xEA\x82\xE6\x81""A""\x89\xB4\x82\xAA\x91""I""\x82\xD4\x82\xA9\x82\xE7\x82\xB3\x81""B",
+ "\x82\xA2\x82\xE2\x81""A""\x82\xA8\x91""O""\x82\xAA\x94\xBC\x95\xAA\x82\xC9\x90\xD8\x82\xEA\x82\xCE\x81""A""\x89\xB4\x82\xAA\x91""I""\x82\xD4\x81""B",
+ "\x89\xB4\x82\xCD\x82\xDC\x82\xBE\x81""A""\x94""[""\x93\xBE\x82\xB5\x82\xBF\x82\xE1\x82\xA2\x82\xC8\x82\xA2\x82\xBA\x81""B",
+ "\x82\xA2\x82\xA2\x89\xC1\x8C\xB8\x82\xC9\x82\xB5\x82\xEB\x81""A""\x82\xDC\x82\xBD\x89\xA3\x82\xE9\x82\xBC\x81""I",
+ "Executive Producer",
+ "Brett W. Sperry",
+ "Designed & Directed by",
+ "Rick Gush",
+ "Lead Programmer",
+ "Michael Legg",
+ "Art Management",
+ "Louis Castle",
+ "Joseph B. Hewitt IV",
+ "Lead Artist",
+ "Rick Parks",
+ "Additional Coding by",
+ "Philip W. Gorrow",
+ "Matt Collins",
+ "Mark McCubbin",
+ "Artists",
+ "Cameron Chun",
+ "Cary Averett",
+ "Cindy Chinn",
+ "Elie Arabian",
+ "Fei Cheng",
+ "Ferby Miguel",
+ "Frank Mendeola",
+ "Jack Martin",
+ "Jerry Moore",
+ "",
+ "Judith Peterson",
+ "Larry Miller",
+ "Lenny Lee",
+ "Louise Sandoval",
+ "Ren Olsen",
+ "Music & Sounds by",
+ "Paul Mudra",
+ "Frank Klepacki",
+ "Dwight Okahara",
+ "Pat Collins",
+ "Qualilty Assurance by",
+ "Glenn Sperry",
+ "Michael Lightner",
+ "William Foster",
+ "Jesse Clemit",
+ "Jeff Fillhaber",
+ "Manual, Package Design",
+ "& Fulfillment",
+ "Eydie Laramore",
+ "Lisa Marcinko",
+ "Lauren Rifkin",
+ "Congratulations!",
+ "Thank you for playing The Hand of Fate!",
+ "Guest Coding",
+ "Producer Liaison",
+ "Scott Duckett",
+ "Irvine Testers",
+ "Chris McFarland",
+ "Paul Moore",
+ "Chad Soares",
+ "Jared Brinkley",
+ "Jon Willliams",
+ "Chris Toft",
+ "Chris's Hair by",
+ "Cumulo Nimbus",
+ "\x83""f""\x81""[""\x83""^""\x82\xF0\x83\x8D\x81""[""\x83""h""\x82\xB7\x82\xE9",
+ "\x83""C""\x83\x93\x83""g""\x83\x8D\x83""_""\x83""N""\x83""V""\x83\x87\x83\x93",
+ "\x90""V""\x82\xBD\x82\xC9\x83""Q""\x81""[""\x83\x80\x82\xF0\x8E""n""\x82\xDF\x82\xE9",
+ "\x83""Q""\x81""[""\x83\x80\x82\xF0\x8F""I""\x97\xB9\x82\xB7\x82\xE9",
+ "Special Thanks to",
+ "Sake Joe Bostic-san",
+ "Tim Fritz",
+ "Kenny Dunne",
+ "Yukio Sekiguchi (Japan)",
+ "Takeshi Abo (Japan)"
+};
+
+static const StringListProvider k2SeqplayStringsPC98JapaneseProvider = { ARRAYSIZE(k2SeqplayStringsPC98Japanese), k2SeqplayStringsPC98Japanese };
+
diff --git a/devtools/create_kyradat/resources/lok_amiga.h b/devtools/create_kyradat/resources/lok_amiga.h
new file mode 100644
index 0000000000..4cfa275a55
--- /dev/null
+++ b/devtools/create_kyradat/resources/lok_amiga.h
@@ -0,0 +1,1763 @@
+static const byte k1KallakWritingSeqAmiga[2036] = {
+ 0x00, 0x00, 0x01, 0x1A, 0x0E, 0x1B, 0x17, 0x00,
+ 0x00, 0x00, 0x3F, 0x01, 0xC7, 0x00, 0x00, 0x0C,
+ 0x00, 0x19, 0x04, 0x02, 0x00, 0x00, 0x00, 0x00,
+ 0x10, 0x05, 0x00, 0x95, 0x00, 0x20, 0x09, 0x0F,
+ 0x2E, 0x02, 0x00, 0x01, 0x00, 0x00, 0x10, 0x05,
+ 0x01, 0x94, 0x00, 0x1B, 0x07, 0x06, 0x00, 0x18,
+ 0x1D, 0x02, 0x00, 0x02, 0x00, 0x00, 0x10, 0x05,
+ 0x02, 0x93, 0x00, 0x14, 0x07, 0x06, 0x00, 0x02,
+ 0x00, 0x03, 0x00, 0x00, 0x10, 0x05, 0x01, 0x90,
+ 0x00, 0x1B, 0x07, 0x06, 0x00, 0x02, 0x00, 0x04,
+ 0x00, 0x00, 0x10, 0x05, 0x00, 0x8D, 0x00, 0x20,
+ 0x07, 0x06, 0x00, 0x18, 0x1D, 0x02, 0x00, 0x05,
+ 0x00, 0x00, 0x10, 0x05, 0x01, 0x8A, 0x00, 0x1B,
+ 0x07, 0x06, 0x00, 0x02, 0x00, 0x06, 0x00, 0x00,
+ 0x10, 0x05, 0x02, 0x88, 0x00, 0x14, 0x07, 0x06,
+ 0x00, 0x18, 0x1D, 0x02, 0x00, 0x07, 0x00, 0x00,
+ 0x10, 0x05, 0x01, 0x85, 0x00, 0x1B, 0x07, 0x06,
+ 0x00, 0x02, 0x00, 0x08, 0x00, 0x00, 0x10, 0x05,
+ 0x00, 0x82, 0x00, 0x20, 0x07, 0x06, 0x00, 0x02,
+ 0x00, 0x09, 0x00, 0x00, 0x10, 0x05, 0x01, 0x7F,
+ 0x00, 0x1B, 0x07, 0x06, 0x00, 0x02, 0x00, 0x0A,
+ 0x00, 0x00, 0x10, 0x05, 0x02, 0x7C, 0x00, 0x14,
+ 0x07, 0x06, 0x00, 0x18, 0x1D, 0x02, 0x00, 0x0B,
+ 0x00, 0x00, 0x10, 0x05, 0x01, 0x79, 0x00, 0x1B,
+ 0x07, 0x06, 0x00, 0x02, 0x00, 0x0C, 0x00, 0x00,
+ 0x10, 0x05, 0x00, 0x76, 0x00, 0x20, 0x07, 0x06,
+ 0x00, 0x02, 0x00, 0x0D, 0x00, 0x00, 0x10, 0x05,
+ 0x01, 0x73, 0x00, 0x1B, 0x07, 0x06, 0x00, 0x18,
+ 0x1D, 0x02, 0x00, 0x0E, 0x00, 0x00, 0x10, 0x05,
+ 0x02, 0x70, 0x00, 0x14, 0x07, 0x06, 0x00, 0x02,
+ 0x00, 0x0F, 0x00, 0x00, 0x10, 0x05, 0x01, 0x6D,
+ 0x00, 0x1B, 0x07, 0x06, 0x00, 0x02, 0x00, 0x10,
+ 0x00, 0x00, 0x10, 0x05, 0x00, 0x6A, 0x00, 0x20,
+ 0x07, 0x06, 0x00, 0x02, 0x00, 0x11, 0x00, 0x00,
+ 0x10, 0x05, 0x01, 0x67, 0x00, 0x1B, 0x07, 0x06,
+ 0x00, 0x18, 0x1D, 0x02, 0x00, 0x12, 0x00, 0x00,
+ 0x10, 0x05, 0x02, 0x65, 0x00, 0x14, 0x07, 0x06,
+ 0x00, 0x02, 0x00, 0x13, 0x00, 0x00, 0x10, 0x05,
+ 0x01, 0x63, 0x00, 0x1B, 0x07, 0x06, 0x00, 0x02,
+ 0x00, 0x14, 0x00, 0x00, 0x10, 0x05, 0x00, 0x63,
+ 0x00, 0x20, 0x07, 0x06, 0x00, 0x02, 0x00, 0x15,
+ 0x00, 0x00, 0x10, 0x05, 0x00, 0x65, 0x00, 0x1F,
+ 0x07, 0x06, 0x00, 0x02, 0x00, 0x16, 0x00, 0x00,
+ 0x10, 0x05, 0x00, 0x6A, 0x00, 0x1D, 0x07, 0x06,
+ 0x00, 0x02, 0x00, 0x17, 0x00, 0x00, 0x10, 0x05,
+ 0x00, 0x70, 0x00, 0x19, 0x07, 0x06, 0x00, 0x02,
+ 0x00, 0x18, 0x00, 0x00, 0x10, 0x05, 0x00, 0x76,
+ 0x00, 0x17, 0x07, 0x06, 0x00, 0x02, 0x00, 0x19,
+ 0x00, 0x00, 0x10, 0x05, 0x00, 0x7C, 0x00, 0x16,
+ 0x07, 0x06, 0x00, 0x02, 0x00, 0x1A, 0x00, 0x00,
+ 0x10, 0x05, 0x00, 0x82, 0x00, 0x17, 0x07, 0x06,
+ 0x00, 0x02, 0x00, 0x1B, 0x00, 0x00, 0x10, 0x05,
+ 0x00, 0x88, 0x00, 0x19, 0x07, 0x06, 0x00, 0x02,
+ 0x00, 0x1C, 0x00, 0x00, 0x10, 0x05, 0x00, 0x8D,
+ 0x00, 0x1D, 0x07, 0x06, 0x00, 0x02, 0x00, 0x1D,
+ 0x00, 0x00, 0x10, 0x05, 0x00, 0x93, 0x00, 0x1F,
+ 0x07, 0x06, 0x00, 0x1C, 0x1B, 0x0F, 0x2F, 0x02,
+ 0x00, 0x01, 0x00, 0x00, 0x10, 0x05, 0x01, 0x94,
+ 0x00, 0x1B, 0x07, 0x06, 0x00, 0x02, 0x00, 0x01,
+ 0x00, 0x00, 0x10, 0x05, 0x01, 0x94, 0x00, 0x1B,
+ 0x07, 0x06, 0x00, 0x18, 0x1D, 0x02, 0x00, 0x02,
+ 0x00, 0x00, 0x10, 0x05, 0x02, 0x93, 0x00, 0x14,
+ 0x07, 0x06, 0x00, 0x02, 0x00, 0x02, 0x00, 0x00,
+ 0x10, 0x05, 0x02, 0x93, 0x00, 0x14, 0x07, 0x06,
+ 0x00, 0x02, 0x00, 0x03, 0x00, 0x00, 0x10, 0x05,
+ 0x01, 0x90, 0x00, 0x1B, 0x07, 0x06, 0x00, 0x02,
+ 0x00, 0x04, 0x00, 0x00, 0x10, 0x05, 0x00, 0x8D,
+ 0x00, 0x20, 0x07, 0x06, 0x00, 0x18, 0x1D, 0x02,
+ 0x00, 0x05, 0x00, 0x00, 0x10, 0x05, 0x01, 0x8A,
+ 0x00, 0x1B, 0x07, 0x06, 0x00, 0x02, 0x00, 0x05,
+ 0x00, 0x00, 0x10, 0x05, 0x01, 0x8A, 0x00, 0x1B,
+ 0x07, 0x06, 0x00, 0x02, 0x00, 0x06, 0x00, 0x00,
+ 0x10, 0x05, 0x02, 0x88, 0x00, 0x14, 0x07, 0x06,
+ 0x00, 0x18, 0x1D, 0x02, 0x00, 0x07, 0x00, 0x00,
+ 0x10, 0x05, 0x01, 0x85, 0x00, 0x1B, 0x07, 0x06,
+ 0x00, 0x02, 0x00, 0x08, 0x00, 0x00, 0x10, 0x05,
+ 0x00, 0x82, 0x00, 0x20, 0x07, 0x06, 0x00, 0x02,
+ 0x00, 0x09, 0x00, 0x00, 0x10, 0x05, 0x01, 0x7F,
+ 0x00, 0x1B, 0x07, 0x06, 0x00, 0x02, 0x00, 0x0A,
+ 0x00, 0x00, 0x10, 0x05, 0x02, 0x7C, 0x00, 0x14,
+ 0x07, 0x06, 0x00, 0x18, 0x1D, 0x02, 0x00, 0x0B,
+ 0x00, 0x00, 0x10, 0x05, 0x01, 0x79, 0x00, 0x1B,
+ 0x07, 0x06, 0x00, 0x02, 0x00, 0x0C, 0x00, 0x00,
+ 0x10, 0x05, 0x00, 0x76, 0x00, 0x20, 0x07, 0x06,
+ 0x00, 0x02, 0x00, 0x0D, 0x00, 0x00, 0x10, 0x05,
+ 0x01, 0x73, 0x00, 0x1B, 0x07, 0x06, 0x00, 0x18,
+ 0x1D, 0x02, 0x00, 0x0E, 0x00, 0x00, 0x10, 0x05,
+ 0x02, 0x70, 0x00, 0x14, 0x07, 0x06, 0x00, 0x02,
+ 0x00, 0x0F, 0x00, 0x00, 0x10, 0x05, 0x01, 0x6D,
+ 0x00, 0x1B, 0x07, 0x06, 0x00, 0x02, 0x00, 0x10,
+ 0x00, 0x00, 0x10, 0x05, 0x00, 0x6A, 0x00, 0x20,
+ 0x07, 0x06, 0x00, 0x02, 0x00, 0x11, 0x00, 0x00,
+ 0x10, 0x05, 0x01, 0x67, 0x00, 0x1B, 0x07, 0x06,
+ 0x00, 0x18, 0x1D, 0x02, 0x00, 0x12, 0x00, 0x00,
+ 0x10, 0x05, 0x02, 0x65, 0x00, 0x14, 0x07, 0x06,
+ 0x00, 0x02, 0x00, 0x13, 0x00, 0x00, 0x10, 0x05,
+ 0x01, 0x63, 0x00, 0x1B, 0x07, 0x06, 0x00, 0x02,
+ 0x00, 0x14, 0x00, 0x00, 0x10, 0x05, 0x00, 0x63,
+ 0x00, 0x20, 0x07, 0x06, 0x00, 0x02, 0x00, 0x15,
+ 0x00, 0x00, 0x10, 0x05, 0x00, 0x65, 0x00, 0x1F,
+ 0x07, 0x06, 0x00, 0x02, 0x00, 0x16, 0x00, 0x00,
+ 0x10, 0x05, 0x00, 0x6A, 0x00, 0x1D, 0x07, 0x06,
+ 0x00, 0x02, 0x00, 0x17, 0x00, 0x00, 0x10, 0x05,
+ 0x00, 0x70, 0x00, 0x19, 0x07, 0x06, 0x00, 0x02,
+ 0x00, 0x18, 0x00, 0x00, 0x10, 0x05, 0x00, 0x76,
+ 0x00, 0x17, 0x07, 0x06, 0x00, 0x02, 0x00, 0x19,
+ 0x00, 0x00, 0x10, 0x05, 0x00, 0x7C, 0x00, 0x16,
+ 0x07, 0x06, 0x00, 0x02, 0x00, 0x1A, 0x00, 0x00,
+ 0x10, 0x05, 0x00, 0x82, 0x00, 0x17, 0x07, 0x06,
+ 0x00, 0x02, 0x00, 0x1B, 0x00, 0x00, 0x10, 0x05,
+ 0x00, 0x88, 0x00, 0x19, 0x07, 0x06, 0x00, 0x02,
+ 0x00, 0x1C, 0x00, 0x00, 0x10, 0x05, 0x00, 0x8D,
+ 0x00, 0x1D, 0x07, 0x06, 0x00, 0x02, 0x00, 0x1D,
+ 0x00, 0x00, 0x10, 0x05, 0x00, 0x93, 0x00, 0x1F,
+ 0x07, 0x06, 0x00, 0x1C, 0x1B, 0x0F, 0x30, 0x02,
+ 0x00, 0x01, 0x00, 0x00, 0x10, 0x05, 0x01, 0x94,
+ 0x00, 0x1B, 0x07, 0x06, 0x00, 0x02, 0x00, 0x01,
+ 0x00, 0x00, 0x10, 0x05, 0x01, 0x94, 0x00, 0x1B,
+ 0x07, 0x06, 0x00, 0x18, 0x1D, 0x02, 0x00, 0x02,
+ 0x00, 0x00, 0x10, 0x05, 0x02, 0x93, 0x00, 0x14,
+ 0x07, 0x06, 0x00, 0x02, 0x00, 0x02, 0x00, 0x00,
+ 0x10, 0x05, 0x02, 0x93, 0x00, 0x14, 0x07, 0x06,
+ 0x00, 0x02, 0x00, 0x02, 0x00, 0x00, 0x10, 0x05,
+ 0x02, 0x93, 0x00, 0x14, 0x07, 0x06, 0x00, 0x02,
+ 0x00, 0x03, 0x00, 0x00, 0x10, 0x05, 0x01, 0x90,
+ 0x00, 0x1B, 0x07, 0x06, 0x00, 0x02, 0x00, 0x03,
+ 0x00, 0x00, 0x10, 0x05, 0x01, 0x90, 0x00, 0x1B,
+ 0x07, 0x06, 0x00, 0x02, 0x00, 0x04, 0x00, 0x00,
+ 0x10, 0x05, 0x00, 0x8D, 0x00, 0x20, 0x07, 0x06,
+ 0x00, 0x18, 0x1D, 0x02, 0x00, 0x05, 0x00, 0x00,
+ 0x10, 0x05, 0x01, 0x8A, 0x00, 0x1B, 0x07, 0x06,
+ 0x00, 0x02, 0x00, 0x06, 0x00, 0x00, 0x10, 0x05,
+ 0x02, 0x88, 0x00, 0x14, 0x07, 0x06, 0x00, 0x18,
+ 0x1D, 0x02, 0x00, 0x07, 0x00, 0x00, 0x10, 0x05,
+ 0x01, 0x85, 0x00, 0x1B, 0x07, 0x06, 0x00, 0x02,
+ 0x00, 0x08, 0x00, 0x00, 0x10, 0x05, 0x00, 0x82,
+ 0x00, 0x20, 0x07, 0x06, 0x00, 0x02, 0x00, 0x09,
+ 0x00, 0x00, 0x10, 0x05, 0x01, 0x7F, 0x00, 0x1B,
+ 0x07, 0x06, 0x00, 0x02, 0x00, 0x0A, 0x00, 0x00,
+ 0x10, 0x05, 0x02, 0x7C, 0x00, 0x14, 0x07, 0x06,
+ 0x00, 0x18, 0x1D, 0x02, 0x00, 0x0B, 0x00, 0x00,
+ 0x10, 0x05, 0x01, 0x79, 0x00, 0x1B, 0x07, 0x06,
+ 0x00, 0x02, 0x00, 0x0C, 0x00, 0x00, 0x10, 0x05,
+ 0x00, 0x76, 0x00, 0x20, 0x07, 0x06, 0x00, 0x02,
+ 0x00, 0x0D, 0x00, 0x00, 0x10, 0x05, 0x01, 0x73,
+ 0x00, 0x1B, 0x07, 0x06, 0x00, 0x18, 0x1D, 0x02,
+ 0x00, 0x0E, 0x00, 0x00, 0x10, 0x05, 0x02, 0x70,
+ 0x00, 0x14, 0x07, 0x06, 0x00, 0x02, 0x00, 0x0F,
+ 0x00, 0x00, 0x10, 0x05, 0x01, 0x6D, 0x00, 0x1B,
+ 0x07, 0x06, 0x00, 0x02, 0x00, 0x10, 0x00, 0x00,
+ 0x10, 0x05, 0x00, 0x6A, 0x00, 0x20, 0x07, 0x06,
+ 0x00, 0x02, 0x00, 0x11, 0x00, 0x00, 0x10, 0x05,
+ 0x01, 0x67, 0x00, 0x1B, 0x07, 0x06, 0x00, 0x18,
+ 0x1D, 0x02, 0x00, 0x12, 0x00, 0x00, 0x10, 0x05,
+ 0x02, 0x65, 0x00, 0x14, 0x07, 0x06, 0x00, 0x02,
+ 0x00, 0x13, 0x00, 0x00, 0x10, 0x05, 0x01, 0x63,
+ 0x00, 0x1B, 0x07, 0x06, 0x00, 0x02, 0x00, 0x14,
+ 0x00, 0x00, 0x10, 0x05, 0x00, 0x63, 0x00, 0x20,
+ 0x07, 0x06, 0x00, 0x02, 0x00, 0x15, 0x00, 0x00,
+ 0x10, 0x05, 0x00, 0x65, 0x00, 0x1F, 0x07, 0x06,
+ 0x00, 0x02, 0x00, 0x16, 0x00, 0x00, 0x10, 0x05,
+ 0x00, 0x6A, 0x00, 0x1D, 0x07, 0x06, 0x00, 0x02,
+ 0x00, 0x17, 0x00, 0x00, 0x10, 0x05, 0x00, 0x70,
+ 0x00, 0x19, 0x07, 0x06, 0x00, 0x02, 0x00, 0x18,
+ 0x00, 0x00, 0x10, 0x05, 0x00, 0x76, 0x00, 0x17,
+ 0x07, 0x06, 0x00, 0x02, 0x00, 0x19, 0x00, 0x00,
+ 0x10, 0x05, 0x00, 0x7C, 0x00, 0x16, 0x07, 0x06,
+ 0x00, 0x02, 0x00, 0x1A, 0x00, 0x00, 0x10, 0x05,
+ 0x00, 0x82, 0x00, 0x17, 0x07, 0x06, 0x00, 0x02,
+ 0x00, 0x1B, 0x00, 0x00, 0x10, 0x05, 0x00, 0x88,
+ 0x00, 0x19, 0x07, 0x06, 0x00, 0x02, 0x00, 0x1C,
+ 0x00, 0x00, 0x10, 0x05, 0x00, 0x8D, 0x00, 0x1D,
+ 0x07, 0x06, 0x00, 0x02, 0x00, 0x1D, 0x00, 0x00,
+ 0x10, 0x05, 0x00, 0x93, 0x00, 0x1F, 0x07, 0x06,
+ 0x00, 0x1C, 0x06, 0x3C, 0x00, 0x1B, 0x0F, 0x31,
+ 0x02, 0x00, 0x00, 0x00, 0x00, 0x10, 0x05, 0x00,
+ 0x95, 0x00, 0x20, 0x07, 0x06, 0x00, 0x02, 0x00,
+ 0x00, 0x00, 0x00, 0x10, 0x05, 0x00, 0x95, 0x00,
+ 0x20, 0x07, 0x06, 0x00, 0x18, 0x1D, 0x02, 0x00,
+ 0x01, 0x00, 0x00, 0x10, 0x05, 0x01, 0x94, 0x00,
+ 0x1B, 0x07, 0x06, 0x00, 0x02, 0x00, 0x01, 0x00,
+ 0x00, 0x10, 0x05, 0x01, 0x94, 0x00, 0x1B, 0x07,
+ 0x06, 0x00, 0x02, 0x00, 0x02, 0x00, 0x00, 0x10,
+ 0x05, 0x02, 0x93, 0x00, 0x14, 0x07, 0x06, 0x00,
+ 0x02, 0x00, 0x02, 0x00, 0x00, 0x10, 0x05, 0x02,
+ 0x93, 0x00, 0x14, 0x07, 0x06, 0x00, 0x18, 0x1D,
+ 0x02, 0x00, 0x03, 0x00, 0x00, 0x10, 0x05, 0x01,
+ 0x90, 0x00, 0x1B, 0x07, 0x06, 0x00, 0x02, 0x00,
+ 0x04, 0x00, 0x00, 0x10, 0x05, 0x00, 0x8D, 0x00,
+ 0x20, 0x07, 0x06, 0x00, 0x02, 0x00, 0x05, 0x00,
+ 0x00, 0x10, 0x05, 0x01, 0x8A, 0x00, 0x1B, 0x07,
+ 0x06, 0x00, 0x18, 0x1D, 0x02, 0x00, 0x06, 0x00,
+ 0x00, 0x10, 0x05, 0x02, 0x88, 0x00, 0x14, 0x07,
+ 0x06, 0x00, 0x02, 0x00, 0x07, 0x00, 0x00, 0x10,
+ 0x05, 0x01, 0x85, 0x00, 0x1B, 0x07, 0x06, 0x00,
+ 0x18, 0x1D, 0x02, 0x00, 0x08, 0x00, 0x00, 0x10,
+ 0x05, 0x00, 0x82, 0x00, 0x20, 0x07, 0x06, 0x00,
+ 0x02, 0x00, 0x09, 0x00, 0x00, 0x10, 0x05, 0x01,
+ 0x7F, 0x00, 0x1B, 0x07, 0x06, 0x00, 0x02, 0x00,
+ 0x0A, 0x00, 0x00, 0x10, 0x05, 0x02, 0x7C, 0x00,
+ 0x14, 0x07, 0x06, 0x00, 0x18, 0x1D, 0x02, 0x00,
+ 0x0B, 0x00, 0x00, 0x10, 0x05, 0x01, 0x79, 0x00,
+ 0x1B, 0x07, 0x06, 0x00, 0x02, 0x00, 0x0C, 0x00,
+ 0x00, 0x10, 0x05, 0x00, 0x76, 0x00, 0x20, 0x07,
+ 0x06, 0x00, 0x18, 0x1D, 0x02, 0x00, 0x0D, 0x00,
+ 0x00, 0x10, 0x05, 0x01, 0x73, 0x00, 0x1B, 0x07,
+ 0x06, 0x00, 0x02, 0x00, 0x0E, 0x00, 0x00, 0x10,
+ 0x05, 0x02, 0x70, 0x00, 0x14, 0x07, 0x06, 0x00,
+ 0x02, 0x00, 0x0F, 0x00, 0x00, 0x10, 0x05, 0x01,
+ 0x6D, 0x00, 0x1B, 0x07, 0x06, 0x00, 0x18, 0x1D,
+ 0x02, 0x00, 0x10, 0x00, 0x00, 0x10, 0x05, 0x00,
+ 0x6A, 0x00, 0x20, 0x07, 0x06, 0x00, 0x02, 0x00,
+ 0x11, 0x00, 0x00, 0x10, 0x05, 0x01, 0x67, 0x00,
+ 0x1B, 0x07, 0x06, 0x00, 0x18, 0x1D, 0x02, 0x00,
+ 0x12, 0x00, 0x00, 0x10, 0x05, 0x02, 0x65, 0x00,
+ 0x14, 0x07, 0x06, 0x00, 0x06, 0x3C, 0x00, 0x02,
+ 0x00, 0x1E, 0x00, 0x00, 0x10, 0x08, 0x12, 0x06,
+ 0x1E, 0x00, 0x0A, 0x01, 0x02, 0x00, 0x1F, 0x00,
+ 0x00, 0x10, 0x07, 0x0A, 0x00, 0x02, 0x00, 0x20,
+ 0x00, 0x00, 0x10, 0x07, 0x0A, 0x00, 0x02, 0x00,
+ 0x21, 0x00, 0x00, 0x10, 0x07, 0x0A, 0x00, 0x02,
+ 0x00, 0x22, 0x00, 0x00, 0x10, 0x07, 0x0A, 0x00,
+ 0x0B, 0x01, 0x02, 0x00, 0x18, 0x1F, 0x06, 0x0A,
+ 0x00, 0x02, 0x00, 0x23, 0x00, 0x00, 0x10, 0x07,
+ 0x14, 0x00, 0x18, 0x1E, 0x02, 0x00, 0x24, 0x00,
+ 0x00, 0x10, 0x07, 0x14, 0x00, 0x02, 0x00, 0x25,
+ 0x00, 0x00, 0x10, 0x07, 0x14, 0x00, 0x18, 0x1F,
+ 0x02, 0x00, 0x26, 0x00, 0x00, 0x10, 0x07, 0x14,
+ 0x00, 0x02, 0x00, 0x27, 0x00, 0x00, 0x10, 0x07,
+ 0x14, 0x00, 0x18, 0x1E, 0x02, 0x00, 0x28, 0x00,
+ 0x00, 0x10, 0x08, 0x06, 0x3C, 0x00, 0x18, 0x1E,
+ 0x03, 0x00, 0x07, 0x06, 0x00, 0x18, 0x1E, 0x03,
+ 0x00, 0x07, 0x06, 0x00, 0x03, 0x00, 0x07, 0x06,
+ 0x00, 0x03, 0x00, 0x07, 0x06, 0x00, 0x03, 0x00,
+ 0x07, 0x06, 0x00, 0x03, 0x00, 0x07, 0x06, 0x00,
+ 0x03, 0x00, 0x07, 0x06, 0x00, 0x18, 0x1E, 0x03,
+ 0x00, 0x07, 0x06, 0x00, 0x03, 0x00, 0x07, 0x06,
+ 0x00, 0x03, 0x00, 0x07, 0x06, 0x00, 0x03, 0x00,
+ 0x07, 0x06, 0x00, 0x03, 0x00, 0x07, 0x06, 0x00,
+ 0x03, 0x00, 0x07, 0x06, 0x00, 0x03, 0x00, 0x07,
+ 0x06, 0x00, 0x03, 0x00, 0x07, 0x06, 0x00, 0x03,
+ 0x00, 0x07, 0x06, 0x00, 0x18, 0x1E, 0x03, 0x00,
+ 0x07, 0x06, 0x00, 0x03, 0x00, 0x07, 0x06, 0x00,
+ 0x03, 0x00, 0x07, 0x06, 0x00, 0x03, 0x00, 0x07,
+ 0x06, 0x00, 0x03, 0x00, 0x07, 0x06, 0x00, 0x03,
+ 0x00, 0x07, 0x06, 0x00, 0x03, 0x00, 0x07, 0x06,
+ 0x00, 0x03, 0x00, 0x07, 0x06, 0x00, 0x18, 0x1E,
+ 0x03, 0x00, 0x07, 0x06, 0x00, 0x03, 0x00, 0x07,
+ 0x06, 0x00, 0x03, 0x00, 0x07, 0x06, 0x00, 0x03,
+ 0x00, 0x07, 0x06, 0x00, 0x03, 0x00, 0x07, 0x06,
+ 0x00, 0x03, 0x00, 0x07, 0x06, 0x00, 0x03, 0x00,
+ 0x07, 0x06, 0x00, 0x03, 0x00, 0x07, 0x06, 0x00,
+ 0x03, 0x00, 0x07, 0x06, 0x00, 0x03, 0x00, 0x07,
+ 0x06, 0x00, 0x13, 0x1C, 0x19, 0x01, 0x06, 0x3C,
+ 0x00, 0x01, 0x00, 0x1D
+};
+
+static const ByteProvider k1KallakWritingSeqAmigaProvider = { ARRAYSIZE(k1KallakWritingSeqAmiga), k1KallakWritingSeqAmiga };
+
+static const byte k1MalcolmTreeSeqAmiga[532] = {
+ 0x00, 0x01, 0x00, 0x1A, 0x0E, 0x17, 0x00, 0x00,
+ 0x00, 0x3F, 0x01, 0xC7, 0x00, 0x00, 0x0D, 0x01,
+ 0x09, 0x02, 0x01, 0x00, 0x00, 0x00, 0x10, 0x19,
+ 0x03, 0x09, 0x18, 0x1E, 0x14, 0x18, 0x1F, 0x0A,
+ 0x00, 0x03, 0x01, 0x06, 0x06, 0x00, 0x0B, 0x00,
+ 0x1F, 0x00, 0x18, 0x19, 0x0A, 0x01, 0x03, 0x01,
+ 0x06, 0x06, 0x00, 0x0B, 0x01, 0x0F, 0x00, 0x18,
+ 0x26, 0x10, 0x1F, 0x50, 0x00, 0x2D, 0x05, 0x0A,
+ 0x02, 0x03, 0x01, 0x06, 0x06, 0x00, 0x0B, 0x02,
+ 0x10, 0x00, 0x11, 0x18, 0x1F, 0x03, 0x01, 0x06,
+ 0x06, 0x00, 0x03, 0x01, 0x06, 0x06, 0x00, 0x03,
+ 0x01, 0x06, 0x06, 0x00, 0x18, 0x24, 0x18, 0x1F,
+ 0x03, 0x01, 0x06, 0x06, 0x00, 0x18, 0x1E, 0x0A,
+ 0x03, 0x03, 0x01, 0x06, 0x06, 0x00, 0x0B, 0x03,
+ 0x15, 0x00, 0x10, 0x16, 0x50, 0x00, 0x2D, 0x05,
+ 0x18, 0x1F, 0x03, 0x01, 0x06, 0x06, 0x00, 0x03,
+ 0x01, 0x06, 0x06, 0x00, 0x18, 0x1E, 0x03, 0x01,
+ 0x06, 0x06, 0x00, 0x03, 0x01, 0x06, 0x06, 0x00,
+ 0x18, 0x1F, 0x03, 0x01, 0x06, 0x06, 0x00, 0x03,
+ 0x01, 0x06, 0x06, 0x00, 0x03, 0x01, 0x06, 0x06,
+ 0x00, 0x03, 0x01, 0x06, 0x06, 0x00, 0x18, 0x1E,
+ 0x03, 0x01, 0x06, 0x06, 0x00, 0x18, 0x1A, 0x18,
+ 0x1E, 0x0A, 0x05, 0x03, 0x01, 0x06, 0x06, 0x00,
+ 0x0B, 0x05, 0x09, 0x00, 0x11, 0x0A, 0x06, 0x03,
+ 0x01, 0x06, 0x06, 0x00, 0x0B, 0x06, 0x14, 0x00,
+ 0x18, 0x1A, 0x18, 0x1F, 0x10, 0x17, 0x50, 0x00,
+ 0x2D, 0x05, 0x06, 0x3C, 0x00, 0x0A, 0x07, 0x03,
+ 0x01, 0x06, 0x06, 0x00, 0x0B, 0x07, 0x06, 0x00,
+ 0x18, 0x1E, 0x06, 0x1E, 0x00, 0x10, 0x18, 0x50,
+ 0x00, 0x2D, 0x05, 0x03, 0x01, 0x06, 0x06, 0x00,
+ 0x03, 0x01, 0x06, 0x06, 0x00, 0x03, 0x01, 0x06,
+ 0x06, 0x00, 0x0A, 0x08, 0x04, 0x01, 0x06, 0x06,
+ 0x00, 0x04, 0x01, 0x06, 0x06, 0x00, 0x03, 0x01,
+ 0x06, 0x06, 0x00, 0x03, 0x01, 0x06, 0x06, 0x00,
+ 0x0B, 0x08, 0x01, 0x00, 0x03, 0x01, 0x06, 0x06,
+ 0x00, 0x06, 0x78, 0x00, 0x0A, 0x09, 0x03, 0x01,
+ 0x06, 0x06, 0x00, 0x0B, 0x09, 0x04, 0x00, 0x18,
+ 0x1B, 0x0A, 0x0A, 0x03, 0x01, 0x06, 0x06, 0x00,
+ 0x0B, 0x0A, 0x09, 0x00, 0x06, 0x14, 0x00, 0x10,
+ 0x19, 0x50, 0x00, 0x2D, 0x05, 0x03, 0x01, 0x06,
+ 0x06, 0x00, 0x03, 0x01, 0x06, 0x06, 0x00, 0x0A,
+ 0x0B, 0x03, 0x01, 0x06, 0x06, 0x00, 0x04, 0x01,
+ 0x06, 0x06, 0x00, 0x04, 0x01, 0x06, 0x06, 0x00,
+ 0x03, 0x01, 0x06, 0x06, 0x00, 0x03, 0x01, 0x06,
+ 0x06, 0x00, 0x0B, 0x0B, 0x01, 0x00, 0x03, 0x01,
+ 0x06, 0x06, 0x00, 0x03, 0x01, 0x06, 0x06, 0x00,
+ 0x03, 0x01, 0x06, 0x06, 0x00, 0x10, 0x1A, 0x50,
+ 0x00, 0x2D, 0x05, 0x0A, 0x0C, 0x03, 0x01, 0x06,
+ 0x06, 0x00, 0x0B, 0x0C, 0x12, 0x00, 0x03, 0x01,
+ 0x01, 0x01, 0x11, 0x15, 0x00, 0x02, 0x00, 0x02,
+ 0x00, 0x02, 0x02, 0x00, 0x00, 0x00, 0x10, 0x10,
+ 0x1C, 0x50, 0x00, 0x2D, 0x05, 0x06, 0x1E, 0x00,
+ 0x03, 0x02, 0x03, 0x02, 0x06, 0x06, 0x00, 0x11,
+ 0x18, 0x1C, 0x0A, 0x0F, 0x03, 0x02, 0x06, 0x06,
+ 0x00, 0x0B, 0x0F, 0x0D, 0x00, 0x10, 0x1D, 0x50,
+ 0x00, 0x2D, 0x05, 0x0A, 0x10, 0x03, 0x02, 0x06,
+ 0x06, 0x00, 0x03, 0x02, 0x06, 0x06, 0x00, 0x03,
+ 0x02, 0x06, 0x06, 0x00, 0x04, 0x02, 0x06, 0x06,
+ 0x00, 0x04, 0x02, 0x06, 0x06, 0x00, 0x04, 0x02,
+ 0x06, 0x06, 0x00, 0x0B, 0x10, 0x02, 0x00, 0x10,
+ 0x1E, 0x50, 0x00, 0x2D, 0x05, 0x0A, 0x11, 0x03,
+ 0x02, 0x06, 0x06, 0x00, 0x03, 0x02, 0x06, 0x06,
+ 0x00, 0x03, 0x02, 0x06, 0x06, 0x00, 0x04, 0x02,
+ 0x06, 0x06, 0x00, 0x04, 0x02, 0x06, 0x06, 0x00,
+ 0x04, 0x02, 0x06, 0x06, 0x00, 0x0B, 0x11, 0x02,
+ 0x00, 0x06, 0xB4, 0x00, 0x13, 0x19, 0x01, 0x01,
+ 0x01, 0x01, 0x02, 0x1D
+};
+
+static const ByteProvider k1MalcolmTreeSeqAmigaProvider = { ARRAYSIZE(k1MalcolmTreeSeqAmiga), k1MalcolmTreeSeqAmiga };
+
+static const byte k1WestwoodLogoSeqAmiga[77] = {
+ 0x19, 0x02, 0x00, 0x03, 0x01, 0x1A, 0x02, 0x03,
+ 0x00, 0x00, 0x00, 0x00, 0x16, 0x01, 0x06, 0x06,
+ 0x00, 0x06, 0x3C, 0x00, 0x18, 0x14, 0x0A, 0x00,
+ 0x03, 0x03, 0x16, 0x01, 0x0B, 0x00, 0x08, 0x00,
+ 0x06, 0x3C, 0x00, 0x18, 0x27, 0x0A, 0x01, 0x03,
+ 0x03, 0x16, 0x01, 0x0B, 0x01, 0x0B, 0x00, 0x06,
+ 0x78, 0x00, 0x18, 0x14, 0x02, 0x03, 0x0A, 0x00,
+ 0x00, 0x00, 0x16, 0x01, 0x06, 0x06, 0x00, 0x0A,
+ 0x02, 0x04, 0x03, 0x16, 0x01, 0x0B, 0x02, 0x09,
+ 0x00, 0x13, 0x01, 0x03, 0x1D
+};
+
+static const ByteProvider k1WestwoodLogoSeqAmigaProvider = { ARRAYSIZE(k1WestwoodLogoSeqAmiga), k1WestwoodLogoSeqAmiga };
+
+static const byte k1KyrandiaLogoSeqAmiga[92] = {
+ 0x15, 0x00, 0x02, 0x00, 0x06, 0x01, 0x1A, 0x02,
+ 0x06, 0x00, 0x00, 0x00, 0x00, 0x16, 0x00, 0x06,
+ 0x06, 0x00, 0x18, 0x14, 0x16, 0x04, 0x0A, 0x00,
+ 0x03, 0x06, 0x16, 0x00, 0x0B, 0x00, 0x0B, 0x00,
+ 0x06, 0x3C, 0x00, 0x18, 0x27, 0x0A, 0x01, 0x03,
+ 0x06, 0x16, 0x00, 0x0B, 0x01, 0x0F, 0x00, 0x06,
+ 0x3C, 0x00, 0x18, 0x27, 0x0A, 0x02, 0x04, 0x06,
+ 0x16, 0x00, 0x0B, 0x02, 0x0F, 0x00, 0x02, 0x06,
+ 0x0D, 0x00, 0x00, 0x00, 0x16, 0x00, 0x06, 0x06,
+ 0x00, 0x06, 0x78, 0x00, 0x18, 0x14, 0x0A, 0x02,
+ 0x04, 0x06, 0x16, 0x00, 0x0B, 0x02, 0x0C, 0x00,
+ 0x13, 0x01, 0x06, 0x1D
+};
+
+static const ByteProvider k1KyrandiaLogoSeqAmigaProvider = { ARRAYSIZE(k1KyrandiaLogoSeqAmiga), k1KyrandiaLogoSeqAmiga };
+
+static const byte k1KallakMalcolmSeqAmiga[635] = {
+ 0x00, 0x04, 0x01, 0x1A, 0x0E, 0x17, 0x00, 0x00,
+ 0x00, 0x3F, 0x01, 0xC7, 0x00, 0x00, 0x0D, 0x00,
+ 0x0C, 0x03, 0x17, 0x00, 0x00, 0x88, 0x3F, 0x01,
+ 0xC7, 0x00, 0x02, 0x19, 0x05, 0x02, 0x04, 0x00,
+ 0x10, 0x00, 0x3A, 0x09, 0x14, 0x18, 0x23, 0x0A,
+ 0x00, 0x03, 0x04, 0x07, 0x07, 0x00, 0x0B, 0x00,
+ 0x22, 0x00, 0x11, 0x10, 0x02, 0x50, 0x00, 0x3A,
+ 0x05, 0x0A, 0x01, 0x03, 0x04, 0x07, 0x07, 0x00,
+ 0x0B, 0x01, 0x07, 0x00, 0x06, 0x3C, 0x00, 0x11,
+ 0x10, 0x03, 0x50, 0x00, 0x3A, 0x05, 0x0A, 0x02,
+ 0x03, 0x04, 0x07, 0x07, 0x00, 0x0B, 0x02, 0x17,
+ 0x00, 0x06, 0x3C, 0x00, 0x11, 0x10, 0x04, 0x50,
+ 0x00, 0x3A, 0x05, 0x0A, 0x03, 0x03, 0x04, 0x07,
+ 0x07, 0x00, 0x0B, 0x03, 0x0A, 0x00, 0x06, 0x3C,
+ 0x00, 0x03, 0x04, 0x07, 0x07, 0x00, 0x03, 0x04,
+ 0x07, 0x07, 0x00, 0x03, 0x04, 0x07, 0x07, 0x00,
+ 0x11, 0x11, 0x10, 0x05, 0xF0, 0x00, 0x3A, 0x05,
+ 0x03, 0x04, 0x07, 0x07, 0x00, 0x03, 0x04, 0x07,
+ 0x07, 0x00, 0x03, 0x04, 0x07, 0x07, 0x00, 0x03,
+ 0x04, 0x07, 0x07, 0x00, 0x06, 0x3C, 0x00, 0x11,
+ 0x10, 0x06, 0xF0, 0x00, 0x3A, 0x05, 0x0A, 0x04,
+ 0x03, 0x04, 0x07, 0x07, 0x00, 0x0B, 0x04, 0x12,
+ 0x00, 0x06, 0x3C, 0x00, 0x03, 0x04, 0x07, 0x07,
+ 0x00, 0x03, 0x04, 0x07, 0x07, 0x00, 0x03, 0x04,
+ 0x07, 0x07, 0x00, 0x03, 0x04, 0x07, 0x07, 0x00,
+ 0x06, 0x78, 0x00, 0x11, 0x10, 0x07, 0xF0, 0x00,
+ 0x3A, 0x05, 0x0A, 0x05, 0x03, 0x04, 0x07, 0x07,
+ 0x00, 0x0B, 0x05, 0x11, 0x00, 0x06, 0x3C, 0x00,
+ 0x03, 0x04, 0x07, 0x07, 0x00, 0x03, 0x04, 0x07,
+ 0x07, 0x00, 0x11, 0x11, 0x10, 0x08, 0x50, 0x00,
+ 0x3A, 0x05, 0x0A, 0x06, 0x03, 0x04, 0x07, 0x07,
+ 0x00, 0x0B, 0x06, 0x07, 0x00, 0x06, 0x3C, 0x00,
+ 0x03, 0x04, 0x07, 0x07, 0x00, 0x03, 0x04, 0x07,
+ 0x07, 0x00, 0x03, 0x04, 0x07, 0x07, 0x00, 0x11,
+ 0x10, 0x09, 0x50, 0x00, 0x3A, 0x05, 0x0A, 0x07,
+ 0x03, 0x04, 0x07, 0x07, 0x00, 0x0B, 0x07, 0x0A,
+ 0x00, 0x06, 0x3C, 0x00, 0x03, 0x04, 0x07, 0x07,
+ 0x00, 0x11, 0x10, 0x0A, 0x50, 0x00, 0x3A, 0x05,
+ 0x0A, 0x08, 0x03, 0x04, 0x07, 0x07, 0x00, 0x0B,
+ 0x08, 0x10, 0x00, 0x06, 0x3C, 0x00, 0x03, 0x04,
+ 0x07, 0x07, 0x00, 0x11, 0x11, 0x10, 0x0B, 0xF0,
+ 0x00, 0x3A, 0x05, 0x03, 0x04, 0x07, 0x07, 0x00,
+ 0x03, 0x04, 0x07, 0x07, 0x00, 0x03, 0x04, 0x07,
+ 0x07, 0x00, 0x03, 0x04, 0x07, 0x07, 0x00, 0x03,
+ 0x04, 0x07, 0x07, 0x00, 0x03, 0x04, 0x07, 0x07,
+ 0x00, 0x03, 0x04, 0x07, 0x07, 0x00, 0x03, 0x04,
+ 0x07, 0x07, 0x00, 0x06, 0x3C, 0x00, 0x03, 0x04,
+ 0x07, 0x07, 0x00, 0x11, 0x10, 0x0C, 0xF0, 0x00,
+ 0x3A, 0x05, 0x0A, 0x09, 0x03, 0x04, 0x07, 0x07,
+ 0x00, 0x0B, 0x09, 0x0E, 0x00, 0x06, 0x3C, 0x00,
+ 0x03, 0x04, 0x07, 0x07, 0x00, 0x03, 0x04, 0x07,
+ 0x07, 0x00, 0x03, 0x04, 0x07, 0x07, 0x00, 0x03,
+ 0x04, 0x07, 0x07, 0x00, 0x03, 0x04, 0x07, 0x07,
+ 0x00, 0x03, 0x04, 0x07, 0x07, 0x00, 0x11, 0x11,
+ 0x10, 0x0D, 0x50, 0x00, 0x3A, 0x05, 0x0A, 0x0A,
+ 0x03, 0x04, 0x07, 0x07, 0x00, 0x0B, 0x0A, 0x0E,
+ 0x00, 0x06, 0x3C, 0x00, 0x0A, 0x0B, 0x03, 0x04,
+ 0x07, 0x07, 0x00, 0x0B, 0x0B, 0x02, 0x00, 0x18,
+ 0x20, 0x0A, 0x0C, 0x03, 0x04, 0x07, 0x07, 0x00,
+ 0x0B, 0x0C, 0x06, 0x00, 0x18, 0x21, 0x0A, 0x0D,
+ 0x03, 0x04, 0x07, 0x07, 0x00, 0x0B, 0x0D, 0x0C,
+ 0x00, 0x18, 0x22, 0x0A, 0x0E, 0x03, 0x04, 0x07,
+ 0x07, 0x00, 0x0B, 0x0E, 0x0B, 0x00, 0x11, 0x10,
+ 0x0E, 0x50, 0x00, 0x3A, 0x05, 0x0A, 0x0F, 0x03,
+ 0x04, 0x07, 0x07, 0x00, 0x0B, 0x0F, 0x09, 0x00,
+ 0x06, 0x3C, 0x00, 0x03, 0x04, 0x07, 0x07, 0x00,
+ 0x11, 0x10, 0x0F, 0x50, 0x00, 0x3A, 0x05, 0x0A,
+ 0x10, 0x03, 0x04, 0x07, 0x07, 0x00, 0x0B, 0x10,
+ 0x09, 0x00, 0x06, 0x3C, 0x00, 0x03, 0x04, 0x07,
+ 0x07, 0x00, 0x11, 0x10, 0x10, 0x50, 0x00, 0x3A,
+ 0x05, 0x0A, 0x11, 0x03, 0x04, 0x07, 0x07, 0x00,
+ 0x0B, 0x11, 0x0F, 0x00, 0x06, 0x3C, 0x00, 0x03,
+ 0x04, 0x07, 0x07, 0x00, 0x11, 0x10, 0x11, 0x50,
+ 0x00, 0x3A, 0x05, 0x0A, 0x12, 0x03, 0x04, 0x07,
+ 0x07, 0x00, 0x0B, 0x12, 0x14, 0x00, 0x06, 0x3C,
+ 0x00, 0x0A, 0x13, 0x03, 0x04, 0x07, 0x07, 0x00,
+ 0x0B, 0x13, 0x06, 0x00, 0x18, 0x23, 0x0A, 0x13,
+ 0x03, 0x04, 0x07, 0x07, 0x00, 0x0B, 0x13, 0x07,
+ 0x00, 0x11, 0x06, 0x3C, 0x00, 0x13, 0x19, 0x01,
+ 0x01, 0x04, 0x1D
+};
+
+static const ByteProvider k1KallakMalcolmSeqAmigaProvider = { ARRAYSIZE(k1KallakMalcolmSeqAmiga), k1KallakMalcolmSeqAmiga };
+
+static const byte k1ForestSeqAmiga[734] = {
+ 0x00, 0x05, 0x01, 0x00, 0x07, 0x01, 0x1A, 0x02,
+ 0x07, 0x00, 0x00, 0x00, 0x08, 0x02, 0x05, 0x00,
+ 0x98, 0x00, 0x38, 0x0A, 0x00, 0x03, 0x07, 0x16,
+ 0x02, 0x06, 0x09, 0x00, 0x0B, 0x00, 0x41, 0x00,
+ 0x18, 0x16, 0x03, 0x07, 0x02, 0x05, 0x01, 0x98,
+ 0x00, 0x38, 0x16, 0x02, 0x16, 0x03, 0x06, 0x09,
+ 0x00, 0x03, 0x07, 0x02, 0x05, 0x03, 0x98, 0x00,
+ 0x38, 0x16, 0x02, 0x16, 0x03, 0x06, 0x09, 0x00,
+ 0x03, 0x07, 0x02, 0x05, 0x01, 0x98, 0x00, 0x38,
+ 0x16, 0x02, 0x16, 0x03, 0x06, 0x09, 0x00, 0x03,
+ 0x07, 0x02, 0x05, 0x00, 0x98, 0x00, 0x38, 0x16,
+ 0x02, 0x16, 0x03, 0x06, 0x09, 0x00, 0x0A, 0x05,
+ 0x03, 0x07, 0x16, 0x02, 0x06, 0x09, 0x00, 0x0B,
+ 0x05, 0x0E, 0x00, 0x18, 0x16, 0x03, 0x07, 0x02,
+ 0x05, 0x01, 0x98, 0x00, 0x38, 0x16, 0x02, 0x16,
+ 0x03, 0x06, 0x09, 0x00, 0x03, 0x07, 0x02, 0x05,
+ 0x03, 0x98, 0x00, 0x38, 0x16, 0x02, 0x16, 0x03,
+ 0x06, 0x09, 0x00, 0x03, 0x07, 0x02, 0x05, 0x01,
+ 0x98, 0x00, 0x38, 0x16, 0x02, 0x16, 0x03, 0x06,
+ 0x09, 0x00, 0x03, 0x07, 0x02, 0x05, 0x04, 0x98,
+ 0x00, 0x38, 0x16, 0x02, 0x16, 0x03, 0x06, 0x09,
+ 0x00, 0x03, 0x07, 0x16, 0x02, 0x06, 0x09, 0x00,
+ 0x03, 0x07, 0x16, 0x02, 0x06, 0x09, 0x00, 0x03,
+ 0x07, 0x02, 0x05, 0x05, 0x98, 0x00, 0x38, 0x16,
+ 0x02, 0x16, 0x03, 0x06, 0x09, 0x00, 0x03, 0x07,
+ 0x16, 0x02, 0x06, 0x09, 0x00, 0x03, 0x07, 0x16,
+ 0x02, 0x06, 0x09, 0x00, 0x03, 0x07, 0x02, 0x05,
+ 0x06, 0x98, 0x00, 0x38, 0x16, 0x02, 0x16, 0x03,
+ 0x06, 0x09, 0x00, 0x03, 0x07, 0x16, 0x02, 0x06,
+ 0x09, 0x00, 0x03, 0x07, 0x16, 0x02, 0x06, 0x09,
+ 0x00, 0x18, 0x25, 0x0A, 0x00, 0x03, 0x07, 0x03,
+ 0x05, 0x16, 0x02, 0x16, 0x03, 0x06, 0x09, 0x00,
+ 0x0B, 0x00, 0x09, 0x00, 0x0A, 0x06, 0x03, 0x07,
+ 0x16, 0x02, 0x06, 0x09, 0x00, 0x0B, 0x06, 0x0E,
+ 0x00, 0x18, 0x17, 0x0A, 0x01, 0x0C, 0x04, 0x03,
+ 0x07, 0x03, 0x05, 0x16, 0x02, 0x16, 0x03, 0x06,
+ 0x09, 0x00, 0x0B, 0x01, 0x0D, 0x00, 0x18, 0x25,
+ 0x0A, 0x07, 0x03, 0x07, 0x16, 0x02, 0x06, 0x09,
+ 0x00, 0x0B, 0x07, 0x0E, 0x00, 0x18, 0x18, 0x03,
+ 0x07, 0x03, 0x05, 0x16, 0x02, 0x16, 0x03, 0x06,
+ 0x09, 0x00, 0x03, 0x07, 0x03, 0x05, 0x16, 0x02,
+ 0x16, 0x03, 0x06, 0x09, 0x00, 0x03, 0x07, 0x03,
+ 0x05, 0x16, 0x02, 0x16, 0x03, 0x06, 0x09, 0x00,
+ 0x03, 0x07, 0x03, 0x05, 0x16, 0x02, 0x16, 0x03,
+ 0x06, 0x09, 0x00, 0x03, 0x07, 0x03, 0x05, 0x16,
+ 0x02, 0x16, 0x03, 0x06, 0x09, 0x00, 0x06, 0x12,
+ 0x00, 0x18, 0x25, 0x0A, 0x02, 0x03, 0x07, 0x03,
+ 0x05, 0x16, 0x02, 0x16, 0x03, 0x06, 0x09, 0x00,
+ 0x0B, 0x02, 0x07, 0x00, 0x0A, 0x03, 0x03, 0x07,
+ 0x16, 0x02, 0x06, 0x09, 0x00, 0x0B, 0x03, 0x0F,
+ 0x00, 0x13, 0x01, 0x07, 0x01, 0x05, 0x1D, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x03, 0xEC, 0x00, 0x00,
+ 0x00, 0x4A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x32, 0x00, 0x00, 0x00, 0x2E, 0x00, 0x00,
+ 0x00, 0x2A, 0x00, 0x00, 0x00, 0x26, 0x00, 0x00,
+ 0x00, 0x22, 0x00, 0x00, 0x00, 0x1E, 0x00, 0x00,
+ 0x01, 0x46, 0x00, 0x00, 0x01, 0x42, 0x00, 0x00,
+ 0x01, 0x3E, 0x00, 0x00, 0x01, 0x3A, 0x00, 0x00,
+ 0x01, 0x36, 0x00, 0x00, 0x01, 0x32, 0x00, 0x00,
+ 0x01, 0x2E, 0x00, 0x00, 0x01, 0x2A, 0x00, 0x00,
+ 0x01, 0x26, 0x00, 0x00, 0x01, 0x22, 0x00, 0x00,
+ 0x01, 0x1E, 0x00, 0x00, 0x01, 0x1A, 0x00, 0x00,
+ 0x01, 0x16, 0x00, 0x00, 0x01, 0x12, 0x00, 0x00,
+ 0x01, 0x0E, 0x00, 0x00, 0x01, 0x0A, 0x00, 0x00,
+ 0x01, 0x06, 0x00, 0x00, 0x01, 0x02, 0x00, 0x00,
+ 0x00, 0xFE, 0x00, 0x00, 0x00, 0xFA, 0x00, 0x00,
+ 0x00, 0xF6, 0x00, 0x00, 0x00, 0xF2, 0x00, 0x00,
+ 0x00, 0xEE, 0x00, 0x00, 0x00, 0xEA, 0x00, 0x00,
+ 0x00, 0xE6, 0x00, 0x00, 0x00, 0xE2, 0x00, 0x00,
+ 0x00, 0xDE, 0x00, 0x00, 0x00, 0xDA, 0x00, 0x00,
+ 0x00, 0xD6, 0x00, 0x00, 0x00, 0xD2, 0x00, 0x00,
+ 0x00, 0xCE, 0x00, 0x00, 0x00, 0xCA, 0x00, 0x00,
+ 0x00, 0xC6, 0x00, 0x00, 0x00, 0xC2, 0x00, 0x00,
+ 0x00, 0xBE, 0x00, 0x00, 0x00, 0xBA, 0x00, 0x00,
+ 0x00, 0xB6, 0x00, 0x00, 0x00, 0xB2, 0x00, 0x00,
+ 0x00, 0xAE, 0x00, 0x00, 0x00, 0xAA, 0x00, 0x00,
+ 0x00, 0xA6, 0x00, 0x00, 0x00, 0xA2, 0x00, 0x00,
+ 0x00, 0x9E, 0x00, 0x00, 0x00, 0x9A, 0x00, 0x00,
+ 0x00, 0x96, 0x00, 0x00, 0x00, 0x92, 0x00, 0x00,
+ 0x00, 0x8E, 0x00, 0x00, 0x00, 0x8A, 0x00, 0x00,
+ 0x00, 0x86, 0x00, 0x00, 0x00, 0x82, 0x00, 0x00,
+ 0x00, 0x7E, 0x00, 0x00, 0x00, 0x76, 0x00, 0x00,
+ 0x00, 0x72, 0x00, 0x00, 0x00, 0x6E, 0x00, 0x00,
+ 0x00, 0x6A, 0x00, 0x00, 0x00, 0x66, 0x00, 0x00,
+ 0x00, 0x62, 0x00, 0x00, 0x00, 0x5E, 0x00, 0x00,
+ 0x00, 0x5A, 0x00, 0x00, 0x00, 0x56, 0x00, 0x00,
+ 0x00, 0x52, 0x00, 0x00, 0x00, 0x4E, 0x00, 0x00,
+ 0x00, 0x4A, 0x00, 0x00, 0x00, 0x46, 0x00, 0x00,
+ 0x00, 0x42, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x00,
+ 0x00, 0x3A, 0x00, 0x00, 0x00, 0x36, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x03, 0xF2, 0x00, 0x00,
+ 0x03, 0xEA, 0x00, 0x00, 0x00, 0x08
+};
+
+static const ByteProvider k1ForestSeqAmigaProvider = { ARRAYSIZE(k1ForestSeqAmiga), k1ForestSeqAmiga };
+
+static const char *const k1IntroCPSStringsAmiga[2] = {
+ "malkal.cps",
+ "tree.cps"
+};
+
+static const StringListProvider k1IntroCPSStringsAmigaProvider = { ARRAYSIZE(k1IntroCPSStringsAmiga), k1IntroCPSStringsAmiga };
+
+static const char *const k1IntroWSAStringsAmiga[11] = {
+ "kallak.wsa",
+ "tree1.wsa",
+ "tree2.wsa",
+ "westwood.wsa",
+ "mal-kal.wsa",
+ "destruct.wsa",
+ "kyrandia.wsa",
+ "shore.wsa",
+ "reunion.wsa",
+ "reuniont.wsa",
+ "latern.wsa"
+};
+
+static const StringListProvider k1IntroWSAStringsAmigaProvider = { ARRAYSIZE(k1IntroWSAStringsAmiga), k1IntroWSAStringsAmiga };
+
+static const char *const k1IntroCOLStringsAmiga[4] = {
+ "kallak.col",
+ "tree_exp.col",
+ "ww.col",
+ "mal-kal.col"
+};
+
+static const StringListProvider k1IntroCOLStringsAmigaProvider = { ARRAYSIZE(k1IntroCOLStringsAmiga), k1IntroCOLStringsAmiga };
+
+static const Room k1RoomListAmiga[246] = {
+ { 30, 0xFFFF, 0xFFFF, 0x0001, 0xFFFF },
+ { 71, 0xFFFF, 0xFFFF, 0x0005, 0xFFFF },
+ { 44, 0xFFFF, 0x0003, 0xFFFF, 0xFFFF },
+ { 72, 0xFFFF, 0xFFFF, 0x000E, 0xFFFF },
+ { 48, 0xFFFF, 0x0005, 0xFFFF, 0x000E },
+ { 74, 0xFFFF, 0x000A, 0xFFFF, 0x0004 },
+ { 46, 0xFFFF, 0x000F, 0xFFFF, 0x000B },
+ { 75, 0xFFFF, 0x0009, 0xFFFF, 0x0018 },
+ { 13, 0xFFFF, 0x000C, 0xFFFF, 0x000A },
+ { 5, 0x000D, 0xFFFF, 0xFFFF, 0x0007 },
+ { 84, 0xFFFF, 0x0008, 0xFFFF, 0x0005 },
+ { 37, 0xFFFF, 0x0006, 0x000C, 0x0010 },
+ { 51, 0x000B, 0xFFFF, 0x000D, 0x0008 },
+ { 23, 0x000C, 0xFFFF, 0x0009, 0xFFFF },
+ { 25, 0x0003, 0x0004, 0xFFFF, 0xFFFF },
+ { 11, 0xFFFF, 0xFFFF, 0xFFFF, 0x0006 },
+ { 86, 0xFFFF, 0x000B, 0xFFFF, 0xFFFF },
+ { 84, 0xFFFF, 0x0022, 0x0017, 0x0016 },
+ { 51, 0x0020, 0x0014, 0x0024, 0x0015 },
+ { 85, 0x0014, 0x0019, 0xFFFF, 0x0024 },
+ { 33, 0x001C, 0xFFFF, 0x0013, 0x0012 },
+ { 31, 0x0022, 0x0012, 0xFFFF, 0x0017 },
+ { 25, 0x001F, 0x0011, 0xFFFF, 0xFFFF },
+ { 25, 0x0011, 0x0015, 0xFFFF, 0xFFFF },
+ { 2, 0xFFFF, 0x0007, 0xFFFF, 0x001A },
+ { 82, 0xFFFF, 0x006D, 0xFFFF, 0x0013 },
+ { 77, 0xFFFF, 0x0018, 0x0021, 0xFFFF },
+ { 15, 0xFFFF, 0x001A, 0xFFFF, 0xFFFF },
+ { 16, 0xFFFF, 0xFFFF, 0x0014, 0x0020 },
+ { 19, 0xFFFF, 0x0021, 0xFFFF, 0x001F },
+ { 12, 0xFFFF, 0xFFFF, 0x0020, 0x0021 },
+ { 7, 0x0023, 0x001D, 0x0016, 0xFFFF },
+ { 20, 0x001E, 0x001C, 0x0012, 0x0022 },
+ { 17, 0x001A, 0x001E, 0x0022, 0x001D },
+ { 22, 0x0021, 0x0020, 0x0015, 0x0011 },
+ { 24, 0xFFFF, 0xFFFF, 0x001F, 0xFFFF },
+ { 32, 0x0012, 0x0013, 0xFFFF, 0xFFFF },
+ { 87, 0xFFFF, 0x0026, 0xFFFF, 0xFFFF },
+ { 8, 0xFFFF, 0x0027, 0xFFFF, 0x0025 },
+ { 88, 0xFFFF, 0x0035, 0x0037, 0x0026 },
+ { 35, 0xFFFF, 0x0036, 0x0038, 0xFFFF },
+ { 47, 0xFFFF, 0xFFFF, 0x003B, 0xFFFF },
+ { 28, 0x0035, 0x002B, 0x002F, 0x0037 },
+ { 36, 0xFFFF, 0x002C, 0xFFFF, 0x002A },
+ { 78, 0xFFFF, 0xFFFF, 0xFFFF, 0x002B },
+ { 10, 0xFFFF, 0xFFFF, 0xFFFF, 0x002C },
+ { 51, 0x0037, 0x002F, 0x0040, 0x003C },
+ { 38, 0x002A, 0x003D, 0x0041, 0x002E },
+ { 81, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF },
+ { 41, 0xFFFF, 0xFFFF, 0x0069, 0xFFFF },
+ { 50, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF },
+ { 18, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF },
+ { 49, 0xFFFF, 0xFFFF, 0x0054, 0xFFFF },
+ { 105, 0xFFFF, 0xFFFF, 0x002A, 0x0027 },
+ { 105, 0xFFFF, 0xFFFF, 0x0039, 0x0028 },
+ { 37, 0x0027, 0x002A, 0x002E, 0x0049 },
+ { 34, 0x0028, 0x0039, 0xFFFF, 0xFFFF },
+ { 51, 0x0036, 0x003A, 0xFFFF, 0x0038 },
+ { 84, 0xFFFF, 0x003B, 0xFFFF, 0x0039 },
+ { 1, 0x0029, 0xFFFF, 0x003E, 0x003A },
+ { 37, 0x0049, 0x002E, 0x003F, 0xFFFF },
+ { 33, 0xFFFF, 0xFFFF, 0xFFFF, 0x002F },
+ { 34, 0x003B, 0x003F, 0xFFFF, 0xFFFF },
+ { 85, 0x003C, 0x0040, 0xFFFF, 0x003E },
+ { 106, 0x002E, 0x0041, 0xFFFF, 0x003F },
+ { 33, 0x002F, 0xFFFF, 0xFFFF, 0x0040 },
+ { 60, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF },
+ { 3, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF },
+ { 11, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF },
+ { 33, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF },
+ { 26, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF },
+ { 0, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF },
+ { 25, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF },
+ { 23, 0xFFFF, 0x0037, 0x003C, 0xFFFF },
+ { 6, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF },
+ { 51, 0x0063, 0x0067, 0x006B, 0x0066 },
+ { 66, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF },
+ { 67, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF },
+ { 62, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF },
+ { 65, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF },
+ { 18, 0x0056, 0x005A, 0x005E, 0xFFFF },
+ { 6, 0xFFFF, 0x0052, 0x0056, 0xFFFF },
+ { 4, 0xFFFF, 0x0053, 0x0057, 0x0051 },
+ { 3, 0xFFFF, 0x0054, 0xFFFF, 0x0052 },
+ { 37, 0x0034, 0x0055, 0x0058, 0x0053 },
+ { 11, 0xFFFF, 0xFFFF, 0x0059, 0x0054 },
+ { 37, 0x0051, 0x0057, 0x0050, 0xFFFF },
+ { 51, 0x0052, 0xFFFF, 0x005A, 0x0056 },
+ { 51, 0x0054, 0x0059, 0x005C, 0xFFFF },
+ { 1, 0x0055, 0xFFFF, 0x005D, 0x0058 },
+ { 106, 0x0057, 0x005B, 0xFFFF, 0x0050 },
+ { 85, 0xFFFF, 0x005C, 0xFFFF, 0x005A },
+ { 37, 0x0058, 0x005D, 0x005F, 0x005B },
+ { 33, 0x0059, 0xFFFF, 0xFFFF, 0x005C },
+ { 51, 0x0050, 0xFFFF, 0x0061, 0xFFFF },
+ { 51, 0x005C, 0xFFFF, 0x0064, 0xFFFF },
+ { 37, 0xFFFF, 0x0061, 0x0065, 0xFFFF },
+ { 51, 0x005E, 0x0062, 0xFFFF, 0x0060 },
+ { 84, 0xFFFF, 0x0063, 0x0066, 0x0061 },
+ { 84, 0xFFFF, 0x0064, 0x004B, 0x0062 },
+ { 33, 0x005F, 0xFFFF, 0x0067, 0x0063 },
+ { 51, 0x0060, 0xFFFF, 0x0068, 0xFFFF },
+ { 37, 0x0062, 0x004B, 0x006A, 0xFFFF },
+ { 1, 0x0064, 0xFFFF, 0x006C, 0x004B },
+ { 34, 0x0065, 0x0069, 0xFFFF, 0xFFFF },
+ { 51, 0x0031, 0x006A, 0xFFFF, 0x0068 },
+ { 85, 0x0066, 0x006B, 0xFFFF, 0x0069 },
+ { 106, 0x004B, 0x006C, 0xFFFF, 0x006A },
+ { 33, 0x0067, 0xFFFF, 0xFFFF, 0x006B },
+ { 55, 0x00C4, 0x00C5, 0xFFFF, 0x0019 },
+ { 52, 0xFFFF, 0x00C1, 0xFFFF, 0x0096 },
+ { 64, 0xFFFF, 0x00BF, 0xFFFF, 0x008C },
+ { 57, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF },
+ { 54, 0x00AF, 0xFFFF, 0x00B7, 0x00AC },
+ { 53, 0x0078, 0xFFFF, 0x0079, 0xFFFF },
+ { 29, 0xFFFF, 0x00BB, 0xFFFF, 0x00C5 },
+ { 69, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF },
+ { 76, 0x00C6, 0xFFFF, 0xFFFF, 0x00B1 },
+ { 59, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF },
+ { 58, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF },
+ { 59, 0xFFFF, 0x0025, 0x0072, 0xFFFF },
+ { 58, 0x0072, 0x007B, 0x00BB, 0xFFFF },
+ { 58, 0xFFFF, 0x007F, 0x007B, 0xFFFF },
+ { 59, 0x007A, 0xFFFF, 0x007C, 0x0079 },
+ { 58, 0x007B, 0x0081, 0x00BC, 0xFFFF },
+ { 58, 0x00BC, 0x0083, 0xFFFF, 0xFFFF },
+ { 58, 0xFFFF, 0x0085, 0x007F, 0xFFFF },
+ { 59, 0x007E, 0x0086, 0x0080, 0x007A },
+ { 58, 0x007F, 0x00BD, 0x0081, 0xFFFF },
+ { 59, 0x0080, 0x0087, 0x0082, 0x007C },
+ { 58, 0x0081, 0xFFFF, 0x0083, 0x00BC },
+ { 59, 0x0082, 0x0089, 0x0084, 0x007D },
+ { 58, 0x0083, 0x008A, 0xFFFF, 0xFFFF },
+ { 59, 0xFFFF, 0x008B, 0x0086, 0x007E },
+ { 58, 0x0085, 0x008C, 0x00BD, 0x007F },
+ { 58, 0x00BD, 0x008E, 0x0088, 0x0081 },
+ { 59, 0x0087, 0xFFFF, 0x0089, 0xFFFF },
+ { 58, 0x0088, 0x0090, 0x008A, 0x0083 },
+ { 59, 0x0089, 0x0091, 0xFFFF, 0x0084 },
+ { 58, 0xFFFF, 0x0092, 0x008C, 0x0085 },
+ { 59, 0x008B, 0x006F, 0x008D, 0x0086 },
+ { 58, 0x008C, 0x0093, 0x008E, 0x00BD },
+ { 59, 0x008D, 0xFFFF, 0xFFFF, 0x0087 },
+ { 58, 0xFFFF, 0x00BE, 0x0090, 0xFFFF },
+ { 59, 0x008F, 0x0095, 0x0091, 0x0089 },
+ { 58, 0x0090, 0x0096, 0xFFFF, 0x008A },
+ { 59, 0xFFFF, 0x0098, 0xFFFF, 0x008B },
+ { 59, 0xFFFF, 0xFFFF, 0xFFFF, 0x008D },
+ { 58, 0xFFFF, 0x009A, 0x00BE, 0xFFFF },
+ { 58, 0x00BE, 0xFFFF, 0x0096, 0x0090 },
+ { 59, 0x0095, 0x006E, 0x0097, 0x0091 },
+ { 58, 0x0096, 0x009D, 0xFFFF, 0xFFFF },
+ { 58, 0xFFFF, 0x009E, 0x00BF, 0x0092 },
+ { 58, 0x00BF, 0x00A0, 0x009A, 0xFFFF },
+ { 59, 0x0099, 0xFFFF, 0x009B, 0x0094 },
+ { 58, 0x009A, 0xFFFF, 0x009C, 0xFFFF },
+ { 59, 0x009B, 0x00A2, 0xFFFF, 0xFFFF },
+ { 59, 0xFFFF, 0x00A3, 0xFFFF, 0x0097 },
+ { 59, 0xFFFF, 0xFFFF, 0x009F, 0x0098 },
+ { 58, 0x009E, 0x00A4, 0x00A0, 0x00BF },
+ { 59, 0x009F, 0x00A5, 0xFFFF, 0x0099 },
+ { 58, 0xFFFF, 0x00A6, 0x00C0, 0xFFFF },
+ { 58, 0x00C0, 0x00A8, 0xFFFF, 0x009C },
+ { 58, 0x00C1, 0xFFFF, 0xFFFF, 0x009D },
+ { 59, 0xFFFF, 0x00AA, 0x00A5, 0x009F },
+ { 58, 0x00A4, 0x00AB, 0x00A6, 0x00A0 },
+ { 59, 0x00A5, 0x00AC, 0x00A7, 0x00A1 },
+ { 58, 0x00A6, 0xFFFF, 0xFFFF, 0x00C0 },
+ { 59, 0xFFFF, 0x00AD, 0x00A9, 0x00A2 },
+ { 58, 0x00A8, 0x00AE, 0xFFFF, 0x00C1 },
+ { 58, 0xFFFF, 0xFFFF, 0x00AB, 0x00A4 },
+ { 59, 0x00AA, 0x00AF, 0x00AC, 0x00A5 },
+ { 58, 0x00AB, 0x0071, 0x00C2, 0x00A6 },
+ { 58, 0xFFFF, 0x00B0, 0x00AE, 0x00A8 },
+ { 59, 0x00AD, 0xFFFF, 0xFFFF, 0x00A9 },
+ { 58, 0xFFFF, 0x00C3, 0x0071, 0x00AB },
+ { 59, 0xFFFF, 0xFFFF, 0x00B1, 0x00AD },
+ { 58, 0x00B0, 0x0075, 0xFFFF, 0xFFFF },
+ { 59, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF },
+ { 59, 0x00C3, 0xFFFF, 0x00B4, 0xFFFF },
+ { 59, 0x00B3, 0x00BA, 0xFFFF, 0xFFFF },
+ { 58, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF },
+ { 59, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF },
+ { 58, 0x0071, 0xFFFF, 0xFFFF, 0x00C2 },
+ { 58, 0xFFFF, 0xFFFF, 0x00B9, 0xFFFF },
+ { 59, 0x00B8, 0xFFFF, 0xFFFF, 0x00C3 },
+ { 58, 0xFFFF, 0xFFFF, 0xFFFF, 0x00B4 },
+ { 59, 0x0079, 0xFFFF, 0xFFFF, 0x0073 },
+ { 59, 0x007C, 0x0082, 0x007D, 0xFFFF },
+ { 59, 0x0086, 0x008D, 0x0087, 0x0080 },
+ { 59, 0x0094, 0xFFFF, 0x0095, 0x008F },
+ { 59, 0x0098, 0x009F, 0x0099, 0x006F },
+ { 59, 0x00A1, 0x00A7, 0x00A2, 0xFFFF },
+ { 59, 0xFFFF, 0x00A9, 0x00A3, 0x006E },
+ { 59, 0x00AC, 0x00B7, 0xFFFF, 0xFFFF },
+ { 58, 0xFFFF, 0x00B9, 0x00B3, 0x00AF },
+ { 59, 0xFFFF, 0xFFFF, 0x006D, 0xFFFF },
+ { 58, 0xFFFF, 0x0073, 0xFFFF, 0x006D },
+ { 59, 0xFFFF, 0xFFFF, 0x0075, 0xFFFF },
+ { 94, 0xFFFF, 0x00C8, 0xFFFF, 0xFFFF },
+ { 43, 0x00C9, 0x00CB, 0x00CA, 0x00C7 },
+ { 51, 0xFFFF, 0xFFFF, 0x00C8, 0xFFFF },
+ { 37, 0x00C8, 0xFFFF, 0xFFFF, 0xFFFF },
+ { 79, 0xFFFF, 0xFFFF, 0xFFFF, 0x00C8 },
+ { 80, 0xFFFF, 0xFFFF, 0x00CB, 0x00CD },
+ { 97, 0x00E3, 0x00D4, 0x00CC, 0x00D3 },
+ { 103, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF },
+ { 100, 0xFFFF, 0x00CE, 0x00D5, 0xFFFF },
+ { 98, 0xFFFF, 0xFFFF, 0xFFFF, 0x00D7 },
+ { 101, 0xFFFF, 0x00D2, 0x00CE, 0xFFFF },
+ { 99, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF },
+ { 93, 0x00D5, 0x00CD, 0xFFFF, 0xFFFF },
+ { 93, 0x00D6, 0xFFFF, 0xFFFF, 0x00CD },
+ { 93, 0x00CF, 0x00CE, 0x00D3, 0xFFFF },
+ { 93, 0x00D7, 0xFFFF, 0x00D4, 0x00CE },
+ { 93, 0xFFFF, 0x00D0, 0x00D6, 0x00CE },
+ { 93, 0x00DA, 0x00E3, 0xFFFF, 0xFFFF },
+ { 93, 0x00DB, 0xFFFF, 0xFFFF, 0x00E3 },
+ { 93, 0xFFFF, 0x00E4, 0x00D8, 0x00E2 },
+ { 93, 0xFFFF, 0x00E1, 0x00D9, 0x00E4 },
+ { 93, 0xFFFF, 0x00E4, 0xFFFF, 0x00DF },
+ { 93, 0xFFFF, 0x00E0, 0xFFFF, 0x00E4 },
+ { 93, 0xFFFF, 0xFFFF, 0x00E4, 0xFFFF },
+ { 91, 0xFFFF, 0x00DC, 0xFFFF, 0xFFFF },
+ { 90, 0xFFFF, 0xFFFF, 0xFFFF, 0x00DD },
+ { 92, 0xFFFF, 0xFFFF, 0xFFFF, 0x00DB },
+ { 95, 0xFFFF, 0x00DA, 0xFFFF, 0xFFFF },
+ { 96, 0xFFFF, 0x00D9, 0x00CD, 0x00D8 },
+ { 89, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF },
+ { 102, 0xFFFF, 0x00E6, 0xFFFF, 0xFFFF },
+ { 102, 0xFFFF, 0x00EA, 0x00E8, 0x00E5 },
+ { 102, 0xFFFF, 0x00E8, 0x00EB, 0xFFFF },
+ { 102, 0x00E6, 0xFFFF, 0xFFFF, 0x00E7 },
+ { 102, 0xFFFF, 0xFFFF, 0x00ED, 0xFFFF },
+ { 102, 0xFFFF, 0xFFFF, 0xFFFF, 0x00E6 },
+ { 102, 0x00E7, 0x00EC, 0x00EF, 0xFFFF },
+ { 102, 0xFFFF, 0x00ED, 0x00F0, 0x00EB },
+ { 102, 0x00E9, 0x00EE, 0x00F1, 0x00EC },
+ { 102, 0xFFFF, 0xFFFF, 0x00F2, 0x00ED },
+ { 102, 0x00EB, 0x00F0, 0xFFFF, 0xFFFF },
+ { 102, 0x00EC, 0x00F1, 0x00F3, 0x00EF },
+ { 102, 0x00ED, 0xFFFF, 0x00F4, 0x00F0 },
+ { 102, 0x00EE, 0xFFFF, 0xFFFF, 0xFFFF },
+ { 102, 0x00F0, 0x00F4, 0xFFFF, 0xFFFF },
+ { 102, 0x00F1, 0x00F5, 0xFFFF, 0x00F3 },
+ { 102, 0xFFFF, 0xFFFF, 0x00CF, 0x00F4 }
+};
+
+static const RoomProvider k1RoomListAmigaProvider = { ARRAYSIZE(k1RoomListAmiga), k1RoomListAmiga };
+
+static const char *const k1RoomFilenamesAmiga[107] = {
+ "CLIFFB",
+ "XEDGEB",
+ "CAVEB",
+ "NCLIFF",
+ "NCLIFFB",
+ "CAVE",
+ "NWCLIFF",
+ "OAKS",
+ "PLATEAU",
+ "POTHUT",
+ "POTION",
+ "NWCLIFB",
+ "SONG",
+ "SORROW",
+ "SPELHUT",
+ "SPELL",
+ "SPRING",
+ "SQUARE",
+ "STUMP",
+ "TEMPLE",
+ "WELL",
+ "WILLOW",
+ "WISE",
+ "XEDGE",
+ "RUBY",
+ "ZROCK",
+ "ZROCKB",
+ "FORESTD",
+ "FOUNTN",
+ "GATECV",
+ "GEMCUT",
+ "CLIFF",
+ "DEAD",
+ "EDGE",
+ "EDGEB",
+ "FALLS",
+ "FORESTC",
+ "FORESTB",
+ "GLADE",
+ "GEMHUT",
+ "ALGAE",
+ "MIX",
+ "BRIDGE",
+ "GRAVE",
+ "HEALER",
+ "HEALHUT",
+ "ALTAR",
+ "BURN",
+ "SICKWIL",
+ "LAGOON",
+ "MAPLE",
+ "FORESTA",
+ "ARCH",
+ "CHASM",
+ "EMCAV",
+ "ENTER",
+ "FLOWERS",
+ "GEMSLOT",
+ "GEN_CAV",
+ "GENCAVB",
+ "GOLDEN",
+ "GOLDENB",
+ "ICE",
+ "MARKET",
+ "MOONCAV",
+ "MSHCAV",
+ "POOL",
+ "SEASONS",
+ "SHRINE",
+ "TREECAV",
+ "EXTGEM",
+ "GEM",
+ "EXTHEAL",
+ "BASE",
+ "TRUNK",
+ "BROKEN",
+ "LAVA",
+ "EXTSPEL",
+ "EXTPOT",
+ "CASTLE",
+ "CGATE",
+ "LEPHOLE",
+ "DRAGON",
+ "XEDGEC",
+ "FNORTH",
+ "FSOUTH",
+ "FGOWEST",
+ "PLTCAVE",
+ "BONKBG",
+ "BALCONY",
+ "DARMS",
+ "BRINS",
+ "ALCHEMY",
+ "GENHALL",
+ "LANDING",
+ "BELROOM",
+ "UPSTAIR",
+ "DNSTAIR",
+ "KITCHEN",
+ "KYRAGEM",
+ "LIBRARY",
+ "FOYER",
+ "CATACOM",
+ "GRTHALL",
+ "FESTSTH",
+ "FWSTSTH",
+ "FSOUTHB"
+};
+
+static const StringListProvider k1RoomFilenamesAmigaProvider = { ARRAYSIZE(k1RoomFilenamesAmiga), k1RoomFilenamesAmiga };
+
+static const char *const k1CharacterImageFilenamesAmiga[20] = {
+ "BRANDON.CPS",
+ "DAPHNE.CPS",
+ "MERITH.CPS",
+ "HERMAN.CPS",
+ "SMALL.CPS",
+ "MALCOM.CPS",
+ "DRINK.CPS",
+ "SHRINK.CPS",
+ "HEALBR1.CPS",
+ "HEALBR2.CPS",
+ "SNOW1A.CPS",
+ "SNOW2A.CPS",
+ "BRANWILL.CPS",
+ "FLUTE1.CPS",
+ "FLUTE2.CPS",
+ "POISON1.CPS",
+ "POISON2.CPS",
+ "TELEKIN.CPS",
+ "BRANSTON.CPS",
+ "POISON.CPS"
+};
+
+static const StringListProvider k1CharacterImageFilenamesAmigaProvider = { ARRAYSIZE(k1CharacterImageFilenamesAmiga), k1CharacterImageFilenamesAmiga };
+
+static const Shape k1DefaultShapesAmiga[166] = {
+ { 0, 0, 0, 3, 48, -12, -48 },
+ { 0, 3, 0, 3, 48, -12, -48 },
+ { 0, 6, 0, 3, 48, -12, -48 },
+ { 0, 9, 0, 3, 48, -12, -48 },
+ { 0, 12, 0, 3, 48, -12, -48 },
+ { 0, 15, 0, 3, 48, -12, -48 },
+ { 0, 18, 0, 3, 48, -12, -48 },
+ { 0, 21, 0, 3, 48, -12, -48 },
+ { 0, 24, 0, 3, 48, -12, -48 },
+ { 0, 27, 0, 3, 48, -12, -48 },
+ { 0, 0, 51, 2, 11, -2, -8 },
+ { 0, 2, 51, 2, 11, -2, -8 },
+ { 0, 4, 51, 2, 11, -2, -8 },
+ { 0, 6, 51, 2, 11, -2, -8 },
+ { 0, 8, 51, 2, 11, -2, -8 },
+ { 0, 10, 51, 2, 11, -2, -8 },
+ { 0, 12, 51, 2, 11, -2, -8 },
+ { 0, 14, 51, 2, 11, -2, -8 },
+ { 0, 16, 51, 2, 11, -2, -8 },
+ { 0, 18, 51, 2, 11, -2, -8 },
+ { 0, 20, 51, 2, 11, -2, -8 },
+ { 0, 22, 51, 2, 11, -2, -8 },
+ { 0, 0, 80, 3, 48, -12, -48 },
+ { 0, 3, 80, 3, 48, -12, -48 },
+ { 0, 6, 80, 3, 48, -12, -48 },
+ { 0, 9, 80, 3, 48, -12, -48 },
+ { 0, 12, 80, 3, 48, -12, -48 },
+ { 0, 15, 80, 3, 48, -12, -48 },
+ { 0, 0, 129, 3, 48, -12, -48 },
+ { 0, 3, 129, 3, 48, -12, -48 },
+ { 0, 6, 129, 3, 48, -12, -48 },
+ { 0, 9, 129, 3, 48, -12, -48 },
+ { 0, 12, 129, 3, 48, -12, -48 },
+ { 0, 15, 129, 3, 48, -12, -48 },
+ { 2, 0, 0, 3, 48, -12, -48 },
+ { 2, 3, 0, 3, 48, -12, -48 },
+ { 2, 6, 0, 3, 48, -12, -48 },
+ { 2, 9, 0, 3, 48, -12, -48 },
+ { 2, 12, 0, 3, 48, -12, -48 },
+ { 2, 15, 0, 3, 48, -12, -48 },
+ { 2, 18, 0, 3, 48, -12, -48 },
+ { 2, 21, 0, 3, 48, -12, -48 },
+ { 2, 24, 0, 3, 48, -12, -48 },
+ { 2, 27, 0, 3, 48, -12, -48 },
+ { 2, 30, 10, 3, 38, -16, -38 },
+ { 2, 27, 48, 4, 40, -8, -40 },
+ { 2, 0, 51, 2, 11, -4, 0 },
+ { 2, 2, 51, 2, 11, -4, 0 },
+ { 2, 4, 51, 2, 11, -4, 0 },
+ { 2, 6, 51, 2, 11, -4, 0 },
+ { 2, 8, 51, 2, 11, -4, 0 },
+ { 2, 10, 51, 2, 11, -4, 0 },
+ { 2, 12, 51, 2, 11, -4, 0 },
+ { 2, 14, 51, 2, 11, -4, 0 },
+ { 2, 16, 51, 2, 11, -4, 0 },
+ { 2, 18, 51, 2, 11, -4, 0 },
+ { 2, 20, 51, 2, 11, -4, 0 },
+ { 2, 22, 51, 2, 11, -4, 0 },
+ { 255, 0, 80, 3, 48, -12, -48 },
+ { 255, 3, 80, 3, 48, -12, -48 },
+ { 255, 6, 80, 3, 48, -12, -48 },
+ { 255, 9, 80, 3, 48, -12, -48 },
+ { 255, 12, 80, 3, 48, -12, -48 },
+ { 255, 15, 80, 3, 48, -12, -48 },
+ { 255, 0, 129, 3, 48, -12, -48 },
+ { 255, 3, 129, 3, 48, -12, -48 },
+ { 255, 6, 129, 3, 48, -12, -48 },
+ { 255, 9, 129, 3, 48, -12, -48 },
+ { 255, 12, 129, 3, 48, -12, -48 },
+ { 255, 15, 129, 3, 48, -12, -48 },
+ { 3, 0, 0, 3, 48, -12, -46 },
+ { 3, 3, 0, 3, 48, -12, -48 },
+ { 3, 6, 0, 3, 48, -12, -48 },
+ { 3, 9, 0, 3, 48, -12, -48 },
+ { 3, 12, 0, 3, 48, -12, -48 },
+ { 3, 15, 0, 3, 48, -12, -48 },
+ { 3, 18, 0, 3, 48, -12, -48 },
+ { 3, 21, 0, 3, 48, -12, -48 },
+ { 3, 24, 0, 3, 48, -12, -48 },
+ { 3, 27, 0, 3, 48, -12, -46 },
+ { 3, 30, 0, 3, 48, -14, -47 },
+ { 3, 39, 199, 1, 1, -12, -48 },
+ { 3, 0, 51, 2, 11, 0, -7 },
+ { 3, 2, 51, 2, 11, 0, -7 },
+ { 3, 4, 51, 2, 11, 0, -7 },
+ { 3, 6, 51, 2, 11, 0, -7 },
+ { 3, 8, 51, 2, 11, 0, -7 },
+ { 3, 10, 51, 2, 11, 0, -7 },
+ { 3, 12, 51, 2, 11, 0, -7 },
+ { 3, 14, 51, 2, 11, 0, -7 },
+ { 3, 16, 51, 2, 11, 0, -7 },
+ { 3, 18, 51, 2, 11, 0, -7 },
+ { 3, 20, 51, 2, 11, 0, -7 },
+ { 3, 22, 51, 2, 11, 0, -7 },
+ { 3, 0, 80, 3, 48, -12, -48 },
+ { 3, 3, 80, 3, 48, -12, -48 },
+ { 3, 6, 80, 3, 48, -12, -48 },
+ { 3, 9, 80, 3, 48, -12, -48 },
+ { 3, 12, 80, 3, 48, -12, -48 },
+ { 3, 15, 80, 3, 48, -12, -48 },
+ { 3, 0, 129, 3, 48, -12, -48 },
+ { 3, 3, 129, 3, 48, -12, -48 },
+ { 3, 6, 129, 3, 48, -12, -48 },
+ { 3, 9, 129, 3, 48, -12, -48 },
+ { 3, 12, 129, 3, 48, -12, -48 },
+ { 3, 15, 129, 3, 48, -12, -48 },
+ { 12, 0, 96, 5, 29, -20, -42 },
+ { 12, 5, 96, 5, 29, -20, -42 },
+ { 12, 10, 96, 5, 29, -20, -42 },
+ { 12, 15, 96, 5, 29, -20, -42 },
+ { 12, 20, 96, 5, 29, -20, -42 },
+ { 12, 25, 96, 5, 29, -20, -42 },
+ { 12, 30, 96, 5, 29, -20, -42 },
+ { 12, 35, 96, 5, 29, -20, -42 },
+ { 12, 0, 125, 5, 29, -20, -42 },
+ { 12, 5, 125, 5, 29, -20, -42 },
+ { 255, 0, 0, 0, 0, 0, 0 },
+ { 255, 0, 0, 0, 0, 0, 0 },
+ { 255, 0, 0, 0, 0, 0, 0 },
+ { 255, 0, 0, 0, 0, 0, 0 },
+ { 255, 0, 0, 0, 0, 0, 0 },
+ { 255, 0, 0, 0, 0, 0, 0 },
+ { 255, 0, 0, 0, 0, 0, 0 },
+ { 255, 0, 0, 0, 0, 0, 0 },
+ { 255, 0, 0, 0, 0, 0, 0 },
+ { 255, 0, 0, 0, 0, 0, 0 },
+ { 255, 0, 0, 0, 0, 0, 0 },
+ { 255, 0, 0, 0, 0, 0, 0 },
+ { 255, 0, 0, 0, 0, 0, 0 },
+ { 255, 0, 0, 0, 0, 0, 0 },
+ { 255, 0, 0, 0, 0, 0, 0 },
+ { 255, 0, 0, 0, 0, 0, 0 },
+ { 255, 0, 0, 0, 0, 0, 0 },
+ { 255, 0, 0, 0, 0, 0, 0 },
+ { 255, 0, 0, 0, 0, 0, 0 },
+ { 255, 0, 0, 0, 0, 0, 0 },
+ { 255, 0, 0, 0, 0, 0, 0 },
+ { 255, 0, 0, 0, 0, 0, 0 },
+ { 255, 0, 0, 0, 0, 0, 0 },
+ { 255, 0, 0, 0, 0, 0, 0 },
+ { 255, 0, 0, 0, 0, 0, 0 },
+ { 255, 0, 0, 0, 0, 0, 0 },
+ { 255, 0, 0, 0, 0, 0, 0 },
+ { 255, 0, 0, 0, 0, 0, 0 },
+ { 255, 0, 0, 0, 0, 0, 0 },
+ { 255, 0, 0, 0, 0, 0, 0 },
+ { 255, 0, 0, 0, 0, 0, 0 },
+ { 255, 0, 0, 0, 0, 0, 0 },
+ { 255, 0, 0, 0, 0, 0, 0 },
+ { 255, 0, 0, 0, 0, 0, 0 },
+ { 255, 0, 0, 0, 0, 0, 0 },
+ { 255, 0, 0, 0, 0, 0, 0 },
+ { 255, 0, 0, 0, 0, 0, 0 },
+ { 255, 0, 0, 0, 0, 0, 0 },
+ { 255, 0, 0, 0, 0, 0, 0 },
+ { 255, 0, 0, 0, 0, 0, 0 },
+ { 255, 0, 0, 0, 0, 0, 0 },
+ { 255, 0, 0, 0, 0, 0, 0 },
+ { 255, 0, 0, 0, 0, 0, 0 },
+ { 255, 0, 0, 0, 0, 0, 0 },
+ { 255, 0, 0, 0, 0, 0, 0 },
+ { 255, 0, 0, 0, 0, 0, 0 },
+ { 255, 0, 0, 0, 0, 0, 0 },
+ { 255, 0, 0, 0, 0, 0, 0 },
+ { 255, 0, 0, 0, 0, 0, 0 },
+ { 255, 0, 0, 0, 0, 0, 0 }
+};
+
+static const ShapeProvider k1DefaultShapesAmigaProvider = { ARRAYSIZE(k1DefaultShapesAmiga), k1DefaultShapesAmiga };
+
+static const byte k1AmuleteAnimSeqAmiga[42] = {
+ 0x00, 0x01, 0x02, 0x01, 0x03, 0x04, 0x03, 0x01,
+ 0x02, 0x03, 0x04, 0x05, 0x06, 0x05, 0x04, 0x05,
+ 0x07, 0x08, 0x07, 0x08, 0x09, 0x08, 0x09, 0x07,
+ 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D,
+ 0x0E, 0x0F, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15,
+ 0x16, 0xFF
+};
+
+static const ByteProvider k1AmuleteAnimSeqAmigaProvider = { ARRAYSIZE(k1AmuleteAnimSeqAmiga), k1AmuleteAnimSeqAmiga };
+
+static const Shape k1Healing1ShapesAmiga[22] = {
+ { 8, 0, 0, 3, 48, -12, -48 },
+ { 8, 3, 0, 3, 48, -12, -48 },
+ { 8, 6, 0, 3, 48, -12, -48 },
+ { 8, 9, 0, 3, 48, -12, -48 },
+ { 8, 12, 0, 3, 48, -12, -48 },
+ { 8, 15, 0, 3, 48, -12, -48 },
+ { 8, 18, 0, 3, 48, -12, -48 },
+ { 8, 21, 0, 3, 48, -12, -48 },
+ { 8, 24, 0, 3, 48, -12, -48 },
+ { 8, 27, 0, 3, 48, -12, -48 },
+ { 8, 30, 0, 3, 48, -12, -48 },
+ { 8, 33, 0, 3, 48, -12, -48 },
+ { 8, 0, 48, 3, 48, -12, -48 },
+ { 8, 3, 48, 3, 48, -12, -48 },
+ { 8, 6, 48, 3, 48, -12, -48 },
+ { 8, 9, 48, 3, 48, -12, -48 },
+ { 8, 12, 48, 3, 48, -12, -48 },
+ { 8, 15, 48, 3, 48, -12, -48 },
+ { 8, 18, 48, 3, 48, -12, -48 },
+ { 8, 21, 48, 3, 48, -12, -48 },
+ { 8, 24, 48, 3, 48, -12, -48 },
+ { 8, 27, 48, 3, 48, -12, -48 }
+};
+
+static const ShapeProvider k1Healing1ShapesAmigaProvider = { ARRAYSIZE(k1Healing1ShapesAmiga), k1Healing1ShapesAmiga };
+
+static const Shape k1Healing2ShapesAmiga[30] = {
+ { 9, 0, 0, 3, 48, -11, -48 },
+ { 9, 3, 0, 3, 48, -11, -48 },
+ { 9, 6, 0, 3, 48, -11, -48 },
+ { 9, 9, 0, 3, 48, -11, -48 },
+ { 9, 12, 0, 3, 48, -11, -48 },
+ { 9, 15, 0, 3, 48, -11, -48 },
+ { 9, 18, 0, 3, 48, -11, -48 },
+ { 9, 21, 0, 3, 48, -11, -48 },
+ { 9, 24, 0, 3, 48, -11, -48 },
+ { 9, 27, 0, 3, 48, -11, -48 },
+ { 9, 30, 0, 3, 48, -11, -48 },
+ { 9, 33, 0, 3, 48, -11, -48 },
+ { 9, 0, 48, 3, 48, -11, -48 },
+ { 9, 3, 48, 3, 48, -11, -48 },
+ { 9, 6, 48, 3, 48, -11, -48 },
+ { 9, 9, 48, 3, 48, -11, -48 },
+ { 9, 12, 48, 3, 48, -11, -48 },
+ { 9, 15, 48, 3, 48, -11, -48 },
+ { 9, 18, 48, 3, 48, -11, -48 },
+ { 9, 21, 48, 3, 48, -11, -48 },
+ { 9, 24, 48, 3, 48, -11, -48 },
+ { 9, 27, 48, 3, 48, -11, -48 },
+ { 9, 30, 48, 3, 48, -11, -48 },
+ { 9, 33, 48, 3, 48, -11, -48 },
+ { 9, 0, 96, 3, 48, -11, -48 },
+ { 9, 3, 96, 3, 48, -11, -48 },
+ { 9, 6, 96, 3, 48, -11, -48 },
+ { 9, 9, 96, 3, 48, -11, -48 },
+ { 9, 12, 96, 3, 48, -11, -48 },
+ { 9, 15, 96, 3, 48, -11, -48 }
+};
+
+static const ShapeProvider k1Healing2ShapesAmigaProvider = { ARRAYSIZE(k1Healing2ShapesAmiga), k1Healing2ShapesAmiga };
+
+static const Shape k1PoisonDeathShapesAmiga[20] = {
+ { 19, 0, 0, 8, 48, -31, -48 },
+ { 19, 8, 0, 8, 48, -31, -48 },
+ { 19, 16, 0, 8, 48, -31, -48 },
+ { 19, 24, 0, 8, 48, -31, -48 },
+ { 19, 32, 0, 8, 48, -31, -48 },
+ { 19, 0, 48, 8, 48, -31, -48 },
+ { 19, 8, 48, 8, 48, -31, -48 },
+ { 19, 16, 48, 8, 48, -31, -48 },
+ { 19, 24, 48, 8, 48, -31, -48 },
+ { 19, 32, 48, 8, 48, -31, -48 },
+ { 19, 0, 96, 8, 48, -31, -48 },
+ { 19, 8, 96, 8, 48, -31, -48 },
+ { 19, 16, 96, 8, 48, -31, -48 },
+ { 19, 24, 96, 8, 48, -31, -48 },
+ { 19, 32, 96, 8, 48, -31, -48 },
+ { 19, 0, 144, 8, 48, -31, -48 },
+ { 19, 8, 144, 8, 48, -31, -48 },
+ { 19, 16, 144, 8, 48, -31, -48 },
+ { 19, 24, 144, 8, 48, -31, -48 },
+ { 19, 32, 144, 8, 48, -31, -48 }
+};
+
+static const ShapeProvider k1PoisonDeathShapesAmigaProvider = { ARRAYSIZE(k1PoisonDeathShapesAmiga), k1PoisonDeathShapesAmiga };
+
+static const Shape k1FluteShapesAmiga[36] = {
+ { 13, 0, 0, 3, 75, -12, -75 },
+ { 13, 3, 0, 3, 75, -12, -75 },
+ { 13, 6, 0, 3, 75, -12, -75 },
+ { 13, 9, 0, 3, 75, -12, -75 },
+ { 13, 12, 0, 3, 75, -12, -75 },
+ { 13, 15, 0, 3, 75, -12, -75 },
+ { 13, 18, 0, 3, 75, -12, -75 },
+ { 13, 21, 0, 3, 75, -12, -75 },
+ { 13, 24, 0, 3, 75, -12, -75 },
+ { 13, 27, 0, 3, 75, -12, -75 },
+ { 13, 30, 0, 3, 75, -12, -75 },
+ { 13, 33, 0, 3, 75, -12, -75 },
+ { 13, 36, 75, 3, 75, -12, -75 },
+ { 13, 0, 75, 3, 75, -12, -75 },
+ { 13, 3, 75, 3, 75, -12, -75 },
+ { 13, 6, 75, 3, 75, -12, -75 },
+ { 13, 9, 75, 3, 75, -12, -75 },
+ { 13, 12, 75, 3, 75, -12, -75 },
+ { 13, 15, 75, 3, 75, -12, -75 },
+ { 13, 18, 75, 3, 75, -12, -75 },
+ { 13, 21, 75, 3, 75, -12, -75 },
+ { 13, 24, 75, 3, 75, -12, -75 },
+ { 13, 27, 75, 3, 75, -12, -75 },
+ { 13, 30, 75, 3, 75, -12, -75 },
+ { 13, 33, 75, 3, 75, -12, -75 },
+ { 13, 36, 75, 3, 75, -12, -75 },
+ { 14, 0, 0, 3, 75, -12, -75 },
+ { 14, 3, 0, 3, 75, -12, -75 },
+ { 14, 6, 0, 3, 75, -12, -75 },
+ { 14, 9, 0, 3, 75, -12, -75 },
+ { 14, 12, 0, 3, 75, -12, -75 },
+ { 14, 15, 0, 3, 75, -12, -75 },
+ { 14, 18, 0, 3, 75, -12, -75 },
+ { 14, 21, 0, 3, 75, -12, -75 },
+ { 14, 24, 0, 3, 75, -12, -75 },
+ { 14, 27, 0, 3, 75, -12, -75 }
+};
+
+static const ShapeProvider k1FluteShapesAmigaProvider = { ARRAYSIZE(k1FluteShapesAmiga), k1FluteShapesAmiga };
+
+static const Shape k1Winter1ShapesAmiga[7] = {
+ { 10, 5, 0, 5, 66, -20, -65 },
+ { 10, 10, 0, 5, 66, -20, -65 },
+ { 10, 15, 0, 5, 66, -20, -65 },
+ { 10, 20, 0, 5, 66, -20, -65 },
+ { 10, 25, 0, 5, 66, -20, -65 },
+ { 10, 30, 0, 5, 66, -20, -65 },
+ { 10, 35, 0, 5, 66, -20, -65 }
+};
+
+static const ShapeProvider k1Winter1ShapesAmigaProvider = { ARRAYSIZE(k1Winter1ShapesAmiga), k1Winter1ShapesAmiga };
+
+static const Shape k1Winter2ShapesAmiga[35] = {
+ { 10, 0, 66, 5, 66, -20, -65 },
+ { 10, 5, 66, 5, 66, -20, -65 },
+ { 10, 10, 66, 5, 66, -20, -65 },
+ { 10, 15, 66, 5, 66, -20, -65 },
+ { 10, 20, 66, 5, 66, -20, -65 },
+ { 10, 25, 66, 5, 66, -20, -65 },
+ { 10, 30, 66, 5, 66, -20, -65 },
+ { 10, 35, 66, 5, 66, -20, -65 },
+ { 10, 0, 132, 5, 66, -20, -65 },
+ { 10, 5, 132, 5, 66, -20, -65 },
+ { 10, 10, 132, 5, 66, -20, -65 },
+ { 10, 15, 132, 5, 66, -20, -65 },
+ { 10, 20, 132, 5, 66, -20, -65 },
+ { 10, 25, 132, 5, 66, -20, -65 },
+ { 10, 30, 132, 5, 66, -20, -65 },
+ { 10, 35, 132, 5, 66, -20, -65 },
+ { 11, 0, 0, 5, 66, -20, -65 },
+ { 11, 5, 0, 5, 66, -20, -65 },
+ { 11, 10, 0, 5, 66, -20, -65 },
+ { 11, 15, 0, 5, 66, -20, -65 },
+ { 11, 20, 0, 5, 66, -20, -65 },
+ { 11, 25, 0, 5, 66, -20, -65 },
+ { 11, 30, 0, 5, 66, -20, -65 },
+ { 11, 35, 0, 5, 66, -20, -65 },
+ { 11, 0, 66, 5, 66, -20, -65 },
+ { 11, 5, 66, 5, 66, -20, -65 },
+ { 11, 10, 66, 5, 66, -20, -65 },
+ { 11, 15, 66, 5, 66, -20, -65 },
+ { 11, 20, 66, 5, 66, -20, -65 },
+ { 11, 25, 66, 5, 66, -20, -65 },
+ { 11, 30, 66, 5, 66, -20, -65 },
+ { 11, 35, 66, 5, 66, -20, -65 },
+ { 11, 0, 132, 5, 66, -20, -65 },
+ { 11, 5, 132, 5, 66, -20, -65 },
+ { 11, 10, 132, 5, 66, -20, -65 }
+};
+
+static const ShapeProvider k1Winter2ShapesAmigaProvider = { ARRAYSIZE(k1Winter2ShapesAmiga), k1Winter2ShapesAmiga };
+
+static const Shape k1Winter3ShapesAmiga[4] = {
+ { 11, 15, 132, 5, 66, -20, -65 },
+ { 11, 20, 132, 5, 66, -20, -65 },
+ { 11, 25, 132, 5, 66, -20, -65 },
+ { 11, 30, 132, 5, 66, -20, -65 }
+};
+
+static const ShapeProvider k1Winter3ShapesAmigaProvider = { ARRAYSIZE(k1Winter3ShapesAmiga), k1Winter3ShapesAmiga };
+
+static const Shape k1DrinkShapesAmiga[15] = {
+ { 6, 0, 0, 4, 48, -20, -48 },
+ { 6, 4, 0, 4, 48, -20, -48 },
+ { 6, 8, 0, 4, 48, -20, -48 },
+ { 6, 12, 0, 4, 48, -20, -48 },
+ { 6, 16, 0, 4, 48, -20, -48 },
+ { 6, 20, 0, 5, 48, -20, -48 },
+ { 6, 0, 48, 5, 54, -20, -54 },
+ { 6, 5, 48, 5, 54, -20, -54 },
+ { 6, 10, 48, 5, 54, -20, -54 },
+ { 7, 0, 0, 3, 43, -12, -43 },
+ { 7, 3, 3, 2, 40, -8, -40 },
+ { 7, 5, 7, 2, 36, -8, -36 },
+ { 7, 7, 10, 2, 33, -8, -33 },
+ { 7, 9, 12, 2, 31, -8, -31 },
+ { 7, 11, 15, 2, 28, -8, -28 }
+};
+
+static const ShapeProvider k1DrinkShapesAmigaProvider = { ARRAYSIZE(k1DrinkShapesAmiga), k1DrinkShapesAmiga };
+
+static const Shape k1WispShapesAmiga[26] = {
+ { 12, 0, 0, 5, 48, -20, -48 },
+ { 12, 5, 0, 5, 48, -20, -48 },
+ { 12, 10, 0, 5, 48, -20, -48 },
+ { 12, 15, 0, 5, 48, -20, -48 },
+ { 12, 20, 0, 5, 48, -20, -48 },
+ { 12, 25, 0, 5, 48, -20, -48 },
+ { 12, 30, 0, 5, 48, -20, -48 },
+ { 12, 35, 0, 5, 48, -20, -48 },
+ { 12, 0, 48, 5, 48, -20, -48 },
+ { 12, 5, 48, 5, 48, -20, -48 },
+ { 12, 10, 48, 5, 48, -20, -48 },
+ { 12, 15, 48, 5, 48, -20, -48 },
+ { 12, 20, 48, 5, 48, -20, -48 },
+ { 12, 25, 48, 5, 48, -20, -48 },
+ { 12, 30, 48, 5, 48, -20, -48 },
+ { 12, 35, 48, 5, 48, -20, -48 },
+ { 12, 0, 96, 5, 29, -20, -42 },
+ { 12, 5, 96, 5, 29, -20, -42 },
+ { 12, 10, 96, 5, 29, -20, -42 },
+ { 12, 15, 96, 5, 29, -20, -42 },
+ { 12, 20, 96, 5, 29, -20, -42 },
+ { 12, 25, 96, 5, 29, -20, -42 },
+ { 12, 30, 96, 5, 29, -20, -42 },
+ { 12, 35, 96, 5, 29, -20, -42 },
+ { 12, 0, 125, 5, 29, -20, -42 },
+ { 12, 5, 125, 5, 29, -20, -42 }
+};
+
+static const ShapeProvider k1WispShapesAmigaProvider = { ARRAYSIZE(k1WispShapesAmiga), k1WispShapesAmiga };
+
+static const Shape k1MagicAnimShapesAmiga[5] = {
+ { 17, 0, 0, 8, 49, -32, -49 },
+ { 17, 8, 0, 8, 49, -32, -49 },
+ { 17, 16, 0, 8, 49, -32, -49 },
+ { 17, 24, 0, 8, 49, -32, -49 },
+ { 17, 32, 0, 8, 49, -32, -49 }
+};
+
+static const ShapeProvider k1MagicAnimShapesAmigaProvider = { ARRAYSIZE(k1MagicAnimShapesAmiga), k1MagicAnimShapesAmiga };
+
+static const Shape k1BranStoneShapesAmiga[15] = {
+ { 18, 0, 0, 5, 51, -20, -50 },
+ { 18, 5, 0, 5, 51, -20, -50 },
+ { 18, 10, 0, 5, 51, -20, -50 },
+ { 18, 15, 0, 5, 51, -20, -50 },
+ { 18, 20, 0, 5, 51, -20, -50 },
+ { 18, 25, 0, 5, 51, -20, -50 },
+ { 18, 30, 0, 5, 51, -20, -50 },
+ { 18, 35, 0, 5, 51, -20, -50 },
+ { 18, 0, 51, 5, 51, -20, -50 },
+ { 18, 5, 51, 5, 51, -20, -50 },
+ { 18, 10, 51, 5, 51, -20, -50 },
+ { 18, 15, 51, 5, 51, -20, -50 },
+ { 18, 20, 51, 5, 51, -20, -50 },
+ { 18, 25, 51, 5, 51, -20, -50 },
+ { 0, 0, 3, 242, 0, 0, 3 }
+};
+
+static const ShapeProvider k1BranStoneShapesAmigaProvider = { ARRAYSIZE(k1BranStoneShapesAmiga), k1BranStoneShapesAmiga };
+
+static const byte k1OutroReunionSeqAmiga[1354] = {
+ 0x1A, 0x00, 0x08, 0x01, 0x06, 0x01, 0x00, 0x02,
+ 0x08, 0x00, 0x50, 0x00, 0x43, 0x07, 0x08, 0x00,
+ 0x14, 0x0A, 0x00, 0x03, 0x08, 0x07, 0x08, 0x00,
+ 0x0B, 0x00, 0x09, 0x00, 0x10, 0x20, 0x5A, 0x00,
+ 0x3A, 0x04, 0x02, 0x08, 0x0D, 0x50, 0x00, 0x43,
+ 0x07, 0x10, 0x00, 0x02, 0x08, 0x0E, 0x50, 0x00,
+ 0x43, 0x07, 0x10, 0x00, 0x02, 0x08, 0x0C, 0x50,
+ 0x00, 0x43, 0x07, 0x10, 0x00, 0x02, 0x08, 0x0B,
+ 0x50, 0x00, 0x43, 0x07, 0x10, 0x00, 0x02, 0x08,
+ 0x0C, 0x50, 0x00, 0x43, 0x07, 0x10, 0x00, 0x02,
+ 0x08, 0x0D, 0x50, 0x00, 0x43, 0x07, 0x10, 0x00,
+ 0x02, 0x08, 0x0E, 0x50, 0x00, 0x43, 0x07, 0x10,
+ 0x00, 0x0A, 0x01, 0x03, 0x08, 0x07, 0x08, 0x00,
+ 0x0B, 0x01, 0x04, 0x00, 0x10, 0x21, 0x5A, 0x00,
+ 0x3A, 0x04, 0x0A, 0x02, 0x02, 0x08, 0x14, 0x50,
+ 0x00, 0x43, 0x07, 0x08, 0x00, 0x03, 0x08, 0x07,
+ 0x08, 0x00, 0x03, 0x08, 0x07, 0x08, 0x00, 0x03,
+ 0x08, 0x07, 0x08, 0x00, 0x03, 0x08, 0x07, 0x08,
+ 0x00, 0x0B, 0x02, 0x01, 0x00, 0x03, 0x08, 0x07,
+ 0x08, 0x00, 0x03, 0x08, 0x07, 0x08, 0x00, 0x03,
+ 0x08, 0x07, 0x08, 0x00, 0x10, 0x22, 0x5A, 0x00,
+ 0x3A, 0x04, 0x0A, 0x03, 0x03, 0x08, 0x07, 0x08,
+ 0x00, 0x0B, 0x03, 0x0B, 0x00, 0x10, 0x23, 0x78,
+ 0x00, 0x3A, 0x1F, 0x0A, 0x03, 0x03, 0x08, 0x07,
+ 0x08, 0x00, 0x0B, 0x03, 0x05, 0x00, 0x06, 0x28,
+ 0x00, 0x02, 0x08, 0x2E, 0x50, 0x00, 0x43, 0x07,
+ 0x10, 0x00, 0x02, 0x08, 0x2D, 0x50, 0x00, 0x43,
+ 0x07, 0x10, 0x00, 0x02, 0x08, 0x2E, 0x50, 0x00,
+ 0x43, 0x07, 0x10, 0x00, 0x02, 0x08, 0x2D, 0x50,
+ 0x00, 0x43, 0x07, 0x10, 0x00, 0x02, 0x08, 0x2E,
+ 0x50, 0x00, 0x43, 0x07, 0x10, 0x00, 0x02, 0x08,
+ 0x2D, 0x50, 0x00, 0x43, 0x07, 0x10, 0x00, 0x02,
+ 0x08, 0x2F, 0x50, 0x00, 0x43, 0x07, 0x08, 0x00,
+ 0x02, 0x08, 0x30, 0x50, 0x00, 0x43, 0x07, 0x08,
+ 0x00, 0x02, 0x08, 0x31, 0x50, 0x00, 0x43, 0x07,
+ 0x08, 0x00, 0x02, 0x08, 0x32, 0x50, 0x00, 0x43,
+ 0x07, 0x08, 0x00, 0x06, 0x0A, 0x00, 0x10, 0x24,
+ 0x5A, 0x00, 0x3A, 0x04, 0x02, 0x08, 0x33, 0x50,
+ 0x00, 0x43, 0x07, 0x08, 0x00, 0x02, 0x08, 0x34,
+ 0x50, 0x00, 0x43, 0x07, 0x08, 0x00, 0x02, 0x08,
+ 0x35, 0x50, 0x00, 0x43, 0x07, 0x08, 0x00, 0x02,
+ 0x08, 0x36, 0x50, 0x00, 0x43, 0x07, 0x08, 0x00,
+ 0x02, 0x08, 0x37, 0x50, 0x00, 0x43, 0x07, 0x08,
+ 0x00, 0x02, 0x08, 0x35, 0x50, 0x00, 0x43, 0x07,
+ 0x08, 0x00, 0x02, 0x08, 0x34, 0x50, 0x00, 0x43,
+ 0x07, 0x08, 0x00, 0x02, 0x08, 0x33, 0x50, 0x00,
+ 0x43, 0x07, 0x08, 0x00, 0x02, 0x08, 0x35, 0x50,
+ 0x00, 0x43, 0x07, 0x08, 0x00, 0x02, 0x08, 0x36,
+ 0x50, 0x00, 0x43, 0x07, 0x08, 0x00, 0x02, 0x08,
+ 0x37, 0x50, 0x00, 0x43, 0x07, 0x08, 0x00, 0x06,
+ 0x0A, 0x00, 0x10, 0x25, 0x5A, 0x00, 0x3A, 0x04,
+ 0x02, 0x08, 0x33, 0x50, 0x00, 0x43, 0x07, 0x08,
+ 0x00, 0x02, 0x08, 0x34, 0x50, 0x00, 0x43, 0x07,
+ 0x08, 0x00, 0x02, 0x08, 0x35, 0x50, 0x00, 0x43,
+ 0x07, 0x08, 0x00, 0x02, 0x08, 0x36, 0x50, 0x00,
+ 0x43, 0x07, 0x08, 0x00, 0x02, 0x08, 0x37, 0x50,
+ 0x00, 0x43, 0x07, 0x08, 0x00, 0x02, 0x08, 0x35,
+ 0x50, 0x00, 0x43, 0x07, 0x08, 0x00, 0x02, 0x08,
+ 0x34, 0x50, 0x00, 0x43, 0x07, 0x08, 0x00, 0x02,
+ 0x08, 0x33, 0x50, 0x00, 0x43, 0x07, 0x08, 0x00,
+ 0x02, 0x08, 0x35, 0x50, 0x00, 0x43, 0x07, 0x08,
+ 0x00, 0x02, 0x08, 0x36, 0x50, 0x00, 0x43, 0x07,
+ 0x08, 0x00, 0x02, 0x08, 0x37, 0x50, 0x00, 0x43,
+ 0x07, 0x08, 0x00, 0x06, 0x1E, 0x00, 0x10, 0x26,
+ 0x78, 0x00, 0x3A, 0x1F, 0x02, 0x08, 0x38, 0x50,
+ 0x00, 0x43, 0x07, 0x08, 0x00, 0x02, 0x08, 0x39,
+ 0x50, 0x00, 0x43, 0x07, 0x08, 0x00, 0x02, 0x08,
+ 0x3A, 0x50, 0x00, 0x43, 0x07, 0x08, 0x00, 0x02,
+ 0x08, 0x38, 0x50, 0x00, 0x43, 0x07, 0x08, 0x00,
+ 0x02, 0x08, 0x3B, 0x50, 0x00, 0x43, 0x07, 0x08,
+ 0x00, 0x06, 0x0A, 0x00, 0x02, 0x08, 0x39, 0x50,
+ 0x00, 0x43, 0x07, 0x08, 0x00, 0x02, 0x08, 0x38,
+ 0x50, 0x00, 0x43, 0x07, 0x08, 0x00, 0x02, 0x08,
+ 0x39, 0x50, 0x00, 0x43, 0x07, 0x08, 0x00, 0x02,
+ 0x08, 0x3A, 0x50, 0x00, 0x43, 0x07, 0x08, 0x00,
+ 0x06, 0x3C, 0x00, 0x11, 0x02, 0x08, 0x33, 0x50,
+ 0x00, 0x43, 0x07, 0x08, 0x00, 0x02, 0x08, 0x32,
+ 0x50, 0x00, 0x43, 0x07, 0x08, 0x00, 0x02, 0x08,
+ 0x31, 0x50, 0x00, 0x43, 0x07, 0x08, 0x00, 0x02,
+ 0x08, 0x30, 0x50, 0x00, 0x43, 0x07, 0x08, 0x00,
+ 0x02, 0x08, 0x2F, 0x50, 0x00, 0x43, 0x07, 0x08,
+ 0x00, 0x02, 0x08, 0x2E, 0x50, 0x00, 0x43, 0x07,
+ 0x08, 0x00, 0x02, 0x08, 0x2D, 0x50, 0x00, 0x43,
+ 0x07, 0x08, 0x00, 0x06, 0x1E, 0x00, 0x02, 0x08,
+ 0x2E, 0x50, 0x00, 0x43, 0x07, 0x08, 0x00, 0x02,
+ 0x08, 0x2F, 0x50, 0x00, 0x43, 0x07, 0x08, 0x00,
+ 0x02, 0x08, 0x30, 0x50, 0x00, 0x43, 0x07, 0x08,
+ 0x00, 0x02, 0x08, 0x31, 0x50, 0x00, 0x43, 0x07,
+ 0x08, 0x00, 0x02, 0x08, 0x32, 0x50, 0x00, 0x43,
+ 0x07, 0x08, 0x00, 0x02, 0x08, 0x33, 0x50, 0x00,
+ 0x43, 0x07, 0x08, 0x00, 0x02, 0x08, 0x41, 0x50,
+ 0x00, 0x43, 0x07, 0x08, 0x00, 0x02, 0x08, 0x42,
+ 0x50, 0x00, 0x43, 0x07, 0x08, 0x00, 0x02, 0x08,
+ 0x43, 0x50, 0x00, 0x43, 0x07, 0x08, 0x00, 0x02,
+ 0x08, 0x44, 0x50, 0x00, 0x43, 0x07, 0x08, 0x00,
+ 0x02, 0x08, 0x45, 0x50, 0x00, 0x43, 0x07, 0x08,
+ 0x00, 0x02, 0x08, 0x46, 0x50, 0x00, 0x43, 0x07,
+ 0x08, 0x00, 0x06, 0x0A, 0x00, 0x10, 0x27, 0x5A,
+ 0x00, 0x3A, 0x04, 0x02, 0x08, 0x4E, 0x50, 0x00,
+ 0x43, 0x07, 0x08, 0x00, 0x02, 0x08, 0x4F, 0x50,
+ 0x00, 0x43, 0x07, 0x08, 0x00, 0x02, 0x08, 0x50,
+ 0x50, 0x00, 0x43, 0x07, 0x08, 0x00, 0x02, 0x08,
+ 0x51, 0x50, 0x00, 0x43, 0x07, 0x08, 0x00, 0x02,
+ 0x08, 0x52, 0x50, 0x00, 0x43, 0x07, 0x08, 0x00,
+ 0x02, 0x08, 0x53, 0x50, 0x00, 0x43, 0x07, 0x08,
+ 0x00, 0x02, 0x08, 0x54, 0x50, 0x00, 0x43, 0x07,
+ 0x08, 0x00, 0x02, 0x08, 0x55, 0x50, 0x00, 0x43,
+ 0x07, 0x08, 0x00, 0x06, 0x78, 0x00, 0x10, 0x28,
+ 0x78, 0x00, 0x3A, 0x1F, 0x0A, 0x05, 0x02, 0x08,
+ 0x59, 0x50, 0x00, 0x43, 0x07, 0x08, 0x00, 0x02,
+ 0x08, 0x5A, 0x50, 0x00, 0x43, 0x07, 0x08, 0x00,
+ 0x02, 0x08, 0x5B, 0x50, 0x00, 0x43, 0x07, 0x08,
+ 0x00, 0x02, 0x08, 0x5C, 0x50, 0x00, 0x43, 0x07,
+ 0x08, 0x00, 0x02, 0x08, 0x5D, 0x50, 0x00, 0x43,
+ 0x07, 0x08, 0x00, 0x0B, 0x05, 0x01, 0x00, 0x06,
+ 0x28, 0x00, 0x10, 0x29, 0x78, 0x00, 0x3A, 0x1F,
+ 0x0A, 0x06, 0x02, 0x08, 0x59, 0x50, 0x00, 0x43,
+ 0x07, 0x08, 0x00, 0x02, 0x08, 0x5A, 0x50, 0x00,
+ 0x43, 0x07, 0x08, 0x00, 0x02, 0x08, 0x5B, 0x50,
+ 0x00, 0x43, 0x07, 0x08, 0x00, 0x02, 0x08, 0x5C,
+ 0x50, 0x00, 0x43, 0x07, 0x08, 0x00, 0x02, 0x08,
+ 0x5D, 0x50, 0x00, 0x43, 0x07, 0x08, 0x00, 0x0B,
+ 0x06, 0x01, 0x00, 0x06, 0x28, 0x00, 0x10, 0x2A,
+ 0x78, 0x00, 0x3A, 0x1F, 0x02, 0x08, 0x5E, 0x50,
+ 0x00, 0x43, 0x07, 0x10, 0x00, 0x02, 0x08, 0x63,
+ 0x50, 0x00, 0x43, 0x07, 0x10, 0x00, 0x06, 0xB4,
+ 0x00, 0x11, 0x00, 0x09, 0x01, 0x18, 0x69, 0x02,
+ 0x09, 0x00, 0x50, 0x00, 0x22, 0x07, 0x10, 0x00,
+ 0x02, 0x09, 0x01, 0x50, 0x00, 0x22, 0x07, 0x10,
+ 0x00, 0x18, 0x74, 0x02, 0x09, 0x02, 0x50, 0x00,
+ 0x22, 0x07, 0x10, 0x00, 0x02, 0x09, 0x03, 0x50,
+ 0x00, 0x22, 0x07, 0x10, 0x00, 0x18, 0x75, 0x02,
+ 0x09, 0x04, 0x50, 0x00, 0x22, 0x07, 0x10, 0x00,
+ 0x02, 0x09, 0x05, 0x50, 0x00, 0x22, 0x07, 0x10,
+ 0x00, 0x10, 0x2B, 0x96, 0x00, 0x23, 0x22, 0x0A,
+ 0x06, 0x02, 0x09, 0x07, 0x50, 0x00, 0x22, 0x07,
+ 0x10, 0x00, 0x02, 0x09, 0x08, 0x50, 0x00, 0x22,
+ 0x07, 0x10, 0x00, 0x02, 0x09, 0x09, 0x50, 0x00,
+ 0x22, 0x07, 0x10, 0x00, 0x02, 0x09, 0x0A, 0x50,
+ 0x00, 0x22, 0x07, 0x10, 0x00, 0x02, 0x09, 0x0B,
+ 0x50, 0x00, 0x22, 0x07, 0x10, 0x00, 0x02, 0x09,
+ 0x0C, 0x50, 0x00, 0x22, 0x07, 0x10, 0x00, 0x02,
+ 0x09, 0x0D, 0x50, 0x00, 0x22, 0x07, 0x10, 0x00,
+ 0x0B, 0x06, 0x01, 0x00, 0x06, 0x1E, 0x00, 0x10,
+ 0x2C, 0x96, 0x00, 0x23, 0x22, 0x0A, 0x06, 0x02,
+ 0x09, 0x07, 0x50, 0x00, 0x22, 0x07, 0x10, 0x00,
+ 0x02, 0x09, 0x08, 0x50, 0x00, 0x22, 0x07, 0x10,
+ 0x00, 0x02, 0x09, 0x09, 0x50, 0x00, 0x22, 0x07,
+ 0x10, 0x00, 0x02, 0x09, 0x0A, 0x50, 0x00, 0x22,
+ 0x07, 0x10, 0x00, 0x02, 0x09, 0x0B, 0x50, 0x00,
+ 0x22, 0x07, 0x10, 0x00, 0x02, 0x09, 0x0C, 0x50,
+ 0x00, 0x22, 0x07, 0x10, 0x00, 0x02, 0x09, 0x0D,
+ 0x50, 0x00, 0x22, 0x07, 0x10, 0x00, 0x0B, 0x06,
+ 0x01, 0x00, 0x06, 0x1E, 0x00, 0x10, 0x2D, 0x96,
+ 0x00, 0x23, 0x22, 0x0A, 0x06, 0x02, 0x09, 0x07,
+ 0x50, 0x00, 0x22, 0x07, 0x10, 0x00, 0x02, 0x09,
+ 0x08, 0x50, 0x00, 0x22, 0x07, 0x10, 0x00, 0x02,
+ 0x09, 0x09, 0x50, 0x00, 0x22, 0x07, 0x10, 0x00,
+ 0x02, 0x09, 0x0A, 0x50, 0x00, 0x22, 0x07, 0x10,
+ 0x00, 0x02, 0x09, 0x0B, 0x50, 0x00, 0x22, 0x07,
+ 0x10, 0x00, 0x02, 0x09, 0x0C, 0x50, 0x00, 0x22,
+ 0x07, 0x10, 0x00, 0x02, 0x09, 0x0D, 0x50, 0x00,
+ 0x22, 0x07, 0x10, 0x00, 0x0B, 0x06, 0x01, 0x00,
+ 0x06, 0x1E, 0x00, 0x02, 0x09, 0x0E, 0x50, 0x00,
+ 0x22, 0x07, 0x10, 0x00, 0x02, 0x09, 0x0F, 0x50,
+ 0x00, 0x22, 0x07, 0x10, 0x00, 0x06, 0x14, 0x00,
+ 0x02, 0x09, 0x10, 0x50, 0x00, 0x22, 0x07, 0x10,
+ 0x00, 0x02, 0x09, 0x11, 0x50, 0x00, 0x22, 0x07,
+ 0x10, 0x00, 0x06, 0x78, 0x00, 0x13, 0x01, 0x08,
+ 0x1D, 0x00
+};
+
+static const ByteProvider k1OutroReunionSeqAmigaProvider = { ARRAYSIZE(k1OutroReunionSeqAmiga), k1OutroReunionSeqAmiga };
+
+static const AmigaSfxTable k1AmigaIntroSFXTableAmiga[40] = {
+ { 0, 0, 0, 0, 0 },
+ { 0, 0, 0, 0, 0 },
+ { 0, 0, 0, 0, 0 },
+ { 0, 0, 0, 0, 0 },
+ { 0, 0, 0, 0, 0 },
+ { 0, 0, 0, 0, 0 },
+ { 0, 0, 0, 0, 0 },
+ { 0, 0, 0, 0, 0 },
+ { 0, 0, 0, 0, 0 },
+ { 0, 0, 0, 0, 0 },
+ { 0, 0, 0, 0, 0 },
+ { 0, 0, 0, 0, 0 },
+ { 0, 0, 0, 0, 0 },
+ { 0, 0, 0, 0, 0 },
+ { 0, 0, 0, 0, 0 },
+ { 0, 0, 0, 0, 0 },
+ { 0, 0, 0, 0, 0 },
+ { 0, 0, 0, 0, 0 },
+ { 0, 0, 0, 0, 0 },
+ { 0, 0, 0, 0, 0 },
+ { 0, 0, 0, 0, 0 },
+ { 0, 0, 0, 0, 0 },
+ { 60, 25, 9516, 110, 0 },
+ { 60, 25, 9516, 110, 0 },
+ { 60, 25, 9516, 110, 0 },
+ { 60, 19, 7057, 110, 0 },
+ { 0, 0, 0, 0, 0 },
+ { 0, 0, 0, 0, 0 },
+ { 60, 22, 9847, 110, 0 },
+ { 0, 0, 0, 0, 0 },
+ { 0, 0, 0, 0, 0 },
+ { 0, 0, 0, 0, 0 },
+ { 60, 23, 4504, 110, 0 },
+ { 60, 25, 9516, 110, 0 },
+ { 60, 24, 8913, 110, 0 },
+ { 60, 25, 9516, 110, 0 },
+ { 69, 3, 548, 110, 0 },
+ { 60, 22, 9847, 110, 0 },
+ { 0, 0, 0, 0, 0 },
+ { 0, 0, 0, 0, 0 }
+};
+
+static const AmigaSfxTableProvider k1AmigaIntroSFXTableAmigaProvider = { ARRAYSIZE(k1AmigaIntroSFXTableAmiga), k1AmigaIntroSFXTableAmiga };
+
+static const AmigaSfxTable k1AmigaGameSFXTableAmiga[120] = {
+ { 0, 0, 0, 0, 0 },
+ { 1, 0, 0, 0, 0 },
+ { 0, 0, 0, 0, 0 },
+ { 0, 0, 0, 0, 0 },
+ { 0, 0, 0, 0, 0 },
+ { 0, 0, 0, 0, 0 },
+ { 0, 0, 0, 0, 0 },
+ { 0, 0, 0, 0, 0 },
+ { 0, 0, 0, 0, 0 },
+ { 0, 0, 0, 0, 0 },
+ { 0, 0, 0, 0, 0 },
+ { 0, 0, 0, 0, 0 },
+ { 0, 0, 0, 0, 0 },
+ { 0, 0, 0, 0, 0 },
+ { 0, 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 },
+ { 60, 19, 342, 120, 2 },
+ { 60, 20, 10028, 120, 2 },
+ { 60, 21, 7057, 120, 2 },
+ { 60, 22, 7831, 120, 2 },
+ { 60, 23, 4651, 120, 2 },
+ { 60, 22, 7831, 120, 2 },
+ { 69, 3, 548, 120, 2 },
+ { 60, 22, 7831, 120, 2 },
+ { 0, 0, 0, 0, 0 },
+ { 60, 25, 9516, 120, 2 },
+ { 44, 4, 2320, 120, 2 },
+ { 60, 25, 9516, 120, 2 },
+ { 60, 26, 15083, 120, 2 },
+ { 37, 27, 5003, 120, 2 },
+ { 24, 3, 3922, 120, 2 },
+ { 62, 28, 1570, 120, 2 },
+ { 59, 28, 1876, 120, 2 },
+ { 22, 3, 8303, 120, 2 },
+ { 60, 25, 9516, 120, 2 },
+ { 60, 29, 2538, 120, 2 },
+ { 0, 0, 0, 0, 0 },
+ { 0, 0, 0, 0, 0 },
+ { 0, 0, 0, 0, 0 },
+ { 60, 20, 10028, 120, 2 },
+ { 60, 30, 878, 120, 2 },
+ { 60, 23, 4651, 120, 2 },
+ { 78, 11, 2449, 120, 2 },
+ { 71, 27, 700, 120, 2 },
+ { 76, 27, 529, 120, 2 },
+ { 0, 0, 0, 0, 0 },
+ { 60, 19, 342, 120, 2 },
+ { 60, 19, 342, 120, 2 },
+ { 60, 31, 3742, 120, 2 },
+ { 60, 32, 268, 120, 2 },
+ { 0, 0, 0, 0, 0 },
+ { 60, 25, 9516, 120, 2 },
+ { 60, 33, 3964, 120, 2 },
+ { 0, 0, 0, 0, 0 },
+ { 0, 0, 0, 0, 0 },
+ { 0, 0, 0, 0, 0 },
+ { 42, 11, 19527, 120, 2 },
+ { 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 },
+ { 60, 27, 1320, 120, 2 },
+ { 0, 0, 0, 0, 0 },
+ { 0, 0, 0, 0, 0 },
+ { 44, 4, 2320, 120, 2 },
+ { 0, 0, 0, 0, 0 },
+ { 60, 34, 2798, 120, 2 },
+ { 60, 22, 7831, 120, 2 },
+ { 60, 21, 7057, 120, 2 },
+ { 0, 0, 0, 0, 0 },
+ { 0, 0, 0, 0, 0 },
+ { 0, 0, 0, 0, 0 },
+ { 60, 20, 10028, 120, 2 },
+ { 0, 0, 0, 0, 0 },
+ { 60, 34, 2798, 120, 2 },
+ { 60, 20, 10028, 120, 2 },
+ { 50, 35, 5145, 156, 2 },
+ { 60, 25, 5916, 120, 2 },
+ { 60, 20, 10028, 120, 2 },
+ { 62, 28, 1570, 120, 2 },
+ { 67, 19, 513, 120, 2 },
+ { 60, 36, 4675, 90, 2 },
+ { 62, 32, 238, 120, 2 },
+ { 60, 25, 9516, 120, 2 },
+ { 41, 4, 6634, 120, 2 },
+ { 0, 0, 0, 0, 0 },
+ { 0, 0, 0, 0, 0 },
+ { 0, 0, 0, 0, 0 },
+ { 60, 32, 268, 120, 2 },
+ { 60, 37, 12470, 120, 2 },
+ { 60, 25, 9516, 120, 2 },
+ { 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 },
+ { 60, 22, 7831, 120, 2 },
+ { 0, 0, 0, 0, 0 },
+ { 60, 26, 15083, 120, 2 },
+ { 27, 4, 14835, 120, 2 },
+ { 48, 35, 5785, 80, 2 },
+ { 60, 21, 7057, 120, 2 },
+ { 41, 6, 6634, 80, 2 },
+ { 60, 25, 9516, 120, 2 },
+ { 0, 0, 0, 0, 0 },
+ { 0, 0, 0, 0, 0 },
+ { 60, 26, 15083, 120, 2 },
+ { 60, 25, 9516, 120, 2 },
+ { 60, 38, 1811, 120, 2 },
+ { 60, 38, 1811, 120, 2 },
+ { 60, 20, 10028, 120, 2 },
+ { 48, 35, 5785, 80, 2 },
+ { 48, 35, 5785, 80, 2 },
+ { 0, 0, 0, 0, 0 },
+ { 60, 19, 342, 120, 2 }
+};
+
+static const AmigaSfxTableProvider k1AmigaGameSFXTableAmigaProvider = { ARRAYSIZE(k1AmigaGameSFXTableAmiga), k1AmigaGameSFXTableAmiga };
+
diff --git a/devtools/create_kyradat/resources/lok_amiga_english.h b/devtools/create_kyradat/resources/lok_amiga_english.h
new file mode 100644
index 0000000000..c157f4a0b0
--- /dev/null
+++ b/devtools/create_kyradat/resources/lok_amiga_english.h
@@ -0,0 +1,497 @@
+static const char *const k1IntroStringsAmigaEnglish[51] = {
+ "This is a text test - 1",
+ "This is a text test - 2",
+ "Greetings, Kallak...",
+ "...Powerful leader of the Royal Mystics!",
+ "Did I frighten you?",
+ "Malcolm!",
+ "I heard yesterday of your escape.",
+ "And have expected you before now.",
+ "Why would I rush?",
+ "I rule this land!",
+ "Your puny curse restrains me naught.",
+ "So, slay me now!",
+ "I have little magic left.",
+ "I mean to harm you, have no doubt...",
+ "...Now you are stone...",
+ "...Yet I leave your eyes.",
+ "I shed no tears for Kyrandia...",
+ "...But cannot deny you yours.",
+ "Malcolm the Jester has broken free!",
+ "He now controls the Kyragem...",
+ "...source of all magic in Kyrandia!",
+ "",
+ "How dare you trip ME!",
+ "But no, something special for you...",
+ "A humorous hex!",
+ "But I shall give fair warning.",
+ "Don't jump on THAT tree!",
+ "Don't climb up THAT tree little squirrel!",
+ "Boo!",
+ "Tis funnier that way...",
+ "...Is it not?",
+ "Ha ha ha...",
+ "Aren't fingers wonderful?",
+ "It's great to be alive!",
+ "Brandon!",
+ "Grandfather! We did it!",
+ "No! YOU did it!",
+ "Long live King Brandon!",
+ "Long live the Royal Mystics!",
+ "Now, let's go put Kyrandia back together!",
+ "Good idea!",
+ "As my first Royal Proclamation...",
+ "I name sandals as the official footwear of Kyrandia!",
+ "Well done, Brandon!",
+ "The Land no longer weeps...",
+ "And your friends have been restored!",
+ "Dear Brynn...",
+ "Malcolm has broken free!",
+ "Soon he will come for me.",
+ "Please help Brandon...",
+ ""
+};
+
+static const StringListProvider k1IntroStringsAmigaEnglishProvider = { ARRAYSIZE(k1IntroStringsAmigaEnglish), k1IntroStringsAmigaEnglish };
+
+static const char *const k1ItemNamesAmigaEnglish[82] = {
+ "Garnet",
+ "Amethyst",
+ "Aquamarine",
+ "Diamond",
+ "Emerald",
+ "Pearl",
+ "Ruby",
+ "Peridot",
+ "Sapphire",
+ "Opal",
+ "Topaz",
+ "Onyx",
+ "Sunstone",
+ "Moonstone",
+ "Rainbowstone",
+ "Lodestone",
+ "Rose",
+ "Tulip",
+ "Orchid",
+ "Silver Rose",
+ "Silver Statuette",
+ "Silver Coin",
+ "Gold Coin",
+ "Gold Ring",
+ "Royal Chalice",
+ "Pinecone",
+ "Acorn",
+ "Walnut",
+ "Everglowing Fireberries",
+ "Fireberries",
+ "Fish",
+ "Fish Bone",
+ "Mutton Leg",
+ "Bone",
+ "Apple",
+ "Apple Core",
+ "Blueberries",
+ "Mushroom",
+ "Note",
+ "Marble",
+ "Saw",
+ "Ankh",
+ "Feather",
+ "Egg",
+ "Leaf",
+ "Shamrock",
+ "Fallen Star",
+ "Crystal Ball",
+ "Teardrop",
+ "Mirror",
+ "Ice Shard",
+ "Flute",
+ "Hourglass",
+ "Iron Key",
+ "Jade Key",
+ "Obsidion Key",
+ "Red Potion",
+ "Blue Potion",
+ "Yellow Potion",
+ "Green Potion",
+ "Orange Potion",
+ "Purple Potion",
+ "Potion of Rainbows",
+ "Fresh Water",
+ "Salt Water",
+ "Mineral Water",
+ "Magical Water",
+ "Empty Flask",
+ "Scroll",
+ "Parchment scrap",
+ "Red Magestone",
+ "Orange Magestone",
+ "Yellow Magestone",
+ "Green Magestone",
+ "Blue-Green Magestone",
+ "Blue Magestone",
+ "Purple Magestone",
+ "Heavy rock",
+ "Royal Crown",
+ "Royal Sceptre",
+ "Gold key",
+ "Unknown item"
+};
+
+static const StringListProvider k1ItemNamesAmigaEnglishProvider = { ARRAYSIZE(k1ItemNamesAmigaEnglish), k1ItemNamesAmigaEnglish };
+
+static const char *const k1TakenStringsAmigaEnglish[1] = {
+ " taken."
+};
+
+static const StringListProvider k1TakenStringsAmigaEnglishProvider = { ARRAYSIZE(k1TakenStringsAmigaEnglish), k1TakenStringsAmigaEnglish };
+
+static const char *const k1PlacedStringsAmigaEnglish[1] = {
+ " placed."
+};
+
+static const StringListProvider k1PlacedStringsAmigaEnglishProvider = { ARRAYSIZE(k1PlacedStringsAmigaEnglish), k1PlacedStringsAmigaEnglish };
+
+static const char *const k1DroppedStringsAmigaEnglish[1] = {
+ " dropped."
+};
+
+static const StringListProvider k1DroppedStringsAmigaEnglishProvider = { ARRAYSIZE(k1DroppedStringsAmigaEnglish), k1DroppedStringsAmigaEnglish };
+
+static const char *const k1NoDropStringsAmigaEnglish[2] = {
+ "You can't drop any more items in this scene.",
+ "You can't put that there."
+};
+
+static const StringListProvider k1NoDropStringsAmigaEnglishProvider = { ARRAYSIZE(k1NoDropStringsAmigaEnglish), k1NoDropStringsAmigaEnglish };
+
+static const char *const k1PutDownStringAmigaEnglish[1] = {
+ "Maybe I'd better put this down first."
+};
+
+static const StringListProvider k1PutDownStringAmigaEnglishProvider = { ARRAYSIZE(k1PutDownStringAmigaEnglish), k1PutDownStringAmigaEnglish };
+
+static const char *const k1WaitAmuletStringAmigaEnglish[1] = {
+ "I guess I'll have to wait for my Amulet to regain its power."
+};
+
+static const StringListProvider k1WaitAmuletStringAmigaEnglishProvider = { ARRAYSIZE(k1WaitAmuletStringAmigaEnglish), k1WaitAmuletStringAmigaEnglish };
+
+static const char *const k1BlackJewelStringAmigaEnglish[1] = {
+ "It's a jewel, but why is it black?"
+};
+
+static const StringListProvider k1BlackJewelStringAmigaEnglishProvider = { ARRAYSIZE(k1BlackJewelStringAmigaEnglish), k1BlackJewelStringAmigaEnglish };
+
+static const char *const k1HealingTipStringAmigaEnglish[1] = {
+ "Gee, this could come in handy if I get hurt."
+};
+
+static const StringListProvider k1HealingTipStringAmigaEnglishProvider = { ARRAYSIZE(k1HealingTipStringAmigaEnglish), k1HealingTipStringAmigaEnglish };
+
+static const char *const k1PoisonGoneStringAmigaEnglish[2] = {
+ "Amazing!",
+ "The effects of the poison are gone!"
+};
+
+static const StringListProvider k1PoisonGoneStringAmigaEnglishProvider = { ARRAYSIZE(k1PoisonGoneStringAmigaEnglish), k1PoisonGoneStringAmigaEnglish };
+
+static const char *const k1ThePoisonStringsAmigaEnglish[4] = {
+ "The poison...",
+ "I can't breathe...",
+ "I don't feel so good...",
+ "That snake must\rbe poisonous!"
+};
+
+static const StringListProvider k1ThePoisonStringsAmigaEnglishProvider = { ARRAYSIZE(k1ThePoisonStringsAmigaEnglish), k1ThePoisonStringsAmigaEnglish };
+
+static const char *const k1FluteStringsAmigaEnglish[2] = {
+ "Not very impressive sounding.",
+ "That last note sure was high!"
+};
+
+static const StringListProvider k1FluteStringsAmigaEnglishProvider = { ARRAYSIZE(k1FluteStringsAmigaEnglish), k1FluteStringsAmigaEnglish };
+
+static const char *const k1WispJewelStringsAmigaEnglish[3] = {
+ "I'm not really feeling up to it right now.",
+ "I probably should put down my ",
+ ", first."
+};
+
+static const StringListProvider k1WispJewelStringsAmigaEnglishProvider = { ARRAYSIZE(k1WispJewelStringsAmigaEnglish), k1WispJewelStringsAmigaEnglish };
+
+static const char *const k1MagicJewelStringsAmigaEnglish[1] = {
+ "That felt strange."
+};
+
+static const StringListProvider k1MagicJewelStringsAmigaEnglishProvider = { ARRAYSIZE(k1MagicJewelStringsAmigaEnglish), k1MagicJewelStringsAmigaEnglish };
+
+static const char *const k1FlaskFullStringAmigaEnglish[1] = {
+ "This flask is already full."
+};
+
+static const StringListProvider k1FlaskFullStringAmigaEnglishProvider = { ARRAYSIZE(k1FlaskFullStringAmigaEnglish), k1FlaskFullStringAmigaEnglish };
+
+static const char *const k1FullFlaskStringAmigaEnglish[4] = {
+ "The flask is now filled\rwith fresh, sparkling water.",
+ "The flask is now filled\rwith salt water.",
+ "The flask is now filled\rwith mineral water.",
+ "Magic water."
+};
+
+static const StringListProvider k1FullFlaskStringAmigaEnglishProvider = { ARRAYSIZE(k1FullFlaskStringAmigaEnglish), k1FullFlaskStringAmigaEnglish };
+
+static const char *const k1OutroHomeStringAmigaEnglish[1] = {
+ "Home"
+};
+
+static const StringListProvider k1OutroHomeStringAmigaEnglishProvider = { ARRAYSIZE(k1OutroHomeStringAmigaEnglish), k1OutroHomeStringAmigaEnglish };
+
+static const char *const k1VeryCleverStringAmigaEnglish[1] = {
+ "Very clever! But your feeble efforts are futile."
+};
+
+static const StringListProvider k1VeryCleverStringAmigaEnglishProvider = { ARRAYSIZE(k1VeryCleverStringAmigaEnglish), k1VeryCleverStringAmigaEnglish };
+
+static const char *const k1GUIStringsAmigaEnglish[60] = {
+ "The Legend of Kyrandia",
+ "Load a game",
+ "Save this game",
+ "Game controls",
+ "Quit playing",
+ "Resume game",
+ "Game Controls",
+ "Which game would you like to reload?",
+ "Select a position to save to:",
+ "[ EMPTY SLOT ]",
+ "Cancel",
+ "Enter a description of your saved game:",
+ "Save",
+ "Rest in peace, Brandon.",
+ "Are you sure you want to quit playing?",
+ "XXX",
+ "",
+ "",
+ "",
+ "",
+ "",
+ "",
+ "",
+ "XXX",
+ "",
+ "",
+ "",
+ "",
+ "",
+ "",
+ "",
+ "XXXXXXX",
+ "",
+ "",
+ "",
+ "",
+ "",
+ "XXXXXXXXX",
+ "",
+ "",
+ "",
+ "",
+ "Main menu",
+ "on",
+ "off",
+ "Yes",
+ "No",
+ "",
+ "\x01""Y""\xD6",
+ "\x01""Y""\xDE",
+ "\x01""Y""\xE4",
+ "\x01""Y""\xEC",
+ "\x01""Y""\xF2",
+ "\x01""Y""\xD6",
+ "\x01""Y""\xE4",
+ "\x01""Y""\xEC",
+ "\x01""Y""\xFA""Walk speed ",
+ "Text speed ",
+ "Music is ",
+ "Sounds are "
+};
+
+static const StringListProvider k1GUIStringsAmigaEnglishProvider = { ARRAYSIZE(k1GUIStringsAmigaEnglish), k1GUIStringsAmigaEnglish };
+
+static const char *const k1NewGameStringAmigaEnglish[1] = {
+ "[ START A NEW GAME ]"
+};
+
+static const StringListProvider k1NewGameStringAmigaEnglishProvider = { ARRAYSIZE(k1NewGameStringAmigaEnglish), k1NewGameStringAmigaEnglish };
+
+static const char *const k1ConfigStringsAmigaEnglish[6] = {
+ "slowest",
+ "slow",
+ "normal",
+ "fast",
+ "fastest",
+ "clickable"
+};
+
+static const StringListProvider k1ConfigStringsAmigaEnglishProvider = { ARRAYSIZE(k1ConfigStringsAmigaEnglish), k1ConfigStringsAmigaEnglish };
+
+static const byte k1CreditsStringsAmigaEnglish[1228] = {
+ 0x05, 0x46, 0x61, 0x62, 0x6C, 0x65, 0x73, 0x20,
+ 0x26, 0x20, 0x46, 0x69, 0x65, 0x6E, 0x64, 0x73,
+ 0x0D, 0x05, 0x42, 0x6F, 0x6F, 0x6B, 0x20, 0x49,
+ 0x0D, 0x05, 0x54, 0x48, 0x45, 0x20, 0x4C, 0x45,
+ 0x47, 0x45, 0x4E, 0x44, 0x20, 0x4F, 0x46, 0x20,
+ 0x4B, 0x59, 0x52, 0x41, 0x4E, 0x44, 0x49, 0x41,
+ 0x0D, 0x0D, 0x05, 0x50, 0x75, 0x62, 0x6C, 0x69,
+ 0x73, 0x68, 0x65, 0x64, 0x20, 0x62, 0x79, 0x0D,
+ 0x05, 0x57, 0x65, 0x73, 0x74, 0x77, 0x6F, 0x6F,
+ 0x64, 0x20, 0x53, 0x74, 0x75, 0x64, 0x69, 0x6F,
+ 0x73, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D,
+ 0x0D, 0x03, 0x44, 0x69, 0x72, 0x65, 0x63, 0x74,
+ 0x6F, 0x72, 0x3A, 0x04, 0x42, 0x72, 0x65, 0x74,
+ 0x74, 0x20, 0x57, 0x2E, 0x20, 0x53, 0x70, 0x65,
+ 0x72, 0x72, 0x79, 0x0D, 0x0D, 0x03, 0x44, 0x65,
+ 0x73, 0x69, 0x67, 0x6E, 0x3A, 0x04, 0x4D, 0x69,
+ 0x63, 0x68, 0x61, 0x65, 0x6C, 0x20, 0x4C, 0x65,
+ 0x67, 0x67, 0x0D, 0x04, 0x52, 0x69, 0x63, 0x6B,
+ 0x20, 0x50, 0x61, 0x72, 0x6B, 0x73, 0x0D, 0x04,
+ 0x50, 0x61, 0x75, 0x6C, 0x20, 0x53, 0x2E, 0x20,
+ 0x4D, 0x75, 0x64, 0x72, 0x61, 0x0D, 0x0D, 0x03,
+ 0x4C, 0x65, 0x61, 0x64, 0x20, 0x50, 0x72, 0x6F,
+ 0x67, 0x72, 0x61, 0x6D, 0x6D, 0x65, 0x72, 0x3A,
+ 0x04, 0x4D, 0x69, 0x63, 0x68, 0x61, 0x65, 0x6C,
+ 0x20, 0x4C, 0x65, 0x67, 0x67, 0x0D, 0x0D, 0x03,
+ 0x53, 0x63, 0x72, 0x69, 0x70, 0x74, 0x20, 0x50,
+ 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x6D, 0x65,
+ 0x72, 0x3A, 0x04, 0x53, 0x63, 0x6F, 0x74, 0x74,
+ 0x20, 0x42, 0x6F, 0x77, 0x65, 0x6E, 0x0D, 0x0D,
+ 0x03, 0x41, 0x6D, 0x69, 0x67, 0x61, 0x20, 0x50,
+ 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x6D, 0x65,
+ 0x72, 0x3A, 0x04, 0x42, 0x69, 0x6C, 0x6C, 0x20,
+ 0x53, 0x74, 0x6F, 0x6B, 0x65, 0x73, 0x0D, 0x0D,
+ 0x03, 0x49, 0x6E, 0x74, 0x72, 0x6F, 0x20, 0x26,
+ 0x20, 0x46, 0x69, 0x6E, 0x61, 0x6C, 0x65, 0x3A,
+ 0x04, 0x43, 0x68, 0x72, 0x69, 0x73, 0x74, 0x6F,
+ 0x70, 0x68, 0x65, 0x72, 0x20, 0x59, 0x61, 0x74,
+ 0x65, 0x73, 0x0D, 0x0D, 0x03, 0x41, 0x72, 0x74,
+ 0x20, 0x26, 0x20, 0x47, 0x72, 0x61, 0x70, 0x68,
+ 0x69, 0x63, 0x73, 0x3A, 0x04, 0x52, 0x69, 0x63,
+ 0x6B, 0x20, 0x50, 0x61, 0x72, 0x6B, 0x73, 0x0D,
+ 0x04, 0x52, 0x65, 0x6E, 0x20, 0x4F, 0x6C, 0x73,
+ 0x65, 0x6E, 0x0D, 0x04, 0x4C, 0x6F, 0x75, 0x69,
+ 0x73, 0x65, 0x20, 0x53, 0x61, 0x6E, 0x64, 0x6F,
+ 0x76, 0x61, 0x6C, 0x0D, 0x04, 0x4A, 0x6F, 0x73,
+ 0x65, 0x70, 0x68, 0x20, 0x48, 0x65, 0x77, 0x69,
+ 0x74, 0x74, 0x20, 0x49, 0x56, 0x0D, 0x04, 0x4A,
+ 0x75, 0x64, 0x69, 0x74, 0x68, 0x20, 0x50, 0x65,
+ 0x74, 0x65, 0x72, 0x73, 0x6F, 0x6E, 0x0D, 0x04,
+ 0x41, 0x61, 0x72, 0x6F, 0x6E, 0x20, 0x50, 0x6F,
+ 0x77, 0x65, 0x6C, 0x6C, 0x0D, 0x04, 0x45, 0x6C,
+ 0x69, 0x65, 0x20, 0x41, 0x72, 0x61, 0x62, 0x69,
+ 0x61, 0x6E, 0x0D, 0x04, 0x45, 0x72, 0x69, 0x63,
+ 0x20, 0x53, 0x68, 0x75, 0x6C, 0x74, 0x73, 0x0D,
+ 0x0D, 0x03, 0x41, 0x75, 0x64, 0x69, 0x6F, 0x20,
+ 0x44, 0x69, 0x72, 0x65, 0x63, 0x74, 0x6F, 0x72,
+ 0x3A, 0x04, 0x50, 0x61, 0x75, 0x6C, 0x20, 0x53,
+ 0x2E, 0x20, 0x4D, 0x75, 0x64, 0x72, 0x61, 0x0D,
+ 0x0D, 0x03, 0x4D, 0x75, 0x73, 0x69, 0x63, 0x3A,
+ 0x04, 0x46, 0x72, 0x61, 0x6E, 0x6B, 0x20, 0x4B,
+ 0x6C, 0x65, 0x70, 0x61, 0x63, 0x6B, 0x69, 0x0D,
+ 0x0D, 0x03, 0x53, 0x6F, 0x75, 0x6E, 0x64, 0x20,
+ 0x45, 0x66, 0x66, 0x65, 0x63, 0x74, 0x73, 0x3A,
+ 0x04, 0x44, 0x77, 0x69, 0x67, 0x68, 0x74, 0x20,
+ 0x4F, 0x6B, 0x61, 0x68, 0x61, 0x72, 0x61, 0x0D,
+ 0x0D, 0x03, 0x57, 0x72, 0x69, 0x74, 0x65, 0x72,
+ 0x3A, 0x04, 0x22, 0x43, 0x6F, 0x63, 0x6F, 0x22,
+ 0x0D, 0x0D, 0x03, 0x51, 0x75, 0x61, 0x6C, 0x69,
+ 0x74, 0x79, 0x20, 0x41, 0x73, 0x73, 0x75, 0x72,
+ 0x61, 0x6E, 0x63, 0x65, 0x3A, 0x04, 0x47, 0x6C,
+ 0x65, 0x6E, 0x6E, 0x20, 0x53, 0x70, 0x65, 0x72,
+ 0x72, 0x79, 0x0D, 0x04, 0x4D, 0x61, 0x74, 0x74,
+ 0x20, 0x43, 0x6F, 0x6C, 0x6C, 0x69, 0x6E, 0x73,
+ 0x0D, 0x04, 0x42, 0x69, 0x6C, 0x6C, 0x20, 0x46,
+ 0x6F, 0x73, 0x74, 0x65, 0x72, 0x0D, 0x04, 0x4D,
+ 0x69, 0x63, 0x68, 0x61, 0x65, 0x6C, 0x20, 0x4C,
+ 0x69, 0x67, 0x68, 0x74, 0x6E, 0x65, 0x72, 0x0D,
+ 0x04, 0x4D, 0x69, 0x63, 0x68, 0x61, 0x65, 0x6C,
+ 0x20, 0x47, 0x61, 0x74, 0x65, 0x72, 0x0D, 0x04,
+ 0x45, 0x75, 0x67, 0x65, 0x6E, 0x65, 0x20, 0x4D,
+ 0x61, 0x72, 0x74, 0x69, 0x6E, 0x0D, 0x04, 0x4D,
+ 0x69, 0x63, 0x68, 0x61, 0x65, 0x6C, 0x20, 0x47,
+ 0x6C, 0x6F, 0x73, 0x65, 0x63, 0x6B, 0x69, 0x0D,
+ 0x04, 0x4A, 0x75, 0x73, 0x74, 0x69, 0x6E, 0x20,
+ 0x4E, 0x6F, 0x72, 0x72, 0x0D, 0x04, 0x54, 0x6F,
+ 0x70, 0x20, 0x53, 0x74, 0x61, 0x72, 0x20, 0x54,
+ 0x65, 0x73, 0x74, 0x69, 0x6E, 0x67, 0x0D, 0x04,
+ 0x54, 0x65, 0x73, 0x74, 0x69, 0x6E, 0x67, 0x20,
+ 0x31, 0x2C, 0x32, 0x2C, 0x33, 0x0D, 0x0D, 0x0D,
+ 0x0D, 0x0D, 0x05, 0x53, 0x70, 0x65, 0x63, 0x69,
+ 0x61, 0x6C, 0x20, 0x54, 0x68, 0x61, 0x6E, 0x6B,
+ 0x73, 0x20, 0x74, 0x6F, 0x0D, 0x05, 0x4C, 0x79,
+ 0x6C, 0x65, 0x20, 0x4A, 0x2E, 0x20, 0x48, 0x61,
+ 0x6C, 0x6C, 0x0D, 0x05, 0x44, 0x61, 0x76, 0x69,
+ 0x64, 0x20, 0x42, 0x69, 0x73, 0x68, 0x6F, 0x70,
+ 0x0D, 0x05, 0x22, 0x54, 0x68, 0x65, 0x20, 0x44,
+ 0x6F, 0x63, 0x22, 0x0D, 0x05, 0x61, 0x6E, 0x64,
+ 0x0D, 0x05, 0x46, 0x69, 0x72, 0x65, 0x62, 0x65,
+ 0x72, 0x72, 0x79, 0x20, 0x47, 0x72, 0x65, 0x65,
+ 0x6E, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D,
+ 0x0D, 0x05, 0x43, 0x41, 0x53, 0x54, 0x20, 0x4F,
+ 0x46, 0x20, 0x43, 0x48, 0x41, 0x52, 0x41, 0x43,
+ 0x54, 0x45, 0x52, 0x53, 0x0D, 0x0D, 0x05, 0x4D,
+ 0x61, 0x6C, 0x63, 0x6F, 0x6C, 0x6D, 0x20, 0x74,
+ 0x68, 0x65, 0x20, 0x4A, 0x65, 0x73, 0x74, 0x65,
+ 0x72, 0x0D, 0x05, 0x42, 0x72, 0x61, 0x6E, 0x64,
+ 0x6F, 0x6E, 0x20, 0x74, 0x68, 0x65, 0x20, 0x42,
+ 0x6F, 0x6C, 0x64, 0x0D, 0x05, 0x42, 0x72, 0x61,
+ 0x6E, 0x64, 0x79, 0x77, 0x69, 0x6E, 0x65, 0x20,
+ 0x61, 0x6E, 0x64, 0x20, 0x44, 0x61, 0x72, 0x6D,
+ 0x0D, 0x05, 0x50, 0x72, 0x69, 0x65, 0x73, 0x74,
+ 0x65, 0x73, 0x73, 0x20, 0x42, 0x72, 0x79, 0x6E,
+ 0x6E, 0x0D, 0x05, 0x5A, 0x61, 0x6E, 0x74, 0x68,
+ 0x69, 0x61, 0x2C, 0x20, 0x4C, 0x61, 0x64, 0x79,
+ 0x20, 0x6F, 0x66, 0x20, 0x41, 0x6C, 0x63, 0x68,
+ 0x65, 0x6D, 0x79, 0x0D, 0x05, 0x48, 0x65, 0x72,
+ 0x6D, 0x61, 0x6E, 0x20, 0x74, 0x68, 0x65, 0x20,
+ 0x48, 0x61, 0x6E, 0x64, 0x79, 0x6D, 0x61, 0x6E,
+ 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x05,
+ 0x41, 0x6E, 0x79, 0x20, 0x63, 0x68, 0x61, 0x72,
+ 0x61, 0x63, 0x74, 0x65, 0x72, 0x73, 0x20, 0x69,
+ 0x6E, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x67,
+ 0x61, 0x6D, 0x65, 0x20, 0x77, 0x68, 0x6F, 0x20,
+ 0x62, 0x65, 0x61, 0x72, 0x0D, 0x05, 0x72, 0x65,
+ 0x73, 0x65, 0x6D, 0x62, 0x6C, 0x61, 0x6E, 0x63,
+ 0x65, 0x20, 0x74, 0x6F, 0x20, 0x70, 0x65, 0x72,
+ 0x73, 0x6F, 0x6E, 0x73, 0x20, 0x6C, 0x69, 0x76,
+ 0x69, 0x6E, 0x67, 0x20, 0x6F, 0x72, 0x0D, 0x05,
+ 0x64, 0x65, 0x61, 0x64, 0x20, 0x61, 0x72, 0x65,
+ 0x20, 0x70, 0x75, 0x72, 0x65, 0x6C, 0x79, 0x20,
+ 0x63, 0x6F, 0x69, 0x6E, 0x63, 0x69, 0x64, 0x65,
+ 0x6E, 0x74, 0x61, 0x6C, 0x2E, 0x0D, 0x0D, 0x0D,
+ 0x0D, 0x0D, 0x05, 0x4D, 0x61, 0x78, 0x54, 0x72,
+ 0x61, 0x78, 0xE2, 0x20, 0x6D, 0x75, 0x73, 0x69,
+ 0x63, 0x20, 0x73, 0x6F, 0x66, 0x74, 0x77, 0x61,
+ 0x72, 0x65, 0x0D, 0x05, 0x20, 0xE3, 0x20, 0x31,
+ 0x39, 0x39, 0x32, 0x20, 0x53, 0x79, 0x6C, 0x76,
+ 0x61, 0x6E, 0x20, 0x54, 0x65, 0x63, 0x68, 0x6E,
+ 0x69, 0x63, 0x61, 0x6C, 0x20, 0x41, 0x72, 0x74,
+ 0x73, 0x0D, 0x05, 0x4C, 0x69, 0x63, 0x65, 0x6E,
+ 0x73, 0x65, 0x64, 0x20, 0x62, 0x79, 0x20, 0x74,
+ 0x68, 0x65, 0x20, 0x44, 0x72, 0x65, 0x61, 0x6D,
+ 0x65, 0x72, 0x73, 0x20, 0x47, 0x75, 0x69, 0x6C,
+ 0x64, 0x2C, 0x20, 0x49, 0x6E, 0x63, 0x2E, 0x0D,
+ 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x05, 0x43, 0x6F,
+ 0x70, 0x79, 0x72, 0x69, 0x67, 0x68, 0x74, 0x20,
+ 0x28, 0x43, 0x29, 0x20, 0x31, 0x39, 0x39, 0x32,
+ 0x2C, 0x20, 0x57, 0x65, 0x73, 0x74, 0x77, 0x6F,
+ 0x6F, 0x64, 0x20, 0x53, 0x74, 0x75, 0x64, 0x69,
+ 0x6F, 0x73, 0x2C, 0x20, 0x49, 0x6E, 0x63, 0x2E,
+ 0x0D, 0x05, 0x41, 0x6C, 0x6C, 0x20, 0x72, 0x69,
+ 0x67, 0x68, 0x74, 0x73, 0x20, 0x72, 0x65, 0x73,
+ 0x65, 0x72, 0x76, 0x65, 0x64, 0x2E, 0x0D, 0x0D,
+ 0x0D, 0x0D, 0x00, 0x00
+};
+
+static const ByteProvider k1CreditsStringsAmigaEnglishProvider = { ARRAYSIZE(k1CreditsStringsAmigaEnglish), k1CreditsStringsAmigaEnglish };
+
diff --git a/devtools/create_kyradat/resources/lok_amiga_german.h b/devtools/create_kyradat/resources/lok_amiga_german.h
new file mode 100644
index 0000000000..ff9090ab2a
--- /dev/null
+++ b/devtools/create_kyradat/resources/lok_amiga_german.h
@@ -0,0 +1,492 @@
+static const char *const k1IntroStringsAmigaGerman[51] = {
+ "This is a text test - 1",
+ "This is a text test - 2",
+ "Sei gegr""\x81\xE1""t, Kallak...",
+ "...M""\x84""chtiger Anf""\x81""hrer der k""\x94""niglichen Mystiker!",
+ "Habe ich dich erschreckt?",
+ "Malcolm!",
+ "Ich habe gestern von deiner Flucht geh""\x94""rt.",
+ "Ich habe dich fr""\x81""her erwartet.",
+ "Warum sollte ich mich beeilen?",
+ "Ich herrsche ""\x81""ber dieses Land!",
+ "Dein mickriger Fluch h""\x84""lt mich nicht zur""\x81""ck.",
+ "So, erschlag mich doch!",
+ "Ich habe nur noch wenig Magie ""\x81""brig.",
+ "Ich werde dir zu Leibe r""\x81""cken, zweifle blo""\xE1"" nicht daran...",
+ "...du bist jetzt aus Stein...",
+ "...Ich lassen dir allein deine Augen.",
+ "F""\x81""r Kyrandia vergie""\xE1""e ich nicht eine Tr""\x84""ne...",
+ "...aber deine will ich dir nicht nehmen.",
+ "Malcolm der Hofnarr ist ausgebrochen!",
+ "Er beherrscht nun den Kyragem...",
+ "...die Quelle aller Magie in Kyrandia!",
+ "",
+ "Wie kannst du es wagen, MICH umzuwerfen!",
+ "Nicht doch, etwas Besonderes f""\x81""r dich...",
+ "Was f""\x81""r ein l""\x84""cherlicher Fluch!",
+ "Ich warne dich vorher.",
+ "Springe nicht auf DIESEN Baum!",
+ "Klettre nicht auf diesen Baum, kleines Eichh""\x94""rnchen!",
+ "Buuh!",
+ "So ist es viel lustiger...",
+ "...nicht wahr?",
+ "Ha ha ha...",
+ "Sind Finger nicht 'was Tolles?",
+ "Es ist gro""\xE1""artig, am Leben zu sein!",
+ "Brandon!",
+ "Gro""\xE1""vater! Wir haben es geschafft!",
+ "Nein! DU hast es geschafft!",
+ "Lang lebe K""\x94""nig Brandon!",
+ "Lang leben die k""\x94""niglichen Mystiker!",
+ "Bauen wir Kyrandia wieder auf!",
+ "Eine gute Idee!",
+ "Als meine erste k""\x94""nigliche Proklamation,...",
+ "...erkl""\x84""re ich Sandalen zur offiziellen Fu""\xE1""bekleidung Kyrandias!",
+ "Sehr weise, Brandon!",
+ "Das Land ist nicht l""\x84""nger in Trauer!",
+ "Und deine Freunde sind gerettet.",
+ "Liebe Brynn...",
+ "Malcolm ist ausgebrochen!",
+ "Er wird bald zu mir kommen.",
+ "Bitte hilf Brandon...",
+ ""
+};
+
+static const StringListProvider k1IntroStringsAmigaGermanProvider = { ARRAYSIZE(k1IntroStringsAmigaGerman), k1IntroStringsAmigaGerman };
+
+static const char *const k1ItemNamesAmigaGerman[82] = {
+ "Granat",
+ "Amethyst",
+ "Aquamarin",
+ "Diamant",
+ "Smaragd",
+ "Perle",
+ "Rubin",
+ "Peridot",
+ "Saphir",
+ "Opal",
+ "Topas",
+ "Onyx",
+ "Sonnenstein",
+ "Mondstein",
+ "Regenbogenstein",
+ "Magnetstein",
+ "Rose",
+ "Tulpe",
+ "Orchidee",
+ "Silberne Rose",
+ "Silberne Statuette",
+ "Silberm""\x81""nze",
+ "Goldm""\x81""nze",
+ "Goldring",
+ "Der Kelch des K""\x94""nigs",
+ "Kienapfel",
+ "Eichel",
+ "Walnu""\xE1",
+ "Immerleuchtende Feuerbeeren",
+ "Feuerbeeren",
+ "Fisch",
+ "Fischgr""\x84""te",
+ "Hammelkeule",
+ "Knochen",
+ "Apfel",
+ "Apfelgriebsch",
+ "Heidelbeeren",
+ "Pilz",
+ "Notiz",
+ "Murmel",
+ "S""\x84""ge",
+ "Henkelkreuz",
+ "Feder",
+ "Ei",
+ "Blatt",
+ "Kleeblatt",
+ "Sternschnuppe",
+ "Kristallkugel",
+ "Tr""\x84""ne",
+ "Spiegel",
+ "Eisst""\x81""ck",
+ "Fl""\x94""te",
+ "Sanduhr",
+ "Eisenschl""\x81""ssel",
+ "Jadeschl""\x81""ssel",
+ "Obsidianschl""\x81""ssel",
+ "Roter Trank",
+ "Blauer Trank",
+ "Gelber Trank",
+ "Gr""\x81""ner Trank",
+ "Oranger Trank",
+ "Violetter Trank",
+ "Regenbogentrank",
+ "S""\x81\xE1""wasser",
+ "Salzwasser",
+ "Mineralwasser",
+ "Magisches Wasser",
+ "Leere Flasche",
+ "Schriftrolle",
+ "Pergamentfetzen",
+ "Roter Weisenstein",
+ "Oranger Weisenstein",
+ "Gelber Weisenstein",
+ "Gr""\x81""ner Weisenstein",
+ "T""\x81""rkiser Weisenstein",
+ "Blauer Weisenstein",
+ "Violetter Weisenstein",
+ "Schwerer Stein",
+ "K""\x94""nigliche Krone",
+ "K""\x94""nigliches Zepter",
+ "Goldschl""\x81""ssel",
+ "Unbekannter Gegenstand"
+};
+
+static const StringListProvider k1ItemNamesAmigaGermanProvider = { ARRAYSIZE(k1ItemNamesAmigaGerman), k1ItemNamesAmigaGerman };
+
+static const char *const k1TakenStringsAmigaGerman[1] = {
+ " aufgenommen."
+};
+
+static const StringListProvider k1TakenStringsAmigaGermanProvider = { ARRAYSIZE(k1TakenStringsAmigaGerman), k1TakenStringsAmigaGerman };
+
+static const char *const k1PlacedStringsAmigaGerman[1] = {
+ " abgelegt."
+};
+
+static const StringListProvider k1PlacedStringsAmigaGermanProvider = { ARRAYSIZE(k1PlacedStringsAmigaGerman), k1PlacedStringsAmigaGerman };
+
+static const char *const k1DroppedStringsAmigaGerman[1] = {
+ " fallengelassen."
+};
+
+static const StringListProvider k1DroppedStringsAmigaGermanProvider = { ARRAYSIZE(k1DroppedStringsAmigaGerman), k1DroppedStringsAmigaGerman };
+
+static const char *const k1NoDropStringsAmigaGerman[2] = {
+ "Hier kann nichts mehr abgelegt werden.",
+ "Das kann hier nicht abgelegt werden."
+};
+
+static const StringListProvider k1NoDropStringsAmigaGermanProvider = { ARRAYSIZE(k1NoDropStringsAmigaGerman), k1NoDropStringsAmigaGerman };
+
+static const char *const k1PutDownStringAmigaGerman[1] = {
+ "Vielleicht sollte ich es erst hinlegen."
+};
+
+static const StringListProvider k1PutDownStringAmigaGermanProvider = { ARRAYSIZE(k1PutDownStringAmigaGerman), k1PutDownStringAmigaGerman };
+
+static const char *const k1WaitAmuletStringAmigaGerman[1] = {
+ "I nehme an, ich mu""\xE1"" warten, bis mein Amulett seine Kraft wiedererlangt."
+};
+
+static const StringListProvider k1WaitAmuletStringAmigaGermanProvider = { ARRAYSIZE(k1WaitAmuletStringAmigaGerman), k1WaitAmuletStringAmigaGerman };
+
+static const char *const k1BlackJewelStringAmigaGerman[1] = {
+ "Es ist ein Edelstein, aber warum ist er schwarz?"
+};
+
+static const StringListProvider k1BlackJewelStringAmigaGermanProvider = { ARRAYSIZE(k1BlackJewelStringAmigaGerman), k1BlackJewelStringAmigaGerman };
+
+static const char *const k1HealingTipStringAmigaGerman[1] = {
+ "Mann, das kann ganz n""\x81""tzlich sein, falls ich mich verletze!"
+};
+
+static const StringListProvider k1HealingTipStringAmigaGermanProvider = { ARRAYSIZE(k1HealingTipStringAmigaGerman), k1HealingTipStringAmigaGerman };
+
+static const char *const k1PoisonGoneStringAmigaGerman[2] = {
+ "Erstaunlich!",
+ "Die Wirkung des Giftes hat nachgelassen!"
+};
+
+static const StringListProvider k1PoisonGoneStringAmigaGermanProvider = { ARRAYSIZE(k1PoisonGoneStringAmigaGerman), k1PoisonGoneStringAmigaGerman };
+
+static const char *const k1ThePoisonStringsAmigaGerman[4] = {
+ "Das Gift...",
+ "Ich kann nicht atmen...",
+ "Ich f""\x81""hle mich nicht besonders wohl...",
+ "Die Schlange mu""\xE1"" \rgiftig gewesen sein!"
+};
+
+static const StringListProvider k1ThePoisonStringsAmigaGermanProvider = { ARRAYSIZE(k1ThePoisonStringsAmigaGerman), k1ThePoisonStringsAmigaGerman };
+
+static const char *const k1FluteStringsAmigaGerman[2] = {
+ "Klingt nicht besonders beeindruckend.",
+ "Die letzte Note war hoch!"
+};
+
+static const StringListProvider k1FluteStringsAmigaGermanProvider = { ARRAYSIZE(k1FluteStringsAmigaGerman), k1FluteStringsAmigaGerman };
+
+static const char *const k1WispJewelStringsAmigaGerman[3] = {
+ "Im Moment f""\x81""hle ich mich dazu nicht in der Lage.",
+ "Ich mu""\xE1"" wahrscheinlich erst mein(e)...",
+ "ablegen."
+};
+
+static const StringListProvider k1WispJewelStringsAmigaGermanProvider = { ARRAYSIZE(k1WispJewelStringsAmigaGerman), k1WispJewelStringsAmigaGerman };
+
+static const char *const k1MagicJewelStringsAmigaGerman[1] = {
+ "Das war eigenartig."
+};
+
+static const StringListProvider k1MagicJewelStringsAmigaGermanProvider = { ARRAYSIZE(k1MagicJewelStringsAmigaGerman), k1MagicJewelStringsAmigaGerman };
+
+static const char *const k1FlaskFullStringAmigaGerman[1] = {
+ "Die Flasche ist bereits voll."
+};
+
+static const StringListProvider k1FlaskFullStringAmigaGermanProvider = { ARRAYSIZE(k1FlaskFullStringAmigaGerman), k1FlaskFullStringAmigaGerman };
+
+static const char *const k1FullFlaskStringAmigaGerman[4] = {
+ "Die Flasche ist jetzt mit \rfrischem, klarem Wasser gef""\x81""llt.",
+ "Die Flasche ist jetzt mit \rSalzwasser gef""\x81""llt.",
+ "Die Flasche ist jetzt mit \rMineralwasser gef""\x81""llt.",
+ "Magisches Wasser."
+};
+
+static const StringListProvider k1FullFlaskStringAmigaGermanProvider = { ARRAYSIZE(k1FullFlaskStringAmigaGerman), k1FullFlaskStringAmigaGerman };
+
+static const char *const k1OutroHomeStringAmigaGerman[1] = {
+ "Ab nach Hause"
+};
+
+static const StringListProvider k1OutroHomeStringAmigaGermanProvider = { ARRAYSIZE(k1OutroHomeStringAmigaGerman), k1OutroHomeStringAmigaGerman };
+
+static const char *const k1VeryCleverStringAmigaGerman[1] = {
+ "Sehr clever! Aber nichtige Versuche sind zum Scheitern verurteilt."
+};
+
+static const StringListProvider k1VeryCleverStringAmigaGermanProvider = { ARRAYSIZE(k1VeryCleverStringAmigaGerman), k1VeryCleverStringAmigaGerman };
+
+static const char *const k1GUIStringsAmigaGerman[49] = {
+ "Die Legende von Kyrandia",
+ "Ein Spiel laden",
+ "Dieses Spiel sichern",
+ "Spielsteuerungen",
+ "Spiel beenden",
+ "Spiel wieder aufnehmen",
+ "Spielsteuerungen",
+ "Welches Spiel soll noch einmal geladen werden?",
+ "W""\x84""hlen Sie den Platz zum Sichern aus.",
+ "[ LEERER PLATZ ]",
+ "Abbrechen",
+ "Beschreibung des gesicherten Spiels eingeben.",
+ "Sichern",
+ "Ruhe in Frieden, Brandon.",
+ "Soll das Spiel wirklich beendet werden?",
+ "XXXXX",
+ "",
+ "",
+ "",
+ "",
+ "",
+ "",
+ "XXXXX",
+ "",
+ "",
+ "",
+ "",
+ "",
+ "",
+ "XXXXXXXXXXXXXXXXX",
+ "XXXXXXXXXXXXXXXXX",
+ "Hauptmen""\x81",
+ "An",
+ "Aus",
+ "Ja",
+ "Nein",
+ "",
+ "\x01""[""\xA2",
+ "\x01""[""\xB2",
+ "\x01""[""\xBA",
+ "\x01""[""\xC2",
+ "\x01""[""\xCA",
+ "\x01""[""\xA2",
+ "\x01""[""\xBA",
+ "\x01""[""\xC2",
+ "\x01""[""\xDA""Schrittempo",
+ "Textgeschwindigkeit",
+ "Die Musik ist",
+ "Die Soundeffekte sind"
+};
+
+static const StringListProvider k1GUIStringsAmigaGermanProvider = { ARRAYSIZE(k1GUIStringsAmigaGerman), k1GUIStringsAmigaGerman };
+
+static const char *const k1NewGameStringAmigaGerman[1] = {
+ "[ EIN NEUES SPIEL ANFANGEN ]"
+};
+
+static const StringListProvider k1NewGameStringAmigaGermanProvider = { ARRAYSIZE(k1NewGameStringAmigaGerman), k1NewGameStringAmigaGerman };
+
+static const char *const k1ConfigStringsAmigaGerman[6] = {
+ "am langsamsten",
+ "langsam",
+ "normal",
+ "schnell",
+ "am schnellsten",
+ "anklickbar"
+};
+
+static const StringListProvider k1ConfigStringsAmigaGermanProvider = { ARRAYSIZE(k1ConfigStringsAmigaGerman), k1ConfigStringsAmigaGerman };
+
+static const byte k1CreditsStringsAmigaGerman[1275] = {
+ 0x05, 0x46, 0x61, 0x62, 0x6C, 0x65, 0x73, 0x20,
+ 0x26, 0x20, 0x46, 0x69, 0x65, 0x6E, 0x64, 0x73,
+ 0x0D, 0x05, 0x42, 0x6F, 0x6F, 0x6B, 0x20, 0x49,
+ 0x0D, 0x05, 0x54, 0x48, 0x45, 0x20, 0x4C, 0x45,
+ 0x47, 0x45, 0x4E, 0x44, 0x20, 0x4F, 0x46, 0x20,
+ 0x4B, 0x59, 0x52, 0x41, 0x4E, 0x44, 0x49, 0x41,
+ 0x0D, 0x0D, 0x05, 0x56, 0x65, 0x72, 0x94, 0x66,
+ 0x66, 0x65, 0x6E, 0x74, 0x6C, 0x69, 0x63, 0x68,
+ 0x74, 0x20, 0x76, 0x6F, 0x6E, 0x0D, 0x05, 0x57,
+ 0x65, 0x73, 0x74, 0x77, 0x6F, 0x6F, 0x64, 0x20,
+ 0x53, 0x74, 0x75, 0x64, 0x69, 0x6F, 0x73, 0x0D,
+ 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x03,
+ 0x52, 0x65, 0x67, 0x69, 0x65, 0x3A, 0x04, 0x42,
+ 0x72, 0x65, 0x74, 0x74, 0x20, 0x57, 0x2E, 0x20,
+ 0x53, 0x70, 0x65, 0x72, 0x72, 0x79, 0x0D, 0x0D,
+ 0x03, 0x44, 0x65, 0x73, 0x69, 0x67, 0x6E, 0x3A,
+ 0x04, 0x4D, 0x69, 0x63, 0x68, 0x61, 0x65, 0x6C,
+ 0x20, 0x4C, 0x65, 0x67, 0x67, 0x0D, 0x04, 0x52,
+ 0x69, 0x63, 0x6B, 0x20, 0x50, 0x61, 0x72, 0x6B,
+ 0x73, 0x0D, 0x04, 0x50, 0x61, 0x75, 0x6C, 0x20,
+ 0x53, 0x2E, 0x20, 0x4D, 0x75, 0x64, 0x72, 0x61,
+ 0x0D, 0x0D, 0x03, 0x50, 0x72, 0x6F, 0x67, 0x72,
+ 0x61, 0x6D, 0x6D, 0x69, 0x65, 0x72, 0x75, 0x6E,
+ 0x67, 0x73, 0x6C, 0x65, 0x69, 0x74, 0x75, 0x6E,
+ 0x67, 0x3A, 0x04, 0x4D, 0x69, 0x63, 0x68, 0x61,
+ 0x65, 0x6C, 0x20, 0x4C, 0x65, 0x67, 0x67, 0x0D,
+ 0x0D, 0x03, 0x54, 0x65, 0x78, 0x74, 0x70, 0x72,
+ 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x6D, 0x69, 0x65,
+ 0x72, 0x65, 0x72, 0x3A, 0x04, 0x53, 0x63, 0x6F,
+ 0x74, 0x74, 0x20, 0x42, 0x6F, 0x77, 0x65, 0x6E,
+ 0x0D, 0x0D, 0x03, 0x41, 0x6D, 0x69, 0x67, 0x61,
+ 0x2D, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D,
+ 0x6D, 0x69, 0x65, 0x72, 0x65, 0x72, 0x3A, 0x04,
+ 0x42, 0x69, 0x6C, 0x6C, 0x20, 0x53, 0x74, 0x6F,
+ 0x6B, 0x65, 0x73, 0x0D, 0x0D, 0x03, 0x56, 0x6F,
+ 0x72, 0x2D, 0x20, 0x75, 0x6E, 0x64, 0x20, 0x4E,
+ 0x61, 0x63, 0x68, 0x73, 0x70, 0x61, 0x6E, 0x6E,
+ 0x3A, 0x04, 0x43, 0x68, 0x72, 0x69, 0x73, 0x74,
+ 0x6F, 0x70, 0x68, 0x65, 0x72, 0x20, 0x59, 0x61,
+ 0x74, 0x65, 0x73, 0x0D, 0x0D, 0x03, 0x4B, 0x81,
+ 0x6E, 0x73, 0x74, 0x6C, 0x65, 0x72, 0x69, 0x73,
+ 0x63, 0x68, 0x65, 0x20, 0x47, 0x65, 0x73, 0x74,
+ 0x61, 0x6C, 0x74, 0x75, 0x6E, 0x67, 0x3A, 0x04,
+ 0x52, 0x69, 0x63, 0x6B, 0x20, 0x50, 0x61, 0x72,
+ 0x6B, 0x73, 0x0D, 0x04, 0x52, 0x65, 0x6E, 0x20,
+ 0x4F, 0x6C, 0x73, 0x65, 0x6E, 0x0D, 0x04, 0x4C,
+ 0x6F, 0x75, 0x69, 0x73, 0x65, 0x20, 0x53, 0x61,
+ 0x6E, 0x64, 0x6F, 0x76, 0x61, 0x6C, 0x0D, 0x04,
+ 0x4A, 0x6F, 0x73, 0x65, 0x70, 0x68, 0x20, 0x48,
+ 0x65, 0x77, 0x69, 0x74, 0x74, 0x20, 0x49, 0x56,
+ 0x0D, 0x04, 0x4A, 0x75, 0x64, 0x69, 0x74, 0x68,
+ 0x20, 0x50, 0x65, 0x74, 0x65, 0x72, 0x73, 0x6F,
+ 0x6E, 0x0D, 0x04, 0x41, 0x61, 0x72, 0x6F, 0x6E,
+ 0x20, 0x50, 0x6F, 0x77, 0x65, 0x6C, 0x6C, 0x0D,
+ 0x04, 0x45, 0x6C, 0x69, 0x65, 0x20, 0x41, 0x72,
+ 0x61, 0x62, 0x69, 0x61, 0x6E, 0x0D, 0x04, 0x45,
+ 0x72, 0x69, 0x63, 0x20, 0x53, 0x68, 0x75, 0x6C,
+ 0x74, 0x73, 0x0D, 0x0D, 0x03, 0x54, 0x6F, 0x6E,
+ 0x72, 0x65, 0x67, 0x69, 0x65, 0x3A, 0x04, 0x50,
+ 0x61, 0x75, 0x6C, 0x20, 0x53, 0x2E, 0x20, 0x4D,
+ 0x75, 0x64, 0x72, 0x61, 0x0D, 0x0D, 0x03, 0x4D,
+ 0x75, 0x73, 0x69, 0x6B, 0x3A, 0x04, 0x46, 0x72,
+ 0x61, 0x6E, 0x6B, 0x20, 0x4B, 0x6C, 0x65, 0x70,
+ 0x61, 0x63, 0x6B, 0x69, 0x0D, 0x0D, 0x03, 0x53,
+ 0x6F, 0x75, 0x6E, 0x64, 0x65, 0x66, 0x66, 0x65,
+ 0x6B, 0x74, 0x65, 0x3A, 0x04, 0x44, 0x77, 0x69,
+ 0x67, 0x68, 0x74, 0x20, 0x4F, 0x6B, 0x61, 0x68,
+ 0x61, 0x72, 0x61, 0x0D, 0x0D, 0x03, 0x41, 0x75,
+ 0x74, 0x6F, 0x72, 0x3A, 0x04, 0x22, 0x43, 0x6F,
+ 0x63, 0x6F, 0x22, 0x0D, 0x0D, 0x03, 0x51, 0x75,
+ 0x61, 0x6C, 0x69, 0x74, 0x84, 0x74, 0x73, 0x73,
+ 0x69, 0x63, 0x68, 0x65, 0x72, 0x75, 0x6E, 0x67,
+ 0x3A, 0x04, 0x47, 0x6C, 0x65, 0x6E, 0x6E, 0x20,
+ 0x53, 0x70, 0x65, 0x72, 0x72, 0x79, 0x0D, 0x04,
+ 0x4D, 0x61, 0x74, 0x74, 0x20, 0x43, 0x6F, 0x6C,
+ 0x6C, 0x69, 0x6E, 0x73, 0x0D, 0x04, 0x42, 0x69,
+ 0x6C, 0x6C, 0x20, 0x46, 0x6F, 0x73, 0x74, 0x65,
+ 0x72, 0x0D, 0x04, 0x4D, 0x69, 0x63, 0x68, 0x61,
+ 0x65, 0x6C, 0x20, 0x4C, 0x69, 0x67, 0x68, 0x74,
+ 0x6E, 0x65, 0x72, 0x0D, 0x04, 0x4D, 0x69, 0x63,
+ 0x68, 0x61, 0x65, 0x6C, 0x20, 0x47, 0x61, 0x74,
+ 0x65, 0x72, 0x0D, 0x04, 0x45, 0x75, 0x67, 0x65,
+ 0x6E, 0x65, 0x20, 0x4D, 0x61, 0x72, 0x74, 0x69,
+ 0x6E, 0x0D, 0x04, 0x4D, 0x69, 0x63, 0x68, 0x61,
+ 0x65, 0x6C, 0x20, 0x47, 0x6C, 0x6F, 0x73, 0x65,
+ 0x63, 0x6B, 0x69, 0x0D, 0x04, 0x4A, 0x75, 0x73,
+ 0x74, 0x69, 0x6E, 0x20, 0x4E, 0x6F, 0x72, 0x72,
+ 0x0D, 0x04, 0x54, 0x6F, 0x70, 0x20, 0x53, 0x74,
+ 0x61, 0x72, 0x20, 0x54, 0x65, 0x73, 0x74, 0x69,
+ 0x6E, 0x67, 0x0D, 0x04, 0x54, 0x65, 0x73, 0x74,
+ 0x69, 0x6E, 0x67, 0x20, 0x31, 0x2C, 0x20, 0x32,
+ 0x2C, 0x20, 0x33, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D,
+ 0x05, 0x42, 0x65, 0x73, 0x6F, 0x6E, 0x64, 0x65,
+ 0x72, 0x65, 0x72, 0x20, 0x44, 0x61, 0x6E, 0x6B,
+ 0x20, 0x67, 0x69, 0x6C, 0x74, 0x3A, 0x0D, 0x05,
+ 0x4C, 0x79, 0x6C, 0x65, 0x20, 0x4A, 0x2E, 0x20,
+ 0x48, 0x61, 0x6C, 0x6C, 0x0D, 0x05, 0x44, 0x61,
+ 0x76, 0x69, 0x64, 0x20, 0x42, 0x69, 0x73, 0x68,
+ 0x6F, 0x70, 0x0D, 0x05, 0x22, 0x54, 0x68, 0x65,
+ 0x20, 0x44, 0x6F, 0x63, 0x22, 0x0D, 0x05, 0x75,
+ 0x6E, 0x64, 0x0D, 0x05, 0x53, 0x50, 0x52, 0x4F,
+ 0x43, 0x4B, 0x45, 0x54, 0x53, 0x0D, 0x0D, 0x0D,
+ 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x05, 0x4D, 0x49,
+ 0x54, 0x57, 0x49, 0x52, 0x4B, 0x45, 0x4E, 0x44,
+ 0x45, 0x20, 0x46, 0x49, 0x47, 0x55, 0x52, 0x45,
+ 0x4E, 0x0D, 0x0D, 0x05, 0x4D, 0x61, 0x6C, 0x63,
+ 0x6F, 0x6C, 0x6D, 0x20, 0x64, 0x65, 0x72, 0x20,
+ 0x48, 0x6F, 0x66, 0x6E, 0x61, 0x72, 0x72, 0x0D,
+ 0x05, 0x42, 0x72, 0x61, 0x6E, 0x64, 0x6F, 0x6E,
+ 0x20, 0x64, 0x65, 0x72, 0x20, 0x4B, 0x81, 0x68,
+ 0x6E, 0x65, 0x0D, 0x05, 0x42, 0x72, 0x61, 0x6E,
+ 0x64, 0x79, 0x77, 0x69, 0x6E, 0x65, 0x20, 0x75,
+ 0x6E, 0x64, 0x20, 0x44, 0x61, 0x72, 0x6D, 0x0D,
+ 0x05, 0x50, 0x72, 0x69, 0x65, 0x73, 0x74, 0x65,
+ 0x72, 0x69, 0x6E, 0x20, 0x42, 0x72, 0x79, 0x6E,
+ 0x6E, 0x0D, 0x05, 0x5A, 0x61, 0x6E, 0x74, 0x68,
+ 0x69, 0x61, 0x2C, 0x20, 0x64, 0x69, 0x65, 0x20,
+ 0x4C, 0x61, 0x64, 0x79, 0x20, 0x64, 0x65, 0x72,
+ 0x20, 0x41, 0x6C, 0x63, 0x68, 0x65, 0x6D, 0x69,
+ 0x65, 0x0D, 0x05, 0x48, 0x65, 0x72, 0x6D, 0x61,
+ 0x6E, 0x20, 0x64, 0x65, 0x72, 0x20, 0x47, 0x65,
+ 0x73, 0x63, 0x68, 0x69, 0x63, 0x6B, 0x74, 0x65,
+ 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x05,
+ 0x41, 0x6C, 0x6C, 0x65, 0x20, 0x8E, 0x68, 0x6E,
+ 0x6C, 0x69, 0x63, 0x68, 0x6B, 0x65, 0x69, 0x74,
+ 0x65, 0x6E, 0x20, 0x76, 0x6F, 0x6E, 0x20, 0x69,
+ 0x6D, 0x20, 0x53, 0x70, 0x69, 0x65, 0x6C, 0x20,
+ 0x61, 0x75, 0x66, 0x74, 0x72, 0x65, 0x74, 0x65,
+ 0x6E, 0x64, 0x65, 0x6E, 0x0D, 0x05, 0x46, 0x69,
+ 0x67, 0x75, 0x72, 0x65, 0x6E, 0x20, 0x6D, 0x69,
+ 0x74, 0x20, 0x6C, 0x65, 0x62, 0x65, 0x6E, 0x64,
+ 0x65, 0x6E, 0x20, 0x6F, 0x64, 0x65, 0x72, 0x20,
+ 0x76, 0x65, 0x72, 0x73, 0x74, 0x6F, 0x72, 0x62,
+ 0x65, 0x6E, 0x65, 0x6E, 0x0D, 0x05, 0x50, 0x65,
+ 0x72, 0x73, 0x6F, 0x6E, 0x65, 0x6E, 0x20, 0x73,
+ 0x69, 0x6E, 0x64, 0x20, 0x72, 0x65, 0x69, 0x6E,
+ 0x20, 0x7A, 0x75, 0x66, 0x8E, 0x6C, 0x6C, 0x69,
+ 0x67, 0x2E, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x05,
+ 0x4D, 0x61, 0x78, 0x54, 0x72, 0x61, 0x78, 0xE2,
+ 0x20, 0x6D, 0x75, 0x73, 0x69, 0x63, 0x20, 0x73,
+ 0x6F, 0x66, 0x74, 0x77, 0x61, 0x72, 0x65, 0x0D,
+ 0x05, 0x20, 0xE3, 0x20, 0x31, 0x39, 0x39, 0x32,
+ 0x20, 0x53, 0x79, 0x6C, 0x76, 0x61, 0x6E, 0x20,
+ 0x54, 0x65, 0x63, 0x68, 0x6E, 0x69, 0x63, 0x61,
+ 0x6C, 0x20, 0x41, 0x72, 0x74, 0x73, 0x0D, 0x05,
+ 0x4C, 0x69, 0x63, 0x65, 0x6E, 0x73, 0x65, 0x64,
+ 0x20, 0x62, 0x79, 0x20, 0x74, 0x68, 0x65, 0x20,
+ 0x44, 0x72, 0x65, 0x61, 0x6D, 0x65, 0x72, 0x73,
+ 0x20, 0x47, 0x75, 0x69, 0x6C, 0x64, 0x2C, 0x20,
+ 0x49, 0x6E, 0x63, 0x2E, 0x0D, 0x0D, 0x0D, 0x0D,
+ 0x0D, 0x0D, 0x05, 0x43, 0x6F, 0x70, 0x79, 0x72,
+ 0x69, 0x67, 0x68, 0x74, 0x20, 0x28, 0x63, 0x29,
+ 0x20, 0x31, 0x39, 0x39, 0x32, 0x2C, 0x20, 0x57,
+ 0x65, 0x73, 0x74, 0x77, 0x6F, 0x6F, 0x64, 0x20,
+ 0x53, 0x74, 0x75, 0x64, 0x69, 0x6F, 0x73, 0x2C,
+ 0x20, 0x49, 0x6E, 0x63, 0x2E, 0x0D, 0x05, 0x41,
+ 0x6C, 0x6C, 0x65, 0x20, 0x52, 0x65, 0x63, 0x68,
+ 0x74, 0x65, 0x20, 0x56, 0x6F, 0x72, 0x62, 0x65,
+ 0x68, 0x61, 0x6C, 0x74, 0x65, 0x6E, 0x2E, 0x0D,
+ 0x0D, 0x0D, 0x0D
+};
+
+static const ByteProvider k1CreditsStringsAmigaGermanProvider = { ARRAYSIZE(k1CreditsStringsAmigaGerman), k1CreditsStringsAmigaGerman };
+
diff --git a/devtools/create_kyradat/resources/lok_dos.h b/devtools/create_kyradat/resources/lok_dos.h
new file mode 100644
index 0000000000..e8d987fe1b
--- /dev/null
+++ b/devtools/create_kyradat/resources/lok_dos.h
@@ -0,0 +1,1925 @@
+static const byte k1KallakWritingSeqDOS[2037] = {
+ 0x00, 0x00, 0x01, 0x0E, 0x1A, 0x1B, 0x17, 0x00,
+ 0x00, 0x00, 0x3F, 0x01, 0xC7, 0x0C, 0x00, 0x0C,
+ 0x00, 0x19, 0x04, 0x02, 0x00, 0x00, 0x00, 0x00,
+ 0x10, 0x05, 0x00, 0x95, 0x00, 0x20, 0x09, 0x14,
+ 0x0F, 0x2E, 0x02, 0x00, 0x01, 0x00, 0x00, 0x10,
+ 0x05, 0x01, 0x94, 0x00, 0x1B, 0x07, 0x06, 0x00,
+ 0x18, 0x1D, 0x02, 0x00, 0x02, 0x00, 0x00, 0x10,
+ 0x05, 0x02, 0x93, 0x00, 0x14, 0x07, 0x06, 0x00,
+ 0x02, 0x00, 0x03, 0x00, 0x00, 0x10, 0x05, 0x01,
+ 0x90, 0x00, 0x1B, 0x07, 0x06, 0x00, 0x02, 0x00,
+ 0x04, 0x00, 0x00, 0x10, 0x05, 0x00, 0x8D, 0x00,
+ 0x20, 0x07, 0x06, 0x00, 0x18, 0x1D, 0x02, 0x00,
+ 0x05, 0x00, 0x00, 0x10, 0x05, 0x01, 0x8A, 0x00,
+ 0x1B, 0x07, 0x06, 0x00, 0x02, 0x00, 0x06, 0x00,
+ 0x00, 0x10, 0x05, 0x02, 0x88, 0x00, 0x14, 0x07,
+ 0x06, 0x00, 0x18, 0x1D, 0x02, 0x00, 0x07, 0x00,
+ 0x00, 0x10, 0x05, 0x01, 0x85, 0x00, 0x1B, 0x07,
+ 0x06, 0x00, 0x02, 0x00, 0x08, 0x00, 0x00, 0x10,
+ 0x05, 0x00, 0x82, 0x00, 0x20, 0x07, 0x06, 0x00,
+ 0x02, 0x00, 0x09, 0x00, 0x00, 0x10, 0x05, 0x01,
+ 0x7F, 0x00, 0x1B, 0x07, 0x06, 0x00, 0x02, 0x00,
+ 0x0A, 0x00, 0x00, 0x10, 0x05, 0x02, 0x7C, 0x00,
+ 0x14, 0x07, 0x06, 0x00, 0x18, 0x1D, 0x02, 0x00,
+ 0x0B, 0x00, 0x00, 0x10, 0x05, 0x01, 0x79, 0x00,
+ 0x1B, 0x07, 0x06, 0x00, 0x02, 0x00, 0x0C, 0x00,
+ 0x00, 0x10, 0x05, 0x00, 0x76, 0x00, 0x20, 0x07,
+ 0x06, 0x00, 0x02, 0x00, 0x0D, 0x00, 0x00, 0x10,
+ 0x05, 0x01, 0x73, 0x00, 0x1B, 0x07, 0x06, 0x00,
+ 0x18, 0x1D, 0x02, 0x00, 0x0E, 0x00, 0x00, 0x10,
+ 0x05, 0x02, 0x70, 0x00, 0x14, 0x07, 0x06, 0x00,
+ 0x02, 0x00, 0x0F, 0x00, 0x00, 0x10, 0x05, 0x01,
+ 0x6D, 0x00, 0x1B, 0x07, 0x06, 0x00, 0x02, 0x00,
+ 0x10, 0x00, 0x00, 0x10, 0x05, 0x00, 0x6A, 0x00,
+ 0x20, 0x07, 0x06, 0x00, 0x02, 0x00, 0x11, 0x00,
+ 0x00, 0x10, 0x05, 0x01, 0x67, 0x00, 0x1B, 0x07,
+ 0x06, 0x00, 0x18, 0x1D, 0x02, 0x00, 0x12, 0x00,
+ 0x00, 0x10, 0x05, 0x02, 0x65, 0x00, 0x14, 0x07,
+ 0x06, 0x00, 0x02, 0x00, 0x13, 0x00, 0x00, 0x10,
+ 0x05, 0x01, 0x63, 0x00, 0x1B, 0x07, 0x06, 0x00,
+ 0x02, 0x00, 0x14, 0x00, 0x00, 0x10, 0x05, 0x00,
+ 0x63, 0x00, 0x20, 0x07, 0x06, 0x00, 0x02, 0x00,
+ 0x15, 0x00, 0x00, 0x10, 0x05, 0x00, 0x65, 0x00,
+ 0x1F, 0x07, 0x06, 0x00, 0x02, 0x00, 0x16, 0x00,
+ 0x00, 0x10, 0x05, 0x00, 0x6A, 0x00, 0x1D, 0x07,
+ 0x06, 0x00, 0x02, 0x00, 0x17, 0x00, 0x00, 0x10,
+ 0x05, 0x00, 0x70, 0x00, 0x19, 0x07, 0x06, 0x00,
+ 0x02, 0x00, 0x18, 0x00, 0x00, 0x10, 0x05, 0x00,
+ 0x76, 0x00, 0x17, 0x07, 0x06, 0x00, 0x02, 0x00,
+ 0x19, 0x00, 0x00, 0x10, 0x05, 0x00, 0x7C, 0x00,
+ 0x16, 0x07, 0x06, 0x00, 0x02, 0x00, 0x1A, 0x00,
+ 0x00, 0x10, 0x05, 0x00, 0x82, 0x00, 0x17, 0x07,
+ 0x06, 0x00, 0x02, 0x00, 0x1B, 0x00, 0x00, 0x10,
+ 0x05, 0x00, 0x88, 0x00, 0x19, 0x07, 0x06, 0x00,
+ 0x02, 0x00, 0x1C, 0x00, 0x00, 0x10, 0x05, 0x00,
+ 0x8D, 0x00, 0x1D, 0x07, 0x06, 0x00, 0x02, 0x00,
+ 0x1D, 0x00, 0x00, 0x10, 0x05, 0x00, 0x93, 0x00,
+ 0x1F, 0x07, 0x06, 0x00, 0x1C, 0x1B, 0x0F, 0x2F,
+ 0x02, 0x00, 0x01, 0x00, 0x00, 0x10, 0x05, 0x01,
+ 0x94, 0x00, 0x1B, 0x07, 0x06, 0x00, 0x02, 0x00,
+ 0x01, 0x00, 0x00, 0x10, 0x05, 0x01, 0x94, 0x00,
+ 0x1B, 0x07, 0x06, 0x00, 0x18, 0x1D, 0x02, 0x00,
+ 0x02, 0x00, 0x00, 0x10, 0x05, 0x02, 0x93, 0x00,
+ 0x14, 0x07, 0x06, 0x00, 0x02, 0x00, 0x02, 0x00,
+ 0x00, 0x10, 0x05, 0x02, 0x93, 0x00, 0x14, 0x07,
+ 0x06, 0x00, 0x02, 0x00, 0x03, 0x00, 0x00, 0x10,
+ 0x05, 0x01, 0x90, 0x00, 0x1B, 0x07, 0x06, 0x00,
+ 0x02, 0x00, 0x04, 0x00, 0x00, 0x10, 0x05, 0x00,
+ 0x8D, 0x00, 0x20, 0x07, 0x06, 0x00, 0x18, 0x1D,
+ 0x02, 0x00, 0x05, 0x00, 0x00, 0x10, 0x05, 0x01,
+ 0x8A, 0x00, 0x1B, 0x07, 0x06, 0x00, 0x02, 0x00,
+ 0x05, 0x00, 0x00, 0x10, 0x05, 0x01, 0x8A, 0x00,
+ 0x1B, 0x07, 0x06, 0x00, 0x02, 0x00, 0x06, 0x00,
+ 0x00, 0x10, 0x05, 0x02, 0x88, 0x00, 0x14, 0x07,
+ 0x06, 0x00, 0x18, 0x1D, 0x02, 0x00, 0x07, 0x00,
+ 0x00, 0x10, 0x05, 0x01, 0x85, 0x00, 0x1B, 0x07,
+ 0x06, 0x00, 0x02, 0x00, 0x08, 0x00, 0x00, 0x10,
+ 0x05, 0x00, 0x82, 0x00, 0x20, 0x07, 0x06, 0x00,
+ 0x02, 0x00, 0x09, 0x00, 0x00, 0x10, 0x05, 0x01,
+ 0x7F, 0x00, 0x1B, 0x07, 0x06, 0x00, 0x02, 0x00,
+ 0x0A, 0x00, 0x00, 0x10, 0x05, 0x02, 0x7C, 0x00,
+ 0x14, 0x07, 0x06, 0x00, 0x18, 0x1D, 0x02, 0x00,
+ 0x0B, 0x00, 0x00, 0x10, 0x05, 0x01, 0x79, 0x00,
+ 0x1B, 0x07, 0x06, 0x00, 0x02, 0x00, 0x0C, 0x00,
+ 0x00, 0x10, 0x05, 0x00, 0x76, 0x00, 0x20, 0x07,
+ 0x06, 0x00, 0x02, 0x00, 0x0D, 0x00, 0x00, 0x10,
+ 0x05, 0x01, 0x73, 0x00, 0x1B, 0x07, 0x06, 0x00,
+ 0x18, 0x1D, 0x02, 0x00, 0x0E, 0x00, 0x00, 0x10,
+ 0x05, 0x02, 0x70, 0x00, 0x14, 0x07, 0x06, 0x00,
+ 0x02, 0x00, 0x0F, 0x00, 0x00, 0x10, 0x05, 0x01,
+ 0x6D, 0x00, 0x1B, 0x07, 0x06, 0x00, 0x02, 0x00,
+ 0x10, 0x00, 0x00, 0x10, 0x05, 0x00, 0x6A, 0x00,
+ 0x20, 0x07, 0x06, 0x00, 0x02, 0x00, 0x11, 0x00,
+ 0x00, 0x10, 0x05, 0x01, 0x67, 0x00, 0x1B, 0x07,
+ 0x06, 0x00, 0x18, 0x1D, 0x02, 0x00, 0x12, 0x00,
+ 0x00, 0x10, 0x05, 0x02, 0x65, 0x00, 0x14, 0x07,
+ 0x06, 0x00, 0x02, 0x00, 0x13, 0x00, 0x00, 0x10,
+ 0x05, 0x01, 0x63, 0x00, 0x1B, 0x07, 0x06, 0x00,
+ 0x02, 0x00, 0x14, 0x00, 0x00, 0x10, 0x05, 0x00,
+ 0x63, 0x00, 0x20, 0x07, 0x06, 0x00, 0x02, 0x00,
+ 0x15, 0x00, 0x00, 0x10, 0x05, 0x00, 0x65, 0x00,
+ 0x1F, 0x07, 0x06, 0x00, 0x02, 0x00, 0x16, 0x00,
+ 0x00, 0x10, 0x05, 0x00, 0x6A, 0x00, 0x1D, 0x07,
+ 0x06, 0x00, 0x02, 0x00, 0x17, 0x00, 0x00, 0x10,
+ 0x05, 0x00, 0x70, 0x00, 0x19, 0x07, 0x06, 0x00,
+ 0x02, 0x00, 0x18, 0x00, 0x00, 0x10, 0x05, 0x00,
+ 0x76, 0x00, 0x17, 0x07, 0x06, 0x00, 0x02, 0x00,
+ 0x19, 0x00, 0x00, 0x10, 0x05, 0x00, 0x7C, 0x00,
+ 0x16, 0x07, 0x06, 0x00, 0x02, 0x00, 0x1A, 0x00,
+ 0x00, 0x10, 0x05, 0x00, 0x82, 0x00, 0x17, 0x07,
+ 0x06, 0x00, 0x02, 0x00, 0x1B, 0x00, 0x00, 0x10,
+ 0x05, 0x00, 0x88, 0x00, 0x19, 0x07, 0x06, 0x00,
+ 0x02, 0x00, 0x1C, 0x00, 0x00, 0x10, 0x05, 0x00,
+ 0x8D, 0x00, 0x1D, 0x07, 0x06, 0x00, 0x02, 0x00,
+ 0x1D, 0x00, 0x00, 0x10, 0x05, 0x00, 0x93, 0x00,
+ 0x1F, 0x07, 0x06, 0x00, 0x1C, 0x1B, 0x0F, 0x30,
+ 0x02, 0x00, 0x01, 0x00, 0x00, 0x10, 0x05, 0x01,
+ 0x94, 0x00, 0x1B, 0x07, 0x06, 0x00, 0x02, 0x00,
+ 0x01, 0x00, 0x00, 0x10, 0x05, 0x01, 0x94, 0x00,
+ 0x1B, 0x07, 0x06, 0x00, 0x18, 0x1D, 0x02, 0x00,
+ 0x02, 0x00, 0x00, 0x10, 0x05, 0x02, 0x93, 0x00,
+ 0x14, 0x07, 0x06, 0x00, 0x02, 0x00, 0x02, 0x00,
+ 0x00, 0x10, 0x05, 0x02, 0x93, 0x00, 0x14, 0x07,
+ 0x06, 0x00, 0x02, 0x00, 0x02, 0x00, 0x00, 0x10,
+ 0x05, 0x02, 0x93, 0x00, 0x14, 0x07, 0x06, 0x00,
+ 0x02, 0x00, 0x03, 0x00, 0x00, 0x10, 0x05, 0x01,
+ 0x90, 0x00, 0x1B, 0x07, 0x06, 0x00, 0x02, 0x00,
+ 0x03, 0x00, 0x00, 0x10, 0x05, 0x01, 0x90, 0x00,
+ 0x1B, 0x07, 0x06, 0x00, 0x02, 0x00, 0x04, 0x00,
+ 0x00, 0x10, 0x05, 0x00, 0x8D, 0x00, 0x20, 0x07,
+ 0x06, 0x00, 0x18, 0x1D, 0x02, 0x00, 0x05, 0x00,
+ 0x00, 0x10, 0x05, 0x01, 0x8A, 0x00, 0x1B, 0x07,
+ 0x06, 0x00, 0x02, 0x00, 0x06, 0x00, 0x00, 0x10,
+ 0x05, 0x02, 0x88, 0x00, 0x14, 0x07, 0x06, 0x00,
+ 0x18, 0x1D, 0x02, 0x00, 0x07, 0x00, 0x00, 0x10,
+ 0x05, 0x01, 0x85, 0x00, 0x1B, 0x07, 0x06, 0x00,
+ 0x02, 0x00, 0x08, 0x00, 0x00, 0x10, 0x05, 0x00,
+ 0x82, 0x00, 0x20, 0x07, 0x06, 0x00, 0x02, 0x00,
+ 0x09, 0x00, 0x00, 0x10, 0x05, 0x01, 0x7F, 0x00,
+ 0x1B, 0x07, 0x06, 0x00, 0x02, 0x00, 0x0A, 0x00,
+ 0x00, 0x10, 0x05, 0x02, 0x7C, 0x00, 0x14, 0x07,
+ 0x06, 0x00, 0x18, 0x1D, 0x02, 0x00, 0x0B, 0x00,
+ 0x00, 0x10, 0x05, 0x01, 0x79, 0x00, 0x1B, 0x07,
+ 0x06, 0x00, 0x02, 0x00, 0x0C, 0x00, 0x00, 0x10,
+ 0x05, 0x00, 0x76, 0x00, 0x20, 0x07, 0x06, 0x00,
+ 0x02, 0x00, 0x0D, 0x00, 0x00, 0x10, 0x05, 0x01,
+ 0x73, 0x00, 0x1B, 0x07, 0x06, 0x00, 0x18, 0x1D,
+ 0x02, 0x00, 0x0E, 0x00, 0x00, 0x10, 0x05, 0x02,
+ 0x70, 0x00, 0x14, 0x07, 0x06, 0x00, 0x02, 0x00,
+ 0x0F, 0x00, 0x00, 0x10, 0x05, 0x01, 0x6D, 0x00,
+ 0x1B, 0x07, 0x06, 0x00, 0x02, 0x00, 0x10, 0x00,
+ 0x00, 0x10, 0x05, 0x00, 0x6A, 0x00, 0x20, 0x07,
+ 0x06, 0x00, 0x02, 0x00, 0x11, 0x00, 0x00, 0x10,
+ 0x05, 0x01, 0x67, 0x00, 0x1B, 0x07, 0x06, 0x00,
+ 0x18, 0x1D, 0x02, 0x00, 0x12, 0x00, 0x00, 0x10,
+ 0x05, 0x02, 0x65, 0x00, 0x14, 0x07, 0x06, 0x00,
+ 0x02, 0x00, 0x13, 0x00, 0x00, 0x10, 0x05, 0x01,
+ 0x63, 0x00, 0x1B, 0x07, 0x06, 0x00, 0x02, 0x00,
+ 0x14, 0x00, 0x00, 0x10, 0x05, 0x00, 0x63, 0x00,
+ 0x20, 0x07, 0x06, 0x00, 0x02, 0x00, 0x15, 0x00,
+ 0x00, 0x10, 0x05, 0x00, 0x65, 0x00, 0x1F, 0x07,
+ 0x06, 0x00, 0x02, 0x00, 0x16, 0x00, 0x00, 0x10,
+ 0x05, 0x00, 0x6A, 0x00, 0x1D, 0x07, 0x06, 0x00,
+ 0x02, 0x00, 0x17, 0x00, 0x00, 0x10, 0x05, 0x00,
+ 0x70, 0x00, 0x19, 0x07, 0x06, 0x00, 0x02, 0x00,
+ 0x18, 0x00, 0x00, 0x10, 0x05, 0x00, 0x76, 0x00,
+ 0x17, 0x07, 0x06, 0x00, 0x02, 0x00, 0x19, 0x00,
+ 0x00, 0x10, 0x05, 0x00, 0x7C, 0x00, 0x16, 0x07,
+ 0x06, 0x00, 0x02, 0x00, 0x1A, 0x00, 0x00, 0x10,
+ 0x05, 0x00, 0x82, 0x00, 0x17, 0x07, 0x06, 0x00,
+ 0x02, 0x00, 0x1B, 0x00, 0x00, 0x10, 0x05, 0x00,
+ 0x88, 0x00, 0x19, 0x07, 0x06, 0x00, 0x02, 0x00,
+ 0x1C, 0x00, 0x00, 0x10, 0x05, 0x00, 0x8D, 0x00,
+ 0x1D, 0x07, 0x06, 0x00, 0x02, 0x00, 0x1D, 0x00,
+ 0x00, 0x10, 0x05, 0x00, 0x93, 0x00, 0x1F, 0x07,
+ 0x06, 0x00, 0x1C, 0x06, 0x3C, 0x00, 0x1B, 0x0F,
+ 0x31, 0x02, 0x00, 0x00, 0x00, 0x00, 0x10, 0x05,
+ 0x00, 0x95, 0x00, 0x20, 0x07, 0x06, 0x00, 0x02,
+ 0x00, 0x00, 0x00, 0x00, 0x10, 0x05, 0x00, 0x95,
+ 0x00, 0x20, 0x07, 0x06, 0x00, 0x18, 0x1D, 0x02,
+ 0x00, 0x01, 0x00, 0x00, 0x10, 0x05, 0x01, 0x94,
+ 0x00, 0x1B, 0x07, 0x06, 0x00, 0x02, 0x00, 0x01,
+ 0x00, 0x00, 0x10, 0x05, 0x01, 0x94, 0x00, 0x1B,
+ 0x07, 0x06, 0x00, 0x02, 0x00, 0x02, 0x00, 0x00,
+ 0x10, 0x05, 0x02, 0x93, 0x00, 0x14, 0x07, 0x06,
+ 0x00, 0x02, 0x00, 0x02, 0x00, 0x00, 0x10, 0x05,
+ 0x02, 0x93, 0x00, 0x14, 0x07, 0x06, 0x00, 0x18,
+ 0x1D, 0x02, 0x00, 0x03, 0x00, 0x00, 0x10, 0x05,
+ 0x01, 0x90, 0x00, 0x1B, 0x07, 0x06, 0x00, 0x02,
+ 0x00, 0x04, 0x00, 0x00, 0x10, 0x05, 0x00, 0x8D,
+ 0x00, 0x20, 0x07, 0x06, 0x00, 0x02, 0x00, 0x05,
+ 0x00, 0x00, 0x10, 0x05, 0x01, 0x8A, 0x00, 0x1B,
+ 0x07, 0x06, 0x00, 0x18, 0x1D, 0x02, 0x00, 0x06,
+ 0x00, 0x00, 0x10, 0x05, 0x02, 0x88, 0x00, 0x14,
+ 0x07, 0x06, 0x00, 0x02, 0x00, 0x07, 0x00, 0x00,
+ 0x10, 0x05, 0x01, 0x85, 0x00, 0x1B, 0x07, 0x06,
+ 0x00, 0x18, 0x1D, 0x02, 0x00, 0x08, 0x00, 0x00,
+ 0x10, 0x05, 0x00, 0x82, 0x00, 0x20, 0x07, 0x06,
+ 0x00, 0x02, 0x00, 0x09, 0x00, 0x00, 0x10, 0x05,
+ 0x01, 0x7F, 0x00, 0x1B, 0x07, 0x06, 0x00, 0x02,
+ 0x00, 0x0A, 0x00, 0x00, 0x10, 0x05, 0x02, 0x7C,
+ 0x00, 0x14, 0x07, 0x06, 0x00, 0x18, 0x1D, 0x02,
+ 0x00, 0x0B, 0x00, 0x00, 0x10, 0x05, 0x01, 0x79,
+ 0x00, 0x1B, 0x07, 0x06, 0x00, 0x02, 0x00, 0x0C,
+ 0x00, 0x00, 0x10, 0x05, 0x00, 0x76, 0x00, 0x20,
+ 0x07, 0x06, 0x00, 0x18, 0x1D, 0x02, 0x00, 0x0D,
+ 0x00, 0x00, 0x10, 0x05, 0x01, 0x73, 0x00, 0x1B,
+ 0x07, 0x06, 0x00, 0x02, 0x00, 0x0E, 0x00, 0x00,
+ 0x10, 0x05, 0x02, 0x70, 0x00, 0x14, 0x07, 0x06,
+ 0x00, 0x02, 0x00, 0x0F, 0x00, 0x00, 0x10, 0x05,
+ 0x01, 0x6D, 0x00, 0x1B, 0x07, 0x06, 0x00, 0x18,
+ 0x1D, 0x02, 0x00, 0x10, 0x00, 0x00, 0x10, 0x05,
+ 0x00, 0x6A, 0x00, 0x20, 0x07, 0x06, 0x00, 0x02,
+ 0x00, 0x11, 0x00, 0x00, 0x10, 0x05, 0x01, 0x67,
+ 0x00, 0x1B, 0x07, 0x06, 0x00, 0x18, 0x1D, 0x02,
+ 0x00, 0x12, 0x00, 0x00, 0x10, 0x05, 0x02, 0x65,
+ 0x00, 0x14, 0x07, 0x06, 0x00, 0x06, 0x3C, 0x00,
+ 0x02, 0x00, 0x1E, 0x00, 0x00, 0x10, 0x08, 0x12,
+ 0x06, 0x1E, 0x00, 0x0A, 0x01, 0x02, 0x00, 0x1F,
+ 0x00, 0x00, 0x10, 0x07, 0x0A, 0x00, 0x02, 0x00,
+ 0x20, 0x00, 0x00, 0x10, 0x07, 0x0A, 0x00, 0x02,
+ 0x00, 0x21, 0x00, 0x00, 0x10, 0x07, 0x0A, 0x00,
+ 0x02, 0x00, 0x22, 0x00, 0x00, 0x10, 0x07, 0x0A,
+ 0x00, 0x0B, 0x01, 0x02, 0x00, 0x18, 0x1F, 0x06,
+ 0x0A, 0x00, 0x02, 0x00, 0x23, 0x00, 0x00, 0x10,
+ 0x07, 0x14, 0x00, 0x18, 0x1E, 0x02, 0x00, 0x24,
+ 0x00, 0x00, 0x10, 0x07, 0x14, 0x00, 0x02, 0x00,
+ 0x25, 0x00, 0x00, 0x10, 0x07, 0x14, 0x00, 0x18,
+ 0x1F, 0x02, 0x00, 0x26, 0x00, 0x00, 0x10, 0x07,
+ 0x14, 0x00, 0x02, 0x00, 0x27, 0x00, 0x00, 0x10,
+ 0x07, 0x14, 0x00, 0x18, 0x1E, 0x02, 0x00, 0x28,
+ 0x00, 0x00, 0x10, 0x08, 0x06, 0x3C, 0x00, 0x18,
+ 0x1E, 0x03, 0x00, 0x07, 0x06, 0x00, 0x18, 0x1E,
+ 0x03, 0x00, 0x07, 0x06, 0x00, 0x03, 0x00, 0x07,
+ 0x06, 0x00, 0x03, 0x00, 0x07, 0x06, 0x00, 0x03,
+ 0x00, 0x07, 0x06, 0x00, 0x03, 0x00, 0x07, 0x06,
+ 0x00, 0x03, 0x00, 0x07, 0x06, 0x00, 0x18, 0x1E,
+ 0x03, 0x00, 0x07, 0x06, 0x00, 0x03, 0x00, 0x07,
+ 0x06, 0x00, 0x03, 0x00, 0x07, 0x06, 0x00, 0x03,
+ 0x00, 0x07, 0x06, 0x00, 0x03, 0x00, 0x07, 0x06,
+ 0x00, 0x03, 0x00, 0x07, 0x06, 0x00, 0x03, 0x00,
+ 0x07, 0x06, 0x00, 0x03, 0x00, 0x07, 0x06, 0x00,
+ 0x03, 0x00, 0x07, 0x06, 0x00, 0x18, 0x1E, 0x03,
+ 0x00, 0x07, 0x06, 0x00, 0x03, 0x00, 0x07, 0x06,
+ 0x00, 0x03, 0x00, 0x07, 0x06, 0x00, 0x03, 0x00,
+ 0x07, 0x06, 0x00, 0x03, 0x00, 0x07, 0x06, 0x00,
+ 0x03, 0x00, 0x07, 0x06, 0x00, 0x03, 0x00, 0x07,
+ 0x06, 0x00, 0x03, 0x00, 0x07, 0x06, 0x00, 0x18,
+ 0x1E, 0x03, 0x00, 0x07, 0x06, 0x00, 0x03, 0x00,
+ 0x07, 0x06, 0x00, 0x03, 0x00, 0x07, 0x06, 0x00,
+ 0x03, 0x00, 0x07, 0x06, 0x00, 0x03, 0x00, 0x07,
+ 0x06, 0x00, 0x03, 0x00, 0x07, 0x06, 0x00, 0x03,
+ 0x00, 0x07, 0x06, 0x00, 0x03, 0x00, 0x07, 0x06,
+ 0x00, 0x03, 0x00, 0x07, 0x06, 0x00, 0x03, 0x00,
+ 0x07, 0x06, 0x00, 0x13, 0x1C, 0x19, 0x01, 0x06,
+ 0x3C, 0x00, 0x01, 0x00, 0x1D
+};
+
+static const ByteProvider k1KallakWritingSeqDOSProvider = { ARRAYSIZE(k1KallakWritingSeqDOS), k1KallakWritingSeqDOS };
+
+static const byte k1MalcolmTreeSeqDOS[534] = {
+ 0x00, 0x01, 0x00, 0x1A, 0x0E, 0x17, 0x00, 0x00,
+ 0x00, 0x3F, 0x01, 0xC7, 0x0C, 0x00, 0x0C, 0x01,
+ 0x0D, 0x01, 0x09, 0x02, 0x01, 0x00, 0x00, 0x00,
+ 0x10, 0x19, 0x03, 0x09, 0x18, 0x1E, 0x14, 0x18,
+ 0x1F, 0x0A, 0x00, 0x03, 0x01, 0x06, 0x06, 0x00,
+ 0x0B, 0x00, 0x1F, 0x00, 0x18, 0x19, 0x0A, 0x01,
+ 0x03, 0x01, 0x06, 0x06, 0x00, 0x0B, 0x01, 0x0F,
+ 0x00, 0x18, 0x26, 0x10, 0x1F, 0x50, 0x00, 0x2D,
+ 0x05, 0x0A, 0x02, 0x03, 0x01, 0x06, 0x06, 0x00,
+ 0x0B, 0x02, 0x10, 0x00, 0x11, 0x18, 0x1F, 0x03,
+ 0x01, 0x06, 0x06, 0x00, 0x03, 0x01, 0x06, 0x06,
+ 0x00, 0x03, 0x01, 0x06, 0x06, 0x00, 0x18, 0x24,
+ 0x18, 0x1F, 0x03, 0x01, 0x06, 0x06, 0x00, 0x18,
+ 0x1E, 0x0A, 0x03, 0x03, 0x01, 0x06, 0x06, 0x00,
+ 0x0B, 0x03, 0x15, 0x00, 0x10, 0x16, 0x50, 0x00,
+ 0x2D, 0x05, 0x18, 0x1F, 0x03, 0x01, 0x06, 0x06,
+ 0x00, 0x03, 0x01, 0x06, 0x06, 0x00, 0x18, 0x1E,
+ 0x03, 0x01, 0x06, 0x06, 0x00, 0x03, 0x01, 0x06,
+ 0x06, 0x00, 0x18, 0x1F, 0x03, 0x01, 0x06, 0x06,
+ 0x00, 0x03, 0x01, 0x06, 0x06, 0x00, 0x03, 0x01,
+ 0x06, 0x06, 0x00, 0x03, 0x01, 0x06, 0x06, 0x00,
+ 0x18, 0x1E, 0x03, 0x01, 0x06, 0x06, 0x00, 0x18,
+ 0x1A, 0x18, 0x1E, 0x0A, 0x05, 0x03, 0x01, 0x06,
+ 0x06, 0x00, 0x0B, 0x05, 0x09, 0x00, 0x11, 0x0A,
+ 0x06, 0x03, 0x01, 0x06, 0x06, 0x00, 0x0B, 0x06,
+ 0x14, 0x00, 0x18, 0x1A, 0x18, 0x1F, 0x10, 0x17,
+ 0x50, 0x00, 0x2D, 0x05, 0x06, 0x3C, 0x00, 0x0A,
+ 0x07, 0x03, 0x01, 0x06, 0x06, 0x00, 0x0B, 0x07,
+ 0x06, 0x00, 0x18, 0x1E, 0x06, 0x1E, 0x00, 0x10,
+ 0x18, 0x50, 0x00, 0x2D, 0x05, 0x03, 0x01, 0x06,
+ 0x06, 0x00, 0x03, 0x01, 0x06, 0x06, 0x00, 0x03,
+ 0x01, 0x06, 0x06, 0x00, 0x0A, 0x08, 0x04, 0x01,
+ 0x06, 0x06, 0x00, 0x04, 0x01, 0x06, 0x06, 0x00,
+ 0x03, 0x01, 0x06, 0x06, 0x00, 0x03, 0x01, 0x06,
+ 0x06, 0x00, 0x0B, 0x08, 0x01, 0x00, 0x03, 0x01,
+ 0x06, 0x06, 0x00, 0x06, 0x78, 0x00, 0x0A, 0x09,
+ 0x03, 0x01, 0x06, 0x06, 0x00, 0x0B, 0x09, 0x04,
+ 0x00, 0x18, 0x1B, 0x0A, 0x0A, 0x03, 0x01, 0x06,
+ 0x06, 0x00, 0x0B, 0x0A, 0x09, 0x00, 0x06, 0x14,
+ 0x00, 0x10, 0x19, 0x50, 0x00, 0x2D, 0x05, 0x03,
+ 0x01, 0x06, 0x06, 0x00, 0x03, 0x01, 0x06, 0x06,
+ 0x00, 0x0A, 0x0B, 0x03, 0x01, 0x06, 0x06, 0x00,
+ 0x04, 0x01, 0x06, 0x06, 0x00, 0x04, 0x01, 0x06,
+ 0x06, 0x00, 0x03, 0x01, 0x06, 0x06, 0x00, 0x03,
+ 0x01, 0x06, 0x06, 0x00, 0x0B, 0x0B, 0x01, 0x00,
+ 0x03, 0x01, 0x06, 0x06, 0x00, 0x03, 0x01, 0x06,
+ 0x06, 0x00, 0x03, 0x01, 0x06, 0x06, 0x00, 0x10,
+ 0x1A, 0x50, 0x00, 0x2D, 0x05, 0x0A, 0x0C, 0x03,
+ 0x01, 0x06, 0x06, 0x00, 0x0B, 0x0C, 0x12, 0x00,
+ 0x03, 0x01, 0x01, 0x01, 0x11, 0x15, 0x00, 0x02,
+ 0x00, 0x02, 0x00, 0x02, 0x02, 0x00, 0x00, 0x00,
+ 0x10, 0x10, 0x1C, 0x50, 0x00, 0x2D, 0x05, 0x06,
+ 0x3C, 0x00, 0x03, 0x02, 0x03, 0x02, 0x06, 0x06,
+ 0x00, 0x11, 0x18, 0x1C, 0x0A, 0x0F, 0x03, 0x02,
+ 0x06, 0x06, 0x00, 0x0B, 0x0F, 0x0D, 0x00, 0x10,
+ 0x1D, 0x50, 0x00, 0x2D, 0x05, 0x0A, 0x10, 0x03,
+ 0x02, 0x06, 0x06, 0x00, 0x03, 0x02, 0x06, 0x06,
+ 0x00, 0x03, 0x02, 0x06, 0x06, 0x00, 0x04, 0x02,
+ 0x06, 0x06, 0x00, 0x04, 0x02, 0x06, 0x06, 0x00,
+ 0x04, 0x02, 0x06, 0x06, 0x00, 0x0B, 0x10, 0x02,
+ 0x00, 0x10, 0x1E, 0x50, 0x00, 0x2D, 0x05, 0x0A,
+ 0x11, 0x03, 0x02, 0x06, 0x06, 0x00, 0x03, 0x02,
+ 0x06, 0x06, 0x00, 0x03, 0x02, 0x06, 0x06, 0x00,
+ 0x04, 0x02, 0x06, 0x06, 0x00, 0x04, 0x02, 0x06,
+ 0x06, 0x00, 0x04, 0x02, 0x06, 0x06, 0x00, 0x0B,
+ 0x11, 0x02, 0x00, 0x06, 0xB4, 0x00, 0x13, 0x19,
+ 0x01, 0x01, 0x01, 0x01, 0x02, 0x1D
+};
+
+static const ByteProvider k1MalcolmTreeSeqDOSProvider = { ARRAYSIZE(k1MalcolmTreeSeqDOS), k1MalcolmTreeSeqDOS };
+
+static const byte k1WestwoodLogoSeqDOS[75] = {
+ 0x00, 0x03, 0x01, 0x1A, 0x02, 0x03, 0x00, 0x00,
+ 0x00, 0x00, 0x16, 0x01, 0x06, 0x06, 0x00, 0x06,
+ 0x3C, 0x00, 0x18, 0x14, 0x0A, 0x00, 0x03, 0x03,
+ 0x16, 0x01, 0x0B, 0x00, 0x08, 0x00, 0x06, 0x3C,
+ 0x00, 0x18, 0x27, 0x0A, 0x01, 0x03, 0x03, 0x16,
+ 0x01, 0x0B, 0x01, 0x0B, 0x00, 0x06, 0x78, 0x00,
+ 0x18, 0x14, 0x02, 0x03, 0x0A, 0x00, 0x00, 0x00,
+ 0x16, 0x01, 0x06, 0x06, 0x00, 0x0A, 0x02, 0x04,
+ 0x03, 0x16, 0x01, 0x0B, 0x02, 0x09, 0x00, 0x13,
+ 0x01, 0x03, 0x1D
+};
+
+static const ByteProvider k1WestwoodLogoSeqDOSProvider = { ARRAYSIZE(k1WestwoodLogoSeqDOS), k1WestwoodLogoSeqDOS };
+
+static const byte k1KyrandiaLogoSeqDOS[92] = {
+ 0x15, 0x00, 0x02, 0x00, 0x06, 0x01, 0x1A, 0x02,
+ 0x06, 0x00, 0x00, 0x00, 0x00, 0x16, 0x00, 0x06,
+ 0x06, 0x00, 0x18, 0x14, 0x16, 0x04, 0x0A, 0x00,
+ 0x03, 0x06, 0x16, 0x00, 0x0B, 0x00, 0x0B, 0x00,
+ 0x06, 0x3C, 0x00, 0x18, 0x27, 0x0A, 0x01, 0x03,
+ 0x06, 0x16, 0x00, 0x0B, 0x01, 0x0F, 0x00, 0x06,
+ 0x3C, 0x00, 0x18, 0x27, 0x0A, 0x02, 0x04, 0x06,
+ 0x16, 0x00, 0x0B, 0x02, 0x0F, 0x00, 0x02, 0x06,
+ 0x0D, 0x00, 0x00, 0x00, 0x16, 0x00, 0x06, 0x06,
+ 0x00, 0x06, 0x78, 0x00, 0x18, 0x14, 0x0A, 0x02,
+ 0x04, 0x06, 0x16, 0x00, 0x0B, 0x02, 0x0C, 0x00,
+ 0x13, 0x01, 0x06, 0x1D
+};
+
+static const ByteProvider k1KyrandiaLogoSeqDOSProvider = { ARRAYSIZE(k1KyrandiaLogoSeqDOS), k1KyrandiaLogoSeqDOS };
+
+static const byte k1KallakMalcolmSeqDOS[619] = {
+ 0x00, 0x04, 0x01, 0x1A, 0x0E, 0x17, 0x00, 0x00,
+ 0x00, 0x3F, 0x01, 0xC7, 0x0C, 0x00, 0x0C, 0x03,
+ 0x0D, 0x00, 0x17, 0x00, 0x00, 0x88, 0x3F, 0x01,
+ 0xC7, 0x0C, 0x02, 0x19, 0x00, 0x02, 0x04, 0x00,
+ 0x10, 0x00, 0x3A, 0x09, 0x19, 0x00, 0x19, 0x05,
+ 0x14, 0x18, 0x23, 0x0A, 0x00, 0x03, 0x04, 0x07,
+ 0x07, 0x00, 0x0B, 0x00, 0x22, 0x00, 0x10, 0x02,
+ 0x50, 0x00, 0x3A, 0x05, 0x0A, 0x01, 0x03, 0x04,
+ 0x07, 0x07, 0x00, 0x0B, 0x01, 0x07, 0x00, 0x06,
+ 0x3C, 0x00, 0x10, 0x03, 0x50, 0x00, 0x3A, 0x05,
+ 0x0A, 0x02, 0x03, 0x04, 0x07, 0x07, 0x00, 0x0B,
+ 0x02, 0x17, 0x00, 0x06, 0x3C, 0x00, 0x10, 0x04,
+ 0x50, 0x00, 0x3A, 0x05, 0x0A, 0x03, 0x03, 0x04,
+ 0x07, 0x07, 0x00, 0x0B, 0x03, 0x0A, 0x00, 0x06,
+ 0x3C, 0x00, 0x03, 0x04, 0x07, 0x07, 0x00, 0x03,
+ 0x04, 0x07, 0x07, 0x00, 0x03, 0x04, 0x07, 0x07,
+ 0x00, 0x10, 0x05, 0xF0, 0x00, 0x3A, 0x0F, 0x03,
+ 0x04, 0x07, 0x07, 0x00, 0x03, 0x04, 0x07, 0x07,
+ 0x00, 0x03, 0x04, 0x07, 0x07, 0x00, 0x03, 0x04,
+ 0x07, 0x07, 0x00, 0x06, 0x3C, 0x00, 0x10, 0x06,
+ 0xF0, 0x00, 0x3A, 0x0F, 0x0A, 0x04, 0x03, 0x04,
+ 0x07, 0x07, 0x00, 0x0B, 0x04, 0x12, 0x00, 0x06,
+ 0x3C, 0x00, 0x03, 0x04, 0x07, 0x07, 0x00, 0x03,
+ 0x04, 0x07, 0x07, 0x00, 0x03, 0x04, 0x07, 0x07,
+ 0x00, 0x03, 0x04, 0x07, 0x07, 0x00, 0x06, 0x78,
+ 0x00, 0x10, 0x07, 0xF0, 0x00, 0x3A, 0x0F, 0x0A,
+ 0x05, 0x03, 0x04, 0x07, 0x07, 0x00, 0x0B, 0x05,
+ 0x11, 0x00, 0x06, 0x3C, 0x00, 0x03, 0x04, 0x07,
+ 0x07, 0x00, 0x03, 0x04, 0x07, 0x07, 0x00, 0x10,
+ 0x08, 0x50, 0x00, 0x3A, 0x05, 0x0A, 0x06, 0x03,
+ 0x04, 0x07, 0x07, 0x00, 0x0B, 0x06, 0x07, 0x00,
+ 0x06, 0x3C, 0x00, 0x03, 0x04, 0x07, 0x07, 0x00,
+ 0x03, 0x04, 0x07, 0x07, 0x00, 0x03, 0x04, 0x07,
+ 0x07, 0x00, 0x10, 0x09, 0x50, 0x00, 0x3A, 0x05,
+ 0x0A, 0x07, 0x03, 0x04, 0x07, 0x07, 0x00, 0x0B,
+ 0x07, 0x0A, 0x00, 0x06, 0x3C, 0x00, 0x03, 0x04,
+ 0x07, 0x07, 0x00, 0x10, 0x0A, 0x50, 0x00, 0x3A,
+ 0x05, 0x0A, 0x08, 0x03, 0x04, 0x07, 0x07, 0x00,
+ 0x0B, 0x08, 0x10, 0x00, 0x06, 0x3C, 0x00, 0x03,
+ 0x04, 0x07, 0x07, 0x00, 0x10, 0x0B, 0xF0, 0x00,
+ 0x3A, 0x0F, 0x03, 0x04, 0x07, 0x07, 0x00, 0x03,
+ 0x04, 0x07, 0x07, 0x00, 0x03, 0x04, 0x07, 0x07,
+ 0x00, 0x03, 0x04, 0x07, 0x07, 0x00, 0x03, 0x04,
+ 0x07, 0x07, 0x00, 0x03, 0x04, 0x07, 0x07, 0x00,
+ 0x03, 0x04, 0x07, 0x07, 0x00, 0x03, 0x04, 0x07,
+ 0x07, 0x00, 0x06, 0x3C, 0x00, 0x03, 0x04, 0x07,
+ 0x07, 0x00, 0x10, 0x0C, 0xF0, 0x00, 0x3A, 0x0F,
+ 0x0A, 0x09, 0x03, 0x04, 0x07, 0x07, 0x00, 0x0B,
+ 0x09, 0x0E, 0x00, 0x06, 0x3C, 0x00, 0x03, 0x04,
+ 0x07, 0x07, 0x00, 0x03, 0x04, 0x07, 0x07, 0x00,
+ 0x03, 0x04, 0x07, 0x07, 0x00, 0x03, 0x04, 0x07,
+ 0x07, 0x00, 0x03, 0x04, 0x07, 0x07, 0x00, 0x03,
+ 0x04, 0x07, 0x07, 0x00, 0x10, 0x0D, 0x50, 0x00,
+ 0x3A, 0x05, 0x0A, 0x0A, 0x03, 0x04, 0x07, 0x07,
+ 0x00, 0x0B, 0x0A, 0x0E, 0x00, 0x06, 0x3C, 0x00,
+ 0x0A, 0x0B, 0x03, 0x04, 0x07, 0x07, 0x00, 0x0B,
+ 0x0B, 0x02, 0x00, 0x18, 0x20, 0x0A, 0x0C, 0x03,
+ 0x04, 0x07, 0x07, 0x00, 0x0B, 0x0C, 0x06, 0x00,
+ 0x18, 0x21, 0x0A, 0x0D, 0x03, 0x04, 0x07, 0x07,
+ 0x00, 0x0B, 0x0D, 0x0C, 0x00, 0x18, 0x22, 0x0A,
+ 0x0E, 0x03, 0x04, 0x07, 0x07, 0x00, 0x0B, 0x0E,
+ 0x0B, 0x00, 0x10, 0x0E, 0x50, 0x00, 0x3A, 0x05,
+ 0x0A, 0x0F, 0x03, 0x04, 0x07, 0x07, 0x00, 0x0B,
+ 0x0F, 0x09, 0x00, 0x06, 0x3C, 0x00, 0x03, 0x04,
+ 0x07, 0x07, 0x00, 0x10, 0x0F, 0x50, 0x00, 0x3A,
+ 0x05, 0x0A, 0x10, 0x03, 0x04, 0x07, 0x07, 0x00,
+ 0x0B, 0x10, 0x09, 0x00, 0x06, 0x3C, 0x00, 0x03,
+ 0x04, 0x07, 0x07, 0x00, 0x10, 0x10, 0x50, 0x00,
+ 0x3A, 0x05, 0x0A, 0x11, 0x03, 0x04, 0x07, 0x07,
+ 0x00, 0x0B, 0x11, 0x0F, 0x00, 0x06, 0x3C, 0x00,
+ 0x03, 0x04, 0x07, 0x07, 0x00, 0x10, 0x11, 0x50,
+ 0x00, 0x3A, 0x05, 0x0A, 0x12, 0x03, 0x04, 0x07,
+ 0x07, 0x00, 0x0B, 0x12, 0x14, 0x00, 0x06, 0x3C,
+ 0x00, 0x0A, 0x13, 0x03, 0x04, 0x07, 0x07, 0x00,
+ 0x0B, 0x13, 0x06, 0x00, 0x18, 0x23, 0x0A, 0x13,
+ 0x03, 0x04, 0x07, 0x07, 0x00, 0x0B, 0x13, 0x07,
+ 0x00, 0x11, 0x06, 0x3C, 0x00, 0x13, 0x19, 0x01,
+ 0x01, 0x04, 0x1D
+};
+
+static const ByteProvider k1KallakMalcolmSeqDOSProvider = { ARRAYSIZE(k1KallakMalcolmSeqDOS), k1KallakMalcolmSeqDOS };
+
+static const byte k1ForestSeqDOS[405] = {
+ 0x00, 0x05, 0x01, 0x00, 0x07, 0x01, 0x1A, 0x02,
+ 0x07, 0x00, 0x00, 0x00, 0x08, 0x02, 0x05, 0x00,
+ 0x98, 0x00, 0x38, 0x0A, 0x00, 0x03, 0x07, 0x16,
+ 0x02, 0x06, 0x09, 0x00, 0x0B, 0x00, 0x41, 0x00,
+ 0x18, 0x16, 0x03, 0x07, 0x02, 0x05, 0x01, 0x98,
+ 0x00, 0x38, 0x16, 0x02, 0x16, 0x03, 0x06, 0x09,
+ 0x00, 0x03, 0x07, 0x02, 0x05, 0x03, 0x98, 0x00,
+ 0x38, 0x16, 0x02, 0x16, 0x03, 0x06, 0x09, 0x00,
+ 0x03, 0x07, 0x02, 0x05, 0x01, 0x98, 0x00, 0x38,
+ 0x16, 0x02, 0x16, 0x03, 0x06, 0x09, 0x00, 0x03,
+ 0x07, 0x02, 0x05, 0x00, 0x98, 0x00, 0x38, 0x16,
+ 0x02, 0x16, 0x03, 0x06, 0x09, 0x00, 0x0A, 0x05,
+ 0x03, 0x07, 0x16, 0x02, 0x06, 0x09, 0x00, 0x0B,
+ 0x05, 0x0E, 0x00, 0x18, 0x16, 0x03, 0x07, 0x02,
+ 0x05, 0x01, 0x98, 0x00, 0x38, 0x16, 0x02, 0x16,
+ 0x03, 0x06, 0x09, 0x00, 0x03, 0x07, 0x02, 0x05,
+ 0x03, 0x98, 0x00, 0x38, 0x16, 0x02, 0x16, 0x03,
+ 0x06, 0x09, 0x00, 0x03, 0x07, 0x02, 0x05, 0x01,
+ 0x98, 0x00, 0x38, 0x16, 0x02, 0x16, 0x03, 0x06,
+ 0x09, 0x00, 0x03, 0x07, 0x02, 0x05, 0x04, 0x98,
+ 0x00, 0x38, 0x16, 0x02, 0x16, 0x03, 0x06, 0x09,
+ 0x00, 0x03, 0x07, 0x16, 0x02, 0x06, 0x09, 0x00,
+ 0x03, 0x07, 0x16, 0x02, 0x06, 0x09, 0x00, 0x03,
+ 0x07, 0x02, 0x05, 0x05, 0x98, 0x00, 0x38, 0x16,
+ 0x02, 0x16, 0x03, 0x06, 0x09, 0x00, 0x03, 0x07,
+ 0x16, 0x02, 0x06, 0x09, 0x00, 0x03, 0x07, 0x16,
+ 0x02, 0x06, 0x09, 0x00, 0x03, 0x07, 0x02, 0x05,
+ 0x06, 0x98, 0x00, 0x38, 0x16, 0x02, 0x16, 0x03,
+ 0x06, 0x09, 0x00, 0x03, 0x07, 0x16, 0x02, 0x06,
+ 0x09, 0x00, 0x03, 0x07, 0x16, 0x02, 0x06, 0x09,
+ 0x00, 0x18, 0x25, 0x0A, 0x00, 0x03, 0x07, 0x03,
+ 0x05, 0x16, 0x02, 0x16, 0x03, 0x06, 0x09, 0x00,
+ 0x0B, 0x00, 0x09, 0x00, 0x0A, 0x06, 0x03, 0x07,
+ 0x16, 0x02, 0x06, 0x09, 0x00, 0x0B, 0x06, 0x0E,
+ 0x00, 0x18, 0x17, 0x0A, 0x01, 0x03, 0x07, 0x03,
+ 0x05, 0x16, 0x02, 0x16, 0x03, 0x06, 0x09, 0x00,
+ 0x0B, 0x01, 0x0D, 0x00, 0x18, 0x25, 0x0A, 0x07,
+ 0x03, 0x07, 0x16, 0x02, 0x06, 0x09, 0x00, 0x0B,
+ 0x07, 0x0E, 0x00, 0x18, 0x18, 0x03, 0x07, 0x03,
+ 0x05, 0x16, 0x02, 0x16, 0x03, 0x06, 0x09, 0x00,
+ 0x03, 0x07, 0x03, 0x05, 0x16, 0x02, 0x16, 0x03,
+ 0x06, 0x09, 0x00, 0x03, 0x07, 0x03, 0x05, 0x16,
+ 0x02, 0x16, 0x03, 0x06, 0x09, 0x00, 0x03, 0x07,
+ 0x03, 0x05, 0x16, 0x02, 0x16, 0x03, 0x06, 0x09,
+ 0x00, 0x03, 0x07, 0x03, 0x05, 0x16, 0x02, 0x16,
+ 0x03, 0x06, 0x09, 0x00, 0x06, 0x12, 0x00, 0x18,
+ 0x25, 0x0A, 0x02, 0x03, 0x07, 0x03, 0x05, 0x16,
+ 0x02, 0x16, 0x03, 0x06, 0x09, 0x00, 0x0B, 0x02,
+ 0x07, 0x00, 0x0A, 0x03, 0x03, 0x07, 0x16, 0x02,
+ 0x06, 0x09, 0x00, 0x0B, 0x03, 0x0F, 0x00, 0x13,
+ 0x01, 0x07, 0x01, 0x05, 0x1D
+};
+
+static const ByteProvider k1ForestSeqDOSProvider = { ARRAYSIZE(k1ForestSeqDOS), k1ForestSeqDOS };
+
+static const char *const k1IntroCPSStringsDOS[2] = {
+ "gemcut.cps",
+ "tree.cps"
+};
+
+static const StringListProvider k1IntroCPSStringsDOSProvider = { ARRAYSIZE(k1IntroCPSStringsDOS), k1IntroCPSStringsDOS };
+
+static const char *const k1IntroCOLStringsDOS[4] = {
+ "kallak.col",
+ "tree_exp.col",
+ "ww.col",
+ "mal-kal.col"
+};
+
+static const StringListProvider k1IntroCOLStringsDOSProvider = { ARRAYSIZE(k1IntroCOLStringsDOS), k1IntroCOLStringsDOS };
+
+static const char *const k1IntroWSAStringsDOS[11] = {
+ "kallak.wsa",
+ "tree1.wsa",
+ "tree2.wsa",
+ "westwood.wsa",
+ "mal-kal.wsa",
+ "destruct.wsa",
+ "kyrandia.wsa",
+ "shore.wsa",
+ "reunion.wsa",
+ "reuniont.wsa",
+ "latern.wsa"
+};
+
+static const StringListProvider k1IntroWSAStringsDOSProvider = { ARRAYSIZE(k1IntroWSAStringsDOS), k1IntroWSAStringsDOS };
+
+static const Room k1RoomListDOS[246] = {
+ { 30, 0xFFFF, 0xFFFF, 0x0001, 0xFFFF },
+ { 71, 0xFFFF, 0xFFFF, 0x0005, 0xFFFF },
+ { 44, 0xFFFF, 0x0003, 0xFFFF, 0xFFFF },
+ { 72, 0xFFFF, 0xFFFF, 0x000E, 0xFFFF },
+ { 48, 0xFFFF, 0x0005, 0xFFFF, 0x000E },
+ { 74, 0xFFFF, 0x000A, 0xFFFF, 0x0004 },
+ { 46, 0xFFFF, 0x000F, 0xFFFF, 0x000B },
+ { 75, 0xFFFF, 0x0009, 0xFFFF, 0x0018 },
+ { 13, 0xFFFF, 0x000C, 0xFFFF, 0x000A },
+ { 5, 0x000D, 0xFFFF, 0xFFFF, 0x0007 },
+ { 84, 0xFFFF, 0x0008, 0xFFFF, 0x0005 },
+ { 37, 0xFFFF, 0x0006, 0x000C, 0x0010 },
+ { 51, 0x000B, 0xFFFF, 0x000D, 0x0008 },
+ { 23, 0x000C, 0xFFFF, 0x0009, 0xFFFF },
+ { 25, 0x0003, 0x0004, 0xFFFF, 0xFFFF },
+ { 11, 0xFFFF, 0xFFFF, 0xFFFF, 0x0006 },
+ { 86, 0xFFFF, 0x000B, 0xFFFF, 0xFFFF },
+ { 84, 0xFFFF, 0x0022, 0x0017, 0x0016 },
+ { 51, 0x0020, 0x0014, 0x0024, 0x0015 },
+ { 85, 0x0014, 0x0019, 0xFFFF, 0x0024 },
+ { 33, 0x001C, 0xFFFF, 0x0013, 0x0012 },
+ { 31, 0x0022, 0x0012, 0xFFFF, 0x0017 },
+ { 25, 0x001F, 0x0011, 0xFFFF, 0xFFFF },
+ { 25, 0x0011, 0x0015, 0xFFFF, 0xFFFF },
+ { 2, 0xFFFF, 0x0007, 0xFFFF, 0x001A },
+ { 82, 0xFFFF, 0x006D, 0xFFFF, 0x0013 },
+ { 77, 0xFFFF, 0x0018, 0x0021, 0xFFFF },
+ { 15, 0xFFFF, 0x001A, 0xFFFF, 0xFFFF },
+ { 16, 0xFFFF, 0xFFFF, 0x0014, 0x0020 },
+ { 19, 0xFFFF, 0x0021, 0xFFFF, 0x001F },
+ { 12, 0xFFFF, 0xFFFF, 0x0020, 0x0021 },
+ { 7, 0x0023, 0x001D, 0x0016, 0xFFFF },
+ { 20, 0x001E, 0x001C, 0x0012, 0x0022 },
+ { 17, 0x001A, 0x001E, 0x0022, 0x001D },
+ { 22, 0x0021, 0x0020, 0x0015, 0x0011 },
+ { 24, 0xFFFF, 0xFFFF, 0x001F, 0xFFFF },
+ { 32, 0x0012, 0x0013, 0xFFFF, 0xFFFF },
+ { 87, 0xFFFF, 0x0026, 0xFFFF, 0xFFFF },
+ { 8, 0xFFFF, 0x0027, 0xFFFF, 0x0025 },
+ { 88, 0xFFFF, 0x0035, 0x0037, 0x0026 },
+ { 35, 0xFFFF, 0x0036, 0x0038, 0xFFFF },
+ { 47, 0xFFFF, 0xFFFF, 0x003B, 0xFFFF },
+ { 28, 0x0035, 0x002B, 0x002F, 0x0037 },
+ { 36, 0xFFFF, 0x002C, 0xFFFF, 0x002A },
+ { 78, 0xFFFF, 0xFFFF, 0xFFFF, 0x002B },
+ { 10, 0xFFFF, 0xFFFF, 0xFFFF, 0x002C },
+ { 51, 0x0037, 0x002F, 0x0040, 0x003C },
+ { 38, 0x002A, 0x003D, 0x0041, 0x002E },
+ { 81, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF },
+ { 41, 0xFFFF, 0xFFFF, 0x0069, 0xFFFF },
+ { 50, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF },
+ { 18, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF },
+ { 49, 0xFFFF, 0xFFFF, 0x0054, 0xFFFF },
+ { 105, 0xFFFF, 0xFFFF, 0x002A, 0x0027 },
+ { 105, 0xFFFF, 0xFFFF, 0x0039, 0x0028 },
+ { 37, 0x0027, 0x002A, 0x002E, 0x0049 },
+ { 34, 0x0028, 0x0039, 0xFFFF, 0xFFFF },
+ { 51, 0x0036, 0x003A, 0xFFFF, 0x0038 },
+ { 84, 0xFFFF, 0x003B, 0xFFFF, 0x0039 },
+ { 1, 0x0029, 0xFFFF, 0x003E, 0x003A },
+ { 37, 0x0049, 0x002E, 0x003F, 0xFFFF },
+ { 33, 0xFFFF, 0xFFFF, 0xFFFF, 0x002F },
+ { 34, 0x003B, 0x003F, 0xFFFF, 0xFFFF },
+ { 85, 0x003C, 0x0040, 0xFFFF, 0x003E },
+ { 106, 0x002E, 0x0041, 0xFFFF, 0x003F },
+ { 33, 0x002F, 0xFFFF, 0xFFFF, 0x0040 },
+ { 60, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF },
+ { 3, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF },
+ { 11, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF },
+ { 33, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF },
+ { 26, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF },
+ { 0, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF },
+ { 25, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF },
+ { 23, 0xFFFF, 0x0037, 0x003C, 0xFFFF },
+ { 6, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF },
+ { 51, 0x0063, 0x0067, 0x006B, 0x0066 },
+ { 66, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF },
+ { 67, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF },
+ { 62, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF },
+ { 65, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF },
+ { 18, 0x0056, 0x005A, 0x005E, 0xFFFF },
+ { 6, 0xFFFF, 0x0052, 0x0056, 0xFFFF },
+ { 4, 0xFFFF, 0x0053, 0x0057, 0x0051 },
+ { 3, 0xFFFF, 0x0054, 0xFFFF, 0x0052 },
+ { 37, 0x0034, 0x0055, 0x0058, 0x0053 },
+ { 11, 0xFFFF, 0xFFFF, 0x0059, 0x0054 },
+ { 37, 0x0051, 0x0057, 0x0050, 0xFFFF },
+ { 51, 0x0052, 0xFFFF, 0x005A, 0x0056 },
+ { 51, 0x0054, 0x0059, 0x005C, 0xFFFF },
+ { 1, 0x0055, 0xFFFF, 0x005D, 0x0058 },
+ { 106, 0x0057, 0x005B, 0xFFFF, 0x0050 },
+ { 85, 0xFFFF, 0x005C, 0xFFFF, 0x005A },
+ { 37, 0x0058, 0x005D, 0x005F, 0x005B },
+ { 33, 0x0059, 0xFFFF, 0xFFFF, 0x005C },
+ { 51, 0x0050, 0xFFFF, 0x0061, 0xFFFF },
+ { 51, 0x005C, 0xFFFF, 0x0064, 0xFFFF },
+ { 37, 0xFFFF, 0x0061, 0x0065, 0xFFFF },
+ { 51, 0x005E, 0x0062, 0xFFFF, 0x0060 },
+ { 84, 0xFFFF, 0x0063, 0x0066, 0x0061 },
+ { 84, 0xFFFF, 0x0064, 0x004B, 0x0062 },
+ { 33, 0x005F, 0xFFFF, 0x0067, 0x0063 },
+ { 51, 0x0060, 0xFFFF, 0x0068, 0xFFFF },
+ { 37, 0x0062, 0x004B, 0x006A, 0xFFFF },
+ { 1, 0x0064, 0xFFFF, 0x006C, 0x004B },
+ { 34, 0x0065, 0x0069, 0xFFFF, 0xFFFF },
+ { 51, 0x0031, 0x006A, 0xFFFF, 0x0068 },
+ { 85, 0x0066, 0x006B, 0xFFFF, 0x0069 },
+ { 106, 0x004B, 0x006C, 0xFFFF, 0x006A },
+ { 33, 0x0067, 0xFFFF, 0xFFFF, 0x006B },
+ { 55, 0x00C4, 0x00C5, 0xFFFF, 0x0019 },
+ { 52, 0xFFFF, 0x00C1, 0xFFFF, 0x0096 },
+ { 64, 0xFFFF, 0x00BF, 0xFFFF, 0x008C },
+ { 57, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF },
+ { 54, 0x00AF, 0xFFFF, 0x00B7, 0x00AC },
+ { 53, 0x0078, 0xFFFF, 0x0079, 0xFFFF },
+ { 29, 0xFFFF, 0x00BB, 0xFFFF, 0x00C5 },
+ { 69, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF },
+ { 76, 0x00C6, 0xFFFF, 0xFFFF, 0x00B1 },
+ { 59, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF },
+ { 58, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF },
+ { 59, 0xFFFF, 0x0025, 0x0072, 0xFFFF },
+ { 58, 0x0072, 0x007B, 0x00BB, 0xFFFF },
+ { 58, 0xFFFF, 0x007F, 0x007B, 0xFFFF },
+ { 59, 0x007A, 0xFFFF, 0x007C, 0x0079 },
+ { 58, 0x007B, 0x0081, 0x00BC, 0xFFFF },
+ { 58, 0x00BC, 0x0083, 0xFFFF, 0xFFFF },
+ { 58, 0xFFFF, 0x0085, 0x007F, 0xFFFF },
+ { 59, 0x007E, 0x0086, 0x0080, 0x007A },
+ { 58, 0x007F, 0x00BD, 0x0081, 0xFFFF },
+ { 59, 0x0080, 0x0087, 0x0082, 0x007C },
+ { 58, 0x0081, 0xFFFF, 0x0083, 0x00BC },
+ { 59, 0x0082, 0x0089, 0x0084, 0x007D },
+ { 58, 0x0083, 0x008A, 0xFFFF, 0xFFFF },
+ { 59, 0xFFFF, 0x008B, 0x0086, 0x007E },
+ { 58, 0x0085, 0x008C, 0x00BD, 0x007F },
+ { 58, 0x00BD, 0x008E, 0x0088, 0x0081 },
+ { 59, 0x0087, 0xFFFF, 0x0089, 0xFFFF },
+ { 58, 0x0088, 0x0090, 0x008A, 0x0083 },
+ { 59, 0x0089, 0x0091, 0xFFFF, 0x0084 },
+ { 58, 0xFFFF, 0x0092, 0x008C, 0x0085 },
+ { 59, 0x008B, 0x006F, 0x008D, 0x0086 },
+ { 58, 0x008C, 0x0093, 0x008E, 0x00BD },
+ { 59, 0x008D, 0xFFFF, 0xFFFF, 0x0087 },
+ { 58, 0xFFFF, 0x00BE, 0x0090, 0xFFFF },
+ { 59, 0x008F, 0x0095, 0x0091, 0x0089 },
+ { 58, 0x0090, 0x0096, 0xFFFF, 0x008A },
+ { 59, 0xFFFF, 0x0098, 0xFFFF, 0x008B },
+ { 59, 0xFFFF, 0xFFFF, 0xFFFF, 0x008D },
+ { 58, 0xFFFF, 0x009A, 0x00BE, 0xFFFF },
+ { 58, 0x00BE, 0xFFFF, 0x0096, 0x0090 },
+ { 59, 0x0095, 0x006E, 0x0097, 0x0091 },
+ { 58, 0x0096, 0x009D, 0xFFFF, 0xFFFF },
+ { 58, 0xFFFF, 0x009E, 0x00BF, 0x0092 },
+ { 58, 0x00BF, 0x00A0, 0x009A, 0xFFFF },
+ { 59, 0x0099, 0xFFFF, 0x009B, 0x0094 },
+ { 58, 0x009A, 0xFFFF, 0x009C, 0xFFFF },
+ { 59, 0x009B, 0x00A2, 0xFFFF, 0xFFFF },
+ { 59, 0xFFFF, 0x00A3, 0xFFFF, 0x0097 },
+ { 59, 0xFFFF, 0xFFFF, 0x009F, 0x0098 },
+ { 58, 0x009E, 0x00A4, 0x00A0, 0x00BF },
+ { 59, 0x009F, 0x00A5, 0xFFFF, 0x0099 },
+ { 58, 0xFFFF, 0x00A6, 0x00C0, 0xFFFF },
+ { 58, 0x00C0, 0x00A8, 0xFFFF, 0x009C },
+ { 58, 0x00C1, 0xFFFF, 0xFFFF, 0x009D },
+ { 59, 0xFFFF, 0x00AA, 0x00A5, 0x009F },
+ { 58, 0x00A4, 0x00AB, 0x00A6, 0x00A0 },
+ { 59, 0x00A5, 0x00AC, 0x00A7, 0x00A1 },
+ { 58, 0x00A6, 0xFFFF, 0xFFFF, 0x00C0 },
+ { 59, 0xFFFF, 0x00AD, 0x00A9, 0x00A2 },
+ { 58, 0x00A8, 0x00AE, 0xFFFF, 0x00C1 },
+ { 58, 0xFFFF, 0xFFFF, 0x00AB, 0x00A4 },
+ { 59, 0x00AA, 0x00AF, 0x00AC, 0x00A5 },
+ { 58, 0x00AB, 0x0071, 0x00C2, 0x00A6 },
+ { 58, 0xFFFF, 0x00B0, 0x00AE, 0x00A8 },
+ { 59, 0x00AD, 0xFFFF, 0xFFFF, 0x00A9 },
+ { 58, 0xFFFF, 0x00C3, 0x0071, 0x00AB },
+ { 59, 0xFFFF, 0xFFFF, 0x00B1, 0x00AD },
+ { 58, 0x00B0, 0x0075, 0xFFFF, 0xFFFF },
+ { 59, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF },
+ { 59, 0x00C3, 0xFFFF, 0x00B4, 0xFFFF },
+ { 59, 0x00B3, 0x00BA, 0xFFFF, 0xFFFF },
+ { 58, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF },
+ { 59, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF },
+ { 58, 0x0071, 0xFFFF, 0xFFFF, 0x00C2 },
+ { 58, 0xFFFF, 0xFFFF, 0x00B9, 0xFFFF },
+ { 59, 0x00B8, 0xFFFF, 0xFFFF, 0x00C3 },
+ { 58, 0xFFFF, 0xFFFF, 0xFFFF, 0x00B4 },
+ { 59, 0x0079, 0xFFFF, 0xFFFF, 0x0073 },
+ { 59, 0x007C, 0x0082, 0x007D, 0xFFFF },
+ { 59, 0x0086, 0x008D, 0x0087, 0x0080 },
+ { 59, 0x0094, 0xFFFF, 0x0095, 0x008F },
+ { 59, 0x0098, 0x009F, 0x0099, 0x006F },
+ { 59, 0x00A1, 0x00A7, 0x00A2, 0xFFFF },
+ { 59, 0xFFFF, 0x00A9, 0x00A3, 0x006E },
+ { 59, 0x00AC, 0x00B7, 0xFFFF, 0xFFFF },
+ { 58, 0xFFFF, 0x00B9, 0x00B3, 0x00AF },
+ { 59, 0xFFFF, 0xFFFF, 0x006D, 0xFFFF },
+ { 58, 0xFFFF, 0x0073, 0xFFFF, 0x006D },
+ { 59, 0xFFFF, 0xFFFF, 0x0075, 0xFFFF },
+ { 94, 0xFFFF, 0x00C8, 0xFFFF, 0xFFFF },
+ { 43, 0x00C9, 0x00CB, 0x00CA, 0x00C7 },
+ { 51, 0xFFFF, 0xFFFF, 0x00C8, 0xFFFF },
+ { 37, 0x00C8, 0xFFFF, 0xFFFF, 0xFFFF },
+ { 79, 0xFFFF, 0xFFFF, 0xFFFF, 0x00C8 },
+ { 80, 0xFFFF, 0xFFFF, 0x00CB, 0x00CD },
+ { 97, 0x00E3, 0x00D4, 0x00CC, 0x00D3 },
+ { 103, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF },
+ { 100, 0xFFFF, 0x00CE, 0x00D5, 0xFFFF },
+ { 98, 0xFFFF, 0xFFFF, 0xFFFF, 0x00D7 },
+ { 101, 0xFFFF, 0x00D2, 0x00CE, 0xFFFF },
+ { 99, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF },
+ { 93, 0x00D5, 0x00CD, 0xFFFF, 0xFFFF },
+ { 93, 0x00D6, 0xFFFF, 0xFFFF, 0x00CD },
+ { 93, 0x00CF, 0x00CE, 0x00D3, 0xFFFF },
+ { 93, 0x00D7, 0xFFFF, 0x00D4, 0x00CE },
+ { 93, 0xFFFF, 0x00D0, 0x00D6, 0x00CE },
+ { 93, 0x00DA, 0x00E3, 0xFFFF, 0xFFFF },
+ { 93, 0x00DB, 0xFFFF, 0xFFFF, 0x00E3 },
+ { 93, 0xFFFF, 0x00E4, 0x00D8, 0x00E2 },
+ { 93, 0xFFFF, 0x00E1, 0x00D9, 0x00E4 },
+ { 93, 0xFFFF, 0x00E4, 0xFFFF, 0x00DF },
+ { 93, 0xFFFF, 0x00E0, 0xFFFF, 0x00E4 },
+ { 93, 0xFFFF, 0xFFFF, 0x00E4, 0xFFFF },
+ { 91, 0xFFFF, 0x00DC, 0xFFFF, 0xFFFF },
+ { 90, 0xFFFF, 0xFFFF, 0xFFFF, 0x00DD },
+ { 92, 0xFFFF, 0xFFFF, 0xFFFF, 0x00DB },
+ { 95, 0xFFFF, 0x00DA, 0xFFFF, 0xFFFF },
+ { 96, 0xFFFF, 0x00D9, 0x00CD, 0x00D8 },
+ { 89, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF },
+ { 102, 0xFFFF, 0x00E6, 0xFFFF, 0xFFFF },
+ { 102, 0xFFFF, 0x00EA, 0x00E8, 0x00E5 },
+ { 102, 0xFFFF, 0x00E8, 0x00EB, 0xFFFF },
+ { 102, 0x00E6, 0xFFFF, 0xFFFF, 0x00E7 },
+ { 102, 0xFFFF, 0xFFFF, 0x00ED, 0xFFFF },
+ { 102, 0xFFFF, 0xFFFF, 0xFFFF, 0x00E6 },
+ { 102, 0x00E7, 0x00EC, 0x00EF, 0xFFFF },
+ { 102, 0xFFFF, 0x00ED, 0x00F0, 0x00EB },
+ { 102, 0x00E9, 0x00EE, 0x00F1, 0x00EC },
+ { 102, 0xFFFF, 0xFFFF, 0x00F2, 0x00ED },
+ { 102, 0x00EB, 0x00F0, 0xFFFF, 0xFFFF },
+ { 102, 0x00EC, 0x00F1, 0x00F3, 0x00EF },
+ { 102, 0x00ED, 0xFFFF, 0x00F4, 0x00F0 },
+ { 102, 0x00EE, 0xFFFF, 0xFFFF, 0xFFFF },
+ { 102, 0x00F0, 0x00F4, 0xFFFF, 0xFFFF },
+ { 102, 0x00F1, 0x00F5, 0xFFFF, 0x00F3 },
+ { 102, 0xFFFF, 0xFFFF, 0x00CF, 0x00F4 }
+};
+
+static const RoomProvider k1RoomListDOSProvider = { ARRAYSIZE(k1RoomListDOS), k1RoomListDOS };
+
+static const char *const k1RoomFilenamesDOS[107] = {
+ "CLIFFB",
+ "XEDGEB",
+ "CAVEB",
+ "NCLIFF",
+ "NCLIFFB",
+ "CAVE",
+ "NWCLIFF",
+ "OAKS",
+ "PLATEAU",
+ "POTHUT",
+ "POTION",
+ "NWCLIFB",
+ "SONG",
+ "SORROW",
+ "SPELHUT",
+ "SPELL",
+ "SPRING",
+ "SQUARE",
+ "STUMP",
+ "TEMPLE",
+ "WELL",
+ "WILLOW",
+ "WISE",
+ "XEDGE",
+ "RUBY",
+ "ZROCK",
+ "ZROCKB",
+ "FORESTD",
+ "FOUNTN",
+ "GATECV",
+ "GEMCUT",
+ "CLIFF",
+ "DEAD",
+ "EDGE",
+ "EDGEB",
+ "FALLS",
+ "FORESTC",
+ "FORESTB",
+ "GLADE",
+ "GEMHUT",
+ "ALGAE",
+ "MIX",
+ "BRIDGE",
+ "GRAVE",
+ "HEALER",
+ "HEALHUT",
+ "ALTAR",
+ "BURN",
+ "SICKWIL",
+ "LAGOON",
+ "MAPLE",
+ "FORESTA",
+ "ARCH",
+ "CHASM",
+ "EMCAV",
+ "ENTER",
+ "FLOWERS",
+ "GEMSLOT",
+ "GEN_CAV",
+ "GENCAVB",
+ "GOLDEN",
+ "GOLDENB",
+ "ICE",
+ "MARKET",
+ "MOONCAV",
+ "MSHCAV",
+ "POOL",
+ "SEASONS",
+ "SHRINE",
+ "TREECAV",
+ "EXTGEM",
+ "GEM",
+ "EXTHEAL",
+ "BASE",
+ "TRUNK",
+ "BROKEN",
+ "LAVA",
+ "EXTSPEL",
+ "EXTPOT",
+ "CASTLE",
+ "CGATE",
+ "LEPHOLE",
+ "DRAGON",
+ "XEDGEC",
+ "FNORTH",
+ "FSOUTH",
+ "FGOWEST",
+ "PLTCAVE",
+ "BONKBG",
+ "BALCONY",
+ "DARMS",
+ "BRINS",
+ "ALCHEMY",
+ "GENHALL",
+ "LANDING",
+ "BELROOM",
+ "UPSTAIR",
+ "DNSTAIR",
+ "KITCHEN",
+ "KYRAGEM",
+ "LIBRARY",
+ "FOYER",
+ "CATACOM",
+ "GRTHALL",
+ "FESTSTH",
+ "FWSTSTH",
+ "FSOUTHB"
+};
+
+static const StringListProvider k1RoomFilenamesDOSProvider = { ARRAYSIZE(k1RoomFilenamesDOS), k1RoomFilenamesDOS };
+
+static const char *const k1CharacterImageFilenamesDOS[20] = {
+ "BRANDON.CPS",
+ "DAPHNE.CPS",
+ "MERITH.CPS",
+ "HERMAN.CPS",
+ "SMALL.CPS",
+ "MALCOM.CPS",
+ "DRINK.CPS",
+ "SHRINK.CPS",
+ "HEALBR1.CPS",
+ "HEALBR2.CPS",
+ "SNOW1A.CPS",
+ "SNOW2A.CPS",
+ "BRANWILL.CPS",
+ "FLUTE1.CPS",
+ "FLUTE2.CPS",
+ "POISON1.CPS",
+ "POISON2.CPS",
+ "TELEKIN.CPS",
+ "BRANSTON.CPS",
+ "POISON.CPS"
+};
+
+static const StringListProvider k1CharacterImageFilenamesDOSProvider = { ARRAYSIZE(k1CharacterImageFilenamesDOS), k1CharacterImageFilenamesDOS };
+
+static const Shape k1DefaultShapesDOS[166] = {
+ { 0, 0, 0, 3, 48, -12, -48 },
+ { 0, 3, 0, 3, 48, -12, -48 },
+ { 0, 6, 0, 3, 48, -12, -48 },
+ { 0, 9, 0, 3, 48, -12, -48 },
+ { 0, 12, 0, 3, 48, -12, -48 },
+ { 0, 15, 0, 3, 48, -12, -48 },
+ { 0, 18, 0, 3, 48, -12, -48 },
+ { 0, 21, 0, 3, 48, -12, -48 },
+ { 0, 24, 0, 3, 48, -12, -48 },
+ { 0, 27, 0, 3, 48, -12, -48 },
+ { 0, 0, 51, 2, 11, -2, -8 },
+ { 0, 2, 51, 2, 11, -2, -8 },
+ { 0, 4, 51, 2, 11, -2, -8 },
+ { 0, 6, 51, 2, 11, -2, -8 },
+ { 0, 8, 51, 2, 11, -2, -8 },
+ { 0, 10, 51, 2, 11, -2, -8 },
+ { 0, 12, 51, 2, 11, -2, -8 },
+ { 0, 14, 51, 2, 11, -2, -8 },
+ { 0, 16, 51, 2, 11, -2, -8 },
+ { 0, 18, 51, 2, 11, -2, -8 },
+ { 0, 20, 51, 2, 11, -2, -8 },
+ { 0, 22, 51, 2, 11, -2, -8 },
+ { 0, 0, 80, 3, 48, -12, -48 },
+ { 0, 3, 80, 3, 48, -12, -48 },
+ { 0, 6, 80, 3, 48, -12, -48 },
+ { 0, 9, 80, 3, 48, -12, -48 },
+ { 0, 12, 80, 3, 48, -12, -48 },
+ { 0, 15, 80, 3, 48, -12, -48 },
+ { 0, 0, 129, 3, 48, -12, -48 },
+ { 0, 3, 129, 3, 48, -12, -48 },
+ { 0, 6, 129, 3, 48, -12, -48 },
+ { 0, 9, 129, 3, 48, -12, -48 },
+ { 0, 12, 129, 3, 48, -12, -48 },
+ { 0, 15, 129, 3, 48, -12, -48 },
+ { 2, 0, 0, 3, 48, -12, -48 },
+ { 2, 3, 0, 3, 48, -12, -48 },
+ { 2, 6, 0, 3, 48, -12, -48 },
+ { 2, 9, 0, 3, 48, -12, -48 },
+ { 2, 12, 0, 3, 48, -12, -48 },
+ { 2, 15, 0, 3, 48, -12, -48 },
+ { 2, 18, 0, 3, 48, -12, -48 },
+ { 2, 21, 0, 3, 48, -12, -48 },
+ { 2, 24, 0, 3, 48, -12, -48 },
+ { 2, 27, 0, 3, 48, -12, -48 },
+ { 2, 30, 10, 3, 38, -16, -38 },
+ { 2, 27, 48, 4, 40, -8, -40 },
+ { 2, 0, 51, 2, 11, -4, 0 },
+ { 2, 2, 51, 2, 11, -4, 0 },
+ { 2, 4, 51, 2, 11, -4, 0 },
+ { 2, 6, 51, 2, 11, -4, 0 },
+ { 2, 8, 51, 2, 11, -4, 0 },
+ { 2, 10, 51, 2, 11, -4, 0 },
+ { 2, 12, 51, 2, 11, -4, 0 },
+ { 2, 14, 51, 2, 11, -4, 0 },
+ { 2, 16, 51, 2, 11, -4, 0 },
+ { 2, 18, 51, 2, 11, -4, 0 },
+ { 2, 20, 51, 2, 11, -4, 0 },
+ { 2, 22, 51, 2, 11, -4, 0 },
+ { 255, 0, 80, 3, 48, -12, -48 },
+ { 255, 3, 80, 3, 48, -12, -48 },
+ { 255, 6, 80, 3, 48, -12, -48 },
+ { 255, 9, 80, 3, 48, -12, -48 },
+ { 255, 12, 80, 3, 48, -12, -48 },
+ { 255, 15, 80, 3, 48, -12, -48 },
+ { 255, 0, 129, 3, 48, -12, -48 },
+ { 255, 3, 129, 3, 48, -12, -48 },
+ { 255, 6, 129, 3, 48, -12, -48 },
+ { 255, 9, 129, 3, 48, -12, -48 },
+ { 255, 12, 129, 3, 48, -12, -48 },
+ { 255, 15, 129, 3, 48, -12, -48 },
+ { 3, 0, 0, 3, 48, -12, -46 },
+ { 3, 3, 0, 3, 48, -12, -48 },
+ { 3, 6, 0, 3, 48, -12, -48 },
+ { 3, 9, 0, 3, 48, -12, -48 },
+ { 3, 12, 0, 3, 48, -12, -48 },
+ { 3, 15, 0, 3, 48, -12, -48 },
+ { 3, 18, 0, 3, 48, -12, -48 },
+ { 3, 21, 0, 3, 48, -12, -48 },
+ { 3, 24, 0, 3, 48, -12, -48 },
+ { 3, 27, 0, 3, 48, -12, -46 },
+ { 3, 30, 0, 3, 48, -14, -47 },
+ { 3, 39, 199, 1, 1, -12, -48 },
+ { 3, 0, 51, 2, 11, 0, -7 },
+ { 3, 2, 51, 2, 11, 0, -7 },
+ { 3, 4, 51, 2, 11, 0, -7 },
+ { 3, 6, 51, 2, 11, 0, -7 },
+ { 3, 8, 51, 2, 11, 0, -7 },
+ { 3, 10, 51, 2, 11, 0, -7 },
+ { 3, 12, 51, 2, 11, 0, -7 },
+ { 3, 14, 51, 2, 11, 0, -7 },
+ { 3, 16, 51, 2, 11, 0, -7 },
+ { 3, 18, 51, 2, 11, 0, -7 },
+ { 3, 20, 51, 2, 11, 0, -7 },
+ { 3, 22, 51, 2, 11, 0, -7 },
+ { 3, 0, 80, 3, 48, -12, -48 },
+ { 3, 3, 80, 3, 48, -12, -48 },
+ { 3, 6, 80, 3, 48, -12, -48 },
+ { 3, 9, 80, 3, 48, -12, -48 },
+ { 3, 12, 80, 3, 48, -12, -48 },
+ { 3, 15, 80, 3, 48, -12, -48 },
+ { 3, 0, 129, 3, 48, -12, -48 },
+ { 3, 3, 129, 3, 48, -12, -48 },
+ { 3, 6, 129, 3, 48, -12, -48 },
+ { 3, 9, 129, 3, 48, -12, -48 },
+ { 3, 12, 129, 3, 48, -12, -48 },
+ { 3, 15, 129, 3, 48, -12, -48 },
+ { 12, 0, 96, 5, 29, -20, -42 },
+ { 12, 5, 96, 5, 29, -20, -42 },
+ { 12, 10, 96, 5, 29, -20, -42 },
+ { 12, 15, 96, 5, 29, -20, -42 },
+ { 12, 20, 96, 5, 29, -20, -42 },
+ { 12, 25, 96, 5, 29, -20, -42 },
+ { 12, 30, 96, 5, 29, -20, -42 },
+ { 12, 35, 96, 5, 29, -20, -42 },
+ { 12, 0, 125, 5, 29, -20, -42 },
+ { 12, 5, 125, 5, 29, -20, -42 },
+ { 255, 0, 0, 0, 0, 0, 0 },
+ { 255, 0, 0, 0, 0, 0, 0 },
+ { 255, 0, 0, 0, 0, 0, 0 },
+ { 255, 0, 0, 0, 0, 0, 0 },
+ { 255, 0, 0, 0, 0, 0, 0 },
+ { 255, 0, 0, 0, 0, 0, 0 },
+ { 255, 0, 0, 0, 0, 0, 0 },
+ { 255, 0, 0, 0, 0, 0, 0 },
+ { 255, 0, 0, 0, 0, 0, 0 },
+ { 255, 0, 0, 0, 0, 0, 0 },
+ { 255, 0, 0, 0, 0, 0, 0 },
+ { 255, 0, 0, 0, 0, 0, 0 },
+ { 255, 0, 0, 0, 0, 0, 0 },
+ { 255, 0, 0, 0, 0, 0, 0 },
+ { 255, 0, 0, 0, 0, 0, 0 },
+ { 255, 0, 0, 0, 0, 0, 0 },
+ { 255, 0, 0, 0, 0, 0, 0 },
+ { 255, 0, 0, 0, 0, 0, 0 },
+ { 255, 0, 0, 0, 0, 0, 0 },
+ { 255, 0, 0, 0, 0, 0, 0 },
+ { 255, 0, 0, 0, 0, 0, 0 },
+ { 255, 0, 0, 0, 0, 0, 0 },
+ { 255, 0, 0, 0, 0, 0, 0 },
+ { 255, 0, 0, 0, 0, 0, 0 },
+ { 255, 0, 0, 0, 0, 0, 0 },
+ { 255, 0, 0, 0, 0, 0, 0 },
+ { 255, 0, 0, 0, 0, 0, 0 },
+ { 255, 0, 0, 0, 0, 0, 0 },
+ { 255, 0, 0, 0, 0, 0, 0 },
+ { 255, 0, 0, 0, 0, 0, 0 },
+ { 255, 0, 0, 0, 0, 0, 0 },
+ { 255, 0, 0, 0, 0, 0, 0 },
+ { 255, 0, 0, 0, 0, 0, 0 },
+ { 255, 0, 0, 0, 0, 0, 0 },
+ { 255, 0, 0, 0, 0, 0, 0 },
+ { 255, 0, 0, 0, 0, 0, 0 },
+ { 255, 0, 0, 0, 0, 0, 0 },
+ { 255, 0, 0, 0, 0, 0, 0 },
+ { 255, 0, 0, 0, 0, 0, 0 },
+ { 255, 0, 0, 0, 0, 0, 0 },
+ { 255, 0, 0, 0, 0, 0, 0 },
+ { 255, 0, 0, 0, 0, 0, 0 },
+ { 255, 0, 0, 0, 0, 0, 0 },
+ { 255, 0, 0, 0, 0, 0, 0 },
+ { 255, 0, 0, 0, 0, 0, 0 },
+ { 255, 0, 0, 0, 0, 0, 0 },
+ { 255, 0, 0, 0, 0, 0, 0 },
+ { 255, 0, 0, 0, 0, 0, 0 },
+ { 255, 0, 0, 0, 0, 0, 0 },
+ { 255, 0, 0, 0, 0, 0, 0 }
+};
+
+static const ShapeProvider k1DefaultShapesDOSProvider = { ARRAYSIZE(k1DefaultShapesDOS), k1DefaultShapesDOS };
+
+static const byte k1AmuleteAnimSeqDOS[42] = {
+ 0x00, 0x01, 0x02, 0x01, 0x03, 0x04, 0x03, 0x01,
+ 0x02, 0x03, 0x04, 0x05, 0x06, 0x05, 0x04, 0x05,
+ 0x07, 0x08, 0x07, 0x08, 0x09, 0x08, 0x09, 0x07,
+ 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D,
+ 0x0E, 0x0F, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15,
+ 0x16, 0xFF
+};
+
+static const ByteProvider k1AmuleteAnimSeqDOSProvider = { ARRAYSIZE(k1AmuleteAnimSeqDOS), k1AmuleteAnimSeqDOS };
+
+static const byte k1SpecialPalette1DOS[21] = {
+ 0x36, 0x25, 0x1C, 0x31, 0x21, 0x19, 0x2C, 0x1D,
+ 0x16, 0x27, 0x19, 0x13, 0x22, 0x16, 0x11, 0x1D,
+ 0x12, 0x0D, 0x18, 0x0F, 0x0B
+};
+
+static const ByteProvider k1SpecialPalette1DOSProvider = { ARRAYSIZE(k1SpecialPalette1DOS), k1SpecialPalette1DOS };
+
+static const byte k1SpecialPalette2DOS[51] = {
+ 0x03, 0x03, 0x00, 0x37, 0x29, 0x1D, 0x33, 0x25,
+ 0x1A, 0x2D, 0x21, 0x17, 0x2A, 0x1D, 0x13, 0x26,
+ 0x19, 0x11, 0x22, 0x16, 0x0E, 0x1E, 0x12, 0x0C,
+ 0x1A, 0x0F, 0x0A, 0x16, 0x0C, 0x08, 0x12, 0x0A,
+ 0x05, 0x0E, 0x08, 0x05, 0x2D, 0x1E, 0x13, 0x27,
+ 0x19, 0x0F, 0x22, 0x14, 0x0C, 0x1C, 0x11, 0x0A,
+ 0x17, 0x0C, 0x08
+};
+
+static const ByteProvider k1SpecialPalette2DOSProvider = { ARRAYSIZE(k1SpecialPalette2DOS), k1SpecialPalette2DOS };
+
+static const byte k1SpecialPalette3DOS[51] = {
+ 0x03, 0x03, 0x00, 0x25, 0x30, 0x1B, 0x24, 0x2C,
+ 0x18, 0x23, 0x29, 0x15, 0x22, 0x25, 0x12, 0x21,
+ 0x22, 0x11, 0x1F, 0x1D, 0x0D, 0x1B, 0x18, 0x0B,
+ 0x18, 0x13, 0x0A, 0x14, 0x0E, 0x08, 0x11, 0x0A,
+ 0x05, 0x0E, 0x08, 0x05, 0x21, 0x22, 0x11, 0x1D,
+ 0x1C, 0x0C, 0x19, 0x15, 0x0A, 0x15, 0x0F, 0x08,
+ 0x11, 0x0A, 0x05
+};
+
+static const ByteProvider k1SpecialPalette3DOSProvider = { ARRAYSIZE(k1SpecialPalette3DOS), k1SpecialPalette3DOS };
+
+static const byte k1SpecialPalette4DOS[51] = {
+ 0x06, 0x03, 0x01, 0x33, 0x25, 0x0A, 0x2F, 0x21,
+ 0x0A, 0x2B, 0x1D, 0x08, 0x28, 0x1A, 0x08, 0x24,
+ 0x17, 0x06, 0x21, 0x22, 0x06, 0x1D, 0x11, 0x05,
+ 0x19, 0x0E, 0x05, 0x16, 0x0B, 0x03, 0x12, 0x0A,
+ 0x03, 0x0F, 0x08, 0x03, 0x28, 0x1A, 0x08, 0x22,
+ 0x15, 0x05, 0x1D, 0x11, 0x05, 0x17, 0x0C, 0x03,
+ 0x12, 0x0A, 0x03
+};
+
+static const ByteProvider k1SpecialPalette4DOSProvider = { ARRAYSIZE(k1SpecialPalette4DOS), k1SpecialPalette4DOS };
+
+static const byte k1SpecialPalette5DOS[51] = {
+ 0x03, 0x03, 0x00, 0x2A, 0x1D, 0x13, 0x27, 0x1A,
+ 0x11, 0x24, 0x18, 0x0F, 0x21, 0x15, 0x0D, 0x1E,
+ 0x13, 0x0C, 0x1C, 0x11, 0x0A, 0x19, 0x0F, 0x0A,
+ 0x16, 0x0C, 0x08, 0x13, 0x0A, 0x06, 0x11, 0x08,
+ 0x05, 0x0E, 0x08, 0x05, 0x1C, 0x11, 0x0A, 0x19,
+ 0x0E, 0x08, 0x16, 0x0C, 0x08, 0x13, 0x0A, 0x06,
+ 0x11, 0x08, 0x05
+};
+
+static const ByteProvider k1SpecialPalette5DOSProvider = { ARRAYSIZE(k1SpecialPalette5DOS), k1SpecialPalette5DOS };
+
+static const byte k1SpecialPalette6DOS[51] = {
+ 0x00, 0x08, 0x01, 0x00, 0x1E, 0x00, 0x00, 0x1B,
+ 0x00, 0x00, 0x19, 0x00, 0x00, 0x17, 0x00, 0x00,
+ 0x14, 0x00, 0x00, 0x12, 0x00, 0x00, 0x11, 0x00,
+ 0x00, 0x0E, 0x00, 0x00, 0x0B, 0x00, 0x00, 0x0A,
+ 0x00, 0x00, 0x08, 0x00, 0x13, 0x21, 0x0F, 0x11,
+ 0x1F, 0x0D, 0x0E, 0x1D, 0x0C, 0x0C, 0x1B, 0x0B,
+ 0x0A, 0x19, 0x0A
+};
+
+static const ByteProvider k1SpecialPalette6DOSProvider = { ARRAYSIZE(k1SpecialPalette6DOS), k1SpecialPalette6DOS };
+
+static const byte k1SpecialPalette7DOS[54] = {
+ 0x05, 0x2B, 0x00, 0x00, 0x22, 0x00, 0x00, 0x1E,
+ 0x00, 0x00, 0x16, 0x01, 0x00, 0x12, 0x03, 0x00,
+ 0x0F, 0x01, 0x00, 0x0B, 0x03, 0x0A, 0x19, 0x0A,
+ 0x2D, 0x2D, 0x32, 0x29, 0x29, 0x2D, 0x25, 0x25,
+ 0x2B, 0x1F, 0x1F, 0x26, 0x1B, 0x1B, 0x22, 0x14,
+ 0x16, 0x1D, 0x11, 0x11, 0x18, 0x0D, 0x0D, 0x14,
+ 0x0A, 0x0A, 0x0F, 0x06, 0x06, 0x0B
+};
+
+static const ByteProvider k1SpecialPalette7DOSProvider = { ARRAYSIZE(k1SpecialPalette7DOS), k1SpecialPalette7DOS };
+
+static const byte k1SpecialPalette8DOS[54] = {
+ 0x12, 0x37, 0x3F, 0x14, 0x31, 0x3F, 0x14, 0x29,
+ 0x3F, 0x14, 0x22, 0x3F, 0x14, 0x1B, 0x3F, 0x14,
+ 0x14, 0x3F, 0x0E, 0x0F, 0x37, 0x14, 0x29, 0x3F,
+ 0x2F, 0x3F, 0x3D, 0x26, 0x3F, 0x3F, 0x15, 0x3F,
+ 0x3F, 0x14, 0x3B, 0x3F, 0x12, 0x37, 0x3F, 0x14,
+ 0x31, 0x3F, 0x14, 0x29, 0x3F, 0x14, 0x22, 0x3F,
+ 0x14, 0x1B, 0x3F, 0x14, 0x14, 0x3F
+};
+
+static const ByteProvider k1SpecialPalette8DOSProvider = { ARRAYSIZE(k1SpecialPalette8DOS), k1SpecialPalette8DOS };
+
+static const byte k1SpecialPalette9DOS[45] = {
+ 0x36, 0x00, 0x00, 0x32, 0x00, 0x00, 0x2F, 0x00,
+ 0x00, 0x2C, 0x00, 0x00, 0x29, 0x00, 0x00, 0x26,
+ 0x00, 0x00, 0x23, 0x00, 0x00, 0x20, 0x00, 0x00,
+ 0x1C, 0x00, 0x00, 0x19, 0x00, 0x00, 0x16, 0x00,
+ 0x00, 0x13, 0x00, 0x00, 0x11, 0x00, 0x00, 0x0D,
+ 0x00, 0x00, 0x0A, 0x00, 0x00
+};
+
+static const ByteProvider k1SpecialPalette9DOSProvider = { ARRAYSIZE(k1SpecialPalette9DOS), k1SpecialPalette9DOS };
+
+static const byte k1SpecialPalette10DOS[45] = {
+ 0x29, 0x00, 0x00, 0x26, 0x00, 0x00, 0x24, 0x00,
+ 0x00, 0x22, 0x00, 0x00, 0x20, 0x00, 0x00, 0x1E,
+ 0x00, 0x00, 0x1B, 0x00, 0x00, 0x19, 0x00, 0x00,
+ 0x17, 0x00, 0x00, 0x15, 0x00, 0x00, 0x12, 0x00,
+ 0x00, 0x11, 0x00, 0x00, 0x0E, 0x00, 0x00, 0x0C,
+ 0x00, 0x00, 0x0A, 0x00, 0x00
+};
+
+static const ByteProvider k1SpecialPalette10DOSProvider = { ARRAYSIZE(k1SpecialPalette10DOS), k1SpecialPalette10DOS };
+
+static const byte k1SpecialPalette11DOS[45] = {
+ 0x20, 0x00, 0x00, 0x1E, 0x00, 0x00, 0x1C, 0x00,
+ 0x00, 0x1B, 0x00, 0x00, 0x19, 0x00, 0x00, 0x18,
+ 0x00, 0x00, 0x16, 0x00, 0x00, 0x15, 0x00, 0x00,
+ 0x13, 0x00, 0x00, 0x11, 0x00, 0x00, 0x11, 0x00,
+ 0x00, 0x0E, 0x00, 0x00, 0x0D, 0x00, 0x00, 0x0B,
+ 0x00, 0x00, 0x0A, 0x00, 0x00
+};
+
+static const ByteProvider k1SpecialPalette11DOSProvider = { ARRAYSIZE(k1SpecialPalette11DOS), k1SpecialPalette11DOS };
+
+static const byte k1SpecialPalette12DOS[45] = {
+ 0x19, 0x00, 0x00, 0x18, 0x00, 0x00, 0x16, 0x00,
+ 0x00, 0x15, 0x00, 0x00, 0x14, 0x00, 0x00, 0x13,
+ 0x00, 0x00, 0x12, 0x00, 0x00, 0x11, 0x00, 0x00,
+ 0x11, 0x00, 0x00, 0x0F, 0x00, 0x00, 0x0E, 0x00,
+ 0x00, 0x0D, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x0B,
+ 0x00, 0x00, 0x0A, 0x00, 0x00
+};
+
+static const ByteProvider k1SpecialPalette12DOSProvider = { ARRAYSIZE(k1SpecialPalette12DOS), k1SpecialPalette12DOS };
+
+static const byte k1SpecialPalette13DOS[45] = {
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00
+};
+
+static const ByteProvider k1SpecialPalette13DOSProvider = { ARRAYSIZE(k1SpecialPalette13DOS), k1SpecialPalette13DOS };
+
+static const byte k1SpecialPalette14DOS[60] = {
+ 0x0E, 0x28, 0x3F, 0x0C, 0x24, 0x3B, 0x0A, 0x20,
+ 0x38, 0x0A, 0x1C, 0x34, 0x08, 0x19, 0x31, 0x08,
+ 0x15, 0x2D, 0x05, 0x13, 0x2A, 0x05, 0x11, 0x27,
+ 0x03, 0x0D, 0x24, 0x03, 0x0A, 0x20, 0x03, 0x08,
+ 0x1D, 0x01, 0x06, 0x19, 0x01, 0x05, 0x16, 0x00,
+ 0x03, 0x13, 0x00, 0x01, 0x0F, 0x00, 0x01, 0x0C,
+ 0x00, 0x00, 0x08, 0x00, 0x00, 0x05, 0x00, 0x00,
+ 0x03, 0x00, 0x00, 0x00
+};
+
+static const ByteProvider k1SpecialPalette14DOSProvider = { ARRAYSIZE(k1SpecialPalette14DOS), k1SpecialPalette14DOS };
+
+static const byte k1SpecialPalette15DOS[45] = {
+ 0x24, 0x00, 0x39, 0x21, 0x00, 0x36, 0x1F, 0x00,
+ 0x32, 0x1C, 0x00, 0x2D, 0x1A, 0x00, 0x2A, 0x17,
+ 0x00, 0x26, 0x15, 0x00, 0x22, 0x12, 0x00, 0x1E,
+ 0x11, 0x00, 0x1A, 0x0E, 0x00, 0x16, 0x0B, 0x00,
+ 0x12, 0x0A, 0x00, 0x0F, 0x06, 0x00, 0x0B, 0x05,
+ 0x00, 0x08, 0x01, 0x00, 0x03
+};
+
+static const ByteProvider k1SpecialPalette15DOSProvider = { ARRAYSIZE(k1SpecialPalette15DOS), k1SpecialPalette15DOS };
+
+static const byte k1SpecialPalette16DOS[33] = {
+ 0x00, 0x3F, 0x3F, 0x00, 0x38, 0x38, 0x00, 0x34,
+ 0x34, 0x00, 0x30, 0x30, 0x00, 0x2D, 0x2D, 0x00,
+ 0x29, 0x29, 0x00, 0x25, 0x25, 0x00, 0x1F, 0x1F,
+ 0x00, 0x1B, 0x1B, 0x00, 0x16, 0x16, 0x00, 0x11,
+ 0x11
+};
+
+static const ByteProvider k1SpecialPalette16DOSProvider = { ARRAYSIZE(k1SpecialPalette16DOS), k1SpecialPalette16DOS };
+
+static const byte k1SpecialPalette17DOS[33] = {
+ 0x3B, 0x3B, 0x3B, 0x36, 0x36, 0x36, 0x32, 0x32,
+ 0x32, 0x2D, 0x2D, 0x2D, 0x2A, 0x2A, 0x2A, 0x26,
+ 0x26, 0x26, 0x21, 0x21, 0x21, 0x1D, 0x1D, 0x1D,
+ 0x19, 0x19, 0x19, 0x15, 0x15, 0x15, 0x11, 0x11,
+ 0x11
+};
+
+static const ByteProvider k1SpecialPalette17DOSProvider = { ARRAYSIZE(k1SpecialPalette17DOS), k1SpecialPalette17DOS };
+
+static const byte k1SpecialPalette18DOS[21] = {
+ 0x0F, 0x23, 0x1C, 0x2A, 0x36, 0x3F, 0x24, 0x2F,
+ 0x38, 0x1F, 0x2A, 0x32, 0x1A, 0x24, 0x2B, 0x15,
+ 0x1E, 0x25, 0x11, 0x19, 0x1F
+};
+
+static const ByteProvider k1SpecialPalette18DOSProvider = { ARRAYSIZE(k1SpecialPalette18DOS), k1SpecialPalette18DOS };
+
+static const byte k1SpecialPalette19DOS[21] = {
+ 0x00, 0x00, 0x1C, 0x00, 0x00, 0x3F, 0x00, 0x00,
+ 0x38, 0x00, 0x00, 0x32, 0x00, 0x00, 0x2B, 0x00,
+ 0x00, 0x25, 0x00, 0x00, 0x1F
+};
+
+static const ByteProvider k1SpecialPalette19DOSProvider = { ARRAYSIZE(k1SpecialPalette19DOS), k1SpecialPalette19DOS };
+
+static const byte k1SpecialPalette20DOS[21] = {
+ 0x26, 0x1B, 0x1B, 0x3F, 0x34, 0x34, 0x3B, 0x2F,
+ 0x2F, 0x39, 0x2B, 0x2B, 0x36, 0x26, 0x27, 0x33,
+ 0x22, 0x23, 0x31, 0x1F, 0x20
+};
+
+static const ByteProvider k1SpecialPalette20DOSProvider = { ARRAYSIZE(k1SpecialPalette20DOS), k1SpecialPalette20DOS };
+
+static const byte k1SpecialPalette21DOS[21] = {
+ 0x1C, 0x00, 0x00, 0x3F, 0x00, 0x00, 0x38, 0x00,
+ 0x00, 0x32, 0x00, 0x00, 0x2B, 0x00, 0x00, 0x25,
+ 0x00, 0x00, 0x1F, 0x00, 0x00
+};
+
+static const ByteProvider k1SpecialPalette21DOSProvider = { ARRAYSIZE(k1SpecialPalette21DOS), k1SpecialPalette21DOS };
+
+static const byte k1SpecialPalette22DOS[21] = {
+ 0x1F, 0x1F, 0x0C, 0x3F, 0x3F, 0x21, 0x3B, 0x3B,
+ 0x1F, 0x37, 0x37, 0x1D, 0x34, 0x34, 0x1B, 0x30,
+ 0x30, 0x19, 0x2D, 0x2D, 0x17
+};
+
+static const ByteProvider k1SpecialPalette22DOSProvider = { ARRAYSIZE(k1SpecialPalette22DOS), k1SpecialPalette22DOS };
+
+static const byte k1SpecialPalette23DOS[21] = {
+ 0x1F, 0x1F, 0x00, 0x3F, 0x3F, 0x00, 0x3B, 0x3B,
+ 0x00, 0x37, 0x37, 0x00, 0x34, 0x34, 0x00, 0x30,
+ 0x30, 0x00, 0x2D, 0x2D, 0x00
+};
+
+static const ByteProvider k1SpecialPalette23DOSProvider = { ARRAYSIZE(k1SpecialPalette23DOS), k1SpecialPalette23DOS };
+
+static const byte k1SpecialPalette24DOS[48] = {
+ 0x36, 0x38, 0x2C, 0x31, 0x38, 0x23, 0x2A, 0x33,
+ 0x1E, 0x24, 0x2F, 0x1A, 0x1E, 0x2A, 0x16, 0x18,
+ 0x26, 0x13, 0x13, 0x21, 0x0F, 0x0E, 0x1D, 0x0D,
+ 0x0D, 0x1B, 0x0C, 0x0A, 0x19, 0x0A, 0x0A, 0x18,
+ 0x0A, 0x08, 0x17, 0x08, 0x08, 0x16, 0x08, 0x08,
+ 0x15, 0x06, 0x06, 0x14, 0x06, 0x06, 0x11, 0x06
+};
+
+static const ByteProvider k1SpecialPalette24DOSProvider = { ARRAYSIZE(k1SpecialPalette24DOS), k1SpecialPalette24DOS };
+
+static const byte k1SpecialPalette25DOS[48] = {
+ 0x36, 0x38, 0x2C, 0x31, 0x36, 0x23, 0x2A, 0x33,
+ 0x1E, 0x24, 0x2F, 0x1A, 0x1E, 0x2A, 0x16, 0x1E,
+ 0x2A, 0x16, 0x18, 0x26, 0x13, 0x13, 0x21, 0x0F,
+ 0x0E, 0x1D, 0x0D, 0x0D, 0x1B, 0x0C, 0x0D, 0x1B,
+ 0x0C, 0x0A, 0x19, 0x0A, 0x0A, 0x18, 0x0A, 0x0A,
+ 0x18, 0x0A, 0x0A, 0x18, 0x0A, 0x06, 0x14, 0x06
+};
+
+static const ByteProvider k1SpecialPalette25DOSProvider = { ARRAYSIZE(k1SpecialPalette25DOS), k1SpecialPalette25DOS };
+
+static const byte k1SpecialPalette26DOS[48] = {
+ 0x31, 0x38, 0x23, 0x31, 0x38, 0x23, 0x2A, 0x33,
+ 0x1E, 0x24, 0x2F, 0x1A, 0x19, 0x2A, 0x16, 0x18,
+ 0x26, 0x13, 0x13, 0x21, 0x0F, 0x13, 0x21, 0x11,
+ 0x13, 0x21, 0x0F, 0x0E, 0x1D, 0x0D, 0x0E, 0x1D,
+ 0x0D, 0x0E, 0x1D, 0x0D, 0x0D, 0x1B, 0x0C, 0x0A,
+ 0x19, 0x0A, 0x0A, 0x19, 0x0A, 0x06, 0x13, 0x06
+};
+
+static const ByteProvider k1SpecialPalette26DOSProvider = { ARRAYSIZE(k1SpecialPalette26DOS), k1SpecialPalette26DOS };
+
+static const byte k1SpecialPalette27DOS[48] = {
+ 0x31, 0x38, 0x23, 0x31, 0x38, 0x23, 0x2A, 0x33,
+ 0x1E, 0x24, 0x2F, 0x1A, 0x19, 0x2A, 0x16, 0x18,
+ 0x26, 0x13, 0x13, 0x21, 0x0F, 0x13, 0x21, 0x0F,
+ 0x13, 0x21, 0x0F, 0x0E, 0x1D, 0x0D, 0x0E, 0x1D,
+ 0x0D, 0x0E, 0x1D, 0x0D, 0x0D, 0x1B, 0x0C, 0x0D,
+ 0x19, 0x0C, 0x0D, 0x19, 0x0C, 0x08, 0x16, 0x08
+};
+
+static const ByteProvider k1SpecialPalette27DOSProvider = { ARRAYSIZE(k1SpecialPalette27DOS), k1SpecialPalette27DOS };
+
+static const byte k1SpecialPalette28DOS[48] = {
+ 0x36, 0x38, 0x2C, 0x31, 0x38, 0x23, 0x2A, 0x33,
+ 0x1E, 0x24, 0x2F, 0x1A, 0x19, 0x2A, 0x16, 0x1E,
+ 0x2A, 0x16, 0x18, 0x26, 0x13, 0x13, 0x21, 0x0F,
+ 0x13, 0x21, 0x0F, 0x13, 0x21, 0x0F, 0x13, 0x21,
+ 0x0F, 0x0E, 0x1D, 0x0D, 0x0D, 0x1B, 0x0C, 0x0D,
+ 0x1B, 0x0C, 0x0D, 0x1B, 0x0C, 0x08, 0x17, 0x08
+};
+
+static const ByteProvider k1SpecialPalette28DOSProvider = { ARRAYSIZE(k1SpecialPalette28DOS), k1SpecialPalette28DOS };
+
+static const byte k1SpecialPalette29DOS[48] = {
+ 0x36, 0x38, 0x2C, 0x31, 0x38, 0x23, 0x2A, 0x33,
+ 0x1E, 0x24, 0x2F, 0x1A, 0x19, 0x2A, 0x16, 0x1E,
+ 0x2A, 0x16, 0x18, 0x26, 0x13, 0x13, 0x21, 0x0F,
+ 0x13, 0x21, 0x0F, 0x13, 0x21, 0x0F, 0x13, 0x21,
+ 0x0F, 0x13, 0x21, 0x0F, 0x0E, 0x1D, 0x0D, 0x0E,
+ 0x1D, 0x0D, 0x0E, 0x1D, 0x0D, 0x08, 0x17, 0x08
+};
+
+static const ByteProvider k1SpecialPalette29DOSProvider = { ARRAYSIZE(k1SpecialPalette29DOS), k1SpecialPalette29DOS };
+
+static const byte k1SpecialPalette30DOS[60] = {
+ 0x1E, 0x1D, 0x3F, 0x1A, 0x19, 0x3F, 0x14, 0x12,
+ 0x3B, 0x12, 0x11, 0x37, 0x11, 0x11, 0x33, 0x0F,
+ 0x0E, 0x2F, 0x0E, 0x0D, 0x2C, 0x0D, 0x0C, 0x28,
+ 0x0B, 0x0B, 0x24, 0x0A, 0x0A, 0x20, 0x0A, 0x0A,
+ 0x1D, 0x05, 0x05, 0x18, 0x03, 0x03, 0x13, 0x01,
+ 0x01, 0x11, 0x00, 0x00, 0x0A, 0x00, 0x00, 0x05,
+ 0x00, 0x0A, 0x1A, 0x00, 0x0F, 0x13, 0x00, 0x14,
+ 0x11, 0x0F, 0x0D, 0x00
+};
+
+static const ByteProvider k1SpecialPalette30DOSProvider = { ARRAYSIZE(k1SpecialPalette30DOS), k1SpecialPalette30DOS };
+
+static const byte k1SpecialPalette31DOS[39] = {
+ 0x2B, 0x19, 0x34, 0x27, 0x17, 0x30, 0x23, 0x14,
+ 0x2C, 0x20, 0x12, 0x27, 0x1C, 0x11, 0x23, 0x18,
+ 0x0E, 0x1E, 0x15, 0x0C, 0x1A, 0x11, 0x0A, 0x15,
+ 0x0E, 0x08, 0x11, 0x0A, 0x05, 0x0C, 0x06, 0x03,
+ 0x08, 0x03, 0x01, 0x03, 0x00, 0x00, 0x00
+};
+
+static const ByteProvider k1SpecialPalette31DOSProvider = { ARRAYSIZE(k1SpecialPalette31DOS), k1SpecialPalette31DOS };
+
+static const byte k1SpecialPalette32DOS[39] = {
+ 0x12, 0x12, 0x16, 0x11, 0x11, 0x14, 0x0F, 0x0F,
+ 0x12, 0x0D, 0x0D, 0x11, 0x0B, 0x0B, 0x0E, 0x0A,
+ 0x0A, 0x0C, 0x08, 0x08, 0x0A, 0x08, 0x08, 0x08,
+ 0x05, 0x05, 0x06, 0x05, 0x05, 0x05, 0x03, 0x03,
+ 0x03, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00
+};
+
+static const ByteProvider k1SpecialPalette32DOSProvider = { ARRAYSIZE(k1SpecialPalette32DOS), k1SpecialPalette32DOS };
+
+static const byte k1SpecialPalette33DOS[60] = {
+ 0x3F, 0x3D, 0x2F, 0x3F, 0x3D, 0x29, 0x3F, 0x3D,
+ 0x23, 0x3F, 0x3D, 0x1D, 0x3F, 0x3B, 0x17, 0x3F,
+ 0x3B, 0x11, 0x3F, 0x3B, 0x0B, 0x3F, 0x3B, 0x05,
+ 0x3F, 0x3B, 0x00, 0x3D, 0x38, 0x00, 0x3B, 0x34,
+ 0x00, 0x39, 0x33, 0x00, 0x39, 0x30, 0x00, 0x37,
+ 0x2D, 0x00, 0x36, 0x2B, 0x00, 0x34, 0x28, 0x00,
+ 0x33, 0x26, 0x00, 0x32, 0x24, 0x00, 0x30, 0x22,
+ 0x00, 0x2F, 0x20, 0x00
+};
+
+static const ByteProvider k1SpecialPalette33DOSProvider = { ARRAYSIZE(k1SpecialPalette33DOS), k1SpecialPalette33DOS };
+
+static const Shape k1Healing1ShapesDOS[22] = {
+ { 8, 0, 0, 3, 48, -12, -48 },
+ { 8, 3, 0, 3, 48, -12, -48 },
+ { 8, 6, 0, 3, 48, -12, -48 },
+ { 8, 9, 0, 3, 48, -12, -48 },
+ { 8, 12, 0, 3, 48, -12, -48 },
+ { 8, 15, 0, 3, 48, -12, -48 },
+ { 8, 18, 0, 3, 48, -12, -48 },
+ { 8, 21, 0, 3, 48, -12, -48 },
+ { 8, 24, 0, 3, 48, -12, -48 },
+ { 8, 27, 0, 3, 48, -12, -48 },
+ { 8, 30, 0, 3, 48, -12, -48 },
+ { 8, 33, 0, 3, 48, -12, -48 },
+ { 8, 0, 48, 3, 48, -12, -48 },
+ { 8, 3, 48, 3, 48, -12, -48 },
+ { 8, 6, 48, 3, 48, -12, -48 },
+ { 8, 9, 48, 3, 48, -12, -48 },
+ { 8, 12, 48, 3, 48, -12, -48 },
+ { 8, 15, 48, 3, 48, -12, -48 },
+ { 8, 18, 48, 3, 48, -12, -48 },
+ { 8, 21, 48, 3, 48, -12, -48 },
+ { 8, 24, 48, 3, 48, -12, -48 },
+ { 8, 27, 48, 3, 48, -12, -48 }
+};
+
+static const ShapeProvider k1Healing1ShapesDOSProvider = { ARRAYSIZE(k1Healing1ShapesDOS), k1Healing1ShapesDOS };
+
+static const Shape k1Healing2ShapesDOS[30] = {
+ { 9, 0, 0, 3, 48, -11, -48 },
+ { 9, 3, 0, 3, 48, -11, -48 },
+ { 9, 6, 0, 3, 48, -11, -48 },
+ { 9, 9, 0, 3, 48, -11, -48 },
+ { 9, 12, 0, 3, 48, -11, -48 },
+ { 9, 15, 0, 3, 48, -11, -48 },
+ { 9, 18, 0, 3, 48, -11, -48 },
+ { 9, 21, 0, 3, 48, -11, -48 },
+ { 9, 24, 0, 3, 48, -11, -48 },
+ { 9, 27, 0, 3, 48, -11, -48 },
+ { 9, 30, 0, 3, 48, -11, -48 },
+ { 9, 33, 0, 3, 48, -11, -48 },
+ { 9, 0, 48, 3, 48, -11, -48 },
+ { 9, 3, 48, 3, 48, -11, -48 },
+ { 9, 6, 48, 3, 48, -11, -48 },
+ { 9, 9, 48, 3, 48, -11, -48 },
+ { 9, 12, 48, 3, 48, -11, -48 },
+ { 9, 15, 48, 3, 48, -11, -48 },
+ { 9, 18, 48, 3, 48, -11, -48 },
+ { 9, 21, 48, 3, 48, -11, -48 },
+ { 9, 24, 48, 3, 48, -11, -48 },
+ { 9, 27, 48, 3, 48, -11, -48 },
+ { 9, 30, 48, 3, 48, -11, -48 },
+ { 9, 33, 48, 3, 48, -11, -48 },
+ { 9, 0, 96, 3, 48, -11, -48 },
+ { 9, 3, 96, 3, 48, -11, -48 },
+ { 9, 6, 96, 3, 48, -11, -48 },
+ { 9, 9, 96, 3, 48, -11, -48 },
+ { 9, 12, 96, 3, 48, -11, -48 },
+ { 9, 15, 96, 3, 48, -11, -48 }
+};
+
+static const ShapeProvider k1Healing2ShapesDOSProvider = { ARRAYSIZE(k1Healing2ShapesDOS), k1Healing2ShapesDOS };
+
+static const Shape k1PoisonDeathShapesDOS[20] = {
+ { 19, 0, 0, 8, 48, -31, -48 },
+ { 19, 8, 0, 8, 48, -31, -48 },
+ { 19, 16, 0, 8, 48, -31, -48 },
+ { 19, 24, 0, 8, 48, -31, -48 },
+ { 19, 32, 0, 8, 48, -31, -48 },
+ { 19, 0, 48, 8, 48, -31, -48 },
+ { 19, 8, 48, 8, 48, -31, -48 },
+ { 19, 16, 48, 8, 48, -31, -48 },
+ { 19, 24, 48, 8, 48, -31, -48 },
+ { 19, 32, 48, 8, 48, -31, -48 },
+ { 19, 0, 96, 8, 48, -31, -48 },
+ { 19, 8, 96, 8, 48, -31, -48 },
+ { 19, 16, 96, 8, 48, -31, -48 },
+ { 19, 24, 96, 8, 48, -31, -48 },
+ { 19, 32, 96, 8, 48, -31, -48 },
+ { 19, 0, 144, 8, 48, -31, -48 },
+ { 19, 8, 144, 8, 48, -31, -48 },
+ { 19, 16, 144, 8, 48, -31, -48 },
+ { 19, 24, 144, 8, 48, -31, -48 },
+ { 19, 32, 144, 8, 48, -31, -48 }
+};
+
+static const ShapeProvider k1PoisonDeathShapesDOSProvider = { ARRAYSIZE(k1PoisonDeathShapesDOS), k1PoisonDeathShapesDOS };
+
+static const Shape k1FluteShapesDOS[36] = {
+ { 13, 0, 0, 3, 75, -12, -75 },
+ { 13, 3, 0, 3, 75, -12, -75 },
+ { 13, 6, 0, 3, 75, -12, -75 },
+ { 13, 9, 0, 3, 75, -12, -75 },
+ { 13, 12, 0, 3, 75, -12, -75 },
+ { 13, 15, 0, 3, 75, -12, -75 },
+ { 13, 18, 0, 3, 75, -12, -75 },
+ { 13, 21, 0, 3, 75, -12, -75 },
+ { 13, 24, 0, 3, 75, -12, -75 },
+ { 13, 27, 0, 3, 75, -12, -75 },
+ { 13, 30, 0, 3, 75, -12, -75 },
+ { 13, 33, 0, 3, 75, -12, -75 },
+ { 13, 36, 75, 3, 75, -12, -75 },
+ { 13, 0, 75, 3, 75, -12, -75 },
+ { 13, 3, 75, 3, 75, -12, -75 },
+ { 13, 6, 75, 3, 75, -12, -75 },
+ { 13, 9, 75, 3, 75, -12, -75 },
+ { 13, 12, 75, 3, 75, -12, -75 },
+ { 13, 15, 75, 3, 75, -12, -75 },
+ { 13, 18, 75, 3, 75, -12, -75 },
+ { 13, 21, 75, 3, 75, -12, -75 },
+ { 13, 24, 75, 3, 75, -12, -75 },
+ { 13, 27, 75, 3, 75, -12, -75 },
+ { 13, 30, 75, 3, 75, -12, -75 },
+ { 13, 33, 75, 3, 75, -12, -75 },
+ { 13, 36, 75, 3, 75, -12, -75 },
+ { 14, 0, 0, 3, 75, -12, -75 },
+ { 14, 3, 0, 3, 75, -12, -75 },
+ { 14, 6, 0, 3, 75, -12, -75 },
+ { 14, 9, 0, 3, 75, -12, -75 },
+ { 14, 12, 0, 3, 75, -12, -75 },
+ { 14, 15, 0, 3, 75, -12, -75 },
+ { 14, 18, 0, 3, 75, -12, -75 },
+ { 14, 21, 0, 3, 75, -12, -75 },
+ { 14, 24, 0, 3, 75, -12, -75 },
+ { 14, 27, 0, 3, 75, -12, -75 }
+};
+
+static const ShapeProvider k1FluteShapesDOSProvider = { ARRAYSIZE(k1FluteShapesDOS), k1FluteShapesDOS };
+
+static const Shape k1Winter1ShapesDOS[7] = {
+ { 10, 5, 0, 5, 66, -20, -65 },
+ { 10, 10, 0, 5, 66, -20, -65 },
+ { 10, 15, 0, 5, 66, -20, -65 },
+ { 10, 20, 0, 5, 66, -20, -65 },
+ { 10, 25, 0, 5, 66, -20, -65 },
+ { 10, 30, 0, 5, 66, -20, -65 },
+ { 10, 35, 0, 5, 66, -20, -65 }
+};
+
+static const ShapeProvider k1Winter1ShapesDOSProvider = { ARRAYSIZE(k1Winter1ShapesDOS), k1Winter1ShapesDOS };
+
+static const Shape k1Winter2ShapesDOS[35] = {
+ { 10, 0, 66, 5, 66, -20, -65 },
+ { 10, 5, 66, 5, 66, -20, -65 },
+ { 10, 10, 66, 5, 66, -20, -65 },
+ { 10, 15, 66, 5, 66, -20, -65 },
+ { 10, 20, 66, 5, 66, -20, -65 },
+ { 10, 25, 66, 5, 66, -20, -65 },
+ { 10, 30, 66, 5, 66, -20, -65 },
+ { 10, 35, 66, 5, 66, -20, -65 },
+ { 10, 0, 132, 5, 66, -20, -65 },
+ { 10, 5, 132, 5, 66, -20, -65 },
+ { 10, 10, 132, 5, 66, -20, -65 },
+ { 10, 15, 132, 5, 66, -20, -65 },
+ { 10, 20, 132, 5, 66, -20, -65 },
+ { 10, 25, 132, 5, 66, -20, -65 },
+ { 10, 30, 132, 5, 66, -20, -65 },
+ { 10, 35, 132, 5, 66, -20, -65 },
+ { 11, 0, 0, 5, 66, -20, -65 },
+ { 11, 5, 0, 5, 66, -20, -65 },
+ { 11, 10, 0, 5, 66, -20, -65 },
+ { 11, 15, 0, 5, 66, -20, -65 },
+ { 11, 20, 0, 5, 66, -20, -65 },
+ { 11, 25, 0, 5, 66, -20, -65 },
+ { 11, 30, 0, 5, 66, -20, -65 },
+ { 11, 35, 0, 5, 66, -20, -65 },
+ { 11, 0, 66, 5, 66, -20, -65 },
+ { 11, 5, 66, 5, 66, -20, -65 },
+ { 11, 10, 66, 5, 66, -20, -65 },
+ { 11, 15, 66, 5, 66, -20, -65 },
+ { 11, 20, 66, 5, 66, -20, -65 },
+ { 11, 25, 66, 5, 66, -20, -65 },
+ { 11, 30, 66, 5, 66, -20, -65 },
+ { 11, 35, 66, 5, 66, -20, -65 },
+ { 11, 0, 132, 5, 66, -20, -65 },
+ { 11, 5, 132, 5, 66, -20, -65 },
+ { 11, 10, 132, 5, 66, -20, -65 }
+};
+
+static const ShapeProvider k1Winter2ShapesDOSProvider = { ARRAYSIZE(k1Winter2ShapesDOS), k1Winter2ShapesDOS };
+
+static const Shape k1Winter3ShapesDOS[4] = {
+ { 11, 15, 132, 5, 66, -20, -65 },
+ { 11, 20, 132, 5, 66, -20, -65 },
+ { 11, 25, 132, 5, 66, -20, -65 },
+ { 11, 30, 132, 5, 66, -20, -65 }
+};
+
+static const ShapeProvider k1Winter3ShapesDOSProvider = { ARRAYSIZE(k1Winter3ShapesDOS), k1Winter3ShapesDOS };
+
+static const Shape k1DrinkShapesDOS[15] = {
+ { 6, 0, 0, 4, 48, -20, -48 },
+ { 6, 4, 0, 4, 48, -20, -48 },
+ { 6, 8, 0, 4, 48, -20, -48 },
+ { 6, 12, 0, 4, 48, -20, -48 },
+ { 6, 16, 0, 4, 48, -20, -48 },
+ { 6, 20, 0, 5, 48, -20, -48 },
+ { 6, 0, 48, 5, 54, -20, -54 },
+ { 6, 5, 48, 5, 54, -20, -54 },
+ { 6, 10, 48, 5, 54, -20, -54 },
+ { 7, 0, 0, 3, 43, -12, -43 },
+ { 7, 3, 3, 2, 40, -8, -40 },
+ { 7, 5, 7, 2, 36, -8, -36 },
+ { 7, 7, 10, 2, 33, -8, -33 },
+ { 7, 9, 12, 2, 31, -8, -31 },
+ { 7, 11, 15, 2, 28, -8, -28 }
+};
+
+static const ShapeProvider k1DrinkShapesDOSProvider = { ARRAYSIZE(k1DrinkShapesDOS), k1DrinkShapesDOS };
+
+static const Shape k1WispShapesDOS[26] = {
+ { 12, 0, 0, 5, 48, -20, -48 },
+ { 12, 5, 0, 5, 48, -20, -48 },
+ { 12, 10, 0, 5, 48, -20, -48 },
+ { 12, 15, 0, 5, 48, -20, -48 },
+ { 12, 20, 0, 5, 48, -20, -48 },
+ { 12, 25, 0, 5, 48, -20, -48 },
+ { 12, 30, 0, 5, 48, -20, -48 },
+ { 12, 35, 0, 5, 48, -20, -48 },
+ { 12, 0, 48, 5, 48, -20, -48 },
+ { 12, 5, 48, 5, 48, -20, -48 },
+ { 12, 10, 48, 5, 48, -20, -48 },
+ { 12, 15, 48, 5, 48, -20, -48 },
+ { 12, 20, 48, 5, 48, -20, -48 },
+ { 12, 25, 48, 5, 48, -20, -48 },
+ { 12, 30, 48, 5, 48, -20, -48 },
+ { 12, 35, 48, 5, 48, -20, -48 },
+ { 12, 0, 96, 5, 29, -20, -42 },
+ { 12, 5, 96, 5, 29, -20, -42 },
+ { 12, 10, 96, 5, 29, -20, -42 },
+ { 12, 15, 96, 5, 29, -20, -42 },
+ { 12, 20, 96, 5, 29, -20, -42 },
+ { 12, 25, 96, 5, 29, -20, -42 },
+ { 12, 30, 96, 5, 29, -20, -42 },
+ { 12, 35, 96, 5, 29, -20, -42 },
+ { 12, 0, 125, 5, 29, -20, -42 },
+ { 12, 5, 125, 5, 29, -20, -42 }
+};
+
+static const ShapeProvider k1WispShapesDOSProvider = { ARRAYSIZE(k1WispShapesDOS), k1WispShapesDOS };
+
+static const Shape k1MagicAnimShapesDOS[5] = {
+ { 17, 0, 0, 8, 49, -32, -49 },
+ { 17, 8, 0, 8, 49, -32, -49 },
+ { 17, 16, 0, 8, 49, -32, -49 },
+ { 17, 24, 0, 8, 49, -32, -49 },
+ { 17, 32, 0, 8, 49, -32, -49 }
+};
+
+static const ShapeProvider k1MagicAnimShapesDOSProvider = { ARRAYSIZE(k1MagicAnimShapesDOS), k1MagicAnimShapesDOS };
+
+static const Shape k1BranStoneShapesDOS[15] = {
+ { 18, 0, 0, 5, 51, -20, -50 },
+ { 18, 5, 0, 5, 51, -20, -50 },
+ { 18, 10, 0, 5, 51, -20, -50 },
+ { 18, 15, 0, 5, 51, -20, -50 },
+ { 18, 20, 0, 5, 51, -20, -50 },
+ { 18, 25, 0, 5, 51, -20, -50 },
+ { 18, 30, 0, 5, 51, -20, -50 },
+ { 18, 35, 0, 5, 51, -20, -50 },
+ { 18, 0, 51, 5, 51, -20, -50 },
+ { 18, 5, 51, 5, 51, -20, -50 },
+ { 18, 10, 51, 5, 51, -20, -50 },
+ { 18, 15, 51, 5, 51, -20, -50 },
+ { 18, 20, 51, 5, 51, -20, -50 },
+ { 18, 25, 51, 5, 51, -20, -50 },
+ { 0, 0, 0, 0, 0, 0, 0 }
+};
+
+static const ShapeProvider k1BranStoneShapesDOSProvider = { ARRAYSIZE(k1BranStoneShapesDOS), k1BranStoneShapesDOS };
+
+static const byte k1OutroReunionSeqDOS[1351] = {
+ 0x1A, 0x00, 0x08, 0x01, 0x06, 0x01, 0x00, 0x02,
+ 0x08, 0x00, 0x50, 0x00, 0x22, 0x07, 0x08, 0x00,
+ 0x14, 0x0A, 0x00, 0x03, 0x08, 0x07, 0x08, 0x00,
+ 0x0B, 0x00, 0x09, 0x00, 0x10, 0x20, 0x5A, 0x00,
+ 0x3A, 0x02, 0x02, 0x08, 0x0D, 0x50, 0x00, 0x22,
+ 0x07, 0x10, 0x00, 0x02, 0x08, 0x0E, 0x50, 0x00,
+ 0x22, 0x07, 0x10, 0x00, 0x02, 0x08, 0x0C, 0x50,
+ 0x00, 0x22, 0x07, 0x10, 0x00, 0x02, 0x08, 0x0B,
+ 0x50, 0x00, 0x22, 0x07, 0x10, 0x00, 0x02, 0x08,
+ 0x0C, 0x50, 0x00, 0x22, 0x07, 0x10, 0x00, 0x02,
+ 0x08, 0x0D, 0x50, 0x00, 0x22, 0x07, 0x10, 0x00,
+ 0x02, 0x08, 0x0E, 0x50, 0x00, 0x22, 0x07, 0x10,
+ 0x00, 0x0A, 0x01, 0x03, 0x08, 0x07, 0x08, 0x00,
+ 0x0B, 0x01, 0x04, 0x00, 0x10, 0x21, 0x5A, 0x00,
+ 0x3A, 0x02, 0x0A, 0x02, 0x02, 0x08, 0x14, 0x50,
+ 0x00, 0x22, 0x07, 0x08, 0x00, 0x03, 0x08, 0x07,
+ 0x08, 0x00, 0x03, 0x08, 0x07, 0x08, 0x00, 0x03,
+ 0x08, 0x07, 0x08, 0x00, 0x03, 0x08, 0x07, 0x08,
+ 0x00, 0x0B, 0x02, 0x01, 0x00, 0x03, 0x08, 0x07,
+ 0x08, 0x00, 0x03, 0x08, 0x07, 0x08, 0x00, 0x03,
+ 0x08, 0x07, 0x08, 0x00, 0x10, 0x22, 0x5A, 0x00,
+ 0x3A, 0x02, 0x0A, 0x03, 0x03, 0x08, 0x07, 0x08,
+ 0x00, 0x0B, 0x03, 0x0B, 0x00, 0x10, 0x23, 0x78,
+ 0x00, 0x3A, 0x0F, 0x0A, 0x03, 0x03, 0x08, 0x07,
+ 0x08, 0x00, 0x0B, 0x03, 0x05, 0x00, 0x06, 0x28,
+ 0x00, 0x02, 0x08, 0x2E, 0x50, 0x00, 0x22, 0x07,
+ 0x10, 0x00, 0x02, 0x08, 0x2D, 0x50, 0x00, 0x22,
+ 0x07, 0x10, 0x00, 0x02, 0x08, 0x2E, 0x50, 0x00,
+ 0x22, 0x07, 0x10, 0x00, 0x02, 0x08, 0x2D, 0x50,
+ 0x00, 0x22, 0x07, 0x10, 0x00, 0x02, 0x08, 0x2E,
+ 0x50, 0x00, 0x22, 0x07, 0x10, 0x00, 0x02, 0x08,
+ 0x2D, 0x50, 0x00, 0x22, 0x07, 0x10, 0x00, 0x02,
+ 0x08, 0x2F, 0x50, 0x00, 0x22, 0x07, 0x08, 0x00,
+ 0x02, 0x08, 0x30, 0x50, 0x00, 0x22, 0x07, 0x08,
+ 0x00, 0x02, 0x08, 0x31, 0x50, 0x00, 0x22, 0x07,
+ 0x08, 0x00, 0x02, 0x08, 0x32, 0x50, 0x00, 0x22,
+ 0x07, 0x08, 0x00, 0x06, 0x0A, 0x00, 0x10, 0x24,
+ 0x5A, 0x00, 0x3A, 0x02, 0x02, 0x08, 0x33, 0x50,
+ 0x00, 0x22, 0x07, 0x08, 0x00, 0x02, 0x08, 0x34,
+ 0x50, 0x00, 0x22, 0x07, 0x08, 0x00, 0x02, 0x08,
+ 0x35, 0x50, 0x00, 0x22, 0x07, 0x08, 0x00, 0x02,
+ 0x08, 0x36, 0x50, 0x00, 0x22, 0x07, 0x08, 0x00,
+ 0x02, 0x08, 0x37, 0x50, 0x00, 0x22, 0x07, 0x08,
+ 0x00, 0x02, 0x08, 0x35, 0x50, 0x00, 0x22, 0x07,
+ 0x08, 0x00, 0x02, 0x08, 0x34, 0x50, 0x00, 0x22,
+ 0x07, 0x08, 0x00, 0x02, 0x08, 0x33, 0x50, 0x00,
+ 0x22, 0x07, 0x08, 0x00, 0x02, 0x08, 0x35, 0x50,
+ 0x00, 0x22, 0x07, 0x08, 0x00, 0x02, 0x08, 0x36,
+ 0x50, 0x00, 0x22, 0x07, 0x08, 0x00, 0x02, 0x08,
+ 0x37, 0x50, 0x00, 0x22, 0x07, 0x08, 0x00, 0x06,
+ 0x0A, 0x00, 0x10, 0x25, 0x5A, 0x00, 0x3A, 0x02,
+ 0x02, 0x08, 0x33, 0x50, 0x00, 0x22, 0x07, 0x08,
+ 0x00, 0x02, 0x08, 0x34, 0x50, 0x00, 0x22, 0x07,
+ 0x08, 0x00, 0x02, 0x08, 0x35, 0x50, 0x00, 0x22,
+ 0x07, 0x08, 0x00, 0x02, 0x08, 0x36, 0x50, 0x00,
+ 0x22, 0x07, 0x08, 0x00, 0x02, 0x08, 0x37, 0x50,
+ 0x00, 0x22, 0x07, 0x08, 0x00, 0x02, 0x08, 0x35,
+ 0x50, 0x00, 0x22, 0x07, 0x08, 0x00, 0x02, 0x08,
+ 0x34, 0x50, 0x00, 0x22, 0x07, 0x08, 0x00, 0x02,
+ 0x08, 0x33, 0x50, 0x00, 0x22, 0x07, 0x08, 0x00,
+ 0x02, 0x08, 0x35, 0x50, 0x00, 0x22, 0x07, 0x08,
+ 0x00, 0x02, 0x08, 0x36, 0x50, 0x00, 0x22, 0x07,
+ 0x08, 0x00, 0x02, 0x08, 0x37, 0x50, 0x00, 0x22,
+ 0x07, 0x08, 0x00, 0x06, 0x1E, 0x00, 0x10, 0x26,
+ 0x78, 0x00, 0x3A, 0x0F, 0x02, 0x08, 0x38, 0x50,
+ 0x00, 0x22, 0x07, 0x08, 0x00, 0x02, 0x08, 0x39,
+ 0x50, 0x00, 0x22, 0x07, 0x08, 0x00, 0x02, 0x08,
+ 0x3A, 0x50, 0x00, 0x22, 0x07, 0x08, 0x00, 0x02,
+ 0x08, 0x38, 0x50, 0x00, 0x22, 0x07, 0x08, 0x00,
+ 0x02, 0x08, 0x3B, 0x50, 0x00, 0x22, 0x07, 0x08,
+ 0x00, 0x06, 0x0A, 0x00, 0x02, 0x08, 0x39, 0x50,
+ 0x00, 0x22, 0x07, 0x08, 0x00, 0x02, 0x08, 0x38,
+ 0x50, 0x00, 0x22, 0x07, 0x08, 0x00, 0x02, 0x08,
+ 0x39, 0x50, 0x00, 0x22, 0x07, 0x08, 0x00, 0x02,
+ 0x08, 0x3A, 0x50, 0x00, 0x22, 0x07, 0x08, 0x00,
+ 0x06, 0x3C, 0x00, 0x11, 0x02, 0x08, 0x33, 0x50,
+ 0x00, 0x22, 0x07, 0x08, 0x00, 0x02, 0x08, 0x32,
+ 0x50, 0x00, 0x22, 0x07, 0x08, 0x00, 0x02, 0x08,
+ 0x31, 0x50, 0x00, 0x22, 0x07, 0x08, 0x00, 0x02,
+ 0x08, 0x30, 0x50, 0x00, 0x22, 0x07, 0x08, 0x00,
+ 0x02, 0x08, 0x2F, 0x50, 0x00, 0x22, 0x07, 0x08,
+ 0x00, 0x02, 0x08, 0x2E, 0x50, 0x00, 0x22, 0x07,
+ 0x08, 0x00, 0x02, 0x08, 0x2D, 0x50, 0x00, 0x22,
+ 0x07, 0x08, 0x00, 0x06, 0x1E, 0x00, 0x02, 0x08,
+ 0x2E, 0x50, 0x00, 0x22, 0x07, 0x08, 0x00, 0x02,
+ 0x08, 0x2F, 0x50, 0x00, 0x22, 0x07, 0x08, 0x00,
+ 0x02, 0x08, 0x30, 0x50, 0x00, 0x22, 0x07, 0x08,
+ 0x00, 0x02, 0x08, 0x31, 0x50, 0x00, 0x22, 0x07,
+ 0x08, 0x00, 0x02, 0x08, 0x32, 0x50, 0x00, 0x22,
+ 0x07, 0x08, 0x00, 0x02, 0x08, 0x33, 0x50, 0x00,
+ 0x22, 0x07, 0x08, 0x00, 0x02, 0x08, 0x41, 0x50,
+ 0x00, 0x22, 0x07, 0x08, 0x00, 0x02, 0x08, 0x42,
+ 0x50, 0x00, 0x22, 0x07, 0x08, 0x00, 0x02, 0x08,
+ 0x43, 0x50, 0x00, 0x22, 0x07, 0x08, 0x00, 0x02,
+ 0x08, 0x44, 0x50, 0x00, 0x22, 0x07, 0x08, 0x00,
+ 0x02, 0x08, 0x45, 0x50, 0x00, 0x22, 0x07, 0x08,
+ 0x00, 0x02, 0x08, 0x46, 0x50, 0x00, 0x22, 0x07,
+ 0x08, 0x00, 0x06, 0x0A, 0x00, 0x10, 0x27, 0x5A,
+ 0x00, 0x3A, 0x02, 0x02, 0x08, 0x4E, 0x50, 0x00,
+ 0x22, 0x07, 0x08, 0x00, 0x02, 0x08, 0x4F, 0x50,
+ 0x00, 0x22, 0x07, 0x08, 0x00, 0x02, 0x08, 0x50,
+ 0x50, 0x00, 0x22, 0x07, 0x08, 0x00, 0x02, 0x08,
+ 0x51, 0x50, 0x00, 0x22, 0x07, 0x08, 0x00, 0x02,
+ 0x08, 0x52, 0x50, 0x00, 0x22, 0x07, 0x08, 0x00,
+ 0x02, 0x08, 0x53, 0x50, 0x00, 0x22, 0x07, 0x08,
+ 0x00, 0x02, 0x08, 0x54, 0x50, 0x00, 0x22, 0x07,
+ 0x08, 0x00, 0x02, 0x08, 0x55, 0x50, 0x00, 0x22,
+ 0x07, 0x08, 0x00, 0x06, 0x78, 0x00, 0x10, 0x28,
+ 0x78, 0x00, 0x3A, 0x0F, 0x0A, 0x05, 0x02, 0x08,
+ 0x59, 0x50, 0x00, 0x22, 0x07, 0x08, 0x00, 0x02,
+ 0x08, 0x5A, 0x50, 0x00, 0x22, 0x07, 0x08, 0x00,
+ 0x02, 0x08, 0x5B, 0x50, 0x00, 0x22, 0x07, 0x08,
+ 0x00, 0x02, 0x08, 0x5C, 0x50, 0x00, 0x22, 0x07,
+ 0x08, 0x00, 0x02, 0x08, 0x5D, 0x50, 0x00, 0x22,
+ 0x07, 0x08, 0x00, 0x0B, 0x05, 0x01, 0x00, 0x06,
+ 0x28, 0x00, 0x10, 0x29, 0x78, 0x00, 0x3A, 0x0F,
+ 0x0A, 0x06, 0x02, 0x08, 0x59, 0x50, 0x00, 0x22,
+ 0x07, 0x08, 0x00, 0x02, 0x08, 0x5A, 0x50, 0x00,
+ 0x22, 0x07, 0x08, 0x00, 0x02, 0x08, 0x5B, 0x50,
+ 0x00, 0x22, 0x07, 0x08, 0x00, 0x02, 0x08, 0x5C,
+ 0x50, 0x00, 0x22, 0x07, 0x08, 0x00, 0x02, 0x08,
+ 0x5D, 0x50, 0x00, 0x22, 0x07, 0x08, 0x00, 0x0B,
+ 0x06, 0x01, 0x00, 0x06, 0x28, 0x00, 0x10, 0x2A,
+ 0x78, 0x00, 0x3A, 0x0F, 0x02, 0x08, 0x5E, 0x50,
+ 0x00, 0x22, 0x07, 0x10, 0x00, 0x02, 0x08, 0x63,
+ 0x50, 0x00, 0x22, 0x07, 0x10, 0x00, 0x06, 0x5A,
+ 0x00, 0x11, 0x18, 0x69, 0x02, 0x08, 0x64, 0x50,
+ 0x00, 0x22, 0x07, 0x10, 0x00, 0x02, 0x08, 0x65,
+ 0x50, 0x00, 0x22, 0x07, 0x10, 0x00, 0x18, 0x74,
+ 0x02, 0x08, 0x66, 0x50, 0x00, 0x22, 0x07, 0x10,
+ 0x00, 0x02, 0x08, 0x67, 0x50, 0x00, 0x22, 0x07,
+ 0x10, 0x00, 0x18, 0x75, 0x02, 0x08, 0x68, 0x50,
+ 0x00, 0x22, 0x07, 0x10, 0x00, 0x02, 0x08, 0x69,
+ 0x50, 0x00, 0x22, 0x07, 0x10, 0x00, 0x10, 0x2B,
+ 0x96, 0x00, 0x1C, 0x22, 0x0A, 0x06, 0x02, 0x08,
+ 0x6B, 0x50, 0x00, 0x22, 0x07, 0x10, 0x00, 0x02,
+ 0x08, 0x6C, 0x50, 0x00, 0x22, 0x07, 0x10, 0x00,
+ 0x02, 0x08, 0x6D, 0x50, 0x00, 0x22, 0x07, 0x10,
+ 0x00, 0x02, 0x08, 0x6E, 0x50, 0x00, 0x22, 0x07,
+ 0x10, 0x00, 0x02, 0x08, 0x6F, 0x50, 0x00, 0x22,
+ 0x07, 0x10, 0x00, 0x02, 0x08, 0x70, 0x50, 0x00,
+ 0x22, 0x07, 0x10, 0x00, 0x02, 0x08, 0x71, 0x50,
+ 0x00, 0x22, 0x07, 0x10, 0x00, 0x0B, 0x06, 0x01,
+ 0x00, 0x06, 0x1E, 0x00, 0x10, 0x2C, 0x96, 0x00,
+ 0x1C, 0x22, 0x0A, 0x06, 0x02, 0x08, 0x6B, 0x50,
+ 0x00, 0x22, 0x07, 0x10, 0x00, 0x02, 0x08, 0x6C,
+ 0x50, 0x00, 0x22, 0x07, 0x10, 0x00, 0x02, 0x08,
+ 0x6D, 0x50, 0x00, 0x22, 0x07, 0x10, 0x00, 0x02,
+ 0x08, 0x6E, 0x50, 0x00, 0x22, 0x07, 0x10, 0x00,
+ 0x02, 0x08, 0x6F, 0x50, 0x00, 0x22, 0x07, 0x10,
+ 0x00, 0x02, 0x08, 0x70, 0x50, 0x00, 0x22, 0x07,
+ 0x10, 0x00, 0x02, 0x08, 0x71, 0x50, 0x00, 0x22,
+ 0x07, 0x10, 0x00, 0x0B, 0x06, 0x01, 0x00, 0x06,
+ 0x1E, 0x00, 0x10, 0x2D, 0x96, 0x00, 0x1C, 0x22,
+ 0x0A, 0x06, 0x02, 0x08, 0x6B, 0x50, 0x00, 0x22,
+ 0x07, 0x10, 0x00, 0x02, 0x08, 0x6C, 0x50, 0x00,
+ 0x22, 0x07, 0x10, 0x00, 0x02, 0x08, 0x6D, 0x50,
+ 0x00, 0x22, 0x07, 0x10, 0x00, 0x02, 0x08, 0x6E,
+ 0x50, 0x00, 0x22, 0x07, 0x10, 0x00, 0x02, 0x08,
+ 0x6F, 0x50, 0x00, 0x22, 0x07, 0x10, 0x00, 0x02,
+ 0x08, 0x70, 0x50, 0x00, 0x22, 0x07, 0x10, 0x00,
+ 0x02, 0x08, 0x71, 0x50, 0x00, 0x22, 0x07, 0x10,
+ 0x00, 0x0B, 0x06, 0x01, 0x00, 0x06, 0x1E, 0x00,
+ 0x02, 0x08, 0x72, 0x50, 0x00, 0x22, 0x07, 0x10,
+ 0x00, 0x02, 0x08, 0x73, 0x50, 0x00, 0x22, 0x07,
+ 0x10, 0x00, 0x06, 0x14, 0x00, 0x02, 0x08, 0x74,
+ 0x50, 0x00, 0x22, 0x07, 0x10, 0x00, 0x02, 0x08,
+ 0x75, 0x50, 0x00, 0x22, 0x07, 0x10, 0x00, 0x06,
+ 0x78, 0x00, 0x13, 0x0E, 0x01, 0x08, 0x1D
+};
+
+static const ByteProvider k1OutroReunionSeqDOSProvider = { ARRAYSIZE(k1OutroReunionSeqDOS), k1OutroReunionSeqDOS };
+
+static const char *const k1AudioTracksDOS[8] = {
+ "KYRA1A",
+ "KYRA1B",
+ "KYRA2A",
+ "KYRA3A",
+ "KYRA4A",
+ "KYRA4B",
+ "KYRA5A",
+ "KYRA5B"
+};
+
+static const StringListProvider k1AudioTracksDOSProvider = { ARRAYSIZE(k1AudioTracksDOS), k1AudioTracksDOS };
+
+static const char *const k1AudioTracks2DOS[1] = {
+ "kyramisc"
+};
+
+static const StringListProvider k1AudioTracks2DOSProvider = { ARRAYSIZE(k1AudioTracks2DOS), k1AudioTracks2DOS };
+
+static const char *const k1AudioTracksIntroDOS[1] = {
+ "intro"
+};
+
+static const StringListProvider k1AudioTracksIntroDOSProvider = { ARRAYSIZE(k1AudioTracksIntroDOS), k1AudioTracksIntroDOS };
+
diff --git a/devtools/create_kyradat/resources/lok_dos_cd.h b/devtools/create_kyradat/resources/lok_dos_cd.h
new file mode 100644
index 0000000000..9550d53d61
--- /dev/null
+++ b/devtools/create_kyradat/resources/lok_dos_cd.h
@@ -0,0 +1,1997 @@
+static const byte k1KallakWritingSeqDOSCD[2053] = {
+ 0x00, 0x00, 0x01, 0x11, 0x1D, 0x1A, 0x00, 0x00,
+ 0x00, 0x3F, 0x01, 0xC7, 0x0C, 0x00, 0x0F, 0x00,
+ 0x24, 0x2B, 0x24, 0x2C, 0x24, 0x2D, 0x24, 0x2E,
+ 0x1C, 0x04, 0x02, 0x00, 0x00, 0x00, 0x00, 0x10,
+ 0x05, 0x00, 0x95, 0x00, 0x20, 0x0A, 0x17, 0x22,
+ 0x2B, 0x1E, 0x12, 0x2E, 0x02, 0x00, 0x01, 0x00,
+ 0x00, 0x10, 0x05, 0x01, 0x94, 0x00, 0x1B, 0x08,
+ 0x06, 0x00, 0x1B, 0x1D, 0x02, 0x00, 0x02, 0x00,
+ 0x00, 0x10, 0x05, 0x02, 0x93, 0x00, 0x14, 0x08,
+ 0x06, 0x00, 0x02, 0x00, 0x03, 0x00, 0x00, 0x10,
+ 0x05, 0x01, 0x90, 0x00, 0x1B, 0x08, 0x06, 0x00,
+ 0x02, 0x00, 0x04, 0x00, 0x00, 0x10, 0x05, 0x00,
+ 0x8D, 0x00, 0x20, 0x08, 0x06, 0x00, 0x1B, 0x1D,
+ 0x02, 0x00, 0x05, 0x00, 0x00, 0x10, 0x05, 0x01,
+ 0x8A, 0x00, 0x1B, 0x08, 0x06, 0x00, 0x02, 0x00,
+ 0x06, 0x00, 0x00, 0x10, 0x05, 0x02, 0x88, 0x00,
+ 0x14, 0x08, 0x06, 0x00, 0x1B, 0x1D, 0x02, 0x00,
+ 0x07, 0x00, 0x00, 0x10, 0x05, 0x01, 0x85, 0x00,
+ 0x1B, 0x08, 0x06, 0x00, 0x02, 0x00, 0x08, 0x00,
+ 0x00, 0x10, 0x05, 0x00, 0x82, 0x00, 0x20, 0x08,
+ 0x06, 0x00, 0x02, 0x00, 0x09, 0x00, 0x00, 0x10,
+ 0x05, 0x01, 0x7F, 0x00, 0x1B, 0x08, 0x06, 0x00,
+ 0x02, 0x00, 0x0A, 0x00, 0x00, 0x10, 0x05, 0x02,
+ 0x7C, 0x00, 0x14, 0x08, 0x06, 0x00, 0x1B, 0x1D,
+ 0x02, 0x00, 0x0B, 0x00, 0x00, 0x10, 0x05, 0x01,
+ 0x79, 0x00, 0x1B, 0x08, 0x06, 0x00, 0x02, 0x00,
+ 0x0C, 0x00, 0x00, 0x10, 0x05, 0x00, 0x76, 0x00,
+ 0x20, 0x08, 0x06, 0x00, 0x02, 0x00, 0x0D, 0x00,
+ 0x00, 0x10, 0x05, 0x01, 0x73, 0x00, 0x1B, 0x08,
+ 0x06, 0x00, 0x1B, 0x1D, 0x02, 0x00, 0x0E, 0x00,
+ 0x00, 0x10, 0x05, 0x02, 0x70, 0x00, 0x14, 0x08,
+ 0x06, 0x00, 0x02, 0x00, 0x0F, 0x00, 0x00, 0x10,
+ 0x05, 0x01, 0x6D, 0x00, 0x1B, 0x08, 0x06, 0x00,
+ 0x02, 0x00, 0x10, 0x00, 0x00, 0x10, 0x05, 0x00,
+ 0x6A, 0x00, 0x20, 0x08, 0x06, 0x00, 0x02, 0x00,
+ 0x11, 0x00, 0x00, 0x10, 0x05, 0x01, 0x67, 0x00,
+ 0x1B, 0x08, 0x06, 0x00, 0x1B, 0x1D, 0x02, 0x00,
+ 0x12, 0x00, 0x00, 0x10, 0x05, 0x02, 0x65, 0x00,
+ 0x14, 0x08, 0x06, 0x00, 0x02, 0x00, 0x13, 0x00,
+ 0x00, 0x10, 0x05, 0x01, 0x63, 0x00, 0x1B, 0x08,
+ 0x06, 0x00, 0x02, 0x00, 0x14, 0x00, 0x00, 0x10,
+ 0x05, 0x00, 0x63, 0x00, 0x20, 0x08, 0x06, 0x00,
+ 0x02, 0x00, 0x15, 0x00, 0x00, 0x10, 0x05, 0x00,
+ 0x65, 0x00, 0x1F, 0x08, 0x06, 0x00, 0x02, 0x00,
+ 0x16, 0x00, 0x00, 0x10, 0x05, 0x00, 0x6A, 0x00,
+ 0x1D, 0x08, 0x06, 0x00, 0x02, 0x00, 0x17, 0x00,
+ 0x00, 0x10, 0x05, 0x00, 0x70, 0x00, 0x19, 0x08,
+ 0x06, 0x00, 0x02, 0x00, 0x18, 0x00, 0x00, 0x10,
+ 0x05, 0x00, 0x76, 0x00, 0x17, 0x08, 0x06, 0x00,
+ 0x02, 0x00, 0x19, 0x00, 0x00, 0x10, 0x05, 0x00,
+ 0x7C, 0x00, 0x16, 0x08, 0x06, 0x00, 0x02, 0x00,
+ 0x1A, 0x00, 0x00, 0x10, 0x05, 0x00, 0x82, 0x00,
+ 0x17, 0x08, 0x06, 0x00, 0x02, 0x00, 0x1B, 0x00,
+ 0x00, 0x10, 0x05, 0x00, 0x88, 0x00, 0x19, 0x08,
+ 0x06, 0x00, 0x02, 0x00, 0x1C, 0x00, 0x00, 0x10,
+ 0x05, 0x00, 0x8D, 0x00, 0x1D, 0x08, 0x06, 0x00,
+ 0x02, 0x00, 0x1D, 0x00, 0x00, 0x10, 0x05, 0x00,
+ 0x93, 0x00, 0x1F, 0x08, 0x06, 0x00, 0x1F, 0x22,
+ 0x2C, 0x1E, 0x12, 0x2F, 0x02, 0x00, 0x01, 0x00,
+ 0x00, 0x10, 0x05, 0x01, 0x94, 0x00, 0x1B, 0x08,
+ 0x06, 0x00, 0x02, 0x00, 0x01, 0x00, 0x00, 0x10,
+ 0x05, 0x01, 0x94, 0x00, 0x1B, 0x08, 0x06, 0x00,
+ 0x1B, 0x1D, 0x02, 0x00, 0x02, 0x00, 0x00, 0x10,
+ 0x05, 0x02, 0x93, 0x00, 0x14, 0x08, 0x06, 0x00,
+ 0x02, 0x00, 0x02, 0x00, 0x00, 0x10, 0x05, 0x02,
+ 0x93, 0x00, 0x14, 0x08, 0x06, 0x00, 0x02, 0x00,
+ 0x03, 0x00, 0x00, 0x10, 0x05, 0x01, 0x90, 0x00,
+ 0x1B, 0x08, 0x06, 0x00, 0x02, 0x00, 0x04, 0x00,
+ 0x00, 0x10, 0x05, 0x00, 0x8D, 0x00, 0x20, 0x08,
+ 0x06, 0x00, 0x1B, 0x1D, 0x02, 0x00, 0x05, 0x00,
+ 0x00, 0x10, 0x05, 0x01, 0x8A, 0x00, 0x1B, 0x08,
+ 0x06, 0x00, 0x02, 0x00, 0x05, 0x00, 0x00, 0x10,
+ 0x05, 0x01, 0x8A, 0x00, 0x1B, 0x08, 0x06, 0x00,
+ 0x02, 0x00, 0x06, 0x00, 0x00, 0x10, 0x05, 0x02,
+ 0x88, 0x00, 0x14, 0x08, 0x06, 0x00, 0x1B, 0x1D,
+ 0x02, 0x00, 0x07, 0x00, 0x00, 0x10, 0x05, 0x01,
+ 0x85, 0x00, 0x1B, 0x08, 0x06, 0x00, 0x02, 0x00,
+ 0x08, 0x00, 0x00, 0x10, 0x05, 0x00, 0x82, 0x00,
+ 0x20, 0x08, 0x06, 0x00, 0x02, 0x00, 0x09, 0x00,
+ 0x00, 0x10, 0x05, 0x01, 0x7F, 0x00, 0x1B, 0x08,
+ 0x06, 0x00, 0x02, 0x00, 0x0A, 0x00, 0x00, 0x10,
+ 0x05, 0x02, 0x7C, 0x00, 0x14, 0x08, 0x06, 0x00,
+ 0x1B, 0x1D, 0x02, 0x00, 0x0B, 0x00, 0x00, 0x10,
+ 0x05, 0x01, 0x79, 0x00, 0x1B, 0x08, 0x06, 0x00,
+ 0x02, 0x00, 0x0C, 0x00, 0x00, 0x10, 0x05, 0x00,
+ 0x76, 0x00, 0x20, 0x08, 0x06, 0x00, 0x02, 0x00,
+ 0x0D, 0x00, 0x00, 0x10, 0x05, 0x01, 0x73, 0x00,
+ 0x1B, 0x08, 0x06, 0x00, 0x1B, 0x1D, 0x02, 0x00,
+ 0x0E, 0x00, 0x00, 0x10, 0x05, 0x02, 0x70, 0x00,
+ 0x14, 0x08, 0x06, 0x00, 0x02, 0x00, 0x0F, 0x00,
+ 0x00, 0x10, 0x05, 0x01, 0x6D, 0x00, 0x1B, 0x08,
+ 0x06, 0x00, 0x02, 0x00, 0x10, 0x00, 0x00, 0x10,
+ 0x05, 0x00, 0x6A, 0x00, 0x20, 0x08, 0x06, 0x00,
+ 0x02, 0x00, 0x11, 0x00, 0x00, 0x10, 0x05, 0x01,
+ 0x67, 0x00, 0x1B, 0x08, 0x06, 0x00, 0x1B, 0x1D,
+ 0x02, 0x00, 0x12, 0x00, 0x00, 0x10, 0x05, 0x02,
+ 0x65, 0x00, 0x14, 0x08, 0x06, 0x00, 0x02, 0x00,
+ 0x13, 0x00, 0x00, 0x10, 0x05, 0x01, 0x63, 0x00,
+ 0x1B, 0x08, 0x06, 0x00, 0x02, 0x00, 0x14, 0x00,
+ 0x00, 0x10, 0x05, 0x00, 0x63, 0x00, 0x20, 0x08,
+ 0x06, 0x00, 0x02, 0x00, 0x15, 0x00, 0x00, 0x10,
+ 0x05, 0x00, 0x65, 0x00, 0x1F, 0x08, 0x06, 0x00,
+ 0x02, 0x00, 0x16, 0x00, 0x00, 0x10, 0x05, 0x00,
+ 0x6A, 0x00, 0x1D, 0x08, 0x06, 0x00, 0x02, 0x00,
+ 0x17, 0x00, 0x00, 0x10, 0x05, 0x00, 0x70, 0x00,
+ 0x19, 0x08, 0x06, 0x00, 0x02, 0x00, 0x18, 0x00,
+ 0x00, 0x10, 0x05, 0x00, 0x76, 0x00, 0x17, 0x08,
+ 0x06, 0x00, 0x02, 0x00, 0x19, 0x00, 0x00, 0x10,
+ 0x05, 0x00, 0x7C, 0x00, 0x16, 0x08, 0x06, 0x00,
+ 0x02, 0x00, 0x1A, 0x00, 0x00, 0x10, 0x05, 0x00,
+ 0x82, 0x00, 0x17, 0x08, 0x06, 0x00, 0x02, 0x00,
+ 0x1B, 0x00, 0x00, 0x10, 0x05, 0x00, 0x88, 0x00,
+ 0x19, 0x08, 0x06, 0x00, 0x02, 0x00, 0x1C, 0x00,
+ 0x00, 0x10, 0x05, 0x00, 0x8D, 0x00, 0x1D, 0x08,
+ 0x06, 0x00, 0x02, 0x00, 0x1D, 0x00, 0x00, 0x10,
+ 0x05, 0x00, 0x93, 0x00, 0x1F, 0x08, 0x06, 0x00,
+ 0x1F, 0x22, 0x2D, 0x1E, 0x12, 0x30, 0x02, 0x00,
+ 0x01, 0x00, 0x00, 0x10, 0x05, 0x01, 0x94, 0x00,
+ 0x1B, 0x08, 0x06, 0x00, 0x02, 0x00, 0x01, 0x00,
+ 0x00, 0x10, 0x05, 0x01, 0x94, 0x00, 0x1B, 0x08,
+ 0x06, 0x00, 0x1B, 0x1D, 0x02, 0x00, 0x02, 0x00,
+ 0x00, 0x10, 0x05, 0x02, 0x93, 0x00, 0x14, 0x08,
+ 0x06, 0x00, 0x02, 0x00, 0x02, 0x00, 0x00, 0x10,
+ 0x05, 0x02, 0x93, 0x00, 0x14, 0x08, 0x06, 0x00,
+ 0x02, 0x00, 0x02, 0x00, 0x00, 0x10, 0x05, 0x02,
+ 0x93, 0x00, 0x14, 0x08, 0x06, 0x00, 0x02, 0x00,
+ 0x03, 0x00, 0x00, 0x10, 0x05, 0x01, 0x90, 0x00,
+ 0x1B, 0x08, 0x06, 0x00, 0x02, 0x00, 0x03, 0x00,
+ 0x00, 0x10, 0x05, 0x01, 0x90, 0x00, 0x1B, 0x08,
+ 0x06, 0x00, 0x02, 0x00, 0x04, 0x00, 0x00, 0x10,
+ 0x05, 0x00, 0x8D, 0x00, 0x20, 0x08, 0x06, 0x00,
+ 0x1B, 0x1D, 0x02, 0x00, 0x05, 0x00, 0x00, 0x10,
+ 0x05, 0x01, 0x8A, 0x00, 0x1B, 0x08, 0x06, 0x00,
+ 0x02, 0x00, 0x06, 0x00, 0x00, 0x10, 0x05, 0x02,
+ 0x88, 0x00, 0x14, 0x08, 0x06, 0x00, 0x1B, 0x1D,
+ 0x02, 0x00, 0x07, 0x00, 0x00, 0x10, 0x05, 0x01,
+ 0x85, 0x00, 0x1B, 0x08, 0x06, 0x00, 0x02, 0x00,
+ 0x08, 0x00, 0x00, 0x10, 0x05, 0x00, 0x82, 0x00,
+ 0x20, 0x08, 0x06, 0x00, 0x02, 0x00, 0x09, 0x00,
+ 0x00, 0x10, 0x05, 0x01, 0x7F, 0x00, 0x1B, 0x08,
+ 0x06, 0x00, 0x02, 0x00, 0x0A, 0x00, 0x00, 0x10,
+ 0x05, 0x02, 0x7C, 0x00, 0x14, 0x08, 0x06, 0x00,
+ 0x1B, 0x1D, 0x02, 0x00, 0x0B, 0x00, 0x00, 0x10,
+ 0x05, 0x01, 0x79, 0x00, 0x1B, 0x08, 0x06, 0x00,
+ 0x02, 0x00, 0x0C, 0x00, 0x00, 0x10, 0x05, 0x00,
+ 0x76, 0x00, 0x20, 0x08, 0x06, 0x00, 0x02, 0x00,
+ 0x0D, 0x00, 0x00, 0x10, 0x05, 0x01, 0x73, 0x00,
+ 0x1B, 0x08, 0x06, 0x00, 0x1B, 0x1D, 0x02, 0x00,
+ 0x0E, 0x00, 0x00, 0x10, 0x05, 0x02, 0x70, 0x00,
+ 0x14, 0x08, 0x06, 0x00, 0x02, 0x00, 0x0F, 0x00,
+ 0x00, 0x10, 0x05, 0x01, 0x6D, 0x00, 0x1B, 0x08,
+ 0x06, 0x00, 0x02, 0x00, 0x10, 0x00, 0x00, 0x10,
+ 0x05, 0x00, 0x6A, 0x00, 0x20, 0x08, 0x06, 0x00,
+ 0x02, 0x00, 0x11, 0x00, 0x00, 0x10, 0x05, 0x01,
+ 0x67, 0x00, 0x1B, 0x08, 0x06, 0x00, 0x1B, 0x1D,
+ 0x02, 0x00, 0x12, 0x00, 0x00, 0x10, 0x05, 0x02,
+ 0x65, 0x00, 0x14, 0x08, 0x06, 0x00, 0x02, 0x00,
+ 0x13, 0x00, 0x00, 0x10, 0x05, 0x01, 0x63, 0x00,
+ 0x1B, 0x08, 0x06, 0x00, 0x02, 0x00, 0x14, 0x00,
+ 0x00, 0x10, 0x05, 0x00, 0x63, 0x00, 0x20, 0x08,
+ 0x06, 0x00, 0x02, 0x00, 0x15, 0x00, 0x00, 0x10,
+ 0x05, 0x00, 0x65, 0x00, 0x1F, 0x08, 0x06, 0x00,
+ 0x02, 0x00, 0x16, 0x00, 0x00, 0x10, 0x05, 0x00,
+ 0x6A, 0x00, 0x1D, 0x08, 0x06, 0x00, 0x02, 0x00,
+ 0x17, 0x00, 0x00, 0x10, 0x05, 0x00, 0x70, 0x00,
+ 0x19, 0x08, 0x06, 0x00, 0x02, 0x00, 0x18, 0x00,
+ 0x00, 0x10, 0x05, 0x00, 0x76, 0x00, 0x17, 0x08,
+ 0x06, 0x00, 0x02, 0x00, 0x19, 0x00, 0x00, 0x10,
+ 0x05, 0x00, 0x7C, 0x00, 0x16, 0x08, 0x06, 0x00,
+ 0x02, 0x00, 0x1A, 0x00, 0x00, 0x10, 0x05, 0x00,
+ 0x82, 0x00, 0x17, 0x08, 0x06, 0x00, 0x02, 0x00,
+ 0x1B, 0x00, 0x00, 0x10, 0x05, 0x00, 0x88, 0x00,
+ 0x19, 0x08, 0x06, 0x00, 0x02, 0x00, 0x1C, 0x00,
+ 0x00, 0x10, 0x05, 0x00, 0x8D, 0x00, 0x1D, 0x08,
+ 0x06, 0x00, 0x02, 0x00, 0x1D, 0x00, 0x00, 0x10,
+ 0x05, 0x00, 0x93, 0x00, 0x1F, 0x08, 0x06, 0x00,
+ 0x1F, 0x07, 0x3C, 0x00, 0x22, 0x2E, 0x1E, 0x12,
+ 0x31, 0x02, 0x00, 0x00, 0x00, 0x00, 0x10, 0x05,
+ 0x00, 0x95, 0x00, 0x20, 0x08, 0x06, 0x00, 0x02,
+ 0x00, 0x00, 0x00, 0x00, 0x10, 0x05, 0x00, 0x95,
+ 0x00, 0x20, 0x08, 0x06, 0x00, 0x1B, 0x1D, 0x02,
+ 0x00, 0x01, 0x00, 0x00, 0x10, 0x05, 0x01, 0x94,
+ 0x00, 0x1B, 0x08, 0x06, 0x00, 0x02, 0x00, 0x01,
+ 0x00, 0x00, 0x10, 0x05, 0x01, 0x94, 0x00, 0x1B,
+ 0x08, 0x06, 0x00, 0x02, 0x00, 0x02, 0x00, 0x00,
+ 0x10, 0x05, 0x02, 0x93, 0x00, 0x14, 0x08, 0x06,
+ 0x00, 0x02, 0x00, 0x02, 0x00, 0x00, 0x10, 0x05,
+ 0x02, 0x93, 0x00, 0x14, 0x08, 0x06, 0x00, 0x1B,
+ 0x1D, 0x02, 0x00, 0x03, 0x00, 0x00, 0x10, 0x05,
+ 0x01, 0x90, 0x00, 0x1B, 0x08, 0x06, 0x00, 0x02,
+ 0x00, 0x04, 0x00, 0x00, 0x10, 0x05, 0x00, 0x8D,
+ 0x00, 0x20, 0x08, 0x06, 0x00, 0x02, 0x00, 0x05,
+ 0x00, 0x00, 0x10, 0x05, 0x01, 0x8A, 0x00, 0x1B,
+ 0x08, 0x06, 0x00, 0x1B, 0x1D, 0x02, 0x00, 0x06,
+ 0x00, 0x00, 0x10, 0x05, 0x02, 0x88, 0x00, 0x14,
+ 0x08, 0x06, 0x00, 0x02, 0x00, 0x07, 0x00, 0x00,
+ 0x10, 0x05, 0x01, 0x85, 0x00, 0x1B, 0x08, 0x06,
+ 0x00, 0x1B, 0x1D, 0x02, 0x00, 0x08, 0x00, 0x00,
+ 0x10, 0x05, 0x00, 0x82, 0x00, 0x20, 0x08, 0x06,
+ 0x00, 0x02, 0x00, 0x09, 0x00, 0x00, 0x10, 0x05,
+ 0x01, 0x7F, 0x00, 0x1B, 0x08, 0x06, 0x00, 0x02,
+ 0x00, 0x0A, 0x00, 0x00, 0x10, 0x05, 0x02, 0x7C,
+ 0x00, 0x14, 0x08, 0x06, 0x00, 0x1B, 0x1D, 0x02,
+ 0x00, 0x0B, 0x00, 0x00, 0x10, 0x05, 0x01, 0x79,
+ 0x00, 0x1B, 0x08, 0x06, 0x00, 0x02, 0x00, 0x0C,
+ 0x00, 0x00, 0x10, 0x05, 0x00, 0x76, 0x00, 0x20,
+ 0x08, 0x06, 0x00, 0x1B, 0x1D, 0x02, 0x00, 0x0D,
+ 0x00, 0x00, 0x10, 0x05, 0x01, 0x73, 0x00, 0x1B,
+ 0x08, 0x06, 0x00, 0x02, 0x00, 0x0E, 0x00, 0x00,
+ 0x10, 0x05, 0x02, 0x70, 0x00, 0x14, 0x08, 0x06,
+ 0x00, 0x02, 0x00, 0x0F, 0x00, 0x00, 0x10, 0x05,
+ 0x01, 0x6D, 0x00, 0x1B, 0x08, 0x06, 0x00, 0x1B,
+ 0x1D, 0x02, 0x00, 0x10, 0x00, 0x00, 0x10, 0x05,
+ 0x00, 0x6A, 0x00, 0x20, 0x08, 0x06, 0x00, 0x02,
+ 0x00, 0x11, 0x00, 0x00, 0x10, 0x05, 0x01, 0x67,
+ 0x00, 0x1B, 0x08, 0x06, 0x00, 0x1B, 0x1D, 0x02,
+ 0x00, 0x12, 0x00, 0x00, 0x10, 0x05, 0x02, 0x65,
+ 0x00, 0x14, 0x08, 0x06, 0x00, 0x07, 0x3C, 0x00,
+ 0x02, 0x00, 0x1E, 0x00, 0x00, 0x10, 0x09, 0x15,
+ 0x07, 0x1E, 0x00, 0x0B, 0x01, 0x02, 0x00, 0x1F,
+ 0x00, 0x00, 0x10, 0x08, 0x0A, 0x00, 0x02, 0x00,
+ 0x20, 0x00, 0x00, 0x10, 0x08, 0x0A, 0x00, 0x02,
+ 0x00, 0x21, 0x00, 0x00, 0x10, 0x08, 0x0A, 0x00,
+ 0x02, 0x00, 0x22, 0x00, 0x00, 0x10, 0x08, 0x0A,
+ 0x00, 0x0C, 0x01, 0x02, 0x00, 0x1B, 0x1F, 0x07,
+ 0x0A, 0x00, 0x02, 0x00, 0x23, 0x00, 0x00, 0x10,
+ 0x08, 0x14, 0x00, 0x1B, 0x1E, 0x02, 0x00, 0x24,
+ 0x00, 0x00, 0x10, 0x08, 0x14, 0x00, 0x02, 0x00,
+ 0x25, 0x00, 0x00, 0x10, 0x08, 0x14, 0x00, 0x1B,
+ 0x1F, 0x02, 0x00, 0x26, 0x00, 0x00, 0x10, 0x08,
+ 0x14, 0x00, 0x02, 0x00, 0x27, 0x00, 0x00, 0x10,
+ 0x08, 0x14, 0x00, 0x1B, 0x1E, 0x02, 0x00, 0x28,
+ 0x00, 0x00, 0x10, 0x09, 0x07, 0x3C, 0x00, 0x1B,
+ 0x1E, 0x03, 0x00, 0x08, 0x06, 0x00, 0x1B, 0x1E,
+ 0x03, 0x00, 0x08, 0x06, 0x00, 0x03, 0x00, 0x08,
+ 0x06, 0x00, 0x03, 0x00, 0x08, 0x06, 0x00, 0x03,
+ 0x00, 0x08, 0x06, 0x00, 0x03, 0x00, 0x08, 0x06,
+ 0x00, 0x03, 0x00, 0x08, 0x06, 0x00, 0x1B, 0x1E,
+ 0x03, 0x00, 0x08, 0x06, 0x00, 0x03, 0x00, 0x08,
+ 0x06, 0x00, 0x03, 0x00, 0x08, 0x06, 0x00, 0x03,
+ 0x00, 0x08, 0x06, 0x00, 0x03, 0x00, 0x08, 0x06,
+ 0x00, 0x03, 0x00, 0x08, 0x06, 0x00, 0x03, 0x00,
+ 0x08, 0x06, 0x00, 0x03, 0x00, 0x08, 0x06, 0x00,
+ 0x03, 0x00, 0x08, 0x06, 0x00, 0x1B, 0x1E, 0x03,
+ 0x00, 0x08, 0x06, 0x00, 0x03, 0x00, 0x08, 0x06,
+ 0x00, 0x03, 0x00, 0x08, 0x06, 0x00, 0x03, 0x00,
+ 0x08, 0x06, 0x00, 0x03, 0x00, 0x08, 0x06, 0x00,
+ 0x03, 0x00, 0x08, 0x06, 0x00, 0x03, 0x00, 0x08,
+ 0x06, 0x00, 0x03, 0x00, 0x08, 0x06, 0x00, 0x1B,
+ 0x1E, 0x03, 0x00, 0x08, 0x06, 0x00, 0x03, 0x00,
+ 0x08, 0x06, 0x00, 0x03, 0x00, 0x08, 0x06, 0x00,
+ 0x03, 0x00, 0x08, 0x06, 0x00, 0x03, 0x00, 0x08,
+ 0x06, 0x00, 0x03, 0x00, 0x08, 0x06, 0x00, 0x03,
+ 0x00, 0x08, 0x06, 0x00, 0x03, 0x00, 0x08, 0x06,
+ 0x00, 0x03, 0x00, 0x08, 0x06, 0x00, 0x03, 0x00,
+ 0x08, 0x06, 0x00, 0x16, 0x1F, 0x1C, 0x01, 0x07,
+ 0x3C, 0x00, 0x01, 0x00, 0x20
+};
+
+static const ByteProvider k1KallakWritingSeqDOSCDProvider = { ARRAYSIZE(k1KallakWritingSeqDOSCD), k1KallakWritingSeqDOSCD };
+
+static const byte k1MalcolmTreeSeqDOSCD[560] = {
+ 0x23, 0x00, 0x01, 0x00, 0x1D, 0x11, 0x24, 0x1C,
+ 0x24, 0x13, 0x24, 0x14, 0x24, 0x15, 0x24, 0x16,
+ 0x24, 0x17, 0x24, 0x19, 0x24, 0x1B, 0x1A, 0x00,
+ 0x00, 0x00, 0x3F, 0x01, 0xC7, 0x0C, 0x00, 0x0F,
+ 0x01, 0x10, 0x01, 0x0A, 0x02, 0x01, 0x00, 0x00,
+ 0x00, 0x10, 0x1C, 0x03, 0x0A, 0x1B, 0x1E, 0x17,
+ 0x1B, 0x1F, 0x0B, 0x00, 0x03, 0x01, 0x07, 0x06,
+ 0x00, 0x0C, 0x00, 0x1F, 0x00, 0x1B, 0x19, 0x0B,
+ 0x01, 0x03, 0x01, 0x07, 0x06, 0x00, 0x0C, 0x01,
+ 0x0D, 0x00, 0x22, 0x1C, 0x13, 0x1F, 0x50, 0x00,
+ 0x2D, 0x05, 0x03, 0x01, 0x07, 0x06, 0x00, 0x03,
+ 0x01, 0x07, 0x06, 0x00, 0x0B, 0x02, 0x03, 0x01,
+ 0x07, 0x06, 0x00, 0x0C, 0x02, 0x10, 0x00, 0x14,
+ 0x1B, 0x1F, 0x03, 0x01, 0x07, 0x06, 0x00, 0x03,
+ 0x01, 0x07, 0x06, 0x00, 0x03, 0x01, 0x07, 0x06,
+ 0x00, 0x1B, 0x24, 0x1B, 0x1F, 0x03, 0x01, 0x07,
+ 0x06, 0x00, 0x1B, 0x1E, 0x0B, 0x03, 0x03, 0x01,
+ 0x07, 0x06, 0x00, 0x0C, 0x03, 0x15, 0x00, 0x22,
+ 0x13, 0x13, 0x16, 0x50, 0x00, 0x2D, 0x05, 0x1B,
+ 0x1F, 0x0B, 0x04, 0x03, 0x01, 0x07, 0x04, 0x00,
+ 0x0C, 0x04, 0x08, 0x00, 0x02, 0x01, 0x64, 0x00,
+ 0x00, 0x10, 0x1B, 0x1A, 0x1B, 0x1E, 0x0B, 0x05,
+ 0x03, 0x01, 0x07, 0x04, 0x00, 0x0C, 0x05, 0x09,
+ 0x00, 0x14, 0x06, 0x3C, 0x00, 0x13, 0x17, 0x50,
+ 0x00, 0x2D, 0x05, 0x0B, 0x06, 0x03, 0x01, 0x07,
+ 0x04, 0x00, 0x0C, 0x06, 0x09, 0x00, 0x22, 0x14,
+ 0x07, 0x1E, 0x00, 0x0B, 0x06, 0x03, 0x01, 0x07,
+ 0x04, 0x00, 0x0C, 0x06, 0x09, 0x00, 0x1B, 0x1A,
+ 0x1B, 0x1F, 0x0B, 0x07, 0x03, 0x01, 0x07, 0x04,
+ 0x00, 0x0C, 0x07, 0x06, 0x00, 0x1B, 0x1E, 0x07,
+ 0x1E, 0x00, 0x22, 0x15, 0x13, 0x18, 0x50, 0x00,
+ 0x2D, 0x05, 0x03, 0x01, 0x07, 0x06, 0x00, 0x03,
+ 0x01, 0x07, 0x06, 0x00, 0x03, 0x01, 0x07, 0x06,
+ 0x00, 0x0B, 0x08, 0x04, 0x01, 0x07, 0x06, 0x00,
+ 0x04, 0x01, 0x07, 0x06, 0x00, 0x03, 0x01, 0x07,
+ 0x06, 0x00, 0x03, 0x01, 0x07, 0x06, 0x00, 0x0D,
+ 0x08, 0x01, 0x00, 0x03, 0x01, 0x07, 0x06, 0x00,
+ 0x06, 0x78, 0x00, 0x0B, 0x09, 0x03, 0x01, 0x07,
+ 0x06, 0x00, 0x0C, 0x09, 0x04, 0x00, 0x1B, 0x1B,
+ 0x0B, 0x0A, 0x03, 0x01, 0x07, 0x06, 0x00, 0x0C,
+ 0x0A, 0x09, 0x00, 0x06, 0x14, 0x00, 0x22, 0x16,
+ 0x13, 0x19, 0x50, 0x00, 0x2D, 0x05, 0x03, 0x01,
+ 0x07, 0x06, 0x00, 0x03, 0x01, 0x07, 0x06, 0x00,
+ 0x0B, 0x0B, 0x03, 0x01, 0x07, 0x06, 0x00, 0x04,
+ 0x01, 0x07, 0x06, 0x00, 0x04, 0x01, 0x07, 0x06,
+ 0x00, 0x03, 0x01, 0x07, 0x06, 0x00, 0x03, 0x01,
+ 0x07, 0x06, 0x00, 0x0C, 0x0B, 0x01, 0x00, 0x03,
+ 0x01, 0x07, 0x06, 0x00, 0x03, 0x01, 0x07, 0x06,
+ 0x00, 0x03, 0x01, 0x07, 0x06, 0x00, 0x22, 0x17,
+ 0x13, 0x1A, 0x50, 0x00, 0x2D, 0x05, 0x0B, 0x0C,
+ 0x03, 0x01, 0x07, 0x06, 0x00, 0x0C, 0x0C, 0x12,
+ 0x00, 0x03, 0x01, 0x01, 0x01, 0x14, 0x18, 0x00,
+ 0x02, 0x00, 0x02, 0x00, 0x02, 0x02, 0x00, 0x00,
+ 0x00, 0x10, 0x22, 0x19, 0x13, 0x1C, 0x50, 0x00,
+ 0x2D, 0x05, 0x06, 0x3C, 0x00, 0x03, 0x02, 0x03,
+ 0x02, 0x07, 0x06, 0x00, 0x14, 0x1B, 0x1C, 0x0B,
+ 0x0F, 0x03, 0x02, 0x07, 0x06, 0x00, 0x0C, 0x0F,
+ 0x0D, 0x00, 0x22, 0x1B, 0x13, 0x1D, 0x50, 0x00,
+ 0x2D, 0x05, 0x0B, 0x10, 0x03, 0x02, 0x07, 0x04,
+ 0x00, 0x03, 0x02, 0x07, 0x04, 0x00, 0x03, 0x02,
+ 0x07, 0x04, 0x00, 0x04, 0x02, 0x07, 0x04, 0x00,
+ 0x04, 0x02, 0x07, 0x04, 0x00, 0x04, 0x02, 0x07,
+ 0x04, 0x00, 0x0D, 0x10, 0x02, 0x00, 0x13, 0x1E,
+ 0x50, 0x00, 0x2D, 0x05, 0x0B, 0x11, 0x03, 0x02,
+ 0x07, 0x04, 0x00, 0x03, 0x02, 0x07, 0x04, 0x00,
+ 0x03, 0x02, 0x07, 0x04, 0x00, 0x04, 0x02, 0x07,
+ 0x04, 0x00, 0x04, 0x02, 0x07, 0x04, 0x00, 0x04,
+ 0x02, 0x07, 0x04, 0x00, 0x0D, 0x11, 0x01, 0x00,
+ 0x03, 0x02, 0x07, 0x04, 0x00, 0x07, 0xB4, 0x00,
+ 0x16, 0x1C, 0x01, 0x01, 0x01, 0x01, 0x02, 0x20
+};
+
+static const ByteProvider k1MalcolmTreeSeqDOSCDProvider = { ARRAYSIZE(k1MalcolmTreeSeqDOSCD), k1MalcolmTreeSeqDOSCD };
+
+static const byte k1WestwoodLogoSeqDOSCD[75] = {
+ 0x00, 0x03, 0x01, 0x1D, 0x02, 0x03, 0x00, 0x00,
+ 0x00, 0x00, 0x19, 0x01, 0x07, 0x06, 0x00, 0x07,
+ 0x3C, 0x00, 0x1B, 0x14, 0x0B, 0x00, 0x03, 0x03,
+ 0x19, 0x01, 0x0C, 0x00, 0x08, 0x00, 0x07, 0x3C,
+ 0x00, 0x1B, 0x27, 0x0B, 0x01, 0x03, 0x03, 0x19,
+ 0x01, 0x0C, 0x01, 0x0B, 0x00, 0x07, 0x78, 0x00,
+ 0x1B, 0x14, 0x02, 0x03, 0x0A, 0x00, 0x00, 0x00,
+ 0x19, 0x01, 0x07, 0x06, 0x00, 0x0B, 0x02, 0x04,
+ 0x03, 0x19, 0x01, 0x0C, 0x02, 0x09, 0x00, 0x16,
+ 0x01, 0x03, 0x20
+};
+
+static const ByteProvider k1WestwoodLogoSeqDOSCDProvider = { ARRAYSIZE(k1WestwoodLogoSeqDOSCD), k1WestwoodLogoSeqDOSCD };
+
+static const byte k1KyrandiaLogoSeqDOSCD[166] = {
+ 0x18, 0x00, 0x02, 0x00, 0x06, 0x01, 0x1D, 0x02,
+ 0x06, 0x00, 0x00, 0x00, 0x00, 0x19, 0x00, 0x07,
+ 0x06, 0x00, 0x19, 0x04, 0x03, 0x06, 0x19, 0x00,
+ 0x03, 0x06, 0x19, 0x00, 0x03, 0x06, 0x19, 0x00,
+ 0x03, 0x06, 0x19, 0x00, 0x03, 0x06, 0x19, 0x00,
+ 0x03, 0x06, 0x19, 0x00, 0x0B, 0x00, 0x03, 0x06,
+ 0x19, 0x00, 0x0C, 0x00, 0x06, 0x00, 0x03, 0x06,
+ 0x19, 0x00, 0x03, 0x06, 0x19, 0x00, 0x03, 0x06,
+ 0x19, 0x00, 0x03, 0x06, 0x19, 0x00, 0x03, 0x06,
+ 0x19, 0x00, 0x03, 0x06, 0x19, 0x00, 0x03, 0x06,
+ 0x19, 0x00, 0x03, 0x06, 0x19, 0x00, 0x1B, 0x27,
+ 0x0B, 0x01, 0x03, 0x06, 0x19, 0x00, 0x0C, 0x01,
+ 0x07, 0x00, 0x06, 0xF0, 0x00, 0x1B, 0x27, 0x0B,
+ 0x02, 0x04, 0x06, 0x19, 0x00, 0x0C, 0x02, 0x0F,
+ 0x00, 0x07, 0x78, 0x00, 0x07, 0xB4, 0x00, 0x24,
+ 0x37, 0x24, 0x38, 0x24, 0x39, 0x24, 0x3A, 0x24,
+ 0x3B, 0x24, 0x3C, 0x02, 0x06, 0x0D, 0x00, 0x00,
+ 0x00, 0x19, 0x00, 0x07, 0x06, 0x00, 0x07, 0x3C,
+ 0x00, 0x22, 0x1C, 0x1B, 0x14, 0x0B, 0x02, 0x04,
+ 0x06, 0x19, 0x00, 0x0C, 0x02, 0x0C, 0x00, 0x07,
+ 0x78, 0x00, 0x16, 0x01, 0x06, 0x20
+};
+
+static const ByteProvider k1KyrandiaLogoSeqDOSCDProvider = { ARRAYSIZE(k1KyrandiaLogoSeqDOSCD), k1KyrandiaLogoSeqDOSCD };
+
+static const byte k1KallakMalcolmSeqDOSCD[696] = {
+ 0x00, 0x04, 0x01, 0x1D, 0x24, 0x00, 0x24, 0x01,
+ 0x24, 0x02, 0x24, 0x0B, 0x24, 0x0C, 0x11, 0x1A,
+ 0x00, 0x00, 0x00, 0x3F, 0x01, 0xC7, 0x0C, 0x00,
+ 0x0F, 0x03, 0x10, 0x00, 0x1A, 0x00, 0x00, 0x88,
+ 0x3F, 0x01, 0xC7, 0x0C, 0x02, 0x1C, 0x00, 0x02,
+ 0x04, 0x00, 0x10, 0x00, 0x3A, 0x0A, 0x1C, 0x00,
+ 0x1C, 0x05, 0x17, 0x1B, 0x23, 0x0B, 0x00, 0x03,
+ 0x04, 0x08, 0x07, 0x00, 0x0C, 0x00, 0x23, 0x00,
+ 0x22, 0x00, 0x13, 0x02, 0x50, 0x00, 0x3A, 0x05,
+ 0x03, 0x04, 0x08, 0x07, 0x00, 0x03, 0x04, 0x08,
+ 0x07, 0x00, 0x0B, 0x01, 0x03, 0x04, 0x08, 0x0E,
+ 0x00, 0x0C, 0x01, 0x04, 0x00, 0x06, 0x3C, 0x00,
+ 0x22, 0x01, 0x13, 0x03, 0x50, 0x00, 0x3A, 0x05,
+ 0x0B, 0x02, 0x03, 0x04, 0x08, 0x06, 0x00, 0x0C,
+ 0x02, 0x18, 0x00, 0x06, 0x3C, 0x00, 0x22, 0x02,
+ 0x13, 0x04, 0x50, 0x00, 0x3A, 0x05, 0x0B, 0x03,
+ 0x03, 0x04, 0x08, 0x07, 0x00, 0x0C, 0x03, 0x0A,
+ 0x00, 0x06, 0x3C, 0x00, 0x24, 0x04, 0x24, 0x05,
+ 0x24, 0x03, 0x03, 0x04, 0x08, 0x07, 0x00, 0x03,
+ 0x04, 0x08, 0x07, 0x00, 0x22, 0x03, 0x13, 0x05,
+ 0xF0, 0x00, 0x3A, 0x0F, 0x03, 0x04, 0x08, 0x0A,
+ 0x00, 0x03, 0x04, 0x08, 0x0A, 0x00, 0x03, 0x04,
+ 0x08, 0x0A, 0x00, 0x03, 0x04, 0x08, 0x0A, 0x00,
+ 0x03, 0x04, 0x08, 0x0A, 0x00, 0x07, 0x1E, 0x00,
+ 0x22, 0x04, 0x13, 0x06, 0xF0, 0x00, 0x3A, 0x0F,
+ 0x0B, 0x04, 0x03, 0x04, 0x08, 0x05, 0x00, 0x0C,
+ 0x04, 0x12, 0x00, 0x07, 0x14, 0x00, 0x03, 0x04,
+ 0x08, 0x07, 0x00, 0x03, 0x04, 0x08, 0x07, 0x00,
+ 0x03, 0x04, 0x08, 0x07, 0x00, 0x06, 0x3C, 0x00,
+ 0x22, 0x05, 0x13, 0x07, 0xF0, 0x00, 0x3A, 0x0F,
+ 0x0B, 0x05, 0x03, 0x04, 0x08, 0x05, 0x00, 0x0C,
+ 0x05, 0x12, 0x00, 0x06, 0x3C, 0x00, 0x24, 0x06,
+ 0x03, 0x04, 0x08, 0x07, 0x00, 0x03, 0x04, 0x08,
+ 0x07, 0x00, 0x22, 0x06, 0x13, 0x08, 0x50, 0x00,
+ 0x3A, 0x05, 0x0B, 0x06, 0x03, 0x04, 0x08, 0x08,
+ 0x00, 0x0C, 0x06, 0x07, 0x00, 0x06, 0x3C, 0x00,
+ 0x24, 0x07, 0x03, 0x04, 0x08, 0x07, 0x00, 0x03,
+ 0x04, 0x08, 0x07, 0x00, 0x22, 0x07, 0x13, 0x09,
+ 0x50, 0x00, 0x3A, 0x05, 0x03, 0x04, 0x08, 0x07,
+ 0x00, 0x0B, 0x07, 0x03, 0x04, 0x08, 0x07, 0x00,
+ 0x0C, 0x07, 0x0A, 0x00, 0x06, 0x3C, 0x00, 0x22,
+ 0x08, 0x03, 0x04, 0x08, 0x07, 0x00, 0x13, 0x0A,
+ 0x50, 0x00, 0x3A, 0x05, 0x0B, 0x08, 0x03, 0x04,
+ 0x08, 0x07, 0x00, 0x0C, 0x08, 0x0F, 0x00, 0x06,
+ 0x3C, 0x00, 0x24, 0x0A, 0x22, 0x09, 0x13, 0x0B,
+ 0xF0, 0x00, 0x3A, 0x0F, 0x03, 0x04, 0x08, 0x07,
+ 0x00, 0x03, 0x04, 0x08, 0x07, 0x00, 0x03, 0x04,
+ 0x08, 0x07, 0x00, 0x03, 0x04, 0x08, 0x07, 0x00,
+ 0x03, 0x04, 0x08, 0x07, 0x00, 0x03, 0x04, 0x08,
+ 0x07, 0x00, 0x03, 0x04, 0x08, 0x07, 0x00, 0x03,
+ 0x04, 0x08, 0x07, 0x00, 0x03, 0x04, 0x08, 0x07,
+ 0x00, 0x07, 0x3C, 0x00, 0x22, 0x0A, 0x03, 0x04,
+ 0x08, 0x07, 0x00, 0x13, 0x0C, 0xF0, 0x00, 0x3A,
+ 0x0F, 0x0B, 0x09, 0x03, 0x04, 0x08, 0x05, 0x00,
+ 0x0C, 0x09, 0x0F, 0x00, 0x06, 0x3C, 0x00, 0x24,
+ 0x0B, 0x24, 0x0C, 0x24, 0x0D, 0x03, 0x04, 0x08,
+ 0x07, 0x00, 0x03, 0x04, 0x08, 0x07, 0x00, 0x03,
+ 0x04, 0x08, 0x07, 0x00, 0x03, 0x04, 0x08, 0x07,
+ 0x00, 0x03, 0x04, 0x08, 0x07, 0x00, 0x03, 0x04,
+ 0x08, 0x07, 0x00, 0x22, 0x0B, 0x13, 0x0D, 0x50,
+ 0x00, 0x3A, 0x05, 0x0B, 0x0A, 0x03, 0x04, 0x08,
+ 0x08, 0x00, 0x0C, 0x0A, 0x0E, 0x00, 0x06, 0x3C,
+ 0x00, 0x0B, 0x0B, 0x03, 0x04, 0x08, 0x07, 0x00,
+ 0x0C, 0x0B, 0x02, 0x00, 0x1B, 0x20, 0x0B, 0x0C,
+ 0x03, 0x04, 0x08, 0x07, 0x00, 0x0C, 0x0C, 0x06,
+ 0x00, 0x1B, 0x21, 0x0B, 0x0D, 0x03, 0x04, 0x08,
+ 0x07, 0x00, 0x0C, 0x0D, 0x0C, 0x00, 0x1B, 0x22,
+ 0x0B, 0x0E, 0x03, 0x04, 0x08, 0x07, 0x00, 0x0C,
+ 0x0E, 0x0B, 0x00, 0x22, 0x0C, 0x13, 0x0E, 0x50,
+ 0x00, 0x3A, 0x05, 0x0B, 0x0F, 0x03, 0x04, 0x08,
+ 0x07, 0x00, 0x0C, 0x0F, 0x09, 0x00, 0x06, 0x3C,
+ 0x00, 0x03, 0x04, 0x08, 0x07, 0x00, 0x22, 0x0D,
+ 0x13, 0x0F, 0x50, 0x00, 0x3A, 0x05, 0x0B, 0x10,
+ 0x03, 0x04, 0x08, 0x07, 0x00, 0x0C, 0x10, 0x09,
+ 0x00, 0x06, 0x3C, 0x00, 0x24, 0x0E, 0x24, 0x0F,
+ 0x03, 0x04, 0x08, 0x07, 0x00, 0x22, 0x0E, 0x13,
+ 0x10, 0x50, 0x00, 0x3A, 0x05, 0x0B, 0x11, 0x03,
+ 0x04, 0x08, 0x07, 0x00, 0x0C, 0x11, 0x0F, 0x00,
+ 0x06, 0x3C, 0x00, 0x03, 0x04, 0x08, 0x07, 0x00,
+ 0x22, 0x0F, 0x13, 0x11, 0x50, 0x00, 0x3A, 0x05,
+ 0x0B, 0x12, 0x03, 0x04, 0x08, 0x05, 0x00, 0x0C,
+ 0x12, 0x14, 0x00, 0x07, 0x3C, 0x00, 0x0B, 0x13,
+ 0x03, 0x04, 0x08, 0x07, 0x00, 0x0C, 0x13, 0x06,
+ 0x00, 0x1B, 0x23, 0x22, 0x1C, 0x0B, 0x13, 0x03,
+ 0x04, 0x08, 0x07, 0x00, 0x0C, 0x13, 0x06, 0x00,
+ 0x02, 0x04, 0x45, 0x10, 0x00, 0x3A, 0x14, 0x07,
+ 0x78, 0x00, 0x16, 0x1C, 0x01, 0x01, 0x04, 0x20
+};
+
+static const ByteProvider k1KallakMalcolmSeqDOSCDProvider = { ARRAYSIZE(k1KallakMalcolmSeqDOSCD), k1KallakMalcolmSeqDOSCD };
+
+static const byte k1ForestSeqDOSCD[627] = {
+ 0x00, 0x05, 0x01, 0x00, 0x07, 0x01, 0x1D, 0x02,
+ 0x07, 0x00, 0x00, 0x00, 0x08, 0x02, 0x05, 0x00,
+ 0x98, 0x00, 0x38, 0x0B, 0x00, 0x03, 0x07, 0x19,
+ 0x02, 0x07, 0x09, 0x00, 0x0C, 0x00, 0x0F, 0x00,
+ 0x22, 0x37, 0x03, 0x07, 0x19, 0x02, 0x07, 0x09,
+ 0x00, 0x03, 0x07, 0x19, 0x02, 0x07, 0x09, 0x00,
+ 0x03, 0x07, 0x19, 0x02, 0x07, 0x09, 0x00, 0x03,
+ 0x07, 0x19, 0x02, 0x07, 0x09, 0x00, 0x03, 0x07,
+ 0x19, 0x02, 0x07, 0x09, 0x00, 0x03, 0x07, 0x19,
+ 0x02, 0x07, 0x09, 0x00, 0x1B, 0x16, 0x03, 0x07,
+ 0x02, 0x05, 0x01, 0x98, 0x00, 0x38, 0x19, 0x02,
+ 0x19, 0x03, 0x07, 0x09, 0x00, 0x03, 0x07, 0x02,
+ 0x05, 0x03, 0x98, 0x00, 0x38, 0x19, 0x02, 0x19,
+ 0x03, 0x07, 0x09, 0x00, 0x03, 0x07, 0x02, 0x05,
+ 0x01, 0x98, 0x00, 0x38, 0x19, 0x02, 0x19, 0x03,
+ 0x07, 0x09, 0x00, 0x03, 0x07, 0x02, 0x05, 0x00,
+ 0x98, 0x00, 0x38, 0x19, 0x02, 0x19, 0x03, 0x07,
+ 0x09, 0x00, 0x03, 0x07, 0x19, 0x02, 0x07, 0x09,
+ 0x00, 0x03, 0x07, 0x19, 0x02, 0x07, 0x09, 0x00,
+ 0x03, 0x07, 0x19, 0x02, 0x07, 0x09, 0x00, 0x03,
+ 0x07, 0x19, 0x02, 0x07, 0x09, 0x00, 0x03, 0x07,
+ 0x19, 0x02, 0x07, 0x09, 0x00, 0x03, 0x07, 0x19,
+ 0x02, 0x07, 0x09, 0x00, 0x03, 0x07, 0x19, 0x02,
+ 0x07, 0x09, 0x00, 0x03, 0x07, 0x19, 0x02, 0x07,
+ 0x09, 0x00, 0x03, 0x07, 0x19, 0x02, 0x07, 0x09,
+ 0x00, 0x03, 0x07, 0x19, 0x02, 0x07, 0x09, 0x00,
+ 0x03, 0x07, 0x19, 0x02, 0x07, 0x09, 0x00, 0x22,
+ 0x38, 0x0B, 0x09, 0x03, 0x07, 0x19, 0x02, 0x07,
+ 0x09, 0x00, 0x0C, 0x09, 0x21, 0x00, 0x1B, 0x16,
+ 0x03, 0x07, 0x02, 0x05, 0x01, 0x98, 0x00, 0x38,
+ 0x19, 0x02, 0x19, 0x03, 0x07, 0x09, 0x00, 0x03,
+ 0x07, 0x02, 0x05, 0x03, 0x98, 0x00, 0x38, 0x19,
+ 0x02, 0x19, 0x03, 0x07, 0x09, 0x00, 0x03, 0x07,
+ 0x02, 0x05, 0x01, 0x98, 0x00, 0x38, 0x19, 0x02,
+ 0x19, 0x03, 0x07, 0x09, 0x00, 0x03, 0x07, 0x02,
+ 0x05, 0x04, 0x98, 0x00, 0x38, 0x19, 0x02, 0x19,
+ 0x03, 0x07, 0x09, 0x00, 0x03, 0x07, 0x19, 0x02,
+ 0x07, 0x09, 0x00, 0x22, 0x39, 0x03, 0x07, 0x19,
+ 0x02, 0x07, 0x09, 0x00, 0x03, 0x07, 0x02, 0x05,
+ 0x05, 0x98, 0x00, 0x38, 0x19, 0x02, 0x19, 0x03,
+ 0x07, 0x09, 0x00, 0x03, 0x07, 0x19, 0x02, 0x07,
+ 0x09, 0x00, 0x03, 0x07, 0x19, 0x02, 0x07, 0x09,
+ 0x00, 0x03, 0x07, 0x02, 0x05, 0x06, 0x98, 0x00,
+ 0x38, 0x19, 0x02, 0x19, 0x03, 0x07, 0x09, 0x00,
+ 0x03, 0x07, 0x19, 0x02, 0x07, 0x09, 0x00, 0x03,
+ 0x07, 0x19, 0x02, 0x07, 0x09, 0x00, 0x1B, 0x25,
+ 0x0B, 0x00, 0x03, 0x07, 0x03, 0x05, 0x19, 0x02,
+ 0x19, 0x03, 0x07, 0x09, 0x00, 0x0C, 0x00, 0x09,
+ 0x00, 0x0B, 0x06, 0x03, 0x07, 0x19, 0x02, 0x07,
+ 0x09, 0x00, 0x0C, 0x06, 0x0E, 0x00, 0x22, 0x3A,
+ 0x03, 0x07, 0x19, 0x02, 0x07, 0x09, 0x00, 0x03,
+ 0x07, 0x19, 0x02, 0x07, 0x09, 0x00, 0x03, 0x07,
+ 0x19, 0x02, 0x07, 0x09, 0x00, 0x03, 0x07, 0x19,
+ 0x02, 0x07, 0x09, 0x00, 0x1B, 0x17, 0x0B, 0x01,
+ 0x03, 0x07, 0x03, 0x05, 0x19, 0x02, 0x19, 0x03,
+ 0x07, 0x09, 0x00, 0x0C, 0x01, 0x0D, 0x00, 0x1B,
+ 0x25, 0x0B, 0x07, 0x03, 0x07, 0x19, 0x02, 0x07,
+ 0x09, 0x00, 0x0C, 0x07, 0x08, 0x00, 0x03, 0x07,
+ 0x19, 0x02, 0x07, 0x09, 0x00, 0x03, 0x07, 0x19,
+ 0x02, 0x07, 0x09, 0x00, 0x03, 0x07, 0x19, 0x02,
+ 0x07, 0x09, 0x00, 0x03, 0x07, 0x19, 0x02, 0x07,
+ 0x09, 0x00, 0x1B, 0x18, 0x03, 0x07, 0x03, 0x05,
+ 0x19, 0x02, 0x19, 0x03, 0x07, 0x09, 0x00, 0x22,
+ 0x3B, 0x03, 0x07, 0x03, 0x05, 0x19, 0x02, 0x19,
+ 0x03, 0x07, 0x09, 0x00, 0x03, 0x07, 0x03, 0x05,
+ 0x19, 0x02, 0x19, 0x03, 0x07, 0x09, 0x00, 0x03,
+ 0x07, 0x03, 0x05, 0x19, 0x02, 0x19, 0x03, 0x07,
+ 0x09, 0x00, 0x03, 0x07, 0x03, 0x05, 0x19, 0x02,
+ 0x19, 0x03, 0x07, 0x09, 0x00, 0x07, 0x12, 0x00,
+ 0x1B, 0x25, 0x0B, 0x02, 0x03, 0x07, 0x03, 0x05,
+ 0x19, 0x02, 0x19, 0x03, 0x07, 0x09, 0x00, 0x0C,
+ 0x02, 0x07, 0x00, 0x03, 0x07, 0x19, 0x02, 0x07,
+ 0x09, 0x00, 0x03, 0x07, 0x19, 0x02, 0x07, 0x09,
+ 0x00, 0x03, 0x07, 0x19, 0x02, 0x07, 0x09, 0x00,
+ 0x03, 0x07, 0x19, 0x02, 0x07, 0x09, 0x00, 0x03,
+ 0x07, 0x19, 0x02, 0x07, 0x09, 0x00, 0x22, 0x3C,
+ 0x0B, 0x03, 0x03, 0x07, 0x19, 0x02, 0x07, 0x09,
+ 0x00, 0x0C, 0x03, 0x23, 0x00, 0x16, 0x01, 0x07,
+ 0x01, 0x05, 0x20
+};
+
+static const ByteProvider k1ForestSeqDOSCDProvider = { ARRAYSIZE(k1ForestSeqDOSCD), k1ForestSeqDOSCD };
+
+static const char *const k1IntroCPSStringsDOSCD[2] = {
+ "gemcuti.cps",
+ "tree.cps"
+};
+
+static const StringListProvider k1IntroCPSStringsDOSCDProvider = { ARRAYSIZE(k1IntroCPSStringsDOSCD), k1IntroCPSStringsDOSCD };
+
+static const char *const k1IntroCOLStringsDOSCD[4] = {
+ "kallak.col",
+ "tree_exp.col",
+ "ww.col",
+ "mal-kal.col"
+};
+
+static const StringListProvider k1IntroCOLStringsDOSCDProvider = { ARRAYSIZE(k1IntroCOLStringsDOSCD), k1IntroCOLStringsDOSCD };
+
+static const char *const k1IntroWSAStringsDOSCD[11] = {
+ "kallak.wsa",
+ "tree1.wsa",
+ "tree2.wsa",
+ "westwood.wsa",
+ "mal-kal.wsa",
+ "destruct.wsa",
+ "kyrandia.wsa",
+ "shore.wsa",
+ "reunion.wsa",
+ "reuniont.wsa",
+ "latern.wsa"
+};
+
+static const StringListProvider k1IntroWSAStringsDOSCDProvider = { ARRAYSIZE(k1IntroWSAStringsDOSCD), k1IntroWSAStringsDOSCD };
+
+static const Room k1RoomListDOSCD[246] = {
+ { 30, 0xFFFF, 0xFFFF, 0x0001, 0xFFFF },
+ { 71, 0xFFFF, 0xFFFF, 0x0005, 0xFFFF },
+ { 44, 0xFFFF, 0x0003, 0xFFFF, 0xFFFF },
+ { 72, 0xFFFF, 0xFFFF, 0x000E, 0xFFFF },
+ { 48, 0xFFFF, 0x0005, 0xFFFF, 0x000E },
+ { 74, 0xFFFF, 0x000A, 0xFFFF, 0x0004 },
+ { 46, 0xFFFF, 0x000F, 0xFFFF, 0x000B },
+ { 75, 0xFFFF, 0x0009, 0xFFFF, 0x0018 },
+ { 13, 0xFFFF, 0x000C, 0xFFFF, 0x000A },
+ { 5, 0x000D, 0xFFFF, 0xFFFF, 0x0007 },
+ { 84, 0xFFFF, 0x0008, 0xFFFF, 0x0005 },
+ { 37, 0xFFFF, 0x0006, 0x000C, 0x0010 },
+ { 51, 0x000B, 0xFFFF, 0x000D, 0x0008 },
+ { 23, 0x000C, 0xFFFF, 0x0009, 0xFFFF },
+ { 25, 0x0003, 0x0004, 0xFFFF, 0xFFFF },
+ { 11, 0xFFFF, 0xFFFF, 0xFFFF, 0x0006 },
+ { 86, 0xFFFF, 0x000B, 0xFFFF, 0xFFFF },
+ { 84, 0xFFFF, 0x0022, 0x0017, 0x0016 },
+ { 51, 0x0020, 0x0014, 0x0024, 0x0015 },
+ { 85, 0x0014, 0x0019, 0xFFFF, 0x0024 },
+ { 33, 0x001C, 0xFFFF, 0x0013, 0x0012 },
+ { 31, 0x0022, 0x0012, 0xFFFF, 0x0017 },
+ { 25, 0x001F, 0x0011, 0xFFFF, 0xFFFF },
+ { 25, 0x0011, 0x0015, 0xFFFF, 0xFFFF },
+ { 2, 0xFFFF, 0x0007, 0xFFFF, 0x001A },
+ { 82, 0xFFFF, 0x006D, 0xFFFF, 0x0013 },
+ { 77, 0xFFFF, 0x0018, 0x0021, 0xFFFF },
+ { 15, 0xFFFF, 0x001A, 0xFFFF, 0xFFFF },
+ { 16, 0xFFFF, 0xFFFF, 0x0014, 0x0020 },
+ { 19, 0xFFFF, 0x0021, 0xFFFF, 0x001F },
+ { 12, 0xFFFF, 0xFFFF, 0x0020, 0x0021 },
+ { 7, 0x0023, 0x001D, 0x0016, 0xFFFF },
+ { 20, 0x001E, 0x001C, 0x0012, 0x0022 },
+ { 17, 0x001A, 0x001E, 0x0022, 0x001D },
+ { 22, 0x0021, 0x0020, 0x0015, 0x0011 },
+ { 24, 0xFFFF, 0xFFFF, 0x001F, 0xFFFF },
+ { 32, 0x0012, 0x0013, 0xFFFF, 0xFFFF },
+ { 87, 0xFFFF, 0x0026, 0xFFFF, 0xFFFF },
+ { 8, 0xFFFF, 0x0027, 0xFFFF, 0x0025 },
+ { 88, 0xFFFF, 0x0035, 0x0037, 0x0026 },
+ { 35, 0xFFFF, 0x0036, 0x0038, 0xFFFF },
+ { 47, 0xFFFF, 0xFFFF, 0x003B, 0xFFFF },
+ { 28, 0x0035, 0x002B, 0x002F, 0x0037 },
+ { 36, 0xFFFF, 0x002C, 0xFFFF, 0x002A },
+ { 78, 0xFFFF, 0xFFFF, 0xFFFF, 0x002B },
+ { 10, 0xFFFF, 0xFFFF, 0xFFFF, 0x002C },
+ { 51, 0x0037, 0x002F, 0x0040, 0x003C },
+ { 38, 0x002A, 0x003D, 0x0041, 0x002E },
+ { 81, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF },
+ { 41, 0xFFFF, 0xFFFF, 0x0069, 0xFFFF },
+ { 50, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF },
+ { 18, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF },
+ { 49, 0xFFFF, 0xFFFF, 0x0054, 0xFFFF },
+ { 105, 0xFFFF, 0xFFFF, 0x002A, 0x0027 },
+ { 105, 0xFFFF, 0xFFFF, 0x0039, 0x0028 },
+ { 37, 0x0027, 0x002A, 0x002E, 0x0049 },
+ { 34, 0x0028, 0x0039, 0xFFFF, 0xFFFF },
+ { 51, 0x0036, 0x003A, 0xFFFF, 0x0038 },
+ { 84, 0xFFFF, 0x003B, 0xFFFF, 0x0039 },
+ { 1, 0x0029, 0xFFFF, 0x003E, 0x003A },
+ { 37, 0x0049, 0x002E, 0x003F, 0xFFFF },
+ { 33, 0xFFFF, 0xFFFF, 0xFFFF, 0x002F },
+ { 34, 0x003B, 0x003F, 0xFFFF, 0xFFFF },
+ { 85, 0x003C, 0x0040, 0xFFFF, 0x003E },
+ { 106, 0x002E, 0x0041, 0xFFFF, 0x003F },
+ { 33, 0x002F, 0xFFFF, 0xFFFF, 0x0040 },
+ { 60, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF },
+ { 3, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF },
+ { 11, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF },
+ { 33, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF },
+ { 26, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF },
+ { 0, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF },
+ { 25, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF },
+ { 23, 0xFFFF, 0x0037, 0x003C, 0xFFFF },
+ { 6, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF },
+ { 51, 0x0063, 0x0067, 0x006B, 0x0066 },
+ { 66, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF },
+ { 67, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF },
+ { 62, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF },
+ { 65, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF },
+ { 18, 0x0056, 0x005A, 0x005E, 0xFFFF },
+ { 6, 0xFFFF, 0x0052, 0x0056, 0xFFFF },
+ { 4, 0xFFFF, 0x0053, 0x0057, 0x0051 },
+ { 3, 0xFFFF, 0x0054, 0xFFFF, 0x0052 },
+ { 37, 0x0034, 0x0055, 0x0058, 0x0053 },
+ { 11, 0xFFFF, 0xFFFF, 0x0059, 0x0054 },
+ { 37, 0x0051, 0x0057, 0x0050, 0xFFFF },
+ { 51, 0x0052, 0xFFFF, 0x005A, 0x0056 },
+ { 51, 0x0054, 0x0059, 0x005C, 0xFFFF },
+ { 1, 0x0055, 0xFFFF, 0x005D, 0x0058 },
+ { 106, 0x0057, 0x005B, 0xFFFF, 0x0050 },
+ { 85, 0xFFFF, 0x005C, 0xFFFF, 0x005A },
+ { 37, 0x0058, 0x005D, 0x005F, 0x005B },
+ { 33, 0x0059, 0xFFFF, 0xFFFF, 0x005C },
+ { 51, 0x0050, 0xFFFF, 0x0061, 0xFFFF },
+ { 51, 0x005C, 0xFFFF, 0x0064, 0xFFFF },
+ { 37, 0xFFFF, 0x0061, 0x0065, 0xFFFF },
+ { 51, 0x005E, 0x0062, 0xFFFF, 0x0060 },
+ { 84, 0xFFFF, 0x0063, 0x0066, 0x0061 },
+ { 84, 0xFFFF, 0x0064, 0x004B, 0x0062 },
+ { 33, 0x005F, 0xFFFF, 0x0067, 0x0063 },
+ { 51, 0x0060, 0xFFFF, 0x0068, 0xFFFF },
+ { 37, 0x0062, 0x004B, 0x006A, 0xFFFF },
+ { 1, 0x0064, 0xFFFF, 0x006C, 0x004B },
+ { 34, 0x0065, 0x0069, 0xFFFF, 0xFFFF },
+ { 51, 0x0031, 0x006A, 0xFFFF, 0x0068 },
+ { 85, 0x0066, 0x006B, 0xFFFF, 0x0069 },
+ { 106, 0x004B, 0x006C, 0xFFFF, 0x006A },
+ { 33, 0x0067, 0xFFFF, 0xFFFF, 0x006B },
+ { 55, 0x00C4, 0x00C5, 0xFFFF, 0x0019 },
+ { 52, 0xFFFF, 0x00C1, 0xFFFF, 0x0096 },
+ { 64, 0xFFFF, 0x00BF, 0xFFFF, 0x008C },
+ { 57, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF },
+ { 54, 0x00AF, 0xFFFF, 0x00B7, 0x00AC },
+ { 53, 0x0078, 0xFFFF, 0x0079, 0xFFFF },
+ { 29, 0xFFFF, 0x00BB, 0xFFFF, 0x00C5 },
+ { 69, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF },
+ { 76, 0x00C6, 0xFFFF, 0xFFFF, 0x00B1 },
+ { 59, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF },
+ { 58, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF },
+ { 59, 0xFFFF, 0x0025, 0x0072, 0xFFFF },
+ { 58, 0x0072, 0x007B, 0x00BB, 0xFFFF },
+ { 58, 0xFFFF, 0x007F, 0x007B, 0xFFFF },
+ { 59, 0x007A, 0xFFFF, 0x007C, 0x0079 },
+ { 58, 0x007B, 0x0081, 0x00BC, 0xFFFF },
+ { 58, 0x00BC, 0x0083, 0xFFFF, 0xFFFF },
+ { 58, 0xFFFF, 0x0085, 0x007F, 0xFFFF },
+ { 59, 0x007E, 0x0086, 0x0080, 0x007A },
+ { 58, 0x007F, 0x00BD, 0x0081, 0xFFFF },
+ { 59, 0x0080, 0x0087, 0x0082, 0x007C },
+ { 58, 0x0081, 0xFFFF, 0x0083, 0x00BC },
+ { 59, 0x0082, 0x0089, 0x0084, 0x007D },
+ { 58, 0x0083, 0x008A, 0xFFFF, 0xFFFF },
+ { 59, 0xFFFF, 0x008B, 0x0086, 0x007E },
+ { 58, 0x0085, 0x008C, 0x00BD, 0x007F },
+ { 58, 0x00BD, 0x008E, 0x0088, 0x0081 },
+ { 59, 0x0087, 0xFFFF, 0x0089, 0xFFFF },
+ { 58, 0x0088, 0x0090, 0x008A, 0x0083 },
+ { 59, 0x0089, 0x0091, 0xFFFF, 0x0084 },
+ { 58, 0xFFFF, 0x0092, 0x008C, 0x0085 },
+ { 59, 0x008B, 0x006F, 0x008D, 0x0086 },
+ { 58, 0x008C, 0x0093, 0x008E, 0x00BD },
+ { 59, 0x008D, 0xFFFF, 0xFFFF, 0x0087 },
+ { 58, 0xFFFF, 0x00BE, 0x0090, 0xFFFF },
+ { 59, 0x008F, 0x0095, 0x0091, 0x0089 },
+ { 58, 0x0090, 0x0096, 0xFFFF, 0x008A },
+ { 59, 0xFFFF, 0x0098, 0xFFFF, 0x008B },
+ { 59, 0xFFFF, 0xFFFF, 0xFFFF, 0x008D },
+ { 58, 0xFFFF, 0x009A, 0x00BE, 0xFFFF },
+ { 58, 0x00BE, 0xFFFF, 0x0096, 0x0090 },
+ { 59, 0x0095, 0x006E, 0x0097, 0x0091 },
+ { 58, 0x0096, 0x009D, 0xFFFF, 0xFFFF },
+ { 58, 0xFFFF, 0x009E, 0x00BF, 0x0092 },
+ { 58, 0x00BF, 0x00A0, 0x009A, 0xFFFF },
+ { 59, 0x0099, 0xFFFF, 0x009B, 0x0094 },
+ { 58, 0x009A, 0xFFFF, 0x009C, 0xFFFF },
+ { 59, 0x009B, 0x00A2, 0xFFFF, 0xFFFF },
+ { 59, 0xFFFF, 0x00A3, 0xFFFF, 0x0097 },
+ { 59, 0xFFFF, 0xFFFF, 0x009F, 0x0098 },
+ { 58, 0x009E, 0x00A4, 0x00A0, 0x00BF },
+ { 59, 0x009F, 0x00A5, 0xFFFF, 0x0099 },
+ { 58, 0xFFFF, 0x00A6, 0x00C0, 0xFFFF },
+ { 58, 0x00C0, 0x00A8, 0xFFFF, 0x009C },
+ { 58, 0x00C1, 0xFFFF, 0xFFFF, 0x009D },
+ { 59, 0xFFFF, 0x00AA, 0x00A5, 0x009F },
+ { 58, 0x00A4, 0x00AB, 0x00A6, 0x00A0 },
+ { 59, 0x00A5, 0x00AC, 0x00A7, 0x00A1 },
+ { 58, 0x00A6, 0xFFFF, 0xFFFF, 0x00C0 },
+ { 59, 0xFFFF, 0x00AD, 0x00A9, 0x00A2 },
+ { 58, 0x00A8, 0x00AE, 0xFFFF, 0x00C1 },
+ { 58, 0xFFFF, 0xFFFF, 0x00AB, 0x00A4 },
+ { 59, 0x00AA, 0x00AF, 0x00AC, 0x00A5 },
+ { 58, 0x00AB, 0x0071, 0x00C2, 0x00A6 },
+ { 58, 0xFFFF, 0x00B0, 0x00AE, 0x00A8 },
+ { 59, 0x00AD, 0xFFFF, 0xFFFF, 0x00A9 },
+ { 58, 0xFFFF, 0x00C3, 0x0071, 0x00AB },
+ { 59, 0xFFFF, 0xFFFF, 0x00B1, 0x00AD },
+ { 58, 0x00B0, 0x0075, 0xFFFF, 0xFFFF },
+ { 59, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF },
+ { 59, 0x00C3, 0xFFFF, 0x00B4, 0xFFFF },
+ { 59, 0x00B3, 0x00BA, 0xFFFF, 0xFFFF },
+ { 58, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF },
+ { 59, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF },
+ { 58, 0x0071, 0xFFFF, 0xFFFF, 0x00C2 },
+ { 58, 0xFFFF, 0xFFFF, 0x00B9, 0xFFFF },
+ { 59, 0x00B8, 0xFFFF, 0xFFFF, 0x00C3 },
+ { 58, 0xFFFF, 0xFFFF, 0xFFFF, 0x00B4 },
+ { 59, 0x0079, 0xFFFF, 0xFFFF, 0x0073 },
+ { 59, 0x007C, 0x0082, 0x007D, 0xFFFF },
+ { 59, 0x0086, 0x008D, 0x0087, 0x0080 },
+ { 59, 0x0094, 0xFFFF, 0x0095, 0x008F },
+ { 59, 0x0098, 0x009F, 0x0099, 0x006F },
+ { 59, 0x00A1, 0x00A7, 0x00A2, 0xFFFF },
+ { 59, 0xFFFF, 0x00A9, 0x00A3, 0x006E },
+ { 59, 0x00AC, 0x00B7, 0xFFFF, 0xFFFF },
+ { 58, 0xFFFF, 0x00B9, 0x00B3, 0x00AF },
+ { 59, 0xFFFF, 0xFFFF, 0x006D, 0xFFFF },
+ { 58, 0xFFFF, 0x0073, 0xFFFF, 0x006D },
+ { 59, 0xFFFF, 0xFFFF, 0x0075, 0xFFFF },
+ { 94, 0xFFFF, 0x00C8, 0xFFFF, 0xFFFF },
+ { 43, 0x00C9, 0x00CB, 0x00CA, 0x00C7 },
+ { 51, 0xFFFF, 0xFFFF, 0x00C8, 0xFFFF },
+ { 37, 0x00C8, 0xFFFF, 0xFFFF, 0xFFFF },
+ { 79, 0xFFFF, 0xFFFF, 0xFFFF, 0x00C8 },
+ { 80, 0xFFFF, 0xFFFF, 0x00CB, 0x00CD },
+ { 97, 0x00E3, 0x00D4, 0x00CC, 0x00D3 },
+ { 103, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF },
+ { 100, 0xFFFF, 0x00CE, 0x00D5, 0xFFFF },
+ { 98, 0xFFFF, 0xFFFF, 0xFFFF, 0x00D7 },
+ { 101, 0xFFFF, 0x00D2, 0x00CE, 0xFFFF },
+ { 99, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF },
+ { 93, 0x00D5, 0x00CD, 0xFFFF, 0xFFFF },
+ { 93, 0x00D6, 0xFFFF, 0xFFFF, 0x00CD },
+ { 93, 0x00CF, 0x00CE, 0x00D3, 0xFFFF },
+ { 93, 0x00D7, 0xFFFF, 0x00D4, 0x00CE },
+ { 93, 0xFFFF, 0x00D0, 0x00D6, 0x00CE },
+ { 93, 0x00DA, 0x00E3, 0xFFFF, 0xFFFF },
+ { 93, 0x00DB, 0xFFFF, 0xFFFF, 0x00E3 },
+ { 93, 0xFFFF, 0x00E4, 0x00D8, 0x00E2 },
+ { 93, 0xFFFF, 0x00E1, 0x00D9, 0x00E4 },
+ { 93, 0xFFFF, 0x00E4, 0xFFFF, 0x00DF },
+ { 93, 0xFFFF, 0x00E0, 0xFFFF, 0x00E4 },
+ { 93, 0xFFFF, 0xFFFF, 0x00E4, 0xFFFF },
+ { 91, 0xFFFF, 0x00DC, 0xFFFF, 0xFFFF },
+ { 90, 0xFFFF, 0xFFFF, 0xFFFF, 0x00DD },
+ { 92, 0xFFFF, 0xFFFF, 0xFFFF, 0x00DB },
+ { 95, 0xFFFF, 0x00DA, 0xFFFF, 0xFFFF },
+ { 96, 0xFFFF, 0x00D9, 0x00CD, 0x00D8 },
+ { 89, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF },
+ { 102, 0xFFFF, 0x00E6, 0xFFFF, 0xFFFF },
+ { 102, 0xFFFF, 0x00EA, 0x00E8, 0x00E5 },
+ { 102, 0xFFFF, 0x00E8, 0x00EB, 0xFFFF },
+ { 102, 0x00E6, 0xFFFF, 0xFFFF, 0x00E7 },
+ { 102, 0xFFFF, 0xFFFF, 0x00ED, 0xFFFF },
+ { 102, 0xFFFF, 0xFFFF, 0xFFFF, 0x00E6 },
+ { 102, 0x00E7, 0x00EC, 0x00EF, 0xFFFF },
+ { 102, 0xFFFF, 0x00ED, 0x00F0, 0x00EB },
+ { 102, 0x00E9, 0x00EE, 0x00F1, 0x00EC },
+ { 102, 0xFFFF, 0xFFFF, 0x00F2, 0x00ED },
+ { 102, 0x00EB, 0x00F0, 0xFFFF, 0xFFFF },
+ { 102, 0x00EC, 0x00F1, 0x00F3, 0x00EF },
+ { 102, 0x00ED, 0xFFFF, 0x00F4, 0x00F0 },
+ { 102, 0x00EE, 0xFFFF, 0xFFFF, 0xFFFF },
+ { 102, 0x00F0, 0x00F4, 0xFFFF, 0xFFFF },
+ { 102, 0x00F1, 0x00F5, 0xFFFF, 0x00F3 },
+ { 102, 0xFFFF, 0xFFFF, 0x00CF, 0x00F4 }
+};
+
+static const RoomProvider k1RoomListDOSCDProvider = { ARRAYSIZE(k1RoomListDOSCD), k1RoomListDOSCD };
+
+static const char *const k1RoomFilenamesDOSCD[107] = {
+ "CLIFFB",
+ "XEDGEB",
+ "CAVEB",
+ "NCLIFF",
+ "NCLIFFB",
+ "CAVE",
+ "NWCLIFF",
+ "OAKS",
+ "PLATEAU",
+ "POTHUT",
+ "POTION",
+ "NWCLIFB",
+ "SONG",
+ "SORROW",
+ "SPELHUT",
+ "SPELL",
+ "SPRING",
+ "SQUARE",
+ "STUMP",
+ "TEMPLE",
+ "WELL",
+ "WILLOW",
+ "WISE",
+ "XEDGE",
+ "RUBY",
+ "ZROCK",
+ "ZROCKB",
+ "FORESTD",
+ "FOUNTN",
+ "GATECV",
+ "GEMCUT",
+ "CLIFF",
+ "DEAD",
+ "EDGE",
+ "EDGEB",
+ "FALLS",
+ "FORESTC",
+ "FORESTB",
+ "GLADE",
+ "GEMHUT",
+ "ALGAE",
+ "MIX",
+ "BRIDGE",
+ "GRAVE",
+ "HEALER",
+ "HEALHUT",
+ "ALTAR",
+ "BURN",
+ "SICKWIL",
+ "LAGOON",
+ "MAPLE",
+ "FORESTA",
+ "ARCH",
+ "CHASM",
+ "EMCAV",
+ "ENTER",
+ "FLOWERS",
+ "GEMSLOT",
+ "GEN_CAV",
+ "GENCAVB",
+ "GOLDEN",
+ "GOLDENB",
+ "ICE",
+ "MARKET",
+ "MOONCAV",
+ "MSHCAV",
+ "POOL",
+ "SEASONS",
+ "SHRINE",
+ "TREECAV",
+ "EXTGEM",
+ "GEM",
+ "EXTHEAL",
+ "BASE",
+ "TRUNK",
+ "BROKEN",
+ "LAVA",
+ "EXTSPEL",
+ "EXTPOT",
+ "CASTLE",
+ "CGATE",
+ "LEPHOLE",
+ "DRAGON",
+ "XEDGEC",
+ "FNORTH",
+ "FSOUTH",
+ "FGOWEST",
+ "PLTCAVE",
+ "BONKBG",
+ "BALCONY",
+ "DARMS",
+ "BRINS",
+ "ALCHEMY",
+ "GENHALL",
+ "LANDING",
+ "BELROOM",
+ "UPSTAIR",
+ "DNSTAIR",
+ "KITCHEN",
+ "KYRAGEM",
+ "LIBRARY",
+ "FOYER",
+ "CATACOM",
+ "GRTHALL",
+ "FESTSTH",
+ "FWSTSTH",
+ "FSOUTHB"
+};
+
+static const StringListProvider k1RoomFilenamesDOSCDProvider = { ARRAYSIZE(k1RoomFilenamesDOSCD), k1RoomFilenamesDOSCD };
+
+static const char *const k1CharacterImageFilenamesDOSCD[20] = {
+ "BRANDON.CPS",
+ "DAPHNE.CPS",
+ "MERITH.CPS",
+ "HERMAN.CPS",
+ "SMALL.CPS",
+ "MALCOM.CPS",
+ "DRINK.CPS",
+ "SHRINK.CPS",
+ "HEALBR1.CPS",
+ "HEALBR2.CPS",
+ "SNOW1A.CPS",
+ "SNOW2A.CPS",
+ "BRANWILL.CPS",
+ "FLUTE1.CPS",
+ "FLUTE2.CPS",
+ "POISON1.CPS",
+ "POISON2.CPS",
+ "TELEKIN.CPS",
+ "BRANSTON.CPS",
+ "POISON.CPS"
+};
+
+static const StringListProvider k1CharacterImageFilenamesDOSCDProvider = { ARRAYSIZE(k1CharacterImageFilenamesDOSCD), k1CharacterImageFilenamesDOSCD };
+
+static const Shape k1DefaultShapesDOSCD[166] = {
+ { 0, 0, 0, 3, 48, -12, -48 },
+ { 0, 3, 0, 3, 48, -12, -48 },
+ { 0, 6, 0, 3, 48, -12, -48 },
+ { 0, 9, 0, 3, 48, -12, -48 },
+ { 0, 12, 0, 3, 48, -12, -48 },
+ { 0, 15, 0, 3, 48, -12, -48 },
+ { 0, 18, 0, 3, 48, -12, -48 },
+ { 0, 21, 0, 3, 48, -12, -48 },
+ { 0, 24, 0, 3, 48, -12, -48 },
+ { 0, 27, 0, 3, 48, -12, -48 },
+ { 0, 0, 51, 2, 11, -2, -8 },
+ { 0, 2, 51, 2, 11, -2, -8 },
+ { 0, 4, 51, 2, 11, -2, -8 },
+ { 0, 6, 51, 2, 11, -2, -8 },
+ { 0, 8, 51, 2, 11, -2, -8 },
+ { 0, 10, 51, 2, 11, -2, -8 },
+ { 0, 12, 51, 2, 11, -2, -8 },
+ { 0, 14, 51, 2, 11, -2, -8 },
+ { 0, 16, 51, 2, 11, -2, -8 },
+ { 0, 18, 51, 2, 11, -2, -8 },
+ { 0, 20, 51, 2, 11, -2, -8 },
+ { 0, 22, 51, 2, 11, -2, -8 },
+ { 0, 0, 80, 3, 48, -12, -48 },
+ { 0, 3, 80, 3, 48, -12, -48 },
+ { 0, 6, 80, 3, 48, -12, -48 },
+ { 0, 9, 80, 3, 48, -12, -48 },
+ { 0, 12, 80, 3, 48, -12, -48 },
+ { 0, 15, 80, 3, 48, -12, -48 },
+ { 0, 0, 129, 3, 48, -12, -48 },
+ { 0, 3, 129, 3, 48, -12, -48 },
+ { 0, 6, 129, 3, 48, -12, -48 },
+ { 0, 9, 129, 3, 48, -12, -48 },
+ { 0, 12, 129, 3, 48, -12, -48 },
+ { 0, 15, 129, 3, 48, -12, -48 },
+ { 2, 0, 0, 3, 48, -12, -48 },
+ { 2, 3, 0, 3, 48, -12, -48 },
+ { 2, 6, 0, 3, 48, -12, -48 },
+ { 2, 9, 0, 3, 48, -12, -48 },
+ { 2, 12, 0, 3, 48, -12, -48 },
+ { 2, 15, 0, 3, 48, -12, -48 },
+ { 2, 18, 0, 3, 48, -12, -48 },
+ { 2, 21, 0, 3, 48, -12, -48 },
+ { 2, 24, 0, 3, 48, -12, -48 },
+ { 2, 27, 0, 3, 48, -12, -48 },
+ { 2, 30, 10, 3, 38, -16, -38 },
+ { 2, 27, 48, 4, 40, -8, -40 },
+ { 2, 0, 51, 2, 11, -4, 0 },
+ { 2, 2, 51, 2, 11, -4, 0 },
+ { 2, 4, 51, 2, 11, -4, 0 },
+ { 2, 6, 51, 2, 11, -4, 0 },
+ { 2, 8, 51, 2, 11, -4, 0 },
+ { 2, 10, 51, 2, 11, -4, 0 },
+ { 2, 12, 51, 2, 11, -4, 0 },
+ { 2, 14, 51, 2, 11, -4, 0 },
+ { 2, 16, 51, 2, 11, -4, 0 },
+ { 2, 18, 51, 2, 11, -4, 0 },
+ { 2, 20, 51, 2, 11, -4, 0 },
+ { 2, 22, 51, 2, 11, -4, 0 },
+ { 255, 0, 80, 3, 48, -12, -48 },
+ { 255, 3, 80, 3, 48, -12, -48 },
+ { 255, 6, 80, 3, 48, -12, -48 },
+ { 255, 9, 80, 3, 48, -12, -48 },
+ { 255, 12, 80, 3, 48, -12, -48 },
+ { 255, 15, 80, 3, 48, -12, -48 },
+ { 255, 0, 129, 3, 48, -12, -48 },
+ { 255, 3, 129, 3, 48, -12, -48 },
+ { 255, 6, 129, 3, 48, -12, -48 },
+ { 255, 9, 129, 3, 48, -12, -48 },
+ { 255, 12, 129, 3, 48, -12, -48 },
+ { 255, 15, 129, 3, 48, -12, -48 },
+ { 3, 0, 0, 3, 48, -12, -46 },
+ { 3, 3, 0, 3, 48, -12, -48 },
+ { 3, 6, 0, 3, 48, -12, -48 },
+ { 3, 9, 0, 3, 48, -12, -48 },
+ { 3, 12, 0, 3, 48, -12, -48 },
+ { 3, 15, 0, 3, 48, -12, -48 },
+ { 3, 18, 0, 3, 48, -12, -48 },
+ { 3, 21, 0, 3, 48, -12, -48 },
+ { 3, 24, 0, 3, 48, -12, -48 },
+ { 3, 27, 0, 3, 48, -12, -46 },
+ { 3, 30, 0, 3, 48, -14, -47 },
+ { 3, 39, 199, 1, 1, -12, -48 },
+ { 3, 0, 51, 2, 11, 0, -7 },
+ { 3, 2, 51, 2, 11, 0, -7 },
+ { 3, 4, 51, 2, 11, 0, -7 },
+ { 3, 6, 51, 2, 11, 0, -7 },
+ { 3, 8, 51, 2, 11, 0, -7 },
+ { 3, 10, 51, 2, 11, 0, -7 },
+ { 3, 12, 51, 2, 11, 0, -7 },
+ { 3, 14, 51, 2, 11, 0, -7 },
+ { 3, 16, 51, 2, 11, 0, -7 },
+ { 3, 18, 51, 2, 11, 0, -7 },
+ { 3, 20, 51, 2, 11, 0, -7 },
+ { 3, 22, 51, 2, 11, 0, -7 },
+ { 3, 0, 80, 3, 48, -12, -48 },
+ { 3, 3, 80, 3, 48, -12, -48 },
+ { 3, 6, 80, 3, 48, -12, -48 },
+ { 3, 9, 80, 3, 48, -12, -48 },
+ { 3, 12, 80, 3, 48, -12, -48 },
+ { 3, 15, 80, 3, 48, -12, -48 },
+ { 3, 0, 129, 3, 48, -12, -48 },
+ { 3, 3, 129, 3, 48, -12, -48 },
+ { 3, 6, 129, 3, 48, -12, -48 },
+ { 3, 9, 129, 3, 48, -12, -48 },
+ { 3, 12, 129, 3, 48, -12, -48 },
+ { 3, 15, 129, 3, 48, -12, -48 },
+ { 12, 0, 96, 5, 29, -20, -42 },
+ { 12, 5, 96, 5, 29, -20, -42 },
+ { 12, 10, 96, 5, 29, -20, -42 },
+ { 12, 15, 96, 5, 29, -20, -42 },
+ { 12, 20, 96, 5, 29, -20, -42 },
+ { 12, 25, 96, 5, 29, -20, -42 },
+ { 12, 30, 96, 5, 29, -20, -42 },
+ { 12, 35, 96, 5, 29, -20, -42 },
+ { 12, 0, 125, 5, 29, -20, -42 },
+ { 12, 5, 125, 5, 29, -20, -42 },
+ { 255, 0, 0, 0, 0, 0, 0 },
+ { 255, 0, 0, 0, 0, 0, 0 },
+ { 255, 0, 0, 0, 0, 0, 0 },
+ { 255, 0, 0, 0, 0, 0, 0 },
+ { 255, 0, 0, 0, 0, 0, 0 },
+ { 255, 0, 0, 0, 0, 0, 0 },
+ { 255, 0, 0, 0, 0, 0, 0 },
+ { 255, 0, 0, 0, 0, 0, 0 },
+ { 255, 0, 0, 0, 0, 0, 0 },
+ { 255, 0, 0, 0, 0, 0, 0 },
+ { 255, 0, 0, 0, 0, 0, 0 },
+ { 255, 0, 0, 0, 0, 0, 0 },
+ { 255, 0, 0, 0, 0, 0, 0 },
+ { 255, 0, 0, 0, 0, 0, 0 },
+ { 255, 0, 0, 0, 0, 0, 0 },
+ { 255, 0, 0, 0, 0, 0, 0 },
+ { 255, 0, 0, 0, 0, 0, 0 },
+ { 255, 0, 0, 0, 0, 0, 0 },
+ { 255, 0, 0, 0, 0, 0, 0 },
+ { 255, 0, 0, 0, 0, 0, 0 },
+ { 255, 0, 0, 0, 0, 0, 0 },
+ { 255, 0, 0, 0, 0, 0, 0 },
+ { 255, 0, 0, 0, 0, 0, 0 },
+ { 255, 0, 0, 0, 0, 0, 0 },
+ { 255, 0, 0, 0, 0, 0, 0 },
+ { 255, 0, 0, 0, 0, 0, 0 },
+ { 255, 0, 0, 0, 0, 0, 0 },
+ { 255, 0, 0, 0, 0, 0, 0 },
+ { 255, 0, 0, 0, 0, 0, 0 },
+ { 255, 0, 0, 0, 0, 0, 0 },
+ { 255, 0, 0, 0, 0, 0, 0 },
+ { 255, 0, 0, 0, 0, 0, 0 },
+ { 255, 0, 0, 0, 0, 0, 0 },
+ { 255, 0, 0, 0, 0, 0, 0 },
+ { 255, 0, 0, 0, 0, 0, 0 },
+ { 255, 0, 0, 0, 0, 0, 0 },
+ { 255, 0, 0, 0, 0, 0, 0 },
+ { 255, 0, 0, 0, 0, 0, 0 },
+ { 255, 0, 0, 0, 0, 0, 0 },
+ { 255, 0, 0, 0, 0, 0, 0 },
+ { 255, 0, 0, 0, 0, 0, 0 },
+ { 255, 0, 0, 0, 0, 0, 0 },
+ { 255, 0, 0, 0, 0, 0, 0 },
+ { 255, 0, 0, 0, 0, 0, 0 },
+ { 255, 0, 0, 0, 0, 0, 0 },
+ { 255, 0, 0, 0, 0, 0, 0 },
+ { 255, 0, 0, 0, 0, 0, 0 },
+ { 255, 0, 0, 0, 0, 0, 0 },
+ { 255, 0, 0, 0, 0, 0, 0 },
+ { 255, 0, 0, 0, 0, 0, 0 }
+};
+
+static const ShapeProvider k1DefaultShapesDOSCDProvider = { ARRAYSIZE(k1DefaultShapesDOSCD), k1DefaultShapesDOSCD };
+
+static const byte k1AmuleteAnimSeqDOSCD[42] = {
+ 0x00, 0x01, 0x02, 0x01, 0x03, 0x04, 0x03, 0x01,
+ 0x02, 0x03, 0x04, 0x05, 0x06, 0x05, 0x04, 0x05,
+ 0x07, 0x08, 0x07, 0x08, 0x09, 0x08, 0x09, 0x07,
+ 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D,
+ 0x0E, 0x0F, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15,
+ 0x16, 0xFF
+};
+
+static const ByteProvider k1AmuleteAnimSeqDOSCDProvider = { ARRAYSIZE(k1AmuleteAnimSeqDOSCD), k1AmuleteAnimSeqDOSCD };
+
+static const byte k1SpecialPalette1DOSCD[21] = {
+ 0x36, 0x25, 0x1C, 0x31, 0x21, 0x19, 0x2C, 0x1D,
+ 0x16, 0x27, 0x19, 0x13, 0x22, 0x16, 0x11, 0x1D,
+ 0x12, 0x0D, 0x18, 0x0F, 0x0B
+};
+
+static const ByteProvider k1SpecialPalette1DOSCDProvider = { ARRAYSIZE(k1SpecialPalette1DOSCD), k1SpecialPalette1DOSCD };
+
+static const byte k1SpecialPalette2DOSCD[51] = {
+ 0x03, 0x03, 0x00, 0x37, 0x29, 0x1D, 0x33, 0x25,
+ 0x1A, 0x2D, 0x21, 0x17, 0x2A, 0x1D, 0x13, 0x26,
+ 0x19, 0x11, 0x22, 0x16, 0x0E, 0x1E, 0x12, 0x0C,
+ 0x1A, 0x0F, 0x0A, 0x16, 0x0C, 0x08, 0x12, 0x0A,
+ 0x05, 0x0E, 0x08, 0x05, 0x2D, 0x1E, 0x13, 0x27,
+ 0x19, 0x0F, 0x22, 0x14, 0x0C, 0x1C, 0x11, 0x0A,
+ 0x17, 0x0C, 0x08
+};
+
+static const ByteProvider k1SpecialPalette2DOSCDProvider = { ARRAYSIZE(k1SpecialPalette2DOSCD), k1SpecialPalette2DOSCD };
+
+static const byte k1SpecialPalette3DOSCD[51] = {
+ 0x03, 0x03, 0x00, 0x25, 0x30, 0x1B, 0x24, 0x2C,
+ 0x18, 0x23, 0x29, 0x15, 0x22, 0x25, 0x12, 0x21,
+ 0x22, 0x11, 0x1F, 0x1D, 0x0D, 0x1B, 0x18, 0x0B,
+ 0x18, 0x13, 0x0A, 0x14, 0x0E, 0x08, 0x11, 0x0A,
+ 0x05, 0x0E, 0x08, 0x05, 0x21, 0x22, 0x11, 0x1D,
+ 0x1C, 0x0C, 0x19, 0x15, 0x0A, 0x15, 0x0F, 0x08,
+ 0x11, 0x0A, 0x05
+};
+
+static const ByteProvider k1SpecialPalette3DOSCDProvider = { ARRAYSIZE(k1SpecialPalette3DOSCD), k1SpecialPalette3DOSCD };
+
+static const byte k1SpecialPalette4DOSCD[51] = {
+ 0x06, 0x03, 0x01, 0x33, 0x25, 0x0A, 0x2F, 0x21,
+ 0x0A, 0x2B, 0x1D, 0x08, 0x28, 0x1A, 0x08, 0x24,
+ 0x17, 0x06, 0x21, 0x22, 0x06, 0x1D, 0x11, 0x05,
+ 0x19, 0x0E, 0x05, 0x16, 0x0B, 0x03, 0x12, 0x0A,
+ 0x03, 0x0F, 0x08, 0x03, 0x28, 0x1A, 0x08, 0x22,
+ 0x15, 0x05, 0x1D, 0x11, 0x05, 0x17, 0x0C, 0x03,
+ 0x12, 0x0A, 0x03
+};
+
+static const ByteProvider k1SpecialPalette4DOSCDProvider = { ARRAYSIZE(k1SpecialPalette4DOSCD), k1SpecialPalette4DOSCD };
+
+static const byte k1SpecialPalette5DOSCD[51] = {
+ 0x03, 0x03, 0x00, 0x2A, 0x1D, 0x13, 0x27, 0x1A,
+ 0x11, 0x24, 0x18, 0x0F, 0x21, 0x15, 0x0D, 0x1E,
+ 0x13, 0x0C, 0x1C, 0x11, 0x0A, 0x19, 0x0F, 0x0A,
+ 0x16, 0x0C, 0x08, 0x13, 0x0A, 0x06, 0x11, 0x08,
+ 0x05, 0x0E, 0x08, 0x05, 0x1C, 0x11, 0x0A, 0x19,
+ 0x0E, 0x08, 0x16, 0x0C, 0x08, 0x13, 0x0A, 0x06,
+ 0x11, 0x08, 0x05
+};
+
+static const ByteProvider k1SpecialPalette5DOSCDProvider = { ARRAYSIZE(k1SpecialPalette5DOSCD), k1SpecialPalette5DOSCD };
+
+static const byte k1SpecialPalette6DOSCD[51] = {
+ 0x00, 0x08, 0x01, 0x00, 0x1E, 0x00, 0x00, 0x1B,
+ 0x00, 0x00, 0x19, 0x00, 0x00, 0x17, 0x00, 0x00,
+ 0x14, 0x00, 0x00, 0x12, 0x00, 0x00, 0x11, 0x00,
+ 0x00, 0x0E, 0x00, 0x00, 0x0B, 0x00, 0x00, 0x0A,
+ 0x00, 0x00, 0x08, 0x00, 0x13, 0x21, 0x0F, 0x11,
+ 0x1F, 0x0D, 0x0E, 0x1D, 0x0C, 0x0C, 0x1B, 0x0B,
+ 0x0A, 0x19, 0x0A
+};
+
+static const ByteProvider k1SpecialPalette6DOSCDProvider = { ARRAYSIZE(k1SpecialPalette6DOSCD), k1SpecialPalette6DOSCD };
+
+static const byte k1SpecialPalette7DOSCD[54] = {
+ 0x05, 0x2B, 0x00, 0x00, 0x22, 0x00, 0x00, 0x1E,
+ 0x00, 0x00, 0x16, 0x01, 0x00, 0x12, 0x03, 0x00,
+ 0x0F, 0x01, 0x00, 0x0B, 0x03, 0x0A, 0x19, 0x0A,
+ 0x2D, 0x2D, 0x32, 0x29, 0x29, 0x2D, 0x25, 0x25,
+ 0x2B, 0x1F, 0x1F, 0x26, 0x1B, 0x1B, 0x22, 0x14,
+ 0x16, 0x1D, 0x11, 0x11, 0x18, 0x0D, 0x0D, 0x14,
+ 0x0A, 0x0A, 0x0F, 0x06, 0x06, 0x0B
+};
+
+static const ByteProvider k1SpecialPalette7DOSCDProvider = { ARRAYSIZE(k1SpecialPalette7DOSCD), k1SpecialPalette7DOSCD };
+
+static const byte k1SpecialPalette8DOSCD[54] = {
+ 0x12, 0x37, 0x3F, 0x14, 0x31, 0x3F, 0x14, 0x29,
+ 0x3F, 0x14, 0x22, 0x3F, 0x14, 0x1B, 0x3F, 0x14,
+ 0x14, 0x3F, 0x0E, 0x0F, 0x37, 0x14, 0x29, 0x3F,
+ 0x2F, 0x3F, 0x3D, 0x26, 0x3F, 0x3F, 0x15, 0x3F,
+ 0x3F, 0x14, 0x3B, 0x3F, 0x12, 0x37, 0x3F, 0x14,
+ 0x31, 0x3F, 0x14, 0x29, 0x3F, 0x14, 0x22, 0x3F,
+ 0x14, 0x1B, 0x3F, 0x14, 0x14, 0x3F
+};
+
+static const ByteProvider k1SpecialPalette8DOSCDProvider = { ARRAYSIZE(k1SpecialPalette8DOSCD), k1SpecialPalette8DOSCD };
+
+static const byte k1SpecialPalette9DOSCD[45] = {
+ 0x36, 0x00, 0x00, 0x32, 0x00, 0x00, 0x2F, 0x00,
+ 0x00, 0x2C, 0x00, 0x00, 0x29, 0x00, 0x00, 0x26,
+ 0x00, 0x00, 0x23, 0x00, 0x00, 0x20, 0x00, 0x00,
+ 0x1C, 0x00, 0x00, 0x19, 0x00, 0x00, 0x16, 0x00,
+ 0x00, 0x13, 0x00, 0x00, 0x11, 0x00, 0x00, 0x0D,
+ 0x00, 0x00, 0x0A, 0x00, 0x00
+};
+
+static const ByteProvider k1SpecialPalette9DOSCDProvider = { ARRAYSIZE(k1SpecialPalette9DOSCD), k1SpecialPalette9DOSCD };
+
+static const byte k1SpecialPalette10DOSCD[45] = {
+ 0x29, 0x00, 0x00, 0x26, 0x00, 0x00, 0x24, 0x00,
+ 0x00, 0x22, 0x00, 0x00, 0x20, 0x00, 0x00, 0x1E,
+ 0x00, 0x00, 0x1B, 0x00, 0x00, 0x19, 0x00, 0x00,
+ 0x17, 0x00, 0x00, 0x15, 0x00, 0x00, 0x12, 0x00,
+ 0x00, 0x11, 0x00, 0x00, 0x0E, 0x00, 0x00, 0x0C,
+ 0x00, 0x00, 0x0A, 0x00, 0x00
+};
+
+static const ByteProvider k1SpecialPalette10DOSCDProvider = { ARRAYSIZE(k1SpecialPalette10DOSCD), k1SpecialPalette10DOSCD };
+
+static const byte k1SpecialPalette11DOSCD[45] = {
+ 0x20, 0x00, 0x00, 0x1E, 0x00, 0x00, 0x1C, 0x00,
+ 0x00, 0x1B, 0x00, 0x00, 0x19, 0x00, 0x00, 0x18,
+ 0x00, 0x00, 0x16, 0x00, 0x00, 0x15, 0x00, 0x00,
+ 0x13, 0x00, 0x00, 0x11, 0x00, 0x00, 0x11, 0x00,
+ 0x00, 0x0E, 0x00, 0x00, 0x0D, 0x00, 0x00, 0x0B,
+ 0x00, 0x00, 0x0A, 0x00, 0x00
+};
+
+static const ByteProvider k1SpecialPalette11DOSCDProvider = { ARRAYSIZE(k1SpecialPalette11DOSCD), k1SpecialPalette11DOSCD };
+
+static const byte k1SpecialPalette12DOSCD[45] = {
+ 0x19, 0x00, 0x00, 0x18, 0x00, 0x00, 0x16, 0x00,
+ 0x00, 0x15, 0x00, 0x00, 0x14, 0x00, 0x00, 0x13,
+ 0x00, 0x00, 0x12, 0x00, 0x00, 0x11, 0x00, 0x00,
+ 0x11, 0x00, 0x00, 0x0F, 0x00, 0x00, 0x0E, 0x00,
+ 0x00, 0x0D, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x0B,
+ 0x00, 0x00, 0x0A, 0x00, 0x00
+};
+
+static const ByteProvider k1SpecialPalette12DOSCDProvider = { ARRAYSIZE(k1SpecialPalette12DOSCD), k1SpecialPalette12DOSCD };
+
+static const byte k1SpecialPalette13DOSCD[45] = {
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00
+};
+
+static const ByteProvider k1SpecialPalette13DOSCDProvider = { ARRAYSIZE(k1SpecialPalette13DOSCD), k1SpecialPalette13DOSCD };
+
+static const byte k1SpecialPalette14DOSCD[60] = {
+ 0x0E, 0x28, 0x3F, 0x0C, 0x24, 0x3B, 0x0A, 0x20,
+ 0x38, 0x0A, 0x1C, 0x34, 0x08, 0x19, 0x31, 0x08,
+ 0x15, 0x2D, 0x05, 0x13, 0x2A, 0x05, 0x11, 0x27,
+ 0x03, 0x0D, 0x24, 0x03, 0x0A, 0x20, 0x03, 0x08,
+ 0x1D, 0x01, 0x06, 0x19, 0x01, 0x05, 0x16, 0x00,
+ 0x03, 0x13, 0x00, 0x01, 0x0F, 0x00, 0x01, 0x0C,
+ 0x00, 0x00, 0x08, 0x00, 0x00, 0x05, 0x00, 0x00,
+ 0x03, 0x00, 0x00, 0x00
+};
+
+static const ByteProvider k1SpecialPalette14DOSCDProvider = { ARRAYSIZE(k1SpecialPalette14DOSCD), k1SpecialPalette14DOSCD };
+
+static const byte k1SpecialPalette15DOSCD[45] = {
+ 0x24, 0x00, 0x39, 0x21, 0x00, 0x36, 0x1F, 0x00,
+ 0x32, 0x1C, 0x00, 0x2D, 0x1A, 0x00, 0x2A, 0x17,
+ 0x00, 0x26, 0x15, 0x00, 0x22, 0x12, 0x00, 0x1E,
+ 0x11, 0x00, 0x1A, 0x0E, 0x00, 0x16, 0x0B, 0x00,
+ 0x12, 0x0A, 0x00, 0x0F, 0x06, 0x00, 0x0B, 0x05,
+ 0x00, 0x08, 0x01, 0x00, 0x03
+};
+
+static const ByteProvider k1SpecialPalette15DOSCDProvider = { ARRAYSIZE(k1SpecialPalette15DOSCD), k1SpecialPalette15DOSCD };
+
+static const byte k1SpecialPalette16DOSCD[33] = {
+ 0x00, 0x3F, 0x3F, 0x00, 0x38, 0x38, 0x00, 0x34,
+ 0x34, 0x00, 0x30, 0x30, 0x00, 0x2D, 0x2D, 0x00,
+ 0x29, 0x29, 0x00, 0x25, 0x25, 0x00, 0x1F, 0x1F,
+ 0x00, 0x1B, 0x1B, 0x00, 0x16, 0x16, 0x00, 0x11,
+ 0x11
+};
+
+static const ByteProvider k1SpecialPalette16DOSCDProvider = { ARRAYSIZE(k1SpecialPalette16DOSCD), k1SpecialPalette16DOSCD };
+
+static const byte k1SpecialPalette17DOSCD[33] = {
+ 0x3B, 0x3B, 0x3B, 0x36, 0x36, 0x36, 0x32, 0x32,
+ 0x32, 0x2D, 0x2D, 0x2D, 0x2A, 0x2A, 0x2A, 0x26,
+ 0x26, 0x26, 0x21, 0x21, 0x21, 0x1D, 0x1D, 0x1D,
+ 0x19, 0x19, 0x19, 0x15, 0x15, 0x15, 0x11, 0x11,
+ 0x11
+};
+
+static const ByteProvider k1SpecialPalette17DOSCDProvider = { ARRAYSIZE(k1SpecialPalette17DOSCD), k1SpecialPalette17DOSCD };
+
+static const byte k1SpecialPalette18DOSCD[21] = {
+ 0x0F, 0x23, 0x1C, 0x2A, 0x36, 0x3F, 0x24, 0x2F,
+ 0x38, 0x1F, 0x2A, 0x32, 0x1A, 0x24, 0x2B, 0x15,
+ 0x1E, 0x25, 0x11, 0x19, 0x1F
+};
+
+static const ByteProvider k1SpecialPalette18DOSCDProvider = { ARRAYSIZE(k1SpecialPalette18DOSCD), k1SpecialPalette18DOSCD };
+
+static const byte k1SpecialPalette19DOSCD[21] = {
+ 0x00, 0x00, 0x1C, 0x00, 0x00, 0x3F, 0x00, 0x00,
+ 0x38, 0x00, 0x00, 0x32, 0x00, 0x00, 0x2B, 0x00,
+ 0x00, 0x25, 0x00, 0x00, 0x1F
+};
+
+static const ByteProvider k1SpecialPalette19DOSCDProvider = { ARRAYSIZE(k1SpecialPalette19DOSCD), k1SpecialPalette19DOSCD };
+
+static const byte k1SpecialPalette20DOSCD[21] = {
+ 0x26, 0x1B, 0x1B, 0x3F, 0x34, 0x34, 0x3B, 0x2F,
+ 0x2F, 0x39, 0x2B, 0x2B, 0x36, 0x26, 0x27, 0x33,
+ 0x22, 0x23, 0x31, 0x1F, 0x20
+};
+
+static const ByteProvider k1SpecialPalette20DOSCDProvider = { ARRAYSIZE(k1SpecialPalette20DOSCD), k1SpecialPalette20DOSCD };
+
+static const byte k1SpecialPalette21DOSCD[21] = {
+ 0x1C, 0x00, 0x00, 0x3F, 0x00, 0x00, 0x38, 0x00,
+ 0x00, 0x32, 0x00, 0x00, 0x2B, 0x00, 0x00, 0x25,
+ 0x00, 0x00, 0x1F, 0x00, 0x00
+};
+
+static const ByteProvider k1SpecialPalette21DOSCDProvider = { ARRAYSIZE(k1SpecialPalette21DOSCD), k1SpecialPalette21DOSCD };
+
+static const byte k1SpecialPalette22DOSCD[21] = {
+ 0x1F, 0x1F, 0x0C, 0x3F, 0x3F, 0x21, 0x3B, 0x3B,
+ 0x1F, 0x37, 0x37, 0x1D, 0x34, 0x34, 0x1B, 0x30,
+ 0x30, 0x19, 0x2D, 0x2D, 0x17
+};
+
+static const ByteProvider k1SpecialPalette22DOSCDProvider = { ARRAYSIZE(k1SpecialPalette22DOSCD), k1SpecialPalette22DOSCD };
+
+static const byte k1SpecialPalette23DOSCD[21] = {
+ 0x1F, 0x1F, 0x00, 0x3F, 0x3F, 0x00, 0x3B, 0x3B,
+ 0x00, 0x37, 0x37, 0x00, 0x34, 0x34, 0x00, 0x30,
+ 0x30, 0x00, 0x2D, 0x2D, 0x00
+};
+
+static const ByteProvider k1SpecialPalette23DOSCDProvider = { ARRAYSIZE(k1SpecialPalette23DOSCD), k1SpecialPalette23DOSCD };
+
+static const byte k1SpecialPalette24DOSCD[48] = {
+ 0x36, 0x38, 0x2C, 0x31, 0x38, 0x23, 0x2A, 0x33,
+ 0x1E, 0x24, 0x2F, 0x1A, 0x1E, 0x2A, 0x16, 0x18,
+ 0x26, 0x13, 0x13, 0x21, 0x0F, 0x0E, 0x1D, 0x0D,
+ 0x0D, 0x1B, 0x0C, 0x0A, 0x19, 0x0A, 0x0A, 0x18,
+ 0x0A, 0x08, 0x17, 0x08, 0x08, 0x16, 0x08, 0x08,
+ 0x15, 0x06, 0x06, 0x14, 0x06, 0x06, 0x11, 0x06
+};
+
+static const ByteProvider k1SpecialPalette24DOSCDProvider = { ARRAYSIZE(k1SpecialPalette24DOSCD), k1SpecialPalette24DOSCD };
+
+static const byte k1SpecialPalette25DOSCD[48] = {
+ 0x36, 0x38, 0x2C, 0x31, 0x36, 0x23, 0x2A, 0x33,
+ 0x1E, 0x24, 0x2F, 0x1A, 0x1E, 0x2A, 0x16, 0x1E,
+ 0x2A, 0x16, 0x18, 0x26, 0x13, 0x13, 0x21, 0x0F,
+ 0x0E, 0x1D, 0x0D, 0x0D, 0x1B, 0x0C, 0x0D, 0x1B,
+ 0x0C, 0x0A, 0x19, 0x0A, 0x0A, 0x18, 0x0A, 0x0A,
+ 0x18, 0x0A, 0x0A, 0x18, 0x0A, 0x06, 0x14, 0x06
+};
+
+static const ByteProvider k1SpecialPalette25DOSCDProvider = { ARRAYSIZE(k1SpecialPalette25DOSCD), k1SpecialPalette25DOSCD };
+
+static const byte k1SpecialPalette26DOSCD[48] = {
+ 0x31, 0x38, 0x23, 0x31, 0x38, 0x23, 0x2A, 0x33,
+ 0x1E, 0x24, 0x2F, 0x1A, 0x19, 0x2A, 0x16, 0x18,
+ 0x26, 0x13, 0x13, 0x21, 0x0F, 0x13, 0x21, 0x11,
+ 0x13, 0x21, 0x0F, 0x0E, 0x1D, 0x0D, 0x0E, 0x1D,
+ 0x0D, 0x0E, 0x1D, 0x0D, 0x0D, 0x1B, 0x0C, 0x0A,
+ 0x19, 0x0A, 0x0A, 0x19, 0x0A, 0x06, 0x13, 0x06
+};
+
+static const ByteProvider k1SpecialPalette26DOSCDProvider = { ARRAYSIZE(k1SpecialPalette26DOSCD), k1SpecialPalette26DOSCD };
+
+static const byte k1SpecialPalette27DOSCD[48] = {
+ 0x31, 0x38, 0x23, 0x31, 0x38, 0x23, 0x2A, 0x33,
+ 0x1E, 0x24, 0x2F, 0x1A, 0x19, 0x2A, 0x16, 0x18,
+ 0x26, 0x13, 0x13, 0x21, 0x0F, 0x13, 0x21, 0x0F,
+ 0x13, 0x21, 0x0F, 0x0E, 0x1D, 0x0D, 0x0E, 0x1D,
+ 0x0D, 0x0E, 0x1D, 0x0D, 0x0D, 0x1B, 0x0C, 0x0D,
+ 0x19, 0x0C, 0x0D, 0x19, 0x0C, 0x08, 0x16, 0x08
+};
+
+static const ByteProvider k1SpecialPalette27DOSCDProvider = { ARRAYSIZE(k1SpecialPalette27DOSCD), k1SpecialPalette27DOSCD };
+
+static const byte k1SpecialPalette28DOSCD[48] = {
+ 0x36, 0x38, 0x2C, 0x31, 0x38, 0x23, 0x2A, 0x33,
+ 0x1E, 0x24, 0x2F, 0x1A, 0x19, 0x2A, 0x16, 0x1E,
+ 0x2A, 0x16, 0x18, 0x26, 0x13, 0x13, 0x21, 0x0F,
+ 0x13, 0x21, 0x0F, 0x13, 0x21, 0x0F, 0x13, 0x21,
+ 0x0F, 0x0E, 0x1D, 0x0D, 0x0D, 0x1B, 0x0C, 0x0D,
+ 0x1B, 0x0C, 0x0D, 0x1B, 0x0C, 0x08, 0x17, 0x08
+};
+
+static const ByteProvider k1SpecialPalette28DOSCDProvider = { ARRAYSIZE(k1SpecialPalette28DOSCD), k1SpecialPalette28DOSCD };
+
+static const byte k1SpecialPalette29DOSCD[48] = {
+ 0x36, 0x38, 0x2C, 0x31, 0x38, 0x23, 0x2A, 0x33,
+ 0x1E, 0x24, 0x2F, 0x1A, 0x19, 0x2A, 0x16, 0x1E,
+ 0x2A, 0x16, 0x18, 0x26, 0x13, 0x13, 0x21, 0x0F,
+ 0x13, 0x21, 0x0F, 0x13, 0x21, 0x0F, 0x13, 0x21,
+ 0x0F, 0x13, 0x21, 0x0F, 0x0E, 0x1D, 0x0D, 0x0E,
+ 0x1D, 0x0D, 0x0E, 0x1D, 0x0D, 0x08, 0x17, 0x08
+};
+
+static const ByteProvider k1SpecialPalette29DOSCDProvider = { ARRAYSIZE(k1SpecialPalette29DOSCD), k1SpecialPalette29DOSCD };
+
+static const byte k1SpecialPalette30DOSCD[60] = {
+ 0x1E, 0x1D, 0x3F, 0x1A, 0x19, 0x3F, 0x14, 0x12,
+ 0x3B, 0x12, 0x11, 0x37, 0x11, 0x11, 0x33, 0x0F,
+ 0x0E, 0x2F, 0x0E, 0x0D, 0x2C, 0x0D, 0x0C, 0x28,
+ 0x0B, 0x0B, 0x24, 0x0A, 0x0A, 0x20, 0x0A, 0x0A,
+ 0x1D, 0x05, 0x05, 0x18, 0x03, 0x03, 0x13, 0x01,
+ 0x01, 0x11, 0x00, 0x00, 0x0A, 0x00, 0x00, 0x05,
+ 0x00, 0x0A, 0x1A, 0x00, 0x0F, 0x13, 0x00, 0x14,
+ 0x11, 0x0F, 0x0D, 0x00
+};
+
+static const ByteProvider k1SpecialPalette30DOSCDProvider = { ARRAYSIZE(k1SpecialPalette30DOSCD), k1SpecialPalette30DOSCD };
+
+static const byte k1SpecialPalette31DOSCD[39] = {
+ 0x2B, 0x19, 0x34, 0x27, 0x17, 0x30, 0x23, 0x14,
+ 0x2C, 0x20, 0x12, 0x27, 0x1C, 0x11, 0x23, 0x18,
+ 0x0E, 0x1E, 0x15, 0x0C, 0x1A, 0x11, 0x0A, 0x15,
+ 0x0E, 0x08, 0x11, 0x0A, 0x05, 0x0C, 0x06, 0x03,
+ 0x08, 0x03, 0x01, 0x03, 0x00, 0x00, 0x00
+};
+
+static const ByteProvider k1SpecialPalette31DOSCDProvider = { ARRAYSIZE(k1SpecialPalette31DOSCD), k1SpecialPalette31DOSCD };
+
+static const byte k1SpecialPalette32DOSCD[39] = {
+ 0x12, 0x12, 0x16, 0x11, 0x11, 0x14, 0x0F, 0x0F,
+ 0x12, 0x0D, 0x0D, 0x11, 0x0B, 0x0B, 0x0E, 0x0A,
+ 0x0A, 0x0C, 0x08, 0x08, 0x0A, 0x08, 0x08, 0x08,
+ 0x05, 0x05, 0x06, 0x05, 0x05, 0x05, 0x03, 0x03,
+ 0x03, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00
+};
+
+static const ByteProvider k1SpecialPalette32DOSCDProvider = { ARRAYSIZE(k1SpecialPalette32DOSCD), k1SpecialPalette32DOSCD };
+
+static const byte k1SpecialPalette33DOSCD[60] = {
+ 0x3F, 0x3D, 0x2F, 0x3F, 0x3D, 0x29, 0x3F, 0x3D,
+ 0x23, 0x3F, 0x3D, 0x1D, 0x3F, 0x3B, 0x17, 0x3F,
+ 0x3B, 0x11, 0x3F, 0x3B, 0x0B, 0x3F, 0x3B, 0x05,
+ 0x3F, 0x3B, 0x00, 0x3D, 0x38, 0x00, 0x3B, 0x34,
+ 0x00, 0x39, 0x33, 0x00, 0x39, 0x30, 0x00, 0x37,
+ 0x2D, 0x00, 0x36, 0x2B, 0x00, 0x34, 0x28, 0x00,
+ 0x33, 0x26, 0x00, 0x32, 0x24, 0x00, 0x30, 0x22,
+ 0x00, 0x2F, 0x20, 0x00
+};
+
+static const ByteProvider k1SpecialPalette33DOSCDProvider = { ARRAYSIZE(k1SpecialPalette33DOSCD), k1SpecialPalette33DOSCD };
+
+static const Shape k1Healing1ShapesDOSCD[22] = {
+ { 8, 0, 0, 3, 48, -12, -48 },
+ { 8, 3, 0, 3, 48, -12, -48 },
+ { 8, 6, 0, 3, 48, -12, -48 },
+ { 8, 9, 0, 3, 48, -12, -48 },
+ { 8, 12, 0, 3, 48, -12, -48 },
+ { 8, 15, 0, 3, 48, -12, -48 },
+ { 8, 18, 0, 3, 48, -12, -48 },
+ { 8, 21, 0, 3, 48, -12, -48 },
+ { 8, 24, 0, 3, 48, -12, -48 },
+ { 8, 27, 0, 3, 48, -12, -48 },
+ { 8, 30, 0, 3, 48, -12, -48 },
+ { 8, 33, 0, 3, 48, -12, -48 },
+ { 8, 0, 48, 3, 48, -12, -48 },
+ { 8, 3, 48, 3, 48, -12, -48 },
+ { 8, 6, 48, 3, 48, -12, -48 },
+ { 8, 9, 48, 3, 48, -12, -48 },
+ { 8, 12, 48, 3, 48, -12, -48 },
+ { 8, 15, 48, 3, 48, -12, -48 },
+ { 8, 18, 48, 3, 48, -12, -48 },
+ { 8, 21, 48, 3, 48, -12, -48 },
+ { 8, 24, 48, 3, 48, -12, -48 },
+ { 8, 27, 48, 3, 48, -12, -48 }
+};
+
+static const ShapeProvider k1Healing1ShapesDOSCDProvider = { ARRAYSIZE(k1Healing1ShapesDOSCD), k1Healing1ShapesDOSCD };
+
+static const Shape k1Healing2ShapesDOSCD[30] = {
+ { 9, 0, 0, 3, 48, -11, -48 },
+ { 9, 3, 0, 3, 48, -11, -48 },
+ { 9, 6, 0, 3, 48, -11, -48 },
+ { 9, 9, 0, 3, 48, -11, -48 },
+ { 9, 12, 0, 3, 48, -11, -48 },
+ { 9, 15, 0, 3, 48, -11, -48 },
+ { 9, 18, 0, 3, 48, -11, -48 },
+ { 9, 21, 0, 3, 48, -11, -48 },
+ { 9, 24, 0, 3, 48, -11, -48 },
+ { 9, 27, 0, 3, 48, -11, -48 },
+ { 9, 30, 0, 3, 48, -11, -48 },
+ { 9, 33, 0, 3, 48, -11, -48 },
+ { 9, 0, 48, 3, 48, -11, -48 },
+ { 9, 3, 48, 3, 48, -11, -48 },
+ { 9, 6, 48, 3, 48, -11, -48 },
+ { 9, 9, 48, 3, 48, -11, -48 },
+ { 9, 12, 48, 3, 48, -11, -48 },
+ { 9, 15, 48, 3, 48, -11, -48 },
+ { 9, 18, 48, 3, 48, -11, -48 },
+ { 9, 21, 48, 3, 48, -11, -48 },
+ { 9, 24, 48, 3, 48, -11, -48 },
+ { 9, 27, 48, 3, 48, -11, -48 },
+ { 9, 30, 48, 3, 48, -11, -48 },
+ { 9, 33, 48, 3, 48, -11, -48 },
+ { 9, 0, 96, 3, 48, -11, -48 },
+ { 9, 3, 96, 3, 48, -11, -48 },
+ { 9, 6, 96, 3, 48, -11, -48 },
+ { 9, 9, 96, 3, 48, -11, -48 },
+ { 9, 12, 96, 3, 48, -11, -48 },
+ { 9, 15, 96, 3, 48, -11, -48 }
+};
+
+static const ShapeProvider k1Healing2ShapesDOSCDProvider = { ARRAYSIZE(k1Healing2ShapesDOSCD), k1Healing2ShapesDOSCD };
+
+static const Shape k1PoisonDeathShapesDOSCD[20] = {
+ { 19, 0, 0, 8, 48, -31, -48 },
+ { 19, 8, 0, 8, 48, -31, -48 },
+ { 19, 16, 0, 8, 48, -31, -48 },
+ { 19, 24, 0, 8, 48, -31, -48 },
+ { 19, 32, 0, 8, 48, -31, -48 },
+ { 19, 0, 48, 8, 48, -31, -48 },
+ { 19, 8, 48, 8, 48, -31, -48 },
+ { 19, 16, 48, 8, 48, -31, -48 },
+ { 19, 24, 48, 8, 48, -31, -48 },
+ { 19, 32, 48, 8, 48, -31, -48 },
+ { 19, 0, 96, 8, 48, -31, -48 },
+ { 19, 8, 96, 8, 48, -31, -48 },
+ { 19, 16, 96, 8, 48, -31, -48 },
+ { 19, 24, 96, 8, 48, -31, -48 },
+ { 19, 32, 96, 8, 48, -31, -48 },
+ { 19, 0, 144, 8, 48, -31, -48 },
+ { 19, 8, 144, 8, 48, -31, -48 },
+ { 19, 16, 144, 8, 48, -31, -48 },
+ { 19, 24, 144, 8, 48, -31, -48 },
+ { 19, 32, 144, 8, 48, -31, -48 }
+};
+
+static const ShapeProvider k1PoisonDeathShapesDOSCDProvider = { ARRAYSIZE(k1PoisonDeathShapesDOSCD), k1PoisonDeathShapesDOSCD };
+
+static const Shape k1FluteShapesDOSCD[36] = {
+ { 13, 0, 0, 3, 75, -12, -75 },
+ { 13, 3, 0, 3, 75, -12, -75 },
+ { 13, 6, 0, 3, 75, -12, -75 },
+ { 13, 9, 0, 3, 75, -12, -75 },
+ { 13, 12, 0, 3, 75, -12, -75 },
+ { 13, 15, 0, 3, 75, -12, -75 },
+ { 13, 18, 0, 3, 75, -12, -75 },
+ { 13, 21, 0, 3, 75, -12, -75 },
+ { 13, 24, 0, 3, 75, -12, -75 },
+ { 13, 27, 0, 3, 75, -12, -75 },
+ { 13, 30, 0, 3, 75, -12, -75 },
+ { 13, 33, 0, 3, 75, -12, -75 },
+ { 13, 36, 75, 3, 75, -12, -75 },
+ { 13, 0, 75, 3, 75, -12, -75 },
+ { 13, 3, 75, 3, 75, -12, -75 },
+ { 13, 6, 75, 3, 75, -12, -75 },
+ { 13, 9, 75, 3, 75, -12, -75 },
+ { 13, 12, 75, 3, 75, -12, -75 },
+ { 13, 15, 75, 3, 75, -12, -75 },
+ { 13, 18, 75, 3, 75, -12, -75 },
+ { 13, 21, 75, 3, 75, -12, -75 },
+ { 13, 24, 75, 3, 75, -12, -75 },
+ { 13, 27, 75, 3, 75, -12, -75 },
+ { 13, 30, 75, 3, 75, -12, -75 },
+ { 13, 33, 75, 3, 75, -12, -75 },
+ { 13, 36, 75, 3, 75, -12, -75 },
+ { 14, 0, 0, 3, 75, -12, -75 },
+ { 14, 3, 0, 3, 75, -12, -75 },
+ { 14, 6, 0, 3, 75, -12, -75 },
+ { 14, 9, 0, 3, 75, -12, -75 },
+ { 14, 12, 0, 3, 75, -12, -75 },
+ { 14, 15, 0, 3, 75, -12, -75 },
+ { 14, 18, 0, 3, 75, -12, -75 },
+ { 14, 21, 0, 3, 75, -12, -75 },
+ { 14, 24, 0, 3, 75, -12, -75 },
+ { 14, 27, 0, 3, 75, -12, -75 }
+};
+
+static const ShapeProvider k1FluteShapesDOSCDProvider = { ARRAYSIZE(k1FluteShapesDOSCD), k1FluteShapesDOSCD };
+
+static const Shape k1Winter1ShapesDOSCD[7] = {
+ { 10, 5, 0, 5, 66, -20, -65 },
+ { 10, 10, 0, 5, 66, -20, -65 },
+ { 10, 15, 0, 5, 66, -20, -65 },
+ { 10, 20, 0, 5, 66, -20, -65 },
+ { 10, 25, 0, 5, 66, -20, -65 },
+ { 10, 30, 0, 5, 66, -20, -65 },
+ { 10, 35, 0, 5, 66, -20, -65 }
+};
+
+static const ShapeProvider k1Winter1ShapesDOSCDProvider = { ARRAYSIZE(k1Winter1ShapesDOSCD), k1Winter1ShapesDOSCD };
+
+static const Shape k1Winter2ShapesDOSCD[35] = {
+ { 10, 0, 66, 5, 66, -20, -65 },
+ { 10, 10, 66, 5, 66, -20, -65 },
+ { 10, 20, 66, 5, 66, -20, -65 },
+ { 10, 30, 66, 5, 66, -20, -65 },
+ { 10, 0, 132, 5, 66, -20, -65 },
+ { 10, 10, 132, 5, 66, -20, -65 },
+ { 10, 20, 132, 5, 66, -20, -65 },
+ { 10, 30, 132, 5, 66, -20, -65 },
+ { 11, 0, 0, 5, 66, -20, -65 },
+ { 11, 10, 0, 5, 66, -20, -65 },
+ { 11, 20, 0, 5, 66, -20, -65 },
+ { 11, 30, 0, 5, 66, -20, -65 },
+ { 11, 0, 66, 5, 66, -20, -65 },
+ { 11, 10, 66, 5, 66, -20, -65 },
+ { 11, 20, 66, 5, 66, -20, -65 },
+ { 11, 30, 66, 5, 66, -20, -65 },
+ { 11, 0, 132, 5, 66, -20, -65 },
+ { 11, 10, 132, 5, 66, -20, -65 },
+ { 0, 0, 0, 0, 0, 0, 0 },
+ { 0, 0, 0, 0, 0, 0, 0 },
+ { 0, 0, 0, 0, 0, 0, 0 },
+ { 0, 0, 0, 0, 0, 0, 0 },
+ { 0, 0, 0, 0, 0, 0, 0 },
+ { 0, 0, 0, 0, 0, 0, 0 },
+ { 0, 0, 0, 0, 0, 0, 0 },
+ { 0, 0, 0, 0, 0, 0, 0 },
+ { 0, 0, 0, 0, 0, 0, 0 },
+ { 0, 0, 0, 0, 0, 0, 0 },
+ { 0, 0, 0, 0, 0, 0, 0 },
+ { 0, 0, 0, 0, 0, 0, 0 },
+ { 0, 0, 0, 0, 0, 0, 0 },
+ { 0, 0, 0, 0, 0, 0, 0 },
+ { 0, 0, 0, 0, 0, 0, 0 },
+ { 0, 0, 0, 0, 0, 0, 0 },
+ { 0, 0, 0, 0, 0, 0, 0 }
+};
+
+static const ShapeProvider k1Winter2ShapesDOSCDProvider = { ARRAYSIZE(k1Winter2ShapesDOSCD), k1Winter2ShapesDOSCD };
+
+static const Shape k1Winter3ShapesDOSCD[4] = {
+ { 11, 15, 132, 5, 66, -20, -65 },
+ { 11, 20, 132, 5, 66, -20, -65 },
+ { 11, 25, 132, 5, 66, -20, -65 },
+ { 11, 30, 132, 5, 66, -20, -65 }
+};
+
+static const ShapeProvider k1Winter3ShapesDOSCDProvider = { ARRAYSIZE(k1Winter3ShapesDOSCD), k1Winter3ShapesDOSCD };
+
+static const Shape k1DrinkShapesDOSCD[15] = {
+ { 6, 0, 0, 4, 48, -20, -48 },
+ { 6, 4, 0, 4, 48, -20, -48 },
+ { 6, 8, 0, 4, 48, -20, -48 },
+ { 6, 12, 0, 4, 48, -20, -48 },
+ { 6, 16, 0, 4, 48, -20, -48 },
+ { 6, 20, 0, 5, 48, -20, -48 },
+ { 6, 0, 48, 5, 54, -20, -54 },
+ { 6, 5, 48, 5, 54, -20, -54 },
+ { 6, 10, 48, 5, 54, -20, -54 },
+ { 7, 0, 0, 3, 43, -12, -43 },
+ { 7, 3, 3, 2, 40, -8, -40 },
+ { 7, 5, 7, 2, 36, -8, -36 },
+ { 7, 7, 10, 2, 33, -8, -33 },
+ { 7, 9, 12, 2, 31, -8, -31 },
+ { 7, 11, 15, 2, 28, -8, -28 }
+};
+
+static const ShapeProvider k1DrinkShapesDOSCDProvider = { ARRAYSIZE(k1DrinkShapesDOSCD), k1DrinkShapesDOSCD };
+
+static const Shape k1WispShapesDOSCD[26] = {
+ { 12, 0, 0, 5, 48, -20, -48 },
+ { 12, 5, 0, 5, 48, -20, -48 },
+ { 12, 10, 0, 5, 48, -20, -48 },
+ { 12, 15, 0, 5, 48, -20, -48 },
+ { 12, 20, 0, 5, 48, -20, -48 },
+ { 12, 25, 0, 5, 48, -20, -48 },
+ { 12, 30, 0, 5, 48, -20, -48 },
+ { 12, 35, 0, 5, 48, -20, -48 },
+ { 12, 0, 48, 5, 48, -20, -48 },
+ { 12, 5, 48, 5, 48, -20, -48 },
+ { 12, 10, 48, 5, 48, -20, -48 },
+ { 12, 15, 48, 5, 48, -20, -48 },
+ { 12, 20, 48, 5, 48, -20, -48 },
+ { 12, 25, 48, 5, 48, -20, -48 },
+ { 12, 30, 48, 5, 48, -20, -48 },
+ { 12, 35, 48, 5, 48, -20, -48 },
+ { 12, 0, 96, 5, 29, -20, -42 },
+ { 12, 5, 96, 5, 29, -20, -42 },
+ { 12, 10, 96, 5, 29, -20, -42 },
+ { 12, 15, 96, 5, 29, -20, -42 },
+ { 12, 20, 96, 5, 29, -20, -42 },
+ { 12, 25, 96, 5, 29, -20, -42 },
+ { 12, 30, 96, 5, 29, -20, -42 },
+ { 12, 35, 96, 5, 29, -20, -42 },
+ { 12, 0, 125, 5, 29, -20, -42 },
+ { 12, 5, 125, 5, 29, -20, -42 }
+};
+
+static const ShapeProvider k1WispShapesDOSCDProvider = { ARRAYSIZE(k1WispShapesDOSCD), k1WispShapesDOSCD };
+
+static const Shape k1MagicAnimShapesDOSCD[5] = {
+ { 17, 0, 0, 8, 49, -32, -49 },
+ { 17, 8, 0, 8, 49, -32, -49 },
+ { 17, 16, 0, 8, 49, -32, -49 },
+ { 17, 24, 0, 8, 49, -32, -49 },
+ { 17, 32, 0, 8, 49, -32, -49 }
+};
+
+static const ShapeProvider k1MagicAnimShapesDOSCDProvider = { ARRAYSIZE(k1MagicAnimShapesDOSCD), k1MagicAnimShapesDOSCD };
+
+static const Shape k1BranStoneShapesDOSCD[15] = {
+ { 18, 0, 0, 5, 51, -20, -50 },
+ { 18, 5, 0, 5, 51, -20, -50 },
+ { 18, 10, 0, 5, 51, -20, -50 },
+ { 18, 15, 0, 5, 51, -20, -50 },
+ { 18, 20, 0, 5, 51, -20, -50 },
+ { 18, 25, 0, 5, 51, -20, -50 },
+ { 18, 30, 0, 5, 51, -20, -50 },
+ { 18, 35, 0, 5, 51, -20, -50 },
+ { 18, 0, 51, 5, 51, -20, -50 },
+ { 18, 5, 51, 5, 51, -20, -50 },
+ { 18, 10, 51, 5, 51, -20, -50 },
+ { 18, 15, 51, 5, 51, -20, -50 },
+ { 18, 20, 51, 5, 51, -20, -50 },
+ { 18, 25, 51, 5, 51, -20, -50 },
+ { 0, 0, 0, 0, 0, 0, 0 }
+};
+
+static const ShapeProvider k1BranStoneShapesDOSCDProvider = { ARRAYSIZE(k1BranStoneShapesDOSCD), k1BranStoneShapesDOSCD };
+
+static const byte k1OutroReunionSeqDOSCD[1509] = {
+ 0x23, 0x21, 0x1D, 0x00, 0x08, 0x01, 0x24, 0x20,
+ 0x24, 0x1D, 0x24, 0x1E, 0x24, 0x1F, 0x06, 0x01,
+ 0x00, 0x02, 0x08, 0x00, 0x50, 0x00, 0x22, 0x08,
+ 0x08, 0x00, 0x17, 0x0B, 0x00, 0x03, 0x08, 0x08,
+ 0x08, 0x00, 0x0C, 0x00, 0x09, 0x00, 0x22, 0x1D,
+ 0x13, 0x20, 0x5A, 0x00, 0x3A, 0x02, 0x02, 0x08,
+ 0x0D, 0x50, 0x00, 0x22, 0x08, 0x10, 0x00, 0x02,
+ 0x08, 0x0E, 0x50, 0x00, 0x22, 0x08, 0x10, 0x00,
+ 0x02, 0x08, 0x0C, 0x50, 0x00, 0x22, 0x08, 0x10,
+ 0x00, 0x02, 0x08, 0x0B, 0x50, 0x00, 0x22, 0x08,
+ 0x10, 0x00, 0x02, 0x08, 0x0C, 0x50, 0x00, 0x22,
+ 0x08, 0x10, 0x00, 0x02, 0x08, 0x0D, 0x50, 0x00,
+ 0x22, 0x08, 0x10, 0x00, 0x02, 0x08, 0x0E, 0x50,
+ 0x00, 0x22, 0x08, 0x10, 0x00, 0x0B, 0x01, 0x03,
+ 0x08, 0x08, 0x08, 0x00, 0x0C, 0x01, 0x04, 0x00,
+ 0x22, 0x1E, 0x13, 0x21, 0x5A, 0x00, 0x3A, 0x02,
+ 0x0B, 0x02, 0x02, 0x08, 0x14, 0x50, 0x00, 0x22,
+ 0x08, 0x08, 0x00, 0x03, 0x08, 0x08, 0x08, 0x00,
+ 0x03, 0x08, 0x08, 0x08, 0x00, 0x03, 0x08, 0x08,
+ 0x08, 0x00, 0x03, 0x08, 0x08, 0x08, 0x00, 0x0C,
+ 0x02, 0x01, 0x00, 0x03, 0x08, 0x08, 0x08, 0x00,
+ 0x03, 0x08, 0x08, 0x08, 0x00, 0x03, 0x08, 0x08,
+ 0x08, 0x00, 0x22, 0x1F, 0x13, 0x22, 0x5A, 0x00,
+ 0x3A, 0x02, 0x0B, 0x03, 0x03, 0x08, 0x08, 0x08,
+ 0x00, 0x0C, 0x03, 0x0B, 0x00, 0x22, 0x20, 0x13,
+ 0x23, 0x78, 0x00, 0x3A, 0x0F, 0x0B, 0x03, 0x03,
+ 0x08, 0x08, 0x08, 0x00, 0x0C, 0x03, 0x05, 0x00,
+ 0x07, 0x28, 0x00, 0x02, 0x08, 0x2E, 0x50, 0x00,
+ 0x22, 0x08, 0x10, 0x00, 0x02, 0x08, 0x2D, 0x50,
+ 0x00, 0x22, 0x08, 0x10, 0x00, 0x02, 0x08, 0x2E,
+ 0x50, 0x00, 0x22, 0x08, 0x10, 0x00, 0x02, 0x08,
+ 0x2D, 0x50, 0x00, 0x22, 0x08, 0x10, 0x00, 0x02,
+ 0x08, 0x2E, 0x50, 0x00, 0x22, 0x08, 0x10, 0x00,
+ 0x02, 0x08, 0x2D, 0x50, 0x00, 0x22, 0x08, 0x10,
+ 0x00, 0x02, 0x08, 0x2F, 0x50, 0x00, 0x22, 0x08,
+ 0x08, 0x00, 0x02, 0x08, 0x30, 0x50, 0x00, 0x22,
+ 0x08, 0x08, 0x00, 0x02, 0x08, 0x31, 0x50, 0x00,
+ 0x22, 0x08, 0x08, 0x00, 0x02, 0x08, 0x32, 0x50,
+ 0x00, 0x22, 0x08, 0x08, 0x00, 0x06, 0x0A, 0x00,
+ 0x22, 0x21, 0x13, 0x24, 0x5A, 0x00, 0x3A, 0x02,
+ 0x02, 0x08, 0x33, 0x50, 0x00, 0x22, 0x08, 0x08,
+ 0x00, 0x02, 0x08, 0x34, 0x50, 0x00, 0x22, 0x08,
+ 0x08, 0x00, 0x02, 0x08, 0x35, 0x50, 0x00, 0x22,
+ 0x08, 0x08, 0x00, 0x02, 0x08, 0x36, 0x50, 0x00,
+ 0x22, 0x08, 0x08, 0x00, 0x02, 0x08, 0x37, 0x50,
+ 0x00, 0x22, 0x08, 0x08, 0x00, 0x02, 0x08, 0x35,
+ 0x50, 0x00, 0x22, 0x08, 0x08, 0x00, 0x02, 0x08,
+ 0x34, 0x50, 0x00, 0x22, 0x08, 0x08, 0x00, 0x02,
+ 0x08, 0x33, 0x50, 0x00, 0x22, 0x08, 0x08, 0x00,
+ 0x02, 0x08, 0x35, 0x50, 0x00, 0x22, 0x08, 0x08,
+ 0x00, 0x02, 0x08, 0x36, 0x50, 0x00, 0x22, 0x08,
+ 0x08, 0x00, 0x02, 0x08, 0x37, 0x50, 0x00, 0x22,
+ 0x08, 0x08, 0x00, 0x07, 0x0A, 0x00, 0x22, 0x22,
+ 0x13, 0x25, 0x5A, 0x00, 0x3A, 0x02, 0x02, 0x08,
+ 0x33, 0x50, 0x00, 0x22, 0x08, 0x08, 0x00, 0x02,
+ 0x08, 0x34, 0x50, 0x00, 0x22, 0x08, 0x08, 0x00,
+ 0x02, 0x08, 0x35, 0x50, 0x00, 0x22, 0x08, 0x08,
+ 0x00, 0x02, 0x08, 0x36, 0x50, 0x00, 0x22, 0x08,
+ 0x08, 0x00, 0x02, 0x08, 0x37, 0x50, 0x00, 0x22,
+ 0x08, 0x08, 0x00, 0x02, 0x08, 0x35, 0x50, 0x00,
+ 0x22, 0x08, 0x08, 0x00, 0x02, 0x08, 0x34, 0x50,
+ 0x00, 0x22, 0x08, 0x08, 0x00, 0x02, 0x08, 0x33,
+ 0x50, 0x00, 0x22, 0x08, 0x08, 0x00, 0x02, 0x08,
+ 0x35, 0x50, 0x00, 0x22, 0x08, 0x08, 0x00, 0x02,
+ 0x08, 0x36, 0x50, 0x00, 0x22, 0x08, 0x08, 0x00,
+ 0x02, 0x08, 0x37, 0x50, 0x00, 0x22, 0x08, 0x08,
+ 0x00, 0x07, 0x1E, 0x00, 0x22, 0x23, 0x13, 0x26,
+ 0x78, 0x00, 0x3A, 0x0F, 0x02, 0x08, 0x38, 0x50,
+ 0x00, 0x22, 0x08, 0x08, 0x00, 0x02, 0x08, 0x39,
+ 0x50, 0x00, 0x22, 0x08, 0x08, 0x00, 0x02, 0x08,
+ 0x3A, 0x50, 0x00, 0x22, 0x08, 0x08, 0x00, 0x02,
+ 0x08, 0x38, 0x50, 0x00, 0x22, 0x08, 0x08, 0x00,
+ 0x02, 0x08, 0x3B, 0x50, 0x00, 0x22, 0x08, 0x08,
+ 0x00, 0x07, 0x0A, 0x00, 0x02, 0x08, 0x39, 0x50,
+ 0x00, 0x22, 0x08, 0x08, 0x00, 0x02, 0x08, 0x38,
+ 0x50, 0x00, 0x22, 0x08, 0x08, 0x00, 0x02, 0x08,
+ 0x39, 0x50, 0x00, 0x22, 0x08, 0x08, 0x00, 0x02,
+ 0x08, 0x3A, 0x50, 0x00, 0x22, 0x08, 0x08, 0x00,
+ 0x07, 0x3C, 0x00, 0x14, 0x02, 0x08, 0x33, 0x50,
+ 0x00, 0x22, 0x08, 0x08, 0x00, 0x02, 0x08, 0x32,
+ 0x50, 0x00, 0x22, 0x08, 0x08, 0x00, 0x02, 0x08,
+ 0x31, 0x50, 0x00, 0x22, 0x08, 0x08, 0x00, 0x02,
+ 0x08, 0x30, 0x50, 0x00, 0x22, 0x08, 0x08, 0x00,
+ 0x02, 0x08, 0x2F, 0x50, 0x00, 0x22, 0x08, 0x08,
+ 0x00, 0x02, 0x08, 0x2E, 0x50, 0x00, 0x22, 0x08,
+ 0x08, 0x00, 0x02, 0x08, 0x2D, 0x50, 0x00, 0x22,
+ 0x08, 0x08, 0x00, 0x07, 0x1E, 0x00, 0x02, 0x08,
+ 0x2E, 0x50, 0x00, 0x22, 0x08, 0x08, 0x00, 0x02,
+ 0x08, 0x2F, 0x50, 0x00, 0x22, 0x08, 0x08, 0x00,
+ 0x02, 0x08, 0x30, 0x50, 0x00, 0x22, 0x08, 0x08,
+ 0x00, 0x02, 0x08, 0x31, 0x50, 0x00, 0x22, 0x08,
+ 0x08, 0x00, 0x02, 0x08, 0x32, 0x50, 0x00, 0x22,
+ 0x08, 0x08, 0x00, 0x02, 0x08, 0x33, 0x50, 0x00,
+ 0x22, 0x08, 0x08, 0x00, 0x02, 0x08, 0x41, 0x50,
+ 0x00, 0x22, 0x08, 0x08, 0x00, 0x02, 0x08, 0x42,
+ 0x50, 0x00, 0x22, 0x08, 0x08, 0x00, 0x02, 0x08,
+ 0x43, 0x50, 0x00, 0x22, 0x08, 0x08, 0x00, 0x02,
+ 0x08, 0x44, 0x50, 0x00, 0x22, 0x08, 0x08, 0x00,
+ 0x02, 0x08, 0x45, 0x50, 0x00, 0x22, 0x08, 0x08,
+ 0x00, 0x02, 0x08, 0x46, 0x50, 0x00, 0x22, 0x08,
+ 0x08, 0x00, 0x07, 0x0A, 0x00, 0x22, 0x24, 0x13,
+ 0x27, 0x78, 0x00, 0x3A, 0x0F, 0x0B, 0x05, 0x02,
+ 0x08, 0x59, 0x50, 0x00, 0x22, 0x08, 0x08, 0x00,
+ 0x02, 0x08, 0x5A, 0x50, 0x00, 0x22, 0x08, 0x08,
+ 0x00, 0x02, 0x08, 0x5B, 0x50, 0x00, 0x22, 0x08,
+ 0x08, 0x00, 0x02, 0x08, 0x5C, 0x50, 0x00, 0x22,
+ 0x08, 0x08, 0x00, 0x02, 0x08, 0x5D, 0x50, 0x00,
+ 0x22, 0x08, 0x08, 0x00, 0x0D, 0x05, 0x01, 0x00,
+ 0x02, 0x08, 0x5C, 0x50, 0x00, 0x22, 0x08, 0x08,
+ 0x00, 0x06, 0x28, 0x00, 0x24, 0x25, 0x02, 0x08,
+ 0x4E, 0x50, 0x00, 0x22, 0x08, 0x08, 0x00, 0x02,
+ 0x08, 0x4F, 0x50, 0x00, 0x22, 0x08, 0x08, 0x00,
+ 0x22, 0x25, 0x13, 0x28, 0x5A, 0x00, 0x3A, 0x02,
+ 0x02, 0x08, 0x50, 0x50, 0x00, 0x22, 0x08, 0x08,
+ 0x00, 0x02, 0x08, 0x51, 0x50, 0x00, 0x22, 0x08,
+ 0x08, 0x00, 0x02, 0x08, 0x55, 0x50, 0x00, 0x22,
+ 0x08, 0x08, 0x00, 0x07, 0x3C, 0x00, 0x22, 0x26,
+ 0x13, 0x29, 0x78, 0x00, 0x3A, 0x0F, 0x0B, 0x06,
+ 0x02, 0x08, 0x59, 0x50, 0x00, 0x22, 0x08, 0x08,
+ 0x00, 0x02, 0x08, 0x5A, 0x50, 0x00, 0x22, 0x08,
+ 0x08, 0x00, 0x02, 0x08, 0x5B, 0x50, 0x00, 0x22,
+ 0x08, 0x08, 0x00, 0x02, 0x08, 0x5C, 0x50, 0x00,
+ 0x22, 0x08, 0x08, 0x00, 0x0C, 0x06, 0x02, 0x00,
+ 0x07, 0x1E, 0x00, 0x22, 0x27, 0x13, 0x2A, 0x78,
+ 0x00, 0x3A, 0x0F, 0x0B, 0x06, 0x02, 0x08, 0x59,
+ 0x50, 0x00, 0x22, 0x08, 0x08, 0x00, 0x02, 0x08,
+ 0x5A, 0x50, 0x00, 0x22, 0x08, 0x08, 0x00, 0x02,
+ 0x08, 0x5B, 0x50, 0x00, 0x22, 0x08, 0x08, 0x00,
+ 0x02, 0x08, 0x5C, 0x50, 0x00, 0x22, 0x08, 0x08,
+ 0x00, 0x0C, 0x06, 0x02, 0x00, 0x02, 0x08, 0x5E,
+ 0x50, 0x00, 0x22, 0x08, 0x10, 0x00, 0x02, 0x08,
+ 0x63, 0x50, 0x00, 0x22, 0x08, 0x10, 0x00, 0x07,
+ 0x3C, 0x00, 0x24, 0x28, 0x14, 0x1B, 0x69, 0x02,
+ 0x08, 0x64, 0x50, 0x00, 0x22, 0x08, 0x10, 0x00,
+ 0x02, 0x08, 0x65, 0x50, 0x00, 0x22, 0x08, 0x10,
+ 0x00, 0x1B, 0x74, 0x02, 0x08, 0x66, 0x50, 0x00,
+ 0x22, 0x08, 0x10, 0x00, 0x02, 0x08, 0x67, 0x50,
+ 0x00, 0x22, 0x08, 0x10, 0x00, 0x1B, 0x75, 0x02,
+ 0x08, 0x68, 0x50, 0x00, 0x22, 0x08, 0x10, 0x00,
+ 0x02, 0x08, 0x69, 0x50, 0x00, 0x22, 0x08, 0x10,
+ 0x00, 0x02, 0x08, 0x6C, 0x50, 0x00, 0x22, 0x08,
+ 0x01, 0x00, 0x22, 0x28, 0x13, 0x2B, 0x96, 0x00,
+ 0x1C, 0x22, 0x0B, 0x06, 0x0E, 0x28, 0x02, 0x08,
+ 0x69, 0x50, 0x00, 0x22, 0x08, 0x06, 0x00, 0x0E,
+ 0x28, 0x02, 0x08, 0x6A, 0x50, 0x00, 0x22, 0x08,
+ 0x06, 0x00, 0x0E, 0x28, 0x02, 0x08, 0x6B, 0x50,
+ 0x00, 0x22, 0x08, 0x06, 0x00, 0x0E, 0x28, 0x02,
+ 0x08, 0x6C, 0x50, 0x00, 0x22, 0x08, 0x06, 0x00,
+ 0x0E, 0x28, 0x02, 0x08, 0x6D, 0x50, 0x00, 0x22,
+ 0x08, 0x06, 0x00, 0x0E, 0x28, 0x02, 0x08, 0x6E,
+ 0x50, 0x00, 0x22, 0x08, 0x06, 0x00, 0x0E, 0x28,
+ 0x02, 0x08, 0x6F, 0x50, 0x00, 0x22, 0x08, 0x06,
+ 0x00, 0x0E, 0x28, 0x02, 0x08, 0x70, 0x50, 0x00,
+ 0x22, 0x08, 0x06, 0x00, 0x0E, 0x28, 0x02, 0x08,
+ 0x71, 0x50, 0x00, 0x22, 0x08, 0x06, 0x00, 0x0D,
+ 0x06, 0x02, 0x00, 0x0E, 0x00, 0x02, 0x08, 0x6C,
+ 0x50, 0x00, 0x22, 0x08, 0x05, 0x00, 0x06, 0x1E,
+ 0x00, 0x22, 0x29, 0x13, 0x2C, 0x96, 0x00, 0x1C,
+ 0x22, 0x0E, 0x00, 0x0B, 0x06, 0x0E, 0x32, 0x02,
+ 0x08, 0x6B, 0x50, 0x00, 0x22, 0x08, 0x06, 0x00,
+ 0x0E, 0x32, 0x02, 0x08, 0x6C, 0x50, 0x00, 0x22,
+ 0x08, 0x06, 0x00, 0x0E, 0x32, 0x02, 0x08, 0x6D,
+ 0x50, 0x00, 0x22, 0x08, 0x06, 0x00, 0x0E, 0x32,
+ 0x02, 0x08, 0x6E, 0x50, 0x00, 0x22, 0x08, 0x06,
+ 0x00, 0x0E, 0x32, 0x02, 0x08, 0x6F, 0x50, 0x00,
+ 0x22, 0x08, 0x06, 0x00, 0x0E, 0x32, 0x02, 0x08,
+ 0x70, 0x50, 0x00, 0x22, 0x08, 0x06, 0x00, 0x0E,
+ 0x32, 0x02, 0x08, 0x71, 0x50, 0x00, 0x22, 0x08,
+ 0x06, 0x00, 0x0D, 0x06, 0x02, 0x00, 0x0E, 0x00,
+ 0x02, 0x08, 0x6C, 0x50, 0x00, 0x22, 0x08, 0x06,
+ 0x00, 0x06, 0x1E, 0x00, 0x22, 0x2A, 0x13, 0x2D,
+ 0x96, 0x00, 0x1C, 0x22, 0x0E, 0x00, 0x0B, 0x06,
+ 0x0E, 0x32, 0x02, 0x08, 0x6B, 0x50, 0x00, 0x22,
+ 0x08, 0x06, 0x00, 0x0E, 0x32, 0x02, 0x08, 0x6C,
+ 0x50, 0x00, 0x22, 0x08, 0x06, 0x00, 0x0E, 0x32,
+ 0x02, 0x08, 0x6D, 0x50, 0x00, 0x22, 0x08, 0x06,
+ 0x00, 0x0E, 0x32, 0x02, 0x08, 0x6E, 0x50, 0x00,
+ 0x22, 0x08, 0x06, 0x00, 0x0E, 0x32, 0x02, 0x08,
+ 0x6F, 0x50, 0x00, 0x22, 0x08, 0x06, 0x00, 0x0E,
+ 0x32, 0x02, 0x08, 0x70, 0x50, 0x00, 0x22, 0x08,
+ 0x06, 0x00, 0x0E, 0x32, 0x02, 0x08, 0x71, 0x50,
+ 0x00, 0x22, 0x08, 0x06, 0x00, 0x0D, 0x06, 0x01,
+ 0x00, 0x0E, 0x00, 0x06, 0x1E, 0x00, 0x02, 0x08,
+ 0x72, 0x50, 0x00, 0x22, 0x08, 0x10, 0x00, 0x02,
+ 0x08, 0x73, 0x50, 0x00, 0x22, 0x08, 0x10, 0x00,
+ 0x07, 0x14, 0x00, 0x02, 0x08, 0x74, 0x50, 0x00,
+ 0x22, 0x08, 0x10, 0x00, 0x02, 0x08, 0x75, 0x50,
+ 0x00, 0x22, 0x08, 0x10, 0x00, 0x07, 0x78, 0x00,
+ 0x16, 0x11, 0x01, 0x08, 0x20
+};
+
+static const ByteProvider k1OutroReunionSeqDOSCDProvider = { ARRAYSIZE(k1OutroReunionSeqDOSCD), k1OutroReunionSeqDOSCD };
+
+static const char *const k1AudioTracksDOSCD[8] = {
+ "KYRA1A",
+ "KYRA1B",
+ "KYRA2A",
+ "KYRA3A",
+ "KYRA4A",
+ "KYRA4B",
+ "KYRA5A",
+ "KYRA5B"
+};
+
+static const StringListProvider k1AudioTracksDOSCDProvider = { ARRAYSIZE(k1AudioTracksDOSCD), k1AudioTracksDOSCD };
+
+static const char *const k1AudioTracks2DOSCD[1] = {
+ "kyramisc"
+};
+
+static const StringListProvider k1AudioTracks2DOSCDProvider = { ARRAYSIZE(k1AudioTracks2DOSCD), k1AudioTracks2DOSCD };
+
+static const char *const k1AudioTracksIntroDOSCD[2] = {
+ "intro",
+ "intro"
+};
+
+static const StringListProvider k1AudioTracksIntroDOSCDProvider = { ARRAYSIZE(k1AudioTracksIntroDOSCD), k1AudioTracksIntroDOSCD };
+
diff --git a/devtools/create_kyradat/resources/lok_dos_cd_english.h b/devtools/create_kyradat/resources/lok_dos_cd_english.h
new file mode 100644
index 0000000000..af695470a3
--- /dev/null
+++ b/devtools/create_kyradat/resources/lok_dos_cd_english.h
@@ -0,0 +1,428 @@
+static const char *const k1IntroStringsDOSCDEnglish[51] = {
+ "This is a text test - 1",
+ "This is a text test - 2",
+ "Greetings, Kallak...",
+ "...Powerful leader of the Royal Mystics!",
+ "Did I frighten you?",
+ "Malcolm!",
+ "I heard yesterday of your escape.",
+ "And have expected you before now.",
+ "Why would I rush?",
+ "I rule this land!",
+ "Your puny curse restrains me naught.",
+ "So, slay me now!",
+ "I have little magic left.",
+ "I mean to harm you, have no doubt...",
+ "...Now you are stone...",
+ "...Yet I leave your eyes.",
+ "I shed no tears for Kyrandia...",
+ "...But cannot deny you yours.",
+ "Malcolm the Jester has broken free!",
+ "He now controls the Kyragem...",
+ "...source of all magic in Kyrandia!",
+ "",
+ "How dare you trip ME!",
+ "But no, something special for you...",
+ "A humorous hex!",
+ "But I shall give fair warning.",
+ "Don't jump on THAT tree!",
+ "Don't climb up THAT tree little squirrel!",
+ "Boo!",
+ "Tis funnier that way...",
+ "...Is it not?",
+ "Ha ha ha...",
+ "Aren't fingers wonderful?",
+ "It's great to be alive!",
+ "Brandon!",
+ "Grandfather! We did it!",
+ "No! YOU did it!",
+ "Long live King Brandon!",
+ "Long live the Royal Mystics!",
+ "Now, let's go put Kyrandia back together!",
+ "Good idea!",
+ "As my first Royal Proclamation...",
+ "I name sandals as the official footwear of Kyrandia!",
+ "Well done, Brandon!",
+ "The Land no longer weeps...",
+ "And your friends have been restored!",
+ "Dear Brynn...",
+ "Malcolm has broken free!",
+ "Soon he will come for me.",
+ "Please help Brandon...",
+ ""
+};
+
+static const StringListProvider k1IntroStringsDOSCDEnglishProvider = { ARRAYSIZE(k1IntroStringsDOSCDEnglish), k1IntroStringsDOSCDEnglish };
+
+static const char *const k1ItemNamesDOSCDEnglish[107] = {
+ "Garnet",
+ "Amethyst",
+ "Aquamarine",
+ "Diamond",
+ "Emerald",
+ "Pearl",
+ "Ruby",
+ "Peridot",
+ "Sapphire",
+ "Opal",
+ "Topaz",
+ "Onyx",
+ "Sunstone",
+ "Moonstone",
+ "Rainbowstone",
+ "Lodestone",
+ "Rose",
+ "Tulip",
+ "Orchid",
+ "Silver Rose",
+ "Silver Statuette",
+ "Silver Coin",
+ "Gold Coin",
+ "Gold Ring",
+ "Royal Chalice",
+ "Pinecone",
+ "Acorn",
+ "Walnut",
+ "Everglowing Fireberries",
+ "Fireberries",
+ "Fireberries",
+ "Fireberries",
+ "Fireberries",
+ "Fireberries",
+ "Fish",
+ "Fish Bone",
+ "Mutton Leg",
+ "Bone",
+ "Apple",
+ "Apple Core",
+ "Blueberries",
+ "Mushroom",
+ "Note",
+ "Marble",
+ "Saw",
+ "Ankh",
+ "Feather",
+ "Egg",
+ "Leaf",
+ "Shamrock",
+ "Fallen Star",
+ "Crystal Ball",
+ "Teardrop",
+ "Mirror",
+ "Ice Shard",
+ "Flute",
+ "Hourglass",
+ "Iron Key",
+ "Jade Key",
+ "Obsidion Key",
+ "Red Potion",
+ "Red Potion",
+ "Blue Potion",
+ "Blue Potion",
+ "Yellow Potion",
+ "Yellow Potion",
+ "Green Potion",
+ "Orange Potion",
+ "Purple Potion",
+ "Potion of Rainbows",
+ "Fresh Water",
+ "Fresh Water",
+ "Salt Water",
+ "Salt Water",
+ "Mineral Water",
+ "Mineral Water",
+ "Magical Water",
+ "Magical Water",
+ "Empty Flask",
+ "Empty Flask",
+ "Scroll",
+ "Scroll",
+ "Scroll",
+ "Scroll",
+ "Scroll",
+ "Scroll",
+ "Scroll",
+ "Scroll",
+ "Scroll",
+ "Scroll",
+ "Parchment scrap",
+ "Parchment scrap",
+ "Parchment scrap",
+ "Parchment scrap",
+ "Parchment scrap",
+ "Red Magestone",
+ "Orange Magestone",
+ "Yellow Magestone",
+ "Green Magestone",
+ "Blue-Green Magestone",
+ "Blue Magestone",
+ "Purple Magestone",
+ "Heavy rock",
+ "Royal Crown",
+ "Royal Sceptre",
+ "Gold key",
+ "Unknown item"
+};
+
+static const StringListProvider k1ItemNamesDOSCDEnglishProvider = { ARRAYSIZE(k1ItemNamesDOSCDEnglish), k1ItemNamesDOSCDEnglish };
+
+static const char *const k1TakenStringsDOSCDEnglish[2] = {
+ " taken.",
+ " taken."
+};
+
+static const StringListProvider k1TakenStringsDOSCDEnglishProvider = { ARRAYSIZE(k1TakenStringsDOSCDEnglish), k1TakenStringsDOSCDEnglish };
+
+static const char *const k1PlacedStringsDOSCDEnglish[1] = {
+ " placed."
+};
+
+static const StringListProvider k1PlacedStringsDOSCDEnglishProvider = { ARRAYSIZE(k1PlacedStringsDOSCDEnglish), k1PlacedStringsDOSCDEnglish };
+
+static const char *const k1DroppedStringsDOSCDEnglish[1] = {
+ " dropped."
+};
+
+static const StringListProvider k1DroppedStringsDOSCDEnglishProvider = { ARRAYSIZE(k1DroppedStringsDOSCDEnglish), k1DroppedStringsDOSCDEnglish };
+
+static const char *const k1NoDropStringsDOSCDEnglish[2] = {
+ "You can't drop any more items in this scene.",
+ "You can't put that there."
+};
+
+static const StringListProvider k1NoDropStringsDOSCDEnglishProvider = { ARRAYSIZE(k1NoDropStringsDOSCDEnglish), k1NoDropStringsDOSCDEnglish };
+
+static const char *const k1PutDownStringDOSCDEnglish[1] = {
+ "Maybe I'd better put this down first."
+};
+
+static const StringListProvider k1PutDownStringDOSCDEnglishProvider = { ARRAYSIZE(k1PutDownStringDOSCDEnglish), k1PutDownStringDOSCDEnglish };
+
+static const char *const k1WaitAmuletStringDOSCDEnglish[1] = {
+ "I guess I'll have to wait for my Amulet to regain its power."
+};
+
+static const StringListProvider k1WaitAmuletStringDOSCDEnglishProvider = { ARRAYSIZE(k1WaitAmuletStringDOSCDEnglish), k1WaitAmuletStringDOSCDEnglish };
+
+static const char *const k1BlackJewelStringDOSCDEnglish[1] = {
+ "It's a jewel, but why is it black?"
+};
+
+static const StringListProvider k1BlackJewelStringDOSCDEnglishProvider = { ARRAYSIZE(k1BlackJewelStringDOSCDEnglish), k1BlackJewelStringDOSCDEnglish };
+
+static const char *const k1HealingTipStringDOSCDEnglish[1] = {
+ "Gee, this could come in handy if I get hurt."
+};
+
+static const StringListProvider k1HealingTipStringDOSCDEnglishProvider = { ARRAYSIZE(k1HealingTipStringDOSCDEnglish), k1HealingTipStringDOSCDEnglish };
+
+static const char *const k1PoisonGoneStringDOSCDEnglish[2] = {
+ "Amazing!",
+ "The effects of the poison are gone!"
+};
+
+static const StringListProvider k1PoisonGoneStringDOSCDEnglishProvider = { ARRAYSIZE(k1PoisonGoneStringDOSCDEnglish), k1PoisonGoneStringDOSCDEnglish };
+
+static const char *const k1ThePoisonStringsDOSCDEnglish[4] = {
+ "The poison...",
+ "I can't breathe...",
+ "I don't feel so good...",
+ "That snake must\rbe poisonous!"
+};
+
+static const StringListProvider k1ThePoisonStringsDOSCDEnglishProvider = { ARRAYSIZE(k1ThePoisonStringsDOSCDEnglish), k1ThePoisonStringsDOSCDEnglish };
+
+static const char *const k1FluteStringsDOSCDEnglish[40] = {
+ "Not very impressive sounding.",
+ "That last note sure was high!",
+ "\xBA",
+ "\xBA",
+ "",
+ "\x01",
+ "\x01\xB3",
+ "\xB3",
+ "\x06\x04\x08\x03\x06",
+ "\x08\x01\x01",
+ "\x02\x04",
+ "\x05\x02",
+ "\x08\x01\x01",
+ "\x11",
+ "5",
+ "Y",
+ "",
+ "",
+ "",
+ "",
+ "\x15",
+ "9",
+ "]",
+ "",
+ "",
+ "",
+ "",
+ "\x07",
+ ")",
+ "M",
+ "",
+ "",
+ "",
+ "",
+ "",
+ "",
+ "",
+ "",
+ "SHAPE_HORZ_REV",
+ "SHAPE_VERT_REV"
+};
+
+static const StringListProvider k1FluteStringsDOSCDEnglishProvider = { ARRAYSIZE(k1FluteStringsDOSCDEnglish), k1FluteStringsDOSCDEnglish };
+
+static const char *const k1WispJewelStringsDOSCDEnglish[2] = {
+ "I'm not really feeling up to it right now.",
+ "I probably should put down this first."
+};
+
+static const StringListProvider k1WispJewelStringsDOSCDEnglishProvider = { ARRAYSIZE(k1WispJewelStringsDOSCDEnglish), k1WispJewelStringsDOSCDEnglish };
+
+static const char *const k1MagicJewelStringsDOSCDEnglish[1] = {
+ "That felt strange."
+};
+
+static const StringListProvider k1MagicJewelStringsDOSCDEnglishProvider = { ARRAYSIZE(k1MagicJewelStringsDOSCDEnglish), k1MagicJewelStringsDOSCDEnglish };
+
+static const char *const k1FlaskFullStringDOSCDEnglish[1] = {
+ "This flask is already full."
+};
+
+static const StringListProvider k1FlaskFullStringDOSCDEnglishProvider = { ARRAYSIZE(k1FlaskFullStringDOSCDEnglish), k1FlaskFullStringDOSCDEnglish };
+
+static const char *const k1FullFlaskStringDOSCDEnglish[4] = {
+ "The flask is now filled\rwith fresh, sparkling water.",
+ "The flask is now filled\rwith salt water.",
+ "The flask is now filled\rwith mineral water.",
+ "Magic water."
+};
+
+static const StringListProvider k1FullFlaskStringDOSCDEnglishProvider = { ARRAYSIZE(k1FullFlaskStringDOSCDEnglish), k1FullFlaskStringDOSCDEnglish };
+
+static const char *const k1OutroHomeStringDOSCDEnglish[1] = {
+ "Home"
+};
+
+static const StringListProvider k1OutroHomeStringDOSCDEnglishProvider = { ARRAYSIZE(k1OutroHomeStringDOSCDEnglish), k1OutroHomeStringDOSCDEnglish };
+
+static const char *const k1VeryCleverStringDOSCDEnglish[1] = {
+ "Very clever! But your feeble efforts are futile."
+};
+
+static const StringListProvider k1VeryCleverStringDOSCDEnglishProvider = { ARRAYSIZE(k1VeryCleverStringDOSCDEnglish), k1VeryCleverStringDOSCDEnglish };
+
+static const char *const k1GUIStringsDOSCDEnglish[81] = {
+ "The Legend of Kyrandia",
+ "Load a game",
+ "Save this game",
+ "Game controls",
+ "Quit playing",
+ "Resume game",
+ "Game Controls",
+ "Which game would you like to reload?",
+ "Select a position to save to:",
+ "[ EMPTY SLOT ]",
+ "Cancel",
+ "Enter a description of your saved game:",
+ "Save",
+ "Rest in peace, Brandon.",
+ "Are you sure you want to quit playing?",
+ "XXX",
+ "",
+ "",
+ "",
+ "",
+ "",
+ "",
+ "",
+ "",
+ "",
+ "",
+ "",
+ "",
+ "",
+ "",
+ "XXX",
+ "",
+ "",
+ "",
+ "",
+ "",
+ "",
+ "",
+ "",
+ "",
+ "",
+ "",
+ "",
+ "",
+ "",
+ "XXXXXXX",
+ "",
+ "",
+ "",
+ "",
+ "",
+ "",
+ "",
+ "",
+ "",
+ "",
+ "XXXXXXXXX",
+ "",
+ "",
+ "",
+ "",
+ "",
+ "",
+ "",
+ "",
+ "XXXXXXXXXXXX",
+ "",
+ "",
+ "",
+ "",
+ "",
+ "Main menu",
+ "on",
+ "off",
+ "Yes",
+ "No",
+ "\xCD\x0E\x17""+""\xD5\x0E\x17""+""\xDA\x0E\x17""+""\xE1\x0E\x17""+""\xE6\x0E\x17""+""\xEE\x0E\x17""+""\xF8\x0E\x17""+""\x03\x0F\x17""+""\x10\x0F\x17""+""\x18\x0F\x17""+""\x1F\x0F\x17""+$""\x0F\x17""+Walk speed ",
+ "Text speed ",
+ "Music is ",
+ "Sounds are ",
+ "Voice / Text"
+};
+
+static const StringListProvider k1GUIStringsDOSCDEnglishProvider = { ARRAYSIZE(k1GUIStringsDOSCDEnglish), k1GUIStringsDOSCDEnglish };
+
+static const char *const k1NewGameStringDOSCDEnglish[1] = {
+ "[ START A NEW GAME ]"
+};
+
+static const StringListProvider k1NewGameStringDOSCDEnglishProvider = { ARRAYSIZE(k1NewGameStringDOSCDEnglish), k1NewGameStringDOSCDEnglish };
+
+static const char *const k1ConfigStringsDOSCDEnglish[12] = {
+ "slowest",
+ "slow",
+ "normal",
+ "fast",
+ "fastest",
+ "Text only",
+ "Voice only",
+ "Voice & Text",
+ "slowest",
+ "normal",
+ "fast",
+ "clickable"
+};
+
+static const StringListProvider k1ConfigStringsDOSCDEnglishProvider = { ARRAYSIZE(k1ConfigStringsDOSCDEnglish), k1ConfigStringsDOSCDEnglish };
+
diff --git a/devtools/create_kyradat/resources/lok_dos_cd_french.h b/devtools/create_kyradat/resources/lok_dos_cd_french.h
new file mode 100644
index 0000000000..cf45a2fb28
--- /dev/null
+++ b/devtools/create_kyradat/resources/lok_dos_cd_french.h
@@ -0,0 +1,349 @@
+static const char *const k1IntroStringsDOSCDFrench[51] = {
+ "This is a text test - 1",
+ "This is a text test - 2",
+ "Salut Kallak...",
+ "...Puissant Chef de l'Ordre des Mystiques Royaux!",
+ "Je t'ai fait peur?",
+ "Malcolm!",
+ "On m'a dit hier que tu t'""\x82""tais ""\x82""vad""\x82"".",
+ "Je t'attendais depuis longtemps.",
+ "Pourquoi me serais-je press""\x82""?",
+ "C'est moi qui gouverne ce pays!",
+ "Ton faible sort n'a pas d'effet sur moi.",
+ "Tue-moi maintenant!",
+ "Il ne me reste pas beaucoup de pouvoirs magiques.",
+ "Je veux te faire du mal, sois-en s""\x96""r...",
+ "...Maintenant, tu es transform""\x82"" en pierre...",
+ "...mais je te laisse tes yeux.",
+ "Je ne verse aucune larme pour Kyrandia...",
+ "...mais je ne peux pas te refuser les tiennes.",
+ "Malcolm le Bouffon est libre!",
+ "Il contr""\x93""le la Kyragemme maintenant...",
+ "...source de tous les pouvoirs magiques de Kyrandia!",
+ "",
+ "Comment oses-tu ME faire tr""\x82""bucher!",
+ "Mais non, quelque chose de sp""\x82""cial pour toi...",
+ "Un sort humoristique!",
+ "Mais je pr""\x82""viendrai.",
+ "Ne saute pas sur CET arbre!",
+ "Ne grimpe pas sur CET arbre, petit ""\x82""cureuil!",
+ "Hou!",
+ "C'est plus marrant comme ""\x87""a...",
+ "...n'est-ce pas?",
+ "Ha ha ha...",
+ "Les doigts ne sont-ils pas une chose merveilleuse?",
+ "C'est super d'""\x88""tre en vie!",
+ "Brandon!",
+ "Grand-P""\x8A""re! On y est arriv""\x82""!",
+ "Non! TU y es arriv""\x82""!",
+ "Longue vie au Roi Brandon!",
+ "Longue vie ""\x85"" l'Ordre des Mystiques Royaux!",
+ "Retournons mettre de l'ordre dans Kyrandia!",
+ "Bonne id""\x82""e!",
+ "En tant que Roi...",
+ "je d""\x82""clare que les sandales sont d""\x82""sormais les souliers officiels ""\x85"" Kyrandia!",
+ "Bien jou""\x82"", Brandon!",
+ "La Terre ne pleure plus...",
+ "Et tu as retrouv""\x82"" tes amis!",
+ "Ma Ch""\x8A""re Brynn...",
+ "Malcolm s'est ""\x82""vad""\x82""!",
+ "Il viendra me chercher bient""\x93""t.",
+ "S'il te pla""\x8C""t Brandon, aide-moi...",
+ ""
+};
+
+static const StringListProvider k1IntroStringsDOSCDFrenchProvider = { ARRAYSIZE(k1IntroStringsDOSCDFrench), k1IntroStringsDOSCDFrench };
+
+static const char *const k1ItemNamesDOSCDFrench[108] = {
+ "Grenat",
+ "Am""\x82""thyste",
+ "Aigue-marine",
+ "Diamant",
+ "Emeraude",
+ "Perle",
+ "Rubis",
+ "Olivine",
+ "Saphir",
+ "Opale",
+ "Topaze",
+ "Onyx",
+ "Aventurine",
+ "Pierre de Lune",
+ "Pierre d'Iris",
+ "Magn""\x82""tite",
+ "Rose",
+ "Tulipe",
+ "Orchid""\x82""e",
+ "Rose d'argent",
+ "Statuette d'argent",
+ "Pi""\x8A""ce d'argent",
+ "Pi""\x8A""ce d'or",
+ "Bague en or",
+ "Calice royal",
+ "Pomme de pin",
+ "Gland",
+ "Noix",
+ "Baie de feu luisantes",
+ "Baie de feu",
+ "Baie de feu",
+ "Baie de feu",
+ "Baie de feu",
+ "Baie de feu",
+ "Poisson",
+ "Ar""\x88""te",
+ "Gigot de mouton",
+ "Os",
+ "Pomme",
+ "Trognon de pomme",
+ "Myrtille",
+ "Champignon",
+ "Note",
+ "Bille",
+ "Scie",
+ "Croix ans""\x82""e",
+ "Plume",
+ "Oeuf",
+ "Feuille",
+ "Tr""\x8A""fle",
+ "Etoile bris""\x82""e",
+ "Boule de cristal",
+ "Larme",
+ "Miroir",
+ "Tesson de glace",
+ "Fl""\x96""te",
+ "Sablier",
+ "Cl""\x82"" m""\x82""tallique",
+ "Cl""\x82"" de jade",
+ "Cl""\x82"" obsidion",
+ "Potion rouge",
+ "Potion rouge",
+ "Potion bleue",
+ "Potion bleue",
+ "Potion jaune",
+ "Potion jaune",
+ "Potion verte",
+ "Potion orange",
+ "Potion violette",
+ "Potion d'arcs-en-ciel",
+ "Eau fraiche",
+ "Eau fraiche",
+ "Eau sal""\x82""e",
+ "Eau sal""\x82""e",
+ "Eau min""\x82""rale",
+ "Eau min""\x82""rale",
+ "Eau magique",
+ "Eau magique",
+ "Gourde vide",
+ "Gourde vide",
+ "Parchemin",
+ "Parchemin",
+ "Parchemin",
+ "Parchemin",
+ "Parchemin",
+ "Parchemin",
+ "Parchemin",
+ "Parchemin",
+ "Parchemin",
+ "Parchemin",
+ "Morceau de parchemin",
+ "Morceau de parchemin",
+ "Morceau de parchemin",
+ "Morceau de parchemin",
+ "Morceau de parchemin",
+ "Pierre magique rouge",
+ "Pierre magique orange",
+ "Pierre magique jaune",
+ "Pierre magique verte",
+ "Pierre magique turquoise",
+ "Pierre magique bleue",
+ "Pierre magique violette",
+ "Rocher lourd",
+ "Couronne royale",
+ "Sceptre royal",
+ "Cl""\x82"" en or",
+ "Objet inconnu",
+ ""
+};
+
+static const StringListProvider k1ItemNamesDOSCDFrenchProvider = { ARRAYSIZE(k1ItemNamesDOSCDFrench), k1ItemNamesDOSCDFrench };
+
+static const char *const k1TakenStringsDOSCDFrench[4] = {
+ " prise.",
+ " pris.",
+ " prise.",
+ " pris."
+};
+
+static const StringListProvider k1TakenStringsDOSCDFrenchProvider = { ARRAYSIZE(k1TakenStringsDOSCDFrench), k1TakenStringsDOSCDFrench };
+
+static const char *const k1PlacedStringsDOSCDFrench[2] = {
+ " plac""\x82""e.",
+ " plac""\x82""."
+};
+
+static const StringListProvider k1PlacedStringsDOSCDFrenchProvider = { ARRAYSIZE(k1PlacedStringsDOSCDFrench), k1PlacedStringsDOSCDFrench };
+
+static const char *const k1DroppedStringsDOSCDFrench[2] = {
+ " l""\x83""ch""\x82""e.",
+ " l""\x83""ch""\x82""."
+};
+
+static const StringListProvider k1DroppedStringsDOSCDFrenchProvider = { ARRAYSIZE(k1DroppedStringsDOSCDFrench), k1DroppedStringsDOSCDFrench };
+
+static const char *const k1NoDropStringsDOSCDFrench[2] = {
+ "Vous ne pouvez pas l""\x83""cher autre chose ici.",
+ "Vous ne pouvez pas mettre ""\x87""a l""\x85""."
+};
+
+static const StringListProvider k1NoDropStringsDOSCDFrenchProvider = { ARRAYSIZE(k1NoDropStringsDOSCDFrench), k1NoDropStringsDOSCDFrench };
+
+static const char *const k1PutDownStringDOSCDFrench[1] = {
+ "Il faudrait peut-""\x88""tre que je pose ""\x87""a d'abord."
+};
+
+static const StringListProvider k1PutDownStringDOSCDFrenchProvider = { ARRAYSIZE(k1PutDownStringDOSCDFrench), k1PutDownStringDOSCDFrench };
+
+static const char *const k1WaitAmuletStringDOSCDFrench[1] = {
+ "Je suppose qu'il me faut attendre que mon amulette retrouve son pouvoir."
+};
+
+static const StringListProvider k1WaitAmuletStringDOSCDFrenchProvider = { ARRAYSIZE(k1WaitAmuletStringDOSCDFrench), k1WaitAmuletStringDOSCDFrench };
+
+static const char *const k1BlackJewelStringDOSCDFrench[1] = {
+ "C'est un bijou, mais pourquoi est-il noir?"
+};
+
+static const StringListProvider k1BlackJewelStringDOSCDFrenchProvider = { ARRAYSIZE(k1BlackJewelStringDOSCDFrench), k1BlackJewelStringDOSCDFrench };
+
+static const char *const k1HealingTipStringDOSCDFrench[1] = {
+ "Hue, ""\x87""a pourrait bien m'""\x88""tre utile si je suis bless""\x82""."
+};
+
+static const StringListProvider k1HealingTipStringDOSCDFrenchProvider = { ARRAYSIZE(k1HealingTipStringDOSCDFrench), k1HealingTipStringDOSCDFrench };
+
+static const char *const k1PoisonGoneStringDOSCDFrench[2] = {
+ "G""\x82""nial!",
+ "Les effets du poison ont disparu!"
+};
+
+static const StringListProvider k1PoisonGoneStringDOSCDFrenchProvider = { ARRAYSIZE(k1PoisonGoneStringDOSCDFrench), k1PoisonGoneStringDOSCDFrench };
+
+static const char *const k1ThePoisonStringsDOSCDFrench[4] = {
+ "Le poison...",
+ "Je ne peux plus respirer...",
+ "Je ne me sens pas tr""\x8A""s bien...",
+ "Ce serpent doit ""\x88""tre \rvenimeux!"
+};
+
+static const StringListProvider k1ThePoisonStringsDOSCDFrenchProvider = { ARRAYSIZE(k1ThePoisonStringsDOSCDFrench), k1ThePoisonStringsDOSCDFrench };
+
+static const char *const k1FluteStringsDOSCDFrench[2] = {
+ "\x80""a ne sonne pas tr""\x8A""s bien.",
+ "Cette derni""\x8A""re note ""\x82""tait vraiment aigue!"
+};
+
+static const StringListProvider k1FluteStringsDOSCDFrenchProvider = { ARRAYSIZE(k1FluteStringsDOSCDFrench), k1FluteStringsDOSCDFrench };
+
+static const char *const k1WispJewelStringsDOSCDFrench[2] = {
+ "Je ne m'en sens pas vraiment capable maintenant.",
+ "Je devrait poser mon, ma, mes "
+};
+
+static const StringListProvider k1WispJewelStringsDOSCDFrenchProvider = { ARRAYSIZE(k1WispJewelStringsDOSCDFrench), k1WispJewelStringsDOSCDFrench };
+
+static const char *const k1MagicJewelStringsDOSCDFrench[1] = {
+ "C'""\x82""tait bizarre."
+};
+
+static const StringListProvider k1MagicJewelStringsDOSCDFrenchProvider = { ARRAYSIZE(k1MagicJewelStringsDOSCDFrench), k1MagicJewelStringsDOSCDFrench };
+
+static const char *const k1FlaskFullStringDOSCDFrench[1] = {
+ "Cette gourde est d""\x82""j""\x85"" pleine."
+};
+
+static const StringListProvider k1FlaskFullStringDOSCDFrenchProvider = { ARRAYSIZE(k1FlaskFullStringDOSCDFrench), k1FlaskFullStringDOSCDFrench };
+
+static const char *const k1FullFlaskStringDOSCDFrench[4] = {
+ "La gourde est remplie \rd'eau gazeuse fra""\x8C""che.",
+ "La gourde est remplie \rd'eau sal""\x82""e.",
+ "La gourde est remplie \rd'eau min""\x82""rale.",
+ "Eau magique."
+};
+
+static const StringListProvider k1FullFlaskStringDOSCDFrenchProvider = { ARRAYSIZE(k1FullFlaskStringDOSCDFrench), k1FullFlaskStringDOSCDFrench };
+
+static const char *const k1OutroHomeStringDOSCDFrench[1] = {
+ "Maison"
+};
+
+static const StringListProvider k1OutroHomeStringDOSCDFrenchProvider = { ARRAYSIZE(k1OutroHomeStringDOSCDFrench), k1OutroHomeStringDOSCDFrench };
+
+static const char *const k1VeryCleverStringDOSCDFrench[1] = {
+ "Malin! Mais vos efforts restent vains."
+};
+
+static const StringListProvider k1VeryCleverStringDOSCDFrenchProvider = { ARRAYSIZE(k1VeryCleverStringDOSCDFrench), k1VeryCleverStringDOSCDFrench };
+
+static const char *const k1GUIStringsDOSCDFrench[35] = {
+ "The Legend of Kyrandia",
+ "Charger un jeu",
+ "Sauvegarder ce jeu",
+ "Contr""\x93""les du jeu",
+ "Quitter le jeu",
+ "Reprendre le jeu",
+ "Contr""\x93""les du jeu",
+ "Quel jeu voulez-vous re-charger?",
+ "S""\x82""lectionnez une position o""\x97"" sauvegarder:",
+ "[ EMPLACEMENT VIDE ]",
+ "Annuler",
+ "Entrez description de votre jeu sauvegard""\x82"".",
+ "Sauvegarder",
+ "Repose en paix, Brandon.",
+ "Vous voulez vraiment quitter le jeu?",
+ "XXXXXXXXXXXXXXXXX",
+ "XXXXXXXXXXXXXXXXX",
+ "XXXXXXXXXXXXXXXXX",
+ "XXXXXXXXXXXXXXXXX",
+ "XXXXXXXXXXXX",
+ "",
+ "",
+ "",
+ "",
+ "",
+ "Menu principal",
+ "activ""\x82",
+ "d""\x82""sactiv""\x82",
+ "Oui",
+ "Non",
+ "?""\x0F"")+I""\x0F"")+N""\x0F"")+U""\x0F"")+\\""\x0F"")+h""\x0F"")+y""\x0F"")+""\x89\x0F"")+""\x97\x0F"")+""\xA1\x0F"")+""\xA8\x0F"")+""\xAF\x0F"")+Vitesse de d""\x82""placement",
+ "Vitesse du texte",
+ "La musique est ",
+ "Les sons sont ",
+ "Voix/Texte"
+};
+
+static const StringListProvider k1GUIStringsDOSCDFrenchProvider = { ARRAYSIZE(k1GUIStringsDOSCDFrench), k1GUIStringsDOSCDFrench };
+
+static const char *const k1NewGameStringDOSCDFrench[1] = {
+ "[ COMMENCER UN NOUVEAU JEU ]"
+};
+
+static const StringListProvider k1NewGameStringDOSCDFrenchProvider = { ARRAYSIZE(k1NewGameStringDOSCDFrench), k1NewGameStringDOSCDFrench };
+
+static const char *const k1ConfigStringsDOSCDFrench[12] = {
+ "plus lent",
+ "lent",
+ "normal",
+ "rapide",
+ "plus rapide",
+ "Texte uniquement",
+ "Voix uniquement",
+ "Voix et Texte",
+ "plus lent",
+ "normal",
+ "rapide",
+ "cliquable"
+};
+
+static const StringListProvider k1ConfigStringsDOSCDFrenchProvider = { ARRAYSIZE(k1ConfigStringsDOSCDFrench), k1ConfigStringsDOSCDFrench };
+
diff --git a/devtools/create_kyradat/resources/lok_dos_cd_german.h b/devtools/create_kyradat/resources/lok_dos_cd_german.h
new file mode 100644
index 0000000000..a462362e81
--- /dev/null
+++ b/devtools/create_kyradat/resources/lok_dos_cd_german.h
@@ -0,0 +1,370 @@
+static const char *const k1IntroStringsDOSCDGerman[52] = {
+ "This is a text test - 1",
+ "This is a text test - 2",
+ "Sei gegr""\x81\xE1""t, Kallak...",
+ "...M""\x84""chtiger Anf""\x81""hrer der k""\x94""niglichen Mystiker!",
+ "Habe ich dich erschreckt?",
+ "Malcolm!",
+ "Ich habe gestern von deiner Flucht geh""\x94""rt.",
+ "Ich habe dich fr""\x81""her erwartet.",
+ "Warum sollte ich mich beeilen?",
+ "Ich herrsche ""\x81""ber dieses Land!",
+ "Dein mickriger Fluch h""\x84""lt mich nicht zur""\x81""ck.",
+ "So, erschlag mich doch!",
+ "Ich habe nur noch wenig Magie ""\x81""brig.",
+ "Ich werde dir zu Leibe r""\x81""cken, zweifle blo""\xE1"" nicht daran...",
+ "...du bist jetzt aus Stein...",
+ "...Ich lasse dir allein deine Augen.",
+ "F""\x81""r Kyrandia vergie""\xE1""e ich nicht eine Tr""\x84""ne...",
+ "...aber deine will ich dir nicht nehmen.",
+ "Malcolm der Hofnarr ist ausgebrochen!",
+ "Er beherrscht nun den Kyragem...",
+ "...die Quelle aller Magie in Kyrandia!",
+ "",
+ "Wie kannst du es wagen, MICH umzuwerfen!",
+ "Nicht doch, etwas Besonderes f""\x81""r dich...",
+ "Was f""\x81""r ein l""\x84""cherlicher Fluch!",
+ "Ich warne dich vorher.",
+ "Springe nicht auf DIESEN Baum!",
+ "Klettre nicht auf diesen Baum, kleines Eichh""\x94""rnchen!",
+ "Buuh!",
+ "So ist es viel lustiger...",
+ "...nicht wahr?",
+ "Ha ha ha...",
+ "Sind Finger nicht 'was Tolles?",
+ "Es ist gro""\xE1""artig, am Leben zu sein!",
+ "Brandon!",
+ "Gro""\xE1""vater! Wir haben es geschafft!",
+ "Nein! DU hast es geschafft!",
+ "Lang lebe K""\x94""nig Brandon!",
+ "Lang leben die k""\x94""niglichen Mystiker!",
+ "Bauen wir Kyrandia wieder auf!",
+ "Eine gute Idee!",
+ "Als meine erste k""\x94""nigliche Proklamation,...",
+ "...erkl""\x84""re ich Sandalen zur offiziellen Fu""\xE1""bekleidung Kyrandias!",
+ "Sehr weise, Brandon!",
+ "Das Land ist nicht l""\x84""nger in Trauer!",
+ "Und deine Freunde sind gerettet.",
+ "Liebe Brynn...",
+ "Malcolm ist ausgebrochen!",
+ "Er wird bald zu mir kommen.",
+ "Bitte hilf Brandon...",
+ "",
+ ""
+};
+
+static const StringListProvider k1IntroStringsDOSCDGermanProvider = { ARRAYSIZE(k1IntroStringsDOSCDGerman), k1IntroStringsDOSCDGerman };
+
+static const char *const k1ItemNamesDOSCDGerman[108] = {
+ "Granat",
+ "Amethyst",
+ "Aquamarin",
+ "Diamant",
+ "Smaragd",
+ "Perle",
+ "Rubin",
+ "Peridot",
+ "Saphir",
+ "Opal",
+ "Topas",
+ "Onyx",
+ "Sonnenstein",
+ "Mondstein",
+ "Regenbogenstein",
+ "Magnetstein",
+ "Rose",
+ "Tulpe",
+ "Orchidee",
+ "Silberne Rose",
+ "Silberne Statuette",
+ "Silberm""\x81""nze",
+ "Goldm""\x81""nze",
+ "Goldring",
+ "Der Kelch des K""\x94""nigs",
+ "Kienapfel",
+ "Eichel",
+ "Walnu""\xE1",
+ "Immerleuchtende Feuerbeeren",
+ "Feuerbeeren",
+ "Feuerbeeren",
+ "Feuerbeeren",
+ "Feuerbeeren",
+ "Feuerbeeren",
+ "Fisch",
+ "Fischgr""\x84""te",
+ "Hammelkeule",
+ "Knochen",
+ "Apfel",
+ "Apfelgriebsch",
+ "Heidelbeeren",
+ "Pilz",
+ "Notiz",
+ "Murmel",
+ "S""\x84""ge",
+ "Henkelkreuz",
+ "Feder",
+ "Ei",
+ "Blatt",
+ "Kleeblatt",
+ "Sternschnuppe",
+ "Kristallkugel",
+ "Tr""\x84""ne",
+ "Spiegel",
+ "Eisst""\x81""ck",
+ "Fl""\x94""te",
+ "Sanduhr",
+ "Eisenschl""\x81""ssel",
+ "Jadeschl""\x81""ssel",
+ "Obsidianschl""\x81""ssel",
+ "Roter Trank",
+ "Roter Trank",
+ "Blauer Trank",
+ "Blauer Trank",
+ "Gelber Trank",
+ "Gelber Trank",
+ "Gr""\x81""ner Trank",
+ "Oranger Trank",
+ "Violetter Trank",
+ "Regenbogentrank",
+ "S""\x81\xE1""wasser",
+ "S""\x81\xE1""wasser",
+ "Salzwasser",
+ "Salzwasser",
+ "Mineralwasser",
+ "Mineralwasser",
+ "Magisches Wasser",
+ "Magisches Wasser",
+ "Leere Flasche",
+ "Leere Flasche",
+ "Schriftrolle",
+ "Schriftrolle",
+ "Schriftrolle",
+ "Schriftrolle",
+ "Schriftrolle",
+ "Schriftrolle",
+ "Schriftrolle",
+ "Schriftrolle",
+ "Schriftrolle",
+ "Schriftrolle",
+ "Pergamentfetzen",
+ "Pergamentfetzen",
+ "Pergamentfetzen",
+ "Pergamentfetzen",
+ "Pergamentfetzen",
+ "Roter Weisenstein",
+ "Oranger Weisenstein",
+ "Gelber Weisenstein",
+ "Gr""\x81""ner Weisenstein",
+ "T""\x81""rkiser Weisenstein",
+ "Blauer Weisenstein",
+ "Violetter Weisenstein",
+ "Schwerer Stein",
+ "K""\x94""nigliche Krone",
+ "K""\x94""nigliches Zepter",
+ "Goldschl""\x81""ssel",
+ "Unbekannter Gegenstand",
+ ""
+};
+
+static const StringListProvider k1ItemNamesDOSCDGermanProvider = { ARRAYSIZE(k1ItemNamesDOSCDGerman), k1ItemNamesDOSCDGerman };
+
+static const char *const k1TakenStringsDOSCDGerman[2] = {
+ " aufgenommen.",
+ " aufgenommen."
+};
+
+static const StringListProvider k1TakenStringsDOSCDGermanProvider = { ARRAYSIZE(k1TakenStringsDOSCDGerman), k1TakenStringsDOSCDGerman };
+
+static const char *const k1PlacedStringsDOSCDGerman[1] = {
+ " abgelegt."
+};
+
+static const StringListProvider k1PlacedStringsDOSCDGermanProvider = { ARRAYSIZE(k1PlacedStringsDOSCDGerman), k1PlacedStringsDOSCDGerman };
+
+static const char *const k1DroppedStringsDOSCDGerman[1] = {
+ " fallengelassen."
+};
+
+static const StringListProvider k1DroppedStringsDOSCDGermanProvider = { ARRAYSIZE(k1DroppedStringsDOSCDGerman), k1DroppedStringsDOSCDGerman };
+
+static const char *const k1NoDropStringsDOSCDGerman[2] = {
+ "Hier kann nichts mehr abgelegt werden.",
+ "Das kann hier nicht abgelegt werden."
+};
+
+static const StringListProvider k1NoDropStringsDOSCDGermanProvider = { ARRAYSIZE(k1NoDropStringsDOSCDGerman), k1NoDropStringsDOSCDGerman };
+
+static const char *const k1PutDownStringDOSCDGerman[1] = {
+ "Vielleicht sollte ich es erst hinlegen."
+};
+
+static const StringListProvider k1PutDownStringDOSCDGermanProvider = { ARRAYSIZE(k1PutDownStringDOSCDGerman), k1PutDownStringDOSCDGerman };
+
+static const char *const k1WaitAmuletStringDOSCDGerman[1] = {
+ "I nehme an, ich mu""\xE1"" warten, bis mein Amulett seine Kraft wiedererlangt."
+};
+
+static const StringListProvider k1WaitAmuletStringDOSCDGermanProvider = { ARRAYSIZE(k1WaitAmuletStringDOSCDGerman), k1WaitAmuletStringDOSCDGerman };
+
+static const char *const k1BlackJewelStringDOSCDGerman[1] = {
+ "Es ist ein Edelstein, aber warum ist er schwarz?"
+};
+
+static const StringListProvider k1BlackJewelStringDOSCDGermanProvider = { ARRAYSIZE(k1BlackJewelStringDOSCDGerman), k1BlackJewelStringDOSCDGerman };
+
+static const char *const k1HealingTipStringDOSCDGerman[1] = {
+ "Mann, das kann ganz n""\x81""tzlich sein, falls ich mich verletze!"
+};
+
+static const StringListProvider k1HealingTipStringDOSCDGermanProvider = { ARRAYSIZE(k1HealingTipStringDOSCDGerman), k1HealingTipStringDOSCDGerman };
+
+static const char *const k1PoisonGoneStringDOSCDGerman[2] = {
+ "Erstaunlich!",
+ "Die Wirkung des Giftes hat nachgelassen!"
+};
+
+static const StringListProvider k1PoisonGoneStringDOSCDGermanProvider = { ARRAYSIZE(k1PoisonGoneStringDOSCDGerman), k1PoisonGoneStringDOSCDGerman };
+
+static const char *const k1ThePoisonStringsDOSCDGerman[4] = {
+ "Das Gift...",
+ "Ich kann nicht atmen...",
+ "Ich f""\x81""hle mich nicht besonders wohl...",
+ "Die Schlange mu""\xE1"" \rgiftig gewesen sein!"
+};
+
+static const StringListProvider k1ThePoisonStringsDOSCDGermanProvider = { ARRAYSIZE(k1ThePoisonStringsDOSCDGerman), k1ThePoisonStringsDOSCDGerman };
+
+static const char *const k1FluteStringsDOSCDGerman[2] = {
+ "Klingt nicht besonders beeindruckend.",
+ "Die letzte Note war hoch!"
+};
+
+static const StringListProvider k1FluteStringsDOSCDGermanProvider = { ARRAYSIZE(k1FluteStringsDOSCDGerman), k1FluteStringsDOSCDGerman };
+
+static const char *const k1WispJewelStringsDOSCDGerman[2] = {
+ "Im Moment f""\x81""hle ich mich dazu nicht in der Lage.",
+ "Ich mu""\xE1"" wahrscheinlich erst mein(e)..."
+};
+
+static const StringListProvider k1WispJewelStringsDOSCDGermanProvider = { ARRAYSIZE(k1WispJewelStringsDOSCDGerman), k1WispJewelStringsDOSCDGerman };
+
+static const char *const k1MagicJewelStringsDOSCDGerman[1] = {
+ "Das war eigenartig."
+};
+
+static const StringListProvider k1MagicJewelStringsDOSCDGermanProvider = { ARRAYSIZE(k1MagicJewelStringsDOSCDGerman), k1MagicJewelStringsDOSCDGerman };
+
+static const char *const k1FlaskFullStringDOSCDGerman[1] = {
+ "Die Flasche ist bereits voll."
+};
+
+static const StringListProvider k1FlaskFullStringDOSCDGermanProvider = { ARRAYSIZE(k1FlaskFullStringDOSCDGerman), k1FlaskFullStringDOSCDGerman };
+
+static const char *const k1FullFlaskStringDOSCDGerman[4] = {
+ "Die Flasche ist jetzt mit \rfrischem, klarem Wasser gef""\x81""llt.",
+ "Die Flasche ist jetzt mit \rSalzwasser gef""\x81""llt.",
+ "Die Flasche ist jetzt mit \rMineralwasser gef""\x81""llt.",
+ "Magisches Wasser."
+};
+
+static const StringListProvider k1FullFlaskStringDOSCDGermanProvider = { ARRAYSIZE(k1FullFlaskStringDOSCDGerman), k1FullFlaskStringDOSCDGerman };
+
+static const char *const k1OutroHomeStringDOSCDGerman[1] = {
+ "Ab nach Hause"
+};
+
+static const StringListProvider k1OutroHomeStringDOSCDGermanProvider = { ARRAYSIZE(k1OutroHomeStringDOSCDGerman), k1OutroHomeStringDOSCDGerman };
+
+static const char *const k1VeryCleverStringDOSCDGerman[1] = {
+ "Sehr clever! Aber nichtige Versuche sind zum Scheitern verurteilt."
+};
+
+static const StringListProvider k1VeryCleverStringDOSCDGermanProvider = { ARRAYSIZE(k1VeryCleverStringDOSCDGerman), k1VeryCleverStringDOSCDGerman };
+
+static const char *const k1GUIStringsDOSCDGerman[59] = {
+ "Die Legende von Kyrandia",
+ "Ein Spiel laden",
+ "Dieses Spiel sichern",
+ "Spielsteuerungen",
+ "Spiel beenden",
+ "Spiel wieder aufnehmen",
+ "Spielsteuerungen",
+ "Welches Spiel soll noch einmal geladen werden?",
+ "W""\x84""hlen Sie den Platz zum Sichern aus.",
+ "[ LEERER PLATZ ]",
+ "Abbrechen",
+ "Beschreibung des gesicherten Spiels eingeben.",
+ "Sichern",
+ "Ruhe in Frieden, Brandon.",
+ "Soll das Spiel wirklich beendet werden?",
+ "XXXXX",
+ "",
+ "",
+ "",
+ "",
+ "",
+ "",
+ "",
+ "",
+ "",
+ "",
+ "",
+ "",
+ "XXXXX",
+ "",
+ "",
+ "",
+ "",
+ "",
+ "",
+ "",
+ "",
+ "",
+ "",
+ "",
+ "",
+ "XXXXXXXXXXXXXXXXX",
+ "XXXXXXXXXXXXXXXXX",
+ "XXXXXXXXXXXX",
+ "",
+ "",
+ "",
+ "",
+ "",
+ "Hauptmen""\x81",
+ "An",
+ "Aus",
+ "Ja",
+ "Nein",
+ "c""\x0F\x17""+r""\x0F\x17""+z""\x0F\x17""+""\x81\x0F\x17""+""\x89\x0F\x17""+""\x98\x0F\x17""+""\xA1\x0F\x17""+""\xAD\x0F\x17""+""\xBC\x0F\x17""+""\xCB\x0F\x17""+""\xD2\x0F\x17""+""\xDA\x0F\x17""+Schrittempo",
+ "Textgeschwindigkeit",
+ "Die Musik ist",
+ "Die Soundeffekte sind",
+ "Stimmen/Text"
+};
+
+static const StringListProvider k1GUIStringsDOSCDGermanProvider = { ARRAYSIZE(k1GUIStringsDOSCDGerman), k1GUIStringsDOSCDGerman };
+
+static const char *const k1NewGameStringDOSCDGerman[1] = {
+ "[ EIN NEUES SPIEL ANFANGEN ]"
+};
+
+static const StringListProvider k1NewGameStringDOSCDGermanProvider = { ARRAYSIZE(k1NewGameStringDOSCDGerman), k1NewGameStringDOSCDGerman };
+
+static const char *const k1ConfigStringsDOSCDGerman[12] = {
+ "am langsamsten",
+ "langsam",
+ "normal",
+ "schnell",
+ "am schnellsten",
+ "Nur Text",
+ "Nur Stimmen",
+ "Stimmen & Text",
+ "am langsamsten",
+ "normal",
+ "schnell",
+ "anklickbar"
+};
+
+static const StringListProvider k1ConfigStringsDOSCDGermanProvider = { ARRAYSIZE(k1ConfigStringsDOSCDGerman), k1ConfigStringsDOSCDGerman };
+
diff --git a/devtools/create_kyradat/resources/lok_dos_cd_italian.h b/devtools/create_kyradat/resources/lok_dos_cd_italian.h
new file mode 100644
index 0000000000..0fa8ee66e3
--- /dev/null
+++ b/devtools/create_kyradat/resources/lok_dos_cd_italian.h
@@ -0,0 +1,346 @@
+static const char *const k1IntroStringsDOSCDItalian[51] = {
+ "This is a text test - 1",
+ "This is a text test - 2",
+ "Salute, Kallak.",
+ "...Potente guida dei Mistici Reali! ",
+ "Ti ho spaventato? ",
+ "Malcolm!",
+ "Ho saputo ieri della tua fuga. ",
+ "E ti stavo aspettando. ",
+ "Dovrei forse aver fretta? ",
+ "Io governo queste terre, ora! ",
+ "La vostra magia mi fa il solletico. ",
+ "Allora uccidimi! ",
+ "Ma sappi che ho ancora qualche asso nella manica.",
+ "Avevo intenzione di fartela pagare... ",
+ "...Ora ti ho trasformato in pietra ",
+ "...tutto tranne i tuoi occhi ",
+ "Non verso lacrime per Kyrandia... ",
+ "...per""\x95"" non posso negarti le tue. ",
+ "Malcolm il Buffone ""\x8A"" libero! ",
+ "Ora controlla la Kyragemma... ",
+ "..\nfonte di tutta la magia di Kyrandia! ",
+ "",
+ "Come hai osato farmi lo sgambetto! ",
+ "Anzi, ho qualcosa di speciale per te... ",
+ "Un bel trucchetto! ",
+ "Ma ti avverto... ",
+ "Non saltare sull'albero! ",
+ "Non saltare su QUESTO albero, piccoletto! ",
+ "Boo!",
+ "Cos""\x8D"" ""\x8A"" pi""\x97"" divertente! ",
+ "...non credete? ",
+ "Ha ha HA...",
+ "Le mie dita! Riesco a muoverle! ",
+ "E' bello essere VIVI! ",
+ "Brandon!",
+ "NONNO!!! Ce l'abbiamo fatta!",
+ "NO! Ce l'HAI fatta! ",
+ "Lunga vita al R""\x8A"" Brandon! ",
+ "Lunga vita ai Mistici Reali! ",
+ "Ed ora, Ricostruiamo Kyrandia insieme! ",
+ "Ben detto! ",
+ "Come prima cosa...",
+ "...proclamo i Sandali, calzatura ufficiale di Kyrandia!!! ",
+ "Ben fatto, Brandon!",
+ "La terra non piange pi""\x97""...",
+ "Ci hai salvato tutti! ",
+ "Cara Brynn... ",
+ "Malcolm ""\x8A"" fuggito! ",
+ "Presto verr""\x85"" a prendermi. ",
+ "Ti prego, aiuta Brandon... ",
+ ""
+};
+
+static const StringListProvider k1IntroStringsDOSCDItalianProvider = { ARRAYSIZE(k1IntroStringsDOSCDItalian), k1IntroStringsDOSCDItalian };
+
+static const char *const k1ItemNamesDOSCDItalian[107] = {
+ "Biglia",
+ "Ametista",
+ "Acquamarina",
+ "Diamante",
+ "Smeraldo",
+ "Perla",
+ "Rubino",
+ "Olivina",
+ "Zaffiro",
+ "Opale",
+ "Topazio",
+ "Onice",
+ "Pietra di Sole",
+ "Pietra di Luna",
+ "Pietra di Arcobaleno",
+ "Magnetite",
+ "Rosa",
+ "Tulipano",
+ "Orchidea",
+ "Rosa d'Argento",
+ "Statuetta d'Argento",
+ "Moneta d'Argento",
+ "Moneta d'Oro",
+ "Anello d'Oro",
+ "Calice Reale",
+ "Pigna",
+ "Ghianda",
+ "Noce",
+ "BaccheInfuocate perenni",
+ "Baccheinfuocate",
+ "Baccheinfuocate",
+ "Baccheinfuocate",
+ "Baccheinfuocate",
+ "Baccheinfuocate",
+ "Pesce",
+ "Lisca di Pesce",
+ "Zampa di Montone",
+ "Osso",
+ "Mela",
+ "Torsolo di Mela",
+ "Mirtilli",
+ "Fungo",
+ "Messaggio",
+ "Marmo",
+ "Sega",
+ "Croce Ansata Egiziana",
+ "Piuma",
+ "Uovo",
+ "Foglia",
+ "Trifoglio",
+ "Stella Cadente",
+ "Sfera di Cristallo",
+ "Lacrima",
+ "Specchio",
+ "Ghiacciolo",
+ "Flauto",
+ "Clessidra",
+ "Chiave di Ferro",
+ "Chiave di Giada",
+ "Chiave id Ossidiana",
+ "Pozione Rossa",
+ "Pozione Rossa",
+ "Pozione Blu",
+ "Pozione Blu",
+ "Pozione Gialla",
+ "Pozione Gialla",
+ "Pozione Verde",
+ "Pozione Arancione",
+ "Pozione Viola",
+ "Pozione Arcobaleno",
+ "Acqua Fresca",
+ "Acqua Fresca",
+ "Acqua Salata",
+ "Acqua Salata",
+ "Acqua Minerale",
+ "Acqua Minerale",
+ "Acqua Magica",
+ "Acqua Magica",
+ "Bottiglietta vuota",
+ "Bottiglietta Vuota",
+ "Pergamena",
+ "Pergamena",
+ "Pergamena",
+ "Pergamena",
+ "Pergamena",
+ "Pergamena",
+ "Pergamena",
+ "Pergamena",
+ "Pergamena",
+ "Pergamena",
+ "Pezzo",
+ "Pezzo",
+ "Pezzo",
+ "Pezzo",
+ "Pezzo",
+ "Magipietra Rossa",
+ "Magipietra Arancione",
+ "Magipietra Gialla",
+ "Magipietra Verde",
+ "Magipietra Blu-Verde",
+ "Magipietra Blu",
+ "Magipietra Porpora",
+ "Roccia pesante",
+ "Corona Reale",
+ "Scettro Reale",
+ "Chiave d'Oro",
+ "?????"
+};
+
+static const StringListProvider k1ItemNamesDOSCDItalianProvider = { ARRAYSIZE(k1ItemNamesDOSCDItalian), k1ItemNamesDOSCDItalian };
+
+static const char *const k1TakenStringsDOSCDItalian[2] = {
+ " su ",
+ " su "
+};
+
+static const StringListProvider k1TakenStringsDOSCDItalianProvider = { ARRAYSIZE(k1TakenStringsDOSCDItalian), k1TakenStringsDOSCDItalian };
+
+static const char *const k1PlacedStringsDOSCDItalian[2] = {
+ " giu' ",
+ " giu' "
+};
+
+static const StringListProvider k1PlacedStringsDOSCDItalianProvider = { ARRAYSIZE(k1PlacedStringsDOSCDItalian), k1PlacedStringsDOSCDItalian };
+
+static const char *const k1DroppedStringsDOSCDItalian[2] = {
+ " giu' ",
+ " giu' "
+};
+
+static const StringListProvider k1DroppedStringsDOSCDItalianProvider = { ARRAYSIZE(k1DroppedStringsDOSCDItalian), k1DroppedStringsDOSCDItalian };
+
+static const char *const k1NoDropStringsDOSCDItalian[2] = {
+ "Non puoi pi""\x97"" lasciare nulla qui. ",
+ "Non puoi metterlo l""\x8D"". "
+};
+
+static const StringListProvider k1NoDropStringsDOSCDItalianProvider = { ARRAYSIZE(k1NoDropStringsDOSCDItalian), k1NoDropStringsDOSCDItalian };
+
+static const char *const k1PutDownStringDOSCDItalian[1] = {
+ "Forse devo prima mettere gi""\x97"" questo. "
+};
+
+static const StringListProvider k1PutDownStringDOSCDItalianProvider = { ARRAYSIZE(k1PutDownStringDOSCDItalian), k1PutDownStringDOSCDItalian };
+
+static const char *const k1WaitAmuletStringDOSCDItalian[1] = {
+ "Credo di dover attendere che l'amuleto racquisti i suoi poteri. "
+};
+
+static const StringListProvider k1WaitAmuletStringDOSCDItalianProvider = { ARRAYSIZE(k1WaitAmuletStringDOSCDItalian), k1WaitAmuletStringDOSCDItalian };
+
+static const char *const k1BlackJewelStringDOSCDItalian[1] = {
+ "E' un gioiello, ma perch""\x8A"" mai ""\x8A"" nero? "
+};
+
+static const StringListProvider k1BlackJewelStringDOSCDItalianProvider = { ARRAYSIZE(k1BlackJewelStringDOSCDItalian), k1BlackJewelStringDOSCDItalian };
+
+static const char *const k1HealingTipStringDOSCDItalian[1] = {
+ "Grande, mi pu""\x95"" essere utile in caso mi dovessi ferire"
+};
+
+static const StringListProvider k1HealingTipStringDOSCDItalianProvider = { ARRAYSIZE(k1HealingTipStringDOSCDItalian), k1HealingTipStringDOSCDItalian };
+
+static const char *const k1PoisonGoneStringDOSCDItalian[2] = {
+ "Grande!",
+ "L'effetto del veleno ""\x8A"" sparito! "
+};
+
+static const StringListProvider k1PoisonGoneStringDOSCDItalianProvider = { ARRAYSIZE(k1PoisonGoneStringDOSCDItalian), k1PoisonGoneStringDOSCDItalian };
+
+static const char *const k1ThePoisonStringsDOSCDItalian[4] = {
+ "Il veleno...",
+ "Non riesco a respirare... ",
+ "Non mi sento molto bene... ",
+ "\xAD""E' un serpente velenoso! "
+};
+
+static const StringListProvider k1ThePoisonStringsDOSCDItalianProvider = { ARRAYSIZE(k1ThePoisonStringsDOSCDItalian), k1ThePoisonStringsDOSCDItalian };
+
+static const char *const k1FluteStringsDOSCDItalian[2] = {
+ "Non ha un gran bel suono..",
+ "Quest'ultima nota era piuttosto ALTINA! "
+};
+
+static const StringListProvider k1FluteStringsDOSCDItalianProvider = { ARRAYSIZE(k1FluteStringsDOSCDItalian), k1FluteStringsDOSCDItalian };
+
+static const char *const k1WispJewelStringsDOSCDItalian[2] = {
+ "Non credo sia il caso in questo momento. ",
+ "Dovrei prima posare questo. "
+};
+
+static const StringListProvider k1WispJewelStringsDOSCDItalianProvider = { ARRAYSIZE(k1WispJewelStringsDOSCDItalian), k1WispJewelStringsDOSCDItalian };
+
+static const char *const k1MagicJewelStringsDOSCDItalian[1] = {
+ "Mi sento strano."
+};
+
+static const StringListProvider k1MagicJewelStringsDOSCDItalianProvider = { ARRAYSIZE(k1MagicJewelStringsDOSCDItalian), k1MagicJewelStringsDOSCDItalian };
+
+static const char *const k1FlaskFullStringDOSCDItalian[1] = {
+ "La Bottiglia ""\x8A"" gi""\xA0"" piena "
+};
+
+static const StringListProvider k1FlaskFullStringDOSCDItalianProvider = { ARRAYSIZE(k1FlaskFullStringDOSCDItalian), k1FlaskFullStringDOSCDItalian };
+
+static const char *const k1FullFlaskStringDOSCDItalian[4] = {
+ "La bottiglietta ""\x8A"" piena\rdi acqua gassata ",
+ "L'ampolla contiene acqua salata ",
+ "L'ampolla contiene acqua minerale ",
+ "Acqua magica"
+};
+
+static const StringListProvider k1FullFlaskStringDOSCDItalianProvider = { ARRAYSIZE(k1FullFlaskStringDOSCDItalian), k1FullFlaskStringDOSCDItalian };
+
+static const char *const k1OutroHomeStringDOSCDItalian[1] = {
+ "Casa "
+};
+
+static const StringListProvider k1OutroHomeStringDOSCDItalianProvider = { ARRAYSIZE(k1OutroHomeStringDOSCDItalian), k1OutroHomeStringDOSCDItalian };
+
+static const char *const k1VeryCleverStringDOSCDItalian[1] = {
+ "Intelligente! ma ""\x8A"" tutto inutile... "
+};
+
+static const StringListProvider k1VeryCleverStringDOSCDItalianProvider = { ARRAYSIZE(k1VeryCleverStringDOSCDItalian), k1VeryCleverStringDOSCDItalian };
+
+static const char *const k1GUIStringsDOSCDItalian[35] = {
+ "The Legend of Kyrandia",
+ "Caricare Gioco",
+ " Salvare Gioco ",
+ " Impostazioni ",
+ " Uscire ",
+ " Torna al Gioco ",
+ " Impostazioni ",
+ "Quale partita vuoi caricare? ",
+ "Seleziona una posizione: ",
+ "[ SPAZIO VUOTO ] ",
+ " Esci ",
+ "Immettere una descrizione per il gioco: ",
+ " OK ",
+ "Riposa in pace Brandon. ",
+ " Sei sicuro di voler uscire? ",
+ "XXXXXXXXXXXXXXXXX",
+ "XXXXXXXXXXXXXXXXX",
+ "XXXXXXXXXXXXXXXXX",
+ "XXXXXXXXXXXXXXXXX",
+ "XXXXXXXXXXXX",
+ "",
+ "",
+ "",
+ "",
+ "",
+ " Indietro ",
+ "ON ",
+ "OFF ",
+ "Si ",
+ "No ",
+ "?""\x0F"")+F""\x0F"")+L""\x0F"")+T""\x0F"")+[""\x0F"")+h""\x0F"")+y""\x0F"")+""\x89\x0F"")+""\x97\x0F"")+""\x9D\x0F"")+""\xA5\x0F"")+""\xAC\x0F"")+Velocit""\x85"" Camminata ",
+ "Velocit""\x85"" Testo ",
+ "Musica ",
+ "Effetti Sonori",
+ "Voce/Testo"
+};
+
+static const StringListProvider k1GUIStringsDOSCDItalianProvider = { ARRAYSIZE(k1GUIStringsDOSCDItalian), k1GUIStringsDOSCDItalian };
+
+static const char *const k1NewGameStringDOSCDItalian[1] = {
+ "[COMINCIARE UN NUOVO GIOCO] "
+};
+
+static const StringListProvider k1NewGameStringDOSCDItalianProvider = { ARRAYSIZE(k1NewGameStringDOSCDItalian), k1NewGameStringDOSCDItalian };
+
+static const char *const k1ConfigStringsDOSCDItalian[12] = {
+ "Lumaca",
+ "Lenta",
+ "Normale",
+ "Veloce",
+ "Molto Veloce",
+ "Solamente Testo ",
+ "Solamente Voce ",
+ "Voce e Testo ",
+ "Lenta",
+ "Normale",
+ "Veloce",
+ "Cliccabile "
+};
+
+static const StringListProvider k1ConfigStringsDOSCDItalianProvider = { ARRAYSIZE(k1ConfigStringsDOSCDItalian), k1ConfigStringsDOSCDItalian };
+
diff --git a/devtools/create_kyradat/resources/lok_dos_cddemo.h b/devtools/create_kyradat/resources/lok_dos_cddemo.h
new file mode 100644
index 0000000000..b2c4ce9863
--- /dev/null
+++ b/devtools/create_kyradat/resources/lok_dos_cddemo.h
@@ -0,0 +1,593 @@
+static const byte k1KallakWritingSeqDOSCDDemo[2053] = {
+ 0x00, 0x00, 0x01, 0x11, 0x1D, 0x1A, 0x00, 0x00,
+ 0x00, 0x3F, 0x01, 0xC7, 0x0C, 0x00, 0x0F, 0x00,
+ 0x24, 0x2B, 0x24, 0x2C, 0x24, 0x2D, 0x24, 0x2E,
+ 0x1C, 0x04, 0x02, 0x00, 0x00, 0x00, 0x00, 0x10,
+ 0x05, 0x00, 0x95, 0x00, 0x20, 0x0A, 0x17, 0x22,
+ 0x2B, 0x1E, 0x12, 0x2E, 0x02, 0x00, 0x01, 0x00,
+ 0x00, 0x10, 0x05, 0x01, 0x94, 0x00, 0x1B, 0x08,
+ 0x06, 0x00, 0x1B, 0x1D, 0x02, 0x00, 0x02, 0x00,
+ 0x00, 0x10, 0x05, 0x02, 0x93, 0x00, 0x14, 0x08,
+ 0x06, 0x00, 0x02, 0x00, 0x03, 0x00, 0x00, 0x10,
+ 0x05, 0x01, 0x90, 0x00, 0x1B, 0x08, 0x06, 0x00,
+ 0x02, 0x00, 0x04, 0x00, 0x00, 0x10, 0x05, 0x00,
+ 0x8D, 0x00, 0x20, 0x08, 0x06, 0x00, 0x1B, 0x1D,
+ 0x02, 0x00, 0x05, 0x00, 0x00, 0x10, 0x05, 0x01,
+ 0x8A, 0x00, 0x1B, 0x08, 0x06, 0x00, 0x02, 0x00,
+ 0x06, 0x00, 0x00, 0x10, 0x05, 0x02, 0x88, 0x00,
+ 0x14, 0x08, 0x06, 0x00, 0x1B, 0x1D, 0x02, 0x00,
+ 0x07, 0x00, 0x00, 0x10, 0x05, 0x01, 0x85, 0x00,
+ 0x1B, 0x08, 0x06, 0x00, 0x02, 0x00, 0x08, 0x00,
+ 0x00, 0x10, 0x05, 0x00, 0x82, 0x00, 0x20, 0x08,
+ 0x06, 0x00, 0x02, 0x00, 0x09, 0x00, 0x00, 0x10,
+ 0x05, 0x01, 0x7F, 0x00, 0x1B, 0x08, 0x06, 0x00,
+ 0x02, 0x00, 0x0A, 0x00, 0x00, 0x10, 0x05, 0x02,
+ 0x7C, 0x00, 0x14, 0x08, 0x06, 0x00, 0x1B, 0x1D,
+ 0x02, 0x00, 0x0B, 0x00, 0x00, 0x10, 0x05, 0x01,
+ 0x79, 0x00, 0x1B, 0x08, 0x06, 0x00, 0x02, 0x00,
+ 0x0C, 0x00, 0x00, 0x10, 0x05, 0x00, 0x76, 0x00,
+ 0x20, 0x08, 0x06, 0x00, 0x02, 0x00, 0x0D, 0x00,
+ 0x00, 0x10, 0x05, 0x01, 0x73, 0x00, 0x1B, 0x08,
+ 0x06, 0x00, 0x1B, 0x1D, 0x02, 0x00, 0x0E, 0x00,
+ 0x00, 0x10, 0x05, 0x02, 0x70, 0x00, 0x14, 0x08,
+ 0x06, 0x00, 0x02, 0x00, 0x0F, 0x00, 0x00, 0x10,
+ 0x05, 0x01, 0x6D, 0x00, 0x1B, 0x08, 0x06, 0x00,
+ 0x02, 0x00, 0x10, 0x00, 0x00, 0x10, 0x05, 0x00,
+ 0x6A, 0x00, 0x20, 0x08, 0x06, 0x00, 0x02, 0x00,
+ 0x11, 0x00, 0x00, 0x10, 0x05, 0x01, 0x67, 0x00,
+ 0x1B, 0x08, 0x06, 0x00, 0x1B, 0x1D, 0x02, 0x00,
+ 0x12, 0x00, 0x00, 0x10, 0x05, 0x02, 0x65, 0x00,
+ 0x14, 0x08, 0x06, 0x00, 0x02, 0x00, 0x13, 0x00,
+ 0x00, 0x10, 0x05, 0x01, 0x63, 0x00, 0x1B, 0x08,
+ 0x06, 0x00, 0x02, 0x00, 0x14, 0x00, 0x00, 0x10,
+ 0x05, 0x00, 0x63, 0x00, 0x20, 0x08, 0x06, 0x00,
+ 0x02, 0x00, 0x15, 0x00, 0x00, 0x10, 0x05, 0x00,
+ 0x65, 0x00, 0x1F, 0x08, 0x06, 0x00, 0x02, 0x00,
+ 0x16, 0x00, 0x00, 0x10, 0x05, 0x00, 0x6A, 0x00,
+ 0x1D, 0x08, 0x06, 0x00, 0x02, 0x00, 0x17, 0x00,
+ 0x00, 0x10, 0x05, 0x00, 0x70, 0x00, 0x19, 0x08,
+ 0x06, 0x00, 0x02, 0x00, 0x18, 0x00, 0x00, 0x10,
+ 0x05, 0x00, 0x76, 0x00, 0x17, 0x08, 0x06, 0x00,
+ 0x02, 0x00, 0x19, 0x00, 0x00, 0x10, 0x05, 0x00,
+ 0x7C, 0x00, 0x16, 0x08, 0x06, 0x00, 0x02, 0x00,
+ 0x1A, 0x00, 0x00, 0x10, 0x05, 0x00, 0x82, 0x00,
+ 0x17, 0x08, 0x06, 0x00, 0x02, 0x00, 0x1B, 0x00,
+ 0x00, 0x10, 0x05, 0x00, 0x88, 0x00, 0x19, 0x08,
+ 0x06, 0x00, 0x02, 0x00, 0x1C, 0x00, 0x00, 0x10,
+ 0x05, 0x00, 0x8D, 0x00, 0x1D, 0x08, 0x06, 0x00,
+ 0x02, 0x00, 0x1D, 0x00, 0x00, 0x10, 0x05, 0x00,
+ 0x93, 0x00, 0x1F, 0x08, 0x06, 0x00, 0x1F, 0x22,
+ 0x2C, 0x1E, 0x12, 0x2F, 0x02, 0x00, 0x01, 0x00,
+ 0x00, 0x10, 0x05, 0x01, 0x94, 0x00, 0x1B, 0x08,
+ 0x06, 0x00, 0x02, 0x00, 0x01, 0x00, 0x00, 0x10,
+ 0x05, 0x01, 0x94, 0x00, 0x1B, 0x08, 0x06, 0x00,
+ 0x1B, 0x1D, 0x02, 0x00, 0x02, 0x00, 0x00, 0x10,
+ 0x05, 0x02, 0x93, 0x00, 0x14, 0x08, 0x06, 0x00,
+ 0x02, 0x00, 0x02, 0x00, 0x00, 0x10, 0x05, 0x02,
+ 0x93, 0x00, 0x14, 0x08, 0x06, 0x00, 0x02, 0x00,
+ 0x03, 0x00, 0x00, 0x10, 0x05, 0x01, 0x90, 0x00,
+ 0x1B, 0x08, 0x06, 0x00, 0x02, 0x00, 0x04, 0x00,
+ 0x00, 0x10, 0x05, 0x00, 0x8D, 0x00, 0x20, 0x08,
+ 0x06, 0x00, 0x1B, 0x1D, 0x02, 0x00, 0x05, 0x00,
+ 0x00, 0x10, 0x05, 0x01, 0x8A, 0x00, 0x1B, 0x08,
+ 0x06, 0x00, 0x02, 0x00, 0x05, 0x00, 0x00, 0x10,
+ 0x05, 0x01, 0x8A, 0x00, 0x1B, 0x08, 0x06, 0x00,
+ 0x02, 0x00, 0x06, 0x00, 0x00, 0x10, 0x05, 0x02,
+ 0x88, 0x00, 0x14, 0x08, 0x06, 0x00, 0x1B, 0x1D,
+ 0x02, 0x00, 0x07, 0x00, 0x00, 0x10, 0x05, 0x01,
+ 0x85, 0x00, 0x1B, 0x08, 0x06, 0x00, 0x02, 0x00,
+ 0x08, 0x00, 0x00, 0x10, 0x05, 0x00, 0x82, 0x00,
+ 0x20, 0x08, 0x06, 0x00, 0x02, 0x00, 0x09, 0x00,
+ 0x00, 0x10, 0x05, 0x01, 0x7F, 0x00, 0x1B, 0x08,
+ 0x06, 0x00, 0x02, 0x00, 0x0A, 0x00, 0x00, 0x10,
+ 0x05, 0x02, 0x7C, 0x00, 0x14, 0x08, 0x06, 0x00,
+ 0x1B, 0x1D, 0x02, 0x00, 0x0B, 0x00, 0x00, 0x10,
+ 0x05, 0x01, 0x79, 0x00, 0x1B, 0x08, 0x06, 0x00,
+ 0x02, 0x00, 0x0C, 0x00, 0x00, 0x10, 0x05, 0x00,
+ 0x76, 0x00, 0x20, 0x08, 0x06, 0x00, 0x02, 0x00,
+ 0x0D, 0x00, 0x00, 0x10, 0x05, 0x01, 0x73, 0x00,
+ 0x1B, 0x08, 0x06, 0x00, 0x1B, 0x1D, 0x02, 0x00,
+ 0x0E, 0x00, 0x00, 0x10, 0x05, 0x02, 0x70, 0x00,
+ 0x14, 0x08, 0x06, 0x00, 0x02, 0x00, 0x0F, 0x00,
+ 0x00, 0x10, 0x05, 0x01, 0x6D, 0x00, 0x1B, 0x08,
+ 0x06, 0x00, 0x02, 0x00, 0x10, 0x00, 0x00, 0x10,
+ 0x05, 0x00, 0x6A, 0x00, 0x20, 0x08, 0x06, 0x00,
+ 0x02, 0x00, 0x11, 0x00, 0x00, 0x10, 0x05, 0x01,
+ 0x67, 0x00, 0x1B, 0x08, 0x06, 0x00, 0x1B, 0x1D,
+ 0x02, 0x00, 0x12, 0x00, 0x00, 0x10, 0x05, 0x02,
+ 0x65, 0x00, 0x14, 0x08, 0x06, 0x00, 0x02, 0x00,
+ 0x13, 0x00, 0x00, 0x10, 0x05, 0x01, 0x63, 0x00,
+ 0x1B, 0x08, 0x06, 0x00, 0x02, 0x00, 0x14, 0x00,
+ 0x00, 0x10, 0x05, 0x00, 0x63, 0x00, 0x20, 0x08,
+ 0x06, 0x00, 0x02, 0x00, 0x15, 0x00, 0x00, 0x10,
+ 0x05, 0x00, 0x65, 0x00, 0x1F, 0x08, 0x06, 0x00,
+ 0x02, 0x00, 0x16, 0x00, 0x00, 0x10, 0x05, 0x00,
+ 0x6A, 0x00, 0x1D, 0x08, 0x06, 0x00, 0x02, 0x00,
+ 0x17, 0x00, 0x00, 0x10, 0x05, 0x00, 0x70, 0x00,
+ 0x19, 0x08, 0x06, 0x00, 0x02, 0x00, 0x18, 0x00,
+ 0x00, 0x10, 0x05, 0x00, 0x76, 0x00, 0x17, 0x08,
+ 0x06, 0x00, 0x02, 0x00, 0x19, 0x00, 0x00, 0x10,
+ 0x05, 0x00, 0x7C, 0x00, 0x16, 0x08, 0x06, 0x00,
+ 0x02, 0x00, 0x1A, 0x00, 0x00, 0x10, 0x05, 0x00,
+ 0x82, 0x00, 0x17, 0x08, 0x06, 0x00, 0x02, 0x00,
+ 0x1B, 0x00, 0x00, 0x10, 0x05, 0x00, 0x88, 0x00,
+ 0x19, 0x08, 0x06, 0x00, 0x02, 0x00, 0x1C, 0x00,
+ 0x00, 0x10, 0x05, 0x00, 0x8D, 0x00, 0x1D, 0x08,
+ 0x06, 0x00, 0x02, 0x00, 0x1D, 0x00, 0x00, 0x10,
+ 0x05, 0x00, 0x93, 0x00, 0x1F, 0x08, 0x06, 0x00,
+ 0x1F, 0x22, 0x2D, 0x1E, 0x12, 0x30, 0x02, 0x00,
+ 0x01, 0x00, 0x00, 0x10, 0x05, 0x01, 0x94, 0x00,
+ 0x1B, 0x08, 0x06, 0x00, 0x02, 0x00, 0x01, 0x00,
+ 0x00, 0x10, 0x05, 0x01, 0x94, 0x00, 0x1B, 0x08,
+ 0x06, 0x00, 0x1B, 0x1D, 0x02, 0x00, 0x02, 0x00,
+ 0x00, 0x10, 0x05, 0x02, 0x93, 0x00, 0x14, 0x08,
+ 0x06, 0x00, 0x02, 0x00, 0x02, 0x00, 0x00, 0x10,
+ 0x05, 0x02, 0x93, 0x00, 0x14, 0x08, 0x06, 0x00,
+ 0x02, 0x00, 0x02, 0x00, 0x00, 0x10, 0x05, 0x02,
+ 0x93, 0x00, 0x14, 0x08, 0x06, 0x00, 0x02, 0x00,
+ 0x03, 0x00, 0x00, 0x10, 0x05, 0x01, 0x90, 0x00,
+ 0x1B, 0x08, 0x06, 0x00, 0x02, 0x00, 0x03, 0x00,
+ 0x00, 0x10, 0x05, 0x01, 0x90, 0x00, 0x1B, 0x08,
+ 0x06, 0x00, 0x02, 0x00, 0x04, 0x00, 0x00, 0x10,
+ 0x05, 0x00, 0x8D, 0x00, 0x20, 0x08, 0x06, 0x00,
+ 0x1B, 0x1D, 0x02, 0x00, 0x05, 0x00, 0x00, 0x10,
+ 0x05, 0x01, 0x8A, 0x00, 0x1B, 0x08, 0x06, 0x00,
+ 0x02, 0x00, 0x06, 0x00, 0x00, 0x10, 0x05, 0x02,
+ 0x88, 0x00, 0x14, 0x08, 0x06, 0x00, 0x1B, 0x1D,
+ 0x02, 0x00, 0x07, 0x00, 0x00, 0x10, 0x05, 0x01,
+ 0x85, 0x00, 0x1B, 0x08, 0x06, 0x00, 0x02, 0x00,
+ 0x08, 0x00, 0x00, 0x10, 0x05, 0x00, 0x82, 0x00,
+ 0x20, 0x08, 0x06, 0x00, 0x02, 0x00, 0x09, 0x00,
+ 0x00, 0x10, 0x05, 0x01, 0x7F, 0x00, 0x1B, 0x08,
+ 0x06, 0x00, 0x02, 0x00, 0x0A, 0x00, 0x00, 0x10,
+ 0x05, 0x02, 0x7C, 0x00, 0x14, 0x08, 0x06, 0x00,
+ 0x1B, 0x1D, 0x02, 0x00, 0x0B, 0x00, 0x00, 0x10,
+ 0x05, 0x01, 0x79, 0x00, 0x1B, 0x08, 0x06, 0x00,
+ 0x02, 0x00, 0x0C, 0x00, 0x00, 0x10, 0x05, 0x00,
+ 0x76, 0x00, 0x20, 0x08, 0x06, 0x00, 0x02, 0x00,
+ 0x0D, 0x00, 0x00, 0x10, 0x05, 0x01, 0x73, 0x00,
+ 0x1B, 0x08, 0x06, 0x00, 0x1B, 0x1D, 0x02, 0x00,
+ 0x0E, 0x00, 0x00, 0x10, 0x05, 0x02, 0x70, 0x00,
+ 0x14, 0x08, 0x06, 0x00, 0x02, 0x00, 0x0F, 0x00,
+ 0x00, 0x10, 0x05, 0x01, 0x6D, 0x00, 0x1B, 0x08,
+ 0x06, 0x00, 0x02, 0x00, 0x10, 0x00, 0x00, 0x10,
+ 0x05, 0x00, 0x6A, 0x00, 0x20, 0x08, 0x06, 0x00,
+ 0x02, 0x00, 0x11, 0x00, 0x00, 0x10, 0x05, 0x01,
+ 0x67, 0x00, 0x1B, 0x08, 0x06, 0x00, 0x1B, 0x1D,
+ 0x02, 0x00, 0x12, 0x00, 0x00, 0x10, 0x05, 0x02,
+ 0x65, 0x00, 0x14, 0x08, 0x06, 0x00, 0x02, 0x00,
+ 0x13, 0x00, 0x00, 0x10, 0x05, 0x01, 0x63, 0x00,
+ 0x1B, 0x08, 0x06, 0x00, 0x02, 0x00, 0x14, 0x00,
+ 0x00, 0x10, 0x05, 0x00, 0x63, 0x00, 0x20, 0x08,
+ 0x06, 0x00, 0x02, 0x00, 0x15, 0x00, 0x00, 0x10,
+ 0x05, 0x00, 0x65, 0x00, 0x1F, 0x08, 0x06, 0x00,
+ 0x02, 0x00, 0x16, 0x00, 0x00, 0x10, 0x05, 0x00,
+ 0x6A, 0x00, 0x1D, 0x08, 0x06, 0x00, 0x02, 0x00,
+ 0x17, 0x00, 0x00, 0x10, 0x05, 0x00, 0x70, 0x00,
+ 0x19, 0x08, 0x06, 0x00, 0x02, 0x00, 0x18, 0x00,
+ 0x00, 0x10, 0x05, 0x00, 0x76, 0x00, 0x17, 0x08,
+ 0x06, 0x00, 0x02, 0x00, 0x19, 0x00, 0x00, 0x10,
+ 0x05, 0x00, 0x7C, 0x00, 0x16, 0x08, 0x06, 0x00,
+ 0x02, 0x00, 0x1A, 0x00, 0x00, 0x10, 0x05, 0x00,
+ 0x82, 0x00, 0x17, 0x08, 0x06, 0x00, 0x02, 0x00,
+ 0x1B, 0x00, 0x00, 0x10, 0x05, 0x00, 0x88, 0x00,
+ 0x19, 0x08, 0x06, 0x00, 0x02, 0x00, 0x1C, 0x00,
+ 0x00, 0x10, 0x05, 0x00, 0x8D, 0x00, 0x1D, 0x08,
+ 0x06, 0x00, 0x02, 0x00, 0x1D, 0x00, 0x00, 0x10,
+ 0x05, 0x00, 0x93, 0x00, 0x1F, 0x08, 0x06, 0x00,
+ 0x1F, 0x07, 0x3C, 0x00, 0x22, 0x2E, 0x1E, 0x12,
+ 0x31, 0x02, 0x00, 0x00, 0x00, 0x00, 0x10, 0x05,
+ 0x00, 0x95, 0x00, 0x20, 0x08, 0x06, 0x00, 0x02,
+ 0x00, 0x00, 0x00, 0x00, 0x10, 0x05, 0x00, 0x95,
+ 0x00, 0x20, 0x08, 0x06, 0x00, 0x1B, 0x1D, 0x02,
+ 0x00, 0x01, 0x00, 0x00, 0x10, 0x05, 0x01, 0x94,
+ 0x00, 0x1B, 0x08, 0x06, 0x00, 0x02, 0x00, 0x01,
+ 0x00, 0x00, 0x10, 0x05, 0x01, 0x94, 0x00, 0x1B,
+ 0x08, 0x06, 0x00, 0x02, 0x00, 0x02, 0x00, 0x00,
+ 0x10, 0x05, 0x02, 0x93, 0x00, 0x14, 0x08, 0x06,
+ 0x00, 0x02, 0x00, 0x02, 0x00, 0x00, 0x10, 0x05,
+ 0x02, 0x93, 0x00, 0x14, 0x08, 0x06, 0x00, 0x1B,
+ 0x1D, 0x02, 0x00, 0x03, 0x00, 0x00, 0x10, 0x05,
+ 0x01, 0x90, 0x00, 0x1B, 0x08, 0x06, 0x00, 0x02,
+ 0x00, 0x04, 0x00, 0x00, 0x10, 0x05, 0x00, 0x8D,
+ 0x00, 0x20, 0x08, 0x06, 0x00, 0x02, 0x00, 0x05,
+ 0x00, 0x00, 0x10, 0x05, 0x01, 0x8A, 0x00, 0x1B,
+ 0x08, 0x06, 0x00, 0x1B, 0x1D, 0x02, 0x00, 0x06,
+ 0x00, 0x00, 0x10, 0x05, 0x02, 0x88, 0x00, 0x14,
+ 0x08, 0x06, 0x00, 0x02, 0x00, 0x07, 0x00, 0x00,
+ 0x10, 0x05, 0x01, 0x85, 0x00, 0x1B, 0x08, 0x06,
+ 0x00, 0x1B, 0x1D, 0x02, 0x00, 0x08, 0x00, 0x00,
+ 0x10, 0x05, 0x00, 0x82, 0x00, 0x20, 0x08, 0x06,
+ 0x00, 0x02, 0x00, 0x09, 0x00, 0x00, 0x10, 0x05,
+ 0x01, 0x7F, 0x00, 0x1B, 0x08, 0x06, 0x00, 0x02,
+ 0x00, 0x0A, 0x00, 0x00, 0x10, 0x05, 0x02, 0x7C,
+ 0x00, 0x14, 0x08, 0x06, 0x00, 0x1B, 0x1D, 0x02,
+ 0x00, 0x0B, 0x00, 0x00, 0x10, 0x05, 0x01, 0x79,
+ 0x00, 0x1B, 0x08, 0x06, 0x00, 0x02, 0x00, 0x0C,
+ 0x00, 0x00, 0x10, 0x05, 0x00, 0x76, 0x00, 0x20,
+ 0x08, 0x06, 0x00, 0x1B, 0x1D, 0x02, 0x00, 0x0D,
+ 0x00, 0x00, 0x10, 0x05, 0x01, 0x73, 0x00, 0x1B,
+ 0x08, 0x06, 0x00, 0x02, 0x00, 0x0E, 0x00, 0x00,
+ 0x10, 0x05, 0x02, 0x70, 0x00, 0x14, 0x08, 0x06,
+ 0x00, 0x02, 0x00, 0x0F, 0x00, 0x00, 0x10, 0x05,
+ 0x01, 0x6D, 0x00, 0x1B, 0x08, 0x06, 0x00, 0x1B,
+ 0x1D, 0x02, 0x00, 0x10, 0x00, 0x00, 0x10, 0x05,
+ 0x00, 0x6A, 0x00, 0x20, 0x08, 0x06, 0x00, 0x02,
+ 0x00, 0x11, 0x00, 0x00, 0x10, 0x05, 0x01, 0x67,
+ 0x00, 0x1B, 0x08, 0x06, 0x00, 0x1B, 0x1D, 0x02,
+ 0x00, 0x12, 0x00, 0x00, 0x10, 0x05, 0x02, 0x65,
+ 0x00, 0x14, 0x08, 0x06, 0x00, 0x07, 0x3C, 0x00,
+ 0x02, 0x00, 0x1E, 0x00, 0x00, 0x10, 0x09, 0x15,
+ 0x07, 0x1E, 0x00, 0x0B, 0x01, 0x02, 0x00, 0x1F,
+ 0x00, 0x00, 0x10, 0x08, 0x0A, 0x00, 0x02, 0x00,
+ 0x20, 0x00, 0x00, 0x10, 0x08, 0x0A, 0x00, 0x02,
+ 0x00, 0x21, 0x00, 0x00, 0x10, 0x08, 0x0A, 0x00,
+ 0x02, 0x00, 0x22, 0x00, 0x00, 0x10, 0x08, 0x0A,
+ 0x00, 0x0C, 0x01, 0x02, 0x00, 0x1B, 0x1F, 0x07,
+ 0x0A, 0x00, 0x02, 0x00, 0x23, 0x00, 0x00, 0x10,
+ 0x08, 0x14, 0x00, 0x1B, 0x1E, 0x02, 0x00, 0x24,
+ 0x00, 0x00, 0x10, 0x08, 0x14, 0x00, 0x02, 0x00,
+ 0x25, 0x00, 0x00, 0x10, 0x08, 0x14, 0x00, 0x1B,
+ 0x1F, 0x02, 0x00, 0x26, 0x00, 0x00, 0x10, 0x08,
+ 0x14, 0x00, 0x02, 0x00, 0x27, 0x00, 0x00, 0x10,
+ 0x08, 0x14, 0x00, 0x1B, 0x1E, 0x02, 0x00, 0x28,
+ 0x00, 0x00, 0x10, 0x09, 0x07, 0x3C, 0x00, 0x1B,
+ 0x1E, 0x03, 0x00, 0x08, 0x06, 0x00, 0x1B, 0x1E,
+ 0x03, 0x00, 0x08, 0x06, 0x00, 0x03, 0x00, 0x08,
+ 0x06, 0x00, 0x03, 0x00, 0x08, 0x06, 0x00, 0x03,
+ 0x00, 0x08, 0x06, 0x00, 0x03, 0x00, 0x08, 0x06,
+ 0x00, 0x03, 0x00, 0x08, 0x06, 0x00, 0x1B, 0x1E,
+ 0x03, 0x00, 0x08, 0x06, 0x00, 0x03, 0x00, 0x08,
+ 0x06, 0x00, 0x03, 0x00, 0x08, 0x06, 0x00, 0x03,
+ 0x00, 0x08, 0x06, 0x00, 0x03, 0x00, 0x08, 0x06,
+ 0x00, 0x03, 0x00, 0x08, 0x06, 0x00, 0x03, 0x00,
+ 0x08, 0x06, 0x00, 0x03, 0x00, 0x08, 0x06, 0x00,
+ 0x03, 0x00, 0x08, 0x06, 0x00, 0x1B, 0x1E, 0x03,
+ 0x00, 0x08, 0x06, 0x00, 0x03, 0x00, 0x08, 0x06,
+ 0x00, 0x03, 0x00, 0x08, 0x06, 0x00, 0x03, 0x00,
+ 0x08, 0x06, 0x00, 0x03, 0x00, 0x08, 0x06, 0x00,
+ 0x03, 0x00, 0x08, 0x06, 0x00, 0x03, 0x00, 0x08,
+ 0x06, 0x00, 0x03, 0x00, 0x08, 0x06, 0x00, 0x1B,
+ 0x1E, 0x03, 0x00, 0x08, 0x06, 0x00, 0x03, 0x00,
+ 0x08, 0x06, 0x00, 0x03, 0x00, 0x08, 0x06, 0x00,
+ 0x03, 0x00, 0x08, 0x06, 0x00, 0x03, 0x00, 0x08,
+ 0x06, 0x00, 0x03, 0x00, 0x08, 0x06, 0x00, 0x03,
+ 0x00, 0x08, 0x06, 0x00, 0x03, 0x00, 0x08, 0x06,
+ 0x00, 0x03, 0x00, 0x08, 0x06, 0x00, 0x03, 0x00,
+ 0x08, 0x06, 0x00, 0x16, 0x1F, 0x1C, 0x01, 0x07,
+ 0x3C, 0x00, 0x01, 0x00, 0x20
+};
+
+static const ByteProvider k1KallakWritingSeqDOSCDDemoProvider = { ARRAYSIZE(k1KallakWritingSeqDOSCDDemo), k1KallakWritingSeqDOSCDDemo };
+
+static const byte k1MalcolmTreeSeqDOSCDDemo[560] = {
+ 0x23, 0x00, 0x01, 0x00, 0x1D, 0x11, 0x24, 0x1C,
+ 0x24, 0x13, 0x24, 0x14, 0x24, 0x15, 0x24, 0x16,
+ 0x24, 0x17, 0x24, 0x19, 0x24, 0x1B, 0x1A, 0x00,
+ 0x00, 0x00, 0x3F, 0x01, 0xC7, 0x0C, 0x00, 0x0F,
+ 0x01, 0x10, 0x01, 0x0A, 0x02, 0x01, 0x00, 0x00,
+ 0x00, 0x10, 0x1C, 0x03, 0x0A, 0x1B, 0x1E, 0x17,
+ 0x1B, 0x1F, 0x0B, 0x00, 0x03, 0x01, 0x07, 0x06,
+ 0x00, 0x0C, 0x00, 0x1F, 0x00, 0x1B, 0x19, 0x0B,
+ 0x01, 0x03, 0x01, 0x07, 0x06, 0x00, 0x0C, 0x01,
+ 0x0D, 0x00, 0x22, 0x1C, 0x13, 0x1F, 0x50, 0x00,
+ 0x2D, 0x05, 0x03, 0x01, 0x07, 0x06, 0x00, 0x03,
+ 0x01, 0x07, 0x06, 0x00, 0x0B, 0x02, 0x03, 0x01,
+ 0x07, 0x06, 0x00, 0x0C, 0x02, 0x10, 0x00, 0x14,
+ 0x1B, 0x1F, 0x03, 0x01, 0x07, 0x06, 0x00, 0x03,
+ 0x01, 0x07, 0x06, 0x00, 0x03, 0x01, 0x07, 0x06,
+ 0x00, 0x1B, 0x24, 0x1B, 0x1F, 0x03, 0x01, 0x07,
+ 0x06, 0x00, 0x1B, 0x1E, 0x0B, 0x03, 0x03, 0x01,
+ 0x07, 0x06, 0x00, 0x0C, 0x03, 0x15, 0x00, 0x22,
+ 0x13, 0x13, 0x16, 0x50, 0x00, 0x2D, 0x05, 0x1B,
+ 0x1F, 0x0B, 0x04, 0x03, 0x01, 0x07, 0x04, 0x00,
+ 0x0C, 0x04, 0x08, 0x00, 0x02, 0x01, 0x64, 0x00,
+ 0x00, 0x10, 0x1B, 0x1A, 0x1B, 0x1E, 0x0B, 0x05,
+ 0x03, 0x01, 0x07, 0x04, 0x00, 0x0C, 0x05, 0x09,
+ 0x00, 0x14, 0x06, 0x3C, 0x00, 0x13, 0x17, 0x50,
+ 0x00, 0x2D, 0x05, 0x0B, 0x06, 0x03, 0x01, 0x07,
+ 0x04, 0x00, 0x0C, 0x06, 0x09, 0x00, 0x22, 0x14,
+ 0x07, 0x1E, 0x00, 0x0B, 0x06, 0x03, 0x01, 0x07,
+ 0x04, 0x00, 0x0C, 0x06, 0x09, 0x00, 0x1B, 0x1A,
+ 0x1B, 0x1F, 0x0B, 0x07, 0x03, 0x01, 0x07, 0x04,
+ 0x00, 0x0C, 0x07, 0x06, 0x00, 0x1B, 0x1E, 0x07,
+ 0x1E, 0x00, 0x22, 0x15, 0x13, 0x18, 0x50, 0x00,
+ 0x2D, 0x05, 0x03, 0x01, 0x07, 0x06, 0x00, 0x03,
+ 0x01, 0x07, 0x06, 0x00, 0x03, 0x01, 0x07, 0x06,
+ 0x00, 0x0B, 0x08, 0x04, 0x01, 0x07, 0x06, 0x00,
+ 0x04, 0x01, 0x07, 0x06, 0x00, 0x03, 0x01, 0x07,
+ 0x06, 0x00, 0x03, 0x01, 0x07, 0x06, 0x00, 0x0D,
+ 0x08, 0x01, 0x00, 0x03, 0x01, 0x07, 0x06, 0x00,
+ 0x06, 0x78, 0x00, 0x0B, 0x09, 0x03, 0x01, 0x07,
+ 0x06, 0x00, 0x0C, 0x09, 0x04, 0x00, 0x1B, 0x1B,
+ 0x0B, 0x0A, 0x03, 0x01, 0x07, 0x06, 0x00, 0x0C,
+ 0x0A, 0x09, 0x00, 0x06, 0x14, 0x00, 0x22, 0x16,
+ 0x13, 0x19, 0x50, 0x00, 0x2D, 0x05, 0x03, 0x01,
+ 0x07, 0x06, 0x00, 0x03, 0x01, 0x07, 0x06, 0x00,
+ 0x0B, 0x0B, 0x03, 0x01, 0x07, 0x06, 0x00, 0x04,
+ 0x01, 0x07, 0x06, 0x00, 0x04, 0x01, 0x07, 0x06,
+ 0x00, 0x03, 0x01, 0x07, 0x06, 0x00, 0x03, 0x01,
+ 0x07, 0x06, 0x00, 0x0C, 0x0B, 0x01, 0x00, 0x03,
+ 0x01, 0x07, 0x06, 0x00, 0x03, 0x01, 0x07, 0x06,
+ 0x00, 0x03, 0x01, 0x07, 0x06, 0x00, 0x22, 0x17,
+ 0x13, 0x1A, 0x50, 0x00, 0x2D, 0x05, 0x0B, 0x0C,
+ 0x03, 0x01, 0x07, 0x06, 0x00, 0x0C, 0x0C, 0x12,
+ 0x00, 0x03, 0x01, 0x01, 0x01, 0x14, 0x18, 0x00,
+ 0x02, 0x00, 0x02, 0x00, 0x02, 0x02, 0x00, 0x00,
+ 0x00, 0x10, 0x22, 0x19, 0x13, 0x1C, 0x50, 0x00,
+ 0x2D, 0x05, 0x06, 0x3C, 0x00, 0x03, 0x02, 0x03,
+ 0x02, 0x07, 0x06, 0x00, 0x14, 0x1B, 0x1C, 0x0B,
+ 0x0F, 0x03, 0x02, 0x07, 0x06, 0x00, 0x0C, 0x0F,
+ 0x0D, 0x00, 0x22, 0x1B, 0x13, 0x1D, 0x50, 0x00,
+ 0x2D, 0x05, 0x0B, 0x10, 0x03, 0x02, 0x07, 0x04,
+ 0x00, 0x03, 0x02, 0x07, 0x04, 0x00, 0x03, 0x02,
+ 0x07, 0x04, 0x00, 0x04, 0x02, 0x07, 0x04, 0x00,
+ 0x04, 0x02, 0x07, 0x04, 0x00, 0x04, 0x02, 0x07,
+ 0x04, 0x00, 0x0D, 0x10, 0x02, 0x00, 0x13, 0x1E,
+ 0x50, 0x00, 0x2D, 0x05, 0x0B, 0x11, 0x03, 0x02,
+ 0x07, 0x04, 0x00, 0x03, 0x02, 0x07, 0x04, 0x00,
+ 0x03, 0x02, 0x07, 0x04, 0x00, 0x04, 0x02, 0x07,
+ 0x04, 0x00, 0x04, 0x02, 0x07, 0x04, 0x00, 0x04,
+ 0x02, 0x07, 0x04, 0x00, 0x0D, 0x11, 0x01, 0x00,
+ 0x03, 0x02, 0x07, 0x04, 0x00, 0x07, 0xB4, 0x00,
+ 0x16, 0x1C, 0x01, 0x01, 0x01, 0x01, 0x02, 0x20
+};
+
+static const ByteProvider k1MalcolmTreeSeqDOSCDDemoProvider = { ARRAYSIZE(k1MalcolmTreeSeqDOSCDDemo), k1MalcolmTreeSeqDOSCDDemo };
+
+static const byte k1WestwoodLogoSeqDOSCDDemo[75] = {
+ 0x00, 0x03, 0x01, 0x1D, 0x02, 0x03, 0x00, 0x00,
+ 0x00, 0x00, 0x19, 0x01, 0x07, 0x06, 0x00, 0x07,
+ 0x3C, 0x00, 0x1B, 0x14, 0x0B, 0x00, 0x03, 0x03,
+ 0x19, 0x01, 0x0C, 0x00, 0x08, 0x00, 0x07, 0x3C,
+ 0x00, 0x1B, 0x27, 0x0B, 0x01, 0x03, 0x03, 0x19,
+ 0x01, 0x0C, 0x01, 0x0B, 0x00, 0x07, 0x78, 0x00,
+ 0x1B, 0x14, 0x02, 0x03, 0x0A, 0x00, 0x00, 0x00,
+ 0x19, 0x01, 0x07, 0x06, 0x00, 0x0B, 0x02, 0x04,
+ 0x03, 0x19, 0x01, 0x0C, 0x02, 0x09, 0x00, 0x16,
+ 0x01, 0x03, 0x20
+};
+
+static const ByteProvider k1WestwoodLogoSeqDOSCDDemoProvider = { ARRAYSIZE(k1WestwoodLogoSeqDOSCDDemo), k1WestwoodLogoSeqDOSCDDemo };
+
+static const byte k1KyrandiaLogoSeqDOSCDDemo[166] = {
+ 0x18, 0x00, 0x02, 0x00, 0x06, 0x01, 0x1D, 0x02,
+ 0x06, 0x00, 0x00, 0x00, 0x00, 0x19, 0x00, 0x07,
+ 0x06, 0x00, 0x19, 0x04, 0x03, 0x06, 0x19, 0x00,
+ 0x03, 0x06, 0x19, 0x00, 0x03, 0x06, 0x19, 0x00,
+ 0x03, 0x06, 0x19, 0x00, 0x03, 0x06, 0x19, 0x00,
+ 0x03, 0x06, 0x19, 0x00, 0x0B, 0x00, 0x03, 0x06,
+ 0x19, 0x00, 0x0C, 0x00, 0x06, 0x00, 0x03, 0x06,
+ 0x19, 0x00, 0x03, 0x06, 0x19, 0x00, 0x03, 0x06,
+ 0x19, 0x00, 0x03, 0x06, 0x19, 0x00, 0x03, 0x06,
+ 0x19, 0x00, 0x03, 0x06, 0x19, 0x00, 0x03, 0x06,
+ 0x19, 0x00, 0x03, 0x06, 0x19, 0x00, 0x1B, 0x27,
+ 0x0B, 0x01, 0x03, 0x06, 0x19, 0x00, 0x0C, 0x01,
+ 0x07, 0x00, 0x06, 0xF0, 0x00, 0x1B, 0x27, 0x0B,
+ 0x02, 0x04, 0x06, 0x19, 0x00, 0x0C, 0x02, 0x0F,
+ 0x00, 0x07, 0x78, 0x00, 0x07, 0xB4, 0x00, 0x24,
+ 0x37, 0x24, 0x38, 0x24, 0x39, 0x24, 0x3A, 0x24,
+ 0x3B, 0x24, 0x3C, 0x02, 0x06, 0x0D, 0x00, 0x00,
+ 0x00, 0x19, 0x00, 0x07, 0x06, 0x00, 0x07, 0x3C,
+ 0x00, 0x22, 0x1C, 0x1B, 0x14, 0x0B, 0x02, 0x04,
+ 0x06, 0x19, 0x00, 0x0C, 0x02, 0x0C, 0x00, 0x07,
+ 0x78, 0x00, 0x16, 0x01, 0x06, 0x20
+};
+
+static const ByteProvider k1KyrandiaLogoSeqDOSCDDemoProvider = { ARRAYSIZE(k1KyrandiaLogoSeqDOSCDDemo), k1KyrandiaLogoSeqDOSCDDemo };
+
+static const byte k1KallakMalcolmSeqDOSCDDemo[696] = {
+ 0x00, 0x04, 0x01, 0x1D, 0x24, 0x00, 0x24, 0x01,
+ 0x24, 0x02, 0x24, 0x0B, 0x24, 0x0C, 0x11, 0x1A,
+ 0x00, 0x00, 0x00, 0x3F, 0x01, 0xC7, 0x0C, 0x00,
+ 0x0F, 0x03, 0x10, 0x00, 0x1A, 0x00, 0x00, 0x88,
+ 0x3F, 0x01, 0xC7, 0x0C, 0x02, 0x1C, 0x00, 0x02,
+ 0x04, 0x00, 0x10, 0x00, 0x3A, 0x0A, 0x1C, 0x00,
+ 0x1C, 0x05, 0x17, 0x1B, 0x23, 0x0B, 0x00, 0x03,
+ 0x04, 0x08, 0x07, 0x00, 0x0C, 0x00, 0x23, 0x00,
+ 0x22, 0x00, 0x13, 0x02, 0x50, 0x00, 0x3A, 0x05,
+ 0x03, 0x04, 0x08, 0x07, 0x00, 0x03, 0x04, 0x08,
+ 0x07, 0x00, 0x0B, 0x01, 0x03, 0x04, 0x08, 0x0E,
+ 0x00, 0x0C, 0x01, 0x04, 0x00, 0x06, 0x3C, 0x00,
+ 0x22, 0x01, 0x13, 0x03, 0x50, 0x00, 0x3A, 0x05,
+ 0x0B, 0x02, 0x03, 0x04, 0x08, 0x06, 0x00, 0x0C,
+ 0x02, 0x18, 0x00, 0x06, 0x3C, 0x00, 0x22, 0x02,
+ 0x13, 0x04, 0x50, 0x00, 0x3A, 0x05, 0x0B, 0x03,
+ 0x03, 0x04, 0x08, 0x07, 0x00, 0x0C, 0x03, 0x0A,
+ 0x00, 0x06, 0x3C, 0x00, 0x24, 0x04, 0x24, 0x05,
+ 0x24, 0x03, 0x03, 0x04, 0x08, 0x07, 0x00, 0x03,
+ 0x04, 0x08, 0x07, 0x00, 0x22, 0x03, 0x13, 0x05,
+ 0xF0, 0x00, 0x3A, 0x0F, 0x03, 0x04, 0x08, 0x0A,
+ 0x00, 0x03, 0x04, 0x08, 0x0A, 0x00, 0x03, 0x04,
+ 0x08, 0x0A, 0x00, 0x03, 0x04, 0x08, 0x0A, 0x00,
+ 0x03, 0x04, 0x08, 0x0A, 0x00, 0x07, 0x1E, 0x00,
+ 0x22, 0x04, 0x13, 0x06, 0xF0, 0x00, 0x3A, 0x0F,
+ 0x0B, 0x04, 0x03, 0x04, 0x08, 0x05, 0x00, 0x0C,
+ 0x04, 0x12, 0x00, 0x07, 0x14, 0x00, 0x03, 0x04,
+ 0x08, 0x07, 0x00, 0x03, 0x04, 0x08, 0x07, 0x00,
+ 0x03, 0x04, 0x08, 0x07, 0x00, 0x06, 0x3C, 0x00,
+ 0x22, 0x05, 0x13, 0x07, 0xF0, 0x00, 0x3A, 0x0F,
+ 0x0B, 0x05, 0x03, 0x04, 0x08, 0x05, 0x00, 0x0C,
+ 0x05, 0x12, 0x00, 0x06, 0x3C, 0x00, 0x24, 0x06,
+ 0x03, 0x04, 0x08, 0x07, 0x00, 0x03, 0x04, 0x08,
+ 0x07, 0x00, 0x22, 0x06, 0x13, 0x08, 0x50, 0x00,
+ 0x3A, 0x05, 0x0B, 0x06, 0x03, 0x04, 0x08, 0x08,
+ 0x00, 0x0C, 0x06, 0x07, 0x00, 0x06, 0x3C, 0x00,
+ 0x24, 0x07, 0x03, 0x04, 0x08, 0x07, 0x00, 0x03,
+ 0x04, 0x08, 0x07, 0x00, 0x22, 0x07, 0x13, 0x09,
+ 0x50, 0x00, 0x3A, 0x05, 0x03, 0x04, 0x08, 0x07,
+ 0x00, 0x0B, 0x07, 0x03, 0x04, 0x08, 0x07, 0x00,
+ 0x0C, 0x07, 0x0A, 0x00, 0x06, 0x3C, 0x00, 0x22,
+ 0x08, 0x03, 0x04, 0x08, 0x07, 0x00, 0x13, 0x0A,
+ 0x50, 0x00, 0x3A, 0x05, 0x0B, 0x08, 0x03, 0x04,
+ 0x08, 0x07, 0x00, 0x0C, 0x08, 0x0F, 0x00, 0x06,
+ 0x3C, 0x00, 0x24, 0x0A, 0x22, 0x09, 0x13, 0x0B,
+ 0xF0, 0x00, 0x3A, 0x0F, 0x03, 0x04, 0x08, 0x07,
+ 0x00, 0x03, 0x04, 0x08, 0x07, 0x00, 0x03, 0x04,
+ 0x08, 0x07, 0x00, 0x03, 0x04, 0x08, 0x07, 0x00,
+ 0x03, 0x04, 0x08, 0x07, 0x00, 0x03, 0x04, 0x08,
+ 0x07, 0x00, 0x03, 0x04, 0x08, 0x07, 0x00, 0x03,
+ 0x04, 0x08, 0x07, 0x00, 0x03, 0x04, 0x08, 0x07,
+ 0x00, 0x07, 0x3C, 0x00, 0x22, 0x0A, 0x03, 0x04,
+ 0x08, 0x07, 0x00, 0x13, 0x0C, 0xF0, 0x00, 0x3A,
+ 0x0F, 0x0B, 0x09, 0x03, 0x04, 0x08, 0x05, 0x00,
+ 0x0C, 0x09, 0x0F, 0x00, 0x06, 0x3C, 0x00, 0x24,
+ 0x0B, 0x24, 0x0C, 0x24, 0x0D, 0x03, 0x04, 0x08,
+ 0x07, 0x00, 0x03, 0x04, 0x08, 0x07, 0x00, 0x03,
+ 0x04, 0x08, 0x07, 0x00, 0x03, 0x04, 0x08, 0x07,
+ 0x00, 0x03, 0x04, 0x08, 0x07, 0x00, 0x03, 0x04,
+ 0x08, 0x07, 0x00, 0x22, 0x0B, 0x13, 0x0D, 0x50,
+ 0x00, 0x3A, 0x05, 0x0B, 0x0A, 0x03, 0x04, 0x08,
+ 0x08, 0x00, 0x0C, 0x0A, 0x0E, 0x00, 0x06, 0x3C,
+ 0x00, 0x0B, 0x0B, 0x03, 0x04, 0x08, 0x07, 0x00,
+ 0x0C, 0x0B, 0x02, 0x00, 0x1B, 0x20, 0x0B, 0x0C,
+ 0x03, 0x04, 0x08, 0x07, 0x00, 0x0C, 0x0C, 0x06,
+ 0x00, 0x1B, 0x21, 0x0B, 0x0D, 0x03, 0x04, 0x08,
+ 0x07, 0x00, 0x0C, 0x0D, 0x0C, 0x00, 0x1B, 0x22,
+ 0x0B, 0x0E, 0x03, 0x04, 0x08, 0x07, 0x00, 0x0C,
+ 0x0E, 0x0B, 0x00, 0x22, 0x0C, 0x13, 0x0E, 0x50,
+ 0x00, 0x3A, 0x05, 0x0B, 0x0F, 0x03, 0x04, 0x08,
+ 0x07, 0x00, 0x0C, 0x0F, 0x09, 0x00, 0x06, 0x3C,
+ 0x00, 0x03, 0x04, 0x08, 0x07, 0x00, 0x22, 0x0D,
+ 0x13, 0x0F, 0x50, 0x00, 0x3A, 0x05, 0x0B, 0x10,
+ 0x03, 0x04, 0x08, 0x07, 0x00, 0x0C, 0x10, 0x09,
+ 0x00, 0x06, 0x3C, 0x00, 0x24, 0x0E, 0x24, 0x0F,
+ 0x03, 0x04, 0x08, 0x07, 0x00, 0x22, 0x0E, 0x13,
+ 0x10, 0x50, 0x00, 0x3A, 0x05, 0x0B, 0x11, 0x03,
+ 0x04, 0x08, 0x07, 0x00, 0x0C, 0x11, 0x0F, 0x00,
+ 0x06, 0x3C, 0x00, 0x03, 0x04, 0x08, 0x07, 0x00,
+ 0x22, 0x0F, 0x13, 0x11, 0x50, 0x00, 0x3A, 0x05,
+ 0x0B, 0x12, 0x03, 0x04, 0x08, 0x05, 0x00, 0x0C,
+ 0x12, 0x14, 0x00, 0x07, 0x3C, 0x00, 0x0B, 0x13,
+ 0x03, 0x04, 0x08, 0x07, 0x00, 0x0C, 0x13, 0x06,
+ 0x00, 0x1B, 0x23, 0x22, 0x1C, 0x0B, 0x13, 0x03,
+ 0x04, 0x08, 0x07, 0x00, 0x0C, 0x13, 0x06, 0x00,
+ 0x02, 0x04, 0x45, 0x10, 0x00, 0x3A, 0x14, 0x07,
+ 0x78, 0x00, 0x16, 0x1C, 0x01, 0x01, 0x04, 0x20
+};
+
+static const ByteProvider k1KallakMalcolmSeqDOSCDDemoProvider = { ARRAYSIZE(k1KallakMalcolmSeqDOSCDDemo), k1KallakMalcolmSeqDOSCDDemo };
+
+static const byte k1ForestSeqDOSCDDemo[627] = {
+ 0x00, 0x05, 0x01, 0x00, 0x07, 0x01, 0x1D, 0x02,
+ 0x07, 0x00, 0x00, 0x00, 0x08, 0x02, 0x05, 0x00,
+ 0x98, 0x00, 0x38, 0x0B, 0x00, 0x03, 0x07, 0x19,
+ 0x02, 0x07, 0x09, 0x00, 0x0C, 0x00, 0x0F, 0x00,
+ 0x22, 0x37, 0x03, 0x07, 0x19, 0x02, 0x07, 0x09,
+ 0x00, 0x03, 0x07, 0x19, 0x02, 0x07, 0x09, 0x00,
+ 0x03, 0x07, 0x19, 0x02, 0x07, 0x09, 0x00, 0x03,
+ 0x07, 0x19, 0x02, 0x07, 0x09, 0x00, 0x03, 0x07,
+ 0x19, 0x02, 0x07, 0x09, 0x00, 0x03, 0x07, 0x19,
+ 0x02, 0x07, 0x09, 0x00, 0x1B, 0x16, 0x03, 0x07,
+ 0x02, 0x05, 0x01, 0x98, 0x00, 0x38, 0x19, 0x02,
+ 0x19, 0x03, 0x07, 0x09, 0x00, 0x03, 0x07, 0x02,
+ 0x05, 0x03, 0x98, 0x00, 0x38, 0x19, 0x02, 0x19,
+ 0x03, 0x07, 0x09, 0x00, 0x03, 0x07, 0x02, 0x05,
+ 0x01, 0x98, 0x00, 0x38, 0x19, 0x02, 0x19, 0x03,
+ 0x07, 0x09, 0x00, 0x03, 0x07, 0x02, 0x05, 0x00,
+ 0x98, 0x00, 0x38, 0x19, 0x02, 0x19, 0x03, 0x07,
+ 0x09, 0x00, 0x03, 0x07, 0x19, 0x02, 0x07, 0x09,
+ 0x00, 0x03, 0x07, 0x19, 0x02, 0x07, 0x09, 0x00,
+ 0x03, 0x07, 0x19, 0x02, 0x07, 0x09, 0x00, 0x03,
+ 0x07, 0x19, 0x02, 0x07, 0x09, 0x00, 0x03, 0x07,
+ 0x19, 0x02, 0x07, 0x09, 0x00, 0x03, 0x07, 0x19,
+ 0x02, 0x07, 0x09, 0x00, 0x03, 0x07, 0x19, 0x02,
+ 0x07, 0x09, 0x00, 0x03, 0x07, 0x19, 0x02, 0x07,
+ 0x09, 0x00, 0x03, 0x07, 0x19, 0x02, 0x07, 0x09,
+ 0x00, 0x03, 0x07, 0x19, 0x02, 0x07, 0x09, 0x00,
+ 0x03, 0x07, 0x19, 0x02, 0x07, 0x09, 0x00, 0x22,
+ 0x38, 0x0B, 0x09, 0x03, 0x07, 0x19, 0x02, 0x07,
+ 0x09, 0x00, 0x0C, 0x09, 0x21, 0x00, 0x1B, 0x16,
+ 0x03, 0x07, 0x02, 0x05, 0x01, 0x98, 0x00, 0x38,
+ 0x19, 0x02, 0x19, 0x03, 0x07, 0x09, 0x00, 0x03,
+ 0x07, 0x02, 0x05, 0x03, 0x98, 0x00, 0x38, 0x19,
+ 0x02, 0x19, 0x03, 0x07, 0x09, 0x00, 0x03, 0x07,
+ 0x02, 0x05, 0x01, 0x98, 0x00, 0x38, 0x19, 0x02,
+ 0x19, 0x03, 0x07, 0x09, 0x00, 0x03, 0x07, 0x02,
+ 0x05, 0x04, 0x98, 0x00, 0x38, 0x19, 0x02, 0x19,
+ 0x03, 0x07, 0x09, 0x00, 0x03, 0x07, 0x19, 0x02,
+ 0x07, 0x09, 0x00, 0x22, 0x39, 0x03, 0x07, 0x19,
+ 0x02, 0x07, 0x09, 0x00, 0x03, 0x07, 0x02, 0x05,
+ 0x05, 0x98, 0x00, 0x38, 0x19, 0x02, 0x19, 0x03,
+ 0x07, 0x09, 0x00, 0x03, 0x07, 0x19, 0x02, 0x07,
+ 0x09, 0x00, 0x03, 0x07, 0x19, 0x02, 0x07, 0x09,
+ 0x00, 0x03, 0x07, 0x02, 0x05, 0x06, 0x98, 0x00,
+ 0x38, 0x19, 0x02, 0x19, 0x03, 0x07, 0x09, 0x00,
+ 0x03, 0x07, 0x19, 0x02, 0x07, 0x09, 0x00, 0x03,
+ 0x07, 0x19, 0x02, 0x07, 0x09, 0x00, 0x1B, 0x25,
+ 0x0B, 0x00, 0x03, 0x07, 0x03, 0x05, 0x19, 0x02,
+ 0x19, 0x03, 0x07, 0x09, 0x00, 0x0C, 0x00, 0x09,
+ 0x00, 0x0B, 0x06, 0x03, 0x07, 0x19, 0x02, 0x07,
+ 0x09, 0x00, 0x0C, 0x06, 0x0E, 0x00, 0x22, 0x3A,
+ 0x03, 0x07, 0x19, 0x02, 0x07, 0x09, 0x00, 0x03,
+ 0x07, 0x19, 0x02, 0x07, 0x09, 0x00, 0x03, 0x07,
+ 0x19, 0x02, 0x07, 0x09, 0x00, 0x03, 0x07, 0x19,
+ 0x02, 0x07, 0x09, 0x00, 0x1B, 0x17, 0x0B, 0x01,
+ 0x03, 0x07, 0x03, 0x05, 0x19, 0x02, 0x19, 0x03,
+ 0x07, 0x09, 0x00, 0x0C, 0x01, 0x0D, 0x00, 0x1B,
+ 0x25, 0x0B, 0x07, 0x03, 0x07, 0x19, 0x02, 0x07,
+ 0x09, 0x00, 0x0C, 0x07, 0x08, 0x00, 0x03, 0x07,
+ 0x19, 0x02, 0x07, 0x09, 0x00, 0x03, 0x07, 0x19,
+ 0x02, 0x07, 0x09, 0x00, 0x03, 0x07, 0x19, 0x02,
+ 0x07, 0x09, 0x00, 0x03, 0x07, 0x19, 0x02, 0x07,
+ 0x09, 0x00, 0x1B, 0x18, 0x03, 0x07, 0x03, 0x05,
+ 0x19, 0x02, 0x19, 0x03, 0x07, 0x09, 0x00, 0x22,
+ 0x3B, 0x03, 0x07, 0x03, 0x05, 0x19, 0x02, 0x19,
+ 0x03, 0x07, 0x09, 0x00, 0x03, 0x07, 0x03, 0x05,
+ 0x19, 0x02, 0x19, 0x03, 0x07, 0x09, 0x00, 0x03,
+ 0x07, 0x03, 0x05, 0x19, 0x02, 0x19, 0x03, 0x07,
+ 0x09, 0x00, 0x03, 0x07, 0x03, 0x05, 0x19, 0x02,
+ 0x19, 0x03, 0x07, 0x09, 0x00, 0x07, 0x12, 0x00,
+ 0x1B, 0x25, 0x0B, 0x02, 0x03, 0x07, 0x03, 0x05,
+ 0x19, 0x02, 0x19, 0x03, 0x07, 0x09, 0x00, 0x0C,
+ 0x02, 0x07, 0x00, 0x03, 0x07, 0x19, 0x02, 0x07,
+ 0x09, 0x00, 0x03, 0x07, 0x19, 0x02, 0x07, 0x09,
+ 0x00, 0x03, 0x07, 0x19, 0x02, 0x07, 0x09, 0x00,
+ 0x03, 0x07, 0x19, 0x02, 0x07, 0x09, 0x00, 0x03,
+ 0x07, 0x19, 0x02, 0x07, 0x09, 0x00, 0x22, 0x3C,
+ 0x0B, 0x03, 0x03, 0x07, 0x19, 0x02, 0x07, 0x09,
+ 0x00, 0x0C, 0x03, 0x23, 0x00, 0x16, 0x01, 0x07,
+ 0x01, 0x05, 0x20
+};
+
+static const ByteProvider k1ForestSeqDOSCDDemoProvider = { ARRAYSIZE(k1ForestSeqDOSCDDemo), k1ForestSeqDOSCDDemo };
+
+static const char *const k1IntroCPSStringsDOSCDDemo[2] = {
+ "gemcuti.cps",
+ "tree.cps"
+};
+
+static const StringListProvider k1IntroCPSStringsDOSCDDemoProvider = { ARRAYSIZE(k1IntroCPSStringsDOSCDDemo), k1IntroCPSStringsDOSCDDemo };
+
+static const char *const k1IntroCOLStringsDOSCDDemo[4] = {
+ "kallak.col",
+ "tree_exp.col",
+ "ww.col",
+ "mal-kal.col"
+};
+
+static const StringListProvider k1IntroCOLStringsDOSCDDemoProvider = { ARRAYSIZE(k1IntroCOLStringsDOSCDDemo), k1IntroCOLStringsDOSCDDemo };
+
+static const char *const k1IntroWSAStringsDOSCDDemo[11] = {
+ "kallak.wsa",
+ "tree1.wsa",
+ "tree2.wsa",
+ "westwood.wsa",
+ "mal-kal.wsa",
+ "destruct.wsa",
+ "kyrandia.wsa",
+ "shore.wsa",
+ "reunion.wsa",
+ "reuniont.wsa",
+ "latern.wsa"
+};
+
+static const StringListProvider k1IntroWSAStringsDOSCDDemoProvider = { ARRAYSIZE(k1IntroWSAStringsDOSCDDemo), k1IntroWSAStringsDOSCDDemo };
+
+static const char *const k1AudioTracksIntroDOSCDDemo[2] = {
+ "intro",
+ "intro"
+};
+
+static const StringListProvider k1AudioTracksIntroDOSCDDemoProvider = { ARRAYSIZE(k1AudioTracksIntroDOSCDDemo), k1AudioTracksIntroDOSCDDemo };
+
diff --git a/devtools/create_kyradat/resources/lok_dos_cddemo_english.h b/devtools/create_kyradat/resources/lok_dos_cddemo_english.h
new file mode 100644
index 0000000000..538bab63b3
--- /dev/null
+++ b/devtools/create_kyradat/resources/lok_dos_cddemo_english.h
@@ -0,0 +1,56 @@
+static const char *const k1IntroStringsDOSCDDemoEnglish[51] = {
+ "This is a text test - 1",
+ "This is a text test - 2",
+ "Greetings, Kallak...",
+ "...Powerful leader of the Royal Mystics!",
+ "Did I frighten you?",
+ "Malcolm!",
+ "I heard yesterday of your escape.",
+ "And have expected you before now.",
+ "Why would I rush?",
+ "I rule this land!",
+ "Your puny curse restrains me naught.",
+ "So, slay me now!",
+ "I have little magic left.",
+ "I mean to harm you, have no doubt...",
+ "...Now you are stone...",
+ "...Yet I leave your eyes.",
+ "I shed no tears for Kyrandia...",
+ "...But cannot deny you yours.",
+ "Malcolm the Jester has broken free!",
+ "He now controls the Kyragem...",
+ "...source of all magic in Kyrandia!",
+ "",
+ "How dare you trip ME!",
+ "But no, something special for you...",
+ "A humorous hex!",
+ "But I shall give fair warning.",
+ "Don't jump on THAT tree!",
+ "Don't climb up THAT tree little squirrel!",
+ "Boo!",
+ "Tis funnier that way...",
+ "...Is it not?",
+ "Ha ha ha...",
+ "Aren't fingers wonderful?",
+ "It's great to be alive!",
+ "Brandon!",
+ "Grandfather! We did it!",
+ "No! YOU did it!",
+ "Long live King Brandon!",
+ "Long live the Royal Mystics!",
+ "Now, let's go put Kyrandia back together!",
+ "Good idea!",
+ "As my first Royal Proclamation...",
+ "I name sandals as the official footwear of Kyrandia!",
+ "Well done, Brandon!",
+ "The Land no longer weeps...",
+ "And your friends have been restored!",
+ "Dear Brynn...",
+ "Malcolm has broken free!",
+ "Soon he will come for me.",
+ "Please help Brandon...",
+ ""
+};
+
+static const StringListProvider k1IntroStringsDOSCDDemoEnglishProvider = { ARRAYSIZE(k1IntroStringsDOSCDDemoEnglish), k1IntroStringsDOSCDDemoEnglish };
+
diff --git a/devtools/create_kyradat/resources/lok_dos_demo.h b/devtools/create_kyradat/resources/lok_dos_demo.h
new file mode 100644
index 0000000000..c8f09337de
--- /dev/null
+++ b/devtools/create_kyradat/resources/lok_dos_demo.h
@@ -0,0 +1,112 @@
+static const byte k1WestwoodLogoSeqDOSDemo[68] = {
+ 0x00, 0x02, 0x01, 0x02, 0x02, 0x00, 0x00, 0x00,
+ 0x00, 0x16, 0x01, 0x06, 0x06, 0x00, 0x06, 0x3C,
+ 0x00, 0x0A, 0x00, 0x03, 0x02, 0x16, 0x01, 0x0B,
+ 0x00, 0x08, 0x00, 0x06, 0x3C, 0x00, 0x0A, 0x01,
+ 0x03, 0x02, 0x16, 0x01, 0x0B, 0x01, 0x0B, 0x00,
+ 0x06, 0x78, 0x00, 0x02, 0x02, 0x0A, 0x00, 0x00,
+ 0x00, 0x16, 0x01, 0x06, 0x06, 0x00, 0x0A, 0x02,
+ 0x04, 0x02, 0x16, 0x01, 0x0B, 0x02, 0x09, 0x00,
+ 0x13, 0x01, 0x02, 0x1A
+};
+
+static const ByteProvider k1WestwoodLogoSeqDOSDemoProvider = { ARRAYSIZE(k1WestwoodLogoSeqDOSDemo), k1WestwoodLogoSeqDOSDemo };
+
+static const byte k1KyrandiaLogoSeqDOSDemo[84] = {
+ 0x15, 0x00, 0x02, 0x00, 0x05, 0x01, 0x02, 0x05,
+ 0x00, 0x00, 0x00, 0x00, 0x16, 0x00, 0x06, 0x06,
+ 0x00, 0x06, 0x3C, 0x00, 0x0A, 0x00, 0x03, 0x05,
+ 0x16, 0x00, 0x0B, 0x00, 0x0B, 0x00, 0x06, 0x3C,
+ 0x00, 0x0A, 0x01, 0x03, 0x05, 0x16, 0x00, 0x0B,
+ 0x01, 0x0F, 0x00, 0x06, 0x3C, 0x00, 0x0A, 0x02,
+ 0x04, 0x05, 0x16, 0x00, 0x0B, 0x02, 0x0F, 0x00,
+ 0x02, 0x05, 0x0D, 0x00, 0x00, 0x00, 0x16, 0x00,
+ 0x06, 0x06, 0x00, 0x06, 0x78, 0x00, 0x0A, 0x02,
+ 0x04, 0x05, 0x16, 0x00, 0x0B, 0x02, 0x0C, 0x00,
+ 0x13, 0x01, 0x05, 0x1A
+};
+
+static const ByteProvider k1KyrandiaLogoSeqDOSDemoProvider = { ARRAYSIZE(k1KyrandiaLogoSeqDOSDemo), k1KyrandiaLogoSeqDOSDemo };
+
+static const char *const k1IntroCPSStringsDOSDemo[1] = {
+ "mal-kal.cps"
+};
+
+static const StringListProvider k1IntroCPSStringsDOSDemoProvider = { ARRAYSIZE(k1IntroCPSStringsDOSDemo), k1IntroCPSStringsDOSDemo };
+
+static const char *const k1IntroCOLStringsDOSDemo[7] = {
+ "kallak.col",
+ "demo1.col",
+ "demo2.col",
+ "demo3.col",
+ "demo4.col",
+ "ww.col",
+ "mal-kal.col"
+};
+
+static const StringListProvider k1IntroCOLStringsDOSDemoProvider = { ARRAYSIZE(k1IntroCOLStringsDOSDemo), k1IntroCOLStringsDOSDemo };
+
+static const char *const k1IntroWSAStringsDOSDemo[7] = {
+ "kallak.wsa",
+ "demo1.wsa",
+ "westwood.wsa",
+ "demo2.wsa",
+ "demo3.wsa",
+ "kyrandia.wsa",
+ "demo4.wsa"
+};
+
+static const StringListProvider k1IntroWSAStringsDOSDemoProvider = { ARRAYSIZE(k1IntroWSAStringsDOSDemo), k1IntroWSAStringsDOSDemo };
+
+static const byte k1Demo1SeqDOSDemo[38] = {
+ 0x00, 0x01, 0x00, 0x0C, 0x01, 0x02, 0x01, 0x00,
+ 0x00, 0x00, 0x00, 0x09, 0x14, 0x06, 0x01, 0x00,
+ 0x06, 0x3C, 0x00, 0x0A, 0x00, 0x03, 0x01, 0x06,
+ 0x04, 0x00, 0x0B, 0x00, 0x19, 0x00, 0x06, 0x78,
+ 0x00, 0x13, 0x0E, 0x01, 0x01, 0x1A
+};
+
+static const ByteProvider k1Demo1SeqDOSDemoProvider = { ARRAYSIZE(k1Demo1SeqDOSDemo), k1Demo1SeqDOSDemo };
+
+static const byte k1Demo2SeqDOSDemo[35] = {
+ 0x00, 0x03, 0x00, 0x0C, 0x02, 0x02, 0x03, 0x00,
+ 0x00, 0x00, 0x00, 0x09, 0x14, 0x06, 0x01, 0x00,
+ 0x06, 0x3C, 0x00, 0x0A, 0x00, 0x03, 0x03, 0x06,
+ 0x04, 0x00, 0x0B, 0x00, 0x71, 0x00, 0x13, 0x0E,
+ 0x01, 0x03, 0x1A
+};
+
+static const ByteProvider k1Demo2SeqDOSDemoProvider = { ARRAYSIZE(k1Demo2SeqDOSDemo), k1Demo2SeqDOSDemo };
+
+static const byte k1Demo3SeqDOSDemo[89] = {
+ 0x00, 0x04, 0x00, 0x0C, 0x03, 0x02, 0x04, 0x00,
+ 0x00, 0x00, 0x00, 0x09, 0x14, 0x0A, 0x00, 0x03,
+ 0x04, 0x06, 0x07, 0x00, 0x03, 0x04, 0x06, 0x07,
+ 0x00, 0x02, 0x04, 0x00, 0x00, 0x00, 0x00, 0x06,
+ 0x07, 0x00, 0x0B, 0x00, 0x0E, 0x00, 0x03, 0x04,
+ 0x06, 0x07, 0x00, 0x03, 0x04, 0x06, 0x07, 0x00,
+ 0x0A, 0x01, 0x03, 0x04, 0x06, 0x07, 0x00, 0x0B,
+ 0x01, 0x0B, 0x00, 0x0A, 0x02, 0x02, 0x04, 0x0F,
+ 0x00, 0x00, 0x00, 0x06, 0x07, 0x00, 0x03, 0x04,
+ 0x06, 0x07, 0x00, 0x03, 0x04, 0x06, 0x07, 0x00,
+ 0x0B, 0x02, 0x13, 0x00, 0x13, 0x0E, 0x01, 0x04,
+ 0x1A
+};
+
+static const ByteProvider k1Demo3SeqDOSDemoProvider = { ARRAYSIZE(k1Demo3SeqDOSDemo), k1Demo3SeqDOSDemo };
+
+static const byte k1Demo4SeqDOSDemo[32] = {
+ 0x00, 0x06, 0x00, 0x0C, 0x04, 0x02, 0x06, 0x00,
+ 0x00, 0x00, 0x00, 0x09, 0x14, 0x0A, 0x00, 0x03,
+ 0x06, 0x06, 0x04, 0x00, 0x0B, 0x00, 0x39, 0x00,
+ 0x06, 0x5A, 0x00, 0x13, 0x0E, 0x01, 0x06, 0x1A
+};
+
+static const ByteProvider k1Demo4SeqDOSDemoProvider = { ARRAYSIZE(k1Demo4SeqDOSDemo), k1Demo4SeqDOSDemo };
+
+static const char *const k1AudioTracksIntroDOSDemo[1] = {
+ "intro"
+};
+
+static const StringListProvider k1AudioTracksIntroDOSDemoProvider = { ARRAYSIZE(k1AudioTracksIntroDOSDemo), k1AudioTracksIntroDOSDemo };
+
diff --git a/devtools/create_kyradat/resources/lok_dos_demo_english.h b/devtools/create_kyradat/resources/lok_dos_demo_english.h
new file mode 100644
index 0000000000..f974718856
--- /dev/null
+++ b/devtools/create_kyradat/resources/lok_dos_demo_english.h
@@ -0,0 +1,37 @@
+static const char *const k1IntroStringsDOSDemoEnglish[32] = {
+ "This is a text test - 1",
+ "This is a text test - 2",
+ "Greetings, Kallak,",
+ "Powerful leader of the Royal Mystics!",
+ "Did I frighten you?",
+ "Malcom!",
+ "I heard yesterday of your escape.",
+ "And have expected you before now.",
+ "Why would I rush?",
+ "I rule this land.",
+ "Your puny curse restrains me naught.",
+ "So, slay me now.",
+ "I have little magic left.",
+ "I mean to harm you, have no doubt,",
+ "Now you are stone,",
+ "Yet I leave your eyes.",
+ "I shed no tears for Kyrandia,",
+ "But cannot deny you yours.",
+ "Malcom the jester has broken free.",
+ "He now controls the Kyragem",
+ "source of all magic in Kyrandia.",
+ "",
+ "How dare you trip ME!",
+ "But no,...something special for you.",
+ "A humorous hex!",
+ "But, I am fair!",
+ "And I shall give fair warning!",
+ "Don't climb up THAT tree little squirrel!",
+ "Boo!",
+ "Tis funnier that way,",
+ "Is it not?",
+ "Ha ha ha..."
+};
+
+static const StringListProvider k1IntroStringsDOSDemoEnglishProvider = { ARRAYSIZE(k1IntroStringsDOSDemoEnglish), k1IntroStringsDOSDemoEnglish };
+
diff --git a/devtools/create_kyradat/resources/lok_dos_english.h b/devtools/create_kyradat/resources/lok_dos_english.h
new file mode 100644
index 0000000000..d53bad80af
--- /dev/null
+++ b/devtools/create_kyradat/resources/lok_dos_english.h
@@ -0,0 +1,335 @@
+static const char *const k1IntroStringsDOSEnglish[51] = {
+ "This is a text test - 1",
+ "This is a text test - 2",
+ "Greetings, Kallak...",
+ "...Powerful leader of the Royal Mystics!",
+ "Did I frighten you?",
+ "Malcolm!",
+ "I heard yesterday of your escape.",
+ "And have expected you before now.",
+ "Why would I rush?",
+ "I rule this land!",
+ "Your puny curse restrains me naught.",
+ "So, slay me now!",
+ "I have little magic left.",
+ "I mean to harm you, have no doubt...",
+ "...Now you are stone...",
+ "...Yet I leave your eyes.",
+ "I shed no tears for Kyrandia...",
+ "...But cannot deny you yours.",
+ "Malcolm the Jester has broken free!",
+ "He now controls the Kyragem...",
+ "...source of all magic in Kyrandia!",
+ "",
+ "How dare you trip ME!",
+ "But no, something special for you...",
+ "A humorous hex!",
+ "But I shall give fair warning.",
+ "Don't jump on THAT tree!",
+ "Don't climb up THAT tree little squirrel!",
+ "Boo!",
+ "Tis funnier that way...",
+ "...Is it not?",
+ "Ha ha ha...",
+ "Aren't fingers wonderful?",
+ "It's great to be alive!",
+ "Brandon!",
+ "Grandfather! We did it!",
+ "No! YOU did it!",
+ "Long live King Brandon!",
+ "Long live the Royal Mystics!",
+ "Now, let's go put Kyrandia back together!",
+ "Good idea!",
+ "As my first Royal Proclamation...",
+ "I name sandals as the official footwear of Kyrandia!",
+ "Well done, Brandon!",
+ "The Land no longer weeps...",
+ "And your friends have been restored!",
+ "Dear Brynn...",
+ "Malcolm has broken free!",
+ "Soon he will come for me.",
+ "Please help Brandon...",
+ ""
+};
+
+static const StringListProvider k1IntroStringsDOSEnglishProvider = { ARRAYSIZE(k1IntroStringsDOSEnglish), k1IntroStringsDOSEnglish };
+
+static const char *const k1ItemNamesDOSEnglish[107] = {
+ "Garnet",
+ "Amethyst",
+ "Aquamarine",
+ "Diamond",
+ "Emerald",
+ "Pearl",
+ "Ruby",
+ "Peridot",
+ "Sapphire",
+ "Opal",
+ "Topaz",
+ "Onyx",
+ "Sunstone",
+ "Moonstone",
+ "Rainbowstone",
+ "Lodestone",
+ "Rose",
+ "Tulip",
+ "Orchid",
+ "Silver Rose",
+ "Silver Statuette",
+ "Silver Coin",
+ "Gold Coin",
+ "Gold Ring",
+ "Royal Chalice",
+ "Pinecone",
+ "Acorn",
+ "Walnut",
+ "Everglowing Fireberries",
+ "Fireberries",
+ "Fireberries",
+ "Fireberries",
+ "Fireberries",
+ "Fireberries",
+ "Fish",
+ "Fish Bone",
+ "Mutton Leg",
+ "Bone",
+ "Apple",
+ "Apple Core",
+ "Blueberries",
+ "Mushroom",
+ "Note",
+ "Marble",
+ "Saw",
+ "Ankh",
+ "Feather",
+ "Egg",
+ "Leaf",
+ "Shamrock",
+ "Fallen Star",
+ "Crystal Ball",
+ "Teardrop",
+ "Mirror",
+ "Ice Shard",
+ "Flute",
+ "Hourglass",
+ "Iron Key",
+ "Jade Key",
+ "Obsidion Key",
+ "Red Potion",
+ "Red Potion",
+ "Blue Potion",
+ "Blue Potion",
+ "Yellow Potion",
+ "Yellow Potion",
+ "Green Potion",
+ "Orange Potion",
+ "Purple Potion",
+ "Potion of Rainbows",
+ "Fresh Water",
+ "Fresh Water",
+ "Salt Water",
+ "Salt Water",
+ "Mineral Water",
+ "Mineral Water",
+ "Magical Water",
+ "Magical Water",
+ "Empty Flask",
+ "Empty Flask",
+ "Scroll",
+ "Scroll",
+ "Scroll",
+ "Scroll",
+ "Scroll",
+ "Scroll",
+ "Scroll",
+ "Scroll",
+ "Scroll",
+ "Scroll",
+ "Parchment scrap",
+ "Parchment scrap",
+ "Parchment scrap",
+ "Parchment scrap",
+ "Parchment scrap",
+ "Red Magestone",
+ "Orange Magestone",
+ "Yellow Magestone",
+ "Green Magestone",
+ "Blue-Green Magestone",
+ "Blue Magestone",
+ "Purple Magestone",
+ "Heavy rock",
+ "Royal Crown",
+ "Royal Sceptre",
+ "Gold key",
+ "Unknown item"
+};
+
+static const StringListProvider k1ItemNamesDOSEnglishProvider = { ARRAYSIZE(k1ItemNamesDOSEnglish), k1ItemNamesDOSEnglish };
+
+static const char *const k1TakenStringsDOSEnglish[2] = {
+ " taken.",
+ " taken."
+};
+
+static const StringListProvider k1TakenStringsDOSEnglishProvider = { ARRAYSIZE(k1TakenStringsDOSEnglish), k1TakenStringsDOSEnglish };
+
+static const char *const k1PlacedStringsDOSEnglish[1] = {
+ " placed."
+};
+
+static const StringListProvider k1PlacedStringsDOSEnglishProvider = { ARRAYSIZE(k1PlacedStringsDOSEnglish), k1PlacedStringsDOSEnglish };
+
+static const char *const k1DroppedStringsDOSEnglish[1] = {
+ " dropped."
+};
+
+static const StringListProvider k1DroppedStringsDOSEnglishProvider = { ARRAYSIZE(k1DroppedStringsDOSEnglish), k1DroppedStringsDOSEnglish };
+
+static const char *const k1NoDropStringsDOSEnglish[2] = {
+ "You can't drop any more items in this scene.",
+ "You can't put that there."
+};
+
+static const StringListProvider k1NoDropStringsDOSEnglishProvider = { ARRAYSIZE(k1NoDropStringsDOSEnglish), k1NoDropStringsDOSEnglish };
+
+static const char *const k1PutDownStringDOSEnglish[1] = {
+ "Maybe I'd better put this down first."
+};
+
+static const StringListProvider k1PutDownStringDOSEnglishProvider = { ARRAYSIZE(k1PutDownStringDOSEnglish), k1PutDownStringDOSEnglish };
+
+static const char *const k1WaitAmuletStringDOSEnglish[1] = {
+ "I guess I'll have to wait for my Amulet to regain its power."
+};
+
+static const StringListProvider k1WaitAmuletStringDOSEnglishProvider = { ARRAYSIZE(k1WaitAmuletStringDOSEnglish), k1WaitAmuletStringDOSEnglish };
+
+static const char *const k1BlackJewelStringDOSEnglish[1] = {
+ "It's a jewel, but why is it black?"
+};
+
+static const StringListProvider k1BlackJewelStringDOSEnglishProvider = { ARRAYSIZE(k1BlackJewelStringDOSEnglish), k1BlackJewelStringDOSEnglish };
+
+static const char *const k1HealingTipStringDOSEnglish[1] = {
+ "Gee, this could come in handy if I get hurt."
+};
+
+static const StringListProvider k1HealingTipStringDOSEnglishProvider = { ARRAYSIZE(k1HealingTipStringDOSEnglish), k1HealingTipStringDOSEnglish };
+
+static const char *const k1PoisonGoneStringDOSEnglish[2] = {
+ "Amazing!",
+ "The effects of the poison are gone!"
+};
+
+static const StringListProvider k1PoisonGoneStringDOSEnglishProvider = { ARRAYSIZE(k1PoisonGoneStringDOSEnglish), k1PoisonGoneStringDOSEnglish };
+
+static const char *const k1ThePoisonStringsDOSEnglish[4] = {
+ "The poison...",
+ "I can't breathe...",
+ "I don't feel so good...",
+ "That snake must\rbe poisonous!"
+};
+
+static const StringListProvider k1ThePoisonStringsDOSEnglishProvider = { ARRAYSIZE(k1ThePoisonStringsDOSEnglish), k1ThePoisonStringsDOSEnglish };
+
+static const char *const k1FluteStringsDOSEnglish[2] = {
+ "Not very impressive sounding.",
+ "That last note sure was high!"
+};
+
+static const StringListProvider k1FluteStringsDOSEnglishProvider = { ARRAYSIZE(k1FluteStringsDOSEnglish), k1FluteStringsDOSEnglish };
+
+static const char *const k1WispJewelStringsDOSEnglish[3] = {
+ "I'm not really feeling up to it right now.",
+ "I probably should put down my ",
+ ", first."
+};
+
+static const StringListProvider k1WispJewelStringsDOSEnglishProvider = { ARRAYSIZE(k1WispJewelStringsDOSEnglish), k1WispJewelStringsDOSEnglish };
+
+static const char *const k1MagicJewelStringsDOSEnglish[1] = {
+ "That felt strange."
+};
+
+static const StringListProvider k1MagicJewelStringsDOSEnglishProvider = { ARRAYSIZE(k1MagicJewelStringsDOSEnglish), k1MagicJewelStringsDOSEnglish };
+
+static const char *const k1FlaskFullStringDOSEnglish[1] = {
+ "This flask is already full."
+};
+
+static const StringListProvider k1FlaskFullStringDOSEnglishProvider = { ARRAYSIZE(k1FlaskFullStringDOSEnglish), k1FlaskFullStringDOSEnglish };
+
+static const char *const k1FullFlaskStringDOSEnglish[4] = {
+ "The flask is now filled\rwith fresh, sparkling water.",
+ "The flask is now filled\rwith salt water.",
+ "The flask is now filled\rwith mineral water.",
+ "Magic water."
+};
+
+static const StringListProvider k1FullFlaskStringDOSEnglishProvider = { ARRAYSIZE(k1FullFlaskStringDOSEnglish), k1FullFlaskStringDOSEnglish };
+
+static const char *const k1OutroHomeStringDOSEnglish[1] = {
+ "Home"
+};
+
+static const StringListProvider k1OutroHomeStringDOSEnglishProvider = { ARRAYSIZE(k1OutroHomeStringDOSEnglish), k1OutroHomeStringDOSEnglish };
+
+static const char *const k1VeryCleverStringDOSEnglish[1] = {
+ "Very clever! But your feeble efforts are futile."
+};
+
+static const StringListProvider k1VeryCleverStringDOSEnglishProvider = { ARRAYSIZE(k1VeryCleverStringDOSEnglish), k1VeryCleverStringDOSEnglish };
+
+static const char *const k1GUIStringsDOSEnglish[28] = {
+ "The Legend of Kyrandia",
+ "Load a game",
+ "Save this game",
+ "Game controls",
+ "Quit playing",
+ "Resume game",
+ "Game Controls",
+ "Which game would you like to reload?",
+ "Select a position to save to:",
+ "[ EMPTY SLOT ]",
+ "Cancel",
+ "Enter a description of your saved game:",
+ "Save",
+ "Rest in peace, Brandon.",
+ "Are you sure you want to quit playing?",
+ "XXX",
+ "XXX",
+ "XXXXXXX",
+ "XXXXXXXXX",
+ "Main menu",
+ "on",
+ "off",
+ "Yes",
+ "No",
+ "\x80\x0E\xFF""*""\x88\x0E\xFF""*""\x8D\x0E\xFF""*""\x94\x0E\xFF""*""\x99\x0E\xFF""*""\xA1\x0E\xFF""*""\xA9\x0E\xFF""*""\xB0\x0E\xFF""*""\xB5\x0E\xFF""*Walk speed ",
+ "Text speed ",
+ "Music is ",
+ "Sounds are "
+};
+
+static const StringListProvider k1GUIStringsDOSEnglishProvider = { ARRAYSIZE(k1GUIStringsDOSEnglish), k1GUIStringsDOSEnglish };
+
+static const char *const k1NewGameStringDOSEnglish[1] = {
+ "[ START A NEW GAME ]"
+};
+
+static const StringListProvider k1NewGameStringDOSEnglishProvider = { ARRAYSIZE(k1NewGameStringDOSEnglish), k1NewGameStringDOSEnglish };
+
+static const char *const k1ConfigStringsDOSEnglish[9] = {
+ "slowest",
+ "slow",
+ "normal",
+ "fast",
+ "fastest",
+ "slowest",
+ "normal",
+ "fast",
+ "clickable"
+};
+
+static const StringListProvider k1ConfigStringsDOSEnglishProvider = { ARRAYSIZE(k1ConfigStringsDOSEnglish), k1ConfigStringsDOSEnglish };
+
diff --git a/devtools/create_kyradat/resources/lok_dos_french.h b/devtools/create_kyradat/resources/lok_dos_french.h
new file mode 100644
index 0000000000..c96652102c
--- /dev/null
+++ b/devtools/create_kyradat/resources/lok_dos_french.h
@@ -0,0 +1,341 @@
+static const char *const k1IntroStringsDOSFrench[51] = {
+ "This is a text test - 1",
+ "This is a text test - 2",
+ "Salut Kallak...",
+ "...Puissant Chef de l'Ordre des Mystiques Royaux!",
+ "Je t'ai fait peur?",
+ "Malcolm!",
+ "On m'a dit hier que tu t'""\x82""tais ""\x82""vad""\x82"".",
+ "Je t'attendais depuis longtemps.",
+ "Pourquoi me serais-je press""\x82""?",
+ "C'est moi qui gouverne ce pays!",
+ "Ton faible sort n'a pas d'effet sur moi.",
+ "Tue-moi maintenant!",
+ "Il ne me reste pas beaucoup de pouvoirs magiques.",
+ "Je veux te faire du mal, sois-en s""\x96""r...",
+ "...Maintenant, tu es transform""\x82"" en pierre...",
+ "...mais je te laisse tes yeux.",
+ "Je ne verse aucune larme pour Kyrandia...",
+ "...mais je ne peux pas te refuser les tiennes.",
+ "Malcolm le Bouffon est libre!",
+ "Il contr""\x93""le la Kyragemme maintenant...",
+ "...source de tous les pouvoirs magiques de Kyrandia!",
+ "",
+ "Comment oses-tu ME faire tr""\x82""bucher!",
+ "Mais non, quelque chose de sp""\x82""cial pour toi...",
+ "Un sort humoristique!",
+ "Mais je pr""\x82""viendrai.",
+ "Ne saute pas sur CET arbre!",
+ "Ne grimpe pas sur CET arbre, petit ""\x82""cureuil!",
+ "Hou!",
+ "C'est plus marrant comme ""\x87""a...",
+ "...n'est-ce pas?",
+ "Ha ha ha...",
+ "Les doigts ne sont-ils pas une chose merveilleuse?",
+ "C'est super d'""\x88""tre en vie!",
+ "Brandon!",
+ "Grand-P""\x8A""re! On y est arriv""\x82""!",
+ "Non! TU y es arriv""\x82""!",
+ "Longue vie au Roi Brandon!",
+ "Longue vie ""\x85"" l'Ordre des Mystiques Royaux!",
+ "Retournons mettre de l'ordre dans Kyrandia!",
+ "Bonne id""\x82""e!",
+ "En tant que Roi...",
+ "je d""\x82""clare que les sandales sont d""\x82""sormais les souliers officiels ""\x85"" Kyrandia!",
+ "Bien jou""\x82"", Brandon!",
+ "La Terre ne pleure plus...",
+ "Et tu as retrouv""\x82"" tes amis!",
+ "Ma Ch""\x8A""re Brynn...",
+ "Malcolm s'est ""\x82""vad""\x82""!",
+ "Il viendra me chercher bient""\x93""t.",
+ "S'il te pla""\x8C""t Brandon, aide-moi...",
+ ""
+};
+
+static const StringListProvider k1IntroStringsDOSFrenchProvider = { ARRAYSIZE(k1IntroStringsDOSFrench), k1IntroStringsDOSFrench };
+
+static const char *const k1ItemNamesDOSFrench[108] = {
+ "Grenat",
+ "Am""\x82""thyste",
+ "Aigue-marine",
+ "Diamant",
+ "Emeraude",
+ "Perle",
+ "Rubis",
+ "Olivine",
+ "Saphir",
+ "Opale",
+ "Topaze",
+ "Onyx",
+ "Aventurine",
+ "Pierre de Lune",
+ "Pierre d'Iris",
+ "Magn""\x82""tite",
+ "Rose",
+ "Tulipe",
+ "Orchid""\x82""e",
+ "Rose d'argent",
+ "Statuette d'argent",
+ "Pi""\x8A""ce d'argent",
+ "Pi""\x8A""ce d'or",
+ "Bague en or",
+ "Calice royal",
+ "Pomme de pin",
+ "Gland",
+ "Noix",
+ "Baie de feu luisantes",
+ "Baie de feu",
+ "Baie de feu",
+ "Baie de feu",
+ "Baie de feu",
+ "Baie de feu",
+ "Poisson",
+ "Ar""\x88""te",
+ "Gigot de mouton",
+ "Os",
+ "Pomme",
+ "Trognon de pomme",
+ "Myrtille",
+ "Champignon",
+ "Note",
+ "Bille",
+ "Scie",
+ "Croix ans""\x82""e",
+ "Plume",
+ "Oeuf",
+ "Feuille",
+ "Tr""\x8A""fle",
+ "Etoile bris""\x82""e",
+ "Boule de cristal",
+ "Larme",
+ "Miroir",
+ "Tesson de glace",
+ "Fl""\x96""te",
+ "Sablier",
+ "Cl""\x82"" m""\x82""tallique",
+ "Cl""\x82"" de jade",
+ "Cl""\x82"" obsidion",
+ "Potion rouge",
+ "Potion rouge",
+ "Potion bleue",
+ "Potion bleue",
+ "Potion jaune",
+ "Potion jaune",
+ "Potion verte",
+ "Potion orange",
+ "Potion violette",
+ "Potion d'arcs-en-ciel",
+ "Eau fraiche",
+ "Eau fraiche",
+ "Eau sal""\x82""e",
+ "Eau sal""\x82""e",
+ "Eau min""\x82""rale",
+ "Eau min""\x82""rale",
+ "Eau magique",
+ "Eau magique",
+ "Gourde vide",
+ "Gourde vide",
+ "Parchemin",
+ "Parchemin",
+ "Parchemin",
+ "Parchemin",
+ "Parchemin",
+ "Parchemin",
+ "Parchemin",
+ "Parchemin",
+ "Parchemin",
+ "Parchemin",
+ "Morceau de parchemin",
+ "Morceau de parchemin",
+ "Morceau de parchemin",
+ "Morceau de parchemin",
+ "Morceau de parchemin",
+ "Pierre magique rouge",
+ "Pierre magique orange",
+ "Pierre magique jaune",
+ "Pierre magique verte",
+ "Pierre magique turquoise",
+ "Pierre magique bleue",
+ "Pierre magique violette",
+ "Rocher lourd",
+ "Couronne royale",
+ "Sceptre royal",
+ "Cl""\x82"" en or",
+ "Objet inconnu",
+ ""
+};
+
+static const StringListProvider k1ItemNamesDOSFrenchProvider = { ARRAYSIZE(k1ItemNamesDOSFrench), k1ItemNamesDOSFrench };
+
+static const char *const k1TakenStringsDOSFrench[4] = {
+ " prise.",
+ " pris.",
+ " prise.",
+ " pris."
+};
+
+static const StringListProvider k1TakenStringsDOSFrenchProvider = { ARRAYSIZE(k1TakenStringsDOSFrench), k1TakenStringsDOSFrench };
+
+static const char *const k1PlacedStringsDOSFrench[2] = {
+ " plac""\x82""e.",
+ " plac""\x82""."
+};
+
+static const StringListProvider k1PlacedStringsDOSFrenchProvider = { ARRAYSIZE(k1PlacedStringsDOSFrench), k1PlacedStringsDOSFrench };
+
+static const char *const k1DroppedStringsDOSFrench[2] = {
+ " l""\x83""ch""\x82""e.",
+ " l""\x83""ch""\x82""."
+};
+
+static const StringListProvider k1DroppedStringsDOSFrenchProvider = { ARRAYSIZE(k1DroppedStringsDOSFrench), k1DroppedStringsDOSFrench };
+
+static const char *const k1NoDropStringsDOSFrench[2] = {
+ "Vous ne pouvez pas l""\x83""cher autre chose ici.",
+ "Vous ne pouvez pas mettre ""\x87""a l""\x85""."
+};
+
+static const StringListProvider k1NoDropStringsDOSFrenchProvider = { ARRAYSIZE(k1NoDropStringsDOSFrench), k1NoDropStringsDOSFrench };
+
+static const char *const k1PutDownStringDOSFrench[1] = {
+ "Il faudrait peut-""\x88""tre que je pose ""\x87""a d'abord."
+};
+
+static const StringListProvider k1PutDownStringDOSFrenchProvider = { ARRAYSIZE(k1PutDownStringDOSFrench), k1PutDownStringDOSFrench };
+
+static const char *const k1WaitAmuletStringDOSFrench[1] = {
+ "Je suppose qu'il me faut attendre que mon amulette retrouve son pouvoir."
+};
+
+static const StringListProvider k1WaitAmuletStringDOSFrenchProvider = { ARRAYSIZE(k1WaitAmuletStringDOSFrench), k1WaitAmuletStringDOSFrench };
+
+static const char *const k1BlackJewelStringDOSFrench[1] = {
+ "C'est un bijou, mais pourquoi est-il noir?"
+};
+
+static const StringListProvider k1BlackJewelStringDOSFrenchProvider = { ARRAYSIZE(k1BlackJewelStringDOSFrench), k1BlackJewelStringDOSFrench };
+
+static const char *const k1HealingTipStringDOSFrench[1] = {
+ "Hue, ""\x87""a pourrait bien m'""\x88""tre utile si je suis bless""\x82""."
+};
+
+static const StringListProvider k1HealingTipStringDOSFrenchProvider = { ARRAYSIZE(k1HealingTipStringDOSFrench), k1HealingTipStringDOSFrench };
+
+static const char *const k1PoisonGoneStringDOSFrench[3] = {
+ "G""\x82""nial!",
+ "Les effets du poison ont disparu!",
+ "MBL1ERREUR: Jeu sauvegard""\x82"" d'un autre produit."
+};
+
+static const StringListProvider k1PoisonGoneStringDOSFrenchProvider = { ARRAYSIZE(k1PoisonGoneStringDOSFrench), k1PoisonGoneStringDOSFrench };
+
+static const char *const k1ThePoisonStringsDOSFrench[4] = {
+ "Le poison...",
+ "Je ne peux plus respirer...",
+ "Je ne me sens pas tr""\x8A""s bien...",
+ "Ce serpent doit ""\x88""tre \rvenimeux!"
+};
+
+static const StringListProvider k1ThePoisonStringsDOSFrenchProvider = { ARRAYSIZE(k1ThePoisonStringsDOSFrench), k1ThePoisonStringsDOSFrench };
+
+static const char *const k1FluteStringsDOSFrench[2] = {
+ "\x80""a ne sonne pas tr""\x8A""s bien.",
+ "Cette derni""\x8A""re note ""\x82""tait vraiment aigue!"
+};
+
+static const StringListProvider k1FluteStringsDOSFrenchProvider = { ARRAYSIZE(k1FluteStringsDOSFrench), k1FluteStringsDOSFrench };
+
+static const char *const k1WispJewelStringsDOSFrench[3] = {
+ "Je ne m'en sens pas vraiment capable maintenant.",
+ "Je devrait poser mon, ma, mes ",
+ ", d'abord."
+};
+
+static const StringListProvider k1WispJewelStringsDOSFrenchProvider = { ARRAYSIZE(k1WispJewelStringsDOSFrench), k1WispJewelStringsDOSFrench };
+
+static const char *const k1MagicJewelStringsDOSFrench[1] = {
+ "C'""\x82""tait bizarre."
+};
+
+static const StringListProvider k1MagicJewelStringsDOSFrenchProvider = { ARRAYSIZE(k1MagicJewelStringsDOSFrench), k1MagicJewelStringsDOSFrench };
+
+static const char *const k1FlaskFullStringDOSFrench[1] = {
+ "Cette gourde est d""\x82""j""\x85"" pleine."
+};
+
+static const StringListProvider k1FlaskFullStringDOSFrenchProvider = { ARRAYSIZE(k1FlaskFullStringDOSFrench), k1FlaskFullStringDOSFrench };
+
+static const char *const k1FullFlaskStringDOSFrench[4] = {
+ "La gourde est remplie \rd'eau gazeuse fra""\x8C""che.",
+ "La gourde est remplie \rd'eau sal""\x82""e.",
+ "La gourde est remplie \rd'eau min""\x82""rale.",
+ "Eau magique."
+};
+
+static const StringListProvider k1FullFlaskStringDOSFrenchProvider = { ARRAYSIZE(k1FullFlaskStringDOSFrench), k1FullFlaskStringDOSFrench };
+
+static const char *const k1OutroHomeStringDOSFrench[1] = {
+ "Maison"
+};
+
+static const StringListProvider k1OutroHomeStringDOSFrenchProvider = { ARRAYSIZE(k1OutroHomeStringDOSFrench), k1OutroHomeStringDOSFrench };
+
+static const char *const k1VeryCleverStringDOSFrench[1] = {
+ "Malin! Mais vos efforts restent vains."
+};
+
+static const StringListProvider k1VeryCleverStringDOSFrenchProvider = { ARRAYSIZE(k1VeryCleverStringDOSFrench), k1VeryCleverStringDOSFrench };
+
+static const char *const k1GUIStringsDOSFrench[28] = {
+ "The Legend of Kyrandia",
+ "Charger un jeu",
+ "Sauvegarder ce jeu",
+ "Contr""\x93""les du jeu",
+ "Quitter le jeu",
+ "Reprendre le jeu",
+ "Contr""\x93""les du jeu",
+ "Quel jeu voulez-vous re-charger?",
+ "S""\x82""lectionnez une position o""\x97"" sauvegarder:",
+ "[ EMPLACEMENT VIDE ]",
+ "Annuler",
+ "Entrez description de votre jeu sauvegard""\x82"".",
+ "Sauvegarder",
+ "Repose en paix, Brandon.",
+ "Vous voulez vraiment quitter le jeu?",
+ "XXXXXXXXXXXXXXXXX",
+ "XXXXXXXXXXXXXXXXX",
+ "XXXXXXXXXXXXXXXXX",
+ "XXXXXXXXXXXXXXXXX",
+ "Menu principal",
+ "activ""\x82",
+ "d""\x82""sactiv""\x82",
+ "Oui",
+ "Non",
+ "6""\x0F""f+@""\x0F""f+E""\x0F""f+L""\x0F""f+S""\x0F""f+_""\x0F""f+i""\x0F""f+p""\x0F""f+w""\x0F""f+Vitesse de d""\x82""placement",
+ "Vitesse du texte",
+ "La musique est ",
+ "Les sons sont "
+};
+
+static const StringListProvider k1GUIStringsDOSFrenchProvider = { ARRAYSIZE(k1GUIStringsDOSFrench), k1GUIStringsDOSFrench };
+
+static const char *const k1NewGameStringDOSFrench[1] = {
+ "[ COMMENCER UN NOUVEAU JEU ]"
+};
+
+static const StringListProvider k1NewGameStringDOSFrenchProvider = { ARRAYSIZE(k1NewGameStringDOSFrench), k1NewGameStringDOSFrench };
+
+static const char *const k1ConfigStringsDOSFrench[9] = {
+ "plus lent",
+ "lent",
+ "normal",
+ "rapide",
+ "plus rapide",
+ "plus lent",
+ "normal",
+ "rapide",
+ "cliquable"
+};
+
+static const StringListProvider k1ConfigStringsDOSFrenchProvider = { ARRAYSIZE(k1ConfigStringsDOSFrench), k1ConfigStringsDOSFrench };
+
diff --git a/devtools/create_kyradat/resources/lok_dos_german.h b/devtools/create_kyradat/resources/lok_dos_german.h
new file mode 100644
index 0000000000..5a5e9cfd06
--- /dev/null
+++ b/devtools/create_kyradat/resources/lok_dos_german.h
@@ -0,0 +1,361 @@
+static const char *const k1IntroStringsDOSGerman[52] = {
+ "This is a text test - 1",
+ "This is a text test - 2",
+ "Sei gegr""\x81\xE1""t, Kallak...",
+ "...M""\x84""chtiger Anf""\x81""hrer der k""\x94""niglichen Mystiker!",
+ "Habe ich dich erschreckt?",
+ "Malcolm!",
+ "Ich habe gestern von deiner Flucht geh""\x94""rt.",
+ "Ich habe dich fr""\x81""her erwartet.",
+ "Warum sollte ich mich beeilen?",
+ "Ich herrsche ""\x81""ber dieses Land!",
+ "Dein mickriger Fluch h""\x84""lt mich nicht zur""\x81""ck.",
+ "So, erschlag mich doch!",
+ "Ich habe nur noch wenig Magie ""\x81""brig.",
+ "Ich werde dir zu Leibe r""\x81""cken, zweifle blo""\xE1"" nicht daran...",
+ "...du bist jetzt aus Stein...",
+ "...Ich lasse dir allein deine Augen.",
+ "F""\x81""r Kyrandia vergie""\xE1""e ich nicht eine Tr""\x84""ne...",
+ "...aber deine will ich dir nicht nehmen.",
+ "Malcolm der Hofnarr ist ausgebrochen!",
+ "Er beherrscht nun den Kyragem...",
+ "...die Quelle aller Magie in Kyrandia!",
+ "",
+ "Wie kannst du es wagen, MICH umzuwerfen!",
+ "Nicht doch, etwas Besonderes f""\x81""r dich...",
+ "Was f""\x81""r ein l""\x84""cherlicher Fluch!",
+ "Ich warne dich vorher.",
+ "Springe nicht auf DIESEN Baum!",
+ "Klettre nicht auf diesen Baum, kleines Eichh""\x94""rnchen!",
+ "Buuh!",
+ "So ist es viel lustiger...",
+ "...nicht wahr?",
+ "Ha ha ha...",
+ "Sind Finger nicht 'was Tolles?",
+ "Es ist gro""\xE1""artig, am Leben zu sein!",
+ "Brandon!",
+ "Gro""\xE1""vater! Wir haben es geschafft!",
+ "Nein! DU hast es geschafft!",
+ "Lang lebe K""\x94""nig Brandon!",
+ "Lang leben die k""\x94""niglichen Mystiker!",
+ "Bauen wir Kyrandia wieder auf!",
+ "Eine gute Idee!",
+ "Als meine erste k""\x94""nigliche Proklamation,...",
+ "...erkl""\x84""re ich Sandalen zur offiziellen Fu""\xE1""bekleidung Kyrandias!",
+ "Sehr weise, Brandon!",
+ "Das Land ist nicht l""\x84""nger in Trauer!",
+ "Und deine Freunde sind gerettet.",
+ "Liebe Brynn...",
+ "Malcolm ist ausgebrochen!",
+ "Er wird bald zu mir kommen.",
+ "Bitte hilf Brandon...",
+ "",
+ ""
+};
+
+static const StringListProvider k1IntroStringsDOSGermanProvider = { ARRAYSIZE(k1IntroStringsDOSGerman), k1IntroStringsDOSGerman };
+
+static const char *const k1ItemNamesDOSGerman[108] = {
+ "Granat",
+ "Amethyst",
+ "Aquamarin",
+ "Diamant",
+ "Smaragd",
+ "Perle",
+ "Rubin",
+ "Peridot",
+ "Saphir",
+ "Opal",
+ "Topas",
+ "Onyx",
+ "Sonnenstein",
+ "Mondstein",
+ "Regenbogenstein",
+ "Magnetstein",
+ "Rose",
+ "Tulpe",
+ "Orchidee",
+ "Silberne Rose",
+ "Silberne Statuette",
+ "Silberm""\x81""nze",
+ "Goldm""\x81""nze",
+ "Goldring",
+ "Der Kelch des K""\x94""nigs",
+ "Kienapfel",
+ "Eichel",
+ "Walnu""\xE1",
+ "Immerleuchtende Feuerbeeren",
+ "Feuerbeeren",
+ "Feuerbeeren",
+ "Feuerbeeren",
+ "Feuerbeeren",
+ "Feuerbeeren",
+ "Fisch",
+ "Fischgr""\x84""te",
+ "Hammelkeule",
+ "Knochen",
+ "Apfel",
+ "Apfelgriebsch",
+ "Heidelbeeren",
+ "Pilz",
+ "Notiz",
+ "Murmel",
+ "S""\x84""ge",
+ "Henkelkreuz",
+ "Feder",
+ "Ei",
+ "Blatt",
+ "Kleeblatt",
+ "Sternschnuppe",
+ "Kristallkugel",
+ "Tr""\x84""ne",
+ "Spiegel",
+ "Eisst""\x81""ck",
+ "Fl""\x94""te",
+ "Sanduhr",
+ "Eisenschl""\x81""ssel",
+ "Jadeschl""\x81""ssel",
+ "Obsidianschl""\x81""ssel",
+ "Roter Trank",
+ "Roter Trank",
+ "Blauer Trank",
+ "Blauer Trank",
+ "Gelber Trank",
+ "Gelber Trank",
+ "Gr""\x81""ner Trank",
+ "Oranger Trank",
+ "Violetter Trank",
+ "Regenbogentrank",
+ "S""\x81\xE1""wasser",
+ "S""\x81\xE1""wasser",
+ "Salzwasser",
+ "Salzwasser",
+ "Mineralwasser",
+ "Mineralwasser",
+ "Magisches Wasser",
+ "Magisches Wasser",
+ "Leere Flasche",
+ "Leere Flasche",
+ "Schriftrolle",
+ "Schriftrolle",
+ "Schriftrolle",
+ "Schriftrolle",
+ "Schriftrolle",
+ "Schriftrolle",
+ "Schriftrolle",
+ "Schriftrolle",
+ "Schriftrolle",
+ "Schriftrolle",
+ "Pergamentfetzen",
+ "Pergamentfetzen",
+ "Pergamentfetzen",
+ "Pergamentfetzen",
+ "Pergamentfetzen",
+ "Roter Weisenstein",
+ "Oranger Weisenstein",
+ "Gelber Weisenstein",
+ "Gr""\x81""ner Weisenstein",
+ "T""\x81""rkiser Weisenstein",
+ "Blauer Weisenstein",
+ "Violetter Weisenstein",
+ "Schwerer Stein",
+ "K""\x94""nigliche Krone",
+ "K""\x94""nigliches Zepter",
+ "Goldschl""\x81""ssel",
+ "Unbekannter Gegenstand",
+ ""
+};
+
+static const StringListProvider k1ItemNamesDOSGermanProvider = { ARRAYSIZE(k1ItemNamesDOSGerman), k1ItemNamesDOSGerman };
+
+static const char *const k1TakenStringsDOSGerman[2] = {
+ " aufgenommen.",
+ " aufgenommen."
+};
+
+static const StringListProvider k1TakenStringsDOSGermanProvider = { ARRAYSIZE(k1TakenStringsDOSGerman), k1TakenStringsDOSGerman };
+
+static const char *const k1PlacedStringsDOSGerman[1] = {
+ " abgelegt."
+};
+
+static const StringListProvider k1PlacedStringsDOSGermanProvider = { ARRAYSIZE(k1PlacedStringsDOSGerman), k1PlacedStringsDOSGerman };
+
+static const char *const k1DroppedStringsDOSGerman[1] = {
+ " fallengelassen."
+};
+
+static const StringListProvider k1DroppedStringsDOSGermanProvider = { ARRAYSIZE(k1DroppedStringsDOSGerman), k1DroppedStringsDOSGerman };
+
+static const char *const k1NoDropStringsDOSGerman[2] = {
+ "Hier kann nichts mehr abgelegt werden.",
+ "Das kann hier nicht abgelegt werden."
+};
+
+static const StringListProvider k1NoDropStringsDOSGermanProvider = { ARRAYSIZE(k1NoDropStringsDOSGerman), k1NoDropStringsDOSGerman };
+
+static const char *const k1PutDownStringDOSGerman[1] = {
+ "Vielleicht sollte ich es erst hinlegen."
+};
+
+static const StringListProvider k1PutDownStringDOSGermanProvider = { ARRAYSIZE(k1PutDownStringDOSGerman), k1PutDownStringDOSGerman };
+
+static const char *const k1WaitAmuletStringDOSGerman[1] = {
+ "I nehme an, ich mu""\xE1"" warten, bis mein Amulett seine Kraft wiedererlangt."
+};
+
+static const StringListProvider k1WaitAmuletStringDOSGermanProvider = { ARRAYSIZE(k1WaitAmuletStringDOSGerman), k1WaitAmuletStringDOSGerman };
+
+static const char *const k1BlackJewelStringDOSGerman[1] = {
+ "Es ist ein Edelstein, aber warum ist er schwarz?"
+};
+
+static const StringListProvider k1BlackJewelStringDOSGermanProvider = { ARRAYSIZE(k1BlackJewelStringDOSGerman), k1BlackJewelStringDOSGerman };
+
+static const char *const k1HealingTipStringDOSGerman[1] = {
+ "Mann, das kann ganz n""\x81""tzlich sein, falls ich mich verletze!"
+};
+
+static const StringListProvider k1HealingTipStringDOSGermanProvider = { ARRAYSIZE(k1HealingTipStringDOSGerman), k1HealingTipStringDOSGerman };
+
+static const char *const k1PoisonGoneStringDOSGerman[2] = {
+ "Erstaunlich!",
+ "Die Wirkung des Giftes hat nachgelassen!"
+};
+
+static const StringListProvider k1PoisonGoneStringDOSGermanProvider = { ARRAYSIZE(k1PoisonGoneStringDOSGerman), k1PoisonGoneStringDOSGerman };
+
+static const char *const k1ThePoisonStringsDOSGerman[4] = {
+ "Das Gift...",
+ "Ich kann nicht atmen...",
+ "Ich f""\x81""hle mich nicht besonders wohl...",
+ "Die Schlange mu""\xE1"" \rgiftig gewesen sein!"
+};
+
+static const StringListProvider k1ThePoisonStringsDOSGermanProvider = { ARRAYSIZE(k1ThePoisonStringsDOSGerman), k1ThePoisonStringsDOSGerman };
+
+static const char *const k1FluteStringsDOSGerman[2] = {
+ "Klingt nicht besonders beeindruckend.",
+ "Die letzte Note war hoch!"
+};
+
+static const StringListProvider k1FluteStringsDOSGermanProvider = { ARRAYSIZE(k1FluteStringsDOSGerman), k1FluteStringsDOSGerman };
+
+static const char *const k1WispJewelStringsDOSGerman[3] = {
+ "Im Moment f""\x81""hle ich mich dazu nicht in der Lage.",
+ "Ich mu""\xE1"" wahrscheinlich erst mein(e)...",
+ "ablegen."
+};
+
+static const StringListProvider k1WispJewelStringsDOSGermanProvider = { ARRAYSIZE(k1WispJewelStringsDOSGerman), k1WispJewelStringsDOSGerman };
+
+static const char *const k1MagicJewelStringsDOSGerman[1] = {
+ "Das war eigenartig."
+};
+
+static const StringListProvider k1MagicJewelStringsDOSGermanProvider = { ARRAYSIZE(k1MagicJewelStringsDOSGerman), k1MagicJewelStringsDOSGerman };
+
+static const char *const k1FlaskFullStringDOSGerman[1] = {
+ "Die Flasche ist bereits voll."
+};
+
+static const StringListProvider k1FlaskFullStringDOSGermanProvider = { ARRAYSIZE(k1FlaskFullStringDOSGerman), k1FlaskFullStringDOSGerman };
+
+static const char *const k1FullFlaskStringDOSGerman[4] = {
+ "Die Flasche ist jetzt mit \rfrischem, klarem Wasser gef""\x81""llt.",
+ "Die Flasche ist jetzt mit \rSalzwasser gef""\x81""llt.",
+ "Die Flasche ist jetzt mit \rMineralwasser gef""\x81""llt.",
+ "Magisches Wasser."
+};
+
+static const StringListProvider k1FullFlaskStringDOSGermanProvider = { ARRAYSIZE(k1FullFlaskStringDOSGerman), k1FullFlaskStringDOSGerman };
+
+static const char *const k1OutroHomeStringDOSGerman[1] = {
+ "Ab nach Hause"
+};
+
+static const StringListProvider k1OutroHomeStringDOSGermanProvider = { ARRAYSIZE(k1OutroHomeStringDOSGerman), k1OutroHomeStringDOSGerman };
+
+static const char *const k1VeryCleverStringDOSGerman[1] = {
+ "Sehr clever! Aber nichtige Versuche sind zum Scheitern verurteilt."
+};
+
+static const StringListProvider k1VeryCleverStringDOSGermanProvider = { ARRAYSIZE(k1VeryCleverStringDOSGerman), k1VeryCleverStringDOSGerman };
+
+static const char *const k1GUIStringsDOSGerman[52] = {
+ "Die Legende von Kyrandia",
+ "Ein Spiel laden",
+ "Dieses Spiel sichern",
+ "Spielsteuerungen",
+ "Spiel beenden",
+ "Spiel wieder aufnehmen",
+ "Spielsteuerungen",
+ "Welches Spiel soll noch einmal geladen werden?",
+ "W""\x84""hlen Sie den Platz zum Sichern aus.",
+ "[ LEERER PLATZ ]",
+ "Abbrechen",
+ "Beschreibung des gesicherten Spiels eingeben.",
+ "Sichern",
+ "Ruhe in Frieden, Brandon.",
+ "Soll das Spiel wirklich beendet werden?",
+ "XXXXX",
+ "",
+ "",
+ "",
+ "",
+ "",
+ "",
+ "",
+ "",
+ "",
+ "",
+ "",
+ "",
+ "XXXXX",
+ "",
+ "",
+ "",
+ "",
+ "",
+ "",
+ "",
+ "",
+ "",
+ "",
+ "",
+ "",
+ "XXXXXXXXXXXXXXXXX",
+ "XXXXXXXXXXXXXXXXX",
+ "Hauptmen""\x81",
+ "An",
+ "Aus",
+ "Ja",
+ "Nein",
+ "V""\x0F""R+e""\x0F""R+m""\x0F""R+t""\x0F""R+|""\x0F""R+""\x8B\x0F""R+""\x9A\x0F""R+""\xA1\x0F""R+""\xA9\x0F""R+Schrittempo",
+ "Textgeschwindigkeit",
+ "Die Musik ist",
+ "Die Soundeffekte sind"
+};
+
+static const StringListProvider k1GUIStringsDOSGermanProvider = { ARRAYSIZE(k1GUIStringsDOSGerman), k1GUIStringsDOSGerman };
+
+static const char *const k1NewGameStringDOSGerman[1] = {
+ "[ EIN NEUES SPIEL ANFANGEN ]"
+};
+
+static const StringListProvider k1NewGameStringDOSGermanProvider = { ARRAYSIZE(k1NewGameStringDOSGerman), k1NewGameStringDOSGerman };
+
+static const char *const k1ConfigStringsDOSGerman[9] = {
+ "am langsamsten",
+ "langsam",
+ "normal",
+ "schnell",
+ "am schnellsten",
+ "am langsamsten",
+ "normal",
+ "schnell",
+ "anklickbar"
+};
+
+static const StringListProvider k1ConfigStringsDOSGermanProvider = { ARRAYSIZE(k1ConfigStringsDOSGerman), k1ConfigStringsDOSGerman };
+
diff --git a/devtools/create_kyradat/resources/lok_dos_italian.h b/devtools/create_kyradat/resources/lok_dos_italian.h
new file mode 100644
index 0000000000..65991769e5
--- /dev/null
+++ b/devtools/create_kyradat/resources/lok_dos_italian.h
@@ -0,0 +1,366 @@
+static const char *const k1IntroStringsDOSItalian[50] = {
+ "This is a text test - 1",
+ "This is a text test - 2",
+ "Salute, Kallak...",
+ "...Potente capo dei Mistici reali!",
+ "Ti ho spaventato?",
+ "Malcolm!",
+ "Ieri ho saputo della tua fuga.",
+ "E ti aspettavo prima di adesso.",
+ "Perch""\x82"" affrettarmi?",
+ "Sono io che governo questa terra!",
+ "La tua gracile maledizione non mi ha trattenuto affatto.",
+ "Quindi, uccidimi adesso!",
+ "Mi ""\x8A"" rimasta poca magia.",
+ "Intendo danneggiarti, non ho dubbi...",
+ "...Adesso tu sei di pietra...",
+ "...tuttavia, lascio i tuoi occhi.",
+ "Non ho versato alcuna lacrima per Kyrandia...",
+ "Ma non posso negarti le tue.",
+ "Malcolm il buffone si ""\x8A"" liberato!",
+ "Adesso ha il controllo della GemmaKyra...",
+ "...fonte di tutta la magia in Kyrandia!",
+ "",
+ "Come osi farMi lo sgambetto?",
+ "Ma niente, qualcosa di speciale per te...",
+ "Un malocchio spassoso!",
+ "Dar""\x95"" un giusto avvertimento.",
+ "Non saltare su QUELL'albero!",
+ "Non salire su QUELL'albero piccolo scoiattolo!",
+ "Bo!",
+ "E' divertente in questo modo...",
+ "...non ""\x8A"" vero?",
+ "Ah ah ah...",
+ "Non sono fantastiche le dita?",
+ "E' meraviglioso essere vivo!",
+ "Brandon!",
+ "Nonno! Ce l'abbiamo fatta!",
+ "No! TU ce l'hai fatta!",
+ "Lunga vita a Re Brandon!",
+ "Lunga vita ai Mistici Reali!",
+ "Adesso, rimettiamo insieme Kyrandia!",
+ "Buona idea!",
+ "Come mia prima Proclamazione Reale...",
+ "Nomino i sandali la calzatura ufficiale di Kyrandia!",
+ "Ben fatto, Brandon!",
+ "La Terra non versa pi""\x97"" lacrime...",
+ "E i tuoi amici sono stati recuperati!",
+ "Caro Brynn...",
+ "Malcolm si ""\x8A"" liberato!",
+ "Presto mi verr""\x85"" a cercare.",
+ "Per favore aiuta Brandon..."
+};
+
+static const StringListProvider k1IntroStringsDOSItalianProvider = { ARRAYSIZE(k1IntroStringsDOSItalian), k1IntroStringsDOSItalian };
+
+static const char *const k1ItemNamesDOSItalian[107] = {
+ "Granito rosso",
+ "Ametista",
+ "Acquamarina",
+ "Diamante",
+ "Smeraldo",
+ "Perla",
+ "Rubino",
+ "Olivina",
+ "Zaffiro",
+ "Opale",
+ "Topazio",
+ "Onice",
+ "Pietra Solare",
+ "Pietra Lunare",
+ "Pietra-arcobaleno",
+ "Magnetite",
+ "Rosa",
+ "Tulipano",
+ "Orchidea",
+ "Rosa d'Argento",
+ "Statuetta d'Argento",
+ "Moneta d'Argento",
+ "Moneta d'Oro",
+ "Anello d'Oro",
+ "Calice Reale",
+ "Pigna",
+ "Ghianda",
+ "Noce",
+ "Baccheinfuocate Sempreardenti",
+ "Baccheinfuocate",
+ "Baccheinfuocate",
+ "Baccheinfuocate",
+ "Baccheinfuocate",
+ "Baccheinfuocate",
+ "Pesce",
+ "Lisca di Pesce",
+ "Zampa di Montone",
+ "Osso",
+ "Mela",
+ "Torsolo di Mela",
+ "Mirtilli",
+ "Fungo",
+ "Nota",
+ "Marmo",
+ "Sega",
+ "Croce ansata",
+ "Piuma",
+ "Uovo",
+ "Foglia",
+ "Trifoglio",
+ "Stella Cadente",
+ "Sfera di Cristallo",
+ "Lacrima",
+ "Specchio",
+ "Frammento di ghiaccio",
+ "Flauto",
+ "Clessidra",
+ "Chiave di Ferro",
+ "Chiave di Giada",
+ "Chiave di Ossidione",
+ "Pozione Rossa",
+ "Pozione Rossa",
+ "Pozione Azzurra",
+ "Pozione Azzurra",
+ "Pozione Gialla",
+ "Pozione Gialla",
+ "Pozione Verde",
+ "Pozione Arancione",
+ "Pozione viola",
+ "Pozione di Arcobaleni",
+ "Acqua Fresca",
+ "Acqua Fresca",
+ "Acqua Salata",
+ "Acqua Salata",
+ "Acqua Minerale",
+ "Acqua Minerale",
+ "Acqua Magica",
+ "Acqua Magica",
+ "Bottiglietta Vuota",
+ "Bottiglietta Vuota",
+ "Pergamena",
+ "Pergamena",
+ "Pergamena",
+ "Pergamena",
+ "Pergamena",
+ "Pergamena",
+ "Pergamena",
+ "Pergamena",
+ "Pergamena",
+ "Pergamena",
+ "Frammento di Pergamena",
+ "Frammento di Pergamena",
+ "Frammento di Pergamena",
+ "Frammento di Pergamena",
+ "Frammento di Pergamena",
+ "Pietramagica Rossa",
+ "Pietramagica Arancione",
+ "Pietramagica Gialla",
+ "Pietramagica Verde",
+ "Pietramagica Verde-Azzurra",
+ "Pietramagica Azzurra",
+ "Pietramagica Viola",
+ "Roccia Pesante",
+ "Corona Reale",
+ "Scettro Reale",
+ "Chiave d'oro",
+ "Articolo non conosciuto"
+};
+
+static const StringListProvider k1ItemNamesDOSItalianProvider = { ARRAYSIZE(k1ItemNamesDOSItalian), k1ItemNamesDOSItalian };
+
+static const char *const k1TakenStringsDOSItalian[2] = {
+ " - preso.",
+ " - preso."
+};
+
+static const StringListProvider k1TakenStringsDOSItalianProvider = { ARRAYSIZE(k1TakenStringsDOSItalian), k1TakenStringsDOSItalian };
+
+static const char *const k1PlacedStringsDOSItalian[1] = {
+ " - piazzato."
+};
+
+static const StringListProvider k1PlacedStringsDOSItalianProvider = { ARRAYSIZE(k1PlacedStringsDOSItalian), k1PlacedStringsDOSItalian };
+
+static const char *const k1DroppedStringsDOSItalian[1] = {
+ " - caduto."
+};
+
+static const StringListProvider k1DroppedStringsDOSItalianProvider = { ARRAYSIZE(k1DroppedStringsDOSItalian), k1DroppedStringsDOSItalian };
+
+static const char *const k1NoDropStringsDOSItalian[2] = {
+ "Qui, non ci puoi lasciare altri oggetti.",
+ "Non lo puoi mettere laggiu."
+};
+
+static const StringListProvider k1NoDropStringsDOSItalianProvider = { ARRAYSIZE(k1NoDropStringsDOSItalian), k1NoDropStringsDOSItalian };
+
+static const char *const k1PutDownStringDOSItalian[1] = {
+ "Forse prima sarebbe meglio che mettessi gi""\x97"" questo."
+};
+
+static const StringListProvider k1PutDownStringDOSItalianProvider = { ARRAYSIZE(k1PutDownStringDOSItalian), k1PutDownStringDOSItalian };
+
+static const char *const k1WaitAmuletStringDOSItalian[1] = {
+ "Suppongo che dovr""\x95"" aspettare che il mio Amuleto riacquisti il suo potere."
+};
+
+static const StringListProvider k1WaitAmuletStringDOSItalianProvider = { ARRAYSIZE(k1WaitAmuletStringDOSItalian), k1WaitAmuletStringDOSItalian };
+
+static const char *const k1BlackJewelStringDOSItalian[1] = {
+ "E' un gioiello, ma perch""\x82"" ""\x8A"" nero?"
+};
+
+static const StringListProvider k1BlackJewelStringDOSItalianProvider = { ARRAYSIZE(k1BlackJewelStringDOSItalian), k1BlackJewelStringDOSItalian };
+
+static const char *const k1HealingTipStringDOSItalian[1] = {
+ "Accidenti, questo potrebbe essere utile nel caso fossi ferito."
+};
+
+static const StringListProvider k1HealingTipStringDOSItalianProvider = { ARRAYSIZE(k1HealingTipStringDOSItalian), k1HealingTipStringDOSItalian };
+
+static const char *const k1PoisonGoneStringDOSItalian[2] = {
+ "Incredibile!",
+ "Gli effetti del veleno sono scomparsi!"
+};
+
+static const StringListProvider k1PoisonGoneStringDOSItalianProvider = { ARRAYSIZE(k1PoisonGoneStringDOSItalian), k1PoisonGoneStringDOSItalian };
+
+static const char *const k1ThePoisonStringsDOSItalian[4] = {
+ "Il veleno...",
+ "Non posso respirare...",
+ "Non mi sento molto bene...",
+ "Quel serpente deve\ressere velenoso!"
+};
+
+static const StringListProvider k1ThePoisonStringsDOSItalianProvider = { ARRAYSIZE(k1ThePoisonStringsDOSItalian), k1ThePoisonStringsDOSItalian };
+
+static const char *const k1FluteStringsDOSItalian[2] = {
+ "Un suono non molto impressionante.",
+ "Quell'ultima nota era sicuramente acuta!"
+};
+
+static const StringListProvider k1FluteStringsDOSItalianProvider = { ARRAYSIZE(k1FluteStringsDOSItalian), k1FluteStringsDOSItalian };
+
+static const char *const k1WispJewelStringsDOSItalian[3] = {
+ "Non mi sento effettivamente in grado di farlo, per adesso.",
+ "Probabilmente dovrei metter gi""\x97"" il mio",
+ ", per prima cosa."
+};
+
+static const StringListProvider k1WispJewelStringsDOSItalianProvider = { ARRAYSIZE(k1WispJewelStringsDOSItalian), k1WispJewelStringsDOSItalian };
+
+static const char *const k1MagicJewelStringsDOSItalian[1] = {
+ "Questo mi ""\x8A"" sembrato strano."
+};
+
+static const StringListProvider k1MagicJewelStringsDOSItalianProvider = { ARRAYSIZE(k1MagicJewelStringsDOSItalian), k1MagicJewelStringsDOSItalian };
+
+static const char *const k1FlaskFullStringDOSItalian[1] = {
+ "Questa bottiglietta ""\x8A"" gi""\x85"" piena."
+};
+
+static const StringListProvider k1FlaskFullStringDOSItalianProvider = { ARRAYSIZE(k1FlaskFullStringDOSItalian), k1FlaskFullStringDOSItalian };
+
+static const char *const k1FullFlaskStringDOSItalian[4] = {
+ "Adesso la bottiglietta ""\x8A"" riempita\rcon acqua fresca e gasata.",
+ "Adesso la bottiglietta ""\x8A"" riempita\rcon acqua salata.",
+ "Adesso la bottiglietta ""\x8A"" riempita\rcon acqua minerale.",
+ "Acqua magica."
+};
+
+static const StringListProvider k1FullFlaskStringDOSItalianProvider = { ARRAYSIZE(k1FullFlaskStringDOSItalian), k1FullFlaskStringDOSItalian };
+
+static const char *const k1OutroHomeStringDOSItalian[1] = {
+ "Casa"
+};
+
+static const StringListProvider k1OutroHomeStringDOSItalianProvider = { ARRAYSIZE(k1OutroHomeStringDOSItalian), k1OutroHomeStringDOSItalian };
+
+static const char *const k1VeryCleverStringDOSItalian[1] = {
+ "Molto intelligente! Ma i tuoi deboli sforzi sono vani."
+};
+
+static const StringListProvider k1VeryCleverStringDOSItalianProvider = { ARRAYSIZE(k1VeryCleverStringDOSItalian), k1VeryCleverStringDOSItalian };
+
+static const char *const k1GUIStringsDOSItalian[60] = {
+ "The Legend of Kyrandia",
+ "Carica un gioco",
+ "Salva questo gioco",
+ "Comandi di Gioco",
+ "Abbandona il gioco",
+ "Ricomincia il gioco",
+ "Comandi di gioco",
+ "Quale gioco desideri ricaricare?",
+ "Seleziona una posizione da salvare:",
+ "[ GRIGLIA VUOTA ]",
+ "Annulla",
+ "Inserisci descrizione del tuo gioco salvato:",
+ "Salva",
+ "Riposa in pace, Brandon.",
+ "Sei sicuro di voler abbandonare il gioco?",
+ "XXXXXXXXX",
+ "",
+ "",
+ "",
+ "",
+ "",
+ "",
+ "",
+ "",
+ "XXXXXXXXX",
+ "",
+ "",
+ "",
+ "",
+ "",
+ "",
+ "",
+ "",
+ "XXXXXXXXX",
+ "",
+ "",
+ "",
+ "",
+ "",
+ "",
+ "",
+ "",
+ "XXXXXXXXX",
+ "",
+ "",
+ "",
+ "",
+ "",
+ "",
+ "",
+ "",
+ "Menu principale",
+ "acceso",
+ "spento",
+ "Si",
+ "No",
+ "_""\x0F""T+k""\x0F""T+q""\x0F""T+y""\x0F""T+""\x80\x0F""T+""\x8D\x0F""T+""\x99\x0F""T+""\xA1\x0F""T+""\xA8\x0F""T+Velocit""\x85"" di movimento",
+ "Velocit""\x85"" del testo",
+ "Musica ""\x8A",
+ "Suoni sono"
+};
+
+static const StringListProvider k1GUIStringsDOSItalianProvider = { ARRAYSIZE(k1GUIStringsDOSItalian), k1GUIStringsDOSItalian };
+
+static const char *const k1NewGameStringDOSItalian[1] = {
+ "[ INIZIARE UN NUOVO GIOCO ]"
+};
+
+static const StringListProvider k1NewGameStringDOSItalianProvider = { ARRAYSIZE(k1NewGameStringDOSItalian), k1NewGameStringDOSItalian };
+
+static const char *const k1ConfigStringsDOSItalian[9] = {
+ "molto lento",
+ "lento",
+ "normale",
+ "veloce",
+ "molto veloce",
+ "molto lento",
+ "normale",
+ "veloce",
+ "cliccabile"
+};
+
+static const StringListProvider k1ConfigStringsDOSItalianProvider = { ARRAYSIZE(k1ConfigStringsDOSItalian), k1ConfigStringsDOSItalian };
+
diff --git a/devtools/create_kyradat/resources/lok_dos_oldfloppy.h b/devtools/create_kyradat/resources/lok_dos_oldfloppy.h
new file mode 100644
index 0000000000..e19cb5a6ef
--- /dev/null
+++ b/devtools/create_kyradat/resources/lok_dos_oldfloppy.h
@@ -0,0 +1,1911 @@
+static const byte k1KallakWritingSeqDOSOldFloppy[2037] = {
+ 0x00, 0x00, 0x01, 0x0E, 0x1A, 0x1B, 0x17, 0x00,
+ 0x00, 0x00, 0x3F, 0x01, 0xC7, 0x0C, 0x00, 0x0C,
+ 0x00, 0x19, 0x04, 0x02, 0x00, 0x00, 0x00, 0x00,
+ 0x10, 0x05, 0x00, 0x95, 0x00, 0x20, 0x09, 0x14,
+ 0x0F, 0x2E, 0x02, 0x00, 0x01, 0x00, 0x00, 0x10,
+ 0x05, 0x01, 0x94, 0x00, 0x1B, 0x07, 0x06, 0x00,
+ 0x18, 0x1D, 0x02, 0x00, 0x02, 0x00, 0x00, 0x10,
+ 0x05, 0x02, 0x93, 0x00, 0x14, 0x07, 0x06, 0x00,
+ 0x02, 0x00, 0x03, 0x00, 0x00, 0x10, 0x05, 0x01,
+ 0x90, 0x00, 0x1B, 0x07, 0x06, 0x00, 0x02, 0x00,
+ 0x04, 0x00, 0x00, 0x10, 0x05, 0x00, 0x8D, 0x00,
+ 0x20, 0x07, 0x06, 0x00, 0x18, 0x1D, 0x02, 0x00,
+ 0x05, 0x00, 0x00, 0x10, 0x05, 0x01, 0x8A, 0x00,
+ 0x1B, 0x07, 0x06, 0x00, 0x02, 0x00, 0x06, 0x00,
+ 0x00, 0x10, 0x05, 0x02, 0x88, 0x00, 0x14, 0x07,
+ 0x06, 0x00, 0x18, 0x1D, 0x02, 0x00, 0x07, 0x00,
+ 0x00, 0x10, 0x05, 0x01, 0x85, 0x00, 0x1B, 0x07,
+ 0x06, 0x00, 0x02, 0x00, 0x08, 0x00, 0x00, 0x10,
+ 0x05, 0x00, 0x82, 0x00, 0x20, 0x07, 0x06, 0x00,
+ 0x02, 0x00, 0x09, 0x00, 0x00, 0x10, 0x05, 0x01,
+ 0x7F, 0x00, 0x1B, 0x07, 0x06, 0x00, 0x02, 0x00,
+ 0x0A, 0x00, 0x00, 0x10, 0x05, 0x02, 0x7C, 0x00,
+ 0x14, 0x07, 0x06, 0x00, 0x18, 0x1D, 0x02, 0x00,
+ 0x0B, 0x00, 0x00, 0x10, 0x05, 0x01, 0x79, 0x00,
+ 0x1B, 0x07, 0x06, 0x00, 0x02, 0x00, 0x0C, 0x00,
+ 0x00, 0x10, 0x05, 0x00, 0x76, 0x00, 0x20, 0x07,
+ 0x06, 0x00, 0x02, 0x00, 0x0D, 0x00, 0x00, 0x10,
+ 0x05, 0x01, 0x73, 0x00, 0x1B, 0x07, 0x06, 0x00,
+ 0x18, 0x1D, 0x02, 0x00, 0x0E, 0x00, 0x00, 0x10,
+ 0x05, 0x02, 0x70, 0x00, 0x14, 0x07, 0x06, 0x00,
+ 0x02, 0x00, 0x0F, 0x00, 0x00, 0x10, 0x05, 0x01,
+ 0x6D, 0x00, 0x1B, 0x07, 0x06, 0x00, 0x02, 0x00,
+ 0x10, 0x00, 0x00, 0x10, 0x05, 0x00, 0x6A, 0x00,
+ 0x20, 0x07, 0x06, 0x00, 0x02, 0x00, 0x11, 0x00,
+ 0x00, 0x10, 0x05, 0x01, 0x67, 0x00, 0x1B, 0x07,
+ 0x06, 0x00, 0x18, 0x1D, 0x02, 0x00, 0x12, 0x00,
+ 0x00, 0x10, 0x05, 0x02, 0x65, 0x00, 0x14, 0x07,
+ 0x06, 0x00, 0x02, 0x00, 0x13, 0x00, 0x00, 0x10,
+ 0x05, 0x01, 0x63, 0x00, 0x1B, 0x07, 0x06, 0x00,
+ 0x02, 0x00, 0x14, 0x00, 0x00, 0x10, 0x05, 0x00,
+ 0x63, 0x00, 0x20, 0x07, 0x06, 0x00, 0x02, 0x00,
+ 0x15, 0x00, 0x00, 0x10, 0x05, 0x00, 0x65, 0x00,
+ 0x1F, 0x07, 0x06, 0x00, 0x02, 0x00, 0x16, 0x00,
+ 0x00, 0x10, 0x05, 0x00, 0x6A, 0x00, 0x1D, 0x07,
+ 0x06, 0x00, 0x02, 0x00, 0x17, 0x00, 0x00, 0x10,
+ 0x05, 0x00, 0x70, 0x00, 0x19, 0x07, 0x06, 0x00,
+ 0x02, 0x00, 0x18, 0x00, 0x00, 0x10, 0x05, 0x00,
+ 0x76, 0x00, 0x17, 0x07, 0x06, 0x00, 0x02, 0x00,
+ 0x19, 0x00, 0x00, 0x10, 0x05, 0x00, 0x7C, 0x00,
+ 0x16, 0x07, 0x06, 0x00, 0x02, 0x00, 0x1A, 0x00,
+ 0x00, 0x10, 0x05, 0x00, 0x82, 0x00, 0x17, 0x07,
+ 0x06, 0x00, 0x02, 0x00, 0x1B, 0x00, 0x00, 0x10,
+ 0x05, 0x00, 0x88, 0x00, 0x19, 0x07, 0x06, 0x00,
+ 0x02, 0x00, 0x1C, 0x00, 0x00, 0x10, 0x05, 0x00,
+ 0x8D, 0x00, 0x1D, 0x07, 0x06, 0x00, 0x02, 0x00,
+ 0x1D, 0x00, 0x00, 0x10, 0x05, 0x00, 0x93, 0x00,
+ 0x1F, 0x07, 0x06, 0x00, 0x1C, 0x1B, 0x0F, 0x2F,
+ 0x02, 0x00, 0x01, 0x00, 0x00, 0x10, 0x05, 0x01,
+ 0x94, 0x00, 0x1B, 0x07, 0x06, 0x00, 0x02, 0x00,
+ 0x01, 0x00, 0x00, 0x10, 0x05, 0x01, 0x94, 0x00,
+ 0x1B, 0x07, 0x06, 0x00, 0x18, 0x1D, 0x02, 0x00,
+ 0x02, 0x00, 0x00, 0x10, 0x05, 0x02, 0x93, 0x00,
+ 0x14, 0x07, 0x06, 0x00, 0x02, 0x00, 0x02, 0x00,
+ 0x00, 0x10, 0x05, 0x02, 0x93, 0x00, 0x14, 0x07,
+ 0x06, 0x00, 0x02, 0x00, 0x03, 0x00, 0x00, 0x10,
+ 0x05, 0x01, 0x90, 0x00, 0x1B, 0x07, 0x06, 0x00,
+ 0x02, 0x00, 0x04, 0x00, 0x00, 0x10, 0x05, 0x00,
+ 0x8D, 0x00, 0x20, 0x07, 0x06, 0x00, 0x18, 0x1D,
+ 0x02, 0x00, 0x05, 0x00, 0x00, 0x10, 0x05, 0x01,
+ 0x8A, 0x00, 0x1B, 0x07, 0x06, 0x00, 0x02, 0x00,
+ 0x05, 0x00, 0x00, 0x10, 0x05, 0x01, 0x8A, 0x00,
+ 0x1B, 0x07, 0x06, 0x00, 0x02, 0x00, 0x06, 0x00,
+ 0x00, 0x10, 0x05, 0x02, 0x88, 0x00, 0x14, 0x07,
+ 0x06, 0x00, 0x18, 0x1D, 0x02, 0x00, 0x07, 0x00,
+ 0x00, 0x10, 0x05, 0x01, 0x85, 0x00, 0x1B, 0x07,
+ 0x06, 0x00, 0x02, 0x00, 0x08, 0x00, 0x00, 0x10,
+ 0x05, 0x00, 0x82, 0x00, 0x20, 0x07, 0x06, 0x00,
+ 0x02, 0x00, 0x09, 0x00, 0x00, 0x10, 0x05, 0x01,
+ 0x7F, 0x00, 0x1B, 0x07, 0x06, 0x00, 0x02, 0x00,
+ 0x0A, 0x00, 0x00, 0x10, 0x05, 0x02, 0x7C, 0x00,
+ 0x14, 0x07, 0x06, 0x00, 0x18, 0x1D, 0x02, 0x00,
+ 0x0B, 0x00, 0x00, 0x10, 0x05, 0x01, 0x79, 0x00,
+ 0x1B, 0x07, 0x06, 0x00, 0x02, 0x00, 0x0C, 0x00,
+ 0x00, 0x10, 0x05, 0x00, 0x76, 0x00, 0x20, 0x07,
+ 0x06, 0x00, 0x02, 0x00, 0x0D, 0x00, 0x00, 0x10,
+ 0x05, 0x01, 0x73, 0x00, 0x1B, 0x07, 0x06, 0x00,
+ 0x18, 0x1D, 0x02, 0x00, 0x0E, 0x00, 0x00, 0x10,
+ 0x05, 0x02, 0x70, 0x00, 0x14, 0x07, 0x06, 0x00,
+ 0x02, 0x00, 0x0F, 0x00, 0x00, 0x10, 0x05, 0x01,
+ 0x6D, 0x00, 0x1B, 0x07, 0x06, 0x00, 0x02, 0x00,
+ 0x10, 0x00, 0x00, 0x10, 0x05, 0x00, 0x6A, 0x00,
+ 0x20, 0x07, 0x06, 0x00, 0x02, 0x00, 0x11, 0x00,
+ 0x00, 0x10, 0x05, 0x01, 0x67, 0x00, 0x1B, 0x07,
+ 0x06, 0x00, 0x18, 0x1D, 0x02, 0x00, 0x12, 0x00,
+ 0x00, 0x10, 0x05, 0x02, 0x65, 0x00, 0x14, 0x07,
+ 0x06, 0x00, 0x02, 0x00, 0x13, 0x00, 0x00, 0x10,
+ 0x05, 0x01, 0x63, 0x00, 0x1B, 0x07, 0x06, 0x00,
+ 0x02, 0x00, 0x14, 0x00, 0x00, 0x10, 0x05, 0x00,
+ 0x63, 0x00, 0x20, 0x07, 0x06, 0x00, 0x02, 0x00,
+ 0x15, 0x00, 0x00, 0x10, 0x05, 0x00, 0x65, 0x00,
+ 0x1F, 0x07, 0x06, 0x00, 0x02, 0x00, 0x16, 0x00,
+ 0x00, 0x10, 0x05, 0x00, 0x6A, 0x00, 0x1D, 0x07,
+ 0x06, 0x00, 0x02, 0x00, 0x17, 0x00, 0x00, 0x10,
+ 0x05, 0x00, 0x70, 0x00, 0x19, 0x07, 0x06, 0x00,
+ 0x02, 0x00, 0x18, 0x00, 0x00, 0x10, 0x05, 0x00,
+ 0x76, 0x00, 0x17, 0x07, 0x06, 0x00, 0x02, 0x00,
+ 0x19, 0x00, 0x00, 0x10, 0x05, 0x00, 0x7C, 0x00,
+ 0x16, 0x07, 0x06, 0x00, 0x02, 0x00, 0x1A, 0x00,
+ 0x00, 0x10, 0x05, 0x00, 0x82, 0x00, 0x17, 0x07,
+ 0x06, 0x00, 0x02, 0x00, 0x1B, 0x00, 0x00, 0x10,
+ 0x05, 0x00, 0x88, 0x00, 0x19, 0x07, 0x06, 0x00,
+ 0x02, 0x00, 0x1C, 0x00, 0x00, 0x10, 0x05, 0x00,
+ 0x8D, 0x00, 0x1D, 0x07, 0x06, 0x00, 0x02, 0x00,
+ 0x1D, 0x00, 0x00, 0x10, 0x05, 0x00, 0x93, 0x00,
+ 0x1F, 0x07, 0x06, 0x00, 0x1C, 0x1B, 0x0F, 0x30,
+ 0x02, 0x00, 0x01, 0x00, 0x00, 0x10, 0x05, 0x01,
+ 0x94, 0x00, 0x1B, 0x07, 0x06, 0x00, 0x02, 0x00,
+ 0x01, 0x00, 0x00, 0x10, 0x05, 0x01, 0x94, 0x00,
+ 0x1B, 0x07, 0x06, 0x00, 0x18, 0x1D, 0x02, 0x00,
+ 0x02, 0x00, 0x00, 0x10, 0x05, 0x02, 0x93, 0x00,
+ 0x14, 0x07, 0x06, 0x00, 0x02, 0x00, 0x02, 0x00,
+ 0x00, 0x10, 0x05, 0x02, 0x93, 0x00, 0x14, 0x07,
+ 0x06, 0x00, 0x02, 0x00, 0x02, 0x00, 0x00, 0x10,
+ 0x05, 0x02, 0x93, 0x00, 0x14, 0x07, 0x06, 0x00,
+ 0x02, 0x00, 0x03, 0x00, 0x00, 0x10, 0x05, 0x01,
+ 0x90, 0x00, 0x1B, 0x07, 0x06, 0x00, 0x02, 0x00,
+ 0x03, 0x00, 0x00, 0x10, 0x05, 0x01, 0x90, 0x00,
+ 0x1B, 0x07, 0x06, 0x00, 0x02, 0x00, 0x04, 0x00,
+ 0x00, 0x10, 0x05, 0x00, 0x8D, 0x00, 0x20, 0x07,
+ 0x06, 0x00, 0x18, 0x1D, 0x02, 0x00, 0x05, 0x00,
+ 0x00, 0x10, 0x05, 0x01, 0x8A, 0x00, 0x1B, 0x07,
+ 0x06, 0x00, 0x02, 0x00, 0x06, 0x00, 0x00, 0x10,
+ 0x05, 0x02, 0x88, 0x00, 0x14, 0x07, 0x06, 0x00,
+ 0x18, 0x1D, 0x02, 0x00, 0x07, 0x00, 0x00, 0x10,
+ 0x05, 0x01, 0x85, 0x00, 0x1B, 0x07, 0x06, 0x00,
+ 0x02, 0x00, 0x08, 0x00, 0x00, 0x10, 0x05, 0x00,
+ 0x82, 0x00, 0x20, 0x07, 0x06, 0x00, 0x02, 0x00,
+ 0x09, 0x00, 0x00, 0x10, 0x05, 0x01, 0x7F, 0x00,
+ 0x1B, 0x07, 0x06, 0x00, 0x02, 0x00, 0x0A, 0x00,
+ 0x00, 0x10, 0x05, 0x02, 0x7C, 0x00, 0x14, 0x07,
+ 0x06, 0x00, 0x18, 0x1D, 0x02, 0x00, 0x0B, 0x00,
+ 0x00, 0x10, 0x05, 0x01, 0x79, 0x00, 0x1B, 0x07,
+ 0x06, 0x00, 0x02, 0x00, 0x0C, 0x00, 0x00, 0x10,
+ 0x05, 0x00, 0x76, 0x00, 0x20, 0x07, 0x06, 0x00,
+ 0x02, 0x00, 0x0D, 0x00, 0x00, 0x10, 0x05, 0x01,
+ 0x73, 0x00, 0x1B, 0x07, 0x06, 0x00, 0x18, 0x1D,
+ 0x02, 0x00, 0x0E, 0x00, 0x00, 0x10, 0x05, 0x02,
+ 0x70, 0x00, 0x14, 0x07, 0x06, 0x00, 0x02, 0x00,
+ 0x0F, 0x00, 0x00, 0x10, 0x05, 0x01, 0x6D, 0x00,
+ 0x1B, 0x07, 0x06, 0x00, 0x02, 0x00, 0x10, 0x00,
+ 0x00, 0x10, 0x05, 0x00, 0x6A, 0x00, 0x20, 0x07,
+ 0x06, 0x00, 0x02, 0x00, 0x11, 0x00, 0x00, 0x10,
+ 0x05, 0x01, 0x67, 0x00, 0x1B, 0x07, 0x06, 0x00,
+ 0x18, 0x1D, 0x02, 0x00, 0x12, 0x00, 0x00, 0x10,
+ 0x05, 0x02, 0x65, 0x00, 0x14, 0x07, 0x06, 0x00,
+ 0x02, 0x00, 0x13, 0x00, 0x00, 0x10, 0x05, 0x01,
+ 0x63, 0x00, 0x1B, 0x07, 0x06, 0x00, 0x02, 0x00,
+ 0x14, 0x00, 0x00, 0x10, 0x05, 0x00, 0x63, 0x00,
+ 0x20, 0x07, 0x06, 0x00, 0x02, 0x00, 0x15, 0x00,
+ 0x00, 0x10, 0x05, 0x00, 0x65, 0x00, 0x1F, 0x07,
+ 0x06, 0x00, 0x02, 0x00, 0x16, 0x00, 0x00, 0x10,
+ 0x05, 0x00, 0x6A, 0x00, 0x1D, 0x07, 0x06, 0x00,
+ 0x02, 0x00, 0x17, 0x00, 0x00, 0x10, 0x05, 0x00,
+ 0x70, 0x00, 0x19, 0x07, 0x06, 0x00, 0x02, 0x00,
+ 0x18, 0x00, 0x00, 0x10, 0x05, 0x00, 0x76, 0x00,
+ 0x17, 0x07, 0x06, 0x00, 0x02, 0x00, 0x19, 0x00,
+ 0x00, 0x10, 0x05, 0x00, 0x7C, 0x00, 0x16, 0x07,
+ 0x06, 0x00, 0x02, 0x00, 0x1A, 0x00, 0x00, 0x10,
+ 0x05, 0x00, 0x82, 0x00, 0x17, 0x07, 0x06, 0x00,
+ 0x02, 0x00, 0x1B, 0x00, 0x00, 0x10, 0x05, 0x00,
+ 0x88, 0x00, 0x19, 0x07, 0x06, 0x00, 0x02, 0x00,
+ 0x1C, 0x00, 0x00, 0x10, 0x05, 0x00, 0x8D, 0x00,
+ 0x1D, 0x07, 0x06, 0x00, 0x02, 0x00, 0x1D, 0x00,
+ 0x00, 0x10, 0x05, 0x00, 0x93, 0x00, 0x1F, 0x07,
+ 0x06, 0x00, 0x1C, 0x06, 0x3C, 0x00, 0x1B, 0x0F,
+ 0x31, 0x02, 0x00, 0x00, 0x00, 0x00, 0x10, 0x05,
+ 0x00, 0x95, 0x00, 0x20, 0x07, 0x06, 0x00, 0x02,
+ 0x00, 0x00, 0x00, 0x00, 0x10, 0x05, 0x00, 0x95,
+ 0x00, 0x20, 0x07, 0x06, 0x00, 0x18, 0x1D, 0x02,
+ 0x00, 0x01, 0x00, 0x00, 0x10, 0x05, 0x01, 0x94,
+ 0x00, 0x1B, 0x07, 0x06, 0x00, 0x02, 0x00, 0x01,
+ 0x00, 0x00, 0x10, 0x05, 0x01, 0x94, 0x00, 0x1B,
+ 0x07, 0x06, 0x00, 0x02, 0x00, 0x02, 0x00, 0x00,
+ 0x10, 0x05, 0x02, 0x93, 0x00, 0x14, 0x07, 0x06,
+ 0x00, 0x02, 0x00, 0x02, 0x00, 0x00, 0x10, 0x05,
+ 0x02, 0x93, 0x00, 0x14, 0x07, 0x06, 0x00, 0x18,
+ 0x1D, 0x02, 0x00, 0x03, 0x00, 0x00, 0x10, 0x05,
+ 0x01, 0x90, 0x00, 0x1B, 0x07, 0x06, 0x00, 0x02,
+ 0x00, 0x04, 0x00, 0x00, 0x10, 0x05, 0x00, 0x8D,
+ 0x00, 0x20, 0x07, 0x06, 0x00, 0x02, 0x00, 0x05,
+ 0x00, 0x00, 0x10, 0x05, 0x01, 0x8A, 0x00, 0x1B,
+ 0x07, 0x06, 0x00, 0x18, 0x1D, 0x02, 0x00, 0x06,
+ 0x00, 0x00, 0x10, 0x05, 0x02, 0x88, 0x00, 0x14,
+ 0x07, 0x06, 0x00, 0x02, 0x00, 0x07, 0x00, 0x00,
+ 0x10, 0x05, 0x01, 0x85, 0x00, 0x1B, 0x07, 0x06,
+ 0x00, 0x18, 0x1D, 0x02, 0x00, 0x08, 0x00, 0x00,
+ 0x10, 0x05, 0x00, 0x82, 0x00, 0x20, 0x07, 0x06,
+ 0x00, 0x02, 0x00, 0x09, 0x00, 0x00, 0x10, 0x05,
+ 0x01, 0x7F, 0x00, 0x1B, 0x07, 0x06, 0x00, 0x02,
+ 0x00, 0x0A, 0x00, 0x00, 0x10, 0x05, 0x02, 0x7C,
+ 0x00, 0x14, 0x07, 0x06, 0x00, 0x18, 0x1D, 0x02,
+ 0x00, 0x0B, 0x00, 0x00, 0x10, 0x05, 0x01, 0x79,
+ 0x00, 0x1B, 0x07, 0x06, 0x00, 0x02, 0x00, 0x0C,
+ 0x00, 0x00, 0x10, 0x05, 0x00, 0x76, 0x00, 0x20,
+ 0x07, 0x06, 0x00, 0x18, 0x1D, 0x02, 0x00, 0x0D,
+ 0x00, 0x00, 0x10, 0x05, 0x01, 0x73, 0x00, 0x1B,
+ 0x07, 0x06, 0x00, 0x02, 0x00, 0x0E, 0x00, 0x00,
+ 0x10, 0x05, 0x02, 0x70, 0x00, 0x14, 0x07, 0x06,
+ 0x00, 0x02, 0x00, 0x0F, 0x00, 0x00, 0x10, 0x05,
+ 0x01, 0x6D, 0x00, 0x1B, 0x07, 0x06, 0x00, 0x18,
+ 0x1D, 0x02, 0x00, 0x10, 0x00, 0x00, 0x10, 0x05,
+ 0x00, 0x6A, 0x00, 0x20, 0x07, 0x06, 0x00, 0x02,
+ 0x00, 0x11, 0x00, 0x00, 0x10, 0x05, 0x01, 0x67,
+ 0x00, 0x1B, 0x07, 0x06, 0x00, 0x18, 0x1D, 0x02,
+ 0x00, 0x12, 0x00, 0x00, 0x10, 0x05, 0x02, 0x65,
+ 0x00, 0x14, 0x07, 0x06, 0x00, 0x06, 0x3C, 0x00,
+ 0x02, 0x00, 0x1E, 0x00, 0x00, 0x10, 0x08, 0x12,
+ 0x06, 0x1E, 0x00, 0x0A, 0x01, 0x02, 0x00, 0x1F,
+ 0x00, 0x00, 0x10, 0x07, 0x0A, 0x00, 0x02, 0x00,
+ 0x20, 0x00, 0x00, 0x10, 0x07, 0x0A, 0x00, 0x02,
+ 0x00, 0x21, 0x00, 0x00, 0x10, 0x07, 0x0A, 0x00,
+ 0x02, 0x00, 0x22, 0x00, 0x00, 0x10, 0x07, 0x0A,
+ 0x00, 0x0B, 0x01, 0x02, 0x00, 0x18, 0x1F, 0x06,
+ 0x0A, 0x00, 0x02, 0x00, 0x23, 0x00, 0x00, 0x10,
+ 0x07, 0x14, 0x00, 0x18, 0x1E, 0x02, 0x00, 0x24,
+ 0x00, 0x00, 0x10, 0x07, 0x14, 0x00, 0x02, 0x00,
+ 0x25, 0x00, 0x00, 0x10, 0x07, 0x14, 0x00, 0x18,
+ 0x1F, 0x02, 0x00, 0x26, 0x00, 0x00, 0x10, 0x07,
+ 0x14, 0x00, 0x02, 0x00, 0x27, 0x00, 0x00, 0x10,
+ 0x07, 0x14, 0x00, 0x18, 0x1E, 0x02, 0x00, 0x28,
+ 0x00, 0x00, 0x10, 0x08, 0x06, 0x3C, 0x00, 0x18,
+ 0x1E, 0x03, 0x00, 0x07, 0x06, 0x00, 0x18, 0x1E,
+ 0x03, 0x00, 0x07, 0x06, 0x00, 0x03, 0x00, 0x07,
+ 0x06, 0x00, 0x03, 0x00, 0x07, 0x06, 0x00, 0x03,
+ 0x00, 0x07, 0x06, 0x00, 0x03, 0x00, 0x07, 0x06,
+ 0x00, 0x03, 0x00, 0x07, 0x06, 0x00, 0x18, 0x1E,
+ 0x03, 0x00, 0x07, 0x06, 0x00, 0x03, 0x00, 0x07,
+ 0x06, 0x00, 0x03, 0x00, 0x07, 0x06, 0x00, 0x03,
+ 0x00, 0x07, 0x06, 0x00, 0x03, 0x00, 0x07, 0x06,
+ 0x00, 0x03, 0x00, 0x07, 0x06, 0x00, 0x03, 0x00,
+ 0x07, 0x06, 0x00, 0x03, 0x00, 0x07, 0x06, 0x00,
+ 0x03, 0x00, 0x07, 0x06, 0x00, 0x18, 0x1E, 0x03,
+ 0x00, 0x07, 0x06, 0x00, 0x03, 0x00, 0x07, 0x06,
+ 0x00, 0x03, 0x00, 0x07, 0x06, 0x00, 0x03, 0x00,
+ 0x07, 0x06, 0x00, 0x03, 0x00, 0x07, 0x06, 0x00,
+ 0x03, 0x00, 0x07, 0x06, 0x00, 0x03, 0x00, 0x07,
+ 0x06, 0x00, 0x03, 0x00, 0x07, 0x06, 0x00, 0x18,
+ 0x1E, 0x03, 0x00, 0x07, 0x06, 0x00, 0x03, 0x00,
+ 0x07, 0x06, 0x00, 0x03, 0x00, 0x07, 0x06, 0x00,
+ 0x03, 0x00, 0x07, 0x06, 0x00, 0x03, 0x00, 0x07,
+ 0x06, 0x00, 0x03, 0x00, 0x07, 0x06, 0x00, 0x03,
+ 0x00, 0x07, 0x06, 0x00, 0x03, 0x00, 0x07, 0x06,
+ 0x00, 0x03, 0x00, 0x07, 0x06, 0x00, 0x03, 0x00,
+ 0x07, 0x06, 0x00, 0x13, 0x1C, 0x19, 0x01, 0x06,
+ 0x3C, 0x00, 0x01, 0x00, 0x1D
+};
+
+static const ByteProvider k1KallakWritingSeqDOSOldFloppyProvider = { ARRAYSIZE(k1KallakWritingSeqDOSOldFloppy), k1KallakWritingSeqDOSOldFloppy };
+
+static const byte k1MalcolmTreeSeqDOSOldFloppy[534] = {
+ 0x00, 0x01, 0x00, 0x1A, 0x0E, 0x17, 0x00, 0x00,
+ 0x00, 0x3F, 0x01, 0xC7, 0x0C, 0x00, 0x0C, 0x01,
+ 0x0D, 0x01, 0x09, 0x02, 0x01, 0x00, 0x00, 0x00,
+ 0x10, 0x19, 0x03, 0x09, 0x18, 0x1E, 0x14, 0x18,
+ 0x1F, 0x0A, 0x00, 0x03, 0x01, 0x06, 0x06, 0x00,
+ 0x0B, 0x00, 0x1F, 0x00, 0x18, 0x19, 0x0A, 0x01,
+ 0x03, 0x01, 0x06, 0x06, 0x00, 0x0B, 0x01, 0x0F,
+ 0x00, 0x18, 0x26, 0x10, 0x1F, 0x50, 0x00, 0x2D,
+ 0x05, 0x0A, 0x02, 0x03, 0x01, 0x06, 0x06, 0x00,
+ 0x0B, 0x02, 0x10, 0x00, 0x11, 0x18, 0x1F, 0x03,
+ 0x01, 0x06, 0x06, 0x00, 0x03, 0x01, 0x06, 0x06,
+ 0x00, 0x03, 0x01, 0x06, 0x06, 0x00, 0x18, 0x24,
+ 0x18, 0x1F, 0x03, 0x01, 0x06, 0x06, 0x00, 0x18,
+ 0x1E, 0x0A, 0x03, 0x03, 0x01, 0x06, 0x06, 0x00,
+ 0x0B, 0x03, 0x15, 0x00, 0x10, 0x16, 0x50, 0x00,
+ 0x2D, 0x05, 0x18, 0x1F, 0x03, 0x01, 0x06, 0x06,
+ 0x00, 0x03, 0x01, 0x06, 0x06, 0x00, 0x18, 0x1E,
+ 0x03, 0x01, 0x06, 0x06, 0x00, 0x03, 0x01, 0x06,
+ 0x06, 0x00, 0x18, 0x1F, 0x03, 0x01, 0x06, 0x06,
+ 0x00, 0x03, 0x01, 0x06, 0x06, 0x00, 0x03, 0x01,
+ 0x06, 0x06, 0x00, 0x03, 0x01, 0x06, 0x06, 0x00,
+ 0x18, 0x1E, 0x03, 0x01, 0x06, 0x06, 0x00, 0x18,
+ 0x1A, 0x18, 0x1E, 0x0A, 0x05, 0x03, 0x01, 0x06,
+ 0x06, 0x00, 0x0B, 0x05, 0x09, 0x00, 0x11, 0x0A,
+ 0x06, 0x03, 0x01, 0x06, 0x06, 0x00, 0x0B, 0x06,
+ 0x14, 0x00, 0x18, 0x1A, 0x18, 0x1F, 0x10, 0x17,
+ 0x50, 0x00, 0x2D, 0x05, 0x06, 0x3C, 0x00, 0x0A,
+ 0x07, 0x03, 0x01, 0x06, 0x06, 0x00, 0x0B, 0x07,
+ 0x06, 0x00, 0x18, 0x1E, 0x06, 0x1E, 0x00, 0x10,
+ 0x18, 0x50, 0x00, 0x2D, 0x05, 0x03, 0x01, 0x06,
+ 0x06, 0x00, 0x03, 0x01, 0x06, 0x06, 0x00, 0x03,
+ 0x01, 0x06, 0x06, 0x00, 0x0A, 0x08, 0x04, 0x01,
+ 0x06, 0x06, 0x00, 0x04, 0x01, 0x06, 0x06, 0x00,
+ 0x03, 0x01, 0x06, 0x06, 0x00, 0x03, 0x01, 0x06,
+ 0x06, 0x00, 0x0B, 0x08, 0x01, 0x00, 0x03, 0x01,
+ 0x06, 0x06, 0x00, 0x06, 0x78, 0x00, 0x0A, 0x09,
+ 0x03, 0x01, 0x06, 0x06, 0x00, 0x0B, 0x09, 0x04,
+ 0x00, 0x18, 0x1B, 0x0A, 0x0A, 0x03, 0x01, 0x06,
+ 0x06, 0x00, 0x0B, 0x0A, 0x09, 0x00, 0x06, 0x14,
+ 0x00, 0x10, 0x19, 0x50, 0x00, 0x2D, 0x05, 0x03,
+ 0x01, 0x06, 0x06, 0x00, 0x03, 0x01, 0x06, 0x06,
+ 0x00, 0x0A, 0x0B, 0x03, 0x01, 0x06, 0x06, 0x00,
+ 0x04, 0x01, 0x06, 0x06, 0x00, 0x04, 0x01, 0x06,
+ 0x06, 0x00, 0x03, 0x01, 0x06, 0x06, 0x00, 0x03,
+ 0x01, 0x06, 0x06, 0x00, 0x0B, 0x0B, 0x01, 0x00,
+ 0x03, 0x01, 0x06, 0x06, 0x00, 0x03, 0x01, 0x06,
+ 0x06, 0x00, 0x03, 0x01, 0x06, 0x06, 0x00, 0x10,
+ 0x1A, 0x50, 0x00, 0x2D, 0x05, 0x0A, 0x0C, 0x03,
+ 0x01, 0x06, 0x06, 0x00, 0x0B, 0x0C, 0x12, 0x00,
+ 0x03, 0x01, 0x01, 0x01, 0x11, 0x15, 0x00, 0x02,
+ 0x00, 0x02, 0x00, 0x02, 0x02, 0x00, 0x00, 0x00,
+ 0x10, 0x10, 0x1C, 0x50, 0x00, 0x2D, 0x05, 0x06,
+ 0x3C, 0x00, 0x03, 0x02, 0x03, 0x02, 0x06, 0x06,
+ 0x00, 0x11, 0x18, 0x1C, 0x0A, 0x0F, 0x03, 0x02,
+ 0x06, 0x06, 0x00, 0x0B, 0x0F, 0x0D, 0x00, 0x10,
+ 0x1D, 0x50, 0x00, 0x2D, 0x05, 0x0A, 0x10, 0x03,
+ 0x02, 0x06, 0x06, 0x00, 0x03, 0x02, 0x06, 0x06,
+ 0x00, 0x03, 0x02, 0x06, 0x06, 0x00, 0x04, 0x02,
+ 0x06, 0x06, 0x00, 0x04, 0x02, 0x06, 0x06, 0x00,
+ 0x04, 0x02, 0x06, 0x06, 0x00, 0x0B, 0x10, 0x02,
+ 0x00, 0x10, 0x1E, 0x50, 0x00, 0x2D, 0x05, 0x0A,
+ 0x11, 0x03, 0x02, 0x06, 0x06, 0x00, 0x03, 0x02,
+ 0x06, 0x06, 0x00, 0x03, 0x02, 0x06, 0x06, 0x00,
+ 0x04, 0x02, 0x06, 0x06, 0x00, 0x04, 0x02, 0x06,
+ 0x06, 0x00, 0x04, 0x02, 0x06, 0x06, 0x00, 0x0B,
+ 0x11, 0x02, 0x00, 0x06, 0xB4, 0x00, 0x13, 0x19,
+ 0x01, 0x01, 0x01, 0x01, 0x02, 0x1D
+};
+
+static const ByteProvider k1MalcolmTreeSeqDOSOldFloppyProvider = { ARRAYSIZE(k1MalcolmTreeSeqDOSOldFloppy), k1MalcolmTreeSeqDOSOldFloppy };
+
+static const byte k1WestwoodLogoSeqDOSOldFloppy[75] = {
+ 0x00, 0x03, 0x01, 0x1A, 0x02, 0x03, 0x00, 0x00,
+ 0x00, 0x00, 0x16, 0x01, 0x06, 0x06, 0x00, 0x06,
+ 0x3C, 0x00, 0x18, 0x14, 0x0A, 0x00, 0x03, 0x03,
+ 0x16, 0x01, 0x0B, 0x00, 0x08, 0x00, 0x06, 0x3C,
+ 0x00, 0x18, 0x27, 0x0A, 0x01, 0x03, 0x03, 0x16,
+ 0x01, 0x0B, 0x01, 0x0B, 0x00, 0x06, 0x78, 0x00,
+ 0x18, 0x14, 0x02, 0x03, 0x0A, 0x00, 0x00, 0x00,
+ 0x16, 0x01, 0x06, 0x06, 0x00, 0x0A, 0x02, 0x04,
+ 0x03, 0x16, 0x01, 0x0B, 0x02, 0x09, 0x00, 0x13,
+ 0x01, 0x03, 0x1D
+};
+
+static const ByteProvider k1WestwoodLogoSeqDOSOldFloppyProvider = { ARRAYSIZE(k1WestwoodLogoSeqDOSOldFloppy), k1WestwoodLogoSeqDOSOldFloppy };
+
+static const byte k1KyrandiaLogoSeqDOSOldFloppy[92] = {
+ 0x15, 0x00, 0x02, 0x00, 0x06, 0x01, 0x1A, 0x02,
+ 0x06, 0x00, 0x00, 0x00, 0x00, 0x16, 0x00, 0x06,
+ 0x06, 0x00, 0x18, 0x14, 0x16, 0x04, 0x0A, 0x00,
+ 0x03, 0x06, 0x16, 0x00, 0x0B, 0x00, 0x0B, 0x00,
+ 0x06, 0x3C, 0x00, 0x18, 0x27, 0x0A, 0x01, 0x03,
+ 0x06, 0x16, 0x00, 0x0B, 0x01, 0x0F, 0x00, 0x06,
+ 0x3C, 0x00, 0x18, 0x27, 0x0A, 0x02, 0x04, 0x06,
+ 0x16, 0x00, 0x0B, 0x02, 0x0F, 0x00, 0x02, 0x06,
+ 0x0D, 0x00, 0x00, 0x00, 0x16, 0x00, 0x06, 0x06,
+ 0x00, 0x06, 0x78, 0x00, 0x18, 0x14, 0x0A, 0x02,
+ 0x04, 0x06, 0x16, 0x00, 0x0B, 0x02, 0x0C, 0x00,
+ 0x13, 0x01, 0x06, 0x1D
+};
+
+static const ByteProvider k1KyrandiaLogoSeqDOSOldFloppyProvider = { ARRAYSIZE(k1KyrandiaLogoSeqDOSOldFloppy), k1KyrandiaLogoSeqDOSOldFloppy };
+
+static const byte k1KallakMalcolmSeqDOSOldFloppy[615] = {
+ 0x00, 0x04, 0x01, 0x1A, 0x0E, 0x17, 0x00, 0x00,
+ 0x00, 0x3F, 0x01, 0xC7, 0x0C, 0x00, 0x0C, 0x03,
+ 0x0D, 0x00, 0x17, 0x00, 0x00, 0x88, 0x3F, 0x01,
+ 0xC7, 0x0C, 0x02, 0x19, 0x05, 0x02, 0x04, 0x00,
+ 0x10, 0x00, 0x3A, 0x09, 0x14, 0x18, 0x23, 0x0A,
+ 0x00, 0x03, 0x04, 0x07, 0x07, 0x00, 0x0B, 0x00,
+ 0x22, 0x00, 0x10, 0x02, 0x50, 0x00, 0x3A, 0x05,
+ 0x0A, 0x01, 0x03, 0x04, 0x07, 0x07, 0x00, 0x0B,
+ 0x01, 0x07, 0x00, 0x06, 0x3C, 0x00, 0x10, 0x03,
+ 0x50, 0x00, 0x3A, 0x05, 0x0A, 0x02, 0x03, 0x04,
+ 0x07, 0x07, 0x00, 0x0B, 0x02, 0x17, 0x00, 0x06,
+ 0x3C, 0x00, 0x10, 0x04, 0x50, 0x00, 0x3A, 0x05,
+ 0x0A, 0x03, 0x03, 0x04, 0x07, 0x07, 0x00, 0x0B,
+ 0x03, 0x0A, 0x00, 0x06, 0x3C, 0x00, 0x03, 0x04,
+ 0x07, 0x07, 0x00, 0x03, 0x04, 0x07, 0x07, 0x00,
+ 0x03, 0x04, 0x07, 0x07, 0x00, 0x10, 0x05, 0xF0,
+ 0x00, 0x3A, 0x0F, 0x03, 0x04, 0x07, 0x07, 0x00,
+ 0x03, 0x04, 0x07, 0x07, 0x00, 0x03, 0x04, 0x07,
+ 0x07, 0x00, 0x03, 0x04, 0x07, 0x07, 0x00, 0x06,
+ 0x3C, 0x00, 0x10, 0x06, 0xF0, 0x00, 0x3A, 0x0F,
+ 0x0A, 0x04, 0x03, 0x04, 0x07, 0x07, 0x00, 0x0B,
+ 0x04, 0x12, 0x00, 0x06, 0x3C, 0x00, 0x03, 0x04,
+ 0x07, 0x07, 0x00, 0x03, 0x04, 0x07, 0x07, 0x00,
+ 0x03, 0x04, 0x07, 0x07, 0x00, 0x03, 0x04, 0x07,
+ 0x07, 0x00, 0x06, 0x78, 0x00, 0x10, 0x07, 0xF0,
+ 0x00, 0x3A, 0x0F, 0x0A, 0x05, 0x03, 0x04, 0x07,
+ 0x07, 0x00, 0x0B, 0x05, 0x11, 0x00, 0x06, 0x3C,
+ 0x00, 0x03, 0x04, 0x07, 0x07, 0x00, 0x03, 0x04,
+ 0x07, 0x07, 0x00, 0x10, 0x08, 0x50, 0x00, 0x3A,
+ 0x05, 0x0A, 0x06, 0x03, 0x04, 0x07, 0x07, 0x00,
+ 0x0B, 0x06, 0x07, 0x00, 0x06, 0x3C, 0x00, 0x03,
+ 0x04, 0x07, 0x07, 0x00, 0x03, 0x04, 0x07, 0x07,
+ 0x00, 0x03, 0x04, 0x07, 0x07, 0x00, 0x10, 0x09,
+ 0x50, 0x00, 0x3A, 0x05, 0x0A, 0x07, 0x03, 0x04,
+ 0x07, 0x07, 0x00, 0x0B, 0x07, 0x0A, 0x00, 0x06,
+ 0x3C, 0x00, 0x03, 0x04, 0x07, 0x07, 0x00, 0x10,
+ 0x0A, 0x50, 0x00, 0x3A, 0x05, 0x0A, 0x08, 0x03,
+ 0x04, 0x07, 0x07, 0x00, 0x0B, 0x08, 0x10, 0x00,
+ 0x06, 0x3C, 0x00, 0x03, 0x04, 0x07, 0x07, 0x00,
+ 0x10, 0x0B, 0xF0, 0x00, 0x3A, 0x0F, 0x03, 0x04,
+ 0x07, 0x07, 0x00, 0x03, 0x04, 0x07, 0x07, 0x00,
+ 0x03, 0x04, 0x07, 0x07, 0x00, 0x03, 0x04, 0x07,
+ 0x07, 0x00, 0x03, 0x04, 0x07, 0x07, 0x00, 0x03,
+ 0x04, 0x07, 0x07, 0x00, 0x03, 0x04, 0x07, 0x07,
+ 0x00, 0x03, 0x04, 0x07, 0x07, 0x00, 0x06, 0x3C,
+ 0x00, 0x03, 0x04, 0x07, 0x07, 0x00, 0x10, 0x0C,
+ 0xF0, 0x00, 0x3A, 0x0F, 0x0A, 0x09, 0x03, 0x04,
+ 0x07, 0x07, 0x00, 0x0B, 0x09, 0x0E, 0x00, 0x06,
+ 0x3C, 0x00, 0x03, 0x04, 0x07, 0x07, 0x00, 0x03,
+ 0x04, 0x07, 0x07, 0x00, 0x03, 0x04, 0x07, 0x07,
+ 0x00, 0x03, 0x04, 0x07, 0x07, 0x00, 0x03, 0x04,
+ 0x07, 0x07, 0x00, 0x03, 0x04, 0x07, 0x07, 0x00,
+ 0x10, 0x0D, 0x50, 0x00, 0x3A, 0x05, 0x0A, 0x0A,
+ 0x03, 0x04, 0x07, 0x07, 0x00, 0x0B, 0x0A, 0x0E,
+ 0x00, 0x06, 0x3C, 0x00, 0x0A, 0x0B, 0x03, 0x04,
+ 0x07, 0x07, 0x00, 0x0B, 0x0B, 0x02, 0x00, 0x18,
+ 0x20, 0x0A, 0x0C, 0x03, 0x04, 0x07, 0x07, 0x00,
+ 0x0B, 0x0C, 0x06, 0x00, 0x18, 0x21, 0x0A, 0x0D,
+ 0x03, 0x04, 0x07, 0x07, 0x00, 0x0B, 0x0D, 0x0C,
+ 0x00, 0x18, 0x22, 0x0A, 0x0E, 0x03, 0x04, 0x07,
+ 0x07, 0x00, 0x0B, 0x0E, 0x0B, 0x00, 0x10, 0x0E,
+ 0x50, 0x00, 0x3A, 0x05, 0x0A, 0x0F, 0x03, 0x04,
+ 0x07, 0x07, 0x00, 0x0B, 0x0F, 0x09, 0x00, 0x06,
+ 0x3C, 0x00, 0x03, 0x04, 0x07, 0x07, 0x00, 0x10,
+ 0x0F, 0x50, 0x00, 0x3A, 0x05, 0x0A, 0x10, 0x03,
+ 0x04, 0x07, 0x07, 0x00, 0x0B, 0x10, 0x09, 0x00,
+ 0x06, 0x3C, 0x00, 0x03, 0x04, 0x07, 0x07, 0x00,
+ 0x10, 0x10, 0x50, 0x00, 0x3A, 0x05, 0x0A, 0x11,
+ 0x03, 0x04, 0x07, 0x07, 0x00, 0x0B, 0x11, 0x0F,
+ 0x00, 0x06, 0x3C, 0x00, 0x03, 0x04, 0x07, 0x07,
+ 0x00, 0x10, 0x11, 0x50, 0x00, 0x3A, 0x05, 0x0A,
+ 0x12, 0x03, 0x04, 0x07, 0x07, 0x00, 0x0B, 0x12,
+ 0x14, 0x00, 0x06, 0x3C, 0x00, 0x0A, 0x13, 0x03,
+ 0x04, 0x07, 0x07, 0x00, 0x0B, 0x13, 0x06, 0x00,
+ 0x18, 0x23, 0x0A, 0x13, 0x03, 0x04, 0x07, 0x07,
+ 0x00, 0x0B, 0x13, 0x07, 0x00, 0x11, 0x06, 0x3C,
+ 0x00, 0x13, 0x19, 0x01, 0x01, 0x04, 0x1D
+};
+
+static const ByteProvider k1KallakMalcolmSeqDOSOldFloppyProvider = { ARRAYSIZE(k1KallakMalcolmSeqDOSOldFloppy), k1KallakMalcolmSeqDOSOldFloppy };
+
+static const byte k1ForestSeqDOSOldFloppy[405] = {
+ 0x00, 0x05, 0x01, 0x00, 0x07, 0x01, 0x1A, 0x02,
+ 0x07, 0x00, 0x00, 0x00, 0x08, 0x02, 0x05, 0x00,
+ 0x98, 0x00, 0x38, 0x0A, 0x00, 0x03, 0x07, 0x16,
+ 0x02, 0x06, 0x09, 0x00, 0x0B, 0x00, 0x41, 0x00,
+ 0x18, 0x16, 0x03, 0x07, 0x02, 0x05, 0x01, 0x98,
+ 0x00, 0x38, 0x16, 0x02, 0x16, 0x03, 0x06, 0x09,
+ 0x00, 0x03, 0x07, 0x02, 0x05, 0x03, 0x98, 0x00,
+ 0x38, 0x16, 0x02, 0x16, 0x03, 0x06, 0x09, 0x00,
+ 0x03, 0x07, 0x02, 0x05, 0x01, 0x98, 0x00, 0x38,
+ 0x16, 0x02, 0x16, 0x03, 0x06, 0x09, 0x00, 0x03,
+ 0x07, 0x02, 0x05, 0x00, 0x98, 0x00, 0x38, 0x16,
+ 0x02, 0x16, 0x03, 0x06, 0x09, 0x00, 0x0A, 0x05,
+ 0x03, 0x07, 0x16, 0x02, 0x06, 0x09, 0x00, 0x0B,
+ 0x05, 0x0E, 0x00, 0x18, 0x16, 0x03, 0x07, 0x02,
+ 0x05, 0x01, 0x98, 0x00, 0x38, 0x16, 0x02, 0x16,
+ 0x03, 0x06, 0x09, 0x00, 0x03, 0x07, 0x02, 0x05,
+ 0x03, 0x98, 0x00, 0x38, 0x16, 0x02, 0x16, 0x03,
+ 0x06, 0x09, 0x00, 0x03, 0x07, 0x02, 0x05, 0x01,
+ 0x98, 0x00, 0x38, 0x16, 0x02, 0x16, 0x03, 0x06,
+ 0x09, 0x00, 0x03, 0x07, 0x02, 0x05, 0x04, 0x98,
+ 0x00, 0x38, 0x16, 0x02, 0x16, 0x03, 0x06, 0x09,
+ 0x00, 0x03, 0x07, 0x16, 0x02, 0x06, 0x09, 0x00,
+ 0x03, 0x07, 0x16, 0x02, 0x06, 0x09, 0x00, 0x03,
+ 0x07, 0x02, 0x05, 0x05, 0x98, 0x00, 0x38, 0x16,
+ 0x02, 0x16, 0x03, 0x06, 0x09, 0x00, 0x03, 0x07,
+ 0x16, 0x02, 0x06, 0x09, 0x00, 0x03, 0x07, 0x16,
+ 0x02, 0x06, 0x09, 0x00, 0x03, 0x07, 0x02, 0x05,
+ 0x06, 0x98, 0x00, 0x38, 0x16, 0x02, 0x16, 0x03,
+ 0x06, 0x09, 0x00, 0x03, 0x07, 0x16, 0x02, 0x06,
+ 0x09, 0x00, 0x03, 0x07, 0x16, 0x02, 0x06, 0x09,
+ 0x00, 0x18, 0x25, 0x0A, 0x00, 0x03, 0x07, 0x03,
+ 0x05, 0x16, 0x02, 0x16, 0x03, 0x06, 0x09, 0x00,
+ 0x0B, 0x00, 0x09, 0x00, 0x0A, 0x06, 0x03, 0x07,
+ 0x16, 0x02, 0x06, 0x09, 0x00, 0x0B, 0x06, 0x0E,
+ 0x00, 0x18, 0x17, 0x0A, 0x01, 0x03, 0x07, 0x03,
+ 0x05, 0x16, 0x02, 0x16, 0x03, 0x06, 0x09, 0x00,
+ 0x0B, 0x01, 0x0D, 0x00, 0x18, 0x25, 0x0A, 0x07,
+ 0x03, 0x07, 0x16, 0x02, 0x06, 0x09, 0x00, 0x0B,
+ 0x07, 0x0E, 0x00, 0x18, 0x18, 0x03, 0x07, 0x03,
+ 0x05, 0x16, 0x02, 0x16, 0x03, 0x06, 0x09, 0x00,
+ 0x03, 0x07, 0x03, 0x05, 0x16, 0x02, 0x16, 0x03,
+ 0x06, 0x09, 0x00, 0x03, 0x07, 0x03, 0x05, 0x16,
+ 0x02, 0x16, 0x03, 0x06, 0x09, 0x00, 0x03, 0x07,
+ 0x03, 0x05, 0x16, 0x02, 0x16, 0x03, 0x06, 0x09,
+ 0x00, 0x03, 0x07, 0x03, 0x05, 0x16, 0x02, 0x16,
+ 0x03, 0x06, 0x09, 0x00, 0x06, 0x12, 0x00, 0x18,
+ 0x25, 0x0A, 0x02, 0x03, 0x07, 0x03, 0x05, 0x16,
+ 0x02, 0x16, 0x03, 0x06, 0x09, 0x00, 0x0B, 0x02,
+ 0x07, 0x00, 0x0A, 0x03, 0x03, 0x07, 0x16, 0x02,
+ 0x06, 0x09, 0x00, 0x0B, 0x03, 0x0F, 0x00, 0x13,
+ 0x01, 0x07, 0x01, 0x05, 0x1D
+};
+
+static const ByteProvider k1ForestSeqDOSOldFloppyProvider = { ARRAYSIZE(k1ForestSeqDOSOldFloppy), k1ForestSeqDOSOldFloppy };
+
+static const char *const k1IntroCPSStringsDOSOldFloppy[2] = {
+ "mal-kal.cps",
+ "tree.cps"
+};
+
+static const StringListProvider k1IntroCPSStringsDOSOldFloppyProvider = { ARRAYSIZE(k1IntroCPSStringsDOSOldFloppy), k1IntroCPSStringsDOSOldFloppy };
+
+static const char *const k1IntroCOLStringsDOSOldFloppy[4] = {
+ "kallak.col",
+ "tree_exp.col",
+ "ww.col",
+ "mal-kal.col"
+};
+
+static const StringListProvider k1IntroCOLStringsDOSOldFloppyProvider = { ARRAYSIZE(k1IntroCOLStringsDOSOldFloppy), k1IntroCOLStringsDOSOldFloppy };
+
+static const char *const k1IntroWSAStringsDOSOldFloppy[11] = {
+ "kallak.wsa",
+ "tree1.wsa",
+ "tree2.wsa",
+ "westwood.wsa",
+ "mal-kal.wsa",
+ "destruct.wsa",
+ "kyrandia.wsa",
+ "shore.wsa",
+ "reunion.wsa",
+ "reuniont.wsa",
+ "latern.wsa"
+};
+
+static const StringListProvider k1IntroWSAStringsDOSOldFloppyProvider = { ARRAYSIZE(k1IntroWSAStringsDOSOldFloppy), k1IntroWSAStringsDOSOldFloppy };
+
+static const Room k1RoomListDOSOldFloppy[246] = {
+ { 30, 0xFFFF, 0xFFFF, 0x0001, 0xFFFF },
+ { 71, 0xFFFF, 0xFFFF, 0x0005, 0xFFFF },
+ { 44, 0xFFFF, 0x0003, 0xFFFF, 0xFFFF },
+ { 72, 0xFFFF, 0xFFFF, 0x000E, 0xFFFF },
+ { 48, 0xFFFF, 0x0005, 0xFFFF, 0x000E },
+ { 74, 0xFFFF, 0x000A, 0xFFFF, 0x0004 },
+ { 46, 0xFFFF, 0x000F, 0xFFFF, 0x000B },
+ { 75, 0xFFFF, 0x0009, 0xFFFF, 0x0018 },
+ { 13, 0xFFFF, 0x000C, 0xFFFF, 0x000A },
+ { 5, 0x000D, 0xFFFF, 0xFFFF, 0x0007 },
+ { 84, 0xFFFF, 0x0008, 0xFFFF, 0x0005 },
+ { 37, 0xFFFF, 0x0006, 0x000C, 0x0010 },
+ { 51, 0x000B, 0xFFFF, 0x000D, 0x0008 },
+ { 23, 0x000C, 0xFFFF, 0x0009, 0xFFFF },
+ { 25, 0x0003, 0x0004, 0xFFFF, 0xFFFF },
+ { 11, 0xFFFF, 0xFFFF, 0xFFFF, 0x0006 },
+ { 86, 0xFFFF, 0x000B, 0xFFFF, 0xFFFF },
+ { 84, 0xFFFF, 0x0022, 0x0017, 0x0016 },
+ { 51, 0x0020, 0x0014, 0x0024, 0x0015 },
+ { 85, 0x0014, 0x0019, 0xFFFF, 0x0024 },
+ { 33, 0x001C, 0xFFFF, 0x0013, 0x0012 },
+ { 31, 0x0022, 0x0012, 0xFFFF, 0x0017 },
+ { 25, 0x001F, 0x0011, 0xFFFF, 0xFFFF },
+ { 25, 0x0011, 0x0015, 0xFFFF, 0xFFFF },
+ { 2, 0xFFFF, 0x0007, 0xFFFF, 0x001A },
+ { 82, 0xFFFF, 0x006D, 0xFFFF, 0x0013 },
+ { 77, 0xFFFF, 0x0018, 0x0021, 0xFFFF },
+ { 15, 0xFFFF, 0x001A, 0xFFFF, 0xFFFF },
+ { 16, 0xFFFF, 0xFFFF, 0x0014, 0x0020 },
+ { 19, 0xFFFF, 0x0021, 0xFFFF, 0x001F },
+ { 12, 0xFFFF, 0xFFFF, 0x0020, 0x0021 },
+ { 7, 0x0023, 0x001D, 0x0016, 0xFFFF },
+ { 20, 0x001E, 0x001C, 0x0012, 0x0022 },
+ { 17, 0x001A, 0x001E, 0x0022, 0x001D },
+ { 22, 0x0021, 0x0020, 0x0015, 0x0011 },
+ { 24, 0xFFFF, 0xFFFF, 0x001F, 0xFFFF },
+ { 32, 0x0012, 0x0013, 0xFFFF, 0xFFFF },
+ { 87, 0xFFFF, 0x0026, 0xFFFF, 0xFFFF },
+ { 8, 0xFFFF, 0x0027, 0xFFFF, 0x0025 },
+ { 88, 0xFFFF, 0x0035, 0x0037, 0x0026 },
+ { 35, 0xFFFF, 0x0036, 0x0038, 0xFFFF },
+ { 47, 0xFFFF, 0xFFFF, 0x003B, 0xFFFF },
+ { 28, 0x0035, 0x002B, 0x002F, 0x0037 },
+ { 36, 0xFFFF, 0x002C, 0xFFFF, 0x002A },
+ { 78, 0xFFFF, 0xFFFF, 0xFFFF, 0x002B },
+ { 10, 0xFFFF, 0xFFFF, 0xFFFF, 0x002C },
+ { 51, 0x0037, 0x002F, 0x0040, 0x003C },
+ { 38, 0x002A, 0x003D, 0x0041, 0x002E },
+ { 81, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF },
+ { 41, 0xFFFF, 0xFFFF, 0x0069, 0xFFFF },
+ { 50, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF },
+ { 18, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF },
+ { 49, 0xFFFF, 0xFFFF, 0x0054, 0xFFFF },
+ { 105, 0xFFFF, 0xFFFF, 0x002A, 0x0027 },
+ { 105, 0xFFFF, 0xFFFF, 0x0039, 0x0028 },
+ { 51, 0x0027, 0x002A, 0x002E, 0x0049 },
+ { 34, 0x0028, 0x0039, 0xFFFF, 0xFFFF },
+ { 51, 0x0036, 0x003A, 0xFFFF, 0x0038 },
+ { 84, 0xFFFF, 0x003B, 0xFFFF, 0x0039 },
+ { 37, 0x0029, 0xFFFF, 0x003E, 0x003A },
+ { 37, 0x0049, 0x002E, 0x003F, 0xFFFF },
+ { 33, 0xFFFF, 0xFFFF, 0xFFFF, 0x002F },
+ { 34, 0x003B, 0x003F, 0xFFFF, 0xFFFF },
+ { 85, 0x003C, 0x0040, 0xFFFF, 0x003E },
+ { 106, 0x002E, 0x0041, 0xFFFF, 0x003F },
+ { 33, 0x002F, 0xFFFF, 0xFFFF, 0x0040 },
+ { 60, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF },
+ { 3, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF },
+ { 11, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF },
+ { 33, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF },
+ { 26, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF },
+ { 0, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF },
+ { 25, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF },
+ { 23, 0xFFFF, 0x0037, 0x003C, 0xFFFF },
+ { 6, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF },
+ { 51, 0x0063, 0x0067, 0x006B, 0x0066 },
+ { 66, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF },
+ { 67, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF },
+ { 62, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF },
+ { 65, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF },
+ { 18, 0x0056, 0x005A, 0x005E, 0xFFFF },
+ { 6, 0xFFFF, 0x0052, 0x0056, 0xFFFF },
+ { 4, 0xFFFF, 0x0053, 0x0057, 0x0051 },
+ { 3, 0xFFFF, 0x0054, 0xFFFF, 0x0052 },
+ { 37, 0x0034, 0x0055, 0x0058, 0x0053 },
+ { 11, 0xFFFF, 0xFFFF, 0x0059, 0x0054 },
+ { 37, 0x0051, 0x0057, 0x0050, 0xFFFF },
+ { 51, 0x0052, 0xFFFF, 0x005A, 0x0056 },
+ { 51, 0x0054, 0x0059, 0x005C, 0xFFFF },
+ { 1, 0x0055, 0xFFFF, 0x005D, 0x0058 },
+ { 106, 0x0057, 0x005B, 0xFFFF, 0x0050 },
+ { 85, 0xFFFF, 0x005C, 0xFFFF, 0x005A },
+ { 37, 0x0058, 0x005D, 0x005F, 0x005B },
+ { 33, 0x0059, 0xFFFF, 0xFFFF, 0x005C },
+ { 51, 0x0050, 0xFFFF, 0x0061, 0xFFFF },
+ { 51, 0x005C, 0xFFFF, 0x0064, 0xFFFF },
+ { 37, 0xFFFF, 0x0061, 0x0065, 0xFFFF },
+ { 51, 0x005E, 0x0062, 0xFFFF, 0x0060 },
+ { 84, 0xFFFF, 0x0063, 0x0066, 0x0061 },
+ { 84, 0xFFFF, 0x0064, 0x004B, 0x0062 },
+ { 33, 0x005F, 0xFFFF, 0x0067, 0x0063 },
+ { 51, 0x0060, 0xFFFF, 0x0068, 0xFFFF },
+ { 37, 0x0062, 0x004B, 0x006A, 0xFFFF },
+ { 1, 0x0064, 0xFFFF, 0x006C, 0x004B },
+ { 34, 0x0065, 0x0069, 0xFFFF, 0xFFFF },
+ { 51, 0x0031, 0x006A, 0xFFFF, 0x0068 },
+ { 85, 0x0066, 0x006B, 0xFFFF, 0x0069 },
+ { 106, 0x004B, 0x006C, 0xFFFF, 0x006A },
+ { 33, 0x0067, 0xFFFF, 0xFFFF, 0x006B },
+ { 55, 0x00C4, 0x00C5, 0xFFFF, 0x0019 },
+ { 52, 0xFFFF, 0x00C1, 0xFFFF, 0x0096 },
+ { 64, 0xFFFF, 0x00BF, 0xFFFF, 0x008C },
+ { 57, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF },
+ { 54, 0x00AF, 0xFFFF, 0x00B7, 0x00AC },
+ { 53, 0x0078, 0xFFFF, 0x0079, 0xFFFF },
+ { 29, 0xFFFF, 0x00BB, 0xFFFF, 0x00C5 },
+ { 69, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF },
+ { 76, 0x00C6, 0xFFFF, 0xFFFF, 0x00B1 },
+ { 59, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF },
+ { 58, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF },
+ { 59, 0xFFFF, 0x0025, 0x0072, 0xFFFF },
+ { 58, 0x0072, 0x007B, 0x00BB, 0xFFFF },
+ { 58, 0xFFFF, 0x007F, 0x007B, 0xFFFF },
+ { 59, 0x007A, 0xFFFF, 0x007C, 0x0079 },
+ { 58, 0x007B, 0x0081, 0x00BC, 0xFFFF },
+ { 58, 0x00BC, 0x0083, 0xFFFF, 0xFFFF },
+ { 58, 0xFFFF, 0x0085, 0x007F, 0xFFFF },
+ { 59, 0x007E, 0x0086, 0x0080, 0x007A },
+ { 58, 0x007F, 0x00BD, 0x0081, 0xFFFF },
+ { 59, 0x0080, 0x0087, 0x0082, 0x007C },
+ { 58, 0x0081, 0xFFFF, 0x0083, 0x00BC },
+ { 59, 0x0082, 0x0089, 0x0084, 0x007D },
+ { 58, 0x0083, 0x008A, 0xFFFF, 0xFFFF },
+ { 59, 0xFFFF, 0x008B, 0x0086, 0x007E },
+ { 58, 0x0085, 0x008C, 0x00BD, 0x007F },
+ { 58, 0x00BD, 0x008E, 0x0088, 0x0081 },
+ { 59, 0x0087, 0xFFFF, 0x0089, 0xFFFF },
+ { 58, 0x0088, 0x0090, 0x008A, 0x0083 },
+ { 59, 0x0089, 0x0091, 0xFFFF, 0x0084 },
+ { 58, 0xFFFF, 0x0092, 0x008C, 0x0085 },
+ { 59, 0x008B, 0x006F, 0x008D, 0x0086 },
+ { 58, 0x008C, 0x0093, 0x008E, 0x00BD },
+ { 59, 0x008D, 0xFFFF, 0xFFFF, 0x0087 },
+ { 58, 0xFFFF, 0x00BE, 0x0090, 0xFFFF },
+ { 59, 0x008F, 0x0095, 0x0091, 0x0089 },
+ { 58, 0x0090, 0x0096, 0xFFFF, 0x008A },
+ { 59, 0xFFFF, 0x0098, 0xFFFF, 0x008B },
+ { 59, 0xFFFF, 0xFFFF, 0xFFFF, 0x008D },
+ { 58, 0xFFFF, 0x009A, 0x00BE, 0xFFFF },
+ { 58, 0x00BE, 0xFFFF, 0x0096, 0x0090 },
+ { 59, 0x0095, 0x006E, 0x0097, 0x0091 },
+ { 58, 0x0096, 0x009D, 0xFFFF, 0xFFFF },
+ { 58, 0xFFFF, 0x009E, 0x00BF, 0x0092 },
+ { 58, 0x00BF, 0x00A0, 0x009A, 0xFFFF },
+ { 59, 0x0099, 0xFFFF, 0x009B, 0x0094 },
+ { 58, 0x009A, 0xFFFF, 0x009C, 0xFFFF },
+ { 59, 0x009B, 0x00A2, 0xFFFF, 0xFFFF },
+ { 59, 0xFFFF, 0x00A3, 0xFFFF, 0x0097 },
+ { 59, 0xFFFF, 0xFFFF, 0x009F, 0x0098 },
+ { 58, 0x009E, 0x00A4, 0x00A0, 0x00BF },
+ { 59, 0x009F, 0x00A5, 0xFFFF, 0x0099 },
+ { 58, 0xFFFF, 0x00A6, 0x00C0, 0xFFFF },
+ { 58, 0x00C0, 0x00A8, 0xFFFF, 0x009C },
+ { 58, 0x00C1, 0xFFFF, 0xFFFF, 0x009D },
+ { 59, 0xFFFF, 0x00AA, 0x00A5, 0x009F },
+ { 58, 0x00A4, 0x00AB, 0x00A6, 0x00A0 },
+ { 59, 0x00A5, 0x00AC, 0x00A7, 0x00A1 },
+ { 58, 0x00A6, 0xFFFF, 0xFFFF, 0x00C0 },
+ { 59, 0xFFFF, 0x00AD, 0x00A9, 0x00A2 },
+ { 58, 0x00A8, 0x00AE, 0xFFFF, 0x00C1 },
+ { 58, 0xFFFF, 0xFFFF, 0x00AB, 0x00A4 },
+ { 59, 0x00AA, 0x00AF, 0x00AC, 0x00A5 },
+ { 58, 0x00AB, 0x0071, 0x00C2, 0x00A6 },
+ { 58, 0xFFFF, 0x00B0, 0x00AE, 0x00A8 },
+ { 59, 0x00AD, 0xFFFF, 0xFFFF, 0x00A9 },
+ { 58, 0xFFFF, 0x00C3, 0x0071, 0x00AB },
+ { 59, 0xFFFF, 0xFFFF, 0x00B1, 0x00AD },
+ { 58, 0x00B0, 0x0075, 0xFFFF, 0xFFFF },
+ { 59, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF },
+ { 59, 0x00C3, 0xFFFF, 0x00B4, 0xFFFF },
+ { 59, 0x00B3, 0x00BA, 0xFFFF, 0xFFFF },
+ { 58, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF },
+ { 59, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF },
+ { 58, 0x0071, 0xFFFF, 0xFFFF, 0x00C2 },
+ { 58, 0xFFFF, 0xFFFF, 0x00B9, 0xFFFF },
+ { 59, 0x00B8, 0xFFFF, 0xFFFF, 0x00C3 },
+ { 58, 0xFFFF, 0xFFFF, 0xFFFF, 0x00B4 },
+ { 59, 0x0079, 0xFFFF, 0xFFFF, 0x0073 },
+ { 59, 0x007C, 0x0082, 0x007D, 0xFFFF },
+ { 59, 0x0086, 0x008D, 0x0087, 0x0080 },
+ { 59, 0x0094, 0xFFFF, 0x0095, 0x008F },
+ { 59, 0x0098, 0x009F, 0x0099, 0x006F },
+ { 59, 0x00A1, 0x00A7, 0x00A2, 0xFFFF },
+ { 59, 0xFFFF, 0x00A9, 0x00A3, 0x006E },
+ { 59, 0x00AC, 0x00B7, 0xFFFF, 0xFFFF },
+ { 58, 0xFFFF, 0x00B9, 0x00B3, 0x00AF },
+ { 59, 0xFFFF, 0xFFFF, 0x006D, 0xFFFF },
+ { 58, 0xFFFF, 0x0073, 0xFFFF, 0x006D },
+ { 59, 0xFFFF, 0xFFFF, 0x0075, 0xFFFF },
+ { 94, 0xFFFF, 0x00C8, 0xFFFF, 0xFFFF },
+ { 43, 0x00C9, 0x00CB, 0x00CA, 0x00C7 },
+ { 51, 0xFFFF, 0xFFFF, 0x00C8, 0xFFFF },
+ { 37, 0x00C8, 0xFFFF, 0xFFFF, 0xFFFF },
+ { 79, 0xFFFF, 0xFFFF, 0xFFFF, 0x00C8 },
+ { 80, 0xFFFF, 0xFFFF, 0x00CB, 0x00CD },
+ { 97, 0x00E3, 0x00D4, 0x00CC, 0x00D3 },
+ { 103, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF },
+ { 100, 0xFFFF, 0x00CE, 0x00D5, 0xFFFF },
+ { 98, 0xFFFF, 0xFFFF, 0xFFFF, 0x00D7 },
+ { 101, 0xFFFF, 0x00D2, 0x00CE, 0xFFFF },
+ { 99, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF },
+ { 93, 0x00D5, 0x00CD, 0xFFFF, 0xFFFF },
+ { 93, 0x00D6, 0xFFFF, 0xFFFF, 0x00CD },
+ { 93, 0x00CF, 0x00CE, 0x00D3, 0xFFFF },
+ { 93, 0x00D7, 0xFFFF, 0x00D4, 0x00CE },
+ { 93, 0xFFFF, 0x00D0, 0x00D6, 0x00CE },
+ { 93, 0x00DA, 0x00E3, 0xFFFF, 0xFFFF },
+ { 93, 0x00DB, 0xFFFF, 0xFFFF, 0x00E3 },
+ { 93, 0xFFFF, 0x00E4, 0x00D8, 0x00E2 },
+ { 93, 0xFFFF, 0x00E1, 0x00D9, 0x00E4 },
+ { 93, 0xFFFF, 0x00E4, 0xFFFF, 0x00DF },
+ { 93, 0xFFFF, 0x00E0, 0xFFFF, 0x00E4 },
+ { 93, 0xFFFF, 0xFFFF, 0x00E4, 0xFFFF },
+ { 91, 0xFFFF, 0x00DC, 0xFFFF, 0xFFFF },
+ { 90, 0xFFFF, 0xFFFF, 0xFFFF, 0x00DD },
+ { 92, 0xFFFF, 0xFFFF, 0xFFFF, 0x00DB },
+ { 95, 0xFFFF, 0x00DA, 0xFFFF, 0xFFFF },
+ { 96, 0xFFFF, 0x00D9, 0x00CD, 0x00D8 },
+ { 89, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF },
+ { 102, 0xFFFF, 0x00E6, 0xFFFF, 0xFFFF },
+ { 102, 0xFFFF, 0x00EA, 0x00E8, 0x00E5 },
+ { 102, 0xFFFF, 0x00E8, 0x00EB, 0xFFFF },
+ { 102, 0x00E6, 0xFFFF, 0xFFFF, 0x00E7 },
+ { 102, 0xFFFF, 0xFFFF, 0x00ED, 0xFFFF },
+ { 102, 0xFFFF, 0xFFFF, 0xFFFF, 0x00E6 },
+ { 102, 0x00E7, 0x00EC, 0x00EF, 0xFFFF },
+ { 102, 0xFFFF, 0x00ED, 0x00F0, 0x00EB },
+ { 102, 0x00E9, 0x00EE, 0x00F1, 0x00EC },
+ { 102, 0xFFFF, 0xFFFF, 0x00F2, 0x00ED },
+ { 102, 0x00EB, 0x00F0, 0xFFFF, 0xFFFF },
+ { 102, 0x00EC, 0x00F1, 0x00F3, 0x00EF },
+ { 102, 0x00ED, 0xFFFF, 0x00F4, 0x00F0 },
+ { 102, 0x00EE, 0xFFFF, 0xFFFF, 0xFFFF },
+ { 102, 0x00F0, 0x00F4, 0xFFFF, 0xFFFF },
+ { 102, 0x00F1, 0x00F5, 0xFFFF, 0x00F3 },
+ { 102, 0xFFFF, 0xFFFF, 0x00CF, 0x00F4 }
+};
+
+static const RoomProvider k1RoomListDOSOldFloppyProvider = { ARRAYSIZE(k1RoomListDOSOldFloppy), k1RoomListDOSOldFloppy };
+
+static const char *const k1RoomFilenamesDOSOldFloppy[107] = {
+ "CLIFFB",
+ "XEDGEB",
+ "CAVEB",
+ "NCLIFF",
+ "NCLIFFB",
+ "CAVE",
+ "NWCLIFF",
+ "OAKS",
+ "PLATEAU",
+ "POTHUT",
+ "POTION",
+ "NWCLIFB",
+ "SONG",
+ "SORROW",
+ "SPELHUT",
+ "SPELL",
+ "SPRING",
+ "SQUARE",
+ "STUMP",
+ "TEMPLE",
+ "WELL",
+ "WILLOW",
+ "WISE",
+ "XEDGE",
+ "RUBY",
+ "ZROCK",
+ "ZROCKB",
+ "FORESTD",
+ "FOUNTN",
+ "GATECV",
+ "GEMCUT",
+ "CLIFF",
+ "DEAD",
+ "EDGE",
+ "EDGEB",
+ "FALLS",
+ "FORESTC",
+ "FORESTB",
+ "GLADE",
+ "GEMHUT",
+ "ALGAE",
+ "MIX",
+ "BRIDGE",
+ "GRAVE",
+ "HEALER",
+ "HEALHUT",
+ "ALTAR",
+ "BURN",
+ "SICKWIL",
+ "LAGOON",
+ "MAPLE",
+ "FORESTA",
+ "ARCH",
+ "CHASM",
+ "EMCAV",
+ "ENTER",
+ "FLOWERS",
+ "GEMSLOT",
+ "GEN_CAV",
+ "GENCAVB",
+ "GOLDEN",
+ "GOLDENB",
+ "ICE",
+ "MARKET",
+ "MOONCAV",
+ "MSHCAV",
+ "POOL",
+ "SEASONS",
+ "SHRINE",
+ "TREECAV",
+ "EXTGEM",
+ "GEM",
+ "EXTHEAL",
+ "BASE",
+ "TRUNK",
+ "BROKEN",
+ "LAVA",
+ "EXTSPEL",
+ "EXTPOT",
+ "CASTLE",
+ "CGATE",
+ "LEPHOLE",
+ "DRAGON",
+ "XEDGEC",
+ "FNORTH",
+ "FSOUTH",
+ "FGOWEST",
+ "PLTCAVE",
+ "BONKBG",
+ "BALCONY",
+ "DARMS",
+ "BRINS",
+ "ALCHEMY",
+ "GENHALL",
+ "LANDING",
+ "BELROOM",
+ "UPSTAIR",
+ "DNSTAIR",
+ "KITCHEN",
+ "KYRAGEM",
+ "LIBRARY",
+ "FOYER",
+ "CATACOM",
+ "GRTHALL",
+ "FESTSTH",
+ "FWSTSTH",
+ "FSOUTHB"
+};
+
+static const StringListProvider k1RoomFilenamesDOSOldFloppyProvider = { ARRAYSIZE(k1RoomFilenamesDOSOldFloppy), k1RoomFilenamesDOSOldFloppy };
+
+static const char *const k1CharacterImageFilenamesDOSOldFloppy[20] = {
+ "BRANDON.CPS",
+ "DAPHNE.CPS",
+ "MERITH.CPS",
+ "HERMAN.CPS",
+ "SMALL.CPS",
+ "MALCOM.CPS",
+ "DRINK.CPS",
+ "SHRINK.CPS",
+ "HEALBR1.CPS",
+ "HEALBR2.CPS",
+ "SNOW1A.CPS",
+ "SNOW2A.CPS",
+ "BRANWILL.CPS",
+ "FLUTE1.CPS",
+ "FLUTE2.CPS",
+ "POISON1.CPS",
+ "POISON2.CPS",
+ "TELEKIN.CPS",
+ "BRANSTON.CPS",
+ "POISON.CPS"
+};
+
+static const StringListProvider k1CharacterImageFilenamesDOSOldFloppyProvider = { ARRAYSIZE(k1CharacterImageFilenamesDOSOldFloppy), k1CharacterImageFilenamesDOSOldFloppy };
+
+static const Shape k1DefaultShapesDOSOldFloppy[166] = {
+ { 0, 0, 0, 3, 48, -12, -48 },
+ { 0, 3, 0, 3, 48, -12, -48 },
+ { 0, 6, 0, 3, 48, -12, -48 },
+ { 0, 9, 0, 3, 48, -12, -48 },
+ { 0, 12, 0, 3, 48, -12, -48 },
+ { 0, 15, 0, 3, 48, -12, -48 },
+ { 0, 18, 0, 3, 48, -12, -48 },
+ { 0, 21, 0, 3, 48, -12, -48 },
+ { 0, 24, 0, 3, 48, -12, -48 },
+ { 0, 27, 0, 3, 48, -12, -48 },
+ { 0, 0, 51, 2, 11, -2, -8 },
+ { 0, 2, 51, 2, 11, -2, -8 },
+ { 0, 4, 51, 2, 11, -2, -8 },
+ { 0, 6, 51, 2, 11, -2, -8 },
+ { 0, 8, 51, 2, 11, -2, -8 },
+ { 0, 10, 51, 2, 11, -2, -8 },
+ { 0, 12, 51, 2, 11, -2, -8 },
+ { 0, 14, 51, 2, 11, -2, -8 },
+ { 0, 16, 51, 2, 11, -2, -8 },
+ { 0, 18, 51, 2, 11, -2, -8 },
+ { 0, 20, 51, 2, 11, -2, -8 },
+ { 0, 22, 51, 2, 11, -2, -8 },
+ { 0, 0, 80, 3, 48, -12, -48 },
+ { 0, 3, 80, 3, 48, -12, -48 },
+ { 0, 6, 80, 3, 48, -12, -48 },
+ { 0, 9, 80, 3, 48, -12, -48 },
+ { 0, 12, 80, 3, 48, -12, -48 },
+ { 0, 15, 80, 3, 48, -12, -48 },
+ { 0, 0, 129, 3, 48, -12, -48 },
+ { 0, 3, 129, 3, 48, -12, -48 },
+ { 0, 6, 129, 3, 48, -12, -48 },
+ { 0, 9, 129, 3, 48, -12, -48 },
+ { 0, 12, 129, 3, 48, -12, -48 },
+ { 0, 15, 129, 3, 48, -12, -48 },
+ { 2, 0, 0, 3, 48, -12, -48 },
+ { 2, 3, 0, 3, 48, -12, -48 },
+ { 2, 6, 0, 3, 48, -12, -48 },
+ { 2, 9, 0, 3, 48, -12, -48 },
+ { 2, 12, 0, 3, 48, -12, -48 },
+ { 2, 15, 0, 3, 48, -12, -48 },
+ { 2, 18, 0, 3, 48, -12, -48 },
+ { 2, 21, 0, 3, 48, -12, -48 },
+ { 2, 24, 0, 3, 48, -12, -48 },
+ { 2, 27, 0, 3, 48, -12, -48 },
+ { 2, 30, 10, 3, 38, -16, -38 },
+ { 2, 27, 48, 4, 40, -8, -40 },
+ { 2, 0, 51, 2, 11, -4, 0 },
+ { 2, 2, 51, 2, 11, -4, 0 },
+ { 2, 4, 51, 2, 11, -4, 0 },
+ { 2, 6, 51, 2, 11, -4, 0 },
+ { 2, 8, 51, 2, 11, -4, 0 },
+ { 2, 10, 51, 2, 11, -4, 0 },
+ { 2, 12, 51, 2, 11, -4, 0 },
+ { 2, 14, 51, 2, 11, -4, 0 },
+ { 2, 16, 51, 2, 11, -4, 0 },
+ { 2, 18, 51, 2, 11, -4, 0 },
+ { 2, 20, 51, 2, 11, -4, 0 },
+ { 2, 22, 51, 2, 11, -4, 0 },
+ { 255, 0, 80, 3, 48, -12, -48 },
+ { 255, 3, 80, 3, 48, -12, -48 },
+ { 255, 6, 80, 3, 48, -12, -48 },
+ { 255, 9, 80, 3, 48, -12, -48 },
+ { 255, 12, 80, 3, 48, -12, -48 },
+ { 255, 15, 80, 3, 48, -12, -48 },
+ { 255, 0, 129, 3, 48, -12, -48 },
+ { 255, 3, 129, 3, 48, -12, -48 },
+ { 255, 6, 129, 3, 48, -12, -48 },
+ { 255, 9, 129, 3, 48, -12, -48 },
+ { 255, 12, 129, 3, 48, -12, -48 },
+ { 255, 15, 129, 3, 48, -12, -48 },
+ { 3, 0, 0, 3, 48, -12, -46 },
+ { 3, 3, 0, 3, 48, -12, -48 },
+ { 3, 6, 0, 3, 48, -12, -48 },
+ { 3, 9, 0, 3, 48, -12, -48 },
+ { 3, 12, 0, 3, 48, -12, -48 },
+ { 3, 15, 0, 3, 48, -12, -48 },
+ { 3, 18, 0, 3, 48, -12, -48 },
+ { 3, 21, 0, 3, 48, -12, -48 },
+ { 3, 24, 0, 3, 48, -12, -48 },
+ { 3, 27, 0, 3, 48, -12, -46 },
+ { 3, 30, 0, 3, 48, -14, -47 },
+ { 3, 39, 199, 1, 1, -12, -48 },
+ { 3, 0, 51, 2, 11, 0, -7 },
+ { 3, 2, 51, 2, 11, 0, -7 },
+ { 3, 4, 51, 2, 11, 0, -7 },
+ { 3, 6, 51, 2, 11, 0, -7 },
+ { 3, 8, 51, 2, 11, 0, -7 },
+ { 3, 10, 51, 2, 11, 0, -7 },
+ { 3, 12, 51, 2, 11, 0, -7 },
+ { 3, 14, 51, 2, 11, 0, -7 },
+ { 3, 16, 51, 2, 11, 0, -7 },
+ { 3, 18, 51, 2, 11, 0, -7 },
+ { 3, 20, 51, 2, 11, 0, -7 },
+ { 3, 22, 51, 2, 11, 0, -7 },
+ { 3, 0, 80, 3, 48, -12, -48 },
+ { 3, 3, 80, 3, 48, -12, -48 },
+ { 3, 6, 80, 3, 48, -12, -48 },
+ { 3, 9, 80, 3, 48, -12, -48 },
+ { 3, 12, 80, 3, 48, -12, -48 },
+ { 3, 15, 80, 3, 48, -12, -48 },
+ { 3, 0, 129, 3, 48, -12, -48 },
+ { 3, 3, 129, 3, 48, -12, -48 },
+ { 3, 6, 129, 3, 48, -12, -48 },
+ { 3, 9, 129, 3, 48, -12, -48 },
+ { 3, 12, 129, 3, 48, -12, -48 },
+ { 3, 15, 129, 3, 48, -12, -48 },
+ { 12, 0, 96, 5, 29, -20, -42 },
+ { 12, 5, 96, 5, 29, -20, -42 },
+ { 12, 10, 96, 5, 29, -20, -42 },
+ { 12, 15, 96, 5, 29, -20, -42 },
+ { 12, 20, 96, 5, 29, -20, -42 },
+ { 12, 25, 96, 5, 29, -20, -42 },
+ { 12, 30, 96, 5, 29, -20, -42 },
+ { 12, 35, 96, 5, 29, -20, -42 },
+ { 12, 0, 125, 5, 29, -20, -42 },
+ { 12, 5, 125, 5, 29, -20, -42 },
+ { 255, 0, 0, 0, 0, 0, 0 },
+ { 255, 0, 0, 0, 0, 0, 0 },
+ { 255, 0, 0, 0, 0, 0, 0 },
+ { 255, 0, 0, 0, 0, 0, 0 },
+ { 255, 0, 0, 0, 0, 0, 0 },
+ { 255, 0, 0, 0, 0, 0, 0 },
+ { 255, 0, 0, 0, 0, 0, 0 },
+ { 255, 0, 0, 0, 0, 0, 0 },
+ { 255, 0, 0, 0, 0, 0, 0 },
+ { 255, 0, 0, 0, 0, 0, 0 },
+ { 255, 0, 0, 0, 0, 0, 0 },
+ { 255, 0, 0, 0, 0, 0, 0 },
+ { 255, 0, 0, 0, 0, 0, 0 },
+ { 255, 0, 0, 0, 0, 0, 0 },
+ { 255, 0, 0, 0, 0, 0, 0 },
+ { 255, 0, 0, 0, 0, 0, 0 },
+ { 255, 0, 0, 0, 0, 0, 0 },
+ { 255, 0, 0, 0, 0, 0, 0 },
+ { 255, 0, 0, 0, 0, 0, 0 },
+ { 255, 0, 0, 0, 0, 0, 0 },
+ { 255, 0, 0, 0, 0, 0, 0 },
+ { 255, 0, 0, 0, 0, 0, 0 },
+ { 255, 0, 0, 0, 0, 0, 0 },
+ { 255, 0, 0, 0, 0, 0, 0 },
+ { 255, 0, 0, 0, 0, 0, 0 },
+ { 255, 0, 0, 0, 0, 0, 0 },
+ { 255, 0, 0, 0, 0, 0, 0 },
+ { 255, 0, 0, 0, 0, 0, 0 },
+ { 255, 0, 0, 0, 0, 0, 0 },
+ { 255, 0, 0, 0, 0, 0, 0 },
+ { 255, 0, 0, 0, 0, 0, 0 },
+ { 255, 0, 0, 0, 0, 0, 0 },
+ { 255, 0, 0, 0, 0, 0, 0 },
+ { 255, 0, 0, 0, 0, 0, 0 },
+ { 255, 0, 0, 0, 0, 0, 0 },
+ { 255, 0, 0, 0, 0, 0, 0 },
+ { 255, 0, 0, 0, 0, 0, 0 },
+ { 255, 0, 0, 0, 0, 0, 0 },
+ { 255, 0, 0, 0, 0, 0, 0 },
+ { 255, 0, 0, 0, 0, 0, 0 },
+ { 255, 0, 0, 0, 0, 0, 0 },
+ { 255, 0, 0, 0, 0, 0, 0 },
+ { 255, 0, 0, 0, 0, 0, 0 },
+ { 255, 0, 0, 0, 0, 0, 0 },
+ { 255, 0, 0, 0, 0, 0, 0 },
+ { 255, 0, 0, 0, 0, 0, 0 },
+ { 255, 0, 0, 0, 0, 0, 0 },
+ { 255, 0, 0, 0, 0, 0, 0 },
+ { 255, 0, 0, 0, 0, 0, 0 },
+ { 255, 0, 0, 0, 0, 0, 0 }
+};
+
+static const ShapeProvider k1DefaultShapesDOSOldFloppyProvider = { ARRAYSIZE(k1DefaultShapesDOSOldFloppy), k1DefaultShapesDOSOldFloppy };
+
+static const byte k1AmuleteAnimSeqDOSOldFloppy[42] = {
+ 0x00, 0x01, 0x02, 0x01, 0x03, 0x04, 0x03, 0x01,
+ 0x02, 0x03, 0x04, 0x05, 0x06, 0x05, 0x04, 0x05,
+ 0x07, 0x08, 0x07, 0x08, 0x09, 0x08, 0x09, 0x07,
+ 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D,
+ 0x0E, 0x0F, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15,
+ 0x16, 0xFF
+};
+
+static const ByteProvider k1AmuleteAnimSeqDOSOldFloppyProvider = { ARRAYSIZE(k1AmuleteAnimSeqDOSOldFloppy), k1AmuleteAnimSeqDOSOldFloppy };
+
+static const byte k1SpecialPalette1DOSOldFloppy[21] = {
+ 0x36, 0x25, 0x1C, 0x31, 0x21, 0x19, 0x2C, 0x1D,
+ 0x16, 0x27, 0x19, 0x13, 0x22, 0x16, 0x11, 0x1D,
+ 0x12, 0x0D, 0x18, 0x0F, 0x0B
+};
+
+static const ByteProvider k1SpecialPalette1DOSOldFloppyProvider = { ARRAYSIZE(k1SpecialPalette1DOSOldFloppy), k1SpecialPalette1DOSOldFloppy };
+
+static const byte k1SpecialPalette2DOSOldFloppy[51] = {
+ 0x03, 0x03, 0x00, 0x37, 0x29, 0x1D, 0x33, 0x25,
+ 0x1A, 0x2D, 0x21, 0x17, 0x2A, 0x1D, 0x13, 0x26,
+ 0x19, 0x11, 0x22, 0x16, 0x0E, 0x1E, 0x12, 0x0C,
+ 0x1A, 0x0F, 0x0A, 0x16, 0x0C, 0x08, 0x12, 0x0A,
+ 0x05, 0x0E, 0x08, 0x05, 0x2D, 0x1E, 0x13, 0x27,
+ 0x19, 0x0F, 0x22, 0x14, 0x0C, 0x1C, 0x11, 0x0A,
+ 0x17, 0x0C, 0x08
+};
+
+static const ByteProvider k1SpecialPalette2DOSOldFloppyProvider = { ARRAYSIZE(k1SpecialPalette2DOSOldFloppy), k1SpecialPalette2DOSOldFloppy };
+
+static const byte k1SpecialPalette3DOSOldFloppy[51] = {
+ 0x03, 0x03, 0x00, 0x25, 0x30, 0x1B, 0x24, 0x2C,
+ 0x18, 0x23, 0x29, 0x15, 0x22, 0x25, 0x12, 0x21,
+ 0x22, 0x11, 0x1F, 0x1D, 0x0D, 0x1B, 0x18, 0x0B,
+ 0x18, 0x13, 0x0A, 0x14, 0x0E, 0x08, 0x11, 0x0A,
+ 0x05, 0x0E, 0x08, 0x05, 0x21, 0x22, 0x11, 0x1D,
+ 0x1C, 0x0C, 0x19, 0x15, 0x0A, 0x15, 0x0F, 0x08,
+ 0x11, 0x0A, 0x05
+};
+
+static const ByteProvider k1SpecialPalette3DOSOldFloppyProvider = { ARRAYSIZE(k1SpecialPalette3DOSOldFloppy), k1SpecialPalette3DOSOldFloppy };
+
+static const byte k1SpecialPalette4DOSOldFloppy[51] = {
+ 0x06, 0x03, 0x01, 0x33, 0x25, 0x0A, 0x2F, 0x21,
+ 0x0A, 0x2B, 0x1D, 0x08, 0x28, 0x1A, 0x08, 0x24,
+ 0x17, 0x06, 0x21, 0x22, 0x06, 0x1D, 0x11, 0x05,
+ 0x19, 0x0E, 0x05, 0x16, 0x0B, 0x03, 0x12, 0x0A,
+ 0x03, 0x0F, 0x08, 0x03, 0x28, 0x1A, 0x08, 0x22,
+ 0x15, 0x05, 0x1D, 0x11, 0x05, 0x17, 0x0C, 0x03,
+ 0x12, 0x0A, 0x03
+};
+
+static const ByteProvider k1SpecialPalette4DOSOldFloppyProvider = { ARRAYSIZE(k1SpecialPalette4DOSOldFloppy), k1SpecialPalette4DOSOldFloppy };
+
+static const byte k1SpecialPalette5DOSOldFloppy[51] = {
+ 0x03, 0x03, 0x00, 0x2A, 0x1D, 0x13, 0x27, 0x1A,
+ 0x11, 0x24, 0x18, 0x0F, 0x21, 0x15, 0x0D, 0x1E,
+ 0x13, 0x0C, 0x1C, 0x11, 0x0A, 0x19, 0x0F, 0x0A,
+ 0x16, 0x0C, 0x08, 0x13, 0x0A, 0x06, 0x11, 0x08,
+ 0x05, 0x0E, 0x08, 0x05, 0x1C, 0x11, 0x0A, 0x19,
+ 0x0E, 0x08, 0x16, 0x0C, 0x08, 0x13, 0x0A, 0x06,
+ 0x11, 0x08, 0x05
+};
+
+static const ByteProvider k1SpecialPalette5DOSOldFloppyProvider = { ARRAYSIZE(k1SpecialPalette5DOSOldFloppy), k1SpecialPalette5DOSOldFloppy };
+
+static const byte k1SpecialPalette6DOSOldFloppy[51] = {
+ 0x00, 0x08, 0x01, 0x00, 0x1E, 0x00, 0x00, 0x1B,
+ 0x00, 0x00, 0x19, 0x00, 0x00, 0x17, 0x00, 0x00,
+ 0x14, 0x00, 0x00, 0x12, 0x00, 0x00, 0x11, 0x00,
+ 0x00, 0x0E, 0x00, 0x00, 0x0B, 0x00, 0x00, 0x0A,
+ 0x00, 0x00, 0x08, 0x00, 0x13, 0x21, 0x0F, 0x11,
+ 0x1F, 0x0D, 0x0E, 0x1D, 0x0C, 0x0C, 0x1B, 0x0B,
+ 0x0A, 0x19, 0x0A
+};
+
+static const ByteProvider k1SpecialPalette6DOSOldFloppyProvider = { ARRAYSIZE(k1SpecialPalette6DOSOldFloppy), k1SpecialPalette6DOSOldFloppy };
+
+static const byte k1SpecialPalette7DOSOldFloppy[54] = {
+ 0x05, 0x2B, 0x00, 0x00, 0x22, 0x00, 0x00, 0x1E,
+ 0x00, 0x00, 0x16, 0x01, 0x00, 0x12, 0x03, 0x00,
+ 0x0F, 0x01, 0x00, 0x0B, 0x03, 0x0A, 0x19, 0x0A,
+ 0x2D, 0x2D, 0x32, 0x29, 0x29, 0x2D, 0x25, 0x25,
+ 0x2B, 0x1F, 0x1F, 0x26, 0x1B, 0x1B, 0x22, 0x14,
+ 0x16, 0x1D, 0x11, 0x11, 0x18, 0x0D, 0x0D, 0x14,
+ 0x0A, 0x0A, 0x0F, 0x06, 0x06, 0x0B
+};
+
+static const ByteProvider k1SpecialPalette7DOSOldFloppyProvider = { ARRAYSIZE(k1SpecialPalette7DOSOldFloppy), k1SpecialPalette7DOSOldFloppy };
+
+static const byte k1SpecialPalette8DOSOldFloppy[54] = {
+ 0x12, 0x37, 0x3F, 0x14, 0x31, 0x3F, 0x14, 0x29,
+ 0x3F, 0x14, 0x22, 0x3F, 0x14, 0x1B, 0x3F, 0x14,
+ 0x14, 0x3F, 0x0E, 0x0F, 0x37, 0x14, 0x29, 0x3F,
+ 0x2F, 0x3F, 0x3D, 0x26, 0x3F, 0x3F, 0x15, 0x3F,
+ 0x3F, 0x14, 0x3B, 0x3F, 0x12, 0x37, 0x3F, 0x14,
+ 0x31, 0x3F, 0x14, 0x29, 0x3F, 0x14, 0x22, 0x3F,
+ 0x14, 0x1B, 0x3F, 0x14, 0x14, 0x3F
+};
+
+static const ByteProvider k1SpecialPalette8DOSOldFloppyProvider = { ARRAYSIZE(k1SpecialPalette8DOSOldFloppy), k1SpecialPalette8DOSOldFloppy };
+
+static const byte k1SpecialPalette9DOSOldFloppy[45] = {
+ 0x36, 0x00, 0x00, 0x32, 0x00, 0x00, 0x2F, 0x00,
+ 0x00, 0x2C, 0x00, 0x00, 0x29, 0x00, 0x00, 0x26,
+ 0x00, 0x00, 0x23, 0x00, 0x00, 0x20, 0x00, 0x00,
+ 0x1C, 0x00, 0x00, 0x19, 0x00, 0x00, 0x16, 0x00,
+ 0x00, 0x13, 0x00, 0x00, 0x11, 0x00, 0x00, 0x0D,
+ 0x00, 0x00, 0x0A, 0x00, 0x00
+};
+
+static const ByteProvider k1SpecialPalette9DOSOldFloppyProvider = { ARRAYSIZE(k1SpecialPalette9DOSOldFloppy), k1SpecialPalette9DOSOldFloppy };
+
+static const byte k1SpecialPalette10DOSOldFloppy[45] = {
+ 0x29, 0x00, 0x00, 0x26, 0x00, 0x00, 0x24, 0x00,
+ 0x00, 0x22, 0x00, 0x00, 0x20, 0x00, 0x00, 0x1E,
+ 0x00, 0x00, 0x1B, 0x00, 0x00, 0x19, 0x00, 0x00,
+ 0x17, 0x00, 0x00, 0x15, 0x00, 0x00, 0x12, 0x00,
+ 0x00, 0x11, 0x00, 0x00, 0x0E, 0x00, 0x00, 0x0C,
+ 0x00, 0x00, 0x0A, 0x00, 0x00
+};
+
+static const ByteProvider k1SpecialPalette10DOSOldFloppyProvider = { ARRAYSIZE(k1SpecialPalette10DOSOldFloppy), k1SpecialPalette10DOSOldFloppy };
+
+static const byte k1SpecialPalette11DOSOldFloppy[45] = {
+ 0x20, 0x00, 0x00, 0x1E, 0x00, 0x00, 0x1C, 0x00,
+ 0x00, 0x1B, 0x00, 0x00, 0x19, 0x00, 0x00, 0x18,
+ 0x00, 0x00, 0x16, 0x00, 0x00, 0x15, 0x00, 0x00,
+ 0x13, 0x00, 0x00, 0x11, 0x00, 0x00, 0x11, 0x00,
+ 0x00, 0x0E, 0x00, 0x00, 0x0D, 0x00, 0x00, 0x0B,
+ 0x00, 0x00, 0x0A, 0x00, 0x00
+};
+
+static const ByteProvider k1SpecialPalette11DOSOldFloppyProvider = { ARRAYSIZE(k1SpecialPalette11DOSOldFloppy), k1SpecialPalette11DOSOldFloppy };
+
+static const byte k1SpecialPalette12DOSOldFloppy[45] = {
+ 0x19, 0x00, 0x00, 0x18, 0x00, 0x00, 0x16, 0x00,
+ 0x00, 0x15, 0x00, 0x00, 0x14, 0x00, 0x00, 0x13,
+ 0x00, 0x00, 0x12, 0x00, 0x00, 0x11, 0x00, 0x00,
+ 0x11, 0x00, 0x00, 0x0F, 0x00, 0x00, 0x0E, 0x00,
+ 0x00, 0x0D, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x0B,
+ 0x00, 0x00, 0x0A, 0x00, 0x00
+};
+
+static const ByteProvider k1SpecialPalette12DOSOldFloppyProvider = { ARRAYSIZE(k1SpecialPalette12DOSOldFloppy), k1SpecialPalette12DOSOldFloppy };
+
+static const byte k1SpecialPalette13DOSOldFloppy[45] = {
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00
+};
+
+static const ByteProvider k1SpecialPalette13DOSOldFloppyProvider = { ARRAYSIZE(k1SpecialPalette13DOSOldFloppy), k1SpecialPalette13DOSOldFloppy };
+
+static const byte k1SpecialPalette14DOSOldFloppy[60] = {
+ 0x0E, 0x28, 0x3F, 0x0C, 0x24, 0x3B, 0x0A, 0x20,
+ 0x38, 0x0A, 0x1C, 0x34, 0x08, 0x19, 0x31, 0x08,
+ 0x15, 0x2D, 0x05, 0x13, 0x2A, 0x05, 0x11, 0x27,
+ 0x03, 0x0D, 0x24, 0x03, 0x0A, 0x20, 0x03, 0x08,
+ 0x1D, 0x01, 0x06, 0x19, 0x01, 0x05, 0x16, 0x00,
+ 0x03, 0x13, 0x00, 0x01, 0x0F, 0x00, 0x01, 0x0C,
+ 0x00, 0x00, 0x08, 0x00, 0x00, 0x05, 0x00, 0x00,
+ 0x03, 0x00, 0x00, 0x00
+};
+
+static const ByteProvider k1SpecialPalette14DOSOldFloppyProvider = { ARRAYSIZE(k1SpecialPalette14DOSOldFloppy), k1SpecialPalette14DOSOldFloppy };
+
+static const byte k1SpecialPalette15DOSOldFloppy[45] = {
+ 0x24, 0x00, 0x39, 0x21, 0x00, 0x36, 0x1F, 0x00,
+ 0x32, 0x1C, 0x00, 0x2D, 0x1A, 0x00, 0x2A, 0x17,
+ 0x00, 0x26, 0x15, 0x00, 0x22, 0x12, 0x00, 0x1E,
+ 0x11, 0x00, 0x1A, 0x0E, 0x00, 0x16, 0x0B, 0x00,
+ 0x12, 0x0A, 0x00, 0x0F, 0x06, 0x00, 0x0B, 0x05,
+ 0x00, 0x08, 0x01, 0x00, 0x03
+};
+
+static const ByteProvider k1SpecialPalette15DOSOldFloppyProvider = { ARRAYSIZE(k1SpecialPalette15DOSOldFloppy), k1SpecialPalette15DOSOldFloppy };
+
+static const byte k1SpecialPalette16DOSOldFloppy[33] = {
+ 0x00, 0x3F, 0x3F, 0x00, 0x38, 0x38, 0x00, 0x34,
+ 0x34, 0x00, 0x30, 0x30, 0x00, 0x2D, 0x2D, 0x00,
+ 0x29, 0x29, 0x00, 0x25, 0x25, 0x00, 0x1F, 0x1F,
+ 0x00, 0x1B, 0x1B, 0x00, 0x16, 0x16, 0x00, 0x11,
+ 0x11
+};
+
+static const ByteProvider k1SpecialPalette16DOSOldFloppyProvider = { ARRAYSIZE(k1SpecialPalette16DOSOldFloppy), k1SpecialPalette16DOSOldFloppy };
+
+static const byte k1SpecialPalette17DOSOldFloppy[33] = {
+ 0x3B, 0x3B, 0x3B, 0x36, 0x36, 0x36, 0x32, 0x32,
+ 0x32, 0x2D, 0x2D, 0x2D, 0x2A, 0x2A, 0x2A, 0x26,
+ 0x26, 0x26, 0x21, 0x21, 0x21, 0x1D, 0x1D, 0x1D,
+ 0x19, 0x19, 0x19, 0x15, 0x15, 0x15, 0x11, 0x11,
+ 0x11
+};
+
+static const ByteProvider k1SpecialPalette17DOSOldFloppyProvider = { ARRAYSIZE(k1SpecialPalette17DOSOldFloppy), k1SpecialPalette17DOSOldFloppy };
+
+static const byte k1SpecialPalette18DOSOldFloppy[21] = {
+ 0x0F, 0x23, 0x1C, 0x2A, 0x36, 0x3F, 0x24, 0x2F,
+ 0x38, 0x1F, 0x2A, 0x32, 0x1A, 0x24, 0x2B, 0x15,
+ 0x1E, 0x25, 0x11, 0x19, 0x1F
+};
+
+static const ByteProvider k1SpecialPalette18DOSOldFloppyProvider = { ARRAYSIZE(k1SpecialPalette18DOSOldFloppy), k1SpecialPalette18DOSOldFloppy };
+
+static const byte k1SpecialPalette19DOSOldFloppy[21] = {
+ 0x00, 0x00, 0x1C, 0x00, 0x00, 0x3F, 0x00, 0x00,
+ 0x38, 0x00, 0x00, 0x32, 0x00, 0x00, 0x2B, 0x00,
+ 0x00, 0x25, 0x00, 0x00, 0x1F
+};
+
+static const ByteProvider k1SpecialPalette19DOSOldFloppyProvider = { ARRAYSIZE(k1SpecialPalette19DOSOldFloppy), k1SpecialPalette19DOSOldFloppy };
+
+static const byte k1SpecialPalette20DOSOldFloppy[21] = {
+ 0x26, 0x1B, 0x1B, 0x3F, 0x34, 0x34, 0x3B, 0x2F,
+ 0x2F, 0x39, 0x2B, 0x2B, 0x36, 0x26, 0x27, 0x33,
+ 0x22, 0x23, 0x31, 0x1F, 0x20
+};
+
+static const ByteProvider k1SpecialPalette20DOSOldFloppyProvider = { ARRAYSIZE(k1SpecialPalette20DOSOldFloppy), k1SpecialPalette20DOSOldFloppy };
+
+static const byte k1SpecialPalette21DOSOldFloppy[21] = {
+ 0x1C, 0x00, 0x00, 0x3F, 0x00, 0x00, 0x38, 0x00,
+ 0x00, 0x32, 0x00, 0x00, 0x2B, 0x00, 0x00, 0x25,
+ 0x00, 0x00, 0x1F, 0x00, 0x00
+};
+
+static const ByteProvider k1SpecialPalette21DOSOldFloppyProvider = { ARRAYSIZE(k1SpecialPalette21DOSOldFloppy), k1SpecialPalette21DOSOldFloppy };
+
+static const byte k1SpecialPalette22DOSOldFloppy[21] = {
+ 0x1F, 0x1F, 0x0C, 0x3F, 0x3F, 0x21, 0x3B, 0x3B,
+ 0x1F, 0x37, 0x37, 0x1D, 0x34, 0x34, 0x1B, 0x30,
+ 0x30, 0x19, 0x2D, 0x2D, 0x17
+};
+
+static const ByteProvider k1SpecialPalette22DOSOldFloppyProvider = { ARRAYSIZE(k1SpecialPalette22DOSOldFloppy), k1SpecialPalette22DOSOldFloppy };
+
+static const byte k1SpecialPalette23DOSOldFloppy[21] = {
+ 0x1F, 0x1F, 0x00, 0x3F, 0x3F, 0x00, 0x3B, 0x3B,
+ 0x00, 0x37, 0x37, 0x00, 0x34, 0x34, 0x00, 0x30,
+ 0x30, 0x00, 0x2D, 0x2D, 0x00
+};
+
+static const ByteProvider k1SpecialPalette23DOSOldFloppyProvider = { ARRAYSIZE(k1SpecialPalette23DOSOldFloppy), k1SpecialPalette23DOSOldFloppy };
+
+static const byte k1SpecialPalette24DOSOldFloppy[48] = {
+ 0x36, 0x38, 0x2C, 0x31, 0x38, 0x23, 0x2A, 0x33,
+ 0x1E, 0x24, 0x2F, 0x1A, 0x1E, 0x2A, 0x16, 0x18,
+ 0x26, 0x13, 0x13, 0x21, 0x0F, 0x0E, 0x1D, 0x0D,
+ 0x0D, 0x1B, 0x0C, 0x0A, 0x19, 0x0A, 0x0A, 0x18,
+ 0x0A, 0x08, 0x17, 0x08, 0x08, 0x16, 0x08, 0x08,
+ 0x15, 0x06, 0x06, 0x14, 0x06, 0x06, 0x11, 0x06
+};
+
+static const ByteProvider k1SpecialPalette24DOSOldFloppyProvider = { ARRAYSIZE(k1SpecialPalette24DOSOldFloppy), k1SpecialPalette24DOSOldFloppy };
+
+static const byte k1SpecialPalette25DOSOldFloppy[48] = {
+ 0x36, 0x38, 0x2C, 0x31, 0x36, 0x23, 0x2A, 0x33,
+ 0x1E, 0x24, 0x2F, 0x1A, 0x1E, 0x2A, 0x16, 0x1E,
+ 0x2A, 0x16, 0x18, 0x26, 0x13, 0x13, 0x21, 0x0F,
+ 0x0E, 0x1D, 0x0D, 0x0D, 0x1B, 0x0C, 0x0D, 0x1B,
+ 0x0C, 0x0A, 0x19, 0x0A, 0x0A, 0x18, 0x0A, 0x0A,
+ 0x18, 0x0A, 0x0A, 0x18, 0x0A, 0x06, 0x14, 0x06
+};
+
+static const ByteProvider k1SpecialPalette25DOSOldFloppyProvider = { ARRAYSIZE(k1SpecialPalette25DOSOldFloppy), k1SpecialPalette25DOSOldFloppy };
+
+static const byte k1SpecialPalette26DOSOldFloppy[48] = {
+ 0x31, 0x38, 0x23, 0x31, 0x38, 0x23, 0x2A, 0x33,
+ 0x1E, 0x24, 0x2F, 0x1A, 0x19, 0x2A, 0x16, 0x18,
+ 0x26, 0x13, 0x13, 0x21, 0x0F, 0x13, 0x21, 0x11,
+ 0x13, 0x21, 0x0F, 0x0E, 0x1D, 0x0D, 0x0E, 0x1D,
+ 0x0D, 0x0E, 0x1D, 0x0D, 0x0D, 0x1B, 0x0C, 0x0A,
+ 0x19, 0x0A, 0x0A, 0x19, 0x0A, 0x06, 0x13, 0x06
+};
+
+static const ByteProvider k1SpecialPalette26DOSOldFloppyProvider = { ARRAYSIZE(k1SpecialPalette26DOSOldFloppy), k1SpecialPalette26DOSOldFloppy };
+
+static const byte k1SpecialPalette27DOSOldFloppy[48] = {
+ 0x31, 0x38, 0x23, 0x31, 0x38, 0x23, 0x2A, 0x33,
+ 0x1E, 0x24, 0x2F, 0x1A, 0x19, 0x2A, 0x16, 0x18,
+ 0x26, 0x13, 0x13, 0x21, 0x0F, 0x13, 0x21, 0x0F,
+ 0x13, 0x21, 0x0F, 0x0E, 0x1D, 0x0D, 0x0E, 0x1D,
+ 0x0D, 0x0E, 0x1D, 0x0D, 0x0D, 0x1B, 0x0C, 0x0D,
+ 0x19, 0x0C, 0x0D, 0x19, 0x0C, 0x08, 0x16, 0x08
+};
+
+static const ByteProvider k1SpecialPalette27DOSOldFloppyProvider = { ARRAYSIZE(k1SpecialPalette27DOSOldFloppy), k1SpecialPalette27DOSOldFloppy };
+
+static const byte k1SpecialPalette28DOSOldFloppy[48] = {
+ 0x36, 0x38, 0x2C, 0x31, 0x38, 0x23, 0x2A, 0x33,
+ 0x1E, 0x24, 0x2F, 0x1A, 0x19, 0x2A, 0x16, 0x1E,
+ 0x2A, 0x16, 0x18, 0x26, 0x13, 0x13, 0x21, 0x0F,
+ 0x13, 0x21, 0x0F, 0x13, 0x21, 0x0F, 0x13, 0x21,
+ 0x0F, 0x0E, 0x1D, 0x0D, 0x0D, 0x1B, 0x0C, 0x0D,
+ 0x1B, 0x0C, 0x0D, 0x1B, 0x0C, 0x08, 0x17, 0x08
+};
+
+static const ByteProvider k1SpecialPalette28DOSOldFloppyProvider = { ARRAYSIZE(k1SpecialPalette28DOSOldFloppy), k1SpecialPalette28DOSOldFloppy };
+
+static const byte k1SpecialPalette29DOSOldFloppy[48] = {
+ 0x36, 0x38, 0x2C, 0x31, 0x38, 0x23, 0x2A, 0x33,
+ 0x1E, 0x24, 0x2F, 0x1A, 0x19, 0x2A, 0x16, 0x1E,
+ 0x2A, 0x16, 0x18, 0x26, 0x13, 0x13, 0x21, 0x0F,
+ 0x13, 0x21, 0x0F, 0x13, 0x21, 0x0F, 0x13, 0x21,
+ 0x0F, 0x13, 0x21, 0x0F, 0x0E, 0x1D, 0x0D, 0x0E,
+ 0x1D, 0x0D, 0x0E, 0x1D, 0x0D, 0x08, 0x17, 0x08
+};
+
+static const ByteProvider k1SpecialPalette29DOSOldFloppyProvider = { ARRAYSIZE(k1SpecialPalette29DOSOldFloppy), k1SpecialPalette29DOSOldFloppy };
+
+static const byte k1SpecialPalette30DOSOldFloppy[60] = {
+ 0x1E, 0x1D, 0x3F, 0x1A, 0x19, 0x3F, 0x14, 0x12,
+ 0x3B, 0x12, 0x11, 0x37, 0x11, 0x11, 0x33, 0x0F,
+ 0x0E, 0x2F, 0x0E, 0x0D, 0x2C, 0x0D, 0x0C, 0x28,
+ 0x0B, 0x0B, 0x24, 0x0A, 0x0A, 0x20, 0x0A, 0x0A,
+ 0x1D, 0x05, 0x05, 0x18, 0x03, 0x03, 0x13, 0x01,
+ 0x01, 0x11, 0x00, 0x00, 0x0A, 0x00, 0x00, 0x05,
+ 0x00, 0x0A, 0x1A, 0x00, 0x0F, 0x13, 0x00, 0x14,
+ 0x11, 0x0F, 0x0D, 0x00
+};
+
+static const ByteProvider k1SpecialPalette30DOSOldFloppyProvider = { ARRAYSIZE(k1SpecialPalette30DOSOldFloppy), k1SpecialPalette30DOSOldFloppy };
+
+static const byte k1SpecialPalette31DOSOldFloppy[39] = {
+ 0x2B, 0x19, 0x34, 0x27, 0x17, 0x30, 0x23, 0x14,
+ 0x2C, 0x20, 0x12, 0x27, 0x1C, 0x11, 0x23, 0x18,
+ 0x0E, 0x1E, 0x15, 0x0C, 0x1A, 0x11, 0x0A, 0x15,
+ 0x0E, 0x08, 0x11, 0x0A, 0x05, 0x0C, 0x06, 0x03,
+ 0x08, 0x03, 0x01, 0x03, 0x00, 0x00, 0x00
+};
+
+static const ByteProvider k1SpecialPalette31DOSOldFloppyProvider = { ARRAYSIZE(k1SpecialPalette31DOSOldFloppy), k1SpecialPalette31DOSOldFloppy };
+
+static const byte k1SpecialPalette32DOSOldFloppy[39] = {
+ 0x12, 0x12, 0x16, 0x11, 0x11, 0x14, 0x0F, 0x0F,
+ 0x12, 0x0D, 0x0D, 0x11, 0x0B, 0x0B, 0x0E, 0x0A,
+ 0x0A, 0x0C, 0x08, 0x08, 0x0A, 0x08, 0x08, 0x08,
+ 0x05, 0x05, 0x06, 0x05, 0x05, 0x05, 0x03, 0x03,
+ 0x03, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00
+};
+
+static const ByteProvider k1SpecialPalette32DOSOldFloppyProvider = { ARRAYSIZE(k1SpecialPalette32DOSOldFloppy), k1SpecialPalette32DOSOldFloppy };
+
+static const Shape k1Healing1ShapesDOSOldFloppy[22] = {
+ { 8, 0, 0, 3, 48, -12, -48 },
+ { 8, 3, 0, 3, 48, -12, -48 },
+ { 8, 6, 0, 3, 48, -12, -48 },
+ { 8, 9, 0, 3, 48, -12, -48 },
+ { 8, 12, 0, 3, 48, -12, -48 },
+ { 8, 15, 0, 3, 48, -12, -48 },
+ { 8, 18, 0, 3, 48, -12, -48 },
+ { 8, 21, 0, 3, 48, -12, -48 },
+ { 8, 24, 0, 3, 48, -12, -48 },
+ { 8, 27, 0, 3, 48, -12, -48 },
+ { 8, 30, 0, 3, 48, -12, -48 },
+ { 8, 33, 0, 3, 48, -12, -48 },
+ { 8, 0, 48, 3, 48, -12, -48 },
+ { 8, 3, 48, 3, 48, -12, -48 },
+ { 8, 6, 48, 3, 48, -12, -48 },
+ { 8, 9, 48, 3, 48, -12, -48 },
+ { 8, 12, 48, 3, 48, -12, -48 },
+ { 8, 15, 48, 3, 48, -12, -48 },
+ { 8, 18, 48, 3, 48, -12, -48 },
+ { 8, 21, 48, 3, 48, -12, -48 },
+ { 8, 24, 48, 3, 48, -12, -48 },
+ { 8, 27, 48, 3, 48, -12, -48 }
+};
+
+static const ShapeProvider k1Healing1ShapesDOSOldFloppyProvider = { ARRAYSIZE(k1Healing1ShapesDOSOldFloppy), k1Healing1ShapesDOSOldFloppy };
+
+static const Shape k1Healing2ShapesDOSOldFloppy[30] = {
+ { 9, 0, 0, 3, 48, -11, -48 },
+ { 9, 3, 0, 3, 48, -11, -48 },
+ { 9, 6, 0, 3, 48, -11, -48 },
+ { 9, 9, 0, 3, 48, -11, -48 },
+ { 9, 12, 0, 3, 48, -11, -48 },
+ { 9, 15, 0, 3, 48, -11, -48 },
+ { 9, 18, 0, 3, 48, -11, -48 },
+ { 9, 21, 0, 3, 48, -11, -48 },
+ { 9, 24, 0, 3, 48, -11, -48 },
+ { 9, 27, 0, 3, 48, -11, -48 },
+ { 9, 30, 0, 3, 48, -11, -48 },
+ { 9, 33, 0, 3, 48, -11, -48 },
+ { 9, 0, 48, 3, 48, -11, -48 },
+ { 9, 3, 48, 3, 48, -11, -48 },
+ { 9, 6, 48, 3, 48, -11, -48 },
+ { 9, 9, 48, 3, 48, -11, -48 },
+ { 9, 12, 48, 3, 48, -11, -48 },
+ { 9, 15, 48, 3, 48, -11, -48 },
+ { 9, 18, 48, 3, 48, -11, -48 },
+ { 9, 21, 48, 3, 48, -11, -48 },
+ { 9, 24, 48, 3, 48, -11, -48 },
+ { 9, 27, 48, 3, 48, -11, -48 },
+ { 9, 30, 48, 3, 48, -11, -48 },
+ { 9, 33, 48, 3, 48, -11, -48 },
+ { 9, 0, 96, 3, 48, -11, -48 },
+ { 9, 3, 96, 3, 48, -11, -48 },
+ { 9, 6, 96, 3, 48, -11, -48 },
+ { 9, 9, 96, 3, 48, -11, -48 },
+ { 9, 12, 96, 3, 48, -11, -48 },
+ { 9, 15, 96, 3, 48, -11, -48 }
+};
+
+static const ShapeProvider k1Healing2ShapesDOSOldFloppyProvider = { ARRAYSIZE(k1Healing2ShapesDOSOldFloppy), k1Healing2ShapesDOSOldFloppy };
+
+static const Shape k1PoisonDeathShapesDOSOldFloppy[20] = {
+ { 19, 0, 0, 8, 48, -32, -48 },
+ { 19, 8, 0, 8, 48, -32, -48 },
+ { 19, 16, 0, 8, 48, -32, -48 },
+ { 19, 24, 0, 8, 48, -32, -48 },
+ { 19, 32, 0, 8, 48, -32, -48 },
+ { 19, 0, 48, 8, 48, -32, -48 },
+ { 19, 8, 48, 8, 48, -32, -48 },
+ { 19, 16, 48, 8, 48, -32, -48 },
+ { 19, 24, 48, 8, 48, -32, -48 },
+ { 19, 32, 48, 8, 48, -32, -48 },
+ { 19, 0, 96, 8, 48, -32, -48 },
+ { 19, 8, 96, 8, 48, -32, -48 },
+ { 19, 16, 96, 8, 48, -32, -48 },
+ { 19, 24, 96, 8, 48, -32, -48 },
+ { 19, 32, 96, 8, 48, -32, -48 },
+ { 19, 0, 144, 8, 48, -32, -48 },
+ { 19, 8, 144, 8, 48, -32, -48 },
+ { 19, 16, 144, 8, 48, -32, -48 },
+ { 19, 24, 144, 8, 48, -32, -48 },
+ { 19, 32, 144, 8, 48, -32, -48 }
+};
+
+static const ShapeProvider k1PoisonDeathShapesDOSOldFloppyProvider = { ARRAYSIZE(k1PoisonDeathShapesDOSOldFloppy), k1PoisonDeathShapesDOSOldFloppy };
+
+static const Shape k1FluteShapesDOSOldFloppy[36] = {
+ { 13, 0, 0, 3, 75, -12, -75 },
+ { 13, 3, 0, 3, 75, -12, -75 },
+ { 13, 6, 0, 3, 75, -12, -75 },
+ { 13, 9, 0, 3, 75, -12, -75 },
+ { 13, 12, 0, 3, 75, -12, -75 },
+ { 13, 15, 0, 3, 75, -12, -75 },
+ { 13, 18, 0, 3, 75, -12, -75 },
+ { 13, 21, 0, 3, 75, -12, -75 },
+ { 13, 24, 0, 3, 75, -12, -75 },
+ { 13, 27, 0, 3, 75, -12, -75 },
+ { 13, 30, 0, 3, 75, -12, -75 },
+ { 13, 33, 0, 3, 75, -12, -75 },
+ { 13, 36, 75, 3, 75, -12, -75 },
+ { 13, 0, 75, 3, 75, -12, -75 },
+ { 13, 3, 75, 3, 75, -12, -75 },
+ { 13, 6, 75, 3, 75, -12, -75 },
+ { 13, 9, 75, 3, 75, -12, -75 },
+ { 13, 12, 75, 3, 75, -12, -75 },
+ { 13, 15, 75, 3, 75, -12, -75 },
+ { 13, 18, 75, 3, 75, -12, -75 },
+ { 13, 21, 75, 3, 75, -12, -75 },
+ { 13, 24, 75, 3, 75, -12, -75 },
+ { 13, 27, 75, 3, 75, -12, -75 },
+ { 13, 30, 75, 3, 75, -12, -75 },
+ { 13, 33, 75, 3, 75, -12, -75 },
+ { 13, 36, 75, 3, 75, -12, -75 },
+ { 14, 0, 0, 3, 75, -12, -75 },
+ { 14, 3, 0, 3, 75, -12, -75 },
+ { 14, 6, 0, 3, 75, -12, -75 },
+ { 14, 9, 0, 3, 75, -12, -75 },
+ { 14, 12, 0, 3, 75, -12, -75 },
+ { 14, 15, 0, 3, 75, -12, -75 },
+ { 14, 18, 0, 3, 75, -12, -75 },
+ { 14, 21, 0, 3, 75, -12, -75 },
+ { 14, 24, 0, 3, 75, -12, -75 },
+ { 14, 27, 0, 3, 75, -12, -75 }
+};
+
+static const ShapeProvider k1FluteShapesDOSOldFloppyProvider = { ARRAYSIZE(k1FluteShapesDOSOldFloppy), k1FluteShapesDOSOldFloppy };
+
+static const Shape k1Winter1ShapesDOSOldFloppy[7] = {
+ { 10, 5, 0, 5, 66, -20, -65 },
+ { 10, 10, 0, 5, 66, -20, -65 },
+ { 10, 15, 0, 5, 66, -20, -65 },
+ { 10, 20, 0, 5, 66, -20, -65 },
+ { 10, 25, 0, 5, 66, -20, -65 },
+ { 10, 30, 0, 5, 66, -20, -65 },
+ { 10, 35, 0, 5, 66, -20, -65 }
+};
+
+static const ShapeProvider k1Winter1ShapesDOSOldFloppyProvider = { ARRAYSIZE(k1Winter1ShapesDOSOldFloppy), k1Winter1ShapesDOSOldFloppy };
+
+static const Shape k1Winter2ShapesDOSOldFloppy[35] = {
+ { 10, 0, 66, 5, 66, -20, -65 },
+ { 10, 5, 66, 5, 66, -20, -65 },
+ { 10, 10, 66, 5, 66, -20, -65 },
+ { 10, 15, 66, 5, 66, -20, -65 },
+ { 10, 20, 66, 5, 66, -20, -65 },
+ { 10, 25, 66, 5, 66, -20, -65 },
+ { 10, 30, 66, 5, 66, -20, -65 },
+ { 10, 35, 66, 5, 66, -20, -65 },
+ { 10, 0, 132, 5, 66, -20, -65 },
+ { 10, 5, 132, 5, 66, -20, -65 },
+ { 10, 10, 132, 5, 66, -20, -65 },
+ { 10, 15, 132, 5, 66, -20, -65 },
+ { 10, 20, 132, 5, 66, -20, -65 },
+ { 10, 25, 132, 5, 66, -20, -65 },
+ { 10, 30, 132, 5, 66, -20, -65 },
+ { 10, 35, 132, 5, 66, -20, -65 },
+ { 11, 0, 0, 5, 66, -20, -65 },
+ { 11, 5, 0, 5, 66, -20, -65 },
+ { 11, 10, 0, 5, 66, -20, -65 },
+ { 11, 15, 0, 5, 66, -20, -65 },
+ { 11, 20, 0, 5, 66, -20, -65 },
+ { 11, 25, 0, 5, 66, -20, -65 },
+ { 11, 30, 0, 5, 66, -20, -65 },
+ { 11, 35, 0, 5, 66, -20, -65 },
+ { 11, 0, 66, 5, 66, -20, -65 },
+ { 11, 5, 66, 5, 66, -20, -65 },
+ { 11, 10, 66, 5, 66, -20, -65 },
+ { 11, 15, 66, 5, 66, -20, -65 },
+ { 11, 20, 66, 5, 66, -20, -65 },
+ { 11, 25, 66, 5, 66, -20, -65 },
+ { 11, 30, 66, 5, 66, -20, -65 },
+ { 11, 35, 66, 5, 66, -20, -65 },
+ { 11, 0, 132, 5, 66, -20, -65 },
+ { 11, 5, 132, 5, 66, -20, -65 },
+ { 11, 10, 132, 5, 66, -20, -65 }
+};
+
+static const ShapeProvider k1Winter2ShapesDOSOldFloppyProvider = { ARRAYSIZE(k1Winter2ShapesDOSOldFloppy), k1Winter2ShapesDOSOldFloppy };
+
+static const Shape k1Winter3ShapesDOSOldFloppy[4] = {
+ { 11, 15, 132, 5, 66, -20, -65 },
+ { 11, 20, 132, 5, 66, -20, -65 },
+ { 11, 25, 132, 5, 66, -20, -65 },
+ { 11, 30, 132, 5, 66, -20, -65 }
+};
+
+static const ShapeProvider k1Winter3ShapesDOSOldFloppyProvider = { ARRAYSIZE(k1Winter3ShapesDOSOldFloppy), k1Winter3ShapesDOSOldFloppy };
+
+static const Shape k1DrinkShapesDOSOldFloppy[15] = {
+ { 6, 0, 0, 4, 48, -20, -48 },
+ { 6, 4, 0, 4, 48, -20, -48 },
+ { 6, 8, 0, 4, 48, -20, -48 },
+ { 6, 12, 0, 4, 48, -20, -48 },
+ { 6, 16, 0, 4, 48, -20, -48 },
+ { 6, 20, 0, 5, 48, -20, -48 },
+ { 6, 0, 48, 5, 54, -20, -54 },
+ { 6, 5, 48, 5, 54, -20, -54 },
+ { 6, 10, 48, 5, 54, -20, -54 },
+ { 7, 0, 0, 3, 43, -12, -43 },
+ { 7, 3, 3, 2, 40, -8, -40 },
+ { 7, 5, 7, 2, 36, -8, -36 },
+ { 7, 7, 10, 2, 33, -8, -33 },
+ { 7, 9, 12, 2, 31, -8, -31 },
+ { 7, 11, 15, 2, 28, -8, -28 }
+};
+
+static const ShapeProvider k1DrinkShapesDOSOldFloppyProvider = { ARRAYSIZE(k1DrinkShapesDOSOldFloppy), k1DrinkShapesDOSOldFloppy };
+
+static const Shape k1WispShapesDOSOldFloppy[26] = {
+ { 12, 0, 0, 5, 48, -20, -48 },
+ { 12, 5, 0, 5, 48, -20, -48 },
+ { 12, 10, 0, 5, 48, -20, -48 },
+ { 12, 15, 0, 5, 48, -20, -48 },
+ { 12, 20, 0, 5, 48, -20, -48 },
+ { 12, 25, 0, 5, 48, -20, -48 },
+ { 12, 30, 0, 5, 48, -20, -48 },
+ { 12, 35, 0, 5, 48, -20, -48 },
+ { 12, 0, 48, 5, 48, -20, -48 },
+ { 12, 5, 48, 5, 48, -20, -48 },
+ { 12, 10, 48, 5, 48, -20, -48 },
+ { 12, 15, 48, 5, 48, -20, -48 },
+ { 12, 20, 48, 5, 48, -20, -48 },
+ { 12, 25, 48, 5, 48, -20, -48 },
+ { 12, 30, 48, 5, 48, -20, -48 },
+ { 12, 35, 48, 5, 48, -20, -48 },
+ { 12, 0, 96, 5, 29, -20, -42 },
+ { 12, 5, 96, 5, 29, -20, -42 },
+ { 12, 10, 96, 5, 29, -20, -42 },
+ { 12, 15, 96, 5, 29, -20, -42 },
+ { 12, 20, 96, 5, 29, -20, -42 },
+ { 12, 25, 96, 5, 29, -20, -42 },
+ { 12, 30, 96, 5, 29, -20, -42 },
+ { 12, 35, 96, 5, 29, -20, -42 },
+ { 12, 0, 125, 5, 29, -20, -42 },
+ { 12, 5, 125, 5, 29, -20, -42 }
+};
+
+static const ShapeProvider k1WispShapesDOSOldFloppyProvider = { ARRAYSIZE(k1WispShapesDOSOldFloppy), k1WispShapesDOSOldFloppy };
+
+static const Shape k1MagicAnimShapesDOSOldFloppy[5] = {
+ { 17, 0, 0, 8, 49, -32, -49 },
+ { 17, 8, 0, 8, 49, -32, -49 },
+ { 17, 16, 0, 8, 49, -32, -49 },
+ { 17, 24, 0, 8, 49, -32, -49 },
+ { 17, 32, 0, 8, 49, -32, -49 }
+};
+
+static const ShapeProvider k1MagicAnimShapesDOSOldFloppyProvider = { ARRAYSIZE(k1MagicAnimShapesDOSOldFloppy), k1MagicAnimShapesDOSOldFloppy };
+
+static const Shape k1BranStoneShapesDOSOldFloppy[15] = {
+ { 18, 0, 0, 5, 51, -20, -50 },
+ { 18, 5, 0, 5, 51, -20, -50 },
+ { 18, 10, 0, 5, 51, -20, -50 },
+ { 18, 15, 0, 5, 51, -20, -50 },
+ { 18, 20, 0, 5, 51, -20, -50 },
+ { 18, 25, 0, 5, 51, -20, -50 },
+ { 18, 30, 0, 5, 51, -20, -50 },
+ { 18, 35, 0, 5, 51, -20, -50 },
+ { 18, 0, 51, 5, 51, -20, -50 },
+ { 18, 5, 51, 5, 51, -20, -50 },
+ { 18, 10, 51, 5, 51, -20, -50 },
+ { 18, 15, 51, 5, 51, -20, -50 },
+ { 18, 20, 51, 5, 51, -20, -50 },
+ { 18, 25, 51, 5, 51, -20, -50 },
+ { 0, 0, 0, 0, 0, 0, 0 }
+};
+
+static const ShapeProvider k1BranStoneShapesDOSOldFloppyProvider = { ARRAYSIZE(k1BranStoneShapesDOSOldFloppy), k1BranStoneShapesDOSOldFloppy };
+
+static const byte k1OutroReunionSeqDOSOldFloppy[1351] = {
+ 0x1A, 0x00, 0x08, 0x01, 0x06, 0x01, 0x00, 0x02,
+ 0x08, 0x00, 0x50, 0x00, 0x22, 0x07, 0x08, 0x00,
+ 0x14, 0x0A, 0x00, 0x03, 0x08, 0x07, 0x08, 0x00,
+ 0x0B, 0x00, 0x09, 0x00, 0x10, 0x20, 0x5A, 0x00,
+ 0x3A, 0x02, 0x02, 0x08, 0x0D, 0x50, 0x00, 0x22,
+ 0x07, 0x10, 0x00, 0x02, 0x08, 0x0E, 0x50, 0x00,
+ 0x22, 0x07, 0x10, 0x00, 0x02, 0x08, 0x0C, 0x50,
+ 0x00, 0x22, 0x07, 0x10, 0x00, 0x02, 0x08, 0x0B,
+ 0x50, 0x00, 0x22, 0x07, 0x10, 0x00, 0x02, 0x08,
+ 0x0C, 0x50, 0x00, 0x22, 0x07, 0x10, 0x00, 0x02,
+ 0x08, 0x0D, 0x50, 0x00, 0x22, 0x07, 0x10, 0x00,
+ 0x02, 0x08, 0x0E, 0x50, 0x00, 0x22, 0x07, 0x10,
+ 0x00, 0x0A, 0x01, 0x03, 0x08, 0x07, 0x08, 0x00,
+ 0x0B, 0x01, 0x04, 0x00, 0x10, 0x21, 0x5A, 0x00,
+ 0x3A, 0x02, 0x0A, 0x02, 0x02, 0x08, 0x14, 0x50,
+ 0x00, 0x22, 0x07, 0x08, 0x00, 0x03, 0x08, 0x07,
+ 0x08, 0x00, 0x03, 0x08, 0x07, 0x08, 0x00, 0x03,
+ 0x08, 0x07, 0x08, 0x00, 0x03, 0x08, 0x07, 0x08,
+ 0x00, 0x0B, 0x02, 0x01, 0x00, 0x03, 0x08, 0x07,
+ 0x08, 0x00, 0x03, 0x08, 0x07, 0x08, 0x00, 0x03,
+ 0x08, 0x07, 0x08, 0x00, 0x10, 0x22, 0x5A, 0x00,
+ 0x3A, 0x02, 0x0A, 0x03, 0x03, 0x08, 0x07, 0x08,
+ 0x00, 0x0B, 0x03, 0x0B, 0x00, 0x10, 0x23, 0x78,
+ 0x00, 0x3A, 0x0F, 0x0A, 0x03, 0x03, 0x08, 0x07,
+ 0x08, 0x00, 0x0B, 0x03, 0x05, 0x00, 0x06, 0x28,
+ 0x00, 0x02, 0x08, 0x2E, 0x50, 0x00, 0x22, 0x07,
+ 0x10, 0x00, 0x02, 0x08, 0x2D, 0x50, 0x00, 0x22,
+ 0x07, 0x10, 0x00, 0x02, 0x08, 0x2E, 0x50, 0x00,
+ 0x22, 0x07, 0x10, 0x00, 0x02, 0x08, 0x2D, 0x50,
+ 0x00, 0x22, 0x07, 0x10, 0x00, 0x02, 0x08, 0x2E,
+ 0x50, 0x00, 0x22, 0x07, 0x10, 0x00, 0x02, 0x08,
+ 0x2D, 0x50, 0x00, 0x22, 0x07, 0x10, 0x00, 0x02,
+ 0x08, 0x2F, 0x50, 0x00, 0x22, 0x07, 0x08, 0x00,
+ 0x02, 0x08, 0x30, 0x50, 0x00, 0x22, 0x07, 0x08,
+ 0x00, 0x02, 0x08, 0x31, 0x50, 0x00, 0x22, 0x07,
+ 0x08, 0x00, 0x02, 0x08, 0x32, 0x50, 0x00, 0x22,
+ 0x07, 0x08, 0x00, 0x06, 0x0A, 0x00, 0x10, 0x24,
+ 0x5A, 0x00, 0x3A, 0x02, 0x02, 0x08, 0x33, 0x50,
+ 0x00, 0x22, 0x07, 0x08, 0x00, 0x02, 0x08, 0x34,
+ 0x50, 0x00, 0x22, 0x07, 0x08, 0x00, 0x02, 0x08,
+ 0x35, 0x50, 0x00, 0x22, 0x07, 0x08, 0x00, 0x02,
+ 0x08, 0x36, 0x50, 0x00, 0x22, 0x07, 0x08, 0x00,
+ 0x02, 0x08, 0x37, 0x50, 0x00, 0x22, 0x07, 0x08,
+ 0x00, 0x02, 0x08, 0x35, 0x50, 0x00, 0x22, 0x07,
+ 0x08, 0x00, 0x02, 0x08, 0x34, 0x50, 0x00, 0x22,
+ 0x07, 0x08, 0x00, 0x02, 0x08, 0x33, 0x50, 0x00,
+ 0x22, 0x07, 0x08, 0x00, 0x02, 0x08, 0x35, 0x50,
+ 0x00, 0x22, 0x07, 0x08, 0x00, 0x02, 0x08, 0x36,
+ 0x50, 0x00, 0x22, 0x07, 0x08, 0x00, 0x02, 0x08,
+ 0x37, 0x50, 0x00, 0x22, 0x07, 0x08, 0x00, 0x06,
+ 0x0A, 0x00, 0x10, 0x25, 0x5A, 0x00, 0x3A, 0x02,
+ 0x02, 0x08, 0x33, 0x50, 0x00, 0x22, 0x07, 0x08,
+ 0x00, 0x02, 0x08, 0x34, 0x50, 0x00, 0x22, 0x07,
+ 0x08, 0x00, 0x02, 0x08, 0x35, 0x50, 0x00, 0x22,
+ 0x07, 0x08, 0x00, 0x02, 0x08, 0x36, 0x50, 0x00,
+ 0x22, 0x07, 0x08, 0x00, 0x02, 0x08, 0x37, 0x50,
+ 0x00, 0x22, 0x07, 0x08, 0x00, 0x02, 0x08, 0x35,
+ 0x50, 0x00, 0x22, 0x07, 0x08, 0x00, 0x02, 0x08,
+ 0x34, 0x50, 0x00, 0x22, 0x07, 0x08, 0x00, 0x02,
+ 0x08, 0x33, 0x50, 0x00, 0x22, 0x07, 0x08, 0x00,
+ 0x02, 0x08, 0x35, 0x50, 0x00, 0x22, 0x07, 0x08,
+ 0x00, 0x02, 0x08, 0x36, 0x50, 0x00, 0x22, 0x07,
+ 0x08, 0x00, 0x02, 0x08, 0x37, 0x50, 0x00, 0x22,
+ 0x07, 0x08, 0x00, 0x06, 0x1E, 0x00, 0x10, 0x26,
+ 0x78, 0x00, 0x3A, 0x0F, 0x02, 0x08, 0x38, 0x50,
+ 0x00, 0x22, 0x07, 0x08, 0x00, 0x02, 0x08, 0x39,
+ 0x50, 0x00, 0x22, 0x07, 0x08, 0x00, 0x02, 0x08,
+ 0x3A, 0x50, 0x00, 0x22, 0x07, 0x08, 0x00, 0x02,
+ 0x08, 0x38, 0x50, 0x00, 0x22, 0x07, 0x08, 0x00,
+ 0x02, 0x08, 0x3B, 0x50, 0x00, 0x22, 0x07, 0x08,
+ 0x00, 0x06, 0x0A, 0x00, 0x02, 0x08, 0x39, 0x50,
+ 0x00, 0x22, 0x07, 0x08, 0x00, 0x02, 0x08, 0x38,
+ 0x50, 0x00, 0x22, 0x07, 0x08, 0x00, 0x02, 0x08,
+ 0x39, 0x50, 0x00, 0x22, 0x07, 0x08, 0x00, 0x02,
+ 0x08, 0x3A, 0x50, 0x00, 0x22, 0x07, 0x08, 0x00,
+ 0x06, 0x3C, 0x00, 0x11, 0x02, 0x08, 0x33, 0x50,
+ 0x00, 0x22, 0x07, 0x08, 0x00, 0x02, 0x08, 0x32,
+ 0x50, 0x00, 0x22, 0x07, 0x08, 0x00, 0x02, 0x08,
+ 0x31, 0x50, 0x00, 0x22, 0x07, 0x08, 0x00, 0x02,
+ 0x08, 0x30, 0x50, 0x00, 0x22, 0x07, 0x08, 0x00,
+ 0x02, 0x08, 0x2F, 0x50, 0x00, 0x22, 0x07, 0x08,
+ 0x00, 0x02, 0x08, 0x2E, 0x50, 0x00, 0x22, 0x07,
+ 0x08, 0x00, 0x02, 0x08, 0x2D, 0x50, 0x00, 0x22,
+ 0x07, 0x08, 0x00, 0x06, 0x1E, 0x00, 0x02, 0x08,
+ 0x2E, 0x50, 0x00, 0x22, 0x07, 0x08, 0x00, 0x02,
+ 0x08, 0x2F, 0x50, 0x00, 0x22, 0x07, 0x08, 0x00,
+ 0x02, 0x08, 0x30, 0x50, 0x00, 0x22, 0x07, 0x08,
+ 0x00, 0x02, 0x08, 0x31, 0x50, 0x00, 0x22, 0x07,
+ 0x08, 0x00, 0x02, 0x08, 0x32, 0x50, 0x00, 0x22,
+ 0x07, 0x08, 0x00, 0x02, 0x08, 0x33, 0x50, 0x00,
+ 0x22, 0x07, 0x08, 0x00, 0x02, 0x08, 0x41, 0x50,
+ 0x00, 0x22, 0x07, 0x08, 0x00, 0x02, 0x08, 0x42,
+ 0x50, 0x00, 0x22, 0x07, 0x08, 0x00, 0x02, 0x08,
+ 0x43, 0x50, 0x00, 0x22, 0x07, 0x08, 0x00, 0x02,
+ 0x08, 0x44, 0x50, 0x00, 0x22, 0x07, 0x08, 0x00,
+ 0x02, 0x08, 0x45, 0x50, 0x00, 0x22, 0x07, 0x08,
+ 0x00, 0x02, 0x08, 0x46, 0x50, 0x00, 0x22, 0x07,
+ 0x08, 0x00, 0x06, 0x0A, 0x00, 0x10, 0x27, 0x5A,
+ 0x00, 0x3A, 0x02, 0x02, 0x08, 0x4E, 0x50, 0x00,
+ 0x22, 0x07, 0x08, 0x00, 0x02, 0x08, 0x4F, 0x50,
+ 0x00, 0x22, 0x07, 0x08, 0x00, 0x02, 0x08, 0x50,
+ 0x50, 0x00, 0x22, 0x07, 0x08, 0x00, 0x02, 0x08,
+ 0x51, 0x50, 0x00, 0x22, 0x07, 0x08, 0x00, 0x02,
+ 0x08, 0x52, 0x50, 0x00, 0x22, 0x07, 0x08, 0x00,
+ 0x02, 0x08, 0x53, 0x50, 0x00, 0x22, 0x07, 0x08,
+ 0x00, 0x02, 0x08, 0x54, 0x50, 0x00, 0x22, 0x07,
+ 0x08, 0x00, 0x02, 0x08, 0x55, 0x50, 0x00, 0x22,
+ 0x07, 0x08, 0x00, 0x06, 0x3C, 0x00, 0x10, 0x28,
+ 0x78, 0x00, 0x3A, 0x0F, 0x0A, 0x05, 0x02, 0x08,
+ 0x59, 0x50, 0x00, 0x22, 0x07, 0x08, 0x00, 0x02,
+ 0x08, 0x5A, 0x50, 0x00, 0x22, 0x07, 0x08, 0x00,
+ 0x02, 0x08, 0x5B, 0x50, 0x00, 0x22, 0x07, 0x08,
+ 0x00, 0x02, 0x08, 0x5C, 0x50, 0x00, 0x22, 0x07,
+ 0x08, 0x00, 0x02, 0x08, 0x5D, 0x50, 0x00, 0x22,
+ 0x07, 0x08, 0x00, 0x0B, 0x05, 0x01, 0x00, 0x06,
+ 0x28, 0x00, 0x10, 0x29, 0x78, 0x00, 0x3A, 0x0F,
+ 0x0A, 0x06, 0x02, 0x08, 0x59, 0x50, 0x00, 0x22,
+ 0x07, 0x08, 0x00, 0x02, 0x08, 0x5A, 0x50, 0x00,
+ 0x22, 0x07, 0x08, 0x00, 0x02, 0x08, 0x5B, 0x50,
+ 0x00, 0x22, 0x07, 0x08, 0x00, 0x02, 0x08, 0x5C,
+ 0x50, 0x00, 0x22, 0x07, 0x08, 0x00, 0x02, 0x08,
+ 0x5D, 0x50, 0x00, 0x22, 0x07, 0x08, 0x00, 0x0B,
+ 0x06, 0x01, 0x00, 0x06, 0x28, 0x00, 0x10, 0x2A,
+ 0x78, 0x00, 0x3A, 0x0F, 0x02, 0x08, 0x5E, 0x50,
+ 0x00, 0x22, 0x07, 0x10, 0x00, 0x02, 0x08, 0x63,
+ 0x50, 0x00, 0x22, 0x07, 0x10, 0x00, 0x06, 0x5A,
+ 0x00, 0x11, 0x18, 0x69, 0x02, 0x08, 0x64, 0x50,
+ 0x00, 0x22, 0x07, 0x10, 0x00, 0x02, 0x08, 0x65,
+ 0x50, 0x00, 0x22, 0x07, 0x10, 0x00, 0x18, 0x74,
+ 0x02, 0x08, 0x66, 0x50, 0x00, 0x22, 0x07, 0x10,
+ 0x00, 0x02, 0x08, 0x67, 0x50, 0x00, 0x22, 0x07,
+ 0x10, 0x00, 0x18, 0x75, 0x02, 0x08, 0x68, 0x50,
+ 0x00, 0x22, 0x07, 0x10, 0x00, 0x02, 0x08, 0x69,
+ 0x50, 0x00, 0x22, 0x07, 0x10, 0x00, 0x10, 0x2B,
+ 0x96, 0x00, 0x1C, 0x22, 0x0A, 0x06, 0x02, 0x08,
+ 0x6B, 0x50, 0x00, 0x22, 0x07, 0x10, 0x00, 0x02,
+ 0x08, 0x6C, 0x50, 0x00, 0x22, 0x07, 0x10, 0x00,
+ 0x02, 0x08, 0x6D, 0x50, 0x00, 0x22, 0x07, 0x10,
+ 0x00, 0x02, 0x08, 0x6E, 0x50, 0x00, 0x22, 0x07,
+ 0x10, 0x00, 0x02, 0x08, 0x6F, 0x50, 0x00, 0x22,
+ 0x07, 0x10, 0x00, 0x02, 0x08, 0x70, 0x50, 0x00,
+ 0x22, 0x07, 0x10, 0x00, 0x02, 0x08, 0x71, 0x50,
+ 0x00, 0x22, 0x07, 0x10, 0x00, 0x0B, 0x06, 0x01,
+ 0x00, 0x06, 0x1E, 0x00, 0x10, 0x2C, 0x96, 0x00,
+ 0x1C, 0x22, 0x0A, 0x06, 0x02, 0x08, 0x6B, 0x50,
+ 0x00, 0x22, 0x07, 0x10, 0x00, 0x02, 0x08, 0x6C,
+ 0x50, 0x00, 0x22, 0x07, 0x10, 0x00, 0x02, 0x08,
+ 0x6D, 0x50, 0x00, 0x22, 0x07, 0x10, 0x00, 0x02,
+ 0x08, 0x6E, 0x50, 0x00, 0x22, 0x07, 0x10, 0x00,
+ 0x02, 0x08, 0x6F, 0x50, 0x00, 0x22, 0x07, 0x10,
+ 0x00, 0x02, 0x08, 0x70, 0x50, 0x00, 0x22, 0x07,
+ 0x10, 0x00, 0x02, 0x08, 0x71, 0x50, 0x00, 0x22,
+ 0x07, 0x10, 0x00, 0x0B, 0x06, 0x01, 0x00, 0x06,
+ 0x1E, 0x00, 0x10, 0x2D, 0x96, 0x00, 0x1C, 0x22,
+ 0x0A, 0x06, 0x02, 0x08, 0x6B, 0x50, 0x00, 0x22,
+ 0x07, 0x10, 0x00, 0x02, 0x08, 0x6C, 0x50, 0x00,
+ 0x22, 0x07, 0x10, 0x00, 0x02, 0x08, 0x6D, 0x50,
+ 0x00, 0x22, 0x07, 0x10, 0x00, 0x02, 0x08, 0x6E,
+ 0x50, 0x00, 0x22, 0x07, 0x10, 0x00, 0x02, 0x08,
+ 0x6F, 0x50, 0x00, 0x22, 0x07, 0x10, 0x00, 0x02,
+ 0x08, 0x70, 0x50, 0x00, 0x22, 0x07, 0x10, 0x00,
+ 0x02, 0x08, 0x71, 0x50, 0x00, 0x22, 0x07, 0x10,
+ 0x00, 0x0B, 0x06, 0x01, 0x00, 0x06, 0x1E, 0x00,
+ 0x02, 0x08, 0x72, 0x50, 0x00, 0x22, 0x07, 0x10,
+ 0x00, 0x02, 0x08, 0x73, 0x50, 0x00, 0x22, 0x07,
+ 0x10, 0x00, 0x06, 0x14, 0x00, 0x02, 0x08, 0x74,
+ 0x50, 0x00, 0x22, 0x07, 0x10, 0x00, 0x02, 0x08,
+ 0x75, 0x50, 0x00, 0x22, 0x07, 0x10, 0x00, 0x06,
+ 0x78, 0x00, 0x13, 0x0E, 0x01, 0x08, 0x1D
+};
+
+static const ByteProvider k1OutroReunionSeqDOSOldFloppyProvider = { ARRAYSIZE(k1OutroReunionSeqDOSOldFloppy), k1OutroReunionSeqDOSOldFloppy };
+
+static const char *const k1AudioTracksDOSOldFloppy[8] = {
+ "KYRA1A",
+ "KYRA1B",
+ "KYRA2A",
+ "KYRA3A",
+ "KYRA4A",
+ "KYRA4B",
+ "KYRA5A",
+ "KYRA5B"
+};
+
+static const StringListProvider k1AudioTracksDOSOldFloppyProvider = { ARRAYSIZE(k1AudioTracksDOSOldFloppy), k1AudioTracksDOSOldFloppy };
+
+static const char *const k1AudioTracks2DOSOldFloppy[1] = {
+ "kyramisc"
+};
+
+static const StringListProvider k1AudioTracks2DOSOldFloppyProvider = { ARRAYSIZE(k1AudioTracks2DOSOldFloppy), k1AudioTracks2DOSOldFloppy };
+
+static const char *const k1AudioTracksIntroDOSOldFloppy[1] = {
+ "intro"
+};
+
+static const StringListProvider k1AudioTracksIntroDOSOldFloppyProvider = { ARRAYSIZE(k1AudioTracksIntroDOSOldFloppy), k1AudioTracksIntroDOSOldFloppy };
+
diff --git a/devtools/create_kyradat/resources/lok_dos_oldfloppy_russian.h b/devtools/create_kyradat/resources/lok_dos_oldfloppy_russian.h
new file mode 100644
index 0000000000..d0afaf6c50
--- /dev/null
+++ b/devtools/create_kyradat/resources/lok_dos_oldfloppy_russian.h
@@ -0,0 +1,328 @@
+static const char *const k1IntroStringsDOSOldFloppyRussian[51] = {
+ "This is a text test - 1",
+ "This is a text test - 2",
+ "\x08""p""\x18\x14""e""\x1F"", Ka""\x1B\x1B""a""\x1A""...",
+ "...""\x08""o""\x14""e""\x1B\x18\x1F""e""\x1B""{ Kopo""\x1B""e""\x14""c""\x1A""o""\x19"" Ma""\x15\x18\x18""!",
+ "\x12"" ""\x1D""e ""\x18""c""\x1E""y""\x15""a""\x1B"" ""\x1F""e""\x13""~?",
+ "Ma""\x1B\x1A""o""\x1B\x1C""!",
+ "\x12"" ""\x14""\\epa y""\x17\x1D""a""\x1B"" o ""\x1F\x14""oe""\x1C"" ""\x1E""o""\x13""e""\x15""e...",
+ "... ""\x18"" o""\x7F\x18\x16""a""\x1B"" ""\x1F""e""\x13""~ y""\x14\x18\x16""e""\x1F""{.",
+ "K \\e""\x1C""y c""\x1E""e]""\x18\x1F""{?",
+ "\x12"" ""\x17\x16""ec{ ""\x02""oc""\x1E""o""\x16\x18\x1D""!",
+ "T""\x14""oe ""\x1E""po""\x1A\x1B""~""\x1F\x18""e ""\x1C""e""\x1D""~ ""\x1D""e y""\x16""ep""\x7F\x18\x1F"".",
+ "Ta""\x1A"" y""\x13""e""\x19"" ""\x1C""e""\x1D""~!",
+ "\t ""\x1C""e""\x1D""~ oc""\x1F""a""\x1B""ac{ e^e ""\x1C""a""\x15\x18""~",
+ "He co""\x1C\x1D""e""\x14""a""\x19""c~...",
+ "...""\x1F""e""\x1E""ep{ ""\x1F""` ""\x1A""a""\x1C""e""\x1D""{...",
+ "...""\x1D""o ~ oc""\x1F""a""\x14\x18\x1B"" ""\x15\x1B""a""\x17""a.",
+ "\x12"" ""\x1D""e ""\x13""y""\x16""y ""\x1E\x1B""a""\x1A""a""\x1F""{ o K""\x18""pa""\x1D\x16\x18\x18""...",
+ "...""\x1D""o ""\x17""a""\x1E""pe""\x1F\x18\x1F""{ ""\x1F""e""\x13""e ""\x1D""e ""\x1C""o""\x15""y.",
+ "Malcolm the Jester has broken free!",
+ "He now controls the Kyragem...",
+ "...source of all magic in Kyrandia!",
+ "",
+ "Ka""\x1A"" ""\x1F""` ""\x1E""oc""\x1C""e""\x1B""!",
+ "Ho ""\x1D\x18""\\e""\x15""o, y ""\x1C""e""\x1D""~ ec""\x1F""{ ""\x1A""oe-\\""\x1F""o...",
+ "Bo""\x1F"" ""\x1A""o""\x1C""e""\x16\x18""~!",
+ "Ho ~ \\ec""\x1F\x1D""o ""\x1E""pe""\x16""y""\x1E""pe""\x7F\x16""a}.",
+ "He ""\x1E""p`""\x15""a""\x19"" ""\x1D""a ""\x10""TO ""\x16""epe""\x14""o!",
+ "He ""\x14\x17\x13\x18""pa""\x19""c~ ""\x1D""a ""\x10""TO ""\x16""epe""\x14""o ""\x13""e""\x1B""o\\""\x1A""a!",
+ "\x02""AB!",
+ "Ta""\x1A"" c""\x1C""e]""\x1D""ee...",
+ "...He ""\x1F""a""\x1A"" ""\x1B\x18""?",
+ "Xa xa xa...",
+ "Pa""\x17\x14""e ""\x1E""a""\x1B""{[` ""\x1D""e ""\x1E""pe""\x1A""pac""\x1D""`",
+ "Ka""\x1A"" ""\x17\x16""opo""\x14""o o""\x7F\x18\x1F""{!",
+ "\x01""p|""\x1D\x16""o""\x1D""!",
+ "\x03""e""\x16""! M` c""\x16""e""\x1B""a""\x1B\x18"" |""\x1F""o!",
+ "He""\x1F""! T` c""\x16""e""\x1B""a""\x1B""!",
+ "\tpa Kopo""\x1B""} ""\x01""p|""\x1D\x16""o""\x1D""y!",
+ "\tpa Kopo""\x1B""e""\x14""c""\x1A""o""\x19"" Ma""\x15\x18\x18""!",
+ "Te""\x1E""ep{ ""\x1C""o""\x7F\x1D""o ""\x17""a""\x1D""~""\x1F""{c~ K""\x18""pa""\x1D\x16\x18""e""\x19"" ""\x14\x1C""ec""\x1F""e!",
+ "O""\x1F\x1B\x18""\\""\x1D""o!",
+ "\x06"" ""\x1C""o""\x19"" ""\x1E""ep""\x14""`""\x19"" Kopo""\x1B""e""\x14""c""\x1A\x18\x19"" \t""\x1A""a""\x17""...",
+ "\x12"" o""\x13""_~""\x14\x1B""~} ca""\x1D\x16""a""\x1B\x18\x18"" o@""\x18""[""\x18""a""\x1B""{""\x1D""o""\x19"" o""\x13""y""\x14""{} K""\x18""pa""\x1D\x16\x18\x18""!",
+ "O""\x1F\x1B\x18""\\""\x1D""o, ""\x01""p|""\x1D\x16""o""\x1D""!",
+ "\x05""e""\x1C\x1B""~ ""\x13""o""\x1B""{]e ""\x1D""e c""\x1F""pa""\x16""ae""\x1F""...",
+ "\x06"" c ""\x1F\x14""o""\x18""x ""\x16""py""\x17""e""\x19"" c""\x1D""~""\x1F""o ""\x17""a""\x1A\x1B""~""\x1F\x18""e!",
+ "\x03""opo""\x15""a~ ""\x01""p""\x18\x1D"".",
+ "Ma""\x1B\x1A""o""\x1B\x1C"" oc""\x14""o""\x13""o""\x16\x18\x1B""c~!",
+ "C""\x1A""opo o""\x1D"" ""\x1E""p""\x18\x16""e""\x1F"" ""\x17""a ""\x1C\x1D""o""\x19"".",
+ "\x08""o""\x1C""o""\x15\x18"" ""\x01""p|""\x1D\x16""o""\x1D""y...",
+ ""
+};
+
+static const StringListProvider k1IntroStringsDOSOldFloppyRussianProvider = { ARRAYSIZE(k1IntroStringsDOSOldFloppyRussian), k1IntroStringsDOSOldFloppyRussian };
+
+static const char *const k1ItemNamesDOSOldFloppyRussian[107] = {
+ "\x02""pa""\x1D""a""\x1F",
+ "A""\x1C""e""\x1F\x18""c""\x1F",
+ "A""\x1A\x14""a""\x1C""ap""\x18\x1D",
+ "A""\x1B\x1C""a""\x17",
+ "\x06\x17""y""\x1C""py""\x16",
+ "\x04""e""\x1C""\\y""\x7F\x18\x1D""a",
+ "Py""\x13\x18\x1D",
+ "\x08""ep""\x18\x16""o""\x1F",
+ "Ca""\x1E""@""\x18""p",
+ "O""\x1E""a""\x1B",
+ "To""\x1E""a""\x17",
+ "O""\x1D\x18\x1A""c",
+ "Co""\x1B\x1D""e\\""\x1D""`""\x19"" ""\x1A""a""\x1C""e""\x1D""{",
+ "\x07""y""\x1D\x1D""`""\x19"" ""\x1A""a""\x1C""e""\x1D""{",
+ "Pa""\x16""y""\x7F\x1D""`""\x19"" ""\x1A""a""\x1C""e""\x1D""{",
+ "Ko""\x1C\x1E""ac",
+ "Po""\x17""a",
+ "T}""\x1B""{""\x1E""a""\x1D",
+ "Opx""\x18\x16""e~",
+ "Cepe""\x13""p~""\x1D\x1D""a~ po""\x17""a",
+ "Cepe""\x13""p~""\x1D\x1D""a~ c""\x1F""a""\x1F""ye""\x1F\x1A""a",
+ "Cepe""\x13""p~""\x1D\x1D""a~ ""\x1C""o""\x1D""e""\x1F""a",
+ "\x05""o""\x1B""o""\x1F""a~ ""\x1C""o""\x1D""e""\x1F""a",
+ "\x05""o""\x1B""o""\x1F""oe ""\x1A""o""\x1B""{[o",
+ "Kopo""\x1B""e""\x14""c""\x1A""a~ \\a]a",
+ "\x0E\x18""]""\x1A""a",
+ "\x04""e""\x1B""y""\x16""{",
+ "Opex",
+ "Be\\""\x1D""oc""\x18""~}^""\x18""e ~""\x15""o""\x16""`",
+ "O""\x15\x1D""e""\x1D\x1D""`e ~""\x15""o""\x16""`",
+ "O""\x15\x1D""e""\x1D\x1D""`e ~""\x15""o""\x16""`",
+ "O""\x15\x1D""e""\x1D\x1D""`e ~""\x15""o""\x16""`",
+ "O""\x15\x1D""e""\x1D\x1D""`e ~""\x15""o""\x16""`",
+ "O""\x15\x1D""e""\x1D\x1D""`e ~""\x15""o""\x16""`",
+ "P`""\x13""a",
+ "C""\x1A""e""\x1B""e""\x1F"" p`""\x13""`",
+ "\x01""apa""\x1D""{~ ""\x1D""o""\x15""a",
+ "Koc""\x1F""{",
+ "\x12\x13\x1B""o""\x1A""o",
+ "O""\x15""p`""\x17""o""\x1A",
+ "C""\x18\x1D\x18""e ~""\x15""o""\x16""`",
+ "\x02""p""\x18\x13",
+ "\x05""a""\x1E\x18""c""\x1A""a",
+ "Mpa""\x1C""op",
+ "\x08\x18\x1B""a",
+ "A""\x1D\x1A",
+ "\x08""epo",
+ "\x12\x19""[o",
+ "\x07\x18""c""\x1F",
+ "Tp""\x18\x1B\x18""c""\x1F\x1D\x18\x1A",
+ "\t""\x1E""a""\x14""]a~ ""\x17\x14""e""\x17\x16""a",
+ "Xpyc""\x1F""a""\x1B""{""\x1D""`""\x19"" ]ap",
+ "C""\x1B""e""\x17""a",
+ "\x05""ep""\x1A""a""\x1B""o",
+ "\x07""{""\x16\x18\x1D\x1A""a",
+ "\n""\x1B""e""\x19\x1F""a",
+ "\x08""eco\\""\x1D""`e \\ac`",
+ "\x04""e""\x1B""e""\x17\x1D""`""\x19"" ""\x1A\x1B""}\\",
+ "He@p""\x18\x1F""o""\x14""`""\x19"" ""\x1A\x1B""}\\",
+ "O""\x13""c""\x18\x16\x18""a""\x1D""o""\x14""`""\x19"" ""\x1A\x1B""}\\",
+ "Kpac""\x1D""oe ""\x17""e""\x1B""{e",
+ "Kpac""\x1D""oe ""\x17""e""\x1B""{e",
+ "C""\x18\x1D""ee ""\x17""e""\x1B""{e",
+ "C""\x18\x1D""ee ""\x17""e""\x1B""{e",
+ "\x04""e""\x1B\x1F""oe ""\x17""e""\x1B""{e",
+ "\x04""e""\x1B\x1F""oe ""\x17""e""\x1B""{e",
+ "\x05""e""\x1B""e""\x1D""oe ""\x17""e""\x1B""{e",
+ "Opa""\x1D\x7F""e""\x14""oe ""\x17""e""\x1B""{e",
+ "\x08""yp""\x1E""yp""\x1D""oe ""\x17""e""\x1B""{e",
+ "Pa""\x16""y""\x7F\x1D""oe ""\x17""e""\x1B""{e",
+ "C""\x14""e""\x7F""a~ Bo""\x16""a",
+ "C""\x14""e""\x7F""a~ Bo""\x16""a",
+ "Co""\x1B""e""\x1D""a~ ""\x14""o""\x16""a",
+ "Co""\x1B""e""\x1D""a~ ""\x14""o""\x16""a",
+ "M""\x18\x1D""epa""\x1B""{""\x1D""a~ ""\x14""o""\x16""a",
+ "M""\x18\x1D""epa""\x1B""{""\x1D""a~ ""\x14""o""\x16""a",
+ "Bo""\x1B""]e""\x13\x1D""a~ ""\x14""o""\x16""a",
+ "Bo""\x1B""]e""\x13\x1D""a~ ""\x14""o""\x16""a",
+ "\x08""yc""\x1F""a~ @""\x1B""~""\x15""a",
+ "\x08""yc""\x1F""a~ @""\x1B""~""\x15""a",
+ "C""\x14\x18\x1F""o""\x1A",
+ "C""\x14\x18\x1F""o""\x1A",
+ "C""\x14\x18\x1F""o""\x1A",
+ "C""\x14\x18\x1F""o""\x1A",
+ "C""\x14\x18\x1F""o""\x1A",
+ "C""\x14\x18\x1F""o""\x1A",
+ "C""\x14\x18\x1F""o""\x1A",
+ "C""\x14\x18\x1F""o""\x1A",
+ "C""\x14\x18\x1F""o""\x1A",
+ "C""\x14\x18\x1F""o""\x1A",
+ "\x08""ep""\x15""a""\x1C""e""\x1D\x1F",
+ "\x08""ep""\x15""a""\x1C""e""\x1D\x1F",
+ "\x08""ep""\x15""a""\x1C""e""\x1D\x1F",
+ "\x08""ep""\x15""a""\x1C""e""\x1D\x1F",
+ "\x08""ep""\x15""a""\x1C""e""\x1D\x1F",
+ "Kpac""\x1D""`""\x19"" ""\x1A""a""\x1C""e""\x1D""{",
+ "Opa""\x1D\x7F""e""\x14""`""\x19"" ""\x1A""a""\x1C""e""\x1D""{",
+ "\x04""e""\x1B\x1F""`""\x19"" ""\x1A""a""\x1C""e""\x1D""{",
+ "\x05""e""\x1B""e""\x1D""`""\x19"" ""\x1A""a""\x1C""e""\x1D""{",
+ "C""\x18\x1D""e-""\x17""e""\x1B""e""\x1D""`""\x19"" ""\x1A""a""\x1C""e""\x1D""{",
+ "C""\x18\x1D\x18\x19"" ""\x1A""a""\x1C""e""\x1D""{",
+ "\x08""yp""\x1E""yp""\x1D""`""\x19"" ""\x1A""a""\x1C""e""\x1D""{",
+ "T~""\x7F""e""\x1B""`""\x19"" ""\x1A""a""\x1C""e""\x1D""{",
+ "Kopo""\x1B""e""\x14""c""\x1A""a~ ""\x1A""opo""\x1D""a",
+ "Kopo""\x1B""e""\x14""c""\x1A\x18\x19"" c""\x1A\x18\x1E""e""\x1F""p",
+ "\x05""o""\x1B""o""\x1F""o""\x19"" ""\x1A\x1B""}\\",
+ "?"
+};
+
+static const StringListProvider k1ItemNamesDOSOldFloppyRussianProvider = { ARRAYSIZE(k1ItemNamesDOSOldFloppyRussian), k1ItemNamesDOSOldFloppyRussian };
+
+static const char *const k1TakenStringsDOSOldFloppyRussian[2] = {
+ " - ""\x14\x17""~""\x1B",
+ " - ""\x14\x17""~""\x1B"
+};
+
+static const StringListProvider k1TakenStringsDOSOldFloppyRussianProvider = { ARRAYSIZE(k1TakenStringsDOSOldFloppyRussian), k1TakenStringsDOSOldFloppyRussian };
+
+static const char *const k1PlacedStringsDOSOldFloppyRussian[1] = {
+ " y ""\x1C""e""\x1D""~."
+};
+
+static const StringListProvider k1PlacedStringsDOSOldFloppyRussianProvider = { ARRAYSIZE(k1PlacedStringsDOSOldFloppyRussian), k1PlacedStringsDOSOldFloppyRussian };
+
+static const char *const k1DroppedStringsDOSOldFloppyRussian[1] = {
+ " - ""\x13""poc""\x18\x1B"
+};
+
+static const StringListProvider k1DroppedStringsDOSOldFloppyRussianProvider = { ARRAYSIZE(k1DroppedStringsDOSOldFloppyRussian), k1DroppedStringsDOSOldFloppyRussian };
+
+static const char *const k1PutDownStringDOSOldFloppyRussian[1] = {
+ "Ha""\x14""ep""\x1D""o ""\x1B""y\\]e |""\x1F""o ""\x14\x1D""a\\a""\x1B""e ""\x1E""o""\x1B""o""\x7F\x18\x1F""{."
+};
+
+static const StringListProvider k1PutDownStringDOSOldFloppyRussianProvider = { ARRAYSIZE(k1PutDownStringDOSOldFloppyRussian), k1PutDownStringDOSOldFloppyRussian };
+
+static const char *const k1WaitAmuletStringDOSOldFloppyRussian[1] = {
+ "Ha""\x14""ep""\x1D""oe ""\x1D""a""\x16""o ""\x1E""o""\x16""o""\x7F\x16""a""\x1F""{, ""\x1E""o""\x1A""a A""\x1C""y""\x1B""e""\x1F"" ""\x14""occ""\x1F""a""\x1D""o""\x14\x18\x1F"" c""\x14""o} c""\x18\x1B""y."
+};
+
+static const StringListProvider k1WaitAmuletStringDOSOldFloppyRussianProvider = { ARRAYSIZE(k1WaitAmuletStringDOSOldFloppyRussian), k1WaitAmuletStringDOSOldFloppyRussian };
+
+static const char *const k1BlackJewelStringDOSOldFloppyRussian[1] = {
+ "\x10\x1F""o ""\x1A""a""\x1C""e""\x1D""{, ""\x1D""o ""\x1E""o\\e""\x1C""y o""\x1D"" \\ep""\x1D""`""\x19""?"
+};
+
+static const StringListProvider k1BlackJewelStringDOSOldFloppyRussianProvider = { ARRAYSIZE(k1BlackJewelStringDOSOldFloppyRussian), k1BlackJewelStringDOSOldFloppyRussian };
+
+static const char *const k1HealingTipStringDOSOldFloppyRussian[1] = {
+ "\x10\x1F""o ""\x1C""o""\x7F""e""\x1F"" ""\x1E""p""\x18\x15""o""\x16\x18\x1F""c~, ec""\x1B\x18"" ~ ""\x17""a""\x13""o""\x1B""e}."
+};
+
+static const StringListProvider k1HealingTipStringDOSOldFloppyRussianProvider = { ARRAYSIZE(k1HealingTipStringDOSOldFloppyRussian), k1HealingTipStringDOSOldFloppyRussian };
+
+static const char *const k1PoisonGoneStringDOSOldFloppyRussian[2] = {
+ "\x05\x16""opo""\x14""o!",
+ "\x03""e""\x19""c""\x1F\x14\x18""e o""\x1F""pa""\x14""` ""\x1E""pe""\x1A""pa""\x1F\x18\x1B""oc{!"
+};
+
+static const StringListProvider k1PoisonGoneStringDOSOldFloppyRussianProvider = { ARRAYSIZE(k1PoisonGoneStringDOSOldFloppyRussian), k1PoisonGoneStringDOSOldFloppyRussian };
+
+static const char *const k1ThePoisonStringsDOSOldFloppyRussian[4] = {
+ "O""\x1F""pa""\x14""a...",
+ "He ""\x1C""o""\x15""y ""\x16""`]a""\x1F""{...",
+ "M""\x1D""e ""\x1D""exopo]o...",
+ "\x10\x1F""a ""\x17\x1C""e~\r~""\x16""o""\x14\x18\x1F""a!"
+};
+
+static const StringListProvider k1ThePoisonStringsDOSOldFloppyRussianProvider = { ARRAYSIZE(k1ThePoisonStringsDOSOldFloppyRussian), k1ThePoisonStringsDOSOldFloppyRussian };
+
+static const char *const k1FluteStringsDOSOldFloppyRussian[2] = {
+ "Not very impressive sounding.",
+ "That last note sure was high!"
+};
+
+static const StringListProvider k1FluteStringsDOSOldFloppyRussianProvider = { ARRAYSIZE(k1FluteStringsDOSOldFloppyRussian), k1FluteStringsDOSOldFloppyRussian };
+
+static const char *const k1WispJewelStringsDOSOldFloppyRussian[3] = {
+ "I'm not really feeling up to it right now.",
+ "Ha""\x14""ep""\x1D""oe ~ ""\x16""o""\x1B\x7F""e""\x1D"" ""\x1E""o""\x1B""o""\x7F\x18\x1F""{ ",
+ ",c""\x1D""a\\a""\x1B""a"
+};
+
+static const StringListProvider k1WispJewelStringsDOSOldFloppyRussianProvider = { ARRAYSIZE(k1WispJewelStringsDOSOldFloppyRussian), k1WispJewelStringsDOSOldFloppyRussian };
+
+static const char *const k1MagicJewelStringsDOSOldFloppyRussian[1] = {
+ "C""\x1F""pa""\x1D\x1D""oe \\y""\x14""c""\x1F\x14""o."
+};
+
+static const StringListProvider k1MagicJewelStringsDOSOldFloppyRussianProvider = { ARRAYSIZE(k1MagicJewelStringsDOSOldFloppyRussian), k1MagicJewelStringsDOSOldFloppyRussian };
+
+static const char *const k1FlaskFullStringDOSOldFloppyRussian[1] = {
+ "\x10\x1F""a @""\x1B""~""\x7F\x1A""a y""\x7F""e ""\x17""a""\x1E""o""\x1B\x1D""e""\x1D""a."
+};
+
+static const StringListProvider k1FlaskFullStringDOSOldFloppyRussianProvider = { ARRAYSIZE(k1FlaskFullStringDOSOldFloppyRussian), k1FlaskFullStringDOSOldFloppyRussian };
+
+static const char *const k1FullFlaskStringDOSOldFloppyRussian[4] = {
+ "\n""\x1B""~""\x7F\x1A""a ""\x1F""e""\x1E""ep{ ""\x1E""o""\x1B\x1D""a\red\rc""\x14""e""\x7F""e""\x19"", c""\x14""ep""\x1A""a }^e""\x19"" ""\x14""o""\x16""o""\x19"".",
+ "\n""\x1B""~""\x7F\x1A""a ""\x1F""e""\x1E""ep{ ""\x1E""o""\x1B\x1D""a\red\rco""\x1B""e""\x1D""o""\x19"" ""\x14""o""\x16""o""\x19"".",
+ "\n""\x1B""~""\x7F\x1A""a ""\x1F""e""\x1E""ep{ ""\x1E""o""\x1B\x1D""a\red\r""\x1C\x18\x1D""epa""\x1B""{""\x1D""o""\x19"" ""\x14""o""\x16""o""\x19"".",
+ " o""\x1B""]. ""\x14""o""\x16""o""\x19""."
+};
+
+static const StringListProvider k1FullFlaskStringDOSOldFloppyRussianProvider = { ARRAYSIZE(k1FullFlaskStringDOSOldFloppyRussian), k1FullFlaskStringDOSOldFloppyRussian };
+
+static const char *const k1OutroHomeStringDOSOldFloppyRussian[1] = {
+ "\x03""o""\x1C""a"
+};
+
+static const StringListProvider k1OutroHomeStringDOSOldFloppyRussianProvider = { ARRAYSIZE(k1OutroHomeStringDOSOldFloppyRussian), k1OutroHomeStringDOSOldFloppyRussian };
+
+static const char *const k1VeryCleverStringDOSOldFloppyRussian[1] = {
+ "Very clever! But your feeble efforts are futile."
+};
+
+static const StringListProvider k1VeryCleverStringDOSOldFloppyRussianProvider = { ARRAYSIZE(k1VeryCleverStringDOSOldFloppyRussian), k1VeryCleverStringDOSOldFloppyRussian };
+
+static const char *const k1GUIStringsDOSOldFloppyRussian[28] = {
+ "\x07""e""\x15""e""\x1D\x16""a K""\x18""pa""\x1D\x16\x18\x18",
+ "\x05""a""\x15""py""\x17\x18\x1F""{",
+ "Coxpa""\x1D\x18\x1F""{ ""\x18\x15""py",
+ "\t""\x1E""pa""\x14\x1B""e""\x1D\x18""e",
+ "\x05""a""\x1A""o""\x1D""\\""\x18\x1F""{",
+ "\x08""po""\x16""o""\x1B\x7F\x18\x1F""{",
+ "\t""\x1E""pa""\x14\x1B""e""\x1D\x18""e",
+ "Ka""\x1A""y} ""\x18\x15""py B` xo""\x1F\x18\x1F""e ""\x17""a""\x15""py""\x17\x18\x1F""{?",
+ "B`""\x13""ep""\x18\x1F""e ""\x1E""o""\x17\x18""[""\x18""} coxpa""\x1D""e""\x1D\x18""~:",
+ "< ""\x08""\tCTO >",
+ "O""\x1F\x1C""e""\x1D""a",
+ "B""\x14""e""\x16\x18\x1F""e o""\x1E\x18""ca""\x1D\x18""e coxpa""\x1D""~e""\x1C""o""\x19"" ""\x18\x15""p`:",
+ "Save",
+ "C""\x1E\x18"" c""\x1E""o""\x1A""o""\x19\x1D""o, ""\x01""p|""\x1D\x16""o""\x1D"".",
+ "B` y""\x14""epe""\x1D""`, \\""\x1F""o xo""\x1F\x18\x1F""e ""\x17""a""\x1A""o""\x1D""\\""\x18\x1F""{ ""\x18\x15""py?",
+ "XXX",
+ "XXX",
+ "XXXXXXX",
+ "XXXXXXXXX",
+ "\x02\x1B""a""\x14"".""\x1C""e""\x1D""}",
+ "on",
+ "\x1D""e""\x1F",
+ "\x03""a ",
+ "No",
+ "\x10\x0F\xE0""(""\x18\x0F\xE0""(""\x1D\x0F\xE0""($""\x0F\xE0""()""\x0F\xE0""(1""\x0F\xE0""(9""\x0F\xE0""(@""\x0F\xE0""(E""\x0F\xE0""(""\x03\x14\x18\x7F""e""\x1D\x18""e ",
+ "Te""\x1A""c""\x1F"" ",
+ "My""\x17""`""\x1A""a ",
+ "\x05\x14""y""\x1A\x18"" ",
+};
+
+static const StringListProvider k1GUIStringsDOSOldFloppyRussianProvider = { ARRAYSIZE(k1GUIStringsDOSOldFloppyRussian), k1GUIStringsDOSOldFloppyRussian };
+
+static const char *const k1NewGameStringDOSOldFloppyRussian[1] = {
+ "< HOBA""\x12"" ""\x06\x02""PA >"
+};
+
+static const StringListProvider k1NewGameStringDOSOldFloppyRussianProvider = { ARRAYSIZE(k1NewGameStringDOSOldFloppyRussian), k1NewGameStringDOSOldFloppyRussian };
+
+static const char *const k1ConfigStringsDOSOldFloppyRussian[9] = {
+ "\x1C\x18\x1D\x18\x1C""y""\x1C",
+ "\x1C""e""\x16\x1B",
+ "\x1D""op""\x1C""a""\x1B",
+ "\x13""`c""\x1F",
+ "\x1C""a""\x1A""c. ",
+ "\x1C\x18\x1D\x18\x1C""y""\x1C",
+ "\x1D""op""\x1C""a""\x1B",
+ "\x13""`c""\x1F",
+ "\x1E""o ""\x1A\x1B\x18\x1A""y "
+};
+
+static const StringListProvider k1ConfigStringsDOSOldFloppyRussianProvider = { ARRAYSIZE(k1ConfigStringsDOSOldFloppyRussian), k1ConfigStringsDOSOldFloppyRussian };
+
diff --git a/devtools/create_kyradat/resources/lok_dos_spanish.h b/devtools/create_kyradat/resources/lok_dos_spanish.h
new file mode 100644
index 0000000000..40e5bbb53e
--- /dev/null
+++ b/devtools/create_kyradat/resources/lok_dos_spanish.h
@@ -0,0 +1,333 @@
+static const char *const k1IntroStringsDOSSpanish[53] = {
+ "This is a text test - 1",
+ "This is a text test - 2",
+ "Buenas Kallak...",
+ "...""\xAD""Poderoso jefe de la Orden de los M""\xA1""sticos reales!",
+ "\xA8""Te he asustado?",
+ "\xAD""Malcolm!",
+ "Me enter""\x82"" ayer de tu fuga.",
+ "Y te estaba esperando desde hace un rato.",
+ "\xA8""Por qu""\x82"" me iba a dar prisa?",
+ "\xAD""Soy yo el que gobierna este pa""\xA1""s!",
+ "Tu d""\x82""bil maleficio no me atemoriza.",
+ "\xAD""Anda, m""\xA0""tame de una vez!",
+ "Me queda poco poder m""\xA0""gico.",
+ "No te quepa ninguna duda de que vengo a hacerte da""\xA4""o...",
+ "...Ahora eres de piedra...",
+ "...pero he respetado tus ojos.",
+ "No he derramado ni una l""\xA0""grima por Kyrandia...",
+ "...pero no voy a negarte el placer de las tuyas.",
+ "\xAD""Malcolm el Buf""\xA2""n est""\xA0"" en libertad!",
+ "Y es ""\x82""l quien ahora controla la Kyragema...",
+ "...fuente de toda la magia de Kyrandia!",
+ "",
+ "\xAD""C""\xA2""mo te atreves a tropezar conmigo!",
+ "En absoluto, he reservado algo especial para ti...",
+ "\xAD""Un hechizo humor""\xA1""stico!",
+ "Pero te advertir""\x82"" honestamente.",
+ "\xAD""No saltes a ESE ""\xA0""rbol!",
+ "\xAD""No te subas a ESE ""\xA0""rbol ardillita!",
+ "\xAD""Buuu!",
+ "Es requete divertido de este modo...",
+ "...""\xA8""Verdad?",
+ "Ja ja ja...",
+ "\xA8""Verdad que los dedos son una maravilla?",
+ "\xAD""Es estupendo estar vivo!",
+ "\xAD""Brandon!",
+ "\xAD""Abuelo! ""\xAD""Lo hemos conseguido!",
+ "\xAD""No! ""\xAD""TU lo has hecho!",
+ "\xAD""Larga vida al rey Brandon!",
+ "\xAD""Larga vida a los M""\xA1""sticos reales!",
+ "\xAD""Ahora vamos a reconstruir Kyrandia!",
+ "\xAD""Buena idea!",
+ "En mi primera proclamaci""\xA2""n como rey...",
+ "\xAD""Declaro las sandalias como calzado oficial de Kyrandia!",
+ "\xAD""Bien hecho, Brandon!",
+ "La Tierra no sufre m""\xA0""s...",
+ "\xAD""Y tus amigos han regresado!",
+ "Querida Brynn...",
+ "\xAD""Malcolm se ha fugado!",
+ "Pronto vendr""\xA0"" a por m""\xA1"".",
+ "Por favor, ayuda a Brandon...",
+ "",
+ "",
+ ""
+};
+
+static const StringListProvider k1IntroStringsDOSSpanishProvider = { ARRAYSIZE(k1IntroStringsDOSSpanish), k1IntroStringsDOSSpanish };
+
+static const char *const k1ItemNamesDOSSpanish[107] = {
+ "Granate",
+ "Amatista",
+ "Aguamarina",
+ "Diamante",
+ "Esmeralda",
+ "Perla",
+ "Rub""\xA1",
+ "Peridot",
+ "Zafiro",
+ "Opalo",
+ "Topacio",
+ "Onix",
+ "Piedra Solar",
+ "Piedra Lunar",
+ "Piedra Arco Iris",
+ "Piedra Magn""\x82""tica",
+ "Rosa",
+ "Tulip""\xA0""n",
+ "Orqu""\xA1""dea",
+ "Rosa de plata",
+ "Estatua de plata",
+ "Moneda de Plata",
+ "Moneda de oro",
+ "Anillo de oro",
+ "C""\xA0""liz real",
+ "Pi""\xA4""a pi""\xA4""onera",
+ "Bellota",
+ "Nuez",
+ "Fogofrutas brillantes",
+ "Fogofrutas",
+ "Fogofrutas",
+ "Fogofrutas",
+ "Fogofrutas",
+ "Fogofrutas",
+ "Pescado",
+ "Espina de pescado",
+ "Pierna de Cordero",
+ "Hueso",
+ "Manzana",
+ "Coraz""\xA2""n de Manzana",
+ "Ar""\xA0""ndanos",
+ "Champi""\xA4\xA2""n",
+ "Nota",
+ "Canica",
+ "Serrucho",
+ "Cruz de vida",
+ "Pluma",
+ "Huevo",
+ "Hoja",
+ "Tr""\x82""bol",
+ "Estrella Ca""\xA1""da",
+ "Bola de cristal",
+ "L""\xA0""grima",
+ "Espejo",
+ "Trozo de hielo",
+ "Flauta",
+ "Reloj de arena",
+ "Llave de hierro",
+ "Llave de jade",
+ "Llave de obsidiana",
+ "Poci""\xA2""n roja",
+ "Poci""\xA2""n roja",
+ "Poci""\xA2""n azul",
+ "Poci""\xA2""n azul",
+ "Poci""\xA2""n amarilla",
+ "Poci""\xA2""n amarilla",
+ "Poci""\xA2""n verde",
+ "Poci""\xA2""n naranja",
+ "Poci""\xA2""n morada",
+ "Poci""\xA2""n Arco Iris",
+ "Agua fresca",
+ "Agua fresca",
+ "Agua salada",
+ "Agua salada",
+ "Agua mineral",
+ "Agua mineral",
+ "Agua m""\xA0""gica",
+ "Agua m""\xA0""gica",
+ "Frasco vac""\xA1""o",
+ "Frasco vac""\xA1""o",
+ "Pergamino",
+ "Pergamino",
+ "Pergamino",
+ "Pergamino",
+ "Pergamino",
+ "Pergamino",
+ "Pergamino",
+ "Pergamino",
+ "Pergamino",
+ "Pergamino",
+ "Pedazo de pergamino",
+ "Pedazo de pergamino",
+ "Pedazo de pergamino",
+ "Pedazo de pergamino",
+ "Pedazo de pergamino",
+ "Piedra m""\xA0""gica roja",
+ "Piedra m""\xA0""gica naranja",
+ "Piedra m""\xA0""gica amarilla",
+ "Piedra m""\xA0""gica verde",
+ "Piedra m""\xA0""gica turquesa",
+ "Piedra m""\xA0""gica azul",
+ "Piedra m""\xA0""gica morada",
+ "Roca pesada",
+ "Corona real",
+ "Cetro real",
+ "Llave de oro",
+ "Objeto desconocido"
+};
+
+static const StringListProvider k1ItemNamesDOSSpanishProvider = { ARRAYSIZE(k1ItemNamesDOSSpanish), k1ItemNamesDOSSpanish };
+
+static const char *const k1TakenStringsDOSSpanish[2] = {
+ " en mano.",
+ " en mano."
+};
+
+static const StringListProvider k1TakenStringsDOSSpanishProvider = { ARRAYSIZE(k1TakenStringsDOSSpanish), k1TakenStringsDOSSpanish };
+
+static const char *const k1PlacedStringsDOSSpanish[1] = {
+ " en reserva."
+};
+
+static const StringListProvider k1PlacedStringsDOSSpanishProvider = { ARRAYSIZE(k1PlacedStringsDOSSpanish), k1PlacedStringsDOSSpanish };
+
+static const char *const k1DroppedStringsDOSSpanish[1] = {
+ " fuera."
+};
+
+static const StringListProvider k1DroppedStringsDOSSpanishProvider = { ARRAYSIZE(k1DroppedStringsDOSSpanish), k1DroppedStringsDOSSpanish };
+
+static const char *const k1NoDropStringsDOSSpanish[2] = {
+ "No puedes dejar m""\xA0""s objetos aqu""\xA1"".",
+ "No puedes colocar eso ah""\xA1""."
+};
+
+static const StringListProvider k1NoDropStringsDOSSpanishProvider = { ARRAYSIZE(k1NoDropStringsDOSSpanish), k1NoDropStringsDOSSpanish };
+
+static const char *const k1PutDownStringDOSSpanish[1] = {
+ "Mejor ser""\xA0"" que deposite esto antes que nada."
+};
+
+static const StringListProvider k1PutDownStringDOSSpanishProvider = { ARRAYSIZE(k1PutDownStringDOSSpanish), k1PutDownStringDOSSpanish };
+
+static const char *const k1WaitAmuletStringDOSSpanish[1] = {
+ "Supongo que tendr""\x82"" que esperar a que mi amuleto recobre su poder."
+};
+
+static const StringListProvider k1WaitAmuletStringDOSSpanishProvider = { ARRAYSIZE(k1WaitAmuletStringDOSSpanish), k1WaitAmuletStringDOSSpanish };
+
+static const char *const k1BlackJewelStringDOSSpanish[1] = {
+ "Es una joya, pero ""\xA8""por qu""\x82"" es negra?"
+};
+
+static const StringListProvider k1BlackJewelStringDOSSpanishProvider = { ARRAYSIZE(k1BlackJewelStringDOSSpanish), k1BlackJewelStringDOSSpanish };
+
+static const char *const k1HealingTipStringDOSSpanish[1] = {
+ "Oye, esto me ser""\xA0"" ""\xA3""til si me hago da""\xA4""o."
+};
+
+static const StringListProvider k1HealingTipStringDOSSpanishProvider = { ARRAYSIZE(k1HealingTipStringDOSSpanish), k1HealingTipStringDOSSpanish };
+
+static const char *const k1PoisonGoneStringDOSSpanish[2] = {
+ "\xAD""Genial!",
+ "\xAD""Han desaparecido los efectos del veneno!"
+};
+
+static const StringListProvider k1PoisonGoneStringDOSSpanishProvider = { ARRAYSIZE(k1PoisonGoneStringDOSSpanish), k1PoisonGoneStringDOSSpanish };
+
+static const char *const k1ThePoisonStringsDOSSpanish[4] = {
+ "El veneno...",
+ "No puedo respirar...",
+ "No me siento bien...",
+ "\xAD""Esa serpiente debe ser\rvenenosa!"
+};
+
+static const StringListProvider k1ThePoisonStringsDOSSpanishProvider = { ARRAYSIZE(k1ThePoisonStringsDOSSpanish), k1ThePoisonStringsDOSSpanish };
+
+static const char *const k1FluteStringsDOSSpanish[2] = {
+ "No es un sonido muy impresionante que digamos.",
+ "\xAD""Fijo que la ""\xA3""ltima nota era alta!"
+};
+
+static const StringListProvider k1FluteStringsDOSSpanishProvider = { ARRAYSIZE(k1FluteStringsDOSSpanish), k1FluteStringsDOSSpanish };
+
+static const char *const k1WispJewelStringsDOSSpanish[3] = {
+ "No me siento con fuerzas para hacerlo ahora mismo.",
+ "Deber""\xA1""a poner en el suelo mi ",
+ ", lo primero."
+};
+
+static const StringListProvider k1WispJewelStringsDOSSpanishProvider = { ARRAYSIZE(k1WispJewelStringsDOSSpanish), k1WispJewelStringsDOSSpanish };
+
+static const char *const k1MagicJewelStringsDOSSpanish[1] = {
+ "Eso sienta raro."
+};
+
+static const StringListProvider k1MagicJewelStringsDOSSpanishProvider = { ARRAYSIZE(k1MagicJewelStringsDOSSpanish), k1MagicJewelStringsDOSSpanish };
+
+static const char *const k1FlaskFullStringDOSSpanish[1] = {
+ "Este frasco ya est""\xA0"" lleno."
+};
+
+static const StringListProvider k1FlaskFullStringDOSSpanishProvider = { ARRAYSIZE(k1FlaskFullStringDOSSpanish), k1FlaskFullStringDOSSpanish };
+
+static const char *const k1FullFlaskStringDOSSpanish[4] = {
+ "Ahora el frasco est""\xA0"" lleno\rde agua fresca y espumosa.",
+ "Ahora el frasco est""\xA0"" lleno\rde agua salada.",
+ "Ahora el frasco est""\xA0"" lleno\rde agua mineral.",
+ "Agua m""\xA0""gica."
+};
+
+static const StringListProvider k1FullFlaskStringDOSSpanishProvider = { ARRAYSIZE(k1FullFlaskStringDOSSpanish), k1FullFlaskStringDOSSpanish };
+
+static const char *const k1OutroHomeStringDOSSpanish[1] = {
+ "Casa"
+};
+
+static const StringListProvider k1OutroHomeStringDOSSpanishProvider = { ARRAYSIZE(k1OutroHomeStringDOSSpanish), k1OutroHomeStringDOSSpanish };
+
+static const char *const k1VeryCleverStringDOSSpanish[1] = {
+ "\xAD""Muy listo!, pero tus in""\xA3""tiles esfuerzos son en vano."
+};
+
+static const StringListProvider k1VeryCleverStringDOSSpanishProvider = { ARRAYSIZE(k1VeryCleverStringDOSSpanish), k1VeryCleverStringDOSSpanish };
+
+static const char *const k1GUIStringsDOSSpanish[24] = {
+ "The Legend of Kyrandia",
+ "Cargar un juego",
+ "Salvar este juego",
+ "Controles de juego",
+ "Abandonar el juego",
+ "Reanudar el juego",
+ "Controles de juego",
+ "\xA8""Qu""\x82"" juego deseas recargar?",
+ "Seleccionar una posici""\xA2""n para salvar:",
+ "[ RANURA VACIA ]",
+ "Abandonar",
+ "Introduce una descripci""\xA2""n de tu juego salvado.",
+ "Salvar",
+ "Descansa en paz, Brandon.",
+ "\xA8""Est""\xA0""s seguro de que deseas Abandonar el juego?",
+ "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXMen""\xA3"" principal",
+ "activado",
+ "desactivado",
+ "S""\xA1",
+ "No",
+ "0""\x0F""R+:""\x0F""R+@""\x0F""R+G""\x0F""R+N""\x0F""R+Y""\x0F""R+c""\x0F""R+j""\x0F""R+q""\x0F""R+Velocidad al paso",
+ "Velocidad de texto",
+ "La m""\xA3""sica en ",
+ "Los sonidos en "
+};
+
+static const StringListProvider k1GUIStringsDOSSpanishProvider = { ARRAYSIZE(k1GUIStringsDOSSpanish), k1GUIStringsDOSSpanish };
+
+static const char *const k1NewGameStringDOSSpanish[1] = {
+ "[ INICIAR UN JUEGO NUEVO ]"
+};
+
+static const StringListProvider k1NewGameStringDOSSpanishProvider = { ARRAYSIZE(k1NewGameStringDOSSpanish), k1NewGameStringDOSSpanish };
+
+static const char *const k1ConfigStringsDOSSpanish[9] = {
+ "muy lento",
+ "lento",
+ "normal",
+ "r""\xA0""pido",
+ "muy r""\xA0""pido",
+ "muy lento",
+ "normal",
+ "r""\xA0""pido",
+ "pulsable"
+};
+
+static const StringListProvider k1ConfigStringsDOSSpanishProvider = { ARRAYSIZE(k1ConfigStringsDOSSpanish), k1ConfigStringsDOSSpanish };
+
diff --git a/devtools/create_kyradat/resources/lok_fmtowns.h b/devtools/create_kyradat/resources/lok_fmtowns.h
new file mode 100644
index 0000000000..7491f45a67
--- /dev/null
+++ b/devtools/create_kyradat/resources/lok_fmtowns.h
@@ -0,0 +1,11637 @@
+static const byte k1KallakWritingSeqFMTowns[2039] = {
+ 0x00, 0x00, 0x01, 0x0E, 0x1A, 0x1B, 0x17, 0x00,
+ 0x00, 0x00, 0x3F, 0x01, 0xC7, 0x0C, 0x00, 0x0C,
+ 0x00, 0x19, 0x39, 0x02, 0x00, 0x00, 0x00, 0x00,
+ 0x10, 0x05, 0x00, 0x95, 0x00, 0x20, 0x09, 0x14,
+ 0x0F, 0x2E, 0x02, 0x00, 0x01, 0x00, 0x00, 0x10,
+ 0x05, 0x01, 0x94, 0x00, 0x1B, 0x07, 0x06, 0x00,
+ 0x18, 0x1D, 0x02, 0x00, 0x02, 0x00, 0x00, 0x10,
+ 0x05, 0x02, 0x93, 0x00, 0x14, 0x07, 0x06, 0x00,
+ 0x02, 0x00, 0x03, 0x00, 0x00, 0x10, 0x05, 0x01,
+ 0x90, 0x00, 0x1B, 0x07, 0x06, 0x00, 0x02, 0x00,
+ 0x04, 0x00, 0x00, 0x10, 0x05, 0x00, 0x8D, 0x00,
+ 0x20, 0x07, 0x06, 0x00, 0x18, 0x1D, 0x02, 0x00,
+ 0x05, 0x00, 0x00, 0x10, 0x05, 0x01, 0x8A, 0x00,
+ 0x1B, 0x07, 0x06, 0x00, 0x02, 0x00, 0x06, 0x00,
+ 0x00, 0x10, 0x05, 0x02, 0x88, 0x00, 0x14, 0x07,
+ 0x06, 0x00, 0x18, 0x1D, 0x02, 0x00, 0x07, 0x00,
+ 0x00, 0x10, 0x05, 0x01, 0x85, 0x00, 0x1B, 0x07,
+ 0x06, 0x00, 0x02, 0x00, 0x08, 0x00, 0x00, 0x10,
+ 0x05, 0x00, 0x82, 0x00, 0x20, 0x07, 0x06, 0x00,
+ 0x02, 0x00, 0x09, 0x00, 0x00, 0x10, 0x05, 0x01,
+ 0x7F, 0x00, 0x1B, 0x07, 0x06, 0x00, 0x02, 0x00,
+ 0x0A, 0x00, 0x00, 0x10, 0x05, 0x02, 0x7C, 0x00,
+ 0x14, 0x07, 0x06, 0x00, 0x18, 0x1D, 0x02, 0x00,
+ 0x0B, 0x00, 0x00, 0x10, 0x05, 0x01, 0x79, 0x00,
+ 0x1B, 0x07, 0x06, 0x00, 0x02, 0x00, 0x0C, 0x00,
+ 0x00, 0x10, 0x05, 0x00, 0x76, 0x00, 0x20, 0x07,
+ 0x06, 0x00, 0x02, 0x00, 0x0D, 0x00, 0x00, 0x10,
+ 0x05, 0x01, 0x73, 0x00, 0x1B, 0x07, 0x06, 0x00,
+ 0x18, 0x1D, 0x02, 0x00, 0x0E, 0x00, 0x00, 0x10,
+ 0x05, 0x02, 0x70, 0x00, 0x14, 0x07, 0x06, 0x00,
+ 0x02, 0x00, 0x0F, 0x00, 0x00, 0x10, 0x05, 0x01,
+ 0x6D, 0x00, 0x1B, 0x07, 0x06, 0x00, 0x02, 0x00,
+ 0x10, 0x00, 0x00, 0x10, 0x05, 0x00, 0x6A, 0x00,
+ 0x20, 0x07, 0x06, 0x00, 0x02, 0x00, 0x11, 0x00,
+ 0x00, 0x10, 0x05, 0x01, 0x67, 0x00, 0x1B, 0x07,
+ 0x06, 0x00, 0x18, 0x1D, 0x02, 0x00, 0x12, 0x00,
+ 0x00, 0x10, 0x05, 0x02, 0x65, 0x00, 0x14, 0x07,
+ 0x06, 0x00, 0x02, 0x00, 0x13, 0x00, 0x00, 0x10,
+ 0x05, 0x01, 0x63, 0x00, 0x1B, 0x07, 0x06, 0x00,
+ 0x02, 0x00, 0x14, 0x00, 0x00, 0x10, 0x05, 0x00,
+ 0x63, 0x00, 0x20, 0x07, 0x06, 0x00, 0x02, 0x00,
+ 0x15, 0x00, 0x00, 0x10, 0x05, 0x00, 0x65, 0x00,
+ 0x1F, 0x07, 0x06, 0x00, 0x02, 0x00, 0x16, 0x00,
+ 0x00, 0x10, 0x05, 0x00, 0x6A, 0x00, 0x1D, 0x07,
+ 0x06, 0x00, 0x02, 0x00, 0x17, 0x00, 0x00, 0x10,
+ 0x05, 0x00, 0x70, 0x00, 0x19, 0x07, 0x06, 0x00,
+ 0x02, 0x00, 0x18, 0x00, 0x00, 0x10, 0x05, 0x00,
+ 0x76, 0x00, 0x17, 0x07, 0x06, 0x00, 0x02, 0x00,
+ 0x19, 0x00, 0x00, 0x10, 0x05, 0x00, 0x7C, 0x00,
+ 0x16, 0x07, 0x06, 0x00, 0x02, 0x00, 0x1A, 0x00,
+ 0x00, 0x10, 0x05, 0x00, 0x82, 0x00, 0x17, 0x07,
+ 0x06, 0x00, 0x02, 0x00, 0x1B, 0x00, 0x00, 0x10,
+ 0x05, 0x00, 0x88, 0x00, 0x19, 0x07, 0x06, 0x00,
+ 0x02, 0x00, 0x1C, 0x00, 0x00, 0x10, 0x05, 0x00,
+ 0x8D, 0x00, 0x1D, 0x07, 0x06, 0x00, 0x02, 0x00,
+ 0x1D, 0x00, 0x00, 0x10, 0x05, 0x00, 0x93, 0x00,
+ 0x1F, 0x07, 0x06, 0x00, 0x1C, 0x1B, 0x0F, 0x2F,
+ 0x02, 0x00, 0x01, 0x00, 0x00, 0x10, 0x05, 0x01,
+ 0x94, 0x00, 0x1B, 0x07, 0x06, 0x00, 0x02, 0x00,
+ 0x01, 0x00, 0x00, 0x10, 0x05, 0x01, 0x94, 0x00,
+ 0x1B, 0x07, 0x06, 0x00, 0x18, 0x1D, 0x02, 0x00,
+ 0x02, 0x00, 0x00, 0x10, 0x05, 0x02, 0x93, 0x00,
+ 0x14, 0x07, 0x06, 0x00, 0x02, 0x00, 0x02, 0x00,
+ 0x00, 0x10, 0x05, 0x02, 0x93, 0x00, 0x14, 0x07,
+ 0x06, 0x00, 0x02, 0x00, 0x03, 0x00, 0x00, 0x10,
+ 0x05, 0x01, 0x90, 0x00, 0x1B, 0x07, 0x06, 0x00,
+ 0x02, 0x00, 0x04, 0x00, 0x00, 0x10, 0x05, 0x00,
+ 0x8D, 0x00, 0x20, 0x07, 0x06, 0x00, 0x18, 0x1D,
+ 0x02, 0x00, 0x05, 0x00, 0x00, 0x10, 0x05, 0x01,
+ 0x8A, 0x00, 0x1B, 0x07, 0x06, 0x00, 0x02, 0x00,
+ 0x05, 0x00, 0x00, 0x10, 0x05, 0x01, 0x8A, 0x00,
+ 0x1B, 0x07, 0x06, 0x00, 0x02, 0x00, 0x06, 0x00,
+ 0x00, 0x10, 0x05, 0x02, 0x88, 0x00, 0x14, 0x07,
+ 0x06, 0x00, 0x18, 0x1D, 0x02, 0x00, 0x07, 0x00,
+ 0x00, 0x10, 0x05, 0x01, 0x85, 0x00, 0x1B, 0x07,
+ 0x06, 0x00, 0x02, 0x00, 0x08, 0x00, 0x00, 0x10,
+ 0x05, 0x00, 0x82, 0x00, 0x20, 0x07, 0x06, 0x00,
+ 0x02, 0x00, 0x09, 0x00, 0x00, 0x10, 0x05, 0x01,
+ 0x7F, 0x00, 0x1B, 0x07, 0x06, 0x00, 0x02, 0x00,
+ 0x0A, 0x00, 0x00, 0x10, 0x05, 0x02, 0x7C, 0x00,
+ 0x14, 0x07, 0x06, 0x00, 0x18, 0x1D, 0x02, 0x00,
+ 0x0B, 0x00, 0x00, 0x10, 0x05, 0x01, 0x79, 0x00,
+ 0x1B, 0x07, 0x06, 0x00, 0x02, 0x00, 0x0C, 0x00,
+ 0x00, 0x10, 0x05, 0x00, 0x76, 0x00, 0x20, 0x07,
+ 0x06, 0x00, 0x02, 0x00, 0x0D, 0x00, 0x00, 0x10,
+ 0x05, 0x01, 0x73, 0x00, 0x1B, 0x07, 0x06, 0x00,
+ 0x18, 0x1D, 0x02, 0x00, 0x0E, 0x00, 0x00, 0x10,
+ 0x05, 0x02, 0x70, 0x00, 0x14, 0x07, 0x06, 0x00,
+ 0x02, 0x00, 0x0F, 0x00, 0x00, 0x10, 0x05, 0x01,
+ 0x6D, 0x00, 0x1B, 0x07, 0x06, 0x00, 0x02, 0x00,
+ 0x10, 0x00, 0x00, 0x10, 0x05, 0x00, 0x6A, 0x00,
+ 0x20, 0x07, 0x06, 0x00, 0x02, 0x00, 0x11, 0x00,
+ 0x00, 0x10, 0x05, 0x01, 0x67, 0x00, 0x1B, 0x07,
+ 0x06, 0x00, 0x18, 0x1D, 0x02, 0x00, 0x12, 0x00,
+ 0x00, 0x10, 0x05, 0x02, 0x65, 0x00, 0x14, 0x07,
+ 0x06, 0x00, 0x02, 0x00, 0x13, 0x00, 0x00, 0x10,
+ 0x05, 0x01, 0x63, 0x00, 0x1B, 0x07, 0x06, 0x00,
+ 0x02, 0x00, 0x14, 0x00, 0x00, 0x10, 0x05, 0x00,
+ 0x63, 0x00, 0x20, 0x07, 0x06, 0x00, 0x02, 0x00,
+ 0x15, 0x00, 0x00, 0x10, 0x05, 0x00, 0x65, 0x00,
+ 0x1F, 0x07, 0x06, 0x00, 0x02, 0x00, 0x16, 0x00,
+ 0x00, 0x10, 0x05, 0x00, 0x6A, 0x00, 0x1D, 0x07,
+ 0x06, 0x00, 0x02, 0x00, 0x17, 0x00, 0x00, 0x10,
+ 0x05, 0x00, 0x70, 0x00, 0x19, 0x07, 0x06, 0x00,
+ 0x02, 0x00, 0x18, 0x00, 0x00, 0x10, 0x05, 0x00,
+ 0x76, 0x00, 0x17, 0x07, 0x06, 0x00, 0x02, 0x00,
+ 0x19, 0x00, 0x00, 0x10, 0x05, 0x00, 0x7C, 0x00,
+ 0x16, 0x07, 0x06, 0x00, 0x02, 0x00, 0x1A, 0x00,
+ 0x00, 0x10, 0x05, 0x00, 0x82, 0x00, 0x17, 0x07,
+ 0x06, 0x00, 0x02, 0x00, 0x1B, 0x00, 0x00, 0x10,
+ 0x05, 0x00, 0x88, 0x00, 0x19, 0x07, 0x06, 0x00,
+ 0x02, 0x00, 0x1C, 0x00, 0x00, 0x10, 0x05, 0x00,
+ 0x8D, 0x00, 0x1D, 0x07, 0x06, 0x00, 0x02, 0x00,
+ 0x1D, 0x00, 0x00, 0x10, 0x05, 0x00, 0x93, 0x00,
+ 0x1F, 0x07, 0x06, 0x00, 0x1C, 0x1B, 0x0F, 0x30,
+ 0x02, 0x00, 0x01, 0x00, 0x00, 0x10, 0x05, 0x01,
+ 0x94, 0x00, 0x1B, 0x07, 0x06, 0x00, 0x02, 0x00,
+ 0x01, 0x00, 0x00, 0x10, 0x05, 0x01, 0x94, 0x00,
+ 0x1B, 0x07, 0x06, 0x00, 0x18, 0x1D, 0x02, 0x00,
+ 0x02, 0x00, 0x00, 0x10, 0x05, 0x02, 0x93, 0x00,
+ 0x14, 0x07, 0x06, 0x00, 0x02, 0x00, 0x02, 0x00,
+ 0x00, 0x10, 0x05, 0x02, 0x93, 0x00, 0x14, 0x07,
+ 0x06, 0x00, 0x02, 0x00, 0x02, 0x00, 0x00, 0x10,
+ 0x05, 0x02, 0x93, 0x00, 0x14, 0x07, 0x06, 0x00,
+ 0x02, 0x00, 0x03, 0x00, 0x00, 0x10, 0x05, 0x01,
+ 0x90, 0x00, 0x1B, 0x07, 0x06, 0x00, 0x02, 0x00,
+ 0x03, 0x00, 0x00, 0x10, 0x05, 0x01, 0x90, 0x00,
+ 0x1B, 0x07, 0x06, 0x00, 0x02, 0x00, 0x04, 0x00,
+ 0x00, 0x10, 0x05, 0x00, 0x8D, 0x00, 0x20, 0x07,
+ 0x06, 0x00, 0x18, 0x1D, 0x02, 0x00, 0x05, 0x00,
+ 0x00, 0x10, 0x05, 0x01, 0x8A, 0x00, 0x1B, 0x07,
+ 0x06, 0x00, 0x02, 0x00, 0x06, 0x00, 0x00, 0x10,
+ 0x05, 0x02, 0x88, 0x00, 0x14, 0x07, 0x06, 0x00,
+ 0x18, 0x1D, 0x02, 0x00, 0x07, 0x00, 0x00, 0x10,
+ 0x05, 0x01, 0x85, 0x00, 0x1B, 0x07, 0x06, 0x00,
+ 0x02, 0x00, 0x08, 0x00, 0x00, 0x10, 0x05, 0x00,
+ 0x82, 0x00, 0x20, 0x07, 0x06, 0x00, 0x02, 0x00,
+ 0x09, 0x00, 0x00, 0x10, 0x05, 0x01, 0x7F, 0x00,
+ 0x1B, 0x07, 0x06, 0x00, 0x02, 0x00, 0x0A, 0x00,
+ 0x00, 0x10, 0x05, 0x02, 0x7C, 0x00, 0x14, 0x07,
+ 0x06, 0x00, 0x18, 0x1D, 0x02, 0x00, 0x0B, 0x00,
+ 0x00, 0x10, 0x05, 0x01, 0x79, 0x00, 0x1B, 0x07,
+ 0x06, 0x00, 0x02, 0x00, 0x0C, 0x00, 0x00, 0x10,
+ 0x05, 0x00, 0x76, 0x00, 0x20, 0x07, 0x06, 0x00,
+ 0x02, 0x00, 0x0D, 0x00, 0x00, 0x10, 0x05, 0x01,
+ 0x73, 0x00, 0x1B, 0x07, 0x06, 0x00, 0x18, 0x1D,
+ 0x02, 0x00, 0x0E, 0x00, 0x00, 0x10, 0x05, 0x02,
+ 0x70, 0x00, 0x14, 0x07, 0x06, 0x00, 0x02, 0x00,
+ 0x0F, 0x00, 0x00, 0x10, 0x05, 0x01, 0x6D, 0x00,
+ 0x1B, 0x07, 0x06, 0x00, 0x02, 0x00, 0x10, 0x00,
+ 0x00, 0x10, 0x05, 0x00, 0x6A, 0x00, 0x20, 0x07,
+ 0x06, 0x00, 0x02, 0x00, 0x11, 0x00, 0x00, 0x10,
+ 0x05, 0x01, 0x67, 0x00, 0x1B, 0x07, 0x06, 0x00,
+ 0x18, 0x1D, 0x02, 0x00, 0x12, 0x00, 0x00, 0x10,
+ 0x05, 0x02, 0x65, 0x00, 0x14, 0x07, 0x06, 0x00,
+ 0x02, 0x00, 0x13, 0x00, 0x00, 0x10, 0x05, 0x01,
+ 0x63, 0x00, 0x1B, 0x07, 0x06, 0x00, 0x02, 0x00,
+ 0x14, 0x00, 0x00, 0x10, 0x05, 0x00, 0x63, 0x00,
+ 0x20, 0x07, 0x06, 0x00, 0x02, 0x00, 0x15, 0x00,
+ 0x00, 0x10, 0x05, 0x00, 0x65, 0x00, 0x1F, 0x07,
+ 0x06, 0x00, 0x02, 0x00, 0x16, 0x00, 0x00, 0x10,
+ 0x05, 0x00, 0x6A, 0x00, 0x1D, 0x07, 0x06, 0x00,
+ 0x02, 0x00, 0x17, 0x00, 0x00, 0x10, 0x05, 0x00,
+ 0x70, 0x00, 0x19, 0x07, 0x06, 0x00, 0x02, 0x00,
+ 0x18, 0x00, 0x00, 0x10, 0x05, 0x00, 0x76, 0x00,
+ 0x17, 0x07, 0x06, 0x00, 0x02, 0x00, 0x19, 0x00,
+ 0x00, 0x10, 0x05, 0x00, 0x7C, 0x00, 0x16, 0x07,
+ 0x06, 0x00, 0x02, 0x00, 0x1A, 0x00, 0x00, 0x10,
+ 0x05, 0x00, 0x82, 0x00, 0x17, 0x07, 0x06, 0x00,
+ 0x02, 0x00, 0x1B, 0x00, 0x00, 0x10, 0x05, 0x00,
+ 0x88, 0x00, 0x19, 0x07, 0x06, 0x00, 0x02, 0x00,
+ 0x1C, 0x00, 0x00, 0x10, 0x05, 0x00, 0x8D, 0x00,
+ 0x1D, 0x07, 0x06, 0x00, 0x02, 0x00, 0x1D, 0x00,
+ 0x00, 0x10, 0x05, 0x00, 0x93, 0x00, 0x1F, 0x07,
+ 0x06, 0x00, 0x1C, 0x06, 0x3C, 0x00, 0x1B, 0x0F,
+ 0x31, 0x02, 0x00, 0x00, 0x00, 0x00, 0x10, 0x05,
+ 0x00, 0x95, 0x00, 0x20, 0x07, 0x06, 0x00, 0x02,
+ 0x00, 0x00, 0x00, 0x00, 0x10, 0x05, 0x00, 0x95,
+ 0x00, 0x20, 0x07, 0x06, 0x00, 0x18, 0x1D, 0x02,
+ 0x00, 0x01, 0x00, 0x00, 0x10, 0x05, 0x01, 0x94,
+ 0x00, 0x1B, 0x07, 0x06, 0x00, 0x02, 0x00, 0x01,
+ 0x00, 0x00, 0x10, 0x05, 0x01, 0x94, 0x00, 0x1B,
+ 0x07, 0x06, 0x00, 0x02, 0x00, 0x02, 0x00, 0x00,
+ 0x10, 0x05, 0x02, 0x93, 0x00, 0x14, 0x07, 0x06,
+ 0x00, 0x02, 0x00, 0x02, 0x00, 0x00, 0x10, 0x05,
+ 0x02, 0x93, 0x00, 0x14, 0x07, 0x06, 0x00, 0x18,
+ 0x1D, 0x02, 0x00, 0x03, 0x00, 0x00, 0x10, 0x05,
+ 0x01, 0x90, 0x00, 0x1B, 0x07, 0x06, 0x00, 0x02,
+ 0x00, 0x04, 0x00, 0x00, 0x10, 0x05, 0x00, 0x8D,
+ 0x00, 0x20, 0x07, 0x06, 0x00, 0x02, 0x00, 0x05,
+ 0x00, 0x00, 0x10, 0x05, 0x01, 0x8A, 0x00, 0x1B,
+ 0x07, 0x06, 0x00, 0x18, 0x1D, 0x02, 0x00, 0x06,
+ 0x00, 0x00, 0x10, 0x05, 0x02, 0x88, 0x00, 0x14,
+ 0x07, 0x06, 0x00, 0x02, 0x00, 0x07, 0x00, 0x00,
+ 0x10, 0x05, 0x01, 0x85, 0x00, 0x1B, 0x07, 0x06,
+ 0x00, 0x18, 0x1D, 0x02, 0x00, 0x08, 0x00, 0x00,
+ 0x10, 0x05, 0x00, 0x82, 0x00, 0x20, 0x07, 0x06,
+ 0x00, 0x02, 0x00, 0x09, 0x00, 0x00, 0x10, 0x05,
+ 0x01, 0x7F, 0x00, 0x1B, 0x07, 0x06, 0x00, 0x02,
+ 0x00, 0x0A, 0x00, 0x00, 0x10, 0x05, 0x02, 0x7C,
+ 0x00, 0x14, 0x07, 0x06, 0x00, 0x18, 0x1D, 0x02,
+ 0x00, 0x0B, 0x00, 0x00, 0x10, 0x05, 0x01, 0x79,
+ 0x00, 0x1B, 0x07, 0x06, 0x00, 0x02, 0x00, 0x0C,
+ 0x00, 0x00, 0x10, 0x05, 0x00, 0x76, 0x00, 0x20,
+ 0x07, 0x06, 0x00, 0x18, 0x1D, 0x02, 0x00, 0x0D,
+ 0x00, 0x00, 0x10, 0x05, 0x01, 0x73, 0x00, 0x1B,
+ 0x07, 0x06, 0x00, 0x02, 0x00, 0x0E, 0x00, 0x00,
+ 0x10, 0x05, 0x02, 0x70, 0x00, 0x14, 0x07, 0x06,
+ 0x00, 0x02, 0x00, 0x0F, 0x00, 0x00, 0x10, 0x05,
+ 0x01, 0x6D, 0x00, 0x1B, 0x07, 0x06, 0x00, 0x18,
+ 0x1D, 0x02, 0x00, 0x10, 0x00, 0x00, 0x10, 0x05,
+ 0x00, 0x6A, 0x00, 0x20, 0x07, 0x06, 0x00, 0x02,
+ 0x00, 0x11, 0x00, 0x00, 0x10, 0x05, 0x01, 0x67,
+ 0x00, 0x1B, 0x07, 0x06, 0x00, 0x18, 0x1D, 0x02,
+ 0x00, 0x12, 0x00, 0x00, 0x10, 0x05, 0x02, 0x65,
+ 0x00, 0x14, 0x07, 0x06, 0x00, 0x06, 0x3C, 0x00,
+ 0x02, 0x00, 0x1E, 0x00, 0x00, 0x10, 0x08, 0x12,
+ 0x06, 0x1E, 0x00, 0x0A, 0x01, 0x02, 0x00, 0x1F,
+ 0x00, 0x00, 0x10, 0x07, 0x0A, 0x00, 0x02, 0x00,
+ 0x20, 0x00, 0x00, 0x10, 0x07, 0x0A, 0x00, 0x02,
+ 0x00, 0x21, 0x00, 0x00, 0x10, 0x07, 0x0A, 0x00,
+ 0x02, 0x00, 0x22, 0x00, 0x00, 0x10, 0x07, 0x0A,
+ 0x00, 0x0B, 0x01, 0x02, 0x00, 0x18, 0x1F, 0x06,
+ 0x0A, 0x00, 0x02, 0x00, 0x23, 0x00, 0x00, 0x10,
+ 0x07, 0x14, 0x00, 0x18, 0x1E, 0x02, 0x00, 0x24,
+ 0x00, 0x00, 0x10, 0x07, 0x14, 0x00, 0x02, 0x00,
+ 0x25, 0x00, 0x00, 0x10, 0x07, 0x14, 0x00, 0x18,
+ 0x1F, 0x02, 0x00, 0x26, 0x00, 0x00, 0x10, 0x07,
+ 0x14, 0x00, 0x02, 0x00, 0x27, 0x00, 0x00, 0x10,
+ 0x07, 0x14, 0x00, 0x18, 0x1E, 0x02, 0x00, 0x28,
+ 0x00, 0x00, 0x10, 0x08, 0x06, 0x3C, 0x00, 0x18,
+ 0x1E, 0x03, 0x00, 0x07, 0x06, 0x00, 0x18, 0x1E,
+ 0x03, 0x00, 0x07, 0x06, 0x00, 0x03, 0x00, 0x07,
+ 0x06, 0x00, 0x03, 0x00, 0x07, 0x06, 0x00, 0x03,
+ 0x00, 0x07, 0x06, 0x00, 0x03, 0x00, 0x07, 0x06,
+ 0x00, 0x03, 0x00, 0x07, 0x06, 0x00, 0x18, 0x1E,
+ 0x03, 0x00, 0x07, 0x06, 0x00, 0x03, 0x00, 0x07,
+ 0x06, 0x00, 0x03, 0x00, 0x07, 0x06, 0x00, 0x03,
+ 0x00, 0x07, 0x06, 0x00, 0x03, 0x00, 0x07, 0x06,
+ 0x00, 0x03, 0x00, 0x07, 0x06, 0x00, 0x03, 0x00,
+ 0x07, 0x06, 0x00, 0x03, 0x00, 0x07, 0x06, 0x00,
+ 0x03, 0x00, 0x07, 0x06, 0x00, 0x18, 0x1E, 0x03,
+ 0x00, 0x07, 0x06, 0x00, 0x03, 0x00, 0x07, 0x06,
+ 0x00, 0x03, 0x00, 0x07, 0x06, 0x00, 0x03, 0x00,
+ 0x07, 0x06, 0x00, 0x03, 0x00, 0x07, 0x06, 0x00,
+ 0x03, 0x00, 0x07, 0x06, 0x00, 0x03, 0x00, 0x07,
+ 0x06, 0x00, 0x03, 0x00, 0x07, 0x06, 0x00, 0x18,
+ 0x1E, 0x03, 0x00, 0x07, 0x06, 0x00, 0x03, 0x00,
+ 0x07, 0x06, 0x00, 0x03, 0x00, 0x07, 0x06, 0x00,
+ 0x03, 0x00, 0x07, 0x06, 0x00, 0x03, 0x00, 0x07,
+ 0x06, 0x00, 0x03, 0x00, 0x07, 0x06, 0x00, 0x03,
+ 0x00, 0x07, 0x06, 0x00, 0x03, 0x00, 0x07, 0x06,
+ 0x00, 0x03, 0x00, 0x07, 0x06, 0x00, 0x03, 0x00,
+ 0x07, 0x06, 0x00, 0x13, 0x1C, 0x19, 0x01, 0x0E,
+ 0x06, 0x3C, 0x00, 0x13, 0x01, 0x00, 0x1D
+};
+
+static const ByteProvider k1KallakWritingSeqFMTownsProvider = { ARRAYSIZE(k1KallakWritingSeqFMTowns), k1KallakWritingSeqFMTowns };
+
+static const byte k1MalcolmTreeSeqFMTowns[536] = {
+ 0x00, 0x01, 0x00, 0x1A, 0x0E, 0x17, 0x00, 0x00,
+ 0x00, 0x3F, 0x01, 0xC7, 0x0C, 0x00, 0x0C, 0x01,
+ 0x0D, 0x01, 0x09, 0x02, 0x01, 0x00, 0x00, 0x00,
+ 0x10, 0x19, 0x38, 0x09, 0x18, 0x1E, 0x14, 0x18,
+ 0x1F, 0x0A, 0x00, 0x03, 0x01, 0x06, 0x06, 0x00,
+ 0x0B, 0x00, 0x1F, 0x00, 0x18, 0x19, 0x0A, 0x01,
+ 0x03, 0x01, 0x06, 0x06, 0x00, 0x0B, 0x01, 0x0F,
+ 0x00, 0x18, 0x26, 0x10, 0x1F, 0x50, 0x00, 0x2D,
+ 0x05, 0x0A, 0x02, 0x03, 0x01, 0x06, 0x06, 0x00,
+ 0x0B, 0x02, 0x10, 0x00, 0x11, 0x18, 0x1F, 0x03,
+ 0x01, 0x06, 0x06, 0x00, 0x03, 0x01, 0x06, 0x06,
+ 0x00, 0x03, 0x01, 0x06, 0x06, 0x00, 0x18, 0x24,
+ 0x18, 0x1F, 0x03, 0x01, 0x06, 0x06, 0x00, 0x18,
+ 0x1E, 0x0A, 0x03, 0x03, 0x01, 0x06, 0x06, 0x00,
+ 0x0B, 0x03, 0x15, 0x00, 0x10, 0x16, 0x50, 0x00,
+ 0x2D, 0x05, 0x18, 0x1F, 0x03, 0x01, 0x06, 0x06,
+ 0x00, 0x03, 0x01, 0x06, 0x06, 0x00, 0x18, 0x1E,
+ 0x03, 0x01, 0x06, 0x06, 0x00, 0x03, 0x01, 0x06,
+ 0x06, 0x00, 0x18, 0x1F, 0x03, 0x01, 0x06, 0x06,
+ 0x00, 0x03, 0x01, 0x06, 0x06, 0x00, 0x03, 0x01,
+ 0x06, 0x06, 0x00, 0x03, 0x01, 0x06, 0x06, 0x00,
+ 0x18, 0x1E, 0x03, 0x01, 0x06, 0x06, 0x00, 0x18,
+ 0x1A, 0x18, 0x1E, 0x0A, 0x05, 0x03, 0x01, 0x06,
+ 0x06, 0x00, 0x0B, 0x05, 0x09, 0x00, 0x11, 0x0A,
+ 0x06, 0x03, 0x01, 0x06, 0x06, 0x00, 0x0B, 0x06,
+ 0x14, 0x00, 0x18, 0x1A, 0x18, 0x1F, 0x10, 0x17,
+ 0x50, 0x00, 0x2D, 0x05, 0x06, 0x3C, 0x00, 0x0A,
+ 0x07, 0x03, 0x01, 0x06, 0x06, 0x00, 0x0B, 0x07,
+ 0x06, 0x00, 0x18, 0x1E, 0x06, 0x1E, 0x00, 0x10,
+ 0x18, 0x50, 0x00, 0x2D, 0x05, 0x03, 0x01, 0x06,
+ 0x06, 0x00, 0x03, 0x01, 0x06, 0x06, 0x00, 0x03,
+ 0x01, 0x06, 0x06, 0x00, 0x0A, 0x08, 0x04, 0x01,
+ 0x06, 0x06, 0x00, 0x04, 0x01, 0x06, 0x06, 0x00,
+ 0x03, 0x01, 0x06, 0x06, 0x00, 0x03, 0x01, 0x06,
+ 0x06, 0x00, 0x0B, 0x08, 0x01, 0x00, 0x03, 0x01,
+ 0x06, 0x06, 0x00, 0x06, 0x78, 0x00, 0x0A, 0x09,
+ 0x03, 0x01, 0x06, 0x06, 0x00, 0x0B, 0x09, 0x04,
+ 0x00, 0x18, 0x1B, 0x0A, 0x0A, 0x03, 0x01, 0x06,
+ 0x06, 0x00, 0x0B, 0x0A, 0x09, 0x00, 0x06, 0x14,
+ 0x00, 0x10, 0x19, 0x50, 0x00, 0x2D, 0x05, 0x03,
+ 0x01, 0x06, 0x06, 0x00, 0x03, 0x01, 0x06, 0x06,
+ 0x00, 0x0A, 0x0B, 0x03, 0x01, 0x06, 0x06, 0x00,
+ 0x04, 0x01, 0x06, 0x06, 0x00, 0x04, 0x01, 0x06,
+ 0x06, 0x00, 0x03, 0x01, 0x06, 0x06, 0x00, 0x03,
+ 0x01, 0x06, 0x06, 0x00, 0x0B, 0x0B, 0x01, 0x00,
+ 0x03, 0x01, 0x06, 0x06, 0x00, 0x03, 0x01, 0x06,
+ 0x06, 0x00, 0x03, 0x01, 0x06, 0x06, 0x00, 0x10,
+ 0x1A, 0x50, 0x00, 0x2D, 0x05, 0x0A, 0x0C, 0x03,
+ 0x01, 0x06, 0x06, 0x00, 0x0B, 0x0C, 0x12, 0x00,
+ 0x03, 0x01, 0x01, 0x01, 0x11, 0x15, 0x00, 0x02,
+ 0x00, 0x02, 0x00, 0x02, 0x02, 0x00, 0x00, 0x00,
+ 0x10, 0x10, 0x1C, 0x50, 0x00, 0x2D, 0x05, 0x06,
+ 0x3C, 0x00, 0x03, 0x02, 0x03, 0x02, 0x06, 0x06,
+ 0x00, 0x11, 0x18, 0x1C, 0x0A, 0x0F, 0x03, 0x02,
+ 0x06, 0x06, 0x00, 0x0B, 0x0F, 0x0D, 0x00, 0x10,
+ 0x1D, 0x50, 0x00, 0x2D, 0x05, 0x0A, 0x10, 0x03,
+ 0x02, 0x06, 0x06, 0x00, 0x03, 0x02, 0x06, 0x06,
+ 0x00, 0x03, 0x02, 0x06, 0x06, 0x00, 0x04, 0x02,
+ 0x06, 0x06, 0x00, 0x04, 0x02, 0x06, 0x06, 0x00,
+ 0x04, 0x02, 0x06, 0x06, 0x00, 0x0B, 0x10, 0x02,
+ 0x00, 0x10, 0x1E, 0x50, 0x00, 0x2D, 0x05, 0x0A,
+ 0x11, 0x03, 0x02, 0x06, 0x06, 0x00, 0x03, 0x02,
+ 0x06, 0x06, 0x00, 0x03, 0x02, 0x06, 0x06, 0x00,
+ 0x04, 0x02, 0x06, 0x06, 0x00, 0x04, 0x02, 0x06,
+ 0x06, 0x00, 0x04, 0x02, 0x06, 0x06, 0x00, 0x0B,
+ 0x11, 0x02, 0x00, 0x06, 0xB4, 0x00, 0x13, 0x19,
+ 0x01, 0x0E, 0x01, 0x01, 0x13, 0x01, 0x02, 0x1D
+};
+
+static const ByteProvider k1MalcolmTreeSeqFMTownsProvider = { ARRAYSIZE(k1MalcolmTreeSeqFMTowns), k1MalcolmTreeSeqFMTowns };
+
+static const byte k1WestwoodLogoSeqFMTowns[75] = {
+ 0x00, 0x03, 0x01, 0x1A, 0x02, 0x03, 0x00, 0x00,
+ 0x00, 0x00, 0x16, 0x01, 0x06, 0x06, 0x00, 0x06,
+ 0x3C, 0x00, 0x18, 0x14, 0x0A, 0x00, 0x03, 0x03,
+ 0x16, 0x01, 0x0B, 0x00, 0x08, 0x00, 0x06, 0x3C,
+ 0x00, 0x18, 0x27, 0x0A, 0x01, 0x03, 0x03, 0x16,
+ 0x01, 0x0B, 0x01, 0x0B, 0x00, 0x06, 0x78, 0x00,
+ 0x18, 0x14, 0x02, 0x03, 0x0A, 0x00, 0x00, 0x00,
+ 0x16, 0x01, 0x06, 0x06, 0x00, 0x0A, 0x02, 0x04,
+ 0x03, 0x16, 0x01, 0x0B, 0x02, 0x09, 0x00, 0x13,
+ 0x01, 0x03, 0x1D
+};
+
+static const ByteProvider k1WestwoodLogoSeqFMTownsProvider = { ARRAYSIZE(k1WestwoodLogoSeqFMTowns), k1WestwoodLogoSeqFMTowns };
+
+static const byte k1KyrandiaLogoSeqFMTowns[92] = {
+ 0x15, 0x00, 0x02, 0x00, 0x06, 0x01, 0x1A, 0x02,
+ 0x06, 0x00, 0x00, 0x00, 0x00, 0x16, 0x00, 0x06,
+ 0x06, 0x00, 0x18, 0x14, 0x16, 0x04, 0x0A, 0x00,
+ 0x03, 0x06, 0x16, 0x00, 0x0B, 0x00, 0x0B, 0x00,
+ 0x06, 0x3C, 0x00, 0x18, 0x27, 0x0A, 0x01, 0x03,
+ 0x06, 0x16, 0x00, 0x0B, 0x01, 0x0F, 0x00, 0x06,
+ 0x3C, 0x00, 0x18, 0x27, 0x0A, 0x02, 0x04, 0x06,
+ 0x16, 0x00, 0x0B, 0x02, 0x0F, 0x00, 0x02, 0x06,
+ 0x0D, 0x00, 0x00, 0x00, 0x16, 0x00, 0x06, 0x06,
+ 0x00, 0x06, 0x78, 0x00, 0x18, 0x14, 0x0A, 0x02,
+ 0x04, 0x06, 0x16, 0x00, 0x0B, 0x02, 0x0C, 0x00,
+ 0x13, 0x01, 0x06, 0x1D
+};
+
+static const ByteProvider k1KyrandiaLogoSeqFMTownsProvider = { ARRAYSIZE(k1KyrandiaLogoSeqFMTowns), k1KyrandiaLogoSeqFMTowns };
+
+static const byte k1KallakMalcolmSeqFMTowns[621] = {
+ 0x00, 0x04, 0x01, 0x1A, 0x0E, 0x17, 0x00, 0x00,
+ 0x00, 0x3F, 0x01, 0xC7, 0x0C, 0x00, 0x0C, 0x03,
+ 0x0D, 0x00, 0x17, 0x00, 0x00, 0x88, 0x3F, 0x01,
+ 0xC7, 0x0C, 0x02, 0x19, 0x00, 0x02, 0x04, 0x00,
+ 0x10, 0x00, 0x3A, 0x09, 0x19, 0x00, 0x19, 0x3A,
+ 0x14, 0x18, 0x23, 0x0A, 0x00, 0x03, 0x04, 0x07,
+ 0x07, 0x00, 0x0B, 0x00, 0x22, 0x00, 0x10, 0x02,
+ 0x50, 0x00, 0x3A, 0x05, 0x0A, 0x01, 0x03, 0x04,
+ 0x07, 0x07, 0x00, 0x0B, 0x01, 0x07, 0x00, 0x06,
+ 0x3C, 0x00, 0x10, 0x03, 0x50, 0x00, 0x3A, 0x05,
+ 0x0A, 0x02, 0x03, 0x04, 0x07, 0x07, 0x00, 0x0B,
+ 0x02, 0x17, 0x00, 0x06, 0x3C, 0x00, 0x10, 0x04,
+ 0x50, 0x00, 0x3A, 0x05, 0x0A, 0x03, 0x03, 0x04,
+ 0x07, 0x07, 0x00, 0x0B, 0x03, 0x0A, 0x00, 0x06,
+ 0x3C, 0x00, 0x03, 0x04, 0x07, 0x07, 0x00, 0x03,
+ 0x04, 0x07, 0x07, 0x00, 0x03, 0x04, 0x07, 0x07,
+ 0x00, 0x10, 0x05, 0xF0, 0x00, 0x3A, 0x0F, 0x03,
+ 0x04, 0x07, 0x07, 0x00, 0x03, 0x04, 0x07, 0x07,
+ 0x00, 0x03, 0x04, 0x07, 0x07, 0x00, 0x03, 0x04,
+ 0x07, 0x07, 0x00, 0x06, 0x3C, 0x00, 0x10, 0x06,
+ 0xF0, 0x00, 0x3A, 0x0F, 0x0A, 0x04, 0x03, 0x04,
+ 0x07, 0x07, 0x00, 0x0B, 0x04, 0x12, 0x00, 0x06,
+ 0x3C, 0x00, 0x03, 0x04, 0x07, 0x07, 0x00, 0x03,
+ 0x04, 0x07, 0x07, 0x00, 0x03, 0x04, 0x07, 0x07,
+ 0x00, 0x03, 0x04, 0x07, 0x07, 0x00, 0x06, 0x78,
+ 0x00, 0x10, 0x07, 0xF0, 0x00, 0x3A, 0x0F, 0x0A,
+ 0x05, 0x03, 0x04, 0x07, 0x07, 0x00, 0x0B, 0x05,
+ 0x11, 0x00, 0x06, 0x3C, 0x00, 0x03, 0x04, 0x07,
+ 0x07, 0x00, 0x03, 0x04, 0x07, 0x07, 0x00, 0x10,
+ 0x08, 0x50, 0x00, 0x3A, 0x05, 0x0A, 0x06, 0x03,
+ 0x04, 0x07, 0x07, 0x00, 0x0B, 0x06, 0x07, 0x00,
+ 0x06, 0x3C, 0x00, 0x03, 0x04, 0x07, 0x07, 0x00,
+ 0x03, 0x04, 0x07, 0x07, 0x00, 0x03, 0x04, 0x07,
+ 0x07, 0x00, 0x10, 0x09, 0x50, 0x00, 0x3A, 0x05,
+ 0x0A, 0x07, 0x03, 0x04, 0x07, 0x07, 0x00, 0x0B,
+ 0x07, 0x0A, 0x00, 0x06, 0x3C, 0x00, 0x03, 0x04,
+ 0x07, 0x07, 0x00, 0x10, 0x0A, 0x50, 0x00, 0x3A,
+ 0x05, 0x0A, 0x08, 0x03, 0x04, 0x07, 0x07, 0x00,
+ 0x0B, 0x08, 0x10, 0x00, 0x06, 0x3C, 0x00, 0x03,
+ 0x04, 0x07, 0x07, 0x00, 0x10, 0x0B, 0xF0, 0x00,
+ 0x3A, 0x0F, 0x03, 0x04, 0x07, 0x07, 0x00, 0x03,
+ 0x04, 0x07, 0x07, 0x00, 0x03, 0x04, 0x07, 0x07,
+ 0x00, 0x03, 0x04, 0x07, 0x07, 0x00, 0x03, 0x04,
+ 0x07, 0x07, 0x00, 0x03, 0x04, 0x07, 0x07, 0x00,
+ 0x03, 0x04, 0x07, 0x07, 0x00, 0x03, 0x04, 0x07,
+ 0x07, 0x00, 0x06, 0x3C, 0x00, 0x03, 0x04, 0x07,
+ 0x07, 0x00, 0x10, 0x0C, 0xF0, 0x00, 0x3A, 0x0F,
+ 0x0A, 0x09, 0x03, 0x04, 0x07, 0x07, 0x00, 0x0B,
+ 0x09, 0x0E, 0x00, 0x06, 0x3C, 0x00, 0x03, 0x04,
+ 0x07, 0x07, 0x00, 0x03, 0x04, 0x07, 0x07, 0x00,
+ 0x03, 0x04, 0x07, 0x07, 0x00, 0x03, 0x04, 0x07,
+ 0x07, 0x00, 0x03, 0x04, 0x07, 0x07, 0x00, 0x03,
+ 0x04, 0x07, 0x07, 0x00, 0x10, 0x0D, 0x50, 0x00,
+ 0x3A, 0x05, 0x0A, 0x0A, 0x03, 0x04, 0x07, 0x07,
+ 0x00, 0x0B, 0x0A, 0x0E, 0x00, 0x06, 0x3C, 0x00,
+ 0x0A, 0x0B, 0x03, 0x04, 0x07, 0x07, 0x00, 0x0B,
+ 0x0B, 0x02, 0x00, 0x18, 0x20, 0x0A, 0x0C, 0x03,
+ 0x04, 0x07, 0x07, 0x00, 0x0B, 0x0C, 0x06, 0x00,
+ 0x18, 0x21, 0x0A, 0x0D, 0x03, 0x04, 0x07, 0x07,
+ 0x00, 0x0B, 0x0D, 0x0C, 0x00, 0x18, 0x22, 0x0A,
+ 0x0E, 0x03, 0x04, 0x07, 0x07, 0x00, 0x0B, 0x0E,
+ 0x0B, 0x00, 0x10, 0x0E, 0x50, 0x00, 0x3A, 0x05,
+ 0x0A, 0x0F, 0x03, 0x04, 0x07, 0x07, 0x00, 0x0B,
+ 0x0F, 0x09, 0x00, 0x06, 0x3C, 0x00, 0x03, 0x04,
+ 0x07, 0x07, 0x00, 0x10, 0x0F, 0x50, 0x00, 0x3A,
+ 0x05, 0x0A, 0x10, 0x03, 0x04, 0x07, 0x07, 0x00,
+ 0x0B, 0x10, 0x09, 0x00, 0x06, 0x3C, 0x00, 0x03,
+ 0x04, 0x07, 0x07, 0x00, 0x10, 0x10, 0x50, 0x00,
+ 0x3A, 0x05, 0x0A, 0x11, 0x03, 0x04, 0x07, 0x07,
+ 0x00, 0x0B, 0x11, 0x0F, 0x00, 0x06, 0x3C, 0x00,
+ 0x03, 0x04, 0x07, 0x07, 0x00, 0x10, 0x11, 0x50,
+ 0x00, 0x3A, 0x05, 0x0A, 0x12, 0x03, 0x04, 0x07,
+ 0x07, 0x00, 0x0B, 0x12, 0x14, 0x00, 0x06, 0x3C,
+ 0x00, 0x0A, 0x13, 0x03, 0x04, 0x07, 0x07, 0x00,
+ 0x0B, 0x13, 0x06, 0x00, 0x18, 0x23, 0x0A, 0x13,
+ 0x03, 0x04, 0x07, 0x07, 0x00, 0x0B, 0x13, 0x07,
+ 0x00, 0x11, 0x06, 0x3C, 0x00, 0x13, 0x19, 0x01,
+ 0x0E, 0x13, 0x01, 0x04, 0x1D
+};
+
+static const ByteProvider k1KallakMalcolmSeqFMTownsProvider = { ARRAYSIZE(k1KallakMalcolmSeqFMTowns), k1KallakMalcolmSeqFMTowns };
+
+static const byte k1ForestSeqFMTowns[406] = {
+ 0x00, 0x05, 0x01, 0x00, 0x07, 0x01, 0x1A, 0x02,
+ 0x07, 0x00, 0x00, 0x00, 0x08, 0x02, 0x05, 0x00,
+ 0x98, 0x00, 0x38, 0x0A, 0x00, 0x03, 0x07, 0x16,
+ 0x02, 0x06, 0x09, 0x00, 0x0B, 0x00, 0x41, 0x00,
+ 0x18, 0x16, 0x03, 0x07, 0x02, 0x05, 0x01, 0x98,
+ 0x00, 0x38, 0x16, 0x02, 0x16, 0x03, 0x06, 0x09,
+ 0x00, 0x03, 0x07, 0x02, 0x05, 0x03, 0x98, 0x00,
+ 0x38, 0x16, 0x02, 0x16, 0x03, 0x06, 0x09, 0x00,
+ 0x03, 0x07, 0x02, 0x05, 0x01, 0x98, 0x00, 0x38,
+ 0x16, 0x02, 0x16, 0x03, 0x06, 0x09, 0x00, 0x03,
+ 0x07, 0x02, 0x05, 0x00, 0x98, 0x00, 0x38, 0x16,
+ 0x02, 0x16, 0x03, 0x06, 0x09, 0x00, 0x0A, 0x05,
+ 0x03, 0x07, 0x16, 0x02, 0x06, 0x09, 0x00, 0x0B,
+ 0x05, 0x0E, 0x00, 0x18, 0x16, 0x03, 0x07, 0x02,
+ 0x05, 0x01, 0x98, 0x00, 0x38, 0x16, 0x02, 0x16,
+ 0x03, 0x06, 0x09, 0x00, 0x03, 0x07, 0x02, 0x05,
+ 0x03, 0x98, 0x00, 0x38, 0x16, 0x02, 0x16, 0x03,
+ 0x06, 0x09, 0x00, 0x03, 0x07, 0x02, 0x05, 0x01,
+ 0x98, 0x00, 0x38, 0x16, 0x02, 0x16, 0x03, 0x06,
+ 0x09, 0x00, 0x03, 0x07, 0x02, 0x05, 0x04, 0x98,
+ 0x00, 0x38, 0x16, 0x02, 0x16, 0x03, 0x06, 0x09,
+ 0x00, 0x03, 0x07, 0x16, 0x02, 0x06, 0x09, 0x00,
+ 0x03, 0x07, 0x16, 0x02, 0x06, 0x09, 0x00, 0x03,
+ 0x07, 0x02, 0x05, 0x05, 0x98, 0x00, 0x38, 0x16,
+ 0x02, 0x16, 0x03, 0x06, 0x09, 0x00, 0x03, 0x07,
+ 0x16, 0x02, 0x06, 0x09, 0x00, 0x03, 0x07, 0x16,
+ 0x02, 0x06, 0x09, 0x00, 0x03, 0x07, 0x02, 0x05,
+ 0x06, 0x98, 0x00, 0x38, 0x16, 0x02, 0x16, 0x03,
+ 0x06, 0x09, 0x00, 0x03, 0x07, 0x16, 0x02, 0x06,
+ 0x09, 0x00, 0x03, 0x07, 0x16, 0x02, 0x06, 0x09,
+ 0x00, 0x18, 0x25, 0x0A, 0x00, 0x03, 0x07, 0x03,
+ 0x05, 0x16, 0x02, 0x16, 0x03, 0x06, 0x09, 0x00,
+ 0x0B, 0x00, 0x09, 0x00, 0x0A, 0x06, 0x03, 0x07,
+ 0x16, 0x02, 0x06, 0x09, 0x00, 0x0B, 0x06, 0x0E,
+ 0x00, 0x18, 0x17, 0x0A, 0x01, 0x03, 0x07, 0x03,
+ 0x05, 0x16, 0x02, 0x16, 0x03, 0x06, 0x09, 0x00,
+ 0x0B, 0x01, 0x0D, 0x00, 0x18, 0x25, 0x0A, 0x07,
+ 0x03, 0x07, 0x16, 0x02, 0x06, 0x09, 0x00, 0x0B,
+ 0x07, 0x0E, 0x00, 0x18, 0x18, 0x03, 0x07, 0x03,
+ 0x05, 0x16, 0x02, 0x16, 0x03, 0x06, 0x09, 0x00,
+ 0x03, 0x07, 0x03, 0x05, 0x16, 0x02, 0x16, 0x03,
+ 0x06, 0x09, 0x00, 0x03, 0x07, 0x03, 0x05, 0x16,
+ 0x02, 0x16, 0x03, 0x06, 0x09, 0x00, 0x03, 0x07,
+ 0x03, 0x05, 0x16, 0x02, 0x16, 0x03, 0x06, 0x09,
+ 0x00, 0x03, 0x07, 0x03, 0x05, 0x16, 0x02, 0x16,
+ 0x03, 0x06, 0x09, 0x00, 0x06, 0x12, 0x00, 0x18,
+ 0x25, 0x0A, 0x02, 0x03, 0x07, 0x03, 0x05, 0x16,
+ 0x02, 0x16, 0x03, 0x06, 0x09, 0x00, 0x0B, 0x02,
+ 0x07, 0x00, 0x0A, 0x03, 0x03, 0x07, 0x16, 0x02,
+ 0x06, 0x09, 0x00, 0x0B, 0x03, 0x0F, 0x00, 0x13,
+ 0x13, 0x01, 0x07, 0x01, 0x05, 0x1D
+};
+
+static const ByteProvider k1ForestSeqFMTownsProvider = { ARRAYSIZE(k1ForestSeqFMTowns), k1ForestSeqFMTowns };
+
+static const char *const k1IntroCPSStringsFMTowns[2] = {
+ "gemcut.cps",
+ "tree.cps"
+};
+
+static const StringListProvider k1IntroCPSStringsFMTownsProvider = { ARRAYSIZE(k1IntroCPSStringsFMTowns), k1IntroCPSStringsFMTowns };
+
+static const char *const k1IntroCOLStringsFMTowns[4] = {
+ "kallak.col",
+ "tree_exp.col",
+ "ww.col",
+ "mal-kal.col"
+};
+
+static const StringListProvider k1IntroCOLStringsFMTownsProvider = { ARRAYSIZE(k1IntroCOLStringsFMTowns), k1IntroCOLStringsFMTowns };
+
+static const char *const k1IntroWSAStringsFMTowns[11] = {
+ "kallak.wsa",
+ "tree1.wsa",
+ "tree2.wsa",
+ "westwood.wsa",
+ "mal-kal.wsa",
+ "destruct.wsa",
+ "kyrandia.wsa",
+ "shore.wsa",
+ "reunion.wsa",
+ "reuniont.wsa",
+ "latern.wsa"
+};
+
+static const StringListProvider k1IntroWSAStringsFMTownsProvider = { ARRAYSIZE(k1IntroWSAStringsFMTowns), k1IntroWSAStringsFMTowns };
+
+static const Room k1RoomListFMTowns[246] = {
+ { 30, 0xFFFF, 0xFFFF, 0x0001, 0xFFFF },
+ { 71, 0xFFFF, 0xFFFF, 0x0005, 0xFFFF },
+ { 44, 0xFFFF, 0x0003, 0xFFFF, 0xFFFF },
+ { 72, 0xFFFF, 0xFFFF, 0x000E, 0xFFFF },
+ { 48, 0xFFFF, 0x0005, 0xFFFF, 0x000E },
+ { 74, 0xFFFF, 0x000A, 0xFFFF, 0x0004 },
+ { 46, 0xFFFF, 0x000F, 0xFFFF, 0x000B },
+ { 75, 0xFFFF, 0x0009, 0xFFFF, 0x0018 },
+ { 13, 0xFFFF, 0x000C, 0xFFFF, 0x000A },
+ { 5, 0x000D, 0xFFFF, 0xFFFF, 0x0007 },
+ { 84, 0xFFFF, 0x0008, 0xFFFF, 0x0005 },
+ { 37, 0xFFFF, 0x0006, 0x000C, 0x0010 },
+ { 51, 0x000B, 0xFFFF, 0x000D, 0x0008 },
+ { 23, 0x000C, 0xFFFF, 0x0009, 0xFFFF },
+ { 25, 0x0003, 0x0004, 0xFFFF, 0xFFFF },
+ { 11, 0xFFFF, 0xFFFF, 0xFFFF, 0x0006 },
+ { 86, 0xFFFF, 0x000B, 0xFFFF, 0xFFFF },
+ { 84, 0xFFFF, 0x0022, 0x0017, 0x0016 },
+ { 51, 0x0020, 0x0014, 0x0024, 0x0015 },
+ { 85, 0x0014, 0x0019, 0xFFFF, 0x0024 },
+ { 33, 0x001C, 0xFFFF, 0x0013, 0x0012 },
+ { 31, 0x0022, 0x0012, 0xFFFF, 0x0017 },
+ { 25, 0x001F, 0x0011, 0xFFFF, 0xFFFF },
+ { 25, 0x0011, 0x0015, 0xFFFF, 0xFFFF },
+ { 2, 0xFFFF, 0x0007, 0xFFFF, 0x001A },
+ { 82, 0xFFFF, 0x006D, 0xFFFF, 0x0013 },
+ { 77, 0xFFFF, 0x0018, 0x0021, 0xFFFF },
+ { 15, 0xFFFF, 0x001A, 0xFFFF, 0xFFFF },
+ { 16, 0xFFFF, 0xFFFF, 0x0014, 0x0020 },
+ { 19, 0xFFFF, 0x0021, 0xFFFF, 0x001F },
+ { 12, 0xFFFF, 0xFFFF, 0x0020, 0x0021 },
+ { 7, 0x0023, 0x001D, 0x0016, 0xFFFF },
+ { 20, 0x001E, 0x001C, 0x0012, 0x0022 },
+ { 17, 0x001A, 0x001E, 0x0022, 0x001D },
+ { 22, 0x0021, 0x0020, 0x0015, 0x0011 },
+ { 24, 0xFFFF, 0xFFFF, 0x001F, 0xFFFF },
+ { 32, 0x0012, 0x0013, 0xFFFF, 0xFFFF },
+ { 87, 0xFFFF, 0x0026, 0xFFFF, 0xFFFF },
+ { 8, 0xFFFF, 0x0027, 0xFFFF, 0x0025 },
+ { 88, 0xFFFF, 0x0035, 0x0037, 0x0026 },
+ { 35, 0xFFFF, 0x0036, 0x0038, 0xFFFF },
+ { 47, 0xFFFF, 0xFFFF, 0x003B, 0xFFFF },
+ { 28, 0x0035, 0x002B, 0x002F, 0x0037 },
+ { 36, 0xFFFF, 0x002C, 0xFFFF, 0x002A },
+ { 78, 0xFFFF, 0xFFFF, 0xFFFF, 0x002B },
+ { 10, 0xFFFF, 0xFFFF, 0xFFFF, 0x002C },
+ { 51, 0x0037, 0x002F, 0x0040, 0x003C },
+ { 38, 0x002A, 0x003D, 0x0041, 0x002E },
+ { 81, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF },
+ { 41, 0xFFFF, 0xFFFF, 0x0069, 0xFFFF },
+ { 50, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF },
+ { 18, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF },
+ { 49, 0xFFFF, 0xFFFF, 0x0054, 0xFFFF },
+ { 105, 0xFFFF, 0xFFFF, 0x002A, 0x0027 },
+ { 105, 0xFFFF, 0xFFFF, 0x0039, 0x0028 },
+ { 37, 0x0027, 0x002A, 0x002E, 0x0049 },
+ { 34, 0x0028, 0x0039, 0xFFFF, 0xFFFF },
+ { 51, 0x0036, 0x003A, 0xFFFF, 0x0038 },
+ { 84, 0xFFFF, 0x003B, 0xFFFF, 0x0039 },
+ { 1, 0x0029, 0xFFFF, 0x003E, 0x003A },
+ { 37, 0x0049, 0x002E, 0x003F, 0xFFFF },
+ { 33, 0xFFFF, 0xFFFF, 0xFFFF, 0x002F },
+ { 34, 0x003B, 0x003F, 0xFFFF, 0xFFFF },
+ { 85, 0x003C, 0x0040, 0xFFFF, 0x003E },
+ { 106, 0x002E, 0x0041, 0xFFFF, 0x003F },
+ { 33, 0x002F, 0xFFFF, 0xFFFF, 0x0040 },
+ { 60, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF },
+ { 3, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF },
+ { 11, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF },
+ { 33, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF },
+ { 26, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF },
+ { 0, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF },
+ { 25, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF },
+ { 23, 0xFFFF, 0x0037, 0x003C, 0xFFFF },
+ { 6, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF },
+ { 51, 0x0063, 0x0067, 0x006B, 0x0066 },
+ { 66, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF },
+ { 67, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF },
+ { 62, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF },
+ { 65, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF },
+ { 18, 0x0056, 0x005A, 0x005E, 0xFFFF },
+ { 6, 0xFFFF, 0x0052, 0x0056, 0xFFFF },
+ { 4, 0xFFFF, 0x0053, 0x0057, 0x0051 },
+ { 3, 0xFFFF, 0x0054, 0xFFFF, 0x0052 },
+ { 37, 0x0034, 0x0055, 0x0058, 0x0053 },
+ { 11, 0xFFFF, 0xFFFF, 0x0059, 0x0054 },
+ { 37, 0x0051, 0x0057, 0x0050, 0xFFFF },
+ { 51, 0x0052, 0xFFFF, 0x005A, 0x0056 },
+ { 51, 0x0054, 0x0059, 0x005C, 0xFFFF },
+ { 1, 0x0055, 0xFFFF, 0x005D, 0x0058 },
+ { 106, 0x0057, 0x005B, 0xFFFF, 0x0050 },
+ { 85, 0xFFFF, 0x005C, 0xFFFF, 0x005A },
+ { 37, 0x0058, 0x005D, 0x005F, 0x005B },
+ { 33, 0x0059, 0xFFFF, 0xFFFF, 0x005C },
+ { 51, 0x0050, 0xFFFF, 0x0061, 0xFFFF },
+ { 51, 0x005C, 0xFFFF, 0x0064, 0xFFFF },
+ { 37, 0xFFFF, 0x0061, 0x0065, 0xFFFF },
+ { 51, 0x005E, 0x0062, 0xFFFF, 0x0060 },
+ { 84, 0xFFFF, 0x0063, 0x0066, 0x0061 },
+ { 84, 0xFFFF, 0x0064, 0x004B, 0x0062 },
+ { 33, 0x005F, 0xFFFF, 0x0067, 0x0063 },
+ { 51, 0x0060, 0xFFFF, 0x0068, 0xFFFF },
+ { 37, 0x0062, 0x004B, 0x006A, 0xFFFF },
+ { 1, 0x0064, 0xFFFF, 0x006C, 0x004B },
+ { 34, 0x0065, 0x0069, 0xFFFF, 0xFFFF },
+ { 51, 0x0031, 0x006A, 0xFFFF, 0x0068 },
+ { 85, 0x0066, 0x006B, 0xFFFF, 0x0069 },
+ { 106, 0x004B, 0x006C, 0xFFFF, 0x006A },
+ { 33, 0x0067, 0xFFFF, 0xFFFF, 0x006B },
+ { 55, 0x00C4, 0x00C5, 0xFFFF, 0x0019 },
+ { 52, 0xFFFF, 0x00C1, 0xFFFF, 0x0096 },
+ { 64, 0xFFFF, 0x00BF, 0xFFFF, 0x008C },
+ { 57, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF },
+ { 54, 0x00AF, 0xFFFF, 0x00B7, 0x00AC },
+ { 53, 0x0078, 0xFFFF, 0x0079, 0xFFFF },
+ { 29, 0xFFFF, 0x00BB, 0xFFFF, 0x00C5 },
+ { 69, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF },
+ { 76, 0x00C6, 0xFFFF, 0xFFFF, 0x00B1 },
+ { 59, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF },
+ { 58, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF },
+ { 59, 0xFFFF, 0x0025, 0x0072, 0xFFFF },
+ { 58, 0x0072, 0x007B, 0x00BB, 0xFFFF },
+ { 58, 0xFFFF, 0x007F, 0x007B, 0xFFFF },
+ { 59, 0x007A, 0xFFFF, 0x007C, 0x0079 },
+ { 58, 0x007B, 0x0081, 0x00BC, 0xFFFF },
+ { 58, 0x00BC, 0x0083, 0xFFFF, 0xFFFF },
+ { 58, 0xFFFF, 0x0085, 0x007F, 0xFFFF },
+ { 59, 0x007E, 0x0086, 0x0080, 0x007A },
+ { 58, 0x007F, 0x00BD, 0x0081, 0xFFFF },
+ { 59, 0x0080, 0x0087, 0x0082, 0x007C },
+ { 58, 0x0081, 0xFFFF, 0x0083, 0x00BC },
+ { 59, 0x0082, 0x0089, 0x0084, 0x007D },
+ { 58, 0x0083, 0x008A, 0xFFFF, 0xFFFF },
+ { 59, 0xFFFF, 0x008B, 0x0086, 0x007E },
+ { 58, 0x0085, 0x008C, 0x00BD, 0x007F },
+ { 58, 0x00BD, 0x008E, 0x0088, 0x0081 },
+ { 59, 0x0087, 0xFFFF, 0x0089, 0xFFFF },
+ { 58, 0x0088, 0x0090, 0x008A, 0x0083 },
+ { 59, 0x0089, 0x0091, 0xFFFF, 0x0084 },
+ { 58, 0xFFFF, 0x0092, 0x008C, 0x0085 },
+ { 59, 0x008B, 0x006F, 0x008D, 0x0086 },
+ { 58, 0x008C, 0x0093, 0x008E, 0x00BD },
+ { 59, 0x008D, 0xFFFF, 0xFFFF, 0x0087 },
+ { 58, 0xFFFF, 0x00BE, 0x0090, 0xFFFF },
+ { 59, 0x008F, 0x0095, 0x0091, 0x0089 },
+ { 58, 0x0090, 0x0096, 0xFFFF, 0x008A },
+ { 59, 0xFFFF, 0x0098, 0xFFFF, 0x008B },
+ { 59, 0xFFFF, 0xFFFF, 0xFFFF, 0x008D },
+ { 58, 0xFFFF, 0x009A, 0x00BE, 0xFFFF },
+ { 58, 0x00BE, 0xFFFF, 0x0096, 0x0090 },
+ { 59, 0x0095, 0x006E, 0x0097, 0x0091 },
+ { 58, 0x0096, 0x009D, 0xFFFF, 0xFFFF },
+ { 58, 0xFFFF, 0x009E, 0x00BF, 0x0092 },
+ { 58, 0x00BF, 0x00A0, 0x009A, 0xFFFF },
+ { 59, 0x0099, 0xFFFF, 0x009B, 0x0094 },
+ { 58, 0x009A, 0xFFFF, 0x009C, 0xFFFF },
+ { 59, 0x009B, 0x00A2, 0xFFFF, 0xFFFF },
+ { 59, 0xFFFF, 0x00A3, 0xFFFF, 0x0097 },
+ { 59, 0xFFFF, 0xFFFF, 0x009F, 0x0098 },
+ { 58, 0x009E, 0x00A4, 0x00A0, 0x00BF },
+ { 59, 0x009F, 0x00A5, 0xFFFF, 0x0099 },
+ { 58, 0xFFFF, 0x00A6, 0x00C0, 0xFFFF },
+ { 58, 0x00C0, 0x00A8, 0xFFFF, 0x009C },
+ { 58, 0x00C1, 0xFFFF, 0xFFFF, 0x009D },
+ { 59, 0xFFFF, 0x00AA, 0x00A5, 0x009F },
+ { 58, 0x00A4, 0x00AB, 0x00A6, 0x00A0 },
+ { 59, 0x00A5, 0x00AC, 0x00A7, 0x00A1 },
+ { 58, 0x00A6, 0xFFFF, 0xFFFF, 0x00C0 },
+ { 59, 0xFFFF, 0x00AD, 0x00A9, 0x00A2 },
+ { 58, 0x00A8, 0x00AE, 0xFFFF, 0x00C1 },
+ { 58, 0xFFFF, 0xFFFF, 0x00AB, 0x00A4 },
+ { 59, 0x00AA, 0x00AF, 0x00AC, 0x00A5 },
+ { 58, 0x00AB, 0x0071, 0x00C2, 0x00A6 },
+ { 58, 0xFFFF, 0x00B0, 0x00AE, 0x00A8 },
+ { 59, 0x00AD, 0xFFFF, 0xFFFF, 0x00A9 },
+ { 58, 0xFFFF, 0x00C3, 0x0071, 0x00AB },
+ { 59, 0xFFFF, 0xFFFF, 0x00B1, 0x00AD },
+ { 58, 0x00B0, 0x0075, 0xFFFF, 0xFFFF },
+ { 59, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF },
+ { 59, 0x00C3, 0xFFFF, 0x00B4, 0xFFFF },
+ { 59, 0x00B3, 0x00BA, 0xFFFF, 0xFFFF },
+ { 58, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF },
+ { 59, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF },
+ { 58, 0x0071, 0xFFFF, 0xFFFF, 0x00C2 },
+ { 58, 0xFFFF, 0xFFFF, 0x00B9, 0xFFFF },
+ { 59, 0x00B8, 0xFFFF, 0xFFFF, 0x00C3 },
+ { 58, 0xFFFF, 0xFFFF, 0xFFFF, 0x00B4 },
+ { 59, 0x0079, 0xFFFF, 0xFFFF, 0x0073 },
+ { 59, 0x007C, 0x0082, 0x007D, 0xFFFF },
+ { 59, 0x0086, 0x008D, 0x0087, 0x0080 },
+ { 59, 0x0094, 0xFFFF, 0x0095, 0x008F },
+ { 59, 0x0098, 0x009F, 0x0099, 0x006F },
+ { 59, 0x00A1, 0x00A7, 0x00A2, 0xFFFF },
+ { 59, 0xFFFF, 0x00A9, 0x00A3, 0x006E },
+ { 59, 0x00AC, 0x00B7, 0xFFFF, 0xFFFF },
+ { 58, 0xFFFF, 0x00B9, 0x00B3, 0x00AF },
+ { 59, 0xFFFF, 0xFFFF, 0x006D, 0xFFFF },
+ { 58, 0xFFFF, 0x0073, 0xFFFF, 0x006D },
+ { 59, 0xFFFF, 0xFFFF, 0x0075, 0xFFFF },
+ { 94, 0xFFFF, 0x00C8, 0xFFFF, 0xFFFF },
+ { 43, 0x00C9, 0x00CB, 0x00CA, 0x00C7 },
+ { 51, 0xFFFF, 0xFFFF, 0x00C8, 0xFFFF },
+ { 37, 0x00C8, 0xFFFF, 0xFFFF, 0xFFFF },
+ { 79, 0xFFFF, 0xFFFF, 0xFFFF, 0x00C8 },
+ { 80, 0xFFFF, 0xFFFF, 0x00CB, 0x00CD },
+ { 97, 0x00E3, 0x00D4, 0x00CC, 0x00D3 },
+ { 103, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF },
+ { 100, 0xFFFF, 0x00CE, 0x00D5, 0xFFFF },
+ { 98, 0xFFFF, 0xFFFF, 0xFFFF, 0x00D7 },
+ { 101, 0xFFFF, 0x00D2, 0x00CE, 0xFFFF },
+ { 99, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF },
+ { 93, 0x00D5, 0x00CD, 0xFFFF, 0xFFFF },
+ { 93, 0x00D6, 0xFFFF, 0xFFFF, 0x00CD },
+ { 93, 0x00CF, 0x00CE, 0x00D3, 0xFFFF },
+ { 93, 0x00D7, 0xFFFF, 0x00D4, 0x00CE },
+ { 93, 0xFFFF, 0x00D0, 0x00D6, 0x00CE },
+ { 93, 0x00DA, 0x00E3, 0xFFFF, 0xFFFF },
+ { 93, 0x00DB, 0xFFFF, 0xFFFF, 0x00E3 },
+ { 93, 0xFFFF, 0x00E4, 0x00D8, 0x00E2 },
+ { 93, 0xFFFF, 0x00E1, 0x00D9, 0x00E4 },
+ { 93, 0xFFFF, 0x00E4, 0xFFFF, 0x00DF },
+ { 93, 0xFFFF, 0x00E0, 0xFFFF, 0x00E4 },
+ { 93, 0xFFFF, 0xFFFF, 0x00E4, 0xFFFF },
+ { 91, 0xFFFF, 0x00DC, 0xFFFF, 0xFFFF },
+ { 90, 0xFFFF, 0xFFFF, 0xFFFF, 0x00DD },
+ { 92, 0xFFFF, 0xFFFF, 0xFFFF, 0x00DB },
+ { 95, 0xFFFF, 0x00DA, 0xFFFF, 0xFFFF },
+ { 96, 0xFFFF, 0x00D9, 0x00CD, 0x00D8 },
+ { 89, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF },
+ { 102, 0xFFFF, 0x00E6, 0xFFFF, 0xFFFF },
+ { 102, 0xFFFF, 0x00EA, 0x00E8, 0x00E5 },
+ { 102, 0xFFFF, 0x00E8, 0x00EB, 0xFFFF },
+ { 102, 0x00E6, 0xFFFF, 0xFFFF, 0x00E7 },
+ { 102, 0xFFFF, 0xFFFF, 0x00ED, 0xFFFF },
+ { 102, 0xFFFF, 0xFFFF, 0xFFFF, 0x00E6 },
+ { 102, 0x00E7, 0x00EC, 0x00EF, 0xFFFF },
+ { 102, 0xFFFF, 0x00ED, 0x00F0, 0x00EB },
+ { 102, 0x00E9, 0x00EE, 0x00F1, 0x00EC },
+ { 102, 0xFFFF, 0xFFFF, 0x00F2, 0x00ED },
+ { 102, 0x00EB, 0x00F0, 0xFFFF, 0xFFFF },
+ { 102, 0x00EC, 0x00F1, 0x00F3, 0x00EF },
+ { 102, 0x00ED, 0xFFFF, 0x00F4, 0x00F0 },
+ { 102, 0x00EE, 0xFFFF, 0xFFFF, 0xFFFF },
+ { 102, 0x00F0, 0x00F4, 0xFFFF, 0xFFFF },
+ { 102, 0x00F1, 0x00F5, 0xFFFF, 0x00F3 },
+ { 102, 0xFFFF, 0xFFFF, 0x00CF, 0x00F4 }
+};
+
+static const RoomProvider k1RoomListFMTownsProvider = { ARRAYSIZE(k1RoomListFMTowns), k1RoomListFMTowns };
+
+static const char *const k1RoomFilenamesFMTowns[107] = {
+ "CLIFFB",
+ "XEDGEB",
+ "CAVEB",
+ "NCLIFF",
+ "NCLIFFB",
+ "CAVE",
+ "NWCLIFF",
+ "OAKS",
+ "PLATEAU",
+ "POTHUT",
+ "POTION",
+ "NWCLIFB",
+ "SONG",
+ "SORROW",
+ "SPELHUT",
+ "SPELL",
+ "SPRING",
+ "SQUARE",
+ "STUMP",
+ "TEMPLE",
+ "WELL",
+ "WILLOW",
+ "WISE",
+ "XEDGE",
+ "RUBY",
+ "ZROCK",
+ "ZROCKB",
+ "FORESTD",
+ "FOUNTN",
+ "GATECV",
+ "GEMCUT",
+ "CLIFF",
+ "DEAD",
+ "EDGE",
+ "EDGEB",
+ "FALLS",
+ "FORESTC",
+ "FORESTB",
+ "GLADE",
+ "GEMHUT",
+ "ALGAE",
+ "MIX",
+ "BRIDGE",
+ "GRAVE",
+ "HEALER",
+ "HEALHUT",
+ "ALTAR",
+ "BURN",
+ "SICKWIL",
+ "LAGOON",
+ "MAPLE",
+ "FORESTA",
+ "ARCH",
+ "CHASM",
+ "EMCAV",
+ "ENTER",
+ "FLOWERS",
+ "GEMSLOT",
+ "GEN_CAV",
+ "GENCAVB",
+ "GOLDEN",
+ "GOLDENB",
+ "ICE",
+ "MARKET",
+ "MOONCAV",
+ "MSHCAV",
+ "POOL",
+ "SEASONS",
+ "SHRINE",
+ "TREECAV",
+ "EXTGEM",
+ "GEM",
+ "EXTHEAL",
+ "BASE",
+ "TRUNK",
+ "BROKEN",
+ "LAVA",
+ "EXTSPEL",
+ "EXTPOT",
+ "CASTLE",
+ "CGATE",
+ "LEPHOLE",
+ "DRAGON",
+ "XEDGEC",
+ "FNORTH",
+ "FSOUTH",
+ "FGOWEST",
+ "PLTCAVE",
+ "BONKBG",
+ "BALCONY",
+ "DARMS",
+ "BRINS",
+ "ALCHEMY",
+ "GENHALL",
+ "LANDING",
+ "BELROOM",
+ "UPSTAIR",
+ "DNSTAIR",
+ "KITCHEN",
+ "KYRAGEM",
+ "LIBRARY",
+ "FOYER",
+ "CATACOM",
+ "GRTHALL",
+ "FESTSTH",
+ "FWSTSTH",
+ "FSOUTHB"
+};
+
+static const StringListProvider k1RoomFilenamesFMTownsProvider = { ARRAYSIZE(k1RoomFilenamesFMTowns), k1RoomFilenamesFMTowns };
+
+static const char *const k1CharacterImageFilenamesFMTowns[20] = {
+ "BRANDON.CPS",
+ "DAPHNE.CPS",
+ "MERITH.CPS",
+ "HERMAN.CPS",
+ "SMALL.CPS",
+ "MALCOM.CPS",
+ "DRINK.CPS",
+ "SHRINK.CPS",
+ "HEALBR1.CPS",
+ "HEALBR2.CPS",
+ "SNOW1A.CPS",
+ "SNOW2A.CPS",
+ "BRANWILL.CPS",
+ "FLUTE1.CPS",
+ "FLUTE2.CPS",
+ "POISON1.CPS",
+ "POISON2.CPS",
+ "TELEKIN.CPS",
+ "BRANSTON.CPS",
+ "POISON.CPS"
+};
+
+static const StringListProvider k1CharacterImageFilenamesFMTownsProvider = { ARRAYSIZE(k1CharacterImageFilenamesFMTowns), k1CharacterImageFilenamesFMTowns };
+
+static const Shape k1DefaultShapesFMTowns[166] = {
+ { 0, 0, 0, 3, 48, -12, -48 },
+ { 0, 3, 0, 3, 48, -12, -48 },
+ { 0, 6, 0, 3, 48, -12, -48 },
+ { 0, 9, 0, 3, 48, -12, -48 },
+ { 0, 12, 0, 3, 48, -12, -48 },
+ { 0, 15, 0, 3, 48, -12, -48 },
+ { 0, 18, 0, 3, 48, -12, -48 },
+ { 0, 21, 0, 3, 48, -12, -48 },
+ { 0, 24, 0, 3, 48, -12, -48 },
+ { 0, 27, 0, 3, 48, -12, -48 },
+ { 0, 0, 51, 2, 11, -2, -8 },
+ { 0, 2, 51, 2, 11, -2, -8 },
+ { 0, 4, 51, 2, 11, -2, -8 },
+ { 0, 6, 51, 2, 11, -2, -8 },
+ { 0, 8, 51, 2, 11, -2, -8 },
+ { 0, 10, 51, 2, 11, -2, -8 },
+ { 0, 12, 51, 2, 11, -2, -8 },
+ { 0, 14, 51, 2, 11, -2, -8 },
+ { 0, 16, 51, 2, 11, -2, -8 },
+ { 0, 18, 51, 2, 11, -2, -8 },
+ { 0, 20, 51, 2, 11, -2, -8 },
+ { 0, 22, 51, 2, 11, -2, -8 },
+ { 0, 0, 80, 3, 48, -12, -48 },
+ { 0, 3, 80, 3, 48, -12, -48 },
+ { 0, 6, 80, 3, 48, -12, -48 },
+ { 0, 9, 80, 3, 48, -12, -48 },
+ { 0, 12, 80, 3, 48, -12, -48 },
+ { 0, 15, 80, 3, 48, -12, -48 },
+ { 0, 0, 129, 3, 48, -12, -48 },
+ { 0, 3, 129, 3, 48, -12, -48 },
+ { 0, 6, 129, 3, 48, -12, -48 },
+ { 0, 9, 129, 3, 48, -12, -48 },
+ { 0, 12, 129, 3, 48, -12, -48 },
+ { 0, 15, 129, 3, 48, -12, -48 },
+ { 2, 0, 0, 3, 48, -12, -48 },
+ { 2, 3, 0, 3, 48, -12, -48 },
+ { 2, 6, 0, 3, 48, -12, -48 },
+ { 2, 9, 0, 3, 48, -12, -48 },
+ { 2, 12, 0, 3, 48, -12, -48 },
+ { 2, 15, 0, 3, 48, -12, -48 },
+ { 2, 18, 0, 3, 48, -12, -48 },
+ { 2, 21, 0, 3, 48, -12, -48 },
+ { 2, 24, 0, 3, 48, -12, -48 },
+ { 2, 27, 0, 3, 48, -12, -48 },
+ { 2, 30, 10, 3, 38, -16, -38 },
+ { 2, 27, 48, 4, 40, -8, -40 },
+ { 2, 0, 51, 2, 11, -4, 0 },
+ { 2, 2, 51, 2, 11, -4, 0 },
+ { 2, 4, 51, 2, 11, -4, 0 },
+ { 2, 6, 51, 2, 11, -4, 0 },
+ { 2, 8, 51, 2, 11, -4, 0 },
+ { 2, 10, 51, 2, 11, -4, 0 },
+ { 2, 12, 51, 2, 11, -4, 0 },
+ { 2, 14, 51, 2, 11, -4, 0 },
+ { 2, 16, 51, 2, 11, -4, 0 },
+ { 2, 18, 51, 2, 11, -4, 0 },
+ { 2, 20, 51, 2, 11, -4, 0 },
+ { 2, 22, 51, 2, 11, -4, 0 },
+ { 255, 0, 80, 3, 48, -12, -48 },
+ { 255, 3, 80, 3, 48, -12, -48 },
+ { 255, 6, 80, 3, 48, -12, -48 },
+ { 255, 9, 80, 3, 48, -12, -48 },
+ { 255, 12, 80, 3, 48, -12, -48 },
+ { 255, 15, 80, 3, 48, -12, -48 },
+ { 255, 0, 129, 3, 48, -12, -48 },
+ { 255, 3, 129, 3, 48, -12, -48 },
+ { 255, 6, 129, 3, 48, -12, -48 },
+ { 255, 9, 129, 3, 48, -12, -48 },
+ { 255, 12, 129, 3, 48, -12, -48 },
+ { 255, 15, 129, 3, 48, -12, -48 },
+ { 3, 0, 0, 3, 48, -12, -46 },
+ { 3, 3, 0, 3, 48, -12, -48 },
+ { 3, 6, 0, 3, 48, -12, -48 },
+ { 3, 9, 0, 3, 48, -12, -48 },
+ { 3, 12, 0, 3, 48, -12, -48 },
+ { 3, 15, 0, 3, 48, -12, -48 },
+ { 3, 18, 0, 3, 48, -12, -48 },
+ { 3, 21, 0, 3, 48, -12, -48 },
+ { 3, 24, 0, 3, 48, -12, -48 },
+ { 3, 27, 0, 3, 48, -12, -46 },
+ { 3, 30, 0, 3, 48, -14, -47 },
+ { 3, 39, 199, 1, 1, -12, -48 },
+ { 3, 0, 51, 2, 11, 0, -7 },
+ { 3, 2, 51, 2, 11, 0, -7 },
+ { 3, 4, 51, 2, 11, 0, -7 },
+ { 3, 6, 51, 2, 11, 0, -7 },
+ { 3, 8, 51, 2, 11, 0, -7 },
+ { 3, 10, 51, 2, 11, 0, -7 },
+ { 3, 12, 51, 2, 11, 0, -7 },
+ { 3, 14, 51, 2, 11, 0, -7 },
+ { 3, 16, 51, 2, 11, 0, -7 },
+ { 3, 18, 51, 2, 11, 0, -7 },
+ { 3, 20, 51, 2, 11, 0, -7 },
+ { 3, 22, 51, 2, 11, 0, -7 },
+ { 3, 0, 80, 3, 48, -12, -48 },
+ { 3, 3, 80, 3, 48, -12, -48 },
+ { 3, 6, 80, 3, 48, -12, -48 },
+ { 3, 9, 80, 3, 48, -12, -48 },
+ { 3, 12, 80, 3, 48, -12, -48 },
+ { 3, 15, 80, 3, 48, -12, -48 },
+ { 3, 0, 129, 3, 48, -12, -48 },
+ { 3, 3, 129, 3, 48, -12, -48 },
+ { 3, 6, 129, 3, 48, -12, -48 },
+ { 3, 9, 129, 3, 48, -12, -48 },
+ { 3, 12, 129, 3, 48, -12, -48 },
+ { 3, 15, 129, 3, 48, -12, -48 },
+ { 12, 0, 96, 5, 29, -20, -42 },
+ { 12, 5, 96, 5, 29, -20, -42 },
+ { 12, 10, 96, 5, 29, -20, -42 },
+ { 12, 15, 96, 5, 29, -20, -42 },
+ { 12, 20, 96, 5, 29, -20, -42 },
+ { 12, 25, 96, 5, 29, -20, -42 },
+ { 12, 30, 96, 5, 29, -20, -42 },
+ { 12, 35, 96, 5, 29, -20, -42 },
+ { 12, 0, 125, 5, 29, -20, -42 },
+ { 12, 5, 125, 5, 29, -20, -42 },
+ { 255, 0, 0, 0, 0, 0, 0 },
+ { 255, 0, 0, 0, 0, 0, 0 },
+ { 255, 0, 0, 0, 0, 0, 0 },
+ { 255, 0, 0, 0, 0, 0, 0 },
+ { 255, 0, 0, 0, 0, 0, 0 },
+ { 255, 0, 0, 0, 0, 0, 0 },
+ { 255, 0, 0, 0, 0, 0, 0 },
+ { 255, 0, 0, 0, 0, 0, 0 },
+ { 255, 0, 0, 0, 0, 0, 0 },
+ { 255, 0, 0, 0, 0, 0, 0 },
+ { 255, 0, 0, 0, 0, 0, 0 },
+ { 255, 0, 0, 0, 0, 0, 0 },
+ { 255, 0, 0, 0, 0, 0, 0 },
+ { 255, 0, 0, 0, 0, 0, 0 },
+ { 255, 0, 0, 0, 0, 0, 0 },
+ { 255, 0, 0, 0, 0, 0, 0 },
+ { 255, 0, 0, 0, 0, 0, 0 },
+ { 255, 0, 0, 0, 0, 0, 0 },
+ { 255, 0, 0, 0, 0, 0, 0 },
+ { 255, 0, 0, 0, 0, 0, 0 },
+ { 255, 0, 0, 0, 0, 0, 0 },
+ { 255, 0, 0, 0, 0, 0, 0 },
+ { 255, 0, 0, 0, 0, 0, 0 },
+ { 255, 0, 0, 0, 0, 0, 0 },
+ { 255, 0, 0, 0, 0, 0, 0 },
+ { 255, 0, 0, 0, 0, 0, 0 },
+ { 255, 0, 0, 0, 0, 0, 0 },
+ { 255, 0, 0, 0, 0, 0, 0 },
+ { 255, 0, 0, 0, 0, 0, 0 },
+ { 255, 0, 0, 0, 0, 0, 0 },
+ { 255, 0, 0, 0, 0, 0, 0 },
+ { 255, 0, 0, 0, 0, 0, 0 },
+ { 255, 0, 0, 0, 0, 0, 0 },
+ { 255, 0, 0, 0, 0, 0, 0 },
+ { 255, 0, 0, 0, 0, 0, 0 },
+ { 255, 0, 0, 0, 0, 0, 0 },
+ { 255, 0, 0, 0, 0, 0, 0 },
+ { 255, 0, 0, 0, 0, 0, 0 },
+ { 255, 0, 0, 0, 0, 0, 0 },
+ { 255, 0, 0, 0, 0, 0, 0 },
+ { 255, 0, 0, 0, 0, 0, 0 },
+ { 255, 0, 0, 0, 0, 0, 0 },
+ { 255, 0, 0, 0, 0, 0, 0 },
+ { 255, 0, 0, 0, 0, 0, 0 },
+ { 255, 0, 0, 0, 0, 0, 0 },
+ { 255, 0, 0, 0, 0, 0, 0 },
+ { 255, 0, 0, 0, 0, 0, 0 },
+ { 255, 0, 0, 0, 0, 0, 0 },
+ { 255, 0, 0, 0, 0, 0, 0 },
+ { 255, 0, 0, 0, 0, 0, 0 }
+};
+
+static const ShapeProvider k1DefaultShapesFMTownsProvider = { ARRAYSIZE(k1DefaultShapesFMTowns), k1DefaultShapesFMTowns };
+
+static const byte k1AmuleteAnimSeqFMTowns[42] = {
+ 0x00, 0x01, 0x02, 0x01, 0x03, 0x04, 0x03, 0x01,
+ 0x02, 0x03, 0x04, 0x05, 0x06, 0x05, 0x04, 0x05,
+ 0x07, 0x08, 0x07, 0x08, 0x09, 0x08, 0x09, 0x07,
+ 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D,
+ 0x0E, 0x0F, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15,
+ 0x16, 0xFF
+};
+
+static const ByteProvider k1AmuleteAnimSeqFMTownsProvider = { ARRAYSIZE(k1AmuleteAnimSeqFMTowns), k1AmuleteAnimSeqFMTowns };
+
+static const byte k1SpecialPalette1FMTowns[21] = {
+ 0x36, 0x25, 0x1C, 0x31, 0x21, 0x19, 0x2C, 0x1D,
+ 0x16, 0x27, 0x19, 0x13, 0x22, 0x16, 0x11, 0x1D,
+ 0x12, 0x0D, 0x18, 0x0F, 0x0B
+};
+
+static const ByteProvider k1SpecialPalette1FMTownsProvider = { ARRAYSIZE(k1SpecialPalette1FMTowns), k1SpecialPalette1FMTowns };
+
+static const byte k1SpecialPalette2FMTowns[51] = {
+ 0x03, 0x03, 0x00, 0x37, 0x29, 0x1D, 0x33, 0x25,
+ 0x1A, 0x2D, 0x21, 0x17, 0x2A, 0x1D, 0x13, 0x26,
+ 0x19, 0x11, 0x22, 0x16, 0x0E, 0x1E, 0x12, 0x0C,
+ 0x1A, 0x0F, 0x0A, 0x16, 0x0C, 0x08, 0x12, 0x0A,
+ 0x05, 0x0E, 0x08, 0x05, 0x2D, 0x1E, 0x13, 0x27,
+ 0x19, 0x0F, 0x22, 0x14, 0x0C, 0x1C, 0x11, 0x0A,
+ 0x17, 0x0C, 0x08
+};
+
+static const ByteProvider k1SpecialPalette2FMTownsProvider = { ARRAYSIZE(k1SpecialPalette2FMTowns), k1SpecialPalette2FMTowns };
+
+static const byte k1SpecialPalette3FMTowns[51] = {
+ 0x03, 0x03, 0x00, 0x25, 0x30, 0x1B, 0x24, 0x2C,
+ 0x18, 0x23, 0x29, 0x15, 0x22, 0x25, 0x12, 0x21,
+ 0x22, 0x11, 0x1F, 0x1D, 0x0D, 0x1B, 0x18, 0x0B,
+ 0x18, 0x13, 0x0A, 0x14, 0x0E, 0x08, 0x11, 0x0A,
+ 0x05, 0x0E, 0x08, 0x05, 0x21, 0x22, 0x11, 0x1D,
+ 0x1C, 0x0C, 0x19, 0x15, 0x0A, 0x15, 0x0F, 0x08,
+ 0x11, 0x0A, 0x05
+};
+
+static const ByteProvider k1SpecialPalette3FMTownsProvider = { ARRAYSIZE(k1SpecialPalette3FMTowns), k1SpecialPalette3FMTowns };
+
+static const byte k1SpecialPalette4FMTowns[51] = {
+ 0x06, 0x03, 0x01, 0x33, 0x25, 0x0A, 0x2F, 0x21,
+ 0x0A, 0x2B, 0x1D, 0x08, 0x28, 0x1A, 0x08, 0x24,
+ 0x17, 0x06, 0x21, 0x22, 0x06, 0x1D, 0x11, 0x05,
+ 0x19, 0x0E, 0x05, 0x16, 0x0B, 0x03, 0x12, 0x0A,
+ 0x03, 0x0F, 0x08, 0x03, 0x28, 0x1A, 0x08, 0x22,
+ 0x15, 0x05, 0x1D, 0x11, 0x05, 0x17, 0x0C, 0x03,
+ 0x12, 0x0A, 0x03
+};
+
+static const ByteProvider k1SpecialPalette4FMTownsProvider = { ARRAYSIZE(k1SpecialPalette4FMTowns), k1SpecialPalette4FMTowns };
+
+static const byte k1SpecialPalette5FMTowns[51] = {
+ 0x03, 0x03, 0x00, 0x2A, 0x1D, 0x13, 0x27, 0x1A,
+ 0x11, 0x24, 0x18, 0x0F, 0x21, 0x15, 0x0D, 0x1E,
+ 0x13, 0x0C, 0x1C, 0x11, 0x0A, 0x19, 0x0F, 0x0A,
+ 0x16, 0x0C, 0x08, 0x13, 0x0A, 0x06, 0x11, 0x08,
+ 0x05, 0x0E, 0x08, 0x05, 0x1C, 0x11, 0x0A, 0x19,
+ 0x0E, 0x08, 0x16, 0x0C, 0x08, 0x13, 0x0A, 0x06,
+ 0x11, 0x08, 0x05
+};
+
+static const ByteProvider k1SpecialPalette5FMTownsProvider = { ARRAYSIZE(k1SpecialPalette5FMTowns), k1SpecialPalette5FMTowns };
+
+static const byte k1SpecialPalette6FMTowns[51] = {
+ 0x00, 0x08, 0x01, 0x00, 0x1E, 0x00, 0x00, 0x1B,
+ 0x00, 0x00, 0x19, 0x00, 0x00, 0x17, 0x00, 0x00,
+ 0x14, 0x00, 0x00, 0x12, 0x00, 0x00, 0x11, 0x00,
+ 0x00, 0x0E, 0x00, 0x00, 0x0B, 0x00, 0x00, 0x0A,
+ 0x00, 0x00, 0x08, 0x00, 0x13, 0x21, 0x0F, 0x11,
+ 0x1F, 0x0D, 0x0E, 0x1D, 0x0C, 0x0C, 0x1B, 0x0B,
+ 0x0A, 0x19, 0x0A
+};
+
+static const ByteProvider k1SpecialPalette6FMTownsProvider = { ARRAYSIZE(k1SpecialPalette6FMTowns), k1SpecialPalette6FMTowns };
+
+static const byte k1SpecialPalette7FMTowns[54] = {
+ 0x05, 0x2B, 0x00, 0x00, 0x22, 0x00, 0x00, 0x1E,
+ 0x00, 0x00, 0x16, 0x01, 0x00, 0x12, 0x03, 0x00,
+ 0x0F, 0x01, 0x00, 0x0B, 0x03, 0x0A, 0x19, 0x0A,
+ 0x2D, 0x2D, 0x32, 0x29, 0x29, 0x2D, 0x25, 0x25,
+ 0x2B, 0x1F, 0x1F, 0x26, 0x1B, 0x1B, 0x22, 0x14,
+ 0x16, 0x1D, 0x11, 0x11, 0x18, 0x0D, 0x0D, 0x14,
+ 0x0A, 0x0A, 0x0F, 0x06, 0x06, 0x0B
+};
+
+static const ByteProvider k1SpecialPalette7FMTownsProvider = { ARRAYSIZE(k1SpecialPalette7FMTowns), k1SpecialPalette7FMTowns };
+
+static const byte k1SpecialPalette8FMTowns[54] = {
+ 0x12, 0x37, 0x3F, 0x14, 0x31, 0x3F, 0x14, 0x29,
+ 0x3F, 0x14, 0x22, 0x3F, 0x14, 0x1B, 0x3F, 0x14,
+ 0x14, 0x3F, 0x0E, 0x0F, 0x37, 0x14, 0x29, 0x3F,
+ 0x2F, 0x3F, 0x3D, 0x26, 0x3F, 0x3F, 0x15, 0x3F,
+ 0x3F, 0x14, 0x3B, 0x3F, 0x12, 0x37, 0x3F, 0x14,
+ 0x31, 0x3F, 0x14, 0x29, 0x3F, 0x14, 0x22, 0x3F,
+ 0x14, 0x1B, 0x3F, 0x14, 0x14, 0x3F
+};
+
+static const ByteProvider k1SpecialPalette8FMTownsProvider = { ARRAYSIZE(k1SpecialPalette8FMTowns), k1SpecialPalette8FMTowns };
+
+static const byte k1SpecialPalette9FMTowns[45] = {
+ 0x36, 0x00, 0x00, 0x32, 0x00, 0x00, 0x2F, 0x00,
+ 0x00, 0x2C, 0x00, 0x00, 0x29, 0x00, 0x00, 0x26,
+ 0x00, 0x00, 0x23, 0x00, 0x00, 0x20, 0x00, 0x00,
+ 0x1C, 0x00, 0x00, 0x19, 0x00, 0x00, 0x16, 0x00,
+ 0x00, 0x13, 0x00, 0x00, 0x11, 0x00, 0x00, 0x0D,
+ 0x00, 0x00, 0x0A, 0x00, 0x00
+};
+
+static const ByteProvider k1SpecialPalette9FMTownsProvider = { ARRAYSIZE(k1SpecialPalette9FMTowns), k1SpecialPalette9FMTowns };
+
+static const byte k1SpecialPalette10FMTowns[45] = {
+ 0x29, 0x00, 0x00, 0x26, 0x00, 0x00, 0x24, 0x00,
+ 0x00, 0x22, 0x00, 0x00, 0x20, 0x00, 0x00, 0x1E,
+ 0x00, 0x00, 0x1B, 0x00, 0x00, 0x19, 0x00, 0x00,
+ 0x17, 0x00, 0x00, 0x15, 0x00, 0x00, 0x12, 0x00,
+ 0x00, 0x11, 0x00, 0x00, 0x0E, 0x00, 0x00, 0x0C,
+ 0x00, 0x00, 0x0A, 0x00, 0x00
+};
+
+static const ByteProvider k1SpecialPalette10FMTownsProvider = { ARRAYSIZE(k1SpecialPalette10FMTowns), k1SpecialPalette10FMTowns };
+
+static const byte k1SpecialPalette11FMTowns[45] = {
+ 0x20, 0x00, 0x00, 0x1E, 0x00, 0x00, 0x1C, 0x00,
+ 0x00, 0x1B, 0x00, 0x00, 0x19, 0x00, 0x00, 0x18,
+ 0x00, 0x00, 0x16, 0x00, 0x00, 0x15, 0x00, 0x00,
+ 0x13, 0x00, 0x00, 0x11, 0x00, 0x00, 0x11, 0x00,
+ 0x00, 0x0E, 0x00, 0x00, 0x0D, 0x00, 0x00, 0x0B,
+ 0x00, 0x00, 0x0A, 0x00, 0x00
+};
+
+static const ByteProvider k1SpecialPalette11FMTownsProvider = { ARRAYSIZE(k1SpecialPalette11FMTowns), k1SpecialPalette11FMTowns };
+
+static const byte k1SpecialPalette12FMTowns[45] = {
+ 0x19, 0x00, 0x00, 0x18, 0x00, 0x00, 0x16, 0x00,
+ 0x00, 0x15, 0x00, 0x00, 0x14, 0x00, 0x00, 0x13,
+ 0x00, 0x00, 0x12, 0x00, 0x00, 0x11, 0x00, 0x00,
+ 0x11, 0x00, 0x00, 0x0F, 0x00, 0x00, 0x0E, 0x00,
+ 0x00, 0x0D, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x0B,
+ 0x00, 0x00, 0x0A, 0x00, 0x00
+};
+
+static const ByteProvider k1SpecialPalette12FMTownsProvider = { ARRAYSIZE(k1SpecialPalette12FMTowns), k1SpecialPalette12FMTowns };
+
+static const byte k1SpecialPalette13FMTowns[45] = {
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00
+};
+
+static const ByteProvider k1SpecialPalette13FMTownsProvider = { ARRAYSIZE(k1SpecialPalette13FMTowns), k1SpecialPalette13FMTowns };
+
+static const byte k1SpecialPalette14FMTowns[60] = {
+ 0x0E, 0x28, 0x3F, 0x0C, 0x24, 0x3B, 0x0A, 0x20,
+ 0x38, 0x0A, 0x1C, 0x34, 0x08, 0x19, 0x31, 0x08,
+ 0x15, 0x2D, 0x05, 0x13, 0x2A, 0x05, 0x11, 0x27,
+ 0x03, 0x0D, 0x24, 0x03, 0x0A, 0x20, 0x03, 0x08,
+ 0x1D, 0x01, 0x06, 0x19, 0x01, 0x05, 0x16, 0x00,
+ 0x03, 0x13, 0x00, 0x01, 0x0F, 0x00, 0x01, 0x0C,
+ 0x00, 0x00, 0x08, 0x00, 0x00, 0x05, 0x00, 0x00,
+ 0x03, 0x00, 0x00, 0x00
+};
+
+static const ByteProvider k1SpecialPalette14FMTownsProvider = { ARRAYSIZE(k1SpecialPalette14FMTowns), k1SpecialPalette14FMTowns };
+
+static const byte k1SpecialPalette15FMTowns[45] = {
+ 0x24, 0x00, 0x39, 0x21, 0x00, 0x36, 0x1F, 0x00,
+ 0x32, 0x1C, 0x00, 0x2D, 0x1A, 0x00, 0x2A, 0x17,
+ 0x00, 0x26, 0x15, 0x00, 0x22, 0x12, 0x00, 0x1E,
+ 0x11, 0x00, 0x1A, 0x0E, 0x00, 0x16, 0x0B, 0x00,
+ 0x12, 0x0A, 0x00, 0x0F, 0x06, 0x00, 0x0B, 0x05,
+ 0x00, 0x08, 0x01, 0x00, 0x03
+};
+
+static const ByteProvider k1SpecialPalette15FMTownsProvider = { ARRAYSIZE(k1SpecialPalette15FMTowns), k1SpecialPalette15FMTowns };
+
+static const byte k1SpecialPalette16FMTowns[33] = {
+ 0x00, 0x3F, 0x3F, 0x00, 0x38, 0x38, 0x00, 0x34,
+ 0x34, 0x00, 0x30, 0x30, 0x00, 0x2D, 0x2D, 0x00,
+ 0x29, 0x29, 0x00, 0x25, 0x25, 0x00, 0x1F, 0x1F,
+ 0x00, 0x1B, 0x1B, 0x00, 0x16, 0x16, 0x00, 0x11,
+ 0x11
+};
+
+static const ByteProvider k1SpecialPalette16FMTownsProvider = { ARRAYSIZE(k1SpecialPalette16FMTowns), k1SpecialPalette16FMTowns };
+
+static const byte k1SpecialPalette17FMTowns[33] = {
+ 0x3B, 0x3B, 0x3B, 0x36, 0x36, 0x36, 0x32, 0x32,
+ 0x32, 0x2D, 0x2D, 0x2D, 0x2A, 0x2A, 0x2A, 0x26,
+ 0x26, 0x26, 0x21, 0x21, 0x21, 0x1D, 0x1D, 0x1D,
+ 0x19, 0x19, 0x19, 0x15, 0x15, 0x15, 0x11, 0x11,
+ 0x11
+};
+
+static const ByteProvider k1SpecialPalette17FMTownsProvider = { ARRAYSIZE(k1SpecialPalette17FMTowns), k1SpecialPalette17FMTowns };
+
+static const byte k1SpecialPalette18FMTowns[21] = {
+ 0x0F, 0x23, 0x1C, 0x2A, 0x36, 0x3F, 0x24, 0x2F,
+ 0x38, 0x1F, 0x2A, 0x32, 0x1A, 0x24, 0x2B, 0x15,
+ 0x1E, 0x25, 0x11, 0x19, 0x1F
+};
+
+static const ByteProvider k1SpecialPalette18FMTownsProvider = { ARRAYSIZE(k1SpecialPalette18FMTowns), k1SpecialPalette18FMTowns };
+
+static const byte k1SpecialPalette19FMTowns[21] = {
+ 0x00, 0x00, 0x1C, 0x00, 0x00, 0x3F, 0x00, 0x00,
+ 0x38, 0x00, 0x00, 0x32, 0x00, 0x00, 0x2B, 0x00,
+ 0x00, 0x25, 0x00, 0x00, 0x1F
+};
+
+static const ByteProvider k1SpecialPalette19FMTownsProvider = { ARRAYSIZE(k1SpecialPalette19FMTowns), k1SpecialPalette19FMTowns };
+
+static const byte k1SpecialPalette20FMTowns[21] = {
+ 0x26, 0x1B, 0x1B, 0x3F, 0x34, 0x34, 0x3B, 0x2F,
+ 0x2F, 0x39, 0x2B, 0x2B, 0x36, 0x26, 0x27, 0x33,
+ 0x22, 0x23, 0x31, 0x1F, 0x20
+};
+
+static const ByteProvider k1SpecialPalette20FMTownsProvider = { ARRAYSIZE(k1SpecialPalette20FMTowns), k1SpecialPalette20FMTowns };
+
+static const byte k1SpecialPalette21FMTowns[21] = {
+ 0x1C, 0x00, 0x00, 0x3F, 0x00, 0x00, 0x38, 0x00,
+ 0x00, 0x32, 0x00, 0x00, 0x2B, 0x00, 0x00, 0x25,
+ 0x00, 0x00, 0x1F, 0x00, 0x00
+};
+
+static const ByteProvider k1SpecialPalette21FMTownsProvider = { ARRAYSIZE(k1SpecialPalette21FMTowns), k1SpecialPalette21FMTowns };
+
+static const byte k1SpecialPalette22FMTowns[21] = {
+ 0x1F, 0x1F, 0x0C, 0x3F, 0x3F, 0x21, 0x3B, 0x3B,
+ 0x1F, 0x37, 0x37, 0x1D, 0x34, 0x34, 0x1B, 0x30,
+ 0x30, 0x19, 0x2D, 0x2D, 0x17
+};
+
+static const ByteProvider k1SpecialPalette22FMTownsProvider = { ARRAYSIZE(k1SpecialPalette22FMTowns), k1SpecialPalette22FMTowns };
+
+static const byte k1SpecialPalette23FMTowns[21] = {
+ 0x1F, 0x1F, 0x00, 0x3F, 0x3F, 0x00, 0x3B, 0x3B,
+ 0x00, 0x37, 0x37, 0x00, 0x34, 0x34, 0x00, 0x30,
+ 0x30, 0x00, 0x2D, 0x2D, 0x00
+};
+
+static const ByteProvider k1SpecialPalette23FMTownsProvider = { ARRAYSIZE(k1SpecialPalette23FMTowns), k1SpecialPalette23FMTowns };
+
+static const byte k1SpecialPalette24FMTowns[48] = {
+ 0x36, 0x38, 0x2C, 0x31, 0x38, 0x23, 0x2A, 0x33,
+ 0x1E, 0x24, 0x2F, 0x1A, 0x1E, 0x2A, 0x16, 0x18,
+ 0x26, 0x13, 0x13, 0x21, 0x0F, 0x0E, 0x1D, 0x0D,
+ 0x0D, 0x1B, 0x0C, 0x0A, 0x19, 0x0A, 0x0A, 0x18,
+ 0x0A, 0x08, 0x17, 0x08, 0x08, 0x16, 0x08, 0x08,
+ 0x15, 0x06, 0x06, 0x14, 0x06, 0x06, 0x11, 0x06
+};
+
+static const ByteProvider k1SpecialPalette24FMTownsProvider = { ARRAYSIZE(k1SpecialPalette24FMTowns), k1SpecialPalette24FMTowns };
+
+static const byte k1SpecialPalette25FMTowns[48] = {
+ 0x36, 0x38, 0x2C, 0x31, 0x36, 0x23, 0x2A, 0x33,
+ 0x1E, 0x24, 0x2F, 0x1A, 0x1E, 0x2A, 0x16, 0x1E,
+ 0x2A, 0x16, 0x18, 0x26, 0x13, 0x13, 0x21, 0x0F,
+ 0x0E, 0x1D, 0x0D, 0x0D, 0x1B, 0x0C, 0x0D, 0x1B,
+ 0x0C, 0x0A, 0x19, 0x0A, 0x0A, 0x18, 0x0A, 0x0A,
+ 0x18, 0x0A, 0x0A, 0x18, 0x0A, 0x06, 0x14, 0x06
+};
+
+static const ByteProvider k1SpecialPalette25FMTownsProvider = { ARRAYSIZE(k1SpecialPalette25FMTowns), k1SpecialPalette25FMTowns };
+
+static const byte k1SpecialPalette26FMTowns[48] = {
+ 0x31, 0x38, 0x23, 0x31, 0x38, 0x23, 0x2A, 0x33,
+ 0x1E, 0x24, 0x2F, 0x1A, 0x19, 0x2A, 0x16, 0x18,
+ 0x26, 0x13, 0x13, 0x21, 0x0F, 0x13, 0x21, 0x11,
+ 0x13, 0x21, 0x0F, 0x0E, 0x1D, 0x0D, 0x0E, 0x1D,
+ 0x0D, 0x0E, 0x1D, 0x0D, 0x0D, 0x1B, 0x0C, 0x0A,
+ 0x19, 0x0A, 0x0A, 0x19, 0x0A, 0x06, 0x13, 0x06
+};
+
+static const ByteProvider k1SpecialPalette26FMTownsProvider = { ARRAYSIZE(k1SpecialPalette26FMTowns), k1SpecialPalette26FMTowns };
+
+static const byte k1SpecialPalette27FMTowns[48] = {
+ 0x31, 0x38, 0x23, 0x31, 0x38, 0x23, 0x2A, 0x33,
+ 0x1E, 0x24, 0x2F, 0x1A, 0x19, 0x2A, 0x16, 0x18,
+ 0x26, 0x13, 0x13, 0x21, 0x0F, 0x13, 0x21, 0x0F,
+ 0x13, 0x21, 0x0F, 0x0E, 0x1D, 0x0D, 0x0E, 0x1D,
+ 0x0D, 0x0E, 0x1D, 0x0D, 0x0D, 0x1B, 0x0C, 0x0D,
+ 0x19, 0x0C, 0x0D, 0x19, 0x0C, 0x08, 0x16, 0x08
+};
+
+static const ByteProvider k1SpecialPalette27FMTownsProvider = { ARRAYSIZE(k1SpecialPalette27FMTowns), k1SpecialPalette27FMTowns };
+
+static const byte k1SpecialPalette28FMTowns[48] = {
+ 0x36, 0x38, 0x2C, 0x31, 0x38, 0x23, 0x2A, 0x33,
+ 0x1E, 0x24, 0x2F, 0x1A, 0x19, 0x2A, 0x16, 0x1E,
+ 0x2A, 0x16, 0x18, 0x26, 0x13, 0x13, 0x21, 0x0F,
+ 0x13, 0x21, 0x0F, 0x13, 0x21, 0x0F, 0x13, 0x21,
+ 0x0F, 0x0E, 0x1D, 0x0D, 0x0D, 0x1B, 0x0C, 0x0D,
+ 0x1B, 0x0C, 0x0D, 0x1B, 0x0C, 0x08, 0x17, 0x08
+};
+
+static const ByteProvider k1SpecialPalette28FMTownsProvider = { ARRAYSIZE(k1SpecialPalette28FMTowns), k1SpecialPalette28FMTowns };
+
+static const byte k1SpecialPalette29FMTowns[48] = {
+ 0x36, 0x38, 0x2C, 0x31, 0x38, 0x23, 0x2A, 0x33,
+ 0x1E, 0x24, 0x2F, 0x1A, 0x19, 0x2A, 0x16, 0x1E,
+ 0x2A, 0x16, 0x18, 0x26, 0x13, 0x13, 0x21, 0x0F,
+ 0x13, 0x21, 0x0F, 0x13, 0x21, 0x0F, 0x13, 0x21,
+ 0x0F, 0x13, 0x21, 0x0F, 0x0E, 0x1D, 0x0D, 0x0E,
+ 0x1D, 0x0D, 0x0E, 0x1D, 0x0D, 0x08, 0x17, 0x08
+};
+
+static const ByteProvider k1SpecialPalette29FMTownsProvider = { ARRAYSIZE(k1SpecialPalette29FMTowns), k1SpecialPalette29FMTowns };
+
+static const byte k1SpecialPalette30FMTowns[60] = {
+ 0x1E, 0x1D, 0x3F, 0x1A, 0x19, 0x3F, 0x14, 0x12,
+ 0x3B, 0x12, 0x11, 0x37, 0x11, 0x11, 0x33, 0x0F,
+ 0x0E, 0x2F, 0x0E, 0x0D, 0x2C, 0x0D, 0x0C, 0x28,
+ 0x0B, 0x0B, 0x24, 0x0A, 0x0A, 0x20, 0x0A, 0x0A,
+ 0x1D, 0x05, 0x05, 0x18, 0x03, 0x03, 0x13, 0x01,
+ 0x01, 0x11, 0x00, 0x00, 0x0A, 0x00, 0x00, 0x05,
+ 0x00, 0x0A, 0x1A, 0x00, 0x0F, 0x13, 0x00, 0x14,
+ 0x11, 0x0F, 0x0D, 0x00
+};
+
+static const ByteProvider k1SpecialPalette30FMTownsProvider = { ARRAYSIZE(k1SpecialPalette30FMTowns), k1SpecialPalette30FMTowns };
+
+static const byte k1SpecialPalette31FMTowns[39] = {
+ 0x2B, 0x19, 0x34, 0x27, 0x17, 0x30, 0x23, 0x14,
+ 0x2C, 0x20, 0x12, 0x27, 0x1C, 0x11, 0x23, 0x18,
+ 0x0E, 0x1E, 0x15, 0x0C, 0x1A, 0x11, 0x0A, 0x15,
+ 0x0E, 0x08, 0x11, 0x0A, 0x05, 0x0C, 0x06, 0x03,
+ 0x08, 0x03, 0x01, 0x03, 0x00, 0x00, 0x00
+};
+
+static const ByteProvider k1SpecialPalette31FMTownsProvider = { ARRAYSIZE(k1SpecialPalette31FMTowns), k1SpecialPalette31FMTowns };
+
+static const byte k1SpecialPalette32FMTowns[39] = {
+ 0x12, 0x12, 0x16, 0x11, 0x11, 0x14, 0x0F, 0x0F,
+ 0x12, 0x0D, 0x0D, 0x11, 0x0B, 0x0B, 0x0E, 0x0A,
+ 0x0A, 0x0C, 0x08, 0x08, 0x0A, 0x08, 0x08, 0x08,
+ 0x05, 0x05, 0x06, 0x05, 0x05, 0x05, 0x03, 0x03,
+ 0x03, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00
+};
+
+static const ByteProvider k1SpecialPalette32FMTownsProvider = { ARRAYSIZE(k1SpecialPalette32FMTowns), k1SpecialPalette32FMTowns };
+
+static const byte k1SpecialPalette33FMTowns[60] = {
+ 0x3F, 0x3D, 0x2F, 0x3F, 0x3D, 0x29, 0x3F, 0x3D,
+ 0x23, 0x3F, 0x3D, 0x1D, 0x3F, 0x3B, 0x17, 0x3F,
+ 0x3B, 0x11, 0x3F, 0x3B, 0x0B, 0x3F, 0x3B, 0x05,
+ 0x3F, 0x3B, 0x00, 0x3D, 0x38, 0x00, 0x3B, 0x34,
+ 0x00, 0x39, 0x33, 0x00, 0x39, 0x30, 0x00, 0x37,
+ 0x2D, 0x00, 0x36, 0x2B, 0x00, 0x34, 0x28, 0x00,
+ 0x33, 0x26, 0x00, 0x32, 0x24, 0x00, 0x30, 0x22,
+ 0x00, 0x2F, 0x20, 0x00
+};
+
+static const ByteProvider k1SpecialPalette33FMTownsProvider = { ARRAYSIZE(k1SpecialPalette33FMTowns), k1SpecialPalette33FMTowns };
+
+static const Shape k1Healing1ShapesFMTowns[22] = {
+ { 8, 0, 0, 3, 48, -12, -48 },
+ { 8, 3, 0, 3, 48, -12, -48 },
+ { 8, 6, 0, 3, 48, -12, -48 },
+ { 8, 9, 0, 3, 48, -12, -48 },
+ { 8, 12, 0, 3, 48, -12, -48 },
+ { 8, 15, 0, 3, 48, -12, -48 },
+ { 8, 18, 0, 3, 48, -12, -48 },
+ { 8, 21, 0, 3, 48, -12, -48 },
+ { 8, 24, 0, 3, 48, -12, -48 },
+ { 8, 27, 0, 3, 48, -12, -48 },
+ { 8, 30, 0, 3, 48, -12, -48 },
+ { 8, 33, 0, 3, 48, -12, -48 },
+ { 8, 0, 48, 3, 48, -12, -48 },
+ { 8, 3, 48, 3, 48, -12, -48 },
+ { 8, 6, 48, 3, 48, -12, -48 },
+ { 8, 9, 48, 3, 48, -12, -48 },
+ { 8, 12, 48, 3, 48, -12, -48 },
+ { 8, 15, 48, 3, 48, -12, -48 },
+ { 8, 18, 48, 3, 48, -12, -48 },
+ { 8, 21, 48, 3, 48, -12, -48 },
+ { 8, 24, 48, 3, 48, -12, -48 },
+ { 8, 27, 48, 3, 48, -12, -48 }
+};
+
+static const ShapeProvider k1Healing1ShapesFMTownsProvider = { ARRAYSIZE(k1Healing1ShapesFMTowns), k1Healing1ShapesFMTowns };
+
+static const Shape k1Healing2ShapesFMTowns[30] = {
+ { 9, 0, 0, 3, 48, -11, -48 },
+ { 9, 3, 0, 3, 48, -11, -48 },
+ { 9, 6, 0, 3, 48, -11, -48 },
+ { 9, 9, 0, 3, 48, -11, -48 },
+ { 9, 12, 0, 3, 48, -11, -48 },
+ { 9, 15, 0, 3, 48, -11, -48 },
+ { 9, 18, 0, 3, 48, -11, -48 },
+ { 9, 21, 0, 3, 48, -11, -48 },
+ { 9, 24, 0, 3, 48, -11, -48 },
+ { 9, 27, 0, 3, 48, -11, -48 },
+ { 9, 30, 0, 3, 48, -11, -48 },
+ { 9, 33, 0, 3, 48, -11, -48 },
+ { 9, 0, 48, 3, 48, -11, -48 },
+ { 9, 3, 48, 3, 48, -11, -48 },
+ { 9, 6, 48, 3, 48, -11, -48 },
+ { 9, 9, 48, 3, 48, -11, -48 },
+ { 9, 12, 48, 3, 48, -11, -48 },
+ { 9, 15, 48, 3, 48, -11, -48 },
+ { 9, 18, 48, 3, 48, -11, -48 },
+ { 9, 21, 48, 3, 48, -11, -48 },
+ { 9, 24, 48, 3, 48, -11, -48 },
+ { 9, 27, 48, 3, 48, -11, -48 },
+ { 9, 30, 48, 3, 48, -11, -48 },
+ { 9, 33, 48, 3, 48, -11, -48 },
+ { 9, 0, 96, 3, 48, -11, -48 },
+ { 9, 3, 96, 3, 48, -11, -48 },
+ { 9, 6, 96, 3, 48, -11, -48 },
+ { 9, 9, 96, 3, 48, -11, -48 },
+ { 9, 12, 96, 3, 48, -11, -48 },
+ { 9, 15, 96, 3, 48, -11, -48 }
+};
+
+static const ShapeProvider k1Healing2ShapesFMTownsProvider = { ARRAYSIZE(k1Healing2ShapesFMTowns), k1Healing2ShapesFMTowns };
+
+static const Shape k1PoisonDeathShapesFMTowns[20] = {
+ { 19, 0, 0, 8, 48, -31, -48 },
+ { 19, 8, 0, 8, 48, -31, -48 },
+ { 19, 16, 0, 8, 48, -31, -48 },
+ { 19, 24, 0, 8, 48, -31, -48 },
+ { 19, 32, 0, 8, 48, -31, -48 },
+ { 19, 0, 48, 8, 48, -31, -48 },
+ { 19, 8, 48, 8, 48, -31, -48 },
+ { 19, 16, 48, 8, 48, -31, -48 },
+ { 19, 24, 48, 8, 48, -31, -48 },
+ { 19, 32, 48, 8, 48, -31, -48 },
+ { 19, 0, 96, 8, 48, -31, -48 },
+ { 19, 8, 96, 8, 48, -31, -48 },
+ { 19, 16, 96, 8, 48, -31, -48 },
+ { 19, 24, 96, 8, 48, -31, -48 },
+ { 19, 32, 96, 8, 48, -31, -48 },
+ { 19, 0, 144, 8, 48, -31, -48 },
+ { 19, 8, 144, 8, 48, -31, -48 },
+ { 19, 16, 144, 8, 48, -31, -48 },
+ { 19, 24, 144, 8, 48, -31, -48 },
+ { 19, 32, 144, 8, 48, -31, -48 }
+};
+
+static const ShapeProvider k1PoisonDeathShapesFMTownsProvider = { ARRAYSIZE(k1PoisonDeathShapesFMTowns), k1PoisonDeathShapesFMTowns };
+
+static const Shape k1FluteShapesFMTowns[36] = {
+ { 13, 0, 0, 3, 75, -12, -75 },
+ { 13, 3, 0, 3, 75, -12, -75 },
+ { 13, 6, 0, 3, 75, -12, -75 },
+ { 13, 9, 0, 3, 75, -12, -75 },
+ { 13, 12, 0, 3, 75, -12, -75 },
+ { 13, 15, 0, 3, 75, -12, -75 },
+ { 13, 18, 0, 3, 75, -12, -75 },
+ { 13, 21, 0, 3, 75, -12, -75 },
+ { 13, 24, 0, 3, 75, -12, -75 },
+ { 13, 27, 0, 3, 75, -12, -75 },
+ { 13, 30, 0, 3, 75, -12, -75 },
+ { 13, 33, 0, 3, 75, -12, -75 },
+ { 13, 36, 75, 3, 75, -12, -75 },
+ { 13, 0, 75, 3, 75, -12, -75 },
+ { 13, 3, 75, 3, 75, -12, -75 },
+ { 13, 6, 75, 3, 75, -12, -75 },
+ { 13, 9, 75, 3, 75, -12, -75 },
+ { 13, 12, 75, 3, 75, -12, -75 },
+ { 13, 15, 75, 3, 75, -12, -75 },
+ { 13, 18, 75, 3, 75, -12, -75 },
+ { 13, 21, 75, 3, 75, -12, -75 },
+ { 13, 24, 75, 3, 75, -12, -75 },
+ { 13, 27, 75, 3, 75, -12, -75 },
+ { 13, 30, 75, 3, 75, -12, -75 },
+ { 13, 33, 75, 3, 75, -12, -75 },
+ { 13, 36, 75, 3, 75, -12, -75 },
+ { 14, 0, 0, 3, 75, -12, -75 },
+ { 14, 3, 0, 3, 75, -12, -75 },
+ { 14, 6, 0, 3, 75, -12, -75 },
+ { 14, 9, 0, 3, 75, -12, -75 },
+ { 14, 12, 0, 3, 75, -12, -75 },
+ { 14, 15, 0, 3, 75, -12, -75 },
+ { 14, 18, 0, 3, 75, -12, -75 },
+ { 14, 21, 0, 3, 75, -12, -75 },
+ { 14, 24, 0, 3, 75, -12, -75 },
+ { 14, 27, 0, 3, 75, -12, -75 }
+};
+
+static const ShapeProvider k1FluteShapesFMTownsProvider = { ARRAYSIZE(k1FluteShapesFMTowns), k1FluteShapesFMTowns };
+
+static const Shape k1Winter1ShapesFMTowns[7] = {
+ { 10, 5, 0, 5, 66, -20, -65 },
+ { 10, 10, 0, 5, 66, -20, -65 },
+ { 10, 15, 0, 5, 66, -20, -65 },
+ { 10, 20, 0, 5, 66, -20, -65 },
+ { 10, 25, 0, 5, 66, -20, -65 },
+ { 10, 30, 0, 5, 66, -20, -65 },
+ { 10, 35, 0, 5, 66, -20, -65 }
+};
+
+static const ShapeProvider k1Winter1ShapesFMTownsProvider = { ARRAYSIZE(k1Winter1ShapesFMTowns), k1Winter1ShapesFMTowns };
+
+static const Shape k1Winter2ShapesFMTowns[35] = {
+ { 10, 0, 66, 5, 66, -20, -65 },
+ { 10, 5, 66, 5, 66, -20, -65 },
+ { 10, 10, 66, 5, 66, -20, -65 },
+ { 10, 15, 66, 5, 66, -20, -65 },
+ { 10, 20, 66, 5, 66, -20, -65 },
+ { 10, 25, 66, 5, 66, -20, -65 },
+ { 10, 30, 66, 5, 66, -20, -65 },
+ { 10, 35, 66, 5, 66, -20, -65 },
+ { 10, 0, 132, 5, 66, -20, -65 },
+ { 10, 5, 132, 5, 66, -20, -65 },
+ { 10, 10, 132, 5, 66, -20, -65 },
+ { 10, 15, 132, 5, 66, -20, -65 },
+ { 10, 20, 132, 5, 66, -20, -65 },
+ { 10, 25, 132, 5, 66, -20, -65 },
+ { 10, 30, 132, 5, 66, -20, -65 },
+ { 10, 35, 132, 5, 66, -20, -65 },
+ { 11, 0, 0, 5, 66, -20, -65 },
+ { 11, 5, 0, 5, 66, -20, -65 },
+ { 11, 10, 0, 5, 66, -20, -65 },
+ { 11, 15, 0, 5, 66, -20, -65 },
+ { 11, 20, 0, 5, 66, -20, -65 },
+ { 11, 25, 0, 5, 66, -20, -65 },
+ { 11, 30, 0, 5, 66, -20, -65 },
+ { 11, 35, 0, 5, 66, -20, -65 },
+ { 11, 0, 66, 5, 66, -20, -65 },
+ { 11, 5, 66, 5, 66, -20, -65 },
+ { 11, 10, 66, 5, 66, -20, -65 },
+ { 11, 15, 66, 5, 66, -20, -65 },
+ { 11, 20, 66, 5, 66, -20, -65 },
+ { 11, 25, 66, 5, 66, -20, -65 },
+ { 11, 30, 66, 5, 66, -20, -65 },
+ { 11, 35, 66, 5, 66, -20, -65 },
+ { 11, 0, 132, 5, 66, -20, -65 },
+ { 11, 5, 132, 5, 66, -20, -65 },
+ { 11, 10, 132, 5, 66, -20, -65 }
+};
+
+static const ShapeProvider k1Winter2ShapesFMTownsProvider = { ARRAYSIZE(k1Winter2ShapesFMTowns), k1Winter2ShapesFMTowns };
+
+static const Shape k1Winter3ShapesFMTowns[4] = {
+ { 11, 15, 132, 5, 66, -20, -65 },
+ { 11, 20, 132, 5, 66, -20, -65 },
+ { 11, 25, 132, 5, 66, -20, -65 },
+ { 11, 30, 132, 5, 66, -20, -65 }
+};
+
+static const ShapeProvider k1Winter3ShapesFMTownsProvider = { ARRAYSIZE(k1Winter3ShapesFMTowns), k1Winter3ShapesFMTowns };
+
+static const Shape k1DrinkShapesFMTowns[15] = {
+ { 6, 0, 0, 4, 48, -20, -48 },
+ { 6, 4, 0, 4, 48, -20, -48 },
+ { 6, 8, 0, 4, 48, -20, -48 },
+ { 6, 12, 0, 4, 48, -20, -48 },
+ { 6, 16, 0, 4, 48, -20, -48 },
+ { 6, 20, 0, 5, 48, -20, -48 },
+ { 6, 0, 48, 5, 54, -20, -54 },
+ { 6, 5, 48, 5, 54, -20, -54 },
+ { 6, 10, 48, 5, 54, -20, -54 },
+ { 0, 7, 0, 0, 3, 43, -12 },
+ { 213, 7, 3, 3, 2, 40, -8 },
+ { 216, 7, 5, 7, 2, 36, -8 },
+ { 220, 7, 7, 10, 2, 33, -8 },
+ { 223, 7, 9, 12, 2, 31, -8 },
+ { 225, 7, 11, 15, 2, 28, -8 }
+};
+
+static const ShapeProvider k1DrinkShapesFMTownsProvider = { ARRAYSIZE(k1DrinkShapesFMTowns), k1DrinkShapesFMTowns };
+
+static const Shape k1WispShapesFMTowns[26] = {
+ { 12, 0, 0, 5, 48, -20, -48 },
+ { 12, 5, 0, 5, 48, -20, -48 },
+ { 12, 10, 0, 5, 48, -20, -48 },
+ { 12, 15, 0, 5, 48, -20, -48 },
+ { 12, 20, 0, 5, 48, -20, -48 },
+ { 12, 25, 0, 5, 48, -20, -48 },
+ { 12, 30, 0, 5, 48, -20, -48 },
+ { 12, 35, 0, 5, 48, -20, -48 },
+ { 12, 0, 48, 5, 48, -20, -48 },
+ { 12, 5, 48, 5, 48, -20, -48 },
+ { 12, 10, 48, 5, 48, -20, -48 },
+ { 12, 15, 48, 5, 48, -20, -48 },
+ { 12, 20, 48, 5, 48, -20, -48 },
+ { 12, 25, 48, 5, 48, -20, -48 },
+ { 12, 30, 48, 5, 48, -20, -48 },
+ { 12, 35, 48, 5, 48, -20, -48 },
+ { 12, 0, 96, 5, 29, -20, -42 },
+ { 12, 5, 96, 5, 29, -20, -42 },
+ { 12, 10, 96, 5, 29, -20, -42 },
+ { 12, 15, 96, 5, 29, -20, -42 },
+ { 12, 20, 96, 5, 29, -20, -42 },
+ { 12, 25, 96, 5, 29, -20, -42 },
+ { 12, 30, 96, 5, 29, -20, -42 },
+ { 12, 35, 96, 5, 29, -20, -42 },
+ { 12, 0, 125, 5, 29, -20, -42 },
+ { 12, 5, 125, 5, 29, -20, -42 }
+};
+
+static const ShapeProvider k1WispShapesFMTownsProvider = { ARRAYSIZE(k1WispShapesFMTowns), k1WispShapesFMTowns };
+
+static const Shape k1MagicAnimShapesFMTowns[5] = {
+ { 17, 0, 0, 8, 49, -32, -49 },
+ { 17, 8, 0, 8, 49, -32, -49 },
+ { 17, 16, 0, 8, 49, -32, -49 },
+ { 17, 24, 0, 8, 49, -32, -49 },
+ { 17, 32, 0, 8, 49, -32, -49 }
+};
+
+static const ShapeProvider k1MagicAnimShapesFMTownsProvider = { ARRAYSIZE(k1MagicAnimShapesFMTowns), k1MagicAnimShapesFMTowns };
+
+static const Shape k1BranStoneShapesFMTowns[14] = {
+ { 18, 0, 0, 5, 51, -20, -50 },
+ { 18, 5, 0, 5, 51, -20, -50 },
+ { 18, 10, 0, 5, 51, -20, -50 },
+ { 18, 15, 0, 5, 51, -20, -50 },
+ { 18, 20, 0, 5, 51, -20, -50 },
+ { 18, 25, 0, 5, 51, -20, -50 },
+ { 18, 30, 0, 5, 51, -20, -50 },
+ { 18, 35, 0, 5, 51, -20, -50 },
+ { 18, 0, 51, 5, 51, -20, -50 },
+ { 18, 5, 51, 5, 51, -20, -50 },
+ { 18, 10, 51, 5, 51, -20, -50 },
+ { 18, 15, 51, 5, 51, -20, -50 },
+ { 18, 20, 51, 5, 51, -20, -50 },
+ { 18, 25, 51, 5, 51, -20, -50 }
+};
+
+static const ShapeProvider k1BranStoneShapesFMTownsProvider = { ARRAYSIZE(k1BranStoneShapesFMTowns), k1BranStoneShapesFMTowns };
+
+static const byte k1OutroReunionSeqFMTowns[1351] = {
+ 0x1A, 0x00, 0x08, 0x01, 0x06, 0x01, 0x00, 0x02,
+ 0x08, 0x00, 0x50, 0x00, 0x22, 0x07, 0x08, 0x00,
+ 0x14, 0x0A, 0x00, 0x03, 0x08, 0x07, 0x08, 0x00,
+ 0x0B, 0x00, 0x09, 0x00, 0x10, 0x20, 0x5A, 0x00,
+ 0x3A, 0x02, 0x02, 0x08, 0x0D, 0x50, 0x00, 0x22,
+ 0x07, 0x10, 0x00, 0x02, 0x08, 0x0E, 0x50, 0x00,
+ 0x22, 0x07, 0x10, 0x00, 0x02, 0x08, 0x0C, 0x50,
+ 0x00, 0x22, 0x07, 0x10, 0x00, 0x02, 0x08, 0x0B,
+ 0x50, 0x00, 0x22, 0x07, 0x10, 0x00, 0x02, 0x08,
+ 0x0C, 0x50, 0x00, 0x22, 0x07, 0x10, 0x00, 0x02,
+ 0x08, 0x0D, 0x50, 0x00, 0x22, 0x07, 0x10, 0x00,
+ 0x02, 0x08, 0x0E, 0x50, 0x00, 0x22, 0x07, 0x10,
+ 0x00, 0x0A, 0x01, 0x03, 0x08, 0x07, 0x08, 0x00,
+ 0x0B, 0x01, 0x04, 0x00, 0x10, 0x21, 0x5A, 0x00,
+ 0x3A, 0x02, 0x0A, 0x02, 0x02, 0x08, 0x14, 0x50,
+ 0x00, 0x22, 0x07, 0x08, 0x00, 0x03, 0x08, 0x07,
+ 0x08, 0x00, 0x03, 0x08, 0x07, 0x08, 0x00, 0x03,
+ 0x08, 0x07, 0x08, 0x00, 0x03, 0x08, 0x07, 0x08,
+ 0x00, 0x0B, 0x02, 0x01, 0x00, 0x03, 0x08, 0x07,
+ 0x08, 0x00, 0x03, 0x08, 0x07, 0x08, 0x00, 0x03,
+ 0x08, 0x07, 0x08, 0x00, 0x10, 0x22, 0x5A, 0x00,
+ 0x3A, 0x02, 0x0A, 0x03, 0x03, 0x08, 0x07, 0x08,
+ 0x00, 0x0B, 0x03, 0x0B, 0x00, 0x10, 0x23, 0x78,
+ 0x00, 0x3A, 0x0F, 0x0A, 0x03, 0x03, 0x08, 0x07,
+ 0x08, 0x00, 0x0B, 0x03, 0x05, 0x00, 0x06, 0x28,
+ 0x00, 0x02, 0x08, 0x2E, 0x50, 0x00, 0x22, 0x07,
+ 0x10, 0x00, 0x02, 0x08, 0x2D, 0x50, 0x00, 0x22,
+ 0x07, 0x10, 0x00, 0x02, 0x08, 0x2E, 0x50, 0x00,
+ 0x22, 0x07, 0x10, 0x00, 0x02, 0x08, 0x2D, 0x50,
+ 0x00, 0x22, 0x07, 0x10, 0x00, 0x02, 0x08, 0x2E,
+ 0x50, 0x00, 0x22, 0x07, 0x10, 0x00, 0x02, 0x08,
+ 0x2D, 0x50, 0x00, 0x22, 0x07, 0x10, 0x00, 0x02,
+ 0x08, 0x2F, 0x50, 0x00, 0x22, 0x07, 0x08, 0x00,
+ 0x02, 0x08, 0x30, 0x50, 0x00, 0x22, 0x07, 0x08,
+ 0x00, 0x02, 0x08, 0x31, 0x50, 0x00, 0x22, 0x07,
+ 0x08, 0x00, 0x02, 0x08, 0x32, 0x50, 0x00, 0x22,
+ 0x07, 0x08, 0x00, 0x06, 0x0A, 0x00, 0x10, 0x24,
+ 0x5A, 0x00, 0x3A, 0x02, 0x02, 0x08, 0x33, 0x50,
+ 0x00, 0x22, 0x07, 0x08, 0x00, 0x02, 0x08, 0x34,
+ 0x50, 0x00, 0x22, 0x07, 0x08, 0x00, 0x02, 0x08,
+ 0x35, 0x50, 0x00, 0x22, 0x07, 0x08, 0x00, 0x02,
+ 0x08, 0x36, 0x50, 0x00, 0x22, 0x07, 0x08, 0x00,
+ 0x02, 0x08, 0x37, 0x50, 0x00, 0x22, 0x07, 0x08,
+ 0x00, 0x02, 0x08, 0x35, 0x50, 0x00, 0x22, 0x07,
+ 0x08, 0x00, 0x02, 0x08, 0x34, 0x50, 0x00, 0x22,
+ 0x07, 0x08, 0x00, 0x02, 0x08, 0x33, 0x50, 0x00,
+ 0x22, 0x07, 0x08, 0x00, 0x02, 0x08, 0x35, 0x50,
+ 0x00, 0x22, 0x07, 0x08, 0x00, 0x02, 0x08, 0x36,
+ 0x50, 0x00, 0x22, 0x07, 0x08, 0x00, 0x02, 0x08,
+ 0x37, 0x50, 0x00, 0x22, 0x07, 0x08, 0x00, 0x06,
+ 0x0A, 0x00, 0x10, 0x25, 0x5A, 0x00, 0x3A, 0x02,
+ 0x02, 0x08, 0x33, 0x50, 0x00, 0x22, 0x07, 0x08,
+ 0x00, 0x02, 0x08, 0x34, 0x50, 0x00, 0x22, 0x07,
+ 0x08, 0x00, 0x02, 0x08, 0x35, 0x50, 0x00, 0x22,
+ 0x07, 0x08, 0x00, 0x02, 0x08, 0x36, 0x50, 0x00,
+ 0x22, 0x07, 0x08, 0x00, 0x02, 0x08, 0x37, 0x50,
+ 0x00, 0x22, 0x07, 0x08, 0x00, 0x02, 0x08, 0x35,
+ 0x50, 0x00, 0x22, 0x07, 0x08, 0x00, 0x02, 0x08,
+ 0x34, 0x50, 0x00, 0x22, 0x07, 0x08, 0x00, 0x02,
+ 0x08, 0x33, 0x50, 0x00, 0x22, 0x07, 0x08, 0x00,
+ 0x02, 0x08, 0x35, 0x50, 0x00, 0x22, 0x07, 0x08,
+ 0x00, 0x02, 0x08, 0x36, 0x50, 0x00, 0x22, 0x07,
+ 0x08, 0x00, 0x02, 0x08, 0x37, 0x50, 0x00, 0x22,
+ 0x07, 0x08, 0x00, 0x06, 0x1E, 0x00, 0x10, 0x26,
+ 0x78, 0x00, 0x3A, 0x0F, 0x02, 0x08, 0x38, 0x50,
+ 0x00, 0x22, 0x07, 0x08, 0x00, 0x02, 0x08, 0x39,
+ 0x50, 0x00, 0x22, 0x07, 0x08, 0x00, 0x02, 0x08,
+ 0x3A, 0x50, 0x00, 0x22, 0x07, 0x08, 0x00, 0x02,
+ 0x08, 0x38, 0x50, 0x00, 0x22, 0x07, 0x08, 0x00,
+ 0x02, 0x08, 0x3B, 0x50, 0x00, 0x22, 0x07, 0x08,
+ 0x00, 0x06, 0x0A, 0x00, 0x02, 0x08, 0x39, 0x50,
+ 0x00, 0x22, 0x07, 0x08, 0x00, 0x02, 0x08, 0x38,
+ 0x50, 0x00, 0x22, 0x07, 0x08, 0x00, 0x02, 0x08,
+ 0x39, 0x50, 0x00, 0x22, 0x07, 0x08, 0x00, 0x02,
+ 0x08, 0x3A, 0x50, 0x00, 0x22, 0x07, 0x08, 0x00,
+ 0x06, 0x3C, 0x00, 0x11, 0x02, 0x08, 0x33, 0x50,
+ 0x00, 0x22, 0x07, 0x08, 0x00, 0x02, 0x08, 0x32,
+ 0x50, 0x00, 0x22, 0x07, 0x08, 0x00, 0x02, 0x08,
+ 0x31, 0x50, 0x00, 0x22, 0x07, 0x08, 0x00, 0x02,
+ 0x08, 0x30, 0x50, 0x00, 0x22, 0x07, 0x08, 0x00,
+ 0x02, 0x08, 0x2F, 0x50, 0x00, 0x22, 0x07, 0x08,
+ 0x00, 0x02, 0x08, 0x2E, 0x50, 0x00, 0x22, 0x07,
+ 0x08, 0x00, 0x02, 0x08, 0x2D, 0x50, 0x00, 0x22,
+ 0x07, 0x08, 0x00, 0x06, 0x1E, 0x00, 0x02, 0x08,
+ 0x2E, 0x50, 0x00, 0x22, 0x07, 0x08, 0x00, 0x02,
+ 0x08, 0x2F, 0x50, 0x00, 0x22, 0x07, 0x08, 0x00,
+ 0x02, 0x08, 0x30, 0x50, 0x00, 0x22, 0x07, 0x08,
+ 0x00, 0x02, 0x08, 0x31, 0x50, 0x00, 0x22, 0x07,
+ 0x08, 0x00, 0x02, 0x08, 0x32, 0x50, 0x00, 0x22,
+ 0x07, 0x08, 0x00, 0x02, 0x08, 0x33, 0x50, 0x00,
+ 0x22, 0x07, 0x08, 0x00, 0x02, 0x08, 0x41, 0x50,
+ 0x00, 0x22, 0x07, 0x08, 0x00, 0x02, 0x08, 0x42,
+ 0x50, 0x00, 0x22, 0x07, 0x08, 0x00, 0x02, 0x08,
+ 0x43, 0x50, 0x00, 0x22, 0x07, 0x08, 0x00, 0x02,
+ 0x08, 0x44, 0x50, 0x00, 0x22, 0x07, 0x08, 0x00,
+ 0x02, 0x08, 0x45, 0x50, 0x00, 0x22, 0x07, 0x08,
+ 0x00, 0x02, 0x08, 0x46, 0x50, 0x00, 0x22, 0x07,
+ 0x08, 0x00, 0x06, 0x0A, 0x00, 0x10, 0x27, 0x5A,
+ 0x00, 0x3A, 0x02, 0x02, 0x08, 0x4E, 0x50, 0x00,
+ 0x22, 0x07, 0x08, 0x00, 0x02, 0x08, 0x4F, 0x50,
+ 0x00, 0x22, 0x07, 0x08, 0x00, 0x02, 0x08, 0x50,
+ 0x50, 0x00, 0x22, 0x07, 0x08, 0x00, 0x02, 0x08,
+ 0x51, 0x50, 0x00, 0x22, 0x07, 0x08, 0x00, 0x02,
+ 0x08, 0x52, 0x50, 0x00, 0x22, 0x07, 0x08, 0x00,
+ 0x02, 0x08, 0x53, 0x50, 0x00, 0x22, 0x07, 0x08,
+ 0x00, 0x02, 0x08, 0x54, 0x50, 0x00, 0x22, 0x07,
+ 0x08, 0x00, 0x02, 0x08, 0x55, 0x50, 0x00, 0x22,
+ 0x07, 0x08, 0x00, 0x06, 0x78, 0x00, 0x10, 0x28,
+ 0x78, 0x00, 0x3A, 0x0F, 0x0A, 0x05, 0x02, 0x08,
+ 0x59, 0x50, 0x00, 0x22, 0x07, 0x08, 0x00, 0x02,
+ 0x08, 0x5A, 0x50, 0x00, 0x22, 0x07, 0x08, 0x00,
+ 0x02, 0x08, 0x5B, 0x50, 0x00, 0x22, 0x07, 0x08,
+ 0x00, 0x02, 0x08, 0x5C, 0x50, 0x00, 0x22, 0x07,
+ 0x08, 0x00, 0x02, 0x08, 0x5D, 0x50, 0x00, 0x22,
+ 0x07, 0x08, 0x00, 0x0B, 0x05, 0x01, 0x00, 0x06,
+ 0x28, 0x00, 0x10, 0x29, 0x78, 0x00, 0x3A, 0x0F,
+ 0x0A, 0x06, 0x02, 0x08, 0x59, 0x50, 0x00, 0x22,
+ 0x07, 0x08, 0x00, 0x02, 0x08, 0x5A, 0x50, 0x00,
+ 0x22, 0x07, 0x08, 0x00, 0x02, 0x08, 0x5B, 0x50,
+ 0x00, 0x22, 0x07, 0x08, 0x00, 0x02, 0x08, 0x5C,
+ 0x50, 0x00, 0x22, 0x07, 0x08, 0x00, 0x02, 0x08,
+ 0x5D, 0x50, 0x00, 0x22, 0x07, 0x08, 0x00, 0x0B,
+ 0x06, 0x01, 0x00, 0x06, 0x28, 0x00, 0x10, 0x2A,
+ 0x78, 0x00, 0x3A, 0x0F, 0x02, 0x08, 0x5E, 0x50,
+ 0x00, 0x22, 0x07, 0x10, 0x00, 0x02, 0x08, 0x63,
+ 0x50, 0x00, 0x22, 0x07, 0x10, 0x00, 0x06, 0xB4,
+ 0x00, 0x11, 0x18, 0x69, 0x02, 0x08, 0x64, 0x50,
+ 0x00, 0x22, 0x07, 0x10, 0x00, 0x02, 0x08, 0x65,
+ 0x50, 0x00, 0x22, 0x07, 0x10, 0x00, 0x18, 0x74,
+ 0x02, 0x08, 0x66, 0x50, 0x00, 0x22, 0x07, 0x10,
+ 0x00, 0x02, 0x08, 0x67, 0x50, 0x00, 0x22, 0x07,
+ 0x10, 0x00, 0x18, 0x75, 0x02, 0x08, 0x68, 0x50,
+ 0x00, 0x22, 0x07, 0x10, 0x00, 0x02, 0x08, 0x69,
+ 0x50, 0x00, 0x22, 0x07, 0x10, 0x00, 0x10, 0x2B,
+ 0x96, 0x00, 0x1C, 0x22, 0x0A, 0x06, 0x02, 0x08,
+ 0x6B, 0x50, 0x00, 0x22, 0x07, 0x10, 0x00, 0x02,
+ 0x08, 0x6C, 0x50, 0x00, 0x22, 0x07, 0x10, 0x00,
+ 0x02, 0x08, 0x6D, 0x50, 0x00, 0x22, 0x07, 0x10,
+ 0x00, 0x02, 0x08, 0x6E, 0x50, 0x00, 0x22, 0x07,
+ 0x10, 0x00, 0x02, 0x08, 0x6F, 0x50, 0x00, 0x22,
+ 0x07, 0x10, 0x00, 0x02, 0x08, 0x70, 0x50, 0x00,
+ 0x22, 0x07, 0x10, 0x00, 0x02, 0x08, 0x71, 0x50,
+ 0x00, 0x22, 0x07, 0x10, 0x00, 0x0B, 0x06, 0x01,
+ 0x00, 0x06, 0x1E, 0x00, 0x10, 0x2C, 0x96, 0x00,
+ 0x1C, 0x22, 0x0A, 0x06, 0x02, 0x08, 0x6B, 0x50,
+ 0x00, 0x22, 0x07, 0x10, 0x00, 0x02, 0x08, 0x6C,
+ 0x50, 0x00, 0x22, 0x07, 0x10, 0x00, 0x02, 0x08,
+ 0x6D, 0x50, 0x00, 0x22, 0x07, 0x10, 0x00, 0x02,
+ 0x08, 0x6E, 0x50, 0x00, 0x22, 0x07, 0x10, 0x00,
+ 0x02, 0x08, 0x6F, 0x50, 0x00, 0x22, 0x07, 0x10,
+ 0x00, 0x02, 0x08, 0x70, 0x50, 0x00, 0x22, 0x07,
+ 0x10, 0x00, 0x02, 0x08, 0x71, 0x50, 0x00, 0x22,
+ 0x07, 0x10, 0x00, 0x0B, 0x06, 0x01, 0x00, 0x06,
+ 0x1E, 0x00, 0x10, 0x2D, 0x96, 0x00, 0x1C, 0x22,
+ 0x0A, 0x06, 0x02, 0x08, 0x6B, 0x50, 0x00, 0x22,
+ 0x07, 0x10, 0x00, 0x02, 0x08, 0x6C, 0x50, 0x00,
+ 0x22, 0x07, 0x10, 0x00, 0x02, 0x08, 0x6D, 0x50,
+ 0x00, 0x22, 0x07, 0x10, 0x00, 0x02, 0x08, 0x6E,
+ 0x50, 0x00, 0x22, 0x07, 0x10, 0x00, 0x02, 0x08,
+ 0x6F, 0x50, 0x00, 0x22, 0x07, 0x10, 0x00, 0x02,
+ 0x08, 0x70, 0x50, 0x00, 0x22, 0x07, 0x10, 0x00,
+ 0x02, 0x08, 0x71, 0x50, 0x00, 0x22, 0x07, 0x10,
+ 0x00, 0x0B, 0x06, 0x01, 0x00, 0x06, 0x1E, 0x00,
+ 0x02, 0x08, 0x72, 0x50, 0x00, 0x22, 0x07, 0x10,
+ 0x00, 0x02, 0x08, 0x73, 0x50, 0x00, 0x22, 0x07,
+ 0x10, 0x00, 0x06, 0x14, 0x00, 0x02, 0x08, 0x74,
+ 0x50, 0x00, 0x22, 0x07, 0x10, 0x00, 0x02, 0x08,
+ 0x75, 0x50, 0x00, 0x22, 0x07, 0x10, 0x00, 0x06,
+ 0x78, 0x00, 0x13, 0x0E, 0x01, 0x08, 0x1D
+};
+
+static const ByteProvider k1OutroReunionSeqFMTownsProvider = { ARRAYSIZE(k1OutroReunionSeqFMTowns), k1OutroReunionSeqFMTowns };
+
+static const byte k1TownsMusicFadeTableFMTowns[1416] = {
+ 0x6E, 0x00, 0x6E, 0x00, 0x6E, 0x00, 0x6E, 0x00,
+ 0x6E, 0x00, 0x00, 0x00, 0x32, 0x00, 0x32, 0x00,
+ 0x24, 0x00, 0x24, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x6A, 0x00, 0x70, 0x00, 0x70, 0x00, 0x64, 0x00,
+ 0x64, 0x00, 0x00, 0x00, 0x32, 0x00, 0x30, 0x00,
+ 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x68, 0x00, 0x68, 0x00, 0x6C, 0x00, 0x6C, 0x00,
+ 0x6C, 0x00, 0x6E, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x6E, 0x00, 0x66, 0x00, 0x64, 0x00, 0x64, 0x00,
+ 0x62, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x6A, 0x00, 0x6A, 0x00, 0x66, 0x00, 0x66, 0x00,
+ 0x66, 0x00, 0x6A, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x6C, 0x00, 0x6C, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x6E, 0x00, 0x72, 0x00, 0x6A, 0x00, 0x6A, 0x00,
+ 0x6A, 0x00, 0x6A, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x70, 0x00, 0x70, 0x00, 0x70, 0x00, 0x6A, 0x00,
+ 0x6A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x68, 0x00, 0x68, 0x00, 0x68, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x6C, 0x00, 0x6C, 0x00, 0x6A, 0x00, 0x6C, 0x00,
+ 0x6C, 0x00, 0x6C, 0x00, 0x2E, 0x00, 0x2A, 0x00,
+ 0x36, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x70, 0x00, 0x6C, 0x00, 0x6C, 0x00, 0x70, 0x00,
+ 0x70, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x6C, 0x00, 0x6C, 0x00, 0x6C, 0x00, 0x6C, 0x00,
+ 0x66, 0x00, 0x66, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x6C, 0x00, 0x6A, 0x00, 0x72, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x62, 0x00, 0x62, 0x00, 0x62, 0x00, 0x64, 0x00,
+ 0x64, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x64, 0x00, 0x64, 0x00, 0x70, 0x00, 0x62, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x70, 0x00, 0x70, 0x00, 0x70, 0x00, 0x70, 0x00,
+ 0x70, 0x00, 0x70, 0x00, 0x30, 0x00, 0x28, 0x00,
+ 0x20, 0x00, 0x36, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x68, 0x00, 0x68, 0x00, 0x68, 0x00, 0x62, 0x00,
+ 0x62, 0x00, 0x00, 0x00, 0x28, 0x00, 0x28, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x74, 0x00, 0x74, 0x00, 0x74, 0x00, 0x74, 0x00,
+ 0x74, 0x00, 0x74, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x68, 0x00, 0x68, 0x00, 0x68, 0x00, 0x68, 0x00,
+ 0x68, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x70, 0x00, 0x70, 0x00, 0x70, 0x00, 0x5A, 0x00,
+ 0x5C, 0x00, 0x00, 0x00, 0x28, 0x00, 0x24, 0x00,
+ 0x28, 0x00, 0x2C, 0x00, 0x14, 0x00, 0x00, 0x00,
+ 0x70, 0x00, 0x70, 0x00, 0x70, 0x00, 0x6A, 0x00,
+ 0x6A, 0x00, 0x78, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x70, 0x00, 0x70, 0x00, 0x70, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x50, 0x00, 0x50, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x68, 0x00, 0x68, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x66, 0x00, 0x66, 0x00, 0x62, 0x00, 0x6E, 0x00,
+ 0x6C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x70, 0x00, 0x70, 0x00, 0x70, 0x00, 0x70, 0x00,
+ 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x6C, 0x00, 0x6C, 0x00, 0x6C, 0x00, 0x6C, 0x00,
+ 0x6C, 0x00, 0x6C, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x6E, 0x00, 0x6E, 0x00, 0x6E, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x64, 0x00, 0x64, 0x00, 0x64, 0x00, 0x64, 0x00,
+ 0x64, 0x00, 0x68, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x68, 0x00, 0x70, 0x00, 0x66, 0x00, 0x66, 0x00,
+ 0x66, 0x00, 0x00, 0x00, 0x28, 0x00, 0x28, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x70, 0x00, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x6A, 0x00, 0x6A, 0x00, 0x72, 0x00, 0x72, 0x00,
+ 0x72, 0x00, 0x00, 0x00, 0x32, 0x00, 0x2A, 0x00,
+ 0x1E, 0x00, 0x34, 0x00, 0x1E, 0x00, 0x28, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x70, 0x00, 0x70, 0x00, 0x70, 0x00, 0x70, 0x00,
+ 0x70, 0x00, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x6C, 0x00, 0x62, 0x00, 0x6C, 0x00, 0x62, 0x00,
+ 0x62, 0x00, 0x62, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x6E, 0x00, 0x6E, 0x00, 0x70, 0x00, 0x6C, 0x00,
+ 0x70, 0x00, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x6C, 0x00, 0x6C, 0x00, 0x6C, 0x00, 0x6C, 0x00,
+ 0x6C, 0x00, 0x6C, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x6C, 0x00, 0x6C, 0x00, 0x6C, 0x00, 0x6C, 0x00,
+ 0x6C, 0x00, 0x6C, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x70, 0x00, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x70, 0x00, 0x70, 0x00, 0x70, 0x00, 0x70, 0x00,
+ 0x70, 0x00, 0x00, 0x00, 0x3C, 0x00, 0x46, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x76, 0x00, 0x76, 0x00, 0x76, 0x00, 0x76, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x69, 0x00, 0x64, 0x00, 0x69, 0x00, 0x64, 0x00,
+ 0x69, 0x00, 0x69, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x6C, 0x00, 0x6C, 0x00, 0x66, 0x00, 0x66, 0x00,
+ 0x66, 0x00, 0x68, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x6E, 0x00, 0x6E, 0x00, 0x6E, 0x00, 0x6E, 0x00,
+ 0x6E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x6E, 0x00, 0x6E, 0x00, 0x6E, 0x00, 0x6E, 0x00,
+ 0x6E, 0x00, 0x6E, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x6E, 0x00, 0x6E, 0x00, 0x6E, 0x00, 0x6E, 0x00,
+ 0x6E, 0x00, 0x6E, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x6C, 0x00, 0x6C, 0x00, 0x6C, 0x00, 0x6C, 0x00,
+ 0x6C, 0x00, 0x6C, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x66, 0x00, 0x66, 0x00, 0x66, 0x00, 0x66, 0x00,
+ 0x66, 0x00, 0x66, 0x00, 0x38, 0x00, 0x24, 0x00,
+ 0x14, 0x00, 0x16, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x6C, 0x00, 0x6C, 0x00, 0x6C, 0x00, 0x6C, 0x00,
+ 0x6C, 0x00, 0x6C, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x76, 0x00, 0x64, 0x00, 0x6A, 0x00, 0x6A, 0x00,
+ 0x6A, 0x00, 0x64, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x70, 0x00, 0x70, 0x00, 0x70, 0x00, 0x70, 0x00,
+ 0x70, 0x00, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x70, 0x00, 0x70, 0x00, 0x70, 0x00, 0x70, 0x00,
+ 0x70, 0x00, 0x70, 0x00, 0x4C, 0x00, 0x4C, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x66, 0x00, 0x66, 0x00, 0x68, 0x00, 0x5E, 0x00,
+ 0x78, 0x00, 0x6E, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x68, 0x00, 0x68, 0x00, 0x68, 0x00, 0x68, 0x00,
+ 0x68, 0x00, 0x68, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+};
+
+static const ByteProvider k1TownsMusicFadeTableFMTownsProvider = { ARRAYSIZE(k1TownsMusicFadeTableFMTowns), k1TownsMusicFadeTableFMTowns };
+
+static const byte k1TownsSFXwdTableFMTowns[75266] = {
+ 0x00, 0x00, 0x02, 0x00, 0x02, 0x00, 0x00, 0x00,
+ 0x06, 0x00, 0x02, 0x00, 0x00, 0x00, 0x0A, 0x00,
+ 0x02, 0x00, 0x00, 0x00, 0x0E, 0x00, 0x02, 0x00,
+ 0x01, 0x00, 0x12, 0x00, 0x02, 0x00, 0x03, 0x00,
+ 0x16, 0x00, 0x02, 0x00, 0x05, 0x00, 0x1A, 0x00,
+ 0x03, 0x00, 0x07, 0x00, 0x1E, 0x00, 0x04, 0x00,
+ 0x00, 0x00, 0xFE, 0xFF, 0x02, 0x00, 0x00, 0x00,
+ 0xFA, 0xFF, 0x02, 0x00, 0x00, 0x00, 0xF6, 0xFF,
+ 0x02, 0x00, 0x00, 0x00, 0xF2, 0xFF, 0x02, 0x00,
+ 0x01, 0x00, 0xEE, 0xFF, 0x02, 0x00, 0x03, 0x00,
+ 0xEA, 0xFF, 0x02, 0x00, 0x05, 0x00, 0xE6, 0xFF,
+ 0x03, 0x00, 0x07, 0x00, 0xE2, 0xFF, 0x04, 0x00,
+ 0x00, 0x00, 0x02, 0x00, 0x06, 0x00, 0x00, 0x00,
+ 0x06, 0x00, 0x06, 0x00, 0x00, 0x00, 0x0A, 0x00,
+ 0x06, 0x00, 0x00, 0x00, 0x0E, 0x00, 0x06, 0x00,
+ 0x01, 0x00, 0x12, 0x00, 0x06, 0x00, 0x03, 0x00,
+ 0x16, 0x00, 0x07, 0x00, 0x05, 0x00, 0x1A, 0x00,
+ 0x0A, 0x00, 0x07, 0x00, 0x1E, 0x00, 0x0C, 0x00,
+ 0x00, 0x00, 0xFE, 0xFF, 0x06, 0x00, 0x00, 0x00,
+ 0xFA, 0xFF, 0x06, 0x00, 0x00, 0x00, 0xF6, 0xFF,
+ 0x06, 0x00, 0x00, 0x00, 0xF2, 0xFF, 0x06, 0x00,
+ 0x01, 0x00, 0xEE, 0xFF, 0x06, 0x00, 0x03, 0x00,
+ 0xEA, 0xFF, 0x07, 0x00, 0x05, 0x00, 0xE6, 0xFF,
+ 0x0A, 0x00, 0x07, 0x00, 0xE2, 0xFF, 0x0C, 0x00,
+ 0x00, 0x00, 0x02, 0x00, 0x0A, 0x00, 0x00, 0x00,
+ 0x06, 0x00, 0x0A, 0x00, 0x00, 0x00, 0x0A, 0x00,
+ 0x0A, 0x00, 0x00, 0x00, 0x0E, 0x00, 0x0A, 0x00,
+ 0x01, 0x00, 0x12, 0x00, 0x0B, 0x00, 0x03, 0x00,
+ 0x16, 0x00, 0x0D, 0x00, 0x05, 0x00, 0x1A, 0x00,
+ 0x11, 0x00, 0x07, 0x00, 0x1E, 0x00, 0x15, 0x00,
+ 0x00, 0x00, 0xFE, 0xFF, 0x0A, 0x00, 0x00, 0x00,
+ 0xFA, 0xFF, 0x0A, 0x00, 0x00, 0x00, 0xF6, 0xFF,
+ 0x0A, 0x00, 0x00, 0x00, 0xF2, 0xFF, 0x0A, 0x00,
+ 0x01, 0x00, 0xEE, 0xFF, 0x0B, 0x00, 0x03, 0x00,
+ 0xEA, 0xFF, 0x0D, 0x00, 0x05, 0x00, 0xE6, 0xFF,
+ 0x11, 0x00, 0x07, 0x00, 0xE2, 0xFF, 0x15, 0x00,
+ 0x00, 0x00, 0x02, 0x00, 0x0E, 0x00, 0x00, 0x00,
+ 0x06, 0x00, 0x0E, 0x00, 0x00, 0x00, 0x0A, 0x00,
+ 0x0E, 0x00, 0x00, 0x00, 0x0E, 0x00, 0x0E, 0x00,
+ 0x01, 0x00, 0x12, 0x00, 0x0F, 0x00, 0x03, 0x00,
+ 0x16, 0x00, 0x12, 0x00, 0x05, 0x00, 0x1A, 0x00,
+ 0x18, 0x00, 0x07, 0x00, 0x1E, 0x00, 0x1D, 0x00,
+ 0x00, 0x00, 0xFE, 0xFF, 0x0E, 0x00, 0x00, 0x00,
+ 0xFA, 0xFF, 0x0E, 0x00, 0x00, 0x00, 0xF6, 0xFF,
+ 0x0E, 0x00, 0x00, 0x00, 0xF2, 0xFF, 0x0E, 0x00,
+ 0x01, 0x00, 0xEE, 0xFF, 0x0F, 0x00, 0x03, 0x00,
+ 0xEA, 0xFF, 0x12, 0x00, 0x05, 0x00, 0xE6, 0xFF,
+ 0x18, 0x00, 0x07, 0x00, 0xE2, 0xFF, 0x1D, 0x00,
+ 0x02, 0x00, 0x02, 0x00, 0x12, 0x00, 0x02, 0x00,
+ 0x06, 0x00, 0x12, 0x00, 0x02, 0x00, 0x0A, 0x00,
+ 0x12, 0x00, 0x02, 0x00, 0x0E, 0x00, 0x12, 0x00,
+ 0x04, 0x00, 0x12, 0x00, 0x15, 0x00, 0x06, 0x00,
+ 0x16, 0x00, 0x19, 0x00, 0x08, 0x00, 0x1A, 0x00,
+ 0x1F, 0x00, 0x0A, 0x00, 0x1E, 0x00, 0x26, 0x00,
+ 0x02, 0x00, 0xFE, 0xFF, 0x12, 0x00, 0x02, 0x00,
+ 0xFA, 0xFF, 0x12, 0x00, 0x02, 0x00, 0xF6, 0xFF,
+ 0x12, 0x00, 0x02, 0x00, 0xF2, 0xFF, 0x12, 0x00,
+ 0x04, 0x00, 0xEE, 0xFF, 0x15, 0x00, 0x06, 0x00,
+ 0xEA, 0xFF, 0x19, 0x00, 0x08, 0x00, 0xE6, 0xFF,
+ 0x1F, 0x00, 0x0A, 0x00, 0xE2, 0xFF, 0x26, 0x00,
+ 0x04, 0x00, 0x02, 0x00, 0x16, 0x00, 0x04, 0x00,
+ 0x06, 0x00, 0x16, 0x00, 0x04, 0x00, 0x0A, 0x00,
+ 0x16, 0x00, 0x04, 0x00, 0x0E, 0x00, 0x16, 0x00,
+ 0x06, 0x00, 0x12, 0x00, 0x19, 0x00, 0x08, 0x00,
+ 0x16, 0x00, 0x1E, 0x00, 0x0A, 0x00, 0x1A, 0x00,
+ 0x26, 0x00, 0x0C, 0x00, 0x1E, 0x00, 0x2E, 0x00,
+ 0x04, 0x00, 0xFE, 0xFF, 0x16, 0x00, 0x04, 0x00,
+ 0xFA, 0xFF, 0x16, 0x00, 0x04, 0x00, 0xF6, 0xFF,
+ 0x16, 0x00, 0x04, 0x00, 0xF2, 0xFF, 0x16, 0x00,
+ 0x06, 0x00, 0xEE, 0xFF, 0x19, 0x00, 0x08, 0x00,
+ 0xEA, 0xFF, 0x1E, 0x00, 0x0A, 0x00, 0xE6, 0xFF,
+ 0x26, 0x00, 0x0C, 0x00, 0xE2, 0xFF, 0x2E, 0x00,
+ 0x06, 0x00, 0x02, 0x00, 0x1A, 0x00, 0x06, 0x00,
+ 0x06, 0x00, 0x1A, 0x00, 0x06, 0x00, 0x0A, 0x00,
+ 0x1A, 0x00, 0x06, 0x00, 0x0E, 0x00, 0x1A, 0x00,
+ 0x08, 0x00, 0x12, 0x00, 0x1E, 0x00, 0x0A, 0x00,
+ 0x16, 0x00, 0x24, 0x00, 0x0C, 0x00, 0x1A, 0x00,
+ 0x2D, 0x00, 0x0E, 0x00, 0x1E, 0x00, 0x37, 0x00,
+ 0x06, 0x00, 0xFE, 0xFF, 0x1A, 0x00, 0x06, 0x00,
+ 0xFA, 0xFF, 0x1A, 0x00, 0x06, 0x00, 0xF6, 0xFF,
+ 0x1A, 0x00, 0x06, 0x00, 0xF2, 0xFF, 0x1A, 0x00,
+ 0x08, 0x00, 0xEE, 0xFF, 0x1E, 0x00, 0x0A, 0x00,
+ 0xEA, 0xFF, 0x24, 0x00, 0x0C, 0x00, 0xE6, 0xFF,
+ 0x2D, 0x00, 0x0E, 0x00, 0xE2, 0xFF, 0x37, 0x00,
+ 0x08, 0x00, 0x02, 0x00, 0x1E, 0x00, 0x08, 0x00,
+ 0x06, 0x00, 0x1E, 0x00, 0x08, 0x00, 0x0A, 0x00,
+ 0x1E, 0x00, 0x08, 0x00, 0x0E, 0x00, 0x1E, 0x00,
+ 0x0A, 0x00, 0x12, 0x00, 0x22, 0x00, 0x0C, 0x00,
+ 0x16, 0x00, 0x29, 0x00, 0x0E, 0x00, 0x1A, 0x00,
+ 0x34, 0x00, 0x10, 0x00, 0x1E, 0x00, 0x3F, 0x00,
+ 0x08, 0x00, 0xFE, 0xFF, 0x1E, 0x00, 0x08, 0x00,
+ 0xFA, 0xFF, 0x1E, 0x00, 0x08, 0x00, 0xF6, 0xFF,
+ 0x1E, 0x00, 0x08, 0x00, 0xF2, 0xFF, 0x1E, 0x00,
+ 0x0A, 0x00, 0xEE, 0xFF, 0x22, 0x00, 0x0C, 0x00,
+ 0xEA, 0xFF, 0x29, 0x00, 0x0E, 0x00, 0xE6, 0xFF,
+ 0x34, 0x00, 0x10, 0x00, 0xE2, 0xFF, 0x3F, 0x00,
+ 0x00, 0x00, 0x02, 0x00, 0xFE, 0xFF, 0x00, 0x00,
+ 0x06, 0x00, 0xFE, 0xFF, 0x00, 0x00, 0x0A, 0x00,
+ 0xFE, 0xFF, 0x00, 0x00, 0x0E, 0x00, 0xFE, 0xFF,
+ 0x01, 0x00, 0x12, 0x00, 0xFE, 0xFF, 0x03, 0x00,
+ 0x16, 0x00, 0xFE, 0xFF, 0x05, 0x00, 0x1A, 0x00,
+ 0xFD, 0xFF, 0x07, 0x00, 0x1E, 0x00, 0xFC, 0xFF,
+ 0x00, 0x00, 0xFE, 0xFF, 0xFE, 0xFF, 0x00, 0x00,
+ 0xFA, 0xFF, 0xFE, 0xFF, 0x00, 0x00, 0xF6, 0xFF,
+ 0xFE, 0xFF, 0x00, 0x00, 0xF2, 0xFF, 0xFE, 0xFF,
+ 0x01, 0x00, 0xEE, 0xFF, 0xFE, 0xFF, 0x03, 0x00,
+ 0xEA, 0xFF, 0xFE, 0xFF, 0x05, 0x00, 0xE6, 0xFF,
+ 0xFD, 0xFF, 0x07, 0x00, 0xE2, 0xFF, 0xFC, 0xFF,
+ 0x00, 0x00, 0x02, 0x00, 0xFA, 0xFF, 0x00, 0x00,
+ 0x06, 0x00, 0xFA, 0xFF, 0x00, 0x00, 0x0A, 0x00,
+ 0xFA, 0xFF, 0x00, 0x00, 0x0E, 0x00, 0xFA, 0xFF,
+ 0x01, 0x00, 0x12, 0x00, 0xFA, 0xFF, 0x03, 0x00,
+ 0x16, 0x00, 0xF9, 0xFF, 0x05, 0x00, 0x1A, 0x00,
+ 0xF6, 0xFF, 0x07, 0x00, 0x1E, 0x00, 0xF4, 0xFF,
+ 0x00, 0x00, 0xFE, 0xFF, 0xFA, 0xFF, 0x00, 0x00,
+ 0xFA, 0xFF, 0xFA, 0xFF, 0x00, 0x00, 0xF6, 0xFF,
+ 0xFA, 0xFF, 0x00, 0x00, 0xF2, 0xFF, 0xFA, 0xFF,
+ 0x01, 0x00, 0xEE, 0xFF, 0xFA, 0xFF, 0x03, 0x00,
+ 0xEA, 0xFF, 0xF9, 0xFF, 0x05, 0x00, 0xE6, 0xFF,
+ 0xF6, 0xFF, 0x07, 0x00, 0xE2, 0xFF, 0xF4, 0xFF,
+ 0x00, 0x00, 0x02, 0x00, 0xF6, 0xFF, 0x00, 0x00,
+ 0x06, 0x00, 0xF6, 0xFF, 0x00, 0x00, 0x0A, 0x00,
+ 0xF6, 0xFF, 0x00, 0x00, 0x0E, 0x00, 0xF6, 0xFF,
+ 0x01, 0x00, 0x12, 0x00, 0xF5, 0xFF, 0x03, 0x00,
+ 0x16, 0x00, 0xF3, 0xFF, 0x05, 0x00, 0x1A, 0x00,
+ 0xEF, 0xFF, 0x07, 0x00, 0x1E, 0x00, 0xEB, 0xFF,
+ 0x00, 0x00, 0xFE, 0xFF, 0xF6, 0xFF, 0x00, 0x00,
+ 0xFA, 0xFF, 0xF6, 0xFF, 0x00, 0x00, 0xF6, 0xFF,
+ 0xF6, 0xFF, 0x00, 0x00, 0xF2, 0xFF, 0xF6, 0xFF,
+ 0x01, 0x00, 0xEE, 0xFF, 0xF5, 0xFF, 0x03, 0x00,
+ 0xEA, 0xFF, 0xF3, 0xFF, 0x05, 0x00, 0xE6, 0xFF,
+ 0xEF, 0xFF, 0x07, 0x00, 0xE2, 0xFF, 0xEB, 0xFF,
+ 0x00, 0x00, 0x02, 0x00, 0xF2, 0xFF, 0x00, 0x00,
+ 0x06, 0x00, 0xF2, 0xFF, 0x00, 0x00, 0x0A, 0x00,
+ 0xF2, 0xFF, 0x00, 0x00, 0x0E, 0x00, 0xF2, 0xFF,
+ 0x01, 0x00, 0x12, 0x00, 0xF1, 0xFF, 0x03, 0x00,
+ 0x16, 0x00, 0xEE, 0xFF, 0x05, 0x00, 0x1A, 0x00,
+ 0xE8, 0xFF, 0x07, 0x00, 0x1E, 0x00, 0xE3, 0xFF,
+ 0x00, 0x00, 0xFE, 0xFF, 0xF2, 0xFF, 0x00, 0x00,
+ 0xFA, 0xFF, 0xF2, 0xFF, 0x00, 0x00, 0xF6, 0xFF,
+ 0xF2, 0xFF, 0x00, 0x00, 0xF2, 0xFF, 0xF2, 0xFF,
+ 0x01, 0x00, 0xEE, 0xFF, 0xF1, 0xFF, 0x03, 0x00,
+ 0xEA, 0xFF, 0xEE, 0xFF, 0x05, 0x00, 0xE6, 0xFF,
+ 0xE8, 0xFF, 0x07, 0x00, 0xE2, 0xFF, 0xE3, 0xFF,
+ 0x02, 0x00, 0x02, 0x00, 0xEE, 0xFF, 0x02, 0x00,
+ 0x06, 0x00, 0xEE, 0xFF, 0x02, 0x00, 0x0A, 0x00,
+ 0xEE, 0xFF, 0x02, 0x00, 0x0E, 0x00, 0xEE, 0xFF,
+ 0x04, 0x00, 0x12, 0x00, 0xEB, 0xFF, 0x06, 0x00,
+ 0x16, 0x00, 0xE7, 0xFF, 0x08, 0x00, 0x1A, 0x00,
+ 0xE1, 0xFF, 0x0A, 0x00, 0x1E, 0x00, 0xDA, 0xFF,
+ 0x02, 0x00, 0xFE, 0xFF, 0xEE, 0xFF, 0x02, 0x00,
+ 0xFA, 0xFF, 0xEE, 0xFF, 0x02, 0x00, 0xF6, 0xFF,
+ 0xEE, 0xFF, 0x02, 0x00, 0xF2, 0xFF, 0xEE, 0xFF,
+ 0x04, 0x00, 0xEE, 0xFF, 0xEB, 0xFF, 0x06, 0x00,
+ 0xEA, 0xFF, 0xE7, 0xFF, 0x08, 0x00, 0xE6, 0xFF,
+ 0xE1, 0xFF, 0x0A, 0x00, 0xE2, 0xFF, 0xDA, 0xFF,
+ 0x04, 0x00, 0x02, 0x00, 0xEA, 0xFF, 0x04, 0x00,
+ 0x06, 0x00, 0xEA, 0xFF, 0x04, 0x00, 0x0A, 0x00,
+ 0xEA, 0xFF, 0x04, 0x00, 0x0E, 0x00, 0xEA, 0xFF,
+ 0x06, 0x00, 0x12, 0x00, 0xE7, 0xFF, 0x08, 0x00,
+ 0x16, 0x00, 0xE2, 0xFF, 0x0A, 0x00, 0x1A, 0x00,
+ 0xDA, 0xFF, 0x0C, 0x00, 0x1E, 0x00, 0xD2, 0xFF,
+ 0x04, 0x00, 0xFE, 0xFF, 0xEA, 0xFF, 0x04, 0x00,
+ 0xFA, 0xFF, 0xEA, 0xFF, 0x04, 0x00, 0xF6, 0xFF,
+ 0xEA, 0xFF, 0x04, 0x00, 0xF2, 0xFF, 0xEA, 0xFF,
+ 0x06, 0x00, 0xEE, 0xFF, 0xE7, 0xFF, 0x08, 0x00,
+ 0xEA, 0xFF, 0xE2, 0xFF, 0x0A, 0x00, 0xE6, 0xFF,
+ 0xDA, 0xFF, 0x0C, 0x00, 0xE2, 0xFF, 0xD2, 0xFF,
+ 0x06, 0x00, 0x02, 0x00, 0xE6, 0xFF, 0x06, 0x00,
+ 0x06, 0x00, 0xE6, 0xFF, 0x06, 0x00, 0x0A, 0x00,
+ 0xE6, 0xFF, 0x06, 0x00, 0x0E, 0x00, 0xE6, 0xFF,
+ 0x08, 0x00, 0x12, 0x00, 0xE2, 0xFF, 0x0A, 0x00,
+ 0x16, 0x00, 0xDC, 0xFF, 0x0C, 0x00, 0x1A, 0x00,
+ 0xD3, 0xFF, 0x0E, 0x00, 0x1E, 0x00, 0xC9, 0xFF,
+ 0x06, 0x00, 0xFE, 0xFF, 0xE6, 0xFF, 0x06, 0x00,
+ 0xFA, 0xFF, 0xE6, 0xFF, 0x06, 0x00, 0xF6, 0xFF,
+ 0xE6, 0xFF, 0x06, 0x00, 0xF2, 0xFF, 0xE6, 0xFF,
+ 0x08, 0x00, 0xEE, 0xFF, 0xE2, 0xFF, 0x0A, 0x00,
+ 0xEA, 0xFF, 0xDC, 0xFF, 0x0C, 0x00, 0xE6, 0xFF,
+ 0xD3, 0xFF, 0x0E, 0x00, 0xE2, 0xFF, 0xC9, 0xFF,
+ 0x08, 0x00, 0x02, 0x00, 0xE2, 0xFF, 0x08, 0x00,
+ 0x06, 0x00, 0xE2, 0xFF, 0x08, 0x00, 0x0A, 0x00,
+ 0xE2, 0xFF, 0x08, 0x00, 0x0E, 0x00, 0xE2, 0xFF,
+ 0x0A, 0x00, 0x12, 0x00, 0xDE, 0xFF, 0x0C, 0x00,
+ 0x16, 0x00, 0xD7, 0xFF, 0x0E, 0x00, 0x1A, 0x00,
+ 0xCC, 0xFF, 0x10, 0x00, 0x1E, 0x00, 0xC1, 0xFF,
+ 0x08, 0x00, 0xFE, 0xFF, 0xE2, 0xFF, 0x08, 0x00,
+ 0xFA, 0xFF, 0xE2, 0xFF, 0x08, 0x00, 0xF6, 0xFF,
+ 0xE2, 0xFF, 0x08, 0x00, 0xF2, 0xFF, 0xE2, 0xFF,
+ 0x0A, 0x00, 0xEE, 0xFF, 0xDE, 0xFF, 0x0C, 0x00,
+ 0xEA, 0xFF, 0xD7, 0xFF, 0x0E, 0x00, 0xE6, 0xFF,
+ 0xCC, 0xFF, 0x10, 0x00, 0xE2, 0xFF, 0xC1, 0xFF,
+ 0x00, 0x00, 0x02, 0x00, 0x02, 0x00, 0x00, 0x00,
+ 0x06, 0x00, 0x02, 0x00, 0x00, 0x00, 0x0A, 0x00,
+ 0x02, 0x00, 0x00, 0x00, 0x0E, 0x00, 0x02, 0x00,
+ 0x02, 0x00, 0x13, 0x00, 0x02, 0x00, 0x04, 0x00,
+ 0x17, 0x00, 0x03, 0x00, 0x06, 0x00, 0x1B, 0x00,
+ 0x03, 0x00, 0x08, 0x00, 0x1F, 0x00, 0x04, 0x00,
+ 0x00, 0x00, 0xFE, 0xFF, 0x02, 0x00, 0x00, 0x00,
+ 0xFA, 0xFF, 0x02, 0x00, 0x00, 0x00, 0xF6, 0xFF,
+ 0x02, 0x00, 0x00, 0x00, 0xF2, 0xFF, 0x02, 0x00,
+ 0x02, 0x00, 0xED, 0xFF, 0x02, 0x00, 0x04, 0x00,
+ 0xE9, 0xFF, 0x03, 0x00, 0x06, 0x00, 0xE5, 0xFF,
+ 0x03, 0x00, 0x08, 0x00, 0xE1, 0xFF, 0x04, 0x00,
+ 0x00, 0x00, 0x02, 0x00, 0x06, 0x00, 0x00, 0x00,
+ 0x06, 0x00, 0x06, 0x00, 0x00, 0x00, 0x0A, 0x00,
+ 0x06, 0x00, 0x00, 0x00, 0x0E, 0x00, 0x06, 0x00,
+ 0x02, 0x00, 0x13, 0x00, 0x07, 0x00, 0x04, 0x00,
+ 0x17, 0x00, 0x09, 0x00, 0x06, 0x00, 0x1B, 0x00,
+ 0x0A, 0x00, 0x08, 0x00, 0x1F, 0x00, 0x0D, 0x00,
+ 0x00, 0x00, 0xFE, 0xFF, 0x06, 0x00, 0x00, 0x00,
+ 0xFA, 0xFF, 0x06, 0x00, 0x00, 0x00, 0xF6, 0xFF,
+ 0x06, 0x00, 0x00, 0x00, 0xF2, 0xFF, 0x06, 0x00,
+ 0x02, 0x00, 0xED, 0xFF, 0x07, 0x00, 0x04, 0x00,
+ 0xE9, 0xFF, 0x09, 0x00, 0x06, 0x00, 0xE5, 0xFF,
+ 0x0A, 0x00, 0x08, 0x00, 0xE1, 0xFF, 0x0D, 0x00,
+ 0x00, 0x00, 0x02, 0x00, 0x0A, 0x00, 0x00, 0x00,
+ 0x06, 0x00, 0x0A, 0x00, 0x00, 0x00, 0x0A, 0x00,
+ 0x0A, 0x00, 0x00, 0x00, 0x0E, 0x00, 0x0A, 0x00,
+ 0x02, 0x00, 0x13, 0x00, 0x0C, 0x00, 0x04, 0x00,
+ 0x17, 0x00, 0x0F, 0x00, 0x06, 0x00, 0x1B, 0x00,
+ 0x12, 0x00, 0x08, 0x00, 0x1F, 0x00, 0x16, 0x00,
+ 0x00, 0x00, 0xFE, 0xFF, 0x0A, 0x00, 0x00, 0x00,
+ 0xFA, 0xFF, 0x0A, 0x00, 0x00, 0x00, 0xF6, 0xFF,
+ 0x0A, 0x00, 0x00, 0x00, 0xF2, 0xFF, 0x0A, 0x00,
+ 0x02, 0x00, 0xED, 0xFF, 0x0C, 0x00, 0x04, 0x00,
+ 0xE9, 0xFF, 0x0F, 0x00, 0x06, 0x00, 0xE5, 0xFF,
+ 0x12, 0x00, 0x08, 0x00, 0xE1, 0xFF, 0x16, 0x00,
+ 0x00, 0x00, 0x02, 0x00, 0x0E, 0x00, 0x00, 0x00,
+ 0x06, 0x00, 0x0E, 0x00, 0x00, 0x00, 0x0A, 0x00,
+ 0x0E, 0x00, 0x00, 0x00, 0x0E, 0x00, 0x0E, 0x00,
+ 0x02, 0x00, 0x13, 0x00, 0x11, 0x00, 0x04, 0x00,
+ 0x17, 0x00, 0x15, 0x00, 0x06, 0x00, 0x1B, 0x00,
+ 0x19, 0x00, 0x08, 0x00, 0x1F, 0x00, 0x1F, 0x00,
+ 0x00, 0x00, 0xFE, 0xFF, 0x0E, 0x00, 0x00, 0x00,
+ 0xFA, 0xFF, 0x0E, 0x00, 0x00, 0x00, 0xF6, 0xFF,
+ 0x0E, 0x00, 0x00, 0x00, 0xF2, 0xFF, 0x0E, 0x00,
+ 0x02, 0x00, 0xED, 0xFF, 0x11, 0x00, 0x04, 0x00,
+ 0xE9, 0xFF, 0x15, 0x00, 0x06, 0x00, 0xE5, 0xFF,
+ 0x19, 0x00, 0x08, 0x00, 0xE1, 0xFF, 0x1F, 0x00,
+ 0x02, 0x00, 0x02, 0x00, 0x12, 0x00, 0x02, 0x00,
+ 0x06, 0x00, 0x12, 0x00, 0x02, 0x00, 0x0A, 0x00,
+ 0x12, 0x00, 0x02, 0x00, 0x0E, 0x00, 0x12, 0x00,
+ 0x05, 0x00, 0x13, 0x00, 0x17, 0x00, 0x07, 0x00,
+ 0x17, 0x00, 0x1C, 0x00, 0x09, 0x00, 0x1B, 0x00,
+ 0x22, 0x00, 0x0B, 0x00, 0x1F, 0x00, 0x29, 0x00,
+ 0x02, 0x00, 0xFE, 0xFF, 0x12, 0x00, 0x02, 0x00,
+ 0xFA, 0xFF, 0x12, 0x00, 0x02, 0x00, 0xF6, 0xFF,
+ 0x12, 0x00, 0x02, 0x00, 0xF2, 0xFF, 0x12, 0x00,
+ 0x05, 0x00, 0xED, 0xFF, 0x17, 0x00, 0x07, 0x00,
+ 0xE9, 0xFF, 0x1C, 0x00, 0x09, 0x00, 0xE5, 0xFF,
+ 0x22, 0x00, 0x0B, 0x00, 0xE1, 0xFF, 0x29, 0x00,
+ 0x04, 0x00, 0x02, 0x00, 0x16, 0x00, 0x04, 0x00,
+ 0x06, 0x00, 0x16, 0x00, 0x04, 0x00, 0x0A, 0x00,
+ 0x16, 0x00, 0x04, 0x00, 0x0E, 0x00, 0x16, 0x00,
+ 0x07, 0x00, 0x13, 0x00, 0x1C, 0x00, 0x09, 0x00,
+ 0x17, 0x00, 0x22, 0x00, 0x0B, 0x00, 0x1B, 0x00,
+ 0x29, 0x00, 0x0D, 0x00, 0x1F, 0x00, 0x32, 0x00,
+ 0x04, 0x00, 0xFE, 0xFF, 0x16, 0x00, 0x04, 0x00,
+ 0xFA, 0xFF, 0x16, 0x00, 0x04, 0x00, 0xF6, 0xFF,
+ 0x16, 0x00, 0x04, 0x00, 0xF2, 0xFF, 0x16, 0x00,
+ 0x07, 0x00, 0xED, 0xFF, 0x1C, 0x00, 0x09, 0x00,
+ 0xE9, 0xFF, 0x22, 0x00, 0x0B, 0x00, 0xE5, 0xFF,
+ 0x29, 0x00, 0x0D, 0x00, 0xE1, 0xFF, 0x32, 0x00,
+ 0x06, 0x00, 0x02, 0x00, 0x1A, 0x00, 0x06, 0x00,
+ 0x06, 0x00, 0x1A, 0x00, 0x06, 0x00, 0x0A, 0x00,
+ 0x1A, 0x00, 0x06, 0x00, 0x0E, 0x00, 0x1A, 0x00,
+ 0x09, 0x00, 0x13, 0x00, 0x21, 0x00, 0x0B, 0x00,
+ 0x17, 0x00, 0x28, 0x00, 0x0D, 0x00, 0x1B, 0x00,
+ 0x31, 0x00, 0x0F, 0x00, 0x1F, 0x00, 0x3B, 0x00,
+ 0x06, 0x00, 0xFE, 0xFF, 0x1A, 0x00, 0x06, 0x00,
+ 0xFA, 0xFF, 0x1A, 0x00, 0x06, 0x00, 0xF6, 0xFF,
+ 0x1A, 0x00, 0x06, 0x00, 0xF2, 0xFF, 0x1A, 0x00,
+ 0x09, 0x00, 0xED, 0xFF, 0x21, 0x00, 0x0B, 0x00,
+ 0xE9, 0xFF, 0x28, 0x00, 0x0D, 0x00, 0xE5, 0xFF,
+ 0x31, 0x00, 0x0F, 0x00, 0xE1, 0xFF, 0x3B, 0x00,
+ 0x08, 0x00, 0x02, 0x00, 0x1E, 0x00, 0x08, 0x00,
+ 0x06, 0x00, 0x1E, 0x00, 0x08, 0x00, 0x0A, 0x00,
+ 0x1E, 0x00, 0x08, 0x00, 0x0E, 0x00, 0x1E, 0x00,
+ 0x0B, 0x00, 0x13, 0x00, 0x26, 0x00, 0x0D, 0x00,
+ 0x17, 0x00, 0x2E, 0x00, 0x0F, 0x00, 0x1B, 0x00,
+ 0x38, 0x00, 0x11, 0x00, 0x1F, 0x00, 0x44, 0x00,
+ 0x08, 0x00, 0xFE, 0xFF, 0x1E, 0x00, 0x08, 0x00,
+ 0xFA, 0xFF, 0x1E, 0x00, 0x08, 0x00, 0xF6, 0xFF,
+ 0x1E, 0x00, 0x08, 0x00, 0xF2, 0xFF, 0x1E, 0x00,
+ 0x0B, 0x00, 0xED, 0xFF, 0x26, 0x00, 0x0D, 0x00,
+ 0xE9, 0xFF, 0x2E, 0x00, 0x0F, 0x00, 0xE5, 0xFF,
+ 0x38, 0x00, 0x11, 0x00, 0xE1, 0xFF, 0x44, 0x00,
+ 0x00, 0x00, 0x02, 0x00, 0xFE, 0xFF, 0x00, 0x00,
+ 0x06, 0x00, 0xFE, 0xFF, 0x00, 0x00, 0x0A, 0x00,
+ 0xFE, 0xFF, 0x00, 0x00, 0x0E, 0x00, 0xFE, 0xFF,
+ 0x02, 0x00, 0x13, 0x00, 0xFE, 0xFF, 0x04, 0x00,
+ 0x17, 0x00, 0xFD, 0xFF, 0x06, 0x00, 0x1B, 0x00,
+ 0xFD, 0xFF, 0x08, 0x00, 0x1F, 0x00, 0xFC, 0xFF,
+ 0x00, 0x00, 0xFE, 0xFF, 0xFE, 0xFF, 0x00, 0x00,
+ 0xFA, 0xFF, 0xFE, 0xFF, 0x00, 0x00, 0xF6, 0xFF,
+ 0xFE, 0xFF, 0x00, 0x00, 0xF2, 0xFF, 0xFE, 0xFF,
+ 0x02, 0x00, 0xED, 0xFF, 0xFE, 0xFF, 0x04, 0x00,
+ 0xE9, 0xFF, 0xFD, 0xFF, 0x06, 0x00, 0xE5, 0xFF,
+ 0xFD, 0xFF, 0x08, 0x00, 0xE1, 0xFF, 0xFC, 0xFF,
+ 0x00, 0x00, 0x02, 0x00, 0xFA, 0xFF, 0x00, 0x00,
+ 0x06, 0x00, 0xFA, 0xFF, 0x00, 0x00, 0x0A, 0x00,
+ 0xFA, 0xFF, 0x00, 0x00, 0x0E, 0x00, 0xFA, 0xFF,
+ 0x02, 0x00, 0x13, 0x00, 0xF9, 0xFF, 0x04, 0x00,
+ 0x17, 0x00, 0xF7, 0xFF, 0x06, 0x00, 0x1B, 0x00,
+ 0xF6, 0xFF, 0x08, 0x00, 0x1F, 0x00, 0xF3, 0xFF,
+ 0x00, 0x00, 0xFE, 0xFF, 0xFA, 0xFF, 0x00, 0x00,
+ 0xFA, 0xFF, 0xFA, 0xFF, 0x00, 0x00, 0xF6, 0xFF,
+ 0xFA, 0xFF, 0x00, 0x00, 0xF2, 0xFF, 0xFA, 0xFF,
+ 0x02, 0x00, 0xED, 0xFF, 0xF9, 0xFF, 0x04, 0x00,
+ 0xE9, 0xFF, 0xF7, 0xFF, 0x06, 0x00, 0xE5, 0xFF,
+ 0xF6, 0xFF, 0x08, 0x00, 0xE1, 0xFF, 0xF3, 0xFF,
+ 0x00, 0x00, 0x02, 0x00, 0xF6, 0xFF, 0x00, 0x00,
+ 0x06, 0x00, 0xF6, 0xFF, 0x00, 0x00, 0x0A, 0x00,
+ 0xF6, 0xFF, 0x00, 0x00, 0x0E, 0x00, 0xF6, 0xFF,
+ 0x02, 0x00, 0x13, 0x00, 0xF4, 0xFF, 0x04, 0x00,
+ 0x17, 0x00, 0xF1, 0xFF, 0x06, 0x00, 0x1B, 0x00,
+ 0xEE, 0xFF, 0x08, 0x00, 0x1F, 0x00, 0xEA, 0xFF,
+ 0x00, 0x00, 0xFE, 0xFF, 0xF6, 0xFF, 0x00, 0x00,
+ 0xFA, 0xFF, 0xF6, 0xFF, 0x00, 0x00, 0xF6, 0xFF,
+ 0xF6, 0xFF, 0x00, 0x00, 0xF2, 0xFF, 0xF6, 0xFF,
+ 0x02, 0x00, 0xED, 0xFF, 0xF4, 0xFF, 0x04, 0x00,
+ 0xE9, 0xFF, 0xF1, 0xFF, 0x06, 0x00, 0xE5, 0xFF,
+ 0xEE, 0xFF, 0x08, 0x00, 0xE1, 0xFF, 0xEA, 0xFF,
+ 0x00, 0x00, 0x02, 0x00, 0xF2, 0xFF, 0x00, 0x00,
+ 0x06, 0x00, 0xF2, 0xFF, 0x00, 0x00, 0x0A, 0x00,
+ 0xF2, 0xFF, 0x00, 0x00, 0x0E, 0x00, 0xF2, 0xFF,
+ 0x02, 0x00, 0x13, 0x00, 0xEF, 0xFF, 0x04, 0x00,
+ 0x17, 0x00, 0xEB, 0xFF, 0x06, 0x00, 0x1B, 0x00,
+ 0xE7, 0xFF, 0x08, 0x00, 0x1F, 0x00, 0xE1, 0xFF,
+ 0x00, 0x00, 0xFE, 0xFF, 0xF2, 0xFF, 0x00, 0x00,
+ 0xFA, 0xFF, 0xF2, 0xFF, 0x00, 0x00, 0xF6, 0xFF,
+ 0xF2, 0xFF, 0x00, 0x00, 0xF2, 0xFF, 0xF2, 0xFF,
+ 0x02, 0x00, 0xED, 0xFF, 0xEF, 0xFF, 0x04, 0x00,
+ 0xE9, 0xFF, 0xEB, 0xFF, 0x06, 0x00, 0xE5, 0xFF,
+ 0xE7, 0xFF, 0x08, 0x00, 0xE1, 0xFF, 0xE1, 0xFF,
+ 0x02, 0x00, 0x02, 0x00, 0xEE, 0xFF, 0x02, 0x00,
+ 0x06, 0x00, 0xEE, 0xFF, 0x02, 0x00, 0x0A, 0x00,
+ 0xEE, 0xFF, 0x02, 0x00, 0x0E, 0x00, 0xEE, 0xFF,
+ 0x05, 0x00, 0x13, 0x00, 0xE9, 0xFF, 0x07, 0x00,
+ 0x17, 0x00, 0xE4, 0xFF, 0x09, 0x00, 0x1B, 0x00,
+ 0xDE, 0xFF, 0x0B, 0x00, 0x1F, 0x00, 0xD7, 0xFF,
+ 0x02, 0x00, 0xFE, 0xFF, 0xEE, 0xFF, 0x02, 0x00,
+ 0xFA, 0xFF, 0xEE, 0xFF, 0x02, 0x00, 0xF6, 0xFF,
+ 0xEE, 0xFF, 0x02, 0x00, 0xF2, 0xFF, 0xEE, 0xFF,
+ 0x05, 0x00, 0xED, 0xFF, 0xE9, 0xFF, 0x07, 0x00,
+ 0xE9, 0xFF, 0xE4, 0xFF, 0x09, 0x00, 0xE5, 0xFF,
+ 0xDE, 0xFF, 0x0B, 0x00, 0xE1, 0xFF, 0xD7, 0xFF,
+ 0x04, 0x00, 0x02, 0x00, 0xEA, 0xFF, 0x04, 0x00,
+ 0x06, 0x00, 0xEA, 0xFF, 0x04, 0x00, 0x0A, 0x00,
+ 0xEA, 0xFF, 0x04, 0x00, 0x0E, 0x00, 0xEA, 0xFF,
+ 0x07, 0x00, 0x13, 0x00, 0xE4, 0xFF, 0x09, 0x00,
+ 0x17, 0x00, 0xDE, 0xFF, 0x0B, 0x00, 0x1B, 0x00,
+ 0xD7, 0xFF, 0x0D, 0x00, 0x1F, 0x00, 0xCE, 0xFF,
+ 0x04, 0x00, 0xFE, 0xFF, 0xEA, 0xFF, 0x04, 0x00,
+ 0xFA, 0xFF, 0xEA, 0xFF, 0x04, 0x00, 0xF6, 0xFF,
+ 0xEA, 0xFF, 0x04, 0x00, 0xF2, 0xFF, 0xEA, 0xFF,
+ 0x07, 0x00, 0xED, 0xFF, 0xE4, 0xFF, 0x09, 0x00,
+ 0xE9, 0xFF, 0xDE, 0xFF, 0x0B, 0x00, 0xE5, 0xFF,
+ 0xD7, 0xFF, 0x0D, 0x00, 0xE1, 0xFF, 0xCE, 0xFF,
+ 0x06, 0x00, 0x02, 0x00, 0xE6, 0xFF, 0x06, 0x00,
+ 0x06, 0x00, 0xE6, 0xFF, 0x06, 0x00, 0x0A, 0x00,
+ 0xE6, 0xFF, 0x06, 0x00, 0x0E, 0x00, 0xE6, 0xFF,
+ 0x09, 0x00, 0x13, 0x00, 0xDF, 0xFF, 0x0B, 0x00,
+ 0x17, 0x00, 0xD8, 0xFF, 0x0D, 0x00, 0x1B, 0x00,
+ 0xCF, 0xFF, 0x0F, 0x00, 0x1F, 0x00, 0xC5, 0xFF,
+ 0x06, 0x00, 0xFE, 0xFF, 0xE6, 0xFF, 0x06, 0x00,
+ 0xFA, 0xFF, 0xE6, 0xFF, 0x06, 0x00, 0xF6, 0xFF,
+ 0xE6, 0xFF, 0x06, 0x00, 0xF2, 0xFF, 0xE6, 0xFF,
+ 0x09, 0x00, 0xED, 0xFF, 0xDF, 0xFF, 0x0B, 0x00,
+ 0xE9, 0xFF, 0xD8, 0xFF, 0x0D, 0x00, 0xE5, 0xFF,
+ 0xCF, 0xFF, 0x0F, 0x00, 0xE1, 0xFF, 0xC5, 0xFF,
+ 0x08, 0x00, 0x02, 0x00, 0xE2, 0xFF, 0x08, 0x00,
+ 0x06, 0x00, 0xE2, 0xFF, 0x08, 0x00, 0x0A, 0x00,
+ 0xE2, 0xFF, 0x08, 0x00, 0x0E, 0x00, 0xE2, 0xFF,
+ 0x0B, 0x00, 0x13, 0x00, 0xDA, 0xFF, 0x0D, 0x00,
+ 0x17, 0x00, 0xD2, 0xFF, 0x0F, 0x00, 0x1B, 0x00,
+ 0xC8, 0xFF, 0x11, 0x00, 0x1F, 0x00, 0xBC, 0xFF,
+ 0x08, 0x00, 0xFE, 0xFF, 0xE2, 0xFF, 0x08, 0x00,
+ 0xFA, 0xFF, 0xE2, 0xFF, 0x08, 0x00, 0xF6, 0xFF,
+ 0xE2, 0xFF, 0x08, 0x00, 0xF2, 0xFF, 0xE2, 0xFF,
+ 0x0B, 0x00, 0xED, 0xFF, 0xDA, 0xFF, 0x0D, 0x00,
+ 0xE9, 0xFF, 0xD2, 0xFF, 0x0F, 0x00, 0xE5, 0xFF,
+ 0xC8, 0xFF, 0x11, 0x00, 0xE1, 0xFF, 0xBC, 0xFF,
+ 0x00, 0x00, 0x02, 0x00, 0x02, 0x00, 0x00, 0x00,
+ 0x06, 0x00, 0x02, 0x00, 0x00, 0x00, 0x0B, 0x00,
+ 0x02, 0x00, 0x00, 0x00, 0x0F, 0x00, 0x02, 0x00,
+ 0x03, 0x00, 0x15, 0x00, 0x02, 0x00, 0x05, 0x00,
+ 0x19, 0x00, 0x03, 0x00, 0x07, 0x00, 0x1E, 0x00,
+ 0x04, 0x00, 0x09, 0x00, 0x22, 0x00, 0x05, 0x00,
+ 0x00, 0x00, 0xFE, 0xFF, 0x02, 0x00, 0x00, 0x00,
+ 0xFA, 0xFF, 0x02, 0x00, 0x00, 0x00, 0xF5, 0xFF,
+ 0x02, 0x00, 0x00, 0x00, 0xF1, 0xFF, 0x02, 0x00,
+ 0x03, 0x00, 0xEB, 0xFF, 0x02, 0x00, 0x05, 0x00,
+ 0xE7, 0xFF, 0x03, 0x00, 0x07, 0x00, 0xE2, 0xFF,
+ 0x04, 0x00, 0x09, 0x00, 0xDE, 0xFF, 0x05, 0x00,
+ 0x00, 0x00, 0x02, 0x00, 0x06, 0x00, 0x00, 0x00,
+ 0x06, 0x00, 0x06, 0x00, 0x00, 0x00, 0x0B, 0x00,
+ 0x06, 0x00, 0x00, 0x00, 0x0F, 0x00, 0x06, 0x00,
+ 0x03, 0x00, 0x15, 0x00, 0x07, 0x00, 0x05, 0x00,
+ 0x19, 0x00, 0x0A, 0x00, 0x07, 0x00, 0x1E, 0x00,
+ 0x0C, 0x00, 0x09, 0x00, 0x22, 0x00, 0x0F, 0x00,
+ 0x00, 0x00, 0xFE, 0xFF, 0x06, 0x00, 0x00, 0x00,
+ 0xFA, 0xFF, 0x06, 0x00, 0x00, 0x00, 0xF5, 0xFF,
+ 0x06, 0x00, 0x00, 0x00, 0xF1, 0xFF, 0x06, 0x00,
+ 0x03, 0x00, 0xEB, 0xFF, 0x07, 0x00, 0x05, 0x00,
+ 0xE7, 0xFF, 0x0A, 0x00, 0x07, 0x00, 0xE2, 0xFF,
+ 0x0C, 0x00, 0x09, 0x00, 0xDE, 0xFF, 0x0F, 0x00,
+ 0x00, 0x00, 0x02, 0x00, 0x0A, 0x00, 0x00, 0x00,
+ 0x06, 0x00, 0x0A, 0x00, 0x00, 0x00, 0x0B, 0x00,
+ 0x0A, 0x00, 0x00, 0x00, 0x0F, 0x00, 0x0A, 0x00,
+ 0x03, 0x00, 0x15, 0x00, 0x0D, 0x00, 0x05, 0x00,
+ 0x19, 0x00, 0x11, 0x00, 0x07, 0x00, 0x1E, 0x00,
+ 0x15, 0x00, 0x09, 0x00, 0x22, 0x00, 0x19, 0x00,
+ 0x00, 0x00, 0xFE, 0xFF, 0x0A, 0x00, 0x00, 0x00,
+ 0xFA, 0xFF, 0x0A, 0x00, 0x00, 0x00, 0xF5, 0xFF,
+ 0x0A, 0x00, 0x00, 0x00, 0xF1, 0xFF, 0x0A, 0x00,
+ 0x03, 0x00, 0xEB, 0xFF, 0x0D, 0x00, 0x05, 0x00,
+ 0xE7, 0xFF, 0x11, 0x00, 0x07, 0x00, 0xE2, 0xFF,
+ 0x15, 0x00, 0x09, 0x00, 0xDE, 0xFF, 0x19, 0x00,
+ 0x00, 0x00, 0x02, 0x00, 0x0E, 0x00, 0x00, 0x00,
+ 0x06, 0x00, 0x0E, 0x00, 0x00, 0x00, 0x0B, 0x00,
+ 0x0E, 0x00, 0x00, 0x00, 0x0F, 0x00, 0x0E, 0x00,
+ 0x03, 0x00, 0x15, 0x00, 0x12, 0x00, 0x05, 0x00,
+ 0x19, 0x00, 0x18, 0x00, 0x07, 0x00, 0x1E, 0x00,
+ 0x1D, 0x00, 0x09, 0x00, 0x22, 0x00, 0x23, 0x00,
+ 0x00, 0x00, 0xFE, 0xFF, 0x0E, 0x00, 0x00, 0x00,
+ 0xFA, 0xFF, 0x0E, 0x00, 0x00, 0x00, 0xF5, 0xFF,
+ 0x0E, 0x00, 0x00, 0x00, 0xF1, 0xFF, 0x0E, 0x00,
+ 0x03, 0x00, 0xEB, 0xFF, 0x12, 0x00, 0x05, 0x00,
+ 0xE7, 0xFF, 0x18, 0x00, 0x07, 0x00, 0xE2, 0xFF,
+ 0x1D, 0x00, 0x09, 0x00, 0xDE, 0xFF, 0x23, 0x00,
+ 0x03, 0x00, 0x02, 0x00, 0x13, 0x00, 0x03, 0x00,
+ 0x06, 0x00, 0x13, 0x00, 0x03, 0x00, 0x0B, 0x00,
+ 0x13, 0x00, 0x03, 0x00, 0x0F, 0x00, 0x13, 0x00,
+ 0x06, 0x00, 0x15, 0x00, 0x19, 0x00, 0x08, 0x00,
+ 0x19, 0x00, 0x1F, 0x00, 0x0A, 0x00, 0x1E, 0x00,
+ 0x26, 0x00, 0x0C, 0x00, 0x22, 0x00, 0x2E, 0x00,
+ 0x03, 0x00, 0xFE, 0xFF, 0x13, 0x00, 0x03, 0x00,
+ 0xFA, 0xFF, 0x13, 0x00, 0x03, 0x00, 0xF5, 0xFF,
+ 0x13, 0x00, 0x03, 0x00, 0xF1, 0xFF, 0x13, 0x00,
+ 0x06, 0x00, 0xEB, 0xFF, 0x19, 0x00, 0x08, 0x00,
+ 0xE7, 0xFF, 0x1F, 0x00, 0x0A, 0x00, 0xE2, 0xFF,
+ 0x26, 0x00, 0x0C, 0x00, 0xDE, 0xFF, 0x2E, 0x00,
+ 0x05, 0x00, 0x02, 0x00, 0x17, 0x00, 0x05, 0x00,
+ 0x06, 0x00, 0x17, 0x00, 0x05, 0x00, 0x0B, 0x00,
+ 0x17, 0x00, 0x05, 0x00, 0x0F, 0x00, 0x17, 0x00,
+ 0x08, 0x00, 0x15, 0x00, 0x1E, 0x00, 0x0A, 0x00,
+ 0x19, 0x00, 0x26, 0x00, 0x0C, 0x00, 0x1E, 0x00,
+ 0x2E, 0x00, 0x0E, 0x00, 0x22, 0x00, 0x38, 0x00,
+ 0x05, 0x00, 0xFE, 0xFF, 0x17, 0x00, 0x05, 0x00,
+ 0xFA, 0xFF, 0x17, 0x00, 0x05, 0x00, 0xF5, 0xFF,
+ 0x17, 0x00, 0x05, 0x00, 0xF1, 0xFF, 0x17, 0x00,
+ 0x08, 0x00, 0xEB, 0xFF, 0x1E, 0x00, 0x0A, 0x00,
+ 0xE7, 0xFF, 0x26, 0x00, 0x0C, 0x00, 0xE2, 0xFF,
+ 0x2E, 0x00, 0x0E, 0x00, 0xDE, 0xFF, 0x38, 0x00,
+ 0x07, 0x00, 0x02, 0x00, 0x1B, 0x00, 0x07, 0x00,
+ 0x06, 0x00, 0x1B, 0x00, 0x07, 0x00, 0x0B, 0x00,
+ 0x1B, 0x00, 0x07, 0x00, 0x0F, 0x00, 0x1B, 0x00,
+ 0x0A, 0x00, 0x15, 0x00, 0x24, 0x00, 0x0C, 0x00,
+ 0x19, 0x00, 0x2D, 0x00, 0x0E, 0x00, 0x1E, 0x00,
+ 0x37, 0x00, 0x10, 0x00, 0x22, 0x00, 0x42, 0x00,
+ 0x07, 0x00, 0xFE, 0xFF, 0x1B, 0x00, 0x07, 0x00,
+ 0xFA, 0xFF, 0x1B, 0x00, 0x07, 0x00, 0xF5, 0xFF,
+ 0x1B, 0x00, 0x07, 0x00, 0xF1, 0xFF, 0x1B, 0x00,
+ 0x0A, 0x00, 0xEB, 0xFF, 0x24, 0x00, 0x0C, 0x00,
+ 0xE7, 0xFF, 0x2D, 0x00, 0x0E, 0x00, 0xE2, 0xFF,
+ 0x37, 0x00, 0x10, 0x00, 0xDE, 0xFF, 0x42, 0x00,
+ 0x09, 0x00, 0x02, 0x00, 0x1F, 0x00, 0x09, 0x00,
+ 0x06, 0x00, 0x1F, 0x00, 0x09, 0x00, 0x0B, 0x00,
+ 0x1F, 0x00, 0x09, 0x00, 0x0F, 0x00, 0x1F, 0x00,
+ 0x0C, 0x00, 0x15, 0x00, 0x29, 0x00, 0x0E, 0x00,
+ 0x19, 0x00, 0x34, 0x00, 0x10, 0x00, 0x1E, 0x00,
+ 0x3F, 0x00, 0x12, 0x00, 0x22, 0x00, 0x4C, 0x00,
+ 0x09, 0x00, 0xFE, 0xFF, 0x1F, 0x00, 0x09, 0x00,
+ 0xFA, 0xFF, 0x1F, 0x00, 0x09, 0x00, 0xF5, 0xFF,
+ 0x1F, 0x00, 0x09, 0x00, 0xF1, 0xFF, 0x1F, 0x00,
+ 0x0C, 0x00, 0xEB, 0xFF, 0x29, 0x00, 0x0E, 0x00,
+ 0xE7, 0xFF, 0x34, 0x00, 0x10, 0x00, 0xE2, 0xFF,
+ 0x3F, 0x00, 0x12, 0x00, 0xDE, 0xFF, 0x4C, 0x00,
+ 0x00, 0x00, 0x02, 0x00, 0xFE, 0xFF, 0x00, 0x00,
+ 0x06, 0x00, 0xFE, 0xFF, 0x00, 0x00, 0x0B, 0x00,
+ 0xFE, 0xFF, 0x00, 0x00, 0x0F, 0x00, 0xFE, 0xFF,
+ 0x03, 0x00, 0x15, 0x00, 0xFE, 0xFF, 0x05, 0x00,
+ 0x19, 0x00, 0xFD, 0xFF, 0x07, 0x00, 0x1E, 0x00,
+ 0xFC, 0xFF, 0x09, 0x00, 0x22, 0x00, 0xFB, 0xFF,
+ 0x00, 0x00, 0xFE, 0xFF, 0xFE, 0xFF, 0x00, 0x00,
+ 0xFA, 0xFF, 0xFE, 0xFF, 0x00, 0x00, 0xF5, 0xFF,
+ 0xFE, 0xFF, 0x00, 0x00, 0xF1, 0xFF, 0xFE, 0xFF,
+ 0x03, 0x00, 0xEB, 0xFF, 0xFE, 0xFF, 0x05, 0x00,
+ 0xE7, 0xFF, 0xFD, 0xFF, 0x07, 0x00, 0xE2, 0xFF,
+ 0xFC, 0xFF, 0x09, 0x00, 0xDE, 0xFF, 0xFB, 0xFF,
+ 0x00, 0x00, 0x02, 0x00, 0xFA, 0xFF, 0x00, 0x00,
+ 0x06, 0x00, 0xFA, 0xFF, 0x00, 0x00, 0x0B, 0x00,
+ 0xFA, 0xFF, 0x00, 0x00, 0x0F, 0x00, 0xFA, 0xFF,
+ 0x03, 0x00, 0x15, 0x00, 0xF9, 0xFF, 0x05, 0x00,
+ 0x19, 0x00, 0xF6, 0xFF, 0x07, 0x00, 0x1E, 0x00,
+ 0xF4, 0xFF, 0x09, 0x00, 0x22, 0x00, 0xF1, 0xFF,
+ 0x00, 0x00, 0xFE, 0xFF, 0xFA, 0xFF, 0x00, 0x00,
+ 0xFA, 0xFF, 0xFA, 0xFF, 0x00, 0x00, 0xF5, 0xFF,
+ 0xFA, 0xFF, 0x00, 0x00, 0xF1, 0xFF, 0xFA, 0xFF,
+ 0x03, 0x00, 0xEB, 0xFF, 0xF9, 0xFF, 0x05, 0x00,
+ 0xE7, 0xFF, 0xF6, 0xFF, 0x07, 0x00, 0xE2, 0xFF,
+ 0xF4, 0xFF, 0x09, 0x00, 0xDE, 0xFF, 0xF1, 0xFF,
+ 0x00, 0x00, 0x02, 0x00, 0xF6, 0xFF, 0x00, 0x00,
+ 0x06, 0x00, 0xF6, 0xFF, 0x00, 0x00, 0x0B, 0x00,
+ 0xF6, 0xFF, 0x00, 0x00, 0x0F, 0x00, 0xF6, 0xFF,
+ 0x03, 0x00, 0x15, 0x00, 0xF3, 0xFF, 0x05, 0x00,
+ 0x19, 0x00, 0xEF, 0xFF, 0x07, 0x00, 0x1E, 0x00,
+ 0xEB, 0xFF, 0x09, 0x00, 0x22, 0x00, 0xE7, 0xFF,
+ 0x00, 0x00, 0xFE, 0xFF, 0xF6, 0xFF, 0x00, 0x00,
+ 0xFA, 0xFF, 0xF6, 0xFF, 0x00, 0x00, 0xF5, 0xFF,
+ 0xF6, 0xFF, 0x00, 0x00, 0xF1, 0xFF, 0xF6, 0xFF,
+ 0x03, 0x00, 0xEB, 0xFF, 0xF3, 0xFF, 0x05, 0x00,
+ 0xE7, 0xFF, 0xEF, 0xFF, 0x07, 0x00, 0xE2, 0xFF,
+ 0xEB, 0xFF, 0x09, 0x00, 0xDE, 0xFF, 0xE7, 0xFF,
+ 0x00, 0x00, 0x02, 0x00, 0xF2, 0xFF, 0x00, 0x00,
+ 0x06, 0x00, 0xF2, 0xFF, 0x00, 0x00, 0x0B, 0x00,
+ 0xF2, 0xFF, 0x00, 0x00, 0x0F, 0x00, 0xF2, 0xFF,
+ 0x03, 0x00, 0x15, 0x00, 0xEE, 0xFF, 0x05, 0x00,
+ 0x19, 0x00, 0xE8, 0xFF, 0x07, 0x00, 0x1E, 0x00,
+ 0xE3, 0xFF, 0x09, 0x00, 0x22, 0x00, 0xDD, 0xFF,
+ 0x00, 0x00, 0xFE, 0xFF, 0xF2, 0xFF, 0x00, 0x00,
+ 0xFA, 0xFF, 0xF2, 0xFF, 0x00, 0x00, 0xF5, 0xFF,
+ 0xF2, 0xFF, 0x00, 0x00, 0xF1, 0xFF, 0xF2, 0xFF,
+ 0x03, 0x00, 0xEB, 0xFF, 0xEE, 0xFF, 0x05, 0x00,
+ 0xE7, 0xFF, 0xE8, 0xFF, 0x07, 0x00, 0xE2, 0xFF,
+ 0xE3, 0xFF, 0x09, 0x00, 0xDE, 0xFF, 0xDD, 0xFF,
+ 0x03, 0x00, 0x02, 0x00, 0xED, 0xFF, 0x03, 0x00,
+ 0x06, 0x00, 0xED, 0xFF, 0x03, 0x00, 0x0B, 0x00,
+ 0xED, 0xFF, 0x03, 0x00, 0x0F, 0x00, 0xED, 0xFF,
+ 0x06, 0x00, 0x15, 0x00, 0xE7, 0xFF, 0x08, 0x00,
+ 0x19, 0x00, 0xE1, 0xFF, 0x0A, 0x00, 0x1E, 0x00,
+ 0xDA, 0xFF, 0x0C, 0x00, 0x22, 0x00, 0xD2, 0xFF,
+ 0x03, 0x00, 0xFE, 0xFF, 0xED, 0xFF, 0x03, 0x00,
+ 0xFA, 0xFF, 0xED, 0xFF, 0x03, 0x00, 0xF5, 0xFF,
+ 0xED, 0xFF, 0x03, 0x00, 0xF1, 0xFF, 0xED, 0xFF,
+ 0x06, 0x00, 0xEB, 0xFF, 0xE7, 0xFF, 0x08, 0x00,
+ 0xE7, 0xFF, 0xE1, 0xFF, 0x0A, 0x00, 0xE2, 0xFF,
+ 0xDA, 0xFF, 0x0C, 0x00, 0xDE, 0xFF, 0xD2, 0xFF,
+ 0x05, 0x00, 0x02, 0x00, 0xE9, 0xFF, 0x05, 0x00,
+ 0x06, 0x00, 0xE9, 0xFF, 0x05, 0x00, 0x0B, 0x00,
+ 0xE9, 0xFF, 0x05, 0x00, 0x0F, 0x00, 0xE9, 0xFF,
+ 0x08, 0x00, 0x15, 0x00, 0xE2, 0xFF, 0x0A, 0x00,
+ 0x19, 0x00, 0xDA, 0xFF, 0x0C, 0x00, 0x1E, 0x00,
+ 0xD2, 0xFF, 0x0E, 0x00, 0x22, 0x00, 0xC8, 0xFF,
+ 0x05, 0x00, 0xFE, 0xFF, 0xE9, 0xFF, 0x05, 0x00,
+ 0xFA, 0xFF, 0xE9, 0xFF, 0x05, 0x00, 0xF5, 0xFF,
+ 0xE9, 0xFF, 0x05, 0x00, 0xF1, 0xFF, 0xE9, 0xFF,
+ 0x08, 0x00, 0xEB, 0xFF, 0xE2, 0xFF, 0x0A, 0x00,
+ 0xE7, 0xFF, 0xDA, 0xFF, 0x0C, 0x00, 0xE2, 0xFF,
+ 0xD2, 0xFF, 0x0E, 0x00, 0xDE, 0xFF, 0xC8, 0xFF,
+ 0x07, 0x00, 0x02, 0x00, 0xE5, 0xFF, 0x07, 0x00,
+ 0x06, 0x00, 0xE5, 0xFF, 0x07, 0x00, 0x0B, 0x00,
+ 0xE5, 0xFF, 0x07, 0x00, 0x0F, 0x00, 0xE5, 0xFF,
+ 0x0A, 0x00, 0x15, 0x00, 0xDC, 0xFF, 0x0C, 0x00,
+ 0x19, 0x00, 0xD3, 0xFF, 0x0E, 0x00, 0x1E, 0x00,
+ 0xC9, 0xFF, 0x10, 0x00, 0x22, 0x00, 0xBE, 0xFF,
+ 0x07, 0x00, 0xFE, 0xFF, 0xE5, 0xFF, 0x07, 0x00,
+ 0xFA, 0xFF, 0xE5, 0xFF, 0x07, 0x00, 0xF5, 0xFF,
+ 0xE5, 0xFF, 0x07, 0x00, 0xF1, 0xFF, 0xE5, 0xFF,
+ 0x0A, 0x00, 0xEB, 0xFF, 0xDC, 0xFF, 0x0C, 0x00,
+ 0xE7, 0xFF, 0xD3, 0xFF, 0x0E, 0x00, 0xE2, 0xFF,
+ 0xC9, 0xFF, 0x10, 0x00, 0xDE, 0xFF, 0xBE, 0xFF,
+ 0x09, 0x00, 0x02, 0x00, 0xE1, 0xFF, 0x09, 0x00,
+ 0x06, 0x00, 0xE1, 0xFF, 0x09, 0x00, 0x0B, 0x00,
+ 0xE1, 0xFF, 0x09, 0x00, 0x0F, 0x00, 0xE1, 0xFF,
+ 0x0C, 0x00, 0x15, 0x00, 0xD7, 0xFF, 0x0E, 0x00,
+ 0x19, 0x00, 0xCC, 0xFF, 0x10, 0x00, 0x1E, 0x00,
+ 0xC1, 0xFF, 0x12, 0x00, 0x22, 0x00, 0xB4, 0xFF,
+ 0x09, 0x00, 0xFE, 0xFF, 0xE1, 0xFF, 0x09, 0x00,
+ 0xFA, 0xFF, 0xE1, 0xFF, 0x09, 0x00, 0xF5, 0xFF,
+ 0xE1, 0xFF, 0x09, 0x00, 0xF1, 0xFF, 0xE1, 0xFF,
+ 0x0C, 0x00, 0xEB, 0xFF, 0xD7, 0xFF, 0x0E, 0x00,
+ 0xE7, 0xFF, 0xCC, 0xFF, 0x10, 0x00, 0xE2, 0xFF,
+ 0xC1, 0xFF, 0x12, 0x00, 0xDE, 0xFF, 0xB4, 0xFF,
+ 0x01, 0x00, 0x02, 0x00, 0x02, 0x00, 0x01, 0x00,
+ 0x07, 0x00, 0x02, 0x00, 0x01, 0x00, 0x0C, 0x00,
+ 0x02, 0x00, 0x01, 0x00, 0x11, 0x00, 0x02, 0x00,
+ 0x04, 0x00, 0x17, 0x00, 0x03, 0x00, 0x06, 0x00,
+ 0x1C, 0x00, 0x03, 0x00, 0x08, 0x00, 0x21, 0x00,
+ 0x04, 0x00, 0x0A, 0x00, 0x26, 0x00, 0x05, 0x00,
+ 0x01, 0x00, 0xFE, 0xFF, 0x02, 0x00, 0x01, 0x00,
+ 0xF9, 0xFF, 0x02, 0x00, 0x01, 0x00, 0xF4, 0xFF,
+ 0x02, 0x00, 0x01, 0x00, 0xEF, 0xFF, 0x02, 0x00,
+ 0x04, 0x00, 0xE9, 0xFF, 0x03, 0x00, 0x06, 0x00,
+ 0xE4, 0xFF, 0x03, 0x00, 0x08, 0x00, 0xDF, 0xFF,
+ 0x04, 0x00, 0x0A, 0x00, 0xDA, 0xFF, 0x05, 0x00,
+ 0x01, 0x00, 0x02, 0x00, 0x06, 0x00, 0x01, 0x00,
+ 0x07, 0x00, 0x06, 0x00, 0x01, 0x00, 0x0C, 0x00,
+ 0x06, 0x00, 0x01, 0x00, 0x11, 0x00, 0x06, 0x00,
+ 0x04, 0x00, 0x17, 0x00, 0x09, 0x00, 0x06, 0x00,
+ 0x1C, 0x00, 0x0A, 0x00, 0x08, 0x00, 0x21, 0x00,
+ 0x0D, 0x00, 0x0A, 0x00, 0x26, 0x00, 0x10, 0x00,
+ 0x01, 0x00, 0xFE, 0xFF, 0x06, 0x00, 0x01, 0x00,
+ 0xF9, 0xFF, 0x06, 0x00, 0x01, 0x00, 0xF4, 0xFF,
+ 0x06, 0x00, 0x01, 0x00, 0xEF, 0xFF, 0x06, 0x00,
+ 0x04, 0x00, 0xE9, 0xFF, 0x09, 0x00, 0x06, 0x00,
+ 0xE4, 0xFF, 0x0A, 0x00, 0x08, 0x00, 0xDF, 0xFF,
+ 0x0D, 0x00, 0x0A, 0x00, 0xDA, 0xFF, 0x10, 0x00,
+ 0x01, 0x00, 0x02, 0x00, 0x0B, 0x00, 0x01, 0x00,
+ 0x07, 0x00, 0x0B, 0x00, 0x01, 0x00, 0x0C, 0x00,
+ 0x0B, 0x00, 0x01, 0x00, 0x11, 0x00, 0x0B, 0x00,
+ 0x04, 0x00, 0x17, 0x00, 0x0F, 0x00, 0x06, 0x00,
+ 0x1C, 0x00, 0x12, 0x00, 0x08, 0x00, 0x21, 0x00,
+ 0x16, 0x00, 0x0A, 0x00, 0x26, 0x00, 0x1B, 0x00,
+ 0x01, 0x00, 0xFE, 0xFF, 0x0B, 0x00, 0x01, 0x00,
+ 0xF9, 0xFF, 0x0B, 0x00, 0x01, 0x00, 0xF4, 0xFF,
+ 0x0B, 0x00, 0x01, 0x00, 0xEF, 0xFF, 0x0B, 0x00,
+ 0x04, 0x00, 0xE9, 0xFF, 0x0F, 0x00, 0x06, 0x00,
+ 0xE4, 0xFF, 0x12, 0x00, 0x08, 0x00, 0xDF, 0xFF,
+ 0x16, 0x00, 0x0A, 0x00, 0xDA, 0xFF, 0x1B, 0x00,
+ 0x01, 0x00, 0x02, 0x00, 0x0F, 0x00, 0x01, 0x00,
+ 0x07, 0x00, 0x0F, 0x00, 0x01, 0x00, 0x0C, 0x00,
+ 0x0F, 0x00, 0x01, 0x00, 0x11, 0x00, 0x0F, 0x00,
+ 0x04, 0x00, 0x17, 0x00, 0x15, 0x00, 0x06, 0x00,
+ 0x1C, 0x00, 0x19, 0x00, 0x08, 0x00, 0x21, 0x00,
+ 0x1F, 0x00, 0x0A, 0x00, 0x26, 0x00, 0x26, 0x00,
+ 0x01, 0x00, 0xFE, 0xFF, 0x0F, 0x00, 0x01, 0x00,
+ 0xF9, 0xFF, 0x0F, 0x00, 0x01, 0x00, 0xF4, 0xFF,
+ 0x0F, 0x00, 0x01, 0x00, 0xEF, 0xFF, 0x0F, 0x00,
+ 0x04, 0x00, 0xE9, 0xFF, 0x15, 0x00, 0x06, 0x00,
+ 0xE4, 0xFF, 0x19, 0x00, 0x08, 0x00, 0xDF, 0xFF,
+ 0x1F, 0x00, 0x0A, 0x00, 0xDA, 0xFF, 0x26, 0x00,
+ 0x04, 0x00, 0x02, 0x00, 0x15, 0x00, 0x04, 0x00,
+ 0x07, 0x00, 0x15, 0x00, 0x04, 0x00, 0x0C, 0x00,
+ 0x15, 0x00, 0x04, 0x00, 0x11, 0x00, 0x15, 0x00,
+ 0x07, 0x00, 0x17, 0x00, 0x1C, 0x00, 0x09, 0x00,
+ 0x1C, 0x00, 0x22, 0x00, 0x0B, 0x00, 0x21, 0x00,
+ 0x29, 0x00, 0x0D, 0x00, 0x26, 0x00, 0x32, 0x00,
+ 0x04, 0x00, 0xFE, 0xFF, 0x15, 0x00, 0x04, 0x00,
+ 0xF9, 0xFF, 0x15, 0x00, 0x04, 0x00, 0xF4, 0xFF,
+ 0x15, 0x00, 0x04, 0x00, 0xEF, 0xFF, 0x15, 0x00,
+ 0x07, 0x00, 0xE9, 0xFF, 0x1C, 0x00, 0x09, 0x00,
+ 0xE4, 0xFF, 0x22, 0x00, 0x0B, 0x00, 0xDF, 0xFF,
+ 0x29, 0x00, 0x0D, 0x00, 0xDA, 0xFF, 0x32, 0x00,
+ 0x06, 0x00, 0x02, 0x00, 0x19, 0x00, 0x06, 0x00,
+ 0x07, 0x00, 0x19, 0x00, 0x06, 0x00, 0x0C, 0x00,
+ 0x19, 0x00, 0x06, 0x00, 0x11, 0x00, 0x19, 0x00,
+ 0x09, 0x00, 0x17, 0x00, 0x22, 0x00, 0x0B, 0x00,
+ 0x1C, 0x00, 0x29, 0x00, 0x0D, 0x00, 0x21, 0x00,
+ 0x32, 0x00, 0x0F, 0x00, 0x26, 0x00, 0x3D, 0x00,
+ 0x06, 0x00, 0xFE, 0xFF, 0x19, 0x00, 0x06, 0x00,
+ 0xF9, 0xFF, 0x19, 0x00, 0x06, 0x00, 0xF4, 0xFF,
+ 0x19, 0x00, 0x06, 0x00, 0xEF, 0xFF, 0x19, 0x00,
+ 0x09, 0x00, 0xE9, 0xFF, 0x22, 0x00, 0x0B, 0x00,
+ 0xE4, 0xFF, 0x29, 0x00, 0x0D, 0x00, 0xDF, 0xFF,
+ 0x32, 0x00, 0x0F, 0x00, 0xDA, 0xFF, 0x3D, 0x00,
+ 0x08, 0x00, 0x02, 0x00, 0x1E, 0x00, 0x08, 0x00,
+ 0x07, 0x00, 0x1E, 0x00, 0x08, 0x00, 0x0C, 0x00,
+ 0x1E, 0x00, 0x08, 0x00, 0x11, 0x00, 0x1E, 0x00,
+ 0x0B, 0x00, 0x17, 0x00, 0x28, 0x00, 0x0D, 0x00,
+ 0x1C, 0x00, 0x31, 0x00, 0x0F, 0x00, 0x21, 0x00,
+ 0x3B, 0x00, 0x11, 0x00, 0x26, 0x00, 0x48, 0x00,
+ 0x08, 0x00, 0xFE, 0xFF, 0x1E, 0x00, 0x08, 0x00,
+ 0xF9, 0xFF, 0x1E, 0x00, 0x08, 0x00, 0xF4, 0xFF,
+ 0x1E, 0x00, 0x08, 0x00, 0xEF, 0xFF, 0x1E, 0x00,
+ 0x0B, 0x00, 0xE9, 0xFF, 0x28, 0x00, 0x0D, 0x00,
+ 0xE4, 0xFF, 0x31, 0x00, 0x0F, 0x00, 0xDF, 0xFF,
+ 0x3B, 0x00, 0x11, 0x00, 0xDA, 0xFF, 0x48, 0x00,
+ 0x0A, 0x00, 0x02, 0x00, 0x22, 0x00, 0x0A, 0x00,
+ 0x07, 0x00, 0x22, 0x00, 0x0A, 0x00, 0x0C, 0x00,
+ 0x22, 0x00, 0x0A, 0x00, 0x11, 0x00, 0x22, 0x00,
+ 0x0D, 0x00, 0x17, 0x00, 0x2E, 0x00, 0x0F, 0x00,
+ 0x1C, 0x00, 0x38, 0x00, 0x11, 0x00, 0x21, 0x00,
+ 0x44, 0x00, 0x13, 0x00, 0x26, 0x00, 0x53, 0x00,
+ 0x0A, 0x00, 0xFE, 0xFF, 0x22, 0x00, 0x0A, 0x00,
+ 0xF9, 0xFF, 0x22, 0x00, 0x0A, 0x00, 0xF4, 0xFF,
+ 0x22, 0x00, 0x0A, 0x00, 0xEF, 0xFF, 0x22, 0x00,
+ 0x0D, 0x00, 0xE9, 0xFF, 0x2E, 0x00, 0x0F, 0x00,
+ 0xE4, 0xFF, 0x38, 0x00, 0x11, 0x00, 0xDF, 0xFF,
+ 0x44, 0x00, 0x13, 0x00, 0xDA, 0xFF, 0x53, 0x00,
+ 0x01, 0x00, 0x02, 0x00, 0xFE, 0xFF, 0x01, 0x00,
+ 0x07, 0x00, 0xFE, 0xFF, 0x01, 0x00, 0x0C, 0x00,
+ 0xFE, 0xFF, 0x01, 0x00, 0x11, 0x00, 0xFE, 0xFF,
+ 0x04, 0x00, 0x17, 0x00, 0xFD, 0xFF, 0x06, 0x00,
+ 0x1C, 0x00, 0xFD, 0xFF, 0x08, 0x00, 0x21, 0x00,
+ 0xFC, 0xFF, 0x0A, 0x00, 0x26, 0x00, 0xFB, 0xFF,
+ 0x01, 0x00, 0xFE, 0xFF, 0xFE, 0xFF, 0x01, 0x00,
+ 0xF9, 0xFF, 0xFE, 0xFF, 0x01, 0x00, 0xF4, 0xFF,
+ 0xFE, 0xFF, 0x01, 0x00, 0xEF, 0xFF, 0xFE, 0xFF,
+ 0x04, 0x00, 0xE9, 0xFF, 0xFD, 0xFF, 0x06, 0x00,
+ 0xE4, 0xFF, 0xFD, 0xFF, 0x08, 0x00, 0xDF, 0xFF,
+ 0xFC, 0xFF, 0x0A, 0x00, 0xDA, 0xFF, 0xFB, 0xFF,
+ 0x01, 0x00, 0x02, 0x00, 0xFA, 0xFF, 0x01, 0x00,
+ 0x07, 0x00, 0xFA, 0xFF, 0x01, 0x00, 0x0C, 0x00,
+ 0xFA, 0xFF, 0x01, 0x00, 0x11, 0x00, 0xFA, 0xFF,
+ 0x04, 0x00, 0x17, 0x00, 0xF7, 0xFF, 0x06, 0x00,
+ 0x1C, 0x00, 0xF6, 0xFF, 0x08, 0x00, 0x21, 0x00,
+ 0xF3, 0xFF, 0x0A, 0x00, 0x26, 0x00, 0xF0, 0xFF,
+ 0x01, 0x00, 0xFE, 0xFF, 0xFA, 0xFF, 0x01, 0x00,
+ 0xF9, 0xFF, 0xFA, 0xFF, 0x01, 0x00, 0xF4, 0xFF,
+ 0xFA, 0xFF, 0x01, 0x00, 0xEF, 0xFF, 0xFA, 0xFF,
+ 0x04, 0x00, 0xE9, 0xFF, 0xF7, 0xFF, 0x06, 0x00,
+ 0xE4, 0xFF, 0xF6, 0xFF, 0x08, 0x00, 0xDF, 0xFF,
+ 0xF3, 0xFF, 0x0A, 0x00, 0xDA, 0xFF, 0xF0, 0xFF,
+ 0x01, 0x00, 0x02, 0x00, 0xF5, 0xFF, 0x01, 0x00,
+ 0x07, 0x00, 0xF5, 0xFF, 0x01, 0x00, 0x0C, 0x00,
+ 0xF5, 0xFF, 0x01, 0x00, 0x11, 0x00, 0xF5, 0xFF,
+ 0x04, 0x00, 0x17, 0x00, 0xF1, 0xFF, 0x06, 0x00,
+ 0x1C, 0x00, 0xEE, 0xFF, 0x08, 0x00, 0x21, 0x00,
+ 0xEA, 0xFF, 0x0A, 0x00, 0x26, 0x00, 0xE5, 0xFF,
+ 0x01, 0x00, 0xFE, 0xFF, 0xF5, 0xFF, 0x01, 0x00,
+ 0xF9, 0xFF, 0xF5, 0xFF, 0x01, 0x00, 0xF4, 0xFF,
+ 0xF5, 0xFF, 0x01, 0x00, 0xEF, 0xFF, 0xF5, 0xFF,
+ 0x04, 0x00, 0xE9, 0xFF, 0xF1, 0xFF, 0x06, 0x00,
+ 0xE4, 0xFF, 0xEE, 0xFF, 0x08, 0x00, 0xDF, 0xFF,
+ 0xEA, 0xFF, 0x0A, 0x00, 0xDA, 0xFF, 0xE5, 0xFF,
+ 0x01, 0x00, 0x02, 0x00, 0xF1, 0xFF, 0x01, 0x00,
+ 0x07, 0x00, 0xF1, 0xFF, 0x01, 0x00, 0x0C, 0x00,
+ 0xF1, 0xFF, 0x01, 0x00, 0x11, 0x00, 0xF1, 0xFF,
+ 0x04, 0x00, 0x17, 0x00, 0xEB, 0xFF, 0x06, 0x00,
+ 0x1C, 0x00, 0xE7, 0xFF, 0x08, 0x00, 0x21, 0x00,
+ 0xE1, 0xFF, 0x0A, 0x00, 0x26, 0x00, 0xDA, 0xFF,
+ 0x01, 0x00, 0xFE, 0xFF, 0xF1, 0xFF, 0x01, 0x00,
+ 0xF9, 0xFF, 0xF1, 0xFF, 0x01, 0x00, 0xF4, 0xFF,
+ 0xF1, 0xFF, 0x01, 0x00, 0xEF, 0xFF, 0xF1, 0xFF,
+ 0x04, 0x00, 0xE9, 0xFF, 0xEB, 0xFF, 0x06, 0x00,
+ 0xE4, 0xFF, 0xE7, 0xFF, 0x08, 0x00, 0xDF, 0xFF,
+ 0xE1, 0xFF, 0x0A, 0x00, 0xDA, 0xFF, 0xDA, 0xFF,
+ 0x04, 0x00, 0x02, 0x00, 0xEB, 0xFF, 0x04, 0x00,
+ 0x07, 0x00, 0xEB, 0xFF, 0x04, 0x00, 0x0C, 0x00,
+ 0xEB, 0xFF, 0x04, 0x00, 0x11, 0x00, 0xEB, 0xFF,
+ 0x07, 0x00, 0x17, 0x00, 0xE4, 0xFF, 0x09, 0x00,
+ 0x1C, 0x00, 0xDE, 0xFF, 0x0B, 0x00, 0x21, 0x00,
+ 0xD7, 0xFF, 0x0D, 0x00, 0x26, 0x00, 0xCE, 0xFF,
+ 0x04, 0x00, 0xFE, 0xFF, 0xEB, 0xFF, 0x04, 0x00,
+ 0xF9, 0xFF, 0xEB, 0xFF, 0x04, 0x00, 0xF4, 0xFF,
+ 0xEB, 0xFF, 0x04, 0x00, 0xEF, 0xFF, 0xEB, 0xFF,
+ 0x07, 0x00, 0xE9, 0xFF, 0xE4, 0xFF, 0x09, 0x00,
+ 0xE4, 0xFF, 0xDE, 0xFF, 0x0B, 0x00, 0xDF, 0xFF,
+ 0xD7, 0xFF, 0x0D, 0x00, 0xDA, 0xFF, 0xCE, 0xFF,
+ 0x06, 0x00, 0x02, 0x00, 0xE7, 0xFF, 0x06, 0x00,
+ 0x07, 0x00, 0xE7, 0xFF, 0x06, 0x00, 0x0C, 0x00,
+ 0xE7, 0xFF, 0x06, 0x00, 0x11, 0x00, 0xE7, 0xFF,
+ 0x09, 0x00, 0x17, 0x00, 0xDE, 0xFF, 0x0B, 0x00,
+ 0x1C, 0x00, 0xD7, 0xFF, 0x0D, 0x00, 0x21, 0x00,
+ 0xCE, 0xFF, 0x0F, 0x00, 0x26, 0x00, 0xC3, 0xFF,
+ 0x06, 0x00, 0xFE, 0xFF, 0xE7, 0xFF, 0x06, 0x00,
+ 0xF9, 0xFF, 0xE7, 0xFF, 0x06, 0x00, 0xF4, 0xFF,
+ 0xE7, 0xFF, 0x06, 0x00, 0xEF, 0xFF, 0xE7, 0xFF,
+ 0x09, 0x00, 0xE9, 0xFF, 0xDE, 0xFF, 0x0B, 0x00,
+ 0xE4, 0xFF, 0xD7, 0xFF, 0x0D, 0x00, 0xDF, 0xFF,
+ 0xCE, 0xFF, 0x0F, 0x00, 0xDA, 0xFF, 0xC3, 0xFF,
+ 0x08, 0x00, 0x02, 0x00, 0xE2, 0xFF, 0x08, 0x00,
+ 0x07, 0x00, 0xE2, 0xFF, 0x08, 0x00, 0x0C, 0x00,
+ 0xE2, 0xFF, 0x08, 0x00, 0x11, 0x00, 0xE2, 0xFF,
+ 0x0B, 0x00, 0x17, 0x00, 0xD8, 0xFF, 0x0D, 0x00,
+ 0x1C, 0x00, 0xCF, 0xFF, 0x0F, 0x00, 0x21, 0x00,
+ 0xC5, 0xFF, 0x11, 0x00, 0x26, 0x00, 0xB8, 0xFF,
+ 0x08, 0x00, 0xFE, 0xFF, 0xE2, 0xFF, 0x08, 0x00,
+ 0xF9, 0xFF, 0xE2, 0xFF, 0x08, 0x00, 0xF4, 0xFF,
+ 0xE2, 0xFF, 0x08, 0x00, 0xEF, 0xFF, 0xE2, 0xFF,
+ 0x0B, 0x00, 0xE9, 0xFF, 0xD8, 0xFF, 0x0D, 0x00,
+ 0xE4, 0xFF, 0xCF, 0xFF, 0x0F, 0x00, 0xDF, 0xFF,
+ 0xC5, 0xFF, 0x11, 0x00, 0xDA, 0xFF, 0xB8, 0xFF,
+ 0x0A, 0x00, 0x02, 0x00, 0xDE, 0xFF, 0x0A, 0x00,
+ 0x07, 0x00, 0xDE, 0xFF, 0x0A, 0x00, 0x0C, 0x00,
+ 0xDE, 0xFF, 0x0A, 0x00, 0x11, 0x00, 0xDE, 0xFF,
+ 0x0D, 0x00, 0x17, 0x00, 0xD2, 0xFF, 0x0F, 0x00,
+ 0x1C, 0x00, 0xC8, 0xFF, 0x11, 0x00, 0x21, 0x00,
+ 0xBC, 0xFF, 0x13, 0x00, 0x26, 0x00, 0xAD, 0xFF,
+ 0x0A, 0x00, 0xFE, 0xFF, 0xDE, 0xFF, 0x0A, 0x00,
+ 0xF9, 0xFF, 0xDE, 0xFF, 0x0A, 0x00, 0xF4, 0xFF,
+ 0xDE, 0xFF, 0x0A, 0x00, 0xEF, 0xFF, 0xDE, 0xFF,
+ 0x0D, 0x00, 0xE9, 0xFF, 0xD2, 0xFF, 0x0F, 0x00,
+ 0xE4, 0xFF, 0xC8, 0xFF, 0x11, 0x00, 0xDF, 0xFF,
+ 0xBC, 0xFF, 0x13, 0x00, 0xDA, 0xFF, 0xAD, 0xFF,
+ 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00,
+ 0x07, 0x00, 0x02, 0x00, 0x02, 0x00, 0x0D, 0x00,
+ 0x02, 0x00, 0x02, 0x00, 0x12, 0x00, 0x02, 0x00,
+ 0x05, 0x00, 0x19, 0x00, 0x03, 0x00, 0x07, 0x00,
+ 0x1E, 0x00, 0x04, 0x00, 0x09, 0x00, 0x24, 0x00,
+ 0x05, 0x00, 0x0B, 0x00, 0x29, 0x00, 0x06, 0x00,
+ 0x02, 0x00, 0xFE, 0xFF, 0x02, 0x00, 0x02, 0x00,
+ 0xF9, 0xFF, 0x02, 0x00, 0x02, 0x00, 0xF3, 0xFF,
+ 0x02, 0x00, 0x02, 0x00, 0xEE, 0xFF, 0x02, 0x00,
+ 0x05, 0x00, 0xE7, 0xFF, 0x03, 0x00, 0x07, 0x00,
+ 0xE2, 0xFF, 0x04, 0x00, 0x09, 0x00, 0xDC, 0xFF,
+ 0x05, 0x00, 0x0B, 0x00, 0xD7, 0xFF, 0x06, 0x00,
+ 0x02, 0x00, 0x02, 0x00, 0x07, 0x00, 0x02, 0x00,
+ 0x07, 0x00, 0x07, 0x00, 0x02, 0x00, 0x0D, 0x00,
+ 0x07, 0x00, 0x02, 0x00, 0x12, 0x00, 0x07, 0x00,
+ 0x05, 0x00, 0x19, 0x00, 0x0A, 0x00, 0x07, 0x00,
+ 0x1E, 0x00, 0x0C, 0x00, 0x09, 0x00, 0x24, 0x00,
+ 0x0F, 0x00, 0x0B, 0x00, 0x29, 0x00, 0x12, 0x00,
+ 0x02, 0x00, 0xFE, 0xFF, 0x07, 0x00, 0x02, 0x00,
+ 0xF9, 0xFF, 0x07, 0x00, 0x02, 0x00, 0xF3, 0xFF,
+ 0x07, 0x00, 0x02, 0x00, 0xEE, 0xFF, 0x07, 0x00,
+ 0x05, 0x00, 0xE7, 0xFF, 0x0A, 0x00, 0x07, 0x00,
+ 0xE2, 0xFF, 0x0C, 0x00, 0x09, 0x00, 0xDC, 0xFF,
+ 0x0F, 0x00, 0x0B, 0x00, 0xD7, 0xFF, 0x12, 0x00,
+ 0x02, 0x00, 0x02, 0x00, 0x0C, 0x00, 0x02, 0x00,
+ 0x07, 0x00, 0x0C, 0x00, 0x02, 0x00, 0x0D, 0x00,
+ 0x0C, 0x00, 0x02, 0x00, 0x12, 0x00, 0x0C, 0x00,
+ 0x05, 0x00, 0x19, 0x00, 0x11, 0x00, 0x07, 0x00,
+ 0x1E, 0x00, 0x15, 0x00, 0x09, 0x00, 0x24, 0x00,
+ 0x19, 0x00, 0x0B, 0x00, 0x29, 0x00, 0x1F, 0x00,
+ 0x02, 0x00, 0xFE, 0xFF, 0x0C, 0x00, 0x02, 0x00,
+ 0xF9, 0xFF, 0x0C, 0x00, 0x02, 0x00, 0xF3, 0xFF,
+ 0x0C, 0x00, 0x02, 0x00, 0xEE, 0xFF, 0x0C, 0x00,
+ 0x05, 0x00, 0xE7, 0xFF, 0x11, 0x00, 0x07, 0x00,
+ 0xE2, 0xFF, 0x15, 0x00, 0x09, 0x00, 0xDC, 0xFF,
+ 0x19, 0x00, 0x0B, 0x00, 0xD7, 0xFF, 0x1F, 0x00,
+ 0x02, 0x00, 0x02, 0x00, 0x11, 0x00, 0x02, 0x00,
+ 0x07, 0x00, 0x11, 0x00, 0x02, 0x00, 0x0D, 0x00,
+ 0x11, 0x00, 0x02, 0x00, 0x12, 0x00, 0x11, 0x00,
+ 0x05, 0x00, 0x19, 0x00, 0x18, 0x00, 0x07, 0x00,
+ 0x1E, 0x00, 0x1D, 0x00, 0x09, 0x00, 0x24, 0x00,
+ 0x23, 0x00, 0x0B, 0x00, 0x29, 0x00, 0x2B, 0x00,
+ 0x02, 0x00, 0xFE, 0xFF, 0x11, 0x00, 0x02, 0x00,
+ 0xF9, 0xFF, 0x11, 0x00, 0x02, 0x00, 0xF3, 0xFF,
+ 0x11, 0x00, 0x02, 0x00, 0xEE, 0xFF, 0x11, 0x00,
+ 0x05, 0x00, 0xE7, 0xFF, 0x18, 0x00, 0x07, 0x00,
+ 0xE2, 0xFF, 0x1D, 0x00, 0x09, 0x00, 0xDC, 0xFF,
+ 0x23, 0x00, 0x0B, 0x00, 0xD7, 0xFF, 0x2B, 0x00,
+ 0x05, 0x00, 0x02, 0x00, 0x17, 0x00, 0x05, 0x00,
+ 0x07, 0x00, 0x17, 0x00, 0x05, 0x00, 0x0D, 0x00,
+ 0x17, 0x00, 0x05, 0x00, 0x12, 0x00, 0x17, 0x00,
+ 0x08, 0x00, 0x19, 0x00, 0x1F, 0x00, 0x0A, 0x00,
+ 0x1E, 0x00, 0x26, 0x00, 0x0C, 0x00, 0x24, 0x00,
+ 0x2E, 0x00, 0x0E, 0x00, 0x29, 0x00, 0x38, 0x00,
+ 0x05, 0x00, 0xFE, 0xFF, 0x17, 0x00, 0x05, 0x00,
+ 0xF9, 0xFF, 0x17, 0x00, 0x05, 0x00, 0xF3, 0xFF,
+ 0x17, 0x00, 0x05, 0x00, 0xEE, 0xFF, 0x17, 0x00,
+ 0x08, 0x00, 0xE7, 0xFF, 0x1F, 0x00, 0x0A, 0x00,
+ 0xE2, 0xFF, 0x26, 0x00, 0x0C, 0x00, 0xDC, 0xFF,
+ 0x2E, 0x00, 0x0E, 0x00, 0xD7, 0xFF, 0x38, 0x00,
+ 0x07, 0x00, 0x02, 0x00, 0x1C, 0x00, 0x07, 0x00,
+ 0x07, 0x00, 0x1C, 0x00, 0x07, 0x00, 0x0D, 0x00,
+ 0x1C, 0x00, 0x07, 0x00, 0x12, 0x00, 0x1C, 0x00,
+ 0x0A, 0x00, 0x19, 0x00, 0x26, 0x00, 0x0C, 0x00,
+ 0x1E, 0x00, 0x2E, 0x00, 0x0E, 0x00, 0x24, 0x00,
+ 0x38, 0x00, 0x10, 0x00, 0x29, 0x00, 0x44, 0x00,
+ 0x07, 0x00, 0xFE, 0xFF, 0x1C, 0x00, 0x07, 0x00,
+ 0xF9, 0xFF, 0x1C, 0x00, 0x07, 0x00, 0xF3, 0xFF,
+ 0x1C, 0x00, 0x07, 0x00, 0xEE, 0xFF, 0x1C, 0x00,
+ 0x0A, 0x00, 0xE7, 0xFF, 0x26, 0x00, 0x0C, 0x00,
+ 0xE2, 0xFF, 0x2E, 0x00, 0x0E, 0x00, 0xDC, 0xFF,
+ 0x38, 0x00, 0x10, 0x00, 0xD7, 0xFF, 0x44, 0x00,
+ 0x09, 0x00, 0x02, 0x00, 0x21, 0x00, 0x09, 0x00,
+ 0x07, 0x00, 0x21, 0x00, 0x09, 0x00, 0x0D, 0x00,
+ 0x21, 0x00, 0x09, 0x00, 0x12, 0x00, 0x21, 0x00,
+ 0x0C, 0x00, 0x19, 0x00, 0x2D, 0x00, 0x0E, 0x00,
+ 0x1E, 0x00, 0x37, 0x00, 0x10, 0x00, 0x24, 0x00,
+ 0x42, 0x00, 0x12, 0x00, 0x29, 0x00, 0x51, 0x00,
+ 0x09, 0x00, 0xFE, 0xFF, 0x21, 0x00, 0x09, 0x00,
+ 0xF9, 0xFF, 0x21, 0x00, 0x09, 0x00, 0xF3, 0xFF,
+ 0x21, 0x00, 0x09, 0x00, 0xEE, 0xFF, 0x21, 0x00,
+ 0x0C, 0x00, 0xE7, 0xFF, 0x2D, 0x00, 0x0E, 0x00,
+ 0xE2, 0xFF, 0x37, 0x00, 0x10, 0x00, 0xDC, 0xFF,
+ 0x42, 0x00, 0x12, 0x00, 0xD7, 0xFF, 0x51, 0x00,
+ 0x0B, 0x00, 0x02, 0x00, 0x26, 0x00, 0x0B, 0x00,
+ 0x07, 0x00, 0x26, 0x00, 0x0B, 0x00, 0x0D, 0x00,
+ 0x26, 0x00, 0x0B, 0x00, 0x12, 0x00, 0x26, 0x00,
+ 0x0E, 0x00, 0x19, 0x00, 0x34, 0x00, 0x10, 0x00,
+ 0x1E, 0x00, 0x3F, 0x00, 0x12, 0x00, 0x24, 0x00,
+ 0x4C, 0x00, 0x14, 0x00, 0x29, 0x00, 0x5D, 0x00,
+ 0x0B, 0x00, 0xFE, 0xFF, 0x26, 0x00, 0x0B, 0x00,
+ 0xF9, 0xFF, 0x26, 0x00, 0x0B, 0x00, 0xF3, 0xFF,
+ 0x26, 0x00, 0x0B, 0x00, 0xEE, 0xFF, 0x26, 0x00,
+ 0x0E, 0x00, 0xE7, 0xFF, 0x34, 0x00, 0x10, 0x00,
+ 0xE2, 0xFF, 0x3F, 0x00, 0x12, 0x00, 0xDC, 0xFF,
+ 0x4C, 0x00, 0x14, 0x00, 0xD7, 0xFF, 0x5D, 0x00,
+ 0x02, 0x00, 0x02, 0x00, 0xFE, 0xFF, 0x02, 0x00,
+ 0x07, 0x00, 0xFE, 0xFF, 0x02, 0x00, 0x0D, 0x00,
+ 0xFE, 0xFF, 0x02, 0x00, 0x12, 0x00, 0xFE, 0xFF,
+ 0x05, 0x00, 0x19, 0x00, 0xFD, 0xFF, 0x07, 0x00,
+ 0x1E, 0x00, 0xFC, 0xFF, 0x09, 0x00, 0x24, 0x00,
+ 0xFB, 0xFF, 0x0B, 0x00, 0x29, 0x00, 0xFA, 0xFF,
+ 0x02, 0x00, 0xFE, 0xFF, 0xFE, 0xFF, 0x02, 0x00,
+ 0xF9, 0xFF, 0xFE, 0xFF, 0x02, 0x00, 0xF3, 0xFF,
+ 0xFE, 0xFF, 0x02, 0x00, 0xEE, 0xFF, 0xFE, 0xFF,
+ 0x05, 0x00, 0xE7, 0xFF, 0xFD, 0xFF, 0x07, 0x00,
+ 0xE2, 0xFF, 0xFC, 0xFF, 0x09, 0x00, 0xDC, 0xFF,
+ 0xFB, 0xFF, 0x0B, 0x00, 0xD7, 0xFF, 0xFA, 0xFF,
+ 0x02, 0x00, 0x02, 0x00, 0xF9, 0xFF, 0x02, 0x00,
+ 0x07, 0x00, 0xF9, 0xFF, 0x02, 0x00, 0x0D, 0x00,
+ 0xF9, 0xFF, 0x02, 0x00, 0x12, 0x00, 0xF9, 0xFF,
+ 0x05, 0x00, 0x19, 0x00, 0xF6, 0xFF, 0x07, 0x00,
+ 0x1E, 0x00, 0xF4, 0xFF, 0x09, 0x00, 0x24, 0x00,
+ 0xF1, 0xFF, 0x0B, 0x00, 0x29, 0x00, 0xEE, 0xFF,
+ 0x02, 0x00, 0xFE, 0xFF, 0xF9, 0xFF, 0x02, 0x00,
+ 0xF9, 0xFF, 0xF9, 0xFF, 0x02, 0x00, 0xF3, 0xFF,
+ 0xF9, 0xFF, 0x02, 0x00, 0xEE, 0xFF, 0xF9, 0xFF,
+ 0x05, 0x00, 0xE7, 0xFF, 0xF6, 0xFF, 0x07, 0x00,
+ 0xE2, 0xFF, 0xF4, 0xFF, 0x09, 0x00, 0xDC, 0xFF,
+ 0xF1, 0xFF, 0x0B, 0x00, 0xD7, 0xFF, 0xEE, 0xFF,
+ 0x02, 0x00, 0x02, 0x00, 0xF4, 0xFF, 0x02, 0x00,
+ 0x07, 0x00, 0xF4, 0xFF, 0x02, 0x00, 0x0D, 0x00,
+ 0xF4, 0xFF, 0x02, 0x00, 0x12, 0x00, 0xF4, 0xFF,
+ 0x05, 0x00, 0x19, 0x00, 0xEF, 0xFF, 0x07, 0x00,
+ 0x1E, 0x00, 0xEB, 0xFF, 0x09, 0x00, 0x24, 0x00,
+ 0xE7, 0xFF, 0x0B, 0x00, 0x29, 0x00, 0xE1, 0xFF,
+ 0x02, 0x00, 0xFE, 0xFF, 0xF4, 0xFF, 0x02, 0x00,
+ 0xF9, 0xFF, 0xF4, 0xFF, 0x02, 0x00, 0xF3, 0xFF,
+ 0xF4, 0xFF, 0x02, 0x00, 0xEE, 0xFF, 0xF4, 0xFF,
+ 0x05, 0x00, 0xE7, 0xFF, 0xEF, 0xFF, 0x07, 0x00,
+ 0xE2, 0xFF, 0xEB, 0xFF, 0x09, 0x00, 0xDC, 0xFF,
+ 0xE7, 0xFF, 0x0B, 0x00, 0xD7, 0xFF, 0xE1, 0xFF,
+ 0x02, 0x00, 0x02, 0x00, 0xEF, 0xFF, 0x02, 0x00,
+ 0x07, 0x00, 0xEF, 0xFF, 0x02, 0x00, 0x0D, 0x00,
+ 0xEF, 0xFF, 0x02, 0x00, 0x12, 0x00, 0xEF, 0xFF,
+ 0x05, 0x00, 0x19, 0x00, 0xE8, 0xFF, 0x07, 0x00,
+ 0x1E, 0x00, 0xE3, 0xFF, 0x09, 0x00, 0x24, 0x00,
+ 0xDD, 0xFF, 0x0B, 0x00, 0x29, 0x00, 0xD5, 0xFF,
+ 0x02, 0x00, 0xFE, 0xFF, 0xEF, 0xFF, 0x02, 0x00,
+ 0xF9, 0xFF, 0xEF, 0xFF, 0x02, 0x00, 0xF3, 0xFF,
+ 0xEF, 0xFF, 0x02, 0x00, 0xEE, 0xFF, 0xEF, 0xFF,
+ 0x05, 0x00, 0xE7, 0xFF, 0xE8, 0xFF, 0x07, 0x00,
+ 0xE2, 0xFF, 0xE3, 0xFF, 0x09, 0x00, 0xDC, 0xFF,
+ 0xDD, 0xFF, 0x0B, 0x00, 0xD7, 0xFF, 0xD5, 0xFF,
+ 0x05, 0x00, 0x02, 0x00, 0xE9, 0xFF, 0x05, 0x00,
+ 0x07, 0x00, 0xE9, 0xFF, 0x05, 0x00, 0x0D, 0x00,
+ 0xE9, 0xFF, 0x05, 0x00, 0x12, 0x00, 0xE9, 0xFF,
+ 0x08, 0x00, 0x19, 0x00, 0xE1, 0xFF, 0x0A, 0x00,
+ 0x1E, 0x00, 0xDA, 0xFF, 0x0C, 0x00, 0x24, 0x00,
+ 0xD2, 0xFF, 0x0E, 0x00, 0x29, 0x00, 0xC8, 0xFF,
+ 0x05, 0x00, 0xFE, 0xFF, 0xE9, 0xFF, 0x05, 0x00,
+ 0xF9, 0xFF, 0xE9, 0xFF, 0x05, 0x00, 0xF3, 0xFF,
+ 0xE9, 0xFF, 0x05, 0x00, 0xEE, 0xFF, 0xE9, 0xFF,
+ 0x08, 0x00, 0xE7, 0xFF, 0xE1, 0xFF, 0x0A, 0x00,
+ 0xE2, 0xFF, 0xDA, 0xFF, 0x0C, 0x00, 0xDC, 0xFF,
+ 0xD2, 0xFF, 0x0E, 0x00, 0xD7, 0xFF, 0xC8, 0xFF,
+ 0x07, 0x00, 0x02, 0x00, 0xE4, 0xFF, 0x07, 0x00,
+ 0x07, 0x00, 0xE4, 0xFF, 0x07, 0x00, 0x0D, 0x00,
+ 0xE4, 0xFF, 0x07, 0x00, 0x12, 0x00, 0xE4, 0xFF,
+ 0x0A, 0x00, 0x19, 0x00, 0xDA, 0xFF, 0x0C, 0x00,
+ 0x1E, 0x00, 0xD2, 0xFF, 0x0E, 0x00, 0x24, 0x00,
+ 0xC8, 0xFF, 0x10, 0x00, 0x29, 0x00, 0xBC, 0xFF,
+ 0x07, 0x00, 0xFE, 0xFF, 0xE4, 0xFF, 0x07, 0x00,
+ 0xF9, 0xFF, 0xE4, 0xFF, 0x07, 0x00, 0xF3, 0xFF,
+ 0xE4, 0xFF, 0x07, 0x00, 0xEE, 0xFF, 0xE4, 0xFF,
+ 0x0A, 0x00, 0xE7, 0xFF, 0xDA, 0xFF, 0x0C, 0x00,
+ 0xE2, 0xFF, 0xD2, 0xFF, 0x0E, 0x00, 0xDC, 0xFF,
+ 0xC8, 0xFF, 0x10, 0x00, 0xD7, 0xFF, 0xBC, 0xFF,
+ 0x09, 0x00, 0x02, 0x00, 0xDF, 0xFF, 0x09, 0x00,
+ 0x07, 0x00, 0xDF, 0xFF, 0x09, 0x00, 0x0D, 0x00,
+ 0xDF, 0xFF, 0x09, 0x00, 0x12, 0x00, 0xDF, 0xFF,
+ 0x0C, 0x00, 0x19, 0x00, 0xD3, 0xFF, 0x0E, 0x00,
+ 0x1E, 0x00, 0xC9, 0xFF, 0x10, 0x00, 0x24, 0x00,
+ 0xBE, 0xFF, 0x12, 0x00, 0x29, 0x00, 0xAF, 0xFF,
+ 0x09, 0x00, 0xFE, 0xFF, 0xDF, 0xFF, 0x09, 0x00,
+ 0xF9, 0xFF, 0xDF, 0xFF, 0x09, 0x00, 0xF3, 0xFF,
+ 0xDF, 0xFF, 0x09, 0x00, 0xEE, 0xFF, 0xDF, 0xFF,
+ 0x0C, 0x00, 0xE7, 0xFF, 0xD3, 0xFF, 0x0E, 0x00,
+ 0xE2, 0xFF, 0xC9, 0xFF, 0x10, 0x00, 0xDC, 0xFF,
+ 0xBE, 0xFF, 0x12, 0x00, 0xD7, 0xFF, 0xAF, 0xFF,
+ 0x0B, 0x00, 0x02, 0x00, 0xDA, 0xFF, 0x0B, 0x00,
+ 0x07, 0x00, 0xDA, 0xFF, 0x0B, 0x00, 0x0D, 0x00,
+ 0xDA, 0xFF, 0x0B, 0x00, 0x12, 0x00, 0xDA, 0xFF,
+ 0x0E, 0x00, 0x19, 0x00, 0xCC, 0xFF, 0x10, 0x00,
+ 0x1E, 0x00, 0xC1, 0xFF, 0x12, 0x00, 0x24, 0x00,
+ 0xB4, 0xFF, 0x14, 0x00, 0x29, 0x00, 0xA3, 0xFF,
+ 0x0B, 0x00, 0xFE, 0xFF, 0xDA, 0xFF, 0x0B, 0x00,
+ 0xF9, 0xFF, 0xDA, 0xFF, 0x0B, 0x00, 0xF3, 0xFF,
+ 0xDA, 0xFF, 0x0B, 0x00, 0xEE, 0xFF, 0xDA, 0xFF,
+ 0x0E, 0x00, 0xE7, 0xFF, 0xCC, 0xFF, 0x10, 0x00,
+ 0xE2, 0xFF, 0xC1, 0xFF, 0x12, 0x00, 0xDC, 0xFF,
+ 0xB4, 0xFF, 0x14, 0x00, 0xD7, 0xFF, 0xA3, 0xFF,
+ 0x03, 0x00, 0x03, 0x00, 0x02, 0x00, 0x03, 0x00,
+ 0x09, 0x00, 0x02, 0x00, 0x03, 0x00, 0x0F, 0x00,
+ 0x02, 0x00, 0x03, 0x00, 0x15, 0x00, 0x02, 0x00,
+ 0x06, 0x00, 0x1C, 0x00, 0x03, 0x00, 0x08, 0x00,
+ 0x22, 0x00, 0x04, 0x00, 0x0A, 0x00, 0x28, 0x00,
+ 0x05, 0x00, 0x0C, 0x00, 0x2E, 0x00, 0x06, 0x00,
+ 0x03, 0x00, 0xFD, 0xFF, 0x02, 0x00, 0x03, 0x00,
+ 0xF7, 0xFF, 0x02, 0x00, 0x03, 0x00, 0xF1, 0xFF,
+ 0x02, 0x00, 0x03, 0x00, 0xEB, 0xFF, 0x02, 0x00,
+ 0x06, 0x00, 0xE4, 0xFF, 0x03, 0x00, 0x08, 0x00,
+ 0xDE, 0xFF, 0x04, 0x00, 0x0A, 0x00, 0xD8, 0xFF,
+ 0x05, 0x00, 0x0C, 0x00, 0xD2, 0xFF, 0x06, 0x00,
+ 0x03, 0x00, 0x03, 0x00, 0x07, 0x00, 0x03, 0x00,
+ 0x09, 0x00, 0x07, 0x00, 0x03, 0x00, 0x0F, 0x00,
+ 0x07, 0x00, 0x03, 0x00, 0x15, 0x00, 0x07, 0x00,
+ 0x06, 0x00, 0x1C, 0x00, 0x0A, 0x00, 0x08, 0x00,
+ 0x22, 0x00, 0x0D, 0x00, 0x0A, 0x00, 0x28, 0x00,
+ 0x10, 0x00, 0x0C, 0x00, 0x2E, 0x00, 0x13, 0x00,
+ 0x03, 0x00, 0xFD, 0xFF, 0x07, 0x00, 0x03, 0x00,
+ 0xF7, 0xFF, 0x07, 0x00, 0x03, 0x00, 0xF1, 0xFF,
+ 0x07, 0x00, 0x03, 0x00, 0xEB, 0xFF, 0x07, 0x00,
+ 0x06, 0x00, 0xE4, 0xFF, 0x0A, 0x00, 0x08, 0x00,
+ 0xDE, 0xFF, 0x0D, 0x00, 0x0A, 0x00, 0xD8, 0xFF,
+ 0x10, 0x00, 0x0C, 0x00, 0xD2, 0xFF, 0x13, 0x00,
+ 0x03, 0x00, 0x03, 0x00, 0x0D, 0x00, 0x03, 0x00,
+ 0x09, 0x00, 0x0D, 0x00, 0x03, 0x00, 0x0F, 0x00,
+ 0x0D, 0x00, 0x03, 0x00, 0x15, 0x00, 0x0D, 0x00,
+ 0x06, 0x00, 0x1C, 0x00, 0x12, 0x00, 0x08, 0x00,
+ 0x22, 0x00, 0x16, 0x00, 0x0A, 0x00, 0x28, 0x00,
+ 0x1B, 0x00, 0x0C, 0x00, 0x2E, 0x00, 0x21, 0x00,
+ 0x03, 0x00, 0xFD, 0xFF, 0x0D, 0x00, 0x03, 0x00,
+ 0xF7, 0xFF, 0x0D, 0x00, 0x03, 0x00, 0xF1, 0xFF,
+ 0x0D, 0x00, 0x03, 0x00, 0xEB, 0xFF, 0x0D, 0x00,
+ 0x06, 0x00, 0xE4, 0xFF, 0x12, 0x00, 0x08, 0x00,
+ 0xDE, 0xFF, 0x16, 0x00, 0x0A, 0x00, 0xD8, 0xFF,
+ 0x1B, 0x00, 0x0C, 0x00, 0xD2, 0xFF, 0x21, 0x00,
+ 0x03, 0x00, 0x03, 0x00, 0x12, 0x00, 0x03, 0x00,
+ 0x09, 0x00, 0x12, 0x00, 0x03, 0x00, 0x0F, 0x00,
+ 0x12, 0x00, 0x03, 0x00, 0x15, 0x00, 0x12, 0x00,
+ 0x06, 0x00, 0x1C, 0x00, 0x19, 0x00, 0x08, 0x00,
+ 0x22, 0x00, 0x1F, 0x00, 0x0A, 0x00, 0x28, 0x00,
+ 0x26, 0x00, 0x0C, 0x00, 0x2E, 0x00, 0x2E, 0x00,
+ 0x03, 0x00, 0xFD, 0xFF, 0x12, 0x00, 0x03, 0x00,
+ 0xF7, 0xFF, 0x12, 0x00, 0x03, 0x00, 0xF1, 0xFF,
+ 0x12, 0x00, 0x03, 0x00, 0xEB, 0xFF, 0x12, 0x00,
+ 0x06, 0x00, 0xE4, 0xFF, 0x19, 0x00, 0x08, 0x00,
+ 0xDE, 0xFF, 0x1F, 0x00, 0x0A, 0x00, 0xD8, 0xFF,
+ 0x26, 0x00, 0x0C, 0x00, 0xD2, 0xFF, 0x2E, 0x00,
+ 0x06, 0x00, 0x03, 0x00, 0x19, 0x00, 0x06, 0x00,
+ 0x09, 0x00, 0x19, 0x00, 0x06, 0x00, 0x0F, 0x00,
+ 0x19, 0x00, 0x06, 0x00, 0x15, 0x00, 0x19, 0x00,
+ 0x09, 0x00, 0x1C, 0x00, 0x22, 0x00, 0x0B, 0x00,
+ 0x22, 0x00, 0x29, 0x00, 0x0D, 0x00, 0x28, 0x00,
+ 0x32, 0x00, 0x0F, 0x00, 0x2E, 0x00, 0x3D, 0x00,
+ 0x06, 0x00, 0xFD, 0xFF, 0x19, 0x00, 0x06, 0x00,
+ 0xF7, 0xFF, 0x19, 0x00, 0x06, 0x00, 0xF1, 0xFF,
+ 0x19, 0x00, 0x06, 0x00, 0xEB, 0xFF, 0x19, 0x00,
+ 0x09, 0x00, 0xE4, 0xFF, 0x22, 0x00, 0x0B, 0x00,
+ 0xDE, 0xFF, 0x29, 0x00, 0x0D, 0x00, 0xD8, 0xFF,
+ 0x32, 0x00, 0x0F, 0x00, 0xD2, 0xFF, 0x3D, 0x00,
+ 0x08, 0x00, 0x03, 0x00, 0x1E, 0x00, 0x08, 0x00,
+ 0x09, 0x00, 0x1E, 0x00, 0x08, 0x00, 0x0F, 0x00,
+ 0x1E, 0x00, 0x08, 0x00, 0x15, 0x00, 0x1E, 0x00,
+ 0x0B, 0x00, 0x1C, 0x00, 0x29, 0x00, 0x0D, 0x00,
+ 0x22, 0x00, 0x32, 0x00, 0x0F, 0x00, 0x28, 0x00,
+ 0x3D, 0x00, 0x11, 0x00, 0x2E, 0x00, 0x4A, 0x00,
+ 0x08, 0x00, 0xFD, 0xFF, 0x1E, 0x00, 0x08, 0x00,
+ 0xF7, 0xFF, 0x1E, 0x00, 0x08, 0x00, 0xF1, 0xFF,
+ 0x1E, 0x00, 0x08, 0x00, 0xEB, 0xFF, 0x1E, 0x00,
+ 0x0B, 0x00, 0xE4, 0xFF, 0x29, 0x00, 0x0D, 0x00,
+ 0xDE, 0xFF, 0x32, 0x00, 0x0F, 0x00, 0xD8, 0xFF,
+ 0x3D, 0x00, 0x11, 0x00, 0xD2, 0xFF, 0x4A, 0x00,
+ 0x0A, 0x00, 0x03, 0x00, 0x24, 0x00, 0x0A, 0x00,
+ 0x09, 0x00, 0x24, 0x00, 0x0A, 0x00, 0x0F, 0x00,
+ 0x24, 0x00, 0x0A, 0x00, 0x15, 0x00, 0x24, 0x00,
+ 0x0D, 0x00, 0x1C, 0x00, 0x31, 0x00, 0x0F, 0x00,
+ 0x22, 0x00, 0x3B, 0x00, 0x11, 0x00, 0x28, 0x00,
+ 0x48, 0x00, 0x13, 0x00, 0x2E, 0x00, 0x58, 0x00,
+ 0x0A, 0x00, 0xFD, 0xFF, 0x24, 0x00, 0x0A, 0x00,
+ 0xF7, 0xFF, 0x24, 0x00, 0x0A, 0x00, 0xF1, 0xFF,
+ 0x24, 0x00, 0x0A, 0x00, 0xEB, 0xFF, 0x24, 0x00,
+ 0x0D, 0x00, 0xE4, 0xFF, 0x31, 0x00, 0x0F, 0x00,
+ 0xDE, 0xFF, 0x3B, 0x00, 0x11, 0x00, 0xD8, 0xFF,
+ 0x48, 0x00, 0x13, 0x00, 0xD2, 0xFF, 0x58, 0x00,
+ 0x0C, 0x00, 0x03, 0x00, 0x29, 0x00, 0x0C, 0x00,
+ 0x09, 0x00, 0x29, 0x00, 0x0C, 0x00, 0x0F, 0x00,
+ 0x29, 0x00, 0x0C, 0x00, 0x15, 0x00, 0x29, 0x00,
+ 0x0F, 0x00, 0x1C, 0x00, 0x38, 0x00, 0x11, 0x00,
+ 0x22, 0x00, 0x44, 0x00, 0x13, 0x00, 0x28, 0x00,
+ 0x53, 0x00, 0x15, 0x00, 0x2E, 0x00, 0x65, 0x00,
+ 0x0C, 0x00, 0xFD, 0xFF, 0x29, 0x00, 0x0C, 0x00,
+ 0xF7, 0xFF, 0x29, 0x00, 0x0C, 0x00, 0xF1, 0xFF,
+ 0x29, 0x00, 0x0C, 0x00, 0xEB, 0xFF, 0x29, 0x00,
+ 0x0F, 0x00, 0xE4, 0xFF, 0x38, 0x00, 0x11, 0x00,
+ 0xDE, 0xFF, 0x44, 0x00, 0x13, 0x00, 0xD8, 0xFF,
+ 0x53, 0x00, 0x15, 0x00, 0xD2, 0xFF, 0x65, 0x00,
+ 0x03, 0x00, 0x03, 0x00, 0xFE, 0xFF, 0x03, 0x00,
+ 0x09, 0x00, 0xFE, 0xFF, 0x03, 0x00, 0x0F, 0x00,
+ 0xFE, 0xFF, 0x03, 0x00, 0x15, 0x00, 0xFE, 0xFF,
+ 0x06, 0x00, 0x1C, 0x00, 0xFD, 0xFF, 0x08, 0x00,
+ 0x22, 0x00, 0xFC, 0xFF, 0x0A, 0x00, 0x28, 0x00,
+ 0xFB, 0xFF, 0x0C, 0x00, 0x2E, 0x00, 0xFA, 0xFF,
+ 0x03, 0x00, 0xFD, 0xFF, 0xFE, 0xFF, 0x03, 0x00,
+ 0xF7, 0xFF, 0xFE, 0xFF, 0x03, 0x00, 0xF1, 0xFF,
+ 0xFE, 0xFF, 0x03, 0x00, 0xEB, 0xFF, 0xFE, 0xFF,
+ 0x06, 0x00, 0xE4, 0xFF, 0xFD, 0xFF, 0x08, 0x00,
+ 0xDE, 0xFF, 0xFC, 0xFF, 0x0A, 0x00, 0xD8, 0xFF,
+ 0xFB, 0xFF, 0x0C, 0x00, 0xD2, 0xFF, 0xFA, 0xFF,
+ 0x03, 0x00, 0x03, 0x00, 0xF9, 0xFF, 0x03, 0x00,
+ 0x09, 0x00, 0xF9, 0xFF, 0x03, 0x00, 0x0F, 0x00,
+ 0xF9, 0xFF, 0x03, 0x00, 0x15, 0x00, 0xF9, 0xFF,
+ 0x06, 0x00, 0x1C, 0x00, 0xF6, 0xFF, 0x08, 0x00,
+ 0x22, 0x00, 0xF3, 0xFF, 0x0A, 0x00, 0x28, 0x00,
+ 0xF0, 0xFF, 0x0C, 0x00, 0x2E, 0x00, 0xED, 0xFF,
+ 0x03, 0x00, 0xFD, 0xFF, 0xF9, 0xFF, 0x03, 0x00,
+ 0xF7, 0xFF, 0xF9, 0xFF, 0x03, 0x00, 0xF1, 0xFF,
+ 0xF9, 0xFF, 0x03, 0x00, 0xEB, 0xFF, 0xF9, 0xFF,
+ 0x06, 0x00, 0xE4, 0xFF, 0xF6, 0xFF, 0x08, 0x00,
+ 0xDE, 0xFF, 0xF3, 0xFF, 0x0A, 0x00, 0xD8, 0xFF,
+ 0xF0, 0xFF, 0x0C, 0x00, 0xD2, 0xFF, 0xED, 0xFF,
+ 0x03, 0x00, 0x03, 0x00, 0xF3, 0xFF, 0x03, 0x00,
+ 0x09, 0x00, 0xF3, 0xFF, 0x03, 0x00, 0x0F, 0x00,
+ 0xF3, 0xFF, 0x03, 0x00, 0x15, 0x00, 0xF3, 0xFF,
+ 0x06, 0x00, 0x1C, 0x00, 0xEE, 0xFF, 0x08, 0x00,
+ 0x22, 0x00, 0xEA, 0xFF, 0x0A, 0x00, 0x28, 0x00,
+ 0xE5, 0xFF, 0x0C, 0x00, 0x2E, 0x00, 0xDF, 0xFF,
+ 0x03, 0x00, 0xFD, 0xFF, 0xF3, 0xFF, 0x03, 0x00,
+ 0xF7, 0xFF, 0xF3, 0xFF, 0x03, 0x00, 0xF1, 0xFF,
+ 0xF3, 0xFF, 0x03, 0x00, 0xEB, 0xFF, 0xF3, 0xFF,
+ 0x06, 0x00, 0xE4, 0xFF, 0xEE, 0xFF, 0x08, 0x00,
+ 0xDE, 0xFF, 0xEA, 0xFF, 0x0A, 0x00, 0xD8, 0xFF,
+ 0xE5, 0xFF, 0x0C, 0x00, 0xD2, 0xFF, 0xDF, 0xFF,
+ 0x03, 0x00, 0x03, 0x00, 0xEE, 0xFF, 0x03, 0x00,
+ 0x09, 0x00, 0xEE, 0xFF, 0x03, 0x00, 0x0F, 0x00,
+ 0xEE, 0xFF, 0x03, 0x00, 0x15, 0x00, 0xEE, 0xFF,
+ 0x06, 0x00, 0x1C, 0x00, 0xE7, 0xFF, 0x08, 0x00,
+ 0x22, 0x00, 0xE1, 0xFF, 0x0A, 0x00, 0x28, 0x00,
+ 0xDA, 0xFF, 0x0C, 0x00, 0x2E, 0x00, 0xD2, 0xFF,
+ 0x03, 0x00, 0xFD, 0xFF, 0xEE, 0xFF, 0x03, 0x00,
+ 0xF7, 0xFF, 0xEE, 0xFF, 0x03, 0x00, 0xF1, 0xFF,
+ 0xEE, 0xFF, 0x03, 0x00, 0xEB, 0xFF, 0xEE, 0xFF,
+ 0x06, 0x00, 0xE4, 0xFF, 0xE7, 0xFF, 0x08, 0x00,
+ 0xDE, 0xFF, 0xE1, 0xFF, 0x0A, 0x00, 0xD8, 0xFF,
+ 0xDA, 0xFF, 0x0C, 0x00, 0xD2, 0xFF, 0xD2, 0xFF,
+ 0x06, 0x00, 0x03, 0x00, 0xE7, 0xFF, 0x06, 0x00,
+ 0x09, 0x00, 0xE7, 0xFF, 0x06, 0x00, 0x0F, 0x00,
+ 0xE7, 0xFF, 0x06, 0x00, 0x15, 0x00, 0xE7, 0xFF,
+ 0x09, 0x00, 0x1C, 0x00, 0xDE, 0xFF, 0x0B, 0x00,
+ 0x22, 0x00, 0xD7, 0xFF, 0x0D, 0x00, 0x28, 0x00,
+ 0xCE, 0xFF, 0x0F, 0x00, 0x2E, 0x00, 0xC3, 0xFF,
+ 0x06, 0x00, 0xFD, 0xFF, 0xE7, 0xFF, 0x06, 0x00,
+ 0xF7, 0xFF, 0xE7, 0xFF, 0x06, 0x00, 0xF1, 0xFF,
+ 0xE7, 0xFF, 0x06, 0x00, 0xEB, 0xFF, 0xE7, 0xFF,
+ 0x09, 0x00, 0xE4, 0xFF, 0xDE, 0xFF, 0x0B, 0x00,
+ 0xDE, 0xFF, 0xD7, 0xFF, 0x0D, 0x00, 0xD8, 0xFF,
+ 0xCE, 0xFF, 0x0F, 0x00, 0xD2, 0xFF, 0xC3, 0xFF,
+ 0x08, 0x00, 0x03, 0x00, 0xE2, 0xFF, 0x08, 0x00,
+ 0x09, 0x00, 0xE2, 0xFF, 0x08, 0x00, 0x0F, 0x00,
+ 0xE2, 0xFF, 0x08, 0x00, 0x15, 0x00, 0xE2, 0xFF,
+ 0x0B, 0x00, 0x1C, 0x00, 0xD7, 0xFF, 0x0D, 0x00,
+ 0x22, 0x00, 0xCE, 0xFF, 0x0F, 0x00, 0x28, 0x00,
+ 0xC3, 0xFF, 0x11, 0x00, 0x2E, 0x00, 0xB6, 0xFF,
+ 0x08, 0x00, 0xFD, 0xFF, 0xE2, 0xFF, 0x08, 0x00,
+ 0xF7, 0xFF, 0xE2, 0xFF, 0x08, 0x00, 0xF1, 0xFF,
+ 0xE2, 0xFF, 0x08, 0x00, 0xEB, 0xFF, 0xE2, 0xFF,
+ 0x0B, 0x00, 0xE4, 0xFF, 0xD7, 0xFF, 0x0D, 0x00,
+ 0xDE, 0xFF, 0xCE, 0xFF, 0x0F, 0x00, 0xD8, 0xFF,
+ 0xC3, 0xFF, 0x11, 0x00, 0xD2, 0xFF, 0xB6, 0xFF,
+ 0x0A, 0x00, 0x03, 0x00, 0xDC, 0xFF, 0x0A, 0x00,
+ 0x09, 0x00, 0xDC, 0xFF, 0x0A, 0x00, 0x0F, 0x00,
+ 0xDC, 0xFF, 0x0A, 0x00, 0x15, 0x00, 0xDC, 0xFF,
+ 0x0D, 0x00, 0x1C, 0x00, 0xCF, 0xFF, 0x0F, 0x00,
+ 0x22, 0x00, 0xC5, 0xFF, 0x11, 0x00, 0x28, 0x00,
+ 0xB8, 0xFF, 0x13, 0x00, 0x2E, 0x00, 0xA8, 0xFF,
+ 0x0A, 0x00, 0xFD, 0xFF, 0xDC, 0xFF, 0x0A, 0x00,
+ 0xF7, 0xFF, 0xDC, 0xFF, 0x0A, 0x00, 0xF1, 0xFF,
+ 0xDC, 0xFF, 0x0A, 0x00, 0xEB, 0xFF, 0xDC, 0xFF,
+ 0x0D, 0x00, 0xE4, 0xFF, 0xCF, 0xFF, 0x0F, 0x00,
+ 0xDE, 0xFF, 0xC5, 0xFF, 0x11, 0x00, 0xD8, 0xFF,
+ 0xB8, 0xFF, 0x13, 0x00, 0xD2, 0xFF, 0xA8, 0xFF,
+ 0x0C, 0x00, 0x03, 0x00, 0xD7, 0xFF, 0x0C, 0x00,
+ 0x09, 0x00, 0xD7, 0xFF, 0x0C, 0x00, 0x0F, 0x00,
+ 0xD7, 0xFF, 0x0C, 0x00, 0x15, 0x00, 0xD7, 0xFF,
+ 0x0F, 0x00, 0x1C, 0x00, 0xC8, 0xFF, 0x11, 0x00,
+ 0x22, 0x00, 0xBC, 0xFF, 0x13, 0x00, 0x28, 0x00,
+ 0xAD, 0xFF, 0x15, 0x00, 0x2E, 0x00, 0x9B, 0xFF,
+ 0x0C, 0x00, 0xFD, 0xFF, 0xD7, 0xFF, 0x0C, 0x00,
+ 0xF7, 0xFF, 0xD7, 0xFF, 0x0C, 0x00, 0xF1, 0xFF,
+ 0xD7, 0xFF, 0x0C, 0x00, 0xEB, 0xFF, 0xD7, 0xFF,
+ 0x0F, 0x00, 0xE4, 0xFF, 0xC8, 0xFF, 0x11, 0x00,
+ 0xDE, 0xFF, 0xBC, 0xFF, 0x13, 0x00, 0xD8, 0xFF,
+ 0xAD, 0xFF, 0x15, 0x00, 0xD2, 0xFF, 0x9B, 0xFF,
+ 0x04, 0x00, 0x03, 0x00, 0x03, 0x00, 0x04, 0x00,
+ 0x0A, 0x00, 0x03, 0x00, 0x04, 0x00, 0x11, 0x00,
+ 0x03, 0x00, 0x04, 0x00, 0x18, 0x00, 0x03, 0x00,
+ 0x07, 0x00, 0x1F, 0x00, 0x04, 0x00, 0x09, 0x00,
+ 0x26, 0x00, 0x05, 0x00, 0x0B, 0x00, 0x2D, 0x00,
+ 0x06, 0x00, 0x0D, 0x00, 0x34, 0x00, 0x07, 0x00,
+ 0x04, 0x00, 0xFD, 0xFF, 0x03, 0x00, 0x04, 0x00,
+ 0xF6, 0xFF, 0x03, 0x00, 0x04, 0x00, 0xEF, 0xFF,
+ 0x03, 0x00, 0x04, 0x00, 0xE8, 0xFF, 0x03, 0x00,
+ 0x07, 0x00, 0xE1, 0xFF, 0x04, 0x00, 0x09, 0x00,
+ 0xDA, 0xFF, 0x05, 0x00, 0x0B, 0x00, 0xD3, 0xFF,
+ 0x06, 0x00, 0x0D, 0x00, 0xCC, 0xFF, 0x07, 0x00,
+ 0x04, 0x00, 0x03, 0x00, 0x09, 0x00, 0x04, 0x00,
+ 0x0A, 0x00, 0x09, 0x00, 0x04, 0x00, 0x11, 0x00,
+ 0x09, 0x00, 0x04, 0x00, 0x18, 0x00, 0x09, 0x00,
+ 0x07, 0x00, 0x1F, 0x00, 0x0C, 0x00, 0x09, 0x00,
+ 0x26, 0x00, 0x0F, 0x00, 0x0B, 0x00, 0x2D, 0x00,
+ 0x12, 0x00, 0x0D, 0x00, 0x34, 0x00, 0x16, 0x00,
+ 0x04, 0x00, 0xFD, 0xFF, 0x09, 0x00, 0x04, 0x00,
+ 0xF6, 0xFF, 0x09, 0x00, 0x04, 0x00, 0xEF, 0xFF,
+ 0x09, 0x00, 0x04, 0x00, 0xE8, 0xFF, 0x09, 0x00,
+ 0x07, 0x00, 0xE1, 0xFF, 0x0C, 0x00, 0x09, 0x00,
+ 0xDA, 0xFF, 0x0F, 0x00, 0x0B, 0x00, 0xD3, 0xFF,
+ 0x12, 0x00, 0x0D, 0x00, 0xCC, 0xFF, 0x16, 0x00,
+ 0x04, 0x00, 0x03, 0x00, 0x0F, 0x00, 0x04, 0x00,
+ 0x0A, 0x00, 0x0F, 0x00, 0x04, 0x00, 0x11, 0x00,
+ 0x0F, 0x00, 0x04, 0x00, 0x18, 0x00, 0x0F, 0x00,
+ 0x07, 0x00, 0x1F, 0x00, 0x15, 0x00, 0x09, 0x00,
+ 0x26, 0x00, 0x19, 0x00, 0x0B, 0x00, 0x2D, 0x00,
+ 0x1F, 0x00, 0x0D, 0x00, 0x34, 0x00, 0x25, 0x00,
+ 0x04, 0x00, 0xFD, 0xFF, 0x0F, 0x00, 0x04, 0x00,
+ 0xF6, 0xFF, 0x0F, 0x00, 0x04, 0x00, 0xEF, 0xFF,
+ 0x0F, 0x00, 0x04, 0x00, 0xE8, 0xFF, 0x0F, 0x00,
+ 0x07, 0x00, 0xE1, 0xFF, 0x15, 0x00, 0x09, 0x00,
+ 0xDA, 0xFF, 0x19, 0x00, 0x0B, 0x00, 0xD3, 0xFF,
+ 0x1F, 0x00, 0x0D, 0x00, 0xCC, 0xFF, 0x25, 0x00,
+ 0x04, 0x00, 0x03, 0x00, 0x15, 0x00, 0x04, 0x00,
+ 0x0A, 0x00, 0x15, 0x00, 0x04, 0x00, 0x11, 0x00,
+ 0x15, 0x00, 0x04, 0x00, 0x18, 0x00, 0x15, 0x00,
+ 0x07, 0x00, 0x1F, 0x00, 0x1D, 0x00, 0x09, 0x00,
+ 0x26, 0x00, 0x23, 0x00, 0x0B, 0x00, 0x2D, 0x00,
+ 0x2B, 0x00, 0x0D, 0x00, 0x34, 0x00, 0x34, 0x00,
+ 0x04, 0x00, 0xFD, 0xFF, 0x15, 0x00, 0x04, 0x00,
+ 0xF6, 0xFF, 0x15, 0x00, 0x04, 0x00, 0xEF, 0xFF,
+ 0x15, 0x00, 0x04, 0x00, 0xE8, 0xFF, 0x15, 0x00,
+ 0x07, 0x00, 0xE1, 0xFF, 0x1D, 0x00, 0x09, 0x00,
+ 0xDA, 0xFF, 0x23, 0x00, 0x0B, 0x00, 0xD3, 0xFF,
+ 0x2B, 0x00, 0x0D, 0x00, 0xCC, 0xFF, 0x34, 0x00,
+ 0x07, 0x00, 0x03, 0x00, 0x1C, 0x00, 0x07, 0x00,
+ 0x0A, 0x00, 0x1C, 0x00, 0x07, 0x00, 0x11, 0x00,
+ 0x1C, 0x00, 0x07, 0x00, 0x18, 0x00, 0x1C, 0x00,
+ 0x0A, 0x00, 0x1F, 0x00, 0x26, 0x00, 0x0C, 0x00,
+ 0x26, 0x00, 0x2E, 0x00, 0x0E, 0x00, 0x2D, 0x00,
+ 0x38, 0x00, 0x10, 0x00, 0x34, 0x00, 0x43, 0x00,
+ 0x07, 0x00, 0xFD, 0xFF, 0x1C, 0x00, 0x07, 0x00,
+ 0xF6, 0xFF, 0x1C, 0x00, 0x07, 0x00, 0xEF, 0xFF,
+ 0x1C, 0x00, 0x07, 0x00, 0xE8, 0xFF, 0x1C, 0x00,
+ 0x0A, 0x00, 0xE1, 0xFF, 0x26, 0x00, 0x0C, 0x00,
+ 0xDA, 0xFF, 0x2E, 0x00, 0x0E, 0x00, 0xD3, 0xFF,
+ 0x38, 0x00, 0x10, 0x00, 0xCC, 0xFF, 0x43, 0x00,
+ 0x09, 0x00, 0x03, 0x00, 0x22, 0x00, 0x09, 0x00,
+ 0x0A, 0x00, 0x22, 0x00, 0x09, 0x00, 0x11, 0x00,
+ 0x22, 0x00, 0x09, 0x00, 0x18, 0x00, 0x22, 0x00,
+ 0x0C, 0x00, 0x1F, 0x00, 0x2E, 0x00, 0x0E, 0x00,
+ 0x26, 0x00, 0x38, 0x00, 0x10, 0x00, 0x2D, 0x00,
+ 0x44, 0x00, 0x12, 0x00, 0x34, 0x00, 0x52, 0x00,
+ 0x09, 0x00, 0xFD, 0xFF, 0x22, 0x00, 0x09, 0x00,
+ 0xF6, 0xFF, 0x22, 0x00, 0x09, 0x00, 0xEF, 0xFF,
+ 0x22, 0x00, 0x09, 0x00, 0xE8, 0xFF, 0x22, 0x00,
+ 0x0C, 0x00, 0xE1, 0xFF, 0x2E, 0x00, 0x0E, 0x00,
+ 0xDA, 0xFF, 0x38, 0x00, 0x10, 0x00, 0xD3, 0xFF,
+ 0x44, 0x00, 0x12, 0x00, 0xCC, 0xFF, 0x52, 0x00,
+ 0x0B, 0x00, 0x03, 0x00, 0x28, 0x00, 0x0B, 0x00,
+ 0x0A, 0x00, 0x28, 0x00, 0x0B, 0x00, 0x11, 0x00,
+ 0x28, 0x00, 0x0B, 0x00, 0x18, 0x00, 0x28, 0x00,
+ 0x0E, 0x00, 0x1F, 0x00, 0x37, 0x00, 0x10, 0x00,
+ 0x26, 0x00, 0x42, 0x00, 0x12, 0x00, 0x2D, 0x00,
+ 0x51, 0x00, 0x14, 0x00, 0x34, 0x00, 0x61, 0x00,
+ 0x0B, 0x00, 0xFD, 0xFF, 0x28, 0x00, 0x0B, 0x00,
+ 0xF6, 0xFF, 0x28, 0x00, 0x0B, 0x00, 0xEF, 0xFF,
+ 0x28, 0x00, 0x0B, 0x00, 0xE8, 0xFF, 0x28, 0x00,
+ 0x0E, 0x00, 0xE1, 0xFF, 0x37, 0x00, 0x10, 0x00,
+ 0xDA, 0xFF, 0x42, 0x00, 0x12, 0x00, 0xD3, 0xFF,
+ 0x51, 0x00, 0x14, 0x00, 0xCC, 0xFF, 0x61, 0x00,
+ 0x0D, 0x00, 0x03, 0x00, 0x2E, 0x00, 0x0D, 0x00,
+ 0x0A, 0x00, 0x2E, 0x00, 0x0D, 0x00, 0x11, 0x00,
+ 0x2E, 0x00, 0x0D, 0x00, 0x18, 0x00, 0x2E, 0x00,
+ 0x10, 0x00, 0x1F, 0x00, 0x3F, 0x00, 0x12, 0x00,
+ 0x26, 0x00, 0x4C, 0x00, 0x14, 0x00, 0x2D, 0x00,
+ 0x5D, 0x00, 0x16, 0x00, 0x34, 0x00, 0x70, 0x00,
+ 0x0D, 0x00, 0xFD, 0xFF, 0x2E, 0x00, 0x0D, 0x00,
+ 0xF6, 0xFF, 0x2E, 0x00, 0x0D, 0x00, 0xEF, 0xFF,
+ 0x2E, 0x00, 0x0D, 0x00, 0xE8, 0xFF, 0x2E, 0x00,
+ 0x10, 0x00, 0xE1, 0xFF, 0x3F, 0x00, 0x12, 0x00,
+ 0xDA, 0xFF, 0x4C, 0x00, 0x14, 0x00, 0xD3, 0xFF,
+ 0x5D, 0x00, 0x16, 0x00, 0xCC, 0xFF, 0x70, 0x00,
+ 0x04, 0x00, 0x03, 0x00, 0xFD, 0xFF, 0x04, 0x00,
+ 0x0A, 0x00, 0xFD, 0xFF, 0x04, 0x00, 0x11, 0x00,
+ 0xFD, 0xFF, 0x04, 0x00, 0x18, 0x00, 0xFD, 0xFF,
+ 0x07, 0x00, 0x1F, 0x00, 0xFC, 0xFF, 0x09, 0x00,
+ 0x26, 0x00, 0xFB, 0xFF, 0x0B, 0x00, 0x2D, 0x00,
+ 0xFA, 0xFF, 0x0D, 0x00, 0x34, 0x00, 0xF9, 0xFF,
+ 0x04, 0x00, 0xFD, 0xFF, 0xFD, 0xFF, 0x04, 0x00,
+ 0xF6, 0xFF, 0xFD, 0xFF, 0x04, 0x00, 0xEF, 0xFF,
+ 0xFD, 0xFF, 0x04, 0x00, 0xE8, 0xFF, 0xFD, 0xFF,
+ 0x07, 0x00, 0xE1, 0xFF, 0xFC, 0xFF, 0x09, 0x00,
+ 0xDA, 0xFF, 0xFB, 0xFF, 0x0B, 0x00, 0xD3, 0xFF,
+ 0xFA, 0xFF, 0x0D, 0x00, 0xCC, 0xFF, 0xF9, 0xFF,
+ 0x04, 0x00, 0x03, 0x00, 0xF7, 0xFF, 0x04, 0x00,
+ 0x0A, 0x00, 0xF7, 0xFF, 0x04, 0x00, 0x11, 0x00,
+ 0xF7, 0xFF, 0x04, 0x00, 0x18, 0x00, 0xF7, 0xFF,
+ 0x07, 0x00, 0x1F, 0x00, 0xF4, 0xFF, 0x09, 0x00,
+ 0x26, 0x00, 0xF1, 0xFF, 0x0B, 0x00, 0x2D, 0x00,
+ 0xEE, 0xFF, 0x0D, 0x00, 0x34, 0x00, 0xEA, 0xFF,
+ 0x04, 0x00, 0xFD, 0xFF, 0xF7, 0xFF, 0x04, 0x00,
+ 0xF6, 0xFF, 0xF7, 0xFF, 0x04, 0x00, 0xEF, 0xFF,
+ 0xF7, 0xFF, 0x04, 0x00, 0xE8, 0xFF, 0xF7, 0xFF,
+ 0x07, 0x00, 0xE1, 0xFF, 0xF4, 0xFF, 0x09, 0x00,
+ 0xDA, 0xFF, 0xF1, 0xFF, 0x0B, 0x00, 0xD3, 0xFF,
+ 0xEE, 0xFF, 0x0D, 0x00, 0xCC, 0xFF, 0xEA, 0xFF,
+ 0x04, 0x00, 0x03, 0x00, 0xF1, 0xFF, 0x04, 0x00,
+ 0x0A, 0x00, 0xF1, 0xFF, 0x04, 0x00, 0x11, 0x00,
+ 0xF1, 0xFF, 0x04, 0x00, 0x18, 0x00, 0xF1, 0xFF,
+ 0x07, 0x00, 0x1F, 0x00, 0xEB, 0xFF, 0x09, 0x00,
+ 0x26, 0x00, 0xE7, 0xFF, 0x0B, 0x00, 0x2D, 0x00,
+ 0xE1, 0xFF, 0x0D, 0x00, 0x34, 0x00, 0xDB, 0xFF,
+ 0x04, 0x00, 0xFD, 0xFF, 0xF1, 0xFF, 0x04, 0x00,
+ 0xF6, 0xFF, 0xF1, 0xFF, 0x04, 0x00, 0xEF, 0xFF,
+ 0xF1, 0xFF, 0x04, 0x00, 0xE8, 0xFF, 0xF1, 0xFF,
+ 0x07, 0x00, 0xE1, 0xFF, 0xEB, 0xFF, 0x09, 0x00,
+ 0xDA, 0xFF, 0xE7, 0xFF, 0x0B, 0x00, 0xD3, 0xFF,
+ 0xE1, 0xFF, 0x0D, 0x00, 0xCC, 0xFF, 0xDB, 0xFF,
+ 0x04, 0x00, 0x03, 0x00, 0xEB, 0xFF, 0x04, 0x00,
+ 0x0A, 0x00, 0xEB, 0xFF, 0x04, 0x00, 0x11, 0x00,
+ 0xEB, 0xFF, 0x04, 0x00, 0x18, 0x00, 0xEB, 0xFF,
+ 0x07, 0x00, 0x1F, 0x00, 0xE3, 0xFF, 0x09, 0x00,
+ 0x26, 0x00, 0xDD, 0xFF, 0x0B, 0x00, 0x2D, 0x00,
+ 0xD5, 0xFF, 0x0D, 0x00, 0x34, 0x00, 0xCC, 0xFF,
+ 0x04, 0x00, 0xFD, 0xFF, 0xEB, 0xFF, 0x04, 0x00,
+ 0xF6, 0xFF, 0xEB, 0xFF, 0x04, 0x00, 0xEF, 0xFF,
+ 0xEB, 0xFF, 0x04, 0x00, 0xE8, 0xFF, 0xEB, 0xFF,
+ 0x07, 0x00, 0xE1, 0xFF, 0xE3, 0xFF, 0x09, 0x00,
+ 0xDA, 0xFF, 0xDD, 0xFF, 0x0B, 0x00, 0xD3, 0xFF,
+ 0xD5, 0xFF, 0x0D, 0x00, 0xCC, 0xFF, 0xCC, 0xFF,
+ 0x07, 0x00, 0x03, 0x00, 0xE4, 0xFF, 0x07, 0x00,
+ 0x0A, 0x00, 0xE4, 0xFF, 0x07, 0x00, 0x11, 0x00,
+ 0xE4, 0xFF, 0x07, 0x00, 0x18, 0x00, 0xE4, 0xFF,
+ 0x0A, 0x00, 0x1F, 0x00, 0xDA, 0xFF, 0x0C, 0x00,
+ 0x26, 0x00, 0xD2, 0xFF, 0x0E, 0x00, 0x2D, 0x00,
+ 0xC8, 0xFF, 0x10, 0x00, 0x34, 0x00, 0xBD, 0xFF,
+ 0x07, 0x00, 0xFD, 0xFF, 0xE4, 0xFF, 0x07, 0x00,
+ 0xF6, 0xFF, 0xE4, 0xFF, 0x07, 0x00, 0xEF, 0xFF,
+ 0xE4, 0xFF, 0x07, 0x00, 0xE8, 0xFF, 0xE4, 0xFF,
+ 0x0A, 0x00, 0xE1, 0xFF, 0xDA, 0xFF, 0x0C, 0x00,
+ 0xDA, 0xFF, 0xD2, 0xFF, 0x0E, 0x00, 0xD3, 0xFF,
+ 0xC8, 0xFF, 0x10, 0x00, 0xCC, 0xFF, 0xBD, 0xFF,
+ 0x09, 0x00, 0x03, 0x00, 0xDE, 0xFF, 0x09, 0x00,
+ 0x0A, 0x00, 0xDE, 0xFF, 0x09, 0x00, 0x11, 0x00,
+ 0xDE, 0xFF, 0x09, 0x00, 0x18, 0x00, 0xDE, 0xFF,
+ 0x0C, 0x00, 0x1F, 0x00, 0xD2, 0xFF, 0x0E, 0x00,
+ 0x26, 0x00, 0xC8, 0xFF, 0x10, 0x00, 0x2D, 0x00,
+ 0xBC, 0xFF, 0x12, 0x00, 0x34, 0x00, 0xAE, 0xFF,
+ 0x09, 0x00, 0xFD, 0xFF, 0xDE, 0xFF, 0x09, 0x00,
+ 0xF6, 0xFF, 0xDE, 0xFF, 0x09, 0x00, 0xEF, 0xFF,
+ 0xDE, 0xFF, 0x09, 0x00, 0xE8, 0xFF, 0xDE, 0xFF,
+ 0x0C, 0x00, 0xE1, 0xFF, 0xD2, 0xFF, 0x0E, 0x00,
+ 0xDA, 0xFF, 0xC8, 0xFF, 0x10, 0x00, 0xD3, 0xFF,
+ 0xBC, 0xFF, 0x12, 0x00, 0xCC, 0xFF, 0xAE, 0xFF,
+ 0x0B, 0x00, 0x03, 0x00, 0xD8, 0xFF, 0x0B, 0x00,
+ 0x0A, 0x00, 0xD8, 0xFF, 0x0B, 0x00, 0x11, 0x00,
+ 0xD8, 0xFF, 0x0B, 0x00, 0x18, 0x00, 0xD8, 0xFF,
+ 0x0E, 0x00, 0x1F, 0x00, 0xC9, 0xFF, 0x10, 0x00,
+ 0x26, 0x00, 0xBE, 0xFF, 0x12, 0x00, 0x2D, 0x00,
+ 0xAF, 0xFF, 0x14, 0x00, 0x34, 0x00, 0x9F, 0xFF,
+ 0x0B, 0x00, 0xFD, 0xFF, 0xD8, 0xFF, 0x0B, 0x00,
+ 0xF6, 0xFF, 0xD8, 0xFF, 0x0B, 0x00, 0xEF, 0xFF,
+ 0xD8, 0xFF, 0x0B, 0x00, 0xE8, 0xFF, 0xD8, 0xFF,
+ 0x0E, 0x00, 0xE1, 0xFF, 0xC9, 0xFF, 0x10, 0x00,
+ 0xDA, 0xFF, 0xBE, 0xFF, 0x12, 0x00, 0xD3, 0xFF,
+ 0xAF, 0xFF, 0x14, 0x00, 0xCC, 0xFF, 0x9F, 0xFF,
+ 0x0D, 0x00, 0x03, 0x00, 0xD2, 0xFF, 0x0D, 0x00,
+ 0x0A, 0x00, 0xD2, 0xFF, 0x0D, 0x00, 0x11, 0x00,
+ 0xD2, 0xFF, 0x0D, 0x00, 0x18, 0x00, 0xD2, 0xFF,
+ 0x10, 0x00, 0x1F, 0x00, 0xC1, 0xFF, 0x12, 0x00,
+ 0x26, 0x00, 0xB4, 0xFF, 0x14, 0x00, 0x2D, 0x00,
+ 0xA3, 0xFF, 0x16, 0x00, 0x34, 0x00, 0x90, 0xFF,
+ 0x0D, 0x00, 0xFD, 0xFF, 0xD2, 0xFF, 0x0D, 0x00,
+ 0xF6, 0xFF, 0xD2, 0xFF, 0x0D, 0x00, 0xEF, 0xFF,
+ 0xD2, 0xFF, 0x0D, 0x00, 0xE8, 0xFF, 0xD2, 0xFF,
+ 0x10, 0x00, 0xE1, 0xFF, 0xC1, 0xFF, 0x12, 0x00,
+ 0xDA, 0xFF, 0xB4, 0xFF, 0x14, 0x00, 0xD3, 0xFF,
+ 0xA3, 0xFF, 0x16, 0x00, 0xCC, 0xFF, 0x90, 0xFF,
+ 0x05, 0x00, 0x03, 0x00, 0x03, 0x00, 0x05, 0x00,
+ 0x0A, 0x00, 0x03, 0x00, 0x05, 0x00, 0x12, 0x00,
+ 0x03, 0x00, 0x05, 0x00, 0x19, 0x00, 0x03, 0x00,
+ 0x08, 0x00, 0x22, 0x00, 0x04, 0x00, 0x0A, 0x00,
+ 0x29, 0x00, 0x05, 0x00, 0x0C, 0x00, 0x31, 0x00,
+ 0x06, 0x00, 0x0E, 0x00, 0x38, 0x00, 0x08, 0x00,
+ 0x05, 0x00, 0xFD, 0xFF, 0x03, 0x00, 0x05, 0x00,
+ 0xF6, 0xFF, 0x03, 0x00, 0x05, 0x00, 0xEE, 0xFF,
+ 0x03, 0x00, 0x05, 0x00, 0xE7, 0xFF, 0x03, 0x00,
+ 0x08, 0x00, 0xDE, 0xFF, 0x04, 0x00, 0x0A, 0x00,
+ 0xD7, 0xFF, 0x05, 0x00, 0x0C, 0x00, 0xCF, 0xFF,
+ 0x06, 0x00, 0x0E, 0x00, 0xC8, 0xFF, 0x08, 0x00,
+ 0x05, 0x00, 0x03, 0x00, 0x0A, 0x00, 0x05, 0x00,
+ 0x0A, 0x00, 0x0A, 0x00, 0x05, 0x00, 0x12, 0x00,
+ 0x0A, 0x00, 0x05, 0x00, 0x19, 0x00, 0x0A, 0x00,
+ 0x08, 0x00, 0x22, 0x00, 0x0D, 0x00, 0x0A, 0x00,
+ 0x29, 0x00, 0x10, 0x00, 0x0C, 0x00, 0x31, 0x00,
+ 0x13, 0x00, 0x0E, 0x00, 0x38, 0x00, 0x18, 0x00,
+ 0x05, 0x00, 0xFD, 0xFF, 0x0A, 0x00, 0x05, 0x00,
+ 0xF6, 0xFF, 0x0A, 0x00, 0x05, 0x00, 0xEE, 0xFF,
+ 0x0A, 0x00, 0x05, 0x00, 0xE7, 0xFF, 0x0A, 0x00,
+ 0x08, 0x00, 0xDE, 0xFF, 0x0D, 0x00, 0x0A, 0x00,
+ 0xD7, 0xFF, 0x10, 0x00, 0x0C, 0x00, 0xCF, 0xFF,
+ 0x13, 0x00, 0x0E, 0x00, 0xC8, 0xFF, 0x18, 0x00,
+ 0x05, 0x00, 0x03, 0x00, 0x11, 0x00, 0x05, 0x00,
+ 0x0A, 0x00, 0x11, 0x00, 0x05, 0x00, 0x12, 0x00,
+ 0x11, 0x00, 0x05, 0x00, 0x19, 0x00, 0x11, 0x00,
+ 0x08, 0x00, 0x22, 0x00, 0x16, 0x00, 0x0A, 0x00,
+ 0x29, 0x00, 0x1B, 0x00, 0x0C, 0x00, 0x31, 0x00,
+ 0x21, 0x00, 0x0E, 0x00, 0x38, 0x00, 0x29, 0x00,
+ 0x05, 0x00, 0xFD, 0xFF, 0x11, 0x00, 0x05, 0x00,
+ 0xF6, 0xFF, 0x11, 0x00, 0x05, 0x00, 0xEE, 0xFF,
+ 0x11, 0x00, 0x05, 0x00, 0xE7, 0xFF, 0x11, 0x00,
+ 0x08, 0x00, 0xDE, 0xFF, 0x16, 0x00, 0x0A, 0x00,
+ 0xD7, 0xFF, 0x1B, 0x00, 0x0C, 0x00, 0xCF, 0xFF,
+ 0x21, 0x00, 0x0E, 0x00, 0xC8, 0xFF, 0x29, 0x00,
+ 0x05, 0x00, 0x03, 0x00, 0x18, 0x00, 0x05, 0x00,
+ 0x0A, 0x00, 0x18, 0x00, 0x05, 0x00, 0x12, 0x00,
+ 0x18, 0x00, 0x05, 0x00, 0x19, 0x00, 0x18, 0x00,
+ 0x08, 0x00, 0x22, 0x00, 0x1F, 0x00, 0x0A, 0x00,
+ 0x29, 0x00, 0x26, 0x00, 0x0C, 0x00, 0x31, 0x00,
+ 0x2E, 0x00, 0x0E, 0x00, 0x38, 0x00, 0x39, 0x00,
+ 0x05, 0x00, 0xFD, 0xFF, 0x18, 0x00, 0x05, 0x00,
+ 0xF6, 0xFF, 0x18, 0x00, 0x05, 0x00, 0xEE, 0xFF,
+ 0x18, 0x00, 0x05, 0x00, 0xE7, 0xFF, 0x18, 0x00,
+ 0x08, 0x00, 0xDE, 0xFF, 0x1F, 0x00, 0x0A, 0x00,
+ 0xD7, 0xFF, 0x26, 0x00, 0x0C, 0x00, 0xCF, 0xFF,
+ 0x2E, 0x00, 0x0E, 0x00, 0xC8, 0xFF, 0x39, 0x00,
+ 0x08, 0x00, 0x03, 0x00, 0x1F, 0x00, 0x08, 0x00,
+ 0x0A, 0x00, 0x1F, 0x00, 0x08, 0x00, 0x12, 0x00,
+ 0x1F, 0x00, 0x08, 0x00, 0x19, 0x00, 0x1F, 0x00,
+ 0x0B, 0x00, 0x22, 0x00, 0x29, 0x00, 0x0D, 0x00,
+ 0x29, 0x00, 0x32, 0x00, 0x0F, 0x00, 0x31, 0x00,
+ 0x3D, 0x00, 0x11, 0x00, 0x38, 0x00, 0x4A, 0x00,
+ 0x08, 0x00, 0xFD, 0xFF, 0x1F, 0x00, 0x08, 0x00,
+ 0xF6, 0xFF, 0x1F, 0x00, 0x08, 0x00, 0xEE, 0xFF,
+ 0x1F, 0x00, 0x08, 0x00, 0xE7, 0xFF, 0x1F, 0x00,
+ 0x0B, 0x00, 0xDE, 0xFF, 0x29, 0x00, 0x0D, 0x00,
+ 0xD7, 0xFF, 0x32, 0x00, 0x0F, 0x00, 0xCF, 0xFF,
+ 0x3D, 0x00, 0x11, 0x00, 0xC8, 0xFF, 0x4A, 0x00,
+ 0x0A, 0x00, 0x03, 0x00, 0x26, 0x00, 0x0A, 0x00,
+ 0x0A, 0x00, 0x26, 0x00, 0x0A, 0x00, 0x12, 0x00,
+ 0x26, 0x00, 0x0A, 0x00, 0x19, 0x00, 0x26, 0x00,
+ 0x0D, 0x00, 0x22, 0x00, 0x32, 0x00, 0x0F, 0x00,
+ 0x29, 0x00, 0x3D, 0x00, 0x11, 0x00, 0x31, 0x00,
+ 0x4A, 0x00, 0x13, 0x00, 0x38, 0x00, 0x5A, 0x00,
+ 0x0A, 0x00, 0xFD, 0xFF, 0x26, 0x00, 0x0A, 0x00,
+ 0xF6, 0xFF, 0x26, 0x00, 0x0A, 0x00, 0xEE, 0xFF,
+ 0x26, 0x00, 0x0A, 0x00, 0xE7, 0xFF, 0x26, 0x00,
+ 0x0D, 0x00, 0xDE, 0xFF, 0x32, 0x00, 0x0F, 0x00,
+ 0xD7, 0xFF, 0x3D, 0x00, 0x11, 0x00, 0xCF, 0xFF,
+ 0x4A, 0x00, 0x13, 0x00, 0xC8, 0xFF, 0x5A, 0x00,
+ 0x0C, 0x00, 0x03, 0x00, 0x2D, 0x00, 0x0C, 0x00,
+ 0x0A, 0x00, 0x2D, 0x00, 0x0C, 0x00, 0x12, 0x00,
+ 0x2D, 0x00, 0x0C, 0x00, 0x19, 0x00, 0x2D, 0x00,
+ 0x0F, 0x00, 0x22, 0x00, 0x3B, 0x00, 0x11, 0x00,
+ 0x29, 0x00, 0x48, 0x00, 0x13, 0x00, 0x31, 0x00,
+ 0x58, 0x00, 0x15, 0x00, 0x38, 0x00, 0x6B, 0x00,
+ 0x0C, 0x00, 0xFD, 0xFF, 0x2D, 0x00, 0x0C, 0x00,
+ 0xF6, 0xFF, 0x2D, 0x00, 0x0C, 0x00, 0xEE, 0xFF,
+ 0x2D, 0x00, 0x0C, 0x00, 0xE7, 0xFF, 0x2D, 0x00,
+ 0x0F, 0x00, 0xDE, 0xFF, 0x3B, 0x00, 0x11, 0x00,
+ 0xD7, 0xFF, 0x48, 0x00, 0x13, 0x00, 0xCF, 0xFF,
+ 0x58, 0x00, 0x15, 0x00, 0xC8, 0xFF, 0x6B, 0x00,
+ 0x0E, 0x00, 0x03, 0x00, 0x34, 0x00, 0x0E, 0x00,
+ 0x0A, 0x00, 0x34, 0x00, 0x0E, 0x00, 0x12, 0x00,
+ 0x34, 0x00, 0x0E, 0x00, 0x19, 0x00, 0x34, 0x00,
+ 0x11, 0x00, 0x22, 0x00, 0x44, 0x00, 0x13, 0x00,
+ 0x29, 0x00, 0x53, 0x00, 0x15, 0x00, 0x31, 0x00,
+ 0x65, 0x00, 0x17, 0x00, 0x38, 0x00, 0x7B, 0x00,
+ 0x0E, 0x00, 0xFD, 0xFF, 0x34, 0x00, 0x0E, 0x00,
+ 0xF6, 0xFF, 0x34, 0x00, 0x0E, 0x00, 0xEE, 0xFF,
+ 0x34, 0x00, 0x0E, 0x00, 0xE7, 0xFF, 0x34, 0x00,
+ 0x11, 0x00, 0xDE, 0xFF, 0x44, 0x00, 0x13, 0x00,
+ 0xD7, 0xFF, 0x53, 0x00, 0x15, 0x00, 0xCF, 0xFF,
+ 0x65, 0x00, 0x17, 0x00, 0xC8, 0xFF, 0x7B, 0x00,
+ 0x05, 0x00, 0x03, 0x00, 0xFD, 0xFF, 0x05, 0x00,
+ 0x0A, 0x00, 0xFD, 0xFF, 0x05, 0x00, 0x12, 0x00,
+ 0xFD, 0xFF, 0x05, 0x00, 0x19, 0x00, 0xFD, 0xFF,
+ 0x08, 0x00, 0x22, 0x00, 0xFC, 0xFF, 0x0A, 0x00,
+ 0x29, 0x00, 0xFB, 0xFF, 0x0C, 0x00, 0x31, 0x00,
+ 0xFA, 0xFF, 0x0E, 0x00, 0x38, 0x00, 0xF8, 0xFF,
+ 0x05, 0x00, 0xFD, 0xFF, 0xFD, 0xFF, 0x05, 0x00,
+ 0xF6, 0xFF, 0xFD, 0xFF, 0x05, 0x00, 0xEE, 0xFF,
+ 0xFD, 0xFF, 0x05, 0x00, 0xE7, 0xFF, 0xFD, 0xFF,
+ 0x08, 0x00, 0xDE, 0xFF, 0xFC, 0xFF, 0x0A, 0x00,
+ 0xD7, 0xFF, 0xFB, 0xFF, 0x0C, 0x00, 0xCF, 0xFF,
+ 0xFA, 0xFF, 0x0E, 0x00, 0xC8, 0xFF, 0xF8, 0xFF,
+ 0x05, 0x00, 0x03, 0x00, 0xF6, 0xFF, 0x05, 0x00,
+ 0x0A, 0x00, 0xF6, 0xFF, 0x05, 0x00, 0x12, 0x00,
+ 0xF6, 0xFF, 0x05, 0x00, 0x19, 0x00, 0xF6, 0xFF,
+ 0x08, 0x00, 0x22, 0x00, 0xF3, 0xFF, 0x0A, 0x00,
+ 0x29, 0x00, 0xF0, 0xFF, 0x0C, 0x00, 0x31, 0x00,
+ 0xED, 0xFF, 0x0E, 0x00, 0x38, 0x00, 0xE8, 0xFF,
+ 0x05, 0x00, 0xFD, 0xFF, 0xF6, 0xFF, 0x05, 0x00,
+ 0xF6, 0xFF, 0xF6, 0xFF, 0x05, 0x00, 0xEE, 0xFF,
+ 0xF6, 0xFF, 0x05, 0x00, 0xE7, 0xFF, 0xF6, 0xFF,
+ 0x08, 0x00, 0xDE, 0xFF, 0xF3, 0xFF, 0x0A, 0x00,
+ 0xD7, 0xFF, 0xF0, 0xFF, 0x0C, 0x00, 0xCF, 0xFF,
+ 0xED, 0xFF, 0x0E, 0x00, 0xC8, 0xFF, 0xE8, 0xFF,
+ 0x05, 0x00, 0x03, 0x00, 0xEF, 0xFF, 0x05, 0x00,
+ 0x0A, 0x00, 0xEF, 0xFF, 0x05, 0x00, 0x12, 0x00,
+ 0xEF, 0xFF, 0x05, 0x00, 0x19, 0x00, 0xEF, 0xFF,
+ 0x08, 0x00, 0x22, 0x00, 0xEA, 0xFF, 0x0A, 0x00,
+ 0x29, 0x00, 0xE5, 0xFF, 0x0C, 0x00, 0x31, 0x00,
+ 0xDF, 0xFF, 0x0E, 0x00, 0x38, 0x00, 0xD7, 0xFF,
+ 0x05, 0x00, 0xFD, 0xFF, 0xEF, 0xFF, 0x05, 0x00,
+ 0xF6, 0xFF, 0xEF, 0xFF, 0x05, 0x00, 0xEE, 0xFF,
+ 0xEF, 0xFF, 0x05, 0x00, 0xE7, 0xFF, 0xEF, 0xFF,
+ 0x08, 0x00, 0xDE, 0xFF, 0xEA, 0xFF, 0x0A, 0x00,
+ 0xD7, 0xFF, 0xE5, 0xFF, 0x0C, 0x00, 0xCF, 0xFF,
+ 0xDF, 0xFF, 0x0E, 0x00, 0xC8, 0xFF, 0xD7, 0xFF,
+ 0x05, 0x00, 0x03, 0x00, 0xE8, 0xFF, 0x05, 0x00,
+ 0x0A, 0x00, 0xE8, 0xFF, 0x05, 0x00, 0x12, 0x00,
+ 0xE8, 0xFF, 0x05, 0x00, 0x19, 0x00, 0xE8, 0xFF,
+ 0x08, 0x00, 0x22, 0x00, 0xE1, 0xFF, 0x0A, 0x00,
+ 0x29, 0x00, 0xDA, 0xFF, 0x0C, 0x00, 0x31, 0x00,
+ 0xD2, 0xFF, 0x0E, 0x00, 0x38, 0x00, 0xC7, 0xFF,
+ 0x05, 0x00, 0xFD, 0xFF, 0xE8, 0xFF, 0x05, 0x00,
+ 0xF6, 0xFF, 0xE8, 0xFF, 0x05, 0x00, 0xEE, 0xFF,
+ 0xE8, 0xFF, 0x05, 0x00, 0xE7, 0xFF, 0xE8, 0xFF,
+ 0x08, 0x00, 0xDE, 0xFF, 0xE1, 0xFF, 0x0A, 0x00,
+ 0xD7, 0xFF, 0xDA, 0xFF, 0x0C, 0x00, 0xCF, 0xFF,
+ 0xD2, 0xFF, 0x0E, 0x00, 0xC8, 0xFF, 0xC7, 0xFF,
+ 0x08, 0x00, 0x03, 0x00, 0xE1, 0xFF, 0x08, 0x00,
+ 0x0A, 0x00, 0xE1, 0xFF, 0x08, 0x00, 0x12, 0x00,
+ 0xE1, 0xFF, 0x08, 0x00, 0x19, 0x00, 0xE1, 0xFF,
+ 0x0B, 0x00, 0x22, 0x00, 0xD7, 0xFF, 0x0D, 0x00,
+ 0x29, 0x00, 0xCE, 0xFF, 0x0F, 0x00, 0x31, 0x00,
+ 0xC3, 0xFF, 0x11, 0x00, 0x38, 0x00, 0xB6, 0xFF,
+ 0x08, 0x00, 0xFD, 0xFF, 0xE1, 0xFF, 0x08, 0x00,
+ 0xF6, 0xFF, 0xE1, 0xFF, 0x08, 0x00, 0xEE, 0xFF,
+ 0xE1, 0xFF, 0x08, 0x00, 0xE7, 0xFF, 0xE1, 0xFF,
+ 0x0B, 0x00, 0xDE, 0xFF, 0xD7, 0xFF, 0x0D, 0x00,
+ 0xD7, 0xFF, 0xCE, 0xFF, 0x0F, 0x00, 0xCF, 0xFF,
+ 0xC3, 0xFF, 0x11, 0x00, 0xC8, 0xFF, 0xB6, 0xFF,
+ 0x0A, 0x00, 0x03, 0x00, 0xDA, 0xFF, 0x0A, 0x00,
+ 0x0A, 0x00, 0xDA, 0xFF, 0x0A, 0x00, 0x12, 0x00,
+ 0xDA, 0xFF, 0x0A, 0x00, 0x19, 0x00, 0xDA, 0xFF,
+ 0x0D, 0x00, 0x22, 0x00, 0xCE, 0xFF, 0x0F, 0x00,
+ 0x29, 0x00, 0xC3, 0xFF, 0x11, 0x00, 0x31, 0x00,
+ 0xB6, 0xFF, 0x13, 0x00, 0x38, 0x00, 0xA6, 0xFF,
+ 0x0A, 0x00, 0xFD, 0xFF, 0xDA, 0xFF, 0x0A, 0x00,
+ 0xF6, 0xFF, 0xDA, 0xFF, 0x0A, 0x00, 0xEE, 0xFF,
+ 0xDA, 0xFF, 0x0A, 0x00, 0xE7, 0xFF, 0xDA, 0xFF,
+ 0x0D, 0x00, 0xDE, 0xFF, 0xCE, 0xFF, 0x0F, 0x00,
+ 0xD7, 0xFF, 0xC3, 0xFF, 0x11, 0x00, 0xCF, 0xFF,
+ 0xB6, 0xFF, 0x13, 0x00, 0xC8, 0xFF, 0xA6, 0xFF,
+ 0x0C, 0x00, 0x03, 0x00, 0xD3, 0xFF, 0x0C, 0x00,
+ 0x0A, 0x00, 0xD3, 0xFF, 0x0C, 0x00, 0x12, 0x00,
+ 0xD3, 0xFF, 0x0C, 0x00, 0x19, 0x00, 0xD3, 0xFF,
+ 0x0F, 0x00, 0x22, 0x00, 0xC5, 0xFF, 0x11, 0x00,
+ 0x29, 0x00, 0xB8, 0xFF, 0x13, 0x00, 0x31, 0x00,
+ 0xA8, 0xFF, 0x15, 0x00, 0x38, 0x00, 0x95, 0xFF,
+ 0x0C, 0x00, 0xFD, 0xFF, 0xD3, 0xFF, 0x0C, 0x00,
+ 0xF6, 0xFF, 0xD3, 0xFF, 0x0C, 0x00, 0xEE, 0xFF,
+ 0xD3, 0xFF, 0x0C, 0x00, 0xE7, 0xFF, 0xD3, 0xFF,
+ 0x0F, 0x00, 0xDE, 0xFF, 0xC5, 0xFF, 0x11, 0x00,
+ 0xD7, 0xFF, 0xB8, 0xFF, 0x13, 0x00, 0xCF, 0xFF,
+ 0xA8, 0xFF, 0x15, 0x00, 0xC8, 0xFF, 0x95, 0xFF,
+ 0x0E, 0x00, 0x03, 0x00, 0xCC, 0xFF, 0x0E, 0x00,
+ 0x0A, 0x00, 0xCC, 0xFF, 0x0E, 0x00, 0x12, 0x00,
+ 0xCC, 0xFF, 0x0E, 0x00, 0x19, 0x00, 0xCC, 0xFF,
+ 0x11, 0x00, 0x22, 0x00, 0xBC, 0xFF, 0x13, 0x00,
+ 0x29, 0x00, 0xAD, 0xFF, 0x15, 0x00, 0x31, 0x00,
+ 0x9B, 0xFF, 0x17, 0x00, 0x38, 0x00, 0x85, 0xFF,
+ 0x0E, 0x00, 0xFD, 0xFF, 0xCC, 0xFF, 0x0E, 0x00,
+ 0xF6, 0xFF, 0xCC, 0xFF, 0x0E, 0x00, 0xEE, 0xFF,
+ 0xCC, 0xFF, 0x0E, 0x00, 0xE7, 0xFF, 0xCC, 0xFF,
+ 0x11, 0x00, 0xDE, 0xFF, 0xBC, 0xFF, 0x13, 0x00,
+ 0xD7, 0xFF, 0xAD, 0xFF, 0x15, 0x00, 0xCF, 0xFF,
+ 0x9B, 0xFF, 0x17, 0x00, 0xC8, 0xFF, 0x85, 0xFF,
+ 0x06, 0x00, 0x04, 0x00, 0x03, 0x00, 0x06, 0x00,
+ 0x0C, 0x00, 0x03, 0x00, 0x06, 0x00, 0x15, 0x00,
+ 0x03, 0x00, 0x06, 0x00, 0x1D, 0x00, 0x03, 0x00,
+ 0x09, 0x00, 0x26, 0x00, 0x05, 0x00, 0x0B, 0x00,
+ 0x2E, 0x00, 0x06, 0x00, 0x0D, 0x00, 0x37, 0x00,
+ 0x07, 0x00, 0x0F, 0x00, 0x3F, 0x00, 0x09, 0x00,
+ 0x06, 0x00, 0xFC, 0xFF, 0x03, 0x00, 0x06, 0x00,
+ 0xF4, 0xFF, 0x03, 0x00, 0x06, 0x00, 0xEB, 0xFF,
+ 0x03, 0x00, 0x06, 0x00, 0xE3, 0xFF, 0x03, 0x00,
+ 0x09, 0x00, 0xDA, 0xFF, 0x05, 0x00, 0x0B, 0x00,
+ 0xD2, 0xFF, 0x06, 0x00, 0x0D, 0x00, 0xC9, 0xFF,
+ 0x07, 0x00, 0x0F, 0x00, 0xC1, 0xFF, 0x09, 0x00,
+ 0x06, 0x00, 0x04, 0x00, 0x0A, 0x00, 0x06, 0x00,
+ 0x0C, 0x00, 0x0A, 0x00, 0x06, 0x00, 0x15, 0x00,
+ 0x0A, 0x00, 0x06, 0x00, 0x1D, 0x00, 0x0A, 0x00,
+ 0x09, 0x00, 0x26, 0x00, 0x0F, 0x00, 0x0B, 0x00,
+ 0x2E, 0x00, 0x12, 0x00, 0x0D, 0x00, 0x37, 0x00,
+ 0x16, 0x00, 0x0F, 0x00, 0x3F, 0x00, 0x1B, 0x00,
+ 0x06, 0x00, 0xFC, 0xFF, 0x0A, 0x00, 0x06, 0x00,
+ 0xF4, 0xFF, 0x0A, 0x00, 0x06, 0x00, 0xEB, 0xFF,
+ 0x0A, 0x00, 0x06, 0x00, 0xE3, 0xFF, 0x0A, 0x00,
+ 0x09, 0x00, 0xDA, 0xFF, 0x0F, 0x00, 0x0B, 0x00,
+ 0xD2, 0xFF, 0x12, 0x00, 0x0D, 0x00, 0xC9, 0xFF,
+ 0x16, 0x00, 0x0F, 0x00, 0xC1, 0xFF, 0x1B, 0x00,
+ 0x06, 0x00, 0x04, 0x00, 0x12, 0x00, 0x06, 0x00,
+ 0x0C, 0x00, 0x12, 0x00, 0x06, 0x00, 0x15, 0x00,
+ 0x12, 0x00, 0x06, 0x00, 0x1D, 0x00, 0x12, 0x00,
+ 0x09, 0x00, 0x26, 0x00, 0x19, 0x00, 0x0B, 0x00,
+ 0x2E, 0x00, 0x1F, 0x00, 0x0D, 0x00, 0x37, 0x00,
+ 0x25, 0x00, 0x0F, 0x00, 0x3F, 0x00, 0x2D, 0x00,
+ 0x06, 0x00, 0xFC, 0xFF, 0x12, 0x00, 0x06, 0x00,
+ 0xF4, 0xFF, 0x12, 0x00, 0x06, 0x00, 0xEB, 0xFF,
+ 0x12, 0x00, 0x06, 0x00, 0xE3, 0xFF, 0x12, 0x00,
+ 0x09, 0x00, 0xDA, 0xFF, 0x19, 0x00, 0x0B, 0x00,
+ 0xD2, 0xFF, 0x1F, 0x00, 0x0D, 0x00, 0xC9, 0xFF,
+ 0x25, 0x00, 0x0F, 0x00, 0xC1, 0xFF, 0x2D, 0x00,
+ 0x06, 0x00, 0x04, 0x00, 0x19, 0x00, 0x06, 0x00,
+ 0x0C, 0x00, 0x19, 0x00, 0x06, 0x00, 0x15, 0x00,
+ 0x19, 0x00, 0x06, 0x00, 0x1D, 0x00, 0x19, 0x00,
+ 0x09, 0x00, 0x26, 0x00, 0x23, 0x00, 0x0B, 0x00,
+ 0x2E, 0x00, 0x2B, 0x00, 0x0D, 0x00, 0x37, 0x00,
+ 0x34, 0x00, 0x0F, 0x00, 0x3F, 0x00, 0x3F, 0x00,
+ 0x06, 0x00, 0xFC, 0xFF, 0x19, 0x00, 0x06, 0x00,
+ 0xF4, 0xFF, 0x19, 0x00, 0x06, 0x00, 0xEB, 0xFF,
+ 0x19, 0x00, 0x06, 0x00, 0xE3, 0xFF, 0x19, 0x00,
+ 0x09, 0x00, 0xDA, 0xFF, 0x23, 0x00, 0x0B, 0x00,
+ 0xD2, 0xFF, 0x2B, 0x00, 0x0D, 0x00, 0xC9, 0xFF,
+ 0x34, 0x00, 0x0F, 0x00, 0xC1, 0xFF, 0x3F, 0x00,
+ 0x09, 0x00, 0x04, 0x00, 0x22, 0x00, 0x09, 0x00,
+ 0x0C, 0x00, 0x22, 0x00, 0x09, 0x00, 0x15, 0x00,
+ 0x22, 0x00, 0x09, 0x00, 0x1D, 0x00, 0x22, 0x00,
+ 0x0C, 0x00, 0x26, 0x00, 0x2E, 0x00, 0x0E, 0x00,
+ 0x2E, 0x00, 0x38, 0x00, 0x10, 0x00, 0x37, 0x00,
+ 0x43, 0x00, 0x12, 0x00, 0x3F, 0x00, 0x52, 0x00,
+ 0x09, 0x00, 0xFC, 0xFF, 0x22, 0x00, 0x09, 0x00,
+ 0xF4, 0xFF, 0x22, 0x00, 0x09, 0x00, 0xEB, 0xFF,
+ 0x22, 0x00, 0x09, 0x00, 0xE3, 0xFF, 0x22, 0x00,
+ 0x0C, 0x00, 0xDA, 0xFF, 0x2E, 0x00, 0x0E, 0x00,
+ 0xD2, 0xFF, 0x38, 0x00, 0x10, 0x00, 0xC9, 0xFF,
+ 0x43, 0x00, 0x12, 0x00, 0xC1, 0xFF, 0x52, 0x00,
+ 0x0B, 0x00, 0x04, 0x00, 0x29, 0x00, 0x0B, 0x00,
+ 0x0C, 0x00, 0x29, 0x00, 0x0B, 0x00, 0x15, 0x00,
+ 0x29, 0x00, 0x0B, 0x00, 0x1D, 0x00, 0x29, 0x00,
+ 0x0E, 0x00, 0x26, 0x00, 0x38, 0x00, 0x10, 0x00,
+ 0x2E, 0x00, 0x44, 0x00, 0x12, 0x00, 0x37, 0x00,
+ 0x52, 0x00, 0x14, 0x00, 0x3F, 0x00, 0x64, 0x00,
+ 0x0B, 0x00, 0xFC, 0xFF, 0x29, 0x00, 0x0B, 0x00,
+ 0xF4, 0xFF, 0x29, 0x00, 0x0B, 0x00, 0xEB, 0xFF,
+ 0x29, 0x00, 0x0B, 0x00, 0xE3, 0xFF, 0x29, 0x00,
+ 0x0E, 0x00, 0xDA, 0xFF, 0x38, 0x00, 0x10, 0x00,
+ 0xD2, 0xFF, 0x44, 0x00, 0x12, 0x00, 0xC9, 0xFF,
+ 0x52, 0x00, 0x14, 0x00, 0xC1, 0xFF, 0x64, 0x00,
+ 0x0D, 0x00, 0x04, 0x00, 0x31, 0x00, 0x0D, 0x00,
+ 0x0C, 0x00, 0x31, 0x00, 0x0D, 0x00, 0x15, 0x00,
+ 0x31, 0x00, 0x0D, 0x00, 0x1D, 0x00, 0x31, 0x00,
+ 0x10, 0x00, 0x26, 0x00, 0x42, 0x00, 0x12, 0x00,
+ 0x2E, 0x00, 0x51, 0x00, 0x14, 0x00, 0x37, 0x00,
+ 0x61, 0x00, 0x16, 0x00, 0x3F, 0x00, 0x76, 0x00,
+ 0x0D, 0x00, 0xFC, 0xFF, 0x31, 0x00, 0x0D, 0x00,
+ 0xF4, 0xFF, 0x31, 0x00, 0x0D, 0x00, 0xEB, 0xFF,
+ 0x31, 0x00, 0x0D, 0x00, 0xE3, 0xFF, 0x31, 0x00,
+ 0x10, 0x00, 0xDA, 0xFF, 0x42, 0x00, 0x12, 0x00,
+ 0xD2, 0xFF, 0x51, 0x00, 0x14, 0x00, 0xC9, 0xFF,
+ 0x61, 0x00, 0x16, 0x00, 0xC1, 0xFF, 0x76, 0x00,
+ 0x0F, 0x00, 0x04, 0x00, 0x38, 0x00, 0x0F, 0x00,
+ 0x0C, 0x00, 0x38, 0x00, 0x0F, 0x00, 0x15, 0x00,
+ 0x38, 0x00, 0x0F, 0x00, 0x1D, 0x00, 0x38, 0x00,
+ 0x12, 0x00, 0x26, 0x00, 0x4C, 0x00, 0x14, 0x00,
+ 0x2E, 0x00, 0x5D, 0x00, 0x16, 0x00, 0x37, 0x00,
+ 0x70, 0x00, 0x18, 0x00, 0x3F, 0x00, 0x88, 0x00,
+ 0x0F, 0x00, 0xFC, 0xFF, 0x38, 0x00, 0x0F, 0x00,
+ 0xF4, 0xFF, 0x38, 0x00, 0x0F, 0x00, 0xEB, 0xFF,
+ 0x38, 0x00, 0x0F, 0x00, 0xE3, 0xFF, 0x38, 0x00,
+ 0x12, 0x00, 0xDA, 0xFF, 0x4C, 0x00, 0x14, 0x00,
+ 0xD2, 0xFF, 0x5D, 0x00, 0x16, 0x00, 0xC9, 0xFF,
+ 0x70, 0x00, 0x18, 0x00, 0xC1, 0xFF, 0x88, 0x00,
+ 0x06, 0x00, 0x04, 0x00, 0xFD, 0xFF, 0x06, 0x00,
+ 0x0C, 0x00, 0xFD, 0xFF, 0x06, 0x00, 0x15, 0x00,
+ 0xFD, 0xFF, 0x06, 0x00, 0x1D, 0x00, 0xFD, 0xFF,
+ 0x09, 0x00, 0x26, 0x00, 0xFB, 0xFF, 0x0B, 0x00,
+ 0x2E, 0x00, 0xFA, 0xFF, 0x0D, 0x00, 0x37, 0x00,
+ 0xF9, 0xFF, 0x0F, 0x00, 0x3F, 0x00, 0xF7, 0xFF,
+ 0x06, 0x00, 0xFC, 0xFF, 0xFD, 0xFF, 0x06, 0x00,
+ 0xF4, 0xFF, 0xFD, 0xFF, 0x06, 0x00, 0xEB, 0xFF,
+ 0xFD, 0xFF, 0x06, 0x00, 0xE3, 0xFF, 0xFD, 0xFF,
+ 0x09, 0x00, 0xDA, 0xFF, 0xFB, 0xFF, 0x0B, 0x00,
+ 0xD2, 0xFF, 0xFA, 0xFF, 0x0D, 0x00, 0xC9, 0xFF,
+ 0xF9, 0xFF, 0x0F, 0x00, 0xC1, 0xFF, 0xF7, 0xFF,
+ 0x06, 0x00, 0x04, 0x00, 0xF6, 0xFF, 0x06, 0x00,
+ 0x0C, 0x00, 0xF6, 0xFF, 0x06, 0x00, 0x15, 0x00,
+ 0xF6, 0xFF, 0x06, 0x00, 0x1D, 0x00, 0xF6, 0xFF,
+ 0x09, 0x00, 0x26, 0x00, 0xF1, 0xFF, 0x0B, 0x00,
+ 0x2E, 0x00, 0xEE, 0xFF, 0x0D, 0x00, 0x37, 0x00,
+ 0xEA, 0xFF, 0x0F, 0x00, 0x3F, 0x00, 0xE5, 0xFF,
+ 0x06, 0x00, 0xFC, 0xFF, 0xF6, 0xFF, 0x06, 0x00,
+ 0xF4, 0xFF, 0xF6, 0xFF, 0x06, 0x00, 0xEB, 0xFF,
+ 0xF6, 0xFF, 0x06, 0x00, 0xE3, 0xFF, 0xF6, 0xFF,
+ 0x09, 0x00, 0xDA, 0xFF, 0xF1, 0xFF, 0x0B, 0x00,
+ 0xD2, 0xFF, 0xEE, 0xFF, 0x0D, 0x00, 0xC9, 0xFF,
+ 0xEA, 0xFF, 0x0F, 0x00, 0xC1, 0xFF, 0xE5, 0xFF,
+ 0x06, 0x00, 0x04, 0x00, 0xEE, 0xFF, 0x06, 0x00,
+ 0x0C, 0x00, 0xEE, 0xFF, 0x06, 0x00, 0x15, 0x00,
+ 0xEE, 0xFF, 0x06, 0x00, 0x1D, 0x00, 0xEE, 0xFF,
+ 0x09, 0x00, 0x26, 0x00, 0xE7, 0xFF, 0x0B, 0x00,
+ 0x2E, 0x00, 0xE1, 0xFF, 0x0D, 0x00, 0x37, 0x00,
+ 0xDB, 0xFF, 0x0F, 0x00, 0x3F, 0x00, 0xD3, 0xFF,
+ 0x06, 0x00, 0xFC, 0xFF, 0xEE, 0xFF, 0x06, 0x00,
+ 0xF4, 0xFF, 0xEE, 0xFF, 0x06, 0x00, 0xEB, 0xFF,
+ 0xEE, 0xFF, 0x06, 0x00, 0xE3, 0xFF, 0xEE, 0xFF,
+ 0x09, 0x00, 0xDA, 0xFF, 0xE7, 0xFF, 0x0B, 0x00,
+ 0xD2, 0xFF, 0xE1, 0xFF, 0x0D, 0x00, 0xC9, 0xFF,
+ 0xDB, 0xFF, 0x0F, 0x00, 0xC1, 0xFF, 0xD3, 0xFF,
+ 0x06, 0x00, 0x04, 0x00, 0xE7, 0xFF, 0x06, 0x00,
+ 0x0C, 0x00, 0xE7, 0xFF, 0x06, 0x00, 0x15, 0x00,
+ 0xE7, 0xFF, 0x06, 0x00, 0x1D, 0x00, 0xE7, 0xFF,
+ 0x09, 0x00, 0x26, 0x00, 0xDD, 0xFF, 0x0B, 0x00,
+ 0x2E, 0x00, 0xD5, 0xFF, 0x0D, 0x00, 0x37, 0x00,
+ 0xCC, 0xFF, 0x0F, 0x00, 0x3F, 0x00, 0xC1, 0xFF,
+ 0x06, 0x00, 0xFC, 0xFF, 0xE7, 0xFF, 0x06, 0x00,
+ 0xF4, 0xFF, 0xE7, 0xFF, 0x06, 0x00, 0xEB, 0xFF,
+ 0xE7, 0xFF, 0x06, 0x00, 0xE3, 0xFF, 0xE7, 0xFF,
+ 0x09, 0x00, 0xDA, 0xFF, 0xDD, 0xFF, 0x0B, 0x00,
+ 0xD2, 0xFF, 0xD5, 0xFF, 0x0D, 0x00, 0xC9, 0xFF,
+ 0xCC, 0xFF, 0x0F, 0x00, 0xC1, 0xFF, 0xC1, 0xFF,
+ 0x09, 0x00, 0x04, 0x00, 0xDE, 0xFF, 0x09, 0x00,
+ 0x0C, 0x00, 0xDE, 0xFF, 0x09, 0x00, 0x15, 0x00,
+ 0xDE, 0xFF, 0x09, 0x00, 0x1D, 0x00, 0xDE, 0xFF,
+ 0x0C, 0x00, 0x26, 0x00, 0xD2, 0xFF, 0x0E, 0x00,
+ 0x2E, 0x00, 0xC8, 0xFF, 0x10, 0x00, 0x37, 0x00,
+ 0xBD, 0xFF, 0x12, 0x00, 0x3F, 0x00, 0xAE, 0xFF,
+ 0x09, 0x00, 0xFC, 0xFF, 0xDE, 0xFF, 0x09, 0x00,
+ 0xF4, 0xFF, 0xDE, 0xFF, 0x09, 0x00, 0xEB, 0xFF,
+ 0xDE, 0xFF, 0x09, 0x00, 0xE3, 0xFF, 0xDE, 0xFF,
+ 0x0C, 0x00, 0xDA, 0xFF, 0xD2, 0xFF, 0x0E, 0x00,
+ 0xD2, 0xFF, 0xC8, 0xFF, 0x10, 0x00, 0xC9, 0xFF,
+ 0xBD, 0xFF, 0x12, 0x00, 0xC1, 0xFF, 0xAE, 0xFF,
+ 0x0B, 0x00, 0x04, 0x00, 0xD7, 0xFF, 0x0B, 0x00,
+ 0x0C, 0x00, 0xD7, 0xFF, 0x0B, 0x00, 0x15, 0x00,
+ 0xD7, 0xFF, 0x0B, 0x00, 0x1D, 0x00, 0xD7, 0xFF,
+ 0x0E, 0x00, 0x26, 0x00, 0xC8, 0xFF, 0x10, 0x00,
+ 0x2E, 0x00, 0xBC, 0xFF, 0x12, 0x00, 0x37, 0x00,
+ 0xAE, 0xFF, 0x14, 0x00, 0x3F, 0x00, 0x9C, 0xFF,
+ 0x0B, 0x00, 0xFC, 0xFF, 0xD7, 0xFF, 0x0B, 0x00,
+ 0xF4, 0xFF, 0xD7, 0xFF, 0x0B, 0x00, 0xEB, 0xFF,
+ 0xD7, 0xFF, 0x0B, 0x00, 0xE3, 0xFF, 0xD7, 0xFF,
+ 0x0E, 0x00, 0xDA, 0xFF, 0xC8, 0xFF, 0x10, 0x00,
+ 0xD2, 0xFF, 0xBC, 0xFF, 0x12, 0x00, 0xC9, 0xFF,
+ 0xAE, 0xFF, 0x14, 0x00, 0xC1, 0xFF, 0x9C, 0xFF,
+ 0x0D, 0x00, 0x04, 0x00, 0xCF, 0xFF, 0x0D, 0x00,
+ 0x0C, 0x00, 0xCF, 0xFF, 0x0D, 0x00, 0x15, 0x00,
+ 0xCF, 0xFF, 0x0D, 0x00, 0x1D, 0x00, 0xCF, 0xFF,
+ 0x10, 0x00, 0x26, 0x00, 0xBE, 0xFF, 0x12, 0x00,
+ 0x2E, 0x00, 0xAF, 0xFF, 0x14, 0x00, 0x37, 0x00,
+ 0x9F, 0xFF, 0x16, 0x00, 0x3F, 0x00, 0x8A, 0xFF,
+ 0x0D, 0x00, 0xFC, 0xFF, 0xCF, 0xFF, 0x0D, 0x00,
+ 0xF4, 0xFF, 0xCF, 0xFF, 0x0D, 0x00, 0xEB, 0xFF,
+ 0xCF, 0xFF, 0x0D, 0x00, 0xE3, 0xFF, 0xCF, 0xFF,
+ 0x10, 0x00, 0xDA, 0xFF, 0xBE, 0xFF, 0x12, 0x00,
+ 0xD2, 0xFF, 0xAF, 0xFF, 0x14, 0x00, 0xC9, 0xFF,
+ 0x9F, 0xFF, 0x16, 0x00, 0xC1, 0xFF, 0x8A, 0xFF,
+ 0x0F, 0x00, 0x04, 0x00, 0xC8, 0xFF, 0x0F, 0x00,
+ 0x0C, 0x00, 0xC8, 0xFF, 0x0F, 0x00, 0x15, 0x00,
+ 0xC8, 0xFF, 0x0F, 0x00, 0x1D, 0x00, 0xC8, 0xFF,
+ 0x12, 0x00, 0x26, 0x00, 0xB4, 0xFF, 0x14, 0x00,
+ 0x2E, 0x00, 0xA3, 0xFF, 0x16, 0x00, 0x37, 0x00,
+ 0x90, 0xFF, 0x18, 0x00, 0x3F, 0x00, 0x78, 0xFF,
+ 0x0F, 0x00, 0xFC, 0xFF, 0xC8, 0xFF, 0x0F, 0x00,
+ 0xF4, 0xFF, 0xC8, 0xFF, 0x0F, 0x00, 0xEB, 0xFF,
+ 0xC8, 0xFF, 0x0F, 0x00, 0xE3, 0xFF, 0xC8, 0xFF,
+ 0x12, 0x00, 0xDA, 0xFF, 0xB4, 0xFF, 0x14, 0x00,
+ 0xD2, 0xFF, 0xA3, 0xFF, 0x16, 0x00, 0xC9, 0xFF,
+ 0x90, 0xFF, 0x18, 0x00, 0xC1, 0xFF, 0x78, 0xFF,
+ 0x07, 0x00, 0x04, 0x00, 0x04, 0x00, 0x07, 0x00,
+ 0x0D, 0x00, 0x04, 0x00, 0x07, 0x00, 0x16, 0x00,
+ 0x04, 0x00, 0x07, 0x00, 0x1F, 0x00, 0x04, 0x00,
+ 0x0A, 0x00, 0x29, 0x00, 0x05, 0x00, 0x0C, 0x00,
+ 0x32, 0x00, 0x06, 0x00, 0x0E, 0x00, 0x3B, 0x00,
+ 0x08, 0x00, 0x10, 0x00, 0x44, 0x00, 0x0A, 0x00,
+ 0x07, 0x00, 0xFC, 0xFF, 0x04, 0x00, 0x07, 0x00,
+ 0xF3, 0xFF, 0x04, 0x00, 0x07, 0x00, 0xEA, 0xFF,
+ 0x04, 0x00, 0x07, 0x00, 0xE1, 0xFF, 0x04, 0x00,
+ 0x0A, 0x00, 0xD7, 0xFF, 0x05, 0x00, 0x0C, 0x00,
+ 0xCE, 0xFF, 0x06, 0x00, 0x0E, 0x00, 0xC5, 0xFF,
+ 0x08, 0x00, 0x10, 0x00, 0xBC, 0xFF, 0x0A, 0x00,
+ 0x07, 0x00, 0x04, 0x00, 0x0C, 0x00, 0x07, 0x00,
+ 0x0D, 0x00, 0x0C, 0x00, 0x07, 0x00, 0x16, 0x00,
+ 0x0C, 0x00, 0x07, 0x00, 0x1F, 0x00, 0x0C, 0x00,
+ 0x0A, 0x00, 0x29, 0x00, 0x10, 0x00, 0x0C, 0x00,
+ 0x32, 0x00, 0x13, 0x00, 0x0E, 0x00, 0x3B, 0x00,
+ 0x18, 0x00, 0x10, 0x00, 0x44, 0x00, 0x1E, 0x00,
+ 0x07, 0x00, 0xFC, 0xFF, 0x0C, 0x00, 0x07, 0x00,
+ 0xF3, 0xFF, 0x0C, 0x00, 0x07, 0x00, 0xEA, 0xFF,
+ 0x0C, 0x00, 0x07, 0x00, 0xE1, 0xFF, 0x0C, 0x00,
+ 0x0A, 0x00, 0xD7, 0xFF, 0x10, 0x00, 0x0C, 0x00,
+ 0xCE, 0xFF, 0x13, 0x00, 0x0E, 0x00, 0xC5, 0xFF,
+ 0x18, 0x00, 0x10, 0x00, 0xBC, 0xFF, 0x1E, 0x00,
+ 0x07, 0x00, 0x04, 0x00, 0x15, 0x00, 0x07, 0x00,
+ 0x0D, 0x00, 0x15, 0x00, 0x07, 0x00, 0x16, 0x00,
+ 0x15, 0x00, 0x07, 0x00, 0x1F, 0x00, 0x15, 0x00,
+ 0x0A, 0x00, 0x29, 0x00, 0x1B, 0x00, 0x0C, 0x00,
+ 0x32, 0x00, 0x21, 0x00, 0x0E, 0x00, 0x3B, 0x00,
+ 0x29, 0x00, 0x10, 0x00, 0x44, 0x00, 0x32, 0x00,
+ 0x07, 0x00, 0xFC, 0xFF, 0x15, 0x00, 0x07, 0x00,
+ 0xF3, 0xFF, 0x15, 0x00, 0x07, 0x00, 0xEA, 0xFF,
+ 0x15, 0x00, 0x07, 0x00, 0xE1, 0xFF, 0x15, 0x00,
+ 0x0A, 0x00, 0xD7, 0xFF, 0x1B, 0x00, 0x0C, 0x00,
+ 0xCE, 0xFF, 0x21, 0x00, 0x0E, 0x00, 0xC5, 0xFF,
+ 0x29, 0x00, 0x10, 0x00, 0xBC, 0xFF, 0x32, 0x00,
+ 0x07, 0x00, 0x04, 0x00, 0x1D, 0x00, 0x07, 0x00,
+ 0x0D, 0x00, 0x1D, 0x00, 0x07, 0x00, 0x16, 0x00,
+ 0x1D, 0x00, 0x07, 0x00, 0x1F, 0x00, 0x1D, 0x00,
+ 0x0A, 0x00, 0x29, 0x00, 0x26, 0x00, 0x0C, 0x00,
+ 0x32, 0x00, 0x2E, 0x00, 0x0E, 0x00, 0x3B, 0x00,
+ 0x39, 0x00, 0x10, 0x00, 0x44, 0x00, 0x46, 0x00,
+ 0x07, 0x00, 0xFC, 0xFF, 0x1D, 0x00, 0x07, 0x00,
+ 0xF3, 0xFF, 0x1D, 0x00, 0x07, 0x00, 0xEA, 0xFF,
+ 0x1D, 0x00, 0x07, 0x00, 0xE1, 0xFF, 0x1D, 0x00,
+ 0x0A, 0x00, 0xD7, 0xFF, 0x26, 0x00, 0x0C, 0x00,
+ 0xCE, 0xFF, 0x2E, 0x00, 0x0E, 0x00, 0xC5, 0xFF,
+ 0x39, 0x00, 0x10, 0x00, 0xBC, 0xFF, 0x46, 0x00,
+ 0x0A, 0x00, 0x04, 0x00, 0x26, 0x00, 0x0A, 0x00,
+ 0x0D, 0x00, 0x26, 0x00, 0x0A, 0x00, 0x16, 0x00,
+ 0x26, 0x00, 0x0A, 0x00, 0x1F, 0x00, 0x26, 0x00,
+ 0x0D, 0x00, 0x29, 0x00, 0x32, 0x00, 0x0F, 0x00,
+ 0x32, 0x00, 0x3D, 0x00, 0x11, 0x00, 0x3B, 0x00,
+ 0x4A, 0x00, 0x13, 0x00, 0x44, 0x00, 0x5A, 0x00,
+ 0x0A, 0x00, 0xFC, 0xFF, 0x26, 0x00, 0x0A, 0x00,
+ 0xF3, 0xFF, 0x26, 0x00, 0x0A, 0x00, 0xEA, 0xFF,
+ 0x26, 0x00, 0x0A, 0x00, 0xE1, 0xFF, 0x26, 0x00,
+ 0x0D, 0x00, 0xD7, 0xFF, 0x32, 0x00, 0x0F, 0x00,
+ 0xCE, 0xFF, 0x3D, 0x00, 0x11, 0x00, 0xC5, 0xFF,
+ 0x4A, 0x00, 0x13, 0x00, 0xBC, 0xFF, 0x5A, 0x00,
+ 0x0C, 0x00, 0x04, 0x00, 0x2E, 0x00, 0x0C, 0x00,
+ 0x0D, 0x00, 0x2E, 0x00, 0x0C, 0x00, 0x16, 0x00,
+ 0x2E, 0x00, 0x0C, 0x00, 0x1F, 0x00, 0x2E, 0x00,
+ 0x0F, 0x00, 0x29, 0x00, 0x3D, 0x00, 0x11, 0x00,
+ 0x32, 0x00, 0x4A, 0x00, 0x13, 0x00, 0x3B, 0x00,
+ 0x5A, 0x00, 0x15, 0x00, 0x44, 0x00, 0x6E, 0x00,
+ 0x0C, 0x00, 0xFC, 0xFF, 0x2E, 0x00, 0x0C, 0x00,
+ 0xF3, 0xFF, 0x2E, 0x00, 0x0C, 0x00, 0xEA, 0xFF,
+ 0x2E, 0x00, 0x0C, 0x00, 0xE1, 0xFF, 0x2E, 0x00,
+ 0x0F, 0x00, 0xD7, 0xFF, 0x3D, 0x00, 0x11, 0x00,
+ 0xCE, 0xFF, 0x4A, 0x00, 0x13, 0x00, 0xC5, 0xFF,
+ 0x5A, 0x00, 0x15, 0x00, 0xBC, 0xFF, 0x6E, 0x00,
+ 0x0E, 0x00, 0x04, 0x00, 0x37, 0x00, 0x0E, 0x00,
+ 0x0D, 0x00, 0x37, 0x00, 0x0E, 0x00, 0x16, 0x00,
+ 0x37, 0x00, 0x0E, 0x00, 0x1F, 0x00, 0x37, 0x00,
+ 0x11, 0x00, 0x29, 0x00, 0x48, 0x00, 0x13, 0x00,
+ 0x32, 0x00, 0x58, 0x00, 0x15, 0x00, 0x3B, 0x00,
+ 0x6B, 0x00, 0x17, 0x00, 0x44, 0x00, 0x82, 0x00,
+ 0x0E, 0x00, 0xFC, 0xFF, 0x37, 0x00, 0x0E, 0x00,
+ 0xF3, 0xFF, 0x37, 0x00, 0x0E, 0x00, 0xEA, 0xFF,
+ 0x37, 0x00, 0x0E, 0x00, 0xE1, 0xFF, 0x37, 0x00,
+ 0x11, 0x00, 0xD7, 0xFF, 0x48, 0x00, 0x13, 0x00,
+ 0xCE, 0xFF, 0x58, 0x00, 0x15, 0x00, 0xC5, 0xFF,
+ 0x6B, 0x00, 0x17, 0x00, 0xBC, 0xFF, 0x82, 0x00,
+ 0x10, 0x00, 0x04, 0x00, 0x3F, 0x00, 0x10, 0x00,
+ 0x0D, 0x00, 0x3F, 0x00, 0x10, 0x00, 0x16, 0x00,
+ 0x3F, 0x00, 0x10, 0x00, 0x1F, 0x00, 0x3F, 0x00,
+ 0x13, 0x00, 0x29, 0x00, 0x53, 0x00, 0x15, 0x00,
+ 0x32, 0x00, 0x65, 0x00, 0x17, 0x00, 0x3B, 0x00,
+ 0x7B, 0x00, 0x19, 0x00, 0x44, 0x00, 0x96, 0x00,
+ 0x10, 0x00, 0xFC, 0xFF, 0x3F, 0x00, 0x10, 0x00,
+ 0xF3, 0xFF, 0x3F, 0x00, 0x10, 0x00, 0xEA, 0xFF,
+ 0x3F, 0x00, 0x10, 0x00, 0xE1, 0xFF, 0x3F, 0x00,
+ 0x13, 0x00, 0xD7, 0xFF, 0x53, 0x00, 0x15, 0x00,
+ 0xCE, 0xFF, 0x65, 0x00, 0x17, 0x00, 0xC5, 0xFF,
+ 0x7B, 0x00, 0x19, 0x00, 0xBC, 0xFF, 0x96, 0x00,
+ 0x07, 0x00, 0x04, 0x00, 0xFC, 0xFF, 0x07, 0x00,
+ 0x0D, 0x00, 0xFC, 0xFF, 0x07, 0x00, 0x16, 0x00,
+ 0xFC, 0xFF, 0x07, 0x00, 0x1F, 0x00, 0xFC, 0xFF,
+ 0x0A, 0x00, 0x29, 0x00, 0xFB, 0xFF, 0x0C, 0x00,
+ 0x32, 0x00, 0xFA, 0xFF, 0x0E, 0x00, 0x3B, 0x00,
+ 0xF8, 0xFF, 0x10, 0x00, 0x44, 0x00, 0xF6, 0xFF,
+ 0x07, 0x00, 0xFC, 0xFF, 0xFC, 0xFF, 0x07, 0x00,
+ 0xF3, 0xFF, 0xFC, 0xFF, 0x07, 0x00, 0xEA, 0xFF,
+ 0xFC, 0xFF, 0x07, 0x00, 0xE1, 0xFF, 0xFC, 0xFF,
+ 0x0A, 0x00, 0xD7, 0xFF, 0xFB, 0xFF, 0x0C, 0x00,
+ 0xCE, 0xFF, 0xFA, 0xFF, 0x0E, 0x00, 0xC5, 0xFF,
+ 0xF8, 0xFF, 0x10, 0x00, 0xBC, 0xFF, 0xF6, 0xFF,
+ 0x07, 0x00, 0x04, 0x00, 0xF4, 0xFF, 0x07, 0x00,
+ 0x0D, 0x00, 0xF4, 0xFF, 0x07, 0x00, 0x16, 0x00,
+ 0xF4, 0xFF, 0x07, 0x00, 0x1F, 0x00, 0xF4, 0xFF,
+ 0x0A, 0x00, 0x29, 0x00, 0xF0, 0xFF, 0x0C, 0x00,
+ 0x32, 0x00, 0xED, 0xFF, 0x0E, 0x00, 0x3B, 0x00,
+ 0xE8, 0xFF, 0x10, 0x00, 0x44, 0x00, 0xE2, 0xFF,
+ 0x07, 0x00, 0xFC, 0xFF, 0xF4, 0xFF, 0x07, 0x00,
+ 0xF3, 0xFF, 0xF4, 0xFF, 0x07, 0x00, 0xEA, 0xFF,
+ 0xF4, 0xFF, 0x07, 0x00, 0xE1, 0xFF, 0xF4, 0xFF,
+ 0x0A, 0x00, 0xD7, 0xFF, 0xF0, 0xFF, 0x0C, 0x00,
+ 0xCE, 0xFF, 0xED, 0xFF, 0x0E, 0x00, 0xC5, 0xFF,
+ 0xE8, 0xFF, 0x10, 0x00, 0xBC, 0xFF, 0xE2, 0xFF,
+ 0x07, 0x00, 0x04, 0x00, 0xEB, 0xFF, 0x07, 0x00,
+ 0x0D, 0x00, 0xEB, 0xFF, 0x07, 0x00, 0x16, 0x00,
+ 0xEB, 0xFF, 0x07, 0x00, 0x1F, 0x00, 0xEB, 0xFF,
+ 0x0A, 0x00, 0x29, 0x00, 0xE5, 0xFF, 0x0C, 0x00,
+ 0x32, 0x00, 0xDF, 0xFF, 0x0E, 0x00, 0x3B, 0x00,
+ 0xD7, 0xFF, 0x10, 0x00, 0x44, 0x00, 0xCE, 0xFF,
+ 0x07, 0x00, 0xFC, 0xFF, 0xEB, 0xFF, 0x07, 0x00,
+ 0xF3, 0xFF, 0xEB, 0xFF, 0x07, 0x00, 0xEA, 0xFF,
+ 0xEB, 0xFF, 0x07, 0x00, 0xE1, 0xFF, 0xEB, 0xFF,
+ 0x0A, 0x00, 0xD7, 0xFF, 0xE5, 0xFF, 0x0C, 0x00,
+ 0xCE, 0xFF, 0xDF, 0xFF, 0x0E, 0x00, 0xC5, 0xFF,
+ 0xD7, 0xFF, 0x10, 0x00, 0xBC, 0xFF, 0xCE, 0xFF,
+ 0x07, 0x00, 0x04, 0x00, 0xE3, 0xFF, 0x07, 0x00,
+ 0x0D, 0x00, 0xE3, 0xFF, 0x07, 0x00, 0x16, 0x00,
+ 0xE3, 0xFF, 0x07, 0x00, 0x1F, 0x00, 0xE3, 0xFF,
+ 0x0A, 0x00, 0x29, 0x00, 0xDA, 0xFF, 0x0C, 0x00,
+ 0x32, 0x00, 0xD2, 0xFF, 0x0E, 0x00, 0x3B, 0x00,
+ 0xC7, 0xFF, 0x10, 0x00, 0x44, 0x00, 0xBA, 0xFF,
+ 0x07, 0x00, 0xFC, 0xFF, 0xE3, 0xFF, 0x07, 0x00,
+ 0xF3, 0xFF, 0xE3, 0xFF, 0x07, 0x00, 0xEA, 0xFF,
+ 0xE3, 0xFF, 0x07, 0x00, 0xE1, 0xFF, 0xE3, 0xFF,
+ 0x0A, 0x00, 0xD7, 0xFF, 0xDA, 0xFF, 0x0C, 0x00,
+ 0xCE, 0xFF, 0xD2, 0xFF, 0x0E, 0x00, 0xC5, 0xFF,
+ 0xC7, 0xFF, 0x10, 0x00, 0xBC, 0xFF, 0xBA, 0xFF,
+ 0x0A, 0x00, 0x04, 0x00, 0xDA, 0xFF, 0x0A, 0x00,
+ 0x0D, 0x00, 0xDA, 0xFF, 0x0A, 0x00, 0x16, 0x00,
+ 0xDA, 0xFF, 0x0A, 0x00, 0x1F, 0x00, 0xDA, 0xFF,
+ 0x0D, 0x00, 0x29, 0x00, 0xCE, 0xFF, 0x0F, 0x00,
+ 0x32, 0x00, 0xC3, 0xFF, 0x11, 0x00, 0x3B, 0x00,
+ 0xB6, 0xFF, 0x13, 0x00, 0x44, 0x00, 0xA6, 0xFF,
+ 0x0A, 0x00, 0xFC, 0xFF, 0xDA, 0xFF, 0x0A, 0x00,
+ 0xF3, 0xFF, 0xDA, 0xFF, 0x0A, 0x00, 0xEA, 0xFF,
+ 0xDA, 0xFF, 0x0A, 0x00, 0xE1, 0xFF, 0xDA, 0xFF,
+ 0x0D, 0x00, 0xD7, 0xFF, 0xCE, 0xFF, 0x0F, 0x00,
+ 0xCE, 0xFF, 0xC3, 0xFF, 0x11, 0x00, 0xC5, 0xFF,
+ 0xB6, 0xFF, 0x13, 0x00, 0xBC, 0xFF, 0xA6, 0xFF,
+ 0x0C, 0x00, 0x04, 0x00, 0xD2, 0xFF, 0x0C, 0x00,
+ 0x0D, 0x00, 0xD2, 0xFF, 0x0C, 0x00, 0x16, 0x00,
+ 0xD2, 0xFF, 0x0C, 0x00, 0x1F, 0x00, 0xD2, 0xFF,
+ 0x0F, 0x00, 0x29, 0x00, 0xC3, 0xFF, 0x11, 0x00,
+ 0x32, 0x00, 0xB6, 0xFF, 0x13, 0x00, 0x3B, 0x00,
+ 0xA6, 0xFF, 0x15, 0x00, 0x44, 0x00, 0x92, 0xFF,
+ 0x0C, 0x00, 0xFC, 0xFF, 0xD2, 0xFF, 0x0C, 0x00,
+ 0xF3, 0xFF, 0xD2, 0xFF, 0x0C, 0x00, 0xEA, 0xFF,
+ 0xD2, 0xFF, 0x0C, 0x00, 0xE1, 0xFF, 0xD2, 0xFF,
+ 0x0F, 0x00, 0xD7, 0xFF, 0xC3, 0xFF, 0x11, 0x00,
+ 0xCE, 0xFF, 0xB6, 0xFF, 0x13, 0x00, 0xC5, 0xFF,
+ 0xA6, 0xFF, 0x15, 0x00, 0xBC, 0xFF, 0x92, 0xFF,
+ 0x0E, 0x00, 0x04, 0x00, 0xC9, 0xFF, 0x0E, 0x00,
+ 0x0D, 0x00, 0xC9, 0xFF, 0x0E, 0x00, 0x16, 0x00,
+ 0xC9, 0xFF, 0x0E, 0x00, 0x1F, 0x00, 0xC9, 0xFF,
+ 0x11, 0x00, 0x29, 0x00, 0xB8, 0xFF, 0x13, 0x00,
+ 0x32, 0x00, 0xA8, 0xFF, 0x15, 0x00, 0x3B, 0x00,
+ 0x95, 0xFF, 0x17, 0x00, 0x44, 0x00, 0x7E, 0xFF,
+ 0x0E, 0x00, 0xFC, 0xFF, 0xC9, 0xFF, 0x0E, 0x00,
+ 0xF3, 0xFF, 0xC9, 0xFF, 0x0E, 0x00, 0xEA, 0xFF,
+ 0xC9, 0xFF, 0x0E, 0x00, 0xE1, 0xFF, 0xC9, 0xFF,
+ 0x11, 0x00, 0xD7, 0xFF, 0xB8, 0xFF, 0x13, 0x00,
+ 0xCE, 0xFF, 0xA8, 0xFF, 0x15, 0x00, 0xC5, 0xFF,
+ 0x95, 0xFF, 0x17, 0x00, 0xBC, 0xFF, 0x7E, 0xFF,
+ 0x10, 0x00, 0x04, 0x00, 0xC1, 0xFF, 0x10, 0x00,
+ 0x0D, 0x00, 0xC1, 0xFF, 0x10, 0x00, 0x16, 0x00,
+ 0xC1, 0xFF, 0x10, 0x00, 0x1F, 0x00, 0xC1, 0xFF,
+ 0x13, 0x00, 0x29, 0x00, 0xAD, 0xFF, 0x15, 0x00,
+ 0x32, 0x00, 0x9B, 0xFF, 0x17, 0x00, 0x3B, 0x00,
+ 0x85, 0xFF, 0x19, 0x00, 0x44, 0x00, 0x6A, 0xFF,
+ 0x10, 0x00, 0xFC, 0xFF, 0xC1, 0xFF, 0x10, 0x00,
+ 0xF3, 0xFF, 0xC1, 0xFF, 0x10, 0x00, 0xEA, 0xFF,
+ 0xC1, 0xFF, 0x10, 0x00, 0xE1, 0xFF, 0xC1, 0xFF,
+ 0x13, 0x00, 0xD7, 0xFF, 0xAD, 0xFF, 0x15, 0x00,
+ 0xCE, 0xFF, 0x9B, 0xFF, 0x17, 0x00, 0xC5, 0xFF,
+ 0x85, 0xFF, 0x19, 0x00, 0xBC, 0xFF, 0x6A, 0xFF,
+ 0x08, 0x00, 0x05, 0x00, 0x04, 0x00, 0x08, 0x00,
+ 0x0F, 0x00, 0x04, 0x00, 0x08, 0x00, 0x19, 0x00,
+ 0x04, 0x00, 0x08, 0x00, 0x23, 0x00, 0x04, 0x00,
+ 0x0B, 0x00, 0x2E, 0x00, 0x06, 0x00, 0x0D, 0x00,
+ 0x38, 0x00, 0x07, 0x00, 0x0F, 0x00, 0x42, 0x00,
+ 0x09, 0x00, 0x11, 0x00, 0x4C, 0x00, 0x0B, 0x00,
+ 0x08, 0x00, 0xFB, 0xFF, 0x04, 0x00, 0x08, 0x00,
+ 0xF1, 0xFF, 0x04, 0x00, 0x08, 0x00, 0xE7, 0xFF,
+ 0x04, 0x00, 0x08, 0x00, 0xDD, 0xFF, 0x04, 0x00,
+ 0x0B, 0x00, 0xD2, 0xFF, 0x06, 0x00, 0x0D, 0x00,
+ 0xC8, 0xFF, 0x07, 0x00, 0x0F, 0x00, 0xBE, 0xFF,
+ 0x09, 0x00, 0x11, 0x00, 0xB4, 0xFF, 0x0B, 0x00,
+ 0x08, 0x00, 0x05, 0x00, 0x0D, 0x00, 0x08, 0x00,
+ 0x0F, 0x00, 0x0D, 0x00, 0x08, 0x00, 0x19, 0x00,
+ 0x0D, 0x00, 0x08, 0x00, 0x23, 0x00, 0x0D, 0x00,
+ 0x0B, 0x00, 0x2E, 0x00, 0x12, 0x00, 0x0D, 0x00,
+ 0x38, 0x00, 0x16, 0x00, 0x0F, 0x00, 0x42, 0x00,
+ 0x1B, 0x00, 0x11, 0x00, 0x4C, 0x00, 0x21, 0x00,
+ 0x08, 0x00, 0xFB, 0xFF, 0x0D, 0x00, 0x08, 0x00,
+ 0xF1, 0xFF, 0x0D, 0x00, 0x08, 0x00, 0xE7, 0xFF,
+ 0x0D, 0x00, 0x08, 0x00, 0xDD, 0xFF, 0x0D, 0x00,
+ 0x0B, 0x00, 0xD2, 0xFF, 0x12, 0x00, 0x0D, 0x00,
+ 0xC8, 0xFF, 0x16, 0x00, 0x0F, 0x00, 0xBE, 0xFF,
+ 0x1B, 0x00, 0x11, 0x00, 0xB4, 0xFF, 0x21, 0x00,
+ 0x08, 0x00, 0x05, 0x00, 0x16, 0x00, 0x08, 0x00,
+ 0x0F, 0x00, 0x16, 0x00, 0x08, 0x00, 0x19, 0x00,
+ 0x16, 0x00, 0x08, 0x00, 0x23, 0x00, 0x16, 0x00,
+ 0x0B, 0x00, 0x2E, 0x00, 0x1F, 0x00, 0x0D, 0x00,
+ 0x38, 0x00, 0x25, 0x00, 0x0F, 0x00, 0x42, 0x00,
+ 0x2D, 0x00, 0x11, 0x00, 0x4C, 0x00, 0x37, 0x00,
+ 0x08, 0x00, 0xFB, 0xFF, 0x16, 0x00, 0x08, 0x00,
+ 0xF1, 0xFF, 0x16, 0x00, 0x08, 0x00, 0xE7, 0xFF,
+ 0x16, 0x00, 0x08, 0x00, 0xDD, 0xFF, 0x16, 0x00,
+ 0x0B, 0x00, 0xD2, 0xFF, 0x1F, 0x00, 0x0D, 0x00,
+ 0xC8, 0xFF, 0x25, 0x00, 0x0F, 0x00, 0xBE, 0xFF,
+ 0x2D, 0x00, 0x11, 0x00, 0xB4, 0xFF, 0x37, 0x00,
+ 0x08, 0x00, 0x05, 0x00, 0x1F, 0x00, 0x08, 0x00,
+ 0x0F, 0x00, 0x1F, 0x00, 0x08, 0x00, 0x19, 0x00,
+ 0x1F, 0x00, 0x08, 0x00, 0x23, 0x00, 0x1F, 0x00,
+ 0x0B, 0x00, 0x2E, 0x00, 0x2B, 0x00, 0x0D, 0x00,
+ 0x38, 0x00, 0x34, 0x00, 0x0F, 0x00, 0x42, 0x00,
+ 0x3F, 0x00, 0x11, 0x00, 0x4C, 0x00, 0x4D, 0x00,
+ 0x08, 0x00, 0xFB, 0xFF, 0x1F, 0x00, 0x08, 0x00,
+ 0xF1, 0xFF, 0x1F, 0x00, 0x08, 0x00, 0xE7, 0xFF,
+ 0x1F, 0x00, 0x08, 0x00, 0xDD, 0xFF, 0x1F, 0x00,
+ 0x0B, 0x00, 0xD2, 0xFF, 0x2B, 0x00, 0x0D, 0x00,
+ 0xC8, 0xFF, 0x34, 0x00, 0x0F, 0x00, 0xBE, 0xFF,
+ 0x3F, 0x00, 0x11, 0x00, 0xB4, 0xFF, 0x4D, 0x00,
+ 0x0B, 0x00, 0x05, 0x00, 0x29, 0x00, 0x0B, 0x00,
+ 0x0F, 0x00, 0x29, 0x00, 0x0B, 0x00, 0x19, 0x00,
+ 0x29, 0x00, 0x0B, 0x00, 0x23, 0x00, 0x29, 0x00,
+ 0x0E, 0x00, 0x2E, 0x00, 0x38, 0x00, 0x10, 0x00,
+ 0x38, 0x00, 0x43, 0x00, 0x12, 0x00, 0x42, 0x00,
+ 0x52, 0x00, 0x14, 0x00, 0x4C, 0x00, 0x63, 0x00,
+ 0x0B, 0x00, 0xFB, 0xFF, 0x29, 0x00, 0x0B, 0x00,
+ 0xF1, 0xFF, 0x29, 0x00, 0x0B, 0x00, 0xE7, 0xFF,
+ 0x29, 0x00, 0x0B, 0x00, 0xDD, 0xFF, 0x29, 0x00,
+ 0x0E, 0x00, 0xD2, 0xFF, 0x38, 0x00, 0x10, 0x00,
+ 0xC8, 0xFF, 0x43, 0x00, 0x12, 0x00, 0xBE, 0xFF,
+ 0x52, 0x00, 0x14, 0x00, 0xB4, 0xFF, 0x63, 0x00,
+ 0x0D, 0x00, 0x05, 0x00, 0x32, 0x00, 0x0D, 0x00,
+ 0x0F, 0x00, 0x32, 0x00, 0x0D, 0x00, 0x19, 0x00,
+ 0x32, 0x00, 0x0D, 0x00, 0x23, 0x00, 0x32, 0x00,
+ 0x10, 0x00, 0x2E, 0x00, 0x44, 0x00, 0x12, 0x00,
+ 0x38, 0x00, 0x52, 0x00, 0x14, 0x00, 0x42, 0x00,
+ 0x64, 0x00, 0x16, 0x00, 0x4C, 0x00, 0x79, 0x00,
+ 0x0D, 0x00, 0xFB, 0xFF, 0x32, 0x00, 0x0D, 0x00,
+ 0xF1, 0xFF, 0x32, 0x00, 0x0D, 0x00, 0xE7, 0xFF,
+ 0x32, 0x00, 0x0D, 0x00, 0xDD, 0xFF, 0x32, 0x00,
+ 0x10, 0x00, 0xD2, 0xFF, 0x44, 0x00, 0x12, 0x00,
+ 0xC8, 0xFF, 0x52, 0x00, 0x14, 0x00, 0xBE, 0xFF,
+ 0x64, 0x00, 0x16, 0x00, 0xB4, 0xFF, 0x79, 0x00,
+ 0x0F, 0x00, 0x05, 0x00, 0x3B, 0x00, 0x0F, 0x00,
+ 0x0F, 0x00, 0x3B, 0x00, 0x0F, 0x00, 0x19, 0x00,
+ 0x3B, 0x00, 0x0F, 0x00, 0x23, 0x00, 0x3B, 0x00,
+ 0x12, 0x00, 0x2E, 0x00, 0x51, 0x00, 0x14, 0x00,
+ 0x38, 0x00, 0x61, 0x00, 0x16, 0x00, 0x42, 0x00,
+ 0x76, 0x00, 0x18, 0x00, 0x4C, 0x00, 0x8F, 0x00,
+ 0x0F, 0x00, 0xFB, 0xFF, 0x3B, 0x00, 0x0F, 0x00,
+ 0xF1, 0xFF, 0x3B, 0x00, 0x0F, 0x00, 0xE7, 0xFF,
+ 0x3B, 0x00, 0x0F, 0x00, 0xDD, 0xFF, 0x3B, 0x00,
+ 0x12, 0x00, 0xD2, 0xFF, 0x51, 0x00, 0x14, 0x00,
+ 0xC8, 0xFF, 0x61, 0x00, 0x16, 0x00, 0xBE, 0xFF,
+ 0x76, 0x00, 0x18, 0x00, 0xB4, 0xFF, 0x8F, 0x00,
+ 0x11, 0x00, 0x05, 0x00, 0x44, 0x00, 0x11, 0x00,
+ 0x0F, 0x00, 0x44, 0x00, 0x11, 0x00, 0x19, 0x00,
+ 0x44, 0x00, 0x11, 0x00, 0x23, 0x00, 0x44, 0x00,
+ 0x14, 0x00, 0x2E, 0x00, 0x5D, 0x00, 0x16, 0x00,
+ 0x38, 0x00, 0x70, 0x00, 0x18, 0x00, 0x42, 0x00,
+ 0x88, 0x00, 0x1A, 0x00, 0x4C, 0x00, 0xA5, 0x00,
+ 0x11, 0x00, 0xFB, 0xFF, 0x44, 0x00, 0x11, 0x00,
+ 0xF1, 0xFF, 0x44, 0x00, 0x11, 0x00, 0xE7, 0xFF,
+ 0x44, 0x00, 0x11, 0x00, 0xDD, 0xFF, 0x44, 0x00,
+ 0x14, 0x00, 0xD2, 0xFF, 0x5D, 0x00, 0x16, 0x00,
+ 0xC8, 0xFF, 0x70, 0x00, 0x18, 0x00, 0xBE, 0xFF,
+ 0x88, 0x00, 0x1A, 0x00, 0xB4, 0xFF, 0xA5, 0x00,
+ 0x08, 0x00, 0x05, 0x00, 0xFC, 0xFF, 0x08, 0x00,
+ 0x0F, 0x00, 0xFC, 0xFF, 0x08, 0x00, 0x19, 0x00,
+ 0xFC, 0xFF, 0x08, 0x00, 0x23, 0x00, 0xFC, 0xFF,
+ 0x0B, 0x00, 0x2E, 0x00, 0xFA, 0xFF, 0x0D, 0x00,
+ 0x38, 0x00, 0xF9, 0xFF, 0x0F, 0x00, 0x42, 0x00,
+ 0xF7, 0xFF, 0x11, 0x00, 0x4C, 0x00, 0xF5, 0xFF,
+ 0x08, 0x00, 0xFB, 0xFF, 0xFC, 0xFF, 0x08, 0x00,
+ 0xF1, 0xFF, 0xFC, 0xFF, 0x08, 0x00, 0xE7, 0xFF,
+ 0xFC, 0xFF, 0x08, 0x00, 0xDD, 0xFF, 0xFC, 0xFF,
+ 0x0B, 0x00, 0xD2, 0xFF, 0xFA, 0xFF, 0x0D, 0x00,
+ 0xC8, 0xFF, 0xF9, 0xFF, 0x0F, 0x00, 0xBE, 0xFF,
+ 0xF7, 0xFF, 0x11, 0x00, 0xB4, 0xFF, 0xF5, 0xFF,
+ 0x08, 0x00, 0x05, 0x00, 0xF3, 0xFF, 0x08, 0x00,
+ 0x0F, 0x00, 0xF3, 0xFF, 0x08, 0x00, 0x19, 0x00,
+ 0xF3, 0xFF, 0x08, 0x00, 0x23, 0x00, 0xF3, 0xFF,
+ 0x0B, 0x00, 0x2E, 0x00, 0xEE, 0xFF, 0x0D, 0x00,
+ 0x38, 0x00, 0xEA, 0xFF, 0x0F, 0x00, 0x42, 0x00,
+ 0xE5, 0xFF, 0x11, 0x00, 0x4C, 0x00, 0xDF, 0xFF,
+ 0x08, 0x00, 0xFB, 0xFF, 0xF3, 0xFF, 0x08, 0x00,
+ 0xF1, 0xFF, 0xF3, 0xFF, 0x08, 0x00, 0xE7, 0xFF,
+ 0xF3, 0xFF, 0x08, 0x00, 0xDD, 0xFF, 0xF3, 0xFF,
+ 0x0B, 0x00, 0xD2, 0xFF, 0xEE, 0xFF, 0x0D, 0x00,
+ 0xC8, 0xFF, 0xEA, 0xFF, 0x0F, 0x00, 0xBE, 0xFF,
+ 0xE5, 0xFF, 0x11, 0x00, 0xB4, 0xFF, 0xDF, 0xFF,
+ 0x08, 0x00, 0x05, 0x00, 0xEA, 0xFF, 0x08, 0x00,
+ 0x0F, 0x00, 0xEA, 0xFF, 0x08, 0x00, 0x19, 0x00,
+ 0xEA, 0xFF, 0x08, 0x00, 0x23, 0x00, 0xEA, 0xFF,
+ 0x0B, 0x00, 0x2E, 0x00, 0xE1, 0xFF, 0x0D, 0x00,
+ 0x38, 0x00, 0xDB, 0xFF, 0x0F, 0x00, 0x42, 0x00,
+ 0xD3, 0xFF, 0x11, 0x00, 0x4C, 0x00, 0xC9, 0xFF,
+ 0x08, 0x00, 0xFB, 0xFF, 0xEA, 0xFF, 0x08, 0x00,
+ 0xF1, 0xFF, 0xEA, 0xFF, 0x08, 0x00, 0xE7, 0xFF,
+ 0xEA, 0xFF, 0x08, 0x00, 0xDD, 0xFF, 0xEA, 0xFF,
+ 0x0B, 0x00, 0xD2, 0xFF, 0xE1, 0xFF, 0x0D, 0x00,
+ 0xC8, 0xFF, 0xDB, 0xFF, 0x0F, 0x00, 0xBE, 0xFF,
+ 0xD3, 0xFF, 0x11, 0x00, 0xB4, 0xFF, 0xC9, 0xFF,
+ 0x08, 0x00, 0x05, 0x00, 0xE1, 0xFF, 0x08, 0x00,
+ 0x0F, 0x00, 0xE1, 0xFF, 0x08, 0x00, 0x19, 0x00,
+ 0xE1, 0xFF, 0x08, 0x00, 0x23, 0x00, 0xE1, 0xFF,
+ 0x0B, 0x00, 0x2E, 0x00, 0xD5, 0xFF, 0x0D, 0x00,
+ 0x38, 0x00, 0xCC, 0xFF, 0x0F, 0x00, 0x42, 0x00,
+ 0xC1, 0xFF, 0x11, 0x00, 0x4C, 0x00, 0xB3, 0xFF,
+ 0x08, 0x00, 0xFB, 0xFF, 0xE1, 0xFF, 0x08, 0x00,
+ 0xF1, 0xFF, 0xE1, 0xFF, 0x08, 0x00, 0xE7, 0xFF,
+ 0xE1, 0xFF, 0x08, 0x00, 0xDD, 0xFF, 0xE1, 0xFF,
+ 0x0B, 0x00, 0xD2, 0xFF, 0xD5, 0xFF, 0x0D, 0x00,
+ 0xC8, 0xFF, 0xCC, 0xFF, 0x0F, 0x00, 0xBE, 0xFF,
+ 0xC1, 0xFF, 0x11, 0x00, 0xB4, 0xFF, 0xB3, 0xFF,
+ 0x0B, 0x00, 0x05, 0x00, 0xD7, 0xFF, 0x0B, 0x00,
+ 0x0F, 0x00, 0xD7, 0xFF, 0x0B, 0x00, 0x19, 0x00,
+ 0xD7, 0xFF, 0x0B, 0x00, 0x23, 0x00, 0xD7, 0xFF,
+ 0x0E, 0x00, 0x2E, 0x00, 0xC8, 0xFF, 0x10, 0x00,
+ 0x38, 0x00, 0xBD, 0xFF, 0x12, 0x00, 0x42, 0x00,
+ 0xAE, 0xFF, 0x14, 0x00, 0x4C, 0x00, 0x9D, 0xFF,
+ 0x0B, 0x00, 0xFB, 0xFF, 0xD7, 0xFF, 0x0B, 0x00,
+ 0xF1, 0xFF, 0xD7, 0xFF, 0x0B, 0x00, 0xE7, 0xFF,
+ 0xD7, 0xFF, 0x0B, 0x00, 0xDD, 0xFF, 0xD7, 0xFF,
+ 0x0E, 0x00, 0xD2, 0xFF, 0xC8, 0xFF, 0x10, 0x00,
+ 0xC8, 0xFF, 0xBD, 0xFF, 0x12, 0x00, 0xBE, 0xFF,
+ 0xAE, 0xFF, 0x14, 0x00, 0xB4, 0xFF, 0x9D, 0xFF,
+ 0x0D, 0x00, 0x05, 0x00, 0xCE, 0xFF, 0x0D, 0x00,
+ 0x0F, 0x00, 0xCE, 0xFF, 0x0D, 0x00, 0x19, 0x00,
+ 0xCE, 0xFF, 0x0D, 0x00, 0x23, 0x00, 0xCE, 0xFF,
+ 0x10, 0x00, 0x2E, 0x00, 0xBC, 0xFF, 0x12, 0x00,
+ 0x38, 0x00, 0xAE, 0xFF, 0x14, 0x00, 0x42, 0x00,
+ 0x9C, 0xFF, 0x16, 0x00, 0x4C, 0x00, 0x87, 0xFF,
+ 0x0D, 0x00, 0xFB, 0xFF, 0xCE, 0xFF, 0x0D, 0x00,
+ 0xF1, 0xFF, 0xCE, 0xFF, 0x0D, 0x00, 0xE7, 0xFF,
+ 0xCE, 0xFF, 0x0D, 0x00, 0xDD, 0xFF, 0xCE, 0xFF,
+ 0x10, 0x00, 0xD2, 0xFF, 0xBC, 0xFF, 0x12, 0x00,
+ 0xC8, 0xFF, 0xAE, 0xFF, 0x14, 0x00, 0xBE, 0xFF,
+ 0x9C, 0xFF, 0x16, 0x00, 0xB4, 0xFF, 0x87, 0xFF,
+ 0x0F, 0x00, 0x05, 0x00, 0xC5, 0xFF, 0x0F, 0x00,
+ 0x0F, 0x00, 0xC5, 0xFF, 0x0F, 0x00, 0x19, 0x00,
+ 0xC5, 0xFF, 0x0F, 0x00, 0x23, 0x00, 0xC5, 0xFF,
+ 0x12, 0x00, 0x2E, 0x00, 0xAF, 0xFF, 0x14, 0x00,
+ 0x38, 0x00, 0x9F, 0xFF, 0x16, 0x00, 0x42, 0x00,
+ 0x8A, 0xFF, 0x18, 0x00, 0x4C, 0x00, 0x71, 0xFF,
+ 0x0F, 0x00, 0xFB, 0xFF, 0xC5, 0xFF, 0x0F, 0x00,
+ 0xF1, 0xFF, 0xC5, 0xFF, 0x0F, 0x00, 0xE7, 0xFF,
+ 0xC5, 0xFF, 0x0F, 0x00, 0xDD, 0xFF, 0xC5, 0xFF,
+ 0x12, 0x00, 0xD2, 0xFF, 0xAF, 0xFF, 0x14, 0x00,
+ 0xC8, 0xFF, 0x9F, 0xFF, 0x16, 0x00, 0xBE, 0xFF,
+ 0x8A, 0xFF, 0x18, 0x00, 0xB4, 0xFF, 0x71, 0xFF,
+ 0x11, 0x00, 0x05, 0x00, 0xBC, 0xFF, 0x11, 0x00,
+ 0x0F, 0x00, 0xBC, 0xFF, 0x11, 0x00, 0x19, 0x00,
+ 0xBC, 0xFF, 0x11, 0x00, 0x23, 0x00, 0xBC, 0xFF,
+ 0x14, 0x00, 0x2E, 0x00, 0xA3, 0xFF, 0x16, 0x00,
+ 0x38, 0x00, 0x90, 0xFF, 0x18, 0x00, 0x42, 0x00,
+ 0x78, 0xFF, 0x1A, 0x00, 0x4C, 0x00, 0x5B, 0xFF,
+ 0x11, 0x00, 0xFB, 0xFF, 0xBC, 0xFF, 0x11, 0x00,
+ 0xF1, 0xFF, 0xBC, 0xFF, 0x11, 0x00, 0xE7, 0xFF,
+ 0xBC, 0xFF, 0x11, 0x00, 0xDD, 0xFF, 0xBC, 0xFF,
+ 0x14, 0x00, 0xD2, 0xFF, 0xA3, 0xFF, 0x16, 0x00,
+ 0xC8, 0xFF, 0x90, 0xFF, 0x18, 0x00, 0xBE, 0xFF,
+ 0x78, 0xFF, 0x1A, 0x00, 0xB4, 0xFF, 0x5B, 0xFF,
+ 0x09, 0x00, 0x05, 0x00, 0x05, 0x00, 0x09, 0x00,
+ 0x10, 0x00, 0x05, 0x00, 0x09, 0x00, 0x1B, 0x00,
+ 0x05, 0x00, 0x09, 0x00, 0x26, 0x00, 0x05, 0x00,
+ 0x0C, 0x00, 0x32, 0x00, 0x06, 0x00, 0x0E, 0x00,
+ 0x3D, 0x00, 0x08, 0x00, 0x10, 0x00, 0x48, 0x00,
+ 0x0A, 0x00, 0x12, 0x00, 0x53, 0x00, 0x0C, 0x00,
+ 0x09, 0x00, 0xFB, 0xFF, 0x05, 0x00, 0x09, 0x00,
+ 0xF0, 0xFF, 0x05, 0x00, 0x09, 0x00, 0xE5, 0xFF,
+ 0x05, 0x00, 0x09, 0x00, 0xDA, 0xFF, 0x05, 0x00,
+ 0x0C, 0x00, 0xCE, 0xFF, 0x06, 0x00, 0x0E, 0x00,
+ 0xC3, 0xFF, 0x08, 0x00, 0x10, 0x00, 0xB8, 0xFF,
+ 0x0A, 0x00, 0x12, 0x00, 0xAD, 0xFF, 0x0C, 0x00,
+ 0x09, 0x00, 0x05, 0x00, 0x0F, 0x00, 0x09, 0x00,
+ 0x10, 0x00, 0x0F, 0x00, 0x09, 0x00, 0x1B, 0x00,
+ 0x0F, 0x00, 0x09, 0x00, 0x26, 0x00, 0x0F, 0x00,
+ 0x0C, 0x00, 0x32, 0x00, 0x13, 0x00, 0x0E, 0x00,
+ 0x3D, 0x00, 0x18, 0x00, 0x10, 0x00, 0x48, 0x00,
+ 0x1E, 0x00, 0x12, 0x00, 0x53, 0x00, 0x24, 0x00,
+ 0x09, 0x00, 0xFB, 0xFF, 0x0F, 0x00, 0x09, 0x00,
+ 0xF0, 0xFF, 0x0F, 0x00, 0x09, 0x00, 0xE5, 0xFF,
+ 0x0F, 0x00, 0x09, 0x00, 0xDA, 0xFF, 0x0F, 0x00,
+ 0x0C, 0x00, 0xCE, 0xFF, 0x13, 0x00, 0x0E, 0x00,
+ 0xC3, 0xFF, 0x18, 0x00, 0x10, 0x00, 0xB8, 0xFF,
+ 0x1E, 0x00, 0x12, 0x00, 0xAD, 0xFF, 0x24, 0x00,
+ 0x09, 0x00, 0x05, 0x00, 0x19, 0x00, 0x09, 0x00,
+ 0x10, 0x00, 0x19, 0x00, 0x09, 0x00, 0x1B, 0x00,
+ 0x19, 0x00, 0x09, 0x00, 0x26, 0x00, 0x19, 0x00,
+ 0x0C, 0x00, 0x32, 0x00, 0x21, 0x00, 0x0E, 0x00,
+ 0x3D, 0x00, 0x29, 0x00, 0x10, 0x00, 0x48, 0x00,
+ 0x32, 0x00, 0x12, 0x00, 0x53, 0x00, 0x3C, 0x00,
+ 0x09, 0x00, 0xFB, 0xFF, 0x19, 0x00, 0x09, 0x00,
+ 0xF0, 0xFF, 0x19, 0x00, 0x09, 0x00, 0xE5, 0xFF,
+ 0x19, 0x00, 0x09, 0x00, 0xDA, 0xFF, 0x19, 0x00,
+ 0x0C, 0x00, 0xCE, 0xFF, 0x21, 0x00, 0x0E, 0x00,
+ 0xC3, 0xFF, 0x29, 0x00, 0x10, 0x00, 0xB8, 0xFF,
+ 0x32, 0x00, 0x12, 0x00, 0xAD, 0xFF, 0x3C, 0x00,
+ 0x09, 0x00, 0x05, 0x00, 0x23, 0x00, 0x09, 0x00,
+ 0x10, 0x00, 0x23, 0x00, 0x09, 0x00, 0x1B, 0x00,
+ 0x23, 0x00, 0x09, 0x00, 0x26, 0x00, 0x23, 0x00,
+ 0x0C, 0x00, 0x32, 0x00, 0x2E, 0x00, 0x0E, 0x00,
+ 0x3D, 0x00, 0x39, 0x00, 0x10, 0x00, 0x48, 0x00,
+ 0x46, 0x00, 0x12, 0x00, 0x53, 0x00, 0x54, 0x00,
+ 0x09, 0x00, 0xFB, 0xFF, 0x23, 0x00, 0x09, 0x00,
+ 0xF0, 0xFF, 0x23, 0x00, 0x09, 0x00, 0xE5, 0xFF,
+ 0x23, 0x00, 0x09, 0x00, 0xDA, 0xFF, 0x23, 0x00,
+ 0x0C, 0x00, 0xCE, 0xFF, 0x2E, 0x00, 0x0E, 0x00,
+ 0xC3, 0xFF, 0x39, 0x00, 0x10, 0x00, 0xB8, 0xFF,
+ 0x46, 0x00, 0x12, 0x00, 0xAD, 0xFF, 0x54, 0x00,
+ 0x0C, 0x00, 0x05, 0x00, 0x2E, 0x00, 0x0C, 0x00,
+ 0x10, 0x00, 0x2E, 0x00, 0x0C, 0x00, 0x1B, 0x00,
+ 0x2E, 0x00, 0x0C, 0x00, 0x26, 0x00, 0x2E, 0x00,
+ 0x0F, 0x00, 0x32, 0x00, 0x3D, 0x00, 0x11, 0x00,
+ 0x3D, 0x00, 0x4A, 0x00, 0x13, 0x00, 0x48, 0x00,
+ 0x5A, 0x00, 0x15, 0x00, 0x53, 0x00, 0x6D, 0x00,
+ 0x0C, 0x00, 0xFB, 0xFF, 0x2E, 0x00, 0x0C, 0x00,
+ 0xF0, 0xFF, 0x2E, 0x00, 0x0C, 0x00, 0xE5, 0xFF,
+ 0x2E, 0x00, 0x0C, 0x00, 0xDA, 0xFF, 0x2E, 0x00,
+ 0x0F, 0x00, 0xCE, 0xFF, 0x3D, 0x00, 0x11, 0x00,
+ 0xC3, 0xFF, 0x4A, 0x00, 0x13, 0x00, 0xB8, 0xFF,
+ 0x5A, 0x00, 0x15, 0x00, 0xAD, 0xFF, 0x6D, 0x00,
+ 0x0E, 0x00, 0x05, 0x00, 0x38, 0x00, 0x0E, 0x00,
+ 0x10, 0x00, 0x38, 0x00, 0x0E, 0x00, 0x1B, 0x00,
+ 0x38, 0x00, 0x0E, 0x00, 0x26, 0x00, 0x38, 0x00,
+ 0x11, 0x00, 0x32, 0x00, 0x4A, 0x00, 0x13, 0x00,
+ 0x3D, 0x00, 0x5A, 0x00, 0x15, 0x00, 0x48, 0x00,
+ 0x6E, 0x00, 0x17, 0x00, 0x53, 0x00, 0x85, 0x00,
+ 0x0E, 0x00, 0xFB, 0xFF, 0x38, 0x00, 0x0E, 0x00,
+ 0xF0, 0xFF, 0x38, 0x00, 0x0E, 0x00, 0xE5, 0xFF,
+ 0x38, 0x00, 0x0E, 0x00, 0xDA, 0xFF, 0x38, 0x00,
+ 0x11, 0x00, 0xCE, 0xFF, 0x4A, 0x00, 0x13, 0x00,
+ 0xC3, 0xFF, 0x5A, 0x00, 0x15, 0x00, 0xB8, 0xFF,
+ 0x6E, 0x00, 0x17, 0x00, 0xAD, 0xFF, 0x85, 0x00,
+ 0x10, 0x00, 0x05, 0x00, 0x42, 0x00, 0x10, 0x00,
+ 0x10, 0x00, 0x42, 0x00, 0x10, 0x00, 0x1B, 0x00,
+ 0x42, 0x00, 0x10, 0x00, 0x26, 0x00, 0x42, 0x00,
+ 0x13, 0x00, 0x32, 0x00, 0x58, 0x00, 0x15, 0x00,
+ 0x3D, 0x00, 0x6B, 0x00, 0x17, 0x00, 0x48, 0x00,
+ 0x82, 0x00, 0x19, 0x00, 0x53, 0x00, 0x9D, 0x00,
+ 0x10, 0x00, 0xFB, 0xFF, 0x42, 0x00, 0x10, 0x00,
+ 0xF0, 0xFF, 0x42, 0x00, 0x10, 0x00, 0xE5, 0xFF,
+ 0x42, 0x00, 0x10, 0x00, 0xDA, 0xFF, 0x42, 0x00,
+ 0x13, 0x00, 0xCE, 0xFF, 0x58, 0x00, 0x15, 0x00,
+ 0xC3, 0xFF, 0x6B, 0x00, 0x17, 0x00, 0xB8, 0xFF,
+ 0x82, 0x00, 0x19, 0x00, 0xAD, 0xFF, 0x9D, 0x00,
+ 0x12, 0x00, 0x05, 0x00, 0x4C, 0x00, 0x12, 0x00,
+ 0x10, 0x00, 0x4C, 0x00, 0x12, 0x00, 0x1B, 0x00,
+ 0x4C, 0x00, 0x12, 0x00, 0x26, 0x00, 0x4C, 0x00,
+ 0x15, 0x00, 0x32, 0x00, 0x65, 0x00, 0x17, 0x00,
+ 0x3D, 0x00, 0x7B, 0x00, 0x19, 0x00, 0x48, 0x00,
+ 0x96, 0x00, 0x1B, 0x00, 0x53, 0x00, 0xB5, 0x00,
+ 0x12, 0x00, 0xFB, 0xFF, 0x4C, 0x00, 0x12, 0x00,
+ 0xF0, 0xFF, 0x4C, 0x00, 0x12, 0x00, 0xE5, 0xFF,
+ 0x4C, 0x00, 0x12, 0x00, 0xDA, 0xFF, 0x4C, 0x00,
+ 0x15, 0x00, 0xCE, 0xFF, 0x65, 0x00, 0x17, 0x00,
+ 0xC3, 0xFF, 0x7B, 0x00, 0x19, 0x00, 0xB8, 0xFF,
+ 0x96, 0x00, 0x1B, 0x00, 0xAD, 0xFF, 0xB5, 0x00,
+ 0x09, 0x00, 0x05, 0x00, 0xFB, 0xFF, 0x09, 0x00,
+ 0x10, 0x00, 0xFB, 0xFF, 0x09, 0x00, 0x1B, 0x00,
+ 0xFB, 0xFF, 0x09, 0x00, 0x26, 0x00, 0xFB, 0xFF,
+ 0x0C, 0x00, 0x32, 0x00, 0xFA, 0xFF, 0x0E, 0x00,
+ 0x3D, 0x00, 0xF8, 0xFF, 0x10, 0x00, 0x48, 0x00,
+ 0xF6, 0xFF, 0x12, 0x00, 0x53, 0x00, 0xF4, 0xFF,
+ 0x09, 0x00, 0xFB, 0xFF, 0xFB, 0xFF, 0x09, 0x00,
+ 0xF0, 0xFF, 0xFB, 0xFF, 0x09, 0x00, 0xE5, 0xFF,
+ 0xFB, 0xFF, 0x09, 0x00, 0xDA, 0xFF, 0xFB, 0xFF,
+ 0x0C, 0x00, 0xCE, 0xFF, 0xFA, 0xFF, 0x0E, 0x00,
+ 0xC3, 0xFF, 0xF8, 0xFF, 0x10, 0x00, 0xB8, 0xFF,
+ 0xF6, 0xFF, 0x12, 0x00, 0xAD, 0xFF, 0xF4, 0xFF,
+ 0x09, 0x00, 0x05, 0x00, 0xF1, 0xFF, 0x09, 0x00,
+ 0x10, 0x00, 0xF1, 0xFF, 0x09, 0x00, 0x1B, 0x00,
+ 0xF1, 0xFF, 0x09, 0x00, 0x26, 0x00, 0xF1, 0xFF,
+ 0x0C, 0x00, 0x32, 0x00, 0xED, 0xFF, 0x0E, 0x00,
+ 0x3D, 0x00, 0xE8, 0xFF, 0x10, 0x00, 0x48, 0x00,
+ 0xE2, 0xFF, 0x12, 0x00, 0x53, 0x00, 0xDC, 0xFF,
+ 0x09, 0x00, 0xFB, 0xFF, 0xF1, 0xFF, 0x09, 0x00,
+ 0xF0, 0xFF, 0xF1, 0xFF, 0x09, 0x00, 0xE5, 0xFF,
+ 0xF1, 0xFF, 0x09, 0x00, 0xDA, 0xFF, 0xF1, 0xFF,
+ 0x0C, 0x00, 0xCE, 0xFF, 0xED, 0xFF, 0x0E, 0x00,
+ 0xC3, 0xFF, 0xE8, 0xFF, 0x10, 0x00, 0xB8, 0xFF,
+ 0xE2, 0xFF, 0x12, 0x00, 0xAD, 0xFF, 0xDC, 0xFF,
+ 0x09, 0x00, 0x05, 0x00, 0xE7, 0xFF, 0x09, 0x00,
+ 0x10, 0x00, 0xE7, 0xFF, 0x09, 0x00, 0x1B, 0x00,
+ 0xE7, 0xFF, 0x09, 0x00, 0x26, 0x00, 0xE7, 0xFF,
+ 0x0C, 0x00, 0x32, 0x00, 0xDF, 0xFF, 0x0E, 0x00,
+ 0x3D, 0x00, 0xD7, 0xFF, 0x10, 0x00, 0x48, 0x00,
+ 0xCE, 0xFF, 0x12, 0x00, 0x53, 0x00, 0xC4, 0xFF,
+ 0x09, 0x00, 0xFB, 0xFF, 0xE7, 0xFF, 0x09, 0x00,
+ 0xF0, 0xFF, 0xE7, 0xFF, 0x09, 0x00, 0xE5, 0xFF,
+ 0xE7, 0xFF, 0x09, 0x00, 0xDA, 0xFF, 0xE7, 0xFF,
+ 0x0C, 0x00, 0xCE, 0xFF, 0xDF, 0xFF, 0x0E, 0x00,
+ 0xC3, 0xFF, 0xD7, 0xFF, 0x10, 0x00, 0xB8, 0xFF,
+ 0xCE, 0xFF, 0x12, 0x00, 0xAD, 0xFF, 0xC4, 0xFF,
+ 0x09, 0x00, 0x05, 0x00, 0xDD, 0xFF, 0x09, 0x00,
+ 0x10, 0x00, 0xDD, 0xFF, 0x09, 0x00, 0x1B, 0x00,
+ 0xDD, 0xFF, 0x09, 0x00, 0x26, 0x00, 0xDD, 0xFF,
+ 0x0C, 0x00, 0x32, 0x00, 0xD2, 0xFF, 0x0E, 0x00,
+ 0x3D, 0x00, 0xC7, 0xFF, 0x10, 0x00, 0x48, 0x00,
+ 0xBA, 0xFF, 0x12, 0x00, 0x53, 0x00, 0xAC, 0xFF,
+ 0x09, 0x00, 0xFB, 0xFF, 0xDD, 0xFF, 0x09, 0x00,
+ 0xF0, 0xFF, 0xDD, 0xFF, 0x09, 0x00, 0xE5, 0xFF,
+ 0xDD, 0xFF, 0x09, 0x00, 0xDA, 0xFF, 0xDD, 0xFF,
+ 0x0C, 0x00, 0xCE, 0xFF, 0xD2, 0xFF, 0x0E, 0x00,
+ 0xC3, 0xFF, 0xC7, 0xFF, 0x10, 0x00, 0xB8, 0xFF,
+ 0xBA, 0xFF, 0x12, 0x00, 0xAD, 0xFF, 0xAC, 0xFF,
+ 0x0C, 0x00, 0x05, 0x00, 0xD2, 0xFF, 0x0C, 0x00,
+ 0x10, 0x00, 0xD2, 0xFF, 0x0C, 0x00, 0x1B, 0x00,
+ 0xD2, 0xFF, 0x0C, 0x00, 0x26, 0x00, 0xD2, 0xFF,
+ 0x0F, 0x00, 0x32, 0x00, 0xC3, 0xFF, 0x11, 0x00,
+ 0x3D, 0x00, 0xB6, 0xFF, 0x13, 0x00, 0x48, 0x00,
+ 0xA6, 0xFF, 0x15, 0x00, 0x53, 0x00, 0x93, 0xFF,
+ 0x0C, 0x00, 0xFB, 0xFF, 0xD2, 0xFF, 0x0C, 0x00,
+ 0xF0, 0xFF, 0xD2, 0xFF, 0x0C, 0x00, 0xE5, 0xFF,
+ 0xD2, 0xFF, 0x0C, 0x00, 0xDA, 0xFF, 0xD2, 0xFF,
+ 0x0F, 0x00, 0xCE, 0xFF, 0xC3, 0xFF, 0x11, 0x00,
+ 0xC3, 0xFF, 0xB6, 0xFF, 0x13, 0x00, 0xB8, 0xFF,
+ 0xA6, 0xFF, 0x15, 0x00, 0xAD, 0xFF, 0x93, 0xFF,
+ 0x0E, 0x00, 0x05, 0x00, 0xC8, 0xFF, 0x0E, 0x00,
+ 0x10, 0x00, 0xC8, 0xFF, 0x0E, 0x00, 0x1B, 0x00,
+ 0xC8, 0xFF, 0x0E, 0x00, 0x26, 0x00, 0xC8, 0xFF,
+ 0x11, 0x00, 0x32, 0x00, 0xB6, 0xFF, 0x13, 0x00,
+ 0x3D, 0x00, 0xA6, 0xFF, 0x15, 0x00, 0x48, 0x00,
+ 0x92, 0xFF, 0x17, 0x00, 0x53, 0x00, 0x7B, 0xFF,
+ 0x0E, 0x00, 0xFB, 0xFF, 0xC8, 0xFF, 0x0E, 0x00,
+ 0xF0, 0xFF, 0xC8, 0xFF, 0x0E, 0x00, 0xE5, 0xFF,
+ 0xC8, 0xFF, 0x0E, 0x00, 0xDA, 0xFF, 0xC8, 0xFF,
+ 0x11, 0x00, 0xCE, 0xFF, 0xB6, 0xFF, 0x13, 0x00,
+ 0xC3, 0xFF, 0xA6, 0xFF, 0x15, 0x00, 0xB8, 0xFF,
+ 0x92, 0xFF, 0x17, 0x00, 0xAD, 0xFF, 0x7B, 0xFF,
+ 0x10, 0x00, 0x05, 0x00, 0xBE, 0xFF, 0x10, 0x00,
+ 0x10, 0x00, 0xBE, 0xFF, 0x10, 0x00, 0x1B, 0x00,
+ 0xBE, 0xFF, 0x10, 0x00, 0x26, 0x00, 0xBE, 0xFF,
+ 0x13, 0x00, 0x32, 0x00, 0xA8, 0xFF, 0x15, 0x00,
+ 0x3D, 0x00, 0x95, 0xFF, 0x17, 0x00, 0x48, 0x00,
+ 0x7E, 0xFF, 0x19, 0x00, 0x53, 0x00, 0x63, 0xFF,
+ 0x10, 0x00, 0xFB, 0xFF, 0xBE, 0xFF, 0x10, 0x00,
+ 0xF0, 0xFF, 0xBE, 0xFF, 0x10, 0x00, 0xE5, 0xFF,
+ 0xBE, 0xFF, 0x10, 0x00, 0xDA, 0xFF, 0xBE, 0xFF,
+ 0x13, 0x00, 0xCE, 0xFF, 0xA8, 0xFF, 0x15, 0x00,
+ 0xC3, 0xFF, 0x95, 0xFF, 0x17, 0x00, 0xB8, 0xFF,
+ 0x7E, 0xFF, 0x19, 0x00, 0xAD, 0xFF, 0x63, 0xFF,
+ 0x12, 0x00, 0x05, 0x00, 0xB4, 0xFF, 0x12, 0x00,
+ 0x10, 0x00, 0xB4, 0xFF, 0x12, 0x00, 0x1B, 0x00,
+ 0xB4, 0xFF, 0x12, 0x00, 0x26, 0x00, 0xB4, 0xFF,
+ 0x15, 0x00, 0x32, 0x00, 0x9B, 0xFF, 0x17, 0x00,
+ 0x3D, 0x00, 0x85, 0xFF, 0x19, 0x00, 0x48, 0x00,
+ 0x6A, 0xFF, 0x1B, 0x00, 0x53, 0x00, 0x4B, 0xFF,
+ 0x12, 0x00, 0xFB, 0xFF, 0xB4, 0xFF, 0x12, 0x00,
+ 0xF0, 0xFF, 0xB4, 0xFF, 0x12, 0x00, 0xE5, 0xFF,
+ 0xB4, 0xFF, 0x12, 0x00, 0xDA, 0xFF, 0xB4, 0xFF,
+ 0x15, 0x00, 0xCE, 0xFF, 0x9B, 0xFF, 0x17, 0x00,
+ 0xC3, 0xFF, 0x85, 0xFF, 0x19, 0x00, 0xB8, 0xFF,
+ 0x6A, 0xFF, 0x1B, 0x00, 0xAD, 0xFF, 0x4B, 0xFF,
+ 0x0A, 0x00, 0x06, 0x00, 0x05, 0x00, 0x0A, 0x00,
+ 0x12, 0x00, 0x05, 0x00, 0x0A, 0x00, 0x1F, 0x00,
+ 0x05, 0x00, 0x0A, 0x00, 0x2B, 0x00, 0x05, 0x00,
+ 0x0D, 0x00, 0x38, 0x00, 0x07, 0x00, 0x0F, 0x00,
+ 0x44, 0x00, 0x09, 0x00, 0x11, 0x00, 0x51, 0x00,
+ 0x0B, 0x00, 0x13, 0x00, 0x5D, 0x00, 0x0D, 0x00,
+ 0x0A, 0x00, 0xFA, 0xFF, 0x05, 0x00, 0x0A, 0x00,
+ 0xEE, 0xFF, 0x05, 0x00, 0x0A, 0x00, 0xE1, 0xFF,
+ 0x05, 0x00, 0x0A, 0x00, 0xD5, 0xFF, 0x05, 0x00,
+ 0x0D, 0x00, 0xC8, 0xFF, 0x07, 0x00, 0x0F, 0x00,
+ 0xBC, 0xFF, 0x09, 0x00, 0x11, 0x00, 0xAF, 0xFF,
+ 0x0B, 0x00, 0x13, 0x00, 0xA3, 0xFF, 0x0D, 0x00,
+ 0x0A, 0x00, 0x06, 0x00, 0x10, 0x00, 0x0A, 0x00,
+ 0x12, 0x00, 0x10, 0x00, 0x0A, 0x00, 0x1F, 0x00,
+ 0x10, 0x00, 0x0A, 0x00, 0x2B, 0x00, 0x10, 0x00,
+ 0x0D, 0x00, 0x38, 0x00, 0x16, 0x00, 0x0F, 0x00,
+ 0x44, 0x00, 0x1B, 0x00, 0x11, 0x00, 0x51, 0x00,
+ 0x21, 0x00, 0x13, 0x00, 0x5D, 0x00, 0x27, 0x00,
+ 0x0A, 0x00, 0xFA, 0xFF, 0x10, 0x00, 0x0A, 0x00,
+ 0xEE, 0xFF, 0x10, 0x00, 0x0A, 0x00, 0xE1, 0xFF,
+ 0x10, 0x00, 0x0A, 0x00, 0xD5, 0xFF, 0x10, 0x00,
+ 0x0D, 0x00, 0xC8, 0xFF, 0x16, 0x00, 0x0F, 0x00,
+ 0xBC, 0xFF, 0x1B, 0x00, 0x11, 0x00, 0xAF, 0xFF,
+ 0x21, 0x00, 0x13, 0x00, 0xA3, 0xFF, 0x27, 0x00,
+ 0x0A, 0x00, 0x06, 0x00, 0x1B, 0x00, 0x0A, 0x00,
+ 0x12, 0x00, 0x1B, 0x00, 0x0A, 0x00, 0x1F, 0x00,
+ 0x1B, 0x00, 0x0A, 0x00, 0x2B, 0x00, 0x1B, 0x00,
+ 0x0D, 0x00, 0x38, 0x00, 0x25, 0x00, 0x0F, 0x00,
+ 0x44, 0x00, 0x2D, 0x00, 0x11, 0x00, 0x51, 0x00,
+ 0x37, 0x00, 0x13, 0x00, 0x5D, 0x00, 0x42, 0x00,
+ 0x0A, 0x00, 0xFA, 0xFF, 0x1B, 0x00, 0x0A, 0x00,
+ 0xEE, 0xFF, 0x1B, 0x00, 0x0A, 0x00, 0xE1, 0xFF,
+ 0x1B, 0x00, 0x0A, 0x00, 0xD5, 0xFF, 0x1B, 0x00,
+ 0x0D, 0x00, 0xC8, 0xFF, 0x25, 0x00, 0x0F, 0x00,
+ 0xBC, 0xFF, 0x2D, 0x00, 0x11, 0x00, 0xAF, 0xFF,
+ 0x37, 0x00, 0x13, 0x00, 0xA3, 0xFF, 0x42, 0x00,
+ 0x0A, 0x00, 0x06, 0x00, 0x26, 0x00, 0x0A, 0x00,
+ 0x12, 0x00, 0x26, 0x00, 0x0A, 0x00, 0x1F, 0x00,
+ 0x26, 0x00, 0x0A, 0x00, 0x2B, 0x00, 0x26, 0x00,
+ 0x0D, 0x00, 0x38, 0x00, 0x34, 0x00, 0x0F, 0x00,
+ 0x44, 0x00, 0x3F, 0x00, 0x11, 0x00, 0x51, 0x00,
+ 0x4D, 0x00, 0x13, 0x00, 0x5D, 0x00, 0x5C, 0x00,
+ 0x0A, 0x00, 0xFA, 0xFF, 0x26, 0x00, 0x0A, 0x00,
+ 0xEE, 0xFF, 0x26, 0x00, 0x0A, 0x00, 0xE1, 0xFF,
+ 0x26, 0x00, 0x0A, 0x00, 0xD5, 0xFF, 0x26, 0x00,
+ 0x0D, 0x00, 0xC8, 0xFF, 0x34, 0x00, 0x0F, 0x00,
+ 0xBC, 0xFF, 0x3F, 0x00, 0x11, 0x00, 0xAF, 0xFF,
+ 0x4D, 0x00, 0x13, 0x00, 0xA3, 0xFF, 0x5C, 0x00,
+ 0x0D, 0x00, 0x06, 0x00, 0x32, 0x00, 0x0D, 0x00,
+ 0x12, 0x00, 0x32, 0x00, 0x0D, 0x00, 0x1F, 0x00,
+ 0x32, 0x00, 0x0D, 0x00, 0x2B, 0x00, 0x32, 0x00,
+ 0x10, 0x00, 0x38, 0x00, 0x43, 0x00, 0x12, 0x00,
+ 0x44, 0x00, 0x52, 0x00, 0x14, 0x00, 0x51, 0x00,
+ 0x63, 0x00, 0x16, 0x00, 0x5D, 0x00, 0x78, 0x00,
+ 0x0D, 0x00, 0xFA, 0xFF, 0x32, 0x00, 0x0D, 0x00,
+ 0xEE, 0xFF, 0x32, 0x00, 0x0D, 0x00, 0xE1, 0xFF,
+ 0x32, 0x00, 0x0D, 0x00, 0xD5, 0xFF, 0x32, 0x00,
+ 0x10, 0x00, 0xC8, 0xFF, 0x43, 0x00, 0x12, 0x00,
+ 0xBC, 0xFF, 0x52, 0x00, 0x14, 0x00, 0xAF, 0xFF,
+ 0x63, 0x00, 0x16, 0x00, 0xA3, 0xFF, 0x78, 0x00,
+ 0x0F, 0x00, 0x06, 0x00, 0x3D, 0x00, 0x0F, 0x00,
+ 0x12, 0x00, 0x3D, 0x00, 0x0F, 0x00, 0x1F, 0x00,
+ 0x3D, 0x00, 0x0F, 0x00, 0x2B, 0x00, 0x3D, 0x00,
+ 0x12, 0x00, 0x38, 0x00, 0x52, 0x00, 0x14, 0x00,
+ 0x44, 0x00, 0x64, 0x00, 0x16, 0x00, 0x51, 0x00,
+ 0x79, 0x00, 0x18, 0x00, 0x5D, 0x00, 0x92, 0x00,
+ 0x0F, 0x00, 0xFA, 0xFF, 0x3D, 0x00, 0x0F, 0x00,
+ 0xEE, 0xFF, 0x3D, 0x00, 0x0F, 0x00, 0xE1, 0xFF,
+ 0x3D, 0x00, 0x0F, 0x00, 0xD5, 0xFF, 0x3D, 0x00,
+ 0x12, 0x00, 0xC8, 0xFF, 0x52, 0x00, 0x14, 0x00,
+ 0xBC, 0xFF, 0x64, 0x00, 0x16, 0x00, 0xAF, 0xFF,
+ 0x79, 0x00, 0x18, 0x00, 0xA3, 0xFF, 0x92, 0x00,
+ 0x11, 0x00, 0x06, 0x00, 0x48, 0x00, 0x11, 0x00,
+ 0x12, 0x00, 0x48, 0x00, 0x11, 0x00, 0x1F, 0x00,
+ 0x48, 0x00, 0x11, 0x00, 0x2B, 0x00, 0x48, 0x00,
+ 0x14, 0x00, 0x38, 0x00, 0x61, 0x00, 0x16, 0x00,
+ 0x44, 0x00, 0x76, 0x00, 0x18, 0x00, 0x51, 0x00,
+ 0x8F, 0x00, 0x1A, 0x00, 0x5D, 0x00, 0xAD, 0x00,
+ 0x11, 0x00, 0xFA, 0xFF, 0x48, 0x00, 0x11, 0x00,
+ 0xEE, 0xFF, 0x48, 0x00, 0x11, 0x00, 0xE1, 0xFF,
+ 0x48, 0x00, 0x11, 0x00, 0xD5, 0xFF, 0x48, 0x00,
+ 0x14, 0x00, 0xC8, 0xFF, 0x61, 0x00, 0x16, 0x00,
+ 0xBC, 0xFF, 0x76, 0x00, 0x18, 0x00, 0xAF, 0xFF,
+ 0x8F, 0x00, 0x1A, 0x00, 0xA3, 0xFF, 0xAD, 0x00,
+ 0x13, 0x00, 0x06, 0x00, 0x53, 0x00, 0x13, 0x00,
+ 0x12, 0x00, 0x53, 0x00, 0x13, 0x00, 0x1F, 0x00,
+ 0x53, 0x00, 0x13, 0x00, 0x2B, 0x00, 0x53, 0x00,
+ 0x16, 0x00, 0x38, 0x00, 0x70, 0x00, 0x18, 0x00,
+ 0x44, 0x00, 0x88, 0x00, 0x1A, 0x00, 0x51, 0x00,
+ 0xA5, 0x00, 0x1C, 0x00, 0x5D, 0x00, 0xC7, 0x00,
+ 0x13, 0x00, 0xFA, 0xFF, 0x53, 0x00, 0x13, 0x00,
+ 0xEE, 0xFF, 0x53, 0x00, 0x13, 0x00, 0xE1, 0xFF,
+ 0x53, 0x00, 0x13, 0x00, 0xD5, 0xFF, 0x53, 0x00,
+ 0x16, 0x00, 0xC8, 0xFF, 0x70, 0x00, 0x18, 0x00,
+ 0xBC, 0xFF, 0x88, 0x00, 0x1A, 0x00, 0xAF, 0xFF,
+ 0xA5, 0x00, 0x1C, 0x00, 0xA3, 0xFF, 0xC7, 0x00,
+ 0x0A, 0x00, 0x06, 0x00, 0xFB, 0xFF, 0x0A, 0x00,
+ 0x12, 0x00, 0xFB, 0xFF, 0x0A, 0x00, 0x1F, 0x00,
+ 0xFB, 0xFF, 0x0A, 0x00, 0x2B, 0x00, 0xFB, 0xFF,
+ 0x0D, 0x00, 0x38, 0x00, 0xF9, 0xFF, 0x0F, 0x00,
+ 0x44, 0x00, 0xF7, 0xFF, 0x11, 0x00, 0x51, 0x00,
+ 0xF5, 0xFF, 0x13, 0x00, 0x5D, 0x00, 0xF3, 0xFF,
+ 0x0A, 0x00, 0xFA, 0xFF, 0xFB, 0xFF, 0x0A, 0x00,
+ 0xEE, 0xFF, 0xFB, 0xFF, 0x0A, 0x00, 0xE1, 0xFF,
+ 0xFB, 0xFF, 0x0A, 0x00, 0xD5, 0xFF, 0xFB, 0xFF,
+ 0x0D, 0x00, 0xC8, 0xFF, 0xF9, 0xFF, 0x0F, 0x00,
+ 0xBC, 0xFF, 0xF7, 0xFF, 0x11, 0x00, 0xAF, 0xFF,
+ 0xF5, 0xFF, 0x13, 0x00, 0xA3, 0xFF, 0xF3, 0xFF,
+ 0x0A, 0x00, 0x06, 0x00, 0xF0, 0xFF, 0x0A, 0x00,
+ 0x12, 0x00, 0xF0, 0xFF, 0x0A, 0x00, 0x1F, 0x00,
+ 0xF0, 0xFF, 0x0A, 0x00, 0x2B, 0x00, 0xF0, 0xFF,
+ 0x0D, 0x00, 0x38, 0x00, 0xEA, 0xFF, 0x0F, 0x00,
+ 0x44, 0x00, 0xE5, 0xFF, 0x11, 0x00, 0x51, 0x00,
+ 0xDF, 0xFF, 0x13, 0x00, 0x5D, 0x00, 0xD9, 0xFF,
+ 0x0A, 0x00, 0xFA, 0xFF, 0xF0, 0xFF, 0x0A, 0x00,
+ 0xEE, 0xFF, 0xF0, 0xFF, 0x0A, 0x00, 0xE1, 0xFF,
+ 0xF0, 0xFF, 0x0A, 0x00, 0xD5, 0xFF, 0xF0, 0xFF,
+ 0x0D, 0x00, 0xC8, 0xFF, 0xEA, 0xFF, 0x0F, 0x00,
+ 0xBC, 0xFF, 0xE5, 0xFF, 0x11, 0x00, 0xAF, 0xFF,
+ 0xDF, 0xFF, 0x13, 0x00, 0xA3, 0xFF, 0xD9, 0xFF,
+ 0x0A, 0x00, 0x06, 0x00, 0xE5, 0xFF, 0x0A, 0x00,
+ 0x12, 0x00, 0xE5, 0xFF, 0x0A, 0x00, 0x1F, 0x00,
+ 0xE5, 0xFF, 0x0A, 0x00, 0x2B, 0x00, 0xE5, 0xFF,
+ 0x0D, 0x00, 0x38, 0x00, 0xDB, 0xFF, 0x0F, 0x00,
+ 0x44, 0x00, 0xD3, 0xFF, 0x11, 0x00, 0x51, 0x00,
+ 0xC9, 0xFF, 0x13, 0x00, 0x5D, 0x00, 0xBE, 0xFF,
+ 0x0A, 0x00, 0xFA, 0xFF, 0xE5, 0xFF, 0x0A, 0x00,
+ 0xEE, 0xFF, 0xE5, 0xFF, 0x0A, 0x00, 0xE1, 0xFF,
+ 0xE5, 0xFF, 0x0A, 0x00, 0xD5, 0xFF, 0xE5, 0xFF,
+ 0x0D, 0x00, 0xC8, 0xFF, 0xDB, 0xFF, 0x0F, 0x00,
+ 0xBC, 0xFF, 0xD3, 0xFF, 0x11, 0x00, 0xAF, 0xFF,
+ 0xC9, 0xFF, 0x13, 0x00, 0xA3, 0xFF, 0xBE, 0xFF,
+ 0x0A, 0x00, 0x06, 0x00, 0xDA, 0xFF, 0x0A, 0x00,
+ 0x12, 0x00, 0xDA, 0xFF, 0x0A, 0x00, 0x1F, 0x00,
+ 0xDA, 0xFF, 0x0A, 0x00, 0x2B, 0x00, 0xDA, 0xFF,
+ 0x0D, 0x00, 0x38, 0x00, 0xCC, 0xFF, 0x0F, 0x00,
+ 0x44, 0x00, 0xC1, 0xFF, 0x11, 0x00, 0x51, 0x00,
+ 0xB3, 0xFF, 0x13, 0x00, 0x5D, 0x00, 0xA4, 0xFF,
+ 0x0A, 0x00, 0xFA, 0xFF, 0xDA, 0xFF, 0x0A, 0x00,
+ 0xEE, 0xFF, 0xDA, 0xFF, 0x0A, 0x00, 0xE1, 0xFF,
+ 0xDA, 0xFF, 0x0A, 0x00, 0xD5, 0xFF, 0xDA, 0xFF,
+ 0x0D, 0x00, 0xC8, 0xFF, 0xCC, 0xFF, 0x0F, 0x00,
+ 0xBC, 0xFF, 0xC1, 0xFF, 0x11, 0x00, 0xAF, 0xFF,
+ 0xB3, 0xFF, 0x13, 0x00, 0xA3, 0xFF, 0xA4, 0xFF,
+ 0x0D, 0x00, 0x06, 0x00, 0xCE, 0xFF, 0x0D, 0x00,
+ 0x12, 0x00, 0xCE, 0xFF, 0x0D, 0x00, 0x1F, 0x00,
+ 0xCE, 0xFF, 0x0D, 0x00, 0x2B, 0x00, 0xCE, 0xFF,
+ 0x10, 0x00, 0x38, 0x00, 0xBD, 0xFF, 0x12, 0x00,
+ 0x44, 0x00, 0xAE, 0xFF, 0x14, 0x00, 0x51, 0x00,
+ 0x9D, 0xFF, 0x16, 0x00, 0x5D, 0x00, 0x88, 0xFF,
+ 0x0D, 0x00, 0xFA, 0xFF, 0xCE, 0xFF, 0x0D, 0x00,
+ 0xEE, 0xFF, 0xCE, 0xFF, 0x0D, 0x00, 0xE1, 0xFF,
+ 0xCE, 0xFF, 0x0D, 0x00, 0xD5, 0xFF, 0xCE, 0xFF,
+ 0x10, 0x00, 0xC8, 0xFF, 0xBD, 0xFF, 0x12, 0x00,
+ 0xBC, 0xFF, 0xAE, 0xFF, 0x14, 0x00, 0xAF, 0xFF,
+ 0x9D, 0xFF, 0x16, 0x00, 0xA3, 0xFF, 0x88, 0xFF,
+ 0x0F, 0x00, 0x06, 0x00, 0xC3, 0xFF, 0x0F, 0x00,
+ 0x12, 0x00, 0xC3, 0xFF, 0x0F, 0x00, 0x1F, 0x00,
+ 0xC3, 0xFF, 0x0F, 0x00, 0x2B, 0x00, 0xC3, 0xFF,
+ 0x12, 0x00, 0x38, 0x00, 0xAE, 0xFF, 0x14, 0x00,
+ 0x44, 0x00, 0x9C, 0xFF, 0x16, 0x00, 0x51, 0x00,
+ 0x87, 0xFF, 0x18, 0x00, 0x5D, 0x00, 0x6E, 0xFF,
+ 0x0F, 0x00, 0xFA, 0xFF, 0xC3, 0xFF, 0x0F, 0x00,
+ 0xEE, 0xFF, 0xC3, 0xFF, 0x0F, 0x00, 0xE1, 0xFF,
+ 0xC3, 0xFF, 0x0F, 0x00, 0xD5, 0xFF, 0xC3, 0xFF,
+ 0x12, 0x00, 0xC8, 0xFF, 0xAE, 0xFF, 0x14, 0x00,
+ 0xBC, 0xFF, 0x9C, 0xFF, 0x16, 0x00, 0xAF, 0xFF,
+ 0x87, 0xFF, 0x18, 0x00, 0xA3, 0xFF, 0x6E, 0xFF,
+ 0x11, 0x00, 0x06, 0x00, 0xB8, 0xFF, 0x11, 0x00,
+ 0x12, 0x00, 0xB8, 0xFF, 0x11, 0x00, 0x1F, 0x00,
+ 0xB8, 0xFF, 0x11, 0x00, 0x2B, 0x00, 0xB8, 0xFF,
+ 0x14, 0x00, 0x38, 0x00, 0x9F, 0xFF, 0x16, 0x00,
+ 0x44, 0x00, 0x8A, 0xFF, 0x18, 0x00, 0x51, 0x00,
+ 0x71, 0xFF, 0x1A, 0x00, 0x5D, 0x00, 0x53, 0xFF,
+ 0x11, 0x00, 0xFA, 0xFF, 0xB8, 0xFF, 0x11, 0x00,
+ 0xEE, 0xFF, 0xB8, 0xFF, 0x11, 0x00, 0xE1, 0xFF,
+ 0xB8, 0xFF, 0x11, 0x00, 0xD5, 0xFF, 0xB8, 0xFF,
+ 0x14, 0x00, 0xC8, 0xFF, 0x9F, 0xFF, 0x16, 0x00,
+ 0xBC, 0xFF, 0x8A, 0xFF, 0x18, 0x00, 0xAF, 0xFF,
+ 0x71, 0xFF, 0x1A, 0x00, 0xA3, 0xFF, 0x53, 0xFF,
+ 0x13, 0x00, 0x06, 0x00, 0xAD, 0xFF, 0x13, 0x00,
+ 0x12, 0x00, 0xAD, 0xFF, 0x13, 0x00, 0x1F, 0x00,
+ 0xAD, 0xFF, 0x13, 0x00, 0x2B, 0x00, 0xAD, 0xFF,
+ 0x16, 0x00, 0x38, 0x00, 0x90, 0xFF, 0x18, 0x00,
+ 0x44, 0x00, 0x78, 0xFF, 0x1A, 0x00, 0x51, 0x00,
+ 0x5B, 0xFF, 0x1C, 0x00, 0x5D, 0x00, 0x39, 0xFF,
+ 0x13, 0x00, 0xFA, 0xFF, 0xAD, 0xFF, 0x13, 0x00,
+ 0xEE, 0xFF, 0xAD, 0xFF, 0x13, 0x00, 0xE1, 0xFF,
+ 0xAD, 0xFF, 0x13, 0x00, 0xD5, 0xFF, 0xAD, 0xFF,
+ 0x16, 0x00, 0xC8, 0xFF, 0x90, 0xFF, 0x18, 0x00,
+ 0xBC, 0xFF, 0x78, 0xFF, 0x1A, 0x00, 0xAF, 0xFF,
+ 0x5B, 0xFF, 0x1C, 0x00, 0xA3, 0xFF, 0x39, 0xFF,
+ 0x0B, 0x00, 0x06, 0x00, 0x06, 0x00, 0x0B, 0x00,
+ 0x13, 0x00, 0x06, 0x00, 0x0B, 0x00, 0x21, 0x00,
+ 0x06, 0x00, 0x0B, 0x00, 0x2E, 0x00, 0x06, 0x00,
+ 0x0E, 0x00, 0x3D, 0x00, 0x08, 0x00, 0x10, 0x00,
+ 0x4A, 0x00, 0x0A, 0x00, 0x12, 0x00, 0x58, 0x00,
+ 0x0C, 0x00, 0x14, 0x00, 0x65, 0x00, 0x0E, 0x00,
+ 0x0B, 0x00, 0xFA, 0xFF, 0x06, 0x00, 0x0B, 0x00,
+ 0xED, 0xFF, 0x06, 0x00, 0x0B, 0x00, 0xDF, 0xFF,
+ 0x06, 0x00, 0x0B, 0x00, 0xD2, 0xFF, 0x06, 0x00,
+ 0x0E, 0x00, 0xC3, 0xFF, 0x08, 0x00, 0x10, 0x00,
+ 0xB6, 0xFF, 0x0A, 0x00, 0x12, 0x00, 0xA8, 0xFF,
+ 0x0C, 0x00, 0x14, 0x00, 0x9B, 0xFF, 0x0E, 0x00,
+ 0x0B, 0x00, 0x06, 0x00, 0x12, 0x00, 0x0B, 0x00,
+ 0x13, 0x00, 0x12, 0x00, 0x0B, 0x00, 0x21, 0x00,
+ 0x12, 0x00, 0x0B, 0x00, 0x2E, 0x00, 0x12, 0x00,
+ 0x0E, 0x00, 0x3D, 0x00, 0x18, 0x00, 0x10, 0x00,
+ 0x4A, 0x00, 0x1E, 0x00, 0x12, 0x00, 0x58, 0x00,
+ 0x24, 0x00, 0x14, 0x00, 0x65, 0x00, 0x2B, 0x00,
+ 0x0B, 0x00, 0xFA, 0xFF, 0x12, 0x00, 0x0B, 0x00,
+ 0xED, 0xFF, 0x12, 0x00, 0x0B, 0x00, 0xDF, 0xFF,
+ 0x12, 0x00, 0x0B, 0x00, 0xD2, 0xFF, 0x12, 0x00,
+ 0x0E, 0x00, 0xC3, 0xFF, 0x18, 0x00, 0x10, 0x00,
+ 0xB6, 0xFF, 0x1E, 0x00, 0x12, 0x00, 0xA8, 0xFF,
+ 0x24, 0x00, 0x14, 0x00, 0x9B, 0xFF, 0x2B, 0x00,
+ 0x0B, 0x00, 0x06, 0x00, 0x1F, 0x00, 0x0B, 0x00,
+ 0x13, 0x00, 0x1F, 0x00, 0x0B, 0x00, 0x21, 0x00,
+ 0x1F, 0x00, 0x0B, 0x00, 0x2E, 0x00, 0x1F, 0x00,
+ 0x0E, 0x00, 0x3D, 0x00, 0x29, 0x00, 0x10, 0x00,
+ 0x4A, 0x00, 0x32, 0x00, 0x12, 0x00, 0x58, 0x00,
+ 0x3C, 0x00, 0x14, 0x00, 0x65, 0x00, 0x49, 0x00,
+ 0x0B, 0x00, 0xFA, 0xFF, 0x1F, 0x00, 0x0B, 0x00,
+ 0xED, 0xFF, 0x1F, 0x00, 0x0B, 0x00, 0xDF, 0xFF,
+ 0x1F, 0x00, 0x0B, 0x00, 0xD2, 0xFF, 0x1F, 0x00,
+ 0x0E, 0x00, 0xC3, 0xFF, 0x29, 0x00, 0x10, 0x00,
+ 0xB6, 0xFF, 0x32, 0x00, 0x12, 0x00, 0xA8, 0xFF,
+ 0x3C, 0x00, 0x14, 0x00, 0x9B, 0xFF, 0x49, 0x00,
+ 0x0B, 0x00, 0x06, 0x00, 0x2B, 0x00, 0x0B, 0x00,
+ 0x13, 0x00, 0x2B, 0x00, 0x0B, 0x00, 0x21, 0x00,
+ 0x2B, 0x00, 0x0B, 0x00, 0x2E, 0x00, 0x2B, 0x00,
+ 0x0E, 0x00, 0x3D, 0x00, 0x39, 0x00, 0x10, 0x00,
+ 0x4A, 0x00, 0x46, 0x00, 0x12, 0x00, 0x58, 0x00,
+ 0x54, 0x00, 0x14, 0x00, 0x65, 0x00, 0x66, 0x00,
+ 0x0B, 0x00, 0xFA, 0xFF, 0x2B, 0x00, 0x0B, 0x00,
+ 0xED, 0xFF, 0x2B, 0x00, 0x0B, 0x00, 0xDF, 0xFF,
+ 0x2B, 0x00, 0x0B, 0x00, 0xD2, 0xFF, 0x2B, 0x00,
+ 0x0E, 0x00, 0xC3, 0xFF, 0x39, 0x00, 0x10, 0x00,
+ 0xB6, 0xFF, 0x46, 0x00, 0x12, 0x00, 0xA8, 0xFF,
+ 0x54, 0x00, 0x14, 0x00, 0x9B, 0xFF, 0x66, 0x00,
+ 0x0E, 0x00, 0x06, 0x00, 0x38, 0x00, 0x0E, 0x00,
+ 0x13, 0x00, 0x38, 0x00, 0x0E, 0x00, 0x21, 0x00,
+ 0x38, 0x00, 0x0E, 0x00, 0x2E, 0x00, 0x38, 0x00,
+ 0x11, 0x00, 0x3D, 0x00, 0x4A, 0x00, 0x13, 0x00,
+ 0x4A, 0x00, 0x5A, 0x00, 0x15, 0x00, 0x58, 0x00,
+ 0x6D, 0x00, 0x17, 0x00, 0x65, 0x00, 0x84, 0x00,
+ 0x0E, 0x00, 0xFA, 0xFF, 0x38, 0x00, 0x0E, 0x00,
+ 0xED, 0xFF, 0x38, 0x00, 0x0E, 0x00, 0xDF, 0xFF,
+ 0x38, 0x00, 0x0E, 0x00, 0xD2, 0xFF, 0x38, 0x00,
+ 0x11, 0x00, 0xC3, 0xFF, 0x4A, 0x00, 0x13, 0x00,
+ 0xB6, 0xFF, 0x5A, 0x00, 0x15, 0x00, 0xA8, 0xFF,
+ 0x6D, 0x00, 0x17, 0x00, 0x9B, 0xFF, 0x84, 0x00,
+ 0x10, 0x00, 0x06, 0x00, 0x44, 0x00, 0x10, 0x00,
+ 0x13, 0x00, 0x44, 0x00, 0x10, 0x00, 0x21, 0x00,
+ 0x44, 0x00, 0x10, 0x00, 0x2E, 0x00, 0x44, 0x00,
+ 0x13, 0x00, 0x3D, 0x00, 0x5A, 0x00, 0x15, 0x00,
+ 0x4A, 0x00, 0x6E, 0x00, 0x17, 0x00, 0x58, 0x00,
+ 0x85, 0x00, 0x19, 0x00, 0x65, 0x00, 0xA1, 0x00,
+ 0x10, 0x00, 0xFA, 0xFF, 0x44, 0x00, 0x10, 0x00,
+ 0xED, 0xFF, 0x44, 0x00, 0x10, 0x00, 0xDF, 0xFF,
+ 0x44, 0x00, 0x10, 0x00, 0xD2, 0xFF, 0x44, 0x00,
+ 0x13, 0x00, 0xC3, 0xFF, 0x5A, 0x00, 0x15, 0x00,
+ 0xB6, 0xFF, 0x6E, 0x00, 0x17, 0x00, 0xA8, 0xFF,
+ 0x85, 0x00, 0x19, 0x00, 0x9B, 0xFF, 0xA1, 0x00,
+ 0x12, 0x00, 0x06, 0x00, 0x51, 0x00, 0x12, 0x00,
+ 0x13, 0x00, 0x51, 0x00, 0x12, 0x00, 0x21, 0x00,
+ 0x51, 0x00, 0x12, 0x00, 0x2E, 0x00, 0x51, 0x00,
+ 0x15, 0x00, 0x3D, 0x00, 0x6B, 0x00, 0x17, 0x00,
+ 0x4A, 0x00, 0x82, 0x00, 0x19, 0x00, 0x58, 0x00,
+ 0x9D, 0x00, 0x1B, 0x00, 0x65, 0x00, 0xBF, 0x00,
+ 0x12, 0x00, 0xFA, 0xFF, 0x51, 0x00, 0x12, 0x00,
+ 0xED, 0xFF, 0x51, 0x00, 0x12, 0x00, 0xDF, 0xFF,
+ 0x51, 0x00, 0x12, 0x00, 0xD2, 0xFF, 0x51, 0x00,
+ 0x15, 0x00, 0xC3, 0xFF, 0x6B, 0x00, 0x17, 0x00,
+ 0xB6, 0xFF, 0x82, 0x00, 0x19, 0x00, 0xA8, 0xFF,
+ 0x9D, 0x00, 0x1B, 0x00, 0x9B, 0xFF, 0xBF, 0x00,
+ 0x14, 0x00, 0x06, 0x00, 0x5D, 0x00, 0x14, 0x00,
+ 0x13, 0x00, 0x5D, 0x00, 0x14, 0x00, 0x21, 0x00,
+ 0x5D, 0x00, 0x14, 0x00, 0x2E, 0x00, 0x5D, 0x00,
+ 0x17, 0x00, 0x3D, 0x00, 0x7B, 0x00, 0x19, 0x00,
+ 0x4A, 0x00, 0x96, 0x00, 0x1B, 0x00, 0x58, 0x00,
+ 0xB5, 0x00, 0x1D, 0x00, 0x65, 0x00, 0xDC, 0x00,
+ 0x14, 0x00, 0xFA, 0xFF, 0x5D, 0x00, 0x14, 0x00,
+ 0xED, 0xFF, 0x5D, 0x00, 0x14, 0x00, 0xDF, 0xFF,
+ 0x5D, 0x00, 0x14, 0x00, 0xD2, 0xFF, 0x5D, 0x00,
+ 0x17, 0x00, 0xC3, 0xFF, 0x7B, 0x00, 0x19, 0x00,
+ 0xB6, 0xFF, 0x96, 0x00, 0x1B, 0x00, 0xA8, 0xFF,
+ 0xB5, 0x00, 0x1D, 0x00, 0x9B, 0xFF, 0xDC, 0x00,
+ 0x0B, 0x00, 0x06, 0x00, 0xFA, 0xFF, 0x0B, 0x00,
+ 0x13, 0x00, 0xFA, 0xFF, 0x0B, 0x00, 0x21, 0x00,
+ 0xFA, 0xFF, 0x0B, 0x00, 0x2E, 0x00, 0xFA, 0xFF,
+ 0x0E, 0x00, 0x3D, 0x00, 0xF8, 0xFF, 0x10, 0x00,
+ 0x4A, 0x00, 0xF6, 0xFF, 0x12, 0x00, 0x58, 0x00,
+ 0xF4, 0xFF, 0x14, 0x00, 0x65, 0x00, 0xF2, 0xFF,
+ 0x0B, 0x00, 0xFA, 0xFF, 0xFA, 0xFF, 0x0B, 0x00,
+ 0xED, 0xFF, 0xFA, 0xFF, 0x0B, 0x00, 0xDF, 0xFF,
+ 0xFA, 0xFF, 0x0B, 0x00, 0xD2, 0xFF, 0xFA, 0xFF,
+ 0x0E, 0x00, 0xC3, 0xFF, 0xF8, 0xFF, 0x10, 0x00,
+ 0xB6, 0xFF, 0xF6, 0xFF, 0x12, 0x00, 0xA8, 0xFF,
+ 0xF4, 0xFF, 0x14, 0x00, 0x9B, 0xFF, 0xF2, 0xFF,
+ 0x0B, 0x00, 0x06, 0x00, 0xEE, 0xFF, 0x0B, 0x00,
+ 0x13, 0x00, 0xEE, 0xFF, 0x0B, 0x00, 0x21, 0x00,
+ 0xEE, 0xFF, 0x0B, 0x00, 0x2E, 0x00, 0xEE, 0xFF,
+ 0x0E, 0x00, 0x3D, 0x00, 0xE8, 0xFF, 0x10, 0x00,
+ 0x4A, 0x00, 0xE2, 0xFF, 0x12, 0x00, 0x58, 0x00,
+ 0xDC, 0xFF, 0x14, 0x00, 0x65, 0x00, 0xD5, 0xFF,
+ 0x0B, 0x00, 0xFA, 0xFF, 0xEE, 0xFF, 0x0B, 0x00,
+ 0xED, 0xFF, 0xEE, 0xFF, 0x0B, 0x00, 0xDF, 0xFF,
+ 0xEE, 0xFF, 0x0B, 0x00, 0xD2, 0xFF, 0xEE, 0xFF,
+ 0x0E, 0x00, 0xC3, 0xFF, 0xE8, 0xFF, 0x10, 0x00,
+ 0xB6, 0xFF, 0xE2, 0xFF, 0x12, 0x00, 0xA8, 0xFF,
+ 0xDC, 0xFF, 0x14, 0x00, 0x9B, 0xFF, 0xD5, 0xFF,
+ 0x0B, 0x00, 0x06, 0x00, 0xE1, 0xFF, 0x0B, 0x00,
+ 0x13, 0x00, 0xE1, 0xFF, 0x0B, 0x00, 0x21, 0x00,
+ 0xE1, 0xFF, 0x0B, 0x00, 0x2E, 0x00, 0xE1, 0xFF,
+ 0x0E, 0x00, 0x3D, 0x00, 0xD7, 0xFF, 0x10, 0x00,
+ 0x4A, 0x00, 0xCE, 0xFF, 0x12, 0x00, 0x58, 0x00,
+ 0xC4, 0xFF, 0x14, 0x00, 0x65, 0x00, 0xB7, 0xFF,
+ 0x0B, 0x00, 0xFA, 0xFF, 0xE1, 0xFF, 0x0B, 0x00,
+ 0xED, 0xFF, 0xE1, 0xFF, 0x0B, 0x00, 0xDF, 0xFF,
+ 0xE1, 0xFF, 0x0B, 0x00, 0xD2, 0xFF, 0xE1, 0xFF,
+ 0x0E, 0x00, 0xC3, 0xFF, 0xD7, 0xFF, 0x10, 0x00,
+ 0xB6, 0xFF, 0xCE, 0xFF, 0x12, 0x00, 0xA8, 0xFF,
+ 0xC4, 0xFF, 0x14, 0x00, 0x9B, 0xFF, 0xB7, 0xFF,
+ 0x0B, 0x00, 0x06, 0x00, 0xD5, 0xFF, 0x0B, 0x00,
+ 0x13, 0x00, 0xD5, 0xFF, 0x0B, 0x00, 0x21, 0x00,
+ 0xD5, 0xFF, 0x0B, 0x00, 0x2E, 0x00, 0xD5, 0xFF,
+ 0x0E, 0x00, 0x3D, 0x00, 0xC7, 0xFF, 0x10, 0x00,
+ 0x4A, 0x00, 0xBA, 0xFF, 0x12, 0x00, 0x58, 0x00,
+ 0xAC, 0xFF, 0x14, 0x00, 0x65, 0x00, 0x9A, 0xFF,
+ 0x0B, 0x00, 0xFA, 0xFF, 0xD5, 0xFF, 0x0B, 0x00,
+ 0xED, 0xFF, 0xD5, 0xFF, 0x0B, 0x00, 0xDF, 0xFF,
+ 0xD5, 0xFF, 0x0B, 0x00, 0xD2, 0xFF, 0xD5, 0xFF,
+ 0x0E, 0x00, 0xC3, 0xFF, 0xC7, 0xFF, 0x10, 0x00,
+ 0xB6, 0xFF, 0xBA, 0xFF, 0x12, 0x00, 0xA8, 0xFF,
+ 0xAC, 0xFF, 0x14, 0x00, 0x9B, 0xFF, 0x9A, 0xFF,
+ 0x0E, 0x00, 0x06, 0x00, 0xC8, 0xFF, 0x0E, 0x00,
+ 0x13, 0x00, 0xC8, 0xFF, 0x0E, 0x00, 0x21, 0x00,
+ 0xC8, 0xFF, 0x0E, 0x00, 0x2E, 0x00, 0xC8, 0xFF,
+ 0x11, 0x00, 0x3D, 0x00, 0xB6, 0xFF, 0x13, 0x00,
+ 0x4A, 0x00, 0xA6, 0xFF, 0x15, 0x00, 0x58, 0x00,
+ 0x93, 0xFF, 0x17, 0x00, 0x65, 0x00, 0x7C, 0xFF,
+ 0x0E, 0x00, 0xFA, 0xFF, 0xC8, 0xFF, 0x0E, 0x00,
+ 0xED, 0xFF, 0xC8, 0xFF, 0x0E, 0x00, 0xDF, 0xFF,
+ 0xC8, 0xFF, 0x0E, 0x00, 0xD2, 0xFF, 0xC8, 0xFF,
+ 0x11, 0x00, 0xC3, 0xFF, 0xB6, 0xFF, 0x13, 0x00,
+ 0xB6, 0xFF, 0xA6, 0xFF, 0x15, 0x00, 0xA8, 0xFF,
+ 0x93, 0xFF, 0x17, 0x00, 0x9B, 0xFF, 0x7C, 0xFF,
+ 0x10, 0x00, 0x06, 0x00, 0xBC, 0xFF, 0x10, 0x00,
+ 0x13, 0x00, 0xBC, 0xFF, 0x10, 0x00, 0x21, 0x00,
+ 0xBC, 0xFF, 0x10, 0x00, 0x2E, 0x00, 0xBC, 0xFF,
+ 0x13, 0x00, 0x3D, 0x00, 0xA6, 0xFF, 0x15, 0x00,
+ 0x4A, 0x00, 0x92, 0xFF, 0x17, 0x00, 0x58, 0x00,
+ 0x7B, 0xFF, 0x19, 0x00, 0x65, 0x00, 0x5F, 0xFF,
+ 0x10, 0x00, 0xFA, 0xFF, 0xBC, 0xFF, 0x10, 0x00,
+ 0xED, 0xFF, 0xBC, 0xFF, 0x10, 0x00, 0xDF, 0xFF,
+ 0xBC, 0xFF, 0x10, 0x00, 0xD2, 0xFF, 0xBC, 0xFF,
+ 0x13, 0x00, 0xC3, 0xFF, 0xA6, 0xFF, 0x15, 0x00,
+ 0xB6, 0xFF, 0x92, 0xFF, 0x17, 0x00, 0xA8, 0xFF,
+ 0x7B, 0xFF, 0x19, 0x00, 0x9B, 0xFF, 0x5F, 0xFF,
+ 0x12, 0x00, 0x06, 0x00, 0xAF, 0xFF, 0x12, 0x00,
+ 0x13, 0x00, 0xAF, 0xFF, 0x12, 0x00, 0x21, 0x00,
+ 0xAF, 0xFF, 0x12, 0x00, 0x2E, 0x00, 0xAF, 0xFF,
+ 0x15, 0x00, 0x3D, 0x00, 0x95, 0xFF, 0x17, 0x00,
+ 0x4A, 0x00, 0x7E, 0xFF, 0x19, 0x00, 0x58, 0x00,
+ 0x63, 0xFF, 0x1B, 0x00, 0x65, 0x00, 0x41, 0xFF,
+ 0x12, 0x00, 0xFA, 0xFF, 0xAF, 0xFF, 0x12, 0x00,
+ 0xED, 0xFF, 0xAF, 0xFF, 0x12, 0x00, 0xDF, 0xFF,
+ 0xAF, 0xFF, 0x12, 0x00, 0xD2, 0xFF, 0xAF, 0xFF,
+ 0x15, 0x00, 0xC3, 0xFF, 0x95, 0xFF, 0x17, 0x00,
+ 0xB6, 0xFF, 0x7E, 0xFF, 0x19, 0x00, 0xA8, 0xFF,
+ 0x63, 0xFF, 0x1B, 0x00, 0x9B, 0xFF, 0x41, 0xFF,
+ 0x14, 0x00, 0x06, 0x00, 0xA3, 0xFF, 0x14, 0x00,
+ 0x13, 0x00, 0xA3, 0xFF, 0x14, 0x00, 0x21, 0x00,
+ 0xA3, 0xFF, 0x14, 0x00, 0x2E, 0x00, 0xA3, 0xFF,
+ 0x17, 0x00, 0x3D, 0x00, 0x85, 0xFF, 0x19, 0x00,
+ 0x4A, 0x00, 0x6A, 0xFF, 0x1B, 0x00, 0x58, 0x00,
+ 0x4B, 0xFF, 0x1D, 0x00, 0x65, 0x00, 0x24, 0xFF,
+ 0x14, 0x00, 0xFA, 0xFF, 0xA3, 0xFF, 0x14, 0x00,
+ 0xED, 0xFF, 0xA3, 0xFF, 0x14, 0x00, 0xDF, 0xFF,
+ 0xA3, 0xFF, 0x14, 0x00, 0xD2, 0xFF, 0xA3, 0xFF,
+ 0x17, 0x00, 0xC3, 0xFF, 0x85, 0xFF, 0x19, 0x00,
+ 0xB6, 0xFF, 0x6A, 0xFF, 0x1B, 0x00, 0xA8, 0xFF,
+ 0x4B, 0xFF, 0x1D, 0x00, 0x9B, 0xFF, 0x24, 0xFF,
+ 0x0C, 0x00, 0x07, 0x00, 0x06, 0x00, 0x0C, 0x00,
+ 0x16, 0x00, 0x06, 0x00, 0x0C, 0x00, 0x25, 0x00,
+ 0x06, 0x00, 0x0C, 0x00, 0x34, 0x00, 0x06, 0x00,
+ 0x0F, 0x00, 0x43, 0x00, 0x09, 0x00, 0x11, 0x00,
+ 0x52, 0x00, 0x0B, 0x00, 0x13, 0x00, 0x61, 0x00,
+ 0x0D, 0x00, 0x15, 0x00, 0x70, 0x00, 0x10, 0x00,
+ 0x0C, 0x00, 0xF9, 0xFF, 0x06, 0x00, 0x0C, 0x00,
+ 0xEA, 0xFF, 0x06, 0x00, 0x0C, 0x00, 0xDB, 0xFF,
+ 0x06, 0x00, 0x0C, 0x00, 0xCC, 0xFF, 0x06, 0x00,
+ 0x0F, 0x00, 0xBD, 0xFF, 0x09, 0x00, 0x11, 0x00,
+ 0xAE, 0xFF, 0x0B, 0x00, 0x13, 0x00, 0x9F, 0xFF,
+ 0x0D, 0x00, 0x15, 0x00, 0x90, 0xFF, 0x10, 0x00,
+ 0x0C, 0x00, 0x07, 0x00, 0x13, 0x00, 0x0C, 0x00,
+ 0x16, 0x00, 0x13, 0x00, 0x0C, 0x00, 0x25, 0x00,
+ 0x13, 0x00, 0x0C, 0x00, 0x34, 0x00, 0x13, 0x00,
+ 0x0F, 0x00, 0x43, 0x00, 0x1B, 0x00, 0x11, 0x00,
+ 0x52, 0x00, 0x21, 0x00, 0x13, 0x00, 0x61, 0x00,
+ 0x27, 0x00, 0x15, 0x00, 0x70, 0x00, 0x30, 0x00,
+ 0x0C, 0x00, 0xF9, 0xFF, 0x13, 0x00, 0x0C, 0x00,
+ 0xEA, 0xFF, 0x13, 0x00, 0x0C, 0x00, 0xDB, 0xFF,
+ 0x13, 0x00, 0x0C, 0x00, 0xCC, 0xFF, 0x13, 0x00,
+ 0x0F, 0x00, 0xBD, 0xFF, 0x1B, 0x00, 0x11, 0x00,
+ 0xAE, 0xFF, 0x21, 0x00, 0x13, 0x00, 0x9F, 0xFF,
+ 0x27, 0x00, 0x15, 0x00, 0x90, 0xFF, 0x30, 0x00,
+ 0x0C, 0x00, 0x07, 0x00, 0x21, 0x00, 0x0C, 0x00,
+ 0x16, 0x00, 0x21, 0x00, 0x0C, 0x00, 0x25, 0x00,
+ 0x21, 0x00, 0x0C, 0x00, 0x34, 0x00, 0x21, 0x00,
+ 0x0F, 0x00, 0x43, 0x00, 0x2D, 0x00, 0x11, 0x00,
+ 0x52, 0x00, 0x37, 0x00, 0x13, 0x00, 0x61, 0x00,
+ 0x42, 0x00, 0x15, 0x00, 0x70, 0x00, 0x51, 0x00,
+ 0x0C, 0x00, 0xF9, 0xFF, 0x21, 0x00, 0x0C, 0x00,
+ 0xEA, 0xFF, 0x21, 0x00, 0x0C, 0x00, 0xDB, 0xFF,
+ 0x21, 0x00, 0x0C, 0x00, 0xCC, 0xFF, 0x21, 0x00,
+ 0x0F, 0x00, 0xBD, 0xFF, 0x2D, 0x00, 0x11, 0x00,
+ 0xAE, 0xFF, 0x37, 0x00, 0x13, 0x00, 0x9F, 0xFF,
+ 0x42, 0x00, 0x15, 0x00, 0x90, 0xFF, 0x51, 0x00,
+ 0x0C, 0x00, 0x07, 0x00, 0x2E, 0x00, 0x0C, 0x00,
+ 0x16, 0x00, 0x2E, 0x00, 0x0C, 0x00, 0x25, 0x00,
+ 0x2E, 0x00, 0x0C, 0x00, 0x34, 0x00, 0x2E, 0x00,
+ 0x0F, 0x00, 0x43, 0x00, 0x3F, 0x00, 0x11, 0x00,
+ 0x52, 0x00, 0x4D, 0x00, 0x13, 0x00, 0x61, 0x00,
+ 0x5C, 0x00, 0x15, 0x00, 0x70, 0x00, 0x71, 0x00,
+ 0x0C, 0x00, 0xF9, 0xFF, 0x2E, 0x00, 0x0C, 0x00,
+ 0xEA, 0xFF, 0x2E, 0x00, 0x0C, 0x00, 0xDB, 0xFF,
+ 0x2E, 0x00, 0x0C, 0x00, 0xCC, 0xFF, 0x2E, 0x00,
+ 0x0F, 0x00, 0xBD, 0xFF, 0x3F, 0x00, 0x11, 0x00,
+ 0xAE, 0xFF, 0x4D, 0x00, 0x13, 0x00, 0x9F, 0xFF,
+ 0x5C, 0x00, 0x15, 0x00, 0x90, 0xFF, 0x71, 0x00,
+ 0x0F, 0x00, 0x07, 0x00, 0x3D, 0x00, 0x0F, 0x00,
+ 0x16, 0x00, 0x3D, 0x00, 0x0F, 0x00, 0x25, 0x00,
+ 0x3D, 0x00, 0x0F, 0x00, 0x34, 0x00, 0x3D, 0x00,
+ 0x12, 0x00, 0x43, 0x00, 0x52, 0x00, 0x14, 0x00,
+ 0x52, 0x00, 0x63, 0x00, 0x16, 0x00, 0x61, 0x00,
+ 0x78, 0x00, 0x18, 0x00, 0x70, 0x00, 0x92, 0x00,
+ 0x0F, 0x00, 0xF9, 0xFF, 0x3D, 0x00, 0x0F, 0x00,
+ 0xEA, 0xFF, 0x3D, 0x00, 0x0F, 0x00, 0xDB, 0xFF,
+ 0x3D, 0x00, 0x0F, 0x00, 0xCC, 0xFF, 0x3D, 0x00,
+ 0x12, 0x00, 0xBD, 0xFF, 0x52, 0x00, 0x14, 0x00,
+ 0xAE, 0xFF, 0x63, 0x00, 0x16, 0x00, 0x9F, 0xFF,
+ 0x78, 0x00, 0x18, 0x00, 0x90, 0xFF, 0x92, 0x00,
+ 0x11, 0x00, 0x07, 0x00, 0x4A, 0x00, 0x11, 0x00,
+ 0x16, 0x00, 0x4A, 0x00, 0x11, 0x00, 0x25, 0x00,
+ 0x4A, 0x00, 0x11, 0x00, 0x34, 0x00, 0x4A, 0x00,
+ 0x14, 0x00, 0x43, 0x00, 0x64, 0x00, 0x16, 0x00,
+ 0x52, 0x00, 0x79, 0x00, 0x18, 0x00, 0x61, 0x00,
+ 0x92, 0x00, 0x1A, 0x00, 0x70, 0x00, 0xB2, 0x00,
+ 0x11, 0x00, 0xF9, 0xFF, 0x4A, 0x00, 0x11, 0x00,
+ 0xEA, 0xFF, 0x4A, 0x00, 0x11, 0x00, 0xDB, 0xFF,
+ 0x4A, 0x00, 0x11, 0x00, 0xCC, 0xFF, 0x4A, 0x00,
+ 0x14, 0x00, 0xBD, 0xFF, 0x64, 0x00, 0x16, 0x00,
+ 0xAE, 0xFF, 0x79, 0x00, 0x18, 0x00, 0x9F, 0xFF,
+ 0x92, 0x00, 0x1A, 0x00, 0x90, 0xFF, 0xB2, 0x00,
+ 0x13, 0x00, 0x07, 0x00, 0x58, 0x00, 0x13, 0x00,
+ 0x16, 0x00, 0x58, 0x00, 0x13, 0x00, 0x25, 0x00,
+ 0x58, 0x00, 0x13, 0x00, 0x34, 0x00, 0x58, 0x00,
+ 0x16, 0x00, 0x43, 0x00, 0x76, 0x00, 0x18, 0x00,
+ 0x52, 0x00, 0x8F, 0x00, 0x1A, 0x00, 0x61, 0x00,
+ 0xAD, 0x00, 0x1C, 0x00, 0x70, 0x00, 0xD3, 0x00,
+ 0x13, 0x00, 0xF9, 0xFF, 0x58, 0x00, 0x13, 0x00,
+ 0xEA, 0xFF, 0x58, 0x00, 0x13, 0x00, 0xDB, 0xFF,
+ 0x58, 0x00, 0x13, 0x00, 0xCC, 0xFF, 0x58, 0x00,
+ 0x16, 0x00, 0xBD, 0xFF, 0x76, 0x00, 0x18, 0x00,
+ 0xAE, 0xFF, 0x8F, 0x00, 0x1A, 0x00, 0x9F, 0xFF,
+ 0xAD, 0x00, 0x1C, 0x00, 0x90, 0xFF, 0xD3, 0x00,
+ 0x15, 0x00, 0x07, 0x00, 0x65, 0x00, 0x15, 0x00,
+ 0x16, 0x00, 0x65, 0x00, 0x15, 0x00, 0x25, 0x00,
+ 0x65, 0x00, 0x15, 0x00, 0x34, 0x00, 0x65, 0x00,
+ 0x18, 0x00, 0x43, 0x00, 0x88, 0x00, 0x1A, 0x00,
+ 0x52, 0x00, 0xA5, 0x00, 0x1C, 0x00, 0x61, 0x00,
+ 0xC7, 0x00, 0x1E, 0x00, 0x70, 0x00, 0xF3, 0x00,
+ 0x15, 0x00, 0xF9, 0xFF, 0x65, 0x00, 0x15, 0x00,
+ 0xEA, 0xFF, 0x65, 0x00, 0x15, 0x00, 0xDB, 0xFF,
+ 0x65, 0x00, 0x15, 0x00, 0xCC, 0xFF, 0x65, 0x00,
+ 0x18, 0x00, 0xBD, 0xFF, 0x88, 0x00, 0x1A, 0x00,
+ 0xAE, 0xFF, 0xA5, 0x00, 0x1C, 0x00, 0x9F, 0xFF,
+ 0xC7, 0x00, 0x1E, 0x00, 0x90, 0xFF, 0xF3, 0x00,
+ 0x0C, 0x00, 0x07, 0x00, 0xFA, 0xFF, 0x0C, 0x00,
+ 0x16, 0x00, 0xFA, 0xFF, 0x0C, 0x00, 0x25, 0x00,
+ 0xFA, 0xFF, 0x0C, 0x00, 0x34, 0x00, 0xFA, 0xFF,
+ 0x0F, 0x00, 0x43, 0x00, 0xF7, 0xFF, 0x11, 0x00,
+ 0x52, 0x00, 0xF5, 0xFF, 0x13, 0x00, 0x61, 0x00,
+ 0xF3, 0xFF, 0x15, 0x00, 0x70, 0x00, 0xF0, 0xFF,
+ 0x0C, 0x00, 0xF9, 0xFF, 0xFA, 0xFF, 0x0C, 0x00,
+ 0xEA, 0xFF, 0xFA, 0xFF, 0x0C, 0x00, 0xDB, 0xFF,
+ 0xFA, 0xFF, 0x0C, 0x00, 0xCC, 0xFF, 0xFA, 0xFF,
+ 0x0F, 0x00, 0xBD, 0xFF, 0xF7, 0xFF, 0x11, 0x00,
+ 0xAE, 0xFF, 0xF5, 0xFF, 0x13, 0x00, 0x9F, 0xFF,
+ 0xF3, 0xFF, 0x15, 0x00, 0x90, 0xFF, 0xF0, 0xFF,
+ 0x0C, 0x00, 0x07, 0x00, 0xED, 0xFF, 0x0C, 0x00,
+ 0x16, 0x00, 0xED, 0xFF, 0x0C, 0x00, 0x25, 0x00,
+ 0xED, 0xFF, 0x0C, 0x00, 0x34, 0x00, 0xED, 0xFF,
+ 0x0F, 0x00, 0x43, 0x00, 0xE5, 0xFF, 0x11, 0x00,
+ 0x52, 0x00, 0xDF, 0xFF, 0x13, 0x00, 0x61, 0x00,
+ 0xD9, 0xFF, 0x15, 0x00, 0x70, 0x00, 0xD0, 0xFF,
+ 0x0C, 0x00, 0xF9, 0xFF, 0xED, 0xFF, 0x0C, 0x00,
+ 0xEA, 0xFF, 0xED, 0xFF, 0x0C, 0x00, 0xDB, 0xFF,
+ 0xED, 0xFF, 0x0C, 0x00, 0xCC, 0xFF, 0xED, 0xFF,
+ 0x0F, 0x00, 0xBD, 0xFF, 0xE5, 0xFF, 0x11, 0x00,
+ 0xAE, 0xFF, 0xDF, 0xFF, 0x13, 0x00, 0x9F, 0xFF,
+ 0xD9, 0xFF, 0x15, 0x00, 0x90, 0xFF, 0xD0, 0xFF,
+ 0x0C, 0x00, 0x07, 0x00, 0xDF, 0xFF, 0x0C, 0x00,
+ 0x16, 0x00, 0xDF, 0xFF, 0x0C, 0x00, 0x25, 0x00,
+ 0xDF, 0xFF, 0x0C, 0x00, 0x34, 0x00, 0xDF, 0xFF,
+ 0x0F, 0x00, 0x43, 0x00, 0xD3, 0xFF, 0x11, 0x00,
+ 0x52, 0x00, 0xC9, 0xFF, 0x13, 0x00, 0x61, 0x00,
+ 0xBE, 0xFF, 0x15, 0x00, 0x70, 0x00, 0xAF, 0xFF,
+ 0x0C, 0x00, 0xF9, 0xFF, 0xDF, 0xFF, 0x0C, 0x00,
+ 0xEA, 0xFF, 0xDF, 0xFF, 0x0C, 0x00, 0xDB, 0xFF,
+ 0xDF, 0xFF, 0x0C, 0x00, 0xCC, 0xFF, 0xDF, 0xFF,
+ 0x0F, 0x00, 0xBD, 0xFF, 0xD3, 0xFF, 0x11, 0x00,
+ 0xAE, 0xFF, 0xC9, 0xFF, 0x13, 0x00, 0x9F, 0xFF,
+ 0xBE, 0xFF, 0x15, 0x00, 0x90, 0xFF, 0xAF, 0xFF,
+ 0x0C, 0x00, 0x07, 0x00, 0xD2, 0xFF, 0x0C, 0x00,
+ 0x16, 0x00, 0xD2, 0xFF, 0x0C, 0x00, 0x25, 0x00,
+ 0xD2, 0xFF, 0x0C, 0x00, 0x34, 0x00, 0xD2, 0xFF,
+ 0x0F, 0x00, 0x43, 0x00, 0xC1, 0xFF, 0x11, 0x00,
+ 0x52, 0x00, 0xB3, 0xFF, 0x13, 0x00, 0x61, 0x00,
+ 0xA4, 0xFF, 0x15, 0x00, 0x70, 0x00, 0x8F, 0xFF,
+ 0x0C, 0x00, 0xF9, 0xFF, 0xD2, 0xFF, 0x0C, 0x00,
+ 0xEA, 0xFF, 0xD2, 0xFF, 0x0C, 0x00, 0xDB, 0xFF,
+ 0xD2, 0xFF, 0x0C, 0x00, 0xCC, 0xFF, 0xD2, 0xFF,
+ 0x0F, 0x00, 0xBD, 0xFF, 0xC1, 0xFF, 0x11, 0x00,
+ 0xAE, 0xFF, 0xB3, 0xFF, 0x13, 0x00, 0x9F, 0xFF,
+ 0xA4, 0xFF, 0x15, 0x00, 0x90, 0xFF, 0x8F, 0xFF,
+ 0x0F, 0x00, 0x07, 0x00, 0xC3, 0xFF, 0x0F, 0x00,
+ 0x16, 0x00, 0xC3, 0xFF, 0x0F, 0x00, 0x25, 0x00,
+ 0xC3, 0xFF, 0x0F, 0x00, 0x34, 0x00, 0xC3, 0xFF,
+ 0x12, 0x00, 0x43, 0x00, 0xAE, 0xFF, 0x14, 0x00,
+ 0x52, 0x00, 0x9D, 0xFF, 0x16, 0x00, 0x61, 0x00,
+ 0x88, 0xFF, 0x18, 0x00, 0x70, 0x00, 0x6E, 0xFF,
+ 0x0F, 0x00, 0xF9, 0xFF, 0xC3, 0xFF, 0x0F, 0x00,
+ 0xEA, 0xFF, 0xC3, 0xFF, 0x0F, 0x00, 0xDB, 0xFF,
+ 0xC3, 0xFF, 0x0F, 0x00, 0xCC, 0xFF, 0xC3, 0xFF,
+ 0x12, 0x00, 0xBD, 0xFF, 0xAE, 0xFF, 0x14, 0x00,
+ 0xAE, 0xFF, 0x9D, 0xFF, 0x16, 0x00, 0x9F, 0xFF,
+ 0x88, 0xFF, 0x18, 0x00, 0x90, 0xFF, 0x6E, 0xFF,
+ 0x11, 0x00, 0x07, 0x00, 0xB6, 0xFF, 0x11, 0x00,
+ 0x16, 0x00, 0xB6, 0xFF, 0x11, 0x00, 0x25, 0x00,
+ 0xB6, 0xFF, 0x11, 0x00, 0x34, 0x00, 0xB6, 0xFF,
+ 0x14, 0x00, 0x43, 0x00, 0x9C, 0xFF, 0x16, 0x00,
+ 0x52, 0x00, 0x87, 0xFF, 0x18, 0x00, 0x61, 0x00,
+ 0x6E, 0xFF, 0x1A, 0x00, 0x70, 0x00, 0x4E, 0xFF,
+ 0x11, 0x00, 0xF9, 0xFF, 0xB6, 0xFF, 0x11, 0x00,
+ 0xEA, 0xFF, 0xB6, 0xFF, 0x11, 0x00, 0xDB, 0xFF,
+ 0xB6, 0xFF, 0x11, 0x00, 0xCC, 0xFF, 0xB6, 0xFF,
+ 0x14, 0x00, 0xBD, 0xFF, 0x9C, 0xFF, 0x16, 0x00,
+ 0xAE, 0xFF, 0x87, 0xFF, 0x18, 0x00, 0x9F, 0xFF,
+ 0x6E, 0xFF, 0x1A, 0x00, 0x90, 0xFF, 0x4E, 0xFF,
+ 0x13, 0x00, 0x07, 0x00, 0xA8, 0xFF, 0x13, 0x00,
+ 0x16, 0x00, 0xA8, 0xFF, 0x13, 0x00, 0x25, 0x00,
+ 0xA8, 0xFF, 0x13, 0x00, 0x34, 0x00, 0xA8, 0xFF,
+ 0x16, 0x00, 0x43, 0x00, 0x8A, 0xFF, 0x18, 0x00,
+ 0x52, 0x00, 0x71, 0xFF, 0x1A, 0x00, 0x61, 0x00,
+ 0x53, 0xFF, 0x1C, 0x00, 0x70, 0x00, 0x2D, 0xFF,
+ 0x13, 0x00, 0xF9, 0xFF, 0xA8, 0xFF, 0x13, 0x00,
+ 0xEA, 0xFF, 0xA8, 0xFF, 0x13, 0x00, 0xDB, 0xFF,
+ 0xA8, 0xFF, 0x13, 0x00, 0xCC, 0xFF, 0xA8, 0xFF,
+ 0x16, 0x00, 0xBD, 0xFF, 0x8A, 0xFF, 0x18, 0x00,
+ 0xAE, 0xFF, 0x71, 0xFF, 0x1A, 0x00, 0x9F, 0xFF,
+ 0x53, 0xFF, 0x1C, 0x00, 0x90, 0xFF, 0x2D, 0xFF,
+ 0x15, 0x00, 0x07, 0x00, 0x9B, 0xFF, 0x15, 0x00,
+ 0x16, 0x00, 0x9B, 0xFF, 0x15, 0x00, 0x25, 0x00,
+ 0x9B, 0xFF, 0x15, 0x00, 0x34, 0x00, 0x9B, 0xFF,
+ 0x18, 0x00, 0x43, 0x00, 0x78, 0xFF, 0x1A, 0x00,
+ 0x52, 0x00, 0x5B, 0xFF, 0x1C, 0x00, 0x61, 0x00,
+ 0x39, 0xFF, 0x1E, 0x00, 0x70, 0x00, 0x0D, 0xFF,
+ 0x15, 0x00, 0xF9, 0xFF, 0x9B, 0xFF, 0x15, 0x00,
+ 0xEA, 0xFF, 0x9B, 0xFF, 0x15, 0x00, 0xDB, 0xFF,
+ 0x9B, 0xFF, 0x15, 0x00, 0xCC, 0xFF, 0x9B, 0xFF,
+ 0x18, 0x00, 0xBD, 0xFF, 0x78, 0xFF, 0x1A, 0x00,
+ 0xAE, 0xFF, 0x5B, 0xFF, 0x1C, 0x00, 0x9F, 0xFF,
+ 0x39, 0xFF, 0x1E, 0x00, 0x90, 0xFF, 0x0D, 0xFF,
+ 0x0D, 0x00, 0x08, 0x00, 0x07, 0x00, 0x0D, 0x00,
+ 0x18, 0x00, 0x07, 0x00, 0x0D, 0x00, 0x29, 0x00,
+ 0x07, 0x00, 0x0D, 0x00, 0x39, 0x00, 0x07, 0x00,
+ 0x10, 0x00, 0x4A, 0x00, 0x0A, 0x00, 0x12, 0x00,
+ 0x5A, 0x00, 0x0C, 0x00, 0x14, 0x00, 0x6B, 0x00,
+ 0x0E, 0x00, 0x16, 0x00, 0x7B, 0x00, 0x11, 0x00,
+ 0x0D, 0x00, 0xF8, 0xFF, 0x07, 0x00, 0x0D, 0x00,
+ 0xE8, 0xFF, 0x07, 0x00, 0x0D, 0x00, 0xD7, 0xFF,
+ 0x07, 0x00, 0x0D, 0x00, 0xC7, 0xFF, 0x07, 0x00,
+ 0x10, 0x00, 0xB6, 0xFF, 0x0A, 0x00, 0x12, 0x00,
+ 0xA6, 0xFF, 0x0C, 0x00, 0x14, 0x00, 0x95, 0xFF,
+ 0x0E, 0x00, 0x16, 0x00, 0x85, 0xFF, 0x11, 0x00,
+ 0x0D, 0x00, 0x08, 0x00, 0x16, 0x00, 0x0D, 0x00,
+ 0x18, 0x00, 0x16, 0x00, 0x0D, 0x00, 0x29, 0x00,
+ 0x16, 0x00, 0x0D, 0x00, 0x39, 0x00, 0x16, 0x00,
+ 0x10, 0x00, 0x4A, 0x00, 0x1E, 0x00, 0x12, 0x00,
+ 0x5A, 0x00, 0x24, 0x00, 0x14, 0x00, 0x6B, 0x00,
+ 0x2B, 0x00, 0x16, 0x00, 0x7B, 0x00, 0x34, 0x00,
+ 0x0D, 0x00, 0xF8, 0xFF, 0x16, 0x00, 0x0D, 0x00,
+ 0xE8, 0xFF, 0x16, 0x00, 0x0D, 0x00, 0xD7, 0xFF,
+ 0x16, 0x00, 0x0D, 0x00, 0xC7, 0xFF, 0x16, 0x00,
+ 0x10, 0x00, 0xB6, 0xFF, 0x1E, 0x00, 0x12, 0x00,
+ 0xA6, 0xFF, 0x24, 0x00, 0x14, 0x00, 0x95, 0xFF,
+ 0x2B, 0x00, 0x16, 0x00, 0x85, 0xFF, 0x34, 0x00,
+ 0x0D, 0x00, 0x08, 0x00, 0x25, 0x00, 0x0D, 0x00,
+ 0x18, 0x00, 0x25, 0x00, 0x0D, 0x00, 0x29, 0x00,
+ 0x25, 0x00, 0x0D, 0x00, 0x39, 0x00, 0x25, 0x00,
+ 0x10, 0x00, 0x4A, 0x00, 0x32, 0x00, 0x12, 0x00,
+ 0x5A, 0x00, 0x3C, 0x00, 0x14, 0x00, 0x6B, 0x00,
+ 0x49, 0x00, 0x16, 0x00, 0x7B, 0x00, 0x58, 0x00,
+ 0x0D, 0x00, 0xF8, 0xFF, 0x25, 0x00, 0x0D, 0x00,
+ 0xE8, 0xFF, 0x25, 0x00, 0x0D, 0x00, 0xD7, 0xFF,
+ 0x25, 0x00, 0x0D, 0x00, 0xC7, 0xFF, 0x25, 0x00,
+ 0x10, 0x00, 0xB6, 0xFF, 0x32, 0x00, 0x12, 0x00,
+ 0xA6, 0xFF, 0x3C, 0x00, 0x14, 0x00, 0x95, 0xFF,
+ 0x49, 0x00, 0x16, 0x00, 0x85, 0xFF, 0x58, 0x00,
+ 0x0D, 0x00, 0x08, 0x00, 0x34, 0x00, 0x0D, 0x00,
+ 0x18, 0x00, 0x34, 0x00, 0x0D, 0x00, 0x29, 0x00,
+ 0x34, 0x00, 0x0D, 0x00, 0x39, 0x00, 0x34, 0x00,
+ 0x10, 0x00, 0x4A, 0x00, 0x46, 0x00, 0x12, 0x00,
+ 0x5A, 0x00, 0x54, 0x00, 0x14, 0x00, 0x6B, 0x00,
+ 0x66, 0x00, 0x16, 0x00, 0x7B, 0x00, 0x7B, 0x00,
+ 0x0D, 0x00, 0xF8, 0xFF, 0x34, 0x00, 0x0D, 0x00,
+ 0xE8, 0xFF, 0x34, 0x00, 0x0D, 0x00, 0xD7, 0xFF,
+ 0x34, 0x00, 0x0D, 0x00, 0xC7, 0xFF, 0x34, 0x00,
+ 0x10, 0x00, 0xB6, 0xFF, 0x46, 0x00, 0x12, 0x00,
+ 0xA6, 0xFF, 0x54, 0x00, 0x14, 0x00, 0x95, 0xFF,
+ 0x66, 0x00, 0x16, 0x00, 0x85, 0xFF, 0x7B, 0x00,
+ 0x10, 0x00, 0x08, 0x00, 0x43, 0x00, 0x10, 0x00,
+ 0x18, 0x00, 0x43, 0x00, 0x10, 0x00, 0x29, 0x00,
+ 0x43, 0x00, 0x10, 0x00, 0x39, 0x00, 0x43, 0x00,
+ 0x13, 0x00, 0x4A, 0x00, 0x5A, 0x00, 0x15, 0x00,
+ 0x5A, 0x00, 0x6D, 0x00, 0x17, 0x00, 0x6B, 0x00,
+ 0x84, 0x00, 0x19, 0x00, 0x7B, 0x00, 0xA0, 0x00,
+ 0x10, 0x00, 0xF8, 0xFF, 0x43, 0x00, 0x10, 0x00,
+ 0xE8, 0xFF, 0x43, 0x00, 0x10, 0x00, 0xD7, 0xFF,
+ 0x43, 0x00, 0x10, 0x00, 0xC7, 0xFF, 0x43, 0x00,
+ 0x13, 0x00, 0xB6, 0xFF, 0x5A, 0x00, 0x15, 0x00,
+ 0xA6, 0xFF, 0x6D, 0x00, 0x17, 0x00, 0x95, 0xFF,
+ 0x84, 0x00, 0x19, 0x00, 0x85, 0xFF, 0xA0, 0x00,
+ 0x12, 0x00, 0x08, 0x00, 0x52, 0x00, 0x12, 0x00,
+ 0x18, 0x00, 0x52, 0x00, 0x12, 0x00, 0x29, 0x00,
+ 0x52, 0x00, 0x12, 0x00, 0x39, 0x00, 0x52, 0x00,
+ 0x15, 0x00, 0x4A, 0x00, 0x6E, 0x00, 0x17, 0x00,
+ 0x5A, 0x00, 0x85, 0x00, 0x19, 0x00, 0x6B, 0x00,
+ 0xA1, 0x00, 0x1B, 0x00, 0x7B, 0x00, 0xC3, 0x00,
+ 0x12, 0x00, 0xF8, 0xFF, 0x52, 0x00, 0x12, 0x00,
+ 0xE8, 0xFF, 0x52, 0x00, 0x12, 0x00, 0xD7, 0xFF,
+ 0x52, 0x00, 0x12, 0x00, 0xC7, 0xFF, 0x52, 0x00,
+ 0x15, 0x00, 0xB6, 0xFF, 0x6E, 0x00, 0x17, 0x00,
+ 0xA6, 0xFF, 0x85, 0x00, 0x19, 0x00, 0x95, 0xFF,
+ 0xA1, 0x00, 0x1B, 0x00, 0x85, 0xFF, 0xC3, 0x00,
+ 0x14, 0x00, 0x08, 0x00, 0x61, 0x00, 0x14, 0x00,
+ 0x18, 0x00, 0x61, 0x00, 0x14, 0x00, 0x29, 0x00,
+ 0x61, 0x00, 0x14, 0x00, 0x39, 0x00, 0x61, 0x00,
+ 0x17, 0x00, 0x4A, 0x00, 0x82, 0x00, 0x19, 0x00,
+ 0x5A, 0x00, 0x9D, 0x00, 0x1B, 0x00, 0x6B, 0x00,
+ 0xBF, 0x00, 0x1D, 0x00, 0x7B, 0x00, 0xE7, 0x00,
+ 0x14, 0x00, 0xF8, 0xFF, 0x61, 0x00, 0x14, 0x00,
+ 0xE8, 0xFF, 0x61, 0x00, 0x14, 0x00, 0xD7, 0xFF,
+ 0x61, 0x00, 0x14, 0x00, 0xC7, 0xFF, 0x61, 0x00,
+ 0x17, 0x00, 0xB6, 0xFF, 0x82, 0x00, 0x19, 0x00,
+ 0xA6, 0xFF, 0x9D, 0x00, 0x1B, 0x00, 0x95, 0xFF,
+ 0xBF, 0x00, 0x1D, 0x00, 0x85, 0xFF, 0xE7, 0x00,
+ 0x16, 0x00, 0x08, 0x00, 0x70, 0x00, 0x16, 0x00,
+ 0x18, 0x00, 0x70, 0x00, 0x16, 0x00, 0x29, 0x00,
+ 0x70, 0x00, 0x16, 0x00, 0x39, 0x00, 0x70, 0x00,
+ 0x19, 0x00, 0x4A, 0x00, 0x96, 0x00, 0x1B, 0x00,
+ 0x5A, 0x00, 0xB5, 0x00, 0x1D, 0x00, 0x6B, 0x00,
+ 0xDC, 0x00, 0x1F, 0x00, 0x7B, 0x00, 0x0A, 0x01,
+ 0x16, 0x00, 0xF8, 0xFF, 0x70, 0x00, 0x16, 0x00,
+ 0xE8, 0xFF, 0x70, 0x00, 0x16, 0x00, 0xD7, 0xFF,
+ 0x70, 0x00, 0x16, 0x00, 0xC7, 0xFF, 0x70, 0x00,
+ 0x19, 0x00, 0xB6, 0xFF, 0x96, 0x00, 0x1B, 0x00,
+ 0xA6, 0xFF, 0xB5, 0x00, 0x1D, 0x00, 0x95, 0xFF,
+ 0xDC, 0x00, 0x1F, 0x00, 0x85, 0xFF, 0x0A, 0x01,
+ 0x0D, 0x00, 0x08, 0x00, 0xF9, 0xFF, 0x0D, 0x00,
+ 0x18, 0x00, 0xF9, 0xFF, 0x0D, 0x00, 0x29, 0x00,
+ 0xF9, 0xFF, 0x0D, 0x00, 0x39, 0x00, 0xF9, 0xFF,
+ 0x10, 0x00, 0x4A, 0x00, 0xF6, 0xFF, 0x12, 0x00,
+ 0x5A, 0x00, 0xF4, 0xFF, 0x14, 0x00, 0x6B, 0x00,
+ 0xF2, 0xFF, 0x16, 0x00, 0x7B, 0x00, 0xEF, 0xFF,
+ 0x0D, 0x00, 0xF8, 0xFF, 0xF9, 0xFF, 0x0D, 0x00,
+ 0xE8, 0xFF, 0xF9, 0xFF, 0x0D, 0x00, 0xD7, 0xFF,
+ 0xF9, 0xFF, 0x0D, 0x00, 0xC7, 0xFF, 0xF9, 0xFF,
+ 0x10, 0x00, 0xB6, 0xFF, 0xF6, 0xFF, 0x12, 0x00,
+ 0xA6, 0xFF, 0xF4, 0xFF, 0x14, 0x00, 0x95, 0xFF,
+ 0xF2, 0xFF, 0x16, 0x00, 0x85, 0xFF, 0xEF, 0xFF,
+ 0x0D, 0x00, 0x08, 0x00, 0xEA, 0xFF, 0x0D, 0x00,
+ 0x18, 0x00, 0xEA, 0xFF, 0x0D, 0x00, 0x29, 0x00,
+ 0xEA, 0xFF, 0x0D, 0x00, 0x39, 0x00, 0xEA, 0xFF,
+ 0x10, 0x00, 0x4A, 0x00, 0xE2, 0xFF, 0x12, 0x00,
+ 0x5A, 0x00, 0xDC, 0xFF, 0x14, 0x00, 0x6B, 0x00,
+ 0xD5, 0xFF, 0x16, 0x00, 0x7B, 0x00, 0xCC, 0xFF,
+ 0x0D, 0x00, 0xF8, 0xFF, 0xEA, 0xFF, 0x0D, 0x00,
+ 0xE8, 0xFF, 0xEA, 0xFF, 0x0D, 0x00, 0xD7, 0xFF,
+ 0xEA, 0xFF, 0x0D, 0x00, 0xC7, 0xFF, 0xEA, 0xFF,
+ 0x10, 0x00, 0xB6, 0xFF, 0xE2, 0xFF, 0x12, 0x00,
+ 0xA6, 0xFF, 0xDC, 0xFF, 0x14, 0x00, 0x95, 0xFF,
+ 0xD5, 0xFF, 0x16, 0x00, 0x85, 0xFF, 0xCC, 0xFF,
+ 0x0D, 0x00, 0x08, 0x00, 0xDB, 0xFF, 0x0D, 0x00,
+ 0x18, 0x00, 0xDB, 0xFF, 0x0D, 0x00, 0x29, 0x00,
+ 0xDB, 0xFF, 0x0D, 0x00, 0x39, 0x00, 0xDB, 0xFF,
+ 0x10, 0x00, 0x4A, 0x00, 0xCE, 0xFF, 0x12, 0x00,
+ 0x5A, 0x00, 0xC4, 0xFF, 0x14, 0x00, 0x6B, 0x00,
+ 0xB7, 0xFF, 0x16, 0x00, 0x7B, 0x00, 0xA8, 0xFF,
+ 0x0D, 0x00, 0xF8, 0xFF, 0xDB, 0xFF, 0x0D, 0x00,
+ 0xE8, 0xFF, 0xDB, 0xFF, 0x0D, 0x00, 0xD7, 0xFF,
+ 0xDB, 0xFF, 0x0D, 0x00, 0xC7, 0xFF, 0xDB, 0xFF,
+ 0x10, 0x00, 0xB6, 0xFF, 0xCE, 0xFF, 0x12, 0x00,
+ 0xA6, 0xFF, 0xC4, 0xFF, 0x14, 0x00, 0x95, 0xFF,
+ 0xB7, 0xFF, 0x16, 0x00, 0x85, 0xFF, 0xA8, 0xFF,
+ 0x0D, 0x00, 0x08, 0x00, 0xCC, 0xFF, 0x0D, 0x00,
+ 0x18, 0x00, 0xCC, 0xFF, 0x0D, 0x00, 0x29, 0x00,
+ 0xCC, 0xFF, 0x0D, 0x00, 0x39, 0x00, 0xCC, 0xFF,
+ 0x10, 0x00, 0x4A, 0x00, 0xBA, 0xFF, 0x12, 0x00,
+ 0x5A, 0x00, 0xAC, 0xFF, 0x14, 0x00, 0x6B, 0x00,
+ 0x9A, 0xFF, 0x16, 0x00, 0x7B, 0x00, 0x85, 0xFF,
+ 0x0D, 0x00, 0xF8, 0xFF, 0xCC, 0xFF, 0x0D, 0x00,
+ 0xE8, 0xFF, 0xCC, 0xFF, 0x0D, 0x00, 0xD7, 0xFF,
+ 0xCC, 0xFF, 0x0D, 0x00, 0xC7, 0xFF, 0xCC, 0xFF,
+ 0x10, 0x00, 0xB6, 0xFF, 0xBA, 0xFF, 0x12, 0x00,
+ 0xA6, 0xFF, 0xAC, 0xFF, 0x14, 0x00, 0x95, 0xFF,
+ 0x9A, 0xFF, 0x16, 0x00, 0x85, 0xFF, 0x85, 0xFF,
+ 0x10, 0x00, 0x08, 0x00, 0xBD, 0xFF, 0x10, 0x00,
+ 0x18, 0x00, 0xBD, 0xFF, 0x10, 0x00, 0x29, 0x00,
+ 0xBD, 0xFF, 0x10, 0x00, 0x39, 0x00, 0xBD, 0xFF,
+ 0x13, 0x00, 0x4A, 0x00, 0xA6, 0xFF, 0x15, 0x00,
+ 0x5A, 0x00, 0x93, 0xFF, 0x17, 0x00, 0x6B, 0x00,
+ 0x7C, 0xFF, 0x19, 0x00, 0x7B, 0x00, 0x60, 0xFF,
+ 0x10, 0x00, 0xF8, 0xFF, 0xBD, 0xFF, 0x10, 0x00,
+ 0xE8, 0xFF, 0xBD, 0xFF, 0x10, 0x00, 0xD7, 0xFF,
+ 0xBD, 0xFF, 0x10, 0x00, 0xC7, 0xFF, 0xBD, 0xFF,
+ 0x13, 0x00, 0xB6, 0xFF, 0xA6, 0xFF, 0x15, 0x00,
+ 0xA6, 0xFF, 0x93, 0xFF, 0x17, 0x00, 0x95, 0xFF,
+ 0x7C, 0xFF, 0x19, 0x00, 0x85, 0xFF, 0x60, 0xFF,
+ 0x12, 0x00, 0x08, 0x00, 0xAE, 0xFF, 0x12, 0x00,
+ 0x18, 0x00, 0xAE, 0xFF, 0x12, 0x00, 0x29, 0x00,
+ 0xAE, 0xFF, 0x12, 0x00, 0x39, 0x00, 0xAE, 0xFF,
+ 0x15, 0x00, 0x4A, 0x00, 0x92, 0xFF, 0x17, 0x00,
+ 0x5A, 0x00, 0x7B, 0xFF, 0x19, 0x00, 0x6B, 0x00,
+ 0x5F, 0xFF, 0x1B, 0x00, 0x7B, 0x00, 0x3D, 0xFF,
+ 0x12, 0x00, 0xF8, 0xFF, 0xAE, 0xFF, 0x12, 0x00,
+ 0xE8, 0xFF, 0xAE, 0xFF, 0x12, 0x00, 0xD7, 0xFF,
+ 0xAE, 0xFF, 0x12, 0x00, 0xC7, 0xFF, 0xAE, 0xFF,
+ 0x15, 0x00, 0xB6, 0xFF, 0x92, 0xFF, 0x17, 0x00,
+ 0xA6, 0xFF, 0x7B, 0xFF, 0x19, 0x00, 0x95, 0xFF,
+ 0x5F, 0xFF, 0x1B, 0x00, 0x85, 0xFF, 0x3D, 0xFF,
+ 0x14, 0x00, 0x08, 0x00, 0x9F, 0xFF, 0x14, 0x00,
+ 0x18, 0x00, 0x9F, 0xFF, 0x14, 0x00, 0x29, 0x00,
+ 0x9F, 0xFF, 0x14, 0x00, 0x39, 0x00, 0x9F, 0xFF,
+ 0x17, 0x00, 0x4A, 0x00, 0x7E, 0xFF, 0x19, 0x00,
+ 0x5A, 0x00, 0x63, 0xFF, 0x1B, 0x00, 0x6B, 0x00,
+ 0x41, 0xFF, 0x1D, 0x00, 0x7B, 0x00, 0x19, 0xFF,
+ 0x14, 0x00, 0xF8, 0xFF, 0x9F, 0xFF, 0x14, 0x00,
+ 0xE8, 0xFF, 0x9F, 0xFF, 0x14, 0x00, 0xD7, 0xFF,
+ 0x9F, 0xFF, 0x14, 0x00, 0xC7, 0xFF, 0x9F, 0xFF,
+ 0x17, 0x00, 0xB6, 0xFF, 0x7E, 0xFF, 0x19, 0x00,
+ 0xA6, 0xFF, 0x63, 0xFF, 0x1B, 0x00, 0x95, 0xFF,
+ 0x41, 0xFF, 0x1D, 0x00, 0x85, 0xFF, 0x19, 0xFF,
+ 0x16, 0x00, 0x08, 0x00, 0x90, 0xFF, 0x16, 0x00,
+ 0x18, 0x00, 0x90, 0xFF, 0x16, 0x00, 0x29, 0x00,
+ 0x90, 0xFF, 0x16, 0x00, 0x39, 0x00, 0x90, 0xFF,
+ 0x19, 0x00, 0x4A, 0x00, 0x6A, 0xFF, 0x1B, 0x00,
+ 0x5A, 0x00, 0x4B, 0xFF, 0x1D, 0x00, 0x6B, 0x00,
+ 0x24, 0xFF, 0x1F, 0x00, 0x7B, 0x00, 0xF6, 0xFE,
+ 0x16, 0x00, 0xF8, 0xFF, 0x90, 0xFF, 0x16, 0x00,
+ 0xE8, 0xFF, 0x90, 0xFF, 0x16, 0x00, 0xD7, 0xFF,
+ 0x90, 0xFF, 0x16, 0x00, 0xC7, 0xFF, 0x90, 0xFF,
+ 0x19, 0x00, 0xB6, 0xFF, 0x6A, 0xFF, 0x1B, 0x00,
+ 0xA6, 0xFF, 0x4B, 0xFF, 0x1D, 0x00, 0x95, 0xFF,
+ 0x24, 0xFF, 0x1F, 0x00, 0x85, 0xFF, 0xF6, 0xFE,
+ 0x0E, 0x00, 0x09, 0x00, 0x08, 0x00, 0x0E, 0x00,
+ 0x1B, 0x00, 0x08, 0x00, 0x0E, 0x00, 0x2D, 0x00,
+ 0x08, 0x00, 0x0E, 0x00, 0x3F, 0x00, 0x08, 0x00,
+ 0x11, 0x00, 0x52, 0x00, 0x0B, 0x00, 0x13, 0x00,
+ 0x64, 0x00, 0x0D, 0x00, 0x15, 0x00, 0x76, 0x00,
+ 0x10, 0x00, 0x17, 0x00, 0x88, 0x00, 0x13, 0x00,
+ 0x0E, 0x00, 0xF7, 0xFF, 0x08, 0x00, 0x0E, 0x00,
+ 0xE5, 0xFF, 0x08, 0x00, 0x0E, 0x00, 0xD3, 0xFF,
+ 0x08, 0x00, 0x0E, 0x00, 0xC1, 0xFF, 0x08, 0x00,
+ 0x11, 0x00, 0xAE, 0xFF, 0x0B, 0x00, 0x13, 0x00,
+ 0x9C, 0xFF, 0x0D, 0x00, 0x15, 0x00, 0x8A, 0xFF,
+ 0x10, 0x00, 0x17, 0x00, 0x78, 0xFF, 0x13, 0x00,
+ 0x0E, 0x00, 0x09, 0x00, 0x18, 0x00, 0x0E, 0x00,
+ 0x1B, 0x00, 0x18, 0x00, 0x0E, 0x00, 0x2D, 0x00,
+ 0x18, 0x00, 0x0E, 0x00, 0x3F, 0x00, 0x18, 0x00,
+ 0x11, 0x00, 0x52, 0x00, 0x21, 0x00, 0x13, 0x00,
+ 0x64, 0x00, 0x27, 0x00, 0x15, 0x00, 0x76, 0x00,
+ 0x30, 0x00, 0x17, 0x00, 0x88, 0x00, 0x3A, 0x00,
+ 0x0E, 0x00, 0xF7, 0xFF, 0x18, 0x00, 0x0E, 0x00,
+ 0xE5, 0xFF, 0x18, 0x00, 0x0E, 0x00, 0xD3, 0xFF,
+ 0x18, 0x00, 0x0E, 0x00, 0xC1, 0xFF, 0x18, 0x00,
+ 0x11, 0x00, 0xAE, 0xFF, 0x21, 0x00, 0x13, 0x00,
+ 0x9C, 0xFF, 0x27, 0x00, 0x15, 0x00, 0x8A, 0xFF,
+ 0x30, 0x00, 0x17, 0x00, 0x78, 0xFF, 0x3A, 0x00,
+ 0x0E, 0x00, 0x09, 0x00, 0x29, 0x00, 0x0E, 0x00,
+ 0x1B, 0x00, 0x29, 0x00, 0x0E, 0x00, 0x2D, 0x00,
+ 0x29, 0x00, 0x0E, 0x00, 0x3F, 0x00, 0x29, 0x00,
+ 0x11, 0x00, 0x52, 0x00, 0x37, 0x00, 0x13, 0x00,
+ 0x64, 0x00, 0x42, 0x00, 0x15, 0x00, 0x76, 0x00,
+ 0x51, 0x00, 0x17, 0x00, 0x88, 0x00, 0x61, 0x00,
+ 0x0E, 0x00, 0xF7, 0xFF, 0x29, 0x00, 0x0E, 0x00,
+ 0xE5, 0xFF, 0x29, 0x00, 0x0E, 0x00, 0xD3, 0xFF,
+ 0x29, 0x00, 0x0E, 0x00, 0xC1, 0xFF, 0x29, 0x00,
+ 0x11, 0x00, 0xAE, 0xFF, 0x37, 0x00, 0x13, 0x00,
+ 0x9C, 0xFF, 0x42, 0x00, 0x15, 0x00, 0x8A, 0xFF,
+ 0x51, 0x00, 0x17, 0x00, 0x78, 0xFF, 0x61, 0x00,
+ 0x0E, 0x00, 0x09, 0x00, 0x39, 0x00, 0x0E, 0x00,
+ 0x1B, 0x00, 0x39, 0x00, 0x0E, 0x00, 0x2D, 0x00,
+ 0x39, 0x00, 0x0E, 0x00, 0x3F, 0x00, 0x39, 0x00,
+ 0x11, 0x00, 0x52, 0x00, 0x4D, 0x00, 0x13, 0x00,
+ 0x64, 0x00, 0x5C, 0x00, 0x15, 0x00, 0x76, 0x00,
+ 0x71, 0x00, 0x17, 0x00, 0x88, 0x00, 0x88, 0x00,
+ 0x0E, 0x00, 0xF7, 0xFF, 0x39, 0x00, 0x0E, 0x00,
+ 0xE5, 0xFF, 0x39, 0x00, 0x0E, 0x00, 0xD3, 0xFF,
+ 0x39, 0x00, 0x0E, 0x00, 0xC1, 0xFF, 0x39, 0x00,
+ 0x11, 0x00, 0xAE, 0xFF, 0x4D, 0x00, 0x13, 0x00,
+ 0x9C, 0xFF, 0x5C, 0x00, 0x15, 0x00, 0x8A, 0xFF,
+ 0x71, 0x00, 0x17, 0x00, 0x78, 0xFF, 0x88, 0x00,
+ 0x11, 0x00, 0x09, 0x00, 0x4A, 0x00, 0x11, 0x00,
+ 0x1B, 0x00, 0x4A, 0x00, 0x11, 0x00, 0x2D, 0x00,
+ 0x4A, 0x00, 0x11, 0x00, 0x3F, 0x00, 0x4A, 0x00,
+ 0x14, 0x00, 0x52, 0x00, 0x63, 0x00, 0x16, 0x00,
+ 0x64, 0x00, 0x78, 0x00, 0x18, 0x00, 0x76, 0x00,
+ 0x92, 0x00, 0x1A, 0x00, 0x88, 0x00, 0xB0, 0x00,
+ 0x11, 0x00, 0xF7, 0xFF, 0x4A, 0x00, 0x11, 0x00,
+ 0xE5, 0xFF, 0x4A, 0x00, 0x11, 0x00, 0xD3, 0xFF,
+ 0x4A, 0x00, 0x11, 0x00, 0xC1, 0xFF, 0x4A, 0x00,
+ 0x14, 0x00, 0xAE, 0xFF, 0x63, 0x00, 0x16, 0x00,
+ 0x9C, 0xFF, 0x78, 0x00, 0x18, 0x00, 0x8A, 0xFF,
+ 0x92, 0x00, 0x1A, 0x00, 0x78, 0xFF, 0xB0, 0x00,
+ 0x13, 0x00, 0x09, 0x00, 0x5A, 0x00, 0x13, 0x00,
+ 0x1B, 0x00, 0x5A, 0x00, 0x13, 0x00, 0x2D, 0x00,
+ 0x5A, 0x00, 0x13, 0x00, 0x3F, 0x00, 0x5A, 0x00,
+ 0x16, 0x00, 0x52, 0x00, 0x79, 0x00, 0x18, 0x00,
+ 0x64, 0x00, 0x92, 0x00, 0x1A, 0x00, 0x76, 0x00,
+ 0xB2, 0x00, 0x1C, 0x00, 0x88, 0x00, 0xD7, 0x00,
+ 0x13, 0x00, 0xF7, 0xFF, 0x5A, 0x00, 0x13, 0x00,
+ 0xE5, 0xFF, 0x5A, 0x00, 0x13, 0x00, 0xD3, 0xFF,
+ 0x5A, 0x00, 0x13, 0x00, 0xC1, 0xFF, 0x5A, 0x00,
+ 0x16, 0x00, 0xAE, 0xFF, 0x79, 0x00, 0x18, 0x00,
+ 0x9C, 0xFF, 0x92, 0x00, 0x1A, 0x00, 0x8A, 0xFF,
+ 0xB2, 0x00, 0x1C, 0x00, 0x78, 0xFF, 0xD7, 0x00,
+ 0x15, 0x00, 0x09, 0x00, 0x6B, 0x00, 0x15, 0x00,
+ 0x1B, 0x00, 0x6B, 0x00, 0x15, 0x00, 0x2D, 0x00,
+ 0x6B, 0x00, 0x15, 0x00, 0x3F, 0x00, 0x6B, 0x00,
+ 0x18, 0x00, 0x52, 0x00, 0x8F, 0x00, 0x1A, 0x00,
+ 0x64, 0x00, 0xAD, 0x00, 0x1C, 0x00, 0x76, 0x00,
+ 0xD3, 0x00, 0x1E, 0x00, 0x88, 0x00, 0xFE, 0x00,
+ 0x15, 0x00, 0xF7, 0xFF, 0x6B, 0x00, 0x15, 0x00,
+ 0xE5, 0xFF, 0x6B, 0x00, 0x15, 0x00, 0xD3, 0xFF,
+ 0x6B, 0x00, 0x15, 0x00, 0xC1, 0xFF, 0x6B, 0x00,
+ 0x18, 0x00, 0xAE, 0xFF, 0x8F, 0x00, 0x1A, 0x00,
+ 0x9C, 0xFF, 0xAD, 0x00, 0x1C, 0x00, 0x8A, 0xFF,
+ 0xD3, 0x00, 0x1E, 0x00, 0x78, 0xFF, 0xFE, 0x00,
+ 0x17, 0x00, 0x09, 0x00, 0x7B, 0x00, 0x17, 0x00,
+ 0x1B, 0x00, 0x7B, 0x00, 0x17, 0x00, 0x2D, 0x00,
+ 0x7B, 0x00, 0x17, 0x00, 0x3F, 0x00, 0x7B, 0x00,
+ 0x1A, 0x00, 0x52, 0x00, 0xA5, 0x00, 0x1C, 0x00,
+ 0x64, 0x00, 0xC7, 0x00, 0x1E, 0x00, 0x76, 0x00,
+ 0xF3, 0x00, 0x20, 0x00, 0x88, 0x00, 0x25, 0x01,
+ 0x17, 0x00, 0xF7, 0xFF, 0x7B, 0x00, 0x17, 0x00,
+ 0xE5, 0xFF, 0x7B, 0x00, 0x17, 0x00, 0xD3, 0xFF,
+ 0x7B, 0x00, 0x17, 0x00, 0xC1, 0xFF, 0x7B, 0x00,
+ 0x1A, 0x00, 0xAE, 0xFF, 0xA5, 0x00, 0x1C, 0x00,
+ 0x9C, 0xFF, 0xC7, 0x00, 0x1E, 0x00, 0x8A, 0xFF,
+ 0xF3, 0x00, 0x20, 0x00, 0x78, 0xFF, 0x25, 0x01,
+ 0x0E, 0x00, 0x09, 0x00, 0xF8, 0xFF, 0x0E, 0x00,
+ 0x1B, 0x00, 0xF8, 0xFF, 0x0E, 0x00, 0x2D, 0x00,
+ 0xF8, 0xFF, 0x0E, 0x00, 0x3F, 0x00, 0xF8, 0xFF,
+ 0x11, 0x00, 0x52, 0x00, 0xF5, 0xFF, 0x13, 0x00,
+ 0x64, 0x00, 0xF3, 0xFF, 0x15, 0x00, 0x76, 0x00,
+ 0xF0, 0xFF, 0x17, 0x00, 0x88, 0x00, 0xED, 0xFF,
+ 0x0E, 0x00, 0xF7, 0xFF, 0xF8, 0xFF, 0x0E, 0x00,
+ 0xE5, 0xFF, 0xF8, 0xFF, 0x0E, 0x00, 0xD3, 0xFF,
+ 0xF8, 0xFF, 0x0E, 0x00, 0xC1, 0xFF, 0xF8, 0xFF,
+ 0x11, 0x00, 0xAE, 0xFF, 0xF5, 0xFF, 0x13, 0x00,
+ 0x9C, 0xFF, 0xF3, 0xFF, 0x15, 0x00, 0x8A, 0xFF,
+ 0xF0, 0xFF, 0x17, 0x00, 0x78, 0xFF, 0xED, 0xFF,
+ 0x0E, 0x00, 0x09, 0x00, 0xE8, 0xFF, 0x0E, 0x00,
+ 0x1B, 0x00, 0xE8, 0xFF, 0x0E, 0x00, 0x2D, 0x00,
+ 0xE8, 0xFF, 0x0E, 0x00, 0x3F, 0x00, 0xE8, 0xFF,
+ 0x11, 0x00, 0x52, 0x00, 0xDF, 0xFF, 0x13, 0x00,
+ 0x64, 0x00, 0xD9, 0xFF, 0x15, 0x00, 0x76, 0x00,
+ 0xD0, 0xFF, 0x17, 0x00, 0x88, 0x00, 0xC6, 0xFF,
+ 0x0E, 0x00, 0xF7, 0xFF, 0xE8, 0xFF, 0x0E, 0x00,
+ 0xE5, 0xFF, 0xE8, 0xFF, 0x0E, 0x00, 0xD3, 0xFF,
+ 0xE8, 0xFF, 0x0E, 0x00, 0xC1, 0xFF, 0xE8, 0xFF,
+ 0x11, 0x00, 0xAE, 0xFF, 0xDF, 0xFF, 0x13, 0x00,
+ 0x9C, 0xFF, 0xD9, 0xFF, 0x15, 0x00, 0x8A, 0xFF,
+ 0xD0, 0xFF, 0x17, 0x00, 0x78, 0xFF, 0xC6, 0xFF,
+ 0x0E, 0x00, 0x09, 0x00, 0xD7, 0xFF, 0x0E, 0x00,
+ 0x1B, 0x00, 0xD7, 0xFF, 0x0E, 0x00, 0x2D, 0x00,
+ 0xD7, 0xFF, 0x0E, 0x00, 0x3F, 0x00, 0xD7, 0xFF,
+ 0x11, 0x00, 0x52, 0x00, 0xC9, 0xFF, 0x13, 0x00,
+ 0x64, 0x00, 0xBE, 0xFF, 0x15, 0x00, 0x76, 0x00,
+ 0xAF, 0xFF, 0x17, 0x00, 0x88, 0x00, 0x9F, 0xFF,
+ 0x0E, 0x00, 0xF7, 0xFF, 0xD7, 0xFF, 0x0E, 0x00,
+ 0xE5, 0xFF, 0xD7, 0xFF, 0x0E, 0x00, 0xD3, 0xFF,
+ 0xD7, 0xFF, 0x0E, 0x00, 0xC1, 0xFF, 0xD7, 0xFF,
+ 0x11, 0x00, 0xAE, 0xFF, 0xC9, 0xFF, 0x13, 0x00,
+ 0x9C, 0xFF, 0xBE, 0xFF, 0x15, 0x00, 0x8A, 0xFF,
+ 0xAF, 0xFF, 0x17, 0x00, 0x78, 0xFF, 0x9F, 0xFF,
+ 0x0E, 0x00, 0x09, 0x00, 0xC7, 0xFF, 0x0E, 0x00,
+ 0x1B, 0x00, 0xC7, 0xFF, 0x0E, 0x00, 0x2D, 0x00,
+ 0xC7, 0xFF, 0x0E, 0x00, 0x3F, 0x00, 0xC7, 0xFF,
+ 0x11, 0x00, 0x52, 0x00, 0xB3, 0xFF, 0x13, 0x00,
+ 0x64, 0x00, 0xA4, 0xFF, 0x15, 0x00, 0x76, 0x00,
+ 0x8F, 0xFF, 0x17, 0x00, 0x88, 0x00, 0x78, 0xFF,
+ 0x0E, 0x00, 0xF7, 0xFF, 0xC7, 0xFF, 0x0E, 0x00,
+ 0xE5, 0xFF, 0xC7, 0xFF, 0x0E, 0x00, 0xD3, 0xFF,
+ 0xC7, 0xFF, 0x0E, 0x00, 0xC1, 0xFF, 0xC7, 0xFF,
+ 0x11, 0x00, 0xAE, 0xFF, 0xB3, 0xFF, 0x13, 0x00,
+ 0x9C, 0xFF, 0xA4, 0xFF, 0x15, 0x00, 0x8A, 0xFF,
+ 0x8F, 0xFF, 0x17, 0x00, 0x78, 0xFF, 0x78, 0xFF,
+ 0x11, 0x00, 0x09, 0x00, 0xB6, 0xFF, 0x11, 0x00,
+ 0x1B, 0x00, 0xB6, 0xFF, 0x11, 0x00, 0x2D, 0x00,
+ 0xB6, 0xFF, 0x11, 0x00, 0x3F, 0x00, 0xB6, 0xFF,
+ 0x14, 0x00, 0x52, 0x00, 0x9D, 0xFF, 0x16, 0x00,
+ 0x64, 0x00, 0x88, 0xFF, 0x18, 0x00, 0x76, 0x00,
+ 0x6E, 0xFF, 0x1A, 0x00, 0x88, 0x00, 0x50, 0xFF,
+ 0x11, 0x00, 0xF7, 0xFF, 0xB6, 0xFF, 0x11, 0x00,
+ 0xE5, 0xFF, 0xB6, 0xFF, 0x11, 0x00, 0xD3, 0xFF,
+ 0xB6, 0xFF, 0x11, 0x00, 0xC1, 0xFF, 0xB6, 0xFF,
+ 0x14, 0x00, 0xAE, 0xFF, 0x9D, 0xFF, 0x16, 0x00,
+ 0x9C, 0xFF, 0x88, 0xFF, 0x18, 0x00, 0x8A, 0xFF,
+ 0x6E, 0xFF, 0x1A, 0x00, 0x78, 0xFF, 0x50, 0xFF,
+ 0x13, 0x00, 0x09, 0x00, 0xA6, 0xFF, 0x13, 0x00,
+ 0x1B, 0x00, 0xA6, 0xFF, 0x13, 0x00, 0x2D, 0x00,
+ 0xA6, 0xFF, 0x13, 0x00, 0x3F, 0x00, 0xA6, 0xFF,
+ 0x16, 0x00, 0x52, 0x00, 0x87, 0xFF, 0x18, 0x00,
+ 0x64, 0x00, 0x6E, 0xFF, 0x1A, 0x00, 0x76, 0x00,
+ 0x4E, 0xFF, 0x1C, 0x00, 0x88, 0x00, 0x29, 0xFF,
+ 0x13, 0x00, 0xF7, 0xFF, 0xA6, 0xFF, 0x13, 0x00,
+ 0xE5, 0xFF, 0xA6, 0xFF, 0x13, 0x00, 0xD3, 0xFF,
+ 0xA6, 0xFF, 0x13, 0x00, 0xC1, 0xFF, 0xA6, 0xFF,
+ 0x16, 0x00, 0xAE, 0xFF, 0x87, 0xFF, 0x18, 0x00,
+ 0x9C, 0xFF, 0x6E, 0xFF, 0x1A, 0x00, 0x8A, 0xFF,
+ 0x4E, 0xFF, 0x1C, 0x00, 0x78, 0xFF, 0x29, 0xFF,
+ 0x15, 0x00, 0x09, 0x00, 0x95, 0xFF, 0x15, 0x00,
+ 0x1B, 0x00, 0x95, 0xFF, 0x15, 0x00, 0x2D, 0x00,
+ 0x95, 0xFF, 0x15, 0x00, 0x3F, 0x00, 0x95, 0xFF,
+ 0x18, 0x00, 0x52, 0x00, 0x71, 0xFF, 0x1A, 0x00,
+ 0x64, 0x00, 0x53, 0xFF, 0x1C, 0x00, 0x76, 0x00,
+ 0x2D, 0xFF, 0x1E, 0x00, 0x88, 0x00, 0x02, 0xFF,
+ 0x15, 0x00, 0xF7, 0xFF, 0x95, 0xFF, 0x15, 0x00,
+ 0xE5, 0xFF, 0x95, 0xFF, 0x15, 0x00, 0xD3, 0xFF,
+ 0x95, 0xFF, 0x15, 0x00, 0xC1, 0xFF, 0x95, 0xFF,
+ 0x18, 0x00, 0xAE, 0xFF, 0x71, 0xFF, 0x1A, 0x00,
+ 0x9C, 0xFF, 0x53, 0xFF, 0x1C, 0x00, 0x8A, 0xFF,
+ 0x2D, 0xFF, 0x1E, 0x00, 0x78, 0xFF, 0x02, 0xFF,
+ 0x17, 0x00, 0x09, 0x00, 0x85, 0xFF, 0x17, 0x00,
+ 0x1B, 0x00, 0x85, 0xFF, 0x17, 0x00, 0x2D, 0x00,
+ 0x85, 0xFF, 0x17, 0x00, 0x3F, 0x00, 0x85, 0xFF,
+ 0x1A, 0x00, 0x52, 0x00, 0x5B, 0xFF, 0x1C, 0x00,
+ 0x64, 0x00, 0x39, 0xFF, 0x1E, 0x00, 0x76, 0x00,
+ 0x0D, 0xFF, 0x20, 0x00, 0x88, 0x00, 0xDB, 0xFE,
+ 0x17, 0x00, 0xF7, 0xFF, 0x85, 0xFF, 0x17, 0x00,
+ 0xE5, 0xFF, 0x85, 0xFF, 0x17, 0x00, 0xD3, 0xFF,
+ 0x85, 0xFF, 0x17, 0x00, 0xC1, 0xFF, 0x85, 0xFF,
+ 0x1A, 0x00, 0xAE, 0xFF, 0x5B, 0xFF, 0x1C, 0x00,
+ 0x9C, 0xFF, 0x39, 0xFF, 0x1E, 0x00, 0x8A, 0xFF,
+ 0x0D, 0xFF, 0x20, 0x00, 0x78, 0xFF, 0xDB, 0xFE,
+ 0x0F, 0x00, 0x0A, 0x00, 0x09, 0x00, 0x0F, 0x00,
+ 0x1E, 0x00, 0x09, 0x00, 0x0F, 0x00, 0x32, 0x00,
+ 0x09, 0x00, 0x0F, 0x00, 0x46, 0x00, 0x09, 0x00,
+ 0x12, 0x00, 0x5A, 0x00, 0x0C, 0x00, 0x14, 0x00,
+ 0x6E, 0x00, 0x0E, 0x00, 0x16, 0x00, 0x82, 0x00,
+ 0x11, 0x00, 0x18, 0x00, 0x96, 0x00, 0x15, 0x00,
+ 0x0F, 0x00, 0xF6, 0xFF, 0x09, 0x00, 0x0F, 0x00,
+ 0xE2, 0xFF, 0x09, 0x00, 0x0F, 0x00, 0xCE, 0xFF,
+ 0x09, 0x00, 0x0F, 0x00, 0xBA, 0xFF, 0x09, 0x00,
+ 0x12, 0x00, 0xA6, 0xFF, 0x0C, 0x00, 0x14, 0x00,
+ 0x92, 0xFF, 0x0E, 0x00, 0x16, 0x00, 0x7E, 0xFF,
+ 0x11, 0x00, 0x18, 0x00, 0x6A, 0xFF, 0x15, 0x00,
+ 0x0F, 0x00, 0x0A, 0x00, 0x1B, 0x00, 0x0F, 0x00,
+ 0x1E, 0x00, 0x1B, 0x00, 0x0F, 0x00, 0x32, 0x00,
+ 0x1B, 0x00, 0x0F, 0x00, 0x46, 0x00, 0x1B, 0x00,
+ 0x12, 0x00, 0x5A, 0x00, 0x24, 0x00, 0x14, 0x00,
+ 0x6E, 0x00, 0x2B, 0x00, 0x16, 0x00, 0x82, 0x00,
+ 0x34, 0x00, 0x18, 0x00, 0x96, 0x00, 0x40, 0x00,
+ 0x0F, 0x00, 0xF6, 0xFF, 0x1B, 0x00, 0x0F, 0x00,
+ 0xE2, 0xFF, 0x1B, 0x00, 0x0F, 0x00, 0xCE, 0xFF,
+ 0x1B, 0x00, 0x0F, 0x00, 0xBA, 0xFF, 0x1B, 0x00,
+ 0x12, 0x00, 0xA6, 0xFF, 0x24, 0x00, 0x14, 0x00,
+ 0x92, 0xFF, 0x2B, 0x00, 0x16, 0x00, 0x7E, 0xFF,
+ 0x34, 0x00, 0x18, 0x00, 0x6A, 0xFF, 0x40, 0x00,
+ 0x0F, 0x00, 0x0A, 0x00, 0x2D, 0x00, 0x0F, 0x00,
+ 0x1E, 0x00, 0x2D, 0x00, 0x0F, 0x00, 0x32, 0x00,
+ 0x2D, 0x00, 0x0F, 0x00, 0x46, 0x00, 0x2D, 0x00,
+ 0x12, 0x00, 0x5A, 0x00, 0x3C, 0x00, 0x14, 0x00,
+ 0x6E, 0x00, 0x49, 0x00, 0x16, 0x00, 0x82, 0x00,
+ 0x58, 0x00, 0x18, 0x00, 0x96, 0x00, 0x6B, 0x00,
+ 0x0F, 0x00, 0xF6, 0xFF, 0x2D, 0x00, 0x0F, 0x00,
+ 0xE2, 0xFF, 0x2D, 0x00, 0x0F, 0x00, 0xCE, 0xFF,
+ 0x2D, 0x00, 0x0F, 0x00, 0xBA, 0xFF, 0x2D, 0x00,
+ 0x12, 0x00, 0xA6, 0xFF, 0x3C, 0x00, 0x14, 0x00,
+ 0x92, 0xFF, 0x49, 0x00, 0x16, 0x00, 0x7E, 0xFF,
+ 0x58, 0x00, 0x18, 0x00, 0x6A, 0xFF, 0x6B, 0x00,
+ 0x0F, 0x00, 0x0A, 0x00, 0x3F, 0x00, 0x0F, 0x00,
+ 0x1E, 0x00, 0x3F, 0x00, 0x0F, 0x00, 0x32, 0x00,
+ 0x3F, 0x00, 0x0F, 0x00, 0x46, 0x00, 0x3F, 0x00,
+ 0x12, 0x00, 0x5A, 0x00, 0x54, 0x00, 0x14, 0x00,
+ 0x6E, 0x00, 0x66, 0x00, 0x16, 0x00, 0x82, 0x00,
+ 0x7B, 0x00, 0x18, 0x00, 0x96, 0x00, 0x96, 0x00,
+ 0x0F, 0x00, 0xF6, 0xFF, 0x3F, 0x00, 0x0F, 0x00,
+ 0xE2, 0xFF, 0x3F, 0x00, 0x0F, 0x00, 0xCE, 0xFF,
+ 0x3F, 0x00, 0x0F, 0x00, 0xBA, 0xFF, 0x3F, 0x00,
+ 0x12, 0x00, 0xA6, 0xFF, 0x54, 0x00, 0x14, 0x00,
+ 0x92, 0xFF, 0x66, 0x00, 0x16, 0x00, 0x7E, 0xFF,
+ 0x7B, 0x00, 0x18, 0x00, 0x6A, 0xFF, 0x96, 0x00,
+ 0x12, 0x00, 0x0A, 0x00, 0x52, 0x00, 0x12, 0x00,
+ 0x1E, 0x00, 0x52, 0x00, 0x12, 0x00, 0x32, 0x00,
+ 0x52, 0x00, 0x12, 0x00, 0x46, 0x00, 0x52, 0x00,
+ 0x15, 0x00, 0x5A, 0x00, 0x6D, 0x00, 0x17, 0x00,
+ 0x6E, 0x00, 0x84, 0x00, 0x19, 0x00, 0x82, 0x00,
+ 0xA0, 0x00, 0x1B, 0x00, 0x96, 0x00, 0xC2, 0x00,
+ 0x12, 0x00, 0xF6, 0xFF, 0x52, 0x00, 0x12, 0x00,
+ 0xE2, 0xFF, 0x52, 0x00, 0x12, 0x00, 0xCE, 0xFF,
+ 0x52, 0x00, 0x12, 0x00, 0xBA, 0xFF, 0x52, 0x00,
+ 0x15, 0x00, 0xA6, 0xFF, 0x6D, 0x00, 0x17, 0x00,
+ 0x92, 0xFF, 0x84, 0x00, 0x19, 0x00, 0x7E, 0xFF,
+ 0xA0, 0x00, 0x1B, 0x00, 0x6A, 0xFF, 0xC2, 0x00,
+ 0x14, 0x00, 0x0A, 0x00, 0x64, 0x00, 0x14, 0x00,
+ 0x1E, 0x00, 0x64, 0x00, 0x14, 0x00, 0x32, 0x00,
+ 0x64, 0x00, 0x14, 0x00, 0x46, 0x00, 0x64, 0x00,
+ 0x17, 0x00, 0x5A, 0x00, 0x85, 0x00, 0x19, 0x00,
+ 0x6E, 0x00, 0xA1, 0x00, 0x1B, 0x00, 0x82, 0x00,
+ 0xC3, 0x00, 0x1D, 0x00, 0x96, 0x00, 0xED, 0x00,
+ 0x14, 0x00, 0xF6, 0xFF, 0x64, 0x00, 0x14, 0x00,
+ 0xE2, 0xFF, 0x64, 0x00, 0x14, 0x00, 0xCE, 0xFF,
+ 0x64, 0x00, 0x14, 0x00, 0xBA, 0xFF, 0x64, 0x00,
+ 0x17, 0x00, 0xA6, 0xFF, 0x85, 0x00, 0x19, 0x00,
+ 0x92, 0xFF, 0xA1, 0x00, 0x1B, 0x00, 0x7E, 0xFF,
+ 0xC3, 0x00, 0x1D, 0x00, 0x6A, 0xFF, 0xED, 0x00,
+ 0x16, 0x00, 0x0A, 0x00, 0x76, 0x00, 0x16, 0x00,
+ 0x1E, 0x00, 0x76, 0x00, 0x16, 0x00, 0x32, 0x00,
+ 0x76, 0x00, 0x16, 0x00, 0x46, 0x00, 0x76, 0x00,
+ 0x19, 0x00, 0x5A, 0x00, 0x9D, 0x00, 0x1B, 0x00,
+ 0x6E, 0x00, 0xBF, 0x00, 0x1D, 0x00, 0x82, 0x00,
+ 0xE7, 0x00, 0x1F, 0x00, 0x96, 0x00, 0x18, 0x01,
+ 0x16, 0x00, 0xF6, 0xFF, 0x76, 0x00, 0x16, 0x00,
+ 0xE2, 0xFF, 0x76, 0x00, 0x16, 0x00, 0xCE, 0xFF,
+ 0x76, 0x00, 0x16, 0x00, 0xBA, 0xFF, 0x76, 0x00,
+ 0x19, 0x00, 0xA6, 0xFF, 0x9D, 0x00, 0x1B, 0x00,
+ 0x92, 0xFF, 0xBF, 0x00, 0x1D, 0x00, 0x7E, 0xFF,
+ 0xE7, 0x00, 0x1F, 0x00, 0x6A, 0xFF, 0x18, 0x01,
+ 0x18, 0x00, 0x0A, 0x00, 0x88, 0x00, 0x18, 0x00,
+ 0x1E, 0x00, 0x88, 0x00, 0x18, 0x00, 0x32, 0x00,
+ 0x88, 0x00, 0x18, 0x00, 0x46, 0x00, 0x88, 0x00,
+ 0x1B, 0x00, 0x5A, 0x00, 0xB5, 0x00, 0x1D, 0x00,
+ 0x6E, 0x00, 0xDC, 0x00, 0x1F, 0x00, 0x82, 0x00,
+ 0x0A, 0x01, 0x21, 0x00, 0x96, 0x00, 0x43, 0x01,
+ 0x18, 0x00, 0xF6, 0xFF, 0x88, 0x00, 0x18, 0x00,
+ 0xE2, 0xFF, 0x88, 0x00, 0x18, 0x00, 0xCE, 0xFF,
+ 0x88, 0x00, 0x18, 0x00, 0xBA, 0xFF, 0x88, 0x00,
+ 0x1B, 0x00, 0xA6, 0xFF, 0xB5, 0x00, 0x1D, 0x00,
+ 0x92, 0xFF, 0xDC, 0x00, 0x1F, 0x00, 0x7E, 0xFF,
+ 0x0A, 0x01, 0x21, 0x00, 0x6A, 0xFF, 0x43, 0x01,
+ 0x0F, 0x00, 0x0A, 0x00, 0xF7, 0xFF, 0x0F, 0x00,
+ 0x1E, 0x00, 0xF7, 0xFF, 0x0F, 0x00, 0x32, 0x00,
+ 0xF7, 0xFF, 0x0F, 0x00, 0x46, 0x00, 0xF7, 0xFF,
+ 0x12, 0x00, 0x5A, 0x00, 0xF4, 0xFF, 0x14, 0x00,
+ 0x6E, 0x00, 0xF2, 0xFF, 0x16, 0x00, 0x82, 0x00,
+ 0xEF, 0xFF, 0x18, 0x00, 0x96, 0x00, 0xEB, 0xFF,
+ 0x0F, 0x00, 0xF6, 0xFF, 0xF7, 0xFF, 0x0F, 0x00,
+ 0xE2, 0xFF, 0xF7, 0xFF, 0x0F, 0x00, 0xCE, 0xFF,
+ 0xF7, 0xFF, 0x0F, 0x00, 0xBA, 0xFF, 0xF7, 0xFF,
+ 0x12, 0x00, 0xA6, 0xFF, 0xF4, 0xFF, 0x14, 0x00,
+ 0x92, 0xFF, 0xF2, 0xFF, 0x16, 0x00, 0x7E, 0xFF,
+ 0xEF, 0xFF, 0x18, 0x00, 0x6A, 0xFF, 0xEB, 0xFF,
+ 0x0F, 0x00, 0x0A, 0x00, 0xE5, 0xFF, 0x0F, 0x00,
+ 0x1E, 0x00, 0xE5, 0xFF, 0x0F, 0x00, 0x32, 0x00,
+ 0xE5, 0xFF, 0x0F, 0x00, 0x46, 0x00, 0xE5, 0xFF,
+ 0x12, 0x00, 0x5A, 0x00, 0xDC, 0xFF, 0x14, 0x00,
+ 0x6E, 0x00, 0xD5, 0xFF, 0x16, 0x00, 0x82, 0x00,
+ 0xCC, 0xFF, 0x18, 0x00, 0x96, 0x00, 0xC0, 0xFF,
+ 0x0F, 0x00, 0xF6, 0xFF, 0xE5, 0xFF, 0x0F, 0x00,
+ 0xE2, 0xFF, 0xE5, 0xFF, 0x0F, 0x00, 0xCE, 0xFF,
+ 0xE5, 0xFF, 0x0F, 0x00, 0xBA, 0xFF, 0xE5, 0xFF,
+ 0x12, 0x00, 0xA6, 0xFF, 0xDC, 0xFF, 0x14, 0x00,
+ 0x92, 0xFF, 0xD5, 0xFF, 0x16, 0x00, 0x7E, 0xFF,
+ 0xCC, 0xFF, 0x18, 0x00, 0x6A, 0xFF, 0xC0, 0xFF,
+ 0x0F, 0x00, 0x0A, 0x00, 0xD3, 0xFF, 0x0F, 0x00,
+ 0x1E, 0x00, 0xD3, 0xFF, 0x0F, 0x00, 0x32, 0x00,
+ 0xD3, 0xFF, 0x0F, 0x00, 0x46, 0x00, 0xD3, 0xFF,
+ 0x12, 0x00, 0x5A, 0x00, 0xC4, 0xFF, 0x14, 0x00,
+ 0x6E, 0x00, 0xB7, 0xFF, 0x16, 0x00, 0x82, 0x00,
+ 0xA8, 0xFF, 0x18, 0x00, 0x96, 0x00, 0x95, 0xFF,
+ 0x0F, 0x00, 0xF6, 0xFF, 0xD3, 0xFF, 0x0F, 0x00,
+ 0xE2, 0xFF, 0xD3, 0xFF, 0x0F, 0x00, 0xCE, 0xFF,
+ 0xD3, 0xFF, 0x0F, 0x00, 0xBA, 0xFF, 0xD3, 0xFF,
+ 0x12, 0x00, 0xA6, 0xFF, 0xC4, 0xFF, 0x14, 0x00,
+ 0x92, 0xFF, 0xB7, 0xFF, 0x16, 0x00, 0x7E, 0xFF,
+ 0xA8, 0xFF, 0x18, 0x00, 0x6A, 0xFF, 0x95, 0xFF,
+ 0x0F, 0x00, 0x0A, 0x00, 0xC1, 0xFF, 0x0F, 0x00,
+ 0x1E, 0x00, 0xC1, 0xFF, 0x0F, 0x00, 0x32, 0x00,
+ 0xC1, 0xFF, 0x0F, 0x00, 0x46, 0x00, 0xC1, 0xFF,
+ 0x12, 0x00, 0x5A, 0x00, 0xAC, 0xFF, 0x14, 0x00,
+ 0x6E, 0x00, 0x9A, 0xFF, 0x16, 0x00, 0x82, 0x00,
+ 0x85, 0xFF, 0x18, 0x00, 0x96, 0x00, 0x6A, 0xFF,
+ 0x0F, 0x00, 0xF6, 0xFF, 0xC1, 0xFF, 0x0F, 0x00,
+ 0xE2, 0xFF, 0xC1, 0xFF, 0x0F, 0x00, 0xCE, 0xFF,
+ 0xC1, 0xFF, 0x0F, 0x00, 0xBA, 0xFF, 0xC1, 0xFF,
+ 0x12, 0x00, 0xA6, 0xFF, 0xAC, 0xFF, 0x14, 0x00,
+ 0x92, 0xFF, 0x9A, 0xFF, 0x16, 0x00, 0x7E, 0xFF,
+ 0x85, 0xFF, 0x18, 0x00, 0x6A, 0xFF, 0x6A, 0xFF,
+ 0x12, 0x00, 0x0A, 0x00, 0xAE, 0xFF, 0x12, 0x00,
+ 0x1E, 0x00, 0xAE, 0xFF, 0x12, 0x00, 0x32, 0x00,
+ 0xAE, 0xFF, 0x12, 0x00, 0x46, 0x00, 0xAE, 0xFF,
+ 0x15, 0x00, 0x5A, 0x00, 0x93, 0xFF, 0x17, 0x00,
+ 0x6E, 0x00, 0x7C, 0xFF, 0x19, 0x00, 0x82, 0x00,
+ 0x60, 0xFF, 0x1B, 0x00, 0x96, 0x00, 0x3E, 0xFF,
+ 0x12, 0x00, 0xF6, 0xFF, 0xAE, 0xFF, 0x12, 0x00,
+ 0xE2, 0xFF, 0xAE, 0xFF, 0x12, 0x00, 0xCE, 0xFF,
+ 0xAE, 0xFF, 0x12, 0x00, 0xBA, 0xFF, 0xAE, 0xFF,
+ 0x15, 0x00, 0xA6, 0xFF, 0x93, 0xFF, 0x17, 0x00,
+ 0x92, 0xFF, 0x7C, 0xFF, 0x19, 0x00, 0x7E, 0xFF,
+ 0x60, 0xFF, 0x1B, 0x00, 0x6A, 0xFF, 0x3E, 0xFF,
+ 0x14, 0x00, 0x0A, 0x00, 0x9C, 0xFF, 0x14, 0x00,
+ 0x1E, 0x00, 0x9C, 0xFF, 0x14, 0x00, 0x32, 0x00,
+ 0x9C, 0xFF, 0x14, 0x00, 0x46, 0x00, 0x9C, 0xFF,
+ 0x17, 0x00, 0x5A, 0x00, 0x7B, 0xFF, 0x19, 0x00,
+ 0x6E, 0x00, 0x5F, 0xFF, 0x1B, 0x00, 0x82, 0x00,
+ 0x3D, 0xFF, 0x1D, 0x00, 0x96, 0x00, 0x13, 0xFF,
+ 0x14, 0x00, 0xF6, 0xFF, 0x9C, 0xFF, 0x14, 0x00,
+ 0xE2, 0xFF, 0x9C, 0xFF, 0x14, 0x00, 0xCE, 0xFF,
+ 0x9C, 0xFF, 0x14, 0x00, 0xBA, 0xFF, 0x9C, 0xFF,
+ 0x17, 0x00, 0xA6, 0xFF, 0x7B, 0xFF, 0x19, 0x00,
+ 0x92, 0xFF, 0x5F, 0xFF, 0x1B, 0x00, 0x7E, 0xFF,
+ 0x3D, 0xFF, 0x1D, 0x00, 0x6A, 0xFF, 0x13, 0xFF,
+ 0x16, 0x00, 0x0A, 0x00, 0x8A, 0xFF, 0x16, 0x00,
+ 0x1E, 0x00, 0x8A, 0xFF, 0x16, 0x00, 0x32, 0x00,
+ 0x8A, 0xFF, 0x16, 0x00, 0x46, 0x00, 0x8A, 0xFF,
+ 0x19, 0x00, 0x5A, 0x00, 0x63, 0xFF, 0x1B, 0x00,
+ 0x6E, 0x00, 0x41, 0xFF, 0x1D, 0x00, 0x82, 0x00,
+ 0x19, 0xFF, 0x1F, 0x00, 0x96, 0x00, 0xE8, 0xFE,
+ 0x16, 0x00, 0xF6, 0xFF, 0x8A, 0xFF, 0x16, 0x00,
+ 0xE2, 0xFF, 0x8A, 0xFF, 0x16, 0x00, 0xCE, 0xFF,
+ 0x8A, 0xFF, 0x16, 0x00, 0xBA, 0xFF, 0x8A, 0xFF,
+ 0x19, 0x00, 0xA6, 0xFF, 0x63, 0xFF, 0x1B, 0x00,
+ 0x92, 0xFF, 0x41, 0xFF, 0x1D, 0x00, 0x7E, 0xFF,
+ 0x19, 0xFF, 0x1F, 0x00, 0x6A, 0xFF, 0xE8, 0xFE,
+ 0x18, 0x00, 0x0A, 0x00, 0x78, 0xFF, 0x18, 0x00,
+ 0x1E, 0x00, 0x78, 0xFF, 0x18, 0x00, 0x32, 0x00,
+ 0x78, 0xFF, 0x18, 0x00, 0x46, 0x00, 0x78, 0xFF,
+ 0x1B, 0x00, 0x5A, 0x00, 0x4B, 0xFF, 0x1D, 0x00,
+ 0x6E, 0x00, 0x24, 0xFF, 0x1F, 0x00, 0x82, 0x00,
+ 0xF6, 0xFE, 0x21, 0x00, 0x96, 0x00, 0xBD, 0xFE,
+ 0x18, 0x00, 0xF6, 0xFF, 0x78, 0xFF, 0x18, 0x00,
+ 0xE2, 0xFF, 0x78, 0xFF, 0x18, 0x00, 0xCE, 0xFF,
+ 0x78, 0xFF, 0x18, 0x00, 0xBA, 0xFF, 0x78, 0xFF,
+ 0x1B, 0x00, 0xA6, 0xFF, 0x4B, 0xFF, 0x1D, 0x00,
+ 0x92, 0xFF, 0x24, 0xFF, 0x1F, 0x00, 0x7E, 0xFF,
+ 0xF6, 0xFE, 0x21, 0x00, 0x6A, 0xFF, 0xBD, 0xFE,
+ 0x10, 0x00, 0x0B, 0x00, 0x0A, 0x00, 0x10, 0x00,
+ 0x21, 0x00, 0x0A, 0x00, 0x10, 0x00, 0x37, 0x00,
+ 0x0A, 0x00, 0x10, 0x00, 0x4D, 0x00, 0x0A, 0x00,
+ 0x13, 0x00, 0x63, 0x00, 0x0D, 0x00, 0x15, 0x00,
+ 0x79, 0x00, 0x10, 0x00, 0x17, 0x00, 0x8F, 0x00,
+ 0x13, 0x00, 0x19, 0x00, 0xA5, 0x00, 0x17, 0x00,
+ 0x10, 0x00, 0xF5, 0xFF, 0x0A, 0x00, 0x10, 0x00,
+ 0xDF, 0xFF, 0x0A, 0x00, 0x10, 0x00, 0xC9, 0xFF,
+ 0x0A, 0x00, 0x10, 0x00, 0xB3, 0xFF, 0x0A, 0x00,
+ 0x13, 0x00, 0x9D, 0xFF, 0x0D, 0x00, 0x15, 0x00,
+ 0x87, 0xFF, 0x10, 0x00, 0x17, 0x00, 0x71, 0xFF,
+ 0x13, 0x00, 0x19, 0x00, 0x5B, 0xFF, 0x17, 0x00,
+ 0x10, 0x00, 0x0B, 0x00, 0x1E, 0x00, 0x10, 0x00,
+ 0x21, 0x00, 0x1E, 0x00, 0x10, 0x00, 0x37, 0x00,
+ 0x1E, 0x00, 0x10, 0x00, 0x4D, 0x00, 0x1E, 0x00,
+ 0x13, 0x00, 0x63, 0x00, 0x27, 0x00, 0x15, 0x00,
+ 0x79, 0x00, 0x30, 0x00, 0x17, 0x00, 0x8F, 0x00,
+ 0x3A, 0x00, 0x19, 0x00, 0xA5, 0x00, 0x46, 0x00,
+ 0x10, 0x00, 0xF5, 0xFF, 0x1E, 0x00, 0x10, 0x00,
+ 0xDF, 0xFF, 0x1E, 0x00, 0x10, 0x00, 0xC9, 0xFF,
+ 0x1E, 0x00, 0x10, 0x00, 0xB3, 0xFF, 0x1E, 0x00,
+ 0x13, 0x00, 0x9D, 0xFF, 0x27, 0x00, 0x15, 0x00,
+ 0x87, 0xFF, 0x30, 0x00, 0x17, 0x00, 0x71, 0xFF,
+ 0x3A, 0x00, 0x19, 0x00, 0x5B, 0xFF, 0x46, 0x00,
+ 0x10, 0x00, 0x0B, 0x00, 0x32, 0x00, 0x10, 0x00,
+ 0x21, 0x00, 0x32, 0x00, 0x10, 0x00, 0x37, 0x00,
+ 0x32, 0x00, 0x10, 0x00, 0x4D, 0x00, 0x32, 0x00,
+ 0x13, 0x00, 0x63, 0x00, 0x42, 0x00, 0x15, 0x00,
+ 0x79, 0x00, 0x51, 0x00, 0x17, 0x00, 0x8F, 0x00,
+ 0x61, 0x00, 0x19, 0x00, 0xA5, 0x00, 0x76, 0x00,
+ 0x10, 0x00, 0xF5, 0xFF, 0x32, 0x00, 0x10, 0x00,
+ 0xDF, 0xFF, 0x32, 0x00, 0x10, 0x00, 0xC9, 0xFF,
+ 0x32, 0x00, 0x10, 0x00, 0xB3, 0xFF, 0x32, 0x00,
+ 0x13, 0x00, 0x9D, 0xFF, 0x42, 0x00, 0x15, 0x00,
+ 0x87, 0xFF, 0x51, 0x00, 0x17, 0x00, 0x71, 0xFF,
+ 0x61, 0x00, 0x19, 0x00, 0x5B, 0xFF, 0x76, 0x00,
+ 0x10, 0x00, 0x0B, 0x00, 0x46, 0x00, 0x10, 0x00,
+ 0x21, 0x00, 0x46, 0x00, 0x10, 0x00, 0x37, 0x00,
+ 0x46, 0x00, 0x10, 0x00, 0x4D, 0x00, 0x46, 0x00,
+ 0x13, 0x00, 0x63, 0x00, 0x5C, 0x00, 0x15, 0x00,
+ 0x79, 0x00, 0x71, 0x00, 0x17, 0x00, 0x8F, 0x00,
+ 0x88, 0x00, 0x19, 0x00, 0xA5, 0x00, 0xA5, 0x00,
+ 0x10, 0x00, 0xF5, 0xFF, 0x46, 0x00, 0x10, 0x00,
+ 0xDF, 0xFF, 0x46, 0x00, 0x10, 0x00, 0xC9, 0xFF,
+ 0x46, 0x00, 0x10, 0x00, 0xB3, 0xFF, 0x46, 0x00,
+ 0x13, 0x00, 0x9D, 0xFF, 0x5C, 0x00, 0x15, 0x00,
+ 0x87, 0xFF, 0x71, 0x00, 0x17, 0x00, 0x71, 0xFF,
+ 0x88, 0x00, 0x19, 0x00, 0x5B, 0xFF, 0xA5, 0x00,
+ 0x13, 0x00, 0x0B, 0x00, 0x5A, 0x00, 0x13, 0x00,
+ 0x21, 0x00, 0x5A, 0x00, 0x13, 0x00, 0x37, 0x00,
+ 0x5A, 0x00, 0x13, 0x00, 0x4D, 0x00, 0x5A, 0x00,
+ 0x16, 0x00, 0x63, 0x00, 0x78, 0x00, 0x18, 0x00,
+ 0x79, 0x00, 0x92, 0x00, 0x1A, 0x00, 0x8F, 0x00,
+ 0xB0, 0x00, 0x1C, 0x00, 0xA5, 0x00, 0xD5, 0x00,
+ 0x13, 0x00, 0xF5, 0xFF, 0x5A, 0x00, 0x13, 0x00,
+ 0xDF, 0xFF, 0x5A, 0x00, 0x13, 0x00, 0xC9, 0xFF,
+ 0x5A, 0x00, 0x13, 0x00, 0xB3, 0xFF, 0x5A, 0x00,
+ 0x16, 0x00, 0x9D, 0xFF, 0x78, 0x00, 0x18, 0x00,
+ 0x87, 0xFF, 0x92, 0x00, 0x1A, 0x00, 0x71, 0xFF,
+ 0xB0, 0x00, 0x1C, 0x00, 0x5B, 0xFF, 0xD5, 0x00,
+ 0x15, 0x00, 0x0B, 0x00, 0x6E, 0x00, 0x15, 0x00,
+ 0x21, 0x00, 0x6E, 0x00, 0x15, 0x00, 0x37, 0x00,
+ 0x6E, 0x00, 0x15, 0x00, 0x4D, 0x00, 0x6E, 0x00,
+ 0x18, 0x00, 0x63, 0x00, 0x92, 0x00, 0x1A, 0x00,
+ 0x79, 0x00, 0xB2, 0x00, 0x1C, 0x00, 0x8F, 0x00,
+ 0xD7, 0x00, 0x1E, 0x00, 0xA5, 0x00, 0x04, 0x01,
+ 0x15, 0x00, 0xF5, 0xFF, 0x6E, 0x00, 0x15, 0x00,
+ 0xDF, 0xFF, 0x6E, 0x00, 0x15, 0x00, 0xC9, 0xFF,
+ 0x6E, 0x00, 0x15, 0x00, 0xB3, 0xFF, 0x6E, 0x00,
+ 0x18, 0x00, 0x9D, 0xFF, 0x92, 0x00, 0x1A, 0x00,
+ 0x87, 0xFF, 0xB2, 0x00, 0x1C, 0x00, 0x71, 0xFF,
+ 0xD7, 0x00, 0x1E, 0x00, 0x5B, 0xFF, 0x04, 0x01,
+ 0x17, 0x00, 0x0B, 0x00, 0x82, 0x00, 0x17, 0x00,
+ 0x21, 0x00, 0x82, 0x00, 0x17, 0x00, 0x37, 0x00,
+ 0x82, 0x00, 0x17, 0x00, 0x4D, 0x00, 0x82, 0x00,
+ 0x1A, 0x00, 0x63, 0x00, 0xAD, 0x00, 0x1C, 0x00,
+ 0x79, 0x00, 0xD3, 0x00, 0x1E, 0x00, 0x8F, 0x00,
+ 0xFE, 0x00, 0x20, 0x00, 0xA5, 0x00, 0x34, 0x01,
+ 0x17, 0x00, 0xF5, 0xFF, 0x82, 0x00, 0x17, 0x00,
+ 0xDF, 0xFF, 0x82, 0x00, 0x17, 0x00, 0xC9, 0xFF,
+ 0x82, 0x00, 0x17, 0x00, 0xB3, 0xFF, 0x82, 0x00,
+ 0x1A, 0x00, 0x9D, 0xFF, 0xAD, 0x00, 0x1C, 0x00,
+ 0x87, 0xFF, 0xD3, 0x00, 0x1E, 0x00, 0x71, 0xFF,
+ 0xFE, 0x00, 0x20, 0x00, 0x5B, 0xFF, 0x34, 0x01,
+ 0x19, 0x00, 0x0B, 0x00, 0x96, 0x00, 0x19, 0x00,
+ 0x21, 0x00, 0x96, 0x00, 0x19, 0x00, 0x37, 0x00,
+ 0x96, 0x00, 0x19, 0x00, 0x4D, 0x00, 0x96, 0x00,
+ 0x1C, 0x00, 0x63, 0x00, 0xC7, 0x00, 0x1E, 0x00,
+ 0x79, 0x00, 0xF3, 0x00, 0x20, 0x00, 0x8F, 0x00,
+ 0x25, 0x01, 0x22, 0x00, 0xA5, 0x00, 0x63, 0x01,
+ 0x19, 0x00, 0xF5, 0xFF, 0x96, 0x00, 0x19, 0x00,
+ 0xDF, 0xFF, 0x96, 0x00, 0x19, 0x00, 0xC9, 0xFF,
+ 0x96, 0x00, 0x19, 0x00, 0xB3, 0xFF, 0x96, 0x00,
+ 0x1C, 0x00, 0x9D, 0xFF, 0xC7, 0x00, 0x1E, 0x00,
+ 0x87, 0xFF, 0xF3, 0x00, 0x20, 0x00, 0x71, 0xFF,
+ 0x25, 0x01, 0x22, 0x00, 0x5B, 0xFF, 0x63, 0x01,
+ 0x10, 0x00, 0x0B, 0x00, 0xF6, 0xFF, 0x10, 0x00,
+ 0x21, 0x00, 0xF6, 0xFF, 0x10, 0x00, 0x37, 0x00,
+ 0xF6, 0xFF, 0x10, 0x00, 0x4D, 0x00, 0xF6, 0xFF,
+ 0x13, 0x00, 0x63, 0x00, 0xF3, 0xFF, 0x15, 0x00,
+ 0x79, 0x00, 0xF0, 0xFF, 0x17, 0x00, 0x8F, 0x00,
+ 0xED, 0xFF, 0x19, 0x00, 0xA5, 0x00, 0xE9, 0xFF,
+ 0x10, 0x00, 0xF5, 0xFF, 0xF6, 0xFF, 0x10, 0x00,
+ 0xDF, 0xFF, 0xF6, 0xFF, 0x10, 0x00, 0xC9, 0xFF,
+ 0xF6, 0xFF, 0x10, 0x00, 0xB3, 0xFF, 0xF6, 0xFF,
+ 0x13, 0x00, 0x9D, 0xFF, 0xF3, 0xFF, 0x15, 0x00,
+ 0x87, 0xFF, 0xF0, 0xFF, 0x17, 0x00, 0x71, 0xFF,
+ 0xED, 0xFF, 0x19, 0x00, 0x5B, 0xFF, 0xE9, 0xFF,
+ 0x10, 0x00, 0x0B, 0x00, 0xE2, 0xFF, 0x10, 0x00,
+ 0x21, 0x00, 0xE2, 0xFF, 0x10, 0x00, 0x37, 0x00,
+ 0xE2, 0xFF, 0x10, 0x00, 0x4D, 0x00, 0xE2, 0xFF,
+ 0x13, 0x00, 0x63, 0x00, 0xD9, 0xFF, 0x15, 0x00,
+ 0x79, 0x00, 0xD0, 0xFF, 0x17, 0x00, 0x8F, 0x00,
+ 0xC6, 0xFF, 0x19, 0x00, 0xA5, 0x00, 0xBA, 0xFF,
+ 0x10, 0x00, 0xF5, 0xFF, 0xE2, 0xFF, 0x10, 0x00,
+ 0xDF, 0xFF, 0xE2, 0xFF, 0x10, 0x00, 0xC9, 0xFF,
+ 0xE2, 0xFF, 0x10, 0x00, 0xB3, 0xFF, 0xE2, 0xFF,
+ 0x13, 0x00, 0x9D, 0xFF, 0xD9, 0xFF, 0x15, 0x00,
+ 0x87, 0xFF, 0xD0, 0xFF, 0x17, 0x00, 0x71, 0xFF,
+ 0xC6, 0xFF, 0x19, 0x00, 0x5B, 0xFF, 0xBA, 0xFF,
+ 0x10, 0x00, 0x0B, 0x00, 0xCE, 0xFF, 0x10, 0x00,
+ 0x21, 0x00, 0xCE, 0xFF, 0x10, 0x00, 0x37, 0x00,
+ 0xCE, 0xFF, 0x10, 0x00, 0x4D, 0x00, 0xCE, 0xFF,
+ 0x13, 0x00, 0x63, 0x00, 0xBE, 0xFF, 0x15, 0x00,
+ 0x79, 0x00, 0xAF, 0xFF, 0x17, 0x00, 0x8F, 0x00,
+ 0x9F, 0xFF, 0x19, 0x00, 0xA5, 0x00, 0x8A, 0xFF,
+ 0x10, 0x00, 0xF5, 0xFF, 0xCE, 0xFF, 0x10, 0x00,
+ 0xDF, 0xFF, 0xCE, 0xFF, 0x10, 0x00, 0xC9, 0xFF,
+ 0xCE, 0xFF, 0x10, 0x00, 0xB3, 0xFF, 0xCE, 0xFF,
+ 0x13, 0x00, 0x9D, 0xFF, 0xBE, 0xFF, 0x15, 0x00,
+ 0x87, 0xFF, 0xAF, 0xFF, 0x17, 0x00, 0x71, 0xFF,
+ 0x9F, 0xFF, 0x19, 0x00, 0x5B, 0xFF, 0x8A, 0xFF,
+ 0x10, 0x00, 0x0B, 0x00, 0xBA, 0xFF, 0x10, 0x00,
+ 0x21, 0x00, 0xBA, 0xFF, 0x10, 0x00, 0x37, 0x00,
+ 0xBA, 0xFF, 0x10, 0x00, 0x4D, 0x00, 0xBA, 0xFF,
+ 0x13, 0x00, 0x63, 0x00, 0xA4, 0xFF, 0x15, 0x00,
+ 0x79, 0x00, 0x8F, 0xFF, 0x17, 0x00, 0x8F, 0x00,
+ 0x78, 0xFF, 0x19, 0x00, 0xA5, 0x00, 0x5B, 0xFF,
+ 0x10, 0x00, 0xF5, 0xFF, 0xBA, 0xFF, 0x10, 0x00,
+ 0xDF, 0xFF, 0xBA, 0xFF, 0x10, 0x00, 0xC9, 0xFF,
+ 0xBA, 0xFF, 0x10, 0x00, 0xB3, 0xFF, 0xBA, 0xFF,
+ 0x13, 0x00, 0x9D, 0xFF, 0xA4, 0xFF, 0x15, 0x00,
+ 0x87, 0xFF, 0x8F, 0xFF, 0x17, 0x00, 0x71, 0xFF,
+ 0x78, 0xFF, 0x19, 0x00, 0x5B, 0xFF, 0x5B, 0xFF,
+ 0x13, 0x00, 0x0B, 0x00, 0xA6, 0xFF, 0x13, 0x00,
+ 0x21, 0x00, 0xA6, 0xFF, 0x13, 0x00, 0x37, 0x00,
+ 0xA6, 0xFF, 0x13, 0x00, 0x4D, 0x00, 0xA6, 0xFF,
+ 0x16, 0x00, 0x63, 0x00, 0x88, 0xFF, 0x18, 0x00,
+ 0x79, 0x00, 0x6E, 0xFF, 0x1A, 0x00, 0x8F, 0x00,
+ 0x50, 0xFF, 0x1C, 0x00, 0xA5, 0x00, 0x2B, 0xFF,
+ 0x13, 0x00, 0xF5, 0xFF, 0xA6, 0xFF, 0x13, 0x00,
+ 0xDF, 0xFF, 0xA6, 0xFF, 0x13, 0x00, 0xC9, 0xFF,
+ 0xA6, 0xFF, 0x13, 0x00, 0xB3, 0xFF, 0xA6, 0xFF,
+ 0x16, 0x00, 0x9D, 0xFF, 0x88, 0xFF, 0x18, 0x00,
+ 0x87, 0xFF, 0x6E, 0xFF, 0x1A, 0x00, 0x71, 0xFF,
+ 0x50, 0xFF, 0x1C, 0x00, 0x5B, 0xFF, 0x2B, 0xFF,
+ 0x15, 0x00, 0x0B, 0x00, 0x92, 0xFF, 0x15, 0x00,
+ 0x21, 0x00, 0x92, 0xFF, 0x15, 0x00, 0x37, 0x00,
+ 0x92, 0xFF, 0x15, 0x00, 0x4D, 0x00, 0x92, 0xFF,
+ 0x18, 0x00, 0x63, 0x00, 0x6E, 0xFF, 0x1A, 0x00,
+ 0x79, 0x00, 0x4E, 0xFF, 0x1C, 0x00, 0x8F, 0x00,
+ 0x29, 0xFF, 0x1E, 0x00, 0xA5, 0x00, 0xFC, 0xFE,
+ 0x15, 0x00, 0xF5, 0xFF, 0x92, 0xFF, 0x15, 0x00,
+ 0xDF, 0xFF, 0x92, 0xFF, 0x15, 0x00, 0xC9, 0xFF,
+ 0x92, 0xFF, 0x15, 0x00, 0xB3, 0xFF, 0x92, 0xFF,
+ 0x18, 0x00, 0x9D, 0xFF, 0x6E, 0xFF, 0x1A, 0x00,
+ 0x87, 0xFF, 0x4E, 0xFF, 0x1C, 0x00, 0x71, 0xFF,
+ 0x29, 0xFF, 0x1E, 0x00, 0x5B, 0xFF, 0xFC, 0xFE,
+ 0x17, 0x00, 0x0B, 0x00, 0x7E, 0xFF, 0x17, 0x00,
+ 0x21, 0x00, 0x7E, 0xFF, 0x17, 0x00, 0x37, 0x00,
+ 0x7E, 0xFF, 0x17, 0x00, 0x4D, 0x00, 0x7E, 0xFF,
+ 0x1A, 0x00, 0x63, 0x00, 0x53, 0xFF, 0x1C, 0x00,
+ 0x79, 0x00, 0x2D, 0xFF, 0x1E, 0x00, 0x8F, 0x00,
+ 0x02, 0xFF, 0x20, 0x00, 0xA5, 0x00, 0xCC, 0xFE,
+ 0x17, 0x00, 0xF5, 0xFF, 0x7E, 0xFF, 0x17, 0x00,
+ 0xDF, 0xFF, 0x7E, 0xFF, 0x17, 0x00, 0xC9, 0xFF,
+ 0x7E, 0xFF, 0x17, 0x00, 0xB3, 0xFF, 0x7E, 0xFF,
+ 0x1A, 0x00, 0x9D, 0xFF, 0x53, 0xFF, 0x1C, 0x00,
+ 0x87, 0xFF, 0x2D, 0xFF, 0x1E, 0x00, 0x71, 0xFF,
+ 0x02, 0xFF, 0x20, 0x00, 0x5B, 0xFF, 0xCC, 0xFE,
+ 0x19, 0x00, 0x0B, 0x00, 0x6A, 0xFF, 0x19, 0x00,
+ 0x21, 0x00, 0x6A, 0xFF, 0x19, 0x00, 0x37, 0x00,
+ 0x6A, 0xFF, 0x19, 0x00, 0x4D, 0x00, 0x6A, 0xFF,
+ 0x1C, 0x00, 0x63, 0x00, 0x39, 0xFF, 0x1E, 0x00,
+ 0x79, 0x00, 0x0D, 0xFF, 0x20, 0x00, 0x8F, 0x00,
+ 0xDB, 0xFE, 0x22, 0x00, 0xA5, 0x00, 0x9D, 0xFE,
+ 0x19, 0x00, 0xF5, 0xFF, 0x6A, 0xFF, 0x19, 0x00,
+ 0xDF, 0xFF, 0x6A, 0xFF, 0x19, 0x00, 0xC9, 0xFF,
+ 0x6A, 0xFF, 0x19, 0x00, 0xB3, 0xFF, 0x6A, 0xFF,
+ 0x1C, 0x00, 0x9D, 0xFF, 0x39, 0xFF, 0x1E, 0x00,
+ 0x87, 0xFF, 0x0D, 0xFF, 0x20, 0x00, 0x71, 0xFF,
+ 0xDB, 0xFE, 0x22, 0x00, 0x5B, 0xFF, 0x9D, 0xFE,
+ 0x11, 0x00, 0x0C, 0x00, 0x0B, 0x00, 0x11, 0x00,
+ 0x24, 0x00, 0x0B, 0x00, 0x11, 0x00, 0x3C, 0x00,
+ 0x0B, 0x00, 0x11, 0x00, 0x54, 0x00, 0x0B, 0x00,
+ 0x14, 0x00, 0x6D, 0x00, 0x0E, 0x00, 0x16, 0x00,
+ 0x85, 0x00, 0x11, 0x00, 0x18, 0x00, 0x9D, 0x00,
+ 0x15, 0x00, 0x1A, 0x00, 0xB5, 0x00, 0x1A, 0x00,
+ 0x11, 0x00, 0xF4, 0xFF, 0x0B, 0x00, 0x11, 0x00,
+ 0xDC, 0xFF, 0x0B, 0x00, 0x11, 0x00, 0xC4, 0xFF,
+ 0x0B, 0x00, 0x11, 0x00, 0xAC, 0xFF, 0x0B, 0x00,
+ 0x14, 0x00, 0x93, 0xFF, 0x0E, 0x00, 0x16, 0x00,
+ 0x7B, 0xFF, 0x11, 0x00, 0x18, 0x00, 0x63, 0xFF,
+ 0x15, 0x00, 0x1A, 0x00, 0x4B, 0xFF, 0x1A, 0x00,
+ 0x11, 0x00, 0x0C, 0x00, 0x21, 0x00, 0x11, 0x00,
+ 0x24, 0x00, 0x21, 0x00, 0x11, 0x00, 0x3C, 0x00,
+ 0x21, 0x00, 0x11, 0x00, 0x54, 0x00, 0x21, 0x00,
+ 0x14, 0x00, 0x6D, 0x00, 0x2B, 0x00, 0x16, 0x00,
+ 0x85, 0x00, 0x34, 0x00, 0x18, 0x00, 0x9D, 0x00,
+ 0x40, 0x00, 0x1A, 0x00, 0xB5, 0x00, 0x4E, 0x00,
+ 0x11, 0x00, 0xF4, 0xFF, 0x21, 0x00, 0x11, 0x00,
+ 0xDC, 0xFF, 0x21, 0x00, 0x11, 0x00, 0xC4, 0xFF,
+ 0x21, 0x00, 0x11, 0x00, 0xAC, 0xFF, 0x21, 0x00,
+ 0x14, 0x00, 0x93, 0xFF, 0x2B, 0x00, 0x16, 0x00,
+ 0x7B, 0xFF, 0x34, 0x00, 0x18, 0x00, 0x63, 0xFF,
+ 0x40, 0x00, 0x1A, 0x00, 0x4B, 0xFF, 0x4E, 0x00,
+ 0x11, 0x00, 0x0C, 0x00, 0x37, 0x00, 0x11, 0x00,
+ 0x24, 0x00, 0x37, 0x00, 0x11, 0x00, 0x3C, 0x00,
+ 0x37, 0x00, 0x11, 0x00, 0x54, 0x00, 0x37, 0x00,
+ 0x14, 0x00, 0x6D, 0x00, 0x49, 0x00, 0x16, 0x00,
+ 0x85, 0x00, 0x58, 0x00, 0x18, 0x00, 0x9D, 0x00,
+ 0x6B, 0x00, 0x1A, 0x00, 0xB5, 0x00, 0x82, 0x00,
+ 0x11, 0x00, 0xF4, 0xFF, 0x37, 0x00, 0x11, 0x00,
+ 0xDC, 0xFF, 0x37, 0x00, 0x11, 0x00, 0xC4, 0xFF,
+ 0x37, 0x00, 0x11, 0x00, 0xAC, 0xFF, 0x37, 0x00,
+ 0x14, 0x00, 0x93, 0xFF, 0x49, 0x00, 0x16, 0x00,
+ 0x7B, 0xFF, 0x58, 0x00, 0x18, 0x00, 0x63, 0xFF,
+ 0x6B, 0x00, 0x1A, 0x00, 0x4B, 0xFF, 0x82, 0x00,
+ 0x11, 0x00, 0x0C, 0x00, 0x4D, 0x00, 0x11, 0x00,
+ 0x24, 0x00, 0x4D, 0x00, 0x11, 0x00, 0x3C, 0x00,
+ 0x4D, 0x00, 0x11, 0x00, 0x54, 0x00, 0x4D, 0x00,
+ 0x14, 0x00, 0x6D, 0x00, 0x66, 0x00, 0x16, 0x00,
+ 0x85, 0x00, 0x7B, 0x00, 0x18, 0x00, 0x9D, 0x00,
+ 0x96, 0x00, 0x1A, 0x00, 0xB5, 0x00, 0xB6, 0x00,
+ 0x11, 0x00, 0xF4, 0xFF, 0x4D, 0x00, 0x11, 0x00,
+ 0xDC, 0xFF, 0x4D, 0x00, 0x11, 0x00, 0xC4, 0xFF,
+ 0x4D, 0x00, 0x11, 0x00, 0xAC, 0xFF, 0x4D, 0x00,
+ 0x14, 0x00, 0x93, 0xFF, 0x66, 0x00, 0x16, 0x00,
+ 0x7B, 0xFF, 0x7B, 0x00, 0x18, 0x00, 0x63, 0xFF,
+ 0x96, 0x00, 0x1A, 0x00, 0x4B, 0xFF, 0xB6, 0x00,
+ 0x14, 0x00, 0x0C, 0x00, 0x63, 0x00, 0x14, 0x00,
+ 0x24, 0x00, 0x63, 0x00, 0x14, 0x00, 0x3C, 0x00,
+ 0x63, 0x00, 0x14, 0x00, 0x54, 0x00, 0x63, 0x00,
+ 0x17, 0x00, 0x6D, 0x00, 0x84, 0x00, 0x19, 0x00,
+ 0x85, 0x00, 0xA0, 0x00, 0x1B, 0x00, 0x9D, 0x00,
+ 0xC2, 0x00, 0x1D, 0x00, 0xB5, 0x00, 0xEB, 0x00,
+ 0x14, 0x00, 0xF4, 0xFF, 0x63, 0x00, 0x14, 0x00,
+ 0xDC, 0xFF, 0x63, 0x00, 0x14, 0x00, 0xC4, 0xFF,
+ 0x63, 0x00, 0x14, 0x00, 0xAC, 0xFF, 0x63, 0x00,
+ 0x17, 0x00, 0x93, 0xFF, 0x84, 0x00, 0x19, 0x00,
+ 0x7B, 0xFF, 0xA0, 0x00, 0x1B, 0x00, 0x63, 0xFF,
+ 0xC2, 0x00, 0x1D, 0x00, 0x4B, 0xFF, 0xEB, 0x00,
+ 0x16, 0x00, 0x0C, 0x00, 0x79, 0x00, 0x16, 0x00,
+ 0x24, 0x00, 0x79, 0x00, 0x16, 0x00, 0x3C, 0x00,
+ 0x79, 0x00, 0x16, 0x00, 0x54, 0x00, 0x79, 0x00,
+ 0x19, 0x00, 0x6D, 0x00, 0xA1, 0x00, 0x1B, 0x00,
+ 0x85, 0x00, 0xC3, 0x00, 0x1D, 0x00, 0x9D, 0x00,
+ 0xED, 0x00, 0x1F, 0x00, 0xB5, 0x00, 0x1F, 0x01,
+ 0x16, 0x00, 0xF4, 0xFF, 0x79, 0x00, 0x16, 0x00,
+ 0xDC, 0xFF, 0x79, 0x00, 0x16, 0x00, 0xC4, 0xFF,
+ 0x79, 0x00, 0x16, 0x00, 0xAC, 0xFF, 0x79, 0x00,
+ 0x19, 0x00, 0x93, 0xFF, 0xA1, 0x00, 0x1B, 0x00,
+ 0x7B, 0xFF, 0xC3, 0x00, 0x1D, 0x00, 0x63, 0xFF,
+ 0xED, 0x00, 0x1F, 0x00, 0x4B, 0xFF, 0x1F, 0x01,
+ 0x18, 0x00, 0x0C, 0x00, 0x8F, 0x00, 0x18, 0x00,
+ 0x24, 0x00, 0x8F, 0x00, 0x18, 0x00, 0x3C, 0x00,
+ 0x8F, 0x00, 0x18, 0x00, 0x54, 0x00, 0x8F, 0x00,
+ 0x1B, 0x00, 0x6D, 0x00, 0xBF, 0x00, 0x1D, 0x00,
+ 0x85, 0x00, 0xE7, 0x00, 0x1F, 0x00, 0x9D, 0x00,
+ 0x18, 0x01, 0x21, 0x00, 0xB5, 0x00, 0x53, 0x01,
+ 0x18, 0x00, 0xF4, 0xFF, 0x8F, 0x00, 0x18, 0x00,
+ 0xDC, 0xFF, 0x8F, 0x00, 0x18, 0x00, 0xC4, 0xFF,
+ 0x8F, 0x00, 0x18, 0x00, 0xAC, 0xFF, 0x8F, 0x00,
+ 0x1B, 0x00, 0x93, 0xFF, 0xBF, 0x00, 0x1D, 0x00,
+ 0x7B, 0xFF, 0xE7, 0x00, 0x1F, 0x00, 0x63, 0xFF,
+ 0x18, 0x01, 0x21, 0x00, 0x4B, 0xFF, 0x53, 0x01,
+ 0x1A, 0x00, 0x0C, 0x00, 0xA5, 0x00, 0x1A, 0x00,
+ 0x24, 0x00, 0xA5, 0x00, 0x1A, 0x00, 0x3C, 0x00,
+ 0xA5, 0x00, 0x1A, 0x00, 0x54, 0x00, 0xA5, 0x00,
+ 0x1D, 0x00, 0x6D, 0x00, 0xDC, 0x00, 0x1F, 0x00,
+ 0x85, 0x00, 0x0A, 0x01, 0x21, 0x00, 0x9D, 0x00,
+ 0x43, 0x01, 0x23, 0x00, 0xB5, 0x00, 0x87, 0x01,
+ 0x1A, 0x00, 0xF4, 0xFF, 0xA5, 0x00, 0x1A, 0x00,
+ 0xDC, 0xFF, 0xA5, 0x00, 0x1A, 0x00, 0xC4, 0xFF,
+ 0xA5, 0x00, 0x1A, 0x00, 0xAC, 0xFF, 0xA5, 0x00,
+ 0x1D, 0x00, 0x93, 0xFF, 0xDC, 0x00, 0x1F, 0x00,
+ 0x7B, 0xFF, 0x0A, 0x01, 0x21, 0x00, 0x63, 0xFF,
+ 0x43, 0x01, 0x23, 0x00, 0x4B, 0xFF, 0x87, 0x01,
+ 0x11, 0x00, 0x0C, 0x00, 0xF5, 0xFF, 0x11, 0x00,
+ 0x24, 0x00, 0xF5, 0xFF, 0x11, 0x00, 0x3C, 0x00,
+ 0xF5, 0xFF, 0x11, 0x00, 0x54, 0x00, 0xF5, 0xFF,
+ 0x14, 0x00, 0x6D, 0x00, 0xF2, 0xFF, 0x16, 0x00,
+ 0x85, 0x00, 0xEF, 0xFF, 0x18, 0x00, 0x9D, 0x00,
+ 0xEB, 0xFF, 0x1A, 0x00, 0xB5, 0x00, 0xE6, 0xFF,
+ 0x11, 0x00, 0xF4, 0xFF, 0xF5, 0xFF, 0x11, 0x00,
+ 0xDC, 0xFF, 0xF5, 0xFF, 0x11, 0x00, 0xC4, 0xFF,
+ 0xF5, 0xFF, 0x11, 0x00, 0xAC, 0xFF, 0xF5, 0xFF,
+ 0x14, 0x00, 0x93, 0xFF, 0xF2, 0xFF, 0x16, 0x00,
+ 0x7B, 0xFF, 0xEF, 0xFF, 0x18, 0x00, 0x63, 0xFF,
+ 0xEB, 0xFF, 0x1A, 0x00, 0x4B, 0xFF, 0xE6, 0xFF,
+ 0x11, 0x00, 0x0C, 0x00, 0xDF, 0xFF, 0x11, 0x00,
+ 0x24, 0x00, 0xDF, 0xFF, 0x11, 0x00, 0x3C, 0x00,
+ 0xDF, 0xFF, 0x11, 0x00, 0x54, 0x00, 0xDF, 0xFF,
+ 0x14, 0x00, 0x6D, 0x00, 0xD5, 0xFF, 0x16, 0x00,
+ 0x85, 0x00, 0xCC, 0xFF, 0x18, 0x00, 0x9D, 0x00,
+ 0xC0, 0xFF, 0x1A, 0x00, 0xB5, 0x00, 0xB2, 0xFF,
+ 0x11, 0x00, 0xF4, 0xFF, 0xDF, 0xFF, 0x11, 0x00,
+ 0xDC, 0xFF, 0xDF, 0xFF, 0x11, 0x00, 0xC4, 0xFF,
+ 0xDF, 0xFF, 0x11, 0x00, 0xAC, 0xFF, 0xDF, 0xFF,
+ 0x14, 0x00, 0x93, 0xFF, 0xD5, 0xFF, 0x16, 0x00,
+ 0x7B, 0xFF, 0xCC, 0xFF, 0x18, 0x00, 0x63, 0xFF,
+ 0xC0, 0xFF, 0x1A, 0x00, 0x4B, 0xFF, 0xB2, 0xFF,
+ 0x11, 0x00, 0x0C, 0x00, 0xC9, 0xFF, 0x11, 0x00,
+ 0x24, 0x00, 0xC9, 0xFF, 0x11, 0x00, 0x3C, 0x00,
+ 0xC9, 0xFF, 0x11, 0x00, 0x54, 0x00, 0xC9, 0xFF,
+ 0x14, 0x00, 0x6D, 0x00, 0xB7, 0xFF, 0x16, 0x00,
+ 0x85, 0x00, 0xA8, 0xFF, 0x18, 0x00, 0x9D, 0x00,
+ 0x95, 0xFF, 0x1A, 0x00, 0xB5, 0x00, 0x7E, 0xFF,
+ 0x11, 0x00, 0xF4, 0xFF, 0xC9, 0xFF, 0x11, 0x00,
+ 0xDC, 0xFF, 0xC9, 0xFF, 0x11, 0x00, 0xC4, 0xFF,
+ 0xC9, 0xFF, 0x11, 0x00, 0xAC, 0xFF, 0xC9, 0xFF,
+ 0x14, 0x00, 0x93, 0xFF, 0xB7, 0xFF, 0x16, 0x00,
+ 0x7B, 0xFF, 0xA8, 0xFF, 0x18, 0x00, 0x63, 0xFF,
+ 0x95, 0xFF, 0x1A, 0x00, 0x4B, 0xFF, 0x7E, 0xFF,
+ 0x11, 0x00, 0x0C, 0x00, 0xB3, 0xFF, 0x11, 0x00,
+ 0x24, 0x00, 0xB3, 0xFF, 0x11, 0x00, 0x3C, 0x00,
+ 0xB3, 0xFF, 0x11, 0x00, 0x54, 0x00, 0xB3, 0xFF,
+ 0x14, 0x00, 0x6D, 0x00, 0x9A, 0xFF, 0x16, 0x00,
+ 0x85, 0x00, 0x85, 0xFF, 0x18, 0x00, 0x9D, 0x00,
+ 0x6A, 0xFF, 0x1A, 0x00, 0xB5, 0x00, 0x4A, 0xFF,
+ 0x11, 0x00, 0xF4, 0xFF, 0xB3, 0xFF, 0x11, 0x00,
+ 0xDC, 0xFF, 0xB3, 0xFF, 0x11, 0x00, 0xC4, 0xFF,
+ 0xB3, 0xFF, 0x11, 0x00, 0xAC, 0xFF, 0xB3, 0xFF,
+ 0x14, 0x00, 0x93, 0xFF, 0x9A, 0xFF, 0x16, 0x00,
+ 0x7B, 0xFF, 0x85, 0xFF, 0x18, 0x00, 0x63, 0xFF,
+ 0x6A, 0xFF, 0x1A, 0x00, 0x4B, 0xFF, 0x4A, 0xFF,
+ 0x14, 0x00, 0x0C, 0x00, 0x9D, 0xFF, 0x14, 0x00,
+ 0x24, 0x00, 0x9D, 0xFF, 0x14, 0x00, 0x3C, 0x00,
+ 0x9D, 0xFF, 0x14, 0x00, 0x54, 0x00, 0x9D, 0xFF,
+ 0x17, 0x00, 0x6D, 0x00, 0x7C, 0xFF, 0x19, 0x00,
+ 0x85, 0x00, 0x60, 0xFF, 0x1B, 0x00, 0x9D, 0x00,
+ 0x3E, 0xFF, 0x1D, 0x00, 0xB5, 0x00, 0x15, 0xFF,
+ 0x14, 0x00, 0xF4, 0xFF, 0x9D, 0xFF, 0x14, 0x00,
+ 0xDC, 0xFF, 0x9D, 0xFF, 0x14, 0x00, 0xC4, 0xFF,
+ 0x9D, 0xFF, 0x14, 0x00, 0xAC, 0xFF, 0x9D, 0xFF,
+ 0x17, 0x00, 0x93, 0xFF, 0x7C, 0xFF, 0x19, 0x00,
+ 0x7B, 0xFF, 0x60, 0xFF, 0x1B, 0x00, 0x63, 0xFF,
+ 0x3E, 0xFF, 0x1D, 0x00, 0x4B, 0xFF, 0x15, 0xFF,
+ 0x16, 0x00, 0x0C, 0x00, 0x87, 0xFF, 0x16, 0x00,
+ 0x24, 0x00, 0x87, 0xFF, 0x16, 0x00, 0x3C, 0x00,
+ 0x87, 0xFF, 0x16, 0x00, 0x54, 0x00, 0x87, 0xFF,
+ 0x19, 0x00, 0x6D, 0x00, 0x5F, 0xFF, 0x1B, 0x00,
+ 0x85, 0x00, 0x3D, 0xFF, 0x1D, 0x00, 0x9D, 0x00,
+ 0x13, 0xFF, 0x1F, 0x00, 0xB5, 0x00, 0xE1, 0xFE,
+ 0x16, 0x00, 0xF4, 0xFF, 0x87, 0xFF, 0x16, 0x00,
+ 0xDC, 0xFF, 0x87, 0xFF, 0x16, 0x00, 0xC4, 0xFF,
+ 0x87, 0xFF, 0x16, 0x00, 0xAC, 0xFF, 0x87, 0xFF,
+ 0x19, 0x00, 0x93, 0xFF, 0x5F, 0xFF, 0x1B, 0x00,
+ 0x7B, 0xFF, 0x3D, 0xFF, 0x1D, 0x00, 0x63, 0xFF,
+ 0x13, 0xFF, 0x1F, 0x00, 0x4B, 0xFF, 0xE1, 0xFE,
+ 0x18, 0x00, 0x0C, 0x00, 0x71, 0xFF, 0x18, 0x00,
+ 0x24, 0x00, 0x71, 0xFF, 0x18, 0x00, 0x3C, 0x00,
+ 0x71, 0xFF, 0x18, 0x00, 0x54, 0x00, 0x71, 0xFF,
+ 0x1B, 0x00, 0x6D, 0x00, 0x41, 0xFF, 0x1D, 0x00,
+ 0x85, 0x00, 0x19, 0xFF, 0x1F, 0x00, 0x9D, 0x00,
+ 0xE8, 0xFE, 0x21, 0x00, 0xB5, 0x00, 0xAD, 0xFE,
+ 0x18, 0x00, 0xF4, 0xFF, 0x71, 0xFF, 0x18, 0x00,
+ 0xDC, 0xFF, 0x71, 0xFF, 0x18, 0x00, 0xC4, 0xFF,
+ 0x71, 0xFF, 0x18, 0x00, 0xAC, 0xFF, 0x71, 0xFF,
+ 0x1B, 0x00, 0x93, 0xFF, 0x41, 0xFF, 0x1D, 0x00,
+ 0x7B, 0xFF, 0x19, 0xFF, 0x1F, 0x00, 0x63, 0xFF,
+ 0xE8, 0xFE, 0x21, 0x00, 0x4B, 0xFF, 0xAD, 0xFE,
+ 0x1A, 0x00, 0x0C, 0x00, 0x5B, 0xFF, 0x1A, 0x00,
+ 0x24, 0x00, 0x5B, 0xFF, 0x1A, 0x00, 0x3C, 0x00,
+ 0x5B, 0xFF, 0x1A, 0x00, 0x54, 0x00, 0x5B, 0xFF,
+ 0x1D, 0x00, 0x6D, 0x00, 0x24, 0xFF, 0x1F, 0x00,
+ 0x85, 0x00, 0xF6, 0xFE, 0x21, 0x00, 0x9D, 0x00,
+ 0xBD, 0xFE, 0x23, 0x00, 0xB5, 0x00, 0x79, 0xFE,
+ 0x1A, 0x00, 0xF4, 0xFF, 0x5B, 0xFF, 0x1A, 0x00,
+ 0xDC, 0xFF, 0x5B, 0xFF, 0x1A, 0x00, 0xC4, 0xFF,
+ 0x5B, 0xFF, 0x1A, 0x00, 0xAC, 0xFF, 0x5B, 0xFF,
+ 0x1D, 0x00, 0x93, 0xFF, 0x24, 0xFF, 0x1F, 0x00,
+ 0x7B, 0xFF, 0xF6, 0xFE, 0x21, 0x00, 0x63, 0xFF,
+ 0xBD, 0xFE, 0x23, 0x00, 0x4B, 0xFF, 0x79, 0xFE,
+ 0x12, 0x00, 0x0D, 0x00, 0x0C, 0x00, 0x12, 0x00,
+ 0x27, 0x00, 0x0C, 0x00, 0x12, 0x00, 0x42, 0x00,
+ 0x0C, 0x00, 0x12, 0x00, 0x5C, 0x00, 0x0C, 0x00,
+ 0x15, 0x00, 0x78, 0x00, 0x10, 0x00, 0x17, 0x00,
+ 0x92, 0x00, 0x13, 0x00, 0x19, 0x00, 0xAD, 0x00,
+ 0x17, 0x00, 0x1B, 0x00, 0xC7, 0x00, 0x1C, 0x00,
+ 0x12, 0x00, 0xF3, 0xFF, 0x0C, 0x00, 0x12, 0x00,
+ 0xD9, 0xFF, 0x0C, 0x00, 0x12, 0x00, 0xBE, 0xFF,
+ 0x0C, 0x00, 0x12, 0x00, 0xA4, 0xFF, 0x0C, 0x00,
+ 0x15, 0x00, 0x88, 0xFF, 0x10, 0x00, 0x17, 0x00,
+ 0x6E, 0xFF, 0x13, 0x00, 0x19, 0x00, 0x53, 0xFF,
+ 0x17, 0x00, 0x1B, 0x00, 0x39, 0xFF, 0x1C, 0x00,
+ 0x12, 0x00, 0x0D, 0x00, 0x24, 0x00, 0x12, 0x00,
+ 0x27, 0x00, 0x24, 0x00, 0x12, 0x00, 0x42, 0x00,
+ 0x24, 0x00, 0x12, 0x00, 0x5C, 0x00, 0x24, 0x00,
+ 0x15, 0x00, 0x78, 0x00, 0x30, 0x00, 0x17, 0x00,
+ 0x92, 0x00, 0x3A, 0x00, 0x19, 0x00, 0xAD, 0x00,
+ 0x46, 0x00, 0x1B, 0x00, 0xC7, 0x00, 0x55, 0x00,
+ 0x12, 0x00, 0xF3, 0xFF, 0x24, 0x00, 0x12, 0x00,
+ 0xD9, 0xFF, 0x24, 0x00, 0x12, 0x00, 0xBE, 0xFF,
+ 0x24, 0x00, 0x12, 0x00, 0xA4, 0xFF, 0x24, 0x00,
+ 0x15, 0x00, 0x88, 0xFF, 0x30, 0x00, 0x17, 0x00,
+ 0x6E, 0xFF, 0x3A, 0x00, 0x19, 0x00, 0x53, 0xFF,
+ 0x46, 0x00, 0x1B, 0x00, 0x39, 0xFF, 0x55, 0x00,
+ 0x12, 0x00, 0x0D, 0x00, 0x3C, 0x00, 0x12, 0x00,
+ 0x27, 0x00, 0x3C, 0x00, 0x12, 0x00, 0x42, 0x00,
+ 0x3C, 0x00, 0x12, 0x00, 0x5C, 0x00, 0x3C, 0x00,
+ 0x15, 0x00, 0x78, 0x00, 0x51, 0x00, 0x17, 0x00,
+ 0x92, 0x00, 0x61, 0x00, 0x19, 0x00, 0xAD, 0x00,
+ 0x76, 0x00, 0x1B, 0x00, 0xC7, 0x00, 0x8F, 0x00,
+ 0x12, 0x00, 0xF3, 0xFF, 0x3C, 0x00, 0x12, 0x00,
+ 0xD9, 0xFF, 0x3C, 0x00, 0x12, 0x00, 0xBE, 0xFF,
+ 0x3C, 0x00, 0x12, 0x00, 0xA4, 0xFF, 0x3C, 0x00,
+ 0x15, 0x00, 0x88, 0xFF, 0x51, 0x00, 0x17, 0x00,
+ 0x6E, 0xFF, 0x61, 0x00, 0x19, 0x00, 0x53, 0xFF,
+ 0x76, 0x00, 0x1B, 0x00, 0x39, 0xFF, 0x8F, 0x00,
+ 0x12, 0x00, 0x0D, 0x00, 0x54, 0x00, 0x12, 0x00,
+ 0x27, 0x00, 0x54, 0x00, 0x12, 0x00, 0x42, 0x00,
+ 0x54, 0x00, 0x12, 0x00, 0x5C, 0x00, 0x54, 0x00,
+ 0x15, 0x00, 0x78, 0x00, 0x71, 0x00, 0x17, 0x00,
+ 0x92, 0x00, 0x88, 0x00, 0x19, 0x00, 0xAD, 0x00,
+ 0xA5, 0x00, 0x1B, 0x00, 0xC7, 0x00, 0xC8, 0x00,
+ 0x12, 0x00, 0xF3, 0xFF, 0x54, 0x00, 0x12, 0x00,
+ 0xD9, 0xFF, 0x54, 0x00, 0x12, 0x00, 0xBE, 0xFF,
+ 0x54, 0x00, 0x12, 0x00, 0xA4, 0xFF, 0x54, 0x00,
+ 0x15, 0x00, 0x88, 0xFF, 0x71, 0x00, 0x17, 0x00,
+ 0x6E, 0xFF, 0x88, 0x00, 0x19, 0x00, 0x53, 0xFF,
+ 0xA5, 0x00, 0x1B, 0x00, 0x39, 0xFF, 0xC8, 0x00,
+ 0x15, 0x00, 0x0D, 0x00, 0x6D, 0x00, 0x15, 0x00,
+ 0x27, 0x00, 0x6D, 0x00, 0x15, 0x00, 0x42, 0x00,
+ 0x6D, 0x00, 0x15, 0x00, 0x5C, 0x00, 0x6D, 0x00,
+ 0x18, 0x00, 0x78, 0x00, 0x92, 0x00, 0x1A, 0x00,
+ 0x92, 0x00, 0xB0, 0x00, 0x1C, 0x00, 0xAD, 0x00,
+ 0xD5, 0x00, 0x1E, 0x00, 0xC7, 0x00, 0x02, 0x01,
+ 0x15, 0x00, 0xF3, 0xFF, 0x6D, 0x00, 0x15, 0x00,
+ 0xD9, 0xFF, 0x6D, 0x00, 0x15, 0x00, 0xBE, 0xFF,
+ 0x6D, 0x00, 0x15, 0x00, 0xA4, 0xFF, 0x6D, 0x00,
+ 0x18, 0x00, 0x88, 0xFF, 0x92, 0x00, 0x1A, 0x00,
+ 0x6E, 0xFF, 0xB0, 0x00, 0x1C, 0x00, 0x53, 0xFF,
+ 0xD5, 0x00, 0x1E, 0x00, 0x39, 0xFF, 0x02, 0x01,
+ 0x17, 0x00, 0x0D, 0x00, 0x85, 0x00, 0x17, 0x00,
+ 0x27, 0x00, 0x85, 0x00, 0x17, 0x00, 0x42, 0x00,
+ 0x85, 0x00, 0x17, 0x00, 0x5C, 0x00, 0x85, 0x00,
+ 0x1A, 0x00, 0x78, 0x00, 0xB2, 0x00, 0x1C, 0x00,
+ 0x92, 0x00, 0xD7, 0x00, 0x1E, 0x00, 0xAD, 0x00,
+ 0x04, 0x01, 0x20, 0x00, 0xC7, 0x00, 0x3B, 0x01,
+ 0x17, 0x00, 0xF3, 0xFF, 0x85, 0x00, 0x17, 0x00,
+ 0xD9, 0xFF, 0x85, 0x00, 0x17, 0x00, 0xBE, 0xFF,
+ 0x85, 0x00, 0x17, 0x00, 0xA4, 0xFF, 0x85, 0x00,
+ 0x1A, 0x00, 0x88, 0xFF, 0xB2, 0x00, 0x1C, 0x00,
+ 0x6E, 0xFF, 0xD7, 0x00, 0x1E, 0x00, 0x53, 0xFF,
+ 0x04, 0x01, 0x20, 0x00, 0x39, 0xFF, 0x3B, 0x01,
+ 0x19, 0x00, 0x0D, 0x00, 0x9D, 0x00, 0x19, 0x00,
+ 0x27, 0x00, 0x9D, 0x00, 0x19, 0x00, 0x42, 0x00,
+ 0x9D, 0x00, 0x19, 0x00, 0x5C, 0x00, 0x9D, 0x00,
+ 0x1C, 0x00, 0x78, 0x00, 0xD3, 0x00, 0x1E, 0x00,
+ 0x92, 0x00, 0xFE, 0x00, 0x20, 0x00, 0xAD, 0x00,
+ 0x34, 0x01, 0x22, 0x00, 0xC7, 0x00, 0x75, 0x01,
+ 0x19, 0x00, 0xF3, 0xFF, 0x9D, 0x00, 0x19, 0x00,
+ 0xD9, 0xFF, 0x9D, 0x00, 0x19, 0x00, 0xBE, 0xFF,
+ 0x9D, 0x00, 0x19, 0x00, 0xA4, 0xFF, 0x9D, 0x00,
+ 0x1C, 0x00, 0x88, 0xFF, 0xD3, 0x00, 0x1E, 0x00,
+ 0x6E, 0xFF, 0xFE, 0x00, 0x20, 0x00, 0x53, 0xFF,
+ 0x34, 0x01, 0x22, 0x00, 0x39, 0xFF, 0x75, 0x01,
+ 0x1B, 0x00, 0x0D, 0x00, 0xB5, 0x00, 0x1B, 0x00,
+ 0x27, 0x00, 0xB5, 0x00, 0x1B, 0x00, 0x42, 0x00,
+ 0xB5, 0x00, 0x1B, 0x00, 0x5C, 0x00, 0xB5, 0x00,
+ 0x1E, 0x00, 0x78, 0x00, 0xF3, 0x00, 0x20, 0x00,
+ 0x92, 0x00, 0x25, 0x01, 0x22, 0x00, 0xAD, 0x00,
+ 0x63, 0x01, 0x24, 0x00, 0xC7, 0x00, 0xAE, 0x01,
+ 0x1B, 0x00, 0xF3, 0xFF, 0xB5, 0x00, 0x1B, 0x00,
+ 0xD9, 0xFF, 0xB5, 0x00, 0x1B, 0x00, 0xBE, 0xFF,
+ 0xB5, 0x00, 0x1B, 0x00, 0xA4, 0xFF, 0xB5, 0x00,
+ 0x1E, 0x00, 0x88, 0xFF, 0xF3, 0x00, 0x20, 0x00,
+ 0x6E, 0xFF, 0x25, 0x01, 0x22, 0x00, 0x53, 0xFF,
+ 0x63, 0x01, 0x24, 0x00, 0x39, 0xFF, 0xAE, 0x01,
+ 0x12, 0x00, 0x0D, 0x00, 0xF4, 0xFF, 0x12, 0x00,
+ 0x27, 0x00, 0xF4, 0xFF, 0x12, 0x00, 0x42, 0x00,
+ 0xF4, 0xFF, 0x12, 0x00, 0x5C, 0x00, 0xF4, 0xFF,
+ 0x15, 0x00, 0x78, 0x00, 0xF0, 0xFF, 0x17, 0x00,
+ 0x92, 0x00, 0xED, 0xFF, 0x19, 0x00, 0xAD, 0x00,
+ 0xE9, 0xFF, 0x1B, 0x00, 0xC7, 0x00, 0xE4, 0xFF,
+ 0x12, 0x00, 0xF3, 0xFF, 0xF4, 0xFF, 0x12, 0x00,
+ 0xD9, 0xFF, 0xF4, 0xFF, 0x12, 0x00, 0xBE, 0xFF,
+ 0xF4, 0xFF, 0x12, 0x00, 0xA4, 0xFF, 0xF4, 0xFF,
+ 0x15, 0x00, 0x88, 0xFF, 0xF0, 0xFF, 0x17, 0x00,
+ 0x6E, 0xFF, 0xED, 0xFF, 0x19, 0x00, 0x53, 0xFF,
+ 0xE9, 0xFF, 0x1B, 0x00, 0x39, 0xFF, 0xE4, 0xFF,
+ 0x12, 0x00, 0x0D, 0x00, 0xDC, 0xFF, 0x12, 0x00,
+ 0x27, 0x00, 0xDC, 0xFF, 0x12, 0x00, 0x42, 0x00,
+ 0xDC, 0xFF, 0x12, 0x00, 0x5C, 0x00, 0xDC, 0xFF,
+ 0x15, 0x00, 0x78, 0x00, 0xD0, 0xFF, 0x17, 0x00,
+ 0x92, 0x00, 0xC6, 0xFF, 0x19, 0x00, 0xAD, 0x00,
+ 0xBA, 0xFF, 0x1B, 0x00, 0xC7, 0x00, 0xAB, 0xFF,
+ 0x12, 0x00, 0xF3, 0xFF, 0xDC, 0xFF, 0x12, 0x00,
+ 0xD9, 0xFF, 0xDC, 0xFF, 0x12, 0x00, 0xBE, 0xFF,
+ 0xDC, 0xFF, 0x12, 0x00, 0xA4, 0xFF, 0xDC, 0xFF,
+ 0x15, 0x00, 0x88, 0xFF, 0xD0, 0xFF, 0x17, 0x00,
+ 0x6E, 0xFF, 0xC6, 0xFF, 0x19, 0x00, 0x53, 0xFF,
+ 0xBA, 0xFF, 0x1B, 0x00, 0x39, 0xFF, 0xAB, 0xFF,
+ 0x12, 0x00, 0x0D, 0x00, 0xC4, 0xFF, 0x12, 0x00,
+ 0x27, 0x00, 0xC4, 0xFF, 0x12, 0x00, 0x42, 0x00,
+ 0xC4, 0xFF, 0x12, 0x00, 0x5C, 0x00, 0xC4, 0xFF,
+ 0x15, 0x00, 0x78, 0x00, 0xAF, 0xFF, 0x17, 0x00,
+ 0x92, 0x00, 0x9F, 0xFF, 0x19, 0x00, 0xAD, 0x00,
+ 0x8A, 0xFF, 0x1B, 0x00, 0xC7, 0x00, 0x71, 0xFF,
+ 0x12, 0x00, 0xF3, 0xFF, 0xC4, 0xFF, 0x12, 0x00,
+ 0xD9, 0xFF, 0xC4, 0xFF, 0x12, 0x00, 0xBE, 0xFF,
+ 0xC4, 0xFF, 0x12, 0x00, 0xA4, 0xFF, 0xC4, 0xFF,
+ 0x15, 0x00, 0x88, 0xFF, 0xAF, 0xFF, 0x17, 0x00,
+ 0x6E, 0xFF, 0x9F, 0xFF, 0x19, 0x00, 0x53, 0xFF,
+ 0x8A, 0xFF, 0x1B, 0x00, 0x39, 0xFF, 0x71, 0xFF,
+ 0x12, 0x00, 0x0D, 0x00, 0xAC, 0xFF, 0x12, 0x00,
+ 0x27, 0x00, 0xAC, 0xFF, 0x12, 0x00, 0x42, 0x00,
+ 0xAC, 0xFF, 0x12, 0x00, 0x5C, 0x00, 0xAC, 0xFF,
+ 0x15, 0x00, 0x78, 0x00, 0x8F, 0xFF, 0x17, 0x00,
+ 0x92, 0x00, 0x78, 0xFF, 0x19, 0x00, 0xAD, 0x00,
+ 0x5B, 0xFF, 0x1B, 0x00, 0xC7, 0x00, 0x38, 0xFF,
+ 0x12, 0x00, 0xF3, 0xFF, 0xAC, 0xFF, 0x12, 0x00,
+ 0xD9, 0xFF, 0xAC, 0xFF, 0x12, 0x00, 0xBE, 0xFF,
+ 0xAC, 0xFF, 0x12, 0x00, 0xA4, 0xFF, 0xAC, 0xFF,
+ 0x15, 0x00, 0x88, 0xFF, 0x8F, 0xFF, 0x17, 0x00,
+ 0x6E, 0xFF, 0x78, 0xFF, 0x19, 0x00, 0x53, 0xFF,
+ 0x5B, 0xFF, 0x1B, 0x00, 0x39, 0xFF, 0x38, 0xFF,
+ 0x15, 0x00, 0x0D, 0x00, 0x93, 0xFF, 0x15, 0x00,
+ 0x27, 0x00, 0x93, 0xFF, 0x15, 0x00, 0x42, 0x00,
+ 0x93, 0xFF, 0x15, 0x00, 0x5C, 0x00, 0x93, 0xFF,
+ 0x18, 0x00, 0x78, 0x00, 0x6E, 0xFF, 0x1A, 0x00,
+ 0x92, 0x00, 0x50, 0xFF, 0x1C, 0x00, 0xAD, 0x00,
+ 0x2B, 0xFF, 0x1E, 0x00, 0xC7, 0x00, 0xFE, 0xFE,
+ 0x15, 0x00, 0xF3, 0xFF, 0x93, 0xFF, 0x15, 0x00,
+ 0xD9, 0xFF, 0x93, 0xFF, 0x15, 0x00, 0xBE, 0xFF,
+ 0x93, 0xFF, 0x15, 0x00, 0xA4, 0xFF, 0x93, 0xFF,
+ 0x18, 0x00, 0x88, 0xFF, 0x6E, 0xFF, 0x1A, 0x00,
+ 0x6E, 0xFF, 0x50, 0xFF, 0x1C, 0x00, 0x53, 0xFF,
+ 0x2B, 0xFF, 0x1E, 0x00, 0x39, 0xFF, 0xFE, 0xFE,
+ 0x17, 0x00, 0x0D, 0x00, 0x7B, 0xFF, 0x17, 0x00,
+ 0x27, 0x00, 0x7B, 0xFF, 0x17, 0x00, 0x42, 0x00,
+ 0x7B, 0xFF, 0x17, 0x00, 0x5C, 0x00, 0x7B, 0xFF,
+ 0x1A, 0x00, 0x78, 0x00, 0x4E, 0xFF, 0x1C, 0x00,
+ 0x92, 0x00, 0x29, 0xFF, 0x1E, 0x00, 0xAD, 0x00,
+ 0xFC, 0xFE, 0x20, 0x00, 0xC7, 0x00, 0xC5, 0xFE,
+ 0x17, 0x00, 0xF3, 0xFF, 0x7B, 0xFF, 0x17, 0x00,
+ 0xD9, 0xFF, 0x7B, 0xFF, 0x17, 0x00, 0xBE, 0xFF,
+ 0x7B, 0xFF, 0x17, 0x00, 0xA4, 0xFF, 0x7B, 0xFF,
+ 0x1A, 0x00, 0x88, 0xFF, 0x4E, 0xFF, 0x1C, 0x00,
+ 0x6E, 0xFF, 0x29, 0xFF, 0x1E, 0x00, 0x53, 0xFF,
+ 0xFC, 0xFE, 0x20, 0x00, 0x39, 0xFF, 0xC5, 0xFE,
+ 0x19, 0x00, 0x0D, 0x00, 0x63, 0xFF, 0x19, 0x00,
+ 0x27, 0x00, 0x63, 0xFF, 0x19, 0x00, 0x42, 0x00,
+ 0x63, 0xFF, 0x19, 0x00, 0x5C, 0x00, 0x63, 0xFF,
+ 0x1C, 0x00, 0x78, 0x00, 0x2D, 0xFF, 0x1E, 0x00,
+ 0x92, 0x00, 0x02, 0xFF, 0x20, 0x00, 0xAD, 0x00,
+ 0xCC, 0xFE, 0x22, 0x00, 0xC7, 0x00, 0x8B, 0xFE,
+ 0x19, 0x00, 0xF3, 0xFF, 0x63, 0xFF, 0x19, 0x00,
+ 0xD9, 0xFF, 0x63, 0xFF, 0x19, 0x00, 0xBE, 0xFF,
+ 0x63, 0xFF, 0x19, 0x00, 0xA4, 0xFF, 0x63, 0xFF,
+ 0x1C, 0x00, 0x88, 0xFF, 0x2D, 0xFF, 0x1E, 0x00,
+ 0x6E, 0xFF, 0x02, 0xFF, 0x20, 0x00, 0x53, 0xFF,
+ 0xCC, 0xFE, 0x22, 0x00, 0x39, 0xFF, 0x8B, 0xFE,
+ 0x1B, 0x00, 0x0D, 0x00, 0x4B, 0xFF, 0x1B, 0x00,
+ 0x27, 0x00, 0x4B, 0xFF, 0x1B, 0x00, 0x42, 0x00,
+ 0x4B, 0xFF, 0x1B, 0x00, 0x5C, 0x00, 0x4B, 0xFF,
+ 0x1E, 0x00, 0x78, 0x00, 0x0D, 0xFF, 0x20, 0x00,
+ 0x92, 0x00, 0xDB, 0xFE, 0x22, 0x00, 0xAD, 0x00,
+ 0x9D, 0xFE, 0x24, 0x00, 0xC7, 0x00, 0x52, 0xFE,
+ 0x1B, 0x00, 0xF3, 0xFF, 0x4B, 0xFF, 0x1B, 0x00,
+ 0xD9, 0xFF, 0x4B, 0xFF, 0x1B, 0x00, 0xBE, 0xFF,
+ 0x4B, 0xFF, 0x1B, 0x00, 0xA4, 0xFF, 0x4B, 0xFF,
+ 0x1E, 0x00, 0x88, 0xFF, 0x0D, 0xFF, 0x20, 0x00,
+ 0x6E, 0xFF, 0xDB, 0xFE, 0x22, 0x00, 0x53, 0xFF,
+ 0x9D, 0xFE, 0x24, 0x00, 0x39, 0xFF, 0x52, 0xFE,
+ 0x13, 0x00, 0x0E, 0x00, 0x0D, 0x00, 0x13, 0x00,
+ 0x2B, 0x00, 0x0D, 0x00, 0x13, 0x00, 0x49, 0x00,
+ 0x0D, 0x00, 0x13, 0x00, 0x66, 0x00, 0x0D, 0x00,
+ 0x16, 0x00, 0x84, 0x00, 0x11, 0x00, 0x18, 0x00,
+ 0xA1, 0x00, 0x15, 0x00, 0x1A, 0x00, 0xBF, 0x00,
+ 0x1A, 0x00, 0x1C, 0x00, 0xDC, 0x00, 0x1F, 0x00,
+ 0x13, 0x00, 0xF2, 0xFF, 0x0D, 0x00, 0x13, 0x00,
+ 0xD5, 0xFF, 0x0D, 0x00, 0x13, 0x00, 0xB7, 0xFF,
+ 0x0D, 0x00, 0x13, 0x00, 0x9A, 0xFF, 0x0D, 0x00,
+ 0x16, 0x00, 0x7C, 0xFF, 0x11, 0x00, 0x18, 0x00,
+ 0x5F, 0xFF, 0x15, 0x00, 0x1A, 0x00, 0x41, 0xFF,
+ 0x1A, 0x00, 0x1C, 0x00, 0x24, 0xFF, 0x1F, 0x00,
+ 0x13, 0x00, 0x0E, 0x00, 0x27, 0x00, 0x13, 0x00,
+ 0x2B, 0x00, 0x27, 0x00, 0x13, 0x00, 0x49, 0x00,
+ 0x27, 0x00, 0x13, 0x00, 0x66, 0x00, 0x27, 0x00,
+ 0x16, 0x00, 0x84, 0x00, 0x34, 0x00, 0x18, 0x00,
+ 0xA1, 0x00, 0x40, 0x00, 0x1A, 0x00, 0xBF, 0x00,
+ 0x4E, 0x00, 0x1C, 0x00, 0xDC, 0x00, 0x5E, 0x00,
+ 0x13, 0x00, 0xF2, 0xFF, 0x27, 0x00, 0x13, 0x00,
+ 0xD5, 0xFF, 0x27, 0x00, 0x13, 0x00, 0xB7, 0xFF,
+ 0x27, 0x00, 0x13, 0x00, 0x9A, 0xFF, 0x27, 0x00,
+ 0x16, 0x00, 0x7C, 0xFF, 0x34, 0x00, 0x18, 0x00,
+ 0x5F, 0xFF, 0x40, 0x00, 0x1A, 0x00, 0x41, 0xFF,
+ 0x4E, 0x00, 0x1C, 0x00, 0x24, 0xFF, 0x5E, 0x00,
+ 0x13, 0x00, 0x0E, 0x00, 0x42, 0x00, 0x13, 0x00,
+ 0x2B, 0x00, 0x42, 0x00, 0x13, 0x00, 0x49, 0x00,
+ 0x42, 0x00, 0x13, 0x00, 0x66, 0x00, 0x42, 0x00,
+ 0x16, 0x00, 0x84, 0x00, 0x58, 0x00, 0x18, 0x00,
+ 0xA1, 0x00, 0x6B, 0x00, 0x1A, 0x00, 0xBF, 0x00,
+ 0x82, 0x00, 0x1C, 0x00, 0xDC, 0x00, 0x9D, 0x00,
+ 0x13, 0x00, 0xF2, 0xFF, 0x42, 0x00, 0x13, 0x00,
+ 0xD5, 0xFF, 0x42, 0x00, 0x13, 0x00, 0xB7, 0xFF,
+ 0x42, 0x00, 0x13, 0x00, 0x9A, 0xFF, 0x42, 0x00,
+ 0x16, 0x00, 0x7C, 0xFF, 0x58, 0x00, 0x18, 0x00,
+ 0x5F, 0xFF, 0x6B, 0x00, 0x1A, 0x00, 0x41, 0xFF,
+ 0x82, 0x00, 0x1C, 0x00, 0x24, 0xFF, 0x9D, 0x00,
+ 0x13, 0x00, 0x0E, 0x00, 0x5C, 0x00, 0x13, 0x00,
+ 0x2B, 0x00, 0x5C, 0x00, 0x13, 0x00, 0x49, 0x00,
+ 0x5C, 0x00, 0x13, 0x00, 0x66, 0x00, 0x5C, 0x00,
+ 0x16, 0x00, 0x84, 0x00, 0x7B, 0x00, 0x18, 0x00,
+ 0xA1, 0x00, 0x96, 0x00, 0x1A, 0x00, 0xBF, 0x00,
+ 0xB6, 0x00, 0x1C, 0x00, 0xDC, 0x00, 0xDC, 0x00,
+ 0x13, 0x00, 0xF2, 0xFF, 0x5C, 0x00, 0x13, 0x00,
+ 0xD5, 0xFF, 0x5C, 0x00, 0x13, 0x00, 0xB7, 0xFF,
+ 0x5C, 0x00, 0x13, 0x00, 0x9A, 0xFF, 0x5C, 0x00,
+ 0x16, 0x00, 0x7C, 0xFF, 0x7B, 0x00, 0x18, 0x00,
+ 0x5F, 0xFF, 0x96, 0x00, 0x1A, 0x00, 0x41, 0xFF,
+ 0xB6, 0x00, 0x1C, 0x00, 0x24, 0xFF, 0xDC, 0x00,
+ 0x16, 0x00, 0x0E, 0x00, 0x78, 0x00, 0x16, 0x00,
+ 0x2B, 0x00, 0x78, 0x00, 0x16, 0x00, 0x49, 0x00,
+ 0x78, 0x00, 0x16, 0x00, 0x66, 0x00, 0x78, 0x00,
+ 0x19, 0x00, 0x84, 0x00, 0xA0, 0x00, 0x1B, 0x00,
+ 0xA1, 0x00, 0xC2, 0x00, 0x1D, 0x00, 0xBF, 0x00,
+ 0xEB, 0x00, 0x1F, 0x00, 0xDC, 0x00, 0x1C, 0x01,
+ 0x16, 0x00, 0xF2, 0xFF, 0x78, 0x00, 0x16, 0x00,
+ 0xD5, 0xFF, 0x78, 0x00, 0x16, 0x00, 0xB7, 0xFF,
+ 0x78, 0x00, 0x16, 0x00, 0x9A, 0xFF, 0x78, 0x00,
+ 0x19, 0x00, 0x7C, 0xFF, 0xA0, 0x00, 0x1B, 0x00,
+ 0x5F, 0xFF, 0xC2, 0x00, 0x1D, 0x00, 0x41, 0xFF,
+ 0xEB, 0x00, 0x1F, 0x00, 0x24, 0xFF, 0x1C, 0x01,
+ 0x18, 0x00, 0x0E, 0x00, 0x92, 0x00, 0x18, 0x00,
+ 0x2B, 0x00, 0x92, 0x00, 0x18, 0x00, 0x49, 0x00,
+ 0x92, 0x00, 0x18, 0x00, 0x66, 0x00, 0x92, 0x00,
+ 0x1B, 0x00, 0x84, 0x00, 0xC3, 0x00, 0x1D, 0x00,
+ 0xA1, 0x00, 0xED, 0x00, 0x1F, 0x00, 0xBF, 0x00,
+ 0x1F, 0x01, 0x21, 0x00, 0xDC, 0x00, 0x5B, 0x01,
+ 0x18, 0x00, 0xF2, 0xFF, 0x92, 0x00, 0x18, 0x00,
+ 0xD5, 0xFF, 0x92, 0x00, 0x18, 0x00, 0xB7, 0xFF,
+ 0x92, 0x00, 0x18, 0x00, 0x9A, 0xFF, 0x92, 0x00,
+ 0x1B, 0x00, 0x7C, 0xFF, 0xC3, 0x00, 0x1D, 0x00,
+ 0x5F, 0xFF, 0xED, 0x00, 0x1F, 0x00, 0x41, 0xFF,
+ 0x1F, 0x01, 0x21, 0x00, 0x24, 0xFF, 0x5B, 0x01,
+ 0x1A, 0x00, 0x0E, 0x00, 0xAD, 0x00, 0x1A, 0x00,
+ 0x2B, 0x00, 0xAD, 0x00, 0x1A, 0x00, 0x49, 0x00,
+ 0xAD, 0x00, 0x1A, 0x00, 0x66, 0x00, 0xAD, 0x00,
+ 0x1D, 0x00, 0x84, 0x00, 0xE7, 0x00, 0x1F, 0x00,
+ 0xA1, 0x00, 0x18, 0x01, 0x21, 0x00, 0xBF, 0x00,
+ 0x53, 0x01, 0x23, 0x00, 0xDC, 0x00, 0x9A, 0x01,
+ 0x1A, 0x00, 0xF2, 0xFF, 0xAD, 0x00, 0x1A, 0x00,
+ 0xD5, 0xFF, 0xAD, 0x00, 0x1A, 0x00, 0xB7, 0xFF,
+ 0xAD, 0x00, 0x1A, 0x00, 0x9A, 0xFF, 0xAD, 0x00,
+ 0x1D, 0x00, 0x7C, 0xFF, 0xE7, 0x00, 0x1F, 0x00,
+ 0x5F, 0xFF, 0x18, 0x01, 0x21, 0x00, 0x41, 0xFF,
+ 0x53, 0x01, 0x23, 0x00, 0x24, 0xFF, 0x9A, 0x01,
+ 0x1C, 0x00, 0x0E, 0x00, 0xC7, 0x00, 0x1C, 0x00,
+ 0x2B, 0x00, 0xC7, 0x00, 0x1C, 0x00, 0x49, 0x00,
+ 0xC7, 0x00, 0x1C, 0x00, 0x66, 0x00, 0xC7, 0x00,
+ 0x1F, 0x00, 0x84, 0x00, 0x0A, 0x01, 0x21, 0x00,
+ 0xA1, 0x00, 0x43, 0x01, 0x23, 0x00, 0xBF, 0x00,
+ 0x87, 0x01, 0x25, 0x00, 0xDC, 0x00, 0xD9, 0x01,
+ 0x1C, 0x00, 0xF2, 0xFF, 0xC7, 0x00, 0x1C, 0x00,
+ 0xD5, 0xFF, 0xC7, 0x00, 0x1C, 0x00, 0xB7, 0xFF,
+ 0xC7, 0x00, 0x1C, 0x00, 0x9A, 0xFF, 0xC7, 0x00,
+ 0x1F, 0x00, 0x7C, 0xFF, 0x0A, 0x01, 0x21, 0x00,
+ 0x5F, 0xFF, 0x43, 0x01, 0x23, 0x00, 0x41, 0xFF,
+ 0x87, 0x01, 0x25, 0x00, 0x24, 0xFF, 0xD9, 0x01,
+ 0x13, 0x00, 0x0E, 0x00, 0xF3, 0xFF, 0x13, 0x00,
+ 0x2B, 0x00, 0xF3, 0xFF, 0x13, 0x00, 0x49, 0x00,
+ 0xF3, 0xFF, 0x13, 0x00, 0x66, 0x00, 0xF3, 0xFF,
+ 0x16, 0x00, 0x84, 0x00, 0xEF, 0xFF, 0x18, 0x00,
+ 0xA1, 0x00, 0xEB, 0xFF, 0x1A, 0x00, 0xBF, 0x00,
+ 0xE6, 0xFF, 0x1C, 0x00, 0xDC, 0x00, 0xE1, 0xFF,
+ 0x13, 0x00, 0xF2, 0xFF, 0xF3, 0xFF, 0x13, 0x00,
+ 0xD5, 0xFF, 0xF3, 0xFF, 0x13, 0x00, 0xB7, 0xFF,
+ 0xF3, 0xFF, 0x13, 0x00, 0x9A, 0xFF, 0xF3, 0xFF,
+ 0x16, 0x00, 0x7C, 0xFF, 0xEF, 0xFF, 0x18, 0x00,
+ 0x5F, 0xFF, 0xEB, 0xFF, 0x1A, 0x00, 0x41, 0xFF,
+ 0xE6, 0xFF, 0x1C, 0x00, 0x24, 0xFF, 0xE1, 0xFF,
+ 0x13, 0x00, 0x0E, 0x00, 0xD9, 0xFF, 0x13, 0x00,
+ 0x2B, 0x00, 0xD9, 0xFF, 0x13, 0x00, 0x49, 0x00,
+ 0xD9, 0xFF, 0x13, 0x00, 0x66, 0x00, 0xD9, 0xFF,
+ 0x16, 0x00, 0x84, 0x00, 0xCC, 0xFF, 0x18, 0x00,
+ 0xA1, 0x00, 0xC0, 0xFF, 0x1A, 0x00, 0xBF, 0x00,
+ 0xB2, 0xFF, 0x1C, 0x00, 0xDC, 0x00, 0xA2, 0xFF,
+ 0x13, 0x00, 0xF2, 0xFF, 0xD9, 0xFF, 0x13, 0x00,
+ 0xD5, 0xFF, 0xD9, 0xFF, 0x13, 0x00, 0xB7, 0xFF,
+ 0xD9, 0xFF, 0x13, 0x00, 0x9A, 0xFF, 0xD9, 0xFF,
+ 0x16, 0x00, 0x7C, 0xFF, 0xCC, 0xFF, 0x18, 0x00,
+ 0x5F, 0xFF, 0xC0, 0xFF, 0x1A, 0x00, 0x41, 0xFF,
+ 0xB2, 0xFF, 0x1C, 0x00, 0x24, 0xFF, 0xA2, 0xFF,
+ 0x13, 0x00, 0x0E, 0x00, 0xBE, 0xFF, 0x13, 0x00,
+ 0x2B, 0x00, 0xBE, 0xFF, 0x13, 0x00, 0x49, 0x00,
+ 0xBE, 0xFF, 0x13, 0x00, 0x66, 0x00, 0xBE, 0xFF,
+ 0x16, 0x00, 0x84, 0x00, 0xA8, 0xFF, 0x18, 0x00,
+ 0xA1, 0x00, 0x95, 0xFF, 0x1A, 0x00, 0xBF, 0x00,
+ 0x7E, 0xFF, 0x1C, 0x00, 0xDC, 0x00, 0x63, 0xFF,
+ 0x13, 0x00, 0xF2, 0xFF, 0xBE, 0xFF, 0x13, 0x00,
+ 0xD5, 0xFF, 0xBE, 0xFF, 0x13, 0x00, 0xB7, 0xFF,
+ 0xBE, 0xFF, 0x13, 0x00, 0x9A, 0xFF, 0xBE, 0xFF,
+ 0x16, 0x00, 0x7C, 0xFF, 0xA8, 0xFF, 0x18, 0x00,
+ 0x5F, 0xFF, 0x95, 0xFF, 0x1A, 0x00, 0x41, 0xFF,
+ 0x7E, 0xFF, 0x1C, 0x00, 0x24, 0xFF, 0x63, 0xFF,
+ 0x13, 0x00, 0x0E, 0x00, 0xA4, 0xFF, 0x13, 0x00,
+ 0x2B, 0x00, 0xA4, 0xFF, 0x13, 0x00, 0x49, 0x00,
+ 0xA4, 0xFF, 0x13, 0x00, 0x66, 0x00, 0xA4, 0xFF,
+ 0x16, 0x00, 0x84, 0x00, 0x85, 0xFF, 0x18, 0x00,
+ 0xA1, 0x00, 0x6A, 0xFF, 0x1A, 0x00, 0xBF, 0x00,
+ 0x4A, 0xFF, 0x1C, 0x00, 0xDC, 0x00, 0x24, 0xFF,
+ 0x13, 0x00, 0xF2, 0xFF, 0xA4, 0xFF, 0x13, 0x00,
+ 0xD5, 0xFF, 0xA4, 0xFF, 0x13, 0x00, 0xB7, 0xFF,
+ 0xA4, 0xFF, 0x13, 0x00, 0x9A, 0xFF, 0xA4, 0xFF,
+ 0x16, 0x00, 0x7C, 0xFF, 0x85, 0xFF, 0x18, 0x00,
+ 0x5F, 0xFF, 0x6A, 0xFF, 0x1A, 0x00, 0x41, 0xFF,
+ 0x4A, 0xFF, 0x1C, 0x00, 0x24, 0xFF, 0x24, 0xFF,
+ 0x16, 0x00, 0x0E, 0x00, 0x88, 0xFF, 0x16, 0x00,
+ 0x2B, 0x00, 0x88, 0xFF, 0x16, 0x00, 0x49, 0x00,
+ 0x88, 0xFF, 0x16, 0x00, 0x66, 0x00, 0x88, 0xFF,
+ 0x19, 0x00, 0x84, 0x00, 0x60, 0xFF, 0x1B, 0x00,
+ 0xA1, 0x00, 0x3E, 0xFF, 0x1D, 0x00, 0xBF, 0x00,
+ 0x15, 0xFF, 0x1F, 0x00, 0xDC, 0x00, 0xE4, 0xFE,
+ 0x16, 0x00, 0xF2, 0xFF, 0x88, 0xFF, 0x16, 0x00,
+ 0xD5, 0xFF, 0x88, 0xFF, 0x16, 0x00, 0xB7, 0xFF,
+ 0x88, 0xFF, 0x16, 0x00, 0x9A, 0xFF, 0x88, 0xFF,
+ 0x19, 0x00, 0x7C, 0xFF, 0x60, 0xFF, 0x1B, 0x00,
+ 0x5F, 0xFF, 0x3E, 0xFF, 0x1D, 0x00, 0x41, 0xFF,
+ 0x15, 0xFF, 0x1F, 0x00, 0x24, 0xFF, 0xE4, 0xFE,
+ 0x18, 0x00, 0x0E, 0x00, 0x6E, 0xFF, 0x18, 0x00,
+ 0x2B, 0x00, 0x6E, 0xFF, 0x18, 0x00, 0x49, 0x00,
+ 0x6E, 0xFF, 0x18, 0x00, 0x66, 0x00, 0x6E, 0xFF,
+ 0x1B, 0x00, 0x84, 0x00, 0x3D, 0xFF, 0x1D, 0x00,
+ 0xA1, 0x00, 0x13, 0xFF, 0x1F, 0x00, 0xBF, 0x00,
+ 0xE1, 0xFE, 0x21, 0x00, 0xDC, 0x00, 0xA5, 0xFE,
+ 0x18, 0x00, 0xF2, 0xFF, 0x6E, 0xFF, 0x18, 0x00,
+ 0xD5, 0xFF, 0x6E, 0xFF, 0x18, 0x00, 0xB7, 0xFF,
+ 0x6E, 0xFF, 0x18, 0x00, 0x9A, 0xFF, 0x6E, 0xFF,
+ 0x1B, 0x00, 0x7C, 0xFF, 0x3D, 0xFF, 0x1D, 0x00,
+ 0x5F, 0xFF, 0x13, 0xFF, 0x1F, 0x00, 0x41, 0xFF,
+ 0xE1, 0xFE, 0x21, 0x00, 0x24, 0xFF, 0xA5, 0xFE,
+ 0x1A, 0x00, 0x0E, 0x00, 0x53, 0xFF, 0x1A, 0x00,
+ 0x2B, 0x00, 0x53, 0xFF, 0x1A, 0x00, 0x49, 0x00,
+ 0x53, 0xFF, 0x1A, 0x00, 0x66, 0x00, 0x53, 0xFF,
+ 0x1D, 0x00, 0x84, 0x00, 0x19, 0xFF, 0x1F, 0x00,
+ 0xA1, 0x00, 0xE8, 0xFE, 0x21, 0x00, 0xBF, 0x00,
+ 0xAD, 0xFE, 0x23, 0x00, 0xDC, 0x00, 0x66, 0xFE,
+ 0x1A, 0x00, 0xF2, 0xFF, 0x53, 0xFF, 0x1A, 0x00,
+ 0xD5, 0xFF, 0x53, 0xFF, 0x1A, 0x00, 0xB7, 0xFF,
+ 0x53, 0xFF, 0x1A, 0x00, 0x9A, 0xFF, 0x53, 0xFF,
+ 0x1D, 0x00, 0x7C, 0xFF, 0x19, 0xFF, 0x1F, 0x00,
+ 0x5F, 0xFF, 0xE8, 0xFE, 0x21, 0x00, 0x41, 0xFF,
+ 0xAD, 0xFE, 0x23, 0x00, 0x24, 0xFF, 0x66, 0xFE,
+ 0x1C, 0x00, 0x0E, 0x00, 0x39, 0xFF, 0x1C, 0x00,
+ 0x2B, 0x00, 0x39, 0xFF, 0x1C, 0x00, 0x49, 0x00,
+ 0x39, 0xFF, 0x1C, 0x00, 0x66, 0x00, 0x39, 0xFF,
+ 0x1F, 0x00, 0x84, 0x00, 0xF6, 0xFE, 0x21, 0x00,
+ 0xA1, 0x00, 0xBD, 0xFE, 0x23, 0x00, 0xBF, 0x00,
+ 0x79, 0xFE, 0x25, 0x00, 0xDC, 0x00, 0x27, 0xFE,
+ 0x1C, 0x00, 0xF2, 0xFF, 0x39, 0xFF, 0x1C, 0x00,
+ 0xD5, 0xFF, 0x39, 0xFF, 0x1C, 0x00, 0xB7, 0xFF,
+ 0x39, 0xFF, 0x1C, 0x00, 0x9A, 0xFF, 0x39, 0xFF,
+ 0x1F, 0x00, 0x7C, 0xFF, 0xF6, 0xFE, 0x21, 0x00,
+ 0x5F, 0xFF, 0xBD, 0xFE, 0x23, 0x00, 0x41, 0xFF,
+ 0x79, 0xFE, 0x25, 0x00, 0x24, 0xFF, 0x27, 0xFE,
+ 0x14, 0x00, 0x10, 0x00, 0x0E, 0x00, 0x14, 0x00,
+ 0x30, 0x00, 0x0E, 0x00, 0x14, 0x00, 0x51, 0x00,
+ 0x0E, 0x00, 0x14, 0x00, 0x71, 0x00, 0x0E, 0x00,
+ 0x17, 0x00, 0x92, 0x00, 0x13, 0x00, 0x19, 0x00,
+ 0xB2, 0x00, 0x17, 0x00, 0x1B, 0x00, 0xD3, 0x00,
+ 0x1C, 0x00, 0x1D, 0x00, 0xF3, 0x00, 0x22, 0x00,
+ 0x14, 0x00, 0xF0, 0xFF, 0x0E, 0x00, 0x14, 0x00,
+ 0xD0, 0xFF, 0x0E, 0x00, 0x14, 0x00, 0xAF, 0xFF,
+ 0x0E, 0x00, 0x14, 0x00, 0x8F, 0xFF, 0x0E, 0x00,
+ 0x17, 0x00, 0x6E, 0xFF, 0x13, 0x00, 0x19, 0x00,
+ 0x4E, 0xFF, 0x17, 0x00, 0x1B, 0x00, 0x2D, 0xFF,
+ 0x1C, 0x00, 0x1D, 0x00, 0x0D, 0xFF, 0x22, 0x00,
+ 0x14, 0x00, 0x10, 0x00, 0x2B, 0x00, 0x14, 0x00,
+ 0x30, 0x00, 0x2B, 0x00, 0x14, 0x00, 0x51, 0x00,
+ 0x2B, 0x00, 0x14, 0x00, 0x71, 0x00, 0x2B, 0x00,
+ 0x17, 0x00, 0x92, 0x00, 0x3A, 0x00, 0x19, 0x00,
+ 0xB2, 0x00, 0x46, 0x00, 0x1B, 0x00, 0xD3, 0x00,
+ 0x55, 0x00, 0x1D, 0x00, 0xF3, 0x00, 0x67, 0x00,
+ 0x14, 0x00, 0xF0, 0xFF, 0x2B, 0x00, 0x14, 0x00,
+ 0xD0, 0xFF, 0x2B, 0x00, 0x14, 0x00, 0xAF, 0xFF,
+ 0x2B, 0x00, 0x14, 0x00, 0x8F, 0xFF, 0x2B, 0x00,
+ 0x17, 0x00, 0x6E, 0xFF, 0x3A, 0x00, 0x19, 0x00,
+ 0x4E, 0xFF, 0x46, 0x00, 0x1B, 0x00, 0x2D, 0xFF,
+ 0x55, 0x00, 0x1D, 0x00, 0x0D, 0xFF, 0x67, 0x00,
+ 0x14, 0x00, 0x10, 0x00, 0x49, 0x00, 0x14, 0x00,
+ 0x30, 0x00, 0x49, 0x00, 0x14, 0x00, 0x51, 0x00,
+ 0x49, 0x00, 0x14, 0x00, 0x71, 0x00, 0x49, 0x00,
+ 0x17, 0x00, 0x92, 0x00, 0x61, 0x00, 0x19, 0x00,
+ 0xB2, 0x00, 0x76, 0x00, 0x1B, 0x00, 0xD3, 0x00,
+ 0x8F, 0x00, 0x1D, 0x00, 0xF3, 0x00, 0xAD, 0x00,
+ 0x14, 0x00, 0xF0, 0xFF, 0x49, 0x00, 0x14, 0x00,
+ 0xD0, 0xFF, 0x49, 0x00, 0x14, 0x00, 0xAF, 0xFF,
+ 0x49, 0x00, 0x14, 0x00, 0x8F, 0xFF, 0x49, 0x00,
+ 0x17, 0x00, 0x6E, 0xFF, 0x61, 0x00, 0x19, 0x00,
+ 0x4E, 0xFF, 0x76, 0x00, 0x1B, 0x00, 0x2D, 0xFF,
+ 0x8F, 0x00, 0x1D, 0x00, 0x0D, 0xFF, 0xAD, 0x00,
+ 0x14, 0x00, 0x10, 0x00, 0x66, 0x00, 0x14, 0x00,
+ 0x30, 0x00, 0x66, 0x00, 0x14, 0x00, 0x51, 0x00,
+ 0x66, 0x00, 0x14, 0x00, 0x71, 0x00, 0x66, 0x00,
+ 0x17, 0x00, 0x92, 0x00, 0x88, 0x00, 0x19, 0x00,
+ 0xB2, 0x00, 0xA5, 0x00, 0x1B, 0x00, 0xD3, 0x00,
+ 0xC8, 0x00, 0x1D, 0x00, 0xF3, 0x00, 0xF2, 0x00,
+ 0x14, 0x00, 0xF0, 0xFF, 0x66, 0x00, 0x14, 0x00,
+ 0xD0, 0xFF, 0x66, 0x00, 0x14, 0x00, 0xAF, 0xFF,
+ 0x66, 0x00, 0x14, 0x00, 0x8F, 0xFF, 0x66, 0x00,
+ 0x17, 0x00, 0x6E, 0xFF, 0x88, 0x00, 0x19, 0x00,
+ 0x4E, 0xFF, 0xA5, 0x00, 0x1B, 0x00, 0x2D, 0xFF,
+ 0xC8, 0x00, 0x1D, 0x00, 0x0D, 0xFF, 0xF2, 0x00,
+ 0x17, 0x00, 0x10, 0x00, 0x84, 0x00, 0x17, 0x00,
+ 0x30, 0x00, 0x84, 0x00, 0x17, 0x00, 0x51, 0x00,
+ 0x84, 0x00, 0x17, 0x00, 0x71, 0x00, 0x84, 0x00,
+ 0x1A, 0x00, 0x92, 0x00, 0xB0, 0x00, 0x1C, 0x00,
+ 0xB2, 0x00, 0xD5, 0x00, 0x1E, 0x00, 0xD3, 0x00,
+ 0x02, 0x01, 0x20, 0x00, 0xF3, 0x00, 0x39, 0x01,
+ 0x17, 0x00, 0xF0, 0xFF, 0x84, 0x00, 0x17, 0x00,
+ 0xD0, 0xFF, 0x84, 0x00, 0x17, 0x00, 0xAF, 0xFF,
+ 0x84, 0x00, 0x17, 0x00, 0x8F, 0xFF, 0x84, 0x00,
+ 0x1A, 0x00, 0x6E, 0xFF, 0xB0, 0x00, 0x1C, 0x00,
+ 0x4E, 0xFF, 0xD5, 0x00, 0x1E, 0x00, 0x2D, 0xFF,
+ 0x02, 0x01, 0x20, 0x00, 0x0D, 0xFF, 0x39, 0x01,
+ 0x19, 0x00, 0x10, 0x00, 0xA1, 0x00, 0x19, 0x00,
+ 0x30, 0x00, 0xA1, 0x00, 0x19, 0x00, 0x51, 0x00,
+ 0xA1, 0x00, 0x19, 0x00, 0x71, 0x00, 0xA1, 0x00,
+ 0x1C, 0x00, 0x92, 0x00, 0xD7, 0x00, 0x1E, 0x00,
+ 0xB2, 0x00, 0x04, 0x01, 0x20, 0x00, 0xD3, 0x00,
+ 0x3B, 0x01, 0x22, 0x00, 0xF3, 0x00, 0x7E, 0x01,
+ 0x19, 0x00, 0xF0, 0xFF, 0xA1, 0x00, 0x19, 0x00,
+ 0xD0, 0xFF, 0xA1, 0x00, 0x19, 0x00, 0xAF, 0xFF,
+ 0xA1, 0x00, 0x19, 0x00, 0x8F, 0xFF, 0xA1, 0x00,
+ 0x1C, 0x00, 0x6E, 0xFF, 0xD7, 0x00, 0x1E, 0x00,
+ 0x4E, 0xFF, 0x04, 0x01, 0x20, 0x00, 0x2D, 0xFF,
+ 0x3B, 0x01, 0x22, 0x00, 0x0D, 0xFF, 0x7E, 0x01,
+ 0x1B, 0x00, 0x10, 0x00, 0xBF, 0x00, 0x1B, 0x00,
+ 0x30, 0x00, 0xBF, 0x00, 0x1B, 0x00, 0x51, 0x00,
+ 0xBF, 0x00, 0x1B, 0x00, 0x71, 0x00, 0xBF, 0x00,
+ 0x1E, 0x00, 0x92, 0x00, 0xFE, 0x00, 0x20, 0x00,
+ 0xB2, 0x00, 0x34, 0x01, 0x22, 0x00, 0xD3, 0x00,
+ 0x75, 0x01, 0x24, 0x00, 0xF3, 0x00, 0xC4, 0x01,
+ 0x1B, 0x00, 0xF0, 0xFF, 0xBF, 0x00, 0x1B, 0x00,
+ 0xD0, 0xFF, 0xBF, 0x00, 0x1B, 0x00, 0xAF, 0xFF,
+ 0xBF, 0x00, 0x1B, 0x00, 0x8F, 0xFF, 0xBF, 0x00,
+ 0x1E, 0x00, 0x6E, 0xFF, 0xFE, 0x00, 0x20, 0x00,
+ 0x4E, 0xFF, 0x34, 0x01, 0x22, 0x00, 0x2D, 0xFF,
+ 0x75, 0x01, 0x24, 0x00, 0x0D, 0xFF, 0xC4, 0x01,
+ 0x1D, 0x00, 0x10, 0x00, 0xDC, 0x00, 0x1D, 0x00,
+ 0x30, 0x00, 0xDC, 0x00, 0x1D, 0x00, 0x51, 0x00,
+ 0xDC, 0x00, 0x1D, 0x00, 0x71, 0x00, 0xDC, 0x00,
+ 0x20, 0x00, 0x92, 0x00, 0x25, 0x01, 0x22, 0x00,
+ 0xB2, 0x00, 0x63, 0x01, 0x24, 0x00, 0xD3, 0x00,
+ 0xAE, 0x01, 0x26, 0x00, 0xF3, 0x00, 0x09, 0x02,
+ 0x1D, 0x00, 0xF0, 0xFF, 0xDC, 0x00, 0x1D, 0x00,
+ 0xD0, 0xFF, 0xDC, 0x00, 0x1D, 0x00, 0xAF, 0xFF,
+ 0xDC, 0x00, 0x1D, 0x00, 0x8F, 0xFF, 0xDC, 0x00,
+ 0x20, 0x00, 0x6E, 0xFF, 0x25, 0x01, 0x22, 0x00,
+ 0x4E, 0xFF, 0x63, 0x01, 0x24, 0x00, 0x2D, 0xFF,
+ 0xAE, 0x01, 0x26, 0x00, 0x0D, 0xFF, 0x09, 0x02,
+ 0x14, 0x00, 0x10, 0x00, 0xF2, 0xFF, 0x14, 0x00,
+ 0x30, 0x00, 0xF2, 0xFF, 0x14, 0x00, 0x51, 0x00,
+ 0xF2, 0xFF, 0x14, 0x00, 0x71, 0x00, 0xF2, 0xFF,
+ 0x17, 0x00, 0x92, 0x00, 0xED, 0xFF, 0x19, 0x00,
+ 0xB2, 0x00, 0xE9, 0xFF, 0x1B, 0x00, 0xD3, 0x00,
+ 0xE4, 0xFF, 0x1D, 0x00, 0xF3, 0x00, 0xDE, 0xFF,
+ 0x14, 0x00, 0xF0, 0xFF, 0xF2, 0xFF, 0x14, 0x00,
+ 0xD0, 0xFF, 0xF2, 0xFF, 0x14, 0x00, 0xAF, 0xFF,
+ 0xF2, 0xFF, 0x14, 0x00, 0x8F, 0xFF, 0xF2, 0xFF,
+ 0x17, 0x00, 0x6E, 0xFF, 0xED, 0xFF, 0x19, 0x00,
+ 0x4E, 0xFF, 0xE9, 0xFF, 0x1B, 0x00, 0x2D, 0xFF,
+ 0xE4, 0xFF, 0x1D, 0x00, 0x0D, 0xFF, 0xDE, 0xFF,
+ 0x14, 0x00, 0x10, 0x00, 0xD5, 0xFF, 0x14, 0x00,
+ 0x30, 0x00, 0xD5, 0xFF, 0x14, 0x00, 0x51, 0x00,
+ 0xD5, 0xFF, 0x14, 0x00, 0x71, 0x00, 0xD5, 0xFF,
+ 0x17, 0x00, 0x92, 0x00, 0xC6, 0xFF, 0x19, 0x00,
+ 0xB2, 0x00, 0xBA, 0xFF, 0x1B, 0x00, 0xD3, 0x00,
+ 0xAB, 0xFF, 0x1D, 0x00, 0xF3, 0x00, 0x99, 0xFF,
+ 0x14, 0x00, 0xF0, 0xFF, 0xD5, 0xFF, 0x14, 0x00,
+ 0xD0, 0xFF, 0xD5, 0xFF, 0x14, 0x00, 0xAF, 0xFF,
+ 0xD5, 0xFF, 0x14, 0x00, 0x8F, 0xFF, 0xD5, 0xFF,
+ 0x17, 0x00, 0x6E, 0xFF, 0xC6, 0xFF, 0x19, 0x00,
+ 0x4E, 0xFF, 0xBA, 0xFF, 0x1B, 0x00, 0x2D, 0xFF,
+ 0xAB, 0xFF, 0x1D, 0x00, 0x0D, 0xFF, 0x99, 0xFF,
+ 0x14, 0x00, 0x10, 0x00, 0xB7, 0xFF, 0x14, 0x00,
+ 0x30, 0x00, 0xB7, 0xFF, 0x14, 0x00, 0x51, 0x00,
+ 0xB7, 0xFF, 0x14, 0x00, 0x71, 0x00, 0xB7, 0xFF,
+ 0x17, 0x00, 0x92, 0x00, 0x9F, 0xFF, 0x19, 0x00,
+ 0xB2, 0x00, 0x8A, 0xFF, 0x1B, 0x00, 0xD3, 0x00,
+ 0x71, 0xFF, 0x1D, 0x00, 0xF3, 0x00, 0x53, 0xFF,
+ 0x14, 0x00, 0xF0, 0xFF, 0xB7, 0xFF, 0x14, 0x00,
+ 0xD0, 0xFF, 0xB7, 0xFF, 0x14, 0x00, 0xAF, 0xFF,
+ 0xB7, 0xFF, 0x14, 0x00, 0x8F, 0xFF, 0xB7, 0xFF,
+ 0x17, 0x00, 0x6E, 0xFF, 0x9F, 0xFF, 0x19, 0x00,
+ 0x4E, 0xFF, 0x8A, 0xFF, 0x1B, 0x00, 0x2D, 0xFF,
+ 0x71, 0xFF, 0x1D, 0x00, 0x0D, 0xFF, 0x53, 0xFF,
+ 0x14, 0x00, 0x10, 0x00, 0x9A, 0xFF, 0x14, 0x00,
+ 0x30, 0x00, 0x9A, 0xFF, 0x14, 0x00, 0x51, 0x00,
+ 0x9A, 0xFF, 0x14, 0x00, 0x71, 0x00, 0x9A, 0xFF,
+ 0x17, 0x00, 0x92, 0x00, 0x78, 0xFF, 0x19, 0x00,
+ 0xB2, 0x00, 0x5B, 0xFF, 0x1B, 0x00, 0xD3, 0x00,
+ 0x38, 0xFF, 0x1D, 0x00, 0xF3, 0x00, 0x0E, 0xFF,
+ 0x14, 0x00, 0xF0, 0xFF, 0x9A, 0xFF, 0x14, 0x00,
+ 0xD0, 0xFF, 0x9A, 0xFF, 0x14, 0x00, 0xAF, 0xFF,
+ 0x9A, 0xFF, 0x14, 0x00, 0x8F, 0xFF, 0x9A, 0xFF,
+ 0x17, 0x00, 0x6E, 0xFF, 0x78, 0xFF, 0x19, 0x00,
+ 0x4E, 0xFF, 0x5B, 0xFF, 0x1B, 0x00, 0x2D, 0xFF,
+ 0x38, 0xFF, 0x1D, 0x00, 0x0D, 0xFF, 0x0E, 0xFF,
+ 0x17, 0x00, 0x10, 0x00, 0x7C, 0xFF, 0x17, 0x00,
+ 0x30, 0x00, 0x7C, 0xFF, 0x17, 0x00, 0x51, 0x00,
+ 0x7C, 0xFF, 0x17, 0x00, 0x71, 0x00, 0x7C, 0xFF,
+ 0x1A, 0x00, 0x92, 0x00, 0x50, 0xFF, 0x1C, 0x00,
+ 0xB2, 0x00, 0x2B, 0xFF, 0x1E, 0x00, 0xD3, 0x00,
+ 0xFE, 0xFE, 0x20, 0x00, 0xF3, 0x00, 0xC7, 0xFE,
+ 0x17, 0x00, 0xF0, 0xFF, 0x7C, 0xFF, 0x17, 0x00,
+ 0xD0, 0xFF, 0x7C, 0xFF, 0x17, 0x00, 0xAF, 0xFF,
+ 0x7C, 0xFF, 0x17, 0x00, 0x8F, 0xFF, 0x7C, 0xFF,
+ 0x1A, 0x00, 0x6E, 0xFF, 0x50, 0xFF, 0x1C, 0x00,
+ 0x4E, 0xFF, 0x2B, 0xFF, 0x1E, 0x00, 0x2D, 0xFF,
+ 0xFE, 0xFE, 0x20, 0x00, 0x0D, 0xFF, 0xC7, 0xFE,
+ 0x19, 0x00, 0x10, 0x00, 0x5F, 0xFF, 0x19, 0x00,
+ 0x30, 0x00, 0x5F, 0xFF, 0x19, 0x00, 0x51, 0x00,
+ 0x5F, 0xFF, 0x19, 0x00, 0x71, 0x00, 0x5F, 0xFF,
+ 0x1C, 0x00, 0x92, 0x00, 0x29, 0xFF, 0x1E, 0x00,
+ 0xB2, 0x00, 0xFC, 0xFE, 0x20, 0x00, 0xD3, 0x00,
+ 0xC5, 0xFE, 0x22, 0x00, 0xF3, 0x00, 0x82, 0xFE,
+ 0x19, 0x00, 0xF0, 0xFF, 0x5F, 0xFF, 0x19, 0x00,
+ 0xD0, 0xFF, 0x5F, 0xFF, 0x19, 0x00, 0xAF, 0xFF,
+ 0x5F, 0xFF, 0x19, 0x00, 0x8F, 0xFF, 0x5F, 0xFF,
+ 0x1C, 0x00, 0x6E, 0xFF, 0x29, 0xFF, 0x1E, 0x00,
+ 0x4E, 0xFF, 0xFC, 0xFE, 0x20, 0x00, 0x2D, 0xFF,
+ 0xC5, 0xFE, 0x22, 0x00, 0x0D, 0xFF, 0x82, 0xFE,
+ 0x1B, 0x00, 0x10, 0x00, 0x41, 0xFF, 0x1B, 0x00,
+ 0x30, 0x00, 0x41, 0xFF, 0x1B, 0x00, 0x51, 0x00,
+ 0x41, 0xFF, 0x1B, 0x00, 0x71, 0x00, 0x41, 0xFF,
+ 0x1E, 0x00, 0x92, 0x00, 0x02, 0xFF, 0x20, 0x00,
+ 0xB2, 0x00, 0xCC, 0xFE, 0x22, 0x00, 0xD3, 0x00,
+ 0x8B, 0xFE, 0x24, 0x00, 0xF3, 0x00, 0x3C, 0xFE,
+ 0x1B, 0x00, 0xF0, 0xFF, 0x41, 0xFF, 0x1B, 0x00,
+ 0xD0, 0xFF, 0x41, 0xFF, 0x1B, 0x00, 0xAF, 0xFF,
+ 0x41, 0xFF, 0x1B, 0x00, 0x8F, 0xFF, 0x41, 0xFF,
+ 0x1E, 0x00, 0x6E, 0xFF, 0x02, 0xFF, 0x20, 0x00,
+ 0x4E, 0xFF, 0xCC, 0xFE, 0x22, 0x00, 0x2D, 0xFF,
+ 0x8B, 0xFE, 0x24, 0x00, 0x0D, 0xFF, 0x3C, 0xFE,
+ 0x1D, 0x00, 0x10, 0x00, 0x24, 0xFF, 0x1D, 0x00,
+ 0x30, 0x00, 0x24, 0xFF, 0x1D, 0x00, 0x51, 0x00,
+ 0x24, 0xFF, 0x1D, 0x00, 0x71, 0x00, 0x24, 0xFF,
+ 0x20, 0x00, 0x92, 0x00, 0xDB, 0xFE, 0x22, 0x00,
+ 0xB2, 0x00, 0x9D, 0xFE, 0x24, 0x00, 0xD3, 0x00,
+ 0x52, 0xFE, 0x26, 0x00, 0xF3, 0x00, 0xF7, 0xFD,
+ 0x1D, 0x00, 0xF0, 0xFF, 0x24, 0xFF, 0x1D, 0x00,
+ 0xD0, 0xFF, 0x24, 0xFF, 0x1D, 0x00, 0xAF, 0xFF,
+ 0x24, 0xFF, 0x1D, 0x00, 0x8F, 0xFF, 0x24, 0xFF,
+ 0x20, 0x00, 0x6E, 0xFF, 0xDB, 0xFE, 0x22, 0x00,
+ 0x4E, 0xFF, 0x9D, 0xFE, 0x24, 0x00, 0x2D, 0xFF,
+ 0x52, 0xFE, 0x26, 0x00, 0x0D, 0xFF, 0xF7, 0xFD,
+ 0x15, 0x00, 0x11, 0x00, 0x10, 0x00, 0x15, 0x00,
+ 0x34, 0x00, 0x10, 0x00, 0x15, 0x00, 0x58, 0x00,
+ 0x10, 0x00, 0x15, 0x00, 0x7B, 0x00, 0x10, 0x00,
+ 0x18, 0x00, 0xA0, 0x00, 0x15, 0x00, 0x1A, 0x00,
+ 0xC3, 0x00, 0x1A, 0x00, 0x1C, 0x00, 0xE7, 0x00,
+ 0x1F, 0x00, 0x1E, 0x00, 0x0A, 0x01, 0x26, 0x00,
+ 0x15, 0x00, 0xEF, 0xFF, 0x10, 0x00, 0x15, 0x00,
+ 0xCC, 0xFF, 0x10, 0x00, 0x15, 0x00, 0xA8, 0xFF,
+ 0x10, 0x00, 0x15, 0x00, 0x85, 0xFF, 0x10, 0x00,
+ 0x18, 0x00, 0x60, 0xFF, 0x15, 0x00, 0x1A, 0x00,
+ 0x3D, 0xFF, 0x1A, 0x00, 0x1C, 0x00, 0x19, 0xFF,
+ 0x1F, 0x00, 0x1E, 0x00, 0xF6, 0xFE, 0x26, 0x00,
+ 0x15, 0x00, 0x11, 0x00, 0x30, 0x00, 0x15, 0x00,
+ 0x34, 0x00, 0x30, 0x00, 0x15, 0x00, 0x58, 0x00,
+ 0x30, 0x00, 0x15, 0x00, 0x7B, 0x00, 0x30, 0x00,
+ 0x18, 0x00, 0xA0, 0x00, 0x40, 0x00, 0x1A, 0x00,
+ 0xC3, 0x00, 0x4E, 0x00, 0x1C, 0x00, 0xE7, 0x00,
+ 0x5E, 0x00, 0x1E, 0x00, 0x0A, 0x01, 0x72, 0x00,
+ 0x15, 0x00, 0xEF, 0xFF, 0x30, 0x00, 0x15, 0x00,
+ 0xCC, 0xFF, 0x30, 0x00, 0x15, 0x00, 0xA8, 0xFF,
+ 0x30, 0x00, 0x15, 0x00, 0x85, 0xFF, 0x30, 0x00,
+ 0x18, 0x00, 0x60, 0xFF, 0x40, 0x00, 0x1A, 0x00,
+ 0x3D, 0xFF, 0x4E, 0x00, 0x1C, 0x00, 0x19, 0xFF,
+ 0x5E, 0x00, 0x1E, 0x00, 0xF6, 0xFE, 0x72, 0x00,
+ 0x15, 0x00, 0x11, 0x00, 0x51, 0x00, 0x15, 0x00,
+ 0x34, 0x00, 0x51, 0x00, 0x15, 0x00, 0x58, 0x00,
+ 0x51, 0x00, 0x15, 0x00, 0x7B, 0x00, 0x51, 0x00,
+ 0x18, 0x00, 0xA0, 0x00, 0x6B, 0x00, 0x1A, 0x00,
+ 0xC3, 0x00, 0x82, 0x00, 0x1C, 0x00, 0xE7, 0x00,
+ 0x9D, 0x00, 0x1E, 0x00, 0x0A, 0x01, 0xBF, 0x00,
+ 0x15, 0x00, 0xEF, 0xFF, 0x51, 0x00, 0x15, 0x00,
+ 0xCC, 0xFF, 0x51, 0x00, 0x15, 0x00, 0xA8, 0xFF,
+ 0x51, 0x00, 0x15, 0x00, 0x85, 0xFF, 0x51, 0x00,
+ 0x18, 0x00, 0x60, 0xFF, 0x6B, 0x00, 0x1A, 0x00,
+ 0x3D, 0xFF, 0x82, 0x00, 0x1C, 0x00, 0x19, 0xFF,
+ 0x9D, 0x00, 0x1E, 0x00, 0xF6, 0xFE, 0xBF, 0x00,
+ 0x15, 0x00, 0x11, 0x00, 0x71, 0x00, 0x15, 0x00,
+ 0x34, 0x00, 0x71, 0x00, 0x15, 0x00, 0x58, 0x00,
+ 0x71, 0x00, 0x15, 0x00, 0x7B, 0x00, 0x71, 0x00,
+ 0x18, 0x00, 0xA0, 0x00, 0x96, 0x00, 0x1A, 0x00,
+ 0xC3, 0x00, 0xB6, 0x00, 0x1C, 0x00, 0xE7, 0x00,
+ 0xDC, 0x00, 0x1E, 0x00, 0x0A, 0x01, 0x0B, 0x01,
+ 0x15, 0x00, 0xEF, 0xFF, 0x71, 0x00, 0x15, 0x00,
+ 0xCC, 0xFF, 0x71, 0x00, 0x15, 0x00, 0xA8, 0xFF,
+ 0x71, 0x00, 0x15, 0x00, 0x85, 0xFF, 0x71, 0x00,
+ 0x18, 0x00, 0x60, 0xFF, 0x96, 0x00, 0x1A, 0x00,
+ 0x3D, 0xFF, 0xB6, 0x00, 0x1C, 0x00, 0x19, 0xFF,
+ 0xDC, 0x00, 0x1E, 0x00, 0xF6, 0xFE, 0x0B, 0x01,
+ 0x18, 0x00, 0x11, 0x00, 0x92, 0x00, 0x18, 0x00,
+ 0x34, 0x00, 0x92, 0x00, 0x18, 0x00, 0x58, 0x00,
+ 0x92, 0x00, 0x18, 0x00, 0x7B, 0x00, 0x92, 0x00,
+ 0x1B, 0x00, 0xA0, 0x00, 0xC2, 0x00, 0x1D, 0x00,
+ 0xC3, 0x00, 0xEB, 0x00, 0x1F, 0x00, 0xE7, 0x00,
+ 0x1C, 0x01, 0x21, 0x00, 0x0A, 0x01, 0x59, 0x01,
+ 0x18, 0x00, 0xEF, 0xFF, 0x92, 0x00, 0x18, 0x00,
+ 0xCC, 0xFF, 0x92, 0x00, 0x18, 0x00, 0xA8, 0xFF,
+ 0x92, 0x00, 0x18, 0x00, 0x85, 0xFF, 0x92, 0x00,
+ 0x1B, 0x00, 0x60, 0xFF, 0xC2, 0x00, 0x1D, 0x00,
+ 0x3D, 0xFF, 0xEB, 0x00, 0x1F, 0x00, 0x19, 0xFF,
+ 0x1C, 0x01, 0x21, 0x00, 0xF6, 0xFE, 0x59, 0x01,
+ 0x1A, 0x00, 0x11, 0x00, 0xB2, 0x00, 0x1A, 0x00,
+ 0x34, 0x00, 0xB2, 0x00, 0x1A, 0x00, 0x58, 0x00,
+ 0xB2, 0x00, 0x1A, 0x00, 0x7B, 0x00, 0xB2, 0x00,
+ 0x1D, 0x00, 0xA0, 0x00, 0xED, 0x00, 0x1F, 0x00,
+ 0xC3, 0x00, 0x1F, 0x01, 0x21, 0x00, 0xE7, 0x00,
+ 0x5B, 0x01, 0x23, 0x00, 0x0A, 0x01, 0xA5, 0x01,
+ 0x1A, 0x00, 0xEF, 0xFF, 0xB2, 0x00, 0x1A, 0x00,
+ 0xCC, 0xFF, 0xB2, 0x00, 0x1A, 0x00, 0xA8, 0xFF,
+ 0xB2, 0x00, 0x1A, 0x00, 0x85, 0xFF, 0xB2, 0x00,
+ 0x1D, 0x00, 0x60, 0xFF, 0xED, 0x00, 0x1F, 0x00,
+ 0x3D, 0xFF, 0x1F, 0x01, 0x21, 0x00, 0x19, 0xFF,
+ 0x5B, 0x01, 0x23, 0x00, 0xF6, 0xFE, 0xA5, 0x01,
+ 0x1C, 0x00, 0x11, 0x00, 0xD3, 0x00, 0x1C, 0x00,
+ 0x34, 0x00, 0xD3, 0x00, 0x1C, 0x00, 0x58, 0x00,
+ 0xD3, 0x00, 0x1C, 0x00, 0x7B, 0x00, 0xD3, 0x00,
+ 0x1F, 0x00, 0xA0, 0x00, 0x18, 0x01, 0x21, 0x00,
+ 0xC3, 0x00, 0x53, 0x01, 0x23, 0x00, 0xE7, 0x00,
+ 0x9A, 0x01, 0x25, 0x00, 0x0A, 0x01, 0xF2, 0x01,
+ 0x1C, 0x00, 0xEF, 0xFF, 0xD3, 0x00, 0x1C, 0x00,
+ 0xCC, 0xFF, 0xD3, 0x00, 0x1C, 0x00, 0xA8, 0xFF,
+ 0xD3, 0x00, 0x1C, 0x00, 0x85, 0xFF, 0xD3, 0x00,
+ 0x1F, 0x00, 0x60, 0xFF, 0x18, 0x01, 0x21, 0x00,
+ 0x3D, 0xFF, 0x53, 0x01, 0x23, 0x00, 0x19, 0xFF,
+ 0x9A, 0x01, 0x25, 0x00, 0xF6, 0xFE, 0xF2, 0x01,
+ 0x1E, 0x00, 0x11, 0x00, 0xF3, 0x00, 0x1E, 0x00,
+ 0x34, 0x00, 0xF3, 0x00, 0x1E, 0x00, 0x58, 0x00,
+ 0xF3, 0x00, 0x1E, 0x00, 0x7B, 0x00, 0xF3, 0x00,
+ 0x21, 0x00, 0xA0, 0x00, 0x43, 0x01, 0x23, 0x00,
+ 0xC3, 0x00, 0x87, 0x01, 0x25, 0x00, 0xE7, 0x00,
+ 0xD9, 0x01, 0x27, 0x00, 0x0A, 0x01, 0x3E, 0x02,
+ 0x1E, 0x00, 0xEF, 0xFF, 0xF3, 0x00, 0x1E, 0x00,
+ 0xCC, 0xFF, 0xF3, 0x00, 0x1E, 0x00, 0xA8, 0xFF,
+ 0xF3, 0x00, 0x1E, 0x00, 0x85, 0xFF, 0xF3, 0x00,
+ 0x21, 0x00, 0x60, 0xFF, 0x43, 0x01, 0x23, 0x00,
+ 0x3D, 0xFF, 0x87, 0x01, 0x25, 0x00, 0x19, 0xFF,
+ 0xD9, 0x01, 0x27, 0x00, 0xF6, 0xFE, 0x3E, 0x02,
+ 0x15, 0x00, 0x11, 0x00, 0xF0, 0xFF, 0x15, 0x00,
+ 0x34, 0x00, 0xF0, 0xFF, 0x15, 0x00, 0x58, 0x00,
+ 0xF0, 0xFF, 0x15, 0x00, 0x7B, 0x00, 0xF0, 0xFF,
+ 0x18, 0x00, 0xA0, 0x00, 0xEB, 0xFF, 0x1A, 0x00,
+ 0xC3, 0x00, 0xE6, 0xFF, 0x1C, 0x00, 0xE7, 0x00,
+ 0xE1, 0xFF, 0x1E, 0x00, 0x0A, 0x01, 0xDA, 0xFF,
+ 0x15, 0x00, 0xEF, 0xFF, 0xF0, 0xFF, 0x15, 0x00,
+ 0xCC, 0xFF, 0xF0, 0xFF, 0x15, 0x00, 0xA8, 0xFF,
+ 0xF0, 0xFF, 0x15, 0x00, 0x85, 0xFF, 0xF0, 0xFF,
+ 0x18, 0x00, 0x60, 0xFF, 0xEB, 0xFF, 0x1A, 0x00,
+ 0x3D, 0xFF, 0xE6, 0xFF, 0x1C, 0x00, 0x19, 0xFF,
+ 0xE1, 0xFF, 0x1E, 0x00, 0xF6, 0xFE, 0xDA, 0xFF,
+ 0x15, 0x00, 0x11, 0x00, 0xD0, 0xFF, 0x15, 0x00,
+ 0x34, 0x00, 0xD0, 0xFF, 0x15, 0x00, 0x58, 0x00,
+ 0xD0, 0xFF, 0x15, 0x00, 0x7B, 0x00, 0xD0, 0xFF,
+ 0x18, 0x00, 0xA0, 0x00, 0xC0, 0xFF, 0x1A, 0x00,
+ 0xC3, 0x00, 0xB2, 0xFF, 0x1C, 0x00, 0xE7, 0x00,
+ 0xA2, 0xFF, 0x1E, 0x00, 0x0A, 0x01, 0x8E, 0xFF,
+ 0x15, 0x00, 0xEF, 0xFF, 0xD0, 0xFF, 0x15, 0x00,
+ 0xCC, 0xFF, 0xD0, 0xFF, 0x15, 0x00, 0xA8, 0xFF,
+ 0xD0, 0xFF, 0x15, 0x00, 0x85, 0xFF, 0xD0, 0xFF,
+ 0x18, 0x00, 0x60, 0xFF, 0xC0, 0xFF, 0x1A, 0x00,
+ 0x3D, 0xFF, 0xB2, 0xFF, 0x1C, 0x00, 0x19, 0xFF,
+ 0xA2, 0xFF, 0x1E, 0x00, 0xF6, 0xFE, 0x8E, 0xFF,
+ 0x15, 0x00, 0x11, 0x00, 0xAF, 0xFF, 0x15, 0x00,
+ 0x34, 0x00, 0xAF, 0xFF, 0x15, 0x00, 0x58, 0x00,
+ 0xAF, 0xFF, 0x15, 0x00, 0x7B, 0x00, 0xAF, 0xFF,
+ 0x18, 0x00, 0xA0, 0x00, 0x95, 0xFF, 0x1A, 0x00,
+ 0xC3, 0x00, 0x7E, 0xFF, 0x1C, 0x00, 0xE7, 0x00,
+ 0x63, 0xFF, 0x1E, 0x00, 0x0A, 0x01, 0x41, 0xFF,
+ 0x15, 0x00, 0xEF, 0xFF, 0xAF, 0xFF, 0x15, 0x00,
+ 0xCC, 0xFF, 0xAF, 0xFF, 0x15, 0x00, 0xA8, 0xFF,
+ 0xAF, 0xFF, 0x15, 0x00, 0x85, 0xFF, 0xAF, 0xFF,
+ 0x18, 0x00, 0x60, 0xFF, 0x95, 0xFF, 0x1A, 0x00,
+ 0x3D, 0xFF, 0x7E, 0xFF, 0x1C, 0x00, 0x19, 0xFF,
+ 0x63, 0xFF, 0x1E, 0x00, 0xF6, 0xFE, 0x41, 0xFF,
+ 0x15, 0x00, 0x11, 0x00, 0x8F, 0xFF, 0x15, 0x00,
+ 0x34, 0x00, 0x8F, 0xFF, 0x15, 0x00, 0x58, 0x00,
+ 0x8F, 0xFF, 0x15, 0x00, 0x7B, 0x00, 0x8F, 0xFF,
+ 0x18, 0x00, 0xA0, 0x00, 0x6A, 0xFF, 0x1A, 0x00,
+ 0xC3, 0x00, 0x4A, 0xFF, 0x1C, 0x00, 0xE7, 0x00,
+ 0x24, 0xFF, 0x1E, 0x00, 0x0A, 0x01, 0xF5, 0xFE,
+ 0x15, 0x00, 0xEF, 0xFF, 0x8F, 0xFF, 0x15, 0x00,
+ 0xCC, 0xFF, 0x8F, 0xFF, 0x15, 0x00, 0xA8, 0xFF,
+ 0x8F, 0xFF, 0x15, 0x00, 0x85, 0xFF, 0x8F, 0xFF,
+ 0x18, 0x00, 0x60, 0xFF, 0x6A, 0xFF, 0x1A, 0x00,
+ 0x3D, 0xFF, 0x4A, 0xFF, 0x1C, 0x00, 0x19, 0xFF,
+ 0x24, 0xFF, 0x1E, 0x00, 0xF6, 0xFE, 0xF5, 0xFE,
+ 0x18, 0x00, 0x11, 0x00, 0x6E, 0xFF, 0x18, 0x00,
+ 0x34, 0x00, 0x6E, 0xFF, 0x18, 0x00, 0x58, 0x00,
+ 0x6E, 0xFF, 0x18, 0x00, 0x7B, 0x00, 0x6E, 0xFF,
+ 0x1B, 0x00, 0xA0, 0x00, 0x3E, 0xFF, 0x1D, 0x00,
+ 0xC3, 0x00, 0x15, 0xFF, 0x1F, 0x00, 0xE7, 0x00,
+ 0xE4, 0xFE, 0x21, 0x00, 0x0A, 0x01, 0xA7, 0xFE,
+ 0x18, 0x00, 0xEF, 0xFF, 0x6E, 0xFF, 0x18, 0x00,
+ 0xCC, 0xFF, 0x6E, 0xFF, 0x18, 0x00, 0xA8, 0xFF,
+ 0x6E, 0xFF, 0x18, 0x00, 0x85, 0xFF, 0x6E, 0xFF,
+ 0x1B, 0x00, 0x60, 0xFF, 0x3E, 0xFF, 0x1D, 0x00,
+ 0x3D, 0xFF, 0x15, 0xFF, 0x1F, 0x00, 0x19, 0xFF,
+ 0xE4, 0xFE, 0x21, 0x00, 0xF6, 0xFE, 0xA7, 0xFE,
+ 0x1A, 0x00, 0x11, 0x00, 0x4E, 0xFF, 0x1A, 0x00,
+ 0x34, 0x00, 0x4E, 0xFF, 0x1A, 0x00, 0x58, 0x00,
+ 0x4E, 0xFF, 0x1A, 0x00, 0x7B, 0x00, 0x4E, 0xFF,
+ 0x1D, 0x00, 0xA0, 0x00, 0x13, 0xFF, 0x1F, 0x00,
+ 0xC3, 0x00, 0xE1, 0xFE, 0x21, 0x00, 0xE7, 0x00,
+ 0xA5, 0xFE, 0x23, 0x00, 0x0A, 0x01, 0x5B, 0xFE,
+ 0x1A, 0x00, 0xEF, 0xFF, 0x4E, 0xFF, 0x1A, 0x00,
+ 0xCC, 0xFF, 0x4E, 0xFF, 0x1A, 0x00, 0xA8, 0xFF,
+ 0x4E, 0xFF, 0x1A, 0x00, 0x85, 0xFF, 0x4E, 0xFF,
+ 0x1D, 0x00, 0x60, 0xFF, 0x13, 0xFF, 0x1F, 0x00,
+ 0x3D, 0xFF, 0xE1, 0xFE, 0x21, 0x00, 0x19, 0xFF,
+ 0xA5, 0xFE, 0x23, 0x00, 0xF6, 0xFE, 0x5B, 0xFE,
+ 0x1C, 0x00, 0x11, 0x00, 0x2D, 0xFF, 0x1C, 0x00,
+ 0x34, 0x00, 0x2D, 0xFF, 0x1C, 0x00, 0x58, 0x00,
+ 0x2D, 0xFF, 0x1C, 0x00, 0x7B, 0x00, 0x2D, 0xFF,
+ 0x1F, 0x00, 0xA0, 0x00, 0xE8, 0xFE, 0x21, 0x00,
+ 0xC3, 0x00, 0xAD, 0xFE, 0x23, 0x00, 0xE7, 0x00,
+ 0x66, 0xFE, 0x25, 0x00, 0x0A, 0x01, 0x0E, 0xFE,
+ 0x1C, 0x00, 0xEF, 0xFF, 0x2D, 0xFF, 0x1C, 0x00,
+ 0xCC, 0xFF, 0x2D, 0xFF, 0x1C, 0x00, 0xA8, 0xFF,
+ 0x2D, 0xFF, 0x1C, 0x00, 0x85, 0xFF, 0x2D, 0xFF,
+ 0x1F, 0x00, 0x60, 0xFF, 0xE8, 0xFE, 0x21, 0x00,
+ 0x3D, 0xFF, 0xAD, 0xFE, 0x23, 0x00, 0x19, 0xFF,
+ 0x66, 0xFE, 0x25, 0x00, 0xF6, 0xFE, 0x0E, 0xFE,
+ 0x1E, 0x00, 0x11, 0x00, 0x0D, 0xFF, 0x1E, 0x00,
+ 0x34, 0x00, 0x0D, 0xFF, 0x1E, 0x00, 0x58, 0x00,
+ 0x0D, 0xFF, 0x1E, 0x00, 0x7B, 0x00, 0x0D, 0xFF,
+ 0x21, 0x00, 0xA0, 0x00, 0xBD, 0xFE, 0x23, 0x00,
+ 0xC3, 0x00, 0x79, 0xFE, 0x25, 0x00, 0xE7, 0x00,
+ 0x27, 0xFE, 0x27, 0x00, 0x0A, 0x01, 0xC2, 0xFD,
+ 0x1E, 0x00, 0xEF, 0xFF, 0x0D, 0xFF, 0x1E, 0x00,
+ 0xCC, 0xFF, 0x0D, 0xFF, 0x1E, 0x00, 0xA8, 0xFF,
+ 0x0D, 0xFF, 0x1E, 0x00, 0x85, 0xFF, 0x0D, 0xFF,
+ 0x21, 0x00, 0x60, 0xFF, 0xBD, 0xFE, 0x23, 0x00,
+ 0x3D, 0xFF, 0x79, 0xFE, 0x25, 0x00, 0x19, 0xFF,
+ 0x27, 0xFE, 0x27, 0x00, 0xF6, 0xFE, 0xC2, 0xFD,
+ 0x16, 0x00, 0x13, 0x00, 0x11, 0x00, 0x16, 0x00,
+ 0x3A, 0x00, 0x11, 0x00, 0x16, 0x00, 0x61, 0x00,
+ 0x11, 0x00, 0x16, 0x00, 0x88, 0x00, 0x11, 0x00,
+ 0x19, 0x00, 0xB0, 0x00, 0x17, 0x00, 0x1B, 0x00,
+ 0xD7, 0x00, 0x1C, 0x00, 0x1D, 0x00, 0xFE, 0x00,
+ 0x22, 0x00, 0x1F, 0x00, 0x25, 0x01, 0x2A, 0x00,
+ 0x16, 0x00, 0xED, 0xFF, 0x11, 0x00, 0x16, 0x00,
+ 0xC6, 0xFF, 0x11, 0x00, 0x16, 0x00, 0x9F, 0xFF,
+ 0x11, 0x00, 0x16, 0x00, 0x78, 0xFF, 0x11, 0x00,
+ 0x19, 0x00, 0x50, 0xFF, 0x17, 0x00, 0x1B, 0x00,
+ 0x29, 0xFF, 0x1C, 0x00, 0x1D, 0x00, 0x02, 0xFF,
+ 0x22, 0x00, 0x1F, 0x00, 0xDB, 0xFE, 0x2A, 0x00,
+ 0x16, 0x00, 0x13, 0x00, 0x34, 0x00, 0x16, 0x00,
+ 0x3A, 0x00, 0x34, 0x00, 0x16, 0x00, 0x61, 0x00,
+ 0x34, 0x00, 0x16, 0x00, 0x88, 0x00, 0x34, 0x00,
+ 0x19, 0x00, 0xB0, 0x00, 0x46, 0x00, 0x1B, 0x00,
+ 0xD7, 0x00, 0x55, 0x00, 0x1D, 0x00, 0xFE, 0x00,
+ 0x67, 0x00, 0x1F, 0x00, 0x25, 0x01, 0x7E, 0x00,
+ 0x16, 0x00, 0xED, 0xFF, 0x34, 0x00, 0x16, 0x00,
+ 0xC6, 0xFF, 0x34, 0x00, 0x16, 0x00, 0x9F, 0xFF,
+ 0x34, 0x00, 0x16, 0x00, 0x78, 0xFF, 0x34, 0x00,
+ 0x19, 0x00, 0x50, 0xFF, 0x46, 0x00, 0x1B, 0x00,
+ 0x29, 0xFF, 0x55, 0x00, 0x1D, 0x00, 0x02, 0xFF,
+ 0x67, 0x00, 0x1F, 0x00, 0xDB, 0xFE, 0x7E, 0x00,
+ 0x16, 0x00, 0x13, 0x00, 0x58, 0x00, 0x16, 0x00,
+ 0x3A, 0x00, 0x58, 0x00, 0x16, 0x00, 0x61, 0x00,
+ 0x58, 0x00, 0x16, 0x00, 0x88, 0x00, 0x58, 0x00,
+ 0x19, 0x00, 0xB0, 0x00, 0x76, 0x00, 0x1B, 0x00,
+ 0xD7, 0x00, 0x8F, 0x00, 0x1D, 0x00, 0xFE, 0x00,
+ 0xAD, 0x00, 0x1F, 0x00, 0x25, 0x01, 0xD2, 0x00,
+ 0x16, 0x00, 0xED, 0xFF, 0x58, 0x00, 0x16, 0x00,
+ 0xC6, 0xFF, 0x58, 0x00, 0x16, 0x00, 0x9F, 0xFF,
+ 0x58, 0x00, 0x16, 0x00, 0x78, 0xFF, 0x58, 0x00,
+ 0x19, 0x00, 0x50, 0xFF, 0x76, 0x00, 0x1B, 0x00,
+ 0x29, 0xFF, 0x8F, 0x00, 0x1D, 0x00, 0x02, 0xFF,
+ 0xAD, 0x00, 0x1F, 0x00, 0xDB, 0xFE, 0xD2, 0x00,
+ 0x16, 0x00, 0x13, 0x00, 0x7B, 0x00, 0x16, 0x00,
+ 0x3A, 0x00, 0x7B, 0x00, 0x16, 0x00, 0x61, 0x00,
+ 0x7B, 0x00, 0x16, 0x00, 0x88, 0x00, 0x7B, 0x00,
+ 0x19, 0x00, 0xB0, 0x00, 0xA5, 0x00, 0x1B, 0x00,
+ 0xD7, 0x00, 0xC8, 0x00, 0x1D, 0x00, 0xFE, 0x00,
+ 0xF2, 0x00, 0x1F, 0x00, 0x25, 0x01, 0x26, 0x01,
+ 0x16, 0x00, 0xED, 0xFF, 0x7B, 0x00, 0x16, 0x00,
+ 0xC6, 0xFF, 0x7B, 0x00, 0x16, 0x00, 0x9F, 0xFF,
+ 0x7B, 0x00, 0x16, 0x00, 0x78, 0xFF, 0x7B, 0x00,
+ 0x19, 0x00, 0x50, 0xFF, 0xA5, 0x00, 0x1B, 0x00,
+ 0x29, 0xFF, 0xC8, 0x00, 0x1D, 0x00, 0x02, 0xFF,
+ 0xF2, 0x00, 0x1F, 0x00, 0xDB, 0xFE, 0x26, 0x01,
+ 0x19, 0x00, 0x13, 0x00, 0xA0, 0x00, 0x19, 0x00,
+ 0x3A, 0x00, 0xA0, 0x00, 0x19, 0x00, 0x61, 0x00,
+ 0xA0, 0x00, 0x19, 0x00, 0x88, 0x00, 0xA0, 0x00,
+ 0x1C, 0x00, 0xB0, 0x00, 0xD5, 0x00, 0x1E, 0x00,
+ 0xD7, 0x00, 0x02, 0x01, 0x20, 0x00, 0xFE, 0x00,
+ 0x39, 0x01, 0x22, 0x00, 0x25, 0x01, 0x7B, 0x01,
+ 0x19, 0x00, 0xED, 0xFF, 0xA0, 0x00, 0x19, 0x00,
+ 0xC6, 0xFF, 0xA0, 0x00, 0x19, 0x00, 0x9F, 0xFF,
+ 0xA0, 0x00, 0x19, 0x00, 0x78, 0xFF, 0xA0, 0x00,
+ 0x1C, 0x00, 0x50, 0xFF, 0xD5, 0x00, 0x1E, 0x00,
+ 0x29, 0xFF, 0x02, 0x01, 0x20, 0x00, 0x02, 0xFF,
+ 0x39, 0x01, 0x22, 0x00, 0xDB, 0xFE, 0x7B, 0x01,
+ 0x1B, 0x00, 0x13, 0x00, 0xC3, 0x00, 0x1B, 0x00,
+ 0x3A, 0x00, 0xC3, 0x00, 0x1B, 0x00, 0x61, 0x00,
+ 0xC3, 0x00, 0x1B, 0x00, 0x88, 0x00, 0xC3, 0x00,
+ 0x1E, 0x00, 0xB0, 0x00, 0x04, 0x01, 0x20, 0x00,
+ 0xD7, 0x00, 0x3B, 0x01, 0x22, 0x00, 0xFE, 0x00,
+ 0x7E, 0x01, 0x24, 0x00, 0x25, 0x01, 0xCF, 0x01,
+ 0x1B, 0x00, 0xED, 0xFF, 0xC3, 0x00, 0x1B, 0x00,
+ 0xC6, 0xFF, 0xC3, 0x00, 0x1B, 0x00, 0x9F, 0xFF,
+ 0xC3, 0x00, 0x1B, 0x00, 0x78, 0xFF, 0xC3, 0x00,
+ 0x1E, 0x00, 0x50, 0xFF, 0x04, 0x01, 0x20, 0x00,
+ 0x29, 0xFF, 0x3B, 0x01, 0x22, 0x00, 0x02, 0xFF,
+ 0x7E, 0x01, 0x24, 0x00, 0xDB, 0xFE, 0xCF, 0x01,
+ 0x1D, 0x00, 0x13, 0x00, 0xE7, 0x00, 0x1D, 0x00,
+ 0x3A, 0x00, 0xE7, 0x00, 0x1D, 0x00, 0x61, 0x00,
+ 0xE7, 0x00, 0x1D, 0x00, 0x88, 0x00, 0xE7, 0x00,
+ 0x20, 0x00, 0xB0, 0x00, 0x34, 0x01, 0x22, 0x00,
+ 0xD7, 0x00, 0x75, 0x01, 0x24, 0x00, 0xFE, 0x00,
+ 0xC4, 0x01, 0x26, 0x00, 0x25, 0x01, 0x23, 0x02,
+ 0x1D, 0x00, 0xED, 0xFF, 0xE7, 0x00, 0x1D, 0x00,
+ 0xC6, 0xFF, 0xE7, 0x00, 0x1D, 0x00, 0x9F, 0xFF,
+ 0xE7, 0x00, 0x1D, 0x00, 0x78, 0xFF, 0xE7, 0x00,
+ 0x20, 0x00, 0x50, 0xFF, 0x34, 0x01, 0x22, 0x00,
+ 0x29, 0xFF, 0x75, 0x01, 0x24, 0x00, 0x02, 0xFF,
+ 0xC4, 0x01, 0x26, 0x00, 0xDB, 0xFE, 0x23, 0x02,
+ 0x1F, 0x00, 0x13, 0x00, 0x0A, 0x01, 0x1F, 0x00,
+ 0x3A, 0x00, 0x0A, 0x01, 0x1F, 0x00, 0x61, 0x00,
+ 0x0A, 0x01, 0x1F, 0x00, 0x88, 0x00, 0x0A, 0x01,
+ 0x22, 0x00, 0xB0, 0x00, 0x63, 0x01, 0x24, 0x00,
+ 0xD7, 0x00, 0xAE, 0x01, 0x26, 0x00, 0xFE, 0x00,
+ 0x09, 0x02, 0x28, 0x00, 0x25, 0x01, 0x77, 0x02,
+ 0x1F, 0x00, 0xED, 0xFF, 0x0A, 0x01, 0x1F, 0x00,
+ 0xC6, 0xFF, 0x0A, 0x01, 0x1F, 0x00, 0x9F, 0xFF,
+ 0x0A, 0x01, 0x1F, 0x00, 0x78, 0xFF, 0x0A, 0x01,
+ 0x22, 0x00, 0x50, 0xFF, 0x63, 0x01, 0x24, 0x00,
+ 0x29, 0xFF, 0xAE, 0x01, 0x26, 0x00, 0x02, 0xFF,
+ 0x09, 0x02, 0x28, 0x00, 0xDB, 0xFE, 0x77, 0x02,
+ 0x16, 0x00, 0x13, 0x00, 0xEF, 0xFF, 0x16, 0x00,
+ 0x3A, 0x00, 0xEF, 0xFF, 0x16, 0x00, 0x61, 0x00,
+ 0xEF, 0xFF, 0x16, 0x00, 0x88, 0x00, 0xEF, 0xFF,
+ 0x19, 0x00, 0xB0, 0x00, 0xE9, 0xFF, 0x1B, 0x00,
+ 0xD7, 0x00, 0xE4, 0xFF, 0x1D, 0x00, 0xFE, 0x00,
+ 0xDE, 0xFF, 0x1F, 0x00, 0x25, 0x01, 0xD6, 0xFF,
+ 0x16, 0x00, 0xED, 0xFF, 0xEF, 0xFF, 0x16, 0x00,
+ 0xC6, 0xFF, 0xEF, 0xFF, 0x16, 0x00, 0x9F, 0xFF,
+ 0xEF, 0xFF, 0x16, 0x00, 0x78, 0xFF, 0xEF, 0xFF,
+ 0x19, 0x00, 0x50, 0xFF, 0xE9, 0xFF, 0x1B, 0x00,
+ 0x29, 0xFF, 0xE4, 0xFF, 0x1D, 0x00, 0x02, 0xFF,
+ 0xDE, 0xFF, 0x1F, 0x00, 0xDB, 0xFE, 0xD6, 0xFF,
+ 0x16, 0x00, 0x13, 0x00, 0xCC, 0xFF, 0x16, 0x00,
+ 0x3A, 0x00, 0xCC, 0xFF, 0x16, 0x00, 0x61, 0x00,
+ 0xCC, 0xFF, 0x16, 0x00, 0x88, 0x00, 0xCC, 0xFF,
+ 0x19, 0x00, 0xB0, 0x00, 0xBA, 0xFF, 0x1B, 0x00,
+ 0xD7, 0x00, 0xAB, 0xFF, 0x1D, 0x00, 0xFE, 0x00,
+ 0x99, 0xFF, 0x1F, 0x00, 0x25, 0x01, 0x82, 0xFF,
+ 0x16, 0x00, 0xED, 0xFF, 0xCC, 0xFF, 0x16, 0x00,
+ 0xC6, 0xFF, 0xCC, 0xFF, 0x16, 0x00, 0x9F, 0xFF,
+ 0xCC, 0xFF, 0x16, 0x00, 0x78, 0xFF, 0xCC, 0xFF,
+ 0x19, 0x00, 0x50, 0xFF, 0xBA, 0xFF, 0x1B, 0x00,
+ 0x29, 0xFF, 0xAB, 0xFF, 0x1D, 0x00, 0x02, 0xFF,
+ 0x99, 0xFF, 0x1F, 0x00, 0xDB, 0xFE, 0x82, 0xFF,
+ 0x16, 0x00, 0x13, 0x00, 0xA8, 0xFF, 0x16, 0x00,
+ 0x3A, 0x00, 0xA8, 0xFF, 0x16, 0x00, 0x61, 0x00,
+ 0xA8, 0xFF, 0x16, 0x00, 0x88, 0x00, 0xA8, 0xFF,
+ 0x19, 0x00, 0xB0, 0x00, 0x8A, 0xFF, 0x1B, 0x00,
+ 0xD7, 0x00, 0x71, 0xFF, 0x1D, 0x00, 0xFE, 0x00,
+ 0x53, 0xFF, 0x1F, 0x00, 0x25, 0x01, 0x2E, 0xFF,
+ 0x16, 0x00, 0xED, 0xFF, 0xA8, 0xFF, 0x16, 0x00,
+ 0xC6, 0xFF, 0xA8, 0xFF, 0x16, 0x00, 0x9F, 0xFF,
+ 0xA8, 0xFF, 0x16, 0x00, 0x78, 0xFF, 0xA8, 0xFF,
+ 0x19, 0x00, 0x50, 0xFF, 0x8A, 0xFF, 0x1B, 0x00,
+ 0x29, 0xFF, 0x71, 0xFF, 0x1D, 0x00, 0x02, 0xFF,
+ 0x53, 0xFF, 0x1F, 0x00, 0xDB, 0xFE, 0x2E, 0xFF,
+ 0x16, 0x00, 0x13, 0x00, 0x85, 0xFF, 0x16, 0x00,
+ 0x3A, 0x00, 0x85, 0xFF, 0x16, 0x00, 0x61, 0x00,
+ 0x85, 0xFF, 0x16, 0x00, 0x88, 0x00, 0x85, 0xFF,
+ 0x19, 0x00, 0xB0, 0x00, 0x5B, 0xFF, 0x1B, 0x00,
+ 0xD7, 0x00, 0x38, 0xFF, 0x1D, 0x00, 0xFE, 0x00,
+ 0x0E, 0xFF, 0x1F, 0x00, 0x25, 0x01, 0xDA, 0xFE,
+ 0x16, 0x00, 0xED, 0xFF, 0x85, 0xFF, 0x16, 0x00,
+ 0xC6, 0xFF, 0x85, 0xFF, 0x16, 0x00, 0x9F, 0xFF,
+ 0x85, 0xFF, 0x16, 0x00, 0x78, 0xFF, 0x85, 0xFF,
+ 0x19, 0x00, 0x50, 0xFF, 0x5B, 0xFF, 0x1B, 0x00,
+ 0x29, 0xFF, 0x38, 0xFF, 0x1D, 0x00, 0x02, 0xFF,
+ 0x0E, 0xFF, 0x1F, 0x00, 0xDB, 0xFE, 0xDA, 0xFE,
+ 0x19, 0x00, 0x13, 0x00, 0x60, 0xFF, 0x19, 0x00,
+ 0x3A, 0x00, 0x60, 0xFF, 0x19, 0x00, 0x61, 0x00,
+ 0x60, 0xFF, 0x19, 0x00, 0x88, 0x00, 0x60, 0xFF,
+ 0x1C, 0x00, 0xB0, 0x00, 0x2B, 0xFF, 0x1E, 0x00,
+ 0xD7, 0x00, 0xFE, 0xFE, 0x20, 0x00, 0xFE, 0x00,
+ 0xC7, 0xFE, 0x22, 0x00, 0x25, 0x01, 0x85, 0xFE,
+ 0x19, 0x00, 0xED, 0xFF, 0x60, 0xFF, 0x19, 0x00,
+ 0xC6, 0xFF, 0x60, 0xFF, 0x19, 0x00, 0x9F, 0xFF,
+ 0x60, 0xFF, 0x19, 0x00, 0x78, 0xFF, 0x60, 0xFF,
+ 0x1C, 0x00, 0x50, 0xFF, 0x2B, 0xFF, 0x1E, 0x00,
+ 0x29, 0xFF, 0xFE, 0xFE, 0x20, 0x00, 0x02, 0xFF,
+ 0xC7, 0xFE, 0x22, 0x00, 0xDB, 0xFE, 0x85, 0xFE,
+ 0x1B, 0x00, 0x13, 0x00, 0x3D, 0xFF, 0x1B, 0x00,
+ 0x3A, 0x00, 0x3D, 0xFF, 0x1B, 0x00, 0x61, 0x00,
+ 0x3D, 0xFF, 0x1B, 0x00, 0x88, 0x00, 0x3D, 0xFF,
+ 0x1E, 0x00, 0xB0, 0x00, 0xFC, 0xFE, 0x20, 0x00,
+ 0xD7, 0x00, 0xC5, 0xFE, 0x22, 0x00, 0xFE, 0x00,
+ 0x82, 0xFE, 0x24, 0x00, 0x25, 0x01, 0x31, 0xFE,
+ 0x1B, 0x00, 0xED, 0xFF, 0x3D, 0xFF, 0x1B, 0x00,
+ 0xC6, 0xFF, 0x3D, 0xFF, 0x1B, 0x00, 0x9F, 0xFF,
+ 0x3D, 0xFF, 0x1B, 0x00, 0x78, 0xFF, 0x3D, 0xFF,
+ 0x1E, 0x00, 0x50, 0xFF, 0xFC, 0xFE, 0x20, 0x00,
+ 0x29, 0xFF, 0xC5, 0xFE, 0x22, 0x00, 0x02, 0xFF,
+ 0x82, 0xFE, 0x24, 0x00, 0xDB, 0xFE, 0x31, 0xFE,
+ 0x1D, 0x00, 0x13, 0x00, 0x19, 0xFF, 0x1D, 0x00,
+ 0x3A, 0x00, 0x19, 0xFF, 0x1D, 0x00, 0x61, 0x00,
+ 0x19, 0xFF, 0x1D, 0x00, 0x88, 0x00, 0x19, 0xFF,
+ 0x20, 0x00, 0xB0, 0x00, 0xCC, 0xFE, 0x22, 0x00,
+ 0xD7, 0x00, 0x8B, 0xFE, 0x24, 0x00, 0xFE, 0x00,
+ 0x3C, 0xFE, 0x26, 0x00, 0x25, 0x01, 0xDD, 0xFD,
+ 0x1D, 0x00, 0xED, 0xFF, 0x19, 0xFF, 0x1D, 0x00,
+ 0xC6, 0xFF, 0x19, 0xFF, 0x1D, 0x00, 0x9F, 0xFF,
+ 0x19, 0xFF, 0x1D, 0x00, 0x78, 0xFF, 0x19, 0xFF,
+ 0x20, 0x00, 0x50, 0xFF, 0xCC, 0xFE, 0x22, 0x00,
+ 0x29, 0xFF, 0x8B, 0xFE, 0x24, 0x00, 0x02, 0xFF,
+ 0x3C, 0xFE, 0x26, 0x00, 0xDB, 0xFE, 0xDD, 0xFD,
+ 0x1F, 0x00, 0x13, 0x00, 0xF6, 0xFE, 0x1F, 0x00,
+ 0x3A, 0x00, 0xF6, 0xFE, 0x1F, 0x00, 0x61, 0x00,
+ 0xF6, 0xFE, 0x1F, 0x00, 0x88, 0x00, 0xF6, 0xFE,
+ 0x22, 0x00, 0xB0, 0x00, 0x9D, 0xFE, 0x24, 0x00,
+ 0xD7, 0x00, 0x52, 0xFE, 0x26, 0x00, 0xFE, 0x00,
+ 0xF7, 0xFD, 0x28, 0x00, 0x25, 0x01, 0x89, 0xFD,
+ 0x1F, 0x00, 0xED, 0xFF, 0xF6, 0xFE, 0x1F, 0x00,
+ 0xC6, 0xFF, 0xF6, 0xFE, 0x1F, 0x00, 0x9F, 0xFF,
+ 0xF6, 0xFE, 0x1F, 0x00, 0x78, 0xFF, 0xF6, 0xFE,
+ 0x22, 0x00, 0x50, 0xFF, 0x9D, 0xFE, 0x24, 0x00,
+ 0x29, 0xFF, 0x52, 0xFE, 0x26, 0x00, 0x02, 0xFF,
+ 0xF7, 0xFD, 0x28, 0x00, 0xDB, 0xFE, 0x89, 0xFD,
+ 0x17, 0x00, 0x15, 0x00, 0x13, 0x00, 0x17, 0x00,
+ 0x40, 0x00, 0x13, 0x00, 0x17, 0x00, 0x6B, 0x00,
+ 0x13, 0x00, 0x17, 0x00, 0x96, 0x00, 0x13, 0x00,
+ 0x1A, 0x00, 0xC2, 0x00, 0x1A, 0x00, 0x1C, 0x00,
+ 0xED, 0x00, 0x1F, 0x00, 0x1E, 0x00, 0x18, 0x01,
+ 0x26, 0x00, 0x20, 0x00, 0x43, 0x01, 0x2E, 0x00,
+ 0x17, 0x00, 0xEB, 0xFF, 0x13, 0x00, 0x17, 0x00,
+ 0xC0, 0xFF, 0x13, 0x00, 0x17, 0x00, 0x95, 0xFF,
+ 0x13, 0x00, 0x17, 0x00, 0x6A, 0xFF, 0x13, 0x00,
+ 0x1A, 0x00, 0x3E, 0xFF, 0x1A, 0x00, 0x1C, 0x00,
+ 0x13, 0xFF, 0x1F, 0x00, 0x1E, 0x00, 0xE8, 0xFE,
+ 0x26, 0x00, 0x20, 0x00, 0xBD, 0xFE, 0x2E, 0x00,
+ 0x17, 0x00, 0x15, 0x00, 0x3A, 0x00, 0x17, 0x00,
+ 0x40, 0x00, 0x3A, 0x00, 0x17, 0x00, 0x6B, 0x00,
+ 0x3A, 0x00, 0x17, 0x00, 0x96, 0x00, 0x3A, 0x00,
+ 0x1A, 0x00, 0xC2, 0x00, 0x4E, 0x00, 0x1C, 0x00,
+ 0xED, 0x00, 0x5E, 0x00, 0x1E, 0x00, 0x18, 0x01,
+ 0x72, 0x00, 0x20, 0x00, 0x43, 0x01, 0x8A, 0x00,
+ 0x17, 0x00, 0xEB, 0xFF, 0x3A, 0x00, 0x17, 0x00,
+ 0xC0, 0xFF, 0x3A, 0x00, 0x17, 0x00, 0x95, 0xFF,
+ 0x3A, 0x00, 0x17, 0x00, 0x6A, 0xFF, 0x3A, 0x00,
+ 0x1A, 0x00, 0x3E, 0xFF, 0x4E, 0x00, 0x1C, 0x00,
+ 0x13, 0xFF, 0x5E, 0x00, 0x1E, 0x00, 0xE8, 0xFE,
+ 0x72, 0x00, 0x20, 0x00, 0xBD, 0xFE, 0x8A, 0x00,
+ 0x17, 0x00, 0x15, 0x00, 0x61, 0x00, 0x17, 0x00,
+ 0x40, 0x00, 0x61, 0x00, 0x17, 0x00, 0x6B, 0x00,
+ 0x61, 0x00, 0x17, 0x00, 0x96, 0x00, 0x61, 0x00,
+ 0x1A, 0x00, 0xC2, 0x00, 0x82, 0x00, 0x1C, 0x00,
+ 0xED, 0x00, 0x9D, 0x00, 0x1E, 0x00, 0x18, 0x01,
+ 0xBF, 0x00, 0x20, 0x00, 0x43, 0x01, 0xE7, 0x00,
+ 0x17, 0x00, 0xEB, 0xFF, 0x61, 0x00, 0x17, 0x00,
+ 0xC0, 0xFF, 0x61, 0x00, 0x17, 0x00, 0x95, 0xFF,
+ 0x61, 0x00, 0x17, 0x00, 0x6A, 0xFF, 0x61, 0x00,
+ 0x1A, 0x00, 0x3E, 0xFF, 0x82, 0x00, 0x1C, 0x00,
+ 0x13, 0xFF, 0x9D, 0x00, 0x1E, 0x00, 0xE8, 0xFE,
+ 0xBF, 0x00, 0x20, 0x00, 0xBD, 0xFE, 0xE7, 0x00,
+ 0x17, 0x00, 0x15, 0x00, 0x88, 0x00, 0x17, 0x00,
+ 0x40, 0x00, 0x88, 0x00, 0x17, 0x00, 0x6B, 0x00,
+ 0x88, 0x00, 0x17, 0x00, 0x96, 0x00, 0x88, 0x00,
+ 0x1A, 0x00, 0xC2, 0x00, 0xB6, 0x00, 0x1C, 0x00,
+ 0xED, 0x00, 0xDC, 0x00, 0x1E, 0x00, 0x18, 0x01,
+ 0x0B, 0x01, 0x20, 0x00, 0x43, 0x01, 0x43, 0x01,
+ 0x17, 0x00, 0xEB, 0xFF, 0x88, 0x00, 0x17, 0x00,
+ 0xC0, 0xFF, 0x88, 0x00, 0x17, 0x00, 0x95, 0xFF,
+ 0x88, 0x00, 0x17, 0x00, 0x6A, 0xFF, 0x88, 0x00,
+ 0x1A, 0x00, 0x3E, 0xFF, 0xB6, 0x00, 0x1C, 0x00,
+ 0x13, 0xFF, 0xDC, 0x00, 0x1E, 0x00, 0xE8, 0xFE,
+ 0x0B, 0x01, 0x20, 0x00, 0xBD, 0xFE, 0x43, 0x01,
+ 0x1A, 0x00, 0x15, 0x00, 0xB0, 0x00, 0x1A, 0x00,
+ 0x40, 0x00, 0xB0, 0x00, 0x1A, 0x00, 0x6B, 0x00,
+ 0xB0, 0x00, 0x1A, 0x00, 0x96, 0x00, 0xB0, 0x00,
+ 0x1D, 0x00, 0xC2, 0x00, 0xEB, 0x00, 0x1F, 0x00,
+ 0xED, 0x00, 0x1C, 0x01, 0x21, 0x00, 0x18, 0x01,
+ 0x59, 0x01, 0x23, 0x00, 0x43, 0x01, 0xA1, 0x01,
+ 0x1A, 0x00, 0xEB, 0xFF, 0xB0, 0x00, 0x1A, 0x00,
+ 0xC0, 0xFF, 0xB0, 0x00, 0x1A, 0x00, 0x95, 0xFF,
+ 0xB0, 0x00, 0x1A, 0x00, 0x6A, 0xFF, 0xB0, 0x00,
+ 0x1D, 0x00, 0x3E, 0xFF, 0xEB, 0x00, 0x1F, 0x00,
+ 0x13, 0xFF, 0x1C, 0x01, 0x21, 0x00, 0xE8, 0xFE,
+ 0x59, 0x01, 0x23, 0x00, 0xBD, 0xFE, 0xA1, 0x01,
+ 0x1C, 0x00, 0x15, 0x00, 0xD7, 0x00, 0x1C, 0x00,
+ 0x40, 0x00, 0xD7, 0x00, 0x1C, 0x00, 0x6B, 0x00,
+ 0xD7, 0x00, 0x1C, 0x00, 0x96, 0x00, 0xD7, 0x00,
+ 0x1F, 0x00, 0xC2, 0x00, 0x1F, 0x01, 0x21, 0x00,
+ 0xED, 0x00, 0x5B, 0x01, 0x23, 0x00, 0x18, 0x01,
+ 0xA5, 0x01, 0x25, 0x00, 0x43, 0x01, 0xFD, 0x01,
+ 0x1C, 0x00, 0xEB, 0xFF, 0xD7, 0x00, 0x1C, 0x00,
+ 0xC0, 0xFF, 0xD7, 0x00, 0x1C, 0x00, 0x95, 0xFF,
+ 0xD7, 0x00, 0x1C, 0x00, 0x6A, 0xFF, 0xD7, 0x00,
+ 0x1F, 0x00, 0x3E, 0xFF, 0x1F, 0x01, 0x21, 0x00,
+ 0x13, 0xFF, 0x5B, 0x01, 0x23, 0x00, 0xE8, 0xFE,
+ 0xA5, 0x01, 0x25, 0x00, 0xBD, 0xFE, 0xFD, 0x01,
+ 0x1E, 0x00, 0x15, 0x00, 0xFE, 0x00, 0x1E, 0x00,
+ 0x40, 0x00, 0xFE, 0x00, 0x1E, 0x00, 0x6B, 0x00,
+ 0xFE, 0x00, 0x1E, 0x00, 0x96, 0x00, 0xFE, 0x00,
+ 0x21, 0x00, 0xC2, 0x00, 0x53, 0x01, 0x23, 0x00,
+ 0xED, 0x00, 0x9A, 0x01, 0x25, 0x00, 0x18, 0x01,
+ 0xF2, 0x01, 0x27, 0x00, 0x43, 0x01, 0x5A, 0x02,
+ 0x1E, 0x00, 0xEB, 0xFF, 0xFE, 0x00, 0x1E, 0x00,
+ 0xC0, 0xFF, 0xFE, 0x00, 0x1E, 0x00, 0x95, 0xFF,
+ 0xFE, 0x00, 0x1E, 0x00, 0x6A, 0xFF, 0xFE, 0x00,
+ 0x21, 0x00, 0x3E, 0xFF, 0x53, 0x01, 0x23, 0x00,
+ 0x13, 0xFF, 0x9A, 0x01, 0x25, 0x00, 0xE8, 0xFE,
+ 0xF2, 0x01, 0x27, 0x00, 0xBD, 0xFE, 0x5A, 0x02,
+ 0x20, 0x00, 0x15, 0x00, 0x25, 0x01, 0x20, 0x00,
+ 0x40, 0x00, 0x25, 0x01, 0x20, 0x00, 0x6B, 0x00,
+ 0x25, 0x01, 0x20, 0x00, 0x96, 0x00, 0x25, 0x01,
+ 0x23, 0x00, 0xC2, 0x00, 0x87, 0x01, 0x25, 0x00,
+ 0xED, 0x00, 0xD9, 0x01, 0x27, 0x00, 0x18, 0x01,
+ 0x3E, 0x02, 0x29, 0x00, 0x43, 0x01, 0xB6, 0x02,
+ 0x20, 0x00, 0xEB, 0xFF, 0x25, 0x01, 0x20, 0x00,
+ 0xC0, 0xFF, 0x25, 0x01, 0x20, 0x00, 0x95, 0xFF,
+ 0x25, 0x01, 0x20, 0x00, 0x6A, 0xFF, 0x25, 0x01,
+ 0x23, 0x00, 0x3E, 0xFF, 0x87, 0x01, 0x25, 0x00,
+ 0x13, 0xFF, 0xD9, 0x01, 0x27, 0x00, 0xE8, 0xFE,
+ 0x3E, 0x02, 0x29, 0x00, 0xBD, 0xFE, 0xB6, 0x02,
+ 0x17, 0x00, 0x15, 0x00, 0xED, 0xFF, 0x17, 0x00,
+ 0x40, 0x00, 0xED, 0xFF, 0x17, 0x00, 0x6B, 0x00,
+ 0xED, 0xFF, 0x17, 0x00, 0x96, 0x00, 0xED, 0xFF,
+ 0x1A, 0x00, 0xC2, 0x00, 0xE6, 0xFF, 0x1C, 0x00,
+ 0xED, 0x00, 0xE1, 0xFF, 0x1E, 0x00, 0x18, 0x01,
+ 0xDA, 0xFF, 0x20, 0x00, 0x43, 0x01, 0xD2, 0xFF,
+ 0x17, 0x00, 0xEB, 0xFF, 0xED, 0xFF, 0x17, 0x00,
+ 0xC0, 0xFF, 0xED, 0xFF, 0x17, 0x00, 0x95, 0xFF,
+ 0xED, 0xFF, 0x17, 0x00, 0x6A, 0xFF, 0xED, 0xFF,
+ 0x1A, 0x00, 0x3E, 0xFF, 0xE6, 0xFF, 0x1C, 0x00,
+ 0x13, 0xFF, 0xE1, 0xFF, 0x1E, 0x00, 0xE8, 0xFE,
+ 0xDA, 0xFF, 0x20, 0x00, 0xBD, 0xFE, 0xD2, 0xFF,
+ 0x17, 0x00, 0x15, 0x00, 0xC6, 0xFF, 0x17, 0x00,
+ 0x40, 0x00, 0xC6, 0xFF, 0x17, 0x00, 0x6B, 0x00,
+ 0xC6, 0xFF, 0x17, 0x00, 0x96, 0x00, 0xC6, 0xFF,
+ 0x1A, 0x00, 0xC2, 0x00, 0xB2, 0xFF, 0x1C, 0x00,
+ 0xED, 0x00, 0xA2, 0xFF, 0x1E, 0x00, 0x18, 0x01,
+ 0x8E, 0xFF, 0x20, 0x00, 0x43, 0x01, 0x76, 0xFF,
+ 0x17, 0x00, 0xEB, 0xFF, 0xC6, 0xFF, 0x17, 0x00,
+ 0xC0, 0xFF, 0xC6, 0xFF, 0x17, 0x00, 0x95, 0xFF,
+ 0xC6, 0xFF, 0x17, 0x00, 0x6A, 0xFF, 0xC6, 0xFF,
+ 0x1A, 0x00, 0x3E, 0xFF, 0xB2, 0xFF, 0x1C, 0x00,
+ 0x13, 0xFF, 0xA2, 0xFF, 0x1E, 0x00, 0xE8, 0xFE,
+ 0x8E, 0xFF, 0x20, 0x00, 0xBD, 0xFE, 0x76, 0xFF,
+ 0x17, 0x00, 0x15, 0x00, 0x9F, 0xFF, 0x17, 0x00,
+ 0x40, 0x00, 0x9F, 0xFF, 0x17, 0x00, 0x6B, 0x00,
+ 0x9F, 0xFF, 0x17, 0x00, 0x96, 0x00, 0x9F, 0xFF,
+ 0x1A, 0x00, 0xC2, 0x00, 0x7E, 0xFF, 0x1C, 0x00,
+ 0xED, 0x00, 0x63, 0xFF, 0x1E, 0x00, 0x18, 0x01,
+ 0x41, 0xFF, 0x20, 0x00, 0x43, 0x01, 0x19, 0xFF,
+ 0x17, 0x00, 0xEB, 0xFF, 0x9F, 0xFF, 0x17, 0x00,
+ 0xC0, 0xFF, 0x9F, 0xFF, 0x17, 0x00, 0x95, 0xFF,
+ 0x9F, 0xFF, 0x17, 0x00, 0x6A, 0xFF, 0x9F, 0xFF,
+ 0x1A, 0x00, 0x3E, 0xFF, 0x7E, 0xFF, 0x1C, 0x00,
+ 0x13, 0xFF, 0x63, 0xFF, 0x1E, 0x00, 0xE8, 0xFE,
+ 0x41, 0xFF, 0x20, 0x00, 0xBD, 0xFE, 0x19, 0xFF,
+ 0x17, 0x00, 0x15, 0x00, 0x78, 0xFF, 0x17, 0x00,
+ 0x40, 0x00, 0x78, 0xFF, 0x17, 0x00, 0x6B, 0x00,
+ 0x78, 0xFF, 0x17, 0x00, 0x96, 0x00, 0x78, 0xFF,
+ 0x1A, 0x00, 0xC2, 0x00, 0x4A, 0xFF, 0x1C, 0x00,
+ 0xED, 0x00, 0x24, 0xFF, 0x1E, 0x00, 0x18, 0x01,
+ 0xF5, 0xFE, 0x20, 0x00, 0x43, 0x01, 0xBD, 0xFE,
+ 0x17, 0x00, 0xEB, 0xFF, 0x78, 0xFF, 0x17, 0x00,
+ 0xC0, 0xFF, 0x78, 0xFF, 0x17, 0x00, 0x95, 0xFF,
+ 0x78, 0xFF, 0x17, 0x00, 0x6A, 0xFF, 0x78, 0xFF,
+ 0x1A, 0x00, 0x3E, 0xFF, 0x4A, 0xFF, 0x1C, 0x00,
+ 0x13, 0xFF, 0x24, 0xFF, 0x1E, 0x00, 0xE8, 0xFE,
+ 0xF5, 0xFE, 0x20, 0x00, 0xBD, 0xFE, 0xBD, 0xFE,
+ 0x1A, 0x00, 0x15, 0x00, 0x50, 0xFF, 0x1A, 0x00,
+ 0x40, 0x00, 0x50, 0xFF, 0x1A, 0x00, 0x6B, 0x00,
+ 0x50, 0xFF, 0x1A, 0x00, 0x96, 0x00, 0x50, 0xFF,
+ 0x1D, 0x00, 0xC2, 0x00, 0x15, 0xFF, 0x1F, 0x00,
+ 0xED, 0x00, 0xE4, 0xFE, 0x21, 0x00, 0x18, 0x01,
+ 0xA7, 0xFE, 0x23, 0x00, 0x43, 0x01, 0x5F, 0xFE,
+ 0x1A, 0x00, 0xEB, 0xFF, 0x50, 0xFF, 0x1A, 0x00,
+ 0xC0, 0xFF, 0x50, 0xFF, 0x1A, 0x00, 0x95, 0xFF,
+ 0x50, 0xFF, 0x1A, 0x00, 0x6A, 0xFF, 0x50, 0xFF,
+ 0x1D, 0x00, 0x3E, 0xFF, 0x15, 0xFF, 0x1F, 0x00,
+ 0x13, 0xFF, 0xE4, 0xFE, 0x21, 0x00, 0xE8, 0xFE,
+ 0xA7, 0xFE, 0x23, 0x00, 0xBD, 0xFE, 0x5F, 0xFE,
+ 0x1C, 0x00, 0x15, 0x00, 0x29, 0xFF, 0x1C, 0x00,
+ 0x40, 0x00, 0x29, 0xFF, 0x1C, 0x00, 0x6B, 0x00,
+ 0x29, 0xFF, 0x1C, 0x00, 0x96, 0x00, 0x29, 0xFF,
+ 0x1F, 0x00, 0xC2, 0x00, 0xE1, 0xFE, 0x21, 0x00,
+ 0xED, 0x00, 0xA5, 0xFE, 0x23, 0x00, 0x18, 0x01,
+ 0x5B, 0xFE, 0x25, 0x00, 0x43, 0x01, 0x03, 0xFE,
+ 0x1C, 0x00, 0xEB, 0xFF, 0x29, 0xFF, 0x1C, 0x00,
+ 0xC0, 0xFF, 0x29, 0xFF, 0x1C, 0x00, 0x95, 0xFF,
+ 0x29, 0xFF, 0x1C, 0x00, 0x6A, 0xFF, 0x29, 0xFF,
+ 0x1F, 0x00, 0x3E, 0xFF, 0xE1, 0xFE, 0x21, 0x00,
+ 0x13, 0xFF, 0xA5, 0xFE, 0x23, 0x00, 0xE8, 0xFE,
+ 0x5B, 0xFE, 0x25, 0x00, 0xBD, 0xFE, 0x03, 0xFE,
+ 0x1E, 0x00, 0x15, 0x00, 0x02, 0xFF, 0x1E, 0x00,
+ 0x40, 0x00, 0x02, 0xFF, 0x1E, 0x00, 0x6B, 0x00,
+ 0x02, 0xFF, 0x1E, 0x00, 0x96, 0x00, 0x02, 0xFF,
+ 0x21, 0x00, 0xC2, 0x00, 0xAD, 0xFE, 0x23, 0x00,
+ 0xED, 0x00, 0x66, 0xFE, 0x25, 0x00, 0x18, 0x01,
+ 0x0E, 0xFE, 0x27, 0x00, 0x43, 0x01, 0xA6, 0xFD,
+ 0x1E, 0x00, 0xEB, 0xFF, 0x02, 0xFF, 0x1E, 0x00,
+ 0xC0, 0xFF, 0x02, 0xFF, 0x1E, 0x00, 0x95, 0xFF,
+ 0x02, 0xFF, 0x1E, 0x00, 0x6A, 0xFF, 0x02, 0xFF,
+ 0x21, 0x00, 0x3E, 0xFF, 0xAD, 0xFE, 0x23, 0x00,
+ 0x13, 0xFF, 0x66, 0xFE, 0x25, 0x00, 0xE8, 0xFE,
+ 0x0E, 0xFE, 0x27, 0x00, 0xBD, 0xFE, 0xA6, 0xFD,
+ 0x20, 0x00, 0x15, 0x00, 0xDB, 0xFE, 0x20, 0x00,
+ 0x40, 0x00, 0xDB, 0xFE, 0x20, 0x00, 0x6B, 0x00,
+ 0xDB, 0xFE, 0x20, 0x00, 0x96, 0x00, 0xDB, 0xFE,
+ 0x23, 0x00, 0xC2, 0x00, 0x79, 0xFE, 0x25, 0x00,
+ 0xED, 0x00, 0x27, 0xFE, 0x27, 0x00, 0x18, 0x01,
+ 0xC2, 0xFD, 0x29, 0x00, 0x43, 0x01, 0x4A, 0xFD,
+ 0x20, 0x00, 0xEB, 0xFF, 0xDB, 0xFE, 0x20, 0x00,
+ 0xC0, 0xFF, 0xDB, 0xFE, 0x20, 0x00, 0x95, 0xFF,
+ 0xDB, 0xFE, 0x20, 0x00, 0x6A, 0xFF, 0xDB, 0xFE,
+ 0x23, 0x00, 0x3E, 0xFF, 0x79, 0xFE, 0x25, 0x00,
+ 0x13, 0xFF, 0x27, 0xFE, 0x27, 0x00, 0xE8, 0xFE,
+ 0xC2, 0xFD, 0x29, 0x00, 0xBD, 0xFE, 0x4A, 0xFD,
+ 0x18, 0x00, 0x17, 0x00, 0x15, 0x00, 0x18, 0x00,
+ 0x46, 0x00, 0x15, 0x00, 0x18, 0x00, 0x76, 0x00,
+ 0x15, 0x00, 0x18, 0x00, 0xA5, 0x00, 0x15, 0x00,
+ 0x1B, 0x00, 0xD5, 0x00, 0x1C, 0x00, 0x1D, 0x00,
+ 0x04, 0x01, 0x22, 0x00, 0x1F, 0x00, 0x34, 0x01,
+ 0x2A, 0x00, 0x21, 0x00, 0x63, 0x01, 0x33, 0x00,
+ 0x18, 0x00, 0xE9, 0xFF, 0x15, 0x00, 0x18, 0x00,
+ 0xBA, 0xFF, 0x15, 0x00, 0x18, 0x00, 0x8A, 0xFF,
+ 0x15, 0x00, 0x18, 0x00, 0x5B, 0xFF, 0x15, 0x00,
+ 0x1B, 0x00, 0x2B, 0xFF, 0x1C, 0x00, 0x1D, 0x00,
+ 0xFC, 0xFE, 0x22, 0x00, 0x1F, 0x00, 0xCC, 0xFE,
+ 0x2A, 0x00, 0x21, 0x00, 0x9D, 0xFE, 0x33, 0x00,
+ 0x18, 0x00, 0x17, 0x00, 0x40, 0x00, 0x18, 0x00,
+ 0x46, 0x00, 0x40, 0x00, 0x18, 0x00, 0x76, 0x00,
+ 0x40, 0x00, 0x18, 0x00, 0xA5, 0x00, 0x40, 0x00,
+ 0x1B, 0x00, 0xD5, 0x00, 0x55, 0x00, 0x1D, 0x00,
+ 0x04, 0x01, 0x67, 0x00, 0x1F, 0x00, 0x34, 0x01,
+ 0x7E, 0x00, 0x21, 0x00, 0x63, 0x01, 0x99, 0x00,
+ 0x18, 0x00, 0xE9, 0xFF, 0x40, 0x00, 0x18, 0x00,
+ 0xBA, 0xFF, 0x40, 0x00, 0x18, 0x00, 0x8A, 0xFF,
+ 0x40, 0x00, 0x18, 0x00, 0x5B, 0xFF, 0x40, 0x00,
+ 0x1B, 0x00, 0x2B, 0xFF, 0x55, 0x00, 0x1D, 0x00,
+ 0xFC, 0xFE, 0x67, 0x00, 0x1F, 0x00, 0xCC, 0xFE,
+ 0x7E, 0x00, 0x21, 0x00, 0x9D, 0xFE, 0x99, 0x00,
+ 0x18, 0x00, 0x17, 0x00, 0x6B, 0x00, 0x18, 0x00,
+ 0x46, 0x00, 0x6B, 0x00, 0x18, 0x00, 0x76, 0x00,
+ 0x6B, 0x00, 0x18, 0x00, 0xA5, 0x00, 0x6B, 0x00,
+ 0x1B, 0x00, 0xD5, 0x00, 0x8F, 0x00, 0x1D, 0x00,
+ 0x04, 0x01, 0xAD, 0x00, 0x1F, 0x00, 0x34, 0x01,
+ 0xD2, 0x00, 0x21, 0x00, 0x63, 0x01, 0xFF, 0x00,
+ 0x18, 0x00, 0xE9, 0xFF, 0x6B, 0x00, 0x18, 0x00,
+ 0xBA, 0xFF, 0x6B, 0x00, 0x18, 0x00, 0x8A, 0xFF,
+ 0x6B, 0x00, 0x18, 0x00, 0x5B, 0xFF, 0x6B, 0x00,
+ 0x1B, 0x00, 0x2B, 0xFF, 0x8F, 0x00, 0x1D, 0x00,
+ 0xFC, 0xFE, 0xAD, 0x00, 0x1F, 0x00, 0xCC, 0xFE,
+ 0xD2, 0x00, 0x21, 0x00, 0x9D, 0xFE, 0xFF, 0x00,
+ 0x18, 0x00, 0x17, 0x00, 0x96, 0x00, 0x18, 0x00,
+ 0x46, 0x00, 0x96, 0x00, 0x18, 0x00, 0x76, 0x00,
+ 0x96, 0x00, 0x18, 0x00, 0xA5, 0x00, 0x96, 0x00,
+ 0x1B, 0x00, 0xD5, 0x00, 0xC8, 0x00, 0x1D, 0x00,
+ 0x04, 0x01, 0xF2, 0x00, 0x1F, 0x00, 0x34, 0x01,
+ 0x26, 0x01, 0x21, 0x00, 0x63, 0x01, 0x65, 0x01,
+ 0x18, 0x00, 0xE9, 0xFF, 0x96, 0x00, 0x18, 0x00,
+ 0xBA, 0xFF, 0x96, 0x00, 0x18, 0x00, 0x8A, 0xFF,
+ 0x96, 0x00, 0x18, 0x00, 0x5B, 0xFF, 0x96, 0x00,
+ 0x1B, 0x00, 0x2B, 0xFF, 0xC8, 0x00, 0x1D, 0x00,
+ 0xFC, 0xFE, 0xF2, 0x00, 0x1F, 0x00, 0xCC, 0xFE,
+ 0x26, 0x01, 0x21, 0x00, 0x9D, 0xFE, 0x65, 0x01,
+ 0x1B, 0x00, 0x17, 0x00, 0xC2, 0x00, 0x1B, 0x00,
+ 0x46, 0x00, 0xC2, 0x00, 0x1B, 0x00, 0x76, 0x00,
+ 0xC2, 0x00, 0x1B, 0x00, 0xA5, 0x00, 0xC2, 0x00,
+ 0x1E, 0x00, 0xD5, 0x00, 0x02, 0x01, 0x20, 0x00,
+ 0x04, 0x01, 0x39, 0x01, 0x22, 0x00, 0x34, 0x01,
+ 0x7B, 0x01, 0x24, 0x00, 0x63, 0x01, 0xCB, 0x01,
+ 0x1B, 0x00, 0xE9, 0xFF, 0xC2, 0x00, 0x1B, 0x00,
+ 0xBA, 0xFF, 0xC2, 0x00, 0x1B, 0x00, 0x8A, 0xFF,
+ 0xC2, 0x00, 0x1B, 0x00, 0x5B, 0xFF, 0xC2, 0x00,
+ 0x1E, 0x00, 0x2B, 0xFF, 0x02, 0x01, 0x20, 0x00,
+ 0xFC, 0xFE, 0x39, 0x01, 0x22, 0x00, 0xCC, 0xFE,
+ 0x7B, 0x01, 0x24, 0x00, 0x9D, 0xFE, 0xCB, 0x01,
+ 0x1D, 0x00, 0x17, 0x00, 0xED, 0x00, 0x1D, 0x00,
+ 0x46, 0x00, 0xED, 0x00, 0x1D, 0x00, 0x76, 0x00,
+ 0xED, 0x00, 0x1D, 0x00, 0xA5, 0x00, 0xED, 0x00,
+ 0x20, 0x00, 0xD5, 0x00, 0x3B, 0x01, 0x22, 0x00,
+ 0x04, 0x01, 0x7E, 0x01, 0x24, 0x00, 0x34, 0x01,
+ 0xCF, 0x01, 0x26, 0x00, 0x63, 0x01, 0x31, 0x02,
+ 0x1D, 0x00, 0xE9, 0xFF, 0xED, 0x00, 0x1D, 0x00,
+ 0xBA, 0xFF, 0xED, 0x00, 0x1D, 0x00, 0x8A, 0xFF,
+ 0xED, 0x00, 0x1D, 0x00, 0x5B, 0xFF, 0xED, 0x00,
+ 0x20, 0x00, 0x2B, 0xFF, 0x3B, 0x01, 0x22, 0x00,
+ 0xFC, 0xFE, 0x7E, 0x01, 0x24, 0x00, 0xCC, 0xFE,
+ 0xCF, 0x01, 0x26, 0x00, 0x9D, 0xFE, 0x31, 0x02,
+ 0x1F, 0x00, 0x17, 0x00, 0x18, 0x01, 0x1F, 0x00,
+ 0x46, 0x00, 0x18, 0x01, 0x1F, 0x00, 0x76, 0x00,
+ 0x18, 0x01, 0x1F, 0x00, 0xA5, 0x00, 0x18, 0x01,
+ 0x22, 0x00, 0xD5, 0x00, 0x75, 0x01, 0x24, 0x00,
+ 0x04, 0x01, 0xC4, 0x01, 0x26, 0x00, 0x34, 0x01,
+ 0x23, 0x02, 0x28, 0x00, 0x63, 0x01, 0x97, 0x02,
+ 0x1F, 0x00, 0xE9, 0xFF, 0x18, 0x01, 0x1F, 0x00,
+ 0xBA, 0xFF, 0x18, 0x01, 0x1F, 0x00, 0x8A, 0xFF,
+ 0x18, 0x01, 0x1F, 0x00, 0x5B, 0xFF, 0x18, 0x01,
+ 0x22, 0x00, 0x2B, 0xFF, 0x75, 0x01, 0x24, 0x00,
+ 0xFC, 0xFE, 0xC4, 0x01, 0x26, 0x00, 0xCC, 0xFE,
+ 0x23, 0x02, 0x28, 0x00, 0x9D, 0xFE, 0x97, 0x02,
+ 0x21, 0x00, 0x17, 0x00, 0x43, 0x01, 0x21, 0x00,
+ 0x46, 0x00, 0x43, 0x01, 0x21, 0x00, 0x76, 0x00,
+ 0x43, 0x01, 0x21, 0x00, 0xA5, 0x00, 0x43, 0x01,
+ 0x24, 0x00, 0xD5, 0x00, 0xAE, 0x01, 0x26, 0x00,
+ 0x04, 0x01, 0x09, 0x02, 0x28, 0x00, 0x34, 0x01,
+ 0x77, 0x02, 0x2A, 0x00, 0x63, 0x01, 0xFD, 0x02,
+ 0x21, 0x00, 0xE9, 0xFF, 0x43, 0x01, 0x21, 0x00,
+ 0xBA, 0xFF, 0x43, 0x01, 0x21, 0x00, 0x8A, 0xFF,
+ 0x43, 0x01, 0x21, 0x00, 0x5B, 0xFF, 0x43, 0x01,
+ 0x24, 0x00, 0x2B, 0xFF, 0xAE, 0x01, 0x26, 0x00,
+ 0xFC, 0xFE, 0x09, 0x02, 0x28, 0x00, 0xCC, 0xFE,
+ 0x77, 0x02, 0x2A, 0x00, 0x9D, 0xFE, 0xFD, 0x02,
+ 0x18, 0x00, 0x17, 0x00, 0xEB, 0xFF, 0x18, 0x00,
+ 0x46, 0x00, 0xEB, 0xFF, 0x18, 0x00, 0x76, 0x00,
+ 0xEB, 0xFF, 0x18, 0x00, 0xA5, 0x00, 0xEB, 0xFF,
+ 0x1B, 0x00, 0xD5, 0x00, 0xE4, 0xFF, 0x1D, 0x00,
+ 0x04, 0x01, 0xDE, 0xFF, 0x1F, 0x00, 0x34, 0x01,
+ 0xD6, 0xFF, 0x21, 0x00, 0x63, 0x01, 0xCD, 0xFF,
+ 0x18, 0x00, 0xE9, 0xFF, 0xEB, 0xFF, 0x18, 0x00,
+ 0xBA, 0xFF, 0xEB, 0xFF, 0x18, 0x00, 0x8A, 0xFF,
+ 0xEB, 0xFF, 0x18, 0x00, 0x5B, 0xFF, 0xEB, 0xFF,
+ 0x1B, 0x00, 0x2B, 0xFF, 0xE4, 0xFF, 0x1D, 0x00,
+ 0xFC, 0xFE, 0xDE, 0xFF, 0x1F, 0x00, 0xCC, 0xFE,
+ 0xD6, 0xFF, 0x21, 0x00, 0x9D, 0xFE, 0xCD, 0xFF,
+ 0x18, 0x00, 0x17, 0x00, 0xC0, 0xFF, 0x18, 0x00,
+ 0x46, 0x00, 0xC0, 0xFF, 0x18, 0x00, 0x76, 0x00,
+ 0xC0, 0xFF, 0x18, 0x00, 0xA5, 0x00, 0xC0, 0xFF,
+ 0x1B, 0x00, 0xD5, 0x00, 0xAB, 0xFF, 0x1D, 0x00,
+ 0x04, 0x01, 0x99, 0xFF, 0x1F, 0x00, 0x34, 0x01,
+ 0x82, 0xFF, 0x21, 0x00, 0x63, 0x01, 0x67, 0xFF,
+ 0x18, 0x00, 0xE9, 0xFF, 0xC0, 0xFF, 0x18, 0x00,
+ 0xBA, 0xFF, 0xC0, 0xFF, 0x18, 0x00, 0x8A, 0xFF,
+ 0xC0, 0xFF, 0x18, 0x00, 0x5B, 0xFF, 0xC0, 0xFF,
+ 0x1B, 0x00, 0x2B, 0xFF, 0xAB, 0xFF, 0x1D, 0x00,
+ 0xFC, 0xFE, 0x99, 0xFF, 0x1F, 0x00, 0xCC, 0xFE,
+ 0x82, 0xFF, 0x21, 0x00, 0x9D, 0xFE, 0x67, 0xFF,
+ 0x18, 0x00, 0x17, 0x00, 0x95, 0xFF, 0x18, 0x00,
+ 0x46, 0x00, 0x95, 0xFF, 0x18, 0x00, 0x76, 0x00,
+ 0x95, 0xFF, 0x18, 0x00, 0xA5, 0x00, 0x95, 0xFF,
+ 0x1B, 0x00, 0xD5, 0x00, 0x71, 0xFF, 0x1D, 0x00,
+ 0x04, 0x01, 0x53, 0xFF, 0x1F, 0x00, 0x34, 0x01,
+ 0x2E, 0xFF, 0x21, 0x00, 0x63, 0x01, 0x01, 0xFF,
+ 0x18, 0x00, 0xE9, 0xFF, 0x95, 0xFF, 0x18, 0x00,
+ 0xBA, 0xFF, 0x95, 0xFF, 0x18, 0x00, 0x8A, 0xFF,
+ 0x95, 0xFF, 0x18, 0x00, 0x5B, 0xFF, 0x95, 0xFF,
+ 0x1B, 0x00, 0x2B, 0xFF, 0x71, 0xFF, 0x1D, 0x00,
+ 0xFC, 0xFE, 0x53, 0xFF, 0x1F, 0x00, 0xCC, 0xFE,
+ 0x2E, 0xFF, 0x21, 0x00, 0x9D, 0xFE, 0x01, 0xFF,
+ 0x18, 0x00, 0x17, 0x00, 0x6A, 0xFF, 0x18, 0x00,
+ 0x46, 0x00, 0x6A, 0xFF, 0x18, 0x00, 0x76, 0x00,
+ 0x6A, 0xFF, 0x18, 0x00, 0xA5, 0x00, 0x6A, 0xFF,
+ 0x1B, 0x00, 0xD5, 0x00, 0x38, 0xFF, 0x1D, 0x00,
+ 0x04, 0x01, 0x0E, 0xFF, 0x1F, 0x00, 0x34, 0x01,
+ 0xDA, 0xFE, 0x21, 0x00, 0x63, 0x01, 0x9B, 0xFE,
+ 0x18, 0x00, 0xE9, 0xFF, 0x6A, 0xFF, 0x18, 0x00,
+ 0xBA, 0xFF, 0x6A, 0xFF, 0x18, 0x00, 0x8A, 0xFF,
+ 0x6A, 0xFF, 0x18, 0x00, 0x5B, 0xFF, 0x6A, 0xFF,
+ 0x1B, 0x00, 0x2B, 0xFF, 0x38, 0xFF, 0x1D, 0x00,
+ 0xFC, 0xFE, 0x0E, 0xFF, 0x1F, 0x00, 0xCC, 0xFE,
+ 0xDA, 0xFE, 0x21, 0x00, 0x9D, 0xFE, 0x9B, 0xFE,
+ 0x1B, 0x00, 0x17, 0x00, 0x3E, 0xFF, 0x1B, 0x00,
+ 0x46, 0x00, 0x3E, 0xFF, 0x1B, 0x00, 0x76, 0x00,
+ 0x3E, 0xFF, 0x1B, 0x00, 0xA5, 0x00, 0x3E, 0xFF,
+ 0x1E, 0x00, 0xD5, 0x00, 0xFE, 0xFE, 0x20, 0x00,
+ 0x04, 0x01, 0xC7, 0xFE, 0x22, 0x00, 0x34, 0x01,
+ 0x85, 0xFE, 0x24, 0x00, 0x63, 0x01, 0x35, 0xFE,
+ 0x1B, 0x00, 0xE9, 0xFF, 0x3E, 0xFF, 0x1B, 0x00,
+ 0xBA, 0xFF, 0x3E, 0xFF, 0x1B, 0x00, 0x8A, 0xFF,
+ 0x3E, 0xFF, 0x1B, 0x00, 0x5B, 0xFF, 0x3E, 0xFF,
+ 0x1E, 0x00, 0x2B, 0xFF, 0xFE, 0xFE, 0x20, 0x00,
+ 0xFC, 0xFE, 0xC7, 0xFE, 0x22, 0x00, 0xCC, 0xFE,
+ 0x85, 0xFE, 0x24, 0x00, 0x9D, 0xFE, 0x35, 0xFE,
+ 0x1D, 0x00, 0x17, 0x00, 0x13, 0xFF, 0x1D, 0x00,
+ 0x46, 0x00, 0x13, 0xFF, 0x1D, 0x00, 0x76, 0x00,
+ 0x13, 0xFF, 0x1D, 0x00, 0xA5, 0x00, 0x13, 0xFF,
+ 0x20, 0x00, 0xD5, 0x00, 0xC5, 0xFE, 0x22, 0x00,
+ 0x04, 0x01, 0x82, 0xFE, 0x24, 0x00, 0x34, 0x01,
+ 0x31, 0xFE, 0x26, 0x00, 0x63, 0x01, 0xCF, 0xFD,
+ 0x1D, 0x00, 0xE9, 0xFF, 0x13, 0xFF, 0x1D, 0x00,
+ 0xBA, 0xFF, 0x13, 0xFF, 0x1D, 0x00, 0x8A, 0xFF,
+ 0x13, 0xFF, 0x1D, 0x00, 0x5B, 0xFF, 0x13, 0xFF,
+ 0x20, 0x00, 0x2B, 0xFF, 0xC5, 0xFE, 0x22, 0x00,
+ 0xFC, 0xFE, 0x82, 0xFE, 0x24, 0x00, 0xCC, 0xFE,
+ 0x31, 0xFE, 0x26, 0x00, 0x9D, 0xFE, 0xCF, 0xFD,
+ 0x1F, 0x00, 0x17, 0x00, 0xE8, 0xFE, 0x1F, 0x00,
+ 0x46, 0x00, 0xE8, 0xFE, 0x1F, 0x00, 0x76, 0x00,
+ 0xE8, 0xFE, 0x1F, 0x00, 0xA5, 0x00, 0xE8, 0xFE,
+ 0x22, 0x00, 0xD5, 0x00, 0x8B, 0xFE, 0x24, 0x00,
+ 0x04, 0x01, 0x3C, 0xFE, 0x26, 0x00, 0x34, 0x01,
+ 0xDD, 0xFD, 0x28, 0x00, 0x63, 0x01, 0x69, 0xFD,
+ 0x1F, 0x00, 0xE9, 0xFF, 0xE8, 0xFE, 0x1F, 0x00,
+ 0xBA, 0xFF, 0xE8, 0xFE, 0x1F, 0x00, 0x8A, 0xFF,
+ 0xE8, 0xFE, 0x1F, 0x00, 0x5B, 0xFF, 0xE8, 0xFE,
+ 0x22, 0x00, 0x2B, 0xFF, 0x8B, 0xFE, 0x24, 0x00,
+ 0xFC, 0xFE, 0x3C, 0xFE, 0x26, 0x00, 0xCC, 0xFE,
+ 0xDD, 0xFD, 0x28, 0x00, 0x9D, 0xFE, 0x69, 0xFD,
+ 0x21, 0x00, 0x17, 0x00, 0xBD, 0xFE, 0x21, 0x00,
+ 0x46, 0x00, 0xBD, 0xFE, 0x21, 0x00, 0x76, 0x00,
+ 0xBD, 0xFE, 0x21, 0x00, 0xA5, 0x00, 0xBD, 0xFE,
+ 0x24, 0x00, 0xD5, 0x00, 0x52, 0xFE, 0x26, 0x00,
+ 0x04, 0x01, 0xF7, 0xFD, 0x28, 0x00, 0x34, 0x01,
+ 0x89, 0xFD, 0x2A, 0x00, 0x63, 0x01, 0x03, 0xFD,
+ 0x21, 0x00, 0xE9, 0xFF, 0xBD, 0xFE, 0x21, 0x00,
+ 0xBA, 0xFF, 0xBD, 0xFE, 0x21, 0x00, 0x8A, 0xFF,
+ 0xBD, 0xFE, 0x21, 0x00, 0x5B, 0xFF, 0xBD, 0xFE,
+ 0x24, 0x00, 0x2B, 0xFF, 0x52, 0xFE, 0x26, 0x00,
+ 0xFC, 0xFE, 0xF7, 0xFD, 0x28, 0x00, 0xCC, 0xFE,
+ 0x89, 0xFD, 0x2A, 0x00, 0x9D, 0xFE, 0x03, 0xFD,
+ 0x19, 0x00, 0x1A, 0x00, 0x17, 0x00, 0x19, 0x00,
+ 0x4E, 0x00, 0x17, 0x00, 0x19, 0x00, 0x82, 0x00,
+ 0x17, 0x00, 0x19, 0x00, 0xB6, 0x00, 0x17, 0x00,
+ 0x1C, 0x00, 0xEB, 0x00, 0x1F, 0x00, 0x1E, 0x00,
+ 0x1F, 0x01, 0x26, 0x00, 0x20, 0x00, 0x53, 0x01,
+ 0x2E, 0x00, 0x22, 0x00, 0x87, 0x01, 0x38, 0x00,
+ 0x19, 0x00, 0xE6, 0xFF, 0x17, 0x00, 0x19, 0x00,
+ 0xB2, 0xFF, 0x17, 0x00, 0x19, 0x00, 0x7E, 0xFF,
+ 0x17, 0x00, 0x19, 0x00, 0x4A, 0xFF, 0x17, 0x00,
+ 0x1C, 0x00, 0x15, 0xFF, 0x1F, 0x00, 0x1E, 0x00,
+ 0xE1, 0xFE, 0x26, 0x00, 0x20, 0x00, 0xAD, 0xFE,
+ 0x2E, 0x00, 0x22, 0x00, 0x79, 0xFE, 0x38, 0x00,
+ 0x19, 0x00, 0x1A, 0x00, 0x46, 0x00, 0x19, 0x00,
+ 0x4E, 0x00, 0x46, 0x00, 0x19, 0x00, 0x82, 0x00,
+ 0x46, 0x00, 0x19, 0x00, 0xB6, 0x00, 0x46, 0x00,
+ 0x1C, 0x00, 0xEB, 0x00, 0x5E, 0x00, 0x1E, 0x00,
+ 0x1F, 0x01, 0x72, 0x00, 0x20, 0x00, 0x53, 0x01,
+ 0x8A, 0x00, 0x22, 0x00, 0x87, 0x01, 0xA8, 0x00,
+ 0x19, 0x00, 0xE6, 0xFF, 0x46, 0x00, 0x19, 0x00,
+ 0xB2, 0xFF, 0x46, 0x00, 0x19, 0x00, 0x7E, 0xFF,
+ 0x46, 0x00, 0x19, 0x00, 0x4A, 0xFF, 0x46, 0x00,
+ 0x1C, 0x00, 0x15, 0xFF, 0x5E, 0x00, 0x1E, 0x00,
+ 0xE1, 0xFE, 0x72, 0x00, 0x20, 0x00, 0xAD, 0xFE,
+ 0x8A, 0x00, 0x22, 0x00, 0x79, 0xFE, 0xA8, 0x00,
+ 0x19, 0x00, 0x1A, 0x00, 0x76, 0x00, 0x19, 0x00,
+ 0x4E, 0x00, 0x76, 0x00, 0x19, 0x00, 0x82, 0x00,
+ 0x76, 0x00, 0x19, 0x00, 0xB6, 0x00, 0x76, 0x00,
+ 0x1C, 0x00, 0xEB, 0x00, 0x9D, 0x00, 0x1E, 0x00,
+ 0x1F, 0x01, 0xBF, 0x00, 0x20, 0x00, 0x53, 0x01,
+ 0xE7, 0x00, 0x22, 0x00, 0x87, 0x01, 0x18, 0x01,
+ 0x19, 0x00, 0xE6, 0xFF, 0x76, 0x00, 0x19, 0x00,
+ 0xB2, 0xFF, 0x76, 0x00, 0x19, 0x00, 0x7E, 0xFF,
+ 0x76, 0x00, 0x19, 0x00, 0x4A, 0xFF, 0x76, 0x00,
+ 0x1C, 0x00, 0x15, 0xFF, 0x9D, 0x00, 0x1E, 0x00,
+ 0xE1, 0xFE, 0xBF, 0x00, 0x20, 0x00, 0xAD, 0xFE,
+ 0xE7, 0x00, 0x22, 0x00, 0x79, 0xFE, 0x18, 0x01,
+ 0x19, 0x00, 0x1A, 0x00, 0xA5, 0x00, 0x19, 0x00,
+ 0x4E, 0x00, 0xA5, 0x00, 0x19, 0x00, 0x82, 0x00,
+ 0xA5, 0x00, 0x19, 0x00, 0xB6, 0x00, 0xA5, 0x00,
+ 0x1C, 0x00, 0xEB, 0x00, 0xDC, 0x00, 0x1E, 0x00,
+ 0x1F, 0x01, 0x0B, 0x01, 0x20, 0x00, 0x53, 0x01,
+ 0x43, 0x01, 0x22, 0x00, 0x87, 0x01, 0x88, 0x01,
+ 0x19, 0x00, 0xE6, 0xFF, 0xA5, 0x00, 0x19, 0x00,
+ 0xB2, 0xFF, 0xA5, 0x00, 0x19, 0x00, 0x7E, 0xFF,
+ 0xA5, 0x00, 0x19, 0x00, 0x4A, 0xFF, 0xA5, 0x00,
+ 0x1C, 0x00, 0x15, 0xFF, 0xDC, 0x00, 0x1E, 0x00,
+ 0xE1, 0xFE, 0x0B, 0x01, 0x20, 0x00, 0xAD, 0xFE,
+ 0x43, 0x01, 0x22, 0x00, 0x79, 0xFE, 0x88, 0x01,
+ 0x1C, 0x00, 0x1A, 0x00, 0xD5, 0x00, 0x1C, 0x00,
+ 0x4E, 0x00, 0xD5, 0x00, 0x1C, 0x00, 0x82, 0x00,
+ 0xD5, 0x00, 0x1C, 0x00, 0xB6, 0x00, 0xD5, 0x00,
+ 0x1F, 0x00, 0xEB, 0x00, 0x1C, 0x01, 0x21, 0x00,
+ 0x1F, 0x01, 0x59, 0x01, 0x23, 0x00, 0x53, 0x01,
+ 0xA1, 0x01, 0x25, 0x00, 0x87, 0x01, 0xF9, 0x01,
+ 0x1C, 0x00, 0xE6, 0xFF, 0xD5, 0x00, 0x1C, 0x00,
+ 0xB2, 0xFF, 0xD5, 0x00, 0x1C, 0x00, 0x7E, 0xFF,
+ 0xD5, 0x00, 0x1C, 0x00, 0x4A, 0xFF, 0xD5, 0x00,
+ 0x1F, 0x00, 0x15, 0xFF, 0x1C, 0x01, 0x21, 0x00,
+ 0xE1, 0xFE, 0x59, 0x01, 0x23, 0x00, 0xAD, 0xFE,
+ 0xA1, 0x01, 0x25, 0x00, 0x79, 0xFE, 0xF9, 0x01,
+ 0x1E, 0x00, 0x1A, 0x00, 0x04, 0x01, 0x1E, 0x00,
+ 0x4E, 0x00, 0x04, 0x01, 0x1E, 0x00, 0x82, 0x00,
+ 0x04, 0x01, 0x1E, 0x00, 0xB6, 0x00, 0x04, 0x01,
+ 0x21, 0x00, 0xEB, 0x00, 0x5B, 0x01, 0x23, 0x00,
+ 0x1F, 0x01, 0xA5, 0x01, 0x25, 0x00, 0x53, 0x01,
+ 0xFD, 0x01, 0x27, 0x00, 0x87, 0x01, 0x69, 0x02,
+ 0x1E, 0x00, 0xE6, 0xFF, 0x04, 0x01, 0x1E, 0x00,
+ 0xB2, 0xFF, 0x04, 0x01, 0x1E, 0x00, 0x7E, 0xFF,
+ 0x04, 0x01, 0x1E, 0x00, 0x4A, 0xFF, 0x04, 0x01,
+ 0x21, 0x00, 0x15, 0xFF, 0x5B, 0x01, 0x23, 0x00,
+ 0xE1, 0xFE, 0xA5, 0x01, 0x25, 0x00, 0xAD, 0xFE,
+ 0xFD, 0x01, 0x27, 0x00, 0x79, 0xFE, 0x69, 0x02,
+ 0x20, 0x00, 0x1A, 0x00, 0x34, 0x01, 0x20, 0x00,
+ 0x4E, 0x00, 0x34, 0x01, 0x20, 0x00, 0x82, 0x00,
+ 0x34, 0x01, 0x20, 0x00, 0xB6, 0x00, 0x34, 0x01,
+ 0x23, 0x00, 0xEB, 0x00, 0x9A, 0x01, 0x25, 0x00,
+ 0x1F, 0x01, 0xF2, 0x01, 0x27, 0x00, 0x53, 0x01,
+ 0x5A, 0x02, 0x29, 0x00, 0x87, 0x01, 0xD9, 0x02,
+ 0x20, 0x00, 0xE6, 0xFF, 0x34, 0x01, 0x20, 0x00,
+ 0xB2, 0xFF, 0x34, 0x01, 0x20, 0x00, 0x7E, 0xFF,
+ 0x34, 0x01, 0x20, 0x00, 0x4A, 0xFF, 0x34, 0x01,
+ 0x23, 0x00, 0x15, 0xFF, 0x9A, 0x01, 0x25, 0x00,
+ 0xE1, 0xFE, 0xF2, 0x01, 0x27, 0x00, 0xAD, 0xFE,
+ 0x5A, 0x02, 0x29, 0x00, 0x79, 0xFE, 0xD9, 0x02,
+ 0x22, 0x00, 0x1A, 0x00, 0x63, 0x01, 0x22, 0x00,
+ 0x4E, 0x00, 0x63, 0x01, 0x22, 0x00, 0x82, 0x00,
+ 0x63, 0x01, 0x22, 0x00, 0xB6, 0x00, 0x63, 0x01,
+ 0x25, 0x00, 0xEB, 0x00, 0xD9, 0x01, 0x27, 0x00,
+ 0x1F, 0x01, 0x3E, 0x02, 0x29, 0x00, 0x53, 0x01,
+ 0xB6, 0x02, 0x2B, 0x00, 0x87, 0x01, 0x49, 0x03,
+ 0x22, 0x00, 0xE6, 0xFF, 0x63, 0x01, 0x22, 0x00,
+ 0xB2, 0xFF, 0x63, 0x01, 0x22, 0x00, 0x7E, 0xFF,
+ 0x63, 0x01, 0x22, 0x00, 0x4A, 0xFF, 0x63, 0x01,
+ 0x25, 0x00, 0x15, 0xFF, 0xD9, 0x01, 0x27, 0x00,
+ 0xE1, 0xFE, 0x3E, 0x02, 0x29, 0x00, 0xAD, 0xFE,
+ 0xB6, 0x02, 0x2B, 0x00, 0x79, 0xFE, 0x49, 0x03,
+ 0x19, 0x00, 0x1A, 0x00, 0xE9, 0xFF, 0x19, 0x00,
+ 0x4E, 0x00, 0xE9, 0xFF, 0x19, 0x00, 0x82, 0x00,
+ 0xE9, 0xFF, 0x19, 0x00, 0xB6, 0x00, 0xE9, 0xFF,
+ 0x1C, 0x00, 0xEB, 0x00, 0xE1, 0xFF, 0x1E, 0x00,
+ 0x1F, 0x01, 0xDA, 0xFF, 0x20, 0x00, 0x53, 0x01,
+ 0xD2, 0xFF, 0x22, 0x00, 0x87, 0x01, 0xC8, 0xFF,
+ 0x19, 0x00, 0xE6, 0xFF, 0xE9, 0xFF, 0x19, 0x00,
+ 0xB2, 0xFF, 0xE9, 0xFF, 0x19, 0x00, 0x7E, 0xFF,
+ 0xE9, 0xFF, 0x19, 0x00, 0x4A, 0xFF, 0xE9, 0xFF,
+ 0x1C, 0x00, 0x15, 0xFF, 0xE1, 0xFF, 0x1E, 0x00,
+ 0xE1, 0xFE, 0xDA, 0xFF, 0x20, 0x00, 0xAD, 0xFE,
+ 0xD2, 0xFF, 0x22, 0x00, 0x79, 0xFE, 0xC8, 0xFF,
+ 0x19, 0x00, 0x1A, 0x00, 0xBA, 0xFF, 0x19, 0x00,
+ 0x4E, 0x00, 0xBA, 0xFF, 0x19, 0x00, 0x82, 0x00,
+ 0xBA, 0xFF, 0x19, 0x00, 0xB6, 0x00, 0xBA, 0xFF,
+ 0x1C, 0x00, 0xEB, 0x00, 0xA2, 0xFF, 0x1E, 0x00,
+ 0x1F, 0x01, 0x8E, 0xFF, 0x20, 0x00, 0x53, 0x01,
+ 0x76, 0xFF, 0x22, 0x00, 0x87, 0x01, 0x58, 0xFF,
+ 0x19, 0x00, 0xE6, 0xFF, 0xBA, 0xFF, 0x19, 0x00,
+ 0xB2, 0xFF, 0xBA, 0xFF, 0x19, 0x00, 0x7E, 0xFF,
+ 0xBA, 0xFF, 0x19, 0x00, 0x4A, 0xFF, 0xBA, 0xFF,
+ 0x1C, 0x00, 0x15, 0xFF, 0xA2, 0xFF, 0x1E, 0x00,
+ 0xE1, 0xFE, 0x8E, 0xFF, 0x20, 0x00, 0xAD, 0xFE,
+ 0x76, 0xFF, 0x22, 0x00, 0x79, 0xFE, 0x58, 0xFF,
+ 0x19, 0x00, 0x1A, 0x00, 0x8A, 0xFF, 0x19, 0x00,
+ 0x4E, 0x00, 0x8A, 0xFF, 0x19, 0x00, 0x82, 0x00,
+ 0x8A, 0xFF, 0x19, 0x00, 0xB6, 0x00, 0x8A, 0xFF,
+ 0x1C, 0x00, 0xEB, 0x00, 0x63, 0xFF, 0x1E, 0x00,
+ 0x1F, 0x01, 0x41, 0xFF, 0x20, 0x00, 0x53, 0x01,
+ 0x19, 0xFF, 0x22, 0x00, 0x87, 0x01, 0xE8, 0xFE,
+ 0x19, 0x00, 0xE6, 0xFF, 0x8A, 0xFF, 0x19, 0x00,
+ 0xB2, 0xFF, 0x8A, 0xFF, 0x19, 0x00, 0x7E, 0xFF,
+ 0x8A, 0xFF, 0x19, 0x00, 0x4A, 0xFF, 0x8A, 0xFF,
+ 0x1C, 0x00, 0x15, 0xFF, 0x63, 0xFF, 0x1E, 0x00,
+ 0xE1, 0xFE, 0x41, 0xFF, 0x20, 0x00, 0xAD, 0xFE,
+ 0x19, 0xFF, 0x22, 0x00, 0x79, 0xFE, 0xE8, 0xFE,
+ 0x19, 0x00, 0x1A, 0x00, 0x5B, 0xFF, 0x19, 0x00,
+ 0x4E, 0x00, 0x5B, 0xFF, 0x19, 0x00, 0x82, 0x00,
+ 0x5B, 0xFF, 0x19, 0x00, 0xB6, 0x00, 0x5B, 0xFF,
+ 0x1C, 0x00, 0xEB, 0x00, 0x24, 0xFF, 0x1E, 0x00,
+ 0x1F, 0x01, 0xF5, 0xFE, 0x20, 0x00, 0x53, 0x01,
+ 0xBD, 0xFE, 0x22, 0x00, 0x87, 0x01, 0x78, 0xFE,
+ 0x19, 0x00, 0xE6, 0xFF, 0x5B, 0xFF, 0x19, 0x00,
+ 0xB2, 0xFF, 0x5B, 0xFF, 0x19, 0x00, 0x7E, 0xFF,
+ 0x5B, 0xFF, 0x19, 0x00, 0x4A, 0xFF, 0x5B, 0xFF,
+ 0x1C, 0x00, 0x15, 0xFF, 0x24, 0xFF, 0x1E, 0x00,
+ 0xE1, 0xFE, 0xF5, 0xFE, 0x20, 0x00, 0xAD, 0xFE,
+ 0xBD, 0xFE, 0x22, 0x00, 0x79, 0xFE, 0x78, 0xFE,
+ 0x1C, 0x00, 0x1A, 0x00, 0x2B, 0xFF, 0x1C, 0x00,
+ 0x4E, 0x00, 0x2B, 0xFF, 0x1C, 0x00, 0x82, 0x00,
+ 0x2B, 0xFF, 0x1C, 0x00, 0xB6, 0x00, 0x2B, 0xFF,
+ 0x1F, 0x00, 0xEB, 0x00, 0xE4, 0xFE, 0x21, 0x00,
+ 0x1F, 0x01, 0xA7, 0xFE, 0x23, 0x00, 0x53, 0x01,
+ 0x5F, 0xFE, 0x25, 0x00, 0x87, 0x01, 0x07, 0xFE,
+ 0x1C, 0x00, 0xE6, 0xFF, 0x2B, 0xFF, 0x1C, 0x00,
+ 0xB2, 0xFF, 0x2B, 0xFF, 0x1C, 0x00, 0x7E, 0xFF,
+ 0x2B, 0xFF, 0x1C, 0x00, 0x4A, 0xFF, 0x2B, 0xFF,
+ 0x1F, 0x00, 0x15, 0xFF, 0xE4, 0xFE, 0x21, 0x00,
+ 0xE1, 0xFE, 0xA7, 0xFE, 0x23, 0x00, 0xAD, 0xFE,
+ 0x5F, 0xFE, 0x25, 0x00, 0x79, 0xFE, 0x07, 0xFE,
+ 0x1E, 0x00, 0x1A, 0x00, 0xFC, 0xFE, 0x1E, 0x00,
+ 0x4E, 0x00, 0xFC, 0xFE, 0x1E, 0x00, 0x82, 0x00,
+ 0xFC, 0xFE, 0x1E, 0x00, 0xB6, 0x00, 0xFC, 0xFE,
+ 0x21, 0x00, 0xEB, 0x00, 0xA5, 0xFE, 0x23, 0x00,
+ 0x1F, 0x01, 0x5B, 0xFE, 0x25, 0x00, 0x53, 0x01,
+ 0x03, 0xFE, 0x27, 0x00, 0x87, 0x01, 0x97, 0xFD,
+ 0x1E, 0x00, 0xE6, 0xFF, 0xFC, 0xFE, 0x1E, 0x00,
+ 0xB2, 0xFF, 0xFC, 0xFE, 0x1E, 0x00, 0x7E, 0xFF,
+ 0xFC, 0xFE, 0x1E, 0x00, 0x4A, 0xFF, 0xFC, 0xFE,
+ 0x21, 0x00, 0x15, 0xFF, 0xA5, 0xFE, 0x23, 0x00,
+ 0xE1, 0xFE, 0x5B, 0xFE, 0x25, 0x00, 0xAD, 0xFE,
+ 0x03, 0xFE, 0x27, 0x00, 0x79, 0xFE, 0x97, 0xFD,
+ 0x20, 0x00, 0x1A, 0x00, 0xCC, 0xFE, 0x20, 0x00,
+ 0x4E, 0x00, 0xCC, 0xFE, 0x20, 0x00, 0x82, 0x00,
+ 0xCC, 0xFE, 0x20, 0x00, 0xB6, 0x00, 0xCC, 0xFE,
+ 0x23, 0x00, 0xEB, 0x00, 0x66, 0xFE, 0x25, 0x00,
+ 0x1F, 0x01, 0x0E, 0xFE, 0x27, 0x00, 0x53, 0x01,
+ 0xA6, 0xFD, 0x29, 0x00, 0x87, 0x01, 0x27, 0xFD,
+ 0x20, 0x00, 0xE6, 0xFF, 0xCC, 0xFE, 0x20, 0x00,
+ 0xB2, 0xFF, 0xCC, 0xFE, 0x20, 0x00, 0x7E, 0xFF,
+ 0xCC, 0xFE, 0x20, 0x00, 0x4A, 0xFF, 0xCC, 0xFE,
+ 0x23, 0x00, 0x15, 0xFF, 0x66, 0xFE, 0x25, 0x00,
+ 0xE1, 0xFE, 0x0E, 0xFE, 0x27, 0x00, 0xAD, 0xFE,
+ 0xA6, 0xFD, 0x29, 0x00, 0x79, 0xFE, 0x27, 0xFD,
+ 0x22, 0x00, 0x1A, 0x00, 0x9D, 0xFE, 0x22, 0x00,
+ 0x4E, 0x00, 0x9D, 0xFE, 0x22, 0x00, 0x82, 0x00,
+ 0x9D, 0xFE, 0x22, 0x00, 0xB6, 0x00, 0x9D, 0xFE,
+ 0x25, 0x00, 0xEB, 0x00, 0x27, 0xFE, 0x27, 0x00,
+ 0x1F, 0x01, 0xC2, 0xFD, 0x29, 0x00, 0x53, 0x01,
+ 0x4A, 0xFD, 0x2B, 0x00, 0x87, 0x01, 0xB7, 0xFC,
+ 0x22, 0x00, 0xE6, 0xFF, 0x9D, 0xFE, 0x22, 0x00,
+ 0xB2, 0xFF, 0x9D, 0xFE, 0x22, 0x00, 0x7E, 0xFF,
+ 0x9D, 0xFE, 0x22, 0x00, 0x4A, 0xFF, 0x9D, 0xFE,
+ 0x25, 0x00, 0x15, 0xFF, 0x27, 0xFE, 0x27, 0x00,
+ 0xE1, 0xFE, 0xC2, 0xFD, 0x29, 0x00, 0xAD, 0xFE,
+ 0x4A, 0xFD, 0x2B, 0x00, 0x79, 0xFE, 0xB7, 0xFC,
+ 0x1A, 0x00, 0x1C, 0x00, 0x1A, 0x00, 0x1A, 0x00,
+ 0x55, 0x00, 0x1A, 0x00, 0x1A, 0x00, 0x8F, 0x00,
+ 0x1A, 0x00, 0x1A, 0x00, 0xC8, 0x00, 0x1A, 0x00,
+ 0x1D, 0x00, 0x02, 0x01, 0x22, 0x00, 0x1F, 0x00,
+ 0x3B, 0x01, 0x2A, 0x00, 0x21, 0x00, 0x75, 0x01,
+ 0x33, 0x00, 0x23, 0x00, 0xAE, 0x01, 0x3D, 0x00,
+ 0x1A, 0x00, 0xE4, 0xFF, 0x1A, 0x00, 0x1A, 0x00,
+ 0xAB, 0xFF, 0x1A, 0x00, 0x1A, 0x00, 0x71, 0xFF,
+ 0x1A, 0x00, 0x1A, 0x00, 0x38, 0xFF, 0x1A, 0x00,
+ 0x1D, 0x00, 0xFE, 0xFE, 0x22, 0x00, 0x1F, 0x00,
+ 0xC5, 0xFE, 0x2A, 0x00, 0x21, 0x00, 0x8B, 0xFE,
+ 0x33, 0x00, 0x23, 0x00, 0x52, 0xFE, 0x3D, 0x00,
+ 0x1A, 0x00, 0x1C, 0x00, 0x4E, 0x00, 0x1A, 0x00,
+ 0x55, 0x00, 0x4E, 0x00, 0x1A, 0x00, 0x8F, 0x00,
+ 0x4E, 0x00, 0x1A, 0x00, 0xC8, 0x00, 0x4E, 0x00,
+ 0x1D, 0x00, 0x02, 0x01, 0x67, 0x00, 0x1F, 0x00,
+ 0x3B, 0x01, 0x7E, 0x00, 0x21, 0x00, 0x75, 0x01,
+ 0x99, 0x00, 0x23, 0x00, 0xAE, 0x01, 0xB8, 0x00,
+ 0x1A, 0x00, 0xE4, 0xFF, 0x4E, 0x00, 0x1A, 0x00,
+ 0xAB, 0xFF, 0x4E, 0x00, 0x1A, 0x00, 0x71, 0xFF,
+ 0x4E, 0x00, 0x1A, 0x00, 0x38, 0xFF, 0x4E, 0x00,
+ 0x1D, 0x00, 0xFE, 0xFE, 0x67, 0x00, 0x1F, 0x00,
+ 0xC5, 0xFE, 0x7E, 0x00, 0x21, 0x00, 0x8B, 0xFE,
+ 0x99, 0x00, 0x23, 0x00, 0x52, 0xFE, 0xB8, 0x00,
+ 0x1A, 0x00, 0x1C, 0x00, 0x82, 0x00, 0x1A, 0x00,
+ 0x55, 0x00, 0x82, 0x00, 0x1A, 0x00, 0x8F, 0x00,
+ 0x82, 0x00, 0x1A, 0x00, 0xC8, 0x00, 0x82, 0x00,
+ 0x1D, 0x00, 0x02, 0x01, 0xAD, 0x00, 0x1F, 0x00,
+ 0x3B, 0x01, 0xD2, 0x00, 0x21, 0x00, 0x75, 0x01,
+ 0xFF, 0x00, 0x23, 0x00, 0xAE, 0x01, 0x34, 0x01,
+ 0x1A, 0x00, 0xE4, 0xFF, 0x82, 0x00, 0x1A, 0x00,
+ 0xAB, 0xFF, 0x82, 0x00, 0x1A, 0x00, 0x71, 0xFF,
+ 0x82, 0x00, 0x1A, 0x00, 0x38, 0xFF, 0x82, 0x00,
+ 0x1D, 0x00, 0xFE, 0xFE, 0xAD, 0x00, 0x1F, 0x00,
+ 0xC5, 0xFE, 0xD2, 0x00, 0x21, 0x00, 0x8B, 0xFE,
+ 0xFF, 0x00, 0x23, 0x00, 0x52, 0xFE, 0x34, 0x01,
+ 0x1A, 0x00, 0x1C, 0x00, 0xB6, 0x00, 0x1A, 0x00,
+ 0x55, 0x00, 0xB6, 0x00, 0x1A, 0x00, 0x8F, 0x00,
+ 0xB6, 0x00, 0x1A, 0x00, 0xC8, 0x00, 0xB6, 0x00,
+ 0x1D, 0x00, 0x02, 0x01, 0xF2, 0x00, 0x1F, 0x00,
+ 0x3B, 0x01, 0x26, 0x01, 0x21, 0x00, 0x75, 0x01,
+ 0x65, 0x01, 0x23, 0x00, 0xAE, 0x01, 0xAF, 0x01,
+ 0x1A, 0x00, 0xE4, 0xFF, 0xB6, 0x00, 0x1A, 0x00,
+ 0xAB, 0xFF, 0xB6, 0x00, 0x1A, 0x00, 0x71, 0xFF,
+ 0xB6, 0x00, 0x1A, 0x00, 0x38, 0xFF, 0xB6, 0x00,
+ 0x1D, 0x00, 0xFE, 0xFE, 0xF2, 0x00, 0x1F, 0x00,
+ 0xC5, 0xFE, 0x26, 0x01, 0x21, 0x00, 0x8B, 0xFE,
+ 0x65, 0x01, 0x23, 0x00, 0x52, 0xFE, 0xAF, 0x01,
+ 0x1D, 0x00, 0x1C, 0x00, 0xEB, 0x00, 0x1D, 0x00,
+ 0x55, 0x00, 0xEB, 0x00, 0x1D, 0x00, 0x8F, 0x00,
+ 0xEB, 0x00, 0x1D, 0x00, 0xC8, 0x00, 0xEB, 0x00,
+ 0x20, 0x00, 0x02, 0x01, 0x39, 0x01, 0x22, 0x00,
+ 0x3B, 0x01, 0x7B, 0x01, 0x24, 0x00, 0x75, 0x01,
+ 0xCB, 0x01, 0x26, 0x00, 0xAE, 0x01, 0x2B, 0x02,
+ 0x1D, 0x00, 0xE4, 0xFF, 0xEB, 0x00, 0x1D, 0x00,
+ 0xAB, 0xFF, 0xEB, 0x00, 0x1D, 0x00, 0x71, 0xFF,
+ 0xEB, 0x00, 0x1D, 0x00, 0x38, 0xFF, 0xEB, 0x00,
+ 0x20, 0x00, 0xFE, 0xFE, 0x39, 0x01, 0x22, 0x00,
+ 0xC5, 0xFE, 0x7B, 0x01, 0x24, 0x00, 0x8B, 0xFE,
+ 0xCB, 0x01, 0x26, 0x00, 0x52, 0xFE, 0x2B, 0x02,
+ 0x1F, 0x00, 0x1C, 0x00, 0x1F, 0x01, 0x1F, 0x00,
+ 0x55, 0x00, 0x1F, 0x01, 0x1F, 0x00, 0x8F, 0x00,
+ 0x1F, 0x01, 0x1F, 0x00, 0xC8, 0x00, 0x1F, 0x01,
+ 0x22, 0x00, 0x02, 0x01, 0x7E, 0x01, 0x24, 0x00,
+ 0x3B, 0x01, 0xCF, 0x01, 0x26, 0x00, 0x75, 0x01,
+ 0x31, 0x02, 0x28, 0x00, 0xAE, 0x01, 0xA6, 0x02,
+ 0x1F, 0x00, 0xE4, 0xFF, 0x1F, 0x01, 0x1F, 0x00,
+ 0xAB, 0xFF, 0x1F, 0x01, 0x1F, 0x00, 0x71, 0xFF,
+ 0x1F, 0x01, 0x1F, 0x00, 0x38, 0xFF, 0x1F, 0x01,
+ 0x22, 0x00, 0xFE, 0xFE, 0x7E, 0x01, 0x24, 0x00,
+ 0xC5, 0xFE, 0xCF, 0x01, 0x26, 0x00, 0x8B, 0xFE,
+ 0x31, 0x02, 0x28, 0x00, 0x52, 0xFE, 0xA6, 0x02,
+ 0x21, 0x00, 0x1C, 0x00, 0x53, 0x01, 0x21, 0x00,
+ 0x55, 0x00, 0x53, 0x01, 0x21, 0x00, 0x8F, 0x00,
+ 0x53, 0x01, 0x21, 0x00, 0xC8, 0x00, 0x53, 0x01,
+ 0x24, 0x00, 0x02, 0x01, 0xC4, 0x01, 0x26, 0x00,
+ 0x3B, 0x01, 0x23, 0x02, 0x28, 0x00, 0x75, 0x01,
+ 0x97, 0x02, 0x2A, 0x00, 0xAE, 0x01, 0x22, 0x03,
+ 0x21, 0x00, 0xE4, 0xFF, 0x53, 0x01, 0x21, 0x00,
+ 0xAB, 0xFF, 0x53, 0x01, 0x21, 0x00, 0x71, 0xFF,
+ 0x53, 0x01, 0x21, 0x00, 0x38, 0xFF, 0x53, 0x01,
+ 0x24, 0x00, 0xFE, 0xFE, 0xC4, 0x01, 0x26, 0x00,
+ 0xC5, 0xFE, 0x23, 0x02, 0x28, 0x00, 0x8B, 0xFE,
+ 0x97, 0x02, 0x2A, 0x00, 0x52, 0xFE, 0x22, 0x03,
+ 0x23, 0x00, 0x1C, 0x00, 0x87, 0x01, 0x23, 0x00,
+ 0x55, 0x00, 0x87, 0x01, 0x23, 0x00, 0x8F, 0x00,
+ 0x87, 0x01, 0x23, 0x00, 0xC8, 0x00, 0x87, 0x01,
+ 0x26, 0x00, 0x02, 0x01, 0x09, 0x02, 0x28, 0x00,
+ 0x3B, 0x01, 0x77, 0x02, 0x2A, 0x00, 0x75, 0x01,
+ 0xFD, 0x02, 0x2C, 0x00, 0xAE, 0x01, 0x9D, 0x03,
+ 0x23, 0x00, 0xE4, 0xFF, 0x87, 0x01, 0x23, 0x00,
+ 0xAB, 0xFF, 0x87, 0x01, 0x23, 0x00, 0x71, 0xFF,
+ 0x87, 0x01, 0x23, 0x00, 0x38, 0xFF, 0x87, 0x01,
+ 0x26, 0x00, 0xFE, 0xFE, 0x09, 0x02, 0x28, 0x00,
+ 0xC5, 0xFE, 0x77, 0x02, 0x2A, 0x00, 0x8B, 0xFE,
+ 0xFD, 0x02, 0x2C, 0x00, 0x52, 0xFE, 0x9D, 0x03,
+ 0x1A, 0x00, 0x1C, 0x00, 0xE6, 0xFF, 0x1A, 0x00,
+ 0x55, 0x00, 0xE6, 0xFF, 0x1A, 0x00, 0x8F, 0x00,
+ 0xE6, 0xFF, 0x1A, 0x00, 0xC8, 0x00, 0xE6, 0xFF,
+ 0x1D, 0x00, 0x02, 0x01, 0xDE, 0xFF, 0x1F, 0x00,
+ 0x3B, 0x01, 0xD6, 0xFF, 0x21, 0x00, 0x75, 0x01,
+ 0xCD, 0xFF, 0x23, 0x00, 0xAE, 0x01, 0xC3, 0xFF,
+ 0x1A, 0x00, 0xE4, 0xFF, 0xE6, 0xFF, 0x1A, 0x00,
+ 0xAB, 0xFF, 0xE6, 0xFF, 0x1A, 0x00, 0x71, 0xFF,
+ 0xE6, 0xFF, 0x1A, 0x00, 0x38, 0xFF, 0xE6, 0xFF,
+ 0x1D, 0x00, 0xFE, 0xFE, 0xDE, 0xFF, 0x1F, 0x00,
+ 0xC5, 0xFE, 0xD6, 0xFF, 0x21, 0x00, 0x8B, 0xFE,
+ 0xCD, 0xFF, 0x23, 0x00, 0x52, 0xFE, 0xC3, 0xFF,
+ 0x1A, 0x00, 0x1C, 0x00, 0xB2, 0xFF, 0x1A, 0x00,
+ 0x55, 0x00, 0xB2, 0xFF, 0x1A, 0x00, 0x8F, 0x00,
+ 0xB2, 0xFF, 0x1A, 0x00, 0xC8, 0x00, 0xB2, 0xFF,
+ 0x1D, 0x00, 0x02, 0x01, 0x99, 0xFF, 0x1F, 0x00,
+ 0x3B, 0x01, 0x82, 0xFF, 0x21, 0x00, 0x75, 0x01,
+ 0x67, 0xFF, 0x23, 0x00, 0xAE, 0x01, 0x48, 0xFF,
+ 0x1A, 0x00, 0xE4, 0xFF, 0xB2, 0xFF, 0x1A, 0x00,
+ 0xAB, 0xFF, 0xB2, 0xFF, 0x1A, 0x00, 0x71, 0xFF,
+ 0xB2, 0xFF, 0x1A, 0x00, 0x38, 0xFF, 0xB2, 0xFF,
+ 0x1D, 0x00, 0xFE, 0xFE, 0x99, 0xFF, 0x1F, 0x00,
+ 0xC5, 0xFE, 0x82, 0xFF, 0x21, 0x00, 0x8B, 0xFE,
+ 0x67, 0xFF, 0x23, 0x00, 0x52, 0xFE, 0x48, 0xFF,
+ 0x1A, 0x00, 0x1C, 0x00, 0x7E, 0xFF, 0x1A, 0x00,
+ 0x55, 0x00, 0x7E, 0xFF, 0x1A, 0x00, 0x8F, 0x00,
+ 0x7E, 0xFF, 0x1A, 0x00, 0xC8, 0x00, 0x7E, 0xFF,
+ 0x1D, 0x00, 0x02, 0x01, 0x53, 0xFF, 0x1F, 0x00,
+ 0x3B, 0x01, 0x2E, 0xFF, 0x21, 0x00, 0x75, 0x01,
+ 0x01, 0xFF, 0x23, 0x00, 0xAE, 0x01, 0xCC, 0xFE,
+ 0x1A, 0x00, 0xE4, 0xFF, 0x7E, 0xFF, 0x1A, 0x00,
+ 0xAB, 0xFF, 0x7E, 0xFF, 0x1A, 0x00, 0x71, 0xFF,
+ 0x7E, 0xFF, 0x1A, 0x00, 0x38, 0xFF, 0x7E, 0xFF,
+ 0x1D, 0x00, 0xFE, 0xFE, 0x53, 0xFF, 0x1F, 0x00,
+ 0xC5, 0xFE, 0x2E, 0xFF, 0x21, 0x00, 0x8B, 0xFE,
+ 0x01, 0xFF, 0x23, 0x00, 0x52, 0xFE, 0xCC, 0xFE,
+ 0x1A, 0x00, 0x1C, 0x00, 0x4A, 0xFF, 0x1A, 0x00,
+ 0x55, 0x00, 0x4A, 0xFF, 0x1A, 0x00, 0x8F, 0x00,
+ 0x4A, 0xFF, 0x1A, 0x00, 0xC8, 0x00, 0x4A, 0xFF,
+ 0x1D, 0x00, 0x02, 0x01, 0x0E, 0xFF, 0x1F, 0x00,
+ 0x3B, 0x01, 0xDA, 0xFE, 0x21, 0x00, 0x75, 0x01,
+ 0x9B, 0xFE, 0x23, 0x00, 0xAE, 0x01, 0x51, 0xFE,
+ 0x1A, 0x00, 0xE4, 0xFF, 0x4A, 0xFF, 0x1A, 0x00,
+ 0xAB, 0xFF, 0x4A, 0xFF, 0x1A, 0x00, 0x71, 0xFF,
+ 0x4A, 0xFF, 0x1A, 0x00, 0x38, 0xFF, 0x4A, 0xFF,
+ 0x1D, 0x00, 0xFE, 0xFE, 0x0E, 0xFF, 0x1F, 0x00,
+ 0xC5, 0xFE, 0xDA, 0xFE, 0x21, 0x00, 0x8B, 0xFE,
+ 0x9B, 0xFE, 0x23, 0x00, 0x52, 0xFE, 0x51, 0xFE,
+ 0x1D, 0x00, 0x1C, 0x00, 0x15, 0xFF, 0x1D, 0x00,
+ 0x55, 0x00, 0x15, 0xFF, 0x1D, 0x00, 0x8F, 0x00,
+ 0x15, 0xFF, 0x1D, 0x00, 0xC8, 0x00, 0x15, 0xFF,
+ 0x20, 0x00, 0x02, 0x01, 0xC7, 0xFE, 0x22, 0x00,
+ 0x3B, 0x01, 0x85, 0xFE, 0x24, 0x00, 0x75, 0x01,
+ 0x35, 0xFE, 0x26, 0x00, 0xAE, 0x01, 0xD5, 0xFD,
+ 0x1D, 0x00, 0xE4, 0xFF, 0x15, 0xFF, 0x1D, 0x00,
+ 0xAB, 0xFF, 0x15, 0xFF, 0x1D, 0x00, 0x71, 0xFF,
+ 0x15, 0xFF, 0x1D, 0x00, 0x38, 0xFF, 0x15, 0xFF,
+ 0x20, 0x00, 0xFE, 0xFE, 0xC7, 0xFE, 0x22, 0x00,
+ 0xC5, 0xFE, 0x85, 0xFE, 0x24, 0x00, 0x8B, 0xFE,
+ 0x35, 0xFE, 0x26, 0x00, 0x52, 0xFE, 0xD5, 0xFD,
+ 0x1F, 0x00, 0x1C, 0x00, 0xE1, 0xFE, 0x1F, 0x00,
+ 0x55, 0x00, 0xE1, 0xFE, 0x1F, 0x00, 0x8F, 0x00,
+ 0xE1, 0xFE, 0x1F, 0x00, 0xC8, 0x00, 0xE1, 0xFE,
+ 0x22, 0x00, 0x02, 0x01, 0x82, 0xFE, 0x24, 0x00,
+ 0x3B, 0x01, 0x31, 0xFE, 0x26, 0x00, 0x75, 0x01,
+ 0xCF, 0xFD, 0x28, 0x00, 0xAE, 0x01, 0x5A, 0xFD,
+ 0x1F, 0x00, 0xE4, 0xFF, 0xE1, 0xFE, 0x1F, 0x00,
+ 0xAB, 0xFF, 0xE1, 0xFE, 0x1F, 0x00, 0x71, 0xFF,
+ 0xE1, 0xFE, 0x1F, 0x00, 0x38, 0xFF, 0xE1, 0xFE,
+ 0x22, 0x00, 0xFE, 0xFE, 0x82, 0xFE, 0x24, 0x00,
+ 0xC5, 0xFE, 0x31, 0xFE, 0x26, 0x00, 0x8B, 0xFE,
+ 0xCF, 0xFD, 0x28, 0x00, 0x52, 0xFE, 0x5A, 0xFD,
+ 0x21, 0x00, 0x1C, 0x00, 0xAD, 0xFE, 0x21, 0x00,
+ 0x55, 0x00, 0xAD, 0xFE, 0x21, 0x00, 0x8F, 0x00,
+ 0xAD, 0xFE, 0x21, 0x00, 0xC8, 0x00, 0xAD, 0xFE,
+ 0x24, 0x00, 0x02, 0x01, 0x3C, 0xFE, 0x26, 0x00,
+ 0x3B, 0x01, 0xDD, 0xFD, 0x28, 0x00, 0x75, 0x01,
+ 0x69, 0xFD, 0x2A, 0x00, 0xAE, 0x01, 0xDE, 0xFC,
+ 0x21, 0x00, 0xE4, 0xFF, 0xAD, 0xFE, 0x21, 0x00,
+ 0xAB, 0xFF, 0xAD, 0xFE, 0x21, 0x00, 0x71, 0xFF,
+ 0xAD, 0xFE, 0x21, 0x00, 0x38, 0xFF, 0xAD, 0xFE,
+ 0x24, 0x00, 0xFE, 0xFE, 0x3C, 0xFE, 0x26, 0x00,
+ 0xC5, 0xFE, 0xDD, 0xFD, 0x28, 0x00, 0x8B, 0xFE,
+ 0x69, 0xFD, 0x2A, 0x00, 0x52, 0xFE, 0xDE, 0xFC,
+ 0x23, 0x00, 0x1C, 0x00, 0x79, 0xFE, 0x23, 0x00,
+ 0x55, 0x00, 0x79, 0xFE, 0x23, 0x00, 0x8F, 0x00,
+ 0x79, 0xFE, 0x23, 0x00, 0xC8, 0x00, 0x79, 0xFE,
+ 0x26, 0x00, 0x02, 0x01, 0xF7, 0xFD, 0x28, 0x00,
+ 0x3B, 0x01, 0x89, 0xFD, 0x2A, 0x00, 0x75, 0x01,
+ 0x03, 0xFD, 0x2C, 0x00, 0xAE, 0x01, 0x63, 0xFC,
+ 0x23, 0x00, 0xE4, 0xFF, 0x79, 0xFE, 0x23, 0x00,
+ 0xAB, 0xFF, 0x79, 0xFE, 0x23, 0x00, 0x71, 0xFF,
+ 0x79, 0xFE, 0x23, 0x00, 0x38, 0xFF, 0x79, 0xFE,
+ 0x26, 0x00, 0xFE, 0xFE, 0xF7, 0xFD, 0x28, 0x00,
+ 0xC5, 0xFE, 0x89, 0xFD, 0x2A, 0x00, 0x8B, 0xFE,
+ 0x03, 0xFD, 0x2C, 0x00, 0x52, 0xFE, 0x63, 0xFC,
+ 0x1B, 0x00, 0x1F, 0x00, 0x1C, 0x00, 0x1B, 0x00,
+ 0x5E, 0x00, 0x1C, 0x00, 0x1B, 0x00, 0x9D, 0x00,
+ 0x1C, 0x00, 0x1B, 0x00, 0xDC, 0x00, 0x1C, 0x00,
+ 0x1E, 0x00, 0x1C, 0x01, 0x26, 0x00, 0x20, 0x00,
+ 0x5B, 0x01, 0x2E, 0x00, 0x22, 0x00, 0x9A, 0x01,
+ 0x38, 0x00, 0x24, 0x00, 0xD9, 0x01, 0x44, 0x00,
+ 0x1B, 0x00, 0xE1, 0xFF, 0x1C, 0x00, 0x1B, 0x00,
+ 0xA2, 0xFF, 0x1C, 0x00, 0x1B, 0x00, 0x63, 0xFF,
+ 0x1C, 0x00, 0x1B, 0x00, 0x24, 0xFF, 0x1C, 0x00,
+ 0x1E, 0x00, 0xE4, 0xFE, 0x26, 0x00, 0x20, 0x00,
+ 0xA5, 0xFE, 0x2E, 0x00, 0x22, 0x00, 0x66, 0xFE,
+ 0x38, 0x00, 0x24, 0x00, 0x27, 0xFE, 0x44, 0x00,
+ 0x1B, 0x00, 0x1F, 0x00, 0x55, 0x00, 0x1B, 0x00,
+ 0x5E, 0x00, 0x55, 0x00, 0x1B, 0x00, 0x9D, 0x00,
+ 0x55, 0x00, 0x1B, 0x00, 0xDC, 0x00, 0x55, 0x00,
+ 0x1E, 0x00, 0x1C, 0x01, 0x72, 0x00, 0x20, 0x00,
+ 0x5B, 0x01, 0x8A, 0x00, 0x22, 0x00, 0x9A, 0x01,
+ 0xA8, 0x00, 0x24, 0x00, 0xD9, 0x01, 0xCC, 0x00,
+ 0x1B, 0x00, 0xE1, 0xFF, 0x55, 0x00, 0x1B, 0x00,
+ 0xA2, 0xFF, 0x55, 0x00, 0x1B, 0x00, 0x63, 0xFF,
+ 0x55, 0x00, 0x1B, 0x00, 0x24, 0xFF, 0x55, 0x00,
+ 0x1E, 0x00, 0xE4, 0xFE, 0x72, 0x00, 0x20, 0x00,
+ 0xA5, 0xFE, 0x8A, 0x00, 0x22, 0x00, 0x66, 0xFE,
+ 0xA8, 0x00, 0x24, 0x00, 0x27, 0xFE, 0xCC, 0x00,
+ 0x1B, 0x00, 0x1F, 0x00, 0x8F, 0x00, 0x1B, 0x00,
+ 0x5E, 0x00, 0x8F, 0x00, 0x1B, 0x00, 0x9D, 0x00,
+ 0x8F, 0x00, 0x1B, 0x00, 0xDC, 0x00, 0x8F, 0x00,
+ 0x1E, 0x00, 0x1C, 0x01, 0xBF, 0x00, 0x20, 0x00,
+ 0x5B, 0x01, 0xE7, 0x00, 0x22, 0x00, 0x9A, 0x01,
+ 0x18, 0x01, 0x24, 0x00, 0xD9, 0x01, 0x54, 0x01,
+ 0x1B, 0x00, 0xE1, 0xFF, 0x8F, 0x00, 0x1B, 0x00,
+ 0xA2, 0xFF, 0x8F, 0x00, 0x1B, 0x00, 0x63, 0xFF,
+ 0x8F, 0x00, 0x1B, 0x00, 0x24, 0xFF, 0x8F, 0x00,
+ 0x1E, 0x00, 0xE4, 0xFE, 0xBF, 0x00, 0x20, 0x00,
+ 0xA5, 0xFE, 0xE7, 0x00, 0x22, 0x00, 0x66, 0xFE,
+ 0x18, 0x01, 0x24, 0x00, 0x27, 0xFE, 0x54, 0x01,
+ 0x1B, 0x00, 0x1F, 0x00, 0xC8, 0x00, 0x1B, 0x00,
+ 0x5E, 0x00, 0xC8, 0x00, 0x1B, 0x00, 0x9D, 0x00,
+ 0xC8, 0x00, 0x1B, 0x00, 0xDC, 0x00, 0xC8, 0x00,
+ 0x1E, 0x00, 0x1C, 0x01, 0x0B, 0x01, 0x20, 0x00,
+ 0x5B, 0x01, 0x43, 0x01, 0x22, 0x00, 0x9A, 0x01,
+ 0x88, 0x01, 0x24, 0x00, 0xD9, 0x01, 0xDC, 0x01,
+ 0x1B, 0x00, 0xE1, 0xFF, 0xC8, 0x00, 0x1B, 0x00,
+ 0xA2, 0xFF, 0xC8, 0x00, 0x1B, 0x00, 0x63, 0xFF,
+ 0xC8, 0x00, 0x1B, 0x00, 0x24, 0xFF, 0xC8, 0x00,
+ 0x1E, 0x00, 0xE4, 0xFE, 0x0B, 0x01, 0x20, 0x00,
+ 0xA5, 0xFE, 0x43, 0x01, 0x22, 0x00, 0x66, 0xFE,
+ 0x88, 0x01, 0x24, 0x00, 0x27, 0xFE, 0xDC, 0x01,
+ 0x1E, 0x00, 0x1F, 0x00, 0x02, 0x01, 0x1E, 0x00,
+ 0x5E, 0x00, 0x02, 0x01, 0x1E, 0x00, 0x9D, 0x00,
+ 0x02, 0x01, 0x1E, 0x00, 0xDC, 0x00, 0x02, 0x01,
+ 0x21, 0x00, 0x1C, 0x01, 0x59, 0x01, 0x23, 0x00,
+ 0x5B, 0x01, 0xA1, 0x01, 0x25, 0x00, 0x9A, 0x01,
+ 0xF9, 0x01, 0x27, 0x00, 0xD9, 0x01, 0x64, 0x02,
+ 0x1E, 0x00, 0xE1, 0xFF, 0x02, 0x01, 0x1E, 0x00,
+ 0xA2, 0xFF, 0x02, 0x01, 0x1E, 0x00, 0x63, 0xFF,
+ 0x02, 0x01, 0x1E, 0x00, 0x24, 0xFF, 0x02, 0x01,
+ 0x21, 0x00, 0xE4, 0xFE, 0x59, 0x01, 0x23, 0x00,
+ 0xA5, 0xFE, 0xA1, 0x01, 0x25, 0x00, 0x66, 0xFE,
+ 0xF9, 0x01, 0x27, 0x00, 0x27, 0xFE, 0x64, 0x02,
+ 0x20, 0x00, 0x1F, 0x00, 0x3B, 0x01, 0x20, 0x00,
+ 0x5E, 0x00, 0x3B, 0x01, 0x20, 0x00, 0x9D, 0x00,
+ 0x3B, 0x01, 0x20, 0x00, 0xDC, 0x00, 0x3B, 0x01,
+ 0x23, 0x00, 0x1C, 0x01, 0xA5, 0x01, 0x25, 0x00,
+ 0x5B, 0x01, 0xFD, 0x01, 0x27, 0x00, 0x9A, 0x01,
+ 0x69, 0x02, 0x29, 0x00, 0xD9, 0x01, 0xEC, 0x02,
+ 0x20, 0x00, 0xE1, 0xFF, 0x3B, 0x01, 0x20, 0x00,
+ 0xA2, 0xFF, 0x3B, 0x01, 0x20, 0x00, 0x63, 0xFF,
+ 0x3B, 0x01, 0x20, 0x00, 0x24, 0xFF, 0x3B, 0x01,
+ 0x23, 0x00, 0xE4, 0xFE, 0xA5, 0x01, 0x25, 0x00,
+ 0xA5, 0xFE, 0xFD, 0x01, 0x27, 0x00, 0x66, 0xFE,
+ 0x69, 0x02, 0x29, 0x00, 0x27, 0xFE, 0xEC, 0x02,
+ 0x22, 0x00, 0x1F, 0x00, 0x75, 0x01, 0x22, 0x00,
+ 0x5E, 0x00, 0x75, 0x01, 0x22, 0x00, 0x9D, 0x00,
+ 0x75, 0x01, 0x22, 0x00, 0xDC, 0x00, 0x75, 0x01,
+ 0x25, 0x00, 0x1C, 0x01, 0xF2, 0x01, 0x27, 0x00,
+ 0x5B, 0x01, 0x5A, 0x02, 0x29, 0x00, 0x9A, 0x01,
+ 0xD9, 0x02, 0x2B, 0x00, 0xD9, 0x01, 0x74, 0x03,
+ 0x22, 0x00, 0xE1, 0xFF, 0x75, 0x01, 0x22, 0x00,
+ 0xA2, 0xFF, 0x75, 0x01, 0x22, 0x00, 0x63, 0xFF,
+ 0x75, 0x01, 0x22, 0x00, 0x24, 0xFF, 0x75, 0x01,
+ 0x25, 0x00, 0xE4, 0xFE, 0xF2, 0x01, 0x27, 0x00,
+ 0xA5, 0xFE, 0x5A, 0x02, 0x29, 0x00, 0x66, 0xFE,
+ 0xD9, 0x02, 0x2B, 0x00, 0x27, 0xFE, 0x74, 0x03,
+ 0x24, 0x00, 0x1F, 0x00, 0xAE, 0x01, 0x24, 0x00,
+ 0x5E, 0x00, 0xAE, 0x01, 0x24, 0x00, 0x9D, 0x00,
+ 0xAE, 0x01, 0x24, 0x00, 0xDC, 0x00, 0xAE, 0x01,
+ 0x27, 0x00, 0x1C, 0x01, 0x3E, 0x02, 0x29, 0x00,
+ 0x5B, 0x01, 0xB6, 0x02, 0x2B, 0x00, 0x9A, 0x01,
+ 0x49, 0x03, 0x2D, 0x00, 0xD9, 0x01, 0xFC, 0x03,
+ 0x24, 0x00, 0xE1, 0xFF, 0xAE, 0x01, 0x24, 0x00,
+ 0xA2, 0xFF, 0xAE, 0x01, 0x24, 0x00, 0x63, 0xFF,
+ 0xAE, 0x01, 0x24, 0x00, 0x24, 0xFF, 0xAE, 0x01,
+ 0x27, 0x00, 0xE4, 0xFE, 0x3E, 0x02, 0x29, 0x00,
+ 0xA5, 0xFE, 0xB6, 0x02, 0x2B, 0x00, 0x66, 0xFE,
+ 0x49, 0x03, 0x2D, 0x00, 0x27, 0xFE, 0xFC, 0x03,
+ 0x1B, 0x00, 0x1F, 0x00, 0xE4, 0xFF, 0x1B, 0x00,
+ 0x5E, 0x00, 0xE4, 0xFF, 0x1B, 0x00, 0x9D, 0x00,
+ 0xE4, 0xFF, 0x1B, 0x00, 0xDC, 0x00, 0xE4, 0xFF,
+ 0x1E, 0x00, 0x1C, 0x01, 0xDA, 0xFF, 0x20, 0x00,
+ 0x5B, 0x01, 0xD2, 0xFF, 0x22, 0x00, 0x9A, 0x01,
+ 0xC8, 0xFF, 0x24, 0x00, 0xD9, 0x01, 0xBC, 0xFF,
+ 0x1B, 0x00, 0xE1, 0xFF, 0xE4, 0xFF, 0x1B, 0x00,
+ 0xA2, 0xFF, 0xE4, 0xFF, 0x1B, 0x00, 0x63, 0xFF,
+ 0xE4, 0xFF, 0x1B, 0x00, 0x24, 0xFF, 0xE4, 0xFF,
+ 0x1E, 0x00, 0xE4, 0xFE, 0xDA, 0xFF, 0x20, 0x00,
+ 0xA5, 0xFE, 0xD2, 0xFF, 0x22, 0x00, 0x66, 0xFE,
+ 0xC8, 0xFF, 0x24, 0x00, 0x27, 0xFE, 0xBC, 0xFF,
+ 0x1B, 0x00, 0x1F, 0x00, 0xAB, 0xFF, 0x1B, 0x00,
+ 0x5E, 0x00, 0xAB, 0xFF, 0x1B, 0x00, 0x9D, 0x00,
+ 0xAB, 0xFF, 0x1B, 0x00, 0xDC, 0x00, 0xAB, 0xFF,
+ 0x1E, 0x00, 0x1C, 0x01, 0x8E, 0xFF, 0x20, 0x00,
+ 0x5B, 0x01, 0x76, 0xFF, 0x22, 0x00, 0x9A, 0x01,
+ 0x58, 0xFF, 0x24, 0x00, 0xD9, 0x01, 0x34, 0xFF,
+ 0x1B, 0x00, 0xE1, 0xFF, 0xAB, 0xFF, 0x1B, 0x00,
+ 0xA2, 0xFF, 0xAB, 0xFF, 0x1B, 0x00, 0x63, 0xFF,
+ 0xAB, 0xFF, 0x1B, 0x00, 0x24, 0xFF, 0xAB, 0xFF,
+ 0x1E, 0x00, 0xE4, 0xFE, 0x8E, 0xFF, 0x20, 0x00,
+ 0xA5, 0xFE, 0x76, 0xFF, 0x22, 0x00, 0x66, 0xFE,
+ 0x58, 0xFF, 0x24, 0x00, 0x27, 0xFE, 0x34, 0xFF,
+ 0x1B, 0x00, 0x1F, 0x00, 0x71, 0xFF, 0x1B, 0x00,
+ 0x5E, 0x00, 0x71, 0xFF, 0x1B, 0x00, 0x9D, 0x00,
+ 0x71, 0xFF, 0x1B, 0x00, 0xDC, 0x00, 0x71, 0xFF,
+ 0x1E, 0x00, 0x1C, 0x01, 0x41, 0xFF, 0x20, 0x00,
+ 0x5B, 0x01, 0x19, 0xFF, 0x22, 0x00, 0x9A, 0x01,
+ 0xE8, 0xFE, 0x24, 0x00, 0xD9, 0x01, 0xAC, 0xFE,
+ 0x1B, 0x00, 0xE1, 0xFF, 0x71, 0xFF, 0x1B, 0x00,
+ 0xA2, 0xFF, 0x71, 0xFF, 0x1B, 0x00, 0x63, 0xFF,
+ 0x71, 0xFF, 0x1B, 0x00, 0x24, 0xFF, 0x71, 0xFF,
+ 0x1E, 0x00, 0xE4, 0xFE, 0x41, 0xFF, 0x20, 0x00,
+ 0xA5, 0xFE, 0x19, 0xFF, 0x22, 0x00, 0x66, 0xFE,
+ 0xE8, 0xFE, 0x24, 0x00, 0x27, 0xFE, 0xAC, 0xFE,
+ 0x1B, 0x00, 0x1F, 0x00, 0x38, 0xFF, 0x1B, 0x00,
+ 0x5E, 0x00, 0x38, 0xFF, 0x1B, 0x00, 0x9D, 0x00,
+ 0x38, 0xFF, 0x1B, 0x00, 0xDC, 0x00, 0x38, 0xFF,
+ 0x1E, 0x00, 0x1C, 0x01, 0xF5, 0xFE, 0x20, 0x00,
+ 0x5B, 0x01, 0xBD, 0xFE, 0x22, 0x00, 0x9A, 0x01,
+ 0x78, 0xFE, 0x24, 0x00, 0xD9, 0x01, 0x24, 0xFE,
+ 0x1B, 0x00, 0xE1, 0xFF, 0x38, 0xFF, 0x1B, 0x00,
+ 0xA2, 0xFF, 0x38, 0xFF, 0x1B, 0x00, 0x63, 0xFF,
+ 0x38, 0xFF, 0x1B, 0x00, 0x24, 0xFF, 0x38, 0xFF,
+ 0x1E, 0x00, 0xE4, 0xFE, 0xF5, 0xFE, 0x20, 0x00,
+ 0xA5, 0xFE, 0xBD, 0xFE, 0x22, 0x00, 0x66, 0xFE,
+ 0x78, 0xFE, 0x24, 0x00, 0x27, 0xFE, 0x24, 0xFE,
+ 0x1E, 0x00, 0x1F, 0x00, 0xFE, 0xFE, 0x1E, 0x00,
+ 0x5E, 0x00, 0xFE, 0xFE, 0x1E, 0x00, 0x9D, 0x00,
+ 0xFE, 0xFE, 0x1E, 0x00, 0xDC, 0x00, 0xFE, 0xFE,
+ 0x21, 0x00, 0x1C, 0x01, 0xA7, 0xFE, 0x23, 0x00,
+ 0x5B, 0x01, 0x5F, 0xFE, 0x25, 0x00, 0x9A, 0x01,
+ 0x07, 0xFE, 0x27, 0x00, 0xD9, 0x01, 0x9C, 0xFD,
+ 0x1E, 0x00, 0xE1, 0xFF, 0xFE, 0xFE, 0x1E, 0x00,
+ 0xA2, 0xFF, 0xFE, 0xFE, 0x1E, 0x00, 0x63, 0xFF,
+ 0xFE, 0xFE, 0x1E, 0x00, 0x24, 0xFF, 0xFE, 0xFE,
+ 0x21, 0x00, 0xE4, 0xFE, 0xA7, 0xFE, 0x23, 0x00,
+ 0xA5, 0xFE, 0x5F, 0xFE, 0x25, 0x00, 0x66, 0xFE,
+ 0x07, 0xFE, 0x27, 0x00, 0x27, 0xFE, 0x9C, 0xFD,
+ 0x20, 0x00, 0x1F, 0x00, 0xC5, 0xFE, 0x20, 0x00,
+ 0x5E, 0x00, 0xC5, 0xFE, 0x20, 0x00, 0x9D, 0x00,
+ 0xC5, 0xFE, 0x20, 0x00, 0xDC, 0x00, 0xC5, 0xFE,
+ 0x23, 0x00, 0x1C, 0x01, 0x5B, 0xFE, 0x25, 0x00,
+ 0x5B, 0x01, 0x03, 0xFE, 0x27, 0x00, 0x9A, 0x01,
+ 0x97, 0xFD, 0x29, 0x00, 0xD9, 0x01, 0x14, 0xFD,
+ 0x20, 0x00, 0xE1, 0xFF, 0xC5, 0xFE, 0x20, 0x00,
+ 0xA2, 0xFF, 0xC5, 0xFE, 0x20, 0x00, 0x63, 0xFF,
+ 0xC5, 0xFE, 0x20, 0x00, 0x24, 0xFF, 0xC5, 0xFE,
+ 0x23, 0x00, 0xE4, 0xFE, 0x5B, 0xFE, 0x25, 0x00,
+ 0xA5, 0xFE, 0x03, 0xFE, 0x27, 0x00, 0x66, 0xFE,
+ 0x97, 0xFD, 0x29, 0x00, 0x27, 0xFE, 0x14, 0xFD,
+ 0x22, 0x00, 0x1F, 0x00, 0x8B, 0xFE, 0x22, 0x00,
+ 0x5E, 0x00, 0x8B, 0xFE, 0x22, 0x00, 0x9D, 0x00,
+ 0x8B, 0xFE, 0x22, 0x00, 0xDC, 0x00, 0x8B, 0xFE,
+ 0x25, 0x00, 0x1C, 0x01, 0x0E, 0xFE, 0x27, 0x00,
+ 0x5B, 0x01, 0xA6, 0xFD, 0x29, 0x00, 0x9A, 0x01,
+ 0x27, 0xFD, 0x2B, 0x00, 0xD9, 0x01, 0x8C, 0xFC,
+ 0x22, 0x00, 0xE1, 0xFF, 0x8B, 0xFE, 0x22, 0x00,
+ 0xA2, 0xFF, 0x8B, 0xFE, 0x22, 0x00, 0x63, 0xFF,
+ 0x8B, 0xFE, 0x22, 0x00, 0x24, 0xFF, 0x8B, 0xFE,
+ 0x25, 0x00, 0xE4, 0xFE, 0x0E, 0xFE, 0x27, 0x00,
+ 0xA5, 0xFE, 0xA6, 0xFD, 0x29, 0x00, 0x66, 0xFE,
+ 0x27, 0xFD, 0x2B, 0x00, 0x27, 0xFE, 0x8C, 0xFC,
+ 0x24, 0x00, 0x1F, 0x00, 0x52, 0xFE, 0x24, 0x00,
+ 0x5E, 0x00, 0x52, 0xFE, 0x24, 0x00, 0x9D, 0x00,
+ 0x52, 0xFE, 0x24, 0x00, 0xDC, 0x00, 0x52, 0xFE,
+ 0x27, 0x00, 0x1C, 0x01, 0xC2, 0xFD, 0x29, 0x00,
+ 0x5B, 0x01, 0x4A, 0xFD, 0x2B, 0x00, 0x9A, 0x01,
+ 0xB7, 0xFC, 0x2D, 0x00, 0xD9, 0x01, 0x04, 0xFC,
+ 0x24, 0x00, 0xE1, 0xFF, 0x52, 0xFE, 0x24, 0x00,
+ 0xA2, 0xFF, 0x52, 0xFE, 0x24, 0x00, 0x63, 0xFF,
+ 0x52, 0xFE, 0x24, 0x00, 0x24, 0xFF, 0x52, 0xFE,
+ 0x27, 0x00, 0xE4, 0xFE, 0xC2, 0xFD, 0x29, 0x00,
+ 0xA5, 0xFE, 0x4A, 0xFD, 0x2B, 0x00, 0x66, 0xFE,
+ 0xB7, 0xFC, 0x2D, 0x00, 0x27, 0xFE, 0x04, 0xFC,
+ 0x1C, 0x00, 0x22, 0x00, 0x1F, 0x00, 0x1C, 0x00,
+ 0x67, 0x00, 0x1F, 0x00, 0x1C, 0x00, 0xAD, 0x00,
+ 0x1F, 0x00, 0x1C, 0x00, 0xF2, 0x00, 0x1F, 0x00,
+ 0x1F, 0x00, 0x39, 0x01, 0x2A, 0x00, 0x21, 0x00,
+ 0x7E, 0x01, 0x33, 0x00, 0x23, 0x00, 0xC4, 0x01,
+ 0x3D, 0x00, 0x25, 0x00, 0x09, 0x02, 0x4A, 0x00,
+ 0x1C, 0x00, 0xDE, 0xFF, 0x1F, 0x00, 0x1C, 0x00,
+ 0x99, 0xFF, 0x1F, 0x00, 0x1C, 0x00, 0x53, 0xFF,
+ 0x1F, 0x00, 0x1C, 0x00, 0x0E, 0xFF, 0x1F, 0x00,
+ 0x1F, 0x00, 0xC7, 0xFE, 0x2A, 0x00, 0x21, 0x00,
+ 0x82, 0xFE, 0x33, 0x00, 0x23, 0x00, 0x3C, 0xFE,
+ 0x3D, 0x00, 0x25, 0x00, 0xF7, 0xFD, 0x4A, 0x00,
+ 0x1C, 0x00, 0x22, 0x00, 0x5E, 0x00, 0x1C, 0x00,
+ 0x67, 0x00, 0x5E, 0x00, 0x1C, 0x00, 0xAD, 0x00,
+ 0x5E, 0x00, 0x1C, 0x00, 0xF2, 0x00, 0x5E, 0x00,
+ 0x1F, 0x00, 0x39, 0x01, 0x7E, 0x00, 0x21, 0x00,
+ 0x7E, 0x01, 0x99, 0x00, 0x23, 0x00, 0xC4, 0x01,
+ 0xB8, 0x00, 0x25, 0x00, 0x09, 0x02, 0xDF, 0x00,
+ 0x1C, 0x00, 0xDE, 0xFF, 0x5E, 0x00, 0x1C, 0x00,
+ 0x99, 0xFF, 0x5E, 0x00, 0x1C, 0x00, 0x53, 0xFF,
+ 0x5E, 0x00, 0x1C, 0x00, 0x0E, 0xFF, 0x5E, 0x00,
+ 0x1F, 0x00, 0xC7, 0xFE, 0x7E, 0x00, 0x21, 0x00,
+ 0x82, 0xFE, 0x99, 0x00, 0x23, 0x00, 0x3C, 0xFE,
+ 0xB8, 0x00, 0x25, 0x00, 0xF7, 0xFD, 0xDF, 0x00,
+ 0x1C, 0x00, 0x22, 0x00, 0x9D, 0x00, 0x1C, 0x00,
+ 0x67, 0x00, 0x9D, 0x00, 0x1C, 0x00, 0xAD, 0x00,
+ 0x9D, 0x00, 0x1C, 0x00, 0xF2, 0x00, 0x9D, 0x00,
+ 0x1F, 0x00, 0x39, 0x01, 0xD2, 0x00, 0x21, 0x00,
+ 0x7E, 0x01, 0xFF, 0x00, 0x23, 0x00, 0xC4, 0x01,
+ 0x34, 0x01, 0x25, 0x00, 0x09, 0x02, 0x75, 0x01,
+ 0x1C, 0x00, 0xDE, 0xFF, 0x9D, 0x00, 0x1C, 0x00,
+ 0x99, 0xFF, 0x9D, 0x00, 0x1C, 0x00, 0x53, 0xFF,
+ 0x9D, 0x00, 0x1C, 0x00, 0x0E, 0xFF, 0x9D, 0x00,
+ 0x1F, 0x00, 0xC7, 0xFE, 0xD2, 0x00, 0x21, 0x00,
+ 0x82, 0xFE, 0xFF, 0x00, 0x23, 0x00, 0x3C, 0xFE,
+ 0x34, 0x01, 0x25, 0x00, 0xF7, 0xFD, 0x75, 0x01,
+ 0x1C, 0x00, 0x22, 0x00, 0xDC, 0x00, 0x1C, 0x00,
+ 0x67, 0x00, 0xDC, 0x00, 0x1C, 0x00, 0xAD, 0x00,
+ 0xDC, 0x00, 0x1C, 0x00, 0xF2, 0x00, 0xDC, 0x00,
+ 0x1F, 0x00, 0x39, 0x01, 0x26, 0x01, 0x21, 0x00,
+ 0x7E, 0x01, 0x65, 0x01, 0x23, 0x00, 0xC4, 0x01,
+ 0xAF, 0x01, 0x25, 0x00, 0x09, 0x02, 0x0A, 0x02,
+ 0x1C, 0x00, 0xDE, 0xFF, 0xDC, 0x00, 0x1C, 0x00,
+ 0x99, 0xFF, 0xDC, 0x00, 0x1C, 0x00, 0x53, 0xFF,
+ 0xDC, 0x00, 0x1C, 0x00, 0x0E, 0xFF, 0xDC, 0x00,
+ 0x1F, 0x00, 0xC7, 0xFE, 0x26, 0x01, 0x21, 0x00,
+ 0x82, 0xFE, 0x65, 0x01, 0x23, 0x00, 0x3C, 0xFE,
+ 0xAF, 0x01, 0x25, 0x00, 0xF7, 0xFD, 0x0A, 0x02,
+ 0x1F, 0x00, 0x22, 0x00, 0x1C, 0x01, 0x1F, 0x00,
+ 0x67, 0x00, 0x1C, 0x01, 0x1F, 0x00, 0xAD, 0x00,
+ 0x1C, 0x01, 0x1F, 0x00, 0xF2, 0x00, 0x1C, 0x01,
+ 0x22, 0x00, 0x39, 0x01, 0x7B, 0x01, 0x24, 0x00,
+ 0x7E, 0x01, 0xCB, 0x01, 0x26, 0x00, 0xC4, 0x01,
+ 0x2B, 0x02, 0x28, 0x00, 0x09, 0x02, 0xA0, 0x02,
+ 0x1F, 0x00, 0xDE, 0xFF, 0x1C, 0x01, 0x1F, 0x00,
+ 0x99, 0xFF, 0x1C, 0x01, 0x1F, 0x00, 0x53, 0xFF,
+ 0x1C, 0x01, 0x1F, 0x00, 0x0E, 0xFF, 0x1C, 0x01,
+ 0x22, 0x00, 0xC7, 0xFE, 0x7B, 0x01, 0x24, 0x00,
+ 0x82, 0xFE, 0xCB, 0x01, 0x26, 0x00, 0x3C, 0xFE,
+ 0x2B, 0x02, 0x28, 0x00, 0xF7, 0xFD, 0xA0, 0x02,
+ 0x21, 0x00, 0x22, 0x00, 0x5B, 0x01, 0x21, 0x00,
+ 0x67, 0x00, 0x5B, 0x01, 0x21, 0x00, 0xAD, 0x00,
+ 0x5B, 0x01, 0x21, 0x00, 0xF2, 0x00, 0x5B, 0x01,
+ 0x24, 0x00, 0x39, 0x01, 0xCF, 0x01, 0x26, 0x00,
+ 0x7E, 0x01, 0x31, 0x02, 0x28, 0x00, 0xC4, 0x01,
+ 0xA6, 0x02, 0x2A, 0x00, 0x09, 0x02, 0x35, 0x03,
+ 0x21, 0x00, 0xDE, 0xFF, 0x5B, 0x01, 0x21, 0x00,
+ 0x99, 0xFF, 0x5B, 0x01, 0x21, 0x00, 0x53, 0xFF,
+ 0x5B, 0x01, 0x21, 0x00, 0x0E, 0xFF, 0x5B, 0x01,
+ 0x24, 0x00, 0xC7, 0xFE, 0xCF, 0x01, 0x26, 0x00,
+ 0x82, 0xFE, 0x31, 0x02, 0x28, 0x00, 0x3C, 0xFE,
+ 0xA6, 0x02, 0x2A, 0x00, 0xF7, 0xFD, 0x35, 0x03,
+ 0x23, 0x00, 0x22, 0x00, 0x9A, 0x01, 0x23, 0x00,
+ 0x67, 0x00, 0x9A, 0x01, 0x23, 0x00, 0xAD, 0x00,
+ 0x9A, 0x01, 0x23, 0x00, 0xF2, 0x00, 0x9A, 0x01,
+ 0x26, 0x00, 0x39, 0x01, 0x23, 0x02, 0x28, 0x00,
+ 0x7E, 0x01, 0x97, 0x02, 0x2A, 0x00, 0xC4, 0x01,
+ 0x22, 0x03, 0x2C, 0x00, 0x09, 0x02, 0xCB, 0x03,
+ 0x23, 0x00, 0xDE, 0xFF, 0x9A, 0x01, 0x23, 0x00,
+ 0x99, 0xFF, 0x9A, 0x01, 0x23, 0x00, 0x53, 0xFF,
+ 0x9A, 0x01, 0x23, 0x00, 0x0E, 0xFF, 0x9A, 0x01,
+ 0x26, 0x00, 0xC7, 0xFE, 0x23, 0x02, 0x28, 0x00,
+ 0x82, 0xFE, 0x97, 0x02, 0x2A, 0x00, 0x3C, 0xFE,
+ 0x22, 0x03, 0x2C, 0x00, 0xF7, 0xFD, 0xCB, 0x03,
+ 0x25, 0x00, 0x22, 0x00, 0xD9, 0x01, 0x25, 0x00,
+ 0x67, 0x00, 0xD9, 0x01, 0x25, 0x00, 0xAD, 0x00,
+ 0xD9, 0x01, 0x25, 0x00, 0xF2, 0x00, 0xD9, 0x01,
+ 0x28, 0x00, 0x39, 0x01, 0x77, 0x02, 0x2A, 0x00,
+ 0x7E, 0x01, 0xFD, 0x02, 0x2C, 0x00, 0xC4, 0x01,
+ 0x9D, 0x03, 0x2E, 0x00, 0x09, 0x02, 0x60, 0x04,
+ 0x25, 0x00, 0xDE, 0xFF, 0xD9, 0x01, 0x25, 0x00,
+ 0x99, 0xFF, 0xD9, 0x01, 0x25, 0x00, 0x53, 0xFF,
+ 0xD9, 0x01, 0x25, 0x00, 0x0E, 0xFF, 0xD9, 0x01,
+ 0x28, 0x00, 0xC7, 0xFE, 0x77, 0x02, 0x2A, 0x00,
+ 0x82, 0xFE, 0xFD, 0x02, 0x2C, 0x00, 0x3C, 0xFE,
+ 0x9D, 0x03, 0x2E, 0x00, 0xF7, 0xFD, 0x60, 0x04,
+ 0x1C, 0x00, 0x22, 0x00, 0xE1, 0xFF, 0x1C, 0x00,
+ 0x67, 0x00, 0xE1, 0xFF, 0x1C, 0x00, 0xAD, 0x00,
+ 0xE1, 0xFF, 0x1C, 0x00, 0xF2, 0x00, 0xE1, 0xFF,
+ 0x1F, 0x00, 0x39, 0x01, 0xD6, 0xFF, 0x21, 0x00,
+ 0x7E, 0x01, 0xCD, 0xFF, 0x23, 0x00, 0xC4, 0x01,
+ 0xC3, 0xFF, 0x25, 0x00, 0x09, 0x02, 0xB6, 0xFF,
+ 0x1C, 0x00, 0xDE, 0xFF, 0xE1, 0xFF, 0x1C, 0x00,
+ 0x99, 0xFF, 0xE1, 0xFF, 0x1C, 0x00, 0x53, 0xFF,
+ 0xE1, 0xFF, 0x1C, 0x00, 0x0E, 0xFF, 0xE1, 0xFF,
+ 0x1F, 0x00, 0xC7, 0xFE, 0xD6, 0xFF, 0x21, 0x00,
+ 0x82, 0xFE, 0xCD, 0xFF, 0x23, 0x00, 0x3C, 0xFE,
+ 0xC3, 0xFF, 0x25, 0x00, 0xF7, 0xFD, 0xB6, 0xFF,
+ 0x1C, 0x00, 0x22, 0x00, 0xA2, 0xFF, 0x1C, 0x00,
+ 0x67, 0x00, 0xA2, 0xFF, 0x1C, 0x00, 0xAD, 0x00,
+ 0xA2, 0xFF, 0x1C, 0x00, 0xF2, 0x00, 0xA2, 0xFF,
+ 0x1F, 0x00, 0x39, 0x01, 0x82, 0xFF, 0x21, 0x00,
+ 0x7E, 0x01, 0x67, 0xFF, 0x23, 0x00, 0xC4, 0x01,
+ 0x48, 0xFF, 0x25, 0x00, 0x09, 0x02, 0x21, 0xFF,
+ 0x1C, 0x00, 0xDE, 0xFF, 0xA2, 0xFF, 0x1C, 0x00,
+ 0x99, 0xFF, 0xA2, 0xFF, 0x1C, 0x00, 0x53, 0xFF,
+ 0xA2, 0xFF, 0x1C, 0x00, 0x0E, 0xFF, 0xA2, 0xFF,
+ 0x1F, 0x00, 0xC7, 0xFE, 0x82, 0xFF, 0x21, 0x00,
+ 0x82, 0xFE, 0x67, 0xFF, 0x23, 0x00, 0x3C, 0xFE,
+ 0x48, 0xFF, 0x25, 0x00, 0xF7, 0xFD, 0x21, 0xFF,
+ 0x1C, 0x00, 0x22, 0x00, 0x63, 0xFF, 0x1C, 0x00,
+ 0x67, 0x00, 0x63, 0xFF, 0x1C, 0x00, 0xAD, 0x00,
+ 0x63, 0xFF, 0x1C, 0x00, 0xF2, 0x00, 0x63, 0xFF,
+ 0x1F, 0x00, 0x39, 0x01, 0x2E, 0xFF, 0x21, 0x00,
+ 0x7E, 0x01, 0x01, 0xFF, 0x23, 0x00, 0xC4, 0x01,
+ 0xCC, 0xFE, 0x25, 0x00, 0x09, 0x02, 0x8B, 0xFE,
+ 0x1C, 0x00, 0xDE, 0xFF, 0x63, 0xFF, 0x1C, 0x00,
+ 0x99, 0xFF, 0x63, 0xFF, 0x1C, 0x00, 0x53, 0xFF,
+ 0x63, 0xFF, 0x1C, 0x00, 0x0E, 0xFF, 0x63, 0xFF,
+ 0x1F, 0x00, 0xC7, 0xFE, 0x2E, 0xFF, 0x21, 0x00,
+ 0x82, 0xFE, 0x01, 0xFF, 0x23, 0x00, 0x3C, 0xFE,
+ 0xCC, 0xFE, 0x25, 0x00, 0xF7, 0xFD, 0x8B, 0xFE,
+ 0x1C, 0x00, 0x22, 0x00, 0x24, 0xFF, 0x1C, 0x00,
+ 0x67, 0x00, 0x24, 0xFF, 0x1C, 0x00, 0xAD, 0x00,
+ 0x24, 0xFF, 0x1C, 0x00, 0xF2, 0x00, 0x24, 0xFF,
+ 0x1F, 0x00, 0x39, 0x01, 0xDA, 0xFE, 0x21, 0x00,
+ 0x7E, 0x01, 0x9B, 0xFE, 0x23, 0x00, 0xC4, 0x01,
+ 0x51, 0xFE, 0x25, 0x00, 0x09, 0x02, 0xF6, 0xFD,
+ 0x1C, 0x00, 0xDE, 0xFF, 0x24, 0xFF, 0x1C, 0x00,
+ 0x99, 0xFF, 0x24, 0xFF, 0x1C, 0x00, 0x53, 0xFF,
+ 0x24, 0xFF, 0x1C, 0x00, 0x0E, 0xFF, 0x24, 0xFF,
+ 0x1F, 0x00, 0xC7, 0xFE, 0xDA, 0xFE, 0x21, 0x00,
+ 0x82, 0xFE, 0x9B, 0xFE, 0x23, 0x00, 0x3C, 0xFE,
+ 0x51, 0xFE, 0x25, 0x00, 0xF7, 0xFD, 0xF6, 0xFD,
+ 0x1F, 0x00, 0x22, 0x00, 0xE4, 0xFE, 0x1F, 0x00,
+ 0x67, 0x00, 0xE4, 0xFE, 0x1F, 0x00, 0xAD, 0x00,
+ 0xE4, 0xFE, 0x1F, 0x00, 0xF2, 0x00, 0xE4, 0xFE,
+ 0x22, 0x00, 0x39, 0x01, 0x85, 0xFE, 0x24, 0x00,
+ 0x7E, 0x01, 0x35, 0xFE, 0x26, 0x00, 0xC4, 0x01,
+ 0xD5, 0xFD, 0x28, 0x00, 0x09, 0x02, 0x60, 0xFD,
+ 0x1F, 0x00, 0xDE, 0xFF, 0xE4, 0xFE, 0x1F, 0x00,
+ 0x99, 0xFF, 0xE4, 0xFE, 0x1F, 0x00, 0x53, 0xFF,
+ 0xE4, 0xFE, 0x1F, 0x00, 0x0E, 0xFF, 0xE4, 0xFE,
+ 0x22, 0x00, 0xC7, 0xFE, 0x85, 0xFE, 0x24, 0x00,
+ 0x82, 0xFE, 0x35, 0xFE, 0x26, 0x00, 0x3C, 0xFE,
+ 0xD5, 0xFD, 0x28, 0x00, 0xF7, 0xFD, 0x60, 0xFD,
+ 0x21, 0x00, 0x22, 0x00, 0xA5, 0xFE, 0x21, 0x00,
+ 0x67, 0x00, 0xA5, 0xFE, 0x21, 0x00, 0xAD, 0x00,
+ 0xA5, 0xFE, 0x21, 0x00, 0xF2, 0x00, 0xA5, 0xFE,
+ 0x24, 0x00, 0x39, 0x01, 0x31, 0xFE, 0x26, 0x00,
+ 0x7E, 0x01, 0xCF, 0xFD, 0x28, 0x00, 0xC4, 0x01,
+ 0x5A, 0xFD, 0x2A, 0x00, 0x09, 0x02, 0xCB, 0xFC,
+ 0x21, 0x00, 0xDE, 0xFF, 0xA5, 0xFE, 0x21, 0x00,
+ 0x99, 0xFF, 0xA5, 0xFE, 0x21, 0x00, 0x53, 0xFF,
+ 0xA5, 0xFE, 0x21, 0x00, 0x0E, 0xFF, 0xA5, 0xFE,
+ 0x24, 0x00, 0xC7, 0xFE, 0x31, 0xFE, 0x26, 0x00,
+ 0x82, 0xFE, 0xCF, 0xFD, 0x28, 0x00, 0x3C, 0xFE,
+ 0x5A, 0xFD, 0x2A, 0x00, 0xF7, 0xFD, 0xCB, 0xFC,
+ 0x23, 0x00, 0x22, 0x00, 0x66, 0xFE, 0x23, 0x00,
+ 0x67, 0x00, 0x66, 0xFE, 0x23, 0x00, 0xAD, 0x00,
+ 0x66, 0xFE, 0x23, 0x00, 0xF2, 0x00, 0x66, 0xFE,
+ 0x26, 0x00, 0x39, 0x01, 0xDD, 0xFD, 0x28, 0x00,
+ 0x7E, 0x01, 0x69, 0xFD, 0x2A, 0x00, 0xC4, 0x01,
+ 0xDE, 0xFC, 0x2C, 0x00, 0x09, 0x02, 0x35, 0xFC,
+ 0x23, 0x00, 0xDE, 0xFF, 0x66, 0xFE, 0x23, 0x00,
+ 0x99, 0xFF, 0x66, 0xFE, 0x23, 0x00, 0x53, 0xFF,
+ 0x66, 0xFE, 0x23, 0x00, 0x0E, 0xFF, 0x66, 0xFE,
+ 0x26, 0x00, 0xC7, 0xFE, 0xDD, 0xFD, 0x28, 0x00,
+ 0x82, 0xFE, 0x69, 0xFD, 0x2A, 0x00, 0x3C, 0xFE,
+ 0xDE, 0xFC, 0x2C, 0x00, 0xF7, 0xFD, 0x35, 0xFC,
+ 0x25, 0x00, 0x22, 0x00, 0x27, 0xFE, 0x25, 0x00,
+ 0x67, 0x00, 0x27, 0xFE, 0x25, 0x00, 0xAD, 0x00,
+ 0x27, 0xFE, 0x25, 0x00, 0xF2, 0x00, 0x27, 0xFE,
+ 0x28, 0x00, 0x39, 0x01, 0x89, 0xFD, 0x2A, 0x00,
+ 0x7E, 0x01, 0x03, 0xFD, 0x2C, 0x00, 0xC4, 0x01,
+ 0x63, 0xFC, 0x2E, 0x00, 0x09, 0x02, 0xA0, 0xFB,
+ 0x25, 0x00, 0xDE, 0xFF, 0x27, 0xFE, 0x25, 0x00,
+ 0x99, 0xFF, 0x27, 0xFE, 0x25, 0x00, 0x53, 0xFF,
+ 0x27, 0xFE, 0x25, 0x00, 0x0E, 0xFF, 0x27, 0xFE,
+ 0x28, 0x00, 0xC7, 0xFE, 0x89, 0xFD, 0x2A, 0x00,
+ 0x82, 0xFE, 0x03, 0xFD, 0x2C, 0x00, 0x3C, 0xFE,
+ 0x63, 0xFC, 0x2E, 0x00, 0xF7, 0xFD, 0xA0, 0xFB,
+ 0x1D, 0x00, 0x26, 0x00, 0x22, 0x00, 0x1D, 0x00,
+ 0x72, 0x00, 0x22, 0x00, 0x1D, 0x00, 0xBF, 0x00,
+ 0x22, 0x00, 0x1D, 0x00, 0x0B, 0x01, 0x22, 0x00,
+ 0x20, 0x00, 0x59, 0x01, 0x2E, 0x00, 0x22, 0x00,
+ 0xA5, 0x01, 0x38, 0x00, 0x24, 0x00, 0xF2, 0x01,
+ 0x44, 0x00, 0x26, 0x00, 0x3E, 0x02, 0x52, 0x00,
+ 0x1D, 0x00, 0xDA, 0xFF, 0x22, 0x00, 0x1D, 0x00,
+ 0x8E, 0xFF, 0x22, 0x00, 0x1D, 0x00, 0x41, 0xFF,
+ 0x22, 0x00, 0x1D, 0x00, 0xF5, 0xFE, 0x22, 0x00,
+ 0x20, 0x00, 0xA7, 0xFE, 0x2E, 0x00, 0x22, 0x00,
+ 0x5B, 0xFE, 0x38, 0x00, 0x24, 0x00, 0x0E, 0xFE,
+ 0x44, 0x00, 0x26, 0x00, 0xC2, 0xFD, 0x52, 0x00,
+ 0x1D, 0x00, 0x26, 0x00, 0x67, 0x00, 0x1D, 0x00,
+ 0x72, 0x00, 0x67, 0x00, 0x1D, 0x00, 0xBF, 0x00,
+ 0x67, 0x00, 0x1D, 0x00, 0x0B, 0x01, 0x67, 0x00,
+ 0x20, 0x00, 0x59, 0x01, 0x8A, 0x00, 0x22, 0x00,
+ 0xA5, 0x01, 0xA8, 0x00, 0x24, 0x00, 0xF2, 0x01,
+ 0xCC, 0x00, 0x26, 0x00, 0x3E, 0x02, 0xF6, 0x00,
+ 0x1D, 0x00, 0xDA, 0xFF, 0x67, 0x00, 0x1D, 0x00,
+ 0x8E, 0xFF, 0x67, 0x00, 0x1D, 0x00, 0x41, 0xFF,
+ 0x67, 0x00, 0x1D, 0x00, 0xF5, 0xFE, 0x67, 0x00,
+ 0x20, 0x00, 0xA7, 0xFE, 0x8A, 0x00, 0x22, 0x00,
+ 0x5B, 0xFE, 0xA8, 0x00, 0x24, 0x00, 0x0E, 0xFE,
+ 0xCC, 0x00, 0x26, 0x00, 0xC2, 0xFD, 0xF6, 0x00,
+ 0x1D, 0x00, 0x26, 0x00, 0xAD, 0x00, 0x1D, 0x00,
+ 0x72, 0x00, 0xAD, 0x00, 0x1D, 0x00, 0xBF, 0x00,
+ 0xAD, 0x00, 0x1D, 0x00, 0x0B, 0x01, 0xAD, 0x00,
+ 0x20, 0x00, 0x59, 0x01, 0xE7, 0x00, 0x22, 0x00,
+ 0xA5, 0x01, 0x18, 0x01, 0x24, 0x00, 0xF2, 0x01,
+ 0x54, 0x01, 0x26, 0x00, 0x3E, 0x02, 0x9B, 0x01,
+ 0x1D, 0x00, 0xDA, 0xFF, 0xAD, 0x00, 0x1D, 0x00,
+ 0x8E, 0xFF, 0xAD, 0x00, 0x1D, 0x00, 0x41, 0xFF,
+ 0xAD, 0x00, 0x1D, 0x00, 0xF5, 0xFE, 0xAD, 0x00,
+ 0x20, 0x00, 0xA7, 0xFE, 0xE7, 0x00, 0x22, 0x00,
+ 0x5B, 0xFE, 0x18, 0x01, 0x24, 0x00, 0x0E, 0xFE,
+ 0x54, 0x01, 0x26, 0x00, 0xC2, 0xFD, 0x9B, 0x01,
+ 0x1D, 0x00, 0x26, 0x00, 0xF2, 0x00, 0x1D, 0x00,
+ 0x72, 0x00, 0xF2, 0x00, 0x1D, 0x00, 0xBF, 0x00,
+ 0xF2, 0x00, 0x1D, 0x00, 0x0B, 0x01, 0xF2, 0x00,
+ 0x20, 0x00, 0x59, 0x01, 0x43, 0x01, 0x22, 0x00,
+ 0xA5, 0x01, 0x88, 0x01, 0x24, 0x00, 0xF2, 0x01,
+ 0xDC, 0x01, 0x26, 0x00, 0x3E, 0x02, 0x3F, 0x02,
+ 0x1D, 0x00, 0xDA, 0xFF, 0xF2, 0x00, 0x1D, 0x00,
+ 0x8E, 0xFF, 0xF2, 0x00, 0x1D, 0x00, 0x41, 0xFF,
+ 0xF2, 0x00, 0x1D, 0x00, 0xF5, 0xFE, 0xF2, 0x00,
+ 0x20, 0x00, 0xA7, 0xFE, 0x43, 0x01, 0x22, 0x00,
+ 0x5B, 0xFE, 0x88, 0x01, 0x24, 0x00, 0x0E, 0xFE,
+ 0xDC, 0x01, 0x26, 0x00, 0xC2, 0xFD, 0x3F, 0x02,
+ 0x20, 0x00, 0x26, 0x00, 0x39, 0x01, 0x20, 0x00,
+ 0x72, 0x00, 0x39, 0x01, 0x20, 0x00, 0xBF, 0x00,
+ 0x39, 0x01, 0x20, 0x00, 0x0B, 0x01, 0x39, 0x01,
+ 0x23, 0x00, 0x59, 0x01, 0xA1, 0x01, 0x25, 0x00,
+ 0xA5, 0x01, 0xF9, 0x01, 0x27, 0x00, 0xF2, 0x01,
+ 0x64, 0x02, 0x29, 0x00, 0x3E, 0x02, 0xE4, 0x02,
+ 0x20, 0x00, 0xDA, 0xFF, 0x39, 0x01, 0x20, 0x00,
+ 0x8E, 0xFF, 0x39, 0x01, 0x20, 0x00, 0x41, 0xFF,
+ 0x39, 0x01, 0x20, 0x00, 0xF5, 0xFE, 0x39, 0x01,
+ 0x23, 0x00, 0xA7, 0xFE, 0xA1, 0x01, 0x25, 0x00,
+ 0x5B, 0xFE, 0xF9, 0x01, 0x27, 0x00, 0x0E, 0xFE,
+ 0x64, 0x02, 0x29, 0x00, 0xC2, 0xFD, 0xE4, 0x02,
+ 0x22, 0x00, 0x26, 0x00, 0x7E, 0x01, 0x22, 0x00,
+ 0x72, 0x00, 0x7E, 0x01, 0x22, 0x00, 0xBF, 0x00,
+ 0x7E, 0x01, 0x22, 0x00, 0x0B, 0x01, 0x7E, 0x01,
+ 0x25, 0x00, 0x59, 0x01, 0xFD, 0x01, 0x27, 0x00,
+ 0xA5, 0x01, 0x69, 0x02, 0x29, 0x00, 0xF2, 0x01,
+ 0xEC, 0x02, 0x2B, 0x00, 0x3E, 0x02, 0x88, 0x03,
+ 0x22, 0x00, 0xDA, 0xFF, 0x7E, 0x01, 0x22, 0x00,
+ 0x8E, 0xFF, 0x7E, 0x01, 0x22, 0x00, 0x41, 0xFF,
+ 0x7E, 0x01, 0x22, 0x00, 0xF5, 0xFE, 0x7E, 0x01,
+ 0x25, 0x00, 0xA7, 0xFE, 0xFD, 0x01, 0x27, 0x00,
+ 0x5B, 0xFE, 0x69, 0x02, 0x29, 0x00, 0x0E, 0xFE,
+ 0xEC, 0x02, 0x2B, 0x00, 0xC2, 0xFD, 0x88, 0x03,
+ 0x24, 0x00, 0x26, 0x00, 0xC4, 0x01, 0x24, 0x00,
+ 0x72, 0x00, 0xC4, 0x01, 0x24, 0x00, 0xBF, 0x00,
+ 0xC4, 0x01, 0x24, 0x00, 0x0B, 0x01, 0xC4, 0x01,
+ 0x27, 0x00, 0x59, 0x01, 0x5A, 0x02, 0x29, 0x00,
+ 0xA5, 0x01, 0xD9, 0x02, 0x2B, 0x00, 0xF2, 0x01,
+ 0x74, 0x03, 0x2D, 0x00, 0x3E, 0x02, 0x2D, 0x04,
+ 0x24, 0x00, 0xDA, 0xFF, 0xC4, 0x01, 0x24, 0x00,
+ 0x8E, 0xFF, 0xC4, 0x01, 0x24, 0x00, 0x41, 0xFF,
+ 0xC4, 0x01, 0x24, 0x00, 0xF5, 0xFE, 0xC4, 0x01,
+ 0x27, 0x00, 0xA7, 0xFE, 0x5A, 0x02, 0x29, 0x00,
+ 0x5B, 0xFE, 0xD9, 0x02, 0x2B, 0x00, 0x0E, 0xFE,
+ 0x74, 0x03, 0x2D, 0x00, 0xC2, 0xFD, 0x2D, 0x04,
+ 0x26, 0x00, 0x26, 0x00, 0x09, 0x02, 0x26, 0x00,
+ 0x72, 0x00, 0x09, 0x02, 0x26, 0x00, 0xBF, 0x00,
+ 0x09, 0x02, 0x26, 0x00, 0x0B, 0x01, 0x09, 0x02,
+ 0x29, 0x00, 0x59, 0x01, 0xB6, 0x02, 0x2B, 0x00,
+ 0xA5, 0x01, 0x49, 0x03, 0x2D, 0x00, 0xF2, 0x01,
+ 0xFC, 0x03, 0x2F, 0x00, 0x3E, 0x02, 0xD1, 0x04,
+ 0x26, 0x00, 0xDA, 0xFF, 0x09, 0x02, 0x26, 0x00,
+ 0x8E, 0xFF, 0x09, 0x02, 0x26, 0x00, 0x41, 0xFF,
+ 0x09, 0x02, 0x26, 0x00, 0xF5, 0xFE, 0x09, 0x02,
+ 0x29, 0x00, 0xA7, 0xFE, 0xB6, 0x02, 0x2B, 0x00,
+ 0x5B, 0xFE, 0x49, 0x03, 0x2D, 0x00, 0x0E, 0xFE,
+ 0xFC, 0x03, 0x2F, 0x00, 0xC2, 0xFD, 0xD1, 0x04,
+ 0x1D, 0x00, 0x26, 0x00, 0xDE, 0xFF, 0x1D, 0x00,
+ 0x72, 0x00, 0xDE, 0xFF, 0x1D, 0x00, 0xBF, 0x00,
+ 0xDE, 0xFF, 0x1D, 0x00, 0x0B, 0x01, 0xDE, 0xFF,
+ 0x20, 0x00, 0x59, 0x01, 0xD2, 0xFF, 0x22, 0x00,
+ 0xA5, 0x01, 0xC8, 0xFF, 0x24, 0x00, 0xF2, 0x01,
+ 0xBC, 0xFF, 0x26, 0x00, 0x3E, 0x02, 0xAE, 0xFF,
+ 0x1D, 0x00, 0xDA, 0xFF, 0xDE, 0xFF, 0x1D, 0x00,
+ 0x8E, 0xFF, 0xDE, 0xFF, 0x1D, 0x00, 0x41, 0xFF,
+ 0xDE, 0xFF, 0x1D, 0x00, 0xF5, 0xFE, 0xDE, 0xFF,
+ 0x20, 0x00, 0xA7, 0xFE, 0xD2, 0xFF, 0x22, 0x00,
+ 0x5B, 0xFE, 0xC8, 0xFF, 0x24, 0x00, 0x0E, 0xFE,
+ 0xBC, 0xFF, 0x26, 0x00, 0xC2, 0xFD, 0xAE, 0xFF,
+ 0x1D, 0x00, 0x26, 0x00, 0x99, 0xFF, 0x1D, 0x00,
+ 0x72, 0x00, 0x99, 0xFF, 0x1D, 0x00, 0xBF, 0x00,
+ 0x99, 0xFF, 0x1D, 0x00, 0x0B, 0x01, 0x99, 0xFF,
+ 0x20, 0x00, 0x59, 0x01, 0x76, 0xFF, 0x22, 0x00,
+ 0xA5, 0x01, 0x58, 0xFF, 0x24, 0x00, 0xF2, 0x01,
+ 0x34, 0xFF, 0x26, 0x00, 0x3E, 0x02, 0x0A, 0xFF,
+ 0x1D, 0x00, 0xDA, 0xFF, 0x99, 0xFF, 0x1D, 0x00,
+ 0x8E, 0xFF, 0x99, 0xFF, 0x1D, 0x00, 0x41, 0xFF,
+ 0x99, 0xFF, 0x1D, 0x00, 0xF5, 0xFE, 0x99, 0xFF,
+ 0x20, 0x00, 0xA7, 0xFE, 0x76, 0xFF, 0x22, 0x00,
+ 0x5B, 0xFE, 0x58, 0xFF, 0x24, 0x00, 0x0E, 0xFE,
+ 0x34, 0xFF, 0x26, 0x00, 0xC2, 0xFD, 0x0A, 0xFF,
+ 0x1D, 0x00, 0x26, 0x00, 0x53, 0xFF, 0x1D, 0x00,
+ 0x72, 0x00, 0x53, 0xFF, 0x1D, 0x00, 0xBF, 0x00,
+ 0x53, 0xFF, 0x1D, 0x00, 0x0B, 0x01, 0x53, 0xFF,
+ 0x20, 0x00, 0x59, 0x01, 0x19, 0xFF, 0x22, 0x00,
+ 0xA5, 0x01, 0xE8, 0xFE, 0x24, 0x00, 0xF2, 0x01,
+ 0xAC, 0xFE, 0x26, 0x00, 0x3E, 0x02, 0x65, 0xFE,
+ 0x1D, 0x00, 0xDA, 0xFF, 0x53, 0xFF, 0x1D, 0x00,
+ 0x8E, 0xFF, 0x53, 0xFF, 0x1D, 0x00, 0x41, 0xFF,
+ 0x53, 0xFF, 0x1D, 0x00, 0xF5, 0xFE, 0x53, 0xFF,
+ 0x20, 0x00, 0xA7, 0xFE, 0x19, 0xFF, 0x22, 0x00,
+ 0x5B, 0xFE, 0xE8, 0xFE, 0x24, 0x00, 0x0E, 0xFE,
+ 0xAC, 0xFE, 0x26, 0x00, 0xC2, 0xFD, 0x65, 0xFE,
+ 0x1D, 0x00, 0x26, 0x00, 0x0E, 0xFF, 0x1D, 0x00,
+ 0x72, 0x00, 0x0E, 0xFF, 0x1D, 0x00, 0xBF, 0x00,
+ 0x0E, 0xFF, 0x1D, 0x00, 0x0B, 0x01, 0x0E, 0xFF,
+ 0x20, 0x00, 0x59, 0x01, 0xBD, 0xFE, 0x22, 0x00,
+ 0xA5, 0x01, 0x78, 0xFE, 0x24, 0x00, 0xF2, 0x01,
+ 0x24, 0xFE, 0x26, 0x00, 0x3E, 0x02, 0xC1, 0xFD,
+ 0x1D, 0x00, 0xDA, 0xFF, 0x0E, 0xFF, 0x1D, 0x00,
+ 0x8E, 0xFF, 0x0E, 0xFF, 0x1D, 0x00, 0x41, 0xFF,
+ 0x0E, 0xFF, 0x1D, 0x00, 0xF5, 0xFE, 0x0E, 0xFF,
+ 0x20, 0x00, 0xA7, 0xFE, 0xBD, 0xFE, 0x22, 0x00,
+ 0x5B, 0xFE, 0x78, 0xFE, 0x24, 0x00, 0x0E, 0xFE,
+ 0x24, 0xFE, 0x26, 0x00, 0xC2, 0xFD, 0xC1, 0xFD,
+ 0x20, 0x00, 0x26, 0x00, 0xC7, 0xFE, 0x20, 0x00,
+ 0x72, 0x00, 0xC7, 0xFE, 0x20, 0x00, 0xBF, 0x00,
+ 0xC7, 0xFE, 0x20, 0x00, 0x0B, 0x01, 0xC7, 0xFE,
+ 0x23, 0x00, 0x59, 0x01, 0x5F, 0xFE, 0x25, 0x00,
+ 0xA5, 0x01, 0x07, 0xFE, 0x27, 0x00, 0xF2, 0x01,
+ 0x9C, 0xFD, 0x29, 0x00, 0x3E, 0x02, 0x1C, 0xFD,
+ 0x20, 0x00, 0xDA, 0xFF, 0xC7, 0xFE, 0x20, 0x00,
+ 0x8E, 0xFF, 0xC7, 0xFE, 0x20, 0x00, 0x41, 0xFF,
+ 0xC7, 0xFE, 0x20, 0x00, 0xF5, 0xFE, 0xC7, 0xFE,
+ 0x23, 0x00, 0xA7, 0xFE, 0x5F, 0xFE, 0x25, 0x00,
+ 0x5B, 0xFE, 0x07, 0xFE, 0x27, 0x00, 0x0E, 0xFE,
+ 0x9C, 0xFD, 0x29, 0x00, 0xC2, 0xFD, 0x1C, 0xFD,
+ 0x22, 0x00, 0x26, 0x00, 0x82, 0xFE, 0x22, 0x00,
+ 0x72, 0x00, 0x82, 0xFE, 0x22, 0x00, 0xBF, 0x00,
+ 0x82, 0xFE, 0x22, 0x00, 0x0B, 0x01, 0x82, 0xFE,
+ 0x25, 0x00, 0x59, 0x01, 0x03, 0xFE, 0x27, 0x00,
+ 0xA5, 0x01, 0x97, 0xFD, 0x29, 0x00, 0xF2, 0x01,
+ 0x14, 0xFD, 0x2B, 0x00, 0x3E, 0x02, 0x78, 0xFC,
+ 0x22, 0x00, 0xDA, 0xFF, 0x82, 0xFE, 0x22, 0x00,
+ 0x8E, 0xFF, 0x82, 0xFE, 0x22, 0x00, 0x41, 0xFF,
+ 0x82, 0xFE, 0x22, 0x00, 0xF5, 0xFE, 0x82, 0xFE,
+ 0x25, 0x00, 0xA7, 0xFE, 0x03, 0xFE, 0x27, 0x00,
+ 0x5B, 0xFE, 0x97, 0xFD, 0x29, 0x00, 0x0E, 0xFE,
+ 0x14, 0xFD, 0x2B, 0x00, 0xC2, 0xFD, 0x78, 0xFC,
+ 0x24, 0x00, 0x26, 0x00, 0x3C, 0xFE, 0x24, 0x00,
+ 0x72, 0x00, 0x3C, 0xFE, 0x24, 0x00, 0xBF, 0x00,
+ 0x3C, 0xFE, 0x24, 0x00, 0x0B, 0x01, 0x3C, 0xFE,
+ 0x27, 0x00, 0x59, 0x01, 0xA6, 0xFD, 0x29, 0x00,
+ 0xA5, 0x01, 0x27, 0xFD, 0x2B, 0x00, 0xF2, 0x01,
+ 0x8C, 0xFC, 0x2D, 0x00, 0x3E, 0x02, 0xD3, 0xFB,
+ 0x24, 0x00, 0xDA, 0xFF, 0x3C, 0xFE, 0x24, 0x00,
+ 0x8E, 0xFF, 0x3C, 0xFE, 0x24, 0x00, 0x41, 0xFF,
+ 0x3C, 0xFE, 0x24, 0x00, 0xF5, 0xFE, 0x3C, 0xFE,
+ 0x27, 0x00, 0xA7, 0xFE, 0xA6, 0xFD, 0x29, 0x00,
+ 0x5B, 0xFE, 0x27, 0xFD, 0x2B, 0x00, 0x0E, 0xFE,
+ 0x8C, 0xFC, 0x2D, 0x00, 0xC2, 0xFD, 0xD3, 0xFB,
+ 0x26, 0x00, 0x26, 0x00, 0xF7, 0xFD, 0x26, 0x00,
+ 0x72, 0x00, 0xF7, 0xFD, 0x26, 0x00, 0xBF, 0x00,
+ 0xF7, 0xFD, 0x26, 0x00, 0x0B, 0x01, 0xF7, 0xFD,
+ 0x29, 0x00, 0x59, 0x01, 0x4A, 0xFD, 0x2B, 0x00,
+ 0xA5, 0x01, 0xB7, 0xFC, 0x2D, 0x00, 0xF2, 0x01,
+ 0x04, 0xFC, 0x2F, 0x00, 0x3E, 0x02, 0x2F, 0xFB,
+ 0x26, 0x00, 0xDA, 0xFF, 0xF7, 0xFD, 0x26, 0x00,
+ 0x8E, 0xFF, 0xF7, 0xFD, 0x26, 0x00, 0x41, 0xFF,
+ 0xF7, 0xFD, 0x26, 0x00, 0xF5, 0xFE, 0xF7, 0xFD,
+ 0x29, 0x00, 0xA7, 0xFE, 0x4A, 0xFD, 0x2B, 0x00,
+ 0x5B, 0xFE, 0xB7, 0xFC, 0x2D, 0x00, 0x0E, 0xFE,
+ 0x04, 0xFC, 0x2F, 0x00, 0xC2, 0xFD, 0x2F, 0xFB,
+ 0x1E, 0x00, 0x2A, 0x00, 0x26, 0x00, 0x1E, 0x00,
+ 0x7E, 0x00, 0x26, 0x00, 0x1E, 0x00, 0xD2, 0x00,
+ 0x26, 0x00, 0x1E, 0x00, 0x26, 0x01, 0x26, 0x00,
+ 0x21, 0x00, 0x7B, 0x01, 0x33, 0x00, 0x23, 0x00,
+ 0xCF, 0x01, 0x3D, 0x00, 0x25, 0x00, 0x23, 0x02,
+ 0x4A, 0x00, 0x27, 0x00, 0x77, 0x02, 0x5A, 0x00,
+ 0x1E, 0x00, 0xD6, 0xFF, 0x26, 0x00, 0x1E, 0x00,
+ 0x82, 0xFF, 0x26, 0x00, 0x1E, 0x00, 0x2E, 0xFF,
+ 0x26, 0x00, 0x1E, 0x00, 0xDA, 0xFE, 0x26, 0x00,
+ 0x21, 0x00, 0x85, 0xFE, 0x33, 0x00, 0x23, 0x00,
+ 0x31, 0xFE, 0x3D, 0x00, 0x25, 0x00, 0xDD, 0xFD,
+ 0x4A, 0x00, 0x27, 0x00, 0x89, 0xFD, 0x5A, 0x00,
+ 0x1E, 0x00, 0x2A, 0x00, 0x72, 0x00, 0x1E, 0x00,
+ 0x7E, 0x00, 0x72, 0x00, 0x1E, 0x00, 0xD2, 0x00,
+ 0x72, 0x00, 0x1E, 0x00, 0x26, 0x01, 0x72, 0x00,
+ 0x21, 0x00, 0x7B, 0x01, 0x99, 0x00, 0x23, 0x00,
+ 0xCF, 0x01, 0xB8, 0x00, 0x25, 0x00, 0x23, 0x02,
+ 0xDF, 0x00, 0x27, 0x00, 0x77, 0x02, 0x0F, 0x01,
+ 0x1E, 0x00, 0xD6, 0xFF, 0x72, 0x00, 0x1E, 0x00,
+ 0x82, 0xFF, 0x72, 0x00, 0x1E, 0x00, 0x2E, 0xFF,
+ 0x72, 0x00, 0x1E, 0x00, 0xDA, 0xFE, 0x72, 0x00,
+ 0x21, 0x00, 0x85, 0xFE, 0x99, 0x00, 0x23, 0x00,
+ 0x31, 0xFE, 0xB8, 0x00, 0x25, 0x00, 0xDD, 0xFD,
+ 0xDF, 0x00, 0x27, 0x00, 0x89, 0xFD, 0x0F, 0x01,
+ 0x1E, 0x00, 0x2A, 0x00, 0xBF, 0x00, 0x1E, 0x00,
+ 0x7E, 0x00, 0xBF, 0x00, 0x1E, 0x00, 0xD2, 0x00,
+ 0xBF, 0x00, 0x1E, 0x00, 0x26, 0x01, 0xBF, 0x00,
+ 0x21, 0x00, 0x7B, 0x01, 0xFF, 0x00, 0x23, 0x00,
+ 0xCF, 0x01, 0x34, 0x01, 0x25, 0x00, 0x23, 0x02,
+ 0x75, 0x01, 0x27, 0x00, 0x77, 0x02, 0xC4, 0x01,
+ 0x1E, 0x00, 0xD6, 0xFF, 0xBF, 0x00, 0x1E, 0x00,
+ 0x82, 0xFF, 0xBF, 0x00, 0x1E, 0x00, 0x2E, 0xFF,
+ 0xBF, 0x00, 0x1E, 0x00, 0xDA, 0xFE, 0xBF, 0x00,
+ 0x21, 0x00, 0x85, 0xFE, 0xFF, 0x00, 0x23, 0x00,
+ 0x31, 0xFE, 0x34, 0x01, 0x25, 0x00, 0xDD, 0xFD,
+ 0x75, 0x01, 0x27, 0x00, 0x89, 0xFD, 0xC4, 0x01,
+ 0x1E, 0x00, 0x2A, 0x00, 0x0B, 0x01, 0x1E, 0x00,
+ 0x7E, 0x00, 0x0B, 0x01, 0x1E, 0x00, 0xD2, 0x00,
+ 0x0B, 0x01, 0x1E, 0x00, 0x26, 0x01, 0x0B, 0x01,
+ 0x21, 0x00, 0x7B, 0x01, 0x65, 0x01, 0x23, 0x00,
+ 0xCF, 0x01, 0xAF, 0x01, 0x25, 0x00, 0x23, 0x02,
+ 0x0A, 0x02, 0x27, 0x00, 0x77, 0x02, 0x79, 0x02,
+ 0x1E, 0x00, 0xD6, 0xFF, 0x0B, 0x01, 0x1E, 0x00,
+ 0x82, 0xFF, 0x0B, 0x01, 0x1E, 0x00, 0x2E, 0xFF,
+ 0x0B, 0x01, 0x1E, 0x00, 0xDA, 0xFE, 0x0B, 0x01,
+ 0x21, 0x00, 0x85, 0xFE, 0x65, 0x01, 0x23, 0x00,
+ 0x31, 0xFE, 0xAF, 0x01, 0x25, 0x00, 0xDD, 0xFD,
+ 0x0A, 0x02, 0x27, 0x00, 0x89, 0xFD, 0x79, 0x02,
+ 0x21, 0x00, 0x2A, 0x00, 0x59, 0x01, 0x21, 0x00,
+ 0x7E, 0x00, 0x59, 0x01, 0x21, 0x00, 0xD2, 0x00,
+ 0x59, 0x01, 0x21, 0x00, 0x26, 0x01, 0x59, 0x01,
+ 0x24, 0x00, 0x7B, 0x01, 0xCB, 0x01, 0x26, 0x00,
+ 0xCF, 0x01, 0x2B, 0x02, 0x28, 0x00, 0x23, 0x02,
+ 0xA0, 0x02, 0x2A, 0x00, 0x77, 0x02, 0x2E, 0x03,
+ 0x21, 0x00, 0xD6, 0xFF, 0x59, 0x01, 0x21, 0x00,
+ 0x82, 0xFF, 0x59, 0x01, 0x21, 0x00, 0x2E, 0xFF,
+ 0x59, 0x01, 0x21, 0x00, 0xDA, 0xFE, 0x59, 0x01,
+ 0x24, 0x00, 0x85, 0xFE, 0xCB, 0x01, 0x26, 0x00,
+ 0x31, 0xFE, 0x2B, 0x02, 0x28, 0x00, 0xDD, 0xFD,
+ 0xA0, 0x02, 0x2A, 0x00, 0x89, 0xFD, 0x2E, 0x03,
+ 0x23, 0x00, 0x2A, 0x00, 0xA5, 0x01, 0x23, 0x00,
+ 0x7E, 0x00, 0xA5, 0x01, 0x23, 0x00, 0xD2, 0x00,
+ 0xA5, 0x01, 0x23, 0x00, 0x26, 0x01, 0xA5, 0x01,
+ 0x26, 0x00, 0x7B, 0x01, 0x31, 0x02, 0x28, 0x00,
+ 0xCF, 0x01, 0xA6, 0x02, 0x2A, 0x00, 0x23, 0x02,
+ 0x35, 0x03, 0x2C, 0x00, 0x77, 0x02, 0xE3, 0x03,
+ 0x23, 0x00, 0xD6, 0xFF, 0xA5, 0x01, 0x23, 0x00,
+ 0x82, 0xFF, 0xA5, 0x01, 0x23, 0x00, 0x2E, 0xFF,
+ 0xA5, 0x01, 0x23, 0x00, 0xDA, 0xFE, 0xA5, 0x01,
+ 0x26, 0x00, 0x85, 0xFE, 0x31, 0x02, 0x28, 0x00,
+ 0x31, 0xFE, 0xA6, 0x02, 0x2A, 0x00, 0xDD, 0xFD,
+ 0x35, 0x03, 0x2C, 0x00, 0x89, 0xFD, 0xE3, 0x03,
+ 0x25, 0x00, 0x2A, 0x00, 0xF2, 0x01, 0x25, 0x00,
+ 0x7E, 0x00, 0xF2, 0x01, 0x25, 0x00, 0xD2, 0x00,
+ 0xF2, 0x01, 0x25, 0x00, 0x26, 0x01, 0xF2, 0x01,
+ 0x28, 0x00, 0x7B, 0x01, 0x97, 0x02, 0x2A, 0x00,
+ 0xCF, 0x01, 0x22, 0x03, 0x2C, 0x00, 0x23, 0x02,
+ 0xCB, 0x03, 0x2E, 0x00, 0x77, 0x02, 0x98, 0x04,
+ 0x25, 0x00, 0xD6, 0xFF, 0xF2, 0x01, 0x25, 0x00,
+ 0x82, 0xFF, 0xF2, 0x01, 0x25, 0x00, 0x2E, 0xFF,
+ 0xF2, 0x01, 0x25, 0x00, 0xDA, 0xFE, 0xF2, 0x01,
+ 0x28, 0x00, 0x85, 0xFE, 0x97, 0x02, 0x2A, 0x00,
+ 0x31, 0xFE, 0x22, 0x03, 0x2C, 0x00, 0xDD, 0xFD,
+ 0xCB, 0x03, 0x2E, 0x00, 0x89, 0xFD, 0x98, 0x04,
+ 0x27, 0x00, 0x2A, 0x00, 0x3E, 0x02, 0x27, 0x00,
+ 0x7E, 0x00, 0x3E, 0x02, 0x27, 0x00, 0xD2, 0x00,
+ 0x3E, 0x02, 0x27, 0x00, 0x26, 0x01, 0x3E, 0x02,
+ 0x2A, 0x00, 0x7B, 0x01, 0xFD, 0x02, 0x2C, 0x00,
+ 0xCF, 0x01, 0x9D, 0x03, 0x2E, 0x00, 0x23, 0x02,
+ 0x60, 0x04, 0x30, 0x00, 0x77, 0x02, 0x4D, 0x05,
+ 0x27, 0x00, 0xD6, 0xFF, 0x3E, 0x02, 0x27, 0x00,
+ 0x82, 0xFF, 0x3E, 0x02, 0x27, 0x00, 0x2E, 0xFF,
+ 0x3E, 0x02, 0x27, 0x00, 0xDA, 0xFE, 0x3E, 0x02,
+ 0x2A, 0x00, 0x85, 0xFE, 0xFD, 0x02, 0x2C, 0x00,
+ 0x31, 0xFE, 0x9D, 0x03, 0x2E, 0x00, 0xDD, 0xFD,
+ 0x60, 0x04, 0x30, 0x00, 0x89, 0xFD, 0x4D, 0x05,
+ 0x1E, 0x00, 0x2A, 0x00, 0xDA, 0xFF, 0x1E, 0x00,
+ 0x7E, 0x00, 0xDA, 0xFF, 0x1E, 0x00, 0xD2, 0x00,
+ 0xDA, 0xFF, 0x1E, 0x00, 0x26, 0x01, 0xDA, 0xFF,
+ 0x21, 0x00, 0x7B, 0x01, 0xCD, 0xFF, 0x23, 0x00,
+ 0xCF, 0x01, 0xC3, 0xFF, 0x25, 0x00, 0x23, 0x02,
+ 0xB6, 0xFF, 0x27, 0x00, 0x77, 0x02, 0xA6, 0xFF,
+ 0x1E, 0x00, 0xD6, 0xFF, 0xDA, 0xFF, 0x1E, 0x00,
+ 0x82, 0xFF, 0xDA, 0xFF, 0x1E, 0x00, 0x2E, 0xFF,
+ 0xDA, 0xFF, 0x1E, 0x00, 0xDA, 0xFE, 0xDA, 0xFF,
+ 0x21, 0x00, 0x85, 0xFE, 0xCD, 0xFF, 0x23, 0x00,
+ 0x31, 0xFE, 0xC3, 0xFF, 0x25, 0x00, 0xDD, 0xFD,
+ 0xB6, 0xFF, 0x27, 0x00, 0x89, 0xFD, 0xA6, 0xFF,
+ 0x1E, 0x00, 0x2A, 0x00, 0x8E, 0xFF, 0x1E, 0x00,
+ 0x7E, 0x00, 0x8E, 0xFF, 0x1E, 0x00, 0xD2, 0x00,
+ 0x8E, 0xFF, 0x1E, 0x00, 0x26, 0x01, 0x8E, 0xFF,
+ 0x21, 0x00, 0x7B, 0x01, 0x67, 0xFF, 0x23, 0x00,
+ 0xCF, 0x01, 0x48, 0xFF, 0x25, 0x00, 0x23, 0x02,
+ 0x21, 0xFF, 0x27, 0x00, 0x77, 0x02, 0xF1, 0xFE,
+ 0x1E, 0x00, 0xD6, 0xFF, 0x8E, 0xFF, 0x1E, 0x00,
+ 0x82, 0xFF, 0x8E, 0xFF, 0x1E, 0x00, 0x2E, 0xFF,
+ 0x8E, 0xFF, 0x1E, 0x00, 0xDA, 0xFE, 0x8E, 0xFF,
+ 0x21, 0x00, 0x85, 0xFE, 0x67, 0xFF, 0x23, 0x00,
+ 0x31, 0xFE, 0x48, 0xFF, 0x25, 0x00, 0xDD, 0xFD,
+ 0x21, 0xFF, 0x27, 0x00, 0x89, 0xFD, 0xF1, 0xFE,
+ 0x1E, 0x00, 0x2A, 0x00, 0x41, 0xFF, 0x1E, 0x00,
+ 0x7E, 0x00, 0x41, 0xFF, 0x1E, 0x00, 0xD2, 0x00,
+ 0x41, 0xFF, 0x1E, 0x00, 0x26, 0x01, 0x41, 0xFF,
+ 0x21, 0x00, 0x7B, 0x01, 0x01, 0xFF, 0x23, 0x00,
+ 0xCF, 0x01, 0xCC, 0xFE, 0x25, 0x00, 0x23, 0x02,
+ 0x8B, 0xFE, 0x27, 0x00, 0x77, 0x02, 0x3C, 0xFE,
+ 0x1E, 0x00, 0xD6, 0xFF, 0x41, 0xFF, 0x1E, 0x00,
+ 0x82, 0xFF, 0x41, 0xFF, 0x1E, 0x00, 0x2E, 0xFF,
+ 0x41, 0xFF, 0x1E, 0x00, 0xDA, 0xFE, 0x41, 0xFF,
+ 0x21, 0x00, 0x85, 0xFE, 0x01, 0xFF, 0x23, 0x00,
+ 0x31, 0xFE, 0xCC, 0xFE, 0x25, 0x00, 0xDD, 0xFD,
+ 0x8B, 0xFE, 0x27, 0x00, 0x89, 0xFD, 0x3C, 0xFE,
+ 0x1E, 0x00, 0x2A, 0x00, 0xF5, 0xFE, 0x1E, 0x00,
+ 0x7E, 0x00, 0xF5, 0xFE, 0x1E, 0x00, 0xD2, 0x00,
+ 0xF5, 0xFE, 0x1E, 0x00, 0x26, 0x01, 0xF5, 0xFE,
+ 0x21, 0x00, 0x7B, 0x01, 0x9B, 0xFE, 0x23, 0x00,
+ 0xCF, 0x01, 0x51, 0xFE, 0x25, 0x00, 0x23, 0x02,
+ 0xF6, 0xFD, 0x27, 0x00, 0x77, 0x02, 0x87, 0xFD,
+ 0x1E, 0x00, 0xD6, 0xFF, 0xF5, 0xFE, 0x1E, 0x00,
+ 0x82, 0xFF, 0xF5, 0xFE, 0x1E, 0x00, 0x2E, 0xFF,
+ 0xF5, 0xFE, 0x1E, 0x00, 0xDA, 0xFE, 0xF5, 0xFE,
+ 0x21, 0x00, 0x85, 0xFE, 0x9B, 0xFE, 0x23, 0x00,
+ 0x31, 0xFE, 0x51, 0xFE, 0x25, 0x00, 0xDD, 0xFD,
+ 0xF6, 0xFD, 0x27, 0x00, 0x89, 0xFD, 0x87, 0xFD,
+ 0x21, 0x00, 0x2A, 0x00, 0xA7, 0xFE, 0x21, 0x00,
+ 0x7E, 0x00, 0xA7, 0xFE, 0x21, 0x00, 0xD2, 0x00,
+ 0xA7, 0xFE, 0x21, 0x00, 0x26, 0x01, 0xA7, 0xFE,
+ 0x24, 0x00, 0x7B, 0x01, 0x35, 0xFE, 0x26, 0x00,
+ 0xCF, 0x01, 0xD5, 0xFD, 0x28, 0x00, 0x23, 0x02,
+ 0x60, 0xFD, 0x2A, 0x00, 0x77, 0x02, 0xD2, 0xFC,
+ 0x21, 0x00, 0xD6, 0xFF, 0xA7, 0xFE, 0x21, 0x00,
+ 0x82, 0xFF, 0xA7, 0xFE, 0x21, 0x00, 0x2E, 0xFF,
+ 0xA7, 0xFE, 0x21, 0x00, 0xDA, 0xFE, 0xA7, 0xFE,
+ 0x24, 0x00, 0x85, 0xFE, 0x35, 0xFE, 0x26, 0x00,
+ 0x31, 0xFE, 0xD5, 0xFD, 0x28, 0x00, 0xDD, 0xFD,
+ 0x60, 0xFD, 0x2A, 0x00, 0x89, 0xFD, 0xD2, 0xFC,
+ 0x23, 0x00, 0x2A, 0x00, 0x5B, 0xFE, 0x23, 0x00,
+ 0x7E, 0x00, 0x5B, 0xFE, 0x23, 0x00, 0xD2, 0x00,
+ 0x5B, 0xFE, 0x23, 0x00, 0x26, 0x01, 0x5B, 0xFE,
+ 0x26, 0x00, 0x7B, 0x01, 0xCF, 0xFD, 0x28, 0x00,
+ 0xCF, 0x01, 0x5A, 0xFD, 0x2A, 0x00, 0x23, 0x02,
+ 0xCB, 0xFC, 0x2C, 0x00, 0x77, 0x02, 0x1D, 0xFC,
+ 0x23, 0x00, 0xD6, 0xFF, 0x5B, 0xFE, 0x23, 0x00,
+ 0x82, 0xFF, 0x5B, 0xFE, 0x23, 0x00, 0x2E, 0xFF,
+ 0x5B, 0xFE, 0x23, 0x00, 0xDA, 0xFE, 0x5B, 0xFE,
+ 0x26, 0x00, 0x85, 0xFE, 0xCF, 0xFD, 0x28, 0x00,
+ 0x31, 0xFE, 0x5A, 0xFD, 0x2A, 0x00, 0xDD, 0xFD,
+ 0xCB, 0xFC, 0x2C, 0x00, 0x89, 0xFD, 0x1D, 0xFC,
+ 0x25, 0x00, 0x2A, 0x00, 0x0E, 0xFE, 0x25, 0x00,
+ 0x7E, 0x00, 0x0E, 0xFE, 0x25, 0x00, 0xD2, 0x00,
+ 0x0E, 0xFE, 0x25, 0x00, 0x26, 0x01, 0x0E, 0xFE,
+ 0x28, 0x00, 0x7B, 0x01, 0x69, 0xFD, 0x2A, 0x00,
+ 0xCF, 0x01, 0xDE, 0xFC, 0x2C, 0x00, 0x23, 0x02,
+ 0x35, 0xFC, 0x2E, 0x00, 0x77, 0x02, 0x68, 0xFB,
+ 0x25, 0x00, 0xD6, 0xFF, 0x0E, 0xFE, 0x25, 0x00,
+ 0x82, 0xFF, 0x0E, 0xFE, 0x25, 0x00, 0x2E, 0xFF,
+ 0x0E, 0xFE, 0x25, 0x00, 0xDA, 0xFE, 0x0E, 0xFE,
+ 0x28, 0x00, 0x85, 0xFE, 0x69, 0xFD, 0x2A, 0x00,
+ 0x31, 0xFE, 0xDE, 0xFC, 0x2C, 0x00, 0xDD, 0xFD,
+ 0x35, 0xFC, 0x2E, 0x00, 0x89, 0xFD, 0x68, 0xFB,
+ 0x27, 0x00, 0x2A, 0x00, 0xC2, 0xFD, 0x27, 0x00,
+ 0x7E, 0x00, 0xC2, 0xFD, 0x27, 0x00, 0xD2, 0x00,
+ 0xC2, 0xFD, 0x27, 0x00, 0x26, 0x01, 0xC2, 0xFD,
+ 0x2A, 0x00, 0x7B, 0x01, 0x03, 0xFD, 0x2C, 0x00,
+ 0xCF, 0x01, 0x63, 0xFC, 0x2E, 0x00, 0x23, 0x02,
+ 0xA0, 0xFB, 0x30, 0x00, 0x77, 0x02, 0xB3, 0xFA,
+ 0x27, 0x00, 0xD6, 0xFF, 0xC2, 0xFD, 0x27, 0x00,
+ 0x82, 0xFF, 0xC2, 0xFD, 0x27, 0x00, 0x2E, 0xFF,
+ 0xC2, 0xFD, 0x27, 0x00, 0xDA, 0xFE, 0xC2, 0xFD,
+ 0x2A, 0x00, 0x85, 0xFE, 0x03, 0xFD, 0x2C, 0x00,
+ 0x31, 0xFE, 0x63, 0xFC, 0x2E, 0x00, 0xDD, 0xFD,
+ 0xA0, 0xFB, 0x30, 0x00, 0x89, 0xFD, 0xB3, 0xFA,
+ 0x1F, 0x00, 0x2E, 0x00, 0x2A, 0x00, 0x1F, 0x00,
+ 0x8A, 0x00, 0x2A, 0x00, 0x1F, 0x00, 0xE7, 0x00,
+ 0x2A, 0x00, 0x1F, 0x00, 0x43, 0x01, 0x2A, 0x00,
+ 0x22, 0x00, 0xA1, 0x01, 0x38, 0x00, 0x24, 0x00,
+ 0xFD, 0x01, 0x44, 0x00, 0x26, 0x00, 0x5A, 0x02,
+ 0x52, 0x00, 0x28, 0x00, 0xB6, 0x02, 0x63, 0x00,
+ 0x1F, 0x00, 0xD2, 0xFF, 0x2A, 0x00, 0x1F, 0x00,
+ 0x76, 0xFF, 0x2A, 0x00, 0x1F, 0x00, 0x19, 0xFF,
+ 0x2A, 0x00, 0x1F, 0x00, 0xBD, 0xFE, 0x2A, 0x00,
+ 0x22, 0x00, 0x5F, 0xFE, 0x38, 0x00, 0x24, 0x00,
+ 0x03, 0xFE, 0x44, 0x00, 0x26, 0x00, 0xA6, 0xFD,
+ 0x52, 0x00, 0x28, 0x00, 0x4A, 0xFD, 0x63, 0x00,
+ 0x1F, 0x00, 0x2E, 0x00, 0x7E, 0x00, 0x1F, 0x00,
+ 0x8A, 0x00, 0x7E, 0x00, 0x1F, 0x00, 0xE7, 0x00,
+ 0x7E, 0x00, 0x1F, 0x00, 0x43, 0x01, 0x7E, 0x00,
+ 0x22, 0x00, 0xA1, 0x01, 0xA8, 0x00, 0x24, 0x00,
+ 0xFD, 0x01, 0xCC, 0x00, 0x26, 0x00, 0x5A, 0x02,
+ 0xF6, 0x00, 0x28, 0x00, 0xB6, 0x02, 0x2A, 0x01,
+ 0x1F, 0x00, 0xD2, 0xFF, 0x7E, 0x00, 0x1F, 0x00,
+ 0x76, 0xFF, 0x7E, 0x00, 0x1F, 0x00, 0x19, 0xFF,
+ 0x7E, 0x00, 0x1F, 0x00, 0xBD, 0xFE, 0x7E, 0x00,
+ 0x22, 0x00, 0x5F, 0xFE, 0xA8, 0x00, 0x24, 0x00,
+ 0x03, 0xFE, 0xCC, 0x00, 0x26, 0x00, 0xA6, 0xFD,
+ 0xF6, 0x00, 0x28, 0x00, 0x4A, 0xFD, 0x2A, 0x01,
+ 0x1F, 0x00, 0x2E, 0x00, 0xD2, 0x00, 0x1F, 0x00,
+ 0x8A, 0x00, 0xD2, 0x00, 0x1F, 0x00, 0xE7, 0x00,
+ 0xD2, 0x00, 0x1F, 0x00, 0x43, 0x01, 0xD2, 0x00,
+ 0x22, 0x00, 0xA1, 0x01, 0x18, 0x01, 0x24, 0x00,
+ 0xFD, 0x01, 0x54, 0x01, 0x26, 0x00, 0x5A, 0x02,
+ 0x9B, 0x01, 0x28, 0x00, 0xB6, 0x02, 0xF1, 0x01,
+ 0x1F, 0x00, 0xD2, 0xFF, 0xD2, 0x00, 0x1F, 0x00,
+ 0x76, 0xFF, 0xD2, 0x00, 0x1F, 0x00, 0x19, 0xFF,
+ 0xD2, 0x00, 0x1F, 0x00, 0xBD, 0xFE, 0xD2, 0x00,
+ 0x22, 0x00, 0x5F, 0xFE, 0x18, 0x01, 0x24, 0x00,
+ 0x03, 0xFE, 0x54, 0x01, 0x26, 0x00, 0xA6, 0xFD,
+ 0x9B, 0x01, 0x28, 0x00, 0x4A, 0xFD, 0xF1, 0x01,
+ 0x1F, 0x00, 0x2E, 0x00, 0x26, 0x01, 0x1F, 0x00,
+ 0x8A, 0x00, 0x26, 0x01, 0x1F, 0x00, 0xE7, 0x00,
+ 0x26, 0x01, 0x1F, 0x00, 0x43, 0x01, 0x26, 0x01,
+ 0x22, 0x00, 0xA1, 0x01, 0x88, 0x01, 0x24, 0x00,
+ 0xFD, 0x01, 0xDC, 0x01, 0x26, 0x00, 0x5A, 0x02,
+ 0x3F, 0x02, 0x28, 0x00, 0xB6, 0x02, 0xB8, 0x02,
+ 0x1F, 0x00, 0xD2, 0xFF, 0x26, 0x01, 0x1F, 0x00,
+ 0x76, 0xFF, 0x26, 0x01, 0x1F, 0x00, 0x19, 0xFF,
+ 0x26, 0x01, 0x1F, 0x00, 0xBD, 0xFE, 0x26, 0x01,
+ 0x22, 0x00, 0x5F, 0xFE, 0x88, 0x01, 0x24, 0x00,
+ 0x03, 0xFE, 0xDC, 0x01, 0x26, 0x00, 0xA6, 0xFD,
+ 0x3F, 0x02, 0x28, 0x00, 0x4A, 0xFD, 0xB8, 0x02,
+ 0x22, 0x00, 0x2E, 0x00, 0x7B, 0x01, 0x22, 0x00,
+ 0x8A, 0x00, 0x7B, 0x01, 0x22, 0x00, 0xE7, 0x00,
+ 0x7B, 0x01, 0x22, 0x00, 0x43, 0x01, 0x7B, 0x01,
+ 0x25, 0x00, 0xA1, 0x01, 0xF9, 0x01, 0x27, 0x00,
+ 0xFD, 0x01, 0x64, 0x02, 0x29, 0x00, 0x5A, 0x02,
+ 0xE4, 0x02, 0x2B, 0x00, 0xB6, 0x02, 0x7F, 0x03,
+ 0x22, 0x00, 0xD2, 0xFF, 0x7B, 0x01, 0x22, 0x00,
+ 0x76, 0xFF, 0x7B, 0x01, 0x22, 0x00, 0x19, 0xFF,
+ 0x7B, 0x01, 0x22, 0x00, 0xBD, 0xFE, 0x7B, 0x01,
+ 0x25, 0x00, 0x5F, 0xFE, 0xF9, 0x01, 0x27, 0x00,
+ 0x03, 0xFE, 0x64, 0x02, 0x29, 0x00, 0xA6, 0xFD,
+ 0xE4, 0x02, 0x2B, 0x00, 0x4A, 0xFD, 0x7F, 0x03,
+ 0x24, 0x00, 0x2E, 0x00, 0xCF, 0x01, 0x24, 0x00,
+ 0x8A, 0x00, 0xCF, 0x01, 0x24, 0x00, 0xE7, 0x00,
+ 0xCF, 0x01, 0x24, 0x00, 0x43, 0x01, 0xCF, 0x01,
+ 0x27, 0x00, 0xA1, 0x01, 0x69, 0x02, 0x29, 0x00,
+ 0xFD, 0x01, 0xEC, 0x02, 0x2B, 0x00, 0x5A, 0x02,
+ 0x88, 0x03, 0x2D, 0x00, 0xB6, 0x02, 0x46, 0x04,
+ 0x24, 0x00, 0xD2, 0xFF, 0xCF, 0x01, 0x24, 0x00,
+ 0x76, 0xFF, 0xCF, 0x01, 0x24, 0x00, 0x19, 0xFF,
+ 0xCF, 0x01, 0x24, 0x00, 0xBD, 0xFE, 0xCF, 0x01,
+ 0x27, 0x00, 0x5F, 0xFE, 0x69, 0x02, 0x29, 0x00,
+ 0x03, 0xFE, 0xEC, 0x02, 0x2B, 0x00, 0xA6, 0xFD,
+ 0x88, 0x03, 0x2D, 0x00, 0x4A, 0xFD, 0x46, 0x04,
+ 0x26, 0x00, 0x2E, 0x00, 0x23, 0x02, 0x26, 0x00,
+ 0x8A, 0x00, 0x23, 0x02, 0x26, 0x00, 0xE7, 0x00,
+ 0x23, 0x02, 0x26, 0x00, 0x43, 0x01, 0x23, 0x02,
+ 0x29, 0x00, 0xA1, 0x01, 0xD9, 0x02, 0x2B, 0x00,
+ 0xFD, 0x01, 0x74, 0x03, 0x2D, 0x00, 0x5A, 0x02,
+ 0x2D, 0x04, 0x2F, 0x00, 0xB6, 0x02, 0x0D, 0x05,
+ 0x26, 0x00, 0xD2, 0xFF, 0x23, 0x02, 0x26, 0x00,
+ 0x76, 0xFF, 0x23, 0x02, 0x26, 0x00, 0x19, 0xFF,
+ 0x23, 0x02, 0x26, 0x00, 0xBD, 0xFE, 0x23, 0x02,
+ 0x29, 0x00, 0x5F, 0xFE, 0xD9, 0x02, 0x2B, 0x00,
+ 0x03, 0xFE, 0x74, 0x03, 0x2D, 0x00, 0xA6, 0xFD,
+ 0x2D, 0x04, 0x2F, 0x00, 0x4A, 0xFD, 0x0D, 0x05,
+ 0x28, 0x00, 0x2E, 0x00, 0x77, 0x02, 0x28, 0x00,
+ 0x8A, 0x00, 0x77, 0x02, 0x28, 0x00, 0xE7, 0x00,
+ 0x77, 0x02, 0x28, 0x00, 0x43, 0x01, 0x77, 0x02,
+ 0x2B, 0x00, 0xA1, 0x01, 0x49, 0x03, 0x2D, 0x00,
+ 0xFD, 0x01, 0xFC, 0x03, 0x2F, 0x00, 0x5A, 0x02,
+ 0xD1, 0x04, 0x30, 0x00, 0xB6, 0x02, 0xD4, 0x05,
+ 0x28, 0x00, 0xD2, 0xFF, 0x77, 0x02, 0x28, 0x00,
+ 0x76, 0xFF, 0x77, 0x02, 0x28, 0x00, 0x19, 0xFF,
+ 0x77, 0x02, 0x28, 0x00, 0xBD, 0xFE, 0x77, 0x02,
+ 0x2B, 0x00, 0x5F, 0xFE, 0x49, 0x03, 0x2D, 0x00,
+ 0x03, 0xFE, 0xFC, 0x03, 0x2F, 0x00, 0xA6, 0xFD,
+ 0xD1, 0x04, 0x30, 0x00, 0x4A, 0xFD, 0xD4, 0x05,
+ 0x1F, 0x00, 0x2E, 0x00, 0xD6, 0xFF, 0x1F, 0x00,
+ 0x8A, 0x00, 0xD6, 0xFF, 0x1F, 0x00, 0xE7, 0x00,
+ 0xD6, 0xFF, 0x1F, 0x00, 0x43, 0x01, 0xD6, 0xFF,
+ 0x22, 0x00, 0xA1, 0x01, 0xC8, 0xFF, 0x24, 0x00,
+ 0xFD, 0x01, 0xBC, 0xFF, 0x26, 0x00, 0x5A, 0x02,
+ 0xAE, 0xFF, 0x28, 0x00, 0xB6, 0x02, 0x9D, 0xFF,
+ 0x1F, 0x00, 0xD2, 0xFF, 0xD6, 0xFF, 0x1F, 0x00,
+ 0x76, 0xFF, 0xD6, 0xFF, 0x1F, 0x00, 0x19, 0xFF,
+ 0xD6, 0xFF, 0x1F, 0x00, 0xBD, 0xFE, 0xD6, 0xFF,
+ 0x22, 0x00, 0x5F, 0xFE, 0xC8, 0xFF, 0x24, 0x00,
+ 0x03, 0xFE, 0xBC, 0xFF, 0x26, 0x00, 0xA6, 0xFD,
+ 0xAE, 0xFF, 0x28, 0x00, 0x4A, 0xFD, 0x9D, 0xFF,
+ 0x1F, 0x00, 0x2E, 0x00, 0x82, 0xFF, 0x1F, 0x00,
+ 0x8A, 0x00, 0x82, 0xFF, 0x1F, 0x00, 0xE7, 0x00,
+ 0x82, 0xFF, 0x1F, 0x00, 0x43, 0x01, 0x82, 0xFF,
+ 0x22, 0x00, 0xA1, 0x01, 0x58, 0xFF, 0x24, 0x00,
+ 0xFD, 0x01, 0x34, 0xFF, 0x26, 0x00, 0x5A, 0x02,
+ 0x0A, 0xFF, 0x28, 0x00, 0xB6, 0x02, 0xD6, 0xFE,
+ 0x1F, 0x00, 0xD2, 0xFF, 0x82, 0xFF, 0x1F, 0x00,
+ 0x76, 0xFF, 0x82, 0xFF, 0x1F, 0x00, 0x19, 0xFF,
+ 0x82, 0xFF, 0x1F, 0x00, 0xBD, 0xFE, 0x82, 0xFF,
+ 0x22, 0x00, 0x5F, 0xFE, 0x58, 0xFF, 0x24, 0x00,
+ 0x03, 0xFE, 0x34, 0xFF, 0x26, 0x00, 0xA6, 0xFD,
+ 0x0A, 0xFF, 0x28, 0x00, 0x4A, 0xFD, 0xD6, 0xFE,
+ 0x1F, 0x00, 0x2E, 0x00, 0x2E, 0xFF, 0x1F, 0x00,
+ 0x8A, 0x00, 0x2E, 0xFF, 0x1F, 0x00, 0xE7, 0x00,
+ 0x2E, 0xFF, 0x1F, 0x00, 0x43, 0x01, 0x2E, 0xFF,
+ 0x22, 0x00, 0xA1, 0x01, 0xE8, 0xFE, 0x24, 0x00,
+ 0xFD, 0x01, 0xAC, 0xFE, 0x26, 0x00, 0x5A, 0x02,
+ 0x65, 0xFE, 0x28, 0x00, 0xB6, 0x02, 0x0F, 0xFE,
+ 0x1F, 0x00, 0xD2, 0xFF, 0x2E, 0xFF, 0x1F, 0x00,
+ 0x76, 0xFF, 0x2E, 0xFF, 0x1F, 0x00, 0x19, 0xFF,
+ 0x2E, 0xFF, 0x1F, 0x00, 0xBD, 0xFE, 0x2E, 0xFF,
+ 0x22, 0x00, 0x5F, 0xFE, 0xE8, 0xFE, 0x24, 0x00,
+ 0x03, 0xFE, 0xAC, 0xFE, 0x26, 0x00, 0xA6, 0xFD,
+ 0x65, 0xFE, 0x28, 0x00, 0x4A, 0xFD, 0x0F, 0xFE,
+ 0x1F, 0x00, 0x2E, 0x00, 0xDA, 0xFE, 0x1F, 0x00,
+ 0x8A, 0x00, 0xDA, 0xFE, 0x1F, 0x00, 0xE7, 0x00,
+ 0xDA, 0xFE, 0x1F, 0x00, 0x43, 0x01, 0xDA, 0xFE,
+ 0x22, 0x00, 0xA1, 0x01, 0x78, 0xFE, 0x24, 0x00,
+ 0xFD, 0x01, 0x24, 0xFE, 0x26, 0x00, 0x5A, 0x02,
+ 0xC1, 0xFD, 0x28, 0x00, 0xB6, 0x02, 0x48, 0xFD,
+ 0x1F, 0x00, 0xD2, 0xFF, 0xDA, 0xFE, 0x1F, 0x00,
+ 0x76, 0xFF, 0xDA, 0xFE, 0x1F, 0x00, 0x19, 0xFF,
+ 0xDA, 0xFE, 0x1F, 0x00, 0xBD, 0xFE, 0xDA, 0xFE,
+ 0x22, 0x00, 0x5F, 0xFE, 0x78, 0xFE, 0x24, 0x00,
+ 0x03, 0xFE, 0x24, 0xFE, 0x26, 0x00, 0xA6, 0xFD,
+ 0xC1, 0xFD, 0x28, 0x00, 0x4A, 0xFD, 0x48, 0xFD,
+ 0x22, 0x00, 0x2E, 0x00, 0x85, 0xFE, 0x22, 0x00,
+ 0x8A, 0x00, 0x85, 0xFE, 0x22, 0x00, 0xE7, 0x00,
+ 0x85, 0xFE, 0x22, 0x00, 0x43, 0x01, 0x85, 0xFE,
+ 0x25, 0x00, 0xA1, 0x01, 0x07, 0xFE, 0x27, 0x00,
+ 0xFD, 0x01, 0x9C, 0xFD, 0x29, 0x00, 0x5A, 0x02,
+ 0x1C, 0xFD, 0x2B, 0x00, 0xB6, 0x02, 0x81, 0xFC,
+ 0x22, 0x00, 0xD2, 0xFF, 0x85, 0xFE, 0x22, 0x00,
+ 0x76, 0xFF, 0x85, 0xFE, 0x22, 0x00, 0x19, 0xFF,
+ 0x85, 0xFE, 0x22, 0x00, 0xBD, 0xFE, 0x85, 0xFE,
+ 0x25, 0x00, 0x5F, 0xFE, 0x07, 0xFE, 0x27, 0x00,
+ 0x03, 0xFE, 0x9C, 0xFD, 0x29, 0x00, 0xA6, 0xFD,
+ 0x1C, 0xFD, 0x2B, 0x00, 0x4A, 0xFD, 0x81, 0xFC,
+ 0x24, 0x00, 0x2E, 0x00, 0x31, 0xFE, 0x24, 0x00,
+ 0x8A, 0x00, 0x31, 0xFE, 0x24, 0x00, 0xE7, 0x00,
+ 0x31, 0xFE, 0x24, 0x00, 0x43, 0x01, 0x31, 0xFE,
+ 0x27, 0x00, 0xA1, 0x01, 0x97, 0xFD, 0x29, 0x00,
+ 0xFD, 0x01, 0x14, 0xFD, 0x2B, 0x00, 0x5A, 0x02,
+ 0x78, 0xFC, 0x2D, 0x00, 0xB6, 0x02, 0xBA, 0xFB,
+ 0x24, 0x00, 0xD2, 0xFF, 0x31, 0xFE, 0x24, 0x00,
+ 0x76, 0xFF, 0x31, 0xFE, 0x24, 0x00, 0x19, 0xFF,
+ 0x31, 0xFE, 0x24, 0x00, 0xBD, 0xFE, 0x31, 0xFE,
+ 0x27, 0x00, 0x5F, 0xFE, 0x97, 0xFD, 0x29, 0x00,
+ 0x03, 0xFE, 0x14, 0xFD, 0x2B, 0x00, 0xA6, 0xFD,
+ 0x78, 0xFC, 0x2D, 0x00, 0x4A, 0xFD, 0xBA, 0xFB,
+ 0x26, 0x00, 0x2E, 0x00, 0xDD, 0xFD, 0x26, 0x00,
+ 0x8A, 0x00, 0xDD, 0xFD, 0x26, 0x00, 0xE7, 0x00,
+ 0xDD, 0xFD, 0x26, 0x00, 0x43, 0x01, 0xDD, 0xFD,
+ 0x29, 0x00, 0xA1, 0x01, 0x27, 0xFD, 0x2B, 0x00,
+ 0xFD, 0x01, 0x8C, 0xFC, 0x2D, 0x00, 0x5A, 0x02,
+ 0xD3, 0xFB, 0x2F, 0x00, 0xB6, 0x02, 0xF3, 0xFA,
+ 0x26, 0x00, 0xD2, 0xFF, 0xDD, 0xFD, 0x26, 0x00,
+ 0x76, 0xFF, 0xDD, 0xFD, 0x26, 0x00, 0x19, 0xFF,
+ 0xDD, 0xFD, 0x26, 0x00, 0xBD, 0xFE, 0xDD, 0xFD,
+ 0x29, 0x00, 0x5F, 0xFE, 0x27, 0xFD, 0x2B, 0x00,
+ 0x03, 0xFE, 0x8C, 0xFC, 0x2D, 0x00, 0xA6, 0xFD,
+ 0xD3, 0xFB, 0x2F, 0x00, 0x4A, 0xFD, 0xF3, 0xFA,
+ 0x28, 0x00, 0x2E, 0x00, 0x89, 0xFD, 0x28, 0x00,
+ 0x8A, 0x00, 0x89, 0xFD, 0x28, 0x00, 0xE7, 0x00,
+ 0x89, 0xFD, 0x28, 0x00, 0x43, 0x01, 0x89, 0xFD,
+ 0x2B, 0x00, 0xA1, 0x01, 0xB7, 0xFC, 0x2D, 0x00,
+ 0xFD, 0x01, 0x04, 0xFC, 0x2F, 0x00, 0x5A, 0x02,
+ 0x2F, 0xFB, 0x30, 0x00, 0xB6, 0x02, 0x2C, 0xFA,
+ 0x28, 0x00, 0xD2, 0xFF, 0x89, 0xFD, 0x28, 0x00,
+ 0x76, 0xFF, 0x89, 0xFD, 0x28, 0x00, 0x19, 0xFF,
+ 0x89, 0xFD, 0x28, 0x00, 0xBD, 0xFE, 0x89, 0xFD,
+ 0x2B, 0x00, 0x5F, 0xFE, 0xB7, 0xFC, 0x2D, 0x00,
+ 0x03, 0xFE, 0x04, 0xFC, 0x2F, 0x00, 0xA6, 0xFD,
+ 0x2F, 0xFB, 0x30, 0x00, 0x4A, 0xFD, 0x2C, 0xFA,
+ 0x20, 0x00, 0x33, 0x00, 0x2E, 0x00, 0x20, 0x00,
+ 0x99, 0x00, 0x2E, 0x00, 0x20, 0x00, 0xFF, 0x00,
+ 0x2E, 0x00, 0x20, 0x00, 0x65, 0x01, 0x2E, 0x00,
+ 0x23, 0x00, 0xCB, 0x01, 0x3D, 0x00, 0x25, 0x00,
+ 0x31, 0x02, 0x4A, 0x00, 0x27, 0x00, 0x97, 0x02,
+ 0x5A, 0x00, 0x29, 0x00, 0xFD, 0x02, 0x6D, 0x00,
+ 0x20, 0x00, 0xCD, 0xFF, 0x2E, 0x00, 0x20, 0x00,
+ 0x67, 0xFF, 0x2E, 0x00, 0x20, 0x00, 0x01, 0xFF,
+ 0x2E, 0x00, 0x20, 0x00, 0x9B, 0xFE, 0x2E, 0x00,
+ 0x23, 0x00, 0x35, 0xFE, 0x3D, 0x00, 0x25, 0x00,
+ 0xCF, 0xFD, 0x4A, 0x00, 0x27, 0x00, 0x69, 0xFD,
+ 0x5A, 0x00, 0x29, 0x00, 0x03, 0xFD, 0x6D, 0x00,
+ 0x20, 0x00, 0x33, 0x00, 0x8A, 0x00, 0x20, 0x00,
+ 0x99, 0x00, 0x8A, 0x00, 0x20, 0x00, 0xFF, 0x00,
+ 0x8A, 0x00, 0x20, 0x00, 0x65, 0x01, 0x8A, 0x00,
+ 0x23, 0x00, 0xCB, 0x01, 0xB8, 0x00, 0x25, 0x00,
+ 0x31, 0x02, 0xDF, 0x00, 0x27, 0x00, 0x97, 0x02,
+ 0x0F, 0x01, 0x29, 0x00, 0xFD, 0x02, 0x48, 0x01,
+ 0x20, 0x00, 0xCD, 0xFF, 0x8A, 0x00, 0x20, 0x00,
+ 0x67, 0xFF, 0x8A, 0x00, 0x20, 0x00, 0x01, 0xFF,
+ 0x8A, 0x00, 0x20, 0x00, 0x9B, 0xFE, 0x8A, 0x00,
+ 0x23, 0x00, 0x35, 0xFE, 0xB8, 0x00, 0x25, 0x00,
+ 0xCF, 0xFD, 0xDF, 0x00, 0x27, 0x00, 0x69, 0xFD,
+ 0x0F, 0x01, 0x29, 0x00, 0x03, 0xFD, 0x48, 0x01,
+ 0x20, 0x00, 0x33, 0x00, 0xE7, 0x00, 0x20, 0x00,
+ 0x99, 0x00, 0xE7, 0x00, 0x20, 0x00, 0xFF, 0x00,
+ 0xE7, 0x00, 0x20, 0x00, 0x65, 0x01, 0xE7, 0x00,
+ 0x23, 0x00, 0xCB, 0x01, 0x34, 0x01, 0x25, 0x00,
+ 0x31, 0x02, 0x75, 0x01, 0x27, 0x00, 0x97, 0x02,
+ 0xC4, 0x01, 0x29, 0x00, 0xFD, 0x02, 0x23, 0x02,
+ 0x20, 0x00, 0xCD, 0xFF, 0xE7, 0x00, 0x20, 0x00,
+ 0x67, 0xFF, 0xE7, 0x00, 0x20, 0x00, 0x01, 0xFF,
+ 0xE7, 0x00, 0x20, 0x00, 0x9B, 0xFE, 0xE7, 0x00,
+ 0x23, 0x00, 0x35, 0xFE, 0x34, 0x01, 0x25, 0x00,
+ 0xCF, 0xFD, 0x75, 0x01, 0x27, 0x00, 0x69, 0xFD,
+ 0xC4, 0x01, 0x29, 0x00, 0x03, 0xFD, 0x23, 0x02,
+ 0x20, 0x00, 0x33, 0x00, 0x43, 0x01, 0x20, 0x00,
+ 0x99, 0x00, 0x43, 0x01, 0x20, 0x00, 0xFF, 0x00,
+ 0x43, 0x01, 0x20, 0x00, 0x65, 0x01, 0x43, 0x01,
+ 0x23, 0x00, 0xCB, 0x01, 0xAF, 0x01, 0x25, 0x00,
+ 0x31, 0x02, 0x0A, 0x02, 0x27, 0x00, 0x97, 0x02,
+ 0x79, 0x02, 0x29, 0x00, 0xFD, 0x02, 0xFE, 0x02,
+ 0x20, 0x00, 0xCD, 0xFF, 0x43, 0x01, 0x20, 0x00,
+ 0x67, 0xFF, 0x43, 0x01, 0x20, 0x00, 0x01, 0xFF,
+ 0x43, 0x01, 0x20, 0x00, 0x9B, 0xFE, 0x43, 0x01,
+ 0x23, 0x00, 0x35, 0xFE, 0xAF, 0x01, 0x25, 0x00,
+ 0xCF, 0xFD, 0x0A, 0x02, 0x27, 0x00, 0x69, 0xFD,
+ 0x79, 0x02, 0x29, 0x00, 0x03, 0xFD, 0xFE, 0x02,
+ 0x23, 0x00, 0x33, 0x00, 0xA1, 0x01, 0x23, 0x00,
+ 0x99, 0x00, 0xA1, 0x01, 0x23, 0x00, 0xFF, 0x00,
+ 0xA1, 0x01, 0x23, 0x00, 0x65, 0x01, 0xA1, 0x01,
+ 0x26, 0x00, 0xCB, 0x01, 0x2B, 0x02, 0x28, 0x00,
+ 0x31, 0x02, 0xA0, 0x02, 0x2A, 0x00, 0x97, 0x02,
+ 0x2E, 0x03, 0x2C, 0x00, 0xFD, 0x02, 0xD9, 0x03,
+ 0x23, 0x00, 0xCD, 0xFF, 0xA1, 0x01, 0x23, 0x00,
+ 0x67, 0xFF, 0xA1, 0x01, 0x23, 0x00, 0x01, 0xFF,
+ 0xA1, 0x01, 0x23, 0x00, 0x9B, 0xFE, 0xA1, 0x01,
+ 0x26, 0x00, 0x35, 0xFE, 0x2B, 0x02, 0x28, 0x00,
+ 0xCF, 0xFD, 0xA0, 0x02, 0x2A, 0x00, 0x69, 0xFD,
+ 0x2E, 0x03, 0x2C, 0x00, 0x03, 0xFD, 0xD9, 0x03,
+ 0x25, 0x00, 0x33, 0x00, 0xFD, 0x01, 0x25, 0x00,
+ 0x99, 0x00, 0xFD, 0x01, 0x25, 0x00, 0xFF, 0x00,
+ 0xFD, 0x01, 0x25, 0x00, 0x65, 0x01, 0xFD, 0x01,
+ 0x28, 0x00, 0xCB, 0x01, 0xA6, 0x02, 0x2A, 0x00,
+ 0x31, 0x02, 0x35, 0x03, 0x2C, 0x00, 0x97, 0x02,
+ 0xE3, 0x03, 0x2E, 0x00, 0xFD, 0x02, 0xB4, 0x04,
+ 0x25, 0x00, 0xCD, 0xFF, 0xFD, 0x01, 0x25, 0x00,
+ 0x67, 0xFF, 0xFD, 0x01, 0x25, 0x00, 0x01, 0xFF,
+ 0xFD, 0x01, 0x25, 0x00, 0x9B, 0xFE, 0xFD, 0x01,
+ 0x28, 0x00, 0x35, 0xFE, 0xA6, 0x02, 0x2A, 0x00,
+ 0xCF, 0xFD, 0x35, 0x03, 0x2C, 0x00, 0x69, 0xFD,
+ 0xE3, 0x03, 0x2E, 0x00, 0x03, 0xFD, 0xB4, 0x04,
+ 0x27, 0x00, 0x33, 0x00, 0x5A, 0x02, 0x27, 0x00,
+ 0x99, 0x00, 0x5A, 0x02, 0x27, 0x00, 0xFF, 0x00,
+ 0x5A, 0x02, 0x27, 0x00, 0x65, 0x01, 0x5A, 0x02,
+ 0x2A, 0x00, 0xCB, 0x01, 0x22, 0x03, 0x2C, 0x00,
+ 0x31, 0x02, 0xCB, 0x03, 0x2E, 0x00, 0x97, 0x02,
+ 0x98, 0x04, 0x30, 0x00, 0xFD, 0x02, 0x8F, 0x05,
+ 0x27, 0x00, 0xCD, 0xFF, 0x5A, 0x02, 0x27, 0x00,
+ 0x67, 0xFF, 0x5A, 0x02, 0x27, 0x00, 0x01, 0xFF,
+ 0x5A, 0x02, 0x27, 0x00, 0x9B, 0xFE, 0x5A, 0x02,
+ 0x2A, 0x00, 0x35, 0xFE, 0x22, 0x03, 0x2C, 0x00,
+ 0xCF, 0xFD, 0xCB, 0x03, 0x2E, 0x00, 0x69, 0xFD,
+ 0x98, 0x04, 0x30, 0x00, 0x03, 0xFD, 0x8F, 0x05,
+ 0x29, 0x00, 0x33, 0x00, 0xB6, 0x02, 0x29, 0x00,
+ 0x99, 0x00, 0xB6, 0x02, 0x29, 0x00, 0xFF, 0x00,
+ 0xB6, 0x02, 0x29, 0x00, 0x65, 0x01, 0xB6, 0x02,
+ 0x2C, 0x00, 0xCB, 0x01, 0x9D, 0x03, 0x2E, 0x00,
+ 0x31, 0x02, 0x60, 0x04, 0x30, 0x00, 0x97, 0x02,
+ 0x4D, 0x05, 0x30, 0x00, 0xFD, 0x02, 0x6A, 0x06,
+ 0x29, 0x00, 0xCD, 0xFF, 0xB6, 0x02, 0x29, 0x00,
+ 0x67, 0xFF, 0xB6, 0x02, 0x29, 0x00, 0x01, 0xFF,
+ 0xB6, 0x02, 0x29, 0x00, 0x9B, 0xFE, 0xB6, 0x02,
+ 0x2C, 0x00, 0x35, 0xFE, 0x9D, 0x03, 0x2E, 0x00,
+ 0xCF, 0xFD, 0x60, 0x04, 0x30, 0x00, 0x69, 0xFD,
+ 0x4D, 0x05, 0x30, 0x00, 0x03, 0xFD, 0x6A, 0x06,
+ 0x20, 0x00, 0x33, 0x00, 0xD2, 0xFF, 0x20, 0x00,
+ 0x99, 0x00, 0xD2, 0xFF, 0x20, 0x00, 0xFF, 0x00,
+ 0xD2, 0xFF, 0x20, 0x00, 0x65, 0x01, 0xD2, 0xFF,
+ 0x23, 0x00, 0xCB, 0x01, 0xC3, 0xFF, 0x25, 0x00,
+ 0x31, 0x02, 0xB6, 0xFF, 0x27, 0x00, 0x97, 0x02,
+ 0xA6, 0xFF, 0x29, 0x00, 0xFD, 0x02, 0x93, 0xFF,
+ 0x20, 0x00, 0xCD, 0xFF, 0xD2, 0xFF, 0x20, 0x00,
+ 0x67, 0xFF, 0xD2, 0xFF, 0x20, 0x00, 0x01, 0xFF,
+ 0xD2, 0xFF, 0x20, 0x00, 0x9B, 0xFE, 0xD2, 0xFF,
+ 0x23, 0x00, 0x35, 0xFE, 0xC3, 0xFF, 0x25, 0x00,
+ 0xCF, 0xFD, 0xB6, 0xFF, 0x27, 0x00, 0x69, 0xFD,
+ 0xA6, 0xFF, 0x29, 0x00, 0x03, 0xFD, 0x93, 0xFF,
+ 0x20, 0x00, 0x33, 0x00, 0x76, 0xFF, 0x20, 0x00,
+ 0x99, 0x00, 0x76, 0xFF, 0x20, 0x00, 0xFF, 0x00,
+ 0x76, 0xFF, 0x20, 0x00, 0x65, 0x01, 0x76, 0xFF,
+ 0x23, 0x00, 0xCB, 0x01, 0x48, 0xFF, 0x25, 0x00,
+ 0x31, 0x02, 0x21, 0xFF, 0x27, 0x00, 0x97, 0x02,
+ 0xF1, 0xFE, 0x29, 0x00, 0xFD, 0x02, 0xB8, 0xFE,
+ 0x20, 0x00, 0xCD, 0xFF, 0x76, 0xFF, 0x20, 0x00,
+ 0x67, 0xFF, 0x76, 0xFF, 0x20, 0x00, 0x01, 0xFF,
+ 0x76, 0xFF, 0x20, 0x00, 0x9B, 0xFE, 0x76, 0xFF,
+ 0x23, 0x00, 0x35, 0xFE, 0x48, 0xFF, 0x25, 0x00,
+ 0xCF, 0xFD, 0x21, 0xFF, 0x27, 0x00, 0x69, 0xFD,
+ 0xF1, 0xFE, 0x29, 0x00, 0x03, 0xFD, 0xB8, 0xFE,
+ 0x20, 0x00, 0x33, 0x00, 0x19, 0xFF, 0x20, 0x00,
+ 0x99, 0x00, 0x19, 0xFF, 0x20, 0x00, 0xFF, 0x00,
+ 0x19, 0xFF, 0x20, 0x00, 0x65, 0x01, 0x19, 0xFF,
+ 0x23, 0x00, 0xCB, 0x01, 0xCC, 0xFE, 0x25, 0x00,
+ 0x31, 0x02, 0x8B, 0xFE, 0x27, 0x00, 0x97, 0x02,
+ 0x3C, 0xFE, 0x29, 0x00, 0xFD, 0x02, 0xDD, 0xFD,
+ 0x20, 0x00, 0xCD, 0xFF, 0x19, 0xFF, 0x20, 0x00,
+ 0x67, 0xFF, 0x19, 0xFF, 0x20, 0x00, 0x01, 0xFF,
+ 0x19, 0xFF, 0x20, 0x00, 0x9B, 0xFE, 0x19, 0xFF,
+ 0x23, 0x00, 0x35, 0xFE, 0xCC, 0xFE, 0x25, 0x00,
+ 0xCF, 0xFD, 0x8B, 0xFE, 0x27, 0x00, 0x69, 0xFD,
+ 0x3C, 0xFE, 0x29, 0x00, 0x03, 0xFD, 0xDD, 0xFD,
+ 0x20, 0x00, 0x33, 0x00, 0xBD, 0xFE, 0x20, 0x00,
+ 0x99, 0x00, 0xBD, 0xFE, 0x20, 0x00, 0xFF, 0x00,
+ 0xBD, 0xFE, 0x20, 0x00, 0x65, 0x01, 0xBD, 0xFE,
+ 0x23, 0x00, 0xCB, 0x01, 0x51, 0xFE, 0x25, 0x00,
+ 0x31, 0x02, 0xF6, 0xFD, 0x27, 0x00, 0x97, 0x02,
+ 0x87, 0xFD, 0x29, 0x00, 0xFD, 0x02, 0x02, 0xFD,
+ 0x20, 0x00, 0xCD, 0xFF, 0xBD, 0xFE, 0x20, 0x00,
+ 0x67, 0xFF, 0xBD, 0xFE, 0x20, 0x00, 0x01, 0xFF,
+ 0xBD, 0xFE, 0x20, 0x00, 0x9B, 0xFE, 0xBD, 0xFE,
+ 0x23, 0x00, 0x35, 0xFE, 0x51, 0xFE, 0x25, 0x00,
+ 0xCF, 0xFD, 0xF6, 0xFD, 0x27, 0x00, 0x69, 0xFD,
+ 0x87, 0xFD, 0x29, 0x00, 0x03, 0xFD, 0x02, 0xFD,
+ 0x23, 0x00, 0x33, 0x00, 0x5F, 0xFE, 0x23, 0x00,
+ 0x99, 0x00, 0x5F, 0xFE, 0x23, 0x00, 0xFF, 0x00,
+ 0x5F, 0xFE, 0x23, 0x00, 0x65, 0x01, 0x5F, 0xFE,
+ 0x26, 0x00, 0xCB, 0x01, 0xD5, 0xFD, 0x28, 0x00,
+ 0x31, 0x02, 0x60, 0xFD, 0x2A, 0x00, 0x97, 0x02,
+ 0xD2, 0xFC, 0x2C, 0x00, 0xFD, 0x02, 0x27, 0xFC,
+ 0x23, 0x00, 0xCD, 0xFF, 0x5F, 0xFE, 0x23, 0x00,
+ 0x67, 0xFF, 0x5F, 0xFE, 0x23, 0x00, 0x01, 0xFF,
+ 0x5F, 0xFE, 0x23, 0x00, 0x9B, 0xFE, 0x5F, 0xFE,
+ 0x26, 0x00, 0x35, 0xFE, 0xD5, 0xFD, 0x28, 0x00,
+ 0xCF, 0xFD, 0x60, 0xFD, 0x2A, 0x00, 0x69, 0xFD,
+ 0xD2, 0xFC, 0x2C, 0x00, 0x03, 0xFD, 0x27, 0xFC,
+ 0x25, 0x00, 0x33, 0x00, 0x03, 0xFE, 0x25, 0x00,
+ 0x99, 0x00, 0x03, 0xFE, 0x25, 0x00, 0xFF, 0x00,
+ 0x03, 0xFE, 0x25, 0x00, 0x65, 0x01, 0x03, 0xFE,
+ 0x28, 0x00, 0xCB, 0x01, 0x5A, 0xFD, 0x2A, 0x00,
+ 0x31, 0x02, 0xCB, 0xFC, 0x2C, 0x00, 0x97, 0x02,
+ 0x1D, 0xFC, 0x2E, 0x00, 0xFD, 0x02, 0x4C, 0xFB,
+ 0x25, 0x00, 0xCD, 0xFF, 0x03, 0xFE, 0x25, 0x00,
+ 0x67, 0xFF, 0x03, 0xFE, 0x25, 0x00, 0x01, 0xFF,
+ 0x03, 0xFE, 0x25, 0x00, 0x9B, 0xFE, 0x03, 0xFE,
+ 0x28, 0x00, 0x35, 0xFE, 0x5A, 0xFD, 0x2A, 0x00,
+ 0xCF, 0xFD, 0xCB, 0xFC, 0x2C, 0x00, 0x69, 0xFD,
+ 0x1D, 0xFC, 0x2E, 0x00, 0x03, 0xFD, 0x4C, 0xFB,
+ 0x27, 0x00, 0x33, 0x00, 0xA6, 0xFD, 0x27, 0x00,
+ 0x99, 0x00, 0xA6, 0xFD, 0x27, 0x00, 0xFF, 0x00,
+ 0xA6, 0xFD, 0x27, 0x00, 0x65, 0x01, 0xA6, 0xFD,
+ 0x2A, 0x00, 0xCB, 0x01, 0xDE, 0xFC, 0x2C, 0x00,
+ 0x31, 0x02, 0x35, 0xFC, 0x2E, 0x00, 0x97, 0x02,
+ 0x68, 0xFB, 0x30, 0x00, 0xFD, 0x02, 0x71, 0xFA,
+ 0x27, 0x00, 0xCD, 0xFF, 0xA6, 0xFD, 0x27, 0x00,
+ 0x67, 0xFF, 0xA6, 0xFD, 0x27, 0x00, 0x01, 0xFF,
+ 0xA6, 0xFD, 0x27, 0x00, 0x9B, 0xFE, 0xA6, 0xFD,
+ 0x2A, 0x00, 0x35, 0xFE, 0xDE, 0xFC, 0x2C, 0x00,
+ 0xCF, 0xFD, 0x35, 0xFC, 0x2E, 0x00, 0x69, 0xFD,
+ 0x68, 0xFB, 0x30, 0x00, 0x03, 0xFD, 0x71, 0xFA,
+ 0x29, 0x00, 0x33, 0x00, 0x4A, 0xFD, 0x29, 0x00,
+ 0x99, 0x00, 0x4A, 0xFD, 0x29, 0x00, 0xFF, 0x00,
+ 0x4A, 0xFD, 0x29, 0x00, 0x65, 0x01, 0x4A, 0xFD,
+ 0x2C, 0x00, 0xCB, 0x01, 0x63, 0xFC, 0x2E, 0x00,
+ 0x31, 0x02, 0xA0, 0xFB, 0x30, 0x00, 0x97, 0x02,
+ 0xB3, 0xFA, 0x30, 0x00, 0xFD, 0x02, 0x96, 0xF9,
+ 0x29, 0x00, 0xCD, 0xFF, 0x4A, 0xFD, 0x29, 0x00,
+ 0x67, 0xFF, 0x4A, 0xFD, 0x29, 0x00, 0x01, 0xFF,
+ 0x4A, 0xFD, 0x29, 0x00, 0x9B, 0xFE, 0x4A, 0xFD,
+ 0x2C, 0x00, 0x35, 0xFE, 0x63, 0xFC, 0x2E, 0x00,
+ 0xCF, 0xFD, 0xA0, 0xFB, 0x30, 0x00, 0x69, 0xFD,
+ 0xB3, 0xFA, 0x30, 0x00, 0x03, 0xFD, 0x96, 0xF9,
+ 0x21, 0x00, 0x38, 0x00, 0x33, 0x00, 0x21, 0x00,
+ 0xA8, 0x00, 0x33, 0x00, 0x21, 0x00, 0x18, 0x01,
+ 0x33, 0x00, 0x21, 0x00, 0x88, 0x01, 0x33, 0x00,
+ 0x24, 0x00, 0xF9, 0x01, 0x44, 0x00, 0x26, 0x00,
+ 0x69, 0x02, 0x52, 0x00, 0x28, 0x00, 0xD9, 0x02,
+ 0x63, 0x00, 0x2A, 0x00, 0x49, 0x03, 0x78, 0x00,
+ 0x21, 0x00, 0xC8, 0xFF, 0x33, 0x00, 0x21, 0x00,
+ 0x58, 0xFF, 0x33, 0x00, 0x21, 0x00, 0xE8, 0xFE,
+ 0x33, 0x00, 0x21, 0x00, 0x78, 0xFE, 0x33, 0x00,
+ 0x24, 0x00, 0x07, 0xFE, 0x44, 0x00, 0x26, 0x00,
+ 0x97, 0xFD, 0x52, 0x00, 0x28, 0x00, 0x27, 0xFD,
+ 0x63, 0x00, 0x2A, 0x00, 0xB7, 0xFC, 0x78, 0x00,
+ 0x21, 0x00, 0x38, 0x00, 0x99, 0x00, 0x21, 0x00,
+ 0xA8, 0x00, 0x99, 0x00, 0x21, 0x00, 0x18, 0x01,
+ 0x99, 0x00, 0x21, 0x00, 0x88, 0x01, 0x99, 0x00,
+ 0x24, 0x00, 0xF9, 0x01, 0xCC, 0x00, 0x26, 0x00,
+ 0x69, 0x02, 0xF6, 0x00, 0x28, 0x00, 0xD9, 0x02,
+ 0x2A, 0x01, 0x2A, 0x00, 0x49, 0x03, 0x68, 0x01,
+ 0x21, 0x00, 0xC8, 0xFF, 0x99, 0x00, 0x21, 0x00,
+ 0x58, 0xFF, 0x99, 0x00, 0x21, 0x00, 0xE8, 0xFE,
+ 0x99, 0x00, 0x21, 0x00, 0x78, 0xFE, 0x99, 0x00,
+ 0x24, 0x00, 0x07, 0xFE, 0xCC, 0x00, 0x26, 0x00,
+ 0x97, 0xFD, 0xF6, 0x00, 0x28, 0x00, 0x27, 0xFD,
+ 0x2A, 0x01, 0x2A, 0x00, 0xB7, 0xFC, 0x68, 0x01,
+ 0x21, 0x00, 0x38, 0x00, 0xFF, 0x00, 0x21, 0x00,
+ 0xA8, 0x00, 0xFF, 0x00, 0x21, 0x00, 0x18, 0x01,
+ 0xFF, 0x00, 0x21, 0x00, 0x88, 0x01, 0xFF, 0x00,
+ 0x24, 0x00, 0xF9, 0x01, 0x54, 0x01, 0x26, 0x00,
+ 0x69, 0x02, 0x9B, 0x01, 0x28, 0x00, 0xD9, 0x02,
+ 0xF1, 0x01, 0x2A, 0x00, 0x49, 0x03, 0x59, 0x02,
+ 0x21, 0x00, 0xC8, 0xFF, 0xFF, 0x00, 0x21, 0x00,
+ 0x58, 0xFF, 0xFF, 0x00, 0x21, 0x00, 0xE8, 0xFE,
+ 0xFF, 0x00, 0x21, 0x00, 0x78, 0xFE, 0xFF, 0x00,
+ 0x24, 0x00, 0x07, 0xFE, 0x54, 0x01, 0x26, 0x00,
+ 0x97, 0xFD, 0x9B, 0x01, 0x28, 0x00, 0x27, 0xFD,
+ 0xF1, 0x01, 0x2A, 0x00, 0xB7, 0xFC, 0x59, 0x02,
+ 0x21, 0x00, 0x38, 0x00, 0x65, 0x01, 0x21, 0x00,
+ 0xA8, 0x00, 0x65, 0x01, 0x21, 0x00, 0x18, 0x01,
+ 0x65, 0x01, 0x21, 0x00, 0x88, 0x01, 0x65, 0x01,
+ 0x24, 0x00, 0xF9, 0x01, 0xDC, 0x01, 0x26, 0x00,
+ 0x69, 0x02, 0x3F, 0x02, 0x28, 0x00, 0xD9, 0x02,
+ 0xB8, 0x02, 0x2A, 0x00, 0x49, 0x03, 0x49, 0x03,
+ 0x21, 0x00, 0xC8, 0xFF, 0x65, 0x01, 0x21, 0x00,
+ 0x58, 0xFF, 0x65, 0x01, 0x21, 0x00, 0xE8, 0xFE,
+ 0x65, 0x01, 0x21, 0x00, 0x78, 0xFE, 0x65, 0x01,
+ 0x24, 0x00, 0x07, 0xFE, 0xDC, 0x01, 0x26, 0x00,
+ 0x97, 0xFD, 0x3F, 0x02, 0x28, 0x00, 0x27, 0xFD,
+ 0xB8, 0x02, 0x2A, 0x00, 0xB7, 0xFC, 0x49, 0x03,
+ 0x24, 0x00, 0x38, 0x00, 0xCB, 0x01, 0x24, 0x00,
+ 0xA8, 0x00, 0xCB, 0x01, 0x24, 0x00, 0x18, 0x01,
+ 0xCB, 0x01, 0x24, 0x00, 0x88, 0x01, 0xCB, 0x01,
+ 0x27, 0x00, 0xF9, 0x01, 0x64, 0x02, 0x29, 0x00,
+ 0x69, 0x02, 0xE4, 0x02, 0x2B, 0x00, 0xD9, 0x02,
+ 0x7F, 0x03, 0x2D, 0x00, 0x49, 0x03, 0x3B, 0x04,
+ 0x24, 0x00, 0xC8, 0xFF, 0xCB, 0x01, 0x24, 0x00,
+ 0x58, 0xFF, 0xCB, 0x01, 0x24, 0x00, 0xE8, 0xFE,
+ 0xCB, 0x01, 0x24, 0x00, 0x78, 0xFE, 0xCB, 0x01,
+ 0x27, 0x00, 0x07, 0xFE, 0x64, 0x02, 0x29, 0x00,
+ 0x97, 0xFD, 0xE4, 0x02, 0x2B, 0x00, 0x27, 0xFD,
+ 0x7F, 0x03, 0x2D, 0x00, 0xB7, 0xFC, 0x3B, 0x04,
+ 0x26, 0x00, 0x38, 0x00, 0x31, 0x02, 0x26, 0x00,
+ 0xA8, 0x00, 0x31, 0x02, 0x26, 0x00, 0x18, 0x01,
+ 0x31, 0x02, 0x26, 0x00, 0x88, 0x01, 0x31, 0x02,
+ 0x29, 0x00, 0xF9, 0x01, 0xEC, 0x02, 0x2B, 0x00,
+ 0x69, 0x02, 0x88, 0x03, 0x2D, 0x00, 0xD9, 0x02,
+ 0x46, 0x04, 0x2F, 0x00, 0x49, 0x03, 0x2B, 0x05,
+ 0x26, 0x00, 0xC8, 0xFF, 0x31, 0x02, 0x26, 0x00,
+ 0x58, 0xFF, 0x31, 0x02, 0x26, 0x00, 0xE8, 0xFE,
+ 0x31, 0x02, 0x26, 0x00, 0x78, 0xFE, 0x31, 0x02,
+ 0x29, 0x00, 0x07, 0xFE, 0xEC, 0x02, 0x2B, 0x00,
+ 0x97, 0xFD, 0x88, 0x03, 0x2D, 0x00, 0x27, 0xFD,
+ 0x46, 0x04, 0x2F, 0x00, 0xB7, 0xFC, 0x2B, 0x05,
+ 0x28, 0x00, 0x38, 0x00, 0x97, 0x02, 0x28, 0x00,
+ 0xA8, 0x00, 0x97, 0x02, 0x28, 0x00, 0x18, 0x01,
+ 0x97, 0x02, 0x28, 0x00, 0x88, 0x01, 0x97, 0x02,
+ 0x2B, 0x00, 0xF9, 0x01, 0x74, 0x03, 0x2D, 0x00,
+ 0x69, 0x02, 0x2D, 0x04, 0x2F, 0x00, 0xD9, 0x02,
+ 0x0D, 0x05, 0x30, 0x00, 0x49, 0x03, 0x1C, 0x06,
+ 0x28, 0x00, 0xC8, 0xFF, 0x97, 0x02, 0x28, 0x00,
+ 0x58, 0xFF, 0x97, 0x02, 0x28, 0x00, 0xE8, 0xFE,
+ 0x97, 0x02, 0x28, 0x00, 0x78, 0xFE, 0x97, 0x02,
+ 0x2B, 0x00, 0x07, 0xFE, 0x74, 0x03, 0x2D, 0x00,
+ 0x97, 0xFD, 0x2D, 0x04, 0x2F, 0x00, 0x27, 0xFD,
+ 0x0D, 0x05, 0x30, 0x00, 0xB7, 0xFC, 0x1C, 0x06,
+ 0x2A, 0x00, 0x38, 0x00, 0xFD, 0x02, 0x2A, 0x00,
+ 0xA8, 0x00, 0xFD, 0x02, 0x2A, 0x00, 0x18, 0x01,
+ 0xFD, 0x02, 0x2A, 0x00, 0x88, 0x01, 0xFD, 0x02,
+ 0x2D, 0x00, 0xF9, 0x01, 0xFC, 0x03, 0x2F, 0x00,
+ 0x69, 0x02, 0xD1, 0x04, 0x30, 0x00, 0xD9, 0x02,
+ 0xD4, 0x05, 0x30, 0x00, 0x49, 0x03, 0x0C, 0x07,
+ 0x2A, 0x00, 0xC8, 0xFF, 0xFD, 0x02, 0x2A, 0x00,
+ 0x58, 0xFF, 0xFD, 0x02, 0x2A, 0x00, 0xE8, 0xFE,
+ 0xFD, 0x02, 0x2A, 0x00, 0x78, 0xFE, 0xFD, 0x02,
+ 0x2D, 0x00, 0x07, 0xFE, 0xFC, 0x03, 0x2F, 0x00,
+ 0x97, 0xFD, 0xD1, 0x04, 0x30, 0x00, 0x27, 0xFD,
+ 0xD4, 0x05, 0x30, 0x00, 0xB7, 0xFC, 0x0C, 0x07,
+ 0x21, 0x00, 0x38, 0x00, 0xCD, 0xFF, 0x21, 0x00,
+ 0xA8, 0x00, 0xCD, 0xFF, 0x21, 0x00, 0x18, 0x01,
+ 0xCD, 0xFF, 0x21, 0x00, 0x88, 0x01, 0xCD, 0xFF,
+ 0x24, 0x00, 0xF9, 0x01, 0xBC, 0xFF, 0x26, 0x00,
+ 0x69, 0x02, 0xAE, 0xFF, 0x28, 0x00, 0xD9, 0x02,
+ 0x9D, 0xFF, 0x2A, 0x00, 0x49, 0x03, 0x88, 0xFF,
+ 0x21, 0x00, 0xC8, 0xFF, 0xCD, 0xFF, 0x21, 0x00,
+ 0x58, 0xFF, 0xCD, 0xFF, 0x21, 0x00, 0xE8, 0xFE,
+ 0xCD, 0xFF, 0x21, 0x00, 0x78, 0xFE, 0xCD, 0xFF,
+ 0x24, 0x00, 0x07, 0xFE, 0xBC, 0xFF, 0x26, 0x00,
+ 0x97, 0xFD, 0xAE, 0xFF, 0x28, 0x00, 0x27, 0xFD,
+ 0x9D, 0xFF, 0x2A, 0x00, 0xB7, 0xFC, 0x88, 0xFF,
+ 0x21, 0x00, 0x38, 0x00, 0x67, 0xFF, 0x21, 0x00,
+ 0xA8, 0x00, 0x67, 0xFF, 0x21, 0x00, 0x18, 0x01,
+ 0x67, 0xFF, 0x21, 0x00, 0x88, 0x01, 0x67, 0xFF,
+ 0x24, 0x00, 0xF9, 0x01, 0x34, 0xFF, 0x26, 0x00,
+ 0x69, 0x02, 0x0A, 0xFF, 0x28, 0x00, 0xD9, 0x02,
+ 0xD6, 0xFE, 0x2A, 0x00, 0x49, 0x03, 0x98, 0xFE,
+ 0x21, 0x00, 0xC8, 0xFF, 0x67, 0xFF, 0x21, 0x00,
+ 0x58, 0xFF, 0x67, 0xFF, 0x21, 0x00, 0xE8, 0xFE,
+ 0x67, 0xFF, 0x21, 0x00, 0x78, 0xFE, 0x67, 0xFF,
+ 0x24, 0x00, 0x07, 0xFE, 0x34, 0xFF, 0x26, 0x00,
+ 0x97, 0xFD, 0x0A, 0xFF, 0x28, 0x00, 0x27, 0xFD,
+ 0xD6, 0xFE, 0x2A, 0x00, 0xB7, 0xFC, 0x98, 0xFE,
+ 0x21, 0x00, 0x38, 0x00, 0x01, 0xFF, 0x21, 0x00,
+ 0xA8, 0x00, 0x01, 0xFF, 0x21, 0x00, 0x18, 0x01,
+ 0x01, 0xFF, 0x21, 0x00, 0x88, 0x01, 0x01, 0xFF,
+ 0x24, 0x00, 0xF9, 0x01, 0xAC, 0xFE, 0x26, 0x00,
+ 0x69, 0x02, 0x65, 0xFE, 0x28, 0x00, 0xD9, 0x02,
+ 0x0F, 0xFE, 0x2A, 0x00, 0x49, 0x03, 0xA7, 0xFD,
+ 0x21, 0x00, 0xC8, 0xFF, 0x01, 0xFF, 0x21, 0x00,
+ 0x58, 0xFF, 0x01, 0xFF, 0x21, 0x00, 0xE8, 0xFE,
+ 0x01, 0xFF, 0x21, 0x00, 0x78, 0xFE, 0x01, 0xFF,
+ 0x24, 0x00, 0x07, 0xFE, 0xAC, 0xFE, 0x26, 0x00,
+ 0x97, 0xFD, 0x65, 0xFE, 0x28, 0x00, 0x27, 0xFD,
+ 0x0F, 0xFE, 0x2A, 0x00, 0xB7, 0xFC, 0xA7, 0xFD,
+ 0x21, 0x00, 0x38, 0x00, 0x9B, 0xFE, 0x21, 0x00,
+ 0xA8, 0x00, 0x9B, 0xFE, 0x21, 0x00, 0x18, 0x01,
+ 0x9B, 0xFE, 0x21, 0x00, 0x88, 0x01, 0x9B, 0xFE,
+ 0x24, 0x00, 0xF9, 0x01, 0x24, 0xFE, 0x26, 0x00,
+ 0x69, 0x02, 0xC1, 0xFD, 0x28, 0x00, 0xD9, 0x02,
+ 0x48, 0xFD, 0x2A, 0x00, 0x49, 0x03, 0xB7, 0xFC,
+ 0x21, 0x00, 0xC8, 0xFF, 0x9B, 0xFE, 0x21, 0x00,
+ 0x58, 0xFF, 0x9B, 0xFE, 0x21, 0x00, 0xE8, 0xFE,
+ 0x9B, 0xFE, 0x21, 0x00, 0x78, 0xFE, 0x9B, 0xFE,
+ 0x24, 0x00, 0x07, 0xFE, 0x24, 0xFE, 0x26, 0x00,
+ 0x97, 0xFD, 0xC1, 0xFD, 0x28, 0x00, 0x27, 0xFD,
+ 0x48, 0xFD, 0x2A, 0x00, 0xB7, 0xFC, 0xB7, 0xFC,
+ 0x24, 0x00, 0x38, 0x00, 0x35, 0xFE, 0x24, 0x00,
+ 0xA8, 0x00, 0x35, 0xFE, 0x24, 0x00, 0x18, 0x01,
+ 0x35, 0xFE, 0x24, 0x00, 0x88, 0x01, 0x35, 0xFE,
+ 0x27, 0x00, 0xF9, 0x01, 0x9C, 0xFD, 0x29, 0x00,
+ 0x69, 0x02, 0x1C, 0xFD, 0x2B, 0x00, 0xD9, 0x02,
+ 0x81, 0xFC, 0x2D, 0x00, 0x49, 0x03, 0xC5, 0xFB,
+ 0x24, 0x00, 0xC8, 0xFF, 0x35, 0xFE, 0x24, 0x00,
+ 0x58, 0xFF, 0x35, 0xFE, 0x24, 0x00, 0xE8, 0xFE,
+ 0x35, 0xFE, 0x24, 0x00, 0x78, 0xFE, 0x35, 0xFE,
+ 0x27, 0x00, 0x07, 0xFE, 0x9C, 0xFD, 0x29, 0x00,
+ 0x97, 0xFD, 0x1C, 0xFD, 0x2B, 0x00, 0x27, 0xFD,
+ 0x81, 0xFC, 0x2D, 0x00, 0xB7, 0xFC, 0xC5, 0xFB,
+ 0x26, 0x00, 0x38, 0x00, 0xCF, 0xFD, 0x26, 0x00,
+ 0xA8, 0x00, 0xCF, 0xFD, 0x26, 0x00, 0x18, 0x01,
+ 0xCF, 0xFD, 0x26, 0x00, 0x88, 0x01, 0xCF, 0xFD,
+ 0x29, 0x00, 0xF9, 0x01, 0x14, 0xFD, 0x2B, 0x00,
+ 0x69, 0x02, 0x78, 0xFC, 0x2D, 0x00, 0xD9, 0x02,
+ 0xBA, 0xFB, 0x2F, 0x00, 0x49, 0x03, 0xD5, 0xFA,
+ 0x26, 0x00, 0xC8, 0xFF, 0xCF, 0xFD, 0x26, 0x00,
+ 0x58, 0xFF, 0xCF, 0xFD, 0x26, 0x00, 0xE8, 0xFE,
+ 0xCF, 0xFD, 0x26, 0x00, 0x78, 0xFE, 0xCF, 0xFD,
+ 0x29, 0x00, 0x07, 0xFE, 0x14, 0xFD, 0x2B, 0x00,
+ 0x97, 0xFD, 0x78, 0xFC, 0x2D, 0x00, 0x27, 0xFD,
+ 0xBA, 0xFB, 0x2F, 0x00, 0xB7, 0xFC, 0xD5, 0xFA,
+ 0x28, 0x00, 0x38, 0x00, 0x69, 0xFD, 0x28, 0x00,
+ 0xA8, 0x00, 0x69, 0xFD, 0x28, 0x00, 0x18, 0x01,
+ 0x69, 0xFD, 0x28, 0x00, 0x88, 0x01, 0x69, 0xFD,
+ 0x2B, 0x00, 0xF9, 0x01, 0x8C, 0xFC, 0x2D, 0x00,
+ 0x69, 0x02, 0xD3, 0xFB, 0x2F, 0x00, 0xD9, 0x02,
+ 0xF3, 0xFA, 0x30, 0x00, 0x49, 0x03, 0xE4, 0xF9,
+ 0x28, 0x00, 0xC8, 0xFF, 0x69, 0xFD, 0x28, 0x00,
+ 0x58, 0xFF, 0x69, 0xFD, 0x28, 0x00, 0xE8, 0xFE,
+ 0x69, 0xFD, 0x28, 0x00, 0x78, 0xFE, 0x69, 0xFD,
+ 0x2B, 0x00, 0x07, 0xFE, 0x8C, 0xFC, 0x2D, 0x00,
+ 0x97, 0xFD, 0xD3, 0xFB, 0x2F, 0x00, 0x27, 0xFD,
+ 0xF3, 0xFA, 0x30, 0x00, 0xB7, 0xFC, 0xE4, 0xF9,
+ 0x2A, 0x00, 0x38, 0x00, 0x03, 0xFD, 0x2A, 0x00,
+ 0xA8, 0x00, 0x03, 0xFD, 0x2A, 0x00, 0x18, 0x01,
+ 0x03, 0xFD, 0x2A, 0x00, 0x88, 0x01, 0x03, 0xFD,
+ 0x2D, 0x00, 0xF9, 0x01, 0x04, 0xFC, 0x2F, 0x00,
+ 0x69, 0x02, 0x2F, 0xFB, 0x30, 0x00, 0xD9, 0x02,
+ 0x2C, 0xFA, 0x30, 0x00, 0x49, 0x03, 0xF4, 0xF8,
+ 0x2A, 0x00, 0xC8, 0xFF, 0x03, 0xFD, 0x2A, 0x00,
+ 0x58, 0xFF, 0x03, 0xFD, 0x2A, 0x00, 0xE8, 0xFE,
+ 0x03, 0xFD, 0x2A, 0x00, 0x78, 0xFE, 0x03, 0xFD,
+ 0x2D, 0x00, 0x07, 0xFE, 0x04, 0xFC, 0x2F, 0x00,
+ 0x97, 0xFD, 0x2F, 0xFB, 0x30, 0x00, 0x27, 0xFD,
+ 0x2C, 0xFA, 0x30, 0x00, 0xB7, 0xFC, 0xF4, 0xF8,
+ 0x22, 0x00, 0x3D, 0x00, 0x38, 0x00, 0x22, 0x00,
+ 0xB8, 0x00, 0x38, 0x00, 0x22, 0x00, 0x34, 0x01,
+ 0x38, 0x00, 0x22, 0x00, 0xAF, 0x01, 0x38, 0x00,
+ 0x25, 0x00, 0x2B, 0x02, 0x4A, 0x00, 0x27, 0x00,
+ 0xA6, 0x02, 0x5A, 0x00, 0x29, 0x00, 0x22, 0x03,
+ 0x6D, 0x00, 0x2B, 0x00, 0x9D, 0x03, 0x84, 0x00,
+ 0x22, 0x00, 0xC3, 0xFF, 0x38, 0x00, 0x22, 0x00,
+ 0x48, 0xFF, 0x38, 0x00, 0x22, 0x00, 0xCC, 0xFE,
+ 0x38, 0x00, 0x22, 0x00, 0x51, 0xFE, 0x38, 0x00,
+ 0x25, 0x00, 0xD5, 0xFD, 0x4A, 0x00, 0x27, 0x00,
+ 0x5A, 0xFD, 0x5A, 0x00, 0x29, 0x00, 0xDE, 0xFC,
+ 0x6D, 0x00, 0x2B, 0x00, 0x63, 0xFC, 0x84, 0x00,
+ 0x22, 0x00, 0x3D, 0x00, 0xA8, 0x00, 0x22, 0x00,
+ 0xB8, 0x00, 0xA8, 0x00, 0x22, 0x00, 0x34, 0x01,
+ 0xA8, 0x00, 0x22, 0x00, 0xAF, 0x01, 0xA8, 0x00,
+ 0x25, 0x00, 0x2B, 0x02, 0xDF, 0x00, 0x27, 0x00,
+ 0xA6, 0x02, 0x0F, 0x01, 0x29, 0x00, 0x22, 0x03,
+ 0x48, 0x01, 0x2B, 0x00, 0x9D, 0x03, 0x8D, 0x01,
+ 0x22, 0x00, 0xC3, 0xFF, 0xA8, 0x00, 0x22, 0x00,
+ 0x48, 0xFF, 0xA8, 0x00, 0x22, 0x00, 0xCC, 0xFE,
+ 0xA8, 0x00, 0x22, 0x00, 0x51, 0xFE, 0xA8, 0x00,
+ 0x25, 0x00, 0xD5, 0xFD, 0xDF, 0x00, 0x27, 0x00,
+ 0x5A, 0xFD, 0x0F, 0x01, 0x29, 0x00, 0xDE, 0xFC,
+ 0x48, 0x01, 0x2B, 0x00, 0x63, 0xFC, 0x8D, 0x01,
+ 0x22, 0x00, 0x3D, 0x00, 0x18, 0x01, 0x22, 0x00,
+ 0xB8, 0x00, 0x18, 0x01, 0x22, 0x00, 0x34, 0x01,
+ 0x18, 0x01, 0x22, 0x00, 0xAF, 0x01, 0x18, 0x01,
+ 0x25, 0x00, 0x2B, 0x02, 0x75, 0x01, 0x27, 0x00,
+ 0xA6, 0x02, 0xC4, 0x01, 0x29, 0x00, 0x22, 0x03,
+ 0x23, 0x02, 0x2B, 0x00, 0x9D, 0x03, 0x96, 0x02,
+ 0x22, 0x00, 0xC3, 0xFF, 0x18, 0x01, 0x22, 0x00,
+ 0x48, 0xFF, 0x18, 0x01, 0x22, 0x00, 0xCC, 0xFE,
+ 0x18, 0x01, 0x22, 0x00, 0x51, 0xFE, 0x18, 0x01,
+ 0x25, 0x00, 0xD5, 0xFD, 0x75, 0x01, 0x27, 0x00,
+ 0x5A, 0xFD, 0xC4, 0x01, 0x29, 0x00, 0xDE, 0xFC,
+ 0x23, 0x02, 0x2B, 0x00, 0x63, 0xFC, 0x96, 0x02,
+ 0x22, 0x00, 0x3D, 0x00, 0x88, 0x01, 0x22, 0x00,
+ 0xB8, 0x00, 0x88, 0x01, 0x22, 0x00, 0x34, 0x01,
+ 0x88, 0x01, 0x22, 0x00, 0xAF, 0x01, 0x88, 0x01,
+ 0x25, 0x00, 0x2B, 0x02, 0x0A, 0x02, 0x27, 0x00,
+ 0xA6, 0x02, 0x79, 0x02, 0x29, 0x00, 0x22, 0x03,
+ 0xFE, 0x02, 0x2B, 0x00, 0x9D, 0x03, 0x9F, 0x03,
+ 0x22, 0x00, 0xC3, 0xFF, 0x88, 0x01, 0x22, 0x00,
+ 0x48, 0xFF, 0x88, 0x01, 0x22, 0x00, 0xCC, 0xFE,
+ 0x88, 0x01, 0x22, 0x00, 0x51, 0xFE, 0x88, 0x01,
+ 0x25, 0x00, 0xD5, 0xFD, 0x0A, 0x02, 0x27, 0x00,
+ 0x5A, 0xFD, 0x79, 0x02, 0x29, 0x00, 0xDE, 0xFC,
+ 0xFE, 0x02, 0x2B, 0x00, 0x63, 0xFC, 0x9F, 0x03,
+ 0x25, 0x00, 0x3D, 0x00, 0xF9, 0x01, 0x25, 0x00,
+ 0xB8, 0x00, 0xF9, 0x01, 0x25, 0x00, 0x34, 0x01,
+ 0xF9, 0x01, 0x25, 0x00, 0xAF, 0x01, 0xF9, 0x01,
+ 0x28, 0x00, 0x2B, 0x02, 0xA0, 0x02, 0x2A, 0x00,
+ 0xA6, 0x02, 0x2E, 0x03, 0x2C, 0x00, 0x22, 0x03,
+ 0xD9, 0x03, 0x2E, 0x00, 0x9D, 0x03, 0xA8, 0x04,
+ 0x25, 0x00, 0xC3, 0xFF, 0xF9, 0x01, 0x25, 0x00,
+ 0x48, 0xFF, 0xF9, 0x01, 0x25, 0x00, 0xCC, 0xFE,
+ 0xF9, 0x01, 0x25, 0x00, 0x51, 0xFE, 0xF9, 0x01,
+ 0x28, 0x00, 0xD5, 0xFD, 0xA0, 0x02, 0x2A, 0x00,
+ 0x5A, 0xFD, 0x2E, 0x03, 0x2C, 0x00, 0xDE, 0xFC,
+ 0xD9, 0x03, 0x2E, 0x00, 0x63, 0xFC, 0xA8, 0x04,
+ 0x27, 0x00, 0x3D, 0x00, 0x69, 0x02, 0x27, 0x00,
+ 0xB8, 0x00, 0x69, 0x02, 0x27, 0x00, 0x34, 0x01,
+ 0x69, 0x02, 0x27, 0x00, 0xAF, 0x01, 0x69, 0x02,
+ 0x2A, 0x00, 0x2B, 0x02, 0x35, 0x03, 0x2C, 0x00,
+ 0xA6, 0x02, 0xE3, 0x03, 0x2E, 0x00, 0x22, 0x03,
+ 0xB4, 0x04, 0x30, 0x00, 0x9D, 0x03, 0xB1, 0x05,
+ 0x27, 0x00, 0xC3, 0xFF, 0x69, 0x02, 0x27, 0x00,
+ 0x48, 0xFF, 0x69, 0x02, 0x27, 0x00, 0xCC, 0xFE,
+ 0x69, 0x02, 0x27, 0x00, 0x51, 0xFE, 0x69, 0x02,
+ 0x2A, 0x00, 0xD5, 0xFD, 0x35, 0x03, 0x2C, 0x00,
+ 0x5A, 0xFD, 0xE3, 0x03, 0x2E, 0x00, 0xDE, 0xFC,
+ 0xB4, 0x04, 0x30, 0x00, 0x63, 0xFC, 0xB1, 0x05,
+ 0x29, 0x00, 0x3D, 0x00, 0xD9, 0x02, 0x29, 0x00,
+ 0xB8, 0x00, 0xD9, 0x02, 0x29, 0x00, 0x34, 0x01,
+ 0xD9, 0x02, 0x29, 0x00, 0xAF, 0x01, 0xD9, 0x02,
+ 0x2C, 0x00, 0x2B, 0x02, 0xCB, 0x03, 0x2E, 0x00,
+ 0xA6, 0x02, 0x98, 0x04, 0x30, 0x00, 0x22, 0x03,
+ 0x8F, 0x05, 0x30, 0x00, 0x9D, 0x03, 0xBA, 0x06,
+ 0x29, 0x00, 0xC3, 0xFF, 0xD9, 0x02, 0x29, 0x00,
+ 0x48, 0xFF, 0xD9, 0x02, 0x29, 0x00, 0xCC, 0xFE,
+ 0xD9, 0x02, 0x29, 0x00, 0x51, 0xFE, 0xD9, 0x02,
+ 0x2C, 0x00, 0xD5, 0xFD, 0xCB, 0x03, 0x2E, 0x00,
+ 0x5A, 0xFD, 0x98, 0x04, 0x30, 0x00, 0xDE, 0xFC,
+ 0x8F, 0x05, 0x30, 0x00, 0x63, 0xFC, 0xBA, 0x06,
+ 0x2B, 0x00, 0x3D, 0x00, 0x49, 0x03, 0x2B, 0x00,
+ 0xB8, 0x00, 0x49, 0x03, 0x2B, 0x00, 0x34, 0x01,
+ 0x49, 0x03, 0x2B, 0x00, 0xAF, 0x01, 0x49, 0x03,
+ 0x2E, 0x00, 0x2B, 0x02, 0x60, 0x04, 0x30, 0x00,
+ 0xA6, 0x02, 0x4D, 0x05, 0x30, 0x00, 0x22, 0x03,
+ 0x6A, 0x06, 0x30, 0x00, 0x9D, 0x03, 0xC3, 0x07,
+ 0x2B, 0x00, 0xC3, 0xFF, 0x49, 0x03, 0x2B, 0x00,
+ 0x48, 0xFF, 0x49, 0x03, 0x2B, 0x00, 0xCC, 0xFE,
+ 0x49, 0x03, 0x2B, 0x00, 0x51, 0xFE, 0x49, 0x03,
+ 0x2E, 0x00, 0xD5, 0xFD, 0x60, 0x04, 0x30, 0x00,
+ 0x5A, 0xFD, 0x4D, 0x05, 0x30, 0x00, 0xDE, 0xFC,
+ 0x6A, 0x06, 0x30, 0x00, 0x63, 0xFC, 0xC3, 0x07,
+ 0x22, 0x00, 0x3D, 0x00, 0xC8, 0xFF, 0x22, 0x00,
+ 0xB8, 0x00, 0xC8, 0xFF, 0x22, 0x00, 0x34, 0x01,
+ 0xC8, 0xFF, 0x22, 0x00, 0xAF, 0x01, 0xC8, 0xFF,
+ 0x25, 0x00, 0x2B, 0x02, 0xB6, 0xFF, 0x27, 0x00,
+ 0xA6, 0x02, 0xA6, 0xFF, 0x29, 0x00, 0x22, 0x03,
+ 0x93, 0xFF, 0x2B, 0x00, 0x9D, 0x03, 0x7C, 0xFF,
+ 0x22, 0x00, 0xC3, 0xFF, 0xC8, 0xFF, 0x22, 0x00,
+ 0x48, 0xFF, 0xC8, 0xFF, 0x22, 0x00, 0xCC, 0xFE,
+ 0xC8, 0xFF, 0x22, 0x00, 0x51, 0xFE, 0xC8, 0xFF,
+ 0x25, 0x00, 0xD5, 0xFD, 0xB6, 0xFF, 0x27, 0x00,
+ 0x5A, 0xFD, 0xA6, 0xFF, 0x29, 0x00, 0xDE, 0xFC,
+ 0x93, 0xFF, 0x2B, 0x00, 0x63, 0xFC, 0x7C, 0xFF,
+ 0x22, 0x00, 0x3D, 0x00, 0x58, 0xFF, 0x22, 0x00,
+ 0xB8, 0x00, 0x58, 0xFF, 0x22, 0x00, 0x34, 0x01,
+ 0x58, 0xFF, 0x22, 0x00, 0xAF, 0x01, 0x58, 0xFF,
+ 0x25, 0x00, 0x2B, 0x02, 0x21, 0xFF, 0x27, 0x00,
+ 0xA6, 0x02, 0xF1, 0xFE, 0x29, 0x00, 0x22, 0x03,
+ 0xB8, 0xFE, 0x2B, 0x00, 0x9D, 0x03, 0x73, 0xFE,
+ 0x22, 0x00, 0xC3, 0xFF, 0x58, 0xFF, 0x22, 0x00,
+ 0x48, 0xFF, 0x58, 0xFF, 0x22, 0x00, 0xCC, 0xFE,
+ 0x58, 0xFF, 0x22, 0x00, 0x51, 0xFE, 0x58, 0xFF,
+ 0x25, 0x00, 0xD5, 0xFD, 0x21, 0xFF, 0x27, 0x00,
+ 0x5A, 0xFD, 0xF1, 0xFE, 0x29, 0x00, 0xDE, 0xFC,
+ 0xB8, 0xFE, 0x2B, 0x00, 0x63, 0xFC, 0x73, 0xFE,
+ 0x22, 0x00, 0x3D, 0x00, 0xE8, 0xFE, 0x22, 0x00,
+ 0xB8, 0x00, 0xE8, 0xFE, 0x22, 0x00, 0x34, 0x01,
+ 0xE8, 0xFE, 0x22, 0x00, 0xAF, 0x01, 0xE8, 0xFE,
+ 0x25, 0x00, 0x2B, 0x02, 0x8B, 0xFE, 0x27, 0x00,
+ 0xA6, 0x02, 0x3C, 0xFE, 0x29, 0x00, 0x22, 0x03,
+ 0xDD, 0xFD, 0x2B, 0x00, 0x9D, 0x03, 0x6A, 0xFD,
+ 0x22, 0x00, 0xC3, 0xFF, 0xE8, 0xFE, 0x22, 0x00,
+ 0x48, 0xFF, 0xE8, 0xFE, 0x22, 0x00, 0xCC, 0xFE,
+ 0xE8, 0xFE, 0x22, 0x00, 0x51, 0xFE, 0xE8, 0xFE,
+ 0x25, 0x00, 0xD5, 0xFD, 0x8B, 0xFE, 0x27, 0x00,
+ 0x5A, 0xFD, 0x3C, 0xFE, 0x29, 0x00, 0xDE, 0xFC,
+ 0xDD, 0xFD, 0x2B, 0x00, 0x63, 0xFC, 0x6A, 0xFD,
+ 0x22, 0x00, 0x3D, 0x00, 0x78, 0xFE, 0x22, 0x00,
+ 0xB8, 0x00, 0x78, 0xFE, 0x22, 0x00, 0x34, 0x01,
+ 0x78, 0xFE, 0x22, 0x00, 0xAF, 0x01, 0x78, 0xFE,
+ 0x25, 0x00, 0x2B, 0x02, 0xF6, 0xFD, 0x27, 0x00,
+ 0xA6, 0x02, 0x87, 0xFD, 0x29, 0x00, 0x22, 0x03,
+ 0x02, 0xFD, 0x2B, 0x00, 0x9D, 0x03, 0x61, 0xFC,
+ 0x22, 0x00, 0xC3, 0xFF, 0x78, 0xFE, 0x22, 0x00,
+ 0x48, 0xFF, 0x78, 0xFE, 0x22, 0x00, 0xCC, 0xFE,
+ 0x78, 0xFE, 0x22, 0x00, 0x51, 0xFE, 0x78, 0xFE,
+ 0x25, 0x00, 0xD5, 0xFD, 0xF6, 0xFD, 0x27, 0x00,
+ 0x5A, 0xFD, 0x87, 0xFD, 0x29, 0x00, 0xDE, 0xFC,
+ 0x02, 0xFD, 0x2B, 0x00, 0x63, 0xFC, 0x61, 0xFC,
+ 0x25, 0x00, 0x3D, 0x00, 0x07, 0xFE, 0x25, 0x00,
+ 0xB8, 0x00, 0x07, 0xFE, 0x25, 0x00, 0x34, 0x01,
+ 0x07, 0xFE, 0x25, 0x00, 0xAF, 0x01, 0x07, 0xFE,
+ 0x28, 0x00, 0x2B, 0x02, 0x60, 0xFD, 0x2A, 0x00,
+ 0xA6, 0x02, 0xD2, 0xFC, 0x2C, 0x00, 0x22, 0x03,
+ 0x27, 0xFC, 0x2E, 0x00, 0x9D, 0x03, 0x58, 0xFB,
+ 0x25, 0x00, 0xC3, 0xFF, 0x07, 0xFE, 0x25, 0x00,
+ 0x48, 0xFF, 0x07, 0xFE, 0x25, 0x00, 0xCC, 0xFE,
+ 0x07, 0xFE, 0x25, 0x00, 0x51, 0xFE, 0x07, 0xFE,
+ 0x28, 0x00, 0xD5, 0xFD, 0x60, 0xFD, 0x2A, 0x00,
+ 0x5A, 0xFD, 0xD2, 0xFC, 0x2C, 0x00, 0xDE, 0xFC,
+ 0x27, 0xFC, 0x2E, 0x00, 0x63, 0xFC, 0x58, 0xFB,
+ 0x27, 0x00, 0x3D, 0x00, 0x97, 0xFD, 0x27, 0x00,
+ 0xB8, 0x00, 0x97, 0xFD, 0x27, 0x00, 0x34, 0x01,
+ 0x97, 0xFD, 0x27, 0x00, 0xAF, 0x01, 0x97, 0xFD,
+ 0x2A, 0x00, 0x2B, 0x02, 0xCB, 0xFC, 0x2C, 0x00,
+ 0xA6, 0x02, 0x1D, 0xFC, 0x2E, 0x00, 0x22, 0x03,
+ 0x4C, 0xFB, 0x30, 0x00, 0x9D, 0x03, 0x4F, 0xFA,
+ 0x27, 0x00, 0xC3, 0xFF, 0x97, 0xFD, 0x27, 0x00,
+ 0x48, 0xFF, 0x97, 0xFD, 0x27, 0x00, 0xCC, 0xFE,
+ 0x97, 0xFD, 0x27, 0x00, 0x51, 0xFE, 0x97, 0xFD,
+ 0x2A, 0x00, 0xD5, 0xFD, 0xCB, 0xFC, 0x2C, 0x00,
+ 0x5A, 0xFD, 0x1D, 0xFC, 0x2E, 0x00, 0xDE, 0xFC,
+ 0x4C, 0xFB, 0x30, 0x00, 0x63, 0xFC, 0x4F, 0xFA,
+ 0x29, 0x00, 0x3D, 0x00, 0x27, 0xFD, 0x29, 0x00,
+ 0xB8, 0x00, 0x27, 0xFD, 0x29, 0x00, 0x34, 0x01,
+ 0x27, 0xFD, 0x29, 0x00, 0xAF, 0x01, 0x27, 0xFD,
+ 0x2C, 0x00, 0x2B, 0x02, 0x35, 0xFC, 0x2E, 0x00,
+ 0xA6, 0x02, 0x68, 0xFB, 0x30, 0x00, 0x22, 0x03,
+ 0x71, 0xFA, 0x30, 0x00, 0x9D, 0x03, 0x46, 0xF9,
+ 0x29, 0x00, 0xC3, 0xFF, 0x27, 0xFD, 0x29, 0x00,
+ 0x48, 0xFF, 0x27, 0xFD, 0x29, 0x00, 0xCC, 0xFE,
+ 0x27, 0xFD, 0x29, 0x00, 0x51, 0xFE, 0x27, 0xFD,
+ 0x2C, 0x00, 0xD5, 0xFD, 0x35, 0xFC, 0x2E, 0x00,
+ 0x5A, 0xFD, 0x68, 0xFB, 0x30, 0x00, 0xDE, 0xFC,
+ 0x71, 0xFA, 0x30, 0x00, 0x63, 0xFC, 0x46, 0xF9,
+ 0x2B, 0x00, 0x3D, 0x00, 0xB7, 0xFC, 0x2B, 0x00,
+ 0xB8, 0x00, 0xB7, 0xFC, 0x2B, 0x00, 0x34, 0x01,
+ 0xB7, 0xFC, 0x2B, 0x00, 0xAF, 0x01, 0xB7, 0xFC,
+ 0x2E, 0x00, 0x2B, 0x02, 0xA0, 0xFB, 0x30, 0x00,
+ 0xA6, 0x02, 0xB3, 0xFA, 0x30, 0x00, 0x22, 0x03,
+ 0x96, 0xF9, 0x30, 0x00, 0x9D, 0x03, 0x3D, 0xF8,
+ 0x2B, 0x00, 0xC3, 0xFF, 0xB7, 0xFC, 0x2B, 0x00,
+ 0x48, 0xFF, 0xB7, 0xFC, 0x2B, 0x00, 0xCC, 0xFE,
+ 0xB7, 0xFC, 0x2B, 0x00, 0x51, 0xFE, 0xB7, 0xFC,
+ 0x2E, 0x00, 0xD5, 0xFD, 0xA0, 0xFB, 0x30, 0x00,
+ 0x5A, 0xFD, 0xB3, 0xFA, 0x30, 0x00, 0xDE, 0xFC,
+ 0x96, 0xF9, 0x30, 0x00, 0x63, 0xFC, 0x3D, 0xF8,
+ 0x23, 0x00, 0x44, 0x00, 0x3D, 0x00, 0x23, 0x00,
+ 0xCC, 0x00, 0x3D, 0x00, 0x23, 0x00, 0x54, 0x01,
+ 0x3D, 0x00, 0x23, 0x00, 0xDC, 0x01, 0x3D, 0x00,
+ 0x26, 0x00, 0x64, 0x02, 0x52, 0x00, 0x28, 0x00,
+ 0xEC, 0x02, 0x63, 0x00, 0x2A, 0x00, 0x74, 0x03,
+ 0x78, 0x00, 0x2C, 0x00, 0xFC, 0x03, 0x91, 0x00,
+ 0x23, 0x00, 0xBC, 0xFF, 0x3D, 0x00, 0x23, 0x00,
+ 0x34, 0xFF, 0x3D, 0x00, 0x23, 0x00, 0xAC, 0xFE,
+ 0x3D, 0x00, 0x23, 0x00, 0x24, 0xFE, 0x3D, 0x00,
+ 0x26, 0x00, 0x9C, 0xFD, 0x52, 0x00, 0x28, 0x00,
+ 0x14, 0xFD, 0x63, 0x00, 0x2A, 0x00, 0x8C, 0xFC,
+ 0x78, 0x00, 0x2C, 0x00, 0x04, 0xFC, 0x91, 0x00,
+ 0x23, 0x00, 0x44, 0x00, 0xB8, 0x00, 0x23, 0x00,
+ 0xCC, 0x00, 0xB8, 0x00, 0x23, 0x00, 0x54, 0x01,
+ 0xB8, 0x00, 0x23, 0x00, 0xDC, 0x01, 0xB8, 0x00,
+ 0x26, 0x00, 0x64, 0x02, 0xF6, 0x00, 0x28, 0x00,
+ 0xEC, 0x02, 0x2A, 0x01, 0x2A, 0x00, 0x74, 0x03,
+ 0x68, 0x01, 0x2C, 0x00, 0xFC, 0x03, 0xB4, 0x01,
+ 0x23, 0x00, 0xBC, 0xFF, 0xB8, 0x00, 0x23, 0x00,
+ 0x34, 0xFF, 0xB8, 0x00, 0x23, 0x00, 0xAC, 0xFE,
+ 0xB8, 0x00, 0x23, 0x00, 0x24, 0xFE, 0xB8, 0x00,
+ 0x26, 0x00, 0x9C, 0xFD, 0xF6, 0x00, 0x28, 0x00,
+ 0x14, 0xFD, 0x2A, 0x01, 0x2A, 0x00, 0x8C, 0xFC,
+ 0x68, 0x01, 0x2C, 0x00, 0x04, 0xFC, 0xB4, 0x01,
+ 0x23, 0x00, 0x44, 0x00, 0x34, 0x01, 0x23, 0x00,
+ 0xCC, 0x00, 0x34, 0x01, 0x23, 0x00, 0x54, 0x01,
+ 0x34, 0x01, 0x23, 0x00, 0xDC, 0x01, 0x34, 0x01,
+ 0x26, 0x00, 0x64, 0x02, 0x9B, 0x01, 0x28, 0x00,
+ 0xEC, 0x02, 0xF1, 0x01, 0x2A, 0x00, 0x74, 0x03,
+ 0x59, 0x02, 0x2C, 0x00, 0xFC, 0x03, 0xD8, 0x02,
+ 0x23, 0x00, 0xBC, 0xFF, 0x34, 0x01, 0x23, 0x00,
+ 0x34, 0xFF, 0x34, 0x01, 0x23, 0x00, 0xAC, 0xFE,
+ 0x34, 0x01, 0x23, 0x00, 0x24, 0xFE, 0x34, 0x01,
+ 0x26, 0x00, 0x9C, 0xFD, 0x9B, 0x01, 0x28, 0x00,
+ 0x14, 0xFD, 0xF1, 0x01, 0x2A, 0x00, 0x8C, 0xFC,
+ 0x59, 0x02, 0x2C, 0x00, 0x04, 0xFC, 0xD8, 0x02,
+ 0x23, 0x00, 0x44, 0x00, 0xAF, 0x01, 0x23, 0x00,
+ 0xCC, 0x00, 0xAF, 0x01, 0x23, 0x00, 0x54, 0x01,
+ 0xAF, 0x01, 0x23, 0x00, 0xDC, 0x01, 0xAF, 0x01,
+ 0x26, 0x00, 0x64, 0x02, 0x3F, 0x02, 0x28, 0x00,
+ 0xEC, 0x02, 0xB8, 0x02, 0x2A, 0x00, 0x74, 0x03,
+ 0x49, 0x03, 0x2C, 0x00, 0xFC, 0x03, 0xFB, 0x03,
+ 0x23, 0x00, 0xBC, 0xFF, 0xAF, 0x01, 0x23, 0x00,
+ 0x34, 0xFF, 0xAF, 0x01, 0x23, 0x00, 0xAC, 0xFE,
+ 0xAF, 0x01, 0x23, 0x00, 0x24, 0xFE, 0xAF, 0x01,
+ 0x26, 0x00, 0x9C, 0xFD, 0x3F, 0x02, 0x28, 0x00,
+ 0x14, 0xFD, 0xB8, 0x02, 0x2A, 0x00, 0x8C, 0xFC,
+ 0x49, 0x03, 0x2C, 0x00, 0x04, 0xFC, 0xFB, 0x03,
+ 0x26, 0x00, 0x44, 0x00, 0x2B, 0x02, 0x26, 0x00,
+ 0xCC, 0x00, 0x2B, 0x02, 0x26, 0x00, 0x54, 0x01,
+ 0x2B, 0x02, 0x26, 0x00, 0xDC, 0x01, 0x2B, 0x02,
+ 0x29, 0x00, 0x64, 0x02, 0xE4, 0x02, 0x2B, 0x00,
+ 0xEC, 0x02, 0x7F, 0x03, 0x2D, 0x00, 0x74, 0x03,
+ 0x3B, 0x04, 0x2F, 0x00, 0xFC, 0x03, 0x1F, 0x05,
+ 0x26, 0x00, 0xBC, 0xFF, 0x2B, 0x02, 0x26, 0x00,
+ 0x34, 0xFF, 0x2B, 0x02, 0x26, 0x00, 0xAC, 0xFE,
+ 0x2B, 0x02, 0x26, 0x00, 0x24, 0xFE, 0x2B, 0x02,
+ 0x29, 0x00, 0x9C, 0xFD, 0xE4, 0x02, 0x2B, 0x00,
+ 0x14, 0xFD, 0x7F, 0x03, 0x2D, 0x00, 0x8C, 0xFC,
+ 0x3B, 0x04, 0x2F, 0x00, 0x04, 0xFC, 0x1F, 0x05,
+ 0x28, 0x00, 0x44, 0x00, 0xA6, 0x02, 0x28, 0x00,
+ 0xCC, 0x00, 0xA6, 0x02, 0x28, 0x00, 0x54, 0x01,
+ 0xA6, 0x02, 0x28, 0x00, 0xDC, 0x01, 0xA6, 0x02,
+ 0x2B, 0x00, 0x64, 0x02, 0x88, 0x03, 0x2D, 0x00,
+ 0xEC, 0x02, 0x46, 0x04, 0x2F, 0x00, 0x74, 0x03,
+ 0x2B, 0x05, 0x30, 0x00, 0xFC, 0x03, 0x42, 0x06,
+ 0x28, 0x00, 0xBC, 0xFF, 0xA6, 0x02, 0x28, 0x00,
+ 0x34, 0xFF, 0xA6, 0x02, 0x28, 0x00, 0xAC, 0xFE,
+ 0xA6, 0x02, 0x28, 0x00, 0x24, 0xFE, 0xA6, 0x02,
+ 0x2B, 0x00, 0x9C, 0xFD, 0x88, 0x03, 0x2D, 0x00,
+ 0x14, 0xFD, 0x46, 0x04, 0x2F, 0x00, 0x8C, 0xFC,
+ 0x2B, 0x05, 0x30, 0x00, 0x04, 0xFC, 0x42, 0x06,
+ 0x2A, 0x00, 0x44, 0x00, 0x22, 0x03, 0x2A, 0x00,
+ 0xCC, 0x00, 0x22, 0x03, 0x2A, 0x00, 0x54, 0x01,
+ 0x22, 0x03, 0x2A, 0x00, 0xDC, 0x01, 0x22, 0x03,
+ 0x2D, 0x00, 0x64, 0x02, 0x2D, 0x04, 0x2F, 0x00,
+ 0xEC, 0x02, 0x0D, 0x05, 0x30, 0x00, 0x74, 0x03,
+ 0x1C, 0x06, 0x30, 0x00, 0xFC, 0x03, 0x66, 0x07,
+ 0x2A, 0x00, 0xBC, 0xFF, 0x22, 0x03, 0x2A, 0x00,
+ 0x34, 0xFF, 0x22, 0x03, 0x2A, 0x00, 0xAC, 0xFE,
+ 0x22, 0x03, 0x2A, 0x00, 0x24, 0xFE, 0x22, 0x03,
+ 0x2D, 0x00, 0x9C, 0xFD, 0x2D, 0x04, 0x2F, 0x00,
+ 0x14, 0xFD, 0x0D, 0x05, 0x30, 0x00, 0x8C, 0xFC,
+ 0x1C, 0x06, 0x30, 0x00, 0x04, 0xFC, 0x66, 0x07,
+ 0x2C, 0x00, 0x44, 0x00, 0x9D, 0x03, 0x2C, 0x00,
+ 0xCC, 0x00, 0x9D, 0x03, 0x2C, 0x00, 0x54, 0x01,
+ 0x9D, 0x03, 0x2C, 0x00, 0xDC, 0x01, 0x9D, 0x03,
+ 0x2F, 0x00, 0x64, 0x02, 0xD1, 0x04, 0x30, 0x00,
+ 0xEC, 0x02, 0xD4, 0x05, 0x30, 0x00, 0x74, 0x03,
+ 0x0C, 0x07, 0x30, 0x00, 0xFC, 0x03, 0x89, 0x08,
+ 0x2C, 0x00, 0xBC, 0xFF, 0x9D, 0x03, 0x2C, 0x00,
+ 0x34, 0xFF, 0x9D, 0x03, 0x2C, 0x00, 0xAC, 0xFE,
+ 0x9D, 0x03, 0x2C, 0x00, 0x24, 0xFE, 0x9D, 0x03,
+ 0x2F, 0x00, 0x9C, 0xFD, 0xD1, 0x04, 0x30, 0x00,
+ 0x14, 0xFD, 0xD4, 0x05, 0x30, 0x00, 0x8C, 0xFC,
+ 0x0C, 0x07, 0x30, 0x00, 0x04, 0xFC, 0x89, 0x08,
+ 0x23, 0x00, 0x44, 0x00, 0xC3, 0xFF, 0x23, 0x00,
+ 0xCC, 0x00, 0xC3, 0xFF, 0x23, 0x00, 0x54, 0x01,
+ 0xC3, 0xFF, 0x23, 0x00, 0xDC, 0x01, 0xC3, 0xFF,
+ 0x26, 0x00, 0x64, 0x02, 0xAE, 0xFF, 0x28, 0x00,
+ 0xEC, 0x02, 0x9D, 0xFF, 0x2A, 0x00, 0x74, 0x03,
+ 0x88, 0xFF, 0x2C, 0x00, 0xFC, 0x03, 0x6F, 0xFF,
+ 0x23, 0x00, 0xBC, 0xFF, 0xC3, 0xFF, 0x23, 0x00,
+ 0x34, 0xFF, 0xC3, 0xFF, 0x23, 0x00, 0xAC, 0xFE,
+ 0xC3, 0xFF, 0x23, 0x00, 0x24, 0xFE, 0xC3, 0xFF,
+ 0x26, 0x00, 0x9C, 0xFD, 0xAE, 0xFF, 0x28, 0x00,
+ 0x14, 0xFD, 0x9D, 0xFF, 0x2A, 0x00, 0x8C, 0xFC,
+ 0x88, 0xFF, 0x2C, 0x00, 0x04, 0xFC, 0x6F, 0xFF,
+ 0x23, 0x00, 0x44, 0x00, 0x48, 0xFF, 0x23, 0x00,
+ 0xCC, 0x00, 0x48, 0xFF, 0x23, 0x00, 0x54, 0x01,
+ 0x48, 0xFF, 0x23, 0x00, 0xDC, 0x01, 0x48, 0xFF,
+ 0x26, 0x00, 0x64, 0x02, 0x0A, 0xFF, 0x28, 0x00,
+ 0xEC, 0x02, 0xD6, 0xFE, 0x2A, 0x00, 0x74, 0x03,
+ 0x98, 0xFE, 0x2C, 0x00, 0xFC, 0x03, 0x4C, 0xFE,
+ 0x23, 0x00, 0xBC, 0xFF, 0x48, 0xFF, 0x23, 0x00,
+ 0x34, 0xFF, 0x48, 0xFF, 0x23, 0x00, 0xAC, 0xFE,
+ 0x48, 0xFF, 0x23, 0x00, 0x24, 0xFE, 0x48, 0xFF,
+ 0x26, 0x00, 0x9C, 0xFD, 0x0A, 0xFF, 0x28, 0x00,
+ 0x14, 0xFD, 0xD6, 0xFE, 0x2A, 0x00, 0x8C, 0xFC,
+ 0x98, 0xFE, 0x2C, 0x00, 0x04, 0xFC, 0x4C, 0xFE,
+ 0x23, 0x00, 0x44, 0x00, 0xCC, 0xFE, 0x23, 0x00,
+ 0xCC, 0x00, 0xCC, 0xFE, 0x23, 0x00, 0x54, 0x01,
+ 0xCC, 0xFE, 0x23, 0x00, 0xDC, 0x01, 0xCC, 0xFE,
+ 0x26, 0x00, 0x64, 0x02, 0x65, 0xFE, 0x28, 0x00,
+ 0xEC, 0x02, 0x0F, 0xFE, 0x2A, 0x00, 0x74, 0x03,
+ 0xA7, 0xFD, 0x2C, 0x00, 0xFC, 0x03, 0x28, 0xFD,
+ 0x23, 0x00, 0xBC, 0xFF, 0xCC, 0xFE, 0x23, 0x00,
+ 0x34, 0xFF, 0xCC, 0xFE, 0x23, 0x00, 0xAC, 0xFE,
+ 0xCC, 0xFE, 0x23, 0x00, 0x24, 0xFE, 0xCC, 0xFE,
+ 0x26, 0x00, 0x9C, 0xFD, 0x65, 0xFE, 0x28, 0x00,
+ 0x14, 0xFD, 0x0F, 0xFE, 0x2A, 0x00, 0x8C, 0xFC,
+ 0xA7, 0xFD, 0x2C, 0x00, 0x04, 0xFC, 0x28, 0xFD,
+ 0x23, 0x00, 0x44, 0x00, 0x51, 0xFE, 0x23, 0x00,
+ 0xCC, 0x00, 0x51, 0xFE, 0x23, 0x00, 0x54, 0x01,
+ 0x51, 0xFE, 0x23, 0x00, 0xDC, 0x01, 0x51, 0xFE,
+ 0x26, 0x00, 0x64, 0x02, 0xC1, 0xFD, 0x28, 0x00,
+ 0xEC, 0x02, 0x48, 0xFD, 0x2A, 0x00, 0x74, 0x03,
+ 0xB7, 0xFC, 0x2C, 0x00, 0xFC, 0x03, 0x05, 0xFC,
+ 0x23, 0x00, 0xBC, 0xFF, 0x51, 0xFE, 0x23, 0x00,
+ 0x34, 0xFF, 0x51, 0xFE, 0x23, 0x00, 0xAC, 0xFE,
+ 0x51, 0xFE, 0x23, 0x00, 0x24, 0xFE, 0x51, 0xFE,
+ 0x26, 0x00, 0x9C, 0xFD, 0xC1, 0xFD, 0x28, 0x00,
+ 0x14, 0xFD, 0x48, 0xFD, 0x2A, 0x00, 0x8C, 0xFC,
+ 0xB7, 0xFC, 0x2C, 0x00, 0x04, 0xFC, 0x05, 0xFC,
+ 0x26, 0x00, 0x44, 0x00, 0xD5, 0xFD, 0x26, 0x00,
+ 0xCC, 0x00, 0xD5, 0xFD, 0x26, 0x00, 0x54, 0x01,
+ 0xD5, 0xFD, 0x26, 0x00, 0xDC, 0x01, 0xD5, 0xFD,
+ 0x29, 0x00, 0x64, 0x02, 0x1C, 0xFD, 0x2B, 0x00,
+ 0xEC, 0x02, 0x81, 0xFC, 0x2D, 0x00, 0x74, 0x03,
+ 0xC5, 0xFB, 0x2F, 0x00, 0xFC, 0x03, 0xE1, 0xFA,
+ 0x26, 0x00, 0xBC, 0xFF, 0xD5, 0xFD, 0x26, 0x00,
+ 0x34, 0xFF, 0xD5, 0xFD, 0x26, 0x00, 0xAC, 0xFE,
+ 0xD5, 0xFD, 0x26, 0x00, 0x24, 0xFE, 0xD5, 0xFD,
+ 0x29, 0x00, 0x9C, 0xFD, 0x1C, 0xFD, 0x2B, 0x00,
+ 0x14, 0xFD, 0x81, 0xFC, 0x2D, 0x00, 0x8C, 0xFC,
+ 0xC5, 0xFB, 0x2F, 0x00, 0x04, 0xFC, 0xE1, 0xFA,
+ 0x28, 0x00, 0x44, 0x00, 0x5A, 0xFD, 0x28, 0x00,
+ 0xCC, 0x00, 0x5A, 0xFD, 0x28, 0x00, 0x54, 0x01,
+ 0x5A, 0xFD, 0x28, 0x00, 0xDC, 0x01, 0x5A, 0xFD,
+ 0x2B, 0x00, 0x64, 0x02, 0x78, 0xFC, 0x2D, 0x00,
+ 0xEC, 0x02, 0xBA, 0xFB, 0x2F, 0x00, 0x74, 0x03,
+ 0xD5, 0xFA, 0x30, 0x00, 0xFC, 0x03, 0xBE, 0xF9,
+ 0x28, 0x00, 0xBC, 0xFF, 0x5A, 0xFD, 0x28, 0x00,
+ 0x34, 0xFF, 0x5A, 0xFD, 0x28, 0x00, 0xAC, 0xFE,
+ 0x5A, 0xFD, 0x28, 0x00, 0x24, 0xFE, 0x5A, 0xFD,
+ 0x2B, 0x00, 0x9C, 0xFD, 0x78, 0xFC, 0x2D, 0x00,
+ 0x14, 0xFD, 0xBA, 0xFB, 0x2F, 0x00, 0x8C, 0xFC,
+ 0xD5, 0xFA, 0x30, 0x00, 0x04, 0xFC, 0xBE, 0xF9,
+ 0x2A, 0x00, 0x44, 0x00, 0xDE, 0xFC, 0x2A, 0x00,
+ 0xCC, 0x00, 0xDE, 0xFC, 0x2A, 0x00, 0x54, 0x01,
+ 0xDE, 0xFC, 0x2A, 0x00, 0xDC, 0x01, 0xDE, 0xFC,
+ 0x2D, 0x00, 0x64, 0x02, 0xD3, 0xFB, 0x2F, 0x00,
+ 0xEC, 0x02, 0xF3, 0xFA, 0x30, 0x00, 0x74, 0x03,
+ 0xE4, 0xF9, 0x30, 0x00, 0xFC, 0x03, 0x9A, 0xF8,
+ 0x2A, 0x00, 0xBC, 0xFF, 0xDE, 0xFC, 0x2A, 0x00,
+ 0x34, 0xFF, 0xDE, 0xFC, 0x2A, 0x00, 0xAC, 0xFE,
+ 0xDE, 0xFC, 0x2A, 0x00, 0x24, 0xFE, 0xDE, 0xFC,
+ 0x2D, 0x00, 0x9C, 0xFD, 0xD3, 0xFB, 0x2F, 0x00,
+ 0x14, 0xFD, 0xF3, 0xFA, 0x30, 0x00, 0x8C, 0xFC,
+ 0xE4, 0xF9, 0x30, 0x00, 0x04, 0xFC, 0x9A, 0xF8,
+ 0x2C, 0x00, 0x44, 0x00, 0x63, 0xFC, 0x2C, 0x00,
+ 0xCC, 0x00, 0x63, 0xFC, 0x2C, 0x00, 0x54, 0x01,
+ 0x63, 0xFC, 0x2C, 0x00, 0xDC, 0x01, 0x63, 0xFC,
+ 0x2F, 0x00, 0x64, 0x02, 0x2F, 0xFB, 0x30, 0x00,
+ 0xEC, 0x02, 0x2C, 0xFA, 0x30, 0x00, 0x74, 0x03,
+ 0xF4, 0xF8, 0x30, 0x00, 0xFC, 0x03, 0x77, 0xF7,
+ 0x2C, 0x00, 0xBC, 0xFF, 0x63, 0xFC, 0x2C, 0x00,
+ 0x34, 0xFF, 0x63, 0xFC, 0x2C, 0x00, 0xAC, 0xFE,
+ 0x63, 0xFC, 0x2C, 0x00, 0x24, 0xFE, 0x63, 0xFC,
+ 0x2F, 0x00, 0x9C, 0xFD, 0x2F, 0xFB, 0x30, 0x00,
+ 0x14, 0xFD, 0x2C, 0xFA, 0x30, 0x00, 0x8C, 0xFC,
+ 0xF4, 0xF8, 0x30, 0x00, 0x04, 0xFC, 0x77, 0xF7,
+ 0x24, 0x00, 0x4A, 0x00, 0x44, 0x00, 0x24, 0x00,
+ 0xDF, 0x00, 0x44, 0x00, 0x24, 0x00, 0x75, 0x01,
+ 0x44, 0x00, 0x24, 0x00, 0x0A, 0x02, 0x44, 0x00,
+ 0x27, 0x00, 0xA0, 0x02, 0x5A, 0x00, 0x29, 0x00,
+ 0x35, 0x03, 0x6D, 0x00, 0x2B, 0x00, 0xCB, 0x03,
+ 0x84, 0x00, 0x2D, 0x00, 0x60, 0x04, 0xA0, 0x00,
+ 0x24, 0x00, 0xB6, 0xFF, 0x44, 0x00, 0x24, 0x00,
+ 0x21, 0xFF, 0x44, 0x00, 0x24, 0x00, 0x8B, 0xFE,
+ 0x44, 0x00, 0x24, 0x00, 0xF6, 0xFD, 0x44, 0x00,
+ 0x27, 0x00, 0x60, 0xFD, 0x5A, 0x00, 0x29, 0x00,
+ 0xCB, 0xFC, 0x6D, 0x00, 0x2B, 0x00, 0x35, 0xFC,
+ 0x84, 0x00, 0x2D, 0x00, 0xA0, 0xFB, 0xA0, 0x00,
+ 0x24, 0x00, 0x4A, 0x00, 0xCC, 0x00, 0x24, 0x00,
+ 0xDF, 0x00, 0xCC, 0x00, 0x24, 0x00, 0x75, 0x01,
+ 0xCC, 0x00, 0x24, 0x00, 0x0A, 0x02, 0xCC, 0x00,
+ 0x27, 0x00, 0xA0, 0x02, 0x0F, 0x01, 0x29, 0x00,
+ 0x35, 0x03, 0x48, 0x01, 0x2B, 0x00, 0xCB, 0x03,
+ 0x8D, 0x01, 0x2D, 0x00, 0x60, 0x04, 0xE0, 0x01,
+ 0x24, 0x00, 0xB6, 0xFF, 0xCC, 0x00, 0x24, 0x00,
+ 0x21, 0xFF, 0xCC, 0x00, 0x24, 0x00, 0x8B, 0xFE,
+ 0xCC, 0x00, 0x24, 0x00, 0xF6, 0xFD, 0xCC, 0x00,
+ 0x27, 0x00, 0x60, 0xFD, 0x0F, 0x01, 0x29, 0x00,
+ 0xCB, 0xFC, 0x48, 0x01, 0x2B, 0x00, 0x35, 0xFC,
+ 0x8D, 0x01, 0x2D, 0x00, 0xA0, 0xFB, 0xE0, 0x01,
+ 0x24, 0x00, 0x4A, 0x00, 0x54, 0x01, 0x24, 0x00,
+ 0xDF, 0x00, 0x54, 0x01, 0x24, 0x00, 0x75, 0x01,
+ 0x54, 0x01, 0x24, 0x00, 0x0A, 0x02, 0x54, 0x01,
+ 0x27, 0x00, 0xA0, 0x02, 0xC4, 0x01, 0x29, 0x00,
+ 0x35, 0x03, 0x23, 0x02, 0x2B, 0x00, 0xCB, 0x03,
+ 0x96, 0x02, 0x2D, 0x00, 0x60, 0x04, 0x21, 0x03,
+ 0x24, 0x00, 0xB6, 0xFF, 0x54, 0x01, 0x24, 0x00,
+ 0x21, 0xFF, 0x54, 0x01, 0x24, 0x00, 0x8B, 0xFE,
+ 0x54, 0x01, 0x24, 0x00, 0xF6, 0xFD, 0x54, 0x01,
+ 0x27, 0x00, 0x60, 0xFD, 0xC4, 0x01, 0x29, 0x00,
+ 0xCB, 0xFC, 0x23, 0x02, 0x2B, 0x00, 0x35, 0xFC,
+ 0x96, 0x02, 0x2D, 0x00, 0xA0, 0xFB, 0x21, 0x03,
+ 0x24, 0x00, 0x4A, 0x00, 0xDC, 0x01, 0x24, 0x00,
+ 0xDF, 0x00, 0xDC, 0x01, 0x24, 0x00, 0x75, 0x01,
+ 0xDC, 0x01, 0x24, 0x00, 0x0A, 0x02, 0xDC, 0x01,
+ 0x27, 0x00, 0xA0, 0x02, 0x79, 0x02, 0x29, 0x00,
+ 0x35, 0x03, 0xFE, 0x02, 0x2B, 0x00, 0xCB, 0x03,
+ 0x9F, 0x03, 0x2D, 0x00, 0x60, 0x04, 0x61, 0x04,
+ 0x24, 0x00, 0xB6, 0xFF, 0xDC, 0x01, 0x24, 0x00,
+ 0x21, 0xFF, 0xDC, 0x01, 0x24, 0x00, 0x8B, 0xFE,
+ 0xDC, 0x01, 0x24, 0x00, 0xF6, 0xFD, 0xDC, 0x01,
+ 0x27, 0x00, 0x60, 0xFD, 0x79, 0x02, 0x29, 0x00,
+ 0xCB, 0xFC, 0xFE, 0x02, 0x2B, 0x00, 0x35, 0xFC,
+ 0x9F, 0x03, 0x2D, 0x00, 0xA0, 0xFB, 0x61, 0x04,
+ 0x27, 0x00, 0x4A, 0x00, 0x64, 0x02, 0x27, 0x00,
+ 0xDF, 0x00, 0x64, 0x02, 0x27, 0x00, 0x75, 0x01,
+ 0x64, 0x02, 0x27, 0x00, 0x0A, 0x02, 0x64, 0x02,
+ 0x2A, 0x00, 0xA0, 0x02, 0x2E, 0x03, 0x2C, 0x00,
+ 0x35, 0x03, 0xD9, 0x03, 0x2E, 0x00, 0xCB, 0x03,
+ 0xA8, 0x04, 0x30, 0x00, 0x60, 0x04, 0xA2, 0x05,
+ 0x27, 0x00, 0xB6, 0xFF, 0x64, 0x02, 0x27, 0x00,
+ 0x21, 0xFF, 0x64, 0x02, 0x27, 0x00, 0x8B, 0xFE,
+ 0x64, 0x02, 0x27, 0x00, 0xF6, 0xFD, 0x64, 0x02,
+ 0x2A, 0x00, 0x60, 0xFD, 0x2E, 0x03, 0x2C, 0x00,
+ 0xCB, 0xFC, 0xD9, 0x03, 0x2E, 0x00, 0x35, 0xFC,
+ 0xA8, 0x04, 0x30, 0x00, 0xA0, 0xFB, 0xA2, 0x05,
+ 0x29, 0x00, 0x4A, 0x00, 0xEC, 0x02, 0x29, 0x00,
+ 0xDF, 0x00, 0xEC, 0x02, 0x29, 0x00, 0x75, 0x01,
+ 0xEC, 0x02, 0x29, 0x00, 0x0A, 0x02, 0xEC, 0x02,
+ 0x2C, 0x00, 0xA0, 0x02, 0xE3, 0x03, 0x2E, 0x00,
+ 0x35, 0x03, 0xB4, 0x04, 0x30, 0x00, 0xCB, 0x03,
+ 0xB1, 0x05, 0x30, 0x00, 0x60, 0x04, 0xE2, 0x06,
+ 0x29, 0x00, 0xB6, 0xFF, 0xEC, 0x02, 0x29, 0x00,
+ 0x21, 0xFF, 0xEC, 0x02, 0x29, 0x00, 0x8B, 0xFE,
+ 0xEC, 0x02, 0x29, 0x00, 0xF6, 0xFD, 0xEC, 0x02,
+ 0x2C, 0x00, 0x60, 0xFD, 0xE3, 0x03, 0x2E, 0x00,
+ 0xCB, 0xFC, 0xB4, 0x04, 0x30, 0x00, 0x35, 0xFC,
+ 0xB1, 0x05, 0x30, 0x00, 0xA0, 0xFB, 0xE2, 0x06,
+ 0x2B, 0x00, 0x4A, 0x00, 0x74, 0x03, 0x2B, 0x00,
+ 0xDF, 0x00, 0x74, 0x03, 0x2B, 0x00, 0x75, 0x01,
+ 0x74, 0x03, 0x2B, 0x00, 0x0A, 0x02, 0x74, 0x03,
+ 0x2E, 0x00, 0xA0, 0x02, 0x98, 0x04, 0x30, 0x00,
+ 0x35, 0x03, 0x8F, 0x05, 0x30, 0x00, 0xCB, 0x03,
+ 0xBA, 0x06, 0x30, 0x00, 0x60, 0x04, 0x23, 0x08,
+ 0x2B, 0x00, 0xB6, 0xFF, 0x74, 0x03, 0x2B, 0x00,
+ 0x21, 0xFF, 0x74, 0x03, 0x2B, 0x00, 0x8B, 0xFE,
+ 0x74, 0x03, 0x2B, 0x00, 0xF6, 0xFD, 0x74, 0x03,
+ 0x2E, 0x00, 0x60, 0xFD, 0x98, 0x04, 0x30, 0x00,
+ 0xCB, 0xFC, 0x8F, 0x05, 0x30, 0x00, 0x35, 0xFC,
+ 0xBA, 0x06, 0x30, 0x00, 0xA0, 0xFB, 0x23, 0x08,
+ 0x2D, 0x00, 0x4A, 0x00, 0xFC, 0x03, 0x2D, 0x00,
+ 0xDF, 0x00, 0xFC, 0x03, 0x2D, 0x00, 0x75, 0x01,
+ 0xFC, 0x03, 0x2D, 0x00, 0x0A, 0x02, 0xFC, 0x03,
+ 0x30, 0x00, 0xA0, 0x02, 0x4D, 0x05, 0x30, 0x00,
+ 0x35, 0x03, 0x6A, 0x06, 0x30, 0x00, 0xCB, 0x03,
+ 0xC3, 0x07, 0x30, 0x00, 0x60, 0x04, 0x63, 0x09,
+ 0x2D, 0x00, 0xB6, 0xFF, 0xFC, 0x03, 0x2D, 0x00,
+ 0x21, 0xFF, 0xFC, 0x03, 0x2D, 0x00, 0x8B, 0xFE,
+ 0xFC, 0x03, 0x2D, 0x00, 0xF6, 0xFD, 0xFC, 0x03,
+ 0x30, 0x00, 0x60, 0xFD, 0x4D, 0x05, 0x30, 0x00,
+ 0xCB, 0xFC, 0x6A, 0x06, 0x30, 0x00, 0x35, 0xFC,
+ 0xC3, 0x07, 0x30, 0x00, 0xA0, 0xFB, 0x63, 0x09,
+ 0x24, 0x00, 0x4A, 0x00, 0xBC, 0xFF, 0x24, 0x00,
+ 0xDF, 0x00, 0xBC, 0xFF, 0x24, 0x00, 0x75, 0x01,
+ 0xBC, 0xFF, 0x24, 0x00, 0x0A, 0x02, 0xBC, 0xFF,
+ 0x27, 0x00, 0xA0, 0x02, 0xA6, 0xFF, 0x29, 0x00,
+ 0x35, 0x03, 0x93, 0xFF, 0x2B, 0x00, 0xCB, 0x03,
+ 0x7C, 0xFF, 0x2D, 0x00, 0x60, 0x04, 0x60, 0xFF,
+ 0x24, 0x00, 0xB6, 0xFF, 0xBC, 0xFF, 0x24, 0x00,
+ 0x21, 0xFF, 0xBC, 0xFF, 0x24, 0x00, 0x8B, 0xFE,
+ 0xBC, 0xFF, 0x24, 0x00, 0xF6, 0xFD, 0xBC, 0xFF,
+ 0x27, 0x00, 0x60, 0xFD, 0xA6, 0xFF, 0x29, 0x00,
+ 0xCB, 0xFC, 0x93, 0xFF, 0x2B, 0x00, 0x35, 0xFC,
+ 0x7C, 0xFF, 0x2D, 0x00, 0xA0, 0xFB, 0x60, 0xFF,
+ 0x24, 0x00, 0x4A, 0x00, 0x34, 0xFF, 0x24, 0x00,
+ 0xDF, 0x00, 0x34, 0xFF, 0x24, 0x00, 0x75, 0x01,
+ 0x34, 0xFF, 0x24, 0x00, 0x0A, 0x02, 0x34, 0xFF,
+ 0x27, 0x00, 0xA0, 0x02, 0xF1, 0xFE, 0x29, 0x00,
+ 0x35, 0x03, 0xB8, 0xFE, 0x2B, 0x00, 0xCB, 0x03,
+ 0x73, 0xFE, 0x2D, 0x00, 0x60, 0x04, 0x20, 0xFE,
+ 0x24, 0x00, 0xB6, 0xFF, 0x34, 0xFF, 0x24, 0x00,
+ 0x21, 0xFF, 0x34, 0xFF, 0x24, 0x00, 0x8B, 0xFE,
+ 0x34, 0xFF, 0x24, 0x00, 0xF6, 0xFD, 0x34, 0xFF,
+ 0x27, 0x00, 0x60, 0xFD, 0xF1, 0xFE, 0x29, 0x00,
+ 0xCB, 0xFC, 0xB8, 0xFE, 0x2B, 0x00, 0x35, 0xFC,
+ 0x73, 0xFE, 0x2D, 0x00, 0xA0, 0xFB, 0x20, 0xFE,
+ 0x24, 0x00, 0x4A, 0x00, 0xAC, 0xFE, 0x24, 0x00,
+ 0xDF, 0x00, 0xAC, 0xFE, 0x24, 0x00, 0x75, 0x01,
+ 0xAC, 0xFE, 0x24, 0x00, 0x0A, 0x02, 0xAC, 0xFE,
+ 0x27, 0x00, 0xA0, 0x02, 0x3C, 0xFE, 0x29, 0x00,
+ 0x35, 0x03, 0xDD, 0xFD, 0x2B, 0x00, 0xCB, 0x03,
+ 0x6A, 0xFD, 0x2D, 0x00, 0x60, 0x04, 0xDF, 0xFC,
+ 0x24, 0x00, 0xB6, 0xFF, 0xAC, 0xFE, 0x24, 0x00,
+ 0x21, 0xFF, 0xAC, 0xFE, 0x24, 0x00, 0x8B, 0xFE,
+ 0xAC, 0xFE, 0x24, 0x00, 0xF6, 0xFD, 0xAC, 0xFE,
+ 0x27, 0x00, 0x60, 0xFD, 0x3C, 0xFE, 0x29, 0x00,
+ 0xCB, 0xFC, 0xDD, 0xFD, 0x2B, 0x00, 0x35, 0xFC,
+ 0x6A, 0xFD, 0x2D, 0x00, 0xA0, 0xFB, 0xDF, 0xFC,
+ 0x24, 0x00, 0x4A, 0x00, 0x24, 0xFE, 0x24, 0x00,
+ 0xDF, 0x00, 0x24, 0xFE, 0x24, 0x00, 0x75, 0x01,
+ 0x24, 0xFE, 0x24, 0x00, 0x0A, 0x02, 0x24, 0xFE,
+ 0x27, 0x00, 0xA0, 0x02, 0x87, 0xFD, 0x29, 0x00,
+ 0x35, 0x03, 0x02, 0xFD, 0x2B, 0x00, 0xCB, 0x03,
+ 0x61, 0xFC, 0x2D, 0x00, 0x60, 0x04, 0x9F, 0xFB,
+ 0x24, 0x00, 0xB6, 0xFF, 0x24, 0xFE, 0x24, 0x00,
+ 0x21, 0xFF, 0x24, 0xFE, 0x24, 0x00, 0x8B, 0xFE,
+ 0x24, 0xFE, 0x24, 0x00, 0xF6, 0xFD, 0x24, 0xFE,
+ 0x27, 0x00, 0x60, 0xFD, 0x87, 0xFD, 0x29, 0x00,
+ 0xCB, 0xFC, 0x02, 0xFD, 0x2B, 0x00, 0x35, 0xFC,
+ 0x61, 0xFC, 0x2D, 0x00, 0xA0, 0xFB, 0x9F, 0xFB,
+ 0x27, 0x00, 0x4A, 0x00, 0x9C, 0xFD, 0x27, 0x00,
+ 0xDF, 0x00, 0x9C, 0xFD, 0x27, 0x00, 0x75, 0x01,
+ 0x9C, 0xFD, 0x27, 0x00, 0x0A, 0x02, 0x9C, 0xFD,
+ 0x2A, 0x00, 0xA0, 0x02, 0xD2, 0xFC, 0x2C, 0x00,
+ 0x35, 0x03, 0x27, 0xFC, 0x2E, 0x00, 0xCB, 0x03,
+ 0x58, 0xFB, 0x30, 0x00, 0x60, 0x04, 0x5E, 0xFA,
+ 0x27, 0x00, 0xB6, 0xFF, 0x9C, 0xFD, 0x27, 0x00,
+ 0x21, 0xFF, 0x9C, 0xFD, 0x27, 0x00, 0x8B, 0xFE,
+ 0x9C, 0xFD, 0x27, 0x00, 0xF6, 0xFD, 0x9C, 0xFD,
+ 0x2A, 0x00, 0x60, 0xFD, 0xD2, 0xFC, 0x2C, 0x00,
+ 0xCB, 0xFC, 0x27, 0xFC, 0x2E, 0x00, 0x35, 0xFC,
+ 0x58, 0xFB, 0x30, 0x00, 0xA0, 0xFB, 0x5E, 0xFA,
+ 0x29, 0x00, 0x4A, 0x00, 0x14, 0xFD, 0x29, 0x00,
+ 0xDF, 0x00, 0x14, 0xFD, 0x29, 0x00, 0x75, 0x01,
+ 0x14, 0xFD, 0x29, 0x00, 0x0A, 0x02, 0x14, 0xFD,
+ 0x2C, 0x00, 0xA0, 0x02, 0x1D, 0xFC, 0x2E, 0x00,
+ 0x35, 0x03, 0x4C, 0xFB, 0x30, 0x00, 0xCB, 0x03,
+ 0x4F, 0xFA, 0x30, 0x00, 0x60, 0x04, 0x1E, 0xF9,
+ 0x29, 0x00, 0xB6, 0xFF, 0x14, 0xFD, 0x29, 0x00,
+ 0x21, 0xFF, 0x14, 0xFD, 0x29, 0x00, 0x8B, 0xFE,
+ 0x14, 0xFD, 0x29, 0x00, 0xF6, 0xFD, 0x14, 0xFD,
+ 0x2C, 0x00, 0x60, 0xFD, 0x1D, 0xFC, 0x2E, 0x00,
+ 0xCB, 0xFC, 0x4C, 0xFB, 0x30, 0x00, 0x35, 0xFC,
+ 0x4F, 0xFA, 0x30, 0x00, 0xA0, 0xFB, 0x1E, 0xF9,
+ 0x2B, 0x00, 0x4A, 0x00, 0x8C, 0xFC, 0x2B, 0x00,
+ 0xDF, 0x00, 0x8C, 0xFC, 0x2B, 0x00, 0x75, 0x01,
+ 0x8C, 0xFC, 0x2B, 0x00, 0x0A, 0x02, 0x8C, 0xFC,
+ 0x2E, 0x00, 0xA0, 0x02, 0x68, 0xFB, 0x30, 0x00,
+ 0x35, 0x03, 0x71, 0xFA, 0x30, 0x00, 0xCB, 0x03,
+ 0x46, 0xF9, 0x30, 0x00, 0x60, 0x04, 0xDD, 0xF7,
+ 0x2B, 0x00, 0xB6, 0xFF, 0x8C, 0xFC, 0x2B, 0x00,
+ 0x21, 0xFF, 0x8C, 0xFC, 0x2B, 0x00, 0x8B, 0xFE,
+ 0x8C, 0xFC, 0x2B, 0x00, 0xF6, 0xFD, 0x8C, 0xFC,
+ 0x2E, 0x00, 0x60, 0xFD, 0x68, 0xFB, 0x30, 0x00,
+ 0xCB, 0xFC, 0x71, 0xFA, 0x30, 0x00, 0x35, 0xFC,
+ 0x46, 0xF9, 0x30, 0x00, 0xA0, 0xFB, 0xDD, 0xF7,
+ 0x2D, 0x00, 0x4A, 0x00, 0x04, 0xFC, 0x2D, 0x00,
+ 0xDF, 0x00, 0x04, 0xFC, 0x2D, 0x00, 0x75, 0x01,
+ 0x04, 0xFC, 0x2D, 0x00, 0x0A, 0x02, 0x04, 0xFC,
+ 0x30, 0x00, 0xA0, 0x02, 0xB3, 0xFA, 0x30, 0x00,
+ 0x35, 0x03, 0x96, 0xF9, 0x30, 0x00, 0xCB, 0x03,
+ 0x3D, 0xF8, 0x30, 0x00, 0x60, 0x04, 0x9D, 0xF6,
+ 0x2D, 0x00, 0xB6, 0xFF, 0x04, 0xFC, 0x2D, 0x00,
+ 0x21, 0xFF, 0x04, 0xFC, 0x2D, 0x00, 0x8B, 0xFE,
+ 0x04, 0xFC, 0x2D, 0x00, 0xF6, 0xFD, 0x04, 0xFC,
+ 0x30, 0x00, 0x60, 0xFD, 0xB3, 0xFA, 0x30, 0x00,
+ 0xCB, 0xFC, 0x96, 0xF9, 0x30, 0x00, 0x35, 0xFC,
+ 0x3D, 0xF8, 0x30, 0x00, 0xA0, 0xFB, 0x9D, 0xF6,
+ 0x25, 0x00, 0x52, 0x00, 0x4A, 0x00, 0x25, 0x00,
+ 0xF6, 0x00, 0x4A, 0x00, 0x25, 0x00, 0x9B, 0x01,
+ 0x4A, 0x00, 0x25, 0x00, 0x3F, 0x02, 0x4A, 0x00,
+ 0x28, 0x00, 0xE4, 0x02, 0x63, 0x00, 0x2A, 0x00,
+ 0x88, 0x03, 0x78, 0x00, 0x2C, 0x00, 0x2D, 0x04,
+ 0x91, 0x00, 0x2E, 0x00, 0xD1, 0x04, 0xB0, 0x00,
+ 0x25, 0x00, 0xAE, 0xFF, 0x4A, 0x00, 0x25, 0x00,
+ 0x0A, 0xFF, 0x4A, 0x00, 0x25, 0x00, 0x65, 0xFE,
+ 0x4A, 0x00, 0x25, 0x00, 0xC1, 0xFD, 0x4A, 0x00,
+ 0x28, 0x00, 0x1C, 0xFD, 0x63, 0x00, 0x2A, 0x00,
+ 0x78, 0xFC, 0x78, 0x00, 0x2C, 0x00, 0xD3, 0xFB,
+ 0x91, 0x00, 0x2E, 0x00, 0x2F, 0xFB, 0xB0, 0x00,
+ 0x25, 0x00, 0x52, 0x00, 0xDF, 0x00, 0x25, 0x00,
+ 0xF6, 0x00, 0xDF, 0x00, 0x25, 0x00, 0x9B, 0x01,
+ 0xDF, 0x00, 0x25, 0x00, 0x3F, 0x02, 0xDF, 0x00,
+ 0x28, 0x00, 0xE4, 0x02, 0x2A, 0x01, 0x2A, 0x00,
+ 0x88, 0x03, 0x68, 0x01, 0x2C, 0x00, 0x2D, 0x04,
+ 0xB4, 0x01, 0x2E, 0x00, 0xD1, 0x04, 0x10, 0x02,
+ 0x25, 0x00, 0xAE, 0xFF, 0xDF, 0x00, 0x25, 0x00,
+ 0x0A, 0xFF, 0xDF, 0x00, 0x25, 0x00, 0x65, 0xFE,
+ 0xDF, 0x00, 0x25, 0x00, 0xC1, 0xFD, 0xDF, 0x00,
+ 0x28, 0x00, 0x1C, 0xFD, 0x2A, 0x01, 0x2A, 0x00,
+ 0x78, 0xFC, 0x68, 0x01, 0x2C, 0x00, 0xD3, 0xFB,
+ 0xB4, 0x01, 0x2E, 0x00, 0x2F, 0xFB, 0x10, 0x02,
+ 0x25, 0x00, 0x52, 0x00, 0x75, 0x01, 0x25, 0x00,
+ 0xF6, 0x00, 0x75, 0x01, 0x25, 0x00, 0x9B, 0x01,
+ 0x75, 0x01, 0x25, 0x00, 0x3F, 0x02, 0x75, 0x01,
+ 0x28, 0x00, 0xE4, 0x02, 0xF1, 0x01, 0x2A, 0x00,
+ 0x88, 0x03, 0x59, 0x02, 0x2C, 0x00, 0x2D, 0x04,
+ 0xD8, 0x02, 0x2E, 0x00, 0xD1, 0x04, 0x71, 0x03,
+ 0x25, 0x00, 0xAE, 0xFF, 0x75, 0x01, 0x25, 0x00,
+ 0x0A, 0xFF, 0x75, 0x01, 0x25, 0x00, 0x65, 0xFE,
+ 0x75, 0x01, 0x25, 0x00, 0xC1, 0xFD, 0x75, 0x01,
+ 0x28, 0x00, 0x1C, 0xFD, 0xF1, 0x01, 0x2A, 0x00,
+ 0x78, 0xFC, 0x59, 0x02, 0x2C, 0x00, 0xD3, 0xFB,
+ 0xD8, 0x02, 0x2E, 0x00, 0x2F, 0xFB, 0x71, 0x03,
+ 0x25, 0x00, 0x52, 0x00, 0x0A, 0x02, 0x25, 0x00,
+ 0xF6, 0x00, 0x0A, 0x02, 0x25, 0x00, 0x9B, 0x01,
+ 0x0A, 0x02, 0x25, 0x00, 0x3F, 0x02, 0x0A, 0x02,
+ 0x28, 0x00, 0xE4, 0x02, 0xB8, 0x02, 0x2A, 0x00,
+ 0x88, 0x03, 0x49, 0x03, 0x2C, 0x00, 0x2D, 0x04,
+ 0xFB, 0x03, 0x2E, 0x00, 0xD1, 0x04, 0xD1, 0x04,
+ 0x25, 0x00, 0xAE, 0xFF, 0x0A, 0x02, 0x25, 0x00,
+ 0x0A, 0xFF, 0x0A, 0x02, 0x25, 0x00, 0x65, 0xFE,
+ 0x0A, 0x02, 0x25, 0x00, 0xC1, 0xFD, 0x0A, 0x02,
+ 0x28, 0x00, 0x1C, 0xFD, 0xB8, 0x02, 0x2A, 0x00,
+ 0x78, 0xFC, 0x49, 0x03, 0x2C, 0x00, 0xD3, 0xFB,
+ 0xFB, 0x03, 0x2E, 0x00, 0x2F, 0xFB, 0xD1, 0x04,
+ 0x28, 0x00, 0x52, 0x00, 0xA0, 0x02, 0x28, 0x00,
+ 0xF6, 0x00, 0xA0, 0x02, 0x28, 0x00, 0x9B, 0x01,
+ 0xA0, 0x02, 0x28, 0x00, 0x3F, 0x02, 0xA0, 0x02,
+ 0x2B, 0x00, 0xE4, 0x02, 0x7F, 0x03, 0x2D, 0x00,
+ 0x88, 0x03, 0x3B, 0x04, 0x2F, 0x00, 0x2D, 0x04,
+ 0x1F, 0x05, 0x30, 0x00, 0xD1, 0x04, 0x33, 0x06,
+ 0x28, 0x00, 0xAE, 0xFF, 0xA0, 0x02, 0x28, 0x00,
+ 0x0A, 0xFF, 0xA0, 0x02, 0x28, 0x00, 0x65, 0xFE,
+ 0xA0, 0x02, 0x28, 0x00, 0xC1, 0xFD, 0xA0, 0x02,
+ 0x2B, 0x00, 0x1C, 0xFD, 0x7F, 0x03, 0x2D, 0x00,
+ 0x78, 0xFC, 0x3B, 0x04, 0x2F, 0x00, 0xD3, 0xFB,
+ 0x1F, 0x05, 0x30, 0x00, 0x2F, 0xFB, 0x33, 0x06,
+ 0x2A, 0x00, 0x52, 0x00, 0x35, 0x03, 0x2A, 0x00,
+ 0xF6, 0x00, 0x35, 0x03, 0x2A, 0x00, 0x9B, 0x01,
+ 0x35, 0x03, 0x2A, 0x00, 0x3F, 0x02, 0x35, 0x03,
+ 0x2D, 0x00, 0xE4, 0x02, 0x46, 0x04, 0x2F, 0x00,
+ 0x88, 0x03, 0x2B, 0x05, 0x30, 0x00, 0x2D, 0x04,
+ 0x42, 0x06, 0x30, 0x00, 0xD1, 0x04, 0x93, 0x07,
+ 0x2A, 0x00, 0xAE, 0xFF, 0x35, 0x03, 0x2A, 0x00,
+ 0x0A, 0xFF, 0x35, 0x03, 0x2A, 0x00, 0x65, 0xFE,
+ 0x35, 0x03, 0x2A, 0x00, 0xC1, 0xFD, 0x35, 0x03,
+ 0x2D, 0x00, 0x1C, 0xFD, 0x46, 0x04, 0x2F, 0x00,
+ 0x78, 0xFC, 0x2B, 0x05, 0x30, 0x00, 0xD3, 0xFB,
+ 0x42, 0x06, 0x30, 0x00, 0x2F, 0xFB, 0x93, 0x07,
+ 0x2C, 0x00, 0x52, 0x00, 0xCB, 0x03, 0x2C, 0x00,
+ 0xF6, 0x00, 0xCB, 0x03, 0x2C, 0x00, 0x9B, 0x01,
+ 0xCB, 0x03, 0x2C, 0x00, 0x3F, 0x02, 0xCB, 0x03,
+ 0x2F, 0x00, 0xE4, 0x02, 0x0D, 0x05, 0x30, 0x00,
+ 0x88, 0x03, 0x1C, 0x06, 0x30, 0x00, 0x2D, 0x04,
+ 0x66, 0x07, 0x30, 0x00, 0xD1, 0x04, 0xF4, 0x08,
+ 0x2C, 0x00, 0xAE, 0xFF, 0xCB, 0x03, 0x2C, 0x00,
+ 0x0A, 0xFF, 0xCB, 0x03, 0x2C, 0x00, 0x65, 0xFE,
+ 0xCB, 0x03, 0x2C, 0x00, 0xC1, 0xFD, 0xCB, 0x03,
+ 0x2F, 0x00, 0x1C, 0xFD, 0x0D, 0x05, 0x30, 0x00,
+ 0x78, 0xFC, 0x1C, 0x06, 0x30, 0x00, 0xD3, 0xFB,
+ 0x66, 0x07, 0x30, 0x00, 0x2F, 0xFB, 0xF4, 0x08,
+ 0x2E, 0x00, 0x52, 0x00, 0x60, 0x04, 0x2E, 0x00,
+ 0xF6, 0x00, 0x60, 0x04, 0x2E, 0x00, 0x9B, 0x01,
+ 0x60, 0x04, 0x2E, 0x00, 0x3F, 0x02, 0x60, 0x04,
+ 0x30, 0x00, 0xE4, 0x02, 0xD4, 0x05, 0x30, 0x00,
+ 0x88, 0x03, 0x0C, 0x07, 0x30, 0x00, 0x2D, 0x04,
+ 0x89, 0x08, 0x30, 0x00, 0xD1, 0x04, 0x54, 0x0A,
+ 0x2E, 0x00, 0xAE, 0xFF, 0x60, 0x04, 0x2E, 0x00,
+ 0x0A, 0xFF, 0x60, 0x04, 0x2E, 0x00, 0x65, 0xFE,
+ 0x60, 0x04, 0x2E, 0x00, 0xC1, 0xFD, 0x60, 0x04,
+ 0x30, 0x00, 0x1C, 0xFD, 0xD4, 0x05, 0x30, 0x00,
+ 0x78, 0xFC, 0x0C, 0x07, 0x30, 0x00, 0xD3, 0xFB,
+ 0x89, 0x08, 0x30, 0x00, 0x2F, 0xFB, 0x54, 0x0A,
+ 0x25, 0x00, 0x52, 0x00, 0xB6, 0xFF, 0x25, 0x00,
+ 0xF6, 0x00, 0xB6, 0xFF, 0x25, 0x00, 0x9B, 0x01,
+ 0xB6, 0xFF, 0x25, 0x00, 0x3F, 0x02, 0xB6, 0xFF,
+ 0x28, 0x00, 0xE4, 0x02, 0x9D, 0xFF, 0x2A, 0x00,
+ 0x88, 0x03, 0x88, 0xFF, 0x2C, 0x00, 0x2D, 0x04,
+ 0x6F, 0xFF, 0x2E, 0x00, 0xD1, 0x04, 0x50, 0xFF,
+ 0x25, 0x00, 0xAE, 0xFF, 0xB6, 0xFF, 0x25, 0x00,
+ 0x0A, 0xFF, 0xB6, 0xFF, 0x25, 0x00, 0x65, 0xFE,
+ 0xB6, 0xFF, 0x25, 0x00, 0xC1, 0xFD, 0xB6, 0xFF,
+ 0x28, 0x00, 0x1C, 0xFD, 0x9D, 0xFF, 0x2A, 0x00,
+ 0x78, 0xFC, 0x88, 0xFF, 0x2C, 0x00, 0xD3, 0xFB,
+ 0x6F, 0xFF, 0x2E, 0x00, 0x2F, 0xFB, 0x50, 0xFF,
+ 0x25, 0x00, 0x52, 0x00, 0x21, 0xFF, 0x25, 0x00,
+ 0xF6, 0x00, 0x21, 0xFF, 0x25, 0x00, 0x9B, 0x01,
+ 0x21, 0xFF, 0x25, 0x00, 0x3F, 0x02, 0x21, 0xFF,
+ 0x28, 0x00, 0xE4, 0x02, 0xD6, 0xFE, 0x2A, 0x00,
+ 0x88, 0x03, 0x98, 0xFE, 0x2C, 0x00, 0x2D, 0x04,
+ 0x4C, 0xFE, 0x2E, 0x00, 0xD1, 0x04, 0xF0, 0xFD,
+ 0x25, 0x00, 0xAE, 0xFF, 0x21, 0xFF, 0x25, 0x00,
+ 0x0A, 0xFF, 0x21, 0xFF, 0x25, 0x00, 0x65, 0xFE,
+ 0x21, 0xFF, 0x25, 0x00, 0xC1, 0xFD, 0x21, 0xFF,
+ 0x28, 0x00, 0x1C, 0xFD, 0xD6, 0xFE, 0x2A, 0x00,
+ 0x78, 0xFC, 0x98, 0xFE, 0x2C, 0x00, 0xD3, 0xFB,
+ 0x4C, 0xFE, 0x2E, 0x00, 0x2F, 0xFB, 0xF0, 0xFD,
+ 0x25, 0x00, 0x52, 0x00, 0x8B, 0xFE, 0x25, 0x00,
+ 0xF6, 0x00, 0x8B, 0xFE, 0x25, 0x00, 0x9B, 0x01,
+ 0x8B, 0xFE, 0x25, 0x00, 0x3F, 0x02, 0x8B, 0xFE,
+ 0x28, 0x00, 0xE4, 0x02, 0x0F, 0xFE, 0x2A, 0x00,
+ 0x88, 0x03, 0xA7, 0xFD, 0x2C, 0x00, 0x2D, 0x04,
+ 0x28, 0xFD, 0x2E, 0x00, 0xD1, 0x04, 0x8F, 0xFC,
+ 0x25, 0x00, 0xAE, 0xFF, 0x8B, 0xFE, 0x25, 0x00,
+ 0x0A, 0xFF, 0x8B, 0xFE, 0x25, 0x00, 0x65, 0xFE,
+ 0x8B, 0xFE, 0x25, 0x00, 0xC1, 0xFD, 0x8B, 0xFE,
+ 0x28, 0x00, 0x1C, 0xFD, 0x0F, 0xFE, 0x2A, 0x00,
+ 0x78, 0xFC, 0xA7, 0xFD, 0x2C, 0x00, 0xD3, 0xFB,
+ 0x28, 0xFD, 0x2E, 0x00, 0x2F, 0xFB, 0x8F, 0xFC,
+ 0x25, 0x00, 0x52, 0x00, 0xF6, 0xFD, 0x25, 0x00,
+ 0xF6, 0x00, 0xF6, 0xFD, 0x25, 0x00, 0x9B, 0x01,
+ 0xF6, 0xFD, 0x25, 0x00, 0x3F, 0x02, 0xF6, 0xFD,
+ 0x28, 0x00, 0xE4, 0x02, 0x48, 0xFD, 0x2A, 0x00,
+ 0x88, 0x03, 0xB7, 0xFC, 0x2C, 0x00, 0x2D, 0x04,
+ 0x05, 0xFC, 0x2E, 0x00, 0xD1, 0x04, 0x2F, 0xFB,
+ 0x25, 0x00, 0xAE, 0xFF, 0xF6, 0xFD, 0x25, 0x00,
+ 0x0A, 0xFF, 0xF6, 0xFD, 0x25, 0x00, 0x65, 0xFE,
+ 0xF6, 0xFD, 0x25, 0x00, 0xC1, 0xFD, 0xF6, 0xFD,
+ 0x28, 0x00, 0x1C, 0xFD, 0x48, 0xFD, 0x2A, 0x00,
+ 0x78, 0xFC, 0xB7, 0xFC, 0x2C, 0x00, 0xD3, 0xFB,
+ 0x05, 0xFC, 0x2E, 0x00, 0x2F, 0xFB, 0x2F, 0xFB,
+ 0x28, 0x00, 0x52, 0x00, 0x60, 0xFD, 0x28, 0x00,
+ 0xF6, 0x00, 0x60, 0xFD, 0x28, 0x00, 0x9B, 0x01,
+ 0x60, 0xFD, 0x28, 0x00, 0x3F, 0x02, 0x60, 0xFD,
+ 0x2B, 0x00, 0xE4, 0x02, 0x81, 0xFC, 0x2D, 0x00,
+ 0x88, 0x03, 0xC5, 0xFB, 0x2F, 0x00, 0x2D, 0x04,
+ 0xE1, 0xFA, 0x30, 0x00, 0xD1, 0x04, 0xCD, 0xF9,
+ 0x28, 0x00, 0xAE, 0xFF, 0x60, 0xFD, 0x28, 0x00,
+ 0x0A, 0xFF, 0x60, 0xFD, 0x28, 0x00, 0x65, 0xFE,
+ 0x60, 0xFD, 0x28, 0x00, 0xC1, 0xFD, 0x60, 0xFD,
+ 0x2B, 0x00, 0x1C, 0xFD, 0x81, 0xFC, 0x2D, 0x00,
+ 0x78, 0xFC, 0xC5, 0xFB, 0x2F, 0x00, 0xD3, 0xFB,
+ 0xE1, 0xFA, 0x30, 0x00, 0x2F, 0xFB, 0xCD, 0xF9,
+ 0x2A, 0x00, 0x52, 0x00, 0xCB, 0xFC, 0x2A, 0x00,
+ 0xF6, 0x00, 0xCB, 0xFC, 0x2A, 0x00, 0x9B, 0x01,
+ 0xCB, 0xFC, 0x2A, 0x00, 0x3F, 0x02, 0xCB, 0xFC,
+ 0x2D, 0x00, 0xE4, 0x02, 0xBA, 0xFB, 0x2F, 0x00,
+ 0x88, 0x03, 0xD5, 0xFA, 0x30, 0x00, 0x2D, 0x04,
+ 0xBE, 0xF9, 0x30, 0x00, 0xD1, 0x04, 0x6D, 0xF8,
+ 0x2A, 0x00, 0xAE, 0xFF, 0xCB, 0xFC, 0x2A, 0x00,
+ 0x0A, 0xFF, 0xCB, 0xFC, 0x2A, 0x00, 0x65, 0xFE,
+ 0xCB, 0xFC, 0x2A, 0x00, 0xC1, 0xFD, 0xCB, 0xFC,
+ 0x2D, 0x00, 0x1C, 0xFD, 0xBA, 0xFB, 0x2F, 0x00,
+ 0x78, 0xFC, 0xD5, 0xFA, 0x30, 0x00, 0xD3, 0xFB,
+ 0xBE, 0xF9, 0x30, 0x00, 0x2F, 0xFB, 0x6D, 0xF8,
+ 0x2C, 0x00, 0x52, 0x00, 0x35, 0xFC, 0x2C, 0x00,
+ 0xF6, 0x00, 0x35, 0xFC, 0x2C, 0x00, 0x9B, 0x01,
+ 0x35, 0xFC, 0x2C, 0x00, 0x3F, 0x02, 0x35, 0xFC,
+ 0x2F, 0x00, 0xE4, 0x02, 0xF3, 0xFA, 0x30, 0x00,
+ 0x88, 0x03, 0xE4, 0xF9, 0x30, 0x00, 0x2D, 0x04,
+ 0x9A, 0xF8, 0x30, 0x00, 0xD1, 0x04, 0x0C, 0xF7,
+ 0x2C, 0x00, 0xAE, 0xFF, 0x35, 0xFC, 0x2C, 0x00,
+ 0x0A, 0xFF, 0x35, 0xFC, 0x2C, 0x00, 0x65, 0xFE,
+ 0x35, 0xFC, 0x2C, 0x00, 0xC1, 0xFD, 0x35, 0xFC,
+ 0x2F, 0x00, 0x1C, 0xFD, 0xF3, 0xFA, 0x30, 0x00,
+ 0x78, 0xFC, 0xE4, 0xF9, 0x30, 0x00, 0xD3, 0xFB,
+ 0x9A, 0xF8, 0x30, 0x00, 0x2F, 0xFB, 0x0C, 0xF7,
+ 0x2E, 0x00, 0x52, 0x00, 0xA0, 0xFB, 0x2E, 0x00,
+ 0xF6, 0x00, 0xA0, 0xFB, 0x2E, 0x00, 0x9B, 0x01,
+ 0xA0, 0xFB, 0x2E, 0x00, 0x3F, 0x02, 0xA0, 0xFB,
+ 0x30, 0x00, 0xE4, 0x02, 0x2C, 0xFA, 0x30, 0x00,
+ 0x88, 0x03, 0xF4, 0xF8, 0x30, 0x00, 0x2D, 0x04,
+ 0x77, 0xF7, 0x30, 0x00, 0xD1, 0x04, 0xAC, 0xF5,
+ 0x2E, 0x00, 0xAE, 0xFF, 0xA0, 0xFB, 0x2E, 0x00,
+ 0x0A, 0xFF, 0xA0, 0xFB, 0x2E, 0x00, 0x65, 0xFE,
+ 0xA0, 0xFB, 0x2E, 0x00, 0xC1, 0xFD, 0xA0, 0xFB,
+ 0x30, 0x00, 0x1C, 0xFD, 0x2C, 0xFA, 0x30, 0x00,
+ 0x78, 0xFC, 0xF4, 0xF8, 0x30, 0x00, 0xD3, 0xFB,
+ 0x77, 0xF7, 0x30, 0x00, 0x2F, 0xFB, 0xAC, 0xF5,
+ 0x26, 0x00, 0x5A, 0x00, 0x52, 0x00, 0x26, 0x00,
+ 0x0F, 0x01, 0x52, 0x00, 0x26, 0x00, 0xC4, 0x01,
+ 0x52, 0x00, 0x26, 0x00, 0x79, 0x02, 0x52, 0x00,
+ 0x29, 0x00, 0x2E, 0x03, 0x6D, 0x00, 0x2B, 0x00,
+ 0xE3, 0x03, 0x84, 0x00, 0x2D, 0x00, 0x98, 0x04,
+ 0xA0, 0x00, 0x2F, 0x00, 0x4D, 0x05, 0xC2, 0x00,
+ 0x26, 0x00, 0xA6, 0xFF, 0x52, 0x00, 0x26, 0x00,
+ 0xF1, 0xFE, 0x52, 0x00, 0x26, 0x00, 0x3C, 0xFE,
+ 0x52, 0x00, 0x26, 0x00, 0x87, 0xFD, 0x52, 0x00,
+ 0x29, 0x00, 0xD2, 0xFC, 0x6D, 0x00, 0x2B, 0x00,
+ 0x1D, 0xFC, 0x84, 0x00, 0x2D, 0x00, 0x68, 0xFB,
+ 0xA0, 0x00, 0x2F, 0x00, 0xB3, 0xFA, 0xC2, 0x00,
+ 0x26, 0x00, 0x5A, 0x00, 0xF6, 0x00, 0x26, 0x00,
+ 0x0F, 0x01, 0xF6, 0x00, 0x26, 0x00, 0xC4, 0x01,
+ 0xF6, 0x00, 0x26, 0x00, 0x79, 0x02, 0xF6, 0x00,
+ 0x29, 0x00, 0x2E, 0x03, 0x48, 0x01, 0x2B, 0x00,
+ 0xE3, 0x03, 0x8D, 0x01, 0x2D, 0x00, 0x98, 0x04,
+ 0xE0, 0x01, 0x2F, 0x00, 0x4D, 0x05, 0x46, 0x02,
+ 0x26, 0x00, 0xA6, 0xFF, 0xF6, 0x00, 0x26, 0x00,
+ 0xF1, 0xFE, 0xF6, 0x00, 0x26, 0x00, 0x3C, 0xFE,
+ 0xF6, 0x00, 0x26, 0x00, 0x87, 0xFD, 0xF6, 0x00,
+ 0x29, 0x00, 0xD2, 0xFC, 0x48, 0x01, 0x2B, 0x00,
+ 0x1D, 0xFC, 0x8D, 0x01, 0x2D, 0x00, 0x68, 0xFB,
+ 0xE0, 0x01, 0x2F, 0x00, 0xB3, 0xFA, 0x46, 0x02,
+ 0x26, 0x00, 0x5A, 0x00, 0x9B, 0x01, 0x26, 0x00,
+ 0x0F, 0x01, 0x9B, 0x01, 0x26, 0x00, 0xC4, 0x01,
+ 0x9B, 0x01, 0x26, 0x00, 0x79, 0x02, 0x9B, 0x01,
+ 0x29, 0x00, 0x2E, 0x03, 0x23, 0x02, 0x2B, 0x00,
+ 0xE3, 0x03, 0x96, 0x02, 0x2D, 0x00, 0x98, 0x04,
+ 0x21, 0x03, 0x2F, 0x00, 0x4D, 0x05, 0xCA, 0x03,
+ 0x26, 0x00, 0xA6, 0xFF, 0x9B, 0x01, 0x26, 0x00,
+ 0xF1, 0xFE, 0x9B, 0x01, 0x26, 0x00, 0x3C, 0xFE,
+ 0x9B, 0x01, 0x26, 0x00, 0x87, 0xFD, 0x9B, 0x01,
+ 0x29, 0x00, 0xD2, 0xFC, 0x23, 0x02, 0x2B, 0x00,
+ 0x1D, 0xFC, 0x96, 0x02, 0x2D, 0x00, 0x68, 0xFB,
+ 0x21, 0x03, 0x2F, 0x00, 0xB3, 0xFA, 0xCA, 0x03,
+ 0x26, 0x00, 0x5A, 0x00, 0x3F, 0x02, 0x26, 0x00,
+ 0x0F, 0x01, 0x3F, 0x02, 0x26, 0x00, 0xC4, 0x01,
+ 0x3F, 0x02, 0x26, 0x00, 0x79, 0x02, 0x3F, 0x02,
+ 0x29, 0x00, 0x2E, 0x03, 0xFE, 0x02, 0x2B, 0x00,
+ 0xE3, 0x03, 0x9F, 0x03, 0x2D, 0x00, 0x98, 0x04,
+ 0x61, 0x04, 0x2F, 0x00, 0x4D, 0x05, 0x4E, 0x05,
+ 0x26, 0x00, 0xA6, 0xFF, 0x3F, 0x02, 0x26, 0x00,
+ 0xF1, 0xFE, 0x3F, 0x02, 0x26, 0x00, 0x3C, 0xFE,
+ 0x3F, 0x02, 0x26, 0x00, 0x87, 0xFD, 0x3F, 0x02,
+ 0x29, 0x00, 0xD2, 0xFC, 0xFE, 0x02, 0x2B, 0x00,
+ 0x1D, 0xFC, 0x9F, 0x03, 0x2D, 0x00, 0x68, 0xFB,
+ 0x61, 0x04, 0x2F, 0x00, 0xB3, 0xFA, 0x4E, 0x05,
+ 0x29, 0x00, 0x5A, 0x00, 0xE4, 0x02, 0x29, 0x00,
+ 0x0F, 0x01, 0xE4, 0x02, 0x29, 0x00, 0xC4, 0x01,
+ 0xE4, 0x02, 0x29, 0x00, 0x79, 0x02, 0xE4, 0x02,
+ 0x2C, 0x00, 0x2E, 0x03, 0xD9, 0x03, 0x2E, 0x00,
+ 0xE3, 0x03, 0xA8, 0x04, 0x30, 0x00, 0x98, 0x04,
+ 0xA2, 0x05, 0x30, 0x00, 0x4D, 0x05, 0xD2, 0x06,
+ 0x29, 0x00, 0xA6, 0xFF, 0xE4, 0x02, 0x29, 0x00,
+ 0xF1, 0xFE, 0xE4, 0x02, 0x29, 0x00, 0x3C, 0xFE,
+ 0xE4, 0x02, 0x29, 0x00, 0x87, 0xFD, 0xE4, 0x02,
+ 0x2C, 0x00, 0xD2, 0xFC, 0xD9, 0x03, 0x2E, 0x00,
+ 0x1D, 0xFC, 0xA8, 0x04, 0x30, 0x00, 0x68, 0xFB,
+ 0xA2, 0x05, 0x30, 0x00, 0xB3, 0xFA, 0xD2, 0x06,
+ 0x2B, 0x00, 0x5A, 0x00, 0x88, 0x03, 0x2B, 0x00,
+ 0x0F, 0x01, 0x88, 0x03, 0x2B, 0x00, 0xC4, 0x01,
+ 0x88, 0x03, 0x2B, 0x00, 0x79, 0x02, 0x88, 0x03,
+ 0x2E, 0x00, 0x2E, 0x03, 0xB4, 0x04, 0x30, 0x00,
+ 0xE3, 0x03, 0xB1, 0x05, 0x30, 0x00, 0x98, 0x04,
+ 0xE2, 0x06, 0x30, 0x00, 0x4D, 0x05, 0x56, 0x08,
+ 0x2B, 0x00, 0xA6, 0xFF, 0x88, 0x03, 0x2B, 0x00,
+ 0xF1, 0xFE, 0x88, 0x03, 0x2B, 0x00, 0x3C, 0xFE,
+ 0x88, 0x03, 0x2B, 0x00, 0x87, 0xFD, 0x88, 0x03,
+ 0x2E, 0x00, 0xD2, 0xFC, 0xB4, 0x04, 0x30, 0x00,
+ 0x1D, 0xFC, 0xB1, 0x05, 0x30, 0x00, 0x68, 0xFB,
+ 0xE2, 0x06, 0x30, 0x00, 0xB3, 0xFA, 0x56, 0x08,
+ 0x2D, 0x00, 0x5A, 0x00, 0x2D, 0x04, 0x2D, 0x00,
+ 0x0F, 0x01, 0x2D, 0x04, 0x2D, 0x00, 0xC4, 0x01,
+ 0x2D, 0x04, 0x2D, 0x00, 0x79, 0x02, 0x2D, 0x04,
+ 0x30, 0x00, 0x2E, 0x03, 0x8F, 0x05, 0x30, 0x00,
+ 0xE3, 0x03, 0xBA, 0x06, 0x30, 0x00, 0x98, 0x04,
+ 0x23, 0x08, 0x30, 0x00, 0x4D, 0x05, 0xDA, 0x09,
+ 0x2D, 0x00, 0xA6, 0xFF, 0x2D, 0x04, 0x2D, 0x00,
+ 0xF1, 0xFE, 0x2D, 0x04, 0x2D, 0x00, 0x3C, 0xFE,
+ 0x2D, 0x04, 0x2D, 0x00, 0x87, 0xFD, 0x2D, 0x04,
+ 0x30, 0x00, 0xD2, 0xFC, 0x8F, 0x05, 0x30, 0x00,
+ 0x1D, 0xFC, 0xBA, 0x06, 0x30, 0x00, 0x68, 0xFB,
+ 0x23, 0x08, 0x30, 0x00, 0xB3, 0xFA, 0xDA, 0x09,
+ 0x2F, 0x00, 0x5A, 0x00, 0xD1, 0x04, 0x2F, 0x00,
+ 0x0F, 0x01, 0xD1, 0x04, 0x2F, 0x00, 0xC4, 0x01,
+ 0xD1, 0x04, 0x2F, 0x00, 0x79, 0x02, 0xD1, 0x04,
+ 0x30, 0x00, 0x2E, 0x03, 0x6A, 0x06, 0x30, 0x00,
+ 0xE3, 0x03, 0xC3, 0x07, 0x30, 0x00, 0x98, 0x04,
+ 0x63, 0x09, 0x30, 0x00, 0x4D, 0x05, 0x5E, 0x0B,
+ 0x2F, 0x00, 0xA6, 0xFF, 0xD1, 0x04, 0x2F, 0x00,
+ 0xF1, 0xFE, 0xD1, 0x04, 0x2F, 0x00, 0x3C, 0xFE,
+ 0xD1, 0x04, 0x2F, 0x00, 0x87, 0xFD, 0xD1, 0x04,
+ 0x30, 0x00, 0xD2, 0xFC, 0x6A, 0x06, 0x30, 0x00,
+ 0x1D, 0xFC, 0xC3, 0x07, 0x30, 0x00, 0x68, 0xFB,
+ 0x63, 0x09, 0x30, 0x00, 0xB3, 0xFA, 0x5E, 0x0B,
+ 0x26, 0x00, 0x5A, 0x00, 0xAE, 0xFF, 0x26, 0x00,
+ 0x0F, 0x01, 0xAE, 0xFF, 0x26, 0x00, 0xC4, 0x01,
+ 0xAE, 0xFF, 0x26, 0x00, 0x79, 0x02, 0xAE, 0xFF,
+ 0x29, 0x00, 0x2E, 0x03, 0x93, 0xFF, 0x2B, 0x00,
+ 0xE3, 0x03, 0x7C, 0xFF, 0x2D, 0x00, 0x98, 0x04,
+ 0x60, 0xFF, 0x2F, 0x00, 0x4D, 0x05, 0x3E, 0xFF,
+ 0x26, 0x00, 0xA6, 0xFF, 0xAE, 0xFF, 0x26, 0x00,
+ 0xF1, 0xFE, 0xAE, 0xFF, 0x26, 0x00, 0x3C, 0xFE,
+ 0xAE, 0xFF, 0x26, 0x00, 0x87, 0xFD, 0xAE, 0xFF,
+ 0x29, 0x00, 0xD2, 0xFC, 0x93, 0xFF, 0x2B, 0x00,
+ 0x1D, 0xFC, 0x7C, 0xFF, 0x2D, 0x00, 0x68, 0xFB,
+ 0x60, 0xFF, 0x2F, 0x00, 0xB3, 0xFA, 0x3E, 0xFF,
+ 0x26, 0x00, 0x5A, 0x00, 0x0A, 0xFF, 0x26, 0x00,
+ 0x0F, 0x01, 0x0A, 0xFF, 0x26, 0x00, 0xC4, 0x01,
+ 0x0A, 0xFF, 0x26, 0x00, 0x79, 0x02, 0x0A, 0xFF,
+ 0x29, 0x00, 0x2E, 0x03, 0xB8, 0xFE, 0x2B, 0x00,
+ 0xE3, 0x03, 0x73, 0xFE, 0x2D, 0x00, 0x98, 0x04,
+ 0x20, 0xFE, 0x2F, 0x00, 0x4D, 0x05, 0xBA, 0xFD,
+ 0x26, 0x00, 0xA6, 0xFF, 0x0A, 0xFF, 0x26, 0x00,
+ 0xF1, 0xFE, 0x0A, 0xFF, 0x26, 0x00, 0x3C, 0xFE,
+ 0x0A, 0xFF, 0x26, 0x00, 0x87, 0xFD, 0x0A, 0xFF,
+ 0x29, 0x00, 0xD2, 0xFC, 0xB8, 0xFE, 0x2B, 0x00,
+ 0x1D, 0xFC, 0x73, 0xFE, 0x2D, 0x00, 0x68, 0xFB,
+ 0x20, 0xFE, 0x2F, 0x00, 0xB3, 0xFA, 0xBA, 0xFD,
+ 0x26, 0x00, 0x5A, 0x00, 0x65, 0xFE, 0x26, 0x00,
+ 0x0F, 0x01, 0x65, 0xFE, 0x26, 0x00, 0xC4, 0x01,
+ 0x65, 0xFE, 0x26, 0x00, 0x79, 0x02, 0x65, 0xFE,
+ 0x29, 0x00, 0x2E, 0x03, 0xDD, 0xFD, 0x2B, 0x00,
+ 0xE3, 0x03, 0x6A, 0xFD, 0x2D, 0x00, 0x98, 0x04,
+ 0xDF, 0xFC, 0x2F, 0x00, 0x4D, 0x05, 0x36, 0xFC,
+ 0x26, 0x00, 0xA6, 0xFF, 0x65, 0xFE, 0x26, 0x00,
+ 0xF1, 0xFE, 0x65, 0xFE, 0x26, 0x00, 0x3C, 0xFE,
+ 0x65, 0xFE, 0x26, 0x00, 0x87, 0xFD, 0x65, 0xFE,
+ 0x29, 0x00, 0xD2, 0xFC, 0xDD, 0xFD, 0x2B, 0x00,
+ 0x1D, 0xFC, 0x6A, 0xFD, 0x2D, 0x00, 0x68, 0xFB,
+ 0xDF, 0xFC, 0x2F, 0x00, 0xB3, 0xFA, 0x36, 0xFC,
+ 0x26, 0x00, 0x5A, 0x00, 0xC1, 0xFD, 0x26, 0x00,
+ 0x0F, 0x01, 0xC1, 0xFD, 0x26, 0x00, 0xC4, 0x01,
+ 0xC1, 0xFD, 0x26, 0x00, 0x79, 0x02, 0xC1, 0xFD,
+ 0x29, 0x00, 0x2E, 0x03, 0x02, 0xFD, 0x2B, 0x00,
+ 0xE3, 0x03, 0x61, 0xFC, 0x2D, 0x00, 0x98, 0x04,
+ 0x9F, 0xFB, 0x2F, 0x00, 0x4D, 0x05, 0xB2, 0xFA,
+ 0x26, 0x00, 0xA6, 0xFF, 0xC1, 0xFD, 0x26, 0x00,
+ 0xF1, 0xFE, 0xC1, 0xFD, 0x26, 0x00, 0x3C, 0xFE,
+ 0xC1, 0xFD, 0x26, 0x00, 0x87, 0xFD, 0xC1, 0xFD,
+ 0x29, 0x00, 0xD2, 0xFC, 0x02, 0xFD, 0x2B, 0x00,
+ 0x1D, 0xFC, 0x61, 0xFC, 0x2D, 0x00, 0x68, 0xFB,
+ 0x9F, 0xFB, 0x2F, 0x00, 0xB3, 0xFA, 0xB2, 0xFA,
+ 0x29, 0x00, 0x5A, 0x00, 0x1C, 0xFD, 0x29, 0x00,
+ 0x0F, 0x01, 0x1C, 0xFD, 0x29, 0x00, 0xC4, 0x01,
+ 0x1C, 0xFD, 0x29, 0x00, 0x79, 0x02, 0x1C, 0xFD,
+ 0x2C, 0x00, 0x2E, 0x03, 0x27, 0xFC, 0x2E, 0x00,
+ 0xE3, 0x03, 0x58, 0xFB, 0x30, 0x00, 0x98, 0x04,
+ 0x5E, 0xFA, 0x30, 0x00, 0x4D, 0x05, 0x2E, 0xF9,
+ 0x29, 0x00, 0xA6, 0xFF, 0x1C, 0xFD, 0x29, 0x00,
+ 0xF1, 0xFE, 0x1C, 0xFD, 0x29, 0x00, 0x3C, 0xFE,
+ 0x1C, 0xFD, 0x29, 0x00, 0x87, 0xFD, 0x1C, 0xFD,
+ 0x2C, 0x00, 0xD2, 0xFC, 0x27, 0xFC, 0x2E, 0x00,
+ 0x1D, 0xFC, 0x58, 0xFB, 0x30, 0x00, 0x68, 0xFB,
+ 0x5E, 0xFA, 0x30, 0x00, 0xB3, 0xFA, 0x2E, 0xF9,
+ 0x2B, 0x00, 0x5A, 0x00, 0x78, 0xFC, 0x2B, 0x00,
+ 0x0F, 0x01, 0x78, 0xFC, 0x2B, 0x00, 0xC4, 0x01,
+ 0x78, 0xFC, 0x2B, 0x00, 0x79, 0x02, 0x78, 0xFC,
+ 0x2E, 0x00, 0x2E, 0x03, 0x4C, 0xFB, 0x30, 0x00,
+ 0xE3, 0x03, 0x4F, 0xFA, 0x30, 0x00, 0x98, 0x04,
+ 0x1E, 0xF9, 0x30, 0x00, 0x4D, 0x05, 0xAA, 0xF7,
+ 0x2B, 0x00, 0xA6, 0xFF, 0x78, 0xFC, 0x2B, 0x00,
+ 0xF1, 0xFE, 0x78, 0xFC, 0x2B, 0x00, 0x3C, 0xFE,
+ 0x78, 0xFC, 0x2B, 0x00, 0x87, 0xFD, 0x78, 0xFC,
+ 0x2E, 0x00, 0xD2, 0xFC, 0x4C, 0xFB, 0x30, 0x00,
+ 0x1D, 0xFC, 0x4F, 0xFA, 0x30, 0x00, 0x68, 0xFB,
+ 0x1E, 0xF9, 0x30, 0x00, 0xB3, 0xFA, 0xAA, 0xF7,
+ 0x2D, 0x00, 0x5A, 0x00, 0xD3, 0xFB, 0x2D, 0x00,
+ 0x0F, 0x01, 0xD3, 0xFB, 0x2D, 0x00, 0xC4, 0x01,
+ 0xD3, 0xFB, 0x2D, 0x00, 0x79, 0x02, 0xD3, 0xFB,
+ 0x30, 0x00, 0x2E, 0x03, 0x71, 0xFA, 0x30, 0x00,
+ 0xE3, 0x03, 0x46, 0xF9, 0x30, 0x00, 0x98, 0x04,
+ 0xDD, 0xF7, 0x30, 0x00, 0x4D, 0x05, 0x26, 0xF6,
+ 0x2D, 0x00, 0xA6, 0xFF, 0xD3, 0xFB, 0x2D, 0x00,
+ 0xF1, 0xFE, 0xD3, 0xFB, 0x2D, 0x00, 0x3C, 0xFE,
+ 0xD3, 0xFB, 0x2D, 0x00, 0x87, 0xFD, 0xD3, 0xFB,
+ 0x30, 0x00, 0xD2, 0xFC, 0x71, 0xFA, 0x30, 0x00,
+ 0x1D, 0xFC, 0x46, 0xF9, 0x30, 0x00, 0x68, 0xFB,
+ 0xDD, 0xF7, 0x30, 0x00, 0xB3, 0xFA, 0x26, 0xF6,
+ 0x2F, 0x00, 0x5A, 0x00, 0x2F, 0xFB, 0x2F, 0x00,
+ 0x0F, 0x01, 0x2F, 0xFB, 0x2F, 0x00, 0xC4, 0x01,
+ 0x2F, 0xFB, 0x2F, 0x00, 0x79, 0x02, 0x2F, 0xFB,
+ 0x30, 0x00, 0x2E, 0x03, 0x96, 0xF9, 0x30, 0x00,
+ 0xE3, 0x03, 0x3D, 0xF8, 0x30, 0x00, 0x98, 0x04,
+ 0x9D, 0xF6, 0x30, 0x00, 0x4D, 0x05, 0xA2, 0xF4,
+ 0x2F, 0x00, 0xA6, 0xFF, 0x2F, 0xFB, 0x2F, 0x00,
+ 0xF1, 0xFE, 0x2F, 0xFB, 0x2F, 0x00, 0x3C, 0xFE,
+ 0x2F, 0xFB, 0x2F, 0x00, 0x87, 0xFD, 0x2F, 0xFB,
+ 0x30, 0x00, 0xD2, 0xFC, 0x96, 0xF9, 0x30, 0x00,
+ 0x1D, 0xFC, 0x3D, 0xF8, 0x30, 0x00, 0x68, 0xFB,
+ 0x9D, 0xF6, 0x30, 0x00, 0xB3, 0xFA, 0xA2, 0xF4,
+ 0x27, 0x00, 0x63, 0x00, 0x5A, 0x00, 0x27, 0x00,
+ 0x2A, 0x01, 0x5A, 0x00, 0x27, 0x00, 0xF1, 0x01,
+ 0x5A, 0x00, 0x27, 0x00, 0xB8, 0x02, 0x5A, 0x00,
+ 0x2A, 0x00, 0x7F, 0x03, 0x78, 0x00, 0x2C, 0x00,
+ 0x46, 0x04, 0x91, 0x00, 0x2E, 0x00, 0x0D, 0x05,
+ 0xB0, 0x00, 0x2F, 0x00, 0xD4, 0x05, 0xC2, 0x00,
+ 0x27, 0x00, 0x9D, 0xFF, 0x5A, 0x00, 0x27, 0x00,
+ 0xD6, 0xFE, 0x5A, 0x00, 0x27, 0x00, 0x0F, 0xFE,
+ 0x5A, 0x00, 0x27, 0x00, 0x48, 0xFD, 0x5A, 0x00,
+ 0x2A, 0x00, 0x81, 0xFC, 0x78, 0x00, 0x2C, 0x00,
+ 0xBA, 0xFB, 0x91, 0x00, 0x2E, 0x00, 0xF3, 0xFA,
+ 0xB0, 0x00, 0x2F, 0x00, 0x2C, 0xFA, 0xC2, 0x00,
+ 0x27, 0x00, 0x63, 0x00, 0x0F, 0x01, 0x27, 0x00,
+ 0x2A, 0x01, 0x0F, 0x01, 0x27, 0x00, 0xF1, 0x01,
+ 0x0F, 0x01, 0x27, 0x00, 0xB8, 0x02, 0x0F, 0x01,
+ 0x2A, 0x00, 0x7F, 0x03, 0x68, 0x01, 0x2C, 0x00,
+ 0x46, 0x04, 0xB4, 0x01, 0x2E, 0x00, 0x0D, 0x05,
+ 0x10, 0x02, 0x2F, 0x00, 0xD4, 0x05, 0x46, 0x02,
+ 0x27, 0x00, 0x9D, 0xFF, 0x0F, 0x01, 0x27, 0x00,
+ 0xD6, 0xFE, 0x0F, 0x01, 0x27, 0x00, 0x0F, 0xFE,
+ 0x0F, 0x01, 0x27, 0x00, 0x48, 0xFD, 0x0F, 0x01,
+ 0x2A, 0x00, 0x81, 0xFC, 0x68, 0x01, 0x2C, 0x00,
+ 0xBA, 0xFB, 0xB4, 0x01, 0x2E, 0x00, 0xF3, 0xFA,
+ 0x10, 0x02, 0x2F, 0x00, 0x2C, 0xFA, 0x46, 0x02,
+ 0x27, 0x00, 0x63, 0x00, 0xC4, 0x01, 0x27, 0x00,
+ 0x2A, 0x01, 0xC4, 0x01, 0x27, 0x00, 0xF1, 0x01,
+ 0xC4, 0x01, 0x27, 0x00, 0xB8, 0x02, 0xC4, 0x01,
+ 0x2A, 0x00, 0x7F, 0x03, 0x59, 0x02, 0x2C, 0x00,
+ 0x46, 0x04, 0xD8, 0x02, 0x2E, 0x00, 0x0D, 0x05,
+ 0x71, 0x03, 0x2F, 0x00, 0xD4, 0x05, 0xCA, 0x03,
+ 0x27, 0x00, 0x9D, 0xFF, 0xC4, 0x01, 0x27, 0x00,
+ 0xD6, 0xFE, 0xC4, 0x01, 0x27, 0x00, 0x0F, 0xFE,
+ 0xC4, 0x01, 0x27, 0x00, 0x48, 0xFD, 0xC4, 0x01,
+ 0x2A, 0x00, 0x81, 0xFC, 0x59, 0x02, 0x2C, 0x00,
+ 0xBA, 0xFB, 0xD8, 0x02, 0x2E, 0x00, 0xF3, 0xFA,
+ 0x71, 0x03, 0x2F, 0x00, 0x2C, 0xFA, 0xCA, 0x03,
+ 0x27, 0x00, 0x63, 0x00, 0x79, 0x02, 0x27, 0x00,
+ 0x2A, 0x01, 0x79, 0x02, 0x27, 0x00, 0xF1, 0x01,
+ 0x79, 0x02, 0x27, 0x00, 0xB8, 0x02, 0x79, 0x02,
+ 0x2A, 0x00, 0x7F, 0x03, 0x49, 0x03, 0x2C, 0x00,
+ 0x46, 0x04, 0xFB, 0x03, 0x2E, 0x00, 0x0D, 0x05,
+ 0xD1, 0x04, 0x2F, 0x00, 0xD4, 0x05, 0x4E, 0x05,
+ 0x27, 0x00, 0x9D, 0xFF, 0x79, 0x02, 0x27, 0x00,
+ 0xD6, 0xFE, 0x79, 0x02, 0x27, 0x00, 0x0F, 0xFE,
+ 0x79, 0x02, 0x27, 0x00, 0x48, 0xFD, 0x79, 0x02,
+ 0x2A, 0x00, 0x81, 0xFC, 0x49, 0x03, 0x2C, 0x00,
+ 0xBA, 0xFB, 0xFB, 0x03, 0x2E, 0x00, 0xF3, 0xFA,
+ 0xD1, 0x04, 0x2F, 0x00, 0x2C, 0xFA, 0x4E, 0x05,
+ 0x2A, 0x00, 0x63, 0x00, 0x2E, 0x03, 0x2A, 0x00,
+ 0x2A, 0x01, 0x2E, 0x03, 0x2A, 0x00, 0xF1, 0x01,
+ 0x2E, 0x03, 0x2A, 0x00, 0xB8, 0x02, 0x2E, 0x03,
+ 0x2D, 0x00, 0x7F, 0x03, 0x3B, 0x04, 0x2F, 0x00,
+ 0x46, 0x04, 0x1F, 0x05, 0x30, 0x00, 0x0D, 0x05,
+ 0x33, 0x06, 0x30, 0x00, 0xD4, 0x05, 0xD2, 0x06,
+ 0x2A, 0x00, 0x9D, 0xFF, 0x2E, 0x03, 0x2A, 0x00,
+ 0xD6, 0xFE, 0x2E, 0x03, 0x2A, 0x00, 0x0F, 0xFE,
+ 0x2E, 0x03, 0x2A, 0x00, 0x48, 0xFD, 0x2E, 0x03,
+ 0x2D, 0x00, 0x81, 0xFC, 0x3B, 0x04, 0x2F, 0x00,
+ 0xBA, 0xFB, 0x1F, 0x05, 0x30, 0x00, 0xF3, 0xFA,
+ 0x33, 0x06, 0x30, 0x00, 0x2C, 0xFA, 0xD2, 0x06,
+ 0x2C, 0x00, 0x63, 0x00, 0xE3, 0x03, 0x2C, 0x00,
+ 0x2A, 0x01, 0xE3, 0x03, 0x2C, 0x00, 0xF1, 0x01,
+ 0xE3, 0x03, 0x2C, 0x00, 0xB8, 0x02, 0xE3, 0x03,
+ 0x2F, 0x00, 0x7F, 0x03, 0x2B, 0x05, 0x30, 0x00,
+ 0x46, 0x04, 0x42, 0x06, 0x30, 0x00, 0x0D, 0x05,
+ 0x93, 0x07, 0x30, 0x00, 0xD4, 0x05, 0x56, 0x08,
+ 0x2C, 0x00, 0x9D, 0xFF, 0xE3, 0x03, 0x2C, 0x00,
+ 0xD6, 0xFE, 0xE3, 0x03, 0x2C, 0x00, 0x0F, 0xFE,
+ 0xE3, 0x03, 0x2C, 0x00, 0x48, 0xFD, 0xE3, 0x03,
+ 0x2F, 0x00, 0x81, 0xFC, 0x2B, 0x05, 0x30, 0x00,
+ 0xBA, 0xFB, 0x42, 0x06, 0x30, 0x00, 0xF3, 0xFA,
+ 0x93, 0x07, 0x30, 0x00, 0x2C, 0xFA, 0x56, 0x08,
+ 0x2E, 0x00, 0x63, 0x00, 0x98, 0x04, 0x2E, 0x00,
+ 0x2A, 0x01, 0x98, 0x04, 0x2E, 0x00, 0xF1, 0x01,
+ 0x98, 0x04, 0x2E, 0x00, 0xB8, 0x02, 0x98, 0x04,
+ 0x30, 0x00, 0x7F, 0x03, 0x1C, 0x06, 0x30, 0x00,
+ 0x46, 0x04, 0x66, 0x07, 0x30, 0x00, 0x0D, 0x05,
+ 0xF4, 0x08, 0x30, 0x00, 0xD4, 0x05, 0xDA, 0x09,
+ 0x2E, 0x00, 0x9D, 0xFF, 0x98, 0x04, 0x2E, 0x00,
+ 0xD6, 0xFE, 0x98, 0x04, 0x2E, 0x00, 0x0F, 0xFE,
+ 0x98, 0x04, 0x2E, 0x00, 0x48, 0xFD, 0x98, 0x04,
+ 0x30, 0x00, 0x81, 0xFC, 0x1C, 0x06, 0x30, 0x00,
+ 0xBA, 0xFB, 0x66, 0x07, 0x30, 0x00, 0xF3, 0xFA,
+ 0xF4, 0x08, 0x30, 0x00, 0x2C, 0xFA, 0xDA, 0x09,
+ 0x30, 0x00, 0x63, 0x00, 0x4D, 0x05, 0x30, 0x00,
+ 0x2A, 0x01, 0x4D, 0x05, 0x30, 0x00, 0xF1, 0x01,
+ 0x4D, 0x05, 0x30, 0x00, 0xB8, 0x02, 0x4D, 0x05,
+ 0x30, 0x00, 0x7F, 0x03, 0x0C, 0x07, 0x30, 0x00,
+ 0x46, 0x04, 0x89, 0x08, 0x30, 0x00, 0x0D, 0x05,
+ 0x54, 0x0A, 0x30, 0x00, 0xD4, 0x05, 0x5E, 0x0B,
+ 0x30, 0x00, 0x9D, 0xFF, 0x4D, 0x05, 0x30, 0x00,
+ 0xD6, 0xFE, 0x4D, 0x05, 0x30, 0x00, 0x0F, 0xFE,
+ 0x4D, 0x05, 0x30, 0x00, 0x48, 0xFD, 0x4D, 0x05,
+ 0x30, 0x00, 0x81, 0xFC, 0x0C, 0x07, 0x30, 0x00,
+ 0xBA, 0xFB, 0x89, 0x08, 0x30, 0x00, 0xF3, 0xFA,
+ 0x54, 0x0A, 0x30, 0x00, 0x2C, 0xFA, 0x5E, 0x0B,
+ 0x27, 0x00, 0x63, 0x00, 0xA6, 0xFF, 0x27, 0x00,
+ 0x2A, 0x01, 0xA6, 0xFF, 0x27, 0x00, 0xF1, 0x01,
+ 0xA6, 0xFF, 0x27, 0x00, 0xB8, 0x02, 0xA6, 0xFF,
+ 0x2A, 0x00, 0x7F, 0x03, 0x88, 0xFF, 0x2C, 0x00,
+ 0x46, 0x04, 0x6F, 0xFF, 0x2E, 0x00, 0x0D, 0x05,
+ 0x50, 0xFF, 0x2F, 0x00, 0xD4, 0x05, 0x3E, 0xFF,
+ 0x27, 0x00, 0x9D, 0xFF, 0xA6, 0xFF, 0x27, 0x00,
+ 0xD6, 0xFE, 0xA6, 0xFF, 0x27, 0x00, 0x0F, 0xFE,
+ 0xA6, 0xFF, 0x27, 0x00, 0x48, 0xFD, 0xA6, 0xFF,
+ 0x2A, 0x00, 0x81, 0xFC, 0x88, 0xFF, 0x2C, 0x00,
+ 0xBA, 0xFB, 0x6F, 0xFF, 0x2E, 0x00, 0xF3, 0xFA,
+ 0x50, 0xFF, 0x2F, 0x00, 0x2C, 0xFA, 0x3E, 0xFF,
+ 0x27, 0x00, 0x63, 0x00, 0xF1, 0xFE, 0x27, 0x00,
+ 0x2A, 0x01, 0xF1, 0xFE, 0x27, 0x00, 0xF1, 0x01,
+ 0xF1, 0xFE, 0x27, 0x00, 0xB8, 0x02, 0xF1, 0xFE,
+ 0x2A, 0x00, 0x7F, 0x03, 0x98, 0xFE, 0x2C, 0x00,
+ 0x46, 0x04, 0x4C, 0xFE, 0x2E, 0x00, 0x0D, 0x05,
+ 0xF0, 0xFD, 0x2F, 0x00, 0xD4, 0x05, 0xBA, 0xFD,
+ 0x27, 0x00, 0x9D, 0xFF, 0xF1, 0xFE, 0x27, 0x00,
+ 0xD6, 0xFE, 0xF1, 0xFE, 0x27, 0x00, 0x0F, 0xFE,
+ 0xF1, 0xFE, 0x27, 0x00, 0x48, 0xFD, 0xF1, 0xFE,
+ 0x2A, 0x00, 0x81, 0xFC, 0x98, 0xFE, 0x2C, 0x00,
+ 0xBA, 0xFB, 0x4C, 0xFE, 0x2E, 0x00, 0xF3, 0xFA,
+ 0xF0, 0xFD, 0x2F, 0x00, 0x2C, 0xFA, 0xBA, 0xFD,
+ 0x27, 0x00, 0x63, 0x00, 0x3C, 0xFE, 0x27, 0x00,
+ 0x2A, 0x01, 0x3C, 0xFE, 0x27, 0x00, 0xF1, 0x01,
+ 0x3C, 0xFE, 0x27, 0x00, 0xB8, 0x02, 0x3C, 0xFE,
+ 0x2A, 0x00, 0x7F, 0x03, 0xA7, 0xFD, 0x2C, 0x00,
+ 0x46, 0x04, 0x28, 0xFD, 0x2E, 0x00, 0x0D, 0x05,
+ 0x8F, 0xFC, 0x2F, 0x00, 0xD4, 0x05, 0x36, 0xFC,
+ 0x27, 0x00, 0x9D, 0xFF, 0x3C, 0xFE, 0x27, 0x00,
+ 0xD6, 0xFE, 0x3C, 0xFE, 0x27, 0x00, 0x0F, 0xFE,
+ 0x3C, 0xFE, 0x27, 0x00, 0x48, 0xFD, 0x3C, 0xFE,
+ 0x2A, 0x00, 0x81, 0xFC, 0xA7, 0xFD, 0x2C, 0x00,
+ 0xBA, 0xFB, 0x28, 0xFD, 0x2E, 0x00, 0xF3, 0xFA,
+ 0x8F, 0xFC, 0x2F, 0x00, 0x2C, 0xFA, 0x36, 0xFC,
+ 0x27, 0x00, 0x63, 0x00, 0x87, 0xFD, 0x27, 0x00,
+ 0x2A, 0x01, 0x87, 0xFD, 0x27, 0x00, 0xF1, 0x01,
+ 0x87, 0xFD, 0x27, 0x00, 0xB8, 0x02, 0x87, 0xFD,
+ 0x2A, 0x00, 0x7F, 0x03, 0xB7, 0xFC, 0x2C, 0x00,
+ 0x46, 0x04, 0x05, 0xFC, 0x2E, 0x00, 0x0D, 0x05,
+ 0x2F, 0xFB, 0x2F, 0x00, 0xD4, 0x05, 0xB2, 0xFA,
+ 0x27, 0x00, 0x9D, 0xFF, 0x87, 0xFD, 0x27, 0x00,
+ 0xD6, 0xFE, 0x87, 0xFD, 0x27, 0x00, 0x0F, 0xFE,
+ 0x87, 0xFD, 0x27, 0x00, 0x48, 0xFD, 0x87, 0xFD,
+ 0x2A, 0x00, 0x81, 0xFC, 0xB7, 0xFC, 0x2C, 0x00,
+ 0xBA, 0xFB, 0x05, 0xFC, 0x2E, 0x00, 0xF3, 0xFA,
+ 0x2F, 0xFB, 0x2F, 0x00, 0x2C, 0xFA, 0xB2, 0xFA,
+ 0x2A, 0x00, 0x63, 0x00, 0xD2, 0xFC, 0x2A, 0x00,
+ 0x2A, 0x01, 0xD2, 0xFC, 0x2A, 0x00, 0xF1, 0x01,
+ 0xD2, 0xFC, 0x2A, 0x00, 0xB8, 0x02, 0xD2, 0xFC,
+ 0x2D, 0x00, 0x7F, 0x03, 0xC5, 0xFB, 0x2F, 0x00,
+ 0x46, 0x04, 0xE1, 0xFA, 0x30, 0x00, 0x0D, 0x05,
+ 0xCD, 0xF9, 0x30, 0x00, 0xD4, 0x05, 0x2E, 0xF9,
+ 0x2A, 0x00, 0x9D, 0xFF, 0xD2, 0xFC, 0x2A, 0x00,
+ 0xD6, 0xFE, 0xD2, 0xFC, 0x2A, 0x00, 0x0F, 0xFE,
+ 0xD2, 0xFC, 0x2A, 0x00, 0x48, 0xFD, 0xD2, 0xFC,
+ 0x2D, 0x00, 0x81, 0xFC, 0xC5, 0xFB, 0x2F, 0x00,
+ 0xBA, 0xFB, 0xE1, 0xFA, 0x30, 0x00, 0xF3, 0xFA,
+ 0xCD, 0xF9, 0x30, 0x00, 0x2C, 0xFA, 0x2E, 0xF9,
+ 0x2C, 0x00, 0x63, 0x00, 0x1D, 0xFC, 0x2C, 0x00,
+ 0x2A, 0x01, 0x1D, 0xFC, 0x2C, 0x00, 0xF1, 0x01,
+ 0x1D, 0xFC, 0x2C, 0x00, 0xB8, 0x02, 0x1D, 0xFC,
+ 0x2F, 0x00, 0x7F, 0x03, 0xD5, 0xFA, 0x30, 0x00,
+ 0x46, 0x04, 0xBE, 0xF9, 0x30, 0x00, 0x0D, 0x05,
+ 0x6D, 0xF8, 0x30, 0x00, 0xD4, 0x05, 0xAA, 0xF7,
+ 0x2C, 0x00, 0x9D, 0xFF, 0x1D, 0xFC, 0x2C, 0x00,
+ 0xD6, 0xFE, 0x1D, 0xFC, 0x2C, 0x00, 0x0F, 0xFE,
+ 0x1D, 0xFC, 0x2C, 0x00, 0x48, 0xFD, 0x1D, 0xFC,
+ 0x2F, 0x00, 0x81, 0xFC, 0xD5, 0xFA, 0x30, 0x00,
+ 0xBA, 0xFB, 0xBE, 0xF9, 0x30, 0x00, 0xF3, 0xFA,
+ 0x6D, 0xF8, 0x30, 0x00, 0x2C, 0xFA, 0xAA, 0xF7,
+ 0x2E, 0x00, 0x63, 0x00, 0x68, 0xFB, 0x2E, 0x00,
+ 0x2A, 0x01, 0x68, 0xFB, 0x2E, 0x00, 0xF1, 0x01,
+ 0x68, 0xFB, 0x2E, 0x00, 0xB8, 0x02, 0x68, 0xFB,
+ 0x30, 0x00, 0x7F, 0x03, 0xE4, 0xF9, 0x30, 0x00,
+ 0x46, 0x04, 0x9A, 0xF8, 0x30, 0x00, 0x0D, 0x05,
+ 0x0C, 0xF7, 0x30, 0x00, 0xD4, 0x05, 0x26, 0xF6,
+ 0x2E, 0x00, 0x9D, 0xFF, 0x68, 0xFB, 0x2E, 0x00,
+ 0xD6, 0xFE, 0x68, 0xFB, 0x2E, 0x00, 0x0F, 0xFE,
+ 0x68, 0xFB, 0x2E, 0x00, 0x48, 0xFD, 0x68, 0xFB,
+ 0x30, 0x00, 0x81, 0xFC, 0xE4, 0xF9, 0x30, 0x00,
+ 0xBA, 0xFB, 0x9A, 0xF8, 0x30, 0x00, 0xF3, 0xFA,
+ 0x0C, 0xF7, 0x30, 0x00, 0x2C, 0xFA, 0x26, 0xF6,
+ 0x30, 0x00, 0x63, 0x00, 0xB3, 0xFA, 0x30, 0x00,
+ 0x2A, 0x01, 0xB3, 0xFA, 0x30, 0x00, 0xF1, 0x01,
+ 0xB3, 0xFA, 0x30, 0x00, 0xB8, 0x02, 0xB3, 0xFA,
+ 0x30, 0x00, 0x7F, 0x03, 0xF4, 0xF8, 0x30, 0x00,
+ 0x46, 0x04, 0x77, 0xF7, 0x30, 0x00, 0x0D, 0x05,
+ 0xAC, 0xF5, 0x30, 0x00, 0xD4, 0x05, 0xA2, 0xF4,
+ 0x30, 0x00, 0x9D, 0xFF, 0xB3, 0xFA, 0x30, 0x00,
+ 0xD6, 0xFE, 0xB3, 0xFA, 0x30, 0x00, 0x0F, 0xFE,
+ 0xB3, 0xFA, 0x30, 0x00, 0x48, 0xFD, 0xB3, 0xFA,
+ 0x30, 0x00, 0x81, 0xFC, 0xF4, 0xF8, 0x30, 0x00,
+ 0xBA, 0xFB, 0x77, 0xF7, 0x30, 0x00, 0xF3, 0xFA,
+ 0xAC, 0xF5, 0x30, 0x00, 0x2C, 0xFA, 0xA2, 0xF4,
+ 0x28, 0x00, 0x6D, 0x00, 0x63, 0x00, 0x28, 0x00,
+ 0x48, 0x01, 0x63, 0x00, 0x28, 0x00, 0x23, 0x02,
+ 0x63, 0x00, 0x28, 0x00, 0xFE, 0x02, 0x63, 0x00,
+ 0x2B, 0x00, 0xD9, 0x03, 0x84, 0x00, 0x2D, 0x00,
+ 0xB4, 0x04, 0xA0, 0x00, 0x2F, 0x00, 0x8F, 0x05,
+ 0xC2, 0x00, 0x2F, 0x00, 0x6A, 0x06, 0xC2, 0x00,
+ 0x28, 0x00, 0x93, 0xFF, 0x63, 0x00, 0x28, 0x00,
+ 0xB8, 0xFE, 0x63, 0x00, 0x28, 0x00, 0xDD, 0xFD,
+ 0x63, 0x00, 0x28, 0x00, 0x02, 0xFD, 0x63, 0x00,
+ 0x2B, 0x00, 0x27, 0xFC, 0x84, 0x00, 0x2D, 0x00,
+ 0x4C, 0xFB, 0xA0, 0x00, 0x2F, 0x00, 0x71, 0xFA,
+ 0xC2, 0x00, 0x2F, 0x00, 0x96, 0xF9, 0xC2, 0x00,
+ 0x28, 0x00, 0x6D, 0x00, 0x2A, 0x01, 0x28, 0x00,
+ 0x48, 0x01, 0x2A, 0x01, 0x28, 0x00, 0x23, 0x02,
+ 0x2A, 0x01, 0x28, 0x00, 0xFE, 0x02, 0x2A, 0x01,
+ 0x2B, 0x00, 0xD9, 0x03, 0x8D, 0x01, 0x2D, 0x00,
+ 0xB4, 0x04, 0xE0, 0x01, 0x2F, 0x00, 0x8F, 0x05,
+ 0x46, 0x02, 0x2F, 0x00, 0x6A, 0x06, 0x46, 0x02,
+ 0x28, 0x00, 0x93, 0xFF, 0x2A, 0x01, 0x28, 0x00,
+ 0xB8, 0xFE, 0x2A, 0x01, 0x28, 0x00, 0xDD, 0xFD,
+ 0x2A, 0x01, 0x28, 0x00, 0x02, 0xFD, 0x2A, 0x01,
+ 0x2B, 0x00, 0x27, 0xFC, 0x8D, 0x01, 0x2D, 0x00,
+ 0x4C, 0xFB, 0xE0, 0x01, 0x2F, 0x00, 0x71, 0xFA,
+ 0x46, 0x02, 0x2F, 0x00, 0x96, 0xF9, 0x46, 0x02,
+ 0x28, 0x00, 0x6D, 0x00, 0xF1, 0x01, 0x28, 0x00,
+ 0x48, 0x01, 0xF1, 0x01, 0x28, 0x00, 0x23, 0x02,
+ 0xF1, 0x01, 0x28, 0x00, 0xFE, 0x02, 0xF1, 0x01,
+ 0x2B, 0x00, 0xD9, 0x03, 0x96, 0x02, 0x2D, 0x00,
+ 0xB4, 0x04, 0x21, 0x03, 0x2F, 0x00, 0x8F, 0x05,
+ 0xCA, 0x03, 0x2F, 0x00, 0x6A, 0x06, 0xCA, 0x03,
+ 0x28, 0x00, 0x93, 0xFF, 0xF1, 0x01, 0x28, 0x00,
+ 0xB8, 0xFE, 0xF1, 0x01, 0x28, 0x00, 0xDD, 0xFD,
+ 0xF1, 0x01, 0x28, 0x00, 0x02, 0xFD, 0xF1, 0x01,
+ 0x2B, 0x00, 0x27, 0xFC, 0x96, 0x02, 0x2D, 0x00,
+ 0x4C, 0xFB, 0x21, 0x03, 0x2F, 0x00, 0x71, 0xFA,
+ 0xCA, 0x03, 0x2F, 0x00, 0x96, 0xF9, 0xCA, 0x03,
+ 0x28, 0x00, 0x6D, 0x00, 0xB8, 0x02, 0x28, 0x00,
+ 0x48, 0x01, 0xB8, 0x02, 0x28, 0x00, 0x23, 0x02,
+ 0xB8, 0x02, 0x28, 0x00, 0xFE, 0x02, 0xB8, 0x02,
+ 0x2B, 0x00, 0xD9, 0x03, 0x9F, 0x03, 0x2D, 0x00,
+ 0xB4, 0x04, 0x61, 0x04, 0x2F, 0x00, 0x8F, 0x05,
+ 0x4E, 0x05, 0x2F, 0x00, 0x6A, 0x06, 0x4E, 0x05,
+ 0x28, 0x00, 0x93, 0xFF, 0xB8, 0x02, 0x28, 0x00,
+ 0xB8, 0xFE, 0xB8, 0x02, 0x28, 0x00, 0xDD, 0xFD,
+ 0xB8, 0x02, 0x28, 0x00, 0x02, 0xFD, 0xB8, 0x02,
+ 0x2B, 0x00, 0x27, 0xFC, 0x9F, 0x03, 0x2D, 0x00,
+ 0x4C, 0xFB, 0x61, 0x04, 0x2F, 0x00, 0x71, 0xFA,
+ 0x4E, 0x05, 0x2F, 0x00, 0x96, 0xF9, 0x4E, 0x05,
+ 0x2B, 0x00, 0x6D, 0x00, 0x7F, 0x03, 0x2B, 0x00,
+ 0x48, 0x01, 0x7F, 0x03, 0x2B, 0x00, 0x23, 0x02,
+ 0x7F, 0x03, 0x2B, 0x00, 0xFE, 0x02, 0x7F, 0x03,
+ 0x2E, 0x00, 0xD9, 0x03, 0xA8, 0x04, 0x30, 0x00,
+ 0xB4, 0x04, 0xA2, 0x05, 0x30, 0x00, 0x8F, 0x05,
+ 0xD2, 0x06, 0x30, 0x00, 0x6A, 0x06, 0xD2, 0x06,
+ 0x2B, 0x00, 0x93, 0xFF, 0x7F, 0x03, 0x2B, 0x00,
+ 0xB8, 0xFE, 0x7F, 0x03, 0x2B, 0x00, 0xDD, 0xFD,
+ 0x7F, 0x03, 0x2B, 0x00, 0x02, 0xFD, 0x7F, 0x03,
+ 0x2E, 0x00, 0x27, 0xFC, 0xA8, 0x04, 0x30, 0x00,
+ 0x4C, 0xFB, 0xA2, 0x05, 0x30, 0x00, 0x71, 0xFA,
+ 0xD2, 0x06, 0x30, 0x00, 0x96, 0xF9, 0xD2, 0x06,
+ 0x2D, 0x00, 0x6D, 0x00, 0x46, 0x04, 0x2D, 0x00,
+ 0x48, 0x01, 0x46, 0x04, 0x2D, 0x00, 0x23, 0x02,
+ 0x46, 0x04, 0x2D, 0x00, 0xFE, 0x02, 0x46, 0x04,
+ 0x30, 0x00, 0xD9, 0x03, 0xB1, 0x05, 0x30, 0x00,
+ 0xB4, 0x04, 0xE2, 0x06, 0x30, 0x00, 0x8F, 0x05,
+ 0x56, 0x08, 0x30, 0x00, 0x6A, 0x06, 0x56, 0x08,
+ 0x2D, 0x00, 0x93, 0xFF, 0x46, 0x04, 0x2D, 0x00,
+ 0xB8, 0xFE, 0x46, 0x04, 0x2D, 0x00, 0xDD, 0xFD,
+ 0x46, 0x04, 0x2D, 0x00, 0x02, 0xFD, 0x46, 0x04,
+ 0x30, 0x00, 0x27, 0xFC, 0xB1, 0x05, 0x30, 0x00,
+ 0x4C, 0xFB, 0xE2, 0x06, 0x30, 0x00, 0x71, 0xFA,
+ 0x56, 0x08, 0x30, 0x00, 0x96, 0xF9, 0x56, 0x08,
+ 0x2F, 0x00, 0x6D, 0x00, 0x0D, 0x05, 0x2F, 0x00,
+ 0x48, 0x01, 0x0D, 0x05, 0x2F, 0x00, 0x23, 0x02,
+ 0x0D, 0x05, 0x2F, 0x00, 0xFE, 0x02, 0x0D, 0x05,
+ 0x30, 0x00, 0xD9, 0x03, 0xBA, 0x06, 0x30, 0x00,
+ 0xB4, 0x04, 0x23, 0x08, 0x30, 0x00, 0x8F, 0x05,
+ 0xDA, 0x09, 0x30, 0x00, 0x6A, 0x06, 0xDA, 0x09,
+ 0x2F, 0x00, 0x93, 0xFF, 0x0D, 0x05, 0x2F, 0x00,
+ 0xB8, 0xFE, 0x0D, 0x05, 0x2F, 0x00, 0xDD, 0xFD,
+ 0x0D, 0x05, 0x2F, 0x00, 0x02, 0xFD, 0x0D, 0x05,
+ 0x30, 0x00, 0x27, 0xFC, 0xBA, 0x06, 0x30, 0x00,
+ 0x4C, 0xFB, 0x23, 0x08, 0x30, 0x00, 0x71, 0xFA,
+ 0xDA, 0x09, 0x30, 0x00, 0x96, 0xF9, 0xDA, 0x09,
+ 0x30, 0x00, 0x6D, 0x00, 0xD4, 0x05, 0x30, 0x00,
+ 0x48, 0x01, 0xD4, 0x05, 0x30, 0x00, 0x23, 0x02,
+ 0xD4, 0x05, 0x30, 0x00, 0xFE, 0x02, 0xD4, 0x05,
+ 0x30, 0x00, 0xD9, 0x03, 0xC3, 0x07, 0x30, 0x00,
+ 0xB4, 0x04, 0x63, 0x09, 0x30, 0x00, 0x8F, 0x05,
+ 0x5E, 0x0B, 0x30, 0x00, 0x6A, 0x06, 0x5E, 0x0B,
+ 0x30, 0x00, 0x93, 0xFF, 0xD4, 0x05, 0x30, 0x00,
+ 0xB8, 0xFE, 0xD4, 0x05, 0x30, 0x00, 0xDD, 0xFD,
+ 0xD4, 0x05, 0x30, 0x00, 0x02, 0xFD, 0xD4, 0x05,
+ 0x30, 0x00, 0x27, 0xFC, 0xC3, 0x07, 0x30, 0x00,
+ 0x4C, 0xFB, 0x63, 0x09, 0x30, 0x00, 0x71, 0xFA,
+ 0x5E, 0x0B, 0x30, 0x00, 0x96, 0xF9, 0x5E, 0x0B,
+ 0x28, 0x00, 0x6D, 0x00, 0x9D, 0xFF, 0x28, 0x00,
+ 0x48, 0x01, 0x9D, 0xFF, 0x28, 0x00, 0x23, 0x02,
+ 0x9D, 0xFF, 0x28, 0x00, 0xFE, 0x02, 0x9D, 0xFF,
+ 0x2B, 0x00, 0xD9, 0x03, 0x7C, 0xFF, 0x2D, 0x00,
+ 0xB4, 0x04, 0x60, 0xFF, 0x2F, 0x00, 0x8F, 0x05,
+ 0x3E, 0xFF, 0x2F, 0x00, 0x6A, 0x06, 0x3E, 0xFF,
+ 0x28, 0x00, 0x93, 0xFF, 0x9D, 0xFF, 0x28, 0x00,
+ 0xB8, 0xFE, 0x9D, 0xFF, 0x28, 0x00, 0xDD, 0xFD,
+ 0x9D, 0xFF, 0x28, 0x00, 0x02, 0xFD, 0x9D, 0xFF,
+ 0x2B, 0x00, 0x27, 0xFC, 0x7C, 0xFF, 0x2D, 0x00,
+ 0x4C, 0xFB, 0x60, 0xFF, 0x2F, 0x00, 0x71, 0xFA,
+ 0x3E, 0xFF, 0x2F, 0x00, 0x96, 0xF9, 0x3E, 0xFF,
+ 0x28, 0x00, 0x6D, 0x00, 0xD6, 0xFE, 0x28, 0x00,
+ 0x48, 0x01, 0xD6, 0xFE, 0x28, 0x00, 0x23, 0x02,
+ 0xD6, 0xFE, 0x28, 0x00, 0xFE, 0x02, 0xD6, 0xFE,
+ 0x2B, 0x00, 0xD9, 0x03, 0x73, 0xFE, 0x2D, 0x00,
+ 0xB4, 0x04, 0x20, 0xFE, 0x2F, 0x00, 0x8F, 0x05,
+ 0xBA, 0xFD, 0x2F, 0x00, 0x6A, 0x06, 0xBA, 0xFD,
+ 0x28, 0x00, 0x93, 0xFF, 0xD6, 0xFE, 0x28, 0x00,
+ 0xB8, 0xFE, 0xD6, 0xFE, 0x28, 0x00, 0xDD, 0xFD,
+ 0xD6, 0xFE, 0x28, 0x00, 0x02, 0xFD, 0xD6, 0xFE,
+ 0x2B, 0x00, 0x27, 0xFC, 0x73, 0xFE, 0x2D, 0x00,
+ 0x4C, 0xFB, 0x20, 0xFE, 0x2F, 0x00, 0x71, 0xFA,
+ 0xBA, 0xFD, 0x2F, 0x00, 0x96, 0xF9, 0xBA, 0xFD,
+ 0x28, 0x00, 0x6D, 0x00, 0x0F, 0xFE, 0x28, 0x00,
+ 0x48, 0x01, 0x0F, 0xFE, 0x28, 0x00, 0x23, 0x02,
+ 0x0F, 0xFE, 0x28, 0x00, 0xFE, 0x02, 0x0F, 0xFE,
+ 0x2B, 0x00, 0xD9, 0x03, 0x6A, 0xFD, 0x2D, 0x00,
+ 0xB4, 0x04, 0xDF, 0xFC, 0x2F, 0x00, 0x8F, 0x05,
+ 0x36, 0xFC, 0x2F, 0x00, 0x6A, 0x06, 0x36, 0xFC,
+ 0x28, 0x00, 0x93, 0xFF, 0x0F, 0xFE, 0x28, 0x00,
+ 0xB8, 0xFE, 0x0F, 0xFE, 0x28, 0x00, 0xDD, 0xFD,
+ 0x0F, 0xFE, 0x28, 0x00, 0x02, 0xFD, 0x0F, 0xFE,
+ 0x2B, 0x00, 0x27, 0xFC, 0x6A, 0xFD, 0x2D, 0x00,
+ 0x4C, 0xFB, 0xDF, 0xFC, 0x2F, 0x00, 0x71, 0xFA,
+ 0x36, 0xFC, 0x2F, 0x00, 0x96, 0xF9, 0x36, 0xFC,
+ 0x28, 0x00, 0x6D, 0x00, 0x48, 0xFD, 0x28, 0x00,
+ 0x48, 0x01, 0x48, 0xFD, 0x28, 0x00, 0x23, 0x02,
+ 0x48, 0xFD, 0x28, 0x00, 0xFE, 0x02, 0x48, 0xFD,
+ 0x2B, 0x00, 0xD9, 0x03, 0x61, 0xFC, 0x2D, 0x00,
+ 0xB4, 0x04, 0x9F, 0xFB, 0x2F, 0x00, 0x8F, 0x05,
+ 0xB2, 0xFA, 0x2F, 0x00, 0x6A, 0x06, 0xB2, 0xFA,
+ 0x28, 0x00, 0x93, 0xFF, 0x48, 0xFD, 0x28, 0x00,
+ 0xB8, 0xFE, 0x48, 0xFD, 0x28, 0x00, 0xDD, 0xFD,
+ 0x48, 0xFD, 0x28, 0x00, 0x02, 0xFD, 0x48, 0xFD,
+ 0x2B, 0x00, 0x27, 0xFC, 0x61, 0xFC, 0x2D, 0x00,
+ 0x4C, 0xFB, 0x9F, 0xFB, 0x2F, 0x00, 0x71, 0xFA,
+ 0xB2, 0xFA, 0x2F, 0x00, 0x96, 0xF9, 0xB2, 0xFA,
+ 0x2B, 0x00, 0x6D, 0x00, 0x81, 0xFC, 0x2B, 0x00,
+ 0x48, 0x01, 0x81, 0xFC, 0x2B, 0x00, 0x23, 0x02,
+ 0x81, 0xFC, 0x2B, 0x00, 0xFE, 0x02, 0x81, 0xFC,
+ 0x2E, 0x00, 0xD9, 0x03, 0x58, 0xFB, 0x30, 0x00,
+ 0xB4, 0x04, 0x5E, 0xFA, 0x30, 0x00, 0x8F, 0x05,
+ 0x2E, 0xF9, 0x30, 0x00, 0x6A, 0x06, 0x2E, 0xF9,
+ 0x2B, 0x00, 0x93, 0xFF, 0x81, 0xFC, 0x2B, 0x00,
+ 0xB8, 0xFE, 0x81, 0xFC, 0x2B, 0x00, 0xDD, 0xFD,
+ 0x81, 0xFC, 0x2B, 0x00, 0x02, 0xFD, 0x81, 0xFC,
+ 0x2E, 0x00, 0x27, 0xFC, 0x58, 0xFB, 0x30, 0x00,
+ 0x4C, 0xFB, 0x5E, 0xFA, 0x30, 0x00, 0x71, 0xFA,
+ 0x2E, 0xF9, 0x30, 0x00, 0x96, 0xF9, 0x2E, 0xF9,
+ 0x2D, 0x00, 0x6D, 0x00, 0xBA, 0xFB, 0x2D, 0x00,
+ 0x48, 0x01, 0xBA, 0xFB, 0x2D, 0x00, 0x23, 0x02,
+ 0xBA, 0xFB, 0x2D, 0x00, 0xFE, 0x02, 0xBA, 0xFB,
+ 0x30, 0x00, 0xD9, 0x03, 0x4F, 0xFA, 0x30, 0x00,
+ 0xB4, 0x04, 0x1E, 0xF9, 0x30, 0x00, 0x8F, 0x05,
+ 0xAA, 0xF7, 0x30, 0x00, 0x6A, 0x06, 0xAA, 0xF7,
+ 0x2D, 0x00, 0x93, 0xFF, 0xBA, 0xFB, 0x2D, 0x00,
+ 0xB8, 0xFE, 0xBA, 0xFB, 0x2D, 0x00, 0xDD, 0xFD,
+ 0xBA, 0xFB, 0x2D, 0x00, 0x02, 0xFD, 0xBA, 0xFB,
+ 0x30, 0x00, 0x27, 0xFC, 0x4F, 0xFA, 0x30, 0x00,
+ 0x4C, 0xFB, 0x1E, 0xF9, 0x30, 0x00, 0x71, 0xFA,
+ 0xAA, 0xF7, 0x30, 0x00, 0x96, 0xF9, 0xAA, 0xF7,
+ 0x2F, 0x00, 0x6D, 0x00, 0xF3, 0xFA, 0x2F, 0x00,
+ 0x48, 0x01, 0xF3, 0xFA, 0x2F, 0x00, 0x23, 0x02,
+ 0xF3, 0xFA, 0x2F, 0x00, 0xFE, 0x02, 0xF3, 0xFA,
+ 0x30, 0x00, 0xD9, 0x03, 0x46, 0xF9, 0x30, 0x00,
+ 0xB4, 0x04, 0xDD, 0xF7, 0x30, 0x00, 0x8F, 0x05,
+ 0x26, 0xF6, 0x30, 0x00, 0x6A, 0x06, 0x26, 0xF6,
+ 0x2F, 0x00, 0x93, 0xFF, 0xF3, 0xFA, 0x2F, 0x00,
+ 0xB8, 0xFE, 0xF3, 0xFA, 0x2F, 0x00, 0xDD, 0xFD,
+ 0xF3, 0xFA, 0x2F, 0x00, 0x02, 0xFD, 0xF3, 0xFA,
+ 0x30, 0x00, 0x27, 0xFC, 0x46, 0xF9, 0x30, 0x00,
+ 0x4C, 0xFB, 0xDD, 0xF7, 0x30, 0x00, 0x71, 0xFA,
+ 0x26, 0xF6, 0x30, 0x00, 0x96, 0xF9, 0x26, 0xF6,
+ 0x30, 0x00, 0x6D, 0x00, 0x2C, 0xFA, 0x30, 0x00,
+ 0x48, 0x01, 0x2C, 0xFA, 0x30, 0x00, 0x23, 0x02,
+ 0x2C, 0xFA, 0x30, 0x00, 0xFE, 0x02, 0x2C, 0xFA,
+ 0x30, 0x00, 0xD9, 0x03, 0x3D, 0xF8, 0x30, 0x00,
+ 0xB4, 0x04, 0x9D, 0xF6, 0x30, 0x00, 0x8F, 0x05,
+ 0xA2, 0xF4, 0x30, 0x00, 0x6A, 0x06, 0xA2, 0xF4,
+ 0x30, 0x00, 0x93, 0xFF, 0x2C, 0xFA, 0x30, 0x00,
+ 0xB8, 0xFE, 0x2C, 0xFA, 0x30, 0x00, 0xDD, 0xFD,
+ 0x2C, 0xFA, 0x30, 0x00, 0x02, 0xFD, 0x2C, 0xFA,
+ 0x30, 0x00, 0x27, 0xFC, 0x3D, 0xF8, 0x30, 0x00,
+ 0x4C, 0xFB, 0x9D, 0xF6, 0x30, 0x00, 0x71, 0xFA,
+ 0xA2, 0xF4, 0x30, 0x00, 0x96, 0xF9, 0xA2, 0xF4,
+ 0x29, 0x00, 0x78, 0x00, 0x6D, 0x00, 0x29, 0x00,
+ 0x68, 0x01, 0x6D, 0x00, 0x29, 0x00, 0x59, 0x02,
+ 0x6D, 0x00, 0x29, 0x00, 0x49, 0x03, 0x6D, 0x00,
+ 0x2C, 0x00, 0x3B, 0x04, 0x91, 0x00, 0x2E, 0x00,
+ 0x2B, 0x05, 0xB0, 0x00, 0x2F, 0x00, 0x1C, 0x06,
+ 0xC2, 0x00, 0x2F, 0x00, 0x0C, 0x07, 0xC2, 0x00,
+ 0x29, 0x00, 0x88, 0xFF, 0x6D, 0x00, 0x29, 0x00,
+ 0x98, 0xFE, 0x6D, 0x00, 0x29, 0x00, 0xA7, 0xFD,
+ 0x6D, 0x00, 0x29, 0x00, 0xB7, 0xFC, 0x6D, 0x00,
+ 0x2C, 0x00, 0xC5, 0xFB, 0x91, 0x00, 0x2E, 0x00,
+ 0xD5, 0xFA, 0xB0, 0x00, 0x2F, 0x00, 0xE4, 0xF9,
+ 0xC2, 0x00, 0x2F, 0x00, 0xF4, 0xF8, 0xC2, 0x00,
+ 0x29, 0x00, 0x78, 0x00, 0x48, 0x01, 0x29, 0x00,
+ 0x68, 0x01, 0x48, 0x01, 0x29, 0x00, 0x59, 0x02,
+ 0x48, 0x01, 0x29, 0x00, 0x49, 0x03, 0x48, 0x01,
+ 0x2C, 0x00, 0x3B, 0x04, 0xB4, 0x01, 0x2E, 0x00,
+ 0x2B, 0x05, 0x10, 0x02, 0x2F, 0x00, 0x1C, 0x06,
+ 0x46, 0x02, 0x2F, 0x00, 0x0C, 0x07, 0x46, 0x02,
+ 0x29, 0x00, 0x88, 0xFF, 0x48, 0x01, 0x29, 0x00,
+ 0x98, 0xFE, 0x48, 0x01, 0x29, 0x00, 0xA7, 0xFD,
+ 0x48, 0x01, 0x29, 0x00, 0xB7, 0xFC, 0x48, 0x01,
+ 0x2C, 0x00, 0xC5, 0xFB, 0xB4, 0x01, 0x2E, 0x00,
+ 0xD5, 0xFA, 0x10, 0x02, 0x2F, 0x00, 0xE4, 0xF9,
+ 0x46, 0x02, 0x2F, 0x00, 0xF4, 0xF8, 0x46, 0x02,
+ 0x29, 0x00, 0x78, 0x00, 0x23, 0x02, 0x29, 0x00,
+ 0x68, 0x01, 0x23, 0x02, 0x29, 0x00, 0x59, 0x02,
+ 0x23, 0x02, 0x29, 0x00, 0x49, 0x03, 0x23, 0x02,
+ 0x2C, 0x00, 0x3B, 0x04, 0xD8, 0x02, 0x2E, 0x00,
+ 0x2B, 0x05, 0x71, 0x03, 0x2F, 0x00, 0x1C, 0x06,
+ 0xCA, 0x03, 0x2F, 0x00, 0x0C, 0x07, 0xCA, 0x03,
+ 0x29, 0x00, 0x88, 0xFF, 0x23, 0x02, 0x29, 0x00,
+ 0x98, 0xFE, 0x23, 0x02, 0x29, 0x00, 0xA7, 0xFD,
+ 0x23, 0x02, 0x29, 0x00, 0xB7, 0xFC, 0x23, 0x02,
+ 0x2C, 0x00, 0xC5, 0xFB, 0xD8, 0x02, 0x2E, 0x00,
+ 0xD5, 0xFA, 0x71, 0x03, 0x2F, 0x00, 0xE4, 0xF9,
+ 0xCA, 0x03, 0x2F, 0x00, 0xF4, 0xF8, 0xCA, 0x03,
+ 0x29, 0x00, 0x78, 0x00, 0xFE, 0x02, 0x29, 0x00,
+ 0x68, 0x01, 0xFE, 0x02, 0x29, 0x00, 0x59, 0x02,
+ 0xFE, 0x02, 0x29, 0x00, 0x49, 0x03, 0xFE, 0x02,
+ 0x2C, 0x00, 0x3B, 0x04, 0xFB, 0x03, 0x2E, 0x00,
+ 0x2B, 0x05, 0xD1, 0x04, 0x2F, 0x00, 0x1C, 0x06,
+ 0x4E, 0x05, 0x2F, 0x00, 0x0C, 0x07, 0x4E, 0x05,
+ 0x29, 0x00, 0x88, 0xFF, 0xFE, 0x02, 0x29, 0x00,
+ 0x98, 0xFE, 0xFE, 0x02, 0x29, 0x00, 0xA7, 0xFD,
+ 0xFE, 0x02, 0x29, 0x00, 0xB7, 0xFC, 0xFE, 0x02,
+ 0x2C, 0x00, 0xC5, 0xFB, 0xFB, 0x03, 0x2E, 0x00,
+ 0xD5, 0xFA, 0xD1, 0x04, 0x2F, 0x00, 0xE4, 0xF9,
+ 0x4E, 0x05, 0x2F, 0x00, 0xF4, 0xF8, 0x4E, 0x05,
+ 0x2C, 0x00, 0x78, 0x00, 0xD9, 0x03, 0x2C, 0x00,
+ 0x68, 0x01, 0xD9, 0x03, 0x2C, 0x00, 0x59, 0x02,
+ 0xD9, 0x03, 0x2C, 0x00, 0x49, 0x03, 0xD9, 0x03,
+ 0x2F, 0x00, 0x3B, 0x04, 0x1F, 0x05, 0x30, 0x00,
+ 0x2B, 0x05, 0x33, 0x06, 0x30, 0x00, 0x1C, 0x06,
+ 0xD2, 0x06, 0x30, 0x00, 0x0C, 0x07, 0xD2, 0x06,
+ 0x2C, 0x00, 0x88, 0xFF, 0xD9, 0x03, 0x2C, 0x00,
+ 0x98, 0xFE, 0xD9, 0x03, 0x2C, 0x00, 0xA7, 0xFD,
+ 0xD9, 0x03, 0x2C, 0x00, 0xB7, 0xFC, 0xD9, 0x03,
+ 0x2F, 0x00, 0xC5, 0xFB, 0x1F, 0x05, 0x30, 0x00,
+ 0xD5, 0xFA, 0x33, 0x06, 0x30, 0x00, 0xE4, 0xF9,
+ 0xD2, 0x06, 0x30, 0x00, 0xF4, 0xF8, 0xD2, 0x06,
+ 0x2E, 0x00, 0x78, 0x00, 0xB4, 0x04, 0x2E, 0x00,
+ 0x68, 0x01, 0xB4, 0x04, 0x2E, 0x00, 0x59, 0x02,
+ 0xB4, 0x04, 0x2E, 0x00, 0x49, 0x03, 0xB4, 0x04,
+ 0x30, 0x00, 0x3B, 0x04, 0x42, 0x06, 0x30, 0x00,
+ 0x2B, 0x05, 0x93, 0x07, 0x30, 0x00, 0x1C, 0x06,
+ 0x56, 0x08, 0x30, 0x00, 0x0C, 0x07, 0x56, 0x08,
+ 0x2E, 0x00, 0x88, 0xFF, 0xB4, 0x04, 0x2E, 0x00,
+ 0x98, 0xFE, 0xB4, 0x04, 0x2E, 0x00, 0xA7, 0xFD,
+ 0xB4, 0x04, 0x2E, 0x00, 0xB7, 0xFC, 0xB4, 0x04,
+ 0x30, 0x00, 0xC5, 0xFB, 0x42, 0x06, 0x30, 0x00,
+ 0xD5, 0xFA, 0x93, 0x07, 0x30, 0x00, 0xE4, 0xF9,
+ 0x56, 0x08, 0x30, 0x00, 0xF4, 0xF8, 0x56, 0x08,
+ 0x30, 0x00, 0x78, 0x00, 0x8F, 0x05, 0x30, 0x00,
+ 0x68, 0x01, 0x8F, 0x05, 0x30, 0x00, 0x59, 0x02,
+ 0x8F, 0x05, 0x30, 0x00, 0x49, 0x03, 0x8F, 0x05,
+ 0x30, 0x00, 0x3B, 0x04, 0x66, 0x07, 0x30, 0x00,
+ 0x2B, 0x05, 0xF4, 0x08, 0x30, 0x00, 0x1C, 0x06,
+ 0xDA, 0x09, 0x30, 0x00, 0x0C, 0x07, 0xDA, 0x09,
+ 0x30, 0x00, 0x88, 0xFF, 0x8F, 0x05, 0x30, 0x00,
+ 0x98, 0xFE, 0x8F, 0x05, 0x30, 0x00, 0xA7, 0xFD,
+ 0x8F, 0x05, 0x30, 0x00, 0xB7, 0xFC, 0x8F, 0x05,
+ 0x30, 0x00, 0xC5, 0xFB, 0x66, 0x07, 0x30, 0x00,
+ 0xD5, 0xFA, 0xF4, 0x08, 0x30, 0x00, 0xE4, 0xF9,
+ 0xDA, 0x09, 0x30, 0x00, 0xF4, 0xF8, 0xDA, 0x09,
+ 0x30, 0x00, 0x78, 0x00, 0x6A, 0x06, 0x30, 0x00,
+ 0x68, 0x01, 0x6A, 0x06, 0x30, 0x00, 0x59, 0x02,
+ 0x6A, 0x06, 0x30, 0x00, 0x49, 0x03, 0x6A, 0x06,
+ 0x30, 0x00, 0x3B, 0x04, 0x89, 0x08, 0x30, 0x00,
+ 0x2B, 0x05, 0x54, 0x0A, 0x30, 0x00, 0x1C, 0x06,
+ 0x5E, 0x0B, 0x30, 0x00, 0x0C, 0x07, 0x5E, 0x0B,
+ 0x30, 0x00, 0x88, 0xFF, 0x6A, 0x06, 0x30, 0x00,
+ 0x98, 0xFE, 0x6A, 0x06, 0x30, 0x00, 0xA7, 0xFD,
+ 0x6A, 0x06, 0x30, 0x00, 0xB7, 0xFC, 0x6A, 0x06,
+ 0x30, 0x00, 0xC5, 0xFB, 0x89, 0x08, 0x30, 0x00,
+ 0xD5, 0xFA, 0x54, 0x0A, 0x30, 0x00, 0xE4, 0xF9,
+ 0x5E, 0x0B, 0x30, 0x00, 0xF4, 0xF8, 0x5E, 0x0B,
+ 0x29, 0x00, 0x78, 0x00, 0x93, 0xFF, 0x29, 0x00,
+ 0x68, 0x01, 0x93, 0xFF, 0x29, 0x00, 0x59, 0x02,
+ 0x93, 0xFF, 0x29, 0x00, 0x49, 0x03, 0x93, 0xFF,
+ 0x2C, 0x00, 0x3B, 0x04, 0x6F, 0xFF, 0x2E, 0x00,
+ 0x2B, 0x05, 0x50, 0xFF, 0x2F, 0x00, 0x1C, 0x06,
+ 0x3E, 0xFF, 0x2F, 0x00, 0x0C, 0x07, 0x3E, 0xFF,
+ 0x29, 0x00, 0x88, 0xFF, 0x93, 0xFF, 0x29, 0x00,
+ 0x98, 0xFE, 0x93, 0xFF, 0x29, 0x00, 0xA7, 0xFD,
+ 0x93, 0xFF, 0x29, 0x00, 0xB7, 0xFC, 0x93, 0xFF,
+ 0x2C, 0x00, 0xC5, 0xFB, 0x6F, 0xFF, 0x2E, 0x00,
+ 0xD5, 0xFA, 0x50, 0xFF, 0x2F, 0x00, 0xE4, 0xF9,
+ 0x3E, 0xFF, 0x2F, 0x00, 0xF4, 0xF8, 0x3E, 0xFF,
+ 0x29, 0x00, 0x78, 0x00, 0xB8, 0xFE, 0x29, 0x00,
+ 0x68, 0x01, 0xB8, 0xFE, 0x29, 0x00, 0x59, 0x02,
+ 0xB8, 0xFE, 0x29, 0x00, 0x49, 0x03, 0xB8, 0xFE,
+ 0x2C, 0x00, 0x3B, 0x04, 0x4C, 0xFE, 0x2E, 0x00,
+ 0x2B, 0x05, 0xF0, 0xFD, 0x2F, 0x00, 0x1C, 0x06,
+ 0xBA, 0xFD, 0x2F, 0x00, 0x0C, 0x07, 0xBA, 0xFD,
+ 0x29, 0x00, 0x88, 0xFF, 0xB8, 0xFE, 0x29, 0x00,
+ 0x98, 0xFE, 0xB8, 0xFE, 0x29, 0x00, 0xA7, 0xFD,
+ 0xB8, 0xFE, 0x29, 0x00, 0xB7, 0xFC, 0xB8, 0xFE,
+ 0x2C, 0x00, 0xC5, 0xFB, 0x4C, 0xFE, 0x2E, 0x00,
+ 0xD5, 0xFA, 0xF0, 0xFD, 0x2F, 0x00, 0xE4, 0xF9,
+ 0xBA, 0xFD, 0x2F, 0x00, 0xF4, 0xF8, 0xBA, 0xFD,
+ 0x29, 0x00, 0x78, 0x00, 0xDD, 0xFD, 0x29, 0x00,
+ 0x68, 0x01, 0xDD, 0xFD, 0x29, 0x00, 0x59, 0x02,
+ 0xDD, 0xFD, 0x29, 0x00, 0x49, 0x03, 0xDD, 0xFD,
+ 0x2C, 0x00, 0x3B, 0x04, 0x28, 0xFD, 0x2E, 0x00,
+ 0x2B, 0x05, 0x8F, 0xFC, 0x2F, 0x00, 0x1C, 0x06,
+ 0x36, 0xFC, 0x2F, 0x00, 0x0C, 0x07, 0x36, 0xFC,
+ 0x29, 0x00, 0x88, 0xFF, 0xDD, 0xFD, 0x29, 0x00,
+ 0x98, 0xFE, 0xDD, 0xFD, 0x29, 0x00, 0xA7, 0xFD,
+ 0xDD, 0xFD, 0x29, 0x00, 0xB7, 0xFC, 0xDD, 0xFD,
+ 0x2C, 0x00, 0xC5, 0xFB, 0x28, 0xFD, 0x2E, 0x00,
+ 0xD5, 0xFA, 0x8F, 0xFC, 0x2F, 0x00, 0xE4, 0xF9,
+ 0x36, 0xFC, 0x2F, 0x00, 0xF4, 0xF8, 0x36, 0xFC,
+ 0x29, 0x00, 0x78, 0x00, 0x02, 0xFD, 0x29, 0x00,
+ 0x68, 0x01, 0x02, 0xFD, 0x29, 0x00, 0x59, 0x02,
+ 0x02, 0xFD, 0x29, 0x00, 0x49, 0x03, 0x02, 0xFD,
+ 0x2C, 0x00, 0x3B, 0x04, 0x05, 0xFC, 0x2E, 0x00,
+ 0x2B, 0x05, 0x2F, 0xFB, 0x2F, 0x00, 0x1C, 0x06,
+ 0xB2, 0xFA, 0x2F, 0x00, 0x0C, 0x07, 0xB2, 0xFA,
+ 0x29, 0x00, 0x88, 0xFF, 0x02, 0xFD, 0x29, 0x00,
+ 0x98, 0xFE, 0x02, 0xFD, 0x29, 0x00, 0xA7, 0xFD,
+ 0x02, 0xFD, 0x29, 0x00, 0xB7, 0xFC, 0x02, 0xFD,
+ 0x2C, 0x00, 0xC5, 0xFB, 0x05, 0xFC, 0x2E, 0x00,
+ 0xD5, 0xFA, 0x2F, 0xFB, 0x2F, 0x00, 0xE4, 0xF9,
+ 0xB2, 0xFA, 0x2F, 0x00, 0xF4, 0xF8, 0xB2, 0xFA,
+ 0x2C, 0x00, 0x78, 0x00, 0x27, 0xFC, 0x2C, 0x00,
+ 0x68, 0x01, 0x27, 0xFC, 0x2C, 0x00, 0x59, 0x02,
+ 0x27, 0xFC, 0x2C, 0x00, 0x49, 0x03, 0x27, 0xFC,
+ 0x2F, 0x00, 0x3B, 0x04, 0xE1, 0xFA, 0x30, 0x00,
+ 0x2B, 0x05, 0xCD, 0xF9, 0x30, 0x00, 0x1C, 0x06,
+ 0x2E, 0xF9, 0x30, 0x00, 0x0C, 0x07, 0x2E, 0xF9,
+ 0x2C, 0x00, 0x88, 0xFF, 0x27, 0xFC, 0x2C, 0x00,
+ 0x98, 0xFE, 0x27, 0xFC, 0x2C, 0x00, 0xA7, 0xFD,
+ 0x27, 0xFC, 0x2C, 0x00, 0xB7, 0xFC, 0x27, 0xFC,
+ 0x2F, 0x00, 0xC5, 0xFB, 0xE1, 0xFA, 0x30, 0x00,
+ 0xD5, 0xFA, 0xCD, 0xF9, 0x30, 0x00, 0xE4, 0xF9,
+ 0x2E, 0xF9, 0x30, 0x00, 0xF4, 0xF8, 0x2E, 0xF9,
+ 0x2E, 0x00, 0x78, 0x00, 0x4C, 0xFB, 0x2E, 0x00,
+ 0x68, 0x01, 0x4C, 0xFB, 0x2E, 0x00, 0x59, 0x02,
+ 0x4C, 0xFB, 0x2E, 0x00, 0x49, 0x03, 0x4C, 0xFB,
+ 0x30, 0x00, 0x3B, 0x04, 0xBE, 0xF9, 0x30, 0x00,
+ 0x2B, 0x05, 0x6D, 0xF8, 0x30, 0x00, 0x1C, 0x06,
+ 0xAA, 0xF7, 0x30, 0x00, 0x0C, 0x07, 0xAA, 0xF7,
+ 0x2E, 0x00, 0x88, 0xFF, 0x4C, 0xFB, 0x2E, 0x00,
+ 0x98, 0xFE, 0x4C, 0xFB, 0x2E, 0x00, 0xA7, 0xFD,
+ 0x4C, 0xFB, 0x2E, 0x00, 0xB7, 0xFC, 0x4C, 0xFB,
+ 0x30, 0x00, 0xC5, 0xFB, 0xBE, 0xF9, 0x30, 0x00,
+ 0xD5, 0xFA, 0x6D, 0xF8, 0x30, 0x00, 0xE4, 0xF9,
+ 0xAA, 0xF7, 0x30, 0x00, 0xF4, 0xF8, 0xAA, 0xF7,
+ 0x30, 0x00, 0x78, 0x00, 0x71, 0xFA, 0x30, 0x00,
+ 0x68, 0x01, 0x71, 0xFA, 0x30, 0x00, 0x59, 0x02,
+ 0x71, 0xFA, 0x30, 0x00, 0x49, 0x03, 0x71, 0xFA,
+ 0x30, 0x00, 0x3B, 0x04, 0x9A, 0xF8, 0x30, 0x00,
+ 0x2B, 0x05, 0x0C, 0xF7, 0x30, 0x00, 0x1C, 0x06,
+ 0x26, 0xF6, 0x30, 0x00, 0x0C, 0x07, 0x26, 0xF6,
+ 0x30, 0x00, 0x88, 0xFF, 0x71, 0xFA, 0x30, 0x00,
+ 0x98, 0xFE, 0x71, 0xFA, 0x30, 0x00, 0xA7, 0xFD,
+ 0x71, 0xFA, 0x30, 0x00, 0xB7, 0xFC, 0x71, 0xFA,
+ 0x30, 0x00, 0xC5, 0xFB, 0x9A, 0xF8, 0x30, 0x00,
+ 0xD5, 0xFA, 0x0C, 0xF7, 0x30, 0x00, 0xE4, 0xF9,
+ 0x26, 0xF6, 0x30, 0x00, 0xF4, 0xF8, 0x26, 0xF6,
+ 0x30, 0x00, 0x78, 0x00, 0x96, 0xF9, 0x30, 0x00,
+ 0x68, 0x01, 0x96, 0xF9, 0x30, 0x00, 0x59, 0x02,
+ 0x96, 0xF9, 0x30, 0x00, 0x49, 0x03, 0x96, 0xF9,
+ 0x30, 0x00, 0x3B, 0x04, 0x77, 0xF7, 0x30, 0x00,
+ 0x2B, 0x05, 0xAC, 0xF5, 0x30, 0x00, 0x1C, 0x06,
+ 0xA2, 0xF4, 0x30, 0x00, 0x0C, 0x07, 0xA2, 0xF4,
+ 0x30, 0x00, 0x88, 0xFF, 0x96, 0xF9, 0x30, 0x00,
+ 0x98, 0xFE, 0x96, 0xF9, 0x30, 0x00, 0xA7, 0xFD,
+ 0x96, 0xF9, 0x30, 0x00, 0xB7, 0xFC, 0x96, 0xF9,
+ 0x30, 0x00, 0xC5, 0xFB, 0x77, 0xF7, 0x30, 0x00,
+ 0xD5, 0xFA, 0xAC, 0xF5, 0x30, 0x00, 0xE4, 0xF9,
+ 0xA2, 0xF4, 0x30, 0x00, 0xF4, 0xF8, 0xA2, 0xF4,
+ 0x2A, 0x00, 0x84, 0x00, 0x78, 0x00, 0x2A, 0x00,
+ 0x8D, 0x01, 0x78, 0x00, 0x2A, 0x00, 0x96, 0x02,
+ 0x78, 0x00, 0x2A, 0x00, 0x9F, 0x03, 0x78, 0x00,
+ 0x2D, 0x00, 0xA8, 0x04, 0xA0, 0x00, 0x2F, 0x00,
+ 0xB1, 0x05, 0xC2, 0x00, 0x2F, 0x00, 0xBA, 0x06,
+ 0xC2, 0x00, 0x2F, 0x00, 0xC3, 0x07, 0xC2, 0x00,
+ 0x2A, 0x00, 0x7C, 0xFF, 0x78, 0x00, 0x2A, 0x00,
+ 0x73, 0xFE, 0x78, 0x00, 0x2A, 0x00, 0x6A, 0xFD,
+ 0x78, 0x00, 0x2A, 0x00, 0x61, 0xFC, 0x78, 0x00,
+ 0x2D, 0x00, 0x58, 0xFB, 0xA0, 0x00, 0x2F, 0x00,
+ 0x4F, 0xFA, 0xC2, 0x00, 0x2F, 0x00, 0x46, 0xF9,
+ 0xC2, 0x00, 0x2F, 0x00, 0x3D, 0xF8, 0xC2, 0x00,
+ 0x2A, 0x00, 0x84, 0x00, 0x68, 0x01, 0x2A, 0x00,
+ 0x8D, 0x01, 0x68, 0x01, 0x2A, 0x00, 0x96, 0x02,
+ 0x68, 0x01, 0x2A, 0x00, 0x9F, 0x03, 0x68, 0x01,
+ 0x2D, 0x00, 0xA8, 0x04, 0xE0, 0x01, 0x2F, 0x00,
+ 0xB1, 0x05, 0x46, 0x02, 0x2F, 0x00, 0xBA, 0x06,
+ 0x46, 0x02, 0x2F, 0x00, 0xC3, 0x07, 0x46, 0x02,
+ 0x2A, 0x00, 0x7C, 0xFF, 0x68, 0x01, 0x2A, 0x00,
+ 0x73, 0xFE, 0x68, 0x01, 0x2A, 0x00, 0x6A, 0xFD,
+ 0x68, 0x01, 0x2A, 0x00, 0x61, 0xFC, 0x68, 0x01,
+ 0x2D, 0x00, 0x58, 0xFB, 0xE0, 0x01, 0x2F, 0x00,
+ 0x4F, 0xFA, 0x46, 0x02, 0x2F, 0x00, 0x46, 0xF9,
+ 0x46, 0x02, 0x2F, 0x00, 0x3D, 0xF8, 0x46, 0x02,
+ 0x2A, 0x00, 0x84, 0x00, 0x59, 0x02, 0x2A, 0x00,
+ 0x8D, 0x01, 0x59, 0x02, 0x2A, 0x00, 0x96, 0x02,
+ 0x59, 0x02, 0x2A, 0x00, 0x9F, 0x03, 0x59, 0x02,
+ 0x2D, 0x00, 0xA8, 0x04, 0x21, 0x03, 0x2F, 0x00,
+ 0xB1, 0x05, 0xCA, 0x03, 0x2F, 0x00, 0xBA, 0x06,
+ 0xCA, 0x03, 0x2F, 0x00, 0xC3, 0x07, 0xCA, 0x03,
+ 0x2A, 0x00, 0x7C, 0xFF, 0x59, 0x02, 0x2A, 0x00,
+ 0x73, 0xFE, 0x59, 0x02, 0x2A, 0x00, 0x6A, 0xFD,
+ 0x59, 0x02, 0x2A, 0x00, 0x61, 0xFC, 0x59, 0x02,
+ 0x2D, 0x00, 0x58, 0xFB, 0x21, 0x03, 0x2F, 0x00,
+ 0x4F, 0xFA, 0xCA, 0x03, 0x2F, 0x00, 0x46, 0xF9,
+ 0xCA, 0x03, 0x2F, 0x00, 0x3D, 0xF8, 0xCA, 0x03,
+ 0x2A, 0x00, 0x84, 0x00, 0x49, 0x03, 0x2A, 0x00,
+ 0x8D, 0x01, 0x49, 0x03, 0x2A, 0x00, 0x96, 0x02,
+ 0x49, 0x03, 0x2A, 0x00, 0x9F, 0x03, 0x49, 0x03,
+ 0x2D, 0x00, 0xA8, 0x04, 0x61, 0x04, 0x2F, 0x00,
+ 0xB1, 0x05, 0x4E, 0x05, 0x2F, 0x00, 0xBA, 0x06,
+ 0x4E, 0x05, 0x2F, 0x00, 0xC3, 0x07, 0x4E, 0x05,
+ 0x2A, 0x00, 0x7C, 0xFF, 0x49, 0x03, 0x2A, 0x00,
+ 0x73, 0xFE, 0x49, 0x03, 0x2A, 0x00, 0x6A, 0xFD,
+ 0x49, 0x03, 0x2A, 0x00, 0x61, 0xFC, 0x49, 0x03,
+ 0x2D, 0x00, 0x58, 0xFB, 0x61, 0x04, 0x2F, 0x00,
+ 0x4F, 0xFA, 0x4E, 0x05, 0x2F, 0x00, 0x46, 0xF9,
+ 0x4E, 0x05, 0x2F, 0x00, 0x3D, 0xF8, 0x4E, 0x05,
+ 0x2D, 0x00, 0x84, 0x00, 0x3B, 0x04, 0x2D, 0x00,
+ 0x8D, 0x01, 0x3B, 0x04, 0x2D, 0x00, 0x96, 0x02,
+ 0x3B, 0x04, 0x2D, 0x00, 0x9F, 0x03, 0x3B, 0x04,
+ 0x30, 0x00, 0xA8, 0x04, 0xA2, 0x05, 0x30, 0x00,
+ 0xB1, 0x05, 0xD2, 0x06, 0x30, 0x00, 0xBA, 0x06,
+ 0xD2, 0x06, 0x30, 0x00, 0xC3, 0x07, 0xD2, 0x06,
+ 0x2D, 0x00, 0x7C, 0xFF, 0x3B, 0x04, 0x2D, 0x00,
+ 0x73, 0xFE, 0x3B, 0x04, 0x2D, 0x00, 0x6A, 0xFD,
+ 0x3B, 0x04, 0x2D, 0x00, 0x61, 0xFC, 0x3B, 0x04,
+ 0x30, 0x00, 0x58, 0xFB, 0xA2, 0x05, 0x30, 0x00,
+ 0x4F, 0xFA, 0xD2, 0x06, 0x30, 0x00, 0x46, 0xF9,
+ 0xD2, 0x06, 0x30, 0x00, 0x3D, 0xF8, 0xD2, 0x06,
+ 0x2F, 0x00, 0x84, 0x00, 0x2B, 0x05, 0x2F, 0x00,
+ 0x8D, 0x01, 0x2B, 0x05, 0x2F, 0x00, 0x96, 0x02,
+ 0x2B, 0x05, 0x2F, 0x00, 0x9F, 0x03, 0x2B, 0x05,
+ 0x30, 0x00, 0xA8, 0x04, 0xE2, 0x06, 0x30, 0x00,
+ 0xB1, 0x05, 0x56, 0x08, 0x30, 0x00, 0xBA, 0x06,
+ 0x56, 0x08, 0x30, 0x00, 0xC3, 0x07, 0x56, 0x08,
+ 0x2F, 0x00, 0x7C, 0xFF, 0x2B, 0x05, 0x2F, 0x00,
+ 0x73, 0xFE, 0x2B, 0x05, 0x2F, 0x00, 0x6A, 0xFD,
+ 0x2B, 0x05, 0x2F, 0x00, 0x61, 0xFC, 0x2B, 0x05,
+ 0x30, 0x00, 0x58, 0xFB, 0xE2, 0x06, 0x30, 0x00,
+ 0x4F, 0xFA, 0x56, 0x08, 0x30, 0x00, 0x46, 0xF9,
+ 0x56, 0x08, 0x30, 0x00, 0x3D, 0xF8, 0x56, 0x08,
+ 0x30, 0x00, 0x84, 0x00, 0x1C, 0x06, 0x30, 0x00,
+ 0x8D, 0x01, 0x1C, 0x06, 0x30, 0x00, 0x96, 0x02,
+ 0x1C, 0x06, 0x30, 0x00, 0x9F, 0x03, 0x1C, 0x06,
+ 0x30, 0x00, 0xA8, 0x04, 0x23, 0x08, 0x30, 0x00,
+ 0xB1, 0x05, 0xDA, 0x09, 0x30, 0x00, 0xBA, 0x06,
+ 0xDA, 0x09, 0x30, 0x00, 0xC3, 0x07, 0xDA, 0x09,
+ 0x30, 0x00, 0x7C, 0xFF, 0x1C, 0x06, 0x30, 0x00,
+ 0x73, 0xFE, 0x1C, 0x06, 0x30, 0x00, 0x6A, 0xFD,
+ 0x1C, 0x06, 0x30, 0x00, 0x61, 0xFC, 0x1C, 0x06,
+ 0x30, 0x00, 0x58, 0xFB, 0x23, 0x08, 0x30, 0x00,
+ 0x4F, 0xFA, 0xDA, 0x09, 0x30, 0x00, 0x46, 0xF9,
+ 0xDA, 0x09, 0x30, 0x00, 0x3D, 0xF8, 0xDA, 0x09,
+ 0x30, 0x00, 0x84, 0x00, 0x0C, 0x07, 0x30, 0x00,
+ 0x8D, 0x01, 0x0C, 0x07, 0x30, 0x00, 0x96, 0x02,
+ 0x0C, 0x07, 0x30, 0x00, 0x9F, 0x03, 0x0C, 0x07,
+ 0x30, 0x00, 0xA8, 0x04, 0x63, 0x09, 0x30, 0x00,
+ 0xB1, 0x05, 0x5E, 0x0B, 0x30, 0x00, 0xBA, 0x06,
+ 0x5E, 0x0B, 0x30, 0x00, 0xC3, 0x07, 0x5E, 0x0B,
+ 0x30, 0x00, 0x7C, 0xFF, 0x0C, 0x07, 0x30, 0x00,
+ 0x73, 0xFE, 0x0C, 0x07, 0x30, 0x00, 0x6A, 0xFD,
+ 0x0C, 0x07, 0x30, 0x00, 0x61, 0xFC, 0x0C, 0x07,
+ 0x30, 0x00, 0x58, 0xFB, 0x63, 0x09, 0x30, 0x00,
+ 0x4F, 0xFA, 0x5E, 0x0B, 0x30, 0x00, 0x46, 0xF9,
+ 0x5E, 0x0B, 0x30, 0x00, 0x3D, 0xF8, 0x5E, 0x0B,
+ 0x2A, 0x00, 0x84, 0x00, 0x88, 0xFF, 0x2A, 0x00,
+ 0x8D, 0x01, 0x88, 0xFF, 0x2A, 0x00, 0x96, 0x02,
+ 0x88, 0xFF, 0x2A, 0x00, 0x9F, 0x03, 0x88, 0xFF,
+ 0x2D, 0x00, 0xA8, 0x04, 0x60, 0xFF, 0x2F, 0x00,
+ 0xB1, 0x05, 0x3E, 0xFF, 0x2F, 0x00, 0xBA, 0x06,
+ 0x3E, 0xFF, 0x2F, 0x00, 0xC3, 0x07, 0x3E, 0xFF,
+ 0x2A, 0x00, 0x7C, 0xFF, 0x88, 0xFF, 0x2A, 0x00,
+ 0x73, 0xFE, 0x88, 0xFF, 0x2A, 0x00, 0x6A, 0xFD,
+ 0x88, 0xFF, 0x2A, 0x00, 0x61, 0xFC, 0x88, 0xFF,
+ 0x2D, 0x00, 0x58, 0xFB, 0x60, 0xFF, 0x2F, 0x00,
+ 0x4F, 0xFA, 0x3E, 0xFF, 0x2F, 0x00, 0x46, 0xF9,
+ 0x3E, 0xFF, 0x2F, 0x00, 0x3D, 0xF8, 0x3E, 0xFF,
+ 0x2A, 0x00, 0x84, 0x00, 0x98, 0xFE, 0x2A, 0x00,
+ 0x8D, 0x01, 0x98, 0xFE, 0x2A, 0x00, 0x96, 0x02,
+ 0x98, 0xFE, 0x2A, 0x00, 0x9F, 0x03, 0x98, 0xFE,
+ 0x2D, 0x00, 0xA8, 0x04, 0x20, 0xFE, 0x2F, 0x00,
+ 0xB1, 0x05, 0xBA, 0xFD, 0x2F, 0x00, 0xBA, 0x06,
+ 0xBA, 0xFD, 0x2F, 0x00, 0xC3, 0x07, 0xBA, 0xFD,
+ 0x2A, 0x00, 0x7C, 0xFF, 0x98, 0xFE, 0x2A, 0x00,
+ 0x73, 0xFE, 0x98, 0xFE, 0x2A, 0x00, 0x6A, 0xFD,
+ 0x98, 0xFE, 0x2A, 0x00, 0x61, 0xFC, 0x98, 0xFE,
+ 0x2D, 0x00, 0x58, 0xFB, 0x20, 0xFE, 0x2F, 0x00,
+ 0x4F, 0xFA, 0xBA, 0xFD, 0x2F, 0x00, 0x46, 0xF9,
+ 0xBA, 0xFD, 0x2F, 0x00, 0x3D, 0xF8, 0xBA, 0xFD,
+ 0x2A, 0x00, 0x84, 0x00, 0xA7, 0xFD, 0x2A, 0x00,
+ 0x8D, 0x01, 0xA7, 0xFD, 0x2A, 0x00, 0x96, 0x02,
+ 0xA7, 0xFD, 0x2A, 0x00, 0x9F, 0x03, 0xA7, 0xFD,
+ 0x2D, 0x00, 0xA8, 0x04, 0xDF, 0xFC, 0x2F, 0x00,
+ 0xB1, 0x05, 0x36, 0xFC, 0x2F, 0x00, 0xBA, 0x06,
+ 0x36, 0xFC, 0x2F, 0x00, 0xC3, 0x07, 0x36, 0xFC,
+ 0x2A, 0x00, 0x7C, 0xFF, 0xA7, 0xFD, 0x2A, 0x00,
+ 0x73, 0xFE, 0xA7, 0xFD, 0x2A, 0x00, 0x6A, 0xFD,
+ 0xA7, 0xFD, 0x2A, 0x00, 0x61, 0xFC, 0xA7, 0xFD,
+ 0x2D, 0x00, 0x58, 0xFB, 0xDF, 0xFC, 0x2F, 0x00,
+ 0x4F, 0xFA, 0x36, 0xFC, 0x2F, 0x00, 0x46, 0xF9,
+ 0x36, 0xFC, 0x2F, 0x00, 0x3D, 0xF8, 0x36, 0xFC,
+ 0x2A, 0x00, 0x84, 0x00, 0xB7, 0xFC, 0x2A, 0x00,
+ 0x8D, 0x01, 0xB7, 0xFC, 0x2A, 0x00, 0x96, 0x02,
+ 0xB7, 0xFC, 0x2A, 0x00, 0x9F, 0x03, 0xB7, 0xFC,
+ 0x2D, 0x00, 0xA8, 0x04, 0x9F, 0xFB, 0x2F, 0x00,
+ 0xB1, 0x05, 0xB2, 0xFA, 0x2F, 0x00, 0xBA, 0x06,
+ 0xB2, 0xFA, 0x2F, 0x00, 0xC3, 0x07, 0xB2, 0xFA,
+ 0x2A, 0x00, 0x7C, 0xFF, 0xB7, 0xFC, 0x2A, 0x00,
+ 0x73, 0xFE, 0xB7, 0xFC, 0x2A, 0x00, 0x6A, 0xFD,
+ 0xB7, 0xFC, 0x2A, 0x00, 0x61, 0xFC, 0xB7, 0xFC,
+ 0x2D, 0x00, 0x58, 0xFB, 0x9F, 0xFB, 0x2F, 0x00,
+ 0x4F, 0xFA, 0xB2, 0xFA, 0x2F, 0x00, 0x46, 0xF9,
+ 0xB2, 0xFA, 0x2F, 0x00, 0x3D, 0xF8, 0xB2, 0xFA,
+ 0x2D, 0x00, 0x84, 0x00, 0xC5, 0xFB, 0x2D, 0x00,
+ 0x8D, 0x01, 0xC5, 0xFB, 0x2D, 0x00, 0x96, 0x02,
+ 0xC5, 0xFB, 0x2D, 0x00, 0x9F, 0x03, 0xC5, 0xFB,
+ 0x30, 0x00, 0xA8, 0x04, 0x5E, 0xFA, 0x30, 0x00,
+ 0xB1, 0x05, 0x2E, 0xF9, 0x30, 0x00, 0xBA, 0x06,
+ 0x2E, 0xF9, 0x30, 0x00, 0xC3, 0x07, 0x2E, 0xF9,
+ 0x2D, 0x00, 0x7C, 0xFF, 0xC5, 0xFB, 0x2D, 0x00,
+ 0x73, 0xFE, 0xC5, 0xFB, 0x2D, 0x00, 0x6A, 0xFD,
+ 0xC5, 0xFB, 0x2D, 0x00, 0x61, 0xFC, 0xC5, 0xFB,
+ 0x30, 0x00, 0x58, 0xFB, 0x5E, 0xFA, 0x30, 0x00,
+ 0x4F, 0xFA, 0x2E, 0xF9, 0x30, 0x00, 0x46, 0xF9,
+ 0x2E, 0xF9, 0x30, 0x00, 0x3D, 0xF8, 0x2E, 0xF9,
+ 0x2F, 0x00, 0x84, 0x00, 0xD5, 0xFA, 0x2F, 0x00,
+ 0x8D, 0x01, 0xD5, 0xFA, 0x2F, 0x00, 0x96, 0x02,
+ 0xD5, 0xFA, 0x2F, 0x00, 0x9F, 0x03, 0xD5, 0xFA,
+ 0x30, 0x00, 0xA8, 0x04, 0x1E, 0xF9, 0x30, 0x00,
+ 0xB1, 0x05, 0xAA, 0xF7, 0x30, 0x00, 0xBA, 0x06,
+ 0xAA, 0xF7, 0x30, 0x00, 0xC3, 0x07, 0xAA, 0xF7,
+ 0x2F, 0x00, 0x7C, 0xFF, 0xD5, 0xFA, 0x2F, 0x00,
+ 0x73, 0xFE, 0xD5, 0xFA, 0x2F, 0x00, 0x6A, 0xFD,
+ 0xD5, 0xFA, 0x2F, 0x00, 0x61, 0xFC, 0xD5, 0xFA,
+ 0x30, 0x00, 0x58, 0xFB, 0x1E, 0xF9, 0x30, 0x00,
+ 0x4F, 0xFA, 0xAA, 0xF7, 0x30, 0x00, 0x46, 0xF9,
+ 0xAA, 0xF7, 0x30, 0x00, 0x3D, 0xF8, 0xAA, 0xF7,
+ 0x30, 0x00, 0x84, 0x00, 0xE4, 0xF9, 0x30, 0x00,
+ 0x8D, 0x01, 0xE4, 0xF9, 0x30, 0x00, 0x96, 0x02,
+ 0xE4, 0xF9, 0x30, 0x00, 0x9F, 0x03, 0xE4, 0xF9,
+ 0x30, 0x00, 0xA8, 0x04, 0xDD, 0xF7, 0x30, 0x00,
+ 0xB1, 0x05, 0x26, 0xF6, 0x30, 0x00, 0xBA, 0x06,
+ 0x26, 0xF6, 0x30, 0x00, 0xC3, 0x07, 0x26, 0xF6,
+ 0x30, 0x00, 0x7C, 0xFF, 0xE4, 0xF9, 0x30, 0x00,
+ 0x73, 0xFE, 0xE4, 0xF9, 0x30, 0x00, 0x6A, 0xFD,
+ 0xE4, 0xF9, 0x30, 0x00, 0x61, 0xFC, 0xE4, 0xF9,
+ 0x30, 0x00, 0x58, 0xFB, 0xDD, 0xF7, 0x30, 0x00,
+ 0x4F, 0xFA, 0x26, 0xF6, 0x30, 0x00, 0x46, 0xF9,
+ 0x26, 0xF6, 0x30, 0x00, 0x3D, 0xF8, 0x26, 0xF6,
+ 0x30, 0x00, 0x84, 0x00, 0xF4, 0xF8, 0x30, 0x00,
+ 0x8D, 0x01, 0xF4, 0xF8, 0x30, 0x00, 0x96, 0x02,
+ 0xF4, 0xF8, 0x30, 0x00, 0x9F, 0x03, 0xF4, 0xF8,
+ 0x30, 0x00, 0xA8, 0x04, 0x9D, 0xF6, 0x30, 0x00,
+ 0xB1, 0x05, 0xA2, 0xF4, 0x30, 0x00, 0xBA, 0x06,
+ 0xA2, 0xF4, 0x30, 0x00, 0xC3, 0x07, 0xA2, 0xF4,
+ 0x30, 0x00, 0x7C, 0xFF, 0xF4, 0xF8, 0x30, 0x00,
+ 0x73, 0xFE, 0xF4, 0xF8, 0x30, 0x00, 0x6A, 0xFD,
+ 0xF4, 0xF8, 0x30, 0x00, 0x61, 0xFC, 0xF4, 0xF8,
+ 0x30, 0x00, 0x58, 0xFB, 0x9D, 0xF6, 0x30, 0x00,
+ 0x4F, 0xFA, 0xA2, 0xF4, 0x30, 0x00, 0x46, 0xF9,
+ 0xA2, 0xF4, 0x30, 0x00, 0x3D, 0xF8, 0xA2, 0xF4,
+ 0x2B, 0x00, 0x91, 0x00, 0x84, 0x00, 0x2B, 0x00,
+ 0xB4, 0x01, 0x84, 0x00, 0x2B, 0x00, 0xD8, 0x02,
+ 0x84, 0x00, 0x2B, 0x00, 0xFB, 0x03, 0x84, 0x00,
+ 0x2E, 0x00, 0x1F, 0x05, 0xB0, 0x00, 0x2F, 0x00,
+ 0x42, 0x06, 0xC2, 0x00, 0x2F, 0x00, 0x66, 0x07,
+ 0xC2, 0x00, 0x2F, 0x00, 0x89, 0x08, 0xC2, 0x00,
+ 0x2B, 0x00, 0x6F, 0xFF, 0x84, 0x00, 0x2B, 0x00,
+ 0x4C, 0xFE, 0x84, 0x00, 0x2B, 0x00, 0x28, 0xFD,
+ 0x84, 0x00, 0x2B, 0x00, 0x05, 0xFC, 0x84, 0x00,
+ 0x2E, 0x00, 0xE1, 0xFA, 0xB0, 0x00, 0x2F, 0x00,
+ 0xBE, 0xF9, 0xC2, 0x00, 0x2F, 0x00, 0x9A, 0xF8,
+ 0xC2, 0x00, 0x2F, 0x00, 0x77, 0xF7, 0xC2, 0x00,
+ 0x2B, 0x00, 0x91, 0x00, 0x8D, 0x01, 0x2B, 0x00,
+ 0xB4, 0x01, 0x8D, 0x01, 0x2B, 0x00, 0xD8, 0x02,
+ 0x8D, 0x01, 0x2B, 0x00, 0xFB, 0x03, 0x8D, 0x01,
+ 0x2E, 0x00, 0x1F, 0x05, 0x10, 0x02, 0x2F, 0x00,
+ 0x42, 0x06, 0x46, 0x02, 0x2F, 0x00, 0x66, 0x07,
+ 0x46, 0x02, 0x2F, 0x00, 0x89, 0x08, 0x46, 0x02,
+ 0x2B, 0x00, 0x6F, 0xFF, 0x8D, 0x01, 0x2B, 0x00,
+ 0x4C, 0xFE, 0x8D, 0x01, 0x2B, 0x00, 0x28, 0xFD,
+ 0x8D, 0x01, 0x2B, 0x00, 0x05, 0xFC, 0x8D, 0x01,
+ 0x2E, 0x00, 0xE1, 0xFA, 0x10, 0x02, 0x2F, 0x00,
+ 0xBE, 0xF9, 0x46, 0x02, 0x2F, 0x00, 0x9A, 0xF8,
+ 0x46, 0x02, 0x2F, 0x00, 0x77, 0xF7, 0x46, 0x02,
+ 0x2B, 0x00, 0x91, 0x00, 0x96, 0x02, 0x2B, 0x00,
+ 0xB4, 0x01, 0x96, 0x02, 0x2B, 0x00, 0xD8, 0x02,
+ 0x96, 0x02, 0x2B, 0x00, 0xFB, 0x03, 0x96, 0x02,
+ 0x2E, 0x00, 0x1F, 0x05, 0x71, 0x03, 0x2F, 0x00,
+ 0x42, 0x06, 0xCA, 0x03, 0x2F, 0x00, 0x66, 0x07,
+ 0xCA, 0x03, 0x2F, 0x00, 0x89, 0x08, 0xCA, 0x03,
+ 0x2B, 0x00, 0x6F, 0xFF, 0x96, 0x02, 0x2B, 0x00,
+ 0x4C, 0xFE, 0x96, 0x02, 0x2B, 0x00, 0x28, 0xFD,
+ 0x96, 0x02, 0x2B, 0x00, 0x05, 0xFC, 0x96, 0x02,
+ 0x2E, 0x00, 0xE1, 0xFA, 0x71, 0x03, 0x2F, 0x00,
+ 0xBE, 0xF9, 0xCA, 0x03, 0x2F, 0x00, 0x9A, 0xF8,
+ 0xCA, 0x03, 0x2F, 0x00, 0x77, 0xF7, 0xCA, 0x03,
+ 0x2B, 0x00, 0x91, 0x00, 0x9F, 0x03, 0x2B, 0x00,
+ 0xB4, 0x01, 0x9F, 0x03, 0x2B, 0x00, 0xD8, 0x02,
+ 0x9F, 0x03, 0x2B, 0x00, 0xFB, 0x03, 0x9F, 0x03,
+ 0x2E, 0x00, 0x1F, 0x05, 0xD1, 0x04, 0x2F, 0x00,
+ 0x42, 0x06, 0x4E, 0x05, 0x2F, 0x00, 0x66, 0x07,
+ 0x4E, 0x05, 0x2F, 0x00, 0x89, 0x08, 0x4E, 0x05,
+ 0x2B, 0x00, 0x6F, 0xFF, 0x9F, 0x03, 0x2B, 0x00,
+ 0x4C, 0xFE, 0x9F, 0x03, 0x2B, 0x00, 0x28, 0xFD,
+ 0x9F, 0x03, 0x2B, 0x00, 0x05, 0xFC, 0x9F, 0x03,
+ 0x2E, 0x00, 0xE1, 0xFA, 0xD1, 0x04, 0x2F, 0x00,
+ 0xBE, 0xF9, 0x4E, 0x05, 0x2F, 0x00, 0x9A, 0xF8,
+ 0x4E, 0x05, 0x2F, 0x00, 0x77, 0xF7, 0x4E, 0x05,
+ 0x2E, 0x00, 0x91, 0x00, 0xA8, 0x04, 0x2E, 0x00,
+ 0xB4, 0x01, 0xA8, 0x04, 0x2E, 0x00, 0xD8, 0x02,
+ 0xA8, 0x04, 0x2E, 0x00, 0xFB, 0x03, 0xA8, 0x04,
+ 0x30, 0x00, 0x1F, 0x05, 0x33, 0x06, 0x30, 0x00,
+ 0x42, 0x06, 0xD2, 0x06, 0x30, 0x00, 0x66, 0x07,
+ 0xD2, 0x06, 0x30, 0x00, 0x89, 0x08, 0xD2, 0x06,
+ 0x2E, 0x00, 0x6F, 0xFF, 0xA8, 0x04, 0x2E, 0x00,
+ 0x4C, 0xFE, 0xA8, 0x04, 0x2E, 0x00, 0x28, 0xFD,
+ 0xA8, 0x04, 0x2E, 0x00, 0x05, 0xFC, 0xA8, 0x04,
+ 0x30, 0x00, 0xE1, 0xFA, 0x33, 0x06, 0x30, 0x00,
+ 0xBE, 0xF9, 0xD2, 0x06, 0x30, 0x00, 0x9A, 0xF8,
+ 0xD2, 0x06, 0x30, 0x00, 0x77, 0xF7, 0xD2, 0x06,
+ 0x30, 0x00, 0x91, 0x00, 0xB1, 0x05, 0x30, 0x00,
+ 0xB4, 0x01, 0xB1, 0x05, 0x30, 0x00, 0xD8, 0x02,
+ 0xB1, 0x05, 0x30, 0x00, 0xFB, 0x03, 0xB1, 0x05,
+ 0x30, 0x00, 0x1F, 0x05, 0x93, 0x07, 0x30, 0x00,
+ 0x42, 0x06, 0x56, 0x08, 0x30, 0x00, 0x66, 0x07,
+ 0x56, 0x08, 0x30, 0x00, 0x89, 0x08, 0x56, 0x08,
+ 0x30, 0x00, 0x6F, 0xFF, 0xB1, 0x05, 0x30, 0x00,
+ 0x4C, 0xFE, 0xB1, 0x05, 0x30, 0x00, 0x28, 0xFD,
+ 0xB1, 0x05, 0x30, 0x00, 0x05, 0xFC, 0xB1, 0x05,
+ 0x30, 0x00, 0xE1, 0xFA, 0x93, 0x07, 0x30, 0x00,
+ 0xBE, 0xF9, 0x56, 0x08, 0x30, 0x00, 0x9A, 0xF8,
+ 0x56, 0x08, 0x30, 0x00, 0x77, 0xF7, 0x56, 0x08,
+ 0x30, 0x00, 0x91, 0x00, 0xBA, 0x06, 0x30, 0x00,
+ 0xB4, 0x01, 0xBA, 0x06, 0x30, 0x00, 0xD8, 0x02,
+ 0xBA, 0x06, 0x30, 0x00, 0xFB, 0x03, 0xBA, 0x06,
+ 0x30, 0x00, 0x1F, 0x05, 0xF4, 0x08, 0x30, 0x00,
+ 0x42, 0x06, 0xDA, 0x09, 0x30, 0x00, 0x66, 0x07,
+ 0xDA, 0x09, 0x30, 0x00, 0x89, 0x08, 0xDA, 0x09,
+ 0x30, 0x00, 0x6F, 0xFF, 0xBA, 0x06, 0x30, 0x00,
+ 0x4C, 0xFE, 0xBA, 0x06, 0x30, 0x00, 0x28, 0xFD,
+ 0xBA, 0x06, 0x30, 0x00, 0x05, 0xFC, 0xBA, 0x06,
+ 0x30, 0x00, 0xE1, 0xFA, 0xF4, 0x08, 0x30, 0x00,
+ 0xBE, 0xF9, 0xDA, 0x09, 0x30, 0x00, 0x9A, 0xF8,
+ 0xDA, 0x09, 0x30, 0x00, 0x77, 0xF7, 0xDA, 0x09,
+ 0x30, 0x00, 0x91, 0x00, 0xC3, 0x07, 0x30, 0x00,
+ 0xB4, 0x01, 0xC3, 0x07, 0x30, 0x00, 0xD8, 0x02,
+ 0xC3, 0x07, 0x30, 0x00, 0xFB, 0x03, 0xC3, 0x07,
+ 0x30, 0x00, 0x1F, 0x05, 0x54, 0x0A, 0x30, 0x00,
+ 0x42, 0x06, 0x5E, 0x0B, 0x30, 0x00, 0x66, 0x07,
+ 0x5E, 0x0B, 0x30, 0x00, 0x89, 0x08, 0x5E, 0x0B,
+ 0x30, 0x00, 0x6F, 0xFF, 0xC3, 0x07, 0x30, 0x00,
+ 0x4C, 0xFE, 0xC3, 0x07, 0x30, 0x00, 0x28, 0xFD,
+ 0xC3, 0x07, 0x30, 0x00, 0x05, 0xFC, 0xC3, 0x07,
+ 0x30, 0x00, 0xE1, 0xFA, 0x54, 0x0A, 0x30, 0x00,
+ 0xBE, 0xF9, 0x5E, 0x0B, 0x30, 0x00, 0x9A, 0xF8,
+ 0x5E, 0x0B, 0x30, 0x00, 0x77, 0xF7, 0x5E, 0x0B,
+ 0x2B, 0x00, 0x91, 0x00, 0x7C, 0xFF, 0x2B, 0x00,
+ 0xB4, 0x01, 0x7C, 0xFF, 0x2B, 0x00, 0xD8, 0x02,
+ 0x7C, 0xFF, 0x2B, 0x00, 0xFB, 0x03, 0x7C, 0xFF,
+ 0x2E, 0x00, 0x1F, 0x05, 0x50, 0xFF, 0x2F, 0x00,
+ 0x42, 0x06, 0x3E, 0xFF, 0x2F, 0x00, 0x66, 0x07,
+ 0x3E, 0xFF, 0x2F, 0x00, 0x89, 0x08, 0x3E, 0xFF,
+ 0x2B, 0x00, 0x6F, 0xFF, 0x7C, 0xFF, 0x2B, 0x00,
+ 0x4C, 0xFE, 0x7C, 0xFF, 0x2B, 0x00, 0x28, 0xFD,
+ 0x7C, 0xFF, 0x2B, 0x00, 0x05, 0xFC, 0x7C, 0xFF,
+ 0x2E, 0x00, 0xE1, 0xFA, 0x50, 0xFF, 0x2F, 0x00,
+ 0xBE, 0xF9, 0x3E, 0xFF, 0x2F, 0x00, 0x9A, 0xF8,
+ 0x3E, 0xFF, 0x2F, 0x00, 0x77, 0xF7, 0x3E, 0xFF,
+ 0x2B, 0x00, 0x91, 0x00, 0x73, 0xFE, 0x2B, 0x00,
+ 0xB4, 0x01, 0x73, 0xFE, 0x2B, 0x00, 0xD8, 0x02,
+ 0x73, 0xFE, 0x2B, 0x00, 0xFB, 0x03, 0x73, 0xFE,
+ 0x2E, 0x00, 0x1F, 0x05, 0xF0, 0xFD, 0x2F, 0x00,
+ 0x42, 0x06, 0xBA, 0xFD, 0x2F, 0x00, 0x66, 0x07,
+ 0xBA, 0xFD, 0x2F, 0x00, 0x89, 0x08, 0xBA, 0xFD,
+ 0x2B, 0x00, 0x6F, 0xFF, 0x73, 0xFE, 0x2B, 0x00,
+ 0x4C, 0xFE, 0x73, 0xFE, 0x2B, 0x00, 0x28, 0xFD,
+ 0x73, 0xFE, 0x2B, 0x00, 0x05, 0xFC, 0x73, 0xFE,
+ 0x2E, 0x00, 0xE1, 0xFA, 0xF0, 0xFD, 0x2F, 0x00,
+ 0xBE, 0xF9, 0xBA, 0xFD, 0x2F, 0x00, 0x9A, 0xF8,
+ 0xBA, 0xFD, 0x2F, 0x00, 0x77, 0xF7, 0xBA, 0xFD,
+ 0x2B, 0x00, 0x91, 0x00, 0x6A, 0xFD, 0x2B, 0x00,
+ 0xB4, 0x01, 0x6A, 0xFD, 0x2B, 0x00, 0xD8, 0x02,
+ 0x6A, 0xFD, 0x2B, 0x00, 0xFB, 0x03, 0x6A, 0xFD,
+ 0x2E, 0x00, 0x1F, 0x05, 0x8F, 0xFC, 0x2F, 0x00,
+ 0x42, 0x06, 0x36, 0xFC, 0x2F, 0x00, 0x66, 0x07,
+ 0x36, 0xFC, 0x2F, 0x00, 0x89, 0x08, 0x36, 0xFC,
+ 0x2B, 0x00, 0x6F, 0xFF, 0x6A, 0xFD, 0x2B, 0x00,
+ 0x4C, 0xFE, 0x6A, 0xFD, 0x2B, 0x00, 0x28, 0xFD,
+ 0x6A, 0xFD, 0x2B, 0x00, 0x05, 0xFC, 0x6A, 0xFD,
+ 0x2E, 0x00, 0xE1, 0xFA, 0x8F, 0xFC, 0x2F, 0x00,
+ 0xBE, 0xF9, 0x36, 0xFC, 0x2F, 0x00, 0x9A, 0xF8,
+ 0x36, 0xFC, 0x2F, 0x00, 0x77, 0xF7, 0x36, 0xFC,
+ 0x2B, 0x00, 0x91, 0x00, 0x61, 0xFC, 0x2B, 0x00,
+ 0xB4, 0x01, 0x61, 0xFC, 0x2B, 0x00, 0xD8, 0x02,
+ 0x61, 0xFC, 0x2B, 0x00, 0xFB, 0x03, 0x61, 0xFC,
+ 0x2E, 0x00, 0x1F, 0x05, 0x2F, 0xFB, 0x2F, 0x00,
+ 0x42, 0x06, 0xB2, 0xFA, 0x2F, 0x00, 0x66, 0x07,
+ 0xB2, 0xFA, 0x2F, 0x00, 0x89, 0x08, 0xB2, 0xFA,
+ 0x2B, 0x00, 0x6F, 0xFF, 0x61, 0xFC, 0x2B, 0x00,
+ 0x4C, 0xFE, 0x61, 0xFC, 0x2B, 0x00, 0x28, 0xFD,
+ 0x61, 0xFC, 0x2B, 0x00, 0x05, 0xFC, 0x61, 0xFC,
+ 0x2E, 0x00, 0xE1, 0xFA, 0x2F, 0xFB, 0x2F, 0x00,
+ 0xBE, 0xF9, 0xB2, 0xFA, 0x2F, 0x00, 0x9A, 0xF8,
+ 0xB2, 0xFA, 0x2F, 0x00, 0x77, 0xF7, 0xB2, 0xFA,
+ 0x2E, 0x00, 0x91, 0x00, 0x58, 0xFB, 0x2E, 0x00,
+ 0xB4, 0x01, 0x58, 0xFB, 0x2E, 0x00, 0xD8, 0x02,
+ 0x58, 0xFB, 0x2E, 0x00, 0xFB, 0x03, 0x58, 0xFB,
+ 0x30, 0x00, 0x1F, 0x05, 0xCD, 0xF9, 0x30, 0x00,
+ 0x42, 0x06, 0x2E, 0xF9, 0x30, 0x00, 0x66, 0x07,
+ 0x2E, 0xF9, 0x30, 0x00, 0x89, 0x08, 0x2E, 0xF9,
+ 0x2E, 0x00, 0x6F, 0xFF, 0x58, 0xFB, 0x2E, 0x00,
+ 0x4C, 0xFE, 0x58, 0xFB, 0x2E, 0x00, 0x28, 0xFD,
+ 0x58, 0xFB, 0x2E, 0x00, 0x05, 0xFC, 0x58, 0xFB,
+ 0x30, 0x00, 0xE1, 0xFA, 0xCD, 0xF9, 0x30, 0x00,
+ 0xBE, 0xF9, 0x2E, 0xF9, 0x30, 0x00, 0x9A, 0xF8,
+ 0x2E, 0xF9, 0x30, 0x00, 0x77, 0xF7, 0x2E, 0xF9,
+ 0x30, 0x00, 0x91, 0x00, 0x4F, 0xFA, 0x30, 0x00,
+ 0xB4, 0x01, 0x4F, 0xFA, 0x30, 0x00, 0xD8, 0x02,
+ 0x4F, 0xFA, 0x30, 0x00, 0xFB, 0x03, 0x4F, 0xFA,
+ 0x30, 0x00, 0x1F, 0x05, 0x6D, 0xF8, 0x30, 0x00,
+ 0x42, 0x06, 0xAA, 0xF7, 0x30, 0x00, 0x66, 0x07,
+ 0xAA, 0xF7, 0x30, 0x00, 0x89, 0x08, 0xAA, 0xF7,
+ 0x30, 0x00, 0x6F, 0xFF, 0x4F, 0xFA, 0x30, 0x00,
+ 0x4C, 0xFE, 0x4F, 0xFA, 0x30, 0x00, 0x28, 0xFD,
+ 0x4F, 0xFA, 0x30, 0x00, 0x05, 0xFC, 0x4F, 0xFA,
+ 0x30, 0x00, 0xE1, 0xFA, 0x6D, 0xF8, 0x30, 0x00,
+ 0xBE, 0xF9, 0xAA, 0xF7, 0x30, 0x00, 0x9A, 0xF8,
+ 0xAA, 0xF7, 0x30, 0x00, 0x77, 0xF7, 0xAA, 0xF7,
+ 0x30, 0x00, 0x91, 0x00, 0x46, 0xF9, 0x30, 0x00,
+ 0xB4, 0x01, 0x46, 0xF9, 0x30, 0x00, 0xD8, 0x02,
+ 0x46, 0xF9, 0x30, 0x00, 0xFB, 0x03, 0x46, 0xF9,
+ 0x30, 0x00, 0x1F, 0x05, 0x0C, 0xF7, 0x30, 0x00,
+ 0x42, 0x06, 0x26, 0xF6, 0x30, 0x00, 0x66, 0x07,
+ 0x26, 0xF6, 0x30, 0x00, 0x89, 0x08, 0x26, 0xF6,
+ 0x30, 0x00, 0x6F, 0xFF, 0x46, 0xF9, 0x30, 0x00,
+ 0x4C, 0xFE, 0x46, 0xF9, 0x30, 0x00, 0x28, 0xFD,
+ 0x46, 0xF9, 0x30, 0x00, 0x05, 0xFC, 0x46, 0xF9,
+ 0x30, 0x00, 0xE1, 0xFA, 0x0C, 0xF7, 0x30, 0x00,
+ 0xBE, 0xF9, 0x26, 0xF6, 0x30, 0x00, 0x9A, 0xF8,
+ 0x26, 0xF6, 0x30, 0x00, 0x77, 0xF7, 0x26, 0xF6,
+ 0x30, 0x00, 0x91, 0x00, 0x3D, 0xF8, 0x30, 0x00,
+ 0xB4, 0x01, 0x3D, 0xF8, 0x30, 0x00, 0xD8, 0x02,
+ 0x3D, 0xF8, 0x30, 0x00, 0xFB, 0x03, 0x3D, 0xF8,
+ 0x30, 0x00, 0x1F, 0x05, 0xAC, 0xF5, 0x30, 0x00,
+ 0x42, 0x06, 0xA2, 0xF4, 0x30, 0x00, 0x66, 0x07,
+ 0xA2, 0xF4, 0x30, 0x00, 0x89, 0x08, 0xA2, 0xF4,
+ 0x30, 0x00, 0x6F, 0xFF, 0x3D, 0xF8, 0x30, 0x00,
+ 0x4C, 0xFE, 0x3D, 0xF8, 0x30, 0x00, 0x28, 0xFD,
+ 0x3D, 0xF8, 0x30, 0x00, 0x05, 0xFC, 0x3D, 0xF8,
+ 0x30, 0x00, 0xE1, 0xFA, 0xAC, 0xF5, 0x30, 0x00,
+ 0xBE, 0xF9, 0xA2, 0xF4, 0x30, 0x00, 0x9A, 0xF8,
+ 0xA2, 0xF4, 0x30, 0x00, 0x77, 0xF7, 0xA2, 0xF4,
+ 0x2C, 0x00, 0xA0, 0x00, 0x91, 0x00, 0x2C, 0x00,
+ 0xE0, 0x01, 0x91, 0x00, 0x2C, 0x00, 0x21, 0x03,
+ 0x91, 0x00, 0x2C, 0x00, 0x61, 0x04, 0x91, 0x00,
+ 0x2F, 0x00, 0xA2, 0x05, 0xC2, 0x00, 0x2F, 0x00,
+ 0xE2, 0x06, 0xC2, 0x00, 0x2F, 0x00, 0x23, 0x08,
+ 0xC2, 0x00, 0x2F, 0x00, 0x63, 0x09, 0xC2, 0x00,
+ 0x2C, 0x00, 0x60, 0xFF, 0x91, 0x00, 0x2C, 0x00,
+ 0x20, 0xFE, 0x91, 0x00, 0x2C, 0x00, 0xDF, 0xFC,
+ 0x91, 0x00, 0x2C, 0x00, 0x9F, 0xFB, 0x91, 0x00,
+ 0x2F, 0x00, 0x5E, 0xFA, 0xC2, 0x00, 0x2F, 0x00,
+ 0x1E, 0xF9, 0xC2, 0x00, 0x2F, 0x00, 0xDD, 0xF7,
+ 0xC2, 0x00, 0x2F, 0x00, 0x9D, 0xF6, 0xC2, 0x00,
+ 0x2C, 0x00, 0xA0, 0x00, 0xB4, 0x01, 0x2C, 0x00,
+ 0xE0, 0x01, 0xB4, 0x01, 0x2C, 0x00, 0x21, 0x03,
+ 0xB4, 0x01, 0x2C, 0x00, 0x61, 0x04, 0xB4, 0x01,
+ 0x2F, 0x00, 0xA2, 0x05, 0x46, 0x02, 0x2F, 0x00,
+ 0xE2, 0x06, 0x46, 0x02, 0x2F, 0x00, 0x23, 0x08,
+ 0x46, 0x02, 0x2F, 0x00, 0x63, 0x09, 0x46, 0x02,
+ 0x2C, 0x00, 0x60, 0xFF, 0xB4, 0x01, 0x2C, 0x00,
+ 0x20, 0xFE, 0xB4, 0x01, 0x2C, 0x00, 0xDF, 0xFC,
+ 0xB4, 0x01, 0x2C, 0x00, 0x9F, 0xFB, 0xB4, 0x01,
+ 0x2F, 0x00, 0x5E, 0xFA, 0x46, 0x02, 0x2F, 0x00,
+ 0x1E, 0xF9, 0x46, 0x02, 0x2F, 0x00, 0xDD, 0xF7,
+ 0x46, 0x02, 0x2F, 0x00, 0x9D, 0xF6, 0x46, 0x02,
+ 0x2C, 0x00, 0xA0, 0x00, 0xD8, 0x02, 0x2C, 0x00,
+ 0xE0, 0x01, 0xD8, 0x02, 0x2C, 0x00, 0x21, 0x03,
+ 0xD8, 0x02, 0x2C, 0x00, 0x61, 0x04, 0xD8, 0x02,
+ 0x2F, 0x00, 0xA2, 0x05, 0xCA, 0x03, 0x2F, 0x00,
+ 0xE2, 0x06, 0xCA, 0x03, 0x2F, 0x00, 0x23, 0x08,
+ 0xCA, 0x03, 0x2F, 0x00, 0x63, 0x09, 0xCA, 0x03,
+ 0x2C, 0x00, 0x60, 0xFF, 0xD8, 0x02, 0x2C, 0x00,
+ 0x20, 0xFE, 0xD8, 0x02, 0x2C, 0x00, 0xDF, 0xFC,
+ 0xD8, 0x02, 0x2C, 0x00, 0x9F, 0xFB, 0xD8, 0x02,
+ 0x2F, 0x00, 0x5E, 0xFA, 0xCA, 0x03, 0x2F, 0x00,
+ 0x1E, 0xF9, 0xCA, 0x03, 0x2F, 0x00, 0xDD, 0xF7,
+ 0xCA, 0x03, 0x2F, 0x00, 0x9D, 0xF6, 0xCA, 0x03,
+ 0x2C, 0x00, 0xA0, 0x00, 0xFB, 0x03, 0x2C, 0x00,
+ 0xE0, 0x01, 0xFB, 0x03, 0x2C, 0x00, 0x21, 0x03,
+ 0xFB, 0x03, 0x2C, 0x00, 0x61, 0x04, 0xFB, 0x03,
+ 0x2F, 0x00, 0xA2, 0x05, 0x4E, 0x05, 0x2F, 0x00,
+ 0xE2, 0x06, 0x4E, 0x05, 0x2F, 0x00, 0x23, 0x08,
+ 0x4E, 0x05, 0x2F, 0x00, 0x63, 0x09, 0x4E, 0x05,
+ 0x2C, 0x00, 0x60, 0xFF, 0xFB, 0x03, 0x2C, 0x00,
+ 0x20, 0xFE, 0xFB, 0x03, 0x2C, 0x00, 0xDF, 0xFC,
+ 0xFB, 0x03, 0x2C, 0x00, 0x9F, 0xFB, 0xFB, 0x03,
+ 0x2F, 0x00, 0x5E, 0xFA, 0x4E, 0x05, 0x2F, 0x00,
+ 0x1E, 0xF9, 0x4E, 0x05, 0x2F, 0x00, 0xDD, 0xF7,
+ 0x4E, 0x05, 0x2F, 0x00, 0x9D, 0xF6, 0x4E, 0x05,
+ 0x2F, 0x00, 0xA0, 0x00, 0x1F, 0x05, 0x2F, 0x00,
+ 0xE0, 0x01, 0x1F, 0x05, 0x2F, 0x00, 0x21, 0x03,
+ 0x1F, 0x05, 0x2F, 0x00, 0x61, 0x04, 0x1F, 0x05,
+ 0x30, 0x00, 0xA2, 0x05, 0xD2, 0x06, 0x30, 0x00,
+ 0xE2, 0x06, 0xD2, 0x06, 0x30, 0x00, 0x23, 0x08,
+ 0xD2, 0x06, 0x30, 0x00, 0x63, 0x09, 0xD2, 0x06,
+ 0x2F, 0x00, 0x60, 0xFF, 0x1F, 0x05, 0x2F, 0x00,
+ 0x20, 0xFE, 0x1F, 0x05, 0x2F, 0x00, 0xDF, 0xFC,
+ 0x1F, 0x05, 0x2F, 0x00, 0x9F, 0xFB, 0x1F, 0x05,
+ 0x30, 0x00, 0x5E, 0xFA, 0xD2, 0x06, 0x30, 0x00,
+ 0x1E, 0xF9, 0xD2, 0x06, 0x30, 0x00, 0xDD, 0xF7,
+ 0xD2, 0x06, 0x30, 0x00, 0x9D, 0xF6, 0xD2, 0x06,
+ 0x30, 0x00, 0xA0, 0x00, 0x42, 0x06, 0x30, 0x00,
+ 0xE0, 0x01, 0x42, 0x06, 0x30, 0x00, 0x21, 0x03,
+ 0x42, 0x06, 0x30, 0x00, 0x61, 0x04, 0x42, 0x06,
+ 0x30, 0x00, 0xA2, 0x05, 0x56, 0x08, 0x30, 0x00,
+ 0xE2, 0x06, 0x56, 0x08, 0x30, 0x00, 0x23, 0x08,
+ 0x56, 0x08, 0x30, 0x00, 0x63, 0x09, 0x56, 0x08,
+ 0x30, 0x00, 0x60, 0xFF, 0x42, 0x06, 0x30, 0x00,
+ 0x20, 0xFE, 0x42, 0x06, 0x30, 0x00, 0xDF, 0xFC,
+ 0x42, 0x06, 0x30, 0x00, 0x9F, 0xFB, 0x42, 0x06,
+ 0x30, 0x00, 0x5E, 0xFA, 0x56, 0x08, 0x30, 0x00,
+ 0x1E, 0xF9, 0x56, 0x08, 0x30, 0x00, 0xDD, 0xF7,
+ 0x56, 0x08, 0x30, 0x00, 0x9D, 0xF6, 0x56, 0x08,
+ 0x30, 0x00, 0xA0, 0x00, 0x66, 0x07, 0x30, 0x00,
+ 0xE0, 0x01, 0x66, 0x07, 0x30, 0x00, 0x21, 0x03,
+ 0x66, 0x07, 0x30, 0x00, 0x61, 0x04, 0x66, 0x07,
+ 0x30, 0x00, 0xA2, 0x05, 0xDA, 0x09, 0x30, 0x00,
+ 0xE2, 0x06, 0xDA, 0x09, 0x30, 0x00, 0x23, 0x08,
+ 0xDA, 0x09, 0x30, 0x00, 0x63, 0x09, 0xDA, 0x09,
+ 0x30, 0x00, 0x60, 0xFF, 0x66, 0x07, 0x30, 0x00,
+ 0x20, 0xFE, 0x66, 0x07, 0x30, 0x00, 0xDF, 0xFC,
+ 0x66, 0x07, 0x30, 0x00, 0x9F, 0xFB, 0x66, 0x07,
+ 0x30, 0x00, 0x5E, 0xFA, 0xDA, 0x09, 0x30, 0x00,
+ 0x1E, 0xF9, 0xDA, 0x09, 0x30, 0x00, 0xDD, 0xF7,
+ 0xDA, 0x09, 0x30, 0x00, 0x9D, 0xF6, 0xDA, 0x09,
+ 0x30, 0x00, 0xA0, 0x00, 0x89, 0x08, 0x30, 0x00,
+ 0xE0, 0x01, 0x89, 0x08, 0x30, 0x00, 0x21, 0x03,
+ 0x89, 0x08, 0x30, 0x00, 0x61, 0x04, 0x89, 0x08,
+ 0x30, 0x00, 0xA2, 0x05, 0x5E, 0x0B, 0x30, 0x00,
+ 0xE2, 0x06, 0x5E, 0x0B, 0x30, 0x00, 0x23, 0x08,
+ 0x5E, 0x0B, 0x30, 0x00, 0x63, 0x09, 0x5E, 0x0B,
+ 0x30, 0x00, 0x60, 0xFF, 0x89, 0x08, 0x30, 0x00,
+ 0x20, 0xFE, 0x89, 0x08, 0x30, 0x00, 0xDF, 0xFC,
+ 0x89, 0x08, 0x30, 0x00, 0x9F, 0xFB, 0x89, 0x08,
+ 0x30, 0x00, 0x5E, 0xFA, 0x5E, 0x0B, 0x30, 0x00,
+ 0x1E, 0xF9, 0x5E, 0x0B, 0x30, 0x00, 0xDD, 0xF7,
+ 0x5E, 0x0B, 0x30, 0x00, 0x9D, 0xF6, 0x5E, 0x0B,
+ 0x2C, 0x00, 0xA0, 0x00, 0x6F, 0xFF, 0x2C, 0x00,
+ 0xE0, 0x01, 0x6F, 0xFF, 0x2C, 0x00, 0x21, 0x03,
+ 0x6F, 0xFF, 0x2C, 0x00, 0x61, 0x04, 0x6F, 0xFF,
+ 0x2F, 0x00, 0xA2, 0x05, 0x3E, 0xFF, 0x2F, 0x00,
+ 0xE2, 0x06, 0x3E, 0xFF, 0x2F, 0x00, 0x23, 0x08,
+ 0x3E, 0xFF, 0x2F, 0x00, 0x63, 0x09, 0x3E, 0xFF,
+ 0x2C, 0x00, 0x60, 0xFF, 0x6F, 0xFF, 0x2C, 0x00,
+ 0x20, 0xFE, 0x6F, 0xFF, 0x2C, 0x00, 0xDF, 0xFC,
+ 0x6F, 0xFF, 0x2C, 0x00, 0x9F, 0xFB, 0x6F, 0xFF,
+ 0x2F, 0x00, 0x5E, 0xFA, 0x3E, 0xFF, 0x2F, 0x00,
+ 0x1E, 0xF9, 0x3E, 0xFF, 0x2F, 0x00, 0xDD, 0xF7,
+ 0x3E, 0xFF, 0x2F, 0x00, 0x9D, 0xF6, 0x3E, 0xFF,
+ 0x2C, 0x00, 0xA0, 0x00, 0x4C, 0xFE, 0x2C, 0x00,
+ 0xE0, 0x01, 0x4C, 0xFE, 0x2C, 0x00, 0x21, 0x03,
+ 0x4C, 0xFE, 0x2C, 0x00, 0x61, 0x04, 0x4C, 0xFE,
+ 0x2F, 0x00, 0xA2, 0x05, 0xBA, 0xFD, 0x2F, 0x00,
+ 0xE2, 0x06, 0xBA, 0xFD, 0x2F, 0x00, 0x23, 0x08,
+ 0xBA, 0xFD, 0x2F, 0x00, 0x63, 0x09, 0xBA, 0xFD,
+ 0x2C, 0x00, 0x60, 0xFF, 0x4C, 0xFE, 0x2C, 0x00,
+ 0x20, 0xFE, 0x4C, 0xFE, 0x2C, 0x00, 0xDF, 0xFC,
+ 0x4C, 0xFE, 0x2C, 0x00, 0x9F, 0xFB, 0x4C, 0xFE,
+ 0x2F, 0x00, 0x5E, 0xFA, 0xBA, 0xFD, 0x2F, 0x00,
+ 0x1E, 0xF9, 0xBA, 0xFD, 0x2F, 0x00, 0xDD, 0xF7,
+ 0xBA, 0xFD, 0x2F, 0x00, 0x9D, 0xF6, 0xBA, 0xFD,
+ 0x2C, 0x00, 0xA0, 0x00, 0x28, 0xFD, 0x2C, 0x00,
+ 0xE0, 0x01, 0x28, 0xFD, 0x2C, 0x00, 0x21, 0x03,
+ 0x28, 0xFD, 0x2C, 0x00, 0x61, 0x04, 0x28, 0xFD,
+ 0x2F, 0x00, 0xA2, 0x05, 0x36, 0xFC, 0x2F, 0x00,
+ 0xE2, 0x06, 0x36, 0xFC, 0x2F, 0x00, 0x23, 0x08,
+ 0x36, 0xFC, 0x2F, 0x00, 0x63, 0x09, 0x36, 0xFC,
+ 0x2C, 0x00, 0x60, 0xFF, 0x28, 0xFD, 0x2C, 0x00,
+ 0x20, 0xFE, 0x28, 0xFD, 0x2C, 0x00, 0xDF, 0xFC,
+ 0x28, 0xFD, 0x2C, 0x00, 0x9F, 0xFB, 0x28, 0xFD,
+ 0x2F, 0x00, 0x5E, 0xFA, 0x36, 0xFC, 0x2F, 0x00,
+ 0x1E, 0xF9, 0x36, 0xFC, 0x2F, 0x00, 0xDD, 0xF7,
+ 0x36, 0xFC, 0x2F, 0x00, 0x9D, 0xF6, 0x36, 0xFC,
+ 0x2C, 0x00, 0xA0, 0x00, 0x05, 0xFC, 0x2C, 0x00,
+ 0xE0, 0x01, 0x05, 0xFC, 0x2C, 0x00, 0x21, 0x03,
+ 0x05, 0xFC, 0x2C, 0x00, 0x61, 0x04, 0x05, 0xFC,
+ 0x2F, 0x00, 0xA2, 0x05, 0xB2, 0xFA, 0x2F, 0x00,
+ 0xE2, 0x06, 0xB2, 0xFA, 0x2F, 0x00, 0x23, 0x08,
+ 0xB2, 0xFA, 0x2F, 0x00, 0x63, 0x09, 0xB2, 0xFA,
+ 0x2C, 0x00, 0x60, 0xFF, 0x05, 0xFC, 0x2C, 0x00,
+ 0x20, 0xFE, 0x05, 0xFC, 0x2C, 0x00, 0xDF, 0xFC,
+ 0x05, 0xFC, 0x2C, 0x00, 0x9F, 0xFB, 0x05, 0xFC,
+ 0x2F, 0x00, 0x5E, 0xFA, 0xB2, 0xFA, 0x2F, 0x00,
+ 0x1E, 0xF9, 0xB2, 0xFA, 0x2F, 0x00, 0xDD, 0xF7,
+ 0xB2, 0xFA, 0x2F, 0x00, 0x9D, 0xF6, 0xB2, 0xFA,
+ 0x2F, 0x00, 0xA0, 0x00, 0xE1, 0xFA, 0x2F, 0x00,
+ 0xE0, 0x01, 0xE1, 0xFA, 0x2F, 0x00, 0x21, 0x03,
+ 0xE1, 0xFA, 0x2F, 0x00, 0x61, 0x04, 0xE1, 0xFA,
+ 0x30, 0x00, 0xA2, 0x05, 0x2E, 0xF9, 0x30, 0x00,
+ 0xE2, 0x06, 0x2E, 0xF9, 0x30, 0x00, 0x23, 0x08,
+ 0x2E, 0xF9, 0x30, 0x00, 0x63, 0x09, 0x2E, 0xF9,
+ 0x2F, 0x00, 0x60, 0xFF, 0xE1, 0xFA, 0x2F, 0x00,
+ 0x20, 0xFE, 0xE1, 0xFA, 0x2F, 0x00, 0xDF, 0xFC,
+ 0xE1, 0xFA, 0x2F, 0x00, 0x9F, 0xFB, 0xE1, 0xFA,
+ 0x30, 0x00, 0x5E, 0xFA, 0x2E, 0xF9, 0x30, 0x00,
+ 0x1E, 0xF9, 0x2E, 0xF9, 0x30, 0x00, 0xDD, 0xF7,
+ 0x2E, 0xF9, 0x30, 0x00, 0x9D, 0xF6, 0x2E, 0xF9,
+ 0x30, 0x00, 0xA0, 0x00, 0xBE, 0xF9, 0x30, 0x00,
+ 0xE0, 0x01, 0xBE, 0xF9, 0x30, 0x00, 0x21, 0x03,
+ 0xBE, 0xF9, 0x30, 0x00, 0x61, 0x04, 0xBE, 0xF9,
+ 0x30, 0x00, 0xA2, 0x05, 0xAA, 0xF7, 0x30, 0x00,
+ 0xE2, 0x06, 0xAA, 0xF7, 0x30, 0x00, 0x23, 0x08,
+ 0xAA, 0xF7, 0x30, 0x00, 0x63, 0x09, 0xAA, 0xF7,
+ 0x30, 0x00, 0x60, 0xFF, 0xBE, 0xF9, 0x30, 0x00,
+ 0x20, 0xFE, 0xBE, 0xF9, 0x30, 0x00, 0xDF, 0xFC,
+ 0xBE, 0xF9, 0x30, 0x00, 0x9F, 0xFB, 0xBE, 0xF9,
+ 0x30, 0x00, 0x5E, 0xFA, 0xAA, 0xF7, 0x30, 0x00,
+ 0x1E, 0xF9, 0xAA, 0xF7, 0x30, 0x00, 0xDD, 0xF7,
+ 0xAA, 0xF7, 0x30, 0x00, 0x9D, 0xF6, 0xAA, 0xF7,
+ 0x30, 0x00, 0xA0, 0x00, 0x9A, 0xF8, 0x30, 0x00,
+ 0xE0, 0x01, 0x9A, 0xF8, 0x30, 0x00, 0x21, 0x03,
+ 0x9A, 0xF8, 0x30, 0x00, 0x61, 0x04, 0x9A, 0xF8,
+ 0x30, 0x00, 0xA2, 0x05, 0x26, 0xF6, 0x30, 0x00,
+ 0xE2, 0x06, 0x26, 0xF6, 0x30, 0x00, 0x23, 0x08,
+ 0x26, 0xF6, 0x30, 0x00, 0x63, 0x09, 0x26, 0xF6,
+ 0x30, 0x00, 0x60, 0xFF, 0x9A, 0xF8, 0x30, 0x00,
+ 0x20, 0xFE, 0x9A, 0xF8, 0x30, 0x00, 0xDF, 0xFC,
+ 0x9A, 0xF8, 0x30, 0x00, 0x9F, 0xFB, 0x9A, 0xF8,
+ 0x30, 0x00, 0x5E, 0xFA, 0x26, 0xF6, 0x30, 0x00,
+ 0x1E, 0xF9, 0x26, 0xF6, 0x30, 0x00, 0xDD, 0xF7,
+ 0x26, 0xF6, 0x30, 0x00, 0x9D, 0xF6, 0x26, 0xF6,
+ 0x30, 0x00, 0xA0, 0x00, 0x77, 0xF7, 0x30, 0x00,
+ 0xE0, 0x01, 0x77, 0xF7, 0x30, 0x00, 0x21, 0x03,
+ 0x77, 0xF7, 0x30, 0x00, 0x61, 0x04, 0x77, 0xF7,
+ 0x30, 0x00, 0xA2, 0x05, 0xA2, 0xF4, 0x30, 0x00,
+ 0xE2, 0x06, 0xA2, 0xF4, 0x30, 0x00, 0x23, 0x08,
+ 0xA2, 0xF4, 0x30, 0x00, 0x63, 0x09, 0xA2, 0xF4,
+ 0x30, 0x00, 0x60, 0xFF, 0x77, 0xF7, 0x30, 0x00,
+ 0x20, 0xFE, 0x77, 0xF7, 0x30, 0x00, 0xDF, 0xFC,
+ 0x77, 0xF7, 0x30, 0x00, 0x9F, 0xFB, 0x77, 0xF7,
+ 0x30, 0x00, 0x5E, 0xFA, 0xA2, 0xF4, 0x30, 0x00,
+ 0x1E, 0xF9, 0xA2, 0xF4, 0x30, 0x00, 0xDD, 0xF7,
+ 0xA2, 0xF4, 0x30, 0x00, 0x9D, 0xF6, 0xA2, 0xF4,
+ 0x2D, 0x00, 0xB0, 0x00, 0xA0, 0x00, 0x2D, 0x00,
+ 0x10, 0x02, 0xA0, 0x00, 0x2D, 0x00, 0x71, 0x03,
+ 0xA0, 0x00, 0x2D, 0x00, 0xD1, 0x04, 0xA0, 0x00,
+ 0x2F, 0x00, 0x33, 0x06, 0xC2, 0x00, 0x2F, 0x00,
+ 0x93, 0x07, 0xC2, 0x00, 0x2F, 0x00, 0xF4, 0x08,
+ 0xC2, 0x00, 0x2F, 0x00, 0x54, 0x0A, 0xC2, 0x00,
+ 0x2D, 0x00, 0x50, 0xFF, 0xA0, 0x00, 0x2D, 0x00,
+ 0xF0, 0xFD, 0xA0, 0x00, 0x2D, 0x00, 0x8F, 0xFC,
+ 0xA0, 0x00, 0x2D, 0x00, 0x2F, 0xFB, 0xA0, 0x00,
+ 0x2F, 0x00, 0xCD, 0xF9, 0xC2, 0x00, 0x2F, 0x00,
+ 0x6D, 0xF8, 0xC2, 0x00, 0x2F, 0x00, 0x0C, 0xF7,
+ 0xC2, 0x00, 0x2F, 0x00, 0xAC, 0xF5, 0xC2, 0x00,
+ 0x2D, 0x00, 0xB0, 0x00, 0xE0, 0x01, 0x2D, 0x00,
+ 0x10, 0x02, 0xE0, 0x01, 0x2D, 0x00, 0x71, 0x03,
+ 0xE0, 0x01, 0x2D, 0x00, 0xD1, 0x04, 0xE0, 0x01,
+ 0x2F, 0x00, 0x33, 0x06, 0x46, 0x02, 0x2F, 0x00,
+ 0x93, 0x07, 0x46, 0x02, 0x2F, 0x00, 0xF4, 0x08,
+ 0x46, 0x02, 0x2F, 0x00, 0x54, 0x0A, 0x46, 0x02,
+ 0x2D, 0x00, 0x50, 0xFF, 0xE0, 0x01, 0x2D, 0x00,
+ 0xF0, 0xFD, 0xE0, 0x01, 0x2D, 0x00, 0x8F, 0xFC,
+ 0xE0, 0x01, 0x2D, 0x00, 0x2F, 0xFB, 0xE0, 0x01,
+ 0x2F, 0x00, 0xCD, 0xF9, 0x46, 0x02, 0x2F, 0x00,
+ 0x6D, 0xF8, 0x46, 0x02, 0x2F, 0x00, 0x0C, 0xF7,
+ 0x46, 0x02, 0x2F, 0x00, 0xAC, 0xF5, 0x46, 0x02,
+ 0x2D, 0x00, 0xB0, 0x00, 0x21, 0x03, 0x2D, 0x00,
+ 0x10, 0x02, 0x21, 0x03, 0x2D, 0x00, 0x71, 0x03,
+ 0x21, 0x03, 0x2D, 0x00, 0xD1, 0x04, 0x21, 0x03,
+ 0x2F, 0x00, 0x33, 0x06, 0xCA, 0x03, 0x2F, 0x00,
+ 0x93, 0x07, 0xCA, 0x03, 0x2F, 0x00, 0xF4, 0x08,
+ 0xCA, 0x03, 0x2F, 0x00, 0x54, 0x0A, 0xCA, 0x03,
+ 0x2D, 0x00, 0x50, 0xFF, 0x21, 0x03, 0x2D, 0x00,
+ 0xF0, 0xFD, 0x21, 0x03, 0x2D, 0x00, 0x8F, 0xFC,
+ 0x21, 0x03, 0x2D, 0x00, 0x2F, 0xFB, 0x21, 0x03,
+ 0x2F, 0x00, 0xCD, 0xF9, 0xCA, 0x03, 0x2F, 0x00,
+ 0x6D, 0xF8, 0xCA, 0x03, 0x2F, 0x00, 0x0C, 0xF7,
+ 0xCA, 0x03, 0x2F, 0x00, 0xAC, 0xF5, 0xCA, 0x03,
+ 0x2D, 0x00, 0xB0, 0x00, 0x61, 0x04, 0x2D, 0x00,
+ 0x10, 0x02, 0x61, 0x04, 0x2D, 0x00, 0x71, 0x03,
+ 0x61, 0x04, 0x2D, 0x00, 0xD1, 0x04, 0x61, 0x04,
+ 0x2F, 0x00, 0x33, 0x06, 0x4E, 0x05, 0x2F, 0x00,
+ 0x93, 0x07, 0x4E, 0x05, 0x2F, 0x00, 0xF4, 0x08,
+ 0x4E, 0x05, 0x2F, 0x00, 0x54, 0x0A, 0x4E, 0x05,
+ 0x2D, 0x00, 0x50, 0xFF, 0x61, 0x04, 0x2D, 0x00,
+ 0xF0, 0xFD, 0x61, 0x04, 0x2D, 0x00, 0x8F, 0xFC,
+ 0x61, 0x04, 0x2D, 0x00, 0x2F, 0xFB, 0x61, 0x04,
+ 0x2F, 0x00, 0xCD, 0xF9, 0x4E, 0x05, 0x2F, 0x00,
+ 0x6D, 0xF8, 0x4E, 0x05, 0x2F, 0x00, 0x0C, 0xF7,
+ 0x4E, 0x05, 0x2F, 0x00, 0xAC, 0xF5, 0x4E, 0x05,
+ 0x30, 0x00, 0xB0, 0x00, 0xA2, 0x05, 0x30, 0x00,
+ 0x10, 0x02, 0xA2, 0x05, 0x30, 0x00, 0x71, 0x03,
+ 0xA2, 0x05, 0x30, 0x00, 0xD1, 0x04, 0xA2, 0x05,
+ 0x30, 0x00, 0x33, 0x06, 0xD2, 0x06, 0x30, 0x00,
+ 0x93, 0x07, 0xD2, 0x06, 0x30, 0x00, 0xF4, 0x08,
+ 0xD2, 0x06, 0x30, 0x00, 0x54, 0x0A, 0xD2, 0x06,
+ 0x30, 0x00, 0x50, 0xFF, 0xA2, 0x05, 0x30, 0x00,
+ 0xF0, 0xFD, 0xA2, 0x05, 0x30, 0x00, 0x8F, 0xFC,
+ 0xA2, 0x05, 0x30, 0x00, 0x2F, 0xFB, 0xA2, 0x05,
+ 0x30, 0x00, 0xCD, 0xF9, 0xD2, 0x06, 0x30, 0x00,
+ 0x6D, 0xF8, 0xD2, 0x06, 0x30, 0x00, 0x0C, 0xF7,
+ 0xD2, 0x06, 0x30, 0x00, 0xAC, 0xF5, 0xD2, 0x06,
+ 0x30, 0x00, 0xB0, 0x00, 0xE2, 0x06, 0x30, 0x00,
+ 0x10, 0x02, 0xE2, 0x06, 0x30, 0x00, 0x71, 0x03,
+ 0xE2, 0x06, 0x30, 0x00, 0xD1, 0x04, 0xE2, 0x06,
+ 0x30, 0x00, 0x33, 0x06, 0x56, 0x08, 0x30, 0x00,
+ 0x93, 0x07, 0x56, 0x08, 0x30, 0x00, 0xF4, 0x08,
+ 0x56, 0x08, 0x30, 0x00, 0x54, 0x0A, 0x56, 0x08,
+ 0x30, 0x00, 0x50, 0xFF, 0xE2, 0x06, 0x30, 0x00,
+ 0xF0, 0xFD, 0xE2, 0x06, 0x30, 0x00, 0x8F, 0xFC,
+ 0xE2, 0x06, 0x30, 0x00, 0x2F, 0xFB, 0xE2, 0x06,
+ 0x30, 0x00, 0xCD, 0xF9, 0x56, 0x08, 0x30, 0x00,
+ 0x6D, 0xF8, 0x56, 0x08, 0x30, 0x00, 0x0C, 0xF7,
+ 0x56, 0x08, 0x30, 0x00, 0xAC, 0xF5, 0x56, 0x08,
+ 0x30, 0x00, 0xB0, 0x00, 0x23, 0x08, 0x30, 0x00,
+ 0x10, 0x02, 0x23, 0x08, 0x30, 0x00, 0x71, 0x03,
+ 0x23, 0x08, 0x30, 0x00, 0xD1, 0x04, 0x23, 0x08,
+ 0x30, 0x00, 0x33, 0x06, 0xDA, 0x09, 0x30, 0x00,
+ 0x93, 0x07, 0xDA, 0x09, 0x30, 0x00, 0xF4, 0x08,
+ 0xDA, 0x09, 0x30, 0x00, 0x54, 0x0A, 0xDA, 0x09,
+ 0x30, 0x00, 0x50, 0xFF, 0x23, 0x08, 0x30, 0x00,
+ 0xF0, 0xFD, 0x23, 0x08, 0x30, 0x00, 0x8F, 0xFC,
+ 0x23, 0x08, 0x30, 0x00, 0x2F, 0xFB, 0x23, 0x08,
+ 0x30, 0x00, 0xCD, 0xF9, 0xDA, 0x09, 0x30, 0x00,
+ 0x6D, 0xF8, 0xDA, 0x09, 0x30, 0x00, 0x0C, 0xF7,
+ 0xDA, 0x09, 0x30, 0x00, 0xAC, 0xF5, 0xDA, 0x09,
+ 0x30, 0x00, 0xB0, 0x00, 0x63, 0x09, 0x30, 0x00,
+ 0x10, 0x02, 0x63, 0x09, 0x30, 0x00, 0x71, 0x03,
+ 0x63, 0x09, 0x30, 0x00, 0xD1, 0x04, 0x63, 0x09,
+ 0x30, 0x00, 0x33, 0x06, 0x5E, 0x0B, 0x30, 0x00,
+ 0x93, 0x07, 0x5E, 0x0B, 0x30, 0x00, 0xF4, 0x08,
+ 0x5E, 0x0B, 0x30, 0x00, 0x54, 0x0A, 0x5E, 0x0B,
+ 0x30, 0x00, 0x50, 0xFF, 0x63, 0x09, 0x30, 0x00,
+ 0xF0, 0xFD, 0x63, 0x09, 0x30, 0x00, 0x8F, 0xFC,
+ 0x63, 0x09, 0x30, 0x00, 0x2F, 0xFB, 0x63, 0x09,
+ 0x30, 0x00, 0xCD, 0xF9, 0x5E, 0x0B, 0x30, 0x00,
+ 0x6D, 0xF8, 0x5E, 0x0B, 0x30, 0x00, 0x0C, 0xF7,
+ 0x5E, 0x0B, 0x30, 0x00, 0xAC, 0xF5, 0x5E, 0x0B,
+ 0x2D, 0x00, 0xB0, 0x00, 0x60, 0xFF, 0x2D, 0x00,
+ 0x10, 0x02, 0x60, 0xFF, 0x2D, 0x00, 0x71, 0x03,
+ 0x60, 0xFF, 0x2D, 0x00, 0xD1, 0x04, 0x60, 0xFF,
+ 0x2F, 0x00, 0x33, 0x06, 0x3E, 0xFF, 0x2F, 0x00,
+ 0x93, 0x07, 0x3E, 0xFF, 0x2F, 0x00, 0xF4, 0x08,
+ 0x3E, 0xFF, 0x2F, 0x00, 0x54, 0x0A, 0x3E, 0xFF,
+ 0x2D, 0x00, 0x50, 0xFF, 0x60, 0xFF, 0x2D, 0x00,
+ 0xF0, 0xFD, 0x60, 0xFF, 0x2D, 0x00, 0x8F, 0xFC,
+ 0x60, 0xFF, 0x2D, 0x00, 0x2F, 0xFB, 0x60, 0xFF,
+ 0x2F, 0x00, 0xCD, 0xF9, 0x3E, 0xFF, 0x2F, 0x00,
+ 0x6D, 0xF8, 0x3E, 0xFF, 0x2F, 0x00, 0x0C, 0xF7,
+ 0x3E, 0xFF, 0x2F, 0x00, 0xAC, 0xF5, 0x3E, 0xFF,
+ 0x2D, 0x00, 0xB0, 0x00, 0x20, 0xFE, 0x2D, 0x00,
+ 0x10, 0x02, 0x20, 0xFE, 0x2D, 0x00, 0x71, 0x03,
+ 0x20, 0xFE, 0x2D, 0x00, 0xD1, 0x04, 0x20, 0xFE,
+ 0x2F, 0x00, 0x33, 0x06, 0xBA, 0xFD, 0x2F, 0x00,
+ 0x93, 0x07, 0xBA, 0xFD, 0x2F, 0x00, 0xF4, 0x08,
+ 0xBA, 0xFD, 0x2F, 0x00, 0x54, 0x0A, 0xBA, 0xFD,
+ 0x2D, 0x00, 0x50, 0xFF, 0x20, 0xFE, 0x2D, 0x00,
+ 0xF0, 0xFD, 0x20, 0xFE, 0x2D, 0x00, 0x8F, 0xFC,
+ 0x20, 0xFE, 0x2D, 0x00, 0x2F, 0xFB, 0x20, 0xFE,
+ 0x2F, 0x00, 0xCD, 0xF9, 0xBA, 0xFD, 0x2F, 0x00,
+ 0x6D, 0xF8, 0xBA, 0xFD, 0x2F, 0x00, 0x0C, 0xF7,
+ 0xBA, 0xFD, 0x2F, 0x00, 0xAC, 0xF5, 0xBA, 0xFD,
+ 0x2D, 0x00, 0xB0, 0x00, 0xDF, 0xFC, 0x2D, 0x00,
+ 0x10, 0x02, 0xDF, 0xFC, 0x2D, 0x00, 0x71, 0x03,
+ 0xDF, 0xFC, 0x2D, 0x00, 0xD1, 0x04, 0xDF, 0xFC,
+ 0x2F, 0x00, 0x33, 0x06, 0x36, 0xFC, 0x2F, 0x00,
+ 0x93, 0x07, 0x36, 0xFC, 0x2F, 0x00, 0xF4, 0x08,
+ 0x36, 0xFC, 0x2F, 0x00, 0x54, 0x0A, 0x36, 0xFC,
+ 0x2D, 0x00, 0x50, 0xFF, 0xDF, 0xFC, 0x2D, 0x00,
+ 0xF0, 0xFD, 0xDF, 0xFC, 0x2D, 0x00, 0x8F, 0xFC,
+ 0xDF, 0xFC, 0x2D, 0x00, 0x2F, 0xFB, 0xDF, 0xFC,
+ 0x2F, 0x00, 0xCD, 0xF9, 0x36, 0xFC, 0x2F, 0x00,
+ 0x6D, 0xF8, 0x36, 0xFC, 0x2F, 0x00, 0x0C, 0xF7,
+ 0x36, 0xFC, 0x2F, 0x00, 0xAC, 0xF5, 0x36, 0xFC,
+ 0x2D, 0x00, 0xB0, 0x00, 0x9F, 0xFB, 0x2D, 0x00,
+ 0x10, 0x02, 0x9F, 0xFB, 0x2D, 0x00, 0x71, 0x03,
+ 0x9F, 0xFB, 0x2D, 0x00, 0xD1, 0x04, 0x9F, 0xFB,
+ 0x2F, 0x00, 0x33, 0x06, 0xB2, 0xFA, 0x2F, 0x00,
+ 0x93, 0x07, 0xB2, 0xFA, 0x2F, 0x00, 0xF4, 0x08,
+ 0xB2, 0xFA, 0x2F, 0x00, 0x54, 0x0A, 0xB2, 0xFA,
+ 0x2D, 0x00, 0x50, 0xFF, 0x9F, 0xFB, 0x2D, 0x00,
+ 0xF0, 0xFD, 0x9F, 0xFB, 0x2D, 0x00, 0x8F, 0xFC,
+ 0x9F, 0xFB, 0x2D, 0x00, 0x2F, 0xFB, 0x9F, 0xFB,
+ 0x2F, 0x00, 0xCD, 0xF9, 0xB2, 0xFA, 0x2F, 0x00,
+ 0x6D, 0xF8, 0xB2, 0xFA, 0x2F, 0x00, 0x0C, 0xF7,
+ 0xB2, 0xFA, 0x2F, 0x00, 0xAC, 0xF5, 0xB2, 0xFA,
+ 0x30, 0x00, 0xB0, 0x00, 0x5E, 0xFA, 0x30, 0x00,
+ 0x10, 0x02, 0x5E, 0xFA, 0x30, 0x00, 0x71, 0x03,
+ 0x5E, 0xFA, 0x30, 0x00, 0xD1, 0x04, 0x5E, 0xFA,
+ 0x30, 0x00, 0x33, 0x06, 0x2E, 0xF9, 0x30, 0x00,
+ 0x93, 0x07, 0x2E, 0xF9, 0x30, 0x00, 0xF4, 0x08,
+ 0x2E, 0xF9, 0x30, 0x00, 0x54, 0x0A, 0x2E, 0xF9,
+ 0x30, 0x00, 0x50, 0xFF, 0x5E, 0xFA, 0x30, 0x00,
+ 0xF0, 0xFD, 0x5E, 0xFA, 0x30, 0x00, 0x8F, 0xFC,
+ 0x5E, 0xFA, 0x30, 0x00, 0x2F, 0xFB, 0x5E, 0xFA,
+ 0x30, 0x00, 0xCD, 0xF9, 0x2E, 0xF9, 0x30, 0x00,
+ 0x6D, 0xF8, 0x2E, 0xF9, 0x30, 0x00, 0x0C, 0xF7,
+ 0x2E, 0xF9, 0x30, 0x00, 0xAC, 0xF5, 0x2E, 0xF9,
+ 0x30, 0x00, 0xB0, 0x00, 0x1E, 0xF9, 0x30, 0x00,
+ 0x10, 0x02, 0x1E, 0xF9, 0x30, 0x00, 0x71, 0x03,
+ 0x1E, 0xF9, 0x30, 0x00, 0xD1, 0x04, 0x1E, 0xF9,
+ 0x30, 0x00, 0x33, 0x06, 0xAA, 0xF7, 0x30, 0x00,
+ 0x93, 0x07, 0xAA, 0xF7, 0x30, 0x00, 0xF4, 0x08,
+ 0xAA, 0xF7, 0x30, 0x00, 0x54, 0x0A, 0xAA, 0xF7,
+ 0x30, 0x00, 0x50, 0xFF, 0x1E, 0xF9, 0x30, 0x00,
+ 0xF0, 0xFD, 0x1E, 0xF9, 0x30, 0x00, 0x8F, 0xFC,
+ 0x1E, 0xF9, 0x30, 0x00, 0x2F, 0xFB, 0x1E, 0xF9,
+ 0x30, 0x00, 0xCD, 0xF9, 0xAA, 0xF7, 0x30, 0x00,
+ 0x6D, 0xF8, 0xAA, 0xF7, 0x30, 0x00, 0x0C, 0xF7,
+ 0xAA, 0xF7, 0x30, 0x00, 0xAC, 0xF5, 0xAA, 0xF7,
+ 0x30, 0x00, 0xB0, 0x00, 0xDD, 0xF7, 0x30, 0x00,
+ 0x10, 0x02, 0xDD, 0xF7, 0x30, 0x00, 0x71, 0x03,
+ 0xDD, 0xF7, 0x30, 0x00, 0xD1, 0x04, 0xDD, 0xF7,
+ 0x30, 0x00, 0x33, 0x06, 0x26, 0xF6, 0x30, 0x00,
+ 0x93, 0x07, 0x26, 0xF6, 0x30, 0x00, 0xF4, 0x08,
+ 0x26, 0xF6, 0x30, 0x00, 0x54, 0x0A, 0x26, 0xF6,
+ 0x30, 0x00, 0x50, 0xFF, 0xDD, 0xF7, 0x30, 0x00,
+ 0xF0, 0xFD, 0xDD, 0xF7, 0x30, 0x00, 0x8F, 0xFC,
+ 0xDD, 0xF7, 0x30, 0x00, 0x2F, 0xFB, 0xDD, 0xF7,
+ 0x30, 0x00, 0xCD, 0xF9, 0x26, 0xF6, 0x30, 0x00,
+ 0x6D, 0xF8, 0x26, 0xF6, 0x30, 0x00, 0x0C, 0xF7,
+ 0x26, 0xF6, 0x30, 0x00, 0xAC, 0xF5, 0x26, 0xF6,
+ 0x30, 0x00, 0xB0, 0x00, 0x9D, 0xF6, 0x30, 0x00,
+ 0x10, 0x02, 0x9D, 0xF6, 0x30, 0x00, 0x71, 0x03,
+ 0x9D, 0xF6, 0x30, 0x00, 0xD1, 0x04, 0x9D, 0xF6,
+ 0x30, 0x00, 0x33, 0x06, 0xA2, 0xF4, 0x30, 0x00,
+ 0x93, 0x07, 0xA2, 0xF4, 0x30, 0x00, 0xF4, 0x08,
+ 0xA2, 0xF4, 0x30, 0x00, 0x54, 0x0A, 0xA2, 0xF4,
+ 0x30, 0x00, 0x50, 0xFF, 0x9D, 0xF6, 0x30, 0x00,
+ 0xF0, 0xFD, 0x9D, 0xF6, 0x30, 0x00, 0x8F, 0xFC,
+ 0x9D, 0xF6, 0x30, 0x00, 0x2F, 0xFB, 0x9D, 0xF6,
+ 0x30, 0x00, 0xCD, 0xF9, 0xA2, 0xF4, 0x30, 0x00,
+ 0x6D, 0xF8, 0xA2, 0xF4, 0x30, 0x00, 0x0C, 0xF7,
+ 0xA2, 0xF4, 0x30, 0x00, 0xAC, 0xF5, 0xA2, 0xF4,
+ 0x2E, 0x00, 0xC2, 0x00, 0xB0, 0x00, 0x2E, 0x00,
+ 0x46, 0x02, 0xB0, 0x00, 0x2E, 0x00, 0xCA, 0x03,
+ 0xB0, 0x00, 0x2E, 0x00, 0x4E, 0x05, 0xB0, 0x00,
+ 0x2F, 0x00, 0xD2, 0x06, 0xC2, 0x00, 0x2F, 0x00,
+ 0x56, 0x08, 0xC2, 0x00, 0x2F, 0x00, 0xDA, 0x09,
+ 0xC2, 0x00, 0x2F, 0x00, 0x5E, 0x0B, 0xC2, 0x00,
+ 0x2E, 0x00, 0x3E, 0xFF, 0xB0, 0x00, 0x2E, 0x00,
+ 0xBA, 0xFD, 0xB0, 0x00, 0x2E, 0x00, 0x36, 0xFC,
+ 0xB0, 0x00, 0x2E, 0x00, 0xB2, 0xFA, 0xB0, 0x00,
+ 0x2F, 0x00, 0x2E, 0xF9, 0xC2, 0x00, 0x2F, 0x00,
+ 0xAA, 0xF7, 0xC2, 0x00, 0x2F, 0x00, 0x26, 0xF6,
+ 0xC2, 0x00, 0x2F, 0x00, 0xA2, 0xF4, 0xC2, 0x00,
+ 0x2E, 0x00, 0xC2, 0x00, 0x10, 0x02, 0x2E, 0x00,
+ 0x46, 0x02, 0x10, 0x02, 0x2E, 0x00, 0xCA, 0x03,
+ 0x10, 0x02, 0x2E, 0x00, 0x4E, 0x05, 0x10, 0x02,
+ 0x2F, 0x00, 0xD2, 0x06, 0x46, 0x02, 0x2F, 0x00,
+ 0x56, 0x08, 0x46, 0x02, 0x2F, 0x00, 0xDA, 0x09,
+ 0x46, 0x02, 0x2F, 0x00, 0x5E, 0x0B, 0x46, 0x02,
+ 0x2E, 0x00, 0x3E, 0xFF, 0x10, 0x02, 0x2E, 0x00,
+ 0xBA, 0xFD, 0x10, 0x02, 0x2E, 0x00, 0x36, 0xFC,
+ 0x10, 0x02, 0x2E, 0x00, 0xB2, 0xFA, 0x10, 0x02,
+ 0x2F, 0x00, 0x2E, 0xF9, 0x46, 0x02, 0x2F, 0x00,
+ 0xAA, 0xF7, 0x46, 0x02, 0x2F, 0x00, 0x26, 0xF6,
+ 0x46, 0x02, 0x2F, 0x00, 0xA2, 0xF4, 0x46, 0x02,
+ 0x2E, 0x00, 0xC2, 0x00, 0x71, 0x03, 0x2E, 0x00,
+ 0x46, 0x02, 0x71, 0x03, 0x2E, 0x00, 0xCA, 0x03,
+ 0x71, 0x03, 0x2E, 0x00, 0x4E, 0x05, 0x71, 0x03,
+ 0x2F, 0x00, 0xD2, 0x06, 0xCA, 0x03, 0x2F, 0x00,
+ 0x56, 0x08, 0xCA, 0x03, 0x2F, 0x00, 0xDA, 0x09,
+ 0xCA, 0x03, 0x2F, 0x00, 0x5E, 0x0B, 0xCA, 0x03,
+ 0x2E, 0x00, 0x3E, 0xFF, 0x71, 0x03, 0x2E, 0x00,
+ 0xBA, 0xFD, 0x71, 0x03, 0x2E, 0x00, 0x36, 0xFC,
+ 0x71, 0x03, 0x2E, 0x00, 0xB2, 0xFA, 0x71, 0x03,
+ 0x2F, 0x00, 0x2E, 0xF9, 0xCA, 0x03, 0x2F, 0x00,
+ 0xAA, 0xF7, 0xCA, 0x03, 0x2F, 0x00, 0x26, 0xF6,
+ 0xCA, 0x03, 0x2F, 0x00, 0xA2, 0xF4, 0xCA, 0x03,
+ 0x2E, 0x00, 0xC2, 0x00, 0xD1, 0x04, 0x2E, 0x00,
+ 0x46, 0x02, 0xD1, 0x04, 0x2E, 0x00, 0xCA, 0x03,
+ 0xD1, 0x04, 0x2E, 0x00, 0x4E, 0x05, 0xD1, 0x04,
+ 0x2F, 0x00, 0xD2, 0x06, 0x4E, 0x05, 0x2F, 0x00,
+ 0x56, 0x08, 0x4E, 0x05, 0x2F, 0x00, 0xDA, 0x09,
+ 0x4E, 0x05, 0x2F, 0x00, 0x5E, 0x0B, 0x4E, 0x05,
+ 0x2E, 0x00, 0x3E, 0xFF, 0xD1, 0x04, 0x2E, 0x00,
+ 0xBA, 0xFD, 0xD1, 0x04, 0x2E, 0x00, 0x36, 0xFC,
+ 0xD1, 0x04, 0x2E, 0x00, 0xB2, 0xFA, 0xD1, 0x04,
+ 0x2F, 0x00, 0x2E, 0xF9, 0x4E, 0x05, 0x2F, 0x00,
+ 0xAA, 0xF7, 0x4E, 0x05, 0x2F, 0x00, 0x26, 0xF6,
+ 0x4E, 0x05, 0x2F, 0x00, 0xA2, 0xF4, 0x4E, 0x05,
+ 0x30, 0x00, 0xC2, 0x00, 0x33, 0x06, 0x30, 0x00,
+ 0x46, 0x02, 0x33, 0x06, 0x30, 0x00, 0xCA, 0x03,
+ 0x33, 0x06, 0x30, 0x00, 0x4E, 0x05, 0x33, 0x06,
+ 0x30, 0x00, 0xD2, 0x06, 0xD2, 0x06, 0x30, 0x00,
+ 0x56, 0x08, 0xD2, 0x06, 0x30, 0x00, 0xDA, 0x09,
+ 0xD2, 0x06, 0x30, 0x00, 0x5E, 0x0B, 0xD2, 0x06,
+ 0x30, 0x00, 0x3E, 0xFF, 0x33, 0x06, 0x30, 0x00,
+ 0xBA, 0xFD, 0x33, 0x06, 0x30, 0x00, 0x36, 0xFC,
+ 0x33, 0x06, 0x30, 0x00, 0xB2, 0xFA, 0x33, 0x06,
+ 0x30, 0x00, 0x2E, 0xF9, 0xD2, 0x06, 0x30, 0x00,
+ 0xAA, 0xF7, 0xD2, 0x06, 0x30, 0x00, 0x26, 0xF6,
+ 0xD2, 0x06, 0x30, 0x00, 0xA2, 0xF4, 0xD2, 0x06,
+ 0x30, 0x00, 0xC2, 0x00, 0x93, 0x07, 0x30, 0x00,
+ 0x46, 0x02, 0x93, 0x07, 0x30, 0x00, 0xCA, 0x03,
+ 0x93, 0x07, 0x30, 0x00, 0x4E, 0x05, 0x93, 0x07,
+ 0x30, 0x00, 0xD2, 0x06, 0x56, 0x08, 0x30, 0x00,
+ 0x56, 0x08, 0x56, 0x08, 0x30, 0x00, 0xDA, 0x09,
+ 0x56, 0x08, 0x30, 0x00, 0x5E, 0x0B, 0x56, 0x08,
+ 0x30, 0x00, 0x3E, 0xFF, 0x93, 0x07, 0x30, 0x00,
+ 0xBA, 0xFD, 0x93, 0x07, 0x30, 0x00, 0x36, 0xFC,
+ 0x93, 0x07, 0x30, 0x00, 0xB2, 0xFA, 0x93, 0x07,
+ 0x30, 0x00, 0x2E, 0xF9, 0x56, 0x08, 0x30, 0x00,
+ 0xAA, 0xF7, 0x56, 0x08, 0x30, 0x00, 0x26, 0xF6,
+ 0x56, 0x08, 0x30, 0x00, 0xA2, 0xF4, 0x56, 0x08,
+ 0x30, 0x00, 0xC2, 0x00, 0xF4, 0x08, 0x30, 0x00,
+ 0x46, 0x02, 0xF4, 0x08, 0x30, 0x00, 0xCA, 0x03,
+ 0xF4, 0x08, 0x30, 0x00, 0x4E, 0x05, 0xF4, 0x08,
+ 0x30, 0x00, 0xD2, 0x06, 0xDA, 0x09, 0x30, 0x00,
+ 0x56, 0x08, 0xDA, 0x09, 0x30, 0x00, 0xDA, 0x09,
+ 0xDA, 0x09, 0x30, 0x00, 0x5E, 0x0B, 0xDA, 0x09,
+ 0x30, 0x00, 0x3E, 0xFF, 0xF4, 0x08, 0x30, 0x00,
+ 0xBA, 0xFD, 0xF4, 0x08, 0x30, 0x00, 0x36, 0xFC,
+ 0xF4, 0x08, 0x30, 0x00, 0xB2, 0xFA, 0xF4, 0x08,
+ 0x30, 0x00, 0x2E, 0xF9, 0xDA, 0x09, 0x30, 0x00,
+ 0xAA, 0xF7, 0xDA, 0x09, 0x30, 0x00, 0x26, 0xF6,
+ 0xDA, 0x09, 0x30, 0x00, 0xA2, 0xF4, 0xDA, 0x09,
+ 0x30, 0x00, 0xC2, 0x00, 0x54, 0x0A, 0x30, 0x00,
+ 0x46, 0x02, 0x54, 0x0A, 0x30, 0x00, 0xCA, 0x03,
+ 0x54, 0x0A, 0x30, 0x00, 0x4E, 0x05, 0x54, 0x0A,
+ 0x30, 0x00, 0xD2, 0x06, 0x5E, 0x0B, 0x30, 0x00,
+ 0x56, 0x08, 0x5E, 0x0B, 0x30, 0x00, 0xDA, 0x09,
+ 0x5E, 0x0B, 0x30, 0x00, 0x5E, 0x0B, 0x5E, 0x0B,
+ 0x30, 0x00, 0x3E, 0xFF, 0x54, 0x0A, 0x30, 0x00,
+ 0xBA, 0xFD, 0x54, 0x0A, 0x30, 0x00, 0x36, 0xFC,
+ 0x54, 0x0A, 0x30, 0x00, 0xB2, 0xFA, 0x54, 0x0A,
+ 0x30, 0x00, 0x2E, 0xF9, 0x5E, 0x0B, 0x30, 0x00,
+ 0xAA, 0xF7, 0x5E, 0x0B, 0x30, 0x00, 0x26, 0xF6,
+ 0x5E, 0x0B, 0x30, 0x00, 0xA2, 0xF4, 0x5E, 0x0B,
+ 0x2E, 0x00, 0xC2, 0x00, 0x50, 0xFF, 0x2E, 0x00,
+ 0x46, 0x02, 0x50, 0xFF, 0x2E, 0x00, 0xCA, 0x03,
+ 0x50, 0xFF, 0x2E, 0x00, 0x4E, 0x05, 0x50, 0xFF,
+ 0x2F, 0x00, 0xD2, 0x06, 0x3E, 0xFF, 0x2F, 0x00,
+ 0x56, 0x08, 0x3E, 0xFF, 0x2F, 0x00, 0xDA, 0x09,
+ 0x3E, 0xFF, 0x2F, 0x00, 0x5E, 0x0B, 0x3E, 0xFF,
+ 0x2E, 0x00, 0x3E, 0xFF, 0x50, 0xFF, 0x2E, 0x00,
+ 0xBA, 0xFD, 0x50, 0xFF, 0x2E, 0x00, 0x36, 0xFC,
+ 0x50, 0xFF, 0x2E, 0x00, 0xB2, 0xFA, 0x50, 0xFF,
+ 0x2F, 0x00, 0x2E, 0xF9, 0x3E, 0xFF, 0x2F, 0x00,
+ 0xAA, 0xF7, 0x3E, 0xFF, 0x2F, 0x00, 0x26, 0xF6,
+ 0x3E, 0xFF, 0x2F, 0x00, 0xA2, 0xF4, 0x3E, 0xFF,
+ 0x2E, 0x00, 0xC2, 0x00, 0xF0, 0xFD, 0x2E, 0x00,
+ 0x46, 0x02, 0xF0, 0xFD, 0x2E, 0x00, 0xCA, 0x03,
+ 0xF0, 0xFD, 0x2E, 0x00, 0x4E, 0x05, 0xF0, 0xFD,
+ 0x2F, 0x00, 0xD2, 0x06, 0xBA, 0xFD, 0x2F, 0x00,
+ 0x56, 0x08, 0xBA, 0xFD, 0x2F, 0x00, 0xDA, 0x09,
+ 0xBA, 0xFD, 0x2F, 0x00, 0x5E, 0x0B, 0xBA, 0xFD,
+ 0x2E, 0x00, 0x3E, 0xFF, 0xF0, 0xFD, 0x2E, 0x00,
+ 0xBA, 0xFD, 0xF0, 0xFD, 0x2E, 0x00, 0x36, 0xFC,
+ 0xF0, 0xFD, 0x2E, 0x00, 0xB2, 0xFA, 0xF0, 0xFD,
+ 0x2F, 0x00, 0x2E, 0xF9, 0xBA, 0xFD, 0x2F, 0x00,
+ 0xAA, 0xF7, 0xBA, 0xFD, 0x2F, 0x00, 0x26, 0xF6,
+ 0xBA, 0xFD, 0x2F, 0x00, 0xA2, 0xF4, 0xBA, 0xFD,
+ 0x2E, 0x00, 0xC2, 0x00, 0x8F, 0xFC, 0x2E, 0x00,
+ 0x46, 0x02, 0x8F, 0xFC, 0x2E, 0x00, 0xCA, 0x03,
+ 0x8F, 0xFC, 0x2E, 0x00, 0x4E, 0x05, 0x8F, 0xFC,
+ 0x2F, 0x00, 0xD2, 0x06, 0x36, 0xFC, 0x2F, 0x00,
+ 0x56, 0x08, 0x36, 0xFC, 0x2F, 0x00, 0xDA, 0x09,
+ 0x36, 0xFC, 0x2F, 0x00, 0x5E, 0x0B, 0x36, 0xFC,
+ 0x2E, 0x00, 0x3E, 0xFF, 0x8F, 0xFC, 0x2E, 0x00,
+ 0xBA, 0xFD, 0x8F, 0xFC, 0x2E, 0x00, 0x36, 0xFC,
+ 0x8F, 0xFC, 0x2E, 0x00, 0xB2, 0xFA, 0x8F, 0xFC,
+ 0x2F, 0x00, 0x2E, 0xF9, 0x36, 0xFC, 0x2F, 0x00,
+ 0xAA, 0xF7, 0x36, 0xFC, 0x2F, 0x00, 0x26, 0xF6,
+ 0x36, 0xFC, 0x2F, 0x00, 0xA2, 0xF4, 0x36, 0xFC,
+ 0x2E, 0x00, 0xC2, 0x00, 0x2F, 0xFB, 0x2E, 0x00,
+ 0x46, 0x02, 0x2F, 0xFB, 0x2E, 0x00, 0xCA, 0x03,
+ 0x2F, 0xFB, 0x2E, 0x00, 0x4E, 0x05, 0x2F, 0xFB,
+ 0x2F, 0x00, 0xD2, 0x06, 0xB2, 0xFA, 0x2F, 0x00,
+ 0x56, 0x08, 0xB2, 0xFA, 0x2F, 0x00, 0xDA, 0x09,
+ 0xB2, 0xFA, 0x2F, 0x00, 0x5E, 0x0B, 0xB2, 0xFA,
+ 0x2E, 0x00, 0x3E, 0xFF, 0x2F, 0xFB, 0x2E, 0x00,
+ 0xBA, 0xFD, 0x2F, 0xFB, 0x2E, 0x00, 0x36, 0xFC,
+ 0x2F, 0xFB, 0x2E, 0x00, 0xB2, 0xFA, 0x2F, 0xFB,
+ 0x2F, 0x00, 0x2E, 0xF9, 0xB2, 0xFA, 0x2F, 0x00,
+ 0xAA, 0xF7, 0xB2, 0xFA, 0x2F, 0x00, 0x26, 0xF6,
+ 0xB2, 0xFA, 0x2F, 0x00, 0xA2, 0xF4, 0xB2, 0xFA,
+ 0x30, 0x00, 0xC2, 0x00, 0xCD, 0xF9, 0x30, 0x00,
+ 0x46, 0x02, 0xCD, 0xF9, 0x30, 0x00, 0xCA, 0x03,
+ 0xCD, 0xF9, 0x30, 0x00, 0x4E, 0x05, 0xCD, 0xF9,
+ 0x30, 0x00, 0xD2, 0x06, 0x2E, 0xF9, 0x30, 0x00,
+ 0x56, 0x08, 0x2E, 0xF9, 0x30, 0x00, 0xDA, 0x09,
+ 0x2E, 0xF9, 0x30, 0x00, 0x5E, 0x0B, 0x2E, 0xF9,
+ 0x30, 0x00, 0x3E, 0xFF, 0xCD, 0xF9, 0x30, 0x00,
+ 0xBA, 0xFD, 0xCD, 0xF9, 0x30, 0x00, 0x36, 0xFC,
+ 0xCD, 0xF9, 0x30, 0x00, 0xB2, 0xFA, 0xCD, 0xF9,
+ 0x30, 0x00, 0x2E, 0xF9, 0x2E, 0xF9, 0x30, 0x00,
+ 0xAA, 0xF7, 0x2E, 0xF9, 0x30, 0x00, 0x26, 0xF6,
+ 0x2E, 0xF9, 0x30, 0x00, 0xA2, 0xF4, 0x2E, 0xF9,
+ 0x30, 0x00, 0xC2, 0x00, 0x6D, 0xF8, 0x30, 0x00,
+ 0x46, 0x02, 0x6D, 0xF8, 0x30, 0x00, 0xCA, 0x03,
+ 0x6D, 0xF8, 0x30, 0x00, 0x4E, 0x05, 0x6D, 0xF8,
+ 0x30, 0x00, 0xD2, 0x06, 0xAA, 0xF7, 0x30, 0x00,
+ 0x56, 0x08, 0xAA, 0xF7, 0x30, 0x00, 0xDA, 0x09,
+ 0xAA, 0xF7, 0x30, 0x00, 0x5E, 0x0B, 0xAA, 0xF7,
+ 0x30, 0x00, 0x3E, 0xFF, 0x6D, 0xF8, 0x30, 0x00,
+ 0xBA, 0xFD, 0x6D, 0xF8, 0x30, 0x00, 0x36, 0xFC,
+ 0x6D, 0xF8, 0x30, 0x00, 0xB2, 0xFA, 0x6D, 0xF8,
+ 0x30, 0x00, 0x2E, 0xF9, 0xAA, 0xF7, 0x30, 0x00,
+ 0xAA, 0xF7, 0xAA, 0xF7, 0x30, 0x00, 0x26, 0xF6,
+ 0xAA, 0xF7, 0x30, 0x00, 0xA2, 0xF4, 0xAA, 0xF7,
+ 0x30, 0x00, 0xC2, 0x00, 0x0C, 0xF7, 0x30, 0x00,
+ 0x46, 0x02, 0x0C, 0xF7, 0x30, 0x00, 0xCA, 0x03,
+ 0x0C, 0xF7, 0x30, 0x00, 0x4E, 0x05, 0x0C, 0xF7,
+ 0x30, 0x00, 0xD2, 0x06, 0x26, 0xF6, 0x30, 0x00,
+ 0x56, 0x08, 0x26, 0xF6, 0x30, 0x00, 0xDA, 0x09,
+ 0x26, 0xF6, 0x30, 0x00, 0x5E, 0x0B, 0x26, 0xF6,
+ 0x30, 0x00, 0x3E, 0xFF, 0x0C, 0xF7, 0x30, 0x00,
+ 0xBA, 0xFD, 0x0C, 0xF7, 0x30, 0x00, 0x36, 0xFC,
+ 0x0C, 0xF7, 0x30, 0x00, 0xB2, 0xFA, 0x0C, 0xF7,
+ 0x30, 0x00, 0x2E, 0xF9, 0x26, 0xF6, 0x30, 0x00,
+ 0xAA, 0xF7, 0x26, 0xF6, 0x30, 0x00, 0x26, 0xF6,
+ 0x26, 0xF6, 0x30, 0x00, 0xA2, 0xF4, 0x26, 0xF6,
+ 0x30, 0x00, 0xC2, 0x00, 0xAC, 0xF5, 0x30, 0x00,
+ 0x46, 0x02, 0xAC, 0xF5, 0x30, 0x00, 0xCA, 0x03,
+ 0xAC, 0xF5, 0x30, 0x00, 0x4E, 0x05, 0xAC, 0xF5,
+ 0x30, 0x00, 0xD2, 0x06, 0xA2, 0xF4, 0x30, 0x00,
+ 0x56, 0x08, 0xA2, 0xF4, 0x30, 0x00, 0xDA, 0x09,
+ 0xA2, 0xF4, 0x30, 0x00, 0x5E, 0x0B, 0xA2, 0xF4,
+ 0x30, 0x00, 0x3E, 0xFF, 0xAC, 0xF5, 0x30, 0x00,
+ 0xBA, 0xFD, 0xAC, 0xF5, 0x30, 0x00, 0x36, 0xFC,
+ 0xAC, 0xF5, 0x30, 0x00, 0xB2, 0xFA, 0xAC, 0xF5,
+ 0x30, 0x00, 0x2E, 0xF9, 0xA2, 0xF4, 0x30, 0x00,
+ 0xAA, 0xF7, 0xA2, 0xF4, 0x30, 0x00, 0x26, 0xF6,
+ 0xA2, 0xF4, 0x30, 0x00, 0xA2, 0xF4, 0xA2, 0xF4,
+ 0x00, 0x00
+};
+
+static const ByteProvider k1TownsSFXwdTableFMTownsProvider = { ARRAYSIZE(k1TownsSFXwdTableFMTowns), k1TownsSFXwdTableFMTowns };
+
+static const byte k1TownsSFXbtTableFMTowns[256] = {
+ 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, 0xFE,
+ 0x7F, 0x7F, 0x7E, 0x7D, 0x7C, 0x7B, 0x7A, 0x79,
+ 0x78, 0x77, 0x76, 0x75, 0x74, 0x73, 0x72, 0x71,
+ 0x70, 0x6F, 0x6E, 0x6D, 0x6C, 0x6B, 0x6A, 0x69,
+ 0x68, 0x67, 0x66, 0x65, 0x64, 0x63, 0x62, 0x61,
+ 0x60, 0x5F, 0x5E, 0x5D, 0x5C, 0x5B, 0x5A, 0x59,
+ 0x58, 0x57, 0x56, 0x55, 0x54, 0x53, 0x52, 0x51,
+ 0x50, 0x4F, 0x4E, 0x4D, 0x4C, 0x4B, 0x4A, 0x49,
+ 0x48, 0x47, 0x46, 0x45, 0x44, 0x43, 0x42, 0x41,
+ 0x40, 0x3F, 0x3E, 0x3D, 0x3C, 0x3B, 0x3A, 0x39,
+ 0x38, 0x37, 0x36, 0x35, 0x34, 0x33, 0x32, 0x31,
+ 0x30, 0x2F, 0x2E, 0x2D, 0x2C, 0x2B, 0x2A, 0x29,
+ 0x28, 0x27, 0x26, 0x25, 0x24, 0x23, 0x22, 0x21,
+ 0x20, 0x1F, 0x1E, 0x1D, 0x1C, 0x1B, 0x1A, 0x19,
+ 0x18, 0x17, 0x16, 0x15, 0x14, 0x13, 0x12, 0x11,
+ 0x10, 0x0F, 0x0E, 0x0D, 0x0C, 0x0B, 0x0A, 0x09,
+ 0x08, 0x07, 0x06, 0x05, 0x04, 0x03, 0x02, 0x01
+};
+
+static const ByteProvider k1TownsSFXbtTableFMTownsProvider = { ARRAYSIZE(k1TownsSFXbtTableFMTowns), k1TownsSFXbtTableFMTowns };
+
+static const byte k1TownsCDATableFMTowns[708] = {
+ 0x00, 0x40, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x80, 0x54, 0x00, 0x00,
+ 0x01, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00,
+ 0x70, 0x5E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x01, 0x00, 0x00, 0x00, 0x90, 0x6D, 0x00, 0x00,
+ 0x01, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00,
+ 0xC0, 0x72, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x75, 0x00, 0x00,
+ 0x01, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF,
+ 0x80, 0x78, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
+ 0xFF, 0xFF, 0xFF, 0xFF, 0xC0, 0x89, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF,
+ 0x80, 0x90, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0xFF, 0xFF, 0xFF, 0xFF, 0xD0, 0x91, 0x00, 0x00,
+ 0x01, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00,
+ 0x80, 0xA8, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
+ 0x05, 0x00, 0x00, 0x00, 0x50, 0xAF, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF,
+ 0xA0, 0xB1, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
+ 0xFF, 0xFF, 0xFF, 0xFF, 0x70, 0xB8, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF,
+ 0xF0, 0xBC, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
+ 0xFF, 0xFF, 0xFF, 0xFF, 0xD0, 0xC5, 0x00, 0x00,
+ 0x01, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00,
+ 0xE0, 0xD3, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
+ 0x08, 0x00, 0x00, 0x00, 0xB0, 0xE7, 0x00, 0x00,
+ 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00,
+ 0xC0, 0xED, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0xEE, 0x00, 0x00,
+ 0x01, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00,
+ 0x40, 0x05, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00,
+ 0x0A, 0x00, 0x00, 0x00, 0x80, 0x0D, 0x01, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF,
+ 0x30, 0x0E, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0xFF, 0xFF, 0xFF, 0xFF, 0xC0, 0x0F, 0x01, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF,
+ 0x10, 0x13, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00,
+ 0xFF, 0xFF, 0xFF, 0xFF, 0x20, 0x1A, 0x01, 0x00,
+ 0x01, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF,
+ 0x80, 0x23, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0xFF, 0xFF, 0xFF, 0xFF, 0x40, 0x25, 0x01, 0x00,
+ 0x01, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF,
+ 0x30, 0x27, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00,
+ 0xFF, 0xFF, 0xFF, 0xFF, 0x90, 0x2A, 0x01, 0x00,
+ 0x01, 0x00, 0x00, 0x00, 0x0B, 0x00, 0x00, 0x00,
+ 0xD0, 0x34, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF,
+ 0x70, 0x37, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0xFF, 0xFF, 0xFF, 0xFF, 0x10, 0x47, 0x01, 0x00,
+ 0x01, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00,
+ 0xF0, 0x5D, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00,
+ 0x0D, 0x00, 0x00, 0x00, 0x30, 0x60, 0x01, 0x00,
+ 0x01, 0x00, 0x00, 0x00, 0x0E, 0x00, 0x00, 0x00,
+ 0x30, 0x70, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0xFF, 0xFF, 0xFF, 0xFF, 0x50, 0x76, 0x01, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF,
+ 0xD0, 0x34, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0xFF, 0xFF, 0xFF, 0xFF, 0xE0, 0x78, 0x01, 0x00,
+ 0x01, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF,
+ 0x00, 0x82, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0xFF, 0xFF, 0xFF, 0xFF, 0x20, 0x83, 0x01, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF,
+ 0xA0, 0x84, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0xFF, 0xFF, 0xFF, 0xFF, 0xB0, 0x8B, 0x01, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF,
+ 0x40, 0x90, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x13, 0x00, 0x00, 0x00, 0x50, 0x9B, 0x01, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00,
+ 0x50, 0x76, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0xFF, 0xFF, 0xFF, 0xFF, 0x30, 0xA7, 0x01, 0x00,
+ 0x01, 0x00, 0x00, 0x00, 0x15, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0xFF, 0xFF, 0xFF, 0xFF, 0x80, 0x23, 0x01, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF,
+ 0x10, 0xB8, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0xFF, 0xFF, 0xFF, 0xFF, 0x50, 0xBA, 0x01, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x0F, 0x00, 0x00, 0x00,
+ 0x90, 0xC1, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x10, 0x00, 0x00, 0x00, 0x50, 0xCA, 0x01, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00,
+ 0x00, 0xD1, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x12, 0x00, 0x00, 0x00
+};
+
+static const ByteProvider k1TownsCDATableFMTownsProvider = { ARRAYSIZE(k1TownsCDATableFMTowns), k1TownsCDATableFMTowns };
+
+static const char *const k1AudioTracksFMTowns[6] = {
+ "TW_INTRO.SFX",
+ "TW_SCEN1.SFX",
+ "TW_SCEN2.SFX",
+ "TW_SCEN3.SFX",
+ "TW_SCEN4.SFX",
+ "TW_SCEN5.SFX"
+};
+
+static const StringListProvider k1AudioTracksFMTownsProvider = { ARRAYSIZE(k1AudioTracksFMTowns), k1AudioTracksFMTowns };
+
diff --git a/devtools/create_kyradat/resources/lok_fmtowns_english.h b/devtools/create_kyradat/resources/lok_fmtowns_english.h
new file mode 100644
index 0000000000..f13a9d981d
--- /dev/null
+++ b/devtools/create_kyradat/resources/lok_fmtowns_english.h
@@ -0,0 +1,527 @@
+static const char *const k1IntroStringsFMTownsEnglish[50] = {
+ "This is a text test - 1",
+ "This is a text test - 2",
+ "Greetings, Kallak...",
+ "...Powerful leader of the Royal Mystics!",
+ "Did I frighten you?",
+ "Malcolm!",
+ "I heard yesterday of your escape.",
+ "And have expected you before now.",
+ "Why would I rush?",
+ "I rule this land!",
+ "Your puny curse restrains me naught.",
+ "So, slay me now!",
+ "I have little magic left.",
+ "I mean to harm you, have no doubt...",
+ "...Now you are stone...",
+ "...Yet I leave your eyes.",
+ "I shed no tears for Kyrandia...",
+ "...But cannot deny you yours.",
+ "Malcolm the Jester has broken free!",
+ "He now controls the Kyragem...",
+ "...source of all magic in Kyrandia!",
+ "",
+ "How dare you trip ME!",
+ "But no, something special for you...",
+ "A humorous hex!",
+ "But I shall give fair warning.",
+ "Don't jump on THAT tree!",
+ "Don't climb up THAT tree little squirrel!",
+ "Boo!",
+ "Tis funnier that way...",
+ "...Is it not?",
+ "Ha ha ha...",
+ "Aren't fingers wonderful?",
+ "It's great to be alive!",
+ "Brandon!",
+ "Grandfather! We did it!",
+ "No! YOU did it!",
+ "Long live King Brandon!",
+ "Long live the Royal Mystics!",
+ "Now, let's go put Kyrandia back together!",
+ "Good idea!",
+ "As my first Royal Proclamation...",
+ "I name sandals as the official footwear of Kyrandia!",
+ "Well done, Brandon!",
+ "The Land no longer weeps...",
+ "And your friends have been restored!",
+ "Dear Brynn...",
+ "Malcolm has broken free!",
+ "Soon he will come for me.",
+ "Please help Brandon..."
+};
+
+static const StringListProvider k1IntroStringsFMTownsEnglishProvider = { ARRAYSIZE(k1IntroStringsFMTownsEnglish), k1IntroStringsFMTownsEnglish };
+
+static const char *const k1ItemNamesFMTownsEnglish[107] = {
+ "Garnet",
+ "Amethyst",
+ "Aquamarine",
+ "Diamond",
+ "Emerald",
+ "Pearl",
+ "Ruby",
+ "Peridot",
+ "Sapphire",
+ "Opal",
+ "Topaz",
+ "Onyx",
+ "Sunstone",
+ "Moonstone",
+ "Rainbowstone",
+ "Lodestone",
+ "Rose",
+ "Tulip",
+ "Orchid",
+ "Silver Rose",
+ "Silver Statuette",
+ "Silver Coin",
+ "Gold Coin",
+ "Gold Ring",
+ "Royal Chalice",
+ "Pinecone",
+ "Acorn",
+ "Walnut",
+ "Everglowing Fireberries",
+ "Fireberries",
+ "Fireberries",
+ "Fireberries",
+ "Fireberries",
+ "Fireberries",
+ "Fish",
+ "Fish Bone",
+ "Mutton Leg",
+ "Bone",
+ "Apple",
+ "Apple Core",
+ "Blueberries",
+ "Mushroom",
+ "Note",
+ "Marble",
+ "Saw",
+ "Ankh",
+ "Feather",
+ "Egg",
+ "Leaf",
+ "Shamrock",
+ "Fallen Star",
+ "Crystal Ball",
+ "Teardrop",
+ "Mirror",
+ "Ice Shard",
+ "Flute",
+ "Hourglass",
+ "Iron Key",
+ "Jade Key",
+ "Obsidion Key",
+ "Red Potion",
+ "Red Potion",
+ "Blue Potion",
+ "Blue Potion",
+ "Yellow Potion",
+ "Yellow Potion",
+ "Green Potion",
+ "Orange Potion",
+ "Purple Potion",
+ "Potion of Rainbows",
+ "Fresh Water",
+ "Fresh Water",
+ "Salt Water",
+ "Salt Water",
+ "Mineral Water",
+ "Mineral Water",
+ "Magical Water",
+ "Magical Water",
+ "Empty Flask",
+ "Empty Flask",
+ "Scroll",
+ "Scroll",
+ "Scroll",
+ "Scroll",
+ "Scroll",
+ "Scroll",
+ "Scroll",
+ "Scroll",
+ "Scroll",
+ "Scroll",
+ "Parchment scrap",
+ "Parchment scrap",
+ "Parchment scrap",
+ "Parchment scrap",
+ "Parchment scrap",
+ "Red Magestone",
+ "Orange Magestone",
+ "Yellow Magestone",
+ "Green Magestone",
+ "Blue-Green Magestone",
+ "Blue Magestone",
+ "Purple Magestone",
+ "Heavy rock",
+ "Royal Crown",
+ "Royal Sceptre",
+ "Gold key",
+ "Unknown item"
+};
+
+static const StringListProvider k1ItemNamesFMTownsEnglishProvider = { ARRAYSIZE(k1ItemNamesFMTownsEnglish), k1ItemNamesFMTownsEnglish };
+
+static const char *const k1TakenStringsFMTownsEnglish[2] = {
+ " taken.",
+ " taken."
+};
+
+static const StringListProvider k1TakenStringsFMTownsEnglishProvider = { ARRAYSIZE(k1TakenStringsFMTownsEnglish), k1TakenStringsFMTownsEnglish };
+
+static const char *const k1PlacedStringsFMTownsEnglish[1] = {
+ " placed."
+};
+
+static const StringListProvider k1PlacedStringsFMTownsEnglishProvider = { ARRAYSIZE(k1PlacedStringsFMTownsEnglish), k1PlacedStringsFMTownsEnglish };
+
+static const char *const k1DroppedStringsFMTownsEnglish[1] = {
+ " dropped."
+};
+
+static const StringListProvider k1DroppedStringsFMTownsEnglishProvider = { ARRAYSIZE(k1DroppedStringsFMTownsEnglish), k1DroppedStringsFMTownsEnglish };
+
+static const char *const k1NoDropStringsFMTownsEnglish[2] = {
+ "You can't drop any more items in this scene.",
+ "You can't put that there."
+};
+
+static const StringListProvider k1NoDropStringsFMTownsEnglishProvider = { ARRAYSIZE(k1NoDropStringsFMTownsEnglish), k1NoDropStringsFMTownsEnglish };
+
+static const char *const k1PutDownStringFMTownsEnglish[1] = {
+ "Maybe I'd better put this down first."
+};
+
+static const StringListProvider k1PutDownStringFMTownsEnglishProvider = { ARRAYSIZE(k1PutDownStringFMTownsEnglish), k1PutDownStringFMTownsEnglish };
+
+static const char *const k1WaitAmuletStringFMTownsEnglish[1] = {
+ "I guess I'll have to wait for my Amulet to regain its power."
+};
+
+static const StringListProvider k1WaitAmuletStringFMTownsEnglishProvider = { ARRAYSIZE(k1WaitAmuletStringFMTownsEnglish), k1WaitAmuletStringFMTownsEnglish };
+
+static const char *const k1BlackJewelStringFMTownsEnglish[1] = {
+ "It's a jewel, but why is it black?"
+};
+
+static const StringListProvider k1BlackJewelStringFMTownsEnglishProvider = { ARRAYSIZE(k1BlackJewelStringFMTownsEnglish), k1BlackJewelStringFMTownsEnglish };
+
+static const char *const k1HealingTipStringFMTownsEnglish[1] = {
+ "Gee, this could come in handy if I get hurt."
+};
+
+static const StringListProvider k1HealingTipStringFMTownsEnglishProvider = { ARRAYSIZE(k1HealingTipStringFMTownsEnglish), k1HealingTipStringFMTownsEnglish };
+
+static const char *const k1PoisonGoneStringFMTownsEnglish[2] = {
+ "Amazing!",
+ "The effects of the poison are gone!"
+};
+
+static const StringListProvider k1PoisonGoneStringFMTownsEnglishProvider = { ARRAYSIZE(k1PoisonGoneStringFMTownsEnglish), k1PoisonGoneStringFMTownsEnglish };
+
+static const char *const k1ThePoisonStringsFMTownsEnglish[4] = {
+ "The poison...",
+ "I can't breathe...",
+ "I don't feel so good...",
+ "That snake must\rbe poisonous!"
+};
+
+static const StringListProvider k1ThePoisonStringsFMTownsEnglishProvider = { ARRAYSIZE(k1ThePoisonStringsFMTownsEnglish), k1ThePoisonStringsFMTownsEnglish };
+
+static const char *const k1FluteStringsFMTownsEnglish[2] = {
+ "Not very impressive sounding.",
+ "That last note sure was high!"
+};
+
+static const StringListProvider k1FluteStringsFMTownsEnglishProvider = { ARRAYSIZE(k1FluteStringsFMTownsEnglish), k1FluteStringsFMTownsEnglish };
+
+static const char *const k1WispJewelStringsFMTownsEnglish[3] = {
+ "I'm not really feeling up to it right now.",
+ "I probably should put down my ",
+ ", first."
+};
+
+static const StringListProvider k1WispJewelStringsFMTownsEnglishProvider = { ARRAYSIZE(k1WispJewelStringsFMTownsEnglish), k1WispJewelStringsFMTownsEnglish };
+
+static const char *const k1MagicJewelStringsFMTownsEnglish[1] = {
+ "That felt strange."
+};
+
+static const StringListProvider k1MagicJewelStringsFMTownsEnglishProvider = { ARRAYSIZE(k1MagicJewelStringsFMTownsEnglish), k1MagicJewelStringsFMTownsEnglish };
+
+static const char *const k1FlaskFullStringFMTownsEnglish[1] = {
+ "This flask is already full."
+};
+
+static const StringListProvider k1FlaskFullStringFMTownsEnglishProvider = { ARRAYSIZE(k1FlaskFullStringFMTownsEnglish), k1FlaskFullStringFMTownsEnglish };
+
+static const char *const k1FullFlaskStringFMTownsEnglish[4] = {
+ "The flask is now filled\rwith fresh, sparkling water.",
+ "The flask is now filled\rwith salt water.",
+ "The flask is now filled\rwith mineral water.",
+ "Magic water."
+};
+
+static const StringListProvider k1FullFlaskStringFMTownsEnglishProvider = { ARRAYSIZE(k1FullFlaskStringFMTownsEnglish), k1FullFlaskStringFMTownsEnglish };
+
+static const char *const k1OutroHomeStringFMTownsEnglish[1] = {
+ "Home"
+};
+
+static const StringListProvider k1OutroHomeStringFMTownsEnglishProvider = { ARRAYSIZE(k1OutroHomeStringFMTownsEnglish), k1OutroHomeStringFMTownsEnglish };
+
+static const char *const k1VeryCleverStringFMTownsEnglish[1] = {
+ "Very clever! But your feeble efforts are futile."
+};
+
+static const StringListProvider k1VeryCleverStringFMTownsEnglishProvider = { ARRAYSIZE(k1VeryCleverStringFMTownsEnglish), k1VeryCleverStringFMTownsEnglish };
+
+static const char *const k1GUIStringsFMTownsEnglish[38] = {
+ "The Legend of Kyrandia",
+ "Load a game",
+ "Save this game",
+ "Game controls",
+ "Quit playing",
+ "Resume game",
+ "Game Controls",
+ "Which game would you like to reload?",
+ "Select a position to save to:",
+ "[ EMPTY SLOT ]",
+ "Cancel",
+ "Enter a description of your saved game:",
+ "Save",
+ "Rest in peace, Brandon.",
+ "Are you sure you want to quit playing?",
+ "XXX",
+ "XXX",
+ "XXXXXXX",
+ "XXXXXXXXX",
+ "Main menu",
+ "on",
+ "on +CD",
+ "off",
+ "Yes",
+ "No",
+ "slowest",
+ "slow",
+ "normal",
+ "fast",
+ "fastest",
+ "slowest",
+ "normal",
+ "fast",
+ "clickable",
+ "Walk speed ",
+ "Text speed ",
+ "Music is ",
+ "Sounds are "
+};
+
+static const StringListProvider k1GUIStringsFMTownsEnglishProvider = { ARRAYSIZE(k1GUIStringsFMTownsEnglish), k1GUIStringsFMTownsEnglish };
+
+static const char *const k1NewGameStringFMTownsEnglish[1] = {
+ "[ START A NEW GAME ]"
+};
+
+static const StringListProvider k1NewGameStringFMTownsEnglishProvider = { ARRAYSIZE(k1NewGameStringFMTownsEnglish), k1NewGameStringFMTownsEnglish };
+
+static const char *const k1ConfigStringsFMTownsEnglish[9] = {
+ "slowest",
+ "slow",
+ "normal",
+ "fast",
+ "fastest",
+ "slowest",
+ "normal",
+ "fast",
+ "clickable"
+};
+
+static const StringListProvider k1ConfigStringsFMTownsEnglishProvider = { ARRAYSIZE(k1ConfigStringsFMTownsEnglish), k1ConfigStringsFMTownsEnglish };
+
+static const byte k1CreditsStringsFMTownsEnglish[1420] = {
+ 0x0D, 0x02, 0x54, 0x48, 0x45, 0x20, 0x45, 0x4E,
+ 0x44, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D,
+ 0x0D, 0x0D, 0x02, 0x46, 0x61, 0x62, 0x6C, 0x65,
+ 0x73, 0x20, 0x26, 0x20, 0x46, 0x69, 0x65, 0x6E,
+ 0x64, 0x73, 0x0D, 0x02, 0x42, 0x6F, 0x6F, 0x6B,
+ 0x20, 0x49, 0x0D, 0x02, 0x54, 0x48, 0x45, 0x20,
+ 0x4C, 0x45, 0x47, 0x45, 0x4E, 0x44, 0x20, 0x4F,
+ 0x46, 0x20, 0x4B, 0x59, 0x52, 0x41, 0x4E, 0x44,
+ 0x49, 0x41, 0x0D, 0x0D, 0x50, 0x75, 0x62, 0x6C,
+ 0x69, 0x73, 0x68, 0x65, 0x64, 0x20, 0x62, 0x79,
+ 0x0D, 0x02, 0x57, 0x65, 0x73, 0x74, 0x77, 0x6F,
+ 0x6F, 0x64, 0x20, 0x53, 0x74, 0x75, 0x64, 0x69,
+ 0x6F, 0x73, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D,
+ 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D,
+ 0x03, 0x44, 0x69, 0x72, 0x65, 0x63, 0x74, 0x6F,
+ 0x72, 0x3A, 0x05, 0x04, 0x42, 0x72, 0x65, 0x74,
+ 0x74, 0x20, 0x57, 0x2E, 0x20, 0x53, 0x70, 0x65,
+ 0x72, 0x72, 0x79, 0x0D, 0x0D, 0x03, 0x44, 0x65,
+ 0x73, 0x69, 0x67, 0x6E, 0x3A, 0x05, 0x04, 0x4D,
+ 0x69, 0x63, 0x68, 0x61, 0x65, 0x6C, 0x20, 0x4C,
+ 0x65, 0x67, 0x67, 0x0D, 0x04, 0x52, 0x69, 0x63,
+ 0x6B, 0x20, 0x50, 0x61, 0x72, 0x6B, 0x73, 0x0D,
+ 0x04, 0x50, 0x61, 0x75, 0x6C, 0x20, 0x53, 0x2E,
+ 0x20, 0x4D, 0x75, 0x64, 0x72, 0x61, 0x0D, 0x0D,
+ 0x03, 0x4C, 0x65, 0x61, 0x64, 0x20, 0x50, 0x72,
+ 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x6D, 0x65, 0x72,
+ 0x3A, 0x05, 0x04, 0x4D, 0x69, 0x63, 0x68, 0x61,
+ 0x65, 0x6C, 0x20, 0x4C, 0x65, 0x67, 0x67, 0x0D,
+ 0x0D, 0x03, 0x53, 0x63, 0x72, 0x69, 0x70, 0x74,
+ 0x20, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D,
+ 0x6D, 0x65, 0x72, 0x3A, 0x05, 0x04, 0x53, 0x63,
+ 0x6F, 0x74, 0x74, 0x20, 0x42, 0x6F, 0x77, 0x65,
+ 0x6E, 0x0D, 0x0D, 0x03, 0x20, 0x20, 0x41, 0x6D,
+ 0x69, 0x67, 0x61, 0x20, 0x20, 0x50, 0x72, 0x6F,
+ 0x67, 0x72, 0x61, 0x6D, 0x6D, 0x65, 0x72, 0x3A,
+ 0x05, 0x04, 0x42, 0x69, 0x6C, 0x6C, 0x20, 0x53,
+ 0x74, 0x6F, 0x6B, 0x65, 0x73, 0x0D, 0x0D, 0x03,
+ 0x20, 0x20, 0x50, 0x43, 0x2D, 0x39, 0x38, 0x20,
+ 0x20, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D,
+ 0x6D, 0x65, 0x72, 0x3A, 0x05, 0x04, 0x59, 0x75,
+ 0x6B, 0x69, 0x6F, 0x20, 0x53, 0x65, 0x6B, 0x69,
+ 0x67, 0x75, 0x63, 0x68, 0x69, 0x0D, 0x0D, 0x03,
+ 0x46, 0x4D, 0x2D, 0x54, 0x4F, 0x57, 0x4E, 0x53,
+ 0x20, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D,
+ 0x6D, 0x65, 0x72, 0x3A, 0x05, 0x04, 0x54, 0x61,
+ 0x69, 0x73, 0x65, 0x69, 0x20, 0x4E, 0x6F, 0x6D,
+ 0x75, 0x72, 0x61, 0x0D, 0x03, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x05, 0x04, 0x4F, 0x68, 0x73, 0x68, 0x75,
+ 0x6E, 0x20, 0x4C, 0x65, 0x65, 0x0D, 0x0D, 0x03,
+ 0x49, 0x6E, 0x74, 0x72, 0x6F, 0x20, 0x26, 0x20,
+ 0x46, 0x69, 0x6E, 0x61, 0x6C, 0x65, 0x3A, 0x05,
+ 0x04, 0x43, 0x68, 0x72, 0x69, 0x73, 0x74, 0x6F,
+ 0x70, 0x68, 0x65, 0x72, 0x20, 0x59, 0x61, 0x74,
+ 0x65, 0x73, 0x0D, 0x0D, 0x03, 0x41, 0x72, 0x74,
+ 0x20, 0x26, 0x20, 0x47, 0x72, 0x61, 0x70, 0x68,
+ 0x69, 0x63, 0x73, 0x3A, 0x05, 0x04, 0x52, 0x69,
+ 0x63, 0x6B, 0x20, 0x50, 0x61, 0x72, 0x6B, 0x73,
+ 0x0D, 0x04, 0x52, 0x65, 0x6E, 0x20, 0x4F, 0x6C,
+ 0x73, 0x65, 0x6E, 0x0D, 0x04, 0x4C, 0x6F, 0x75,
+ 0x69, 0x73, 0x65, 0x20, 0x53, 0x61, 0x6E, 0x64,
+ 0x6F, 0x76, 0x61, 0x6C, 0x0D, 0x04, 0x4A, 0x6F,
+ 0x73, 0x65, 0x70, 0x68, 0x20, 0x48, 0x65, 0x77,
+ 0x69, 0x74, 0x74, 0x20, 0x49, 0x56, 0x0D, 0x04,
+ 0x4A, 0x75, 0x64, 0x69, 0x74, 0x68, 0x20, 0x50,
+ 0x65, 0x74, 0x65, 0x72, 0x73, 0x6F, 0x6E, 0x0D,
+ 0x04, 0x41, 0x61, 0x72, 0x6F, 0x6E, 0x20, 0x50,
+ 0x6F, 0x77, 0x65, 0x6C, 0x6C, 0x0D, 0x04, 0x45,
+ 0x6C, 0x69, 0x65, 0x20, 0x41, 0x72, 0x61, 0x62,
+ 0x69, 0x61, 0x6E, 0x0D, 0x04, 0x45, 0x72, 0x69,
+ 0x63, 0x20, 0x53, 0x68, 0x75, 0x6C, 0x74, 0x73,
+ 0x0D, 0x0D, 0x03, 0x41, 0x75, 0x64, 0x69, 0x6F,
+ 0x20, 0x44, 0x69, 0x72, 0x65, 0x63, 0x74, 0x6F,
+ 0x72, 0x3A, 0x05, 0x04, 0x50, 0x61, 0x75, 0x6C,
+ 0x20, 0x53, 0x2E, 0x20, 0x4D, 0x75, 0x64, 0x72,
+ 0x61, 0x0D, 0x0D, 0x03, 0x4D, 0x75, 0x73, 0x69,
+ 0x63, 0x3A, 0x05, 0x04, 0x46, 0x72, 0x61, 0x6E,
+ 0x6B, 0x20, 0x4B, 0x6C, 0x65, 0x70, 0x61, 0x63,
+ 0x6B, 0x69, 0x0D, 0x03, 0x28, 0x39, 0x38, 0x20,
+ 0x26, 0x20, 0x54, 0x4F, 0x57, 0x4E, 0x53, 0x29,
+ 0x05, 0x04, 0x54, 0x61, 0x6B, 0x65, 0x73, 0x68,
+ 0x69, 0x20, 0x41, 0x62, 0x6F, 0x0D, 0x0D, 0x03,
+ 0x53, 0x6F, 0x75, 0x6E, 0x64, 0x20, 0x45, 0x66,
+ 0x66, 0x65, 0x63, 0x74, 0x73, 0x3A, 0x05, 0x04,
+ 0x44, 0x77, 0x69, 0x67, 0x68, 0x74, 0x20, 0x4F,
+ 0x6B, 0x61, 0x68, 0x61, 0x72, 0x61, 0x0D, 0x03,
+ 0x28, 0x50, 0x43, 0x2D, 0x39, 0x38, 0x29, 0x05,
+ 0x04, 0x54, 0x61, 0x6B, 0x65, 0x73, 0x68, 0x69,
+ 0x20, 0x41, 0x62, 0x6F, 0x0D, 0x0D, 0x03, 0x57,
+ 0x72, 0x69, 0x74, 0x65, 0x72, 0x3A, 0x05, 0x04,
+ 0x22, 0x43, 0x6F, 0x63, 0x6F, 0x22, 0x0D, 0x0D,
+ 0x03, 0x54, 0x72, 0x61, 0x6E, 0x73, 0x6C, 0x61,
+ 0x74, 0x6F, 0x72, 0x28, 0x4A, 0x61, 0x70, 0x61,
+ 0x6E, 0x65, 0x73, 0x65, 0x29, 0x3A, 0x05, 0x04,
+ 0x4D, 0x69, 0x6E, 0x6F, 0x72, 0x75, 0x20, 0x4E,
+ 0x61, 0x6B, 0x61, 0x7A, 0x61, 0x77, 0x61, 0x0D,
+ 0x04, 0x59, 0x75, 0x72, 0x69, 0x20, 0x49, 0x74,
+ 0x6F, 0x0D, 0x0D, 0x03, 0x51, 0x75, 0x61, 0x6C,
+ 0x69, 0x74, 0x79, 0x20, 0x41, 0x73, 0x73, 0x75,
+ 0x72, 0x61, 0x6E, 0x63, 0x65, 0x3A, 0x05, 0x04,
+ 0x47, 0x6C, 0x65, 0x6E, 0x6E, 0x20, 0x53, 0x70,
+ 0x65, 0x72, 0x72, 0x79, 0x0D, 0x04, 0x4D, 0x61,
+ 0x74, 0x74, 0x20, 0x43, 0x6F, 0x6C, 0x6C, 0x69,
+ 0x6E, 0x73, 0x0D, 0x04, 0x42, 0x69, 0x6C, 0x6C,
+ 0x20, 0x46, 0x6F, 0x73, 0x74, 0x65, 0x72, 0x0D,
+ 0x04, 0x4D, 0x69, 0x63, 0x68, 0x61, 0x65, 0x6C,
+ 0x20, 0x4C, 0x69, 0x67, 0x68, 0x74, 0x6E, 0x65,
+ 0x72, 0x0D, 0x04, 0x4D, 0x69, 0x63, 0x68, 0x61,
+ 0x65, 0x6C, 0x20, 0x47, 0x61, 0x74, 0x65, 0x72,
+ 0x0D, 0x04, 0x45, 0x75, 0x67, 0x65, 0x6E, 0x65,
+ 0x20, 0x4D, 0x61, 0x72, 0x74, 0x69, 0x6E, 0x0D,
+ 0x04, 0x4D, 0x69, 0x63, 0x68, 0x61, 0x65, 0x6C,
+ 0x20, 0x47, 0x6C, 0x6F, 0x73, 0x65, 0x63, 0x6B,
+ 0x69, 0x0D, 0x04, 0x4A, 0x75, 0x73, 0x74, 0x69,
+ 0x6E, 0x20, 0x4E, 0x6F, 0x72, 0x72, 0x0D, 0x04,
+ 0x54, 0x6F, 0x70, 0x20, 0x53, 0x74, 0x61, 0x72,
+ 0x20, 0x54, 0x65, 0x73, 0x74, 0x69, 0x6E, 0x67,
+ 0x0D, 0x04, 0x54, 0x65, 0x73, 0x74, 0x69, 0x6E,
+ 0x67, 0x20, 0x31, 0x2C, 0x32, 0x2C, 0x33, 0x0D,
+ 0x0D, 0x0D, 0x0D, 0x0D, 0x53, 0x70, 0x65, 0x63,
+ 0x69, 0x61, 0x6C, 0x20, 0x54, 0x68, 0x61, 0x6E,
+ 0x6B, 0x73, 0x20, 0x74, 0x6F, 0x0D, 0x4C, 0x79,
+ 0x6C, 0x65, 0x20, 0x4A, 0x2E, 0x20, 0x48, 0x61,
+ 0x6C, 0x6C, 0x0D, 0x44, 0x61, 0x76, 0x69, 0x64,
+ 0x20, 0x42, 0x69, 0x73, 0x68, 0x6F, 0x70, 0x0D,
+ 0x22, 0x54, 0x68, 0x65, 0x20, 0x44, 0x6F, 0x63,
+ 0x22, 0x0D, 0x61, 0x6E, 0x64, 0x0D, 0x46, 0x69,
+ 0x72, 0x65, 0x62, 0x65, 0x72, 0x72, 0x79, 0x20,
+ 0x47, 0x72, 0x65, 0x65, 0x6E, 0x0D, 0x0D, 0x0D,
+ 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D,
+ 0x0D, 0x0D, 0x0D, 0x02, 0x43, 0x41, 0x53, 0x54,
+ 0x20, 0x4F, 0x46, 0x20, 0x43, 0x48, 0x41, 0x52,
+ 0x41, 0x43, 0x54, 0x45, 0x52, 0x53, 0x0D, 0x0D,
+ 0x4D, 0x61, 0x6C, 0x63, 0x6F, 0x6C, 0x6D, 0x20,
+ 0x74, 0x68, 0x65, 0x20, 0x4A, 0x65, 0x73, 0x74,
+ 0x65, 0x72, 0x0D, 0x42, 0x72, 0x61, 0x6E, 0x64,
+ 0x6F, 0x6E, 0x20, 0x74, 0x68, 0x65, 0x20, 0x42,
+ 0x6F, 0x6C, 0x64, 0x0D, 0x42, 0x72, 0x61, 0x6E,
+ 0x64, 0x79, 0x77, 0x69, 0x6E, 0x65, 0x20, 0x61,
+ 0x6E, 0x64, 0x20, 0x44, 0x61, 0x72, 0x6D, 0x0D,
+ 0x50, 0x72, 0x69, 0x65, 0x73, 0x74, 0x65, 0x73,
+ 0x73, 0x20, 0x42, 0x72, 0x79, 0x6E, 0x6E, 0x0D,
+ 0x5A, 0x61, 0x6E, 0x74, 0x68, 0x69, 0x61, 0x2C,
+ 0x20, 0x4C, 0x61, 0x64, 0x79, 0x20, 0x6F, 0x66,
+ 0x20, 0x41, 0x6C, 0x63, 0x68, 0x65, 0x6D, 0x79,
+ 0x0D, 0x48, 0x65, 0x72, 0x6D, 0x61, 0x6E, 0x20,
+ 0x74, 0x68, 0x65, 0x20, 0x48, 0x61, 0x6E, 0x64,
+ 0x79, 0x6D, 0x61, 0x6E, 0x0D, 0x0D, 0x0D, 0x0D,
+ 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x01,
+ 0x41, 0x6E, 0x79, 0x20, 0x63, 0x68, 0x61, 0x72,
+ 0x61, 0x63, 0x74, 0x65, 0x72, 0x73, 0x20, 0x69,
+ 0x6E, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x67,
+ 0x61, 0x6D, 0x65, 0x20, 0x77, 0x68, 0x6F, 0x20,
+ 0x62, 0x65, 0x61, 0x72, 0x0D, 0x01, 0x72, 0x65,
+ 0x73, 0x65, 0x6D, 0x62, 0x6C, 0x61, 0x6E, 0x63,
+ 0x65, 0x20, 0x74, 0x6F, 0x20, 0x70, 0x65, 0x72,
+ 0x73, 0x6F, 0x6E, 0x73, 0x20, 0x6C, 0x69, 0x76,
+ 0x69, 0x6E, 0x67, 0x20, 0x6F, 0x72, 0x0D, 0x01,
+ 0x64, 0x65, 0x61, 0x64, 0x20, 0x61, 0x72, 0x65,
+ 0x20, 0x70, 0x75, 0x72, 0x65, 0x6C, 0x79, 0x20,
+ 0x63, 0x6F, 0x69, 0x6E, 0x63, 0x69, 0x64, 0x65,
+ 0x6E, 0x74, 0x61, 0x6C, 0x2E, 0x0D, 0x0D, 0x0D,
+ 0x01, 0x43, 0x6F, 0x70, 0x79, 0x72, 0x69, 0x67,
+ 0x68, 0x74, 0x20, 0x28, 0x43, 0x29, 0x20, 0x31,
+ 0x39, 0x39, 0x32, 0x2C, 0x20, 0x57, 0x65, 0x73,
+ 0x74, 0x77, 0x6F, 0x6F, 0x64, 0x20, 0x53, 0x74,
+ 0x75, 0x64, 0x69, 0x6F, 0x73, 0x2C, 0x20, 0x49,
+ 0x6E, 0x63, 0x2E, 0x0D, 0x01, 0x43, 0x6F, 0x70,
+ 0x79, 0x72, 0x69, 0x67, 0x68, 0x74, 0x20, 0x28,
+ 0x43, 0x29, 0x20, 0x31, 0x39, 0x39, 0x33, 0x2C,
+ 0x20, 0x53, 0x74, 0x61, 0x72, 0x20, 0x43, 0x72,
+ 0x61, 0x66, 0x74, 0x2C, 0x20, 0x49, 0x6E, 0x63,
+ 0x2E, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0D,
+ 0x01, 0x41, 0x6C, 0x6C, 0x20, 0x72, 0x69, 0x67,
+ 0x68, 0x74, 0x73, 0x20, 0x72, 0x65, 0x73, 0x65,
+ 0x72, 0x76, 0x65, 0x64, 0x2E, 0x0D, 0x0D, 0x0D,
+ 0x0D, 0x0D, 0x0D, 0x00
+};
+
+static const ByteProvider k1CreditsStringsFMTownsEnglishProvider = { ARRAYSIZE(k1CreditsStringsFMTownsEnglish), k1CreditsStringsFMTownsEnglish };
+
diff --git a/devtools/create_kyradat/resources/lok_fmtowns_japanese.h b/devtools/create_kyradat/resources/lok_fmtowns_japanese.h
new file mode 100644
index 0000000000..37f82e5623
--- /dev/null
+++ b/devtools/create_kyradat/resources/lok_fmtowns_japanese.h
@@ -0,0 +1,527 @@
+static const char *const k1IntroStringsFMTownsJapanese[50] = {
+ "This is a text test - 1",
+ "This is a text test - 2",
+ "\x8B""v""\x82\xB5\x90""U""\x82\xE8\x82\xBE\x82\xC8\x81""A""\x83""J""\x83\x89\x83""b""\x83""N""\x81""E""\x81""E""\x81""E",
+ "\x81""E""\x81""E""\x81""E""\x89\xA4\x8E\xBA\x96\x82\x8F""p""\x8E""t""\x82\xCC\x8E""w""\x93\xB1\x8E\xD2\x93""a""\x81""I",
+ "\x82\xA0\x82\xF1\x82\xBD\x82\xF0\x8B\xC1\x82\xA9\x82\xB5\x82\xBD\x82\xA9\x82\xC8\x81""H",
+ "\x83""}""\x83\x8B\x83""R""\x83\x80\x81""I",
+ "\x8B""M""\x97""l""\x82\xCC\x92""E""\x91\x96\x82\xC9\x82\xC2\x82\xA2\x82\xC4\x82\xCD\x8D\xF0\x93\xFA\x95\xF1\x8D\x90\x82\xF0\x8E\xF3\x82\xAF\x82\xC4\x82\xA2\x82\xBD\x81""B",
+ "\x82\xBB\x82\xEA\x82\xC5\x82\xA8\x91""O""\x82\xAA\x97\x88\x82\xE9\x82\xCC\x82\xF0\x91\xD2\x82\xC1\x82\xC4\x82\xA2\x82\xBD\x82\xF1\x82\xBE\x81""B",
+ "\x89\xBD\x8C\xCC\x82\xA8\x82\xEA\x97""l""\x82\xAA\x97\x88\x82\xBD\x82\xA9\x95\xAA\x82\xA9\x82\xE9\x82\xA9\x81""H",
+ "\x82\xC2\x82\xA2\x82\xC9\x81""A""\x82\xB1\x82\xCC\x8D\x91\x82\xF0\x8F\xE6\x82\xC1\x8E\xE6\x82\xC1\x82\xBD\x82\xBC\x81""I",
+ "\x8B""M""\x97""l""\x82\xCC\x82\xC2\x82\xDC\x82\xE7\x82\xF1\x8B\xBA\x94\x97\x82\xC8\x82\xC7\x82\xC5\x82\xA8\x82\xEA\x97""l""\x82\xF0\x94\x9B\x82\xEA\x82\xE9\x82\xE0\x82\xCC\x82\xA9\x81""B",
+ "\x82\xB3\x82\xA0\x81""A""\x82\xE2\x82\xE9\x82\xC8\x82\xE7\x82\xE2\x82\xC1\x82\xC4\x82\xDD\x82\xEB\x81""I",
+ "\x82\xED\x82\xB5\x82\xC9\x82\xE0\x82\xED\x82\xB8\x82\xA9\x82\xBE\x82\xAA\x96\x82\x97\xCD\x82\xAA\x8E""c""\x82\xC1\x82\xC4\x82\xA8\x82\xE9\x82\xED\x82\xA2\x81""B",
+ "\x82\xA8\x91""O""\x82\xF0\x82\xE2\x82\xC1\x82\xC2\x82\xAF\x82\xE9\x82\xC6\x82\xA2\x82\xA4\x82\xB1\x82\xC6\x82\xB3\x81""E""\x81""E""\x81""E",
+ "\x81""E""\x81""E""\x81""E""\x82\xE0\x82\xCD\x82\xE2\x82\xA8\x91""O""\x82\xCD\x90\xCE\x82\xC6\x82\xC8\x82\xC1\x82\xBD\x81""E""\x81""E""\x81""E",
+ "\x81""E""\x81""E""\x81""E""\x82\xBE\x82\xAA\x96\xDA\x82\xBE\x82\xAF\x82\xCD\x8C\xA9\x82\xA6\x82\xE9\x82\xDC\x82\xDC\x82\xC9\x82\xB5\x82\xC4\x82\xA8\x82\xB1\x82\xA4\x81""B",
+ "\x82\xA8\x82\xEA\x97""l""\x82\xCD\x83""L""\x83\x89\x83\x93\x83""f""\x83""B""\x83""A""\x82\xC9\x82\xCD\x82\xC8\x82\xF1\x82\xCC\x8A\xB4\x8F\x9D\x82\xE0\x82\xC8\x82\xA2\x81""E""\x81""E""\x81""E",
+ "\x81""E""\x81""E""\x81""E""\x82\xBE\x82\xAA\x81""A""\x82\xA8\x91""O""\x82\xBD\x82\xBF\x82\xCD\x82\xC7\x82\xA4\x82\xA9\x82\xC8\x81""B",
+ "\x88\xAB\x82\xCC\x93\xB9\x89\xBB\x8E""t""\x81""A""\x83""}""\x83\x8B\x83""R""\x83\x80\x82\xAA\x98""S""\x82\xF0\x94""j""\x82\xC1\x82\xBD\x81""B",
+ "\x8D\xA1\x82\xE2\x82\xB1\x82\xCC\x8D\x91\x82\xCC\x96\x82\x96""@""\x82\xCD\x82\xB7\x82\xD7\x82\xC4\x94\xDE\x82\xC9\x8E""x""\x94""z""\x82\xB3\x82\xEA\x82\xC4\x82\xB5\x82\xDC\x82\xC1\x82\xBD\x81""B",
+ "",
+ "",
+ "\x89\xBD\x82\xC5\x82\xA8\x82\xEA\x97""l""\x82\xF0\x82\xC2\x82\xDC\x82\xB8\x82\xA9\x82\xB9\x82\xBD\x81""I",
+ "\x82\xE6\x82\xB5\x81""A""\x82\xA8\x91""O""\x82\xC9\x82\xB7\x82\xCE\x82\xE7\x82\xB5\x82\xA2\x91\xA1\x82\xE8\x95\xA8\x82\xF0\x82\xE2\x82\xEB\x82\xA4\x81""E""\x81""E""\x81""E",
+ "\x82\xB1\x82\xEA\x82\xAA\x82\xA8\x82\xEA\x97""l""\x82\xCC\x83\x86\x81""[""\x83\x82\x83""A""\x82\xB3\x81""I",
+ "\x82\xBE\x82\xAA\x81""A""\x83""t""\x83""F""\x83""A""\x82\xC8\x82\xA8\x82\xEA\x97""l""\x82\xCD\x8C""x""\x8D\x90\x82\xF0\x82\xB7\x82\xE9\x82\xC2\x82\xE0\x82\xE8\x82\xB3\x81""B",
+ "\x82\xA0\x82\xCC\x96\xD8\x82\xC9\x82\xCD\x93""o""\x82\xE9\x82\xC8\x82\xE6\x81""I",
+ "\x82\xBF\x82\xC1\x82\xB1\x82\xA2\x83\x8A\x83""X""\x82\xDF\x81""A""\x82\xA0\x82\xCC\x96\xD8\x82\xC9\x82\xCD\x93""o""\x82\xE9\x82\xC8\x81""I",
+ "\x83""u""\x83""D""\x81""[""\x81""I",
+ "\x82\xB1\x82\xA2\x82\xC2\x82\xCD\x96\xCA\x94\x92\x82\xA2\x82\xE2\x81""E""\x81""E""\x81""E",
+ "\x81""E""\x81""E""\x81""E""\x82\xBB\x82\xA4\x8E""v""\x82\xED\x82\xF1\x82\xA9\x81""H",
+ "\x82\xCD\x82\xC1\x81""A""\x82\xCD\x82\xC1\x82\xCD\x81""E""\x81""E""\x81""E",
+ "\x8C\xB3\x82\xC9\x96\xDF\x82\xC1\x82\xBD\x82\xCC\x82\xA9\x81""H",
+ "\x90\xB6\x82\xAB\x82\xC4\x82\xA2\x82\xE9\x82\xB1\x82\xC6\x82\xCD\x82\xB7\x82\xCE\x82\xE7\x82\xB5\x82\xA2\x81""I",
+ "\x83""u""\x83\x89\x83\x93\x83""h""\x83\x93\x81""I",
+ "\x82\xA8\x91""c""\x95\x83\x82\xB3\x82\xF1\x81""I""\x96""l""\x82\xBD\x82\xBF\x82\xCD\x82\xE2\x82\xE8\x82\xDC\x82\xB5\x82\xBD\x82\xCB\x81""I",
+ "\x82\xA2\x82\xA2\x82\xE2\x81""I""\x82\xE2\x82\xC1\x82\xBD\x82\xCC\x82\xCD\x82\xA8\x91""O""\x81""I",
+ "\x83""u""\x83\x89\x83\x93\x83""h""\x83\x93\x89\xA4\x81""@""\x82\xCE\x82\xF1\x82\xB4\x82\xA2\x81""I",
+ "\x89\xA4\x8E\xBA\x96\x82\x8F""p""\x8E""t""\x81""@""\x82\xCE\x82\xF1\x82\xB4\x82\xA2\x81""I",
+ "\x82\xB3\x82\xA0\x81""A""\x8B\xA4\x82\xC9\x83""L""\x83\x89\x83\x93\x83""f""\x83""B""\x83""A""\x82\xF0\x95\x9C\x8B\xBB\x82\xB5\x82\xE6\x82\xA4\x81""I",
+ "\x91\xE5\x8E""^""\x90\xAC\x81""I",
+ "\x96""l""\x82\xCC\x89\xA4\x82\xC6\x82\xB5\x82\xC4\x82\xCC\x8D\xC5\x8F\x89\x82\xCC\x95""z""\x8D\x90\x82\xCD\x81""E""\x81""E""\x81""E",
+ "\x83""T""\x83\x93\x83""_""\x83\x8B\x82\xF0\x83""L""\x83\x89\x83\x93\x83""f""\x83""B""\x83""A""\x82\xCC\x8C\xF6\x8E\xAE\x82\xC8\x97\x9A\x95\xA8\x82\xC6\x82\xB7\x82\xE9\x82\xB1\x82\xC6\x82\xC5\x82\xB7\x81""I",
+ "\x82\xE6\x82\xAD\x82\xE2\x82\xC1\x82\xBD\x81""I""\x83""u""\x83\x89\x83\x93\x83""h""\x83\x93\x81""B",
+ "\x8E\xA9\x91""R""\x8A""E""\x82\xCD\x82\xE6\x82\xEB\x82\xB1\x82\xD1\x82\xC9\x82\xA0\x82\xD3\x82\xEA\x81""E""\x81""E""\x81""E",
+ "\x82\xA0\x82\xC8\x82\xBD\x82\xCC\x97""F""\x90""l""\x92""B""\x82\xE0\x8F\x95\x82\xA9\x82\xC1\x82\xBD\x82\xCC\x82\xC5\x82\xB7\x81""I",
+ "\x83""u""\x83\x8A\x83\x93\x82\xE6\x81""E""\x81""E""\x81""E",
+ "\x83""}""\x83\x8B\x83""R""\x83\x80\x82\xAA\x98""S""\x82\xF0\x94""j""\x82\xC1\x82\xBD\x81""I",
+ "\x82\xDC\x82\xE0\x82\xC8\x82\xAD\x93""z""\x82\xCD\x82\xED\x82\xB5\x82\xCC\x82\xC6\x82\xB1\x82\xEB\x82\xD6\x97\x88\x82\xE9\x82\xBE\x82\xEB\x82\xA4\x81""B",
+ "\x82\xC7\x82\xA4\x82\xA9\x83""u""\x83\x89\x83\x93\x83""h""\x83\x93\x82\xF0\x8F\x95\x82\xAF\x82\xC4\x82\xE2\x82\xC1\x82\xC4\x82\xA8\x82\xAD\x82\xEA\x81""E""\x81""E""\x81""E"
+};
+
+static const StringListProvider k1IntroStringsFMTownsJapaneseProvider = { ARRAYSIZE(k1IntroStringsFMTownsJapanese), k1IntroStringsFMTownsJapanese };
+
+static const char *const k1ItemNamesFMTownsJapanese[107] = {
+ "\x83""K""\x81""[""\x83""l""\x83""b""\x83""g",
+ "\x83""A""\x83\x81\x83""W""\x83""X""\x83""g",
+ "\x83""A""\x83""N""\x83""A""\x83""}""\x83\x8A\x83\x93",
+ "\x83""_""\x83""C""\x83""A""\x83\x82\x83\x93\x83""h",
+ "\x83""G""\x83\x81\x83\x89\x83\x8B\x83""h",
+ "\x83""p""\x81""[""\x83\x8B",
+ "\x83\x8B\x83""r""\x81""[",
+ "\x83""y""\x83\x8A\x83""h""\x81""[""\x83""g",
+ "\x83""T""\x83""t""\x83""@""\x83""C""\x83""A",
+ "\x83""I""\x83""p""\x81""[""\x83\x8B",
+ "\x83""g""\x83""p""\x81""[""\x83""Y",
+ "\x83""I""\x83""j""\x83""L""\x83""X",
+ "\x83""T""\x83\x93\x83""X""\x83""g""\x81""[""\x83\x93",
+ "\x83\x80\x81""[""\x83\x93\x83""X""\x83""g""\x81""[""\x83\x93",
+ "\x83\x8C\x83""C""\x83\x93\x83""{""\x81""[""\x83""X""\x83""g""\x81""[""\x83\x93",
+ "\x83\x8D\x81""[""\x83""h""\x83""X""\x83""g""\x81""[""\x83\x93",
+ "\x83""o""\x83\x89",
+ "\x83""`""\x83\x85\x81""[""\x83\x8A\x83""b""\x83""v",
+ "\x83\x89\x83\x93",
+ "\x8B\xE2\x82\xCC\x83""o""\x83\x89",
+ "\x8B\xE2\x82\xCC\x8F\xAC\x91\x9C",
+ "\x8B\xE2\x89\xDD",
+ "\x8B\xE0\x89\xDD",
+ "\x8B\xE0\x82\xCC\x83\x8A\x83\x93\x83""O",
+ "\x90\xB9\x94""t",
+ "\x8F\xBC\x82\xDA\x82\xC1\x82\xAD\x82\xE8",
+ "\x82\xC7\x82\xF1\x82\xAE\x82\xE8",
+ "\x83""N""\x83\x8B\x83""~",
+ "\x94""R""\x82\xA6\x82\xE9\x83""t""\x83""@""\x83""C""\x83""A""\x83""x""\x83\x8A\x81""[",
+ "\x83""t""\x83""@""\x83""C""\x83""A""\x83""x""\x83\x8A\x81""[",
+ "\x83""t""\x83""@""\x83""C""\x83""A""\x83""x""\x83\x8A\x81""[",
+ "\x83""t""\x83""@""\x83""C""\x83""A""\x83""x""\x83\x8A\x81""[",
+ "\x83""t""\x83""@""\x83""C""\x83""A""\x83""x""\x83\x8A\x81""[",
+ "\x83""t""\x83""@""\x83""C""\x83""A""\x83""x""\x83\x8A\x81""[",
+ "\x82\xB3\x82\xA9\x82\xC8",
+ "\x82\xB3\x82\xA9\x82\xC8\x82\xCC\x8D\x9C",
+ "\x97""r""\x82\xCC\x91\xAB",
+ "\x8D\x9C",
+ "\x83\x8A\x83\x93\x83""S",
+ "\x83\x8A\x83\x93\x83""S""\x82\xCC\x90""c",
+ "\x83""u""\x83\x8B\x81""[""\x83""x""\x83\x8A\x81""[",
+ "\x83""L""\x83""m""\x83""R",
+ "\x83""m""\x81""[""\x83""g",
+ "\x91\xE5\x97\x9D\x90\xCE",
+ "\x82\xCC\x82\xB1\x82\xAC\x82\xE8",
+ "\x83""A""\x83\x93\x83""N",
+ "\x89""H""\x8D\xAA",
+ "\x83""^""\x83""}""\x83""S",
+ "\x97""t""\x82\xC1\x82\xCF",
+ "\x94\x92\x92\xDC\x91\x90",
+ "\x97\x8E\x82\xBF\x82\xBD\x90\xAF",
+ "\x83""N""\x83\x8A\x83""X""\x83""^""\x83\x8B\x82\xCC\x8E\xEC",
+ "\x97\xDC\x82\xCC\x82\xB5\x82\xB8\x82\xAD",
+ "\x8B\xBE",
+ "\x95""X""\x82\xCC\x82\xA9\x82\xAF\x82\xE7",
+ "\x83""t""\x83\x8B\x81""[""\x83""g",
+ "\x8D\xBB\x8E\x9E\x8C""v",
+ "\x93""S""\x82\xCC\x8C\xAE",
+ "\x82\xD0\x82\xB7\x82\xA2\x82\xCC\x8C\xAE",
+ "\x8D\x95\x97""j""\x90\xCE\x82\xCC\x8C\xAE",
+ "\x90\xD4\x82\xCC\x83""|""\x81""[""\x83""V""\x83\x87\x83\x93",
+ "\x90\xD4\x82\xCC\x83""|""\x81""[""\x83""V""\x83\x87\x83\x93",
+ "\x90\xC2\x82\xCC\x83""|""\x81""[""\x83""V""\x83\x87\x83\x93",
+ "\x90\xC2\x82\xCC\x83""|""\x81""[""\x83""V""\x83\x87\x83\x93",
+ "\x89\xA9\x90""F""\x82\xCC\x83""|""\x81""[""\x83""V""\x83\x87\x83\x93",
+ "\x89\xA9\x90""F""\x82\xCC\x83""|""\x81""[""\x83""V""\x83\x87\x83\x93",
+ "\x97\xCE\x82\xCC\x83""|""\x81""[""\x83""V""\x83\x87\x83\x93",
+ "\x83""I""\x83\x8C\x83\x93\x83""W""\x90""F""\x82\xCC\x83""|""\x81""[""\x83""V""\x83\x87\x83\x93",
+ "\x8E\x87\x90""F""\x82\xCC\x83""|""\x81""[""\x83""V""\x83\x87\x83\x93",
+ "\x93\xF8\x90""F""\x82\xCC\x83""|""\x81""[""\x83""V""\x83\x87\x83\x93",
+ "\x90""V""\x91""N""\x82\xC8\x90\x85",
+ "\x90""V""\x91""N""\x82\xC8\x90\x85",
+ "\x89\x96\x90\x85",
+ "\x89\x96\x90\x85",
+ "\x83""~""\x83""l""\x83\x89\x83\x8B\x83""E""\x83""H""\x81""[""\x83""^""\x81""[",
+ "\x83""~""\x83""l""\x83\x89\x83\x8B\x83""E""\x83""H""\x81""[""\x83""^""\x81""[",
+ "\x96\x82\x96""@""\x82\xCC\x90\x85",
+ "\x96\x82\x96""@""\x82\xCC\x90\x85",
+ "\x8B\xF3\x82\xC1\x82\xDB\x82\xCC\x83""t""\x83\x89\x83""X""\x83""R",
+ "\x8B\xF3\x82\xC1\x82\xDB\x82\xCC\x83""t""\x83\x89\x83""X""\x83""R",
+ "\x83""X""\x83""N""\x83\x8D\x81""[""\x83\x8B",
+ "\x83""X""\x83""N""\x83\x8D\x81""[""\x83\x8B",
+ "\x83""X""\x83""N""\x83\x8D\x81""[""\x83\x8B",
+ "\x83""X""\x83""N""\x83\x8D\x81""[""\x83\x8B",
+ "\x83""X""\x83""N""\x83\x8D\x81""[""\x83\x8B",
+ "\x83""X""\x83""N""\x83\x8D\x81""[""\x83\x8B",
+ "\x83""X""\x83""N""\x83\x8D\x81""[""\x83\x8B",
+ "\x83""X""\x83""N""\x83\x8D\x81""[""\x83\x8B",
+ "\x83""X""\x83""N""\x83\x8D\x81""[""\x83\x8B",
+ "\x83""X""\x83""N""\x83\x8D\x81""[""\x83\x8B",
+ "\x97""r""\x94\xE7\x8E\x86\x82\xCC\x90\xD8\x82\xEA\x92""[",
+ "\x97""r""\x94\xE7\x8E\x86\x82\xCC\x90\xD8\x82\xEA\x92""[",
+ "\x97""r""\x94\xE7\x8E\x86\x82\xCC\x90\xD8\x82\xEA\x92""[",
+ "\x97""r""\x94\xE7\x8E\x86\x82\xCC\x90\xD8\x82\xEA\x92""[",
+ "\x97""r""\x94\xE7\x8E\x86\x82\xCC\x90\xD8\x82\xEA\x92""[",
+ "\x90\xD4\x82\xCC\x83\x81\x83""K""\x83""X""\x83""g""\x81""[""\x83\x93",
+ "\x83""I""\x83\x8C\x83\x93\x83""W""\x90""F""\x82\xCC\x83\x81\x83""K""\x83""X""\x83""g""\x81""[""\x83\x93",
+ "\x89\xA9\x90""F""\x82\xCC\x83\x81\x83""K""\x83""X""\x83""g""\x81""[""\x83\x93",
+ "\x97\xCE\x82\xCC\x83\x81\x83""K""\x83""X""\x83""g""\x81""[""\x83\x93",
+ "\x90\xC2\x97\xCE\x82\xCC\x83\x81\x83""K""\x83""X""\x83""g""\x81""[""\x83\x93",
+ "\x90\xC2\x82\xCC\x83\x81\x83""K""\x83""X""\x83""g""\x81""[""\x83\x93",
+ "\x8E\x87\x90""F""\x82\xCC\x83\x81\x83""K""\x83""X""\x83""g""\x81""[""\x83\x93",
+ "\x8F""d""\x82\xA2\x90\xCE",
+ "\x89\xA4\x8A\xA5",
+ "\x89\xA4\xE2\x94",
+ "\x8B\xE0\x82\xCC\x8C\xAE",
+ "\x95\xAA\x82\xA9\x82\xE7\x82\xC8\x82\xA2\x82\xE0\x82\xCC"
+};
+
+static const StringListProvider k1ItemNamesFMTownsJapaneseProvider = { ARRAYSIZE(k1ItemNamesFMTownsJapanese), k1ItemNamesFMTownsJapanese };
+
+static const char *const k1TakenStringsFMTownsJapanese[2] = {
+ "\x82\xF0\x8E\xE6\x82\xC1\x82\xBD\x81""B",
+ "\x82\xF0\x8E\xE6\x82\xC1\x82\xBD\x81""B"
+};
+
+static const StringListProvider k1TakenStringsFMTownsJapaneseProvider = { ARRAYSIZE(k1TakenStringsFMTownsJapanese), k1TakenStringsFMTownsJapanese };
+
+static const char *const k1PlacedStringsFMTownsJapanese[1] = {
+ "\x82\xF0\x82\xB5\x82\xDC\x82\xC1\x82\xBD\x81""B"
+};
+
+static const StringListProvider k1PlacedStringsFMTownsJapaneseProvider = { ARRAYSIZE(k1PlacedStringsFMTownsJapanese), k1PlacedStringsFMTownsJapanese };
+
+static const char *const k1DroppedStringsFMTownsJapanese[1] = {
+ "\x82\xF0\x92""u""\x82\xA2\x82\xBD\x81""B"
+};
+
+static const StringListProvider k1DroppedStringsFMTownsJapaneseProvider = { ARRAYSIZE(k1DroppedStringsFMTownsJapanese), k1DroppedStringsFMTownsJapanese };
+
+static const char *const k1NoDropStringsFMTownsJapanese[2] = {
+ "\x82\xB1\x82\xCC\x8F\xEA\x96\xCA\x82\xC5\x82\xCD\x81""A""\x82\xB1\x82\xEA\x88\xC8\x8F\xE3\x83""A""\x83""C""\x83""e""\x83\x80\x82\xAA\x92""u""\x82\xAF\x82\xDC\x82\xB9\x82\xF1\x81""B",
+ "\x82\xB1\x82\xB1\x82\xC9\x82\xCD\x92""u""\x82\xAF\x82\xDC\x82\xB9\x82\xF1\x81""B"
+};
+
+static const StringListProvider k1NoDropStringsFMTownsJapaneseProvider = { ARRAYSIZE(k1NoDropStringsFMTownsJapanese), k1NoDropStringsFMTownsJapanese };
+
+static const char *const k1PutDownStringFMTownsJapanese[1] = {
+ "\x82\xDC\x82\xB8\x81""A""\x82\xB1\x82\xEA\x82\xF0\x92""u""\x82\xA2\x82\xC4\x82\xA9\x82\xE7\x82\xCC\x95\xFB\x82\xAA\x82\xE6\x82\xB3\x82\xBB\x82\xA4\x82\xBE\x81""B"
+};
+
+static const StringListProvider k1PutDownStringFMTownsJapaneseProvider = { ARRAYSIZE(k1PutDownStringFMTownsJapanese), k1PutDownStringFMTownsJapanese };
+
+static const char *const k1WaitAmuletStringFMTownsJapanese[1] = {
+ "\x83""A""\x83""~""\x83\x85\x83\x8C\x83""b""\x83""g""\x82\xC9\x97\xCD\x82\xAA\x96\xDF\x82\xE9\x82\xDC\x82\xC5\x91\xD2\x82\xC1\x82\xC4\x82\xDD\x82\xE6\x82\xA4\x81""B"
+};
+
+static const StringListProvider k1WaitAmuletStringFMTownsJapaneseProvider = { ARRAYSIZE(k1WaitAmuletStringFMTownsJapanese), k1WaitAmuletStringFMTownsJapanese };
+
+static const char *const k1BlackJewelStringFMTownsJapanese[1] = {
+ "\x82\xB1\x82\xEA\x82\xCD\x95\xF3\x90\xCE\x82\xC9\x82\xCD\x88\xE1\x82\xA2\x82\xC8\x82\xA2\x82\xAA\x81""A""\x82\xC7\x82\xA4\x82\xB5\x82\xC4\x82\xDC\x82\xC1\x8D\x95\x82\xC8\x82\xF1\x82\xBE\x82\xEB\x82\xA4\x81""H"
+};
+
+static const StringListProvider k1BlackJewelStringFMTownsJapaneseProvider = { ARRAYSIZE(k1BlackJewelStringFMTownsJapanese), k1BlackJewelStringFMTownsJapanese };
+
+static const char *const k1HealingTipStringFMTownsJapanese[1] = {
+ "\x82\xA0\x82\xEA\x81""A""\x82\xB1\x82\xEA\x82\xCD\x8F\x9D\x82\xC2\x82\xA2\x82\xBD\x82\xE0\x82\xCC\x82\xF0\x8E\xA1\x82\xB7\x96\x82\x96""@""\x82\xC8\x82\xF1\x82\xBE\x81""B"
+};
+
+static const StringListProvider k1HealingTipStringFMTownsJapaneseProvider = { ARRAYSIZE(k1HealingTipStringFMTownsJapanese), k1HealingTipStringFMTownsJapanese };
+
+static const char *const k1PoisonGoneStringFMTownsJapanese[2] = {
+ "\x82\xB7\x82\xB2\x82\xA2\x81""I",
+ "\x93\xC5\x82\xAA\x8F\xC1\x82\xA6\x82\xBD\x81""I"
+};
+
+static const StringListProvider k1PoisonGoneStringFMTownsJapaneseProvider = { ARRAYSIZE(k1PoisonGoneStringFMTownsJapanese), k1PoisonGoneStringFMTownsJapanese };
+
+static const char *const k1ThePoisonStringsFMTownsJapanese[4] = {
+ "\x93\xC5\x82\xBE\x81""E""\x81""E""\x81""E",
+ "\x8C\xC4\x8B""z""\x82\xAA\x8F""o""\x97\x88\x82\xC8\x82\xA2\x81""E""\x81""E""\x81""E",
+ "\x8B""C""\x95\xAA\x82\xAA\x88\xAB\x82\xA2\x81""E""\x81""E""\x81""E",
+ "\x82\xA0\x82\xCC\x8E\xD6\x82\xCD""\r""\x93\xC5\x8E\xD6\x82\xC9\x82\xBF\x82\xAA\x82\xA2\x82\xC8\x82\xA2\x81""I"
+};
+
+static const StringListProvider k1ThePoisonStringsFMTownsJapaneseProvider = { ARRAYSIZE(k1ThePoisonStringsFMTownsJapanese), k1ThePoisonStringsFMTownsJapanese };
+
+static const char *const k1FluteStringsFMTownsJapanese[2] = {
+ "\x82\xA0\x82\xDC\x82\xE8\x82\xA2\x82\xA2\x89\xB9\x90""F""\x82\xB6\x82\xE1\x82\xC8\x82\xA2\x82\xC8\x81""B",
+ "\x8D\xC5\x8C\xE3\x82\xCD\x82\xC6\x82\xC4\x82\xE0\x8D\x82\x82\xA2\x89\xB9\x82\xBE\x81""I"
+};
+
+static const StringListProvider k1FluteStringsFMTownsJapaneseProvider = { ARRAYSIZE(k1FluteStringsFMTownsJapanese), k1FluteStringsFMTownsJapanese };
+
+static const char *const k1WispJewelStringsFMTownsJapanese[3] = {
+ "\x89\xBD\x82\xE0\x8A\xB4\x82\xB6\x82\xC8\x82\xA2\x82\xC8\x82\xA0\x81""B",
+ "\x8D\xC5\x8F\x89\x82\xC9\x81""A",
+ "\x82\xF0\x89\xBA\x82\xC9\x92""u""\x82\xAD\x82\xCC\x82\xA9\x82\xE0\x92""m""\x82\xEA\x82\xC8\x82\xA2\x81""B"
+};
+
+static const StringListProvider k1WispJewelStringsFMTownsJapaneseProvider = { ARRAYSIZE(k1WispJewelStringsFMTownsJapanese), k1WispJewelStringsFMTownsJapanese };
+
+static const char *const k1MagicJewelStringsFMTownsJapanese[1] = {
+ "\x82\xB1\x82\xEA\x82\xCD\x88\xE1\x82\xA4\x82\xBC\x81""B"
+};
+
+static const StringListProvider k1MagicJewelStringsFMTownsJapaneseProvider = { ARRAYSIZE(k1MagicJewelStringsFMTownsJapanese), k1MagicJewelStringsFMTownsJapanese };
+
+static const char *const k1FlaskFullStringFMTownsJapanese[1] = {
+ "\x83""t""\x83\x89\x83""X""\x83""R""\x82\xCD\x82\xE0\x82\xA4\x90\x85\x82\xAA\x93\xFC\x82\xC1\x82\xC4\x82\xA2\x82\xE9\x81""B"
+};
+
+static const StringListProvider k1FlaskFullStringFMTownsJapaneseProvider = { ARRAYSIZE(k1FlaskFullStringFMTownsJapanese), k1FlaskFullStringFMTownsJapanese };
+
+static const char *const k1FullFlaskStringFMTownsJapanese[4] = {
+ "\x83""t""\x83\x89\x83""X""\x83""R""\x82\xCC\x92\x86\x90""g""\x82\xCD\x81""A\r""\x96""A""\x97\xA7\x82\xC2\x90""V""\x91""N""\x82\xC8\x90\x85\x82\xBE\x81""B",
+ "\x83""t""\x83\x89\x83""X""\x83""R""\x82\xCC\x92\x86\x90""g""\x82\xCD\x81""A\r""\x89\x96\x90\x85\x82\xBE\x81""B",
+ "\x83""t""\x83\x89\x83""X""\x83""R""\x82\xCC\x92\x86\x90""g""\x82\xCD\x81""A\r""\x83""~""\x83""l""\x83\x89\x83\x8B\x83""E""\x83""H""\x81""[""\x83""^""\x81""[""\x82\xBE\x81""B",
+ "\x96\x82\x96""@""\x82\xCC\x90\x85\x82\xBE\x81""B"
+};
+
+static const StringListProvider k1FullFlaskStringFMTownsJapaneseProvider = { ARRAYSIZE(k1FullFlaskStringFMTownsJapanese), k1FullFlaskStringFMTownsJapanese };
+
+static const char *const k1OutroHomeStringFMTownsJapanese[1] = {
+ "\x89\xE4\x82\xAA\x89\xC6"
+};
+
+static const StringListProvider k1OutroHomeStringFMTownsJapaneseProvider = { ARRAYSIZE(k1OutroHomeStringFMTownsJapanese), k1OutroHomeStringFMTownsJapanese };
+
+static const char *const k1VeryCleverStringFMTownsJapanese[1] = {
+ "\x82\xE6\x82\xA2\x8E\xE8\x8D\xDB\x82\xBE\x81""I""\x82\xBE\x82\xAA\x82\xA8\x91""O""\x82\xCC\x82\xB3\x82\xB3\x82\xE2\x82\xA9\x82\xC8\x93""w""\x97\xCD\x82\xCD\x96\xB3\x91\xCA\x82\xBE\x81""B"
+};
+
+static const StringListProvider k1VeryCleverStringFMTownsJapaneseProvider = { ARRAYSIZE(k1VeryCleverStringFMTownsJapanese), k1VeryCleverStringFMTownsJapanese };
+
+static const char *const k1GUIStringsFMTownsJapanese[38] = {
+ "\x83""U""\x81""E""\x83\x8C\x83""W""\x83""F""\x83\x93\x83""h""\x81""E""\x83""I""\x83""u""\x81""E""\x83""L""\x83\x89\x83\x93\x83""f""\x83""B""\x83""A",
+ "\x83""Z""\x81""[""\x83""u""\x82\xB5\x82\xBD\x8F\x8A\x82\xA9\x82\xE7\x8E""n""\x82\xDF\x82\xE9",
+ "\x83""Q""\x81""[""\x83\x80\x82\xF0\x83""Z""\x81""[""\x83""u""\x82\xB7\x82\xE9",
+ "\x83""Q""\x81""[""\x83\x80\x82\xCC\x90\xDD\x92\xE8",
+ "\x83""Q""\x81""[""\x83\x80\x8F""I""\x97\xB9",
+ "\x83""Q""\x81""[""\x83\x80\x8D\xC4\x8A""J",
+ "\x83""Q""\x81""[""\x83\x80\x82\xCC\x90\xDD\x92\xE8",
+ "\x82\xC7\x82\xCC\x83""f""\x81""[""\x83""^""\x82\xF0\x83\x8D\x81""[""\x83""h""\x82\xB5\x82\xDC\x82\xB7\x82\xA9\x81""H",
+ "\x83""Z""\x81""[""\x83""u""\x82\xB7\x82\xE9\x88\xCA\x92""u""\x82\xF0\x91""I""\x82\xF1\x82\xC5\x89\xBA\x82\xB3\x82\xA2\x81""F",
+ "\x81""m""\x8B\xF3\x82\xAB\x83""X""\x83\x8D\x83""b""\x83""g""\x81""n",
+ "\x92\x86\x8E""~",
+ "\x83""Z""\x81""[""\x83""u""\x82\xB5\x82\xBD\x83""Q""\x81""[""\x83\x80\x82\xC9\x96\xBC\x91""O""\x82\xF0\x82\xC2\x82\xAF\x82\xC4\x89\xBA\x82\xB3\x82\xA2\x81""F",
+ "\x83""Z""\x81""[""\x83""u",
+ "\x83""u""\x83\x89\x83\x93\x83""h""\x83\x93\x81""A""\x82\xE4\x82\xC1\x82\xAD\x82\xE8\x8B""x""\x82\xDF\x82\xE9\x82\xE6\x81""B",
+ "\x83""Q""\x81""[""\x83\x80\x82\xF0\x8F""I""\x97\xB9\x82\xB5\x82\xC4\x82\xA2\x82\xA2\x82\xC5\x82\xB7\x82\xA9\x81""H",
+ "XXXX",
+ "XXXX",
+ "XXXXXXXX",
+ "XXXXXXXXXX",
+ "\x83\x81\x83""C""\x83\x93\x81""E""\x83\x81\x83""j""\x83\x85\x81""[",
+ "\x83""I""\x83\x93",
+ "\x83""I""\x83\x93"" ""\x81""{""\x82""b""\x82""c",
+ "\x83""I""\x83""t",
+ "\x82\xCD\x82\xA2",
+ "\x82\xA2\x82\xA2\x82\xA6",
+ "\xA0\x8E\x02",
+ "\xAC\x8E\x02",
+ "\xB4\x8E\x02",
+ "\xBC\x8E\x02",
+ "\xC4\x8E\x02",
+ "\xD0\x8E\x02",
+ "\xDC\x8E\x02",
+ "\xE4\x8E\x02",
+ "\xEC\x8E\x02",
+ "\x95\xE0\x81""@""\x8D""s""\x81""@""\x91\xAC\x81""@""\x93""x",
+ "\x83\x81\x83""b""\x83""Z""\x81""[""\x83""W""\x91\xAC\x93""x",
+ "\x89\xB9\x81""@""\x81""@""\x81""@""\x81""@""\x81""@""\x8A""y",
+ "\x8C\xF8\x81""@""\x81""@""\x89\xCA\x81""@""\x81""@""\x89\xB9"
+};
+
+static const StringListProvider k1GUIStringsFMTownsJapaneseProvider = { ARRAYSIZE(k1GUIStringsFMTownsJapanese), k1GUIStringsFMTownsJapanese };
+
+static const char *const k1NewGameStringFMTownsJapanese[1] = {
+ "\x81""m""\x8D\xC5\x8F\x89\x82\xA9\x82\xE7\x83""Q""\x81""[""\x83\x80\x82\xF0\x8E""n""\x82\xDF\x82\xE9\x81""n"
+};
+
+static const StringListProvider k1NewGameStringFMTownsJapaneseProvider = { ARRAYSIZE(k1NewGameStringFMTownsJapanese), k1NewGameStringFMTownsJapanese };
+
+static const char *const k1ConfigStringsFMTownsJapanese[9] = {
+ "\x82\xB2\x82\xAD\x92""x""\x82\xAD",
+ "\x92""x""\x81""@""\x82\xAD",
+ "\x95\x81\x81""@""\x92\xCA",
+ "\x91\xAC\x81""@""\x82\xAD",
+ "\x82\xB2\x82\xAD\x91\xAC\x82\xAD",
+ "\x82\xB2\x82\xAD\x92""x""\x82\xAD",
+ "\x95\x81\x81""@""\x92\xCA",
+ "\x91\xAC\x81""@""\x82\xAD",
+ "\x97""v""\x83""N""\x83\x8A\x83""b""\x83""N"
+};
+
+static const StringListProvider k1ConfigStringsFMTownsJapaneseProvider = { ARRAYSIZE(k1ConfigStringsFMTownsJapanese), k1ConfigStringsFMTownsJapanese };
+
+static const byte k1CreditsStringsFMTownsJapanese[1420] = {
+ 0x0D, 0x02, 0x54, 0x48, 0x45, 0x20, 0x45, 0x4E,
+ 0x44, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D,
+ 0x0D, 0x0D, 0x02, 0x46, 0x61, 0x62, 0x6C, 0x65,
+ 0x73, 0x20, 0x26, 0x20, 0x46, 0x69, 0x65, 0x6E,
+ 0x64, 0x73, 0x0D, 0x02, 0x42, 0x6F, 0x6F, 0x6B,
+ 0x20, 0x49, 0x0D, 0x02, 0x54, 0x48, 0x45, 0x20,
+ 0x4C, 0x45, 0x47, 0x45, 0x4E, 0x44, 0x20, 0x4F,
+ 0x46, 0x20, 0x4B, 0x59, 0x52, 0x41, 0x4E, 0x44,
+ 0x49, 0x41, 0x0D, 0x0D, 0x50, 0x75, 0x62, 0x6C,
+ 0x69, 0x73, 0x68, 0x65, 0x64, 0x20, 0x62, 0x79,
+ 0x0D, 0x02, 0x57, 0x65, 0x73, 0x74, 0x77, 0x6F,
+ 0x6F, 0x64, 0x20, 0x53, 0x74, 0x75, 0x64, 0x69,
+ 0x6F, 0x73, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D,
+ 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D,
+ 0x03, 0x44, 0x69, 0x72, 0x65, 0x63, 0x74, 0x6F,
+ 0x72, 0x3A, 0x05, 0x04, 0x42, 0x72, 0x65, 0x74,
+ 0x74, 0x20, 0x57, 0x2E, 0x20, 0x53, 0x70, 0x65,
+ 0x72, 0x72, 0x79, 0x0D, 0x0D, 0x03, 0x44, 0x65,
+ 0x73, 0x69, 0x67, 0x6E, 0x3A, 0x05, 0x04, 0x4D,
+ 0x69, 0x63, 0x68, 0x61, 0x65, 0x6C, 0x20, 0x4C,
+ 0x65, 0x67, 0x67, 0x0D, 0x04, 0x52, 0x69, 0x63,
+ 0x6B, 0x20, 0x50, 0x61, 0x72, 0x6B, 0x73, 0x0D,
+ 0x04, 0x50, 0x61, 0x75, 0x6C, 0x20, 0x53, 0x2E,
+ 0x20, 0x4D, 0x75, 0x64, 0x72, 0x61, 0x0D, 0x0D,
+ 0x03, 0x4C, 0x65, 0x61, 0x64, 0x20, 0x50, 0x72,
+ 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x6D, 0x65, 0x72,
+ 0x3A, 0x05, 0x04, 0x4D, 0x69, 0x63, 0x68, 0x61,
+ 0x65, 0x6C, 0x20, 0x4C, 0x65, 0x67, 0x67, 0x0D,
+ 0x0D, 0x03, 0x53, 0x63, 0x72, 0x69, 0x70, 0x74,
+ 0x20, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D,
+ 0x6D, 0x65, 0x72, 0x3A, 0x05, 0x04, 0x53, 0x63,
+ 0x6F, 0x74, 0x74, 0x20, 0x42, 0x6F, 0x77, 0x65,
+ 0x6E, 0x0D, 0x0D, 0x03, 0x20, 0x20, 0x41, 0x6D,
+ 0x69, 0x67, 0x61, 0x20, 0x20, 0x50, 0x72, 0x6F,
+ 0x67, 0x72, 0x61, 0x6D, 0x6D, 0x65, 0x72, 0x3A,
+ 0x05, 0x04, 0x42, 0x69, 0x6C, 0x6C, 0x20, 0x53,
+ 0x74, 0x6F, 0x6B, 0x65, 0x73, 0x0D, 0x0D, 0x03,
+ 0x20, 0x20, 0x50, 0x43, 0x2D, 0x39, 0x38, 0x20,
+ 0x20, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D,
+ 0x6D, 0x65, 0x72, 0x3A, 0x05, 0x04, 0x59, 0x75,
+ 0x6B, 0x69, 0x6F, 0x20, 0x53, 0x65, 0x6B, 0x69,
+ 0x67, 0x75, 0x63, 0x68, 0x69, 0x0D, 0x0D, 0x03,
+ 0x46, 0x4D, 0x2D, 0x54, 0x4F, 0x57, 0x4E, 0x53,
+ 0x20, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D,
+ 0x6D, 0x65, 0x72, 0x3A, 0x05, 0x04, 0x54, 0x61,
+ 0x69, 0x73, 0x65, 0x69, 0x20, 0x4E, 0x6F, 0x6D,
+ 0x75, 0x72, 0x61, 0x0D, 0x03, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x05, 0x04, 0x4F, 0x68, 0x73, 0x68, 0x75,
+ 0x6E, 0x20, 0x4C, 0x65, 0x65, 0x0D, 0x0D, 0x03,
+ 0x49, 0x6E, 0x74, 0x72, 0x6F, 0x20, 0x26, 0x20,
+ 0x46, 0x69, 0x6E, 0x61, 0x6C, 0x65, 0x3A, 0x05,
+ 0x04, 0x43, 0x68, 0x72, 0x69, 0x73, 0x74, 0x6F,
+ 0x70, 0x68, 0x65, 0x72, 0x20, 0x59, 0x61, 0x74,
+ 0x65, 0x73, 0x0D, 0x0D, 0x03, 0x41, 0x72, 0x74,
+ 0x20, 0x26, 0x20, 0x47, 0x72, 0x61, 0x70, 0x68,
+ 0x69, 0x63, 0x73, 0x3A, 0x05, 0x04, 0x52, 0x69,
+ 0x63, 0x6B, 0x20, 0x50, 0x61, 0x72, 0x6B, 0x73,
+ 0x0D, 0x04, 0x52, 0x65, 0x6E, 0x20, 0x4F, 0x6C,
+ 0x73, 0x65, 0x6E, 0x0D, 0x04, 0x4C, 0x6F, 0x75,
+ 0x69, 0x73, 0x65, 0x20, 0x53, 0x61, 0x6E, 0x64,
+ 0x6F, 0x76, 0x61, 0x6C, 0x0D, 0x04, 0x4A, 0x6F,
+ 0x73, 0x65, 0x70, 0x68, 0x20, 0x48, 0x65, 0x77,
+ 0x69, 0x74, 0x74, 0x20, 0x49, 0x56, 0x0D, 0x04,
+ 0x4A, 0x75, 0x64, 0x69, 0x74, 0x68, 0x20, 0x50,
+ 0x65, 0x74, 0x65, 0x72, 0x73, 0x6F, 0x6E, 0x0D,
+ 0x04, 0x41, 0x61, 0x72, 0x6F, 0x6E, 0x20, 0x50,
+ 0x6F, 0x77, 0x65, 0x6C, 0x6C, 0x0D, 0x04, 0x45,
+ 0x6C, 0x69, 0x65, 0x20, 0x41, 0x72, 0x61, 0x62,
+ 0x69, 0x61, 0x6E, 0x0D, 0x04, 0x45, 0x72, 0x69,
+ 0x63, 0x20, 0x53, 0x68, 0x75, 0x6C, 0x74, 0x73,
+ 0x0D, 0x0D, 0x03, 0x41, 0x75, 0x64, 0x69, 0x6F,
+ 0x20, 0x44, 0x69, 0x72, 0x65, 0x63, 0x74, 0x6F,
+ 0x72, 0x3A, 0x05, 0x04, 0x50, 0x61, 0x75, 0x6C,
+ 0x20, 0x53, 0x2E, 0x20, 0x4D, 0x75, 0x64, 0x72,
+ 0x61, 0x0D, 0x0D, 0x03, 0x4D, 0x75, 0x73, 0x69,
+ 0x63, 0x3A, 0x05, 0x04, 0x46, 0x72, 0x61, 0x6E,
+ 0x6B, 0x20, 0x4B, 0x6C, 0x65, 0x70, 0x61, 0x63,
+ 0x6B, 0x69, 0x0D, 0x03, 0x28, 0x39, 0x38, 0x20,
+ 0x26, 0x20, 0x54, 0x4F, 0x57, 0x4E, 0x53, 0x29,
+ 0x05, 0x04, 0x54, 0x61, 0x6B, 0x65, 0x73, 0x68,
+ 0x69, 0x20, 0x41, 0x62, 0x6F, 0x0D, 0x0D, 0x03,
+ 0x53, 0x6F, 0x75, 0x6E, 0x64, 0x20, 0x45, 0x66,
+ 0x66, 0x65, 0x63, 0x74, 0x73, 0x3A, 0x05, 0x04,
+ 0x44, 0x77, 0x69, 0x67, 0x68, 0x74, 0x20, 0x4F,
+ 0x6B, 0x61, 0x68, 0x61, 0x72, 0x61, 0x0D, 0x03,
+ 0x28, 0x50, 0x43, 0x2D, 0x39, 0x38, 0x29, 0x05,
+ 0x04, 0x54, 0x61, 0x6B, 0x65, 0x73, 0x68, 0x69,
+ 0x20, 0x41, 0x62, 0x6F, 0x0D, 0x0D, 0x03, 0x57,
+ 0x72, 0x69, 0x74, 0x65, 0x72, 0x3A, 0x05, 0x04,
+ 0x22, 0x43, 0x6F, 0x63, 0x6F, 0x22, 0x0D, 0x0D,
+ 0x03, 0x54, 0x72, 0x61, 0x6E, 0x73, 0x6C, 0x61,
+ 0x74, 0x6F, 0x72, 0x28, 0x4A, 0x61, 0x70, 0x61,
+ 0x6E, 0x65, 0x73, 0x65, 0x29, 0x3A, 0x05, 0x04,
+ 0x4D, 0x69, 0x6E, 0x6F, 0x72, 0x75, 0x20, 0x4E,
+ 0x61, 0x6B, 0x61, 0x7A, 0x61, 0x77, 0x61, 0x0D,
+ 0x04, 0x59, 0x75, 0x72, 0x69, 0x20, 0x49, 0x74,
+ 0x6F, 0x0D, 0x0D, 0x03, 0x51, 0x75, 0x61, 0x6C,
+ 0x69, 0x74, 0x79, 0x20, 0x41, 0x73, 0x73, 0x75,
+ 0x72, 0x61, 0x6E, 0x63, 0x65, 0x3A, 0x05, 0x04,
+ 0x47, 0x6C, 0x65, 0x6E, 0x6E, 0x20, 0x53, 0x70,
+ 0x65, 0x72, 0x72, 0x79, 0x0D, 0x04, 0x4D, 0x61,
+ 0x74, 0x74, 0x20, 0x43, 0x6F, 0x6C, 0x6C, 0x69,
+ 0x6E, 0x73, 0x0D, 0x04, 0x42, 0x69, 0x6C, 0x6C,
+ 0x20, 0x46, 0x6F, 0x73, 0x74, 0x65, 0x72, 0x0D,
+ 0x04, 0x4D, 0x69, 0x63, 0x68, 0x61, 0x65, 0x6C,
+ 0x20, 0x4C, 0x69, 0x67, 0x68, 0x74, 0x6E, 0x65,
+ 0x72, 0x0D, 0x04, 0x4D, 0x69, 0x63, 0x68, 0x61,
+ 0x65, 0x6C, 0x20, 0x47, 0x61, 0x74, 0x65, 0x72,
+ 0x0D, 0x04, 0x45, 0x75, 0x67, 0x65, 0x6E, 0x65,
+ 0x20, 0x4D, 0x61, 0x72, 0x74, 0x69, 0x6E, 0x0D,
+ 0x04, 0x4D, 0x69, 0x63, 0x68, 0x61, 0x65, 0x6C,
+ 0x20, 0x47, 0x6C, 0x6F, 0x73, 0x65, 0x63, 0x6B,
+ 0x69, 0x0D, 0x04, 0x4A, 0x75, 0x73, 0x74, 0x69,
+ 0x6E, 0x20, 0x4E, 0x6F, 0x72, 0x72, 0x0D, 0x04,
+ 0x54, 0x6F, 0x70, 0x20, 0x53, 0x74, 0x61, 0x72,
+ 0x20, 0x54, 0x65, 0x73, 0x74, 0x69, 0x6E, 0x67,
+ 0x0D, 0x04, 0x54, 0x65, 0x73, 0x74, 0x69, 0x6E,
+ 0x67, 0x20, 0x31, 0x2C, 0x32, 0x2C, 0x33, 0x0D,
+ 0x0D, 0x0D, 0x0D, 0x0D, 0x53, 0x70, 0x65, 0x63,
+ 0x69, 0x61, 0x6C, 0x20, 0x54, 0x68, 0x61, 0x6E,
+ 0x6B, 0x73, 0x20, 0x74, 0x6F, 0x0D, 0x4C, 0x79,
+ 0x6C, 0x65, 0x20, 0x4A, 0x2E, 0x20, 0x48, 0x61,
+ 0x6C, 0x6C, 0x0D, 0x44, 0x61, 0x76, 0x69, 0x64,
+ 0x20, 0x42, 0x69, 0x73, 0x68, 0x6F, 0x70, 0x0D,
+ 0x22, 0x54, 0x68, 0x65, 0x20, 0x44, 0x6F, 0x63,
+ 0x22, 0x0D, 0x61, 0x6E, 0x64, 0x0D, 0x46, 0x69,
+ 0x72, 0x65, 0x62, 0x65, 0x72, 0x72, 0x79, 0x20,
+ 0x47, 0x72, 0x65, 0x65, 0x6E, 0x0D, 0x0D, 0x0D,
+ 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D,
+ 0x0D, 0x0D, 0x0D, 0x02, 0x43, 0x41, 0x53, 0x54,
+ 0x20, 0x4F, 0x46, 0x20, 0x43, 0x48, 0x41, 0x52,
+ 0x41, 0x43, 0x54, 0x45, 0x52, 0x53, 0x0D, 0x0D,
+ 0x4D, 0x61, 0x6C, 0x63, 0x6F, 0x6C, 0x6D, 0x20,
+ 0x74, 0x68, 0x65, 0x20, 0x4A, 0x65, 0x73, 0x74,
+ 0x65, 0x72, 0x0D, 0x42, 0x72, 0x61, 0x6E, 0x64,
+ 0x6F, 0x6E, 0x20, 0x74, 0x68, 0x65, 0x20, 0x42,
+ 0x6F, 0x6C, 0x64, 0x0D, 0x42, 0x72, 0x61, 0x6E,
+ 0x64, 0x79, 0x77, 0x69, 0x6E, 0x65, 0x20, 0x61,
+ 0x6E, 0x64, 0x20, 0x44, 0x61, 0x72, 0x6D, 0x0D,
+ 0x50, 0x72, 0x69, 0x65, 0x73, 0x74, 0x65, 0x73,
+ 0x73, 0x20, 0x42, 0x72, 0x79, 0x6E, 0x6E, 0x0D,
+ 0x5A, 0x61, 0x6E, 0x74, 0x68, 0x69, 0x61, 0x2C,
+ 0x20, 0x4C, 0x61, 0x64, 0x79, 0x20, 0x6F, 0x66,
+ 0x20, 0x41, 0x6C, 0x63, 0x68, 0x65, 0x6D, 0x79,
+ 0x0D, 0x48, 0x65, 0x72, 0x6D, 0x61, 0x6E, 0x20,
+ 0x74, 0x68, 0x65, 0x20, 0x48, 0x61, 0x6E, 0x64,
+ 0x79, 0x6D, 0x61, 0x6E, 0x0D, 0x0D, 0x0D, 0x0D,
+ 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x01,
+ 0x41, 0x6E, 0x79, 0x20, 0x63, 0x68, 0x61, 0x72,
+ 0x61, 0x63, 0x74, 0x65, 0x72, 0x73, 0x20, 0x69,
+ 0x6E, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x67,
+ 0x61, 0x6D, 0x65, 0x20, 0x77, 0x68, 0x6F, 0x20,
+ 0x62, 0x65, 0x61, 0x72, 0x0D, 0x01, 0x72, 0x65,
+ 0x73, 0x65, 0x6D, 0x62, 0x6C, 0x61, 0x6E, 0x63,
+ 0x65, 0x20, 0x74, 0x6F, 0x20, 0x70, 0x65, 0x72,
+ 0x73, 0x6F, 0x6E, 0x73, 0x20, 0x6C, 0x69, 0x76,
+ 0x69, 0x6E, 0x67, 0x20, 0x6F, 0x72, 0x0D, 0x01,
+ 0x64, 0x65, 0x61, 0x64, 0x20, 0x61, 0x72, 0x65,
+ 0x20, 0x70, 0x75, 0x72, 0x65, 0x6C, 0x79, 0x20,
+ 0x63, 0x6F, 0x69, 0x6E, 0x63, 0x69, 0x64, 0x65,
+ 0x6E, 0x74, 0x61, 0x6C, 0x2E, 0x0D, 0x0D, 0x0D,
+ 0x01, 0x43, 0x6F, 0x70, 0x79, 0x72, 0x69, 0x67,
+ 0x68, 0x74, 0x20, 0x28, 0x43, 0x29, 0x20, 0x31,
+ 0x39, 0x39, 0x32, 0x2C, 0x20, 0x57, 0x65, 0x73,
+ 0x74, 0x77, 0x6F, 0x6F, 0x64, 0x20, 0x53, 0x74,
+ 0x75, 0x64, 0x69, 0x6F, 0x73, 0x2C, 0x20, 0x49,
+ 0x6E, 0x63, 0x2E, 0x0D, 0x01, 0x43, 0x6F, 0x70,
+ 0x79, 0x72, 0x69, 0x67, 0x68, 0x74, 0x20, 0x28,
+ 0x43, 0x29, 0x20, 0x31, 0x39, 0x39, 0x33, 0x2C,
+ 0x20, 0x53, 0x74, 0x61, 0x72, 0x20, 0x43, 0x72,
+ 0x61, 0x66, 0x74, 0x2C, 0x20, 0x49, 0x6E, 0x63,
+ 0x2E, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0D,
+ 0x01, 0x41, 0x6C, 0x6C, 0x20, 0x72, 0x69, 0x67,
+ 0x68, 0x74, 0x73, 0x20, 0x72, 0x65, 0x73, 0x65,
+ 0x72, 0x76, 0x65, 0x64, 0x2E, 0x0D, 0x0D, 0x0D,
+ 0x0D, 0x0D, 0x0D, 0x00
+};
+
+static const ByteProvider k1CreditsStringsFMTownsJapaneseProvider = { ARRAYSIZE(k1CreditsStringsFMTownsJapanese), k1CreditsStringsFMTownsJapanese };
+
diff --git a/devtools/create_kyradat/resources/lok_pc98.h b/devtools/create_kyradat/resources/lok_pc98.h
new file mode 100644
index 0000000000..fc628f0e3c
--- /dev/null
+++ b/devtools/create_kyradat/resources/lok_pc98.h
@@ -0,0 +1,2000 @@
+static const byte k1KallakWritingSeqPC98[2035] = {
+ 0x00, 0x00, 0x01, 0x0E, 0x1A, 0x1B, 0x17, 0x00,
+ 0x00, 0x00, 0x3F, 0x01, 0xC7, 0x0C, 0x00, 0x0C,
+ 0x00, 0x19, 0x04, 0x02, 0x00, 0x00, 0x00, 0x00,
+ 0x10, 0x05, 0x00, 0x95, 0x00, 0x20, 0x09, 0x14,
+ 0x0F, 0x2E, 0x02, 0x00, 0x01, 0x00, 0x00, 0x10,
+ 0x05, 0x01, 0x94, 0x00, 0x1B, 0x07, 0x06, 0x00,
+ 0x18, 0x1D, 0x02, 0x00, 0x02, 0x00, 0x00, 0x10,
+ 0x05, 0x02, 0x93, 0x00, 0x14, 0x07, 0x06, 0x00,
+ 0x02, 0x00, 0x03, 0x00, 0x00, 0x10, 0x05, 0x01,
+ 0x90, 0x00, 0x1B, 0x07, 0x06, 0x00, 0x02, 0x00,
+ 0x04, 0x00, 0x00, 0x10, 0x05, 0x00, 0x8D, 0x00,
+ 0x20, 0x07, 0x06, 0x00, 0x18, 0x1D, 0x02, 0x00,
+ 0x05, 0x00, 0x00, 0x10, 0x05, 0x01, 0x8A, 0x00,
+ 0x1B, 0x07, 0x06, 0x00, 0x02, 0x00, 0x06, 0x00,
+ 0x00, 0x10, 0x05, 0x02, 0x88, 0x00, 0x14, 0x07,
+ 0x06, 0x00, 0x18, 0x1D, 0x02, 0x00, 0x07, 0x00,
+ 0x00, 0x10, 0x05, 0x01, 0x85, 0x00, 0x1B, 0x07,
+ 0x06, 0x00, 0x02, 0x00, 0x08, 0x00, 0x00, 0x10,
+ 0x05, 0x00, 0x82, 0x00, 0x20, 0x07, 0x06, 0x00,
+ 0x02, 0x00, 0x09, 0x00, 0x00, 0x10, 0x05, 0x01,
+ 0x7F, 0x00, 0x1B, 0x07, 0x06, 0x00, 0x02, 0x00,
+ 0x0A, 0x00, 0x00, 0x10, 0x05, 0x02, 0x7C, 0x00,
+ 0x14, 0x07, 0x06, 0x00, 0x18, 0x1D, 0x02, 0x00,
+ 0x0B, 0x00, 0x00, 0x10, 0x05, 0x01, 0x79, 0x00,
+ 0x1B, 0x07, 0x06, 0x00, 0x02, 0x00, 0x0C, 0x00,
+ 0x00, 0x10, 0x05, 0x00, 0x76, 0x00, 0x20, 0x07,
+ 0x06, 0x00, 0x02, 0x00, 0x0D, 0x00, 0x00, 0x10,
+ 0x05, 0x01, 0x73, 0x00, 0x1B, 0x07, 0x06, 0x00,
+ 0x18, 0x1D, 0x02, 0x00, 0x0E, 0x00, 0x00, 0x10,
+ 0x05, 0x02, 0x70, 0x00, 0x14, 0x07, 0x06, 0x00,
+ 0x02, 0x00, 0x0F, 0x00, 0x00, 0x10, 0x05, 0x01,
+ 0x6D, 0x00, 0x1B, 0x07, 0x06, 0x00, 0x02, 0x00,
+ 0x10, 0x00, 0x00, 0x10, 0x05, 0x00, 0x6A, 0x00,
+ 0x20, 0x07, 0x06, 0x00, 0x02, 0x00, 0x11, 0x00,
+ 0x00, 0x10, 0x05, 0x01, 0x67, 0x00, 0x1B, 0x07,
+ 0x06, 0x00, 0x18, 0x1D, 0x02, 0x00, 0x12, 0x00,
+ 0x00, 0x10, 0x05, 0x02, 0x65, 0x00, 0x14, 0x07,
+ 0x06, 0x00, 0x02, 0x00, 0x13, 0x00, 0x00, 0x10,
+ 0x05, 0x01, 0x63, 0x00, 0x1B, 0x07, 0x06, 0x00,
+ 0x02, 0x00, 0x14, 0x00, 0x00, 0x10, 0x05, 0x00,
+ 0x63, 0x00, 0x20, 0x07, 0x06, 0x00, 0x02, 0x00,
+ 0x15, 0x00, 0x00, 0x10, 0x05, 0x00, 0x65, 0x00,
+ 0x1F, 0x07, 0x06, 0x00, 0x02, 0x00, 0x16, 0x00,
+ 0x00, 0x10, 0x05, 0x00, 0x6A, 0x00, 0x1D, 0x07,
+ 0x06, 0x00, 0x02, 0x00, 0x17, 0x00, 0x00, 0x10,
+ 0x05, 0x00, 0x70, 0x00, 0x19, 0x07, 0x06, 0x00,
+ 0x02, 0x00, 0x18, 0x00, 0x00, 0x10, 0x05, 0x00,
+ 0x76, 0x00, 0x17, 0x07, 0x06, 0x00, 0x02, 0x00,
+ 0x19, 0x00, 0x00, 0x10, 0x05, 0x00, 0x7C, 0x00,
+ 0x16, 0x07, 0x06, 0x00, 0x02, 0x00, 0x1A, 0x00,
+ 0x00, 0x10, 0x05, 0x00, 0x82, 0x00, 0x17, 0x07,
+ 0x06, 0x00, 0x02, 0x00, 0x1B, 0x00, 0x00, 0x10,
+ 0x05, 0x00, 0x88, 0x00, 0x19, 0x07, 0x06, 0x00,
+ 0x02, 0x00, 0x1C, 0x00, 0x00, 0x10, 0x05, 0x00,
+ 0x8D, 0x00, 0x1D, 0x07, 0x06, 0x00, 0x02, 0x00,
+ 0x1D, 0x00, 0x00, 0x10, 0x05, 0x00, 0x93, 0x00,
+ 0x1F, 0x07, 0x06, 0x00, 0x1C, 0x1B, 0x0F, 0x2F,
+ 0x02, 0x00, 0x01, 0x00, 0x00, 0x10, 0x05, 0x01,
+ 0x94, 0x00, 0x1B, 0x07, 0x06, 0x00, 0x02, 0x00,
+ 0x01, 0x00, 0x00, 0x10, 0x05, 0x01, 0x94, 0x00,
+ 0x1B, 0x07, 0x06, 0x00, 0x18, 0x1D, 0x02, 0x00,
+ 0x02, 0x00, 0x00, 0x10, 0x05, 0x02, 0x93, 0x00,
+ 0x14, 0x07, 0x06, 0x00, 0x02, 0x00, 0x02, 0x00,
+ 0x00, 0x10, 0x05, 0x02, 0x93, 0x00, 0x14, 0x07,
+ 0x06, 0x00, 0x02, 0x00, 0x03, 0x00, 0x00, 0x10,
+ 0x05, 0x01, 0x90, 0x00, 0x1B, 0x07, 0x06, 0x00,
+ 0x02, 0x00, 0x04, 0x00, 0x00, 0x10, 0x05, 0x00,
+ 0x8D, 0x00, 0x20, 0x07, 0x06, 0x00, 0x18, 0x1D,
+ 0x02, 0x00, 0x05, 0x00, 0x00, 0x10, 0x05, 0x01,
+ 0x8A, 0x00, 0x1B, 0x07, 0x06, 0x00, 0x02, 0x00,
+ 0x05, 0x00, 0x00, 0x10, 0x05, 0x01, 0x8A, 0x00,
+ 0x1B, 0x07, 0x06, 0x00, 0x02, 0x00, 0x06, 0x00,
+ 0x00, 0x10, 0x05, 0x02, 0x88, 0x00, 0x14, 0x07,
+ 0x06, 0x00, 0x18, 0x1D, 0x02, 0x00, 0x07, 0x00,
+ 0x00, 0x10, 0x05, 0x01, 0x85, 0x00, 0x1B, 0x07,
+ 0x06, 0x00, 0x02, 0x00, 0x08, 0x00, 0x00, 0x10,
+ 0x05, 0x00, 0x82, 0x00, 0x20, 0x07, 0x06, 0x00,
+ 0x02, 0x00, 0x09, 0x00, 0x00, 0x10, 0x05, 0x01,
+ 0x7F, 0x00, 0x1B, 0x07, 0x06, 0x00, 0x02, 0x00,
+ 0x0A, 0x00, 0x00, 0x10, 0x05, 0x02, 0x7C, 0x00,
+ 0x14, 0x07, 0x06, 0x00, 0x18, 0x1D, 0x02, 0x00,
+ 0x0B, 0x00, 0x00, 0x10, 0x05, 0x01, 0x79, 0x00,
+ 0x1B, 0x07, 0x06, 0x00, 0x02, 0x00, 0x0C, 0x00,
+ 0x00, 0x10, 0x05, 0x00, 0x76, 0x00, 0x20, 0x07,
+ 0x06, 0x00, 0x02, 0x00, 0x0D, 0x00, 0x00, 0x10,
+ 0x05, 0x01, 0x73, 0x00, 0x1B, 0x07, 0x06, 0x00,
+ 0x18, 0x1D, 0x02, 0x00, 0x0E, 0x00, 0x00, 0x10,
+ 0x05, 0x02, 0x70, 0x00, 0x14, 0x07, 0x06, 0x00,
+ 0x02, 0x00, 0x0F, 0x00, 0x00, 0x10, 0x05, 0x01,
+ 0x6D, 0x00, 0x1B, 0x07, 0x06, 0x00, 0x02, 0x00,
+ 0x10, 0x00, 0x00, 0x10, 0x05, 0x00, 0x6A, 0x00,
+ 0x20, 0x07, 0x06, 0x00, 0x02, 0x00, 0x11, 0x00,
+ 0x00, 0x10, 0x05, 0x01, 0x67, 0x00, 0x1B, 0x07,
+ 0x06, 0x00, 0x18, 0x1D, 0x02, 0x00, 0x12, 0x00,
+ 0x00, 0x10, 0x05, 0x02, 0x65, 0x00, 0x14, 0x07,
+ 0x06, 0x00, 0x02, 0x00, 0x13, 0x00, 0x00, 0x10,
+ 0x05, 0x01, 0x63, 0x00, 0x1B, 0x07, 0x06, 0x00,
+ 0x02, 0x00, 0x14, 0x00, 0x00, 0x10, 0x05, 0x00,
+ 0x63, 0x00, 0x20, 0x07, 0x06, 0x00, 0x02, 0x00,
+ 0x15, 0x00, 0x00, 0x10, 0x05, 0x00, 0x65, 0x00,
+ 0x1F, 0x07, 0x06, 0x00, 0x02, 0x00, 0x16, 0x00,
+ 0x00, 0x10, 0x05, 0x00, 0x6A, 0x00, 0x1D, 0x07,
+ 0x06, 0x00, 0x02, 0x00, 0x17, 0x00, 0x00, 0x10,
+ 0x05, 0x00, 0x70, 0x00, 0x19, 0x07, 0x06, 0x00,
+ 0x02, 0x00, 0x18, 0x00, 0x00, 0x10, 0x05, 0x00,
+ 0x76, 0x00, 0x17, 0x07, 0x06, 0x00, 0x02, 0x00,
+ 0x19, 0x00, 0x00, 0x10, 0x05, 0x00, 0x7C, 0x00,
+ 0x16, 0x07, 0x06, 0x00, 0x02, 0x00, 0x1A, 0x00,
+ 0x00, 0x10, 0x05, 0x00, 0x82, 0x00, 0x17, 0x07,
+ 0x06, 0x00, 0x02, 0x00, 0x1B, 0x00, 0x00, 0x10,
+ 0x05, 0x00, 0x88, 0x00, 0x19, 0x07, 0x06, 0x00,
+ 0x02, 0x00, 0x1C, 0x00, 0x00, 0x10, 0x05, 0x00,
+ 0x8D, 0x00, 0x1D, 0x07, 0x06, 0x00, 0x02, 0x00,
+ 0x1D, 0x00, 0x00, 0x10, 0x05, 0x00, 0x93, 0x00,
+ 0x1F, 0x07, 0x06, 0x00, 0x1C, 0x1B, 0x0F, 0x30,
+ 0x02, 0x00, 0x01, 0x00, 0x00, 0x10, 0x05, 0x01,
+ 0x94, 0x00, 0x1B, 0x07, 0x06, 0x00, 0x02, 0x00,
+ 0x01, 0x00, 0x00, 0x10, 0x05, 0x01, 0x94, 0x00,
+ 0x1B, 0x07, 0x06, 0x00, 0x18, 0x1D, 0x02, 0x00,
+ 0x02, 0x00, 0x00, 0x10, 0x05, 0x02, 0x93, 0x00,
+ 0x14, 0x07, 0x06, 0x00, 0x02, 0x00, 0x02, 0x00,
+ 0x00, 0x10, 0x05, 0x02, 0x93, 0x00, 0x14, 0x07,
+ 0x06, 0x00, 0x02, 0x00, 0x02, 0x00, 0x00, 0x10,
+ 0x05, 0x02, 0x93, 0x00, 0x14, 0x07, 0x06, 0x00,
+ 0x02, 0x00, 0x03, 0x00, 0x00, 0x10, 0x05, 0x01,
+ 0x90, 0x00, 0x1B, 0x07, 0x06, 0x00, 0x02, 0x00,
+ 0x03, 0x00, 0x00, 0x10, 0x05, 0x01, 0x90, 0x00,
+ 0x1B, 0x07, 0x06, 0x00, 0x02, 0x00, 0x04, 0x00,
+ 0x00, 0x10, 0x05, 0x00, 0x8D, 0x00, 0x20, 0x07,
+ 0x06, 0x00, 0x18, 0x1D, 0x02, 0x00, 0x05, 0x00,
+ 0x00, 0x10, 0x05, 0x01, 0x8A, 0x00, 0x1B, 0x07,
+ 0x06, 0x00, 0x02, 0x00, 0x06, 0x00, 0x00, 0x10,
+ 0x05, 0x02, 0x88, 0x00, 0x14, 0x07, 0x06, 0x00,
+ 0x18, 0x1D, 0x02, 0x00, 0x07, 0x00, 0x00, 0x10,
+ 0x05, 0x01, 0x85, 0x00, 0x1B, 0x07, 0x06, 0x00,
+ 0x02, 0x00, 0x08, 0x00, 0x00, 0x10, 0x05, 0x00,
+ 0x82, 0x00, 0x20, 0x07, 0x06, 0x00, 0x02, 0x00,
+ 0x09, 0x00, 0x00, 0x10, 0x05, 0x01, 0x7F, 0x00,
+ 0x1B, 0x07, 0x06, 0x00, 0x02, 0x00, 0x0A, 0x00,
+ 0x00, 0x10, 0x05, 0x02, 0x7C, 0x00, 0x14, 0x07,
+ 0x06, 0x00, 0x18, 0x1D, 0x02, 0x00, 0x0B, 0x00,
+ 0x00, 0x10, 0x05, 0x01, 0x79, 0x00, 0x1B, 0x07,
+ 0x06, 0x00, 0x02, 0x00, 0x0C, 0x00, 0x00, 0x10,
+ 0x05, 0x00, 0x76, 0x00, 0x20, 0x07, 0x06, 0x00,
+ 0x02, 0x00, 0x0D, 0x00, 0x00, 0x10, 0x05, 0x01,
+ 0x73, 0x00, 0x1B, 0x07, 0x06, 0x00, 0x18, 0x1D,
+ 0x02, 0x00, 0x0E, 0x00, 0x00, 0x10, 0x05, 0x02,
+ 0x70, 0x00, 0x14, 0x07, 0x06, 0x00, 0x02, 0x00,
+ 0x0F, 0x00, 0x00, 0x10, 0x05, 0x01, 0x6D, 0x00,
+ 0x1B, 0x07, 0x06, 0x00, 0x02, 0x00, 0x10, 0x00,
+ 0x00, 0x10, 0x05, 0x00, 0x6A, 0x00, 0x20, 0x07,
+ 0x06, 0x00, 0x02, 0x00, 0x11, 0x00, 0x00, 0x10,
+ 0x05, 0x01, 0x67, 0x00, 0x1B, 0x07, 0x06, 0x00,
+ 0x18, 0x1D, 0x02, 0x00, 0x12, 0x00, 0x00, 0x10,
+ 0x05, 0x02, 0x65, 0x00, 0x14, 0x07, 0x06, 0x00,
+ 0x02, 0x00, 0x13, 0x00, 0x00, 0x10, 0x05, 0x01,
+ 0x63, 0x00, 0x1B, 0x07, 0x06, 0x00, 0x02, 0x00,
+ 0x14, 0x00, 0x00, 0x10, 0x05, 0x00, 0x63, 0x00,
+ 0x20, 0x07, 0x06, 0x00, 0x02, 0x00, 0x15, 0x00,
+ 0x00, 0x10, 0x05, 0x00, 0x65, 0x00, 0x1F, 0x07,
+ 0x06, 0x00, 0x02, 0x00, 0x16, 0x00, 0x00, 0x10,
+ 0x05, 0x00, 0x6A, 0x00, 0x1D, 0x07, 0x06, 0x00,
+ 0x02, 0x00, 0x17, 0x00, 0x00, 0x10, 0x05, 0x00,
+ 0x70, 0x00, 0x19, 0x07, 0x06, 0x00, 0x02, 0x00,
+ 0x18, 0x00, 0x00, 0x10, 0x05, 0x00, 0x76, 0x00,
+ 0x17, 0x07, 0x06, 0x00, 0x02, 0x00, 0x19, 0x00,
+ 0x00, 0x10, 0x05, 0x00, 0x7C, 0x00, 0x16, 0x07,
+ 0x06, 0x00, 0x02, 0x00, 0x1A, 0x00, 0x00, 0x10,
+ 0x05, 0x00, 0x82, 0x00, 0x17, 0x07, 0x06, 0x00,
+ 0x02, 0x00, 0x1B, 0x00, 0x00, 0x10, 0x05, 0x00,
+ 0x88, 0x00, 0x19, 0x07, 0x06, 0x00, 0x02, 0x00,
+ 0x1C, 0x00, 0x00, 0x10, 0x05, 0x00, 0x8D, 0x00,
+ 0x1D, 0x07, 0x06, 0x00, 0x02, 0x00, 0x1D, 0x00,
+ 0x00, 0x10, 0x05, 0x00, 0x93, 0x00, 0x1F, 0x07,
+ 0x06, 0x00, 0x1C, 0x06, 0x3C, 0x00, 0x1B, 0x0F,
+ 0x31, 0x02, 0x00, 0x00, 0x00, 0x00, 0x10, 0x05,
+ 0x00, 0x95, 0x00, 0x20, 0x07, 0x06, 0x00, 0x02,
+ 0x00, 0x00, 0x00, 0x00, 0x10, 0x05, 0x00, 0x95,
+ 0x00, 0x20, 0x07, 0x06, 0x00, 0x18, 0x1D, 0x02,
+ 0x00, 0x01, 0x00, 0x00, 0x10, 0x05, 0x01, 0x94,
+ 0x00, 0x1B, 0x07, 0x06, 0x00, 0x02, 0x00, 0x01,
+ 0x00, 0x00, 0x10, 0x05, 0x01, 0x94, 0x00, 0x1B,
+ 0x07, 0x06, 0x00, 0x02, 0x00, 0x02, 0x00, 0x00,
+ 0x10, 0x05, 0x02, 0x93, 0x00, 0x14, 0x07, 0x06,
+ 0x00, 0x02, 0x00, 0x02, 0x00, 0x00, 0x10, 0x05,
+ 0x02, 0x93, 0x00, 0x14, 0x07, 0x06, 0x00, 0x18,
+ 0x1D, 0x02, 0x00, 0x03, 0x00, 0x00, 0x10, 0x05,
+ 0x01, 0x90, 0x00, 0x1B, 0x07, 0x06, 0x00, 0x02,
+ 0x00, 0x04, 0x00, 0x00, 0x10, 0x05, 0x00, 0x8D,
+ 0x00, 0x20, 0x07, 0x06, 0x00, 0x02, 0x00, 0x05,
+ 0x00, 0x00, 0x10, 0x05, 0x01, 0x8A, 0x00, 0x1B,
+ 0x07, 0x06, 0x00, 0x18, 0x1D, 0x02, 0x00, 0x06,
+ 0x00, 0x00, 0x10, 0x05, 0x02, 0x88, 0x00, 0x14,
+ 0x07, 0x06, 0x00, 0x02, 0x00, 0x07, 0x00, 0x00,
+ 0x10, 0x05, 0x01, 0x85, 0x00, 0x1B, 0x07, 0x06,
+ 0x00, 0x18, 0x1D, 0x02, 0x00, 0x08, 0x00, 0x00,
+ 0x10, 0x05, 0x00, 0x82, 0x00, 0x20, 0x07, 0x06,
+ 0x00, 0x02, 0x00, 0x09, 0x00, 0x00, 0x10, 0x05,
+ 0x01, 0x7F, 0x00, 0x1B, 0x07, 0x06, 0x00, 0x02,
+ 0x00, 0x0A, 0x00, 0x00, 0x10, 0x05, 0x02, 0x7C,
+ 0x00, 0x14, 0x07, 0x06, 0x00, 0x18, 0x1D, 0x02,
+ 0x00, 0x0B, 0x00, 0x00, 0x10, 0x05, 0x01, 0x79,
+ 0x00, 0x1B, 0x07, 0x06, 0x00, 0x02, 0x00, 0x0C,
+ 0x00, 0x00, 0x10, 0x05, 0x00, 0x76, 0x00, 0x20,
+ 0x07, 0x06, 0x00, 0x18, 0x1D, 0x02, 0x00, 0x0D,
+ 0x00, 0x00, 0x10, 0x05, 0x01, 0x73, 0x00, 0x1B,
+ 0x07, 0x06, 0x00, 0x02, 0x00, 0x0E, 0x00, 0x00,
+ 0x10, 0x05, 0x02, 0x70, 0x00, 0x14, 0x07, 0x06,
+ 0x00, 0x02, 0x00, 0x0F, 0x00, 0x00, 0x10, 0x05,
+ 0x01, 0x6D, 0x00, 0x1B, 0x07, 0x06, 0x00, 0x18,
+ 0x1D, 0x02, 0x00, 0x10, 0x00, 0x00, 0x10, 0x05,
+ 0x00, 0x6A, 0x00, 0x20, 0x07, 0x06, 0x00, 0x02,
+ 0x00, 0x11, 0x00, 0x00, 0x10, 0x05, 0x01, 0x67,
+ 0x00, 0x1B, 0x07, 0x06, 0x00, 0x18, 0x1D, 0x02,
+ 0x00, 0x12, 0x00, 0x00, 0x10, 0x05, 0x02, 0x65,
+ 0x00, 0x14, 0x07, 0x06, 0x00, 0x06, 0x3C, 0x00,
+ 0x02, 0x00, 0x1E, 0x00, 0x00, 0x10, 0x08, 0x12,
+ 0x06, 0x1E, 0x00, 0x0A, 0x01, 0x02, 0x00, 0x1F,
+ 0x00, 0x00, 0x10, 0x07, 0x0A, 0x00, 0x02, 0x00,
+ 0x20, 0x00, 0x00, 0x10, 0x07, 0x0A, 0x00, 0x02,
+ 0x00, 0x21, 0x00, 0x00, 0x10, 0x07, 0x0A, 0x00,
+ 0x02, 0x00, 0x22, 0x00, 0x00, 0x10, 0x07, 0x0A,
+ 0x00, 0x0B, 0x01, 0x02, 0x00, 0x18, 0x1F, 0x06,
+ 0x0A, 0x00, 0x02, 0x00, 0x23, 0x00, 0x00, 0x10,
+ 0x07, 0x14, 0x00, 0x18, 0x1E, 0x02, 0x00, 0x24,
+ 0x00, 0x00, 0x10, 0x07, 0x14, 0x00, 0x02, 0x00,
+ 0x25, 0x00, 0x00, 0x10, 0x07, 0x14, 0x00, 0x18,
+ 0x1F, 0x02, 0x00, 0x26, 0x00, 0x00, 0x10, 0x07,
+ 0x14, 0x00, 0x02, 0x00, 0x27, 0x00, 0x00, 0x10,
+ 0x07, 0x14, 0x00, 0x18, 0x1E, 0x02, 0x00, 0x28,
+ 0x00, 0x00, 0x10, 0x08, 0x06, 0x3C, 0x00, 0x18,
+ 0x1E, 0x03, 0x00, 0x07, 0x06, 0x00, 0x18, 0x1E,
+ 0x03, 0x00, 0x07, 0x06, 0x00, 0x03, 0x00, 0x07,
+ 0x06, 0x00, 0x03, 0x00, 0x07, 0x06, 0x00, 0x03,
+ 0x00, 0x07, 0x06, 0x00, 0x03, 0x00, 0x07, 0x06,
+ 0x00, 0x03, 0x00, 0x07, 0x06, 0x00, 0x18, 0x1E,
+ 0x03, 0x00, 0x07, 0x06, 0x00, 0x03, 0x00, 0x07,
+ 0x06, 0x00, 0x03, 0x00, 0x07, 0x06, 0x00, 0x03,
+ 0x00, 0x07, 0x06, 0x00, 0x03, 0x00, 0x07, 0x06,
+ 0x00, 0x03, 0x00, 0x07, 0x06, 0x00, 0x03, 0x00,
+ 0x07, 0x06, 0x00, 0x03, 0x00, 0x07, 0x06, 0x00,
+ 0x03, 0x00, 0x07, 0x06, 0x00, 0x18, 0x1E, 0x03,
+ 0x00, 0x07, 0x06, 0x00, 0x03, 0x00, 0x07, 0x06,
+ 0x00, 0x03, 0x00, 0x07, 0x06, 0x00, 0x03, 0x00,
+ 0x07, 0x06, 0x00, 0x03, 0x00, 0x07, 0x06, 0x00,
+ 0x03, 0x00, 0x07, 0x06, 0x00, 0x03, 0x00, 0x07,
+ 0x06, 0x00, 0x03, 0x00, 0x07, 0x06, 0x00, 0x18,
+ 0x1E, 0x03, 0x00, 0x07, 0x06, 0x00, 0x03, 0x00,
+ 0x07, 0x06, 0x00, 0x03, 0x00, 0x07, 0x06, 0x00,
+ 0x03, 0x00, 0x07, 0x06, 0x00, 0x03, 0x00, 0x07,
+ 0x06, 0x00, 0x03, 0x00, 0x07, 0x06, 0x00, 0x03,
+ 0x00, 0x07, 0x06, 0x00, 0x03, 0x00, 0x07, 0x06,
+ 0x00, 0x03, 0x00, 0x07, 0x06, 0x00, 0x03, 0x00,
+ 0x07, 0x06, 0x00, 0x13, 0x1C, 0x19, 0x01, 0x13,
+ 0x01, 0x00, 0x1D
+};
+
+static const ByteProvider k1KallakWritingSeqPC98Provider = { ARRAYSIZE(k1KallakWritingSeqPC98), k1KallakWritingSeqPC98 };
+
+static const byte k1MalcolmTreeSeqPC98[535] = {
+ 0x00, 0x01, 0x00, 0x1A, 0x0E, 0x17, 0x00, 0x00,
+ 0x00, 0x3F, 0x01, 0xC7, 0x0C, 0x00, 0x0C, 0x01,
+ 0x0D, 0x01, 0x09, 0x02, 0x01, 0x00, 0x00, 0x00,
+ 0x10, 0x19, 0x03, 0x09, 0x18, 0x1E, 0x14, 0x18,
+ 0x1F, 0x0A, 0x00, 0x03, 0x01, 0x06, 0x06, 0x00,
+ 0x0B, 0x00, 0x1F, 0x00, 0x18, 0x19, 0x0A, 0x01,
+ 0x03, 0x01, 0x06, 0x06, 0x00, 0x0B, 0x01, 0x0F,
+ 0x00, 0x18, 0x26, 0x10, 0x1F, 0x50, 0x00, 0x2D,
+ 0x05, 0x0A, 0x02, 0x03, 0x01, 0x06, 0x06, 0x00,
+ 0x0B, 0x02, 0x10, 0x00, 0x11, 0x18, 0x1F, 0x03,
+ 0x01, 0x06, 0x06, 0x00, 0x03, 0x01, 0x06, 0x06,
+ 0x00, 0x03, 0x01, 0x06, 0x06, 0x00, 0x18, 0x24,
+ 0x18, 0x1F, 0x03, 0x01, 0x06, 0x06, 0x00, 0x18,
+ 0x1E, 0x0A, 0x03, 0x03, 0x01, 0x06, 0x06, 0x00,
+ 0x0B, 0x03, 0x15, 0x00, 0x10, 0x16, 0x50, 0x00,
+ 0x2D, 0x05, 0x18, 0x1F, 0x03, 0x01, 0x06, 0x06,
+ 0x00, 0x03, 0x01, 0x06, 0x06, 0x00, 0x18, 0x1E,
+ 0x03, 0x01, 0x06, 0x06, 0x00, 0x03, 0x01, 0x06,
+ 0x06, 0x00, 0x18, 0x1F, 0x03, 0x01, 0x06, 0x06,
+ 0x00, 0x03, 0x01, 0x06, 0x06, 0x00, 0x03, 0x01,
+ 0x06, 0x06, 0x00, 0x03, 0x01, 0x06, 0x06, 0x00,
+ 0x18, 0x1E, 0x03, 0x01, 0x06, 0x06, 0x00, 0x18,
+ 0x1A, 0x18, 0x1E, 0x0A, 0x05, 0x03, 0x01, 0x06,
+ 0x06, 0x00, 0x0B, 0x05, 0x09, 0x00, 0x11, 0x0A,
+ 0x06, 0x03, 0x01, 0x06, 0x06, 0x00, 0x0B, 0x06,
+ 0x14, 0x00, 0x18, 0x1A, 0x18, 0x1F, 0x10, 0x17,
+ 0x50, 0x00, 0x2D, 0x05, 0x06, 0x3C, 0x00, 0x0A,
+ 0x07, 0x03, 0x01, 0x06, 0x06, 0x00, 0x0B, 0x07,
+ 0x06, 0x00, 0x18, 0x1E, 0x06, 0x1E, 0x00, 0x10,
+ 0x18, 0x50, 0x00, 0x2D, 0x05, 0x03, 0x01, 0x06,
+ 0x06, 0x00, 0x03, 0x01, 0x06, 0x06, 0x00, 0x03,
+ 0x01, 0x06, 0x06, 0x00, 0x0A, 0x08, 0x04, 0x01,
+ 0x06, 0x06, 0x00, 0x04, 0x01, 0x06, 0x06, 0x00,
+ 0x03, 0x01, 0x06, 0x06, 0x00, 0x03, 0x01, 0x06,
+ 0x06, 0x00, 0x0B, 0x08, 0x01, 0x00, 0x03, 0x01,
+ 0x06, 0x06, 0x00, 0x06, 0x78, 0x00, 0x0A, 0x09,
+ 0x03, 0x01, 0x06, 0x06, 0x00, 0x0B, 0x09, 0x04,
+ 0x00, 0x18, 0x1B, 0x0A, 0x0A, 0x03, 0x01, 0x06,
+ 0x06, 0x00, 0x0B, 0x0A, 0x09, 0x00, 0x06, 0x14,
+ 0x00, 0x10, 0x19, 0x50, 0x00, 0x2D, 0x05, 0x03,
+ 0x01, 0x06, 0x06, 0x00, 0x03, 0x01, 0x06, 0x06,
+ 0x00, 0x0A, 0x0B, 0x03, 0x01, 0x06, 0x06, 0x00,
+ 0x04, 0x01, 0x06, 0x06, 0x00, 0x04, 0x01, 0x06,
+ 0x06, 0x00, 0x03, 0x01, 0x06, 0x06, 0x00, 0x03,
+ 0x01, 0x06, 0x06, 0x00, 0x0B, 0x0B, 0x01, 0x00,
+ 0x03, 0x01, 0x06, 0x06, 0x00, 0x03, 0x01, 0x06,
+ 0x06, 0x00, 0x03, 0x01, 0x06, 0x06, 0x00, 0x10,
+ 0x1A, 0x50, 0x00, 0x2D, 0x05, 0x0A, 0x0C, 0x03,
+ 0x01, 0x06, 0x06, 0x00, 0x0B, 0x0C, 0x12, 0x00,
+ 0x03, 0x01, 0x01, 0x01, 0x11, 0x15, 0x00, 0x02,
+ 0x00, 0x02, 0x00, 0x02, 0x02, 0x00, 0x00, 0x00,
+ 0x10, 0x10, 0x1C, 0x50, 0x00, 0x2D, 0x05, 0x06,
+ 0x3C, 0x00, 0x03, 0x02, 0x03, 0x02, 0x06, 0x06,
+ 0x00, 0x11, 0x18, 0x1C, 0x0A, 0x0F, 0x03, 0x02,
+ 0x06, 0x06, 0x00, 0x0B, 0x0F, 0x0D, 0x00, 0x10,
+ 0x1D, 0x50, 0x00, 0x2D, 0x05, 0x0A, 0x10, 0x03,
+ 0x02, 0x06, 0x06, 0x00, 0x03, 0x02, 0x06, 0x06,
+ 0x00, 0x03, 0x02, 0x06, 0x06, 0x00, 0x04, 0x02,
+ 0x06, 0x06, 0x00, 0x04, 0x02, 0x06, 0x06, 0x00,
+ 0x04, 0x02, 0x06, 0x06, 0x00, 0x0B, 0x10, 0x02,
+ 0x00, 0x10, 0x1E, 0x50, 0x00, 0x2D, 0x05, 0x0A,
+ 0x11, 0x03, 0x02, 0x06, 0x06, 0x00, 0x03, 0x02,
+ 0x06, 0x06, 0x00, 0x03, 0x02, 0x06, 0x06, 0x00,
+ 0x04, 0x02, 0x06, 0x06, 0x00, 0x04, 0x02, 0x06,
+ 0x06, 0x00, 0x04, 0x02, 0x06, 0x06, 0x00, 0x0B,
+ 0x11, 0x02, 0x00, 0x06, 0xB4, 0x00, 0x13, 0x19,
+ 0x01, 0x13, 0x01, 0x01, 0x01, 0x02, 0x1D
+};
+
+static const ByteProvider k1MalcolmTreeSeqPC98Provider = { ARRAYSIZE(k1MalcolmTreeSeqPC98), k1MalcolmTreeSeqPC98 };
+
+static const byte k1WestwoodLogoSeqPC98[75] = {
+ 0x00, 0x03, 0x01, 0x1A, 0x02, 0x03, 0x00, 0x00,
+ 0x00, 0x00, 0x16, 0x01, 0x06, 0x06, 0x00, 0x06,
+ 0x3C, 0x00, 0x18, 0x14, 0x0A, 0x00, 0x03, 0x03,
+ 0x16, 0x01, 0x0B, 0x00, 0x08, 0x00, 0x06, 0x3C,
+ 0x00, 0x18, 0x27, 0x0A, 0x01, 0x03, 0x03, 0x16,
+ 0x01, 0x0B, 0x01, 0x0B, 0x00, 0x06, 0x78, 0x00,
+ 0x18, 0x14, 0x02, 0x03, 0x0A, 0x00, 0x00, 0x00,
+ 0x16, 0x01, 0x06, 0x06, 0x00, 0x0A, 0x02, 0x04,
+ 0x03, 0x16, 0x01, 0x0B, 0x02, 0x09, 0x00, 0x13,
+ 0x01, 0x03, 0x1D
+};
+
+static const ByteProvider k1WestwoodLogoSeqPC98Provider = { ARRAYSIZE(k1WestwoodLogoSeqPC98), k1WestwoodLogoSeqPC98 };
+
+static const byte k1KyrandiaLogoSeqPC98[92] = {
+ 0x15, 0x00, 0x02, 0x00, 0x06, 0x01, 0x1A, 0x02,
+ 0x06, 0x00, 0x00, 0x00, 0x00, 0x16, 0x00, 0x06,
+ 0x06, 0x00, 0x18, 0x14, 0x16, 0x04, 0x0A, 0x00,
+ 0x03, 0x06, 0x16, 0x00, 0x0B, 0x00, 0x0B, 0x00,
+ 0x06, 0x3C, 0x00, 0x18, 0x27, 0x0A, 0x01, 0x03,
+ 0x06, 0x16, 0x00, 0x0B, 0x01, 0x0F, 0x00, 0x06,
+ 0x3C, 0x00, 0x18, 0x27, 0x0A, 0x02, 0x04, 0x06,
+ 0x16, 0x00, 0x0B, 0x02, 0x0F, 0x00, 0x02, 0x06,
+ 0x0D, 0x00, 0x00, 0x00, 0x16, 0x00, 0x06, 0x06,
+ 0x00, 0x06, 0x78, 0x00, 0x18, 0x14, 0x0A, 0x02,
+ 0x04, 0x06, 0x16, 0x00, 0x0B, 0x02, 0x0C, 0x00,
+ 0x13, 0x01, 0x06, 0x1D
+};
+
+static const ByteProvider k1KyrandiaLogoSeqPC98Provider = { ARRAYSIZE(k1KyrandiaLogoSeqPC98), k1KyrandiaLogoSeqPC98 };
+
+static const byte k1KallakMalcolmSeqPC98[620] = {
+ 0x00, 0x04, 0x01, 0x1A, 0x0E, 0x17, 0x00, 0x00,
+ 0x00, 0x3F, 0x01, 0xC7, 0x0C, 0x00, 0x0C, 0x03,
+ 0x0D, 0x00, 0x17, 0x00, 0x00, 0x88, 0x3F, 0x01,
+ 0xC7, 0x0C, 0x02, 0x19, 0x00, 0x02, 0x04, 0x00,
+ 0x10, 0x00, 0x3A, 0x09, 0x19, 0x00, 0x19, 0x05,
+ 0x14, 0x18, 0x23, 0x0A, 0x00, 0x03, 0x04, 0x07,
+ 0x07, 0x00, 0x0B, 0x00, 0x22, 0x00, 0x10, 0x02,
+ 0x50, 0x00, 0x3A, 0x05, 0x0A, 0x01, 0x03, 0x04,
+ 0x07, 0x07, 0x00, 0x0B, 0x01, 0x07, 0x00, 0x06,
+ 0x3C, 0x00, 0x10, 0x03, 0x50, 0x00, 0x3A, 0x05,
+ 0x0A, 0x02, 0x03, 0x04, 0x07, 0x07, 0x00, 0x0B,
+ 0x02, 0x17, 0x00, 0x06, 0x3C, 0x00, 0x10, 0x04,
+ 0x50, 0x00, 0x3A, 0x05, 0x0A, 0x03, 0x03, 0x04,
+ 0x07, 0x07, 0x00, 0x0B, 0x03, 0x0A, 0x00, 0x06,
+ 0x3C, 0x00, 0x03, 0x04, 0x07, 0x07, 0x00, 0x03,
+ 0x04, 0x07, 0x07, 0x00, 0x03, 0x04, 0x07, 0x07,
+ 0x00, 0x10, 0x05, 0xF0, 0x00, 0x3A, 0x0F, 0x03,
+ 0x04, 0x07, 0x07, 0x00, 0x03, 0x04, 0x07, 0x07,
+ 0x00, 0x03, 0x04, 0x07, 0x07, 0x00, 0x03, 0x04,
+ 0x07, 0x07, 0x00, 0x06, 0x3C, 0x00, 0x10, 0x06,
+ 0xF0, 0x00, 0x3A, 0x0F, 0x0A, 0x04, 0x03, 0x04,
+ 0x07, 0x07, 0x00, 0x0B, 0x04, 0x12, 0x00, 0x06,
+ 0x3C, 0x00, 0x03, 0x04, 0x07, 0x07, 0x00, 0x03,
+ 0x04, 0x07, 0x07, 0x00, 0x03, 0x04, 0x07, 0x07,
+ 0x00, 0x03, 0x04, 0x07, 0x07, 0x00, 0x06, 0x78,
+ 0x00, 0x10, 0x07, 0xF0, 0x00, 0x3A, 0x0F, 0x0A,
+ 0x05, 0x03, 0x04, 0x07, 0x07, 0x00, 0x0B, 0x05,
+ 0x11, 0x00, 0x06, 0x3C, 0x00, 0x03, 0x04, 0x07,
+ 0x07, 0x00, 0x03, 0x04, 0x07, 0x07, 0x00, 0x10,
+ 0x08, 0x50, 0x00, 0x3A, 0x05, 0x0A, 0x06, 0x03,
+ 0x04, 0x07, 0x07, 0x00, 0x0B, 0x06, 0x07, 0x00,
+ 0x06, 0x3C, 0x00, 0x03, 0x04, 0x07, 0x07, 0x00,
+ 0x03, 0x04, 0x07, 0x07, 0x00, 0x03, 0x04, 0x07,
+ 0x07, 0x00, 0x10, 0x09, 0x50, 0x00, 0x3A, 0x05,
+ 0x0A, 0x07, 0x03, 0x04, 0x07, 0x07, 0x00, 0x0B,
+ 0x07, 0x0A, 0x00, 0x06, 0x3C, 0x00, 0x03, 0x04,
+ 0x07, 0x07, 0x00, 0x10, 0x0A, 0x50, 0x00, 0x3A,
+ 0x05, 0x0A, 0x08, 0x03, 0x04, 0x07, 0x07, 0x00,
+ 0x0B, 0x08, 0x10, 0x00, 0x06, 0x3C, 0x00, 0x03,
+ 0x04, 0x07, 0x07, 0x00, 0x10, 0x0B, 0xF0, 0x00,
+ 0x3A, 0x0F, 0x03, 0x04, 0x07, 0x07, 0x00, 0x03,
+ 0x04, 0x07, 0x07, 0x00, 0x03, 0x04, 0x07, 0x07,
+ 0x00, 0x03, 0x04, 0x07, 0x07, 0x00, 0x03, 0x04,
+ 0x07, 0x07, 0x00, 0x03, 0x04, 0x07, 0x07, 0x00,
+ 0x03, 0x04, 0x07, 0x07, 0x00, 0x03, 0x04, 0x07,
+ 0x07, 0x00, 0x06, 0x3C, 0x00, 0x03, 0x04, 0x07,
+ 0x07, 0x00, 0x10, 0x0C, 0xF0, 0x00, 0x3A, 0x0F,
+ 0x0A, 0x09, 0x03, 0x04, 0x07, 0x07, 0x00, 0x0B,
+ 0x09, 0x0E, 0x00, 0x06, 0x3C, 0x00, 0x03, 0x04,
+ 0x07, 0x07, 0x00, 0x03, 0x04, 0x07, 0x07, 0x00,
+ 0x03, 0x04, 0x07, 0x07, 0x00, 0x03, 0x04, 0x07,
+ 0x07, 0x00, 0x03, 0x04, 0x07, 0x07, 0x00, 0x03,
+ 0x04, 0x07, 0x07, 0x00, 0x10, 0x0D, 0x50, 0x00,
+ 0x3A, 0x05, 0x0A, 0x0A, 0x03, 0x04, 0x07, 0x07,
+ 0x00, 0x0B, 0x0A, 0x0E, 0x00, 0x06, 0x3C, 0x00,
+ 0x0A, 0x0B, 0x03, 0x04, 0x07, 0x07, 0x00, 0x0B,
+ 0x0B, 0x02, 0x00, 0x18, 0x20, 0x0A, 0x0C, 0x03,
+ 0x04, 0x07, 0x07, 0x00, 0x0B, 0x0C, 0x06, 0x00,
+ 0x18, 0x21, 0x0A, 0x0D, 0x03, 0x04, 0x07, 0x07,
+ 0x00, 0x0B, 0x0D, 0x0C, 0x00, 0x18, 0x22, 0x0A,
+ 0x0E, 0x03, 0x04, 0x07, 0x07, 0x00, 0x0B, 0x0E,
+ 0x0B, 0x00, 0x10, 0x0E, 0x50, 0x00, 0x3A, 0x05,
+ 0x0A, 0x0F, 0x03, 0x04, 0x07, 0x07, 0x00, 0x0B,
+ 0x0F, 0x09, 0x00, 0x06, 0x3C, 0x00, 0x03, 0x04,
+ 0x07, 0x07, 0x00, 0x10, 0x0F, 0x50, 0x00, 0x3A,
+ 0x05, 0x0A, 0x10, 0x03, 0x04, 0x07, 0x07, 0x00,
+ 0x0B, 0x10, 0x09, 0x00, 0x06, 0x3C, 0x00, 0x03,
+ 0x04, 0x07, 0x07, 0x00, 0x10, 0x10, 0x50, 0x00,
+ 0x3A, 0x05, 0x0A, 0x11, 0x03, 0x04, 0x07, 0x07,
+ 0x00, 0x0B, 0x11, 0x0F, 0x00, 0x06, 0x3C, 0x00,
+ 0x03, 0x04, 0x07, 0x07, 0x00, 0x10, 0x11, 0x50,
+ 0x00, 0x3A, 0x05, 0x0A, 0x12, 0x03, 0x04, 0x07,
+ 0x07, 0x00, 0x0B, 0x12, 0x14, 0x00, 0x06, 0x3C,
+ 0x00, 0x0A, 0x13, 0x03, 0x04, 0x07, 0x07, 0x00,
+ 0x0B, 0x13, 0x06, 0x00, 0x18, 0x23, 0x0A, 0x13,
+ 0x03, 0x04, 0x07, 0x07, 0x00, 0x0B, 0x13, 0x07,
+ 0x00, 0x11, 0x06, 0x3C, 0x00, 0x13, 0x19, 0x01,
+ 0x13, 0x01, 0x04, 0x1D
+};
+
+static const ByteProvider k1KallakMalcolmSeqPC98Provider = { ARRAYSIZE(k1KallakMalcolmSeqPC98), k1KallakMalcolmSeqPC98 };
+
+static const byte k1ForestSeqPC98[406] = {
+ 0x00, 0x05, 0x01, 0x00, 0x07, 0x01, 0x1A, 0x02,
+ 0x07, 0x00, 0x00, 0x00, 0x08, 0x02, 0x05, 0x00,
+ 0x98, 0x00, 0x38, 0x0A, 0x00, 0x03, 0x07, 0x16,
+ 0x02, 0x06, 0x09, 0x00, 0x0B, 0x00, 0x41, 0x00,
+ 0x18, 0x16, 0x03, 0x07, 0x02, 0x05, 0x01, 0x98,
+ 0x00, 0x38, 0x16, 0x02, 0x16, 0x03, 0x06, 0x09,
+ 0x00, 0x03, 0x07, 0x02, 0x05, 0x03, 0x98, 0x00,
+ 0x38, 0x16, 0x02, 0x16, 0x03, 0x06, 0x09, 0x00,
+ 0x03, 0x07, 0x02, 0x05, 0x01, 0x98, 0x00, 0x38,
+ 0x16, 0x02, 0x16, 0x03, 0x06, 0x09, 0x00, 0x03,
+ 0x07, 0x02, 0x05, 0x00, 0x98, 0x00, 0x38, 0x16,
+ 0x02, 0x16, 0x03, 0x06, 0x09, 0x00, 0x0A, 0x05,
+ 0x03, 0x07, 0x16, 0x02, 0x06, 0x09, 0x00, 0x0B,
+ 0x05, 0x0E, 0x00, 0x18, 0x16, 0x03, 0x07, 0x02,
+ 0x05, 0x01, 0x98, 0x00, 0x38, 0x16, 0x02, 0x16,
+ 0x03, 0x06, 0x09, 0x00, 0x03, 0x07, 0x02, 0x05,
+ 0x03, 0x98, 0x00, 0x38, 0x16, 0x02, 0x16, 0x03,
+ 0x06, 0x09, 0x00, 0x03, 0x07, 0x02, 0x05, 0x01,
+ 0x98, 0x00, 0x38, 0x16, 0x02, 0x16, 0x03, 0x06,
+ 0x09, 0x00, 0x03, 0x07, 0x02, 0x05, 0x04, 0x98,
+ 0x00, 0x38, 0x16, 0x02, 0x16, 0x03, 0x06, 0x09,
+ 0x00, 0x03, 0x07, 0x16, 0x02, 0x06, 0x09, 0x00,
+ 0x03, 0x07, 0x16, 0x02, 0x06, 0x09, 0x00, 0x03,
+ 0x07, 0x02, 0x05, 0x05, 0x98, 0x00, 0x38, 0x16,
+ 0x02, 0x16, 0x03, 0x06, 0x09, 0x00, 0x03, 0x07,
+ 0x16, 0x02, 0x06, 0x09, 0x00, 0x03, 0x07, 0x16,
+ 0x02, 0x06, 0x09, 0x00, 0x03, 0x07, 0x02, 0x05,
+ 0x06, 0x98, 0x00, 0x38, 0x16, 0x02, 0x16, 0x03,
+ 0x06, 0x09, 0x00, 0x03, 0x07, 0x16, 0x02, 0x06,
+ 0x09, 0x00, 0x03, 0x07, 0x16, 0x02, 0x06, 0x09,
+ 0x00, 0x18, 0x25, 0x0A, 0x00, 0x03, 0x07, 0x03,
+ 0x05, 0x16, 0x02, 0x16, 0x03, 0x06, 0x09, 0x00,
+ 0x0B, 0x00, 0x09, 0x00, 0x0A, 0x06, 0x03, 0x07,
+ 0x16, 0x02, 0x06, 0x09, 0x00, 0x0B, 0x06, 0x0E,
+ 0x00, 0x18, 0x17, 0x0A, 0x01, 0x03, 0x07, 0x03,
+ 0x05, 0x16, 0x02, 0x16, 0x03, 0x06, 0x09, 0x00,
+ 0x0B, 0x01, 0x0D, 0x00, 0x18, 0x25, 0x0A, 0x07,
+ 0x03, 0x07, 0x16, 0x02, 0x06, 0x09, 0x00, 0x0B,
+ 0x07, 0x0E, 0x00, 0x18, 0x18, 0x03, 0x07, 0x03,
+ 0x05, 0x16, 0x02, 0x16, 0x03, 0x06, 0x09, 0x00,
+ 0x03, 0x07, 0x03, 0x05, 0x16, 0x02, 0x16, 0x03,
+ 0x06, 0x09, 0x00, 0x03, 0x07, 0x03, 0x05, 0x16,
+ 0x02, 0x16, 0x03, 0x06, 0x09, 0x00, 0x03, 0x07,
+ 0x03, 0x05, 0x16, 0x02, 0x16, 0x03, 0x06, 0x09,
+ 0x00, 0x03, 0x07, 0x03, 0x05, 0x16, 0x02, 0x16,
+ 0x03, 0x06, 0x09, 0x00, 0x06, 0x12, 0x00, 0x18,
+ 0x25, 0x0A, 0x02, 0x03, 0x07, 0x03, 0x05, 0x16,
+ 0x02, 0x16, 0x03, 0x06, 0x09, 0x00, 0x0B, 0x02,
+ 0x07, 0x00, 0x0A, 0x03, 0x03, 0x07, 0x16, 0x02,
+ 0x06, 0x09, 0x00, 0x0B, 0x03, 0x0F, 0x00, 0x13,
+ 0x13, 0x01, 0x07, 0x01, 0x05, 0x1D
+};
+
+static const ByteProvider k1ForestSeqPC98Provider = { ARRAYSIZE(k1ForestSeqPC98), k1ForestSeqPC98 };
+
+static const char *const k1IntroCPSStringsPC98[2] = {
+ "gemcut.cps",
+ "tree.cps"
+};
+
+static const StringListProvider k1IntroCPSStringsPC98Provider = { ARRAYSIZE(k1IntroCPSStringsPC98), k1IntroCPSStringsPC98 };
+
+static const char *const k1IntroCOLStringsPC98[4] = {
+ "kallak.col",
+ "tree_exp.col",
+ "ww.col",
+ "mal-kal.col"
+};
+
+static const StringListProvider k1IntroCOLStringsPC98Provider = { ARRAYSIZE(k1IntroCOLStringsPC98), k1IntroCOLStringsPC98 };
+
+static const char *const k1IntroWSAStringsPC98[11] = {
+ "kallak.wsa",
+ "tree1.wsa",
+ "tree2.wsa",
+ "westwood.wsa",
+ "mal-kal.wsa",
+ "destruct.wsa",
+ "kyrandia.wsa",
+ "shore.wsa",
+ "reunion.wsa",
+ "reuniont.wsa",
+ "latern.wsa"
+};
+
+static const StringListProvider k1IntroWSAStringsPC98Provider = { ARRAYSIZE(k1IntroWSAStringsPC98), k1IntroWSAStringsPC98 };
+
+static const Room k1RoomListPC98[246] = {
+ { 30, 0xFFFF, 0xFFFF, 0x0001, 0xFFFF },
+ { 71, 0xFFFF, 0xFFFF, 0x0005, 0xFFFF },
+ { 44, 0xFFFF, 0x0003, 0xFFFF, 0xFFFF },
+ { 72, 0xFFFF, 0xFFFF, 0x000E, 0xFFFF },
+ { 48, 0xFFFF, 0x0005, 0xFFFF, 0x000E },
+ { 74, 0xFFFF, 0x000A, 0xFFFF, 0x0004 },
+ { 46, 0xFFFF, 0x000F, 0xFFFF, 0x000B },
+ { 75, 0xFFFF, 0x0009, 0xFFFF, 0x0018 },
+ { 13, 0xFFFF, 0x000C, 0xFFFF, 0x000A },
+ { 5, 0x000D, 0xFFFF, 0xFFFF, 0x0007 },
+ { 84, 0xFFFF, 0x0008, 0xFFFF, 0x0005 },
+ { 37, 0xFFFF, 0x0006, 0x000C, 0x0010 },
+ { 51, 0x000B, 0xFFFF, 0x000D, 0x0008 },
+ { 23, 0x000C, 0xFFFF, 0x0009, 0xFFFF },
+ { 25, 0x0003, 0x0004, 0xFFFF, 0xFFFF },
+ { 11, 0xFFFF, 0xFFFF, 0xFFFF, 0x0006 },
+ { 86, 0xFFFF, 0x000B, 0xFFFF, 0xFFFF },
+ { 84, 0xFFFF, 0x0022, 0x0017, 0x0016 },
+ { 51, 0x0020, 0x0014, 0x0024, 0x0015 },
+ { 85, 0x0014, 0x0019, 0xFFFF, 0x0024 },
+ { 33, 0x001C, 0xFFFF, 0x0013, 0x0012 },
+ { 31, 0x0022, 0x0012, 0xFFFF, 0x0017 },
+ { 25, 0x001F, 0x0011, 0xFFFF, 0xFFFF },
+ { 25, 0x0011, 0x0015, 0xFFFF, 0xFFFF },
+ { 2, 0xFFFF, 0x0007, 0xFFFF, 0x001A },
+ { 82, 0xFFFF, 0x006D, 0xFFFF, 0x0013 },
+ { 77, 0xFFFF, 0x0018, 0x0021, 0xFFFF },
+ { 15, 0xFFFF, 0x001A, 0xFFFF, 0xFFFF },
+ { 16, 0xFFFF, 0xFFFF, 0x0014, 0x0020 },
+ { 19, 0xFFFF, 0x0021, 0xFFFF, 0x001F },
+ { 12, 0xFFFF, 0xFFFF, 0x0020, 0x0021 },
+ { 7, 0x0023, 0x001D, 0x0016, 0xFFFF },
+ { 20, 0x001E, 0x001C, 0x0012, 0x0022 },
+ { 17, 0x001A, 0x001E, 0x0022, 0x001D },
+ { 22, 0x0021, 0x0020, 0x0015, 0x0011 },
+ { 24, 0xFFFF, 0xFFFF, 0x001F, 0xFFFF },
+ { 32, 0x0012, 0x0013, 0xFFFF, 0xFFFF },
+ { 87, 0xFFFF, 0x0026, 0xFFFF, 0xFFFF },
+ { 8, 0xFFFF, 0x0027, 0xFFFF, 0x0025 },
+ { 88, 0xFFFF, 0x0035, 0x0037, 0x0026 },
+ { 35, 0xFFFF, 0x0036, 0x0038, 0xFFFF },
+ { 47, 0xFFFF, 0xFFFF, 0x003B, 0xFFFF },
+ { 28, 0x0035, 0x002B, 0x002F, 0x0037 },
+ { 36, 0xFFFF, 0x002C, 0xFFFF, 0x002A },
+ { 78, 0xFFFF, 0xFFFF, 0xFFFF, 0x002B },
+ { 10, 0xFFFF, 0xFFFF, 0xFFFF, 0x002C },
+ { 51, 0x0037, 0x002F, 0x0040, 0x003C },
+ { 38, 0x002A, 0x003D, 0x0041, 0x002E },
+ { 81, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF },
+ { 41, 0xFFFF, 0xFFFF, 0x0069, 0xFFFF },
+ { 50, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF },
+ { 18, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF },
+ { 49, 0xFFFF, 0xFFFF, 0x0054, 0xFFFF },
+ { 105, 0xFFFF, 0xFFFF, 0x002A, 0x0027 },
+ { 105, 0xFFFF, 0xFFFF, 0x0039, 0x0028 },
+ { 37, 0x0027, 0x002A, 0x002E, 0x0049 },
+ { 34, 0x0028, 0x0039, 0xFFFF, 0xFFFF },
+ { 51, 0x0036, 0x003A, 0xFFFF, 0x0038 },
+ { 84, 0xFFFF, 0x003B, 0xFFFF, 0x0039 },
+ { 1, 0x0029, 0xFFFF, 0x003E, 0x003A },
+ { 37, 0x0049, 0x002E, 0x003F, 0xFFFF },
+ { 33, 0xFFFF, 0xFFFF, 0xFFFF, 0x002F },
+ { 34, 0x003B, 0x003F, 0xFFFF, 0xFFFF },
+ { 85, 0x003C, 0x0040, 0xFFFF, 0x003E },
+ { 106, 0x002E, 0x0041, 0xFFFF, 0x003F },
+ { 33, 0x002F, 0xFFFF, 0xFFFF, 0x0040 },
+ { 60, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF },
+ { 3, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF },
+ { 11, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF },
+ { 33, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF },
+ { 26, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF },
+ { 0, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF },
+ { 25, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF },
+ { 23, 0xFFFF, 0x0037, 0x003C, 0xFFFF },
+ { 6, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF },
+ { 51, 0x0063, 0x0067, 0x006B, 0x0066 },
+ { 66, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF },
+ { 67, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF },
+ { 62, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF },
+ { 65, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF },
+ { 18, 0x0056, 0x005A, 0x005E, 0xFFFF },
+ { 6, 0xFFFF, 0x0052, 0x0056, 0xFFFF },
+ { 4, 0xFFFF, 0x0053, 0x0057, 0x0051 },
+ { 3, 0xFFFF, 0x0054, 0xFFFF, 0x0052 },
+ { 37, 0x0034, 0x0055, 0x0058, 0x0053 },
+ { 11, 0xFFFF, 0xFFFF, 0x0059, 0x0054 },
+ { 37, 0x0051, 0x0057, 0x0050, 0xFFFF },
+ { 51, 0x0052, 0xFFFF, 0x005A, 0x0056 },
+ { 51, 0x0054, 0x0059, 0x005C, 0xFFFF },
+ { 1, 0x0055, 0xFFFF, 0x005D, 0x0058 },
+ { 106, 0x0057, 0x005B, 0xFFFF, 0x0050 },
+ { 85, 0xFFFF, 0x005C, 0xFFFF, 0x005A },
+ { 37, 0x0058, 0x005D, 0x005F, 0x005B },
+ { 33, 0x0059, 0xFFFF, 0xFFFF, 0x005C },
+ { 51, 0x0050, 0xFFFF, 0x0061, 0xFFFF },
+ { 51, 0x005C, 0xFFFF, 0x0064, 0xFFFF },
+ { 37, 0xFFFF, 0x0061, 0x0065, 0xFFFF },
+ { 51, 0x005E, 0x0062, 0xFFFF, 0x0060 },
+ { 84, 0xFFFF, 0x0063, 0x0066, 0x0061 },
+ { 84, 0xFFFF, 0x0064, 0x004B, 0x0062 },
+ { 33, 0x005F, 0xFFFF, 0x0067, 0x0063 },
+ { 51, 0x0060, 0xFFFF, 0x0068, 0xFFFF },
+ { 37, 0x0062, 0x004B, 0x006A, 0xFFFF },
+ { 1, 0x0064, 0xFFFF, 0x006C, 0x004B },
+ { 34, 0x0065, 0x0069, 0xFFFF, 0xFFFF },
+ { 51, 0x0031, 0x006A, 0xFFFF, 0x0068 },
+ { 85, 0x0066, 0x006B, 0xFFFF, 0x0069 },
+ { 106, 0x004B, 0x006C, 0xFFFF, 0x006A },
+ { 33, 0x0067, 0xFFFF, 0xFFFF, 0x006B },
+ { 55, 0x00C4, 0x00C5, 0xFFFF, 0x0019 },
+ { 52, 0xFFFF, 0x00C1, 0xFFFF, 0x0096 },
+ { 64, 0xFFFF, 0x00BF, 0xFFFF, 0x008C },
+ { 57, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF },
+ { 54, 0x00AF, 0xFFFF, 0x00B7, 0x00AC },
+ { 53, 0x0078, 0xFFFF, 0x0079, 0xFFFF },
+ { 29, 0xFFFF, 0x00BB, 0xFFFF, 0x00C5 },
+ { 69, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF },
+ { 76, 0x00C6, 0xFFFF, 0xFFFF, 0x00B1 },
+ { 59, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF },
+ { 58, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF },
+ { 59, 0xFFFF, 0x0025, 0x0072, 0xFFFF },
+ { 58, 0x0072, 0x007B, 0x00BB, 0xFFFF },
+ { 58, 0xFFFF, 0x007F, 0x007B, 0xFFFF },
+ { 59, 0x007A, 0xFFFF, 0x007C, 0x0079 },
+ { 58, 0x007B, 0x0081, 0x00BC, 0xFFFF },
+ { 58, 0x00BC, 0x0083, 0xFFFF, 0xFFFF },
+ { 58, 0xFFFF, 0x0085, 0x007F, 0xFFFF },
+ { 59, 0x007E, 0x0086, 0x0080, 0x007A },
+ { 58, 0x007F, 0x00BD, 0x0081, 0xFFFF },
+ { 59, 0x0080, 0x0087, 0x0082, 0x007C },
+ { 58, 0x0081, 0xFFFF, 0x0083, 0x00BC },
+ { 59, 0x0082, 0x0089, 0x0084, 0x007D },
+ { 58, 0x0083, 0x008A, 0xFFFF, 0xFFFF },
+ { 59, 0xFFFF, 0x008B, 0x0086, 0x007E },
+ { 58, 0x0085, 0x008C, 0x00BD, 0x007F },
+ { 58, 0x00BD, 0x008E, 0x0088, 0x0081 },
+ { 59, 0x0087, 0xFFFF, 0x0089, 0xFFFF },
+ { 58, 0x0088, 0x0090, 0x008A, 0x0083 },
+ { 59, 0x0089, 0x0091, 0xFFFF, 0x0084 },
+ { 58, 0xFFFF, 0x0092, 0x008C, 0x0085 },
+ { 59, 0x008B, 0x006F, 0x008D, 0x0086 },
+ { 58, 0x008C, 0x0093, 0x008E, 0x00BD },
+ { 59, 0x008D, 0xFFFF, 0xFFFF, 0x0087 },
+ { 58, 0xFFFF, 0x00BE, 0x0090, 0xFFFF },
+ { 59, 0x008F, 0x0095, 0x0091, 0x0089 },
+ { 58, 0x0090, 0x0096, 0xFFFF, 0x008A },
+ { 59, 0xFFFF, 0x0098, 0xFFFF, 0x008B },
+ { 59, 0xFFFF, 0xFFFF, 0xFFFF, 0x008D },
+ { 58, 0xFFFF, 0x009A, 0x00BE, 0xFFFF },
+ { 58, 0x00BE, 0xFFFF, 0x0096, 0x0090 },
+ { 59, 0x0095, 0x006E, 0x0097, 0x0091 },
+ { 58, 0x0096, 0x009D, 0xFFFF, 0xFFFF },
+ { 58, 0xFFFF, 0x009E, 0x00BF, 0x0092 },
+ { 58, 0x00BF, 0x00A0, 0x009A, 0xFFFF },
+ { 59, 0x0099, 0xFFFF, 0x009B, 0x0094 },
+ { 58, 0x009A, 0xFFFF, 0x009C, 0xFFFF },
+ { 59, 0x009B, 0x00A2, 0xFFFF, 0xFFFF },
+ { 59, 0xFFFF, 0x00A3, 0xFFFF, 0x0097 },
+ { 59, 0xFFFF, 0xFFFF, 0x009F, 0x0098 },
+ { 58, 0x009E, 0x00A4, 0x00A0, 0x00BF },
+ { 59, 0x009F, 0x00A5, 0xFFFF, 0x0099 },
+ { 58, 0xFFFF, 0x00A6, 0x00C0, 0xFFFF },
+ { 58, 0x00C0, 0x00A8, 0xFFFF, 0x009C },
+ { 58, 0x00C1, 0xFFFF, 0xFFFF, 0x009D },
+ { 59, 0xFFFF, 0x00AA, 0x00A5, 0x009F },
+ { 58, 0x00A4, 0x00AB, 0x00A6, 0x00A0 },
+ { 59, 0x00A5, 0x00AC, 0x00A7, 0x00A1 },
+ { 58, 0x00A6, 0xFFFF, 0xFFFF, 0x00C0 },
+ { 59, 0xFFFF, 0x00AD, 0x00A9, 0x00A2 },
+ { 58, 0x00A8, 0x00AE, 0xFFFF, 0x00C1 },
+ { 58, 0xFFFF, 0xFFFF, 0x00AB, 0x00A4 },
+ { 59, 0x00AA, 0x00AF, 0x00AC, 0x00A5 },
+ { 58, 0x00AB, 0x0071, 0x00C2, 0x00A6 },
+ { 58, 0xFFFF, 0x00B0, 0x00AE, 0x00A8 },
+ { 59, 0x00AD, 0xFFFF, 0xFFFF, 0x00A9 },
+ { 58, 0xFFFF, 0x00C3, 0x0071, 0x00AB },
+ { 59, 0xFFFF, 0xFFFF, 0x00B1, 0x00AD },
+ { 58, 0x00B0, 0x0075, 0xFFFF, 0xFFFF },
+ { 59, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF },
+ { 59, 0x00C3, 0xFFFF, 0x00B4, 0xFFFF },
+ { 59, 0x00B3, 0x00BA, 0xFFFF, 0xFFFF },
+ { 58, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF },
+ { 59, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF },
+ { 58, 0x0071, 0xFFFF, 0xFFFF, 0x00C2 },
+ { 58, 0xFFFF, 0xFFFF, 0x00B9, 0xFFFF },
+ { 59, 0x00B8, 0xFFFF, 0xFFFF, 0x00C3 },
+ { 58, 0xFFFF, 0xFFFF, 0xFFFF, 0x00B4 },
+ { 59, 0x0079, 0xFFFF, 0xFFFF, 0x0073 },
+ { 59, 0x007C, 0x0082, 0x007D, 0xFFFF },
+ { 59, 0x0086, 0x008D, 0x0087, 0x0080 },
+ { 59, 0x0094, 0xFFFF, 0x0095, 0x008F },
+ { 59, 0x0098, 0x009F, 0x0099, 0x006F },
+ { 59, 0x00A1, 0x00A7, 0x00A2, 0xFFFF },
+ { 59, 0xFFFF, 0x00A9, 0x00A3, 0x006E },
+ { 59, 0x00AC, 0x00B7, 0xFFFF, 0xFFFF },
+ { 58, 0xFFFF, 0x00B9, 0x00B3, 0x00AF },
+ { 59, 0xFFFF, 0xFFFF, 0x006D, 0xFFFF },
+ { 58, 0xFFFF, 0x0073, 0xFFFF, 0x006D },
+ { 59, 0xFFFF, 0xFFFF, 0x0075, 0xFFFF },
+ { 94, 0xFFFF, 0x00C8, 0xFFFF, 0xFFFF },
+ { 43, 0x00C9, 0x00CB, 0x00CA, 0x00C7 },
+ { 51, 0xFFFF, 0xFFFF, 0x00C8, 0xFFFF },
+ { 37, 0x00C8, 0xFFFF, 0xFFFF, 0xFFFF },
+ { 79, 0xFFFF, 0xFFFF, 0xFFFF, 0x00C8 },
+ { 80, 0xFFFF, 0xFFFF, 0x00CB, 0x00CD },
+ { 97, 0x00E3, 0x00D4, 0x00CC, 0x00D3 },
+ { 103, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF },
+ { 100, 0xFFFF, 0x00CE, 0x00D5, 0xFFFF },
+ { 98, 0xFFFF, 0xFFFF, 0xFFFF, 0x00D7 },
+ { 101, 0xFFFF, 0x00D2, 0x00CE, 0xFFFF },
+ { 99, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF },
+ { 93, 0x00D5, 0x00CD, 0xFFFF, 0xFFFF },
+ { 93, 0x00D6, 0xFFFF, 0xFFFF, 0x00CD },
+ { 93, 0x00CF, 0x00CE, 0x00D3, 0xFFFF },
+ { 93, 0x00D7, 0xFFFF, 0x00D4, 0x00CE },
+ { 93, 0xFFFF, 0x00D0, 0x00D6, 0x00CE },
+ { 93, 0x00DA, 0x00E3, 0xFFFF, 0xFFFF },
+ { 93, 0x00DB, 0xFFFF, 0xFFFF, 0x00E3 },
+ { 93, 0xFFFF, 0x00E4, 0x00D8, 0x00E2 },
+ { 93, 0xFFFF, 0x00E1, 0x00D9, 0x00E4 },
+ { 93, 0xFFFF, 0x00E4, 0xFFFF, 0x00DF },
+ { 93, 0xFFFF, 0x00E0, 0xFFFF, 0x00E4 },
+ { 93, 0xFFFF, 0xFFFF, 0x00E4, 0xFFFF },
+ { 91, 0xFFFF, 0x00DC, 0xFFFF, 0xFFFF },
+ { 90, 0xFFFF, 0xFFFF, 0xFFFF, 0x00DD },
+ { 92, 0xFFFF, 0xFFFF, 0xFFFF, 0x00DB },
+ { 95, 0xFFFF, 0x00DA, 0xFFFF, 0xFFFF },
+ { 96, 0xFFFF, 0x00D9, 0x00CD, 0x00D8 },
+ { 89, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF },
+ { 102, 0xFFFF, 0x00E6, 0xFFFF, 0xFFFF },
+ { 102, 0xFFFF, 0x00EA, 0x00E8, 0x00E5 },
+ { 102, 0xFFFF, 0x00E8, 0x00EB, 0xFFFF },
+ { 102, 0x00E6, 0xFFFF, 0xFFFF, 0x00E7 },
+ { 102, 0xFFFF, 0xFFFF, 0x00ED, 0xFFFF },
+ { 102, 0xFFFF, 0xFFFF, 0xFFFF, 0x00E6 },
+ { 102, 0x00E7, 0x00EC, 0x00EF, 0xFFFF },
+ { 102, 0xFFFF, 0x00ED, 0x00F0, 0x00EB },
+ { 102, 0x00E9, 0x00EE, 0x00F1, 0x00EC },
+ { 102, 0xFFFF, 0xFFFF, 0x00F2, 0x00ED },
+ { 102, 0x00EB, 0x00F0, 0xFFFF, 0xFFFF },
+ { 102, 0x00EC, 0x00F1, 0x00F3, 0x00EF },
+ { 102, 0x00ED, 0xFFFF, 0x00F4, 0x00F0 },
+ { 102, 0x00EE, 0xFFFF, 0xFFFF, 0xFFFF },
+ { 102, 0x00F0, 0x00F4, 0xFFFF, 0xFFFF },
+ { 102, 0x00F1, 0x00F5, 0xFFFF, 0x00F3 },
+ { 102, 0xFFFF, 0xFFFF, 0x00CF, 0x00F4 }
+};
+
+static const RoomProvider k1RoomListPC98Provider = { ARRAYSIZE(k1RoomListPC98), k1RoomListPC98 };
+
+static const char *const k1RoomFilenamesPC98[107] = {
+ "CLIFFB",
+ "XEDGEB",
+ "CAVEB",
+ "NCLIFF",
+ "NCLIFFB",
+ "CAVE",
+ "NWCLIFF",
+ "OAKS",
+ "PLATEAU",
+ "POTHUT",
+ "POTION",
+ "NWCLIFB",
+ "SONG",
+ "SORROW",
+ "SPELHUT",
+ "SPELL",
+ "SPRING",
+ "SQUARE",
+ "STUMP",
+ "TEMPLE",
+ "WELL",
+ "WILLOW",
+ "WISE",
+ "XEDGE",
+ "RUBY",
+ "ZROCK",
+ "ZROCKB",
+ "FORESTD",
+ "FOUNTN",
+ "GATECV",
+ "GEMCUT",
+ "CLIFF",
+ "DEAD",
+ "EDGE",
+ "EDGEB",
+ "FALLS",
+ "FORESTC",
+ "FORESTB",
+ "GLADE",
+ "GEMHUT",
+ "ALGAE",
+ "MIX",
+ "BRIDGE",
+ "GRAVE",
+ "HEALER",
+ "HEALHUT",
+ "ALTAR",
+ "BURN",
+ "SICKWIL",
+ "LAGOON",
+ "MAPLE",
+ "FORESTA",
+ "ARCH",
+ "CHASM",
+ "EMCAV",
+ "ENTER",
+ "FLOWERS",
+ "GEMSLOT",
+ "GEN_CAV",
+ "GENCAVB",
+ "GOLDEN",
+ "GOLDENB",
+ "ICE",
+ "MARKET",
+ "MOONCAV",
+ "MSHCAV",
+ "POOL",
+ "SEASONS",
+ "SHRINE",
+ "TREECAV",
+ "EXTGEM",
+ "GEM",
+ "EXTHEAL",
+ "BASE",
+ "TRUNK",
+ "BROKEN",
+ "LAVA",
+ "EXTSPEL",
+ "EXTPOT",
+ "CASTLE",
+ "CGATE",
+ "LEPHOLE",
+ "DRAGON",
+ "XEDGEC",
+ "FNORTH",
+ "FSOUTH",
+ "FGOWEST",
+ "PLTCAVE",
+ "BONKBG",
+ "BALCONY",
+ "DARMS",
+ "BRINS",
+ "ALCHEMY",
+ "GENHALL",
+ "LANDING",
+ "BELROOM",
+ "UPSTAIR",
+ "DNSTAIR",
+ "KITCHEN",
+ "KYRAGEM",
+ "LIBRARY",
+ "FOYER",
+ "CATACOM",
+ "GRTHALL",
+ "FESTSTH",
+ "FWSTSTH",
+ "FSOUTHB"
+};
+
+static const StringListProvider k1RoomFilenamesPC98Provider = { ARRAYSIZE(k1RoomFilenamesPC98), k1RoomFilenamesPC98 };
+
+static const char *const k1CharacterImageFilenamesPC98[20] = {
+ "BRANDON.CPS",
+ "DAPHNE.CPS",
+ "MERITH.CPS",
+ "HERMAN.CPS",
+ "SMALL.CPS",
+ "MALCOM.CPS",
+ "DRINK.CPS",
+ "SHRINK.CPS",
+ "HEALBR1.CPS",
+ "HEALBR2.CPS",
+ "SNOW1A.CPS",
+ "SNOW2A.CPS",
+ "BRANWILL.CPS",
+ "FLUTE1.CPS",
+ "FLUTE2.CPS",
+ "POISON1.CPS",
+ "POISON2.CPS",
+ "TELEKIN.CPS",
+ "BRANSTON.CPS",
+ "POISON.CPS"
+};
+
+static const StringListProvider k1CharacterImageFilenamesPC98Provider = { ARRAYSIZE(k1CharacterImageFilenamesPC98), k1CharacterImageFilenamesPC98 };
+
+static const Shape k1DefaultShapesPC98[166] = {
+ { 0, 0, 0, 3, 48, -12, -48 },
+ { 0, 3, 0, 3, 48, -12, -48 },
+ { 0, 6, 0, 3, 48, -12, -48 },
+ { 0, 9, 0, 3, 48, -12, -48 },
+ { 0, 12, 0, 3, 48, -12, -48 },
+ { 0, 15, 0, 3, 48, -12, -48 },
+ { 0, 18, 0, 3, 48, -12, -48 },
+ { 0, 21, 0, 3, 48, -12, -48 },
+ { 0, 24, 0, 3, 48, -12, -48 },
+ { 0, 27, 0, 3, 48, -12, -48 },
+ { 0, 0, 51, 2, 11, -2, -8 },
+ { 0, 2, 51, 2, 11, -2, -8 },
+ { 0, 4, 51, 2, 11, -2, -8 },
+ { 0, 6, 51, 2, 11, -2, -8 },
+ { 0, 8, 51, 2, 11, -2, -8 },
+ { 0, 10, 51, 2, 11, -2, -8 },
+ { 0, 12, 51, 2, 11, -2, -8 },
+ { 0, 14, 51, 2, 11, -2, -8 },
+ { 0, 16, 51, 2, 11, -2, -8 },
+ { 0, 18, 51, 2, 11, -2, -8 },
+ { 0, 20, 51, 2, 11, -2, -8 },
+ { 0, 22, 51, 2, 11, -2, -8 },
+ { 0, 0, 80, 3, 48, -12, -48 },
+ { 0, 3, 80, 3, 48, -12, -48 },
+ { 0, 6, 80, 3, 48, -12, -48 },
+ { 0, 9, 80, 3, 48, -12, -48 },
+ { 0, 12, 80, 3, 48, -12, -48 },
+ { 0, 15, 80, 3, 48, -12, -48 },
+ { 0, 0, 129, 3, 48, -12, -48 },
+ { 0, 3, 129, 3, 48, -12, -48 },
+ { 0, 6, 129, 3, 48, -12, -48 },
+ { 0, 9, 129, 3, 48, -12, -48 },
+ { 0, 12, 129, 3, 48, -12, -48 },
+ { 0, 15, 129, 3, 48, -12, -48 },
+ { 2, 0, 0, 3, 48, -12, -48 },
+ { 2, 3, 0, 3, 48, -12, -48 },
+ { 2, 6, 0, 3, 48, -12, -48 },
+ { 2, 9, 0, 3, 48, -12, -48 },
+ { 2, 12, 0, 3, 48, -12, -48 },
+ { 2, 15, 0, 3, 48, -12, -48 },
+ { 2, 18, 0, 3, 48, -12, -48 },
+ { 2, 21, 0, 3, 48, -12, -48 },
+ { 2, 24, 0, 3, 48, -12, -48 },
+ { 2, 27, 0, 3, 48, -12, -48 },
+ { 2, 30, 10, 3, 38, -16, -38 },
+ { 2, 27, 48, 4, 40, -8, -40 },
+ { 2, 0, 51, 2, 11, -4, 0 },
+ { 2, 2, 51, 2, 11, -4, 0 },
+ { 2, 4, 51, 2, 11, -4, 0 },
+ { 2, 6, 51, 2, 11, -4, 0 },
+ { 2, 8, 51, 2, 11, -4, 0 },
+ { 2, 10, 51, 2, 11, -4, 0 },
+ { 2, 12, 51, 2, 11, -4, 0 },
+ { 2, 14, 51, 2, 11, -4, 0 },
+ { 2, 16, 51, 2, 11, -4, 0 },
+ { 2, 18, 51, 2, 11, -4, 0 },
+ { 2, 20, 51, 2, 11, -4, 0 },
+ { 2, 22, 51, 2, 11, -4, 0 },
+ { 255, 0, 80, 3, 48, -12, -48 },
+ { 255, 3, 80, 3, 48, -12, -48 },
+ { 255, 6, 80, 3, 48, -12, -48 },
+ { 255, 9, 80, 3, 48, -12, -48 },
+ { 255, 12, 80, 3, 48, -12, -48 },
+ { 255, 15, 80, 3, 48, -12, -48 },
+ { 255, 0, 129, 3, 48, -12, -48 },
+ { 255, 3, 129, 3, 48, -12, -48 },
+ { 255, 6, 129, 3, 48, -12, -48 },
+ { 255, 9, 129, 3, 48, -12, -48 },
+ { 255, 12, 129, 3, 48, -12, -48 },
+ { 255, 15, 129, 3, 48, -12, -48 },
+ { 3, 0, 0, 3, 48, -12, -46 },
+ { 3, 3, 0, 3, 48, -12, -48 },
+ { 3, 6, 0, 3, 48, -12, -48 },
+ { 3, 9, 0, 3, 48, -12, -48 },
+ { 3, 12, 0, 3, 48, -12, -48 },
+ { 3, 15, 0, 3, 48, -12, -48 },
+ { 3, 18, 0, 3, 48, -12, -48 },
+ { 3, 21, 0, 3, 48, -12, -48 },
+ { 3, 24, 0, 3, 48, -12, -48 },
+ { 3, 27, 0, 3, 48, -12, -46 },
+ { 3, 30, 0, 3, 48, -14, -47 },
+ { 3, 39, 199, 1, 1, -12, -48 },
+ { 3, 0, 51, 2, 11, 0, -7 },
+ { 3, 2, 51, 2, 11, 0, -7 },
+ { 3, 4, 51, 2, 11, 0, -7 },
+ { 3, 6, 51, 2, 11, 0, -7 },
+ { 3, 8, 51, 2, 11, 0, -7 },
+ { 3, 10, 51, 2, 11, 0, -7 },
+ { 3, 12, 51, 2, 11, 0, -7 },
+ { 3, 14, 51, 2, 11, 0, -7 },
+ { 3, 16, 51, 2, 11, 0, -7 },
+ { 3, 18, 51, 2, 11, 0, -7 },
+ { 3, 20, 51, 2, 11, 0, -7 },
+ { 3, 22, 51, 2, 11, 0, -7 },
+ { 3, 0, 80, 3, 48, -12, -48 },
+ { 3, 3, 80, 3, 48, -12, -48 },
+ { 3, 6, 80, 3, 48, -12, -48 },
+ { 3, 9, 80, 3, 48, -12, -48 },
+ { 3, 12, 80, 3, 48, -12, -48 },
+ { 3, 15, 80, 3, 48, -12, -48 },
+ { 3, 0, 129, 3, 48, -12, -48 },
+ { 3, 3, 129, 3, 48, -12, -48 },
+ { 3, 6, 129, 3, 48, -12, -48 },
+ { 3, 9, 129, 3, 48, -12, -48 },
+ { 3, 12, 129, 3, 48, -12, -48 },
+ { 3, 15, 129, 3, 48, -12, -48 },
+ { 12, 0, 96, 5, 29, -20, -42 },
+ { 12, 5, 96, 5, 29, -20, -42 },
+ { 12, 10, 96, 5, 29, -20, -42 },
+ { 12, 15, 96, 5, 29, -20, -42 },
+ { 12, 20, 96, 5, 29, -20, -42 },
+ { 12, 25, 96, 5, 29, -20, -42 },
+ { 12, 30, 96, 5, 29, -20, -42 },
+ { 12, 35, 96, 5, 29, -20, -42 },
+ { 12, 0, 125, 5, 29, -20, -42 },
+ { 12, 5, 125, 5, 29, -20, -42 },
+ { 255, 0, 0, 0, 0, 0, 0 },
+ { 255, 0, 0, 0, 0, 0, 0 },
+ { 255, 0, 0, 0, 0, 0, 0 },
+ { 255, 0, 0, 0, 0, 0, 0 },
+ { 255, 0, 0, 0, 0, 0, 0 },
+ { 255, 0, 0, 0, 0, 0, 0 },
+ { 255, 0, 0, 0, 0, 0, 0 },
+ { 255, 0, 0, 0, 0, 0, 0 },
+ { 255, 0, 0, 0, 0, 0, 0 },
+ { 255, 0, 0, 0, 0, 0, 0 },
+ { 255, 0, 0, 0, 0, 0, 0 },
+ { 255, 0, 0, 0, 0, 0, 0 },
+ { 255, 0, 0, 0, 0, 0, 0 },
+ { 255, 0, 0, 0, 0, 0, 0 },
+ { 255, 0, 0, 0, 0, 0, 0 },
+ { 255, 0, 0, 0, 0, 0, 0 },
+ { 255, 0, 0, 0, 0, 0, 0 },
+ { 255, 0, 0, 0, 0, 0, 0 },
+ { 255, 0, 0, 0, 0, 0, 0 },
+ { 255, 0, 0, 0, 0, 0, 0 },
+ { 255, 0, 0, 0, 0, 0, 0 },
+ { 255, 0, 0, 0, 0, 0, 0 },
+ { 255, 0, 0, 0, 0, 0, 0 },
+ { 255, 0, 0, 0, 0, 0, 0 },
+ { 255, 0, 0, 0, 0, 0, 0 },
+ { 255, 0, 0, 0, 0, 0, 0 },
+ { 255, 0, 0, 0, 0, 0, 0 },
+ { 255, 0, 0, 0, 0, 0, 0 },
+ { 255, 0, 0, 0, 0, 0, 0 },
+ { 255, 0, 0, 0, 0, 0, 0 },
+ { 255, 0, 0, 0, 0, 0, 0 },
+ { 255, 0, 0, 0, 0, 0, 0 },
+ { 255, 0, 0, 0, 0, 0, 0 },
+ { 255, 0, 0, 0, 0, 0, 0 },
+ { 255, 0, 0, 0, 0, 0, 0 },
+ { 255, 0, 0, 0, 0, 0, 0 },
+ { 255, 0, 0, 0, 0, 0, 0 },
+ { 255, 0, 0, 0, 0, 0, 0 },
+ { 255, 0, 0, 0, 0, 0, 0 },
+ { 255, 0, 0, 0, 0, 0, 0 },
+ { 255, 0, 0, 0, 0, 0, 0 },
+ { 255, 0, 0, 0, 0, 0, 0 },
+ { 255, 0, 0, 0, 0, 0, 0 },
+ { 255, 0, 0, 0, 0, 0, 0 },
+ { 255, 0, 0, 0, 0, 0, 0 },
+ { 255, 0, 0, 0, 0, 0, 0 },
+ { 255, 0, 0, 0, 0, 0, 0 },
+ { 255, 0, 0, 0, 0, 0, 0 },
+ { 255, 0, 0, 0, 0, 0, 0 },
+ { 255, 0, 0, 0, 0, 0, 0 }
+};
+
+static const ShapeProvider k1DefaultShapesPC98Provider = { ARRAYSIZE(k1DefaultShapesPC98), k1DefaultShapesPC98 };
+
+static const byte k1AmuleteAnimSeqPC98[42] = {
+ 0x00, 0x01, 0x02, 0x01, 0x03, 0x04, 0x03, 0x01,
+ 0x02, 0x03, 0x04, 0x05, 0x06, 0x05, 0x04, 0x05,
+ 0x07, 0x08, 0x07, 0x08, 0x09, 0x08, 0x09, 0x07,
+ 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D,
+ 0x0E, 0x0F, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15,
+ 0x16, 0xFF
+};
+
+static const ByteProvider k1AmuleteAnimSeqPC98Provider = { ARRAYSIZE(k1AmuleteAnimSeqPC98), k1AmuleteAnimSeqPC98 };
+
+static const byte k1SpecialPalette1PC98[21] = {
+ 0x36, 0x25, 0x1C, 0x31, 0x21, 0x19, 0x2C, 0x1D,
+ 0x16, 0x27, 0x19, 0x13, 0x22, 0x16, 0x11, 0x1D,
+ 0x12, 0x0D, 0x18, 0x0F, 0x0B
+};
+
+static const ByteProvider k1SpecialPalette1PC98Provider = { ARRAYSIZE(k1SpecialPalette1PC98), k1SpecialPalette1PC98 };
+
+static const byte k1SpecialPalette2PC98[51] = {
+ 0x03, 0x03, 0x00, 0x37, 0x29, 0x1D, 0x33, 0x25,
+ 0x1A, 0x2D, 0x21, 0x17, 0x2A, 0x1D, 0x13, 0x26,
+ 0x19, 0x11, 0x22, 0x16, 0x0E, 0x1E, 0x12, 0x0C,
+ 0x1A, 0x0F, 0x0A, 0x16, 0x0C, 0x08, 0x12, 0x0A,
+ 0x05, 0x0E, 0x08, 0x05, 0x2D, 0x1E, 0x13, 0x27,
+ 0x19, 0x0F, 0x22, 0x14, 0x0C, 0x1C, 0x11, 0x0A,
+ 0x17, 0x0C, 0x08
+};
+
+static const ByteProvider k1SpecialPalette2PC98Provider = { ARRAYSIZE(k1SpecialPalette2PC98), k1SpecialPalette2PC98 };
+
+static const byte k1SpecialPalette3PC98[51] = {
+ 0x03, 0x03, 0x00, 0x25, 0x30, 0x1B, 0x24, 0x2C,
+ 0x18, 0x23, 0x29, 0x15, 0x22, 0x25, 0x12, 0x21,
+ 0x22, 0x11, 0x1F, 0x1D, 0x0D, 0x1B, 0x18, 0x0B,
+ 0x18, 0x13, 0x0A, 0x14, 0x0E, 0x08, 0x11, 0x0A,
+ 0x05, 0x0E, 0x08, 0x05, 0x21, 0x22, 0x11, 0x1D,
+ 0x1C, 0x0C, 0x19, 0x15, 0x0A, 0x15, 0x0F, 0x08,
+ 0x11, 0x0A, 0x05
+};
+
+static const ByteProvider k1SpecialPalette3PC98Provider = { ARRAYSIZE(k1SpecialPalette3PC98), k1SpecialPalette3PC98 };
+
+static const byte k1SpecialPalette4PC98[51] = {
+ 0x06, 0x03, 0x01, 0x33, 0x25, 0x0A, 0x2F, 0x21,
+ 0x0A, 0x2B, 0x1D, 0x08, 0x28, 0x1A, 0x08, 0x24,
+ 0x17, 0x06, 0x21, 0x22, 0x06, 0x1D, 0x11, 0x05,
+ 0x19, 0x0E, 0x05, 0x16, 0x0B, 0x03, 0x12, 0x0A,
+ 0x03, 0x0F, 0x08, 0x03, 0x28, 0x1A, 0x08, 0x22,
+ 0x15, 0x05, 0x1D, 0x11, 0x05, 0x17, 0x0C, 0x03,
+ 0x12, 0x0A, 0x03
+};
+
+static const ByteProvider k1SpecialPalette4PC98Provider = { ARRAYSIZE(k1SpecialPalette4PC98), k1SpecialPalette4PC98 };
+
+static const byte k1SpecialPalette5PC98[51] = {
+ 0x03, 0x03, 0x00, 0x2A, 0x1D, 0x13, 0x27, 0x1A,
+ 0x11, 0x24, 0x18, 0x0F, 0x21, 0x15, 0x0D, 0x1E,
+ 0x13, 0x0C, 0x1C, 0x11, 0x0A, 0x19, 0x0F, 0x0A,
+ 0x16, 0x0C, 0x08, 0x13, 0x0A, 0x06, 0x11, 0x08,
+ 0x05, 0x0E, 0x08, 0x05, 0x1C, 0x11, 0x0A, 0x19,
+ 0x0E, 0x08, 0x16, 0x0C, 0x08, 0x13, 0x0A, 0x06,
+ 0x11, 0x08, 0x05
+};
+
+static const ByteProvider k1SpecialPalette5PC98Provider = { ARRAYSIZE(k1SpecialPalette5PC98), k1SpecialPalette5PC98 };
+
+static const byte k1SpecialPalette6PC98[51] = {
+ 0x00, 0x08, 0x01, 0x00, 0x1E, 0x00, 0x00, 0x1B,
+ 0x00, 0x00, 0x19, 0x00, 0x00, 0x17, 0x00, 0x00,
+ 0x14, 0x00, 0x00, 0x12, 0x00, 0x00, 0x11, 0x00,
+ 0x00, 0x0E, 0x00, 0x00, 0x0B, 0x00, 0x00, 0x0A,
+ 0x00, 0x00, 0x08, 0x00, 0x13, 0x21, 0x0F, 0x11,
+ 0x1F, 0x0D, 0x0E, 0x1D, 0x0C, 0x0C, 0x1B, 0x0B,
+ 0x0A, 0x19, 0x0A
+};
+
+static const ByteProvider k1SpecialPalette6PC98Provider = { ARRAYSIZE(k1SpecialPalette6PC98), k1SpecialPalette6PC98 };
+
+static const byte k1SpecialPalette7PC98[54] = {
+ 0x05, 0x2B, 0x00, 0x00, 0x22, 0x00, 0x00, 0x1E,
+ 0x00, 0x00, 0x16, 0x01, 0x00, 0x12, 0x03, 0x00,
+ 0x0F, 0x01, 0x00, 0x0B, 0x03, 0x0A, 0x19, 0x0A,
+ 0x2D, 0x2D, 0x32, 0x29, 0x29, 0x2D, 0x25, 0x25,
+ 0x2B, 0x1F, 0x1F, 0x26, 0x1B, 0x1B, 0x22, 0x14,
+ 0x16, 0x1D, 0x11, 0x11, 0x18, 0x0D, 0x0D, 0x14,
+ 0x0A, 0x0A, 0x0F, 0x06, 0x06, 0x0B
+};
+
+static const ByteProvider k1SpecialPalette7PC98Provider = { ARRAYSIZE(k1SpecialPalette7PC98), k1SpecialPalette7PC98 };
+
+static const byte k1SpecialPalette8PC98[54] = {
+ 0x12, 0x37, 0x3F, 0x14, 0x31, 0x3F, 0x14, 0x29,
+ 0x3F, 0x14, 0x22, 0x3F, 0x14, 0x1B, 0x3F, 0x14,
+ 0x14, 0x3F, 0x0E, 0x0F, 0x37, 0x14, 0x29, 0x3F,
+ 0x2F, 0x3F, 0x3D, 0x26, 0x3F, 0x3F, 0x15, 0x3F,
+ 0x3F, 0x14, 0x3B, 0x3F, 0x12, 0x37, 0x3F, 0x14,
+ 0x31, 0x3F, 0x14, 0x29, 0x3F, 0x14, 0x22, 0x3F,
+ 0x14, 0x1B, 0x3F, 0x14, 0x14, 0x3F
+};
+
+static const ByteProvider k1SpecialPalette8PC98Provider = { ARRAYSIZE(k1SpecialPalette8PC98), k1SpecialPalette8PC98 };
+
+static const byte k1SpecialPalette9PC98[45] = {
+ 0x36, 0x00, 0x00, 0x32, 0x00, 0x00, 0x2F, 0x00,
+ 0x00, 0x2C, 0x00, 0x00, 0x29, 0x00, 0x00, 0x26,
+ 0x00, 0x00, 0x23, 0x00, 0x00, 0x20, 0x00, 0x00,
+ 0x1C, 0x00, 0x00, 0x19, 0x00, 0x00, 0x16, 0x00,
+ 0x00, 0x13, 0x00, 0x00, 0x11, 0x00, 0x00, 0x0D,
+ 0x00, 0x00, 0x0A, 0x00, 0x00
+};
+
+static const ByteProvider k1SpecialPalette9PC98Provider = { ARRAYSIZE(k1SpecialPalette9PC98), k1SpecialPalette9PC98 };
+
+static const byte k1SpecialPalette10PC98[45] = {
+ 0x29, 0x00, 0x00, 0x26, 0x00, 0x00, 0x24, 0x00,
+ 0x00, 0x22, 0x00, 0x00, 0x20, 0x00, 0x00, 0x1E,
+ 0x00, 0x00, 0x1B, 0x00, 0x00, 0x19, 0x00, 0x00,
+ 0x17, 0x00, 0x00, 0x15, 0x00, 0x00, 0x12, 0x00,
+ 0x00, 0x11, 0x00, 0x00, 0x0E, 0x00, 0x00, 0x0C,
+ 0x00, 0x00, 0x0A, 0x00, 0x00
+};
+
+static const ByteProvider k1SpecialPalette10PC98Provider = { ARRAYSIZE(k1SpecialPalette10PC98), k1SpecialPalette10PC98 };
+
+static const byte k1SpecialPalette11PC98[45] = {
+ 0x20, 0x00, 0x00, 0x1E, 0x00, 0x00, 0x1C, 0x00,
+ 0x00, 0x1B, 0x00, 0x00, 0x19, 0x00, 0x00, 0x18,
+ 0x00, 0x00, 0x16, 0x00, 0x00, 0x15, 0x00, 0x00,
+ 0x13, 0x00, 0x00, 0x11, 0x00, 0x00, 0x11, 0x00,
+ 0x00, 0x0E, 0x00, 0x00, 0x0D, 0x00, 0x00, 0x0B,
+ 0x00, 0x00, 0x0A, 0x00, 0x00
+};
+
+static const ByteProvider k1SpecialPalette11PC98Provider = { ARRAYSIZE(k1SpecialPalette11PC98), k1SpecialPalette11PC98 };
+
+static const byte k1SpecialPalette12PC98[45] = {
+ 0x19, 0x00, 0x00, 0x18, 0x00, 0x00, 0x16, 0x00,
+ 0x00, 0x15, 0x00, 0x00, 0x14, 0x00, 0x00, 0x13,
+ 0x00, 0x00, 0x12, 0x00, 0x00, 0x11, 0x00, 0x00,
+ 0x11, 0x00, 0x00, 0x0F, 0x00, 0x00, 0x0E, 0x00,
+ 0x00, 0x0D, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x0B,
+ 0x00, 0x00, 0x0A, 0x00, 0x00
+};
+
+static const ByteProvider k1SpecialPalette12PC98Provider = { ARRAYSIZE(k1SpecialPalette12PC98), k1SpecialPalette12PC98 };
+
+static const byte k1SpecialPalette13PC98[45] = {
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00
+};
+
+static const ByteProvider k1SpecialPalette13PC98Provider = { ARRAYSIZE(k1SpecialPalette13PC98), k1SpecialPalette13PC98 };
+
+static const byte k1SpecialPalette14PC98[60] = {
+ 0x0E, 0x28, 0x3F, 0x0C, 0x24, 0x3B, 0x0A, 0x20,
+ 0x38, 0x0A, 0x1C, 0x34, 0x08, 0x19, 0x31, 0x08,
+ 0x15, 0x2D, 0x05, 0x13, 0x2A, 0x05, 0x11, 0x27,
+ 0x03, 0x0D, 0x24, 0x03, 0x0A, 0x20, 0x03, 0x08,
+ 0x1D, 0x01, 0x06, 0x19, 0x01, 0x05, 0x16, 0x00,
+ 0x03, 0x13, 0x00, 0x01, 0x0F, 0x00, 0x01, 0x0C,
+ 0x00, 0x00, 0x08, 0x00, 0x00, 0x05, 0x00, 0x00,
+ 0x03, 0x00, 0x00, 0x00
+};
+
+static const ByteProvider k1SpecialPalette14PC98Provider = { ARRAYSIZE(k1SpecialPalette14PC98), k1SpecialPalette14PC98 };
+
+static const byte k1SpecialPalette15PC98[45] = {
+ 0x24, 0x00, 0x39, 0x21, 0x00, 0x36, 0x1F, 0x00,
+ 0x32, 0x1C, 0x00, 0x2D, 0x1A, 0x00, 0x2A, 0x17,
+ 0x00, 0x26, 0x15, 0x00, 0x22, 0x12, 0x00, 0x1E,
+ 0x11, 0x00, 0x1A, 0x0E, 0x00, 0x16, 0x0B, 0x00,
+ 0x12, 0x0A, 0x00, 0x0F, 0x06, 0x00, 0x0B, 0x05,
+ 0x00, 0x08, 0x01, 0x00, 0x03
+};
+
+static const ByteProvider k1SpecialPalette15PC98Provider = { ARRAYSIZE(k1SpecialPalette15PC98), k1SpecialPalette15PC98 };
+
+static const byte k1SpecialPalette16PC98[33] = {
+ 0x00, 0x3F, 0x3F, 0x00, 0x38, 0x38, 0x00, 0x34,
+ 0x34, 0x00, 0x30, 0x30, 0x00, 0x2D, 0x2D, 0x00,
+ 0x29, 0x29, 0x00, 0x25, 0x25, 0x00, 0x1F, 0x1F,
+ 0x00, 0x1B, 0x1B, 0x00, 0x16, 0x16, 0x00, 0x11,
+ 0x11
+};
+
+static const ByteProvider k1SpecialPalette16PC98Provider = { ARRAYSIZE(k1SpecialPalette16PC98), k1SpecialPalette16PC98 };
+
+static const byte k1SpecialPalette17PC98[33] = {
+ 0x3B, 0x3B, 0x3B, 0x36, 0x36, 0x36, 0x32, 0x32,
+ 0x32, 0x2D, 0x2D, 0x2D, 0x2A, 0x2A, 0x2A, 0x26,
+ 0x26, 0x26, 0x21, 0x21, 0x21, 0x1D, 0x1D, 0x1D,
+ 0x19, 0x19, 0x19, 0x15, 0x15, 0x15, 0x11, 0x11,
+ 0x11
+};
+
+static const ByteProvider k1SpecialPalette17PC98Provider = { ARRAYSIZE(k1SpecialPalette17PC98), k1SpecialPalette17PC98 };
+
+static const byte k1SpecialPalette18PC98[21] = {
+ 0x0F, 0x23, 0x1C, 0x2A, 0x36, 0x3F, 0x24, 0x2F,
+ 0x38, 0x1F, 0x2A, 0x32, 0x1A, 0x24, 0x2B, 0x15,
+ 0x1E, 0x25, 0x11, 0x19, 0x1F
+};
+
+static const ByteProvider k1SpecialPalette18PC98Provider = { ARRAYSIZE(k1SpecialPalette18PC98), k1SpecialPalette18PC98 };
+
+static const byte k1SpecialPalette19PC98[21] = {
+ 0x00, 0x00, 0x1C, 0x00, 0x00, 0x3F, 0x00, 0x00,
+ 0x38, 0x00, 0x00, 0x32, 0x00, 0x00, 0x2B, 0x00,
+ 0x00, 0x25, 0x00, 0x00, 0x1F
+};
+
+static const ByteProvider k1SpecialPalette19PC98Provider = { ARRAYSIZE(k1SpecialPalette19PC98), k1SpecialPalette19PC98 };
+
+static const byte k1SpecialPalette20PC98[21] = {
+ 0x26, 0x1B, 0x1B, 0x3F, 0x34, 0x34, 0x3B, 0x2F,
+ 0x2F, 0x39, 0x2B, 0x2B, 0x36, 0x26, 0x27, 0x33,
+ 0x22, 0x23, 0x31, 0x1F, 0x20
+};
+
+static const ByteProvider k1SpecialPalette20PC98Provider = { ARRAYSIZE(k1SpecialPalette20PC98), k1SpecialPalette20PC98 };
+
+static const byte k1SpecialPalette21PC98[21] = {
+ 0x1C, 0x00, 0x00, 0x3F, 0x00, 0x00, 0x38, 0x00,
+ 0x00, 0x32, 0x00, 0x00, 0x2B, 0x00, 0x00, 0x25,
+ 0x00, 0x00, 0x1F, 0x00, 0x00
+};
+
+static const ByteProvider k1SpecialPalette21PC98Provider = { ARRAYSIZE(k1SpecialPalette21PC98), k1SpecialPalette21PC98 };
+
+static const byte k1SpecialPalette22PC98[21] = {
+ 0x1F, 0x1F, 0x0C, 0x3F, 0x3F, 0x21, 0x3B, 0x3B,
+ 0x1F, 0x37, 0x37, 0x1D, 0x34, 0x34, 0x1B, 0x30,
+ 0x30, 0x19, 0x2D, 0x2D, 0x17
+};
+
+static const ByteProvider k1SpecialPalette22PC98Provider = { ARRAYSIZE(k1SpecialPalette22PC98), k1SpecialPalette22PC98 };
+
+static const byte k1SpecialPalette23PC98[21] = {
+ 0x1F, 0x1F, 0x00, 0x3F, 0x3F, 0x00, 0x3B, 0x3B,
+ 0x00, 0x37, 0x37, 0x00, 0x34, 0x34, 0x00, 0x30,
+ 0x30, 0x00, 0x2D, 0x2D, 0x00
+};
+
+static const ByteProvider k1SpecialPalette23PC98Provider = { ARRAYSIZE(k1SpecialPalette23PC98), k1SpecialPalette23PC98 };
+
+static const byte k1SpecialPalette24PC98[48] = {
+ 0x36, 0x38, 0x2C, 0x31, 0x38, 0x23, 0x2A, 0x33,
+ 0x1E, 0x24, 0x2F, 0x1A, 0x1E, 0x2A, 0x16, 0x18,
+ 0x26, 0x13, 0x13, 0x21, 0x0F, 0x0E, 0x1D, 0x0D,
+ 0x0D, 0x1B, 0x0C, 0x0A, 0x19, 0x0A, 0x0A, 0x18,
+ 0x0A, 0x08, 0x17, 0x08, 0x08, 0x16, 0x08, 0x08,
+ 0x15, 0x06, 0x06, 0x14, 0x06, 0x06, 0x11, 0x06
+};
+
+static const ByteProvider k1SpecialPalette24PC98Provider = { ARRAYSIZE(k1SpecialPalette24PC98), k1SpecialPalette24PC98 };
+
+static const byte k1SpecialPalette25PC98[48] = {
+ 0x36, 0x38, 0x2C, 0x31, 0x36, 0x23, 0x2A, 0x33,
+ 0x1E, 0x24, 0x2F, 0x1A, 0x1E, 0x2A, 0x16, 0x1E,
+ 0x2A, 0x16, 0x18, 0x26, 0x13, 0x13, 0x21, 0x0F,
+ 0x0E, 0x1D, 0x0D, 0x0D, 0x1B, 0x0C, 0x0D, 0x1B,
+ 0x0C, 0x0A, 0x19, 0x0A, 0x0A, 0x18, 0x0A, 0x0A,
+ 0x18, 0x0A, 0x0A, 0x18, 0x0A, 0x06, 0x14, 0x06
+};
+
+static const ByteProvider k1SpecialPalette25PC98Provider = { ARRAYSIZE(k1SpecialPalette25PC98), k1SpecialPalette25PC98 };
+
+static const byte k1SpecialPalette26PC98[48] = {
+ 0x31, 0x38, 0x23, 0x31, 0x38, 0x23, 0x2A, 0x33,
+ 0x1E, 0x24, 0x2F, 0x1A, 0x19, 0x2A, 0x16, 0x18,
+ 0x26, 0x13, 0x13, 0x21, 0x0F, 0x13, 0x21, 0x11,
+ 0x13, 0x21, 0x0F, 0x0E, 0x1D, 0x0D, 0x0E, 0x1D,
+ 0x0D, 0x0E, 0x1D, 0x0D, 0x0D, 0x1B, 0x0C, 0x0A,
+ 0x19, 0x0A, 0x0A, 0x19, 0x0A, 0x06, 0x13, 0x06
+};
+
+static const ByteProvider k1SpecialPalette26PC98Provider = { ARRAYSIZE(k1SpecialPalette26PC98), k1SpecialPalette26PC98 };
+
+static const byte k1SpecialPalette27PC98[48] = {
+ 0x31, 0x38, 0x23, 0x31, 0x38, 0x23, 0x2A, 0x33,
+ 0x1E, 0x24, 0x2F, 0x1A, 0x19, 0x2A, 0x16, 0x18,
+ 0x26, 0x13, 0x13, 0x21, 0x0F, 0x13, 0x21, 0x0F,
+ 0x13, 0x21, 0x0F, 0x0E, 0x1D, 0x0D, 0x0E, 0x1D,
+ 0x0D, 0x0E, 0x1D, 0x0D, 0x0D, 0x1B, 0x0C, 0x0D,
+ 0x19, 0x0C, 0x0D, 0x19, 0x0C, 0x08, 0x16, 0x08
+};
+
+static const ByteProvider k1SpecialPalette27PC98Provider = { ARRAYSIZE(k1SpecialPalette27PC98), k1SpecialPalette27PC98 };
+
+static const byte k1SpecialPalette28PC98[48] = {
+ 0x36, 0x38, 0x2C, 0x31, 0x38, 0x23, 0x2A, 0x33,
+ 0x1E, 0x24, 0x2F, 0x1A, 0x19, 0x2A, 0x16, 0x1E,
+ 0x2A, 0x16, 0x18, 0x26, 0x13, 0x13, 0x21, 0x0F,
+ 0x13, 0x21, 0x0F, 0x13, 0x21, 0x0F, 0x13, 0x21,
+ 0x0F, 0x0E, 0x1D, 0x0D, 0x0D, 0x1B, 0x0C, 0x0D,
+ 0x1B, 0x0C, 0x0D, 0x1B, 0x0C, 0x08, 0x17, 0x08
+};
+
+static const ByteProvider k1SpecialPalette28PC98Provider = { ARRAYSIZE(k1SpecialPalette28PC98), k1SpecialPalette28PC98 };
+
+static const byte k1SpecialPalette29PC98[48] = {
+ 0x36, 0x38, 0x2C, 0x31, 0x38, 0x23, 0x2A, 0x33,
+ 0x1E, 0x24, 0x2F, 0x1A, 0x19, 0x2A, 0x16, 0x1E,
+ 0x2A, 0x16, 0x18, 0x26, 0x13, 0x13, 0x21, 0x0F,
+ 0x13, 0x21, 0x0F, 0x13, 0x21, 0x0F, 0x13, 0x21,
+ 0x0F, 0x13, 0x21, 0x0F, 0x0E, 0x1D, 0x0D, 0x0E,
+ 0x1D, 0x0D, 0x0E, 0x1D, 0x0D, 0x08, 0x17, 0x08
+};
+
+static const ByteProvider k1SpecialPalette29PC98Provider = { ARRAYSIZE(k1SpecialPalette29PC98), k1SpecialPalette29PC98 };
+
+static const byte k1SpecialPalette30PC98[60] = {
+ 0x1E, 0x1D, 0x3F, 0x1A, 0x19, 0x3F, 0x14, 0x12,
+ 0x3B, 0x12, 0x11, 0x37, 0x11, 0x11, 0x33, 0x0F,
+ 0x0E, 0x2F, 0x0E, 0x0D, 0x2C, 0x0D, 0x0C, 0x28,
+ 0x0B, 0x0B, 0x24, 0x0A, 0x0A, 0x20, 0x0A, 0x0A,
+ 0x1D, 0x05, 0x05, 0x18, 0x03, 0x03, 0x13, 0x01,
+ 0x01, 0x11, 0x00, 0x00, 0x0A, 0x00, 0x00, 0x05,
+ 0x00, 0x0A, 0x1A, 0x00, 0x0F, 0x13, 0x00, 0x14,
+ 0x11, 0x0F, 0x0D, 0x00
+};
+
+static const ByteProvider k1SpecialPalette30PC98Provider = { ARRAYSIZE(k1SpecialPalette30PC98), k1SpecialPalette30PC98 };
+
+static const byte k1SpecialPalette31PC98[39] = {
+ 0x2B, 0x19, 0x34, 0x27, 0x17, 0x30, 0x23, 0x14,
+ 0x2C, 0x20, 0x12, 0x27, 0x1C, 0x11, 0x23, 0x18,
+ 0x0E, 0x1E, 0x15, 0x0C, 0x1A, 0x11, 0x0A, 0x15,
+ 0x0E, 0x08, 0x11, 0x0A, 0x05, 0x0C, 0x06, 0x03,
+ 0x08, 0x03, 0x01, 0x03, 0x00, 0x00, 0x00
+};
+
+static const ByteProvider k1SpecialPalette31PC98Provider = { ARRAYSIZE(k1SpecialPalette31PC98), k1SpecialPalette31PC98 };
+
+static const byte k1SpecialPalette32PC98[39] = {
+ 0x12, 0x12, 0x16, 0x11, 0x11, 0x14, 0x0F, 0x0F,
+ 0x12, 0x0D, 0x0D, 0x11, 0x0B, 0x0B, 0x0E, 0x0A,
+ 0x0A, 0x0C, 0x08, 0x08, 0x0A, 0x08, 0x08, 0x08,
+ 0x05, 0x05, 0x06, 0x05, 0x05, 0x05, 0x03, 0x03,
+ 0x03, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00
+};
+
+static const ByteProvider k1SpecialPalette32PC98Provider = { ARRAYSIZE(k1SpecialPalette32PC98), k1SpecialPalette32PC98 };
+
+static const byte k1SpecialPalette33PC98[60] = {
+ 0x3F, 0x3D, 0x2F, 0x3F, 0x3D, 0x29, 0x3F, 0x3D,
+ 0x23, 0x3F, 0x3D, 0x1D, 0x3F, 0x3B, 0x17, 0x3F,
+ 0x3B, 0x11, 0x3F, 0x3B, 0x0B, 0x3F, 0x3B, 0x05,
+ 0x3F, 0x3B, 0x00, 0x3D, 0x38, 0x00, 0x3B, 0x34,
+ 0x00, 0x39, 0x33, 0x00, 0x39, 0x30, 0x00, 0x37,
+ 0x2D, 0x00, 0x36, 0x2B, 0x00, 0x34, 0x28, 0x00,
+ 0x33, 0x26, 0x00, 0x32, 0x24, 0x00, 0x30, 0x22,
+ 0x00, 0x2F, 0x20, 0x00
+};
+
+static const ByteProvider k1SpecialPalette33PC98Provider = { ARRAYSIZE(k1SpecialPalette33PC98), k1SpecialPalette33PC98 };
+
+static const Shape k1Healing1ShapesPC98[22] = {
+ { 8, 0, 0, 3, 48, -12, -48 },
+ { 8, 3, 0, 3, 48, -12, -48 },
+ { 8, 6, 0, 3, 48, -12, -48 },
+ { 8, 9, 0, 3, 48, -12, -48 },
+ { 8, 12, 0, 3, 48, -12, -48 },
+ { 8, 15, 0, 3, 48, -12, -48 },
+ { 8, 18, 0, 3, 48, -12, -48 },
+ { 8, 21, 0, 3, 48, -12, -48 },
+ { 8, 24, 0, 3, 48, -12, -48 },
+ { 8, 27, 0, 3, 48, -12, -48 },
+ { 8, 30, 0, 3, 48, -12, -48 },
+ { 8, 33, 0, 3, 48, -12, -48 },
+ { 8, 0, 48, 3, 48, -12, -48 },
+ { 8, 3, 48, 3, 48, -12, -48 },
+ { 8, 6, 48, 3, 48, -12, -48 },
+ { 8, 9, 48, 3, 48, -12, -48 },
+ { 8, 12, 48, 3, 48, -12, -48 },
+ { 8, 15, 48, 3, 48, -12, -48 },
+ { 8, 18, 48, 3, 48, -12, -48 },
+ { 8, 21, 48, 3, 48, -12, -48 },
+ { 8, 24, 48, 3, 48, -12, -48 },
+ { 8, 27, 48, 3, 48, -12, -48 }
+};
+
+static const ShapeProvider k1Healing1ShapesPC98Provider = { ARRAYSIZE(k1Healing1ShapesPC98), k1Healing1ShapesPC98 };
+
+static const Shape k1Healing2ShapesPC98[30] = {
+ { 9, 0, 0, 3, 48, -11, -48 },
+ { 9, 3, 0, 3, 48, -11, -48 },
+ { 9, 6, 0, 3, 48, -11, -48 },
+ { 9, 9, 0, 3, 48, -11, -48 },
+ { 9, 12, 0, 3, 48, -11, -48 },
+ { 9, 15, 0, 3, 48, -11, -48 },
+ { 9, 18, 0, 3, 48, -11, -48 },
+ { 9, 21, 0, 3, 48, -11, -48 },
+ { 9, 24, 0, 3, 48, -11, -48 },
+ { 9, 27, 0, 3, 48, -11, -48 },
+ { 9, 30, 0, 3, 48, -11, -48 },
+ { 9, 33, 0, 3, 48, -11, -48 },
+ { 9, 0, 48, 3, 48, -11, -48 },
+ { 9, 3, 48, 3, 48, -11, -48 },
+ { 9, 6, 48, 3, 48, -11, -48 },
+ { 9, 9, 48, 3, 48, -11, -48 },
+ { 9, 12, 48, 3, 48, -11, -48 },
+ { 9, 15, 48, 3, 48, -11, -48 },
+ { 9, 18, 48, 3, 48, -11, -48 },
+ { 9, 21, 48, 3, 48, -11, -48 },
+ { 9, 24, 48, 3, 48, -11, -48 },
+ { 9, 27, 48, 3, 48, -11, -48 },
+ { 9, 30, 48, 3, 48, -11, -48 },
+ { 9, 33, 48, 3, 48, -11, -48 },
+ { 9, 0, 96, 3, 48, -11, -48 },
+ { 9, 3, 96, 3, 48, -11, -48 },
+ { 9, 6, 96, 3, 48, -11, -48 },
+ { 9, 9, 96, 3, 48, -11, -48 },
+ { 9, 12, 96, 3, 48, -11, -48 },
+ { 9, 15, 96, 3, 48, -11, -48 }
+};
+
+static const ShapeProvider k1Healing2ShapesPC98Provider = { ARRAYSIZE(k1Healing2ShapesPC98), k1Healing2ShapesPC98 };
+
+static const Shape k1PoisonDeathShapesPC98[20] = {
+ { 19, 0, 0, 8, 48, -31, -48 },
+ { 19, 8, 0, 8, 48, -31, -48 },
+ { 19, 16, 0, 8, 48, -31, -48 },
+ { 19, 24, 0, 8, 48, -31, -48 },
+ { 19, 32, 0, 8, 48, -31, -48 },
+ { 19, 0, 48, 8, 48, -31, -48 },
+ { 19, 8, 48, 8, 48, -31, -48 },
+ { 19, 16, 48, 8, 48, -31, -48 },
+ { 19, 24, 48, 8, 48, -31, -48 },
+ { 19, 32, 48, 8, 48, -31, -48 },
+ { 19, 0, 96, 8, 48, -31, -48 },
+ { 19, 8, 96, 8, 48, -31, -48 },
+ { 19, 16, 96, 8, 48, -31, -48 },
+ { 19, 24, 96, 8, 48, -31, -48 },
+ { 19, 32, 96, 8, 48, -31, -48 },
+ { 19, 0, 144, 8, 48, -31, -48 },
+ { 19, 8, 144, 8, 48, -31, -48 },
+ { 19, 16, 144, 8, 48, -31, -48 },
+ { 19, 24, 144, 8, 48, -31, -48 },
+ { 19, 32, 144, 8, 48, -31, -48 }
+};
+
+static const ShapeProvider k1PoisonDeathShapesPC98Provider = { ARRAYSIZE(k1PoisonDeathShapesPC98), k1PoisonDeathShapesPC98 };
+
+static const Shape k1FluteShapesPC98[36] = {
+ { 13, 0, 0, 3, 75, -12, -75 },
+ { 13, 3, 0, 3, 75, -12, -75 },
+ { 13, 6, 0, 3, 75, -12, -75 },
+ { 13, 9, 0, 3, 75, -12, -75 },
+ { 13, 12, 0, 3, 75, -12, -75 },
+ { 13, 15, 0, 3, 75, -12, -75 },
+ { 13, 18, 0, 3, 75, -12, -75 },
+ { 13, 21, 0, 3, 75, -12, -75 },
+ { 13, 24, 0, 3, 75, -12, -75 },
+ { 13, 27, 0, 3, 75, -12, -75 },
+ { 13, 30, 0, 3, 75, -12, -75 },
+ { 13, 33, 0, 3, 75, -12, -75 },
+ { 13, 36, 75, 3, 75, -12, -75 },
+ { 13, 0, 75, 3, 75, -12, -75 },
+ { 13, 3, 75, 3, 75, -12, -75 },
+ { 13, 6, 75, 3, 75, -12, -75 },
+ { 13, 9, 75, 3, 75, -12, -75 },
+ { 13, 12, 75, 3, 75, -12, -75 },
+ { 13, 15, 75, 3, 75, -12, -75 },
+ { 13, 18, 75, 3, 75, -12, -75 },
+ { 13, 21, 75, 3, 75, -12, -75 },
+ { 13, 24, 75, 3, 75, -12, -75 },
+ { 13, 27, 75, 3, 75, -12, -75 },
+ { 13, 30, 75, 3, 75, -12, -75 },
+ { 13, 33, 75, 3, 75, -12, -75 },
+ { 13, 36, 75, 3, 75, -12, -75 },
+ { 14, 0, 0, 3, 75, -12, -75 },
+ { 14, 3, 0, 3, 75, -12, -75 },
+ { 14, 6, 0, 3, 75, -12, -75 },
+ { 14, 9, 0, 3, 75, -12, -75 },
+ { 14, 12, 0, 3, 75, -12, -75 },
+ { 14, 15, 0, 3, 75, -12, -75 },
+ { 14, 18, 0, 3, 75, -12, -75 },
+ { 14, 21, 0, 3, 75, -12, -75 },
+ { 14, 24, 0, 3, 75, -12, -75 },
+ { 14, 27, 0, 3, 75, -12, -75 }
+};
+
+static const ShapeProvider k1FluteShapesPC98Provider = { ARRAYSIZE(k1FluteShapesPC98), k1FluteShapesPC98 };
+
+static const Shape k1Winter1ShapesPC98[7] = {
+ { 10, 5, 0, 5, 66, -20, -65 },
+ { 10, 10, 0, 5, 66, -20, -65 },
+ { 10, 15, 0, 5, 66, -20, -65 },
+ { 10, 20, 0, 5, 66, -20, -65 },
+ { 10, 25, 0, 5, 66, -20, -65 },
+ { 10, 30, 0, 5, 66, -20, -65 },
+ { 10, 35, 0, 5, 66, -20, -65 }
+};
+
+static const ShapeProvider k1Winter1ShapesPC98Provider = { ARRAYSIZE(k1Winter1ShapesPC98), k1Winter1ShapesPC98 };
+
+static const Shape k1Winter2ShapesPC98[35] = {
+ { 10, 0, 66, 5, 66, -20, -65 },
+ { 10, 5, 66, 5, 66, -20, -65 },
+ { 10, 10, 66, 5, 66, -20, -65 },
+ { 10, 15, 66, 5, 66, -20, -65 },
+ { 10, 20, 66, 5, 66, -20, -65 },
+ { 10, 25, 66, 5, 66, -20, -65 },
+ { 10, 30, 66, 5, 66, -20, -65 },
+ { 10, 35, 66, 5, 66, -20, -65 },
+ { 10, 0, 132, 5, 66, -20, -65 },
+ { 10, 5, 132, 5, 66, -20, -65 },
+ { 10, 10, 132, 5, 66, -20, -65 },
+ { 10, 15, 132, 5, 66, -20, -65 },
+ { 10, 20, 132, 5, 66, -20, -65 },
+ { 10, 25, 132, 5, 66, -20, -65 },
+ { 10, 30, 132, 5, 66, -20, -65 },
+ { 10, 35, 132, 5, 66, -20, -65 },
+ { 11, 0, 0, 5, 66, -20, -65 },
+ { 11, 5, 0, 5, 66, -20, -65 },
+ { 11, 10, 0, 5, 66, -20, -65 },
+ { 11, 15, 0, 5, 66, -20, -65 },
+ { 11, 20, 0, 5, 66, -20, -65 },
+ { 11, 25, 0, 5, 66, -20, -65 },
+ { 11, 30, 0, 5, 66, -20, -65 },
+ { 11, 35, 0, 5, 66, -20, -65 },
+ { 11, 0, 66, 5, 66, -20, -65 },
+ { 11, 5, 66, 5, 66, -20, -65 },
+ { 11, 10, 66, 5, 66, -20, -65 },
+ { 11, 15, 66, 5, 66, -20, -65 },
+ { 11, 20, 66, 5, 66, -20, -65 },
+ { 11, 25, 66, 5, 66, -20, -65 },
+ { 11, 30, 66, 5, 66, -20, -65 },
+ { 11, 35, 66, 5, 66, -20, -65 },
+ { 11, 0, 132, 5, 66, -20, -65 },
+ { 11, 5, 132, 5, 66, -20, -65 },
+ { 11, 10, 132, 5, 66, -20, -65 }
+};
+
+static const ShapeProvider k1Winter2ShapesPC98Provider = { ARRAYSIZE(k1Winter2ShapesPC98), k1Winter2ShapesPC98 };
+
+static const Shape k1Winter3ShapesPC98[4] = {
+ { 11, 15, 132, 5, 66, -20, -65 },
+ { 11, 20, 132, 5, 66, -20, -65 },
+ { 11, 25, 132, 5, 66, -20, -65 },
+ { 11, 30, 132, 5, 66, -20, -65 }
+};
+
+static const ShapeProvider k1Winter3ShapesPC98Provider = { ARRAYSIZE(k1Winter3ShapesPC98), k1Winter3ShapesPC98 };
+
+static const Shape k1DrinkShapesPC98[15] = {
+ { 6, 0, 0, 4, 48, -20, -48 },
+ { 6, 4, 0, 4, 48, -20, -48 },
+ { 6, 8, 0, 4, 48, -20, -48 },
+ { 6, 12, 0, 4, 48, -20, -48 },
+ { 6, 16, 0, 4, 48, -20, -48 },
+ { 6, 20, 0, 5, 48, -20, -48 },
+ { 6, 0, 48, 5, 54, -20, -54 },
+ { 6, 5, 48, 5, 54, -20, -54 },
+ { 6, 10, 48, 5, 54, -20, -54 },
+ { 7, 0, 0, 3, 43, -12, -43 },
+ { 7, 3, 3, 2, 40, -8, -40 },
+ { 7, 5, 7, 2, 36, -8, -36 },
+ { 7, 7, 10, 2, 33, -8, -33 },
+ { 7, 9, 12, 2, 31, -8, -31 },
+ { 7, 11, 15, 2, 28, -8, -28 }
+};
+
+static const ShapeProvider k1DrinkShapesPC98Provider = { ARRAYSIZE(k1DrinkShapesPC98), k1DrinkShapesPC98 };
+
+static const Shape k1WispShapesPC98[26] = {
+ { 12, 0, 0, 5, 48, -20, -48 },
+ { 12, 5, 0, 5, 48, -20, -48 },
+ { 12, 10, 0, 5, 48, -20, -48 },
+ { 12, 15, 0, 5, 48, -20, -48 },
+ { 12, 20, 0, 5, 48, -20, -48 },
+ { 12, 25, 0, 5, 48, -20, -48 },
+ { 12, 30, 0, 5, 48, -20, -48 },
+ { 12, 35, 0, 5, 48, -20, -48 },
+ { 12, 0, 48, 5, 48, -20, -48 },
+ { 12, 5, 48, 5, 48, -20, -48 },
+ { 12, 10, 48, 5, 48, -20, -48 },
+ { 12, 15, 48, 5, 48, -20, -48 },
+ { 12, 20, 48, 5, 48, -20, -48 },
+ { 12, 25, 48, 5, 48, -20, -48 },
+ { 12, 30, 48, 5, 48, -20, -48 },
+ { 12, 35, 48, 5, 48, -20, -48 },
+ { 12, 0, 96, 5, 29, -20, -42 },
+ { 12, 5, 96, 5, 29, -20, -42 },
+ { 12, 10, 96, 5, 29, -20, -42 },
+ { 12, 15, 96, 5, 29, -20, -42 },
+ { 12, 20, 96, 5, 29, -20, -42 },
+ { 12, 25, 96, 5, 29, -20, -42 },
+ { 12, 30, 96, 5, 29, -20, -42 },
+ { 12, 35, 96, 5, 29, -20, -42 },
+ { 12, 0, 125, 5, 29, -20, -42 },
+ { 12, 5, 125, 5, 29, -20, -42 }
+};
+
+static const ShapeProvider k1WispShapesPC98Provider = { ARRAYSIZE(k1WispShapesPC98), k1WispShapesPC98 };
+
+static const Shape k1MagicAnimShapesPC98[5] = {
+ { 17, 0, 0, 8, 49, -32, -49 },
+ { 17, 8, 0, 8, 49, -32, -49 },
+ { 17, 16, 0, 8, 49, -32, -49 },
+ { 17, 24, 0, 8, 49, -32, -49 },
+ { 17, 32, 0, 8, 49, -32, -49 }
+};
+
+static const ShapeProvider k1MagicAnimShapesPC98Provider = { ARRAYSIZE(k1MagicAnimShapesPC98), k1MagicAnimShapesPC98 };
+
+static const Shape k1BranStoneShapesPC98[14] = {
+ { 18, 0, 0, 5, 51, -20, -50 },
+ { 18, 5, 0, 5, 51, -20, -50 },
+ { 18, 10, 0, 5, 51, -20, -50 },
+ { 18, 15, 0, 5, 51, -20, -50 },
+ { 18, 20, 0, 5, 51, -20, -50 },
+ { 18, 25, 0, 5, 51, -20, -50 },
+ { 18, 30, 0, 5, 51, -20, -50 },
+ { 18, 35, 0, 5, 51, -20, -50 },
+ { 18, 0, 51, 5, 51, -20, -50 },
+ { 18, 5, 51, 5, 51, -20, -50 },
+ { 18, 10, 51, 5, 51, -20, -50 },
+ { 18, 15, 51, 5, 51, -20, -50 },
+ { 18, 20, 51, 5, 51, -20, -50 },
+ { 18, 25, 51, 5, 51, -20, -50 }
+};
+
+static const ShapeProvider k1BranStoneShapesPC98Provider = { ARRAYSIZE(k1BranStoneShapesPC98), k1BranStoneShapesPC98 };
+
+static const byte k1OutroReunionSeqPC98[1352] = {
+ 0x1A, 0x00, 0x08, 0x01, 0x06, 0x01, 0x00, 0x02,
+ 0x08, 0x00, 0x50, 0x00, 0x22, 0x07, 0x08, 0x00,
+ 0x14, 0x0A, 0x00, 0x03, 0x08, 0x07, 0x08, 0x00,
+ 0x0B, 0x00, 0x09, 0x00, 0x10, 0x20, 0x5A, 0x00,
+ 0x3A, 0x02, 0x02, 0x08, 0x0D, 0x50, 0x00, 0x22,
+ 0x07, 0x10, 0x00, 0x02, 0x08, 0x0E, 0x50, 0x00,
+ 0x22, 0x07, 0x10, 0x00, 0x02, 0x08, 0x0C, 0x50,
+ 0x00, 0x22, 0x07, 0x10, 0x00, 0x02, 0x08, 0x0B,
+ 0x50, 0x00, 0x22, 0x07, 0x10, 0x00, 0x02, 0x08,
+ 0x0C, 0x50, 0x00, 0x22, 0x07, 0x10, 0x00, 0x02,
+ 0x08, 0x0D, 0x50, 0x00, 0x22, 0x07, 0x10, 0x00,
+ 0x02, 0x08, 0x0E, 0x50, 0x00, 0x22, 0x07, 0x10,
+ 0x00, 0x0A, 0x01, 0x03, 0x08, 0x07, 0x08, 0x00,
+ 0x0B, 0x01, 0x04, 0x00, 0x10, 0x21, 0x5A, 0x00,
+ 0x3A, 0x02, 0x0A, 0x02, 0x02, 0x08, 0x14, 0x50,
+ 0x00, 0x22, 0x07, 0x08, 0x00, 0x03, 0x08, 0x07,
+ 0x08, 0x00, 0x03, 0x08, 0x07, 0x08, 0x00, 0x03,
+ 0x08, 0x07, 0x08, 0x00, 0x03, 0x08, 0x07, 0x08,
+ 0x00, 0x0B, 0x02, 0x01, 0x00, 0x03, 0x08, 0x07,
+ 0x08, 0x00, 0x03, 0x08, 0x07, 0x08, 0x00, 0x03,
+ 0x08, 0x07, 0x08, 0x00, 0x10, 0x22, 0x5A, 0x00,
+ 0x3A, 0x02, 0x0A, 0x03, 0x03, 0x08, 0x07, 0x08,
+ 0x00, 0x0B, 0x03, 0x0B, 0x00, 0x10, 0x23, 0x78,
+ 0x00, 0x3A, 0x0F, 0x0A, 0x03, 0x03, 0x08, 0x07,
+ 0x08, 0x00, 0x0B, 0x03, 0x05, 0x00, 0x06, 0x28,
+ 0x00, 0x02, 0x08, 0x2E, 0x50, 0x00, 0x22, 0x07,
+ 0x10, 0x00, 0x02, 0x08, 0x2D, 0x50, 0x00, 0x22,
+ 0x07, 0x10, 0x00, 0x02, 0x08, 0x2E, 0x50, 0x00,
+ 0x22, 0x07, 0x10, 0x00, 0x02, 0x08, 0x2D, 0x50,
+ 0x00, 0x22, 0x07, 0x10, 0x00, 0x02, 0x08, 0x2E,
+ 0x50, 0x00, 0x22, 0x07, 0x10, 0x00, 0x02, 0x08,
+ 0x2D, 0x50, 0x00, 0x22, 0x07, 0x10, 0x00, 0x02,
+ 0x08, 0x2F, 0x50, 0x00, 0x22, 0x07, 0x08, 0x00,
+ 0x02, 0x08, 0x30, 0x50, 0x00, 0x22, 0x07, 0x08,
+ 0x00, 0x02, 0x08, 0x31, 0x50, 0x00, 0x22, 0x07,
+ 0x08, 0x00, 0x02, 0x08, 0x32, 0x50, 0x00, 0x22,
+ 0x07, 0x08, 0x00, 0x06, 0x0A, 0x00, 0x10, 0x24,
+ 0x5A, 0x00, 0x3A, 0x02, 0x02, 0x08, 0x33, 0x50,
+ 0x00, 0x22, 0x07, 0x08, 0x00, 0x02, 0x08, 0x34,
+ 0x50, 0x00, 0x22, 0x07, 0x08, 0x00, 0x02, 0x08,
+ 0x35, 0x50, 0x00, 0x22, 0x07, 0x08, 0x00, 0x02,
+ 0x08, 0x36, 0x50, 0x00, 0x22, 0x07, 0x08, 0x00,
+ 0x02, 0x08, 0x37, 0x50, 0x00, 0x22, 0x07, 0x08,
+ 0x00, 0x02, 0x08, 0x35, 0x50, 0x00, 0x22, 0x07,
+ 0x08, 0x00, 0x02, 0x08, 0x34, 0x50, 0x00, 0x22,
+ 0x07, 0x08, 0x00, 0x02, 0x08, 0x33, 0x50, 0x00,
+ 0x22, 0x07, 0x08, 0x00, 0x02, 0x08, 0x35, 0x50,
+ 0x00, 0x22, 0x07, 0x08, 0x00, 0x02, 0x08, 0x36,
+ 0x50, 0x00, 0x22, 0x07, 0x08, 0x00, 0x02, 0x08,
+ 0x37, 0x50, 0x00, 0x22, 0x07, 0x08, 0x00, 0x06,
+ 0x0A, 0x00, 0x10, 0x25, 0x5A, 0x00, 0x3A, 0x02,
+ 0x02, 0x08, 0x33, 0x50, 0x00, 0x22, 0x07, 0x08,
+ 0x00, 0x02, 0x08, 0x34, 0x50, 0x00, 0x22, 0x07,
+ 0x08, 0x00, 0x02, 0x08, 0x35, 0x50, 0x00, 0x22,
+ 0x07, 0x08, 0x00, 0x02, 0x08, 0x36, 0x50, 0x00,
+ 0x22, 0x07, 0x08, 0x00, 0x02, 0x08, 0x37, 0x50,
+ 0x00, 0x22, 0x07, 0x08, 0x00, 0x02, 0x08, 0x35,
+ 0x50, 0x00, 0x22, 0x07, 0x08, 0x00, 0x02, 0x08,
+ 0x34, 0x50, 0x00, 0x22, 0x07, 0x08, 0x00, 0x02,
+ 0x08, 0x33, 0x50, 0x00, 0x22, 0x07, 0x08, 0x00,
+ 0x02, 0x08, 0x35, 0x50, 0x00, 0x22, 0x07, 0x08,
+ 0x00, 0x02, 0x08, 0x36, 0x50, 0x00, 0x22, 0x07,
+ 0x08, 0x00, 0x02, 0x08, 0x37, 0x50, 0x00, 0x22,
+ 0x07, 0x08, 0x00, 0x06, 0x1E, 0x00, 0x10, 0x26,
+ 0x78, 0x00, 0x3A, 0x0F, 0x02, 0x08, 0x38, 0x50,
+ 0x00, 0x22, 0x07, 0x08, 0x00, 0x02, 0x08, 0x39,
+ 0x50, 0x00, 0x22, 0x07, 0x08, 0x00, 0x02, 0x08,
+ 0x3A, 0x50, 0x00, 0x22, 0x07, 0x08, 0x00, 0x02,
+ 0x08, 0x38, 0x50, 0x00, 0x22, 0x07, 0x08, 0x00,
+ 0x02, 0x08, 0x3B, 0x50, 0x00, 0x22, 0x07, 0x08,
+ 0x00, 0x06, 0x0A, 0x00, 0x02, 0x08, 0x39, 0x50,
+ 0x00, 0x22, 0x07, 0x08, 0x00, 0x02, 0x08, 0x38,
+ 0x50, 0x00, 0x22, 0x07, 0x08, 0x00, 0x02, 0x08,
+ 0x39, 0x50, 0x00, 0x22, 0x07, 0x08, 0x00, 0x02,
+ 0x08, 0x3A, 0x50, 0x00, 0x22, 0x07, 0x08, 0x00,
+ 0x06, 0x3C, 0x00, 0x11, 0x02, 0x08, 0x33, 0x50,
+ 0x00, 0x22, 0x07, 0x08, 0x00, 0x02, 0x08, 0x32,
+ 0x50, 0x00, 0x22, 0x07, 0x08, 0x00, 0x02, 0x08,
+ 0x31, 0x50, 0x00, 0x22, 0x07, 0x08, 0x00, 0x02,
+ 0x08, 0x30, 0x50, 0x00, 0x22, 0x07, 0x08, 0x00,
+ 0x02, 0x08, 0x2F, 0x50, 0x00, 0x22, 0x07, 0x08,
+ 0x00, 0x02, 0x08, 0x2E, 0x50, 0x00, 0x22, 0x07,
+ 0x08, 0x00, 0x02, 0x08, 0x2D, 0x50, 0x00, 0x22,
+ 0x07, 0x08, 0x00, 0x06, 0x1E, 0x00, 0x02, 0x08,
+ 0x2E, 0x50, 0x00, 0x22, 0x07, 0x08, 0x00, 0x02,
+ 0x08, 0x2F, 0x50, 0x00, 0x22, 0x07, 0x08, 0x00,
+ 0x02, 0x08, 0x30, 0x50, 0x00, 0x22, 0x07, 0x08,
+ 0x00, 0x02, 0x08, 0x31, 0x50, 0x00, 0x22, 0x07,
+ 0x08, 0x00, 0x02, 0x08, 0x32, 0x50, 0x00, 0x22,
+ 0x07, 0x08, 0x00, 0x02, 0x08, 0x33, 0x50, 0x00,
+ 0x22, 0x07, 0x08, 0x00, 0x02, 0x08, 0x41, 0x50,
+ 0x00, 0x22, 0x07, 0x08, 0x00, 0x02, 0x08, 0x42,
+ 0x50, 0x00, 0x22, 0x07, 0x08, 0x00, 0x02, 0x08,
+ 0x43, 0x50, 0x00, 0x22, 0x07, 0x08, 0x00, 0x02,
+ 0x08, 0x44, 0x50, 0x00, 0x22, 0x07, 0x08, 0x00,
+ 0x02, 0x08, 0x45, 0x50, 0x00, 0x22, 0x07, 0x08,
+ 0x00, 0x02, 0x08, 0x46, 0x50, 0x00, 0x22, 0x07,
+ 0x08, 0x00, 0x06, 0x0A, 0x00, 0x10, 0x27, 0x5A,
+ 0x00, 0x3A, 0x02, 0x02, 0x08, 0x4E, 0x50, 0x00,
+ 0x22, 0x07, 0x08, 0x00, 0x02, 0x08, 0x4F, 0x50,
+ 0x00, 0x22, 0x07, 0x08, 0x00, 0x02, 0x08, 0x50,
+ 0x50, 0x00, 0x22, 0x07, 0x08, 0x00, 0x02, 0x08,
+ 0x51, 0x50, 0x00, 0x22, 0x07, 0x08, 0x00, 0x02,
+ 0x08, 0x52, 0x50, 0x00, 0x22, 0x07, 0x08, 0x00,
+ 0x02, 0x08, 0x53, 0x50, 0x00, 0x22, 0x07, 0x08,
+ 0x00, 0x02, 0x08, 0x54, 0x50, 0x00, 0x22, 0x07,
+ 0x08, 0x00, 0x02, 0x08, 0x55, 0x50, 0x00, 0x22,
+ 0x07, 0x08, 0x00, 0x06, 0x78, 0x00, 0x10, 0x28,
+ 0x78, 0x00, 0x3A, 0x0F, 0x0A, 0x05, 0x02, 0x08,
+ 0x59, 0x50, 0x00, 0x22, 0x07, 0x08, 0x00, 0x02,
+ 0x08, 0x5A, 0x50, 0x00, 0x22, 0x07, 0x08, 0x00,
+ 0x02, 0x08, 0x5B, 0x50, 0x00, 0x22, 0x07, 0x08,
+ 0x00, 0x02, 0x08, 0x5C, 0x50, 0x00, 0x22, 0x07,
+ 0x08, 0x00, 0x02, 0x08, 0x5D, 0x50, 0x00, 0x22,
+ 0x07, 0x08, 0x00, 0x0B, 0x05, 0x01, 0x00, 0x06,
+ 0x28, 0x00, 0x10, 0x29, 0x78, 0x00, 0x3A, 0x0F,
+ 0x0A, 0x06, 0x02, 0x08, 0x59, 0x50, 0x00, 0x22,
+ 0x07, 0x08, 0x00, 0x02, 0x08, 0x5A, 0x50, 0x00,
+ 0x22, 0x07, 0x08, 0x00, 0x02, 0x08, 0x5B, 0x50,
+ 0x00, 0x22, 0x07, 0x08, 0x00, 0x02, 0x08, 0x5C,
+ 0x50, 0x00, 0x22, 0x07, 0x08, 0x00, 0x02, 0x08,
+ 0x5D, 0x50, 0x00, 0x22, 0x07, 0x08, 0x00, 0x0B,
+ 0x06, 0x01, 0x00, 0x06, 0x28, 0x00, 0x10, 0x2A,
+ 0x78, 0x00, 0x3A, 0x0F, 0x02, 0x08, 0x5E, 0x50,
+ 0x00, 0x22, 0x07, 0x10, 0x00, 0x02, 0x08, 0x63,
+ 0x50, 0x00, 0x22, 0x07, 0x10, 0x00, 0x06, 0xB4,
+ 0x00, 0x11, 0x18, 0x69, 0x02, 0x08, 0x64, 0x50,
+ 0x00, 0x22, 0x07, 0x10, 0x00, 0x02, 0x08, 0x65,
+ 0x50, 0x00, 0x22, 0x07, 0x10, 0x00, 0x18, 0x74,
+ 0x02, 0x08, 0x66, 0x50, 0x00, 0x22, 0x07, 0x10,
+ 0x00, 0x02, 0x08, 0x67, 0x50, 0x00, 0x22, 0x07,
+ 0x10, 0x00, 0x18, 0x75, 0x02, 0x08, 0x68, 0x50,
+ 0x00, 0x22, 0x07, 0x10, 0x00, 0x02, 0x08, 0x69,
+ 0x50, 0x00, 0x22, 0x07, 0x10, 0x00, 0x10, 0x2B,
+ 0x96, 0x00, 0x1C, 0x22, 0x0A, 0x06, 0x02, 0x08,
+ 0x6B, 0x50, 0x00, 0x22, 0x07, 0x10, 0x00, 0x02,
+ 0x08, 0x6C, 0x50, 0x00, 0x22, 0x07, 0x10, 0x00,
+ 0x02, 0x08, 0x6D, 0x50, 0x00, 0x22, 0x07, 0x10,
+ 0x00, 0x02, 0x08, 0x6E, 0x50, 0x00, 0x22, 0x07,
+ 0x10, 0x00, 0x02, 0x08, 0x6F, 0x50, 0x00, 0x22,
+ 0x07, 0x10, 0x00, 0x02, 0x08, 0x70, 0x50, 0x00,
+ 0x22, 0x07, 0x10, 0x00, 0x02, 0x08, 0x71, 0x50,
+ 0x00, 0x22, 0x07, 0x10, 0x00, 0x0B, 0x06, 0x01,
+ 0x00, 0x06, 0x1E, 0x00, 0x10, 0x2C, 0x96, 0x00,
+ 0x1C, 0x22, 0x0A, 0x06, 0x02, 0x08, 0x6B, 0x50,
+ 0x00, 0x22, 0x07, 0x10, 0x00, 0x02, 0x08, 0x6C,
+ 0x50, 0x00, 0x22, 0x07, 0x10, 0x00, 0x02, 0x08,
+ 0x6D, 0x50, 0x00, 0x22, 0x07, 0x10, 0x00, 0x02,
+ 0x08, 0x6E, 0x50, 0x00, 0x22, 0x07, 0x10, 0x00,
+ 0x02, 0x08, 0x6F, 0x50, 0x00, 0x22, 0x07, 0x10,
+ 0x00, 0x02, 0x08, 0x70, 0x50, 0x00, 0x22, 0x07,
+ 0x10, 0x00, 0x02, 0x08, 0x71, 0x50, 0x00, 0x22,
+ 0x07, 0x10, 0x00, 0x0B, 0x06, 0x01, 0x00, 0x06,
+ 0x1E, 0x00, 0x10, 0x2D, 0x96, 0x00, 0x1C, 0x22,
+ 0x0A, 0x06, 0x02, 0x08, 0x6B, 0x50, 0x00, 0x22,
+ 0x07, 0x10, 0x00, 0x02, 0x08, 0x6C, 0x50, 0x00,
+ 0x22, 0x07, 0x10, 0x00, 0x02, 0x08, 0x6D, 0x50,
+ 0x00, 0x22, 0x07, 0x10, 0x00, 0x02, 0x08, 0x6E,
+ 0x50, 0x00, 0x22, 0x07, 0x10, 0x00, 0x02, 0x08,
+ 0x6F, 0x50, 0x00, 0x22, 0x07, 0x10, 0x00, 0x02,
+ 0x08, 0x70, 0x50, 0x00, 0x22, 0x07, 0x10, 0x00,
+ 0x02, 0x08, 0x71, 0x50, 0x00, 0x22, 0x07, 0x10,
+ 0x00, 0x0B, 0x06, 0x01, 0x00, 0x06, 0x1E, 0x00,
+ 0x02, 0x08, 0x72, 0x50, 0x00, 0x22, 0x07, 0x10,
+ 0x00, 0x02, 0x08, 0x73, 0x50, 0x00, 0x22, 0x07,
+ 0x10, 0x00, 0x06, 0x14, 0x00, 0x02, 0x08, 0x74,
+ 0x50, 0x00, 0x22, 0x07, 0x10, 0x00, 0x02, 0x08,
+ 0x75, 0x50, 0x00, 0x22, 0x07, 0x10, 0x00, 0x06,
+ 0x78, 0x00, 0x13, 0x0E, 0x13, 0x01, 0x08, 0x1D
+};
+
+static const ByteProvider k1OutroReunionSeqPC98Provider = { ARRAYSIZE(k1OutroReunionSeqPC98), k1OutroReunionSeqPC98 };
+
+static const byte k1PC98IntroSfxPC98[768] = {
+ 0x56, 0x00, 0x43, 0x00, 0x7C, 0x00, 0x69, 0x00,
+ 0xA2, 0x00, 0x8F, 0x00, 0x00, 0x00, 0xB5, 0x00,
+ 0x00, 0x00, 0xE5, 0x00, 0x00, 0x00, 0x01, 0x01,
+ 0x00, 0x00, 0x2C, 0x01, 0x00, 0x00, 0x45, 0x01,
+ 0x00, 0x00, 0x54, 0x01, 0x00, 0x00, 0x68, 0x01,
+ 0x8D, 0x01, 0x7C, 0x01, 0xBD, 0x01, 0x9E, 0x01,
+ 0xF0, 0x01, 0xDC, 0x01, 0x00, 0x00, 0x04, 0x02,
+ 0x00, 0x00, 0x2B, 0x02, 0x59, 0x02, 0x40, 0x02,
+ 0xF1, 0x00, 0xFF, 0xF1, 0x09, 0x32, 0x81, 0x49,
+ 0x81, 0x52, 0x81, 0x59, 0x81, 0xF7, 0x01, 0x03,
+ 0xC7, 0x00, 0xFF, 0x42, 0x32, 0xFF, 0xF1, 0x05,
+ 0x30, 0x81, 0x47, 0x81, 0x50, 0x81, 0x57, 0x81,
+ 0xF7, 0x01, 0x03, 0xC7, 0x00, 0xFF, 0x41, 0x32,
+ 0xFF, 0xF1, 0x0C, 0x32, 0x81, 0x49, 0x81, 0x52,
+ 0x81, 0x59, 0x81, 0xF7, 0x01, 0x03, 0xC7, 0x00,
+ 0xFF, 0x42, 0x32, 0xFF, 0xF1, 0x08, 0x30, 0x81,
+ 0x47, 0x81, 0x50, 0x81, 0x57, 0x81, 0xF7, 0x01,
+ 0x03, 0xC7, 0x00, 0xFF, 0x41, 0x32, 0xFF, 0xF1,
+ 0x0F, 0x32, 0x81, 0x49, 0x81, 0x52, 0x81, 0x59,
+ 0x81, 0xF7, 0x01, 0x03, 0xC7, 0x00, 0xFF, 0x42,
+ 0x32, 0xFF, 0xF1, 0x0C, 0x30, 0x81, 0x47, 0x81,
+ 0x50, 0x81, 0x57, 0x81, 0xF7, 0x01, 0x03, 0xC7,
+ 0x00, 0xFF, 0x41, 0x32, 0xFF, 0xF1, 0x0A, 0x39,
+ 0x01, 0x44, 0x01, 0x49, 0x01, 0xFC, 0xF6, 0x05,
+ 0x05, 0xB7, 0x00, 0x39, 0x01, 0x44, 0x01, 0x49,
+ 0x01, 0xF6, 0x02, 0x02, 0xC3, 0x00, 0xFB, 0xFB,
+ 0xFB, 0xFB, 0x39, 0x01, 0x44, 0x01, 0x49, 0x01,
+ 0xF6, 0x02, 0x02, 0xD2, 0x00, 0xFC, 0xFC, 0xF6,
+ 0x05, 0x05, 0xC3, 0x00, 0xFF, 0xF1, 0x0F, 0x69,
+ 0x81, 0x59, 0x81, 0x49, 0x01, 0x39, 0x81, 0x54,
+ 0x01, 0xF6, 0x02, 0x02, 0xED, 0x00, 0x80, 0x04,
+ 0xFB, 0xFB, 0xFB, 0xF6, 0x03, 0x03, 0xED, 0x00,
+ 0xFF, 0xF1, 0x0C, 0x69, 0x81, 0x49, 0x81, 0x59,
+ 0x81, 0x39, 0x01, 0x62, 0x81, 0x57, 0x01, 0x60,
+ 0x01, 0xFC, 0xF6, 0x03, 0x03, 0x0B, 0x01, 0x62,
+ 0x81, 0x57, 0x01, 0x60, 0x01, 0xFB, 0xF6, 0x03,
+ 0x03, 0x17, 0x01, 0xFB, 0xFB, 0xFB, 0xF6, 0x05,
+ 0x05, 0x0B, 0x01, 0xFF, 0xF1, 0x0F, 0xF4, 0x09,
+ 0xF7, 0x01, 0x01, 0x54, 0x01, 0xC8, 0x27, 0x09,
+ 0xF4, 0x42, 0x10, 0x08, 0xFB, 0xF6, 0x0E, 0x0E,
+ 0x3A, 0x01, 0xF4, 0x80, 0xFF, 0xF1, 0x08, 0xF4,
+ 0x41, 0x10, 0x01, 0xFC, 0xF6, 0x07, 0x07, 0x49,
+ 0x01, 0xF4, 0x80, 0xFF, 0xF1, 0x0C, 0xF9, 0x0E,
+ 0xFA, 0x12, 0x64, 0x04, 0x0B, 0x60, 0x03, 0x80,
+ 0x03, 0x60, 0x03, 0x80, 0x03, 0x60, 0x12, 0xFF,
+ 0xF1, 0x0C, 0xF9, 0x0E, 0xFA, 0x12, 0x18, 0x04,
+ 0x0B, 0x70, 0x02, 0x80, 0x02, 0x72, 0x02, 0x80,
+ 0x02, 0x73, 0x0B, 0xFF, 0xF1, 0x0E, 0xF3, 0x00,
+ 0xF7, 0x01, 0x05, 0x39, 0xFF, 0xFF, 0x30, 0x30,
+ 0xF1, 0x07, 0x3B, 0x0A, 0xFF, 0xF1, 0x0C, 0xF3,
+ 0x0A, 0xF7, 0x01, 0x05, 0x39, 0xFF, 0xFF, 0x60,
+ 0x30, 0xF1, 0x05, 0x6B, 0x0A, 0xFF, 0xF1, 0x0E,
+ 0xF3, 0x00, 0xF7, 0x01, 0x05, 0x39, 0xFF, 0xFF,
+ 0x30, 0x30, 0xF1, 0x0C, 0x69, 0x01, 0x75, 0x02,
+ 0x72, 0x01, 0x64, 0x02, 0x70, 0x01, 0xFB, 0xF6,
+ 0x0B, 0x0B, 0xAC, 0x01, 0xFF, 0xF1, 0x0C, 0xF3,
+ 0x0A, 0xF7, 0x01, 0x05, 0x39, 0xFF, 0xFF, 0x60,
+ 0x31, 0xF1, 0x0A, 0x69, 0x01, 0x75, 0x02, 0x72,
+ 0x01, 0x64, 0x02, 0x70, 0x01, 0xFB, 0xF6, 0x09,
+ 0x09, 0xCB, 0x01, 0xFF, 0xF1, 0x0F, 0xF3, 0x00,
+ 0x24, 0x81, 0x29, 0x01, 0xF6, 0x08, 0x08, 0xE0,
+ 0x01, 0xFB, 0xF6, 0x0E, 0x0E, 0xE0, 0x01, 0xFF,
+ 0xF1, 0x0F, 0xF3, 0x0D, 0x24, 0x81, 0x22, 0x01,
+ 0xF6, 0x08, 0x08, 0xF4, 0x01, 0xFB, 0xF6, 0x0E,
+ 0x0E, 0xF4, 0x01, 0xFF, 0xF1, 0x0C, 0x29, 0x81,
+ 0xFC, 0x24, 0x81, 0xFC, 0x29, 0x81, 0xFC, 0x34,
+ 0x81, 0x35, 0x81, 0x36, 0x81, 0x35, 0x81, 0x34,
+ 0x81, 0x33, 0x81, 0x32, 0x81, 0x33, 0x01, 0xF6,
+ 0x02, 0x02, 0x0F, 0x02, 0xFB, 0xF6, 0x0E, 0x0E,
+ 0x0F, 0x02, 0xFF, 0xF1, 0x0F, 0xF4, 0x0B, 0x29,
+ 0x81, 0x27, 0x81, 0xF4, 0x43, 0x29, 0x02, 0xFB,
+ 0xF6, 0x0E, 0x0E, 0x35, 0x02, 0xF4, 0x80, 0xFF,
+ 0xF1, 0x0E, 0xF7, 0x01, 0x01, 0x09, 0x03, 0xFF,
+ 0x44, 0x08, 0xF1, 0x0C, 0xF7, 0x01, 0x04, 0xC8,
+ 0x00, 0xFF, 0x1B, 0x1E, 0xF1, 0x06, 0x1B, 0x1E,
+ 0xFF, 0xF1, 0x0F, 0xF4, 0x4F, 0xF7, 0x01, 0x05,
+ 0xC7, 0x00, 0xFF, 0x19, 0x04, 0xF7, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0xF4, 0x0F, 0xFB, 0x10, 0x04,
+ 0xFB, 0xF6, 0x07, 0x07, 0x6E, 0x02, 0xF1, 0x08,
+ 0x10, 0x04, 0xFB, 0xF6, 0x07, 0x07, 0x78, 0x02,
+ 0xF4, 0x80, 0xFF, 0xF1, 0x0F, 0xFF, 0xFF, 0xFF,
+ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF
+};
+
+static const ByteProvider k1PC98IntroSfxPC98Provider = { ARRAYSIZE(k1PC98IntroSfxPC98), k1PC98IntroSfxPC98 };
+
diff --git a/devtools/create_kyradat/resources/lok_pc98_japanese.h b/devtools/create_kyradat/resources/lok_pc98_japanese.h
new file mode 100644
index 0000000000..0cbc96aeb9
--- /dev/null
+++ b/devtools/create_kyradat/resources/lok_pc98_japanese.h
@@ -0,0 +1,558 @@
+static const char *const k1IntroStringsPC98Japanese[50] = {
+ "This is a text test - 1",
+ "This is a text test - 2",
+ "\x8B""v""\x82\xB5\x90""U""\x82\xE8\x82\xBE\x82\xC8\x81""A""\x83""J""\x83\x89\x83""b""\x83""N""\x81""E""\x81""E""\x81""E",
+ "\x81""E""\x81""E""\x81""E""\x89\xA4\x8E\xBA\x96\x82\x8F""p""\x8E""t""\x82\xCC\x8E""w""\x93\xB1\x8E\xD2\x93""a""\x81""I",
+ "\x82\xA0\x82\xF1\x82\xBD\x82\xF0\x8B\xC1\x82\xA9\x82\xB5\x82\xBD\x82\xA9\x82\xC8\x81""H",
+ "\x83""}""\x83\x8B\x83""R""\x83\x80\x81""I",
+ "\x8B""M""\x97""l""\x82\xCC\x92""E""\x91\x96\x82\xC9\x82\xC2\x82\xA2\x82\xC4\x82\xCD\x8D\xF0\x93\xFA\x95\xF1\x8D\x90\x82\xF0\x8E\xF3\x82\xAF\x82\xC4\x82\xA2\x82\xBD\x81""B",
+ "\x82\xBB\x82\xEA\x82\xC5\x82\xA8\x91""O""\x82\xAA\x97\x88\x82\xE9\x82\xCC\x82\xF0\x91\xD2\x82\xC1\x82\xC4\x82\xA2\x82\xBD\x82\xF1\x82\xBE\x81""B",
+ "\x89\xBD\x8C\xCC\x82\xA8\x82\xEA\x97""l""\x82\xAA\x97\x88\x82\xBD\x82\xA9\x95\xAA\x82\xA9\x82\xE9\x82\xA9\x81""H",
+ "\x82\xC2\x82\xA2\x82\xC9\x81""A""\x82\xB1\x82\xCC\x8D\x91\x82\xF0\x8F\xE6\x82\xC1\x8E\xE6\x82\xC1\x82\xBD\x82\xBC\x81""I",
+ "\x8B""M""\x97""l""\x82\xCC\x82\xC2\x82\xDC\x82\xE7\x82\xF1\x8B\xBA\x94\x97\x82\xC8\x82\xC7\x82\xC5\x82\xA8\x82\xEA\x97""l""\x82\xF0\x94\x9B\x82\xEA\x82\xE9\x82\xE0\x82\xCC\x82\xA9\x81""B",
+ "\x82\xB3\x82\xA0\x81""A""\x82\xE2\x82\xE9\x82\xC8\x82\xE7\x82\xE2\x82\xC1\x82\xC4\x82\xDD\x82\xEB\x81""I",
+ "\x82\xED\x82\xB5\x82\xC9\x82\xE0\x82\xED\x82\xB8\x82\xA9\x82\xBE\x82\xAA\x96\x82\x97\xCD\x82\xAA\x8E""c""\x82\xC1\x82\xC4\x82\xA8\x82\xE9\x82\xED\x82\xA2\x81""B",
+ "\x82\xA8\x91""O""\x82\xF0\x82\xE2\x82\xC1\x82\xC2\x82\xAF\x82\xE9\x82\xC6\x82\xA2\x82\xA4\x82\xB1\x82\xC6\x82\xB3\x81""E""\x81""E""\x81""E",
+ "\x81""E""\x81""E""\x81""E""\x82\xE0\x82\xCD\x82\xE2\x82\xA8\x91""O""\x82\xCD\x90\xCE\x82\xC6\x82\xC8\x82\xC1\x82\xBD\x81""E""\x81""E""\x81""E",
+ "\x81""E""\x81""E""\x81""E""\x82\xBE\x82\xAA\x96\xDA\x82\xBE\x82\xAF\x82\xCD\x8C\xA9\x82\xA6\x82\xE9\x82\xDC\x82\xDC\x82\xC9\x82\xB5\x82\xC4\x82\xA8\x82\xB1\x82\xA4\x81""B",
+ "\x82\xA8\x82\xEA\x97""l""\x82\xCD\x83""L""\x83\x89\x83\x93\x83""f""\x83""B""\x83""A""\x82\xC9\x82\xCD\x82\xC8\x82\xF1\x82\xCC\x8A\xB4\x8F\x9D\x82\xE0\x82\xC8\x82\xA2\x81""E""\x81""E""\x81""E",
+ "\x81""E""\x81""E""\x81""E""\x82\xBE\x82\xAA\x81""A""\x82\xA8\x91""O""\x82\xBD\x82\xBF\x82\xCD\x82\xC7\x82\xA4\x82\xA9\x82\xC8\x81""B",
+ "\x8B""{""\x92\xEC\x93\xB9\x89\xBB\x8E""t""\x82\xCC\x83""}""\x83\x8B\x83""R""\x83\x80\x82\xAA\x98""S""\x82\xF0\x94""j""\x82\xC1\x82\xBD\x81""I",
+ "\x8D\xA1\x82\xE2\x94\xDE\x82\xCD\x83""L""\x83\x89\x83\x93\x83""f""\x83""B""\x83""A""\x82\xCC\x82\xB7\x82\xD7\x82\xC4\x82\xCC\x96\x82\x97\xCD\x82\xCC\x8D\xAA\x8C\xB9\x82\xBD\x82\xE9\x81""E""\x81""E""\x81""E",
+ "\x81""E""\x81""E""\x81""E""\x83""L""\x83\x89\x83\x93\x83""W""\x83""F""\x83\x80\x82\xF0\x8E\xE8\x92\x86\x82\xC9\x8E\xFB\x82\xDF\x82\xC4\x82\xA2\x82\xE9\x81""I",
+ "",
+ "\x89\xBD\x82\xC5\x82\xA8\x82\xEA\x97""l""\x82\xF0\x82\xC2\x82\xDC\x82\xB8\x82\xA9\x82\xB9\x82\xBD\x81""I",
+ "\x82\xE6\x82\xB5\x81""A""\x82\xA8\x91""O""\x82\xC9\x82\xB7\x82\xCE\x82\xE7\x82\xB5\x82\xA2\x91\xA1\x82\xE8\x95\xA8\x82\xF0\x82\xE2\x82\xEB\x82\xA4\x81""E""\x81""E""\x81""E",
+ "\x82\xB1\x82\xEA\x82\xAA\x82\xA8\x82\xEA\x97""l""\x82\xCC\x83\x86\x81""[""\x83\x82\x83""A""\x82\xB3\x81""I",
+ "\x82\xBE\x82\xAA\x81""A""\x83""t""\x83""F""\x83""A""\x82\xC8\x82\xA8\x82\xEA\x97""l""\x82\xCD\x8C""x""\x8D\x90\x82\xF0\x82\xB7\x82\xE9\x82\xC2\x82\xE0\x82\xE8\x82\xB3\x81""B",
+ "\x82\xA0\x82\xCC\x96\xD8\x82\xC9\x82\xCD\x93""o""\x82\xE9\x82\xC8\x82\xE6\x81""I",
+ "\x82\xBF\x82\xC1\x82\xB1\x82\xA2\x83\x8A\x83""X""\x82\xDF\x81""A""\x82\xA0\x82\xCC\x96\xD8\x82\xC9\x82\xCD\x93""o""\x82\xE9\x82\xC8\x81""I",
+ "\x83""u""\x83""D""\x81""[""\x81""I",
+ "\x82\xB1\x82\xA2\x82\xC2\x82\xCD\x96\xCA\x94\x92\x82\xA2\x82\xE2\x81""E""\x81""E""\x81""E",
+ "\x81""E""\x81""E""\x81""E""\x82\xBB\x82\xA4\x8E""v""\x82\xED\x82\xF1\x82\xA9\x81""H",
+ "\x82\xCD\x82\xC1\x81""A""\x82\xCD\x82\xC1\x82\xCD\x81""E""\x81""E""\x81""E",
+ "\x8C\xB3\x82\xC9\x96\xDF\x82\xC1\x82\xBD\x82\xCC\x82\xA9\x81""H",
+ "\x90\xB6\x82\xAB\x82\xC4\x82\xA2\x82\xE9\x82\xB1\x82\xC6\x82\xCD\x82\xB7\x82\xCE\x82\xE7\x82\xB5\x82\xA2\x81""I",
+ "\x83""u""\x83\x89\x83\x93\x83""h""\x83\x93\x81""I",
+ "\x82\xA8\x91""c""\x95\x83\x82\xB3\x82\xF1\x81""I""\x96""l""\x82\xBD\x82\xBF\x82\xCD\x82\xE2\x82\xE8\x82\xDC\x82\xB5\x82\xBD\x82\xCB\x81""I",
+ "\x82\xA2\x82\xA2\x82\xE2\x81""I""\x82\xE2\x82\xC1\x82\xBD\x82\xCC\x82\xCD\x82\xA8\x91""O""\x81""I",
+ "\x83""u""\x83\x89\x83\x93\x83""h""\x83\x93\x89\xA4\x81""@""\x82\xCE\x82\xF1\x82\xB4\x82\xA2\x81""I",
+ "\x89\xA4\x8E\xBA\x96\x82\x8F""p""\x8E""t""\x81""@""\x82\xCE\x82\xF1\x82\xB4\x82\xA2\x81""I",
+ "\x82\xB3\x82\xA0\x81""A""\x8B\xA4\x82\xC9\x83""L""\x83\x89\x83\x93\x83""f""\x83""B""\x83""A""\x82\xF0\x95\x9C\x8B\xBB\x82\xB5\x82\xE6\x82\xA4\x81""I",
+ "\x91\xE5\x8E""^""\x90\xAC\x81""I",
+ "\x96""l""\x82\xCC\x89\xA4\x82\xC6\x82\xB5\x82\xC4\x82\xCC\x8D\xC5\x8F\x89\x82\xCC\x95""z""\x8D\x90\x82\xCD\x81""E""\x81""E""\x81""E",
+ "\x83""T""\x83\x93\x83""_""\x83\x8B\x82\xF0\x83""L""\x83\x89\x83\x93\x83""f""\x83""B""\x83""A""\x82\xCC\x8C\xF6\x8E\xAE\x82\xC8\x97\x9A\x95\xA8\x82\xC6\x82\xB7\x82\xE9\x82\xB1\x82\xC6\x82\xC5\x82\xB7\x81""I",
+ "\x82\xE6\x82\xAD\x82\xE2\x82\xC1\x82\xBD\x81""I""\x83""u""\x83\x89\x83\x93\x83""h""\x83\x93\x81""B",
+ "\x8E\xA9\x91""R""\x8A""E""\x82\xCD\x82\xE6\x82\xEB\x82\xB1\x82\xD1\x82\xC9\x82\xA0\x82\xD3\x82\xEA\x81""E""\x81""E""\x81""E",
+ "\x82\xA0\x82\xC8\x82\xBD\x82\xCC\x97""F""\x90""l""\x92""B""\x82\xE0\x8F\x95\x82\xA9\x82\xC1\x82\xBD\x82\xCC\x82\xC5\x82\xB7\x81""I",
+ "\x83""u""\x83\x8A\x83\x93\x82\xE6\x81""E""\x81""E""\x81""E",
+ "\x83""}""\x83\x8B\x83""R""\x83\x80\x82\xAA\x98""S""\x82\xF0\x94""j""\x82\xC1\x82\xBD\x81""I",
+ "\x82\xDC\x82\xE0\x82\xC8\x82\xAD\x93""z""\x82\xCD\x82\xED\x82\xB5\x82\xCC\x82\xC6\x82\xB1\x82\xEB\x82\xD6\x97\x88\x82\xE9\x82\xBE\x82\xEB\x82\xA4\x81""B",
+ "\x82\xC7\x82\xA4\x82\xA9\x83""u""\x83\x89\x83\x93\x83""h""\x83\x93\x82\xF0\x8F\x95\x82\xAF\x82\xC4\x82\xE2\x82\xC1\x82\xC4\x82\xA8\x82\xAD\x82\xEA\x81""E""\x81""E""\x81""E"
+};
+
+static const StringListProvider k1IntroStringsPC98JapaneseProvider = { ARRAYSIZE(k1IntroStringsPC98Japanese), k1IntroStringsPC98Japanese };
+
+static const char *const k1ItemNamesPC98Japanese[107] = {
+ "\x83""K""\x81""[""\x83""l""\x83""b""\x83""g",
+ "\x83""A""\x83\x81\x83""W""\x83""X""\x83""g",
+ "\x83""A""\x83""N""\x83""A""\x83""}""\x83\x8A\x83\x93",
+ "\x83""_""\x83""C""\x83""A""\x83\x82\x83\x93\x83""h",
+ "\x83""G""\x83\x81\x83\x89\x83\x8B\x83""h",
+ "\x83""p""\x81""[""\x83\x8B",
+ "\x83\x8B\x83""r""\x81""[",
+ "\x83""y""\x83\x8A\x83""h""\x81""[""\x83""g",
+ "\x83""T""\x83""t""\x83""@""\x83""C""\x83""A",
+ "\x83""I""\x83""p""\x81""[""\x83\x8B",
+ "\x83""g""\x83""p""\x81""[""\x83""Y",
+ "\x83""I""\x83""j""\x83""L""\x83""X",
+ "\x83""T""\x83\x93\x83""X""\x83""g""\x81""[""\x83\x93",
+ "\x83\x80\x81""[""\x83\x93\x83""X""\x83""g""\x81""[""\x83\x93",
+ "\x83\x8C\x83""C""\x83\x93\x83""{""\x81""[""\x83""X""\x83""g""\x81""[""\x83\x93",
+ "\x83\x8D\x81""[""\x83""h""\x83""X""\x83""g""\x81""[""\x83\x93",
+ "\x83""o""\x83\x89",
+ "\x83""`""\x83\x85\x81""[""\x83\x8A\x83""b""\x83""v",
+ "\x83\x89\x83\x93",
+ "\x8B\xE2\x82\xCC\x83""o""\x83\x89",
+ "\x8B\xE2\x82\xCC\x8F\xAC\x91\x9C",
+ "\x8B\xE2\x89\xDD",
+ "\x8B\xE0\x89\xDD",
+ "\x8B\xE0\x82\xCC\x83\x8A\x83\x93\x83""O",
+ "\x90\xB9\x94""t",
+ "\x8F\xBC\x82\xDA\x82\xC1\x82\xAD\x82\xE8",
+ "\x82\xC7\x82\xF1\x82\xAE\x82\xE8",
+ "\x83""N""\x83\x8B\x83""~",
+ "\x94""R""\x82\xA6\x82\xE9\x83""t""\x83""@""\x83""C""\x83""A""\x83""x""\x83\x8A\x81""[",
+ "\x83""t""\x83""@""\x83""C""\x83""A""\x83""x""\x83\x8A\x81""[",
+ "\x83""t""\x83""@""\x83""C""\x83""A""\x83""x""\x83\x8A\x81""[",
+ "\x83""t""\x83""@""\x83""C""\x83""A""\x83""x""\x83\x8A\x81""[",
+ "\x83""t""\x83""@""\x83""C""\x83""A""\x83""x""\x83\x8A\x81""[",
+ "\x83""t""\x83""@""\x83""C""\x83""A""\x83""x""\x83\x8A\x81""[",
+ "\x82\xB3\x82\xA9\x82\xC8",
+ "\x82\xB3\x82\xA9\x82\xC8\x82\xCC\x8D\x9C",
+ "\x97""r""\x82\xCC\x91\xAB",
+ "\x8D\x9C",
+ "\x83\x8A\x83\x93\x83""S",
+ "\x83\x8A\x83\x93\x83""S""\x82\xCC\x90""c",
+ "\x83""u""\x83\x8B\x81""[""\x83""x""\x83\x8A\x81""[",
+ "\x83""L""\x83""m""\x83""R",
+ "\x83""m""\x81""[""\x83""g",
+ "\x91\xE5\x97\x9D\x90\xCE",
+ "\x82\xCC\x82\xB1\x82\xAC\x82\xE8",
+ "\x83""A""\x83\x93\x83""N",
+ "\x89""H""\x8D\xAA",
+ "\x83""^""\x83""}""\x83""S",
+ "\x97""t""\x82\xC1\x82\xCF",
+ "\x94\x92\x92\xDC\x91\x90",
+ "\x97\x8E\x82\xBF\x82\xBD\x90\xAF",
+ "\x83""N""\x83\x8A\x83""X""\x83""^""\x83\x8B\x82\xCC\x8E\xEC",
+ "\x97\xDC\x82\xCC\x82\xB5\x82\xB8\x82\xAD",
+ "\x8B\xBE",
+ "\x95""X""\x82\xCC\x82\xA9\x82\xAF\x82\xE7",
+ "\x83""t""\x83\x8B\x81""[""\x83""g",
+ "\x8D\xBB\x8E\x9E\x8C""v",
+ "\x93""S""\x82\xCC\x8C\xAE",
+ "\x82\xD0\x82\xB7\x82\xA2\x82\xCC\x8C\xAE",
+ "\x8D\x95\x97""j""\x90\xCE\x82\xCC\x8C\xAE",
+ "\x90\xD4\x82\xCC\x83""|""\x81""[""\x83""V""\x83\x87\x83\x93",
+ "\x90\xD4\x82\xCC\x83""|""\x81""[""\x83""V""\x83\x87\x83\x93",
+ "\x90\xC2\x82\xCC\x83""|""\x81""[""\x83""V""\x83\x87\x83\x93",
+ "\x90\xC2\x82\xCC\x83""|""\x81""[""\x83""V""\x83\x87\x83\x93",
+ "\x89\xA9\x90""F""\x82\xCC\x83""|""\x81""[""\x83""V""\x83\x87\x83\x93",
+ "\x89\xA9\x90""F""\x82\xCC\x83""|""\x81""[""\x83""V""\x83\x87\x83\x93",
+ "\x97\xCE\x82\xCC\x83""|""\x81""[""\x83""V""\x83\x87\x83\x93",
+ "\x83""I""\x83\x8C\x83\x93\x83""W""\x90""F""\x82\xCC\x83""|""\x81""[""\x83""V""\x83\x87\x83\x93",
+ "\x8E\x87\x90""F""\x82\xCC\x83""|""\x81""[""\x83""V""\x83\x87\x83\x93",
+ "\x93\xF8\x90""F""\x82\xCC\x83""|""\x81""[""\x83""V""\x83\x87\x83\x93",
+ "\x90""V""\x91""N""\x82\xC8\x90\x85",
+ "\x90""V""\x91""N""\x82\xC8\x90\x85",
+ "\x89\x96\x90\x85",
+ "\x89\x96\x90\x85",
+ "\x83""~""\x83""l""\x83\x89\x83\x8B\x83""E""\x83""H""\x81""[""\x83""^""\x81""[",
+ "\x83""~""\x83""l""\x83\x89\x83\x8B\x83""E""\x83""H""\x81""[""\x83""^""\x81""[",
+ "\x96\x82\x96""@""\x82\xCC\x90\x85",
+ "\x96\x82\x96""@""\x82\xCC\x90\x85",
+ "\x8B\xF3\x82\xC1\x82\xDB\x82\xCC\x83""t""\x83\x89\x83""X""\x83""R",
+ "\x8B\xF3\x82\xC1\x82\xDB\x82\xCC\x83""t""\x83\x89\x83""X""\x83""R",
+ "\x83""X""\x83""N""\x83\x8D\x81""[""\x83\x8B",
+ "\x83""X""\x83""N""\x83\x8D\x81""[""\x83\x8B",
+ "\x83""X""\x83""N""\x83\x8D\x81""[""\x83\x8B",
+ "\x83""X""\x83""N""\x83\x8D\x81""[""\x83\x8B",
+ "\x83""X""\x83""N""\x83\x8D\x81""[""\x83\x8B",
+ "\x83""X""\x83""N""\x83\x8D\x81""[""\x83\x8B",
+ "\x83""X""\x83""N""\x83\x8D\x81""[""\x83\x8B",
+ "\x83""X""\x83""N""\x83\x8D\x81""[""\x83\x8B",
+ "\x83""X""\x83""N""\x83\x8D\x81""[""\x83\x8B",
+ "\x83""X""\x83""N""\x83\x8D\x81""[""\x83\x8B",
+ "\x97""r""\x94\xE7\x8E\x86\x82\xCC\x90\xD8\x82\xEA\x92""[",
+ "\x97""r""\x94\xE7\x8E\x86\x82\xCC\x90\xD8\x82\xEA\x92""[",
+ "\x97""r""\x94\xE7\x8E\x86\x82\xCC\x90\xD8\x82\xEA\x92""[",
+ "\x97""r""\x94\xE7\x8E\x86\x82\xCC\x90\xD8\x82\xEA\x92""[",
+ "\x97""r""\x94\xE7\x8E\x86\x82\xCC\x90\xD8\x82\xEA\x92""[",
+ "\x90\xD4\x82\xCC\x83\x81\x83""K""\x83""X""\x83""g""\x81""[""\x83\x93",
+ "\x83""I""\x83\x8C\x83\x93\x83""W""\x90""F""\x82\xCC\x83\x81\x83""K""\x83""X""\x83""g""\x81""[""\x83\x93",
+ "\x89\xA9\x90""F""\x82\xCC\x83\x81\x83""K""\x83""X""\x83""g""\x81""[""\x83\x93",
+ "\x97\xCE\x82\xCC\x83\x81\x83""K""\x83""X""\x83""g""\x81""[""\x83\x93",
+ "\x90\xC2\x97\xCE\x82\xCC\x83\x81\x83""K""\x83""X""\x83""g""\x81""[""\x83\x93",
+ "\x90\xC2\x82\xCC\x83\x81\x83""K""\x83""X""\x83""g""\x81""[""\x83\x93",
+ "\x8E\x87\x90""F""\x82\xCC\x83\x81\x83""K""\x83""X""\x83""g""\x81""[""\x83\x93",
+ "\x8F""d""\x82\xA2\x90\xCE",
+ "\x89\xA4\x8A\xA5",
+ "\x89\xA4\xE2\x94",
+ "\x8B\xE0\x82\xCC\x8C\xAE",
+ "\x95\xAA\x82\xA9\x82\xE7\x82\xC8\x82\xA2\x82\xE0\x82\xCC"
+};
+
+static const StringListProvider k1ItemNamesPC98JapaneseProvider = { ARRAYSIZE(k1ItemNamesPC98Japanese), k1ItemNamesPC98Japanese };
+
+static const char *const k1TakenStringsPC98Japanese[2] = {
+ "\x82\xF0\x8E\xE6\x82\xC1\x82\xBD\x81""B",
+ "\x82\xF0\x8E\xE6\x82\xC1\x82\xBD\x81""B"
+};
+
+static const StringListProvider k1TakenStringsPC98JapaneseProvider = { ARRAYSIZE(k1TakenStringsPC98Japanese), k1TakenStringsPC98Japanese };
+
+static const char *const k1PlacedStringsPC98Japanese[1] = {
+ "\x82\xF0\x82\xB5\x82\xDC\x82\xC1\x82\xBD\x81""B"
+};
+
+static const StringListProvider k1PlacedStringsPC98JapaneseProvider = { ARRAYSIZE(k1PlacedStringsPC98Japanese), k1PlacedStringsPC98Japanese };
+
+static const char *const k1DroppedStringsPC98Japanese[1] = {
+ "\x82\xF0\x92""u""\x82\xA2\x82\xBD\x81""B"
+};
+
+static const StringListProvider k1DroppedStringsPC98JapaneseProvider = { ARRAYSIZE(k1DroppedStringsPC98Japanese), k1DroppedStringsPC98Japanese };
+
+static const char *const k1NoDropStringsPC98Japanese[2] = {
+ "\x82\xB1\x82\xCC\x8F\xEA\x96\xCA\x82\xC5\x82\xCD\x81""A""\x82\xB1\x82\xEA\x88\xC8\x8F\xE3\x83""A""\x83""C""\x83""e""\x83\x80\x82\xAA\x92""u""\x82\xAF\x82\xDC\x82\xB9\x82\xF1\x81""B",
+ "\x82\xB1\x82\xB1\x82\xC9\x82\xCD\x92""u""\x82\xAF\x82\xDC\x82\xB9\x82\xF1\x81""B"
+};
+
+static const StringListProvider k1NoDropStringsPC98JapaneseProvider = { ARRAYSIZE(k1NoDropStringsPC98Japanese), k1NoDropStringsPC98Japanese };
+
+static const char *const k1PutDownStringPC98Japanese[1] = {
+ "\x82\xDC\x82\xB8\x81""A""\x82\xB1\x82\xEA\x82\xF0\x92""u""\x82\xA2\x82\xC4\x82\xA9\x82\xE7\x82\xCC\x95\xFB\x82\xAA\x82\xE6\x82\xB3\x82\xBB\x82\xA4\x82\xBE\x81""B"
+};
+
+static const StringListProvider k1PutDownStringPC98JapaneseProvider = { ARRAYSIZE(k1PutDownStringPC98Japanese), k1PutDownStringPC98Japanese };
+
+static const char *const k1WaitAmuletStringPC98Japanese[1] = {
+ "\x83""A""\x83""~""\x83\x85\x83\x8C\x83""b""\x83""g""\x82\xC9\x97\xCD\x82\xAA\x96\xDF\x82\xE9\x82\xDC\x82\xC5\x91\xD2\x82\xC1\x82\xC4\x82\xDD\x82\xE6\x82\xA4\x81""B"
+};
+
+static const StringListProvider k1WaitAmuletStringPC98JapaneseProvider = { ARRAYSIZE(k1WaitAmuletStringPC98Japanese), k1WaitAmuletStringPC98Japanese };
+
+static const char *const k1BlackJewelStringPC98Japanese[1] = {
+ "\x82\xB1\x82\xEA\x82\xCD\x95\xF3\x90\xCE\x82\xC9\x82\xCD\x88\xE1\x82\xA2\x82\xC8\x82\xA2\x82\xAA\x81""A""\x82\xC7\x82\xA4\x82\xB5\x82\xC4\x82\xDC\x82\xC1\x8D\x95\x82\xC8\x82\xF1\x82\xBE\x82\xEB\x82\xA4\x81""H"
+};
+
+static const StringListProvider k1BlackJewelStringPC98JapaneseProvider = { ARRAYSIZE(k1BlackJewelStringPC98Japanese), k1BlackJewelStringPC98Japanese };
+
+static const char *const k1HealingTipStringPC98Japanese[1] = {
+ "\x82\xA0\x82\xEA\x81""A""\x82\xB1\x82\xEA\x82\xCD\x8F\x9D\x82\xC2\x82\xA2\x82\xBD\x82\xE0\x82\xCC\x82\xF0\x8E\xA1\x82\xB7\x96\x82\x96""@""\x82\xC8\x82\xF1\x82\xBE\x81""B"
+};
+
+static const StringListProvider k1HealingTipStringPC98JapaneseProvider = { ARRAYSIZE(k1HealingTipStringPC98Japanese), k1HealingTipStringPC98Japanese };
+
+static const char *const k1PoisonGoneStringPC98Japanese[2] = {
+ "\x82\xB7\x82\xB2\x82\xA2\x81""I",
+ "\x93\xC5\x82\xAA\x8F\xC1\x82\xA6\x82\xBD\x81""I"
+};
+
+static const StringListProvider k1PoisonGoneStringPC98JapaneseProvider = { ARRAYSIZE(k1PoisonGoneStringPC98Japanese), k1PoisonGoneStringPC98Japanese };
+
+static const char *const k1ThePoisonStringsPC98Japanese[3] = {
+ "\x93\xC5\x82\xBE\x81""E""\x81""E""\x81""E",
+ "\x8C\xC4\x8B""z""\x82\xAA\x8F""o""\x97\x88\x82\xC8\x82\xA2\x81""E""\x81""E""\x81""E",
+ "\x8B""C""\x95\xAA\x82\xAA\x88\xAB\x82\xA2\x81""E""\x81""E""\x81""E"
+};
+
+static const StringListProvider k1ThePoisonStringsPC98JapaneseProvider = { ARRAYSIZE(k1ThePoisonStringsPC98Japanese), k1ThePoisonStringsPC98Japanese };
+
+static const char *const k1FluteStringsPC98Japanese[2] = {
+ "\x82\xA0\x82\xDC\x82\xE8\x82\xA2\x82\xA2\x89\xB9\x90""F""\x82\xB6\x82\xE1\x82\xC8\x82\xA2\x82\xC8\x81""B",
+ "\x8D\xC5\x8C\xE3\x82\xCD\x82\xC6\x82\xC4\x82\xE0\x8D\x82\x82\xA2\x89\xB9\x82\xBE\x81""I"
+};
+
+static const StringListProvider k1FluteStringsPC98JapaneseProvider = { ARRAYSIZE(k1FluteStringsPC98Japanese), k1FluteStringsPC98Japanese };
+
+static const char *const k1WispJewelStringsPC98Japanese[3] = {
+ "\x89\xBD\x82\xE0\x8A\xB4\x82\xB6\x82\xC8\x82\xA2\x82\xC8\x82\xA0\x81""B",
+ "\x8D\xC5\x8F\x89\x82\xC9\x81""A",
+ "\x82\xF0\x89\xBA\x82\xC9\x92""u""\x82\xAD\x82\xCC\x82\xA9\x82\xE0\x92""m""\x82\xEA\x82\xC8\x82\xA2\x81""B"
+};
+
+static const StringListProvider k1WispJewelStringsPC98JapaneseProvider = { ARRAYSIZE(k1WispJewelStringsPC98Japanese), k1WispJewelStringsPC98Japanese };
+
+static const char *const k1MagicJewelStringsPC98Japanese[1] = {
+ "\x82\xB1\x82\xEA\x82\xCD\x88\xE1\x82\xA4\x82\xBC\x81""B"
+};
+
+static const StringListProvider k1MagicJewelStringsPC98JapaneseProvider = { ARRAYSIZE(k1MagicJewelStringsPC98Japanese), k1MagicJewelStringsPC98Japanese };
+
+static const char *const k1FlaskFullStringPC98Japanese[1] = {
+ "\x83""t""\x83\x89\x83""X""\x83""R""\x82\xCD\x82\xE0\x82\xA4\x90\x85\x82\xAA\x93\xFC\x82\xC1\x82\xC4\x82\xA2\x82\xE9\x81""B"
+};
+
+static const StringListProvider k1FlaskFullStringPC98JapaneseProvider = { ARRAYSIZE(k1FlaskFullStringPC98Japanese), k1FlaskFullStringPC98Japanese };
+
+static const char *const k1FullFlaskStringPC98Japanese[4] = {
+ "\x83""t""\x83\x89\x83""X""\x83""R""\x82\xCC\x92\x86\x90""g""\x82\xCD\x81""A\r""\x96""A""\x97\xA7\x82\xC2\x90""V""\x91""N""\x82\xC8\x90\x85\x82\xBE\x81""B",
+ "\x83""t""\x83\x89\x83""X""\x83""R""\x82\xCC\x92\x86\x90""g""\x82\xCD\x81""A\r""\x89\x96\x90\x85\x82\xBE\x81""B",
+ "\x83""t""\x83\x89\x83""X""\x83""R""\x82\xCC\x92\x86\x90""g""\x82\xCD\x81""A\r""\x83""~""\x83""l""\x83\x89\x83\x8B\x83""E""\x83""H""\x81""[""\x83""^""\x81""[""\x82\xBE\x81""B",
+ "\x96\x82\x96""@""\x82\xCC\x90\x85\x82\xBE\x81""B"
+};
+
+static const StringListProvider k1FullFlaskStringPC98JapaneseProvider = { ARRAYSIZE(k1FullFlaskStringPC98Japanese), k1FullFlaskStringPC98Japanese };
+
+static const char *const k1OutroHomeStringPC98Japanese[1] = {
+ "\x89\xE4\x82\xAA\x89\xC6"
+};
+
+static const StringListProvider k1OutroHomeStringPC98JapaneseProvider = { ARRAYSIZE(k1OutroHomeStringPC98Japanese), k1OutroHomeStringPC98Japanese };
+
+static const char *const k1VeryCleverStringPC98Japanese[1] = {
+ "\x82\xE6\x82\xA2\x8E\xE8\x8D\xDB\x82\xBE\x81""I""\x82\xBE\x82\xAA\x82\xA8\x91""O""\x82\xCC\x82\xB3\x82\xB3\x82\xE2\x82\xA9\x82\xC8\x93""w""\x97\xCD\x82\xCD\x96\xB3\x91\xCA\x82\xBE\x81""B"
+};
+
+static const StringListProvider k1VeryCleverStringPC98JapaneseProvider = { ARRAYSIZE(k1VeryCleverStringPC98Japanese), k1VeryCleverStringPC98Japanese };
+
+static const char *const k1GUIStringsPC98Japanese[75] = {
+ "\x83""L""\x83\x89\x83\x93\x83""f""\x83""B""\x83""A""\x82\xCC\x93""`""\x90\xE0",
+ "\x83""Z""\x81""[""\x83""u""\x82\xB5\x82\xBD\x8F\x8A\x82\xA9\x82\xE7\x8E""n""\x82\xDF\x82\xE9",
+ "\x83""Q""\x81""[""\x83\x80\x82\xF0\x83""Z""\x81""[""\x83""u""\x82\xB7\x82\xE9",
+ "\x83""Q""\x81""[""\x83\x80\x82\xCC\x90\xDD\x92\xE8",
+ "\x83""Q""\x81""[""\x83\x80\x8F""I""\x97\xB9",
+ "\x83""Q""\x81""[""\x83\x80\x8D\xC4\x8A""J",
+ "\x83""Q""\x81""[""\x83\x80\x82\xCC\x90\xDD\x92\xE8",
+ "\x82\xC7\x82\xCC\x83""f""\x81""[""\x83""^""\x82\xF0\x83\x8D\x81""[""\x83""h""\x82\xB5\x82\xDC\x82\xB7\x82\xA9\x81""H",
+ "\x83""Z""\x81""[""\x83""u""\x82\xB7\x82\xE9\x88\xCA\x92""u""\x82\xF0\x91""I""\x82\xF1\x82\xC5\x89\xBA\x82\xB3\x82\xA2\x81""F",
+ "\x81""m""\x8D\xC5\x8F\x89\x82\xA9\x82\xE7\x83""Q""\x81""[""\x83\x80\x82\xF0\x8E""n""\x82\xDF\x82\xE9\x81""n",
+ "\x81""m""\x8B\xF3\x82\xAB\x83""X""\x83\x8D\x83""b""\x83""g""\x81""n",
+ "\x92\x86\x8E""~",
+ "\x83""Z""\x81""[""\x83""u""\x82\xB5\x82\xBD\x83""Q""\x81""[""\x83\x80\x82\xC9\x96\xBC\x91""O""\x82\xF0\x82\xC2\x82\xAF\x82\xC4\x89\xBA\x82\xB3\x82\xA2\x81""F",
+ "\x83""Z""\x81""[""\x83""u",
+ "\x83""u""\x83\x89\x83\x93\x83""h""\x83\x93\x81""A""\x82\xE4\x82\xC1\x82\xAD\x82\xE8\x8B""x""\x82\xDF\x82\xE9\x82\xE6\x81""B",
+ "\x83""Q""\x81""[""\x83\x80\x82\xF0\x8F""I""\x97\xB9\x82\xB5\x82\xC4\x82\xA2\x82\xA2\x82\xC5\x82\xB7\x82\xA9\x81""H",
+ "XXX",
+ "",
+ "",
+ "",
+ "",
+ "",
+ "",
+ "",
+ "",
+ "",
+ "",
+ "",
+ "",
+ "",
+ "",
+ "XXX",
+ "",
+ "",
+ "",
+ "",
+ "",
+ "",
+ "",
+ "",
+ "",
+ "",
+ "",
+ "",
+ "",
+ "",
+ "XXXXXXX",
+ "",
+ "",
+ "",
+ "",
+ "",
+ "",
+ "",
+ "",
+ "",
+ "",
+ "XXXXXXXXX",
+ "",
+ "",
+ "",
+ "",
+ "",
+ "",
+ "",
+ "",
+ "\x83\x81\x83""C""\x83\x93\x81""E""\x83\x81\x83""j""\x83\x85\x81""[",
+ "\x83""I""\x83\x93",
+ "\x83""I""\x83""t",
+ "\x82\xCD\x82\xA2",
+ "\x82\xA2\x82\xA2\x82\xA6",
+ "\xD2""q""\x8A""$""\xDB""q""\x8A""$""\xE0""q""\x8A""$""\xE5""q""\x8A""$""\xEA""q""\x8A""$""\xF3""q""\x8A""$""\xFC""q""\x8A""$""\x01""r""\x8A""$""\x06""r""\x8A""$""\x95\xE0\x81""@""\x8D""s""\x81""@""\x91\xAC\x81""@""\x93""x",
+ "\x83\x81\x83""b""\x83""Z""\x81""[""\x83""W""\x91\xAC\x93""x",
+ "\x89\xB9\x81""@""\x81""@""\x81""@""\x81""@""\x81""@""\x8A""y",
+ "\x8C\xF8\x81""@""\x81""@""\x89\xCA\x81""@""\x81""@""\x89\xB9"
+};
+
+static const StringListProvider k1GUIStringsPC98JapaneseProvider = { ARRAYSIZE(k1GUIStringsPC98Japanese), k1GUIStringsPC98Japanese };
+
+static const char *const k1NewGameStringPC98Japanese[1] = {
+ "\x81""m""\x8D\xC5\x8F\x89\x82\xA9\x82\xE7\x83""Q""\x81""[""\x83\x80\x82\xF0\x8E""n""\x82\xDF\x82\xE9\x81""n"
+};
+
+static const StringListProvider k1NewGameStringPC98JapaneseProvider = { ARRAYSIZE(k1NewGameStringPC98Japanese), k1NewGameStringPC98Japanese };
+
+static const char *const k1ConfigStringsPC98Japanese[9] = {
+ "\x82\xB2\x82\xAD\x92""x""\x82\xAD",
+ "\x92""x""\x82\xAD",
+ "\x95\x81\x92\xCA",
+ "\x91\xAC\x82\xAD",
+ "\x82\xB2\x82\xAD\x91\xAC\x82\xAD",
+ "\x82\xB2\x82\xAD\x92""x""\x82\xAD",
+ "\x95\x81\x92\xCA",
+ "\x91\xAC\x82\xAD",
+ "\x97""v""\x83""N""\x83\x8A\x83""b""\x83""N"
+};
+
+static const StringListProvider k1ConfigStringsPC98JapaneseProvider = { ARRAYSIZE(k1ConfigStringsPC98Japanese), k1ConfigStringsPC98Japanese };
+
+static const char *const k1PC98StoryStringsPC98Japanese[2] = {
+ "\x88\xAB\x82\xCC\x93\xB9\x89\xBB\x8E""t""\x81""A""\x83""}""\x83\x8B\x83""R""\x83\x80\x82\xAA\x98""S""\x82\xF0\x94""j""\x82\xC1\x82\xBD\x81""B",
+ "\x8D\xA1\x82\xE2\x82\xB1\x82\xCC\x8D\x91\x82\xCC\x96\x82\x96""@""\x82\xCD\x82\xB7\x82\xD7\x82\xC4\x94\xDE\x82\xC9\x8E""x""\x94""z""\x82\xB3\x82\xEA\x82\xC4\x82\xB5\x82\xDC\x82\xC1\x82\xBD\x81""B"
+};
+
+static const StringListProvider k1PC98StoryStringsPC98JapaneseProvider = { ARRAYSIZE(k1PC98StoryStringsPC98Japanese), k1PC98StoryStringsPC98Japanese };
+
+static const byte k1CreditsStringsPC98Japanese[1328] = {
+ 0x0D, 0x02, 0x54, 0x48, 0x45, 0x20, 0x45, 0x4E,
+ 0x44, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D,
+ 0x0D, 0x0D, 0x02, 0x46, 0x61, 0x62, 0x6C, 0x65,
+ 0x73, 0x20, 0x26, 0x20, 0x46, 0x69, 0x65, 0x6E,
+ 0x64, 0x73, 0x0D, 0x02, 0x42, 0x6F, 0x6F, 0x6B,
+ 0x20, 0x49, 0x0D, 0x02, 0x54, 0x48, 0x45, 0x20,
+ 0x4C, 0x45, 0x47, 0x45, 0x4E, 0x44, 0x20, 0x4F,
+ 0x46, 0x20, 0x4B, 0x59, 0x52, 0x41, 0x4E, 0x44,
+ 0x49, 0x41, 0x0D, 0x0D, 0x50, 0x75, 0x62, 0x6C,
+ 0x69, 0x73, 0x68, 0x65, 0x64, 0x20, 0x62, 0x79,
+ 0x0D, 0x02, 0x57, 0x65, 0x73, 0x74, 0x77, 0x6F,
+ 0x6F, 0x64, 0x20, 0x53, 0x74, 0x75, 0x64, 0x69,
+ 0x6F, 0x73, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D,
+ 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D,
+ 0x03, 0x44, 0x69, 0x72, 0x65, 0x63, 0x74, 0x6F,
+ 0x72, 0x3A, 0x05, 0x04, 0x42, 0x72, 0x65, 0x74,
+ 0x74, 0x20, 0x57, 0x2E, 0x20, 0x53, 0x70, 0x65,
+ 0x72, 0x72, 0x79, 0x0D, 0x0D, 0x03, 0x44, 0x65,
+ 0x73, 0x69, 0x67, 0x6E, 0x3A, 0x05, 0x04, 0x4D,
+ 0x69, 0x63, 0x68, 0x61, 0x65, 0x6C, 0x20, 0x4C,
+ 0x65, 0x67, 0x67, 0x0D, 0x04, 0x52, 0x69, 0x63,
+ 0x6B, 0x20, 0x50, 0x61, 0x72, 0x6B, 0x73, 0x0D,
+ 0x04, 0x50, 0x61, 0x75, 0x6C, 0x20, 0x53, 0x2E,
+ 0x20, 0x4D, 0x75, 0x64, 0x72, 0x61, 0x0D, 0x0D,
+ 0x03, 0x4C, 0x65, 0x61, 0x64, 0x20, 0x50, 0x72,
+ 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x6D, 0x65, 0x72,
+ 0x3A, 0x05, 0x04, 0x4D, 0x69, 0x63, 0x68, 0x61,
+ 0x65, 0x6C, 0x20, 0x4C, 0x65, 0x67, 0x67, 0x0D,
+ 0x0D, 0x03, 0x53, 0x63, 0x72, 0x69, 0x70, 0x74,
+ 0x20, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D,
+ 0x6D, 0x65, 0x72, 0x3A, 0x05, 0x04, 0x53, 0x63,
+ 0x6F, 0x74, 0x74, 0x20, 0x42, 0x6F, 0x77, 0x65,
+ 0x6E, 0x0D, 0x0D, 0x03, 0x41, 0x6D, 0x69, 0x67,
+ 0x61, 0x20, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61,
+ 0x6D, 0x6D, 0x65, 0x72, 0x3A, 0x05, 0x04, 0x42,
+ 0x69, 0x6C, 0x6C, 0x20, 0x53, 0x74, 0x6F, 0x6B,
+ 0x65, 0x73, 0x0D, 0x0D, 0x03, 0x50, 0x43, 0x2D,
+ 0x39, 0x38, 0x20, 0x50, 0x72, 0x6F, 0x67, 0x72,
+ 0x61, 0x6D, 0x6D, 0x65, 0x72, 0x3A, 0x05, 0x04,
+ 0x59, 0x75, 0x6B, 0x69, 0x6F, 0x20, 0x53, 0x65,
+ 0x6B, 0x69, 0x67, 0x75, 0x63, 0x68, 0x69, 0x0D,
+ 0x0D, 0x03, 0x49, 0x6E, 0x74, 0x72, 0x6F, 0x20,
+ 0x26, 0x20, 0x46, 0x69, 0x6E, 0x61, 0x6C, 0x65,
+ 0x3A, 0x05, 0x04, 0x43, 0x68, 0x72, 0x69, 0x73,
+ 0x74, 0x6F, 0x70, 0x68, 0x65, 0x72, 0x20, 0x59,
+ 0x61, 0x74, 0x65, 0x73, 0x0D, 0x0D, 0x03, 0x41,
+ 0x72, 0x74, 0x20, 0x26, 0x20, 0x47, 0x72, 0x61,
+ 0x70, 0x68, 0x69, 0x63, 0x73, 0x3A, 0x05, 0x04,
+ 0x52, 0x69, 0x63, 0x6B, 0x20, 0x50, 0x61, 0x72,
+ 0x6B, 0x73, 0x0D, 0x04, 0x52, 0x65, 0x6E, 0x20,
+ 0x4F, 0x6C, 0x73, 0x65, 0x6E, 0x0D, 0x04, 0x4C,
+ 0x6F, 0x75, 0x69, 0x73, 0x65, 0x20, 0x53, 0x61,
+ 0x6E, 0x64, 0x6F, 0x76, 0x61, 0x6C, 0x0D, 0x04,
+ 0x4A, 0x6F, 0x73, 0x65, 0x70, 0x68, 0x20, 0x48,
+ 0x65, 0x77, 0x69, 0x74, 0x74, 0x20, 0x49, 0x56,
+ 0x0D, 0x04, 0x4A, 0x75, 0x64, 0x69, 0x74, 0x68,
+ 0x20, 0x50, 0x65, 0x74, 0x65, 0x72, 0x73, 0x6F,
+ 0x6E, 0x0D, 0x04, 0x41, 0x61, 0x72, 0x6F, 0x6E,
+ 0x20, 0x50, 0x6F, 0x77, 0x65, 0x6C, 0x6C, 0x0D,
+ 0x04, 0x45, 0x6C, 0x69, 0x65, 0x20, 0x41, 0x72,
+ 0x61, 0x62, 0x69, 0x61, 0x6E, 0x0D, 0x04, 0x45,
+ 0x72, 0x69, 0x63, 0x20, 0x53, 0x68, 0x75, 0x6C,
+ 0x74, 0x73, 0x0D, 0x0D, 0x03, 0x41, 0x75, 0x64,
+ 0x69, 0x6F, 0x20, 0x44, 0x69, 0x72, 0x65, 0x63,
+ 0x74, 0x6F, 0x72, 0x3A, 0x05, 0x04, 0x50, 0x61,
+ 0x75, 0x6C, 0x20, 0x53, 0x2E, 0x20, 0x4D, 0x75,
+ 0x64, 0x72, 0x61, 0x0D, 0x0D, 0x03, 0x4D, 0x75,
+ 0x73, 0x69, 0x63, 0x3A, 0x05, 0x04, 0x46, 0x72,
+ 0x61, 0x6E, 0x6B, 0x20, 0x4B, 0x6C, 0x65, 0x70,
+ 0x61, 0x63, 0x6B, 0x69, 0x0D, 0x03, 0x28, 0x50,
+ 0x43, 0x2D, 0x39, 0x38, 0x29, 0x05, 0x04, 0x54,
+ 0x61, 0x6B, 0x65, 0x73, 0x68, 0x69, 0x20, 0x41,
+ 0x62, 0x6F, 0x0D, 0x0D, 0x03, 0x53, 0x6F, 0x75,
+ 0x6E, 0x64, 0x20, 0x45, 0x66, 0x66, 0x65, 0x63,
+ 0x74, 0x73, 0x3A, 0x05, 0x04, 0x44, 0x77, 0x69,
+ 0x67, 0x68, 0x74, 0x20, 0x4F, 0x6B, 0x61, 0x68,
+ 0x61, 0x72, 0x61, 0x0D, 0x03, 0x28, 0x50, 0x43,
+ 0x2D, 0x39, 0x38, 0x29, 0x05, 0x04, 0x54, 0x61,
+ 0x6B, 0x65, 0x73, 0x68, 0x69, 0x20, 0x41, 0x62,
+ 0x6F, 0x0D, 0x0D, 0x03, 0x57, 0x72, 0x69, 0x74,
+ 0x65, 0x72, 0x3A, 0x05, 0x04, 0x22, 0x43, 0x6F,
+ 0x63, 0x6F, 0x22, 0x0D, 0x0D, 0x03, 0x54, 0x72,
+ 0x61, 0x6E, 0x73, 0x6C, 0x61, 0x74, 0x6F, 0x72,
+ 0x3A, 0x05, 0x04, 0x4D, 0x69, 0x6E, 0x6F, 0x72,
+ 0x75, 0x20, 0x4E, 0x61, 0x6B, 0x61, 0x7A, 0x61,
+ 0x77, 0x61, 0x0D, 0x04, 0x59, 0x75, 0x72, 0x69,
+ 0x20, 0x49, 0x74, 0x6F, 0x0D, 0x0D, 0x03, 0x51,
+ 0x75, 0x61, 0x6C, 0x69, 0x74, 0x79, 0x20, 0x41,
+ 0x73, 0x73, 0x75, 0x72, 0x61, 0x6E, 0x63, 0x65,
+ 0x3A, 0x05, 0x04, 0x47, 0x6C, 0x65, 0x6E, 0x6E,
+ 0x20, 0x53, 0x70, 0x65, 0x72, 0x72, 0x79, 0x0D,
+ 0x04, 0x4D, 0x61, 0x74, 0x74, 0x20, 0x43, 0x6F,
+ 0x6C, 0x6C, 0x69, 0x6E, 0x73, 0x0D, 0x04, 0x42,
+ 0x69, 0x6C, 0x6C, 0x20, 0x46, 0x6F, 0x73, 0x74,
+ 0x65, 0x72, 0x0D, 0x04, 0x4D, 0x69, 0x63, 0x68,
+ 0x61, 0x65, 0x6C, 0x20, 0x4C, 0x69, 0x67, 0x68,
+ 0x74, 0x6E, 0x65, 0x72, 0x0D, 0x04, 0x4D, 0x69,
+ 0x63, 0x68, 0x61, 0x65, 0x6C, 0x20, 0x47, 0x61,
+ 0x74, 0x65, 0x72, 0x0D, 0x04, 0x45, 0x75, 0x67,
+ 0x65, 0x6E, 0x65, 0x20, 0x4D, 0x61, 0x72, 0x74,
+ 0x69, 0x6E, 0x0D, 0x04, 0x4D, 0x69, 0x63, 0x68,
+ 0x61, 0x65, 0x6C, 0x20, 0x47, 0x6C, 0x6F, 0x73,
+ 0x65, 0x63, 0x6B, 0x69, 0x0D, 0x04, 0x4A, 0x75,
+ 0x73, 0x74, 0x69, 0x6E, 0x20, 0x4E, 0x6F, 0x72,
+ 0x72, 0x0D, 0x04, 0x54, 0x6F, 0x70, 0x20, 0x53,
+ 0x74, 0x61, 0x72, 0x20, 0x54, 0x65, 0x73, 0x74,
+ 0x69, 0x6E, 0x67, 0x0D, 0x04, 0x54, 0x65, 0x73,
+ 0x74, 0x69, 0x6E, 0x67, 0x20, 0x31, 0x2C, 0x32,
+ 0x2C, 0x33, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x53,
+ 0x70, 0x65, 0x63, 0x69, 0x61, 0x6C, 0x20, 0x54,
+ 0x68, 0x61, 0x6E, 0x6B, 0x73, 0x20, 0x74, 0x6F,
+ 0x0D, 0x4C, 0x79, 0x6C, 0x65, 0x20, 0x4A, 0x2E,
+ 0x20, 0x48, 0x61, 0x6C, 0x6C, 0x0D, 0x44, 0x61,
+ 0x76, 0x69, 0x64, 0x20, 0x42, 0x69, 0x73, 0x68,
+ 0x6F, 0x70, 0x0D, 0x22, 0x54, 0x68, 0x65, 0x20,
+ 0x44, 0x6F, 0x63, 0x22, 0x0D, 0x61, 0x6E, 0x64,
+ 0x0D, 0x46, 0x69, 0x72, 0x65, 0x62, 0x65, 0x72,
+ 0x72, 0x79, 0x20, 0x47, 0x72, 0x65, 0x65, 0x6E,
+ 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D,
+ 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x02, 0x43,
+ 0x41, 0x53, 0x54, 0x20, 0x4F, 0x46, 0x20, 0x43,
+ 0x48, 0x41, 0x52, 0x41, 0x43, 0x54, 0x45, 0x52,
+ 0x53, 0x0D, 0x0D, 0x4D, 0x61, 0x6C, 0x63, 0x6F,
+ 0x6C, 0x6D, 0x20, 0x74, 0x68, 0x65, 0x20, 0x4A,
+ 0x65, 0x73, 0x74, 0x65, 0x72, 0x0D, 0x42, 0x72,
+ 0x61, 0x6E, 0x64, 0x6F, 0x6E, 0x20, 0x74, 0x68,
+ 0x65, 0x20, 0x42, 0x6F, 0x6C, 0x64, 0x0D, 0x42,
+ 0x72, 0x61, 0x6E, 0x64, 0x79, 0x77, 0x69, 0x6E,
+ 0x65, 0x20, 0x61, 0x6E, 0x64, 0x20, 0x44, 0x61,
+ 0x72, 0x6D, 0x0D, 0x50, 0x72, 0x69, 0x65, 0x73,
+ 0x74, 0x65, 0x73, 0x73, 0x20, 0x42, 0x72, 0x79,
+ 0x6E, 0x6E, 0x0D, 0x5A, 0x61, 0x6E, 0x74, 0x68,
+ 0x69, 0x61, 0x2C, 0x20, 0x4C, 0x61, 0x64, 0x79,
+ 0x20, 0x6F, 0x66, 0x20, 0x41, 0x6C, 0x63, 0x68,
+ 0x65, 0x6D, 0x79, 0x0D, 0x48, 0x65, 0x72, 0x6D,
+ 0x61, 0x6E, 0x20, 0x74, 0x68, 0x65, 0x20, 0x48,
+ 0x61, 0x6E, 0x64, 0x79, 0x6D, 0x61, 0x6E, 0x0D,
+ 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D,
+ 0x0D, 0x0D, 0x01, 0x41, 0x6E, 0x79, 0x20, 0x63,
+ 0x68, 0x61, 0x72, 0x61, 0x63, 0x74, 0x65, 0x72,
+ 0x73, 0x20, 0x69, 0x6E, 0x20, 0x74, 0x68, 0x69,
+ 0x73, 0x20, 0x67, 0x61, 0x6D, 0x65, 0x20, 0x77,
+ 0x68, 0x6F, 0x20, 0x62, 0x65, 0x61, 0x72, 0x0D,
+ 0x01, 0x72, 0x65, 0x73, 0x65, 0x6D, 0x62, 0x6C,
+ 0x61, 0x6E, 0x63, 0x65, 0x20, 0x74, 0x6F, 0x20,
+ 0x70, 0x65, 0x72, 0x73, 0x6F, 0x6E, 0x73, 0x20,
+ 0x6C, 0x69, 0x76, 0x69, 0x6E, 0x67, 0x20, 0x6F,
+ 0x72, 0x0D, 0x01, 0x64, 0x65, 0x61, 0x64, 0x20,
+ 0x61, 0x72, 0x65, 0x20, 0x70, 0x75, 0x72, 0x65,
+ 0x6C, 0x79, 0x20, 0x63, 0x6F, 0x69, 0x6E, 0x63,
+ 0x69, 0x64, 0x65, 0x6E, 0x74, 0x61, 0x6C, 0x2E,
+ 0x0D, 0x0D, 0x0D, 0x01, 0x43, 0x6F, 0x70, 0x79,
+ 0x72, 0x69, 0x67, 0x68, 0x74, 0x20, 0x28, 0x43,
+ 0x29, 0x20, 0x31, 0x39, 0x39, 0x32, 0x2C, 0x20,
+ 0x57, 0x65, 0x73, 0x74, 0x77, 0x6F, 0x6F, 0x64,
+ 0x20, 0x53, 0x74, 0x75, 0x64, 0x69, 0x6F, 0x73,
+ 0x2C, 0x20, 0x49, 0x6E, 0x63, 0x2E, 0x0D, 0x01,
+ 0x43, 0x6F, 0x70, 0x79, 0x72, 0x69, 0x67, 0x68,
+ 0x74, 0x20, 0x28, 0x43, 0x29, 0x20, 0x31, 0x39,
+ 0x39, 0x33, 0x2C, 0x20, 0x53, 0x74, 0x61, 0x72,
+ 0x20, 0x43, 0x72, 0x61, 0x66, 0x74, 0x2C, 0x20,
+ 0x49, 0x6E, 0x63, 0x2E, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x0D, 0x01, 0x41, 0x6C, 0x6C, 0x20,
+ 0x72, 0x69, 0x67, 0x68, 0x74, 0x73, 0x20, 0x72,
+ 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x64, 0x2E,
+ 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x00, 0x00
+};
+
+static const ByteProvider k1CreditsStringsPC98JapaneseProvider = { ARRAYSIZE(k1CreditsStringsPC98Japanese), k1CreditsStringsPC98Japanese };
+
diff --git a/devtools/create_kyradat/resources/lol_dos.h b/devtools/create_kyradat/resources/lol_dos.h
new file mode 100644
index 0000000000..9f7d2e79b9
--- /dev/null
+++ b/devtools/create_kyradat/resources/lol_dos.h
@@ -0,0 +1,1558 @@
+static const char *const kLoLIngamePakFilesDOS[11] = {
+ "VOC.PAK",
+ "GENERAL.PAK",
+ "CHAPTER1.PAK",
+ "CHAPTER2.PAK",
+ "CHAPTER3.PAK",
+ "CHAPTER4.PAK",
+ "CHAPTER5.PAK",
+ "CHAPTER6.PAK",
+ "CHAPTER7.PAK",
+ "CHAPTER8.PAK",
+ "DRIVERS.PAK"
+};
+
+static const StringListProvider kLoLIngamePakFilesDOSProvider = { ARRAYSIZE(kLoLIngamePakFilesDOS), kLoLIngamePakFilesDOS };
+
+static const char *const kLoLIngameSfxFilesDOS[230] = {
+ "XXXXXXXX",
+ "XXXXXXXX",
+ "XXXXXXXX",
+ "XXXXXXXX",
+ "XXXXXXXX",
+ "XXXXXXXX",
+ "XXXXXXXX",
+ "XXXXXXXX",
+ "XXXXXXXX",
+ "XXXXXXXX",
+ "XXXXXXXX",
+ "XXXXXXXX",
+ "XXXXXXXX",
+ "XXXXXXXX",
+ "XXXXXXXX",
+ "XXXXXXXX",
+ "XXXXXXXX",
+ "XXXXXXXX",
+ "XXXXXXXX",
+ "XXXXXXXX",
+ "XXXXXXXX",
+ "XXXXXXXX",
+ "XXXXXXXX",
+ "XXXXXXXX",
+ "XXXXXXXX",
+ "XXXXXXXX",
+ "XXXXXXXX",
+ "XXXXXXXX",
+ "XXXXXXXX",
+ "XXXXXXXX",
+ "XXXXXXXX",
+ "XXXXXXXX",
+ "XXXXXXXX",
+ "XXXXXXXX",
+ "XXXXXXXX",
+ "XXXXXXXX",
+ "XXXXXXXX",
+ "XXXXXXXX",
+ "XXXXXXXX",
+ "XXXXXXXX",
+ "XXXXXXXX",
+ "XXXXXXXX",
+ "XXXXXXXX",
+ "XXXXXXXX",
+ "XXXXXXXX",
+ "XXXXXXXX",
+ "XXXXXXXX",
+ "XXXXXXXX",
+ "XXXXXXXX",
+ "XXXXXXXX",
+ "DOORMTOP",
+ "DOORMTCL",
+ "PMETLHI",
+ "SWING6",
+ "MDAMAGE2",
+ "LEVERDN",
+ "LEVERUP",
+ "MTLDRSLM",
+ "DOORWDOP",
+ "DOORWDCL",
+ "KEYOPEN",
+ "KEYLOCK",
+ "PORTCUL",
+ "PORTCULD",
+ "LOKPICK",
+ "OCEAN2",
+ "NUNCHUK",
+ "SWING",
+ "SHWING1",
+ "SWING6",
+ "THROW",
+ "CROSSBOW",
+ "HEAL1",
+ "FIRESPL1",
+ "PRESSIN",
+ "PRESSOUT",
+ "PLATEON",
+ "PLATEOFF",
+ "DORWDSLM",
+ "LITENIN1",
+ "ICESPEL2",
+ "SPELL4B",
+ "SHIELD1",
+ "3BOLTC",
+ "2BOLTC",
+ "1BOLTC",
+ "DAWNSPL1",
+ "HEALKING",
+ "SPELL7",
+ "SWING1",
+ "EXPLODE",
+ "CROWCAW",
+ "MORPH2",
+ "CHEST",
+ "MONEY",
+ "SPELBK2",
+ "AUTOMAP",
+ "MINECRT3",
+ "CREAK1",
+ "TURNPAG2",
+ "POLGULP1",
+ "GOOEY1",
+ "BUCKBELL",
+ "KEEPXIT2",
+ "VSCREAM4",
+ "EMPTY",
+ "GOOEY1",
+ "GOOEY2",
+ "RIPPOD4",
+ "PODSKEL1",
+ "INVISO",
+ "OPENBOX2",
+ "ACCEPT2",
+ "BOW2",
+ "HACHUCKM",
+ "FOUNDRY2",
+ "FOUNDRY2",
+ "FOUNDRY4",
+ "FOUNDRY6",
+ "CLEANGL1",
+ "CLEANGL2",
+ "GLOWY1",
+ "DORSTNOP",
+ "DORSTNCL",
+ "EMPTY",
+ "EMPTY",
+ "EMPTY",
+ "EMPTY",
+ "ADAMAGE1",
+ "HDAMAGE1",
+ "TDAMAGE1",
+ "BDAMAGE1",
+ "LDAMAGE1",
+ "TDAMAGE2",
+ "CDAMAGE1",
+ "EMPTY",
+ "EMPTY",
+ "EMPTY",
+ "GOOD1",
+ "GOOD2",
+ "EMPTY",
+ "EMPTY",
+ "EMPTY",
+ "LITENIN1",
+ "COMPASS2",
+ "KINGDOR1",
+ "GLASBRK2",
+ "FLUTTER3",
+ "NUNCHUK",
+ "WALLFALL",
+ "WALLHIT",
+ "MWHOA1",
+ "LADDER",
+ "WHITTL3",
+ "ROWBOAT1",
+ "HORSEY2",
+ "SNORT",
+ "PUMPDOR1",
+ "PUMPSM2",
+ "PUMPSM3",
+ "SPARK1",
+ "BEZEL",
+ "SWARM",
+ "CHEST1",
+ "WRIT1",
+ "CAUSFOG",
+ "VAELAN2",
+ "ROARSPL1",
+ "RATTLER",
+ "WINK1",
+ "HANDFATE",
+ "QUAKE1",
+ "WIZLAMP1",
+ "SAP2",
+ "MSTDOOM1",
+ "GARDIAN1",
+ "VORTEX1",
+ "LION1",
+ "STEAM",
+ "SQUAWCK",
+ "SLIDEMUG",
+ "SPARKHIT",
+ "SPARKHIT2",
+ "SPARKHIT3",
+ "ICEFORM",
+ "ICEXPLOD",
+ "EXPLODE2",
+ "EXPLODE3",
+ "BOLTQUK2",
+ "BOLT2",
+ "BOLT3",
+ "SNKBITE",
+ "HANDGLOW",
+ "MSTDOOM2",
+ "MSTDOOM3",
+ "GARDIAN2",
+ "PLUSPOWR",
+ "MINSPOWR",
+ "BLUDCURL",
+ "LORAGASP",
+ "POURH2O",
+ "AWHOA2",
+ "HWHOA1",
+ "CWHOA1",
+ "AFALL2",
+ "EMPTY",
+ "CFALL2",
+ "MFALL2",
+ "EMPTY",
+ "EMPTY",
+ "EMPTY",
+ "EMPTY",
+ "EMPTY",
+ "EMPTY",
+ "EMPTY",
+ "EMPTY",
+ "WRIT2",
+ "WRIT3",
+ "WRIT4",
+ "WRIT5",
+ "WRIT6",
+ "RUCKUS1",
+ "RUCKUS3",
+ "CHANT1",
+ "EMPTY",
+ "EMPTY",
+ "EMPTY",
+ "CHANT2",
+ "CHANT3",
+ ""
+};
+
+static const StringListProvider kLoLIngameSfxFilesDOSProvider = { ARRAYSIZE(kLoLIngameSfxFilesDOS), kLoLIngameSfxFilesDOS };
+
+static const byte kLoLIngameSfxIndexDOS[1000] = {
+ 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00,
+ 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00,
+ 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00,
+ 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00,
+ 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00,
+ 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00,
+ 0x34, 0x00, 0x6F, 0x00, 0x7C, 0x00, 0x00, 0x00,
+ 0x7D, 0x00, 0x00, 0x00, 0x7E, 0x00, 0x00, 0x00,
+ 0x7F, 0x00, 0x00, 0x00, 0x36, 0x00, 0x73, 0x00,
+ 0x35, 0x00, 0x9C, 0xFF, 0xFF, 0xFF, 0x00, 0x00,
+ 0x80, 0x00, 0x73, 0x00, 0x81, 0x00, 0x73, 0x00,
+ 0x82, 0x00, 0x73, 0x00, 0x83, 0x00, 0x73, 0x00,
+ 0x84, 0x00, 0x73, 0x00, 0x85, 0x00, 0x73, 0x00,
+ 0x86, 0x00, 0x73, 0x00, 0xD7, 0x00, 0x76, 0x00,
+ 0x87, 0x00, 0x65, 0x00, 0x38, 0x00, 0x5F, 0x00,
+ 0x37, 0x00, 0x5F, 0x00, 0x32, 0x00, 0x0A, 0x00,
+ 0x33, 0x00, 0x64, 0x00, 0x39, 0x00, 0x65, 0x00,
+ 0x3A, 0x00, 0x0A, 0x00, 0x3B, 0x00, 0x14, 0x00,
+ 0x4E, 0x00, 0x65, 0x00, 0x7A, 0x00, 0x64, 0x00,
+ 0x7B, 0x00, 0x64, 0x00, 0x88, 0x00, 0x65, 0x00,
+ 0x3C, 0x00, 0x65, 0x00, 0x3D, 0x00, 0x64, 0x00,
+ 0x89, 0x00, 0x00, 0x00, 0x8E, 0x00, 0x14, 0x00,
+ 0x3E, 0x00, 0x00, 0x00, 0x3F, 0x00, 0x00, 0x00,
+ 0x40, 0x00, 0x65, 0x00, 0x41, 0x00, 0x00, 0x00,
+ 0xC9, 0x00, 0x72, 0x00, 0xCA, 0x00, 0x72, 0x00,
+ 0xCB, 0x00, 0x72, 0x00, 0xCC, 0x00, 0x74, 0x00,
+ 0xCD, 0x00, 0x74, 0x00, 0xCE, 0x00, 0x74, 0x00,
+ 0xCF, 0x00, 0x74, 0x00, 0xD0, 0x00, 0x73, 0x00,
+ 0xD1, 0x00, 0x73, 0x00, 0xD2, 0x00, 0x73, 0x00,
+ 0xD3, 0x00, 0x73, 0x00, 0xD4, 0x00, 0x72, 0x00,
+ 0xD5, 0x00, 0x72, 0x00, 0xD6, 0x00, 0x72, 0x00,
+ 0x42, 0x00, 0x6F, 0x00, 0x43, 0x00, 0x6F, 0x00,
+ 0x44, 0x00, 0x6F, 0x00, 0x45, 0x00, 0x6F, 0x00,
+ 0x46, 0x00, 0x6F, 0x00, 0x47, 0x00, 0x6F, 0x00,
+ 0x48, 0x00, 0x77, 0x00, 0x49, 0x00, 0x89, 0xFF,
+ 0x4F, 0x00, 0x89, 0xFF, 0x50, 0x00, 0x89, 0xFF,
+ 0xA0, 0x00, 0x8A, 0xFF, 0xA1, 0x00, 0x89, 0xFF,
+ 0xA2, 0x00, 0x89, 0xFF, 0xFF, 0xFF, 0x00, 0x00,
+ 0xA3, 0x00, 0x89, 0xFF, 0xA4, 0x00, 0x89, 0xFF,
+ 0x4A, 0x00, 0x13, 0x00, 0x4B, 0x00, 0x13, 0x00,
+ 0x4C, 0x00, 0x32, 0x00, 0x4D, 0x00, 0x32, 0x00,
+ 0x5F, 0x00, 0x0A, 0x00, 0x51, 0x00, 0x00, 0x00,
+ 0x52, 0x00, 0x00, 0x00, 0x8F, 0x00, 0x00, 0x00,
+ 0x53, 0x00, 0x00, 0x00, 0x54, 0x00, 0x00, 0x00,
+ 0x55, 0x00, 0x00, 0x00, 0x56, 0x00, 0x00, 0x00,
+ 0x57, 0x00, 0x00, 0x00, 0x58, 0x00, 0x77, 0x00,
+ 0x60, 0x00, 0x00, 0x00, 0x5D, 0x00, 0x6A, 0x00,
+ 0x8A, 0x00, 0x6F, 0x00, 0x8B, 0x00, 0x6F, 0x00,
+ 0x8C, 0x00, 0x00, 0x00, 0x8D, 0x00, 0x00, 0x00,
+ 0x5A, 0x00, 0x77, 0x00, 0x5C, 0x00, 0x00, 0x00,
+ 0x5B, 0x00, 0x00, 0x00, 0x5E, 0x00, 0x6F, 0x00,
+ 0x61, 0x00, 0x76, 0x00, 0xFF, 0xFF, 0x00, 0x00,
+ 0x62, 0x00, 0x76, 0x00, 0x63, 0x00, 0x3C, 0x00,
+ 0x64, 0x00, 0x6D, 0x00, 0x65, 0x00, 0x00, 0x00,
+ 0x66, 0x00, 0x00, 0x00, 0x67, 0x00, 0x00, 0x00,
+ 0x68, 0x00, 0x00, 0x00, 0x69, 0x00, 0x00, 0x00,
+ 0x6A, 0x00, 0x00, 0x00, 0x6B, 0x00, 0x00, 0x00,
+ 0x6C, 0x00, 0x00, 0x00, 0x6D, 0x00, 0x00, 0x00,
+ 0x6E, 0x00, 0x00, 0x00, 0x6F, 0x00, 0x00, 0x00,
+ 0x70, 0x00, 0x88, 0xFF, 0xFF, 0xFF, 0x00, 0x00,
+ 0x71, 0x00, 0x00, 0x00, 0x72, 0x00, 0x00, 0x00,
+ 0x73, 0x00, 0x74, 0x00, 0x74, 0x00, 0x00, 0x00,
+ 0x75, 0x00, 0x00, 0x00, 0x76, 0x00, 0x00, 0x00,
+ 0x77, 0x00, 0x00, 0x00, 0x78, 0x00, 0x00, 0x00,
+ 0x79, 0x00, 0x77, 0x00, 0x90, 0x00, 0x00, 0x00,
+ 0x91, 0x00, 0x00, 0x00, 0x92, 0x00, 0x77, 0x00,
+ 0x93, 0x00, 0x1E, 0x00, 0x94, 0x00, 0x89, 0xFF,
+ 0x95, 0x00, 0x77, 0x00, 0x96, 0x00, 0x76, 0x00,
+ 0x97, 0x00, 0x72, 0x00, 0x98, 0x00, 0x00, 0x00,
+ 0x99, 0x00, 0x50, 0x00, 0x9A, 0x00, 0x78, 0x00,
+ 0x9B, 0x00, 0x64, 0x00, 0x9C, 0x00, 0x5A, 0x00,
+ 0x9D, 0x00, 0x64, 0x00, 0x9E, 0x00, 0x65, 0x00,
+ 0x9F, 0x00, 0x66, 0x00, 0xA5, 0x00, 0x89, 0xFF,
+ 0xA6, 0x00, 0x89, 0xFF, 0xA7, 0x00, 0x77, 0x00,
+ 0xA8, 0x00, 0x76, 0x00, 0xFF, 0xFF, 0x00, 0x00,
+ 0xA9, 0x00, 0x77, 0x00, 0xAA, 0x00, 0x77, 0x00,
+ 0xAB, 0x00, 0x77, 0x00, 0xAC, 0x00, 0x77, 0x00,
+ 0xAD, 0x00, 0x77, 0x00, 0xAE, 0x00, 0x77, 0x00,
+ 0xAF, 0x00, 0x76, 0x00, 0xB0, 0x00, 0x77, 0x00,
+ 0xB1, 0x00, 0x64, 0x00, 0xB2, 0x00, 0x6F, 0x00,
+ 0xB3, 0x00, 0x6E, 0x00, 0xB4, 0x00, 0x6E, 0x00,
+ 0xB5, 0x00, 0x77, 0x00, 0xB6, 0x00, 0x77, 0x00,
+ 0xB7, 0x00, 0x77, 0x00, 0xB8, 0x00, 0x76, 0x00,
+ 0xB9, 0x00, 0x77, 0x00, 0xBA, 0x00, 0x77, 0x00,
+ 0xBB, 0x00, 0x77, 0x00, 0xBC, 0x00, 0x77, 0x00,
+ 0xBD, 0x00, 0x77, 0x00, 0xBE, 0x00, 0x77, 0x00,
+ 0xBF, 0x00, 0x77, 0x00, 0xC0, 0x00, 0x76, 0x00,
+ 0xC1, 0x00, 0x77, 0x00, 0xC2, 0x00, 0x77, 0x00,
+ 0xC3, 0x00, 0x77, 0x00, 0xC4, 0x00, 0x6E, 0x00,
+ 0xC5, 0x00, 0x6E, 0x00, 0xC6, 0x00, 0x7D, 0x00,
+ 0xC7, 0x00, 0x78, 0x00, 0xC8, 0x00, 0x78, 0x00,
+ 0xD8, 0x00, 0x77, 0x00, 0xD9, 0x00, 0x77, 0x00,
+ 0xDA, 0x00, 0x77, 0x00, 0xDB, 0x00, 0x77, 0x00,
+ 0xDC, 0x00, 0x77, 0x00, 0xDD, 0x00, 0x78, 0x00,
+ 0xDE, 0x00, 0x78, 0x00, 0xFF, 0xFF, 0x00, 0x00,
+ 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00,
+ 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00,
+ 0xE3, 0x00, 0x77, 0x00, 0xE4, 0x00, 0x77, 0x00,
+ 0xE0, 0x00, 0x1E, 0x00, 0xDF, 0x00, 0x77, 0x00,
+ 0xE1, 0x00, 0x05, 0x00, 0xE2, 0x00, 0x0A, 0x00,
+ 0x00, 0x00, 0x50, 0x00, 0x01, 0x00, 0x50, 0x00,
+ 0x02, 0x00, 0x50, 0x00, 0x03, 0x00, 0x50, 0x00,
+ 0x04, 0x00, 0x50, 0x00, 0x05, 0x00, 0x50, 0x00,
+ 0x06, 0x00, 0x50, 0x00, 0x07, 0x00, 0x50, 0x00,
+ 0x08, 0x00, 0x50, 0x00, 0x09, 0x00, 0x50, 0x00,
+ 0x0A, 0x00, 0x50, 0x00, 0x0B, 0x00, 0x50, 0x00,
+ 0x0C, 0x00, 0x50, 0x00, 0x0D, 0x00, 0x50, 0x00,
+ 0x0E, 0x00, 0x50, 0x00, 0x0F, 0x00, 0x50, 0x00,
+ 0x10, 0x00, 0x50, 0x00, 0x11, 0x00, 0x5A, 0x00,
+ 0x12, 0x00, 0x5A, 0x00, 0x13, 0x00, 0x5A, 0x00,
+ 0x14, 0x00, 0x5A, 0x00, 0x15, 0x00, 0x5A, 0x00,
+ 0x16, 0x00, 0x5A, 0x00, 0x17, 0x00, 0x5A, 0x00,
+ 0x18, 0x00, 0x5A, 0x00, 0x19, 0x00, 0x5A, 0x00,
+ 0x1A, 0x00, 0x5A, 0x00, 0x1B, 0x00, 0x5A, 0x00,
+ 0x1C, 0x00, 0x5A, 0x00, 0x1D, 0x00, 0x5A, 0x00,
+ 0x1E, 0x00, 0x5A, 0x00, 0x1F, 0x00, 0x5A, 0x00,
+ 0x20, 0x00, 0x5A, 0x00, 0x21, 0x00, 0x73, 0x00,
+ 0x22, 0x00, 0x73, 0x00, 0x23, 0x00, 0x73, 0x00,
+ 0x24, 0x00, 0x73, 0x00, 0x25, 0x00, 0x73, 0x00,
+ 0x26, 0x00, 0x73, 0x00, 0x27, 0x00, 0x73, 0x00,
+ 0x28, 0x00, 0x73, 0x00, 0x29, 0x00, 0x73, 0x00,
+ 0x2A, 0x00, 0x73, 0x00, 0x2B, 0x00, 0x50, 0x00,
+ 0x2C, 0x00, 0x5A, 0x00, 0x2D, 0x00, 0x5A, 0x00,
+ 0x2E, 0x00, 0x5A, 0x00, 0x2F, 0x00, 0x5A, 0x00,
+ 0x30, 0x00, 0x5A, 0x00, 0x31, 0x00, 0x5A, 0x00
+};
+
+static const ByteProvider kLoLIngameSfxIndexDOSProvider = { ARRAYSIZE(kLoLIngameSfxIndexDOS), kLoLIngameSfxIndexDOS };
+
+static const byte kLoLMusicTrackMapDOS[240] = {
+ 0x01, 0x61, 0x02, 0x01, 0x61, 0x03, 0x01, 0x61,
+ 0x04, 0x01, 0x61, 0x05, 0x03, 0x61, 0x03, 0x01,
+ 0x61, 0x07, 0x01, 0x61, 0x08, 0x01, 0x62, 0x02,
+ 0x01, 0x64, 0x03, 0x01, 0x62, 0x04, 0x01, 0x62,
+ 0x05, 0x01, 0x62, 0x06, 0x01, 0x62, 0x07, 0x01,
+ 0x62, 0x08, 0x01, 0x62, 0x09, 0x01, 0x63, 0x02,
+ 0x01, 0x63, 0x03, 0x01, 0x63, 0x04, 0x01, 0x63,
+ 0x05, 0x01, 0x63, 0x06, 0x01, 0x63, 0x07, 0x01,
+ 0x64, 0x02, 0x02, 0x61, 0x02, 0x02, 0x61, 0x03,
+ 0x02, 0x61, 0x04, 0x02, 0x61, 0x05, 0x02, 0x61,
+ 0x06, 0x02, 0x61, 0x07, 0x02, 0x61, 0x08, 0x02,
+ 0x61, 0x09, 0x03, 0x61, 0x02, 0x03, 0x61, 0x03,
+ 0x03, 0x61, 0x04, 0x03, 0x61, 0x05, 0x03, 0x61,
+ 0x06, 0x03, 0x61, 0x07, 0x04, 0x61, 0x02, 0x04,
+ 0x61, 0x03, 0x04, 0x61, 0x04, 0x05, 0x61, 0x02,
+ 0x05, 0x61, 0x03, 0x05, 0x61, 0x04, 0x05, 0x61,
+ 0x05, 0x05, 0x61, 0x06, 0x06, 0x61, 0x03, 0x06,
+ 0x61, 0x05, 0x06, 0x61, 0x06, 0x06, 0x62, 0x02,
+ 0x06, 0x61, 0x02, 0x06, 0x61, 0x04, 0x08, 0x61,
+ 0x02, 0x08, 0x61, 0x03, 0x08, 0x61, 0x04, 0x08,
+ 0x61, 0x05, 0x08, 0x61, 0x06, 0x08, 0x61, 0x07,
+ 0x08, 0x62, 0x02, 0x08, 0x62, 0x03, 0x01, 0x61,
+ 0x09, 0x03, 0x62, 0x02, 0x03, 0x62, 0x03, 0x03,
+ 0x62, 0x04, 0x03, 0x62, 0x05, 0x03, 0x62, 0x06,
+ 0x03, 0x62, 0x07, 0x03, 0x62, 0x08, 0x04, 0x61,
+ 0x05, 0x04, 0x61, 0x06, 0x04, 0x61, 0x07, 0x04,
+ 0x61, 0x08, 0x05, 0x62, 0x02, 0x05, 0x62, 0x03,
+ 0x05, 0x62, 0x04, 0x07, 0x61, 0x02, 0x07, 0x61,
+ 0x03, 0x01, 0x64, 0x0A, 0x03, 0x62, 0x09, 0x01,
+ 0x64, 0x04, 0x05, 0x62, 0x05, 0x05, 0x62, 0x06
+};
+
+static const ByteProvider kLoLMusicTrackMapDOSProvider = { ARRAYSIZE(kLoLMusicTrackMapDOS), kLoLMusicTrackMapDOS };
+
+static const byte kLoLIngameGMSfxIndexDOS[250] = {
+ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+ 0xFF, 0xFF, 0xFF, 0x1A, 0x0B, 0xFF, 0xFF, 0xFF,
+ 0xFF, 0x25, 0x0B, 0x07, 0x25, 0x25, 0x25, 0x25,
+ 0x25, 0x25, 0x25, 0x1A, 0x11, 0x0E, 0x0E, 0x05,
+ 0x05, 0x11, 0x05, 0x05, 0x11, 0x05, 0x05, 0x11,
+ 0x2A, 0x2B, 0x06, 0xFF, 0x05, 0x05, 0x2B, 0x00,
+ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x25,
+ 0x25, 0x25, 0x25, 0xFF, 0xFF, 0xFF, 0x0C, 0x0C,
+ 0x0C, 0x0C, 0x0C, 0x0C, 0x08, 0x29, 0x29, 0x27,
+ 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x01, 0x0E,
+ 0x09, 0x09, 0x0A, 0x12, 0xE7, 0x29, 0xFF, 0xFF,
+ 0xFF, 0xFF, 0x18, 0x27, 0x13, 0x10, 0x1A, 0x1A,
+ 0xFF, 0xFF, 0x12, 0x26, 0xFF, 0x02, 0x05, 0x05,
+ 0x0F, 0xFF, 0xFF, 0xFF, 0x02, 0x05, 0x21, 0x1A,
+ 0xFF, 0xFF, 0xFF, 0xFF, 0x28, 0x0A, 0x19, 0xFF,
+ 0x0B, 0x06, 0x02, 0x02, 0x03, 0x02, 0xFF, 0xFF,
+ 0x0A, 0x0A, 0x0F, 0xFF, 0xFF, 0x0C, 0x1B, 0x22,
+ 0xFF, 0x1A, 0xFF, 0xFF, 0xFF, 0xFF, 0x10, 0x02,
+ 0x03, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A,
+ 0x29, 0x0A, 0x0A, 0x27, 0x0A, 0x28, 0x0A, 0x0A,
+ 0x06, 0xFF, 0x29, 0x29, 0x29, 0x28, 0x12, 0x12,
+ 0x12, 0x29, 0x29, 0x29, 0x25, 0x29, 0x27, 0x27,
+ 0x0C, 0x1A, 0xFF, 0xFF, 0xFF, 0xFF, 0x19, 0x19,
+ 0x19, 0x19, 0x19, 0x22, 0x1B, 0xFF, 0xFF, 0xFF,
+ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+ 0x16, 0xFF, 0x16, 0x16, 0xFF, 0xFF, 0xFF, 0xFF,
+ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+ 0xFF, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C,
+ 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C,
+ 0x0C, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22,
+ 0x22, 0x22, 0x22, 0x16, 0x0C, 0xFF, 0xFF, 0xFF,
+ 0xFF, 0xFF
+};
+
+static const ByteProvider kLoLIngameGMSfxIndexDOSProvider = { ARRAYSIZE(kLoLIngameGMSfxIndexDOS), kLoLIngameGMSfxIndexDOS };
+
+static const byte kLoLIngameMT32SfxIndexDOS[250] = {
+ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+ 0xFF, 0xFF, 0xFF, 0x30, 0x2E, 0xFF, 0xFF, 0xFF,
+ 0xFF, 0x2C, 0x31, 0x02, 0x2C, 0x2C, 0x2C, 0x2C,
+ 0x2C, 0x2C, 0x2C, 0x1A, 0x0C, 0x03, 0x04, 0x0B,
+ 0x0A, 0x0C, 0x0B, 0x0A, 0x0C, 0x0B, 0x0A, 0x0C,
+ 0x24, 0x25, 0x0D, 0x02, 0x0B, 0x0A, 0x25, 0xFF,
+ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x2C,
+ 0x2C, 0x2C, 0x2C, 0xFF, 0xFF, 0xFF, 0x2E, 0x2E,
+ 0x2E, 0x2E, 0x31, 0x31, 0x1B, 0x10, 0x23, 0x21,
+ 0x34, 0x34, 0x34, 0x34, 0x34, 0x34, 0x03, 0x04,
+ 0x2B, 0x2A, 0x32, 0x21, 0x18, 0x23, 0x1B, 0x1B,
+ 0x1B, 0xFF, 0x17, 0x33, 0x32, 0x08, 0x1A, 0x19,
+ 0x02, 0x02, 0x0E, 0x32, 0x09, 0x17, 0x0B, 0x0B,
+ 0x07, 0xFF, 0xFF, 0xFF, 0xFF, 0x0B, 0x01, 0x1A,
+ 0xFF, 0xFF, 0xFF, 0xFF, 0x33, 0x08, 0x34, 0xFF,
+ 0x31, 0x0D, 0x05, 0x06, 0x05, 0x06, 0xFF, 0xFF,
+ 0x0F, 0x34, 0x07, 0xFF, 0xFF, 0x31, 0x1A, 0x26,
+ 0xFF, 0x30, 0xFF, 0xFF, 0xFF, 0xFF, 0x07, 0x05,
+ 0x06, 0x33, 0x34, 0x34, 0x34, 0x34, 0x34, 0x33,
+ 0x32, 0x34, 0x34, 0x32, 0x34, 0x33, 0x34, 0xFF,
+ 0x27, 0xFF, 0x23, 0x23, 0x23, 0x21, 0x0E, 0x0E,
+ 0x0E, 0x23, 0x23, 0x23, 0x2C, 0x32, 0x33, 0x33,
+ 0x2F, 0x19, 0xFF, 0xFF, 0xFF, 0x18, 0x17, 0x18,
+ 0x18, 0x17, 0x18, 0x26, 0x06, 0xFF, 0xFF, 0xFF,
+ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+ 0x15, 0xFF, 0x15, 0x15, 0xFF, 0xFF, 0xFF, 0xFF,
+ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+ 0xFF, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31,
+ 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31,
+ 0x31, 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, 0x26,
+ 0x26, 0x26, 0x26, 0x15, 0x31, 0xFF, 0xFF, 0xFF,
+ 0xFF, 0xFF
+};
+
+static const ByteProvider kLoLIngameMT32SfxIndexDOSProvider = { ARRAYSIZE(kLoLIngameMT32SfxIndexDOS), kLoLIngameMT32SfxIndexDOS };
+
+static const byte kLoLIngamePcSpkSfxIndexDOS[250] = {
+ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+ 0xFF, 0xFF, 0xFF, 0x04, 0x0C, 0xFF, 0xFF, 0xFF,
+ 0xFF, 0x17, 0x0C, 0x10, 0x17, 0x17, 0x17, 0x17,
+ 0x17, 0x17, 0x17, 0x04, 0x14, 0x02, 0x02, 0x05,
+ 0x05, 0x14, 0x05, 0x05, 0x05, 0x14, 0x05, 0x05,
+ 0x14, 0x00, 0x00, 0x10, 0x05, 0x05, 0x01, 0xFF,
+ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x17,
+ 0x17, 0x17, 0x17, 0xFF, 0xFF, 0xFF, 0x0C, 0x0C,
+ 0x0C, 0x0C, 0x0C, 0x0C, 0x12, 0x0E, 0x0F, 0x11,
+ 0x0F, 0x11, 0x12, 0x11, 0x12, 0x12, 0x01, 0x01,
+ 0x02, 0x0A, 0x15, 0x12, 0x0A, 0x0F, 0x15, 0x15,
+ 0x15, 0xFF, 0x0A, 0xFF, 0x16, 0x05, 0x0A, 0x0A,
+ 0x10, 0x10, 0x07, 0x15, 0xFF, 0x0A, 0xFF, 0xFF,
+ 0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0x05, 0x10, 0x0A,
+ 0x13, 0x13, 0xFF, 0xFF, 0xFF, 0x01, 0x0A, 0xFF,
+ 0x0C, 0x00, 0x02, 0x02, 0x02, 0x02, 0xFF, 0xFF,
+ 0xFF, 0x15, 0x05, 0xFF, 0xFF, 0x0C, 0x16, 0x0B,
+ 0xFF, 0x0A, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+ 0xFF, 0x12, 0x11, 0x12, 0x11, 0x12, 0x11, 0x12,
+ 0x11, 0x12, 0x11, 0x12, 0x11, 0x12, 0x03, 0xFF,
+ 0x02, 0xFF, 0x0F, 0x0F, 0x0F, 0x0F, 0x08, 0x08,
+ 0x08, 0x16, 0x16, 0x16, 0x17, 0x16, 0x16, 0x16,
+ 0x0B, 0x0A, 0xFF, 0xFF, 0xFF, 0x0A, 0x0A, 0x0A,
+ 0x0A, 0x0A, 0x0A, 0x06, 0x10, 0xFF, 0xFF, 0xFF,
+ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+ 0x14, 0xFF, 0x14, 0x14, 0xFF, 0xFF, 0xFF, 0xFF,
+ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+ 0xFF, 0x0B, 0x0B, 0x0B, 0x0B, 0x0B, 0x0B, 0x0B,
+ 0x0B, 0x0B, 0x0B, 0x0B, 0x0B, 0x0B, 0x0B, 0x0B,
+ 0x0B, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D,
+ 0x0D, 0x0D, 0x0D, 0x14, 0x0B, 0xFF, 0xFF, 0xFF,
+ 0xFF, 0xFF
+};
+
+static const ByteProvider kLoLIngamePcSpkSfxIndexDOSProvider = { ARRAYSIZE(kLoLIngamePcSpkSfxIndexDOS), kLoLIngamePcSpkSfxIndexDOS };
+
+static const SpellProperty kLoLSpellPropertiesDOS[10] = {
+ { 16436, { 5, 10, 15, 25 }, 0, 0, { 0, 0, 0, 0 }, 0, 0, 0x0100 },
+ { 16437, { 5, 10, 25, 60 }, 0, 0, { 0, 0, 0, 0 }, 0, 0, 0x0001 },
+ { 16438, { 8, 15, 30, 80 }, 0, 0, { 0, 0, 0, 0 }, 0, 0, 0x0102 },
+ { 16440, { 20, 35, 65, 100 }, 0, 0, { 0, 0, 0, 0 }, 0, 0, 0x0103 },
+ { 16441, { 30, 60, 90, 120 }, 0, 0, { 0, 0, 0, 0 }, 0, 0, 0x0104 },
+ { 16442, { 30, 60, 90, 150 }, 0, 0, { 0, 0, 0, 0 }, 0, 0, 0x0105 },
+ { 16439, { 25, 30, 50, 100 }, 0, 0, { 0, 0, 0, 0 }, 0, 0, 0x0106 },
+ { 16443, { 3, 6, 12, 24 }, 0, 0, { 0, 0, 0, 0 }, 0, 0, 0x0107 },
+ { 16975, { 15, 15, 15, 15 }, 0, 0, { 0, 0, 0, 0 }, 0, 0, 0x0108 },
+ { 16975, { 15, 15, 15, 15 }, 15, 0, { 0, 0, 0, 0 }, 0, 0, 0x0108 }
+};
+
+static const SpellPropertyProvider kLoLSpellPropertiesDOSProvider = { ARRAYSIZE(kLoLSpellPropertiesDOS), kLoLSpellPropertiesDOS };
+
+static const byte kLoLGameShapeMapDOS[276] = {
+ 0x15, 0x54, 0x05, 0x35, 0x09, 0x36, 0x00, 0x34,
+ 0x00, 0x34, 0x00, 0x34, 0x00, 0x3A, 0x26, 0x3B,
+ 0x05, 0x35, 0x07, 0x37, 0x18, 0x3E, 0x0D, 0x3C,
+ 0x06, 0x40, 0x06, 0x3D, 0x01, 0x54, 0x01, 0x54,
+ 0x0A, 0x54, 0x0A, 0x54, 0x0A, 0x54, 0x04, 0x54,
+ 0x04, 0x54, 0x2D, 0x54, 0x2D, 0x54, 0x0B, 0x39,
+ 0x24, 0x54, 0x03, 0x38, 0x00, 0x3A, 0x1E, 0x3C,
+ 0x1E, 0x3C, 0x1B, 0x54, 0x14, 0x54, 0x29, 0x54,
+ 0x02, 0x54, 0x0C, 0x54, 0x22, 0x54, 0x21, 0x3F,
+ 0x0D, 0x3C, 0x25, 0x54, 0x1A, 0x3F, 0x04, 0x54,
+ 0x30, 0x54, 0x31, 0x54, 0x32, 0x54, 0x32, 0x54,
+ 0x00, 0x34, 0x00, 0x34, 0x00, 0x34, 0x00, 0x34,
+ 0x17, 0x54, 0x17, 0x54, 0x0E, 0x54, 0x0E, 0x54,
+ 0x0E, 0x54, 0x26, 0x3B, 0x2C, 0x54, 0x21, 0x3F,
+ 0x07, 0x37, 0x27, 0x54, 0x1B, 0x54, 0x1B, 0x54,
+ 0x1B, 0x54, 0x1B, 0x54, 0x1B, 0x54, 0x1B, 0x54,
+ 0x1B, 0x54, 0x1B, 0x54, 0x22, 0x54, 0x22, 0x54,
+ 0x16, 0x54, 0x2D, 0x54, 0x3B, 0x54, 0x3B, 0x54,
+ 0x3A, 0x54, 0x17, 0x54, 0x1B, 0x54, 0x1B, 0x54,
+ 0x17, 0x54, 0x0A, 0x54, 0x0A, 0x54, 0x0A, 0x54,
+ 0x1F, 0x54, 0x17, 0x54, 0x27, 0x54, 0x1B, 0x54,
+ 0x1E, 0x3C, 0x2A, 0x54, 0x2F, 0x54, 0x2F, 0x54,
+ 0x2F, 0x54, 0x2F, 0x54, 0x2F, 0x54, 0x2F, 0x54,
+ 0x2C, 0x54, 0x2C, 0x54, 0x2C, 0x54, 0x2C, 0x54,
+ 0x34, 0x54, 0x0F, 0x54, 0x35, 0x41, 0x1B, 0x54,
+ 0x1B, 0x54, 0x1B, 0x54, 0x1B, 0x54, 0x2B, 0x54,
+ 0x1D, 0x54, 0x1D, 0x54, 0x28, 0x54, 0x28, 0x54,
+ 0x28, 0x54, 0x28, 0x54, 0x01, 0x54, 0x14, 0x54,
+ 0x14, 0x54, 0x14, 0x54, 0x14, 0x54, 0x1B, 0x54,
+ 0x27, 0x54, 0x1B, 0x54, 0x1B, 0x54, 0x1B, 0x54,
+ 0x1B, 0x54, 0x36, 0x54, 0x37, 0x54, 0x38, 0x54,
+ 0x39, 0x54, 0x1B, 0x54, 0x1B, 0x54, 0x1B, 0x54,
+ 0x1B, 0x54, 0x27, 0x54, 0x2E, 0x54, 0x2E, 0x54,
+ 0x2E, 0x54, 0x2E, 0x54, 0x17, 0x54, 0x01, 0x54,
+ 0x1C, 0x54, 0x1C, 0x54
+};
+
+static const ByteProvider kLoLGameShapeMapDOSProvider = { ARRAYSIZE(kLoLGameShapeMapDOS), kLoLGameShapeMapDOS };
+
+static const byte kLoLSceneItemOffsDOS[8] = {
+ 0x00, 0xFE, 0x01, 0xFF, 0x02, 0x00, 0x01, 0xFF
+};
+
+static const ByteProvider kLoLSceneItemOffsDOSProvider = { ARRAYSIZE(kLoLSceneItemOffsDOS), kLoLSceneItemOffsDOS };
+
+static const byte kLoLCharInvIndexDOS[5] = {
+ 0x00, 0x00, 0x03, 0x01, 0x02
+};
+
+static const ByteProvider kLoLCharInvIndexDOSProvider = { ARRAYSIZE(kLoLCharInvIndexDOS), kLoLCharInvIndexDOS };
+
+static const byte kLoLCharInvDefsDOS[88] = {
+ 0x05, 0x34, 0x50, 0x34, 0xFF, 0xFF, 0xFF, 0xFF,
+ 0x05, 0x04, 0x05, 0x1C, 0x50, 0x04, 0x50, 0x1C,
+ 0x05, 0x5D, 0x0F, 0x4E, 0x50, 0x4E, 0x05, 0x19,
+ 0x50, 0x19, 0x05, 0x49, 0x50, 0x49, 0x05, 0x01,
+ 0x05, 0x31, 0x50, 0x01, 0x50, 0x31, 0x05, 0x61,
+ 0xFF, 0xFF, 0xFF, 0xFF, 0x05, 0x34, 0x50, 0x34,
+ 0xFF, 0xFF, 0xFF, 0xFF, 0x05, 0x04, 0x05, 0x1C,
+ 0x50, 0x04, 0x50, 0x1C, 0x05, 0x5D, 0x0F, 0x4E,
+ 0x50, 0x4E, 0x05, 0x34, 0x50, 0x34, 0xFF, 0xFF,
+ 0xFF, 0xFF, 0x05, 0x04, 0x05, 0x1C, 0x50, 0x04,
+ 0x50, 0x1C, 0xFF, 0xFF, 0x0F, 0x4E, 0x50, 0x4E
+};
+
+static const ByteProvider kLoLCharInvDefsDOSProvider = { ARRAYSIZE(kLoLCharInvDefsDOS), kLoLCharInvDefsDOS };
+
+static const uint16 kLoLCharDefsManDOS[9] = {
+ 0x0100, 0x0100, 0x0100, 0x0032, 0x0100, 0x0100, 0x0100, 0x0100,
+ 0x0004
+};
+
+static const Uint16Provider kLoLCharDefsManDOSProvider = { ARRAYSIZE(kLoLCharDefsManDOS), kLoLCharDefsManDOS };
+
+static const uint16 kLoLCharDefsWomanDOS[9] = {
+ 0x0100, 0x0100, 0x0100, 0x0032, 0x0100, 0x0100, 0x0100, 0x0100,
+ 0x0004
+};
+
+static const Uint16Provider kLoLCharDefsWomanDOSProvider = { ARRAYSIZE(kLoLCharDefsWomanDOS), kLoLCharDefsWomanDOS };
+
+static const uint16 kLoLCharDefsKieranDOS[9] = {
+ 0x0180, 0x0080, 0x00C0, 0x0032, 0x0200, 0x00A6, 0x0100, 0x0140,
+ 0x0006
+};
+
+static const Uint16Provider kLoLCharDefsKieranDOSProvider = { ARRAYSIZE(kLoLCharDefsKieranDOS), kLoLCharDefsKieranDOS };
+
+static const uint16 kLoLCharDefsAkshelDOS[9] = {
+ 0x00C0, 0x00C0, 0x0140, 0x0032, 0x0100, 0x0180, 0x0180, 0x0100,
+ 0x0004
+};
+
+static const Uint16Provider kLoLCharDefsAkshelDOSProvider = { ARRAYSIZE(kLoLCharDefsAkshelDOS), kLoLCharDefsAkshelDOS };
+
+static const uint32 kLoLExpRequirementsDOS[11] = {
+ 0x00000000, 0x000001F4, 0x000005DC, 0x00001388, 0x000061A8, 0x0000C350, 0x00013880, 0x0001D4C0,
+ 0x0002BF20, 0x00041EB0, 0x7FFFFFFF
+};
+
+static const Uint32Provider kLoLExpRequirementsDOSProvider = { ARRAYSIZE(kLoLExpRequirementsDOS), kLoLExpRequirementsDOS };
+
+static const uint16 kLoLMonsterModifiers1DOS[3] = {
+ 0x00C0, 0x0100, 0x0180
+};
+
+static const Uint16Provider kLoLMonsterModifiers1DOSProvider = { ARRAYSIZE(kLoLMonsterModifiers1DOS), kLoLMonsterModifiers1DOS };
+
+static const uint16 kLoLMonsterModifiers2DOS[3] = {
+ 0x0100, 0x0100, 0x00C0
+};
+
+static const Uint16Provider kLoLMonsterModifiers2DOSProvider = { ARRAYSIZE(kLoLMonsterModifiers2DOS), kLoLMonsterModifiers2DOS };
+
+static const uint16 kLoLMonsterModifiers3DOS[3] = {
+ 0x0140, 0x0100, 0x0080
+};
+
+static const Uint16Provider kLoLMonsterModifiers3DOSProvider = { ARRAYSIZE(kLoLMonsterModifiers3DOS), kLoLMonsterModifiers3DOS };
+
+static const byte kLoLMonsterShiftOffsetsDOS[32] = {
+ 0x01, 0x01, 0x01, 0x00, 0x01, 0xFF, 0x00, 0xFF,
+ 0x00, 0x00, 0x00, 0x01, 0xFF, 0x01, 0xFF, 0x00,
+ 0xFF, 0xFF, 0x00, 0xFF, 0x00, 0x00, 0x00, 0x01,
+ 0x01, 0x01, 0x01, 0x00, 0x01, 0xFF, 0x00, 0x00
+};
+
+static const ByteProvider kLoLMonsterShiftOffsetsDOSProvider = { ARRAYSIZE(kLoLMonsterShiftOffsetsDOS), kLoLMonsterShiftOffsetsDOS };
+
+static const byte kLoLMonsterDirFlagsDOS[16] = {
+ 0x08, 0x14, 0x00, 0x04, 0x04, 0x08, 0x14, 0x00,
+ 0x00, 0x04, 0x08, 0x14, 0x14, 0x00, 0x04, 0x08
+};
+
+static const ByteProvider kLoLMonsterDirFlagsDOSProvider = { ARRAYSIZE(kLoLMonsterDirFlagsDOS), kLoLMonsterDirFlagsDOS };
+
+static const byte kLoLMonsterScaleYDOS[30] = {
+ 0x7C, 0x78, 0x74, 0x70, 0x6C, 0x68, 0x65, 0x62,
+ 0x5F, 0x5C, 0x59, 0x56, 0x53, 0x50, 0x4D, 0x4A,
+ 0x48, 0x46, 0x44, 0x43, 0x41, 0x40, 0x3E, 0x3D,
+ 0x3C, 0x3B, 0x3A, 0x39, 0x38, 0x38
+};
+
+static const ByteProvider kLoLMonsterScaleYDOSProvider = { ARRAYSIZE(kLoLMonsterScaleYDOS), kLoLMonsterScaleYDOS };
+
+static const byte kLoLMonsterScaleXDOS[32] = {
+ 0x98, 0x98, 0x90, 0x88, 0x80, 0x76, 0x6E, 0x68,
+ 0x62, 0x5C, 0x58, 0x54, 0x50, 0x4A, 0x44, 0x40,
+ 0x3C, 0x38, 0x36, 0x32, 0x30, 0x2C, 0x2A, 0x28,
+ 0x26, 0x24, 0x22, 0x20, 0x20, 0x1E, 0x18, 0x10
+};
+
+static const ByteProvider kLoLMonsterScaleXDOSProvider = { ARRAYSIZE(kLoLMonsterScaleXDOS), kLoLMonsterScaleXDOS };
+
+static const uint16 kLoLMonsterScaleWHDOS[65] = {
+ 0x0041, 0x0045, 0x0049, 0x004D, 0x0051, 0x0055, 0x0059, 0x005D,
+ 0x0062, 0x0066, 0x006A, 0x006E, 0x0072, 0x0076, 0x007A, 0x007E,
+ 0x0082, 0x0086, 0x008A, 0x008E, 0x0092, 0x0096, 0x009A, 0x009E,
+ 0x00A3, 0x00A7, 0x00AB, 0x00AF, 0x00B3, 0x00B7, 0x00BB, 0x00BF,
+ 0x00C3, 0x00C7, 0x00CB, 0x00CF, 0x00D3, 0x00D7, 0x00DB, 0x00DF,
+ 0x00E4, 0x00E8, 0x00EC, 0x00F0, 0x00F4, 0x00F8, 0x00FC, 0x0100,
+ 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100,
+ 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100,
+ 0x0100
+};
+
+static const Uint16Provider kLoLMonsterScaleWHDOSProvider = { ARRAYSIZE(kLoLMonsterScaleWHDOS), kLoLMonsterScaleWHDOS };
+
+static const FlyingObjectShape kLoLFlyingObjectShpDOS[13] = {
+ { 0, 0, 1, 0x00, 0x40, },
+ { 2, 2, 3, 0x00, 0x00, },
+ { 4, 4, 4, 0x00, 0x00, },
+ { 5, 5, 5, 0x20, 0x00, },
+ { 6, 6, 6, 0x20, 0x00, },
+ { 7, 7, 7, 0x20, 0x00, },
+ { 9, 8, 15, 0x00, 0x00, },
+ { 11, 10, 12, 0x00, 0x00, },
+ { 12, 12, 12, 0x20, 0x00, },
+ { 14, 13, 15, 0x00, 0x00, },
+ { 16, 16, 16, 0x00, 0x00, },
+ { 17, 17, 17, 0x20, 0x00, },
+ { 18, 18, 18, 0x00, 0x00, }
+};
+
+static const FlyingObjectShapeProvider kLoLFlyingObjectShpDOSProvider = { ARRAYSIZE(kLoLFlyingObjectShpDOS), kLoLFlyingObjectShpDOS };
+
+static const uint16 kLoLInventoryDescDOS[11] = {
+ 0x417A, 0x417B, 0x417A, 0x417B, 0x417C, 0x417D, 0x417E, 0x417F,
+ 0x4180, 0x4181, 0x4181
+};
+
+static const Uint16Provider kLoLInventoryDescDOSProvider = { ARRAYSIZE(kLoLInventoryDescDOS), kLoLInventoryDescDOS };
+
+static const char *const kLoLLevelShpListDOS[12] = {
+ "KEEP.SHP",
+ "FOREST1.SHP",
+ "MANOR.SHP",
+ "CAVE1.SHP",
+ "SWAMP.SHP",
+ "URBISH.SHP",
+ "MINE1.SHP",
+ "TOWER1.SHP",
+ "YVEL1.SHP",
+ "CATWALK.SHP",
+ "RUIN.SHP",
+ "CIMMERIA.SHP"
+};
+
+static const StringListProvider kLoLLevelShpListDOSProvider = { ARRAYSIZE(kLoLLevelShpListDOS), kLoLLevelShpListDOS };
+
+static const char *const kLoLLevelDatListDOS[12] = {
+ "KEEP.DAT",
+ "FOREST1.DAT",
+ "MANOR.DAT",
+ "CAVE1.DAT",
+ "SWAMP.DAT",
+ "URBISH.DAT",
+ "MINE1.DAT",
+ "TOWER1.DAT",
+ "YVEL1.DAT",
+ "CATWALK.DAT",
+ "RUIN.DAT",
+ "CIMMERIA.DAT"
+};
+
+static const StringListProvider kLoLLevelDatListDOSProvider = { ARRAYSIZE(kLoLLevelDatListDOS), kLoLLevelDatListDOS };
+
+static const CompassDef kLoLCompassDefsDOS[32] = {
+ { 0, 3, -3, 0x00 },
+ { 1, 3, -3, 0x00 },
+ { 2, 3, -3, 0x00 },
+ { 3, 5, -3, 0x00 },
+ { 4, 5, -3, 0x00 },
+ { 5, 6, -3, 0x00 },
+ { 6, 6, -3, 0x00 },
+ { 7, 6, -3, 0x00 },
+ { 8, 6, -3, 0x00 },
+ { 7, 6, 4, 0x02 },
+ { 6, 6, 4, 0x02 },
+ { 5, 6, 4, 0x02 },
+ { 4, 5, 4, 0x02 },
+ { 3, 5, 4, 0x02 },
+ { 2, 3, 4, 0x02 },
+ { 1, 3, 4, 0x02 },
+ { 0, 3, 4, 0x02 },
+ { 1, 2, 4, 0x03 },
+ { 2, 2, 4, 0x03 },
+ { 3, 0, 4, 0x03 },
+ { 4, 0, 4, 0x03 },
+ { 5, -1, 4, 0x03 },
+ { 6, -1, 4, 0x03 },
+ { 7, -1, 4, 0x03 },
+ { 8, -1, -3, 0x01 },
+ { 7, -1, -3, 0x01 },
+ { 6, -1, -3, 0x01 },
+ { 5, -1, -3, 0x01 },
+ { 4, 0, -3, 0x01 },
+ { 3, 0, -3, 0x01 },
+ { 2, 2, -3, 0x01 },
+ { 1, 2, -3, 0x01 }
+};
+
+static const CompassDefProvider kLoLCompassDefsDOSProvider = { ARRAYSIZE(kLoLCompassDefsDOS), kLoLCompassDefsDOS };
+
+static const byte kLoLStashSetupDOS[12] = {
+ 0x04, 0x04, 0x04, 0x04, 0x02, 0x02, 0x02, 0x03,
+ 0x03, 0x00, 0x01, 0x01
+};
+
+static const ByteProvider kLoLStashSetupDOSProvider = { ARRAYSIZE(kLoLStashSetupDOS), kLoLStashSetupDOS };
+
+static const byte kLoLDscWallsDOS[36] = {
+ 0xFF, 0xFF, 0x02, 0x01, 0x02, 0x01, 0x02, 0xFF,
+ 0x02, 0x03, 0x02, 0x03, 0xFF, 0xFF, 0x02, 0x01,
+ 0x02, 0x01, 0x02, 0xFF, 0x02, 0x03, 0x02, 0x03,
+ 0x02, 0x01, 0x02, 0xFF, 0x02, 0x03, 0xFF, 0x01,
+ 0x02, 0xFF, 0xFF, 0x03
+};
+
+static const ByteProvider kLoLDscWallsDOSProvider = { ARRAYSIZE(kLoLDscWallsDOS), kLoLDscWallsDOS };
+
+static const byte kLoLDscShapeIndexDOS[36] = {
+ 0x03, 0x09, 0x03, 0x08, 0x03, 0x07, 0x03, 0x03,
+ 0x03, 0xF9, 0x03, 0xF8, 0x03, 0xF7, 0x02, 0x09,
+ 0x02, 0x06, 0x02, 0x02, 0x02, 0xFA, 0x02, 0xF7,
+ 0x01, 0x05, 0x01, 0x01, 0x01, 0xFB, 0x00, 0x04,
+ 0x00, 0x00, 0x00, 0xFC
+};
+
+static const ByteProvider kLoLDscShapeIndexDOSProvider = { ARRAYSIZE(kLoLDscShapeIndexDOS), kLoLDscShapeIndexDOS };
+
+static const byte kLoLDscOvlMapDOS[10] = {
+ 0x00, 0x01, 0x01, 0x01, 0x04, 0x05, 0x05, 0x05,
+ 0x05, 0x04
+};
+
+static const ByteProvider kLoLDscOvlMapDOSProvider = { ARRAYSIZE(kLoLDscOvlMapDOS), kLoLDscOvlMapDOS };
+
+static const uint16 kLoLDscScaleWidthDataDOS[36] = {
+ 0x0060, 0x0000, 0x0060, 0x00CE, 0x0060, 0x0055, 0x0060, 0x0000,
+ 0x0060, 0x0055, 0x0060, 0x00CE, 0x0060, 0x0000, 0x00A0, 0x00AE,
+ 0x00A0, 0x00AA, 0x00A0, 0x0000, 0x00A0, 0x00AA, 0x00A0, 0x00AE,
+ 0x0100, 0x0100, 0x0100, 0x0000, 0x0100, 0x0100, 0x0000, 0x0100,
+ 0x0100, 0x0000, 0x0000, 0x0100
+};
+
+static const Uint16Provider kLoLDscScaleWidthDataDOSProvider = { ARRAYSIZE(kLoLDscScaleWidthDataDOS), kLoLDscScaleWidthDataDOS };
+
+static const uint16 kLoLDscScaleHeightDataDOS[36] = {
+ 0x006A, 0x0000, 0x006A, 0x006A, 0x006A, 0x006A, 0x006A, 0x0000,
+ 0x006A, 0x006A, 0x006A, 0x006A, 0x006A, 0x0000, 0x00AA, 0x0056,
+ 0x00AA, 0x00AA, 0x00AA, 0x0000, 0x00AA, 0x00AA, 0x00AA, 0x0056,
+ 0x0100, 0x0100, 0x0100, 0x0000, 0x0100, 0x0100, 0x0000, 0x0100,
+ 0x0100, 0x0000, 0x0000, 0x0100
+};
+
+static const Uint16Provider kLoLDscScaleHeightDataDOSProvider = { ARRAYSIZE(kLoLDscScaleHeightDataDOS), kLoLDscScaleHeightDataDOS };
+
+static const uint16 kLoLDscXDOS[36] = {
+ 0xFFB0, 0xFFE0, 0xFFE0, 0x0010, 0x0010, 0x0040, 0x0040, 0x0000,
+ 0x0070, 0x0070, 0x00A0, 0x00A0, 0x00D0, 0x00D0, 0xFF86, 0x0000,
+ 0xFFE0, 0x0030, 0x0030, 0x0000, 0x0080, 0x0080, 0x00D0, 0x00B0,
+ 0xFF98, 0x0018, 0x0018, 0x0000, 0x0098, 0x0098, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x00B0, 0x00B0
+};
+
+static const Uint16Provider kLoLDscXDOSProvider = { ARRAYSIZE(kLoLDscXDOS), kLoLDscXDOS };
+
+static const byte kLoLBaseDscYDOS[36] = {
+ 0x1B, 0x1B, 0x1B, 0x1B, 0x1B, 0x1B, 0x1B, 0x1B,
+ 0x1B, 0x1B, 0x1B, 0x1B, 0x1B, 0x1B, 0x14, 0x1C,
+ 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x1C,
+ 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00
+};
+
+static const ByteProvider kLoLBaseDscYDOSProvider = { ARRAYSIZE(kLoLBaseDscYDOS), kLoLBaseDscYDOS };
+
+static const byte kLoLDscTileIndexDOS[18] = {
+ 0x00, 0x06, 0x01, 0x05, 0x02, 0x04, 0x03, 0x07,
+ 0x0B, 0x08, 0x0A, 0x09, 0x0C, 0x0E, 0x0D, 0x0F,
+ 0x11, 0x10
+};
+
+static const ByteProvider kLoLDscTileIndexDOSProvider = { ARRAYSIZE(kLoLDscTileIndexDOS), kLoLDscTileIndexDOS };
+
+static const byte kLoLDscUnk2DOS[23] = {
+ 0x00, 0x00, 0x00, 0x03, 0x03, 0x03, 0x03, 0x03,
+ 0x08, 0x08, 0x08, 0x08, 0x08, 0x0D, 0x0D, 0x0D,
+ 0x0D, 0x0D, 0x12, 0x12, 0x12, 0x12, 0x12
+};
+
+static const ByteProvider kLoLDscUnk2DOSProvider = { ARRAYSIZE(kLoLDscUnk2DOS), kLoLDscUnk2DOS };
+
+static const byte kLoLDscDoorShapeIndexDOS[23] = {
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01,
+ 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01
+};
+
+static const ByteProvider kLoLDscDoorShapeIndexDOSProvider = { ARRAYSIZE(kLoLDscDoorShapeIndexDOS), kLoLDscDoorShapeIndexDOS };
+
+static const byte kLoLDscDimData1DOS[324] = {
+ 0xD7, 0xD7, 0xD7, 0xD7, 0xD7, 0xD7, 0xD7, 0xD7,
+ 0xD7, 0xD7, 0xD7, 0xD7, 0xD7, 0xD7, 0xD7, 0xD7,
+ 0xD8, 0xD7, 0xD8, 0xD8, 0x02, 0xD8, 0xD8, 0xD8,
+ 0xD8, 0xFE, 0xD7, 0xD8, 0xD8, 0xD8, 0xD7, 0x03,
+ 0xD8, 0xFD, 0xD8, 0xD8, 0xD8, 0xFE, 0xD8, 0x08,
+ 0xD8, 0xD8, 0xD8, 0xFE, 0xF8, 0x06, 0xD8, 0xD8,
+ 0xFA, 0x03, 0xD8, 0xFD, 0xD8, 0xD8, 0xD8, 0xD8,
+ 0xD8, 0xD8, 0xD8, 0xD8, 0xD8, 0xD8, 0xFA, 0xD7,
+ 0x10, 0xD8, 0xFA, 0xD7, 0x10, 0xD8, 0xD8, 0xD8,
+ 0xD8, 0xD8, 0xD8, 0xF2, 0xD8, 0x14, 0xD8, 0xD8,
+ 0xD8, 0xF0, 0x0E, 0x14, 0xD8, 0xED, 0x10, 0xD8,
+ 0xD8, 0x13, 0xD8, 0xD8, 0xD8, 0xD8, 0xEC, 0xD8,
+ 0xD8, 0xD8, 0xD8, 0xD8, 0xD7, 0x14, 0xD8, 0xED,
+ 0xD7, 0xD8, 0xD8, 0x13, 0xD7, 0xD7, 0xD7, 0xD7,
+ 0xD7, 0xD7, 0xD7, 0xD7, 0xD7, 0xD7, 0xD7, 0xD7,
+ 0xD7, 0xD7, 0xD7, 0xD7, 0xD8, 0xD7, 0xD8, 0xD8,
+ 0xD8, 0xD8, 0xD8, 0xD8, 0xD8, 0xD8, 0xD7, 0xD8,
+ 0xD8, 0xD8, 0xD7, 0xD8, 0xD8, 0xD7, 0xD8, 0xD8,
+ 0xD8, 0xD8, 0xD8, 0xD8, 0xD8, 0xD8, 0xD8, 0xD8,
+ 0xD8, 0x06, 0xD8, 0xD8, 0xFA, 0x03, 0xD8, 0xFD,
+ 0xD8, 0xD8, 0xD8, 0xD8, 0xD8, 0xD8, 0xD8, 0xD8,
+ 0xD8, 0xD8, 0xFA, 0xD8, 0x10, 0xD8, 0xFA, 0xD7,
+ 0x10, 0xFD, 0xD8, 0x13, 0xD8, 0xD8, 0xD8, 0xD8,
+ 0xD8, 0xD8, 0xD8, 0xD8, 0xD8, 0xF0, 0xD8, 0xD8,
+ 0xD8, 0xED, 0x10, 0xD8, 0xD8, 0x13, 0xD8, 0xD8,
+ 0xD8, 0xD8, 0xD8, 0xD8, 0xD8, 0xD8, 0xD8, 0xD8,
+ 0xD7, 0xD8, 0xD8, 0xD8, 0xD7, 0xD8, 0xD8, 0xD7,
+ 0xD8, 0xD8, 0xD8, 0xD8, 0xD8, 0xD8, 0xD8, 0xD8,
+ 0xD8, 0xD8, 0xD8, 0xD8, 0xD8, 0x03, 0xD8, 0xFD,
+ 0xD8, 0xD8, 0xD8, 0xD8, 0xD8, 0xD8, 0xD8, 0xD8,
+ 0xD8, 0xD8, 0xD8, 0xD8, 0xD8, 0xD8, 0xFD, 0xD8,
+ 0x13, 0xFD, 0xD8, 0x13, 0xD8, 0xD8, 0xD8, 0xD8,
+ 0xD8, 0xD8, 0xD8, 0xD8, 0xD8, 0xD8, 0xD8, 0xD8,
+ 0xD8, 0xED, 0xD8, 0xD8, 0xD8, 0x13, 0xD8, 0xD8,
+ 0xD8, 0xD8, 0xD8, 0xD8, 0xD8, 0xD8, 0xD8, 0xD8,
+ 0xD8, 0xD8, 0xD8, 0xD8, 0xD8, 0xD8, 0xD8, 0xD8,
+ 0xD8, 0xD8, 0xD8, 0xD8, 0xD8, 0xD8, 0xD8, 0xD8,
+ 0xD8, 0xD8, 0xD8, 0xD8, 0xD8, 0xD8, 0xD8, 0xD8,
+ 0xD8, 0xD8, 0xD8, 0xD8, 0xD8, 0xD8, 0xD8, 0xD8,
+ 0xD8, 0xD8, 0xD8, 0xD8, 0xD8, 0xD8, 0xD8, 0xD8,
+ 0xD8, 0xD8, 0xD8, 0xD8
+};
+
+static const ByteProvider kLoLDscDimData1DOSProvider = { ARRAYSIZE(kLoLDscDimData1DOS), kLoLDscDimData1DOS };
+
+static const byte kLoLDscDimData2DOS[648] = {
+ 0x16, 0x00, 0x16, 0x00, 0x16, 0x00, 0x16, 0x00,
+ 0x16, 0x00, 0x16, 0x00, 0x16, 0x00, 0x16, 0x00,
+ 0x16, 0x00, 0x16, 0x00, 0x16, 0x00, 0x16, 0x00,
+ 0x16, 0x00, 0x16, 0x00, 0x16, 0x00, 0x16, 0x00,
+ 0x00, 0x16, 0x16, 0x00, 0x00, 0x16, 0x00, 0x16,
+ 0x00, 0x02, 0x00, 0x16, 0x00, 0x16, 0x00, 0x16,
+ 0x00, 0x16, 0x02, 0x16, 0x00, 0x04, 0x00, 0x16,
+ 0x00, 0x16, 0x00, 0x16, 0x16, 0x00, 0x00, 0x03,
+ 0x00, 0x16, 0x03, 0x16, 0x00, 0x16, 0x00, 0x16,
+ 0x00, 0x16, 0x02, 0x16, 0x00, 0x16, 0x00, 0x08,
+ 0x00, 0x16, 0x00, 0x16, 0x00, 0x16, 0x00, 0x02,
+ 0x16, 0x00, 0x00, 0x06, 0x00, 0x16, 0x00, 0x16,
+ 0x06, 0x16, 0x00, 0x03, 0x00, 0x16, 0x03, 0x00,
+ 0x00, 0x16, 0x00, 0x16, 0x00, 0x16, 0x00, 0x16,
+ 0x00, 0x16, 0x00, 0x16, 0x00, 0x16, 0x00, 0x16,
+ 0x00, 0x16, 0x00, 0x16, 0x06, 0x16, 0x08, 0x0E,
+ 0x00, 0x10, 0x00, 0x16, 0x03, 0x16, 0x06, 0x10,
+ 0x00, 0x13, 0x00, 0x16, 0x00, 0x16, 0x00, 0x16,
+ 0x00, 0x16, 0x00, 0x16, 0x00, 0x16, 0x0E, 0x16,
+ 0x00, 0x16, 0x00, 0x14, 0x00, 0x16, 0x00, 0x16,
+ 0x00, 0x16, 0x10, 0x16, 0x16, 0x00, 0x00, 0x14,
+ 0x00, 0x16, 0x13, 0x16, 0x00, 0x10, 0x00, 0x16,
+ 0x00, 0x16, 0x00, 0x13, 0x00, 0x16, 0x00, 0x16,
+ 0x00, 0x16, 0x00, 0x16, 0x14, 0x16, 0x00, 0x16,
+ 0x00, 0x16, 0x00, 0x16, 0x00, 0x16, 0x00, 0x16,
+ 0x12, 0x16, 0x14, 0x16, 0x00, 0x16, 0x13, 0x16,
+ 0x16, 0x00, 0x00, 0x16, 0x00, 0x16, 0x00, 0x13,
+ 0x16, 0x00, 0x16, 0x00, 0x16, 0x00, 0x16, 0x00,
+ 0x16, 0x00, 0x16, 0x00, 0x16, 0x00, 0x16, 0x00,
+ 0x16, 0x00, 0x16, 0x00, 0x16, 0x00, 0x16, 0x00,
+ 0x16, 0x00, 0x16, 0x00, 0x16, 0x00, 0x16, 0x00,
+ 0x00, 0x16, 0x16, 0x00, 0x16, 0x00, 0x16, 0x00,
+ 0x16, 0x00, 0x16, 0x00, 0x16, 0x00, 0x16, 0x00,
+ 0x16, 0x00, 0x16, 0x00, 0x16, 0x00, 0x16, 0x00,
+ 0x16, 0x00, 0x16, 0x00, 0x16, 0x00, 0x16, 0x00,
+ 0x16, 0x00, 0x16, 0x00, 0x00, 0x16, 0x16, 0x00,
+ 0x00, 0x16, 0x00, 0x16, 0x00, 0x16, 0x00, 0x16,
+ 0x00, 0x16, 0x00, 0x16, 0x00, 0x16, 0x00, 0x16,
+ 0x00, 0x16, 0x00, 0x06, 0x00, 0x16, 0x00, 0x16,
+ 0x06, 0x16, 0x00, 0x03, 0x00, 0x16, 0x03, 0x16,
+ 0x00, 0x16, 0x00, 0x16, 0x00, 0x16, 0x00, 0x16,
+ 0x00, 0x16, 0x00, 0x16, 0x00, 0x16, 0x00, 0x16,
+ 0x00, 0x16, 0x00, 0x16, 0x06, 0x16, 0x00, 0x16,
+ 0x00, 0x10, 0x00, 0x16, 0x03, 0x16, 0x07, 0x0F,
+ 0x00, 0x13, 0x03, 0x16, 0x00, 0x16, 0x00, 0x13,
+ 0x00, 0x16, 0x00, 0x16, 0x00, 0x16, 0x00, 0x16,
+ 0x00, 0x16, 0x00, 0x16, 0x00, 0x16, 0x00, 0x16,
+ 0x00, 0x16, 0x10, 0x16, 0x00, 0x16, 0x00, 0x16,
+ 0x00, 0x16, 0x13, 0x16, 0x00, 0x10, 0x00, 0x16,
+ 0x00, 0x16, 0x00, 0x13, 0x16, 0x00, 0x16, 0x00,
+ 0x16, 0x00, 0x16, 0x00, 0x16, 0x00, 0x16, 0x00,
+ 0x16, 0x00, 0x16, 0x00, 0x16, 0x00, 0x16, 0x00,
+ 0x16, 0x00, 0x16, 0x00, 0x16, 0x00, 0x16, 0x00,
+ 0x16, 0x00, 0x16, 0x00, 0x00, 0x16, 0x16, 0x00,
+ 0x00, 0x16, 0x00, 0x16, 0x00, 0x16, 0x00, 0x16,
+ 0x00, 0x16, 0x00, 0x16, 0x00, 0x16, 0x00, 0x16,
+ 0x00, 0x16, 0x00, 0x16, 0x00, 0x16, 0x00, 0x16,
+ 0x00, 0x16, 0x00, 0x03, 0x00, 0x16, 0x03, 0x16,
+ 0x00, 0x16, 0x00, 0x16, 0x00, 0x16, 0x00, 0x16,
+ 0x00, 0x16, 0x00, 0x16, 0x00, 0x16, 0x00, 0x16,
+ 0x00, 0x16, 0x00, 0x16, 0x00, 0x16, 0x00, 0x16,
+ 0x00, 0x16, 0x00, 0x16, 0x03, 0x16, 0x00, 0x16,
+ 0x00, 0x13, 0x03, 0x16, 0x00, 0x16, 0x00, 0x13,
+ 0x00, 0x16, 0x00, 0x16, 0x00, 0x16, 0x00, 0x16,
+ 0x00, 0x16, 0x00, 0x16, 0x00, 0x16, 0x00, 0x16,
+ 0x00, 0x16, 0x00, 0x16, 0x00, 0x16, 0x00, 0x16,
+ 0x00, 0x16, 0x13, 0x16, 0x00, 0x16, 0x00, 0x16,
+ 0x00, 0x16, 0x00, 0x13, 0x00, 0x16, 0x00, 0x16,
+ 0x00, 0x16, 0x00, 0x16, 0x00, 0x16, 0x00, 0x16,
+ 0x00, 0x16, 0x00, 0x16, 0x00, 0x16, 0x00, 0x16,
+ 0x00, 0x16, 0x00, 0x16, 0x00, 0x16, 0x00, 0x16,
+ 0x00, 0x16, 0x00, 0x16, 0x00, 0x16, 0x00, 0x16,
+ 0x00, 0x16, 0x00, 0x16, 0x00, 0x16, 0x00, 0x16,
+ 0x00, 0x16, 0x00, 0x16, 0x00, 0x16, 0x00, 0x16,
+ 0x00, 0x16, 0x00, 0x16, 0x00, 0x16, 0x00, 0x16,
+ 0x00, 0x16, 0x00, 0x16, 0x00, 0x16, 0x00, 0x16,
+ 0x00, 0x16, 0x00, 0x16, 0x00, 0x16, 0x00, 0x16,
+ 0x00, 0x16, 0x00, 0x16, 0x00, 0x16, 0x00, 0x16,
+ 0x00, 0x16, 0x00, 0x16, 0x00, 0x16, 0x00, 0x16,
+ 0x00, 0x16, 0x00, 0x16, 0x00, 0x16, 0x00, 0x16,
+ 0x00, 0x16, 0x00, 0x16, 0x00, 0x16, 0x00, 0x16
+};
+
+static const ByteProvider kLoLDscDimData2DOSProvider = { ARRAYSIZE(kLoLDscDimData2DOS), kLoLDscDimData2DOS };
+
+static const byte kLoLDscBlockMapDOS[12] = {
+ 0x02, 0x03, 0x00, 0x01, 0x01, 0x02, 0x03, 0x00,
+ 0x03, 0x00, 0x01, 0x02
+};
+
+static const ByteProvider kLoLDscBlockMapDOSProvider = { ARRAYSIZE(kLoLDscBlockMapDOS), kLoLDscBlockMapDOS };
+
+static const byte kLoLDscDimMapDOS[18] = {
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01,
+ 0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x02, 0x03,
+ 0x03, 0x03
+};
+
+static const ByteProvider kLoLDscDimMapDOSProvider = { ARRAYSIZE(kLoLDscDimMapDOS), kLoLDscDimMapDOS };
+
+static const byte kLoLDscOvlIndexDOS[20] = {
+ 0x00, 0x00, 0x01, 0x01, 0x01, 0x02, 0x02, 0x03,
+ 0x03, 0x03, 0x04, 0x04, 0x05, 0x05, 0x05, 0x06,
+ 0x06, 0x07, 0x07, 0x07
+};
+
+static const ByteProvider kLoLDscOvlIndexDOSProvider = { ARRAYSIZE(kLoLDscOvlIndexDOS), kLoLDscOvlIndexDOS };
+
+static const byte kLoLDscBlockIndexDOS[72] = {
+ 0x9D, 0x9E, 0x9F, 0xA0, 0xA1, 0xA2, 0xA3, 0xBE,
+ 0xBF, 0xC0, 0xC1, 0xC2, 0xDF, 0xE0, 0xE1, 0xFF,
+ 0x00, 0x01, 0xA3, 0xC3, 0xE3, 0x03, 0x23, 0x43,
+ 0x63, 0xC2, 0xE2, 0x02, 0x22, 0x42, 0xE1, 0x01,
+ 0x21, 0xE0, 0x00, 0x20, 0x63, 0x62, 0x61, 0x60,
+ 0x5F, 0x5E, 0x5D, 0x42, 0x41, 0x40, 0x3F, 0x3E,
+ 0x21, 0x20, 0x1F, 0x01, 0x00, 0xFF, 0x5D, 0x3D,
+ 0x1D, 0xFD, 0xDD, 0xBD, 0x9D, 0x3E, 0x1E, 0xFE,
+ 0xDE, 0xBE, 0x1F, 0xFF, 0xDF, 0x20, 0x00, 0xE0
+};
+
+static const ByteProvider kLoLDscBlockIndexDOSProvider = { ARRAYSIZE(kLoLDscBlockIndexDOS), kLoLDscBlockIndexDOS };
+
+static const byte kLoLDscDoorY2DOS[128] = {
+ 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
+ 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F,
+ 0x10, 0x11, 0x12, 0x13, 0x14, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x0D, 0x08, 0x03, 0x12, 0x0E, 0x09, 0x04, 0x00,
+ 0x13, 0x0F, 0x0A, 0x05, 0x01, 0x14, 0x10, 0x0B,
+ 0x06, 0x02, 0x11, 0x0C, 0x07, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x14, 0x13, 0x12, 0x11, 0x10, 0x0F, 0x0E, 0x0D,
+ 0x0C, 0x0B, 0x0A, 0x09, 0x08, 0x07, 0x06, 0x05,
+ 0x04, 0x03, 0x02, 0x01, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x07, 0x0C, 0x11, 0x02, 0x06, 0x0B, 0x10, 0x14,
+ 0x01, 0x05, 0x0A, 0x0F, 0x13, 0x00, 0x04, 0x09,
+ 0x0E, 0x12, 0x03, 0x08, 0x0D, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+};
+
+static const ByteProvider kLoLDscDoorY2DOSProvider = { ARRAYSIZE(kLoLDscDoorY2DOS), kLoLDscDoorY2DOS };
+
+static const byte kLoLDscDoorFrameY1DOS[4] = {
+ 0x1E, 0x18, 0x10, 0x00
+};
+
+static const ByteProvider kLoLDscDoorFrameY1DOSProvider = { ARRAYSIZE(kLoLDscDoorFrameY1DOS), kLoLDscDoorFrameY1DOS };
+
+static const byte kLoLDscDoorFrameY2DOS[4] = {
+ 0x3B, 0x47, 0x56, 0x78
+};
+
+static const ByteProvider kLoLDscDoorFrameY2DOSProvider = { ARRAYSIZE(kLoLDscDoorFrameY2DOS), kLoLDscDoorFrameY2DOS };
+
+static const uint16 kLoLDscDoorScaleDOS[8] = {
+ 0x0075, 0x006A, 0x00B9, 0x00B2, 0x0100, 0x0100, 0x0000, 0x0000
+};
+
+static const Uint16Provider kLoLDscDoorScaleDOSProvider = { ARRAYSIZE(kLoLDscDoorScaleDOS), kLoLDscDoorScaleDOS };
+
+static const uint16 kLoLDscDoor4DOS[4] = {
+ 0x0005, 0x0002, 0x0008, 0x787C
+};
+
+static const Uint16Provider kLoLDscDoor4DOSProvider = { ARRAYSIZE(kLoLDscDoor4DOS), kLoLDscDoor4DOS };
+
+static const uint16 kLoLDscDoorXDOS[576] = {
+ 0xFF98, 0xFFA0, 0xFFA8, 0xFF90, 0xFF98, 0xFFA0, 0xFFA8, 0xFFB0,
+ 0xFF74, 0xFF7E, 0xFF88, 0xFF92, 0xFF9C, 0xFF74, 0xFF7E, 0xFF88,
+ 0xFF92, 0xFF9C, 0xFF64, 0xFF70, 0xFF7C, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0xFFB8, 0xFFC0, 0xFFC8, 0xFFB0, 0xFFB8, 0xFFC0, 0xFFC8, 0xFFD0,
+ 0xFF9C, 0xFFA6, 0xFFB0, 0xFFBA, 0xFFC4, 0xFF9C, 0xFFA6, 0xFFB0,
+ 0xFFBA, 0xFFC4, 0xFF94, 0xFFA0, 0xFFAC, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0xFFD8, 0xFFE0, 0xFFE8, 0xFFD0, 0xFFD8, 0xFFE0, 0xFFE8, 0xFFF0,
+ 0xFFC4, 0xFFCE, 0xFFD8, 0xFFE2, 0xFFEC, 0xFFC4, 0xFFCE, 0xFFD8,
+ 0xFFE2, 0xFFEC, 0xFFC4, 0xFFD0, 0xFFDC, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0xFFF8, 0x0000, 0x0008, 0xFFF0, 0xFFF8, 0x0000, 0x0008, 0x0010,
+ 0xFFEC, 0xFFF6, 0x0000, 0x000A, 0x0014, 0xFFEC, 0xFFF6, 0x0000,
+ 0x000A, 0x0014, 0xFFF4, 0x0000, 0x000C, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0018, 0x0020, 0x0028, 0x0010, 0x0018, 0x0020, 0x0028, 0x0030,
+ 0x0014, 0x001E, 0x0028, 0x0032, 0x003C, 0x0014, 0x001E, 0x0028,
+ 0x0032, 0x003C, 0x0024, 0x0030, 0x003C, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0038, 0x0040, 0x0048, 0x0030, 0x0038, 0x0040, 0x0048, 0x0050,
+ 0x003C, 0x0046, 0x0050, 0x005A, 0x0064, 0x003C, 0x0046, 0x0050,
+ 0x005A, 0x0064, 0x0054, 0x0060, 0x006C, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0058, 0x0060, 0x0068, 0x0050, 0x0058, 0x0060, 0x0068, 0x0070,
+ 0x0064, 0x006E, 0x0078, 0x0082, 0x008C, 0x0064, 0x006E, 0x0078,
+ 0x0082, 0x008C, 0x0084, 0x0090, 0x009C, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0xFF94, 0xFFA0, 0xFFAC, 0xFF7E, 0xFF8B, 0xFF98, 0xFFA5, 0xFFB2,
+ 0xFF6C, 0xFF7B, 0xFF8A, 0xFF99, 0xFFA7, 0xFF60, 0xFF70, 0xFF80,
+ 0xFF90, 0xFFA0, 0xFF4C, 0xFF60, 0xFF74, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0xFFC4, 0xFFD0, 0xFFDC, 0xFFB2, 0xFFBF, 0xFFCC, 0xFFD9, 0xFFE6,
+ 0xFFA7, 0xFFB6, 0xFFC5, 0xFFD4, 0xFFE2, 0xFFA0, 0xFFB0, 0xFFC0,
+ 0xFFD0, 0xFFE0, 0xFF9C, 0xFFB0, 0xFFC4, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0xFFF4, 0x0000, 0x000C, 0xFFE6, 0xFFF3, 0x0000, 0x000D, 0x001A,
+ 0xFFE2, 0xFFF1, 0x0000, 0x000F, 0x001E, 0xFFE0, 0xFFF0, 0x0000,
+ 0x0010, 0x0020, 0xFFEC, 0x0000, 0x0014, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0024, 0x0030, 0x003C, 0x001A, 0x0027, 0x0034, 0x0041, 0x004E,
+ 0x001E, 0x002C, 0x003B, 0x004A, 0x0059, 0x0020, 0x0030, 0x0040,
+ 0x0050, 0x0060, 0x003C, 0x0050, 0x0064, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0054, 0x0060, 0x006C, 0x004E, 0x005B, 0x0068, 0x0075, 0x0082,
+ 0x0059, 0x0067, 0x0076, 0x0085, 0x0094, 0x0060, 0x0070, 0x0080,
+ 0x0090, 0x00A0, 0x008C, 0x00A0, 0x00B4, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0xFF9C, 0xFFB0, 0xFFC4, 0xFF7C, 0xFF92, 0xFFA8, 0xFFBE, 0xFFD4,
+ 0xFF6D, 0xFF85, 0xFF9E, 0xFFB6, 0xFFCF, 0xFF5E, 0xFF79, 0xFF94,
+ 0xFFAF, 0xFFCA, 0xFF60, 0xFF80, 0xFFA0, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0xFFEC, 0x0000, 0x0014, 0xFFD4, 0xFFEA, 0x0000, 0x0016, 0x002C,
+ 0xFFCF, 0xFFE7, 0x0000, 0x0019, 0x0031, 0xFFCA, 0xFFE5, 0x0000,
+ 0x001B, 0x0036, 0xFFE0, 0x0000, 0x0020, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x003C, 0x0050, 0x0064, 0x002C, 0x0042, 0x0058, 0x006E, 0x0084,
+ 0x0031, 0x004A, 0x0062, 0x007B, 0x0093, 0x0036, 0x0051, 0x006C,
+ 0x0087, 0x00A2, 0x0060, 0x0080, 0x00A0, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0xFF60, 0xFF80, 0xFFA0, 0xFF1C, 0xFF42, 0xFF68, 0xFF8E, 0xFFB4,
+ 0xFF40, 0xFF60, 0xFF80, 0xFFA0, 0xFFC0, 0xFF1C, 0xFF42, 0xFF68,
+ 0xFF8E, 0xFFB4, 0xFF60, 0xFF80, 0xFFA0, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0xFFE0, 0x0000, 0x0020, 0xFFB4, 0xFFDA, 0x0000, 0x0026, 0x004C,
+ 0xFFC0, 0xFFE0, 0x0000, 0x0020, 0x0040, 0xFFB4, 0xFFDA, 0x0000,
+ 0x0026, 0x004C, 0xFFE0, 0x0000, 0x0020, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0060, 0x0080, 0x00A0, 0x004C, 0x0072, 0x0098, 0x00BE, 0x00E4,
+ 0x0040, 0x0060, 0x0080, 0x00A0, 0x00C0, 0x004C, 0x0072, 0x0098,
+ 0x00BE, 0x00E4, 0x0060, 0x0080, 0x00A0, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000
+};
+
+static const Uint16Provider kLoLDscDoorXDOSProvider = { ARRAYSIZE(kLoLDscDoorXDOS), kLoLDscDoorXDOS };
+
+static const uint16 kLoLDscDoorYDOS[576] = {
+ 0xFFBF, 0xFFBF, 0xFFBF, 0xFFC1, 0xFFC1, 0xFFC1, 0xFFC1, 0xFFC1,
+ 0xFFC3, 0xFFC3, 0xFFC3, 0xFFC3, 0xFFC3, 0xFFC5, 0xFFC5, 0xFFC5,
+ 0xFFC5, 0xFFC5, 0xFFC9, 0xFFC9, 0xFFC9, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0xFFBF, 0xFFBF, 0xFFBF, 0xFFC1, 0xFFC1, 0xFFC1, 0xFFC1, 0xFFC1,
+ 0xFFC3, 0xFFC3, 0xFFC3, 0xFFC3, 0xFFC3, 0xFFC5, 0xFFC5, 0xFFC5,
+ 0xFFC5, 0xFFC5, 0xFFC9, 0xFFC9, 0xFFC9, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0xFFBF, 0xFFBF, 0xFFBF, 0xFFC1, 0xFFC1, 0xFFC1, 0xFFC1, 0xFFC1,
+ 0xFFC3, 0xFFC3, 0xFFC3, 0xFFC3, 0xFFC3, 0xFFC5, 0xFFC5, 0xFFC5,
+ 0xFFC5, 0xFFC5, 0xFFC9, 0xFFC9, 0xFFC9, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0xFFBF, 0xFFBF, 0xFFBF, 0xFFC1, 0xFFC1, 0xFFC1, 0xFFC1, 0xFFC1,
+ 0xFFC3, 0xFFC3, 0xFFC3, 0xFFC3, 0xFFC3, 0xFFC5, 0xFFC5, 0xFFC5,
+ 0xFFC5, 0xFFC5, 0xFFC9, 0xFFC9, 0xFFC9, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0xFFBF, 0xFFBF, 0xFFBF, 0xFFC1, 0xFFC1, 0xFFC1, 0xFFC1, 0xFFC1,
+ 0xFFC3, 0xFFC3, 0xFFC3, 0xFFC3, 0xFFC3, 0xFFC5, 0xFFC5, 0xFFC5,
+ 0xFFC5, 0xFFC5, 0xFFC9, 0xFFC9, 0xFFC9, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0xFFBF, 0xFFBF, 0xFFBF, 0xFFC1, 0xFFC1, 0xFFC1, 0xFFC1, 0xFFC1,
+ 0xFFC3, 0xFFC3, 0xFFC3, 0xFFC3, 0xFFC3, 0xFFC5, 0xFFC5, 0xFFC5,
+ 0xFFC5, 0xFFC5, 0xFFC9, 0xFFC9, 0xFFC9, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0xFFBF, 0xFFBF, 0xFFBF, 0xFFC1, 0xFFC1, 0xFFC1, 0xFFC1, 0xFFC1,
+ 0xFFC3, 0xFFC3, 0xFFC3, 0xFFC3, 0xFFC3, 0xFFC5, 0xFFC5, 0xFFC5,
+ 0xFFC5, 0xFFC5, 0xFFC9, 0xFFC9, 0xFFC9, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0xFFC9, 0xFFC9, 0xFFC9, 0xFFCB, 0xFFCB, 0xFFCB, 0xFFCB, 0xFFCB,
+ 0xFFCE, 0xFFCE, 0xFFCE, 0xFFCE, 0xFFCE, 0xFFD3, 0xFFD3, 0xFFD3,
+ 0xFFD3, 0xFFD3, 0xFFD7, 0xFFD7, 0xFFD7, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0xFFC9, 0xFFC9, 0xFFC9, 0xFFCB, 0xFFCB, 0xFFCB, 0xFFCB, 0xFFCB,
+ 0xFFCE, 0xFFCE, 0xFFCE, 0xFFCE, 0xFFCE, 0xFFD3, 0xFFD3, 0xFFD3,
+ 0xFFD3, 0xFFD3, 0xFFD7, 0xFFD7, 0xFFD7, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0xFFC9, 0xFFC9, 0xFFC9, 0xFFCB, 0xFFCB, 0xFFCB, 0xFFCB, 0xFFCB,
+ 0xFFCE, 0xFFCE, 0xFFCE, 0xFFCE, 0xFFCE, 0xFFD3, 0xFFD3, 0xFFD3,
+ 0xFFD3, 0xFFD3, 0xFFD7, 0xFFD7, 0xFFD7, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0xFFC9, 0xFFC9, 0xFFC9, 0xFFCB, 0xFFCB, 0xFFCB, 0xFFCB, 0xFFCB,
+ 0xFFCE, 0xFFCE, 0xFFCE, 0xFFCE, 0xFFCE, 0xFFD3, 0xFFD3, 0xFFD3,
+ 0xFFD3, 0xFFD3, 0xFFD7, 0xFFD7, 0xFFD7, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0xFFC9, 0xFFC9, 0xFFC9, 0xFFCB, 0xFFCB, 0xFFCB, 0xFFCB, 0xFFCB,
+ 0xFFCE, 0xFFCE, 0xFFCE, 0xFFCE, 0xFFCE, 0xFFD3, 0xFFD3, 0xFFD3,
+ 0xFFD3, 0xFFD3, 0xFFD7, 0xFFD7, 0xFFD7, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0xFFD7, 0xFFD7, 0xFFD7, 0xFFDD, 0xFFDD, 0xFFDD, 0xFFDD, 0xFFDD,
+ 0xFFE2, 0xFFE2, 0xFFE2, 0xFFE2, 0xFFE2, 0xFFEA, 0xFFEA, 0xFFEA,
+ 0xFFEA, 0xFFEA, 0xFFF8, 0xFFF8, 0xFFF8, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0xFFD7, 0xFFD7, 0xFFD7, 0xFFDD, 0xFFDD, 0xFFDD, 0xFFDD, 0xFFDD,
+ 0xFFE2, 0xFFE2, 0xFFE2, 0xFFE2, 0xFFE2, 0xFFEA, 0xFFEA, 0xFFEA,
+ 0xFFEA, 0xFFEA, 0xFFF8, 0xFFF8, 0xFFF8, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0xFFD7, 0xFFD7, 0xFFD7, 0xFFDD, 0xFFDD, 0xFFDD, 0xFFDD, 0xFFDD,
+ 0xFFE2, 0xFFE2, 0xFFE2, 0xFFE2, 0xFFE2, 0xFFEA, 0xFFEA, 0xFFEA,
+ 0xFFEA, 0xFFEA, 0xFFF8, 0xFFF8, 0xFFF8, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0xFFF8, 0xFFF8, 0xFFF8, 0xFFFC, 0xFFFC, 0xFFFC, 0xFFFC, 0xFFFC,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0xFFF8, 0xFFF8, 0xFFF8, 0xFFFC, 0xFFFC, 0xFFFC, 0xFFFC, 0xFFFC,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0xFFF8, 0xFFF8, 0xFFF8, 0xFFFC, 0xFFFC, 0xFFFC, 0xFFFC, 0xFFFC,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000
+};
+
+static const Uint16Provider kLoLDscDoorYDOSProvider = { ARRAYSIZE(kLoLDscDoorYDOS), kLoLDscDoorYDOS };
+
+static const byte kLoLScrollXTopDOS[5] = {
+ 0x05, 0x0A, 0x0F, 0x14, 0x19
+};
+
+static const ByteProvider kLoLScrollXTopDOSProvider = { ARRAYSIZE(kLoLScrollXTopDOS), kLoLScrollXTopDOS };
+
+static const byte kLoLScrollYTopDOS[5] = {
+ 0x02, 0x04, 0x07, 0x09, 0x0C
+};
+
+static const ByteProvider kLoLScrollYTopDOSProvider = { ARRAYSIZE(kLoLScrollYTopDOS), kLoLScrollYTopDOS };
+
+static const byte kLoLScrollXBottomDOS[5] = {
+ 0x05, 0x0A, 0x0F, 0x14, 0x19
+};
+
+static const ByteProvider kLoLScrollXBottomDOSProvider = { ARRAYSIZE(kLoLScrollXBottomDOS), kLoLScrollXBottomDOS };
+
+static const byte kLoLScrollYBottomDOS[5] = {
+ 0x04, 0x08, 0x0C, 0x10, 0x14
+};
+
+static const ByteProvider kLoLScrollYBottomDOSProvider = { ARRAYSIZE(kLoLScrollYBottomDOS), kLoLScrollYBottomDOS };
+
+static const LoLButtonDef kLoLButtonDefsDOS[95] = {
+ { 0x1100, 96, 352, 33, 131, 22, 19, 0x0000, 0 },
+ { 0x1100, 97, 353, 33, 150, 22, 18, 0x0000, 0 },
+ { 0x1100, 98, 354, 33, 150, 22, 18, 0x0000, 0 },
+ { 0x1100, 92, 348, 11, 150, 22, 18, 0x0000, 0 },
+ { 0x1100, 102, 358, 53, 150, 22, 18, 0x0000, 0 },
+ { 0x1100, 91, 347, 11, 131, 22, 19, 0x0000, 0 },
+ { 0x1100, 101, 357, 53, 131, 22, 19, 0x0000, 0 },
+ { 0x0100, 112, 0, 80, 143, 22, 17, 0x0000, 0 },
+ { 0x0100, 113, 0, 80, 143, 22, 17, 0x0001, 0 },
+ { 0x0100, 114, 0, 80, 143, 22, 17, 0x0002, 0 },
+ { 0x0100, 115, 0, 80, 143, 22, 17, 0x0003, 0 },
+ { 0x1100, 116, 0, 80, 160, 22, 17, 0x0000, 0 },
+ { 0x1100, 117, 0, 80, 160, 22, 17, 0x0001, 0 },
+ { 0x1100, 118, 0, 80, 160, 22, 17, 0x0002, 0 },
+ { 0x1100, 119, 0, 80, 160, 22, 17, 0x0003, 0 },
+ { 0x1100, 119, 0, 80, 144, 22, 32, 0x0000, 0 },
+ { 0x1100, 110, 0, 0, 0, 320, 200, 0x0003, 0 },
+ { 0x0100, 112, 0, 80, 143, 33, 34, 0x0000, 0 },
+ { 0x0100, 113, 0, 80, 143, 33, 34, 0x0001, 0 },
+ { 0x0100, 114, 0, 80, 143, 33, 34, 0x0002, 0 },
+ { 0x0100, 115, 0, 80, 143, 33, 34, 0x0003, 0 },
+ { 0x0100, 112, 0, 80, 143, 66, 34, 0x0000, 0 },
+ { 0x0100, 113, 0, 80, 143, 66, 34, 0x0001, 0 },
+ { 0x0100, 114, 0, 80, 143, 66, 34, 0x0002, 0 },
+ { 0x0100, 115, 0, 80, 143, 66, 34, 0x0003, 0 },
+ { 0x0100, 115, 0, 80, 143, 12, 34, 0x0000, 0 },
+ { 0x0100, 115, 0, 80, 143, 12, 34, 0x0001, 0 },
+ { 0x0100, 115, 0, 80, 143, 12, 34, 0x0002, 0 },
+ { 0x0100, 115, 0, 80, 143, 12, 34, 0x0003, 0 },
+ { 0x1000, 112, 0, 80, 143, 66, 34, 0x0000, 0 },
+ { 0x1000, 113, 0, 80, 143, 66, 34, 0x0001, 0 },
+ { 0x1000, 114, 0, 80, 143, 66, 34, 0x0002, 0 },
+ { 0x1000, 115, 0, 80, 143, 66, 34, 0x0003, 0 },
+ { 0x1100, 0, 0, 0, 0, 20, 19, 0x0000, 2 },
+ { 0x1100, 0, 0, 0, 0, 20, 19, 0x0001, 2 },
+ { 0x1100, 0, 0, 0, 0, 20, 19, 0x0002, 2 },
+ { 0x1100, 0, 0, 0, 0, 20, 19, 0x0003, 2 },
+ { 0x1100, 0, 0, 0, 0, 20, 19, 0x0004, 2 },
+ { 0x1100, 0, 0, 0, 0, 20, 19, 0x0005, 2 },
+ { 0x1100, 0, 0, 0, 0, 20, 19, 0x0006, 2 },
+ { 0x1100, 0, 0, 0, 0, 20, 19, 0x0007, 2 },
+ { 0x1100, 0, 0, 0, 0, 20, 19, 0x0008, 2 },
+ { 0x1100, 0, 0, 0, 0, 12, 11, 0x0009, 2 },
+ { 0x1100, 0, 0, 0, 0, 12, 11, 0x000A, 2 },
+ { 0x1100, 110, 0, 160, 93, 43, 19, 0x0000, 2 },
+ { 0x1100, 0, 0, 0, 102, 88, 19, 0x0000, 2 },
+ { 0x1100, 0, 0, 88, 102, 88, 19, 0x0001, 2 },
+ { 0x1100, 0, 0, 0, 85, 88, 17, 0x0002, 2 },
+ { 0x1100, 0, 0, 88, 85, 88, 17, 0x0003, 2 },
+ { 0x1100, 0, 0, 0, 0, 176, 120, 0x0000, 2 },
+ { 0x1100, 0, 0, 106, 179, 21, 21, 0x0000, 0 },
+ { 0x1100, 0, 0, 127, 179, 21, 21, 0x0001, 0 },
+ { 0x1100, 0, 0, 148, 179, 21, 21, 0x0002, 0 },
+ { 0x1100, 0, 0, 169, 179, 21, 21, 0x0003, 0 },
+ { 0x1100, 0, 0, 190, 179, 21, 21, 0x0004, 0 },
+ { 0x1100, 0, 0, 211, 179, 21, 21, 0x0005, 0 },
+ { 0x1100, 0, 0, 232, 179, 21, 21, 0x0006, 0 },
+ { 0x1100, 0, 0, 253, 179, 21, 21, 0x0007, 0 },
+ { 0x1100, 0, 0, 274, 179, 21, 21, 0x0008, 0 },
+ { 0x1100, 0, 0, 274, 179, 21, 21, 0x0009, 0 },
+ { 0x1100, 0, 0, 85, 179, 21, 21, 0xFFFF, 0 },
+ { 0x1100, 0, 0, 295, 179, 22, 21, 0x0001, 0 },
+ { 0x1100, 0, 0, 24, 8, 128, 96, 0x0001, 2 },
+ { 0x1100, 0, 0, 0, 0, 176, 120, 0x0000, 2 },
+ { 0x1100, 0, 0, 0, 0, 0, 0, 0x0000, 0 },
+ { 0x1100, 0, 0, 112, 0, 176, 16, 0x0001, 0 },
+ { 0x1100, 0, 0, 112, 110, 176, 26, 0x0001, 0 },
+ { 0x1100, 0, 0, 96, 88, 32, 32, 0x0001, 0 },
+ { 0x1100, 0, 0, 272, 88, 32, 32, 0x0001, 0 },
+ { 0x1100, 0, 0, 96, 16, 32, 72, 0x0001, 0 },
+ { 0x1100, 0, 0, 272, 16, 32, 72, 0x0001, 0 },
+ { 0x1100, 0, 0, 24, 15, 61, 9, 0x0000, 0 },
+ { 0x1100, 0, 0, 24, 24, 61, 9, 0x0000, 0 },
+ { 0x1100, 0, 0, 24, 33, 61, 9, 0x0000, 0 },
+ { 0x1100, 0, 0, 24, 42, 61, 9, 0x0000, 0 },
+ { 0x1100, 0, 0, 24, 51, 61, 9, 0x0000, 0 },
+ { 0x1100, 0, 0, 24, 60, 61, 9, 0x0000, 0 },
+ { 0x1100, 0, 0, 24, 69, 61, 9, 0x0000, 0 },
+ { 0x1100, 0, 0, 24, 78, 61, 9, 0x0000, 0 },
+ { 0x1100, 0, 0, 24, 87, 61, 9, 0x0000, 0 },
+ { 0x1100, 0, 0, 24, 96, 61, 9, 0x0000, 0 },
+ { 0x0100, 112, 0, 80, 143, 66, 34, 0x0000, 0 },
+ { 0x0100, 113, 0, 80, 143, 66, 34, 0x0001, 0 },
+ { 0x0100, 114, 0, 80, 143, 66, 34, 0x0002, 0 },
+ { 0x0100, 115, 0, 80, 143, 66, 34, 0x0003, 0 },
+ { 0x1100, 110, 0, 0, 0, 320, 200, 0x0003, 0 },
+ { 0x0100, 0, 0, 112, 0, 88, 80, 0x0000, 0 },
+ { 0x0100, 0, 0, 200, 0, 88, 80, 0x0001, 0 },
+ { 0x1100, 25, 110, 11, 178, 21, 22, 0x0000, 0 },
+ { 0x0100, 20, 0, 32, 178, 22, 22, 0x0000, 0 },
+ { 0x0100, 0, 0, 291, 96, 27, 24, 0x0000, 0 },
+ { 0x0100, 0, 0, 289, 0, 31, 28, 0x0000, 0 },
+ { 0x0100, 0, 0, 289, 31, 31, 23, 0x0000, 0 },
+ { 0x0100, 0, 0, 291, 56, 29, 24, 0x0000, 0 },
+ { 0x1100, 0, 0, 220, 98, 43, 19, 0x0000, 0 }
+};
+
+static const LoLButtonDefProvider kLoLButtonDefsDOSProvider = { ARRAYSIZE(kLoLButtonDefsDOS), kLoLButtonDefsDOS };
+
+static const byte kLoLButtonList1DOS[40] = {
+ 0x59, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x31,
+ 0x3E, 0x2D, 0x2E, 0x2F, 0x30, 0x56, 0x57, 0x01,
+ 0x02, 0x00, 0x03, 0x04, 0x05, 0x06, 0x32, 0x33,
+ 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3A, 0x3B,
+ 0x3C, 0x3D, 0x58, 0x5A, 0x5B, 0x5C, 0x5D, 0xFF
+};
+
+static const ByteProvider kLoLButtonList1DOSProvider = { ARRAYSIZE(kLoLButtonList1DOS), kLoLButtonList1DOS };
+
+static const byte kLoLButtonList2DOS[15] = {
+ 0x2C, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38,
+ 0x39, 0x3A, 0x3B, 0x3C, 0x3D, 0x5E, 0xFF
+};
+
+static const ByteProvider kLoLButtonList2DOSProvider = { ARRAYSIZE(kLoLButtonList2DOS), kLoLButtonList2DOS };
+
+static const byte kLoLButtonList3DOS[2] = {
+ 0x40, 0xFF
+};
+
+static const ByteProvider kLoLButtonList3DOSProvider = { ARRAYSIZE(kLoLButtonList3DOS), kLoLButtonList3DOS };
+
+static const byte kLoLButtonList4DOS[15] = {
+ 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39,
+ 0x3A, 0x3B, 0x3C, 0x3D, 0x5A, 0x5B, 0xFF
+};
+
+static const ByteProvider kLoLButtonList4DOSProvider = { ARRAYSIZE(kLoLButtonList4DOS), kLoLButtonList4DOS };
+
+static const byte kLoLButtonList5DOS[16] = {
+ 0x01, 0x02, 0x00, 0x03, 0x04, 0x05, 0x06, 0x41,
+ 0x42, 0x43, 0x44, 0x45, 0x46, 0x5A, 0x5B, 0xFF
+};
+
+static const ByteProvider kLoLButtonList5DOSProvider = { ARRAYSIZE(kLoLButtonList5DOS), kLoLButtonList5DOS };
+
+static const byte kLoLButtonList6DOS[14] = {
+ 0x2C, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38,
+ 0x39, 0x3A, 0x3B, 0x3C, 0x3D, 0xFF
+};
+
+static const ByteProvider kLoLButtonList6DOSProvider = { ARRAYSIZE(kLoLButtonList6DOS), kLoLButtonList6DOS };
+
+static const byte kLoLButtonList7DOS[3] = {
+ 0x0F, 0x10, 0xFF
+};
+
+static const ByteProvider kLoLButtonList7DOSProvider = { ARRAYSIZE(kLoLButtonList7DOS), kLoLButtonList7DOS };
+
+static const byte kLoLButtonList8DOS[2] = {
+ 0x55, 0xFF
+};
+
+static const ByteProvider kLoLButtonList8DOSProvider = { ARRAYSIZE(kLoLButtonList8DOS), kLoLButtonList8DOS };
+
+static const byte kLoLLegendDataDOS[48] = {
+ 0x0E, 0x00, 0x07, 0x42, 0x19, 0x00, 0x08, 0x42,
+ 0x1A, 0x00, 0x09, 0x42, 0x0D, 0x00, 0x0A, 0x42,
+ 0x0A, 0x00, 0x0B, 0x42, 0x0B, 0x00, 0x0C, 0x42,
+ 0x0F, 0x00, 0x0D, 0x42, 0x16, 0x00, 0x0E, 0x42,
+ 0x17, 0x00, 0x0F, 0x42, 0x11, 0x00, 0x10, 0x42,
+ 0x12, 0x00, 0x51, 0x42, 0xFF, 0xFF, 0xFF, 0xFF
+};
+
+static const ByteProvider kLoLLegendDataDOSProvider = { ARRAYSIZE(kLoLLegendDataDOS), kLoLLegendDataDOS };
+
+static const byte kLoLMapCursorOvlDOS[25] = {
+ 0x00, 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86,
+ 0x87, 0x88, 0x01, 0x01, 0x01, 0x01, 0x01, 0x88,
+ 0x87, 0x86, 0x85, 0x84, 0x83, 0x82, 0x81, 0x80,
+ 0x80
+};
+
+static const ByteProvider kLoLMapCursorOvlDOSProvider = { ARRAYSIZE(kLoLMapCursorOvlDOS), kLoLMapCursorOvlDOS };
+
+static const uint16 kLoLMapStringIdDOS[30] = {
+ 0xFFFF, 0x4211, 0x4212, 0x4213, 0x4214, 0x4215, 0x4216, 0x4217,
+ 0x4218, 0x4219, 0x421A, 0x421B, 0x421C, 0x421D, 0x421E, 0x421F,
+ 0x4220, 0x4221, 0x4222, 0x4223, 0x4224, 0x4225, 0x4226, 0x4227,
+ 0x4228, 0x4229, 0x422A, 0x422B, 0x422C, 0x422D
+};
+
+static const Uint16Provider kLoLMapStringIdDOSProvider = { ARRAYSIZE(kLoLMapStringIdDOS), kLoLMapStringIdDOS };
+
+static const byte kLoLSpellbookAnimDOS[28] = {
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x04, 0x00, 0x13, 0xB6, 0x04, 0x00, 0x13, 0x4D,
+ 0x04, 0x00, 0x13, 0xB9, 0x04, 0x00, 0x13, 0xB8,
+ 0x04, 0x00, 0x13, 0xBA
+};
+
+static const ByteProvider kLoLSpellbookAnimDOSProvider = { ARRAYSIZE(kLoLSpellbookAnimDOS), kLoLSpellbookAnimDOS };
+
+static const byte kLoLSpellbookCoordsDOS[12] = {
+ 0x16, 0x16, 0x16, 0x1F, 0x16, 0x28, 0x16, 0x31,
+ 0x16, 0x3A, 0x16, 0x43
+};
+
+static const ByteProvider kLoLSpellbookCoordsDOSProvider = { ARRAYSIZE(kLoLSpellbookCoordsDOS), kLoLSpellbookCoordsDOS };
+
+static const byte kLoLHealShapeFramesDOS[80] = {
+ 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x02, 0x02,
+ 0x02, 0x02, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x01, 0x01, 0x02, 0x02, 0x03, 0x03,
+ 0x03, 0x03, 0x02, 0x02, 0x01, 0x01, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05,
+ 0x05, 0x04, 0x03, 0x02, 0x01, 0x00, 0x00, 0x00,
+ 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
+ 0x07, 0x06, 0x05, 0x04, 0x03, 0x02, 0x01, 0x00,
+ 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
+ 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F
+};
+
+static const ByteProvider kLoLHealShapeFramesDOSProvider = { ARRAYSIZE(kLoLHealShapeFramesDOS), kLoLHealShapeFramesDOS };
+
+static const byte kLoLLightningDefsDOS[20] = {
+ 0x06, 0x05, 0xAB, 0x00, 0x06, 0x04, 0xAB, 0x00,
+ 0x08, 0x04, 0xAA, 0x00, 0x06, 0x03, 0xAA, 0x00,
+ 0x06, 0x02, 0xA9, 0x00
+};
+
+static const ByteProvider kLoLLightningDefsDOSProvider = { ARRAYSIZE(kLoLLightningDefsDOS), kLoLLightningDefsDOS };
+
+static const uint16 kLoLFireballCoordsDOS[256] = {
+ 0x0000, 0x0324, 0x0647, 0x096A, 0x0C8B, 0x0FAB, 0x12C7, 0x15E1,
+ 0x18F8, 0x1C0B, 0x1F19, 0x2223, 0x2527, 0x2826, 0x2B1E, 0x2E10,
+ 0x30FB, 0x33DE, 0x36B9, 0x398C, 0x3C56, 0x3F16, 0x41CD, 0x447A,
+ 0x471C, 0x49B3, 0x4C3F, 0x4EBF, 0x5133, 0x539A, 0x55F4, 0x5842,
+ 0x5A81, 0x5CB3, 0x5ED6, 0x60EB, 0x62F1, 0x64E7, 0x66CE, 0x68A5,
+ 0x6A6C, 0x6C23, 0x6DC9, 0x6F5E, 0x70E1, 0x7254, 0x73B5, 0x7503,
+ 0x7640, 0x776B, 0x7883, 0x7989, 0x7A7C, 0x7B5C, 0x7C29, 0x7CE2,
+ 0x7D89, 0x7E1C, 0x7E9C, 0x7F08, 0x7F61, 0x7FA6, 0x7FD7, 0x7FF5,
+ 0x7FFF, 0x7FF5, 0x7FD7, 0x7FA6, 0x7F61, 0x7F08, 0x7E9C, 0x7E1C,
+ 0x7D89, 0x7CE2, 0x7C29, 0x7B5C, 0x7A7C, 0x7989, 0x7883, 0x776B,
+ 0x7640, 0x7503, 0x73B5, 0x7254, 0x70E1, 0x6F5E, 0x6DC9, 0x6C23,
+ 0x6A6C, 0x68A5, 0x66CE, 0x64E7, 0x62F1, 0x60EB, 0x5ED6, 0x5CB3,
+ 0x5A81, 0x5842, 0x55F4, 0x539A, 0x5133, 0x4EBF, 0x4C3F, 0x49B3,
+ 0x471C, 0x447A, 0x41CD, 0x3F16, 0x3C56, 0x398C, 0x36B9, 0x33DE,
+ 0x30FB, 0x2E10, 0x2B1E, 0x2826, 0x2527, 0x2223, 0x1F19, 0x1C0B,
+ 0x18F8, 0x15E1, 0x12C7, 0x0FAB, 0x0C8B, 0x096A, 0x0647, 0x0324,
+ 0x0000, 0xFCDC, 0xF9B9, 0xF696, 0xF375, 0xF055, 0xED39, 0xEA1F,
+ 0xE708, 0xE3F5, 0xE0E7, 0xDDDD, 0xDAD9, 0xD7DA, 0xD4E2, 0xD1F0,
+ 0xCF05, 0xCC22, 0xC947, 0xC674, 0xC3AA, 0xC0EA, 0xBE33, 0xBB86,
+ 0xB8E4, 0xB64D, 0xB3C1, 0xB141, 0xAECD, 0xAC66, 0xAA0C, 0xA7BE,
+ 0xA57F, 0xA34D, 0xA12A, 0x9F15, 0x9D0F, 0x9B19, 0x9932, 0x975B,
+ 0x9594, 0x93DD, 0x9237, 0x90A2, 0x8F1F, 0x8DAC, 0x8C4B, 0x8AFD,
+ 0x89C0, 0x8895, 0x877D, 0x8677, 0x8584, 0x84A4, 0x83D7, 0x831E,
+ 0x8277, 0x81E4, 0x8164, 0x80F8, 0x809F, 0x805A, 0x8029, 0x800B,
+ 0x8001, 0x800B, 0x8029, 0x805A, 0x809F, 0x80F8, 0x8164, 0x81E4,
+ 0x8277, 0x831E, 0x83D7, 0x84A4, 0x8584, 0x8677, 0x877D, 0x8895,
+ 0x89C0, 0x8AFD, 0x8C4B, 0x8DAC, 0x8F1F, 0x90A2, 0x9237, 0x93DD,
+ 0x9594, 0x975B, 0x9932, 0x9B19, 0x9D0F, 0x9F15, 0xA12A, 0xA34D,
+ 0xA57F, 0xA7BE, 0xAA0C, 0xAC66, 0xAECD, 0xB141, 0xB3C1, 0xB64D,
+ 0xB8E4, 0xBB86, 0xBE33, 0xC0EA, 0xC3AA, 0xC674, 0xC947, 0xCC22,
+ 0xCF05, 0xD1F0, 0xD4E2, 0xD7DA, 0xDAD9, 0xDDDD, 0xE0E7, 0xE3F5,
+ 0xE708, 0xEA1F, 0xED39, 0xF055, 0xF375, 0xF696, 0xF9B9, 0xFCDC
+};
+
+static const Uint16Provider kLoLFireballCoordsDOSProvider = { ARRAYSIZE(kLoLFireballCoordsDOS), kLoLFireballCoordsDOS };
+
diff --git a/devtools/create_kyradat/resources/lol_dos_cd.h b/devtools/create_kyradat/resources/lol_dos_cd.h
new file mode 100644
index 0000000000..3482986658
--- /dev/null
+++ b/devtools/create_kyradat/resources/lol_dos_cd.h
@@ -0,0 +1,1625 @@
+static const byte kLoLHistoryDOSCD[465] = {
+ 0x31, 0x61, 0x68, 0x69, 0x73, 0x74, 0x30, 0x31,
+ 0x2E, 0x77, 0x73, 0x61, 0x00, 0x00, 0x00, 0x31,
+ 0x62, 0x68, 0x69, 0x73, 0x74, 0x30, 0x31, 0x2E,
+ 0x77, 0x73, 0x61, 0x00, 0x00, 0x00, 0x31, 0x63,
+ 0x68, 0x69, 0x73, 0x74, 0x30, 0x31, 0x2E, 0x77,
+ 0x73, 0x61, 0x00, 0x00, 0x00, 0x32, 0x61, 0x68,
+ 0x69, 0x73, 0x74, 0x30, 0x32, 0x2E, 0x77, 0x73,
+ 0x61, 0x00, 0x00, 0x00, 0x32, 0x62, 0x68, 0x69,
+ 0x73, 0x74, 0x30, 0x33, 0x2E, 0x77, 0x73, 0x61,
+ 0x00, 0x00, 0x00, 0x32, 0x65, 0x68, 0x69, 0x73,
+ 0x74, 0x30, 0x34, 0x2E, 0x77, 0x73, 0x61, 0x00,
+ 0x00, 0x00, 0x32, 0x66, 0x68, 0x69, 0x73, 0x74,
+ 0x30, 0x35, 0x2E, 0x77, 0x73, 0x61, 0x00, 0x00,
+ 0x00, 0x33, 0x61, 0x68, 0x69, 0x73, 0x74, 0x30,
+ 0x36, 0x61, 0x2E, 0x77, 0x73, 0x61, 0x00, 0x00,
+ 0x33, 0x62, 0x68, 0x69, 0x73, 0x74, 0x30, 0x36,
+ 0x61, 0x2E, 0x77, 0x73, 0x61, 0x00, 0x00, 0x33,
+ 0x63, 0x68, 0x69, 0x73, 0x74, 0x30, 0x36, 0x62,
+ 0x2E, 0x77, 0x73, 0x61, 0x00, 0x00, 0x33, 0x64,
+ 0x68, 0x69, 0x73, 0x74, 0x32, 0x30, 0x2E, 0x77,
+ 0x73, 0x61, 0x00, 0x00, 0x00, 0x34, 0x61, 0x68,
+ 0x69, 0x73, 0x74, 0x30, 0x38, 0x2E, 0x77, 0x73,
+ 0x61, 0x00, 0x00, 0x00, 0x34, 0x63, 0x68, 0x69,
+ 0x73, 0x74, 0x30, 0x39, 0x2E, 0x77, 0x73, 0x61,
+ 0x00, 0x00, 0x00, 0x34, 0x65, 0x68, 0x69, 0x73,
+ 0x74, 0x31, 0x30, 0x2E, 0x77, 0x73, 0x61, 0x00,
+ 0x00, 0x00, 0x35, 0x61, 0x68, 0x69, 0x73, 0x74,
+ 0x31, 0x31, 0x2E, 0x77, 0x73, 0x61, 0x00, 0x00,
+ 0x00, 0x35, 0x62, 0x68, 0x69, 0x73, 0x74, 0x31,
+ 0x32, 0x2E, 0x77, 0x73, 0x61, 0x00, 0x00, 0x00,
+ 0x35, 0x63, 0x68, 0x69, 0x73, 0x74, 0x31, 0x32,
+ 0x2E, 0x77, 0x73, 0x61, 0x00, 0x00, 0x00, 0x35,
+ 0x64, 0x68, 0x69, 0x73, 0x74, 0x31, 0x33, 0x2E,
+ 0x77, 0x73, 0x61, 0x00, 0x00, 0x00, 0x36, 0x61,
+ 0x68, 0x69, 0x73, 0x74, 0x31, 0x34, 0x2E, 0x77,
+ 0x73, 0x61, 0x00, 0x00, 0x00, 0x36, 0x62, 0x68,
+ 0x69, 0x73, 0x74, 0x31, 0x35, 0x2E, 0x77, 0x73,
+ 0x61, 0x00, 0x00, 0x00, 0x36, 0x63, 0x68, 0x69,
+ 0x73, 0x74, 0x31, 0x36, 0x2E, 0x77, 0x73, 0x61,
+ 0x00, 0x00, 0x00, 0x37, 0x61, 0x68, 0x69, 0x73,
+ 0x74, 0x31, 0x37, 0x2E, 0x77, 0x73, 0x61, 0x00,
+ 0x00, 0x00, 0x37, 0x62, 0x68, 0x69, 0x73, 0x74,
+ 0x31, 0x38, 0x61, 0x2E, 0x77, 0x73, 0x61, 0x00,
+ 0x00, 0x37, 0x63, 0x68, 0x69, 0x73, 0x74, 0x31,
+ 0x39, 0x2E, 0x77, 0x73, 0x61, 0x00, 0x00, 0x00,
+ 0x38, 0x61, 0x68, 0x69, 0x73, 0x74, 0x32, 0x31,
+ 0x63, 0x2E, 0x77, 0x73, 0x61, 0x00, 0x00, 0x38,
+ 0x63, 0x68, 0x69, 0x73, 0x74, 0x32, 0x31, 0x63,
+ 0x2E, 0x77, 0x73, 0x61, 0x00, 0x00, 0x39, 0x61,
+ 0x68, 0x69, 0x73, 0x74, 0x32, 0x32, 0x2E, 0x77,
+ 0x73, 0x61, 0x00, 0x00, 0x00, 0x39, 0x64, 0x68,
+ 0x69, 0x73, 0x74, 0x32, 0x33, 0x2E, 0x77, 0x73,
+ 0x61, 0x00, 0x00, 0x00, 0x39, 0x66, 0x68, 0x69,
+ 0x73, 0x74, 0x32, 0x34, 0x2E, 0x77, 0x73, 0x61,
+ 0x00, 0x00, 0x00, 0x39, 0x68, 0x68, 0x69, 0x73,
+ 0x74, 0x32, 0x35, 0x2E, 0x77, 0x73, 0x61, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00
+};
+
+static const ByteProvider kLoLHistoryDOSCDProvider = { ARRAYSIZE(kLoLHistoryDOSCD), kLoLHistoryDOSCD };
+
+static const char *const kLoLIngameSfxFilesDOSCD[230] = {
+ "XXXXXXXX",
+ "XXXXXXXX",
+ "XXXXXXXX",
+ "XXXXXXXX",
+ "XXXXXXXX",
+ "XXXXXXXX",
+ "XXXXXXXX",
+ "XXXXXXXX",
+ "XXXXXXXX",
+ "XXXXXXXX",
+ "XXXXXXXX",
+ "XXXXXXXX",
+ "XXXXXXXX",
+ "XXXXXXXX",
+ "XXXXXXXX",
+ "XXXXXXXX",
+ "XXXXXXXX",
+ "XXXXXXXX",
+ "XXXXXXXX",
+ "XXXXXXXX",
+ "XXXXXXXX",
+ "XXXXXXXX",
+ "XXXXXXXX",
+ "XXXXXXXX",
+ "XXXXXXXX",
+ "XXXXXXXX",
+ "XXXXXXXX",
+ "XXXXXXXX",
+ "XXXXXXXX",
+ "XXXXXXXX",
+ "XXXXXXXX",
+ "XXXXXXXX",
+ "XXXXXXXX",
+ "XXXXXXXX",
+ "XXXXXXXX",
+ "XXXXXXXX",
+ "XXXXXXXX",
+ "XXXXXXXX",
+ "XXXXXXXX",
+ "XXXXXXXX",
+ "XXXXXXXX",
+ "XXXXXXXX",
+ "XXXXXXXX",
+ "XXXXXXXX",
+ "XXXXXXXX",
+ "XXXXXXXX",
+ "XXXXXXXX",
+ "XXXXXXXX",
+ "XXXXXXXX",
+ "XXXXXXXX",
+ "DOORMTOP",
+ "DOORMTCL",
+ "PMETLHI",
+ "SWING6",
+ "MDAMAGE2",
+ "LEVERDN",
+ "LEVERUP",
+ "MTLDRSLM",
+ "DOORWDOP",
+ "DOORWDCL",
+ "KEYOPEN",
+ "KEYLOCK",
+ "PORTCUL",
+ "PORTCULD",
+ "LOKPICK",
+ "OCEAN2",
+ "NUNCHUK",
+ "SWING",
+ "SHWING1",
+ "SWING6",
+ "THROW",
+ "CROSSBOW",
+ "HEAL1",
+ "FIRESPL1",
+ "PRESSIN",
+ "PRESSOUT",
+ "PLATEON",
+ "PLATEOFF",
+ "DORWDSLM",
+ "LITENIN1",
+ "ICESPEL2",
+ "SPELL4B",
+ "SHIELD1",
+ "3BOLTC",
+ "2BOLTC",
+ "1BOLTC",
+ "DAWNSPL1",
+ "HEALKING",
+ "SPELL7",
+ "SWING1",
+ "EXPLODE",
+ "CROWCAW",
+ "MORPH2",
+ "CHEST",
+ "MONEY",
+ "SPELBK2",
+ "AUTOMAP",
+ "MINECRT3",
+ "CREAK1",
+ "TURNPAG2",
+ "POLGULP1",
+ "GOOEY2",
+ "BUCKBELL",
+ "KEEPXIT2",
+ "VSCREAM4",
+ "EMPTY",
+ "GOOEY1",
+ "GOOEY2",
+ "RIPPOD4",
+ "PODSKEL1",
+ "INVISO",
+ "OPENBOX2",
+ "ACCEPT2",
+ "BOW2",
+ "HACHUCKM",
+ "FOUNDRY2",
+ "FOUNDRY2",
+ "FOUNDRY4",
+ "FOUNDRY6",
+ "CLEANGL1",
+ "CLEANGL2",
+ "GLOWY1",
+ "DORSTNOP",
+ "DORSTNCL",
+ "EMPTY",
+ "EMPTY",
+ "EMPTY",
+ "EMPTY",
+ "ADAMAGE1",
+ "HDAMAGE1",
+ "TDAMAGE1",
+ "BDAMAGE1",
+ "LDAMAGE1",
+ "TDAMAGE2",
+ "CDAMAGE1",
+ "EMPTY",
+ "EMPTY",
+ "EMPTY",
+ "GOOD1",
+ "GOOD2",
+ "EMPTY",
+ "EMPTY",
+ "EMPTY",
+ "LITENIN1",
+ "COMPASS2",
+ "KINGDOR1",
+ "GLASBRK2",
+ "FLUTTER3",
+ "NUNCHUK",
+ "WALLFALL",
+ "WALLHIT",
+ "MWHOA1",
+ "LADDER",
+ "WHITTL3",
+ "ROWBOAT1",
+ "HORSEY2",
+ "SNORT",
+ "PUMPDOR1",
+ "PUMPSM2",
+ "PUMPSM3",
+ "SPARK1",
+ "BEZEL",
+ "SWARM",
+ "CHEST1",
+ "WRIT1",
+ "CAUSFOG",
+ "VAELAN2",
+ "ROARSPL1",
+ "RATTLER",
+ "WINK1",
+ "HANDFATE",
+ "QUAKE1",
+ "WIZLAMP1",
+ "SAP2",
+ "MSTDOOM1",
+ "GARDIAN1",
+ "VORTEX1",
+ "LION1",
+ "STEAM",
+ "SQUAWCK",
+ "SLIDEMUG",
+ "SPARKHIT",
+ "SPARKHIT2",
+ "SPARKHIT3",
+ "ICEFORM",
+ "ICEXPLOD",
+ "EXPLODE2",
+ "EXPLODE3",
+ "BOLTQUK2",
+ "BOLT2",
+ "BOLT3",
+ "SNKBITE",
+ "HANDGLOW",
+ "MSTDOOM2",
+ "MSTDOOM3",
+ "GARDIAN2",
+ "PLUSPOWR",
+ "MINSPOWR",
+ "BLUDCURL",
+ "LORAGASP",
+ "POURH2O",
+ "AWHOA2",
+ "HWHOA1",
+ "CWHOA1",
+ "AFALL2",
+ "EMPTY",
+ "CFALL2",
+ "MFALL2",
+ "EMPTY",
+ "EMPTY",
+ "EMPTY",
+ "EMPTY",
+ "EMPTY",
+ "EMPTY",
+ "EMPTY",
+ "EMPTY",
+ "WRIT2",
+ "WRIT3",
+ "WRIT4",
+ "WRIT5",
+ "WRIT6",
+ "RUCKUS1",
+ "RUCKUS3",
+ "CHANT1",
+ "EMPTY",
+ "EMPTY",
+ "EMPTY",
+ "CHANT2",
+ "CHANT3",
+ ""
+};
+
+static const StringListProvider kLoLIngameSfxFilesDOSCDProvider = { ARRAYSIZE(kLoLIngameSfxFilesDOSCD), kLoLIngameSfxFilesDOSCD };
+
+static const byte kLoLIngameSfxIndexDOSCD[1000] = {
+ 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00,
+ 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00,
+ 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00,
+ 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00,
+ 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00,
+ 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00,
+ 0x34, 0x00, 0x6F, 0x00, 0x7C, 0x00, 0x00, 0x00,
+ 0x7D, 0x00, 0x00, 0x00, 0x7E, 0x00, 0x00, 0x00,
+ 0x7F, 0x00, 0x00, 0x00, 0x36, 0x00, 0x73, 0x00,
+ 0x35, 0x00, 0x9C, 0xFF, 0xFF, 0xFF, 0x00, 0x00,
+ 0x80, 0x00, 0x73, 0x00, 0x81, 0x00, 0x73, 0x00,
+ 0x82, 0x00, 0x73, 0x00, 0x83, 0x00, 0x73, 0x00,
+ 0x84, 0x00, 0x73, 0x00, 0x85, 0x00, 0x73, 0x00,
+ 0x86, 0x00, 0x73, 0x00, 0xD7, 0x00, 0x76, 0x00,
+ 0x87, 0x00, 0x65, 0x00, 0x38, 0x00, 0x5F, 0x00,
+ 0x37, 0x00, 0x5F, 0x00, 0x32, 0x00, 0x0A, 0x00,
+ 0x33, 0x00, 0x64, 0x00, 0x39, 0x00, 0x65, 0x00,
+ 0x3A, 0x00, 0x0A, 0x00, 0x3B, 0x00, 0x14, 0x00,
+ 0x4E, 0x00, 0x65, 0x00, 0x7A, 0x00, 0x64, 0x00,
+ 0x7B, 0x00, 0x64, 0x00, 0x88, 0x00, 0x65, 0x00,
+ 0x3C, 0x00, 0x65, 0x00, 0x3D, 0x00, 0x64, 0x00,
+ 0x89, 0x00, 0x00, 0x00, 0x8E, 0x00, 0x14, 0x00,
+ 0x3E, 0x00, 0x00, 0x00, 0x3F, 0x00, 0x00, 0x00,
+ 0x40, 0x00, 0x65, 0x00, 0x41, 0x00, 0x00, 0x00,
+ 0xC9, 0x00, 0x72, 0x00, 0xCA, 0x00, 0x72, 0x00,
+ 0xCB, 0x00, 0x72, 0x00, 0xCC, 0x00, 0x74, 0x00,
+ 0xCD, 0x00, 0x74, 0x00, 0xCE, 0x00, 0x74, 0x00,
+ 0xCF, 0x00, 0x74, 0x00, 0xD0, 0x00, 0x73, 0x00,
+ 0xD1, 0x00, 0x73, 0x00, 0xD2, 0x00, 0x73, 0x00,
+ 0xD3, 0x00, 0x73, 0x00, 0xD4, 0x00, 0x72, 0x00,
+ 0xD5, 0x00, 0x72, 0x00, 0xD6, 0x00, 0x72, 0x00,
+ 0x42, 0x00, 0x6F, 0x00, 0x43, 0x00, 0x6F, 0x00,
+ 0x44, 0x00, 0x6F, 0x00, 0x45, 0x00, 0x6F, 0x00,
+ 0x46, 0x00, 0x6F, 0x00, 0x47, 0x00, 0x6F, 0x00,
+ 0x48, 0x00, 0x77, 0x00, 0x49, 0x00, 0x89, 0xFF,
+ 0x4F, 0x00, 0x89, 0xFF, 0x50, 0x00, 0x89, 0xFF,
+ 0xA0, 0x00, 0x8A, 0xFF, 0xA1, 0x00, 0x89, 0xFF,
+ 0xA2, 0x00, 0x89, 0xFF, 0xFF, 0xFF, 0x00, 0x00,
+ 0xA3, 0x00, 0x89, 0xFF, 0xA4, 0x00, 0x89, 0xFF,
+ 0x4A, 0x00, 0x13, 0x00, 0x4B, 0x00, 0x13, 0x00,
+ 0x4C, 0x00, 0x32, 0x00, 0x4D, 0x00, 0x32, 0x00,
+ 0x5F, 0x00, 0x0A, 0x00, 0x51, 0x00, 0x00, 0x00,
+ 0x52, 0x00, 0x00, 0x00, 0x8F, 0x00, 0x00, 0x00,
+ 0x53, 0x00, 0x00, 0x00, 0x54, 0x00, 0x00, 0x00,
+ 0x55, 0x00, 0x00, 0x00, 0x56, 0x00, 0x00, 0x00,
+ 0x57, 0x00, 0x00, 0x00, 0x58, 0x00, 0x77, 0x00,
+ 0x60, 0x00, 0x00, 0x00, 0x5D, 0x00, 0x6A, 0x00,
+ 0x8A, 0x00, 0x6F, 0x00, 0x8B, 0x00, 0x6F, 0x00,
+ 0x8C, 0x00, 0x00, 0x00, 0x8D, 0x00, 0x00, 0x00,
+ 0x5A, 0x00, 0x77, 0x00, 0x5C, 0x00, 0x00, 0x00,
+ 0x5B, 0x00, 0x00, 0x00, 0x5E, 0x00, 0x6F, 0x00,
+ 0x61, 0x00, 0x76, 0x00, 0xFF, 0xFF, 0x00, 0x00,
+ 0x62, 0x00, 0x76, 0x00, 0x63, 0x00, 0x3C, 0x00,
+ 0x64, 0x00, 0x6D, 0x00, 0x65, 0x00, 0x00, 0x00,
+ 0x66, 0x00, 0x00, 0x00, 0x67, 0x00, 0x00, 0x00,
+ 0x68, 0x00, 0x00, 0x00, 0x69, 0x00, 0x00, 0x00,
+ 0x6A, 0x00, 0x00, 0x00, 0x6B, 0x00, 0x00, 0x00,
+ 0x6C, 0x00, 0x00, 0x00, 0x6D, 0x00, 0x00, 0x00,
+ 0x6E, 0x00, 0x00, 0x00, 0x6F, 0x00, 0x00, 0x00,
+ 0x70, 0x00, 0x88, 0xFF, 0xFF, 0xFF, 0x00, 0x00,
+ 0x71, 0x00, 0x00, 0x00, 0x72, 0x00, 0x00, 0x00,
+ 0x73, 0x00, 0x74, 0x00, 0x74, 0x00, 0x00, 0x00,
+ 0x75, 0x00, 0x00, 0x00, 0x76, 0x00, 0x00, 0x00,
+ 0x77, 0x00, 0x00, 0x00, 0x78, 0x00, 0x00, 0x00,
+ 0x79, 0x00, 0x77, 0x00, 0x90, 0x00, 0x00, 0x00,
+ 0x91, 0x00, 0x00, 0x00, 0x92, 0x00, 0x77, 0x00,
+ 0x93, 0x00, 0x1E, 0x00, 0x94, 0x00, 0x89, 0xFF,
+ 0x95, 0x00, 0x77, 0x00, 0x96, 0x00, 0x76, 0x00,
+ 0x97, 0x00, 0x72, 0x00, 0x98, 0x00, 0x00, 0x00,
+ 0x99, 0x00, 0x50, 0x00, 0x9A, 0x00, 0x78, 0x00,
+ 0x9B, 0x00, 0x64, 0x00, 0x9C, 0x00, 0x5A, 0x00,
+ 0x9D, 0x00, 0x64, 0x00, 0x9E, 0x00, 0x65, 0x00,
+ 0x9F, 0x00, 0x66, 0x00, 0xA5, 0x00, 0x89, 0xFF,
+ 0xA6, 0x00, 0x89, 0xFF, 0xA7, 0x00, 0x77, 0x00,
+ 0xA8, 0x00, 0x76, 0x00, 0xFF, 0xFF, 0x00, 0x00,
+ 0xA9, 0x00, 0x77, 0x00, 0xAA, 0x00, 0x77, 0x00,
+ 0xAB, 0x00, 0x77, 0x00, 0xAC, 0x00, 0x77, 0x00,
+ 0xAD, 0x00, 0x77, 0x00, 0xAE, 0x00, 0x77, 0x00,
+ 0xAF, 0x00, 0x76, 0x00, 0xB0, 0x00, 0x77, 0x00,
+ 0xB1, 0x00, 0x64, 0x00, 0xB2, 0x00, 0x6F, 0x00,
+ 0xB3, 0x00, 0x6E, 0x00, 0xB4, 0x00, 0x6E, 0x00,
+ 0xB5, 0x00, 0x77, 0x00, 0xB6, 0x00, 0x77, 0x00,
+ 0xB7, 0x00, 0x77, 0x00, 0xB8, 0x00, 0x76, 0x00,
+ 0xB9, 0x00, 0x77, 0x00, 0xBA, 0x00, 0x77, 0x00,
+ 0xBB, 0x00, 0x77, 0x00, 0xBC, 0x00, 0x77, 0x00,
+ 0xBD, 0x00, 0x77, 0x00, 0xBE, 0x00, 0x77, 0x00,
+ 0xBF, 0x00, 0x77, 0x00, 0xC0, 0x00, 0x76, 0x00,
+ 0xC1, 0x00, 0x77, 0x00, 0xC2, 0x00, 0x77, 0x00,
+ 0xC3, 0x00, 0x77, 0x00, 0xC4, 0x00, 0x6E, 0x00,
+ 0xC5, 0x00, 0x6E, 0x00, 0xC6, 0x00, 0x7D, 0x00,
+ 0xC7, 0x00, 0x78, 0x00, 0xC8, 0x00, 0x78, 0x00,
+ 0xD8, 0x00, 0x77, 0x00, 0xD9, 0x00, 0x77, 0x00,
+ 0xDA, 0x00, 0x77, 0x00, 0xDB, 0x00, 0x77, 0x00,
+ 0xDC, 0x00, 0x77, 0x00, 0xDD, 0x00, 0x78, 0x00,
+ 0xDE, 0x00, 0x78, 0x00, 0xFF, 0xFF, 0x00, 0x00,
+ 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00,
+ 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00,
+ 0xE3, 0x00, 0x77, 0x00, 0xE4, 0x00, 0x77, 0x00,
+ 0xE0, 0x00, 0x1E, 0x00, 0xDF, 0x00, 0x77, 0x00,
+ 0xE1, 0x00, 0x05, 0x00, 0xE2, 0x00, 0x0A, 0x00,
+ 0x00, 0x00, 0x50, 0x00, 0x01, 0x00, 0x50, 0x00,
+ 0x02, 0x00, 0x50, 0x00, 0x03, 0x00, 0x50, 0x00,
+ 0x04, 0x00, 0x50, 0x00, 0x05, 0x00, 0x50, 0x00,
+ 0x06, 0x00, 0x50, 0x00, 0x07, 0x00, 0x50, 0x00,
+ 0x08, 0x00, 0x50, 0x00, 0x09, 0x00, 0x50, 0x00,
+ 0x0A, 0x00, 0x50, 0x00, 0x0B, 0x00, 0x50, 0x00,
+ 0x0C, 0x00, 0x50, 0x00, 0x0D, 0x00, 0x50, 0x00,
+ 0x0E, 0x00, 0x50, 0x00, 0x0F, 0x00, 0x50, 0x00,
+ 0x10, 0x00, 0x50, 0x00, 0x11, 0x00, 0x5A, 0x00,
+ 0x12, 0x00, 0x5A, 0x00, 0x13, 0x00, 0x5A, 0x00,
+ 0x14, 0x00, 0x5A, 0x00, 0x15, 0x00, 0x5A, 0x00,
+ 0x16, 0x00, 0x5A, 0x00, 0x17, 0x00, 0x5A, 0x00,
+ 0x18, 0x00, 0x5A, 0x00, 0x19, 0x00, 0x5A, 0x00,
+ 0x1A, 0x00, 0x5A, 0x00, 0x1B, 0x00, 0x5A, 0x00,
+ 0x1C, 0x00, 0x5A, 0x00, 0x1D, 0x00, 0x5A, 0x00,
+ 0x1E, 0x00, 0x5A, 0x00, 0x1F, 0x00, 0x5A, 0x00,
+ 0x20, 0x00, 0x5A, 0x00, 0x21, 0x00, 0x73, 0x00,
+ 0x22, 0x00, 0x73, 0x00, 0x23, 0x00, 0x73, 0x00,
+ 0x24, 0x00, 0x73, 0x00, 0x25, 0x00, 0x73, 0x00,
+ 0x26, 0x00, 0x73, 0x00, 0x27, 0x00, 0x73, 0x00,
+ 0x28, 0x00, 0x73, 0x00, 0x29, 0x00, 0x73, 0x00,
+ 0x2A, 0x00, 0x73, 0x00, 0x2B, 0x00, 0x50, 0x00,
+ 0x2C, 0x00, 0x5A, 0x00, 0x2D, 0x00, 0x5A, 0x00,
+ 0x2E, 0x00, 0x5A, 0x00, 0x2F, 0x00, 0x5A, 0x00,
+ 0x30, 0x00, 0x5A, 0x00, 0x31, 0x00, 0x5A, 0x00
+};
+
+static const ByteProvider kLoLIngameSfxIndexDOSCDProvider = { ARRAYSIZE(kLoLIngameSfxIndexDOSCD), kLoLIngameSfxIndexDOSCD };
+
+static const byte kLoLMusicTrackMapDOSCD[240] = {
+ 0x01, 0x61, 0x02, 0x01, 0x61, 0x03, 0x01, 0x61,
+ 0x04, 0x01, 0x61, 0x05, 0x03, 0x61, 0x03, 0x01,
+ 0x61, 0x07, 0x01, 0x61, 0x08, 0x01, 0x62, 0x02,
+ 0x01, 0x64, 0x03, 0x01, 0x62, 0x04, 0x01, 0x62,
+ 0x05, 0x01, 0x62, 0x06, 0x01, 0x62, 0x07, 0x01,
+ 0x62, 0x08, 0x01, 0x62, 0x09, 0x01, 0x63, 0x02,
+ 0x01, 0x63, 0x03, 0x01, 0x63, 0x04, 0x01, 0x63,
+ 0x05, 0x01, 0x63, 0x06, 0x01, 0x63, 0x07, 0x01,
+ 0x64, 0x02, 0x02, 0x61, 0x02, 0x02, 0x61, 0x03,
+ 0x02, 0x61, 0x04, 0x02, 0x61, 0x05, 0x02, 0x61,
+ 0x06, 0x02, 0x61, 0x07, 0x02, 0x61, 0x08, 0x02,
+ 0x61, 0x09, 0x03, 0x61, 0x02, 0x03, 0x61, 0x03,
+ 0x03, 0x61, 0x04, 0x03, 0x61, 0x05, 0x03, 0x61,
+ 0x06, 0x03, 0x61, 0x07, 0x04, 0x61, 0x02, 0x04,
+ 0x61, 0x03, 0x04, 0x61, 0x04, 0x05, 0x61, 0x02,
+ 0x05, 0x61, 0x03, 0x05, 0x61, 0x04, 0x05, 0x61,
+ 0x05, 0x05, 0x61, 0x06, 0x06, 0x61, 0x03, 0x06,
+ 0x61, 0x05, 0x06, 0x61, 0x06, 0x06, 0x62, 0x02,
+ 0x06, 0x61, 0x02, 0x06, 0x61, 0x04, 0x08, 0x61,
+ 0x02, 0x08, 0x61, 0x03, 0x08, 0x61, 0x04, 0x08,
+ 0x61, 0x05, 0x08, 0x61, 0x06, 0x08, 0x61, 0x07,
+ 0x08, 0x62, 0x02, 0x08, 0x62, 0x03, 0x01, 0x61,
+ 0x09, 0x03, 0x62, 0x02, 0x03, 0x62, 0x03, 0x03,
+ 0x62, 0x04, 0x03, 0x62, 0x05, 0x03, 0x62, 0x06,
+ 0x03, 0x62, 0x07, 0x03, 0x62, 0x08, 0x04, 0x61,
+ 0x05, 0x04, 0x61, 0x06, 0x04, 0x61, 0x07, 0x04,
+ 0x61, 0x08, 0x05, 0x62, 0x02, 0x05, 0x62, 0x03,
+ 0x05, 0x62, 0x04, 0x07, 0x61, 0x02, 0x07, 0x61,
+ 0x03, 0x01, 0x64, 0x0A, 0x03, 0x62, 0x09, 0x01,
+ 0x64, 0x04, 0x05, 0x62, 0x05, 0x05, 0x62, 0x06
+};
+
+static const ByteProvider kLoLMusicTrackMapDOSCDProvider = { ARRAYSIZE(kLoLMusicTrackMapDOSCD), kLoLMusicTrackMapDOSCD };
+
+static const byte kLoLIngameGMSfxIndexDOSCD[250] = {
+ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+ 0xFF, 0xFF, 0xFF, 0x1A, 0x0B, 0xFF, 0xFF, 0xFF,
+ 0xFF, 0x25, 0x0B, 0x07, 0x25, 0x25, 0x25, 0x25,
+ 0x25, 0x25, 0x25, 0x1A, 0x11, 0x0E, 0x0E, 0x05,
+ 0x05, 0x11, 0x05, 0x05, 0x11, 0x05, 0x05, 0x11,
+ 0x2A, 0x2B, 0x06, 0xFF, 0x05, 0x05, 0x2B, 0x00,
+ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x25,
+ 0x25, 0x25, 0x25, 0xFF, 0xFF, 0xFF, 0x0C, 0x0C,
+ 0x0C, 0x0C, 0x0C, 0x0C, 0x08, 0x29, 0x29, 0x27,
+ 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x01, 0x0E,
+ 0x09, 0x09, 0x0A, 0x12, 0xE7, 0x29, 0xFF, 0xFF,
+ 0xFF, 0xFF, 0x18, 0x27, 0x13, 0x10, 0x1A, 0x1A,
+ 0xFF, 0xFF, 0x12, 0x26, 0xFF, 0x02, 0x05, 0x05,
+ 0x0F, 0xFF, 0xFF, 0xFF, 0x02, 0x05, 0x21, 0x1A,
+ 0xFF, 0xFF, 0xFF, 0xFF, 0x28, 0x0A, 0x19, 0xFF,
+ 0x0B, 0x06, 0x02, 0x02, 0x03, 0x02, 0xFF, 0xFF,
+ 0x0A, 0x0A, 0x0F, 0xFF, 0xFF, 0x0C, 0x1B, 0x22,
+ 0xFF, 0x1A, 0xFF, 0xFF, 0xFF, 0xFF, 0x10, 0x02,
+ 0x03, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A,
+ 0x29, 0x0A, 0x0A, 0x27, 0x0A, 0x28, 0x0A, 0x0A,
+ 0x06, 0xFF, 0x29, 0x29, 0x29, 0x28, 0x12, 0x12,
+ 0x12, 0x29, 0x29, 0x29, 0x25, 0x29, 0x27, 0x27,
+ 0x0C, 0x1A, 0xFF, 0xFF, 0xFF, 0xFF, 0x19, 0x19,
+ 0x19, 0x19, 0x19, 0x22, 0x1B, 0xFF, 0xFF, 0xFF,
+ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+ 0x16, 0xFF, 0x16, 0x16, 0xFF, 0xFF, 0xFF, 0xFF,
+ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+ 0xFF, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C,
+ 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C,
+ 0x0C, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22,
+ 0x22, 0x22, 0x22, 0x16, 0x0C, 0xFF, 0xFF, 0xFF,
+ 0xFF, 0xFF
+};
+
+static const ByteProvider kLoLIngameGMSfxIndexDOSCDProvider = { ARRAYSIZE(kLoLIngameGMSfxIndexDOSCD), kLoLIngameGMSfxIndexDOSCD };
+
+static const byte kLoLIngameMT32SfxIndexDOSCD[250] = {
+ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+ 0xFF, 0xFF, 0xFF, 0x30, 0x2E, 0xFF, 0xFF, 0xFF,
+ 0xFF, 0x2C, 0x31, 0x02, 0x2C, 0x2C, 0x2C, 0x2C,
+ 0x2C, 0x2C, 0x2C, 0x1A, 0x0C, 0x03, 0x04, 0x0B,
+ 0x0A, 0x0C, 0x0B, 0x0A, 0x0C, 0x0B, 0x0A, 0x0C,
+ 0x24, 0x25, 0x0D, 0x02, 0x0B, 0x0A, 0x25, 0xFF,
+ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x2C,
+ 0x2C, 0x2C, 0x2C, 0xFF, 0xFF, 0xFF, 0x2E, 0x2E,
+ 0x2E, 0x2E, 0x31, 0x31, 0x1B, 0x10, 0x23, 0x21,
+ 0x34, 0x34, 0x34, 0x34, 0x34, 0x34, 0x03, 0x04,
+ 0x2B, 0x2A, 0x32, 0x21, 0x18, 0x23, 0x1B, 0x1B,
+ 0x1B, 0xFF, 0x17, 0x33, 0x32, 0x08, 0x1A, 0x19,
+ 0x02, 0x02, 0x0E, 0x32, 0x09, 0x17, 0x0B, 0x0B,
+ 0x07, 0xFF, 0xFF, 0xFF, 0xFF, 0x0B, 0x01, 0x1A,
+ 0xFF, 0xFF, 0xFF, 0xFF, 0x33, 0x08, 0x34, 0xFF,
+ 0x31, 0x0D, 0x05, 0x06, 0x05, 0x06, 0xFF, 0xFF,
+ 0x0F, 0x34, 0x07, 0xFF, 0xFF, 0x31, 0x1A, 0x26,
+ 0xFF, 0x30, 0xFF, 0xFF, 0xFF, 0xFF, 0x07, 0x05,
+ 0x06, 0x33, 0x34, 0x34, 0x34, 0x34, 0x34, 0x33,
+ 0x32, 0x34, 0x34, 0x32, 0x34, 0x33, 0x34, 0xFF,
+ 0x27, 0xFF, 0x23, 0x23, 0x23, 0x21, 0x0E, 0x0E,
+ 0x0E, 0x23, 0x23, 0x23, 0x2C, 0x32, 0x33, 0x33,
+ 0x2F, 0x19, 0xFF, 0xFF, 0xFF, 0x18, 0x17, 0x18,
+ 0x18, 0x17, 0x18, 0x26, 0x06, 0xFF, 0xFF, 0xFF,
+ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+ 0x15, 0xFF, 0x15, 0x15, 0xFF, 0xFF, 0xFF, 0xFF,
+ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+ 0xFF, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31,
+ 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31,
+ 0x31, 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, 0x26,
+ 0x26, 0x26, 0x26, 0x15, 0x31, 0xFF, 0xFF, 0xFF,
+ 0xFF, 0xFF
+};
+
+static const ByteProvider kLoLIngameMT32SfxIndexDOSCDProvider = { ARRAYSIZE(kLoLIngameMT32SfxIndexDOSCD), kLoLIngameMT32SfxIndexDOSCD };
+
+static const byte kLoLIngamePcSpkSfxIndexDOSCD[250] = {
+ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+ 0xFF, 0xFF, 0xFF, 0x04, 0x0C, 0xFF, 0xFF, 0xFF,
+ 0xFF, 0x17, 0x0C, 0x10, 0x17, 0x17, 0x17, 0x17,
+ 0x17, 0x17, 0x17, 0x04, 0x14, 0x02, 0x02, 0x05,
+ 0x05, 0x14, 0x05, 0x05, 0x05, 0x14, 0x05, 0x05,
+ 0x14, 0x00, 0x00, 0x10, 0x05, 0x05, 0x01, 0xFF,
+ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x17,
+ 0x17, 0x17, 0x17, 0xFF, 0xFF, 0xFF, 0x0C, 0x0C,
+ 0x0C, 0x0C, 0x0C, 0x0C, 0x12, 0x0E, 0x0F, 0x11,
+ 0x0F, 0x11, 0x12, 0x11, 0x12, 0x12, 0x01, 0x01,
+ 0x02, 0x0A, 0x15, 0x12, 0x0A, 0x0F, 0x15, 0x15,
+ 0x15, 0xFF, 0x0A, 0xFF, 0x16, 0x05, 0x0A, 0x0A,
+ 0x10, 0x10, 0x07, 0x15, 0xFF, 0x0A, 0xFF, 0xFF,
+ 0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0x05, 0x10, 0x0A,
+ 0x13, 0x13, 0xFF, 0xFF, 0xFF, 0x01, 0x0A, 0xFF,
+ 0x0C, 0x00, 0x02, 0x02, 0x02, 0x02, 0xFF, 0xFF,
+ 0xFF, 0x15, 0x05, 0xFF, 0xFF, 0x0C, 0x16, 0x0B,
+ 0xFF, 0x0A, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+ 0xFF, 0x12, 0x11, 0x12, 0x11, 0x12, 0x11, 0x12,
+ 0x11, 0x12, 0x11, 0x12, 0x11, 0x12, 0x03, 0xFF,
+ 0x02, 0xFF, 0x0F, 0x0F, 0x0F, 0x0F, 0x08, 0x08,
+ 0x08, 0x16, 0x16, 0x16, 0x17, 0x16, 0x16, 0x16,
+ 0x0B, 0x0A, 0xFF, 0xFF, 0xFF, 0x0A, 0x0A, 0x0A,
+ 0x0A, 0x0A, 0x0A, 0x06, 0x10, 0xFF, 0xFF, 0xFF,
+ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+ 0x14, 0xFF, 0x14, 0x14, 0xFF, 0xFF, 0xFF, 0xFF,
+ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+ 0xFF, 0x0B, 0x0B, 0x0B, 0x0B, 0x0B, 0x0B, 0x0B,
+ 0x0B, 0x0B, 0x0B, 0x0B, 0x0B, 0x0B, 0x0B, 0x0B,
+ 0x0B, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D,
+ 0x0D, 0x0D, 0x0D, 0x14, 0x0B, 0xFF, 0xFF, 0xFF,
+ 0xFF, 0xFF
+};
+
+static const ByteProvider kLoLIngamePcSpkSfxIndexDOSCDProvider = { ARRAYSIZE(kLoLIngamePcSpkSfxIndexDOSCD), kLoLIngamePcSpkSfxIndexDOSCD };
+
+static const SpellProperty kLoLSpellPropertiesDOSCD[10] = {
+ { 16436, { 5, 10, 15, 25 }, 0, 0, { 0, 0, 0, 0 }, 0, 0, 0x0100 },
+ { 16437, { 5, 10, 25, 60 }, 0, 0, { 0, 0, 0, 0 }, 0, 0, 0x0001 },
+ { 16438, { 8, 15, 30, 80 }, 0, 0, { 0, 0, 0, 0 }, 0, 0, 0x0102 },
+ { 16440, { 20, 35, 65, 100 }, 0, 0, { 0, 0, 0, 0 }, 0, 0, 0x0103 },
+ { 16441, { 30, 60, 90, 120 }, 0, 0, { 0, 0, 0, 0 }, 0, 0, 0x0104 },
+ { 16442, { 30, 60, 90, 150 }, 0, 0, { 0, 0, 0, 0 }, 0, 0, 0x0105 },
+ { 16439, { 25, 30, 50, 100 }, 0, 0, { 0, 0, 0, 0 }, 0, 0, 0x0106 },
+ { 16443, { 3, 6, 12, 24 }, 0, 0, { 0, 0, 0, 0 }, 0, 0, 0x0107 },
+ { 16975, { 15, 15, 15, 15 }, 0, 0, { 0, 0, 0, 0 }, 0, 0, 0x0108 },
+ { 16975, { 15, 15, 15, 15 }, 15, 0, { 0, 0, 0, 0 }, 0, 0, 0x0108 }
+};
+
+static const SpellPropertyProvider kLoLSpellPropertiesDOSCDProvider = { ARRAYSIZE(kLoLSpellPropertiesDOSCD), kLoLSpellPropertiesDOSCD };
+
+static const byte kLoLGameShapeMapDOSCD[276] = {
+ 0x15, 0x5A, 0x05, 0x37, 0x09, 0x38, 0x00, 0x36,
+ 0x00, 0x36, 0x00, 0x36, 0x00, 0x3C, 0x26, 0x3D,
+ 0x05, 0x37, 0x07, 0x39, 0x18, 0x40, 0x0D, 0x3E,
+ 0x06, 0x42, 0x06, 0x3F, 0x01, 0x5A, 0x01, 0x5A,
+ 0x0A, 0x5A, 0x0A, 0x5A, 0x0A, 0x5A, 0x04, 0x5A,
+ 0x04, 0x5A, 0x2D, 0x5A, 0x2D, 0x5A, 0x0B, 0x3B,
+ 0x24, 0x5A, 0x03, 0x3A, 0x00, 0x3C, 0x1E, 0x3E,
+ 0x1E, 0x3E, 0x1B, 0x5A, 0x14, 0x5A, 0x29, 0x5A,
+ 0x02, 0x5A, 0x0C, 0x5A, 0x22, 0x5A, 0x21, 0x41,
+ 0x0D, 0x3E, 0x25, 0x5A, 0x1A, 0x41, 0x04, 0x5A,
+ 0x30, 0x5A, 0x31, 0x5A, 0x32, 0x5A, 0x32, 0x5A,
+ 0x00, 0x36, 0x00, 0x36, 0x00, 0x36, 0x00, 0x36,
+ 0x17, 0x5A, 0x17, 0x5A, 0x0E, 0x5A, 0x0E, 0x5A,
+ 0x0E, 0x5A, 0x26, 0x3D, 0x2C, 0x5A, 0x21, 0x41,
+ 0x07, 0x39, 0x27, 0x5A, 0x1B, 0x5A, 0x1B, 0x5A,
+ 0x1B, 0x5A, 0x1B, 0x5A, 0x1B, 0x5A, 0x1B, 0x5A,
+ 0x1B, 0x5A, 0x1B, 0x5A, 0x22, 0x5A, 0x22, 0x5A,
+ 0x16, 0x5A, 0x2D, 0x5A, 0x3B, 0x5A, 0x3B, 0x5A,
+ 0x3A, 0x5A, 0x17, 0x5A, 0x1B, 0x5A, 0x1B, 0x5A,
+ 0x17, 0x5A, 0x0A, 0x5A, 0x0A, 0x5A, 0x0A, 0x5A,
+ 0x1F, 0x5A, 0x17, 0x5A, 0x27, 0x5A, 0x1B, 0x5A,
+ 0x1E, 0x3E, 0x2A, 0x5A, 0x2F, 0x5A, 0x2F, 0x5A,
+ 0x2F, 0x5A, 0x2F, 0x5A, 0x2F, 0x5A, 0x2F, 0x5A,
+ 0x2C, 0x5A, 0x2C, 0x5A, 0x2C, 0x5A, 0x2C, 0x5A,
+ 0x34, 0x5A, 0x0F, 0x5A, 0x35, 0x43, 0x1B, 0x5A,
+ 0x1B, 0x5A, 0x1B, 0x5A, 0x1B, 0x5A, 0x2B, 0x5A,
+ 0x1D, 0x5A, 0x1D, 0x5A, 0x28, 0x5A, 0x28, 0x5A,
+ 0x28, 0x5A, 0x28, 0x5A, 0x01, 0x5A, 0x14, 0x5A,
+ 0x14, 0x5A, 0x14, 0x5A, 0x14, 0x5A, 0x1B, 0x5A,
+ 0x27, 0x5A, 0x1B, 0x5A, 0x1B, 0x5A, 0x1B, 0x5A,
+ 0x1B, 0x5A, 0x36, 0x5A, 0x37, 0x5A, 0x38, 0x5A,
+ 0x39, 0x5A, 0x1B, 0x5A, 0x1B, 0x5A, 0x1B, 0x5A,
+ 0x1B, 0x5A, 0x27, 0x5A, 0x2E, 0x5A, 0x2E, 0x5A,
+ 0x2E, 0x5A, 0x2E, 0x5A, 0x17, 0x5A, 0x01, 0x5A,
+ 0x1C, 0x5A, 0x1C, 0x5A
+};
+
+static const ByteProvider kLoLGameShapeMapDOSCDProvider = { ARRAYSIZE(kLoLGameShapeMapDOSCD), kLoLGameShapeMapDOSCD };
+
+static const byte kLoLSceneItemOffsDOSCD[8] = {
+ 0x00, 0xFE, 0x01, 0xFF, 0x02, 0x00, 0x01, 0xFF
+};
+
+static const ByteProvider kLoLSceneItemOffsDOSCDProvider = { ARRAYSIZE(kLoLSceneItemOffsDOSCD), kLoLSceneItemOffsDOSCD };
+
+static const byte kLoLCharInvIndexDOSCD[5] = {
+ 0x00, 0x00, 0x03, 0x01, 0x02
+};
+
+static const ByteProvider kLoLCharInvIndexDOSCDProvider = { ARRAYSIZE(kLoLCharInvIndexDOSCD), kLoLCharInvIndexDOSCD };
+
+static const byte kLoLCharInvDefsDOSCD[88] = {
+ 0x05, 0x34, 0x50, 0x34, 0xFF, 0xFF, 0xFF, 0xFF,
+ 0x05, 0x04, 0x05, 0x1C, 0x50, 0x04, 0x50, 0x1C,
+ 0x05, 0x5D, 0x0F, 0x4E, 0x50, 0x4E, 0x05, 0x19,
+ 0x50, 0x19, 0x05, 0x49, 0x50, 0x49, 0x05, 0x01,
+ 0x05, 0x31, 0x50, 0x01, 0x50, 0x31, 0x05, 0x61,
+ 0xFF, 0xFF, 0xFF, 0xFF, 0x05, 0x34, 0x50, 0x34,
+ 0xFF, 0xFF, 0xFF, 0xFF, 0x05, 0x04, 0x05, 0x1C,
+ 0x50, 0x04, 0x50, 0x1C, 0x05, 0x5D, 0x0F, 0x4E,
+ 0x50, 0x4E, 0x05, 0x34, 0x50, 0x34, 0xFF, 0xFF,
+ 0xFF, 0xFF, 0x05, 0x04, 0x05, 0x1C, 0x50, 0x04,
+ 0x50, 0x1C, 0xFF, 0xFF, 0x0F, 0x4E, 0x50, 0x4E
+};
+
+static const ByteProvider kLoLCharInvDefsDOSCDProvider = { ARRAYSIZE(kLoLCharInvDefsDOSCD), kLoLCharInvDefsDOSCD };
+
+static const uint16 kLoLCharDefsManDOSCD[9] = {
+ 0x0100, 0x0100, 0x0100, 0x0032, 0x0100, 0x0100, 0x0100, 0x0100,
+ 0x0004
+};
+
+static const Uint16Provider kLoLCharDefsManDOSCDProvider = { ARRAYSIZE(kLoLCharDefsManDOSCD), kLoLCharDefsManDOSCD };
+
+static const uint16 kLoLCharDefsWomanDOSCD[9] = {
+ 0x0100, 0x0100, 0x0100, 0x0032, 0x0100, 0x0100, 0x0100, 0x0100,
+ 0x0004
+};
+
+static const Uint16Provider kLoLCharDefsWomanDOSCDProvider = { ARRAYSIZE(kLoLCharDefsWomanDOSCD), kLoLCharDefsWomanDOSCD };
+
+static const uint16 kLoLCharDefsKieranDOSCD[9] = {
+ 0x0180, 0x0080, 0x00C0, 0x0032, 0x0200, 0x00A6, 0x0100, 0x0140,
+ 0x0006
+};
+
+static const Uint16Provider kLoLCharDefsKieranDOSCDProvider = { ARRAYSIZE(kLoLCharDefsKieranDOSCD), kLoLCharDefsKieranDOSCD };
+
+static const uint16 kLoLCharDefsAkshelDOSCD[9] = {
+ 0x00C0, 0x00C0, 0x0140, 0x0032, 0x0100, 0x0180, 0x0180, 0x0100,
+ 0x0004
+};
+
+static const Uint16Provider kLoLCharDefsAkshelDOSCDProvider = { ARRAYSIZE(kLoLCharDefsAkshelDOSCD), kLoLCharDefsAkshelDOSCD };
+
+static const uint32 kLoLExpRequirementsDOSCD[11] = {
+ 0x00000000, 0x000001F4, 0x000005DC, 0x00001388, 0x000061A8, 0x0000C350, 0x00013880, 0x0001D4C0,
+ 0x0002BF20, 0x00041EB0, 0x7FFFFFFF
+};
+
+static const Uint32Provider kLoLExpRequirementsDOSCDProvider = { ARRAYSIZE(kLoLExpRequirementsDOSCD), kLoLExpRequirementsDOSCD };
+
+static const uint16 kLoLMonsterModifiers1DOSCD[3] = {
+ 0x0066, 0x0100, 0x0180
+};
+
+static const Uint16Provider kLoLMonsterModifiers1DOSCDProvider = { ARRAYSIZE(kLoLMonsterModifiers1DOSCD), kLoLMonsterModifiers1DOSCD };
+
+static const uint16 kLoLMonsterModifiers2DOSCD[3] = {
+ 0x0100, 0x0100, 0x00C0
+};
+
+static const Uint16Provider kLoLMonsterModifiers2DOSCDProvider = { ARRAYSIZE(kLoLMonsterModifiers2DOSCD), kLoLMonsterModifiers2DOSCD };
+
+static const uint16 kLoLMonsterModifiers3DOSCD[3] = {
+ 0x0140, 0x0100, 0x0080
+};
+
+static const Uint16Provider kLoLMonsterModifiers3DOSCDProvider = { ARRAYSIZE(kLoLMonsterModifiers3DOSCD), kLoLMonsterModifiers3DOSCD };
+
+static const uint16 kLoLMonsterModifiers4DOSCD[3] = {
+ 0x0080, 0x0100, 0x0100
+};
+
+static const Uint16Provider kLoLMonsterModifiers4DOSCDProvider = { ARRAYSIZE(kLoLMonsterModifiers4DOSCD), kLoLMonsterModifiers4DOSCD };
+
+static const byte kLoLMonsterShiftOffsetsDOSCD[32] = {
+ 0x01, 0x01, 0x01, 0x00, 0x01, 0xFF, 0x00, 0xFF,
+ 0x00, 0x00, 0x00, 0x01, 0xFF, 0x01, 0xFF, 0x00,
+ 0xFF, 0xFF, 0x00, 0xFF, 0x00, 0x00, 0x00, 0x01,
+ 0x01, 0x01, 0x01, 0x00, 0x01, 0xFF, 0x00, 0x00
+};
+
+static const ByteProvider kLoLMonsterShiftOffsetsDOSCDProvider = { ARRAYSIZE(kLoLMonsterShiftOffsetsDOSCD), kLoLMonsterShiftOffsetsDOSCD };
+
+static const byte kLoLMonsterDirFlagsDOSCD[16] = {
+ 0x08, 0x14, 0x00, 0x04, 0x04, 0x08, 0x14, 0x00,
+ 0x00, 0x04, 0x08, 0x14, 0x14, 0x00, 0x04, 0x08
+};
+
+static const ByteProvider kLoLMonsterDirFlagsDOSCDProvider = { ARRAYSIZE(kLoLMonsterDirFlagsDOSCD), kLoLMonsterDirFlagsDOSCD };
+
+static const byte kLoLMonsterScaleYDOSCD[30] = {
+ 0x7C, 0x78, 0x74, 0x70, 0x6C, 0x68, 0x65, 0x62,
+ 0x5F, 0x5C, 0x59, 0x56, 0x53, 0x50, 0x4D, 0x4A,
+ 0x48, 0x46, 0x44, 0x43, 0x41, 0x40, 0x3E, 0x3D,
+ 0x3C, 0x3B, 0x3A, 0x39, 0x38, 0x38
+};
+
+static const ByteProvider kLoLMonsterScaleYDOSCDProvider = { ARRAYSIZE(kLoLMonsterScaleYDOSCD), kLoLMonsterScaleYDOSCD };
+
+static const byte kLoLMonsterScaleXDOSCD[32] = {
+ 0x98, 0x98, 0x90, 0x88, 0x80, 0x76, 0x6E, 0x68,
+ 0x62, 0x5C, 0x58, 0x54, 0x50, 0x4A, 0x44, 0x40,
+ 0x3C, 0x38, 0x36, 0x32, 0x30, 0x2C, 0x2A, 0x28,
+ 0x26, 0x24, 0x22, 0x20, 0x20, 0x1E, 0x18, 0x10
+};
+
+static const ByteProvider kLoLMonsterScaleXDOSCDProvider = { ARRAYSIZE(kLoLMonsterScaleXDOSCD), kLoLMonsterScaleXDOSCD };
+
+static const uint16 kLoLMonsterScaleWHDOSCD[65] = {
+ 0x0041, 0x0045, 0x0049, 0x004D, 0x0051, 0x0055, 0x0059, 0x005D,
+ 0x0062, 0x0066, 0x006A, 0x006E, 0x0072, 0x0076, 0x007A, 0x007E,
+ 0x0082, 0x0086, 0x008A, 0x008E, 0x0092, 0x0096, 0x009A, 0x009E,
+ 0x00A3, 0x00A7, 0x00AB, 0x00AF, 0x00B3, 0x00B7, 0x00BB, 0x00BF,
+ 0x00C3, 0x00C7, 0x00CB, 0x00CF, 0x00D3, 0x00D7, 0x00DB, 0x00DF,
+ 0x00E4, 0x00E8, 0x00EC, 0x00F0, 0x00F4, 0x00F8, 0x00FC, 0x0100,
+ 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100,
+ 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100,
+ 0x0100
+};
+
+static const Uint16Provider kLoLMonsterScaleWHDOSCDProvider = { ARRAYSIZE(kLoLMonsterScaleWHDOSCD), kLoLMonsterScaleWHDOSCD };
+
+static const FlyingObjectShape kLoLFlyingObjectShpDOSCD[13] = {
+ { 0, 0, 1, 0x00, 0x40, },
+ { 2, 2, 3, 0x00, 0x00, },
+ { 4, 4, 4, 0x00, 0x00, },
+ { 5, 5, 5, 0x20, 0x00, },
+ { 6, 6, 6, 0x20, 0x00, },
+ { 7, 7, 7, 0x20, 0x00, },
+ { 9, 8, 15, 0x00, 0x00, },
+ { 11, 10, 12, 0x00, 0x00, },
+ { 12, 12, 12, 0x20, 0x00, },
+ { 14, 13, 15, 0x00, 0x00, },
+ { 16, 16, 16, 0x00, 0x00, },
+ { 17, 17, 17, 0x20, 0x00, },
+ { 18, 18, 18, 0x00, 0x00, }
+};
+
+static const FlyingObjectShapeProvider kLoLFlyingObjectShpDOSCDProvider = { ARRAYSIZE(kLoLFlyingObjectShpDOSCD), kLoLFlyingObjectShpDOSCD };
+
+static const uint16 kLoLInventoryDescDOSCD[11] = {
+ 0x417A, 0x417B, 0x417A, 0x417B, 0x417C, 0x417D, 0x417E, 0x417F,
+ 0x4180, 0x4181, 0x4181
+};
+
+static const Uint16Provider kLoLInventoryDescDOSCDProvider = { ARRAYSIZE(kLoLInventoryDescDOSCD), kLoLInventoryDescDOSCD };
+
+static const char *const kLoLLevelShpListDOSCD[12] = {
+ "KEEP.SHP",
+ "FOREST1.SHP",
+ "MANOR.SHP",
+ "CAVE1.SHP",
+ "SWAMP.SHP",
+ "URBISH.SHP",
+ "MINE1.SHP",
+ "TOWER1.SHP",
+ "YVEL1.SHP",
+ "CATWALK.SHP",
+ "RUIN.SHP",
+ "CIMMERIA.SHP"
+};
+
+static const StringListProvider kLoLLevelShpListDOSCDProvider = { ARRAYSIZE(kLoLLevelShpListDOSCD), kLoLLevelShpListDOSCD };
+
+static const char *const kLoLLevelDatListDOSCD[12] = {
+ "KEEP.DAT",
+ "FOREST1.DAT",
+ "MANOR.DAT",
+ "CAVE1.DAT",
+ "SWAMP.DAT",
+ "URBISH.DAT",
+ "MINE1.DAT",
+ "TOWER1.DAT",
+ "YVEL1.DAT",
+ "CATWALK.DAT",
+ "RUIN.DAT",
+ "CIMMERIA.DAT"
+};
+
+static const StringListProvider kLoLLevelDatListDOSCDProvider = { ARRAYSIZE(kLoLLevelDatListDOSCD), kLoLLevelDatListDOSCD };
+
+static const CompassDef kLoLCompassDefsDOSCD[32] = {
+ { 0, 3, -3, 0x00 },
+ { 1, 3, -3, 0x00 },
+ { 2, 3, -3, 0x00 },
+ { 3, 5, -3, 0x00 },
+ { 4, 5, -3, 0x00 },
+ { 5, 6, -3, 0x00 },
+ { 6, 6, -3, 0x00 },
+ { 7, 6, -3, 0x00 },
+ { 8, 6, -3, 0x00 },
+ { 7, 6, 4, 0x02 },
+ { 6, 6, 4, 0x02 },
+ { 5, 6, 4, 0x02 },
+ { 4, 5, 4, 0x02 },
+ { 3, 5, 4, 0x02 },
+ { 2, 3, 4, 0x02 },
+ { 1, 3, 4, 0x02 },
+ { 0, 3, 4, 0x02 },
+ { 1, 2, 4, 0x03 },
+ { 2, 2, 4, 0x03 },
+ { 3, 0, 4, 0x03 },
+ { 4, 0, 4, 0x03 },
+ { 5, -1, 4, 0x03 },
+ { 6, -1, 4, 0x03 },
+ { 7, -1, 4, 0x03 },
+ { 8, -1, -3, 0x01 },
+ { 7, -1, -3, 0x01 },
+ { 6, -1, -3, 0x01 },
+ { 5, -1, -3, 0x01 },
+ { 4, 0, -3, 0x01 },
+ { 3, 0, -3, 0x01 },
+ { 2, 2, -3, 0x01 },
+ { 1, 2, -3, 0x01 }
+};
+
+static const CompassDefProvider kLoLCompassDefsDOSCDProvider = { ARRAYSIZE(kLoLCompassDefsDOSCD), kLoLCompassDefsDOSCD };
+
+static const uint16 kLoLItemPricesDOSCD[46] = {
+ 0x0001, 0x0005, 0x0008, 0x000A, 0x000F, 0x0014, 0x0019, 0x001E,
+ 0x0023, 0x0028, 0x002D, 0x0032, 0x0037, 0x003C, 0x0041, 0x0046,
+ 0x004B, 0x0050, 0x005A, 0x0064, 0x0069, 0x0078, 0x007D, 0x0082,
+ 0x008C, 0x0096, 0x00A0, 0x00AF, 0x00C8, 0x00E1, 0x00FA, 0x0113,
+ 0x012C, 0x0145, 0x015E, 0x0177, 0x0190, 0x01A9, 0x01C2, 0x01DB,
+ 0x01F4, 0x0230, 0x03E8, 0x05DC, 0x0BB8, 0x0000
+};
+
+static const Uint16Provider kLoLItemPricesDOSCDProvider = { ARRAYSIZE(kLoLItemPricesDOSCD), kLoLItemPricesDOSCD };
+
+static const byte kLoLStashSetupDOSCD[12] = {
+ 0x04, 0x04, 0x04, 0x04, 0x02, 0x02, 0x02, 0x03,
+ 0x03, 0x00, 0x01, 0x01
+};
+
+static const ByteProvider kLoLStashSetupDOSCDProvider = { ARRAYSIZE(kLoLStashSetupDOSCD), kLoLStashSetupDOSCD };
+
+static const byte kLoLDscWallsDOSCD[36] = {
+ 0xFF, 0xFF, 0x02, 0x01, 0x02, 0x01, 0x02, 0xFF,
+ 0x02, 0x03, 0x02, 0x03, 0xFF, 0xFF, 0x02, 0x01,
+ 0x02, 0x01, 0x02, 0xFF, 0x02, 0x03, 0x02, 0x03,
+ 0x02, 0x01, 0x02, 0xFF, 0x02, 0x03, 0xFF, 0x01,
+ 0x02, 0xFF, 0xFF, 0x03
+};
+
+static const ByteProvider kLoLDscWallsDOSCDProvider = { ARRAYSIZE(kLoLDscWallsDOSCD), kLoLDscWallsDOSCD };
+
+static const byte kLoLDscShapeIndexDOSCD[36] = {
+ 0x03, 0x09, 0x03, 0x08, 0x03, 0x07, 0x03, 0x03,
+ 0x03, 0xF9, 0x03, 0xF8, 0x03, 0xF7, 0x02, 0x09,
+ 0x02, 0x06, 0x02, 0x02, 0x02, 0xFA, 0x02, 0xF7,
+ 0x01, 0x05, 0x01, 0x01, 0x01, 0xFB, 0x00, 0x04,
+ 0x00, 0x00, 0x00, 0xFC
+};
+
+static const ByteProvider kLoLDscShapeIndexDOSCDProvider = { ARRAYSIZE(kLoLDscShapeIndexDOSCD), kLoLDscShapeIndexDOSCD };
+
+static const byte kLoLDscOvlMapDOSCD[10] = {
+ 0x00, 0x01, 0x01, 0x01, 0x04, 0x05, 0x05, 0x05,
+ 0x05, 0x04
+};
+
+static const ByteProvider kLoLDscOvlMapDOSCDProvider = { ARRAYSIZE(kLoLDscOvlMapDOSCD), kLoLDscOvlMapDOSCD };
+
+static const uint16 kLoLDscScaleWidthDataDOSCD[36] = {
+ 0x0060, 0x0000, 0x0060, 0x00CE, 0x0060, 0x0055, 0x0060, 0x0000,
+ 0x0060, 0x0055, 0x0060, 0x00CE, 0x0060, 0x0000, 0x00A0, 0x00AE,
+ 0x00A0, 0x00AA, 0x00A0, 0x0000, 0x00A0, 0x00AA, 0x00A0, 0x00AE,
+ 0x0100, 0x0100, 0x0100, 0x0000, 0x0100, 0x0100, 0x0000, 0x0100,
+ 0x0100, 0x0000, 0x0000, 0x0100
+};
+
+static const Uint16Provider kLoLDscScaleWidthDataDOSCDProvider = { ARRAYSIZE(kLoLDscScaleWidthDataDOSCD), kLoLDscScaleWidthDataDOSCD };
+
+static const uint16 kLoLDscScaleHeightDataDOSCD[36] = {
+ 0x006A, 0x0000, 0x006A, 0x006A, 0x006A, 0x006A, 0x006A, 0x0000,
+ 0x006A, 0x006A, 0x006A, 0x006A, 0x006A, 0x0000, 0x00AA, 0x0056,
+ 0x00AA, 0x00AA, 0x00AA, 0x0000, 0x00AA, 0x00AA, 0x00AA, 0x0056,
+ 0x0100, 0x0100, 0x0100, 0x0000, 0x0100, 0x0100, 0x0000, 0x0100,
+ 0x0100, 0x0000, 0x0000, 0x0100
+};
+
+static const Uint16Provider kLoLDscScaleHeightDataDOSCDProvider = { ARRAYSIZE(kLoLDscScaleHeightDataDOSCD), kLoLDscScaleHeightDataDOSCD };
+
+static const uint16 kLoLDscXDOSCD[36] = {
+ 0xFFB0, 0xFFE0, 0xFFE0, 0x0010, 0x0010, 0x0040, 0x0040, 0x0000,
+ 0x0070, 0x0070, 0x00A0, 0x00A0, 0x00D0, 0x00D0, 0xFF86, 0x0000,
+ 0xFFE0, 0x0030, 0x0030, 0x0000, 0x0080, 0x0080, 0x00D0, 0x00B0,
+ 0xFF98, 0x0018, 0x0018, 0x0000, 0x0098, 0x0098, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x00B0, 0x00B0
+};
+
+static const Uint16Provider kLoLDscXDOSCDProvider = { ARRAYSIZE(kLoLDscXDOSCD), kLoLDscXDOSCD };
+
+static const byte kLoLBaseDscYDOSCD[36] = {
+ 0x1B, 0x1B, 0x1B, 0x1B, 0x1B, 0x1B, 0x1B, 0x1B,
+ 0x1B, 0x1B, 0x1B, 0x1B, 0x1B, 0x1B, 0x14, 0x1C,
+ 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x1C,
+ 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00
+};
+
+static const ByteProvider kLoLBaseDscYDOSCDProvider = { ARRAYSIZE(kLoLBaseDscYDOSCD), kLoLBaseDscYDOSCD };
+
+static const byte kLoLDscTileIndexDOSCD[18] = {
+ 0x00, 0x06, 0x01, 0x05, 0x02, 0x04, 0x03, 0x07,
+ 0x0B, 0x08, 0x0A, 0x09, 0x0C, 0x0E, 0x0D, 0x0F,
+ 0x11, 0x10
+};
+
+static const ByteProvider kLoLDscTileIndexDOSCDProvider = { ARRAYSIZE(kLoLDscTileIndexDOSCD), kLoLDscTileIndexDOSCD };
+
+static const byte kLoLDscUnk2DOSCD[23] = {
+ 0x00, 0x00, 0x00, 0x03, 0x03, 0x03, 0x03, 0x03,
+ 0x08, 0x08, 0x08, 0x08, 0x08, 0x0D, 0x0D, 0x0D,
+ 0x0D, 0x0D, 0x12, 0x12, 0x12, 0x12, 0x12
+};
+
+static const ByteProvider kLoLDscUnk2DOSCDProvider = { ARRAYSIZE(kLoLDscUnk2DOSCD), kLoLDscUnk2DOSCD };
+
+static const byte kLoLDscDoorShapeIndexDOSCD[23] = {
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01,
+ 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01
+};
+
+static const ByteProvider kLoLDscDoorShapeIndexDOSCDProvider = { ARRAYSIZE(kLoLDscDoorShapeIndexDOSCD), kLoLDscDoorShapeIndexDOSCD };
+
+static const byte kLoLDscDimData1DOSCD[324] = {
+ 0xD7, 0xD7, 0xD7, 0xD7, 0xD7, 0xD7, 0xD7, 0xD7,
+ 0xD7, 0xD7, 0xD7, 0xD7, 0xD7, 0xD7, 0xD7, 0xD7,
+ 0xD8, 0xD7, 0xD8, 0xD8, 0x02, 0xD8, 0xD8, 0xD8,
+ 0xD8, 0xFE, 0xD7, 0xD8, 0xD8, 0xD8, 0xD7, 0x03,
+ 0xD8, 0xFD, 0xD8, 0xD8, 0xD8, 0xFE, 0xD8, 0x08,
+ 0xD8, 0xD8, 0xD8, 0xFE, 0xF8, 0x06, 0xD8, 0xD8,
+ 0xFA, 0x03, 0xD8, 0xFD, 0xD8, 0xD8, 0xD8, 0xD8,
+ 0xD8, 0xD8, 0xD8, 0xD8, 0xD8, 0xD8, 0xFA, 0xD7,
+ 0x10, 0xD8, 0xFA, 0xD7, 0x10, 0xD8, 0xD8, 0xD8,
+ 0xD8, 0xD8, 0xD8, 0xF2, 0xD8, 0x14, 0xD8, 0xD8,
+ 0xD8, 0xF0, 0x0E, 0x14, 0xD8, 0xED, 0x10, 0xD8,
+ 0xD8, 0x13, 0xD8, 0xD8, 0xD8, 0xD8, 0xEC, 0xD8,
+ 0xD8, 0xD8, 0xD8, 0xD8, 0xD7, 0x14, 0xD8, 0xED,
+ 0xD7, 0xD8, 0xD8, 0x13, 0xD7, 0xD7, 0xD7, 0xD7,
+ 0xD7, 0xD7, 0xD7, 0xD7, 0xD7, 0xD7, 0xD7, 0xD7,
+ 0xD7, 0xD7, 0xD7, 0xD7, 0xD8, 0xD7, 0xD8, 0xD8,
+ 0xD8, 0xD8, 0xD8, 0xD8, 0xD8, 0xD8, 0xD7, 0xD8,
+ 0xD8, 0xD8, 0xD7, 0xD8, 0xD8, 0xD7, 0xD8, 0xD8,
+ 0xD8, 0xD8, 0xD8, 0xD8, 0xD8, 0xD8, 0xD8, 0xD8,
+ 0xD8, 0x06, 0xD8, 0xD8, 0xFA, 0x03, 0xD8, 0xFD,
+ 0xD8, 0xD8, 0xD8, 0xD8, 0xD8, 0xD8, 0xD8, 0xD8,
+ 0xD8, 0xD8, 0xFA, 0xD8, 0x10, 0xD8, 0xFA, 0xD7,
+ 0x10, 0xFD, 0xD8, 0x13, 0xD8, 0xD8, 0xD8, 0xD8,
+ 0xD8, 0xD8, 0xD8, 0xD8, 0xD8, 0xF0, 0xD8, 0xD8,
+ 0xD8, 0xED, 0x10, 0xD8, 0xD8, 0x13, 0xD8, 0xD8,
+ 0xD8, 0xD8, 0xD8, 0xD8, 0xD8, 0xD8, 0xD8, 0xD8,
+ 0xD7, 0xD8, 0xD8, 0xD8, 0xD7, 0xD8, 0xD8, 0xD7,
+ 0xD8, 0xD8, 0xD8, 0xD8, 0xD8, 0xD8, 0xD8, 0xD8,
+ 0xD8, 0xD8, 0xD8, 0xD8, 0xD8, 0x03, 0xD8, 0xFD,
+ 0xD8, 0xD8, 0xD8, 0xD8, 0xD8, 0xD8, 0xD8, 0xD8,
+ 0xD8, 0xD8, 0xD8, 0xD8, 0xD8, 0xD8, 0xFD, 0xD8,
+ 0x13, 0xFD, 0xD8, 0x13, 0xD8, 0xD8, 0xD8, 0xD8,
+ 0xD8, 0xD8, 0xD8, 0xD8, 0xD8, 0xD8, 0xD8, 0xD8,
+ 0xD8, 0xED, 0xD8, 0xD8, 0xD8, 0x13, 0xD8, 0xD8,
+ 0xD8, 0xD8, 0xD8, 0xD8, 0xD8, 0xD8, 0xD8, 0xD8,
+ 0xD8, 0xD8, 0xD8, 0xD8, 0xD8, 0xD8, 0xD8, 0xD8,
+ 0xD8, 0xD8, 0xD8, 0xD8, 0xD8, 0xD8, 0xD8, 0xD8,
+ 0xD8, 0xD8, 0xD8, 0xD8, 0xD8, 0xD8, 0xD8, 0xD8,
+ 0xD8, 0xD8, 0xD8, 0xD8, 0xD8, 0xD8, 0xD8, 0xD8,
+ 0xD8, 0xD8, 0xD8, 0xD8, 0xD8, 0xD8, 0xD8, 0xD8,
+ 0xD8, 0xD8, 0xD8, 0xD8
+};
+
+static const ByteProvider kLoLDscDimData1DOSCDProvider = { ARRAYSIZE(kLoLDscDimData1DOSCD), kLoLDscDimData1DOSCD };
+
+static const byte kLoLDscDimData2DOSCD[648] = {
+ 0x16, 0x00, 0x16, 0x00, 0x16, 0x00, 0x16, 0x00,
+ 0x16, 0x00, 0x16, 0x00, 0x16, 0x00, 0x16, 0x00,
+ 0x16, 0x00, 0x16, 0x00, 0x16, 0x00, 0x16, 0x00,
+ 0x16, 0x00, 0x16, 0x00, 0x16, 0x00, 0x16, 0x00,
+ 0x00, 0x16, 0x16, 0x00, 0x00, 0x16, 0x00, 0x16,
+ 0x00, 0x02, 0x00, 0x16, 0x00, 0x16, 0x00, 0x16,
+ 0x00, 0x16, 0x02, 0x16, 0x00, 0x04, 0x00, 0x16,
+ 0x00, 0x16, 0x00, 0x16, 0x16, 0x00, 0x00, 0x03,
+ 0x00, 0x16, 0x03, 0x16, 0x00, 0x16, 0x00, 0x16,
+ 0x00, 0x16, 0x02, 0x16, 0x00, 0x16, 0x00, 0x08,
+ 0x00, 0x16, 0x00, 0x16, 0x00, 0x16, 0x00, 0x02,
+ 0x16, 0x00, 0x00, 0x06, 0x00, 0x16, 0x00, 0x16,
+ 0x06, 0x16, 0x00, 0x03, 0x00, 0x16, 0x03, 0x00,
+ 0x00, 0x16, 0x00, 0x16, 0x00, 0x16, 0x00, 0x16,
+ 0x00, 0x16, 0x00, 0x16, 0x00, 0x16, 0x00, 0x16,
+ 0x00, 0x16, 0x00, 0x16, 0x06, 0x16, 0x08, 0x0E,
+ 0x00, 0x10, 0x00, 0x16, 0x03, 0x16, 0x06, 0x10,
+ 0x00, 0x13, 0x00, 0x16, 0x00, 0x16, 0x00, 0x16,
+ 0x00, 0x16, 0x00, 0x16, 0x00, 0x16, 0x0E, 0x16,
+ 0x00, 0x16, 0x00, 0x14, 0x00, 0x16, 0x00, 0x16,
+ 0x00, 0x16, 0x10, 0x16, 0x16, 0x00, 0x00, 0x14,
+ 0x00, 0x16, 0x13, 0x16, 0x00, 0x10, 0x00, 0x16,
+ 0x00, 0x16, 0x00, 0x13, 0x00, 0x16, 0x00, 0x16,
+ 0x00, 0x16, 0x00, 0x16, 0x14, 0x16, 0x00, 0x16,
+ 0x00, 0x16, 0x00, 0x16, 0x00, 0x16, 0x00, 0x16,
+ 0x12, 0x16, 0x14, 0x16, 0x00, 0x16, 0x13, 0x16,
+ 0x16, 0x00, 0x00, 0x16, 0x00, 0x16, 0x00, 0x13,
+ 0x16, 0x00, 0x16, 0x00, 0x16, 0x00, 0x16, 0x00,
+ 0x16, 0x00, 0x16, 0x00, 0x16, 0x00, 0x16, 0x00,
+ 0x16, 0x00, 0x16, 0x00, 0x16, 0x00, 0x16, 0x00,
+ 0x16, 0x00, 0x16, 0x00, 0x16, 0x00, 0x16, 0x00,
+ 0x00, 0x16, 0x16, 0x00, 0x16, 0x00, 0x16, 0x00,
+ 0x16, 0x00, 0x16, 0x00, 0x16, 0x00, 0x16, 0x00,
+ 0x16, 0x00, 0x16, 0x00, 0x16, 0x00, 0x16, 0x00,
+ 0x16, 0x00, 0x16, 0x00, 0x16, 0x00, 0x16, 0x00,
+ 0x16, 0x00, 0x16, 0x00, 0x00, 0x16, 0x16, 0x00,
+ 0x00, 0x16, 0x00, 0x16, 0x00, 0x16, 0x00, 0x16,
+ 0x00, 0x16, 0x00, 0x16, 0x00, 0x16, 0x00, 0x16,
+ 0x00, 0x16, 0x00, 0x06, 0x00, 0x16, 0x00, 0x16,
+ 0x06, 0x16, 0x00, 0x03, 0x00, 0x16, 0x03, 0x16,
+ 0x00, 0x16, 0x00, 0x16, 0x00, 0x16, 0x00, 0x16,
+ 0x00, 0x16, 0x00, 0x16, 0x00, 0x16, 0x00, 0x16,
+ 0x00, 0x16, 0x00, 0x16, 0x06, 0x16, 0x00, 0x16,
+ 0x00, 0x10, 0x00, 0x16, 0x03, 0x16, 0x07, 0x0F,
+ 0x00, 0x13, 0x03, 0x16, 0x00, 0x16, 0x00, 0x13,
+ 0x00, 0x16, 0x00, 0x16, 0x00, 0x16, 0x00, 0x16,
+ 0x00, 0x16, 0x00, 0x16, 0x00, 0x16, 0x00, 0x16,
+ 0x00, 0x16, 0x10, 0x16, 0x00, 0x16, 0x00, 0x16,
+ 0x00, 0x16, 0x13, 0x16, 0x00, 0x10, 0x00, 0x16,
+ 0x00, 0x16, 0x00, 0x13, 0x16, 0x00, 0x16, 0x00,
+ 0x16, 0x00, 0x16, 0x00, 0x16, 0x00, 0x16, 0x00,
+ 0x16, 0x00, 0x16, 0x00, 0x16, 0x00, 0x16, 0x00,
+ 0x16, 0x00, 0x16, 0x00, 0x16, 0x00, 0x16, 0x00,
+ 0x16, 0x00, 0x16, 0x00, 0x00, 0x16, 0x16, 0x00,
+ 0x00, 0x16, 0x00, 0x16, 0x00, 0x16, 0x00, 0x16,
+ 0x00, 0x16, 0x00, 0x16, 0x00, 0x16, 0x00, 0x16,
+ 0x00, 0x16, 0x00, 0x16, 0x00, 0x16, 0x00, 0x16,
+ 0x00, 0x16, 0x00, 0x03, 0x00, 0x16, 0x03, 0x16,
+ 0x00, 0x16, 0x00, 0x16, 0x00, 0x16, 0x00, 0x16,
+ 0x00, 0x16, 0x00, 0x16, 0x00, 0x16, 0x00, 0x16,
+ 0x00, 0x16, 0x00, 0x16, 0x00, 0x16, 0x00, 0x16,
+ 0x00, 0x16, 0x00, 0x16, 0x03, 0x16, 0x00, 0x16,
+ 0x00, 0x13, 0x03, 0x16, 0x00, 0x16, 0x00, 0x13,
+ 0x00, 0x16, 0x00, 0x16, 0x00, 0x16, 0x00, 0x16,
+ 0x00, 0x16, 0x00, 0x16, 0x00, 0x16, 0x00, 0x16,
+ 0x00, 0x16, 0x00, 0x16, 0x00, 0x16, 0x00, 0x16,
+ 0x00, 0x16, 0x13, 0x16, 0x00, 0x16, 0x00, 0x16,
+ 0x00, 0x16, 0x00, 0x13, 0x00, 0x16, 0x00, 0x16,
+ 0x00, 0x16, 0x00, 0x16, 0x00, 0x16, 0x00, 0x16,
+ 0x00, 0x16, 0x00, 0x16, 0x00, 0x16, 0x00, 0x16,
+ 0x00, 0x16, 0x00, 0x16, 0x00, 0x16, 0x00, 0x16,
+ 0x00, 0x16, 0x00, 0x16, 0x00, 0x16, 0x00, 0x16,
+ 0x00, 0x16, 0x00, 0x16, 0x00, 0x16, 0x00, 0x16,
+ 0x00, 0x16, 0x00, 0x16, 0x00, 0x16, 0x00, 0x16,
+ 0x00, 0x16, 0x00, 0x16, 0x00, 0x16, 0x00, 0x16,
+ 0x00, 0x16, 0x00, 0x16, 0x00, 0x16, 0x00, 0x16,
+ 0x00, 0x16, 0x00, 0x16, 0x00, 0x16, 0x00, 0x16,
+ 0x00, 0x16, 0x00, 0x16, 0x00, 0x16, 0x00, 0x16,
+ 0x00, 0x16, 0x00, 0x16, 0x00, 0x16, 0x00, 0x16,
+ 0x00, 0x16, 0x00, 0x16, 0x00, 0x16, 0x00, 0x16,
+ 0x00, 0x16, 0x00, 0x16, 0x00, 0x16, 0x00, 0x16
+};
+
+static const ByteProvider kLoLDscDimData2DOSCDProvider = { ARRAYSIZE(kLoLDscDimData2DOSCD), kLoLDscDimData2DOSCD };
+
+static const byte kLoLDscBlockMapDOSCD[12] = {
+ 0x02, 0x03, 0x00, 0x01, 0x01, 0x02, 0x03, 0x00,
+ 0x03, 0x00, 0x01, 0x02
+};
+
+static const ByteProvider kLoLDscBlockMapDOSCDProvider = { ARRAYSIZE(kLoLDscBlockMapDOSCD), kLoLDscBlockMapDOSCD };
+
+static const byte kLoLDscDimMapDOSCD[18] = {
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01,
+ 0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x02, 0x03,
+ 0x03, 0x03
+};
+
+static const ByteProvider kLoLDscDimMapDOSCDProvider = { ARRAYSIZE(kLoLDscDimMapDOSCD), kLoLDscDimMapDOSCD };
+
+static const byte kLoLDscOvlIndexDOSCD[20] = {
+ 0x00, 0x00, 0x01, 0x01, 0x01, 0x02, 0x02, 0x03,
+ 0x03, 0x03, 0x04, 0x04, 0x05, 0x05, 0x05, 0x06,
+ 0x06, 0x07, 0x07, 0x07
+};
+
+static const ByteProvider kLoLDscOvlIndexDOSCDProvider = { ARRAYSIZE(kLoLDscOvlIndexDOSCD), kLoLDscOvlIndexDOSCD };
+
+static const byte kLoLDscBlockIndexDOSCD[72] = {
+ 0x9D, 0x9E, 0x9F, 0xA0, 0xA1, 0xA2, 0xA3, 0xBE,
+ 0xBF, 0xC0, 0xC1, 0xC2, 0xDF, 0xE0, 0xE1, 0xFF,
+ 0x00, 0x01, 0xA3, 0xC3, 0xE3, 0x03, 0x23, 0x43,
+ 0x63, 0xC2, 0xE2, 0x02, 0x22, 0x42, 0xE1, 0x01,
+ 0x21, 0xE0, 0x00, 0x20, 0x63, 0x62, 0x61, 0x60,
+ 0x5F, 0x5E, 0x5D, 0x42, 0x41, 0x40, 0x3F, 0x3E,
+ 0x21, 0x20, 0x1F, 0x01, 0x00, 0xFF, 0x5D, 0x3D,
+ 0x1D, 0xFD, 0xDD, 0xBD, 0x9D, 0x3E, 0x1E, 0xFE,
+ 0xDE, 0xBE, 0x1F, 0xFF, 0xDF, 0x20, 0x00, 0xE0
+};
+
+static const ByteProvider kLoLDscBlockIndexDOSCDProvider = { ARRAYSIZE(kLoLDscBlockIndexDOSCD), kLoLDscBlockIndexDOSCD };
+
+static const byte kLoLDscDoorY2DOSCD[128] = {
+ 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
+ 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F,
+ 0x10, 0x11, 0x12, 0x13, 0x14, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x0D, 0x08, 0x03, 0x12, 0x0E, 0x09, 0x04, 0x00,
+ 0x13, 0x0F, 0x0A, 0x05, 0x01, 0x14, 0x10, 0x0B,
+ 0x06, 0x02, 0x11, 0x0C, 0x07, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x14, 0x13, 0x12, 0x11, 0x10, 0x0F, 0x0E, 0x0D,
+ 0x0C, 0x0B, 0x0A, 0x09, 0x08, 0x07, 0x06, 0x05,
+ 0x04, 0x03, 0x02, 0x01, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x07, 0x0C, 0x11, 0x02, 0x06, 0x0B, 0x10, 0x14,
+ 0x01, 0x05, 0x0A, 0x0F, 0x13, 0x00, 0x04, 0x09,
+ 0x0E, 0x12, 0x03, 0x08, 0x0D, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+};
+
+static const ByteProvider kLoLDscDoorY2DOSCDProvider = { ARRAYSIZE(kLoLDscDoorY2DOSCD), kLoLDscDoorY2DOSCD };
+
+static const byte kLoLDscDoorFrameY1DOSCD[4] = {
+ 0x1E, 0x18, 0x10, 0x00
+};
+
+static const ByteProvider kLoLDscDoorFrameY1DOSCDProvider = { ARRAYSIZE(kLoLDscDoorFrameY1DOSCD), kLoLDscDoorFrameY1DOSCD };
+
+static const byte kLoLDscDoorFrameY2DOSCD[4] = {
+ 0x3B, 0x47, 0x56, 0x78
+};
+
+static const ByteProvider kLoLDscDoorFrameY2DOSCDProvider = { ARRAYSIZE(kLoLDscDoorFrameY2DOSCD), kLoLDscDoorFrameY2DOSCD };
+
+static const uint16 kLoLDscDoorScaleDOSCD[8] = {
+ 0x0075, 0x006A, 0x00B9, 0x00B2, 0x0100, 0x0100, 0x0000, 0x0000
+};
+
+static const Uint16Provider kLoLDscDoorScaleDOSCDProvider = { ARRAYSIZE(kLoLDscDoorScaleDOSCD), kLoLDscDoorScaleDOSCD };
+
+static const uint16 kLoLDscDoor4DOSCD[4] = {
+ 0x0005, 0x0002, 0x0008, 0x787C
+};
+
+static const Uint16Provider kLoLDscDoor4DOSCDProvider = { ARRAYSIZE(kLoLDscDoor4DOSCD), kLoLDscDoor4DOSCD };
+
+static const uint16 kLoLDscDoorXDOSCD[576] = {
+ 0xFF98, 0xFFA0, 0xFFA8, 0xFF90, 0xFF98, 0xFFA0, 0xFFA8, 0xFFB0,
+ 0xFF74, 0xFF7E, 0xFF88, 0xFF92, 0xFF9C, 0xFF74, 0xFF7E, 0xFF88,
+ 0xFF92, 0xFF9C, 0xFF64, 0xFF70, 0xFF7C, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0xFFB8, 0xFFC0, 0xFFC8, 0xFFB0, 0xFFB8, 0xFFC0, 0xFFC8, 0xFFD0,
+ 0xFF9C, 0xFFA6, 0xFFB0, 0xFFBA, 0xFFC4, 0xFF9C, 0xFFA6, 0xFFB0,
+ 0xFFBA, 0xFFC4, 0xFF94, 0xFFA0, 0xFFAC, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0xFFD8, 0xFFE0, 0xFFE8, 0xFFD0, 0xFFD8, 0xFFE0, 0xFFE8, 0xFFF0,
+ 0xFFC4, 0xFFCE, 0xFFD8, 0xFFE2, 0xFFEC, 0xFFC4, 0xFFCE, 0xFFD8,
+ 0xFFE2, 0xFFEC, 0xFFC4, 0xFFD0, 0xFFDC, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0xFFF8, 0x0000, 0x0008, 0xFFF0, 0xFFF8, 0x0000, 0x0008, 0x0010,
+ 0xFFEC, 0xFFF6, 0x0000, 0x000A, 0x0014, 0xFFEC, 0xFFF6, 0x0000,
+ 0x000A, 0x0014, 0xFFF4, 0x0000, 0x000C, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0018, 0x0020, 0x0028, 0x0010, 0x0018, 0x0020, 0x0028, 0x0030,
+ 0x0014, 0x001E, 0x0028, 0x0032, 0x003C, 0x0014, 0x001E, 0x0028,
+ 0x0032, 0x003C, 0x0024, 0x0030, 0x003C, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0038, 0x0040, 0x0048, 0x0030, 0x0038, 0x0040, 0x0048, 0x0050,
+ 0x003C, 0x0046, 0x0050, 0x005A, 0x0064, 0x003C, 0x0046, 0x0050,
+ 0x005A, 0x0064, 0x0054, 0x0060, 0x006C, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0058, 0x0060, 0x0068, 0x0050, 0x0058, 0x0060, 0x0068, 0x0070,
+ 0x0064, 0x006E, 0x0078, 0x0082, 0x008C, 0x0064, 0x006E, 0x0078,
+ 0x0082, 0x008C, 0x0084, 0x0090, 0x009C, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0xFF94, 0xFFA0, 0xFFAC, 0xFF7E, 0xFF8B, 0xFF98, 0xFFA5, 0xFFB2,
+ 0xFF6C, 0xFF7B, 0xFF8A, 0xFF99, 0xFFA7, 0xFF60, 0xFF70, 0xFF80,
+ 0xFF90, 0xFFA0, 0xFF4C, 0xFF60, 0xFF74, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0xFFC4, 0xFFD0, 0xFFDC, 0xFFB2, 0xFFBF, 0xFFCC, 0xFFD9, 0xFFE6,
+ 0xFFA7, 0xFFB6, 0xFFC5, 0xFFD4, 0xFFE2, 0xFFA0, 0xFFB0, 0xFFC0,
+ 0xFFD0, 0xFFE0, 0xFF9C, 0xFFB0, 0xFFC4, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0xFFF4, 0x0000, 0x000C, 0xFFE6, 0xFFF3, 0x0000, 0x000D, 0x001A,
+ 0xFFE2, 0xFFF1, 0x0000, 0x000F, 0x001E, 0xFFE0, 0xFFF0, 0x0000,
+ 0x0010, 0x0020, 0xFFEC, 0x0000, 0x0014, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0024, 0x0030, 0x003C, 0x001A, 0x0027, 0x0034, 0x0041, 0x004E,
+ 0x001E, 0x002C, 0x003B, 0x004A, 0x0059, 0x0020, 0x0030, 0x0040,
+ 0x0050, 0x0060, 0x003C, 0x0050, 0x0064, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0054, 0x0060, 0x006C, 0x004E, 0x005B, 0x0068, 0x0075, 0x0082,
+ 0x0059, 0x0067, 0x0076, 0x0085, 0x0094, 0x0060, 0x0070, 0x0080,
+ 0x0090, 0x00A0, 0x008C, 0x00A0, 0x00B4, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0xFF9C, 0xFFB0, 0xFFC4, 0xFF7C, 0xFF92, 0xFFA8, 0xFFBE, 0xFFD4,
+ 0xFF6D, 0xFF85, 0xFF9E, 0xFFB6, 0xFFCF, 0xFF5E, 0xFF79, 0xFF94,
+ 0xFFAF, 0xFFCA, 0xFF60, 0xFF80, 0xFFA0, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0xFFEC, 0x0000, 0x0014, 0xFFD4, 0xFFEA, 0x0000, 0x0016, 0x002C,
+ 0xFFCF, 0xFFE7, 0x0000, 0x0019, 0x0031, 0xFFCA, 0xFFE5, 0x0000,
+ 0x001B, 0x0036, 0xFFE0, 0x0000, 0x0020, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x003C, 0x0050, 0x0064, 0x002C, 0x0042, 0x0058, 0x006E, 0x0084,
+ 0x0031, 0x004A, 0x0062, 0x007B, 0x0093, 0x0036, 0x0051, 0x006C,
+ 0x0087, 0x00A2, 0x0060, 0x0080, 0x00A0, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0xFF60, 0xFF80, 0xFFA0, 0xFF1C, 0xFF42, 0xFF68, 0xFF8E, 0xFFB4,
+ 0xFF40, 0xFF60, 0xFF80, 0xFFA0, 0xFFC0, 0xFF1C, 0xFF42, 0xFF68,
+ 0xFF8E, 0xFFB4, 0xFF60, 0xFF80, 0xFFA0, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0xFFE0, 0x0000, 0x0020, 0xFFB4, 0xFFDA, 0x0000, 0x0026, 0x004C,
+ 0xFFC0, 0xFFE0, 0x0000, 0x0020, 0x0040, 0xFFB4, 0xFFDA, 0x0000,
+ 0x0026, 0x004C, 0xFFE0, 0x0000, 0x0020, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0060, 0x0080, 0x00A0, 0x004C, 0x0072, 0x0098, 0x00BE, 0x00E4,
+ 0x0040, 0x0060, 0x0080, 0x00A0, 0x00C0, 0x004C, 0x0072, 0x0098,
+ 0x00BE, 0x00E4, 0x0060, 0x0080, 0x00A0, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000
+};
+
+static const Uint16Provider kLoLDscDoorXDOSCDProvider = { ARRAYSIZE(kLoLDscDoorXDOSCD), kLoLDscDoorXDOSCD };
+
+static const uint16 kLoLDscDoorYDOSCD[576] = {
+ 0xFFBF, 0xFFBF, 0xFFBF, 0xFFC1, 0xFFC1, 0xFFC1, 0xFFC1, 0xFFC1,
+ 0xFFC3, 0xFFC3, 0xFFC3, 0xFFC3, 0xFFC3, 0xFFC5, 0xFFC5, 0xFFC5,
+ 0xFFC5, 0xFFC5, 0xFFC9, 0xFFC9, 0xFFC9, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0xFFBF, 0xFFBF, 0xFFBF, 0xFFC1, 0xFFC1, 0xFFC1, 0xFFC1, 0xFFC1,
+ 0xFFC3, 0xFFC3, 0xFFC3, 0xFFC3, 0xFFC3, 0xFFC5, 0xFFC5, 0xFFC5,
+ 0xFFC5, 0xFFC5, 0xFFC9, 0xFFC9, 0xFFC9, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0xFFBF, 0xFFBF, 0xFFBF, 0xFFC1, 0xFFC1, 0xFFC1, 0xFFC1, 0xFFC1,
+ 0xFFC3, 0xFFC3, 0xFFC3, 0xFFC3, 0xFFC3, 0xFFC5, 0xFFC5, 0xFFC5,
+ 0xFFC5, 0xFFC5, 0xFFC9, 0xFFC9, 0xFFC9, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0xFFBF, 0xFFBF, 0xFFBF, 0xFFC1, 0xFFC1, 0xFFC1, 0xFFC1, 0xFFC1,
+ 0xFFC3, 0xFFC3, 0xFFC3, 0xFFC3, 0xFFC3, 0xFFC5, 0xFFC5, 0xFFC5,
+ 0xFFC5, 0xFFC5, 0xFFC9, 0xFFC9, 0xFFC9, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0xFFBF, 0xFFBF, 0xFFBF, 0xFFC1, 0xFFC1, 0xFFC1, 0xFFC1, 0xFFC1,
+ 0xFFC3, 0xFFC3, 0xFFC3, 0xFFC3, 0xFFC3, 0xFFC5, 0xFFC5, 0xFFC5,
+ 0xFFC5, 0xFFC5, 0xFFC9, 0xFFC9, 0xFFC9, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0xFFBF, 0xFFBF, 0xFFBF, 0xFFC1, 0xFFC1, 0xFFC1, 0xFFC1, 0xFFC1,
+ 0xFFC3, 0xFFC3, 0xFFC3, 0xFFC3, 0xFFC3, 0xFFC5, 0xFFC5, 0xFFC5,
+ 0xFFC5, 0xFFC5, 0xFFC9, 0xFFC9, 0xFFC9, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0xFFBF, 0xFFBF, 0xFFBF, 0xFFC1, 0xFFC1, 0xFFC1, 0xFFC1, 0xFFC1,
+ 0xFFC3, 0xFFC3, 0xFFC3, 0xFFC3, 0xFFC3, 0xFFC5, 0xFFC5, 0xFFC5,
+ 0xFFC5, 0xFFC5, 0xFFC9, 0xFFC9, 0xFFC9, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0xFFC9, 0xFFC9, 0xFFC9, 0xFFCB, 0xFFCB, 0xFFCB, 0xFFCB, 0xFFCB,
+ 0xFFCE, 0xFFCE, 0xFFCE, 0xFFCE, 0xFFCE, 0xFFD3, 0xFFD3, 0xFFD3,
+ 0xFFD3, 0xFFD3, 0xFFD7, 0xFFD7, 0xFFD7, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0xFFC9, 0xFFC9, 0xFFC9, 0xFFCB, 0xFFCB, 0xFFCB, 0xFFCB, 0xFFCB,
+ 0xFFCE, 0xFFCE, 0xFFCE, 0xFFCE, 0xFFCE, 0xFFD3, 0xFFD3, 0xFFD3,
+ 0xFFD3, 0xFFD3, 0xFFD7, 0xFFD7, 0xFFD7, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0xFFC9, 0xFFC9, 0xFFC9, 0xFFCB, 0xFFCB, 0xFFCB, 0xFFCB, 0xFFCB,
+ 0xFFCE, 0xFFCE, 0xFFCE, 0xFFCE, 0xFFCE, 0xFFD3, 0xFFD3, 0xFFD3,
+ 0xFFD3, 0xFFD3, 0xFFD7, 0xFFD7, 0xFFD7, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0xFFC9, 0xFFC9, 0xFFC9, 0xFFCB, 0xFFCB, 0xFFCB, 0xFFCB, 0xFFCB,
+ 0xFFCE, 0xFFCE, 0xFFCE, 0xFFCE, 0xFFCE, 0xFFD3, 0xFFD3, 0xFFD3,
+ 0xFFD3, 0xFFD3, 0xFFD7, 0xFFD7, 0xFFD7, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0xFFC9, 0xFFC9, 0xFFC9, 0xFFCB, 0xFFCB, 0xFFCB, 0xFFCB, 0xFFCB,
+ 0xFFCE, 0xFFCE, 0xFFCE, 0xFFCE, 0xFFCE, 0xFFD3, 0xFFD3, 0xFFD3,
+ 0xFFD3, 0xFFD3, 0xFFD7, 0xFFD7, 0xFFD7, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0xFFD7, 0xFFD7, 0xFFD7, 0xFFDD, 0xFFDD, 0xFFDD, 0xFFDD, 0xFFDD,
+ 0xFFE2, 0xFFE2, 0xFFE2, 0xFFE2, 0xFFE2, 0xFFEA, 0xFFEA, 0xFFEA,
+ 0xFFEA, 0xFFEA, 0xFFF8, 0xFFF8, 0xFFF8, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0xFFD7, 0xFFD7, 0xFFD7, 0xFFDD, 0xFFDD, 0xFFDD, 0xFFDD, 0xFFDD,
+ 0xFFE2, 0xFFE2, 0xFFE2, 0xFFE2, 0xFFE2, 0xFFEA, 0xFFEA, 0xFFEA,
+ 0xFFEA, 0xFFEA, 0xFFF8, 0xFFF8, 0xFFF8, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0xFFD7, 0xFFD7, 0xFFD7, 0xFFDD, 0xFFDD, 0xFFDD, 0xFFDD, 0xFFDD,
+ 0xFFE2, 0xFFE2, 0xFFE2, 0xFFE2, 0xFFE2, 0xFFEA, 0xFFEA, 0xFFEA,
+ 0xFFEA, 0xFFEA, 0xFFF8, 0xFFF8, 0xFFF8, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0xFFF8, 0xFFF8, 0xFFF8, 0xFFFC, 0xFFFC, 0xFFFC, 0xFFFC, 0xFFFC,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0xFFF8, 0xFFF8, 0xFFF8, 0xFFFC, 0xFFFC, 0xFFFC, 0xFFFC, 0xFFFC,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0xFFF8, 0xFFF8, 0xFFF8, 0xFFFC, 0xFFFC, 0xFFFC, 0xFFFC, 0xFFFC,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000
+};
+
+static const Uint16Provider kLoLDscDoorYDOSCDProvider = { ARRAYSIZE(kLoLDscDoorYDOSCD), kLoLDscDoorYDOSCD };
+
+static const byte kLoLScrollXTopDOSCD[5] = {
+ 0x05, 0x0A, 0x0F, 0x14, 0x19
+};
+
+static const ByteProvider kLoLScrollXTopDOSCDProvider = { ARRAYSIZE(kLoLScrollXTopDOSCD), kLoLScrollXTopDOSCD };
+
+static const byte kLoLScrollYTopDOSCD[5] = {
+ 0x02, 0x04, 0x07, 0x09, 0x0C
+};
+
+static const ByteProvider kLoLScrollYTopDOSCDProvider = { ARRAYSIZE(kLoLScrollYTopDOSCD), kLoLScrollYTopDOSCD };
+
+static const byte kLoLScrollXBottomDOSCD[5] = {
+ 0x05, 0x0A, 0x0F, 0x14, 0x19
+};
+
+static const ByteProvider kLoLScrollXBottomDOSCDProvider = { ARRAYSIZE(kLoLScrollXBottomDOSCD), kLoLScrollXBottomDOSCD };
+
+static const byte kLoLScrollYBottomDOSCD[5] = {
+ 0x04, 0x08, 0x0C, 0x10, 0x14
+};
+
+static const ByteProvider kLoLScrollYBottomDOSCDProvider = { ARRAYSIZE(kLoLScrollYBottomDOSCD), kLoLScrollYBottomDOSCD };
+
+static const LoLButtonDef kLoLButtonDefsDOSCD[95] = {
+ { 0x1100, 96, 352, 33, 131, 22, 19, 0x0000, 0 },
+ { 0x1100, 97, 353, 33, 150, 22, 18, 0x0000, 0 },
+ { 0x1100, 98, 354, 33, 150, 22, 18, 0x0000, 0 },
+ { 0x1100, 92, 348, 11, 150, 22, 18, 0x0000, 0 },
+ { 0x1100, 102, 358, 53, 150, 22, 18, 0x0000, 0 },
+ { 0x1100, 91, 347, 11, 131, 22, 19, 0x0000, 0 },
+ { 0x1100, 101, 357, 53, 131, 22, 19, 0x0000, 0 },
+ { 0x0100, 112, 0, 80, 143, 22, 17, 0x0000, 0 },
+ { 0x0100, 113, 0, 80, 143, 22, 17, 0x0001, 0 },
+ { 0x0100, 114, 0, 80, 143, 22, 17, 0x0002, 0 },
+ { 0x0100, 115, 0, 80, 143, 22, 17, 0x0003, 0 },
+ { 0x1100, 0, 0, 80, 160, 22, 17, 0x0000, 0 },
+ { 0x1100, 0, 0, 80, 160, 22, 17, 0x0001, 0 },
+ { 0x1100, 0, 0, 80, 160, 22, 17, 0x0002, 0 },
+ { 0x1100, 0, 0, 80, 160, 22, 17, 0x0003, 0 },
+ { 0x1100, 0, 0, 80, 144, 22, 32, 0x0000, 0 },
+ { 0x1100, 110, 0, 0, 0, 320, 200, 0x0003, 0 },
+ { 0x0100, 0, 0, 80, 143, 33, 34, 0x0000, 0 },
+ { 0x0100, 0, 0, 80, 143, 33, 34, 0x0001, 0 },
+ { 0x0100, 0, 0, 80, 143, 33, 34, 0x0002, 0 },
+ { 0x0100, 0, 0, 80, 143, 33, 34, 0x0003, 0 },
+ { 0x0100, 0, 0, 80, 143, 66, 34, 0x0000, 0 },
+ { 0x0100, 0, 0, 80, 143, 66, 34, 0x0001, 0 },
+ { 0x0100, 0, 0, 80, 143, 66, 34, 0x0002, 0 },
+ { 0x0100, 0, 0, 80, 143, 66, 34, 0x0003, 0 },
+ { 0x0100, 0, 0, 80, 143, 12, 34, 0x0000, 0 },
+ { 0x0100, 0, 0, 80, 143, 12, 34, 0x0001, 0 },
+ { 0x0100, 0, 0, 80, 143, 12, 34, 0x0002, 0 },
+ { 0x0100, 0, 0, 80, 143, 12, 34, 0x0003, 0 },
+ { 0x1000, 0, 0, 80, 143, 66, 34, 0x0000, 0 },
+ { 0x1000, 0, 0, 80, 143, 66, 34, 0x0001, 0 },
+ { 0x1000, 0, 0, 80, 143, 66, 34, 0x0002, 0 },
+ { 0x1000, 0, 0, 80, 143, 66, 34, 0x0003, 0 },
+ { 0x1100, 0, 0, 0, 0, 20, 19, 0x0000, 2 },
+ { 0x1100, 0, 0, 0, 0, 20, 19, 0x0001, 2 },
+ { 0x1100, 0, 0, 0, 0, 20, 19, 0x0002, 2 },
+ { 0x1100, 0, 0, 0, 0, 20, 19, 0x0003, 2 },
+ { 0x1100, 0, 0, 0, 0, 20, 19, 0x0004, 2 },
+ { 0x1100, 0, 0, 0, 0, 20, 19, 0x0005, 2 },
+ { 0x1100, 0, 0, 0, 0, 20, 19, 0x0006, 2 },
+ { 0x1100, 0, 0, 0, 0, 20, 19, 0x0007, 2 },
+ { 0x1100, 0, 0, 0, 0, 20, 19, 0x0008, 2 },
+ { 0x1100, 0, 0, 0, 0, 12, 11, 0x0009, 2 },
+ { 0x1100, 0, 0, 0, 0, 12, 11, 0x000A, 2 },
+ { 0x1100, 110, 0, 160, 93, 43, 19, 0x0000, 2 },
+ { 0x1100, 0, 0, 0, 102, 88, 19, 0x0000, 2 },
+ { 0x1100, 0, 0, 88, 102, 88, 19, 0x0001, 2 },
+ { 0x1100, 0, 0, 0, 85, 88, 17, 0x0002, 2 },
+ { 0x1100, 0, 0, 88, 85, 88, 17, 0x0003, 2 },
+ { 0x1100, 0, 0, 0, 0, 176, 120, 0x0000, 2 },
+ { 0x1100, 0, 0, 106, 179, 21, 21, 0x0000, 0 },
+ { 0x1100, 0, 0, 127, 179, 21, 21, 0x0001, 0 },
+ { 0x1100, 0, 0, 148, 179, 21, 21, 0x0002, 0 },
+ { 0x1100, 0, 0, 169, 179, 21, 21, 0x0003, 0 },
+ { 0x1100, 0, 0, 190, 179, 21, 21, 0x0004, 0 },
+ { 0x1100, 0, 0, 211, 179, 21, 21, 0x0005, 0 },
+ { 0x1100, 0, 0, 232, 179, 21, 21, 0x0006, 0 },
+ { 0x1100, 0, 0, 253, 179, 21, 21, 0x0007, 0 },
+ { 0x1100, 0, 0, 274, 179, 21, 21, 0x0008, 0 },
+ { 0x1100, 0, 0, 274, 179, 21, 21, 0x0009, 0 },
+ { 0x1100, 0, 0, 85, 179, 21, 21, 0xFFFF, 0 },
+ { 0x1100, 0, 0, 295, 179, 22, 21, 0x0001, 0 },
+ { 0x1100, 0, 0, 24, 8, 128, 96, 0x0001, 2 },
+ { 0x1100, 0, 0, 0, 0, 176, 120, 0x0000, 2 },
+ { 0x1100, 0, 0, 0, 0, 0, 0, 0x0000, 0 },
+ { 0x1100, 0, 0, 112, 0, 176, 16, 0x0001, 0 },
+ { 0x1100, 0, 0, 112, 110, 176, 26, 0x0001, 0 },
+ { 0x1100, 0, 0, 96, 88, 32, 32, 0x0001, 0 },
+ { 0x1100, 0, 0, 272, 88, 32, 32, 0x0001, 0 },
+ { 0x1100, 0, 0, 96, 16, 32, 72, 0x0001, 0 },
+ { 0x1100, 0, 0, 272, 16, 32, 72, 0x0001, 0 },
+ { 0x1100, 0, 0, 24, 15, 61, 9, 0x0000, 0 },
+ { 0x1100, 0, 0, 24, 24, 61, 9, 0x0000, 0 },
+ { 0x1100, 0, 0, 24, 33, 61, 9, 0x0000, 0 },
+ { 0x1100, 0, 0, 24, 42, 61, 9, 0x0000, 0 },
+ { 0x1100, 0, 0, 24, 51, 61, 9, 0x0000, 0 },
+ { 0x1100, 0, 0, 24, 60, 61, 9, 0x0000, 0 },
+ { 0x1100, 0, 0, 24, 69, 61, 9, 0x0000, 0 },
+ { 0x1100, 0, 0, 24, 78, 61, 9, 0x0000, 0 },
+ { 0x1100, 0, 0, 24, 87, 61, 9, 0x0000, 0 },
+ { 0x1100, 0, 0, 24, 96, 61, 9, 0x0000, 0 },
+ { 0x0100, 0, 0, 80, 143, 66, 34, 0x0000, 0 },
+ { 0x0100, 0, 0, 80, 143, 66, 34, 0x0001, 0 },
+ { 0x0100, 0, 0, 80, 143, 66, 34, 0x0002, 0 },
+ { 0x0100, 0, 0, 80, 143, 66, 34, 0x0003, 0 },
+ { 0x1100, 110, 0, 0, 0, 320, 200, 0x0003, 0 },
+ { 0x0100, 0, 0, 112, 0, 88, 80, 0x0000, 0 },
+ { 0x0100, 0, 0, 200, 0, 88, 80, 0x0001, 0 },
+ { 0x1100, 25, 110, 11, 178, 21, 22, 0x0000, 0 },
+ { 0x0100, 20, 0, 32, 178, 22, 22, 0x0000, 0 },
+ { 0x0100, 0, 0, 291, 96, 27, 24, 0x0000, 0 },
+ { 0x0100, 0, 0, 289, 0, 31, 28, 0x0000, 0 },
+ { 0x0100, 0, 0, 289, 31, 31, 23, 0x0000, 0 },
+ { 0x0100, 0, 0, 291, 56, 29, 24, 0x0000, 0 },
+ { 0x1100, 0, 0, 220, 98, 43, 19, 0x0000, 0 }
+};
+
+static const LoLButtonDefProvider kLoLButtonDefsDOSCDProvider = { ARRAYSIZE(kLoLButtonDefsDOSCD), kLoLButtonDefsDOSCD };
+
+static const byte kLoLButtonList1DOSCD[40] = {
+ 0x59, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x31,
+ 0x3E, 0x2D, 0x2E, 0x2F, 0x30, 0x56, 0x57, 0x01,
+ 0x02, 0x00, 0x03, 0x04, 0x05, 0x06, 0x32, 0x33,
+ 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3A, 0x3B,
+ 0x3C, 0x3D, 0x58, 0x5A, 0x5B, 0x5C, 0x5D, 0xFF
+};
+
+static const ByteProvider kLoLButtonList1DOSCDProvider = { ARRAYSIZE(kLoLButtonList1DOSCD), kLoLButtonList1DOSCD };
+
+static const byte kLoLButtonList2DOSCD[15] = {
+ 0x2C, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38,
+ 0x39, 0x3A, 0x3B, 0x3C, 0x3D, 0x5E, 0xFF
+};
+
+static const ByteProvider kLoLButtonList2DOSCDProvider = { ARRAYSIZE(kLoLButtonList2DOSCD), kLoLButtonList2DOSCD };
+
+static const byte kLoLButtonList3DOSCD[2] = {
+ 0x40, 0xFF
+};
+
+static const ByteProvider kLoLButtonList3DOSCDProvider = { ARRAYSIZE(kLoLButtonList3DOSCD), kLoLButtonList3DOSCD };
+
+static const byte kLoLButtonList4DOSCD[15] = {
+ 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39,
+ 0x3A, 0x3B, 0x3C, 0x3D, 0x5A, 0x5B, 0xFF
+};
+
+static const ByteProvider kLoLButtonList4DOSCDProvider = { ARRAYSIZE(kLoLButtonList4DOSCD), kLoLButtonList4DOSCD };
+
+static const byte kLoLButtonList5DOSCD[16] = {
+ 0x01, 0x02, 0x00, 0x03, 0x04, 0x05, 0x06, 0x41,
+ 0x42, 0x43, 0x44, 0x45, 0x46, 0x5A, 0x5B, 0xFF
+};
+
+static const ByteProvider kLoLButtonList5DOSCDProvider = { ARRAYSIZE(kLoLButtonList5DOSCD), kLoLButtonList5DOSCD };
+
+static const byte kLoLButtonList6DOSCD[14] = {
+ 0x2C, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38,
+ 0x39, 0x3A, 0x3B, 0x3C, 0x3D, 0xFF
+};
+
+static const ByteProvider kLoLButtonList6DOSCDProvider = { ARRAYSIZE(kLoLButtonList6DOSCD), kLoLButtonList6DOSCD };
+
+static const byte kLoLButtonList7DOSCD[3] = {
+ 0x0F, 0x10, 0xFF
+};
+
+static const ByteProvider kLoLButtonList7DOSCDProvider = { ARRAYSIZE(kLoLButtonList7DOSCD), kLoLButtonList7DOSCD };
+
+static const byte kLoLButtonList8DOSCD[2] = {
+ 0x55, 0xFF
+};
+
+static const ByteProvider kLoLButtonList8DOSCDProvider = { ARRAYSIZE(kLoLButtonList8DOSCD), kLoLButtonList8DOSCD };
+
+static const byte kLoLLegendDataDOSCD[60] = {
+ 0x0E, 0x00, 0x00, 0x07, 0x42, 0x19, 0x00, 0x00,
+ 0x08, 0x42, 0x1A, 0x00, 0x00, 0x09, 0x42, 0x0D,
+ 0x00, 0x00, 0x0A, 0x42, 0x0A, 0x00, 0x00, 0x0B,
+ 0x42, 0x0B, 0x00, 0x00, 0x0C, 0x42, 0x0F, 0x00,
+ 0x00, 0x0D, 0x42, 0x16, 0x00, 0x00, 0x0E, 0x42,
+ 0x17, 0x00, 0x00, 0x0F, 0x42, 0x11, 0x00, 0x00,
+ 0x10, 0x42, 0x12, 0x00, 0xFB, 0x51, 0x42, 0xFF,
+ 0xFF, 0xFF, 0xFF, 0xFF
+};
+
+static const ByteProvider kLoLLegendDataDOSCDProvider = { ARRAYSIZE(kLoLLegendDataDOSCD), kLoLLegendDataDOSCD };
+
+static const byte kLoLMapCursorOvlDOSCD[25] = {
+ 0x00, 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86,
+ 0x87, 0x88, 0x01, 0x01, 0x01, 0x01, 0x01, 0x88,
+ 0x87, 0x86, 0x85, 0x84, 0x83, 0x82, 0x81, 0x80,
+ 0x80
+};
+
+static const ByteProvider kLoLMapCursorOvlDOSCDProvider = { ARRAYSIZE(kLoLMapCursorOvlDOSCD), kLoLMapCursorOvlDOSCD };
+
+static const uint16 kLoLMapStringIdDOSCD[30] = {
+ 0xFFFF, 0x4211, 0x4212, 0x4213, 0x4214, 0x4215, 0x4216, 0x4217,
+ 0x4218, 0x4219, 0x421A, 0x421B, 0x421C, 0x421D, 0x421E, 0x421F,
+ 0x4220, 0x4221, 0x4222, 0x4223, 0x4224, 0x4225, 0x4226, 0x4227,
+ 0x4228, 0x4229, 0x422A, 0x422B, 0x422C, 0x422D
+};
+
+static const Uint16Provider kLoLMapStringIdDOSCDProvider = { ARRAYSIZE(kLoLMapStringIdDOSCD), kLoLMapStringIdDOSCD };
+
+static const byte kLoLSpellbookAnimDOSCD[28] = {
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x04, 0x00, 0x13, 0xB6, 0x04, 0x00, 0x13, 0x4D,
+ 0x04, 0x00, 0x13, 0xB9, 0x04, 0x00, 0x13, 0xB8,
+ 0x04, 0x00, 0x13, 0xBA
+};
+
+static const ByteProvider kLoLSpellbookAnimDOSCDProvider = { ARRAYSIZE(kLoLSpellbookAnimDOSCD), kLoLSpellbookAnimDOSCD };
+
+static const byte kLoLSpellbookCoordsDOSCD[12] = {
+ 0x16, 0x16, 0x16, 0x1F, 0x16, 0x28, 0x16, 0x31,
+ 0x16, 0x3A, 0x16, 0x43
+};
+
+static const ByteProvider kLoLSpellbookCoordsDOSCDProvider = { ARRAYSIZE(kLoLSpellbookCoordsDOSCD), kLoLSpellbookCoordsDOSCD };
+
+static const byte kLoLHealShapeFramesDOSCD[80] = {
+ 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x02, 0x02,
+ 0x02, 0x02, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x01, 0x01, 0x02, 0x02, 0x03, 0x03,
+ 0x03, 0x03, 0x02, 0x02, 0x01, 0x01, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05,
+ 0x05, 0x04, 0x03, 0x02, 0x01, 0x00, 0x00, 0x00,
+ 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
+ 0x07, 0x06, 0x05, 0x04, 0x03, 0x02, 0x01, 0x00,
+ 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
+ 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F
+};
+
+static const ByteProvider kLoLHealShapeFramesDOSCDProvider = { ARRAYSIZE(kLoLHealShapeFramesDOSCD), kLoLHealShapeFramesDOSCD };
+
+static const byte kLoLLightningDefsDOSCD[20] = {
+ 0x06, 0x05, 0xAB, 0x00, 0x06, 0x04, 0xAB, 0x00,
+ 0x08, 0x04, 0xAA, 0x00, 0x06, 0x03, 0xAA, 0x00,
+ 0x06, 0x02, 0xA9, 0x00
+};
+
+static const ByteProvider kLoLLightningDefsDOSCDProvider = { ARRAYSIZE(kLoLLightningDefsDOSCD), kLoLLightningDefsDOSCD };
+
+static const uint16 kLoLFireballCoordsDOSCD[256] = {
+ 0x0000, 0x0324, 0x0647, 0x096A, 0x0C8B, 0x0FAB, 0x12C7, 0x15E1,
+ 0x18F8, 0x1C0B, 0x1F19, 0x2223, 0x2527, 0x2826, 0x2B1E, 0x2E10,
+ 0x30FB, 0x33DE, 0x36B9, 0x398C, 0x3C56, 0x3F16, 0x41CD, 0x447A,
+ 0x471C, 0x49B3, 0x4C3F, 0x4EBF, 0x5133, 0x539A, 0x55F4, 0x5842,
+ 0x5A81, 0x5CB3, 0x5ED6, 0x60EB, 0x62F1, 0x64E7, 0x66CE, 0x68A5,
+ 0x6A6C, 0x6C23, 0x6DC9, 0x6F5E, 0x70E1, 0x7254, 0x73B5, 0x7503,
+ 0x7640, 0x776B, 0x7883, 0x7989, 0x7A7C, 0x7B5C, 0x7C29, 0x7CE2,
+ 0x7D89, 0x7E1C, 0x7E9C, 0x7F08, 0x7F61, 0x7FA6, 0x7FD7, 0x7FF5,
+ 0x7FFF, 0x7FF5, 0x7FD7, 0x7FA6, 0x7F61, 0x7F08, 0x7E9C, 0x7E1C,
+ 0x7D89, 0x7CE2, 0x7C29, 0x7B5C, 0x7A7C, 0x7989, 0x7883, 0x776B,
+ 0x7640, 0x7503, 0x73B5, 0x7254, 0x70E1, 0x6F5E, 0x6DC9, 0x6C23,
+ 0x6A6C, 0x68A5, 0x66CE, 0x64E7, 0x62F1, 0x60EB, 0x5ED6, 0x5CB3,
+ 0x5A81, 0x5842, 0x55F4, 0x539A, 0x5133, 0x4EBF, 0x4C3F, 0x49B3,
+ 0x471C, 0x447A, 0x41CD, 0x3F16, 0x3C56, 0x398C, 0x36B9, 0x33DE,
+ 0x30FB, 0x2E10, 0x2B1E, 0x2826, 0x2527, 0x2223, 0x1F19, 0x1C0B,
+ 0x18F8, 0x15E1, 0x12C7, 0x0FAB, 0x0C8B, 0x096A, 0x0647, 0x0324,
+ 0x0000, 0xFCDC, 0xF9B9, 0xF696, 0xF375, 0xF055, 0xED39, 0xEA1F,
+ 0xE708, 0xE3F5, 0xE0E7, 0xDDDD, 0xDAD9, 0xD7DA, 0xD4E2, 0xD1F0,
+ 0xCF05, 0xCC22, 0xC947, 0xC674, 0xC3AA, 0xC0EA, 0xBE33, 0xBB86,
+ 0xB8E4, 0xB64D, 0xB3C1, 0xB141, 0xAECD, 0xAC66, 0xAA0C, 0xA7BE,
+ 0xA57F, 0xA34D, 0xA12A, 0x9F15, 0x9D0F, 0x9B19, 0x9932, 0x975B,
+ 0x9594, 0x93DD, 0x9237, 0x90A2, 0x8F1F, 0x8DAC, 0x8C4B, 0x8AFD,
+ 0x89C0, 0x8895, 0x877D, 0x8677, 0x8584, 0x84A4, 0x83D7, 0x831E,
+ 0x8277, 0x81E4, 0x8164, 0x80F8, 0x809F, 0x805A, 0x8029, 0x800B,
+ 0x8001, 0x800B, 0x8029, 0x805A, 0x809F, 0x80F8, 0x8164, 0x81E4,
+ 0x8277, 0x831E, 0x83D7, 0x84A4, 0x8584, 0x8677, 0x877D, 0x8895,
+ 0x89C0, 0x8AFD, 0x8C4B, 0x8DAC, 0x8F1F, 0x90A2, 0x9237, 0x93DD,
+ 0x9594, 0x975B, 0x9932, 0x9B19, 0x9D0F, 0x9F15, 0xA12A, 0xA34D,
+ 0xA57F, 0xA7BE, 0xAA0C, 0xAC66, 0xAECD, 0xB141, 0xB3C1, 0xB64D,
+ 0xB8E4, 0xBB86, 0xBE33, 0xC0EA, 0xC3AA, 0xC674, 0xC947, 0xCC22,
+ 0xCF05, 0xD1F0, 0xD4E2, 0xD7DA, 0xDAD9, 0xDDDD, 0xE0E7, 0xE3F5,
+ 0xE708, 0xEA1F, 0xED39, 0xF055, 0xF375, 0xF696, 0xF9B9, 0xFCDC
+};
+
+static const Uint16Provider kLoLFireballCoordsDOSCDProvider = { ARRAYSIZE(kLoLFireballCoordsDOSCD), kLoLFireballCoordsDOSCD };
+
diff --git a/devtools/create_kyradat/resources/lol_dos_cd_english.h b/devtools/create_kyradat/resources/lol_dos_cd_english.h
new file mode 100644
index 0000000000..9d636cf714
--- /dev/null
+++ b/devtools/create_kyradat/resources/lol_dos_cd_english.h
@@ -0,0 +1,68 @@
+static const LoLCharacter kLoLCharacterDefsDOSCDEnglish[9] = {
+ { 0x0001, "Michael", 0, -1, 0, 0, 17,
+ { 0, 0, 0, 0, 0, 0, 0, 0 },
+ { 256, 256, 256, 256, 256, 256, 256, 256 },
+ 0, 20, 20, 6, 6, 0, 0, 0, 384, 320, 5, 2, 0,
+ { 44, 0, 0, 0, 0, 138, 0, 0, 162, 0, 0 },
+ { 1, 1, 1 }, { 0, 0, 0 }, { 1, 1, 1 },
+ { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 } },
+ { 0x0001, "Timothy", 0, 2, 0, 0, 22,
+ { 0, 0, 0, 0, 0, 0, 0, 0 },
+ { 256, 256, 256, 256, 256, 256, 256, 256 },
+ 0, 27, 27, 5, 5, 0, 0, 0, 256, 256, 0, 0, 0,
+ { 93, 131, 0, 0, 0, 153, 0, 0, 162, 0, 0 },
+ { 3, 2, 1 }, { 0, 0, 0 }, { 2500, 1000, 250 },
+ { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 } },
+ { 0x0001, "Baccata", 3, 3, 0, 0, 23,
+ { 0, 0, 0, 0, 0, 0, 0, 0 },
+ { 256, 256, 256, 256, 256, 256, 256, 256 },
+ 0, 22, 22, 18, 18, 0, 0, 0, 256, 256, 0, 0, 0,
+ { 108, 149, 0, 0, 145, 153, 0, 0, 129, 0, 0 },
+ { 1, 1, 3 }, { 0, 0, 0 }, { 1, 1, 4000 },
+ { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 } },
+ { 0x0001, "Lora", 1, 4, 0, 0, 24,
+ { 0, 0, 0, 0, 0, 0, 0, 0 },
+ { 256, 256, 256, 256, 256, 256, 256, 256 },
+ 0, 25, 48, 5, 5, 0, 0, 0, 256, 256, 0, 0, 0,
+ { 0, 0, 0, 0, 0, 137, 0, 0, 162, 0, 0 },
+ { 1, 4, 1 }, { 0, 0, 0 }, { 1, 15001, 1 },
+ { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 } },
+ { 0x0001, "Conrad", 0, -5, 0, 0, 26,
+ { 0, 0, 0, 0, 0, 0, 0, 0 },
+ { 256, 256, 256, 256, 256, 256, 256, 256 },
+ 0, 23, 23, 10, 10, 0, 0, 0, 366, 358, 2, 3, 0,
+ { 44, 0, 0, 0, 0, 138, 0, 0, 162, 0, 0 },
+ { 1, 1, 1 }, { 0, 0, 0 }, { 1, 1, 1 },
+ { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 } },
+ { 0x0001, "Paulson", 0, 6, 0, 0, 25,
+ { 0, 0, 0, 0, 0, 0, 0, 0 },
+ { 256, 256, 256, 256, 256, 256, 256, 256 },
+ 0, 105, 105, 45, 45, 0, 0, 0, 256, 256, 0, 0, 0,
+ { 0, 0, 0, 0, 0, 138, 0, 0, 129, 0, 0 },
+ { 5, 2, 3 }, { 0, 0, 0 }, { 40000, 501, 3500 },
+ { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 } },
+ { 0x0001, "Dawn", 1, 7, 0, 0, 24,
+ { 0, 0, 0, 0, 0, 0, 0, 0 },
+ { 256, 256, 256, 256, 256, 256, 256, 256 },
+ 0, 50, 50, 80, 80, 0, 0, 0, 256, 256, 0, 0, 0,
+ { 0, 0, 0, 0, 0, 138, 0, 0, 129, 0, 0 },
+ { 1, 2, 10 }, { 1, 254, 177 }, { 1, 501, 1 },
+ { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 } },
+ { 0x0001, "Kieran", 2, -8, 0, 0, 21,
+ { 0, 0, 0, 0, 0, 0, 0, 0 },
+ { 256, 256, 256, 256, 256, 256, 256, 256 },
+ 0, 23, 23, 8, 8, 0, 0, 0, 422, 332, 5, 1, 0,
+ { 44, 0, 0, 0, 0, 138, 0, 0, 162, 0, 0 },
+ { 1, 1, 1 }, { 0, 0, 0 }, { 1, 1, 1 },
+ { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 } },
+ { 0x0001, "Ak'shel", 4, -9, 0, 0, 20,
+ { 0, 0, 0, 0, 0, 0, 0, 0 },
+ { 256, 256, 256, 256, 256, 256, 256, 256 },
+ 0, 28, 28, 32, 32, 0, 0, 0, 320, 256, 1, 1, 0,
+ { 44, 0, 0, 0, 0, 138, 0, 0, 162, 0, 0 },
+ { 1, 1, 1 }, { 0, 0, 0 }, { 1, 1, 1 },
+ { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 } }
+};
+
+static const LoLCharacterProvider kLoLCharacterDefsDOSCDEnglishProvider = { ARRAYSIZE(kLoLCharacterDefsDOSCDEnglish), kLoLCharacterDefsDOSCDEnglish };
+
diff --git a/devtools/create_kyradat/resources/lol_dos_cd_french.h b/devtools/create_kyradat/resources/lol_dos_cd_french.h
new file mode 100644
index 0000000000..ea91647eb9
--- /dev/null
+++ b/devtools/create_kyradat/resources/lol_dos_cd_french.h
@@ -0,0 +1,68 @@
+static const LoLCharacter kLoLCharacterDefsDOSCDFrench[9] = {
+ { 0x0001, "Michael", 0, -1, 0, 0, 17,
+ { 0, 0, 0, 0, 0, 0, 0, 0 },
+ { 256, 256, 256, 256, 256, 256, 256, 256 },
+ 0, 20, 20, 6, 6, 0, 0, 0, 384, 320, 5, 2, 0,
+ { 44, 0, 0, 0, 0, 138, 0, 0, 162, 0, 0 },
+ { 1, 1, 1 }, { 0, 0, 0 }, { 1, 1, 1 },
+ { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 } },
+ { 0x0001, "Timothy", 0, 2, 0, 0, 22,
+ { 0, 0, 0, 0, 0, 0, 0, 0 },
+ { 256, 256, 256, 256, 256, 256, 256, 256 },
+ 0, 27, 27, 5, 5, 0, 0, 0, 256, 256, 0, 0, 0,
+ { 93, 131, 0, 0, 0, 153, 0, 0, 162, 0, 0 },
+ { 3, 2, 1 }, { 0, 0, 0 }, { 2500, 1000, 250 },
+ { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 } },
+ { 0x0001, "Baccata", 3, 3, 0, 0, 23,
+ { 0, 0, 0, 0, 0, 0, 0, 0 },
+ { 256, 256, 256, 256, 256, 256, 256, 256 },
+ 0, 22, 22, 18, 18, 0, 0, 0, 256, 256, 0, 0, 0,
+ { 108, 149, 0, 0, 145, 153, 0, 0, 129, 0, 0 },
+ { 1, 1, 3 }, { 0, 0, 0 }, { 1, 1, 4000 },
+ { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 } },
+ { 0x0001, "Lora", 1, 4, 0, 0, 24,
+ { 0, 0, 0, 0, 0, 0, 0, 0 },
+ { 256, 256, 256, 256, 256, 256, 256, 256 },
+ 0, 25, 48, 5, 5, 0, 0, 0, 256, 256, 0, 0, 0,
+ { 0, 0, 0, 0, 0, 137, 0, 0, 162, 0, 0 },
+ { 1, 4, 1 }, { 0, 0, 0 }, { 1, 15001, 1 },
+ { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 } },
+ { 0x0001, "Conrad", 0, -5, 0, 0, 26,
+ { 0, 0, 0, 0, 0, 0, 0, 0 },
+ { 256, 256, 256, 256, 256, 256, 256, 256 },
+ 0, 23, 23, 10, 10, 0, 0, 0, 366, 358, 2, 3, 0,
+ { 44, 0, 0, 0, 0, 138, 0, 0, 162, 0, 0 },
+ { 1, 1, 1 }, { 0, 0, 0 }, { 1, 1, 1 },
+ { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 } },
+ { 0x0001, "Paulson", 0, 6, 0, 0, 25,
+ { 0, 0, 0, 0, 0, 0, 0, 0 },
+ { 256, 256, 256, 256, 256, 256, 256, 256 },
+ 0, 105, 105, 45, 45, 0, 0, 0, 256, 256, 0, 0, 0,
+ { 0, 0, 0, 0, 0, 138, 0, 0, 129, 0, 0 },
+ { 5, 2, 3 }, { 0, 0, 0 }, { 40000, 501, 3500 },
+ { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 } },
+ { 0x0001, "Dawn", 1, 7, 0, 0, 24,
+ { 0, 0, 0, 0, 0, 0, 0, 0 },
+ { 256, 256, 256, 256, 256, 256, 256, 256 },
+ 0, 50, 50, 80, 80, 0, 0, 0, 256, 256, 0, 0, 0,
+ { 0, 0, 0, 0, 0, 138, 0, 0, 129, 0, 0 },
+ { 1, 2, 10 }, { 1, 254, 177 }, { 1, 501, 1 },
+ { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 } },
+ { 0x0001, "Kieran", 2, -8, 0, 0, 21,
+ { 0, 0, 0, 0, 0, 0, 0, 0 },
+ { 256, 256, 256, 256, 256, 256, 256, 256 },
+ 0, 23, 23, 8, 8, 0, 0, 0, 422, 332, 5, 1, 0,
+ { 44, 0, 0, 0, 0, 138, 0, 0, 162, 0, 0 },
+ { 1, 1, 1 }, { 0, 0, 0 }, { 1, 1, 1 },
+ { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 } },
+ { 0x0001, "Ak'shel", 4, -9, 0, 0, 20,
+ { 0, 0, 0, 0, 0, 0, 0, 0 },
+ { 256, 256, 256, 256, 256, 256, 256, 256 },
+ 0, 28, 28, 32, 32, 0, 0, 0, 320, 256, 1, 1, 0,
+ { 44, 0, 0, 0, 0, 138, 0, 0, 162, 0, 0 },
+ { 1, 1, 1 }, { 0, 0, 0 }, { 1, 1, 1 },
+ { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 } }
+};
+
+static const LoLCharacterProvider kLoLCharacterDefsDOSCDFrenchProvider = { ARRAYSIZE(kLoLCharacterDefsDOSCDFrench), kLoLCharacterDefsDOSCDFrench };
+
diff --git a/devtools/create_kyradat/resources/lol_dos_cd_german.h b/devtools/create_kyradat/resources/lol_dos_cd_german.h
new file mode 100644
index 0000000000..9682217857
--- /dev/null
+++ b/devtools/create_kyradat/resources/lol_dos_cd_german.h
@@ -0,0 +1,68 @@
+static const LoLCharacter kLoLCharacterDefsDOSCDGerman[9] = {
+ { 0x0001, "Michael", 0, -1, 0, 0, 17,
+ { 0, 0, 0, 0, 0, 0, 0, 0 },
+ { 256, 256, 256, 256, 256, 256, 256, 256 },
+ 0, 20, 20, 6, 6, 0, 0, 0, 384, 320, 5, 2, 0,
+ { 44, 0, 0, 0, 0, 138, 0, 0, 162, 0, 0 },
+ { 1, 1, 1 }, { 0, 0, 0 }, { 1, 1, 1 },
+ { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 } },
+ { 0x0001, "Timothy", 0, 2, 0, 0, 22,
+ { 0, 0, 0, 0, 0, 0, 0, 0 },
+ { 256, 256, 256, 256, 256, 256, 256, 256 },
+ 0, 27, 27, 5, 5, 0, 0, 0, 256, 256, 0, 0, 0,
+ { 93, 131, 0, 0, 0, 153, 0, 0, 162, 0, 0 },
+ { 3, 2, 1 }, { 0, 0, 0 }, { 2500, 1000, 250 },
+ { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 } },
+ { 0x0001, "Baccata", 3, 3, 0, 0, 23,
+ { 0, 0, 0, 0, 0, 0, 0, 0 },
+ { 256, 256, 256, 256, 256, 256, 256, 256 },
+ 0, 22, 22, 18, 18, 0, 0, 0, 256, 256, 0, 0, 0,
+ { 108, 149, 0, 0, 145, 153, 0, 0, 129, 0, 0 },
+ { 1, 1, 3 }, { 0, 0, 0 }, { 1, 1, 4000 },
+ { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 } },
+ { 0x0001, "Lora", 1, 4, 0, 0, 24,
+ { 0, 0, 0, 0, 0, 0, 0, 0 },
+ { 256, 256, 256, 256, 256, 256, 256, 256 },
+ 0, 25, 48, 5, 5, 0, 0, 0, 256, 256, 0, 0, 0,
+ { 0, 0, 0, 0, 0, 137, 0, 0, 162, 0, 0 },
+ { 1, 4, 1 }, { 0, 0, 0 }, { 1, 15001, 1 },
+ { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 } },
+ { 0x0001, "Conrad", 0, -5, 0, 0, 26,
+ { 0, 0, 0, 0, 0, 0, 0, 0 },
+ { 256, 256, 256, 256, 256, 256, 256, 256 },
+ 0, 23, 23, 10, 10, 0, 0, 0, 366, 358, 2, 3, 0,
+ { 44, 0, 0, 0, 0, 138, 0, 0, 162, 0, 0 },
+ { 1, 1, 1 }, { 0, 0, 0 }, { 1, 1, 1 },
+ { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 } },
+ { 0x0001, "Paulson", 0, 6, 0, 0, 25,
+ { 0, 0, 0, 0, 0, 0, 0, 0 },
+ { 256, 256, 256, 256, 256, 256, 256, 256 },
+ 0, 105, 105, 45, 45, 0, 0, 0, 256, 256, 0, 0, 0,
+ { 0, 0, 0, 0, 0, 138, 0, 0, 129, 0, 0 },
+ { 5, 2, 3 }, { 0, 0, 0 }, { 40000, 501, 3500 },
+ { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 } },
+ { 0x0001, "Dawn", 1, 7, 0, 0, 24,
+ { 0, 0, 0, 0, 0, 0, 0, 0 },
+ { 256, 256, 256, 256, 256, 256, 256, 256 },
+ 0, 50, 50, 80, 80, 0, 0, 0, 256, 256, 0, 0, 0,
+ { 0, 0, 0, 0, 0, 138, 0, 0, 129, 0, 0 },
+ { 1, 2, 10 }, { 1, 254, 177 }, { 1, 501, 1 },
+ { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 } },
+ { 0x0001, "Kieran", 2, -8, 0, 0, 21,
+ { 0, 0, 0, 0, 0, 0, 0, 0 },
+ { 256, 256, 256, 256, 256, 256, 256, 256 },
+ 0, 23, 23, 8, 8, 0, 0, 0, 422, 332, 5, 1, 0,
+ { 44, 0, 0, 0, 0, 138, 0, 0, 162, 0, 0 },
+ { 1, 1, 1 }, { 0, 0, 0 }, { 1, 1, 1 },
+ { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 } },
+ { 0x0001, "Ak'shel", 4, -9, 0, 0, 20,
+ { 0, 0, 0, 0, 0, 0, 0, 0 },
+ { 256, 256, 256, 256, 256, 256, 256, 256 },
+ 0, 28, 28, 32, 32, 0, 0, 0, 320, 256, 1, 1, 0,
+ { 44, 0, 0, 0, 0, 138, 0, 0, 162, 0, 0 },
+ { 1, 1, 1 }, { 0, 0, 0 }, { 1, 1, 1 },
+ { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 } }
+};
+
+static const LoLCharacterProvider kLoLCharacterDefsDOSCDGermanProvider = { ARRAYSIZE(kLoLCharacterDefsDOSCDGerman), kLoLCharacterDefsDOSCDGerman };
+
diff --git a/devtools/create_kyradat/resources/lol_dos_cd_italian.h b/devtools/create_kyradat/resources/lol_dos_cd_italian.h
new file mode 100644
index 0000000000..4a9734e40b
--- /dev/null
+++ b/devtools/create_kyradat/resources/lol_dos_cd_italian.h
@@ -0,0 +1,68 @@
+static const LoLCharacter kLoLCharacterDefsDOSCDItalian[9] = {
+ { 0x0001, "Michael", 0, -1, 0, 0, 17,
+ { 0, 0, 0, 0, 0, 0, 0, 0 },
+ { 256, 256, 256, 256, 256, 256, 256, 256 },
+ 0, 20, 20, 6, 6, 0, 0, 0, 384, 320, 5, 2, 0,
+ { 44, 0, 0, 0, 0, 138, 0, 0, 162, 0, 0 },
+ { 1, 1, 1 }, { 0, 0, 0 }, { 1, 1, 1 },
+ { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 } },
+ { 0x0001, "Timothy", 0, 2, 0, 0, 22,
+ { 0, 0, 0, 0, 0, 0, 0, 0 },
+ { 256, 256, 256, 256, 256, 256, 256, 256 },
+ 0, 27, 27, 5, 5, 0, 0, 0, 256, 256, 0, 0, 0,
+ { 93, 131, 0, 0, 0, 153, 0, 0, 162, 0, 0 },
+ { 3, 2, 1 }, { 0, 0, 0 }, { 2500, 1000, 250 },
+ { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 } },
+ { 0x0001, "Baccata", 3, 3, 0, 0, 23,
+ { 0, 0, 0, 0, 0, 0, 0, 0 },
+ { 256, 256, 256, 256, 256, 256, 256, 256 },
+ 0, 22, 22, 18, 18, 0, 0, 0, 256, 256, 0, 0, 0,
+ { 108, 149, 0, 0, 145, 153, 0, 0, 129, 0, 0 },
+ { 1, 1, 3 }, { 0, 0, 0 }, { 1, 1, 4000 },
+ { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 } },
+ { 0x0001, "Lora", 1, 4, 0, 0, 24,
+ { 0, 0, 0, 0, 0, 0, 0, 0 },
+ { 256, 256, 256, 256, 256, 256, 256, 256 },
+ 0, 25, 48, 5, 5, 0, 0, 0, 256, 256, 0, 0, 0,
+ { 0, 0, 0, 0, 0, 137, 0, 0, 162, 0, 0 },
+ { 1, 4, 1 }, { 0, 0, 0 }, { 1, 15001, 1 },
+ { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 } },
+ { 0x0001, "Conrad", 0, -5, 0, 0, 26,
+ { 0, 0, 0, 0, 0, 0, 0, 0 },
+ { 256, 256, 256, 256, 256, 256, 256, 256 },
+ 0, 23, 23, 10, 10, 0, 0, 0, 366, 358, 2, 3, 0,
+ { 44, 0, 0, 0, 0, 138, 0, 0, 162, 0, 0 },
+ { 1, 1, 1 }, { 0, 0, 0 }, { 1, 1, 1 },
+ { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 } },
+ { 0x0001, "Paulson", 0, 6, 0, 0, 25,
+ { 0, 0, 0, 0, 0, 0, 0, 0 },
+ { 256, 256, 256, 256, 256, 256, 256, 256 },
+ 0, 105, 105, 45, 45, 0, 0, 0, 256, 256, 0, 0, 0,
+ { 0, 0, 0, 0, 0, 138, 0, 0, 129, 0, 0 },
+ { 5, 2, 3 }, { 0, 0, 0 }, { 40000, 501, 3500 },
+ { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 } },
+ { 0x0001, "Dawn", 1, 7, 0, 0, 24,
+ { 0, 0, 0, 0, 0, 0, 0, 0 },
+ { 256, 256, 256, 256, 256, 256, 256, 256 },
+ 0, 50, 50, 80, 80, 0, 0, 0, 256, 256, 0, 0, 0,
+ { 0, 0, 0, 0, 0, 138, 0, 0, 129, 0, 0 },
+ { 1, 2, 10 }, { 1, 254, 177 }, { 1, 501, 1 },
+ { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 } },
+ { 0x0001, "Kieran", 2, -8, 0, 0, 21,
+ { 0, 0, 0, 0, 0, 0, 0, 0 },
+ { 256, 256, 256, 256, 256, 256, 256, 256 },
+ 0, 23, 23, 8, 8, 0, 0, 0, 422, 332, 5, 1, 0,
+ { 44, 0, 0, 0, 0, 138, 0, 0, 162, 0, 0 },
+ { 1, 1, 1 }, { 0, 0, 0 }, { 1, 1, 1 },
+ { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 } },
+ { 0x0001, "Ak'shel", 4, -9, 0, 0, 20,
+ { 0, 0, 0, 0, 0, 0, 0, 0 },
+ { 256, 256, 256, 256, 256, 256, 256, 256 },
+ 0, 28, 28, 32, 32, 0, 0, 0, 320, 256, 1, 1, 0,
+ { 44, 0, 0, 0, 0, 138, 0, 0, 162, 0, 0 },
+ { 1, 1, 1 }, { 0, 0, 0 }, { 1, 1, 1 },
+ { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 } }
+};
+
+static const LoLCharacterProvider kLoLCharacterDefsDOSCDItalianProvider = { ARRAYSIZE(kLoLCharacterDefsDOSCDItalian), kLoLCharacterDefsDOSCDItalian };
+
diff --git a/devtools/create_kyradat/resources/lol_dos_cd_russian.h b/devtools/create_kyradat/resources/lol_dos_cd_russian.h
new file mode 100644
index 0000000000..37ab84eacf
--- /dev/null
+++ b/devtools/create_kyradat/resources/lol_dos_cd_russian.h
@@ -0,0 +1,68 @@
+static const LoLCharacter kLoLCharacterDefsDOSCDRussian[9] = {
+ { 0x0001, "Michael", 0, -1, 0, 0, 17,
+ { 0, 0, 0, 0, 0, 0, 0, 0 },
+ { 256, 256, 256, 256, 256, 256, 256, 256 },
+ 0, 20, 20, 6, 6, 0, 0, 0, 384, 320, 5, 2, 0,
+ { 44, 0, 0, 0, 0, 138, 0, 0, 162, 0, 0 },
+ { 1, 1, 1 }, { 0, 0, 0 }, { 1, 1, 1 },
+ { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 } },
+ { 0x0001, "Timothy", 0, 2, 0, 0, 22,
+ { 0, 0, 0, 0, 0, 0, 0, 0 },
+ { 256, 256, 256, 256, 256, 256, 256, 256 },
+ 0, 27, 27, 5, 5, 0, 0, 0, 256, 256, 0, 0, 0,
+ { 93, 131, 0, 0, 0, 153, 0, 0, 162, 0, 0 },
+ { 3, 2, 1 }, { 0, 0, 0 }, { 2500, 1000, 250 },
+ { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 } },
+ { 0x0001, "Baccata", 3, 3, 0, 0, 23,
+ { 0, 0, 0, 0, 0, 0, 0, 0 },
+ { 256, 256, 256, 256, 256, 256, 256, 256 },
+ 0, 22, 22, 18, 18, 0, 0, 0, 256, 256, 0, 0, 0,
+ { 108, 149, 0, 0, 145, 153, 0, 0, 129, 0, 0 },
+ { 1, 1, 3 }, { 0, 0, 0 }, { 1, 1, 4000 },
+ { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 } },
+ { 0x0001, "Lora", 1, 4, 0, 0, 24,
+ { 0, 0, 0, 0, 0, 0, 0, 0 },
+ { 256, 256, 256, 256, 256, 256, 256, 256 },
+ 0, 25, 48, 5, 5, 0, 0, 0, 256, 256, 0, 0, 0,
+ { 0, 0, 0, 0, 0, 137, 0, 0, 162, 0, 0 },
+ { 1, 4, 1 }, { 0, 0, 0 }, { 1, 15001, 1 },
+ { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 } },
+ { 0x0001, "Conrad", 0, -5, 0, 0, 26,
+ { 0, 0, 0, 0, 0, 0, 0, 0 },
+ { 256, 256, 256, 256, 256, 256, 256, 256 },
+ 0, 23, 23, 10, 10, 0, 0, 0, 366, 358, 2, 3, 0,
+ { 44, 0, 0, 0, 0, 138, 0, 0, 162, 0, 0 },
+ { 1, 1, 1 }, { 0, 0, 0 }, { 1, 1, 1 },
+ { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 } },
+ { 0x0001, "Paulson", 0, 6, 0, 0, 25,
+ { 0, 0, 0, 0, 0, 0, 0, 0 },
+ { 256, 256, 256, 256, 256, 256, 256, 256 },
+ 0, 105, 105, 45, 45, 0, 0, 0, 256, 256, 0, 0, 0,
+ { 0, 0, 0, 0, 0, 138, 0, 0, 129, 0, 0 },
+ { 5, 2, 3 }, { 0, 0, 0 }, { 40000, 501, 3500 },
+ { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 } },
+ { 0x0001, "Dawn", 1, 7, 0, 0, 24,
+ { 0, 0, 0, 0, 0, 0, 0, 0 },
+ { 256, 256, 256, 256, 256, 256, 256, 256 },
+ 0, 50, 50, 80, 80, 0, 0, 0, 256, 256, 0, 0, 0,
+ { 0, 0, 0, 0, 0, 138, 0, 0, 129, 0, 0 },
+ { 1, 2, 10 }, { 1, 254, 177 }, { 1, 501, 1 },
+ { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 } },
+ { 0x0001, "Kieran", 2, -8, 0, 0, 21,
+ { 0, 0, 0, 0, 0, 0, 0, 0 },
+ { 256, 256, 256, 256, 256, 256, 256, 256 },
+ 0, 23, 23, 8, 8, 0, 0, 0, 422, 332, 5, 1, 0,
+ { 44, 0, 0, 0, 0, 138, 0, 0, 162, 0, 0 },
+ { 1, 1, 1 }, { 0, 0, 0 }, { 1, 1, 1 },
+ { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 } },
+ { 0x0001, "Ak'shel", 4, -9, 0, 0, 20,
+ { 0, 0, 0, 0, 0, 0, 0, 0 },
+ { 256, 256, 256, 256, 256, 256, 256, 256 },
+ 0, 28, 28, 32, 32, 0, 0, 0, 320, 256, 1, 1, 0,
+ { 44, 0, 0, 0, 0, 138, 0, 0, 162, 0, 0 },
+ { 1, 1, 1 }, { 0, 0, 0 }, { 1, 1, 1 },
+ { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 } }
+};
+
+static const LoLCharacterProvider kLoLCharacterDefsDOSCDRussianProvider = { ARRAYSIZE(kLoLCharacterDefsDOSCDRussian), kLoLCharacterDefsDOSCDRussian };
+
diff --git a/devtools/create_kyradat/resources/lol_dos_demo.h b/devtools/create_kyradat/resources/lol_dos_demo.h
new file mode 100644
index 0000000000..7c5a08fbc9
--- /dev/null
+++ b/devtools/create_kyradat/resources/lol_dos_demo.h
@@ -0,0 +1,54 @@
+static const char *const kLoLSeqplayPakFilesDOSDemo[1] = {
+ "GENERAL.PAK"
+};
+
+static const StringListProvider kLoLSeqplayPakFilesDOSDemoProvider = { ARRAYSIZE(kLoLSeqplayPakFilesDOSDemo), kLoLSeqplayPakFilesDOSDemo };
+
+static const HoFSequence kLoLSeqplaySeqDataDOSDemoSeq[11] = {
+ { 0x0002, "", "scene1.cps", 3, 1, 0xFFFF, 0xFFFF, 0x0000, 0x0001, 0x00C8, 0, 0, 0x003C },
+ { 0x0004, "", "", 3, 0, 0x0000, 0x0001, 0x0000, 0x0001, 0x00C8, 0, 0, 0x0000 },
+ { 0x0003, "scene2.wsa", "scene2.cps", 4, 0, 0xFFFF, 0xFFFF, 0x0000, 0x0053, 0x0003, 0, 0, 0x001E },
+ { 0x0004, "", "", 4, 0, 0x0002, 0x0003, 0x0000, 0x0001, 0x00C8, 0, 0, 0x0000 },
+ { 0x0003, "scene3.wsa", "scene3.cps", 5, 0, 0xFFFF, 0xFFFF, 0x0000, 0x006B, 0x0005, 0, 0, 0x001E },
+ { 0x0004, "", "", 4, 0, 0x0004, 0x0005, 0x0000, 0x0001, 0x00C8, 0, 0, 0x0000 },
+ { 0x0003, "scene4.wsa", "scene4.cps", 4, 0, 0xFFFF, 0xFFFF, 0x0000, 0x0044, 0x000A, 0, 0, 0x0028 },
+ { 0x0004, "", "", 4, 0, 0x0006, 0x0007, 0x0000, 0x0001, 0x00C8, 0, 0, 0x0000 },
+ { 0x0003, "scene5.wsa", "scene5.cps", 4, 1, 0xFFFF, 0xFFFF, 0x0000, 0x0031, 0x0008, 0, 0, 0x000A },
+ { 0x0004, "", "", 3, 1, 0x0008, 0x0009, 0x0000, 0x0001, 0x00C8, 0, 0, 0x0000 },
+ { 0x0002, "", "scene1.cps", 3, 1, 0xFFFF, 0xFFFF, 0x0000, 0x0001, 0x0014, 0, 0, 0x012C }
+};
+
+
+static const HoFSequenceProvider kLoLSeqplaySeqDataDOSDemoProvider = { ARRAYSIZE(kLoLSeqplaySeqDataDOSDemoSeq), kLoLSeqplaySeqDataDOSDemoSeq, 0, NULL };
+
+static const char *const kLoLSeqplaySfxFilesDOSDemo[18] = {
+ "tclap1",
+ "tclap2",
+ "beeorc2",
+ "tclap4",
+ "tclap5",
+ "scotia9",
+ "bolt",
+ "bolt2",
+ "wokout1",
+ "cdamage1",
+ "wokmisc1",
+ "mwhoa1",
+ "mstdoom2",
+ "loragasp",
+ "ratwok",
+ "swing1",
+ "bludyell",
+ ""
+};
+
+static const StringListProvider kLoLSeqplaySfxFilesDOSDemoProvider = { ARRAYSIZE(kLoLSeqplaySfxFilesDOSDemo), kLoLSeqplaySfxFilesDOSDemo };
+
+static const char *const kLoLSeqplayIntroTracksDOSDemo[3] = {
+ "loredemo",
+ "loredemo",
+ ""
+};
+
+static const StringListProvider kLoLSeqplayIntroTracksDOSDemoProvider = { ARRAYSIZE(kLoLSeqplayIntroTracksDOSDemo), kLoLSeqplayIntroTracksDOSDemo };
+
diff --git a/devtools/create_kyradat/resources/lol_dos_demo_english.h b/devtools/create_kyradat/resources/lol_dos_demo_english.h
new file mode 100644
index 0000000000..df80fd10e2
--- /dev/null
+++ b/devtools/create_kyradat/resources/lol_dos_demo_english.h
@@ -0,0 +1,15 @@
+static const char *const kLoLSeqplayStringsDOSDemoEnglish[10] = {
+ "The Lands have become perilous",
+ "to travellers",
+ "King Richard holds the strength",
+ "to defeat Sorceress Scotia!",
+ "You have the ability to restore",
+ "hope to the People",
+ "Cruel and hideous monsters",
+ "will hinder your quest...",
+ "Will you accept the challenge ?",
+ "Scotia awaits..."
+};
+
+static const StringListProvider kLoLSeqplayStringsDOSDemoEnglishProvider = { ARRAYSIZE(kLoLSeqplayStringsDOSDemoEnglish), kLoLSeqplayStringsDOSDemoEnglish };
+
diff --git a/devtools/create_kyradat/resources/lol_dos_english.h b/devtools/create_kyradat/resources/lol_dos_english.h
new file mode 100644
index 0000000000..f6b579545b
--- /dev/null
+++ b/devtools/create_kyradat/resources/lol_dos_english.h
@@ -0,0 +1,68 @@
+static const LoLCharacter kLoLCharacterDefsDOSEnglish[9] = {
+ { 0x0001, "Michael", 0, -1, 0, 0, 17,
+ { 0, 0, 0, 0, 0, 0, 0, 0 },
+ { 256, 256, 256, 256, 256, 256, 256, 256 },
+ 0, 20, 20, 6, 6, 0, 0, 0, 384, 320, 5, 2, 0,
+ { 44, 0, 0, 0, 0, 138, 0, 0, 162, 0, 0 },
+ { 1, 1, 1 }, { 0, 0, 0 }, { 1, 1, 1 },
+ { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 } },
+ { 0x0001, "Timothy", 0, 2, 0, 0, 22,
+ { 0, 0, 0, 0, 0, 0, 0, 0 },
+ { 256, 256, 256, 256, 256, 256, 256, 256 },
+ 0, 27, 27, 5, 5, 0, 0, 0, 256, 256, 0, 0, 0,
+ { 93, 131, 0, 0, 0, 153, 0, 0, 162, 0, 0 },
+ { 3, 2, 1 }, { 0, 0, 0 }, { 2500, 1000, 250 },
+ { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 } },
+ { 0x0001, "Baccata", 3, 3, 0, 0, 23,
+ { 0, 0, 0, 0, 0, 0, 0, 0 },
+ { 256, 256, 256, 256, 256, 256, 256, 256 },
+ 0, 22, 22, 18, 18, 0, 0, 0, 256, 256, 0, 0, 0,
+ { 108, 149, 0, 0, 145, 153, 0, 0, 129, 0, 0 },
+ { 1, 1, 3 }, { 0, 0, 0 }, { 1, 1, 4000 },
+ { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 } },
+ { 0x0001, "Lora", 1, 4, 0, 0, 24,
+ { 0, 0, 0, 0, 0, 0, 0, 0 },
+ { 256, 256, 256, 256, 256, 256, 256, 256 },
+ 0, 25, 48, 5, 5, 0, 0, 0, 256, 256, 0, 0, 0,
+ { 0, 0, 0, 0, 0, 137, 0, 0, 162, 0, 0 },
+ { 1, 4, 1 }, { 0, 0, 0 }, { 1, 15001, 1 },
+ { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 } },
+ { 0x0001, "Conrad", 0, -5, 0, 0, 26,
+ { 0, 0, 0, 0, 0, 0, 0, 0 },
+ { 256, 256, 256, 256, 256, 256, 256, 256 },
+ 0, 23, 23, 10, 10, 0, 0, 0, 366, 358, 2, 3, 0,
+ { 44, 0, 0, 0, 0, 138, 0, 0, 162, 0, 0 },
+ { 1, 1, 1 }, { 0, 0, 0 }, { 1, 1, 1 },
+ { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 } },
+ { 0x0001, "Paulson", 0, 6, 0, 0, 25,
+ { 0, 0, 0, 0, 0, 0, 0, 0 },
+ { 256, 256, 256, 256, 256, 256, 256, 256 },
+ 0, 105, 105, 45, 45, 0, 0, 0, 256, 256, 0, 0, 0,
+ { 0, 0, 0, 0, 0, 138, 0, 0, 129, 0, 0 },
+ { 5, 2, 3 }, { 0, 0, 0 }, { 40000, 501, 3500 },
+ { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 } },
+ { 0x0001, "Dawn", 1, 7, 0, 0, 24,
+ { 0, 0, 0, 0, 0, 0, 0, 0 },
+ { 256, 256, 256, 256, 256, 256, 256, 256 },
+ 0, 50, 50, 80, 80, 0, 0, 0, 256, 256, 0, 0, 0,
+ { 0, 0, 0, 0, 0, 138, 0, 0, 129, 0, 0 },
+ { 1, 2, 10 }, { 1, 254, 177 }, { 1, 501, 1 },
+ { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 } },
+ { 0x0001, "Kieran", 2, -8, 0, 0, 21,
+ { 0, 0, 0, 0, 0, 0, 0, 0 },
+ { 256, 256, 256, 256, 256, 256, 256, 256 },
+ 0, 23, 23, 8, 8, 0, 0, 0, 422, 332, 5, 1, 0,
+ { 44, 0, 0, 0, 0, 138, 0, 0, 162, 0, 0 },
+ { 1, 1, 1 }, { 0, 0, 0 }, { 1, 1, 1 },
+ { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 } },
+ { 0x0001, "Ak'shel", 4, -9, 0, 0, 20,
+ { 0, 0, 0, 0, 0, 0, 0, 0 },
+ { 256, 256, 256, 256, 256, 256, 256, 256 },
+ 0, 28, 28, 32, 32, 0, 0, 0, 320, 256, 1, 1, 0,
+ { 44, 0, 0, 0, 0, 138, 0, 0, 162, 0, 0 },
+ { 1, 1, 1 }, { 0, 0, 0 }, { 1, 1, 1 },
+ { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 } }
+};
+
+static const LoLCharacterProvider kLoLCharacterDefsDOSEnglishProvider = { ARRAYSIZE(kLoLCharacterDefsDOSEnglish), kLoLCharacterDefsDOSEnglish };
+
diff --git a/devtools/create_kyradat/resources/lol_dos_french.h b/devtools/create_kyradat/resources/lol_dos_french.h
new file mode 100644
index 0000000000..2e9180655a
--- /dev/null
+++ b/devtools/create_kyradat/resources/lol_dos_french.h
@@ -0,0 +1,68 @@
+static const LoLCharacter kLoLCharacterDefsDOSFrench[9] = {
+ { 0x0001, "Michael", 0, -1, 0, 0, 17,
+ { 0, 0, 0, 0, 0, 0, 0, 0 },
+ { 256, 256, 256, 256, 256, 256, 256, 256 },
+ 0, 20, 20, 6, 6, 0, 0, 0, 384, 320, 5, 2, 0,
+ { 44, 0, 0, 0, 0, 138, 0, 0, 162, 0, 0 },
+ { 1, 1, 1 }, { 0, 0, 0 }, { 1, 1, 1 },
+ { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 } },
+ { 0x0001, "Timothy", 0, 2, 0, 0, 22,
+ { 0, 0, 0, 0, 0, 0, 0, 0 },
+ { 256, 256, 256, 256, 256, 256, 256, 256 },
+ 0, 27, 27, 5, 5, 0, 0, 0, 256, 256, 0, 0, 0,
+ { 93, 131, 0, 0, 0, 153, 0, 0, 162, 0, 0 },
+ { 3, 2, 1 }, { 0, 0, 0 }, { 2500, 1000, 250 },
+ { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 } },
+ { 0x0001, "Baccata", 3, 3, 0, 0, 23,
+ { 0, 0, 0, 0, 0, 0, 0, 0 },
+ { 256, 256, 256, 256, 256, 256, 256, 256 },
+ 0, 22, 22, 18, 18, 0, 0, 0, 256, 256, 0, 0, 0,
+ { 108, 149, 0, 0, 145, 153, 0, 0, 129, 0, 0 },
+ { 1, 1, 3 }, { 0, 0, 0 }, { 1, 1, 4000 },
+ { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 } },
+ { 0x0001, "Lora", 1, 4, 0, 0, 24,
+ { 0, 0, 0, 0, 0, 0, 0, 0 },
+ { 256, 256, 256, 256, 256, 256, 256, 256 },
+ 0, 25, 48, 5, 5, 0, 0, 0, 256, 256, 0, 0, 0,
+ { 0, 0, 0, 0, 0, 137, 0, 0, 162, 0, 0 },
+ { 1, 4, 1 }, { 0, 0, 0 }, { 1, 15001, 1 },
+ { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 } },
+ { 0x0001, "Conrad", 0, -5, 0, 0, 26,
+ { 0, 0, 0, 0, 0, 0, 0, 0 },
+ { 256, 256, 256, 256, 256, 256, 256, 256 },
+ 0, 23, 23, 10, 10, 0, 0, 0, 366, 358, 2, 3, 0,
+ { 44, 0, 0, 0, 0, 138, 0, 0, 162, 0, 0 },
+ { 1, 1, 1 }, { 0, 0, 0 }, { 1, 1, 1 },
+ { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 } },
+ { 0x0001, "Paulson", 0, 6, 0, 0, 25,
+ { 0, 0, 0, 0, 0, 0, 0, 0 },
+ { 256, 256, 256, 256, 256, 256, 256, 256 },
+ 0, 105, 105, 45, 45, 0, 0, 0, 256, 256, 0, 0, 0,
+ { 0, 0, 0, 0, 0, 138, 0, 0, 129, 0, 0 },
+ { 5, 2, 3 }, { 0, 0, 0 }, { 40000, 501, 3500 },
+ { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 } },
+ { 0x0001, "Dawn", 1, 7, 0, 0, 24,
+ { 0, 0, 0, 0, 0, 0, 0, 0 },
+ { 256, 256, 256, 256, 256, 256, 256, 256 },
+ 0, 50, 50, 80, 80, 0, 0, 0, 256, 256, 0, 0, 0,
+ { 0, 0, 0, 0, 0, 138, 0, 0, 129, 0, 0 },
+ { 1, 2, 10 }, { 1, 254, 177 }, { 1, 501, 1 },
+ { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 } },
+ { 0x0001, "Kieran", 2, -8, 0, 0, 21,
+ { 0, 0, 0, 0, 0, 0, 0, 0 },
+ { 256, 256, 256, 256, 256, 256, 256, 256 },
+ 0, 23, 23, 8, 8, 0, 0, 0, 422, 332, 5, 1, 0,
+ { 44, 0, 0, 0, 0, 138, 0, 0, 162, 0, 0 },
+ { 1, 1, 1 }, { 0, 0, 0 }, { 1, 1, 1 },
+ { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 } },
+ { 0x0001, "Ak'shel", 4, -9, 0, 0, 20,
+ { 0, 0, 0, 0, 0, 0, 0, 0 },
+ { 256, 256, 256, 256, 256, 256, 256, 256 },
+ 0, 28, 28, 32, 32, 0, 0, 0, 320, 256, 1, 1, 0,
+ { 44, 0, 0, 0, 0, 138, 0, 0, 162, 0, 0 },
+ { 1, 1, 1 }, { 0, 0, 0 }, { 1, 1, 1 },
+ { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 } }
+};
+
+static const LoLCharacterProvider kLoLCharacterDefsDOSFrenchProvider = { ARRAYSIZE(kLoLCharacterDefsDOSFrench), kLoLCharacterDefsDOSFrench };
+
diff --git a/devtools/create_kyradat/resources/lol_dos_german.h b/devtools/create_kyradat/resources/lol_dos_german.h
new file mode 100644
index 0000000000..886f180d1d
--- /dev/null
+++ b/devtools/create_kyradat/resources/lol_dos_german.h
@@ -0,0 +1,68 @@
+static const LoLCharacter kLoLCharacterDefsDOSGerman[9] = {
+ { 0x0001, "Michael", 0, -1, 0, 0, 17,
+ { 0, 0, 0, 0, 0, 0, 0, 0 },
+ { 256, 256, 256, 256, 256, 256, 256, 256 },
+ 0, 20, 20, 6, 6, 0, 0, 0, 384, 320, 5, 2, 0,
+ { 44, 0, 0, 0, 0, 138, 0, 0, 162, 0, 0 },
+ { 1, 1, 1 }, { 0, 0, 0 }, { 1, 1, 1 },
+ { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 } },
+ { 0x0001, "Timothy", 0, 2, 0, 0, 22,
+ { 0, 0, 0, 0, 0, 0, 0, 0 },
+ { 256, 256, 256, 256, 256, 256, 256, 256 },
+ 0, 27, 27, 5, 5, 0, 0, 0, 256, 256, 0, 0, 0,
+ { 93, 131, 0, 0, 0, 153, 0, 0, 162, 0, 0 },
+ { 3, 2, 1 }, { 0, 0, 0 }, { 2500, 1000, 250 },
+ { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 } },
+ { 0x0001, "Baccata", 3, 3, 0, 0, 23,
+ { 0, 0, 0, 0, 0, 0, 0, 0 },
+ { 256, 256, 256, 256, 256, 256, 256, 256 },
+ 0, 22, 22, 18, 18, 0, 0, 0, 256, 256, 0, 0, 0,
+ { 108, 149, 0, 0, 145, 153, 0, 0, 129, 0, 0 },
+ { 1, 1, 3 }, { 0, 0, 0 }, { 1, 1, 4000 },
+ { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 } },
+ { 0x0001, "Lora", 1, 4, 0, 0, 24,
+ { 0, 0, 0, 0, 0, 0, 0, 0 },
+ { 256, 256, 256, 256, 256, 256, 256, 256 },
+ 0, 25, 48, 5, 5, 0, 0, 0, 256, 256, 0, 0, 0,
+ { 0, 0, 0, 0, 0, 137, 0, 0, 162, 0, 0 },
+ { 1, 4, 1 }, { 0, 0, 0 }, { 1, 15001, 1 },
+ { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 } },
+ { 0x0001, "Conrad", 0, -5, 0, 0, 26,
+ { 0, 0, 0, 0, 0, 0, 0, 0 },
+ { 256, 256, 256, 256, 256, 256, 256, 256 },
+ 0, 23, 23, 10, 10, 0, 0, 0, 366, 358, 2, 3, 0,
+ { 44, 0, 0, 0, 0, 138, 0, 0, 162, 0, 0 },
+ { 1, 1, 1 }, { 0, 0, 0 }, { 1, 1, 1 },
+ { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 } },
+ { 0x0001, "Paulson", 0, 6, 0, 0, 25,
+ { 0, 0, 0, 0, 0, 0, 0, 0 },
+ { 256, 256, 256, 256, 256, 256, 256, 256 },
+ 0, 105, 105, 45, 45, 0, 0, 0, 256, 256, 0, 0, 0,
+ { 0, 0, 0, 0, 0, 138, 0, 0, 129, 0, 0 },
+ { 5, 2, 3 }, { 0, 0, 0 }, { 40000, 501, 3500 },
+ { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 } },
+ { 0x0001, "Dawn", 1, 7, 0, 0, 24,
+ { 0, 0, 0, 0, 0, 0, 0, 0 },
+ { 256, 256, 256, 256, 256, 256, 256, 256 },
+ 0, 50, 50, 80, 80, 0, 0, 0, 256, 256, 0, 0, 0,
+ { 0, 0, 0, 0, 0, 138, 0, 0, 129, 0, 0 },
+ { 1, 2, 10 }, { 1, 254, 177 }, { 1, 501, 1 },
+ { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 } },
+ { 0x0001, "Kieran", 2, -8, 0, 0, 21,
+ { 0, 0, 0, 0, 0, 0, 0, 0 },
+ { 256, 256, 256, 256, 256, 256, 256, 256 },
+ 0, 23, 23, 8, 8, 0, 0, 0, 422, 332, 5, 1, 0,
+ { 44, 0, 0, 0, 0, 138, 0, 0, 162, 0, 0 },
+ { 1, 1, 1 }, { 0, 0, 0 }, { 1, 1, 1 },
+ { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 } },
+ { 0x0001, "Ak'shel", 4, -9, 0, 0, 20,
+ { 0, 0, 0, 0, 0, 0, 0, 0 },
+ { 256, 256, 256, 256, 256, 256, 256, 256 },
+ 0, 28, 28, 32, 32, 0, 0, 0, 320, 256, 1, 1, 0,
+ { 44, 0, 0, 0, 0, 138, 0, 0, 162, 0, 0 },
+ { 1, 1, 1 }, { 0, 0, 0 }, { 1, 1, 1 },
+ { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 } }
+};
+
+static const LoLCharacterProvider kLoLCharacterDefsDOSGermanProvider = { ARRAYSIZE(kLoLCharacterDefsDOSGerman), kLoLCharacterDefsDOSGerman };
+
diff --git a/devtools/create_kyradat/resources/lol_dos_russian.h b/devtools/create_kyradat/resources/lol_dos_russian.h
new file mode 100644
index 0000000000..ba27180755
--- /dev/null
+++ b/devtools/create_kyradat/resources/lol_dos_russian.h
@@ -0,0 +1,68 @@
+static const LoLCharacter kLoLCharacterDefsDOSRussian[9] = {
+ { 0x0001, "\x8C\xA0\xA9\xAA\xAB", 0, -1, 0, 0, 17,
+ { 0, 0, 0, 0, 0, 0, 0, 0 },
+ { 256, 256, 256, 256, 256, 256, 256, 256 },
+ 0, 20, 20, 6, 6, 0, 0, 0, 384, 320, 5, 2, 0,
+ { 44, 0, 0, 0, 0, 138, 0, 0, 162, 0, 0 },
+ { 1, 1, 1 }, { 0, 0, 0 }, { 1, 1, 1 },
+ { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 } },
+ { 0x0001, "\x92\xA8\xAC\xAE\xE2\xA8", 0, 2, 0, 0, 22,
+ { 0, 0, 0, 0, 0, 0, 0, 0 },
+ { 256, 256, 256, 256, 256, 256, 256, 256 },
+ 0, 27, 27, 5, 5, 0, 0, 0, 256, 256, 0, 0, 0,
+ { 93, 131, 0, 0, 0, 153, 0, 0, 162, 0, 0 },
+ { 3, 2, 1 }, { 0, 0, 0 }, { 2500, 1000, 250 },
+ { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 } },
+ { 0x0001, "\x81\xA0\xAA\xAA\xA0\xE2\xA0", 3, 3, 0, 0, 23,
+ { 0, 0, 0, 0, 0, 0, 0, 0 },
+ { 256, 256, 256, 256, 256, 256, 256, 256 },
+ 0, 22, 22, 18, 18, 0, 0, 0, 256, 256, 0, 0, 0,
+ { 108, 149, 0, 0, 145, 153, 0, 0, 129, 0, 0 },
+ { 1, 1, 3 }, { 0, 0, 0 }, { 1, 1, 4000 },
+ { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 } },
+ { 0x0001, "\x8B\xAE\xE0\xA0", 1, 4, 0, 0, 24,
+ { 0, 0, 0, 0, 0, 0, 0, 0 },
+ { 256, 256, 256, 256, 256, 256, 256, 256 },
+ 0, 25, 48, 5, 5, 0, 0, 0, 256, 256, 0, 0, 0,
+ { 0, 0, 0, 0, 0, 137, 0, 0, 162, 0, 0 },
+ { 1, 4, 1 }, { 0, 0, 0 }, { 1, 15001, 1 },
+ { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 } },
+ { 0x0001, "\x8A\xAE\xAD\xE0\xA0\xA4", 0, -5, 0, 0, 26,
+ { 0, 0, 0, 0, 0, 0, 0, 0 },
+ { 256, 256, 256, 256, 256, 256, 256, 256 },
+ 0, 23, 23, 10, 10, 0, 0, 0, 366, 358, 2, 3, 0,
+ { 44, 0, 0, 0, 0, 138, 0, 0, 162, 0, 0 },
+ { 1, 1, 1 }, { 0, 0, 0 }, { 1, 1, 1 },
+ { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 } },
+ { 0x0001, "\x8F\xA0\xE3\xAB\xE1\xAE\xAD", 0, 6, 0, 0, 25,
+ { 0, 0, 0, 0, 0, 0, 0, 0 },
+ { 256, 256, 256, 256, 256, 256, 256, 256 },
+ 0, 105, 105, 45, 45, 0, 0, 0, 256, 256, 0, 0, 0,
+ { 0, 0, 0, 0, 0, 138, 0, 0, 129, 0, 0 },
+ { 5, 2, 3 }, { 0, 0, 0 }, { 40000, 501, 3500 },
+ { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 } },
+ { 0x0001, "\x84\xA8\xA0\xAD\xA0", 1, 7, 0, 0, 24,
+ { 0, 0, 0, 0, 0, 0, 0, 0 },
+ { 256, 256, 256, 256, 256, 256, 256, 256 },
+ 0, 50, 50, 80, 80, 0, 0, 0, 256, 256, 0, 0, 0,
+ { 0, 0, 0, 0, 0, 138, 0, 0, 129, 0, 0 },
+ { 1, 2, 10 }, { 1, 254, 177 }, { 1, 501, 1 },
+ { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 } },
+ { 0x0001, "\x8A\xA8\xE0\xA0\xAD", 2, -8, 0, 0, 21,
+ { 0, 0, 0, 0, 0, 0, 0, 0 },
+ { 256, 256, 256, 256, 256, 256, 256, 256 },
+ 0, 23, 23, 8, 8, 0, 0, 0, 422, 332, 5, 1, 0,
+ { 44, 0, 0, 0, 0, 138, 0, 0, 162, 0, 0 },
+ { 1, 1, 1 }, { 0, 0, 0 }, { 1, 1, 1 },
+ { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 } },
+ { 0x0001, "\x80\xAA\xE8\xA5\xAB", 4, -9, 0, 0, 20,
+ { 0, 0, 0, 0, 0, 0, 0, 0 },
+ { 256, 256, 256, 256, 256, 256, 256, 256 },
+ 0, 28, 28, 32, 32, 0, 0, 0, 320, 256, 1, 1, 0,
+ { 44, 0, 0, 0, 0, 138, 0, 0, 162, 0, 0 },
+ { 1, 1, 1 }, { 0, 0, 0 }, { 1, 1, 1 },
+ { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 } }
+};
+
+static const LoLCharacterProvider kLoLCharacterDefsDOSRussianProvider = { ARRAYSIZE(kLoLCharacterDefsDOSRussian), kLoLCharacterDefsDOSRussian };
+
diff --git a/devtools/create_kyradat/resources/lol_fmtowns.h b/devtools/create_kyradat/resources/lol_fmtowns.h
new file mode 100644
index 0000000000..8c9fabf128
--- /dev/null
+++ b/devtools/create_kyradat/resources/lol_fmtowns.h
@@ -0,0 +1,1600 @@
+static const char *const kLoLIngamePakFilesFMTowns[11] = {
+ "VOC.PAK",
+ "GENERAL.PAK",
+ "CHAPTER1.PAK",
+ "CHAPTER2.PAK",
+ "CHAPTER3.PAK",
+ "CHAPTER4.PAK",
+ "CHAPTER5.PAK",
+ "CHAPTER6.PAK",
+ "CHAPTER7.PAK",
+ "CHAPTER8.PAK",
+ "TMUS.PAK"
+};
+
+static const StringListProvider kLoLIngamePakFilesFMTownsProvider = { ARRAYSIZE(kLoLIngamePakFilesFMTowns), kLoLIngamePakFilesFMTowns };
+
+static const char *const kLoLIngameSfxFilesFMTowns[230] = {
+ "XXXXXXXX",
+ "XXXXXXXX",
+ "XXXXXXXX",
+ "XXXXXXXX",
+ "XXXXXXXX",
+ "XXXXXXXX",
+ "XXXXXXXX",
+ "XXXXXXXX",
+ "XXXXXXXX",
+ "XXXXXXXX",
+ "XXXXXXXX",
+ "XXXXXXXX",
+ "XXXXXXXX",
+ "XXXXXXXX",
+ "XXXXXXXX",
+ "XXXXXXXX",
+ "XXXXXXXX",
+ "XXXXXXXX",
+ "XXXXXXXX",
+ "XXXXXXXX",
+ "XXXXXXXX",
+ "XXXXXXXX",
+ "XXXXXXXX",
+ "XXXXXXXX",
+ "XXXXXXXX",
+ "XXXXXXXX",
+ "XXXXXXXX",
+ "XXXXXXXX",
+ "XXXXXXXX",
+ "XXXXXXXX",
+ "XXXXXXXX",
+ "XXXXXXXX",
+ "XXXXXXXX",
+ "XXXXXXXX",
+ "XXXXXXXX",
+ "XXXXXXXX",
+ "XXXXXXXX",
+ "XXXXXXXX",
+ "XXXXXXXX",
+ "XXXXXXXX",
+ "XXXXXXXX",
+ "XXXXXXXX",
+ "XXXXXXXX",
+ "XXXXXXXX",
+ "XXXXXXXX",
+ "XXXXXXXX",
+ "XXXXXXXX",
+ "XXXXXXXX",
+ "XXXXXXXX",
+ "XXXXXXXX",
+ "DOORMTOP",
+ "DOORMTCL",
+ "PMETLHI",
+ "SWING6",
+ "MDAMAGE2",
+ "LEVERDN",
+ "LEVERUP",
+ "MTLDRSLM",
+ "DOORWDOP",
+ "DOORWDCL",
+ "KEYOPEN",
+ "KEYLOCK",
+ "PORTCUL",
+ "PORTCULD",
+ "LOKPICK",
+ "OCEAN2",
+ "NUNCHUK",
+ "SWING",
+ "SHWING1",
+ "SWING6",
+ "THROW",
+ "CROSSBOW",
+ "HEAL1",
+ "FIRESPL1",
+ "PRESSIN",
+ "PRESSOUT",
+ "PLATEON",
+ "PLATEOFF",
+ "DORWDSLM",
+ "LITENIN1",
+ "ICESPEL2",
+ "SPELL4B",
+ "SHIELD1",
+ "3BOLTC",
+ "2BOLTC",
+ "1BOLTC",
+ "DAWNSPL1",
+ "HEALKING",
+ "SPELL7",
+ "SWING1",
+ "EXPLODE",
+ "CROWCAW",
+ "MORPH2",
+ "CHEST",
+ "MONEY",
+ "SPELBK2",
+ "AUTOMAP",
+ "MINECRT3",
+ "CREAK1",
+ "TURNPAG2",
+ "POLGULP1",
+ "GOOEY1",
+ "BUCKBELL",
+ "KEEPXIT2",
+ "VSCREAM4",
+ "EMPTY",
+ "GOOEY1",
+ "GOOEY2",
+ "RIPPOD4",
+ "PODSKEL1",
+ "INVISO",
+ "OPENBOX2",
+ "ACCEPT2",
+ "BOW2",
+ "HACHUCKM",
+ "FOUNDRY2",
+ "FOUNDRY2",
+ "FOUNDRY4",
+ "FOUNDRY6",
+ "CLEANGL1",
+ "CLEANGL2",
+ "GLOWY1",
+ "DORSTNOP",
+ "DORSTNCL",
+ "EMPTY",
+ "EMPTY",
+ "EMPTY",
+ "EMPTY",
+ "ADAMAGE1",
+ "HDAMAGE1",
+ "TDAMAGE1",
+ "BDAMAGE1",
+ "LDAMAGE1",
+ "TDAMAGE2",
+ "CDAMAGE1",
+ "EMPTY",
+ "EMPTY",
+ "EMPTY",
+ "GOOD1",
+ "GOOD2",
+ "EMPTY",
+ "EMPTY",
+ "EMPTY",
+ "LITENIN1",
+ "COMPASS2",
+ "KINGDOR1",
+ "GLASBRK2",
+ "FLUTTER3",
+ "NUNCHUK",
+ "WALLFALL",
+ "WALLHIT",
+ "MWHOA1",
+ "LADDER",
+ "WHITTL3",
+ "ROWBOAT1",
+ "HORSEY2",
+ "SNORT",
+ "PUMPDOR1",
+ "PUMPSM2",
+ "PUMPSM3",
+ "SPARK1",
+ "BEZEL",
+ "SWARM",
+ "CHEST",
+ "WRIT1",
+ "CAUSFOG",
+ "VAELAN2",
+ "ROARSPL1",
+ "RATTLER",
+ "WINK1",
+ "HANDFATE",
+ "QUAKE1",
+ "WIZLAMP1",
+ "SAP2",
+ "MSTDOOM1",
+ "GARDIAN1",
+ "VORTEX1",
+ "LION1",
+ "STEAM",
+ "SQUAWCK",
+ "SLIDEMUG",
+ "SPARKHIT",
+ "SPARKHIT2",
+ "SPARKHIT3",
+ "ICEFORM",
+ "ICEXPLOD",
+ "EXPLODE2",
+ "EXPLODE3",
+ "BOLTQUK2",
+ "BOLT2",
+ "BOLT3",
+ "SNKBITE",
+ "HANDGLOW",
+ "MSTDOOM2",
+ "MSTDOOM3",
+ "GARDIAN2",
+ "PLUSPOWR",
+ "MINSPOWR",
+ "BLUDCURL",
+ "LORAGASP",
+ "POURH2O",
+ "AWHOA2",
+ "HWHOA1",
+ "CWHOA1",
+ "AFALL2",
+ "EMPTY",
+ "CFALL2",
+ "MFALL2",
+ "EMPTY",
+ "EMPTY",
+ "EMPTY",
+ "EMPTY",
+ "EMPTY",
+ "EMPTY",
+ "EMPTY",
+ "EMPTY",
+ "WRIT2",
+ "WRIT3",
+ "WRIT4",
+ "WRIT5",
+ "WRIT6",
+ "RUCKUS1",
+ "RUCKUS3",
+ "CHANT1",
+ "EMPTY",
+ "EMPTY",
+ "EMPTY",
+ "CHANT2",
+ "CHANT3",
+ ""
+};
+
+static const StringListProvider kLoLIngameSfxFilesFMTownsProvider = { ARRAYSIZE(kLoLIngameSfxFilesFMTowns), kLoLIngameSfxFilesFMTowns };
+
+static const byte kLoLIngameSfxIndexFMTowns[1000] = {
+ 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00,
+ 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00,
+ 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00,
+ 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00,
+ 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00,
+ 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00,
+ 0x34, 0x00, 0x6F, 0x00, 0x7C, 0x00, 0x00, 0x00,
+ 0x7D, 0x00, 0x00, 0x00, 0x7E, 0x00, 0x00, 0x00,
+ 0x7F, 0x00, 0x00, 0x00, 0x36, 0x00, 0x73, 0x00,
+ 0x35, 0x00, 0x9C, 0xFF, 0xFF, 0xFF, 0x00, 0x00,
+ 0x80, 0x00, 0x73, 0x00, 0x81, 0x00, 0x73, 0x00,
+ 0x82, 0x00, 0x73, 0x00, 0x83, 0x00, 0x73, 0x00,
+ 0x84, 0x00, 0x73, 0x00, 0x85, 0x00, 0x73, 0x00,
+ 0x86, 0x00, 0x73, 0x00, 0xD7, 0x00, 0x76, 0x00,
+ 0x87, 0x00, 0x65, 0x00, 0x38, 0x00, 0x5F, 0x00,
+ 0x37, 0x00, 0x5F, 0x00, 0x32, 0x00, 0x0A, 0x00,
+ 0x33, 0x00, 0x64, 0x00, 0x39, 0x00, 0x65, 0x00,
+ 0x3A, 0x00, 0x0A, 0x00, 0x3B, 0x00, 0x14, 0x00,
+ 0x4E, 0x00, 0x65, 0x00, 0x7A, 0x00, 0x64, 0x00,
+ 0x7B, 0x00, 0x64, 0x00, 0x88, 0x00, 0x65, 0x00,
+ 0x3C, 0x00, 0x65, 0x00, 0x3D, 0x00, 0x64, 0x00,
+ 0x89, 0x00, 0x00, 0x00, 0x8E, 0x00, 0x14, 0x00,
+ 0x3E, 0x00, 0x00, 0x00, 0x3F, 0x00, 0x00, 0x00,
+ 0x40, 0x00, 0x65, 0x00, 0x41, 0x00, 0x00, 0x00,
+ 0xC9, 0x00, 0x72, 0x00, 0xCA, 0x00, 0x72, 0x00,
+ 0xCB, 0x00, 0x72, 0x00, 0xCC, 0x00, 0x74, 0x00,
+ 0xCD, 0x00, 0x74, 0x00, 0xCE, 0x00, 0x74, 0x00,
+ 0xCF, 0x00, 0x74, 0x00, 0xD0, 0x00, 0x73, 0x00,
+ 0xD1, 0x00, 0x73, 0x00, 0xD2, 0x00, 0x73, 0x00,
+ 0xD3, 0x00, 0x73, 0x00, 0xD4, 0x00, 0x72, 0x00,
+ 0xD5, 0x00, 0x72, 0x00, 0xD6, 0x00, 0x72, 0x00,
+ 0x42, 0x00, 0x6F, 0x00, 0x43, 0x00, 0x6F, 0x00,
+ 0x44, 0x00, 0x6F, 0x00, 0x45, 0x00, 0x6F, 0x00,
+ 0x46, 0x00, 0x6F, 0x00, 0x47, 0x00, 0x6F, 0x00,
+ 0x48, 0x00, 0x77, 0x00, 0x49, 0x00, 0x89, 0xFF,
+ 0x4F, 0x00, 0x89, 0xFF, 0x50, 0x00, 0x89, 0xFF,
+ 0xA0, 0x00, 0x8A, 0xFF, 0xA1, 0x00, 0x89, 0xFF,
+ 0xA2, 0x00, 0x89, 0xFF, 0xFF, 0xFF, 0x00, 0x00,
+ 0xA3, 0x00, 0x89, 0xFF, 0xA4, 0x00, 0x89, 0xFF,
+ 0x4A, 0x00, 0x13, 0x00, 0x4B, 0x00, 0x13, 0x00,
+ 0x4C, 0x00, 0x32, 0x00, 0x4D, 0x00, 0x32, 0x00,
+ 0x5F, 0x00, 0x0A, 0x00, 0x51, 0x00, 0x00, 0x00,
+ 0x52, 0x00, 0x00, 0x00, 0x8F, 0x00, 0x00, 0x00,
+ 0x53, 0x00, 0x00, 0x00, 0x54, 0x00, 0x00, 0x00,
+ 0x55, 0x00, 0x00, 0x00, 0x56, 0x00, 0x00, 0x00,
+ 0x57, 0x00, 0x00, 0x00, 0x58, 0x00, 0x77, 0x00,
+ 0x60, 0x00, 0x00, 0x00, 0x5D, 0x00, 0x6A, 0x00,
+ 0x8A, 0x00, 0x6F, 0x00, 0x8B, 0x00, 0x6F, 0x00,
+ 0x8C, 0x00, 0x00, 0x00, 0x8D, 0x00, 0x00, 0x00,
+ 0x5A, 0x00, 0x77, 0x00, 0x5C, 0x00, 0x00, 0x00,
+ 0x5B, 0x00, 0x00, 0x00, 0x5E, 0x00, 0x6F, 0x00,
+ 0x61, 0x00, 0x76, 0x00, 0xFF, 0xFF, 0x00, 0x00,
+ 0x62, 0x00, 0x76, 0x00, 0x63, 0x00, 0x3C, 0x00,
+ 0x64, 0x00, 0x6D, 0x00, 0x65, 0x00, 0x00, 0x00,
+ 0x66, 0x00, 0x00, 0x00, 0x67, 0x00, 0x00, 0x00,
+ 0x68, 0x00, 0x00, 0x00, 0x69, 0x00, 0x00, 0x00,
+ 0x6A, 0x00, 0x00, 0x00, 0x6B, 0x00, 0x00, 0x00,
+ 0x6C, 0x00, 0x00, 0x00, 0x6D, 0x00, 0x00, 0x00,
+ 0x6E, 0x00, 0x00, 0x00, 0x6F, 0x00, 0x00, 0x00,
+ 0x70, 0x00, 0x88, 0xFF, 0xFF, 0xFF, 0x00, 0x00,
+ 0x71, 0x00, 0x00, 0x00, 0x72, 0x00, 0x00, 0x00,
+ 0x73, 0x00, 0x74, 0x00, 0x74, 0x00, 0x00, 0x00,
+ 0x75, 0x00, 0x00, 0x00, 0x76, 0x00, 0x00, 0x00,
+ 0x77, 0x00, 0x00, 0x00, 0x78, 0x00, 0x00, 0x00,
+ 0x79, 0x00, 0x77, 0x00, 0x90, 0x00, 0x00, 0x00,
+ 0x91, 0x00, 0x00, 0x00, 0x92, 0x00, 0x77, 0x00,
+ 0x93, 0x00, 0x1E, 0x00, 0x94, 0x00, 0x89, 0xFF,
+ 0x95, 0x00, 0x77, 0x00, 0x96, 0x00, 0x76, 0x00,
+ 0x97, 0x00, 0x72, 0x00, 0x98, 0x00, 0x00, 0x00,
+ 0x99, 0x00, 0x50, 0x00, 0x9A, 0x00, 0x78, 0x00,
+ 0x9B, 0x00, 0x64, 0x00, 0x9C, 0x00, 0x5A, 0x00,
+ 0x9D, 0x00, 0x64, 0x00, 0x9E, 0x00, 0x65, 0x00,
+ 0x9F, 0x00, 0x66, 0x00, 0xA5, 0x00, 0x89, 0xFF,
+ 0xA6, 0x00, 0x89, 0xFF, 0xA7, 0x00, 0x77, 0x00,
+ 0xA8, 0x00, 0x76, 0x00, 0xFF, 0xFF, 0x00, 0x00,
+ 0xA9, 0x00, 0x77, 0x00, 0xAA, 0x00, 0x77, 0x00,
+ 0xAB, 0x00, 0x77, 0x00, 0xAC, 0x00, 0x77, 0x00,
+ 0xAD, 0x00, 0x77, 0x00, 0xAE, 0x00, 0x77, 0x00,
+ 0xAF, 0x00, 0x76, 0x00, 0xB0, 0x00, 0x77, 0x00,
+ 0xB1, 0x00, 0x64, 0x00, 0xB2, 0x00, 0x6F, 0x00,
+ 0xB3, 0x00, 0x6E, 0x00, 0xB4, 0x00, 0x6E, 0x00,
+ 0xB5, 0x00, 0x77, 0x00, 0xB6, 0x00, 0x77, 0x00,
+ 0xB7, 0x00, 0x77, 0x00, 0xB8, 0x00, 0x76, 0x00,
+ 0xB9, 0x00, 0x77, 0x00, 0xBA, 0x00, 0x77, 0x00,
+ 0xBB, 0x00, 0x77, 0x00, 0xBC, 0x00, 0x77, 0x00,
+ 0xBD, 0x00, 0x77, 0x00, 0xBE, 0x00, 0x77, 0x00,
+ 0xBF, 0x00, 0x77, 0x00, 0xC0, 0x00, 0x76, 0x00,
+ 0xC1, 0x00, 0x77, 0x00, 0xC2, 0x00, 0x77, 0x00,
+ 0xC3, 0x00, 0x77, 0x00, 0xC4, 0x00, 0x6E, 0x00,
+ 0xC5, 0x00, 0x6E, 0x00, 0xC6, 0x00, 0x7D, 0x00,
+ 0xC7, 0x00, 0x78, 0x00, 0xC8, 0x00, 0x78, 0x00,
+ 0xD8, 0x00, 0x77, 0x00, 0xD9, 0x00, 0x77, 0x00,
+ 0xDA, 0x00, 0x77, 0x00, 0xDB, 0x00, 0x77, 0x00,
+ 0xDC, 0x00, 0x77, 0x00, 0xDD, 0x00, 0x78, 0x00,
+ 0xDE, 0x00, 0x78, 0x00, 0xFF, 0xFF, 0x00, 0x00,
+ 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00,
+ 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00,
+ 0xE3, 0x00, 0x77, 0x00, 0xE4, 0x00, 0x77, 0x00,
+ 0xE0, 0x00, 0x1E, 0x00, 0xDF, 0x00, 0x77, 0x00,
+ 0xE1, 0x00, 0x05, 0x00, 0xE2, 0x00, 0x0A, 0x00,
+ 0x00, 0x00, 0x50, 0x00, 0x01, 0x00, 0x50, 0x00,
+ 0x02, 0x00, 0x50, 0x00, 0x03, 0x00, 0x50, 0x00,
+ 0x04, 0x00, 0x50, 0x00, 0x05, 0x00, 0x50, 0x00,
+ 0x06, 0x00, 0x50, 0x00, 0x07, 0x00, 0x50, 0x00,
+ 0x08, 0x00, 0x50, 0x00, 0x09, 0x00, 0x50, 0x00,
+ 0x0A, 0x00, 0x50, 0x00, 0x0B, 0x00, 0x50, 0x00,
+ 0x0C, 0x00, 0x50, 0x00, 0x0D, 0x00, 0x50, 0x00,
+ 0x0E, 0x00, 0x50, 0x00, 0x0F, 0x00, 0x50, 0x00,
+ 0x10, 0x00, 0x50, 0x00, 0x11, 0x00, 0x5A, 0x00,
+ 0x12, 0x00, 0x5A, 0x00, 0x13, 0x00, 0x5A, 0x00,
+ 0x14, 0x00, 0x5A, 0x00, 0x15, 0x00, 0x5A, 0x00,
+ 0x16, 0x00, 0x5A, 0x00, 0x17, 0x00, 0x5A, 0x00,
+ 0x18, 0x00, 0x5A, 0x00, 0x19, 0x00, 0x5A, 0x00,
+ 0x1A, 0x00, 0x5A, 0x00, 0x1B, 0x00, 0x5A, 0x00,
+ 0x1C, 0x00, 0x5A, 0x00, 0x1D, 0x00, 0x5A, 0x00,
+ 0x1E, 0x00, 0x5A, 0x00, 0x1F, 0x00, 0x5A, 0x00,
+ 0x20, 0x00, 0x5A, 0x00, 0x21, 0x00, 0x73, 0x00,
+ 0x22, 0x00, 0x73, 0x00, 0x23, 0x00, 0x73, 0x00,
+ 0x24, 0x00, 0x73, 0x00, 0x25, 0x00, 0x73, 0x00,
+ 0x26, 0x00, 0x73, 0x00, 0x27, 0x00, 0x73, 0x00,
+ 0x28, 0x00, 0x73, 0x00, 0x29, 0x00, 0x73, 0x00,
+ 0x2A, 0x00, 0x73, 0x00, 0x2B, 0x00, 0x50, 0x00,
+ 0x2C, 0x00, 0x5A, 0x00, 0x2D, 0x00, 0x5A, 0x00,
+ 0x2E, 0x00, 0x5A, 0x00, 0x2F, 0x00, 0x5A, 0x00,
+ 0x30, 0x00, 0x5A, 0x00, 0x31, 0x00, 0x5A, 0x00
+};
+
+static const ByteProvider kLoLIngameSfxIndexFMTownsProvider = { ARRAYSIZE(kLoLIngameSfxIndexFMTowns), kLoLIngameSfxIndexFMTowns };
+
+static const SpellProperty kLoLSpellPropertiesFMTowns[10] = {
+ { 16436, { 5, 10, 15, 25 }, 0, 0, { 0, 0, 0, 0 }, 0, 0, 0x0100 },
+ { 16437, { 5, 10, 25, 60 }, 0, 0, { 0, 0, 0, 0 }, 0, 0, 0x0001 },
+ { 16438, { 8, 15, 30, 80 }, 0, 0, { 0, 0, 0, 0 }, 0, 0, 0x0102 },
+ { 16440, { 20, 35, 65, 100 }, 0, 0, { 0, 0, 0, 0 }, 0, 0, 0x0103 },
+ { 16441, { 30, 60, 90, 120 }, 0, 0, { 0, 0, 0, 0 }, 0, 0, 0x0104 },
+ { 16442, { 30, 60, 90, 150 }, 0, 0, { 0, 0, 0, 0 }, 0, 0, 0x0105 },
+ { 16439, { 25, 30, 50, 100 }, 0, 0, { 0, 0, 0, 0 }, 0, 0, 0x0106 },
+ { 16443, { 3, 6, 12, 24 }, 0, 0, { 0, 0, 0, 0 }, 0, 0, 0x0107 },
+ { 16975, { 15, 15, 15, 15 }, 0, 0, { 0, 0, 0, 0 }, 0, 0, 0x0108 },
+ { 16975, { 15, 15, 15, 15 }, 15, 0, { 0, 0, 0, 0 }, 0, 0, 0x0108 }
+};
+
+static const SpellPropertyProvider kLoLSpellPropertiesFMTownsProvider = { ARRAYSIZE(kLoLSpellPropertiesFMTowns), kLoLSpellPropertiesFMTowns };
+
+static const byte kLoLGameShapeMapFMTowns[276] = {
+ 0x15, 0x54, 0x05, 0x35, 0x09, 0x36, 0x00, 0x34,
+ 0x00, 0x34, 0x00, 0x34, 0x00, 0x3A, 0x26, 0x3B,
+ 0x05, 0x35, 0x07, 0x37, 0x18, 0x3E, 0x0D, 0x3C,
+ 0x06, 0x40, 0x06, 0x3D, 0x01, 0x54, 0x01, 0x54,
+ 0x0A, 0x54, 0x0A, 0x54, 0x0A, 0x54, 0x04, 0x54,
+ 0x04, 0x54, 0x2D, 0x54, 0x2D, 0x54, 0x0B, 0x39,
+ 0x24, 0x54, 0x03, 0x38, 0x00, 0x3A, 0x1E, 0x3C,
+ 0x1E, 0x3C, 0x1B, 0x54, 0x14, 0x54, 0x29, 0x54,
+ 0x02, 0x54, 0x0C, 0x54, 0x22, 0x54, 0x21, 0x3F,
+ 0x0D, 0x3C, 0x25, 0x54, 0x1A, 0x3F, 0x04, 0x54,
+ 0x30, 0x54, 0x31, 0x54, 0x32, 0x54, 0x32, 0x54,
+ 0x00, 0x34, 0x00, 0x34, 0x00, 0x34, 0x00, 0x34,
+ 0x17, 0x54, 0x17, 0x54, 0x0E, 0x54, 0x0E, 0x54,
+ 0x0E, 0x54, 0x26, 0x3B, 0x2C, 0x54, 0x21, 0x3F,
+ 0x07, 0x37, 0x27, 0x54, 0x1B, 0x54, 0x1B, 0x54,
+ 0x1B, 0x54, 0x1B, 0x54, 0x1B, 0x54, 0x1B, 0x54,
+ 0x1B, 0x54, 0x1B, 0x54, 0x22, 0x54, 0x22, 0x54,
+ 0x16, 0x54, 0x2D, 0x54, 0x3B, 0x54, 0x3B, 0x54,
+ 0x3A, 0x54, 0x17, 0x54, 0x1B, 0x54, 0x1B, 0x54,
+ 0x17, 0x54, 0x0A, 0x54, 0x0A, 0x54, 0x0A, 0x54,
+ 0x1F, 0x54, 0x17, 0x54, 0x27, 0x54, 0x1B, 0x54,
+ 0x1E, 0x3C, 0x2A, 0x54, 0x2F, 0x54, 0x2F, 0x54,
+ 0x2F, 0x54, 0x2F, 0x54, 0x2F, 0x54, 0x2F, 0x54,
+ 0x2C, 0x54, 0x2C, 0x54, 0x2C, 0x54, 0x2C, 0x54,
+ 0x34, 0x54, 0x0F, 0x54, 0x35, 0x41, 0x1B, 0x54,
+ 0x1B, 0x54, 0x1B, 0x54, 0x1B, 0x54, 0x2B, 0x54,
+ 0x1D, 0x54, 0x1D, 0x54, 0x28, 0x54, 0x28, 0x54,
+ 0x28, 0x54, 0x28, 0x54, 0x01, 0x54, 0x14, 0x54,
+ 0x14, 0x54, 0x14, 0x54, 0x14, 0x54, 0x1B, 0x54,
+ 0x27, 0x54, 0x1B, 0x54, 0x1B, 0x54, 0x1B, 0x54,
+ 0x1B, 0x54, 0x36, 0x54, 0x37, 0x54, 0x38, 0x54,
+ 0x39, 0x54, 0x1B, 0x54, 0x1B, 0x54, 0x1B, 0x54,
+ 0x1B, 0x54, 0x27, 0x54, 0x2E, 0x54, 0x2E, 0x54,
+ 0x2E, 0x54, 0x2E, 0x54, 0x17, 0x54, 0x01, 0x54,
+ 0x1C, 0x54, 0x1C, 0x54
+};
+
+static const ByteProvider kLoLGameShapeMapFMTownsProvider = { ARRAYSIZE(kLoLGameShapeMapFMTowns), kLoLGameShapeMapFMTowns };
+
+static const byte kLoLSceneItemOffsFMTowns[8] = {
+ 0x00, 0xFE, 0x01, 0xFF, 0x02, 0x00, 0x01, 0xFF
+};
+
+static const ByteProvider kLoLSceneItemOffsFMTownsProvider = { ARRAYSIZE(kLoLSceneItemOffsFMTowns), kLoLSceneItemOffsFMTowns };
+
+static const byte kLoLCharInvIndexFMTowns[5] = {
+ 0x00, 0x00, 0x03, 0x01, 0x02
+};
+
+static const ByteProvider kLoLCharInvIndexFMTownsProvider = { ARRAYSIZE(kLoLCharInvIndexFMTowns), kLoLCharInvIndexFMTowns };
+
+static const byte kLoLCharInvDefsFMTowns[88] = {
+ 0x05, 0x34, 0x50, 0x34, 0xFF, 0xFF, 0xFF, 0xFF,
+ 0x05, 0x04, 0x05, 0x1C, 0x50, 0x04, 0x50, 0x1C,
+ 0x05, 0x5D, 0x0F, 0x4E, 0x50, 0x4E, 0x05, 0x19,
+ 0x50, 0x19, 0x05, 0x49, 0x50, 0x49, 0x05, 0x01,
+ 0x05, 0x31, 0x50, 0x01, 0x50, 0x31, 0x05, 0x61,
+ 0xFF, 0xFF, 0xFF, 0xFF, 0x05, 0x34, 0x50, 0x34,
+ 0xFF, 0xFF, 0xFF, 0xFF, 0x05, 0x04, 0x05, 0x1C,
+ 0x50, 0x04, 0x50, 0x1C, 0x05, 0x5D, 0x0F, 0x4E,
+ 0x50, 0x4E, 0x05, 0x34, 0x50, 0x34, 0xFF, 0xFF,
+ 0xFF, 0xFF, 0x05, 0x04, 0x05, 0x1C, 0x50, 0x04,
+ 0x50, 0x1C, 0xFF, 0xFF, 0x0F, 0x4E, 0x50, 0x4E
+};
+
+static const ByteProvider kLoLCharInvDefsFMTownsProvider = { ARRAYSIZE(kLoLCharInvDefsFMTowns), kLoLCharInvDefsFMTowns };
+
+static const uint16 kLoLCharDefsManFMTowns[9] = {
+ 0x0100, 0x0100, 0x0100, 0x0032, 0x0100, 0x0100, 0x0100, 0x0100,
+ 0x0004
+};
+
+static const Uint16Provider kLoLCharDefsManFMTownsProvider = { ARRAYSIZE(kLoLCharDefsManFMTowns), kLoLCharDefsManFMTowns };
+
+static const uint16 kLoLCharDefsWomanFMTowns[9] = {
+ 0x0100, 0x0100, 0x0100, 0x0032, 0x0100, 0x0100, 0x0100, 0x0100,
+ 0x0004
+};
+
+static const Uint16Provider kLoLCharDefsWomanFMTownsProvider = { ARRAYSIZE(kLoLCharDefsWomanFMTowns), kLoLCharDefsWomanFMTowns };
+
+static const uint16 kLoLCharDefsKieranFMTowns[9] = {
+ 0x0180, 0x0080, 0x00C0, 0x0032, 0x0200, 0x00A6, 0x0100, 0x0140,
+ 0x0006
+};
+
+static const Uint16Provider kLoLCharDefsKieranFMTownsProvider = { ARRAYSIZE(kLoLCharDefsKieranFMTowns), kLoLCharDefsKieranFMTowns };
+
+static const uint16 kLoLCharDefsAkshelFMTowns[9] = {
+ 0x00C0, 0x00C0, 0x0140, 0x0032, 0x0100, 0x0180, 0x0180, 0x0100,
+ 0x0004
+};
+
+static const Uint16Provider kLoLCharDefsAkshelFMTownsProvider = { ARRAYSIZE(kLoLCharDefsAkshelFMTowns), kLoLCharDefsAkshelFMTowns };
+
+static const uint32 kLoLExpRequirementsFMTowns[11] = {
+ 0x00000000, 0x000001F4, 0x000005DC, 0x00001388, 0x000061A8, 0x0000C350, 0x00013880, 0x0001D4C0,
+ 0x0002BF20, 0x00041EB0, 0x7FFFFFFF
+};
+
+static const Uint32Provider kLoLExpRequirementsFMTownsProvider = { ARRAYSIZE(kLoLExpRequirementsFMTowns), kLoLExpRequirementsFMTowns };
+
+static const uint16 kLoLMonsterModifiers1FMTowns[3] = {
+ 0x00C0, 0x0100, 0x0180
+};
+
+static const Uint16Provider kLoLMonsterModifiers1FMTownsProvider = { ARRAYSIZE(kLoLMonsterModifiers1FMTowns), kLoLMonsterModifiers1FMTowns };
+
+static const uint16 kLoLMonsterModifiers2FMTowns[3] = {
+ 0x0100, 0x0100, 0x00C0
+};
+
+static const Uint16Provider kLoLMonsterModifiers2FMTownsProvider = { ARRAYSIZE(kLoLMonsterModifiers2FMTowns), kLoLMonsterModifiers2FMTowns };
+
+static const uint16 kLoLMonsterModifiers3FMTowns[3] = {
+ 0x0140, 0x0100, 0x0080
+};
+
+static const Uint16Provider kLoLMonsterModifiers3FMTownsProvider = { ARRAYSIZE(kLoLMonsterModifiers3FMTowns), kLoLMonsterModifiers3FMTowns };
+
+static const byte kLoLMonsterShiftOffsetsFMTowns[32] = {
+ 0x01, 0x01, 0x01, 0x00, 0x01, 0xFF, 0x00, 0xFF,
+ 0x00, 0x00, 0x00, 0x01, 0xFF, 0x01, 0xFF, 0x00,
+ 0xFF, 0xFF, 0x00, 0xFF, 0x00, 0x00, 0x00, 0x01,
+ 0x01, 0x01, 0x01, 0x00, 0x01, 0xFF, 0x00, 0x00
+};
+
+static const ByteProvider kLoLMonsterShiftOffsetsFMTownsProvider = { ARRAYSIZE(kLoLMonsterShiftOffsetsFMTowns), kLoLMonsterShiftOffsetsFMTowns };
+
+static const byte kLoLMonsterDirFlagsFMTowns[16] = {
+ 0x08, 0x14, 0x00, 0x04, 0x04, 0x08, 0x14, 0x00,
+ 0x00, 0x04, 0x08, 0x14, 0x14, 0x00, 0x04, 0x08
+};
+
+static const ByteProvider kLoLMonsterDirFlagsFMTownsProvider = { ARRAYSIZE(kLoLMonsterDirFlagsFMTowns), kLoLMonsterDirFlagsFMTowns };
+
+static const byte kLoLMonsterScaleYFMTowns[30] = {
+ 0x7C, 0x78, 0x74, 0x70, 0x6C, 0x68, 0x65, 0x62,
+ 0x5F, 0x5C, 0x59, 0x56, 0x53, 0x50, 0x4D, 0x4A,
+ 0x48, 0x46, 0x44, 0x43, 0x41, 0x40, 0x3E, 0x3D,
+ 0x3C, 0x3B, 0x3A, 0x39, 0x38, 0x38
+};
+
+static const ByteProvider kLoLMonsterScaleYFMTownsProvider = { ARRAYSIZE(kLoLMonsterScaleYFMTowns), kLoLMonsterScaleYFMTowns };
+
+static const byte kLoLMonsterScaleXFMTowns[29] = {
+ 0x98, 0x98, 0x90, 0x88, 0x80, 0x76, 0x6E, 0x68,
+ 0x62, 0x5C, 0x58, 0x54, 0x50, 0x4A, 0x44, 0x40,
+ 0x3C, 0x38, 0x36, 0x32, 0x30, 0x2C, 0x2A, 0x28,
+ 0x26, 0x24, 0x22, 0x20, 0x20
+};
+
+static const ByteProvider kLoLMonsterScaleXFMTownsProvider = { ARRAYSIZE(kLoLMonsterScaleXFMTowns), kLoLMonsterScaleXFMTowns };
+
+static const uint16 kLoLMonsterScaleWHFMTowns[65] = {
+ 0x0041, 0x0045, 0x0049, 0x004D, 0x0051, 0x0055, 0x0059, 0x005D,
+ 0x0062, 0x0066, 0x006A, 0x006E, 0x0072, 0x0076, 0x007A, 0x007E,
+ 0x0082, 0x0086, 0x008A, 0x008E, 0x0092, 0x0096, 0x009A, 0x009E,
+ 0x00A3, 0x00A7, 0x00AB, 0x00AF, 0x00B3, 0x00B7, 0x00BB, 0x00BF,
+ 0x00C3, 0x00C7, 0x00CB, 0x00CF, 0x00D3, 0x00D7, 0x00DB, 0x00DF,
+ 0x00E4, 0x00E8, 0x00EC, 0x00F0, 0x00F4, 0x00F8, 0x00FC, 0x0100,
+ 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100,
+ 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100,
+ 0x0100
+};
+
+static const Uint16Provider kLoLMonsterScaleWHFMTownsProvider = { ARRAYSIZE(kLoLMonsterScaleWHFMTowns), kLoLMonsterScaleWHFMTowns };
+
+static const FlyingObjectShape kLoLFlyingObjectShpFMTowns[13] = {
+ { 0, 0, 1, 0x00, 0x40, },
+ { 2, 2, 3, 0x00, 0x00, },
+ { 4, 4, 4, 0x00, 0x00, },
+ { 5, 5, 5, 0x20, 0x00, },
+ { 6, 6, 6, 0x20, 0x00, },
+ { 7, 7, 7, 0x20, 0x00, },
+ { 9, 8, 15, 0x00, 0x00, },
+ { 11, 10, 12, 0x00, 0x00, },
+ { 12, 12, 12, 0x20, 0x00, },
+ { 14, 13, 15, 0x00, 0x00, },
+ { 16, 16, 16, 0x00, 0x00, },
+ { 17, 17, 17, 0x20, 0x00, },
+ { 18, 18, 18, 0x00, 0x00, }
+};
+
+static const FlyingObjectShapeProvider kLoLFlyingObjectShpFMTownsProvider = { ARRAYSIZE(kLoLFlyingObjectShpFMTowns), kLoLFlyingObjectShpFMTowns };
+
+static const uint16 kLoLInventoryDescFMTowns[11] = {
+ 0x417A, 0x417B, 0x417A, 0x417B, 0x417C, 0x417D, 0x417E, 0x417F,
+ 0x4180, 0x4181, 0x4181
+};
+
+static const Uint16Provider kLoLInventoryDescFMTownsProvider = { ARRAYSIZE(kLoLInventoryDescFMTowns), kLoLInventoryDescFMTowns };
+
+static const char *const kLoLLevelShpListFMTowns[12] = {
+ "KEEP.SHP",
+ "FOREST1.SHP",
+ "MANOR.SHP",
+ "CAVE1.SHP",
+ "SWAMP.SHP",
+ "URBISH.SHP",
+ "MINE1.SHP",
+ "TOWER1.SHP",
+ "YVEL1.SHP",
+ "CATWALK.SHP",
+ "RUIN.SHP",
+ "CIMMERIA.SHP"
+};
+
+static const StringListProvider kLoLLevelShpListFMTownsProvider = { ARRAYSIZE(kLoLLevelShpListFMTowns), kLoLLevelShpListFMTowns };
+
+static const char *const kLoLLevelDatListFMTowns[12] = {
+ "KEEP.DAT",
+ "FOREST1.DAT",
+ "MANOR.DAT",
+ "CAVE1.DAT",
+ "SWAMP.DAT",
+ "URBISH.DAT",
+ "MINE1.DAT",
+ "TOWER1.DAT",
+ "YVEL1.DAT",
+ "CATWALK.DAT",
+ "RUIN.DAT",
+ "CIMMERIA.DAT"
+};
+
+static const StringListProvider kLoLLevelDatListFMTownsProvider = { ARRAYSIZE(kLoLLevelDatListFMTowns), kLoLLevelDatListFMTowns };
+
+static const CompassDef kLoLCompassDefsFMTowns[32] = {
+ { 0, 3, -3, 0x00 },
+ { 1, 3, -3, 0x00 },
+ { 2, 3, -3, 0x00 },
+ { 3, 5, -3, 0x00 },
+ { 4, 5, -3, 0x00 },
+ { 5, 6, -3, 0x00 },
+ { 6, 6, -3, 0x00 },
+ { 7, 6, -3, 0x00 },
+ { 8, 6, -3, 0x00 },
+ { 7, 6, 4, 0x02 },
+ { 6, 6, 4, 0x02 },
+ { 5, 6, 4, 0x02 },
+ { 4, 5, 4, 0x02 },
+ { 3, 5, 4, 0x02 },
+ { 2, 3, 4, 0x02 },
+ { 1, 3, 4, 0x02 },
+ { 0, 3, 4, 0x02 },
+ { 1, 2, 4, 0x03 },
+ { 2, 2, 4, 0x03 },
+ { 3, 0, 4, 0x03 },
+ { 4, 0, 4, 0x03 },
+ { 5, -1, 4, 0x03 },
+ { 6, -1, 4, 0x03 },
+ { 7, -1, 4, 0x03 },
+ { 8, -1, -3, 0x01 },
+ { 7, -1, -3, 0x01 },
+ { 6, -1, -3, 0x01 },
+ { 5, -1, -3, 0x01 },
+ { 4, 0, -3, 0x01 },
+ { 3, 0, -3, 0x01 },
+ { 2, 2, -3, 0x01 },
+ { 1, 2, -3, 0x01 }
+};
+
+static const CompassDefProvider kLoLCompassDefsFMTownsProvider = { ARRAYSIZE(kLoLCompassDefsFMTowns), kLoLCompassDefsFMTowns };
+
+static const byte kLoLStashSetupFMTowns[12] = {
+ 0x04, 0x04, 0x04, 0x04, 0x02, 0x02, 0x02, 0x03,
+ 0x03, 0x00, 0x01, 0x01
+};
+
+static const ByteProvider kLoLStashSetupFMTownsProvider = { ARRAYSIZE(kLoLStashSetupFMTowns), kLoLStashSetupFMTowns };
+
+static const byte kLoLDscWallsFMTowns[36] = {
+ 0xFF, 0xFF, 0x02, 0x01, 0x02, 0x01, 0x02, 0xFF,
+ 0x02, 0x03, 0x02, 0x03, 0xFF, 0xFF, 0x02, 0x01,
+ 0x02, 0x01, 0x02, 0xFF, 0x02, 0x03, 0x02, 0x03,
+ 0x02, 0x01, 0x02, 0xFF, 0x02, 0x03, 0xFF, 0x01,
+ 0x02, 0xFF, 0xFF, 0x03
+};
+
+static const ByteProvider kLoLDscWallsFMTownsProvider = { ARRAYSIZE(kLoLDscWallsFMTowns), kLoLDscWallsFMTowns };
+
+static const byte kLoLDscShapeIndexFMTowns[36] = {
+ 0x03, 0x09, 0x03, 0x08, 0x03, 0x07, 0x03, 0x03,
+ 0x03, 0xF9, 0x03, 0xF8, 0x03, 0xF7, 0x02, 0x09,
+ 0x02, 0x06, 0x02, 0x02, 0x02, 0xFA, 0x02, 0xF7,
+ 0x01, 0x05, 0x01, 0x01, 0x01, 0xFB, 0x00, 0x04,
+ 0x00, 0x00, 0x00, 0xFC
+};
+
+static const ByteProvider kLoLDscShapeIndexFMTownsProvider = { ARRAYSIZE(kLoLDscShapeIndexFMTowns), kLoLDscShapeIndexFMTowns };
+
+static const byte kLoLDscOvlMapFMTowns[10] = {
+ 0x00, 0x01, 0x01, 0x01, 0x04, 0x05, 0x05, 0x05,
+ 0x05, 0x04
+};
+
+static const ByteProvider kLoLDscOvlMapFMTownsProvider = { ARRAYSIZE(kLoLDscOvlMapFMTowns), kLoLDscOvlMapFMTowns };
+
+static const uint16 kLoLDscScaleWidthDataFMTowns[36] = {
+ 0x0060, 0x0000, 0x0060, 0x00CE, 0x0060, 0x0055, 0x0060, 0x0000,
+ 0x0060, 0x0055, 0x0060, 0x00CE, 0x0060, 0x0000, 0x00A0, 0x00AE,
+ 0x00A0, 0x00AA, 0x00A0, 0x0000, 0x00A0, 0x00AA, 0x00A0, 0x00AE,
+ 0x0100, 0x0100, 0x0100, 0x0000, 0x0100, 0x0100, 0x0000, 0x0100,
+ 0x0100, 0x0000, 0x0000, 0x0100
+};
+
+static const Uint16Provider kLoLDscScaleWidthDataFMTownsProvider = { ARRAYSIZE(kLoLDscScaleWidthDataFMTowns), kLoLDscScaleWidthDataFMTowns };
+
+static const uint16 kLoLDscScaleHeightDataFMTowns[36] = {
+ 0x006A, 0x0000, 0x006A, 0x006A, 0x006A, 0x006A, 0x006A, 0x0000,
+ 0x006A, 0x006A, 0x006A, 0x006A, 0x006A, 0x0000, 0x00AA, 0x0056,
+ 0x00AA, 0x00AA, 0x00AA, 0x0000, 0x00AA, 0x00AA, 0x00AA, 0x0056,
+ 0x0100, 0x0100, 0x0100, 0x0000, 0x0100, 0x0100, 0x0000, 0x0100,
+ 0x0100, 0x0000, 0x0000, 0x0100
+};
+
+static const Uint16Provider kLoLDscScaleHeightDataFMTownsProvider = { ARRAYSIZE(kLoLDscScaleHeightDataFMTowns), kLoLDscScaleHeightDataFMTowns };
+
+static const uint16 kLoLDscXFMTowns[36] = {
+ 0xFFB0, 0xFFE0, 0xFFE0, 0x0010, 0x0010, 0x0040, 0x0040, 0x0000,
+ 0x0070, 0x0070, 0x00A0, 0x00A0, 0x00D0, 0x00D0, 0xFF86, 0x0000,
+ 0xFFE0, 0x0030, 0x0030, 0x0000, 0x0080, 0x0080, 0x00D0, 0x00B0,
+ 0xFF98, 0x0018, 0x0018, 0x0000, 0x0098, 0x0098, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x00B0, 0x00B0
+};
+
+static const Uint16Provider kLoLDscXFMTownsProvider = { ARRAYSIZE(kLoLDscXFMTowns), kLoLDscXFMTowns };
+
+static const byte kLoLBaseDscYFMTowns[36] = {
+ 0x1B, 0x1B, 0x1B, 0x1B, 0x1B, 0x1B, 0x1B, 0x1B,
+ 0x1B, 0x1B, 0x1B, 0x1B, 0x1B, 0x1B, 0x14, 0x1C,
+ 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x1C,
+ 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00
+};
+
+static const ByteProvider kLoLBaseDscYFMTownsProvider = { ARRAYSIZE(kLoLBaseDscYFMTowns), kLoLBaseDscYFMTowns };
+
+static const byte kLoLDscTileIndexFMTowns[18] = {
+ 0x00, 0x06, 0x01, 0x05, 0x02, 0x04, 0x03, 0x07,
+ 0x0B, 0x08, 0x0A, 0x09, 0x0C, 0x0E, 0x0D, 0x0F,
+ 0x11, 0x10
+};
+
+static const ByteProvider kLoLDscTileIndexFMTownsProvider = { ARRAYSIZE(kLoLDscTileIndexFMTowns), kLoLDscTileIndexFMTowns };
+
+static const byte kLoLDscUnk2FMTowns[23] = {
+ 0x00, 0x00, 0x00, 0x03, 0x03, 0x03, 0x03, 0x03,
+ 0x08, 0x08, 0x08, 0x08, 0x08, 0x0D, 0x0D, 0x0D,
+ 0x0D, 0x0D, 0x12, 0x12, 0x12, 0x12, 0x12
+};
+
+static const ByteProvider kLoLDscUnk2FMTownsProvider = { ARRAYSIZE(kLoLDscUnk2FMTowns), kLoLDscUnk2FMTowns };
+
+static const byte kLoLDscDoorShapeIndexFMTowns[23] = {
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01,
+ 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01
+};
+
+static const ByteProvider kLoLDscDoorShapeIndexFMTownsProvider = { ARRAYSIZE(kLoLDscDoorShapeIndexFMTowns), kLoLDscDoorShapeIndexFMTowns };
+
+static const byte kLoLDscDimData1FMTowns[324] = {
+ 0xD7, 0xD7, 0xD7, 0xD7, 0xD7, 0xD7, 0xD7, 0xD7,
+ 0xD7, 0xD7, 0xD7, 0xD7, 0xD7, 0xD7, 0xD7, 0xD7,
+ 0xD8, 0xD7, 0xD8, 0xD8, 0x02, 0xD8, 0xD8, 0xD8,
+ 0xD8, 0xFE, 0xD7, 0xD8, 0xD8, 0xD8, 0xD7, 0x03,
+ 0xD8, 0xFD, 0xD8, 0xD8, 0xD8, 0xFE, 0xD8, 0x08,
+ 0xD8, 0xD8, 0xD8, 0xFE, 0xF8, 0x06, 0xD8, 0xD8,
+ 0xFA, 0x03, 0xD8, 0xFD, 0xD8, 0xD8, 0xD8, 0xD8,
+ 0xD8, 0xD8, 0xD8, 0xD8, 0xD8, 0xD8, 0xFA, 0xD7,
+ 0x10, 0xD8, 0xFA, 0xD7, 0x10, 0xD8, 0xD8, 0xD8,
+ 0xD8, 0xD8, 0xD8, 0xF2, 0xD8, 0x14, 0xD8, 0xD8,
+ 0xD8, 0xF0, 0x0E, 0x14, 0xD8, 0xED, 0x10, 0xD8,
+ 0xD8, 0x13, 0xD8, 0xD8, 0xD8, 0xD8, 0xEC, 0xD8,
+ 0xD8, 0xD8, 0xD8, 0xD8, 0xD7, 0x14, 0xD8, 0xED,
+ 0xD7, 0xD8, 0xD8, 0x13, 0xD7, 0xD7, 0xD7, 0xD7,
+ 0xD7, 0xD7, 0xD7, 0xD7, 0xD7, 0xD7, 0xD7, 0xD7,
+ 0xD7, 0xD7, 0xD7, 0xD7, 0xD8, 0xD7, 0xD8, 0xD8,
+ 0xD8, 0xD8, 0xD8, 0xD8, 0xD8, 0xD8, 0xD7, 0xD8,
+ 0xD8, 0xD8, 0xD7, 0xD8, 0xD8, 0xD7, 0xD8, 0xD8,
+ 0xD8, 0xD8, 0xD8, 0xD8, 0xD8, 0xD8, 0xD8, 0xD8,
+ 0xD8, 0x06, 0xD8, 0xD8, 0xFA, 0x03, 0xD8, 0xFD,
+ 0xD8, 0xD8, 0xD8, 0xD8, 0xD8, 0xD8, 0xD8, 0xD8,
+ 0xD8, 0xD8, 0xFA, 0xD8, 0x10, 0xD8, 0xFA, 0xD7,
+ 0x10, 0xFD, 0xD8, 0x13, 0xD8, 0xD8, 0xD8, 0xD8,
+ 0xD8, 0xD8, 0xD8, 0xD8, 0xD8, 0xF0, 0xD8, 0xD8,
+ 0xD8, 0xED, 0x10, 0xD8, 0xD8, 0x13, 0xD8, 0xD8,
+ 0xD8, 0xD8, 0xD8, 0xD8, 0xD8, 0xD8, 0xD8, 0xD8,
+ 0xD7, 0xD8, 0xD8, 0xD8, 0xD7, 0xD8, 0xD8, 0xD7,
+ 0xD8, 0xD8, 0xD8, 0xD8, 0xD8, 0xD8, 0xD8, 0xD8,
+ 0xD8, 0xD8, 0xD8, 0xD8, 0xD8, 0x03, 0xD8, 0xFD,
+ 0xD8, 0xD8, 0xD8, 0xD8, 0xD8, 0xD8, 0xD8, 0xD8,
+ 0xD8, 0xD8, 0xD8, 0xD8, 0xD8, 0xD8, 0xFD, 0xD8,
+ 0x13, 0xFD, 0xD8, 0x13, 0xD8, 0xD8, 0xD8, 0xD8,
+ 0xD8, 0xD8, 0xD8, 0xD8, 0xD8, 0xD8, 0xD8, 0xD8,
+ 0xD8, 0xED, 0xD8, 0xD8, 0xD8, 0x13, 0xD8, 0xD8,
+ 0xD8, 0xD8, 0xD8, 0xD8, 0xD8, 0xD8, 0xD8, 0xD8,
+ 0xD8, 0xD8, 0xD8, 0xD8, 0xD8, 0xD8, 0xD8, 0xD8,
+ 0xD8, 0xD8, 0xD8, 0xD8, 0xD8, 0xD8, 0xD8, 0xD8,
+ 0xD8, 0xD8, 0xD8, 0xD8, 0xD8, 0xD8, 0xD8, 0xD8,
+ 0xD8, 0xD8, 0xD8, 0xD8, 0xD8, 0xD8, 0xD8, 0xD8,
+ 0xD8, 0xD8, 0xD8, 0xD8, 0xD8, 0xD8, 0xD8, 0xD8,
+ 0xD8, 0xD8, 0xD8, 0xD8
+};
+
+static const ByteProvider kLoLDscDimData1FMTownsProvider = { ARRAYSIZE(kLoLDscDimData1FMTowns), kLoLDscDimData1FMTowns };
+
+static const byte kLoLDscDimData2FMTowns[648] = {
+ 0x16, 0x00, 0x16, 0x00, 0x16, 0x00, 0x16, 0x00,
+ 0x16, 0x00, 0x16, 0x00, 0x16, 0x00, 0x16, 0x00,
+ 0x16, 0x00, 0x16, 0x00, 0x16, 0x00, 0x16, 0x00,
+ 0x16, 0x00, 0x16, 0x00, 0x16, 0x00, 0x16, 0x00,
+ 0x00, 0x16, 0x16, 0x00, 0x00, 0x16, 0x00, 0x16,
+ 0x00, 0x02, 0x00, 0x16, 0x00, 0x16, 0x00, 0x16,
+ 0x00, 0x16, 0x02, 0x16, 0x00, 0x04, 0x00, 0x16,
+ 0x00, 0x16, 0x00, 0x16, 0x16, 0x00, 0x00, 0x03,
+ 0x00, 0x16, 0x03, 0x16, 0x00, 0x16, 0x00, 0x16,
+ 0x00, 0x16, 0x02, 0x16, 0x00, 0x16, 0x00, 0x08,
+ 0x00, 0x16, 0x00, 0x16, 0x00, 0x16, 0x00, 0x02,
+ 0x16, 0x00, 0x00, 0x06, 0x00, 0x16, 0x00, 0x16,
+ 0x06, 0x16, 0x00, 0x03, 0x00, 0x16, 0x03, 0x00,
+ 0x00, 0x16, 0x00, 0x16, 0x00, 0x16, 0x00, 0x16,
+ 0x00, 0x16, 0x00, 0x16, 0x00, 0x16, 0x00, 0x16,
+ 0x00, 0x16, 0x00, 0x16, 0x06, 0x16, 0x08, 0x0E,
+ 0x00, 0x10, 0x00, 0x16, 0x03, 0x16, 0x06, 0x10,
+ 0x00, 0x13, 0x00, 0x16, 0x00, 0x16, 0x00, 0x16,
+ 0x00, 0x16, 0x00, 0x16, 0x00, 0x16, 0x0E, 0x16,
+ 0x00, 0x16, 0x00, 0x14, 0x00, 0x16, 0x00, 0x16,
+ 0x00, 0x16, 0x10, 0x16, 0x16, 0x00, 0x00, 0x14,
+ 0x00, 0x16, 0x13, 0x16, 0x00, 0x10, 0x00, 0x16,
+ 0x00, 0x16, 0x00, 0x13, 0x00, 0x16, 0x00, 0x16,
+ 0x00, 0x16, 0x00, 0x16, 0x14, 0x16, 0x00, 0x16,
+ 0x00, 0x16, 0x00, 0x16, 0x00, 0x16, 0x00, 0x16,
+ 0x12, 0x16, 0x14, 0x16, 0x00, 0x16, 0x13, 0x16,
+ 0x16, 0x00, 0x00, 0x16, 0x00, 0x16, 0x00, 0x13,
+ 0x16, 0x00, 0x16, 0x00, 0x16, 0x00, 0x16, 0x00,
+ 0x16, 0x00, 0x16, 0x00, 0x16, 0x00, 0x16, 0x00,
+ 0x16, 0x00, 0x16, 0x00, 0x16, 0x00, 0x16, 0x00,
+ 0x16, 0x00, 0x16, 0x00, 0x16, 0x00, 0x16, 0x00,
+ 0x00, 0x16, 0x16, 0x00, 0x16, 0x00, 0x16, 0x00,
+ 0x16, 0x00, 0x16, 0x00, 0x16, 0x00, 0x16, 0x00,
+ 0x16, 0x00, 0x16, 0x00, 0x16, 0x00, 0x16, 0x00,
+ 0x16, 0x00, 0x16, 0x00, 0x16, 0x00, 0x16, 0x00,
+ 0x16, 0x00, 0x16, 0x00, 0x00, 0x16, 0x16, 0x00,
+ 0x00, 0x16, 0x00, 0x16, 0x00, 0x16, 0x00, 0x16,
+ 0x00, 0x16, 0x00, 0x16, 0x00, 0x16, 0x00, 0x16,
+ 0x00, 0x16, 0x00, 0x06, 0x00, 0x16, 0x00, 0x16,
+ 0x06, 0x16, 0x00, 0x03, 0x00, 0x16, 0x03, 0x16,
+ 0x00, 0x16, 0x00, 0x16, 0x00, 0x16, 0x00, 0x16,
+ 0x00, 0x16, 0x00, 0x16, 0x00, 0x16, 0x00, 0x16,
+ 0x00, 0x16, 0x00, 0x16, 0x06, 0x16, 0x00, 0x16,
+ 0x00, 0x10, 0x00, 0x16, 0x03, 0x16, 0x07, 0x0F,
+ 0x00, 0x13, 0x03, 0x16, 0x00, 0x16, 0x00, 0x13,
+ 0x00, 0x16, 0x00, 0x16, 0x00, 0x16, 0x00, 0x16,
+ 0x00, 0x16, 0x00, 0x16, 0x00, 0x16, 0x00, 0x16,
+ 0x00, 0x16, 0x10, 0x16, 0x00, 0x16, 0x00, 0x16,
+ 0x00, 0x16, 0x13, 0x16, 0x00, 0x10, 0x00, 0x16,
+ 0x00, 0x16, 0x00, 0x13, 0x16, 0x00, 0x16, 0x00,
+ 0x16, 0x00, 0x16, 0x00, 0x16, 0x00, 0x16, 0x00,
+ 0x16, 0x00, 0x16, 0x00, 0x16, 0x00, 0x16, 0x00,
+ 0x16, 0x00, 0x16, 0x00, 0x16, 0x00, 0x16, 0x00,
+ 0x16, 0x00, 0x16, 0x00, 0x00, 0x16, 0x16, 0x00,
+ 0x00, 0x16, 0x00, 0x16, 0x00, 0x16, 0x00, 0x16,
+ 0x00, 0x16, 0x00, 0x16, 0x00, 0x16, 0x00, 0x16,
+ 0x00, 0x16, 0x00, 0x16, 0x00, 0x16, 0x00, 0x16,
+ 0x00, 0x16, 0x00, 0x03, 0x00, 0x16, 0x03, 0x16,
+ 0x00, 0x16, 0x00, 0x16, 0x00, 0x16, 0x00, 0x16,
+ 0x00, 0x16, 0x00, 0x16, 0x00, 0x16, 0x00, 0x16,
+ 0x00, 0x16, 0x00, 0x16, 0x00, 0x16, 0x00, 0x16,
+ 0x00, 0x16, 0x00, 0x16, 0x03, 0x16, 0x00, 0x16,
+ 0x00, 0x13, 0x03, 0x16, 0x00, 0x16, 0x00, 0x13,
+ 0x00, 0x16, 0x00, 0x16, 0x00, 0x16, 0x00, 0x16,
+ 0x00, 0x16, 0x00, 0x16, 0x00, 0x16, 0x00, 0x16,
+ 0x00, 0x16, 0x00, 0x16, 0x00, 0x16, 0x00, 0x16,
+ 0x00, 0x16, 0x13, 0x16, 0x00, 0x16, 0x00, 0x16,
+ 0x00, 0x16, 0x00, 0x13, 0x00, 0x16, 0x00, 0x16,
+ 0x00, 0x16, 0x00, 0x16, 0x00, 0x16, 0x00, 0x16,
+ 0x00, 0x16, 0x00, 0x16, 0x00, 0x16, 0x00, 0x16,
+ 0x00, 0x16, 0x00, 0x16, 0x00, 0x16, 0x00, 0x16,
+ 0x00, 0x16, 0x00, 0x16, 0x00, 0x16, 0x00, 0x16,
+ 0x00, 0x16, 0x00, 0x16, 0x00, 0x16, 0x00, 0x16,
+ 0x00, 0x16, 0x00, 0x16, 0x00, 0x16, 0x00, 0x16,
+ 0x00, 0x16, 0x00, 0x16, 0x00, 0x16, 0x00, 0x16,
+ 0x00, 0x16, 0x00, 0x16, 0x00, 0x16, 0x00, 0x16,
+ 0x00, 0x16, 0x00, 0x16, 0x00, 0x16, 0x00, 0x16,
+ 0x00, 0x16, 0x00, 0x16, 0x00, 0x16, 0x00, 0x16,
+ 0x00, 0x16, 0x00, 0x16, 0x00, 0x16, 0x00, 0x16,
+ 0x00, 0x16, 0x00, 0x16, 0x00, 0x16, 0x00, 0x16,
+ 0x00, 0x16, 0x00, 0x16, 0x00, 0x16, 0x00, 0x16
+};
+
+static const ByteProvider kLoLDscDimData2FMTownsProvider = { ARRAYSIZE(kLoLDscDimData2FMTowns), kLoLDscDimData2FMTowns };
+
+static const byte kLoLDscBlockMapFMTowns[12] = {
+ 0x02, 0x03, 0x00, 0x01, 0x01, 0x02, 0x03, 0x00,
+ 0x03, 0x00, 0x01, 0x02
+};
+
+static const ByteProvider kLoLDscBlockMapFMTownsProvider = { ARRAYSIZE(kLoLDscBlockMapFMTowns), kLoLDscBlockMapFMTowns };
+
+static const byte kLoLDscDimMapFMTowns[18] = {
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01,
+ 0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x02, 0x03,
+ 0x03, 0x03
+};
+
+static const ByteProvider kLoLDscDimMapFMTownsProvider = { ARRAYSIZE(kLoLDscDimMapFMTowns), kLoLDscDimMapFMTowns };
+
+static const byte kLoLDscOvlIndexFMTowns[20] = {
+ 0x00, 0x00, 0x01, 0x01, 0x01, 0x02, 0x02, 0x03,
+ 0x03, 0x03, 0x04, 0x04, 0x05, 0x05, 0x05, 0x06,
+ 0x06, 0x07, 0x07, 0x07
+};
+
+static const ByteProvider kLoLDscOvlIndexFMTownsProvider = { ARRAYSIZE(kLoLDscOvlIndexFMTowns), kLoLDscOvlIndexFMTowns };
+
+static const byte kLoLDscBlockIndexFMTowns[72] = {
+ 0x9D, 0x9E, 0x9F, 0xA0, 0xA1, 0xA2, 0xA3, 0xBE,
+ 0xBF, 0xC0, 0xC1, 0xC2, 0xDF, 0xE0, 0xE1, 0xFF,
+ 0x00, 0x01, 0xA3, 0xC3, 0xE3, 0x03, 0x23, 0x43,
+ 0x63, 0xC2, 0xE2, 0x02, 0x22, 0x42, 0xE1, 0x01,
+ 0x21, 0xE0, 0x00, 0x20, 0x63, 0x62, 0x61, 0x60,
+ 0x5F, 0x5E, 0x5D, 0x42, 0x41, 0x40, 0x3F, 0x3E,
+ 0x21, 0x20, 0x1F, 0x01, 0x00, 0xFF, 0x5D, 0x3D,
+ 0x1D, 0xFD, 0xDD, 0xBD, 0x9D, 0x3E, 0x1E, 0xFE,
+ 0xDE, 0xBE, 0x1F, 0xFF, 0xDF, 0x20, 0x00, 0xE0
+};
+
+static const ByteProvider kLoLDscBlockIndexFMTownsProvider = { ARRAYSIZE(kLoLDscBlockIndexFMTowns), kLoLDscBlockIndexFMTowns };
+
+static const byte kLoLDscDoorY2FMTowns[128] = {
+ 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
+ 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F,
+ 0x10, 0x11, 0x12, 0x13, 0x14, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x0D, 0x08, 0x03, 0x12, 0x0E, 0x09, 0x04, 0x00,
+ 0x13, 0x0F, 0x0A, 0x05, 0x01, 0x14, 0x10, 0x0B,
+ 0x06, 0x02, 0x11, 0x0C, 0x07, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x14, 0x13, 0x12, 0x11, 0x10, 0x0F, 0x0E, 0x0D,
+ 0x0C, 0x0B, 0x0A, 0x09, 0x08, 0x07, 0x06, 0x05,
+ 0x04, 0x03, 0x02, 0x01, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x07, 0x0C, 0x11, 0x02, 0x06, 0x0B, 0x10, 0x14,
+ 0x01, 0x05, 0x0A, 0x0F, 0x13, 0x00, 0x04, 0x09,
+ 0x0E, 0x12, 0x03, 0x08, 0x0D, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+};
+
+static const ByteProvider kLoLDscDoorY2FMTownsProvider = { ARRAYSIZE(kLoLDscDoorY2FMTowns), kLoLDscDoorY2FMTowns };
+
+static const byte kLoLDscDoorFrameY1FMTowns[4] = {
+ 0x1E, 0x18, 0x10, 0x00
+};
+
+static const ByteProvider kLoLDscDoorFrameY1FMTownsProvider = { ARRAYSIZE(kLoLDscDoorFrameY1FMTowns), kLoLDscDoorFrameY1FMTowns };
+
+static const byte kLoLDscDoorFrameY2FMTowns[4] = {
+ 0x3B, 0x47, 0x56, 0x78
+};
+
+static const ByteProvider kLoLDscDoorFrameY2FMTownsProvider = { ARRAYSIZE(kLoLDscDoorFrameY2FMTowns), kLoLDscDoorFrameY2FMTowns };
+
+static const uint16 kLoLDscDoorScaleFMTowns[8] = {
+ 0x0075, 0x006A, 0x00B9, 0x00B2, 0x0100, 0x0100, 0x0000, 0x0000
+};
+
+static const Uint16Provider kLoLDscDoorScaleFMTownsProvider = { ARRAYSIZE(kLoLDscDoorScaleFMTowns), kLoLDscDoorScaleFMTowns };
+
+static const uint16 kLoLDscDoor4FMTowns[4] = {
+ 0x0005, 0x0002, 0x0008, 0x0000
+};
+
+static const Uint16Provider kLoLDscDoor4FMTownsProvider = { ARRAYSIZE(kLoLDscDoor4FMTowns), kLoLDscDoor4FMTowns };
+
+static const uint16 kLoLDscDoorXFMTowns[576] = {
+ 0xFF98, 0xFFA0, 0xFFA8, 0xFF90, 0xFF98, 0xFFA0, 0xFFA8, 0xFFB0,
+ 0xFF74, 0xFF7E, 0xFF88, 0xFF92, 0xFF9C, 0xFF74, 0xFF7E, 0xFF88,
+ 0xFF92, 0xFF9C, 0xFF64, 0xFF70, 0xFF7C, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0xFFB8, 0xFFC0, 0xFFC8, 0xFFB0, 0xFFB8, 0xFFC0, 0xFFC8, 0xFFD0,
+ 0xFF9C, 0xFFA6, 0xFFB0, 0xFFBA, 0xFFC4, 0xFF9C, 0xFFA6, 0xFFB0,
+ 0xFFBA, 0xFFC4, 0xFF94, 0xFFA0, 0xFFAC, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0xFFD8, 0xFFE0, 0xFFE8, 0xFFD0, 0xFFD8, 0xFFE0, 0xFFE8, 0xFFF0,
+ 0xFFC4, 0xFFCE, 0xFFD8, 0xFFE2, 0xFFEC, 0xFFC4, 0xFFCE, 0xFFD8,
+ 0xFFE2, 0xFFEC, 0xFFC4, 0xFFD0, 0xFFDC, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0xFFF8, 0x0000, 0x0008, 0xFFF0, 0xFFF8, 0x0000, 0x0008, 0x0010,
+ 0xFFEC, 0xFFF6, 0x0000, 0x000A, 0x0014, 0xFFEC, 0xFFF6, 0x0000,
+ 0x000A, 0x0014, 0xFFF4, 0x0000, 0x000C, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0018, 0x0020, 0x0028, 0x0010, 0x0018, 0x0020, 0x0028, 0x0030,
+ 0x0014, 0x001E, 0x0028, 0x0032, 0x003C, 0x0014, 0x001E, 0x0028,
+ 0x0032, 0x003C, 0x0024, 0x0030, 0x003C, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0038, 0x0040, 0x0048, 0x0030, 0x0038, 0x0040, 0x0048, 0x0050,
+ 0x003C, 0x0046, 0x0050, 0x005A, 0x0064, 0x003C, 0x0046, 0x0050,
+ 0x005A, 0x0064, 0x0054, 0x0060, 0x006C, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0058, 0x0060, 0x0068, 0x0050, 0x0058, 0x0060, 0x0068, 0x0070,
+ 0x0064, 0x006E, 0x0078, 0x0082, 0x008C, 0x0064, 0x006E, 0x0078,
+ 0x0082, 0x008C, 0x0084, 0x0090, 0x009C, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0xFF94, 0xFFA0, 0xFFAC, 0xFF7E, 0xFF8B, 0xFF98, 0xFFA5, 0xFFB2,
+ 0xFF6C, 0xFF7B, 0xFF8A, 0xFF99, 0xFFA7, 0xFF60, 0xFF70, 0xFF80,
+ 0xFF90, 0xFFA0, 0xFF4C, 0xFF60, 0xFF74, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0xFFC4, 0xFFD0, 0xFFDC, 0xFFB2, 0xFFBF, 0xFFCC, 0xFFD9, 0xFFE6,
+ 0xFFA7, 0xFFB6, 0xFFC5, 0xFFD4, 0xFFE2, 0xFFA0, 0xFFB0, 0xFFC0,
+ 0xFFD0, 0xFFE0, 0xFF9C, 0xFFB0, 0xFFC4, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0xFFF4, 0x0000, 0x000C, 0xFFE6, 0xFFF3, 0x0000, 0x000D, 0x001A,
+ 0xFFE2, 0xFFF1, 0x0000, 0x000F, 0x001E, 0xFFE0, 0xFFF0, 0x0000,
+ 0x0010, 0x0020, 0xFFEC, 0x0000, 0x0014, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0024, 0x0030, 0x003C, 0x001A, 0x0027, 0x0034, 0x0041, 0x004E,
+ 0x001E, 0x002C, 0x003B, 0x004A, 0x0059, 0x0020, 0x0030, 0x0040,
+ 0x0050, 0x0060, 0x003C, 0x0050, 0x0064, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0054, 0x0060, 0x006C, 0x004E, 0x005B, 0x0068, 0x0075, 0x0082,
+ 0x0059, 0x0067, 0x0076, 0x0085, 0x0094, 0x0060, 0x0070, 0x0080,
+ 0x0090, 0x00A0, 0x008C, 0x00A0, 0x00B4, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0xFF9C, 0xFFB0, 0xFFC4, 0xFF7C, 0xFF92, 0xFFA8, 0xFFBE, 0xFFD4,
+ 0xFF6D, 0xFF85, 0xFF9E, 0xFFB6, 0xFFCF, 0xFF5E, 0xFF79, 0xFF94,
+ 0xFFAF, 0xFFCA, 0xFF60, 0xFF80, 0xFFA0, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0xFFEC, 0x0000, 0x0014, 0xFFD4, 0xFFEA, 0x0000, 0x0016, 0x002C,
+ 0xFFCF, 0xFFE7, 0x0000, 0x0019, 0x0031, 0xFFCA, 0xFFE5, 0x0000,
+ 0x001B, 0x0036, 0xFFE0, 0x0000, 0x0020, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x003C, 0x0050, 0x0064, 0x002C, 0x0042, 0x0058, 0x006E, 0x0084,
+ 0x0031, 0x004A, 0x0062, 0x007B, 0x0093, 0x0036, 0x0051, 0x006C,
+ 0x0087, 0x00A2, 0x0060, 0x0080, 0x00A0, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0xFF60, 0xFF80, 0xFFA0, 0xFF1C, 0xFF42, 0xFF68, 0xFF8E, 0xFFB4,
+ 0xFF40, 0xFF60, 0xFF80, 0xFFA0, 0xFFC0, 0xFF1C, 0xFF42, 0xFF68,
+ 0xFF8E, 0xFFB4, 0xFF60, 0xFF80, 0xFFA0, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0xFFE0, 0x0000, 0x0020, 0xFFB4, 0xFFDA, 0x0000, 0x0026, 0x004C,
+ 0xFFC0, 0xFFE0, 0x0000, 0x0020, 0x0040, 0xFFB4, 0xFFDA, 0x0000,
+ 0x0026, 0x004C, 0xFFE0, 0x0000, 0x0020, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0060, 0x0080, 0x00A0, 0x004C, 0x0072, 0x0098, 0x00BE, 0x00E4,
+ 0x0040, 0x0060, 0x0080, 0x00A0, 0x00C0, 0x004C, 0x0072, 0x0098,
+ 0x00BE, 0x00E4, 0x0060, 0x0080, 0x00A0, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000
+};
+
+static const Uint16Provider kLoLDscDoorXFMTownsProvider = { ARRAYSIZE(kLoLDscDoorXFMTowns), kLoLDscDoorXFMTowns };
+
+static const uint16 kLoLDscDoorYFMTowns[576] = {
+ 0xFFBF, 0xFFBF, 0xFFBF, 0xFFC1, 0xFFC1, 0xFFC1, 0xFFC1, 0xFFC1,
+ 0xFFC3, 0xFFC3, 0xFFC3, 0xFFC3, 0xFFC3, 0xFFC5, 0xFFC5, 0xFFC5,
+ 0xFFC5, 0xFFC5, 0xFFC9, 0xFFC9, 0xFFC9, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0xFFBF, 0xFFBF, 0xFFBF, 0xFFC1, 0xFFC1, 0xFFC1, 0xFFC1, 0xFFC1,
+ 0xFFC3, 0xFFC3, 0xFFC3, 0xFFC3, 0xFFC3, 0xFFC5, 0xFFC5, 0xFFC5,
+ 0xFFC5, 0xFFC5, 0xFFC9, 0xFFC9, 0xFFC9, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0xFFBF, 0xFFBF, 0xFFBF, 0xFFC1, 0xFFC1, 0xFFC1, 0xFFC1, 0xFFC1,
+ 0xFFC3, 0xFFC3, 0xFFC3, 0xFFC3, 0xFFC3, 0xFFC5, 0xFFC5, 0xFFC5,
+ 0xFFC5, 0xFFC5, 0xFFC9, 0xFFC9, 0xFFC9, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0xFFBF, 0xFFBF, 0xFFBF, 0xFFC1, 0xFFC1, 0xFFC1, 0xFFC1, 0xFFC1,
+ 0xFFC3, 0xFFC3, 0xFFC3, 0xFFC3, 0xFFC3, 0xFFC5, 0xFFC5, 0xFFC5,
+ 0xFFC5, 0xFFC5, 0xFFC9, 0xFFC9, 0xFFC9, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0xFFBF, 0xFFBF, 0xFFBF, 0xFFC1, 0xFFC1, 0xFFC1, 0xFFC1, 0xFFC1,
+ 0xFFC3, 0xFFC3, 0xFFC3, 0xFFC3, 0xFFC3, 0xFFC5, 0xFFC5, 0xFFC5,
+ 0xFFC5, 0xFFC5, 0xFFC9, 0xFFC9, 0xFFC9, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0xFFBF, 0xFFBF, 0xFFBF, 0xFFC1, 0xFFC1, 0xFFC1, 0xFFC1, 0xFFC1,
+ 0xFFC3, 0xFFC3, 0xFFC3, 0xFFC3, 0xFFC3, 0xFFC5, 0xFFC5, 0xFFC5,
+ 0xFFC5, 0xFFC5, 0xFFC9, 0xFFC9, 0xFFC9, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0xFFBF, 0xFFBF, 0xFFBF, 0xFFC1, 0xFFC1, 0xFFC1, 0xFFC1, 0xFFC1,
+ 0xFFC3, 0xFFC3, 0xFFC3, 0xFFC3, 0xFFC3, 0xFFC5, 0xFFC5, 0xFFC5,
+ 0xFFC5, 0xFFC5, 0xFFC9, 0xFFC9, 0xFFC9, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0xFFC9, 0xFFC9, 0xFFC9, 0xFFCB, 0xFFCB, 0xFFCB, 0xFFCB, 0xFFCB,
+ 0xFFCE, 0xFFCE, 0xFFCE, 0xFFCE, 0xFFCE, 0xFFD3, 0xFFD3, 0xFFD3,
+ 0xFFD3, 0xFFD3, 0xFFD7, 0xFFD7, 0xFFD7, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0xFFC9, 0xFFC9, 0xFFC9, 0xFFCB, 0xFFCB, 0xFFCB, 0xFFCB, 0xFFCB,
+ 0xFFCE, 0xFFCE, 0xFFCE, 0xFFCE, 0xFFCE, 0xFFD3, 0xFFD3, 0xFFD3,
+ 0xFFD3, 0xFFD3, 0xFFD7, 0xFFD7, 0xFFD7, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0xFFC9, 0xFFC9, 0xFFC9, 0xFFCB, 0xFFCB, 0xFFCB, 0xFFCB, 0xFFCB,
+ 0xFFCE, 0xFFCE, 0xFFCE, 0xFFCE, 0xFFCE, 0xFFD3, 0xFFD3, 0xFFD3,
+ 0xFFD3, 0xFFD3, 0xFFD7, 0xFFD7, 0xFFD7, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0xFFC9, 0xFFC9, 0xFFC9, 0xFFCB, 0xFFCB, 0xFFCB, 0xFFCB, 0xFFCB,
+ 0xFFCE, 0xFFCE, 0xFFCE, 0xFFCE, 0xFFCE, 0xFFD3, 0xFFD3, 0xFFD3,
+ 0xFFD3, 0xFFD3, 0xFFD7, 0xFFD7, 0xFFD7, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0xFFC9, 0xFFC9, 0xFFC9, 0xFFCB, 0xFFCB, 0xFFCB, 0xFFCB, 0xFFCB,
+ 0xFFCE, 0xFFCE, 0xFFCE, 0xFFCE, 0xFFCE, 0xFFD3, 0xFFD3, 0xFFD3,
+ 0xFFD3, 0xFFD3, 0xFFD7, 0xFFD7, 0xFFD7, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0xFFD7, 0xFFD7, 0xFFD7, 0xFFDD, 0xFFDD, 0xFFDD, 0xFFDD, 0xFFDD,
+ 0xFFE2, 0xFFE2, 0xFFE2, 0xFFE2, 0xFFE2, 0xFFEA, 0xFFEA, 0xFFEA,
+ 0xFFEA, 0xFFEA, 0xFFF8, 0xFFF8, 0xFFF8, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0xFFD7, 0xFFD7, 0xFFD7, 0xFFDD, 0xFFDD, 0xFFDD, 0xFFDD, 0xFFDD,
+ 0xFFE2, 0xFFE2, 0xFFE2, 0xFFE2, 0xFFE2, 0xFFEA, 0xFFEA, 0xFFEA,
+ 0xFFEA, 0xFFEA, 0xFFF8, 0xFFF8, 0xFFF8, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0xFFD7, 0xFFD7, 0xFFD7, 0xFFDD, 0xFFDD, 0xFFDD, 0xFFDD, 0xFFDD,
+ 0xFFE2, 0xFFE2, 0xFFE2, 0xFFE2, 0xFFE2, 0xFFEA, 0xFFEA, 0xFFEA,
+ 0xFFEA, 0xFFEA, 0xFFF8, 0xFFF8, 0xFFF8, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0xFFF8, 0xFFF8, 0xFFF8, 0xFFFC, 0xFFFC, 0xFFFC, 0xFFFC, 0xFFFC,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0xFFF8, 0xFFF8, 0xFFF8, 0xFFFC, 0xFFFC, 0xFFFC, 0xFFFC, 0xFFFC,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0xFFF8, 0xFFF8, 0xFFF8, 0xFFFC, 0xFFFC, 0xFFFC, 0xFFFC, 0xFFFC,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000
+};
+
+static const Uint16Provider kLoLDscDoorYFMTownsProvider = { ARRAYSIZE(kLoLDscDoorYFMTowns), kLoLDscDoorYFMTowns };
+
+static const byte kLoLScrollXTopFMTowns[5] = {
+ 0x05, 0x0A, 0x0F, 0x14, 0x19
+};
+
+static const ByteProvider kLoLScrollXTopFMTownsProvider = { ARRAYSIZE(kLoLScrollXTopFMTowns), kLoLScrollXTopFMTowns };
+
+static const byte kLoLScrollYTopFMTowns[5] = {
+ 0x02, 0x04, 0x07, 0x09, 0x0C
+};
+
+static const ByteProvider kLoLScrollYTopFMTownsProvider = { ARRAYSIZE(kLoLScrollYTopFMTowns), kLoLScrollYTopFMTowns };
+
+static const byte kLoLScrollXBottomFMTowns[5] = {
+ 0x05, 0x0A, 0x0F, 0x14, 0x19
+};
+
+static const ByteProvider kLoLScrollXBottomFMTownsProvider = { ARRAYSIZE(kLoLScrollXBottomFMTowns), kLoLScrollXBottomFMTowns };
+
+static const byte kLoLScrollYBottomFMTowns[5] = {
+ 0x04, 0x08, 0x0C, 0x10, 0x14
+};
+
+static const ByteProvider kLoLScrollYBottomFMTownsProvider = { ARRAYSIZE(kLoLScrollYBottomFMTowns), kLoLScrollYBottomFMTowns };
+
+static const LoLButtonDef kLoLButtonDefsFMTowns[95] = {
+ { 0x1100, 30, 56, 33, 131, 22, 19, 0x0000, 0 },
+ { 0x1100, 31, 53, 33, 150, 22, 18, 0x0000, 0 },
+ { 0x1100, 31, 53, 33, 150, 22, 18, 0x0000, 0 },
+ { 0x1100, 29, 52, 11, 150, 22, 18, 0x0000, 0 },
+ { 0x1100, 28, 54, 53, 150, 22, 18, 0x0000, 0 },
+ { 0x1100, 127, 55, 11, 131, 22, 19, 0x0000, 0 },
+ { 0x1100, 18, 57, 53, 131, 22, 19, 0x0000, 0 },
+ { 0x0100, 49, 0, 80, 143, 22, 17, 0x0000, 0 },
+ { 0x0100, 50, 0, 80, 143, 22, 17, 0x0001, 0 },
+ { 0x0100, 51, 0, 80, 143, 22, 17, 0x0002, 0 },
+ { 0x0100, 48, 0, 80, 143, 22, 17, 0x0003, 0 },
+ { 0x1100, 0, 0, 80, 160, 22, 17, 0x0000, 0 },
+ { 0x1100, 0, 0, 80, 160, 22, 17, 0x0001, 0 },
+ { 0x1100, 0, 0, 80, 160, 22, 17, 0x0002, 0 },
+ { 0x1100, 0, 0, 80, 160, 22, 17, 0x0003, 0 },
+ { 0x1100, 0, 0, 80, 144, 22, 32, 0x0000, 0 },
+ { 0x1100, 27, 0, 0, 0, 320, 200, 0x0003, 0 },
+ { 0x0100, 0, 0, 80, 143, 33, 34, 0x0000, 0 },
+ { 0x0100, 0, 0, 80, 143, 33, 34, 0x0001, 0 },
+ { 0x0100, 0, 0, 80, 143, 33, 34, 0x0002, 0 },
+ { 0x0100, 0, 0, 80, 143, 33, 34, 0x0003, 0 },
+ { 0x0100, 0, 0, 80, 143, 66, 34, 0x0000, 0 },
+ { 0x0100, 0, 0, 80, 143, 66, 34, 0x0001, 0 },
+ { 0x0100, 0, 0, 80, 143, 66, 34, 0x0002, 0 },
+ { 0x0100, 0, 0, 80, 143, 66, 34, 0x0003, 0 },
+ { 0x0100, 0, 0, 80, 143, 12, 34, 0x0000, 0 },
+ { 0x0100, 0, 0, 80, 143, 12, 34, 0x0001, 0 },
+ { 0x0100, 0, 0, 80, 143, 12, 34, 0x0002, 0 },
+ { 0x0100, 0, 0, 80, 143, 12, 34, 0x0003, 0 },
+ { 0x1000, 0, 0, 80, 143, 66, 34, 0x0000, 0 },
+ { 0x1000, 0, 0, 80, 143, 66, 34, 0x0001, 0 },
+ { 0x1000, 0, 0, 80, 143, 66, 34, 0x0002, 0 },
+ { 0x1000, 0, 0, 80, 143, 66, 34, 0x0003, 0 },
+ { 0x1100, 0, 0, 0, 0, 20, 19, 0x0000, 2 },
+ { 0x1100, 0, 0, 0, 0, 20, 19, 0x0001, 2 },
+ { 0x1100, 0, 0, 0, 0, 20, 19, 0x0002, 2 },
+ { 0x1100, 0, 0, 0, 0, 20, 19, 0x0003, 2 },
+ { 0x1100, 0, 0, 0, 0, 20, 19, 0x0004, 2 },
+ { 0x1100, 0, 0, 0, 0, 20, 19, 0x0005, 2 },
+ { 0x1100, 0, 0, 0, 0, 20, 19, 0x0006, 2 },
+ { 0x1100, 0, 0, 0, 0, 20, 19, 0x0007, 2 },
+ { 0x1100, 0, 0, 0, 0, 20, 19, 0x0008, 2 },
+ { 0x1100, 0, 0, 0, 0, 12, 11, 0x0009, 2 },
+ { 0x1100, 0, 0, 0, 0, 12, 11, 0x000A, 2 },
+ { 0x1100, 27, 0, 160, 93, 43, 19, 0x0000, 2 },
+ { 0x1100, 0, 0, 0, 102, 88, 19, 0x0000, 2 },
+ { 0x1100, 0, 0, 88, 102, 88, 19, 0x0001, 2 },
+ { 0x1100, 0, 0, 0, 85, 88, 17, 0x0002, 2 },
+ { 0x1100, 0, 0, 88, 85, 88, 17, 0x0003, 2 },
+ { 0x1100, 0, 0, 0, 0, 176, 120, 0x0000, 2 },
+ { 0x1100, 0, 0, 106, 179, 21, 21, 0x0000, 0 },
+ { 0x1100, 0, 0, 127, 179, 21, 21, 0x0001, 0 },
+ { 0x1100, 0, 0, 148, 179, 21, 21, 0x0002, 0 },
+ { 0x1100, 0, 0, 169, 179, 21, 21, 0x0003, 0 },
+ { 0x1100, 0, 0, 190, 179, 21, 21, 0x0004, 0 },
+ { 0x1100, 0, 0, 211, 179, 21, 21, 0x0005, 0 },
+ { 0x1100, 0, 0, 232, 179, 21, 21, 0x0006, 0 },
+ { 0x1100, 0, 0, 253, 179, 21, 21, 0x0007, 0 },
+ { 0x1100, 0, 0, 274, 179, 21, 21, 0x0008, 0 },
+ { 0x1100, 0, 0, 274, 179, 21, 21, 0x0009, 0 },
+ { 0x1100, 0, 0, 85, 179, 21, 21, 0xFFFF, 0 },
+ { 0x1100, 0, 0, 295, 179, 22, 21, 0x0001, 0 },
+ { 0x1100, 0, 0, 24, 8, 128, 96, 0x0001, 2 },
+ { 0x1100, 0, 0, 0, 0, 176, 120, 0x0000, 2 },
+ { 0x1100, 0, 0, 0, 0, 0, 0, 0x0000, 0 },
+ { 0x1100, 0, 0, 112, 0, 176, 16, 0x0001, 0 },
+ { 0x1100, 0, 0, 112, 110, 176, 26, 0x0001, 0 },
+ { 0x1100, 0, 0, 96, 88, 32, 32, 0x0001, 0 },
+ { 0x1100, 0, 0, 272, 88, 32, 32, 0x0001, 0 },
+ { 0x1100, 0, 0, 96, 16, 32, 72, 0x0001, 0 },
+ { 0x1100, 0, 0, 272, 16, 32, 72, 0x0001, 0 },
+ { 0x1100, 0, 0, 24, 15, 61, 9, 0x0000, 0 },
+ { 0x1100, 0, 0, 24, 24, 61, 9, 0x0000, 0 },
+ { 0x1100, 0, 0, 24, 33, 61, 9, 0x0000, 0 },
+ { 0x1100, 0, 0, 24, 42, 61, 9, 0x0000, 0 },
+ { 0x1100, 0, 0, 24, 51, 61, 9, 0x0000, 0 },
+ { 0x1100, 0, 0, 24, 60, 61, 9, 0x0000, 0 },
+ { 0x1100, 0, 0, 24, 69, 61, 9, 0x0000, 0 },
+ { 0x1100, 0, 0, 24, 78, 61, 9, 0x0000, 0 },
+ { 0x1100, 0, 0, 24, 87, 61, 9, 0x0000, 0 },
+ { 0x1100, 0, 0, 24, 96, 61, 9, 0x0000, 0 },
+ { 0x0100, 0, 0, 80, 143, 66, 34, 0x0000, 0 },
+ { 0x0100, 0, 0, 80, 143, 66, 34, 0x0001, 0 },
+ { 0x0100, 0, 0, 80, 143, 66, 34, 0x0002, 0 },
+ { 0x0100, 0, 0, 80, 143, 66, 34, 0x0003, 0 },
+ { 0x1100, 27, 0, 0, 0, 320, 200, 0x0003, 0 },
+ { 0x0100, 0, 0, 112, 0, 88, 80, 0x0000, 0 },
+ { 0x0100, 0, 0, 200, 0, 88, 80, 0x0001, 0 },
+ { 0x1100, 79, 27, 11, 178, 21, 22, 0x0000, 0 },
+ { 0x0100, 82, 0, 32, 178, 22, 22, 0x0000, 0 },
+ { 0x0100, 0, 0, 291, 96, 27, 24, 0x0000, 0 },
+ { 0x0100, 0, 0, 289, 0, 31, 28, 0x0000, 0 },
+ { 0x0100, 0, 0, 289, 31, 31, 23, 0x0000, 0 },
+ { 0x0100, 0, 0, 291, 56, 29, 24, 0x0000, 0 },
+ { 0x1100, 0, 0, 220, 98, 43, 19, 0x0000, 0 }
+};
+
+static const LoLButtonDefProvider kLoLButtonDefsFMTownsProvider = { ARRAYSIZE(kLoLButtonDefsFMTowns), kLoLButtonDefsFMTowns };
+
+static const byte kLoLButtonList1FMTowns[40] = {
+ 0x59, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x31,
+ 0x3E, 0x2D, 0x2E, 0x2F, 0x30, 0x56, 0x57, 0x01,
+ 0x02, 0x00, 0x03, 0x04, 0x05, 0x06, 0x32, 0x33,
+ 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3A, 0x3B,
+ 0x3C, 0x3D, 0x58, 0x5A, 0x5B, 0x5C, 0x5D, 0xFF
+};
+
+static const ByteProvider kLoLButtonList1FMTownsProvider = { ARRAYSIZE(kLoLButtonList1FMTowns), kLoLButtonList1FMTowns };
+
+static const byte kLoLButtonList2FMTowns[15] = {
+ 0x2C, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38,
+ 0x39, 0x3A, 0x3B, 0x3C, 0x3D, 0x5E, 0xFF
+};
+
+static const ByteProvider kLoLButtonList2FMTownsProvider = { ARRAYSIZE(kLoLButtonList2FMTowns), kLoLButtonList2FMTowns };
+
+static const byte kLoLButtonList3FMTowns[2] = {
+ 0x40, 0xFF
+};
+
+static const ByteProvider kLoLButtonList3FMTownsProvider = { ARRAYSIZE(kLoLButtonList3FMTowns), kLoLButtonList3FMTowns };
+
+static const byte kLoLButtonList4FMTowns[15] = {
+ 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39,
+ 0x3A, 0x3B, 0x3C, 0x3D, 0x5A, 0x5B, 0xFF
+};
+
+static const ByteProvider kLoLButtonList4FMTownsProvider = { ARRAYSIZE(kLoLButtonList4FMTowns), kLoLButtonList4FMTowns };
+
+static const byte kLoLButtonList5FMTowns[16] = {
+ 0x01, 0x02, 0x00, 0x03, 0x04, 0x05, 0x06, 0x41,
+ 0x42, 0x43, 0x44, 0x45, 0x46, 0x5A, 0x5B, 0xFF
+};
+
+static const ByteProvider kLoLButtonList5FMTownsProvider = { ARRAYSIZE(kLoLButtonList5FMTowns), kLoLButtonList5FMTowns };
+
+static const byte kLoLButtonList6FMTowns[14] = {
+ 0x2C, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38,
+ 0x39, 0x3A, 0x3B, 0x3C, 0x3D, 0xFF
+};
+
+static const ByteProvider kLoLButtonList6FMTownsProvider = { ARRAYSIZE(kLoLButtonList6FMTowns), kLoLButtonList6FMTowns };
+
+static const byte kLoLButtonList7FMTowns[3] = {
+ 0x0F, 0x10, 0xFF
+};
+
+static const ByteProvider kLoLButtonList7FMTownsProvider = { ARRAYSIZE(kLoLButtonList7FMTowns), kLoLButtonList7FMTowns };
+
+static const byte kLoLButtonList8FMTowns[2] = {
+ 0x55, 0xFF
+};
+
+static const ByteProvider kLoLButtonList8FMTownsProvider = { ARRAYSIZE(kLoLButtonList8FMTowns), kLoLButtonList8FMTowns };
+
+static const byte kLoLLegendDataFMTowns[60] = {
+ 0x0E, 0x00, 0x00, 0x07, 0x42, 0x19, 0x00, 0x00,
+ 0x08, 0x42, 0x1A, 0x00, 0x00, 0x09, 0x42, 0x0D,
+ 0x00, 0x00, 0x0A, 0x42, 0x0A, 0x00, 0x00, 0x0B,
+ 0x42, 0x0B, 0x00, 0x00, 0x0C, 0x42, 0x0F, 0x00,
+ 0x00, 0x0D, 0x42, 0x16, 0x00, 0x00, 0x0E, 0x42,
+ 0x17, 0x00, 0x00, 0x0F, 0x42, 0x11, 0x00, 0x00,
+ 0x10, 0x42, 0x12, 0x00, 0xFB, 0x51, 0x42, 0xFF,
+ 0xFF, 0xFF, 0xFF, 0xFF
+};
+
+static const ByteProvider kLoLLegendDataFMTownsProvider = { ARRAYSIZE(kLoLLegendDataFMTowns), kLoLLegendDataFMTowns };
+
+static const uint16 kLoLMapStringIdFMTowns[30] = {
+ 0xFFFF, 0x4211, 0x4212, 0x4213, 0x4214, 0x4215, 0x4216, 0x4217,
+ 0x4218, 0x4219, 0x421A, 0x421B, 0x421C, 0x421D, 0x421E, 0x421F,
+ 0x4220, 0x4221, 0x4222, 0x4223, 0x4224, 0x4225, 0x4226, 0x4227,
+ 0x4228, 0x4229, 0x422A, 0x422B, 0x422C, 0x422D
+};
+
+static const Uint16Provider kLoLMapStringIdFMTownsProvider = { ARRAYSIZE(kLoLMapStringIdFMTowns), kLoLMapStringIdFMTowns };
+
+static const byte kLoLSpellbookAnimFMTowns[28] = {
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x04, 0x00, 0x13, 0xB6, 0x04, 0x00, 0x13, 0x4D,
+ 0x04, 0x00, 0x13, 0xB9, 0x04, 0x00, 0x13, 0xB8,
+ 0x04, 0x00, 0x13, 0xBA
+};
+
+static const ByteProvider kLoLSpellbookAnimFMTownsProvider = { ARRAYSIZE(kLoLSpellbookAnimFMTowns), kLoLSpellbookAnimFMTowns };
+
+static const byte kLoLSpellbookCoordsFMTowns[12] = {
+ 0x16, 0x16, 0x16, 0x1F, 0x16, 0x28, 0x16, 0x31,
+ 0x16, 0x3A, 0x16, 0x43
+};
+
+static const ByteProvider kLoLSpellbookCoordsFMTownsProvider = { ARRAYSIZE(kLoLSpellbookCoordsFMTowns), kLoLSpellbookCoordsFMTowns };
+
+static const byte kLoLHealShapeFramesFMTowns[80] = {
+ 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x02, 0x02,
+ 0x02, 0x02, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x01, 0x01, 0x02, 0x02, 0x03, 0x03,
+ 0x03, 0x03, 0x02, 0x02, 0x01, 0x01, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05,
+ 0x05, 0x04, 0x03, 0x02, 0x01, 0x00, 0x00, 0x00,
+ 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
+ 0x07, 0x06, 0x05, 0x04, 0x03, 0x02, 0x01, 0x00,
+ 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
+ 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F
+};
+
+static const ByteProvider kLoLHealShapeFramesFMTownsProvider = { ARRAYSIZE(kLoLHealShapeFramesFMTowns), kLoLHealShapeFramesFMTowns };
+
+static const byte kLoLLightningDefsFMTowns[20] = {
+ 0x06, 0x05, 0xAB, 0x00, 0x06, 0x04, 0xAB, 0x00,
+ 0x08, 0x04, 0xAA, 0x00, 0x06, 0x03, 0xAA, 0x00,
+ 0x06, 0x02, 0xA9, 0x00
+};
+
+static const ByteProvider kLoLLightningDefsFMTownsProvider = { ARRAYSIZE(kLoLLightningDefsFMTowns), kLoLLightningDefsFMTowns };
+
+static const uint16 kLoLFireballCoordsFMTowns[256] = {
+ 0x0000, 0x0324, 0x0647, 0x096A, 0x0C8B, 0x0FAB, 0x12C7, 0x15E1,
+ 0x18F8, 0x1C0B, 0x1F19, 0x2223, 0x2527, 0x2826, 0x2B1E, 0x2E10,
+ 0x30FB, 0x33DE, 0x36B9, 0x398C, 0x3C56, 0x3F16, 0x41CD, 0x447A,
+ 0x471C, 0x49B3, 0x4C3F, 0x4EBF, 0x5133, 0x539A, 0x55F4, 0x5842,
+ 0x5A81, 0x5CB3, 0x5ED6, 0x60EB, 0x62F1, 0x64E7, 0x66CE, 0x68A5,
+ 0x6A6C, 0x6C23, 0x6DC9, 0x6F5E, 0x70E1, 0x7254, 0x73B5, 0x7503,
+ 0x7640, 0x776B, 0x7883, 0x7989, 0x7A7C, 0x7B5C, 0x7C29, 0x7CE2,
+ 0x7D89, 0x7E1C, 0x7E9C, 0x7F08, 0x7F61, 0x7FA6, 0x7FD7, 0x7FF5,
+ 0x7FFF, 0x7FF5, 0x7FD7, 0x7FA6, 0x7F61, 0x7F08, 0x7E9C, 0x7E1C,
+ 0x7D89, 0x7CE2, 0x7C29, 0x7B5C, 0x7A7C, 0x7989, 0x7883, 0x776B,
+ 0x7640, 0x7503, 0x73B5, 0x7254, 0x70E1, 0x6F5E, 0x6DC9, 0x6C23,
+ 0x6A6C, 0x68A5, 0x66CE, 0x64E7, 0x62F1, 0x60EB, 0x5ED6, 0x5CB3,
+ 0x5A81, 0x5842, 0x55F4, 0x539A, 0x5133, 0x4EBF, 0x4C3F, 0x49B3,
+ 0x471C, 0x447A, 0x41CD, 0x3F16, 0x3C56, 0x398C, 0x36B9, 0x33DE,
+ 0x30FB, 0x2E10, 0x2B1E, 0x2826, 0x2527, 0x2223, 0x1F19, 0x1C0B,
+ 0x18F8, 0x15E1, 0x12C7, 0x0FAB, 0x0C8B, 0x096A, 0x0647, 0x0324,
+ 0x0000, 0xFCDC, 0xF9B9, 0xF696, 0xF375, 0xF055, 0xED39, 0xEA1F,
+ 0xE708, 0xE3F5, 0xE0E7, 0xDDDD, 0xDAD9, 0xD7DA, 0xD4E2, 0xD1F0,
+ 0xCF05, 0xCC22, 0xC947, 0xC674, 0xC3AA, 0xC0EA, 0xBE33, 0xBB86,
+ 0xB8E4, 0xB64D, 0xB3C1, 0xB141, 0xAECD, 0xAC66, 0xAA0C, 0xA7BE,
+ 0xA57F, 0xA34D, 0xA12A, 0x9F15, 0x9D0F, 0x9B19, 0x9932, 0x975B,
+ 0x9594, 0x93DD, 0x9237, 0x90A2, 0x8F1F, 0x8DAC, 0x8C4B, 0x8AFD,
+ 0x89C0, 0x8895, 0x877D, 0x8677, 0x8584, 0x84A4, 0x83D7, 0x831E,
+ 0x8277, 0x81E4, 0x8164, 0x80F8, 0x809F, 0x805A, 0x8029, 0x800B,
+ 0x8001, 0x800B, 0x8029, 0x805A, 0x809F, 0x80F8, 0x8164, 0x81E4,
+ 0x8277, 0x831E, 0x83D7, 0x84A4, 0x8584, 0x8677, 0x877D, 0x8895,
+ 0x89C0, 0x8AFD, 0x8C4B, 0x8DAC, 0x8F1F, 0x90A2, 0x9237, 0x93DD,
+ 0x9594, 0x975B, 0x9932, 0x9B19, 0x9D0F, 0x9F15, 0xA12A, 0xA34D,
+ 0xA57F, 0xA7BE, 0xAA0C, 0xAC66, 0xAECD, 0xB141, 0xB3C1, 0xB64D,
+ 0xB8E4, 0xBB86, 0xBE33, 0xC0EA, 0xC3AA, 0xC674, 0xC947, 0xCC22,
+ 0xCF05, 0xD1F0, 0xD4E2, 0xD7DA, 0xDAD9, 0xDDDD, 0xE0E7, 0xE3F5,
+ 0xE708, 0xEA1F, 0xED39, 0xF055, 0xF375, 0xF696, 0xF9B9, 0xFCDC
+};
+
+static const Uint16Provider kLoLFireballCoordsFMTownsProvider = { ARRAYSIZE(kLoLFireballCoordsFMTowns), kLoLFireballCoordsFMTowns };
+
+static const byte kLoLCreditsFMTowns[1516] = {
+ 0x02, 0x54, 0x68, 0x65, 0x20, 0x45, 0x6E, 0x64,
+ 0x05, 0x0D, 0x0D, 0x0D, 0x02, 0x4C, 0x41, 0x4E,
+ 0x44, 0x53, 0x20, 0x4F, 0x46, 0x20, 0x4C, 0x4F,
+ 0x52, 0x45, 0x05, 0x0D, 0x01, 0x54, 0x68, 0x65,
+ 0x20, 0x54, 0x68, 0x72, 0x6F, 0x6E, 0x65, 0x20,
+ 0x6F, 0x66, 0x20, 0x43, 0x68, 0x61, 0x6F, 0x73,
+ 0x05, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D,
+ 0x0D, 0x02, 0x45, 0x58, 0x45, 0x43, 0x55, 0x54,
+ 0x49, 0x56, 0x45, 0x20, 0x50, 0x52, 0x4F, 0x44,
+ 0x55, 0x43, 0x45, 0x52, 0x05, 0x0D, 0x0D, 0x02,
+ 0x42, 0x72, 0x65, 0x74, 0x74, 0x20, 0x57, 0x2E,
+ 0x20, 0x53, 0x70, 0x65, 0x72, 0x72, 0x79, 0x05,
+ 0x0D, 0x0D, 0x0D, 0x0D, 0x02, 0x50, 0x52, 0x4F,
+ 0x44, 0x55, 0x43, 0x45, 0x52, 0x05, 0x0D, 0x0D,
+ 0x02, 0x52, 0x69, 0x63, 0x6B, 0x20, 0x47, 0x75,
+ 0x73, 0x68, 0x05, 0x0D, 0x0D, 0x0D, 0x0D, 0x02,
+ 0x50, 0x52, 0x4F, 0x44, 0x55, 0x43, 0x54, 0x20,
+ 0x43, 0x4F, 0x4F, 0x52, 0x44, 0x49, 0x4E, 0x41,
+ 0x54, 0x4F, 0x52, 0x05, 0x0D, 0x0D, 0x02, 0x43,
+ 0x61, 0x74, 0x68, 0x69, 0x65, 0x20, 0x41, 0x2E,
+ 0x20, 0x54, 0x6F, 0x64, 0x64, 0x05, 0x0D, 0x0D,
+ 0x0D, 0x0D, 0x02, 0x44, 0x45, 0x53, 0x49, 0x47,
+ 0x4E, 0x45, 0x52, 0x53, 0x05, 0x0D, 0x0D, 0x02,
+ 0x57, 0x69, 0x6C, 0x6C, 0x69, 0x61, 0x6D, 0x20,
+ 0x41, 0x6C, 0x61, 0x6E, 0x20, 0x43, 0x72, 0x75,
+ 0x6D, 0x05, 0x0D, 0x50, 0x68, 0x69, 0x6C, 0x69,
+ 0x70, 0x20, 0x57, 0x2E, 0x20, 0x47, 0x6F, 0x72,
+ 0x72, 0x6F, 0x77, 0x05, 0x0D, 0x0D, 0x0D, 0x0D,
+ 0x02, 0x4C, 0x45, 0x41, 0x44, 0x20, 0x50, 0x52,
+ 0x4F, 0x47, 0x52, 0x41, 0x4D, 0x4D, 0x45, 0x52,
+ 0x05, 0x0D, 0x0D, 0x02, 0x50, 0x68, 0x69, 0x6C,
+ 0x69, 0x70, 0x20, 0x57, 0x2E, 0x20, 0x47, 0x6F,
+ 0x72, 0x72, 0x6F, 0x77, 0x05, 0x0D, 0x0D, 0x0D,
+ 0x0D, 0x02, 0x50, 0x52, 0x4F, 0x47, 0x52, 0x41,
+ 0x4D, 0x4D, 0x45, 0x52, 0x53, 0x05, 0x0D, 0x0D,
+ 0x02, 0x4A, 0x6F, 0x65, 0x20, 0x42, 0x6F, 0x73,
+ 0x74, 0x69, 0x63, 0x05, 0x0D, 0x02, 0x53, 0x63,
+ 0x6F, 0x74, 0x74, 0x20, 0x4B, 0x2E, 0x20, 0x42,
+ 0x6F, 0x77, 0x65, 0x6E, 0x05, 0x0D, 0x02, 0x4A,
+ 0x6F, 0x68, 0x6E, 0x20, 0x4C, 0x61, 0x53, 0x61,
+ 0x6C, 0x76, 0x69, 0x61, 0x05, 0x0D, 0x02, 0x4D,
+ 0x61, 0x72, 0x6B, 0x20, 0x4D, 0x63, 0x43, 0x75,
+ 0x62, 0x62, 0x69, 0x6E, 0x05, 0x0D, 0x02, 0x4A,
+ 0x75, 0x73, 0x74, 0x69, 0x6E, 0x20, 0x4D, 0x63,
+ 0x4B, 0x69, 0x6E, 0x6E, 0x65, 0x72, 0x6E, 0x65,
+ 0x79, 0x05, 0x0D, 0x02, 0x51, 0x69, 0x6E, 0x67,
+ 0x20, 0x59, 0x75, 0x61, 0x6E, 0x05, 0x0D, 0x0D,
+ 0x0D, 0x0D, 0x02, 0x4C, 0x45, 0x41, 0x44, 0x20,
+ 0x41, 0x52, 0x54, 0x49, 0x53, 0x54, 0x05, 0x0D,
+ 0x0D, 0x02, 0x52, 0x69, 0x63, 0x6B, 0x20, 0x50,
+ 0x61, 0x72, 0x6B, 0x73, 0x05, 0x0D, 0x0D, 0x0D,
+ 0x0D, 0x02, 0x41, 0x52, 0x54, 0x49, 0x53, 0x54,
+ 0x53, 0x05, 0x0D, 0x0D, 0x02, 0x45, 0x6C, 0x69,
+ 0x65, 0x20, 0x41, 0x72, 0x61, 0x62, 0x69, 0x61,
+ 0x6E, 0x05, 0x0D, 0x02, 0x43, 0x61, 0x72, 0x79,
+ 0x20, 0x44, 0x65, 0x61, 0x6E, 0x20, 0x41, 0x76,
+ 0x65, 0x72, 0x65, 0x74, 0x74, 0x05, 0x0D, 0x02,
+ 0x45, 0x72, 0x69, 0x63, 0x20, 0x47, 0x6F, 0x6F,
+ 0x63, 0x68, 0x05, 0x0D, 0x02, 0x4A, 0x6F, 0x73,
+ 0x65, 0x70, 0x68, 0x20, 0x42, 0x2E, 0x20, 0x48,
+ 0x65, 0x77, 0x69, 0x74, 0x74, 0x20, 0x49, 0x56,
+ 0x05, 0x0D, 0x02, 0x52, 0x65, 0x6E, 0x20, 0x4F,
+ 0x6C, 0x73, 0x65, 0x6E, 0x05, 0x0D, 0x02, 0x4A,
+ 0x75, 0x64, 0x69, 0x74, 0x68, 0x20, 0x50, 0x65,
+ 0x74, 0x65, 0x72, 0x73, 0x6F, 0x6E, 0x05, 0x0D,
+ 0x02, 0x45, 0x2E, 0x4D, 0x2E, 0x20, 0x4C, 0x6F,
+ 0x75, 0x69, 0x73, 0x65, 0x20, 0x53, 0x61, 0x6E,
+ 0x64, 0x6F, 0x76, 0x61, 0x6C, 0x05, 0x0D, 0x0D,
+ 0x0D, 0x0D, 0x02, 0x4D, 0x55, 0x53, 0x49, 0x43,
+ 0x20, 0x26, 0x20, 0x53, 0x4F, 0x55, 0x4E, 0x44,
+ 0x53, 0x05, 0x0D, 0x0D, 0x02, 0x50, 0x61, 0x75,
+ 0x6C, 0x20, 0x53, 0x2E, 0x20, 0x4D, 0x75, 0x64,
+ 0x72, 0x61, 0x05, 0x0D, 0x02, 0x44, 0x77, 0x69,
+ 0x67, 0x68, 0x74, 0x20, 0x4B, 0x2E, 0x20, 0x4F,
+ 0x6B, 0x61, 0x68, 0x61, 0x72, 0x61, 0x05, 0x0D,
+ 0x02, 0x46, 0x72, 0x61, 0x6E, 0x6B, 0x20, 0x4B,
+ 0x6C, 0x65, 0x70, 0x61, 0x63, 0x6B, 0x69, 0x05,
+ 0x0D, 0x02, 0x50, 0x61, 0x74, 0x72, 0x69, 0x63,
+ 0x6B, 0x20, 0x43, 0x6F, 0x6C, 0x6C, 0x69, 0x6E,
+ 0x73, 0x05, 0x0D, 0x0D, 0x0D, 0x0D, 0x02, 0x51,
+ 0x55, 0x41, 0x4C, 0x49, 0x54, 0x59, 0x20, 0x41,
+ 0x53, 0x53, 0x55, 0x52, 0x41, 0x4E, 0x43, 0x45,
+ 0x05, 0x0D, 0x0D, 0x02, 0x4A, 0x65, 0x73, 0x73,
+ 0x65, 0x20, 0x43, 0x6C, 0x65, 0x6D, 0x69, 0x74,
+ 0x05, 0x0D, 0x02, 0x4B, 0x65, 0x6E, 0x6E, 0x65,
+ 0x74, 0x68, 0x20, 0x44, 0x75, 0x6E, 0x6E, 0x65,
+ 0x05, 0x0D, 0x02, 0x4A, 0x65, 0x66, 0x66, 0x20,
+ 0x53, 0x74, 0x65, 0x76, 0x65, 0x6E, 0x20, 0x46,
+ 0x69, 0x6C, 0x6C, 0x68, 0x61, 0x62, 0x65, 0x72,
+ 0x05, 0x0D, 0x02, 0x57, 0x69, 0x6C, 0x6C, 0x69,
+ 0x61, 0x6D, 0x20, 0x46, 0x6F, 0x73, 0x74, 0x65,
+ 0x72, 0x05, 0x0D, 0x02, 0x53, 0x63, 0x6F, 0x74,
+ 0x74, 0x20, 0x46, 0x6C, 0x65, 0x6D, 0x69, 0x6E,
+ 0x67, 0x05, 0x0D, 0x02, 0x4D, 0x69, 0x63, 0x68,
+ 0x61, 0x65, 0x6C, 0x20, 0x4C, 0x69, 0x67, 0x68,
+ 0x74, 0x6E, 0x65, 0x72, 0x05, 0x0D, 0x02, 0x47,
+ 0x6C, 0x65, 0x6E, 0x6E, 0x20, 0x53, 0x70, 0x65,
+ 0x72, 0x72, 0x79, 0x05, 0x0D, 0x02, 0x43, 0x68,
+ 0x72, 0x69, 0x73, 0x20, 0x4D, 0x63, 0x46, 0x61,
+ 0x72, 0x6C, 0x61, 0x6E, 0x64, 0x05, 0x0D, 0x02,
+ 0x53, 0x63, 0x6F, 0x74, 0x74, 0x20, 0x4D, 0x61,
+ 0x6E, 0x6E, 0x69, 0x6E, 0x67, 0x05, 0x0D, 0x02,
+ 0x50, 0x61, 0x75, 0x6C, 0x20, 0x53, 0x68, 0x6F,
+ 0x65, 0x6E, 0x65, 0x72, 0x05, 0x0D, 0x02, 0x41,
+ 0x64, 0x61, 0x6D, 0x20, 0x52, 0x79, 0x61, 0x6E,
+ 0x05, 0x0D, 0x02, 0x4D, 0x69, 0x74, 0x63, 0x68,
+ 0x20, 0x46, 0x69, 0x65, 0x6C, 0x64, 0x6D, 0x61,
+ 0x6E, 0x05, 0x0D, 0x02, 0x4A, 0x61, 0x72, 0x65,
+ 0x64, 0x20, 0x42, 0x72, 0x69, 0x6E, 0x6B, 0x6C,
+ 0x65, 0x79, 0x05, 0x0D, 0x02, 0x4A, 0x75, 0x73,
+ 0x74, 0x69, 0x6E, 0x20, 0x48, 0x61, 0x6C, 0x6C,
+ 0x05, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x02,
+ 0x56, 0x4F, 0x49, 0x43, 0x45, 0x20, 0x41, 0x43,
+ 0x54, 0x4F, 0x52, 0x53, 0x05, 0x0D, 0x0D, 0x03,
+ 0x52, 0x69, 0x63, 0x68, 0x61, 0x72, 0x64, 0x20,
+ 0x53, 0x6D, 0x69, 0x74, 0x68, 0x20, 0x61, 0x73,
+ 0x05, 0x04, 0x4B, 0x49, 0x4E, 0x47, 0x20, 0x52,
+ 0x49, 0x43, 0x48, 0x41, 0x52, 0x44, 0x05, 0x0D,
+ 0x03, 0x45, 0x72, 0x69, 0x63, 0x20, 0x47, 0x6F,
+ 0x6F, 0x63, 0x68, 0x20, 0x61, 0x73, 0x05, 0x04,
+ 0x47, 0x45, 0x52, 0x4F, 0x4E, 0x05, 0x0D, 0x03,
+ 0x53, 0x63, 0x6F, 0x74, 0x69, 0x61, 0x20, 0x61,
+ 0x73, 0x05, 0x04, 0x68, 0x65, 0x72, 0x73, 0x65,
+ 0x6C, 0x66, 0x05, 0x0D, 0x03, 0x46, 0x72, 0x61,
+ 0x6E, 0x6B, 0x20, 0x4B, 0x6C, 0x65, 0x70, 0x61,
+ 0x63, 0x6B, 0x69, 0x20, 0x61, 0x73, 0x05, 0x04,
+ 0x50, 0x49, 0x47, 0x4C, 0x45, 0x54, 0x05, 0x0D,
+ 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x02, 0x4A, 0x41,
+ 0x50, 0x41, 0x4E, 0x45, 0x53, 0x45, 0x20, 0x56,
+ 0x45, 0x52, 0x49, 0x53, 0x49, 0x4F, 0x4E, 0x05,
+ 0x0D, 0x0D, 0x0D, 0x02, 0x50, 0x52, 0x4F, 0x47,
+ 0x52, 0x41, 0x4D, 0x4D, 0x45, 0x52, 0x53, 0x05,
+ 0x0D, 0x0D, 0x02, 0x59, 0x75, 0x6B, 0x69, 0x6F,
+ 0x20, 0x53, 0x65, 0x6B, 0x69, 0x67, 0x75, 0x63,
+ 0x68, 0x69, 0x05, 0x0D, 0x02, 0x4E, 0x61, 0x6F,
+ 0x73, 0x68, 0x69, 0x20, 0x4E, 0x6F, 0x67, 0x75,
+ 0x63, 0x68, 0x69, 0x05, 0x0D, 0x0D, 0x0D, 0x0D,
+ 0x02, 0x41, 0x52, 0x54, 0x49, 0x53, 0x54, 0x53,
+ 0x05, 0x0D, 0x0D, 0x02, 0x4D, 0x61, 0x73, 0x61,
+ 0x6B, 0x69, 0x20, 0x54, 0x6F, 0x67, 0x61, 0x73,
+ 0x68, 0x69, 0x05, 0x0D, 0x02, 0x52, 0x69, 0x73,
+ 0x61, 0x6B, 0x6F, 0x20, 0x53, 0x65, 0x74, 0x6F,
+ 0x05, 0x0D, 0x02, 0x52, 0x65, 0x69, 0x67, 0x61,
+ 0x20, 0x59, 0x61, 0x73, 0x75, 0x64, 0x61, 0x05,
+ 0x0D, 0x02, 0x4D, 0x61, 0x73, 0x75, 0x6D, 0x69,
+ 0x20, 0x53, 0x68, 0x69, 0x6E, 0x62, 0x6F, 0x05,
+ 0x0D, 0x02, 0x4E, 0x61, 0x6F, 0x6B, 0x6F, 0x20,
+ 0x4E, 0x69, 0x74, 0x74, 0x61, 0x05, 0x0D, 0x02,
+ 0x4B, 0x69, 0x79, 0x6F, 0x66, 0x75, 0x6D, 0x69,
+ 0x20, 0x48, 0x69, 0x6E, 0x6F, 0x05, 0x0D, 0x02,
+ 0x48, 0x69, 0x72, 0x6F, 0x6D, 0x69, 0x20, 0x53,
+ 0x61, 0x6B, 0x61, 0x65, 0x05, 0x0D, 0x02, 0x4B,
+ 0x79, 0x6F, 0x75, 0x6B, 0x6F, 0x20, 0x4D, 0x69,
+ 0x79, 0x61, 0x6D, 0x6F, 0x74, 0x6F, 0x05, 0x0D,
+ 0x02, 0x53, 0x68, 0x6F, 0x6B, 0x6F, 0x20, 0x4D,
+ 0x75, 0x72, 0x61, 0x6B, 0x61, 0x6D, 0x69, 0x05,
+ 0x0D, 0x0D, 0x0D, 0x0D, 0x02, 0x4D, 0x55, 0x53,
+ 0x49, 0x43, 0x20, 0x26, 0x20, 0x53, 0x4F, 0x55,
+ 0x4E, 0x44, 0x53, 0x05, 0x0D, 0x0D, 0x02, 0x54,
+ 0x61, 0x6B, 0x65, 0x73, 0x68, 0x69, 0x20, 0x41,
+ 0x62, 0x6F, 0x05, 0x0D, 0x0D, 0x0D, 0x0D, 0x02,
+ 0x4A, 0x41, 0x50, 0x41, 0x4E, 0x45, 0x53, 0x45,
+ 0x20, 0x54, 0x52, 0x41, 0x4E, 0x53, 0x4C, 0x41,
+ 0x54, 0x4F, 0x52, 0x05, 0x0D, 0x0D, 0x02, 0x59,
+ 0x75, 0x72, 0x69, 0x20, 0x49, 0x74, 0x6F, 0x05,
+ 0x0D, 0x0D, 0x0D, 0x0D, 0x02, 0x53, 0x70, 0x65,
+ 0x63, 0x69, 0x61, 0x6C, 0x20, 0x74, 0x68, 0x61,
+ 0x6E, 0x6B, 0x73, 0x20, 0x74, 0x6F, 0x3A, 0x05,
+ 0x0D, 0x0D, 0x02, 0x48, 0x69, 0x72, 0x6F, 0x6B,
+ 0x6F, 0x20, 0x59, 0x6F, 0x72, 0x6F, 0x69, 0x7A,
+ 0x75, 0x6B, 0x61, 0x05, 0x0D, 0x02, 0x59, 0x75,
+ 0x6A, 0x69, 0x20, 0x4F, 0x64, 0x61, 0x77, 0x61,
+ 0x72, 0x61, 0x05, 0x0D, 0x02, 0x4F, 0x68, 0x73,
+ 0x68, 0x75, 0x6E, 0x20, 0x4C, 0x65, 0x65, 0x05,
+ 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x01,
+ 0x43, 0x6F, 0x70, 0x79, 0x72, 0x69, 0x67, 0x68,
+ 0x74, 0x20, 0x28, 0x43, 0x29, 0x20, 0x31, 0x39,
+ 0x39, 0x33, 0x2C, 0x20, 0x57, 0x65, 0x73, 0x74,
+ 0x77, 0x6F, 0x6F, 0x64, 0x20, 0x53, 0x74, 0x75,
+ 0x64, 0x69, 0x6F, 0x73, 0x2C, 0x20, 0x49, 0x6E,
+ 0x63, 0x2E, 0x05, 0x0D, 0x01, 0x43, 0x6F, 0x70,
+ 0x79, 0x72, 0x69, 0x67, 0x68, 0x74, 0x20, 0x28,
+ 0x43, 0x29, 0x20, 0x31, 0x39, 0x39, 0x34, 0x2C,
+ 0x20, 0x53, 0x74, 0x61, 0x72, 0x43, 0x72, 0x61,
+ 0x66, 0x74, 0x2C, 0x20, 0x49, 0x6E, 0x63, 0x2E,
+ 0x05, 0x0D, 0x01, 0x41, 0x6C, 0x6C, 0x20, 0x72,
+ 0x69, 0x67, 0x68, 0x74, 0x73, 0x20, 0x72, 0x65,
+ 0x73, 0x65, 0x72, 0x76, 0x65, 0x64, 0x2E, 0x05,
+ 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D,
+ 0x00, 0x00, 0x00, 0x00
+};
+
+static const ByteProvider kLoLCreditsFMTownsProvider = { ARRAYSIZE(kLoLCreditsFMTowns), kLoLCreditsFMTowns };
+
diff --git a/devtools/create_kyradat/resources/lol_fmtowns_japanese.h b/devtools/create_kyradat/resources/lol_fmtowns_japanese.h
new file mode 100644
index 0000000000..b43fcdd6e8
--- /dev/null
+++ b/devtools/create_kyradat/resources/lol_fmtowns_japanese.h
@@ -0,0 +1,68 @@
+static const LoLCharacter kLoLCharacterDefsFMTownsJapanese[9] = {
+ { 0x0001, "\x83""}""\x83""C""\x83""P""\x83\x8B", 0, -1, 0, 0, 17,
+ { 0, 0, 0, 0, 0, 0, 0, 0 },
+ { 256, 256, 256, 256, 256, 256, 256, 256 },
+ 0, 20, 20, 6, 6, 0, 0, 0, 384, 320, 5, 2, 0,
+ { 44, 0, 0, 0, 0, 138, 0, 0, 162, 0, 0 },
+ { 1, 1, 1 }, { 0, 0, 0 }, { 1, 1, 1 },
+ { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 } },
+ { 0x0001, "\x83""e""\x83""B""\x83\x82\x83""V""\x81""[", 0, 2, 0, 0, 22,
+ { 0, 0, 0, 0, 0, 0, 0, 0 },
+ { 256, 256, 256, 256, 256, 256, 256, 256 },
+ 0, 27, 27, 5, 5, 0, 0, 0, 256, 256, 0, 0, 0,
+ { 93, 131, 0, 0, 0, 153, 0, 0, 162, 0, 0 },
+ { 3, 2, 1 }, { 0, 0, 0 }, { 2500, 1000, 250 },
+ { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 } },
+ { 0x0001, "\x83""o""\x83""R""\x81""[""\x83""^", 3, 3, 0, 0, 23,
+ { 0, 0, 0, 0, 0, 0, 0, 0 },
+ { 256, 256, 256, 256, 256, 256, 256, 256 },
+ 0, 22, 22, 18, 18, 0, 0, 0, 256, 256, 0, 0, 0,
+ { 108, 149, 0, 0, 145, 153, 0, 0, 129, 0, 0 },
+ { 1, 1, 3 }, { 0, 0, 0 }, { 1, 1, 4000 },
+ { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 } },
+ { 0x0001, "\x83\x8D\x81""[""\x83\x89", 1, 4, 0, 0, 24,
+ { 0, 0, 0, 0, 0, 0, 0, 0 },
+ { 256, 256, 256, 256, 256, 256, 256, 256 },
+ 0, 25, 48, 5, 5, 0, 0, 0, 256, 256, 0, 0, 0,
+ { 0, 0, 0, 0, 0, 137, 0, 0, 162, 0, 0 },
+ { 1, 4, 1 }, { 0, 0, 0 }, { 1, 15001, 1 },
+ { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 } },
+ { 0x0001, "\x83""R""\x83\x93\x83\x89\x83""b""\x83""h", 0, -5, 0, 0, 26,
+ { 0, 0, 0, 0, 0, 0, 0, 0 },
+ { 256, 256, 256, 256, 256, 256, 256, 256 },
+ 0, 23, 23, 10, 10, 0, 0, 0, 366, 358, 2, 3, 0,
+ { 44, 0, 0, 0, 0, 138, 0, 0, 162, 0, 0 },
+ { 1, 1, 1 }, { 0, 0, 0 }, { 1, 1, 1 },
+ { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 } },
+ { 0x0001, "\x83""|""\x81""[""\x83\x8B\x83""\\""\x83\x93", 0, 6, 0, 0, 25,
+ { 0, 0, 0, 0, 0, 0, 0, 0 },
+ { 256, 256, 256, 256, 256, 256, 256, 256 },
+ 0, 105, 105, 45, 45, 0, 0, 0, 256, 256, 0, 0, 0,
+ { 0, 0, 0, 0, 0, 138, 0, 0, 129, 0, 0 },
+ { 5, 2, 3 }, { 0, 0, 0 }, { 40000, 501, 3500 },
+ { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 } },
+ { 0x0001, "\x83""h""\x81""[""\x83\x93", 1, 7, 0, 0, 24,
+ { 0, 0, 0, 0, 0, 0, 0, 0 },
+ { 256, 256, 256, 256, 256, 256, 256, 256 },
+ 0, 50, 50, 80, 80, 0, 0, 0, 256, 256, 0, 0, 0,
+ { 0, 0, 0, 0, 0, 138, 0, 0, 129, 0, 0 },
+ { 1, 2, 10 }, { 1, 254, 177 }, { 1, 501, 1 },
+ { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 } },
+ { 0x0001, "\x83""L""\x81""[""\x83\x89\x83\x93", 2, -8, 0, 0, 21,
+ { 0, 0, 0, 0, 0, 0, 0, 0 },
+ { 256, 256, 256, 256, 256, 256, 256, 256 },
+ 0, 23, 23, 8, 8, 0, 0, 0, 422, 332, 5, 1, 0,
+ { 44, 0, 0, 0, 0, 138, 0, 0, 162, 0, 0 },
+ { 1, 1, 1 }, { 0, 0, 0 }, { 1, 1, 1 },
+ { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 } },
+ { 0x0001, "\x83""A""\x83""N""\x83""V""\x83""F""\x83\x8B", 4, -9, 0, 0, 20,
+ { 0, 0, 0, 0, 0, 0, 0, 0 },
+ { 256, 256, 256, 256, 256, 256, 256, 256 },
+ 0, 28, 28, 32, 32, 0, 0, 0, 320, 256, 1, 1, 0,
+ { 44, 0, 0, 0, 0, 138, 0, 0, 162, 0, 0 },
+ { 1, 1, 1 }, { 0, 0, 0 }, { 1, 1, 1 },
+ { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 } }
+};
+
+static const LoLCharacterProvider kLoLCharacterDefsFMTownsJapaneseProvider = { ARRAYSIZE(kLoLCharacterDefsFMTownsJapanese), kLoLCharacterDefsFMTownsJapanese };
+
diff --git a/devtools/create_kyradat/resources/lol_pc98.h b/devtools/create_kyradat/resources/lol_pc98.h
new file mode 100644
index 0000000000..e62fabe210
--- /dev/null
+++ b/devtools/create_kyradat/resources/lol_pc98.h
@@ -0,0 +1,1598 @@
+static const char *const kLoLIngamePakFilesPC98[11] = {
+ "VOC.PAK",
+ "GENERAL.PAK",
+ "CHAPTER1.PAK",
+ "CHAPTER2.PAK",
+ "CHAPTER3.PAK",
+ "CHAPTER4.PAK",
+ "CHAPTER5.PAK",
+ "CHAPTER6.PAK",
+ "CHAPTER7.PAK",
+ "CHAPTER8.PAK",
+ "MUS.PAK"
+};
+
+static const StringListProvider kLoLIngamePakFilesPC98Provider = { ARRAYSIZE(kLoLIngamePakFilesPC98), kLoLIngamePakFilesPC98 };
+
+static const char *const kLoLIngameSfxFilesPC98[229] = {
+ "XXXXXXXX",
+ "XXXXXXXX",
+ "XXXXXXXX",
+ "XXXXXXXX",
+ "XXXXXXXX",
+ "XXXXXXXX",
+ "XXXXXXXX",
+ "XXXXXXXX",
+ "XXXXXXXX",
+ "XXXXXXXX",
+ "XXXXXXXX",
+ "XXXXXXXX",
+ "XXXXXXXX",
+ "XXXXXXXX",
+ "XXXXXXXX",
+ "XXXXXXXX",
+ "XXXXXXXX",
+ "XXXXXXXX",
+ "XXXXXXXX",
+ "XXXXXXXX",
+ "XXXXXXXX",
+ "XXXXXXXX",
+ "XXXXXXXX",
+ "XXXXXXXX",
+ "XXXXXXXX",
+ "XXXXXXXX",
+ "XXXXXXXX",
+ "XXXXXXXX",
+ "XXXXXXXX",
+ "XXXXXXXX",
+ "XXXXXXXX",
+ "XXXXXXXX",
+ "XXXXXXXX",
+ "XXXXXXXX",
+ "XXXXXXXX",
+ "XXXXXXXX",
+ "XXXXXXXX",
+ "XXXXXXXX",
+ "XXXXXXXX",
+ "XXXXXXXX",
+ "XXXXXXXX",
+ "XXXXXXXX",
+ "XXXXXXXX",
+ "XXXXXXXX",
+ "XXXXXXXX",
+ "XXXXXXXX",
+ "XXXXXXXX",
+ "XXXXXXXX",
+ "XXXXXXXX",
+ "XXXXXXXX",
+ "DOORMTOP",
+ "DOORMTCL",
+ "PMETLHI",
+ "SWING6",
+ "MDAMAGE2",
+ "LEVERDN",
+ "LEVERUP",
+ "MTLDRSLM",
+ "DOORWDOP",
+ "DOORWDCL",
+ "KEYOPEN",
+ "KEYLOCK",
+ "PORTCUL",
+ "PORTCULD",
+ "LOKPICK",
+ "OCEAN2",
+ "NUNCHUK",
+ "SWING",
+ "SHWING1",
+ "SWING6",
+ "THROW",
+ "CROSSBOW",
+ "HEAL1",
+ "FIRESPL1",
+ "PRESSIN",
+ "PRESSOUT",
+ "PLATEON",
+ "PLATEOFF",
+ "DORWDSLM",
+ "LITENIN1",
+ "ICESPEL2",
+ "SPELL4B",
+ "SHIELD1",
+ "3BOLTC",
+ "2BOLTC",
+ "1BOLTC",
+ "DAWNSPL1",
+ "HEALKING",
+ "SPELL7",
+ "SWING1",
+ "EXPLODE",
+ "CROWCAW",
+ "MORPH2",
+ "CHEST",
+ "MONEY",
+ "SPELBK2",
+ "AUTOMAP",
+ "MINECRT3",
+ "CREAK1",
+ "TURNPAG2",
+ "POLGULP1",
+ "GOOEY1",
+ "BUCKBELL",
+ "KEEPXIT2",
+ "VSCREAM4",
+ "EMPTY",
+ "GOOEY1",
+ "GOOEY2",
+ "RIPPOD4",
+ "PODSKEL1",
+ "INVISO",
+ "OPENBOX2",
+ "ACCEPT2",
+ "BOW2",
+ "HACHUCKM",
+ "FOUNDRY2",
+ "FOUNDRY2",
+ "FOUNDRY4",
+ "FOUNDRY6",
+ "CLEANGL1",
+ "CLEANGL2",
+ "GLOWY1",
+ "DORSTNOP",
+ "DORSTNCL",
+ "EMPTY",
+ "EMPTY",
+ "EMPTY",
+ "EMPTY",
+ "ADAMAGE1",
+ "HDAMAGE1",
+ "TDAMAGE1",
+ "BDAMAGE1",
+ "LDAMAGE1",
+ "TDAMAGE2",
+ "CDAMAGE1",
+ "EMPTY",
+ "EMPTY",
+ "EMPTY",
+ "GOOD1",
+ "GOOD2",
+ "EMPTY",
+ "EMPTY",
+ "EMPTY",
+ "LITENIN1",
+ "COMPASS2",
+ "KINGDOR1",
+ "GLASBRK2",
+ "FLUTTER3",
+ "NUNCHUK",
+ "WALLFALL",
+ "WALLHIT",
+ "MWHOA1",
+ "LADDER",
+ "WHITTL3",
+ "ROWBOAT1",
+ "HORSEY2",
+ "SNORT",
+ "PUMPDOR1",
+ "PUMPSM2",
+ "PUMPSM3",
+ "SPARK1",
+ "BEZEL",
+ "SWARM",
+ "CHEST",
+ "WRIT1",
+ "CAUSFOG",
+ "VAELAN2",
+ "ROARSPL1",
+ "RATTLER",
+ "WINK1",
+ "HANDFATE",
+ "QUAKE1",
+ "WIZLAMP1",
+ "SAP2",
+ "MSTDOOM1",
+ "GARDIAN1",
+ "VORTEX1",
+ "LION1",
+ "STEAM",
+ "SQUAWCK",
+ "SLIDEMUG",
+ "SPARKHIT",
+ "SPARKHIT2",
+ "SPARKHIT3",
+ "ICEFORM",
+ "ICEXPLOD",
+ "EXPLODE2",
+ "EXPLODE3",
+ "BOLTQUK2",
+ "BOLT2",
+ "BOLT3",
+ "SNKBITE",
+ "HANDGLOW",
+ "MSTDOOM2",
+ "MSTDOOM3",
+ "GARDIAN2",
+ "PLUSPOWR",
+ "MINSPOWR",
+ "BLUDCURL",
+ "LORAGASP",
+ "POURH2O",
+ "AWHOA2",
+ "HWHOA1",
+ "CWHOA1",
+ "AFALL2",
+ "EMPTY",
+ "CFALL2",
+ "MFALL2",
+ "EMPTY",
+ "EMPTY",
+ "EMPTY",
+ "EMPTY",
+ "EMPTY",
+ "EMPTY",
+ "EMPTY",
+ "EMPTY",
+ "WRIT2",
+ "WRIT3",
+ "WRIT4",
+ "WRIT5",
+ "WRIT6",
+ "RUCKUS1",
+ "RUCKUS3",
+ "CHANT1",
+ "EMPTY",
+ "EMPTY",
+ "EMPTY",
+ "CHANT2",
+ "CHANT3"
+};
+
+static const StringListProvider kLoLIngameSfxFilesPC98Provider = { ARRAYSIZE(kLoLIngameSfxFilesPC98), kLoLIngameSfxFilesPC98 };
+
+static const byte kLoLIngameSfxIndexPC98[1000] = {
+ 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00,
+ 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00,
+ 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00,
+ 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00,
+ 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00,
+ 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00,
+ 0x34, 0x00, 0x6F, 0x00, 0x7C, 0x00, 0x00, 0x00,
+ 0x7D, 0x00, 0x00, 0x00, 0x7E, 0x00, 0x00, 0x00,
+ 0x7F, 0x00, 0x00, 0x00, 0x36, 0x00, 0x73, 0x00,
+ 0x35, 0x00, 0x9C, 0xFF, 0xFF, 0xFF, 0x00, 0x00,
+ 0x80, 0x00, 0x73, 0x00, 0x81, 0x00, 0x73, 0x00,
+ 0x82, 0x00, 0x73, 0x00, 0x83, 0x00, 0x73, 0x00,
+ 0x84, 0x00, 0x73, 0x00, 0x85, 0x00, 0x73, 0x00,
+ 0x86, 0x00, 0x73, 0x00, 0xD7, 0x00, 0x76, 0x00,
+ 0x87, 0x00, 0x65, 0x00, 0x38, 0x00, 0x5F, 0x00,
+ 0x37, 0x00, 0x5F, 0x00, 0x32, 0x00, 0x0A, 0x00,
+ 0x33, 0x00, 0x64, 0x00, 0x39, 0x00, 0x65, 0x00,
+ 0x3A, 0x00, 0x0A, 0x00, 0x3B, 0x00, 0x14, 0x00,
+ 0x4E, 0x00, 0x65, 0x00, 0x7A, 0x00, 0x64, 0x00,
+ 0x7B, 0x00, 0x64, 0x00, 0x88, 0x00, 0x65, 0x00,
+ 0x3C, 0x00, 0x65, 0x00, 0x3D, 0x00, 0x64, 0x00,
+ 0x89, 0x00, 0x00, 0x00, 0x8E, 0x00, 0x14, 0x00,
+ 0x3E, 0x00, 0x00, 0x00, 0x3F, 0x00, 0x00, 0x00,
+ 0x40, 0x00, 0x65, 0x00, 0x41, 0x00, 0x00, 0x00,
+ 0xC9, 0x00, 0x72, 0x00, 0xCA, 0x00, 0x72, 0x00,
+ 0xCB, 0x00, 0x72, 0x00, 0xCC, 0x00, 0x74, 0x00,
+ 0xCD, 0x00, 0x74, 0x00, 0xCE, 0x00, 0x74, 0x00,
+ 0xCF, 0x00, 0x74, 0x00, 0xD0, 0x00, 0x73, 0x00,
+ 0xD1, 0x00, 0x73, 0x00, 0xD2, 0x00, 0x73, 0x00,
+ 0xD3, 0x00, 0x73, 0x00, 0xD4, 0x00, 0x72, 0x00,
+ 0xD5, 0x00, 0x72, 0x00, 0xD6, 0x00, 0x72, 0x00,
+ 0x42, 0x00, 0x6F, 0x00, 0x43, 0x00, 0x6F, 0x00,
+ 0x44, 0x00, 0x6F, 0x00, 0x45, 0x00, 0x6F, 0x00,
+ 0x46, 0x00, 0x6F, 0x00, 0x47, 0x00, 0x6F, 0x00,
+ 0x48, 0x00, 0x77, 0x00, 0x49, 0x00, 0x89, 0xFF,
+ 0x4F, 0x00, 0x89, 0xFF, 0x50, 0x00, 0x89, 0xFF,
+ 0xA0, 0x00, 0x8A, 0xFF, 0xA1, 0x00, 0x89, 0xFF,
+ 0xA2, 0x00, 0x89, 0xFF, 0xFF, 0xFF, 0x00, 0x00,
+ 0xA3, 0x00, 0x89, 0xFF, 0xA4, 0x00, 0x89, 0xFF,
+ 0x4A, 0x00, 0x13, 0x00, 0x4B, 0x00, 0x13, 0x00,
+ 0x4C, 0x00, 0x32, 0x00, 0x4D, 0x00, 0x32, 0x00,
+ 0x5F, 0x00, 0x0A, 0x00, 0x51, 0x00, 0x00, 0x00,
+ 0x52, 0x00, 0x00, 0x00, 0x8F, 0x00, 0x00, 0x00,
+ 0x53, 0x00, 0x00, 0x00, 0x54, 0x00, 0x00, 0x00,
+ 0x55, 0x00, 0x00, 0x00, 0x56, 0x00, 0x00, 0x00,
+ 0x57, 0x00, 0x00, 0x00, 0x58, 0x00, 0x77, 0x00,
+ 0x60, 0x00, 0x00, 0x00, 0x5D, 0x00, 0x6A, 0x00,
+ 0x8A, 0x00, 0x6F, 0x00, 0x8B, 0x00, 0x6F, 0x00,
+ 0x8C, 0x00, 0x00, 0x00, 0x8D, 0x00, 0x00, 0x00,
+ 0x5A, 0x00, 0x77, 0x00, 0x5C, 0x00, 0x00, 0x00,
+ 0x5B, 0x00, 0x00, 0x00, 0x5E, 0x00, 0x6F, 0x00,
+ 0x61, 0x00, 0x76, 0x00, 0xFF, 0xFF, 0x00, 0x00,
+ 0x62, 0x00, 0x76, 0x00, 0x63, 0x00, 0x3C, 0x00,
+ 0x64, 0x00, 0x6D, 0x00, 0x65, 0x00, 0x00, 0x00,
+ 0x66, 0x00, 0x00, 0x00, 0x67, 0x00, 0x00, 0x00,
+ 0x68, 0x00, 0x00, 0x00, 0x69, 0x00, 0x00, 0x00,
+ 0x6A, 0x00, 0x00, 0x00, 0x6B, 0x00, 0x00, 0x00,
+ 0x6C, 0x00, 0x00, 0x00, 0x6D, 0x00, 0x00, 0x00,
+ 0x6E, 0x00, 0x00, 0x00, 0x6F, 0x00, 0x00, 0x00,
+ 0x70, 0x00, 0x88, 0xFF, 0xFF, 0xFF, 0x00, 0x00,
+ 0x71, 0x00, 0x00, 0x00, 0x72, 0x00, 0x00, 0x00,
+ 0x73, 0x00, 0x74, 0x00, 0x74, 0x00, 0x00, 0x00,
+ 0x75, 0x00, 0x00, 0x00, 0x76, 0x00, 0x00, 0x00,
+ 0x77, 0x00, 0x00, 0x00, 0x78, 0x00, 0x00, 0x00,
+ 0x79, 0x00, 0x77, 0x00, 0x90, 0x00, 0x00, 0x00,
+ 0x91, 0x00, 0x00, 0x00, 0x92, 0x00, 0x77, 0x00,
+ 0x93, 0x00, 0x1E, 0x00, 0x94, 0x00, 0x89, 0xFF,
+ 0x95, 0x00, 0x77, 0x00, 0x96, 0x00, 0x76, 0x00,
+ 0x97, 0x00, 0x72, 0x00, 0x98, 0x00, 0x00, 0x00,
+ 0x99, 0x00, 0x50, 0x00, 0x9A, 0x00, 0x78, 0x00,
+ 0x9B, 0x00, 0x64, 0x00, 0x9C, 0x00, 0x5A, 0x00,
+ 0x9D, 0x00, 0x64, 0x00, 0x9E, 0x00, 0x65, 0x00,
+ 0x9F, 0x00, 0x66, 0x00, 0xA5, 0x00, 0x89, 0xFF,
+ 0xA6, 0x00, 0x89, 0xFF, 0xA7, 0x00, 0x77, 0x00,
+ 0xA8, 0x00, 0x76, 0x00, 0xFF, 0xFF, 0x00, 0x00,
+ 0xA9, 0x00, 0x77, 0x00, 0xAA, 0x00, 0x77, 0x00,
+ 0xAB, 0x00, 0x77, 0x00, 0xAC, 0x00, 0x77, 0x00,
+ 0xAD, 0x00, 0x77, 0x00, 0xAE, 0x00, 0x77, 0x00,
+ 0xAF, 0x00, 0x76, 0x00, 0xB0, 0x00, 0x77, 0x00,
+ 0xB1, 0x00, 0x64, 0x00, 0xB2, 0x00, 0x6F, 0x00,
+ 0xB3, 0x00, 0x6E, 0x00, 0xB4, 0x00, 0x6E, 0x00,
+ 0xB5, 0x00, 0x77, 0x00, 0xB6, 0x00, 0x77, 0x00,
+ 0xB7, 0x00, 0x77, 0x00, 0xB8, 0x00, 0x76, 0x00,
+ 0xB9, 0x00, 0x77, 0x00, 0xBA, 0x00, 0x77, 0x00,
+ 0xBB, 0x00, 0x77, 0x00, 0xBC, 0x00, 0x77, 0x00,
+ 0xBD, 0x00, 0x77, 0x00, 0xBE, 0x00, 0x77, 0x00,
+ 0xBF, 0x00, 0x77, 0x00, 0xC0, 0x00, 0x76, 0x00,
+ 0xC1, 0x00, 0x77, 0x00, 0xC2, 0x00, 0x77, 0x00,
+ 0xC3, 0x00, 0x77, 0x00, 0xC4, 0x00, 0x6E, 0x00,
+ 0xC5, 0x00, 0x6E, 0x00, 0xC6, 0x00, 0x7D, 0x00,
+ 0xC7, 0x00, 0x78, 0x00, 0xC8, 0x00, 0x78, 0x00,
+ 0xD8, 0x00, 0x77, 0x00, 0xD9, 0x00, 0x77, 0x00,
+ 0xDA, 0x00, 0x77, 0x00, 0xDB, 0x00, 0x77, 0x00,
+ 0xDC, 0x00, 0x77, 0x00, 0xDD, 0x00, 0x78, 0x00,
+ 0xDE, 0x00, 0x78, 0x00, 0xFF, 0xFF, 0x00, 0x00,
+ 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00,
+ 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00,
+ 0xE3, 0x00, 0x77, 0x00, 0xE4, 0x00, 0x77, 0x00,
+ 0xE0, 0x00, 0x1E, 0x00, 0xDF, 0x00, 0x77, 0x00,
+ 0xE1, 0x00, 0x05, 0x00, 0xE2, 0x00, 0x0A, 0x00,
+ 0x00, 0x00, 0x50, 0x00, 0x01, 0x00, 0x50, 0x00,
+ 0x02, 0x00, 0x50, 0x00, 0x03, 0x00, 0x50, 0x00,
+ 0x04, 0x00, 0x50, 0x00, 0x05, 0x00, 0x50, 0x00,
+ 0x06, 0x00, 0x50, 0x00, 0x07, 0x00, 0x50, 0x00,
+ 0x08, 0x00, 0x50, 0x00, 0x09, 0x00, 0x50, 0x00,
+ 0x0A, 0x00, 0x50, 0x00, 0x0B, 0x00, 0x50, 0x00,
+ 0x0C, 0x00, 0x50, 0x00, 0x0D, 0x00, 0x50, 0x00,
+ 0x0E, 0x00, 0x50, 0x00, 0x0F, 0x00, 0x50, 0x00,
+ 0x10, 0x00, 0x50, 0x00, 0x11, 0x00, 0x5A, 0x00,
+ 0x12, 0x00, 0x5A, 0x00, 0x13, 0x00, 0x5A, 0x00,
+ 0x14, 0x00, 0x5A, 0x00, 0x15, 0x00, 0x5A, 0x00,
+ 0x16, 0x00, 0x5A, 0x00, 0x17, 0x00, 0x5A, 0x00,
+ 0x18, 0x00, 0x5A, 0x00, 0x19, 0x00, 0x5A, 0x00,
+ 0x1A, 0x00, 0x5A, 0x00, 0x1B, 0x00, 0x5A, 0x00,
+ 0x1C, 0x00, 0x5A, 0x00, 0x1D, 0x00, 0x5A, 0x00,
+ 0x1E, 0x00, 0x5A, 0x00, 0x1F, 0x00, 0x5A, 0x00,
+ 0x20, 0x00, 0x5A, 0x00, 0x21, 0x00, 0x73, 0x00,
+ 0x22, 0x00, 0x73, 0x00, 0x23, 0x00, 0x73, 0x00,
+ 0x24, 0x00, 0x73, 0x00, 0x25, 0x00, 0x73, 0x00,
+ 0x26, 0x00, 0x73, 0x00, 0x27, 0x00, 0x73, 0x00,
+ 0x28, 0x00, 0x73, 0x00, 0x29, 0x00, 0x73, 0x00,
+ 0x2A, 0x00, 0x73, 0x00, 0x2B, 0x00, 0x50, 0x00,
+ 0x2C, 0x00, 0x5A, 0x00, 0x2D, 0x00, 0x5A, 0x00,
+ 0x2E, 0x00, 0x5A, 0x00, 0x2F, 0x00, 0x5A, 0x00,
+ 0x30, 0x00, 0x5A, 0x00, 0x31, 0x00, 0x5A, 0x00
+};
+
+static const ByteProvider kLoLIngameSfxIndexPC98Provider = { ARRAYSIZE(kLoLIngameSfxIndexPC98), kLoLIngameSfxIndexPC98 };
+
+static const SpellProperty kLoLSpellPropertiesPC98[10] = {
+ { 16436, { 5, 10, 15, 25 }, 0, 0, { 0, 0, 0, 0 }, 0, 0, 0x0100 },
+ { 16437, { 5, 10, 25, 60 }, 0, 0, { 0, 0, 0, 0 }, 0, 0, 0x0001 },
+ { 16438, { 8, 15, 30, 80 }, 0, 0, { 0, 0, 0, 0 }, 0, 0, 0x0102 },
+ { 16440, { 20, 35, 65, 100 }, 0, 0, { 0, 0, 0, 0 }, 0, 0, 0x0103 },
+ { 16441, { 30, 60, 90, 120 }, 0, 0, { 0, 0, 0, 0 }, 0, 0, 0x0104 },
+ { 16442, { 30, 60, 90, 150 }, 0, 0, { 0, 0, 0, 0 }, 0, 0, 0x0105 },
+ { 16439, { 25, 30, 50, 100 }, 0, 0, { 0, 0, 0, 0 }, 0, 0, 0x0106 },
+ { 16443, { 3, 6, 12, 24 }, 0, 0, { 0, 0, 0, 0 }, 0, 0, 0x0107 },
+ { 16975, { 15, 15, 15, 15 }, 0, 0, { 0, 0, 0, 0 }, 0, 0, 0x0108 },
+ { 16975, { 15, 15, 15, 15 }, 15, 0, { 0, 0, 0, 0 }, 0, 0, 0x0108 }
+};
+
+static const SpellPropertyProvider kLoLSpellPropertiesPC98Provider = { ARRAYSIZE(kLoLSpellPropertiesPC98), kLoLSpellPropertiesPC98 };
+
+static const byte kLoLGameShapeMapPC98[276] = {
+ 0x15, 0x54, 0x05, 0x35, 0x09, 0x36, 0x00, 0x34,
+ 0x00, 0x34, 0x00, 0x34, 0x00, 0x3A, 0x26, 0x3B,
+ 0x05, 0x35, 0x07, 0x37, 0x18, 0x3E, 0x0D, 0x3C,
+ 0x06, 0x40, 0x06, 0x3D, 0x01, 0x54, 0x01, 0x54,
+ 0x0A, 0x54, 0x0A, 0x54, 0x0A, 0x54, 0x04, 0x54,
+ 0x04, 0x54, 0x2D, 0x54, 0x2D, 0x54, 0x0B, 0x39,
+ 0x24, 0x54, 0x03, 0x38, 0x00, 0x3A, 0x1E, 0x3C,
+ 0x1E, 0x3C, 0x1B, 0x54, 0x14, 0x54, 0x29, 0x54,
+ 0x02, 0x54, 0x0C, 0x54, 0x22, 0x54, 0x21, 0x3F,
+ 0x0D, 0x3C, 0x25, 0x54, 0x1A, 0x3F, 0x04, 0x54,
+ 0x30, 0x54, 0x31, 0x54, 0x32, 0x54, 0x32, 0x54,
+ 0x00, 0x34, 0x00, 0x34, 0x00, 0x34, 0x00, 0x34,
+ 0x17, 0x54, 0x17, 0x54, 0x0E, 0x54, 0x0E, 0x54,
+ 0x0E, 0x54, 0x26, 0x3B, 0x2C, 0x54, 0x21, 0x3F,
+ 0x07, 0x37, 0x27, 0x54, 0x1B, 0x54, 0x1B, 0x54,
+ 0x1B, 0x54, 0x1B, 0x54, 0x1B, 0x54, 0x1B, 0x54,
+ 0x1B, 0x54, 0x1B, 0x54, 0x22, 0x54, 0x22, 0x54,
+ 0x16, 0x54, 0x2D, 0x54, 0x3B, 0x54, 0x3B, 0x54,
+ 0x3A, 0x54, 0x17, 0x54, 0x1B, 0x54, 0x1B, 0x54,
+ 0x17, 0x54, 0x0A, 0x54, 0x0A, 0x54, 0x0A, 0x54,
+ 0x1F, 0x54, 0x17, 0x54, 0x27, 0x54, 0x1B, 0x54,
+ 0x1E, 0x3C, 0x2A, 0x54, 0x2F, 0x54, 0x2F, 0x54,
+ 0x2F, 0x54, 0x2F, 0x54, 0x2F, 0x54, 0x2F, 0x54,
+ 0x2C, 0x54, 0x2C, 0x54, 0x2C, 0x54, 0x2C, 0x54,
+ 0x34, 0x54, 0x0F, 0x54, 0x35, 0x41, 0x1B, 0x54,
+ 0x1B, 0x54, 0x1B, 0x54, 0x1B, 0x54, 0x2B, 0x54,
+ 0x1D, 0x54, 0x1D, 0x54, 0x28, 0x54, 0x28, 0x54,
+ 0x28, 0x54, 0x28, 0x54, 0x01, 0x54, 0x14, 0x54,
+ 0x14, 0x54, 0x14, 0x54, 0x14, 0x54, 0x1B, 0x54,
+ 0x27, 0x54, 0x1B, 0x54, 0x1B, 0x54, 0x1B, 0x54,
+ 0x1B, 0x54, 0x36, 0x54, 0x37, 0x54, 0x38, 0x54,
+ 0x39, 0x54, 0x1B, 0x54, 0x1B, 0x54, 0x1B, 0x54,
+ 0x1B, 0x54, 0x27, 0x54, 0x2E, 0x54, 0x2E, 0x54,
+ 0x2E, 0x54, 0x2E, 0x54, 0x17, 0x54, 0x01, 0x54,
+ 0x1C, 0x54, 0x1C, 0x54
+};
+
+static const ByteProvider kLoLGameShapeMapPC98Provider = { ARRAYSIZE(kLoLGameShapeMapPC98), kLoLGameShapeMapPC98 };
+
+static const byte kLoLSceneItemOffsPC98[8] = {
+ 0x00, 0xFE, 0x01, 0xFF, 0x02, 0x00, 0x01, 0xFF
+};
+
+static const ByteProvider kLoLSceneItemOffsPC98Provider = { ARRAYSIZE(kLoLSceneItemOffsPC98), kLoLSceneItemOffsPC98 };
+
+static const byte kLoLCharInvIndexPC98[5] = {
+ 0x00, 0x00, 0x03, 0x01, 0x02
+};
+
+static const ByteProvider kLoLCharInvIndexPC98Provider = { ARRAYSIZE(kLoLCharInvIndexPC98), kLoLCharInvIndexPC98 };
+
+static const byte kLoLCharInvDefsPC98[88] = {
+ 0x05, 0x34, 0x50, 0x34, 0xFF, 0xFF, 0xFF, 0xFF,
+ 0x05, 0x04, 0x05, 0x1C, 0x50, 0x04, 0x50, 0x1C,
+ 0x05, 0x5D, 0x0F, 0x4E, 0x50, 0x4E, 0x05, 0x19,
+ 0x50, 0x19, 0x05, 0x49, 0x50, 0x49, 0x05, 0x01,
+ 0x05, 0x31, 0x50, 0x01, 0x50, 0x31, 0x05, 0x61,
+ 0xFF, 0xFF, 0xFF, 0xFF, 0x05, 0x34, 0x50, 0x34,
+ 0xFF, 0xFF, 0xFF, 0xFF, 0x05, 0x04, 0x05, 0x1C,
+ 0x50, 0x04, 0x50, 0x1C, 0x05, 0x5D, 0x0F, 0x4E,
+ 0x50, 0x4E, 0x05, 0x34, 0x50, 0x34, 0xFF, 0xFF,
+ 0xFF, 0xFF, 0x05, 0x04, 0x05, 0x1C, 0x50, 0x04,
+ 0x50, 0x1C, 0xFF, 0xFF, 0x0F, 0x4E, 0x50, 0x4E
+};
+
+static const ByteProvider kLoLCharInvDefsPC98Provider = { ARRAYSIZE(kLoLCharInvDefsPC98), kLoLCharInvDefsPC98 };
+
+static const uint16 kLoLCharDefsManPC98[9] = {
+ 0x0100, 0x0100, 0x0100, 0x0032, 0x0100, 0x0100, 0x0100, 0x0100,
+ 0x0004
+};
+
+static const Uint16Provider kLoLCharDefsManPC98Provider = { ARRAYSIZE(kLoLCharDefsManPC98), kLoLCharDefsManPC98 };
+
+static const uint16 kLoLCharDefsWomanPC98[9] = {
+ 0x0100, 0x0100, 0x0100, 0x0032, 0x0100, 0x0100, 0x0100, 0x0100,
+ 0x0004
+};
+
+static const Uint16Provider kLoLCharDefsWomanPC98Provider = { ARRAYSIZE(kLoLCharDefsWomanPC98), kLoLCharDefsWomanPC98 };
+
+static const uint16 kLoLCharDefsKieranPC98[9] = {
+ 0x0180, 0x0080, 0x00C0, 0x0032, 0x0200, 0x00A6, 0x0100, 0x0140,
+ 0x0006
+};
+
+static const Uint16Provider kLoLCharDefsKieranPC98Provider = { ARRAYSIZE(kLoLCharDefsKieranPC98), kLoLCharDefsKieranPC98 };
+
+static const uint16 kLoLCharDefsAkshelPC98[9] = {
+ 0x00C0, 0x00C0, 0x0140, 0x0032, 0x0100, 0x0180, 0x0180, 0x0100,
+ 0x0004
+};
+
+static const Uint16Provider kLoLCharDefsAkshelPC98Provider = { ARRAYSIZE(kLoLCharDefsAkshelPC98), kLoLCharDefsAkshelPC98 };
+
+static const uint32 kLoLExpRequirementsPC98[11] = {
+ 0x00000000, 0x000001F4, 0x000005DC, 0x00001388, 0x000061A8, 0x0000C350, 0x00013880, 0x0001D4C0,
+ 0x0002BF20, 0x00041EB0, 0x7FFFFFFF
+};
+
+static const Uint32Provider kLoLExpRequirementsPC98Provider = { ARRAYSIZE(kLoLExpRequirementsPC98), kLoLExpRequirementsPC98 };
+
+static const uint16 kLoLMonsterModifiers1PC98[3] = {
+ 0x00C0, 0x0100, 0x0180
+};
+
+static const Uint16Provider kLoLMonsterModifiers1PC98Provider = { ARRAYSIZE(kLoLMonsterModifiers1PC98), kLoLMonsterModifiers1PC98 };
+
+static const uint16 kLoLMonsterModifiers2PC98[3] = {
+ 0x0100, 0x0100, 0x00C0
+};
+
+static const Uint16Provider kLoLMonsterModifiers2PC98Provider = { ARRAYSIZE(kLoLMonsterModifiers2PC98), kLoLMonsterModifiers2PC98 };
+
+static const uint16 kLoLMonsterModifiers3PC98[3] = {
+ 0x0140, 0x0100, 0x0080
+};
+
+static const Uint16Provider kLoLMonsterModifiers3PC98Provider = { ARRAYSIZE(kLoLMonsterModifiers3PC98), kLoLMonsterModifiers3PC98 };
+
+static const byte kLoLMonsterShiftOffsetsPC98[32] = {
+ 0x01, 0x01, 0x01, 0x00, 0x01, 0xFF, 0x00, 0xFF,
+ 0x00, 0x00, 0x00, 0x01, 0xFF, 0x01, 0xFF, 0x00,
+ 0xFF, 0xFF, 0x00, 0xFF, 0x00, 0x00, 0x00, 0x01,
+ 0x01, 0x01, 0x01, 0x00, 0x01, 0xFF, 0x00, 0x00
+};
+
+static const ByteProvider kLoLMonsterShiftOffsetsPC98Provider = { ARRAYSIZE(kLoLMonsterShiftOffsetsPC98), kLoLMonsterShiftOffsetsPC98 };
+
+static const byte kLoLMonsterDirFlagsPC98[16] = {
+ 0x08, 0x14, 0x00, 0x04, 0x04, 0x08, 0x14, 0x00,
+ 0x00, 0x04, 0x08, 0x14, 0x14, 0x00, 0x04, 0x08
+};
+
+static const ByteProvider kLoLMonsterDirFlagsPC98Provider = { ARRAYSIZE(kLoLMonsterDirFlagsPC98), kLoLMonsterDirFlagsPC98 };
+
+static const byte kLoLMonsterScaleYPC98[30] = {
+ 0x7C, 0x78, 0x74, 0x70, 0x6C, 0x68, 0x65, 0x62,
+ 0x5F, 0x5C, 0x59, 0x56, 0x53, 0x50, 0x4D, 0x4A,
+ 0x48, 0x46, 0x44, 0x43, 0x41, 0x40, 0x3E, 0x3D,
+ 0x3C, 0x3B, 0x3A, 0x39, 0x38, 0x38
+};
+
+static const ByteProvider kLoLMonsterScaleYPC98Provider = { ARRAYSIZE(kLoLMonsterScaleYPC98), kLoLMonsterScaleYPC98 };
+
+static const byte kLoLMonsterScaleXPC98[29] = {
+ 0x98, 0x98, 0x90, 0x88, 0x80, 0x76, 0x6E, 0x68,
+ 0x62, 0x5C, 0x58, 0x54, 0x50, 0x4A, 0x44, 0x40,
+ 0x3C, 0x38, 0x36, 0x32, 0x30, 0x2C, 0x2A, 0x28,
+ 0x26, 0x24, 0x22, 0x20, 0x20
+};
+
+static const ByteProvider kLoLMonsterScaleXPC98Provider = { ARRAYSIZE(kLoLMonsterScaleXPC98), kLoLMonsterScaleXPC98 };
+
+static const uint16 kLoLMonsterScaleWHPC98[65] = {
+ 0x0041, 0x0045, 0x0049, 0x004D, 0x0051, 0x0055, 0x0059, 0x005D,
+ 0x0062, 0x0066, 0x006A, 0x006E, 0x0072, 0x0076, 0x007A, 0x007E,
+ 0x0082, 0x0086, 0x008A, 0x008E, 0x0092, 0x0096, 0x009A, 0x009E,
+ 0x00A3, 0x00A7, 0x00AB, 0x00AF, 0x00B3, 0x00B7, 0x00BB, 0x00BF,
+ 0x00C3, 0x00C7, 0x00CB, 0x00CF, 0x00D3, 0x00D7, 0x00DB, 0x00DF,
+ 0x00E4, 0x00E8, 0x00EC, 0x00F0, 0x00F4, 0x00F8, 0x00FC, 0x0100,
+ 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100,
+ 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100,
+ 0x0100
+};
+
+static const Uint16Provider kLoLMonsterScaleWHPC98Provider = { ARRAYSIZE(kLoLMonsterScaleWHPC98), kLoLMonsterScaleWHPC98 };
+
+static const FlyingObjectShape kLoLFlyingObjectShpPC98[13] = {
+ { 0, 0, 1, 0x00, 0x40, },
+ { 2, 2, 3, 0x00, 0x00, },
+ { 4, 4, 4, 0x00, 0x00, },
+ { 5, 5, 5, 0x20, 0x00, },
+ { 6, 6, 6, 0x20, 0x00, },
+ { 7, 7, 7, 0x20, 0x00, },
+ { 9, 8, 15, 0x00, 0x00, },
+ { 11, 10, 12, 0x00, 0x00, },
+ { 12, 12, 12, 0x20, 0x00, },
+ { 14, 13, 15, 0x00, 0x00, },
+ { 16, 16, 16, 0x00, 0x00, },
+ { 17, 17, 17, 0x20, 0x00, },
+ { 18, 18, 18, 0x00, 0x00, }
+};
+
+static const FlyingObjectShapeProvider kLoLFlyingObjectShpPC98Provider = { ARRAYSIZE(kLoLFlyingObjectShpPC98), kLoLFlyingObjectShpPC98 };
+
+static const uint16 kLoLInventoryDescPC98[11] = {
+ 0x417A, 0x417B, 0x417A, 0x417B, 0x417C, 0x417D, 0x417E, 0x417F,
+ 0x4180, 0x4181, 0x4181
+};
+
+static const Uint16Provider kLoLInventoryDescPC98Provider = { ARRAYSIZE(kLoLInventoryDescPC98), kLoLInventoryDescPC98 };
+
+static const char *const kLoLLevelShpListPC98[12] = {
+ "KEEP.SHP",
+ "FOREST1.SHP",
+ "MANOR.SHP",
+ "CAVE1.SHP",
+ "SWAMP.SHP",
+ "URBISH.SHP",
+ "MINE1.SHP",
+ "TOWER1.SHP",
+ "YVEL1.SHP",
+ "CATWALK.SHP",
+ "RUIN.SHP",
+ "CIMMERIA.SHP"
+};
+
+static const StringListProvider kLoLLevelShpListPC98Provider = { ARRAYSIZE(kLoLLevelShpListPC98), kLoLLevelShpListPC98 };
+
+static const char *const kLoLLevelDatListPC98[12] = {
+ "KEEP.DAT",
+ "FOREST1.DAT",
+ "MANOR.DAT",
+ "CAVE1.DAT",
+ "SWAMP.DAT",
+ "URBISH.DAT",
+ "MINE1.DAT",
+ "TOWER1.DAT",
+ "YVEL1.DAT",
+ "CATWALK.DAT",
+ "RUIN.DAT",
+ "CIMMERIA.DAT"
+};
+
+static const StringListProvider kLoLLevelDatListPC98Provider = { ARRAYSIZE(kLoLLevelDatListPC98), kLoLLevelDatListPC98 };
+
+static const CompassDef kLoLCompassDefsPC98[32] = {
+ { 0, 3, -3, 0x00 },
+ { 1, 3, -3, 0x00 },
+ { 2, 3, -3, 0x00 },
+ { 3, 5, -3, 0x00 },
+ { 4, 5, -3, 0x00 },
+ { 5, 6, -3, 0x00 },
+ { 6, 6, -3, 0x00 },
+ { 7, 6, -3, 0x00 },
+ { 8, 6, -3, 0x00 },
+ { 7, 6, 4, 0x02 },
+ { 6, 6, 4, 0x02 },
+ { 5, 6, 4, 0x02 },
+ { 4, 5, 4, 0x02 },
+ { 3, 5, 4, 0x02 },
+ { 2, 3, 4, 0x02 },
+ { 1, 3, 4, 0x02 },
+ { 0, 3, 4, 0x02 },
+ { 1, 2, 4, 0x03 },
+ { 2, 2, 4, 0x03 },
+ { 3, 0, 4, 0x03 },
+ { 4, 0, 4, 0x03 },
+ { 5, -1, 4, 0x03 },
+ { 6, -1, 4, 0x03 },
+ { 7, -1, 4, 0x03 },
+ { 8, -1, -3, 0x01 },
+ { 7, -1, -3, 0x01 },
+ { 6, -1, -3, 0x01 },
+ { 5, -1, -3, 0x01 },
+ { 4, 0, -3, 0x01 },
+ { 3, 0, -3, 0x01 },
+ { 2, 2, -3, 0x01 },
+ { 1, 2, -3, 0x01 }
+};
+
+static const CompassDefProvider kLoLCompassDefsPC98Provider = { ARRAYSIZE(kLoLCompassDefsPC98), kLoLCompassDefsPC98 };
+
+static const byte kLoLStashSetupPC98[12] = {
+ 0x04, 0x04, 0x04, 0x04, 0x02, 0x02, 0x02, 0x03,
+ 0x03, 0x00, 0x01, 0x01
+};
+
+static const ByteProvider kLoLStashSetupPC98Provider = { ARRAYSIZE(kLoLStashSetupPC98), kLoLStashSetupPC98 };
+
+static const byte kLoLDscWallsPC98[36] = {
+ 0xFF, 0xFF, 0x02, 0x01, 0x02, 0x01, 0x02, 0xFF,
+ 0x02, 0x03, 0x02, 0x03, 0xFF, 0xFF, 0x02, 0x01,
+ 0x02, 0x01, 0x02, 0xFF, 0x02, 0x03, 0x02, 0x03,
+ 0x02, 0x01, 0x02, 0xFF, 0x02, 0x03, 0xFF, 0x01,
+ 0x02, 0xFF, 0xFF, 0x03
+};
+
+static const ByteProvider kLoLDscWallsPC98Provider = { ARRAYSIZE(kLoLDscWallsPC98), kLoLDscWallsPC98 };
+
+static const byte kLoLDscShapeIndexPC98[36] = {
+ 0x03, 0x09, 0x03, 0x08, 0x03, 0x07, 0x03, 0x03,
+ 0x03, 0xF9, 0x03, 0xF8, 0x03, 0xF7, 0x02, 0x09,
+ 0x02, 0x06, 0x02, 0x02, 0x02, 0xFA, 0x02, 0xF7,
+ 0x01, 0x05, 0x01, 0x01, 0x01, 0xFB, 0x00, 0x04,
+ 0x00, 0x00, 0x00, 0xFC
+};
+
+static const ByteProvider kLoLDscShapeIndexPC98Provider = { ARRAYSIZE(kLoLDscShapeIndexPC98), kLoLDscShapeIndexPC98 };
+
+static const byte kLoLDscOvlMapPC98[10] = {
+ 0x00, 0x01, 0x01, 0x01, 0x04, 0x05, 0x05, 0x05,
+ 0x05, 0x04
+};
+
+static const ByteProvider kLoLDscOvlMapPC98Provider = { ARRAYSIZE(kLoLDscOvlMapPC98), kLoLDscOvlMapPC98 };
+
+static const uint16 kLoLDscScaleWidthDataPC98[36] = {
+ 0x0060, 0x0000, 0x0060, 0x00CE, 0x0060, 0x0055, 0x0060, 0x0000,
+ 0x0060, 0x0055, 0x0060, 0x00CE, 0x0060, 0x0000, 0x00A0, 0x00AE,
+ 0x00A0, 0x00AA, 0x00A0, 0x0000, 0x00A0, 0x00AA, 0x00A0, 0x00AE,
+ 0x0100, 0x0100, 0x0100, 0x0000, 0x0100, 0x0100, 0x0000, 0x0100,
+ 0x0100, 0x0000, 0x0000, 0x0100
+};
+
+static const Uint16Provider kLoLDscScaleWidthDataPC98Provider = { ARRAYSIZE(kLoLDscScaleWidthDataPC98), kLoLDscScaleWidthDataPC98 };
+
+static const uint16 kLoLDscScaleHeightDataPC98[36] = {
+ 0x006A, 0x0000, 0x006A, 0x006A, 0x006A, 0x006A, 0x006A, 0x0000,
+ 0x006A, 0x006A, 0x006A, 0x006A, 0x006A, 0x0000, 0x00AA, 0x0056,
+ 0x00AA, 0x00AA, 0x00AA, 0x0000, 0x00AA, 0x00AA, 0x00AA, 0x0056,
+ 0x0100, 0x0100, 0x0100, 0x0000, 0x0100, 0x0100, 0x0000, 0x0100,
+ 0x0100, 0x0000, 0x0000, 0x0100
+};
+
+static const Uint16Provider kLoLDscScaleHeightDataPC98Provider = { ARRAYSIZE(kLoLDscScaleHeightDataPC98), kLoLDscScaleHeightDataPC98 };
+
+static const uint16 kLoLDscXPC98[36] = {
+ 0xFFB0, 0xFFE0, 0xFFE0, 0x0010, 0x0010, 0x0040, 0x0040, 0x0000,
+ 0x0070, 0x0070, 0x00A0, 0x00A0, 0x00D0, 0x00D0, 0xFF86, 0x0000,
+ 0xFFE0, 0x0030, 0x0030, 0x0000, 0x0080, 0x0080, 0x00D0, 0x00B0,
+ 0xFF98, 0x0018, 0x0018, 0x0000, 0x0098, 0x0098, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x00B0, 0x00B0
+};
+
+static const Uint16Provider kLoLDscXPC98Provider = { ARRAYSIZE(kLoLDscXPC98), kLoLDscXPC98 };
+
+static const byte kLoLBaseDscYPC98[36] = {
+ 0x1B, 0x1B, 0x1B, 0x1B, 0x1B, 0x1B, 0x1B, 0x1B,
+ 0x1B, 0x1B, 0x1B, 0x1B, 0x1B, 0x1B, 0x14, 0x1C,
+ 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x1C,
+ 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00
+};
+
+static const ByteProvider kLoLBaseDscYPC98Provider = { ARRAYSIZE(kLoLBaseDscYPC98), kLoLBaseDscYPC98 };
+
+static const byte kLoLDscTileIndexPC98[18] = {
+ 0x00, 0x06, 0x01, 0x05, 0x02, 0x04, 0x03, 0x07,
+ 0x0B, 0x08, 0x0A, 0x09, 0x0C, 0x0E, 0x0D, 0x0F,
+ 0x11, 0x10
+};
+
+static const ByteProvider kLoLDscTileIndexPC98Provider = { ARRAYSIZE(kLoLDscTileIndexPC98), kLoLDscTileIndexPC98 };
+
+static const byte kLoLDscUnk2PC98[23] = {
+ 0x00, 0x00, 0x00, 0x03, 0x03, 0x03, 0x03, 0x03,
+ 0x08, 0x08, 0x08, 0x08, 0x08, 0x0D, 0x0D, 0x0D,
+ 0x0D, 0x0D, 0x12, 0x12, 0x12, 0x12, 0x12
+};
+
+static const ByteProvider kLoLDscUnk2PC98Provider = { ARRAYSIZE(kLoLDscUnk2PC98), kLoLDscUnk2PC98 };
+
+static const byte kLoLDscDoorShapeIndexPC98[23] = {
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01,
+ 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01
+};
+
+static const ByteProvider kLoLDscDoorShapeIndexPC98Provider = { ARRAYSIZE(kLoLDscDoorShapeIndexPC98), kLoLDscDoorShapeIndexPC98 };
+
+static const byte kLoLDscDimData1PC98[324] = {
+ 0xD7, 0xD7, 0xD7, 0xD7, 0xD7, 0xD7, 0xD7, 0xD7,
+ 0xD7, 0xD7, 0xD7, 0xD7, 0xD7, 0xD7, 0xD7, 0xD7,
+ 0xD8, 0xD7, 0xD8, 0xD8, 0x02, 0xD8, 0xD8, 0xD8,
+ 0xD8, 0xFE, 0xD7, 0xD8, 0xD8, 0xD8, 0xD7, 0x03,
+ 0xD8, 0xFD, 0xD8, 0xD8, 0xD8, 0xFE, 0xD8, 0x08,
+ 0xD8, 0xD8, 0xD8, 0xFE, 0xF8, 0x06, 0xD8, 0xD8,
+ 0xFA, 0x03, 0xD8, 0xFD, 0xD8, 0xD8, 0xD8, 0xD8,
+ 0xD8, 0xD8, 0xD8, 0xD8, 0xD8, 0xD8, 0xFA, 0xD7,
+ 0x10, 0xD8, 0xFA, 0xD7, 0x10, 0xD8, 0xD8, 0xD8,
+ 0xD8, 0xD8, 0xD8, 0xF2, 0xD8, 0x14, 0xD8, 0xD8,
+ 0xD8, 0xF0, 0x0E, 0x14, 0xD8, 0xED, 0x10, 0xD8,
+ 0xD8, 0x13, 0xD8, 0xD8, 0xD8, 0xD8, 0xEC, 0xD8,
+ 0xD8, 0xD8, 0xD8, 0xD8, 0xD7, 0x14, 0xD8, 0xED,
+ 0xD7, 0xD8, 0xD8, 0x13, 0xD7, 0xD7, 0xD7, 0xD7,
+ 0xD7, 0xD7, 0xD7, 0xD7, 0xD7, 0xD7, 0xD7, 0xD7,
+ 0xD7, 0xD7, 0xD7, 0xD7, 0xD8, 0xD7, 0xD8, 0xD8,
+ 0xD8, 0xD8, 0xD8, 0xD8, 0xD8, 0xD8, 0xD7, 0xD8,
+ 0xD8, 0xD8, 0xD7, 0xD8, 0xD8, 0xD7, 0xD8, 0xD8,
+ 0xD8, 0xD8, 0xD8, 0xD8, 0xD8, 0xD8, 0xD8, 0xD8,
+ 0xD8, 0x06, 0xD8, 0xD8, 0xFA, 0x03, 0xD8, 0xFD,
+ 0xD8, 0xD8, 0xD8, 0xD8, 0xD8, 0xD8, 0xD8, 0xD8,
+ 0xD8, 0xD8, 0xFA, 0xD8, 0x10, 0xD8, 0xFA, 0xD7,
+ 0x10, 0xFD, 0xD8, 0x13, 0xD8, 0xD8, 0xD8, 0xD8,
+ 0xD8, 0xD8, 0xD8, 0xD8, 0xD8, 0xF0, 0xD8, 0xD8,
+ 0xD8, 0xED, 0x10, 0xD8, 0xD8, 0x13, 0xD8, 0xD8,
+ 0xD8, 0xD8, 0xD8, 0xD8, 0xD8, 0xD8, 0xD8, 0xD8,
+ 0xD7, 0xD8, 0xD8, 0xD8, 0xD7, 0xD8, 0xD8, 0xD7,
+ 0xD8, 0xD8, 0xD8, 0xD8, 0xD8, 0xD8, 0xD8, 0xD8,
+ 0xD8, 0xD8, 0xD8, 0xD8, 0xD8, 0x03, 0xD8, 0xFD,
+ 0xD8, 0xD8, 0xD8, 0xD8, 0xD8, 0xD8, 0xD8, 0xD8,
+ 0xD8, 0xD8, 0xD8, 0xD8, 0xD8, 0xD8, 0xFD, 0xD8,
+ 0x13, 0xFD, 0xD8, 0x13, 0xD8, 0xD8, 0xD8, 0xD8,
+ 0xD8, 0xD8, 0xD8, 0xD8, 0xD8, 0xD8, 0xD8, 0xD8,
+ 0xD8, 0xED, 0xD8, 0xD8, 0xD8, 0x13, 0xD8, 0xD8,
+ 0xD8, 0xD8, 0xD8, 0xD8, 0xD8, 0xD8, 0xD8, 0xD8,
+ 0xD8, 0xD8, 0xD8, 0xD8, 0xD8, 0xD8, 0xD8, 0xD8,
+ 0xD8, 0xD8, 0xD8, 0xD8, 0xD8, 0xD8, 0xD8, 0xD8,
+ 0xD8, 0xD8, 0xD8, 0xD8, 0xD8, 0xD8, 0xD8, 0xD8,
+ 0xD8, 0xD8, 0xD8, 0xD8, 0xD8, 0xD8, 0xD8, 0xD8,
+ 0xD8, 0xD8, 0xD8, 0xD8, 0xD8, 0xD8, 0xD8, 0xD8,
+ 0xD8, 0xD8, 0xD8, 0xD8
+};
+
+static const ByteProvider kLoLDscDimData1PC98Provider = { ARRAYSIZE(kLoLDscDimData1PC98), kLoLDscDimData1PC98 };
+
+static const byte kLoLDscDimData2PC98[648] = {
+ 0x16, 0x00, 0x16, 0x00, 0x16, 0x00, 0x16, 0x00,
+ 0x16, 0x00, 0x16, 0x00, 0x16, 0x00, 0x16, 0x00,
+ 0x16, 0x00, 0x16, 0x00, 0x16, 0x00, 0x16, 0x00,
+ 0x16, 0x00, 0x16, 0x00, 0x16, 0x00, 0x16, 0x00,
+ 0x00, 0x16, 0x16, 0x00, 0x00, 0x16, 0x00, 0x16,
+ 0x00, 0x02, 0x00, 0x16, 0x00, 0x16, 0x00, 0x16,
+ 0x00, 0x16, 0x02, 0x16, 0x00, 0x04, 0x00, 0x16,
+ 0x00, 0x16, 0x00, 0x16, 0x16, 0x00, 0x00, 0x03,
+ 0x00, 0x16, 0x03, 0x16, 0x00, 0x16, 0x00, 0x16,
+ 0x00, 0x16, 0x02, 0x16, 0x00, 0x16, 0x00, 0x08,
+ 0x00, 0x16, 0x00, 0x16, 0x00, 0x16, 0x00, 0x02,
+ 0x16, 0x00, 0x00, 0x06, 0x00, 0x16, 0x00, 0x16,
+ 0x06, 0x16, 0x00, 0x03, 0x00, 0x16, 0x03, 0x00,
+ 0x00, 0x16, 0x00, 0x16, 0x00, 0x16, 0x00, 0x16,
+ 0x00, 0x16, 0x00, 0x16, 0x00, 0x16, 0x00, 0x16,
+ 0x00, 0x16, 0x00, 0x16, 0x06, 0x16, 0x08, 0x0E,
+ 0x00, 0x10, 0x00, 0x16, 0x03, 0x16, 0x06, 0x10,
+ 0x00, 0x13, 0x00, 0x16, 0x00, 0x16, 0x00, 0x16,
+ 0x00, 0x16, 0x00, 0x16, 0x00, 0x16, 0x0E, 0x16,
+ 0x00, 0x16, 0x00, 0x14, 0x00, 0x16, 0x00, 0x16,
+ 0x00, 0x16, 0x10, 0x16, 0x16, 0x00, 0x00, 0x14,
+ 0x00, 0x16, 0x13, 0x16, 0x00, 0x10, 0x00, 0x16,
+ 0x00, 0x16, 0x00, 0x13, 0x00, 0x16, 0x00, 0x16,
+ 0x00, 0x16, 0x00, 0x16, 0x14, 0x16, 0x00, 0x16,
+ 0x00, 0x16, 0x00, 0x16, 0x00, 0x16, 0x00, 0x16,
+ 0x12, 0x16, 0x14, 0x16, 0x00, 0x16, 0x13, 0x16,
+ 0x16, 0x00, 0x00, 0x16, 0x00, 0x16, 0x00, 0x13,
+ 0x16, 0x00, 0x16, 0x00, 0x16, 0x00, 0x16, 0x00,
+ 0x16, 0x00, 0x16, 0x00, 0x16, 0x00, 0x16, 0x00,
+ 0x16, 0x00, 0x16, 0x00, 0x16, 0x00, 0x16, 0x00,
+ 0x16, 0x00, 0x16, 0x00, 0x16, 0x00, 0x16, 0x00,
+ 0x00, 0x16, 0x16, 0x00, 0x16, 0x00, 0x16, 0x00,
+ 0x16, 0x00, 0x16, 0x00, 0x16, 0x00, 0x16, 0x00,
+ 0x16, 0x00, 0x16, 0x00, 0x16, 0x00, 0x16, 0x00,
+ 0x16, 0x00, 0x16, 0x00, 0x16, 0x00, 0x16, 0x00,
+ 0x16, 0x00, 0x16, 0x00, 0x00, 0x16, 0x16, 0x00,
+ 0x00, 0x16, 0x00, 0x16, 0x00, 0x16, 0x00, 0x16,
+ 0x00, 0x16, 0x00, 0x16, 0x00, 0x16, 0x00, 0x16,
+ 0x00, 0x16, 0x00, 0x06, 0x00, 0x16, 0x00, 0x16,
+ 0x06, 0x16, 0x00, 0x03, 0x00, 0x16, 0x03, 0x16,
+ 0x00, 0x16, 0x00, 0x16, 0x00, 0x16, 0x00, 0x16,
+ 0x00, 0x16, 0x00, 0x16, 0x00, 0x16, 0x00, 0x16,
+ 0x00, 0x16, 0x00, 0x16, 0x06, 0x16, 0x00, 0x16,
+ 0x00, 0x10, 0x00, 0x16, 0x03, 0x16, 0x07, 0x0F,
+ 0x00, 0x13, 0x03, 0x16, 0x00, 0x16, 0x00, 0x13,
+ 0x00, 0x16, 0x00, 0x16, 0x00, 0x16, 0x00, 0x16,
+ 0x00, 0x16, 0x00, 0x16, 0x00, 0x16, 0x00, 0x16,
+ 0x00, 0x16, 0x10, 0x16, 0x00, 0x16, 0x00, 0x16,
+ 0x00, 0x16, 0x13, 0x16, 0x00, 0x10, 0x00, 0x16,
+ 0x00, 0x16, 0x00, 0x13, 0x16, 0x00, 0x16, 0x00,
+ 0x16, 0x00, 0x16, 0x00, 0x16, 0x00, 0x16, 0x00,
+ 0x16, 0x00, 0x16, 0x00, 0x16, 0x00, 0x16, 0x00,
+ 0x16, 0x00, 0x16, 0x00, 0x16, 0x00, 0x16, 0x00,
+ 0x16, 0x00, 0x16, 0x00, 0x00, 0x16, 0x16, 0x00,
+ 0x00, 0x16, 0x00, 0x16, 0x00, 0x16, 0x00, 0x16,
+ 0x00, 0x16, 0x00, 0x16, 0x00, 0x16, 0x00, 0x16,
+ 0x00, 0x16, 0x00, 0x16, 0x00, 0x16, 0x00, 0x16,
+ 0x00, 0x16, 0x00, 0x03, 0x00, 0x16, 0x03, 0x16,
+ 0x00, 0x16, 0x00, 0x16, 0x00, 0x16, 0x00, 0x16,
+ 0x00, 0x16, 0x00, 0x16, 0x00, 0x16, 0x00, 0x16,
+ 0x00, 0x16, 0x00, 0x16, 0x00, 0x16, 0x00, 0x16,
+ 0x00, 0x16, 0x00, 0x16, 0x03, 0x16, 0x00, 0x16,
+ 0x00, 0x13, 0x03, 0x16, 0x00, 0x16, 0x00, 0x13,
+ 0x00, 0x16, 0x00, 0x16, 0x00, 0x16, 0x00, 0x16,
+ 0x00, 0x16, 0x00, 0x16, 0x00, 0x16, 0x00, 0x16,
+ 0x00, 0x16, 0x00, 0x16, 0x00, 0x16, 0x00, 0x16,
+ 0x00, 0x16, 0x13, 0x16, 0x00, 0x16, 0x00, 0x16,
+ 0x00, 0x16, 0x00, 0x13, 0x00, 0x16, 0x00, 0x16,
+ 0x00, 0x16, 0x00, 0x16, 0x00, 0x16, 0x00, 0x16,
+ 0x00, 0x16, 0x00, 0x16, 0x00, 0x16, 0x00, 0x16,
+ 0x00, 0x16, 0x00, 0x16, 0x00, 0x16, 0x00, 0x16,
+ 0x00, 0x16, 0x00, 0x16, 0x00, 0x16, 0x00, 0x16,
+ 0x00, 0x16, 0x00, 0x16, 0x00, 0x16, 0x00, 0x16,
+ 0x00, 0x16, 0x00, 0x16, 0x00, 0x16, 0x00, 0x16,
+ 0x00, 0x16, 0x00, 0x16, 0x00, 0x16, 0x00, 0x16,
+ 0x00, 0x16, 0x00, 0x16, 0x00, 0x16, 0x00, 0x16,
+ 0x00, 0x16, 0x00, 0x16, 0x00, 0x16, 0x00, 0x16,
+ 0x00, 0x16, 0x00, 0x16, 0x00, 0x16, 0x00, 0x16,
+ 0x00, 0x16, 0x00, 0x16, 0x00, 0x16, 0x00, 0x16,
+ 0x00, 0x16, 0x00, 0x16, 0x00, 0x16, 0x00, 0x16,
+ 0x00, 0x16, 0x00, 0x16, 0x00, 0x16, 0x00, 0x16
+};
+
+static const ByteProvider kLoLDscDimData2PC98Provider = { ARRAYSIZE(kLoLDscDimData2PC98), kLoLDscDimData2PC98 };
+
+static const byte kLoLDscBlockMapPC98[12] = {
+ 0x02, 0x03, 0x00, 0x01, 0x01, 0x02, 0x03, 0x00,
+ 0x03, 0x00, 0x01, 0x02
+};
+
+static const ByteProvider kLoLDscBlockMapPC98Provider = { ARRAYSIZE(kLoLDscBlockMapPC98), kLoLDscBlockMapPC98 };
+
+static const byte kLoLDscDimMapPC98[18] = {
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01,
+ 0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x02, 0x03,
+ 0x03, 0x03
+};
+
+static const ByteProvider kLoLDscDimMapPC98Provider = { ARRAYSIZE(kLoLDscDimMapPC98), kLoLDscDimMapPC98 };
+
+static const byte kLoLDscOvlIndexPC98[20] = {
+ 0x00, 0x00, 0x01, 0x01, 0x01, 0x02, 0x02, 0x03,
+ 0x03, 0x03, 0x04, 0x04, 0x05, 0x05, 0x05, 0x06,
+ 0x06, 0x07, 0x07, 0x07
+};
+
+static const ByteProvider kLoLDscOvlIndexPC98Provider = { ARRAYSIZE(kLoLDscOvlIndexPC98), kLoLDscOvlIndexPC98 };
+
+static const byte kLoLDscBlockIndexPC98[72] = {
+ 0x9D, 0x9E, 0x9F, 0xA0, 0xA1, 0xA2, 0xA3, 0xBE,
+ 0xBF, 0xC0, 0xC1, 0xC2, 0xDF, 0xE0, 0xE1, 0xFF,
+ 0x00, 0x01, 0xA3, 0xC3, 0xE3, 0x03, 0x23, 0x43,
+ 0x63, 0xC2, 0xE2, 0x02, 0x22, 0x42, 0xE1, 0x01,
+ 0x21, 0xE0, 0x00, 0x20, 0x63, 0x62, 0x61, 0x60,
+ 0x5F, 0x5E, 0x5D, 0x42, 0x41, 0x40, 0x3F, 0x3E,
+ 0x21, 0x20, 0x1F, 0x01, 0x00, 0xFF, 0x5D, 0x3D,
+ 0x1D, 0xFD, 0xDD, 0xBD, 0x9D, 0x3E, 0x1E, 0xFE,
+ 0xDE, 0xBE, 0x1F, 0xFF, 0xDF, 0x20, 0x00, 0xE0
+};
+
+static const ByteProvider kLoLDscBlockIndexPC98Provider = { ARRAYSIZE(kLoLDscBlockIndexPC98), kLoLDscBlockIndexPC98 };
+
+static const byte kLoLDscDoorY2PC98[128] = {
+ 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
+ 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F,
+ 0x10, 0x11, 0x12, 0x13, 0x14, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x0D, 0x08, 0x03, 0x12, 0x0E, 0x09, 0x04, 0x00,
+ 0x13, 0x0F, 0x0A, 0x05, 0x01, 0x14, 0x10, 0x0B,
+ 0x06, 0x02, 0x11, 0x0C, 0x07, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x14, 0x13, 0x12, 0x11, 0x10, 0x0F, 0x0E, 0x0D,
+ 0x0C, 0x0B, 0x0A, 0x09, 0x08, 0x07, 0x06, 0x05,
+ 0x04, 0x03, 0x02, 0x01, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x07, 0x0C, 0x11, 0x02, 0x06, 0x0B, 0x10, 0x14,
+ 0x01, 0x05, 0x0A, 0x0F, 0x13, 0x00, 0x04, 0x09,
+ 0x0E, 0x12, 0x03, 0x08, 0x0D, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+};
+
+static const ByteProvider kLoLDscDoorY2PC98Provider = { ARRAYSIZE(kLoLDscDoorY2PC98), kLoLDscDoorY2PC98 };
+
+static const byte kLoLDscDoorFrameY1PC98[4] = {
+ 0x1E, 0x18, 0x10, 0x00
+};
+
+static const ByteProvider kLoLDscDoorFrameY1PC98Provider = { ARRAYSIZE(kLoLDscDoorFrameY1PC98), kLoLDscDoorFrameY1PC98 };
+
+static const byte kLoLDscDoorFrameY2PC98[4] = {
+ 0x3B, 0x47, 0x56, 0x78
+};
+
+static const ByteProvider kLoLDscDoorFrameY2PC98Provider = { ARRAYSIZE(kLoLDscDoorFrameY2PC98), kLoLDscDoorFrameY2PC98 };
+
+static const uint16 kLoLDscDoorScalePC98[8] = {
+ 0x0075, 0x006A, 0x00B9, 0x00B2, 0x0100, 0x0100, 0x0000, 0x0000
+};
+
+static const Uint16Provider kLoLDscDoorScalePC98Provider = { ARRAYSIZE(kLoLDscDoorScalePC98), kLoLDscDoorScalePC98 };
+
+static const uint16 kLoLDscDoor4PC98[4] = {
+ 0x0005, 0x0002, 0x0008, 0x787C
+};
+
+static const Uint16Provider kLoLDscDoor4PC98Provider = { ARRAYSIZE(kLoLDscDoor4PC98), kLoLDscDoor4PC98 };
+
+static const uint16 kLoLDscDoorXPC98[576] = {
+ 0xFF98, 0xFFA0, 0xFFA8, 0xFF90, 0xFF98, 0xFFA0, 0xFFA8, 0xFFB0,
+ 0xFF74, 0xFF7E, 0xFF88, 0xFF92, 0xFF9C, 0xFF74, 0xFF7E, 0xFF88,
+ 0xFF92, 0xFF9C, 0xFF64, 0xFF70, 0xFF7C, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0xFFB8, 0xFFC0, 0xFFC8, 0xFFB0, 0xFFB8, 0xFFC0, 0xFFC8, 0xFFD0,
+ 0xFF9C, 0xFFA6, 0xFFB0, 0xFFBA, 0xFFC4, 0xFF9C, 0xFFA6, 0xFFB0,
+ 0xFFBA, 0xFFC4, 0xFF94, 0xFFA0, 0xFFAC, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0xFFD8, 0xFFE0, 0xFFE8, 0xFFD0, 0xFFD8, 0xFFE0, 0xFFE8, 0xFFF0,
+ 0xFFC4, 0xFFCE, 0xFFD8, 0xFFE2, 0xFFEC, 0xFFC4, 0xFFCE, 0xFFD8,
+ 0xFFE2, 0xFFEC, 0xFFC4, 0xFFD0, 0xFFDC, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0xFFF8, 0x0000, 0x0008, 0xFFF0, 0xFFF8, 0x0000, 0x0008, 0x0010,
+ 0xFFEC, 0xFFF6, 0x0000, 0x000A, 0x0014, 0xFFEC, 0xFFF6, 0x0000,
+ 0x000A, 0x0014, 0xFFF4, 0x0000, 0x000C, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0018, 0x0020, 0x0028, 0x0010, 0x0018, 0x0020, 0x0028, 0x0030,
+ 0x0014, 0x001E, 0x0028, 0x0032, 0x003C, 0x0014, 0x001E, 0x0028,
+ 0x0032, 0x003C, 0x0024, 0x0030, 0x003C, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0038, 0x0040, 0x0048, 0x0030, 0x0038, 0x0040, 0x0048, 0x0050,
+ 0x003C, 0x0046, 0x0050, 0x005A, 0x0064, 0x003C, 0x0046, 0x0050,
+ 0x005A, 0x0064, 0x0054, 0x0060, 0x006C, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0058, 0x0060, 0x0068, 0x0050, 0x0058, 0x0060, 0x0068, 0x0070,
+ 0x0064, 0x006E, 0x0078, 0x0082, 0x008C, 0x0064, 0x006E, 0x0078,
+ 0x0082, 0x008C, 0x0084, 0x0090, 0x009C, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0xFF94, 0xFFA0, 0xFFAC, 0xFF7E, 0xFF8B, 0xFF98, 0xFFA5, 0xFFB2,
+ 0xFF6C, 0xFF7B, 0xFF8A, 0xFF99, 0xFFA7, 0xFF60, 0xFF70, 0xFF80,
+ 0xFF90, 0xFFA0, 0xFF4C, 0xFF60, 0xFF74, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0xFFC4, 0xFFD0, 0xFFDC, 0xFFB2, 0xFFBF, 0xFFCC, 0xFFD9, 0xFFE6,
+ 0xFFA7, 0xFFB6, 0xFFC5, 0xFFD4, 0xFFE2, 0xFFA0, 0xFFB0, 0xFFC0,
+ 0xFFD0, 0xFFE0, 0xFF9C, 0xFFB0, 0xFFC4, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0xFFF4, 0x0000, 0x000C, 0xFFE6, 0xFFF3, 0x0000, 0x000D, 0x001A,
+ 0xFFE2, 0xFFF1, 0x0000, 0x000F, 0x001E, 0xFFE0, 0xFFF0, 0x0000,
+ 0x0010, 0x0020, 0xFFEC, 0x0000, 0x0014, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0024, 0x0030, 0x003C, 0x001A, 0x0027, 0x0034, 0x0041, 0x004E,
+ 0x001E, 0x002C, 0x003B, 0x004A, 0x0059, 0x0020, 0x0030, 0x0040,
+ 0x0050, 0x0060, 0x003C, 0x0050, 0x0064, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0054, 0x0060, 0x006C, 0x004E, 0x005B, 0x0068, 0x0075, 0x0082,
+ 0x0059, 0x0067, 0x0076, 0x0085, 0x0094, 0x0060, 0x0070, 0x0080,
+ 0x0090, 0x00A0, 0x008C, 0x00A0, 0x00B4, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0xFF9C, 0xFFB0, 0xFFC4, 0xFF7C, 0xFF92, 0xFFA8, 0xFFBE, 0xFFD4,
+ 0xFF6D, 0xFF85, 0xFF9E, 0xFFB6, 0xFFCF, 0xFF5E, 0xFF79, 0xFF94,
+ 0xFFAF, 0xFFCA, 0xFF60, 0xFF80, 0xFFA0, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0xFFEC, 0x0000, 0x0014, 0xFFD4, 0xFFEA, 0x0000, 0x0016, 0x002C,
+ 0xFFCF, 0xFFE7, 0x0000, 0x0019, 0x0031, 0xFFCA, 0xFFE5, 0x0000,
+ 0x001B, 0x0036, 0xFFE0, 0x0000, 0x0020, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x003C, 0x0050, 0x0064, 0x002C, 0x0042, 0x0058, 0x006E, 0x0084,
+ 0x0031, 0x004A, 0x0062, 0x007B, 0x0093, 0x0036, 0x0051, 0x006C,
+ 0x0087, 0x00A2, 0x0060, 0x0080, 0x00A0, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0xFF60, 0xFF80, 0xFFA0, 0xFF1C, 0xFF42, 0xFF68, 0xFF8E, 0xFFB4,
+ 0xFF40, 0xFF60, 0xFF80, 0xFFA0, 0xFFC0, 0xFF1C, 0xFF42, 0xFF68,
+ 0xFF8E, 0xFFB4, 0xFF60, 0xFF80, 0xFFA0, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0xFFE0, 0x0000, 0x0020, 0xFFB4, 0xFFDA, 0x0000, 0x0026, 0x004C,
+ 0xFFC0, 0xFFE0, 0x0000, 0x0020, 0x0040, 0xFFB4, 0xFFDA, 0x0000,
+ 0x0026, 0x004C, 0xFFE0, 0x0000, 0x0020, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0060, 0x0080, 0x00A0, 0x004C, 0x0072, 0x0098, 0x00BE, 0x00E4,
+ 0x0040, 0x0060, 0x0080, 0x00A0, 0x00C0, 0x004C, 0x0072, 0x0098,
+ 0x00BE, 0x00E4, 0x0060, 0x0080, 0x00A0, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000
+};
+
+static const Uint16Provider kLoLDscDoorXPC98Provider = { ARRAYSIZE(kLoLDscDoorXPC98), kLoLDscDoorXPC98 };
+
+static const uint16 kLoLDscDoorYPC98[576] = {
+ 0xFFBF, 0xFFBF, 0xFFBF, 0xFFC1, 0xFFC1, 0xFFC1, 0xFFC1, 0xFFC1,
+ 0xFFC3, 0xFFC3, 0xFFC3, 0xFFC3, 0xFFC3, 0xFFC5, 0xFFC5, 0xFFC5,
+ 0xFFC5, 0xFFC5, 0xFFC9, 0xFFC9, 0xFFC9, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0xFFBF, 0xFFBF, 0xFFBF, 0xFFC1, 0xFFC1, 0xFFC1, 0xFFC1, 0xFFC1,
+ 0xFFC3, 0xFFC3, 0xFFC3, 0xFFC3, 0xFFC3, 0xFFC5, 0xFFC5, 0xFFC5,
+ 0xFFC5, 0xFFC5, 0xFFC9, 0xFFC9, 0xFFC9, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0xFFBF, 0xFFBF, 0xFFBF, 0xFFC1, 0xFFC1, 0xFFC1, 0xFFC1, 0xFFC1,
+ 0xFFC3, 0xFFC3, 0xFFC3, 0xFFC3, 0xFFC3, 0xFFC5, 0xFFC5, 0xFFC5,
+ 0xFFC5, 0xFFC5, 0xFFC9, 0xFFC9, 0xFFC9, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0xFFBF, 0xFFBF, 0xFFBF, 0xFFC1, 0xFFC1, 0xFFC1, 0xFFC1, 0xFFC1,
+ 0xFFC3, 0xFFC3, 0xFFC3, 0xFFC3, 0xFFC3, 0xFFC5, 0xFFC5, 0xFFC5,
+ 0xFFC5, 0xFFC5, 0xFFC9, 0xFFC9, 0xFFC9, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0xFFBF, 0xFFBF, 0xFFBF, 0xFFC1, 0xFFC1, 0xFFC1, 0xFFC1, 0xFFC1,
+ 0xFFC3, 0xFFC3, 0xFFC3, 0xFFC3, 0xFFC3, 0xFFC5, 0xFFC5, 0xFFC5,
+ 0xFFC5, 0xFFC5, 0xFFC9, 0xFFC9, 0xFFC9, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0xFFBF, 0xFFBF, 0xFFBF, 0xFFC1, 0xFFC1, 0xFFC1, 0xFFC1, 0xFFC1,
+ 0xFFC3, 0xFFC3, 0xFFC3, 0xFFC3, 0xFFC3, 0xFFC5, 0xFFC5, 0xFFC5,
+ 0xFFC5, 0xFFC5, 0xFFC9, 0xFFC9, 0xFFC9, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0xFFBF, 0xFFBF, 0xFFBF, 0xFFC1, 0xFFC1, 0xFFC1, 0xFFC1, 0xFFC1,
+ 0xFFC3, 0xFFC3, 0xFFC3, 0xFFC3, 0xFFC3, 0xFFC5, 0xFFC5, 0xFFC5,
+ 0xFFC5, 0xFFC5, 0xFFC9, 0xFFC9, 0xFFC9, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0xFFC9, 0xFFC9, 0xFFC9, 0xFFCB, 0xFFCB, 0xFFCB, 0xFFCB, 0xFFCB,
+ 0xFFCE, 0xFFCE, 0xFFCE, 0xFFCE, 0xFFCE, 0xFFD3, 0xFFD3, 0xFFD3,
+ 0xFFD3, 0xFFD3, 0xFFD7, 0xFFD7, 0xFFD7, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0xFFC9, 0xFFC9, 0xFFC9, 0xFFCB, 0xFFCB, 0xFFCB, 0xFFCB, 0xFFCB,
+ 0xFFCE, 0xFFCE, 0xFFCE, 0xFFCE, 0xFFCE, 0xFFD3, 0xFFD3, 0xFFD3,
+ 0xFFD3, 0xFFD3, 0xFFD7, 0xFFD7, 0xFFD7, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0xFFC9, 0xFFC9, 0xFFC9, 0xFFCB, 0xFFCB, 0xFFCB, 0xFFCB, 0xFFCB,
+ 0xFFCE, 0xFFCE, 0xFFCE, 0xFFCE, 0xFFCE, 0xFFD3, 0xFFD3, 0xFFD3,
+ 0xFFD3, 0xFFD3, 0xFFD7, 0xFFD7, 0xFFD7, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0xFFC9, 0xFFC9, 0xFFC9, 0xFFCB, 0xFFCB, 0xFFCB, 0xFFCB, 0xFFCB,
+ 0xFFCE, 0xFFCE, 0xFFCE, 0xFFCE, 0xFFCE, 0xFFD3, 0xFFD3, 0xFFD3,
+ 0xFFD3, 0xFFD3, 0xFFD7, 0xFFD7, 0xFFD7, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0xFFC9, 0xFFC9, 0xFFC9, 0xFFCB, 0xFFCB, 0xFFCB, 0xFFCB, 0xFFCB,
+ 0xFFCE, 0xFFCE, 0xFFCE, 0xFFCE, 0xFFCE, 0xFFD3, 0xFFD3, 0xFFD3,
+ 0xFFD3, 0xFFD3, 0xFFD7, 0xFFD7, 0xFFD7, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0xFFD7, 0xFFD7, 0xFFD7, 0xFFDD, 0xFFDD, 0xFFDD, 0xFFDD, 0xFFDD,
+ 0xFFE2, 0xFFE2, 0xFFE2, 0xFFE2, 0xFFE2, 0xFFEA, 0xFFEA, 0xFFEA,
+ 0xFFEA, 0xFFEA, 0xFFF8, 0xFFF8, 0xFFF8, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0xFFD7, 0xFFD7, 0xFFD7, 0xFFDD, 0xFFDD, 0xFFDD, 0xFFDD, 0xFFDD,
+ 0xFFE2, 0xFFE2, 0xFFE2, 0xFFE2, 0xFFE2, 0xFFEA, 0xFFEA, 0xFFEA,
+ 0xFFEA, 0xFFEA, 0xFFF8, 0xFFF8, 0xFFF8, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0xFFD7, 0xFFD7, 0xFFD7, 0xFFDD, 0xFFDD, 0xFFDD, 0xFFDD, 0xFFDD,
+ 0xFFE2, 0xFFE2, 0xFFE2, 0xFFE2, 0xFFE2, 0xFFEA, 0xFFEA, 0xFFEA,
+ 0xFFEA, 0xFFEA, 0xFFF8, 0xFFF8, 0xFFF8, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0xFFF8, 0xFFF8, 0xFFF8, 0xFFFC, 0xFFFC, 0xFFFC, 0xFFFC, 0xFFFC,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0xFFF8, 0xFFF8, 0xFFF8, 0xFFFC, 0xFFFC, 0xFFFC, 0xFFFC, 0xFFFC,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0xFFF8, 0xFFF8, 0xFFF8, 0xFFFC, 0xFFFC, 0xFFFC, 0xFFFC, 0xFFFC,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000
+};
+
+static const Uint16Provider kLoLDscDoorYPC98Provider = { ARRAYSIZE(kLoLDscDoorYPC98), kLoLDscDoorYPC98 };
+
+static const byte kLoLScrollXTopPC98[5] = {
+ 0x05, 0x0A, 0x0F, 0x14, 0x19
+};
+
+static const ByteProvider kLoLScrollXTopPC98Provider = { ARRAYSIZE(kLoLScrollXTopPC98), kLoLScrollXTopPC98 };
+
+static const byte kLoLScrollYTopPC98[5] = {
+ 0x02, 0x04, 0x07, 0x09, 0x0C
+};
+
+static const ByteProvider kLoLScrollYTopPC98Provider = { ARRAYSIZE(kLoLScrollYTopPC98), kLoLScrollYTopPC98 };
+
+static const byte kLoLScrollXBottomPC98[5] = {
+ 0x05, 0x0A, 0x0F, 0x14, 0x19
+};
+
+static const ByteProvider kLoLScrollXBottomPC98Provider = { ARRAYSIZE(kLoLScrollXBottomPC98), kLoLScrollXBottomPC98 };
+
+static const byte kLoLScrollYBottomPC98[5] = {
+ 0x04, 0x08, 0x0C, 0x10, 0x14
+};
+
+static const ByteProvider kLoLScrollYBottomPC98Provider = { ARRAYSIZE(kLoLScrollYBottomPC98), kLoLScrollYBottomPC98 };
+
+static const LoLButtonDef kLoLButtonDefsPC98[95] = {
+ { 0x1100, 68, 324, 33, 131, 22, 19, 0x0000, 0 },
+ { 0x1100, 72, 328, 33, 150, 22, 18, 0x0000, 0 },
+ { 0x1100, 76, 332, 33, 150, 22, 18, 0x0000, 0 },
+ { 0x1100, 71, 327, 11, 150, 22, 18, 0x0000, 0 },
+ { 0x1100, 73, 329, 53, 150, 22, 18, 0x0000, 0 },
+ { 0x1100, 67, 323, 11, 131, 22, 19, 0x0000, 0 },
+ { 0x1100, 69, 325, 53, 131, 22, 19, 0x0000, 0 },
+ { 0x0100, 99, 0, 80, 143, 22, 17, 0x0000, 0 },
+ { 0x0100, 100, 0, 80, 143, 22, 17, 0x0001, 0 },
+ { 0x0100, 101, 0, 80, 143, 22, 17, 0x0002, 0 },
+ { 0x0100, 102, 0, 80, 143, 22, 17, 0x0003, 0 },
+ { 0x1100, 0, 0, 80, 160, 22, 17, 0x0000, 0 },
+ { 0x1100, 0, 0, 80, 160, 22, 17, 0x0001, 0 },
+ { 0x1100, 0, 0, 80, 160, 22, 17, 0x0002, 0 },
+ { 0x1100, 0, 0, 80, 160, 22, 17, 0x0003, 0 },
+ { 0x1100, 0, 0, 80, 144, 22, 32, 0x0000, 0 },
+ { 0x1100, 1, 0, 0, 0, 320, 200, 0x0003, 0 },
+ { 0x0100, 0, 0, 80, 143, 33, 34, 0x0000, 0 },
+ { 0x0100, 0, 0, 80, 143, 33, 34, 0x0001, 0 },
+ { 0x0100, 0, 0, 80, 143, 33, 34, 0x0002, 0 },
+ { 0x0100, 0, 0, 80, 143, 33, 34, 0x0003, 0 },
+ { 0x0100, 0, 0, 80, 143, 66, 34, 0x0000, 0 },
+ { 0x0100, 0, 0, 80, 143, 66, 34, 0x0001, 0 },
+ { 0x0100, 0, 0, 80, 143, 66, 34, 0x0002, 0 },
+ { 0x0100, 0, 0, 80, 143, 66, 34, 0x0003, 0 },
+ { 0x0100, 0, 0, 80, 143, 12, 34, 0x0000, 0 },
+ { 0x0100, 0, 0, 80, 143, 12, 34, 0x0001, 0 },
+ { 0x0100, 0, 0, 80, 143, 12, 34, 0x0002, 0 },
+ { 0x0100, 0, 0, 80, 143, 12, 34, 0x0003, 0 },
+ { 0x1000, 0, 0, 80, 143, 66, 34, 0x0000, 0 },
+ { 0x1000, 0, 0, 80, 143, 66, 34, 0x0001, 0 },
+ { 0x1000, 0, 0, 80, 143, 66, 34, 0x0002, 0 },
+ { 0x1000, 0, 0, 80, 143, 66, 34, 0x0003, 0 },
+ { 0x1100, 0, 0, 0, 0, 20, 19, 0x0000, 2 },
+ { 0x1100, 0, 0, 0, 0, 20, 19, 0x0001, 2 },
+ { 0x1100, 0, 0, 0, 0, 20, 19, 0x0002, 2 },
+ { 0x1100, 0, 0, 0, 0, 20, 19, 0x0003, 2 },
+ { 0x1100, 0, 0, 0, 0, 20, 19, 0x0004, 2 },
+ { 0x1100, 0, 0, 0, 0, 20, 19, 0x0005, 2 },
+ { 0x1100, 0, 0, 0, 0, 20, 19, 0x0006, 2 },
+ { 0x1100, 0, 0, 0, 0, 20, 19, 0x0007, 2 },
+ { 0x1100, 0, 0, 0, 0, 20, 19, 0x0008, 2 },
+ { 0x1100, 0, 0, 0, 0, 12, 11, 0x0009, 2 },
+ { 0x1100, 0, 0, 0, 0, 12, 11, 0x000A, 2 },
+ { 0x1100, 1, 0, 160, 93, 43, 19, 0x0000, 2 },
+ { 0x1100, 0, 0, 0, 102, 88, 19, 0x0000, 2 },
+ { 0x1100, 0, 0, 88, 102, 88, 19, 0x0001, 2 },
+ { 0x1100, 0, 0, 0, 85, 88, 17, 0x0002, 2 },
+ { 0x1100, 0, 0, 88, 85, 88, 17, 0x0003, 2 },
+ { 0x1100, 0, 0, 0, 0, 176, 120, 0x0000, 2 },
+ { 0x1100, 0, 0, 106, 179, 21, 21, 0x0000, 0 },
+ { 0x1100, 0, 0, 127, 179, 21, 21, 0x0001, 0 },
+ { 0x1100, 0, 0, 148, 179, 21, 21, 0x0002, 0 },
+ { 0x1100, 0, 0, 169, 179, 21, 21, 0x0003, 0 },
+ { 0x1100, 0, 0, 190, 179, 21, 21, 0x0004, 0 },
+ { 0x1100, 0, 0, 211, 179, 21, 21, 0x0005, 0 },
+ { 0x1100, 0, 0, 232, 179, 21, 21, 0x0006, 0 },
+ { 0x1100, 0, 0, 253, 179, 21, 21, 0x0007, 0 },
+ { 0x1100, 0, 0, 274, 179, 21, 21, 0x0008, 0 },
+ { 0x1100, 0, 0, 274, 179, 21, 21, 0x0009, 0 },
+ { 0x1100, 0, 0, 85, 179, 21, 21, 0xFFFF, 0 },
+ { 0x1100, 0, 0, 295, 179, 22, 21, 0x0001, 0 },
+ { 0x1100, 0, 0, 24, 8, 128, 96, 0x0001, 2 },
+ { 0x1100, 0, 0, 0, 0, 176, 120, 0x0000, 2 },
+ { 0x1100, 0, 0, 0, 0, 0, 0, 0x0000, 0 },
+ { 0x1100, 0, 0, 112, 0, 176, 16, 0x0001, 0 },
+ { 0x1100, 0, 0, 112, 110, 176, 26, 0x0001, 0 },
+ { 0x1100, 0, 0, 96, 88, 32, 32, 0x0001, 0 },
+ { 0x1100, 0, 0, 272, 88, 32, 32, 0x0001, 0 },
+ { 0x1100, 0, 0, 96, 16, 32, 72, 0x0001, 0 },
+ { 0x1100, 0, 0, 272, 16, 32, 72, 0x0001, 0 },
+ { 0x1100, 0, 0, 24, 15, 61, 9, 0x0000, 0 },
+ { 0x1100, 0, 0, 24, 24, 61, 9, 0x0000, 0 },
+ { 0x1100, 0, 0, 24, 33, 61, 9, 0x0000, 0 },
+ { 0x1100, 0, 0, 24, 42, 61, 9, 0x0000, 0 },
+ { 0x1100, 0, 0, 24, 51, 61, 9, 0x0000, 0 },
+ { 0x1100, 0, 0, 24, 60, 61, 9, 0x0000, 0 },
+ { 0x1100, 0, 0, 24, 69, 61, 9, 0x0000, 0 },
+ { 0x1100, 0, 0, 24, 78, 61, 9, 0x0000, 0 },
+ { 0x1100, 0, 0, 24, 87, 61, 9, 0x0000, 0 },
+ { 0x1100, 0, 0, 24, 96, 61, 9, 0x0000, 0 },
+ { 0x0100, 0, 0, 80, 143, 66, 34, 0x0000, 0 },
+ { 0x0100, 0, 0, 80, 143, 66, 34, 0x0001, 0 },
+ { 0x0100, 0, 0, 80, 143, 66, 34, 0x0002, 0 },
+ { 0x0100, 0, 0, 80, 143, 66, 34, 0x0003, 0 },
+ { 0x1100, 1, 0, 0, 0, 320, 200, 0x0003, 0 },
+ { 0x0100, 0, 0, 112, 0, 88, 80, 0x0000, 0 },
+ { 0x0100, 0, 0, 200, 0, 88, 80, 0x0001, 0 },
+ { 0x1100, 25, 1, 11, 178, 21, 22, 0x0000, 0 },
+ { 0x0100, 20, 0, 32, 178, 22, 22, 0x0000, 0 },
+ { 0x0100, 0, 0, 291, 96, 27, 24, 0x0000, 0 },
+ { 0x0100, 0, 0, 289, 0, 31, 28, 0x0000, 0 },
+ { 0x0100, 0, 0, 289, 31, 31, 23, 0x0000, 0 },
+ { 0x0100, 0, 0, 291, 56, 29, 24, 0x0000, 0 },
+ { 0x1100, 0, 0, 220, 98, 43, 19, 0x0000, 0 }
+};
+
+static const LoLButtonDefProvider kLoLButtonDefsPC98Provider = { ARRAYSIZE(kLoLButtonDefsPC98), kLoLButtonDefsPC98 };
+
+static const byte kLoLButtonList1PC98[40] = {
+ 0x59, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x31,
+ 0x3E, 0x2D, 0x2E, 0x2F, 0x30, 0x56, 0x57, 0x01,
+ 0x02, 0x00, 0x03, 0x04, 0x05, 0x06, 0x32, 0x33,
+ 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3A, 0x3B,
+ 0x3C, 0x3D, 0x58, 0x5A, 0x5B, 0x5C, 0x5D, 0xFF
+};
+
+static const ByteProvider kLoLButtonList1PC98Provider = { ARRAYSIZE(kLoLButtonList1PC98), kLoLButtonList1PC98 };
+
+static const byte kLoLButtonList2PC98[15] = {
+ 0x2C, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38,
+ 0x39, 0x3A, 0x3B, 0x3C, 0x3D, 0x5E, 0xFF
+};
+
+static const ByteProvider kLoLButtonList2PC98Provider = { ARRAYSIZE(kLoLButtonList2PC98), kLoLButtonList2PC98 };
+
+static const byte kLoLButtonList3PC98[2] = {
+ 0x40, 0xFF
+};
+
+static const ByteProvider kLoLButtonList3PC98Provider = { ARRAYSIZE(kLoLButtonList3PC98), kLoLButtonList3PC98 };
+
+static const byte kLoLButtonList4PC98[15] = {
+ 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39,
+ 0x3A, 0x3B, 0x3C, 0x3D, 0x5A, 0x5B, 0xFF
+};
+
+static const ByteProvider kLoLButtonList4PC98Provider = { ARRAYSIZE(kLoLButtonList4PC98), kLoLButtonList4PC98 };
+
+static const byte kLoLButtonList5PC98[16] = {
+ 0x01, 0x02, 0x00, 0x03, 0x04, 0x05, 0x06, 0x41,
+ 0x42, 0x43, 0x44, 0x45, 0x46, 0x5A, 0x5B, 0xFF
+};
+
+static const ByteProvider kLoLButtonList5PC98Provider = { ARRAYSIZE(kLoLButtonList5PC98), kLoLButtonList5PC98 };
+
+static const byte kLoLButtonList6PC98[14] = {
+ 0x2C, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38,
+ 0x39, 0x3A, 0x3B, 0x3C, 0x3D, 0xFF
+};
+
+static const ByteProvider kLoLButtonList6PC98Provider = { ARRAYSIZE(kLoLButtonList6PC98), kLoLButtonList6PC98 };
+
+static const byte kLoLButtonList7PC98[3] = {
+ 0x0F, 0x10, 0xFF
+};
+
+static const ByteProvider kLoLButtonList7PC98Provider = { ARRAYSIZE(kLoLButtonList7PC98), kLoLButtonList7PC98 };
+
+static const byte kLoLButtonList8PC98[2] = {
+ 0x55, 0xFF
+};
+
+static const ByteProvider kLoLButtonList8PC98Provider = { ARRAYSIZE(kLoLButtonList8PC98), kLoLButtonList8PC98 };
+
+static const byte kLoLLegendDataPC98[60] = {
+ 0x0E, 0x00, 0x00, 0x07, 0x42, 0x19, 0x00, 0x00,
+ 0x08, 0x42, 0x1A, 0x00, 0x00, 0x09, 0x42, 0x0D,
+ 0x00, 0x00, 0x0A, 0x42, 0x0A, 0x00, 0x00, 0x0B,
+ 0x42, 0x0B, 0x00, 0x00, 0x0C, 0x42, 0x0F, 0x00,
+ 0x00, 0x0D, 0x42, 0x16, 0x00, 0x00, 0x0E, 0x42,
+ 0x17, 0x00, 0x00, 0x0F, 0x42, 0x11, 0x00, 0x00,
+ 0x10, 0x42, 0x12, 0x00, 0xFB, 0x51, 0x42, 0xFF,
+ 0xFF, 0xFF, 0xFF, 0xFF
+};
+
+static const ByteProvider kLoLLegendDataPC98Provider = { ARRAYSIZE(kLoLLegendDataPC98), kLoLLegendDataPC98 };
+
+static const uint16 kLoLMapStringIdPC98[30] = {
+ 0xFFFF, 0x4211, 0x4212, 0x4213, 0x4214, 0x4215, 0x4216, 0x4217,
+ 0x4218, 0x4219, 0x421A, 0x421B, 0x421C, 0x421D, 0x421E, 0x421F,
+ 0x4220, 0x4221, 0x4222, 0x4223, 0x4224, 0x4225, 0x4226, 0x4227,
+ 0x4228, 0x4229, 0x422A, 0x422B, 0x422C, 0x422D
+};
+
+static const Uint16Provider kLoLMapStringIdPC98Provider = { ARRAYSIZE(kLoLMapStringIdPC98), kLoLMapStringIdPC98 };
+
+static const byte kLoLSpellbookAnimPC98[28] = {
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x04, 0x00, 0x13, 0xB6, 0x04, 0x00, 0x13, 0x4D,
+ 0x04, 0x00, 0x13, 0xB9, 0x04, 0x00, 0x13, 0xB8,
+ 0x04, 0x00, 0x13, 0xBA
+};
+
+static const ByteProvider kLoLSpellbookAnimPC98Provider = { ARRAYSIZE(kLoLSpellbookAnimPC98), kLoLSpellbookAnimPC98 };
+
+static const byte kLoLSpellbookCoordsPC98[12] = {
+ 0x16, 0x16, 0x16, 0x1F, 0x16, 0x28, 0x16, 0x31,
+ 0x16, 0x3A, 0x16, 0x43
+};
+
+static const ByteProvider kLoLSpellbookCoordsPC98Provider = { ARRAYSIZE(kLoLSpellbookCoordsPC98), kLoLSpellbookCoordsPC98 };
+
+static const byte kLoLHealShapeFramesPC98[80] = {
+ 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x02, 0x02,
+ 0x02, 0x02, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x01, 0x01, 0x02, 0x02, 0x03, 0x03,
+ 0x03, 0x03, 0x02, 0x02, 0x01, 0x01, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05,
+ 0x05, 0x04, 0x03, 0x02, 0x01, 0x00, 0x00, 0x00,
+ 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
+ 0x07, 0x06, 0x05, 0x04, 0x03, 0x02, 0x01, 0x00,
+ 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
+ 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F
+};
+
+static const ByteProvider kLoLHealShapeFramesPC98Provider = { ARRAYSIZE(kLoLHealShapeFramesPC98), kLoLHealShapeFramesPC98 };
+
+static const byte kLoLLightningDefsPC98[20] = {
+ 0x06, 0x05, 0xAB, 0x00, 0x06, 0x04, 0xAB, 0x00,
+ 0x08, 0x04, 0xAA, 0x00, 0x06, 0x03, 0xAA, 0x00,
+ 0x06, 0x02, 0xA9, 0x00
+};
+
+static const ByteProvider kLoLLightningDefsPC98Provider = { ARRAYSIZE(kLoLLightningDefsPC98), kLoLLightningDefsPC98 };
+
+static const uint16 kLoLFireballCoordsPC98[256] = {
+ 0x0000, 0x0324, 0x0647, 0x096A, 0x0C8B, 0x0FAB, 0x12C7, 0x15E1,
+ 0x18F8, 0x1C0B, 0x1F19, 0x2223, 0x2527, 0x2826, 0x2B1E, 0x2E10,
+ 0x30FB, 0x33DE, 0x36B9, 0x398C, 0x3C56, 0x3F16, 0x41CD, 0x447A,
+ 0x471C, 0x49B3, 0x4C3F, 0x4EBF, 0x5133, 0x539A, 0x55F4, 0x5842,
+ 0x5A81, 0x5CB3, 0x5ED6, 0x60EB, 0x62F1, 0x64E7, 0x66CE, 0x68A5,
+ 0x6A6C, 0x6C23, 0x6DC9, 0x6F5E, 0x70E1, 0x7254, 0x73B5, 0x7503,
+ 0x7640, 0x776B, 0x7883, 0x7989, 0x7A7C, 0x7B5C, 0x7C29, 0x7CE2,
+ 0x7D89, 0x7E1C, 0x7E9C, 0x7F08, 0x7F61, 0x7FA6, 0x7FD7, 0x7FF5,
+ 0x7FFF, 0x7FF5, 0x7FD7, 0x7FA6, 0x7F61, 0x7F08, 0x7E9C, 0x7E1C,
+ 0x7D89, 0x7CE2, 0x7C29, 0x7B5C, 0x7A7C, 0x7989, 0x7883, 0x776B,
+ 0x7640, 0x7503, 0x73B5, 0x7254, 0x70E1, 0x6F5E, 0x6DC9, 0x6C23,
+ 0x6A6C, 0x68A5, 0x66CE, 0x64E7, 0x62F1, 0x60EB, 0x5ED6, 0x5CB3,
+ 0x5A81, 0x5842, 0x55F4, 0x539A, 0x5133, 0x4EBF, 0x4C3F, 0x49B3,
+ 0x471C, 0x447A, 0x41CD, 0x3F16, 0x3C56, 0x398C, 0x36B9, 0x33DE,
+ 0x30FB, 0x2E10, 0x2B1E, 0x2826, 0x2527, 0x2223, 0x1F19, 0x1C0B,
+ 0x18F8, 0x15E1, 0x12C7, 0x0FAB, 0x0C8B, 0x096A, 0x0647, 0x0324,
+ 0x0000, 0xFCDC, 0xF9B9, 0xF696, 0xF375, 0xF055, 0xED39, 0xEA1F,
+ 0xE708, 0xE3F5, 0xE0E7, 0xDDDD, 0xDAD9, 0xD7DA, 0xD4E2, 0xD1F0,
+ 0xCF05, 0xCC22, 0xC947, 0xC674, 0xC3AA, 0xC0EA, 0xBE33, 0xBB86,
+ 0xB8E4, 0xB64D, 0xB3C1, 0xB141, 0xAECD, 0xAC66, 0xAA0C, 0xA7BE,
+ 0xA57F, 0xA34D, 0xA12A, 0x9F15, 0x9D0F, 0x9B19, 0x9932, 0x975B,
+ 0x9594, 0x93DD, 0x9237, 0x90A2, 0x8F1F, 0x8DAC, 0x8C4B, 0x8AFD,
+ 0x89C0, 0x8895, 0x877D, 0x8677, 0x8584, 0x84A4, 0x83D7, 0x831E,
+ 0x8277, 0x81E4, 0x8164, 0x80F8, 0x809F, 0x805A, 0x8029, 0x800B,
+ 0x8001, 0x800B, 0x8029, 0x805A, 0x809F, 0x80F8, 0x8164, 0x81E4,
+ 0x8277, 0x831E, 0x83D7, 0x84A4, 0x8584, 0x8677, 0x877D, 0x8895,
+ 0x89C0, 0x8AFD, 0x8C4B, 0x8DAC, 0x8F1F, 0x90A2, 0x9237, 0x93DD,
+ 0x9594, 0x975B, 0x9932, 0x9B19, 0x9D0F, 0x9F15, 0xA12A, 0xA34D,
+ 0xA57F, 0xA7BE, 0xAA0C, 0xAC66, 0xAECD, 0xB141, 0xB3C1, 0xB64D,
+ 0xB8E4, 0xBB86, 0xBE33, 0xC0EA, 0xC3AA, 0xC674, 0xC947, 0xCC22,
+ 0xCF05, 0xD1F0, 0xD4E2, 0xD7DA, 0xDAD9, 0xDDDD, 0xE0E7, 0xE3F5,
+ 0xE708, 0xEA1F, 0xED39, 0xF055, 0xF375, 0xF696, 0xF9B9, 0xFCDC
+};
+
+static const Uint16Provider kLoLFireballCoordsPC98Provider = { ARRAYSIZE(kLoLFireballCoordsPC98), kLoLFireballCoordsPC98 };
+
+static const byte kLoLCreditsPC98[1511] = {
+ 0x02, 0x54, 0x68, 0x65, 0x20, 0x45, 0x6E, 0x64,
+ 0x05, 0x0D, 0x0D, 0x0D, 0x02, 0x4C, 0x41, 0x4E,
+ 0x44, 0x53, 0x20, 0x4F, 0x46, 0x20, 0x4C, 0x4F,
+ 0x52, 0x45, 0x05, 0x0D, 0x01, 0x54, 0x68, 0x65,
+ 0x20, 0x54, 0x68, 0x72, 0x6F, 0x6E, 0x65, 0x20,
+ 0x6F, 0x66, 0x20, 0x43, 0x68, 0x61, 0x6F, 0x73,
+ 0x05, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D,
+ 0x0D, 0x02, 0x45, 0x58, 0x45, 0x43, 0x55, 0x54,
+ 0x49, 0x56, 0x45, 0x20, 0x50, 0x52, 0x4F, 0x44,
+ 0x55, 0x43, 0x45, 0x52, 0x05, 0x0D, 0x0D, 0x02,
+ 0x42, 0x72, 0x65, 0x74, 0x74, 0x20, 0x57, 0x2E,
+ 0x20, 0x53, 0x70, 0x65, 0x72, 0x72, 0x79, 0x05,
+ 0x0D, 0x0D, 0x0D, 0x0D, 0x02, 0x50, 0x52, 0x4F,
+ 0x44, 0x55, 0x43, 0x45, 0x52, 0x05, 0x0D, 0x0D,
+ 0x02, 0x52, 0x69, 0x63, 0x6B, 0x20, 0x47, 0x75,
+ 0x73, 0x68, 0x05, 0x0D, 0x0D, 0x0D, 0x0D, 0x02,
+ 0x50, 0x52, 0x4F, 0x44, 0x55, 0x43, 0x54, 0x20,
+ 0x43, 0x4F, 0x4F, 0x52, 0x44, 0x49, 0x4E, 0x41,
+ 0x54, 0x4F, 0x52, 0x05, 0x0D, 0x0D, 0x02, 0x43,
+ 0x61, 0x74, 0x68, 0x69, 0x65, 0x20, 0x41, 0x2E,
+ 0x20, 0x54, 0x6F, 0x64, 0x64, 0x05, 0x0D, 0x0D,
+ 0x0D, 0x0D, 0x02, 0x44, 0x45, 0x53, 0x49, 0x47,
+ 0x4E, 0x45, 0x52, 0x53, 0x05, 0x0D, 0x0D, 0x02,
+ 0x57, 0x69, 0x6C, 0x6C, 0x69, 0x61, 0x6D, 0x20,
+ 0x41, 0x6C, 0x61, 0x6E, 0x20, 0x43, 0x72, 0x75,
+ 0x6D, 0x05, 0x0D, 0x50, 0x68, 0x69, 0x6C, 0x69,
+ 0x70, 0x20, 0x57, 0x2E, 0x20, 0x47, 0x6F, 0x72,
+ 0x72, 0x6F, 0x77, 0x05, 0x0D, 0x0D, 0x0D, 0x0D,
+ 0x02, 0x4C, 0x45, 0x41, 0x44, 0x20, 0x50, 0x52,
+ 0x4F, 0x47, 0x52, 0x41, 0x4D, 0x4D, 0x45, 0x52,
+ 0x05, 0x0D, 0x0D, 0x02, 0x50, 0x68, 0x69, 0x6C,
+ 0x69, 0x70, 0x20, 0x57, 0x2E, 0x20, 0x47, 0x6F,
+ 0x72, 0x72, 0x6F, 0x77, 0x05, 0x0D, 0x0D, 0x0D,
+ 0x0D, 0x02, 0x50, 0x52, 0x4F, 0x47, 0x52, 0x41,
+ 0x4D, 0x4D, 0x45, 0x52, 0x53, 0x05, 0x0D, 0x0D,
+ 0x02, 0x4A, 0x6F, 0x65, 0x20, 0x42, 0x6F, 0x73,
+ 0x74, 0x69, 0x63, 0x05, 0x0D, 0x02, 0x53, 0x63,
+ 0x6F, 0x74, 0x74, 0x20, 0x4B, 0x2E, 0x20, 0x42,
+ 0x6F, 0x77, 0x65, 0x6E, 0x05, 0x0D, 0x02, 0x4A,
+ 0x6F, 0x68, 0x6E, 0x20, 0x4C, 0x61, 0x53, 0x61,
+ 0x6C, 0x76, 0x69, 0x61, 0x05, 0x0D, 0x02, 0x4D,
+ 0x61, 0x72, 0x6B, 0x20, 0x4D, 0x63, 0x43, 0x75,
+ 0x62, 0x62, 0x69, 0x6E, 0x05, 0x0D, 0x02, 0x4A,
+ 0x75, 0x73, 0x74, 0x69, 0x6E, 0x20, 0x4D, 0x63,
+ 0x4B, 0x69, 0x6E, 0x6E, 0x65, 0x72, 0x6E, 0x65,
+ 0x79, 0x05, 0x0D, 0x02, 0x51, 0x69, 0x6E, 0x67,
+ 0x20, 0x59, 0x75, 0x61, 0x6E, 0x05, 0x0D, 0x0D,
+ 0x0D, 0x0D, 0x02, 0x4C, 0x45, 0x41, 0x44, 0x20,
+ 0x41, 0x52, 0x54, 0x49, 0x53, 0x54, 0x05, 0x0D,
+ 0x0D, 0x02, 0x52, 0x69, 0x63, 0x6B, 0x20, 0x50,
+ 0x61, 0x72, 0x6B, 0x73, 0x05, 0x0D, 0x0D, 0x0D,
+ 0x0D, 0x02, 0x41, 0x52, 0x54, 0x49, 0x53, 0x54,
+ 0x53, 0x05, 0x0D, 0x0D, 0x02, 0x45, 0x6C, 0x69,
+ 0x65, 0x20, 0x41, 0x72, 0x61, 0x62, 0x69, 0x61,
+ 0x6E, 0x05, 0x0D, 0x02, 0x43, 0x61, 0x72, 0x79,
+ 0x20, 0x44, 0x65, 0x61, 0x6E, 0x20, 0x41, 0x76,
+ 0x65, 0x72, 0x65, 0x74, 0x74, 0x05, 0x0D, 0x02,
+ 0x45, 0x72, 0x69, 0x63, 0x20, 0x47, 0x6F, 0x6F,
+ 0x63, 0x68, 0x05, 0x0D, 0x02, 0x4A, 0x6F, 0x73,
+ 0x65, 0x70, 0x68, 0x20, 0x42, 0x2E, 0x20, 0x48,
+ 0x65, 0x77, 0x69, 0x74, 0x74, 0x20, 0x49, 0x56,
+ 0x05, 0x0D, 0x02, 0x52, 0x65, 0x6E, 0x20, 0x4F,
+ 0x6C, 0x73, 0x65, 0x6E, 0x05, 0x0D, 0x02, 0x4A,
+ 0x75, 0x64, 0x69, 0x74, 0x68, 0x20, 0x50, 0x65,
+ 0x74, 0x65, 0x72, 0x73, 0x6F, 0x6E, 0x05, 0x0D,
+ 0x02, 0x45, 0x2E, 0x4D, 0x2E, 0x20, 0x4C, 0x6F,
+ 0x75, 0x69, 0x73, 0x65, 0x20, 0x53, 0x61, 0x6E,
+ 0x64, 0x6F, 0x76, 0x61, 0x6C, 0x05, 0x0D, 0x0D,
+ 0x0D, 0x0D, 0x02, 0x4D, 0x55, 0x53, 0x49, 0x43,
+ 0x20, 0x26, 0x20, 0x53, 0x4F, 0x55, 0x4E, 0x44,
+ 0x53, 0x05, 0x0D, 0x0D, 0x02, 0x50, 0x61, 0x75,
+ 0x6C, 0x20, 0x53, 0x2E, 0x20, 0x4D, 0x75, 0x64,
+ 0x72, 0x61, 0x05, 0x0D, 0x02, 0x44, 0x77, 0x69,
+ 0x67, 0x68, 0x74, 0x20, 0x4B, 0x2E, 0x20, 0x4F,
+ 0x6B, 0x61, 0x68, 0x61, 0x72, 0x61, 0x05, 0x0D,
+ 0x02, 0x46, 0x72, 0x61, 0x6E, 0x6B, 0x20, 0x4B,
+ 0x6C, 0x65, 0x70, 0x61, 0x63, 0x6B, 0x69, 0x05,
+ 0x0D, 0x02, 0x50, 0x61, 0x74, 0x72, 0x69, 0x63,
+ 0x6B, 0x20, 0x43, 0x6F, 0x6C, 0x6C, 0x69, 0x6E,
+ 0x73, 0x05, 0x0D, 0x0D, 0x0D, 0x0D, 0x02, 0x51,
+ 0x55, 0x41, 0x4C, 0x49, 0x54, 0x59, 0x20, 0x41,
+ 0x53, 0x53, 0x55, 0x52, 0x41, 0x4E, 0x43, 0x45,
+ 0x05, 0x0D, 0x0D, 0x02, 0x4A, 0x65, 0x73, 0x73,
+ 0x65, 0x20, 0x43, 0x6C, 0x65, 0x6D, 0x69, 0x74,
+ 0x05, 0x0D, 0x02, 0x4B, 0x65, 0x6E, 0x6E, 0x65,
+ 0x74, 0x68, 0x20, 0x44, 0x75, 0x6E, 0x6E, 0x65,
+ 0x05, 0x0D, 0x02, 0x4A, 0x65, 0x66, 0x66, 0x20,
+ 0x53, 0x74, 0x65, 0x76, 0x65, 0x6E, 0x20, 0x46,
+ 0x69, 0x6C, 0x6C, 0x68, 0x61, 0x62, 0x65, 0x72,
+ 0x05, 0x0D, 0x02, 0x57, 0x69, 0x6C, 0x6C, 0x69,
+ 0x61, 0x6D, 0x20, 0x46, 0x6F, 0x73, 0x74, 0x65,
+ 0x72, 0x05, 0x0D, 0x02, 0x53, 0x63, 0x6F, 0x74,
+ 0x74, 0x20, 0x46, 0x6C, 0x65, 0x6D, 0x69, 0x6E,
+ 0x67, 0x05, 0x0D, 0x02, 0x4D, 0x69, 0x63, 0x68,
+ 0x61, 0x65, 0x6C, 0x20, 0x4C, 0x69, 0x67, 0x68,
+ 0x74, 0x6E, 0x65, 0x72, 0x05, 0x0D, 0x02, 0x47,
+ 0x6C, 0x65, 0x6E, 0x6E, 0x20, 0x53, 0x70, 0x65,
+ 0x72, 0x72, 0x79, 0x05, 0x0D, 0x02, 0x43, 0x68,
+ 0x72, 0x69, 0x73, 0x20, 0x4D, 0x63, 0x46, 0x61,
+ 0x72, 0x6C, 0x61, 0x6E, 0x64, 0x05, 0x0D, 0x02,
+ 0x53, 0x63, 0x6F, 0x74, 0x74, 0x20, 0x4D, 0x61,
+ 0x6E, 0x6E, 0x69, 0x6E, 0x67, 0x05, 0x0D, 0x02,
+ 0x50, 0x61, 0x75, 0x6C, 0x20, 0x53, 0x68, 0x6F,
+ 0x65, 0x6E, 0x65, 0x72, 0x05, 0x0D, 0x02, 0x41,
+ 0x64, 0x61, 0x6D, 0x20, 0x52, 0x79, 0x61, 0x6E,
+ 0x05, 0x0D, 0x02, 0x4D, 0x69, 0x74, 0x63, 0x68,
+ 0x20, 0x46, 0x69, 0x65, 0x6C, 0x64, 0x6D, 0x61,
+ 0x6E, 0x05, 0x0D, 0x02, 0x4A, 0x61, 0x72, 0x65,
+ 0x64, 0x20, 0x42, 0x72, 0x69, 0x6E, 0x6B, 0x6C,
+ 0x65, 0x79, 0x05, 0x0D, 0x02, 0x4A, 0x75, 0x73,
+ 0x74, 0x69, 0x6E, 0x20, 0x48, 0x61, 0x6C, 0x6C,
+ 0x05, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x02,
+ 0x56, 0x4F, 0x49, 0x43, 0x45, 0x20, 0x41, 0x43,
+ 0x54, 0x4F, 0x52, 0x53, 0x05, 0x0D, 0x0D, 0x03,
+ 0x52, 0x69, 0x63, 0x68, 0x61, 0x72, 0x64, 0x20,
+ 0x53, 0x6D, 0x69, 0x74, 0x68, 0x20, 0x61, 0x73,
+ 0x05, 0x04, 0x4B, 0x49, 0x4E, 0x47, 0x20, 0x52,
+ 0x49, 0x43, 0x48, 0x41, 0x52, 0x44, 0x05, 0x0D,
+ 0x03, 0x45, 0x72, 0x69, 0x63, 0x20, 0x47, 0x6F,
+ 0x6F, 0x63, 0x68, 0x20, 0x61, 0x73, 0x05, 0x04,
+ 0x47, 0x45, 0x52, 0x4F, 0x4E, 0x05, 0x0D, 0x03,
+ 0x53, 0x63, 0x6F, 0x74, 0x69, 0x61, 0x20, 0x61,
+ 0x73, 0x05, 0x04, 0x68, 0x65, 0x72, 0x73, 0x65,
+ 0x6C, 0x66, 0x05, 0x0D, 0x03, 0x46, 0x72, 0x61,
+ 0x6E, 0x6B, 0x20, 0x4B, 0x6C, 0x65, 0x70, 0x61,
+ 0x63, 0x6B, 0x69, 0x20, 0x61, 0x73, 0x05, 0x04,
+ 0x50, 0x49, 0x47, 0x4C, 0x45, 0x54, 0x05, 0x0D,
+ 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x02, 0x4A, 0x41,
+ 0x50, 0x41, 0x4E, 0x45, 0x53, 0x45, 0x20, 0x56,
+ 0x45, 0x52, 0x53, 0x49, 0x4F, 0x4E, 0x05, 0x0D,
+ 0x0D, 0x0D, 0x02, 0x50, 0x52, 0x4F, 0x47, 0x52,
+ 0x41, 0x4D, 0x4D, 0x45, 0x52, 0x53, 0x05, 0x0D,
+ 0x0D, 0x02, 0x59, 0x75, 0x6B, 0x69, 0x6F, 0x20,
+ 0x53, 0x65, 0x6B, 0x69, 0x67, 0x75, 0x63, 0x68,
+ 0x69, 0x05, 0x0D, 0x02, 0x4E, 0x61, 0x6F, 0x73,
+ 0x68, 0x69, 0x20, 0x4E, 0x6F, 0x67, 0x75, 0x63,
+ 0x68, 0x69, 0x05, 0x0D, 0x0D, 0x0D, 0x0D, 0x02,
+ 0x41, 0x52, 0x54, 0x49, 0x53, 0x54, 0x53, 0x05,
+ 0x0D, 0x0D, 0x02, 0x4D, 0x61, 0x73, 0x61, 0x6B,
+ 0x69, 0x20, 0x54, 0x6F, 0x67, 0x61, 0x73, 0x68,
+ 0x69, 0x05, 0x0D, 0x02, 0x52, 0x69, 0x73, 0x61,
+ 0x6B, 0x6F, 0x20, 0x53, 0x65, 0x74, 0x6F, 0x05,
+ 0x0D, 0x02, 0x52, 0x65, 0x69, 0x67, 0x61, 0x20,
+ 0x59, 0x61, 0x73, 0x75, 0x64, 0x61, 0x05, 0x0D,
+ 0x02, 0x4D, 0x61, 0x73, 0x75, 0x6D, 0x69, 0x20,
+ 0x53, 0x68, 0x69, 0x6E, 0x62, 0x6F, 0x05, 0x0D,
+ 0x02, 0x4E, 0x61, 0x6F, 0x6B, 0x6F, 0x20, 0x4E,
+ 0x69, 0x74, 0x74, 0x61, 0x05, 0x0D, 0x02, 0x4B,
+ 0x69, 0x79, 0x6F, 0x66, 0x75, 0x6D, 0x69, 0x20,
+ 0x48, 0x69, 0x6E, 0x6F, 0x05, 0x0D, 0x02, 0x48,
+ 0x69, 0x72, 0x6F, 0x6D, 0x69, 0x20, 0x53, 0x61,
+ 0x6B, 0x61, 0x65, 0x05, 0x0D, 0x02, 0x4B, 0x79,
+ 0x6F, 0x75, 0x6B, 0x6F, 0x20, 0x4D, 0x69, 0x79,
+ 0x61, 0x6D, 0x6F, 0x74, 0x6F, 0x05, 0x0D, 0x02,
+ 0x53, 0x68, 0x6F, 0x6B, 0x6F, 0x20, 0x4D, 0x75,
+ 0x72, 0x61, 0x6B, 0x61, 0x6D, 0x69, 0x05, 0x0D,
+ 0x0D, 0x0D, 0x0D, 0x02, 0x4D, 0x55, 0x53, 0x49,
+ 0x43, 0x20, 0x26, 0x20, 0x53, 0x4F, 0x55, 0x4E,
+ 0x44, 0x53, 0x05, 0x0D, 0x0D, 0x02, 0x54, 0x61,
+ 0x6B, 0x65, 0x73, 0x68, 0x69, 0x20, 0x41, 0x62,
+ 0x6F, 0x05, 0x0D, 0x0D, 0x0D, 0x0D, 0x02, 0x4A,
+ 0x41, 0x50, 0x41, 0x4E, 0x45, 0x53, 0x45, 0x20,
+ 0x54, 0x52, 0x41, 0x4E, 0x53, 0x4C, 0x41, 0x54,
+ 0x4F, 0x52, 0x05, 0x0D, 0x0D, 0x02, 0x59, 0x75,
+ 0x72, 0x69, 0x20, 0x49, 0x74, 0x6F, 0x05, 0x0D,
+ 0x0D, 0x0D, 0x0D, 0x02, 0x53, 0x70, 0x65, 0x63,
+ 0x69, 0x61, 0x6C, 0x20, 0x74, 0x68, 0x61, 0x6E,
+ 0x6B, 0x73, 0x20, 0x74, 0x6F, 0x3A, 0x05, 0x0D,
+ 0x0D, 0x02, 0x48, 0x69, 0x72, 0x6F, 0x6B, 0x6F,
+ 0x20, 0x59, 0x6F, 0x72, 0x6F, 0x69, 0x7A, 0x75,
+ 0x6B, 0x61, 0x05, 0x0D, 0x02, 0x59, 0x75, 0x6A,
+ 0x69, 0x20, 0x4F, 0x64, 0x61, 0x77, 0x61, 0x72,
+ 0x61, 0x05, 0x0D, 0x02, 0x4F, 0x68, 0x73, 0x68,
+ 0x75, 0x6E, 0x20, 0x4C, 0x65, 0x65, 0x05, 0x0D,
+ 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x01, 0x43,
+ 0x6F, 0x70, 0x79, 0x72, 0x69, 0x67, 0x68, 0x74,
+ 0x20, 0x28, 0x43, 0x29, 0x20, 0x31, 0x39, 0x39,
+ 0x33, 0x2C, 0x20, 0x57, 0x65, 0x73, 0x74, 0x77,
+ 0x6F, 0x6F, 0x64, 0x20, 0x53, 0x74, 0x75, 0x64,
+ 0x69, 0x6F, 0x73, 0x2C, 0x20, 0x49, 0x6E, 0x63,
+ 0x2E, 0x05, 0x0D, 0x01, 0x43, 0x6F, 0x70, 0x79,
+ 0x72, 0x69, 0x67, 0x68, 0x74, 0x20, 0x28, 0x43,
+ 0x29, 0x20, 0x31, 0x39, 0x39, 0x34, 0x2C, 0x20,
+ 0x53, 0x74, 0x61, 0x72, 0x43, 0x72, 0x61, 0x66,
+ 0x74, 0x2C, 0x49, 0x6E, 0x63, 0x2E, 0x05, 0x0D,
+ 0x01, 0x41, 0x6C, 0x6C, 0x20, 0x72, 0x69, 0x67,
+ 0x68, 0x74, 0x73, 0x20, 0x72, 0x65, 0x73, 0x65,
+ 0x72, 0x76, 0x65, 0x64, 0x2E, 0x05, 0x0D, 0x0D,
+ 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x00
+};
+
+static const ByteProvider kLoLCreditsPC98Provider = { ARRAYSIZE(kLoLCreditsPC98), kLoLCreditsPC98 };
+
diff --git a/devtools/create_kyradat/resources/lol_pc98_japanese.h b/devtools/create_kyradat/resources/lol_pc98_japanese.h
new file mode 100644
index 0000000000..e4e6f18347
--- /dev/null
+++ b/devtools/create_kyradat/resources/lol_pc98_japanese.h
@@ -0,0 +1,68 @@
+static const LoLCharacter kLoLCharacterDefsPC98Japanese[9] = {
+ { 0x0001, "\x83""}""\x83""C""\x83""P""\x83\x8B", 0, -1, 0, 0, 17,
+ { 0, 0, 0, 0, 0, 0, 0, 0 },
+ { 256, 256, 256, 256, 256, 256, 256, 256 },
+ 0, 20, 20, 6, 6, 0, 0, 0, 384, 320, 5, 2, 0,
+ { 44, 0, 0, 0, 0, 138, 0, 0, 162, 0, 0 },
+ { 1, 1, 1 }, { 0, 0, 0 }, { 1, 1, 1 },
+ { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 } },
+ { 0x0001, "\x83""e""\x83""B""\x83\x82\x83""V""\x81""[", 0, 2, 0, 0, 22,
+ { 0, 0, 0, 0, 0, 0, 0, 0 },
+ { 256, 256, 256, 256, 256, 256, 256, 256 },
+ 0, 27, 27, 5, 5, 0, 0, 0, 256, 256, 0, 0, 0,
+ { 93, 131, 0, 0, 0, 153, 0, 0, 162, 0, 0 },
+ { 3, 2, 1 }, { 0, 0, 0 }, { 2500, 1000, 250 },
+ { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 } },
+ { 0x0001, "\x83""o""\x83""R""\x81""[""\x83""^", 3, 3, 0, 0, 23,
+ { 0, 0, 0, 0, 0, 0, 0, 0 },
+ { 256, 256, 256, 256, 256, 256, 256, 256 },
+ 0, 22, 22, 18, 18, 0, 0, 0, 256, 256, 0, 0, 0,
+ { 108, 149, 0, 0, 145, 153, 0, 0, 129, 0, 0 },
+ { 1, 1, 3 }, { 0, 0, 0 }, { 1, 1, 4000 },
+ { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 } },
+ { 0x0001, "\x83\x8D\x81""[""\x83\x89", 1, 4, 0, 0, 24,
+ { 0, 0, 0, 0, 0, 0, 0, 0 },
+ { 256, 256, 256, 256, 256, 256, 256, 256 },
+ 0, 25, 48, 5, 5, 0, 0, 0, 256, 256, 0, 0, 0,
+ { 0, 0, 0, 0, 0, 137, 0, 0, 162, 0, 0 },
+ { 1, 4, 1 }, { 0, 0, 0 }, { 1, 15001, 1 },
+ { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 } },
+ { 0x0001, "\x83""R""\x83\x93\x83\x89\x83""b""\x83""h", 0, -5, 0, 0, 26,
+ { 0, 0, 0, 0, 0, 0, 0, 0 },
+ { 256, 256, 256, 256, 256, 256, 256, 256 },
+ 0, 23, 23, 10, 10, 0, 0, 0, 366, 358, 2, 3, 0,
+ { 44, 0, 0, 0, 0, 138, 0, 0, 162, 0, 0 },
+ { 1, 1, 1 }, { 0, 0, 0 }, { 1, 1, 1 },
+ { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 } },
+ { 0x0001, "\x83""|""\x81""[""\x83\x8B\x83""\\""\x83\x93", 0, 6, 0, 0, 25,
+ { 0, 0, 0, 0, 0, 0, 0, 0 },
+ { 256, 256, 256, 256, 256, 256, 256, 256 },
+ 0, 105, 105, 45, 45, 0, 0, 0, 256, 256, 0, 0, 0,
+ { 0, 0, 0, 0, 0, 138, 0, 0, 129, 0, 0 },
+ { 5, 2, 3 }, { 0, 0, 0 }, { 40000, 501, 3500 },
+ { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 } },
+ { 0x0001, "\x83""h""\x81""[""\x83\x93", 1, 7, 0, 0, 24,
+ { 0, 0, 0, 0, 0, 0, 0, 0 },
+ { 256, 256, 256, 256, 256, 256, 256, 256 },
+ 0, 50, 50, 80, 80, 0, 0, 0, 256, 256, 0, 0, 0,
+ { 0, 0, 0, 0, 0, 138, 0, 0, 129, 0, 0 },
+ { 1, 2, 10 }, { 1, 254, 177 }, { 1, 501, 1 },
+ { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 } },
+ { 0x0001, "\x83""L""\x81""[""\x83\x89\x83\x93", 2, -8, 0, 0, 21,
+ { 0, 0, 0, 0, 0, 0, 0, 0 },
+ { 256, 256, 256, 256, 256, 256, 256, 256 },
+ 0, 23, 23, 8, 8, 0, 0, 0, 422, 332, 5, 1, 0,
+ { 44, 0, 0, 0, 0, 138, 0, 0, 162, 0, 0 },
+ { 1, 1, 1 }, { 0, 0, 0 }, { 1, 1, 1 },
+ { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 } },
+ { 0x0001, "\x83""A""\x83""N""\x83""V""\x83""F""\x83\x8B", 4, -9, 0, 0, 20,
+ { 0, 0, 0, 0, 0, 0, 0, 0 },
+ { 256, 256, 256, 256, 256, 256, 256, 256 },
+ 0, 28, 28, 32, 32, 0, 0, 0, 320, 256, 1, 1, 0,
+ { 44, 0, 0, 0, 0, 138, 0, 0, 162, 0, 0 },
+ { 1, 1, 1 }, { 0, 0, 0 }, { 1, 1, 1 },
+ { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 } }
+};
+
+static const LoLCharacterProvider kLoLCharacterDefsPC98JapaneseProvider = { ARRAYSIZE(kLoLCharacterDefsPC98Japanese), kLoLCharacterDefsPC98Japanese };
+
diff --git a/devtools/create_kyradat/resources/mr_dos_cd.h b/devtools/create_kyradat/resources/mr_dos_cd.h
new file mode 100644
index 0000000000..9dffa33a1d
--- /dev/null
+++ b/devtools/create_kyradat/resources/mr_dos_cd.h
@@ -0,0 +1,556 @@
+static const char *const k3MainMenuStringsDOSCD[12] = {
+ "Start a new game",
+ "Introduction",
+ "Load a game",
+ "Exit the game",
+ "Nouvelle Partie",
+ "Introduction",
+ "Charger une partie",
+ "Quitter le jeu",
+ "Neues Spiel starten",
+ "Intro",
+ "Spielstand laden",
+ "Spiel beenden"
+};
+
+static const StringListProvider k3MainMenuStringsDOSCDProvider = { ARRAYSIZE(k3MainMenuStringsDOSCD), k3MainMenuStringsDOSCD };
+
+static const char *const k3MusicFilesDOSCD[43] = {
+ "ARREST1",
+ "BATH1",
+ "OCEAN1",
+ "CLOWN1",
+ "DARM2",
+ "FALL1M",
+ "FALL2",
+ "FISH1",
+ "FISHWNDR",
+ "HERMAN1",
+ "JAIL1",
+ "JUNGLE1",
+ "KATHY1",
+ "NICESINE",
+ "PEGASUS1",
+ "PIRATE1",
+ "PIRATE2",
+ "PIRATE3",
+ "POP3",
+ "PORT1",
+ "QUEEN1",
+ "RUINS1",
+ "SNAKES1",
+ "SPRING1",
+ "STATUE1",
+ "STATUE2",
+ "TITLE1",
+ "UNDER1",
+ "WALKCHP1",
+ "YANK1",
+ "ZAN2",
+ "GROOVE2",
+ "GROOVE3",
+ "KING1",
+ "KING2",
+ "GROOVE1",
+ "JAIL2",
+ "SPIRIT1",
+ "SPRING1A",
+ "POP1",
+ "POP2",
+ "SQUIRL1",
+ ""
+};
+
+static const StringListProvider k3MusicFilesDOSCDProvider = { ARRAYSIZE(k3MusicFilesDOSCD), k3MusicFilesDOSCD };
+
+static const byte k3ScoreTableDOSCD[200] = {
+ 0x0A, 0x08, 0x05, 0x09, 0x0A, 0x0A, 0x07, 0x08,
+ 0x09, 0x09, 0x08, 0x08, 0x07, 0x08, 0x05, 0x09,
+ 0x06, 0x0A, 0x07, 0x08, 0x05, 0x09, 0x06, 0x06,
+ 0x07, 0x08, 0x05, 0x09, 0x06, 0x08, 0x07, 0x08,
+ 0x05, 0x09, 0x06, 0x0A, 0x07, 0x08, 0x05, 0x05,
+ 0x05, 0x07, 0x05, 0x07, 0x0A, 0x05, 0x0A, 0x05,
+ 0x05, 0x08, 0x06, 0x08, 0x07, 0x05, 0x05, 0x08,
+ 0x06, 0x09, 0x05, 0x07, 0x06, 0x05, 0x05, 0x07,
+ 0x07, 0x07, 0x06, 0x05, 0x08, 0x06, 0x0A, 0x05,
+ 0x07, 0x05, 0x0A, 0x05, 0x05, 0x05, 0x05, 0x07,
+ 0x05, 0x08, 0x09, 0x07, 0x07, 0x06, 0x0A, 0x06,
+ 0x05, 0x0A, 0x08, 0x05, 0x08, 0x06, 0x0A, 0x05,
+ 0x05, 0x08, 0x08, 0x05, 0x07, 0x07, 0x07, 0x06,
+ 0x08, 0x09, 0x08, 0x08, 0x06, 0x05, 0x07, 0x06,
+ 0x05, 0x08, 0x0F, 0x07, 0x09, 0x06, 0x06, 0x08,
+ 0x05, 0x08, 0x0F, 0x0F, 0x05, 0x0F, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+};
+
+static const ByteProvider k3ScoreTableDOSCDProvider = { ARRAYSIZE(k3ScoreTableDOSCD), k3ScoreTableDOSCD };
+
+static const char *const k3SfxFilesDOSCD[225] = {
+ "ALARM1",
+ "ARMOIRE1",
+ "ARROW1",
+ "AUDLAFF1",
+ "AUDLAFF2",
+ "AUDLAFF3",
+ "AUDLAFF4",
+ "AUDLAFF5",
+ "AUDLAFF6",
+ "AUDLAFF7",
+ "AUDLAFF8",
+ "AUDLAFF9",
+ "BARK22A",
+ "BEAM1",
+ "BEDSQK1",
+ "BEDSQK2",
+ "BIGCLOK1",
+ "BIGDOR2",
+ "BIRD4",
+ "BIRD122",
+ "BIRD222",
+ "BIRD322",
+ "BLAST22D",
+ "BLINK1",
+ "BOATMIX1",
+ "BODYFAL1",
+ "BOTLBLOW",
+ "BOUNCE3",
+ "BOUNCE5",
+ "BOW2",
+ "BUBL1",
+ "BUBL2",
+ "BUBL3",
+ "BUBL4",
+ "BUTTON1",
+ "BUTTON2",
+ "CANNON1",
+ "CASHREG1",
+ "CATHY1",
+ "CHAIN1",
+ "CHATTER1",
+ "CHATTER2",
+ "CHEESE1",
+ "CHICHIC2",
+ "CHIPLAF1",
+ "CHIPROR1",
+ "CLANG1",
+ "CLDOOR1",
+ "CLEAT1",
+ "CLOTHES1",
+ "COIN2",
+ "COUNTER1",
+ "CREAK1",
+ "CREAK2",
+ "CREAK3",
+ "CRIKT22A",
+ "CRMAD1",
+ "CRNORM1",
+ "CRUMBLE1",
+ "CRUNCH1",
+ "CRYSTAL1",
+ "DFLY1",
+ "DIAL1",
+ "DIGDIRT1",
+ "DIZZY1",
+ "DODO1",
+ "DOORBELL",
+ "DOORCL1",
+ "DOOROP1",
+ "DRIP1",
+ "DROPITM1",
+ "EAT22A",
+ "EATNUT1",
+ "ELEC1",
+ "EXPLODE2",
+ "FALL1",
+ "FALLM2",
+ "FALLM3",
+ "FESTRE1",
+ "FISHLAF2",
+ "FLAG22A",
+ "FLAG22B",
+ "FLAG22C",
+ "FLPOOF1",
+ "FOLDER1",
+ "FROG1",
+ "FROGJMP1",
+ "FSHBUBL1",
+ "FUNNEL1",
+ "FUSE1",
+ "GATE22A",
+ "GEM1",
+ "GEMFIRE1",
+ "GEMLIT1",
+ "GEMPUT1",
+ "GEMRAIN1",
+ "GEMWND1",
+ "GIRLLAF1",
+ "GIRLLAF2",
+ "GLASBRK1",
+ "GLOWY1",
+ "GOODK33",
+ "GROWTWIG",
+ "GUNTHER3",
+ "H2ODROP2",
+ "H2OFALL1",
+ "HAMMER1",
+ "HAYFALL2",
+ "HERMMAG1",
+ "HIPRES1",
+ "HITHED22",
+ "HOWL1",
+ "HUM1",
+ "HYPNO1",
+ "HYPNO2",
+ "IMPACT1",
+ "JOHAN1",
+ "JUNGAMB2",
+ "KISS1",
+ "KISS2",
+ "KNIFE",
+ "KNIFHIT1",
+ "KNIFSTAB",
+ "KNOCK",
+ "LAND1",
+ "LEVIBAB1",
+ "LEVIMAN1",
+ "LID",
+ "MACHMIX1",
+ "MALCFALL",
+ "MALCYAWN",
+ "MJUMP1",
+ "MOO1",
+ "MOO2",
+ "MOO3",
+ "MORPH1",
+ "MORPH2",
+ "MORPH3",
+ "MORPH4",
+ "MOTHS1",
+ "MSPLASH1",
+ "MTLSLAM1",
+ "MUDBATH1",
+ "NAIL1",
+ "NEIGH1",
+ "NETCATCH",
+ "NETMAL1",
+ "NETRIP1",
+ "OPDOOR1",
+ "OWL1",
+ "OWL2",
+ "PEDAL3",
+ "PEGWING1",
+ "PICKUP1",
+ "PLUCK3",
+ "POLGULP1",
+ "POOF1",
+ "PORTAL1",
+ "POURH2O1",
+ "PRIMOR1",
+ "PUMP1",
+ "PUNCTRE1",
+ "RATTLE1",
+ "REV2",
+ "RING",
+ "ROAR3",
+ "ROWBOAT1",
+ "RUCKUS1",
+ "RUMBLE1",
+ "SCOLD1",
+ "SCRATCH1",
+ "SHOVEL1",
+ "SHOWER2",
+ "SLOTPUL1",
+ "SNAKKILL",
+ "SNAP1",
+ "SNIFF1",
+ "SNIFF2",
+ "SNIFFM1",
+ "SNIP22B",
+ "SNORIN1",
+ "SNOROUT1",
+ "SNORT1",
+ "SPITBAL1",
+ "SPITBAL2",
+ "SPLASH1",
+ "SQUEAK1",
+ "SQUEAK2",
+ "SQUEAK3",
+ "STATUE",
+ "STAMPED1",
+ "STARS1",
+ "STONE1",
+ "STONE2",
+ "STONE3",
+ "STRETCH1",
+ "STRETCH2",
+ "SUNRISE1",
+ "SWALLOW1",
+ "SWALLOW2",
+ "SWAV22B",
+ "TELBEL1",
+ "TELBEL2",
+ "TENNIS1",
+ "THROW1",
+ "THUMP1",
+ "TOILET1",
+ "TRAPDOR1",
+ "TRICKLE",
+ "TROLGRNT",
+ "TROLYEL1",
+ "TROLYEL2",
+ "TUBEDOR1",
+ "TWIGSNAP",
+ "UMBRLA1",
+ "UNLOK22A",
+ "VACUUM",
+ "WAVELT1",
+ "WHIP1",
+ "WHIP2",
+ "WOODHIT1",
+ "YAWN1",
+ "ZING",
+ "ZIPPER1",
+ ""
+};
+
+static const StringListProvider k3SfxFilesDOSCDProvider = { ARRAYSIZE(k3SfxFilesDOSCD), k3SfxFilesDOSCD };
+
+static const byte k3SfxMapDOSCD[608] = {
+ 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00,
+ 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00,
+ 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0x99, 0x00,
+ 0x46, 0x00, 0xA9, 0x00, 0x33, 0x00, 0x65, 0x00,
+ 0x9B, 0x00, 0x17, 0x00, 0xBB, 0x00, 0x64, 0x00,
+ 0x55, 0x00, 0xD5, 0x00, 0x66, 0x00, 0xB9, 0x00,
+ 0x9A, 0x00, 0xFF, 0x00, 0xCC, 0x00, 0x67, 0x00,
+ 0x2E, 0x00, 0xA1, 0x00, 0xD0, 0x00, 0x63, 0x00,
+ 0x89, 0x00, 0xBE, 0x00, 0x80, 0x00, 0x1D, 0x00,
+ 0x02, 0x00, 0x28, 0x00, 0x91, 0x00, 0x29, 0x00,
+ 0xCE, 0x00, 0x8F, 0x00, 0x49, 0x00, 0x2B, 0x00,
+ 0x2D, 0x00, 0x2C, 0x00, 0x3E, 0x00, 0x22, 0x00,
+ 0x80, 0x00, 0x9C, 0x00, 0x2E, 0x00, 0x04, 0x00,
+ 0x47, 0x00, 0xA8, 0x00, 0x51, 0x00, 0x52, 0x00,
+ 0x80, 0x00, 0x48, 0x00, 0x38, 0x0A, 0x0C, 0x00,
+ 0xD8, 0x00, 0xD1, 0x00, 0xD2, 0x00, 0xD3, 0x00,
+ 0xD1, 0x00, 0x6A, 0x00, 0x8A, 0x00, 0xC0, 0x00,
+ 0xC1, 0x00, 0xC2, 0x00, 0x9F, 0x00, 0xA3, 0x00,
+ 0x90, 0x00, 0xB6, 0x00, 0x37, 0x00, 0x71, 0x00,
+ 0x13, 0x00, 0x50, 0x00, 0x5A, 0x00, 0x6E, 0x00,
+ 0x70, 0x00, 0x11, 0x00, 0x16, 0x00, 0x14, 0x00,
+ 0x43, 0x00, 0xCD, 0x00, 0xAA, 0x00, 0x15, 0x00,
+ 0x83, 0x00, 0x19, 0x00, 0xB3, 0x00, 0x6F, 0x00,
+ 0x26, 0x00, 0xC8, 0x00, 0xA7, 0x00, 0x98, 0x00,
+ 0x87, 0x00, 0xC7, 0x00, 0xA2, 0x00, 0xB0, 0x00,
+ 0x12, 0x00, 0xD7, 0x00, 0x56, 0x00, 0x45, 0x00,
+ 0x4B, 0x00, 0xAF, 0x00, 0x3B, 0x00, 0x6C, 0x00,
+ 0x8E, 0x00, 0x39, 0x00, 0x38, 0x00, 0x92, 0x00,
+ 0x4B, 0x00, 0xD0, 0x00, 0x4A, 0x00, 0x9D, 0x00,
+ 0x7F, 0x00, 0x6D, 0x00, 0xFF, 0x00, 0xFF, 0x00,
+ 0x3D, 0x00, 0x72, 0x00, 0x40, 0x00, 0x66, 0x00,
+ 0x01, 0x00, 0xA5, 0x00, 0x00, 0x00, 0x3C, 0x00,
+ 0xAC, 0x00, 0x38, 0x00, 0x8B, 0x00, 0xDF, 0x00,
+ 0x0E, 0x00, 0x54, 0x00, 0xFF, 0x00, 0xFF, 0x00,
+ 0x94, 0x00, 0xAB, 0x00, 0x76, 0x00, 0x58, 0x00,
+ 0x6B, 0x00, 0x27, 0x00, 0xFF, 0x00, 0x77, 0x00,
+ 0xA6, 0x00, 0x63, 0x00, 0x9E, 0x00, 0xDE, 0x00,
+ 0x84, 0x00, 0x85, 0x00, 0x86, 0x00, 0x3F, 0x00,
+ 0xCC, 0x00, 0xCC, 0x00, 0xCC, 0x00, 0x93, 0x00,
+ 0x9D, 0x00, 0x75, 0x00, 0x75, 0x00, 0x75, 0x00,
+ 0x75, 0x00, 0x3A, 0x00, 0xFF, 0x00, 0xFF, 0x00,
+ 0xFF, 0x00, 0xAE, 0x00, 0x8C, 0x00, 0x20, 0x00,
+ 0xFF, 0x00, 0x32, 0x00, 0x32, 0x00, 0xFF, 0x00,
+ 0x4D, 0x00, 0xD9, 0x00, 0x88, 0x00, 0x4D, 0x00,
+ 0x4D, 0x00, 0x4D, 0x00, 0x4D, 0x00, 0xA0, 0x00,
+ 0x4C, 0x00, 0x8C, 0x00, 0x4C, 0x00, 0x4C, 0x00,
+ 0x8C, 0x00, 0x8C, 0x00, 0x5C, 0x00, 0x5D, 0x00,
+ 0x60, 0x00, 0x5F, 0x00, 0xC5, 0x00, 0xBF, 0x00,
+ 0xFF, 0x00, 0x4F, 0x00, 0x16, 0x00, 0x59, 0x00,
+ 0xFF, 0x00, 0x24, 0x00, 0xA4, 0x00, 0xCF, 0x00,
+ 0xFF, 0x00, 0x47, 0x00, 0x95, 0x00, 0x96, 0x00,
+ 0x7B, 0x00, 0xBD, 0x00, 0xFF, 0x00, 0x34, 0x00,
+ 0x35, 0x00, 0x36, 0x00, 0xDE, 0x00, 0xFF, 0x00,
+ 0x4B, 0x00, 0xD6, 0x00, 0xFF, 0x00, 0x61, 0x00,
+ 0x62, 0x00, 0xFF, 0x00, 0x78, 0x00, 0xFF, 0x00,
+ 0x44, 0x00, 0xB4, 0x00, 0xB5, 0x00, 0x42, 0x00,
+ 0x27, 0x00, 0xA2, 0x00, 0x27, 0x00, 0x5D, 0x00,
+ 0x7A, 0x00, 0x89, 0x00, 0x1A, 0x00, 0x0E, 0x00,
+ 0x82, 0x00, 0xFF, 0x00, 0x79, 0x00, 0x2A, 0x00,
+ 0x81, 0x00, 0xFF, 0x00, 0x74, 0x00, 0x4E, 0x00,
+ 0xB1, 0x00, 0x1B, 0x00, 0x2F, 0x00, 0xBA, 0x00,
+ 0xBB, 0x00, 0xBC, 0x00, 0xDA, 0x00, 0xDB, 0x00,
+ 0x18, 0x00, 0x5E, 0x00, 0x0D, 0x0A, 0x88, 0x00,
+ 0x1E, 0x00, 0x1F, 0x00, 0x20, 0x00, 0x21, 0x00,
+ 0x69, 0x00, 0x1C, 0x00, 0x7C, 0x00, 0x30, 0x00,
+ 0xC3, 0x00, 0xC4, 0x00, 0xAD, 0x00, 0x25, 0x00,
+ 0x53, 0x00, 0xB7, 0x00, 0xB8, 0x00, 0xDC, 0x00,
+ 0x8D, 0x00, 0xCB, 0x00, 0xD4, 0x00, 0xB2, 0x00,
+ 0xDD, 0x00, 0x57, 0x00, 0x41, 0x00, 0x10, 0x00,
+ 0x4C, 0x00, 0xC9, 0x00, 0xFF, 0x00, 0xFF, 0x00,
+ 0x7D, 0x00, 0x7E, 0x00, 0xCA, 0x00, 0x03, 0x00,
+ 0x04, 0x00, 0x05, 0x00, 0x06, 0x00, 0x07, 0x00,
+ 0x08, 0x00, 0x09, 0x00, 0x0A, 0x00, 0x0B, 0x00,
+ 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00,
+ 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00,
+ 0x23, 0x00, 0x97, 0x00, 0x73, 0x00, 0x00, 0x00
+};
+
+static const ByteProvider k3SfxMapDOSCDProvider = { ARRAYSIZE(k3SfxMapDOSCD), k3SfxMapDOSCD };
+
+static const FrameControl k3ItemAnimDataDOSCD0FrameControl[3] = {
+ { 0x0003, 0x0019 },
+ { 0x0048, 0x001E },
+ { 0x0049, 0x001E }
+};
+
+static const FrameControl k3ItemAnimDataDOSCD1FrameControl[7] = {
+ { 0x003A, 0x000B },
+ { 0x004B, 0x000B },
+ { 0x004C, 0x000B },
+ { 0x004D, 0x000B },
+ { 0x004E, 0x000B },
+ { 0x004F, 0x000B },
+ { 0x0050, 0x000B }
+};
+
+static const FrameControl k3ItemAnimDataDOSCD2FrameControl[4] = {
+ { 0x0014, 0x000F },
+ { 0x0051, 0x000F },
+ { 0x0052, 0x000F },
+ { 0x0053, 0x000F }
+};
+
+static const FrameControl k3ItemAnimDataDOSCD3FrameControl[4] = {
+ { 0x0013, 0x0014 },
+ { 0x0054, 0x0014 },
+ { 0x0055, 0x0014 },
+ { 0x0056, 0x0014 }
+};
+
+static const FrameControl k3ItemAnimDataDOSCD4FrameControl[7] = {
+ { 0x0015, 0x0010 },
+ { 0x0057, 0x0012 },
+ { 0x0058, 0x0010 },
+ { 0x0059, 0x0011 },
+ { 0x005A, 0x0010 },
+ { 0x005B, 0x0011 },
+ { 0x005C, 0x0010 }
+};
+
+static const FrameControl k3ItemAnimDataDOSCD5FrameControl[4] = {
+ { 0x0009, 0x001E },
+ { 0x005D, 0x001E },
+ { 0x005E, 0x001E },
+ { 0x005D, 0x001E }
+};
+
+static const FrameControl k3ItemAnimDataDOSCD6FrameControl[7] = {
+ { 0x0039, 0x0021 },
+ { 0x005F, 0x0020 },
+ { 0x0060, 0x001E },
+ { 0x0061, 0x0020 },
+ { 0x0062, 0x0021 },
+ { 0x0063, 0x001E },
+ { 0x0064, 0x0022 }
+};
+
+static const FrameControl k3ItemAnimDataDOSCD7FrameControl[34] = {
+ { 0x0040, 0x000C },
+ { 0x006C, 0x0010 },
+ { 0x006B, 0x0010 },
+ { 0x006A, 0x000F },
+ { 0x0069, 0x000F },
+ { 0x0068, 0x000F },
+ { 0x0067, 0x000F },
+ { 0x0066, 0x000F },
+ { 0x0065, 0x000F },
+ { 0x0066, 0x0011 },
+ { 0x0067, 0x0012 },
+ { 0x0068, 0x0010 },
+ { 0x0069, 0x000F },
+ { 0x006A, 0x0010 },
+ { 0x006B, 0x000F },
+ { 0x006C, 0x0010 },
+ { 0x006B, 0x000F },
+ { 0x006A, 0x0010 },
+ { 0x006B, 0x000F },
+ { 0x006C, 0x0010 },
+ { 0x006B, 0x000F },
+ { 0x006A, 0x0010 },
+ { 0x0069, 0x000F },
+ { 0x0068, 0x0010 },
+ { 0x0067, 0x0012 },
+ { 0x0066, 0x0011 },
+ { 0x0065, 0x00C8 },
+ { 0x0066, 0x0011 },
+ { 0x0067, 0x0012 },
+ { 0x0068, 0x0010 },
+ { 0x0069, 0x000F },
+ { 0x006A, 0x0010 },
+ { 0x006B, 0x000F },
+ { 0x006C, 0x0010 }
+};
+
+static const FrameControl k3ItemAnimDataDOSCD8FrameControl[5] = {
+ { 0x002B, 0x0019 },
+ { 0x008E, 0x0016 },
+ { 0x008F, 0x0014 },
+ { 0x0090, 0x0016 },
+ { 0x0091, 0x0050 }
+};
+
+static const FrameControl k3ItemAnimDataDOSCD9FrameControl[6] = {
+ { 0x003B, 0x0258 },
+ { 0x0092, 0x000A },
+ { 0x0093, 0x000A },
+ { 0x0094, 0x000A },
+ { 0x0093, 0x000A },
+ { 0x0092, 0x000A }
+};
+
+static const ItemAnimDefinition k3ItemAnimDataDOSCD[10] = {
+ { 3, 3, k3ItemAnimDataDOSCD0FrameControl },
+ { 58, 7, k3ItemAnimDataDOSCD1FrameControl },
+ { 20, 4, k3ItemAnimDataDOSCD2FrameControl },
+ { 19, 4, k3ItemAnimDataDOSCD3FrameControl },
+ { 21, 7, k3ItemAnimDataDOSCD4FrameControl },
+ { 9, 4, k3ItemAnimDataDOSCD5FrameControl },
+ { 57, 7, k3ItemAnimDataDOSCD6FrameControl },
+ { 64, 34, k3ItemAnimDataDOSCD7FrameControl },
+ { 43, 5, k3ItemAnimDataDOSCD8FrameControl },
+ { 59, 6, k3ItemAnimDataDOSCD9FrameControl }
+};
+
+static const ItemAnimDefinitionProvider k3ItemAnimDataDOSCDProvider = { ARRAYSIZE(k3ItemAnimDataDOSCD), k3ItemAnimDataDOSCD };
+
+static const byte k3ItemMagicTableDOSCD[36] = {
+ 0x06, 0x05, 0x07, 0xFE, 0x05, 0x06, 0x07, 0xFE,
+ 0x03, 0x00, 0x22, 0xFE, 0x00, 0x03, 0x22, 0xFE,
+ 0x10, 0x00, 0x20, 0x0F, 0x00, 0x10, 0x0F, 0x20,
+ 0x10, 0x22, 0x21, 0x0F, 0x22, 0x10, 0x0F, 0x21,
+ 0xFF, 0xFF, 0xFF, 0x00
+};
+
+static const ByteProvider k3ItemMagicTableDOSCDProvider = { ARRAYSIZE(k3ItemMagicTableDOSCD), k3ItemMagicTableDOSCD };
+
+static const byte k3ItemStringMapDOSCD[72] = {
+ 0x01, 0x00, 0x02, 0x00, 0x02, 0x02, 0x00, 0x00,
+ 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x01,
+ 0x02, 0x00, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x01, 0x02, 0x00, 0x02, 0x00, 0x02,
+ 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x01,
+ 0x01, 0x00, 0x02, 0x02, 0x00, 0x00, 0x02, 0x00,
+ 0x00, 0x02, 0x00, 0x02, 0x02, 0x00, 0x00, 0x02,
+ 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02
+};
+
+static const ByteProvider k3ItemStringMapDOSCDProvider = { ARRAYSIZE(k3ItemStringMapDOSCD), k3ItemStringMapDOSCD };
+
diff --git a/devtools/create_kyradat/search.cpp b/devtools/create_kyradat/search.cpp
deleted file mode 100644
index b861ff0f5a..0000000000
--- a/devtools/create_kyradat/search.cpp
+++ /dev/null
@@ -1,215 +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.
- *
- */
-
-// Disable symbol overrides so that we can use system headers.
-#define FORBIDDEN_SYMBOL_ALLOW_ALL
-
-#include "search.h"
-#include "md5.h"
-
-#include <algorithm>
-#include <cassert>
-
-Hasher::Hash Hasher::createHash(const byte *data, uint32 size) {
- md5_context ctx;
- md5_starts(&ctx);
- md5_update(&ctx, data, size);
-
- Hash hash;
- md5_finish(&ctx, hash.digest);
- return hash;
-}
-
-SearchData SearchCreator::create(const char *filename) {
- FILE *f = fopen(filename, "rb");
- assert(f);
-
- SearchData data;
- data.size = fileSize(f);
-
- byte *buffer = new byte[data.size];
- fread(buffer, 1, data.size, f);
- fclose(f);
-
- data = create(buffer, data.size);
- delete[] buffer;
-
- return data;
-}
-
-SearchData SearchCreator::create(const byte *buffer, uint32 size) {
- SearchData data;
-
- data.size = size;
- data.hash = Hasher::createHash(buffer, data.size);
- data.byteSum = 0;
-
- for (uint32 i = 0; i < data.size; ++i)
- data.byteSum += buffer[i];
-
- return data;
-}
-
-SumCreator::SumCreator(InputList list, const DataInput &input) : _curOffset(0), _input(input), _sums() {
- // Sort in ascending order
- list.sort(std::less<uint32>());
-
- uint32 byteSum = 0;
- uint32 oldSize = 0;
-
- for (InputList::const_iterator i = list.begin(); i != list.end(); ++i) {
- // Strip out entries, which exceed the buffer size
- if (*i > _input.size())
- continue;
-
- // Strip out duplicates
- if (_sums.find(*i) != _sums.end())
- continue;
-
- // Only add the bytes exceeding the old sum's size
- // to the sum. This saves a few accesses.
- for (uint32 j = oldSize; j < *i; ++j)
- byteSum += _input[j];
-
- _sums[*i] = byteSum;
-
- // Save this sum's size
- oldSize = *i;
- }
-}
-
-bool SumCreator::nextByte() {
- // Calculate the bytes available for summing. We need to add
- // 1 here, since we will only update the offset AFTER everything
- // is done.
- const uint32 sizeLeft = _input.size() - (_curOffset + 1);
-
- if (!sizeLeft) {
- _sums.clear();
- return false;
- }
-
- // Grab the old first byte.
- const byte firstByte = _input[_curOffset];
-
- typedef std::list<uint32> DeletionList;
- DeletionList toRemove;
-
- for (SumMap::iterator i = _sums.begin(); i != _sums.end(); ++i) {
- // If this entry needs to sum up a larger buffer than the buffer
- // size left, we will remove the entry and continue to the next
- // one.
- if (i->first > sizeLeft) {
- // Add the current entry to the removal list.
- toRemove.push_back(i->first);
- continue;
- }
-
- // Update the byte sum. First we remove the old first byte
- // from the sum, next we add the next available byte.
- i->second -= firstByte;
- i->second += _input[_curOffset + i->first];
- }
-
- // Remove all entries flagged for removal
- for (DeletionList::const_iterator i = toRemove.begin(); i != toRemove.end(); ++i)
- _sums.erase(*i);
-
- // Update out offset.
- ++_curOffset;
-
- // We return whether there are still some sums left available.
- return !_sums.empty();
-}
-
-bool SumCreator::hasSum(uint32 size) const {
- return _sums.find(size) != _sums.end();
-}
-
-uint32 SumCreator::getSum(uint32 size) const {
- SumMap::const_iterator s = _sums.find(size);
-
- if (s == _sums.end())
- return 0;
-
- return s->second;
-}
-
-Search::Search(const char *filename) : _data(), _search() {
- FILE *src = fopen(filename, "rb");
- assert(src);
-
- uint32 size = fileSize(src);
- byte *data = new byte[size];
- fread(data, 1, size, src);
- fclose(src);
-
- _data.resize(size);
- std::copy(data, data + size, _data.begin());
- delete[] data;
-}
-
-Search::Search(const byte *data, uint32 size) : _data(), _search() {
- _data.resize(size);
- std::copy(data, data + size, _data.begin());
-}
-
-void Search::addData(SearchData data) {
- // Do not add any duplicates
- if (std::find(_search.begin(), _search.end(), data) != _search.end())
- return;
-
- _search.push_back(data);
-}
-
-bool Search::search(ResultList &res) {
- SumCreator::InputList list;
- for (SearchList::const_iterator i = _search.begin(); i != _search.end(); ++i)
- list.push_back(i->size);
-
- SumCreator sum(list, _data);
- list.clear();
-
- do {
- const uint32 offset = sum.getOffset();
-
- for (SearchList::iterator i = _search.begin(); i != _search.end(); ) {
- if (!sum.hasSum(i->size)) {
- i = _search.erase(i);
- continue;
- }
-
- const uint32 byteSum = sum.getSum(i->size);
- if (byteSum == i->byteSum) {
- if (Hasher::createHash(&_data[offset], i->size) == i->hash) {
- res.push_back(ResultData(*i, offset));
- i = _search.erase(i);
- continue;
- }
- }
-
- ++i;
- }
- } while (sum.nextByte());
-
- return !res.empty();
-}
diff --git a/devtools/create_kyradat/search.h b/devtools/create_kyradat/search.h
deleted file mode 100644
index a9e8ee2726..0000000000
--- a/devtools/create_kyradat/search.h
+++ /dev/null
@@ -1,116 +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 SEARCH_H
-#define SEARCH_H
-
-#include "util.h"
-
-#include <list>
-#include <map>
-#include <vector>
-#include <cstring>
-
-class Hasher {
-public:
- struct Hash {
- uint8 digest[16];
-
- bool operator==(const Hash &r) const {
- return !std::memcmp(digest, r.digest, sizeof(digest));
- }
-
- bool operator<(const Hash &r) const {
- return std::memcmp(digest, r.digest, sizeof(digest)) < 0;
- }
- };
-
- static Hash createHash(const byte *data, uint32 size);
-};
-
-struct SearchData {
- uint32 size;
-
- uint32 byteSum;
- Hasher::Hash hash;
-
- bool operator==(const SearchData &r) const {
- return (size == r.size && byteSum == r.byteSum && hash == r.hash);
- }
-
- bool operator<(const SearchData &r) const {
- return (size < r.size && byteSum < r.byteSum && hash < r.hash);
- }
-};
-
-class SearchCreator {
-public:
- static SearchData create(const char *filename);
- static SearchData create(const byte *buffer, uint32 size);
-};
-
-class SumCreator {
-public:
- typedef std::list<uint32> InputList;
- typedef std::vector<byte> DataInput;
-
- SumCreator(InputList list, const DataInput &input);
-
- bool nextByte();
-
- uint32 getOffset() const { return _curOffset; }
-
- bool hasSum(uint32 size) const;
- uint32 getSum(uint32 size) const;
-private:
- uint32 _curOffset;
- DataInput _input;
-
- typedef std::map<uint32, uint32> SumMap;
- SumMap _sums;
-};
-
-class Search {
-public:
- Search(const char *filename);
- Search(const byte *data, uint32 size);
-
- void addData(SearchData data);
-
- struct ResultData {
- SearchData data;
- uint32 offset;
-
- ResultData() : data(), offset() {}
- ResultData(SearchData d, uint32 o) : data(d), offset(o) {}
- };
-
- typedef std::list<ResultData> ResultList;
- bool search(ResultList &res);
-private:
- SumCreator::DataInput _data;
-
- typedef std::list<SearchData> SearchList;
- SearchList _search;
-};
-
-#endif
diff --git a/devtools/create_kyradat/tables.cpp b/devtools/create_kyradat/tables.cpp
deleted file mode 100644
index 15f8240e79..0000000000
--- a/devtools/create_kyradat/tables.cpp
+++ /dev/null
@@ -1,4479 +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.
- *
- */
-
-// Disable symbol overrides so that we can use system headers.
-#define FORBIDDEN_SYMBOL_ALLOW_ALL
-
-#include "tables.h"
-#include "create_kyradat.h"
-#include "common/language.h"
-#include "common/platform.h"
-
-#define EXTRACT_END_ENTRY { UNK_LANG, kPlatformUnknown, { 0, 0, { { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } } } }
-
-namespace {
-
-// Id provider tables
-
-const ExtractEntrySearchData k1ForestSeqProvider[] = {
- { UNK_LANG, kPlatformDOS, { 0x00000195, 0x00001455, { { 0x86, 0xC2, 0x45, 0xEB, 0x16, 0x8A, 0x44, 0x73, 0xB4, 0x59, 0x13, 0x9B, 0x85, 0x40, 0x82, 0x81 } } } }, // floppy
- { UNK_LANG, kPlatformUnknown, { 0x000002DE, 0x00003946, { { 0x85, 0x79, 0xDC, 0xB8, 0x62, 0xAD, 0xD6, 0x01, 0xA5, 0x66, 0x6B, 0xC4, 0x61, 0xCA, 0x82, 0xF5 } } } }, // CD + Amiga
-
- { UNK_LANG, kPlatformUnknown, { 0x00000273, 0x00001D80, { { 0x18, 0x32, 0xB7, 0xFB, 0xD8, 0x1A, 0x6D, 0x83, 0x75, 0xF5, 0x2B, 0xF7, 0xC0, 0xFD, 0x85, 0xEF } } } }, // Amiga + CD demo
-
- { UNK_LANG, kPlatformFMTowns, { 0x00000196, 0x00001468, { { 0x06, 0x8D, 0xC1, 0x9B, 0xBC, 0x28, 0xE8, 0x36, 0x43, 0x67, 0x34, 0xAA, 0x78, 0xB9, 0xCB, 0x72 } } } },
-
- { UNK_LANG, kPlatformPC98, { 0x0000013B, 0x0000128A, { { 0xD8, 0xB1, 0xFF, 0x57, 0xC9, 0x5D, 0xE1, 0x23, 0xA5, 0xA0, 0x4B, 0x0F, 0x28, 0xAC, 0x56, 0x83 } } } },
-
- EXTRACT_END_ENTRY
-};
-
-const ExtractEntrySearchData k1KallakWritingSeqProvider[] = {
- { UNK_LANG, kPlatformDOS, { 0x000007F5, 0x00006DCD, { { 0x0E, 0x0A, 0x75, 0xA5, 0x71, 0x5A, 0xC6, 0x32, 0x52, 0x7F, 0xEC, 0x2B, 0x0B, 0xF2, 0x22, 0xE6 } } } }, // floppy
- { UNK_LANG, kPlatformDOS, { 0x00000805, 0x0000719E, { { 0xA2, 0xFE, 0x0A, 0xAA, 0xD9, 0x43, 0x5A, 0xBE, 0x56, 0x38, 0x73, 0x42, 0xAC, 0xA9, 0x1B, 0x01 } } } }, // CD
-
- { UNK_LANG, kPlatformAmiga, { 0x000007F4, 0x00006DAD, { { 0x84, 0x9D, 0x82, 0xD2, 0x4E, 0x8B, 0xE2, 0x86, 0x82, 0x5E, 0xE7, 0x2C, 0x7A, 0xD6, 0xFE, 0x19 } } } },
-
- { UNK_LANG, kPlatformFMTowns, { 0x000007F7, 0x00006E23, { { 0x97, 0x8C, 0x63, 0x8D, 0x91, 0x68, 0xA5, 0x63, 0x55, 0x43, 0xE7, 0xE0, 0x12, 0xF9, 0x80, 0xA4 } } } },
-
- { UNK_LANG, kPlatformPC98, { 0x000007F3, 0x00006D9E, { { 0x3E, 0x83, 0xA4, 0xBF, 0x43, 0xAC, 0xDD, 0x41, 0x33, 0xC3, 0x33, 0x4E, 0xAE, 0x08, 0xB6, 0xDA } } } },
-
- EXTRACT_END_ENTRY
-};
-
-const ExtractEntrySearchData k1KyrandiaLogoSeqProvider[] = {
- { UNK_LANG, kPlatformUnknown, { 0x0000005C, 0x000003D3, { { 0x75, 0xC5, 0x55, 0x54, 0x00, 0xD7, 0xE9, 0x26, 0x0F, 0x01, 0xB1, 0xB7, 0xA9, 0x29, 0xF7, 0x69 } } } },
- { UNK_LANG, kPlatformDOS, { 0x000000A6, 0x00000A09, { { 0x70, 0x6E, 0x74, 0xBB, 0xD7, 0x09, 0x05, 0xDD, 0xA3, 0x09, 0x96, 0x40, 0xBD, 0x01, 0x19, 0x05 } } } }, // CD
- { UNK_LANG, kPlatformDOS, { 0x00000054, 0x00000300, { { 0x4E, 0xAD, 0xD0, 0x73, 0xD2, 0x3C, 0xF6, 0x6B, 0x65, 0x23, 0xA2, 0x30, 0xD6, 0xEE, 0x1C, 0x13 } } } }, // demo
-
- EXTRACT_END_ENTRY
-};
-
-const ExtractEntrySearchData k1KallakMalcolmSeqProvider[] = {
- { UNK_LANG, kPlatformDOS, { 0x0000026B, 0x00002132, { { 0x51, 0x07, 0x32, 0xA2, 0x09, 0x47, 0x97, 0x02, 0x85, 0x31, 0x39, 0x93, 0x3A, 0x53, 0x47, 0xA5 } } } }, // floppy
- { UNK_LANG, kPlatformDOS, { 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
-
- { UNK_LANG, kPlatformFMTowns, { 0x0000026D, 0x00002188, { { 0x7E, 0x3B, 0x06, 0x69, 0x11, 0x59, 0xBE, 0x42, 0xCB, 0x33, 0x9C, 0x15, 0xCF, 0x61, 0xF6, 0xB0 } } } },
-
- { UNK_LANG, kPlatformPC98, { 0x0000026C, 0x00002145, { { 0x95, 0xB7, 0x9E, 0x63, 0x99, 0xFA, 0x22, 0xBF, 0x62, 0x37, 0xC2, 0x2B, 0x40, 0x73, 0x53, 0x83 } } } },
-
- EXTRACT_END_ENTRY
-};
-
-const ExtractEntrySearchData k1MalcolmTreeSeqProvider[] = {
- { UNK_LANG, kPlatformDOS, { 0x00000216, 0x000014FB, { { 0xBA, 0x6F, 0x63, 0xD5, 0x44, 0xCE, 0xE8, 0x20, 0xD4, 0x4C, 0x06, 0x58, 0x21, 0x8E, 0x07, 0x8B } } } }, // floppy
- { UNK_LANG, kPlatformDOS, { 0x00000230, 0x0000192A, { { 0x28, 0xCC, 0x89, 0x40, 0x8A, 0xF7, 0xCB, 0xC0, 0x11, 0x8F, 0x0F, 0xE5, 0x5F, 0x24, 0x2D, 0x32 } } } }, // CD
-
- { UNK_LANG, kPlatformAmiga, { 0x00000214, 0x000014C4, { { 0xA2, 0x60, 0x16, 0x14, 0x20, 0xE4, 0x8D, 0x89, 0xC4, 0x30, 0x07, 0x21, 0xC9, 0x26, 0xA6, 0x84 } } } },
-
- { UNK_LANG, kPlatformFMTowns, { 0x00000218, 0x00001551, { { 0x30, 0x42, 0xD3, 0x7D, 0x6B, 0x43, 0x3B, 0xC7, 0x63, 0x56, 0x7D, 0x12, 0xE0, 0x53, 0x41, 0x48 } } } },
-
- { UNK_LANG, kPlatformPC98, { 0x00000217, 0x0000150E, { { 0x41, 0xFC, 0xD3, 0xAC, 0x8D, 0x1C, 0x11, 0x4E, 0xE0, 0x0C, 0xF6, 0x93, 0xA9, 0x22, 0x53, 0x7F } } } },
-
- EXTRACT_END_ENTRY
-};
-
-const ExtractEntrySearchData k1WestwoodLogoSeqProvider[] = {
- { UNK_LANG, kPlatformUnknown, { 0x0000004B, 0x000002FE, { { 0x6E, 0xDA, 0x5D, 0x1E, 0xF4, 0x38, 0xAE, 0x7A, 0x9F, 0xBC, 0x00, 0x7C, 0x77, 0x9D, 0x03, 0xAF } } } },
- { UNK_LANG, kPlatformDOS, { 0x0000004B, 0x0000032A, { { 0x9A, 0x54, 0x6F, 0x6C, 0x70, 0xD1, 0x02, 0x94, 0xD1, 0xA1, 0xA7, 0xBE, 0x1B, 0x10, 0xBD, 0x2F } } } }, // CD
- { UNK_LANG, kPlatformDOS, { 0x00000044, 0x00000243, { { 0x00, 0x11, 0x10, 0x64, 0x60, 0xE8, 0xB5, 0x59, 0x00, 0x60, 0xF5, 0x10, 0xB5, 0x63, 0x9D, 0x55 } } } }, // demo
-
- { UNK_LANG, kPlatformAmiga, { 0x0000004D, 0x00000319, { { 0xE9, 0x5D, 0xD4, 0x60, 0x4E, 0xA6, 0x92, 0x30, 0x9C, 0x77, 0x99, 0xBC, 0xB1, 0x97, 0xFB, 0xBD } } } },
-
- EXTRACT_END_ENTRY
-};
-
-const ExtractEntrySearchData k1Demo1SeqProvider[] = {
- { UNK_LANG, kPlatformUnknown, { 0x00000026, 0x0000016E, { { 0x61, 0xF2, 0x84, 0x42, 0x89, 0x6E, 0xB8, 0x0D, 0x01, 0xB7, 0xE4, 0x49, 0xA1, 0x72, 0xDC, 0x66 } } } },
-
- EXTRACT_END_ENTRY
-};
-
-const ExtractEntrySearchData k1Demo2SeqProvider[] = {
- { UNK_LANG, kPlatformUnknown, { 0x00000023, 0x00000151, { { 0xE7, 0x9F, 0xA7, 0x80, 0xE3, 0xC1, 0x63, 0xF2, 0x3F, 0x7B, 0x64, 0xD9, 0x70, 0x3A, 0xF1, 0x55 } } } },
-
- EXTRACT_END_ENTRY
-};
-
-const ExtractEntrySearchData k1Demo3SeqProvider[] = {
- { UNK_LANG, kPlatformUnknown, { 0x00000059, 0x000001A8, { { 0x9E, 0x90, 0x4F, 0x9E, 0xBC, 0x39, 0x37, 0xD1, 0x10, 0x67, 0x8C, 0xE5, 0x84, 0xFD, 0xD9, 0x7C } } } },
-
- EXTRACT_END_ENTRY
-};
-
-const ExtractEntrySearchData k1Demo4SeqProvider[] = {
- { UNK_LANG, kPlatformUnknown, { 0x00000020, 0x0000013E, { { 0xB7, 0x67, 0x1D, 0x50, 0x11, 0xD0, 0x16, 0x91, 0x40, 0x40, 0xD1, 0xC0, 0xA0, 0x79, 0x3D, 0xCE } } } },
-
- EXTRACT_END_ENTRY
-};
-
-const ExtractEntrySearchData k1AmuleteAnimSeqProvider[] = {
- { UNK_LANG, kPlatformUnknown, { 0x0000002A, 0x0000025D, { { 0xB1, 0x59, 0x3C, 0x9A, 0x61, 0xC0, 0x1D, 0x80, 0xB5, 0x0C, 0x2E, 0xF9, 0xF6, 0x36, 0xED, 0x7D } } } },
-
- EXTRACT_END_ENTRY
-};
-
-const ExtractEntrySearchData k1OutroReunionSeqProvider[] = {
- { UNK_LANG, kPlatformDOS, { 0x00000547, 0x0000781C, { { 0xCF, 0xD6, 0x1D, 0x3D, 0x14, 0x40, 0x88, 0x35, 0x36, 0x4F, 0x0B, 0x1F, 0x9A, 0x1C, 0x3D, 0xAC } } } }, // floppy
- { UNK_LANG, kPlatformDOS, { 0x00000547, 0x000077E0, { { 0x80, 0xC4, 0xFC, 0xD5, 0xEB, 0xAA, 0xA5, 0x87, 0x58, 0x5E, 0xAA, 0xE7, 0x01, 0x8F, 0x59, 0x3F } } } }, // floppy
- { UNK_LANG, kPlatformDOS, { 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
-
- { UNK_LANG, kPlatformPC98, { 0x00000548, 0x00007889, { { 0x17, 0xE9, 0x40, 0xBA, 0x4A, 0xBD, 0xC6, 0x62, 0x56, 0x96, 0xD6, 0x1B, 0x11, 0xF3, 0xD8, 0x14 } } } },
-
- EXTRACT_END_ENTRY
-};
-
-const ExtractEntrySearchData k1IntroCPSStringsProvider[] = {
- { UNK_LANG, kPlatformFMTowns, { 0x00000015, 0x0000071D, { { 0x59, 0x65, 0x08, 0xF9, 0x4C, 0x81, 0xA1, 0xE3, 0x68, 0xF7, 0xE3, 0xF6, 0x33, 0x5F, 0xF5, 0x36 } } } },
-
- { 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, kPlatformDOS, { 0x00000015, 0x00000786, { { 0xCF, 0x09, 0xE1, 0xD9, 0x8E, 0x34, 0x5D, 0xEA, 0xBC, 0xAC, 0xC4, 0xF4, 0x4A, 0xEC, 0xFF, 0xC1 } } } }, // CD
- { UNK_LANG, kPlatformDOS, { 0x00000019, 0x000008DB, { { 0x3A, 0xDC, 0x1D, 0xAD, 0xF4, 0x5E, 0xC9, 0x19, 0xE9, 0x84, 0xD1, 0x31, 0x89, 0x6B, 0x6C, 0xF7 } } } }, // Old floppy
- { UNK_LANG, kPlatformDOS, { 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 } } } },
-
- EXTRACT_END_ENTRY
-};
-
-const ExtractEntrySearchData k1IntroCOLStringsProvider[] = {
- { UNK_LANG, kPlatformUnknown, { 0x00000030, 0x00000F09, { { 0x05, 0x7B, 0x69, 0xB7, 0x6A, 0xC3, 0x7F, 0xD9, 0x7E, 0x51, 0x87, 0xA5, 0x31, 0xD8, 0x80, 0xB3 } } } },
- { UNK_LANG, kPlatformUnknown, { 0x0000002B, 0x00000F09, { { 0x01, 0x40, 0x65, 0xC1, 0x33, 0xAA, 0x64, 0xA7, 0x44, 0xD5, 0x89, 0x68, 0x17, 0x47, 0xC7, 0x1D } } } }, // floppy(?) + PC98
- { UNK_LANG, kPlatformDOS, { 0x00000046, 0x0000174F, { { 0xAA, 0x59, 0x01, 0x20, 0x06, 0xB4, 0x80, 0xC0, 0x84, 0x38, 0xFD, 0x97, 0xBF, 0x78, 0xDD, 0x78 } } } }, // demo
-
- { UNK_LANG, kPlatformAmiga, { 0x0000002E, 0x00000F09, { { 0x2A, 0x42, 0xB8, 0x4E, 0xC6, 0xF0, 0x5F, 0x4A, 0x08, 0xB4, 0xE3, 0xE5, 0xBD, 0x32, 0x11, 0x06 } } } },
-
- EXTRACT_END_ENTRY
-};
-
-const ExtractEntrySearchData k1IntroWSAStringsProvider[] = {
- { UNK_LANG, kPlatformUnknown, { 0x00000093, 0x00002E5D, { { 0xAB, 0xD1, 0x32, 0x89, 0x2A, 0x8D, 0xC0, 0x2C, 0x87, 0x87, 0xA3, 0x14, 0x2A, 0x2A, 0x22, 0x7F } } } },
-
- { UNK_LANG, kPlatformUnknown, { 0x00000086, 0x00002E5D, { { 0xD2, 0x8D, 0x62, 0xEF, 0xEB, 0x75, 0x04, 0x13, 0x64, 0x85, 0x6B, 0x6C, 0xE8, 0x6C, 0xCF, 0x52 } } } },
- { UNK_LANG, kPlatformDOS, { 0x0000004D, 0x00001AEC, { { 0x15, 0xBC, 0x8C, 0xD9, 0x33, 0x0C, 0xC5, 0x66, 0x87, 0x3B, 0x76, 0xEE, 0x0C, 0x41, 0x4D, 0x1F } } } }, // demo
-
- { UNK_LANG, kPlatformUnknown, { 0x00000080, 0x00002E5D, { { 0x67, 0x03, 0x20, 0xDF, 0xAA, 0x3C, 0x6A, 0xB5, 0x45, 0xD0, 0x00, 0x2B, 0x30, 0xCC, 0x36, 0xB6 } } } }, // Amiga + CD Demo
-
- EXTRACT_END_ENTRY
-};
-
-const ExtractEntrySearchData k1IntroStringsProvider[] = {
- { EN_ANY, kPlatformDOS, { 0x000004F5, 0x0001A7B1, { { 0xC7, 0x65, 0x5B, 0x5A, 0x56, 0x43, 0x94, 0x55, 0x5B, 0x00, 0xFD, 0x5D, 0xF4, 0xB5, 0x04, 0x15 } } } }, // floppy
- { EN_ANY, kPlatformDOS, { 0x000004F6, 0x0001A7B1, { { 0xDE, 0x41, 0xB1, 0x98, 0xD5, 0xAD, 0x6B, 0xBA, 0x33, 0x04, 0x19, 0x5D, 0xCC, 0x07, 0xB5, 0x56 } } } }, // CD
- { EN_ANY, kPlatformDOS, { 0x000002FA, 0x00010181, { { 0x48, 0xD3, 0x1B, 0x8E, 0x8D, 0xBC, 0x1F, 0x51, 0x35, 0x71, 0xE2, 0xAB, 0xC8, 0xBE, 0xFC, 0x88 } } } }, // demo
-
- { FR_FRA, kPlatformDOS, { 0x000005EF, 0x000207E6, { { 0xDC, 0x6C, 0x9A, 0x7C, 0x19, 0x45, 0x2B, 0x25, 0x84, 0xCC, 0xE1, 0x40, 0xFE, 0x8E, 0xF4, 0x51 } } } }, // floppy
- { FR_FRA, kPlatformDOS, { 0x000005F0, 0x000207E6, { { 0xB8, 0x51, 0xEA, 0x44, 0x64, 0x04, 0xE4, 0x6A, 0x7B, 0xBD, 0x31, 0x62, 0xC0, 0xDD, 0xEA, 0xEF } } } }, // CD
-
- { DE_DEU, kPlatformDOS, { 0x00000605, 0x000212AB, { { 0x8F, 0x3A, 0x9D, 0x9A, 0x81, 0xF2, 0x4A, 0x90, 0xBC, 0xBD, 0x62, 0x8B, 0xD8, 0xD6, 0xF4, 0x5D } } } }, // floppy
- { DE_DEU, kPlatformDOS, { 0x00000606, 0x000212AB, { { 0xB0, 0x78, 0x86, 0xFB, 0xCB, 0x3D, 0x1E, 0x1E, 0x86, 0xE7, 0x2C, 0x2B, 0x3A, 0x3C, 0x6F, 0x1C } } } }, // CD
-
- { IT_ITA, kPlatformDOS, { 0x0000057C, 0x0001DF02, { { 0x4B, 0x09, 0xBC, 0xBC, 0xB3, 0x3C, 0x69, 0xEB, 0xA6, 0xB5, 0x76, 0xED, 0xC7, 0x57, 0x71, 0xB0 } } } }, // floppy
- { IT_ITA, kPlatformDOS, { 0x000005F0, 0x0001CF13, { { 0x4F, 0xA0, 0x47, 0x57, 0x6D, 0x2D, 0xA6, 0x62, 0x06, 0xBE, 0x86, 0xD2, 0xD7, 0xEA, 0x2E, 0xD6 } } } }, // (fan) CD
-
- { ES_ESP, kPlatformDOS, { 0x000005CF, 0x00020415, { { 0xCC, 0xE5, 0x9F, 0xB8, 0xCA, 0xFA, 0x2D, 0x05, 0xB8, 0xAF, 0x9F, 0x1F, 0x8A, 0xA8, 0x56, 0xDE } } } },
-
- { RU_RUS, kPlatformDOS, { 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 } } } },
-
- { EN_ANY, kPlatformFMTowns, { 0x00000545, 0x0001A84C, { { 0xEF, 0xE2, 0xE4, 0x92, 0xE1, 0x18, 0xF8, 0x3C, 0x91, 0x29, 0x4D, 0x82, 0xA4, 0x3E, 0xE6, 0x7D } } } },
- { JA_JPN, kPlatformFMTowns, { 0x000005FB, 0x0003163E, { { 0x16, 0x28, 0x83, 0xCE, 0x29, 0x94, 0x9F, 0x82, 0xDC, 0xD4, 0x06, 0xE8, 0x67, 0xC9, 0x56, 0x29 } } } },
-
- { JA_JPN, kPlatformPC98, { 0x000005D0, 0x00032AD7, { { 0xEE, 0x36, 0x93, 0xDD, 0x71, 0x02, 0xE9, 0x0D, 0x54, 0xDE, 0xB6, 0xE1, 0x09, 0x59, 0x60, 0x64 } } } },
-
- EXTRACT_END_ENTRY
-};
-
-const ExtractEntrySearchData k1OutroHomeStringProvider[] = {
- { EN_ANY, kPlatformUnknown, { 0x00000005, 0x00000189, { { 0xA5, 0xF3, 0x03, 0x3F, 0x43, 0x2B, 0x77, 0xCC, 0x5C, 0x96, 0x64, 0xB1, 0x75, 0xB5, 0x3E, 0xF6 } } } },
-
- { JA_JPN, kPlatformUnknown, { 0x00000007, 0x000003E8, { { 0x68, 0x35, 0x87, 0x53, 0xD9, 0x53, 0x1F, 0x13, 0x24, 0x61, 0x0D, 0x8D, 0x33, 0x91, 0xF3, 0x47 } } } },
-
- { FR_FRA, kPlatformDOS, { 0x00000007, 0x00000267, { { 0xD0, 0xC1, 0x11, 0x49, 0x3D, 0x3F, 0xCE, 0x84, 0x8F, 0xEF, 0xE3, 0xFD, 0x43, 0xCA, 0x92, 0xB0 } } } },
-
- { DE_DEU, kPlatformUnknown, { 0x0000000E, 0x00000473, { { 0xB6, 0xEB, 0xE8, 0x22, 0x67, 0x24, 0xA9, 0xA3, 0x94, 0x55, 0xC6, 0x57, 0x17, 0x15, 0x5B, 0x04 } } } },
-
- { ES_ESP, kPlatformDOS, { 0x00000005, 0x00000178, { { 0x2E, 0x9C, 0x94, 0x0F, 0x29, 0x77, 0x27, 0x1D, 0x77, 0x1E, 0x5A, 0xF8, 0x0E, 0x8D, 0x09, 0x6B } } } },
- { IT_ITA, kPlatformDOS, { 0x00000005, 0x00000178, { { 0x2E, 0x9C, 0x94, 0x0F, 0x29, 0x77, 0x27, 0x1D, 0x77, 0x1E, 0x5A, 0xF8, 0x0E, 0x8D, 0x09, 0x6B } } } },
-
- { IT_ITA, kPlatformDOS, { 0x00000007, 0x000001B8, { { 0x17, 0x95, 0x5B, 0x4F, 0xE2, 0x07, 0x5A, 0x49, 0xFA, 0xCE, 0x53, 0x8B, 0xE7, 0x46, 0x69, 0xC7 } } } }, // (fan) CD
-
- { RU_RUS, kPlatformDOS, { 0x00000005, 0x000000EF, { { 0xA0, 0xB4, 0xF2, 0x11, 0x16, 0x92, 0xC8, 0xEB, 0xF2, 0x0C, 0xFE, 0x43, 0xFE, 0x18, 0xF6, 0xBB } } } },
-
- EXTRACT_END_ENTRY
-};
-
-const ExtractEntrySearchData k1RoomFilenamesProvider[] = {
- { UNK_LANG, kPlatformFMTowns, { 0x0000034C, 0x0000B7AA, { { 0x7C, 0x1B, 0x89, 0x09, 0xF0, 0x87, 0x3C, 0x64, 0x3D, 0x0E, 0x61, 0xCC, 0x09, 0x8D, 0xC9, 0x95 } } } },
- { UNK_LANG, kPlatformUnknown, { 0x000002DC, 0x0000B7AA, { { 0x31, 0x56, 0x41, 0x69, 0x1E, 0x84, 0x54, 0x2C, 0xF7, 0x7B, 0x98, 0x25, 0xF3, 0x91, 0x56, 0xFD } } } }, // DOS + PC98
-
- { UNK_LANG, kPlatformAmiga, { 0x00000308, 0x0000B7AA, { { 0x6D, 0xA4, 0xE8, 0x27, 0x68, 0x24, 0xCF, 0xAA, 0x30, 0x32, 0x71, 0x74, 0x36, 0x68, 0x82, 0x20 } } } },
-
- EXTRACT_END_ENTRY
-};
-
-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 } } } },
-
- EXTRACT_END_ENTRY
-};
-
-const ExtractEntrySearchData k1CharacterImageFilenamesProvider[] = {
- { UNK_LANG, kPlatformFMTowns, { 0x000000F7, 0x00003A8F, { { 0x1F, 0xAB, 0x8E, 0x5F, 0xAD, 0x76, 0x57, 0x37, 0xD7, 0x9B, 0x3F, 0x35, 0x4B, 0xA0, 0x98, 0x37 } } } },
-
- { UNK_LANG, kPlatformUnknown, { 0x000000E4, 0x00003A8F, { { 0x7A, 0x77, 0x6D, 0x26, 0xC8, 0x43, 0xCB, 0x74, 0x46, 0x2E, 0x04, 0x22, 0x89, 0x27, 0x33, 0x06 } } } }, // DOS + PC98
-
- { UNK_LANG, kPlatformAmiga, { 0x000000F0, 0x00003A8F, { { 0xC0, 0xD9, 0x8C, 0x2B, 0x65, 0x51, 0x7C, 0x13, 0x52, 0x7E, 0xF7, 0x63, 0xA6, 0xA9, 0xCE, 0x40 } } } },
-
- EXTRACT_END_ENTRY
-};
-
-const ExtractEntrySearchData k1AudioTracksProvider[] = {
- { UNK_LANG, kPlatformDOS, { 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, kPlatformDOS, { 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
-
- EXTRACT_END_ENTRY
-};
-
-const ExtractEntrySearchData k1ItemNamesProvider[] = {
- { EN_ANY, kPlatformDOS, { 0x00000468, 0x00018B13, { { 0xCE, 0xFE, 0x19, 0x5D, 0x3F, 0xD7, 0x2A, 0xF6, 0xD0, 0xC5, 0xBC, 0x17, 0x6A, 0x52, 0xDB, 0xFE } } } },
-
- { FR_FRA, kPlatformDOS, { 0x00000506, 0x0001C3CC, { { 0x46, 0xD4, 0x19, 0x04, 0x2A, 0x46, 0xCD, 0x63, 0x41, 0x5A, 0x8E, 0xA8, 0x00, 0xDD, 0x02, 0x77 } } } },
-
- { DE_DEU, kPlatformDOS, { 0x00000512, 0x0001DD2C, { { 0x5D, 0xB0, 0x6B, 0x8E, 0x9C, 0x70, 0x09, 0x90, 0x3C, 0xC6, 0x58, 0x1F, 0x71, 0x24, 0x76, 0x56 } } } },
-
- { IT_ITA, kPlatformDOS, { 0x00000591, 0x0001F869, { { 0x4D, 0xD7, 0x66, 0xBB, 0x9A, 0xD8, 0x79, 0x1E, 0x92, 0x2B, 0xE5, 0xC2, 0x0F, 0x02, 0x0B, 0x35 } } } }, // floppy
- { IT_ITA, kPlatformDOS, { 0x00000506, 0x0001C1D9, { { 0xF2, 0x2D, 0x18, 0x13, 0x61, 0xFB, 0x57, 0x93, 0x5C, 0xDC, 0x79, 0x44, 0x96, 0x01, 0xA6, 0x90 } } } }, // (fan) CD
-
- { ES_ESP, kPlatformDOS, { 0x00000530, 0x0001D90A, { { 0x52, 0xFB, 0xA8, 0x3F, 0xA3, 0x6F, 0xC2, 0x67, 0x55, 0x9F, 0x66, 0x9F, 0xFD, 0x79, 0x44, 0xDF } } } },
-
- { RU_RUS, kPlatformDOS, { 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 } } } },
-
- { EN_ANY, kPlatformFMTowns, { 0x00000505, 0x00018B13, { { 0x62, 0x76, 0x84, 0x5D, 0x8D, 0xBA, 0x23, 0xC5, 0x67, 0x26, 0x22, 0xBD, 0xBE, 0x81, 0x2D, 0xFF } } } },
- { JA_JPN, kPlatformFMTowns, { 0x00000587, 0x000247A1, { { 0xE8, 0xCA, 0x1E, 0x34, 0x05, 0xE5, 0x08, 0xCA, 0xA7, 0xFE, 0x55, 0xCB, 0x75, 0xD0, 0xA7, 0x19 } } } },
-
- { JA_JPN, kPlatformPC98, { 0x000004CF, 0x000247A1, { { 0xBE, 0x80, 0x3F, 0x10, 0xF7, 0x3A, 0x85, 0xD1, 0xE8, 0x24, 0xE6, 0x4E, 0x8F, 0x17, 0xC9, 0x2E } } } },
-
- EXTRACT_END_ENTRY
-};
-
-const ExtractEntrySearchData k1TakenStringsProvider[] = {
- { EN_ANY, kPlatformDOS, { 0x00000010, 0x000004C2, { { 0x08, 0xC0, 0x66, 0xB1, 0x45, 0x04, 0x78, 0xF9, 0xAF, 0x0F, 0x52, 0xC8, 0x0E, 0x0C, 0x69, 0x86 } } } },
-
- { FR_FRA, kPlatformDOS, { 0x0000001E, 0x000008FA, { { 0xC9, 0xCC, 0x2E, 0x0B, 0xE4, 0xE0, 0x44, 0xBD, 0xC2, 0x10, 0x09, 0xA3, 0x36, 0xB1, 0x5D, 0x1C } } } }, // floppy
- { FR_FRA, kPlatformDOS, { 0x0000000F, 0x0000047D, { { 0xE8, 0xB5, 0x15, 0xD5, 0x96, 0x81, 0xD2, 0x84, 0xAB, 0x33, 0xC1, 0x1C, 0x47, 0x1B, 0xFE, 0xDB } } } }, // CD
-
- { DE_DEU, kPlatformDOS, { 0x0000001C, 0x000009C0, { { 0xA8, 0x64, 0xDD, 0x9D, 0x91, 0x42, 0x04, 0x26, 0xD0, 0x80, 0x40, 0xED, 0x08, 0x51, 0xC9, 0xBB } } } },
-
- { IT_ITA, kPlatformDOS, { 0x00000014, 0x00000588, { { 0x5B, 0x75, 0xAE, 0xD7, 0x50, 0x6C, 0x3E, 0x65, 0x5C, 0xF8, 0x84, 0x34, 0x48, 0x58, 0x0E, 0x6E } } } }, // floppy
- { IT_ITA, kPlatformDOS, { 0x0000000F, 0x000002F0, { { 0x37, 0x22, 0x62, 0xE4, 0x1B, 0x1F, 0xD6, 0x9E, 0x94, 0xA3, 0x41, 0x00, 0xD5, 0x29, 0x28, 0x09 } } } }, // (fan) CD
-
- { ES_ESP, kPlatformDOS, { 0x00000014, 0x000005D8, { { 0xD6, 0x00, 0x90, 0x6A, 0x75, 0x3B, 0xF1, 0xFE, 0xF4, 0x3E, 0x0E, 0x1D, 0x39, 0xEB, 0x2D, 0xC8 } } } },
-
- { RU_RUS, kPlatformDOS, { 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 } } } },
-
- { EN_ANY, kPlatformFMTowns, { 0x0000001C, 0x00000AED, { { 0x32, 0xD2, 0x87, 0x67, 0x3D, 0x01, 0x50, 0xF3, 0xFA, 0x19, 0x7A, 0xB0, 0xF8, 0x6F, 0x8A, 0x07 } } } },
- { JA_JPN, kPlatformFMTowns, { 0x0000001F, 0x00000EB7, { { 0x7F, 0x8C, 0xFF, 0x35, 0x30, 0x71, 0x9A, 0x78, 0xCC, 0x07, 0x11, 0x86, 0xE3, 0x0D, 0x16, 0xDF } } } },
-
- { JA_JPN, kPlatformPC98, { 0x00000016, 0x00000C56, { { 0x97, 0xF0, 0x57, 0xCC, 0x03, 0x06, 0x41, 0xDC, 0xFC, 0xD5, 0xA2, 0x35, 0x0C, 0x71, 0x37, 0xCC } } } },
-
- EXTRACT_END_ENTRY
-};
-
-const ExtractEntrySearchData k1PlacedStringsProvider[] = {
- { EN_ANY, kPlatformUnknown, { 0x00000009, 0x000002B7, { { 0xE7, 0xCF, 0x8A, 0x19, 0xEF, 0x98, 0xE5, 0x74, 0x46, 0x46, 0x47, 0x65, 0xB6, 0x81, 0x70, 0x0A } } } },
-
- { JA_JPN, kPlatformUnknown, { 0x0000000D, 0x0000074C, { { 0x0E, 0x1C, 0x1F, 0xD2, 0xCF, 0xBF, 0x40, 0xE1, 0x59, 0x0F, 0x1B, 0x46, 0xED, 0x8B, 0x96, 0x8E } } } },
-
- { FR_FRA, kPlatformDOS, { 0x00000011, 0x00000545, { { 0x05, 0xEF, 0x74, 0x54, 0x06, 0xB7, 0x64, 0x47, 0x21, 0x56, 0x55, 0x74, 0x70, 0x2D, 0xA8, 0x23 } } } },
-
- { DE_DEU, kPlatformUnknown, { 0x0000000B, 0x00000389, { { 0xB9, 0x74, 0xBE, 0x63, 0xB4, 0xA4, 0x8A, 0x04, 0xD9, 0x50, 0x73, 0xB7, 0x01, 0x9E, 0x77, 0xD3 } } } },
-
- { IT_ITA, kPlatformDOS, { 0x0000000D, 0x0000040D, { { 0x9C, 0x71, 0x53, 0x35, 0xC3, 0xE8, 0x46, 0xB9, 0xD2, 0xFA, 0x1C, 0x8C, 0xC3, 0xFF, 0xBC, 0x1F } } } }, // floppy
- { IT_ITA, kPlatformDOS, { 0x00000011, 0x000003B8, { { 0xC8, 0xA6, 0xE4, 0x8A, 0xF7, 0x4C, 0x3F, 0xA6, 0x24, 0x7F, 0xEF, 0xE4, 0x63, 0x8B, 0x72, 0xF3 } } } }, // (fan) CD
-
- { ES_ESP, kPlatformDOS, { 0x0000000D, 0x00000439, { { 0x57, 0xAE, 0x1C, 0xC1, 0xF5, 0xE8, 0x5B, 0x9E, 0x90, 0x02, 0xB9, 0x8D, 0x86, 0x38, 0xFB, 0xA8 } } } },
-
- { RU_RUS, kPlatformDOS, { 0x00000009, 0x00000203, { { 0x7D, 0xAE, 0x67, 0x94, 0x8E, 0x73, 0x35, 0xC1, 0x11, 0xB4, 0x55, 0x6E, 0x92, 0x25, 0x39, 0xE4 } } } },
-
- EXTRACT_END_ENTRY
-};
-
-const ExtractEntrySearchData k1DroppedStringsProvider[] = {
- { EN_ANY, kPlatformUnknown, { 0x0000000A, 0x0000033C, { { 0x96, 0x63, 0xFD, 0x73, 0x71, 0xCC, 0x62, 0x59, 0x86, 0x02, 0x47, 0x55, 0x82, 0xF8, 0x5E, 0x1F } } } },
-
- { JA_JPN, kPlatformUnknown, { 0x0000000B, 0x0000059F, { { 0xDD, 0x5E, 0x51, 0x7E, 0xD9, 0xFC, 0xCD, 0xAD, 0x6B, 0x93, 0x71, 0xBE, 0x83, 0x63, 0x3F, 0x88 } } } },
-
- { FR_FRA, kPlatformDOS, { 0x00000011, 0x00000579, { { 0x3D, 0x0C, 0x3C, 0xAD, 0x2E, 0xE3, 0x7A, 0x5A, 0x4A, 0x21, 0x1C, 0x96, 0xC5, 0x5A, 0xA7, 0x9E } } } },
-
- { DE_DEU, kPlatformUnknown, { 0x00000011, 0x00000612, { { 0xEC, 0xCD, 0x99, 0x58, 0xF7, 0x08, 0x92, 0x43, 0x95, 0x10, 0x6B, 0xDD, 0x61, 0xF7, 0x5C, 0xA4 } } } },
-
- { IT_ITA, kPlatformDOS, { 0x0000000B, 0x0000031B, { { 0x32, 0x0C, 0xCD, 0x83, 0xF6, 0x97, 0xC8, 0x76, 0x57, 0x6B, 0x7C, 0xAD, 0x51, 0xEB, 0x91, 0x1F } } } }, // floppy
- { IT_ITA, kPlatformDOS, { 0x00000011, 0x000003B8, { { 0xC8, 0xA6, 0xE4, 0x8A, 0xF7, 0x4C, 0x3F, 0xA6, 0x24, 0x7F, 0xEF, 0xE4, 0x63, 0x8B, 0x72, 0xF3 } } } }, // (fan) CD
-
- { ES_ESP, kPlatformDOS, { 0x00000008, 0x00000261, { { 0x1D, 0xB5, 0xFB, 0x23, 0x94, 0xA7, 0x86, 0x7A, 0xAC, 0x53, 0xDA, 0x6F, 0xCC, 0x41, 0x0F, 0xD7 } } } },
-
- { RU_RUS, kPlatformDOS, { 0x0000000A, 0x000001F5, { { 0xAA, 0x21, 0x88, 0x6D, 0xD0, 0xAB, 0x5C, 0x15, 0x7F, 0xAD, 0x0E, 0x3B, 0x2F, 0x17, 0xBF, 0xAD } } } },
-
- EXTRACT_END_ENTRY
-};
-
-const ExtractEntrySearchData k1NoDropStringsProvider[] = {
- { EN_ANY, kPlatformDOS, { 0x00000047, 0x00001881, { { 0xEF, 0x81, 0x2B, 0x8F, 0x06, 0x0C, 0xA6, 0xBA, 0x50, 0x9C, 0x99, 0x40, 0x53, 0xFD, 0xC1, 0x55 } } } },
-
- { FR_FRA, kPlatformDOS, { 0x0000004C, 0x00001B39, { { 0xFF, 0xD5, 0x5D, 0x1C, 0xF1, 0x8A, 0xA4, 0x21, 0xB1, 0x56, 0x2B, 0xAC, 0x9F, 0x40, 0x30, 0x53 } } } },
-
- { DE_DEU, kPlatformDOS, { 0x0000004C, 0x00001AFF, { { 0xE5, 0x05, 0x79, 0x10, 0x91, 0x95, 0x64, 0x40, 0xB2, 0x73, 0x39, 0xFA, 0x50, 0x8D, 0xCE, 0x8A } } } },
-
- { IT_ITA, kPlatformDOS, { 0x00000045, 0x00001850, { { 0x50, 0x34, 0x82, 0xA9, 0x28, 0xDE, 0x44, 0xB3, 0x2D, 0x59, 0x0B, 0x7F, 0xCE, 0x42, 0x1F, 0x73 } } } }, // floppy
- { IT_ITA, kPlatformDOS, { 0x0000004C, 0x00001650, { { 0x42, 0x7A, 0x04, 0xCD, 0x69, 0xB1, 0x06, 0x9A, 0xD8, 0x7E, 0x7A, 0x14, 0x5B, 0x1C, 0x70, 0xB8 } } } }, // (fan) CD
-
- { ES_ESP, kPlatformDOS, { 0x0000003D, 0x000015FA, { { 0x87, 0x2E, 0xE6, 0x8A, 0xF1, 0xC9, 0xC9, 0xEC, 0xD3, 0x2C, 0x25, 0x7E, 0x36, 0x02, 0xF7, 0xAC } } } },
-
- { EN_ANY, kPlatformAmiga, { 0x00000048, 0x00001881, { { 0x69, 0xA8, 0x0B, 0x47, 0xFD, 0xA0, 0x94, 0x12, 0x82, 0x1D, 0xE0, 0x9C, 0xB1, 0x10, 0x6D, 0x11 } } } },
- { DE_DEU, kPlatformAmiga, { 0x0000004D, 0x00001AFF, { { 0xF8, 0x83, 0x2E, 0x08, 0x88, 0x7B, 0x72, 0x7F, 0x71, 0xD4, 0x05, 0xF3, 0x1A, 0x78, 0xF1, 0x9D } } } },
-
- { EN_ANY, kPlatformFMTowns, { 0x0000007A, 0x0000323C, { { 0x00, 0x7F, 0x8E, 0x2E, 0x7B, 0xFC, 0x06, 0x0B, 0x7A, 0x7F, 0x17, 0xAF, 0x47, 0x82, 0xC1, 0x16 } } } },
- { JA_JPN, kPlatformFMTowns, { 0x00000061, 0x00002E9C, { { 0x8A, 0xFA, 0x43, 0x26, 0x68, 0x6D, 0x5A, 0x59, 0x0C, 0x9E, 0xCB, 0x28, 0x43, 0x33, 0x54, 0x49 } } } },
-
- { JA_JPN, kPlatformPC98, { 0x00000042, 0x000025C2, { { 0x6F, 0x34, 0x59, 0x17, 0x22, 0xCE, 0x1A, 0x82, 0x18, 0xE3, 0x9F, 0x86, 0x84, 0xF1, 0x8E, 0x0C } } } },
-
- EXTRACT_END_ENTRY
-};
-
-const ExtractEntrySearchData k1PutDownStringProvider[] = {
- { EN_ANY, kPlatformUnknown, { 0x00000026, 0x00000D27, { { 0x83, 0x09, 0x51, 0xD3, 0x94, 0x2B, 0xB1, 0x8B, 0x8B, 0x16, 0xA9, 0xEB, 0xE8, 0xA2, 0x4F, 0x0C } } } },
-
- { JA_JPN, kPlatformUnknown, { 0x00000029, 0x0000187D, { { 0xDE, 0xEE, 0x66, 0x88, 0x57, 0xF5, 0xF9, 0x2E, 0xD2, 0x14, 0xF5, 0x83, 0xA0, 0x0D, 0x96, 0x86 } } } },
-
- { FR_FRA, kPlatformDOS, { 0x0000002E, 0x0000101D, { { 0xBC, 0xEA, 0x6C, 0x1F, 0x31, 0xCF, 0x30, 0x26, 0x2D, 0x24, 0xC5, 0xEA, 0x97, 0x49, 0xDC, 0x4C } } } },
-
- { DE_DEU, kPlatformUnknown, { 0x00000028, 0x00000E7E, { { 0x26, 0x93, 0x76, 0x37, 0x41, 0x2E, 0xF3, 0xED, 0xF5, 0x7B, 0xA7, 0xEB, 0x80, 0x61, 0x3B, 0x84 } } } },
-
- { IT_ITA, kPlatformDOS, { 0x00000034, 0x0000131D, { { 0x36, 0x87, 0x4D, 0x73, 0x2A, 0x67, 0xBA, 0xCE, 0xCB, 0x33, 0x3C, 0x10, 0xCC, 0x3E, 0x7E, 0xAD } } } }, // floppy
- { IT_ITA, kPlatformDOS, { 0x0000002E, 0x00000EB2, { { 0x14, 0x08, 0xE6, 0xD1, 0x54, 0x76, 0x2A, 0x9E, 0xBE, 0x5A, 0x15, 0xEB, 0x52, 0x01, 0x52, 0x97 } } } }, // (fan) CD
-
- { ES_ESP, kPlatformDOS, { 0x0000002D, 0x00001052, { { 0x12, 0x0A, 0x23, 0x11, 0xDF, 0x8A, 0x59, 0xD4, 0xF2, 0xCA, 0xA5, 0xA7, 0x76, 0x1B, 0x54, 0xB6 } } } },
-
- { RU_RUS, kPlatformDOS, { 0x00000024, 0x0000099F, { { 0x05, 0xD7, 0xB8, 0x32, 0x95, 0x93, 0x29, 0x5F, 0xF3, 0x1A, 0xF0, 0x2E, 0xBA, 0x3A, 0x0D, 0x27 } } } },
-
- EXTRACT_END_ENTRY
-};
-
-const ExtractEntrySearchData k1WaitAmuletStringProvider[] = {
- { EN_ANY, kPlatformDOS, { 0x0000003D, 0x0000150D, { { 0x11, 0xC8, 0x7E, 0x83, 0x7A, 0xC3, 0x5D, 0xD9, 0x72, 0xFC, 0x75, 0xCB, 0x57, 0xE9, 0xF1, 0x36 } } } },
-
- { JA_JPN, kPlatformUnknown, { 0x00000029, 0x000017A7, { { 0xFD, 0xA3, 0xAD, 0x24, 0x16, 0x49, 0x22, 0x6F, 0x52, 0xE9, 0x50, 0x11, 0x51, 0x38, 0xCA, 0xE0 } } } },
-
- { FR_FRA, kPlatformDOS, { 0x00000049, 0x00001ADD, { { 0xFD, 0xCF, 0x9C, 0xAD, 0xA2, 0xAA, 0x74, 0x11, 0x8E, 0x89, 0x02, 0xCB, 0x2B, 0x5B, 0x2B, 0x1C } } } },
-
- { DE_DEU, kPlatformUnknown, { 0x00000048, 0x000019CF, { { 0x82, 0xDD, 0xBD, 0xA3, 0xD0, 0xE0, 0x19, 0xC0, 0x6D, 0xC5, 0xEE, 0x7A, 0x0B, 0x49, 0x06, 0xCE } } } },
-
- { IT_ITA, kPlatformDOS, { 0x0000004A, 0x00001B4C, { { 0x38, 0x26, 0x54, 0x10, 0x3D, 0x32, 0xCD, 0xAE, 0x3F, 0x96, 0xFE, 0x6F, 0x4A, 0x94, 0x72, 0xB0 } } } }, // floppy
- { IT_ITA, kPlatformDOS, { 0x00000049, 0x0000184F, { { 0x11, 0x42, 0xB2, 0xD6, 0x76, 0xEA, 0xF9, 0xCA, 0x46, 0xE4, 0xA6, 0x35, 0xE8, 0xB9, 0x8B, 0xE9 } } } }, // (fan) CD
-
- { ES_ESP, kPlatformDOS, { 0x00000042, 0x000017FD, { { 0x0A, 0x8A, 0x7E, 0x9A, 0x5F, 0x4A, 0x35, 0x06, 0x4D, 0x6B, 0xBF, 0x29, 0x1B, 0xAD, 0xD8, 0x37 } } } },
-
- { RU_RUS, kPlatformDOS, { 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
-};
-
-const ExtractEntrySearchData k1BlackJewelStringProvider[] = {
- { EN_ANY, kPlatformDOS, { 0x00000023, 0x00000B73, { { 0xBE, 0xE9, 0xBD, 0x65, 0xB9, 0xB1, 0xCD, 0xF0, 0x45, 0x03, 0x01, 0x70, 0xBE, 0xD0, 0x0F, 0x80 } } } },
-
- { JA_JPN, kPlatformUnknown, { 0x00000035, 0x0000205F, { { 0x33, 0xD6, 0x19, 0xEE, 0xEA, 0xDD, 0x9F, 0xB5, 0x77, 0x0C, 0x8E, 0x84, 0x5E, 0x61, 0x22, 0x3E } } } },
-
- { FR_FRA, kPlatformDOS, { 0x0000002B, 0x00000F11, { { 0x68, 0xA0, 0xA3, 0xA0, 0xB6, 0xD1, 0x40, 0x22, 0xB4, 0x10, 0x3D, 0x5A, 0x7F, 0x1F, 0x4B, 0xE7 } } } },
-
- { DE_DEU, kPlatformUnknown, { 0x00000031, 0x0000113B, { { 0xA5, 0x00, 0xD1, 0xDC, 0x25, 0x99, 0x3E, 0x6B, 0xFF, 0xC8, 0x6C, 0xDA, 0xA4, 0xCF, 0x51, 0xD7 } } } },
-
- { IT_ITA, kPlatformDOS, { 0x00000022, 0x00000B6E, { { 0xAE, 0xA0, 0xDF, 0x07, 0xDD, 0x88, 0x98, 0x6B, 0xDD, 0x9E, 0x2E, 0xC0, 0xBD, 0x45, 0x2E, 0x2B } } } }, // floppy
- { IT_ITA, kPlatformDOS, { 0x0000002B, 0x00000D6D, { { 0x08, 0x5E, 0x1F, 0xA8, 0x8F, 0x1F, 0x6A, 0xE0, 0xF3, 0x49, 0xEF, 0x44, 0xA8, 0xCD, 0xDE, 0x45 } } } }, // (fan) CD
-
- { ES_ESP, kPlatformDOS, { 0x00000025, 0x00000CF6, { { 0x4B, 0x13, 0x39, 0xCB, 0x3F, 0x44, 0x18, 0x46, 0x43, 0xDB, 0x94, 0xC5, 0x3E, 0x6B, 0xC4, 0x74 } } } },
-
- { RU_RUS, kPlatformDOS, { 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
-};
-
-const ExtractEntrySearchData k1PoisonGoneStringProvider[] = {
- { EN_ANY, kPlatformDOS, { 0x0000002D, 0x00000F59, { { 0x9A, 0x88, 0x07, 0x5A, 0x9C, 0xC3, 0x7B, 0xB0, 0x79, 0x69, 0xE0, 0x84, 0x11, 0x9B, 0x82, 0xCD } } } },
-
- { FR_FRA, kPlatformDOS, { 0x00000059, 0x00001E91, { { 0xDA, 0x9C, 0xC4, 0x7A, 0x79, 0x73, 0x60, 0xBF, 0x31, 0xF8, 0x8F, 0xAF, 0xC1, 0x4D, 0x25, 0xEC } } } }, // floppy
- { FR_FRA, kPlatformDOS, { 0x0000002A, 0x00000EAA, { { 0x0B, 0x4E, 0xDF, 0x03, 0x9E, 0x64, 0x3B, 0x13, 0x10, 0x6A, 0xF9, 0x4C, 0x66, 0x0D, 0x09, 0xC5 } } } }, // (fan) CD
-
- { DE_DEU, kPlatformDOS, { 0x00000036, 0x00001324, { { 0x30, 0x67, 0xEE, 0x7C, 0x4D, 0x36, 0xFE, 0x46, 0x05, 0x44, 0x23, 0xA1, 0xB4, 0x07, 0x16, 0xB5 } } } },
-
- { IT_ITA, kPlatformDOS, { 0x00000034, 0x0000128D, { { 0x4E, 0x54, 0xFE, 0x58, 0x7F, 0x15, 0xFA, 0xC1, 0x50, 0xF8, 0x47, 0x29, 0x15, 0xE8, 0x83, 0xC7 } } } }, // floppy
- { IT_ITA, kPlatformDOS, { 0x0000002A, 0x00000DFD, { { 0x57, 0xDC, 0xE0, 0x45, 0x2E, 0x89, 0x77, 0x7F, 0x4B, 0x41, 0xCF, 0x4A, 0xFE, 0x0B, 0xAF, 0xC1 } } } }, // (fan) CD
-
- { ES_ESP, kPlatformDOS, { 0x00000033, 0x0000127E, { { 0x67, 0xEB, 0xD3, 0x00, 0xF8, 0x4F, 0xF1, 0x79, 0x48, 0xE6, 0x9C, 0xB2, 0xA7, 0xCF, 0x76, 0x07 } } } },
-
- { RU_RUS, kPlatformDOS, { 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 } } } },
-
- { EN_ANY, kPlatformFMTowns, { 0x0000003C, 0x000013B4, { { 0xE9, 0x54, 0xF1, 0xEC, 0x64, 0x5A, 0xEB, 0xC7, 0xAA, 0x7E, 0xA2, 0x9F, 0xE8, 0xFB, 0x3A, 0x82 } } } },
- { JA_JPN, kPlatformFMTowns, { 0x0000003D, 0x000017D1, { { 0x7C, 0x93, 0x62, 0x32, 0x47, 0xB9, 0x78, 0x03, 0x86, 0x8D, 0x99, 0xB8, 0x86, 0x68, 0xEF, 0x3A } } } },
-
- { JA_JPN, kPlatformPC98, { 0x00000016, 0x00000B60, { { 0xFF, 0x8C, 0xC0, 0x1B, 0x2C, 0x0C, 0x23, 0x89, 0x93, 0x79, 0xC5, 0xCD, 0xAC, 0xF9, 0xEA, 0xA7 } } } },
-
- EXTRACT_END_ENTRY
-};
-
-const ExtractEntrySearchData k1HealingTipStringProvider[] = {
- { EN_ANY, kPlatformDOS, { 0x0000002D, 0x00000F04, { { 0xC0, 0xC7, 0x0C, 0x3D, 0xA7, 0x62, 0x14, 0xFB, 0xE8, 0x52, 0x05, 0x0D, 0xFE, 0xF6, 0xC7, 0x28 } } } },
-
- { JA_JPN, kPlatformUnknown, { 0x0000002B, 0x00001949, { { 0xC7, 0xE3, 0x0A, 0x6B, 0x8F, 0xCA, 0xBC, 0x3A, 0xDC, 0x76, 0x48, 0xD3, 0x8B, 0xD9, 0x44, 0x2E } } } },
-
- { FR_FRA, kPlatformDOS, { 0x00000036, 0x0000132C, { { 0x86, 0x65, 0x80, 0x10, 0x40, 0x32, 0x6C, 0x2F, 0x5E, 0x76, 0xFB, 0xDC, 0x19, 0x33, 0x02, 0x3C } } } },
-
- { DE_DEU, kPlatformUnknown, { 0x0000003C, 0x00001537, { { 0x78, 0xC2, 0x76, 0x24, 0x0D, 0x1F, 0xC0, 0x13, 0x4E, 0x34, 0x0A, 0x50, 0x4C, 0x35, 0x7E, 0xB1 } } } },
-
- { IT_ITA, kPlatformDOS, { 0x0000003F, 0x0000170E, { { 0x0B, 0x37, 0xA4, 0x5E, 0x05, 0x4A, 0x96, 0x1F, 0x2E, 0x02, 0x43, 0xBE, 0xCC, 0xF9, 0x21, 0x5E } } } }, // floppy
- { IT_ITA, kPlatformDOS, { 0x00000036, 0x00001364, { { 0x59, 0x70, 0x13, 0x8D, 0x93, 0x9C, 0x1B, 0x69, 0x2F, 0x13, 0x9A, 0xB2, 0x4C, 0x97, 0x7E, 0x95 } } } }, // (fan) CD
-
- { ES_ESP, kPlatformDOS, { 0x00000028, 0x00000E0F, { { 0x3E, 0x40, 0xCA, 0x2A, 0x5F, 0xFE, 0x74, 0x30, 0x8C, 0x31, 0x41, 0x09, 0xBD, 0xFD, 0xA3, 0x7E } } } },
-
- { RU_RUS, kPlatformDOS, { 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
-};
-
-const ExtractEntrySearchData k1WispJewelStringsProvider[] = {
- { EN_ANY, kPlatformDOS, { 0x00000053, 0x00001C62, { { 0x9A, 0xF1, 0xCC, 0xB3, 0x09, 0xF0, 0x9C, 0x33, 0x0E, 0xF0, 0xE3, 0xF8, 0x24, 0x63, 0x40, 0x95 } } } }, // floppy
- { EN_ANY, kPlatformDOS, { 0x00000052, 0x00001CE8, { { 0x6D, 0x69, 0x6D, 0x15, 0x4F, 0xF1, 0xD8, 0xA6, 0x53, 0x9F, 0xE3, 0x77, 0x75, 0x25, 0xE7, 0x93 } } } }, // CD
-
- { FR_FRA, kPlatformDOS, { 0x0000005B, 0x00001E9A, { { 0xC1, 0x26, 0xF3, 0x64, 0x18, 0x7D, 0xF7, 0x5A, 0xB6, 0x2B, 0x44, 0x57, 0xDC, 0x60, 0x20, 0x3C } } } }, // floppy
- { FR_FRA, kPlatformDOS, { 0x00000050, 0x00001B8D, { { 0x9A, 0xCE, 0x1D, 0x62, 0xFA, 0xC6, 0x73, 0x80, 0x02, 0x0A, 0x61, 0x24, 0xDC, 0x2A, 0xEF, 0xE6 } } } }, // CD
-
- { DE_DEU, kPlatformDOS, { 0x00000061, 0x00002184, { { 0x4B, 0x20, 0xD7, 0xE6, 0x00, 0xBF, 0x32, 0x40, 0xB7, 0xD0, 0xD6, 0xEC, 0x9C, 0x0F, 0x0B, 0xF0 } } } }, // floppy
- { DE_DEU, kPlatformDOS, { 0x00000058, 0x00001E88, { { 0x0E, 0x14, 0xD1, 0xF3, 0x03, 0x29, 0x48, 0x1D, 0x32, 0x2A, 0xBB, 0x0B, 0x48, 0xB3, 0x2E, 0x47 } } } }, // CD
-
- { IT_ITA, kPlatformDOS, { 0x00000074, 0x00002945, { { 0x17, 0x8B, 0x7E, 0xD9, 0x04, 0x7C, 0xD4, 0x9D, 0xCE, 0xF0, 0x79, 0x00, 0xAC, 0x82, 0x7C, 0x82 } } } }, // floppy
- { IT_ITA, kPlatformDOS, { 0x00000050, 0x00001A10, { { 0xFB, 0x79, 0x74, 0x14, 0xB9, 0x75, 0x4F, 0x44, 0x83, 0xB1, 0xD4, 0xBE, 0x17, 0x0F, 0xC4, 0xD6 } } } }, // (fan) CD
-
- { ES_ESP, kPlatformDOS, { 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, kPlatformDOS, { 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 } } } },
-
- { EN_ANY, kPlatformFMTowns, { 0x00000075, 0x00002B94, { { 0xA5, 0x4C, 0xBF, 0x5F, 0xD3, 0xF8, 0x6D, 0xE4, 0xB4, 0x8E, 0x64, 0x84, 0xD9, 0xBA, 0x2B, 0x33 } } } },
- { JA_JPN, kPlatformFMTowns, { 0x00000067, 0x00002C6B, { { 0x55, 0x56, 0x6B, 0xEA, 0xEF, 0x34, 0xDA, 0x23, 0x23, 0xF4, 0x9D, 0x0F, 0xBF, 0xC3, 0x1F, 0xDA } } } },
-
- { JA_JPN, kPlatformPC98, { 0x00000037, 0x00001EDF, { { 0xA8, 0x42, 0x79, 0xEB, 0x82, 0xAF, 0x03, 0xD7, 0x03, 0xF9, 0xE0, 0x60, 0xD4, 0x87, 0xAD, 0x2E } } } },
-
- EXTRACT_END_ENTRY
-};
-
-const ExtractEntrySearchData k1MagicJewelStringsProvider[] = {
- { EN_ANY, kPlatformDOS, { 0x00000013, 0x0000069E, { { 0x7C, 0xF2, 0xEE, 0x7C, 0x8A, 0xCE, 0x5B, 0x09, 0x32, 0xDC, 0x31, 0x1F, 0x45, 0x21, 0x84, 0xFF } } } },
-
- { JA_JPN, kPlatformUnknown, { 0x0000000F, 0x0000087E, { { 0xD8, 0xF1, 0x40, 0x9D, 0x9C, 0x15, 0x9E, 0xBD, 0x69, 0xE5, 0xE1, 0x51, 0x34, 0x22, 0xF3, 0x75 } } } },
-
- { FR_FRA, kPlatformDOS, { 0x00000011, 0x000005DB, { { 0x44, 0x99, 0x35, 0x77, 0x9B, 0x3D, 0xF8, 0xAF, 0x7A, 0xA6, 0x14, 0xD0, 0x99, 0xC6, 0x80, 0x7B } } } },
-
- { DE_DEU, kPlatformUnknown, { 0x00000014, 0x000006EF, { { 0xDE, 0x77, 0xB6, 0x8C, 0x39, 0x5C, 0x6F, 0xDF, 0x7D, 0x04, 0x0F, 0x65, 0x24, 0x75, 0xED, 0x95 } } } },
-
- { IT_ITA, kPlatformDOS, { 0x0000001D, 0x00000A83, { { 0x60, 0x69, 0x18, 0x6C, 0x34, 0xB0, 0x56, 0xE3, 0x06, 0x7C, 0xB1, 0xDD, 0x26, 0x80, 0xAE, 0x30 } } } }, // floppy
- { IT_ITA, kPlatformDOS, { 0x00000011, 0x000005E4, { { 0xD5, 0x11, 0xDA, 0x40, 0x09, 0x6A, 0x5D, 0x76, 0x5C, 0x20, 0xC4, 0x43, 0x4D, 0xF3, 0x67, 0xF0 } } } }, // (fan) CD
-
- { ES_ESP, kPlatformDOS, { 0x00000011, 0x000005CD, { { 0x32, 0x2A, 0xFF, 0x9F, 0x10, 0x75, 0x6B, 0xD6, 0x46, 0xAE, 0x55, 0xD3, 0x68, 0x4F, 0xBB, 0x5A } } } },
-
- { RU_RUS, kPlatformDOS, { 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
-};
-
-const ExtractEntrySearchData k1ThePoisonStringsProvider[] = {
- { EN_ANY, kPlatformDOS, { 0x00000057, 0x00001C24, { { 0xBC, 0x31, 0x5C, 0x25, 0x50, 0x36, 0x58, 0x20, 0x55, 0xFC, 0x75, 0x47, 0x2D, 0x43, 0x73, 0x78 } } } },
-
- { FR_FRA, kPlatformDOS, { 0x00000068, 0x000022D8, { { 0x39, 0xDA, 0xB3, 0xD2, 0xDA, 0x3F, 0xAB, 0x40, 0x1A, 0x4F, 0x9D, 0x02, 0xBA, 0x37, 0xEC, 0x4D } } } },
-
- { DE_DEU, kPlatformDOS, { 0x00000072, 0x00002690, { { 0xEF, 0x62, 0x85, 0xA3, 0x8B, 0x20, 0x4B, 0x65, 0xF8, 0xE7, 0x2C, 0x02, 0x3F, 0x3F, 0x25, 0x65 } } } },
-
- { IT_ITA, kPlatformDOS, { 0x00000063, 0x000021F8, { { 0x3C, 0x2E, 0xF8, 0xAD, 0xCF, 0xB5, 0xE7, 0x2C, 0x98, 0x7A, 0xB9, 0x6F, 0x7A, 0x42, 0xE1, 0x92 } } } }, // floppy
- { IT_ITA, kPlatformDOS, { 0x00000068, 0x00002077, { { 0x5D, 0xF4, 0xF9, 0xD9, 0x87, 0x34, 0x14, 0xAB, 0xE4, 0x9A, 0x67, 0xAF, 0x18, 0x8B, 0x40, 0x98 } } } }, // (fan) CD
-
- { ES_ESP, kPlatformDOS, { 0x00000059, 0x00001DF7, { { 0x16, 0x7B, 0x5F, 0x91, 0x06, 0x5B, 0xFC, 0x9C, 0x88, 0x61, 0xCC, 0x1B, 0x52, 0x4F, 0x91, 0xC5 } } } },
-
- { RU_RUS, kPlatformDOS, { 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 } } } },
-
- { EN_ANY, kPlatformFMTowns, { 0x00000092, 0x0000334E, { { 0xC9, 0x02, 0xB5, 0xEF, 0x90, 0xA8, 0x9C, 0x6E, 0xAD, 0xD6, 0x1F, 0xCC, 0x71, 0x9F, 0x19, 0x2C } } } },
- { JA_JPN, kPlatformFMTowns, { 0x000000A0, 0x00003EEB, { { 0x4B, 0x0C, 0xD5, 0xF0, 0xFE, 0x05, 0xF5, 0x09, 0x96, 0xA9, 0xE4, 0xDD, 0x86, 0x8D, 0x79, 0x3C } } } },
-
- { JA_JPN, kPlatformPC98, { 0x00000045, 0x00002350, { { 0xAD, 0x17, 0xA0, 0x40, 0x86, 0x0E, 0x1D, 0x2F, 0xA7, 0x14, 0x5B, 0x81, 0x38, 0x09, 0x80, 0x21 } } } },
-
- EXTRACT_END_ENTRY
-};
-
-const ExtractEntrySearchData k1FluteStringsProvider[] = {
- { EN_ANY, kPlatformUnknown, { 0x0000003C, 0x00001599, { { 0x96, 0x72, 0x5A, 0x8A, 0xA0, 0xEE, 0xA2, 0xCE, 0x4D, 0x21, 0x01, 0x6C, 0xC5, 0x1A, 0xEB, 0x21 } } } }, // floppy + AMIGA
- { EN_ANY, kPlatformDOS, { 0x0000009C, 0x00002334, { { 0xA8, 0xA3, 0x1F, 0x0D, 0x36, 0x25, 0x19, 0x98, 0x50, 0xA0, 0x13, 0x65, 0xF4, 0xE8, 0x27, 0x19 } } } }, // CD
-
- { FR_FRA, kPlatformDOS, { 0x00000045, 0x000018EE, { { 0x3E, 0x3B, 0x20, 0x46, 0xEB, 0xB0, 0x88, 0x26, 0xB2, 0x0D, 0xD6, 0x8F, 0xF7, 0x53, 0x74, 0xAE } } } },
-
- { DE_DEU, kPlatformUnknown, { 0x00000040, 0x000016F2, { { 0x70, 0xFF, 0x86, 0x73, 0x9E, 0x75, 0xDD, 0x17, 0x27, 0x86, 0x44, 0xE9, 0x78, 0x3D, 0x48, 0xDB } } } },
-
- { IT_ITA, kPlatformDOS, { 0x0000004C, 0x00001BFB, { { 0x06, 0x4F, 0x6A, 0x37, 0x8B, 0x44, 0x27, 0x26, 0xCE, 0x28, 0xB2, 0x47, 0x71, 0xE2, 0x27, 0x73 } } } }, // floppy
- { IT_ITA, kPlatformDOS, { 0x00000045, 0x00001726, { { 0x5A, 0xCF, 0x64, 0x4B, 0x61, 0x57, 0xEC, 0xB3, 0xBF, 0x32, 0x45, 0x51, 0x5D, 0x02, 0xC5, 0xB6 } } } }, // (fan) CD
-
- { ES_ESP, kPlatformDOS, { 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, kPlatformDOS, { 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 } } } },
-
- { JA_JPN, kPlatformPC98, { 0x00000032, 0x00001CDF, { { 0xB7, 0x08, 0x8D, 0x67, 0xB2, 0x0F, 0x59, 0x2D, 0xA6, 0x36, 0x21, 0x7B, 0x8B, 0x89, 0xE3, 0xED } } } },
-
- EXTRACT_END_ENTRY
-};
-
-const ExtractEntrySearchData k1FlaskFullStringProvider[] = {
- { EN_ANY, kPlatformUnknown, { 0x0000001C, 0x000009C8, { { 0xA5, 0xC7, 0x5E, 0x6E, 0x02, 0xEE, 0x8C, 0xF8, 0xF0, 0xBF, 0x69, 0xB8, 0x05, 0x1E, 0xF5, 0x28 } } } },
-
- { JA_JPN, kPlatformUnknown, { 0x0000001F, 0x00001135, { { 0x90, 0x52, 0x4A, 0x95, 0xE4, 0x89, 0xD6, 0x0A, 0xE1, 0x2E, 0x98, 0x11, 0x02, 0xF5, 0x79, 0x37 } } } },
-
- { FR_FRA, kPlatformDOS, { 0x0000001E, 0x00000AC7, { { 0x4E, 0x7A, 0xC8, 0xC5, 0xD4, 0xB8, 0xD0, 0x73, 0x66, 0x2B, 0x2A, 0x13, 0xDE, 0xE1, 0x32, 0xAA } } } },
-
- { DE_DEU, kPlatformUnknown, { 0x0000001E, 0x00000A71, { { 0x11, 0x88, 0x37, 0x8E, 0x17, 0xF2, 0x82, 0x1E, 0x72, 0xF0, 0xA3, 0x2B, 0x4F, 0x76, 0x5F, 0xBA } } } },
-
- { IT_ITA, kPlatformDOS, { 0x00000021, 0x00000C19, { { 0xC0, 0xFA, 0xD2, 0xB8, 0xCA, 0x94, 0x67, 0x10, 0x65, 0x01, 0x7F, 0xB0, 0x95, 0xC6, 0x0E, 0xFF } } } }, // floppy
- { IT_ITA, kPlatformDOS, { 0x0000001E, 0x00000973, { { 0xD3, 0x93, 0x3C, 0xA6, 0xF7, 0x79, 0xE6, 0x05, 0x49, 0x88, 0x89, 0xDE, 0xCA, 0x77, 0x2F, 0x1B } } } }, // (fan) CD
-
- { ES_ESP, kPlatformDOS, { 0x0000001B, 0x0000099D, { { 0x13, 0x23, 0x5D, 0x38, 0x9B, 0xFB, 0x00, 0x5C, 0xA1, 0x3A, 0x22, 0xD6, 0xCD, 0x5C, 0x09, 0xAE } } } },
-
- { RU_RUS, kPlatformDOS, { 0x0000001A, 0x0000066E, { { 0x36, 0x43, 0xB6, 0xB2, 0xED, 0xBA, 0x21, 0x0C, 0x16, 0x54, 0x99, 0xF9, 0x2E, 0x6E, 0x0A, 0x28 } } } },
-
- EXTRACT_END_ENTRY
-};
-
-const ExtractEntrySearchData k1FullFlaskStringProvider[] = {
- { EN_ANY, kPlatformDOS, { 0x00000097, 0x00003521, { { 0x9C, 0x30, 0xC7, 0xC9, 0x97, 0xF3, 0x0E, 0xC4, 0x6E, 0xCA, 0x63, 0xC6, 0xD8, 0x06, 0xFF, 0x30 } } } },
-
- { FR_FRA, kPlatformDOS, { 0x00000086, 0x00002E16, { { 0x94, 0x6C, 0x6D, 0xB6, 0x4C, 0x84, 0xBB, 0xF6, 0xC8, 0x50, 0x4C, 0x00, 0x38, 0xE3, 0x09, 0x5B } } } },
-
- { DE_DEU, kPlatformDOS, { 0x000000AF, 0x00003E38, { { 0x66, 0x86, 0xAF, 0x1A, 0x2D, 0x33, 0x40, 0xE7, 0x96, 0x9B, 0x32, 0x26, 0xFF, 0x9F, 0x79, 0x8B } } } },
-
- { IT_ITA, kPlatformDOS, { 0x00000086, 0x00002CDB, { { 0xB1, 0xAE, 0x2A, 0x03, 0x28, 0xEC, 0x6D, 0x2F, 0xED, 0x71, 0xBE, 0x60, 0xCF, 0xAB, 0x8C, 0x00 } } } }, // floppy
- { IT_ITA, kPlatformDOS, { 0x000000B5, 0x00004111, { { 0xA3, 0x4D, 0xA0, 0xF5, 0xE5, 0xD7, 0xFE, 0x11, 0xBB, 0x2C, 0xB5, 0xF2, 0xE0, 0x52, 0xF1, 0xF0 } } } }, // (fan) CD
-
- { ES_ESP, kPlatformDOS, { 0x0000009A, 0x0000363B, { { 0x38, 0x25, 0xE6, 0xB5, 0xCB, 0x78, 0x5E, 0xAD, 0x2D, 0xD4, 0x2E, 0x8B, 0x89, 0x20, 0xB1, 0x95 } } } },
-
- { RU_RUS, kPlatformDOS, { 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 } } } },
-
- { EN_ANY, kPlatformFMTowns, { 0x0000009D, 0x00003521, { { 0xAB, 0x74, 0x71, 0x5C, 0x6E, 0x65, 0xF5, 0x5E, 0xB0, 0x6E, 0x0E, 0xC7, 0x56, 0xCB, 0x55, 0x98 } } } },
- { JA_JPN, kPlatformFMTowns, { 0x0000007D, 0x000039CE, { { 0x9E, 0xBE, 0x13, 0x7F, 0x4D, 0x4B, 0xCB, 0x08, 0xC3, 0xE5, 0xF1, 0xC2, 0xD3, 0x69, 0x9E, 0xDF } } } },
-
- { JA_JPN, kPlatformPC98, { 0x00000079, 0x000039CE, { { 0xEF, 0x3F, 0x36, 0xD4, 0x6C, 0x64, 0x74, 0x9A, 0xFE, 0x13, 0xB5, 0x77, 0x9A, 0xCF, 0x15, 0x5C } } } },
-
- EXTRACT_END_ENTRY
-};
-
-const ExtractEntrySearchData k1VeryCleverStringProvider[] = {
- { EN_ANY, kPlatformUnknown, { 0x00000032, 0x0000118D, { { 0x4B, 0x6D, 0xD4, 0xDC, 0x3E, 0xA2, 0x2D, 0x6D, 0x2C, 0x5A, 0xF7, 0x67, 0x4B, 0x6D, 0x40, 0xEF } } } },
-
- { JA_JPN, kPlatformUnknown, { 0x0000002F, 0x00001BDF, { { 0x32, 0x2C, 0x60, 0x1E, 0xB7, 0xE0, 0xFE, 0x5F, 0xEA, 0xEF, 0xA4, 0x73, 0xAC, 0xCB, 0xBA, 0xFE } } } },
-
- { FR_FRA, kPlatformDOS, { 0x00000027, 0x00000DE1, { { 0x43, 0xC2, 0xC7, 0xD2, 0xA3, 0x70, 0x36, 0x38, 0xB5, 0x5B, 0x22, 0xEF, 0xBA, 0x0D, 0x37, 0x27 } } } },
-
- { DE_DEU, kPlatformUnknown, { 0x00000043, 0x00001871, { { 0x33, 0x3F, 0xEA, 0x7F, 0x5F, 0x56, 0x98, 0xF3, 0x03, 0x8D, 0x3E, 0xAC, 0xA1, 0x62, 0x2A, 0xD7 } } } },
-
- { IT_ITA, kPlatformDOS, { 0x00000038, 0x000013CF, { { 0x58, 0x7B, 0x59, 0x50, 0x84, 0xBB, 0x5B, 0x70, 0xDF, 0x76, 0x2F, 0xC3, 0x7E, 0xEC, 0x6A, 0x8B } } } }, // floppy
- { IT_ITA, kPlatformDOS, { 0x00000027, 0x00000D01, { { 0x72, 0x7E, 0x88, 0xFB, 0xDA, 0xC0, 0x9E, 0x31, 0xAC, 0x32, 0xFD, 0x90, 0x7D, 0x01, 0x86, 0xD0 } } } }, // (fan) CD
-
- { ES_ESP, kPlatformDOS, { 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, kPlatformDOS, { 0x00000032, 0x0000118D, { { 0x4B, 0x6D, 0xD4, 0xDC, 0x3E, 0xA2, 0x2D, 0x6D, 0x2C, 0x5A, 0xF7, 0x67, 0x4B, 0x6D, 0x40, 0xEF } } } },
-
- EXTRACT_END_ENTRY
-};
-
-const ExtractEntrySearchData k1NewGameStringProvider[] = {
- { EN_ANY, kPlatformUnknown, { 0x00000015, 0x0000052B, { { 0xAB, 0xD2, 0x16, 0x26, 0xC2, 0x86, 0xFA, 0xC8, 0x42, 0xCD, 0x16, 0xCD, 0x25, 0xB7, 0x44, 0xDC } } } },
-
- { JA_JPN, kPlatformUnknown, { 0x0000001B, 0x00000EC8, { { 0x13, 0x9A, 0xBC, 0x8F, 0xE2, 0x4B, 0xD7, 0x0B, 0xC0, 0x81, 0x60, 0x10, 0xC2, 0xA6, 0x9C, 0xFA } } } },
-
- { FR_FRA, kPlatformDOS, { 0x0000001D, 0x0000079B, { { 0x2B, 0x5B, 0x54, 0x29, 0x76, 0x31, 0x5E, 0x89, 0xC2, 0xD1, 0xDB, 0x3B, 0xF0, 0xBC, 0xCD, 0x66 } } } },
-
- { DE_DEU, kPlatformUnknown, { 0x0000001D, 0x0000076F, { { 0x5C, 0x84, 0x2A, 0xB1, 0x61, 0xDD, 0x7B, 0xB3, 0xD4, 0x6A, 0xD2, 0xEF, 0xA4, 0x5F, 0x81, 0xFE } } } },
-
- { IT_ITA, kPlatformDOS, { 0x0000001C, 0x0000075E, { { 0xC8, 0xCB, 0x35, 0x5E, 0x73, 0x09, 0xDB, 0xA1, 0xF1, 0x8D, 0x14, 0x54, 0x8D, 0xF7, 0xB1, 0xD3 } } } }, // floppy
- { IT_ITA, kPlatformDOS, { 0x0000001D, 0x000007BD, { { 0xF4, 0x5C, 0x50, 0x82, 0x91, 0x7E, 0x09, 0x52, 0x44, 0x95, 0xC2, 0x2E, 0xC9, 0x52, 0x12, 0x2B } } } }, // (fan) CD
-
- { ES_ESP, kPlatformDOS, { 0x0000001B, 0x00000701, { { 0x2B, 0x87, 0xC3, 0x82, 0x68, 0xA5, 0xFC, 0xC5, 0x64, 0x9E, 0xAB, 0xD2, 0x8A, 0x07, 0x9C, 0x1E } } } },
-
- { RU_RUS, kPlatformDOS, { 0x00000015, 0x0000035F, { { 0x7E, 0x49, 0xC1, 0xCB, 0x2D, 0x61, 0xA7, 0x4C, 0x20, 0xAC, 0xEC, 0x54, 0x80, 0x14, 0x6A, 0xCA } } } },
-
- EXTRACT_END_ENTRY
-};
-
-const ExtractEntrySearchData k1DefaultShapesProvider[] = {
- { UNK_LANG, kPlatformUnknown, { 0x0000048A, 0x00012C0A, { { 0x90, 0x9E, 0x21, 0x9F, 0x90, 0x16, 0x1D, 0xA5, 0x57, 0xF8, 0x71, 0xE1, 0x15, 0x44, 0x29, 0x73 } } } },
-
- // TODO: Where did this come from?
- /*{ UNK_LANG, kPlatformUnknown, { 0x000004F3, 0x00014AE4, { { 0x6E, 0x37, 0x81, 0x15, 0x4D, 0xDD, 0xBA, 0xA6, 0xE3, 0x5F, 0xB6, 0xC8, 0x20, 0xE9, 0xE0, 0x63 } } } },*/
-
- EXTRACT_END_ENTRY
-};
-
-const ExtractEntrySearchData k1Healing1ShapesProvider[] = {
- { UNK_LANG, kPlatformUnknown, { 0x0000009A, 0x00002F17, { { 0x92, 0x2C, 0xF1, 0x5C, 0x8B, 0xCE, 0xEB, 0x0B, 0xE4, 0x07, 0x16, 0xAA, 0x25, 0x4F, 0x83, 0xEB } } } },
-
- EXTRACT_END_ENTRY
-};
-
-const ExtractEntrySearchData k1Healing2ShapesProvider[] = {
- { UNK_LANG, kPlatformUnknown, { 0x000000D2, 0x00004257, { { 0xAC, 0x35, 0xAA, 0x72, 0x50, 0x67, 0x58, 0xE4, 0x70, 0xB0, 0xBB, 0xCA, 0xA7, 0x4C, 0x91, 0x82 } } } },
-
- EXTRACT_END_ENTRY
-};
-
-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
-};
-
-const ExtractEntrySearchData k1FluteShapesProvider[] = {
- { UNK_LANG, kPlatformUnknown, { 0x000000FC, 0x00004F0F, { { 0xB1, 0xF0, 0x56, 0x6E, 0xAB, 0x3C, 0x88, 0x13, 0x97, 0x7C, 0xCC, 0x61, 0x85, 0x8A, 0x28, 0x12 } } } },
-
- EXTRACT_END_ENTRY
-};
-
-const ExtractEntrySearchData k1Winter1ShapesProvider[] = {
- { UNK_LANG, kPlatformUnknown, { 0x00000031, 0x00000E70, { { 0x3A, 0x15, 0x36, 0x51, 0x2F, 0xF8, 0xAF, 0xE6, 0x41, 0x71, 0x8D, 0x44, 0x99, 0x48, 0xB3, 0x4F } } } },
-
- EXTRACT_END_ENTRY
-};
-
-const ExtractEntrySearchData k1Winter2ShapesProvider[] = {
- { UNK_LANG, kPlatformUnknown, { 0x000000F5, 0x00005192, { { 0xD3, 0x64, 0xAC, 0x64, 0x42, 0x9F, 0xB9, 0xCA, 0x0C, 0xC8, 0x97, 0x67, 0x8C, 0x92, 0xB4, 0x79 } } } },
-
- { UNK_LANG, kPlatformUnknown, { 0x000000F5, 0x000029E4, { { 0xF0, 0x7B, 0x05, 0xD8, 0xC1, 0x97, 0x27, 0x17, 0xFA, 0x32, 0xE9, 0x1A, 0x46, 0xA5, 0xEB, 0x84 } } } }, // CD + Amiga
-
- EXTRACT_END_ENTRY
-};
-
-const ExtractEntrySearchData k1Winter3ShapesProvider[] = {
- { UNK_LANG, kPlatformUnknown, { 0x0000001C, 0x00000A5E, { { 0x84, 0xDD, 0xC0, 0xEA, 0xE3, 0xBE, 0x98, 0x66, 0xE0, 0xA3, 0x4D, 0x00, 0x88, 0x31, 0x61, 0x1F } } } },
-
- EXTRACT_END_ENTRY
-};
-
-const ExtractEntrySearchData k1DrinkShapesProvider[] = {
- { UNK_LANG, kPlatformUnknown, { 0x00000069, 0x00001EDA, { { 0x21, 0xFA, 0x2F, 0x41, 0x8F, 0x70, 0x3B, 0xBB, 0x93, 0x35, 0x49, 0xEC, 0x1C, 0xEE, 0xDD, 0xAC } } } },
-
- { UNK_LANG, kPlatformFMTowns, { 0x0000006A, 0x00001EDA, { { 0xE2, 0xDA, 0xEC, 0x87, 0x4A, 0x27, 0xD8, 0xC1, 0x57, 0xE7, 0xD8, 0xD7, 0x87, 0x5F, 0x3A, 0xEB } } } },
-
- { UNK_LANG, kPlatformPC98, { 0x0000006A, 0x00001EDA, { { 0xE2, 0xDA, 0xEC, 0x87, 0x4A, 0x27, 0xD8, 0xC1, 0x57, 0xE7, 0xD8, 0xD7, 0x87, 0x5F, 0x3A, 0xEB } } } },
-
- EXTRACT_END_ENTRY
-};
-
-const ExtractEntrySearchData k1WispShapesProvider[] = {
- { UNK_LANG, kPlatformUnknown, { 0x000000B6, 0x00003A53, { { 0x34, 0x52, 0x9D, 0x06, 0x4F, 0x1B, 0xCD, 0xB7, 0x30, 0xF7, 0xB4, 0x9F, 0x0F, 0x34, 0xDD, 0xF7 } } } },
-
- EXTRACT_END_ENTRY
-};
-
-const ExtractEntrySearchData k1MagicAnimShapesProvider[] = {
- { UNK_LANG, kPlatformUnknown, { 0x00000023, 0x00000A2D, { { 0x48, 0x8E, 0x2A, 0x61, 0x93, 0xCD, 0x58, 0x3B, 0x45, 0x62, 0xD9, 0x01, 0x8F, 0xBA, 0x2A, 0x1A } } } },
-
- EXTRACT_END_ENTRY
-};
-
-const ExtractEntrySearchData k1BranStoneShapesProvider[] = {
- { UNK_LANG, kPlatformDOS, { 0x0000006E, 0x00001E41, { { 0x77, 0x99, 0x54, 0xED, 0x4C, 0x31, 0x08, 0x50, 0x41, 0x22, 0x6B, 0xED, 0x34, 0xF4, 0x17, 0xA1 } } } },
-
- { UNK_LANG, kPlatformAmiga, { 0x0000006E, 0x00002026, { { 0x5A, 0xAF, 0x28, 0xF3, 0x0F, 0x82, 0x05, 0xB4, 0x33, 0x83, 0xCE, 0x56, 0xDB, 0xE7, 0x5C, 0xB4 } } } },
-
- { UNK_LANG, kPlatformFMTowns, { 0x00000063, 0x00001E41, { { 0xDA, 0xA1, 0x93, 0x68, 0xBF, 0xB3, 0xBB, 0xD1, 0x2E, 0xF9, 0xB2, 0x25, 0x72, 0xD9, 0xA6, 0x00 } } } },
-
- { UNK_LANG, kPlatformPC98, { 0x00000063, 0x00001E41, { { 0xDA, 0xA1, 0x93, 0x68, 0xBF, 0xB3, 0xBB, 0xD1, 0x2E, 0xF9, 0xB2, 0x25, 0x72, 0xD9, 0xA6, 0x00 } } } },
-
- EXTRACT_END_ENTRY
-};
-
-const ExtractEntrySearchData k1SpecialPalette1Provider[] = {
- { UNK_LANG, kPlatformUnknown, { 0x00000015, 0x0000024B, { { 0x6C, 0x6C, 0xE9, 0xB6, 0xC4, 0xC2, 0x29, 0xA5, 0xB6, 0xB3, 0x82, 0xB6, 0x03, 0x5B, 0x66, 0x7A } } } },
-
- EXTRACT_END_ENTRY
-};
-
-const ExtractEntrySearchData k1SpecialPalette2Provider[] = {
- { UNK_LANG, kPlatformUnknown, { 0x00000033, 0x00000470, { { 0x63, 0x02, 0x97, 0x7D, 0xBE, 0x97, 0x5E, 0x88, 0x2E, 0x50, 0x18, 0x6A, 0x4A, 0x61, 0x09, 0xA6 } } } },
-
- EXTRACT_END_ENTRY
-};
-
-const ExtractEntrySearchData k1SpecialPalette3Provider[] = {
- { UNK_LANG, kPlatformUnknown, { 0x00000033, 0x0000042A, { { 0xF8, 0x32, 0x65, 0x55, 0x1C, 0xC5, 0x6E, 0x71, 0xC6, 0x6A, 0x8E, 0xC5, 0x3C, 0xBC, 0x1F, 0xA8 } } } },
-
- EXTRACT_END_ENTRY
-};
-
-const ExtractEntrySearchData k1SpecialPalette4Provider[] = {
- { UNK_LANG, kPlatformUnknown, { 0x00000033, 0x000003A4, { { 0xA1, 0xA6, 0x6F, 0x53, 0xA2, 0x1E, 0x27, 0x6F, 0x0D, 0xD0, 0x4F, 0xDC, 0x4C, 0xDC, 0xAE, 0x17 } } } },
-
- EXTRACT_END_ENTRY
-};
-
-const ExtractEntrySearchData k1SpecialPalette5Provider[] = {
- { UNK_LANG, kPlatformUnknown, { 0x00000033, 0x0000033D, { { 0x22, 0x02, 0xB3, 0xCD, 0x4E, 0xD5, 0x6E, 0x65, 0x2B, 0x38, 0x7D, 0x3E, 0x27, 0x03, 0x1A, 0x59 } } } },
-
- EXTRACT_END_ENTRY
-};
-
-const ExtractEntrySearchData k1SpecialPalette6Provider[] = {
- { UNK_LANG, kPlatformUnknown, { 0x00000033, 0x000001EA, { { 0xC7, 0xA7, 0x0E, 0xBA, 0x3F, 0x5E, 0xD3, 0x02, 0x99, 0x3B, 0x32, 0x00, 0x39, 0x3C, 0xD2, 0xAC } } } },
-
- EXTRACT_END_ENTRY
-};
-
-const ExtractEntrySearchData k1SpecialPalette7Provider[] = {
- { UNK_LANG, kPlatformUnknown, { 0x00000036, 0x0000040C, { { 0x1A, 0x8E, 0x3E, 0x5F, 0x09, 0xFE, 0x4A, 0xF1, 0x5D, 0x2E, 0x2C, 0xD3, 0xFF, 0x75, 0x7D, 0x1C } } } },
-
- EXTRACT_END_ENTRY
-};
-
-const ExtractEntrySearchData k1SpecialPalette8Provider[] = {
- { UNK_LANG, kPlatformUnknown, { 0x00000036, 0x000008E4, { { 0x55, 0xB4, 0xD3, 0xD1, 0x89, 0x49, 0xA5, 0x7E, 0x40, 0xF9, 0xFE, 0x6E, 0x16, 0xE8, 0xBD, 0xBB } } } },
-
- EXTRACT_END_ENTRY
-};
-
-const ExtractEntrySearchData k1SpecialPalette9Provider[] = {
- { UNK_LANG, kPlatformUnknown, { 0x0000002D, 0x000001DB, { { 0x7A, 0x04, 0x16, 0xDD, 0x6A, 0xBA, 0x51, 0x9E, 0x24, 0x9E, 0xEA, 0x76, 0xD0, 0xFA, 0x92, 0xF4 } } } },
-
- EXTRACT_END_ENTRY
-};
-
-const ExtractEntrySearchData k1SpecialPalette10Provider[] = {
- { UNK_LANG, kPlatformUnknown, { 0x0000002D, 0x0000017A, { { 0xD2, 0x20, 0x1F, 0x12, 0xE1, 0x65, 0x68, 0xA7, 0x9C, 0x69, 0x8E, 0x99, 0xDF, 0xC5, 0xD2, 0x8E } } } },
-
- EXTRACT_END_ENTRY
-};
-
-const ExtractEntrySearchData k1SpecialPalette11Provider[] = {
- { UNK_LANG, kPlatformUnknown, { 0x0000002D, 0x00000136, { { 0xBF, 0x38, 0xB1, 0xFE, 0xBF, 0x25, 0xBC, 0xD3, 0xCC, 0x60, 0x40, 0x97, 0xB6, 0x4A, 0xC7, 0xB2 } } } },
-
- EXTRACT_END_ENTRY
-};
-
-const ExtractEntrySearchData k1SpecialPalette12Provider[] = {
- { UNK_LANG, kPlatformUnknown, { 0x0000002D, 0x00000102, { { 0x1C, 0x1E, 0x6A, 0x30, 0xE1, 0xD1, 0xF9, 0x3D, 0x9A, 0xF1, 0x84, 0xBD, 0x44, 0x07, 0x51, 0xEA } } } },
-
- EXTRACT_END_ENTRY
-};
-
-const ExtractEntrySearchData k1SpecialPalette13Provider[] = {
- { UNK_LANG, kPlatformUnknown, { 0x0000002D, 0x00000000, { { 0x76, 0x22, 0x21, 0x4B, 0x85, 0x36, 0xAF, 0xE7, 0xB8, 0x9B, 0x1C, 0x66, 0x06, 0x06, 0x9B, 0x0D } } } },
-
- EXTRACT_END_ENTRY
-};
-
-const ExtractEntrySearchData k1SpecialPalette14Provider[] = {
- { UNK_LANG, kPlatformUnknown, { 0x0000003C, 0x000003BF, { { 0x78, 0xE8, 0xA8, 0xF2, 0x4D, 0x54, 0x48, 0x47, 0xC9, 0xC1, 0x5B, 0x6C, 0x69, 0xCB, 0x65, 0xB6 } } } },
-
- EXTRACT_END_ENTRY
-};
-
-const ExtractEntrySearchData k1SpecialPalette15Provider[] = {
- { UNK_LANG, kPlatformUnknown, { 0x0000002D, 0x000002DD, { { 0x9F, 0x66, 0x50, 0xAC, 0xED, 0x0C, 0x63, 0x20, 0xE9, 0x4E, 0x4D, 0x3D, 0xC4, 0xBC, 0x94, 0x8A } } } },
-
- EXTRACT_END_ENTRY
-};
-
-const ExtractEntrySearchData k1SpecialPalette16Provider[] = {
- { UNK_LANG, kPlatformUnknown, { 0x00000021, 0x0000036E, { { 0xA9, 0xDB, 0x1C, 0x35, 0xED, 0xED, 0xE4, 0x40, 0x68, 0x29, 0xB1, 0x6E, 0x60, 0xE4, 0xB0, 0xDB } } } },
-
- EXTRACT_END_ENTRY
-};
-
-const ExtractEntrySearchData k1SpecialPalette17Provider[] = {
- { UNK_LANG, kPlatformUnknown, { 0x00000021, 0x000004D7, { { 0xC0, 0xB5, 0x7B, 0x94, 0xED, 0xD7, 0x48, 0x66, 0x37, 0x54, 0xE8, 0xFC, 0x0F, 0xA5, 0x54, 0x8A } } } },
-
- EXTRACT_END_ENTRY
-};
-
-const ExtractEntrySearchData k1SpecialPalette18Provider[] = {
- { UNK_LANG, kPlatformUnknown, { 0x00000015, 0x000002FD, { { 0x0A, 0xDD, 0x81, 0xA8, 0x89, 0xD2, 0x53, 0x05, 0x25, 0xCC, 0x2B, 0x8B, 0x48, 0x1D, 0xAB, 0x0A } } } },
-
- EXTRACT_END_ENTRY
-};
-
-const ExtractEntrySearchData k1SpecialPalette19Provider[] = {
- { UNK_LANG, kPlatformUnknown, { 0x00000015, 0x00000134, { { 0xCB, 0x0F, 0xA9, 0xD2, 0xD8, 0xEA, 0x2A, 0x1F, 0x16, 0x7B, 0x90, 0xE5, 0x72, 0xB3, 0x52, 0x50 } } } },
-
- EXTRACT_END_ENTRY
-};
-
-const ExtractEntrySearchData k1SpecialPalette20Provider[] = {
- { UNK_LANG, kPlatformUnknown, { 0x00000015, 0x00000396, { { 0x3B, 0xD8, 0xA5, 0xC5, 0x66, 0x3E, 0xC7, 0x88, 0xD0, 0x3B, 0x42, 0x29, 0x84, 0x58, 0xA7, 0x00 } } } },
-
- EXTRACT_END_ENTRY
-};
-
-const ExtractEntrySearchData k1SpecialPalette21Provider[] = {
- { UNK_LANG, kPlatformUnknown, { 0x00000015, 0x00000134, { { 0x96, 0x70, 0x7D, 0x5B, 0xC4, 0xBA, 0x89, 0x89, 0xC9, 0x42, 0xF4, 0x70, 0x33, 0xF5, 0xE8, 0x02 } } } },
-
- EXTRACT_END_ENTRY
-};
-
-const ExtractEntrySearchData k1SpecialPalette22Provider[] = {
- { UNK_LANG, kPlatformUnknown, { 0x00000015, 0x00000376, { { 0xA2, 0x92, 0x28, 0x65, 0xAB, 0xCC, 0x16, 0xE8, 0xA5, 0x72, 0x2F, 0x00, 0x66, 0x8F, 0x8D, 0x96 } } } },
-
- EXTRACT_END_ENTRY
-};
-
-const ExtractEntrySearchData k1SpecialPalette23Provider[] = {
- { UNK_LANG, kPlatformUnknown, { 0x00000015, 0x000002C2, { { 0x5C, 0x78, 0x74, 0x81, 0x76, 0xB5, 0x26, 0x8E, 0x20, 0xAE, 0x50, 0xCD, 0x2B, 0x9E, 0x81, 0x8B } } } },
-
- EXTRACT_END_ENTRY
-};
-
-const ExtractEntrySearchData k1SpecialPalette24Provider[] = {
- { UNK_LANG, kPlatformUnknown, { 0x00000030, 0x00000472, { { 0xC6, 0xF0, 0xA6, 0x33, 0x7E, 0xAE, 0xBC, 0xF9, 0xAE, 0xE2, 0xF4, 0x7B, 0x71, 0x44, 0x50, 0xEF } } } },
-
- EXTRACT_END_ENTRY
-};
-
-const ExtractEntrySearchData k1SpecialPalette25Provider[] = {
- { UNK_LANG, kPlatformUnknown, { 0x00000030, 0x000004CD, { { 0x57, 0x03, 0xB5, 0x27, 0x64, 0x48, 0xBF, 0x6A, 0x0F, 0xC2, 0xC0, 0x4A, 0x73, 0x9A, 0xFE, 0xB3 } } } },
-
- EXTRACT_END_ENTRY
-};
-
-const ExtractEntrySearchData k1SpecialPalette26Provider[] = {
- { UNK_LANG, kPlatformUnknown, { 0x00000030, 0x000004CA, { { 0xF8, 0x39, 0x8D, 0x6F, 0x8D, 0x9C, 0x6E, 0x0A, 0x33, 0xE8, 0xF2, 0xA6, 0xF6, 0x40, 0x70, 0xE5 } } } },
-
- EXTRACT_END_ENTRY
-};
-
-const ExtractEntrySearchData k1SpecialPalette27Provider[] = {
- { UNK_LANG, kPlatformUnknown, { 0x00000030, 0x000004D9, { { 0xF6, 0xD4, 0x88, 0x57, 0x6F, 0x1A, 0xA3, 0x1F, 0x6B, 0x17, 0x4D, 0xA0, 0x9E, 0xD8, 0x09, 0x66 } } } },
-
- EXTRACT_END_ENTRY
-};
-
-const ExtractEntrySearchData k1SpecialPalette28Provider[] = {
- { UNK_LANG, kPlatformUnknown, { 0x00000030, 0x0000051D, { { 0x59, 0x02, 0xE3, 0xC6, 0x28, 0xF6, 0xBC, 0xD4, 0xC8, 0x7E, 0x58, 0x6F, 0xE4, 0xA2, 0x28, 0x4F } } } },
-
- EXTRACT_END_ENTRY
-};
-
-const ExtractEntrySearchData k1SpecialPalette29Provider[] = {
- { UNK_LANG, kPlatformUnknown, { 0x00000030, 0x00000534, { { 0xC2, 0x26, 0x94, 0x47, 0x28, 0x11, 0xAA, 0xE6, 0x10, 0xA2, 0xD4, 0xD9, 0x61, 0x57, 0x62, 0x22 } } } },
-
- EXTRACT_END_ENTRY
-};
-
-const ExtractEntrySearchData k1SpecialPalette30Provider[] = {
- { UNK_LANG, kPlatformUnknown, { 0x0000003C, 0x00000453, { { 0xE1, 0x30, 0xC2, 0xCD, 0x79, 0xD8, 0x36, 0x8D, 0xAC, 0xF7, 0x87, 0x05, 0x49, 0xD7, 0x7A, 0x5F } } } },
-
- EXTRACT_END_ENTRY
-};
-
-const ExtractEntrySearchData k1SpecialPalette31Provider[] = {
- { UNK_LANG, kPlatformUnknown, { 0x00000027, 0x000002FB, { { 0xA6, 0x65, 0xE1, 0xE1, 0xCC, 0x71, 0x83, 0x63, 0x9A, 0x04, 0xE2, 0x00, 0xBF, 0x90, 0xDF, 0x95 } } } },
-
- EXTRACT_END_ENTRY
-};
-
-const ExtractEntrySearchData k1SpecialPalette32Provider[] = {
- { UNK_LANG, kPlatformUnknown, { 0x00000027, 0x0000016C, { { 0xAA, 0x88, 0x97, 0xE3, 0xCA, 0x06, 0x11, 0x07, 0x8F, 0xFA, 0x75, 0x26, 0xA8, 0x7A, 0x49, 0x28 } } } },
-
- EXTRACT_END_ENTRY
-};
-
-const ExtractEntrySearchData k1SpecialPalette33Provider[] = {
- { UNK_LANG, kPlatformUnknown, { 0x0000003C, 0x0000094C, { { 0x2E, 0x5E, 0x34, 0x3E, 0x99, 0x61, 0x6F, 0x88, 0x91, 0xA7, 0x75, 0xAA, 0x42, 0x4B, 0x1F, 0x5D } } } },
-
- EXTRACT_END_ENTRY
-};
-
-const ExtractEntrySearchData k1GUIStringsProvider[] = {
- { EN_ANY, kPlatformDOS, { 0x000001B0, 0x00009562, { { 0x78, 0xB0, 0x81, 0x15, 0x96, 0x09, 0x1E, 0x6C, 0x20, 0x7B, 0xF7, 0xB1, 0x29, 0x2A, 0x3D, 0xE4 } } } }, // floppy
- { EN_ANY, kPlatformDOS, { 0x00000209, 0x00009788, { { 0xDD, 0xA0, 0x5C, 0x30, 0x60, 0x68, 0xDC, 0x24, 0xBE, 0x3F, 0xA2, 0x31, 0xE0, 0x81, 0x6C, 0xCA } } } }, // CD
-
- { FR_FRA, kPlatformDOS, { 0x00000234, 0x0000C262, { { 0x08, 0x83, 0x32, 0x4E, 0x48, 0xEC, 0x83, 0x4B, 0x1B, 0x82, 0x58, 0x48, 0xA3, 0x30, 0x05, 0x33 } } } }, // floppy
- { FR_FRA, kPlatformDOS, { 0x0000025D, 0x0000CBDC, { { 0x36, 0xF0, 0x92, 0x9C, 0x5F, 0xFF, 0x5D, 0x65, 0x5F, 0x0B, 0xC0, 0x72, 0x9F, 0x30, 0x47, 0xAB } } } }, // CD
-
- { DE_DEU, kPlatformDOS, { 0x00000236, 0x0000BA9C, { { 0xEB, 0xA6, 0x90, 0x9D, 0x99, 0x4B, 0x4F, 0xD9, 0xCE, 0xFF, 0x44, 0x3F, 0x77, 0x6F, 0xE1, 0x71 } } } }, // floppy
- { DE_DEU, kPlatformDOS, { 0x00000261, 0x0000C538, { { 0xF3, 0xED, 0x5E, 0x73, 0x6F, 0x6E, 0x06, 0xF8, 0x48, 0xF8, 0x30, 0x69, 0x34, 0x5D, 0x99, 0x0C } } } }, // CD
-
- { IT_ITA, kPlatformDOS, { 0x00000225, 0x0000B0E1, { { 0x57, 0xE2, 0x39, 0xA8, 0xF5, 0x70, 0x48, 0xB4, 0x3D, 0xD4, 0x2A, 0x8C, 0x7C, 0x76, 0xB7, 0x8D } } } }, // floppy
- { IT_ITA, kPlatformDOS, { 0x0000025D, 0x0000AFD0, { { 0x8E, 0x97, 0xA9, 0x55, 0x16, 0xF7, 0x42, 0x83, 0xA3, 0x68, 0x2F, 0xD6, 0x37, 0x1C, 0x9A, 0xD1 } } } }, // (fan) CD
-
- { ES_ESP, kPlatformDOS, { 0x0000023A, 0x0000C3BD, { { 0xED, 0x0D, 0xE7, 0x5B, 0xDC, 0x21, 0x41, 0x54, 0x68, 0x7D, 0x8E, 0x97, 0x1A, 0xB1, 0xA1, 0x4A } } } }, // floppy
-
- { RU_RUS, kPlatformDOS, { 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 } } } },
-
- { EN_ANY, kPlatformFMTowns, { 0x000001FC, 0x00009D9A, { { 0xE8, 0x39, 0x46, 0x0A, 0x41, 0xC3, 0xDC, 0x33, 0x6E, 0xC5, 0x5D, 0x99, 0xCC, 0xF6, 0xDD, 0xCC } } } },
- { JA_JPN, kPlatformFMTowns, { 0x0000025F, 0x0000E56A, { { 0x77, 0x9A, 0x02, 0x52, 0xED, 0x62, 0x23, 0x5A, 0x58, 0x78, 0x19, 0x52, 0x03, 0xD7, 0x88, 0x40 } } } },
-
- { JA_JPN, kPlatformPC98, { 0x00000213, 0x0000EC5A, { { 0x3B, 0xBA, 0xFB, 0x61, 0x34, 0x60, 0x25, 0xDA, 0x48, 0xBF, 0x95, 0x7F, 0x7F, 0xB6, 0xE4, 0x55 } } } },
-
- EXTRACT_END_ENTRY
-};
-
-const ExtractEntrySearchData k1ConfigStringsProvider[] = {
- { EN_ANY, kPlatformDOS, { 0x0000003F, 0x000016E9, { { 0x4F, 0x19, 0x60, 0x67, 0xA8, 0x31, 0x0B, 0xD5, 0x3D, 0x06, 0x39, 0xF1, 0x42, 0xB0, 0xFD, 0x5C } } } }, // floppy
- { EN_ANY, kPlatformDOS, { 0x00000061, 0x00002249, { { 0x5D, 0xE2, 0x05, 0xA7, 0xEC, 0x0A, 0x73, 0xF5, 0x01, 0x5B, 0x64, 0x71, 0x83, 0xEC, 0x56, 0x24 } } } }, // CD
-
- { FR_FRA, kPlatformDOS, { 0x0000004B, 0x00001AE8, { { 0xE3, 0xC9, 0x0F, 0x54, 0x48, 0x31, 0x6E, 0x5F, 0x51, 0x8E, 0xF8, 0xE6, 0xAC, 0x16, 0xAC, 0x1C } } } }, // floppy
- { FR_FRA, kPlatformDOS, { 0x0000007A, 0x00002C37, { { 0x9E, 0xD8, 0x85, 0xB4, 0x9D, 0x32, 0x9D, 0x80, 0x58, 0xE4, 0x08, 0xC7, 0x75, 0xD2, 0x9C, 0x1E } } } }, // CD
-
- { DE_DEU, kPlatformDOS, { 0x0000005E, 0x00002280, { { 0xC7, 0xD2, 0x22, 0xB5, 0xD3, 0xBC, 0x7A, 0x97, 0x26, 0x04, 0x07, 0x78, 0xAA, 0xAB, 0x1D, 0x5C } } } }, // floppy
- { DE_DEU, kPlatformDOS, { 0x00000082, 0x00002E94, { { 0xC5, 0xDC, 0x44, 0x6C, 0x4B, 0x3E, 0x4E, 0x27, 0x0C, 0xCC, 0x65, 0x6C, 0x20, 0x8D, 0x71, 0x07 } } } }, // CD
-
- { IT_ITA, kPlatformDOS, { 0x00000054, 0x00001E98, { { 0x10, 0x6B, 0x6B, 0x9B, 0x91, 0x05, 0xE9, 0x30, 0xE2, 0x75, 0xE2, 0x45, 0x79, 0x17, 0x73, 0xC9 } } } }, // floppy
- { IT_ITA, kPlatformDOS, { 0x0000007A, 0x00002904, { { 0xD3, 0xD2, 0x96, 0x6E, 0xE7, 0xE8, 0x64, 0x77, 0x73, 0xCD, 0xC2, 0x9E, 0x57, 0xB5, 0xD3, 0xCD } } } }, // (fan) CD
-
- { ES_ESP, kPlatformDOS, { 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, kPlatformDOS, { 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 } } } },
-
- { EN_ANY, kPlatformFMTowns, { 0x0000004A, 0x000016E9, { { 0x37, 0x12, 0xAD, 0x4C, 0xB8, 0x2C, 0xF5, 0x75, 0x20, 0x74, 0xA0, 0xFD, 0x58, 0xB1, 0x71, 0x77 } } } },
- { JA_JPN, kPlatformFMTowns, { 0x00000057, 0x00002262, { { 0xC5, 0x9A, 0x4A, 0xE3, 0xDF, 0xD3, 0x0E, 0x8E, 0xBB, 0xAF, 0x75, 0xD3, 0x67, 0xB1, 0xF6, 0x08 } } } },
-
- { JA_JPN, kPlatformPC98, { 0x0000003F, 0x00001E9D, { { 0x8A, 0x3C, 0x78, 0x6B, 0x3F, 0x0A, 0x7D, 0x92, 0x16, 0x39, 0xEB, 0x1C, 0x84, 0x9E, 0x4F, 0x84 } } } },
-
- EXTRACT_END_ENTRY
-};
-
-const ExtractEntrySearchData k1TownsMusicFadeTableProvider[] = {
- { UNK_LANG, kPlatformFMTowns, { 0x00000B10, 0x000076DE, { { 0x9F, 0x08, 0x5B, 0xD6, 0x25, 0x7F, 0x11, 0x08, 0x87, 0x45, 0x92, 0xD3, 0xE5, 0xA8, 0x7C, 0x2F } } } },
-
- EXTRACT_END_ENTRY
-};
-
-const ExtractEntrySearchData k1TownsSFXwdTableProvider[] = {
- { UNK_LANG, kPlatformFMTowns, { 0x00012608, 0x006717A1, { { 0x34, 0xDD, 0x2D, 0xA5, 0x14, 0x05, 0xEE, 0x2F, 0x93, 0x7C, 0x78, 0x4D, 0xCA, 0x13, 0xED, 0x93 } } } },
-
- EXTRACT_END_ENTRY
-};
-
-const ExtractEntrySearchData k1TownsSFXbtTableProvider[] = {
- { UNK_LANG, kPlatformFMTowns, { 0x00000100, 0x00007FFE, { { 0xEF, 0x3D, 0x9F, 0x31, 0xE7, 0x19, 0x1E, 0x4F, 0xF3, 0x66, 0x42, 0xC8, 0x0D, 0x89, 0x96, 0x20 } } } },
-
- EXTRACT_END_ENTRY
-};
-
-const ExtractEntrySearchData k1TownsCDATableProvider[] = {
- { UNK_LANG, kPlatformFMTowns, { 0x000002C4, 0x0000C5ED, { { 0x76, 0x86, 0x77, 0xF9, 0x85, 0x23, 0x32, 0x56, 0x3C, 0x06, 0x03, 0xCF, 0x0C, 0x49, 0x94, 0xB5 } } } },
-
- EXTRACT_END_ENTRY
-};
-
-const ExtractEntrySearchData k1PC98StoryStringsProvider[] = {
- { JA_JPN, kPlatformPC98, { 0x00000054, 0x00002FAD, { { 0xCB, 0x25, 0xD1, 0xFA, 0x65, 0xCE, 0xD5, 0xE6, 0xAD, 0xE3, 0x48, 0x25, 0xC8, 0x51, 0xC6, 0x12 } } } },
-
- EXTRACT_END_ENTRY
-};
-
-const ExtractEntrySearchData k1PC98IntroSfxProvider[] = {
- { UNK_LANG, kPlatformPC98, { 0x00000300, 0x00017445, { { 0xC3, 0x54, 0x4A, 0x58, 0x00, 0x33, 0xEA, 0xF1, 0x20, 0xA8, 0x0C, 0xDE, 0x7A, 0x94, 0xAB, 0x5E } } } },
-
- EXTRACT_END_ENTRY
-};
-
-const ExtractEntrySearchData k1CreditsStringsProvider[] = {
- { EN_ANY, kPlatformAmiga, { 0x000004CC, 0x000182F7, { { 0x7D, 0x14, 0xA6, 0xEC, 0x12, 0x67, 0xAC, 0xA7, 0x7B, 0xF8, 0x44, 0x19, 0x52, 0xCC, 0x3A, 0x65 } } } },
- { DE_DEU, kPlatformAmiga, { 0x000004FB, 0x00019987, { { 0x8B, 0xF1, 0x61, 0xB9, 0x3E, 0xA4, 0x28, 0x9B, 0x45, 0x86, 0xD1, 0xF0, 0xC3, 0x35, 0x44, 0xA0 } } } },
-
- { EN_ANY, kPlatformFMTowns, { 0x0000058C, 0x0001AD16, { { 0xFC, 0x1B, 0xE6, 0xEB, 0x03, 0x1C, 0x54, 0x93, 0x64, 0x53, 0xB1, 0x17, 0x9D, 0x95, 0x1B, 0x4A } } } },
- { JA_JPN, kPlatformFMTowns, { 0x0000058C, 0x0001AD16, { { 0xFC, 0x1B, 0xE6, 0xEB, 0x03, 0x1C, 0x54, 0x93, 0x64, 0x53, 0xB1, 0x17, 0x9D, 0x95, 0x1B, 0x4A } } } },
-
- { JA_JPN, kPlatformPC98, { 0x00000530, 0x00019571, { { 0x38, 0x4F, 0xE0, 0x74, 0x27, 0x21, 0xEC, 0x63, 0x41, 0x32, 0xB1, 0xD9, 0xA5, 0x65, 0x62, 0x71 } } } },
-
- EXTRACT_END_ENTRY
-};
-
-const ExtractEntrySearchData k1AmigaIntroSFXTableProvider[] = {
- { UNK_LANG, kPlatformAmiga, { 0x00000140, 0x00000D82, { { 0x61, 0xF6, 0x8F, 0xE5, 0xCD, 0x15, 0x58, 0x9F, 0xDF, 0x0E, 0x22, 0xAA, 0x9A, 0xCF, 0xC4, 0xA6 } } } },
-
- EXTRACT_END_ENTRY
-};
-
-const ExtractEntrySearchData k1AmigaGameSFXTableProvider[] = {
- { UNK_LANG, kPlatformAmiga, { 0x000003C0, 0x00005505, { { 0x8D, 0x6D, 0x2C, 0x58, 0x50, 0xF7, 0xBF, 0x60, 0xC3, 0x15, 0x20, 0x23, 0x1F, 0x90, 0x3E, 0xD6 } } } },
-
- EXTRACT_END_ENTRY
-};
-
-const ExtractEntrySearchData k2SeqplayPakFilesProvider[] = {
- { UNK_LANG, kPlatformUnknown, { 0x00000022, 0x000008E0, { { 0xB7, 0x3B, 0x51, 0x46, 0x78, 0x2D, 0x4D, 0x82, 0xD4, 0x30, 0xFC, 0x6E, 0xC4, 0x5B, 0x27, 0x3E } } } }, // DOS floppy + PC98
-
- { UNK_LANG, kPlatformDOS, { 0x00000046, 0x0000121A, { { 0x42, 0xC2, 0x5A, 0xDC, 0x27, 0x2D, 0xB4, 0x44, 0x85, 0x58, 0x0F, 0xB6, 0x6D, 0x76, 0x04, 0x4F } } } }, // CD
- { UNK_LANG, kPlatformDOS, { 0x00000014, 0x000004FA, { { 0xBB, 0x4C, 0x16, 0xEB, 0x56, 0xEF, 0xAC, 0x68, 0x6B, 0x49, 0x96, 0x3A, 0x9F, 0x00, 0x75, 0xF6 } } } }, // demo
- { UNK_LANG, kPlatformDOS, { 0x0000000C, 0x00000308, { { 0xC0, 0xAC, 0x10, 0xF1, 0x12, 0xD1, 0x21, 0x92, 0xA1, 0x62, 0x5B, 0x6E, 0xCF, 0x88, 0x32, 0x7C } } } }, // Lands of Lore demo
-
- { UNK_LANG, kPlatformFMTowns, { 0x00000033, 0x00000BBD, { { 0x92, 0x5B, 0xDA, 0xE3, 0x7C, 0x39, 0xC4, 0x75, 0x24, 0xBA, 0x67, 0x27, 0x6E, 0x21, 0xA3, 0xF7 } } } },
-
- // TODO: Where did this come from?
- //{ UNK_LANG, kPlatformUnknown, { 0x0000002E, 0x00000C09, { { 0x6A, 0x25, 0xF6, 0x03, 0xA6, 0x88, 0xA0, 0x53, 0xE1, 0xF4, 0xB9, 0x0C, 0x71, 0x17, 0x36, 0x6B } } } },
-
- EXTRACT_END_ENTRY
-};
-
-const ExtractEntrySearchData k2SeqplayStringsProvider[] = {
- { EN_ANY, kPlatformDOS, { 0x000008C8, 0x0002FDE3, { { 0x62, 0xD1, 0x6F, 0xBC, 0xEC, 0xE6, 0xCF, 0xE8, 0xD8, 0xE9, 0xDE, 0xFB, 0x09, 0xAF, 0x34, 0x92 } } } }, // floppy
- { EN_ANY, kPlatformDOS, { 0x00000916, 0x00031417, { { 0x3E, 0x15, 0xDA, 0xF4, 0x77, 0x44, 0x80, 0x47, 0xDB, 0x32, 0x0E, 0x6D, 0xCA, 0x32, 0x65, 0x1B } } } }, // CD
- { EN_ANY, kPlatformDOS, { 0x00000102, 0x00005BD6, { { 0xB3, 0x00, 0xE5, 0x39, 0x02, 0x3D, 0xBF, 0xDD, 0x54, 0x70, 0xEA, 0xC1, 0xCB, 0xAC, 0xAA, 0xF7 } } } }, // Lands of Lore demo
-
- { DE_DEU, kPlatformDOS, { 0x000009EC, 0x000370F9, { { 0x56, 0x94, 0xCC, 0xE5, 0x38, 0x19, 0xAD, 0xD1, 0xBB, 0x6A, 0x6E, 0xEC, 0xC5, 0x1B, 0x57, 0x7B } } } }, // floppy
- { DE_DEU, kPlatformDOS, { 0x00000A3F, 0x000389F4, { { 0x51, 0xC1, 0x87, 0x16, 0x53, 0x8C, 0x68, 0x8E, 0x9B, 0x81, 0xA1, 0xD2, 0xCE, 0x5F, 0x83, 0x31 } } } }, // CD
-
- { FR_FRA, kPlatformDOS, { 0x000009C9, 0x00036324, { { 0x2C, 0xC2, 0xD9, 0xCF, 0x90, 0x2A, 0xDF, 0xE9, 0x85, 0x9E, 0x5D, 0xBB, 0x1D, 0x9A, 0x14, 0x69 } } } }, // floppy
- { FR_FRA, kPlatformDOS, { 0x00000995, 0x000352D7, { { 0xED, 0x7C, 0x49, 0x7B, 0x1A, 0x2C, 0x73, 0x61, 0x73, 0xAF, 0x16, 0x89, 0x1E, 0x01, 0xE2, 0xAE } } } }, // CD
-
- { IT_ITA, kPlatformDOS, { 0x00000916, 0x0003188F, { { 0xDC, 0x46, 0x06, 0xE1, 0xB0, 0x66, 0xBC, 0x18, 0x2E, 0x6E, 0x9E, 0xC9, 0xA4, 0x14, 0x8D, 0x08 } } } }, // floppy
- { IT_ITA, kPlatformDOS, { 0x000008C8, 0x00030947, { { 0x7F, 0x75, 0x5F, 0x99, 0x94, 0xFE, 0xA1, 0xE6, 0xEF, 0xB8, 0x93, 0x71, 0x83, 0x1B, 0xAC, 0x4A } } } }, // (fan) CD
-
- { RU_RUS, kPlatformDOS, { 0x00000916, 0x00032C49, { { 0xEA, 0x5C, 0xE5, 0x06, 0x05, 0x5F, 0x36, 0xE8, 0x31, 0x3E, 0xBF, 0x74, 0x73, 0xFB, 0xAB, 0xFF } } } }, // (fan) CD - intro and outro strings haven't been translated in this fan translation
- { RU_RUS, kPlatformDOS, { 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 } } } },
-
- { EN_ANY, kPlatformPC98, { 0x000008F4, 0x00030C61, { { 0xA4, 0x4C, 0xD9, 0x05, 0x65, 0x24, 0xE5, 0x3E, 0x6C, 0x8B, 0xEE, 0x8D, 0x4F, 0x09, 0x6F, 0x00 } } } },
- { JA_JPN, kPlatformPC98, { 0x000007F5, 0x00036831, { { 0xF7, 0xCF, 0xF1, 0x2B, 0x26, 0x1E, 0xEC, 0xC8, 0x13, 0xDE, 0xC7, 0x71, 0x72, 0x05, 0x0F, 0xA7 } } } },
-
- EXTRACT_END_ENTRY
-};
-
-const ExtractEntrySearchData k2SeqplaySfxFilesProvider[] = {
- { UNK_LANG, kPlatformDOS, { 0x00000173, 0x00008198, { { 0x2D, 0xF5, 0x5C, 0xAE, 0xDB, 0x71, 0x60, 0xFE, 0x78, 0x04, 0xFC, 0xAD, 0x4B, 0x43, 0xB1, 0x4B } } } }, // floppy
- { UNK_LANG, kPlatformDOS, { 0x00000234, 0x0000B0B2, { { 0xE4, 0x19, 0x4F, 0x8C, 0x53, 0xFD, 0x5F, 0x2A, 0xFB, 0x77, 0x1C, 0x32, 0xB3, 0x39, 0x25, 0x85 } } } }, // CD
- { UNK_LANG, kPlatformDOS, { 0x000000DE, 0x00004EA4, { { 0x97, 0xA8, 0x4A, 0xED, 0x12, 0x87, 0xEB, 0x82, 0x42, 0xFA, 0x45, 0x0D, 0x45, 0x8F, 0xFE, 0x76 } } } }, // demo
- { UNK_LANG, kPlatformDOS, { 0x000000C5, 0x00004508, { { 0xBF, 0xA9, 0x1A, 0x37, 0x0B, 0xF8, 0x13, 0x9D, 0x2D, 0x67, 0x3D, 0x9B, 0xE9, 0x16, 0x07, 0x0C } } } }, // Lands of Lore demo
-
- { UNK_LANG, kPlatformFMTowns, { 0x000001A3, 0x00008098, { { 0xA9, 0xD2, 0xE2, 0x32, 0x59, 0xC4, 0x97, 0x74, 0x11, 0x49, 0x8F, 0x2B, 0xBF, 0x00, 0xF9, 0xF1 } } } },
-
- { UNK_LANG, kPlatformPC98, { 0x00000173, 0x00008098, { { 0x29, 0xA6, 0xF1, 0x2D, 0x35, 0x38, 0xFD, 0x3B, 0xF0, 0xB1, 0xE1, 0xFE, 0x45, 0xB1, 0x43, 0xAE } } } },
-
- EXTRACT_END_ENTRY
-};
-
-const ExtractEntrySearchData k2SeqplayTlkFilesProvider[] = {
- { EN_ANY, kPlatformDOS, { 0x0000009D, 0x0000286B, { { 0x58, 0x30, 0x72, 0x62, 0xC8, 0x77, 0x2A, 0x06, 0xD6, 0x24, 0x1A, 0x7A, 0xAF, 0x79, 0xFF, 0xAE } } } },
- { FR_FRA, kPlatformDOS, { 0x0000009D, 0x00002878, { { 0x28, 0x5D, 0x7F, 0x5B, 0x57, 0xC2, 0xFF, 0x73, 0xC1, 0x8E, 0xD6, 0xE0, 0x4D, 0x03, 0x99, 0x2C } } } },
- { DE_DEU, kPlatformDOS, { 0x0000009D, 0x00002885, { { 0x87, 0x24, 0xB6, 0xE9, 0xD6, 0xAA, 0x68, 0x2D, 0x6B, 0x05, 0xDF, 0xE1, 0x2B, 0xA4, 0x79, 0xE5 } } } },
- { IT_ITA, kPlatformDOS, { 0x0000009D, 0x0000286B, { { 0x58, 0x30, 0x72, 0x62, 0xC8, 0x77, 0x2A, 0x06, 0xD6, 0x24, 0x1A, 0x7A, 0xAF, 0x79, 0xFF, 0xAE } } } },
- { RU_RUS, kPlatformDOS, { 0x0000009D, 0x0000286B, { { 0x58, 0x30, 0x72, 0x62, 0xC8, 0x77, 0x2A, 0x06, 0xD6, 0x24, 0x1A, 0x7A, 0xAF, 0x79, 0xFF, 0xAE } } } },
-
- EXTRACT_END_ENTRY
-};
-
-const ExtractEntrySearchData k2SeqplaySeqDataProvider[] = {
- { UNK_LANG, kPlatformDOS, { 0x000006F4, 0x0000F5AD, { { 0x23, 0x1E, 0x30, 0xF0, 0xF1, 0x5B, 0xFF, 0x4B, 0xDF, 0xB1, 0x78, 0xD8, 0x48, 0x7A, 0xA3, 0xDD } } } }, // floppy
- { UNK_LANG, kPlatformDOS, { 0x000006F4, 0x0000FA52, { { 0xC8, 0x33, 0xCC, 0x0A, 0x40, 0x8A, 0x96, 0x4F, 0x42, 0x7E, 0x8B, 0x62, 0x9C, 0x2F, 0x33, 0x0B } } } }, // floppy (French)
- { UNK_LANG, kPlatformDOS, { 0x000006F4, 0x0000F8A6, { { 0x8B, 0xF3, 0x80, 0xE1, 0xB8, 0xCA, 0xE1, 0x18, 0x72, 0xA3, 0xF0, 0x4C, 0xBF, 0x81, 0x97, 0x71 } } } }, // floppy (German)
- { UNK_LANG, kPlatformDOS, { 0x000006F4, 0x0000FA35, { { 0x4C, 0x26, 0x1B, 0xF6, 0x8E, 0x73, 0xB7, 0xD2, 0x58, 0x59, 0xB8, 0x97, 0x58, 0xFB, 0x0E, 0x2A } } } }, // floppy (Italian)
- { UNK_LANG, kPlatformDOS, { 0x000006BE, 0x0000E9FF, { { 0x9A, 0xCD, 0x40, 0x44, 0xEF, 0x9F, 0x05, 0x86, 0xDA, 0x49, 0x8A, 0x85, 0x68, 0xDF, 0xA7, 0x55 } } } }, // CD
- { UNK_LANG, kPlatformDOS, { 0x0000027C, 0x00007742, { { 0x42, 0x37, 0xF8, 0xDD, 0xA2, 0x8C, 0xA6, 0x26, 0x89, 0x5F, 0xCF, 0x61, 0xDD, 0x8F, 0xC7, 0x1E } } } }, // demo
- { UNK_LANG, kPlatformDOS, { 0x0000024C, 0x00004C10, { { 0x21, 0x3A, 0x86, 0x60, 0xA8, 0xFF, 0x42, 0x19, 0x35, 0x32, 0xA5, 0xB9, 0x3A, 0xDD, 0xA9, 0xC7 } } } }, // Lands of Lore demo
-
- { UNK_LANG, kPlatformFMTowns, { 0x000006BC, 0x0000DCE3, { { 0x27, 0x09, 0x22, 0xDC, 0xED, 0xDE, 0x88, 0xAE, 0xDB, 0x97, 0x52, 0x12, 0x96, 0x8D, 0x8D, 0x37 } } } },
-
- { UNK_LANG, kPlatformPC98, { 0x000006BE, 0x0000E043, { { 0x35, 0xA0, 0xF1, 0x14, 0xC7, 0x60, 0x80, 0x35, 0xA2, 0xDB, 0xF2, 0x73, 0x96, 0xC0, 0xAE, 0x84 } } } },
-
- EXTRACT_END_ENTRY
-};
-
-const ExtractEntrySearchData k2SeqplayCreditsProvider[] = {
- { UNK_LANG, kPlatformUnknown, { 0x00000AE8, 0x0002E520, { { 0x19, 0x59, 0xEA, 0x70, 0x23, 0xE2, 0x41, 0x78, 0x2D, 0xF5, 0xE6, 0x28, 0xEA, 0x0C, 0xCF, 0x79 } } } },
- { IT_ITA, kPlatformDOS, { 0x00000AE8, 0x0002EE4A, { { 0x3E, 0x5C, 0x6F, 0x9E, 0x72, 0x2D, 0xAB, 0x17, 0x1D, 0x27, 0xFF, 0x32, 0xD3, 0x48, 0x46, 0xBA } } } }, // (fan) CD
-
- EXTRACT_END_ENTRY
-};
-
-const ExtractEntrySearchData k2SeqplayCreditsSpecialProvider[] = {
- { UNK_LANG, kPlatformUnknown, { 0x0000001A, 0x00000829, { { 0xDF, 0x31, 0x0F, 0xB9, 0xC9, 0xC4, 0xF2, 0xB5, 0xF7, 0x98, 0x6F, 0x44, 0x4E, 0x9C, 0xFE, 0xA7 } } } },
-
- EXTRACT_END_ENTRY
-};
-
-const ExtractEntrySearchData k2SeqplayIntroTracksProvider[] = {
- { UNK_LANG, kPlatformDOS, { 0x00000010, 0x00000592, { { 0xDE, 0xD9, 0x5E, 0xCA, 0x5A, 0x9F, 0x8B, 0xB1, 0xE2, 0xDB, 0xA4, 0xA1, 0xAF, 0xD4, 0x75, 0x46 } } } }, // floppy
- { UNK_LANG, kPlatformDOS, { 0x00000008, 0x000002C9, { { 0xFA, 0x80, 0x3C, 0x78, 0x66, 0x2C, 0xD5, 0x91, 0x5D, 0xF1, 0xE9, 0xC1, 0x6A, 0x65, 0xEB, 0xD6 } } } }, // CD
- { UNK_LANG, kPlatformDOS, { 0x00000010, 0x00000542, { { 0xE5, 0xAA, 0x6A, 0xB9, 0x19, 0xAB, 0x35, 0x26, 0x43, 0x70, 0x32, 0xEF, 0xB9, 0x7F, 0x0F, 0x19 } } } }, // demo
- { UNK_LANG, kPlatformDOS, { 0x0000001A, 0x0000096C, { { 0xC2, 0xBD, 0x2C, 0x65, 0xD3, 0xFE, 0xF1, 0x6A, 0xE7, 0x34, 0x18, 0x0C, 0x86, 0x95, 0x66, 0x35 } } } }, // Lands of Lore demo
-
- EXTRACT_END_ENTRY
-};
-
-const ExtractEntrySearchData k2SeqplayFinaleTracksProvider[] = {
- { UNK_LANG, kPlatformDOS, { 0x00000012, 0x00000618, { { 0x22, 0x61, 0x4D, 0x6F, 0xCE, 0x38, 0x64, 0xAB, 0x20, 0xD8, 0x34, 0x33, 0x44, 0x21, 0xE0, 0x23 } } } }, // floppy
- { UNK_LANG, kPlatformDOS, { 0x00000009, 0x0000030C, { { 0x24, 0x3F, 0x57, 0xFA, 0x7E, 0x6D, 0x61, 0x6C, 0x53, 0xBC, 0x44, 0x38, 0x61, 0xE9, 0x3E, 0xE6 } } } }, // CD
-
- EXTRACT_END_ENTRY
-};
-
-const ExtractEntrySearchData k2SeqplayIntroCDAProvider[] = {
- { UNK_LANG, kPlatformFMTowns, { 0x00000018, 0x00000036, { { 0xCE, 0x10, 0x68, 0x7E, 0x84, 0x68, 0x3A, 0x23, 0x36, 0x41, 0x07, 0xE8, 0x59, 0xDB, 0xA3, 0x31 } } } },
-
- EXTRACT_END_ENTRY
-};
-
-const ExtractEntrySearchData k2SeqplayFinaleCDAProvider[] = {
- { UNK_LANG, kPlatformFMTowns, { 0x00000008, 0x000000AE, { { 0x38, 0x47, 0x35, 0xAA, 0xEC, 0xBA, 0xD3, 0xD0, 0x3E, 0x17, 0xFD, 0xB8, 0x9F, 0xB9, 0xAD, 0x61 } } } },
-
- EXTRACT_END_ENTRY
-};
-
-const ExtractEntrySearchData k2SeqplayShapeAnimDataProvider[] = {
- { UNK_LANG, kPlatformUnknown, { 0x000000B8, 0x00000270, { { 0xBD, 0x3B, 0xFA, 0xE6, 0xA0, 0x40, 0x4E, 0x6E, 0x3E, 0x43, 0x81, 0xF3, 0x35, 0x57, 0x62, 0x27 } } } },
-
- EXTRACT_END_ENTRY
-};
-
-const ExtractEntrySearchData k2IngamePakFilesProvider[] = {
- { UNK_LANG, kPlatformDOS, { 0x0000049F, 0x00012F40, { { 0x4B, 0x2A, 0x84, 0xE3, 0xA5, 0x34, 0xE9, 0xB3, 0xB7, 0x39, 0xF1, 0x1B, 0x4C, 0xE6, 0x43, 0x79 } } } }, // floppy
-
- { UNK_LANG, kPlatformFMTowns, { 0x0000011C, 0x00003FB8, { { 0x66, 0x34, 0xE8, 0x1C, 0xF9, 0xFF, 0x84, 0x90, 0x20, 0x71, 0x42, 0xA3, 0x2C, 0x4A, 0xE9, 0x46 } } } },
-
- { UNK_LANG, kPlatformPC98, { 0x000000F4, 0x00003F57, { { 0x8A, 0xA7, 0x2C, 0xB9, 0x6E, 0x8D, 0x95, 0xBF, 0xF8, 0xB9, 0x98, 0x63, 0x20, 0xF8, 0xB0, 0x7B } } } },
-
- EXTRACT_END_ENTRY
-};
-
-const ExtractEntrySearchData k2IngameSfxFilesProvider[] = {
- { UNK_LANG, kPlatformDOS, { 0x000006F1, 0x0001545E, { { 0xD3, 0x8A, 0xA1, 0xD4, 0x83, 0x77, 0x96, 0x6D, 0x87, 0xB1, 0x71, 0x8F, 0x38, 0x6A, 0x34, 0xDC } } } },
- { UNK_LANG, kPlatformFMTowns, { 0x00000967, 0x0002101A, { { 0x09, 0xC7, 0xB7, 0x2A, 0x76, 0xF1, 0x4B, 0x87, 0xC5, 0x83, 0xFF, 0xF3, 0xDB, 0x3C, 0x66, 0x60 } } } },
- { UNK_LANG, kPlatformPC98, { 0x000006F1, 0x0001545E, { { 0xD3, 0x8A, 0xA1, 0xD4, 0x83, 0x77, 0x96, 0x6D, 0x87, 0xB1, 0x71, 0x8F, 0x38, 0x6A, 0x34, 0xDC } } } },
-
- EXTRACT_END_ENTRY
-};
-
-const ExtractEntrySearchData k2IngameSfxIndexProvider[] = {
- { UNK_LANG, kPlatformDOS, { 0x00000358, 0x000074F4, { { 0xC8, 0x30, 0x1D, 0x9C, 0xFC, 0xF8, 0xD5, 0xBA, 0x7E, 0xAB, 0x13, 0x3F, 0x43, 0x50, 0xFA, 0xC4 } } } }, // CD
-
- { UNK_LANG, kPlatformUnknown, { 0x00000358, 0x0000747E, { { 0x20, 0x99, 0x4D, 0xB8, 0xF2, 0x05, 0xF2, 0xA7, 0x07, 0x28, 0x97, 0xFB, 0x70, 0x1F, 0x2A, 0x73 } } } }, // floppy + FM-TOWNS
-
- EXTRACT_END_ENTRY
-};
-
-const ExtractEntrySearchData k2IngameTracksProvider[] = {
- { UNK_LANG, kPlatformUnknown, { 0x0000007E, 0x00001E45, { { 0xC6, 0x52, 0xCC, 0x1A, 0x23, 0x3B, 0xDA, 0x03, 0xF3, 0xC2, 0x46, 0xDF, 0x01, 0xA3, 0x9E, 0x50 } } } },
-
- EXTRACT_END_ENTRY
-};
-
-const ExtractEntrySearchData k2IngameCDAProvider[] = {
- { UNK_LANG, kPlatformUnknown, { 0x00000130, 0x00001B9D, { { 0x9E, 0xFB, 0x01, 0xE7, 0xBA, 0xE1, 0x4F, 0x3C, 0xC5, 0xB9, 0x75, 0x80, 0xEA, 0xAC, 0xB0, 0x0F } } } },
-
- EXTRACT_END_ENTRY
-};
-
-const ExtractEntrySearchData k2IngameTalkObjIndexProvider[] = {
- { UNK_LANG, kPlatformDOS, { 0x00000078, 0x00000A9C, { { 0x27, 0x65, 0xFA, 0xB1, 0xF8, 0x04, 0x7F, 0x93, 0x2B, 0x2D, 0x44, 0x3C, 0x95, 0x13, 0x50, 0xD2 } } } }, // floppy (English)
- { UNK_LANG, kPlatformDOS, { 0x00000078, 0x00000A53, { { 0x18, 0x5B, 0x79, 0x92, 0x54, 0xDB, 0x4B, 0x0C, 0x78, 0x89, 0x7C, 0x59, 0xBF, 0x53, 0x37, 0x14 } } } }, // floppy (German + French)
- { UNK_LANG, kPlatformDOS, { 0x00000078, 0x00000A7C, { { 0x33, 0x89, 0x69, 0xEF, 0x62, 0x94, 0x3A, 0xC0, 0xB2, 0xBA, 0xFB, 0x0C, 0x86, 0x2C, 0xAC, 0x5C } } } }, // floppy (Italian)
- { UNK_LANG, kPlatformDOS, { 0x00000084, 0x00000CD0, { { 0x82, 0x2E, 0xF4, 0xDD, 0x28, 0x75, 0xDD, 0x79, 0x78, 0x62, 0x55, 0x48, 0xDD, 0xF7, 0x16, 0x81 } } } }, // CD
-
- { UNK_LANG, kPlatformFMTowns, { 0x0000007A, 0x00000744, { { 0x74, 0x84, 0xB4, 0xA6, 0x9D, 0x91, 0xBF, 0x24, 0x1E, 0xD5, 0xDE, 0xD4, 0x73, 0x93, 0x1F, 0xE6 } } } },
-
- { UNK_LANG, kPlatformPC98, { 0x00000078, 0x0000099D, { { 0x2F, 0x06, 0x8D, 0x4E, 0x76, 0x9E, 0x92, 0xFD, 0x43, 0xA4, 0x12, 0xED, 0xBA, 0x30, 0xFE, 0x94 } } } },
-
- EXTRACT_END_ENTRY
-};
-
-const ExtractEntrySearchData k2IngameTimJpStringsProvider[] = {
- { UNK_LANG, kPlatformFMTowns, { 0x0000002D, 0x00001302, { { 0x15, 0x29, 0xFD, 0xB1, 0xEB, 0xC0, 0x00, 0xA4, 0x19, 0xDA, 0xC7, 0x2E, 0x17, 0x0F, 0x3F, 0xB7 } } } },
- { UNK_LANG, kPlatformPC98, { 0x0000002C, 0x00001302, { { 0xAB, 0xBA, 0xC8, 0x2A, 0xD0, 0xD1, 0x1C, 0xEA, 0x6F, 0x35, 0x12, 0x5D, 0x85, 0xFB, 0x92, 0x84 } } } },
-
- EXTRACT_END_ENTRY
-};
-
-const ExtractEntrySearchData k2IngameShapeAnimDataProvider[] = {
- { UNK_LANG, kPlatformDOS, { 0x00000348, 0x0001AAEB, { { 0x67, 0xD1, 0x03, 0xBF, 0x4B, 0xEC, 0x80, 0x26, 0x5D, 0x1D, 0x0E, 0x5B, 0xF1, 0xE8, 0x4C, 0x64 } } } }, // CD
-
- { UNK_LANG, kPlatformUnknown, { 0x00000348, 0x00002473, { { 0xBC, 0x18, 0x51, 0xFA, 0x51, 0x1D, 0x24, 0x7D, 0x44, 0xD0, 0xE2, 0x38, 0x31, 0x33, 0x3B, 0x56 } } } }, // floppy + FM-TOWNS
-
- EXTRACT_END_ENTRY
-};
-
-const ExtractEntrySearchData k2IngameTlkDemoStringsProvider[] = {
- { EN_ANY, kPlatformDOS, { 0x000000CB, 0x00004741, { { 0xF3, 0x54, 0x37, 0xEE, 0x61, 0x9E, 0xE0, 0x82, 0x64, 0x8B, 0xF3, 0x53, 0xC7, 0x2F, 0x49, 0x1F } } } },
- { FR_FRA, kPlatformDOS, { 0x000000BE, 0x00004327, { { 0x8C, 0xF2, 0x5E, 0x85, 0xDA, 0xA1, 0x91, 0x90, 0xE5, 0xC7, 0x2A, 0xBA, 0x48, 0xC3, 0x9A, 0xCA } } } },
- { DE_DEU, kPlatformDOS, { 0x000000DC, 0x00004C7B, { { 0xC9, 0x75, 0x3A, 0x4A, 0xF4, 0xB0, 0xE8, 0x61, 0x90, 0x74, 0x34, 0x84, 0x53, 0x54, 0xA2, 0x4F } } } },
-
- EXTRACT_END_ENTRY
-};
-
-const ExtractEntrySearchData k3MainMenuStringsProvider[] = {
- { UNK_LANG, kPlatformUnknown, { 0x000000B0, 0x00003E75, { { 0xA7, 0x91, 0x9B, 0x61, 0x31, 0x12, 0x74, 0xB5, 0x4B, 0x4F, 0x8A, 0x44, 0xA9, 0xB1, 0x03, 0xC0 } } } },
-
- EXTRACT_END_ENTRY
-};
-
-const ExtractEntrySearchData k3MusicFilesProvider[] = {
- { UNK_LANG, kPlatformUnknown, { 0x000001D5, 0x00007436, { { 0x27, 0xC2, 0x96, 0xFF, 0x22, 0xEC, 0xB5, 0x26, 0xF9, 0x4F, 0x04, 0xDD, 0x58, 0x17, 0xFE, 0xC6 } } } },
-
- EXTRACT_END_ENTRY
-};
-
-const ExtractEntrySearchData k3ScoreTableProvider[] = {
- { UNK_LANG, kPlatformUnknown, { 0x000000C8, 0x0000038F, { { 0x4E, 0x2E, 0xC3, 0xD9, 0x13, 0xA0, 0x74, 0x7E, 0xAB, 0xA1, 0x23, 0x2F, 0x11, 0x35, 0x4D, 0xA5 } } } },
-
- EXTRACT_END_ENTRY
-};
-
-const ExtractEntrySearchData k3SfxFilesProvider[] = {
- { UNK_LANG, kPlatformUnknown, { 0x000008BF, 0x0001A766, { { 0xBD, 0x5D, 0x65, 0x5D, 0xC4, 0x34, 0xDF, 0x36, 0xF5, 0xC0, 0xE8, 0x7B, 0x51, 0x9F, 0xE5, 0xC7 } } } },
-
- EXTRACT_END_ENTRY
-};
-
-const ExtractEntrySearchData k3SfxMapProvider[] = {
- { UNK_LANG, kPlatformUnknown, { 0x000004C0, 0x0000C4F9, { { 0x06, 0x61, 0x45, 0x38, 0xC2, 0x6A, 0x12, 0x23, 0x55, 0x2C, 0x7F, 0xA5, 0xE2, 0x79, 0x81, 0x9E } } } },
-
- EXTRACT_END_ENTRY
-};
-
-const ExtractEntrySearchData k3ItemAnimDataProvider[] = {
- { UNK_LANG, kPlatformUnknown, { 0x000001C8, 0x00003777, { { 0x8F, 0xE8, 0x80, 0x4A, 0x88, 0x83, 0xC0, 0x48, 0x55, 0x47, 0x81, 0xD3, 0xB7, 0xD5, 0x09, 0x8F } } } },
-
- EXTRACT_END_ENTRY
-};
-
-const ExtractEntrySearchData k3ItemMagicTableProvider[] = {
- { UNK_LANG, kPlatformUnknown, { 0x00000048, 0x00000F9E, { { 0x87, 0xA7, 0xC0, 0xA2, 0x0F, 0xA3, 0x5B, 0x08, 0x76, 0x6F, 0x02, 0x68, 0x13, 0x17, 0x3B, 0x76 } } } },
-
- EXTRACT_END_ENTRY
-};
-
-const ExtractEntrySearchData k3ItemStringMapProvider[] = {
- { UNK_LANG, kPlatformUnknown, { 0x00000048, 0x0000003C, { { 0x4C, 0xA7, 0xAA, 0xB0, 0x3C, 0xCC, 0x78, 0x91, 0x0A, 0xF2, 0x7F, 0x25, 0x80, 0xB3, 0x74, 0x74 } } } },
-
- EXTRACT_END_ENTRY
-};
-
-const ExtractEntrySearchData kEoBBaseChargenStrings1Provider[] = {
- { EN_ANY, kPlatformUnknown, { 0x000000CA, 0x00003BC8, { { 0x27, 0xEA, 0xE3, 0x0D, 0x55, 0xB3, 0x69, 0x3E, 0xC2, 0x66, 0x58, 0x64, 0xAA, 0xC2, 0x80, 0x58 } } } },
- { DE_DEU, kPlatformUnknown, { 0x000000C3, 0x000038F6, { { 0x20, 0x68, 0xAB, 0xD4, 0xBF, 0x49, 0x04, 0xC0, 0x91, 0xB4, 0x71, 0xB0, 0xB6, 0xC9, 0x11, 0xF0 } } } }, // EOB 1
- { DE_DEU, kPlatformUnknown, { 0x000000C7, 0x00003ADB, { { 0x0D, 0x03, 0x7A, 0xE6, 0x7D, 0x41, 0x89, 0x49, 0x0C, 0xB6, 0xD0, 0x4F, 0xEA, 0x1E, 0x54, 0xFF } } } }, // EOB 2
- EXTRACT_END_ENTRY
-};
-
-const ExtractEntrySearchData kEoBBaseChargenStrings2Provider[] = {
- { EN_ANY, kPlatformUnknown, { 0x0000004B, 0x000011AE, { { 0x28, 0x98, 0x4C, 0xA3, 0x98, 0xB0, 0xA2, 0x17, 0x9C, 0x80, 0x4F, 0x3F, 0x58, 0x3B, 0x2C, 0xFB } } } },
- { DE_DEU, kPlatformUnknown, { 0x0000004E, 0x0000129D, { { 0xED, 0xF3, 0x36, 0x16, 0xE2, 0x1B, 0x32, 0x95, 0xFE, 0xE8, 0x3E, 0x7D, 0xE6, 0x32, 0x34, 0xD4 } } } }, // EOB 1
- { DE_DEU, kPlatformUnknown, { 0x0000004A, 0x00001267, { { 0xD6, 0xE2, 0x27, 0x6A, 0x6F, 0x7E, 0xB4, 0xCE, 0xA8, 0xE9, 0x79, 0x31, 0x5C, 0x13, 0xA1, 0x8F } } } }, // EOB 2
- EXTRACT_END_ENTRY
-};
-
-const ExtractEntrySearchData kEoBBaseChargenStartLevelsProvider[] = {
- { UNK_LANG, kPlatformUnknown, { 0x0000003C, 0x00000054, { { 0xAB, 0x68, 0x74, 0x3E, 0x0D, 0x45, 0xA3, 0x50, 0xA7, 0x72, 0x6A, 0xDF, 0x9C, 0x23, 0x98, 0x74 } } } }, // EOB 1
- { UNK_LANG, kPlatformUnknown, { 0x0000003C, 0x000000B1, { { 0xFD, 0x3F, 0x6B, 0xB5, 0xE4, 0xEE, 0x32, 0x3B, 0xBD, 0x72, 0x37, 0x88, 0x52, 0x84, 0xBD, 0xC6 } } } }, // EOB 2
- EXTRACT_END_ENTRY
-};
-
-const ExtractEntrySearchData kEoBBaseChargenStatStringsProvider[] = {
- { EN_ANY, kPlatformUnknown, { 0x00000055, 0x000015D6, { { 0xB8, 0x29, 0x4B, 0xA4, 0x4F, 0x45, 0x16, 0x1A, 0x07, 0x28, 0x14, 0x86, 0x1B, 0xDF, 0xAC, 0xDF } } } },
- { DE_DEU, kPlatformUnknown, { 0x00000056, 0x000015F9, { { 0xBB, 0x5A, 0x7D, 0xCF, 0xC3, 0x90, 0x9A, 0xB3, 0x73, 0xB2, 0x4D, 0x46, 0xB8, 0x89, 0x7D, 0xAE } } } }, // EOB 1
- { DE_DEU, kPlatformUnknown, { 0x00000053, 0x0000159A, { { 0x1D, 0xA6, 0x84, 0xDB, 0xC5, 0x81, 0xC7, 0xF0, 0x1C, 0xA4, 0xE3, 0x10, 0x4F, 0x8A, 0xF3, 0xCE } } } }, // EOB 2
- EXTRACT_END_ENTRY
-};
-
-const ExtractEntrySearchData kEoBBaseChargenRaceSexStringsProvider[] = {
- { EN_ANY, kPlatformUnknown, { 0x00000098, 0x00002572, { { 0x8D, 0xF9, 0xDE, 0x92, 0xFC, 0xA8, 0xFC, 0xE9, 0x0A, 0x98, 0x6D, 0xA4, 0x6F, 0x21, 0xCD, 0xF4 } } } },
- { DE_DEU, kPlatformUnknown, { 0x000000AA, 0x00002A1E, { { 0x8E, 0xAF, 0x4B, 0x20, 0xEA, 0xFE, 0x71, 0x8E, 0x8B, 0x4B, 0x46, 0x62, 0x91, 0x48, 0x08, 0xAF } } } }, // EOB 1
- { DE_DEU, kPlatformUnknown, { 0x00000098, 0x00002502, { { 0xA4, 0x8B, 0x20, 0xF5, 0x97, 0xFE, 0x34, 0x6D, 0x9F, 0xF0, 0xA8, 0xE9, 0xE8, 0xFA, 0x23, 0x9B } } } }, // EOB 2
- EXTRACT_END_ENTRY
-};
-
-const ExtractEntrySearchData kEoBBaseChargenClassStringsProvider[] = {
- { EN_ANY, kPlatformUnknown, { 0x000000D5, 0x000035A7, { { 0xAF, 0x89, 0x9A, 0x11, 0x9A, 0x8D, 0x39, 0x6F, 0x26, 0x41, 0x4E, 0x20, 0xAD, 0x91, 0xC5, 0xDA } } } },
- { DE_DEU, kPlatformUnknown, { 0x000000FA, 0x00003FD8, { { 0xBD, 0x78, 0xF7, 0xEC, 0x9D, 0x9A, 0x3A, 0x22, 0xAB, 0xD9, 0x10, 0xAD, 0x8E, 0x1D, 0x4D, 0xDE } } } }, // EOB 1
- { DE_DEU, kPlatformUnknown, { 0x000000E4, 0x00003BE5, { { 0xDE, 0x1B, 0x25, 0x4F, 0xE6, 0xD0, 0xB5, 0x95, 0xD0, 0xA6, 0x69, 0xE6, 0x53, 0xB8, 0x20, 0x1E } } } }, // EOB 2
- EXTRACT_END_ENTRY
-};
-
-const ExtractEntrySearchData kEoBBaseChargenAlignmentStringsProvider[] = {
- { EN_ANY, kPlatformUnknown, { 0x00000078, 0x00001F44, { { 0xBB, 0x52, 0x3C, 0xA6, 0x79, 0x87, 0xDC, 0xB8, 0x21, 0x7A, 0xA0, 0x17, 0x45, 0xEA, 0xF2, 0x50 } } } },
- { DE_DEU, kPlatformUnknown, { 0x0000008A, 0x00002423, { { 0xA3, 0x36, 0x0D, 0x64, 0x33, 0xFD, 0x54, 0xA5, 0xA9, 0xD7, 0xFA, 0x34, 0x39, 0xAD, 0x6A, 0x98 } } } }, // EOB 1
- { DE_DEU, kPlatformUnknown, { 0x0000007F, 0x000021F8, { { 0xBD, 0xB2, 0x06, 0xF9, 0xC9, 0x36, 0x5D, 0x91, 0x43, 0x08, 0x3A, 0x2C, 0x5F, 0x1C, 0xF3, 0x9C } } } }, // EOB 2
- EXTRACT_END_ENTRY
-};
-
-const ExtractEntrySearchData kEoBBaseChargenEnterGameStringsProvider[] = {
- { EN_ANY, kPlatformUnknown, { 0x00000020, 0x00000A0E, { { 0x98, 0x7F, 0x2C, 0x2E, 0xBB, 0x5E, 0xAA, 0xD0, 0x72, 0xF5, 0xBC, 0x4A, 0x34, 0x5B, 0xB4, 0xF5 } } } },
- { DE_DEU, kPlatformUnknown, { 0x00000021, 0x00000AB6, { { 0x02, 0x7F, 0x19, 0x5A, 0xA9, 0xB7, 0x8C, 0xE2, 0xF7, 0x35, 0xB0, 0xD8, 0xA8, 0x0C, 0x24, 0x44 } } } }, // EOB 1
- { DE_DEU, kPlatformUnknown, { 0x0000001E, 0x00000925, { { 0xDA, 0x83, 0x00, 0xD2, 0x94, 0xF0, 0xD8, 0xFC, 0x3D, 0xA8, 0xD2, 0x4E, 0xF2, 0xD7, 0x2B, 0x7E } } } }, // EOB 2
- EXTRACT_END_ENTRY
-};
-
-const ExtractEntrySearchData kEoBBaseChargenClassMinStatsProvider[] = {
- { UNK_LANG, kPlatformUnknown, { 0x000000B4, 0x00000165, { { 0x83, 0x5E, 0x91, 0x10, 0x4D, 0x75, 0x6B, 0xF9, 0x45, 0x1B, 0x65, 0x13, 0x37, 0x3E, 0xC0, 0xAE } } } },
- EXTRACT_END_ENTRY
-};
-
-const ExtractEntrySearchData kEoBBaseChargenRaceMinStatsProvider[] = {
- { UNK_LANG, kPlatformUnknown, { 0x00000048, 0x000000B2, { { 0x08, 0xF0, 0x8F, 0x22, 0x9D, 0xD8, 0xBE, 0x52, 0x70, 0x7C, 0xCA, 0x8D, 0xB2, 0xF5, 0xC6, 0xB8 } } } },
- EXTRACT_END_ENTRY
-};
-
-const ExtractEntrySearchData kEoBBaseChargenRaceMaxStatsProvider[] = {
- { UNK_LANG, kPlatformUnknown, { 0x00000048, 0x00000479, { { 0xBD, 0xA0, 0x8C, 0xC2, 0x05, 0xCA, 0x0D, 0x4B, 0x82, 0x9B, 0x3D, 0xB5, 0x4B, 0xDB, 0xD2, 0xC1 } } } },
- EXTRACT_END_ENTRY
-};
-
-const ExtractEntrySearchData kEoBBaseSaveThrowTable1Provider[] = {
- { UNK_LANG, kPlatformUnknown, { 0x00000032, 0x00000214, { { 0x3D, 0x89, 0x30, 0x0A, 0x5C, 0x4A, 0x0F, 0xC3, 0xC7, 0x6B, 0x72, 0x7C, 0x12, 0x51, 0x8D, 0x8E } } } },
- EXTRACT_END_ENTRY
-};
-
-const ExtractEntrySearchData kEoBBaseSaveThrowTable2Provider[] = {
- { UNK_LANG, kPlatformUnknown, { 0x00000019, 0x000000E7, { { 0xF4, 0x0D, 0xDF, 0xA3, 0x23, 0x71, 0x76, 0x2A, 0xC5, 0x6F, 0xF1, 0x59, 0x5F, 0x45, 0x73, 0x05 } } } },
- EXTRACT_END_ENTRY
-};
-
-const ExtractEntrySearchData kEoBBaseSaveThrowTable3Provider[] = {
- { UNK_LANG, kPlatformUnknown, { 0x00000023, 0x00000155, { { 0x42, 0x98, 0x84, 0x00, 0x70, 0x8A, 0x7B, 0x26, 0xC0, 0x96, 0xA3, 0x28, 0x41, 0x36, 0x4B, 0x21 } } } },
- EXTRACT_END_ENTRY
-};
-
-const ExtractEntrySearchData kEoBBaseSaveThrowTable4Provider[] = {
- { UNK_LANG, kPlatformUnknown, { 0x0000001E, 0x0000013B, { { 0xAB, 0x84, 0x2B, 0x0A, 0xC2, 0x46, 0xFF, 0x83, 0x03, 0xF8, 0x3F, 0x32, 0x53, 0xA2, 0x95, 0x65 } } } },
- EXTRACT_END_ENTRY
-};
-
-const ExtractEntrySearchData kEoBBaseSaveThrwLvlIndexProvider[] = {
- { UNK_LANG, kPlatformUnknown, { 0x00000006, 0x00000070, { { 0x57, 0x48, 0x5F, 0x75, 0x79, 0xD4, 0xAA, 0x7D, 0xB7, 0xEB, 0x19, 0x9F, 0xCF, 0x99, 0x29, 0x29 } } } },
- EXTRACT_END_ENTRY
-};
-
-const ExtractEntrySearchData kEoBBaseSaveThrwModDivProvider[] = {
- { UNK_LANG, kPlatformUnknown, { 0x00000006, 0x00000012, { { 0x50, 0x29, 0x51, 0x65, 0x0B, 0xF1, 0xCC, 0xDA, 0x2C, 0xA4, 0x7E, 0xEE, 0x20, 0xB0, 0x29, 0xB1 } } } },
- EXTRACT_END_ENTRY
-};
-
-const ExtractEntrySearchData kEoBBaseSaveThrwModExtProvider[] = {
- { UNK_LANG, kPlatformUnknown, { 0x00000006, 0x00000030, { { 0x07, 0x7D, 0x61, 0x1C, 0x95, 0xEC, 0x9A, 0xCE, 0xA1, 0x29, 0x83, 0x2F, 0xCA, 0x95, 0x95, 0xF5 } } } },
- EXTRACT_END_ENTRY
-};
-
-const ExtractEntrySearchData kEoBBasePryDoorStringsProvider[] = {
- { EN_ANY, kPlatformUnknown, { 0x000000E8, 0x00004D9F, { { 0xDE, 0x01, 0x69, 0x00, 0x0B, 0x32, 0xFA, 0x20, 0xB8, 0x11, 0xD6, 0xD9, 0xE2, 0xEA, 0xF5, 0xE8 } } } }, // EOB 1
- { EN_ANY, kPlatformUnknown, { 0x000000D2, 0x000043D2, { { 0x82, 0x3C, 0xF4, 0x4A, 0x87, 0x84, 0xFE, 0xF9, 0xBA, 0xC6, 0x67, 0x3A, 0x0D, 0x0F, 0x76, 0x78 } } } }, // EOB 2
- { DE_DEU, kPlatformUnknown, { 0x00000128, 0x0000657C, { { 0xA3, 0xC8, 0x48, 0xA7, 0x1F, 0x75, 0xDF, 0xB0, 0x37, 0xDA, 0x75, 0x2E, 0x9F, 0x4E, 0x45, 0xB0 } } } }, // EOB 1
- { DE_DEU, kPlatformUnknown, { 0x000000D9, 0x00004769, { { 0x24, 0x59, 0x00, 0x8F, 0x9A, 0x3E, 0x95, 0xAB, 0x14, 0x9A, 0x3B, 0x19, 0x34, 0xDB, 0x9B, 0x18 } } } }, // EOB 2
- EXTRACT_END_ENTRY
-};
-
-const ExtractEntrySearchData kEoBBaseWarningStringsProvider[] = {
- { EN_ANY, kPlatformUnknown, { 0x00000052, 0x00001A7B, { { 0x81, 0x7A, 0xDF, 0xD2, 0x4F, 0xA7, 0x92, 0xA7, 0x44, 0xE5, 0x22, 0x73, 0xF6, 0xB3, 0x29, 0x5C } } } }, // EOB 1
- { EN_ANY, kPlatformUnknown, { 0x00000085, 0x00002B5C, { { 0xF1, 0xCE, 0x7C, 0x53, 0xEF, 0x5B, 0x59, 0x71, 0xA9, 0xEB, 0x00, 0xBA, 0xB7, 0x59, 0xC5, 0x2E } } } }, // EOB 2
- { DE_DEU, kPlatformUnknown, { 0x0000005F, 0x00001FD2, { { 0xBA, 0x85, 0x97, 0x63, 0x84, 0x80, 0x79, 0x44, 0x50, 0x99, 0x1A, 0x01, 0x37, 0x37, 0x0E, 0xD1 } } } }, // EOB 1
- { DE_DEU, kPlatformUnknown, { 0x00000096, 0x000032BF, { { 0x07, 0x95, 0x91, 0x1A, 0x1B, 0xC8, 0xA3, 0xEE, 0x76, 0x0A, 0x48, 0x11, 0x37, 0x6F, 0xBA, 0x05 } } } }, // EOB 1
- EXTRACT_END_ENTRY
-};
-
-const ExtractEntrySearchData kEoBBaseItemSuffixStringsRingsProvider[] = {
- { EN_ANY, kPlatformUnknown, { 0x0000002B, 0x00000F7B, { { 0x8A, 0x27, 0x87, 0x81, 0x5F, 0x74, 0x27, 0xA9, 0x5E, 0x1B, 0xEE, 0xC0, 0xF7, 0x22, 0x8F, 0x57 } } } },
- { DE_DEU, kPlatformUnknown, { 0x00000022, 0x00000C02, { { 0x7D, 0x5F, 0x40, 0xEA, 0xAD, 0xDD, 0x1B, 0xA0, 0xA6, 0xE0, 0x57, 0x7D, 0x0D, 0x60, 0xF4, 0x2C } } } }, // EOB 1
- { DE_DEU, kPlatformUnknown, { 0x0000002E, 0x00000FF2, { { 0xE1, 0x50, 0xB7, 0xE2, 0xEF, 0xAD, 0x5B, 0x6D, 0x27, 0x35, 0x9C, 0xE7, 0x2D, 0xB2, 0x2E, 0xD0 } } } }, // EOB 2
- EXTRACT_END_ENTRY
-};
-
-const ExtractEntrySearchData kEoBBaseItemSuffixStringsPotionsProvider[] = {
- { EN_ANY, kPlatformUnknown, { 0x00000054, 0x00001DDB, { { 0xB6, 0x78, 0xD9, 0x09, 0x1D, 0x09, 0x63, 0xF8, 0x96, 0x74, 0xF0, 0x75, 0x23, 0xF5, 0xD4, 0xC4 } } } },
- { DE_DEU, kPlatformUnknown, { 0x00000064, 0x000024ED, { { 0x10, 0x5A, 0xB8, 0xCA, 0x0F, 0x0D, 0x44, 0x19, 0x9D, 0x3D, 0x76, 0x54, 0xA1, 0x69, 0x97, 0x8B } } } }, // EOB 1
- { DE_DEU, kPlatformUnknown, { 0x0000006F, 0x00002792, { { 0x1A, 0x71, 0x2B, 0xCC, 0xCA, 0xDA, 0xF6, 0xED, 0x5E, 0xF0, 0x24, 0x20, 0xD7, 0x2D, 0x18, 0x49 } } } }, // EOB 2
- EXTRACT_END_ENTRY
-};
-
-const ExtractEntrySearchData kEoBBaseItemSuffixStringsWandsProvider[] = {
- { EN_ANY, kPlatformUnknown, { 0x0000003C, 0x000014EB, { { 0xB5, 0x38, 0x35, 0x57, 0xF2, 0xF8, 0x0E, 0xBA, 0x75, 0x03, 0x1C, 0xCD, 0x46, 0x7D, 0x03, 0x83 } } } }, // EOB 1
- { EN_ANY, kPlatformUnknown, { 0x0000004A, 0x000019B2, { { 0x44, 0x10, 0xE4, 0xAF, 0xAB, 0x19, 0x25, 0x87, 0x2B, 0x15, 0x1C, 0x4C, 0x03, 0x50, 0x41, 0xC4 } } } }, // EOB 2
- { DE_DEU, kPlatformUnknown, { 0x00000040, 0x000016B5, { { 0xEC, 0xF4, 0x71, 0xC1, 0x69, 0x5C, 0xF9, 0xC1, 0xED, 0xC1, 0xED, 0x0C, 0x25, 0x3E, 0x13, 0xB1 } } } }, // EOB 1
- { DE_DEU, kPlatformUnknown, { 0x00000069, 0x0000252B, { { 0x12, 0x06, 0xEA, 0x2F, 0xAF, 0x47, 0x55, 0x52, 0xB6, 0xD9, 0x11, 0xA4, 0x4F, 0x30, 0xCE, 0x9D } } } }, // EOB 2
- EXTRACT_END_ENTRY
-};
-
-const ExtractEntrySearchData kEoBBaseRipItemStringsProvider[] = {
- { EN_ANY, kPlatformUnknown, { 0x00000025, 0x00000AEA, { { 0x7A, 0x2D, 0x03, 0xA5, 0x94, 0xD1, 0xA2, 0x2C, 0x41, 0x1F, 0xEB, 0x5C, 0xFB, 0xB2, 0xC6, 0x9E } } } },
- { DE_DEU, kPlatformUnknown, { 0x00000024, 0x00000B1B, { { 0xD0, 0x26, 0x19, 0x0B, 0xA5, 0x8A, 0x38, 0x73, 0x14, 0x25, 0x40, 0x5D, 0x24, 0xB8, 0x4E, 0xC5 } } } }, // EOB 1
- { DE_DEU, kPlatformUnknown, { 0x0000002E, 0x00000D38, { { 0xCE, 0xC5, 0x00, 0x63, 0xBB, 0xF0, 0xC4, 0x0D, 0x50, 0x2B, 0x82, 0x1C, 0xC0, 0xCD, 0xF1, 0xAF } } } }, // EOB 2
- EXTRACT_END_ENTRY
-};
-
-const ExtractEntrySearchData kEoBBaseCursedStringProvider[] = {
- { EN_ANY, kPlatformUnknown, { 0x0000000D, 0x000003C7, { { 0x7F, 0x6B, 0x6A, 0xFE, 0x63, 0xF4, 0x17, 0xAF, 0xFD, 0x00, 0x31, 0x4A, 0x20, 0x9E, 0x8C, 0xEB } } } }, // EOB 1
- { EN_ANY, kPlatformUnknown, { 0x0000000D, 0x000003C7, { { 0x59, 0xD8, 0x84, 0x25, 0xE0, 0x06, 0x51, 0xA4, 0x70, 0xC5, 0x78, 0x22, 0xF0, 0x2D, 0xA0, 0x43 } } } }, // EOB 2
- { DE_DEU, kPlatformUnknown, { 0x00000010, 0x00000514, { { 0x97, 0x41, 0xA6, 0xAE, 0xF8, 0xA8, 0x3E, 0x85, 0xA8, 0x16, 0x01, 0x15, 0x0E, 0x46, 0x13, 0x45 } } } }, // EOB 1
- { DE_DEU, kPlatformUnknown, { 0x00000013, 0x000005A5, { { 0xEC, 0xD3, 0xA5, 0xD2, 0xAD, 0x7C, 0x5E, 0x0F, 0x42, 0xBC, 0x6E, 0xDE, 0x7E, 0x36, 0x0B, 0x43 } } } }, // EOB 2
- EXTRACT_END_ENTRY
-};
-
-const ExtractEntrySearchData kEoBBaseEnchantedStringProvider[] = {
- { UNK_LANG, kPlatformUnknown, { 0x00000007, 0x0000016C, { { 0x98, 0x62, 0xD3, 0xA3, 0x11, 0xAE, 0x0A, 0xBA, 0x8F, 0xE8, 0x30, 0x0B, 0xDC, 0x12, 0x90, 0x3B } } } }, // EOB 1
- { UNK_LANG, kPlatformUnknown, { 0x00000007, 0x0000016C, { { 0x01, 0x91, 0xBD, 0x89, 0xAE, 0x0E, 0x71, 0xEE, 0xBE, 0x31, 0xD9, 0x55, 0x21, 0x61, 0x19, 0xAE } } } }, // EOB 2
- EXTRACT_END_ENTRY
-};
-
-const ExtractEntrySearchData kEoBBaseMagicObjectStringsProvider[] = {
- { EN_ANY, kPlatformUnknown, { 0x0000002B, 0x00000E7D, { { 0x7E, 0x8F, 0x17, 0xEB, 0xE5, 0x5D, 0xEB, 0x9A, 0x84, 0xFF, 0x86, 0x6A, 0x01, 0x3E, 0x04, 0x84 } } } },
- { DE_DEU, kPlatformUnknown, { 0x0000003A, 0x000014E4, { { 0x3D, 0x34, 0x3C, 0xCA, 0xDC, 0xD1, 0xCF, 0x15, 0x69, 0x57, 0xC3, 0xB1, 0x58, 0xDF, 0xE9, 0x9D } } } }, // EOB 1
- { DE_DEU, kPlatformUnknown, { 0x0000002A, 0x00000EE4, { { 0x9C, 0x38, 0x4B, 0x9B, 0x67, 0x30, 0x4E, 0x88, 0xA9, 0xA2, 0xF8, 0x78, 0x8E, 0xC7, 0xC3, 0x86 } } } }, // EOB 2
- EXTRACT_END_ENTRY
-};
-
-const ExtractEntrySearchData kEoBBaseMagicObject5StringProvider[] = {
- { EN_ANY, kPlatformUnknown, { 0x00000006, 0x000001FE, { { 0x74, 0x8D, 0xB9, 0x76, 0xD2, 0x2F, 0x60, 0xD2, 0x36, 0x45, 0x98, 0x4C, 0x0A, 0xE5, 0xE5, 0x0D } } } },
- { DE_DEU, kPlatformUnknown, { 0x00000006, 0x00000204, { { 0xE4, 0xC1, 0xAD, 0x71, 0x87, 0x80, 0x9D, 0x97, 0x91, 0x80, 0x3F, 0x71, 0xD3, 0x62, 0x06, 0xD5 } } } }, // EOB 1
- { DE_DEU, kPlatformUnknown, { 0x00000007, 0x0000027A, { { 0x44, 0x47, 0x79, 0x46, 0x9B, 0xE5, 0xBD, 0x3C, 0xE8, 0x8D, 0xC6, 0xC5, 0x4E, 0x88, 0x13, 0xC0 } } } }, // EOB 2
- EXTRACT_END_ENTRY
-};
-
-const ExtractEntrySearchData kEoBBasePatternSuffixProvider[] = {
- { EN_ANY, kPlatformUnknown, { 0x00000009, 0x00000245, { { 0x67, 0x3F, 0x33, 0xA5, 0x3B, 0x5D, 0x2C, 0x9E, 0x15, 0x82, 0x04, 0xE2, 0xD7, 0x34, 0x42, 0x24 } } } },
- { DE_DEU, kPlatformUnknown, { 0x00000006, 0x0000015D, { { 0x33, 0xD6, 0x91, 0x2D, 0xED, 0xE1, 0x43, 0x42, 0x23, 0xB9, 0xE9, 0x3D, 0x48, 0x82, 0x92, 0x1E } } } }, // EOB 1
- { DE_DEU, kPlatformUnknown, { 0x00000008, 0x00000219, { { 0xCD, 0xDC, 0x7F, 0x8B, 0xBE, 0xD6, 0x05, 0x37, 0xDA, 0xDC, 0x11, 0xC3, 0x1E, 0x7A, 0xE7, 0x13 } } } }, // EOB 2
- EXTRACT_END_ENTRY
-};
-
-const ExtractEntrySearchData kEoBBasePatternGrFix1Provider[] = {
- { EN_ANY, kPlatformUnknown, { 0x00000009, 0x00000245, { { 0x67, 0x3F, 0x33, 0xA5, 0x3B, 0x5D, 0x2C, 0x9E, 0x15, 0x82, 0x04, 0xE2, 0xD7, 0x34, 0x42, 0x24 } } } },
- { DE_DEU, kPlatformUnknown, { 0x00000006, 0x0000015D, { { 0x33, 0xD6, 0x91, 0x2D, 0xED, 0xE1, 0x43, 0x42, 0x23, 0xB9, 0xE9, 0x3D, 0x48, 0x82, 0x92, 0x1E } } } }, // EOB 1
- { DE_DEU, kPlatformUnknown, { 0x00000007, 0x0000018A, { { 0x02, 0x5C, 0x86, 0xD9, 0x62, 0x0C, 0x71, 0xB3, 0x77, 0x9C, 0x7B, 0xBC, 0x4D, 0x5B, 0xDB, 0xE7 } } } }, // EOB 2
- EXTRACT_END_ENTRY
-};
-
-const ExtractEntrySearchData kEoBBasePatternGrFix2Provider[] = {
- { EN_ANY, kPlatformUnknown, { 0x00000009, 0x00000245, { { 0x67, 0x3F, 0x33, 0xA5, 0x3B, 0x5D, 0x2C, 0x9E, 0x15, 0x82, 0x04, 0xE2, 0xD7, 0x34, 0x42, 0x24 } } } },
- { DE_DEU, kPlatformUnknown, { 0x00000006, 0x0000015D, { { 0x33, 0xD6, 0x91, 0x2D, 0xED, 0xE1, 0x43, 0x42, 0x23, 0xB9, 0xE9, 0x3D, 0x48, 0x82, 0x92, 0x1E } } } }, // EOB 1
- { DE_DEU, kPlatformUnknown, { 0x00000006, 0x00000150, { { 0x48, 0xBE, 0xED, 0xD3, 0xA5, 0x2E, 0xCD, 0xE0, 0x34, 0xBA, 0xA6, 0x8D, 0x7D, 0x00, 0xA2, 0xFF } } } }, // EOB 2
- EXTRACT_END_ENTRY
-};
-
-const ExtractEntrySearchData kEoBBaseValidateArmorStringProvider[] = {
- { EN_ANY, kPlatformUnknown, { 0x00000023, 0x00000B78, { { 0xC2, 0x33, 0x6B, 0xB9, 0xE1, 0x5E, 0x88, 0x5E, 0x22, 0xF2, 0x97, 0x83, 0xF8, 0xC8, 0x8C, 0xAB } } } },
- { DE_DEU, kPlatformUnknown, { 0x00000026, 0x00000D19, { { 0xAD, 0x19, 0xE2, 0xDE, 0x04, 0xF9, 0x8F, 0x92, 0xAC, 0x1A, 0x05, 0xEA, 0x7B, 0xB5, 0x9F, 0x09 } } } }, // EOB 1
- { DE_DEU, kPlatformUnknown, { 0x00000029, 0x00000E7A, { { 0xEC, 0xA8, 0x2E, 0x8D, 0xB1, 0xC8, 0x0F, 0xCD, 0x24, 0xBD, 0x4B, 0x39, 0x16, 0xC9, 0x53, 0x08 } } } }, // EOB 2
- EXTRACT_END_ENTRY
-};
-
-const ExtractEntrySearchData kEoBBaseValidateCursedStringProvider[] = {
- { EN_ANY, kPlatformUnknown, { 0x0000002E, 0x00000F35, { { 0xE7, 0x0E, 0xA1, 0xCE, 0xCC, 0x13, 0xBC, 0x4B, 0x2B, 0x19, 0xEB, 0xA4, 0x05, 0xCF, 0xCF, 0x65 } } } },
- { DE_DEU, kPlatformUnknown, { 0x00000037, 0x000012D8, { { 0x3C, 0x7F, 0x16, 0xCE, 0x40, 0x58, 0xF1, 0x3A, 0xAB, 0x4C, 0x37, 0x82, 0x32, 0x88, 0xA4, 0x2D } } } },
- EXTRACT_END_ENTRY
-};
-
-const ExtractEntrySearchData kEoBBaseValidateNoDropStringProvider[] = {
- { EN_ANY, kPlatformUnknown, { 0x0000001F, 0x00000A8F, { { 0x61, 0x99, 0x3E, 0x36, 0x49, 0x19, 0xB4, 0xE4, 0xBC, 0xFA, 0xB5, 0x71, 0x0E, 0xD6, 0x15, 0x3C } } } }, // EOB 1
- { EN_ANY, kPlatformUnknown, { 0x00000020, 0x00000AB6, { { 0xAA, 0x0E, 0x64, 0xD1, 0xA2, 0xA6, 0x62, 0x76, 0x51, 0xDF, 0x9E, 0x76, 0x85, 0x42, 0xE1, 0x4A } } } }, // EOB 2
- { DE_DEU, kPlatformUnknown, { 0x00000024, 0x00000C31, { { 0x10, 0xD9, 0x55, 0x69, 0xFE, 0x0A, 0x8C, 0xE5, 0xF7, 0x05, 0x5F, 0x09, 0x3B, 0xC9, 0x93, 0x38 } } } }, // EOB 1
- { DE_DEU, kPlatformUnknown, { 0x00000027, 0x00000D9F, { { 0xA5, 0xF0, 0x8E, 0x78, 0x0A, 0x37, 0x31, 0xDC, 0xE0, 0xDF, 0xE5, 0xCB, 0x86, 0xDC, 0x21, 0x73 } } } }, // EOB 2
- EXTRACT_END_ENTRY
-};
-
-const ExtractEntrySearchData kEoBBasePotionStringsProvider[] = {
- { EN_ANY, kPlatformUnknown, { 0x00000017, 0x0000070E, { { 0xD9, 0xCB, 0x26, 0xB6, 0x6F, 0x17, 0x12, 0xB7, 0xB0, 0x95, 0x1B, 0x2A, 0xD8, 0x83, 0x0D, 0x2B } } } },
- { DE_DEU, kPlatformUnknown, { 0x0000001E, 0x000009BD, { { 0xCA, 0xD0, 0x29, 0xB0, 0x7A, 0x2B, 0x0B, 0x69, 0xCA, 0xA4, 0xCA, 0x97, 0xCF, 0x8B, 0x03, 0xAD } } } }, // EOB 1
- { DE_DEU, kPlatformUnknown, { 0x0000001D, 0x00000964, { { 0x5D, 0xE2, 0xA5, 0x0D, 0x72, 0xE9, 0x8F, 0xC9, 0xFA, 0xF3, 0x41, 0x5A, 0x3F, 0x33, 0xAA, 0x15 } } } }, // EOB 2
- EXTRACT_END_ENTRY
-};
-
-const ExtractEntrySearchData kEoBBaseWandStringProvider[] = {
- { EN_ANY, kPlatformUnknown, { 0x00000035, 0x000011EC, { { 0x7C, 0x3D, 0xF1, 0x28, 0x0C, 0x23, 0xD3, 0x18, 0xEE, 0xAD, 0xA7, 0xF4, 0x58, 0xD7, 0x1C, 0x8E } } } }, // EOB 1
- { EN_ANY, kPlatformUnknown, { 0x00000029, 0x00000E47, { { 0xED, 0x2E, 0xD4, 0x4D, 0xDB, 0x90, 0x3F, 0xD0, 0xFB, 0x95, 0xB8, 0xF2, 0xCF, 0x06, 0x08, 0xAF } } } }, // EOB 2
- { DE_DEU, kPlatformUnknown, { 0x00000046, 0x0000186E, { { 0x54, 0x8F, 0x53, 0x34, 0xE8, 0x81, 0x76, 0x71, 0x53, 0x3F, 0x99, 0xE7, 0xCF, 0xB7, 0xC9, 0xD9 } } } }, // EOB 1
- { DE_DEU, kPlatformUnknown, { 0x0000002F, 0x00001070, { { 0x86, 0x18, 0x00, 0x54, 0x05, 0x3D, 0xC2, 0x26, 0xA7, 0xD9, 0x68, 0xE6, 0xC2, 0x0D, 0x26, 0x99 } } } }, // EOB 2
- EXTRACT_END_ENTRY
-};
-
-const ExtractEntrySearchData kEoBBaseItemMisuseStringsProvider[] = {
- { EN_ANY, kPlatformUnknown, { 0x00000066, 0x000022F6, { { 0xE8, 0xB9, 0x07, 0x61, 0x29, 0x90, 0xB0, 0x22, 0x30, 0xC5, 0x0F, 0xAD, 0xCA, 0x6C, 0x83, 0xC6 } } } },
- { DE_DEU, kPlatformUnknown, { 0x00000068, 0x00002472, { { 0xCA, 0xD7, 0xFD, 0x5B, 0x65, 0x72, 0xC7, 0x15, 0xB3, 0xFE, 0xFC, 0xEF, 0x53, 0xFB, 0x57, 0x6C } } } }, // EOB 1
- { DE_DEU, kPlatformUnknown, { 0x0000007E, 0x00002C87, { { 0x5E, 0x11, 0xC9, 0x93, 0xF4, 0xAB, 0x1A, 0x9D, 0xA7, 0x62, 0x71, 0x94, 0x37, 0xCA, 0xE2, 0x25 } } } }, // EOB 2
- EXTRACT_END_ENTRY
-};
-
-const ExtractEntrySearchData kEoBBaseTakenStringsProvider[] = {
- { EN_ANY, kPlatformUnknown, { 0x00000009, 0x0000026E, { { 0x3B, 0x73, 0x70, 0x2E, 0x22, 0x90, 0x0D, 0xC1, 0xDE, 0x32, 0x11, 0xCC, 0x97, 0xBA, 0xA3, 0x58 } } } },
- { DE_DEU, kPlatformUnknown, { 0x0000000F, 0x000004ED, { { 0x8D, 0x12, 0x1E, 0x91, 0xD3, 0xF4, 0x34, 0x15, 0xC7, 0x4F, 0xE7, 0x23, 0x5B, 0xE8, 0x66, 0xB7 } } } },
- EXTRACT_END_ENTRY
-};
-
-const ExtractEntrySearchData kEoBBasePotionEffectStringsProvider[] = {
- { EN_ANY, kPlatformUnknown, { 0x00000065, 0x0000248F, { { 0x4F, 0x60, 0x7F, 0xA7, 0x6F, 0x81, 0xD4, 0xAA, 0x68, 0xD5, 0xAA, 0xBE, 0xBC, 0xD4, 0x92, 0x3A } } } }, // EOB 1
- { EN_ANY, kPlatformUnknown, { 0x0000005D, 0x0000219D, { { 0x87, 0x60, 0x9F, 0xF3, 0x1B, 0x30, 0x4B, 0x2B, 0xE4, 0x94, 0xEF, 0x22, 0xEA, 0x36, 0xE4, 0x7F } } } }, // EOB 2
- { DE_DEU, kPlatformUnknown, { 0x0000006E, 0x00002840, { { 0x04, 0xF8, 0x53, 0x38, 0x09, 0xD8, 0x58, 0xFC, 0x5F, 0xE9, 0x69, 0xFB, 0x9C, 0x0D, 0x92, 0x2E } } } }, // EOB 1
- { DE_DEU, kPlatformUnknown, { 0x00000059, 0x000020D2, { { 0xB6, 0xA1, 0x57, 0xD6, 0x46, 0xE3, 0xCF, 0x04, 0x5A, 0xC8, 0xBB, 0x59, 0x8D, 0xE3, 0x6F, 0xBF } } } }, // EOB 2
- EXTRACT_END_ENTRY
-};
-
-const ExtractEntrySearchData kEoBBaseYesNoStringsProvider[] = {
- { EN_ANY, kPlatformUnknown, { 0x00000007, 0x0000022E, { { 0xF1, 0x30, 0x61, 0xA7, 0x20, 0x71, 0x3B, 0x75, 0xBE, 0xA7, 0xD6, 0x78, 0x34, 0xF7, 0x19, 0x06 } } } },
- { DE_DEU, kPlatformUnknown, { 0x00000008, 0x00000275, { { 0xAF, 0x3E, 0xC5, 0x5A, 0x60, 0x34, 0x9B, 0x39, 0x37, 0x9E, 0xE2, 0x17, 0x23, 0x8E, 0x23, 0x23 } } } },
- EXTRACT_END_ENTRY
-};
-
-const ExtractEntrySearchData kRpgCommonMoreStringsProvider[] = {
- { EN_ANY, kPlatformUnknown, { 0x00000005, 0x00000133, { { 0xA6, 0x1A, 0x3A, 0xB8, 0xCC, 0x92, 0xB8, 0xBE, 0x28, 0xD6, 0x64, 0x8F, 0x0A, 0x2A, 0x39, 0xCD } } } },
- { DE_DEU, kPlatformUnknown, { 0x00000005, 0x0000012C, { { 0x82, 0x30, 0x00, 0xD6, 0xFA, 0x53, 0x17, 0x69, 0x64, 0xCA, 0xFE, 0x0F, 0x92, 0xEF, 0x87, 0x7A } } } },
- EXTRACT_END_ENTRY
-};
-
-const ExtractEntrySearchData kEoBBaseNpcMaxStringsProvider[] = {
- { EN_ANY, kPlatformUnknown, { 0x00000052, 0x00001D23, { { 0x95, 0xB0, 0xBF, 0xF9, 0xE6, 0x8C, 0xCF, 0x9B, 0x36, 0xE3, 0x81, 0x22, 0x1E, 0x68, 0x9E, 0xBE } } } },
- { DE_DEU, kPlatformUnknown, { 0x00000064, 0x00002341, { { 0xC0, 0xA6, 0xCD, 0x5E, 0x8E, 0xFA, 0x89, 0xE4, 0x98, 0xE5, 0x3D, 0x13, 0x6B, 0xE7, 0x8F, 0x6E } } } }, // EoB 1
- { DE_DEU, kPlatformUnknown, { 0x0000003E, 0x00001613, { { 0x4E, 0x31, 0x7F, 0xC4, 0xC7, 0x9C, 0xB5, 0x7D, 0x36, 0x85, 0xD8, 0x81, 0xE2, 0x06, 0xF9, 0xAE } } } }, // EoB 2
- EXTRACT_END_ENTRY
-};
-
-const ExtractEntrySearchData kEoBBaseOkStringsProvider[] = {
- { EN_ANY, kPlatformUnknown, { 0x00000003, 0x0000009A, { { 0x88, 0xD2, 0x76, 0x1C, 0x80, 0x02, 0xC5, 0x5B, 0x35, 0x57, 0x0E, 0xEB, 0xCA, 0xD6, 0xC9, 0x2E } } } },
- { DE_DEU, kPlatformUnknown, { 0x00000003, 0x0000009A, { { 0x88, 0xD2, 0x76, 0x1C, 0x80, 0x02, 0xC5, 0x5B, 0x35, 0x57, 0x0E, 0xEB, 0xCA, 0xD6, 0xC9, 0x2E } } } },
- EXTRACT_END_ENTRY
-};
-
-const ExtractEntrySearchData kEoBBaseNpcJoinStringsProvider[] = {
- { EN_ANY, kPlatformUnknown, { 0x00000015, 0x000006C7, { { 0x5A, 0xBF, 0xA2, 0x3E, 0x36, 0xC4, 0x23, 0xC8, 0xA8, 0x86, 0x06, 0x80, 0xAF, 0xB1, 0xDD, 0xAB } } } },
- { DE_DEU, kPlatformUnknown, { 0x00000020, 0x00000A93, { { 0x4A, 0xFD, 0x70, 0xB7, 0x7A, 0x0B, 0x7C, 0x32, 0x07, 0x5A, 0x4A, 0xC7, 0x84, 0x9D, 0x2D, 0xF3 } } } }, // EoB 1
- { DE_DEU, kPlatformUnknown, { 0x00000018, 0x00000848, { { 0xC9, 0xEE, 0x71, 0x04, 0xA2, 0xA5, 0x52, 0x87, 0x7C, 0x6D, 0x3C, 0x15, 0x7D, 0x41, 0xE0, 0xE7 } } } }, // EoB 2
- EXTRACT_END_ENTRY
-};
-
-const ExtractEntrySearchData kEoBBaseCancelStringsProvider[] = {
- { EN_ANY, kPlatformUnknown, { 0x00000007, 0x000001A6, { { 0x21, 0xED, 0xF9, 0x71, 0xEF, 0x74, 0xD7, 0x9E, 0xF3, 0x02, 0xE5, 0x03, 0x06, 0xDE, 0xD5, 0x09 } } } },
- { DE_DEU, kPlatformUnknown, { 0x0000000A, 0x0000027A, { { 0xBD, 0x88, 0xB2, 0xA0, 0xAF, 0x8D, 0xFE, 0x5B, 0xAC, 0xDF, 0xB5, 0x9F, 0xA0, 0x23, 0x6E, 0xAE } } } }, // EoB 1
- { DE_DEU, kPlatformUnknown, { 0x00000006, 0x00000145, { { 0x22, 0x45, 0x35, 0xC6, 0x28, 0x00, 0x22, 0xAA, 0xD1, 0x15, 0x48, 0xE6, 0xE5, 0x62, 0x73, 0x37 } } } }, // EoB 2
- EXTRACT_END_ENTRY
-};
-
-const ExtractEntrySearchData kEoBBaseAbortStringsProvider[] = {
- { EN_ANY, kPlatformUnknown, { 0x00000006, 0x00000178, { { 0xDD, 0xEC, 0x68, 0x6D, 0x2E, 0x10, 0x34, 0x94, 0x46, 0x25, 0xF9, 0xAB, 0x29, 0x27, 0x32, 0xA8 } } } },
- { DE_DEU, kPlatformUnknown, { 0x00000006, 0x00000145, { { 0x22, 0x45, 0x35, 0xC6, 0x28, 0x00, 0x22, 0xAA, 0xD1, 0x15, 0x48, 0xE6, 0xE5, 0x62, 0x73, 0x37 } } } },
- EXTRACT_END_ENTRY
-};
-
-const ExtractEntrySearchData kEoBBaseMenuStringsMainProvider[] = {
- { EN_ANY, kPlatformUnknown, { 0x00000067, 0x0000245E, { { 0xD9, 0xE0, 0x74, 0x9D, 0x43, 0x96, 0xDC, 0x3B, 0xDF, 0x90, 0x03, 0xDE, 0x91, 0xE6, 0xA0, 0x1E } } } }, // EOB1
- { DE_DEU, kPlatformUnknown, { 0x00000068, 0x000025D9, { { 0x17, 0xEB, 0xAB, 0x4F, 0x95, 0xD1, 0x7F, 0xEB, 0xF4, 0x92, 0x42, 0xD1, 0xD2, 0xA8, 0xC4, 0xA8 } } } }, // EOB1
- { DE_DEU, kPlatformUnknown, { 0x00000069, 0x0000265B, { { 0x4C, 0xA9, 0x38, 0x28, 0xE1, 0xD0, 0xE3, 0x35, 0xBB, 0xDC, 0xFB, 0x6B, 0xAB, 0xB1, 0x62, 0x88 } } } }, // EOB2
- EXTRACT_END_ENTRY
-};
-
-const ExtractEntrySearchData kEoBBaseMenuStringsSaveLoadProvider[] = {
- { EN_ANY, kPlatformUnknown, { 0x00000077, 0x00002513, { { 0x70, 0xD9, 0x48, 0xC2, 0x3A, 0x38, 0x1D, 0xD0, 0x8B, 0x90, 0x08, 0x8D, 0x80, 0xF5, 0x24, 0x59 } } } }, // EOB1
- { DE_DEU, kPlatformUnknown, { 0x00000086, 0x00002D2F, { { 0x2B, 0x48, 0x5C, 0x78, 0xF9, 0xB9, 0xD6, 0xA8, 0x1D, 0xF4, 0x97, 0xAC, 0xF1, 0x09, 0x26, 0xA7 } } } }, // EOB1
- { EN_ANY, kPlatformUnknown, { 0x000000A9, 0x00003850, { { 0xC3, 0x09, 0x7B, 0x18, 0xD6, 0x08, 0x0E, 0x2A, 0xB6, 0x66, 0x43, 0x14, 0xD7, 0x59, 0x34, 0xF7 } } } }, // EOB2
- { DE_DEU, kPlatformUnknown, { 0x000000A2, 0x00003942, { { 0x6E, 0x10, 0x87, 0x4B, 0x80, 0xE8, 0x89, 0xC4, 0x31, 0xDC, 0xAC, 0xA9, 0xA3, 0x8D, 0x79, 0x41 } } } }, // EOB2
- EXTRACT_END_ENTRY
-};
-
-const ExtractEntrySearchData kEoBBaseMenuStringsOnOffProvider[] = {
- { EN_ANY, kPlatformUnknown, { 0x00000007, 0x00000178, { { 0x4D, 0xA7, 0x13, 0x00, 0x05, 0xF2, 0x44, 0xCB, 0xF7, 0x12, 0x72, 0x54, 0xDE, 0x35, 0x04, 0xEC } } } }, // EOB1
- { DE_DEU, kPlatformUnknown, { 0x00000007, 0x00000178, { { 0xC7, 0x6F, 0x60, 0x72, 0x47, 0x89, 0x47, 0xF0, 0x29, 0x57, 0x45, 0x41, 0xD5, 0x80, 0x40, 0x7B } } } }, // EOB2
- EXTRACT_END_ENTRY
-};
-
-const ExtractEntrySearchData kEoBBaseMenuStringsSpellsProvider[] = {
- { EN_ANY, kPlatformUnknown, { 0x000001EF, 0x0000A0D0, { { 0xBA, 0x80, 0x5C, 0xAB, 0x93, 0x19, 0x53, 0x45, 0x17, 0xBC, 0x86, 0x5B, 0x1B, 0x01, 0x3E, 0x98 } } } }, // EOB1
- { DE_DEU, kPlatformUnknown, { 0x000001EA, 0x00009DE0, { { 0x00, 0xB0, 0x1F, 0xE7, 0x16, 0x48, 0x51, 0x25, 0xE5, 0xD8, 0xA1, 0x31, 0x13, 0x81, 0x8D, 0xB6 } } } }, // EOB1
- { EN_ANY, kPlatformUnknown, { 0x000001FB, 0x0000A658, { { 0xAD, 0x6A, 0xFE, 0x13, 0xE5, 0xEA, 0x6A, 0xD1, 0xC9, 0x80, 0x1C, 0xEE, 0xD7, 0x2A, 0xF8, 0xB2 } } } }, // EOB2
- { DE_DEU, kPlatformUnknown, { 0x00000222, 0x0000B1C9, { { 0x24, 0xC8, 0x9B, 0x51, 0xEE, 0x45, 0x14, 0xFC, 0x1B, 0xE4, 0x37, 0x8B, 0xEC, 0x94, 0xD9, 0x0B } } } }, // EOB2
- EXTRACT_END_ENTRY
-};
-
-const ExtractEntrySearchData kEoBBaseMenuStringsRestProvider[] = {
- { EN_ANY, kPlatformUnknown, { 0x000000B3, 0x00003CED, { { 0x82, 0xF9, 0xA1, 0x74, 0xE6, 0x95, 0xA4, 0xFC, 0xE6, 0x5E, 0xB4, 0x43, 0x7D, 0x10, 0xFD, 0x12 } } } }, // EOB1
- { DE_DEU, kPlatformUnknown, { 0x000000B3, 0x00003BE4, { { 0x7F, 0xE8, 0xFE, 0xA4, 0xD9, 0x5C, 0x49, 0x66, 0x38, 0x8F, 0x84, 0xB8, 0xF5, 0x03, 0xCD, 0x70 } } } }, // EOB
- { DE_DEU, kPlatformUnknown, { 0x000000C0, 0x000040A6, { { 0x05, 0x97, 0x45, 0x72, 0xE2, 0x33, 0xBE, 0xDE, 0x56, 0x26, 0x26, 0x15, 0x3A, 0x56, 0x93, 0xFD } } } }, // EOB2
- EXTRACT_END_ENTRY
-};
-
-const ExtractEntrySearchData kEoBBaseMenuStringsDropProvider[] = {
- { EN_ANY, kPlatformUnknown, { 0x0000002E, 0x00000FCA, { { 0x88, 0xCB, 0xD2, 0xB3, 0xDA, 0x36, 0x97, 0x3D, 0xB8, 0x75, 0xFF, 0x36, 0xE1, 0x4E, 0xF4, 0x6D } } } }, // EOB1
- { DE_DEU, kPlatformUnknown, { 0x00000039, 0x0000131E, { { 0x74, 0x0B, 0xE9, 0x04, 0x76, 0x26, 0xD2, 0xE8, 0x03, 0x48, 0x38, 0x18, 0xAC, 0x19, 0xBD, 0x7E } } } }, // EOB1
- { DE_DEU, kPlatformUnknown, { 0x00000033, 0x0000119C, { { 0x8F, 0x2B, 0xC3, 0x01, 0xB2, 0xDE, 0x1F, 0xC6, 0x82, 0xC3, 0x58, 0x7C, 0x50, 0x23, 0x37, 0x65 } } } }, // EOB2
- EXTRACT_END_ENTRY
-};
-
-const ExtractEntrySearchData kEoBBaseMenuStringsExitProvider[] = {
- { EN_ANY, kPlatformUnknown, { 0x0000002B, 0x00000E3D, { { 0x1C, 0xD6, 0x39, 0xA9, 0xC7, 0x3D, 0x32, 0x4A, 0xF2, 0xAE, 0xEC, 0x08, 0x6F, 0xC7, 0xA6, 0x7B } } } }, // EOB1
- { DE_DEU, kPlatformUnknown, { 0x0000002D, 0x00000E68, { { 0x4B, 0x2F, 0x65, 0x39, 0x69, 0xE7, 0x3D, 0x7B, 0x10, 0x15, 0x6F, 0x1F, 0xD8, 0x8E, 0xEA, 0x55 } } } }, // EOB1
- { DE_DEU, kPlatformUnknown, { 0x00000026, 0x00000CBD, { { 0x0C, 0x5D, 0xE4, 0xD2, 0x6F, 0xA3, 0x91, 0xDA, 0x5F, 0xE2, 0x57, 0x77, 0x74, 0x22, 0xE7, 0x85 } } } }, // EOB2
- EXTRACT_END_ENTRY
-};
-
-const ExtractEntrySearchData kEoBBaseMenuStringsStarveProvider[] = {
- { EN_ANY, kPlatformUnknown, { 0x0000003D, 0x0000150C, { { 0x40, 0xEB, 0x79, 0xC3, 0x99, 0x4C, 0xEA, 0xCD, 0x8A, 0xB4, 0x54, 0xB8, 0xAA, 0xEC, 0xAD, 0x4F } } } }, // EOB1
- { DE_DEU, kPlatformUnknown, { 0x00000037, 0x00001296, { { 0x51, 0x3C, 0x90, 0x91, 0x4E, 0x1C, 0x73, 0x2F, 0x0C, 0x7A, 0x6D, 0x03, 0x1E, 0x54, 0x65, 0xF1 } } } }, // EOB1
- { DE_DEU, kPlatformUnknown, { 0x00000030, 0x00001057, { { 0xF3, 0x5E, 0xFC, 0xC3, 0x9D, 0xB5, 0xFE, 0x4E, 0x66, 0x9D, 0x6A, 0xC6, 0x61, 0xC8, 0x0A, 0x17 } } } }, // EOB2
- EXTRACT_END_ENTRY
-};
-
-const ExtractEntrySearchData kEoBBaseMenuStringsScribeProvider[] = {
- { EN_ANY, kPlatformUnknown, { 0x00000103, 0x000055E1, { { 0x1B, 0x56, 0xD2, 0x78, 0x3F, 0x67, 0x7A, 0x5B, 0xB6, 0x2B, 0x70, 0x3D, 0x6A, 0xBB, 0x08, 0x0A } } } }, // EOB1
- { DE_DEU, kPlatformUnknown, { 0x0000010C, 0x00005B1C, { { 0xD7, 0xBF, 0x37, 0x21, 0xA2, 0x63, 0x8C, 0x6A, 0x02, 0x92, 0x13, 0x32, 0xD6, 0xA6, 0x1C, 0xDC } } } }, // EOB1
- { DE_DEU, kPlatformUnknown, { 0x00000100, 0x0000560F, { { 0x69, 0x15, 0x2C, 0x2D, 0xE7, 0x40, 0x4A, 0xE0, 0x86, 0x0D, 0xC8, 0x66, 0x87, 0x1C, 0x27, 0x0B } } } }, // EOB2
- EXTRACT_END_ENTRY
-};
-
-const ExtractEntrySearchData kEoBBaseMenuStringsDrop2Provider[] = {
- { EN_ANY, kPlatformUnknown, { 0x00000084, 0x00002ACE, { { 0xAB, 0x78, 0x42, 0x29, 0xFB, 0xC5, 0x34, 0x96, 0x9D, 0x8A, 0x21, 0x46, 0xE7, 0x6B, 0x06, 0xBA } } } }, // EOB1
- { DE_DEU, kPlatformUnknown, { 0x0000008C, 0x00002D02, { { 0x11, 0x3F, 0x0C, 0xB2, 0xBF, 0xA7, 0x39, 0x23, 0xDC, 0x00, 0xB4, 0xEA, 0x5E, 0xFE, 0x40, 0xB7 } } } }, // EOB1
- { EN_ANY, kPlatformUnknown, { 0x0000008E, 0x00002FFB, { { 0xCE, 0x7A, 0xCC, 0xA4, 0x02, 0x54, 0x1A, 0x78, 0xF1, 0xFC, 0xE6, 0x6C, 0x76, 0xCD, 0xFD, 0x9E } } } }, // EOB2
- { DE_DEU, kPlatformUnknown, { 0x00000090, 0x000031CE, { { 0x01, 0x72, 0x59, 0xBE, 0x62, 0x72, 0xD4, 0x99, 0x76, 0xC9, 0x92, 0x0E, 0xE9, 0x1A, 0xCD, 0x65 } } } }, // EOB2
- EXTRACT_END_ENTRY
-};
-
-const ExtractEntrySearchData kEoBBaseMenuStringsHeadProvider[] = {
- { EN_ANY, kPlatformUnknown, { 0x00000021, 0x00000B27, { { 0x04, 0x06, 0x01, 0xF8, 0x50, 0x54, 0x11, 0x61, 0xFF, 0xB4, 0xE1, 0x97, 0xFA, 0x08, 0xAA, 0x1B } } } }, // EOB1
- { DE_DEU, kPlatformUnknown, { 0x00000024, 0x00000CF5, { { 0x96, 0xD6, 0xB5, 0xB0, 0x2E, 0x71, 0xA4, 0x0A, 0x34, 0x41, 0x94, 0x02, 0x2F, 0xB0, 0x4C, 0x36 } } } }, // EOB1
- { DE_DEU, kPlatformUnknown, { 0x00000025, 0x00000D92, { { 0xE4, 0x73, 0x2D, 0x29, 0xAD, 0x30, 0xE5, 0x8D, 0xAE, 0xC6, 0xD7, 0xF5, 0x35, 0xD8, 0xA4, 0x98 } } } }, // EOB2
- EXTRACT_END_ENTRY
-};
-
-const ExtractEntrySearchData kEoBBaseMenuStringsPoisonProvider[] = {
- { EN_ANY, kPlatformUnknown, { 0x0000002E, 0x00001077, { { 0x14, 0x7E, 0xFC, 0xE0, 0x88, 0xFE, 0x86, 0xA8, 0x96, 0x94, 0xB1, 0x71, 0x90, 0x47, 0x2D, 0x78 } } } }, // EOB1
- { DE_DEU, kPlatformUnknown, { 0x00000036, 0x000013A2, { { 0x18, 0xD9, 0x1D, 0xE5, 0x3D, 0xFD, 0x52, 0xB6, 0x18, 0x17, 0x61, 0xE8, 0xA5, 0x32, 0x9F, 0xA8 } } } }, // EOB1
- { EN_ANY, kPlatformUnknown, { 0x0000002D, 0x00001006, { { 0xD6, 0x0B, 0x11, 0x79, 0xAD, 0x61, 0x5B, 0x3A, 0x72, 0x7D, 0x53, 0x6F, 0xA9, 0x08, 0x73, 0xDC } } } }, // EOB2
- { DE_DEU, kPlatformUnknown, { 0x00000035, 0x000013BE, { { 0x73, 0x38, 0x76, 0x2C, 0x42, 0x87, 0x43, 0x7E, 0x8E, 0x4C, 0x41, 0x57, 0x3F, 0x04, 0xBA, 0x11 } } } }, // EOB2
- EXTRACT_END_ENTRY
-};
-
-const ExtractEntrySearchData kEoBBaseMenuStringsMgcProvider[] = {
- { EN_ANY, kPlatformUnknown, { 0x00000020, 0x00000857, { { 0xD1, 0x9E, 0xBF, 0xF7, 0xCF, 0xF7, 0xD0, 0x94, 0x14, 0x56, 0xD2, 0x4F, 0x59, 0x91, 0x57, 0x52 } } } }, // EOB1
- { DE_DEU, kPlatformUnknown, { 0x00000020, 0x0000086C, { { 0x12, 0x36, 0x84, 0x2F, 0x00, 0xAD, 0x12, 0x42, 0x3A, 0xA2, 0xC5, 0xC9, 0x59, 0x90, 0x64, 0x5F } } } }, // EOB1
- { DE_DEU, kPlatformUnknown, { 0x00000021, 0x0000090B, { { 0x26, 0xA7, 0x58, 0x7C, 0x0C, 0x9E, 0x67, 0xB9, 0x05, 0xE6, 0x91, 0x59, 0xE3, 0xDF, 0x9C, 0x52 } } } }, // EOB2
- EXTRACT_END_ENTRY
-};
-
-const ExtractEntrySearchData kEoBBaseMenuStringsPrefsProvider[] = {
- { EN_ANY, kPlatformUnknown, { 0x00000041, 0x00001392, { { 0xB1, 0x7E, 0xE3, 0x73, 0xB2, 0xA2, 0x63, 0x39, 0x20, 0xE8, 0xF3, 0x38, 0x45, 0xB6, 0xAC, 0xC8 } } } }, // EOB1
- { DE_DEU, kPlatformUnknown, { 0x00000045, 0x000015F6, { { 0x53, 0xBA, 0x7E, 0x6D, 0x24, 0x88, 0x2C, 0x19, 0x10, 0x71, 0x6F, 0xAB, 0x85, 0x8E, 0x97, 0xF6 } } } }, // EOB1
- { DE_DEU, kPlatformUnknown, { 0x0000003D, 0x00001246, { { 0x03, 0xFB, 0x7C, 0x80, 0x33, 0x45, 0x6C, 0x27, 0x89, 0x7B, 0x7C, 0xAC, 0x7A, 0xE1, 0xDE, 0x49 } } } }, // EOB2
- EXTRACT_END_ENTRY
-};
-
-const ExtractEntrySearchData kEoBBaseMenuStringsRest2Provider[] = {
- { EN_ANY, kPlatformUnknown, { 0x0000004D, 0x00001744, { { 0x63, 0xA5, 0x6F, 0x09, 0x6F, 0x5E, 0x4B, 0x89, 0xFF, 0x33, 0x63, 0xCB, 0xAA, 0x04, 0x59, 0x63 } } } }, // EOB1
- { DE_DEU, kPlatformUnknown, { 0x0000004D, 0x00001769, { { 0x2C, 0xA9, 0x7D, 0x4C, 0xC5, 0x13, 0xE2, 0xEB, 0x89, 0x6C, 0xAE, 0x25, 0xC3, 0x3E, 0x56, 0x7E } } } }, // EOB1
- { EN_ANY, kPlatformUnknown, { 0x00000052, 0x000017F6, { { 0x7C, 0x49, 0xFC, 0x89, 0x90, 0x5D, 0xFF, 0x86, 0x86, 0xE9, 0xB2, 0x29, 0x60, 0xB2, 0x22, 0x7F } } } }, // EOB2
- { DE_DEU, kPlatformUnknown, { 0x0000004C, 0x000014FF, { { 0x0C, 0x94, 0x6D, 0x5A, 0x42, 0x68, 0xE0, 0xDC, 0xCD, 0xB9, 0x1A, 0x4A, 0xC1, 0xCC, 0xE6, 0x91 } } } }, // EOB2
- EXTRACT_END_ENTRY
-};
-
-const ExtractEntrySearchData kEoBBaseMenuStringsRest3Provider[] = {
- { EN_ANY, kPlatformUnknown, { 0x0000002B, 0x00000DF4, { { 0x42, 0x90, 0x49, 0xA7, 0x2E, 0x61, 0x77, 0x7F, 0x9F, 0x53, 0xAD, 0x3C, 0x87, 0xE2, 0x0E, 0x36 } } } }, // EOB2
- { DE_DEU, kPlatformUnknown, { 0x00000027, 0x00000D45, { { 0x8D, 0xAB, 0xBF, 0x57, 0xF3, 0x2C, 0x3F, 0x93, 0xBF, 0x33, 0x58, 0x2D, 0x97, 0x78, 0x71, 0x7F } } } }, // EOB2
- EXTRACT_END_ENTRY
-};
-
-const ExtractEntrySearchData kEoBBaseMenuStringsRest4Provider[] = {
- { EN_ANY, kPlatformUnknown, { 0x00000029, 0x00000DEC, { { 0x1C, 0x86, 0x3D, 0x40, 0x2C, 0x5E, 0xCA, 0xA0, 0xA1, 0xB8, 0x23, 0x42, 0x9C, 0x6B, 0xFA, 0xBB } } } }, // EOB1
- { DE_DEU, kPlatformUnknown, { 0x00000034, 0x00001238, { { 0xE9, 0x95, 0x27, 0x79, 0x1C, 0x0D, 0xF5, 0x94, 0x92, 0xFC, 0xCA, 0x22, 0x17, 0xA8, 0x36, 0x96 } } } }, // EOB1
- { EN_ANY, kPlatformUnknown, { 0x0000002A, 0x00000DEB, { { 0x0E, 0xD3, 0xC5, 0xA9, 0x8B, 0x06, 0x57, 0xB0, 0x20, 0x1A, 0xEE, 0x42, 0x49, 0x2E, 0xA1, 0x50 } } } }, // EOB2
- { DE_DEU, kPlatformUnknown, { 0x00000033, 0x00001189, { { 0x56, 0x1B, 0x6B, 0x00, 0x47, 0xFD, 0x56, 0xD3, 0x12, 0x03, 0x79, 0x7D, 0xFF, 0x83, 0xCF, 0xAA } } } }, // EOB2
- EXTRACT_END_ENTRY
-};
-
-const ExtractEntrySearchData kEoBBaseMenuStringsDefeatProvider[] = {
- { EN_ANY, kPlatformUnknown, { 0x0000006D, 0x00002643, { { 0x94, 0xBA, 0xAC, 0xA4, 0x87, 0x6A, 0xEA, 0x7D, 0x98, 0x6E, 0x09, 0x82, 0xE0, 0x16, 0x65, 0x4F } } } }, // EOB1
- { DE_DEU, kPlatformUnknown, { 0x0000006A, 0x00002456, { { 0xE0, 0x9A, 0x10, 0xE2, 0x73, 0x42, 0xF6, 0x79, 0xCB, 0x65, 0xA2, 0x50, 0xF0, 0x2B, 0xFD, 0x9B } } } }, // EOB1
- { EN_ANY, kPlatformUnknown, { 0x00000056, 0x00001E4F, { { 0x97, 0x07, 0x5F, 0xA2, 0x0D, 0x58, 0xD2, 0xDF, 0xD6, 0x04, 0xA2, 0x16, 0x0B, 0x1F, 0x7E, 0x23 } } } }, // EOB2
- { DE_DEU, kPlatformUnknown, { 0x00000042, 0x000016B1, { { 0xCA, 0x57, 0xDC, 0x2B, 0xC6, 0xC7, 0x78, 0x1E, 0x84, 0x0A, 0x10, 0x88, 0xCA, 0xCD, 0xFF, 0x89 } } } }, // EOB2
- EXTRACT_END_ENTRY
-};
-
-const ExtractEntrySearchData kEoBBaseMenuStringsTransferProvider[] = {
- { EN_ANY, kPlatformUnknown, { 0x00000114, 0x00005E09, { { 0xBF, 0xCE, 0x7F, 0xE4, 0x17, 0x15, 0xC6, 0x10, 0xDF, 0x16, 0xF9, 0x3C, 0xDA, 0x29, 0xA0, 0xA6 } } } }, // EOB2
- { DE_DEU, kPlatformUnknown, { 0x000000D1, 0x00004811, { { 0x2E, 0x00, 0xD1, 0xA6, 0x9F, 0x53, 0xC5, 0x4B, 0x25, 0x4A, 0xAC, 0x9E, 0x11, 0x6C, 0x58, 0x5E } } } }, // EOB2
- EXTRACT_END_ENTRY
-};
-
-const ExtractEntrySearchData kEoBBaseMenuStringsSpecProvider[] = {
- { EN_ANY, kPlatformUnknown, { 0x0000006F, 0x00002785, { { 0xAE, 0xC7, 0x88, 0x89, 0x39, 0xB8, 0xF7, 0xB4, 0xD5, 0x82, 0xBC, 0x46, 0xA1, 0xCB, 0x04, 0x1F } } } }, // EOB2
- { DE_DEU, kPlatformUnknown, { 0x00000075, 0x00002871, { { 0xB4, 0x38, 0x0F, 0x94, 0x8B, 0xB1, 0x8D, 0xA3, 0xF8, 0xDA, 0x37, 0x75, 0x6F, 0x39, 0x3E, 0xB5 } } } }, // EOB2
- EXTRACT_END_ENTRY
-};
-
-const ExtractEntrySearchData kEoBBaseMenuStringsSpellNoProvider[] = {
- { UNK_LANG, kPlatformUnknown, { 0x00000006, 0x000000A5, { { 0x0D, 0x4A, 0x8B, 0x40, 0x70, 0x79, 0xCD, 0xB3, 0x0F, 0x5A, 0x5A, 0x3F, 0x6E, 0xE8, 0xF9, 0x74 } } } }, // EOB2
- EXTRACT_END_ENTRY
-};
-
-const ExtractEntrySearchData kEoBBaseMenuYesNoStringsProvider[] = {
- { EN_ANY, kPlatformUnknown, { 0x00000007, 0x000001EE, { { 0x8C, 0xF1, 0x35, 0x1F, 0xD6, 0x1F, 0xA4, 0xA1, 0xD6, 0xD6, 0x0A, 0x27, 0xB9, 0xFC, 0x9E, 0x62 } } } },
- { DE_DEU, kPlatformUnknown, { 0x00000008, 0x00000235, { { 0xC7, 0x06, 0xCF, 0xA8, 0xC0, 0xDE, 0xD4, 0x8C, 0x7F, 0xA2, 0x3A, 0xD3, 0x48, 0x51, 0x36, 0x89 } } } },
- EXTRACT_END_ENTRY
-};
-
-const ExtractEntrySearchData kEoBBaseSpellLevelsMageProvider[] = {
- { UNK_LANG, kPlatformUnknown, { 0x0000001A, 0x00000042, { { 0x4F, 0xA3, 0x70, 0x0F, 0x6D, 0xB4, 0xC2, 0xAF, 0x12, 0xB4, 0x2E, 0x26, 0xEF, 0x0B, 0x37, 0x92 } } } }, // EOB1
- { UNK_LANG, kPlatformUnknown, { 0x00000023, 0x00000074, { { 0xBE, 0x10, 0xFA, 0xD9, 0xB3, 0xB0, 0x4E, 0x73, 0xC9, 0xA1, 0xE2, 0xCE, 0xE8, 0xEC, 0x85, 0x0F } } } }, // EOB2
- EXTRACT_END_ENTRY
-};
-
-const ExtractEntrySearchData kEoBBaseSpellLevelsClericProvider[] = {
- { UNK_LANG, kPlatformUnknown, { 0x00000019, 0x00000045, { { 0x9E, 0xDA, 0xF2, 0x94, 0x3E, 0x0B, 0xA0, 0x23, 0x08, 0x41, 0xD5, 0x3C, 0x61, 0x77, 0xFD, 0x78 } } } }, // EOB1
- { UNK_LANG, kPlatformUnknown, { 0x0000001D, 0x00000066, { { 0xDB, 0x7F, 0x93, 0xE2, 0x2E, 0xCF, 0x69, 0xCC, 0x2A, 0xEF, 0x7C, 0x1E, 0x92, 0x6B, 0x51, 0x4E } } } }, // EOB2
- EXTRACT_END_ENTRY
-};
-
-const ExtractEntrySearchData kEoBBaseNumSpellsClericProvider[] = {
- { UNK_LANG, kPlatformUnknown, { 0x00000032, 0x0000004C, { { 0x87, 0xDD, 0xD0, 0xF8, 0x52, 0x84, 0x26, 0xC4, 0x9C, 0x5D, 0x0E, 0x46, 0x1A, 0xE8, 0x19, 0xD6 } } } }, // EOB1
- { UNK_LANG, kPlatformUnknown, { 0x00000088, 0x00000114, { { 0xA0, 0xB7, 0x2F, 0xED, 0x50, 0xE7, 0xC6, 0x11, 0xC9, 0x25, 0xB2, 0xB9, 0x81, 0xFB, 0xD8, 0x59 } } } }, // EOB2
- EXTRACT_END_ENTRY
-};
-
-const ExtractEntrySearchData kEoBBaseNumSpellsWisAdjProvider[] = {
- { UNK_LANG, kPlatformUnknown, { 0x00000028, 0x0000001D, { { 0xA5, 0xCA, 0x1D, 0x96, 0xAE, 0x89, 0xBC, 0x7A, 0x32, 0x50, 0xCE, 0x44, 0x5D, 0x93, 0x25, 0x4B } } } }, // EOB1
- { UNK_LANG, kPlatformUnknown, { 0x00000040, 0x0000001D, { { 0x07, 0x31, 0x0D, 0x12, 0x55, 0x11, 0x11, 0xB6, 0x68, 0xC7, 0xEE, 0xDE, 0xC6, 0xED, 0x82, 0x5A } } } }, // EOB2
- EXTRACT_END_ENTRY
-};
-
-const ExtractEntrySearchData kEoBBaseNumSpellsPalProvider[] = {
- { UNK_LANG, kPlatformUnknown, { 0x0000003C, 0x00000012, { { 0x96, 0x7E, 0x17, 0x9E, 0xFD, 0x39, 0xC9, 0x3A, 0xB7, 0x3E, 0x8D, 0xA8, 0xED, 0xA3, 0x07, 0xEB } } } }, // EOB1
- { UNK_LANG, kPlatformUnknown, { 0x00000088, 0x0000002F, { { 0x19, 0x1A, 0x9B, 0x42, 0xA0, 0x67, 0x10, 0x1A, 0xAC, 0x00, 0x0F, 0xF7, 0xBE, 0x04, 0x61, 0x36 } } } }, // EOB2
- EXTRACT_END_ENTRY
-};
-
-const ExtractEntrySearchData kEoBBaseNumSpellsMageProvider[] = {
- { UNK_LANG, kPlatformUnknown, { 0x00000037, 0x0000005E, { { 0x61, 0x30, 0x1A, 0x74, 0x9B, 0x4C, 0x8C, 0x83, 0xD5, 0xE6, 0x39, 0x6E, 0xCA, 0x18, 0x16, 0x63 } } } }, // EOB1
- { UNK_LANG, kPlatformUnknown, { 0x00000114, 0x00000102, { { 0x33, 0xEE, 0x32, 0x9C, 0xB2, 0xB3, 0x60, 0x66, 0x91, 0xE0, 0x90, 0x0E, 0x8F, 0xE1, 0xA5, 0x4A } } } }, // EOB2
- EXTRACT_END_ENTRY
-};
-
-const ExtractEntrySearchData kEoBBaseCharGuiStringsHpProvider[] = {
- { EN_ANY, kPlatformUnknown, { 0x0000000F, 0x00000352, { { 0x9C, 0x13, 0x3D, 0x2A, 0x68, 0x11, 0x81, 0xA4, 0x77, 0x54, 0x47, 0x43, 0xA1, 0xDA, 0x55, 0x50 } } } },
- { DE_DEU, kPlatformUnknown, { 0x0000000E, 0x000002AC, { { 0xBB, 0xD5, 0x36, 0xB2, 0x8A, 0x60, 0x78, 0x04, 0x46, 0x2D, 0x35, 0x59, 0x3E, 0x42, 0xB9, 0x83 } } } }, // EoB 1
- { DE_DEU, kPlatformUnknown, { 0x0000000E, 0x000002B8, { { 0x77, 0x76, 0xA0, 0x38, 0xE9, 0xB6, 0x0C, 0x43, 0xFE, 0x5A, 0x51, 0xC7, 0x1B, 0x59, 0xD3, 0x63 } } } }, // EoB 2
- EXTRACT_END_ENTRY
-};
-
-const ExtractEntrySearchData kEoBBaseCharGuiStringsWp1Provider[] = {
- { EN_ANY, kPlatformUnknown, { 0x0000000A, 0x00000253, { { 0x1D, 0xF4, 0xB9, 0x56, 0xE6, 0x16, 0x7D, 0x08, 0xA4, 0x00, 0x1E, 0x1A, 0x60, 0x49, 0xE9, 0x29 } } } },
- { DE_DEU, kPlatformUnknown, { 0x0000000A, 0x00000236, { { 0x17, 0xEC, 0x54, 0xA0, 0x43, 0xFB, 0x52, 0x66, 0xC5, 0x44, 0x1B, 0xDF, 0x95, 0x47, 0x62, 0xB3 } } } },
- EXTRACT_END_ENTRY
-};
-
-const ExtractEntrySearchData kEoBBaseCharGuiStringsWp2Provider[] = {
- { EN_ANY, kPlatformUnknown, { 0x0000000F, 0x00000371, { { 0x42, 0xF4, 0x52, 0x60, 0x20, 0xFC, 0x34, 0x94, 0x49, 0x1E, 0x67, 0x54, 0xB5, 0x6A, 0x97, 0x2A } } } },
- { DE_DEU, kPlatformUnknown, { 0x00000010, 0x000003D6, { { 0x10, 0xD1, 0x77, 0x6C, 0xCD, 0x00, 0x94, 0xC7, 0xD0, 0x53, 0x47, 0x9F, 0x70, 0x77, 0x50, 0xD1 } } } },
- EXTRACT_END_ENTRY
-};
-
-const ExtractEntrySearchData kEoBBaseCharGuiStringsWrProvider[] = {
- { EN_ANY, kPlatformUnknown, { 0x00000014, 0x00000477, { { 0xAA, 0x26, 0xD5, 0xFD, 0xE6, 0x16, 0x53, 0x19, 0x39, 0x46, 0xEB, 0xCD, 0x88, 0xEC, 0x5E, 0xCB } } } },
- { DE_DEU, kPlatformUnknown, { 0x00000015, 0x000004A4, { { 0x53, 0x54, 0x37, 0x35, 0x27, 0x1F, 0xB9, 0x09, 0x9C, 0xE9, 0x5E, 0x11, 0xBD, 0x8F, 0x15, 0xAE } } } }, // EoB 1
- { DE_DEU, kPlatformUnknown, { 0x00000011, 0x00000402, { { 0xE0, 0x92, 0xF4, 0x49, 0xB7, 0x74, 0xBB, 0xEB, 0x90, 0x0D, 0x75, 0x65, 0xBB, 0xF6, 0xB6, 0xE9 } } } }, // EoB 2
- EXTRACT_END_ENTRY
-};
-
-const ExtractEntrySearchData kEoBBaseCharGuiStringsSt1Provider[] = {
- { EN_ANY, kPlatformUnknown, { 0x0000003B, 0x0000104B, { { 0xC0, 0xD9, 0x0F, 0x7B, 0x6D, 0x17, 0x02, 0xBD, 0x7B, 0xB1, 0x76, 0x72, 0xA1, 0xEE, 0x5E, 0xAD } } } },
- { DE_DEU, kPlatformUnknown, { 0x00000039, 0x00000F69, { { 0x09, 0x42, 0x35, 0x47, 0x48, 0x50, 0x05, 0x09, 0x3B, 0x81, 0x14, 0x01, 0xF9, 0xB5, 0x04, 0xB2 } } } },
- EXTRACT_END_ENTRY
-};
-
-const ExtractEntrySearchData kEoBBaseCharGuiStringsSt2Provider[] = {
- { EN_ANY, kPlatformUnknown, { 0x00000045, 0x000012E7, { { 0x49, 0x48, 0x30, 0x73, 0xDA, 0x42, 0xDB, 0xB9, 0xF4, 0x07, 0x00, 0x26, 0x96, 0x1F, 0x02, 0x4E } } } },
- { DE_DEU, kPlatformUnknown, { 0x00000042, 0x0000114D, { { 0x88, 0x6E, 0x45, 0xF9, 0xAE, 0xEF, 0xE8, 0x54, 0x9C, 0xEF, 0xD2, 0x73, 0x78, 0x41, 0xD9, 0xAF } } } },
- EXTRACT_END_ENTRY
-};
-
-const ExtractEntrySearchData kEoBBaseCharGuiStringsInProvider[] = {
- { EN_ANY, kPlatformUnknown, { 0x00000023, 0x000008CB, { { 0xF0, 0xE9, 0xF1, 0x05, 0x47, 0x3A, 0x5D, 0xCA, 0x9F, 0x75, 0x9D, 0x51, 0x9E, 0xEC, 0x9B, 0x67 } } } },
- { DE_DEU, kPlatformUnknown, { 0x00000020, 0x00000810, { { 0xF5, 0x39, 0x1E, 0x0E, 0x65, 0xEF, 0x09, 0xF2, 0x8D, 0x90, 0xC4, 0xF6, 0x8A, 0xED, 0xAD, 0xDF } } } }, // EoB 1
- { DE_DEU, kPlatformUnknown, { 0x00000023, 0x00000940, { { 0xAB, 0xF6, 0xE4, 0xD4, 0x07, 0x07, 0xDA, 0x92, 0x71, 0xE2, 0x73, 0x1F, 0x06, 0xE3, 0x12, 0xEB } } } }, // EoB 2
- EXTRACT_END_ENTRY
-};
-
-const ExtractEntrySearchData kEoBBaseCharStatusStrings7Provider[] = {
- { EN_ANY, kPlatformUnknown, { 0x00000022, 0x00000B95, { { 0xCB, 0xB7, 0x16, 0x77, 0x9C, 0xEB, 0x70, 0x83, 0xB2, 0xBE, 0xF7, 0x67, 0xB1, 0xE9, 0xD0, 0x5E } } } }, // EOB 1 + 2
- { DE_DEU, kPlatformUnknown, { 0x0000002B, 0x00000EE3, { { 0xC8, 0x81, 0x23, 0xC3, 0x03, 0xBD, 0x4C, 0xF5, 0x41, 0x47, 0xFA, 0x32, 0xA0, 0x98, 0x0A, 0x8E } } } }, // EOB 1
- { DE_DEU, kPlatformUnknown, { 0x00000023, 0x00000C68, { { 0xF5, 0x55, 0x09, 0xD8, 0x73, 0xF8, 0xF0, 0xE3, 0x14, 0xCD, 0x78, 0x84, 0x58, 0xB0, 0x64, 0x5B } } } }, // EOB 2
- EXTRACT_END_ENTRY
-};
-
-const ExtractEntrySearchData kEoBBaseCharStatusStrings81Provider[] = {
- { EN_ANY, kPlatformUnknown, { 0x00000021, 0x00000B03, { { 0x44, 0xFC, 0xC2, 0x23, 0x4B, 0x78, 0xA8, 0xF8, 0xA5, 0x46, 0x5B, 0x89, 0x1F, 0x9D, 0x4E, 0xFA } } } }, // EOB 1
- { DE_DEU, kPlatformUnknown, { 0x00000020, 0x00000A52, { { 0x81, 0xDA, 0x22, 0x8A, 0xD3, 0x7D, 0xE7, 0xF5, 0x39, 0x6A, 0x62, 0x41, 0xE5, 0x8D, 0x45, 0x20 } } } }, // EOB 1
-};
-
-const ExtractEntrySearchData kEoBBaseCharStatusStrings82Provider[] = {
- { EN_ANY, kPlatformUnknown, { 0x00000023, 0x00000B0F, { { 0xBD, 0xED, 0xFE, 0xFD, 0x40, 0x95, 0x42, 0x21, 0x1F, 0x55, 0x67, 0x65, 0xA8, 0xC3, 0x99, 0xA1 } } } }, // EOB 2
- { DE_DEU, kPlatformUnknown, { 0x0000001A, 0x00000789, { { 0x8C, 0xF3, 0xB8, 0x3C, 0x6E, 0x85, 0xED, 0xD6, 0x2B, 0xD7, 0xAE, 0x8A, 0xFC, 0x25, 0x5E, 0x8F } } } }, // EOB 2
- EXTRACT_END_ENTRY
-};
-
-const ExtractEntrySearchData kEoBBaseCharStatusStrings9Provider[] = {
- { EN_ANY, kPlatformUnknown, { 0x0000001C, 0x00000952, { { 0x2F, 0x41, 0x17, 0x95, 0xF8, 0xC8, 0x4E, 0x88, 0xC6, 0x83, 0x38, 0x9B, 0xAB, 0x23, 0x48, 0xB9 } } } }, // EOB 1 + 2
- { DE_DEU, kPlatformUnknown, { 0x0000001D, 0x0000099F, { { 0x5E, 0xB4, 0xBE, 0xA9, 0x0C, 0xB2, 0xF2, 0x4E, 0x63, 0xF8, 0x7B, 0x98, 0x67, 0x2D, 0xC9, 0xBF } } } }, // EOB 1
- { DE_DEU, kPlatformUnknown, { 0x0000001E, 0x00000A52, { { 0xD4, 0x65, 0x3F, 0x35, 0xDD, 0x8A, 0x33, 0x44, 0x2F, 0x8C, 0xAC, 0x2F, 0xEC, 0x96, 0x5B, 0x02 } } } }, // EOB 2
- EXTRACT_END_ENTRY
-};
-
-const ExtractEntrySearchData kEoBBaseCharStatusStrings12Provider[] = {
- { EN_ANY, kPlatformUnknown, { 0x00000010, 0x00000503, { { 0x81, 0x22, 0xE9, 0x0F, 0xA5, 0xEA, 0xFE, 0xB5, 0xB6, 0x43, 0x36, 0x22, 0x87, 0x24, 0x2C, 0x40 } } } },
- { DE_DEU, kPlatformUnknown, { 0x00000014, 0x00000683, { { 0x5A, 0xF8, 0xAA, 0x16, 0x97, 0xBE, 0xD5, 0x22, 0xCE, 0x3F, 0xBC, 0x00, 0x44, 0xC1, 0x27, 0xD3 } } } },
- EXTRACT_END_ENTRY
-};
-
-const ExtractEntrySearchData kEoBBaseCharStatusStrings131Provider[] = {
- { EN_ANY, kPlatformUnknown, { 0x0000000B, 0x0000027A, { { 0x70, 0x1A, 0x83, 0x35, 0x0A, 0x51, 0xEA, 0x27, 0x6E, 0xCD, 0xEB, 0xAD, 0x20, 0x74, 0x28, 0x7D } } } },
- { DE_DEU, kPlatformUnknown, { 0x0000000C, 0x000002EE, { { 0xFE, 0xF9, 0x45, 0xE7, 0x89, 0x7B, 0xA4, 0x82, 0x90, 0x63, 0x91, 0x5B, 0x9E, 0x83, 0x80, 0x10 } } } },
- EXTRACT_END_ENTRY
-};
-
-const ExtractEntrySearchData kEoBBaseCharStatusStrings132Provider[] = {
- { EN_ANY, kPlatformUnknown, { 0x0000000D, 0x00000286, { { 0x00, 0x1E, 0x11, 0xCC, 0x57, 0xFA, 0xEF, 0x2A, 0x0A, 0xFF, 0xFF, 0xE9, 0x3E, 0xA3, 0x62, 0x21 } } } },
- { DE_DEU, kPlatformUnknown, { 0x0000000A, 0x0000018A, { { 0x10, 0x54, 0x6F, 0xC3, 0x08, 0xC4, 0xD2, 0xBB, 0x34, 0x0A, 0x04, 0x65, 0x49, 0xFC, 0x5E, 0x15 } } } },
- EXTRACT_END_ENTRY
-};
-
-const ExtractEntrySearchData kEoBBaseLevelGainStringsProvider[] = {
- { EN_ANY, kPlatformUnknown, { 0x0000002A, 0x00000CC9, { { 0xF2, 0x1F, 0xDF, 0xE0, 0xA5, 0x86, 0x46, 0xF4, 0xFC, 0x71, 0xB0, 0x22, 0x32, 0x46, 0x71, 0xB6 } } } }, // EOB 1
- { DE_DEU, kPlatformUnknown, { 0x00000029, 0x00000D38, { { 0x18, 0xA3, 0xFD, 0xCC, 0xF2, 0x68, 0x18, 0x9E, 0x80, 0x5A, 0xC0, 0x22, 0xFD, 0x15, 0x83, 0x84 } } } }, // EOB 1
- { EN_ANY, kPlatformUnknown, { 0x0000001C, 0x0000078C, { { 0x15, 0x70, 0x37, 0xE4, 0x0B, 0x50, 0x32, 0xCA, 0xAE, 0xF6, 0x81, 0xD0, 0x98, 0x9B, 0x36, 0x8A } } } }, // EOB 2
- { DE_DEU, kPlatformUnknown, { 0x0000001F, 0x000008E3, { { 0x07, 0x2C, 0x51, 0x5E, 0x47, 0xAA, 0xCC, 0x27, 0x77, 0xD8, 0x17, 0x59, 0x6B, 0xBE, 0xF5, 0x87 } } } }, // EOB 2
- EXTRACT_END_ENTRY
-};
-
-const ExtractEntrySearchData kEoBBaseExperienceTable0Provider[] = {
- { UNK_LANG, kPlatformUnknown, { 0x00000030, 0x00000C9E, { { 0xDB, 0x47, 0xD9, 0x0D, 0x6E, 0x68, 0x04, 0xE4, 0x17, 0xCB, 0x60, 0x89, 0x35, 0x3E, 0xA9, 0xEE } } } }, // EoB 1
- { UNK_LANG, kPlatformUnknown, { 0x00000038, 0x00000E24, { { 0xBC, 0xF3, 0x96, 0x8A, 0xD5, 0x0C, 0xAA, 0x94, 0xBB, 0xB5, 0x08, 0x73, 0xF8, 0x5C, 0xF0, 0xA9 } } } }, // EoB 2
- EXTRACT_END_ENTRY
-};
-
-const ExtractEntrySearchData kEoBBaseExperienceTable1Provider[] = {
- { UNK_LANG, kPlatformUnknown, { 0x00000030, 0x00000C80, { { 0x35, 0x45, 0x0D, 0x4F, 0xE0, 0x84, 0xA2, 0x1B, 0xB0, 0x0D, 0x60, 0x4D, 0x1D, 0xD5, 0x6C, 0x72 } } } }, // EoB 1
- { UNK_LANG, kPlatformUnknown, { 0x00000038, 0x00000E6F, { { 0xBD, 0x3F, 0x42, 0x54, 0x75, 0x41, 0xAA, 0x58, 0x0D, 0xD8, 0xC0, 0x07, 0x63, 0x35, 0x83, 0x6B } } } }, // EoB 2
- EXTRACT_END_ENTRY
-};
-
-const ExtractEntrySearchData kEoBBaseExperienceTable2Provider[] = {
- { UNK_LANG, kPlatformUnknown, { 0x0000002C, 0x00000E10, { { 0xA5, 0x4D, 0xCB, 0xF3, 0x5F, 0x89, 0x71, 0x24, 0x6F, 0x70, 0xCA, 0x51, 0xAA, 0x1C, 0x0A, 0x97 } } } }, // EoB 1
- { UNK_LANG, kPlatformUnknown, { 0x00000038, 0x00001149, { { 0xF9, 0xF1, 0x7E, 0x6B, 0xB2, 0xFE, 0x04, 0xC4, 0x29, 0x3D, 0xE3, 0x42, 0x5D, 0x92, 0x77, 0x53 } } } }, // EoB 2
- EXTRACT_END_ENTRY
-};
-
-const ExtractEntrySearchData kEoBBaseExperienceTable3Provider[] = {
- { UNK_LANG, kPlatformUnknown, { 0x00000030, 0x00000ADC, { { 0x42, 0x2E, 0x2E, 0xF5, 0xF8, 0x65, 0x69, 0x28, 0x50, 0x67, 0x43, 0xDF, 0x91, 0x67, 0x9B, 0x09 } } } }, // EoB 1
- { UNK_LANG, kPlatformUnknown, { 0x00000038, 0x00000C94, { { 0x67, 0x09, 0x98, 0x19, 0x1F, 0x6B, 0x4D, 0xEB, 0x1D, 0x4D, 0x55, 0xA8, 0xFF, 0xD1, 0xAB, 0xE1 } } } }, // EoB 2
- EXTRACT_END_ENTRY
-};
-
-const ExtractEntrySearchData kEoBBaseExperienceTable4Provider[] = {
- { UNK_LANG, kPlatformUnknown, { 0x00000030, 0x00000DA7, { { 0x45, 0x58, 0x34, 0xC9, 0x09, 0x61, 0xD7, 0xE1, 0xF8, 0x68, 0x80, 0xBC, 0xEF, 0x7A, 0x24, 0x03 } } } }, // EoB 1
- { UNK_LANG, kPlatformUnknown, { 0x00000038, 0x00000FE1, { { 0x26, 0x7F, 0x83, 0x53, 0x4A, 0xC6, 0xA2, 0x7B, 0xD2, 0xFB, 0x73, 0xB2, 0x08, 0x0A, 0xF7, 0xFD } } } }, // EoB 2
- EXTRACT_END_ENTRY
-};
-
-const ExtractEntrySearchData kEoBBaseWllFlagPresetProvider[] = {
- { UNK_LANG, kPlatformUnknown, { 0x00000019, 0x00000BD9, { { 0xBE, 0x5A, 0xA6, 0xC8, 0xE4, 0x04, 0x4C, 0x32, 0x35, 0x61, 0x48, 0x73, 0x29, 0xA9, 0x99, 0x54 } } } }, // EoB 1
- { UNK_LANG, kPlatformUnknown, { 0x00000019, 0x00000BC9, { { 0x56, 0xC0, 0x66, 0x4D, 0xE1, 0x3A, 0x27, 0x89, 0x9D, 0x73, 0x63, 0x93, 0x08, 0x2B, 0x13, 0xBC } } } }, // EoB 2
- EXTRACT_END_ENTRY
-};
-
-const ExtractEntrySearchData kEoBBaseDscShapeCoordsProvider[] = {
- { UNK_LANG, kPlatformUnknown, { 0x00000168, 0x0000F206, { { 0xB8, 0xDF, 0x10, 0xBB, 0x06, 0xA1, 0x46, 0xC6, 0xD2, 0xE3, 0xD7, 0x64, 0x4A, 0xC6, 0x40, 0xC0 } } } },
- EXTRACT_END_ENTRY
-};
-
-const ExtractEntrySearchData kEoBBaseDscDoorScaleOffsProvider[] = {
- { UNK_LANG, kPlatformDOS, { 0x00000020, 0x0000010F, { { 0x7B, 0x7D, 0x03, 0xDE, 0x33, 0x95, 0xB8, 0xFD, 0xAD, 0x72, 0x44, 0x7D, 0x47, 0xFE, 0x04, 0x3D } } } }, // EoB1
- { UNK_LANG, kPlatformDOS, { 0x00000035, 0x00000139, { { 0x74, 0x63, 0x18, 0xE7, 0xAB, 0xA4, 0x22, 0xCF, 0x32, 0x19, 0x28, 0x9E, 0x7F, 0x97, 0xA7, 0x37 } } } }, // EoB2
- EXTRACT_END_ENTRY
-};
-
-const ExtractEntrySearchData kEoBBaseDscDoorScaleMult1Provider[] = {
- { UNK_LANG, kPlatformDOS, { 0x00000004, 0x00000026, { { 0x5D, 0x17, 0xFB, 0x6A, 0x7F, 0x51, 0x55, 0xFB, 0x55, 0xB9, 0x50, 0xB0, 0x7F, 0xE4, 0xDF, 0x67 } } } },
- EXTRACT_END_ENTRY
-};
-
-const ExtractEntrySearchData kEoBBaseDscDoorScaleMult2Provider[] = {
- { UNK_LANG, kPlatformDOS, { 0x00000004, 0x00000006, { { 0x98, 0xD8, 0xF8, 0x0C, 0x98, 0xC4, 0xF1, 0x87, 0x59, 0x32, 0x78, 0x31, 0xFA, 0x98, 0x8A, 0x43 } } } },
- EXTRACT_END_ENTRY
-};
-
-const ExtractEntrySearchData kEoBBaseDscDoorScaleMult3Provider[] = {
- { UNK_LANG, kPlatformDOS, { 0x00000004, 0x00000013, { { 0xEE, 0xB6, 0xA5, 0x6E, 0x0C, 0x8E, 0xAB, 0x38, 0xD9, 0x23, 0xC6, 0x21, 0xB3, 0x7E, 0x97, 0x78 } } } }, // EOB 1
- { UNK_LANG, kPlatformDOS, { 0x00000004, 0x00000019, { { 0x86, 0xD8, 0x04, 0xD2, 0x66, 0x6F, 0x43, 0x24, 0x2E, 0x93, 0xB9, 0xAE, 0xEB, 0x44, 0xCA, 0x48 } } } }, // EOB 2
- EXTRACT_END_ENTRY
-};
-
-const ExtractEntrySearchData kEoBBaseDscDoorScaleMult4Provider[] = {
- { UNK_LANG, kPlatformDOS, { 0x00000004, 0x00000006, { { 0x98, 0xD8, 0xF8, 0x0C, 0x98, 0xC4, 0xF1, 0x87, 0x59, 0x32, 0x78, 0x31, 0xFA, 0x98, 0x8A, 0x43 } } } },
- EXTRACT_END_ENTRY
-};
-
-const ExtractEntrySearchData kEoBBaseDscDoorScaleMult5Provider[] = {
- { UNK_LANG, kPlatformDOS, { 0x00000004, 0x00000020, { { 0x37, 0xA1, 0x0D, 0x64, 0xD6, 0x1E, 0xBA, 0xA3, 0xD9, 0x0A, 0x6C, 0xAB, 0x6B, 0xA3, 0x59, 0x24 } } } },
- EXTRACT_END_ENTRY
-};
-
-const ExtractEntrySearchData kEoBBaseDscDoorScaleMult6Provider[] = {
- { UNK_LANG, kPlatformDOS, { 0x00000004, 0x00000006, { { 0x98, 0xD8, 0xF8, 0x0C, 0x98, 0xC4, 0xF1, 0x87, 0x59, 0x32, 0x78, 0x31, 0xFA, 0x98, 0x8A, 0x43 } } } },
- EXTRACT_END_ENTRY
-};
-
-const ExtractEntrySearchData kEoBBaseDscDoorType5OffsProvider[] = {
- { UNK_LANG, kPlatformDOS, { 0x00000006, 0x00000012, { { 0x73, 0xBB, 0x61, 0xD6, 0xA7, 0x75, 0xC8, 0x7B, 0xD6, 0xA4, 0x53, 0x1B, 0x54, 0xE9, 0x30, 0x3F } } } },
- EXTRACT_END_ENTRY
-};
-
-const ExtractEntrySearchData kEoBBaseDscDoorXEProvider[] = {
- { UNK_LANG, kPlatformDOS, { 0x00000020, 0x0000010F, { { 0x7B, 0x7D, 0x03, 0xDE, 0x33, 0x95, 0xB8, 0xFD, 0xAD, 0x72, 0x44, 0x7D, 0x47, 0xFE, 0x04, 0x3D } } } },
- EXTRACT_END_ENTRY
-};
-
-const ExtractEntrySearchData kEoBBaseDscDoorY1Provider[] = {
- { UNK_LANG, kPlatformDOS, { 0x00000004, 0x000000D7, { { 0x25, 0xAE, 0xF4, 0x99, 0xE8, 0x97, 0x47, 0xAE, 0x75, 0xF3, 0xA9, 0x70, 0x4C, 0x70, 0xF3, 0x11 } } } }, // EOB 1
- { UNK_LANG, kPlatformDOS, { 0x00000004, 0x000000D8, { { 0xB4, 0xAA, 0x0D, 0x91, 0x58, 0x22, 0x16, 0xCF, 0xC5, 0x9D, 0x8D, 0xA1, 0xB4, 0x40, 0x83, 0x0E } } } }, // EOB 2
- EXTRACT_END_ENTRY
-};
-
-const ExtractEntrySearchData kEoBBaseDscDoorY3Provider[] = {
- { UNK_LANG, kPlatformDOS, { 0x00000004, 0x00000058, { { 0xF0, 0x3C, 0x3B, 0x97, 0x10, 0x95, 0x89, 0x18, 0x3B, 0xA9, 0xE8, 0x77, 0x9B, 0x10, 0xDC, 0xF1 } } } },
- EXTRACT_END_ENTRY
-};
-
-const ExtractEntrySearchData kEoBBaseDscDoorY4Provider[] = {
- { UNK_LANG, kPlatformDOS, { 0x00000004, 0x00000076, { { 0x84, 0xB6, 0x8F, 0x7E, 0x9A, 0x17, 0xAC, 0x59, 0xB1, 0x4C, 0xDE, 0x11, 0xA6, 0x95, 0xE3, 0x76 } } } },
- EXTRACT_END_ENTRY
-};
-
-const ExtractEntrySearchData kEoBBaseDscDoorY5Provider[] = {
- { UNK_LANG, kPlatformDOS, { 0x00000004, 0x000000D9, { { 0x5D, 0x27, 0x1D, 0xD6, 0x5F, 0x98, 0xF9, 0x7D, 0x65, 0x7B, 0xE0, 0x67, 0x34, 0xA0, 0xE8, 0x30 } } } },
- EXTRACT_END_ENTRY
-};
-
-const ExtractEntrySearchData kEoBBaseDscDoorY6Provider[] = {
- { UNK_LANG, kPlatformDOS, { 0x00000004, 0x000000D9, { { 0x4D, 0x15, 0x4A, 0xF1, 0x17, 0x09, 0xC1, 0xA6, 0x08, 0x4A, 0xCD, 0xB2, 0x68, 0xC2, 0x59, 0x52 } } } },
- EXTRACT_END_ENTRY
-};
-
-const ExtractEntrySearchData kEoBBaseDscDoorY7Provider[] = {
- { UNK_LANG, kPlatformDOS, { 0x00000004, 0x000000DA, { { 0xA9, 0x24, 0x71, 0x8A, 0x18, 0x24, 0x6D, 0x0A, 0x65, 0x12, 0xBB, 0x1F, 0xE7, 0x95, 0xC5, 0xA4 } } } },
- EXTRACT_END_ENTRY
-};
-
-const ExtractEntrySearchData kEoBBaseDscDoorCoordsExtProvider[] = {
- { UNK_LANG, kPlatformDOS, { 0x00000048, 0x00000C8E, { { 0x2E, 0x0E, 0xB2, 0xAC, 0xE7, 0x0F, 0xDF, 0x38, 0xDF, 0x92, 0xB7, 0xB5, 0xA2, 0xFD, 0x40, 0x2D } } } },
- EXTRACT_END_ENTRY
-};
-
-const ExtractEntrySearchData kEoBBaseDscItemPosIndexProvider[] = {
- { UNK_LANG, kPlatformDOS, { 0x00000010, 0x00000018, { { 0x74, 0x90, 0x47, 0xE6, 0xFB, 0xC0, 0x34, 0xDF, 0x92, 0x5B, 0xA1, 0xCB, 0x06, 0x33, 0xCA, 0x6B } } } },
- EXTRACT_END_ENTRY
-};
-
-const ExtractEntrySearchData kEoBBaseDscItemShpXProvider[] = {
- { UNK_LANG, kPlatformDOS, { 0x00000024, 0x00000F2C, { { 0x9E, 0x22, 0x3F, 0x8F, 0x31, 0x83, 0xF7, 0x7C, 0x59, 0x60, 0x7C, 0x0A, 0xEB, 0xD2, 0x18, 0x85 } } } },
- EXTRACT_END_ENTRY
-};
-
-const ExtractEntrySearchData kEoBBaseDscItemPosUnkProvider[] = {
- { UNK_LANG, kPlatformDOS, { 0x00000012, 0x00000433, { { 0xA4, 0x7B, 0x08, 0x07, 0x81, 0xEA, 0x4F, 0x99, 0x77, 0x74, 0x93, 0x65, 0xBF, 0x0C, 0x3B, 0x94 } } } },
- EXTRACT_END_ENTRY
-};
-
-const ExtractEntrySearchData kEoBBaseDscItemTileIndexProvider[] = {
- { UNK_LANG, kPlatformDOS, { 0x00000012, 0x00000D23, { { 0x0E, 0x17, 0xE1, 0x1F, 0x34, 0x7D, 0x30, 0xF6, 0xAE, 0x0B, 0xAC, 0x9D, 0x21, 0xB6, 0x97, 0xCC } } } },
- EXTRACT_END_ENTRY
-};
-
-const ExtractEntrySearchData kEoBBaseDscItemShapeMapProvider[] = {
- { UNK_LANG, kPlatformDOS, { 0x0000005A, 0x00000B23, { { 0x41, 0x4A, 0x95, 0x7F, 0x82, 0x85, 0x28, 0x55, 0xD4, 0xD5, 0xD6, 0xD8, 0xA9, 0xAE, 0xF4, 0xC0 } } } }, // EoB 1
- { UNK_LANG, kPlatformDOS, { 0x00000071, 0x00000860, { { 0xEA, 0x5D, 0x33, 0xB6, 0x38, 0x30, 0x65, 0x29, 0x7F, 0x08, 0x89, 0x04, 0xC5, 0x97, 0x76, 0xCB } } } }, // EoB 2
- EXTRACT_END_ENTRY
-};
-
-const ExtractEntrySearchData kEoBBaseDscTelptrShpCoordsProvider[] = {
- { UNK_LANG, kPlatformDOS, { 0x0000009C, 0x00000EBE, { { 0x2D, 0x1D, 0x74, 0x39, 0x29, 0xC3, 0x6F, 0x53, 0xD9, 0xA5, 0x4B, 0x9F, 0xD6, 0xDD, 0x73, 0xE9 } } } },
- EXTRACT_END_ENTRY
-};
-
-const ExtractEntrySearchData kEoBBasePortalSeqDataProvider[] = {
- { UNK_LANG, kPlatformDOS, { 0x0000007E, 0x000002D0, { { 0x18, 0x7E, 0x65, 0x17, 0x4C, 0xD2, 0xB5, 0x2E, 0x81, 0xF8, 0x1C, 0xAC, 0x37, 0x21, 0x62, 0x2A } } } },
-
- EXTRACT_END_ENTRY
-};
-
-const ExtractEntrySearchData kEoBBaseManDefProvider[] = {
- { EN_ANY, kPlatformDOS, { 0x00000078, 0x000002CD, { { 0x33, 0x9B, 0x0C, 0x6A, 0x2E, 0x4F, 0xE9, 0x02, 0x7B, 0xEE, 0xF1, 0x04, 0xA3, 0xBA, 0xD4, 0xF3 } } } }, // EoB 1
- { DE_DEU, kPlatformDOS, { 0x00000078, 0x000002C4, { { 0x92, 0x20, 0x58, 0x5F, 0x44, 0x09, 0x0B, 0xF0, 0xDA, 0x09, 0xE2, 0x44, 0x0B, 0xB7, 0x95, 0x96 } } } }, // EoB 1
- { EN_ANY, kPlatformDOS, { 0x000000C8, 0x00000834, { { 0x18, 0xEA, 0x33, 0xB7, 0x4B, 0x72, 0x23, 0x8D, 0x0E, 0x9F, 0x4E, 0xF5, 0x09, 0xA3, 0x9C, 0xEA } } } }, // EoB 2
- { DE_DEU, kPlatformDOS, { 0x000000C8, 0x00000622, { { 0xFE, 0x1D, 0x94, 0x3A, 0x0B, 0x17, 0x89, 0xEF, 0x60, 0x18, 0xB2, 0x43, 0x7A, 0x02, 0xDB, 0x61 } } } }, // EoB 2
- EXTRACT_END_ENTRY
-};
-
-const ExtractEntrySearchData kEoBBaseManWordProvider[] = {
- { EN_ANY, kPlatformDOS, { 0x000000E0, 0x00005134, { { 0x68, 0x9C, 0x19, 0x2B, 0x5F, 0x38, 0x36, 0x41, 0xA7, 0x7E, 0xB7, 0x51, 0x41, 0x60, 0x1D, 0x67 } } } }, // EoB 1
- { DE_DEU, kPlatformDOS, { 0x000000EA, 0x00005458, { { 0xEC, 0x14, 0x11, 0xE9, 0x19, 0xFD, 0xF8, 0xFC, 0xA8, 0x46, 0x3D, 0xCD, 0x56, 0x08, 0xC3, 0x4A } } } }, // EoB 1
- { EN_ANY, kPlatformDOS, { 0x0000017E, 0x00008B64, { { 0x66, 0x38, 0x09, 0x5B, 0x2E, 0x50, 0x54, 0x43, 0x1C, 0xEC, 0x56, 0x3B, 0x72, 0x39, 0xF9, 0xC3 } } } }, // EoB 2
- { DE_DEU, kPlatformDOS, { 0x0000015B, 0x00007C37, { { 0x44, 0xA3, 0x32, 0x88, 0x9F, 0x63, 0x28, 0xA0, 0xBD, 0x00, 0xF1, 0x08, 0xCA, 0xE5, 0xFE, 0x5F } } } }, // EoB 2
- EXTRACT_END_ENTRY
-};
-
-const ExtractEntrySearchData kEoBBaseManPromptProvider[] = {
- { EN_ANY, kPlatformDOS, { 0x00000041, 0x000013AC, { { 0x40, 0x2B, 0xB5, 0x99, 0xEF, 0x8F, 0x3C, 0x9F, 0xB1, 0x5A, 0xBE, 0xE4, 0x80, 0x8E, 0xBB, 0x96 } } } }, // EoB 1
- { DE_DEU, kPlatformDOS, { 0x00000048, 0x000015A5, { { 0x0B, 0xB4, 0x9E, 0xAD, 0xB3, 0x56, 0x75, 0xC1, 0xAE, 0x29, 0xF7, 0xB5, 0x82, 0x14, 0xD1, 0x27 } } } }, // EoB 1
- { EN_ANY, kPlatformDOS, { 0x00000041, 0x000013AC, { { 0x40, 0x2B, 0xB5, 0x99, 0xEF, 0x8F, 0x3C, 0x9F, 0xB1, 0x5A, 0xBE, 0xE4, 0x80, 0x8E, 0xBB, 0x96 } } } }, // EoB 2
- { DE_DEU, kPlatformDOS, { 0x0000005C, 0x00001D08, { { 0x10, 0xCE, 0x2D, 0xED, 0xA9, 0xA0, 0x7C, 0xA1, 0x91, 0x3F, 0xD8, 0x43, 0x03, 0x53, 0x97, 0xCA } } } }, // EoB 2
- EXTRACT_END_ENTRY
-};
-
-const ExtractEntrySearchData kEoBBaseDscMonsterFrmOffsTbl1Provider[] = {
- { UNK_LANG, kPlatformDOS, { 0x00000020, 0x00001000, { { 0x98, 0x27, 0x57, 0x25, 0x3B, 0x04, 0x7D, 0x14, 0x3A, 0xD4, 0xA2, 0x5D, 0xBA, 0x04, 0x45, 0xAC } } } },
- EXTRACT_END_ENTRY
-};
-
-const ExtractEntrySearchData kEoBBaseDscMonsterFrmOffsTbl2Provider[] = {
- { UNK_LANG, kPlatformDOS, { 0x00000020, 0x00000828, { { 0x7E, 0x8A, 0x0C, 0xEB, 0x5C, 0xBC, 0x6C, 0xBD, 0xD2, 0x48, 0x08, 0xCC, 0xF7, 0x7B, 0x81, 0x03 } } } },
- EXTRACT_END_ENTRY
-};
-
-const ExtractEntrySearchData kEoBBaseInvSlotXProvider[] = {
- { UNK_LANG, kPlatformDOS, { 0x00000036, 0x000010BF, { { 0x50, 0x6E, 0x67, 0x2B, 0x7D, 0x6C, 0xF2, 0x21, 0x73, 0xA2, 0xD5, 0xBB, 0xCE, 0x3B, 0x71, 0xAA } } } },
- EXTRACT_END_ENTRY
-};
-
-const ExtractEntrySearchData kEoBBaseInvSlotYProvider[] = {
- { UNK_LANG, kPlatformDOS, { 0x0000001B, 0x00000A5B, { { 0x47, 0x55, 0x7D, 0x84, 0x45, 0x91, 0xC4, 0x44, 0x10, 0xD5, 0x39, 0xC4, 0xC8, 0x4F, 0x01, 0xA4 } } } },
- EXTRACT_END_ENTRY
-};
-
-const ExtractEntrySearchData kEoBBaseSlotValidationFlagsProvider[] = {
- { UNK_LANG, kPlatformDOS, { 0x00000036, 0x00001F6B, { { 0x87, 0x4F, 0x9A, 0x97, 0x20, 0x20, 0xB2, 0xA6, 0xF7, 0xC2, 0x5F, 0xAA, 0x17, 0xEA, 0xB4, 0x50 } } } },
- EXTRACT_END_ENTRY
-};
-
-const ExtractEntrySearchData kEoBBaseProjectileWeaponTypesProvider[] = {
- { UNK_LANG, kPlatformDOS, { 0x00000008, 0x0000061C, { { 0x05, 0x55, 0xA6, 0xD1, 0x3C, 0x12, 0x84, 0xDA, 0xA9, 0x33, 0xCF, 0x07, 0x05, 0x2A, 0xB2, 0x29 } } } }, // EOB 1
- { UNK_LANG, kPlatformDOS, { 0x0000000F, 0x00000829, { { 0x9F, 0x6A, 0x13, 0x8A, 0xA7, 0x40, 0xE8, 0x40, 0x2E, 0x87, 0x49, 0x6B, 0x67, 0xED, 0xE8, 0xCE } } } }, // EOB 2
- EXTRACT_END_ENTRY
-};
-
-const ExtractEntrySearchData kEoBBaseWandTypesProvider[] = {
- { UNK_LANG, kPlatformDOS, { 0x00000007, 0x00000162, { { 0xDB, 0x5D, 0x34, 0x70, 0x41, 0xAB, 0x8F, 0x75, 0xC8, 0x61, 0x8E, 0x44, 0x82, 0xCF, 0x28, 0x03 } } } }, // EOB 1
- { UNK_LANG, kPlatformDOS, { 0x00000008, 0x00000175, { { 0x01, 0xC2, 0xF0, 0xC6, 0x1C, 0xD0, 0x14, 0xD9, 0xB8, 0xF5, 0x9C, 0xFC, 0x22, 0xE4, 0xA0, 0xA7 } } } }, // EOB 2
- EXTRACT_END_ENTRY
-};
-
-const ExtractEntrySearchData kEoBBaseDrawObjPosIndexProvider[] = {
- { UNK_LANG, kPlatformDOS, { 0x00000014, 0x00000028, { { 0x44, 0x46, 0x8C, 0x94, 0x76, 0x24, 0x08, 0xC7, 0x1F, 0x1B, 0x10, 0xD7, 0xDF, 0x18, 0x6C, 0x0D } } } },
- EXTRACT_END_ENTRY
-};
-
-const ExtractEntrySearchData kEoBBaseFlightObjFlipIndexProvider[] = {
- { UNK_LANG, kPlatformDOS, { 0x00000010, 0x00000008, { { 0xEB, 0xF0, 0x27, 0x7E, 0xA8, 0x09, 0x3A, 0x95, 0x3B, 0x71, 0x2A, 0x43, 0x2E, 0xCF, 0x22, 0x0B } } } },
- EXTRACT_END_ENTRY
-};
-
-const ExtractEntrySearchData kEoBBaseFlightObjShpMapProvider[] = {
- { UNK_LANG, kPlatformDOS, { 0x00000058, 0x000051BD, { { 0xC3, 0xD2, 0xD1, 0xE5, 0x78, 0xEE, 0xA7, 0xAA, 0x71, 0xD1, 0xDD, 0xDF, 0x40, 0xBB, 0xAF, 0x66 } } } }, // EOB 1
- { UNK_LANG, kPlatformDOS, { 0x0000002D, 0x000025E6, { { 0x64, 0x26, 0x3D, 0xDC, 0x6C, 0x1A, 0xFC, 0x36, 0x9E, 0x5A, 0xBF, 0x64, 0xAD, 0xF4, 0xA3, 0x5D } } } }, // EOB 2
- EXTRACT_END_ENTRY
-};
-
-const ExtractEntrySearchData kEoBBaseFlightObjSclIndexProvider[] = {
- { UNK_LANG, kPlatformDOS, { 0x00000048, 0x00002A0E, { { 0xAC, 0xBB, 0x7D, 0x73, 0x98, 0xF4, 0x1E, 0x4A, 0x77, 0xF0, 0x98, 0x75, 0x11, 0xBF, 0xF7, 0xD5 } } } },
- EXTRACT_END_ENTRY
-};
-
-const ExtractEntrySearchData kEoBBaseBookNumbersProvider[] = {
- { EN_ANY, kPlatformDOS, { 0x00000020, 0x00000AC8, { { 0x35, 0x05, 0x37, 0x4C, 0x05, 0x74, 0x04, 0x08, 0xAD, 0xA3, 0x64, 0xBF, 0xC0, 0x67, 0xF2, 0xF7 } } } },
- { DE_DEU, kPlatformDOS, { 0x00000028, 0x00000E5D, { { 0x80, 0x98, 0x05, 0x54, 0x84, 0x90, 0xD3, 0xB3, 0x9B, 0xFB, 0x8F, 0xB9, 0xA0, 0x43, 0xAA, 0xFD } } } },
- { EN_ANY, kPlatformDOS, { 0x00000020, 0x00000AC8, { { 0x35, 0x05, 0x37, 0x4C, 0x05, 0x74, 0x04, 0x08, 0xAD, 0xA3, 0x64, 0xBF, 0xC0, 0x67, 0xF2, 0xF7 } } } },
- { DE_DEU, kPlatformDOS, { 0x00000022, 0x00000BCA, { { 0x93, 0x0E, 0xE0, 0x6D, 0xDD, 0x40, 0xBC, 0x89, 0x67, 0xBD, 0x8A, 0xCB, 0xD2, 0xCF, 0x78, 0x8D } } } },
- EXTRACT_END_ENTRY
-};
-
-const ExtractEntrySearchData kEoBBaseMageSpellsListProvider[] = {
- { EN_ANY, kPlatformDOS, { 0x00000122, 0x00006304, { { 0xD7, 0x14, 0x28, 0x83, 0x04, 0xC3, 0x42, 0x5A, 0x15, 0x49, 0x91, 0x12, 0x1D, 0x49, 0x17, 0x5B } } } },
- { DE_DEU, kPlatformDOS, { 0x0000013A, 0x00007155, { { 0x94, 0x45, 0xB9, 0x15, 0x57, 0x6E, 0xC6, 0x70, 0x66, 0x5F, 0xA7, 0x90, 0xA0, 0xC7, 0xC9, 0xE9 } } } },
- { EN_ANY, kPlatformDOS, { 0x00000195, 0x00008AC0, { { 0x55, 0xB8, 0x75, 0x35, 0x09, 0x23, 0x83, 0x11, 0x22, 0xF8, 0x23, 0x1E, 0x8F, 0x08, 0x57, 0x66 } } } },
- { DE_DEU, kPlatformDOS, { 0x0000019A, 0x0000929F, { { 0xB3, 0xA0, 0x2D, 0x3B, 0xF3, 0x72, 0x9B, 0x75, 0xA3, 0xC4, 0xD8, 0x72, 0x4B, 0xDE, 0x69, 0x82 } } } },
- EXTRACT_END_ENTRY
-};
-
-const ExtractEntrySearchData kEoBBaseClericSpellsListProvider[] = {
- { EN_ANY, kPlatformDOS, { 0x0000013B, 0x00006BE6, { { 0x34, 0x63, 0x0B, 0xBA, 0xED, 0xC2, 0x9B, 0x31, 0xC3, 0x65, 0x51, 0xFF, 0xEF, 0xD8, 0x25, 0x92 } } } },
- { DE_DEU, kPlatformDOS, { 0x0000016D, 0x00007E74, { { 0x6E, 0xDE, 0x28, 0xE6, 0x13, 0x3D, 0xA6, 0x42, 0x80, 0xAB, 0xE7, 0xED, 0xAD, 0xC8, 0x62, 0x48 } } } },
- { EN_ANY, kPlatformDOS, { 0x00000164, 0x000079B3, { { 0x93, 0x16, 0x25, 0xFB, 0x76, 0xFF, 0xBC, 0x70, 0x9A, 0xB7, 0x93, 0xFC, 0x2E, 0xC3, 0x61, 0x7F } } } },
- { DE_DEU, kPlatformDOS, { 0x0000018B, 0x00008BB1, { { 0x8C, 0x21, 0xED, 0xE0, 0x1F, 0xF1, 0xDB, 0x72, 0xC4, 0x46, 0x36, 0x50, 0x16, 0xD5, 0xA8, 0x68 } } } },
- EXTRACT_END_ENTRY
-};
-
-const ExtractEntrySearchData kEoBBaseSpellNamesProvider[] = {
- { EN_ANY, kPlatformDOS, { 0x0000029A, 0x0000F1C8, { { 0xCA, 0xE1, 0x30, 0xDC, 0xAB, 0xD1, 0x87, 0xE8, 0x51, 0xA2, 0xA2, 0x1C, 0x23, 0x4A, 0x34, 0x58 } } } },
- { DE_DEU, kPlatformDOS, { 0x000002D3, 0x0001080D, { { 0x5F, 0xDB, 0x9E, 0x48, 0x30, 0x03, 0xE1, 0x8E, 0xC7, 0xDC, 0x98, 0x10, 0xCE, 0xA1, 0x28, 0x31 } } } },
- { EN_ANY, kPlatformDOS, { 0x00000366, 0x00013B1A, { { 0x15, 0xCB, 0x0E, 0xA9, 0x4E, 0x78, 0x30, 0x99, 0xA1, 0xCF, 0xF7, 0x05, 0xAB, 0x00, 0x66, 0x82 } } } },
- { DE_DEU, kPlatformDOS, { 0x000003BA, 0x0001626B, { { 0x0E, 0x4F, 0xF6, 0xFB, 0x78, 0x5E, 0x03, 0xE7, 0x82, 0xC4, 0xE2, 0x7B, 0xD9, 0xB2, 0xD7, 0xB2 } } } },
- EXTRACT_END_ENTRY
-};
-
-const ExtractEntrySearchData kEoBBaseMagicStrings1Provider[] = {
- { EN_ANY, kPlatformDOS, { 0x00000084, 0x000029B0, { { 0xC6, 0x90, 0x19, 0x61, 0xA1, 0x66, 0xF6, 0x03, 0x7A, 0x1F, 0x10, 0x00, 0xCA, 0x8F, 0x69, 0x3B } } } },
- { DE_DEU, kPlatformDOS, { 0x0000009D, 0x000033E4, { { 0x4B, 0xCF, 0x40, 0xCE, 0x0F, 0x86, 0x98, 0x36, 0x03, 0x59, 0xFE, 0x32, 0xFA, 0x4C, 0x14, 0x75 } } } },
- { EN_ANY, kPlatformDOS, { 0x00000085, 0x000029BD, { { 0xAB, 0x22, 0x4A, 0x70, 0xBB, 0x29, 0xB8, 0xBD, 0xAF, 0xC5, 0x0D, 0x1F, 0x23, 0x38, 0xBD, 0x06 } } } },
- { DE_DEU, kPlatformDOS, { 0x0000008C, 0x00002D68, { { 0x4B, 0x0A, 0x09, 0x22, 0xF7, 0x77, 0x82, 0x4B, 0xFE, 0x0B, 0xF1, 0x8F, 0x1C, 0xEA, 0x1A, 0x0C } } } },
- EXTRACT_END_ENTRY
-};
-
-const ExtractEntrySearchData kEoBBaseMagicStrings2Provider[] = {
- { EN_ANY, kPlatformDOS, { 0x00000051, 0x00001AD6, { { 0x28, 0x18, 0x2B, 0xF0, 0x0E, 0xC6, 0xEB, 0x01, 0xB0, 0x9A, 0x0A, 0x65, 0x05, 0xCB, 0x8F, 0x41 } } } },
- { DE_DEU, kPlatformDOS, { 0x0000004F, 0x00001A82, { { 0x77, 0x85, 0x17, 0x25, 0x07, 0x72, 0x4A, 0x7F, 0x4F, 0x39, 0x6C, 0xDD, 0xB6, 0x70, 0x11, 0x02 } } } },
- { EN_ANY, kPlatformDOS, { 0x00000090, 0x00002E35, { { 0x39, 0xD7, 0xA3, 0x21, 0xF0, 0xB7, 0x93, 0x9D, 0xDD, 0xEE, 0x33, 0xC2, 0x05, 0xE6, 0xE3, 0x63 } } } },
- { DE_DEU, kPlatformDOS, { 0x000000A1, 0x0000365C, { { 0x9A, 0x2D, 0xDB, 0x38, 0xB3, 0xF4, 0x0E, 0xF4, 0x36, 0x87, 0x60, 0xAE, 0xF8, 0x7E, 0xCA, 0x8A } } } },
- EXTRACT_END_ENTRY
-};
-
-const ExtractEntrySearchData kEoBBaseMagicStrings3Provider[] = {
- { EN_ANY, kPlatformDOS, { 0x0000008D, 0x00002DC8, { { 0x35, 0x5E, 0xDD, 0x32, 0x2D, 0x55, 0x1E, 0xBC, 0x93, 0x49, 0x55, 0x48, 0x8F, 0xCD, 0x87, 0xEB } } } },
- { DE_DEU, kPlatformDOS, { 0x000000A8, 0x0000381C, { { 0x12, 0x95, 0x55, 0x57, 0x2B, 0xA0, 0x1A, 0x75, 0xD3, 0x43, 0xFF, 0x3E, 0x00, 0xB6, 0xEC, 0x35 } } } },
- { EN_ANY, kPlatformDOS, { 0x00000088, 0x00002CD4, { { 0xD8, 0xBA, 0x5D, 0x14, 0x92, 0x84, 0x5A, 0x07, 0xC6, 0x76, 0xDF, 0x11, 0x1D, 0x84, 0x7A, 0x98 } } } },
- { DE_DEU, kPlatformDOS, { 0x00000081, 0x00002B14, { { 0xC8, 0xB7, 0x77, 0xBC, 0x3A, 0xB6, 0xDC, 0xB7, 0x00, 0xF3, 0x06, 0xEB, 0x77, 0x10, 0x7C, 0x7E } } } },
- EXTRACT_END_ENTRY
-};
-
-const ExtractEntrySearchData kEoBBaseMagicStrings4Provider[] = {
- { EN_ANY, kPlatformDOS, { 0x00000017, 0x0000071C, { { 0x96, 0x50, 0xA8, 0x08, 0x1B, 0x2D, 0x0C, 0xF6, 0x90, 0x6A, 0xE7, 0x9F, 0x65, 0xCC, 0x71, 0xA0 } } } },
- { DE_DEU, kPlatformDOS, { 0x0000001B, 0x00000840, { { 0xA2, 0xCF, 0x81, 0x3E, 0x87, 0xA8, 0x10, 0x1B, 0x44, 0x8D, 0x5B, 0x8B, 0xAE, 0x23, 0x30, 0xD3 } } } },
- { EN_ANY, kPlatformDOS, { 0x0000000C, 0x000003A5, { { 0x72, 0x64, 0xBD, 0x1C, 0xED, 0x05, 0x28, 0xFC, 0x94, 0x4B, 0x8F, 0x3C, 0x38, 0x08, 0x77, 0xED } } } },
- { DE_DEU, kPlatformDOS, { 0x00000010, 0x0000054E, { { 0xD9, 0x97, 0xA8, 0x24, 0x27, 0x7B, 0x01, 0x3F, 0x03, 0xBA, 0x2A, 0x43, 0x81, 0x8F, 0x97, 0x03 } } } },
- EXTRACT_END_ENTRY
-};
-
-const ExtractEntrySearchData kEoBBaseMagicStrings6Provider[] = {
- { EN_ANY, kPlatformDOS, { 0x00000029, 0x00000DA4, { { 0x5C, 0x6F, 0xA1, 0xC2, 0x56, 0xDE, 0xFE, 0xD5, 0x01, 0xFB, 0x65, 0x00, 0x24, 0xD1, 0x49, 0x7B } } } },
- { DE_DEU, kPlatformDOS, { 0x00000032, 0x00001211, { { 0x13, 0xBC, 0xF1, 0x03, 0x49, 0xDB, 0x16, 0xA5, 0xC3, 0x7C, 0xBF, 0x14, 0x8F, 0x40, 0x07, 0x8E } } } },
- { EN_ANY, kPlatformDOS, { 0x00000030, 0x00000FF5, { { 0xE4, 0x2B, 0xB9, 0xF0, 0x26, 0x3D, 0x30, 0xCD, 0xEF, 0xCD, 0xF5, 0xC0, 0x4E, 0xA4, 0xC4, 0x92 } } } },
- { DE_DEU, kPlatformDOS, { 0x00000029, 0x00000E6D, { { 0xE1, 0xBD, 0x4B, 0x42, 0x17, 0xA2, 0xB6, 0x6C, 0xF2, 0x7F, 0xEB, 0x41, 0x2C, 0x82, 0x8C, 0x76 } } } },
- EXTRACT_END_ENTRY
-};
-
-const ExtractEntrySearchData kEoBBaseMagicStrings7Provider[] = {
- { EN_ANY, kPlatformDOS, { 0x00000014, 0x00000406, { { 0xBD, 0xE1, 0x0A, 0x75, 0xD1, 0x18, 0xF7, 0x08, 0x2D, 0x2B, 0x65, 0x36, 0xA7, 0x59, 0x2E, 0x13 } } } },
- { DE_DEU, kPlatformDOS, { 0x0000000F, 0x000001E5, { { 0x1F, 0xC9, 0x46, 0x8B, 0x41, 0xAD, 0xAD, 0x2B, 0x5A, 0xA9, 0xAB, 0x94, 0x9A, 0x1E, 0x36, 0xAC } } } },
- { EN_ANY, kPlatformDOS, { 0x00000065, 0x000021AF, { { 0x76, 0x35, 0xAE, 0x1D, 0xC2, 0x54, 0x36, 0x11, 0x4D, 0x3E, 0x96, 0x11, 0xB2, 0xDC, 0x15, 0x20 } } } },
- { DE_DEU, kPlatformDOS, { 0x0000006F, 0x000026BA, { { 0xC9, 0x46, 0xD7, 0xF3, 0xF2, 0x5F, 0xF4, 0xB1, 0x22, 0xC8, 0x30, 0x16, 0x8E, 0x75, 0x4D, 0xA8 } } } },
- EXTRACT_END_ENTRY
-};
-
-const ExtractEntrySearchData kEoBBaseMagicStrings8Provider[] = {
- { EN_ANY, kPlatformDOS, { 0x00000056, 0x00001C95, { { 0x7E, 0x43, 0x73, 0xEC, 0x94, 0x0D, 0xF8, 0x1B, 0xF3, 0x1A, 0x62, 0x19, 0x96, 0x6A, 0x2C, 0xB5 } } } },
- { DE_DEU, kPlatformDOS, { 0x00000061, 0x0000213B, { { 0xE2, 0x3B, 0xA7, 0xB7, 0xE6, 0xA5, 0x0D, 0x0F, 0xE0, 0x94, 0x9B, 0xAE, 0xE1, 0x11, 0x97, 0x93 } } } },
- { EN_ANY, kPlatformDOS, { 0x00000085, 0x00002C0E, { { 0x6A, 0xEC, 0xF2, 0x5F, 0xA6, 0x3F, 0xB1, 0x1A, 0x74, 0x49, 0x5A, 0x47, 0xB0, 0x7A, 0xE6, 0x99 } } } },
- { DE_DEU, kPlatformDOS, { 0x00000096, 0x0000342E, { { 0x83, 0x48, 0x3B, 0xED, 0x73, 0x02, 0x03, 0xCA, 0xA9, 0x4D, 0x40, 0x0F, 0xDE, 0x17, 0x7D, 0x40 } } } },
- EXTRACT_END_ENTRY
-};
-
-const ExtractEntrySearchData kEoBBaseExpObjectTlModeProvider[] = {
- { UNK_LANG, kPlatformDOS, { 0x00000012, 0x0000000C, { { 0x98, 0x29, 0x54, 0xCD, 0xED, 0xAC, 0x7B, 0x61, 0x8D, 0x4F, 0x19, 0xE8, 0xA6, 0xB1, 0x51, 0x80 } } } },
- EXTRACT_END_ENTRY
-};
-const ExtractEntrySearchData kEoBBaseExpObjectTblIndexProvider[] = {
- { UNK_LANG, kPlatformDOS, { 0x00000009, 0x00000005, { { 0xFE, 0xEA, 0xC4, 0x54, 0x62, 0x7E, 0x43, 0x6E, 0x89, 0x48, 0x03, 0xE7, 0x47, 0xBF, 0x7D, 0x9D } } } }, // EOB 1
- { UNK_LANG, kPlatformDOS, { 0x0000000E, 0x00000004, { { 0x63, 0x27, 0x19, 0x17, 0xBD, 0xC3, 0x8A, 0xA7, 0x1E, 0xF7, 0xD1, 0x78, 0x39, 0x3B, 0xD4, 0x4F } } } }, // EOB 2
- EXTRACT_END_ENTRY
-};
-const ExtractEntrySearchData kEoBBaseExpObjectShpStartProvider[] = {
- { UNK_LANG, kPlatformDOS, { 0x00000004, 0x00000034, { { 0x27, 0xC5, 0x09, 0x97, 0x8E, 0xD4, 0xF1, 0x8D, 0x77, 0xEB, 0x1D, 0x34, 0x55, 0xB2, 0x48, 0x38 } } } },
- EXTRACT_END_ENTRY
-};
-const ExtractEntrySearchData kEoBBaseExpObjectTbl1Provider[] = {
- { UNK_LANG, kPlatformDOS, { 0x0000000D, 0x0000005D, { { 0x49, 0xC4, 0x47, 0x55, 0xDC, 0x25, 0x08, 0x03, 0x3D, 0x23, 0xAD, 0x09, 0x5F, 0x9C, 0x34, 0x06 } } } },
- EXTRACT_END_ENTRY
-};
-const ExtractEntrySearchData kEoBBaseExpObjectTbl2Provider[] = {
- { UNK_LANG, kPlatformDOS, { 0x0000000A, 0x0000005C, { { 0xAB, 0x6A, 0x97, 0x35, 0xCC, 0x13, 0xC4, 0x17, 0x0B, 0xF2, 0xD3, 0xFD, 0xA2, 0x1C, 0x6C, 0xA8 } } } },
- EXTRACT_END_ENTRY
-};
-const ExtractEntrySearchData kEoBBaseExpObjectTbl3Provider[] = {
- { UNK_LANG, kPlatformDOS, { 0x0000000B, 0x00000032, { { 0x59, 0x23, 0xB9, 0xBE, 0x0E, 0xFA, 0xEB, 0xDD, 0x82, 0x68, 0x5B, 0xB0, 0xBE, 0x9B, 0x1D, 0x8E } } } },
- EXTRACT_END_ENTRY
-};
-
-const ExtractEntrySearchData kEoBBaseExpObjectYProvider[] = {
- { UNK_LANG, kPlatformDOS, { 0x00000008, 0x0000016C, { { 0xCF, 0x5B, 0x04, 0xAB, 0x1A, 0xAF, 0xDD, 0x56, 0xAC, 0xF6, 0x23, 0x86, 0x33, 0x06, 0x5A, 0xC6 } } } },
- EXTRACT_END_ENTRY
-};
-
-const ExtractEntrySearchData kEoBBaseSparkDefStepsProvider[] = {
- { UNK_LANG, kPlatformDOS, { 0x00000008, 0x000002FD, { { 0xB5, 0x6F, 0x31, 0x5F, 0xC6, 0x47, 0xE9, 0x23, 0x0E, 0x73, 0xBF, 0x77, 0xC7, 0xEE, 0xDB, 0x27 } } } },
- EXTRACT_END_ENTRY
-};
-
-const ExtractEntrySearchData kEoBBaseSparkDefSubStepsProvider[] = {
- { UNK_LANG, kPlatformDOS, { 0x00000004, 0x000000FF, { { 0x18, 0x27, 0x73, 0x45, 0x26, 0x58, 0x81, 0x82, 0x70, 0x86, 0x7A, 0x0D, 0xDE, 0xC1, 0x08, 0x52 } } } },
- EXTRACT_END_ENTRY
-};
-
-const ExtractEntrySearchData kEoBBaseSparkDefShiftProvider[] = {
- { UNK_LANG, kPlatformDOS, { 0x00000004, 0x0000000C, { { 0xCC, 0xDC, 0x78, 0xF9, 0xFE, 0x88, 0xF3, 0x87, 0xFD, 0x08, 0xE8, 0x8A, 0x38, 0xD5, 0x4C, 0x53 } } } },
- EXTRACT_END_ENTRY
-};
-
-const ExtractEntrySearchData kEoBBaseSparkDefAddProvider[] = {
- { UNK_LANG, kPlatformDOS, { 0x00000008, 0x0000007F, { { 0x7F, 0x86, 0x2E, 0x14, 0xDB, 0x36, 0xED, 0x99, 0xD9, 0xCE, 0xAF, 0x11, 0xC2, 0x89, 0x21, 0x6B } } } },
- EXTRACT_END_ENTRY
-};
-
-const ExtractEntrySearchData kEoBBaseSparkDefXProvider[] = {
- { UNK_LANG, kPlatformDOS, { 0x0000000C, 0x000000A5, { { 0x77, 0xD7, 0xE0, 0x2D, 0xD4, 0x25, 0x94, 0x6E, 0x59, 0x3B, 0xAF, 0x9B, 0x16, 0x4F, 0x6D, 0x4C } } } },
- EXTRACT_END_ENTRY
-};
-
-const ExtractEntrySearchData kEoBBaseSparkDefYProvider[] = {
- { UNK_LANG, kPlatformDOS, { 0x00000006, 0x00000138, { { 0xB9, 0xA2, 0x72, 0x01, 0x2A, 0xD7, 0x61, 0xAB, 0x02, 0x57, 0x87, 0xC8, 0x86, 0x83, 0xDF, 0xB3 } } } },
- EXTRACT_END_ENTRY
-};
-
-const ExtractEntrySearchData kEoBBaseSparkOfFlags1Provider[] = {
- { UNK_LANG, kPlatformDOS, { 0x0000002C, 0x00000BF4, { { 0x94, 0x8C, 0x1B, 0x77, 0xBF, 0x3A, 0x51, 0x17, 0x89, 0x16, 0xD0, 0x74, 0x95, 0xBD, 0x85, 0x98 } } } },
- EXTRACT_END_ENTRY
-};
-
-const ExtractEntrySearchData kEoBBaseSparkOfFlags2Provider[] = {
- { UNK_LANG, kPlatformDOS, { 0x00000040, 0x000003FC, { { 0x40, 0x13, 0x5A, 0x9D, 0xBD, 0x29, 0x2E, 0x9C, 0xC1, 0xE7, 0xD4, 0xC9, 0x26, 0xFA, 0xF2, 0x70 } } } },
- EXTRACT_END_ENTRY
-};
-
-const ExtractEntrySearchData kEoBBaseSparkOfShiftProvider[] = {
- { UNK_LANG, kPlatformDOS, { 0x00000010, 0x000000F0, { { 0xC5, 0xC8, 0x91, 0x7E, 0x78, 0x2F, 0xF1, 0xE5, 0xE0, 0x06, 0xB2, 0x39, 0xDC, 0x0D, 0x7A, 0x5F } } } },
- EXTRACT_END_ENTRY
-};
-
-const ExtractEntrySearchData kEoBBaseSparkOfXProvider[] = {
- { UNK_LANG, kPlatformDOS, { 0x00000010, 0x00000528, { { 0x58, 0xE6, 0x24, 0x6A, 0xD3, 0xA4, 0xEF, 0x58, 0x4A, 0x9C, 0x32, 0x31, 0x4C, 0x61, 0xBC, 0x1C } } } },
- EXTRACT_END_ENTRY
-};
-
-const ExtractEntrySearchData kEoBBaseSparkOfYProvider[] = {
- { UNK_LANG, kPlatformDOS, { 0x00000010, 0x000002D4, { { 0x74, 0x31, 0xFE, 0x7C, 0x38, 0x16, 0x0C, 0x05, 0x64, 0xAB, 0x8A, 0x69, 0xEA, 0x66, 0x29, 0x2F } } } },
- EXTRACT_END_ENTRY
-};
-
-const ExtractEntrySearchData kEoBBaseSpellPropertiesProvider[] = {
- { UNK_LANG, kPlatformDOS, { 0x000003EF, 0x0000BE7A, { { 0x10, 0xEA, 0x14, 0x26, 0xE2, 0xFC, 0xA1, 0xCB, 0xD9, 0x80, 0xFE, 0x9F, 0x69, 0x58, 0x4A, 0xCA } } } },
- { UNK_LANG, kPlatformDOS, { 0x000003EF, 0x00008FCE, { { 0xC9, 0x36, 0xDD, 0x7B, 0x05, 0x6E, 0x92, 0xBA, 0x2B, 0x39, 0x87, 0xA7, 0x3A, 0x7E, 0xB0, 0xAD } } } },
- { UNK_LANG, kPlatformDOS, { 0x000006D6, 0x0000CA78, { { 0xEB, 0x3B, 0x9F, 0xFD, 0x4E, 0x3F, 0x5C, 0xDE, 0xC6, 0xBA, 0xFE, 0x83, 0xB4, 0x10, 0x6D, 0x95 } } } },
- { UNK_LANG, kPlatformDOS, { 0x000006D6, 0x0000EC32, { { 0x52, 0xAE, 0x4D, 0xC2, 0x24, 0xC8, 0xD3, 0xBE, 0x09, 0x45, 0x98, 0x38, 0x17, 0x7D, 0xFF, 0xE4 } } } },
- EXTRACT_END_ENTRY
-};
-
-const ExtractEntrySearchData kEoBBaseMagicFlightPropsProvider[] = {
- { UNK_LANG, kPlatformDOS, { 0x00000060, 0x0000166F, { { 0x38, 0x30, 0xCA, 0x07, 0x64, 0xBA, 0xC4, 0xA4, 0x4F, 0x75, 0xB4, 0x84, 0x3A, 0x92, 0xFD, 0xE3 } } } },
- { UNK_LANG, kPlatformDOS, { 0x00000038, 0x00000DDC, { { 0x23, 0x32, 0x8D, 0x34, 0x4F, 0x72, 0x37, 0xE1, 0x0C, 0x1B, 0x47, 0x17, 0x5D, 0xDF, 0xDB, 0xF5 } } } },
- EXTRACT_END_ENTRY
-};
-
-const ExtractEntrySearchData kEoBBaseTurnUndeadEffectProvider[] = {
- { UNK_LANG, kPlatformDOS, { 0x0000008C, 0x00002E8B, { { 0x96, 0x15, 0x61, 0x12, 0x43, 0xCF, 0x3A, 0x84, 0x1A, 0x89, 0xB5, 0x32, 0x0D, 0xB3, 0x20, 0x67 } } } },
-
- EXTRACT_END_ENTRY
-};
-
-const ExtractEntrySearchData kEoBBaseBurningHandsDestProvider[] = {
- { UNK_LANG, kPlatformDOS, { 0x00000008, 0x0000000C, { { 0x61, 0xD7, 0xAB, 0xE1, 0x56, 0x54, 0x51, 0x5B, 0xD9, 0x59, 0x2D, 0x3D, 0xAE, 0xA4, 0x49, 0x31 } } } }, // EOB1
- { UNK_LANG, kPlatformDOS, { 0x00000020, 0x0000003E, { { 0xA5, 0x8C, 0xCA, 0x13, 0xED, 0x0F, 0xB7, 0xA2, 0xD7, 0x9C, 0xCD, 0x11, 0x65, 0x11, 0x4B, 0xD8 } } } }, // EOB2
-
- EXTRACT_END_ENTRY
-};
-
-const ExtractEntrySearchData kEoBBaseConeOfColdDest1Provider[] = {
- { UNK_LANG, kPlatformDOS, { 0x00000007, 0x00000500, { { 0x48, 0xF1, 0xFE, 0x48, 0xEC, 0x64, 0x17, 0x51, 0x5C, 0x9A, 0x91, 0x35, 0x95, 0xC3, 0x73, 0x8E } } } },
- EXTRACT_END_ENTRY
-};
-
-const ExtractEntrySearchData kEoBBaseConeOfColdDest2Provider[] = {
- { UNK_LANG, kPlatformDOS, { 0x00000007, 0x00000210, { { 0xBA, 0x62, 0xA0, 0x4F, 0x50, 0x0C, 0x02, 0xC3, 0xAD, 0x7C, 0x39, 0x63, 0x5F, 0x41, 0xB4, 0xFB } } } },
- EXTRACT_END_ENTRY
-};
-
-const ExtractEntrySearchData kEoBBaseConeOfColdDest3Provider[] = {
- { UNK_LANG, kPlatformDOS, { 0x00000007, 0x00000200, { { 0xA0, 0x1F, 0xAC, 0x3A, 0x2D, 0x25, 0x1F, 0x5C, 0xD2, 0x04, 0xAC, 0xAB, 0x97, 0x8B, 0x61, 0xD7 } } } },
- EXTRACT_END_ENTRY
-};
-
-const ExtractEntrySearchData kEoBBaseConeOfColdDest4Provider[] = {
- { UNK_LANG, kPlatformDOS, { 0x00000007, 0x000004F0, { { 0xB3, 0x9A, 0x2B, 0x3A, 0x51, 0x24, 0x95, 0xBE, 0xDE, 0x0F, 0xD5, 0xE9, 0xE9, 0x21, 0x96, 0x04 } } } },
- EXTRACT_END_ENTRY
-};
-
-const ExtractEntrySearchData kEoBBaseConeOfColdGfxTblProvider[] = {
- { UNK_LANG, kPlatformDOS, { 0x00000010, 0x0000003E, { { 0x0A, 0xBA, 0xFD, 0x3F, 0xD8, 0x49, 0x3F, 0xD2, 0x26, 0x1B, 0x19, 0x53, 0x4F, 0x84, 0xB9, 0x4F } } } },
- EXTRACT_END_ENTRY
-};
-
-const ExtractEntrySearchData kEoB1MainMenuStringsProvider[] = {
- { EN_ANY, kPlatformUnknown, { 0x00000037, 0x00000D79, { { 0x1D, 0x72, 0x7F, 0x8F, 0xEB, 0x4A, 0xBF, 0x82, 0xB7, 0xB5, 0x9D, 0xB0, 0x7B, 0xDA, 0xEC, 0xEE } } } },
- { DE_DEU, kPlatformUnknown, { 0x00000034, 0x00000C6F, { { 0xF2, 0x5F, 0xBE, 0xFB, 0x27, 0x1C, 0x91, 0x33, 0x25, 0x09, 0xC1, 0xA0, 0x27, 0x89, 0xD7, 0xD5 } } } },
- EXTRACT_END_ENTRY
-};
-
-const ExtractEntrySearchData kEoB1BonusStringsProvider[] = {
- { EN_ANY, kPlatformUnknown, { 0x00000093, 0x000031B6, { { 0xC1, 0x54, 0x1D, 0x02, 0x4A, 0x35, 0x7F, 0x5D, 0x84, 0x2D, 0x2C, 0x9C, 0x06, 0x97, 0x29, 0x8D } } } },
- { DE_DEU, kPlatformUnknown, { 0x00000093, 0x000031CD, { { 0x3E, 0x0F, 0x52, 0x02, 0xC7, 0x9E, 0x83, 0xB3, 0xB1, 0xAB, 0x03, 0x3A, 0x18, 0xE2, 0x87, 0x2E } } } },
- EXTRACT_END_ENTRY
-};
-
-const ExtractEntrySearchData kEoB1IntroFilesOpeningProvider[] = {
- { UNK_LANG, kPlatformDOS, { 0x0000003F, 0x00001044, { { 0xF5, 0x8C, 0xC8, 0x39, 0x38, 0xBB, 0x0B, 0xCA, 0x34, 0x38, 0x1D, 0x11, 0x46, 0x91, 0xEF, 0x7E } } } },
- EXTRACT_END_ENTRY
-};
-
-const ExtractEntrySearchData kEoB1IntroFilesTowerProvider[] = {
- { UNK_LANG, kPlatformDOS, { 0x0000001A, 0x000006E6, { { 0xBD, 0x06, 0x3B, 0x7D, 0x24, 0x79, 0xD6, 0xC2, 0xFA, 0xDA, 0x31, 0x15, 0x3E, 0xE2, 0x75, 0xF8 } } } },
- EXTRACT_END_ENTRY
-};
-
-const ExtractEntrySearchData kEoB1IntroFilesOrbProvider[] = {
- { UNK_LANG, kPlatformDOS, { 0x00000015, 0x00000565, { { 0xA7, 0x91, 0x97, 0x5B, 0x29, 0xE8, 0x27, 0x90, 0xB3, 0x8F, 0xD5, 0x13, 0x77, 0x4A, 0x93, 0x37 } } } },
- EXTRACT_END_ENTRY
-};
-
-const ExtractEntrySearchData kEoB1IntroFilesWdEntryProvider[] = {
- { UNK_LANG, kPlatformDOS, { 0x0000002C, 0x00000B42, { { 0x5C, 0xDF, 0xB1, 0x2A, 0x83, 0x03, 0x73, 0x47, 0x1E, 0x29, 0x7C, 0x16, 0x2E, 0x5D, 0x0F, 0xA4 } } } },
- EXTRACT_END_ENTRY
-};
-
-const ExtractEntrySearchData kEoB1IntroFilesKingProvider[] = {
- { UNK_LANG, kPlatformDOS, { 0x00000016, 0x000005AE, { { 0xB5, 0xB5, 0x80, 0xD3, 0xC0, 0xF4, 0x9F, 0xE1, 0x12, 0x3C, 0xCB, 0xD6, 0xF2, 0x7F, 0x15, 0x5B } } } },
- EXTRACT_END_ENTRY
-};
-
-const ExtractEntrySearchData kEoB1IntroFilesHandsProvider[] = {
- { UNK_LANG, kPlatformDOS, { 0x0000000A, 0x0000027C, { { 0x90, 0xC7, 0x36, 0xE6, 0x7D, 0x6D, 0xCB, 0x77, 0xA0, 0x03, 0x45, 0x48, 0x46, 0xF3, 0x80, 0xC8 } } } },
- EXTRACT_END_ENTRY
-};
-
-const ExtractEntrySearchData kEoB1IntroFilesWdExitProvider[] = {
- { UNK_LANG, kPlatformDOS, { 0x00000033, 0x00000D2A, { { 0xA8, 0xF0, 0x36, 0x0E, 0x37, 0xC6, 0xCC, 0xDB, 0x9B, 0xB8, 0x52, 0x64, 0x02, 0x1E, 0x9D, 0x1C } } } },
- EXTRACT_END_ENTRY
-};
-
-const ExtractEntrySearchData kEoB1IntroFilesTunnelProvider[] = {
- { UNK_LANG, kPlatformDOS, { 0x0000001A, 0x000006E2, { { 0xA1, 0xDD, 0x20, 0x50, 0x7A, 0xB6, 0x89, 0x67, 0x13, 0xAA, 0x47, 0x6B, 0xC0, 0xA0, 0x8A, 0xFD } } } },
- EXTRACT_END_ENTRY
-};
-
-const ExtractEntrySearchData kEoB1IntroOpeningFrmDelayProvider[] = {
- { UNK_LANG, kPlatformDOS, { 0x0000000A, 0x000001E0, { { 0xDA, 0xE3, 0x06, 0xA2, 0x41, 0xF6, 0x5A, 0x6A, 0xBD, 0x0B, 0xA6, 0x09, 0x69, 0x03, 0x1D, 0x2C } } } },
- EXTRACT_END_ENTRY
-};
-
-const ExtractEntrySearchData kEoB1IntroWdEncodeXProvider[] = {
- { UNK_LANG, kPlatformDOS, { 0x0000001F, 0x000001BB, { { 0x00, 0x50, 0x8E, 0xF5, 0x51, 0xA6, 0xF5, 0x57, 0x0D, 0x55, 0x6C, 0x14, 0x62, 0xCD, 0xD0, 0x7E } } } },
- EXTRACT_END_ENTRY
-};
-
-const ExtractEntrySearchData kEoB1IntroWdEncodeYProvider[] = {
- { UNK_LANG, kPlatformDOS, { 0x0000001F, 0x0000000B, { { 0x39, 0x38, 0x02, 0xCE, 0x9D, 0x89, 0x1E, 0xBF, 0x32, 0x86, 0xA0, 0x79, 0xA4, 0xBE, 0xC5, 0x81 } } } },
- EXTRACT_END_ENTRY
-};
-
-const ExtractEntrySearchData kEoB1IntroWdEncodeWHProvider[] = {
- { UNK_LANG, kPlatformDOS, { 0x0000001F, 0x00000027, { { 0xA8, 0x6C, 0x13, 0x2B, 0x4C, 0x26, 0x38, 0x3D, 0xDA, 0xC2, 0x90, 0xB3, 0x97, 0xA9, 0x45, 0x84 } } } },
- EXTRACT_END_ENTRY
-};
-
-const ExtractEntrySearchData kEoB1IntroWdDsXProvider[] = {
- { UNK_LANG, kPlatformDOS, { 0x0000003E, 0x0000104A, { { 0xAC, 0x1F, 0xA6, 0x20, 0xD0, 0x02, 0xF0, 0x9D, 0x75, 0x93, 0x6C, 0x12, 0x0A, 0x76, 0x1B, 0x3F } } } },
- EXTRACT_END_ENTRY
-};
-
-const ExtractEntrySearchData kEoB1IntroWdDsYProvider[] = {
- { UNK_LANG, kPlatformDOS, { 0x0000001F, 0x00000655, { { 0xF3, 0xF7, 0x65, 0xEC, 0xEA, 0x5C, 0x08, 0xCF, 0xAD, 0x48, 0x35, 0xA2, 0x5B, 0x82, 0xB0, 0xC5 } } } },
- EXTRACT_END_ENTRY
-};
-
-const ExtractEntrySearchData kEoB1IntroTvlX1Provider[] = {
- { UNK_LANG, kPlatformDOS, { 0x00000006, 0x00000027, { { 0x7F, 0x14, 0x7D, 0x8C, 0x20, 0x49, 0xDB, 0xC3, 0x31, 0x1A, 0xC3, 0x95, 0xA4, 0x8C, 0x96, 0xDC } } } },
- EXTRACT_END_ENTRY
-};
-
-const ExtractEntrySearchData kEoB1IntroTvlY1Provider[] = {
- { UNK_LANG, kPlatformDOS, { 0x00000006, 0x000000EC, { { 0x29, 0xB4, 0x8D, 0xE1, 0xDF, 0x36, 0x39, 0x27, 0xC8, 0xF6, 0x32, 0x1A, 0x3B, 0x74, 0xA1, 0x4F } } } },
- EXTRACT_END_ENTRY
-};
-
-const ExtractEntrySearchData kEoB1IntroTvlX2Provider[] = {
- { UNK_LANG, kPlatformDOS, { 0x00000006, 0x00000051, { { 0x51, 0x33, 0x0A, 0x55, 0x76, 0xA2, 0x91, 0xDA, 0x59, 0xD6, 0x09, 0xD9, 0x3D, 0xD4, 0xB8, 0xFE } } } },
- EXTRACT_END_ENTRY
-};
-
-const ExtractEntrySearchData kEoB1IntroTvlY2Provider[] = {
- { UNK_LANG, kPlatformDOS, { 0x00000006, 0x0000016A, { { 0xD5, 0xA3, 0xF6, 0x12, 0x90, 0x87, 0xF2, 0xC7, 0x6A, 0x22, 0x77, 0xB5, 0x48, 0xB2, 0xCB, 0xCA } } } },
- EXTRACT_END_ENTRY
-};
-
-const ExtractEntrySearchData kEoB1IntroTvlWProvider[] = {
- { UNK_LANG, kPlatformDOS, { 0x00000006, 0x0000004E, { { 0xCF, 0xC7, 0xA8, 0x59, 0x6A, 0x5B, 0x35, 0x7F, 0xC9, 0xEC, 0x59, 0x7E, 0x88, 0x31, 0x32, 0xA6 } } } },
- EXTRACT_END_ENTRY
-};
-
-const ExtractEntrySearchData kEoB1IntroTvlHProvider[] = {
- { UNK_LANG, kPlatformDOS, { 0x00000006, 0x0000013D, { { 0x26, 0x7B, 0x3D, 0x5F, 0x64, 0x97, 0xF9, 0x1B, 0xB6, 0x65, 0x99, 0x95, 0x0A, 0x98, 0x38, 0x92 } } } },
- EXTRACT_END_ENTRY
-};
-
-const ExtractEntrySearchData kEoB1DoorShapeDefsProvider[] = {
- { UNK_LANG, kPlatformDOS, { 0x00000060, 0x00000F8A, { { 0x95, 0x53, 0x1B, 0x07, 0x64, 0x81, 0x0E, 0x04, 0xC0, 0xDA, 0xB5, 0x74, 0x57, 0x04, 0x10, 0xE2 } } } },
- EXTRACT_END_ENTRY
-};
-
-const ExtractEntrySearchData kEoB1DoorSwitchShapeDefsProvider[] = {
- { UNK_LANG, kPlatformDOS, { 0x00000060, 0x0000119E, { { 0xA4, 0xE6, 0x96, 0x36, 0x59, 0x05, 0xB8, 0x57, 0xF4, 0x6D, 0x79, 0x1D, 0x29, 0x52, 0xA0, 0xEE } } } },
- EXTRACT_END_ENTRY
-};
-
-const ExtractEntrySearchData kEoB1DoorSwitchCoordsProvider[] = {
- { UNK_LANG, kPlatformDOS, { 0x00000030, 0x000007F7, { { 0x85, 0x20, 0x98, 0x20, 0xE1, 0xD6, 0xA5, 0xBD, 0x9E, 0x59, 0x63, 0x6A, 0xEF, 0xEF, 0x80, 0x19 } } } },
- EXTRACT_END_ENTRY
-};
-
-const ExtractEntrySearchData kEoB1MonsterPropertiesProvider[] = {
- { UNK_LANG, kPlatformDOS, { 0x00000252, 0x000038E5, { { 0x5E, 0xD7, 0xEF, 0x3B, 0xD5, 0xDA, 0x2A, 0x09, 0x78, 0xF6, 0xD8, 0x57, 0x68, 0xB4, 0x90, 0xCA } } } },
- EXTRACT_END_ENTRY
-};
-
-const ExtractEntrySearchData kEoB1EnemyMageSpellListProvider[] = {
- { UNK_LANG, kPlatformDOS, { 0x0000000A, 0x0000000F, { { 0x01, 0x1B, 0x9C, 0x51, 0xC9, 0xA2, 0x10, 0xBB, 0xA7, 0x82, 0xD4, 0x91, 0x7E, 0x84, 0x54, 0x93 } } } },
- EXTRACT_END_ENTRY
-};
-
-const ExtractEntrySearchData kEoB1EnemyMageSfxProvider[] = {
- { UNK_LANG, kPlatformDOS, { 0x0000000A, 0x0000029B, { { 0xA2, 0x9F, 0x2E, 0xDE, 0x15, 0x23, 0x78, 0xDD, 0x26, 0x98, 0x6E, 0xA3, 0x77, 0xEA, 0xB5, 0x80 } } } },
- EXTRACT_END_ENTRY
-};
-
-const ExtractEntrySearchData kEoB1BeholderSpellListProvider[] = {
- { UNK_LANG, kPlatformDOS, { 0x00000004, 0x00000079, { { 0x8E, 0x13, 0x54, 0x9D, 0x54, 0xF6, 0xC9, 0x6E, 0x10, 0xF1, 0xC0, 0xE9, 0x66, 0xDD, 0x95, 0xED } } } },
- EXTRACT_END_ENTRY
-};
-
-const ExtractEntrySearchData kEoB1BeholderSfxProvider[] = {
- { UNK_LANG, kPlatformDOS, { 0x00000004, 0x000000F5, { { 0xA9, 0x90, 0x41, 0x0D, 0xB5, 0xE0, 0x28, 0xFD, 0x0A, 0xC3, 0xF9, 0xEC, 0xC8, 0x47, 0xC1, 0x57 } } } },
- EXTRACT_END_ENTRY
-};
-
-const ExtractEntrySearchData kEoB1TurnUndeadStringProvider[] = {
- { EN_ANY, kPlatformUnknown, { 0x00000027, 0x00000BF2, { { 0x43, 0x0A, 0x1E, 0xEE, 0x84, 0xD6, 0xD6, 0x87, 0x20, 0x9F, 0x15, 0x22, 0x9B, 0x65, 0x24, 0xDB } } } },
- { DE_DEU, kPlatformUnknown, { 0x00000030, 0x00000F48, { { 0xDA, 0x59, 0xEC, 0xC1, 0x9B, 0xCF, 0x90, 0x4A, 0x93, 0x3E, 0xE5, 0x26, 0x20, 0x8B, 0x74, 0x92 } } } },
-
- EXTRACT_END_ENTRY
-};
-
-const ExtractEntrySearchData kEoB1CgaMappingDefaultProvider[] = {
- { UNK_LANG, kPlatformDOS, { 0x00000020, 0x0000002C, { { 0x7E, 0x1C, 0x75, 0xC3, 0x8E, 0xF7, 0x56, 0x62, 0x9B, 0xB6, 0xF4, 0x3A, 0x21, 0x03, 0xFA, 0xF5 } } } },
- EXTRACT_END_ENTRY
-};
-
-const ExtractEntrySearchData kEoB1CgaMappingAltProvider[] = {
- { UNK_LANG, kPlatformDOS, { 0x00000020, 0x00000030, { { 0x2A, 0x8C, 0xF6, 0xD7, 0x87, 0xFA, 0x7B, 0x22, 0x28, 0x2A, 0x50, 0xE2, 0x26, 0x7B, 0xC7, 0x44 } } } },
- EXTRACT_END_ENTRY
-};
-
-const ExtractEntrySearchData kEoB1CgaMappingInvProvider[] = {
- { UNK_LANG, kPlatformDOS, { 0x00000020, 0x0000002E, { { 0x3A, 0x06, 0xBF, 0x0C, 0xD4, 0xD0, 0x15, 0x1F, 0xB5, 0xC5, 0x49, 0xFD, 0x21, 0xE1, 0xE1, 0x66 } } } },
- EXTRACT_END_ENTRY
-};
-
-const ExtractEntrySearchData kEoB1CgaMappingItemsLProvider[] = {
- { UNK_LANG, kPlatformDOS, { 0x00000020, 0x0000002A, { { 0xE0, 0x85, 0xA1, 0x3A, 0x3D, 0xC9, 0xF8, 0x56, 0x17, 0x0A, 0xD8, 0x44, 0x56, 0xDF, 0x3C, 0x57 } } } },
- EXTRACT_END_ENTRY
-};
-
-const ExtractEntrySearchData kEoB1CgaMappingItemsSProvider[] = {
- { UNK_LANG, kPlatformDOS, { 0x00000020, 0x00000036, { { 0x2E, 0x6F, 0xD4, 0x2E, 0xB2, 0x84, 0xB2, 0xC3, 0x36, 0x88, 0x80, 0xC1, 0x67, 0x5A, 0xEB, 0x60 } } } },
- EXTRACT_END_ENTRY
-};
-
-const ExtractEntrySearchData kEoB1CgaMappingThrownProvider[] = {
- { UNK_LANG, kPlatformDOS, { 0x00000020, 0x00000030, { { 0x0C, 0x3D, 0x1E, 0xAB, 0x0B, 0x25, 0x9F, 0x78, 0xE6, 0xB1, 0x52, 0x79, 0x0F, 0x96, 0x33, 0x97 } } } },
- EXTRACT_END_ENTRY
-};
-
-const ExtractEntrySearchData kEoB1CgaMappingIconsProvider[] = {
- { UNK_LANG, kPlatformDOS, { 0x00000020, 0x00000039, { { 0x99, 0x50, 0x1A, 0xE1, 0xF3, 0x52, 0xC3, 0x5A, 0x4E, 0xBD, 0x03, 0x74, 0x2C, 0x39, 0xCA, 0x71 } } } },
- EXTRACT_END_ENTRY
-};
-
-const ExtractEntrySearchData kEoB1CgaMappingDecoProvider[] = {
- { UNK_LANG, kPlatformDOS, { 0x00000020, 0x00000035, { { 0xA5, 0x17, 0xED, 0xEE, 0x02, 0x87, 0x8C, 0x9D, 0xAC, 0x96, 0xC6, 0x07, 0xB0, 0x8E, 0x5D, 0xE3 } } } },
- EXTRACT_END_ENTRY
-};
-
-const ExtractEntrySearchData kEoB1CgaLevelMappingIndexProvider[] = {
- { UNK_LANG, kPlatformDOS, { 0x0000000C, 0x00000013, { { 0x48, 0x5D, 0xDF, 0x8F, 0xFD, 0x5D, 0xA0, 0xB0, 0x00, 0xD8, 0xB3, 0x09, 0x90, 0x5D, 0x13, 0x3F } } } },
- EXTRACT_END_ENTRY
-};
-
-const ExtractEntrySearchData kEoB1CgaMappingLevel0Provider[] = {
- { UNK_LANG, kPlatformDOS, { 0x00000020, 0x00000035, { { 0xC2, 0x4D, 0x2F, 0x0A, 0xB0, 0x3E, 0x46, 0x80, 0xD1, 0xEE, 0x32, 0x5F, 0xBA, 0x5C, 0xCC, 0x7A } } } },
- EXTRACT_END_ENTRY
-};
-
-const ExtractEntrySearchData kEoB1CgaMappingLevel1Provider[] = {
- { UNK_LANG, kPlatformDOS, { 0x00000020, 0x00000030, { { 0x94, 0x8E, 0xAE, 0x12, 0xB5, 0x68, 0xCD, 0x43, 0x95, 0xD2, 0x01, 0x21, 0x0C, 0xA1, 0x34, 0xF5 } } } },
- EXTRACT_END_ENTRY
-};
-
-const ExtractEntrySearchData kEoB1CgaMappingLevel2Provider[] = {
- { UNK_LANG, kPlatformDOS, { 0x00000020, 0x00000030, { { 0x20, 0x6F, 0x9F, 0x57, 0x0C, 0xFD, 0xDA, 0x5C, 0xA0, 0x1D, 0x28, 0xB4, 0x88, 0x24, 0x68, 0x68 } } } },
- EXTRACT_END_ENTRY
-};
-
-const ExtractEntrySearchData kEoB1CgaMappingLevel3Provider[] = {
- { UNK_LANG, kPlatformDOS, { 0x00000020, 0x00000030, { { 0x44, 0x95, 0x9A, 0x69, 0x70, 0xB2, 0x63, 0xB6, 0xFB, 0xD0, 0xFF, 0xD9, 0xF0, 0xCD, 0xD4, 0x75 } } } },
- EXTRACT_END_ENTRY
-};
-
-const ExtractEntrySearchData kEoB1CgaMappingLevel4Provider[] = {
- { UNK_LANG, kPlatformDOS, { 0x00000020, 0x00000031, { { 0xEA, 0xC4, 0x01, 0xC0, 0x21, 0xFE, 0x66, 0xDD, 0xD4, 0x83, 0xC1, 0x2C, 0x09, 0xD3, 0xD0, 0x97 } } } },
- EXTRACT_END_ENTRY
-};
-
-const ExtractEntrySearchData kEoB1NpcShpDataProvider[] = {
- { UNK_LANG, kPlatformDOS, { 0x0000004C, 0x00000A42, { { 0x70, 0x21, 0x85, 0x8C, 0xD4, 0x04, 0xAA, 0x20, 0x1D, 0x0E, 0x9D, 0xB7, 0x74, 0x58, 0xCC, 0x0C } } } },
- EXTRACT_END_ENTRY
-};
-
-const ExtractEntrySearchData kEoB1NpcSubShpIndex1Provider[] = {
- { UNK_LANG, kPlatformDOS, { 0x00000006, 0x00000035, { { 0x9A, 0x83, 0xF9, 0xA4, 0x27, 0xBA, 0xFC, 0xD2, 0xDE, 0x03, 0x65, 0xF2, 0xFA, 0x37, 0xDA, 0xF1 } } } },
- EXTRACT_END_ENTRY
-};
-
-const ExtractEntrySearchData kEoB1NpcSubShpIndex2Provider[] = {
- { UNK_LANG, kPlatformDOS, { 0x00000006, 0x00000051, { { 0x7E, 0xAC, 0x0E, 0x54, 0x59, 0x5D, 0xF6, 0x53, 0x03, 0x22, 0x1D, 0xC7, 0xFC, 0x16, 0xC8, 0x88 } } } },
- EXTRACT_END_ENTRY
-};
-
-const ExtractEntrySearchData kEoB1NpcSubShpYProvider[] = {
- { UNK_LANG, kPlatformDOS, { 0x00000006, 0x00000143, { { 0xC1, 0xED, 0x93, 0x5E, 0x84, 0xCE, 0x48, 0xCF, 0x4C, 0xF3, 0x9C, 0x93, 0xBF, 0xFE, 0xB8, 0x6F } } } },
- EXTRACT_END_ENTRY
-};
-
-const ExtractEntrySearchData kEoB1Npc0StringsProvider[] = {
- { EN_ANY, kPlatformUnknown, { 0x00000044, 0x000016E2, { { 0x7C, 0x28, 0x72, 0xC9, 0x57, 0xF5, 0xAB, 0x02, 0xD1, 0x42, 0xE8, 0xA3, 0xF9, 0x33, 0x70, 0xEE } } } },
- { DE_DEU, kPlatformUnknown, { 0x00000050, 0x00001B13, { { 0x69, 0x05, 0xEB, 0xB6, 0x86, 0x81, 0xAC, 0x09, 0x53, 0x35, 0x4D, 0x55, 0xF3, 0x13, 0x6F, 0xC0 } } } },
-
- EXTRACT_END_ENTRY
-};
-
-const ExtractEntrySearchData kEoB1Npc11StringsProvider[] = {
- { EN_ANY, kPlatformUnknown, { 0x0000001B, 0x00000928, { { 0x86, 0x08, 0x95, 0x6B, 0xBF, 0x12, 0x2D, 0xF9, 0x62, 0x25, 0xD9, 0xAE, 0x25, 0x10, 0xDF, 0xDC } } } },
- { DE_DEU, kPlatformUnknown, { 0x0000001A, 0x000008DB, { { 0xBD, 0xBB, 0x48, 0x8E, 0x04, 0x7D, 0xE4, 0x78, 0xBB, 0x59, 0x6E, 0x86, 0xE1, 0x06, 0x27, 0x50 } } } },
-
- EXTRACT_END_ENTRY
-};
-
-const ExtractEntrySearchData kEoB1Npc12StringsProvider[] = {
- { EN_ANY, kPlatformUnknown, { 0x00000016, 0x0000079C, { { 0x22, 0x57, 0x3A, 0x9C, 0x7C, 0xDB, 0x55, 0xD0, 0x9C, 0x84, 0x28, 0xA6, 0x9D, 0x40, 0x38, 0x6E } } } },
- { DE_DEU, kPlatformUnknown, { 0x00000014, 0x000006ED, { { 0x88, 0x1C, 0x09, 0x61, 0x5D, 0x9D, 0xDE, 0x8A, 0x54, 0x1C, 0x40, 0xCF, 0x28, 0x2B, 0x52, 0x9D } } } },
-
- EXTRACT_END_ENTRY
-};
-
-const ExtractEntrySearchData kEoB1Npc21StringsProvider[] = {
- { EN_ANY, kPlatformUnknown, { 0x00000014, 0x000006FD, { { 0x55, 0x77, 0x2F, 0xB0, 0xB3, 0x2D, 0x81, 0x29, 0xDE, 0x71, 0x83, 0x41, 0x06, 0x5B, 0x72, 0x21 } } } },
- { DE_DEU, kPlatformUnknown, { 0x00000015, 0x00000748, { { 0x3E, 0x15, 0x27, 0xFD, 0x76, 0xFB, 0x14, 0x8C, 0xF6, 0x14, 0x3E, 0x20, 0x0A, 0x04, 0xF5, 0x32 } } } },
-
- EXTRACT_END_ENTRY
-};
-
-const ExtractEntrySearchData kEoB1Npc22StringsProvider[] = {
- { EN_ANY, kPlatformUnknown, { 0x0000000F, 0x000004D4, { { 0xE5, 0x97, 0x06, 0x45, 0x6A, 0xAC, 0x96, 0x6D, 0x0A, 0xC9, 0xDF, 0x8F, 0x96, 0x2D, 0x01, 0x5D } } } },
- { DE_DEU, kPlatformUnknown, { 0x0000000D, 0x00000439, { { 0x87, 0xCB, 0x17, 0xD2, 0xC8, 0x7F, 0x34, 0xDA, 0x82, 0x30, 0xB2, 0x68, 0xB0, 0x10, 0xD9, 0x52 } } } },
-
- EXTRACT_END_ENTRY
-};
-
-const ExtractEntrySearchData kEoB1Npc31StringsProvider[] = {
- { EN_ANY, kPlatformUnknown, { 0x00000011, 0x00000597, { { 0x5C, 0xEB, 0x0A, 0xE6, 0xB1, 0x37, 0x0E, 0x8F, 0x14, 0xB4, 0x68, 0x86, 0xE5, 0xD2, 0xDE, 0xC7 } } } },
- { DE_DEU, kPlatformUnknown, { 0x00000012, 0x00000603, { { 0x8E, 0x68, 0x55, 0xCD, 0x29, 0x1E, 0x3C, 0x06, 0x7B, 0x97, 0xE1, 0x07, 0x49, 0x09, 0xF0, 0x57 } } } },
-
- EXTRACT_END_ENTRY
-};
-
-const ExtractEntrySearchData kEoB1Npc32StringsProvider[] = {
- { EN_ANY, kPlatformUnknown, { 0x00000020, 0x00000AE4, { { 0xED, 0x09, 0x04, 0xEC, 0xE3, 0x43, 0xDA, 0xEE, 0x5D, 0x78, 0x32, 0x63, 0x68, 0xFC, 0x4F, 0x9E } } } },
- { DE_DEU, kPlatformUnknown, { 0x00000020, 0x00000B13, { { 0x87, 0x40, 0x88, 0xA5, 0xE2, 0x6F, 0x83, 0xBC, 0x99, 0x2B, 0xD3, 0xF5, 0x8D, 0x6B, 0x6E, 0x7D } } } },
-
- EXTRACT_END_ENTRY
-};
-
-const ExtractEntrySearchData kEoB1Npc4StringsProvider[] = {
- { EN_ANY, kPlatformUnknown, { 0x0000000D, 0x0000043C, { { 0x2C, 0xE7, 0xE5, 0xAA, 0xF3, 0x50, 0xA8, 0x6D, 0xC2, 0xC6, 0x88, 0xFE, 0x12, 0x96, 0xFE, 0x54 } } } },
- { DE_DEU, kPlatformUnknown, { 0x00000014, 0x00000720, { { 0xF8, 0x58, 0x9A, 0xDB, 0xE5, 0x3F, 0x67, 0x53, 0x1F, 0x27, 0x2E, 0x8D, 0x6E, 0xAD, 0x45, 0xF5 } } } },
-
- EXTRACT_END_ENTRY
-};
-
-const ExtractEntrySearchData kEoB1Npc5StringsProvider[] = {
- { EN_ANY, kPlatformUnknown, { 0x00000021, 0x00000ABC, { { 0xF1, 0xB5, 0x9E, 0x51, 0x9E, 0xF8, 0x84, 0x95, 0x55, 0x55, 0xE7, 0xDF, 0x36, 0xE1, 0x78, 0x9A } } } },
- { DE_DEU, kPlatformUnknown, { 0x0000001D, 0x00000A8C, { { 0x4A, 0xAE, 0x5B, 0x3B, 0xAD, 0x18, 0x91, 0x3F, 0xC9, 0x5A, 0x82, 0x5D, 0xA7, 0x06, 0x1A, 0xAE } } } },
-
- EXTRACT_END_ENTRY
-};
-
-const ExtractEntrySearchData kEoB1Npc6StringsProvider[] = {
- { EN_ANY, kPlatformUnknown, { 0x00000011, 0x00000612, { { 0x1B, 0xE2, 0x23, 0xD9, 0x00, 0x5C, 0xB9, 0x54, 0xCE, 0xA7, 0x6A, 0x51, 0xF6, 0xBB, 0x8A, 0xC9 } } } },
- { DE_DEU, kPlatformUnknown, { 0x00000012, 0x00000647, { { 0x6C, 0x3F, 0xE2, 0xD0, 0xB0, 0x75, 0x2D, 0x73, 0xEE, 0x6F, 0x17, 0x74, 0xAA, 0x7D, 0xA2, 0x21 } } } },
-
- EXTRACT_END_ENTRY
-};
-
-const ExtractEntrySearchData kEoB1Npc7StringsProvider[] = {
- { EN_ANY, kPlatformUnknown, { 0x00000018, 0x00000777, { { 0x60, 0xB4, 0x17, 0x72, 0x89, 0x87, 0x47, 0xE3, 0xD9, 0xC3, 0x59, 0x16, 0xFD, 0x03, 0x31, 0xD4 } } } },
- { DE_DEU, kPlatformUnknown, { 0x00000016, 0x000007B6, { { 0xAE, 0xB6, 0x3C, 0x14, 0x2B, 0x34, 0xB8, 0x7C, 0xCF, 0x87, 0xDA, 0x70, 0xBF, 0x0D, 0xAB, 0xE2 } } } },
-
- EXTRACT_END_ENTRY
-};
-
-const ExtractEntrySearchData kEoB2MainMenuStringsProvider[] = {
- { EN_ANY, kPlatformUnknown, { 0x0000005F, 0x000017BE, { { 0x77, 0x8A, 0x50, 0x9F, 0x42, 0xD8, 0x00, 0x05, 0x60, 0x2A, 0x80, 0x25, 0x00, 0xDC, 0x7C, 0x92 } } } },
- { DE_DEU, kPlatformUnknown, { 0x0000005E, 0x000017F3, { { 0xD0, 0x93, 0x2E, 0x5F, 0x9D, 0xDB, 0xC4, 0xFB, 0x9E, 0x9F, 0x14, 0xD6, 0xB4, 0xBE, 0x3D, 0x0C } } } },
- EXTRACT_END_ENTRY
-};
-
-const ExtractEntrySearchData kEoB2TransferPortraitFramesProvider[] = {
- { UNK_LANG, kPlatformUnknown, { 0x00000040, 0x00000B25, { { 0x13, 0x25, 0x69, 0xC6, 0xE4, 0x9D, 0x35, 0x11, 0xAB, 0xE2, 0xC1, 0xEF, 0x21, 0x8B, 0xB8, 0x28 } } } },
- EXTRACT_END_ENTRY
-};
-
-const ExtractEntrySearchData kEoB2TransferConvertTableProvider[] = {
- { UNK_LANG, kPlatformUnknown, { 0x00000031, 0x000004BC, { { 0x96, 0x53, 0xA2, 0xF1, 0x26, 0xFE, 0x1B, 0x5E, 0xDF, 0x62, 0x2C, 0x8C, 0xBD, 0x62, 0x5A, 0xF9 } } } },
- EXTRACT_END_ENTRY
-};
-
-const ExtractEntrySearchData kEoB2TransferItemTableProvider[] = {
- { UNK_LANG, kPlatformUnknown, { 0x0000003C, 0x00000025, { { 0xD0, 0xA4, 0xB3, 0x7D, 0x74, 0x4D, 0x16, 0x43, 0x56, 0x07, 0x84, 0xAA, 0x96, 0xBD, 0x82, 0x25 } } } },
- EXTRACT_END_ENTRY
-};
-
-const ExtractEntrySearchData kEoB2TransferExpTableProvider[] = {
- { UNK_LANG, kPlatformUnknown, { 0x00000018, 0x0000076B, { { 0x91, 0x65, 0x5B, 0x8D, 0xE8, 0x5B, 0x28, 0x32, 0x4D, 0x7A, 0x57, 0x8E, 0x18, 0x5B, 0x1A, 0xE9 } } } },
- EXTRACT_END_ENTRY
-};
-
-const ExtractEntrySearchData kEoB2TransferStrings1Provider[] = {
- { EN_ANY, kPlatformUnknown, { 0x00000010, 0x000003D3, { { 0x31, 0xE4, 0x65, 0x69, 0x0A, 0xA1, 0x1D, 0xD1, 0xFE, 0xF8, 0x5C, 0x29, 0xB1, 0x46, 0xBD, 0xBE } } } },
- { DE_DEU, kPlatformUnknown, { 0x00000010, 0x000003E2, { { 0xF0, 0x10, 0xF8, 0x9F, 0x05, 0x1E, 0x31, 0x33, 0x4E, 0xC8, 0x49, 0xBC, 0x9E, 0xAD, 0xD4, 0x99 } } } },
- EXTRACT_END_ENTRY
-};
-
-const ExtractEntrySearchData kEoB2TransferStrings2Provider[] = {
- { EN_ANY, kPlatformUnknown, { 0x0000006A, 0x00002681, { { 0x12, 0x4D, 0x29, 0x9D, 0xD3, 0xFC, 0x39, 0x22, 0x73, 0x1E, 0x5C, 0xAF, 0x1F, 0xD1, 0xAA, 0x87 } } } },
- { DE_DEU, kPlatformUnknown, { 0x00000057, 0x00001F8E, { { 0x85, 0xD8, 0x39, 0x1E, 0x6D, 0x97, 0xBD, 0x0E, 0xDD, 0xCF, 0x19, 0x47, 0x31, 0xDC, 0x7C, 0x1A } } } },
- EXTRACT_END_ENTRY
-};
-
-const ExtractEntrySearchData kEoB2TransferLabelsProvider[] = {
- { EN_ANY, kPlatformUnknown, { 0x0000000A, 0x00000240, { { 0x2A, 0x8B, 0x54, 0x99, 0x94, 0x35, 0x2B, 0xAB, 0x7F, 0x7F, 0x98, 0xA3, 0xFD, 0x57, 0x20, 0xDE } } } },
- { DE_DEU, kPlatformUnknown, { 0x00000009, 0x000001DF, { { 0x47, 0x6B, 0xBA, 0xCD, 0x99, 0x74, 0xCA, 0x3C, 0xAA, 0xC6, 0xB4, 0x50, 0x38, 0x90, 0x25, 0xB8 } } } },
- EXTRACT_END_ENTRY
-};
-
-const ExtractEntrySearchData kEoB2IntroStringsProvider[] = {
- { EN_ANY, kPlatformUnknown, { 0x00000321, 0x0000DBC3, { { 0x11, 0x9B, 0x54, 0xB3, 0x34, 0xF0, 0xB5, 0xE1, 0xFA, 0x6A, 0x31, 0x02, 0x59, 0x29, 0xCA, 0x94 } } } },
- { DE_DEU, kPlatformUnknown, { 0x0000038E, 0x0001119C, { { 0x92, 0x63, 0x18, 0xDD, 0x9F, 0x62, 0xF5, 0xBC, 0x3D, 0x93, 0xDC, 0x6E, 0xE5, 0xBE, 0x8C, 0x0B } } } },
- EXTRACT_END_ENTRY
-};
-
-const ExtractEntrySearchData kEoB2IntroCPSFilesProvider[] = {
- { EN_ANY, kPlatformUnknown, { 0x000000A2, 0x0000296A, { { 0xE9, 0x28, 0x4A, 0x6E, 0xAA, 0x44, 0xF4, 0xD7, 0xD1, 0x29, 0xBF, 0x90, 0x6B, 0x82, 0xD1, 0x77 } } } },
- { DE_DEU, kPlatformUnknown, { 0x000000A2, 0x0000296B, { { 0x03, 0xA2, 0x0A, 0xAB, 0x76, 0x78, 0x04, 0x88, 0x6A, 0xE0, 0x36, 0x8B, 0x3A, 0x87, 0x44, 0xC8 } } } },
- EXTRACT_END_ENTRY
-};
-
-const ExtractEntrySearchData kEob2IntroAnimData00Provider[] = {
- { UNK_LANG, kPlatformUnknown, { 0x00000037, 0x000003E1, { { 0x38, 0xC2, 0x0F, 0xE1, 0x43, 0x6A, 0xE8, 0x7C, 0x82, 0x65, 0x9B, 0x4A, 0x9F, 0x83, 0xCD, 0xC8 } } } },
- EXTRACT_END_ENTRY
-};
-
-const ExtractEntrySearchData kEob2IntroAnimData01Provider[] = {
- { UNK_LANG, kPlatformUnknown, { 0x00000037, 0x000003A3, { { 0x84, 0x44, 0xF4, 0x46, 0x4E, 0x2B, 0xD7, 0xC6, 0xAD, 0x14, 0xF1, 0x9E, 0x8A, 0xBE, 0x7B, 0x42 } } } },
- EXTRACT_END_ENTRY
-};
-
-const ExtractEntrySearchData kEob2IntroAnimData02Provider[] = {
- { UNK_LANG, kPlatformUnknown, { 0x00000037, 0x00000446, { { 0x0C, 0xCA, 0x41, 0x0C, 0x89, 0x59, 0xD5, 0x28, 0x9A, 0xDC, 0x51, 0x1C, 0x0B, 0x8C, 0xD2, 0xDB } } } },
- EXTRACT_END_ENTRY
-};
-
-const ExtractEntrySearchData kEob2IntroAnimData03Provider[] = {
- { UNK_LANG, kPlatformUnknown, { 0x0000002C, 0x0000010E, { { 0xAB, 0x48, 0x64, 0x02, 0xB3, 0xF3, 0x6C, 0x82, 0x9D, 0x37, 0x5F, 0x52, 0x0F, 0x5B, 0xDF, 0x96 } } } },
- EXTRACT_END_ENTRY
-};
-
-const ExtractEntrySearchData kEob2IntroAnimData04Provider[] = {
- { UNK_LANG, kPlatformUnknown, { 0x00000021, 0x00000149, { { 0x3B, 0xAC, 0x14, 0x51, 0xDF, 0x5D, 0x22, 0x15, 0x46, 0x4E, 0xCD, 0xF3, 0xD4, 0x61, 0x29, 0x4A } } } },
- EXTRACT_END_ENTRY
-};
-
-const ExtractEntrySearchData kEob2IntroAnimData05Provider[] = {
- { UNK_LANG, kPlatformUnknown, { 0x0000002C, 0x0000010E, { { 0x28, 0x29, 0x5F, 0x31, 0x23, 0x53, 0xBA, 0xD7, 0x24, 0xB9, 0x21, 0x70, 0x84, 0x8A, 0x1C, 0x2E } } } },
- EXTRACT_END_ENTRY
-};
-
-const ExtractEntrySearchData kEob2IntroAnimData06Provider[] = {
- { UNK_LANG, kPlatformUnknown, { 0x000000B0, 0x00001365, { { 0x91, 0x28, 0x2F, 0x10, 0x45, 0x4D, 0xCF, 0x3E, 0x70, 0x1E, 0xD4, 0xBA, 0x0E, 0x70, 0xDE, 0xD0 } } } },
- EXTRACT_END_ENTRY
-};
-
-const ExtractEntrySearchData kEob2IntroAnimData07Provider[] = {
- { UNK_LANG, kPlatformUnknown, { 0x00000037, 0x000003C4, { { 0x8C, 0x72, 0xDE, 0x4F, 0x92, 0x52, 0x0A, 0xED, 0xF4, 0x79, 0xD6, 0x3D, 0x8F, 0x59, 0x9D, 0x69 } } } },
- EXTRACT_END_ENTRY
-};
-
-const ExtractEntrySearchData kEob2IntroAnimData08Provider[] = {
- { UNK_LANG, kPlatformUnknown, { 0x00000042, 0x00000442, { { 0xD2, 0x91, 0x51, 0xEB, 0x91, 0x13, 0x43, 0xCE, 0x7E, 0x60, 0xB8, 0xFF, 0xA7, 0xE2, 0x4C, 0x11 } } } },
- EXTRACT_END_ENTRY
-};
-
-const ExtractEntrySearchData kEob2IntroAnimData09Provider[] = {
- { UNK_LANG, kPlatformUnknown, { 0x0000002C, 0x000004BC, { { 0xD6, 0xC7, 0x44, 0x2E, 0xE7, 0x2A, 0x44, 0x09, 0x39, 0xC3, 0xD3, 0xA8, 0x02, 0xC8, 0xA0, 0x19 } } } },
- EXTRACT_END_ENTRY
-};
-
-const ExtractEntrySearchData kEob2IntroAnimData10Provider[] = {
- { UNK_LANG, kPlatformUnknown, { 0x0000006E, 0x00000C12, { { 0x91, 0xDB, 0x41, 0x7A, 0x4F, 0x7C, 0x7B, 0x83, 0x32, 0x13, 0x68, 0xF6, 0x58, 0x79, 0xDA, 0x99 } } } },
- EXTRACT_END_ENTRY
-};
-
-const ExtractEntrySearchData kEob2IntroAnimData11Provider[] = {
- { UNK_LANG, kPlatformUnknown, { 0x000000B0, 0x0000073C, { { 0x17, 0x1F, 0x4D, 0x05, 0x3F, 0x14, 0x2E, 0x77, 0xD3, 0xDB, 0x78, 0x67, 0xBB, 0x18, 0xDC, 0x85 } } } },
- EXTRACT_END_ENTRY
-};
-
-const ExtractEntrySearchData kEob2IntroAnimData12Provider[] = {
- { UNK_LANG, kPlatformUnknown, { 0x00000021, 0x00000228, { { 0xC9, 0x50, 0x68, 0x51, 0xD0, 0xC1, 0x5D, 0xD4, 0xFF, 0x08, 0x28, 0xDE, 0xC4, 0x41, 0x8C, 0xDB } } } },
- EXTRACT_END_ENTRY
-};
-
-const ExtractEntrySearchData kEob2IntroAnimData13Provider[] = {
- { UNK_LANG, kPlatformUnknown, { 0x0000002C, 0x00000340, { { 0x03, 0xCA, 0x5D, 0xD1, 0x15, 0xFA, 0x60, 0xD7, 0x70, 0x64, 0x3D, 0x44, 0x08, 0xB8, 0xDB, 0xAD } } } },
- EXTRACT_END_ENTRY
-};
-
-const ExtractEntrySearchData kEob2IntroAnimData14Provider[] = {
- { UNK_LANG, kPlatformUnknown, { 0x00000042, 0x000007C0, { { 0x82, 0xA9, 0x0B, 0x90, 0x9D, 0x65, 0x1E, 0xC7, 0x03, 0x5E, 0xB7, 0xDF, 0x6E, 0x1F, 0xED, 0xD6 } } } },
- EXTRACT_END_ENTRY
-};
-
-const ExtractEntrySearchData kEob2IntroAnimData15Provider[] = {
- { UNK_LANG, kPlatformUnknown, { 0x0000002C, 0x00000504, { { 0xA7, 0x91, 0x4F, 0xAD, 0xB1, 0x77, 0x80, 0x3A, 0xC7, 0xDE, 0x35, 0x7A, 0x96, 0x16, 0xD2, 0x13 } } } },
- EXTRACT_END_ENTRY
-};
-
-const ExtractEntrySearchData kEob2IntroAnimData16Provider[] = {
- { UNK_LANG, kPlatformUnknown, { 0x00000079, 0x00000B3D, { { 0xCC, 0x63, 0x5A, 0x11, 0xEE, 0x8A, 0xAE, 0x3A, 0x14, 0xC3, 0xBC, 0xDA, 0xAF, 0x1D, 0xD4, 0x2C } } } },
- EXTRACT_END_ENTRY
-};
-
-const ExtractEntrySearchData kEob2IntroAnimData17Provider[] = {
- { UNK_LANG, kPlatformUnknown, { 0x00000084, 0x00000911, { { 0x09, 0x1C, 0x4B, 0xD9, 0x0B, 0x2A, 0xD6, 0xC1, 0xE3, 0x8D, 0xFE, 0x43, 0x8F, 0x2E, 0x21, 0x51 } } } },
- EXTRACT_END_ENTRY
-};
-
-const ExtractEntrySearchData kEob2IntroAnimData18Provider[] = {
- { UNK_LANG, kPlatformUnknown, { 0x00000058, 0x000008FA, { { 0xFE, 0x58, 0xD9, 0x67, 0x78, 0x97, 0xE2, 0xCD, 0x82, 0xB8, 0xC9, 0xC0, 0x1F, 0xCA, 0x7C, 0xF5 } } } },
- EXTRACT_END_ENTRY
-};
-
-const ExtractEntrySearchData kEob2IntroAnimData19Provider[] = {
- { UNK_LANG, kPlatformUnknown, { 0x0000009A, 0x00000D6B, { { 0xA1, 0xDD, 0x7B, 0x8B, 0x25, 0xA5, 0x96, 0x5A, 0x33, 0x5E, 0x80, 0x5F, 0xA5, 0xBB, 0xAC, 0x11 } } } },
- EXTRACT_END_ENTRY
-};
-
-const ExtractEntrySearchData kEob2IntroAnimData20Provider[] = {
- { UNK_LANG, kPlatformUnknown, { 0x0000009A, 0x00000D6C, { { 0x19, 0xF9, 0x93, 0x1D, 0x01, 0xEE, 0x7C, 0x8B, 0x6C, 0x3E, 0x35, 0x2C, 0x5C, 0x88, 0xCD, 0xB6 } } } },
- EXTRACT_END_ENTRY
-};
-
-const ExtractEntrySearchData kEob2IntroAnimData21Provider[] = {
- { UNK_LANG, kPlatformUnknown, { 0x0000009A, 0x00000D83, { { 0xCB, 0x4F, 0x21, 0x29, 0x63, 0x5B, 0x8C, 0xF2, 0xBA, 0x03, 0x49, 0xD1, 0xAF, 0x22, 0xB0, 0xD5 } } } },
- EXTRACT_END_ENTRY
-};
-
-const ExtractEntrySearchData kEob2IntroAnimData22Provider[] = {
- { UNK_LANG, kPlatformUnknown, { 0x00000016, 0x00000200, { { 0x66, 0xEE, 0x45, 0xB1, 0x87, 0x66, 0xC4, 0x55, 0xCE, 0x60, 0x0C, 0x5B, 0xBB, 0x3C, 0x7D, 0x33 } } } },
- EXTRACT_END_ENTRY
-};
-
-const ExtractEntrySearchData kEob2IntroAnimData23Provider[] = {
- { UNK_LANG, kPlatformUnknown, { 0x00000016, 0x0000020D, { { 0xC4, 0x49, 0xE2, 0x5B, 0x2E, 0x17, 0x68, 0xC4, 0xBA, 0x20, 0xEC, 0xB1, 0xEB, 0x1A, 0xFB, 0xE0 } } } },
- EXTRACT_END_ENTRY
-};
-
-const ExtractEntrySearchData kEob2IntroAnimData24Provider[] = {
- { UNK_LANG, kPlatformUnknown, { 0x00000016, 0x00000214, { { 0xF1, 0x46, 0x82, 0xEF, 0x6D, 0xCA, 0x68, 0xA2, 0xF3, 0x55, 0x63, 0xD2, 0x13, 0x25, 0x19, 0xF7 } } } },
- EXTRACT_END_ENTRY
-};
-
-const ExtractEntrySearchData kEob2IntroAnimData25Provider[] = {
- { UNK_LANG, kPlatformUnknown, { 0x00000016, 0x00000256, { { 0x8F, 0xB9, 0xCD, 0xB8, 0x58, 0xCB, 0x90, 0x03, 0xFC, 0xB6, 0x95, 0x6F, 0x52, 0xF8, 0x7D, 0x19 } } } },
- EXTRACT_END_ENTRY
-};
-
-const ExtractEntrySearchData kEob2IntroAnimData26Provider[] = {
- { UNK_LANG, kPlatformUnknown, { 0x00000016, 0x00000263, { { 0x7A, 0x37, 0x07, 0xC4, 0x67, 0x72, 0x1F, 0xCB, 0xAC, 0x98, 0x46, 0x9A, 0xF3, 0x5F, 0xBA, 0x78 } } } },
- EXTRACT_END_ENTRY
-};
-
-const ExtractEntrySearchData kEob2IntroAnimData27Provider[] = {
- { UNK_LANG, kPlatformUnknown, { 0x00000016, 0x0000026A, { { 0x80, 0x11, 0xEE, 0x44, 0xDA, 0xE1, 0x26, 0x1F, 0x14, 0x7E, 0x93, 0x99, 0x44, 0x44, 0x9F, 0x85 } } } },
- EXTRACT_END_ENTRY
-};
-
-const ExtractEntrySearchData kEob2IntroAnimData28Provider[] = {
- { UNK_LANG, kPlatformUnknown, { 0x00000016, 0x000001F6, { { 0x45, 0xA1, 0xA5, 0xEC, 0x85, 0x06, 0xE2, 0x91, 0x28, 0xE0, 0xBB, 0x53, 0x74, 0x44, 0xD9, 0xA6 } } } },
- EXTRACT_END_ENTRY
-};
-
-const ExtractEntrySearchData kEob2IntroAnimData29Provider[] = {
- { UNK_LANG, kPlatformUnknown, { 0x00000016, 0x000001F9, { { 0x3F, 0x03, 0x2F, 0x8B, 0xFB, 0x6A, 0x97, 0x05, 0xED, 0xBB, 0xD6, 0xA0, 0xF5, 0x7A, 0x6D, 0x08 } } } },
- EXTRACT_END_ENTRY
-};
-
-const ExtractEntrySearchData kEob2IntroAnimData30Provider[] = {
- { UNK_LANG, kPlatformUnknown, { 0x00000016, 0x00000204, { { 0xA1, 0x37, 0x57, 0xC3, 0x72, 0x08, 0x98, 0xA6, 0xF4, 0x5E, 0x58, 0x9E, 0xF3, 0x11, 0x88, 0x1E } } } },
- EXTRACT_END_ENTRY
-};
-
-const ExtractEntrySearchData kEob2IntroAnimData31Provider[] = {
- { UNK_LANG, kPlatformUnknown, { 0x00000016, 0x00000212, { { 0x19, 0xCC, 0x6F, 0xA8, 0x29, 0xB5, 0x3B, 0x15, 0x2F, 0x2C, 0x43, 0xED, 0x7A, 0xF5, 0xC5, 0x69 } } } },
- EXTRACT_END_ENTRY
-};
-
-const ExtractEntrySearchData kEob2IntroAnimData32Provider[] = {
- { UNK_LANG, kPlatformUnknown, { 0x00000037, 0x000006C9, { { 0xBF, 0x65, 0xBA, 0x3F, 0x44, 0xEE, 0xB0, 0x5C, 0x8B, 0xBD, 0x15, 0xAB, 0x03, 0xD1, 0x55, 0x21 } } } },
- EXTRACT_END_ENTRY
-};
-
-const ExtractEntrySearchData kEob2IntroAnimData33Provider[] = {
- { UNK_LANG, kPlatformUnknown, { 0x0000009A, 0x00001585, { { 0xB5, 0x44, 0x06, 0xC9, 0xE8, 0x27, 0x75, 0x6E, 0x63, 0x77, 0xE9, 0xA9, 0x68, 0x73, 0xF5, 0x78 } } } },
- EXTRACT_END_ENTRY
-};
-
-const ExtractEntrySearchData kEob2IntroAnimData34Provider[] = {
- { UNK_LANG, kPlatformUnknown, { 0x00000058, 0x00000B43, { { 0x52, 0xB4, 0x1E, 0x14, 0x88, 0xBD, 0x8A, 0xD7, 0x38, 0xDF, 0x25, 0xB0, 0xAF, 0xAE, 0x76, 0xE1 } } } },
- EXTRACT_END_ENTRY
-};
-
-const ExtractEntrySearchData kEob2IntroAnimData35Provider[] = {
- { UNK_LANG, kPlatformUnknown, { 0x00000037, 0x000005A4, { { 0xFB, 0x82, 0xE7, 0xB2, 0x54, 0xDB, 0xB5, 0xE1, 0xCE, 0xFB, 0xD1, 0x23, 0x39, 0x8F, 0xA1, 0x0D } } } },
- EXTRACT_END_ENTRY
-};
-
-const ExtractEntrySearchData kEob2IntroAnimData36Provider[] = {
- { UNK_LANG, kPlatformUnknown, { 0x00000042, 0x00000572, { { 0x2C, 0x16, 0xD9, 0xBE, 0xDB, 0xBA, 0x04, 0xCA, 0x97, 0xB5, 0x88, 0x43, 0xA8, 0x62, 0xE2, 0x04 } } } },
- EXTRACT_END_ENTRY
-};
-
-const ExtractEntrySearchData kEob2IntroAnimData37Provider[] = {
- { UNK_LANG, kPlatformUnknown, { 0x00000016, 0x0000024E, { { 0xFF, 0x28, 0xD8, 0x62, 0xC6, 0xAD, 0x48, 0xC7, 0x31, 0x84, 0x6C, 0xBA, 0x9F, 0x4D, 0x15, 0xDA } } } },
- EXTRACT_END_ENTRY
-};
-
-const ExtractEntrySearchData kEob2IntroAnimData38Provider[] = {
- { UNK_LANG, kPlatformUnknown, { 0x000001D9, 0x00001FB1, { { 0x16, 0xB0, 0xDF, 0x86, 0x8C, 0xB3, 0x52, 0xEF, 0x21, 0x04, 0x22, 0x6D, 0xC0, 0x03, 0xB8, 0xC6 } } } },
- EXTRACT_END_ENTRY
-};
-
-const ExtractEntrySearchData kEob2IntroAnimData39Provider[] = {
- { UNK_LANG, kPlatformUnknown, { 0x0000004D, 0x00000582, { { 0x11, 0x6C, 0xBB, 0xF6, 0x1B, 0x3C, 0xAE, 0xAA, 0x40, 0x27, 0x3F, 0x86, 0x33, 0x92, 0xCB, 0xA9 } } } },
- EXTRACT_END_ENTRY
-};
-
-const ExtractEntrySearchData kEob2IntroAnimData40Provider[] = {
- { UNK_LANG, kPlatformUnknown, { 0x00000160, 0x000010A2, { { 0xD9, 0x9D, 0xF1, 0x7D, 0xE1, 0x7C, 0x61, 0xC0, 0xD4, 0xD3, 0x05, 0x0C, 0x79, 0xDD, 0xDB, 0xD1 } } } },
- EXTRACT_END_ENTRY
-};
-
-const ExtractEntrySearchData kEob2IntroAnimData41Provider[] = {
- { UNK_LANG, kPlatformUnknown, { 0x00000037, 0x00000355, { { 0x92, 0x85, 0xBE, 0x5A, 0x38, 0x08, 0xF3, 0xDF, 0xC6, 0x56, 0x74, 0xC3, 0x0B, 0x3F, 0x72, 0x4D } } } },
- EXTRACT_END_ENTRY
-};
-
-const ExtractEntrySearchData kEob2IntroAnimData42Provider[] = {
- { UNK_LANG, kPlatformUnknown, { 0x00000021, 0x0000010B, { { 0x68, 0xF8, 0x1D, 0x74, 0x6D, 0x32, 0x1E, 0x3A, 0x1C, 0xD1, 0x1D, 0x4B, 0x89, 0x3D, 0x5F, 0x2B } } } },
- EXTRACT_END_ENTRY
-};
-
-const ExtractEntrySearchData kEob2IntroAnimData43Provider[] = {
- { UNK_LANG, kPlatformUnknown, { 0x00000037, 0x00000116, { { 0xD5, 0x46, 0xCB, 0x3F, 0x27, 0xBD, 0x2B, 0xD6, 0x35, 0x69, 0x9E, 0x0A, 0x28, 0xDA, 0xC9, 0x84 } } } },
- EXTRACT_END_ENTRY
-};
-
-const ExtractEntrySearchData kEoB2IntroShapes00Provider[] = {
- { UNK_LANG, kPlatformUnknown, { 0x0000005A, 0x00000A86, { { 0xF9, 0xD5, 0xD2, 0x93, 0xBC, 0xC4, 0x86, 0x3F, 0x83, 0x0D, 0xDB, 0x38, 0x60, 0x6E, 0xA7, 0xDA } } } },
- EXTRACT_END_ENTRY
-};
-
-const ExtractEntrySearchData kEoB2IntroShapes01Provider[] = {
- { UNK_LANG, kPlatformUnknown, { 0x0000000C, 0x0000009B, { { 0xAA, 0xDD, 0x25, 0x21, 0x57, 0x6A, 0xB7, 0xEB, 0xDA, 0xFD, 0x72, 0x3B, 0xCA, 0x68, 0xDB, 0x34 } } } },
- EXTRACT_END_ENTRY
-};
-
-const ExtractEntrySearchData kEoB2IntroShapes04Provider[] = {
- { UNK_LANG, kPlatformUnknown, { 0x0000003C, 0x00000417, { { 0x13, 0x95, 0x81, 0x46, 0x84, 0x36, 0xF2, 0xFC, 0xDE, 0x15, 0x85, 0x81, 0xB3, 0x9A, 0x9D, 0x20 } } } },
- EXTRACT_END_ENTRY
-};
-
-const ExtractEntrySearchData kEoB2IntroShapes07Provider[] = {
- { UNK_LANG, kPlatformUnknown, { 0x0000006C, 0x000021F1, { { 0x6F, 0x7C, 0x28, 0xBB, 0xC3, 0x52, 0xE4, 0x13, 0xB4, 0xE9, 0xA4, 0x47, 0x9A, 0xBE, 0x19, 0xDA } } } },
- EXTRACT_END_ENTRY
-};
-
-const ExtractEntrySearchData kEoB2FinaleStringsProvider[] = {
- { EN_ANY, kPlatformUnknown, { 0x0000031C, 0x0000E287, { { 0x1E, 0x73, 0x93, 0x79, 0xB7, 0xF8, 0x17, 0xEE, 0xE4, 0xFC, 0xF0, 0x34, 0x9D, 0x06, 0x4F, 0x55 } } } },
- { DE_DEU, kPlatformUnknown, { 0x0000039F, 0x00011660, { { 0xBC, 0x1D, 0x95, 0x20, 0x32, 0xF5, 0x83, 0xCF, 0xF7, 0x11, 0xE4, 0x1D, 0x89, 0x47, 0xF0, 0x65 } } } },
- EXTRACT_END_ENTRY
-};
-
-const ExtractEntrySearchData kEoB2CreditsDataProvider[] = {
- { EN_ANY, kPlatformUnknown, { 0x0000090C, 0x00023464, { { 0x55, 0x31, 0x9D, 0x60, 0x2C, 0xA1, 0x0B, 0xF9, 0xED, 0x46, 0xDF, 0x44, 0x1A, 0x9F, 0xB1, 0xB0 } } } },
- { DE_DEU, kPlatformUnknown, { 0x00000B11, 0x0002BBD7, { { 0x46, 0x24, 0x78, 0xE9, 0xCE, 0x75, 0x45, 0x7B, 0x3B, 0xAA, 0x15, 0xD8, 0x5B, 0xCB, 0x06, 0x3A } } } },
- EXTRACT_END_ENTRY
-};
-
-const ExtractEntrySearchData kEoB2FinaleCPSFilesProvider[] = {
- { EN_ANY, kPlatformUnknown, { 0x0000009C, 0x00002853, { { 0x1F, 0xB9, 0x3D, 0x48, 0x47, 0x31, 0x0D, 0xA8, 0x92, 0x52, 0xD1, 0x54, 0x48, 0x42, 0x47, 0xBD } } } },
- { DE_DEU, kPlatformUnknown, { 0x0000009C, 0x00002878, { { 0x48, 0x3B, 0x7A, 0xC2, 0x9C, 0xEC, 0x10, 0x07, 0xD1, 0xB6, 0x9E, 0x89, 0xE9, 0xE1, 0xBF, 0xBF } } } },
- EXTRACT_END_ENTRY
-};
-
-const ExtractEntrySearchData kEob2FinaleAnimData00Provider[] = {
- { UNK_LANG, kPlatformUnknown, { 0x00000079, 0x00000B66, { { 0x9B, 0x8C, 0x17, 0xFA, 0xD2, 0x4F, 0x4B, 0x0E, 0x3A, 0x43, 0xB1, 0x86, 0x0C, 0xDC, 0x73, 0xAB } } } },
- EXTRACT_END_ENTRY
-};
-
-const ExtractEntrySearchData kEob2FinaleAnimData01Provider[] = {
- { UNK_LANG, kPlatformUnknown, { 0x00000063, 0x00000A03, { { 0xBB, 0x31, 0xEA, 0x35, 0xFB, 0x99, 0x4C, 0x3E, 0x72, 0xBD, 0x36, 0x6B, 0x5C, 0x03, 0x19, 0x7F } } } },
- EXTRACT_END_ENTRY
-};
-
-const ExtractEntrySearchData kEob2FinaleAnimData02Provider[] = {
- { UNK_LANG, kPlatformUnknown, { 0x0000002C, 0x000007C2, { { 0xF6, 0x83, 0x37, 0x58, 0x3C, 0x59, 0x84, 0x8F, 0x97, 0x80, 0xE2, 0xD8, 0xFD, 0x77, 0xA9, 0x54 } } } },
- EXTRACT_END_ENTRY
-};
-
-const ExtractEntrySearchData kEob2FinaleAnimData03Provider[] = {
- { UNK_LANG, kPlatformUnknown, { 0x00000042, 0x0000092B, { { 0x47, 0xE4, 0x34, 0xE8, 0x72, 0xCC, 0xA4, 0x4A, 0xA4, 0x8F, 0xBA, 0xBC, 0x0C, 0x04, 0x18, 0xAF } } } },
- EXTRACT_END_ENTRY
-};
-
-const ExtractEntrySearchData kEob2FinaleAnimData04Provider[] = {
- { UNK_LANG, kPlatformUnknown, { 0x00000058, 0x0000080B, { { 0x16, 0xDB, 0x77, 0x4C, 0x8E, 0xFD, 0x44, 0xF6, 0x5E, 0x28, 0x0B, 0x74, 0x93, 0x45, 0x8F, 0xD9 } } } },
- EXTRACT_END_ENTRY
-};
-
-const ExtractEntrySearchData kEob2FinaleAnimData05Provider[] = {
- { UNK_LANG, kPlatformUnknown, { 0x0000004D, 0x00000C72, { { 0x6C, 0x57, 0x56, 0x7E, 0x87, 0x10, 0x9C, 0xE7, 0x69, 0xAC, 0x3B, 0x3F, 0xF6, 0x43, 0x5C, 0xD4 } } } },
- EXTRACT_END_ENTRY
-};
-
-const ExtractEntrySearchData kEob2FinaleAnimData06Provider[] = {
- { UNK_LANG, kPlatformUnknown, { 0x00000016, 0x00000264, { { 0x48, 0x49, 0x5D, 0x78, 0xE2, 0xF1, 0x0D, 0x87, 0xEE, 0xEE, 0xD1, 0xA1, 0xC6, 0x64, 0xCA, 0x13 } } } },
- EXTRACT_END_ENTRY
-};
-
-const ExtractEntrySearchData kEob2FinaleAnimData07Provider[] = {
- { UNK_LANG, kPlatformUnknown, { 0x00000042, 0x00000ABE, { { 0xFE, 0xA9, 0x5D, 0x87, 0xAF, 0x55, 0x04, 0x92, 0x41, 0xD3, 0xAD, 0x1D, 0xFF, 0x03, 0x81, 0x3C } } } },
- EXTRACT_END_ENTRY
-};
-
-const ExtractEntrySearchData kEob2FinaleAnimData08Provider[] = {
- { UNK_LANG, kPlatformUnknown, { 0x00000021, 0x000004D8, { { 0x4E, 0xA7, 0xCC, 0x0B, 0x1B, 0x48, 0x22, 0x09, 0x33, 0xF7, 0x23, 0xF1, 0xF5, 0x9F, 0xA5, 0x7B } } } },
- EXTRACT_END_ENTRY
-};
-
-const ExtractEntrySearchData kEob2FinaleAnimData09Provider[] = {
- { UNK_LANG, kPlatformUnknown, { 0x00000058, 0x000004BE, { { 0xF6, 0xEA, 0xA0, 0x7F, 0x54, 0x61, 0x79, 0x4C, 0x71, 0xD7, 0x9B, 0xA6, 0xC3, 0x45, 0xEE, 0x3E } } } },
- EXTRACT_END_ENTRY
-};
-
-const ExtractEntrySearchData kEob2FinaleAnimData10Provider[] = {
- { UNK_LANG, kPlatformUnknown, { 0x0000009A, 0x00000FC4, { { 0xA9, 0xFB, 0x31, 0x55, 0xB8, 0x28, 0x63, 0xC3, 0x4B, 0x9E, 0x7D, 0x41, 0xC7, 0x1F, 0x2F, 0xBD } } } },
- EXTRACT_END_ENTRY
-};
-
-const ExtractEntrySearchData kEob2FinaleAnimData11Provider[] = {
- { UNK_LANG, kPlatformUnknown, { 0x000000C6, 0x0000166B, { { 0xCC, 0x16, 0x50, 0xFF, 0xFF, 0xD5, 0xAE, 0x03, 0x40, 0xA3, 0x9A, 0x1F, 0xF8, 0x8E, 0x23, 0x7A } } } },
- EXTRACT_END_ENTRY
-};
-
-const ExtractEntrySearchData kEob2FinaleAnimData12Provider[] = {
- { UNK_LANG, kPlatformUnknown, { 0x000000FD, 0x00001A69, { { 0x6A, 0x80, 0x89, 0x7E, 0xFC, 0xE4, 0x01, 0xF5, 0xA2, 0x11, 0xE7, 0x26, 0x20, 0x96, 0x62, 0x7B } } } },
- EXTRACT_END_ENTRY
-};
-
-const ExtractEntrySearchData kEob2FinaleAnimData13Provider[] = {
- { UNK_LANG, kPlatformUnknown, { 0x000000FD, 0x00001886, { { 0xF9, 0x5B, 0x62, 0xDD, 0xAB, 0x14, 0x35, 0x77, 0x53, 0x05, 0xDB, 0xC5, 0xFD, 0x4D, 0x4F, 0x12 } } } },
- EXTRACT_END_ENTRY
-};
-
-const ExtractEntrySearchData kEob2FinaleAnimData14Provider[] = {
- { UNK_LANG, kPlatformUnknown, { 0x00000108, 0x00001895, { { 0x22, 0xA1, 0x88, 0x69, 0xF9, 0x1C, 0xA2, 0x64, 0x44, 0xCD, 0x00, 0xFA, 0xB1, 0x94, 0xEB, 0x3A } } } },
- EXTRACT_END_ENTRY
-};
-
-const ExtractEntrySearchData kEob2FinaleAnimData15Provider[] = {
- { UNK_LANG, kPlatformUnknown, { 0x000000D1, 0x000016E5, { { 0xD8, 0xE9, 0xA5, 0xEE, 0x54, 0x1B, 0x3E, 0x32, 0xDA, 0x78, 0x90, 0xC2, 0x54, 0xFC, 0xD5, 0x39 } } } },
- EXTRACT_END_ENTRY
-};
-
-const ExtractEntrySearchData kEob2FinaleAnimData16Provider[] = {
- { UNK_LANG, kPlatformUnknown, { 0x0000008F, 0x00000C69, { { 0xBC, 0x41, 0xE5, 0xAF, 0x89, 0xE2, 0x54, 0x12, 0x9E, 0xB0, 0x5F, 0x28, 0xFF, 0x92, 0x9D, 0x89 } } } },
- EXTRACT_END_ENTRY
-};
-
-const ExtractEntrySearchData kEob2FinaleAnimData17Provider[] = {
- { UNK_LANG, kPlatformUnknown, { 0x000000DC, 0x0000170D, { { 0x7A, 0x7B, 0x74, 0xCB, 0x68, 0xC2, 0xFF, 0xC7, 0xBE, 0x47, 0xE9, 0x43, 0xF7, 0x15, 0x8D, 0x59 } } } },
- EXTRACT_END_ENTRY
-};
-
-const ExtractEntrySearchData kEob2FinaleAnimData18Provider[] = {
- { UNK_LANG, kPlatformUnknown, { 0x00000134, 0x00002651, { { 0x71, 0x26, 0x47, 0x0D, 0x7C, 0x96, 0x45, 0x0B, 0x82, 0xD0, 0x37, 0xB9, 0xD4, 0xD0, 0x84, 0xFC } } } },
- EXTRACT_END_ENTRY
-};
-
-const ExtractEntrySearchData kEob2FinaleAnimData19Provider[] = {
- { UNK_LANG, kPlatformUnknown, { 0x0000004D, 0x000009C3, { { 0xDA, 0x96, 0xDF, 0x16, 0xEB, 0x5D, 0x49, 0xA4, 0x3F, 0xD3, 0x31, 0xBE, 0x49, 0x72, 0xF2, 0x71 } } } },
- EXTRACT_END_ENTRY
-};
-
-const ExtractEntrySearchData kEob2FinaleAnimData20Provider[] = {
- { UNK_LANG, kPlatformUnknown, { 0x00000021, 0x000003D8, { { 0xD9, 0xC8, 0x58, 0x4B, 0x7D, 0x79, 0x86, 0xCB, 0xEB, 0x77, 0xC2, 0xD4, 0xB7, 0xB4, 0xE9, 0x6A } } } },
- EXTRACT_END_ENTRY
-};
-
-const ExtractEntrySearchData kEoB2FinaleShapes00Provider[] = {
- { UNK_LANG, kPlatformUnknown, { 0x00000018, 0x0000071C, { { 0xE8, 0x67, 0xCB, 0x76, 0x6D, 0x49, 0xC2, 0x05, 0x0D, 0xAD, 0xB6, 0x83, 0x35, 0xB3, 0xBE, 0xE5 } } } },
- EXTRACT_END_ENTRY
-};
-
-const ExtractEntrySearchData kEoB2FinaleShapes03Provider[] = {
- { UNK_LANG, kPlatformUnknown, { 0x00000012, 0x00000571, { { 0x91, 0xEC, 0xAC, 0x12, 0x08, 0x33, 0xDA, 0x7C, 0xBD, 0x51, 0x64, 0xE3, 0xAE, 0x43, 0x75, 0x14 } } } },
- EXTRACT_END_ENTRY
-};
-
-const ExtractEntrySearchData kEoB2FinaleShapes07Provider[] = {
- { UNK_LANG, kPlatformUnknown, { 0x00000018, 0x00000166, { { 0xED, 0x6E, 0x0C, 0x85, 0x13, 0x6F, 0xAC, 0xEB, 0xCA, 0x74, 0x2E, 0x2D, 0x0E, 0xCE, 0x17, 0xD6 } } } },
- EXTRACT_END_ENTRY
-};
-
-const ExtractEntrySearchData kEoB2FinaleShapes09Provider[] = {
- { UNK_LANG, kPlatformUnknown, { 0x00000036, 0x00000898, { { 0xEB, 0xB0, 0xD9, 0xC4, 0xB6, 0xBC, 0xE3, 0xAF, 0xB2, 0x5D, 0xE3, 0xCE, 0xF7, 0x26, 0x07, 0xE5 } } } },
- EXTRACT_END_ENTRY
-};
-
-const ExtractEntrySearchData kEoB2FinaleShapes10Provider[] = {
- { UNK_LANG, kPlatformUnknown, { 0x00000018, 0x0000017F, { { 0x0F, 0x37, 0x94, 0xA6, 0xCE, 0x23, 0xE3, 0x2E, 0x5E, 0x2B, 0x78, 0x5B, 0x66, 0xC8, 0xE5, 0x96 } } } },
- EXTRACT_END_ENTRY
-};
-
-const ExtractEntrySearchData kEoB2NpcShapeDataProvider[] = {
- { UNK_LANG, kPlatformUnknown, { 0x00000018, 0x0000045D, { { 0x69, 0xE0, 0x5E, 0x86, 0xEB, 0x7D, 0x25, 0x95, 0xC2, 0xA0, 0xE9, 0xD5, 0x3A, 0x4A, 0x65, 0xBC } } } },
- EXTRACT_END_ENTRY
-};
-
-const ExtractEntrySearchData kEoBBaseClassModifierFlagsProvider[] = {
- { UNK_LANG, kPlatformUnknown, { 0x0000000F, 0x00000059, { { 0x17, 0x2B, 0x23, 0x14, 0x0F, 0x9D, 0x94, 0xD3, 0xBF, 0x94, 0x83, 0x0B, 0x79, 0xDB, 0xC0, 0xA9 } } } }, // EOB 1
- { UNK_LANG, kPlatformUnknown, { 0x0000000F, 0x00000083, { { 0x54, 0x68, 0xF4, 0x07, 0x3E, 0x2A, 0xD4, 0x06, 0xF3, 0x10, 0x88, 0x6C, 0xE3, 0x34, 0x08, 0x30 } } } }, // EOB 2
- EXTRACT_END_ENTRY
-};
-
-const ExtractEntrySearchData kEoBBaseMonsterStepTable01Provider[] = {
- { UNK_LANG, kPlatformUnknown, { 0x00000004, 0x00000200, { { 0x26, 0x86, 0x10, 0x04, 0xC1, 0x48, 0xDD, 0xC0, 0x9F, 0x92, 0xD6, 0x20, 0x38, 0x36, 0xE2, 0xDD } } } },
- EXTRACT_END_ENTRY
-};
-
-const ExtractEntrySearchData kEoBBaseMonsterStepTable02Provider[] = {
- { UNK_LANG, kPlatformUnknown, { 0x00000008, 0x00000400, { { 0x6E, 0x53, 0x3C, 0x7A, 0x11, 0x46, 0x8B, 0xDC, 0x73, 0x24, 0xF8, 0x13, 0xCB, 0x6C, 0x9B, 0xE6 } } } },
- EXTRACT_END_ENTRY
-};
-
-const ExtractEntrySearchData kEoBBaseMonsterStepTable1Provider[] = {
- { UNK_LANG, kPlatformUnknown, { 0x00000010, 0x00000400, { { 0x8B, 0x4C, 0x6B, 0x86, 0x93, 0xDA, 0x82, 0x1B, 0x04, 0x23, 0x92, 0x5B, 0x79, 0xB9, 0xFB, 0x06 } } } },
- EXTRACT_END_ENTRY
-};
-
-const ExtractEntrySearchData kEoBBaseMonsterStepTable2Provider[] = {
- { UNK_LANG, kPlatformUnknown, { 0x00000010, 0x00000601, { { 0xE4, 0x36, 0x12, 0x93, 0x44, 0xDE, 0x6E, 0xA0, 0x4B, 0x98, 0x4B, 0x47, 0x87, 0xE3, 0x40, 0xD4 } } } },
- EXTRACT_END_ENTRY
-};
-
-const ExtractEntrySearchData kEoBBaseMonsterStepTable3Provider[] = {
- { UNK_LANG, kPlatformUnknown, { 0x00000010, 0x000007F8, { { 0x00, 0x0C, 0xB0, 0xDA, 0xE1, 0xC8, 0x45, 0x11, 0x57, 0xE4, 0x72, 0xD2, 0x32, 0xC6, 0x16, 0x2B } } } },
- EXTRACT_END_ENTRY
-};
-
-const ExtractEntrySearchData kEoBBaseMonsterCloseAttPosTable1Provider[] = {
- { UNK_LANG, kPlatformUnknown, { 0x00000004, 0x00000006, { { 0x4F, 0x9D, 0x50, 0xDA, 0xA1, 0x75, 0xB0, 0xD5, 0x90, 0xCA, 0xFF, 0x3E, 0xB5, 0xE8, 0x0D, 0xAA } } } },
- EXTRACT_END_ENTRY
-};
-
-const ExtractEntrySearchData kEoBBaseMonsterCloseAttPosTable21Provider[] = {
- { UNK_LANG, kPlatformUnknown, { 0x00000008, 0x0000000C, { { 0x6A, 0xED, 0x15, 0xCE, 0x69, 0x54, 0x7D, 0x7B, 0x6D, 0xCE, 0xC7, 0x2A, 0x01, 0xD7, 0xDC, 0xB0 } } } },
- EXTRACT_END_ENTRY
-};
-
-const ExtractEntrySearchData kEoBBaseMonsterCloseAttPosTable22Provider[] = {
- { UNK_LANG, kPlatformUnknown, { 0x00000010, 0x00000018, { { 0x6D, 0xB9, 0x69, 0x4A, 0xE3, 0x72, 0x03, 0x5B, 0x5A, 0xBB, 0x15, 0x4A, 0xDA, 0xFB, 0x99, 0x87 } } } },
- EXTRACT_END_ENTRY
-};
-
-const ExtractEntrySearchData kEoBBaseMonsterCloseAttUnkTableProvider[] = {////
- { UNK_LANG, kPlatformUnknown, { 0x0000000C, 0x000007FE, { { 0xF0, 0xCB, 0x3A, 0x53, 0xDD, 0x59, 0x04, 0x87, 0x6F, 0x1B, 0x5A, 0x13, 0xBA, 0x78, 0x62, 0xEC } } } },
- EXTRACT_END_ENTRY
-};
-
-const ExtractEntrySearchData kEoBBaseMonsterCloseAttChkTable1Provider[] = {
- { UNK_LANG, kPlatformUnknown, { 0x00000010, 0x00000008, { { 0x93, 0x27, 0x19, 0xA7, 0xA7, 0x49, 0x0E, 0xC9, 0xED, 0x5C, 0x8F, 0x9F, 0xC2, 0x34, 0x62, 0x07 } } } },
- EXTRACT_END_ENTRY
-};
-
-const ExtractEntrySearchData kEoBBaseMonsterCloseAttChkTable2Provider[] = {
- { UNK_LANG, kPlatformUnknown, { 0x00000010, 0x00000008, { { 0xEB, 0xF0, 0x27, 0x7E, 0xA8, 0x09, 0x3A, 0x95, 0x3B, 0x71, 0x2A, 0x43, 0x2E, 0xCF, 0x22, 0x0B } } } },
- EXTRACT_END_ENTRY
-};
-
-const ExtractEntrySearchData kEoBBaseMonsterCloseAttDstTable1Provider[] = {
- { UNK_LANG, kPlatformUnknown, { 0x00000010, 0x00000018, { { 0x1E, 0xC9, 0x6C, 0x5D, 0xDF, 0xD4, 0xC0, 0x87, 0xAD, 0xEE, 0x86, 0x29, 0xD5, 0x3E, 0x8D, 0xB4 } } } },
- EXTRACT_END_ENTRY
-};
-
-const ExtractEntrySearchData kEoBBaseMonsterCloseAttDstTable2Provider[] = {
- { UNK_LANG, kPlatformUnknown, { 0x00000030, 0x00000078, { { 0x4C, 0xA8, 0x2A, 0x53, 0xB3, 0xAA, 0x52, 0x96, 0x1D, 0xE8, 0x37, 0xDB, 0x4A, 0x77, 0xD8, 0x5B } } } },
- EXTRACT_END_ENTRY
-};
-
-const ExtractEntrySearchData kEoBBaseMonsterProximityTableProvider[] = {
- { UNK_LANG, kPlatformUnknown, { 0x00000020, 0x00000030, { { 0x25, 0xFC, 0xA3, 0xEB, 0x44, 0x93, 0x9B, 0x33, 0xB5, 0x86, 0xC4, 0xCB, 0x17, 0xEF, 0x2D, 0x47 } } } },
- EXTRACT_END_ENTRY
-};
-
-const ExtractEntrySearchData kEoBBaseFindBlockMonstersTableProvider[] = {
- { UNK_LANG, kPlatformUnknown, { 0x00000040, 0x00000088, { { 0x6F, 0xEE, 0x8B, 0x4C, 0x21, 0xF0, 0xC6, 0x4F, 0x1D, 0x05, 0x95, 0x41, 0xD7, 0xD6, 0x52, 0x66 } } } },
- EXTRACT_END_ENTRY
-};
-
-const ExtractEntrySearchData kEoBBaseMonsterDirChangeTableProvider[] = {
- { UNK_LANG, kPlatformUnknown, { 0x00000030, 0x0000180C, { { 0xCD, 0xBB, 0xFD, 0xAB, 0xFB, 0x1D, 0x5C, 0x0F, 0xA2, 0xAC, 0x32, 0xA9, 0xA1, 0x93, 0x2D, 0x1C } } } },
- EXTRACT_END_ENTRY
-};
-
-const ExtractEntrySearchData kEoBBaseMonsterDistAttStringsProvider[] = {
- { EN_ANY, kPlatformUnknown, { 0x00000076, 0x00002965, { { 0x1A, 0x22, 0x50, 0x04, 0x27, 0x05, 0xE9, 0x61, 0xF9, 0x0A, 0xF0, 0x50, 0x01, 0x0E, 0x65, 0xB4 } } } },
- { DE_DEU, kPlatformUnknown, { 0x0000008C, 0x00003274, { { 0xE7, 0x24, 0x17, 0x13, 0x4F, 0xB3, 0xF9, 0xB7, 0x90, 0xFA, 0x3D, 0xFF, 0xA7, 0xFB, 0x3F, 0x1F } } } },
- { EN_ANY, kPlatformUnknown, { 0x00000054, 0x00001D03, { { 0xEB, 0x07, 0xD4, 0x22, 0xFD, 0xA0, 0x77, 0x80, 0x22, 0x04, 0x2E, 0x27, 0x7F, 0x64, 0x99, 0x4E } } } },
- { DE_DEU, kPlatformUnknown, { 0x00000062, 0x000023E0, { { 0xB8, 0x03, 0x5C, 0x31, 0xCC, 0x18, 0xCD, 0x8D, 0x60, 0xD1, 0xFB, 0x5B, 0x66, 0xC2, 0x9A, 0x4C } } } },
- EXTRACT_END_ENTRY
-};
-
-const ExtractEntrySearchData kEoBBaseEncodeMonsterDefsProvider[] = {
- { UNK_LANG, kPlatformUnknown, { 0x00000150, 0x00001ACB, { { 0x73, 0x67, 0x5B, 0x64, 0x22, 0xDB, 0x08, 0x3A, 0xCD, 0xEB, 0x30, 0x28, 0xBD, 0xAD, 0xF8, 0x9B } } } },
- EXTRACT_END_ENTRY
-};
-
-const ExtractEntrySearchData kEoBBaseNpcPresetsProvider[] = {
- { UNK_LANG, kPlatformUnknown, { 0x0000088B, 0x000038D0, { { 0x2E, 0xAE, 0xF0, 0x2A, 0x71, 0x6F, 0x7C, 0x5C, 0xF5, 0xAF, 0xB8, 0xBB, 0x47, 0xE5, 0xB6, 0xC3 } } } }, // EOB 1
- { UNK_LANG, kPlatformUnknown, { 0x00000816, 0x00002C8E, { { 0xAB, 0xEE, 0x18, 0x0E, 0x59, 0xF6, 0xE0, 0x26, 0x93, 0xAB, 0x3B, 0x23, 0x29, 0x7A, 0x2C, 0x97 } } } }, // EOB 2
- EXTRACT_END_ENTRY
-};
-
-const ExtractEntrySearchData kEoB2Npc1StringsProvider[] = {
- { EN_ANY, kPlatformUnknown, { 0x0000000B, 0x000003B9, { { 0xB1, 0x67, 0x80, 0x21, 0x92, 0xDD, 0xFA, 0x4C, 0x4D, 0x64, 0x7C, 0x05, 0x08, 0xDC, 0x55, 0xFD } } } },
- { DE_DEU, kPlatformUnknown, { 0x0000000D, 0x0000049E, { { 0x2D, 0x78, 0xF6, 0x20, 0x30, 0xEC, 0x62, 0x6E, 0x58, 0xF7, 0xC7, 0x6D, 0xD7, 0xBD, 0x70, 0x76 } } } },
- EXTRACT_END_ENTRY
-};
-
-const ExtractEntrySearchData kEoB2Npc2StringsProvider[] = {
- { EN_ANY, kPlatformUnknown, { 0x00000012, 0x0000064C, { { 0xB0, 0x66, 0x0D, 0xDE, 0x16, 0xEB, 0x5E, 0x51, 0xAF, 0x4D, 0x19, 0xD1, 0x1E, 0x0B, 0xCB, 0xD6 } } } },
- { DE_DEU, kPlatformUnknown, { 0x00000018, 0x000008FF, { { 0x59, 0x29, 0x01, 0x6F, 0xF0, 0x49, 0xC8, 0x57, 0x3E, 0x70, 0x01, 0x7E, 0x5E, 0xF2, 0xEB, 0x35 } } } },
- EXTRACT_END_ENTRY
-};
-
-const ExtractEntrySearchData kEoB2MonsterDustStringsProvider[] = {
- { EN_ANY, kPlatformUnknown, { 0x0000001F, 0x00000AD7, { { 0x2B, 0x66, 0x27, 0xFD, 0xC6, 0x17, 0x0B, 0x6B, 0xFC, 0x7D, 0x7F, 0xD2, 0xC4, 0x12, 0x8F, 0x33 } } } },
- { DE_DEU, kPlatformUnknown, { 0x0000001F, 0x00000A91, { { 0x1D, 0x7D, 0xEE, 0xB8, 0x9B, 0x37, 0x2E, 0x64, 0x13, 0xB6, 0x39, 0xED, 0x88, 0xB6, 0x8B, 0xD7 } } } },
- EXTRACT_END_ENTRY
-};
-
-const ExtractEntrySearchData kEoB2DreamStepsProvider[] = {
- { UNK_LANG, kPlatformUnknown, { 0x0000000E, 0x00000114, { { 0x27, 0x32, 0xCB, 0x89, 0x27, 0xC5, 0xDD, 0x91, 0xBE, 0x97, 0x62, 0xF5, 0x76, 0xF7, 0xCD, 0x25 } } } },
- EXTRACT_END_ENTRY
-};
-
-const ExtractEntrySearchData kEoB2KheldranStringsProvider[] = {
- { EN_ANY, kPlatformUnknown, { 0x0000001A, 0x00000887, { { 0xA6, 0xB4, 0x45, 0x1B, 0x33, 0x54, 0x36, 0xAD, 0x1D, 0xB1, 0xDA, 0xC3, 0x12, 0x85, 0x3C, 0x58 } } } },
- { DE_DEU, kPlatformUnknown, { 0x00000012, 0x00000511, { { 0xEE, 0x21, 0xA8, 0x6E, 0xF7, 0xEC, 0x9A, 0x8D, 0xBA, 0x8D, 0xE3, 0x4A, 0x17, 0x15, 0xCA, 0x8C } } } },
- EXTRACT_END_ENTRY
-};
-
-const ExtractEntrySearchData kEoB2HornStringsProvider[] = {
- { EN_ANY, kPlatformUnknown, { 0x0000009A, 0x00003541, { { 0xA5, 0x4D, 0x88, 0xAC, 0x1C, 0xCD, 0x57, 0xD4, 0x1E, 0x9F, 0xAE, 0x13, 0x46, 0xAD, 0xA0, 0x22 } } } },
- { DE_DEU, kPlatformUnknown, { 0x000000AB, 0x00003B6C, { { 0x36, 0x34, 0xB3, 0xB1, 0x55, 0x66, 0x7A, 0x90, 0x97, 0x01, 0xDC, 0x4A, 0xAF, 0x17, 0x6B, 0x5A } } } },
- EXTRACT_END_ENTRY
-};
-
-const ExtractEntrySearchData kEoB2HornSoundsProvider[] = {
- { UNK_LANG, kPlatformDOS, { 0x00000004, 0x00000106, { { 0x3E, 0x7B, 0x96, 0xFD, 0xCA, 0x4E, 0xA7, 0xA6, 0xB8, 0x82, 0x67, 0xCF, 0x93, 0x86, 0xE4, 0x45 } } } },
-
- EXTRACT_END_ENTRY
-};
-
-const ExtractEntrySearchData kEoB2WallOfForceDsXProvider[] = {
- { UNK_LANG, kPlatformDOS, { 0x00000024, 0x00000D67, { { 0x51, 0xCF, 0xAB, 0x1E, 0xB4, 0xE0, 0xE3, 0x44, 0x29, 0xD1, 0xDC, 0x82, 0xCD, 0x08, 0x50, 0xF5 } } } },
-
- EXTRACT_END_ENTRY
-};
-
-const ExtractEntrySearchData kEoB2WallOfForceDsYProvider[] = {
- { UNK_LANG, kPlatformDOS, { 0x00000003, 0x00000048, { { 0x45, 0xFC, 0xEA, 0x8C, 0x34, 0xD7, 0xBE, 0x74, 0x05, 0x03, 0xE6, 0x94, 0x34, 0xB5, 0x45, 0x4D } } } },
- EXTRACT_END_ENTRY
-};
-
-const ExtractEntrySearchData kEoB2WallOfForceNumWProvider[] = {
- { UNK_LANG, kPlatformDOS, { 0x00000003, 0x00000006, { { 0x52, 0x89, 0xDF, 0x73, 0x7D, 0xF5, 0x73, 0x26, 0xFC, 0xDD, 0x22, 0x59, 0x7A, 0xFB, 0x1F, 0xAC } } } },
- EXTRACT_END_ENTRY
-};
-
-const ExtractEntrySearchData kEoB2WallOfForceNumHProvider[] = {
- { UNK_LANG, kPlatformDOS, { 0x00000003, 0x00000011, { { 0x33, 0x86, 0x06, 0xBE, 0x8D, 0xC8, 0x37, 0x2D, 0x0F, 0x61, 0x97, 0xA4, 0x26, 0xA9, 0xBC, 0x60 } } } },
- EXTRACT_END_ENTRY
-};
-
-const ExtractEntrySearchData kEoB2WallOfForceShpIdProvider[] = {
- { UNK_LANG, kPlatformDOS, { 0x00000003, 0x00000006, { { 0x77, 0xAE, 0x9B, 0x52, 0x9E, 0xF7, 0xEB, 0x48, 0xA8, 0x5E, 0xED, 0xC2, 0x08, 0x53, 0xCE, 0x3C } } } },
- EXTRACT_END_ENTRY
-};
-
-const ExtractEntrySearchData kLoLIngamePakFilesProvider[] = {
- { UNK_LANG, kPlatformDOS, { 0x00000088, 0x0000224F, { { 0xDA, 0x24, 0x18, 0xA3, 0xEF, 0x16, 0x70, 0x8F, 0xA8, 0xC2, 0x2E, 0xC2, 0xED, 0x39, 0x03, 0xD1 } } } },
- { UNK_LANG, kPlatformPC98, { 0x00000084, 0x00002125, { { 0x7A, 0x89, 0xE2, 0x36, 0xEC, 0x6F, 0x52, 0x2B, 0xEF, 0xBA, 0x3D, 0x28, 0x54, 0xDA, 0xFB, 0x72 } } } },
- { UNK_LANG, kPlatformFMTowns, { 0x0000009D, 0x00002179, { { 0x7D, 0x7A, 0xE1, 0xD9, 0x69, 0x23, 0x9D, 0xFF, 0x83, 0x39, 0x73, 0xEC, 0xF4, 0x26, 0x20, 0x8E } } } },
- EXTRACT_END_ENTRY
-};
-
-const ExtractEntrySearchData kLoLCharacterDefsProvider[] = {
- { RU_RUS, kPlatformDOS, { 0x00000492, 0x000052BA, { { 0x52, 0x29, 0x0D, 0x49, 0xFD, 0x17, 0xD7, 0x70, 0x6D, 0xCA, 0xEB, 0xB6, 0x7E, 0xFA, 0xBE, 0x08 } } } }, // floppy
- { EN_ANY, kPlatformDOS, { 0x00000492, 0x000046B0, { { 0x7A, 0x94, 0x8B, 0xC6, 0xF7, 0xF1, 0x2F, 0xF3, 0xBC, 0x1B, 0x0B, 0x4E, 0x00, 0xC9, 0x44, 0x58 } } } }, // floppy
- { DE_DEU, kPlatformDOS, { 0x00000492, 0x000047FD, { { 0x8C, 0x0B, 0x8B, 0xCE, 0xE0, 0xB0, 0x8F, 0xA9, 0x06, 0xC3, 0x98, 0xE6, 0x2E, 0x09, 0xB6, 0x93 } } } }, // floppy
- { FR_FRA, kPlatformDOS, { 0x00000492, 0x000047FD, { { 0x8C, 0x0B, 0x8B, 0xCE, 0xE0, 0xB0, 0x8F, 0xA9, 0x06, 0xC3, 0x98, 0xE6, 0x2E, 0x09, 0xB6, 0x93 } } } }, // floppy
- { EN_ANY, kPlatformDOS, { 0x00000492, 0x00004ACD, { { 0xDF, 0x87, 0xFE, 0x89, 0x59, 0xCC, 0x01, 0xD7, 0xC7, 0xEB, 0x16, 0xA4, 0x09, 0xAF, 0x5D, 0xC0 } } } }, // CD
- { DE_DEU, kPlatformDOS, { 0x00000492, 0x00004ACD, { { 0xDF, 0x87, 0xFE, 0x89, 0x59, 0xCC, 0x01, 0xD7, 0xC7, 0xEB, 0x16, 0xA4, 0x09, 0xAF, 0x5D, 0xC0 } } } }, // CD
- { FR_FRA, kPlatformDOS, { 0x00000492, 0x00004ACD, { { 0xDF, 0x87, 0xFE, 0x89, 0x59, 0xCC, 0x01, 0xD7, 0xC7, 0xEB, 0x16, 0xA4, 0x09, 0xAF, 0x5D, 0xC0 } } } }, // CD
- { RU_RUS, kPlatformDOS, { 0x00000492, 0x00004ACD, { { 0xDF, 0x87, 0xFE, 0x89, 0x59, 0xCC, 0x01, 0xD7, 0xC7, 0xEB, 0x16, 0xA4, 0x09, 0xAF, 0x5D, 0xC0 } } } }, // CD
- { IT_ITA, kPlatformDOS, { 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 } } } },
- { JA_JPN, kPlatformFMTowns, { 0x00000492, 0x00005041, { { 0xAB, 0x07, 0x37, 0xFE, 0xC2, 0x4B, 0x5D, 0x16, 0xE4, 0xC4, 0x2C, 0x8C, 0xC3, 0x78, 0xCB, 0xCB } } } },
-
- EXTRACT_END_ENTRY
-};
-
-const ExtractEntrySearchData kLoLIngameSfxFilesProvider[] = {
- { UNK_LANG, kPlatformDOS, { 0x000008F2, 0x0001E5B6, { { 0x63, 0x5E, 0x37, 0xAA, 0x27, 0x80, 0x4C, 0x85, 0xB1, 0x9D, 0x7B, 0x1D, 0x64, 0xA3, 0xEB, 0x97 } } } }, // floppy
- { UNK_LANG, kPlatformDOS, { 0x000008F2, 0x0001E5B7, { { 0x9E, 0xC8, 0xE8, 0x19, 0x2F, 0x58, 0x0B, 0xC7, 0x2D, 0x41, 0x72, 0xE7, 0xF4, 0x80, 0x03, 0xCB } } } }, // CD
- { UNK_LANG, kPlatformPC98, { 0x000008EF, 0x0001E585, { { 0x85, 0x81, 0x5C, 0xA4, 0x34, 0x44, 0xF4, 0x58, 0xF9, 0x82, 0xEE, 0x0F, 0x6A, 0x0D, 0xA2, 0x7F } } } },
- { UNK_LANG, kPlatformFMTowns, { 0x000008F0, 0x0001E585, { { 0xB7, 0x82, 0xFF, 0xAB, 0x71, 0x54, 0xEB, 0x52, 0x8D, 0xAC, 0x9A, 0xB4, 0x9E, 0x33, 0x00, 0x95 } } } },
- EXTRACT_END_ENTRY
-};
-
-const ExtractEntrySearchData kLoLIngameSfxIndexProvider[] = {
- { UNK_LANG, kPlatformUnknown, { 0x000003E8, 0x0000E8D2, { { 0x19, 0x39, 0x17, 0xED, 0xAE, 0xDC, 0x7A, 0xAC, 0x45, 0x5F, 0x2D, 0xCD, 0x65, 0x8D, 0xAD, 0xAE } } } },
-
- EXTRACT_END_ENTRY
-};
-
-const ExtractEntrySearchData kLoLMusicTrackMapProvider[] = {
- { UNK_LANG, kPlatformDOS, { 0x000000F0, 0x0000210D, { { 0x55, 0x25, 0x3E, 0x35, 0xD2, 0xD8, 0x13, 0xE3, 0x1D, 0xB1, 0xB3, 0x00, 0x2E, 0x17, 0x91, 0x2F } } } },
-
- EXTRACT_END_ENTRY
-};
-
-const ExtractEntrySearchData kLoLIngameGMSfxIndexProvider[] = {
- { UNK_LANG, kPlatformDOS, { 0x000000FA, 0x00006281, { { 0x25, 0x89, 0xB0, 0x3B, 0x12, 0x09, 0x02, 0xF6, 0xFE, 0x76, 0xD5, 0xC9, 0x5B, 0x88, 0xAC, 0xAA } } } },
-
- EXTRACT_END_ENTRY
-};
-
-const ExtractEntrySearchData kLoLIngameMT32SfxIndexProvider[] = {
- { UNK_LANG, kPlatformDOS, { 0x000000FA, 0x00006579, { { 0x16, 0x40, 0x1C, 0x09, 0x69, 0xA9, 0x0D, 0x6D, 0x4B, 0x0C, 0x99, 0xF0, 0x40, 0x5D, 0xBB, 0x6E } } } },
-
- EXTRACT_END_ENTRY
-};
-
-const ExtractEntrySearchData kLoLIngamePcSpkSfxIndexProvider[] = {
- { UNK_LANG, kPlatformDOS, { 0x000000FA, 0x00005EFC, { { 0xA3, 0x5C, 0x69, 0xED, 0x13, 0xEC, 0x08, 0x0E, 0xFA, 0x72, 0x83, 0x0D, 0xD7, 0x8D, 0x9C, 0x70 } } } },
-
- EXTRACT_END_ENTRY
-};
-
-const ExtractEntrySearchData kLoLSpellPropertiesProvider[] = {
- { UNK_LANG, kPlatformUnknown, { 0x00000118, 0x00000B06, { { 0x27, 0x69, 0x53, 0x01, 0xA0, 0xE3, 0x76, 0xAA, 0x33, 0xA4, 0x52, 0x11, 0x52, 0xB1, 0x0E, 0xDA } } } },
-
- EXTRACT_END_ENTRY
-};
-
-const ExtractEntrySearchData kLoLGameShapeMapProvider[] = {
- { UNK_LANG, kPlatformUnknown, { 0x00000114, 0x000038D3, { { 0xB2, 0x8A, 0x5D, 0x9A, 0x51, 0x63, 0x4D, 0x65, 0xE4, 0xF5, 0xBA, 0x88, 0x70, 0x6C, 0xA6, 0xF8 } } } }, // floppy + PC98
- { UNK_LANG, kPlatformDOS, { 0x00000114, 0x00003B97, { { 0x29, 0xE5, 0x0F, 0x51, 0xF0, 0x10, 0x35, 0x3E, 0x70, 0x3A, 0xAA, 0xFE, 0xD7, 0xD5, 0xAA, 0x9F } } } }, // CD
-
- EXTRACT_END_ENTRY
-};
-
-const ExtractEntrySearchData kLoLSceneItemOffsProvider[] = {
- { UNK_LANG, kPlatformUnknown, { 0x00000008, 0x00000300, { { 0x69, 0x80, 0x5A, 0x3E, 0x63, 0xC1, 0x04, 0x60, 0x09, 0x2F, 0x49, 0xD7, 0x26, 0x32, 0xAA, 0xE2 } } } },
-
- EXTRACT_END_ENTRY
-};
-
-const ExtractEntrySearchData kLoLCharInvIndexProvider[] = {
- { UNK_LANG, kPlatformUnknown, { 0x0000000A, 0x00000006, { { 0x19, 0x79, 0x4E, 0xFC, 0x05, 0x14, 0x89, 0x23, 0xEB, 0xCA, 0x94, 0x50, 0xE8, 0xD3, 0x81, 0x24 } } } },
- { UNK_LANG, kPlatformFMTowns, { 0x00000005, 0x00000006, { { 0x54, 0x11, 0x01, 0x79, 0x4D, 0xED, 0xF9, 0xEA, 0xDF, 0x03, 0x51, 0xAB, 0x8D, 0x9D, 0x2F, 0x34 } } } },
-
- EXTRACT_END_ENTRY
-};
-
-const ExtractEntrySearchData kLoLCharInvDefsProvider[] = {
- { UNK_LANG, kPlatformUnknown, { 0x00000058, 0x00001D7A, { { 0x25, 0xE4, 0xEB, 0x6D, 0xBE, 0xEA, 0xBD, 0x9A, 0x9F, 0xA5, 0x9E, 0xEB, 0x3D, 0x03, 0x1D, 0x72 } } } },
-
- EXTRACT_END_ENTRY
-};
-
-const ExtractEntrySearchData kLoLCharDefsManProvider[] = {
- { UNK_LANG, kPlatformUnknown, { 0x00000012, 0x0000003D, { { 0xEB, 0x82, 0x32, 0x9D, 0x76, 0xC8, 0x3D, 0x5E, 0x8C, 0x26, 0x53, 0xDF, 0xC1, 0xFD, 0x0F, 0xC5 } } } },
-
- EXTRACT_END_ENTRY
-};
-
-const ExtractEntrySearchData kLoLCharDefsWomanProvider[] = {
- { UNK_LANG, kPlatformUnknown, { 0x00000012, 0x0000003D, { { 0xEB, 0x82, 0x32, 0x9D, 0x76, 0xC8, 0x3D, 0x5E, 0x8C, 0x26, 0x53, 0xDF, 0xC1, 0xFD, 0x0F, 0xC5 } } } },
-
- EXTRACT_END_ENTRY
-};
-
-const ExtractEntrySearchData kLoLCharDefsKieranProvider[] = {
- { UNK_LANG, kPlatformUnknown, { 0x00000012, 0x000002E3, { { 0xBF, 0xB1, 0x0F, 0x40, 0xBF, 0xA1, 0xD0, 0x2B, 0xC9, 0x80, 0x35, 0x40, 0xA9, 0xA3, 0x01, 0xC8 } } } },
-
- EXTRACT_END_ENTRY
-};
-
-const ExtractEntrySearchData kLoLCharDefsAkshelProvider[] = {
- { UNK_LANG, kPlatformUnknown, { 0x00000012, 0x000002FB, { { 0x47, 0x3C, 0x07, 0x15, 0x20, 0xE6, 0x90, 0x59, 0x55, 0xF2, 0xA7, 0xC3, 0x27, 0x22, 0xAB, 0xDC } } } },
-
- EXTRACT_END_ENTRY
-};
-
-const ExtractEntrySearchData kLoLExpRequirementsProvider[] = {
- { UNK_LANG, kPlatformUnknown, { 0x0000002C, 0x00000C0A, { { 0x3F, 0x36, 0xFA, 0xE3, 0xB0, 0x76, 0x5E, 0xFF, 0xE9, 0xBA, 0xDF, 0xD0, 0x9D, 0xFF, 0xDD, 0x27 } } } },
-
- EXTRACT_END_ENTRY
-};
-
-const ExtractEntrySearchData kLoLMonsterModifiers1Provider[] = {
- { UNK_LANG, kPlatformUnknown, { 0x00000006, 0x00000142, { { 0x62, 0x4B, 0x5E, 0x46, 0x64, 0xA4, 0x3A, 0xB7, 0x11, 0x14, 0xA8, 0x41, 0xAF, 0x4E, 0xE6, 0x58 } } } }, // floppy + PC98 + FM-TOWNS
- { UNK_LANG, kPlatformDOS, { 0x00000006, 0x000000E8, { { 0x94, 0xCB, 0xD2, 0xE4, 0xF4, 0xA8, 0x4D, 0x46, 0x2E, 0x84, 0x8C, 0x6F, 0xF9, 0x75, 0xD7, 0x28 } } } }, // CD
- EXTRACT_END_ENTRY
-};
-
-const ExtractEntrySearchData kLoLMonsterModifiers2Provider[] = {
- { UNK_LANG, kPlatformUnknown, { 0x00000006, 0x000000C2, { { 0x89, 0x12, 0xA7, 0x0D, 0xD9, 0xC7, 0x5B, 0x03, 0xD4, 0x21, 0x6F, 0x0A, 0x1D, 0x83, 0x1B, 0x98 } } } },
- EXTRACT_END_ENTRY
-};
-
-const ExtractEntrySearchData kLoLMonsterModifiers3Provider[] = {
- { UNK_LANG, kPlatformUnknown, { 0x00000006, 0x000000C2, { { 0x56, 0x4D, 0x82, 0xCC, 0x2C, 0x00, 0x1E, 0x9D, 0xF7, 0x64, 0xB7, 0x60, 0x63, 0x0A, 0x03, 0xD7 } } } },
- EXTRACT_END_ENTRY
-};
-
-const ExtractEntrySearchData kLoLMonsterModifiers4Provider[] = {
- { UNK_LANG, kPlatformDOS, { 0x00000006, 0x00000082, { { 0xA8, 0xFC, 0xBB, 0x1B, 0xC0, 0x85, 0x3B, 0xEF, 0xDB, 0xDE, 0xB0, 0x98, 0x58, 0x34, 0x75, 0xE9 } } } }, // CD
- EXTRACT_END_ENTRY
-};
-
-const ExtractEntrySearchData kLoLMonsterShiftOffsetsProvider[] = {
- { UNK_LANG, kPlatformUnknown, { 0x00000020, 0x00000803, { { 0x30, 0x55, 0x74, 0x0D, 0xC7, 0x3B, 0xD9, 0x5C, 0x26, 0xF0, 0x4E, 0x8F, 0xE4, 0x4D, 0xCB, 0x2A } } } },
-
- EXTRACT_END_ENTRY
-};
-
-const ExtractEntrySearchData kLoLMonsterDirFlagsProvider[] = {
- { UNK_LANG, kPlatformUnknown, { 0x00000010, 0x00000080, { { 0xE5, 0xA1, 0xE3, 0xCE, 0xA0, 0x5F, 0x15, 0xE9, 0x5B, 0x28, 0x90, 0xC0, 0xDF, 0x21, 0xEC, 0x24 } } } },
-
- EXTRACT_END_ENTRY
-};
-
-const ExtractEntrySearchData kLoLMonsterScaleYProvider[] = {
- { UNK_LANG, kPlatformUnknown, { 0x0000001E, 0x00000982, { { 0xE2, 0x71, 0x5F, 0x57, 0x4A, 0x8F, 0x50, 0xDB, 0x3E, 0xDA, 0xAB, 0x10, 0xEB, 0xDB, 0x0D, 0x14 } } } },
-
- EXTRACT_END_ENTRY
-};
-
-const ExtractEntrySearchData kLoLMonsterScaleXProvider[] = {
- { UNK_LANG, kPlatformDOS, { 0x00000020, 0x00000918, { { 0xF6, 0x14, 0xE6, 0x48, 0x4E, 0x5B, 0x43, 0xCC, 0xCE, 0x4E, 0x98, 0x71, 0x5A, 0xC2, 0x00, 0x1E } } } },
- { UNK_LANG, kPlatformPC98, { 0x0000001D, 0x000008D2, { { 0x1C, 0x25, 0x38, 0xE2, 0xBB, 0xB2, 0xDB, 0x93, 0x1B, 0x25, 0xB6, 0x89, 0xA9, 0x9B, 0x0A, 0xFE } } } },
- { UNK_LANG, kPlatformFMTowns, { 0x0000001D, 0x000008D2, { { 0x1C, 0x25, 0x38, 0xE2, 0xBB, 0xB2, 0xDB, 0x93, 0x1B, 0x25, 0xB6, 0x89, 0xA9, 0x9B, 0x0A, 0xFE } } } },
-
- EXTRACT_END_ENTRY
-};
-
-const ExtractEntrySearchData kLoLMonsterScaleWHProvider[] = {
- { UNK_LANG, kPlatformUnknown, { 0x00000082, 0x00001D2A, { { 0x85, 0x7E, 0x18, 0xDD, 0x74, 0x1C, 0x62, 0x6F, 0xF4, 0xE5, 0xAF, 0x65, 0xEC, 0x6A, 0x90, 0xAD } } } },
-
- EXTRACT_END_ENTRY
-};
-
-const ExtractEntrySearchData kLoLFlyingObjectShpProvider[] = {
- { UNK_LANG, kPlatformUnknown, { 0x00000082, 0x00000252, { { 0xDE, 0x9D, 0x89, 0xAF, 0x0F, 0x50, 0x14, 0x60, 0x68, 0xAF, 0x19, 0xD8, 0x54, 0x8A, 0x36, 0x27 } } } },
- { UNK_LANG, kPlatformFMTowns, { 0x00000075, 0x00000252, { { 0xD7, 0xE5, 0x13, 0x67, 0xDB, 0x9C, 0xD4, 0x12, 0x0E, 0x99, 0x0D, 0x2A, 0x70, 0x17, 0x95, 0x89 } } } },
-
- EXTRACT_END_ENTRY
-};
-
-const ExtractEntrySearchData kLoLInventoryDescProvider[] = {
- { UNK_LANG, kPlatformUnknown, { 0x00000016, 0x0000082D, { { 0x86, 0xB4, 0xB9, 0x50, 0xB6, 0xDA, 0x29, 0xB2, 0xC0, 0x0D, 0x34, 0x3F, 0x8D, 0x88, 0xAA, 0xE4 } } } },
-
- EXTRACT_END_ENTRY
-};
-
-const ExtractEntrySearchData kLoLLevelShpListProvider[] = {
- { UNK_LANG, kPlatformUnknown, { 0x0000007F, 0x00002090, { { 0x17, 0x31, 0x8A, 0xB5, 0x9B, 0x3A, 0xDA, 0x16, 0x9E, 0xE3, 0xD1, 0x5F, 0xB4, 0x7B, 0xB2, 0x25 } } } },
- { UNK_LANG, kPlatformFMTowns, { 0x00000091, 0x00002090, { { 0x51, 0x79, 0x1D, 0x60, 0xB0, 0x71, 0xB8, 0xF2, 0xDD, 0xD4, 0x36, 0x1B, 0xF8, 0x15, 0xBF, 0xB7 } } } },
- EXTRACT_END_ENTRY
-};
-
-const ExtractEntrySearchData kLoLLevelDatListProvider[] = {
- { UNK_LANG, kPlatformUnknown, { 0x0000007F, 0x00001FB8, { { 0xF6, 0xE9, 0x98, 0x79, 0x51, 0xCA, 0xA0, 0x35, 0xE4, 0xD0, 0xA1, 0xCD, 0x23, 0x89, 0x7D, 0x11 } } } },
- { UNK_LANG, kPlatformFMTowns, { 0x00000091, 0x00001FB8, { { 0x65, 0x1A, 0x3E, 0x96, 0x96, 0xA9, 0x94, 0xD6, 0xD5, 0x21, 0xBE, 0x60, 0xB5, 0x83, 0xF0, 0xE5 } } } },
-
- EXTRACT_END_ENTRY
-};
-
-const ExtractEntrySearchData kLoLCompassDefsProvider[] = {
- { UNK_LANG, kPlatformUnknown, { 0x00000100, 0x000030EF, { { 0x6F, 0xF0, 0x46, 0x6E, 0xB3, 0x72, 0xCF, 0xC7, 0xE3, 0xAF, 0xBE, 0x63, 0xA1, 0x1C, 0x33, 0x20 } } } },
-
- EXTRACT_END_ENTRY
-};
-
-const ExtractEntrySearchData kLoLItemPricesProvider[] = {
- { UNK_LANG, kPlatformDOS, { 0x0000005C, 0x00001251, { { 0x18, 0x62, 0x5E, 0xE2, 0xE4, 0x2A, 0xB0, 0xA0, 0x8B, 0x8D, 0x9D, 0x07, 0x5F, 0x83, 0x53, 0xF7 } } } },
-
- EXTRACT_END_ENTRY
-};
-
-const ExtractEntrySearchData kLoLStashSetupProvider[] = {
- { UNK_LANG, kPlatformUnknown, { 0x0000000C, 0x0000001E, { { 0x1C, 0x93, 0x66, 0x56, 0xDB, 0xD7, 0xA4, 0xB3, 0xE7, 0x2F, 0xEA, 0x88, 0xE2, 0xC8, 0x79, 0xD0 } } } },
-
- EXTRACT_END_ENTRY
-};
-
-const ExtractEntrySearchData kLoLDscWallsProvider[] = {
- { UNK_LANG, kPlatformUnknown, { 0x00000024, 0x00000A2A, { { 0xAC, 0x4E, 0x73, 0x2C, 0xB0, 0xEE, 0x24, 0x0E, 0x66, 0x8D, 0x48, 0xE5, 0xCA, 0x6B, 0x7F, 0x7F } } } },
-
- EXTRACT_END_ENTRY
-};
-
-const ExtractEntrySearchData kRpgCommonDscShapeIndexProvider[] = {
- // LOL:
- { UNK_LANG, kPlatformUnknown, { 0x00000024, 0x00000728, { { 0x14, 0xBA, 0x6D, 0x5C, 0x7D, 0x20, 0x0D, 0x35, 0xA7, 0xB0, 0x8D, 0x2F, 0x1D, 0x2A, 0x49, 0xA4 } } } },
- // EOB:
- { UNK_LANG, kPlatformUnknown, { 0x00000024, 0x00000632, { { 0xBE, 0x3E, 0x84, 0x71, 0x89, 0x04, 0xC9, 0x1D, 0xCF, 0xE4, 0x3B, 0xD8, 0x2A, 0xF4, 0x0F, 0x54 } } } },
-
- EXTRACT_END_ENTRY
-};
-
-const ExtractEntrySearchData kLoLDscOvlMapProvider[] = {
- { UNK_LANG, kPlatformUnknown, { 0x0000000A, 0x0000001F, { { 0x9C, 0xF2, 0xCC, 0x48, 0x42, 0xC6, 0x76, 0x83, 0xD3, 0x1A, 0x43, 0x42, 0x7F, 0xEF, 0x19, 0x0F } } } },
-
- EXTRACT_END_ENTRY
-};
-
-const ExtractEntrySearchData kLoLDscScaleWidthDataProvider[] = {
- { UNK_LANG, kPlatformUnknown, { 0x00000048, 0x00000ABE, { { 0x28, 0x9A, 0xAA, 0x16, 0xC4, 0xFD, 0x52, 0xA9, 0x76, 0x98, 0x72, 0x0C, 0x2D, 0xE4, 0xB0, 0x57 } } } },
- EXTRACT_END_ENTRY
-};
-
-const ExtractEntrySearchData kLoLDscScaleHeightDataProvider[] = {
- { UNK_LANG, kPlatformUnknown, { 0x00000048, 0x000009E8, { { 0x25, 0x35, 0x07, 0xBC, 0xF9, 0x82, 0x8B, 0x5B, 0x67, 0x7C, 0x38, 0xD1, 0xF8, 0x35, 0x81, 0xC7 } } } },
-
- EXTRACT_END_ENTRY
-};
-
-const ExtractEntrySearchData kRpgCommonDscXProvider[] = {
- // LOL
- { UNK_LANG, kPlatformUnknown, { 0x00000048, 0x00001468, { { 0x55, 0xC5, 0x30, 0x76, 0x0A, 0xDC, 0xEC, 0xAB, 0x68, 0x9B, 0x61, 0xF0, 0x58, 0x78, 0x56, 0xA6 } } } },
- // EOB
- { UNK_LANG, kPlatformUnknown, { 0x00000024, 0x00000BFA, { { 0x5F, 0x86, 0x9B, 0xDA, 0x5D, 0x6E, 0xC0, 0xB9, 0x29, 0x82, 0xA5, 0xD7, 0xC9, 0x34, 0x90, 0x63 } } } },
-
- EXTRACT_END_ENTRY
-};
-
-const ExtractEntrySearchData kLoLDscYProvider[] = {
- { UNK_LANG, kPlatformUnknown, { 0x00000024, 0x00000282, { { 0x09, 0x98, 0x3A, 0x33, 0x15, 0xA1, 0x4A, 0xFF, 0x76, 0x19, 0x2B, 0xB1, 0x74, 0x89, 0xF4, 0x37 } } } },
-
- EXTRACT_END_ENTRY
-};
-
-const ExtractEntrySearchData kRpgCommonDscTileIndexProvider[] = {
- { UNK_LANG, kPlatformUnknown, { 0x00000012, 0x00000099, { { 0x18, 0xD9, 0x39, 0x27, 0x5B, 0x34, 0xAE, 0x7C, 0xA9, 0xA9, 0xDB, 0x42, 0x49, 0x61, 0x6B, 0x37 } } } },
-
- EXTRACT_END_ENTRY
-};
-
-const ExtractEntrySearchData kRpgCommonDscUnk2Provider[] = {
- { UNK_LANG, kPlatformUnknown, { 0x00000017, 0x000000D2, { { 0xDE, 0xDA, 0x75, 0x15, 0x2B, 0xDC, 0x90, 0x3F, 0xC9, 0x92, 0x04, 0x01, 0x23, 0x7A, 0xDA, 0x2E } } } },
-
- EXTRACT_END_ENTRY
-};
-
-const ExtractEntrySearchData kRpgCommonDscDoorShapeIndexProvider[] = {
- { UNK_LANG, kPlatformUnknown, { 0x00000017, 0x0000000A, { { 0x2E, 0xC4, 0xA1, 0x47, 0x7C, 0xAE, 0xAD, 0xD8, 0x8A, 0x72, 0x95, 0x2F, 0x18, 0xC5, 0x08, 0x19 } } } }, // LOL
- { UNK_LANG, kPlatformUnknown, { 0x00000020, 0x00000021, { { 0xE3, 0x00, 0x85, 0x1C, 0x13, 0xCE, 0x5D, 0xA7, 0xA2, 0x93, 0x9B, 0x56, 0x1A, 0x0C, 0x43, 0x3E } } } }, // EOB 1
- { UNK_LANG, kPlatformUnknown, { 0x00000035, 0x0000000B, { { 0xC2, 0xBC, 0xCA, 0x95, 0x69, 0xE8, 0x3F, 0x1F, 0xC2, 0x1C, 0x37, 0x90, 0x63, 0x8F, 0xE6, 0x1D } } } }, // EOB 2
- EXTRACT_END_ENTRY
-};
-
-const ExtractEntrySearchData kRpgCommonDscDimData1Provider[] = {
- // LOL
- { UNK_LANG, kPlatformUnknown, { 0x00000144, 0x0001007D, { { 0x18, 0x3D, 0xA5, 0xF7, 0x1A, 0x5A, 0x90, 0xA7, 0x4E, 0x66, 0x1A, 0x4E, 0x0C, 0x69, 0x58, 0x31 } } } },
- // EOB
- { UNK_LANG, kPlatformUnknown, { 0x00000144, 0x00010115, { { 0x89, 0x37, 0x1C, 0x85, 0x53, 0xEE, 0xC0, 0xEC, 0x17, 0x26, 0x0B, 0xE5, 0xCC, 0x9C, 0x30, 0x58 } } } },
- EXTRACT_END_ENTRY
-};
-
-const ExtractEntrySearchData kRpgCommonDscDimData2Provider[] = {
- { UNK_LANG, kPlatformUnknown, { 0x00000288, 0x00001BC2, { { 0x30, 0xD1, 0xD1, 0x35, 0x74, 0x2C, 0x86, 0x81, 0x23, 0xE2, 0x05, 0xCE, 0x75, 0x60, 0x3C, 0x55 } } } },
-
- EXTRACT_END_ENTRY
-};
-
-const ExtractEntrySearchData kRpgCommonDscBlockMapProvider[] = {
- { UNK_LANG, kPlatformUnknown, { 0x0000000C, 0x00000012, { { 0x01, 0xEE, 0x32, 0xA6, 0x71, 0x15, 0x8D, 0xFB, 0x33, 0xF2, 0xD6, 0x8A, 0x30, 0x00, 0x10, 0x4B } } } },
-
- EXTRACT_END_ENTRY
-};
-
-const ExtractEntrySearchData kRpgCommonDscDimMapProvider[] = {
- { UNK_LANG, kPlatformUnknown, { 0x00000012, 0x00000014, { { 0x4D, 0x53, 0x2E, 0xF2, 0xA3, 0xF9, 0xE2, 0xEC, 0x44, 0xBE, 0x5F, 0x04, 0x91, 0xF8, 0xE1, 0x04 } } } },
-
- EXTRACT_END_ENTRY
-};
-
-const ExtractEntrySearchData kLoLDscOvlIndexProvider[] = {
- { UNK_LANG, kPlatformUnknown, { 0x00000028, 0x00000048, { { 0x3E, 0x8E, 0x62, 0xAF, 0xD1, 0x28, 0x39, 0x73, 0x0D, 0xD8, 0x4A, 0xA7, 0xF4, 0xD7, 0x32, 0x25 } } } },
-
- EXTRACT_END_ENTRY
-};
-
-const ExtractEntrySearchData kRpgCommonDscBlockIndexProvider[] = {
- { UNK_LANG, kPlatformUnknown, { 0x00000048, 0x00002200, { { 0xF4, 0x8B, 0x32, 0xC3, 0xD3, 0xFB, 0x46, 0xF2, 0xB8, 0x3A, 0x58, 0x39, 0x94, 0x57, 0x97, 0x4B } } } },
-
- EXTRACT_END_ENTRY
-};
-
-const ExtractEntrySearchData kRpgCommonDscDoorY2Provider[] = {
- { UNK_LANG, kPlatformUnknown, { 0x00000080, 0x00000348, { { 0xC6, 0x58, 0x8B, 0xFE, 0x18, 0x72, 0x47, 0xF1, 0xB6, 0x3A, 0x0F, 0xFB, 0x3D, 0x99, 0x74, 0xD0 } } } }, // LOL
- { UNK_LANG, kPlatformUnknown, { 0x00000004, 0x00000046, { { 0x35, 0x36, 0xBC, 0xD8, 0x63, 0x25, 0x31, 0xA9, 0x61, 0x8E, 0xF6, 0x54, 0x4A, 0x79, 0x17, 0xF8 } } } }, // EOB
- EXTRACT_END_ENTRY
-};
-
-const ExtractEntrySearchData kRpgCommonDscDoorFrameY1Provider[] = {
- { UNK_LANG, kPlatformUnknown, { 0x00000020, 0x0000053B, { { 0xF0, 0x9E, 0xC5, 0xB1, 0xEA, 0x5A, 0x58, 0xBD, 0xAC, 0x7B, 0xB2, 0xD4, 0xFE, 0x3F, 0x4F, 0x51 } } } }, // EOB I
- { UNK_LANG, kPlatformUnknown, { 0x00000004, 0x00000046, { { 0xD4, 0xA4, 0xEC, 0xA2, 0x99, 0xB6, 0x5E, 0x12, 0x98, 0xFF, 0xF2, 0x55, 0xC8, 0xBD, 0xC5, 0x8F } } } }, // EOB II
- EXTRACT_END_ENTRY
-};
-
-const ExtractEntrySearchData kRpgCommonDscDoorFrameY2Provider[] = {
- { UNK_LANG, kPlatformUnknown, { 0x00000020, 0x0000053B, { { 0xF0, 0x9E, 0xC5, 0xB1, 0xEA, 0x5A, 0x58, 0xBD, 0xAC, 0x7B, 0xB2, 0xD4, 0xFE, 0x3F, 0x4F, 0x51 } } } }, // EOB I
- { UNK_LANG, kPlatformUnknown, { 0x00000004, 0x00000150, { { 0x49, 0x7E, 0xF4, 0xDF, 0x8D, 0x04, 0x0A, 0xCE, 0x49, 0xBB, 0xA2, 0x1D, 0x8D, 0xC2, 0x14, 0x9E } } } }, // EOB II
- EXTRACT_END_ENTRY
-};
-
-const ExtractEntrySearchData kRpgCommonDscDoorFrameIndex1Provider[] = {
- { UNK_LANG, kPlatformUnknown, { 0x0000000C, 0x00000058, { { 0xC9, 0xAF, 0x1F, 0x68, 0xF1, 0xDE, 0x96, 0x9B, 0x3B, 0xCB, 0x56, 0xEC, 0x2E, 0x62, 0x9A, 0x0A } } } },
- EXTRACT_END_ENTRY
-};
-
-const ExtractEntrySearchData kRpgCommonDscDoorFrameIndex2Provider[] = {
- { UNK_LANG, kPlatformUnknown, { 0x0000000C, 0x000000E8, { { 0x8C, 0x10, 0x56, 0xEA, 0x4D, 0x1A, 0x9C, 0xB2, 0x55, 0x54, 0xA5, 0x61, 0x1D, 0x19, 0x4E, 0x50 } } } },
- EXTRACT_END_ENTRY
-};
-
-const ExtractEntrySearchData kLoLDscDoorScaleProvider[] = {
- { UNK_LANG, kPlatformUnknown, { 0x00000010, 0x0000024C, { { 0x8D, 0x83, 0x26, 0xEE, 0xDC, 0xF7, 0x13, 0xC0, 0xAA, 0x88, 0xC2, 0xAA, 0x66, 0xA7, 0x59, 0x41 } } } },
-
- EXTRACT_END_ENTRY
-};
-
-const ExtractEntrySearchData kLoLDscDoor4Provider[] = {
- { UNK_LANG, kPlatformUnknown, { 0x00000008, 0x00000103, { { 0x29, 0xC0, 0x4B, 0x7F, 0x36, 0x23, 0xBB, 0x38, 0x4C, 0x83, 0xC6, 0x9D, 0xB4, 0x8F, 0x29, 0x2E } } } },
- { UNK_LANG, kPlatformFMTowns, { 0x00000008, 0x0000000F, { { 0x9C, 0x6B, 0xAF, 0x69, 0x42, 0xC9, 0xC9, 0xA0, 0xD9, 0xF3, 0x54, 0xD9, 0x9A, 0xAF, 0xCF, 0xD8 } } } },
- EXTRACT_END_ENTRY
-};
-
-const ExtractEntrySearchData kLoLDscDoorXProvider[] = {
- { UNK_LANG, kPlatformUnknown, { 0x00000480, 0x0001654D, { { 0x2A, 0x1F, 0xBF, 0xE3, 0xC4, 0xEF, 0x7E, 0xD1, 0x61, 0x51, 0xFE, 0x88, 0x8D, 0x1F, 0x59, 0x70 } } } },
-
- EXTRACT_END_ENTRY
-};
-
-const ExtractEntrySearchData kLoLDscDoorYProvider[] = {
- { UNK_LANG, kPlatformUnknown, { 0x00000480, 0x00026666, { { 0x06, 0xBF, 0xA4, 0xD4, 0x6E, 0x29, 0x42, 0xA2, 0xA0, 0x8E, 0x3C, 0x14, 0xF3, 0xD6, 0x3F, 0x87 } } } },
-
- EXTRACT_END_ENTRY
-};
-
-const ExtractEntrySearchData kLoLScrollXTopProvider[] = {
- { UNK_LANG, kPlatformUnknown, { 0x0000000A, 0x0000004B, { { 0x18, 0x1E, 0x6E, 0xE9, 0x34, 0xF0, 0x02, 0xC6, 0x57, 0x34, 0xDF, 0x55, 0xD9, 0x39, 0xE8, 0x98 } } } },
-
- EXTRACT_END_ENTRY
-};
-
-const ExtractEntrySearchData kLoLScrollYTopProvider[] = {
- { UNK_LANG, kPlatformUnknown, { 0x0000000A, 0x00000022, { { 0xF3, 0x20, 0x5A, 0xC1, 0xBB, 0x0C, 0x79, 0x52, 0x23, 0xC1, 0x36, 0x81, 0x70, 0x2F, 0x92, 0xFC } } } },
-
- EXTRACT_END_ENTRY
-};
-
-const ExtractEntrySearchData kLoLScrollXBottomProvider[] = {
- { UNK_LANG, kPlatformUnknown, { 0x0000000A, 0x0000004B, { { 0x18, 0x1E, 0x6E, 0xE9, 0x34, 0xF0, 0x02, 0xC6, 0x57, 0x34, 0xDF, 0x55, 0xD9, 0x39, 0xE8, 0x98 } } } },
-
- EXTRACT_END_ENTRY
-};
-
-const ExtractEntrySearchData kLoLScrollYBottomProvider[] = {
- { UNK_LANG, kPlatformUnknown, { 0x0000000A, 0x0000003C, { { 0x5B, 0x4F, 0xB7, 0xB5, 0x55, 0xA2, 0x9A, 0x21, 0xEF, 0xB4, 0x98, 0x47, 0x05, 0x57, 0x49, 0x55 } } } },
-
- EXTRACT_END_ENTRY
-};
-
-const ExtractEntrySearchData kLoLButtonDefsProvider[] = {
- { UNK_LANG, kPlatformDOS, { 0x0000082A, 0x0000CAAE, { { 0xC1, 0x83, 0x0D, 0xA0, 0x66, 0x16, 0x3D, 0x31, 0xCE, 0x30, 0x9F, 0x4E, 0x00, 0x65, 0x5A, 0xC8 } } } }, // floppy
- { UNK_LANG, kPlatformDOS, { 0x0000082A, 0x0000C34E, { { 0x7F, 0x9A, 0x0F, 0x28, 0x1A, 0x8F, 0x03, 0x46, 0x48, 0xEB, 0xC9, 0xB9, 0x23, 0x29, 0x5E, 0x50 } } } }, // floppy
- { UNK_LANG, kPlatformDOS, { 0x0000082A, 0x0000C47B, { { 0xDF, 0x1A, 0x18, 0x1F, 0x58, 0x05, 0x1F, 0x56, 0xD8, 0x6D, 0xBB, 0x93, 0xEC, 0x35, 0x9D, 0xA5 } } } }, // CD
- { UNK_LANG, kPlatformPC98, { 0x0000082A, 0x0000AB58, { { 0xDD, 0x2B, 0xA9, 0x54, 0x60, 0x25, 0x2C, 0x74, 0xF8, 0x5D, 0xC6, 0xD2, 0x2C, 0x1A, 0x24, 0x44 } } } },
- { UNK_LANG, kPlatformFMTowns, { 0x0000082A, 0x0000D271, { { 0xAF, 0xAD, 0x11, 0xF9, 0xDC, 0x41, 0x94, 0xB3, 0x0E, 0x48, 0x69, 0xB3, 0x32, 0x89, 0x7C, 0xDD } } } },
- EXTRACT_END_ENTRY
-};
-
-const ExtractEntrySearchData kLoLButtonList1Provider[] = {
- { UNK_LANG, kPlatformUnknown, { 0x00000050, 0x00000A37, { { 0x0F, 0x73, 0xEC, 0xDD, 0xAB, 0xFF, 0x49, 0x46, 0x5E, 0x8F, 0x0D, 0xC3, 0xE7, 0x1B, 0x89, 0x51 } } } },
- { UNK_LANG, kPlatformFMTowns, { 0x00000028, 0x00000938, { { 0x4B, 0xD9, 0x4A, 0x57, 0x58, 0xEC, 0x01, 0xE5, 0xA1, 0x25, 0x6A, 0x1A, 0x9C, 0x5D, 0x79, 0x19 } } } },
-
- EXTRACT_END_ENTRY
-};
-
-const ExtractEntrySearchData kLoLButtonList2Provider[] = {
- { UNK_LANG, kPlatformUnknown, { 0x0000001E, 0x00000522, { { 0xEA, 0x41, 0x46, 0xE2, 0xFE, 0xAA, 0x7D, 0x5E, 0x89, 0x7F, 0xBF, 0x9B, 0x30, 0x60, 0x74, 0xF3 } } } },
- { UNK_LANG, kPlatformFMTowns, { 0x0000000F, 0x00000423, { { 0xD3, 0xA8, 0xD4, 0xFB, 0x1A, 0x56, 0x21, 0x8C, 0x01, 0xED, 0xF8, 0x54, 0xA9, 0xC5, 0x97, 0x04 } } } },
- EXTRACT_END_ENTRY
-};
-
-const ExtractEntrySearchData kLoLButtonList3Provider[] = {
- { UNK_LANG, kPlatformUnknown, { 0x00000004, 0x0000023E, { { 0x70, 0xAA, 0xCA, 0xAC, 0x5C, 0x21, 0xCF, 0xA5, 0xBF, 0x7F, 0x5F, 0xBC, 0xF1, 0x24, 0x8A, 0xAF } } } },
- { UNK_LANG, kPlatformFMTowns, { 0x00000002, 0x0000013F, { { 0xDF, 0xE4, 0x3D, 0x18, 0x94, 0x18, 0xA5, 0x74, 0xBA, 0x26, 0x7B, 0x31, 0x87, 0xAE, 0xEE, 0x22 } } } },
- EXTRACT_END_ENTRY
-};
-
-const ExtractEntrySearchData kLoLButtonList4Provider[] = {
- { UNK_LANG, kPlatformUnknown, { 0x0000001E, 0x0000054D, { { 0x19, 0x2A, 0xBE, 0x7F, 0x94, 0x10, 0xA0, 0x60, 0x2A, 0x33, 0xD6, 0x11, 0x85, 0xF0, 0xA4, 0xA9 } } } },
- { UNK_LANG, kPlatformFMTowns, { 0x0000000F, 0x0000044E, { { 0x18, 0x1E, 0xBB, 0x7D, 0xAC, 0xA1, 0x87, 0x0F, 0x32, 0xA3, 0xBF, 0x5F, 0xBC, 0xBB, 0x90, 0xA4 } } } },
- EXTRACT_END_ENTRY
-};
-
-const ExtractEntrySearchData kLoLButtonList5Provider[] = {
- { UNK_LANG, kPlatformUnknown, { 0x00000020, 0x0000045D, { { 0xE3, 0x7C, 0xC2, 0x36, 0x21, 0x46, 0xDB, 0xF3, 0xDD, 0x38, 0x4B, 0x40, 0xE0, 0x35, 0x09, 0xC3 } } } },
- { UNK_LANG, kPlatformFMTowns, { 0x00000010, 0x0000035E, { { 0x4E, 0xE2, 0xD6, 0x93, 0xA3, 0xEF, 0xD0, 0xEA, 0x28, 0xE6, 0xE7, 0xDD, 0xFC, 0x44, 0xE2, 0xB9 } } } },
- EXTRACT_END_ENTRY
-};
-
-const ExtractEntrySearchData kLoLButtonList6Provider[] = {
- { UNK_LANG, kPlatformUnknown, { 0x0000001C, 0x000004C4, { { 0x21, 0x7C, 0x29, 0x3F, 0x95, 0x6F, 0x91, 0x8C, 0xB2, 0x30, 0x09, 0xA6, 0x7B, 0x48, 0x44, 0x8F } } } },
- { UNK_LANG, kPlatformFMTowns, { 0x0000000E, 0x000003C5, { { 0x05, 0x10, 0x83, 0x1E, 0x18, 0x11, 0xC4, 0x43, 0x01, 0xE3, 0xE0, 0xD7, 0x79, 0x29, 0xA5, 0x86 } } } },
- EXTRACT_END_ENTRY
-};
-
-const ExtractEntrySearchData kLoLButtonList7Provider[] = {
- { UNK_LANG, kPlatformUnknown, { 0x00000006, 0x0000021D, { { 0xDC, 0xCE, 0x1B, 0xEB, 0x11, 0x6D, 0xDE, 0x37, 0x17, 0xC8, 0x06, 0x51, 0xC3, 0x0C, 0xCB, 0xA6 } } } },
- { UNK_LANG, kPlatformFMTowns, { 0x00000003, 0x0000011E, { { 0xCF, 0x37, 0xEF, 0x83, 0xEC, 0x0D, 0x65, 0x41, 0xC8, 0x1D, 0xD1, 0x20, 0x82, 0x6B, 0xB5, 0x9B } } } },
- EXTRACT_END_ENTRY
-};
-
-const ExtractEntrySearchData kLoLButtonList8Provider[] = {
- { UNK_LANG, kPlatformUnknown, { 0x00000004, 0x00000253, { { 0x0C, 0x7B, 0x10, 0x99, 0x93, 0xD0, 0x33, 0xCA, 0xAB, 0x8D, 0x7E, 0x24, 0xE5, 0x7E, 0x6C, 0x91 } } } },
- { UNK_LANG, kPlatformFMTowns, { 0x00000002, 0x00000154, { { 0xE9, 0x6B, 0x8A, 0xD7, 0x8E, 0xCF, 0x66, 0x07, 0xDC, 0xF1, 0xC0, 0xAA, 0x81, 0x88, 0xB8, 0xB9 } } } },
- EXTRACT_END_ENTRY
-};
-
-const ExtractEntrySearchData kLoLLegendDataProvider[] = {
- { UNK_LANG, kPlatformUnknown, { 0x00000030, 0x00000858, { { 0x63, 0x5E, 0x60, 0xC7, 0x62, 0x2C, 0x5D, 0x8F, 0x74, 0x71, 0x98, 0xB7, 0x09, 0xD2, 0x51, 0xC7 } } } },
- { UNK_LANG, kPlatformUnknown, { 0x0000003C, 0x00000A52, { { 0x81, 0xC5, 0xA4, 0xE7, 0x60, 0xDA, 0xD6, 0x5E, 0x19, 0xAB, 0xF3, 0xC7, 0xDD, 0xDB, 0x92, 0x5E } } } },
-
- EXTRACT_END_ENTRY
-};
-
-const ExtractEntrySearchData kLoLMapCursorOvlProvider[] = {
- { UNK_LANG, kPlatformDOS, { 0x00000019, 0x000009CD, { { 0xF6, 0xD2, 0xFA, 0x36, 0x62, 0x95, 0x1D, 0x99, 0x7F, 0x11, 0x5F, 0xA8, 0x4D, 0x47, 0x72, 0x40 } } } },
-
- EXTRACT_END_ENTRY
-};
-
-const ExtractEntrySearchData kLoLMapStringIdProvider[] = {
- { UNK_LANG, kPlatformUnknown, { 0x0000003C, 0x00000CFB, { { 0xE3, 0xC3, 0x41, 0x06, 0xD1, 0x71, 0x77, 0x78, 0xAD, 0x39, 0xAE, 0x2C, 0x16, 0x21, 0x45, 0xB7 } } } },
-
- EXTRACT_END_ENTRY
-};
-
-const ExtractEntrySearchData kLoLSpellbookAnimProvider[] = {
- { UNK_LANG, kPlatformUnknown, { 0x00000038, 0x000003A1, { { 0x50, 0xA0, 0xF6, 0xA7, 0x53, 0x96, 0x86, 0x49, 0xB0, 0x8D, 0xA8, 0xB2, 0x2D, 0x9A, 0xE2, 0x1F } } } },
-
- EXTRACT_END_ENTRY
-};
-
-const ExtractEntrySearchData kLoLSpellbookCoordsProvider[] = {
- { UNK_LANG, kPlatformUnknown, { 0x00000018, 0x0000018F, { { 0xA5, 0xF6, 0x8A, 0x58, 0x9A, 0xC7, 0x3C, 0x3A, 0xB5, 0x87, 0x89, 0x87, 0x73, 0x51, 0x9B, 0x1B } } } },
-
- EXTRACT_END_ENTRY
-};
-
-const ExtractEntrySearchData kLoLHealShapeFramesProvider[] = {
- { UNK_LANG, kPlatformUnknown, { 0x00000050, 0x000000F4, { { 0xC9, 0x6E, 0x39, 0xE1, 0xD7, 0xAD, 0x10, 0x4F, 0xE2, 0xFE, 0xDC, 0xAD, 0x00, 0x9D, 0x41, 0xEF } } } },
-
- EXTRACT_END_ENTRY
-};
-
-const ExtractEntrySearchData kLoLLightningDefsProvider[] = {
- { UNK_LANG, kPlatformUnknown, { 0x00000014, 0x00000385, { { 0x68, 0x39, 0x65, 0xCB, 0xA9, 0x80, 0x90, 0xFB, 0xDD, 0x77, 0x0C, 0x76, 0x5A, 0xB5, 0x05, 0x03 } } } },
-
- EXTRACT_END_ENTRY
-};
-
-const ExtractEntrySearchData kLoLFireballCoordsProvider[] = {
- { UNK_LANG, kPlatformUnknown, { 0x00000200, 0x0000FD81, { { 0xB3, 0xE0, 0x6F, 0x89, 0xCD, 0xE5, 0xA9, 0x6A, 0x4B, 0x61, 0x7A, 0x3F, 0x47, 0x26, 0x73, 0x58 } } } },
-
- EXTRACT_END_ENTRY
-};
-
-const ExtractEntrySearchData kLoLCreditsProvider[] = {
- { JA_JPN , kPlatformPC98, { 0x000005E7, 0x0001A1B0, { { 0x2A, 0xD0, 0x38, 0x84, 0x0C, 0x38, 0xCB, 0x52, 0x5D, 0x82, 0xBE, 0x03, 0x76, 0xFA, 0x0A, 0x4A } } } },
- { JA_JPN , kPlatformFMTowns, { 0x000005EC, 0x0001A219, { { 0x03, 0xBC, 0x67, 0x19, 0xA1, 0x99, 0x70, 0x10, 0x7A, 0x73, 0x85, 0xDA, 0xB4, 0x59, 0x49, 0xB0 } } } },
- EXTRACT_END_ENTRY
-};
-
-const ExtractEntrySearchData kLoLHistoryProvider[] = {
- { UNK_LANG, kPlatformDOS, { 0x000001D1, 0x00007F9B, { { 0x25, 0x10, 0x86, 0x40, 0xAC, 0x53, 0xFE, 0x11, 0x4D, 0xE2, 0xD9, 0x35, 0xD6, 0x89, 0xBB, 0x09 } } } },
-
- EXTRACT_END_ENTRY
-};
-
-// Provider tables
-
-struct ExtractEntry {
- int id;
- const ExtractEntrySearchData *providers;
-};
-
-const ExtractEntry extractProviders[] = {
- { k1ForestSeq, k1ForestSeqProvider },
- { k1KallakWritingSeq, k1KallakWritingSeqProvider },
- { k1KyrandiaLogoSeq, k1KyrandiaLogoSeqProvider },
- { k1KallakMalcolmSeq, k1KallakMalcolmSeqProvider },
- { k1MalcolmTreeSeq, k1MalcolmTreeSeqProvider },
- { k1WestwoodLogoSeq, k1WestwoodLogoSeqProvider },
- { k1Demo1Seq, k1Demo1SeqProvider },
- { k1Demo2Seq, k1Demo2SeqProvider },
- { k1Demo3Seq, k1Demo3SeqProvider },
- { k1Demo4Seq, k1Demo4SeqProvider },
- { k1AmuleteAnimSeq, k1AmuleteAnimSeqProvider },
- { k1OutroReunionSeq, k1OutroReunionSeqProvider },
- { k1IntroCPSStrings, k1IntroCPSStringsProvider },
- { k1IntroCOLStrings, k1IntroCOLStringsProvider },
- { k1IntroWSAStrings, k1IntroWSAStringsProvider },
- { k1IntroStrings, k1IntroStringsProvider },
- { k1OutroHomeString, k1OutroHomeStringProvider },
- { k1RoomFilenames, k1RoomFilenamesProvider },
- { k1RoomList, k1RoomListProvider },
- { k1CharacterImageFilenames, k1CharacterImageFilenamesProvider },
- { k1AudioTracks, k1AudioTracksProvider },
- { k1AudioTracks2, k1AudioTracks2Provider },
- { k1AudioTracksIntro, k1AudioTracksIntroProvider },
- { k1ItemNames, k1ItemNamesProvider },
- { k1TakenStrings, k1TakenStringsProvider },
- { k1PlacedStrings, k1PlacedStringsProvider },
- { k1DroppedStrings, k1DroppedStringsProvider },
- { k1NoDropStrings, k1NoDropStringsProvider },
- { k1PutDownString, k1PutDownStringProvider },
- { k1WaitAmuletString, k1WaitAmuletStringProvider },
- { k1BlackJewelString, k1BlackJewelStringProvider },
- { k1PoisonGoneString, k1PoisonGoneStringProvider },
- { k1HealingTipString, k1HealingTipStringProvider },
- { k1WispJewelStrings, k1WispJewelStringsProvider },
- { k1MagicJewelStrings, k1MagicJewelStringsProvider },
- { k1ThePoisonStrings, k1ThePoisonStringsProvider },
- { k1FluteStrings, k1FluteStringsProvider },
- { k1FlaskFullString, k1FlaskFullStringProvider },
- { k1FullFlaskString, k1FullFlaskStringProvider },
- { k1VeryCleverString, k1VeryCleverStringProvider },
- { k1NewGameString, k1NewGameStringProvider },
- { k1DefaultShapes, k1DefaultShapesProvider },
- { k1Healing1Shapes, k1Healing1ShapesProvider },
- { k1Healing2Shapes, k1Healing2ShapesProvider },
- { k1PoisonDeathShapes, k1PoisonDeathShapesProvider },
- { k1FluteShapes, k1FluteShapesProvider },
- { k1Winter1Shapes, k1Winter1ShapesProvider },
- { k1Winter2Shapes, k1Winter2ShapesProvider },
- { k1Winter3Shapes, k1Winter3ShapesProvider },
- { k1DrinkShapes, k1DrinkShapesProvider },
- { k1WispShapes, k1WispShapesProvider },
- { k1MagicAnimShapes, k1MagicAnimShapesProvider },
- { k1BranStoneShapes, k1BranStoneShapesProvider },
- { k1SpecialPalette1, k1SpecialPalette1Provider },
- { k1SpecialPalette2, k1SpecialPalette2Provider },
- { k1SpecialPalette3, k1SpecialPalette3Provider },
- { k1SpecialPalette4, k1SpecialPalette4Provider },
- { k1SpecialPalette5, k1SpecialPalette5Provider },
- { k1SpecialPalette6, k1SpecialPalette6Provider },
- { k1SpecialPalette7, k1SpecialPalette7Provider },
- { k1SpecialPalette8, k1SpecialPalette8Provider },
- { k1SpecialPalette9, k1SpecialPalette9Provider },
- { k1SpecialPalette10, k1SpecialPalette10Provider },
- { k1SpecialPalette11, k1SpecialPalette11Provider },
- { k1SpecialPalette12, k1SpecialPalette12Provider },
- { k1SpecialPalette13, k1SpecialPalette13Provider },
- { k1SpecialPalette14, k1SpecialPalette14Provider },
- { k1SpecialPalette15, k1SpecialPalette15Provider },
- { k1SpecialPalette16, k1SpecialPalette16Provider },
- { k1SpecialPalette17, k1SpecialPalette17Provider },
- { k1SpecialPalette18, k1SpecialPalette18Provider },
- { k1SpecialPalette19, k1SpecialPalette19Provider },
- { k1SpecialPalette20, k1SpecialPalette20Provider },
- { k1SpecialPalette21, k1SpecialPalette21Provider },
- { k1SpecialPalette22, k1SpecialPalette22Provider },
- { k1SpecialPalette23, k1SpecialPalette23Provider },
- { k1SpecialPalette24, k1SpecialPalette24Provider },
- { k1SpecialPalette25, k1SpecialPalette25Provider },
- { k1SpecialPalette26, k1SpecialPalette26Provider },
- { k1SpecialPalette27, k1SpecialPalette27Provider },
- { k1SpecialPalette28, k1SpecialPalette28Provider },
- { k1SpecialPalette29, k1SpecialPalette29Provider },
- { k1SpecialPalette30, k1SpecialPalette30Provider },
- { k1SpecialPalette31, k1SpecialPalette31Provider },
- { k1SpecialPalette32, k1SpecialPalette32Provider },
- { k1SpecialPalette33, k1SpecialPalette33Provider },
- { k1GUIStrings, k1GUIStringsProvider },
- { k1ConfigStrings, k1ConfigStringsProvider },
- { k1TownsMusicFadeTable, k1TownsMusicFadeTableProvider },
- { k1TownsSFXwdTable, k1TownsSFXwdTableProvider },
- { k1TownsSFXbtTable, k1TownsSFXbtTableProvider },
- { k1TownsCDATable, k1TownsCDATableProvider },
- { k1PC98StoryStrings, k1PC98StoryStringsProvider },
- { k1PC98IntroSfx, k1PC98IntroSfxProvider },
- { k1CreditsStrings, k1CreditsStringsProvider },
- { k1AmigaIntroSFXTable, k1AmigaIntroSFXTableProvider },
- { k1AmigaGameSFXTable, k1AmigaGameSFXTableProvider },
- { k2SeqplayPakFiles, k2SeqplayPakFilesProvider },
- { k2SeqplayStrings, k2SeqplayStringsProvider },
- { k2SeqplaySfxFiles, k2SeqplaySfxFilesProvider },
- { k2SeqplayTlkFiles, k2SeqplayTlkFilesProvider },
- { k2SeqplaySeqData, k2SeqplaySeqDataProvider },
- { k2SeqplayCredits, k2SeqplayCreditsProvider },
- { k2SeqplayCreditsSpecial, k2SeqplayCreditsSpecialProvider },
- { k2SeqplayIntroTracks, k2SeqplayIntroTracksProvider },
- { k2SeqplayFinaleTracks, k2SeqplayFinaleTracksProvider },
- { k2SeqplayIntroCDA, k2SeqplayIntroCDAProvider },
- { k2SeqplayFinaleCDA, k2SeqplayFinaleCDAProvider },
- { k2SeqplayShapeAnimData, k2SeqplayShapeAnimDataProvider },
- { k2IngamePakFiles, k2IngamePakFilesProvider },
- { k2IngameSfxFiles, k2IngameSfxFilesProvider },
- { k2IngameSfxIndex, k2IngameSfxIndexProvider },
- { k2IngameTracks, k2IngameTracksProvider },
- { k2IngameCDA, k2IngameCDAProvider },
- { k2IngameTalkObjIndex, k2IngameTalkObjIndexProvider },
- { k2IngameTimJpStrings, k2IngameTimJpStringsProvider },
- { k2IngameShapeAnimData, k2IngameShapeAnimDataProvider },
- { k2IngameTlkDemoStrings, k2IngameTlkDemoStringsProvider },
- { k3MainMenuStrings, k3MainMenuStringsProvider },
- { k3MusicFiles, k3MusicFilesProvider },
- { k3ScoreTable, k3ScoreTableProvider },
- { k3SfxFiles, k3SfxFilesProvider },
- { k3SfxMap, k3SfxMapProvider },
- { k3ItemAnimData, k3ItemAnimDataProvider },
- { k3ItemMagicTable, k3ItemMagicTableProvider },
- { k3ItemStringMap, k3ItemStringMapProvider },
-
- { kEoBBaseChargenStrings1, kEoBBaseChargenStrings1Provider },
- { kEoBBaseChargenStrings2, kEoBBaseChargenStrings2Provider },
- { kEoBBaseChargenStartLevels, kEoBBaseChargenStartLevelsProvider },
- { kEoBBaseChargenStatStrings, kEoBBaseChargenStatStringsProvider },
- { kEoBBaseChargenRaceSexStrings, kEoBBaseChargenRaceSexStringsProvider },
- { kEoBBaseChargenClassStrings, kEoBBaseChargenClassStringsProvider },
- { kEoBBaseChargenAlignmentStrings, kEoBBaseChargenAlignmentStringsProvider },
- { kEoBBaseChargenEnterGameStrings, kEoBBaseChargenEnterGameStringsProvider },
- { kEoBBaseChargenClassMinStats, kEoBBaseChargenClassMinStatsProvider },
- { kEoBBaseChargenRaceMinStats, kEoBBaseChargenRaceMinStatsProvider },
- { kEoBBaseChargenRaceMaxStats, kEoBBaseChargenRaceMaxStatsProvider },
-
- { kEoBBaseSaveThrowTable1, kEoBBaseSaveThrowTable1Provider },
- { kEoBBaseSaveThrowTable2, kEoBBaseSaveThrowTable2Provider },
- { kEoBBaseSaveThrowTable3, kEoBBaseSaveThrowTable3Provider },
- { kEoBBaseSaveThrowTable4, kEoBBaseSaveThrowTable4Provider },
- { kEoBBaseSaveThrwLvlIndex, kEoBBaseSaveThrwLvlIndexProvider },
- { kEoBBaseSaveThrwModDiv, kEoBBaseSaveThrwModDivProvider },
- { kEoBBaseSaveThrwModExt, kEoBBaseSaveThrwModExtProvider },
-
- { kEoBBasePryDoorStrings, kEoBBasePryDoorStringsProvider },
- { kEoBBaseWarningStrings, kEoBBaseWarningStringsProvider },
-
- { kEoBBaseItemSuffixStringsRings, kEoBBaseItemSuffixStringsRingsProvider },
- { kEoBBaseItemSuffixStringsPotions, kEoBBaseItemSuffixStringsPotionsProvider },
- { kEoBBaseItemSuffixStringsWands, kEoBBaseItemSuffixStringsWandsProvider },
-
- { kEoBBaseRipItemStrings, kEoBBaseRipItemStringsProvider },
- { kEoBBaseCursedString, kEoBBaseCursedStringProvider },
- { kEoBBaseEnchantedString, kEoBBaseEnchantedStringProvider },
- { kEoBBaseMagicObjectStrings, kEoBBaseMagicObjectStringsProvider },
- { kEoBBaseMagicObject5String, kEoBBaseMagicObject5StringProvider },
- { kEoBBasePatternSuffix, kEoBBasePatternSuffixProvider },
- { kEoBBasePatternGrFix1, kEoBBasePatternGrFix1Provider },
- { kEoBBasePatternGrFix2, kEoBBasePatternGrFix2Provider },
- { kEoBBaseValidateArmorString, kEoBBaseValidateArmorStringProvider },
- { kEoBBaseValidateCursedString, kEoBBaseValidateCursedStringProvider },
- { kEoBBaseValidateNoDropString, kEoBBaseValidateNoDropStringProvider },
- { kEoBBasePotionStrings, kEoBBasePotionStringsProvider },
- { kEoBBaseWandString, kEoBBaseWandStringProvider },
- { kEoBBaseItemMisuseStrings, kEoBBaseItemMisuseStringsProvider },
-
- { kEoBBaseTakenStrings, kEoBBaseTakenStringsProvider },
- { kEoBBasePotionEffectStrings, kEoBBasePotionEffectStringsProvider },
-
- { kEoBBaseYesNoStrings, kEoBBaseYesNoStringsProvider },
- { kRpgCommonMoreStrings, kRpgCommonMoreStringsProvider },
- { kEoBBaseNpcMaxStrings, kEoBBaseNpcMaxStringsProvider },
- { kEoBBaseOkStrings, kEoBBaseOkStringsProvider },
- { kEoBBaseNpcJoinStrings, kEoBBaseNpcJoinStringsProvider },
- { kEoBBaseCancelStrings, kEoBBaseCancelStringsProvider },
- { kEoBBaseAbortStrings, kEoBBaseAbortStringsProvider },
-
- { kEoBBaseMenuStringsMain, kEoBBaseMenuStringsMainProvider },
- { kEoBBaseMenuStringsSaveLoad, kEoBBaseMenuStringsSaveLoadProvider },
- { kEoBBaseMenuStringsOnOff, kEoBBaseMenuStringsOnOffProvider },
- { kEoBBaseMenuStringsSpells, kEoBBaseMenuStringsSpellsProvider },
- { kEoBBaseMenuStringsRest, kEoBBaseMenuStringsRestProvider },
- { kEoBBaseMenuStringsDrop, kEoBBaseMenuStringsDropProvider },
- { kEoBBaseMenuStringsExit, kEoBBaseMenuStringsExitProvider },
- { kEoBBaseMenuStringsStarve, kEoBBaseMenuStringsStarveProvider },
- { kEoBBaseMenuStringsScribe, kEoBBaseMenuStringsScribeProvider },
- { kEoBBaseMenuStringsDrop2, kEoBBaseMenuStringsDrop2Provider },
- { kEoBBaseMenuStringsHead, kEoBBaseMenuStringsHeadProvider },
- { kEoBBaseMenuStringsPoison, kEoBBaseMenuStringsPoisonProvider },
- { kEoBBaseMenuStringsMgc, kEoBBaseMenuStringsMgcProvider },
- { kEoBBaseMenuStringsPrefs, kEoBBaseMenuStringsPrefsProvider },
- { kEoBBaseMenuStringsRest2, kEoBBaseMenuStringsRest2Provider },
- { kEoBBaseMenuStringsRest3, kEoBBaseMenuStringsRest3Provider },
- { kEoBBaseMenuStringsRest4, kEoBBaseMenuStringsRest4Provider },
- { kEoBBaseMenuStringsDefeat, kEoBBaseMenuStringsDefeatProvider },
- { kEoBBaseMenuStringsTransfer, kEoBBaseMenuStringsTransferProvider },
- { kEoBBaseMenuStringsSpec, kEoBBaseMenuStringsSpecProvider },
- { kEoBBaseMenuStringsSpellNo, kEoBBaseMenuStringsSpellNoProvider },
- { kEoBBaseMenuYesNoStrings, kEoBBaseMenuYesNoStringsProvider },
-
- { kEoBBaseSpellLevelsMage, kEoBBaseSpellLevelsMageProvider },
- { kEoBBaseSpellLevelsCleric, kEoBBaseSpellLevelsClericProvider },
- { kEoBBaseNumSpellsCleric, kEoBBaseNumSpellsClericProvider },
- { kEoBBaseNumSpellsWisAdj, kEoBBaseNumSpellsWisAdjProvider },
- { kEoBBaseNumSpellsPal, kEoBBaseNumSpellsPalProvider },
- { kEoBBaseNumSpellsMage, kEoBBaseNumSpellsMageProvider },
-
- { kEoBBaseCharGuiStringsHp, kEoBBaseCharGuiStringsHpProvider },
- { kEoBBaseCharGuiStringsWp1, kEoBBaseCharGuiStringsWp1Provider },
- { kEoBBaseCharGuiStringsWp2, kEoBBaseCharGuiStringsWp2Provider },
- { kEoBBaseCharGuiStringsWr, kEoBBaseCharGuiStringsWrProvider },
- { kEoBBaseCharGuiStringsSt1, kEoBBaseCharGuiStringsSt1Provider },
- { kEoBBaseCharGuiStringsSt2, kEoBBaseCharGuiStringsSt2Provider },
- { kEoBBaseCharGuiStringsIn, kEoBBaseCharGuiStringsInProvider },
-
- { kEoBBaseCharStatusStrings7, kEoBBaseCharStatusStrings7Provider },
- { kEoBBaseCharStatusStrings81, kEoBBaseCharStatusStrings81Provider },
- { kEoBBaseCharStatusStrings82, kEoBBaseCharStatusStrings82Provider },
- { kEoBBaseCharStatusStrings9, kEoBBaseCharStatusStrings9Provider },
- { kEoBBaseCharStatusStrings12, kEoBBaseCharStatusStrings12Provider },
- { kEoBBaseCharStatusStrings131, kEoBBaseCharStatusStrings131Provider },
- { kEoBBaseCharStatusStrings132, kEoBBaseCharStatusStrings132Provider },
-
- { kEoBBaseLevelGainStrings, kEoBBaseLevelGainStringsProvider },
- { kEoBBaseExperienceTable0, kEoBBaseExperienceTable0Provider },
- { kEoBBaseExperienceTable1, kEoBBaseExperienceTable1Provider },
- { kEoBBaseExperienceTable2, kEoBBaseExperienceTable2Provider },
- { kEoBBaseExperienceTable3, kEoBBaseExperienceTable3Provider },
- { kEoBBaseExperienceTable4, kEoBBaseExperienceTable4Provider },
-
- { kEoBBaseWllFlagPreset, kEoBBaseWllFlagPresetProvider },
- { kEoBBaseDscShapeCoords, kEoBBaseDscShapeCoordsProvider },
- { kEoBBaseDscDoorScaleOffs, kEoBBaseDscDoorScaleOffsProvider },
- { kEoBBaseDscDoorScaleMult1, kEoBBaseDscDoorScaleMult1Provider },
- { kEoBBaseDscDoorScaleMult2, kEoBBaseDscDoorScaleMult2Provider },
- { kEoBBaseDscDoorScaleMult3, kEoBBaseDscDoorScaleMult3Provider },
- { kEoBBaseDscDoorScaleMult4, kEoBBaseDscDoorScaleMult4Provider },
- { kEoBBaseDscDoorScaleMult5, kEoBBaseDscDoorScaleMult5Provider },
- { kEoBBaseDscDoorScaleMult6, kEoBBaseDscDoorScaleMult6Provider },
- { kEoBBaseDscDoorType5Offs, kEoBBaseDscDoorType5OffsProvider },
- { kEoBBaseDscDoorXE, kEoBBaseDscDoorXEProvider },
- { kEoBBaseDscDoorY1, kEoBBaseDscDoorY1Provider },
- { kEoBBaseDscDoorY3, kEoBBaseDscDoorY3Provider },
- { kEoBBaseDscDoorY4, kEoBBaseDscDoorY4Provider },
- { kEoBBaseDscDoorY5, kEoBBaseDscDoorY5Provider },
- { kEoBBaseDscDoorY6, kEoBBaseDscDoorY6Provider },
- { kEoBBaseDscDoorY7, kEoBBaseDscDoorY7Provider },
- { kEoBBaseDscDoorCoordsExt, kEoBBaseDscDoorCoordsExtProvider },
- { kEoBBaseDscItemPosIndex, kEoBBaseDscItemPosIndexProvider },
- { kEoBBaseDscItemShpX, kEoBBaseDscItemShpXProvider },
- { kEoBBaseDscItemPosUnk, kEoBBaseDscItemPosUnkProvider },
- { kEoBBaseDscItemTileIndex, kEoBBaseDscItemTileIndexProvider },
- { kEoBBaseDscItemShapeMap, kEoBBaseDscItemShapeMapProvider },
- { kEoBBaseDscTelptrShpCoords, kEoBBaseDscTelptrShpCoordsProvider },
-
- { kEoBBasePortalSeqData, kEoBBasePortalSeqDataProvider },
- { kEoBBaseManDef, kEoBBaseManDefProvider },
- { kEoBBaseManWord, kEoBBaseManWordProvider },
- { kEoBBaseManPrompt, kEoBBaseManPromptProvider },
-
- { kEoBBaseDscMonsterFrmOffsTbl1, kEoBBaseDscMonsterFrmOffsTbl1Provider },
- { kEoBBaseDscMonsterFrmOffsTbl2, kEoBBaseDscMonsterFrmOffsTbl2Provider },
-
- { kEoBBaseInvSlotX, kEoBBaseInvSlotXProvider },
- { kEoBBaseInvSlotY, kEoBBaseInvSlotYProvider },
- { kEoBBaseSlotValidationFlags, kEoBBaseSlotValidationFlagsProvider },
-
- { kEoBBaseProjectileWeaponTypes, kEoBBaseProjectileWeaponTypesProvider },
- { kEoBBaseWandTypes, kEoBBaseWandTypesProvider },
-
- { kEoBBaseDrawObjPosIndex, kEoBBaseDrawObjPosIndexProvider },
- { kEoBBaseFlightObjFlipIndex, kEoBBaseFlightObjFlipIndexProvider },
- { kEoBBaseFlightObjShpMap, kEoBBaseFlightObjShpMapProvider },
- { kEoBBaseFlightObjSclIndex, kEoBBaseFlightObjSclIndexProvider },
-
- { kEoBBaseBookNumbers, kEoBBaseBookNumbersProvider },
- { kEoBBaseMageSpellsList, kEoBBaseMageSpellsListProvider },
- { kEoBBaseClericSpellsList, kEoBBaseClericSpellsListProvider },
- { kEoBBaseSpellNames, kEoBBaseSpellNamesProvider },
- { kEoBBaseMagicStrings1, kEoBBaseMagicStrings1Provider },
- { kEoBBaseMagicStrings2, kEoBBaseMagicStrings2Provider },
- { kEoBBaseMagicStrings3, kEoBBaseMagicStrings3Provider },
- { kEoBBaseMagicStrings4, kEoBBaseMagicStrings4Provider },
- { kEoBBaseMagicStrings6, kEoBBaseMagicStrings6Provider },
- { kEoBBaseMagicStrings7, kEoBBaseMagicStrings7Provider },
- { kEoBBaseMagicStrings8, kEoBBaseMagicStrings8Provider },
-
- { kEoBBaseExpObjectTlMode, kEoBBaseExpObjectTlModeProvider },
- { kEoBBaseExpObjectTblIndex, kEoBBaseExpObjectTblIndexProvider },
- { kEoBBaseExpObjectShpStart, kEoBBaseExpObjectShpStartProvider },
- { kEoBBaseExpObjectTbl1, kEoBBaseExpObjectTbl1Provider },
- { kEoBBaseExpObjectTbl2, kEoBBaseExpObjectTbl2Provider },
- { kEoBBaseExpObjectTbl3, kEoBBaseExpObjectTbl3Provider },
- { kEoBBaseExpObjectY, kEoBBaseExpObjectYProvider },
-
- { kEoBBaseSparkDefSteps, kEoBBaseSparkDefStepsProvider },
- { kEoBBaseSparkDefSubSteps, kEoBBaseSparkDefSubStepsProvider },
- { kEoBBaseSparkDefShift, kEoBBaseSparkDefShiftProvider },
- { kEoBBaseSparkDefAdd, kEoBBaseSparkDefAddProvider },
- { kEoBBaseSparkDefX, kEoBBaseSparkDefXProvider },
- { kEoBBaseSparkDefY, kEoBBaseSparkDefYProvider },
- { kEoBBaseSparkOfFlags1, kEoBBaseSparkOfFlags1Provider },
- { kEoBBaseSparkOfFlags2, kEoBBaseSparkOfFlags2Provider },
- { kEoBBaseSparkOfShift, kEoBBaseSparkOfShiftProvider },
- { kEoBBaseSparkOfX, kEoBBaseSparkOfXProvider },
- { kEoBBaseSparkOfY, kEoBBaseSparkOfYProvider },
-
- { kEoBBaseSpellProperties, kEoBBaseSpellPropertiesProvider },
- { kEoBBaseMagicFlightProps, kEoBBaseMagicFlightPropsProvider },
- { kEoBBaseTurnUndeadEffect, kEoBBaseTurnUndeadEffectProvider },
- { kEoBBaseBurningHandsDest, kEoBBaseBurningHandsDestProvider },
- { kEoBBaseConeOfColdDest1, kEoBBaseConeOfColdDest1Provider },
- { kEoBBaseConeOfColdDest2, kEoBBaseConeOfColdDest2Provider },
- { kEoBBaseConeOfColdDest3, kEoBBaseConeOfColdDest3Provider },
- { kEoBBaseConeOfColdDest4, kEoBBaseConeOfColdDest4Provider },
- { kEoBBaseConeOfColdGfxTbl, kEoBBaseConeOfColdGfxTblProvider },
-
- { kEoB1MainMenuStrings, kEoB1MainMenuStringsProvider },
- { kEoB1BonusStrings, kEoB1BonusStringsProvider },
-
- { kEoB1IntroFilesOpening, kEoB1IntroFilesOpeningProvider },
- { kEoB1IntroFilesTower, kEoB1IntroFilesTowerProvider },
- { kEoB1IntroFilesOrb, kEoB1IntroFilesOrbProvider },
- { kEoB1IntroFilesWdEntry, kEoB1IntroFilesWdEntryProvider },
- { kEoB1IntroFilesKing, kEoB1IntroFilesKingProvider },
- { kEoB1IntroFilesHands, kEoB1IntroFilesHandsProvider },
- { kEoB1IntroFilesWdExit, kEoB1IntroFilesWdExitProvider },
- { kEoB1IntroFilesTunnel, kEoB1IntroFilesTunnelProvider },
- { kEoB1IntroOpeningFrmDelay, kEoB1IntroOpeningFrmDelayProvider },
- { kEoB1IntroWdEncodeX, kEoB1IntroWdEncodeXProvider },
- { kEoB1IntroWdEncodeY, kEoB1IntroWdEncodeYProvider },
- { kEoB1IntroWdEncodeWH, kEoB1IntroWdEncodeWHProvider },
- { kEoB1IntroWdDsX, kEoB1IntroWdDsXProvider },
- { kEoB1IntroWdDsY, kEoB1IntroWdDsYProvider },
- { kEoB1IntroTvlX1, kEoB1IntroTvlX1Provider },
- { kEoB1IntroTvlY1, kEoB1IntroTvlY1Provider },
- { kEoB1IntroTvlX2, kEoB1IntroTvlX2Provider },
- { kEoB1IntroTvlY2, kEoB1IntroTvlY2Provider },
- { kEoB1IntroTvlW, kEoB1IntroTvlWProvider },
- { kEoB1IntroTvlH, kEoB1IntroTvlHProvider },
-
- { kEoB1DoorShapeDefs, kEoB1DoorShapeDefsProvider },
- { kEoB1DoorSwitchShapeDefs, kEoB1DoorSwitchShapeDefsProvider },
- { kEoB1DoorSwitchCoords, kEoB1DoorSwitchCoordsProvider },
- { kEoB1MonsterProperties, kEoB1MonsterPropertiesProvider },
-
- { kEoB1EnemyMageSpellList, kEoB1EnemyMageSpellListProvider },
- { kEoB1EnemyMageSfx, kEoB1EnemyMageSfxProvider },
- { kEoB1BeholderSpellList, kEoB1BeholderSpellListProvider },
- { kEoB1BeholderSfx, kEoB1BeholderSfxProvider },
- { kEoB1TurnUndeadString, kEoB1TurnUndeadStringProvider },
-
- { kEoB1CgaMappingDefault, kEoB1CgaMappingDefaultProvider },
- { kEoB1CgaMappingAlt, kEoB1CgaMappingAltProvider },
- { kEoB1CgaMappingInv, kEoB1CgaMappingInvProvider },
- { kEoB1CgaMappingItemsL, kEoB1CgaMappingItemsLProvider },
- { kEoB1CgaMappingItemsS, kEoB1CgaMappingItemsSProvider },
- { kEoB1CgaMappingThrown, kEoB1CgaMappingThrownProvider },
- { kEoB1CgaMappingIcons, kEoB1CgaMappingIconsProvider },
- { kEoB1CgaMappingDeco, kEoB1CgaMappingDecoProvider },
- { kEoB1CgaLevelMappingIndex, kEoB1CgaLevelMappingIndexProvider },
- { kEoB1CgaMappingLevel0, kEoB1CgaMappingLevel0Provider },
- { kEoB1CgaMappingLevel1, kEoB1CgaMappingLevel1Provider },
- { kEoB1CgaMappingLevel2, kEoB1CgaMappingLevel2Provider },
- { kEoB1CgaMappingLevel3, kEoB1CgaMappingLevel3Provider },
- { kEoB1CgaMappingLevel4, kEoB1CgaMappingLevel4Provider },
-
- { kEoB1NpcShpData, kEoB1NpcShpDataProvider },
- { kEoB1NpcSubShpIndex1, kEoB1NpcSubShpIndex1Provider },
- { kEoB1NpcSubShpIndex2, kEoB1NpcSubShpIndex2Provider },
- { kEoB1NpcSubShpY, kEoB1NpcSubShpYProvider },
- { kEoB1Npc0Strings, kEoB1Npc0StringsProvider },
- { kEoB1Npc11Strings, kEoB1Npc11StringsProvider },
- { kEoB1Npc12Strings, kEoB1Npc12StringsProvider },
- { kEoB1Npc21Strings, kEoB1Npc21StringsProvider },
- { kEoB1Npc22Strings, kEoB1Npc22StringsProvider },
- { kEoB1Npc31Strings, kEoB1Npc31StringsProvider },
- { kEoB1Npc32Strings, kEoB1Npc32StringsProvider },
- { kEoB1Npc4Strings, kEoB1Npc4StringsProvider },
- { kEoB1Npc5Strings, kEoB1Npc5StringsProvider },
- { kEoB1Npc6Strings, kEoB1Npc6StringsProvider },
- { kEoB1Npc7Strings, kEoB1Npc7StringsProvider },
-
- { kEoB2MainMenuStrings, kEoB2MainMenuStringsProvider },
-
- { kEoB2TransferPortraitFrames, kEoB2TransferPortraitFramesProvider },
- { kEoB2TransferConvertTable, kEoB2TransferConvertTableProvider },
- { kEoB2TransferItemTable, kEoB2TransferItemTableProvider },
- { kEoB2TransferExpTable, kEoB2TransferExpTableProvider },
- { kEoB2TransferStrings1, kEoB2TransferStrings1Provider },
- { kEoB2TransferStrings2, kEoB2TransferStrings2Provider },
- { kEoB2TransferLabels, kEoB2TransferLabelsProvider },
-
- { kEoB2IntroStrings, kEoB2IntroStringsProvider },
- { kEoB2IntroCPSFiles, kEoB2IntroCPSFilesProvider },
- { kEob2IntroAnimData00, kEob2IntroAnimData00Provider },
- { kEob2IntroAnimData01, kEob2IntroAnimData01Provider },
- { kEob2IntroAnimData02, kEob2IntroAnimData02Provider },
- { kEob2IntroAnimData03, kEob2IntroAnimData03Provider },
- { kEob2IntroAnimData04, kEob2IntroAnimData04Provider },
- { kEob2IntroAnimData05, kEob2IntroAnimData05Provider },
- { kEob2IntroAnimData06, kEob2IntroAnimData06Provider },
- { kEob2IntroAnimData07, kEob2IntroAnimData07Provider },
- { kEob2IntroAnimData08, kEob2IntroAnimData08Provider },
- { kEob2IntroAnimData09, kEob2IntroAnimData09Provider },
- { kEob2IntroAnimData10, kEob2IntroAnimData10Provider },
- { kEob2IntroAnimData11, kEob2IntroAnimData11Provider },
- { kEob2IntroAnimData12, kEob2IntroAnimData12Provider },
- { kEob2IntroAnimData13, kEob2IntroAnimData13Provider },
- { kEob2IntroAnimData14, kEob2IntroAnimData14Provider },
- { kEob2IntroAnimData15, kEob2IntroAnimData15Provider },
- { kEob2IntroAnimData16, kEob2IntroAnimData16Provider },
- { kEob2IntroAnimData17, kEob2IntroAnimData17Provider },
- { kEob2IntroAnimData18, kEob2IntroAnimData18Provider },
- { kEob2IntroAnimData19, kEob2IntroAnimData19Provider },
- { kEob2IntroAnimData20, kEob2IntroAnimData20Provider },
- { kEob2IntroAnimData21, kEob2IntroAnimData21Provider },
- { kEob2IntroAnimData22, kEob2IntroAnimData22Provider },
- { kEob2IntroAnimData23, kEob2IntroAnimData23Provider },
- { kEob2IntroAnimData24, kEob2IntroAnimData24Provider },
- { kEob2IntroAnimData25, kEob2IntroAnimData25Provider },
- { kEob2IntroAnimData26, kEob2IntroAnimData26Provider },
- { kEob2IntroAnimData27, kEob2IntroAnimData27Provider },
- { kEob2IntroAnimData28, kEob2IntroAnimData28Provider },
- { kEob2IntroAnimData29, kEob2IntroAnimData29Provider },
- { kEob2IntroAnimData30, kEob2IntroAnimData30Provider },
- { kEob2IntroAnimData31, kEob2IntroAnimData31Provider },
- { kEob2IntroAnimData32, kEob2IntroAnimData32Provider },
- { kEob2IntroAnimData33, kEob2IntroAnimData33Provider },
- { kEob2IntroAnimData34, kEob2IntroAnimData34Provider },
- { kEob2IntroAnimData35, kEob2IntroAnimData35Provider },
- { kEob2IntroAnimData36, kEob2IntroAnimData36Provider },
- { kEob2IntroAnimData37, kEob2IntroAnimData37Provider },
- { kEob2IntroAnimData38, kEob2IntroAnimData38Provider },
- { kEob2IntroAnimData39, kEob2IntroAnimData39Provider },
- { kEob2IntroAnimData40, kEob2IntroAnimData40Provider },
- { kEob2IntroAnimData41, kEob2IntroAnimData41Provider },
- { kEob2IntroAnimData42, kEob2IntroAnimData42Provider },
- { kEob2IntroAnimData43, kEob2IntroAnimData43Provider },
- { kEoB2IntroShapes00, kEoB2IntroShapes00Provider },
- { kEoB2IntroShapes01, kEoB2IntroShapes01Provider },
- { kEoB2IntroShapes04, kEoB2IntroShapes04Provider },
- { kEoB2IntroShapes07, kEoB2IntroShapes07Provider },
-
- { kEoB2FinaleStrings, kEoB2FinaleStringsProvider },
- { kEoB2CreditsData, kEoB2CreditsDataProvider },
- { kEoB2FinaleCPSFiles, kEoB2FinaleCPSFilesProvider },
- { kEob2FinaleAnimData00, kEob2FinaleAnimData00Provider },
- { kEob2FinaleAnimData01, kEob2FinaleAnimData01Provider },
- { kEob2FinaleAnimData02, kEob2FinaleAnimData02Provider },
- { kEob2FinaleAnimData03, kEob2FinaleAnimData03Provider },
- { kEob2FinaleAnimData04, kEob2FinaleAnimData04Provider },
- { kEob2FinaleAnimData05, kEob2FinaleAnimData05Provider },
- { kEob2FinaleAnimData06, kEob2FinaleAnimData06Provider },
- { kEob2FinaleAnimData07, kEob2FinaleAnimData07Provider },
- { kEob2FinaleAnimData08, kEob2FinaleAnimData08Provider },
- { kEob2FinaleAnimData09, kEob2FinaleAnimData09Provider },
- { kEob2FinaleAnimData10, kEob2FinaleAnimData10Provider },
- { kEob2FinaleAnimData11, kEob2FinaleAnimData11Provider },
- { kEob2FinaleAnimData12, kEob2FinaleAnimData12Provider },
- { kEob2FinaleAnimData13, kEob2FinaleAnimData13Provider },
- { kEob2FinaleAnimData14, kEob2FinaleAnimData14Provider },
- { kEob2FinaleAnimData15, kEob2FinaleAnimData15Provider },
- { kEob2FinaleAnimData16, kEob2FinaleAnimData16Provider },
- { kEob2FinaleAnimData17, kEob2FinaleAnimData17Provider },
- { kEob2FinaleAnimData18, kEob2FinaleAnimData18Provider },
- { kEob2FinaleAnimData19, kEob2FinaleAnimData19Provider },
- { kEob2FinaleAnimData20, kEob2FinaleAnimData20Provider },
- { kEoB2FinaleShapes00, kEoB2FinaleShapes00Provider },
- { kEoB2FinaleShapes03, kEoB2FinaleShapes03Provider },
- { kEoB2FinaleShapes07, kEoB2FinaleShapes07Provider },
- { kEoB2FinaleShapes09, kEoB2FinaleShapes09Provider },
- { kEoB2FinaleShapes10, kEoB2FinaleShapes10Provider },
-
- { kEoB2NpcShapeData, kEoB2NpcShapeDataProvider },
- { kEoBBaseClassModifierFlags, kEoBBaseClassModifierFlagsProvider },
-
- { kEoBBaseMonsterStepTable01, kEoBBaseMonsterStepTable01Provider },
- { kEoBBaseMonsterStepTable02, kEoBBaseMonsterStepTable02Provider },
- { kEoBBaseMonsterStepTable1, kEoBBaseMonsterStepTable1Provider },
- { kEoBBaseMonsterStepTable2, kEoBBaseMonsterStepTable2Provider },
- { kEoBBaseMonsterStepTable3, kEoBBaseMonsterStepTable3Provider },
- { kEoBBaseMonsterCloseAttPosTable1, kEoBBaseMonsterCloseAttPosTable1Provider },
- { kEoBBaseMonsterCloseAttPosTable21, kEoBBaseMonsterCloseAttPosTable21Provider },
- { kEoBBaseMonsterCloseAttPosTable22, kEoBBaseMonsterCloseAttPosTable22Provider },
- { kEoBBaseMonsterCloseAttUnkTable, kEoBBaseMonsterCloseAttUnkTableProvider },
- { kEoBBaseMonsterCloseAttChkTable1, kEoBBaseMonsterCloseAttChkTable1Provider },
- { kEoBBaseMonsterCloseAttChkTable2, kEoBBaseMonsterCloseAttChkTable2Provider },
- { kEoBBaseMonsterCloseAttDstTable1, kEoBBaseMonsterCloseAttDstTable1Provider },
- { kEoBBaseMonsterCloseAttDstTable2, kEoBBaseMonsterCloseAttDstTable2Provider },
-
- { kEoBBaseMonsterProximityTable, kEoBBaseMonsterProximityTableProvider },
- { kEoBBaseFindBlockMonstersTable, kEoBBaseFindBlockMonstersTableProvider },
- { kEoBBaseMonsterDirChangeTable, kEoBBaseMonsterDirChangeTableProvider },
- { kEoBBaseMonsterDistAttStrings, kEoBBaseMonsterDistAttStringsProvider },
- { kEoBBaseEncodeMonsterDefs, kEoBBaseEncodeMonsterDefsProvider },
- { kEoBBaseNpcPresets, kEoBBaseNpcPresetsProvider },
- { kEoB2Npc1Strings, kEoB2Npc1StringsProvider },
- { kEoB2Npc2Strings, kEoB2Npc2StringsProvider },
- { kEoB2MonsterDustStrings, kEoB2MonsterDustStringsProvider },
- { kEoB2DreamSteps, kEoB2DreamStepsProvider },
- { kEoB2KheldranStrings, kEoB2KheldranStringsProvider },
- { kEoB2HornStrings, kEoB2HornStringsProvider },
- { kEoB2HornSounds, kEoB2HornSoundsProvider },
- { kEoB2WallOfForceDsX, kEoB2WallOfForceDsXProvider },
- { kEoB2WallOfForceDsY, kEoB2WallOfForceDsYProvider },
- { kEoB2WallOfForceNumW, kEoB2WallOfForceNumWProvider },
- { kEoB2WallOfForceNumH, kEoB2WallOfForceNumHProvider },
- { kEoB2WallOfForceShpId, kEoB2WallOfForceShpIdProvider },
-
- { kLoLIngamePakFiles, kLoLIngamePakFilesProvider },
- { kLoLCharacterDefs, kLoLCharacterDefsProvider },
- { kLoLIngameSfxFiles, kLoLIngameSfxFilesProvider },
- { kLoLIngameSfxIndex, kLoLIngameSfxIndexProvider },
- { kLoLMusicTrackMap, kLoLMusicTrackMapProvider },
- { kLoLIngameGMSfxIndex, kLoLIngameGMSfxIndexProvider },
- { kLoLIngameMT32SfxIndex, kLoLIngameMT32SfxIndexProvider },
- { kLoLIngamePcSpkSfxIndex, kLoLIngamePcSpkSfxIndexProvider },
- { kLoLSpellProperties, kLoLSpellPropertiesProvider },
- { kLoLGameShapeMap, kLoLGameShapeMapProvider },
- { kLoLSceneItemOffs, kLoLSceneItemOffsProvider },
- { kLoLCharInvIndex, kLoLCharInvIndexProvider },
- { kLoLCharInvDefs, kLoLCharInvDefsProvider },
- { kLoLCharDefsMan, kLoLCharDefsManProvider },
- { kLoLCharDefsWoman, kLoLCharDefsWomanProvider },
- { kLoLCharDefsKieran, kLoLCharDefsKieranProvider },
- { kLoLCharDefsAkshel, kLoLCharDefsAkshelProvider },
- { kLoLExpRequirements, kLoLExpRequirementsProvider },
- { kLoLMonsterModifiers1, kLoLMonsterModifiers1Provider },
- { kLoLMonsterModifiers2, kLoLMonsterModifiers2Provider },
- { kLoLMonsterModifiers3, kLoLMonsterModifiers3Provider },
- { kLoLMonsterModifiers4, kLoLMonsterModifiers4Provider },
- { kLoLMonsterShiftOffsets, kLoLMonsterShiftOffsetsProvider },
- { kLoLMonsterDirFlags, kLoLMonsterDirFlagsProvider },
- { kLoLMonsterScaleY, kLoLMonsterScaleYProvider },
- { kLoLMonsterScaleX, kLoLMonsterScaleXProvider },
- { kLoLMonsterScaleWH, kLoLMonsterScaleWHProvider },
- { kLoLFlyingObjectShp, kLoLFlyingObjectShpProvider },
- { kLoLInventoryDesc, kLoLInventoryDescProvider },
- { kLoLLevelShpList, kLoLLevelShpListProvider },
- { kLoLLevelDatList, kLoLLevelDatListProvider },
- { kLoLCompassDefs, kLoLCompassDefsProvider },
- { kLoLItemPrices, kLoLItemPricesProvider },
- { kLoLStashSetup, kLoLStashSetupProvider },
- { kLoLDscWalls, kLoLDscWallsProvider },
- { kRpgCommonDscShapeIndex, kRpgCommonDscShapeIndexProvider },
- { kLoLDscOvlMap, kLoLDscOvlMapProvider },
- { kLoLDscScaleWidthData, kLoLDscScaleWidthDataProvider },
- { kLoLDscScaleHeightData, kLoLDscScaleHeightDataProvider },
- { kRpgCommonDscX, kRpgCommonDscXProvider },
- { kLoLDscY, kLoLDscYProvider },
- { kRpgCommonDscTileIndex, kRpgCommonDscTileIndexProvider },
- { kRpgCommonDscUnk2, kRpgCommonDscUnk2Provider },
- { kRpgCommonDscDoorShapeIndex, kRpgCommonDscDoorShapeIndexProvider },
- { kRpgCommonDscDimData1, kRpgCommonDscDimData1Provider },
- { kRpgCommonDscDimData2, kRpgCommonDscDimData2Provider },
- { kRpgCommonDscBlockMap, kRpgCommonDscBlockMapProvider },
- { kRpgCommonDscDimMap, kRpgCommonDscDimMapProvider },
- { kLoLDscOvlIndex, kLoLDscOvlIndexProvider },
- { kRpgCommonDscBlockIndex, kRpgCommonDscBlockIndexProvider },
- { kRpgCommonDscDoorY2, kRpgCommonDscDoorY2Provider },
- { kRpgCommonDscDoorFrameY1, kRpgCommonDscDoorFrameY1Provider },
- { kRpgCommonDscDoorFrameY2, kRpgCommonDscDoorFrameY2Provider },
- { kRpgCommonDscDoorFrameIndex1, kRpgCommonDscDoorFrameIndex1Provider },
- { kRpgCommonDscDoorFrameIndex2, kRpgCommonDscDoorFrameIndex2Provider },
- { kLoLDscDoorScale, kLoLDscDoorScaleProvider },
- { kLoLDscDoor4, kLoLDscDoor4Provider },
- { kLoLDscDoorX, kLoLDscDoorXProvider },
- { kLoLDscDoorY, kLoLDscDoorYProvider },
- { kLoLScrollXTop, kLoLScrollXTopProvider },
- { kLoLScrollYTop, kLoLScrollYTopProvider },
- { kLoLScrollXBottom, kLoLScrollXBottomProvider },
- { kLoLScrollYBottom, kLoLScrollYBottomProvider },
- { kLoLButtonDefs, kLoLButtonDefsProvider },
- { kLoLButtonList1, kLoLButtonList1Provider },
- { kLoLButtonList2, kLoLButtonList2Provider },
- { kLoLButtonList3, kLoLButtonList3Provider },
- { kLoLButtonList4, kLoLButtonList4Provider },
- { kLoLButtonList5, kLoLButtonList5Provider },
- { kLoLButtonList6, kLoLButtonList6Provider },
- { kLoLButtonList7, kLoLButtonList7Provider },
- { kLoLButtonList8, kLoLButtonList8Provider },
- { kLoLLegendData, kLoLLegendDataProvider },
- { kLoLMapCursorOvl, kLoLMapCursorOvlProvider },
- { kLoLMapStringId, kLoLMapStringIdProvider },
- { kLoLSpellbookAnim, kLoLSpellbookAnimProvider },
- { kLoLSpellbookCoords, kLoLSpellbookCoordsProvider },
- { kLoLHealShapeFrames, kLoLHealShapeFramesProvider },
- { kLoLLightningDefs, kLoLLightningDefsProvider },
- { kLoLFireballCoords, kLoLFireballCoordsProvider },
- { kLoLCredits, kLoLCreditsProvider },
- { kLoLHistory, kLoLHistoryProvider },
- { -1, NULL }
-};
-
-} // end of anonymous namespace
-
-ExtractEntryList getProvidersForId(int id) {
- ExtractEntryList list;
-
- for (const ExtractEntry *p = extractProviders; p->id != -1; ++p) {
- if (p->id == id) {
- for (const ExtractEntrySearchData *d = p->providers; d->hint.size != 0; ++d)
- list.push_back(*d);
- }
- }
-
- return list;
-}
diff --git a/devtools/create_kyradat/types.cpp b/devtools/create_kyradat/types.cpp
new file mode 100644
index 0000000000..1f8430ab7f
--- /dev/null
+++ b/devtools/create_kyradat/types.cpp
@@ -0,0 +1,663 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public 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 "types.h"
+#include "pak.h"
+
+#include "common/endian.h"
+
+static void writeStringList(PAKFile &out, const char *filename, const StringListProvider *provider);
+static void writeRawData(PAKFile &out, const char *filename, const ByteProvider *provider);
+static void writeRoomList(PAKFile &out, const char *filename, const RoomProvider *provider);
+static void writeShapeList(PAKFile &out, const char *filename, const ShapeProvider *provider);
+static void writeAmigaSfxTable(PAKFile &out, const char *filename, const AmigaSfxTableProvider *provider);
+static void writeK2SeqData(PAKFile &out, const char *filename, const HoFSequenceProvider *provider);
+static void writeK2SeqItemAnimData(PAKFile &out, const char *filename, const HoFSeqItemAnimDataProvider *provider);
+static void writeK2ItemAnimDefinition(PAKFile &out, const char *filename, const ItemAnimDefinitionProvider *provider);
+static void writeLoLCharData(PAKFile &out, const char *filename, const LoLCharacterProvider *provider);
+static void writeLoLSpellData(PAKFile &out, const char *filename, const SpellPropertyProvider *provider);
+static void writeLoLCompassData(PAKFile &out, const char *filename, const CompassDefProvider *provider);
+static void writeLoLFlightShpData(PAKFile &out, const char *filename, const FlyingObjectShapeProvider *provider);
+static void writeLoLButtonData(PAKFile &out, const char *filename, const LoLButtonDefProvider *provider);
+static void writeRawDataBe16(PAKFile &out, const char *filename, const Uint16Provider *provider);
+static void writeRawDataBe32(PAKFile &out, const char *filename, const Uint32Provider *provider);
+static void writeEoB2SequenceData(PAKFile &out, const char *filename, const DarkMoonAnimCommandProvider *provider);
+static void writeEoB2ShapeData(PAKFile &out, const char *filename, const DarkMoonShapeDefProvider *provider);
+static void writeEoBNpcData(PAKFile &out, const char *filename, const EoBCharacterProvider *provider);
+
+void writeResource(PAKFile &out, const char *filename, ResTypes type, const void *provider) {
+ switch (type) {
+ case kStringList:
+ writeStringList(out, filename, (const StringListProvider *)provider);
+ break;
+
+ case kRawData:
+ writeRawData(out, filename, (const ByteProvider *)provider);
+ break;
+
+ case kRoomList:
+ writeRoomList(out, filename, (const RoomProvider *)provider);
+ break;
+
+ case kShapeList:
+ writeShapeList(out, filename, (const ShapeProvider *)provider);
+ break;
+
+ case kAmigaSfxTable:
+ writeAmigaSfxTable(out, filename, (const AmigaSfxTableProvider *)provider);
+ break;
+
+ case k2SeqData:
+ writeK2SeqData(out, filename, (const HoFSequenceProvider *)provider);
+ break;
+
+ case k2SeqItemAnimData:
+ writeK2SeqItemAnimData(out, filename, (const HoFSeqItemAnimDataProvider *)provider);
+ break;
+
+ case k2ItemAnimDefinition:
+ writeK2ItemAnimDefinition(out, filename, (const ItemAnimDefinitionProvider *)provider);
+ break;
+
+ case kLoLCharData:
+ writeLoLCharData(out, filename, (const LoLCharacterProvider *)provider);
+ break;
+
+ case kLoLSpellData:
+ writeLoLSpellData(out, filename, (const SpellPropertyProvider *)provider);
+ break;
+
+ case kLoLCompassData:
+ writeLoLCompassData(out, filename, (const CompassDefProvider *)provider);
+ break;
+
+ case kLoLFlightShpData:
+ writeLoLFlightShpData(out, filename, (const FlyingObjectShapeProvider *)provider);
+ break;
+
+ case kLoLButtonData:
+ writeLoLButtonData(out, filename, (const LoLButtonDefProvider *)provider);
+ break;
+
+ case kRawDataBe16:
+ writeRawDataBe16(out, filename, (const Uint16Provider *)provider);
+ break;
+
+ case kRawDataBe32:
+ writeRawDataBe32(out, filename, (const Uint32Provider *)provider);
+ break;
+
+ case kEoB2SequenceData:
+ writeEoB2SequenceData(out, filename, (const DarkMoonAnimCommandProvider *)provider);
+ break;
+
+ case kEoB2ShapeData:
+ writeEoB2ShapeData(out, filename, (const DarkMoonShapeDefProvider *)provider);
+ break;
+
+ case kEoBNpcData:
+ writeEoBNpcData(out, filename, (const EoBCharacterProvider *)provider);
+ break;
+ }
+}
+
+static void writeStringList(PAKFile &out, const char *filename, const StringListProvider *provider) {
+ // Step 1: Calculate size
+ size_t size = 4;
+ for (uint i = 0; i < provider->numEntries; ++i) {
+ size += strlen(provider->data[i]) + 1;
+ }
+
+ // Step 2: Write data
+ byte *const output = new byte[size];
+
+ byte *dst = output;
+ WRITE_BE_UINT32(dst, provider->numEntries); dst += 4;
+ for (uint i = 0; i < provider->numEntries; ++i) {
+ size_t num = strlen(provider->data[i]) + 1;
+ memcpy(dst, provider->data[i], num); dst += num;
+ }
+
+ // Step 3: Add data to output
+ out.addFile(filename, output, size);
+}
+
+static void writeRawData(PAKFile &out, const char *filename, const ByteProvider *provider) {
+ // Step 1: Calculate size
+ size_t size = provider->numEntries;
+
+ // Step 2: Write data
+ byte *const output = new byte[size];
+ memcpy(output, provider->data, size);
+
+ // Step 3: Add data to output
+ out.addFile(filename, output, size);
+}
+
+static void writeRoomList(PAKFile &out, const char *filename, const RoomProvider *provider) {
+ // Step 1: Calculate size
+ size_t size = 4 + 9 * provider->numEntries;
+
+ // Step 2: Write data
+ byte *const output = new byte[size];
+
+ byte *dst = output;
+ WRITE_BE_UINT32(dst, provider->numEntries); dst += 4;
+ for (uint i = 0; i < provider->numEntries; ++i) {
+ const Room &room = provider->data[i];
+
+ *dst = room.index; dst += 1;
+ WRITE_BE_UINT16(dst, room.north); dst += 2;
+ WRITE_BE_UINT16(dst, room.east); dst += 2;
+ WRITE_BE_UINT16(dst, room.south); dst += 2;
+ WRITE_BE_UINT16(dst, room.west); dst += 2;
+ }
+
+ // Step 3: Add data to output
+ out.addFile(filename, output, size);
+}
+
+static void writeShapeList(PAKFile &out, const char *filename, const ShapeProvider *provider) {
+ // Step 1: Calculate size
+ size_t size = 4 + 7 * provider->numEntries;
+
+ // Step 2: Write data
+ byte *const output = new byte[size];
+
+ byte *dst = output;
+ WRITE_BE_UINT32(dst, provider->numEntries); dst += 4;
+ for (uint i = 0; i < provider->numEntries; ++i) {
+ const Shape &shape = provider->data[i];
+
+ *dst = shape.imageIndex; dst += 1;
+ *dst = shape.x; dst += 1;
+ *dst = shape.y; dst += 1;
+ *dst = shape.w; dst += 1;
+ *dst = shape.h; dst += 1;
+ *dst = shape.xOffset; dst += 1;
+ *dst = shape.yOffset; dst += 1;
+ }
+
+ // Step 3: Add data to output
+ out.addFile(filename, output, size);
+}
+
+static void writeAmigaSfxTable(PAKFile &out, const char *filename, const AmigaSfxTableProvider *provider) {
+ // Step 1: Calculate size
+ size_t size = 4 + 6 * provider->numEntries;
+
+ // Step 2: Write data
+ byte *const output = new byte[size];
+
+ byte *dst = output;
+ WRITE_BE_UINT32(dst, provider->numEntries); dst += 4;
+ for (uint i = 0; i < provider->numEntries; ++i) {
+ const AmigaSfxTable &entry = provider->data[i];
+
+ *dst = entry.note; dst += 1;
+ *dst = entry.patch; dst += 1;
+ WRITE_BE_UINT16(dst, entry.duration); dst += 2;
+ *dst = entry.volume; dst += 1;
+ *dst = entry.pan; dst += 1;
+ }
+
+ // Step 3: Add data to output
+ out.addFile(filename, output, size);
+}
+
+static void writeK2SeqData(PAKFile &out, const char *filename, const HoFSequenceProvider *provider) {
+ // Step 1: Calculate size
+ size_t size = 4 + (2 + 48) * provider->numSequences + (2 + 32) * provider->numNestedSequences;
+
+ const size_t startSequenceOffset = 4 + 2 * provider->numSequences + 2 * provider->numNestedSequences;
+ const size_t startNestedSequences = startSequenceOffset + 48 * provider->numSequences;
+ const size_t startControlOffset = size;
+
+ for (uint i = 0; i < provider->numNestedSequences; ++i) {
+ if (provider->nestedSequences[i].numControls) {
+ size += 1 + 4 * provider->nestedSequences[i].numControls;
+ }
+ }
+
+ // Step 2: Write data
+ byte *const output = new byte[size];
+
+ byte *offsetTable = output;
+ byte *sequenceDst = output + startSequenceOffset;
+ byte *nestedDst = output + startNestedSequences;
+ byte *controlDst = output + startControlOffset;
+
+ // First write all sequences
+ WRITE_BE_UINT16(offsetTable, provider->numSequences); offsetTable += 2;
+ for (uint i = 0; i < provider->numSequences; ++i) {
+ const HoFSequence &entry = provider->sequences[i];
+
+ // Write location to the offset table
+ WRITE_BE_UINT16(offsetTable, sequenceDst - output); offsetTable += 2;
+
+ // Write actual sequence data
+ WRITE_BE_UINT16(sequenceDst, entry.flags); sequenceDst += 2;
+ memcpy(sequenceDst, entry.wsaFile, 14); sequenceDst += 14;
+ memcpy(sequenceDst, entry.cpsFile, 14); sequenceDst += 14;
+ *sequenceDst = entry.fadeInTransitionType; sequenceDst += 1;
+ *sequenceDst = entry.fadeOutTransitionType; sequenceDst += 1;
+ WRITE_BE_UINT16(sequenceDst, entry.stringIndex1); sequenceDst += 2;
+ WRITE_BE_UINT16(sequenceDst, entry.stringIndex2); sequenceDst += 2;
+ WRITE_BE_UINT16(sequenceDst, entry.startFrame); sequenceDst += 2;
+ WRITE_BE_UINT16(sequenceDst, entry.numFrames); sequenceDst += 2;
+ WRITE_BE_UINT16(sequenceDst, entry.duration); sequenceDst += 2;
+ WRITE_BE_UINT16(sequenceDst, entry.xPos); sequenceDst += 2;
+ WRITE_BE_UINT16(sequenceDst, entry.yPos); sequenceDst += 2;
+ WRITE_BE_UINT16(sequenceDst, entry.timeout); sequenceDst += 2;
+ }
+
+ assert(sequenceDst == nestedDst);
+
+ // Then write all nested sequences
+ WRITE_BE_UINT16(offsetTable, provider->numNestedSequences); offsetTable += 2;
+ for (uint i = 0; i < provider->numNestedSequences; ++i) {
+ const HoFNestedSequence &entry = provider->nestedSequences[i];
+
+ // Write location to the offset table
+ WRITE_BE_UINT16(offsetTable, nestedDst - output); offsetTable += 2;
+
+ // Write the nested sequence data
+ WRITE_BE_UINT16(nestedDst, entry.flags); nestedDst += 2;
+ memcpy(nestedDst, entry.wsaFile, 14); nestedDst += 14;
+ WRITE_BE_UINT16(nestedDst, entry.startFrame); nestedDst += 2;
+ WRITE_BE_UINT16(nestedDst, entry.endFrame); nestedDst += 2;
+ WRITE_BE_UINT16(nestedDst, entry.frameDelay); nestedDst += 2;
+ WRITE_BE_UINT16(nestedDst, entry.x); nestedDst += 2;
+ WRITE_BE_UINT16(nestedDst, entry.y); nestedDst += 2;
+
+ if (entry.numControls) {
+ WRITE_BE_UINT16(nestedDst, controlDst - output); nestedDst += 2;
+
+ *controlDst = entry.numControls; controlDst += 1;
+ for (uint j = 0; j < entry.numControls; ++j) {
+ WRITE_BE_UINT16(controlDst, entry.wsaControl[j].index); controlDst += 2;
+ WRITE_BE_UINT16(controlDst, entry.wsaControl[j].delay); controlDst += 2;
+ }
+ } else {
+ WRITE_BE_UINT16(nestedDst, 0); nestedDst += 2;
+ }
+
+ WRITE_BE_UINT16(nestedDst, entry.fadeInTransitionType); nestedDst += 2;
+ WRITE_BE_UINT16(nestedDst, entry.fadeOutTransitionType); nestedDst += 2;
+ }
+
+ assert(offsetTable == output + startSequenceOffset);
+ assert(nestedDst == output + startControlOffset);
+ assert(controlDst == output + size);
+
+ // Step 3: Add data to output
+ out.addFile(filename, output, size);
+}
+
+static void writeK2SeqItemAnimData(PAKFile &out, const char *filename, const HoFSeqItemAnimDataProvider *provider) {
+ // Step 1: Calculate size
+ size_t size = 1 + 44 * provider->numEntries;
+
+ // Step 2: Write data
+ byte *const output = new byte[size];
+
+ byte *dst = output;
+ *dst = provider->numEntries; dst += 1;
+ for (uint i = 0; i < provider->numEntries; ++i) {
+ const HoFSeqItemAnimData &entry = provider->data[i];
+
+ WRITE_BE_UINT16(dst, entry.itemIndex); dst += 2;
+ WRITE_BE_UINT16(dst, entry.y); dst += 2;
+
+ for (uint j = 0; j < 20; ++j) {
+ WRITE_BE_UINT16(dst, entry.frames[j]); dst += 2;
+ }
+ }
+
+ // Step 3: Add data to output
+ out.addFile(filename, output, size);
+}
+
+static void writeK2ItemAnimDefinition(PAKFile &out, const char *filename, const ItemAnimDefinitionProvider *provider) {
+ // Step 1: Calculate size
+ size_t size = 1 + 3 * provider->numEntries;
+
+ for (uint i = 0; i < provider->numEntries; ++i) {
+ size += provider->data[i].numFrames * 4;
+ }
+
+ // Step 2: Write data
+ byte *const output = new byte[size];
+
+ byte *dst = output;
+ *dst = provider->numEntries; dst += 1;
+ for (uint i = 0; i < provider->numEntries; ++i) {
+ const ItemAnimDefinition &entry = provider->data[i];
+
+ WRITE_BE_UINT16(dst, entry.itemIndex); dst += 2;
+ *dst = entry.numFrames; dst += 1;
+
+ for (uint j = 0; j < entry.numFrames; ++j) {
+ WRITE_BE_UINT16(dst, entry.frames[j].index); dst += 2;
+ WRITE_BE_UINT16(dst, entry.frames[j].delay); dst += 2;
+ }
+ }
+
+ // Step 3: Add data to output
+ out.addFile(filename, output, size);
+}
+
+static void writeLoLCharData(PAKFile &out, const char *filename, const LoLCharacterProvider *provider) {
+ // Step 1: Calculate size
+ size_t size = 130 * provider->numEntries;
+
+ // Step 2: Write data
+ byte *const output = new byte[size];
+
+ byte *dst = output;
+ for (uint i = 0; i < provider->numEntries; ++i) {
+ const LoLCharacter &entry = provider->data[i];
+
+ WRITE_LE_UINT16(dst, entry.flags); dst += 2;
+ memcpy(dst, entry.name, 11); dst += 11;
+ *dst = entry.raceClassSex; dst += 1;
+ WRITE_LE_UINT16(dst, entry.id); dst += 2;
+ *dst = entry.curFaceFrame; dst += 1;
+ *dst = entry.tempFaceFrame; dst += 1;
+ *dst = entry.screamSfx; dst += 1;
+ WRITE_BE_UINT32(dst, 0xDEADBEEF); dst += 4;
+ for (uint j = 0; j < 8; ++j) {
+ WRITE_LE_UINT16(dst, entry.itemsMight[j]); dst += 2;
+ }
+ for (uint j = 0; j < 8; ++j) {
+ WRITE_LE_UINT16(dst, entry.protectionAgainstItems[j]); dst += 2;
+ }
+ WRITE_LE_UINT16(dst, entry.itemProtection); dst += 2;
+ WRITE_LE_UINT16(dst, entry.hitPointsCur); dst += 2;
+ WRITE_LE_UINT16(dst, entry.hitPointsMax); dst += 2;
+ WRITE_LE_UINT16(dst, entry.magicPointsCur); dst += 2;
+ WRITE_LE_UINT16(dst, entry.magicPointsMax); dst += 2;
+ *dst = entry.field_41; dst += 1;
+ WRITE_LE_UINT16(dst, entry.damageSuffered); dst += 2;
+ WRITE_LE_UINT16(dst, entry.weaponHit); dst += 2;
+ WRITE_LE_UINT16(dst, entry.totalMightModifier); dst += 2;
+ WRITE_LE_UINT16(dst, entry.totalProtectionModifier); dst += 2;
+ WRITE_LE_UINT16(dst, entry.might); dst += 2;
+ WRITE_LE_UINT16(dst, entry.protection); dst += 2;
+ WRITE_LE_UINT16(dst, entry.nextAnimUpdateCountdown); dst += 2;
+ for (uint j = 0; j < 11; ++j) {
+ WRITE_LE_UINT16(dst, entry.items[j]); dst += 2;
+ }
+ for (uint j = 0; j < 3; ++j) {
+ *dst = entry.skillLevels[j]; dst += 1;
+ }
+ for (uint j = 0; j < 3; ++j) {
+ *dst = entry.skillModifiers[j]; dst += 1;
+ }
+ for (uint j = 0; j < 3; ++j) {
+ WRITE_LE_UINT32(dst, entry.experiencePts[j]); dst += 4;
+ }
+ for (uint j = 0; j < 5; ++j) {
+ *dst = entry.characterUpdateEvents[j]; dst += 1;
+ }
+ for (uint j = 0; j < 5; ++j) {
+ *dst = entry.characterUpdateDelay[j]; dst += 1;
+ }
+ }
+
+ // Step 3: Add data to output
+ out.addFile(filename, output, size);
+}
+
+static void writeLoLSpellData(PAKFile &out, const char *filename, const SpellPropertyProvider *provider) {
+ // Step 1: Calculate size
+ size_t size = 28 * provider->numEntries;
+
+ // Step 2: Write data
+ byte *const output = new byte[size];
+
+ byte *dst = output;
+ for (uint i = 0; i < provider->numEntries; ++i) {
+ const SpellProperty &entry = provider->data[i];
+
+ WRITE_LE_UINT16(dst, entry.spellNameCode); dst += 2;
+ for (uint j = 0; j < 4; ++j) {
+ WRITE_LE_UINT16(dst, entry.mpRequired[j]); dst += 2;
+ }
+ WRITE_LE_UINT16(dst, entry.field_a); dst += 2;
+ WRITE_LE_UINT16(dst, entry.field_c); dst += 2;
+ for (uint j = 0; j < 4; ++j) {
+ WRITE_LE_UINT16(dst, entry.hpRequired[j]); dst += 2;
+ }
+ WRITE_LE_UINT16(dst, entry.field_16); dst += 2;
+ WRITE_LE_UINT16(dst, entry.field_18); dst += 2;
+ WRITE_LE_UINT16(dst, entry.flags); dst += 2;
+ }
+
+ // Step 3: Add data to output
+ out.addFile(filename, output, size);
+}
+
+static void writeLoLCompassData(PAKFile &out, const char *filename, const CompassDefProvider *provider) {
+ // Step 1: Calculate size
+ size_t size = 4 * provider->numEntries;
+
+ // Step 2: Write data
+ byte *const output = new byte[size];
+
+ byte *dst = output;
+ for (uint i = 0; i < provider->numEntries; ++i) {
+ const CompassDef &entry = provider->data[i];
+
+ *dst = entry.shapeIndex; dst += 1;
+ *dst = entry.x; dst += 1;
+ *dst = entry.y; dst += 1;
+ *dst = entry.flags; dst += 1;
+ }
+
+ // Step 3: Add data to output
+ out.addFile(filename, output, size);
+}
+
+static void writeLoLFlightShpData(PAKFile &out, const char *filename, const FlyingObjectShapeProvider *provider) {
+ // Step 1: Calculate size
+ size_t size = 5 * provider->numEntries;
+
+ // Step 2: Write data
+ byte *const output = new byte[size];
+
+ byte *dst = output;
+ for (uint i = 0; i < provider->numEntries; ++i) {
+ const FlyingObjectShape &entry = provider->data[i];
+
+ *dst = entry.shapeFront; dst += 1;
+ *dst = entry.shapeBack; dst += 1;
+ *dst = entry.shapeLeft; dst += 1;
+ *dst = entry.drawFlags; dst += 1;
+ *dst = entry.flipFlags; dst += 1;
+ }
+
+ // Step 3: Add data to output
+ out.addFile(filename, output, size);
+}
+
+static void writeLoLButtonData(PAKFile &out, const char *filename, const LoLButtonDefProvider *provider) {
+ // Step 1: Calculate size
+ size_t size = 18 * provider->numEntries;
+
+ // Step 2: Write data
+ byte *const output = new byte[size];
+
+ byte *dst = output;
+ for (uint i = 0; i < provider->numEntries; ++i) {
+ const LoLButtonDef &entry = provider->data[i];
+
+ WRITE_BE_UINT16(dst, entry.buttonFlags); dst += 2;
+ WRITE_BE_UINT16(dst, entry.keyCode); dst += 2;
+ WRITE_BE_UINT16(dst, entry.keyCode2); dst += 2;
+ WRITE_BE_UINT16(dst, entry.x); dst += 2;
+ WRITE_BE_UINT16(dst, entry.y); dst += 2;
+ WRITE_BE_UINT16(dst, entry.w); dst += 2;
+ WRITE_BE_UINT16(dst, entry.h); dst += 2;
+ WRITE_BE_UINT16(dst, entry.index); dst += 2;
+ WRITE_BE_UINT16(dst, entry.screenDim); dst += 2;
+ }
+
+ // Step 3: Add data to output
+ out.addFile(filename, output, size);
+}
+
+static void writeRawDataBe16(PAKFile &out, const char *filename, const Uint16Provider *provider) {
+ // Step 1: Calculate size
+ size_t size = 2 * provider->numEntries;
+
+ // Step 2: Write data
+ byte *const output = new byte[size];
+
+ byte *dst = output;
+ for (uint i = 0; i < provider->numEntries; ++i) {
+ WRITE_BE_UINT16(dst, provider->data[i]); dst += 2;
+ }
+
+ // Step 3: Add data to output
+ out.addFile(filename, output, size);
+}
+
+static void writeRawDataBe32(PAKFile &out, const char *filename, const Uint32Provider *provider) {
+ // Step 1: Calculate size
+ size_t size = 4 * provider->numEntries;
+
+ // Step 2: Write data
+ byte *const output = new byte[size];
+
+ byte *dst = output;
+ for (uint i = 0; i < provider->numEntries; ++i) {
+ WRITE_BE_UINT32(dst, provider->data[i]); dst += 4;
+ }
+
+ // Step 3: Add data to output
+ out.addFile(filename, output, size);
+}
+
+static void writeEoB2SequenceData(PAKFile &out, const char *filename, const DarkMoonAnimCommandProvider *provider) {
+ // Step 1: Calculate size
+ size_t size = 11 * provider->numEntries;
+
+ // Step 2: Write data
+ byte *const output = new byte[size];
+
+ byte *dst = output;
+ for (uint i = 0; i < provider->numEntries; ++i) {
+ const DarkMoonAnimCommand &entry = provider->data[i];
+
+ *dst = entry.command; dst += 1;
+ *dst = entry.obj; dst += 1;
+ WRITE_BE_UINT16(dst, entry.x1); dst += 2;
+ *dst = entry.y1; dst += 1;
+ *dst = entry.delay; dst += 1;
+ *dst = entry.pal; dst += 1;
+ *dst = entry.x2; dst += 1;
+ *dst = entry.y2; dst += 1;
+ *dst = entry.w; dst += 1;
+ *dst = entry.h; dst += 1;
+ }
+
+ // Step 3: Add data to output
+ out.addFile(filename, output, size);
+}
+
+static void writeEoB2ShapeData(PAKFile &out, const char *filename, const DarkMoonShapeDefProvider *provider) {
+ // Step 1: Calculate size
+ size_t size = 6 * provider->numEntries;
+
+ // Step 2: Write data
+ byte *const output = new byte[size];
+
+ byte *dst = output;
+ for (uint i = 0; i < provider->numEntries; ++i) {
+ const DarkMoonShapeDef &entry = provider->data[i];
+
+ WRITE_BE_UINT16(dst, entry.index); dst += 2;
+ *dst = entry.x; dst += 1;
+ *dst = entry.y; dst += 1;
+ *dst = entry.w; dst += 1;
+ *dst = entry.h; dst += 1;
+ }
+
+ // Step 3: Add data to output
+ out.addFile(filename, output, size);
+}
+
+static void writeEoBNpcData(PAKFile &out, const char *filename, const EoBCharacterProvider *provider) {
+ // Step 1: Calculate size
+ size_t size = 2 + 111 * provider->numEntries;
+
+ // Step 2: Write data
+ byte *const output = new byte[size];
+
+ byte *dst = output;
+ WRITE_BE_UINT16(dst, provider->numEntries); dst += 2;
+ for (uint i = 0; i < provider->numEntries; ++i) {
+ const EoBCharacter &entry = provider->data[i];
+
+ *dst = entry.id; dst += 1;
+ *dst = entry.flags; dst += 1;
+ memcpy(dst, entry.name, 11); dst += 11;
+ *dst = entry.strengthCur; dst += 1;
+ *dst = entry.strengthMax; dst += 1;
+ *dst = entry.strengthExtCur; dst += 1;
+ *dst = entry.strengthExtMax; dst += 1;
+ *dst = entry.intelligenceCur; dst += 1;
+ *dst = entry.intelligenceMax; dst += 1;
+ *dst = entry.wisdomCur; dst += 1;
+ *dst = entry.wisdomMax; dst += 1;
+ *dst = entry.dexterityCur; dst += 1;
+ *dst = entry.dexterityMax; dst += 1;
+ *dst = entry.constitutionCur; dst += 1;
+ *dst = entry.constitutionMax; dst += 1;
+ *dst = entry.charismaCur; dst += 1;
+ *dst = entry.charismaMax; dst += 1;
+ WRITE_BE_UINT16(dst, entry.hitPointsCur); dst += 2;
+ WRITE_BE_UINT16(dst, entry.hitPointsMax); dst += 2;
+ *dst = entry.armorClass; dst += 1;
+ *dst = entry.disabledSlots; dst += 1;
+ *dst = entry.raceSex; dst += 1;
+ *dst = entry.cClass; dst += 1;
+ *dst = entry.alignment; dst += 1;
+ *dst = entry.portrait; dst += 1;
+ *dst = entry.food; dst += 1;
+ memcpy(dst, entry.level, 3); dst += 3;
+ WRITE_BE_UINT32(dst, entry.experience[0]); dst += 4;
+ WRITE_BE_UINT32(dst, entry.experience[1]); dst += 4;
+ WRITE_BE_UINT32(dst, entry.experience[2]); dst += 4;
+ WRITE_BE_UINT32(dst, entry.mageSpellsAvailableFlags); dst += 4;
+ for (uint j = 0; j < 27; ++j) {
+ WRITE_BE_UINT16(dst, entry.inventory[j]); dst += 2;
+ }
+ }
+
+ // Step 3: Add data to output
+ out.addFile(filename, output, size);
+}
diff --git a/devtools/create_kyradat/types.h b/devtools/create_kyradat/types.h
new file mode 100644
index 0000000000..bb97948a25
--- /dev/null
+++ b/devtools/create_kyradat/types.h
@@ -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.
+ *
+ */
+
+#ifndef CREATE_KYRADAT_TYPES_H
+#define CREATE_KYRADAT_TYPES_H
+
+#include "create_kyradat.h"
+
+struct Room {
+ byte index;
+ uint16 north, east, south, west;
+};
+
+struct Shape {
+ byte imageIndex;
+ byte x, y, w, h;
+ int8 xOffset, yOffset;
+};
+
+struct AmigaSfxTable {
+ byte note;
+ byte patch;
+ uint16 duration;
+ byte volume;
+ byte pan;
+};
+
+struct HoFSequence {
+ uint16 flags;
+ char wsaFile[14];
+ char cpsFile[14];
+ byte fadeInTransitionType;
+ byte fadeOutTransitionType;
+ uint16 stringIndex1;
+ uint16 stringIndex2;
+ uint16 startFrame;
+ uint16 numFrames;
+ uint16 duration;
+ uint16 xPos;
+ uint16 yPos;
+ uint16 timeout;
+};
+
+struct FrameControl {
+ uint16 index;
+ uint16 delay;
+};
+
+struct HoFNestedSequence {
+ uint16 flags;
+ char wsaFile[14];
+ uint16 startFrame;
+ uint16 endFrame;
+ uint16 frameDelay;
+ uint16 x;
+ uint16 y;
+ uint16 numControls;
+ const FrameControl *wsaControl;
+ uint16 fadeInTransitionType;
+ uint16 fadeOutTransitionType;
+};
+
+struct HoFSeqItemAnimData {
+ int16 itemIndex;
+ uint16 y;
+ uint16 frames[20];
+};
+
+struct ItemAnimDefinition {
+ int16 itemIndex;
+ byte numFrames;
+ const FrameControl *frames;
+};
+
+struct LoLCharacter {
+ uint16 flags;
+ char name[11];
+ byte raceClassSex;
+ int16 id;
+ byte curFaceFrame;
+ byte tempFaceFrame;
+ byte screamSfx;
+ /*uint32 unused;*/
+ uint16 itemsMight[8];
+ uint16 protectionAgainstItems[8];
+ uint16 itemProtection;
+ int16 hitPointsCur;
+ uint16 hitPointsMax;
+ int16 magicPointsCur;
+ uint16 magicPointsMax;
+ byte field_41;
+ uint16 damageSuffered;
+ uint16 weaponHit;
+ uint16 totalMightModifier;
+ uint16 totalProtectionModifier;
+ uint16 might;
+ uint16 protection;
+ int16 nextAnimUpdateCountdown;
+ uint16 items[11];
+ byte skillLevels[3];
+ byte skillModifiers[3];
+ uint32 experiencePts[3];
+ byte characterUpdateEvents[5];
+ byte characterUpdateDelay[5];
+};
+
+struct SpellProperty {
+ uint16 spellNameCode;
+ uint16 mpRequired[4];
+ uint16 field_a;
+ uint16 field_c;
+ uint16 hpRequired[4];
+ uint16 field_16;
+ uint16 field_18;
+ uint16 flags;
+};
+
+struct CompassDef {
+ byte shapeIndex;
+ int8 x, y;
+ byte flags;
+};
+
+struct FlyingObjectShape {
+ byte shapeFront;
+ byte shapeBack;
+ byte shapeLeft;
+ byte drawFlags;
+ byte flipFlags;
+};
+
+struct LoLButtonDef {
+ uint16 buttonFlags;
+ uint16 keyCode;
+ uint16 keyCode2;
+ int16 x, y;
+ uint16 w, h;
+ uint16 index;
+ uint16 screenDim;
+};
+
+struct DarkMoonAnimCommand {
+ byte command;
+ byte obj;
+ int16 x1;
+ byte y1;
+ byte delay;
+ byte pal;
+ byte x2, y2;
+ byte w, h;
+};
+
+struct DarkMoonShapeDef {
+ int16 index;
+ byte x, y, w, h;
+};
+
+struct EoBCharacter {
+ byte id;
+ byte flags;
+ char name[11];
+ int8 strengthCur, strengthMax;
+ int8 strengthExtCur, strengthExtMax;
+ int8 intelligenceCur, intelligenceMax;
+ int8 wisdomCur, wisdomMax;
+ int8 dexterityCur, dexterityMax;
+ int8 constitutionCur, constitutionMax;
+ int8 charismaCur, charismaMax;
+ int16 hitPointsCur, hitPointsMax;
+ int8 armorClass;
+ byte disabledSlots;
+ byte raceSex;
+ byte cClass;
+ byte alignment;
+ int8 portrait;
+ byte food;
+ byte level[3];
+ uint32 experience[3];
+ uint32 mageSpellsAvailableFlags;
+ uint16 inventory[27];
+};
+
+template<typename Type>
+struct ArrayProvider {
+ uint numEntries;
+ const Type *data;
+};
+
+typedef ArrayProvider<const char *> StringListProvider;
+typedef ArrayProvider<byte> ByteProvider;
+typedef ArrayProvider<Room> RoomProvider;
+typedef ArrayProvider<Shape> ShapeProvider;
+typedef ArrayProvider<AmigaSfxTable> AmigaSfxTableProvider;
+
+struct HoFSequenceProvider {
+ uint numSequences;
+ const HoFSequence *sequences;
+
+ uint numNestedSequences;
+ const HoFNestedSequence *nestedSequences;
+};
+
+typedef ArrayProvider<HoFSeqItemAnimData> HoFSeqItemAnimDataProvider;
+typedef ArrayProvider<ItemAnimDefinition> ItemAnimDefinitionProvider;
+typedef ArrayProvider<LoLCharacter> LoLCharacterProvider;
+typedef ArrayProvider<SpellProperty> SpellPropertyProvider;
+typedef ArrayProvider<CompassDef> CompassDefProvider;
+typedef ArrayProvider<FlyingObjectShape> FlyingObjectShapeProvider;
+typedef ArrayProvider<LoLButtonDef> LoLButtonDefProvider;
+typedef ArrayProvider<uint16> Uint16Provider;
+typedef ArrayProvider<uint32> Uint32Provider;
+typedef ArrayProvider<DarkMoonAnimCommand> DarkMoonAnimCommandProvider;
+typedef ArrayProvider<DarkMoonShapeDef> DarkMoonShapeDefProvider;
+typedef ArrayProvider<EoBCharacter> EoBCharacterProvider;
+
+class PAKFile;
+void writeResource(PAKFile &out, const char *filename, ResTypes type, const void *provider);
+
+#endif
diff --git a/devtools/create_kyradat/util.cpp b/devtools/create_kyradat/util.cpp
index 5ce8237b85..dd88d4ed85 100644
--- a/devtools/create_kyradat/util.cpp
+++ b/devtools/create_kyradat/util.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/devtools/create_kyradat/util.h b/devtools/create_kyradat/util.h
index a2783cca71..666386ea93 100644
--- a/devtools/create_kyradat/util.h
+++ b/devtools/create_kyradat/util.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/devtools/create_lure/create_lure_dat.cpp b/devtools/create_lure/create_lure_dat.cpp
index c53a6bf81d..0ac07c460d 100644
--- a/devtools/create_lure/create_lure_dat.cpp
+++ b/devtools/create_lure/create_lure_dat.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -1348,7 +1348,7 @@ const char *germanTextStrings[NUM_TEXT_ENTRIES] = {
"Abbrechen", "Schneller Text\x8b",
"Langsamer Text\x8b", "Sound an", "Sound aus", "(nichts)", " nach ", " an ", " f\x8cr ",
"und dann", "Schlu\x92", "Sicher (j/n)?",
- "Du tr\x8dgst", "niets", "und du hast ", "silberm\x8cnzen", "silberm\x8cnzen"
+ "Du tr\x8dgst ", "nichts.", "und du hast ", "silberm\x8cnzen", "silberm\x8cnzen",
"keinen ", "keine ", "kein ", "der ", "die ", "das ", "den ", "einen ", "eine ", "ein "
};
@@ -1359,7 +1359,7 @@ const char *spanishTextStrings[NUM_TEXT_ENTRIES] = {
"Cr\x7f" "ditos", "Reiniciar", "Salvar juego", "Recuperar jue", "Abandonar", "Texto r\x98pido\x8b",
"Texto lento \x8b", "Sonido activado ", "Sonido desactivado ", "(nada)", " con ", " a ", " con ",
"y luego", "eso es todo", "\x94" "Est\x98s seguro? (S/N)",
- "Llevas ", "nada", "y tienes ", "moneda", "monedas"
+ "Llevas ", "nada", "y tienes ", "moneda", "monedas",
"el ", "la ", "los ", "las ", "este ", "esta ", "estos ", "estas ", NULL, NULL
};
diff --git a/devtools/create_lure/create_lure_dat.h b/devtools/create_lure/create_lure_dat.h
index ad49878d43..ed713dd4f3 100644
--- a/devtools/create_lure/create_lure_dat.h
+++ b/devtools/create_lure/create_lure_dat.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/devtools/create_lure/process_actions.cpp b/devtools/create_lure/process_actions.cpp
index d1ddbf03f2..20d8e50aa5 100644
--- a/devtools/create_lure/process_actions.cpp
+++ b/devtools/create_lure/process_actions.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/devtools/create_mortdat/create_mortdat.cpp b/devtools/create_mortdat/create_mortdat.cpp
index 0065407daa..f6b2884005 100644
--- a/devtools/create_mortdat/create_mortdat.cpp
+++ b/devtools/create_mortdat/create_mortdat.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -210,7 +210,7 @@ void writeMenuData(const char *menuData, int languageId) {
outputFile.writeByte(languageId);
// Write each 8-characters block as a byte (one bit per character)
// ' ' -> 0, anything else -> 1
- byte value;
+ byte value = 0;
int valueCpt = 0;
const char* str = menuData;
while (*str != 0) {
diff --git a/devtools/create_mortdat/create_mortdat.h b/devtools/create_mortdat/create_mortdat.h
index e5007ae653..a4ce3999f4 100644
--- a/devtools/create_mortdat/create_mortdat.h
+++ b/devtools/create_mortdat/create_mortdat.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/devtools/create_mortdat/enginetext.h b/devtools/create_mortdat/enginetext.h
index e1c40f898b..a257ddd5a2 100644
--- a/devtools/create_mortdat/enginetext.h
+++ b/devtools/create_mortdat/enginetext.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/devtools/create_mortdat/gametext.h b/devtools/create_mortdat/gametext.h
index 4f7b1f9776..7a83448bad 100644
--- a/devtools/create_mortdat/gametext.h
+++ b/devtools/create_mortdat/gametext.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/devtools/create_mortdat/menudata.h b/devtools/create_mortdat/menudata.h
index ec8724135c..2290666ffe 100644
--- a/devtools/create_mortdat/menudata.h
+++ b/devtools/create_mortdat/menudata.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/devtools/create_neverhood/create_neverhood.cpp b/devtools/create_neverhood/create_neverhood.cpp
index a37ff99ca9..fb2912f722 100644
--- a/devtools/create_neverhood/create_neverhood.cpp
+++ b/devtools/create_neverhood/create_neverhood.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -467,7 +467,15 @@ public:
std::vector<LISTCLASS*> lists;
void add(LISTCLASS *list) {
- lists.push_back(list);
+ bool doAppend = true;
+ for (typename std::vector<LISTCLASS*>::iterator it = lists.begin(); it != lists.end(); it++) {
+ if ((*it)->id == list->id) {
+ doAppend = false;
+ break;
+ }
+ }
+ if (doAppend)
+ lists.push_back(list);
}
void loadListVector(const uint32 *offsets) {
@@ -475,7 +483,6 @@ public:
LISTCLASS *list = new LISTCLASS();
list->loadList(offsets[i], offsets[i + 1]);
bool doAppend = true;
- // Bad
for (typename std::vector<LISTCLASS*>::iterator it = lists.begin(); it != lists.end(); it++) {
if ((*it)->id == list->id) {
doAppend = false;
diff --git a/devtools/create_neverhood/create_neverhood.h b/devtools/create_neverhood/create_neverhood.h
index 6382c87375..205936601d 100644
--- a/devtools/create_neverhood/create_neverhood.h
+++ b/devtools/create_neverhood/create_neverhood.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/devtools/create_neverhood/md5.cpp b/devtools/create_neverhood/md5.cpp
index 50f7406a47..0477002654 100644
--- a/devtools/create_neverhood/md5.cpp
+++ b/devtools/create_neverhood/md5.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/devtools/create_neverhood/md5.h b/devtools/create_neverhood/md5.h
index 81bc03ff83..bf81d5ae1b 100644
--- a/devtools/create_neverhood/md5.h
+++ b/devtools/create_neverhood/md5.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/devtools/create_neverhood/tables.h b/devtools/create_neverhood/tables.h
index eb136491db..edcecc5d8d 100644
--- a/devtools/create_neverhood/tables.h
+++ b/devtools/create_neverhood/tables.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -45,7 +45,6 @@ static const uint32 rectListOffsets[] = {
// Scene1002
3, 0x004B43A0,
1, 0x004B4418,
- 3, 0x004B43A0,
// Scene1004
1, 0x004B7C70,
// Scene1109
diff --git a/devtools/create_neverhood/util.cpp b/devtools/create_neverhood/util.cpp
index 5ce8237b85..dd88d4ed85 100644
--- a/devtools/create_neverhood/util.cpp
+++ b/devtools/create_neverhood/util.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/devtools/create_neverhood/util.h b/devtools/create_neverhood/util.h
index a2783cca71..666386ea93 100644
--- a/devtools/create_neverhood/util.h
+++ b/devtools/create_neverhood/util.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/devtools/create_project/codeblocks.cpp b/devtools/create_project/codeblocks.cpp
index ec003df2d5..442a2b0025 100644
--- a/devtools/create_project/codeblocks.cpp
+++ b/devtools/create_project/codeblocks.cpp
@@ -120,6 +120,7 @@ void CodeBlocksProvider::createProjectFile(const std::string &name, const std::s
"\t\t\t\t\t<Add directory=\"..\\..\\engines\" />\n"
"\t\t\t\t\t<Add directory=\"..\\..\\common\" />\n"
"\t\t\t\t\t<Add directory=\"..\\..\" />\n"
+ "\t\t\t\t\t<Add directory=\".\\\" />\n"
"\t\t\t\t</Compiler>\n";
//////////////////////////////////////////////////////////////////////////
diff --git a/devtools/create_project/config.h b/devtools/create_project/config.h
index 1a66edff93..63bf3dee26 100644
--- a/devtools/create_project/config.h
+++ b/devtools/create_project/config.h
@@ -27,11 +27,12 @@
#define PROJECT_NAME "scummvm" // Used for folders, icons, resources and project/solution name
#define LIBS_DEFINE "SCUMMVM_LIBS" // Name of the include environment variable
#define REVISION_DEFINE "SCUMMVM_INTERNAL_REVISION"
+#define FIRST_ENGINE "scumm" // Name of the engine which should be sorted as first element
#define ENABLE_LANGUAGE_EXTENSIONS "" // Comma separated list of projects that need language extensions
#define DISABLE_EDIT_AND_CONTINUE "tinsel,tony,scummvm" // Comma separated list of projects that need Edit&Continue to be disabled for co-routine support (the main project is automatically added)
//#define ADDITIONAL_LIBRARY "" // Add a single library to the list of externally linked libraries
-#define NEEDS_RTTI 0 // Enable RTTI globally
+#define NEEDS_RTTI 1 // Enable RTTI globally
#endif // TOOLS_CREATE_PROJECT_CONFIG_H
diff --git a/devtools/create_project/create_project.cpp b/devtools/create_project/create_project.cpp
index e013377241..876c116b5c 100644
--- a/devtools/create_project/create_project.cpp
+++ b/devtools/create_project/create_project.cpp
@@ -43,6 +43,7 @@
#include <stack>
#include <algorithm>
#include <iomanip>
+#include <iterator>
#include <cstring>
#include <cstdlib>
@@ -59,6 +60,7 @@
#include <sys/param.h>
#include <sys/stat.h>
#include <dirent.h>
+#include <errno.h>
#endif
namespace {
@@ -81,22 +83,6 @@ std::string unifyPath(const std::string &path);
* @param exe Name of the executable.
*/
void displayHelp(const char *exe);
-
-/**
- * Structure for describing an FSNode. This is a very minimalistic
- * description, which includes everything we need.
- * It only contains the name of the node and whether it is a directory
- * or not.
- */
-struct FSNode {
- FSNode() : name(), isDirectory(false) {}
- FSNode(const std::string &n, bool iD) : name(n), isDirectory(iD) {}
-
- std::string name; ///< Name of the file system node
- bool isDirectory; ///< Whether it is a directory or not
-};
-
-typedef std::list<FSNode> FileList;
} // End of anonymous namespace
enum ProjectType {
@@ -128,7 +114,7 @@ int main(int argc, char *argv[]) {
setup.filePrefix = setup.srcDir;
setup.outputDir = '.';
- setup.engines = parseConfigure(setup.srcDir);
+ setup.engines = parseEngines(setup.srcDir);
if (setup.engines.empty()) {
std::cout << "WARNING: No engines found in configure file or configure file missing in \"" << setup.srcDir << "\"\n";
@@ -672,47 +658,70 @@ void displayHelp(const char *exe) {
}
/**
- * Try to parse a given line and create an engine definition
- * out of the result.
+ * Parse the configure.engine file of a given engine directory and return a
+ * list of all defined engines.
*
- * This may take *any* input line, when the line is not used
- * to define an engine the result of the function will be "false".
+ * @param engineDir The directory of the engine.
+ * @return The list of all defined engines.
+ */
+EngineDescList parseEngineConfigure(const std::string &engineDir);
+
+/**
+ * Compares two FSNode entries in a strict-weak fashion based on the name.
*
- * Note that the contents of "engine" are undefined, when this
- * function returns "false".
+ * @param left The first operand.
+ * @param right The second operand.
+ * @return "true" when the name of the left operand is strictly smaller than
+ * the name of the second operand. "false" otherwise.
+ */
+bool compareFSNode(const CreateProjectTool::FSNode &left, const CreateProjectTool::FSNode &right);
+
+#ifdef FIRST_ENGINE
+/**
+ * Compares two FSNode entries in a strict-weak fashion based on engine name
+ * order.
*
- * @param line Text input line.
- * @param engine Reference to an object, where the engine information
- * is to be stored in.
- * @return "true", when parsing succeeded, "false" otherwise.
+ * @param left The first operand.
+ * @param right The second operand.
+ * @return "true" when the name of the left operand is strictly smaller than
+ * the name of the second operand. "false" otherwise.
*/
-bool parseEngine(const std::string &line, EngineDesc &engine);
+bool compareEngineNames(const CreateProjectTool::FSNode &left, const CreateProjectTool::FSNode &right);
+#endif
} // End of anonymous namespace
-EngineDescList parseConfigure(const std::string &srcDir) {
- std::string configureFile = srcDir + "/engines/configure.engines";
+EngineDescList parseEngines(const std::string &srcDir) {
+ using CreateProjectTool::FileList;
+ using CreateProjectTool::listDirectory;
- std::ifstream configure(configureFile.c_str());
- if (!configure)
- return EngineDescList();
+ EngineDescList engineList;
- std::string line;
- EngineDescList engines;
+ FileList engineFiles = listDirectory(srcDir + "/engines/");
- for (;;) {
- std::getline(configure, line);
- if (configure.eof())
- break;
+#ifdef FIRST_ENGINE
+ // In case we want to sort an engine to the front of the list we will
+ // use some manual sorting predicate which assures that.
+ engineFiles.sort(&compareEngineNames);
+#else
+ // Otherwise, we simply sort the file list alphabetically this allows
+ // for a nicer order in --list-engines output, for example.
+ engineFiles.sort(&compareFSNode);
+#endif
- if (configure.fail())
- error("Failed while reading from " + configureFile);
+ for (FileList::const_iterator i = engineFiles.begin(), end = engineFiles.end(); i != end; ++i) {
+ // Each engine requires its own sub directory thus we will skip all
+ // non directory file nodes here.
+ if (!i->isDirectory) {
+ continue;
+ }
- EngineDesc desc;
- if (parseEngine(line, desc))
- engines.push_back(desc);
+ // Retrieve all engines defined in this sub directory and add them to
+ // the list of all engines.
+ EngineDescList list = parseEngineConfigure(srcDir + "/engines/" + i->name);
+ engineList.splice(engineList.end(), list);
}
- return engines;
+ return engineList;
}
bool isSubEngine(const std::string &name, const EngineDescList &engines) {
@@ -777,6 +786,21 @@ StringList getEngineDefines(const EngineDescList &engines) {
}
namespace {
+/**
+ * Try to parse a given line and create an engine definition
+ * out of the result.
+ *
+ * This may take *any* input line, when the line is not used
+ * to define an engine the result of the function will be "false".
+ *
+ * Note that the contents of "engine" are undefined, when this
+ * function returns "false".
+ *
+ * @param line Text input line.
+ * @param engine Reference to an object, where the engine information
+ * is to be stored in.
+ * @return "true", when parsing succeeded, "false" otherwise.
+ */
bool parseEngine(const std::string &line, EngineDesc &engine) {
// Format:
// add_engine engine_name "Readable Description" enable_default ["SubEngineList"]
@@ -799,6 +823,48 @@ bool parseEngine(const std::string &line, EngineDesc &engine) {
return true;
}
+
+EngineDescList parseEngineConfigure(const std::string &engineDir) {
+ std::string configureFile = engineDir + "/configure.engine";
+
+ std::ifstream configure(configureFile.c_str());
+ if (!configure)
+ return EngineDescList();
+
+ std::string line;
+ EngineDescList engines;
+
+ for (;;) {
+ std::getline(configure, line);
+ if (configure.eof())
+ break;
+
+ if (configure.fail())
+ error("Failed while reading from " + configureFile);
+
+ EngineDesc desc;
+ if (parseEngine(line, desc))
+ engines.push_back(desc);
+ }
+
+ return engines;
+}
+
+bool compareFSNode(const CreateProjectTool::FSNode &left, const CreateProjectTool::FSNode &right) {
+ return left.name < right.name;
+}
+
+#ifdef FIRST_ENGINE
+bool compareEngineNames(const CreateProjectTool::FSNode &left, const CreateProjectTool::FSNode &right) {
+ if (left.name == FIRST_ENGINE) {
+ return right.name != FIRST_ENGINE;
+ } else if (right.name == FIRST_ENGINE) {
+ return false;
+ } else {
+ return compareFSNode(left, right);
+ }
+}
+#endif
} // End of anonymous namespace
TokenList tokenize(const std::string &input, char separator) {
@@ -1048,13 +1114,6 @@ bool compareNodes(const FileNode *l, const FileNode *r) {
}
}
-/**
- * Returns a list of all files and directories in the specified
- * path.
- *
- * @param dir Directory which should be listed.
- * @return List of all children.
- */
FileList listDirectory(const std::string &dir) {
FileList result;
#ifdef USE_WIN32_API
@@ -1095,6 +1154,32 @@ FileList listDirectory(const std::string &dir) {
return result;
}
+void createDirectory(const std::string &dir) {
+#if defined(_WIN32) || defined(WIN32)
+ if (!CreateDirectory(dir.c_str(), NULL)) {
+ if (GetLastError() != ERROR_ALREADY_EXISTS) {
+ error("Could not create folder \"" + dir + "\"");
+ }
+ }
+#else
+ if (mkdir(dir.c_str(), 0777) == -1) {
+ if (errno == EEXIST) {
+ // Try to open as a folder (might be a file / symbolic link)
+ DIR *dirp = opendir(dir.c_str());
+ if (dirp == NULL) {
+ error("Could not create folder \"" + dir + "\"");
+ } else {
+ // The folder exists, just close the stream and return
+ closedir(dirp);
+ }
+ } else {
+ error("Could not create folder \"" + dir + "\"");
+ }
+ }
+#endif
+
+}
+
/**
* Scans the specified directory against files, which should be included
* in the project files. It will not include files present in the exclude list.
@@ -1220,6 +1305,7 @@ void ProjectProvider::createProject(BuildSetup &setup) {
createModuleList(setup.srcDir + "/audio", setup.defines, setup.testDirs, in, ex);
createModuleList(setup.srcDir + "/audio/softsynth/mt32", setup.defines, setup.testDirs, in, ex);
createModuleList(setup.srcDir + "/video", setup.defines, setup.testDirs, in, ex);
+ createModuleList(setup.srcDir + "/image", setup.defines, setup.testDirs, in, ex);
// Resource files
in.push_back(setup.srcDir + "/icons/" + setup.projectName + ".ico");
@@ -1242,6 +1328,12 @@ void ProjectProvider::createProject(BuildSetup &setup) {
// Create other misc. build files
createOtherBuildFiles(setup);
+
+ // In case we create the main ScummVM project files we will need to
+ // generate engines/plugins_table.h too.
+ if (!setup.tests && !setup.devTools) {
+ createEnginePluginsTable(setup);
+ }
}
ProjectProvider::UUIDMap ProjectProvider::createUUIDMap(const BuildSetup &setup) const {
@@ -1569,6 +1661,37 @@ void ProjectProvider::createModuleList(const std::string &moduleDir, const Strin
error("Malformed file " + moduleMkFile);
}
+void ProjectProvider::createEnginePluginsTable(const BuildSetup &setup) {
+ // First we need to create the "engines" directory.
+ createDirectory(setup.outputDir + "/engines");
+
+ // Then, we can generate the actual "plugins_table.h" file.
+ const std::string enginePluginsTableFile = setup.outputDir + "/engines/plugins_table.h";
+ std::ofstream enginePluginsTable(enginePluginsTableFile.c_str());
+ if (!enginePluginsTable) {
+ error("Could not open \"" + enginePluginsTableFile + "\" for writing");
+ }
+
+ enginePluginsTable << "/* This file is automatically generated by create_project */\n"
+ << "/* DO NOT EDIT MANUALLY */\n"
+ << "// This file is being included by \"base/plugins.cpp\"\n";
+
+ for (EngineDescList::const_iterator i = setup.engines.begin(), end = setup.engines.end(); i != end; ++i) {
+ // We ignore all sub engines here because they require no special
+ // handling.
+ if (isSubEngine(i->name, setup.engines)) {
+ continue;
+ }
+
+ // Make the engine name all uppercase.
+ std::string engineName;
+ std::transform(i->name.begin(), i->name.end(), std::back_inserter(engineName), toupper);
+
+ enginePluginsTable << "#if PLUGIN_ENABLED_STATIC(" << engineName << ")\n"
+ << "LINK_PLUGIN(" << engineName << ")\n"
+ << "#endif\n";
+ }
+}
} // End of anonymous namespace
void error(const std::string &message) {
diff --git a/devtools/create_project/create_project.h b/devtools/create_project/create_project.h
index 2f27cc2f61..459342a67d 100644
--- a/devtools/create_project/create_project.h
+++ b/devtools/create_project/create_project.h
@@ -102,16 +102,17 @@ struct EngineDesc {
typedef std::list<EngineDesc> EngineDescList;
/**
- * This function parses the project configure file and creates a list
- * of available engines.
+ * This function parses the project directory and creates a list of
+ * available engines.
*
* It will also automatically setup the default build state (enabled
- * or disabled) to the state specified in the "configure" file.
+ * or disabled) to the state specified in the individual configure.engine
+ * files.
*
* @param srcDir Path to the root of the project source.
* @return List of available engines.
*/
-EngineDescList parseConfigure(const std::string &srcDir);
+EngineDescList parseEngines(const std::string &srcDir);
/**
* Checks whether the specified engine is a sub engine. To determine this
@@ -263,6 +264,22 @@ void NORETURN_PRE error(const std::string &message) NORETURN_POST;
namespace CreateProjectTool {
/**
+ * Structure for describing an FSNode. This is a very minimalistic
+ * description, which includes everything we need.
+ * It only contains the name of the node and whether it is a directory
+ * or not.
+ */
+struct FSNode {
+ FSNode() : name(), isDirectory(false) {}
+ FSNode(const std::string &n, bool iD) : name(n), isDirectory(iD) {}
+
+ std::string name; ///< Name of the file system node
+ bool isDirectory; ///< Whether it is a directory or not
+};
+
+typedef std::list<FSNode> FileList;
+
+/**
* Gets a proper sequence of \t characters for the given
* indentation level.
*
@@ -315,6 +332,22 @@ bool producesObjectFile(const std::string &fileName);
std::string toString(int num);
/**
+ * Returns a list of all files and directories in the specified
+ * path.
+ *
+ * @param dir Directory which should be listed.
+ * @return List of all children.
+ */
+FileList listDirectory(const std::string &dir);
+
+/**
+ * Create a directory at the given path.
+ *
+ * @param dir The path to create.
+ */
+void createDirectory(const std::string &dir);
+
+/**
* Structure representing a file tree. This contains two
* members: name and children. "name" holds the name of
* the node. "children" does contain all the node's children.
@@ -474,6 +507,15 @@ protected:
* @return A new UUID as string.
*/
std::string createUUID() const;
+
+private:
+ /**
+ * This creates the engines/plugins_table.h file required for building
+ * ScummVM.
+ *
+ * @param setup Description of the desired build.
+ */
+ void createEnginePluginsTable(const BuildSetup &setup);
};
} // End of CreateProjectTool namespace
diff --git a/devtools/create_project/msbuild.cpp b/devtools/create_project/msbuild.cpp
index 0d68b2e9c9..018a04370f 100644
--- a/devtools/create_project/msbuild.cpp
+++ b/devtools/create_project/msbuild.cpp
@@ -360,7 +360,7 @@ void MSBuildProvider::outputGlobalPropFile(const BuildSetup &setup, std::ofstrea
"\t\t<ClCompile>\n"
"\t\t\t<DisableLanguageExtensions>true</DisableLanguageExtensions>\n"
"\t\t\t<DisableSpecificWarnings>" << warnings << ";%(DisableSpecificWarnings)</DisableSpecificWarnings>\n"
- "\t\t\t<AdditionalIncludeDirectories>$(" << LIBS_DEFINE << ")\\include;" << prefix << ";" << prefix << "\\engines;" << (setup.tests ? prefix + "\\test\\cxxtest;" : "") << "$(TargetDir);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\n"
+ "\t\t\t<AdditionalIncludeDirectories>$(" << LIBS_DEFINE << ")\\include;.;" << prefix << ";" << prefix << "\\engines;" << (setup.tests ? prefix + "\\test\\cxxtest;" : "") << "$(TargetDir);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\n"
"\t\t\t<PreprocessorDefinitions>" << definesList << "%(PreprocessorDefinitions)</PreprocessorDefinitions>\n"
"\t\t\t<ExceptionHandling>" << ((setup.devTools || setup.tests) ? "Sync" : "") << "</ExceptionHandling>\n";
@@ -434,8 +434,11 @@ void MSBuildProvider::createBuildProp(const BuildSetup &setup, bool isRelease, b
"\t\t\t<DebugInformationFormat>" << (isWin32 ? "EditAndContinue" : "ProgramDatabase") << "</DebugInformationFormat>\n" // For x64 format Edit and continue is not supported, thus we default to Program Database
"\t\t\t<EnablePREfast>" << (configuration == "Analysis" ? "true" : "false") << "</EnablePREfast>\n";
- if (configuration == "LLVM")
- properties << "\t\t\t<AdditionalOptions>-Wno-microsoft -Wno-long-long -Wno-multichar -Wno-unknown-pragmas -Wno-reorder -Wpointer-arith -Wcast-qual -Wshadow -Wnon-virtual-dtor -Wwrite-strings -Wno-conversion -Wno-shorten-64-to-32 -Wno-sign-compare -Wno-four-char-constants -Wno-nested-anon-types %(AdditionalOptions)</AdditionalOptions>\n";
+ if (configuration == "LLVM") {
+ // FIXME The LLVM cl wrapper does not seem to work properly with the $(TargetDir) path so we hard-code the build folder until the issue is resolved
+ properties << "\t\t\t<AdditionalIncludeDirectories>" << configuration << outputBitness <<";%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\n"
+ "\t\t\t<AdditionalOptions>-Wno-microsoft -Wno-long-long -Wno-multichar -Wno-unknown-pragmas -Wno-reorder -Wpointer-arith -Wcast-qual -Wshadow -Wnon-virtual-dtor -Wwrite-strings -Wno-conversion -Wno-shorten-64-to-32 -Wno-sign-compare -Wno-four-char-constants -Wno-nested-anon-types -Qunused-arguments %(AdditionalOptions)</AdditionalOptions>\n";
+ }
properties << "\t\t</ClCompile>\n"
"\t\t<Link>\n"
@@ -521,6 +524,7 @@ void MSBuildProvider::writeFileListToProject(const FileNode &dir, std::ofstream
outputNasmCommand(projectFile, "Debug", (isDuplicate ? (*entry).prefix : ""));
outputNasmCommand(projectFile, "Analysis", (isDuplicate ? (*entry).prefix : ""));
outputNasmCommand(projectFile, "Release", (isDuplicate ? (*entry).prefix : ""));
+ outputNasmCommand(projectFile, "LLVM", (isDuplicate ? (*entry).prefix : ""));
projectFile << "\t\t</CustomBuild>\n";
}
diff --git a/devtools/create_project/scripts/install-natvis.bat b/devtools/create_project/scripts/install-natvis.bat
new file mode 100644
index 0000000000..62186df7bf
--- /dev/null
+++ b/devtools/create_project/scripts/install-natvis.bat
@@ -0,0 +1,41 @@
+@echo off
+echo Installing Visual Studio debugger integration...
+
+REM On 2000 & XP, the folder is "My Documents" but VS 2012 is not supported on those OSes
+SET DOCUMENTS="%USERPROFILE%\Documents"
+set FOUND=0
+
+REM Set current folder
+cd /d %~dp0
+
+:INSTALL_VS11
+SET FOLDER="%DOCUMENTS%\Visual Studio 2012"
+IF EXIST %FOLDER% (
+ echo Visual Studio 2012
+ copy scummvm.natvis %FOLDER%\Visualizers
+ IF NOT %ERRORLEVEL% == 0 GOTO FAILED
+ SET FOUND=1
+)
+
+:INSTALL_VS12
+SET FOLDER="%DOCUMENTS%\Visual Studio 2013"
+IF EXIST %FOLDER% (
+ echo Visual Studio 2013
+ copy scummvm.natvis %FOLDER%\Visualizers
+ IF NOT %ERRORLEVEL% == 0 GOTO FAILED
+ SET FOUND=1
+)
+
+IF %FOUND% == 1 goto SUCCESS
+echo Failed to find Visual Studio user folder.
+
+:SUCCESS
+echo.
+echo Done!
+goto END
+
+:FAILED
+echo Failed to install visualization file
+
+:END
+pause
diff --git a/devtools/create_project/scripts/scummvm.natvis b/devtools/create_project/scripts/scummvm.natvis
new file mode 100644
index 0000000000..995668690e
--- /dev/null
+++ b/devtools/create_project/scripts/scummvm.natvis
@@ -0,0 +1,91 @@
+<?xml version="1.0" encoding="utf-8"?>
+
+<!--
+ Debug visualizers for a few common ScummVM types for Visual Studio 2012 and up.
+
+ To use, copy this file into Documents\Visual Studio 20xx\Visualizers.
+
+ Known issues:
+
+ * Lists appear to be infinite (the same elements repeat over and over again).
+ Unfortunately, Lists don't store length information, and it's not possible to
+ detect whether a Node is the last one by the Node itself.
+
+ * In HashMaps, missing and dummy nodes are shown along with the useful ones.
+-->
+
+<AutoVisualizer xmlns="http://schemas.microsoft.com/vstudio/debugger/natvis/2010">
+ <UIVisualizer ServiceId="{A452AFEA-3DF6-46BB-9177-C0B08F318025}" Id="1" MenuName="Add to Image Watch"/>
+
+ <Type Name="Graphics::Surface">
+ <UIVisualizer ServiceId="{A452AFEA-3DF6-46BB-9177-C0B08F318025}" Id="1" />
+ </Type>
+
+ <Type Name="Graphics::Surface">
+ <Expand>
+ <Synthetic Name="[type]">
+ <DisplayString>UINT8</DisplayString>
+ </Synthetic>
+ <Item Name="[channels]" Condition="format.bytesPerPixel==1">1</Item>
+ <Item Name="[channels]" Condition="format.bytesPerPixel==2">2</Item>
+ <Synthetic Name="[channels]" Condition="format.bytesPerPixel==4">
+ <DisplayString>RGBA</DisplayString>
+ </Synthetic>
+ <Item Name="[width]">w</Item>
+ <Item Name="[height]">h</Item>
+ <Item Name="[stride]">pitch</Item>
+ <Item Name="[data]">pixels</Item>
+ </Expand>
+ </Type>
+
+ <Type Name="Common::Array&lt;*&gt;">
+ <DisplayString>{{size = {_size}}}</DisplayString>
+ <Expand>
+ <Item Name="[size]">_size</Item>
+ <Item Name="[capacity]">_capacity</Item>
+ <ArrayItems>
+ <Size>_size</Size>
+ <ValuePointer>_storage</ValuePointer>
+ </ArrayItems>
+ </Expand>
+ </Type>
+
+ <Type Name="Common::HashMap&lt;*,*,*,*&gt;">
+ <DisplayString>{{ size = {_size} }}</DisplayString>
+ <Expand>
+ <Item Name="[size]">_size</Item>
+ <Item Name="[capacity]">_mask + 1</Item>
+ <Item Name="[deleted]">_deleted</Item>
+ <IndexListItems>
+ <Size>_mask + 1</Size>
+ <ValueNode Condition="_storage[$i] &amp;&amp; _storage[$i] != (Common::HashMap&lt;$T1,$T2,$T3,$T4&gt;::Node *)1">*_storage[$i]</ValueNode>
+ </IndexListItems>
+ </Expand>
+ </Type>
+
+ <Type Name="Common::List&lt;*&gt;">
+ <DisplayString Condition="&amp;_anchor == _anchor._next">{{ empty }}</DisplayString>
+ <DisplayString Condition="&amp;_anchor != _anchor._next">{{ non-empty }}</DisplayString>
+ <Expand>
+ <LinkedListItems Condition="&amp;_anchor != _anchor._next">
+ <HeadPointer>_anchor._next</HeadPointer>
+ <NextPointer>_next</NextPointer>
+ <ValueNode>((Common::ListInternal::Node&lt;$T1&gt;*)this)->_data</ValueNode>
+ </LinkedListItems>
+ </Expand>
+ </Type>
+
+ <Type Name="Common::String">
+ <DisplayString>{_str,[_size]}</DisplayString>
+ <StringView>_str,[_size]</StringView>
+ <Expand>
+ <Item Name="[size]">_size</Item>
+ <Item Condition="_str != _storage" Name="[capacity]">_extern._capacity</Item>
+ <Item Condition="_str != _storage" Name="[refCount]">*_extern._refCount</Item>
+ <ArrayItems>
+ <Size>_size</Size>
+ <ValuePointer>_str</ValuePointer>
+ </ArrayItems>
+ </Expand>
+ </Type>
+</AutoVisualizer>
diff --git a/devtools/create_project/visualstudio.cpp b/devtools/create_project/visualstudio.cpp
index 438e0772f9..84bc674f9a 100644
--- a/devtools/create_project/visualstudio.cpp
+++ b/devtools/create_project/visualstudio.cpp
@@ -232,7 +232,7 @@ void VisualStudioProvider::outputGlobalPropFile(const BuildSetup &setup, std::of
"\t\tName=\"VCCLCompilerTool\"\n"
"\t\tDisableLanguageExtensions=\"" << (setup.devTools ? "false" : "true") << "\"\n"
"\t\tDisableSpecificWarnings=\"" << warnings << "\"\n"
- "\t\tAdditionalIncludeDirectories=\"" << prefix << ";" << prefix << "\\engines;$(" << LIBS_DEFINE << ")\\include;" << (setup.tests ? prefix + "\\test\\cxxtest;" : "") << "$(TargetDir)\"\n"
+ "\t\tAdditionalIncludeDirectories=\".\\;" << prefix << ";" << prefix << "\\engines;$(" << LIBS_DEFINE << ")\\include;" << (setup.tests ? prefix + "\\test\\cxxtest;" : "") << "$(TargetDir)\"\n"
"\t\tPreprocessorDefinitions=\"" << definesList << "\"\n"
"\t\tExceptionHandling=\"" << ((setup.devTools || setup.tests) ? "1" : "0") << "\"\n";
diff --git a/devtools/create_project/xcode.cpp b/devtools/create_project/xcode.cpp
index a9b8e7a752..d95bf3e9ee 100644
--- a/devtools/create_project/xcode.cpp
+++ b/devtools/create_project/xcode.cpp
@@ -26,15 +26,6 @@
#include <fstream>
#include <algorithm>
-#if defined(_WIN32) || defined(WIN32)
-#include <windows.h>
-#else
-#include <sys/param.h>
-#include <sys/stat.h>
-#include <dirent.h>
-#include <errno.h>
-#endif
-
namespace CreateProjectTool {
#define DEBUG_XCODE_HASH 0
@@ -88,27 +79,7 @@ XCodeProvider::XCodeProvider(StringList &global_warnings, std::map<std::string,
void XCodeProvider::createWorkspace(const BuildSetup &setup) {
// Create project folder
std::string workspace = setup.outputDir + '/' + PROJECT_NAME ".xcodeproj";
-
-#if defined(_WIN32) || defined(WIN32)
- if (!CreateDirectory(workspace.c_str(), NULL))
- if (GetLastError() != ERROR_ALREADY_EXISTS)
- error("Could not create folder \"" + setup.outputDir + '/' + PROJECT_NAME ".xcodeproj\"");
-#else
- if (mkdir(workspace.c_str(), 0777) == -1) {
- if (errno == EEXIST) {
- // Try to open as a folder (might be a file / symbolic link)
- DIR *dirp = opendir(workspace.c_str());
- if (dirp == NULL) {
- error("Could not create folder \"" + setup.outputDir + '/' + PROJECT_NAME ".xcodeproj\"");
- } else {
- // The folder exists, just close the stream and return
- closedir(dirp);
- }
- } else {
- error("Could not create folder \"" + setup.outputDir + '/' + PROJECT_NAME ".xcodeproj\"");
- }
- }
-#endif
+ createDirectory(workspace);
// Setup global objects
setupDefines(setup);
diff --git a/devtools/create_teenagent/create_teenagent.cpp b/devtools/create_teenagent/create_teenagent.cpp
index 79c61900f3..732532f9b2 100644
--- a/devtools/create_teenagent/create_teenagent.cpp
+++ b/devtools/create_teenagent/create_teenagent.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/devtools/create_teenagent/static_tables.h b/devtools/create_teenagent/static_tables.h
index 5c9b5b3d21..9094f98a74 100644
--- a/devtools/create_teenagent/static_tables.h
+++ b/devtools/create_teenagent/static_tables.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/devtools/create_teenagent/util.cpp b/devtools/create_teenagent/util.cpp
index 5ce8237b85..dd88d4ed85 100644
--- a/devtools/create_teenagent/util.cpp
+++ b/devtools/create_teenagent/util.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/devtools/create_teenagent/util.h b/devtools/create_teenagent/util.h
index a2783cca71..666386ea93 100644
--- a/devtools/create_teenagent/util.h
+++ b/devtools/create_teenagent/util.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/devtools/create_tony/create_tony.cpp b/devtools/create_tony/create_tony.cpp
index f2d086c083..cb76e954c9 100644
--- a/devtools/create_tony/create_tony.cpp
+++ b/devtools/create_tony/create_tony.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/devtools/create_tony/create_tony.h b/devtools/create_tony/create_tony.h
index 3075835bd9..96793bf3aa 100644
--- a/devtools/create_tony/create_tony.h
+++ b/devtools/create_tony/create_tony.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/devtools/create_tony/staticdata.h b/devtools/create_tony/staticdata.h
index fff977d8dc..a2cacb3e58 100644
--- a/devtools/create_tony/staticdata.h
+++ b/devtools/create_tony/staticdata.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/devtools/create_toon/create_toon.cpp b/devtools/create_toon/create_toon.cpp
index 2cf8895d4b..08f8d8c543 100644
--- a/devtools/create_toon/create_toon.cpp
+++ b/devtools/create_toon/create_toon.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/devtools/create_toon/create_toon.h b/devtools/create_toon/create_toon.h
index b047959215..0c26261dc9 100644
--- a/devtools/create_toon/create_toon.h
+++ b/devtools/create_toon/create_toon.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/devtools/create_toon/staticdata.h b/devtools/create_toon/staticdata.h
index bc49c7adaf..1d00455d5d 100644
--- a/devtools/create_toon/staticdata.h
+++ b/devtools/create_toon/staticdata.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/devtools/create_translations/create_translations.cpp b/devtools/create_translations/create_translations.cpp
index a8b04a7a52..01e6446cb8 100644
--- a/devtools/create_translations/create_translations.cpp
+++ b/devtools/create_translations/create_translations.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/devtools/create_translations/create_translations.h b/devtools/create_translations/create_translations.h
index 1df01e6333..34a79913ac 100644
--- a/devtools/create_translations/create_translations.h
+++ b/devtools/create_translations/create_translations.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/devtools/create_translations/po_parser.cpp b/devtools/create_translations/po_parser.cpp
index e8d7d7a644..7882502ca4 100644
--- a/devtools/create_translations/po_parser.cpp
+++ b/devtools/create_translations/po_parser.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/devtools/create_translations/po_parser.h b/devtools/create_translations/po_parser.h
index 6991b1d11e..a3b1c9a9d7 100644
--- a/devtools/create_translations/po_parser.h
+++ b/devtools/create_translations/po_parser.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/devtools/credits.pl b/devtools/credits.pl
index fda6f4782e..e61f918f3b 100755
--- a/devtools/credits.pl
+++ b/devtools/credits.pl
@@ -48,7 +48,7 @@ if ($mode eq "") {
$Text::Wrap::unexpand = 0;
if ($mode eq "TEXT") {
$Text::Wrap::columns = 78;
- $max_name_width = 23; # The maximal width of a name.
+ $max_name_width = 28; # The maximal width of a name.
} elsif ($mode eq "CPP") {
$Text::Wrap::columns = 48; # Approx.
}
@@ -60,6 +60,7 @@ sub html_entities_to_ascii {
# For now we hardcode these mappings
# &aacute; -> a
# &eacute; -> e
+ # &iacute; -> i
# &igrave; -> i
# &oacute; -> o
# &oslash; -> o
@@ -72,8 +73,10 @@ sub html_entities_to_ascii {
# &#322; -> l
# &#347; -> s
# &Scaron; -> S
+ # &ntilde; -> n
$text =~ s/&aacute;/a/g;
$text =~ s/&eacute;/e/g;
+ $text =~ s/&iacute;/i/g;
$text =~ s/&igrave;/i/g;
$text =~ s/&oacute;/o/g;
$text =~ s/&oslash;/o/g;
@@ -81,6 +84,7 @@ sub html_entities_to_ascii {
$text =~ s/&#347;/s/g;
$text =~ s/&Scaron;/S/g;
$text =~ s/&aring;/aa/g;
+ $text =~ s/&ntilde;/n/g;
$text =~ s/&auml;/a/g;
$text =~ s/&euml;/e/g;
@@ -101,6 +105,7 @@ sub html_entities_to_cpp {
# The numerical values are octal!
$text =~ s/&aacute;/\\341/g;
$text =~ s/&eacute;/\\351/g;
+ $text =~ s/&iacute;/\\355/g;
$text =~ s/&igrave;/\\354/g;
$text =~ s/&oacute;/\\363/g;
$text =~ s/&oslash;/\\370/g;
@@ -108,6 +113,7 @@ sub html_entities_to_cpp {
$text =~ s/&#347;/s/g;
$text =~ s/&Scaron;/S/g;
$text =~ s/&aring;/\\345/g;
+ $text =~ s/&ntilde;/\\361/g;
$text =~ s/&auml;/\\344/g;
$text =~ s/&euml;/\\353/g;
@@ -126,6 +132,7 @@ sub html_entities_to_rtf {
$text =~ s/&aacute;/\\'87/g;
$text =~ s/&eacute;/\\'8e/g;
+ $text =~ s/&iacute;/\\'92/g;
$text =~ s/&igrave;/\\'93/g;
$text =~ s/&oacute;/\\'97/g;
$text =~ s/&oslash;/\\'bf/g;
@@ -135,6 +142,8 @@ sub html_entities_to_rtf {
$text =~ s/&Scaron;/\\uc0\\u540 /g;
# Back to hex numbers
+ $text =~ s/&ntilde;/\\'96/g;
+
$text =~ s/&auml;/\\'8a/g;
$text =~ s/&euml;/\\'eb/g;
$text =~ s/&ouml;/\\'9a/g;
@@ -151,12 +160,14 @@ sub html_entities_to_tex {
$text =~ s/&aacute;/\\'a/g;
$text =~ s/&eacute;/\\'e/g;
+ $text =~ s/&iacute;/\\'i/g;
$text =~ s/&igrave;/\\`\\i/g;
$text =~ s/&oacute;/\\'o/g;
$text =~ s/&oslash;/{\\o}/g;
$text =~ s/&aring;/\\aa /g;
$text =~ s/&#322;/{\\l}/g;
$text =~ s/&Scaron;/{\\v S}/g;
+ $text =~ s/&ntilde;/\\Ëœn/g;
$text =~ s/&auml;/\\"a/g;
$text =~ s/&ouml;/\\"o/g;
@@ -542,7 +553,7 @@ begin_credits("Credits");
add_person("Ludvig Strigeus", "ludde", "(retired)");
end_section();
- begin_section("AVALANCHE");
+ begin_section("Avalanche");
add_person("Peter Bozs&oacute;", "uruk", "");
add_person("Arnaud Boutonn&eacute;", "Strangerke", "");
end_section();
@@ -634,6 +645,12 @@ begin_credits("Credits");
add_person("Filippos Karapetis", "[md5]", "");
end_section();
+ begin_section("MADS");
+ add_person("Arnaud Boutonn&eacute;", "Strangerke", "");
+ add_person("Paul Gilbert", "dreammaster", "");
+ add_person("Filippos Karapetis", "[md5]", "");
+ end_section();
+
begin_section("Mohawk");
add_person("Bastien Bouclet", "bgk", "");
add_person("Matthew Hoops", "clone2727", "");
@@ -756,6 +773,11 @@ begin_credits("Credits");
add_person("Gregory Montoir", "cyx", "(retired)");
end_section();
+ begin_section("Voyeur");
+ add_person("Arnaud Boutonn&eacute;", "Strangerke", "");
+ add_person("Paul Gilbert", "dreammaster", "");
+ end_section();
+
begin_section("Wintermute");
add_person("Einar Johan T. S&oslash;m&aring;en", "somaen", "");
end_section();
@@ -831,6 +853,7 @@ begin_credits("Credits");
begin_section("SymbianOS");
add_person("Jurgen Braam", "SumthinWicked", "");
add_person("Lars Persson", "AnotherGuest", "");
+ add_person("Fedor Strizhniou", "zanac", "");
end_section();
begin_section("Tizen / BADA");
@@ -984,7 +1007,7 @@ begin_credits("Credits");
end_section();
end_section();
- begin_section("Translations");
+ begin_section("GUI Translations");
begin_persons();
add_person("Thierry Crozat", "criezy", "Translation Lead");
end_persons();
@@ -1049,6 +1072,20 @@ begin_credits("Credits");
add_person("Lubomyr Lisen", "", "");
end_section();
end_section();
+ begin_section("Game Translations");
+ begin_section("CGE");
+ add_person("Dan Serban", "nutron", "Soltys English translation");
+ add_person("V&iacute;ctor Gonz&aacute;lez", "IlDucci", "Soltys Spanish translation");
+ add_person("Alejandro G&oacute;mez de la Mu&ntilde;oza", "TheFireRed", "Soltys Spanish translation");
+ end_section();
+ begin_section("Drascula");
+ add_person("Thierry Crozat", "criezy", "Improve French translation");
+ end_section();
+ begin_section("Mortevielle");
+ add_person("Hugo Labrande", "", "Improve English translation");
+ add_person("Thierry Crozat", "criezy", "Improve English translation");
+ end_section();
+ end_section();
begin_section("Websites (design)");
begin_persons();
diff --git a/devtools/extract_mort/extract_mort.cpp b/devtools/extract_mort/extract_mort.cpp
index 4346f1f4bf..7e4003a8c6 100644
--- a/devtools/extract_mort/extract_mort.cpp
+++ b/devtools/extract_mort/extract_mort.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -104,9 +104,9 @@ public:
return ftell(f);
}
uint32 size() {
- int position = ftell(f);
+ uint32 position = ftell(f);
fseek (f, 0, SEEK_END);
- int end = ftell (f);
+ uint32 end = ftell(f);
fseek (f, position, SEEK_SET);
return end;
diff --git a/devtools/sci/musicplayer.cpp b/devtools/sci/musicplayer.cpp
index 25f2d684a8..73f0e12bb0 100644
--- a/devtools/sci/musicplayer.cpp
+++ b/devtools/sci/musicplayer.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/devtools/sci/scidisasm.cpp b/devtools/sci/scidisasm.cpp
index 9b212c208d..6c7049e639 100644
--- a/devtools/sci/scidisasm.cpp
+++ b/devtools/sci/scidisasm.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/devtools/sci/scipack.cpp b/devtools/sci/scipack.cpp
index ff52e25061..9e9ebcd0a2 100644
--- a/devtools/sci/scipack.cpp
+++ b/devtools/sci/scipack.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/devtools/skycpt/AsciiCptCompile.cpp b/devtools/skycpt/AsciiCptCompile.cpp
index f339f6816c..3d638b6c35 100644
--- a/devtools/skycpt/AsciiCptCompile.cpp
+++ b/devtools/skycpt/AsciiCptCompile.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/devtools/skycpt/KmpSearch.cpp b/devtools/skycpt/KmpSearch.cpp
index 9551156295..aaae48614c 100644
--- a/devtools/skycpt/KmpSearch.cpp
+++ b/devtools/skycpt/KmpSearch.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/devtools/skycpt/KmpSearch.h b/devtools/skycpt/KmpSearch.h
index 7bec5f07a8..04a0c9ac89 100644
--- a/devtools/skycpt/KmpSearch.h
+++ b/devtools/skycpt/KmpSearch.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/devtools/skycpt/TextFile.cpp b/devtools/skycpt/TextFile.cpp
index 038b1b9329..b03e66121f 100644
--- a/devtools/skycpt/TextFile.cpp
+++ b/devtools/skycpt/TextFile.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/devtools/skycpt/TextFile.h b/devtools/skycpt/TextFile.h
index 6c390c050d..80564fbd5e 100644
--- a/devtools/skycpt/TextFile.h
+++ b/devtools/skycpt/TextFile.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/devtools/skycpt/cptcompiler.cpp b/devtools/skycpt/cptcompiler.cpp
index 657f51b8a0..eb2c287a1d 100644
--- a/devtools/skycpt/cptcompiler.cpp
+++ b/devtools/skycpt/cptcompiler.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/devtools/skycpt/cpthelp.cpp b/devtools/skycpt/cpthelp.cpp
index 0780888097..e2e4577a90 100644
--- a/devtools/skycpt/cpthelp.cpp
+++ b/devtools/skycpt/cpthelp.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/devtools/skycpt/cpthelp.h b/devtools/skycpt/cpthelp.h
index 71d760af3f..54daac2128 100644
--- a/devtools/skycpt/cpthelp.h
+++ b/devtools/skycpt/cpthelp.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/devtools/skycpt/idFinder.cpp b/devtools/skycpt/idFinder.cpp
index 99e4378867..b2b9b9b524 100644
--- a/devtools/skycpt/idFinder.cpp
+++ b/devtools/skycpt/idFinder.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/devtools/skycpt/stdafx.cpp b/devtools/skycpt/stdafx.cpp
index e91ca09470..fb87b37cba 100644
--- a/devtools/skycpt/stdafx.cpp
+++ b/devtools/skycpt/stdafx.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/devtools/skycpt/stdafx.h b/devtools/skycpt/stdafx.h
index d4d389a2b6..55fdf33cd4 100644
--- a/devtools/skycpt/stdafx.h
+++ b/devtools/skycpt/stdafx.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/dists/debian/copyright b/dists/debian/copyright
index 1cccd01a07..1317fc6cee 100644
--- a/dists/debian/copyright
+++ b/dists/debian/copyright
@@ -7,7 +7,7 @@ It was downloaded from <http://www.scummvm.org/>.
Upstream Authors: see `/usr/share/doc/scummvm/AUTHORS'.
-Scummvm is Copyright © 2002-2013 The ScummVM Project
+ScummVM is Copyright © 2002-2014 The ScummVM 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 the
diff --git a/dists/engine-data/README b/dists/engine-data/README
index 9bbb006d17..e87f04c65b 100644
--- a/dists/engine-data/README
+++ b/dists/engine-data/README
@@ -21,6 +21,9 @@ File created partially by extracting font data from the French executable. It
also contains the French and German translation, as well as a custom-made
English translation.
+neverhood.dat:
+TODO
+
queen.tbl:
'queen.tbl' contains a list of filenames, filesizes and offsets for the
individual files saved in QUEEN.1. This data was originally included in the
@@ -38,4 +41,4 @@ tony.dat:
This file contains the font table used by the different versions of the game.
toon.dat:
-'toon.dat' contains all the strings hardcoded in the original executables.
+This file contains all the strings hardcoded in the original executables.
diff --git a/dists/engine-data/kyra.dat b/dists/engine-data/kyra.dat
index 305c7e665c..37b3b0ef0b 100644
--- a/dists/engine-data/kyra.dat
+++ b/dists/engine-data/kyra.dat
Binary files differ
diff --git a/dists/engine-data/lure.dat b/dists/engine-data/lure.dat
index 4e0d2894af..8ca69224da 100644
--- a/dists/engine-data/lure.dat
+++ b/dists/engine-data/lure.dat
Binary files differ
diff --git a/dists/engine-data/neverhood.dat b/dists/engine-data/neverhood.dat
index dc95c00965..2f1bc4b522 100644
--- a/dists/engine-data/neverhood.dat
+++ b/dists/engine-data/neverhood.dat
Binary files differ
diff --git a/dists/iphone/Info.plist b/dists/iphone/Info.plist
index 9667f807eb..6fdd7f2696 100644
--- a/dists/iphone/Info.plist
+++ b/dists/iphone/Info.plist
@@ -35,5 +35,11 @@
<integer>1</integer>
<integer>2</integer>
</array>
+ <key>UISupportedInterfaceOrientations</key>
+ <array>
+ <string>UIInterfaceOrientationPortrait</string>
+ <string>UIInterfaceOrientationLandscapeLeft</string>
+ <string>UIInterfaceOrientationLandscapeRight</string>
+ </array>
</dict>
</plist>
diff --git a/dists/iphone/Info.plist.in b/dists/iphone/Info.plist.in
index efb93832e7..2bcdd15a03 100644
--- a/dists/iphone/Info.plist.in
+++ b/dists/iphone/Info.plist.in
@@ -35,5 +35,11 @@
<integer>1</integer>
<integer>2</integer>
</array>
+ <key>UISupportedInterfaceOrientations</key>
+ <array>
+ <string>UIInterfaceOrientationPortrait</string>
+ <string>UIInterfaceOrientationLandscapeLeft</string>
+ <string>UIInterfaceOrientationLandscapeRight</string>
+ </array>
</dict>
</plist>
diff --git a/dists/macosx/Info.plist b/dists/macosx/Info.plist
index b9a4eff1b8..63813c06de 100644
--- a/dists/macosx/Info.plist
+++ b/dists/macosx/Info.plist
@@ -28,7 +28,7 @@
<key>CFBundleExecutable</key>
<string>scummvm</string>
<key>CFBundleGetInfoString</key>
- <string>1.7.0git, Copyright 2001-2013 The ScummVM team</string>
+ <string>1.7.0git, Copyright 2001-2014 The ScummVM Team</string>
<key>CFBundleIconFile</key>
<string>scummvm.icns</string>
<key>CFBundleIdentifier</key>
@@ -46,7 +46,7 @@
<key>NSPrincipalClass</key>
<string>NSApplication</string>
<key>NSHumanReadableCopyright</key>
- <string>Copyright 2001-2013 The ScummVM team</string>
+ <string>Copyright 2001-2014 The ScummVM Team</string>
<key>SUFeedURL</key>
<string>http://www.scummvm.org/appcasts/macosx/release.xml</string>
<key>SUPublicDSAKeyFile</key>
diff --git a/dists/macosx/Info.plist.in b/dists/macosx/Info.plist.in
index b810b7ea5a..9ef1584440 100644
--- a/dists/macosx/Info.plist.in
+++ b/dists/macosx/Info.plist.in
@@ -28,7 +28,7 @@
<key>CFBundleExecutable</key>
<string>scummvm</string>
<key>CFBundleGetInfoString</key>
- <string>@VERSION@, Copyright 2001-2013 The ScummVM team</string>
+ <string>@VERSION@, Copyright 2001-2014 The ScummVM Team</string>
<key>CFBundleIconFile</key>
<string>scummvm.icns</string>
<key>CFBundleIdentifier</key>
@@ -46,7 +46,7 @@
<key>NSPrincipalClass</key>
<string>NSApplication</string>
<key>NSHumanReadableCopyright</key>
- <string>Copyright 2001-2013 The ScummVM team</string>
+ <string>Copyright 2001-2014 The ScummVM Team</string>
<key>SUFeedURL</key>
<string>http://www.scummvm.org/appcasts/macosx/release.xml</string>
<key>SUPublicDSAKeyFile</key>
diff --git a/dists/msvc11/readme.txt b/dists/msvc11/readme.txt
index fa91a8cc12..45faac0663 100644
--- a/dists/msvc11/readme.txt
+++ b/dists/msvc11/readme.txt
@@ -3,4 +3,7 @@ files using the create_project tool inside the /devtools/create_project folder.
To create the default project files, build create_project.exe, copy it inside
this folder and run the create_msvc11.bat file for a default build. You can run
-create_project.exe with no parameters to check the possible command-line options
+create_project.exe with no parameters to check the possible command-line options.
+
+To enable debug visualization for common types, see the comment in
+/devtools/create_project/scripts/scummvm.natvis.
diff --git a/dists/msvc12/readme.txt b/dists/msvc12/readme.txt
index 760f9ff601..2d91c72140 100644
--- a/dists/msvc12/readme.txt
+++ b/dists/msvc12/readme.txt
@@ -3,4 +3,7 @@ files using the create_project tool inside the /devtools/create_project folder.
To create the default project files, build create_project.exe, copy it inside
this folder and run the create_msvc12.bat file for a default build. You can run
-create_project.exe with no parameters to check the possible command-line options
+create_project.exe with no parameters to check the possible command-line options.
+
+To enable debug visualization for common types, see the comment in
+/devtools/create_project/scripts/scummvm.natvis.
diff --git a/dists/scummvm.rc b/dists/scummvm.rc
index 037db3ef62..f0609c1a79 100644
--- a/dists/scummvm.rc
+++ b/dists/scummvm.rc
@@ -81,7 +81,7 @@ BEGIN
VALUE "FileDescription", "http://www.scummvm.org/\0"
VALUE "FileVersion", "1.7.0git\0"
VALUE "InternalName", "scummvm\0"
- VALUE "LegalCopyright", "Copyright © 2001-2013 The ScummVM Team\0"
+ VALUE "LegalCopyright", "Copyright © 2001-2014 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"
diff --git a/dists/scummvm.rc.in b/dists/scummvm.rc.in
index c18c18ef63..401c0abb0d 100644
--- a/dists/scummvm.rc.in
+++ b/dists/scummvm.rc.in
@@ -81,7 +81,7 @@ BEGIN
VALUE "FileDescription", "http://www.scummvm.org/\0"
VALUE "FileVersion", "@VERSION@\0"
VALUE "InternalName", "scummvm\0"
- VALUE "LegalCopyright", "Copyright © 2001-2013 The ScummVM Team\0"
+ VALUE "LegalCopyright", "Copyright © 2001-2014 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"
diff --git a/dists/win32/ScummVM.iss b/dists/win32/ScummVM.iss
index fa0f760f59..5afb407177 100644
--- a/dists/win32/ScummVM.iss
+++ b/dists/win32/ScummVM.iss
@@ -1,5 +1,5 @@
[Setup]
-AppCopyright=2013
+AppCopyright=2014
AppName=ScummVM
AppVerName=ScummVM Git
AppPublisher=The ScummVM Team
diff --git a/dists/win32/migration.bat b/dists/win32/migration.bat
index b4b00c02cc..e1b27a1fb3 100644
--- a/dists/win32/migration.bat
+++ b/dists/win32/migration.bat
@@ -4,7 +4,7 @@
:: This script will copy any saved games located in the
:: old default location, to the new default location.
::
-:: (c) 2012-2013 ScummVM Team
+:: (c) 2012-2014 ScummVM Team
::
@echo off
diff --git a/dists/win32/scummvm.nsi b/dists/win32/scummvm.nsi
index 5357be9fe4..602b9fd6c3 100644
--- a/dists/win32/scummvm.nsi
+++ b/dists/win32/scummvm.nsi
@@ -76,7 +76,7 @@ Name ScummVM
!define COMPANY "ScummVM Team"
!define URL "http://scummvm.org/"
!define DESCRIPTION "ScummVM Installer. Look! A three headed monkey (TM)!"
-!define COPYRIGHT "Copyright © 2001-2013 The ScummVM Team"
+!define COPYRIGHT "Copyright © 2001-2014 The ScummVM Team"
#########################################################################################
# Installer configuration
diff --git a/dists/win32/scummvm.nsi.in b/dists/win32/scummvm.nsi.in
index 9f8bd1dad2..b8ddc74a86 100644
--- a/dists/win32/scummvm.nsi.in
+++ b/dists/win32/scummvm.nsi.in
@@ -76,7 +76,7 @@ Name ScummVM
!define COMPANY "ScummVM Team"
!define URL "http://scummvm.org/"
!define DESCRIPTION "ScummVM Installer. Look! A three headed monkey (TM)!"
-!define COPYRIGHT "Copyright © 2001-2013 The ScummVM Team"
+!define COPYRIGHT "Copyright © 2001-2014 The ScummVM Team"
#########################################################################################
# Installer configuration
diff --git a/doc/cz/PrectiMe b/doc/cz/PrectiMe
index 390d20ab1d..0f475b9539 100644
--- a/doc/cz/PrectiMe
+++ b/doc/cz/PrectiMe
@@ -1,1688 +1,1750 @@
-PŘEČTIMĚ ScummVM
-------------------------------------------------------------------------
-
-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
- * 8.1 Rozpoznávaná klíÄová slova nastavení
- * 8.2 Vlastní herní volby, které mohou být přepínány pomoci grafického rozhraní
-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:
- Bambou le sauveur de la jungle [bambou]
- Bargon Attack [bargon]
- Fascination [fascination]
- Geisha [geisha]
- Gobliiins [gob1]
- Gobliins 2 [gob2]
- Goblins 3 [gob3]
- Lost in Time [lostintime]
- Once Upon A Time: Little Red Riding Hood [littlered]
- The Bizarre Adventures of Woodruff
- and the Schnibble [woodruff]
- Urban Runner [urban]
- 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]
- Eye of the Beholder [eob]
- Eye of the Beholder II: The Legend of
- Darkmoon [eob2]
- Flight of the Amazon Queen [queen]
- Future Wars [fw]
- Inherit the Earth: Quest for the Orb [ite]
- Nippon Safes Inc. [nippon]
- Lands of Lore: The Throne of Chaos [lol]
- The Journeyman Project: Pegasus Prime [pegasus]
- 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 Baseball 2003 [baseball2003]
- 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 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:
-
- * Beneath a Steel Sky
- -- potlaÄeno s laskavým svolením Revolution Software.
- * Dreamweb
- -- seznam dostupných příkazů v terminálech ve hře je nyní zobrazen
- když hrÃ¡Ä použije příkaz 'help'
- * 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.
- * Loom (EGA DOS)
- * Maniac Mansion
- * Monkey Island 2: LeChuck's Revenge
- * 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.
- * The Secret of Monkey Island (VGA)
- * Waxworks
- * Zak McKracken and the Alien Mindbenders
-
-
-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Äí.
-
-Ve verzích pro PlayStation, můžete původní videa vypsat z disku. Každý soubor, který má příponu "STR", byste mÄ›li vypsat jako *Äist* sektory z disku (vÅ¡ech 2352 bajtů na sektor). Můžete také míst toho použít pÅ™eformátovaná videa, která jsou zmínÄ›na níže, ale to nebude fungovat pro vÅ¡echny videa v Broken Sword II. Pro více informací si prohlédnÄ›te:
-
- http://wiki.scummvm.org/index.php/HOWTO-PlayStation_Videos
-
-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. BalíÄek v souÄasnosti nefunguje ve videích na PlayStation. (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'.
-Soubor by mÄ›l být vždykcy souÄástí oficiálních balíÄků ScummVM. V případÄ›, že ScummVM
-hlásí, že soubor chybá, můžete ho najít na stránce ScummVM v sekci 'Downloads'.
-Nezapomeňte, že souÄasná verze ScummVM pro Windows by mÄ›la soubor obsahovat ve spouÅ¡tÄ›Äi a tudíž ho
-musíte mít pouze, když ScummVM soubor nemůže nalézt.
-
-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Ä›Ä (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
-
- 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.
-
- 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)
- --list-audio-devices Zobrazí seznam všech dostupných zvukových zařízení
- -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
- COMPOSER
- CRUISE
- DRACI
- DRASCULA
- GOB
- GROOVIE
- HUGO
- KYRA
- LURE
- MADE
- MOHAWK
- PARALLACTION
- QUEEN
- SAGA
- SCI
- SCUMM
- SKY
- SWORD1
- SWORD2
- TEENAGENT
- TOUCHE
- TSAGE
- 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ím pomocí 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/
-
- Windows Vista/7:
- \Users\užjméno\AppData\Roaming\ScummVM\Saved games\
-
- Windows 2000/XP:
- \Documents and Settings\užjméno\Application Data\ScummVM\Saved games\
-
- Windows NT4:
- <windir>\Profiles\užjméno\Application Data\ScummVM\Saved games\
-
-Uložené hry jsou ve Windows NT4/2000/XP/Vista/7 ukládány ve skryté složce,
-do které můžete vstoupit spuštěním "%APPDATA%\ScummVM\Saved Games\" nebo
-povolením zobrazení skrytých složek v Průzkumníku Windows.
-
-Poznámka pro uživatele Windows NT4/2000/XP/Vista/7: Výchozí umístění uložených her
-bylo ve ScummVM 1.5.0 změněno. Dávkový soubor přesunu může být použit pro zkopírování
-uložených her ze starého výchozího umístění do nového.
-
-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, a 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
- CGE
- CINE
- CRUISE
- DRACI
- GROOVIE
- HUGO
- KYRA
- LURE
- MOHAWK
- PARALLACTION
- QUEEN
- SAGA
- SCI
- SCUMM
- SKY
- SWORD1
- SWORD2
- TEENAGENT
- TINSEL
- TOON
- TOUCHE
- TSAGE
- 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
- CGE
- CINE
- CRUISE
- DRACI
- GROOVIE
- HUGO
- KYRA
- LURE
- MOHAWK
- QUEEN
- SAGA
- SCI
- SCUMM
- SKY
- SWORD1
- SWORD2
- TEENAGENT
- TINSEL
- TOON
- TOUCHE
- TSAGE
- TUCKER
-
-
-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/7:
- \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
-
-8.1) Rozpoznávaná klíÄová slova nastavení
----- ------------------------------------
-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
- 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, jsou povoleny smíšený AdLib a původní 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
-
-Hry Sierra používající jádro AGI pÅ™idávají následující nestandardní klíÄové slovo:
-
-originalsaveload boolean Pokud true, jsou použity původní obrazovky nahrávání/uložení místo vylepšených ze ScummVM
-
-Hry Sierra používající jádro SCI pÅ™idávají následující nestandardní klíÄová slova:
-
- disable_dithering boolean Odstranit artefakty chvění v některých hrách EGA
- prefer_digitalsfx boolean Pokud true, jsou upřednostňovány digitální zvukové efekty před syntetizovanými
- originalsaveload boolean Pokud true, jsou použity původní obrazovky nahrávání/uložení místo vylepšených ze ScummVM
- native_fb01 bool Pokud true, je ovladaÄ hudby pro kartu IBM Music Feature nebo modul syntetizátoru Yahama FB-01 FM použit jako výstup MIDI
-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
-
-Jones in the Fast Lane pÅ™idává následující nestandardní klíÄové slovo:
-
- music_mute boolean Pokud true, je použito CD audio místo zvuků ve hře
-
-King's Quest VI Windows pÅ™idává následující nestandardní klíÄové slovo:
-
- 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
-
-Lands of Lore: The Throne of Chaos pÅ™idává následující nestandardní klíÄová slova:
-
- smooth_scrolling boolean Pokud true, je posunování při změně z jedné obrazovky na druhou plynulejší
- floating_cursors boolean Pokud true, je kurzor zmÄ›nÄ›n na smÄ›rovou Å¡ipku pÅ™i najetí na okraj obrazovky. HrÃ¡Ä pak může kliknout pro pohyb v tomto smÄ›ru.
-
-Space Quest IV CD pÅ™idává následující nestandardní klíÄové slovo:
-
- silver_cursors boolean Pokud true, je místo původních zlatých kurzorů použita alternativní sada stříbrných
-
-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é slovo:
-
- walkspeed celé Äíslo Rychlost chůze (0-4)
-
-The Legend of Kyrandia: The Hand of Fate pÅ™idává následující nestandardní klíÄové slovo:
-
- walkspeed Äíslo Rychlost chůze (3 nebo 5, což znamená
- rychle nebo pomalu)
-
-The Legend of Kyrandia: Malcolm's Revenge pÅ™idává následující nestandardní klíÄová slova:
-
- walkspeed Äíslo Rychlost chůze (3 nebo 5, což znamená
- rychle nebo pomalu)
- studio_audience boolean Pokud true, je slyšet potlesk a smích kdykoliv Malcolm provede něco vtipného
- skip_support boolean Pokud true, hrÃ¡Ä může pÅ™eskakovat text a scény hry
- helium_mode boolean Pokud true, lidé znějí tak, jakoby se nadýchali hélia
-
-The 7th Guest pÅ™idává následující nestandardní klíÄové slovo:
-
- fast_movie_speed boolean Pokud true, jsou videa přehrávána při zvýšené
- rychlosti, stejné jako ve verzi pro iOS.
- Videa bez zvuku jsou stále přehrávána při
- normální rychlosti, aby nedošlo k desynchronizaci
- hudby
-
-8.2) Vlastní herní volby, které mohou být přepínány pomoci grafického
----- ----------------------------------------------------------------
-rozhraní
---------
-Mnoho vlastních herních voleb v pÅ™edchozí Äásti může být pÅ™epnuto pÅ™es grafické rozhraní. Pokud je takováto volba pro urÄitou hru dostupná, objeví se karta "Jádro" pÅ™i pÅ™idávání nebo úpravÄ› nastavení této hry.
-Pokud vlastní možnosti nejsou zobrazeny, musí být konkrétní hry spuÅ¡tÄ›ny jednou nebo znovu pÅ™idány do seznamu her spouÅ¡tÄ›Äe ScummVM. Toto aktualizuje nastavení každé položky, Äímž umožní zobrazení vlastních voleb.
-
-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
-
- 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/
-------------------------------------------------------------------------
-
-
-
-
+PŘEČTIMĚ ScummVM
+------------------------------------------------------------------------
+
+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 Titulky a hlasy souběžně v hrách Sierra SCI
+ * 3.21 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
+ * 8.1 Rozpoznávaná klíÄová slova nastavení
+ * 8.2 Vlastní herní volby, které mohou být přepínány pomoci grafického rozhraní
+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:
+ Bambou le sauveur de la jungle [bambou]
+ Bargon Attack [bargon]
+ Fascination [fascination]
+ Geisha [geisha]
+ Gobliiins [gob1]
+ Gobliins 2 [gob2]
+ Goblins 3 [gob3]
+ Lost in Time [lostintime]
+ Once Upon A Time: Little Red Riding Hood [littlered]
+ The Bizarre Adventures of Woodruff
+ and the Schnibble [woodruff]
+ Urban Runner [urban]
+ 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]
+ Eye of the Beholder [eob]
+ Eye of the Beholder II: The Legend of
+ Darkmoon [eob2]
+ Flight of the Amazon Queen [queen]
+ Future Wars [fw]
+ Inherit the Earth: Quest for the Orb [ite]
+ Nippon Safes Inc. [nippon]
+ Lands of Lore: The Throne of Chaos [lol]
+ The Journeyman Project: Pegasus Prime [pegasus]
+ 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 Baseball 2003 [baseball2003]
+ 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 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:
+
+ * Beneath a Steel Sky
+ -- potlaÄeno s laskavým svolením Revolution Software.
+ * Dreamweb
+ -- seznam dostupných příkazů v terminálech ve hře je nyní zobrazen
+ když hrÃ¡Ä použije příkaz 'help'
+ * 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.
+ * Loom (EGA DOS)
+ * Maniac Mansion
+ * Monkey Island 2: LeChuck's Revenge
+ * 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.
+ * The Secret of Monkey Island (VGA)
+ * Waxworks
+ * Zak McKracken and the Alien Mindbenders
+
+
+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Äí.
+
+Ve verzích pro PlayStation, můžete původní videa vypsat z disku. Každý soubor, který má příponu "STR", byste mÄ›li vypsat jako *Äist* sektory z disku (vÅ¡ech 2352 bajtů na sektor). Můžete také míst toho použít pÅ™eformátovaná videa, která jsou zmínÄ›na níže, ale to nebude fungovat pro vÅ¡echny videa v Broken Sword II. Pro více informací si prohlédnÄ›te:
+
+ http://wiki.scummvm.org/index.php/HOWTO-PlayStation_Videos
+
+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. BalíÄek v souÄasnosti nefunguje ve videích na PlayStation. (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'.
+Soubor by mÄ›l být vždykcy souÄástí oficiálních balíÄků ScummVM. V případÄ›, že ScummVM
+hlásí, že soubor chybá, můžete ho najít na stránce ScummVM v sekci 'Downloads'.
+Nezapomeňte, že souÄasná verze ScummVM pro Windows by mÄ›la soubor obsahovat ve spouÅ¡tÄ›Äi a tudíž ho
+musíte mít pouze, když ScummVM soubor nemůže nalézt.
+
+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Ä›Ä (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) Titulky a hlasy souběžně v hrách Sierra SCI:
+----- --------------------------------------------
+UrÄité CD verze her Sierra SCI mají textová i hlasová data.
+Některé z nich mají volbu pro přepínání mezi nimi, ale existují případy
+kde není možnost povolit oba najednou. Ve ScummVM je možné si užít tento
+kombinovaný režim, kde jsou zvuk i text zobrazeny souÄasnÄ›. Tento režim
+může být povolen v nastavení zvuku ScummVM, ale každá hra se chová jinak
+vzhledem k povolení textu a hlasu.
+
+Hry na CD, kde zvuk i titulky lze zobrazit souÄasnÄ›:
+ EcoQuest 1 CD
+ Freddy Pharkas CD
+ King's Quest 6 CD
+ Laura Bow 2 CD
+ Leisure Suit Larry 6 CD
+ Space Quest 4 CD
+
+EcoQuest 1 CD:
+ Hlas i text lze zapnout pomocí volby "Mode" v okně nastavení,
+ nebo přes nastavení zvuku ScummVM.
+
+Freddy Pharkas CD:
+ Ve hře neexistuje možnost pro povolení hlasu a textu. Pro tuto funkci
+ je třeba použít nastavení zvuku ve ScummVM. Některé mluvené dialogy
+ chybí v textech hry.
+
+King's Quest 6 CD
+ Hlas i text lze zapnout pomocí volby "Mode" v okně nastavení (kde je ve
+ ScummVM pÅ™idána dodateÄná volba "Dual"), nebo pomocí nastavení
+ zvuku ve ScummVM.
+
+Laura Bow 2 CD
+ Hlas i text lze zapnout pomocí volby "Mode" v okně nastavení (kde je ve
+ ScummVM pÅ™idána dodateÄná volba "Dual"), nebo pomocí nastavení
+ zvuku ve ScummVM.
+
+Leisure Suit Larry 6 CD
+ Ve hÅ™e lze povolit buÄ hlas, nebo hlas a text. Neexistuje možnost pro
+ povolení textu. Pouze nastavení zvuku ve ScummVM lze použít pro
+ zobrazení jen titulků.
+
+Space Quest 4 CD:
+ Hlas a text lze povolit pomocí tlaÄítka "Display Mode" v
+ nastavení hry, nebo pomocí nastavení zvuku ve ScummVM.
+
+
+3.21) 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
+
+ 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.
+
+ 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)
+ --list-audio-devices Zobrazí seznam všech dostupných zvukových zařízení
+ -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
+ COMPOSER
+ CRUISE
+ DRACI
+ DRASCULA
+ GOB
+ GROOVIE
+ HUGO
+ KYRA
+ LURE
+ MADE
+ MOHAWK
+ PARALLACTION
+ QUEEN
+ SAGA
+ SCI
+ SCUMM
+ SKY
+ SWORD1
+ SWORD2
+ TEENAGENT
+ TOUCHE
+ TSAGE
+ 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ím pomocí 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/
+
+ Windows Vista/7:
+ \Users\užjméno\AppData\Roaming\ScummVM\Saved games\
+
+ Windows 2000/XP:
+ \Documents and Settings\užjméno\Application Data\ScummVM\Saved games\
+
+ Windows NT4:
+ <windir>\Profiles\užjméno\Application Data\ScummVM\Saved games\
+
+Uložené hry jsou ve Windows NT4/2000/XP/Vista/7 ukládány ve skryté složce,
+do které můžete vstoupit spuštěním "%APPDATA%\ScummVM\Saved Games\" nebo
+povolením zobrazení skrytých složek v Průzkumníku Windows.
+
+Poznámka pro uživatele Windows NT4/2000/XP/Vista/7: Výchozí umístění uložených her
+bylo ve ScummVM 1.5.0 změněno. Dávkový soubor přesunu může být použit pro zkopírování
+uložených her ze starého výchozího umístění do nového.
+
+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, a 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
+ CGE
+ CINE
+ CRUISE
+ DRACI
+ GROOVIE
+ HUGO
+ KYRA
+ LURE
+ MOHAWK
+ PARALLACTION
+ QUEEN
+ SAGA
+ SCI
+ SCUMM
+ SKY
+ SWORD1
+ SWORD2
+ TEENAGENT
+ TINSEL
+ TOON
+ TOUCHE
+ TSAGE
+ 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
+ CGE
+ CINE
+ CRUISE
+ DRACI
+ GROOVIE
+ HUGO
+ KYRA
+ LURE
+ MOHAWK
+ QUEEN
+ SAGA
+ SCI
+ SCUMM
+ SKY
+ SWORD1
+ SWORD2
+ TEENAGENT
+ TINSEL
+ TOON
+ TOUCHE
+ TSAGE
+ TUCKER
+
+
+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/7:
+ \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
+
+8.1) Rozpoznávaná klíÄová slova nastavení
+---- ------------------------------------
+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
+ 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, jsou povoleny smíšený AdLib a původní 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
+
+Hry Sierra používající jádro AGI pÅ™idávají následující nestandardní klíÄové slovo:
+
+originalsaveload boolean Pokud true, jsou použity původní obrazovky nahrávání/uložení místo vylepšených ze ScummVM
+
+Hry Sierra používající jádro SCI pÅ™idávají následující nestandardní klíÄová slova:
+
+ disable_dithering boolean Odstranit artefakty chvění v některých hrách EGA
+ prefer_digitalsfx boolean Pokud true, jsou upřednostňovány digitální zvukové efekty před syntetizovanými
+ originalsaveload boolean Pokud true, jsou použity původní obrazovky nahrávání/uložení místo vylepšených ze ScummVM
+ native_fb01 bool Pokud true, je ovladaÄ hudby pro kartu IBM Music Feature nebo modul syntetizátoru Yahama FB-01 FM použit jako výstup MIDI
+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
+
+Hopkins FBI pÅ™idává následující nestandardní klíÄové slovo:
+ enable_gore boolean Pokud true, povolí některé nepivnné krvavé scény ve hře
+
+Jones in the Fast Lane pÅ™idává následující nestandardní klíÄové slovo:
+
+ music_mute boolean Pokud true, je použito CD audio místo zvuků ve hře
+
+King's Quest VI Windows pÅ™idává následující nestandardní klíÄové slovo:
+
+ 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
+
+Lands of Lore: The Throne of Chaos pÅ™idává následující nestandardní klíÄová slova:
+
+ smooth_scrolling boolean Pokud true, je posunování při změně z jedné obrazovky na druhou plynulejší
+ floating_cursors boolean Pokud true, je kurzor zmÄ›nÄ›n na smÄ›rovou Å¡ipku pÅ™i najetí na okraj obrazovky. HrÃ¡Ä pak může kliknout pro pohyb v tomto smÄ›ru.
+
+Space Quest IV CD pÅ™idává následující nestandardní klíÄové slovo:
+
+ silver_cursors boolean Pokud true, je místo původních zlatých kurzorů použita alternativní sada stříbrných
+
+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
+
+Soltys pÅ™idává následující nestandardní klíÄové slovo:
+ enable_color_blind bool Pokud true, jsou původní barvy nahrazeny odstíny šedi
+
+The Legend of Kyrandia pÅ™idává následující nestandardní klíÄové slovo:
+
+ walkspeed celé Äíslo Rychlost chůze (0-4)
+
+The Legend of Kyrandia: The Hand of Fate pÅ™idává následující nestandardní klíÄové slovo:
+
+ walkspeed Äíslo Rychlost chůze (3 nebo 5, což znamená
+ rychle nebo pomalu)
+
+The Legend of Kyrandia: Malcolm's Revenge pÅ™idává následující nestandardní klíÄová slova:
+
+ walkspeed Äíslo Rychlost chůze (3 nebo 5, což znamená
+ rychle nebo pomalu)
+ studio_audience boolean Pokud true, je slyšet potlesk a smích kdykoliv Malcolm provede něco vtipného
+ skip_support boolean Pokud true, hrÃ¡Ä může pÅ™eskakovat text a scény hry
+ helium_mode boolean Pokud true, lidé znějí tak, jakoby se nadýchali hélia
+
+The Neverhood pÅ™idává následující nestandardní klíÄová slova:
+
+ originalsaveload boolean Pokud true, jsou použity původní obrazovky pro
+ naÄítání/ukládání místo obrazovek ScummVM
+ skiphallofrecordsscenes boolean
+ Pokud true, umožní hráÄi pÅ™eskoÄit
+ obrazovky v Síni záznamů
+ scalemakingofvideos boolean Pokud true, je změněno rozlišení dokumentu o
+ vytváření hry tak, aby zaplnilo celou obrazovku
+
+The 7th Guest pÅ™idává následující nestandardní klíÄové slovo:
+
+ fast_movie_speed boolean Pokud true, jsou videa přehrávána při zvýšené
+ rychlosti, stejné jako ve verzi pro iOS.
+ Videa bez zvuku jsou stále přehrávána při
+ normální rychlosti, aby nedošlo k desynchronizaci
+ hudby
+
+8.2) Vlastní herní volby, které mohou být přepínány pomoci grafického
+---- ----------------------------------------------------------------
+rozhraní
+--------
+Mnoho vlastních herních voleb v pÅ™edchozí Äásti může být pÅ™epnuto pÅ™es grafické rozhraní. Pokud je takováto volba pro urÄitou hru dostupná, objeví se karta "Jádro" pÅ™i pÅ™idávání nebo úpravÄ› nastavení této hry.
+Pokud vlastní možnosti nejsou zobrazeny, musí být konkrétní hry spuÅ¡tÄ›ny jednou nebo znovu pÅ™idány do seznamu her spouÅ¡tÄ›Äe ScummVM. Toto aktualizuje nastavení každé položky, Äímž umožní zobrazení vlastních voleb.
+
+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
+
+ 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/engines/advancedDetector.cpp b/engines/advancedDetector.cpp
index 40783a2407..fa23f5fa1a 100644
--- a/engines/advancedDetector.cpp
+++ b/engines/advancedDetector.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/advancedDetector.h b/engines/advancedDetector.h
index 376a59e471..ad551698f6 100644
--- a/engines/advancedDetector.h
+++ b/engines/advancedDetector.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/agi/agi.cpp b/engines/agi/agi.cpp
index 57561c00ee..6bdbabd33e 100644
--- a/engines/agi/agi.cpp
+++ b/engines/agi/agi.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/agi/agi.h b/engines/agi/agi.h
index 93a456b9a6..6256de05d2 100644
--- a/engines/agi/agi.h
+++ b/engines/agi/agi.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/agi/checks.cpp b/engines/agi/checks.cpp
index 624476509e..e61146e901 100644
--- a/engines/agi/checks.cpp
+++ b/engines/agi/checks.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/agi/configure.engine b/engines/agi/configure.engine
new file mode 100644
index 0000000000..fad659f86d
--- /dev/null
+++ b/engines/agi/configure.engine
@@ -0,0 +1,3 @@
+# This file is included from the main "configure" script
+# add_engine [name] [desc] [build-by-default] [subengines] [base games] [deps]
+add_engine agi "AGI" yes
diff --git a/engines/agi/console.cpp b/engines/agi/console.cpp
index b9a64bc572..6d7f9384cd 100644
--- a/engines/agi/console.cpp
+++ b/engines/agi/console.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -32,27 +32,27 @@ namespace Agi {
Console::Console(AgiEngine *vm) : GUI::Debugger() {
_vm = vm;
- DCmd_Register("debug", WRAP_METHOD(Console, Cmd_Debug));
- DCmd_Register("cont", WRAP_METHOD(Console, Cmd_Cont));
- DCmd_Register("agiver", WRAP_METHOD(Console, Cmd_Agiver));
- DCmd_Register("flags", WRAP_METHOD(Console, Cmd_Flags));
- DCmd_Register("logic0", WRAP_METHOD(Console, Cmd_Logic0));
- DCmd_Register("objs", WRAP_METHOD(Console, Cmd_Objs));
- DCmd_Register("runopcode", WRAP_METHOD(Console, Cmd_RunOpcode));
- DCmd_Register("opcode", WRAP_METHOD(Console, Cmd_Opcode));
- DCmd_Register("step", WRAP_METHOD(Console, Cmd_Step));
- DCmd_Register("trigger", WRAP_METHOD(Console, Cmd_Trigger));
- DCmd_Register("vars", WRAP_METHOD(Console, Cmd_Vars));
- DCmd_Register("setvar", WRAP_METHOD(Console, Cmd_SetVar));
- DCmd_Register("setflag", WRAP_METHOD(Console, Cmd_SetFlag));
- DCmd_Register("setobj", WRAP_METHOD(Console, Cmd_SetObj));
- DCmd_Register("room", WRAP_METHOD(Console, Cmd_Room));
- DCmd_Register("bt", WRAP_METHOD(Console, Cmd_BT));
+ registerCmd("debug", WRAP_METHOD(Console, Cmd_Debug));
+ registerCmd("cont", WRAP_METHOD(Console, Cmd_Cont));
+ registerCmd("agiver", WRAP_METHOD(Console, Cmd_Agiver));
+ registerCmd("flags", WRAP_METHOD(Console, Cmd_Flags));
+ registerCmd("logic0", WRAP_METHOD(Console, Cmd_Logic0));
+ registerCmd("objs", WRAP_METHOD(Console, Cmd_Objs));
+ registerCmd("runopcode", WRAP_METHOD(Console, Cmd_RunOpcode));
+ registerCmd("opcode", WRAP_METHOD(Console, Cmd_Opcode));
+ registerCmd("step", WRAP_METHOD(Console, Cmd_Step));
+ registerCmd("trigger", WRAP_METHOD(Console, Cmd_Trigger));
+ registerCmd("vars", WRAP_METHOD(Console, Cmd_Vars));
+ registerCmd("setvar", WRAP_METHOD(Console, Cmd_SetVar));
+ registerCmd("setflag", WRAP_METHOD(Console, Cmd_SetFlag));
+ registerCmd("setobj", WRAP_METHOD(Console, Cmd_SetObj));
+ registerCmd("room", WRAP_METHOD(Console, Cmd_Room));
+ registerCmd("bt", WRAP_METHOD(Console, Cmd_BT));
}
bool Console::Cmd_SetVar(int argc, const char **argv) {
if (argc != 3) {
- DebugPrintf("Usage: setvar <varnum> <value>\n");
+ debugPrintf("Usage: setvar <varnum> <value>\n");
return true;
}
int p1 = (int)atoi(argv[1]);
@@ -64,7 +64,7 @@ bool Console::Cmd_SetVar(int argc, const char **argv) {
bool Console::Cmd_SetFlag(int argc, const char **argv) {
if (argc != 3) {
- DebugPrintf("Usage: setvar <varnum> <value>\n");
+ debugPrintf("Usage: setvar <varnum> <value>\n");
return true;
}
int p1 = (int)atoi(argv[1]);
@@ -76,7 +76,7 @@ bool Console::Cmd_SetFlag(int argc, const char **argv) {
bool Console::Cmd_SetObj(int argc, const char **argv) {
if (argc != 3) {
- DebugPrintf("Usage: setvar <varnum> <value>\n");
+ debugPrintf("Usage: setvar <varnum> <value>\n");
return true;
}
int p1 = (int)atoi(argv[1]);
@@ -88,7 +88,7 @@ bool Console::Cmd_SetObj(int argc, const char **argv) {
bool Console::Cmd_RunOpcode(int argc, const char **argv) {
if (argc < 2) {
- DebugPrintf("Usage: runopcode <name> <parameter0> ....\n");
+ debugPrintf("Usage: runopcode <name> <parameter0> ....\n");
return true;
}
@@ -96,7 +96,7 @@ bool Console::Cmd_RunOpcode(int argc, const char **argv) {
if (!strcmp(argv[1], logicNamesCmd[i].name)) {
uint8 p[16];
if ((argc - 2) != logicNamesCmd[i].argumentsLength()) {
- DebugPrintf("AGI command wants %d arguments\n", 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;
@@ -113,7 +113,7 @@ bool Console::Cmd_RunOpcode(int argc, const char **argv) {
}
}
- DebugPrintf("Unknown opcode\n");
+ debugPrintf("Unknown opcode\n");
return true;
}
@@ -125,7 +125,7 @@ bool Console::Cmd_Agiver(int argc, const char **argv) {
maj = (ver >> 12) & 0xf;
min = ver & 0xfff;
- DebugPrintf(maj <= 2 ? "%x.%03x\n" : "%x.002.%03x\n", maj, min);
+ debugPrintf(maj <= 2 ? "%x.%03x\n" : "%x.002.%03x\n", maj, min);
return true;
}
@@ -133,17 +133,17 @@ bool Console::Cmd_Agiver(int argc, const char **argv) {
bool Console::Cmd_Flags(int argc, const char **argv) {
int i, j;
- DebugPrintf(" ");
+ debugPrintf(" ");
for (j = 0; j < 10; j++)
- DebugPrintf("%d ", j);
- DebugPrintf("\n");
+ debugPrintf("%d ", j);
+ debugPrintf("\n");
for (i = 0; i < 255;) {
- DebugPrintf("%3d ", i);
+ debugPrintf("%3d ", i);
for (j = 0; j < 10; j++, i++) {
- DebugPrintf("%c ", _vm->getflag(i) ? 'T' : 'F');
+ debugPrintf("%c ", _vm->getflag(i) ? 'T' : 'F');
}
- DebugPrintf("\n");
+ debugPrintf("\n");
}
return true;
@@ -154,9 +154,9 @@ bool Console::Cmd_Vars(int argc, const char **argv) {
for (i = 0; i < 255;) {
for (j = 0; j < 5; j++, i++) {
- DebugPrintf("%03d:%3d ", i, _vm->getvar(i));
+ debugPrintf("%03d:%3d ", i, _vm->getvar(i));
}
- DebugPrintf("\n");
+ debugPrintf("\n");
}
return true;
@@ -166,7 +166,7 @@ bool Console::Cmd_Objs(int argc, const char **argv) {
unsigned int i;
for (i = 0; i < _vm->_game.numObjects; i++) {
- DebugPrintf("%3d]%-24s(%3d)\n", i, _vm->objectName(i), _vm->objectGetLocation(i));
+ debugPrintf("%3d]%-24s(%3d)\n", i, _vm->objectName(i), _vm->objectGetLocation(i));
}
return true;
@@ -174,7 +174,7 @@ bool Console::Cmd_Objs(int argc, const char **argv) {
bool Console::Cmd_Opcode(int argc, const char **argv) {
if (argc != 2 || (strcmp(argv[1], "on") && strcmp(argv[1], "off"))) {
- DebugPrintf("Usage: opcode on|off\n");
+ debugPrintf("Usage: opcode on|off\n");
return true;
}
@@ -185,7 +185,7 @@ bool Console::Cmd_Opcode(int argc, const char **argv) {
bool Console::Cmd_Logic0(int argc, const char **argv) {
if (argc != 2 || (strcmp(argv[1], "on") && strcmp(argv[1], "off"))) {
- DebugPrintf("Usage: logic0 on|off\n");
+ debugPrintf("Usage: logic0 on|off\n");
return true;
}
@@ -196,7 +196,7 @@ bool Console::Cmd_Logic0(int argc, const char **argv) {
bool Console::Cmd_Trigger(int argc, const char **argv) {
if (argc != 2 || (strcmp(argv[1], "on") && strcmp(argv[1], "off"))) {
- DebugPrintf("Usage: trigger on|off\n");
+ debugPrintf("Usage: trigger on|off\n");
return true;
}
_vm->_debug.ignoretriggers = strcmp (argv[1], "on");
@@ -236,13 +236,13 @@ bool Console::Cmd_Room(int argc, const char **argv) {
_vm->newRoom(strtoul(argv[1], NULL, 0));
}
- DebugPrintf("Current room: %d\n", _vm->getvar(0));
+ debugPrintf("Current room: %d\n", _vm->getvar(0));
return true;
}
bool Console::Cmd_BT(int argc, const char **argv) {
- DebugPrintf("Current script: %d\nStack depth: %d\n", _vm->_game.lognum, _vm->_game.execStack.size());
+ debugPrintf("Current script: %d\nStack depth: %d\n", _vm->_game.lognum, _vm->_game.execStack.size());
uint8 *code = NULL;
uint8 op = 0;
@@ -257,12 +257,12 @@ bool Console::Cmd_BT(int argc, const char **argv) {
memmove(p, &code[it->curIP], num);
memset(p + num, 0, CMD_BSIZE - num);
- DebugPrintf("%d(%d): %s(", it->script, it->curIP, logicNamesCmd[op].name);
+ debugPrintf("%d(%d): %s(", it->script, it->curIP, logicNamesCmd[op].name);
for (int i = 0; i < num; i++)
- DebugPrintf("%d, ", p[i]);
+ debugPrintf("%d, ", p[i]);
- DebugPrintf(")\n");
+ debugPrintf(")\n");
}
return true;
@@ -271,9 +271,9 @@ bool Console::Cmd_BT(int argc, const char **argv) {
MickeyConsole::MickeyConsole(MickeyEngine *mickey) : GUI::Debugger() {
_mickey = mickey;
- DCmd_Register("room", WRAP_METHOD(MickeyConsole, Cmd_Room));
- DCmd_Register("drawPic", WRAP_METHOD(MickeyConsole, Cmd_DrawPic));
- DCmd_Register("drawObj", WRAP_METHOD(MickeyConsole, Cmd_DrawObj));
+ registerCmd("room", WRAP_METHOD(MickeyConsole, Cmd_Room));
+ registerCmd("drawPic", WRAP_METHOD(MickeyConsole, Cmd_DrawPic));
+ registerCmd("drawObj", WRAP_METHOD(MickeyConsole, Cmd_DrawObj));
}
bool MickeyConsole::Cmd_Room(int argc, const char **argv) {
@@ -287,7 +287,7 @@ bool MickeyConsole::Cmd_Room(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]);
+ debugPrintf("Usage: %s <Picture number>\n", argv[0]);
else
_mickey->drawPic(atoi(argv[1]));
return true;
@@ -295,7 +295,7 @@ bool MickeyConsole::Cmd_DrawPic(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]);
+ debugPrintf("Usage: %s <Object number>\n", argv[0]);
else
_mickey->drawObj((ENUM_MSA_OBJECT)atoi(argv[1]), 0, 0);
return true;
@@ -304,7 +304,7 @@ bool MickeyConsole::Cmd_DrawObj(int argc, const char **argv) {
WinnieConsole::WinnieConsole(WinnieEngine *winnie) : GUI::Debugger() {
_winnie = winnie;
- DCmd_Register("curRoom", WRAP_METHOD(WinnieConsole, Cmd_CurRoom));
+ registerCmd("curRoom", WRAP_METHOD(WinnieConsole, Cmd_CurRoom));
}
bool WinnieConsole::Cmd_CurRoom(int argc, const char **argv) {
diff --git a/engines/agi/console.h b/engines/agi/console.h
index f8025e0562..6e86067373 100644
--- a/engines/agi/console.h
+++ b/engines/agi/console.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/agi/cycle.cpp b/engines/agi/cycle.cpp
index 702ca907d7..6b34605364 100644
--- a/engines/agi/cycle.cpp
+++ b/engines/agi/cycle.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/agi/detection.cpp b/engines/agi/detection.cpp
index 3f55117868..1d58900056 100644
--- a/engines/agi/detection.cpp
+++ b/engines/agi/detection.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/agi/detection_tables.h b/engines/agi/detection_tables.h
index f1bb079ffc..2d7fba3507 100644
--- a/engines/agi/detection_tables.h
+++ b/engines/agi/detection_tables.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -846,9 +846,11 @@ static const AGIGameDescription gameDescriptions[] = {
FANMADE("Time Quest (Demo v0.1)", "12e1a6f03ea4b8c5531acd0400b4ed8d"),
FANMADE("Time Quest (Demo v0.2)", "7b710608abc99e0861ac59b967bf3f6d"),
FANMADE_SVP("Time Quest", "90314f473d8317be5cd1f0306f139aea", 300, 0x2440, Common::kPlatformCoCo3),
+ FANMADE("Toby's World (Demo)", "3f8ebea0eb32303e65e2a6e8341c6741"),
FANMADE("Tonight The Shrieking Corpses Bleed (Demo v0.11)", "bcc57a7c8d563fa0c333107ae1c0a6e6"),
FANMADE("Tonight The Shrieking Corpses Bleed (v1.01)", "36b38f621b38e8d104aa0807302dc8c9"),
FANMADE("Turks' Quest - Heir to the Planet", "3d19254b737c8b218e5bc4580542b79a"),
+ FANMADE("Ultimate AGI Fangame (Demo)", "2d14d6fa2a2136d681e46e06821905bf"),
FANMADE("URI Quest (v0.173 Feb 27)", "3986eefcf546dafc45f920ae91a697c3"),
FANMADE("URI Quest (v0.173 Jan 29)", "494150940d34130605a4f2e67ee40b12"),
{
diff --git a/engines/agi/font.h b/engines/agi/font.h
index c2516d3520..c77d8cf0c3 100644
--- a/engines/agi/font.h
+++ b/engines/agi/font.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/agi/global.cpp b/engines/agi/global.cpp
index fdece0737e..7d55316d7b 100644
--- a/engines/agi/global.cpp
+++ b/engines/agi/global.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/agi/graphics.cpp b/engines/agi/graphics.cpp
index 4bb3877f7d..34651c70b2 100644
--- a/engines/agi/graphics.cpp
+++ b/engines/agi/graphics.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/agi/graphics.h b/engines/agi/graphics.h
index 037dacd8de..15668fbed3 100644
--- a/engines/agi/graphics.h
+++ b/engines/agi/graphics.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/agi/id.cpp b/engines/agi/id.cpp
index dd370d4189..c35ff36488 100644
--- a/engines/agi/id.cpp
+++ b/engines/agi/id.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/agi/inv.cpp b/engines/agi/inv.cpp
index a165a32b29..f1e4e5094b 100644
--- a/engines/agi/inv.cpp
+++ b/engines/agi/inv.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/agi/keyboard.cpp b/engines/agi/keyboard.cpp
index b7e52f4dc3..0aa521bdc8 100644
--- a/engines/agi/keyboard.cpp
+++ b/engines/agi/keyboard.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/agi/keyboard.h b/engines/agi/keyboard.h
index 665ee6a62c..89d6a89ce3 100644
--- a/engines/agi/keyboard.h
+++ b/engines/agi/keyboard.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/agi/loader_v1.cpp b/engines/agi/loader_v1.cpp
index 3b862ed91f..404fb6ee0e 100644
--- a/engines/agi/loader_v1.cpp
+++ b/engines/agi/loader_v1.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/agi/loader_v2.cpp b/engines/agi/loader_v2.cpp
index 458927a3bc..787eeaa0c7 100644
--- a/engines/agi/loader_v2.cpp
+++ b/engines/agi/loader_v2.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/agi/loader_v3.cpp b/engines/agi/loader_v3.cpp
index 1dd00dc18e..fa135e5476 100644
--- a/engines/agi/loader_v3.cpp
+++ b/engines/agi/loader_v3.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/agi/logic.cpp b/engines/agi/logic.cpp
index 22798ba831..7429b117c8 100644
--- a/engines/agi/logic.cpp
+++ b/engines/agi/logic.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/agi/logic.h b/engines/agi/logic.h
index 14137f01d2..a30a37bc47 100644
--- a/engines/agi/logic.h
+++ b/engines/agi/logic.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/agi/lzw.cpp b/engines/agi/lzw.cpp
index a00281bd49..ba47c13543 100644
--- a/engines/agi/lzw.cpp
+++ b/engines/agi/lzw.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/agi/lzw.h b/engines/agi/lzw.h
index c732491e8e..26db1bbf14 100644
--- a/engines/agi/lzw.h
+++ b/engines/agi/lzw.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/agi/menu.cpp b/engines/agi/menu.cpp
index d23a5a2e27..008c208c82 100644
--- a/engines/agi/menu.cpp
+++ b/engines/agi/menu.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/agi/menu.h b/engines/agi/menu.h
index 1d5828d78a..000973db23 100644
--- a/engines/agi/menu.h
+++ b/engines/agi/menu.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/agi/motion.cpp b/engines/agi/motion.cpp
index e4de232267..363291ac0b 100644
--- a/engines/agi/motion.cpp
+++ b/engines/agi/motion.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/agi/objects.cpp b/engines/agi/objects.cpp
index 447cff2a3f..27cde61065 100644
--- a/engines/agi/objects.cpp
+++ b/engines/agi/objects.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/agi/op_cmd.cpp b/engines/agi/op_cmd.cpp
index 2366d97a82..662454f3c1 100644
--- a/engines/agi/op_cmd.cpp
+++ b/engines/agi/op_cmd.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/agi/op_dbg.cpp b/engines/agi/op_dbg.cpp
index 87e235cf17..997da9db7d 100644
--- a/engines/agi/op_dbg.cpp
+++ b/engines/agi/op_dbg.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/agi/op_test.cpp b/engines/agi/op_test.cpp
index 18861a2190..9839f0ec90 100644
--- a/engines/agi/op_test.cpp
+++ b/engines/agi/op_test.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/agi/opcodes.cpp b/engines/agi/opcodes.cpp
index d893e44c12..621fbb8e82 100644
--- a/engines/agi/opcodes.cpp
+++ b/engines/agi/opcodes.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/agi/opcodes.h b/engines/agi/opcodes.h
index 7f0f287550..6bd31c339a 100644
--- a/engines/agi/opcodes.h
+++ b/engines/agi/opcodes.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/agi/picture.cpp b/engines/agi/picture.cpp
index 47e40fb5f1..58dfb9db68 100644
--- a/engines/agi/picture.cpp
+++ b/engines/agi/picture.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/agi/picture.h b/engines/agi/picture.h
index 45a95202e5..9ff1e742f4 100644
--- a/engines/agi/picture.h
+++ b/engines/agi/picture.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/agi/preagi.cpp b/engines/agi/preagi.cpp
index 0b5afc7f8c..daadb5ffef 100644
--- a/engines/agi/preagi.cpp
+++ b/engines/agi/preagi.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/agi/preagi.h b/engines/agi/preagi.h
index 5d50fb5af8..c2962b09b3 100644
--- a/engines/agi/preagi.h
+++ b/engines/agi/preagi.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/agi/preagi_mickey.cpp b/engines/agi/preagi_mickey.cpp
index d0f6540651..4ca8d00824 100644
--- a/engines/agi/preagi_mickey.cpp
+++ b/engines/agi/preagi_mickey.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -2228,10 +2228,10 @@ void MickeyEngine::waitAnyKey(bool anim) {
// Console-related functions
void MickeyEngine::debugCurRoom() {
- _console->DebugPrintf("Current Room = %d\n", _gameStateMickey.iRoom);
+ _console->debugPrintf("Current Room = %d\n", _gameStateMickey.iRoom);
if (_gameStateMickey.iRmObj[_gameStateMickey.iRoom] != IDI_MSA_OBJECT_NONE) {
- _console->DebugPrintf("Object %d is in the room\n", _gameStateMickey.iRmObj[_gameStateMickey.iRoom]);
+ _console->debugPrintf("Object %d is in the room\n", _gameStateMickey.iRmObj[_gameStateMickey.iRoom]);
}
}
diff --git a/engines/agi/preagi_mickey.h b/engines/agi/preagi_mickey.h
index 18b0593d78..55b3633c8c 100644
--- a/engines/agi/preagi_mickey.h
+++ b/engines/agi/preagi_mickey.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/agi/preagi_troll.cpp b/engines/agi/preagi_troll.cpp
index 17d980dfd8..2889407c85 100644
--- a/engines/agi/preagi_troll.cpp
+++ b/engines/agi/preagi_troll.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/agi/preagi_troll.h b/engines/agi/preagi_troll.h
index c14a7872c2..41ddbea166 100644
--- a/engines/agi/preagi_troll.h
+++ b/engines/agi/preagi_troll.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/agi/preagi_winnie.cpp b/engines/agi/preagi_winnie.cpp
index 1be385be37..a91ad24fc6 100644
--- a/engines/agi/preagi_winnie.cpp
+++ b/engines/agi/preagi_winnie.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -1308,7 +1308,7 @@ void WinnieEngine::printStrWinnie(char *szMsg) {
// Console-related functions
void WinnieEngine::debugCurRoom() {
- _console->DebugPrintf("Current Room = %d\n", _room);
+ _console->debugPrintf("Current Room = %d\n", _room);
}
WinnieEngine::WinnieEngine(OSystem *syst, const AGIGameDescription *gameDesc) : PreAgiEngine(syst, gameDesc) {
diff --git a/engines/agi/preagi_winnie.h b/engines/agi/preagi_winnie.h
index f34c80cec1..b5e8b8d10b 100644
--- a/engines/agi/preagi_winnie.h
+++ b/engines/agi/preagi_winnie.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/agi/saveload.cpp b/engines/agi/saveload.cpp
index c449f076e7..41a7a943ff 100644
--- a/engines/agi/saveload.cpp
+++ b/engines/agi/saveload.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/agi/sound.cpp b/engines/agi/sound.cpp
index 56c7ebcb0b..8f678cbac9 100644
--- a/engines/agi/sound.cpp
+++ b/engines/agi/sound.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/agi/sound.h b/engines/agi/sound.h
index f300af83a3..992feb1186 100644
--- a/engines/agi/sound.h
+++ b/engines/agi/sound.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/agi/sound_2gs.cpp b/engines/agi/sound_2gs.cpp
index f088ad3a01..b940eed762 100644
--- a/engines/agi/sound_2gs.cpp
+++ b/engines/agi/sound_2gs.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/agi/sound_2gs.h b/engines/agi/sound_2gs.h
index 12e7b7b951..8a1999c8eb 100644
--- a/engines/agi/sound_2gs.h
+++ b/engines/agi/sound_2gs.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/agi/sound_coco3.cpp b/engines/agi/sound_coco3.cpp
index 64818e4e34..3cd79a1154 100644
--- a/engines/agi/sound_coco3.cpp
+++ b/engines/agi/sound_coco3.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/agi/sound_coco3.h b/engines/agi/sound_coco3.h
index d24acf5cc5..078495b5ed 100644
--- a/engines/agi/sound_coco3.h
+++ b/engines/agi/sound_coco3.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/agi/sound_midi.cpp b/engines/agi/sound_midi.cpp
index 24e3ca8fb7..35dc896789 100644
--- a/engines/agi/sound_midi.cpp
+++ b/engines/agi/sound_midi.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/agi/sound_midi.h b/engines/agi/sound_midi.h
index ac1b100b12..e026e26594 100644
--- a/engines/agi/sound_midi.h
+++ b/engines/agi/sound_midi.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/agi/sound_pcjr.cpp b/engines/agi/sound_pcjr.cpp
index 5bffca5765..51b2d067a4 100644
--- a/engines/agi/sound_pcjr.cpp
+++ b/engines/agi/sound_pcjr.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/agi/sound_pcjr.h b/engines/agi/sound_pcjr.h
index 1b4d1e9efb..7f84112345 100644
--- a/engines/agi/sound_pcjr.h
+++ b/engines/agi/sound_pcjr.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/agi/sound_sarien.cpp b/engines/agi/sound_sarien.cpp
index 576801bc56..98479f3edc 100644
--- a/engines/agi/sound_sarien.cpp
+++ b/engines/agi/sound_sarien.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/agi/sound_sarien.h b/engines/agi/sound_sarien.h
index 04f274ca7d..1c4dbb7bca 100644
--- a/engines/agi/sound_sarien.h
+++ b/engines/agi/sound_sarien.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/agi/sprite.cpp b/engines/agi/sprite.cpp
index ea2d329fb0..92f88d8fcb 100644
--- a/engines/agi/sprite.cpp
+++ b/engines/agi/sprite.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/agi/sprite.h b/engines/agi/sprite.h
index 851c2438fb..549eb59832 100644
--- a/engines/agi/sprite.h
+++ b/engines/agi/sprite.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/agi/text.cpp b/engines/agi/text.cpp
index 4877be2647..eb48857bf2 100644
--- a/engines/agi/text.cpp
+++ b/engines/agi/text.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/agi/view.cpp b/engines/agi/view.cpp
index 3f3686561e..6a274a1b73 100644
--- a/engines/agi/view.cpp
+++ b/engines/agi/view.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/agi/view.h b/engines/agi/view.h
index 5cf59d7df5..b82fbe04d7 100644
--- a/engines/agi/view.h
+++ b/engines/agi/view.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/agi/wagparser.cpp b/engines/agi/wagparser.cpp
index 644ca7c103..0b49866531 100644
--- a/engines/agi/wagparser.cpp
+++ b/engines/agi/wagparser.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/agi/wagparser.h b/engines/agi/wagparser.h
index 81cfecef1b..8f900c9ab8 100644
--- a/engines/agi/wagparser.h
+++ b/engines/agi/wagparser.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/agi/words.cpp b/engines/agi/words.cpp
index f423995de8..ff9049fdc5 100644
--- a/engines/agi/words.cpp
+++ b/engines/agi/words.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/agos/agos.cpp b/engines/agos/agos.cpp
index 359a6f7289..6eda2eb9aa 100644
--- a/engines/agos/agos.cpp
+++ b/engines/agos/agos.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -21,6 +21,7 @@
*/
#include "common/config-manager.h"
+#include "common/debug-channels.h"
#include "common/file.h"
#include "common/fs.h"
#include "common/textconsole.h"
@@ -144,6 +145,14 @@ AGOSEngine_Elvira1::AGOSEngine_Elvira1(OSystem *system, const AGOSGameDescriptio
AGOSEngine::AGOSEngine(OSystem *system, const AGOSGameDescription *gd)
: Engine(system), _rnd("agos"), _gameDescription(gd) {
+ DebugMan.addDebugChannel(kDebugOpcode, "opcode", "Opcode debug level");
+ DebugMan.addDebugChannel(kDebugVGAOpcode, "vga_opcode", "VGA Opcode debug level");
+ DebugMan.addDebugChannel(kDebugSubroutine, "subroutine", "Subroutine debug level");
+ DebugMan.addDebugChannel(kDebugVGAScript, "vga_script", "VGA Script debug level");
+ //Image dumping command disabled as it doesn't work well
+#if 0
+ DebugMan.addDebugChannel(kDebugImageDump, "image_dump", "Enable dumping of images to files");
+#endif
_vcPtr = 0;
_vcGetOutOfCode = 0;
_gameOffsetsPtr = 0;
@@ -243,13 +252,6 @@ AGOSEngine::AGOSEngine(OSystem *system, const AGOSGameDescription *gd)
_backFlag = false;
- _debugMode = 0;
- _dumpScripts = false;
- _dumpOpcodes = false;
- _dumpVgaScripts = false;
- _dumpVgaOpcodes = false;
- _dumpImages = false;
-
_copyProtection = false;
_pause = false;
_speech = false;
@@ -510,6 +512,7 @@ AGOSEngine::AGOSEngine(OSystem *system, const AGOSGameDescription *gd)
_saveLoadType = 0;
_saveLoadSlot = 0;
memset(_saveLoadName, 0, sizeof(_saveLoadName));
+ memset(_saveBuf, 0, sizeof(_saveBuf));
_saveGameNameLen = 0;
_saveLoadRowCurPos = 0;
@@ -550,7 +553,7 @@ AGOSEngine::AGOSEngine(OSystem *system, const AGOSGameDescription *gd)
SearchMan.addSubDirectoryMatching(gameDataDir, "execute");
// Add default file directories for Amiga/Macintosh
- // verisons of Simon the Sorcerer 2
+ // versions of Simon the Sorcerer 2
SearchMan.addSubDirectoryMatching(gameDataDir, "voices");
// Add default file directories for Amiga & Macintosh
@@ -674,15 +677,6 @@ Common::Error AGOSEngine::init() {
_subtitles = true;
}
- // TODO: Use special debug levels instead of the following hack.
- _debugMode = (gDebugLevel >= 0);
- 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;
}
diff --git a/engines/agos/agos.h b/engines/agos/agos.h
index 87a1228c6a..b6b5e427e1 100644
--- a/engines/agos/agos.h
+++ b/engines/agos/agos.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -25,7 +25,6 @@
#include "engines/engine.h"
-#include "common/archive.h"
#include "common/array.h"
#include "common/error.h"
#include "common/keyboard.h"
@@ -62,6 +61,14 @@ struct Surface;
namespace AGOS {
+enum {
+ kDebugOpcode = 1 << 0,
+ kDebugVGAOpcode = 1 << 1,
+ kDebugSubroutine = 1 << 2,
+ kDebugVGAScript = 1 << 3,
+ kDebugImageDump = 1 << 4
+};
+
uint fileReadItemID(Common::SeekableReadStream *in);
#define CHECK_BOUNDS(x, y) assert((uint)(x) < ARRAYSIZE(y))
@@ -187,27 +194,6 @@ 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
-
- virtual bool hasFile(const Common::String &name) const;
- virtual int listMatchingMembers(Common::ArchiveMemberList &list, const Common::String &pattern) const;
- virtual int listMembers(Common::ArchiveMemberList &list) const;
-
- virtual const Common::ArchiveMemberPtr getMember(const Common::String &name) const;
- virtual Common::SeekableReadStream *createReadStreamForMember(const Common::String &filename) const;
-
-private:
- bool _fallBack;
-};
-
class AGOSEngine : public Engine {
protected:
friend class Debugger;
@@ -346,15 +332,9 @@ protected:
bool _fastMode;
bool _backFlag;
- uint16 _debugMode;
Common::Language _language;
bool _copyProtection;
bool _pause;
- bool _dumpScripts;
- bool _dumpOpcodes;
- bool _dumpVgaScripts;
- bool _dumpVgaOpcodes;
- bool _dumpImages;
bool _speech;
bool _subtitles;
bool _vgaVar9;
@@ -606,6 +586,7 @@ protected:
byte _saveLoadType, _saveLoadSlot;
char _saveLoadName[108];
+ char _saveBuf[200];
Graphics::Surface *_backGroundBuf;
Graphics::Surface *_backBuf;
@@ -622,8 +603,6 @@ public:
AGOSEngine(OSystem *system, const AGOSGameDescription *gd);
virtual ~AGOSEngine();
- ArchiveMan _archives;
-
byte *_curSfxFile;
uint32 _curSfxFileSize;
uint16 _sampleEnd, _sampleWait;
@@ -858,6 +837,9 @@ protected:
void displayBoxStars();
void invertBox(HitArea * ha, byte a, byte b, byte c, byte d);
+ virtual void handleMouseWheelUp();
+ virtual void handleMouseWheelDown();
+
virtual void initMouse();
virtual void handleMouseMoved();
virtual void drawMousePointer();
@@ -1730,10 +1712,13 @@ protected:
void setExitState(Item *i, uint16 n, uint16 d, uint16 s);
void setSRExit(Item *i, int n, int d, uint16 s);
- virtual void listSaveGames(char *dst);
+ virtual void handleMouseWheelUp();
+ virtual void handleMouseWheelDown();
+
+ virtual void listSaveGames();
virtual bool confirmOverWrite(WindowBlock *window);
virtual void userGame(bool load);
- virtual int userGameGetKey(bool *b, char *buf, uint maxChar);
+ virtual int userGameGetKey(bool *b, uint maxChar);
virtual Common::String genSaveName(int slot) const;
};
@@ -1853,6 +1838,9 @@ protected:
virtual void clearName();
+ virtual void handleMouseWheelUp();
+ virtual void handleMouseWheelDown();
+
virtual void drawIcon(WindowBlock *window, uint icon, uint x, uint y);
virtual void initMouse();
@@ -1865,9 +1853,9 @@ protected:
virtual void playSpeech(uint16 speechId, uint16 vgaSpriteId);
- virtual void listSaveGames(char *dst);
+ virtual void listSaveGames();
virtual void userGame(bool load);
- virtual int userGameGetKey(bool *b, char *buf, uint maxChar);
+ virtual int userGameGetKey(bool *b, uint maxChar);
virtual void playMusic(uint16 music, uint16 track);
@@ -1951,6 +1939,7 @@ public:
void off_listSaveGames();
void off_checkCD();
void off_screenTextBox();
+ void off_b2Set();
void off_isAdjNoun();
void off_hyperLinkOn();
void off_hyperLinkOff();
@@ -1993,12 +1982,17 @@ protected:
virtual uint16 readUint16Wrapper(const void *src);
virtual uint32 readUint32Wrapper(const void *src);
+ void setLoyaltyRating(byte rating);
+
void playVideo(const char *filename, bool lastSceneUsed = false);
void stopInteractiveVideo();
virtual void drawImage(VC10_state *state);
void scaleClip(int16 h, int16 w, int16 y, int16 x, int16 scrollY);
+ virtual void handleMouseWheelUp();
+ virtual void handleMouseWheelDown();
+
void drawMousePart(int image, byte x, byte y);
virtual void initMouse();
virtual void drawMousePointer();
diff --git a/engines/agos/animation.cpp b/engines/agos/animation.cpp
index 40c9d1d049..83682d567b 100644
--- a/engines/agos/animation.cpp
+++ b/engines/agos/animation.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -251,8 +251,8 @@ bool MoviePlayerDXA::load() {
}
Common::String videoName = Common::String::format("%s.dxa", baseName);
- Common::SeekableReadStream *videoStream = _vm->_archives.createReadStreamForMember(videoName);
- if (!videoStream)
+ Common::File *videoStream = new Common::File();
+ if (!videoStream->open(videoName))
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());
@@ -287,7 +287,7 @@ void MoviePlayerDXA::copyFrameToBuffer(byte *dst, uint x, uint y, uint pitch) {
void MoviePlayerDXA::playVideo() {
// Most of the videos included in the Amiga version, reduced the
- // resoluton to 384 x 280, so require the screen to be cleared,
+ // resolution to 384 x 280, so require the screen to be cleared,
// before starting playing those videos.
if (getWidth() == 384 && getHeight() == 280) {
_vm->clearSurfaces();
@@ -421,8 +421,8 @@ MoviePlayerSMK::MoviePlayerSMK(AGOSEngine_Feeble *vm, const char *name)
bool MoviePlayerSMK::load() {
Common::String videoName = Common::String::format("%s.smk", baseName);
- Common::SeekableReadStream *videoStream = _vm->_archives.createReadStreamForMember(videoName);
- if (!videoStream)
+ Common::File *videoStream = new Common::File();
+ if (!videoStream->open(videoName))
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());
@@ -532,25 +532,25 @@ MoviePlayer *makeMoviePlayer(AGOSEngine_Feeble *vm, const char *name) {
memcpy(shortName, baseName, 6);
sprintf(filename, "%s~1.dxa", shortName);
- if (vm->_archives.hasFile(filename)) {
+ if (Common::File::exists(filename)) {
memset(baseName, 0, sizeof(baseName));
memcpy(baseName, filename, 8);
}
sprintf(filename, "%s~1.smk", shortName);
- if (vm->_archives.hasFile(filename)) {
+ if (Common::File::exists(filename)) {
memset(baseName, 0, sizeof(baseName));
memcpy(baseName, filename, 8);
}
}
sprintf(filename, "%s.dxa", baseName);
- if (vm->_archives.hasFile(filename)) {
+ if (Common::File::exists(filename)) {
return new MoviePlayerDXA(vm, baseName);
}
sprintf(filename, "%s.smk", baseName);
- if (vm->_archives.hasFile(filename)) {
+ if (Common::File::exists(filename)) {
return new MoviePlayerSMK(vm, baseName);
}
diff --git a/engines/agos/animation.h b/engines/agos/animation.h
index 9e31fced6d..86808cbc27 100644
--- a/engines/agos/animation.h
+++ b/engines/agos/animation.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/agos/charset-fontdata.cpp b/engines/agos/charset-fontdata.cpp
index b6b90eefcc..ae31814e43 100644
--- a/engines/agos/charset-fontdata.cpp
+++ b/engines/agos/charset-fontdata.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/agos/charset.cpp b/engines/agos/charset.cpp
index eca9728643..4d83a4ef1c 100644
--- a/engines/agos/charset.cpp
+++ b/engines/agos/charset.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/agos/configure.engine b/engines/agos/configure.engine
new file mode 100644
index 0000000000..3ae1fb16f2
--- /dev/null
+++ b/engines/agos/configure.engine
@@ -0,0 +1,4 @@
+# This file is included from the main "configure" script
+# add_engine [name] [desc] [build-by-default] [subengines] [base games] [deps]
+add_engine agos "AGOS" yes "agos2" "AGOS 1 games"
+add_engine agos2 "AGOS 2 games" yes
diff --git a/engines/agos/contain.cpp b/engines/agos/contain.cpp
index 173194d45e..0fab0a35f2 100644
--- a/engines/agos/contain.cpp
+++ b/engines/agos/contain.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/agos/cursor.cpp b/engines/agos/cursor.cpp
index 7c64d68048..65fdc9ec99 100644
--- a/engines/agos/cursor.cpp
+++ b/engines/agos/cursor.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/agos/debug.cpp b/engines/agos/debug.cpp
index 841ac6bb1a..ad5bfb56f4 100644
--- a/engines/agos/debug.cpp
+++ b/engines/agos/debug.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -101,7 +101,7 @@ const byte *AGOSEngine::dumpOpcode(const byte *p) {
}
case 'W':{
- int n = (int16)READ_BE_UINT16(p);
+ uint16 n = READ_BE_UINT16(p);
p += 2;
if (getGameType() == GType_PP) {
if (n >= 60000 && n < 62048)
@@ -222,14 +222,18 @@ void AGOSEngine::dumpVideoScript(const byte *src, bool singeOpcode) {
error("dumpVideoScript: Opcode %d out of range (%d)", opcode, _numVideoOpcodes);
}
- if (getGameType() == GType_FF || getGameType() == GType_PP) {
+ if (getGameType() == GType_PP) {
+ strn = str = puzzlepack_videoOpcodeNameTable[opcode];
+ } else if (getGameType() == GType_FF) {
strn = str = feeblefiles_videoOpcodeNameTable[opcode];
} else if (getGameType() == GType_SIMON2) {
strn = str = simon2_videoOpcodeNameTable[opcode];
} else if (getGameType() == GType_SIMON1) {
strn = str = simon1_videoOpcodeNameTable[opcode];
- } else if (getGameType() == GType_ELVIRA2 || getGameType() == GType_WW) {
+ } else if (getGameType() == GType_WW) {
strn = str = ww_videoOpcodeNameTable[opcode];
+ } else if (getGameType() == GType_ELVIRA2) {
+ strn = str = elvira2_videoOpcodeNameTable[opcode];
} else if (getGameType() == GType_ELVIRA1) {
strn = str = elvira1_videoOpcodeNameTable[opcode];
} else {
@@ -250,25 +254,39 @@ void AGOSEngine::dumpVideoScript(const byte *src, bool singeOpcode) {
case 'x':
debugN("\n");
return;
- case 'b':
+ case 'b': {
debugN("%d ", *src++);
break;
- case 'd':
+ }
+ case 'w': {
+ int16 v = (int16)readUint16Wrapper(src);
+ src += 2;
+ if (v < 0)
+ debugN("[%d] ", -v);
+ else
+ debugN("%d ", v);
+ break;
+ }
+ case 'd': {
debugN("%d ", (int16)readUint16Wrapper(src));
src += 2;
break;
- case 'v':
+ }
+ case 'v': {
debugN("[%d] ", readUint16Wrapper(src));
src += 2;
break;
- case 'i':
+ }
+ case 'i': {
debugN("%d ", (int16)readUint16Wrapper(src));
src += 2;
break;
- case 'j':
+ }
+ case 'j': {
debugN("-> ");
break;
- case 'q':
+ }
+ case 'q': {
while (readUint16Wrapper(src) != end) {
debugN("(%d,%d) ", readUint16Wrapper(src),
readUint16Wrapper(src + 2));
@@ -276,6 +294,7 @@ void AGOSEngine::dumpVideoScript(const byte *src, bool singeOpcode) {
}
src += 2;
break;
+ }
default:
error("dumpVideoScript: Invalid fmt string '%c' in decompile VGA", *str);
}
diff --git a/engines/agos/debug.h b/engines/agos/debug.h
index fe14ae4860..4d521de9b9 100644
--- a/engines/agos/debug.h
+++ b/engines/agos/debug.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -2468,7 +2468,7 @@ const char *const elvira1_videoOpcodeNameTable[] = {
"dd|DELAY_IF_NOT_EQ",
};
-const char *const ww_videoOpcodeNameTable[] = {
+const char *const elvira2_videoOpcodeNameTable[] = {
/* 0 */
"x|RET",
"ddd|FADEOUT",
@@ -2485,7 +2485,7 @@ const char *const ww_videoOpcodeNameTable[] = {
"dddd|DRAW",
"d|ON_STOP",
/* 12 */
- "d|DELAY",
+ "w|DELAY",
"d|SET_SPRITE_OFFSET_X",
"d|SET_SPRITE_OFFSET_Y",
"d|SYNC",
@@ -2551,11 +2551,94 @@ const char *const ww_videoOpcodeNameTable[] = {
"|FASTFADEIN",
};
+const char *const ww_videoOpcodeNameTable[] = {
+ /* 0 */
+ "x|RET",
+ "ddd|FADEOUT",
+ "w|CALL",
+ "ddddd|NEW_SPRITE",
+ /* 4 */
+ "ddd|FADEIN",
+ "vdj|IF_EQUAL",
+ "dj|IF_OBJECT_HERE",
+ "dj|IF_OBJECT_NOT_HERE",
+ /* 8 */
+ "ddj|IF_OBJECT_IS_AT",
+ "ddj|IF_OBJECT_STATE_IS",
+ "dddd|DRAW",
+ "d|ON_STOP",
+ /* 12 */
+ "w|DELAY",
+ "d|SET_SPRITE_OFFSET_X",
+ "d|SET_SPRITE_OFFSET_Y",
+ "d|SYNC",
+ /* 16 */
+ "d|WAIT_SYNC",
+ "d|WAIT_END",
+ "i|JUMP_REL",
+ "|CHAIN_TO",
+ /* 20 */
+ "dd|SET_REPEAT",
+ "i|END_REPEAT",
+ "d|SET_PALETTE",
+ "d|SET_PRIORITY",
+ /* 24 */
+ "wiid|SET_SPRITE_XY",
+ "x|HALT_SPRITE",
+ "ddddd|SET_WINDOW",
+ "|RESET",
+ /* 28 */
+ "dddd|PLAY_SOUND",
+ "|STOP_ALL_SOUNDS",
+ "d|SET_FRAME_RATE",
+ "d|SET_WINDOW",
+ /* 32 */
+ "|SAVE_SCREEN",
+ "|MOUSE_ON",
+ "|MOUSE_OFF",
+ "dd|CLEAR_WINDOW",
+ /* 36 */
+ "dd|SET_WINDOW_IMAGE",
+ "dd|POKE_PALETTE",
+ "vj|IF_VAR_NOT_ZERO",
+ "vd|SET_VAR",
+ /* 40 */
+ "vd|ADD_VAR",
+ "vd|SUB_VAR",
+ "vd|DELAY_IF_NOT_EQ",
+ "dj|IF_BIT_SET",
+ /* 44 */
+ "dj|IF_BIT_CLEAR",
+ "dd|SET_WINDOW_PALETTE",
+ "d|SET_PALETTE_SLOT1",
+ "d|SET_PALETTE_SLOT2",
+ /* 48 */
+ "d|SET_PALETTE_SLOT3",
+ "d|SET_BIT",
+ "d|CLEAR_BIT",
+ "d|ENABLE_BOX",
+ /* 52 */
+ "d|PLAY_EFFECT",
+ "dd|DISSOLVE_IN",
+ "ddd|DISSOLVE_OUT",
+ "ddd|MOVE_BOX",
+ /* 56 */
+ "|FULL_SCREEN",
+ "|BLACK_PALETTE",
+ "|CHECK_CODE_WHEEL",
+ "j|IF_EGA",
+ /* 60 */
+ "d|STOP_ANIMATE",
+ "d|INTRO",
+ "|FASTFADEOUT",
+ "|FASTFADEIN",
+};
+
const char *const simon1_videoOpcodeNameTable[] = {
/* 0 */
"x|RET",
"ddd|FADEOUT",
- "d|CALL",
+ "w|CALL",
"ddddd|NEW_SPRITE",
/* 4 */
"ddd|FADEIN",
@@ -2568,7 +2651,7 @@ const char *const simon1_videoOpcodeNameTable[] = {
"ddddd|DRAW",
"|CLEAR_PATHFIND_ARRAY",
/* 12 */
- "d|DELAY",
+ "w|DELAY",
"d|SET_SPRITE_OFFSET_X",
"d|SET_SPRITE_OFFSET_Y",
"d|SYNC",
@@ -2583,7 +2666,7 @@ const char *const simon1_videoOpcodeNameTable[] = {
"dd|SET_PALETTE",
"d|SET_PRIORITY",
/* 24 */
- "diid|SET_SPRITE_XY",
+ "wiid|SET_SPRITE_XY",
"x|HALT_SPRITE",
"ddddd|SET_WINDOW",
"|RESET",
@@ -2629,7 +2712,7 @@ const char *const simon1_videoOpcodeNameTable[] = {
"j|IF_SPEECH",
/* 60 */
"d|STOP_ANIMATE",
- "ddd|MASK",
+ "wdd|MASK",
"|FASTFADEOUT",
"|FASTFADEIN",
};
@@ -2638,7 +2721,7 @@ const char *const simon2_videoOpcodeNameTable[] = {
/* 0 */
"x|RET",
"ddd|FADEOUT",
- "d|CALL",
+ "w|CALL",
"dddddd|NEW_SPRITE",
/* 4 */
"ddd|FADEIN",
@@ -2666,7 +2749,7 @@ const char *const simon2_videoOpcodeNameTable[] = {
"dd|SET_PALETTE",
"d|SET_PRIORITY",
/* 24 */
- "diib|SET_SPRITE_XY",
+ "wiib|SET_SPRITE_XY",
"x|HALT_SPRITE",
"ddddd|SET_WINDOW",
"|RESET",
@@ -2706,13 +2789,13 @@ const char *const simon2_videoOpcodeNameTable[] = {
"ddd|DUMMY_54",
"ddd|MOVE_BOX",
/* 56 */
- "i|WAIT_BIG",
+ "w|WAIT_BIG",
"|BLACK_PALETTE",
"ddd|SET_PRIORITIES",
"ddd|STOP_ANIMATIONS",
/* 60 */
"dd|STOP_ANIMATE",
- "ddd|MASK",
+ "wdd|MASK",
"|FASTFADEOUT",
"|FASTFADEIN",
/* 64 */
@@ -2735,7 +2818,7 @@ const char *const feeblefiles_videoOpcodeNameTable[] = {
/* 0 */
"x|RET",
"ddd|FADEOUT",
- "d|CALL",
+ "w|CALL",
"dddddd|NEW_SPRITE",
/* 4 */
"ddd|FADEIN",
@@ -2763,7 +2846,7 @@ const char *const feeblefiles_videoOpcodeNameTable[] = {
"dd|SET_PALETTE",
"d|SET_PRIORITY",
/* 24 */
- "diib|SET_SPRITE_XY",
+ "wiib|SET_SPRITE_XY",
"x|HALT_SPRITE",
"ddddd|SET_WINDOW",
"|RESET",
@@ -2803,7 +2886,116 @@ const char *const feeblefiles_videoOpcodeNameTable[] = {
"ddd|DUMMY_54",
"ddd|MOVE_BOX",
/* 56 */
- "i|WAIT_BIG",
+ "w|WAIT_BIG",
+ "|BLACK_PALETTE",
+ "ddd|SET_PRIORITIES",
+ "ddd|STOP_ANIMATIONS",
+ /* 60 */
+ "dd|STOP_ANIMATE",
+ "wdd|MASK",
+ "|FASTFADEOUT",
+ "|FASTFADEIN",
+ /* 64 */
+ "j|IF_SPEECH",
+ "|SLOW_FADE_IN",
+ "ddj|IF_VAR_EQUAL",
+ "ddj|IF_VAR_LE",
+ /* 68 */
+ "ddj|IF_VAR_GE",
+ "dd|PLAY_SEQ",
+ "dd|JOIN_SEQ",
+ "|IF_SEQ_WAITING",
+ /* 72 */
+ "dd|SEQUE",
+ "bb|SET_MARK",
+ "bb|CLEAR_MARK",
+ "dd|SETSCALE",
+ /* 76 */
+ "ddd|SETSCALEXOFFS",
+ "ddd|SETSCALEYOFFS",
+ "|COMPUTEXY",
+ "|COMPUTEPOSNUM",
+ /* 80 */
+ "wdd|SETOVERLAYIMAGE",
+ "dd|SETRANDOM",
+ "d|GETPATHVALUE",
+ "ddd|PLAYSOUNDLOOP",
+ "|STOPSOUNDLOOP",
+};
+
+const char *const puzzlepack_videoOpcodeNameTable[] = {
+ /* 0 */
+ "x|RET",
+ "ddd|FADEOUT",
+ "w|CALL",
+ "dddddd|NEW_SPRITE",
+ /* 4 */
+ "ddd|FADEIN",
+ "wdj|IF_EQUAL",
+ "dj|IF_OBJECT_HERE",
+ "dj|IF_OBJECT_NOT_HERE",
+ /* 8 */
+ "ddj|IF_OBJECT_IS_AT",
+ "ddj|IF_OBJECT_STATE_IS",
+ "ddddb|DRAW",
+ "|CLEAR_PATHFIND_ARRAY",
+ /* 12 */
+ "b|DELAY",
+ "d|SET_SPRITE_OFFSET_X",
+ "d|SET_SPRITE_OFFSET_Y",
+ "d|SYNC",
+ /* 16 */
+ "d|WAIT_SYNC",
+ "dq|SET_PATHFIND_ITEM",
+ "i|JUMP_REL",
+ "|CHAIN_TO",
+ /* 20 */
+ "dd|SET_REPEAT",
+ "i|END_REPEAT",
+ "dd|SET_PALETTE",
+ "d|SET_PRIORITY",
+ /* 24 */
+ "wiib|SET_SPRITE_XY",
+ "x|HALT_SPRITE",
+ "ddddd|SET_WINDOW",
+ "|RESET",
+ /* 28 */
+ "dddd|PLAY_SOUND",
+ "|STOP_ALL_SOUNDS",
+ "d|SET_FRAME_RATE",
+ "d|SET_WINDOW",
+ /* 32 */
+ "vv|COPY_VAR",
+ "|MOUSE_ON",
+ "|MOUSE_OFF",
+ "dd|CLEAR_WINDOW",
+ /* 36 */
+ "dd|SET_WINDOW_IMAGE",
+ "v|SET_SPRITE_OFFSET_Y",
+ "wj|IF_VAR_NOT_ZERO",
+ "wd|SET_VAR",
+ /* 40 */
+ "vd|ADD_VAR",
+ "vd|SUB_VAR",
+ "vd|DELAY_IF_NOT_EQ",
+ "dj|IF_BIT_SET",
+ /* 44 */
+ "dj|IF_BIT_CLEAR",
+ "v|SET_SPRITE_X",
+ "v|SET_SPRITE_Y",
+ "vv|ADD_VAR_F",
+ /* 48 */
+ "|COMPUTE_YOFS",
+ "d|SET_BIT",
+ "d|CLEAR_BIT",
+ "d|ENABLE_BOX",
+ /* 52 */
+ "ddd|PLAY_EFFECT",
+ "ddd|PAN_SFX",
+ "ddd|DUMMY_54",
+ "ddd|MOVE_BOX",
+ /* 56 */
+ "w|WAIT_BIG",
"|BLACK_PALETTE",
"ddd|SET_PRIORITIES",
"ddd|STOP_ANIMATIONS",
@@ -2833,7 +3025,7 @@ const char *const feeblefiles_videoOpcodeNameTable[] = {
"|COMPUTEXY",
"|COMPUTEPOSNUM",
/* 80 */
- "ddd|SETOVERLAYIMAGE",
+ "wdd|SETOVERLAYIMAGE",
"dd|SETRANDOM",
"d|GETPATHVALUE",
"ddd|PLAYSOUNDLOOP",
diff --git a/engines/agos/debugger.cpp b/engines/agos/debugger.cpp
index fc24c6d363..7ad742c928 100644
--- a/engines/agos/debugger.cpp
+++ b/engines/agos/debugger.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -32,42 +32,19 @@ Debugger::Debugger(AGOSEngine *vm)
: GUI::Debugger() {
_vm = vm;
- DCmd_Register("continue", WRAP_METHOD(Debugger, Cmd_Exit));
- DCmd_Register("level", WRAP_METHOD(Debugger, Cmd_DebugLevel));
- DCmd_Register("music", WRAP_METHOD(Debugger, Cmd_PlayMusic));
- DCmd_Register("sound", WRAP_METHOD(Debugger, Cmd_PlaySound));
- DCmd_Register("voice", WRAP_METHOD(Debugger, Cmd_PlayVoice));
- DCmd_Register("bit", WRAP_METHOD(Debugger, Cmd_SetBit));
- DCmd_Register("bit2", WRAP_METHOD(Debugger, Cmd_SetBit2));
- DCmd_Register("bit3", WRAP_METHOD(Debugger, Cmd_SetBit3));
- DCmd_Register("var", WRAP_METHOD(Debugger, Cmd_SetVar));
- DCmd_Register("obj", WRAP_METHOD(Debugger, Cmd_SetObjectFlag));
- DCmd_Register("sub", WRAP_METHOD(Debugger, Cmd_StartSubroutine));
- DCmd_Register("dumpimage", WRAP_METHOD(Debugger, Cmd_dumpImage));
- DCmd_Register("dumpscript", WRAP_METHOD(Debugger, Cmd_dumpScript));
-
-}
-
-
-bool Debugger::Cmd_DebugLevel(int argc, const char **argv) {
- if (argc == 1) {
- if (_vm->_debugMode == false)
- DebugPrintf("Debugging is not enabled at this time\n");
- else
- DebugPrintf("Debugging is currently set at level %d\n", gDebugLevel);
- } else { // set level
- gDebugLevel = atoi(argv[1]);
- if (0 <= gDebugLevel && gDebugLevel < 11) {
- _vm->_debugMode = true;
- DebugPrintf("Debug level set to level %d\n", gDebugLevel);
- } else if (gDebugLevel < 0) {
- _vm->_debugMode = false;
- DebugPrintf("Debugging is now disabled\n");
- } else
- DebugPrintf("Not a valid debug level (0 - 10)\n");
- }
+ registerCmd("continue", WRAP_METHOD(Debugger, cmdExit));
+ registerCmd("music", WRAP_METHOD(Debugger, Cmd_PlayMusic));
+ registerCmd("sound", WRAP_METHOD(Debugger, Cmd_PlaySound));
+ registerCmd("voice", WRAP_METHOD(Debugger, Cmd_PlayVoice));
+ registerCmd("bit", WRAP_METHOD(Debugger, Cmd_SetBit));
+ registerCmd("bit2", WRAP_METHOD(Debugger, Cmd_SetBit2));
+ registerCmd("bit3", WRAP_METHOD(Debugger, Cmd_SetBit3));
+ registerCmd("var", WRAP_METHOD(Debugger, Cmd_SetVar));
+ registerCmd("obj", WRAP_METHOD(Debugger, Cmd_SetObjectFlag));
+ registerCmd("sub", WRAP_METHOD(Debugger, Cmd_StartSubroutine));
+ registerCmd("dumpimage", WRAP_METHOD(Debugger, Cmd_dumpImage));
+ registerCmd("dumpscript", WRAP_METHOD(Debugger, Cmd_dumpScript));
- return true;
}
bool Debugger::Cmd_PlayMusic(int argc, const char **argv) {
@@ -83,9 +60,9 @@ bool Debugger::Cmd_PlayMusic(int argc, const char **argv) {
_vm->playMusic(music, 0);
}
} else
- DebugPrintf("Music out of range (0 - %d)\n", _vm->_numMusic);
+ debugPrintf("Music out of range (0 - %d)\n", _vm->_numMusic);
} else
- DebugPrintf("Syntax: music <musicnum>\n");
+ debugPrintf("Syntax: music <musicnum>\n");
return true;
}
@@ -96,9 +73,9 @@ bool Debugger::Cmd_PlaySound(int argc, const char **argv) {
if (sound <= _vm->_numSFX)
_vm->_sound->playEffects(sound);
else
- DebugPrintf("Sound out of range (0 - %d)\n", _vm->_numSFX);
+ debugPrintf("Sound out of range (0 - %d)\n", _vm->_numSFX);
} else
- DebugPrintf("Syntax: sound <soundnum>\n");
+ debugPrintf("Syntax: sound <soundnum>\n");
return true;
}
@@ -109,9 +86,9 @@ bool Debugger::Cmd_PlayVoice(int argc, const char **argv) {
if (voice <= _vm->_numSpeech)
_vm->_sound->playVoice(voice);
else
- DebugPrintf("Voice out of range (0 - %d)\n", _vm->_numSpeech);
+ debugPrintf("Voice out of range (0 - %d)\n", _vm->_numSpeech);
} else
- DebugPrintf("Syntax: voice <voicenum>\n");
+ debugPrintf("Syntax: voice <voicenum>\n");
return true;
}
@@ -123,15 +100,15 @@ bool Debugger::Cmd_SetBit(int argc, const char **argv) {
value = atoi(argv[2]);
if (value <= 1) {
_vm->setBitFlag(bit, value != 0);
- DebugPrintf("Set bit %d to %d\n", bit, value);
+ debugPrintf("Set bit %d to %d\n", bit, value);
} else
- DebugPrintf("Bit value out of range (0 - 1)\n");
+ debugPrintf("Bit value out of range (0 - 1)\n");
} else if (argc > 1) {
bit = atoi(argv[1]);
value = _vm->getBitFlag(bit);
- DebugPrintf("Bit %d is %d\n", bit, value);
+ debugPrintf("Bit %d is %d\n", bit, value);
} else
- DebugPrintf("Syntax: bit <bitnum> <value>\n");
+ debugPrintf("Syntax: bit <bitnum> <value>\n");
return true;
}
@@ -143,18 +120,18 @@ bool Debugger::Cmd_SetBit2(int argc, const char **argv) {
value = atoi(argv[2]);
if (value == 0) {
_vm->_bitArrayTwo[bit / 16] &= ~(1 << (bit & 15));
- DebugPrintf("Set bit2 %d to %d\n", bit, value);
+ debugPrintf("Set bit2 %d to %d\n", bit, value);
} else if (value == 1) {
_vm->_bitArrayTwo[bit / 16] |= (1 << (bit & 15));
- DebugPrintf("Set bit2 %d to %d\n", bit, value);
+ debugPrintf("Set bit2 %d to %d\n", bit, value);
} else
- DebugPrintf("Bit2 value out of range (0 - 1)\n");
+ debugPrintf("Bit2 value out of range (0 - 1)\n");
} else if (argc > 1) {
bit = atoi(argv[1]);
value = (_vm->_bitArrayTwo[bit / 16] & (1 << (bit & 15))) != 0;
- DebugPrintf("Bit2 %d is %d\n", bit, value);
+ debugPrintf("Bit2 %d is %d\n", bit, value);
} else
- DebugPrintf("Syntax: bit2 <bitnum> <value>\n");
+ debugPrintf("Syntax: bit2 <bitnum> <value>\n");
return true;
}
@@ -166,18 +143,18 @@ bool Debugger::Cmd_SetBit3(int argc, const char **argv) {
value = atoi(argv[2]);
if (value == 0) {
_vm->_bitArrayThree[bit / 16] &= ~(1 << (bit & 15));
- DebugPrintf("Set bit3 %d to %d\n", bit, value);
+ debugPrintf("Set bit3 %d to %d\n", bit, value);
} else if (value == 1) {
_vm->_bitArrayThree[bit / 16] |= (1 << (bit & 15));
- DebugPrintf("Set bit3 %d to %d\n", bit, value);
+ debugPrintf("Set bit3 %d to %d\n", bit, value);
} else
- DebugPrintf("Bit3 value out of range (0 - 1)\n");
+ debugPrintf("Bit3 value out of range (0 - 1)\n");
} else if (argc > 1) {
bit = atoi(argv[1]);
value = (_vm->_bitArrayThree[bit / 16] & (1 << (bit & 15))) != 0;
- DebugPrintf("Bit3 %d is %d\n", bit, value);
+ debugPrintf("Bit3 %d is %d\n", bit, value);
} else
- DebugPrintf("Syntax: bit3 <bitnum> <value>\n");
+ debugPrintf("Syntax: bit3 <bitnum> <value>\n");
return true;
}
@@ -190,15 +167,15 @@ bool Debugger::Cmd_SetVar(int argc, const char **argv) {
if (argc > 2) {
value = atoi(argv[2]);
_vm->writeVariable(var, value);
- DebugPrintf("Set var %d to %d\n", var, value);
+ debugPrintf("Set var %d to %d\n", var, value);
} else {
value = _vm->readVariable(var);
- DebugPrintf("Var %d is %d\n", var, value);
+ debugPrintf("Var %d is %d\n", var, value);
}
} else
- DebugPrintf("Var out of range (0 - %d)\n", _vm->_numVars - 1);
+ debugPrintf("Var out of range (0 - %d)\n", _vm->_numVars - 1);
} else
- DebugPrintf("Syntax: var <varnum> <value>\n");
+ debugPrintf("Syntax: var <varnum> <value>\n");
return true;
}
@@ -217,22 +194,22 @@ bool Debugger::Cmd_SetObjectFlag(int argc, const char **argv) {
if (argc > 3) {
value = atoi(argv[3]);
o->objectFlagValue[offs] = value;
- DebugPrintf("Object %d Flag %d set to %d\n", obj, prop, value);
+ debugPrintf("Object %d Flag %d set to %d\n", obj, prop, value);
} else {
value = o->objectFlagValue[offs];
- DebugPrintf("Object %d Flag %d is %d\n", obj, prop, value);
+ debugPrintf("Object %d Flag %d is %d\n", obj, prop, value);
}
} else {
- DebugPrintf("Object flag out of range\n");
+ debugPrintf("Object flag out of range\n");
}
} else {
- DebugPrintf("Item isn't an object\n");
+ debugPrintf("Item isn't an object\n");
}
} else {
- DebugPrintf("Item out of range (1 - %d)\n", _vm->_itemArraySize - 1);
+ debugPrintf("Item out of range (1 - %d)\n", _vm->_itemArraySize - 1);
}
} else {
- DebugPrintf("Syntax: obj <itemnum> <flag> <value>\n");
+ debugPrintf("Syntax: obj <itemnum> <flag> <value>\n");
}
return true;
@@ -246,7 +223,7 @@ bool Debugger::Cmd_StartSubroutine(int argc, const char **argv) {
if (sub != NULL)
_vm->startSubroutine(sub);
} else
- DebugPrintf("Subroutine %d\n", _vm->_currentTable->id);
+ debugPrintf("Subroutine %d\n", _vm->_currentTable->id);
return true;
}
@@ -259,11 +236,11 @@ bool Debugger::Cmd_dumpImage(int argc, const char **argv) {
if (vpe->vgaFile2 != NULL) {
_vm->dumpVgaBitmaps(zoneNum);
} else {
- DebugPrintf("Invalid Zone Number %d\n", zoneNum);
+ debugPrintf("Invalid Zone Number %d\n", zoneNum);
}
} else
- DebugPrintf("Syntax: dumpimage <zonenum>\n");
+ debugPrintf("Syntax: dumpimage <zonenum>\n");
return true;
}
@@ -276,11 +253,11 @@ bool Debugger::Cmd_dumpScript(int argc, const char **argv) {
if (vpe->vgaFile1 != NULL) {
_vm->dumpVgaFile(vpe->vgaFile1);
} else {
- DebugPrintf("Invalid Zone Number %d\n", zoneNum);
+ debugPrintf("Invalid Zone Number %d\n", zoneNum);
}
} else
- DebugPrintf("Syntax: dumpscript <zonenum>\n");
+ debugPrintf("Syntax: dumpscript <zonenum>\n");
return true;
}
diff --git a/engines/agos/debugger.h b/engines/agos/debugger.h
index 0ab992ebbe..026194410f 100644
--- a/engines/agos/debugger.h
+++ b/engines/agos/debugger.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -37,7 +37,6 @@ public:
private:
AGOSEngine *_vm;
- bool Cmd_DebugLevel(int argc, const char **argv);
bool Cmd_PlayMusic(int argc, const char **argv);
bool Cmd_PlaySound(int argc, const char **argv);
bool Cmd_PlayVoice(int argc, const char **argv);
diff --git a/engines/agos/detection.cpp b/engines/agos/detection.cpp
index a5a42a86ad..72a38a3645 100644
--- a/engines/agos/detection.cpp
+++ b/engines/agos/detection.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -28,6 +28,7 @@
#include "common/savefile.h"
#include "common/system.h"
#include "common/textconsole.h"
+#include "common/installshield_cab.h"
#include "agos/intern.h"
#include "agos/agos.h"
@@ -269,8 +270,12 @@ void AGOSEngine::loadArchives() {
if (getFeatures() & GF_PACKED) {
for (ag = _gameDescription->desc.filesDescriptions; ag->fileName; ag++) {
- if (!_archives.hasArchive(ag->fileName))
- _archives.registerArchive(ag->fileName, ag->fileType);
+ if (!SearchMan.hasArchive(ag->fileName)) {
+ Common::SeekableReadStream *stream = SearchMan.createReadStreamForMember(ag->fileName);
+
+ if (stream)
+ SearchMan.add(ag->fileName, Common::makeInstallShieldArchive(stream, DisposeAfterUse::YES), ag->fileType);
+ }
}
}
}
diff --git a/engines/agos/detection_tables.h b/engines/agos/detection_tables.h
index 70757865f5..77fc88c6bb 100644
--- a/engines/agos/detection_tables.h
+++ b/engines/agos/detection_tables.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -1091,6 +1091,30 @@ static const AGOSGameDescription gameDescriptions[] = {
GF_32COLOR | GF_CRUNCHED | GF_CRUNCHED_GAMEPC | GF_OLD_BUNDLE | GF_PLANAR
},
+ // Simon the Sorcerer 1 - German Amiga OCS Floppy
+ {
+ {
+ "simon1",
+ "OCS Floppy",
+
+ {
+ { "gameamiga", GAME_BASEFILE, "634c82b7a0b760214fd71add328c7a00", 39493},
+ { "icon.pkd", GAME_ICONFILE, "565ef7a98dcc21ef526a2bb10b6f42ed", 18979},
+ { "stripped.txt", GAME_STRFILE, "f5fc67db3b8c5283cda51c43b98a74f8", 243},
+ { "tbllist", GAME_TBLFILE, "f9d5bf2ce09f82289c791c3ca26e1e4b", 696},
+ { NULL, 0, NULL, 0}
+ },
+ Common::DE_DEU,
+ Common::kPlatformAmiga,
+ ADGF_NO_FLAGS,
+ GUIO2(GUIO_NOSPEECH, GUIO_NOMIDI)
+ },
+
+ GType_SIMON1,
+ GID_SIMON1,
+ GF_32COLOR | GF_CRUNCHED | GF_OLD_BUNDLE | GF_PLANAR
+ },
+
// Simon the Sorcerer 1 - English Amiga AGA Floppy
{
{
@@ -2598,7 +2622,7 @@ static const AGOSGameDescription gameDescriptions[] = {
GType_FF,
GID_FEEBLEFILES,
- GF_OLD_BUNDLE | GF_TALKIE | GF_PACKED
+ GF_OLD_BUNDLE | GF_TALKIE | GF_PACKED | GF_BROKEN_FF_RATING
},
// The Feeble Files - English Windows 4CD
@@ -2621,7 +2645,7 @@ static const AGOSGameDescription gameDescriptions[] = {
GType_FF,
GID_FEEBLEFILES,
- GF_OLD_BUNDLE | GF_TALKIE
+ GF_OLD_BUNDLE | GF_TALKIE | GF_BROKEN_FF_RATING
},
// The Feeble Files - French Windows 4CD
diff --git a/engines/agos/draw.cpp b/engines/agos/draw.cpp
index d27aed29db..4ba9446eb2 100644
--- a/engines/agos/draw.cpp
+++ b/engines/agos/draw.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/agos/event.cpp b/engines/agos/event.cpp
index 65c7f7fd77..95bcc68234 100644
--- a/engines/agos/event.cpp
+++ b/engines/agos/event.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -468,6 +468,14 @@ void AGOSEngine::delay(uint amount) {
sprintf(_saveLoadName, "Quick %d", _saveLoadSlot);
_saveLoadType = (event.kbd.hasFlags(Common::KBD_ALT)) ? 1 : 2;
quickLoadOrSave();
+ } else if (event.kbd.hasFlags(Common::KBD_ALT)) {
+ if (event.kbd.keycode == Common::KEYCODE_u) {
+ dumpAllSubroutines();
+ } else if (event.kbd.keycode == Common::KEYCODE_i) {
+ dumpAllVgaImageFiles();
+ } else if (event.kbd.keycode == Common::KEYCODE_v) {
+ dumpAllVgaScriptFiles();
+ }
} else if (event.kbd.hasFlags(Common::KBD_CTRL)) {
if (event.kbd.keycode == Common::KEYCODE_a) {
GUI::Dialog *_aboutDialog;
@@ -477,10 +485,6 @@ void AGOSEngine::delay(uint amount) {
_fastMode = !_fastMode;
} else if (event.kbd.keycode == Common::KEYCODE_d) {
_debugger->attach();
- } else if (event.kbd.keycode == Common::KEYCODE_s) {
- dumpAllSubroutines();
- } else if (event.kbd.keycode == Common::KEYCODE_i) {
- dumpAllVgaImageFiles();
}
}
@@ -520,6 +524,12 @@ void AGOSEngine::delay(uint amount) {
case Common::EVENT_RTL:
case Common::EVENT_QUIT:
return;
+ case Common::EVENT_WHEELUP:
+ handleMouseWheelUp();
+ break;
+ case Common::EVENT_WHEELDOWN:
+ handleMouseWheelDown();
+ break;
default:
break;
}
diff --git a/engines/agos/feeble.cpp b/engines/agos/feeble.cpp
index a96caa9f8b..bfd11fa8ea 100644
--- a/engines/agos/feeble.cpp
+++ b/engines/agos/feeble.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/agos/gfx.cpp b/engines/agos/gfx.cpp
index 266fcc9796..33145b7d0d 100644
--- a/engines/agos/gfx.cpp
+++ b/engines/agos/gfx.cpp
@@ -8,18 +8,19 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public 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/debug-channels.h"
#include "common/endian.h"
#include "common/system.h"
#include "common/textconsole.h"
@@ -1129,7 +1130,7 @@ void AGOSEngine::animate(uint16 windowNum, uint16 zoneNum, uint16 vgaSpriteId, i
assert(READ_BE_UINT16(&((AnimationHeader_WW *) p)->id) == vgaSpriteId);
}
- if (_dumpVgaScripts) {
+ if (DebugMan.isDebugChannelEnabled(kDebugVGAScript)) {
if (getGameType() == GType_FF || getGameType() == GType_PP) {
dumpVgaScript(_curVgaFile1 + READ_LE_UINT16(&((AnimationHeader_Feeble*)p)->scriptOffs), zoneNum, vgaSpriteId);
} else if (getGameType() == GType_SIMON1 || getGameType() == GType_SIMON2) {
@@ -1235,7 +1236,7 @@ void AGOSEngine::setImage(uint16 vgaSpriteId, bool vgaScript) {
}
}
- if (_dumpVgaScripts) {
+ if (DebugMan.isDebugChannelEnabled(kDebugVGAScript)) {
if (getGameType() == GType_FF || getGameType() == GType_PP) {
dumpVgaScript(_curVgaFile1 + READ_LE_UINT16(&((ImageHeader_Feeble*)b)->scriptOffs), zoneNum, vgaSpriteId);
} else if (getGameType() == GType_SIMON1 || getGameType() == GType_SIMON2) {
diff --git a/engines/agos/icons.cpp b/engines/agos/icons.cpp
index 6d4192da2a..2db2a52cbc 100644
--- a/engines/agos/icons.cpp
+++ b/engines/agos/icons.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -1089,15 +1089,15 @@ bool AGOSEngine_PN::ifObjectInInv(uint16 a) {
}
bool AGOSEngine_PN::testContainer(uint16 a) {
- return bitextract(_quickptr[1] + a * _quickshort[1], 0) != 0;
+ return bitextract(_quickptr[1] + a * _quickshort[1], 0) != 0;
}
bool AGOSEngine_PN::testObvious(uint16 a) {
- return bitextract(_quickptr[1] + a * _quickshort[1], 4) != 0;
+ return bitextract(_quickptr[1] + a * _quickshort[1], 4) != 0;
}
bool AGOSEngine_PN::testSeen(uint16 a) {
- return bitextract(_quickptr[1] + a * _quickshort[1], 3) != 0;
+ return bitextract(_quickptr[1] + a * _quickshort[1], 3) != 0;
}
void AGOSEngine_PN::printIcon(HitArea *ha, uint8 i, uint8 r) {
diff --git a/engines/agos/input.cpp b/engines/agos/input.cpp
index 24e5339420..8a4e87017a 100644
--- a/engines/agos/input.cpp
+++ b/engines/agos/input.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -416,6 +416,115 @@ void AGOSEngine::hitarea_stuff_helper_2() {
_runScriptReturn1 = false;
}
+#ifdef ENABLE_AGOS2
+void AGOSEngine_Feeble::handleMouseWheelUp() {
+ if (getGameType() == GType_PP || !(getBitFlag(99)))
+ return;
+
+ if (_mouse.x >= 128 && _mouse.x <= 515 && _mouse.y >= 102 && _mouse.y <= 206) {
+ oracleTextDown();
+ } else if (_mouse.x >= 172 && _mouse.x <= 469 && _mouse.y >= 287 && _mouse.y <= 382) {
+ HitArea *ha = findBox(0x7FFB);
+ if (ha != NULL && (ha->flags & kBFBoxInUse)) {
+ if (!isSpriteLoaded(21, 9) && !isSpriteLoaded(23, 9))
+ inventoryUp(ha->window);
+ }
+ }
+}
+
+void AGOSEngine_Feeble::handleMouseWheelDown() {
+ if (getGameType() == GType_PP || !(getBitFlag(99)))
+ return;
+
+ if (_mouse.x >= 128 && _mouse.x <= 515 && _mouse.y >= 102 && _mouse.y <= 206) {
+ oracleTextUp();
+ } else if (_mouse.x >= 172 && _mouse.x <= 469 && _mouse.y >= 287 && _mouse.y <= 382) {
+ HitArea *ha = findBox(0x7FFC);
+ if (ha != NULL && (ha->flags & kBFBoxInUse)) {
+ if (!isSpriteLoaded(21, 9) && !isSpriteLoaded(23, 9))
+ inventoryDown(ha->window);
+ }
+ }
+}
+#endif
+
+void AGOSEngine_Simon1::handleMouseWheelUp() {
+ HitArea *ha = findBox(206);
+ if (ha != NULL && (ha->flags & kBFBoxInUse) && !(ha->flags & kBFBoxDead)) {
+ if (_saveLoadRowCurPos != 1) {
+ if (_saveLoadRowCurPos < 7)
+ _saveLoadRowCurPos = 1;
+ else
+ _saveLoadRowCurPos -= 1;
+
+ _saveLoadEdit = false;
+ listSaveGames();
+ }
+ } else {
+ AGOSEngine::handleMouseWheelUp();
+ }
+}
+
+void AGOSEngine_Simon1::handleMouseWheelDown() {
+ HitArea *ha = findBox(207);
+ if (ha != NULL && (ha->flags & kBFBoxInUse) && !(ha->flags & kBFBoxDead)) {
+ if (_saveDialogFlag) {
+ _saveLoadRowCurPos += 1;
+ if (_saveLoadRowCurPos >= _numSaveGameRows)
+ _saveLoadRowCurPos = _numSaveGameRows;
+
+ _saveLoadEdit = false;
+ listSaveGames();
+ }
+ } else {
+ AGOSEngine::handleMouseWheelDown();
+ }
+}
+
+void AGOSEngine_Elvira2::handleMouseWheelUp() {
+ HitArea *ha = findBox(224);
+ if (ha != NULL && (ha->flags & kBFBoxInUse)) {
+ _saveGameNameLen = 0;
+
+ if (_saveLoadRowCurPos < 3)
+ _saveLoadRowCurPos = 1;
+ else
+ _saveLoadRowCurPos -= 3;
+
+ listSaveGames();
+ } else {
+ AGOSEngine::handleMouseWheelUp();
+ }
+}
+
+void AGOSEngine_Elvira2::handleMouseWheelDown() {
+ HitArea *ha = findBox(224);
+ if (ha != NULL && (ha->flags & kBFBoxInUse)) {
+ _saveGameNameLen = 0;
+ _saveLoadRowCurPos += 3;
+ if (_saveLoadRowCurPos >= _numSaveGameRows)
+ _saveLoadRowCurPos = 1;
+
+ listSaveGames();
+ } else {
+ AGOSEngine::handleMouseWheelDown();
+ }
+}
+
+void AGOSEngine::handleMouseWheelUp() {
+ HitArea *ha = findBox(0x7FFB);
+ if (ha != NULL && (ha->flags & kBFBoxInUse)) {
+ inventoryUp(ha->window);
+ }
+}
+
+void AGOSEngine::handleMouseWheelDown() {
+ HitArea *ha = findBox(0x7FFC);
+ if (ha != NULL && (ha->flags & kBFBoxInUse)) {
+ inventoryDown(ha->window);
+ }
+}
+
void AGOSEngine::permitInput() {
if (_mortalFlag)
return;
diff --git a/engines/agos/input_pn.cpp b/engines/agos/input_pn.cpp
index b3a44f2b2f..a852ef320b 100644
--- a/engines/agos/input_pn.cpp
+++ b/engines/agos/input_pn.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/agos/intern.h b/engines/agos/intern.h
index 773b9c15bd..3f5c8c519b 100644
--- a/engines/agos/intern.h
+++ b/engines/agos/intern.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -246,16 +246,17 @@ enum SubObjectFlags {
};
enum GameFeatures {
- GF_TALKIE = 1 << 0,
- GF_OLD_BUNDLE = 1 << 1,
- GF_CRUNCHED = 1 << 2,
- GF_CRUNCHED_GAMEPC = 1 << 3,
- GF_ZLIBCOMP = 1 << 4,
- GF_32COLOR = 1 << 5,
- GF_EGA = 1 << 6,
- GF_PLANAR = 1 << 7,
- GF_DEMO = 1 << 8,
- GF_PACKED = 1 << 9
+ GF_TALKIE = 1 << 0,
+ GF_OLD_BUNDLE = 1 << 1,
+ GF_CRUNCHED = 1 << 2,
+ GF_CRUNCHED_GAMEPC = 1 << 3,
+ GF_ZLIBCOMP = 1 << 4,
+ GF_32COLOR = 1 << 5,
+ GF_EGA = 1 << 6,
+ GF_PLANAR = 1 << 7,
+ GF_DEMO = 1 << 8,
+ GF_PACKED = 1 << 9,
+ GF_BROKEN_FF_RATING = 1 << 10
};
enum GameFileTypes {
diff --git a/engines/agos/items.cpp b/engines/agos/items.cpp
index 3bb5a132ef..86abe403b4 100644
--- a/engines/agos/items.cpp
+++ b/engines/agos/items.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/agos/menus.cpp b/engines/agos/menus.cpp
index 85c50e421b..77a37cb601 100644
--- a/engines/agos/menus.cpp
+++ b/engines/agos/menus.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/agos/midi.cpp b/engines/agos/midi.cpp
index b3ade91107..392ee08ea1 100644
--- a/engines/agos/midi.cpp
+++ b/engines/agos/midi.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -235,6 +235,10 @@ void MidiPlayer::startTrack(int track) {
_music.parser = parser; // That plugs the power cord into the wall
} else if (_music.parser) {
if (!_music.parser->setTrack(track)) {
+ // The Roland MT32 music in Simon the Sorcerer 2
+ // is missing the extra tracks in many scenes,
+ // like the introduction sequence.
+ stop();
return;
}
_currentTrack = (byte)track;
diff --git a/engines/agos/midi.h b/engines/agos/midi.h
index 635e091906..3efadddc2f 100644
--- a/engines/agos/midi.h
+++ b/engines/agos/midi.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/agos/midiparser_s1d.cpp b/engines/agos/midiparser_s1d.cpp
index bef7199a98..c2c08bf451 100644
--- a/engines/agos/midiparser_s1d.cpp
+++ b/engines/agos/midiparser_s1d.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/agos/oracle.cpp b/engines/agos/oracle.cpp
index 025a833b77..122f800e78 100644
--- a/engines/agos/oracle.cpp
+++ b/engines/agos/oracle.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -180,7 +180,7 @@ void AGOSEngine_Feeble::oracleTextUp() {
if (_textWindow->scrollY > _oracleMaxScrollY) // For scroll up
_oracleMaxScrollY = _textWindow->scrollY;
- while (1) {
+ while (!shouldQuit()) {
if (_textWindow->scrollY == _oracleMaxScrollY)
break;
_textWindow->textRow = 105;
@@ -214,7 +214,7 @@ void AGOSEngine_Feeble::oracleTextDown() {
if (_textWindow->scrollY > _oracleMaxScrollY) // For scroll up
_oracleMaxScrollY = _textWindow->scrollY;
- while (1) {
+ while (!shouldQuit()) {
if (_textWindow->scrollY == 0)
break;
diff --git a/engines/agos/pn.cpp b/engines/agos/pn.cpp
index 667a5c3fc8..d94f180b00 100644
--- a/engines/agos/pn.cpp
+++ b/engines/agos/pn.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/agos/res.cpp b/engines/agos/res.cpp
index cf1d062d96..2631f7998e 100644
--- a/engines/agos/res.cpp
+++ b/engines/agos/res.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -24,7 +24,6 @@
#include "common/archive.h"
-#include "common/installshield_cab.h"
#include "common/file.h"
#include "common/memstream.h"
#include "common/textconsole.h"
@@ -38,52 +37,6 @@
namespace AGOS {
-ArchiveMan::ArchiveMan() {
- _fallBack = true;
-}
-
-#ifdef ENABLE_AGOS2
-void ArchiveMan::registerArchive(const Common::String &filename, int priority) {
- Common::SeekableReadStream *stream = SearchMan.createReadStreamForMember(filename);
-
- if (stream)
- add(filename, makeInstallShieldArchive(stream, DisposeAfterUse::YES), priority);
-}
-#endif
-
-bool ArchiveMan::hasFile(const Common::String &name) const {
- if (_fallBack && SearchMan.hasFile(name))
- return true;
-
- return Common::SearchSet::hasFile(name);
-}
-
-int ArchiveMan::listMatchingMembers(Common::ArchiveMemberList &list, const Common::String &pattern) const {
- const int matches = _fallBack ? SearchMan.listMatchingMembers(list, pattern) : 0;
- return matches + Common::SearchSet::listMatchingMembers(list, pattern);
-}
-
-int ArchiveMan::listMembers(Common::ArchiveMemberList &list) const {
- const int matches = _fallBack ? SearchMan.listMembers(list) : 0;
- return matches + Common::SearchSet::listMembers(list);
-}
-
-const Common::ArchiveMemberPtr ArchiveMan::getMember(const Common::String &name) const {
- Common::ArchiveMemberPtr ptr = _fallBack ? SearchMan.getMember(name) : Common::ArchiveMemberPtr();
- if (ptr)
- return ptr;
-
- return Common::SearchSet::getMember(name);
-}
-
-Common::SeekableReadStream *ArchiveMan::createReadStreamForMember(const Common::String &filename) const {
- if (_fallBack && SearchMan.hasFile(filename)) {
- return SearchMan.createReadStreamForMember(filename);
- }
-
- return Common::SearchSet::createReadStreamForMember(filename);
-}
-
#ifdef ENABLE_AGOS2
uint16 AGOSEngine_Feeble::to16Wrapper(uint value) {
return TO_LE_16(value);
@@ -198,39 +151,35 @@ int AGOSEngine::allocGamePcVars(Common::SeekableReadStream *in) {
}
void AGOSEngine_PN::loadGamePcFile() {
- Common::SeekableReadStream *in;
-
if (getFileName(GAME_BASEFILE) != NULL) {
+ Common::File in;
// Read dataBase
- in = _archives.createReadStreamForMember(getFileName(GAME_BASEFILE));
- if (!in) {
+ if (!in.open(getFileName(GAME_BASEFILE))) {
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);
- delete in;
+ in.read(_dataBase, _dataBaseSize);
if (_dataBase[31] != 0)
error("Later version of system requested");
}
if (getFileName(GAME_TEXTFILE) != NULL) {
+ Common::File in;
// Read textBase
- in = _archives.createReadStreamForMember(getFileName(GAME_TEXTFILE));
- if (!in) {
+ if (!in.open(getFileName(GAME_TEXTFILE))) {
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);
- delete in;
+ in.read(_textBase, _textBaseSize);
if (_textBase[getlong(30L)] != 128)
error("Unknown compression format");
@@ -238,20 +187,19 @@ void AGOSEngine_PN::loadGamePcFile() {
}
void AGOSEngine::loadGamePcFile() {
- Common::SeekableReadStream *in;
int fileSize;
if (getFileName(GAME_BASEFILE) != NULL) {
/* Read main gamexx file */
- in = _archives.createReadStreamForMember(getFileName(GAME_BASEFILE));
- if (!in) {
+ Common::File in;
+ if (!in.open(getFileName(GAME_BASEFILE))) {
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);
@@ -262,25 +210,23 @@ void AGOSEngine::loadGamePcFile() {
readGamePcFile(&stream);
free(dstBuf);
} else {
- readGamePcFile(in);
+ readGamePcFile(&in);
}
- delete in;
}
if (getFileName(GAME_TBLFILE) != NULL) {
/* Read list of TABLE resources */
- in = _archives.createReadStreamForMember(getFileName(GAME_TBLFILE));
- if (!in) {
+ Common::File in;
+ if (!in.open(getFileName(GAME_TBLFILE))) {
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);
- delete in;
+ in.read(_tblList, fileSize);
/* Remember the current state */
_subroutineListOrg = _subroutineList;
@@ -290,71 +236,67 @@ void AGOSEngine::loadGamePcFile() {
if (getFileName(GAME_STRFILE) != NULL) {
/* Read list of TEXT resources */
- in = _archives.createReadStreamForMember(getFileName(GAME_STRFILE));
- if (!in)
+ Common::File in;
+ if (!in.open(getFileName(GAME_STRFILE)))
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);
- delete in;
+ in.read(_strippedTxtMem, fileSize);
}
if (getFileName(GAME_STATFILE) != NULL) {
/* Read list of ROOM STATE resources */
- in = _archives.createReadStreamForMember(getFileName(GAME_STATFILE));
- if (!in) {
+ Common::File in;
+ if (!in.open(getFileName(GAME_STATFILE))) {
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();
}
- delete in;
}
if (getFileName(GAME_RMSLFILE) != NULL) {
/* Read list of ROOM ITEMS resources */
- in = _archives.createReadStreamForMember(getFileName(GAME_RMSLFILE));
- if (!in) {
+ Common::File in;
+ if (!in.open(getFileName(GAME_RMSLFILE))) {
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);
- delete in;
+ in.read(_roomsList, fileSize);
}
if (getFileName(GAME_XTBLFILE) != NULL) {
/* Read list of XTABLE resources */
- in = _archives.createReadStreamForMember(getFileName(GAME_XTBLFILE));
- if (!in) {
+ Common::File in;
+ if (!in.open(getFileName(GAME_XTBLFILE))) {
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);
- delete in;
+ in.read(_xtblList, fileSize);
/* Remember the current state */
_xsubroutineListOrg = _subroutineList;
@@ -828,7 +770,7 @@ void AGOSEngine::loadVGABeardFile(uint16 id) {
uint32 offs, size;
if (getFeatures() & GF_OLD_BUNDLE) {
- Common::SeekableReadStream *in;
+ Common::File in;
char filename[15];
if (id == 23)
id = 112;
@@ -844,32 +786,29 @@ void AGOSEngine::loadVGABeardFile(uint16 id) {
sprintf(filename, "0%d.VGA", id);
}
- in = _archives.createReadStreamForMember(filename);
- if (!in)
+ if (!in.open(filename))
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");
}
- delete in;
} else {
offs = _gameOffsetsPtr[id];
-
size = _gameOffsetsPtr[id + 1] - offs;
readGameFile(_vgaBufferPointers[11].vgaFile2, offs, size);
}
}
void AGOSEngine::loadVGAVideoFile(uint16 id, uint8 type, bool useError) {
- Common::SeekableReadStream *in;
+ Common::File in;
char filename[15];
byte *dst;
uint32 file, offs, srcSize, dstSize;
@@ -877,9 +816,9 @@ void AGOSEngine::loadVGAVideoFile(uint16 id, uint8 type, bool useError) {
if ((getGameType() == GType_SIMON1 || getGameType() == GType_SIMON2) &&
id == 2 && type == 2) {
- // WORKAROUND: For the exta long strings in foreign languages
+ // WORKAROUND: For the extra long strings in foreign languages
// Allocate more space for text to cope with foreign languages that use
- // up more space than english. I hope 6400 bytes are enough. This number
+ // up more space than English. I hope 6400 bytes are enough. This number
// is base on: 2 (lines) * 320 (screen width) * 10 (textheight) -- olki
extraBuffer += 6400;
}
@@ -922,8 +861,7 @@ void AGOSEngine::loadVGAVideoFile(uint16 id, uint8 type, bool useError) {
}
}
- in = _archives.createReadStreamForMember(filename);
- if (!in) {
+ if (!in.open(filename)) {
if (useError)
error("loadVGAVideoFile: Can't load %s", filename);
@@ -931,11 +869,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::kPlatformDOS && 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;
@@ -943,7 +881,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);
@@ -957,7 +895,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);
@@ -966,15 +904,22 @@ 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");
}
- delete in;
} else {
id = id * 2 + (type - 1);
offs = _gameOffsetsPtr[id];
-
dstSize = _gameOffsetsPtr[id + 1] - offs;
+
+ if (!dstSize) {
+ if (useError)
+ error("loadVGAVideoFile: Can't load id %d type %d", id, type);
+
+ _block = _blockEnd = NULL;
+ return;
+ }
+
dst = allocBlock(dstSize + extraBuffer);
readGameFile(dst, offs, dstSize);
}
diff --git a/engines/agos/res_ami.cpp b/engines/agos/res_ami.cpp
index 32adfa29e6..4b3d575142 100644
--- a/engines/agos/res_ami.cpp
+++ b/engines/agos/res_ami.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/agos/res_snd.cpp b/engines/agos/res_snd.cpp
index 2777d4f269..5d6ab60c8b 100644
--- a/engines/agos/res_snd.cpp
+++ b/engines/agos/res_snd.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -450,17 +450,14 @@ static const char *const dimpSoundList[32] = {
void AGOSEngine::loadSoundFile(const char* filename) {
- Common::SeekableReadStream *in;
-
- in = _archives.createReadStreamForMember(filename);
- if (!in)
+ Common::File in;
+ if (!in.open(filename))
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");
- delete in;
_sound->playSfxData(dst, 0, 0, 0);
}
@@ -469,21 +466,19 @@ void AGOSEngine::loadSound(uint16 sound, int16 pan, int16 vol, uint16 type) {
byte *dst;
if (getGameId() == GID_DIMP) {
- Common::SeekableReadStream *in;
+ Common::File in;
char filename[15];
assert(sound >= 1 && sound <= 32);
sprintf(filename, "%s.wav", dimpSoundList[sound - 1]);
- in = _archives.createReadStreamForMember(filename);
- if (!in)
+ if (!in.open(filename))
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");
- delete in;
} else if (getFeatures() & GF_ZLIBCOMP) {
char filename[15];
diff --git a/engines/agos/rooms.cpp b/engines/agos/rooms.cpp
index fb7b313e9c..6185653d42 100644
--- a/engines/agos/rooms.cpp
+++ b/engines/agos/rooms.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/agos/saveload.cpp b/engines/agos/saveload.cpp
index 8eb7f066b3..5d5e2d7b03 100644
--- a/engines/agos/saveload.cpp
+++ b/engines/agos/saveload.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -37,9 +37,8 @@ namespace AGOS {
// FIXME: This code counts savegames, but callers in many cases assume
// that the return value + 1 indicates an empty slot.
int AGOSEngine::countSaveGames() {
- Common::InSaveFile *f = NULL;
Common::StringArray filenames;
- uint i = 1;
+ uint s, numSaveGames = 1;
int slotNum;
bool marks[256];
@@ -60,18 +59,13 @@ int AGOSEngine::countSaveGames() {
marks[slotNum] = true; //mark this slot as valid
}
- // FIXME: Why does this already try to actually open the savegames?
- // Historical accident?
- while (i < 256) {
- if (marks[i] &&
- (f = _saveFileMan->openForLoading(genSaveName(i)))) {
- i++;
- delete f;
- } else
- break;
+ // locate first empty slot
+ for (s = 1; s < 256; s++) {
+ if (marks[s])
+ numSaveGames++;
}
- return i;
+ return numSaveGames;
}
#ifdef ENABLE_AGOS2
@@ -296,7 +290,7 @@ void AGOSEngine::userGame(bool load) {
const char *message1;
int i = 0, numSaveGames;
char *name;
- char buf[10];
+ memset(_saveBuf, 0, sizeof(_saveBuf));
numSaveGames = countSaveGames();
@@ -325,8 +319,8 @@ restart:
for (; *message1; message1++)
windowPutChar(window, *message1);
- memset(buf, 0, 10);
- name = buf;
+ memset(_saveBuf, 0, 10);
+ name = _saveBuf;
_saveGameNameLen = 0;
while (!shouldQuit()) {
@@ -384,9 +378,10 @@ restart:
_gameStoppedClock = getTime() - saveTime + _gameStoppedClock;
}
-void AGOSEngine_Elvira2::listSaveGames(char *dst) {
+void AGOSEngine_Elvira2::listSaveGames() {
Common::InSaveFile *in;
uint y, slot;
+ char *dst = _saveBuf;
const uint8 num = (getGameType() == GType_WW) ? 3 : 4;
@@ -469,7 +464,7 @@ void AGOSEngine_Elvira2::userGame(bool load) {
int i, numSaveGames;
char *name;
bool b;
- char buf[200];
+ memset(_saveBuf, 0, sizeof(_saveBuf));
_saveOrLoad = load;
@@ -485,28 +480,28 @@ void AGOSEngine_Elvira2::userGame(bool load) {
const uint8 num = (getGameType() == GType_WW) ? 3 : 4;
- listSaveGames(buf);
+ listSaveGames();
if (!load) {
WindowBlock *window = _windowArray[num];
int16 slot = -1;
- name = buf + 192;
+ name = _saveBuf + 192;
while (!shouldQuit()) {
windowPutChar(window, 128);
_saveLoadEdit = true;
- i = userGameGetKey(&b, buf, 128);
+ i = userGameGetKey(&b, 128);
if (b) {
if (i <= 223) {
if (!confirmOverWrite(window)) {
- listSaveGames(buf);
+ listSaveGames();
continue;
}
- if (!saveGame(_saveLoadRowCurPos + i, buf + i * 8))
+ if (!saveGame(_saveLoadRowCurPos + i, _saveBuf + i * 8))
fileError(_windowArray[num], true);
}
@@ -518,7 +513,7 @@ void AGOSEngine_Elvira2::userGame(bool load) {
slot = matchSaveGame(name, numSaveGames);
if (slot >= 0) {
if (!confirmOverWrite(window)) {
- listSaveGames(buf);
+ listSaveGames();
continue;
}
}
@@ -540,11 +535,11 @@ void AGOSEngine_Elvira2::userGame(bool load) {
if (slot < 0)
slot = numSaveGames;
- if (!saveGame(slot, buf + 192))
+ if (!saveGame(slot, _saveBuf + 192))
fileError(_windowArray[num], true);
}
} else {
- i = userGameGetKey(&b, buf, 128);
+ i = userGameGetKey(&b, 128);
if (i != 225) {
if (!loadGame(genSaveName(_saveLoadRowCurPos + i)))
fileError(_windowArray[num], false);
@@ -560,7 +555,7 @@ get_out:;
restartAnimation();
}
-int AGOSEngine_Elvira2::userGameGetKey(bool *b, char *buf, uint maxChar) {
+int AGOSEngine_Elvira2::userGameGetKey(bool *b, uint maxChar) {
HitArea *ha;
*b = true;
@@ -588,7 +583,7 @@ int AGOSEngine_Elvira2::userGameGetKey(bool *b, char *buf, uint maxChar) {
if (_saveLoadRowCurPos >= _numSaveGameRows)
_saveLoadRowCurPos = 1;
- listSaveGames(buf);
+ listSaveGames();
} else if (ha->id < 224) {
return ha->id - 200;
}
@@ -597,9 +592,10 @@ int AGOSEngine_Elvira2::userGameGetKey(bool *b, char *buf, uint maxChar) {
return 225;
}
-void AGOSEngine_Simon1::listSaveGames(char *dst) {
+void AGOSEngine_Simon1::listSaveGames() {
Common::InSaveFile *in;
uint16 i, slot, lastSlot;
+ char *dst = _saveBuf;
disableFileBoxes();
@@ -681,7 +677,7 @@ void AGOSEngine_Simon1::userGame(bool load) {
WindowBlock *window;
char *name;
bool b;
- char buf[108];
+ memset(_saveBuf, 0, sizeof(_saveBuf));
int maxChar = (_language == Common::HE_ISR) ? 155: 128;
_saveOrLoad = load;
@@ -704,7 +700,7 @@ void AGOSEngine_Simon1::userGame(bool load) {
_saveLoadEdit = false;
restart:;
- i = userGameGetKey(&b, buf, maxChar);
+ i = userGameGetKey(&b, maxChar);
if (i == 205)
goto get_out;
@@ -730,7 +726,7 @@ restart:;
}
window->textLength = 3;
- name = buf + i * 18;
+ name = _saveBuf + i * 18;
// now process entire savegame name to get correct x offset for cursor
_saveGameNameLen = 0;
@@ -763,7 +759,7 @@ restart:;
_saveLoadEdit = true;
- i = userGameGetKey(&b, buf, maxChar);
+ i = userGameGetKey(&b, maxChar);
if (b) {
if (i == 205)
@@ -814,7 +810,7 @@ restart:;
}
}
- if (!saveGame(_saveLoadRowCurPos + result, buf + result * 18))
+ if (!saveGame(_saveLoadRowCurPos + result, _saveBuf + result * 18))
fileError(_windowArray[5], true);
} else {
if (!loadGame(genSaveName(_saveLoadRowCurPos + i)))
@@ -827,12 +823,12 @@ get_out:;
_gameStoppedClock = getTime() - saveTime + _gameStoppedClock;
}
-int AGOSEngine_Simon1::userGameGetKey(bool *b, char *buf, uint maxChar) {
+int AGOSEngine_Simon1::userGameGetKey(bool *b, uint maxChar) {
HitArea *ha;
*b = true;
if (!_saveLoadEdit) {
- listSaveGames(buf);
+ listSaveGames();
}
_keyPressed.reset();
@@ -861,7 +857,7 @@ int AGOSEngine_Simon1::userGameGetKey(bool *b, char *buf, uint maxChar) {
_saveLoadRowCurPos -= 6;
_saveLoadEdit = false;
- listSaveGames(buf);
+ listSaveGames();
}
} else if (ha->id == 207) {
if (_saveDialogFlag) {
@@ -870,7 +866,7 @@ int AGOSEngine_Simon1::userGameGetKey(bool *b, char *buf, uint maxChar) {
_saveLoadRowCurPos = _numSaveGameRows;
_saveLoadEdit = false;
- listSaveGames(buf);
+ listSaveGames();
}
} else if (ha->id < 214) {
return ha->id - 208;
@@ -1031,7 +1027,12 @@ bool AGOSEngine::loadGame(const Common::String &filename, bool restartMode) {
if (restartMode) {
// Load restart state
- f = _archives.createReadStreamForMember(filename);
+ Common::File *file = new Common::File();
+ if (!file->open(filename)) {
+ delete file;
+ file = nullptr;
+ }
+ f = file;
} else {
f = _saveFileMan->openForLoading(filename);
}
@@ -1205,7 +1206,12 @@ bool AGOSEngine_Elvira2::loadGame(const Common::String &filename, bool restartMo
if (restartMode) {
// Load restart state
- f = _archives.createReadStreamForMember(filename);
+ Common::File *file = new Common::File();
+ if (!file->open(filename)) {
+ delete file;
+ file = nullptr;
+ }
+ f = file;
} else {
f = _saveFileMan->openForLoading(filename);
}
diff --git a/engines/agos/script.cpp b/engines/agos/script.cpp
index 1c36454278..1dbb9c255a 100644
--- a/engines/agos/script.cpp
+++ b/engines/agos/script.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -22,6 +22,7 @@
// Item script opcodes for Simon1/Simon2
+#include "common/debug-channels.h"
#include "common/endian.h"
#include "common/system.h"
#include "common/textconsole.h"
@@ -264,7 +265,7 @@ void AGOSEngine::o_add() {
uint var = getVarWrapper();
writeVariable(var, readVariable(var) + getVarOrWord());
- // WORKAROUND: The converation of the male in Vid-Phone Booth at Dave's Space Bar
+ // WORKAROUND: The conversation of the male in Vid-Phone Booth at Dave's Space Bar
// is based on variable 116, but stops due to a missing option (37).
if (getGameType() == GType_FF && _currentTable->id == 10538 && readVariable(116) == 37)
writeVariable(116, 38);
@@ -987,7 +988,7 @@ int AGOSEngine::runScript() {
return 1;
do {
- if (_dumpOpcodes)
+ if (DebugMan.isDebugChannelEnabled(kDebugOpcode))
dumpOpcode(_codePtr);
if (getGameType() == GType_ELVIRA1) {
diff --git a/engines/agos/script_dp.cpp b/engines/agos/script_dp.cpp
index f51e15dc67..85ab308226 100644
--- a/engines/agos/script_dp.cpp
+++ b/engines/agos/script_dp.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/agos/script_e1.cpp b/engines/agos/script_e1.cpp
index c7a2f5b0a2..a022335ebc 100644
--- a/engines/agos/script_e1.cpp
+++ b/engines/agos/script_e1.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/agos/script_e2.cpp b/engines/agos/script_e2.cpp
index 79a7e89a89..21b651ec12 100644
--- a/engines/agos/script_e2.cpp
+++ b/engines/agos/script_e2.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/agos/script_ff.cpp b/engines/agos/script_ff.cpp
index e2a4d0820f..e4fadcf360 100644
--- a/engines/agos/script_ff.cpp
+++ b/engines/agos/script_ff.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -243,7 +243,7 @@ void AGOSEngine_Feeble::setupOpcodes() {
/* 164 */
OPCODE(oe2_getDollar2),
OPCODE(off_isAdjNoun),
- OPCODE(oe2_b2Set),
+ OPCODE(off_b2Set),
OPCODE(oe2_b2Clear),
/* 168 */
OPCODE(oe2_b2Zero),
@@ -296,6 +296,39 @@ void AGOSEngine_Feeble::executeOpcode(int opcode) {
(this->*op) ();
}
+void AGOSEngine_Feeble::setLoyaltyRating(byte rating) {
+ // WORKAROUND: The 4CD version of The Feeble File is missing the parts
+ // of the script that set the loyalty rating. This approximates the
+ // script from the 2CD version. See bug #6525.
+
+ switch (rating) {
+ case 1:
+ // Kicking vending machine: Possibility of Undesirable Character Flaws
+ writeVariable(120, 1);
+ break;
+ case 2:
+ // Confessing: Confirmed Minor Character Flaws
+ writeVariable(120, 2);
+ break;
+ case 3:
+ // Being sent to Cygnus Alpha: Suspected Subversive Activity
+ writeVariable(120, 3);
+ break;
+ case 4:
+ // Escaping from Cygnus Alpha: Confirmed Subversive Activity
+ writeVariable(120, 4);
+ break;
+ case 5:
+ // Being brought before Filbert: Confirmed Treasonous Activity
+ writeVariable(120, 5);
+ break;
+ case 6:
+ // Arriving at rebel base: Freedom Fighters Operative
+ writeVariable(120, 6);
+ break;
+ }
+}
+
// -----------------------------------------------------------------------
// Feeble Files Opcodes
// -----------------------------------------------------------------------
@@ -467,6 +500,34 @@ void AGOSEngine_Feeble::off_isAdjNoun() {
setScriptCondition(false);
}
+void AGOSEngine_Feeble::off_b2Set() {
+ // 166: set bit2
+ uint bit = getVarOrByte();
+ _bitArrayTwo[bit / 16] |= (1 << (bit & 15));
+
+ if (getFeatures() & GF_BROKEN_FF_RATING) {
+ switch (bit) {
+ case 152:
+ setLoyaltyRating(1);
+ break;
+ case 153:
+ setLoyaltyRating(2);
+ break;
+ case 240:
+ setLoyaltyRating(3);
+ break;
+ case 251:
+ setLoyaltyRating(4);
+ break;
+ case 253:
+ setLoyaltyRating(6);
+ break;
+ default:
+ break;
+ }
+ }
+}
+
void AGOSEngine_Feeble::off_hyperLinkOn() {
// 171: oracle hyperlink on
hyperLinkOn(getVarOrWord());
@@ -565,6 +626,12 @@ void AGOSEngine_Feeble::off_loadVideo() {
assert(_moviePlayer);
_moviePlayer->load();
+
+ if (getFeatures() & GF_BROKEN_FF_RATING) {
+ if (strcmp((const char *)filename, "Statue1.smk") == 0) {
+ setLoyaltyRating(5);
+ }
+ }
}
void AGOSEngine_Feeble::off_playVideo() {
diff --git a/engines/agos/script_pn.cpp b/engines/agos/script_pn.cpp
index e98cd2795a..60948db35a 100644
--- a/engines/agos/script_pn.cpp
+++ b/engines/agos/script_pn.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/agos/script_pp.cpp b/engines/agos/script_pp.cpp
index 0a599506b5..799b26fbc6 100644
--- a/engines/agos/script_pp.cpp
+++ b/engines/agos/script_pp.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/agos/script_s1.cpp b/engines/agos/script_s1.cpp
index 03aad7ebb9..ec3de9bf94 100644
--- a/engines/agos/script_s1.cpp
+++ b/engines/agos/script_s1.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/agos/script_s2.cpp b/engines/agos/script_s2.cpp
index c35771f8ec..44552ecd8a 100644
--- a/engines/agos/script_s2.cpp
+++ b/engines/agos/script_s2.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/agos/script_ww.cpp b/engines/agos/script_ww.cpp
index 873f258743..aff3229f8e 100644
--- a/engines/agos/script_ww.cpp
+++ b/engines/agos/script_ww.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/agos/sound.cpp b/engines/agos/sound.cpp
index a6a731ab24..812f46504f 100644
--- a/engines/agos/sound.cpp
+++ b/engines/agos/sound.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -121,8 +121,14 @@ Common::SeekableReadStream *BaseSound::getSoundStream(uint sound) const {
int i = 1;
while (_offsets[sound + i] == _offsets[sound])
i++;
+ uint end;
+ if (_offsets[sound + i] > _offsets[sound]) {
+ end = _offsets[sound + i];
+ } else {
+ end = file->size();
+ }
- return new Common::SeekableSubReadStream(file, _offsets[sound], _offsets[sound + i], DisposeAfterUse::YES);
+ return new Common::SeekableSubReadStream(file, _offsets[sound], end, DisposeAfterUse::YES);
}
///////////////////////////////////////////////////////////////////////////////
@@ -190,7 +196,7 @@ bool LoopingAudioStream::endOfData() const {
#pragma mark -
static void convertVolume(int &vol) {
- // DirectSound was orginally used, which specifies volume
+ // DirectSound was originally used, which specifies volume
// and panning differently than ScummVM does, using a logarithmic scale
// rather than a linear one.
//
@@ -442,12 +448,16 @@ void Sound::loadVoiceFile(const GameSpecificSettings *gss) {
if (file.open("voices.idx")) {
int end = file.size();
_filenums = (uint16 *)malloc((end / 6 + 1) * 2);
- _offsets = (uint32 *)malloc((end / 6 + 1) * 4);
+ _offsets = (uint32 *)malloc((end / 6 + 1 + 1) * 4);
for (int i = 1; i <= end / 6; i++) {
_filenums[i] = file.readUint16BE();
_offsets[i] = file.readUint32BE();
}
+ // We need to add a terminator entry otherwise we get an out of
+ // bounds read when the offset table is accessed in
+ // BaseSound::getSoundStream.
+ _offsets[end / 6 + 1] = 0;
_hasVoiceFile = true;
return;
diff --git a/engines/agos/sound.h b/engines/agos/sound.h
index 8633fe2f70..5feb288b9d 100644
--- a/engines/agos/sound.h
+++ b/engines/agos/sound.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/agos/string.cpp b/engines/agos/string.cpp
index ee1b9df246..3eb0aca04d 100644
--- a/engines/agos/string.cpp
+++ b/engines/agos/string.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/agos/string_pn.cpp b/engines/agos/string_pn.cpp
index 4d4e2be16a..7a364f3ea9 100644
--- a/engines/agos/string_pn.cpp
+++ b/engines/agos/string_pn.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/agos/subroutine.cpp b/engines/agos/subroutine.cpp
index f5aad2dcc8..1e6ecaa829 100644
--- a/engines/agos/subroutine.cpp
+++ b/engines/agos/subroutine.cpp
@@ -8,20 +8,19 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public 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/debug-channels.h"
#include "common/file.h"
#include "common/textconsole.h"
@@ -266,8 +265,8 @@ Common::SeekableReadStream *AGOSEngine::openTablesFile(const char *filename) {
}
Common::SeekableReadStream *AGOSEngine::openTablesFile_simon1(const char *filename) {
- Common::SeekableReadStream *in = _archives.createReadStreamForMember(filename);
- if (!in)
+ Common::File *in = new Common::File();
+ if (!in->open(filename))
error("openTablesFile: Can't open '%s'", filename);
return in;
}
@@ -531,7 +530,7 @@ int AGOSEngine::startSubroutine(Subroutine *sub) {
_classMode1 = 0;
_classMode2 = 0;
- if (_dumpScripts)
+ if (DebugMan.isDebugChannelEnabled(kDebugSubroutine))
dumpSubroutine(sub);
if (++_recursionDepth > 40)
@@ -564,8 +563,7 @@ restart:
else
_codePtr += 8;
- if (_dumpOpcodes)
- debug("; %d", sub->id);
+ debugC(kDebugOpcode, "; %d", sub->id);
result = runScript();
if (result != 0) {
break;
diff --git a/engines/agos/verb.cpp b/engines/agos/verb.cpp
index f5b57a01c8..fb3878381f 100644
--- a/engines/agos/verb.cpp
+++ b/engines/agos/verb.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -216,7 +216,14 @@ void AGOSEngine_Simon2::clearName() {
return;
}
- AGOSEngine_Simon1::clearName();
+ if (_currentVerbBox == _lastVerbOn)
+ return;
+
+ resetNameWindow();
+ _lastVerbOn = _currentVerbBox;
+
+ if (_currentVerbBox != NULL && !(_currentVerbBox->flags & kBFBoxDead))
+ printVerbOf(_currentVerbBox->id);
}
void AGOSEngine_Simon1::clearName() {
@@ -242,12 +249,18 @@ void AGOSEngine::clearName() {
resetNameWindow();
}
+static const byte convertVerbID[9] = {
+ 0, 1, 5, 11, 8, 7, 10, 3, 2
+};
+
void AGOSEngine::printVerbOf(uint hitarea_id) {
const char *txt;
const char * const *verb_names;
const char * const *verb_prep_names;
hitarea_id -= 101;
+ if (getGameType() == GType_SIMON2)
+ hitarea_id = convertVerbID[hitarea_id];
if (_showPreposition) {
switch (_language) {
diff --git a/engines/agos/verb_pn.cpp b/engines/agos/verb_pn.cpp
index 9dd0079b6d..53025822ba 100644
--- a/engines/agos/verb_pn.cpp
+++ b/engines/agos/verb_pn.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/agos/vga.cpp b/engines/agos/vga.cpp
index cc5ede5f2c..f761c3fc3f 100644
--- a/engines/agos/vga.cpp
+++ b/engines/agos/vga.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -27,6 +27,7 @@
#include "agos/intern.h"
#include "agos/vga.h"
+#include "common/debug-channels.h"
#include "common/endian.h"
#include "common/system.h"
#include "common/textconsole.h"
@@ -152,7 +153,7 @@ void AGOSEngine::runVgaScript() {
for (;;) {
uint opcode;
- if (_dumpVgaOpcodes) {
+ if (DebugMan.isDebugChannelEnabled(kDebugVGAOpcode)) {
if (_vcPtr != (const byte *)&_vcGetOutOfCode) {
debugN("%.5d %.5X: %5d %4d ", _vgaTickCounter, (unsigned int)(_vcPtr - _curVgaFile1), _vgaCurSpriteId, _vgaCurZoneNum);
dumpVideoScript(_vcPtr, true);
@@ -381,8 +382,7 @@ void AGOSEngine::vcSkipNextInstruction() {
_vcPtr += opcodeParamLenPN[opcode];
}
- if (_dumpVgaOpcodes)
- debugN("; skipped\n");
+ debugCN(kDebugVGAOpcode, "; skipped\n");
}
// VGA Script commands
@@ -648,7 +648,7 @@ void AGOSEngine::drawImage_init(int16 image, uint16 palette, int16 x, int16 y, u
if (height == 0 || width == 0)
return;
- if (_dumpImages)
+ if (DebugMan.isDebugChannelEnabled(kDebugImageDump))
dumpSingleBitmap(_vgaCurZoneNum, state.image, state.srcPtr, width, height,
state.palette);
state.width = state.draw_width = width; /* cl */
diff --git a/engines/agos/vga.h b/engines/agos/vga.h
index 5a5764532e..30b3a3b77a 100644
--- a/engines/agos/vga.h
+++ b/engines/agos/vga.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/agos/vga_e2.cpp b/engines/agos/vga_e2.cpp
index 4eb337c687..bc26058640 100644
--- a/engines/agos/vga_e2.cpp
+++ b/engines/agos/vga_e2.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/agos/vga_ff.cpp b/engines/agos/vga_ff.cpp
index c8c9673506..52e30699b0 100644
--- a/engines/agos/vga_ff.cpp
+++ b/engines/agos/vga_ff.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/agos/vga_pn.cpp b/engines/agos/vga_pn.cpp
index b7f80ebf91..306c41c71c 100644
--- a/engines/agos/vga_pn.cpp
+++ b/engines/agos/vga_pn.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/agos/vga_s1.cpp b/engines/agos/vga_s1.cpp
index ef05063fc1..c5f0f7874d 100644
--- a/engines/agos/vga_s1.cpp
+++ b/engines/agos/vga_s1.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/agos/vga_s2.cpp b/engines/agos/vga_s2.cpp
index e0780b491a..0c716d06c4 100644
--- a/engines/agos/vga_s2.cpp
+++ b/engines/agos/vga_s2.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/agos/vga_ww.cpp b/engines/agos/vga_ww.cpp
index ca93fa9fec..5bf8f84551 100644
--- a/engines/agos/vga_ww.cpp
+++ b/engines/agos/vga_ww.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/agos/window.cpp b/engines/agos/window.cpp
index 892df92554..de0b768d02 100644
--- a/engines/agos/window.cpp
+++ b/engines/agos/window.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/agos/zones.cpp b/engines/agos/zones.cpp
index 483b9949eb..1644213579 100644
--- a/engines/agos/zones.cpp
+++ b/engines/agos/zones.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -76,7 +76,7 @@ void AGOSEngine::loadZone(uint16 zoneNum, bool useError) {
return;
}
- // Loading order is important due to resource managment
+ // Loading order is important due to resource management
if (getPlatform() == Common::kPlatformAmiga && getGameType() == GType_WW &&
zoneTable[zoneNum] == 3) {
diff --git a/engines/avalanche/animation.cpp b/engines/avalanche/animation.cpp
index ef30faa87c..451b4a1c68 100644
--- a/engines/avalanche/animation.cpp
+++ b/engines/avalanche/animation.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -48,6 +48,37 @@ const int32 Animation::kCatacombMap[8][8] = {
AnimationType::AnimationType(Animation *anim) {
_anim = anim;
+
+ _xLength = 0;
+ _yLength = 0;
+ for (int i = 0; i < 24; i++) {
+ _mani[i] = nullptr;
+ _sil[i] = nullptr;
+ }
+ _frameNum = 0;
+ _seq = 0;
+ _characterId = 0;
+ _count = 0;
+ _facingDir = kDirNone;
+ _stepNum = 0;
+ _x = 0;
+ _y = 0;
+ _moveX = 0;
+ _moveY = 0;
+ _quick = false;
+ _visible = false;
+ _homing = false;
+ _doCheck = false;
+ _homingX = 0;
+ _homingY = 0;
+ _speedX = 0;
+ _speedY = 0;
+ _vanishIfStill = false;
+ _callEachStepFl = false;
+ _eachStepProc = Animation::kProcNone;
+ _fgBubbleCol = kColorWhite;
+ _bgBubbleCol = kColorBlack;
+ _id = 177;
}
/**
@@ -217,7 +248,7 @@ void AnimationType::walk() {
break;
case kMagicUnfinished: {
bounce();
- Common::String tmpStr = Common::String::format("%c%cSorry.%cThis place is not available yet!",
+ Common::String tmpStr = Common::String::format("%c%cSorry.%cThis place is not available yet!",
kControlBell, kControlCenter, kControlRoman);
_anim->_vm->_dialogs->displayText(tmpStr);
}
@@ -370,6 +401,13 @@ Animation::Animation(AvalancheEngine *vm) {
for (int16 i = 0; i < kSpriteNumbMax; i++) {
_sprites[i] = new AnimationType(this);
}
+
+ _direction = kDirNone;
+ _oldDirection = kDirNone;
+ _arrowTriggered = false;
+ _geidaSpin = 0;
+ _geidaTime = 0;
+ _sayWhat = 0;
}
Animation::~Animation() {
@@ -726,7 +764,7 @@ void Animation::catacombMove(byte ped) {
spr1->init(5, true); // ...Load Geida.
appearPed(1, geidaPed(ped));
spr1->_callEachStepFl = true;
- spr1->_eachStepProc = kProcGeida;
+ spr1->_eachStepProc = kProcFollowAvvy;
}
}
@@ -754,7 +792,7 @@ void Animation::callSpecial(uint16 which) {
_vm->_magics[11]._data = 5;
_vm->_magics[3]._operation = kMagicBounce; // Now works as planned!
stopWalking();
- _vm->_dialogs->displayScrollChain('q', 26);
+ _vm->_dialogs->displayScrollChain('Q', 26);
_vm->_userMovesAvvy = true;
break;
case 3: // _vm->special 3: Room 71: triggers dart.
@@ -777,22 +815,20 @@ void Animation::callSpecial(uint16 which) {
}
break;
case 4: // This is the ghost room link.
- _vm->fadeOut();
- _sprites[0]->turn(kDirRight); // you'll see this after we get back from bootstrap
+ _sprites[0]->turn(kDirRight); // You'll see this after we get back.
_vm->_timer->addTimer(1, Timer::kProcGhostRoomPhew, Timer::kReasonGhostRoomPhew);
- //_vm->_enid->backToBootstrap(3); TODO: Replace it with proper ScummVM-friendly function(s)! Do not remove until then!
+ _vm->_ghostroom->run();
break;
case 5:
if (_vm->_friarWillTieYouUp) {
// _vm->special 5: Room 42: touched tree, and get tied up.
_vm->_magics[4]._operation = kMagicBounce; // Boundary effect is now working again.
- _vm->_dialogs->displayScrollChain('q', 35);
+ _vm->_dialogs->displayScrollChain('Q', 35);
_sprites[0]->remove();
- //tr[1].vanishifstill:=true;
AnimationType *spr1 = _sprites[1];
_vm->_background->draw(-1, -1, 1);
- _vm->_dialogs->displayScrollChain('q', 36);
+ _vm->_dialogs->displayScrollChain('Q', 36);
_vm->_tiedUp = true;
_vm->_friarWillTieYouUp = false;
spr1->walkTo(2);
@@ -825,7 +861,7 @@ void Animation::callSpecial(uint16 which) {
case 8: // _vm->special 8: leave du Lustie's room.
if (_vm->_geidaFollows && !_vm->_lustieIsAsleep) {
AnimationType *spr1 = _sprites[1];
- _vm->_dialogs->displayScrollChain('q', 63);
+ _vm->_dialogs->displayScrollChain('Q', 63);
spr1->turn(kDirDown);
spr1->stopWalk();
spr1->_callEachStepFl = false; // Geida
@@ -848,9 +884,9 @@ void Animation::callSpecial(uint16 which) {
if ((_vm->_catacombX == 4) && (_vm->_catacombY == 1)) {
// Into Geida's room.
if (_vm->_objects[kObjectKey - 1])
- _vm->_dialogs->displayScrollChain('q', 62);
+ _vm->_dialogs->displayScrollChain('Q', 62);
else {
- _vm->_dialogs->displayScrollChain('q', 61);
+ _vm->_dialogs->displayScrollChain('Q', 61);
return;
}
}
@@ -1031,7 +1067,7 @@ void Animation::arrowProcs(byte tripnum) {
void Animation::grabAvvy(byte tripnum) { // For Friar Tuck, in Nottingham.
AnimationType *tripSpr = _sprites[tripnum];
- AnimationType *avvy = _sprites[tripnum];
+ AnimationType *avvy = _sprites[0];
int16 tox = avvy->_x + 17;
int16 toy = avvy->_y - 1;
@@ -1085,7 +1121,7 @@ void Animation::spin(Direction dir, byte &tripnum) {
}
}
-void Animation::geidaProcs(byte tripnum) {
+void Animation::follow(byte tripnum) {
AnimationType *tripSpr = _sprites[tripnum];
AnimationType *avvy = _sprites[0];
@@ -1096,14 +1132,14 @@ void Animation::geidaProcs(byte tripnum) {
}
if (tripSpr->_y < (avvy->_y - 2)) {
- // Geida is further from the screen than Avvy.
+ // The following NPC is further from the screen than Avvy.
spin(kDirDown, tripnum);
tripSpr->_moveY = 1;
tripSpr->_moveX = 0;
takeAStep(tripnum);
return;
} else if (tripSpr->_y > (avvy->_y + 2)) {
- // Avvy is further from the screen than Geida.
+ // Avvy is further from the screen than the following NPC.
spin(kDirUp, tripnum);
tripSpr->_moveY = -1;
tripSpr->_moveX = 0;
@@ -1169,8 +1205,9 @@ void Animation::drawSprites() {
* @remarks Originally called 'trippancy_link'
*/
void Animation::animLink() {
- if (_vm->_menu->isActive() || _vm->_seeScroll)
+ if (_vm->_dropdown->isActive() || !_vm->_animationsEnabled)
return;
+
for (int16 i = 0; i < kSpriteNumbMax; i++) {
AnimationType *curSpr = _sprites[i];
if (curSpr->_quick && curSpr->_visible)
@@ -1199,8 +1236,10 @@ void Animation::animLink() {
case kProcGrabAvvy :
grabAvvy(i);
break;
- case kProcGeida :
- geidaProcs(i);
+ case kProcFollowAvvy :
+ follow(i);
+ break;
+ default:
break;
}
}
@@ -1208,7 +1247,7 @@ void Animation::animLink() {
if (_mustExclaim) {
_mustExclaim = false;
- _vm->_dialogs->displayScrollChain('x', _sayWhat);
+ _vm->_dialogs->displayScrollChain('X', _sayWhat);
}
}
@@ -1291,7 +1330,7 @@ void Animation::handleMoveKey(const Common::Event &event) {
if (!_vm->_userMovesAvvy)
return;
- if (_vm->_menu->_activeMenuItem._activeNow)
+ if (_vm->_dropdown->_activeMenuItem._activeNow)
_vm->_parser->tryDropdown();
else {
switch (event.kbd.keycode) {
@@ -1360,6 +1399,69 @@ void Animation::handleMoveKey(const Common::Event &event) {
}
}
+/**
+* Draws a part of the lightning bolt for thunder().
+* @remarks Originally called 'zl'
+*/
+void Animation::drawLightning(int16 x1, int16 y1, int16 x2, int16 y2) {
+ _vm->_graphics->drawLine(x1, y1 - 1, x2, y2 - 1, 1, 3, kColorBlue);
+ _vm->_graphics->drawLine(x1, y1, x2, y2, 1, 1, kColorLightcyan);
+}
+
+/**
+* Plays the actual thunder animation when Avvy (the player) swears too much.
+* @remarks Originally called 'zonk'
+*/
+void Animation::thunder() {
+ _vm->_graphics->setBackgroundColor(kColorYellow);
+
+ _vm->_graphics->saveScreen();
+
+ int x = _vm->_animation->_sprites[0]->_x + _vm->_animation->_sprites[0]->_xLength / 2;
+ int y = _vm->_animation->_sprites[0]->_y;
+
+ for (int i = 0; i < 256; i++) {
+ _vm->_sound->playNote(270 - i, 1);
+
+ drawLightning(640, 0, 0, y / 4);
+ drawLightning(0, y / 4, 640, y / 2);
+ drawLightning(640, y / 2, x, y);
+ _vm->_graphics->refreshScreen();
+
+ _vm->_sound->playNote(2700 - 10 * i, 5);
+ _vm->_system->delayMillis(5);
+ _vm->_sound->playNote(270 - i, 1);
+
+ _vm->_graphics->restoreScreen();
+ _vm->_sound->playNote(2700 - 10 * i, 5);
+ _vm->_system->delayMillis(5);
+ }
+
+ _vm->_graphics->restoreScreen();
+ _vm->_graphics->removeBackup();
+
+ _vm->_graphics->setBackgroundColor(kColorBlack);
+}
+
+/**
+* Makes the screen wobble.
+*/
+void Animation::wobble() {
+ _vm->_graphics->saveScreen();
+
+ for (int i = 0; i < 26; i++) {
+ _vm->_graphics->shiftScreen();
+ _vm->_graphics->refreshScreen();
+ _vm->_system->delayMillis(i * 7);
+
+ _vm->_graphics->restoreScreen();
+ _vm->_system->delayMillis(i * 7);
+ }
+
+ _vm->_graphics->restoreScreen();
+ _vm->_graphics->removeBackup();
+}
+
void Animation::setDirection(Direction dir) {
_direction = dir;
}
@@ -1394,6 +1496,7 @@ int Animation::getAvvyClothes() {
}
void Animation::resetVariables() {
+ setDirection(kDirUp);
_geidaSpin = 0;
_geidaTime = 0;
_arrowTriggered = false;
diff --git a/engines/avalanche/animation.h b/engines/avalanche/animation.h
index 33f6ab02a6..d1ee4a3ebd 100644
--- a/engines/avalanche/animation.h
+++ b/engines/avalanche/animation.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -97,13 +97,13 @@ public:
static const byte kSpriteNumbMax = 5; // current max no. of sprites
enum Proc {
- kProcFollowAvvyY = 1,
+ kProcNone = 0,
+ kProcFollowAvvyY,
kProcBackAndForth,
kProcFaceAvvy,
kProcArrow,
- kProcSpludwick, // Unused
kProcGrabAvvy,
- kProcGeida // Spludwick uses it as well for homing! TODO: Unify it with kProcSpludwick.
+ kProcFollowAvvy
};
AnimationType *_sprites[kSpriteNumbMax];
@@ -124,6 +124,12 @@ public:
void handleMoveKey(const Common::Event &event);
void hideInCupboard();
+ // These 2 functions are responsible for playing the thunder animation when the player swears too much.
+ void drawLightning(int16 x1, int16 y1, int16 x2, int16 y2);
+ void thunder();
+
+ void wobble();
+
void setDirection(Direction dir);
void setOldDirection(Direction dir);
Direction getDirection();
@@ -156,11 +162,11 @@ private:
void followAvalotY(byte tripnum);
void backAndForth(byte tripnum);
void faceAvvy(byte tripnum);
-
+
// Movements for Homing NPCs: Spludwick and Geida.
void spin(Direction dir, byte &tripnum);
void takeAStep(byte &tripnum);
- void geidaProcs(byte tripnum);
+ void follow(byte tripnum);
void drawSprites();
};
diff --git a/engines/avalanche/avalanche.cpp b/engines/avalanche/avalanche.cpp
index 4f3868768a..6cfe4dfdb6 100644
--- a/engines/avalanche/avalanche.cpp
+++ b/engines/avalanche/avalanche.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope 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.
@@ -41,17 +41,26 @@ AvalancheEngine::AvalancheEngine(OSystem *syst, const AvalancheGameDescription *
TimeDate time;
_system->getTimeAndDate(time);
_rnd->setSeed(time.tm_sec + time.tm_min + time.tm_hour);
-
- // Needed because of Lucerna::load_also()
- for (int i = 0; i < 31; i++) {
- for (int j = 0; j < 2; j++)
- _also[i][j] = nullptr;
- }
-
- _totalTime = 0;
_showDebugLines = false;
- memset(_fxPal, 0, 16 * 16 * 3);
+ _clock = nullptr;
+ _graphics = nullptr;
+ _parser = nullptr;
+ _dialogs = nullptr;
+ _background = nullptr;
+ _sequence = nullptr;
+ _timer = nullptr;
+ _animation = nullptr;
+ _dropdown = nullptr;
+ _closing = nullptr;
+ _sound = nullptr;
+ _nim = nullptr;
+ _ghostroom = nullptr;
+ _help = nullptr;
+ _highscore = nullptr;
+
+ _platform = gd->desc.platform;
+ initVariables();
}
AvalancheEngine::~AvalancheEngine() {
@@ -62,15 +71,18 @@ AvalancheEngine::~AvalancheEngine() {
delete _parser;
delete _clock;
- delete _pingo;
delete _dialogs;
delete _background;
delete _sequence;
delete _timer;
delete _animation;
- delete _menu;
+ delete _dropdown;
delete _closing;
delete _sound;
+ delete _nim;
+ delete _ghostroom;
+ delete _help;
+ delete _highscore;
for (int i = 0; i < 31; i++) {
for (int j = 0; j < 2; j++) {
@@ -82,20 +94,80 @@ AvalancheEngine::~AvalancheEngine() {
}
}
+void AvalancheEngine::initVariables() {
+ for (int i = 0; i < 31; i++) {
+ _also[i][0] = nullptr;
+ _also[i][1] = nullptr;
+ }
+
+ memset(_fxPal, 0, 16 * 16 * 3);
+
+ for (int i = 0; i < 15; i++) {
+ _peds[i]._direction = kDirNone;
+ _peds[i]._x = 0;
+ _peds[i]._y = 0;
+ _magics[i]._operation = kMagicNothing;
+ _magics[i]._data = 0;
+ }
+
+ for (int i = 0; i < 7; i++) {
+ _portals[i]._operation = kMagicNothing;
+ _portals[i]._data = 0;
+ }
+
+ for (int i = 0; i < 30; i++) {
+ _fields[i]._x1 = 0;
+ _fields[i]._y1 = 0;
+ _fields[i]._x2 = 0;
+ _fields[i]._y2 = 0;
+ }
+
+ _fieldNum = 0;
+ _cp = 0;
+ _ledStatus = 177;
+ _alive = false;
+ _subjectNum = 0;
+ _him = kPeoplePardon;
+ _her = kPeoplePardon;
+ _it = Parser::kPardon;
+ _roomCycles = 0;
+ _doingSpriteRun = false;
+ _isLoaded = false;
+ _soundFx = true;
+ _holdTheDawn = false;
+
+ _lineNum = 0;
+ for (int i = 0; i < 50; i++)
+ _lines[i]._color = kColorWhite;
+ _dropsOk = false;
+ _cheat = false;
+ _letMeOut = false;
+ _thinks = 2;
+ _thinkThing = true;
+ _animationsEnabled = true;
+ _currentMouse = 177;
+ _holdLeftMouse = false;
+
+ resetVariables();
+}
+
Common::ErrorCode AvalancheEngine::initialize() {
_graphics = new GraphicManager(this);
_parser = new Parser(this);
_clock = new Clock(this);
- _pingo = new Pingo(this);
_dialogs = new Dialogs(this);
_background = new Background(this);
_sequence = new Sequence(this);
_timer = new Timer(this);
_animation = new Animation(this);
- _menu = new Menu(this);
+ _dropdown = new DropDownMenu(this);
_closing = new Closing(this);
_sound = new SoundHandler(this);
+ _nim = new Nim(this);
+ _ghostroom = new GhostRoom(this);
+ _help = new Help(this);
+ _highscore = new HighScore(this);
_graphics->init();
_dialogs->init();
@@ -124,13 +196,14 @@ const char *AvalancheEngine::getCopyrightString() const {
void AvalancheEngine::synchronize(Common::Serializer &sz) {
_animation->synchronize(sz);
_parser->synchronize(sz);
+ _nim->synchronize(sz);
_sequence->synchronize(sz);
_background->synchronize(sz);
sz.syncAsByte(_carryNum);
for (int i = 0; i < kObjectNum; i++)
sz.syncAsByte(_objects[i]);
- sz.syncAsSint16LE(_dnascore);
+ sz.syncAsSint16LE(_score);
sz.syncAsSint32LE(_money);
sz.syncAsByte(_room);
if (sz.isSaving())
@@ -166,17 +239,17 @@ void AvalancheEngine::synchronize(Common::Serializer &sz) {
sz.syncAsByte(_arrowInTheDoor);
if (sz.isSaving()) {
- uint16 like2drinkSize = _favouriteDrink.size();
+ uint16 like2drinkSize = _favoriteDrink.size();
sz.syncAsUint16LE(like2drinkSize);
for (uint16 i = 0; i < like2drinkSize; i++) {
- char actChr = _favouriteDrink[i];
+ char actChr = _favoriteDrink[i];
sz.syncAsByte(actChr);
}
- uint16 favourite_songSize = _favouriteSong.size();
- sz.syncAsUint16LE(favourite_songSize);
- for (uint16 i = 0; i < favourite_songSize; i++) {
- char actChr = _favouriteSong[i];
+ uint16 favoriteSongSize = _favoriteSong.size();
+ sz.syncAsUint16LE(favoriteSongSize);
+ for (uint16 i = 0; i < favoriteSongSize; i++) {
+ char actChr = _favoriteSong[i];
sz.syncAsByte(actChr);
}
@@ -194,23 +267,23 @@ void AvalancheEngine::synchronize(Common::Serializer &sz) {
sz.syncAsByte(actChr);
}
} else {
- if (!_favouriteDrink.empty())
- _favouriteDrink.clear();
+ if (!_favoriteDrink.empty())
+ _favoriteDrink.clear();
uint16 like2drinkSize = 0;
char actChr = ' ';
sz.syncAsUint16LE(like2drinkSize);
for (uint16 i = 0; i < like2drinkSize; i++) {
sz.syncAsByte(actChr);
- _favouriteDrink += actChr;
+ _favoriteDrink += actChr;
}
- if (!_favouriteSong.empty())
- _favouriteSong.clear();
- uint16 favourite_songSize = 0;
- sz.syncAsUint16LE(favourite_songSize);
- for (uint16 i = 0; i < favourite_songSize; i++) {
+ if (!_favoriteSong.empty())
+ _favoriteSong.clear();
+ uint16 favoriteSongSize = 0;
+ sz.syncAsUint16LE(favoriteSongSize);
+ for (uint16 i = 0; i < favoriteSongSize; i++) {
sz.syncAsByte(actChr);
- _favouriteSong += actChr;
+ _favoriteSong += actChr;
}
if (!_worstPlaceOnEarth.empty())
@@ -263,11 +336,11 @@ void AvalancheEngine::synchronize(Common::Serializer &sz) {
sz.syncAsByte(_timer->_times[i]._action);
sz.syncAsByte(_timer->_times[i]._reason);
}
-
+
}
-bool AvalancheEngine::canSaveGameStateCurrently() { // TODO: Refine these!!!
- return (!_seeScroll && _alive);
+bool AvalancheEngine::canSaveGameStateCurrently() {
+ return (_animationsEnabled && _alive);
}
Common::Error AvalancheEngine::saveGameState(int slot, const Common::String &desc) {
@@ -297,6 +370,8 @@ bool AvalancheEngine::saveGame(const int16 slot, const Common::String &desc) {
f->writeSint16LE(t.tm_mon);
f->writeSint16LE(t.tm_year);
+ _totalTime += getTimeInSeconds() - _startTime;
+
Common::Serializer sz(NULL, f);
synchronize(sz);
f->finalize();
@@ -309,8 +384,8 @@ Common::String AvalancheEngine::getSaveFileName(const int slot) {
return Common::String::format("%s.%03d", _targetName.c_str(), slot);
}
-bool AvalancheEngine::canLoadGameStateCurrently() { // TODO: Refine these!!!
- return (!_seeScroll);
+bool AvalancheEngine::canLoadGameStateCurrently() {
+ return (_animationsEnabled);
}
Common::Error AvalancheEngine::loadGameState(int slot) {
@@ -329,7 +404,7 @@ bool AvalancheEngine::loadGame(const int16 slot) {
// Check version. We can't restore from obsolete versions.
byte saveVersion = f->readByte();
- if (saveVersion != kSavegameVersion) {
+ if (saveVersion > kSavegameVersion) {
warning("Savegame of incompatible version!");
delete f;
return false;
@@ -352,14 +427,15 @@ bool AvalancheEngine::loadGame(const int16 slot) {
t.tm_mon = f->readSint16LE();
t.tm_year = f->readSint16LE();
- resetVariables();
+ resetAllVariables();
Common::Serializer sz(f, NULL);
synchronize(sz);
delete f;
_isLoaded = true;
- _seeScroll = true; // This prevents display of the new sprites before the new picture is loaded.
+
+ _animationsEnabled = false;
if (_holdTheDawn) {
_holdTheDawn = false;
@@ -368,7 +444,7 @@ bool AvalancheEngine::loadGame(const int16 slot) {
_background->release();
minorRedraw();
- _menu->setup();
+ _dropdown->setup();
setRoom(kPeopleAvalot, _room);
_alive = true;
refreshObjectList();
@@ -377,9 +453,9 @@ bool AvalancheEngine::loadGame(const int16 slot) {
_animation->animLink();
_background->update();
- Common::String tmpStr = Common::String::format("%cLoaded: %c%s.ASG%c%c%c%s%c%csaved on %s.",
- kControlItalic, kControlRoman, description.c_str(), kControlCenter, kControlNewLine,
- kControlNewLine, _roomnName.c_str(), kControlNewLine, kControlNewLine,
+ Common::String tmpStr = Common::String::format("%cLoaded: %c%s.ASG%c%c%c%s%c%csaved on %s.",
+ kControlItalic, kControlRoman, description.c_str(), kControlCenter, kControlNewLine,
+ kControlNewLine, _roomnName.c_str(), kControlNewLine, kControlNewLine,
expandDate(t.tm_mday, t.tm_mon, t.tm_year).c_str());
_dialogs->displayText(tmpStr);
@@ -416,6 +492,12 @@ Common::String AvalancheEngine::expandDate(int d, int m, int y) {
return day + ' ' + month + ' ' + intToStr(y + 1900);
}
+uint32 AvalancheEngine::getTimeInSeconds() {
+ TimeDate time;
+ _system->getTimeAndDate(time);
+ return time.tm_hour * 3600 + time.tm_min * 60 + time.tm_sec;
+}
+
void AvalancheEngine::updateEvents() {
Common::Event event;
@@ -456,75 +538,9 @@ Common::Error AvalancheEngine::run() {
do {
runAvalot();
-
-#if 0
- switch (_storage._operation) {
- case kRunShootemup:
- run("seu.avx", kJsb, kBflight, kNormal);
- break;
- case kRunDosshell:
- dosShell();
- break;
- case kRunGhostroom:
- run("g-room.avx", kJsb, kNoBflight, kNormal);
- break;
- case kRunGolden:
- run("golden.avx", kJsb, kBflight, kMusical);
- break;
- }
-#endif
-
} while (!_letMeOut && !shouldQuit());
return Common::kNoError;
}
-#if 0
-void AvalancheEngine::run(Common::String what, bool withJsb, bool withBflight, Elm how) {
- // Probably there'll be no need of this function, as all *.AVX-es will become classes.
- warning("STUB: run(%s)", what.c_str());
-}
-
-Common::String AvalancheEngine::elmToStr(Elm how) {
- switch (how) {
- case kNormal:
- case kMusical:
- return Common::String("jsb");
- case kRegi:
- return Common::String("REGI");
- case kElmpoyten:
- return Common::String("ELMPOYTEN");
- // Useless, but silent a warning
- default:
- return Common::String("");
- }
-}
-
-// Same as keypressed1().
-void AvalancheEngine::flushBuffer() {
- warning("STUB: flushBuffer()");
-}
-
-void AvalancheEngine::dosShell() {
- warning("STUB: dosShell()");
-}
-
-// Needed in dos_shell(). TODO: Remove later.
-Common::String AvalancheEngine::commandCom() {
- warning("STUB: commandCom()");
- return ("STUB: commandCom()");
-}
-
-// Needed for run_avalot()'s errors. TODO: Remove later.
-void AvalancheEngine::explain(byte error) {
- warning("STUB: explain()");
-}
-
-// Needed later.
-void AvalancheEngine::quit() {
- cursorOn();
-}
-
-#endif
-
} // End of namespace Avalanche
diff --git a/engines/avalanche/avalanche.h b/engines/avalanche/avalanche.h
index cc9a34d82b..6eb5e675cc 100644
--- a/engines/avalanche/avalanche.h
+++ b/engines/avalanche/avalanche.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope 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.
@@ -32,15 +32,21 @@
#include "avalanche/graphics.h"
#include "avalanche/parser.h"
#include "avalanche/avalot.h"
-#include "avalanche/pingo.h"
#include "avalanche/dialogs.h"
#include "avalanche/background.h"
#include "avalanche/sequence.h"
#include "avalanche/timer.h"
#include "avalanche/animation.h"
-#include "avalanche/menu.h"
+#include "avalanche/dropdown.h"
#include "avalanche/closing.h"
#include "avalanche/sound.h"
+#include "avalanche/nim.h"
+#include "avalanche/clock.h"
+#include "avalanche/ghostroom.h"
+#include "avalanche/help.h"
+#include "avalanche/shootemup.h"
+#include "avalanche/mainmenu.h"
+#include "avalanche/highscore.h"
#include "common/serializer.h"
@@ -55,9 +61,11 @@ class RandomSource;
namespace Avalanche {
-struct AvalancheGameDescription;
+struct AvalancheGameDescription {
+ ADGameDescription desc;
+};
-static const int kSavegameVersion = 1;
+static const int kSavegameVersion = 2;
enum Pitch {
kPitchInvalid,
@@ -73,15 +81,18 @@ public:
Clock *_clock;
GraphicManager *_graphics;
Parser *_parser;
- Pingo *_pingo;
Dialogs *_dialogs;
Background *_background;
Sequence *_sequence;
Timer *_timer;
Animation *_animation;
- Menu *_menu;
+ DropDownMenu *_dropdown;
Closing *_closing;
SoundHandler *_sound;
+ Nim *_nim;
+ GhostRoom *_ghostroom;
+ Help *_help;
+ HighScore *_highscore;
OSystem *_system;
@@ -109,6 +120,7 @@ public:
Common::Error loadGameState(int slot);
bool loadGame(const int16 slot);
Common::String expandDate(int d, int m, int y);
+ uint32 getTimeInSeconds();
void updateEvents();
bool getEvent(Common::Event &event); // A wrapper around _eventMan->pollEvent(), so we can use it in Scrolls::normscroll() for example.
@@ -122,43 +134,6 @@ private:
AvalancheConsole *_console;
Common::Platform _platform;
-#if 0
- struct {
- byte _operation;
- uint16 _skellern;
- byte _contents[1000];
- } _storage;
-
- static const int16 kRunShootemup = 1, kRunDosshell = 2, kRunGhostroom = 3, kRunGolden = 4;
- static const int16 kReset = 0;
-
- static const bool kJsb = true, kNoJsb = false, kBflight = true, kNoBflight = false;
-
- // From bootstrp:
- enum Elm {kNormal, kMusical, kElmpoyten, kRegi};
-
- Common::String _argsWithNoFilename;
- byte _originalMode;
- byte *_old1c;
- Common::String _segofs;
- int32 _soundcard, _speed, _baseaddr, _irq, _dma;
- bool _zoomy;
-
- void run(Common::String what, bool withJsb, bool withBflight, Elm how);
- void bFlightOn();
- void bFlightOff();
- Common::String elmToStr(Elm how);
- bool keyPressed();
- void flushBuffer();
- void dosShell();
- void bFlight();
- Common::String commandCom();
- void explain(byte error);
- void cursorOff();
- void cursorOn();
- void quit();
-#endif
-
public:
// For Thinkabout:
static const bool kThing = true;
@@ -167,7 +142,6 @@ public:
static const char kSpludwicksOrder[3];
static const uint16 kNotes[12];
- static const TuneType kTune;
bool _holdLeftMouse;
@@ -178,7 +152,7 @@ public:
// Former DNA structure
byte _carryNum; // How many objects you're carrying...
bool _objects[kObjectNum]; // ...and which ones they are.
- int16 _dnascore; // your score, of course
+ int16 _score; // your score, of course
int32 _money; // your current amount of dosh
Room _room; // your current room
bool _wonNim; // Have you *won* Nim? (That's harder.)
@@ -207,8 +181,9 @@ public:
bool _standingOnDais; // In room 71, inside Cardiff Castle.
bool _takenPen; // Have you taken the pen (in Cardiff?)
bool _arrowInTheDoor; // Did the arrow hit the wall?
- Common::String _favouriteDrink, _favouriteSong, _worstPlaceOnEarth, _spareEvening; // Personalisation str's
- uint32 _totalTime; // Your total time playing this game, in ticks.
+ Common::String _favoriteDrink, _favoriteSong, _worstPlaceOnEarth, _spareEvening; // Personalisation str's
+ uint32 _startTime; // When did you start playing this session?
+ uint32 _totalTime; // Your total time playing this game, in seconds. Updated only at saving and loading.
byte _jumpStatus; // Fixes how high you're jumping.
bool _mushroomGrowing; // Is the mushroom growing in 42?
bool _crapulusWillTell; // Will Crapulus tell you about Spludwick being away?
@@ -237,7 +212,7 @@ public:
bool _letMeOut;
byte _thinks;
bool _thinkThing;
- bool _seeScroll; // TODO: maybe this means we're interacting with the toolbar / a scroll?
+ bool _animationsEnabled; // If set to TRUE, it stops the animation system working. This prevents display of the new sprites before the new picture is loaded or during the display of a scroll. Original name: seescroll.
char _objectList[10];
// Called .free() for them in ~Gyro().
@@ -255,13 +230,15 @@ public:
byte _subjectNum; // The same thing.
People _him, _her;
byte _it;
- uint32 _roomTime; // Set to 0 when you enter a room, added to in every loop.
+ uint32 _roomCycles; // Set to 0 when you enter a room, added to in every loop. Cycles since you've been in this room.
bool _doingSpriteRun; // Only set to True if we're doing a sprite_run at this moment. This stops the trippancy system from moving any of the sprites.
- bool _isLoaded; // Is it a loaded gamestate?
bool _soundFx;
+ bool _isLoaded; // Is it a loaded gamestate?
+
void callVerb(VerbCode id);
+ void loadBackground(byte num);
void loadRoom(byte num);
void thinkAbout(byte object, bool type); // Hey!!! Get it and put it!!!
void incScore(byte num); // Add on no. of points
@@ -274,9 +251,9 @@ public:
void gameOver();
uint16 bearing(byte whichPed); // Returns the bearing from ped 'whichped' to Avvy, in degrees.
- // There are two kinds of redraw: Major and Minor. Minor is what happens when you load a game, etc. Major redraws EVERYTHING.
+ // There are two kinds of redraw: Major and Minor. Minor is what happens when you load a game, etc.
+ // Major was replaced with GraphicManager::refreshScreen(), it redraws EVERYTHING.
void minorRedraw();
- void majorRedraw();
void spriteRun();
@@ -284,7 +261,7 @@ public:
void newGame(); // This sets up the DNA for a completely new game.
bool getFlag(char x);
bool decreaseMoney(uint16 amount); // Called pennycheck in the original.
-
+
Common::String getName(People whose);
Common::String getItem(byte which); // Called get_better in the original.
Common::String f5Does(); // This procedure determines what f5 does.
@@ -316,6 +293,7 @@ private:
Common::String readAlsoStringFromFile(Common::File &file);
void runAvalot();
void init();
+ void initVariables();
void setup();
void scram(Common::String &str);
void unScramble();
@@ -332,6 +310,7 @@ private:
void checkClick();
void fixFlashers();
void loadAlso(byte num);
+ void resetAllVariables();
void resetVariables();
};
diff --git a/engines/avalanche/avalot.cpp b/engines/avalanche/avalot.cpp
index 8ef41a2c93..0ffe7d3f9d 100644
--- a/engines/avalanche/avalot.cpp
+++ b/engines/avalanche/avalot.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope 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.
@@ -76,11 +76,6 @@ namespace Avalanche {
const char AvalancheEngine::kSpludwicksOrder[3] = {kObjectOnion, kObjectInk, kObjectMushroom};
const uint16 AvalancheEngine::kNotes[12] = {196, 220, 247, 262, 294, 330, 350, 392, 440, 494, 523, 587};
-const TuneType AvalancheEngine::kTune = {
- kPitchHigher, kPitchHigher, kPitchLower, kPitchSame, kPitchHigher, kPitchHigher, kPitchLower, kPitchHigher, kPitchHigher, kPitchHigher,
- kPitchLower, kPitchHigher, kPitchHigher, kPitchSame, kPitchHigher, kPitchLower, kPitchLower, kPitchLower, kPitchLower, kPitchHigher,
- kPitchHigher, kPitchLower, kPitchLower, kPitchLower, kPitchLower, kPitchSame, kPitchLower, kPitchHigher, kPitchSame, kPitchLower, kPitchHigher
-};
Room AvalancheEngine::_whereIs[29] = {
// The Lads
@@ -116,83 +111,6 @@ Room AvalancheEngine::_whereIs[29] = {
kRoomWiseWomans // The Wise Woman.
};
-Clock::Clock(AvalancheEngine *vm) {
- _vm = vm;
- _oldHour = _oldHourAngle = _oldMinute = 17717;
-}
-
-void Clock::update() { // TODO: Move variables from Gyro to here (or at least somewhere nearby), rename them.
- TimeDate t;
- _vm->_system->getTimeAndDate(t);
- _hour = t.tm_hour;
- _minute = t.tm_min;
- _second = t.tm_sec;
-
- _hourAngle = (_hour % 12) * 30 + _minute / 2;
-
- if (_oldHour != _hour) {
- plotHands();
- chime();
- }
-
- if (_oldMinute != _minute)
- plotHands();
-
- if ((_hour == 0) && (_oldHour != 0) && (_oldHour != 17717)) {
- Common::String tmpStr = Common::String::format("Good morning!%c%cYes, it's just past " \
- "midnight. Are you having an all-night Avvy session? Glad you like the game that much!",
- kControlNewLine, kControlNewLine);
- _vm->_dialogs->displayText(tmpStr);
- }
- _oldHour = _hour;
- _oldHourAngle = _hourAngle;
- _oldMinute = _minute;
-}
-
-Common::Point Clock::calcHand(uint16 angle, uint16 length, Color color) {
- if (angle > 900) {
- return(Common::Point(177, 177));
- }
-
- return(_vm->_graphics->drawScreenArc(kCenterX, kCenterY, 449 - angle, 450 - angle, length, color));
-}
-
-void Clock::drawHand(const Common::Point &endPoint, Color color) {
- if (endPoint.x == 177)
- return;
-
- _vm->_graphics->drawScreenLine(kCenterX, kCenterY, endPoint.x, endPoint.y, color);
-}
-
-void Clock::plotHands() {
- _clockHandHour = calcHand(_oldHourAngle, 14, kColorYellow);
- _clockHandMinute = calcHand(_oldMinute * 6, 17, kColorYellow);
- drawHand(_clockHandHour, kColorBrown);
- drawHand(_clockHandMinute, kColorBrown);
-
- _clockHandHour = calcHand(_hourAngle, 14, kColorBrown);
- _clockHandMinute = calcHand(_minute * 6, 17, kColorBrown);
- drawHand(_clockHandHour, kColorYellow);
- drawHand(_clockHandMinute, kColorYellow);
-}
-
-void Clock::chime() {
- if ((_oldHour == 17717) || (!_vm->_soundFx)) // Too high - must be first time around
- return;
-
- byte hour = _hour % 12;
- if (hour == 0)
- hour = 12;
-
- _vm->_graphics->loadMouse(kCurWait);
-
- for (int i = 1; i <= hour; i++) {
- for (int j = 1; j <= 3; j++)
- _vm->_sound->playNote((i % 3) * 64 + 140 - j * 30, 50 - j * 12);
- if (i != hour)
- _vm->_system->delayMillis(100);
- }
-}
void AvalancheEngine::handleKeyDown(Common::Event &event) {
@@ -272,7 +190,6 @@ void AvalancheEngine::setup() {
_animation->resetAnims();
- drawToolbar();
_dialogs->setReadyLight(2);
fadeIn();
@@ -281,7 +198,11 @@ void AvalancheEngine::setup() {
_animation->_sprites[0]->_speedX = kWalk;
_animation->updateSpeed();
- _menu->init();
+ _dropdown->init();
+
+ _graphics->drawSoundLight(_sound->_soundFl);
+
+ drawToolbar();
int16 loadSlot = ConfMan.instance().getInt("save_slot");
if (loadSlot >= 0) {
@@ -290,27 +211,31 @@ void AvalancheEngine::setup() {
loadGame(loadSlot);
} else {
- _isLoaded = false; // Set to true in _vm->loadGame().
+ // We don't need the MainMenu during the whole game, only at the beginning of it.
+ MainMenu *mainmenu = new MainMenu(this);
+ mainmenu->run();
+ delete mainmenu;
+ if (_letMeOut)
+ return;
+
newGame();
- _soundFx = !_soundFx;
- fxToggle();
thinkAbout(kObjectMoney, kThing);
- _dialogs->displayScrollChain('q', 83); // Info on the game, etc.
+ _dialogs->displayScrollChain('Q', 83); // Info on the game, etc.
}
}
void AvalancheEngine::runAvalot() {
setup();
- do {
+ while (!_letMeOut && !shouldQuit()) {
uint32 beginLoop = _system->getMillis();
updateEvents(); // The event handler.
_clock->update();
- _menu->update();
+ _dropdown->update();
_background->update();
_animation->animLink();
checkClick();
@@ -322,9 +247,7 @@ void AvalancheEngine::runAvalot() {
uint32 delay = _system->getMillis() - beginLoop;
if (delay <= 55)
_system->delayMillis(55 - delay); // Replaces slowdown(); 55 comes from 18.2 Hz (B Flight).
- } while (!_letMeOut && !shouldQuit());
-
- warning("STUB: run()");
+ };
_closing->exitGame();
}
@@ -335,13 +258,6 @@ void AvalancheEngine::init() {
_also[i][j] = nullptr;
}
-#if 0
- if (_vm->_enhanced->atbios)
- atkey = "f1";
- else
- atkey = "alt-";
-#endif
-
_letMeOut = false;
_currentMouse = 177;
_dropsOk = true;
@@ -498,9 +414,7 @@ void AvalancheEngine::loadAlso(byte num) {
}
}
-void AvalancheEngine::loadRoom(byte num) {
- CursorMan.showMouse(false);
-
+void AvalancheEngine::loadBackground(byte num) {
Common::String filename = Common::String::format("place%d.avd", num);
Common::File file;
if (!file.open(filename))
@@ -522,9 +436,15 @@ void AvalancheEngine::loadRoom(byte num) {
_graphics->refreshBackground();
file.close();
+}
+
+void AvalancheEngine::loadRoom(byte num) {
+ CursorMan.showMouse(false);
+ loadBackground(num);
loadAlso(num);
- _background->load(num);
+ _background->loadSprites(num);
+
CursorMan.showMouse(true);
}
@@ -542,7 +462,7 @@ void AvalancheEngine::findPeople(byte room) {
void AvalancheEngine::exitRoom(byte x) {
_sound->stopSound();
_background->release();
- _seeScroll = true; // This stops the trippancy system working over the length of this procedure.
+ _animationsEnabled = false;
switch (x) {
case kRoomSpludwicks:
@@ -565,21 +485,20 @@ void AvalancheEngine::exitRoom(byte x) {
}
_interrogation = 0; // Leaving the room cancels all the questions automatically.
- _seeScroll = false; // Now it can work again!
+ _animationsEnabled = true;
_lastRoom = _room;
if (_room != kRoomMap)
_lastRoomNotMap = _room;
}
-
/**
* Only when entering a NEW town! Not returning to the last one,
* but choosing another from the map.
* @remarks Originally called 'new_town'
*/
void AvalancheEngine::enterNewTown() {
- _menu->setup();
+ _dropdown->setup();
switch (_room) {
case kRoomOutsideNottsPub: // Entry into Nottingham.
@@ -613,11 +532,11 @@ void AvalancheEngine::putGeidaAt(byte whichPed, byte ped) {
spr1->init(5, false); // load Geida
_animation->appearPed(1, whichPed);
spr1->_callEachStepFl = true;
- spr1->_eachStepProc = Animation::kProcGeida;
+ spr1->_eachStepProc = Animation::kProcFollowAvvy;
}
void AvalancheEngine::enterRoom(Room roomId, byte ped) {
- _seeScroll = true; // This stops the trippancy system working over the length of this procedure.
+ _animationsEnabled = false;
findPeople(roomId);
_room = roomId;
@@ -634,12 +553,13 @@ void AvalancheEngine::enterRoom(Room roomId, byte ped) {
if (_geidaFollows)
_whereIs[kPeopleGeida - 150] = roomId;
- _roomTime = 0;
-
+ _roomCycles = 0;
if ((_lastRoom == kRoomMap) && (_lastRoomNotMap != _room))
enterNewTown();
+ _animation->updateSpeed();
+
switch (roomId) {
case kRoomYours:
if (_avvyInBed) {
@@ -697,7 +617,7 @@ void AvalancheEngine::enterRoom(Room roomId, byte ped) {
}
spr1->_callEachStepFl = true;
- spr1->_eachStepProc = Animation::kProcGeida;
+ spr1->_eachStepProc = Animation::kProcFollowAvvy;
} else
_whereIs[kPeopleSpludwick - 150] = kRoomNowhere;
break;
@@ -806,12 +726,12 @@ void AvalancheEngine::enterRoom(Room roomId, byte ped) {
_graphics->zoomOut(_peds[ped - 1]._x, _peds[ped - 1]._y);
if ((_objects[kObjectWine - 1]) && (_wineState != 3)) {
- _dialogs->displayScrollChain('q', 9); // Don't want to waste the wine!
+ _dialogs->displayScrollChain('Q', 9); // Don't want to waste the wine!
_objects[kObjectWine - 1] = false;
refreshObjectList();
}
- _dialogs->displayScrollChain('q', 69);
+ _dialogs->displayScrollChain('Q', 69);
break;
case kRoomCatacombs:
@@ -994,14 +914,13 @@ void AvalancheEngine::enterRoom(Room roomId, byte ped) {
case kRoomDucks:
_npcFacing = 1; // Duck.
- break;
+ break;
default:
break;
}
- _seeScroll = false; // Now it can work again!
- _isLoaded = false;
+ _animationsEnabled = true;
}
void AvalancheEngine::thinkAbout(byte object, bool type) {
@@ -1036,7 +955,7 @@ void AvalancheEngine::drawToolbar() {
}
void AvalancheEngine::drawScore() {
- uint16 score = _dnascore;
+ uint16 score = _score;
int8 numbers[3] = {0, 0, 0};
for (int i = 0; i < 2; i++) {
byte divisor = 1;
@@ -1060,17 +979,16 @@ void AvalancheEngine::drawScore() {
_scoreToDisplay[i] = numbers[i];
}
-void AvalancheEngine::incScore(byte num) {
+void AvalancheEngine::incScore(byte num) {
for (int i = 1; i <= num; i++) {
- _dnascore++;
+ _score++;
if (_soundFx) {
for (int j = 1; j <= 97; j++)
- // Length os 2 is a guess, the original doesn't have a delay specified
- _sound->playNote(177 + _dnascore * 3, 2);
+ // Length of 2 is a guess, the original doesn't have a delay specified
+ _sound->playNote(177 + _score * 3, 2);
}
}
- warning("STUB: points()");
drawScore();
}
@@ -1195,7 +1113,7 @@ void AvalancheEngine::checkClick() {
_graphics->loadMouse(kCurIBeam); //I-beam
else if ((340 <= cursorPos.y) && (cursorPos.y <= 399))
_graphics->loadMouse(kCurScrewDriver); // screwdriver
- else if (!_menu->isActive()) { // Dropdown can handle its own pointers.
+ else if (!_dropdown->isActive()) { // Dropdown can handle its own pointers.
if (_holdLeftMouse) {
_graphics->loadMouse(kCurCrosshair); // Mark's crosshairs
guideAvvy(cursorPos); // Normally, if you click on the picture, you're guiding Avvy around.
@@ -1206,7 +1124,7 @@ void AvalancheEngine::checkClick() {
if (_holdLeftMouse) {
if ((0 <= cursorPos.y) && (cursorPos.y <= 21)) { // Click on the dropdown menu.
if (_dropsOk)
- _menu->update();
+ _dropdown->update();
} else if ((317 <= cursorPos.y) && (cursorPos.y <= 339)) { // Click on the command line.
_parser->_inputTextPos = (cursorPos.x - 23) / 8;
if (_parser->_inputTextPos > _parser->_inputText.size() + 1)
@@ -1229,7 +1147,7 @@ void AvalancheEngine::checkClick() {
_parser->_thing += 49;
_parser->_person = kPeoplePardon;
} else {
- _parser->_person = (People) _thinks;
+ _parser->_person = (People)_thinks;
_parser->_thing = _parser->kPardon;
}
callVerb(kVerbCodeExam);
@@ -1246,7 +1164,7 @@ void AvalancheEngine::checkClick() {
_animation->_sprites[0]->_speedX = kRun;
_animation->updateSpeed();
} else if ((396 <= cursorPos.x) && (cursorPos.x <= 483))
- fxToggle();
+ _sound->toggleSound();
else if ((535 <= cursorPos.x) && (cursorPos.x <= 640))
_mouseText.insertChar(kControlNewLine, 0);
} else if (!_dropsOk)
@@ -1255,7 +1173,14 @@ void AvalancheEngine::checkClick() {
}
void AvalancheEngine::errorLed() {
- warning("STUB: errorled()");
+ _dialogs->setReadyLight(0);
+ _graphics->drawErrorLight(true);
+ for (int i = 177; i >= 1; i--) {
+ _sound->playNote(177 + (i * 177177) / 999, 1);
+ _system->delayMillis(1);
+ }
+ _graphics->drawErrorLight(false);
+ _dialogs->setReadyLight(2);
}
/**
@@ -1307,9 +1232,9 @@ void AvalancheEngine::fadeOut() {
void AvalancheEngine::fadeIn() {
if (_holdTheDawn || !_fxHidden)
return;
-
+
_fxHidden = false;
-
+
byte pal[3];
for (int i = 15; i >= 0; i--) {
for (int j = 0; j < 16; j++) {
@@ -1337,7 +1262,6 @@ void AvalancheEngine::drawDirection() { // It's data is loaded in load_digits().
CursorMan.showMouse(true);
}
-
void AvalancheEngine::gameOver() {
_userMovesAvvy = false;
@@ -1366,17 +1290,13 @@ void AvalancheEngine::minorRedraw() {
fadeIn();
}
-void AvalancheEngine::majorRedraw() {
- warning("STUB: major_redraw()");
-}
-
uint16 AvalancheEngine::bearing(byte whichPed) {
AnimationType *avvy = _animation->_sprites[0];
PedType *curPed = &_peds[whichPed];
if (avvy->_x == curPed->_x)
return 0;
-
+
int16 deltaX = avvy->_x - curPed->_x;
int16 deltaY = avvy->_y - curPed->_y;
uint16 result = (uint16)(atan((float)(deltaY / deltaX)) * 180 / M_PI);
@@ -1387,7 +1307,7 @@ uint16 AvalancheEngine::bearing(byte whichPed) {
}
}
-/**
+/**
* @remarks Originally called 'sprite_run'
*/
void AvalancheEngine::spriteRun() {
@@ -1409,12 +1329,11 @@ Common::String AvalancheEngine::intToStr(int32 num) {
}
void AvalancheEngine::resetVariables() {
- _animation->setDirection(kDirUp);
_carryNum = 0;
for (int i = 0; i < kObjectNum; i++)
_objects[i] = false;
- _dnascore = 0;
+ _score = 0;
_money = 0;
_room = kRoomNowhere;
_saveNum = 0;
@@ -1448,16 +1367,16 @@ void AvalancheEngine::resetVariables() {
_standingOnDais = false;
_takenPen = false;
_arrowInTheDoor = false;
- _favouriteDrink = "";
- _favouriteSong = "";
+ _favoriteDrink = "";
+ _favoriteSong = "";
_worstPlaceOnEarth = "";
_spareEvening = "";
_totalTime = 0;
_jumpStatus = 0;
_mushroomGrowing = false;
_spludwickAtHome = false;
- _lastRoom = 0;
- _lastRoomNotMap = 0;
+ _lastRoom = kRoomDummy;
+ _lastRoomNotMap = kRoomDummy;
_crapulusWillTell = false;
_enterCatacombsFromLustiesRoom = false;
_teetotal = false;
@@ -1477,12 +1396,18 @@ void AvalancheEngine::resetVariables() {
_takenMushroom = false;
_givenPenToAyles = false;
_askedDogfoodAboutNim = false;
+ _startTime = getTimeInSeconds();
+}
+void AvalancheEngine::resetAllVariables() {
+ resetVariables();
_parser->resetVariables();
+ _nim->resetVariables();
_animation->resetVariables();
_sequence->resetVariables();
_background->resetVariables();
- _menu->resetVariables();
+ _dropdown->resetVariables();
+ _timer->resetVariables();
}
void AvalancheEngine::newGame() {
@@ -1497,12 +1422,12 @@ void AvalancheEngine::newGame() {
avvy->init(0, true);
_alive = true;
- resetVariables();
+ resetAllVariables();
_dialogs->setBubbleStateNatural();
_spareEvening = "answer a questionnaire";
- _favouriteDrink = "beer";
+ _favoriteDrink = "beer";
_money = 30; // 2/6
_animation->setDirection(kDirStopped);
_parser->_wearing = kObjectClothes;
@@ -1514,7 +1439,7 @@ void AvalancheEngine::newGame() {
_thinkThing = true;
_thinks = 2;
refreshObjectList();
- _seeScroll = false;
+ _animationsEnabled = true;
avvy->appear(300, 117, kDirRight); // Needed to initialize Avalot.
//for (gd = 0; gd <= 30; gd++) for (gm = 0; gm <= 1; gm++) also[gd][gm] = nil;
@@ -1527,10 +1452,12 @@ void AvalancheEngine::newGame() {
_doingSpriteRun = false;
_avvyInBed = true;
+ _isLoaded = false;
+
enterRoom(kRoomYours, 1);
avvy->_visible = false;
drawScore();
- _menu->setup();
+ _dropdown->setup();
_clock->update();
spriteRun();
}
@@ -1558,16 +1485,18 @@ Common::String AvalancheEngine::getName(People whose) {
static const char lads[17][20] = {
"Avalot", "Spludwick", "Crapulus", "Dr. Duck", "Malagauche",
"Friar Tuck", "Robin Hood", "Cwytalot", "du Lustie", "the Duke of Cardiff",
- "Dogfood", "A trader", "Ibythneth", "Ayles", "Port",
+ "Dogfood", "A trader", "Ibythneth", "Ayles", "Port",
"Spurge", "Jacques"
};
static const char lasses[4][15] = {"Arkata", "Geida", "\0xB1", "the Wise Woman"};
- if (whose < kPeopleArkata)
+ if (whose <= kPeopleJacques)
return Common::String(lads[whose - kPeopleAvalot]);
- else
+ else if ((whose >= kPeopleArkata) && (whose <= kPeopleWisewoman))
return Common::String(lasses[whose - kPeopleArkata]);
+ else
+ error("getName() - Unexpected character id %d", (byte) whose);
}
Common::String AvalancheEngine::getItem(byte which) {
@@ -1674,6 +1603,9 @@ void AvalancheEngine::flipRoom(Room room, byte ped) {
if (_room == kRoomLustiesRoom)
_enterCatacombsFromLustiesRoom = true;
+ if (room > kRoomMap)
+ return;
+
enterRoom(room, ped);
_animation->appearPed(0, ped - 1);
_enterCatacombsFromLustiesRoom = false;
@@ -1735,10 +1667,10 @@ void AvalancheEngine::openDoor(Room whither, byte ped, byte magicnum) {
}
void AvalancheEngine::setRoom(People persId, Room roomId) {
- _whereIs[persId - kPeopleAvalot] = roomId;
+ _whereIs[persId - kPeopleAvalot] = roomId;
}
Room AvalancheEngine::getRoom(People persId) {
- return _whereIs[persId - kPeopleAvalot];
+ return _whereIs[persId - kPeopleAvalot];
}
} // End of namespace Avalanche
diff --git a/engines/avalanche/avalot.h b/engines/avalanche/avalot.h
index ab78f5c385..04b945fd20 100644
--- a/engines/avalanche/avalot.h
+++ b/engines/avalanche/avalot.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope 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.
@@ -35,33 +35,9 @@
namespace Avalanche {
class AvalancheEngine;
-class Clock {
-public:
- Clock(AvalancheEngine *vm);
-
- void update();
-
-private:
- static const int kCenterX = 510;
- static const int kCenterY = 183;
-
- AvalancheEngine *_vm;
-
- uint16 _hour, _minute, _second, _hourAngle, _oldHour, _oldMinute, _oldHourAngle;
- Common::Point _clockHandHour, _clockHandMinute;
-
- Common::Point calcHand(uint16 angle, uint16 length, Color color);
- void drawHand(const Common::Point &endPoint, Color color);
- void plotHands();
- void chime();
-};
-
static const byte kObjectNum = 18; // always preface with a #
static const int16 kCarryLimit = 12; // carry limit
-static const int16 kNumlockCode = 32; // Code for Num Lock
-static const int16 kMouseSize = 134;
-
struct PedType {
int16 _x, _y;
Direction _direction;
@@ -80,8 +56,6 @@ struct LineType : public FieldType {
Color _color;
};
-typedef int8 TuneType[31];
-
struct QuasipedType {
byte _whichPed;
Color _textColor;
@@ -90,15 +64,6 @@ struct QuasipedType {
People _who;
};
-#if 0
-struct Sundry { // Things which must be saved over a backtobootstrap, outside DNA.
- Common::String _qEnidFilename;
- bool _qSoundFx;
- byte _qThinks;
- bool _qThinkThing;
-};
-#endif
-
} // End of namespace Avalanche
#endif // AVALANCHE_AVALOT_H
diff --git a/engines/avalanche/background.cpp b/engines/avalanche/background.cpp
index c84c049c8f..f1ba659a55 100644
--- a/engines/avalanche/background.cpp
+++ b/engines/avalanche/background.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -37,6 +37,7 @@ const int16 Background::kOnDisk = -1;
Background::Background(AvalancheEngine *vm) {
_vm = vm;
_spriteNum = 0;
+ _nextBell = 0;
}
Background::~Background() {
@@ -47,28 +48,28 @@ Background::~Background() {
* @remarks Originally called 'pics_link'
*/
void Background::update() {
- if (_vm->_menu->isActive())
+ if (_vm->_dropdown->isActive())
return; // No animation when the menus are up.
switch (_vm->_room) {
case kRoomOutsideArgentPub:
- if ((_vm->_roomTime % 12) == 0)
- draw(-1, -1, (_vm->_roomTime / 12) % 4);
+ if ((_vm->_roomCycles % 12) == 0)
+ draw(-1, -1, (_vm->_roomCycles / 12) % 4);
break;
case kRoomBrummieRoad:
- if ((_vm->_roomTime % 2) == 0)
- draw(-1, -1, (_vm->_roomTime / 2) % 4);
+ if ((_vm->_roomCycles % 2) == 0)
+ draw(-1, -1, (_vm->_roomCycles / 2) % 4);
break;
case kRoomBridge:
- if ((_vm->_roomTime % 2) == 0)
- draw(-1, -1, 3 + (_vm->_roomTime / 2) % 4);
+ if ((_vm->_roomCycles % 2) == 0)
+ draw(-1, -1, 3 + (_vm->_roomCycles / 2) % 4);
break;
case kRoomYours:
- if ((!_vm->_avvyIsAwake) && ((_vm->_roomTime % 4) == 0))
- draw(-1, -1, (_vm->_roomTime / 12) % 2);
+ if ((!_vm->_avvyIsAwake) && ((_vm->_roomCycles % 4) == 0))
+ draw(-1, -1, (_vm->_roomCycles / 12) % 2);
break;
case kRoomArgentPub:
- if (((_vm->_roomTime % 7) == 1) && (_vm->_malagauche != 177)) {
+ if (((_vm->_roomCycles % 7) == 1) && (_vm->_malagauche != 177)) {
// Malagauche cycle.
_vm->_malagauche++;
switch (_vm->_malagauche) {
@@ -92,7 +93,7 @@ void Background::update() {
}
}
- switch (_vm->_roomTime % 200) {
+ switch (_vm->_roomCycles % 200) {
case 179:
case 197:
draw(-1, -1, 4); // Dogfood's drinking cycle.
@@ -108,7 +109,7 @@ void Background::update() {
_vm->_npcFacing = 177; // Impossible value for this.
break;
default:
- if (_vm->_roomTime % 200 <= 178) { // Normally.
+ if (_vm->_roomCycles % 200 <= 178) { // Normally.
byte direction = 1;
uint16 angle = _vm->bearing(1);
if (((angle >= 1) && (angle <= 90)) || ((angle >= 358) && (angle <= 360)))
@@ -126,8 +127,8 @@ void Background::update() {
}
break;
case kRoomWestHall:
- if ((_vm->_roomTime % 3) == 0) {
- switch ((_vm->_roomTime / 3) % 6) {
+ if ((_vm->_roomCycles % 3) == 0) {
+ switch ((_vm->_roomCycles / 3) % 6) {
case 4:
draw(-1, -1, 0);
break;
@@ -147,7 +148,7 @@ void Background::update() {
if (!(_vm->_lustieIsAsleep)) {
byte direction = 0;
uint16 angle = _vm->bearing(1);
- if ((_vm->_roomTime % 45) > 42)
+ if ((_vm->_roomCycles % 45) > 42)
direction = 4; // du Lustie blinks.
// Bearing of Avvy from du Lustie.
else if ((angle <= 45) || ((angle >= 315) && (angle <= 360)))
@@ -164,8 +165,8 @@ void Background::update() {
}
break;
case kRoomAylesOffice:
- if ((!_vm->_aylesIsAwake) && (_vm->_roomTime % 14 == 0)) {
- switch ((_vm->_roomTime / 14) % 2) {
+ if ((!_vm->_aylesIsAwake) && (_vm->_roomCycles % 14 == 0)) {
+ switch ((_vm->_roomCycles / 14) % 2) {
case 0:
draw(-1, -1, 0); // Frame 2: EGA.
break;
@@ -177,7 +178,7 @@ void Background::update() {
break;
case kRoomRobins:
if (_vm->_tiedUp) {
- switch (_vm->_roomTime % 54) {
+ switch (_vm->_roomCycles % 54) {
case 20:
draw(-1, -1, 3); // Frame 4: Avalot blinks.
break;
@@ -198,7 +199,7 @@ void Background::update() {
else if ((angle >= 181) && (angle <= 314))
direction = 8; // Right.
- if ((_vm->_roomTime % 60) > 57)
+ if ((_vm->_roomCycles % 60) > 57)
direction--; // Blinks.
if (direction != _vm->_npcFacing) { // Port.
@@ -206,7 +207,7 @@ void Background::update() {
_vm->_npcFacing = direction;
}
- switch (_vm->_roomTime % 50) {
+ switch (_vm->_roomCycles % 50) {
case 45 :
draw(-1, -1, 8); // Spurge blinks.
break;
@@ -217,8 +218,8 @@ void Background::update() {
break;
}
case kRoomDucks: {
- if ((_vm->_roomTime % 3) == 0) // The fire flickers.
- draw(-1, -1, (_vm->_roomTime / 3) % 3);
+ if ((_vm->_roomCycles % 3) == 0) // The fire flickers.
+ draw(-1, -1, (_vm->_roomCycles / 3) % 3);
// Bearing of Avvy from Duck.
byte direction = 0;
@@ -230,7 +231,7 @@ void Background::update() {
else if ((angle >= 181) && (angle <= 314))
direction = 8; // Right.
- if ((_vm->_roomTime % 45) > 42)
+ if ((_vm->_roomCycles % 45) > 42)
direction++; // Duck blinks.
if (direction != _vm->_npcFacing) { // Duck.
@@ -245,12 +246,12 @@ void Background::update() {
if ((_vm->_bellsAreRinging) && (_vm->getFlag('B'))) {
// They're ringing the bells.
- switch (_vm->_roomTime % 4) {
+ switch (_vm->_roomCycles % 4) {
case 1:
if (_nextBell < 5)
_nextBell = 12;
_nextBell--;
- // CHECKME: 2 is a guess. No length in the original?
+ // CHECKME: 2 is a guess. No length in the original?
_vm->_sound->playNote(_vm->kNotes[_nextBell], 2);
break;
case 2:
@@ -260,7 +261,7 @@ void Background::update() {
}
}
-void Background::load(byte number) {
+void Background::loadSprites(byte number) {
Common::File f;
_filename = _filename.format("chunk%d.avd", number);
if (!f.open(_filename))
@@ -278,24 +279,24 @@ void Background::load(byte number) {
sprite._type = (PictureType)(f.readByte());
sprite._x = f.readSint16LE();
sprite._y = f.readSint16LE();
- sprite._xl = f.readSint16LE();
- sprite._yl = f.readSint16LE();
+ sprite._width = f.readSint16LE();
+ sprite._height = f.readSint16LE();
sprite._size = f.readSint32LE();
bool natural = f.readByte();
bool memorize = f.readByte();
if (memorize) {
_sprites[i]._x = sprite._x;
- _sprites[i]._xl = sprite._xl;
+ _sprites[i]._width = sprite._width;
_sprites[i]._y = sprite._y;
- _sprites[i]._yl = sprite._yl;
+ _sprites[i]._height = sprite._height;
_sprites[i]._type = sprite._type;
if (natural)
_vm->_graphics->getNaturalPicture(_sprites[i]);
else {
_sprites[i]._size = sprite._size;
- _sprites[i]._picture = _vm->_graphics->loadPictureRaw(f, _sprites[i]._xl * 8, _sprites[i]._yl + 1);
+ _sprites[i]._picture = _vm->_graphics->loadPictureRaw(f, _sprites[i]._width * 8, _sprites[i]._height + 1);
}
} else
_sprites[i]._x = kOnDisk;
@@ -334,11 +335,11 @@ void Background::draw(int16 destX, int16 destY, byte sprId) {
sprite._type = (PictureType)(f.readByte());
sprite._x = f.readSint16LE();
sprite._y = f.readSint16LE();
- sprite._xl = f.readSint16LE();
- sprite._yl = f.readSint16LE();
+ sprite._width = f.readSint16LE();
+ sprite._height = f.readSint16LE();
sprite._size = f.readSint32LE();
f.skip(2); // Natural and Memorize are used in Load()
- sprite._picture = _vm->_graphics->loadPictureRaw(f, sprite._xl * 8, sprite._yl + 1);
+ sprite._picture = _vm->_graphics->loadPictureRaw(f, sprite._width * 8, sprite._height + 1);
if (destX < 0) {
destX = sprite._x * 8;
diff --git a/engines/avalanche/background.h b/engines/avalanche/background.h
index 34d7a9a2cc..e994d9eae9 100644
--- a/engines/avalanche/background.h
+++ b/engines/avalanche/background.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -40,7 +40,7 @@ enum PictureType {kEga, kBgi, kNaturalImage};
struct SpriteType {
PictureType _type;
int16 _x, _y;
- int16 _xl, _yl;
+ int16 _width, _height;
int32 _size;
Graphics::Surface _picture;
};
@@ -51,7 +51,7 @@ public:
~Background();
void update();
- void load(byte number);
+ void loadSprites(byte number);
void release();
// Setting the destination to negative coordinates means the picture should be drawn to it's original position.
diff --git a/engines/avalanche/clock.cpp b/engines/avalanche/clock.cpp
new file mode 100644
index 0000000000..6d398d9921
--- /dev/null
+++ b/engines/avalanche/clock.cpp
@@ -0,0 +1,116 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public 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 the original source code of Lord Avalot d'Argent version 1.3.
+* Copyright (c) 1994-1995 Mike: Mark and Thomas Thurman.
+*/
+
+#include "avalanche/clock.h"
+#include "avalanche/avalanche.h"
+
+namespace Avalanche {
+
+Clock::Clock(AvalancheEngine *vm) {
+ _vm = vm;
+ // Magic value to determine if we just created the instance
+ _oldHour = _oldHourAngle = _oldMinute = 17717;
+ _hour = _minute = _second = 0;
+ _hourAngle = 0;
+}
+
+void Clock::update() {
+ TimeDate t;
+ _vm->_system->getTimeAndDate(t);
+ _hour = t.tm_hour;
+ _minute = t.tm_min;
+ _second = t.tm_sec;
+
+ _hourAngle = (_hour % 12) * 30 + _minute / 2;
+
+ if (_oldHour != _hour) {
+ plotHands();
+ chime();
+ }
+
+ if (_oldMinute != _minute)
+ plotHands();
+
+ if ((_hour == 0) && (_oldHour != 0) && (_oldHour != 17717)) {
+ Common::String tmpStr = Common::String::format("Good morning!%c%cYes, it's just past " \
+ "midnight. Are you having an all-night Avvy session? Glad you like the game that much!",
+ kControlNewLine, kControlNewLine);
+ _vm->_dialogs->displayText(tmpStr);
+ }
+ _oldHour = _hour;
+ _oldHourAngle = _hourAngle;
+ _oldMinute = _minute;
+}
+
+Common::Point Clock::calcHand(uint16 angle, uint16 length, Color color) {
+ if (angle > 900) {
+ return(Common::Point(177, 177));
+ }
+
+ return(_vm->_graphics->drawScreenArc(kCenterX, kCenterY, 449 - angle, 450 - angle, length, color));
+}
+
+void Clock::drawHand(const Common::Point &endPoint, Color color) {
+ if (endPoint.x == 177)
+ return;
+
+ _vm->_graphics->drawScreenLine(kCenterX, kCenterY, endPoint.x, endPoint.y, color);
+}
+
+void Clock::plotHands() {
+ _clockHandHour = calcHand(_oldHourAngle, 14, kColorYellow);
+ _clockHandMinute = calcHand(_oldMinute * 6, 17, kColorYellow);
+ drawHand(_clockHandHour, kColorBrown);
+ drawHand(_clockHandMinute, kColorBrown);
+
+ _clockHandHour = calcHand(_hourAngle, 14, kColorBrown);
+ _clockHandMinute = calcHand(_minute * 6, 17, kColorBrown);
+ drawHand(_clockHandHour, kColorYellow);
+ drawHand(_clockHandMinute, kColorYellow);
+}
+
+void Clock::chime() {
+ // Too high - must be first time around
+ // Mute - skip the sound generation
+ if ((_oldHour == 17717) || (!_vm->_soundFx))
+ return;
+
+ byte hour = _hour % 12;
+ if (hour == 0)
+ hour = 12;
+
+ _vm->_graphics->loadMouse(kCurWait);
+
+ for (int i = 1; i <= hour; i++) {
+ for (int j = 1; j <= 3; j++)
+ _vm->_sound->playNote((i % 3) * 64 + 140 - j * 30, 50 - j * 12);
+ if (i != hour)
+ _vm->_system->delayMillis(100);
+ }
+}
+
+} // End of namespace Avalanche
diff --git a/engines/avalanche/clock.h b/engines/avalanche/clock.h
new file mode 100644
index 0000000000..85ea508a80
--- /dev/null
+++ b/engines/avalanche/clock.h
@@ -0,0 +1,60 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public 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 the original source code of Lord Avalot d'Argent version 1.3.
+* Copyright (c) 1994-1995 Mike: Mark and Thomas Thurman.
+*/
+
+#ifndef AVALANCHE_CLOCK_H
+#define AVALANCHE_CLOCK_H
+
+#include "common/rect.h"
+#include "avalanche/enums.h"
+
+namespace Avalanche {
+class AvalancheEngine;
+
+class Clock {
+public:
+ Clock(AvalancheEngine *vm);
+
+ void update();
+
+private:
+ static const int kCenterX = 510;
+ static const int kCenterY = 183;
+
+ AvalancheEngine *_vm;
+
+ uint16 _hour, _minute, _second, _hourAngle, _oldHour, _oldMinute, _oldHourAngle;
+ Common::Point _clockHandHour, _clockHandMinute;
+
+ Common::Point calcHand(uint16 angle, uint16 length, Color color);
+ void drawHand(const Common::Point &endPoint, Color color);
+ void plotHands();
+ void chime();
+};
+
+} // End of namespace Avalanche
+
+#endif // AVALANCHE_CLOCK_H
diff --git a/engines/avalanche/closing.cpp b/engines/avalanche/closing.cpp
index 1cb2e84218..552b71b563 100644
--- a/engines/avalanche/closing.cpp
+++ b/engines/avalanche/closing.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/avalanche/closing.h b/engines/avalanche/closing.h
index 25217e347e..6e65deb310 100644
--- a/engines/avalanche/closing.h
+++ b/engines/avalanche/closing.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/avalanche/configure.engine b/engines/avalanche/configure.engine
new file mode 100644
index 0000000000..28d6a558db
--- /dev/null
+++ b/engines/avalanche/configure.engine
@@ -0,0 +1,3 @@
+# This file is included from the main "configure" script
+# add_engine [name] [desc] [build-by-default] [subengines] [base games] [deps]
+add_engine avalanche "Lord Avalot d'Argent" no
diff --git a/engines/avalanche/console.cpp b/engines/avalanche/console.cpp
index 656cc1907c..d4923affc1 100644
--- a/engines/avalanche/console.cpp
+++ b/engines/avalanche/console.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope 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.
@@ -31,7 +31,7 @@
namespace Avalanche {
AvalancheConsole::AvalancheConsole(AvalancheEngine *vm) : GUI::Debugger(), _vm(vm) {
- DCmd_Register("magic_lines", WRAP_METHOD(AvalancheConsole, Cmd_MagicLines));
+ registerCmd("magic_lines", WRAP_METHOD(AvalancheConsole, Cmd_MagicLines));
}
AvalancheConsole::~AvalancheConsole() {
@@ -42,7 +42,7 @@ AvalancheConsole::~AvalancheConsole() {
*/
bool AvalancheConsole::Cmd_MagicLines(int argc, const char **argv) {
if (argc != 1) {
- DebugPrintf("Usage: %s\n", argv[0]);
+ debugPrintf("Usage: %s\n", argv[0]);
return true;
}
@@ -50,5 +50,4 @@ bool AvalancheConsole::Cmd_MagicLines(int argc, const char **argv) {
return false;
}
-
} // End of namespace Avalanche
diff --git a/engines/avalanche/console.h b/engines/avalanche/console.h
index 166515d913..b5b5fb63fc 100644
--- a/engines/avalanche/console.h
+++ b/engines/avalanche/console.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope 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.
diff --git a/engines/avalanche/detection.cpp b/engines/avalanche/detection.cpp
index 428e71f35a..028f167e70 100644
--- a/engines/avalanche/detection.cpp
+++ b/engines/avalanche/detection.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope 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.
@@ -35,10 +35,6 @@
namespace Avalanche {
-struct AvalancheGameDescription {
- ADGameDescription desc;
-};
-
uint32 AvalancheEngine::getFeatures() const {
return _gameDescription->desc.flags;
}
@@ -133,7 +129,7 @@ SaveStateList AvalancheMetaEngine::listSaves(const char *target) const {
// Check version.
byte saveVersion = file->readByte();
- if (saveVersion != kSavegameVersion) {
+ if (saveVersion > kSavegameVersion) {
warning("Savegame of incompatible version!");
delete file;
continue;
diff --git a/engines/avalanche/dialogs.cpp b/engines/avalanche/dialogs.cpp
index e5acd9cae2..f95440900b 100644
--- a/engines/avalanche/dialogs.cpp
+++ b/engines/avalanche/dialogs.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope 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.
@@ -34,6 +34,12 @@
namespace Avalanche {
+const Dialogs::TuneType Dialogs::kTune = {
+ kPitchHigher, kPitchHigher, kPitchLower, kPitchSame, kPitchHigher, kPitchHigher, kPitchLower, kPitchHigher, kPitchHigher, kPitchHigher,
+ kPitchLower, kPitchHigher, kPitchHigher, kPitchSame, kPitchHigher, kPitchLower, kPitchLower, kPitchLower, kPitchLower, kPitchHigher,
+ kPitchHigher, kPitchLower, kPitchLower, kPitchLower, kPitchLower, kPitchSame, kPitchLower, kPitchHigher, kPitchSame, kPitchLower, kPitchHigher
+};
+
// A quasiped defines how people who aren't sprites talk. For example, quasiped
// "A" is Dogfood. The rooms aren't stored because I'm leaving that to context.
const QuasipedType Dialogs::kQuasipeds[16] = {
@@ -59,6 +65,19 @@ const QuasipedType Dialogs::kQuasipeds[16] = {
Dialogs::Dialogs(AvalancheEngine *vm) {
_vm = vm;
_noError = true;
+
+ _aboutBox = false;
+ _talkX = 0;
+ _talkY = 0;
+ _maxLineNum = 0;
+ _scReturn = false;
+ _currentFont = kFontStyleRoman;
+ _param = 0;
+ _useIcon = 0;
+ _scrollBells = 0;
+ _underScroll = 0;
+ _shadowBoxX = 0;
+ _shadowBoxY = 0;
}
void Dialogs::init() {
@@ -74,6 +93,7 @@ void Dialogs::setReadyLight(byte state) {
if (_vm->_ledStatus == state)
return; // Already like that!
+ // TODO: Implement different patterns for green color.
Color color = kColorBlack;
switch (state) {
case 0:
@@ -85,9 +105,7 @@ void Dialogs::setReadyLight(byte state) {
color = kColorGreen;
break; // Hit a key
}
- warning("STUB: Dialogs::setReadyLight()");
- CursorMan.showMouse(false);
_vm->_graphics->drawReadyLight(color);
CursorMan.showMouse(true);
_vm->_ledStatus = state;
@@ -139,7 +157,7 @@ void Dialogs::scrollModeNormal() {
Common::String e = "(c) 1994";
setReadyLight(3);
- _vm->_seeScroll = true;
+ _vm->_animationsEnabled = false;
_vm->_graphics->loadMouse(kCurFletch);
_vm->_graphics->saveScreen();
@@ -156,7 +174,8 @@ void Dialogs::scrollModeNormal() {
(event.kbd.keycode == Common::KEYCODE_PLUS)))) {
escape = true;
break;
- }
+ } else if (event.type == Common::EVENT_KEYDOWN)
+ _vm->errorLed();
}
}
@@ -177,7 +196,6 @@ void Dialogs::scrollModeNormal() {
break;
} while (!((mrelease > 0) || (buttona1()) || (buttonb1())));
-
if (mrelease == 0) {
inkey();
if (aboutscroll) {
@@ -198,10 +216,8 @@ void Dialogs::scrollModeNormal() {
#endif
setReadyLight(0);
- _vm->_seeScroll = false;
+ _vm->_animationsEnabled = true;
_vm->_holdLeftMouse = false; // Used in Lucerna::checkclick().
-
- warning("STUB: Scrolls::scrollModeNormal()");
}
/**
@@ -258,7 +274,7 @@ bool Dialogs::theyMatch(TuneType &played) {
byte mistakes = 0;
for (unsigned int i = 0; i < sizeof(played); i++) {
- if (played[i] != _vm->kTune[i])
+ if (played[i] != kTune[i])
mistakes++;
}
@@ -272,7 +288,7 @@ bool Dialogs::theyMatch(TuneType &played) {
*/
void Dialogs::scrollModeMusic() {
setReadyLight(3);
- _vm->_seeScroll = true;
+ _vm->_animationsEnabled = false;
CursorMan.showMouse(false);
_vm->_graphics->loadMouse(kCurFletch);
@@ -281,7 +297,7 @@ void Dialogs::scrollModeMusic() {
played[i] = kPitchInvalid;
int8 lastOne = -1, thisOne = -1; // Invalid values.
- _vm->_seeScroll = true;
+ _vm->_animationsEnabled = false;
_vm->_graphics->saveScreen();
_vm->_graphics->showScroll();
@@ -306,7 +322,7 @@ void Dialogs::scrollModeMusic() {
|| (event.kbd.keycode == Common::KEYCODE_u) || (event.kbd.keycode == Common::KEYCODE_i)
|| (event.kbd.keycode == Common::KEYCODE_o) || (event.kbd.keycode == Common::KEYCODE_p)
|| (event.kbd.keycode == Common::KEYCODE_LEFTBRACKET) || (event.kbd.keycode == Common::KEYCODE_RIGHTBRACKET))) {
- byte value;
+ byte value = 0;
switch (event.kbd.keycode) {
case Common::KEYCODE_q:
value = 0;
@@ -345,6 +361,7 @@ void Dialogs::scrollModeMusic() {
value = 11;
break;
default:
+ error("cannot happen");
break;
}
@@ -362,7 +379,7 @@ void Dialogs::scrollModeMusic() {
else
store(kPitchHigher, played);
}
-
+
if (theyMatch(played)) {
setReadyLight(0);
_vm->_timer->addTimer(8, Timer::kProcJacquesWakesUp, Timer::kReasonJacquesWakingUp);
@@ -374,7 +391,7 @@ void Dialogs::scrollModeMusic() {
_vm->_graphics->restoreScreen();
_vm->_graphics->removeBackup();
- _vm->_seeScroll = false;
+ _vm->_animationsEnabled = true;
CursorMan.showMouse(true);
}
@@ -437,7 +454,7 @@ void Dialogs::drawScroll(DialogFunctionType modeFunc) {
mx -= lx;
my -= ly + 2;
- bool centre = false;
+ bool center = false;
byte iconIndent = 0;
switch (_useIcon) {
@@ -463,11 +480,11 @@ void Dialogs::drawScroll(DialogFunctionType modeFunc) {
if (!_scroll[i].empty())
switch (_scroll[i][_scroll[i].size() - 1]) {
case kControlCenter:
- centre = true;
+ center = true;
_scroll[i].deleteLastChar();
break;
case kControlLeftJustified:
- centre = false;
+ center = false;
_scroll[i].deleteLastChar();
break;
case kControlQuestion:
@@ -479,7 +496,7 @@ void Dialogs::drawScroll(DialogFunctionType modeFunc) {
break;
}
- if (centre)
+ if (center)
say(320 - _scroll[i].size() * 4 + iconIndent, my, _scroll[i]);
else
say(mx + iconIndent, my, _scroll[i]);
@@ -489,7 +506,7 @@ void Dialogs::drawScroll(DialogFunctionType modeFunc) {
_underScroll = (my + 3) * 2; // Multiplying because of the doubled screen height.
ringBell();
-
+
_vm->_dropsOk = false;
dodgem();
@@ -497,7 +514,7 @@ void Dialogs::drawScroll(DialogFunctionType modeFunc) {
unDodgem();
_vm->_dropsOk = true;
-
+
resetScrollDriver();
}
@@ -584,7 +601,7 @@ Common::String Dialogs::displayMoney() {
else
result = Common::String::format("%d/%d", _vm->_money / 12, _vm->_money % 12);
} else { // L, s & d
- result = Common::String::format("\x9C%d.%d.%d", _vm->_money / 240, (_vm->_money / 12) % 20,
+ result = Common::String::format("\x9C%d.%d.%d", _vm->_money / 240, (_vm->_money / 12) % 20,
_vm->_money % 12);
}
if (_vm->_money > 12) {
@@ -623,13 +640,10 @@ void Dialogs::solidify(byte n) {
/**
* @remarks Originally called 'calldriver'
- * Display text by calling the dialog driver. It unifies the function of the original
+ * Display text by calling the dialog driver. It unifies the function of the original
* 'calldriver' and 'display' by using Common::String instead of a private buffer.
*/
void Dialogs::displayText(Common::String text) {
-// bool was_virtual; // Was the mouse cursor virtual on entry to this proc?
- warning("STUB: Scrolls::calldrivers()");
-
_vm->_sound->stopSound();
setReadyLight(0);
@@ -689,6 +703,7 @@ void Dialogs::displayText(Common::String text) {
if (_param == 0)
setBubbleStateNatural();
else if ((1 <= _param) && (_param <= 9)) {
+ assert(_param - 1 < _vm->_animation->kSpriteNumbMax);
AnimationType *spr = _vm->_animation->_sprites[_param - 1];
if ((_param > _vm->_animation->kSpriteNumbMax) || (!spr->_quick)) { // Not valid.
_vm->errorLed();
@@ -699,10 +714,11 @@ void Dialogs::displayText(Common::String text) {
// Quasi-peds. (This routine performs the same
// thing with QPs as triptype.chatter does with the
// sprites.)
+ assert(_param - 10 < 16);
PedType *quasiPed = &_vm->_peds[kQuasipeds[_param - 10]._whichPed];
_talkX = quasiPed->_x;
_talkY = quasiPed->_y; // Position.
-
+
_vm->_graphics->setDialogColor(kQuasipeds[_param - 10]._backgroundColor, kQuasipeds[_param - 10]._textColor);
} else {
_vm->errorLed(); // Not valid.
@@ -717,7 +733,7 @@ void Dialogs::displayText(Common::String text) {
return;
break;
- // CHECME: The whole kControlNegative block seems completely unused, as the only use (the easter egg check) is a false positive
+ // CHECME: The whole kControlNegative block seems completely unused, as the only use (the easter egg check) is a false positive
case kControlNegative:
switch (_param) {
case 1:
@@ -729,10 +745,10 @@ void Dialogs::displayText(Common::String text) {
}
break;
case 3:
- displayText(_vm->_favouriteDrink + kControlToBuffer);
+ displayText(_vm->_favoriteDrink + kControlToBuffer);
break;
case 4:
- displayText(_vm->_favouriteSong + kControlToBuffer);
+ displayText(_vm->_favoriteSong + kControlToBuffer);
break;
case 5:
displayText(_vm->_worstPlaceOnEarth + kControlToBuffer);
@@ -748,7 +764,7 @@ void Dialogs::displayText(Common::String text) {
case 10:
switch (_vm->_boxContent) {
case 0: // Sixpence.
- displayScrollChain('q', 37); // You find the sixpence.
+ displayScrollChain('Q', 37); // You find the sixpence.
_vm->_money += 6;
_vm->_boxContent = _vm->_parser->kNothing;
_vm->incScore(2);
@@ -762,7 +778,7 @@ void Dialogs::displayText(Common::String text) {
break;
case 11:
for (int j = 0; j < kObjectNum; j++) {
- if (_vm->_objects[j])
+ if (_vm->_objects[j])
displayText(_vm->getItem(j) + ", " + kControlToBuffer);
}
break;
@@ -802,6 +818,8 @@ void Dialogs::displayText(Common::String text) {
}
}
}
+
+ setReadyLight(2);
}
void Dialogs::setTalkPos(int16 x, int16 y) {
@@ -815,7 +833,7 @@ int16 Dialogs::getTalkPosX() {
bool Dialogs::displayQuestion(Common::String question) {
displayText(question + kControlNewLine + kControlQuestion);
-
+
if (_scReturn && (_vm->_rnd->getRandomNumber(1) == 0)) { // Half-and-half chance.
Common::String tmpStr = Common::String::format("...Positive about that?%cI%c%c%c", kControlRegister, kControlIcon, kControlNewLine, kControlQuestion);
displayText(tmpStr); // Be annoying!
@@ -859,7 +877,7 @@ void Dialogs::loadFont() {
* @remarks Originally called 'musical_scroll'
*/
void Dialogs::displayMusicalScroll() {
- Common::String tmpStr = Common::String::format("To play the harp...%c%cUse these keys:%c%cQ W E R T Y U I O P [ ]%c%cOr press Enter to stop playing.%c",
+ Common::String tmpStr = Common::String::format("To play the harp...%c%cUse these keys:%c%cQ W E R T Y U I O P [ ]%c%cOr press Enter to stop playing.%c",
kControlNewLine, kControlNewLine, kControlNewLine, kControlInsertSpaces, kControlNewLine, kControlNewLine, kControlToBuffer);
displayText(tmpStr);
@@ -891,7 +909,7 @@ void Dialogs::displayScrollChain(char block, byte point, bool report, bool bubbl
bool error = false;
- indexfile.seek((toupper(block) - 65) * 2);
+ indexfile.seek((toupper(block) - 'A') * 2);
uint16 idx_offset = indexfile.readUint16LE();
if (idx_offset == 0)
error = true;
@@ -938,7 +956,7 @@ void Dialogs::displayScrollChain(char block, byte point, bool report, bool bubbl
*/
void Dialogs::speak(byte who, byte subject) {
if (subject == 0) { // No subject.
- displayScrollChain('s', who, false, true);
+ displayScrollChain('S', who, false, true);
return;
}
@@ -992,7 +1010,7 @@ void Dialogs::talkTo(byte whom) {
switch (whom) {
case kPeopleSpludwick:
if ((_vm->_lustieIsAsleep) & (!_vm->_objects[kObjectPotion - 1])) {
- displayScrollChain('q', 68);
+ displayScrollChain('Q', 68);
_vm->_objects[kObjectPotion - 1] = true;
_vm->refreshObjectList();
_vm->incScore(3);
@@ -1004,64 +1022,64 @@ void Dialogs::talkTo(byte whom) {
case 1: // Fallthrough is intended.
case 2: {
Common::String objStr = _vm->getItem(AvalancheEngine::kSpludwicksOrder[_vm->_givenToSpludwick]);
- Common::String tmpStr = Common::String::format("Can you get me %s, please?%c2%c",
+ Common::String tmpStr = Common::String::format("Can you get me %s, please?%c2%c",
objStr.c_str(), kControlRegister, kControlSpeechBubble);
displayText(tmpStr);
}
return;
case 3:
- displayScrollChain('q', 30); // Need any help with the game?
+ displayScrollChain('Q', 30); // Need any help with the game?
return;
}
} else {
- displayScrollChain('q', 42); // Haven't talked to Crapulus. Go and talk to him.
+ displayScrollChain('Q', 42); // Haven't talked to Crapulus. Go and talk to him.
return;
}
break;
case kPeopleIbythneth:
if (_vm->_givenBadgeToIby) {
- displayScrollChain('q', 33); // Thanks a lot!
+ displayScrollChain('Q', 33); // Thanks a lot!
return; // And leave the proc.
}
break; // Or... just continue, 'cos he hasn't got it.
case kPeopleDogfood:
if (_vm->_wonNim) { // We've won the game.
- displayScrollChain('q', 6); // "I'm Not Playing!"
+ displayScrollChain('Q', 6); // "I'm Not Playing!"
return; // Zap back.
} else
_vm->_askedDogfoodAboutNim = true;
break;
case kPeopleAyles:
if (!_vm->_aylesIsAwake) {
- displayScrollChain('q', 43); // He's fast asleep!
+ displayScrollChain('Q', 43); // He's fast asleep!
return;
} else if (!_vm->_givenPenToAyles) {
- displayScrollChain('q', 44); // Can you get me a pen, Avvy?
+ displayScrollChain('Q', 44); // Can you get me a pen, Avvy?
return;
}
break;
case kPeopleJacques:
- displayScrollChain('q', 43);
+ displayScrollChain('Q', 43);
return;
case kPeopleGeida:
if (_vm->_givenPotionToGeida)
_vm->_geidaFollows = true;
else {
- displayScrollChain('u', 17);
+ displayScrollChain('U', 17);
return;
}
break;
case kPeopleSpurge:
if (!_vm->_sittingInPub) {
- displayScrollChain('q', 71); // Try going over and sitting down.
+ displayScrollChain('Q', 71); // Try going over and sitting down.
return;
} else {
if (_vm->_spurgeTalkCount < 5)
_vm->_spurgeTalkCount++;
if (_vm->_spurgeTalkCount > 1) { // no. 1 falls through
- displayScrollChain('q', 70 + _vm->_spurgeTalkCount);
+ displayScrollChain('Q', 70 + _vm->_spurgeTalkCount);
return;
}
}
@@ -1069,7 +1087,7 @@ void Dialogs::talkTo(byte whom) {
}
// On a subject. Is there any reason to block it?
} else if ((whom == kPeopleAyles) && (!_vm->_aylesIsAwake)) {
- displayScrollChain('q', 43); // He's fast asleep!
+ displayScrollChain('Q', 43); // He's fast asleep!
return;
}
@@ -1094,12 +1112,12 @@ void Dialogs::talkTo(byte whom) {
speak(whom, _vm->_subjectNum);
if (!_noError)
- displayScrollChain('n', whom); // File not found!
+ displayScrollChain('N', whom); // File not found!
if ((_vm->_subjectNum == 0) && ((whom + 149) == kPeopleCrapulus)) { // Crapulus: get the badge - first time only
_vm->_objects[kObjectBadge - 1] = true;
_vm->refreshObjectList();
- displayScrollChain('q', 1); // Circular from Cardiff.
+ displayScrollChain('Q', 1); // Circular from Cardiff.
_vm->_talkedToCrapulus = true;
_vm->setRoom(kPeopleCrapulus, kRoomDummy); // Crapulus walks off.
@@ -1164,7 +1182,9 @@ void Dialogs::sayThanks(byte thing) {
Common::String tmpStr = personSpeaks();
tmpStr += Common::String::format("Hey, thanks!%c(But now, you've lost it!)", kControlSpeechBubble);
displayText(tmpStr);
- _vm->_objects[thing] = false;
+
+ if (thing < kObjectNum)
+ _vm->_objects[thing] = false;
}
/**
diff --git a/engines/avalanche/dialogs.h b/engines/avalanche/dialogs.h
index 43e6a4fec6..4b50a61732 100644
--- a/engines/avalanche/dialogs.h
+++ b/engines/avalanche/dialogs.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope 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.
@@ -70,6 +70,9 @@ private:
kFontStyleItalic
};
+ typedef int8 TuneType[31];
+
+ static const TuneType kTune;
static const int16 kHalfIconWidth = 19;
static const QuasipedType kQuasipeds[16];
diff --git a/engines/avalanche/menu.cpp b/engines/avalanche/dropdown.cpp
index bba8e862a9..97adfc2581 100644
--- a/engines/avalanche/menu.cpp
+++ b/engines/avalanche/dropdown.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -28,43 +28,43 @@
/* Original name: DROPDOWN A customized version of Oopmenu (qv). */
#include "avalanche/avalanche.h"
-#include "avalanche/menu.h"
+#include "avalanche/dropdown.h"
namespace Avalanche {
-void HeadType::init(char trig, char altTrig, Common::String title, byte pos, MenuFunc setupFunc, MenuFunc chooseFunc, Menu *menu) {
+void HeadType::init(char trig, char altTrig, Common::String title, byte pos, MenuFunc setupFunc, MenuFunc chooseFunc, DropDownMenu *menu) {
_trigger = trig;
_altTrigger = altTrig;
_title = title;
_position = pos;
- _xpos = _position * _menu->kSpacing + _menu->kIndent;
- _xright = (_position + 1) * _menu->kSpacing + _menu->kIndent;
+ _xpos = _position * _dropdown->kSpacing + _dropdown->kIndent;
+ _xright = (_position + 1) * _dropdown->kSpacing + _dropdown->kIndent;
_setupFunc = setupFunc;
_chooseFunc = chooseFunc;
- _menu = menu;
+ _dropdown = menu;
}
void HeadType::draw() {
CursorMan.showMouse(false);
- _menu->drawMenuText(_xpos, 1, _trigger, _title, true, false);
+ _dropdown->drawMenuText(_xpos, 1, _trigger, _title, true, false);
CursorMan.showMouse(true);
}
void HeadType::highlight() {
CursorMan.showMouse(false);
- _menu->_vm->_sound->stopSound();
- _menu->drawMenuText(_xpos, 1, _trigger, _title, true, true);
+ _dropdown->_vm->_sound->stopSound();
+ _dropdown->drawMenuText(_xpos, 1, _trigger, _title, true, true);
- _menu->_activeMenuItem._left = _xpos;
- _menu->_activeMenuItem._activeNow = true;
- _menu->_activeMenuItem._activeNum = _position;
- _menu->_menuActive = true;
+ _dropdown->_activeMenuItem._left = _xpos;
+ _dropdown->_activeMenuItem._activeNow = true;
+ _dropdown->_activeMenuItem._activeNum = _position;
+ _dropdown->_menuActive = true;
// Force reload and redraw of cursor.
- _menu->_vm->_currentMouse = 177;
-
+ _dropdown->_vm->_currentMouse = 177;
+
}
bool HeadType::parseAltTrigger(char key) {
@@ -73,12 +73,12 @@ bool HeadType::parseAltTrigger(char key) {
return false;
}
-void MenuItem::init(Menu *menu) {
- _menu = menu;
+void MenuItem::init(DropDownMenu *menu) {
+ _dropdown = menu;
_activeNow = false;
_activeNum = 1;
- _menu->_menuActive = false;
+ _dropdown->_menuActive = false;
}
void MenuItem::reset() {
@@ -113,8 +113,8 @@ void MenuItem::displayOption(byte y, bool highlit) {
else
backgroundColor = kColorLightgray;
- _menu->_vm->_graphics->drawMenuBlock((_flx1 + 1) * 8, 3 + (y + 1) * 10, (_flx2 + 1) * 8, 13 + (y + 1) * 10, backgroundColor);
- _menu->drawMenuText(_left, 4 + (y + 1) * 10, _options[y]._trigger, text, _options[y]._valid, highlit);
+ _dropdown->_vm->_graphics->drawMenuBlock((_flx1 + 1) * 8, 3 + (y + 1) * 10, (_flx2 + 1) * 8, 13 + (y + 1) * 10, backgroundColor);
+ _dropdown->drawMenuText(_left, 4 + (y + 1) * 10, _options[y]._trigger, text, _options[y]._valid, highlit);
}
void MenuItem::display() {
@@ -125,15 +125,15 @@ void MenuItem::display() {
_flx2 = _left + _width;
_fly = 15 + _optionNum * 10;
_activeNow = true;
- _menu->_menuActive = true;
+ _dropdown->_menuActive = true;
- _menu->_vm->_graphics->drawMenuItem((_flx1 + 1) * 8, 12, (_flx2 + 1) * 8, _fly);
+ _dropdown->_vm->_graphics->drawMenuItem((_flx1 + 1) * 8, 12, (_flx2 + 1) * 8, _fly);
displayOption(0, true);
for (int y = 1; y < _optionNum; y++)
displayOption(y, false);
- _menu->_vm->_currentMouse = 177;
+ _dropdown->_vm->_currentMouse = 177;
CursorMan.showMouse(true); // 4 = fletch
}
@@ -141,12 +141,12 @@ void MenuItem::display() {
void MenuItem::wipe() {
CursorMan.showMouse(false);
- _menu->drawMenuText(_menu->_menuBar._menuItems[_menu->_activeMenuItem._activeNum]._xpos, 1,
- _menu->_menuBar._menuItems[_menu->_activeMenuItem._activeNum]._trigger,
- _menu->_menuBar._menuItems[_menu->_activeMenuItem._activeNum]._title, true, false);
+ _dropdown->drawMenuText(_dropdown->_menuBar._menuItems[_dropdown->_activeMenuItem._activeNum]._xpos, 1,
+ _dropdown->_menuBar._menuItems[_dropdown->_activeMenuItem._activeNum]._trigger,
+ _dropdown->_menuBar._menuItems[_dropdown->_activeMenuItem._activeNum]._title, true, false);
_activeNow = false;
- _menu->_menuActive = false;
+ _dropdown->_menuActive = false;
_firstlix = false;
CursorMan.showMouse(true);
@@ -191,7 +191,7 @@ void MenuItem::select(byte which) {
if (_choiceNum > _optionNum)
_choiceNum = 0; // Off the top, I suppose.
- (_menu->*_menu->_menuBar._menuItems[_activeNum]._chooseFunc)();
+ (_dropdown->*_dropdown->_menuBar._menuItems[_activeNum]._chooseFunc)();
}
void MenuItem::parseKey(char c) {
@@ -204,29 +204,34 @@ void MenuItem::parseKey(char c) {
}
}
if (!found)
- _menu->_vm->_sound->blip();
+ _dropdown->_vm->_sound->blip();
+}
+
+MenuBar::MenuBar() {
+ _menuNum = 0;
+ _dropdown = nullptr;
}
-void MenuBar::init(Menu *menu) {
- _menu = menu;
+void MenuBar::init(DropDownMenu *menu) {
+ _dropdown = menu;
_menuNum = 0;
}
void MenuBar::createMenuItem(char trig, Common::String title, char altTrig, MenuFunc setupFunc, MenuFunc chooseFunc) {
- _menuItems[_menuNum].init(trig, altTrig, title, _menuNum, setupFunc, chooseFunc, _menu);
+ _menuItems[_menuNum].init(trig, altTrig, title, _menuNum, setupFunc, chooseFunc, _dropdown);
_menuNum++;
}
void MenuBar::draw() {
- _menu->_vm->_graphics->drawMenuBar(kMenuBackgroundColor);
+ _dropdown->_vm->_graphics->drawMenuBar(kMenuBackgroundColor);
- byte savecp = _menu->_vm->_cp;
- _menu->_vm->_cp = 3;
+ byte savecp = _dropdown->_vm->_cp;
+ _dropdown->_vm->_cp = 3;
for (int i = 0; i < _menuNum; i++)
_menuItems[i].draw();
- _menu->_vm->_cp = savecp;
+ _dropdown->_vm->_cp = savecp;
}
void MenuBar::parseAltTrigger(char c) {
@@ -239,13 +244,13 @@ void MenuBar::parseAltTrigger(char c) {
}
void MenuBar::setupMenuItem(byte which) {
- if (_menu->_activeMenuItem._activeNow) {
- _menu->_activeMenuItem.wipe(); // Get rid of menu.
- if (_menu->_activeMenuItem._activeNum == _menuItems[which]._position)
+ if (_dropdown->_activeMenuItem._activeNow) {
+ _dropdown->_activeMenuItem.wipe(); // Get rid of menu.
+ if (_dropdown->_activeMenuItem._activeNum == _menuItems[which]._position)
return; // Clicked on own highlight.
}
_menuItems[which].highlight();
- (_menu->*_menuItems[which]._setupFunc)();
+ (_dropdown->*_menuItems[which]._setupFunc)();
}
void MenuBar::chooseMenuItem(int16 x) {
@@ -257,13 +262,16 @@ void MenuBar::chooseMenuItem(int16 x) {
}
}
-Menu::Menu(AvalancheEngine *vm) {
+DropDownMenu::DropDownMenu(AvalancheEngine *vm) {
_vm = vm;
_activeMenuItem.init(this);
_menuBar.init(this);
+
+ _menuActive = false;
+ _lastPerson = kPeopleNone;
}
-void Menu::findWhatYouCanDoWithIt() {
+void DropDownMenu::findWhatYouCanDoWithIt() {
switch (_vm->_thinks) {
case kObjectWine:
case kObjectPotion:
@@ -291,7 +299,7 @@ void Menu::findWhatYouCanDoWithIt() {
}
}
-void Menu::drawMenuText(int16 x, int16 y, char trigger, Common::String text, bool valid, bool highlighted) {
+void DropDownMenu::drawMenuText(int16 x, int16 y, char trigger, Common::String text, bool valid, bool highlighted) {
Color fontColor;
Color backgroundColor;
if (highlighted) {
@@ -334,11 +342,11 @@ void Menu::drawMenuText(int16 x, int16 y, char trigger, Common::String text, boo
_vm->_graphics->refreshScreen();
}
-void Menu::bleep() {
+void DropDownMenu::bleep() {
_vm->_sound->playNote(177, 7);
}
-void Menu::parseKey(char r, char re) {
+void DropDownMenu::parseKey(char r, char re) {
#if 0
switch (r) {
case 0:
@@ -387,24 +395,24 @@ void Menu::parseKey(char r, char re) {
warning("STUB: Dropdown::parseKey()"); // To be implemented properly later! Don't remove the comment above!
}
-Common::String Menu::selectGender(byte x) {
+Common::String DropDownMenu::selectGender(byte x) {
if (x < 175)
return "im";
else
return "er";
}
-void Menu::setupMenuGame() {
+void DropDownMenu::setupMenuGame() {
_activeMenuItem.reset();
_activeMenuItem.setupOption("Help...", 'H', "f1", true);
- _activeMenuItem.setupOption("Boss Key", 'B', "alt-B", false);
- _activeMenuItem.setupOption("Untrash screen", 'U', "ctrl-f7", true);
+ _activeMenuItem.setupOption("Boss Key", 'B', "alt-B", true);
+ _activeMenuItem.setupOption("Untrash screen", 'U', "ctrl-f7", false);
_activeMenuItem.setupOption("Score and rank", 'S', "f9", true);
_activeMenuItem.setupOption("About Avvy...", 'A', "shift-f10", true);
_activeMenuItem.display();
}
-void Menu::setupMenuFile() {
+void DropDownMenu::setupMenuFile() {
_activeMenuItem.reset();
_activeMenuItem.setupOption("New game", 'N', "f4", true);
_activeMenuItem.setupOption("Load...", 'L', "^f3", true);
@@ -415,7 +423,7 @@ void Menu::setupMenuFile() {
_activeMenuItem.display();
}
-void Menu::setupMenuAction() {
+void DropDownMenu::setupMenuAction() {
_activeMenuItem.reset();
Common::String f5Does = _vm->f5Does();
@@ -441,7 +449,7 @@ void Menu::setupMenuAction() {
_activeMenuItem.display();
}
-void Menu::setupMenuPeople() {
+void DropDownMenu::setupMenuPeople() {
if (!people.empty())
people.clear();
@@ -457,7 +465,7 @@ void Menu::setupMenuPeople() {
_activeMenuItem.display();
}
-void Menu::setupMenuObjects() {
+void DropDownMenu::setupMenuObjects() {
_activeMenuItem.reset();
for (int i = 0; i < kObjectNum; i++) {
if (_vm->_objects[i])
@@ -466,7 +474,7 @@ void Menu::setupMenuObjects() {
_activeMenuItem.display();
}
-void Menu::setupMenuWith() {
+void DropDownMenu::setupMenuWith() {
_activeMenuItem.reset();
if (_vm->_thinkThing) {
@@ -523,7 +531,7 @@ void Menu::setupMenuWith() {
_activeMenuItem.display();
}
-void Menu::runMenuGame() {
+void DropDownMenu::runMenuGame() {
// Help, boss, untrash screen.
switch (_activeMenuItem._choiceNum) {
case 0:
@@ -533,7 +541,7 @@ void Menu::runMenuGame() {
_vm->callVerb(kVerbCodeBoss);
break;
case 2:
- _vm->majorRedraw();
+ _vm->_graphics->refreshScreen();
break;
case 3:
_vm->callVerb(kVerbCodeScore);
@@ -544,7 +552,7 @@ void Menu::runMenuGame() {
}
}
-void Menu::runMenuFile() {
+void DropDownMenu::runMenuFile() {
// New game, load, save, save as, DOS shell, about, quit.
switch (_activeMenuItem._choiceNum) {
case 0:
@@ -571,7 +579,7 @@ void Menu::runMenuFile() {
}
}
-void Menu::runMenuAction() {
+void DropDownMenu::runMenuAction() {
// Get up, pause game, open door, look, inventory, walk/run.
switch (_activeMenuItem._choiceNum) {
case 0: {
@@ -608,16 +616,16 @@ void Menu::runMenuAction() {
}
}
-void Menu::runMenuObjects() {
+void DropDownMenu::runMenuObjects() {
_vm->thinkAbout(_vm->_objectList[_activeMenuItem._choiceNum], AvalancheEngine::kThing);
}
-void Menu::runMenuPeople() {
+void DropDownMenu::runMenuPeople() {
_vm->thinkAbout(people[_activeMenuItem._choiceNum], AvalancheEngine::kPerson);
_lastPerson = (People)people[_activeMenuItem._choiceNum];
}
-void Menu::runMenuWith() {
+void DropDownMenu::runMenuWith() {
_vm->_parser->_thing = _vm->_thinks;
if (_vm->_thinkThing) {
@@ -656,21 +664,21 @@ void Menu::runMenuWith() {
_vm->callVerb((VerbCode)(byte)_verbStr[_activeMenuItem._choiceNum]);
}
-void Menu::setup() {
+void DropDownMenu::setup() {
_menuBar.init(this);
_activeMenuItem.init(this);
- _menuBar.createMenuItem('F', "File", '!', &Avalanche::Menu::setupMenuFile, &Avalanche::Menu::runMenuFile);
- _menuBar.createMenuItem('G', "Game", 34, &Avalanche::Menu::setupMenuGame, &Avalanche::Menu::runMenuGame);
- _menuBar.createMenuItem('A', "Action", 30, &Avalanche::Menu::setupMenuAction, &Avalanche::Menu::runMenuAction);
- _menuBar.createMenuItem('O', "Objects", 24, &Avalanche::Menu::setupMenuObjects, &Avalanche::Menu::runMenuObjects);
- _menuBar.createMenuItem('P', "People", 25, &Avalanche::Menu::setupMenuPeople, &Avalanche::Menu::runMenuPeople);
- _menuBar.createMenuItem('W', "With", 17, &Avalanche::Menu::setupMenuWith, &Avalanche::Menu::runMenuWith);
+ _menuBar.createMenuItem('F', "File", '!', &Avalanche::DropDownMenu::setupMenuFile, &Avalanche::DropDownMenu::runMenuFile);
+ _menuBar.createMenuItem('G', "Game", 34, &Avalanche::DropDownMenu::setupMenuGame, &Avalanche::DropDownMenu::runMenuGame);
+ _menuBar.createMenuItem('A', "Action", 30, &Avalanche::DropDownMenu::setupMenuAction, &Avalanche::DropDownMenu::runMenuAction);
+ _menuBar.createMenuItem('O', "Objects", 24, &Avalanche::DropDownMenu::setupMenuObjects, &Avalanche::DropDownMenu::runMenuObjects);
+ _menuBar.createMenuItem('P', "People", 25, &Avalanche::DropDownMenu::setupMenuPeople, &Avalanche::DropDownMenu::runMenuPeople);
+ _menuBar.createMenuItem('W', "With", 17, &Avalanche::DropDownMenu::setupMenuWith, &Avalanche::DropDownMenu::runMenuWith);
_menuBar.draw();
}
-void Menu::update() { // TODO: Optimize it ASAP!!! It really needs it...
+void DropDownMenu::update() {
_vm->_graphics->saveScreen();
Common::Point cursorPos = _vm->getMousePos();
@@ -761,7 +769,7 @@ void Menu::update() { // TODO: Optimize it ASAP!!! It really needs it...
_vm->_graphics->removeBackup();
}
-char Menu::getThingChar(byte which) {
+char DropDownMenu::getThingChar(byte which) {
static const char thingsChar[] = "WMBParCLguKeSnIohn"; // V=Vinegar
char result;
@@ -778,17 +786,19 @@ char Menu::getThingChar(byte which) {
return result;
}
-byte Menu::getNameChar(People whose) {
+byte DropDownMenu::getNameChar(People whose) {
static const char ladChar[] = "ASCDMTRwLfgeIyPu";
static const char lassChar[] = "kG\0xB1o";
- if (whose < kPeopleArkata)
+ if (whose <= kPeopleJacques)
return ladChar[whose - kPeopleAvalot];
- else
+ else if ((whose >= kPeopleArkata) && (whose <= kPeopleWisewoman))
return lassChar[whose - kPeopleArkata];
+ else
+ error("getName() - Unexpected character id %d", (byte) whose);
}
-Common::String Menu::getThing(byte which) {
+Common::String DropDownMenu::getThing(byte which) {
static const char things[kObjectNum][20] = {
"Wine", "Money-bag", "Bodkin", "Potion", "Chastity belt",
"Crossbow bolt", "Crossbow", "Lute", "Pilgrim's badge", "Mushroom", "Key",
@@ -820,15 +830,15 @@ Common::String Menu::getThing(byte which) {
return result;
}
-bool Menu::isActive() {
+bool DropDownMenu::isActive() {
return _menuActive;
}
-void Menu::init() {
+void DropDownMenu::init() {
_menuActive = false;
}
-void Menu::resetVariables() {
+void DropDownMenu::resetVariables() {
_lastPerson = kPeoplePardon;
}
} // End of namespace Avalanche.
diff --git a/engines/avalanche/menu.h b/engines/avalanche/dropdown.h
index a7ec8bf2db..417b775c3d 100644
--- a/engines/avalanche/menu.h
+++ b/engines/avalanche/dropdown.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -27,17 +27,17 @@
/* Original name: DROPDOWN A customized version of Oopmenu (qv). */
-#ifndef AVALANCHE_MENU_H
-#define AVALANCHE_MENU_H
+#ifndef AVALANCHE_DROPDOWN_H
+#define AVALANCHE_DROPDOWN_H
#include "common/str.h"
namespace Avalanche {
class AvalancheEngine;
-class Menu;
+class DropDownMenu;
-typedef void (Menu::*MenuFunc)();
+typedef void (DropDownMenu::*MenuFunc)();
static const Color kMenuBackgroundColor = kColorLightgray;
static const Color kMenuBorderColor = kColorBlack;
@@ -49,13 +49,13 @@ public:
int16 _xpos, _xright;
MenuFunc _setupFunc, _chooseFunc;
- void init(char trig, char alTtrig, Common::String title, byte pos, MenuFunc setupFunc, MenuFunc chooseFunc, Menu *menu);
+ void init(char trig, char alTtrig, Common::String title, byte pos, MenuFunc setupFunc, MenuFunc chooseFunc, DropDownMenu *menu);
void draw();
void highlight();
bool parseAltTrigger(char key);
private:
- Menu *_menu;
+ DropDownMenu *_dropdown;
};
struct OptionType {
@@ -75,7 +75,7 @@ public:
byte _activeNum; // And if so, which is it?
byte _choiceNum; // Your choice?
- void init(Menu *menu);
+ void init(DropDownMenu *menu);
void reset();
void setupOption(Common::String title, char trigger, Common::String shortcut, bool valid);
void display();
@@ -88,7 +88,7 @@ private:
byte _optionNum;
byte _highlightNum;
- Menu *_menu;
+ DropDownMenu *_dropdown;
void displayOption(byte y, bool highlit);
void moveHighlight(int8 inc);
@@ -102,20 +102,21 @@ public:
HeadType _menuItems[8];
byte _menuNum;
- void init(Menu *menu);
+ MenuBar();
+ void init(DropDownMenu *menu);
void createMenuItem(char trig, Common::String title, char altTrig, MenuFunc setupFunc, MenuFunc chooseFunc);
void draw();
void chooseMenuItem(int16 x);
private:
- Menu *_menu;
+ DropDownMenu *_dropdown;
void setupMenuItem(byte which);
// CHECKME: Useless function
void parseAltTrigger(char c);
};
-class Menu {
+class DropDownMenu {
public:
friend class HeadType;
friend class MenuItem;
@@ -124,7 +125,7 @@ public:
MenuItem _activeMenuItem;
MenuBar _menuBar;
- Menu(AvalancheEngine *vm);
+ DropDownMenu(AvalancheEngine *vm);
void update();
void setup(); // Standard menu bar.
@@ -178,4 +179,4 @@ private:
} // End of namespace Avalanche.
-#endif // AVALANCHE_MENU_H
+#endif // AVALANCHE_DROPDOWN_H
diff --git a/engines/avalanche/enums.h b/engines/avalanche/enums.h
index 604c62de84..0ba39321bc 100644
--- a/engines/avalanche/enums.h
+++ b/engines/avalanche/enums.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope 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.
@@ -29,6 +29,11 @@
#define AVALANCHE_ENUMS_H
namespace Avalanche {
+
+enum MonsterType { kMonsterTypeGhost, kMonsterTypeGlerk };
+
+enum Flavour { kFlavourEga, kFlavourBgi, kFlavourNatural, kFlavourTwo, kFlavourOne };
+
enum Color {
kColorBlack = 0, kColorBlue, kColorGreen, kColorCyan, kColorRed,
kColorMagenta = 5, kColorBrown, kColorLightgray, kColorDarkgray, kColorLightblue,
@@ -81,13 +86,13 @@ enum VerbCode {
kVerbCodeRestart = 31, kVerbCodeEat = 32, kVerbCodeListen = 33, kVerbCodeBuy = 34, kVerbCodeAttack = 35,
kVerbCodePasswd = 36, kVerbCodeDir = 37, kVerbCodeDie = 38, kVerbCodeScore = 39, kVerbCodePut = 40,
kVerbCodeKiss = 41, kVerbCodeClimb = 42, kVerbCodeJump = 43, kVerbCodeHiscores = 44, kVerbCodeWake = 45,
- kVerbCodeHello = 46, kVerbCodeThanks = 47,
+ kVerbCodeHello = 46, kVerbCodeThanks = 47,
kVerbCodeSmartAlec = 249, kVerbCodeExpletive = 253, kVerbCodePardon = 254
};
enum MouseCursor {
- kCurUpArrow = 0, kCurScrewDriver = 1, kCurRightArrow = 2, kCurFletch = 3, kCurWait = 4, kCurHand = 5,
- kCurCrosshair = 6, kCurIBeam = 7
+ kCurUpArrow = 0, kCurScrewDriver = 1, kCurRightArrow = 2, kCurFletch = 3, kCurWait = 4, kCurHand = 5,
+ kCurCrosshair = 6, kCurIBeam = 7, kCurHelp = 8
};
// Magic/portal constants:
@@ -127,7 +132,6 @@ static const int16 kScreenHeight = 200;
static const int16 kWalk = 3;
static const int16 kRun = 5;
-
} // End of namespace Avalanche
#endif // AVALANCHE_ENUMS_H
diff --git a/engines/avalanche/ghostroom.cpp b/engines/avalanche/ghostroom.cpp
new file mode 100644
index 0000000000..047a3670c2
--- /dev/null
+++ b/engines/avalanche/ghostroom.cpp
@@ -0,0 +1,398 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public 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 the original source code of Lord Avalot d'Argent version 1.3.
+* Copyright (c) 1994-1995 Mike: Mark and Thomas Thurman.
+*/
+
+#include "avalanche/avalanche.h"
+#include "avalanche/ghostroom.h"
+
+#include "common/random.h"
+
+namespace Avalanche {
+
+const int8 GhostRoom::kAdjustment[5] = { 7, 0, 7, 7, 7 };
+const byte GhostRoom::kWaveOrder[5] = { 4, 0, 1, 2, 3 };
+const byte GhostRoom::kGlerkFade[26] = { 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 2, 2, 2, 1, 1, 0 };
+const byte GhostRoom::kGreldetFade[18] = { 0, 1, 2, 3, 4, 5, 5, 5, 4, 4, 3, 3, 2, 2, 1, 1, 0, 0 };
+
+GhostRoom::GhostRoom(AvalancheEngine *vm) {
+ _vm = vm;
+
+ _glerkStage = 0;
+ _batX = 0;
+ _batY = 0;
+ _batCount = 0;
+ _aarghCount = 0;
+ _greldetX = _greldetY = 0;
+ _greldetCount = 0;
+ _redGreldet = false;
+ _wasLoaded = false;
+
+ _ghost = nullptr;
+ _glerk = nullptr;
+}
+
+GhostRoom::~GhostRoom() {
+ for (int i = 0; i < 2; i++)
+ _eyes[i].free();
+
+ _exclamation.free();
+
+ for (int i = 0; i < 3; i++)
+ _bat[i].free();
+
+ for (int i = 0; i < 6; i++)
+ _aargh[i].free();
+
+ for (int i = 0; i < 5; i++)
+ _greenEyes[i].free();
+
+ for (int i = 0; i < 2; i++) {
+ for (int j = 0; j < 6; j++)
+ _greldet[j][i].free();
+ }
+
+ if (_wasLoaded) {
+ for (int i = 0; i < 5; i++) {
+ for (int j = 0; j < 2; j++) {
+ for (int y = 0; y < 66; y++) {
+ delete[] _ghost[i][j][y];
+ }
+ delete[] _ghost[i][j];
+ }
+ delete[] _ghost[i];
+ }
+ delete[] _ghost;
+
+ for (int i = 0; i < 6; i++) {
+ for (int j = 0; j < 4; j++) {
+ for (int y = 0; y < 35; y++) {
+ delete[] _glerk[i][j][y];
+ }
+ delete[] _glerk[i][j];
+ }
+ delete[] _glerk[i];
+ }
+ delete[] _glerk;
+ }
+}
+
+void GhostRoom::wait(uint16 howLong) {
+ for (int i = 0; i < howLong; i++) {
+ Common::Event event;
+ _vm->getEvent(event);
+ if (event.type == Common::EVENT_KEYDOWN)
+ _vm->_sound->playNote(6177, 1);
+ _vm->_system->delayMillis(1);
+ }
+}
+
+void GhostRoom::doBat() {
+ _batCount++;
+
+ int8 dx = 0;
+ int8 iy = 0;
+ byte batImage = 0;
+ if ((_batCount % 2) == 1) {
+ if ((1 <= _batCount) && (_batCount <= 90)) {
+ dx = 2;
+ iy = 1;
+ batImage = 0;
+ } else if ((91 <= _batCount) && (_batCount <= 240)) {
+ dx = 1;
+ iy = 1;
+ batImage = 1;
+ } else if((241 <= _batCount) && (_batCount <= 260)) {
+ dx = 1;
+ iy = 4;
+ batImage = 2;
+ }
+
+ if ((_batCount == 91) || (_batCount == 241)) // When the bat changes, blank out the old one.
+ _vm->_graphics->drawFilledRectangle(Common::Rect(_batX + _bat[batImage].w, _batY, _batX + _bat[batImage - 1].w, _batY + _bat[batImage - 1].h), kColorBlack);
+
+ _vm->_graphics->drawFilledRectangle(Common::Rect(_batX, _batY, _batX + _bat[batImage].w, _batY + iy), kColorBlack);
+ _vm->_graphics->drawFilledRectangle(Common::Rect(_batX + _bat[batImage].w - dx, _batY, _batX + _bat[batImage].w, _batY + _bat[batImage].h), kColorBlack);
+
+ _batX -= dx;
+ _batY++;
+ _vm->_graphics->ghostDrawPicture(_bat[batImage], _batX, _batY);
+ }
+}
+
+void GhostRoom::bigGreenEyes(byte how) {
+ _vm->_graphics->ghostDrawPicture(_greenEyes[how], 330, 103);
+ _vm->_graphics->ghostDrawPicture(_greenEyes[how], 376, 103);
+ _vm->_graphics->refreshScreen();
+}
+
+ChunkBlock GhostRoom::readChunkBlock(Common::File &file) {
+ ChunkBlock cb;
+ cb._flavour = (Flavour)file.readByte();
+ cb._x = file.readSint16LE();
+ cb._y = file.readSint16LE();
+ cb._width = file.readSint16LE();
+ cb._height = file.readSint16LE();
+ cb._size = file.readSint32LE();
+ return cb;
+}
+
+void GhostRoom::loadPictures() {
+ Common::File file;
+
+ if (!file.open("spooky.avd"))
+ error("AVALANCHE: GhostRoom: File not found: spooky.avd");
+
+ file.seek(44);
+
+ // Initializing ghost's array.
+ _ghost = new byte***[5];
+ for (int i = 0; i < 5; i++) {
+ _ghost[i] = new byte**[2];
+ for (int j = 0; j < 2; j++) {
+ _ghost[i][j] = new byte*[66];
+ for (int y = 0; y < 66; y++) {
+ _ghost[i][j][y] = new byte[26];
+ for (int x = 0; x < 26; x++)
+ _ghost[i][j][y][x] = 0;
+ }
+ }
+ }
+
+ // Read in the pictures of the ghost.
+ for (int i = 0; i < 5; i++) {
+ ChunkBlock cb = readChunkBlock(file);
+ for (int j = 0; j < 2; j++) {
+ for (int y = 0; y <= cb._height; y++)
+ file.read(_ghost[i][j][y], cb._width / 8);
+ }
+ }
+
+ for (int i = 0; i < 2; i++)
+ _eyes[i] = _vm->_graphics->ghostLoadPicture(file, dummyCoord);
+
+ _exclamation = _vm->_graphics->ghostLoadPicture(file, dummyCoord);
+
+ // Actually this function not just loads, but also draws the images, but they are part of the background
+ // and they are need to be drawn only once.
+ _vm->_graphics->ghostDrawBackgroundItems(file);
+
+ for (int i = 0; i < 3; i++)
+ _bat[i] = _vm->_graphics->ghostLoadPicture(file, dummyCoord);
+
+ // Initializing glerk's array.
+ _glerk = new byte***[6];
+ for (int i = 0; i < 6; i++) {
+ _glerk[i] = new byte**[4];
+ for (int j = 0; j < 4; j++) {
+ _glerk[i][j] = new byte*[35];
+ for (int y = 0; y < 35; y++) {
+ _glerk[i][j][y] = new byte[9];
+ for (int x = 0; x < 9; x++)
+ _glerk[i][j][y][x] = 0;
+ }
+ }
+ }
+
+ // Read in the pictures of the "glerk".
+ for (int i = 0; i < 6; i++) {
+ ChunkBlock cb = readChunkBlock(file);
+ for (int j = 0; j < 4; j++) {
+ for (int y = 0; y <= cb._height; y++)
+ file.read(_glerk[i][j][y], cb._width / 8);
+ }
+ }
+
+ for (int i = 0; i < 6; i++)
+ _aargh[i] = _vm->_graphics->ghostLoadPicture(file, _aarghWhere[i]);
+
+ for (int i = 0; i < 5; i++)
+ _greenEyes[i] = _vm->_graphics->ghostLoadPicture(file, dummyCoord);
+
+ for (int i = 0; i < 2; i++) {
+ for (int j = 0; j < 6; j++)
+ _greldet[j][i] = _vm->_graphics->ghostLoadPicture(file, dummyCoord);
+ }
+
+ file.close();
+}
+
+void GhostRoom::run() {
+ CursorMan.showMouse(false);
+ _vm->_graphics->saveScreen();
+ _vm->fadeOut();
+ _vm->_graphics->blackOutScreen();
+ _vm->fadeIn();
+
+ // Only load the pictures if it's our first time walking into the room.
+ // After that we simply use the already loaded images.
+ if (!_wasLoaded) {
+ loadPictures();
+ _wasLoaded = true;
+ }
+
+ // Avvy walks over:
+ _glerkStage = 0;
+ _batX = 277;
+ _batY = 40;
+ _batCount = 0;
+
+ for (int x = 500; x >= 217; x--) {
+ // The floating eyeballs:
+ int xBound = x % 30;
+ if ((22 <= xBound) && (xBound <= 27)) {
+ if (xBound == 27)
+ _vm->_graphics->drawFilledRectangle(Common::Rect(x, 135, x + 17, 137), kColorBlack);
+ _vm->_graphics->ghostDrawPicture(_eyes[0], x, 136);
+ _vm->_graphics->drawDot(x + 16, 137, kColorBlack);
+ } else {
+ if (xBound == 21)
+ _vm->_graphics->drawFilledRectangle(Common::Rect(x, 137, x + 18, 139), kColorBlack);
+ _vm->_graphics->ghostDrawPicture(_eyes[0], x, 135);
+ _vm->_graphics->drawDot(x + 16, 136, kColorBlack); // Eyes would leave a trail 1 pixel high behind them.
+ }
+
+ // Plot the Glerk:
+ if ((x % 10) == 0) {
+ if (_glerkStage > 25)
+ break;
+
+ _vm->_graphics->ghostDrawMonster(_glerk[kGlerkFade[_glerkStage]], 456, 14, kMonsterTypeGlerk);
+ _glerkStage++;
+ }
+
+ doBat();
+
+ _vm->_graphics->refreshScreen();
+
+ wait(15);
+ }
+
+ // Blank out the Glerk's space.
+ _vm->_graphics->drawFilledRectangle(Common::Rect(456, 14, 531, 51), kColorBlack);
+ _vm->_graphics->refreshScreen();
+
+
+ // Here comes the descending ghost:
+ for (int y = -64; y <= 103; y++) {
+ _vm->_graphics->ghostDrawMonster(_ghost[1 + (abs(y / 7) % 2) * 3], 0, y, kMonsterTypeGhost);
+ if (y > 0)
+ _vm->_graphics->drawFilledRectangle(Common::Rect(0, y - 1, 26 * 8 + 1, y + 1), kColorBlack);
+ _vm->_graphics->refreshScreen();
+
+ wait(27);
+ }
+
+ // Then it waves:
+ _aarghCount = -15;
+
+ for (int i = 0; i < 4; i++) {
+ for (int j = 0; j < 5; j++) {
+ _vm->_graphics->drawFilledRectangle(Common::Rect(0, 96, 26 * 8, 170), kColorBlack);
+ _vm->_graphics->ghostDrawMonster(_ghost[kWaveOrder[j]], 0, 96 + kAdjustment[j], kMonsterTypeGhost);
+
+ _aarghCount++;
+
+ if (_aarghCount >= 0) {
+ for (int k = 0; k <= _aarghCount; k++)
+ _vm->_graphics->ghostDrawPicture(_aargh[k], _aarghWhere[k].x, _aarghWhere[k].y);
+ }
+
+ _vm->_graphics->refreshScreen();
+
+ wait(177);
+ }
+ }
+
+ // The exclamation mark appears:
+ _vm->_graphics->ghostDrawPicture(_exclamation, 246, 127);
+ _vm->_graphics->refreshScreen();
+ wait(777);
+
+ // Erase "aargh":
+ _vm->_graphics->drawFilledRectangle(Common::Rect(172, 78, 348, 112), kColorBlack);
+ _vm->_graphics->refreshScreen();
+
+ for (int i = 4; i >= 0; i--) {
+ wait(377);
+ bigGreenEyes(i);
+ }
+
+ // Erase the exclamation mark:
+ _vm->_graphics->drawFilledRectangle(Common::Rect(246, 127, 252, 134), kColorBlack);
+ _vm->_graphics->refreshScreen();
+
+ // Avvy hurries back:
+ _glerkStage = 0;
+ _greldetCount = 18;
+ _redGreldet = false;
+
+ for (int x = 217; x <= 479; x++) {
+ // The floating eyeballs again:
+ int xBound = x % 30;
+ if ((22 <= xBound) && (xBound <= 27)) {
+ if (xBound == 22)
+ _vm->_graphics->drawFilledRectangle(Common::Rect(x + 22, 134, x + 39, 138), kColorBlack);
+ _vm->_graphics->ghostDrawPicture(_eyes[1], x + 23, 136);
+ _vm->_graphics->drawDot(x + 22, 137, kColorBlack);
+ } else {
+ if (xBound == 28)
+ _vm->_graphics->drawFilledRectangle(Common::Rect(x + 22, 135, x + 39, 139), kColorBlack);
+ _vm->_graphics->ghostDrawPicture(_eyes[1], x + 23, 135);
+ _vm->_graphics->drawDot(x + 22, 136, kColorBlack); // Eyes would leave a trail 1 pixel high behind them.
+ }
+
+ // Plot the Green Eyes:
+ if ((x % 53) == 5) {
+ bigGreenEyes(_glerkStage);
+ _glerkStage++;
+ }
+
+ // Plot the Greldet:
+ if (_greldetCount == 18) {
+ _greldetX = _vm->_rnd->getRandomNumber(599);
+ _greldetY = _vm->_rnd->getRandomNumber(79);
+ _greldetCount = 0;
+ _redGreldet = !_redGreldet;
+ }
+
+ _vm->_graphics->ghostDrawPicture(_greldet[kGreldetFade[_greldetCount]][_redGreldet], _greldetX, _greldetY);
+ _greldetCount++;
+
+ _vm->_graphics->refreshScreen();
+
+ wait(10);
+ }
+
+ CursorMan.showMouse(true);
+
+ _vm->fadeOut();
+ _vm->_graphics->restoreScreen();
+ _vm->_graphics->removeBackup();
+ _vm->_animation->animLink();
+ _vm->fadeIn();
+}
+
+} // End of namespace Avalanche
diff --git a/engines/avalanche/ghostroom.h b/engines/avalanche/ghostroom.h
new file mode 100644
index 0000000000..ca1e8ac806
--- /dev/null
+++ b/engines/avalanche/ghostroom.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 the original source code of Lord Avalot d'Argent version 1.3.
+* Copyright (c) 1994-1995 Mike: Mark and Thomas Thurman.
+*/
+
+#ifndef AVALANCHE_GHOSTROOM_H
+#define AVALANCHE_GHOSTROOM_H
+
+#include "common/scummsys.h"
+#include "graphics/surface.h"
+
+namespace Avalanche {
+class AvalancheEngine;
+
+struct ChunkBlock {
+ Flavour _flavour;
+ int16 _x, _y;
+ int16 _width, _height;
+ int32 _size;
+};
+
+class GhostRoom {
+public:
+ GhostRoom(AvalancheEngine *vm);
+ ~GhostRoom();
+
+ void run();
+ ChunkBlock readChunkBlock(Common::File &file);
+
+private:
+ AvalancheEngine *_vm;
+
+ static const int8 kAdjustment[5];
+ static const byte kWaveOrder[5];
+ static const byte kGlerkFade[26];
+ static const byte kGreldetFade[18];
+
+ Common::Point dummyCoord;
+ byte ****_ghost;// [5][2][66][26]
+ Graphics::Surface _eyes[2];
+ Graphics::Surface _exclamation;
+ Graphics::Surface _bat[3];
+ byte ****_glerk; // [6][4][35][9]
+ Graphics::Surface _aargh[6];
+ Common::Point _aarghWhere[6];
+ Graphics::Surface _greenEyes[5];
+ Graphics::Surface _greldet[6][2];
+
+ int16 _batX, _batY;
+ uint16 _batCount;
+ byte _glerkStage;
+ int8 _aarghCount;
+ int16 _greldetX, _greldetY;
+ byte _greldetCount;
+ bool _redGreldet;
+ bool _wasLoaded;
+
+ void loadPictures();
+ void wait(uint16 howLong);
+ void doBat();
+ void bigGreenEyes(byte how);
+};
+
+} // End of namespace Avalanche
+
+#endif // AVALANCHE_GHOSTROOM_H
diff --git a/engines/avalanche/graphics.cpp b/engines/avalanche/graphics.cpp
index 25b01d65f3..60c23594d3 100644
--- a/engines/avalanche/graphics.cpp
+++ b/engines/avalanche/graphics.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope 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.
@@ -36,19 +36,20 @@ namespace Avalanche {
const byte GraphicManager::kEgaPaletteIndex[16] = {0, 1, 2, 3, 4, 5, 20, 7, 56, 57, 58, 59, 60, 61, 62, 63};
const MouseHotspotType GraphicManager::kMouseHotSpots[9] = {
- {8,0}, // 0 - up-arrow
- {0,0}, // 1 - screwdriver
+ {8,0}, // 0 - up-arrow
+ {0,0}, // 1 - screwdriver
{15,6}, // 2 - right-arrow
- {0,0}, // 3 - fletch
- {8,7}, // 4 - hourglass
- {4,0}, // 5 - TTHand
- {8,5}, // 6 - Mark's crosshairs
- {8,7}, // 7 - I-beam
- {0,0} // 8 - question mark
+ {0,0}, // 3 - fletch
+ {8,7}, // 4 - hourglass
+ {4,0}, // 5 - TTHand
+ {8,5}, // 6 - Mark's crosshairs
+ {8,7}, // 7 - I-beam
+ {0,0} // 8 - question mark
};
GraphicManager::GraphicManager(AvalancheEngine *vm) {
_vm = vm;
+ setDialogColor(kColorBlack, kColorWhite);
}
GraphicManager::~GraphicManager() {
@@ -126,7 +127,6 @@ void GraphicManager::loadMouse(byte which) {
cursor.create(16, 32, Graphics::PixelFormat::createFormatCLUT8());
cursor.fillRect(Common::Rect(0, 0, 16, 32), 255);
-
// The AND mask.
f.seek(kMouseSize * 2 * which + 134);
@@ -198,7 +198,7 @@ void GraphicManager::drawToolbar() {
Common::Point GraphicManager::drawArc(Graphics::Surface &surface, int16 x, int16 y, int16 stAngle, int16 endAngle, uint16 radius, Color color) {
Common::Point endPoint;
- const float convfac = M_PI / 180.0;
+ const float convfac = (float)M_PI / 180.0f;
int32 xRadius = radius;
int32 yRadius = radius * kScreenWidth / (8 * kScreenHeight); // Just don't ask why...
@@ -231,7 +231,7 @@ Common::Point GraphicManager::drawArc(Graphics::Surface &surface, int16 x, int16
uint16 numOfPixels = (uint16)floor(sqrt(3.0) * sqrt(pow(double(xRadius), 2) + pow(double(yRadius), 2)) + 0.5);
// Calculate the angle precision required.
- float delta = 90.0 / numOfPixels;
+ float delta = 90.0f / numOfPixels;
// Always just go over the first 90 degrees. Could be optimized a
// bit if startAngle and endAngle lie in the same quadrant, left as an
@@ -281,6 +281,14 @@ Common::Point GraphicManager::drawArc(Graphics::Surface &surface, int16 x, int16
return endPoint;
}
+void GraphicManager::drawDot(int x, int y, Color color) {
+ *(byte *)_surface.getBasePtr(x, y) = color;
+}
+
+void GraphicManager::drawLine(int x1, int y1, int x2, int y2, int penX, int penY, Color color) {
+ _surface.drawThickLine(x1, y1, x2, y2, penX, penY, color);
+}
+
Common::Point GraphicManager::drawScreenArc(int16 x, int16 y, int16 stAngle, int16 endAngle, uint16 radius, Color color) {
return drawArc(_surface, x, y, stAngle, endAngle, radius, color);
}
@@ -344,6 +352,25 @@ void GraphicManager::drawNormalText(const Common::String text, FontType font, by
drawText(_surface, text, font, fontHeight, x, y, color);
}
+/**
+ * Draws text double the size of the normal.
+ */
+void GraphicManager::drawBigText(Graphics::Surface &surface, const Common::String text, FontType font, byte fontHeight, int16 x, int16 y, Color color) {
+ for (uint i = 0; i < text.size(); i++) {
+ for (int j = 0; j < fontHeight; j++) {
+ byte pixel = font[(byte)text[i]][j];
+ byte pixelBit = 0;
+ for (int bit = 0; bit < 16; bit++) {
+ if ((bit % 2) == 0)
+ pixelBit = (pixel >> (bit / 2)) & 1;
+ for (int k = 0; k < 2; k++)
+ if (pixelBit)
+ *(byte *)surface.getBasePtr(x + i * 16 + 16 - bit, y + j * 2 + k) = color;
+ }
+ }
+ }
+}
+
void GraphicManager::drawScrollText(const Common::String text, FontType font, byte fontHeight, int16 x, int16 y, Color color) {
drawText(_scrolls, text, font, fontHeight, x, y, color);
}
@@ -451,6 +478,424 @@ void GraphicManager::drawDebugLines() {
}
}
+void GraphicManager::drawRectangle(Common::Rect rect, Color color) {
+ _surface.frameRect(rect, color);
+}
+
+void GraphicManager::drawFilledRectangle(Common::Rect rect, Color color) {
+ _surface.fillRect(rect, color);
+}
+
+void GraphicManager::blackOutScreen() {
+ _vm->_graphics->drawFilledRectangle(Common::Rect(0, 0, 640, 200), kColorBlack);
+}
+
+void GraphicManager::nimLoad() {
+ Common::File file;
+ Common::String filename = "nim.avd";
+
+ if (!file.open(filename))
+ error("AVALANCHE: Scrolls: File not found: %s", filename.c_str());
+
+ file.seek(41);
+
+ _nimStone = loadPictureSign(file, 7, 23);
+ for (int i = 0; i < 3; i++)
+ _nimInitials[i] = loadPictureSign(file, 7, 23);
+ _nimLogo = loadPictureSign(file, 30, 37);
+
+ file.close();
+}
+
+void GraphicManager::nimDrawStone(int x, int y) {
+ drawPicture(_surface, _nimStone, x, y);
+}
+
+void GraphicManager::nimDrawInitials() {
+ for (int i = 0; i < 3; i++)
+ drawPicture(_surface, _nimInitials[i], 0, 75 + i * 35);
+}
+
+void GraphicManager::nimDrawLogo() {
+ drawPicture(_surface, _nimLogo, 392, 5);
+}
+
+void GraphicManager::nimFree() {
+ _nimStone.free();
+ for (int i = 0; i < 3; i++)
+ _nimInitials[i].free();
+ _nimLogo.free();
+}
+
+void GraphicManager::ghostDrawMonster(byte ***picture, uint16 destX, int16 destY, MonsterType type) {
+ uint16 height = 0;
+ uint16 width = 0;
+ // Only for the Ghost:
+ const byte kPlaneToUse[4] = { 0, 0, 0, 1 };
+ int yStart = 0;
+
+ // Constants from the original code:
+ switch (type) {
+ case kMonsterTypeGhost:
+ height = 66;
+ width = 208; // 26 * 8
+
+ // We have to mess around with the coords and the sizes since
+ // the ghost isn't always placed fully on the screen.
+ if (destY < 0) {
+ yStart = abs(destY);
+ height -= yStart;
+ destY = 0;
+ }
+ break;
+ case kMonsterTypeGlerk:
+ height = 35;
+ width = 72; // 9 * 8
+ break;
+ default:
+ break;
+ }
+
+ Graphics::Surface monsterPicture;
+ monsterPicture.create(width, height, Graphics::PixelFormat::createFormatCLUT8());
+
+ for (int y = 0; y < height; y++) {
+ for (int plane = 0; plane < 4; plane++) {
+ for (uint16 x = 0; x < width / 8; x++) {
+ byte pixel = 0;
+
+ switch (type) {
+ case kMonsterTypeGhost:
+ pixel = picture[kPlaneToUse[plane]][y + yStart][x];
+ break;
+ case kMonsterTypeGlerk:
+ pixel = picture[plane][y][x];
+ break;
+ default:
+ break;
+ }
+
+ for (int bit = 0; bit < 8; bit++) {
+ byte pixelBit = (pixel >> bit) & 1;
+ *(byte *)monsterPicture.getBasePtr(x * 8 + 7 - bit, y) += (pixelBit << plane);
+ }
+ }
+ }
+ }
+
+ drawPicture(_surface, monsterPicture, destX, destY);
+
+ monsterPicture.free();
+}
+
+/**
+ * With the use of the second argument, it replaces get_meg_aargh as well.
+ * @remarks Originally called 'get_me' and was located in Ghostroom.
+ */
+Graphics::Surface GraphicManager::ghostLoadPicture(Common::File &file, Common::Point &coord) {
+ ChunkBlock cb = _vm->_ghostroom->readChunkBlock(file);
+
+ coord.x = cb._x;
+ coord.y = cb._y;
+
+ Graphics::Surface picture = loadPictureGraphic(file);
+
+ skipDifference(cb._size, picture, file);
+
+ return picture;
+}
+
+void GraphicManager::ghostDrawPicture(const Graphics::Surface &picture, uint16 destX, uint16 destY) {
+ drawPicture(_surface, picture, destX, destY);
+}
+
+/**
+ * Loads and puts 3 images (in this order: cobweb, Mark's signature, open door) into the background at the beginning of the ghostroom scene.
+ * @remarks Originally called 'plain_grab' and was located in Ghostroom. It was originally called 3 times. I unified these in one function, used a for cycle.
+ */
+void GraphicManager::ghostDrawBackgroundItems(Common::File &file) {
+ for (int num = 0; num < 3; num++) {
+ ChunkBlock cb = _vm->_ghostroom->readChunkBlock(file);
+
+ int width = cb._width;
+ int height = cb._height + 1;
+
+ Graphics::Surface picture;
+ picture.create(width, height, Graphics::PixelFormat::createFormatCLUT8());
+
+ // Load the picture according to it's type.
+ switch (cb._flavour) {
+ case kFlavourOne: // There is only one plane.
+ for (uint16 y = 0; y < height; y++) {
+ for (uint16 x = 0; x < width; x += 8) {
+ byte pixel = file.readByte();
+ for (int i = 0; i < 8; i++) {
+ byte pixelBit = (pixel >> i) & 1;
+ *(byte *)picture.getBasePtr(x + 7 - i, y) = (pixelBit << 3);
+ }
+ }
+ }
+ break;
+ case kFlavourEga:
+ picture = loadPictureRaw(file, width, height);
+ break;
+ default:
+ break;
+ }
+
+ drawPicture(_surface, picture, cb._x, cb._y);
+
+ picture.free();
+ }
+ refreshScreen();
+}
+
+/**
+* @remarks Originally called 'plot_button'
+*/
+void GraphicManager::helpDrawButton(int y, byte which) {
+ if (y > 200) {
+ _vm->_graphics->setBackgroundColor(kColorGreen);
+ _vm->_system->delayMillis(10);
+ _vm->_graphics->setBackgroundColor(kColorBlack);
+ return;
+ }
+
+ Common::File file;
+
+ if (!file.open("buttons.avd"))
+ error("AVALANCHE: Help: File not found: buttons.avd");
+
+ file.seek(which * 930); // 930 is the size of one button.
+
+ Graphics::Surface button = loadPictureGraphic(file);
+
+ int x = 0;
+ if (y == -177) {
+ x = 229;
+ y = 5;
+ }
+ else
+ x = 470;
+
+ _vm->_graphics->drawPicture(_surface, button, x, y);
+
+ button.free();
+ file.close();
+}
+
+/**
+ * @remarks Originally called 'light'
+ */
+void GraphicManager::helpDrawHighlight(byte which, Color color) {
+ if (which == 177) // Dummy value for "no button at all".
+ return;
+
+ which &= 31;
+ drawRectangle(Common::Rect(466, 38 + which * 27, 556, 63 + which * 27), color);
+}
+
+void GraphicManager::helpDrawBigText(const Common::String text, int16 x, int16 y, Color color) {
+ drawBigText(_surface, text, _vm->_font, 8, x, y, color);
+}
+
+/**
+ * @remarks Originally called 'titles'
+ */
+void GraphicManager::seuDrawTitle() {
+ Common::File file;
+
+ if (!file.open("shoot1.avd"))
+ error("AVALANCHE: ShootEmUp: File not found: shoot1.avd");
+
+ const uint16 width = 320;
+ const uint16 height = 200;
+
+ Graphics::Surface picture = loadPictureRaw(file, width, height);
+
+ Graphics::Surface doubledPicture;
+ doubledPicture.create(width * 2, height, Graphics::PixelFormat::createFormatCLUT8());
+
+ // These cycles are for doubling the picture's width.
+ for (int x = (width * 2) - 2 ; x >= 0; x -= 2) {
+ for (int y = 0; y < height; y++) {
+ *(byte *)doubledPicture.getBasePtr(x, y) = *(byte *)doubledPicture.getBasePtr(x + 1, y) = *(byte *)picture.getBasePtr(x / 2, y);
+ }
+ }
+
+ drawPicture(_surface, doubledPicture, 0, 0);
+ refreshScreen();
+
+ picture.free();
+ doubledPicture.free();
+
+ file.close();
+}
+
+void GraphicManager::seuLoad() {
+ Common::File file;
+
+ if (!file.open("notts.avd"))
+ error("AVALANCHE: ShootEmUp: File not found: notts.avd");
+
+ for (int i = 0; i < 99; i++) {
+ int size = file.readUint16LE();
+ _seuPictures[i] = loadPictureGraphic(file);
+ skipDifference(size, _seuPictures[i], file);
+ }
+
+ file.close();
+}
+
+void GraphicManager::seuFree() {
+ for (int i = 0; i < 99; i++)
+ _seuPictures[i].free();
+}
+
+/**
+ * @remarks Originally called 'display' and it also replaces 'display_const'
+ */
+void GraphicManager::seuDrawPicture(int x, int y, byte which) {
+ drawPicture(_surface, _seuPictures[which], x, y);
+}
+
+/**
+ * @remarks Originally called 'cameo_display'
+ */
+void GraphicManager::seuDrawCameo(int destX, int destY, byte w1, byte w2) {
+ // First we make the pixels of the previous sprite (cameo) blank:
+ uint16 maxX = _seuPictures[w2].w;
+ uint16 maxY = _seuPictures[w2].h;
+
+ if (destX + maxX > _surface.w)
+ maxX = _surface.w - destX;
+
+ if (destY + maxY > _surface.h)
+ maxY = _surface.h - destY;
+
+ for (uint16 y = 0; y < maxY; y++) {
+ for (uint16 x = 0; x < maxX; x++) {
+ if (*(const byte *)_seuPictures[w2].getBasePtr(x, y) != 0)
+ *(byte *)_surface.getBasePtr(x + destX, y + destY) = 0;
+ }
+ }
+
+ // Then we draw the desired sprite:
+ drawPicture(_surface, _seuPictures[w1], destX, destY);
+}
+
+uint16 GraphicManager::seuGetPicWidth(int which) {
+ return _seuPictures[which].w;
+}
+
+uint16 GraphicManager::seuGetPicHeight(int which) {
+ return _seuPictures[which].h;
+}
+
+void GraphicManager::menuRefreshScreen() {
+ g_system->copyRectToScreen(_menu.getPixels(), _menu.pitch, 0, 0, kScreenWidth, kMenuScreenHeight);
+ g_system->updateScreen();
+}
+
+void GraphicManager::menuInitialize() {
+ initGraphics(kScreenWidth, kMenuScreenHeight, true);
+ _menu.create(kScreenWidth, kMenuScreenHeight, Graphics::PixelFormat::createFormatCLUT8());
+}
+
+void GraphicManager::menuFree() {
+ _menu.free();
+}
+
+void GraphicManager::menuRestoreScreen() {
+ initGraphics(kScreenWidth, 2 * kScreenHeight, true);
+}
+
+void GraphicManager::menuLoadPictures() {
+ _menu.fillRect(Common::Rect(0, 0, kScreenWidth, kMenuScreenHeight), kColorBlack);
+
+ Common::File file;
+
+ if (!file.open("menu.avd"))
+ error("AVALANCHE: MainMenu: File not found: menu.avd");
+
+ int height = 33;
+ int width = 9 * 8;
+
+ for (int plane = 0; plane < 4; plane++) {
+ // The icons themselves:
+ int n = 0;
+ for (uint16 y = 70; y < 70 + height * 6; y++) {
+ for (uint16 x = 48; x < 48 + width; x += 8) {
+ if (n < 1773) { // Magic value deciphered from the original code.
+ byte pixel = file.readByte();
+ n++;
+ for (int i = 0; i < 8; i++) {
+ byte pixelBit = (pixel >> i) & 1;
+ *(byte *)_menu.getBasePtr(x + 7 - i, y) += (pixelBit << plane);
+ }
+ }
+ }
+ }
+ // The right borders of the menuboxes:
+ for (int a = 0; a < 33; a++) {
+ byte pixel = file.readByte();
+ for (int b = 0; b < 6; b++) {
+ for (int i = 0; i < 8; i++) {
+ byte pixelBit = (pixel >> i) & 1;
+ *(byte *)_menu.getBasePtr(584 + 7 - i, 70 + b * 33 + a) += (pixelBit << plane);
+ }
+ }
+ }
+ }
+
+ for (int i = 0; i < 6; i++) {
+ _menu.fillRect(Common::Rect(114, 73 + i * 33, 584, 100 + i * 33), kColorLightgray);
+ _menu.fillRect(Common::Rect(114, 70 + i * 33, 584, 73 + i * 33), kColorWhite);
+ _menu.fillRect(Common::Rect(114, 100 + i * 33, 584, 103 + i * 33), kColorDarkgray);
+ }
+
+ file.close();
+
+ // The title on the top of the screen:
+ if (!file.open("mainmenu.avd"))
+ error("AVALANCHE: MainMenu: File not found: mainmenu.avd");
+
+ Graphics::Surface title = loadPictureRaw(file, 640, 59);
+ drawPicture(_menu, title, 0, 0);
+ title.free();
+
+ file.close();
+}
+
+void GraphicManager::menuDrawBigText(FontType font, uint16 x, uint16 y, Common::String text, Color color) {
+ drawBigText(_menu, text, font, 14, x, y, color);
+}
+
+void GraphicManager::menuDrawIndicator(int x) { // TODO: Implement striped pattern for the indicator.
+ if (x > 0)
+ _menu.fillRect(Common::Rect(x - 1, 330, x, 337), kColorBlack);
+ _menu.fillRect(Common::Rect(x, 330, x + 1, 337), kColorWhite);
+ menuRefreshScreen();
+}
+
+/**
+ * This function is for skipping the difference between a stored 'size' value associated with a picture
+ * and the actual size of the pictures when reading them from files for Ghostroom and Shoot em' up.
+ * It's needed bacuse the original code loaded the pictures to arrays first and only used the useful parts
+ * of these arrays when drawing the images, but in the ScummVM version, we only read the
+ * useful parts from the files, so we have to skip these differences between readings.
+ */
+void GraphicManager::skipDifference(int size, const Graphics::Surface &picture, Common::File &file) {
+ int bytesPerRow = (picture.w / 8);
+ if ((picture.w % 8) > 0)
+ bytesPerRow += 1;
+ int loadedBytes = picture.h * bytesPerRow * 4 + 4;
+ // * 4 is for the four planes, + 4 is for the reading of the width and the height at loadPictureGraphic's beginning.
+
+ int bytesToSkip = size - loadedBytes;
+ file.skip(bytesToSkip);
+}
+
/**
* This function mimics Pascal's getimage().
*/
@@ -469,6 +914,8 @@ Graphics::Surface GraphicManager::loadPictureGraphic(Common::File &file) {
byte pixel = file.readByte();
for (int bit = 0; bit < 8; bit++) {
byte pixelBit = (pixel >> bit) & 1;
+ // If the picture's width is not a multiple of 8, and we get over the boundary with the 'x' cycle, pixelBit is surely == 0.
+ // Otherwise, it doesn't cause trouble, since addign 0 doesn't have an effect at all.
if (pixelBit != 0)
*(byte *)picture.getBasePtr(x + 7 - bit, y) += (pixelBit << plane);
}
@@ -503,6 +950,52 @@ Graphics::Surface GraphicManager::loadPictureRaw(Common::File &file, uint16 widt
return picture;
}
+Graphics::Surface GraphicManager::loadPictureSign(Common::File &file, uint16 width, uint16 height) {
+ // I know it looks very similar to the other loadPicture methods, but in truth it's the combination of the two.
+ width *= 8;
+
+ Graphics::Surface picture; // We make a Surface object for the picture itself.
+ picture.create(width, height, Graphics::PixelFormat::createFormatCLUT8());
+
+ // Produce the picture. We read it in row-by-row, and every row has 4 planes.
+ for (int y = 0; y < height; y++) {
+ for (int8 plane = 0; plane < 4; plane++) { // The planes are in the "right" order.
+ for (uint16 x = 0; x < width; x += 8) {
+ byte pixel = file.readByte();
+ for (int bit = 0; bit < 8; bit++) {
+ byte pixelBit = (pixel >> bit) & 1;
+ *(byte *)picture.getBasePtr(x + 7 - bit, y) += (pixelBit << plane);
+ }
+ }
+ }
+ }
+
+ return picture;
+}
+
+/**
+* Shifts the whole screen down by one line and fills the gap with black.
+*/
+void GraphicManager::shiftScreen() {
+ for (uint16 y = _surface.h - 1; y > 1; y--)
+ memcpy(_surface.getBasePtr(0, y), _surface.getBasePtr(0, y - 1), _surface.w);
+
+ _surface.drawLine(0, 0, _surface.w, 0, kColorBlack);
+}
+
+void GraphicManager::drawWinningPic() {
+ Common::File file;
+
+ if (!file.open("finale.avd"))
+ error("AVALANCHE: Timer: File not found: finale.avd");
+
+ Graphics::Surface winning = loadPictureRaw(file, 640, 200);
+ drawPicture(_surface, winning, 0, 0);
+
+ winning.free();
+ file.close();
+}
+
void GraphicManager::clearAlso() {
_magics.fillRect(Common::Rect(0, 0, 640, 200), 0);
_magics.frameRect(Common::Rect(0, 45, 640, 161), 15);
@@ -572,7 +1065,7 @@ void GraphicManager::drawPicture(Graphics::Surface &target, const Graphics::Surf
if (destX + maxX > target.w)
maxX = target.w - destX;
-
+
if (destY + maxY > target.h)
maxY = target.h - destY;
@@ -590,7 +1083,27 @@ void GraphicManager::drawCursor(byte pos) {
}
void GraphicManager::drawReadyLight(Color color) {
- _surface.fillRect(Common::Rect(419, 195, 438, 197), color);
+ _surface.fillRect(Common::Rect(419, 195, 439, 198), color);
+ _scrolls.fillRect(Common::Rect(419, 195, 439, 198), color);
+}
+
+void GraphicManager::drawSoundLight(bool state) {
+ Color color = kColorBlack;
+ if (state)
+ color = kColorCyan;
+ else
+ color = kColorBlack;
+ _surface.fillRect(Common::Rect(419, 175, 439, 178), color);
+}
+
+void GraphicManager::drawErrorLight(bool state) {
+ Color color = kColorBlack;
+ if (state)
+ color = kColorRed;
+ else
+ color = kColorBlack;
+ _surface.fillRect(Common::Rect(419, 184, 439, 187), color);
+ refreshScreen();
}
/**
@@ -603,28 +1116,10 @@ void GraphicManager::drawSign(Common::String fn, int16 xl, int16 yl, int16 y) {
if (!file.open(filename))
error("AVALANCHE: Scrolls: File not found: %s", filename.c_str());
- // I know it looks very similar to the loadPicture methods, but in truth it's the combination of the two.
- uint16 width = xl * 8;
- uint16 height = yl;
-
Graphics::Surface sign; // We make a Surface object for the picture itself.
- sign.create(width, height, Graphics::PixelFormat::createFormatCLUT8());
-
- // Produce the picture. We read it in row-by-row, and every row has 4 planes.
- for (int yy = 0; yy < height; yy++) {
- for (int8 plane = 0; plane < 4; plane++) { // The planes are in the "right" order.
- for (uint16 xx = 0; xx < width; xx += 8) {
- byte pixel = file.readByte();
- for (int bit = 0; bit < 8; bit++) {
- byte pixelBit = (pixel >> bit) & 1;
- if (pixelBit != 0)
- *(byte *)sign.getBasePtr(xx + 7 - bit, yy) += (pixelBit << plane);
- }
- }
- }
- }
-
- drawPicture(_scrolls, sign, kScreenWidth / 2 - width / 2, y);
+ sign = loadPictureSign(file, xl, yl);
+ uint16 width = xl * 8;
+ drawPicture(_scrolls, sign, kScreenWidth / 2 - width / 2, y); // x coord: center the picture.
file.close();
}
@@ -668,7 +1163,7 @@ void GraphicManager::prepareBubble(int xc, int xw, int my, Common::Point points[
drawTriangle(points, _talkBackgroundColor);
}
-/**
+/**
* Set the background of the text to the desired color.
*/
void GraphicManager::wipeChar(int x, int y, Color color) {
@@ -733,10 +1228,10 @@ void GraphicManager::showScroll() {
void GraphicManager::getNaturalPicture(SpriteType &sprite) {
sprite._type = kNaturalImage; // We simply read from the screen and later, in drawSprite() we draw it right back.
- sprite._size = sprite._xl * 8 * sprite._yl + 1;
- sprite._picture.create(sprite._xl * 8, sprite._yl + 1, Graphics::PixelFormat::createFormatCLUT8());
- for (uint16 y = 0; y < sprite._yl + 1; y++) {
- for (uint16 x = 0; x < sprite._xl * 8; x++)
+ sprite._size = sprite._width * 8 * sprite._height + 1;
+ sprite._picture.create(sprite._width * 8, sprite._height + 1, Graphics::PixelFormat::createFormatCLUT8());
+ for (uint16 y = 0; y < sprite._height + 1; y++) {
+ for (uint16 x = 0; x < sprite._width * 8; x++)
*(byte *)sprite._picture.getBasePtr(x, y) = *(byte *)_vm->_graphics->_surface.getBasePtr(sprite._x * 8 + x, sprite._y + y);
}
}
@@ -759,9 +1254,12 @@ void GraphicManager::setDialogColor(Color bg, Color text) {
_talkFontColor = text;
}
-// Original name background()
-void GraphicManager::setBackgroundColor(Color x) {
- warning("STUB: setBackgroundColor()");
+/**
+* Changes the black color of the palette to the selected one.
+* @remarks Originally called 'background'
+*/
+void GraphicManager::setBackgroundColor(Color newColor) {
+ g_system->getPaletteManager()->setPalette(_egaPalette[kEgaPaletteIndex[newColor]], kColorBlack, 1);
}
} // End of namespace Avalanche
diff --git a/engines/avalanche/graphics.h b/engines/avalanche/graphics.h
index 4af6d4e8db..bd8fc6c8ff 100644
--- a/engines/avalanche/graphics.h
+++ b/engines/avalanche/graphics.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope 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.
@@ -38,6 +38,7 @@ namespace Avalanche {
class AvalancheEngine;
class AnimationType;
struct SpriteType;
+struct ChunkBlock;
typedef byte FontType[256][16];
typedef byte ManiType[2049];
@@ -58,6 +59,11 @@ public:
void loadDigits();
void loadMouse(byte which);
+ void drawRectangle(Common::Rect rect, Color color);
+ void drawFilledRectangle(Common::Rect rect, Color color);
+ void blackOutScreen();
+ void drawDot(int x, int y, Color color);
+ void drawLine(int x1, int y1, int x2, int y2, int penX, int penY, Color color);
Common::Point drawScreenArc(int16 x, int16 y, int16 stAngle, int16 endAngle, uint16 radius, Color color);
void drawPieSlice(int16 x, int16 y, int16 stAngle, int16 endAngle, uint16 radius, Color color);
void drawTriangle(Common::Point *p, Color color);
@@ -77,22 +83,66 @@ public:
void drawChar(byte ander, int x, int y, Color color);
void drawDebugLines();
+ // For the mini-game "Nim".
+ void nimLoad();
+ void nimDrawStone(int x, int y);
+ void nimDrawInitials();
+ void nimDrawLogo();
+ void nimFree();
+
+ // Used in wobble()
+ void shiftScreen();
+
+ // Used in winning()
+ void drawWinningPic();
+
+ // Ghostroom's functions:
+ void ghostDrawMonster(byte ***picture, uint16 destX, int16 destY, MonsterType type);
+ Graphics::Surface ghostLoadPicture(Common::File &file, Common::Point &coord);
+ void ghostDrawPicture(const Graphics::Surface &picture, uint16 destX, uint16 destY);
+ void ghostDrawBackgroundItems(Common::File &file);
+
+ // Help's function:
+ void helpDrawButton(int y, byte which);
+ void helpDrawHighlight(byte which, Color color);
+ void helpDrawBigText(const Common::String text, int16 x, int16 y, Color color);
+
+ // Shoot em' up's functions:
+ void seuDrawTitle();
+ void seuLoad();
+ void seuFree();
+ void seuDrawPicture(int x, int y, byte which);
+ void seuDrawCameo(int destX, int destY, byte w1, byte w2);
+ uint16 seuGetPicWidth(int which);
+ uint16 seuGetPicHeight(int which);
+
+ // Main Menu's functions:
+ // The main menu uses a different screen height (350) from the game itself (200 * 2)
+ // so it needs it's own graphic functions on that matter.
+ void menuRefreshScreen();
+ void menuInitialize();
+ void menuFree();
+ void menuRestoreScreen();
+ void menuLoadPictures();
+ void menuDrawBigText(FontType font, uint16 x, uint16 y, Common::String text, Color color);
+ void menuDrawIndicator(int x);
+
void clearAlso();
void clearTextBar();
void setAlsoLine(int x1, int y1, int x2, int y2, Color color);
byte getAlsoColor(int x1, int y1, int x2, int y2);
byte getScreenColor(Common::Point pos);
- // The caller has to .free() the returned Surfaces!!!
- // Further information about these two: http://www.shikadi.net/moddingwiki/Raw_EGA_data
+ // Further information about this: http://www.shikadi.net/moddingwiki/Raw_EGA_data
Graphics::Surface loadPictureRaw(Common::File &file, uint16 width, uint16 height);
void drawSprite(AnimationType *sprite, byte picnum, int16 x, int16 y);
- void drawPicture(Graphics::Surface &target, const Graphics::Surface picture, uint16 destX, uint16 destY);
void drawThinkPic(Common::String filename, int id);
void drawToolbar();
void drawCursor(byte pos);
void drawReadyLight(Color color);
+ void drawSoundLight(bool state);
+ void drawErrorLight(bool state);
void drawSign(Common::String name, int16 xl, int16 yl, int16 y);
void drawIcon(int16 x, int16 y, byte which);
void drawScreenLine(int16 x, int16 y, int16 x2, int16 y2, Color color);
@@ -100,7 +150,7 @@ public:
void refreshScreen();
void loadBackground(Common::File &file);
void refreshBackground();
- void setBackgroundColor(Color x);
+ void setBackgroundColor(Color newColor);
void setDialogColor(Color bg, Color text);
void zoomOut(int16 x, int16 y);
@@ -108,14 +158,16 @@ public:
void getNaturalPicture(SpriteType &sprite);
void saveScreen();
- void removeBackup();
void restoreScreen();
+ void removeBackup();
private:
+ static const int16 kMouseSize = 134;
static const uint16 kBackgroundWidth = kScreenWidth;
static const byte kEgaPaletteIndex[16];
static const byte kBackgroundHeight = 8 * 12080 / kScreenWidth; // With 640 width it's 151.
// The 8 = number of bits in a byte, and 12080 comes from Lucerna::load().
+ static const uint16 kMenuScreenHeight = 350;
Graphics::Surface _background;
Graphics::Surface _backup;
@@ -125,15 +177,32 @@ private:
Graphics::Surface _screen; // Only used in refreshScreen() to make it more optimized. (No recreation of it at every call of the function.)
Graphics::Surface _scrolls;
Graphics::Surface _surface;
+ Graphics::Surface _menu;
+
+ // For the mini-game "Nim".
+ Graphics::Surface _nimStone;
+ Graphics::Surface _nimInitials[3];
+ Graphics::Surface _nimLogo;
+
+ // For the mini-game "Shoot em' up".
+ Graphics::Surface _seuPictures[99];
+
byte _egaPalette[64][3];
AvalancheEngine *_vm;
+ void skipDifference(int size, const Graphics::Surface &picture, Common::File &file);
+
+ // Further information about these two: http://www.shikadi.net/moddingwiki/Raw_EGA_data
Graphics::Surface loadPictureGraphic(Common::File &file); // Reads Graphic-planar EGA data.
+ Graphics::Surface loadPictureSign(Common::File &file, uint16 width, uint16 height); // Reads a tricky type of picture used for the "game over"/"about" scrolls and in the mini-game Nim.
+
void drawText(Graphics::Surface &surface, const Common::String text, FontType font, byte fontHeight, int16 x, int16 y, Color color);
+ void drawBigText(Graphics::Surface &surface, const Common::String text, FontType font, byte fontHeight, int16 x, int16 y, Color color);
+ void drawPicture(Graphics::Surface &target, const Graphics::Surface picture, uint16 destX, uint16 destY);
+
// Taken from Free Pascal's Procedure InternalEllipseDefault. Used to replace Pascal's procedure arc.
// Returns the end point of the arc. (Needed in Clock.)
- // TODO: Make it more accurate later.
Common::Point drawArc(Graphics::Surface &surface, int16 x, int16 y, int16 stAngle, int16 endAngle, uint16 radius, Color color);
};
diff --git a/engines/avalanche/help.cpp b/engines/avalanche/help.cpp
new file mode 100644
index 0000000000..4d08e3d58b
--- /dev/null
+++ b/engines/avalanche/help.cpp
@@ -0,0 +1,270 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public 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 the original source code of Lord Avalot d'Argent version 1.3.
+* Copyright (c) 1994-1995 Mike, Mark and Thomas Thurman.
+*/
+
+/* Original name: HELPER The help system unit. */
+
+#include "avalanche/avalanche.h"
+#include "avalanche/help.h"
+
+#include "common/scummsys.h"
+
+namespace Avalanche {
+
+Help::Help(AvalancheEngine *vm) {
+ _vm = vm;
+
+ for (int i = 0; i < 10; i++) {
+ _buttons[i]._trigger = Common::KEYCODE_INVALID;
+ _buttons[i]._whither = 0;
+ }
+ _highlightWas = 0;
+ _buttonNum = 0;
+ _holdLeft = false;
+}
+
+/**
+ * Loads and draws the chosen page of the help.
+ * @remarks Originally called 'getme'
+ */
+void Help::switchPage(byte which) {
+ // Help icons are 80x20.
+
+ _highlightWas = 177; // Forget where the highlight was.
+
+ Common::File file;
+
+ if (!file.open("help.avd"))
+ error("AVALANCHE: Help: File not found: help.avd");
+
+ file.seek(which * 2);
+ uint16 offset = file.readUint16LE();
+ file.seek(offset);
+
+ Common::String title = getLine(file);
+
+ _vm->_graphics->drawFilledRectangle(Common::Rect(0, 0, 640, 200), kColorBlue);
+ _vm->_graphics->drawFilledRectangle(Common::Rect(8, 40, 450, 200), kColorWhite);
+
+ byte index = file.readByte();
+ _vm->_graphics->helpDrawButton(-177, index);
+
+ // Plot the title:
+ _vm->_graphics->drawNormalText(title, _vm->_font, 8, 629 - 8 * title.size(), 26, kColorBlack);
+ _vm->_graphics->drawNormalText(title, _vm->_font, 8, 630 - 8 * title.size(), 25, kColorCyan);
+
+ _vm->_graphics->helpDrawBigText("help!", 549, 1, kColorBlack);
+ _vm->_graphics->helpDrawBigText("help!", 550, 0, kColorCyan);
+
+ byte y = 0;
+ do {
+ Common::String line = getLine(file);
+ if (!line.empty()) {
+ if (line.compareTo(Common::String('!')) == 0) // End of the help text is signalled with a '!'.
+ break;
+ if (line[0] == '\\') {
+ line.deleteChar(0);
+ _vm->_graphics->drawNormalText(line, _vm->_font, 8, 16, 41 + y * 10, kColorRed);
+ }
+ else
+ _vm->_graphics->drawNormalText(line, _vm->_font, 8, 16, 41 + y * 10, kColorBlack);
+ }
+ y++;
+ } while (true);
+
+ // We are now at the end of the text. Next we must read the icons:
+ y = 0;
+ _buttonNum = 0;
+ while (!file.eos()) {
+ int trigger = file.readByte();
+
+ if (trigger == 177)
+ break;
+ switch (trigger) {
+ case 254: // Escape
+ trigger = 27;
+ break;
+ case 214: // PageUp
+ trigger = 280;
+ break;
+ case 216: // PageDown
+ trigger = 281;
+ break;
+ default: // A - Z
+ // The characters are stored in the file in uppercase, but we need the lowercase versions for KeyCode:
+ trigger = tolower(trigger);
+ break;
+ }
+
+ _buttons[y]._trigger = Common::KeyCode(trigger);
+ index = file.readByte();
+ if (_buttons[y]._trigger != Common::KEYCODE_INVALID)
+ _vm->_graphics->helpDrawButton(13 + (y + 1) * 27, index);
+ _buttons[y]._whither = file.readByte(); // This is the position to jump to.
+
+ Common::String text = "";
+ switch (_buttons[y]._trigger) {
+ case Common::KEYCODE_ESCAPE:
+ text = Common::String("Esc");
+ break;
+ case Common::KEYCODE_PAGEUP:
+ text = Common::String(24);
+ break;
+ case Common::KEYCODE_PAGEDOWN:
+ text = Common::String(25);
+ break;
+ default:
+ text = Common::String(toupper(_buttons[y]._trigger));
+ break;
+ }
+
+ _vm->_graphics->helpDrawBigText(text, 589 - (text.size() * 8), 18 + (y + 1) * 27, kColorBlack);
+ _vm->_graphics->helpDrawBigText(text, 590 - (text.size() * 8), 17 + (y + 1) * 27, kColorCyan);
+
+ y++;
+ _buttonNum++;
+ }
+
+ _vm->_graphics->refreshScreen();
+
+ file.close();
+}
+
+Common::String Help::getLine(Common::File &file) {
+ Common::String line;
+ byte length = file.readByte();
+ for (int i = 0; i < length; i++) {
+ char c = file.readByte();
+ line += (c ^ 177);
+ }
+ return line;
+}
+
+bool Help::handleMouse(const Common::Event &event) {
+ Common::Point mousePos;
+ mousePos.x = event.mouse.x;
+ mousePos.y = event.mouse.y / 2;
+
+ int index = -1;
+
+ if (event.type == Common::EVENT_LBUTTONUP) { // Clicked *somewhere*...
+ _holdLeft = false;
+
+ if ((mousePos.x < 470) || (mousePos.x > 550) || (((mousePos.y - 13) % 27) > 20))
+ index = -1;
+ else // Clicked on a button.
+ index = ((mousePos.y - 13) / 27) - 1;
+ } else { // LBUTTONDOWN or MOUSEMOVE
+ int highlightIs = 0;
+
+ // Decide which button we are hovering the cursor over:
+ if ((mousePos.x > 470) && (mousePos.x <= 550) && (((mousePos.y - 13) % 27) <= 20)) { // No click, so highlight.
+ highlightIs = (mousePos.y - 13) / 27 - 1;
+ if ((highlightIs < 0) || (5 < highlightIs))
+ highlightIs = 177; // In case of silly values.
+ } else
+ highlightIs = 177;
+
+ Color highlightColor = kColorLightblue;
+ // If we clicked on a button or we are holding down the button, we have to highlight it with cyan:
+ if (((highlightIs != 177) && (event.type == Common::EVENT_LBUTTONDOWN)) || _holdLeft) {
+ _holdLeft = true;
+ highlightColor = kColorLightcyan;
+ }
+
+ // Erase the previous highlight only if it's needed:
+ if (_highlightWas != highlightIs)
+ _vm->_graphics->helpDrawHighlight(_highlightWas, kColorBlue);
+
+ // Highlight the current one with the proper color:
+ if ((highlightIs != 177) && (_buttons[highlightIs]._trigger != Common::KEYCODE_INVALID)) {
+ _highlightWas = highlightIs;
+ _vm->_graphics->helpDrawHighlight(highlightIs, highlightColor);
+ }
+ }
+
+ if ((index >= 0) && (_buttons[index]._trigger != Common::KEYCODE_INVALID)) {
+ if (_buttons[index]._trigger == Common::KEYCODE_ESCAPE)
+ return true;
+ else {
+ _vm->fadeOut();
+ switchPage(_buttons[index]._whither);
+ _vm->fadeIn();
+ return false;
+ }
+ }
+
+ return false;
+}
+
+bool Help::handleKeyboard(const Common::Event &event) {
+ if (event.kbd.keycode == Common::KEYCODE_ESCAPE)
+ return true;
+
+ for (int i = 0; i < _buttonNum; i++) {
+ if (_buttons[i]._trigger == event.kbd.keycode) {
+ _vm->fadeOut();
+ switchPage(_buttons[i]._whither);
+ _vm->fadeIn();
+ return false;
+ }
+ }
+
+ return false;
+}
+
+/**
+ * @remarks Originally called 'boot_help'
+ */
+void Help::run() {
+ _vm->_graphics->saveScreen();
+ _vm->fadeOut();
+ switchPage(0);
+ _vm->fadeIn();
+
+ _vm->_graphics->loadMouse(kCurHelp);
+
+ // Originally it was the body of 'continue_help':
+ bool close = false;
+ while (!_vm->shouldQuit() && !close) {
+ Common::Event event;
+ _vm->getEvent(event);
+ if (event.type == Common::EVENT_KEYDOWN)
+ close = handleKeyboard(event);
+ else if ((event.type == Common::EVENT_LBUTTONDOWN) || (event.type == Common::EVENT_LBUTTONUP) || (event.type == Common::EVENT_MOUSEMOVE))
+ close = handleMouse(event);
+
+ _vm->_graphics->refreshScreen();
+ }
+ // End of 'continue_help'.
+
+ _vm->fadeOut();
+ _vm->_graphics->restoreScreen();
+ _vm->_graphics->removeBackup();
+ _vm->fadeIn();
+}
+
+} // End of namespace Avalanche
diff --git a/engines/avalanche/help.h b/engines/avalanche/help.h
new file mode 100644
index 0000000000..7543d87047
--- /dev/null
+++ b/engines/avalanche/help.h
@@ -0,0 +1,65 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ */
+
+/*
+* This code is based on the original source code of Lord Avalot d'Argent version 1.3.
+* Copyright (c) 1994-1995 Mike, Mark and Thomas Thurman.
+*/
+
+/* Original name: HELPER The help system unit. */
+
+#ifndef AVALANCHE_HELP_H
+#define AVALANCHE_HELP_H
+
+namespace Avalanche {
+class AvalancheEngine;
+
+class Help {
+public:
+ Help(AvalancheEngine *vm);
+
+ void run();
+
+private:
+ struct Button {
+ Common::KeyCode _trigger;
+ byte _whither;
+ };
+
+ AvalancheEngine *_vm;
+
+ Button _buttons[10];
+ byte _highlightWas;
+ byte _buttonNum; // How many buttons do we have on the screen at the moment?
+ bool _holdLeft; // Is the left mouse button is still being held?
+
+ void switchPage(byte which);
+ Common::String getLine(Common::File &file); // It was a nested function in getMe().
+
+ // These two return true if we have to leave the Help:
+ bool handleMouse(const Common::Event &event);
+ bool handleKeyboard(const Common::Event &event);
+};
+
+} // End of namespace Avalanche
+
+#endif // AVALANCHE_HELP_H
diff --git a/engines/avalanche/highscore.cpp b/engines/avalanche/highscore.cpp
new file mode 100644
index 0000000000..5f47aeb894
--- /dev/null
+++ b/engines/avalanche/highscore.cpp
@@ -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.
+*
+*/
+
+/*
+* This code is based on the original source code of Lord Avalot d'Argent version 1.3.
+* Copyright (c) 1994-1995 Mike: Mark and Thomas Thurman.
+*/
+
+#include "avalanche/avalanche.h"
+#include "avalanche/highscore.h"
+
+#include "common/savefile.h"
+
+namespace Avalanche {
+
+HighScore::HighScore(AvalancheEngine *vm) {
+ _vm = vm;
+}
+
+void HighScore::displayHighScores() {
+ warning("STUB: HighScore::displayHighScores(");
+}
+
+void HighScore::saveHighScores() {
+ int firstSmaller = 0;
+ while ((firstSmaller < 12) && (_data[firstSmaller]._score >= _vm->_score))
+ firstSmaller++;
+
+ if (firstSmaller < 12) {
+ // Shift all the lower scores down a space:
+ for (int i = firstSmaller; i < 11; i++)
+ _data[i + 1] = _data[i];
+ // Set the new high score:
+ _data[firstSmaller]._name = "Player"; // TODO: Come up with something for that. In the original it wasn't implemented at all...
+ _data[firstSmaller]._rank = _vm->_parser->rank();
+ _data[firstSmaller]._score = _vm->_score;
+ }
+
+ Common::OutSaveFile *f = g_system->getSavefileManager()->openForSaving("scores.avd");
+ if (!f) {
+ warning("Can't create file 'scores.avd', high scores are not saved.");
+ return;
+ }
+ Common::Serializer sz(NULL, f);
+ syncHighScores(sz);
+ f->finalize();
+ delete f;
+}
+
+void HighScore::loadHighScroes() {
+ Common::File file;
+ if (!file.exists("scores.avd")) {
+ produceDefaultHighScores();
+ } else {
+ Common::InSaveFile *f = g_system->getSavefileManager()->openForLoading("scores.avd");
+ if (!f)
+ return;
+ Common::Serializer sz(f, NULL);
+ syncHighScores(sz);
+ delete f;
+ }
+}
+
+void HighScore::produceDefaultHighScores() {
+ for (int i = 0; i < 12; i++) {
+ _data[i]._score = 32 - (i + 1) * 2;
+ _data[i]._rank = "...";
+ }
+ _data[0]._name = "Mike";
+ _data[1]._name = "Liz";
+ _data[2]._name = "Thomas";
+ _data[3]._name = "Mark";
+ _data[4]._name = "Mandy";
+ _data[5]._name = "Andrew";
+ _data[6]._name = "Lucy Tryphena";
+ _data[7]._name = "Tammy the dog";
+ _data[8]._name = "Avaricius";
+ _data[9]._name = "Spellchick";
+ _data[10]._name = "Caddelli";
+ _data[11]._name = "Spludwick";
+}
+
+void HighScore::syncHighScores(Common::Serializer &sz) {
+ for (int i = 0; i < 12; i++) {
+ sz.syncString(_data[i]._name);
+ sz.syncAsUint16LE(_data[i]._score);
+ sz.syncString(_data[i]._rank);
+ }
+}
+
+} // End of namespace Avalanche
diff --git a/engines/zvision/console.h b/engines/avalanche/highscore.h
index 0ca1b8cc70..de7ec36ed5 100644
--- a/engines/zvision/console.h
+++ b/engines/avalanche/highscore.h
@@ -8,48 +8,52 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+*
* You should have received a copy of the GNU General Public 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 ZVISION_CONSOLE_H
-#define ZVISION_CONSOLE_H
+/*
+* This code is based on the original source code of Lord Avalot d'Argent version 1.3.
+* Copyright (c) 1994-1995 Mike: Mark and Thomas Thurman.
+*/
-#include "gui/debugger.h"
+#ifndef AVALANCHE_HIGHSCORE_H
+#define AVALANCHE_HIGHSCORE_H
-namespace ZVision {
+namespace Avalanche {
+class AvalancheEngine;
-class ZVision;
+struct HighScoreData {
+ Common::String _name;
+ uint16 _score;
+ Common::String _rank;
+};
-class Console : public GUI::Debugger {
+class HighScore {
public:
- Console(ZVision *engine);
- virtual ~Console() {}
+ HighScore(AvalancheEngine *vm);
+
+ void displayHighScores();
+ void saveHighScores();
+ void loadHighScroes();
private:
- ZVision *_engine;
-
- bool cmdLoadImage(int argc, const char **argv);
- bool cmdLoadVideo(int argc, const char **argv);
- bool cmdLoadSound(int argc, const char **argv);
- bool cmdRawToWav(int argc, const char **argv);
- bool cmdSetRenderState(int argc, const char **argv);
- bool cmdGenerateRenderTable(int argc, const char **argv);
- bool cmdSetPanoramaFoV(int argc, const char **argv);
- bool cmdSetPanoramaScale(int argc, const char **argv);
- bool cmdChangeLocation(int argc, const char **argv);
- bool cmdDumpFile(int argc, const char **argv);
- bool cmdParseAllScrFiles(int argc, const char **argv);
- bool cmdRenderText(int argc, const char **argv);
+ AvalancheEngine *_vm;
+
+ HighScoreData _data[12];
+
+ void produceDefaultHighScores();
+ void syncHighScores(Common::Serializer &sz);
};
-} // End of namespace ZVision
-#endif
+} // End of namespace Avalanche
+
+#endif // AVALANCHE_HIGHSCORE_H
diff --git a/engines/avalanche/mainmenu.cpp b/engines/avalanche/mainmenu.cpp
new file mode 100644
index 0000000000..543684556c
--- /dev/null
+++ b/engines/avalanche/mainmenu.cpp
@@ -0,0 +1,116 @@
+/* ScummVM - Graphic Adventure Engine
+*
+* ScummVM is the legal property of its developers, whose names
+* are too numerous to list here. Please refer to the COPYRIGHT
+* file distributed with this source distribution.
+*
+* This program is free software; you can redistribute it and/or
+* modify it under the terms of the GNU General Public License
+* as published by the Free Software Foundation; either version 2
+* of the License, or (at your option) any later version.
+*
+* This program is distributed in the hope that it will be useful,
+* but WITHOUT ANY WARRANTY; without even the implied warranty of
+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+* GNU General Public License for more details.
+*
+* You should have received a copy of the GNU General Public 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 the original source code of Lord Avalot d'Argent version 1.3.
+* Copyright (c) 1994-1995 Mike, Mark and Thomas Thurman.
+*/
+
+#include "avalanche/avalanche.h"
+#include "avalanche/mainmenu.h"
+
+namespace Avalanche {
+
+MainMenu::MainMenu(AvalancheEngine *vm) {
+ _vm = vm;
+
+ _registrant = Common::String("");
+}
+
+void MainMenu::run() {
+ CursorMan.showMouse(false);
+ _vm->_graphics->menuInitialize();
+ _vm->_graphics->menuLoadPictures();
+ loadRegiInfo();
+ loadFont();
+
+ option(1, "Play the game.");
+ option(2, "Read the background.");
+ option(3, "Preview... perhaps...");
+ option(4, "View the documentation.");
+ option(5, "Registration info.");
+ option(6, "Exit back to DOS.");
+ centre(274, _registrant);
+ centre(301, "Make your choice, or wait for the demo.");
+
+ _vm->_graphics->menuRefreshScreen();
+
+ wait();
+}
+
+void MainMenu::loadFont() {
+ Common::File file;
+ if (!file.open("avalot.fnt"))
+ error("AVALANCHE: Scrolls: File not found: avalot.fnt");
+ for (int16 i = 0; i < 256; i++)
+ file.read(_font[i], 16);
+ file.close();
+}
+
+void MainMenu::loadRegiInfo() {
+ _registrant = "(Unregistered evaluation copy.)";
+ warning("STUB: MainMenu::loadRegiInfo()");
+}
+
+void MainMenu::option(byte which, Common::String what) {
+ _vm->_graphics->menuDrawBigText(_font, 127, 39 + which * 33, Common::String(which + 48) + ')', kColorBlack);
+ _vm->_graphics->menuDrawBigText(_font, 191, 39 + which * 33, what, kColorBlack);
+}
+
+void MainMenu::centre(int16 y, Common::String text) {
+ _vm->_graphics->menuDrawBigText(_font, 320 - text.size() * 8, y, text, kColorLightgray);
+}
+
+void MainMenu::wait() {
+ int x = 0;
+ while (!_vm->shouldQuit()) {
+ _vm->_graphics->menuDrawIndicator(x);
+ _vm->_system->delayMillis(40);
+ x++;
+ if (x == 641)
+ x = 0;
+ Common::Event event;
+ _vm->getEvent(event);
+ if (event.type == Common::EVENT_KEYDOWN) {
+ switch (event.kbd.keycode) {
+ case Common::KEYCODE_SPACE:
+ case Common::KEYCODE_RETURN:
+ case Common::KEYCODE_1: // Falltroughs are inteded.
+ // Play the game
+ _vm->_graphics->menuFree();
+ _vm->_graphics->menuRestoreScreen();
+ CursorMan.showMouse(true);
+ return;
+ case Common::KEYCODE_ESCAPE:
+ case Common::KEYCODE_6: // Falltroughs are inteded.
+ // Exit back to DOS
+ _vm->_letMeOut = true;
+ _vm->_graphics->menuFree();
+ return;
+ default:
+ break;
+ }
+ }
+ }
+}
+
+} // End of namespace Avalanche
diff --git a/engines/avalanche/mainmenu.h b/engines/avalanche/mainmenu.h
new file mode 100644
index 0000000000..e973e0ccf3
--- /dev/null
+++ b/engines/avalanche/mainmenu.h
@@ -0,0 +1,55 @@
+/* ScummVM - Graphic Adventure Engine
+*
+* ScummVM is the legal property of its developers, whose names
+* are too numerous to list here. Please refer to the COPYRIGHT
+* file distributed with this source distribution.
+*
+* This program is free software; you can redistribute it and/or
+* modify it under the terms of the GNU General Public License
+* as published by the Free Software Foundation; either version 2
+* of the License, or (at your option) any later version.
+*
+* This program is distributed in the hope that it will be useful,
+* but WITHOUT ANY WARRANTY; without even the implied warranty of
+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+* GNU General Public License for more details.
+*
+* You should have received a copy of the GNU General Public License
+* along with this program; if not, write to the Free Software
+* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+*
+*/
+
+/*
+* This code is based on the original source code of Lord Avalot d'Argent version 1.3.
+* Copyright (c) 1994-1995 Mike, Mark and Thomas Thurman.
+*/
+
+#ifndef AVALANCHE_MAINMENU_H
+#define AVALANCHE_MAINMENU_H
+
+namespace Avalanche {
+class AvalancheEngine;
+
+class MainMenu {
+public:
+ MainMenu(AvalancheEngine *vm);
+
+ void run();
+
+private:
+ AvalancheEngine *_vm;
+
+ Common::String _registrant;
+ FontType _font;
+
+ void loadFont();
+ void loadRegiInfo();
+ void option(byte which, Common::String what);
+ void centre(int16 y, Common::String text);
+ void wait();
+};
+
+} // End of namespace Avalanche
+
+#endif // AVALANCHE_MAINMENU_H
diff --git a/engines/avalanche/module.mk b/engines/avalanche/module.mk
index 9c1205df02..919ff0334f 100644
--- a/engines/avalanche/module.mk
+++ b/engines/avalanche/module.mk
@@ -9,14 +9,20 @@ MODULE_OBJS = \
console.o \
detection.o \
graphics.o \
- menu.o \
+ dropdown.o \
parser.o \
- pingo.o \
dialogs.o \
sequence.o \
sound.o \
- timer.o
-
+ timer.o \
+ nim.o \
+ clock.o \
+ ghostroom.o \
+ help.o \
+ shootemup.o \
+ mainmenu.o \
+ highscore.o
+
# This module can be built as a plugin
ifeq ($(ENABLE_AVALANCHE), DYNAMIC_PLUGIN)
PLUGIN := 1
diff --git a/engines/avalanche/nim.cpp b/engines/avalanche/nim.cpp
new file mode 100644
index 0000000000..79be16d3c3
--- /dev/null
+++ b/engines/avalanche/nim.cpp
@@ -0,0 +1,575 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public 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 the original source code of Lord Avalot d'Argent version 1.3.
+ * Copyright (c) 1994-1995 Mike, Mark and Thomas Thurman.
+ */
+
+#include "avalanche/avalanche.h"
+#include "avalanche/nim.h"
+
+namespace Avalanche {
+
+const char * const Nim::kNames[2] = {"Avalot", "Dogfood"};
+
+Nim::Nim(AvalancheEngine *vm) {
+ _vm = vm;
+
+ resetVariables();
+}
+
+void Nim::resetVariables() {
+ _playedNim = 0;
+ _turns = 0;
+ _dogfoodsTurn = false;
+ _stonesLeft = 0;
+ _clicked = false;
+ _row = 0;
+ _number = 0;
+ _squeak = false;
+ _lmo = false;
+
+ for (int i = 0; i < 3; i++) {
+ _old[i] = 0;
+ _stones[i] = 0;
+ _inAp[i] = 0;
+ _r[i] = 0;
+ }
+}
+
+void Nim::synchronize(Common::Serializer &sz) {
+ if (sz.isLoading() && sz.getVersion() < 2)
+ return;
+
+ sz.syncAsByte(_playedNim);
+}
+
+void Nim::playNim() {
+ if (_vm->_wonNim) { // Already won the game.
+ _vm->_dialogs->displayScrollChain('Q', 6);
+ return;
+ }
+
+ if (!_vm->_askedDogfoodAboutNim) {
+ _vm->_dialogs->displayScrollChain('Q', 84);
+ return;
+ }
+
+ _vm->_dialogs->displayScrollChain('Q', 3);
+ _playedNim++;
+
+ _vm->_graphics->saveScreen();
+ _vm->fadeOut();
+
+ CursorMan.showMouse(false);
+ setup();
+ board();
+ //CursorMan.showMouse(true);
+
+ do {
+
+ startMove();
+ if (_dogfoodsTurn)
+ dogFood();
+ else {
+ CursorMan.showMouse(true);
+ takeSome();
+ CursorMan.showMouse(false);
+ }
+ _stones[_row] -= _number;
+ showChanges();
+ } while (_stonesLeft != 0);
+
+ endOfGame(); // Winning sequence is A1, B3, B1, C1, C1, btw.
+
+ _vm->fadeOut();
+ _vm->_graphics->restoreScreen();
+ _vm->_graphics->removeBackup();
+ _vm->fadeIn();
+ CursorMan.showMouse(true);
+
+ if (_dogfoodsTurn) {
+ // Dogfood won - as usual.
+ if (_playedNim == 1) // Your first game.
+ _vm->_dialogs->displayScrollChain('Q', 4); // Goody! Play me again?
+ else
+ _vm->_dialogs->displayScrollChain('Q', 5); // Oh, look at that! I've won again!
+ _vm->decreaseMoney(4); // And you've just lost 4d!
+ } else {
+ // You won - strange!
+ _vm->_dialogs->displayScrollChain('Q', 7);
+ _vm->_objects[kObjectLute - 1] = true;
+ _vm->refreshObjectList();
+ _vm->_wonNim = true;
+ _vm->_background->draw(-1, -1, 0); // Show the settle with no lute on it.
+
+ // 7 points for winning!
+ _vm->incScore(7);
+ }
+
+ if (_playedNim == 1) {
+ // 3 points for playing your 1st game.
+ _vm->incScore(3);
+ }
+}
+
+void Nim::chalk(int x, int y, Common::String text) {
+ const Color greys[] = { kColorBlack, kColorDarkgray, kColorLightgray, kColorWhite };
+
+ for (int i = 0; i < 4; i++) {
+ _vm->_graphics->drawNormalText(text, _vm->_font, 8, x - i, y, greys[i]);
+ _vm->_graphics->refreshScreen();
+ int freq = i * 100 * text.size();
+ if (freq == 0)
+ _vm->_system->delayMillis(3);
+ else
+ _vm->_sound->playNote(freq, 3);
+ _vm->_system->delayMillis(30);
+ }
+}
+
+void Nim::setup() {
+ _vm->fadeIn();
+ _vm->_graphics->nimLoad();
+
+ _vm->_graphics->blackOutScreen();
+ // Upper left rectangle.
+ _vm->_graphics->drawRectangle(Common::Rect(10, 5, 381, 71), kColorRed);
+ _vm->_graphics->drawFilledRectangle(Common::Rect(11, 6, 380, 70), kColorBrown);
+ // Bottom right rectangle.
+ _vm->_graphics->drawRectangle(Common::Rect(394, 50, 635, 198), kColorRed);
+ _vm->_graphics->drawFilledRectangle(Common::Rect(395, 51, 634, 197), kColorBrown);
+
+ _vm->_graphics->nimDrawLogo();
+ _vm->_graphics->nimDrawInitials();
+
+ _vm->_graphics->drawNormalText("SCOREBOARD:", _vm->_font, 8, 475, 45, kColorWhite);
+ _vm->_graphics->drawNormalText("Turn:", _vm->_font, 8, 420, 55, kColorYellow);
+ _vm->_graphics->drawNormalText("Player:", _vm->_font, 8, 490, 55, kColorYellow);
+ _vm->_graphics->drawNormalText("Move:", _vm->_font, 8, 570, 55, kColorYellow);
+
+ chalk(27, 7, "Take pieces away with:");
+ chalk(77, 17, "1) the mouse (click leftmost)");
+ chalk(53, 27, "or 2) the keyboard:");
+ chalk(220, 27, Common::String(24) + '/' + 25 + ": choose row,");
+ chalk(164, 37, Common::String("+/- or ") + 27 + '/' + 26 + ": more/fewer,");
+ chalk(204, 47, "Enter: take stones.");
+
+ _vm->_graphics->refreshScreen();
+
+ for (int i = 0; i < 3; i++)
+ _stones[i] = i + 3;
+ _stonesLeft = 12;
+
+ _turns = 0;
+ _dogfoodsTurn = true;
+
+ _row = 0;
+ _number = 1;
+ for (int i = 0; i < 3; i++)
+ _old[i] = 0;
+}
+
+void Nim::board() {
+ _vm->_graphics->drawFilledRectangle(Common::Rect(57, 72, 393, 200), kColorBlack);
+ for (int i = 0; i < 3; i++)
+ for (int j = 0; j < _stones[i]; j++)
+ _vm->_graphics->nimDrawStone(64 + j * 8 * 8, 75 + i * 35);
+ // It's practically the body of the Pascal function "plotstone()", reimplemented.
+ // It's the only place where we use it, so there's no reason to keep it separated as a function.
+ _vm->_graphics->refreshScreen();
+}
+
+void Nim::startMove() {
+ _turns++;
+ Common::String turnsStr = Common::String::format("%d", _turns);
+ int y = 55 + _turns * 10;
+ _dogfoodsTurn = !_dogfoodsTurn;
+ chalk(433, y, turnsStr);
+ chalk(493, y, kNames[_dogfoodsTurn]);
+ for (int i = 0; i < 3; i++)
+ _old[i] = _stones[i];
+}
+
+void Nim::showChanges() {
+ chalk(573, 55 + _turns * 10, Common::String('A' + _row) + Common::String('0' + _number));
+ board();
+ _stonesLeft -= _number;
+}
+
+void Nim::blip() {
+ _vm->_sound->playNote(1771, 3);
+}
+
+void Nim::findNextUp() {
+ while (_stones[_row] == 0) {
+ _row--;
+ if (_row < 0)
+ _row = 2;
+ }
+
+ if (_number > _stones[_row])
+ _number = _stones[_row];
+}
+
+void Nim::findNextDown() {
+ while (_stones[_row] == 0) {
+ _row++;
+ if (_row > 2)
+ _row = 0;
+ }
+
+ if (_number > _stones[_row])
+ _number = _stones[_row];
+}
+
+bool Nim::checkInput() {
+ while (!_vm->shouldQuit()) {
+ _vm->_graphics->refreshScreen();
+ Common::Event event;
+ while (_vm->getEvent(event)) {
+ if (event.type == Common::EVENT_LBUTTONUP) {
+ Common::Point cursorPos = _vm->getMousePos();
+
+ int8 newRow = (cursorPos.y / 2 - 38) / 35 - 1;
+ if ((newRow < 0) || (newRow > 2)) {
+ blip();
+ return false;
+ }
+
+ int8 newNum = _stones[newRow] - ((cursorPos.x - 64) / 64);
+ if ((newNum < 1) || (newNum > _stones[newRow])) {
+ blip();
+ return false;
+ }
+
+ _number = newNum;
+ _row = newRow;
+
+ return true;
+ } else if (event.type == Common::EVENT_KEYDOWN) {
+ switch (event.kbd.keycode) {
+ case Common::KEYCODE_LEFT:
+ case Common::KEYCODE_KP_PLUS:
+ if (_stones[_row] > _number)
+ _number++;
+ return false;
+ case Common::KEYCODE_RIGHT:
+ case Common::KEYCODE_KP_MINUS:
+ if (_number > 1)
+ _number--;
+ return false;
+ case Common::KEYCODE_1:
+ _number = 1;
+ return false;
+ case Common::KEYCODE_2:
+ if (_stones[_row] >= 2)
+ _number = 2;
+ return false;
+ case Common::KEYCODE_3:
+ if (_stones[_row] >= 3)
+ _number = 3;
+ else
+ _number = _stones[_row];
+ return false;
+ case Common::KEYCODE_4:
+ if (_stones[_row] >= 4)
+ _number = 4;
+ else
+ _number = _stones[_row];
+ return false;
+ case Common::KEYCODE_5:
+ if (_stones[_row] == 5)
+ _number = 5;
+ else
+ _number = _stones[_row];
+ return false;
+ case Common::KEYCODE_HOME:
+ _number = _stones[_row];
+ return false;
+ case Common::KEYCODE_END:
+ _number = 1;
+ return false;
+ case Common::KEYCODE_UP:
+ _row--;
+ if (_row < 0)
+ _row = 2;
+ findNextUp();
+ return false;
+ case Common::KEYCODE_DOWN:
+ _row++;
+ if (_row > 2)
+ _row = 0;
+ findNextDown();
+ return false;
+ case Common::KEYCODE_a:
+ if (_stones[0] != 0) {
+ _row = 0;
+ if (_number > _stones[_row])
+ _number = _stones[_row];
+ }
+ return false;
+ case Common::KEYCODE_b:
+ if (_stones[1] != 0) {
+ _row = 1;
+ if (_number > _stones[_row])
+ _number = _stones[_row];
+ }
+ return false;
+ case Common::KEYCODE_c:
+ if (_stones[2] != 0) {
+ _row = 2;
+ if (_number > _stones[_row])
+ _number = _stones[_row];
+ }
+ return false;
+ case Common::KEYCODE_PAGEUP:
+ _row = 0;
+ findNextDown();
+ return false;
+ case Common::KEYCODE_PAGEDOWN:
+ _row = 2;
+ findNextUp();
+ return false;
+ case Common::KEYCODE_RETURN:
+ return true;
+ default:
+ break;
+ }
+ }
+ }
+ }
+ return false;
+}
+
+void Nim::takeSome() {
+ _number = 1;
+
+ do {
+ byte sr;
+ do {
+ sr = _stones[_row];
+ if (sr == 0) {
+ if (_row == 2)
+ _row = 0;
+ else
+ _row++;
+ _number = 1;
+ }
+ } while (sr == 0);
+
+ if (_number > sr)
+ _number = sr;
+
+ int x1 = 63 + (_stones[_row] - _number) * 64;
+ int y1 = 38 + 35 * (_row + 1);
+ int x2 = 55 + _stones[_row] * 64;
+ int y2 = 64 + 35 * (_row + 1);
+ _vm->_graphics->drawRectangle(Common::Rect(x1, y1, x2, y2), kColorBlue); // Draw the selection rectangle.
+ _vm->_graphics->refreshScreen();
+
+ bool confirm = false;
+ do {
+ confirm = checkInput();
+
+ if (!confirm) {
+ _vm->_graphics->drawRectangle(Common::Rect(x1, y1, x2, y2), kColorBlack); // Erase the previous selection.
+ x1 = 63 + (_stones[_row] - _number) * 64;
+ y1 = 38 + 35 * (_row + 1);
+ x2 = 55 + _stones[_row] * 64;
+ y2 = 64 + 35 * (_row + 1);
+ _vm->_graphics->drawRectangle(Common::Rect(x1, y1, x2, y2), kColorBlue); // Draw the new one.
+ _vm->_graphics->refreshScreen();
+ }
+ } while (!confirm);
+
+ return;
+
+ } while (true);
+}
+
+void Nim::endOfGame() {
+ chalk(595, 55 + _turns * 10, "Wins!");
+ _vm->_graphics->drawNormalText("- - - Press any key... - - -", _vm->_font, 8, 100, 190, kColorWhite);
+
+ Common::Event event;
+ bool escape = false;
+ while (!_vm->shouldQuit() && !escape) {
+ _vm->_graphics->refreshScreen();
+ while (_vm->getEvent(event)) {
+ if ((event.type == Common::EVENT_LBUTTONUP) || (event.type == Common::EVENT_KEYDOWN)) {
+ escape = true;
+ break;
+ }
+ }
+ }
+
+ _vm->_graphics->nimFree();
+}
+
+bool Nim::find(byte x) {
+ bool ret = false;
+ for (int i = 0; i < 3; i++) {
+ if (_stones[i] == x) {
+ ret = true;
+ _inAp[i] = true;
+ }
+ }
+ return ret;
+}
+
+void Nim::findAp(byte start, byte stepSize) {
+ byte thisOne = 0;
+ byte matches = 0;
+
+ for (int i = 0; i < 3; i++)
+ _inAp[i] = 0; // Blank 'em all!
+
+ for (int i = 0; i < 3; i++) {
+ if (find(start + i * stepSize))
+ matches++;
+ else
+ thisOne = i;
+ }
+
+ // Now... Matches must be 0, 1, 2, or 3.
+ // 0 / 1 mean there are no A.P.s here, so we'll keep looking,
+ // 2 means there is a potential A.P.that we can create (ideal!), and
+ // 3 means that we're already in an A.P. (Trouble!)
+
+ byte ooo = 0; // Odd one out.
+
+ switch (matches) {
+ case 2:
+ for (int i = 0; i < 3; i++) { // Find which one didn't fit the A.P.
+ if (!_inAp[i])
+ ooo = i;
+ }
+
+ if (_stones[ooo] > (start + thisOne * stepSize)) { // Check if it's possible!
+ // Create an A.P.
+ _row = ooo; // Already calculated.
+ // Start + thisone * stepsize will give the amount we SHOULD have here.
+ _number = _stones[_row] - (start + thisOne * stepSize);
+ _lmo = true;
+ return;
+ }
+ break;
+ case 3: // We're actually IN an A.P! Trouble! Oooh dear.
+ // Take 1 from the largest pile.
+ _row = _r[2];
+ _number = 1;
+ _lmo = true;
+ return;
+ default:
+ break;
+ }
+}
+
+void Nim::dogFood() {
+ _lmo = false;
+ byte live = 0;
+ byte sr[3];
+
+ for (int i = 0; i < 3; i++) {
+ if (_stones[i] > 0) {
+ _r[live] = i;
+ sr[live] = _stones[i];
+ live++;
+ }
+ }
+
+ switch (live) {
+ case 1: // Only one is free - so take 'em all!
+ _row = _r[0];
+ _number = _stones[_r[0]];
+ return;
+ case 2: // Two are free - make them equal!
+ if (sr[0] > sr[1]) { // T > b
+ _row = _r[0];
+ _number = sr[0] - sr[1];
+ }
+ else if (sr[0] < sr[1]) { // B > t
+ _row = _r[1];
+ _number = sr[1] - sr[0];
+ }
+ else { // B = t... oh no, we've lost!
+ _row = _r[0];
+ _number = 1;
+ }
+ return;
+ case 3: {
+ // Ho hum... this'll be difficult!
+ // There are three possible courses of action when we have 3 lines left:
+ // 1) Look for 2 equal lines, then take the odd one out.
+ // 2) Look for A.P.s, and capitalise on them.
+ // 3) Go any old where.
+ const byte other[3][2] = { { 2, 3 }, { 1, 3 }, { 1, 2 } };
+
+ for (int i = 0; i < 3; i++) { // Look for 2 equal lines.
+ if (_stones[other[i][0]] == _stones[other[i][1]]) {
+ _row = i; // This row.
+ _number = _stones[i]; // All of 'em.
+ return;
+ }
+ }
+
+ bool sorted;
+ do {
+ sorted = true;
+ for (int i = 0; i < 2; i++) {
+ if (sr[i] > sr[i + 1]) {
+ byte temp = sr[i + 1];
+ sr[i + 1] = sr[i];
+ sr[i] = temp;
+
+ temp = _r[i + 1];
+ _r[i + 1] = _r[i];
+ _r[i] = temp;
+
+ sorted = false;
+ }
+ }
+ } while (!sorted);
+
+ // Now we look for A.P.s...
+ for (int i = 1; i <= 3; i++) {
+ findAp(i, 1); // There are 3 "1"s.
+ if (_lmo)
+ return; // Cut - out.
+ }
+ findAp(1, 2); // Only "2" possible.
+ if (_lmo)
+ return;
+
+ // A.P.search must have failed - use the default move.
+ _row = _r[2];
+ _number = 1;
+ return;
+ }
+ default:
+ break;
+ }
+}
+
+} // End of namespace Avalanche
diff --git a/engines/avalanche/nim.h b/engines/avalanche/nim.h
new file mode 100644
index 0000000000..3c2f0455cf
--- /dev/null
+++ b/engines/avalanche/nim.h
@@ -0,0 +1,79 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public 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 the original source code of Lord Avalot d'Argent version 1.3.
+ * Copyright (c) 1994-1995 Mike, Mark and Thomas Thurman.
+ */
+
+#ifndef AVALANCHE_NIM_H
+#define AVALANCHE_NIM_H
+
+namespace Avalanche {
+
+class Nim {
+public:
+ Nim(AvalancheEngine *vm);
+ void resetVariables();
+ void synchronize(Common::Serializer &sz);
+ void playNim();
+
+private:
+ AvalancheEngine *_vm;
+
+ static const char * const kNames[2];
+
+ byte _old[3];
+ byte _stones[3];
+ byte _turns;
+ bool _dogfoodsTurn;
+ byte _stonesLeft;
+ bool _clicked;
+ int8 _row;
+ byte _number;
+ bool _squeak;
+ byte _playedNim; // How many times you've played Nim.
+
+ // Inner variables for dogFood(), find() and findAp().
+ bool _inAp[3];
+ bool _lmo; // Let Me Out!
+ byte _r[3];
+
+ void chalk(int x, int y, Common::String text);
+ void setup();
+ void board();
+ void startMove();
+ void showChanges();
+ void blip();
+ void findNextUp(); // Inner function for checkInput().
+ void findNextDown(); // Same as above.
+ bool checkInput(); // It returns TRUE if the player confirmed his selection of stones either by pressing RETURN or by clicking on a stone.
+ void takeSome();
+ void endOfGame();
+ bool find(byte x); // This gives TRUE if there's a pile with x stones in.
+ void findAp(byte start, byte stepSize);
+ void dogFood(); // AI procedure to play the game.
+};
+
+} // End of namespace Avalanche
+
+#endif // AVALANCHE_NIM_H
diff --git a/engines/avalanche/parser.cpp b/engines/avalanche/parser.cpp
index fc176c78b0..220186ca5e 100644
--- a/engines/avalanche/parser.cpp
+++ b/engines/avalanche/parser.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope 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.
@@ -27,6 +27,7 @@
#include "avalanche/avalanche.h"
#include "avalanche/parser.h"
+#include "avalanche/nim.h"
#include "gui/saveload.h"
@@ -37,6 +38,21 @@ const char *Parser::kVersionNum = "1.30";
Parser::Parser(AvalancheEngine *vm) {
_vm = vm;
+
+ _verb = kVerbCodePardon;
+ _thing = kPardon;
+ _person = kPeopleNone;
+ _polite = false;
+ _inputTextPos = 0;
+ _quote = false;
+ _cursorState = false;
+ _weirdWord = false;
+ _wearing = kNothing;
+ _thing2 = 0;
+ _sworeNum = 0;
+ _alcoholLevel = 0;
+
+ _boughtOnion = false;
}
void Parser::init() {
@@ -365,8 +381,8 @@ void Parser::init() {
void Parser::handleInputText(const Common::Event &event) {
byte inChar = event.kbd.ascii;
warning("STUB: Parser::handleInputText()");
-// if (_vm->_menu->_activeMenuItem._activeNow) {
-// _vm->_menu->parseKey(inChar, _vm->_enhanced->extd);
+// if (_vm->_dropdown->_activeMenuItem._activeNow) {
+// _vm->_dropdown->parseKey(inChar, _vm->_enhanced->extd);
// } else {
if (_inputText.size() < 76) {
if ((inChar == '"') || (inChar == '`')) {
@@ -386,7 +402,7 @@ void Parser::handleInputText(const Common::Event &event) {
}
void Parser::handleBackspace() {
- if (_vm->_menu->_activeMenuItem._activeNow)
+ if (_vm->_dropdown->_activeMenuItem._activeNow)
return;
if (_inputTextPos > 0) {
@@ -400,7 +416,7 @@ void Parser::handleBackspace() {
}
void Parser::handleReturn() {
- if (_vm->_menu->_activeMenuItem._activeNow)
+ if (_vm->_dropdown->_activeMenuItem._activeNow)
tryDropdown();
else if (!_inputText.empty()) {
_inputTextBackup = _inputText;
@@ -452,7 +468,7 @@ void Parser::handleFunctionKey(const Common::Event &event) {
break;
case Common::KEYCODE_F7:
if (event.kbd.flags & Common::KBD_CTRL)
- _vm->majorRedraw();
+ _vm->_graphics->refreshScreen();
else
_vm->callVerb(kVerbCodeOpen);
break;
@@ -506,10 +522,17 @@ void Parser::cursorOff() {
_cursorState = false;
}
+/**
+ * Asks the parsekey proc in Dropdown if it knows it.
+ */
void Parser::tryDropdown() {
- warning("STUB: Parser::tryDropdown()"); // TODO: Implement at the same time with Dropdown's keyboard handling.
+ // TODO: Implement at the same time with Dropdown's keyboard handling.
+ warning("STUB: Parser::tryDropdown()");
}
+/**
+ * Returns the index of the first appearance of crit in src.
+ */
int16 Parser::getPos(const Common::String &crit, const Common::String &src) {
if (src.contains(crit))
return strstr(src.c_str(),crit.c_str()) - src.c_str();
@@ -579,7 +602,7 @@ Common::String Parser::rank() {
};
for (int i = 0; i < 8; i++) {
- if ((_vm->_dnascore >= ranks[i]._score) && (_vm->_dnascore < ranks[i + 1]._score))
+ if ((_vm->_score >= ranks[i]._score) && (_vm->_score < ranks[i + 1]._score))
return Common::String(ranks[i]._title);
}
return "";
@@ -588,8 +611,12 @@ Common::String Parser::rank() {
Common::String Parser::totalTime() {
uint16 h, m, s;
- h = (uint16)(_vm->_totalTime / 65535);
- s = (uint16)(_vm->_totalTime % 65535);
+ uint32 curTime = _vm->getTimeInSeconds() - _vm->_startTime;
+ if (_vm->_isLoaded)
+ curTime += _vm->_totalTime;
+
+ h = (uint16)(curTime / 3600);
+ s = (uint16)(curTime % 3600);
m = s / 60;
s = s % 60;
@@ -605,6 +632,9 @@ void Parser::cheatParse(Common::String codes) {
warning("STUB: Parser::cheatParse()");
}
+/**
+ * Strips punctuation from word.
+ */
void Parser::stripPunctuation(Common::String &word) {
const char punct[] = "~`!@#$%^&*()_+-={}[]:\"|;'\\,./<>?";
@@ -692,13 +722,13 @@ void Parser::storeInterrogation(byte interrogation) {
case 1:
_inputText.toLowercase();
_vm->_dialogs->sayIt(_inputText);
- _vm->_favouriteDrink = _inputText;
+ _vm->_favoriteDrink = _inputText;
_vm->_cardiffQuestionNum = 2;
break;
case 2:
properNouns();
_vm->_dialogs->sayIt(_inputText);
- _vm->_favouriteSong = _inputText;
+ _vm->_favoriteSong = _inputText;
_vm->_cardiffQuestionNum = 3;
break;
case 3:
@@ -713,7 +743,7 @@ void Parser::storeInterrogation(byte interrogation) {
if (!_vm->_spareEvening.empty())
_vm->_spareEvening.clear();
_vm->_spareEvening = _inputText;
- _vm->_dialogs->displayScrollChain('z', 5); // His closing statement...
+ _vm->_dialogs->displayScrollChain('Z', 5); // His closing statement...
_vm->_animation->_sprites[1]->walkTo(3); // The end of the drawbridge
_vm->_animation->_sprites[1]->_vanishIfStill = true; // Then go away!
_vm->_magics[1]._operation = kMagicNothing;
@@ -729,8 +759,6 @@ void Parser::storeInterrogation(byte interrogation) {
_vm->_timer->cardiffSurvey();
}
-
-
void Parser::parse() {
// First parsing - word identification
if (!_thats.empty())
@@ -743,7 +771,6 @@ void Parser::parse() {
_person = kPeoplePardon;
clearWords();
-
// A cheat mode attempt.
if (_inputText[0] == '.') {
cheatParse(_inputText);
@@ -906,7 +933,7 @@ void Parser::parse() {
_polite = true;
}
- if ((!unkString.empty()) && (_verb != kVerbCodeExam) && (_verb != kVerbCodeTalk) &&
+ if ((!unkString.empty()) && (_verb != kVerbCodeExam) && (_verb != kVerbCodeTalk) &&
(_verb != kVerbCodeSave) && (_verb != kVerbCodeLoad) && (_verb != kVerbCodeDir)) {
Common::String tmpStr = Common::String::format("Sorry, but I have no idea what \"%s\" means. Can you rephrase it?", unkString.c_str());
_vm->_dialogs->displayText(tmpStr);
@@ -928,6 +955,9 @@ void Parser::parse() {
}
}
+/**
+ * Examine a standard object-thing
+ */
void Parser::examineObject() {
if (_thing != _vm->_thinks)
_vm->thinkAbout(_thing, AvalancheEngine::kThing);
@@ -937,29 +967,29 @@ void Parser::examineObject() {
switch (_vm->_wineState) {
case 1:
// Normal examine wine scroll
- _vm->_dialogs->displayScrollChain('t', 1);
+ _vm->_dialogs->displayScrollChain('T', 1);
break;
case 2:
// Bad wine
- _vm->_dialogs->displayScrollChain('d', 6);
+ _vm->_dialogs->displayScrollChain('D', 6);
break;
case 3:
// Vinegar
- _vm->_dialogs->displayScrollChain('d', 7);
+ _vm->_dialogs->displayScrollChain('D', 7);
break;
}
break;
case kObjectOnion:
if (_vm->_rottenOnion)
// Yucky onion
- _vm->_dialogs->displayScrollChain('q', 21);
+ _vm->_dialogs->displayScrollChain('Q', 21);
else
// Normal onion
- _vm->_dialogs->displayScrollChain('t', 18);
+ _vm->_dialogs->displayScrollChain('T', 18);
break;
default:
// Ordinarily
- _vm->_dialogs->displayScrollChain('t', _thing);
+ _vm->_dialogs->displayScrollChain('T', _thing);
}
}
@@ -992,7 +1022,7 @@ void Parser::exampers() {
// He's asleep.
_vm->_dialogs->displayScrollChain('Q', 65);
else
- _vm->_dialogs->displayScrollChain('p', newPerson);
+ _vm->_dialogs->displayScrollChain('P', newPerson);
if ((_person == kPeopleAyles) && !_vm->_aylesIsAwake)
_vm->_dialogs->displayScrollChain('Q', 13);
@@ -1010,15 +1040,20 @@ bool Parser::isHolding() {
// Also object
if ((51 <= _thing) && (_thing <= 99))
return true;
+ if (_thing == 0)
+ return false;
bool holdingResult = false;
- if (_thing > 100)
+ if (_thing >= 100)
_vm->_dialogs->displayText("Be reasonable!");
- else if (!_vm->_objects[_thing - 1])
- // Verbs that need "_thing" to be in the inventory.
- _vm->_dialogs->displayText("You're not holding it, Avvy.");
- else
+ else if (_thing <= kObjectNum) {
+ if (!_vm->_objects[_thing - 1])
+ // Verbs that need "_thing" to be in the inventory.
+ _vm->_dialogs->displayText("You're not holding it, Avvy.");
+ else
+ holdingResult = true;
+ } else
holdingResult = true;
return holdingResult;
@@ -1053,8 +1088,10 @@ void Parser::examine() {
examineObject();
else if ((50 <= _thing) && (_thing <= 100)) {
// Also _thing
+ int id = _thing - 50;
+ assert(id < 31);
openBox(true);
- _vm->_dialogs->displayText(*_vm->_also[_thing - 50][1]);
+ _vm->_dialogs->displayText(*_vm->_also[id][1]);
openBox(false);
}
}
@@ -1107,7 +1144,7 @@ void Parser::swallow() {
return;
}
_vm->_dialogs->displayScrollChain('U', 1);
- _vm->_pingo->wobble();
+ _vm->_animation->wobble();
_vm->_dialogs->displayScrollChain('U', 2);
_vm->_objects[kObjectWine - 1] = false;
_vm->refreshObjectList();
@@ -1116,7 +1153,7 @@ void Parser::swallow() {
case 2:
case 3:
// You can't drink it!
- _vm->_dialogs->displayScrollChain('d', 8);
+ _vm->_dialogs->displayScrollChain('D', 8);
break;
}
break;
@@ -1153,6 +1190,9 @@ void Parser::swallow() {
}
}
+/**
+ * this lists the other people in the room.
+ */
void Parser::peopleInRoom() {
// First compute the number of people in the room.
byte numPeople = 0;
@@ -1190,42 +1230,45 @@ void Parser::peopleInRoom() {
_vm->_dialogs->displayText(tmpStr + " here.");
}
+/**
+ * This is called when you say "look".
+ */
void Parser::lookAround() {
_vm->_dialogs->displayText(*_vm->_also[0][1]);
switch (_vm->_room) {
case kRoomSpludwicks:
if (_vm->_avariciusTalk > 0)
- _vm->_dialogs->displayScrollChain('q', 23);
+ _vm->_dialogs->displayScrollChain('Q', 23);
else
peopleInRoom();
break;
case kRoomRobins:
if (_vm->_tiedUp)
- _vm->_dialogs->displayScrollChain('q', 38);
+ _vm->_dialogs->displayScrollChain('Q', 38);
if (_vm->_mushroomGrowing)
- _vm->_dialogs->displayScrollChain('q', 55);
+ _vm->_dialogs->displayScrollChain('Q', 55);
break;
case kRoomInsideCardiffCastle:
if (!_vm->_takenPen)
- _vm->_dialogs->displayScrollChain('q', 49);
+ _vm->_dialogs->displayScrollChain('Q', 49);
break;
case kRoomLustiesRoom:
if (_vm->_lustieIsAsleep)
- _vm->_dialogs->displayScrollChain('q', 65);
+ _vm->_dialogs->displayScrollChain('Q', 65);
break;
case kRoomCatacombs:
switch (_vm->_catacombY * 256 + _vm->_catacombX) {
case 258 :
// Inside art gallery.
- _vm->_dialogs->displayScrollChain('q', 80);
+ _vm->_dialogs->displayScrollChain('Q', 80);
break;
case 514 :
// Outside ditto.
- _vm->_dialogs->displayScrollChain('q', 81);
+ _vm->_dialogs->displayScrollChain('Q', 81);
break;
case 260 :
// Outside Geida's room.
- _vm->_dialogs->displayScrollChain('q', 82);
+ _vm->_dialogs->displayScrollChain('Q', 82);
break;
}
break;
@@ -1248,7 +1291,7 @@ void Parser::openDoor() {
break;
case kRoomSpludwicks:
if (_thing == 61) {
- _vm->_dialogs->displayScrollChain('q', 85);
+ _vm->_dialogs->displayScrollChain('Q', 85);
return;
}
break;
@@ -1266,7 +1309,7 @@ void Parser::openDoor() {
switch (portal->_operation) {
case kMagicExclaim:
_vm->_animation->_sprites[0]->bounce();
- _vm->_dialogs->displayScrollChain('x', portal->_data);
+ _vm->_dialogs->displayScrollChain('X', portal->_data);
break;
case kMagicTransport:
_vm->flipRoom((Room)((portal->_data) >> 8), portal->_data & 0x0F);
@@ -1294,6 +1337,9 @@ void Parser::openDoor() {
_vm->_dialogs->displayText("Door? What door?");
}
+/**
+ * Called when you call kVerbCodeput.
+ */
void Parser::putProc() {
if (!isHolding())
return;
@@ -1322,7 +1368,7 @@ void Parser::putProc() {
// Put onion into vinegar! Yes!
_vm->_onionInVinegar = true;
_vm->incScore(7);
- _vm->_dialogs->displayScrollChain('u', 9);
+ _vm->_dialogs->displayScrollChain('U', 9);
}
}
} else
@@ -1400,6 +1446,7 @@ void Parser::goToCauldron() {
/**
* Check is it's possible to give something to Spludwick
+ * The result of this function is whether or not he says "Hey, thanks!".
* @remarks Originally called 'give2spludwick'
*/
bool Parser::giveToSpludwick() {
@@ -1412,10 +1459,10 @@ bool Parser::giveToSpludwick() {
case kObjectOnion:
_vm->_objects[kObjectOnion - 1] = false;
if (_vm->_rottenOnion)
- _vm->_dialogs->displayScrollChain('q', 22);
+ _vm->_dialogs->displayScrollChain('Q', 22);
else {
_vm->_givenToSpludwick++;
- _vm->_dialogs->displayScrollChain('q', 20);
+ _vm->_dialogs->displayScrollChain('Q', 20);
goToCauldron();
_vm->incScore(3);
}
@@ -1425,13 +1472,13 @@ bool Parser::giveToSpludwick() {
_vm->_objects[kObjectInk - 1] = false;
_vm->refreshObjectList();
_vm->_givenToSpludwick++;
- _vm->_dialogs->displayScrollChain('q', 24);
+ _vm->_dialogs->displayScrollChain('Q', 24);
goToCauldron();
_vm->incScore(3);
break;
case kObjectMushroom:
_vm->_objects[kObjectMushroom - 1] = false;
- _vm->_dialogs->displayScrollChain('q', 25);
+ _vm->_dialogs->displayScrollChain('Q', 25);
_vm->incScore(5);
_vm->_givenToSpludwick++;
goToCauldron();
@@ -1479,6 +1526,9 @@ void Parser::already() {
_vm->_dialogs->displayText("You're already standing!");
}
+/**
+ * Called when you ask Avvy to stand.
+ */
void Parser::standUp() {
switch (_vm->_room) {
case kRoomYours:
@@ -1486,9 +1536,9 @@ void Parser::standUp() {
if (_vm->_avvyIsAwake && _vm->_avvyInBed) {
// But he's in bed.
if (_vm->_teetotal) {
- _vm->_dialogs->displayScrollChain('d', 12);
+ _vm->_dialogs->displayScrollChain('D', 12);
_vm->_graphics->setBackgroundColor(kColorBlack);
- _vm->_dialogs->displayScrollChain('d', 14);
+ _vm->_dialogs->displayScrollChain('D', 14);
}
_vm->_animation->_sprites[0]->_visible = true;
_vm->_userMovesAvvy = true;
@@ -1543,7 +1593,7 @@ void Parser::getProc(char thing) {
_vm->_dialogs->displayText(tmpStr);
}
} else
- _vm->_dialogs->displayScrollChain('q', 57);
+ _vm->_dialogs->displayScrollChain('Q', 57);
break;
case kRoomInsideCardiffCastle:
switch (thing) {
@@ -1564,15 +1614,15 @@ void Parser::getProc(char thing) {
_vm->_dialogs->displayText("Taken.");
}
} else if (_vm->_standingOnDais)
- _vm->_dialogs->displayScrollChain('q', 53);
+ _vm->_dialogs->displayScrollChain('Q', 53);
else
- _vm->_dialogs->displayScrollChain('q', 51);
+ _vm->_dialogs->displayScrollChain('Q', 51);
break;
case kObjectBolt:
- _vm->_dialogs->displayScrollChain('q', 52);
+ _vm->_dialogs->displayScrollChain('Q', 52);
break;
default:
- _vm->_dialogs->displayScrollChain('q', 57);
+ _vm->_dialogs->displayScrollChain('Q', 57);
}
break;
case kRoomRobins:
@@ -1585,10 +1635,10 @@ void Parser::getProc(char thing) {
_vm->refreshObjectList();
_vm->incScore(3);
} else
- _vm->_dialogs->displayScrollChain('q', 57);
+ _vm->_dialogs->displayScrollChain('Q', 57);
break;
default:
- _vm->_dialogs->displayScrollChain('q', 57);
+ _vm->_dialogs->displayScrollChain('Q', 57);
}
}
@@ -1605,7 +1655,7 @@ void Parser::giveGeidaTheLute() {
_vm->_objects[kObjectLute - 1] = false;
_vm->refreshObjectList();
// She plays it.
- _vm->_dialogs->displayScrollChain('q', 64);
+ _vm->_dialogs->displayScrollChain('Q', 64);
_vm->_timer->addTimer(1, Timer::kProcGiveLuteToGeida, Timer::kReasonGeidaSings);
//_vm->_enid->backToBootstrap(4); TODO: Replace it with proper ScummVM-friendly function(s)! Do not remove until then!
@@ -1619,7 +1669,7 @@ void Parser::playHarp() {
}
void Parser::winSequence() {
- _vm->_dialogs->displayScrollChain('q', 78);
+ _vm->_dialogs->displayScrollChain('Q', 78);
_vm->_sequence->startWinSeq();
_vm->_timer->addTimer(30, Timer::kProcWinning, Timer::kReasonWinning);
}
@@ -1644,6 +1694,10 @@ void Parser::doThat() {
// "Slip" object
_thing -= 49;
+ if (_vm->_tiedUp) {
+ _vm->_dialogs->displayText("You better stay quiet now!");
+ return;
+ }
if ((_verb != kVerbCodeLoad) && (_verb != kVerbCodeSave) && (_verb != kVerbCodeQuit) && (_verb != kVerbCodeInfo) && (_verb != kVerbCodeHelp)
&& (_verb != kVerbCodeLarrypass) && (_verb != kVerbCodePhaon) && (_verb != kVerbCodeBoss) && (_verb != kVerbCodeCheat) && (_verb != kVerbCodeRestart)
@@ -1653,7 +1707,7 @@ void Parser::doThat() {
"Try restarting, or restoring a saved game!");
return;
}
- if (!_vm->_avvyIsAwake && (_verb != kVerbCodeDie) && (_verb != kVerbCodeExpletive) && (_verb != kVerbCodeWake)) {
+ if (!_vm->_avvyIsAwake && (_verb != kVerbCodeWake)) {
_vm->_dialogs->displayText("Talking in your sleep? Try waking up!");
return;
}
@@ -1666,7 +1720,7 @@ void Parser::doThat() {
case kVerbCodeOpen:
openDoor();
break;
- case kVerbCodePause: {
+ case kVerbCodePause: {
// Note that the original game doesn't care about the "O.K." box neither, it accepts
// clicks from everywhere on the screen to continue. Just like my code.
Common::String tmpStr = Common::String::format("Game paused.%c%c%cPress Enter, Esc, or click the mouse on the `O.K.\" " \
@@ -1758,7 +1812,7 @@ void Parser::doThat() {
break;
case kPeopleIbythneth:
if (_thing == kObjectBadge) {
- _vm->_dialogs->displayScrollChain('q', 32); // Thanks! Wow!
+ _vm->_dialogs->displayScrollChain('Q', 32); // Thanks! Wow!
_vm->incScore(3);
_vm->_objects[kObjectBadge - 1] = false;
_vm->_objects[kObjectHabit - 1] = true;
@@ -1772,7 +1826,7 @@ void Parser::doThat() {
if (_vm->_aylesIsAwake) {
if (_thing == kObjectPen) {
_vm->_objects[kObjectPen - 1] = false;
- _vm->_dialogs->displayScrollChain('q', 54);
+ _vm->_dialogs->displayScrollChain('Q', 54);
_vm->_objects[kObjectInk - 1] = true;
_vm->_givenPenToAyles = true;
_vm->refreshObjectList();
@@ -1787,7 +1841,7 @@ void Parser::doThat() {
case kObjectPotion:
_vm->_objects[kObjectPotion - 1] = false;
// She drinks it.
- _vm->_dialogs->displayScrollChain('u', 16);
+ _vm->_dialogs->displayScrollChain('U', 16);
_vm->incScore(2);
_vm->_givenPotionToGeida = true;
_vm->refreshObjectList();
@@ -1806,7 +1860,7 @@ void Parser::doThat() {
winSequence();
else
// That Geida woman!
- _vm->_dialogs->displayScrollChain('q', 77);
+ _vm->_dialogs->displayScrollChain('Q', 77);
break;
default:
_vm->_dialogs->sayThanks(_thing - 1);
@@ -1836,7 +1890,7 @@ void Parser::doThat() {
if (savegameId < 0)
// dialog aborted, nothing to load
return;
-
+
_vm->loadGame(savegameId);
}
break;
@@ -1940,45 +1994,7 @@ void Parser::doThat() {
// They just typed "play"...
switch (_vm->_room) {
case kRoomArgentPub:
- // ...in the pub, => play Nim.
- warning("STUB: Parser::doThat() - case kVerbCodeplay - play_nim()");
- // play_nim();
-
- // The following parts are copied from play_nim().
- // The player automatically wins the game everytime he wins, until I implement the mini-game.
- if (_vm->_wonNim) { // Already won the game.
- _vm->_dialogs->displayScrollChain('Q', 6);
- return;
- }
-
- if (!_vm->_askedDogfoodAboutNim) {
- _vm->_dialogs->displayScrollChain('q', 84);
- return;
- }
-
- _vm->_dialogs->displayScrollChain('Q', 3);
- _playedNim++;
-
- // You won - strange!
-
- // You won! Give us a lute!
- _vm->_dialogs->displayScrollChain('Q', 7);
- _vm->_objects[kObjectLute - 1] = true;
- _vm->refreshObjectList();
- _vm->_wonNim = true;
- // Show the settle with no lute on it.
- _vm->_background->draw(-1, -1, 0);
- // 7 points for winning!
- _vm->incScore(7);
-
- if (_playedNim == 1)
- // 3 points for playing your 1st game.
- _vm->incScore(3);
-
- // A warning to the player that there should have been a mini-game. TODO: Remove it later!!!
- _vm->_dialogs->displayText(Common::String("P.S.: There should have been the mini-game called \"Nim\", " \
- "but I haven't implemented it yet: you win and get the lute automatically.")
- + kControlNewLine + kControlNewLine + "Peter (uruk)");
+ _vm->_nim->playNim(); // ...in the pub, => play Nim.
break;
case kRoomMusicRoom:
playHarp();
@@ -2005,8 +2021,7 @@ void Parser::doThat() {
break;
case 55:
if (_vm->_room == kRoomArgentPub)
- // play_nim();
- warning("STUB: Parser::doThat() - case kVerbCodeplay - play_nim()");
+ _vm->_nim->playNim();
else
_vm->_dialogs->displayText(kWhat);
break;
@@ -2027,8 +2042,7 @@ void Parser::doThat() {
}
break;
case kVerbCodeHelp:
- // boot_help();
- warning("STUB: Parser::doThat() - case kVerbCodehelp");
+ _vm->_help->run();
break;
case kVerbCodeLarrypass:
_vm->_dialogs->displayText("Wrong game!");
@@ -2037,8 +2051,7 @@ void Parser::doThat() {
_vm->_dialogs->displayText("Hello, Phaon!");
break;
case kVerbCodeBoss:
- // bosskey();
- warning("STUB: Parser::doThat() - case kVerbCodeboss");
+ bossKey();
break;
case kVerbCodePee:
if (_vm->getFlag('P')) {
@@ -2057,13 +2070,13 @@ void Parser::doThat() {
break;
case kVerbCodeMagic:
if (_vm->_avariciusTalk > 0)
- _vm->_dialogs->displayScrollChain('q', 19);
+ _vm->_dialogs->displayScrollChain('Q', 19);
else {
if ((_vm->_room == kRoomSpludwicks) & (_vm->_animation->inField(1))) {
// Avaricius appears!
- _vm->_dialogs->displayScrollChain('q', 17);
+ _vm->_dialogs->displayScrollChain('Q', 17);
if (_vm->getRoom(kPeopleSpludwick) == kRoomSpludwicks)
- _vm->_dialogs->displayScrollChain('q', 18);
+ _vm->_dialogs->displayScrollChain('Q', 18);
else {
Avalanche::AnimationType *spr = _vm->_animation->_sprites[1];
// Avaricius
@@ -2097,7 +2110,7 @@ void Parser::doThat() {
}
break;
default: {
- _vm->_pingo->zonk();
+ _vm->_animation->thunder();
Common::String tmpStr = Common::String::format("A crack of lightning shoots from the sky, and fries you." \
"%c%c(`Such is the anger of the gods, Avvy!\")", kControlNewLine, kControlNewLine);
_vm->_dialogs->displayText(tmpStr);
@@ -2217,7 +2230,7 @@ void Parser::doThat() {
case kRoomNottsPub:
// Can't sell to southerners.
- _vm->_dialogs->displayScrollChain('n', 15);
+ _vm->_dialogs->displayScrollChain('N', 15);
break;
default:
// Can't buy that.
@@ -2293,7 +2306,7 @@ void Parser::doThat() {
break;
case kVerbCodeScore: {
Common::String tmpStr = Common::String::format("Your score is %d,%c%cout of a possible 128.%c%c " \
- "This gives you a rank of %s.%c%c%s", _vm->_dnascore, kControlCenter, kControlNewLine, kControlNewLine,
+ "This gives you a rank of %s.%c%c%s", _vm->_score, kControlCenter, kControlNewLine, kControlNewLine,
kControlNewLine, rank().c_str(), kControlNewLine, kControlNewLine, totalTime().c_str());
_vm->_dialogs->displayText(tmpStr);
}
@@ -2354,7 +2367,7 @@ void Parser::doThat() {
// Picture of Avvy, awake in bed.
_vm->_background->draw(-1, -1, 2);
if (_vm->_teetotal)
- _vm->_dialogs->displayScrollChain('d', 13);
+ _vm->_dialogs->displayScrollChain('D', 13);
} else
_vm->_dialogs->displayText("You're already awake, Avvy!");
break;
@@ -2411,6 +2424,25 @@ void Parser::doThat() {
}
}
+void Parser::bossKey() {
+ _vm->_graphics->saveScreen();
+ _vm->_graphics->blackOutScreen();
+ _vm->_graphics->loadMouse(kCurUpArrow);
+ _vm->loadBackground(98);
+ _vm->_graphics->drawNormalText("Graph/Histo/Draw/Sample: \"JANJUN93.GRA\": (W3-AB3)", _vm->_font, 8, 120, 169, kColorDarkgray);
+ _vm->_graphics->drawNormalText("Press any key or click the mouse to return.", _vm->_font, 8, 144, 182, kColorDarkgray);
+ _vm->_graphics->refreshScreen();
+ Common::Event event;
+ _vm->getEvent(event);
+ while ((!_vm->shouldQuit()) && (event.type != Common::EVENT_KEYDOWN) && (event.type != Common::EVENT_LBUTTONDOWN)){
+ _vm->getEvent(event);
+ _vm->_graphics->refreshScreen();
+ }
+ _vm->_graphics->restoreScreen();
+ _vm->_graphics->removeBackup();
+ _vm->loadBackground(_vm->_room);
+}
+
void Parser::verbOpt(byte verb, Common::String &answer, char &ansKey) {
// kVerbCodegive isn't dealt with by this procedure, but by ddm__with.
switch (verb) {
@@ -2452,10 +2484,9 @@ void Parser::doVerb(VerbCode id) {
}
void Parser::resetVariables() {
- _wearing = 0;
+ _wearing = kNothing;
_sworeNum = 0;
_alcoholLevel = 0;
- _playedNim = 0;
_boughtOnion = false;
}
@@ -2463,7 +2494,10 @@ void Parser::synchronize(Common::Serializer &sz) {
sz.syncAsByte(_wearing);
sz.syncAsByte(_sworeNum);
sz.syncAsByte(_alcoholLevel);
- sz.syncAsByte(_playedNim);
+ if (sz.isLoading() && sz.getVersion() < 2) {
+ int dummy;
+ sz.syncAsByte(dummy);
+ }
sz.syncAsByte(_boughtOnion);
}
diff --git a/engines/avalanche/parser.h b/engines/avalanche/parser.h
index 261e5ecefe..6133c41442 100644
--- a/engines/avalanche/parser.h
+++ b/engines/avalanche/parser.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope 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.
@@ -34,17 +34,16 @@
#include "common/str.h"
#include "common/serializer.h"
-
namespace Avalanche {
class AvalancheEngine;
class Parser {
public:
- static const byte kPardon = 254; // Didn't understand / wasn't given.
static const int16 kParserWordsNum = 277; // How many words does the parser know?
+ static const int16 kFirstPassword = 88; // words[kFirstPassword] should equal "TIROS".
+ static const byte kPardon = 254; // Didn't understand / wasn't given.
static const byte kNothing = 250;
- static const byte kMoved = 0; // This word was moved. (Usually because it was the subject of conversation.)
- static const int16 kFirstPassword = 88; // words[kFirstPassword] should equal "TIROS".
+ static const byte kMoved = 0; // This word was moved. (Usually because it was the subject of conversation.)
struct VocabEntry {
byte _number;
@@ -63,23 +62,21 @@ public:
byte _thing;
People _person;
bool _polite;
- Common::String _inputText; // Original name: current
+ Common::String _inputText;
Common::String _inputTextBackup;
- byte _inputTextPos; // Original name: curpos
- bool _quote; // 66 or 99 next?
+ byte _inputTextPos;
+ bool _quote;
bool _cursorState;
bool _weirdWord;
byte _wearing; // what you're wearing
Parser(AvalancheEngine *vm);
-
void init();
void parse();
void doThat();
void verbOpt(byte verb, Common::String &answer, char &ansKey);
void drink();
-
void handleInputText(const Common::Event &event);
void handleBackspace();
void handleReturn();
@@ -87,10 +84,10 @@ public:
void plotText();
void cursorOn();
void cursorOff();
- void tryDropdown(); // This asks the parsekey proc in Dropdown if it knows it.
- int16 getPos(const Common::String &crit, const Common::String &src); // Returns the index of the first appearance of crit in src.
+ void tryDropdown();
+ int16 getPos(const Common::String &crit, const Common::String &src);
void doVerb(VerbCode id);
-
+ Common::String rank();
void resetVariables();
void synchronize(Common::Serializer &sz);
@@ -107,27 +104,23 @@ private:
Common::String _thats;
byte _thing2;
- byte _sworeNum; // number of times you've sworn
+ byte _sworeNum; // number of times you've sworn
byte _alcoholLevel; // Your blood alcohol level.
- byte _playedNim; // How many times you've played Nim.
- bool _boughtOnion; // Have you bought an onion yet?
+ bool _boughtOnion; // Have you bought an onion yet?
byte wordNum(Common::String word);
void replace(Common::String oldChars, byte newChar);
-
- Common::String rank();
Common::String totalTime();
-
void clearWords();
void cheatParse(Common::String codes);
- void stripPunctuation(Common::String &word); // Strips punctuation from word.
- void displayWhat(byte target, bool animate, bool &ambiguous); // << It's an adjective!
+ void stripPunctuation(Common::String &word);
+ void displayWhat(byte target, bool animate, bool &ambiguous);
bool doPronouns();
void properNouns();
- void lookAround(); // This is called when you say "look".
+ void lookAround();
void openDoor();
void storeInterrogation(byte interrogation);
- void examineObject(); // Examine a standard object-thing
+ void examineObject();
bool isPersonHere();
void exampers();
bool isHolding();
@@ -135,19 +128,20 @@ private:
void examine();
void inventory();
void swallow();
- void peopleInRoom(); // This lists the other people in the room.
- void putProc(); // Called when you call kVerbCodeput.
+ void peopleInRoom();
+ void putProc();
void notInOrder();
void goToCauldron();
- bool giveToSpludwick(); // The result of this fn is whether or not he says "Hey, thanks!".
+ bool giveToSpludwick();
void cardiffClimbing();
void already();
- void standUp(); // Called when you ask Avvy to stand.
+ void standUp();
void getProc(char thing);
void giveGeidaTheLute();
void playHarp();
void winSequence();
void wipeText();
+ void bossKey();
};
} // End of namespace Avalanche
diff --git a/engines/avalanche/pingo.cpp b/engines/avalanche/pingo.cpp
deleted file mode 100644
index 433924f594..0000000000
--- a/engines/avalanche/pingo.cpp
+++ /dev/null
@@ -1,106 +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.
- *
- */
-
-/*
- * This code is based on the original source code of Lord Avalot d'Argent version 1.3.
- * Copyright (c) 1994-1995 Mike, Mark and Thomas Thurman.
- */
-
-/* PINGO Full-screen sub-parts of the game. */
-
-#include "avalanche/avalanche.h"
-#include "avalanche/pingo.h"
-
-namespace Avalanche {
-
-Pingo::Pingo(AvalancheEngine *vm) {
- _vm = vm;
-}
-
-void Pingo::dPlot(int16 x, int16 y, Common::String z) {
- warning("STUB: Pingo::dPlot()");
-}
-
-void Pingo::bossKey() {
- warning("STUB: Pingo::bossKey()");
-}
-
-void Pingo::copy02() { // taken from Wobble (below)
- warning("STUB: Pingo::copy02()");
-}
-
-void Pingo::copy03() { // taken from Wobble (below)
- warning("STUB: Pingo::copy03()");
-}
-
-void Pingo::copyPage(byte frp, byte top) { // taken from Copy02 (above)
- warning("STUB: Pingo::copyPage()");
-}
-
-void Pingo::wobble() {
- warning("STUB: Pingo::wobble()");
-}
-
-void Pingo::zl(int16 x1, int16 y1, int16 x2, int16 y2) {
- warning("STUB: Pingo::zl()");
-}
-
-void Pingo::zonk() {
- warning("STUB: Pingo::zonk()");
-}
-
-void Pingo::winningPic() {
- Common::File f;
- _vm->fadeOut();
-
- if (!f.open("finale.avd"))
- error("AVALANCHE: File not found: finale.avd");
-
-#if 0
- for (int bit = 0; bit <= 3; bit++) {
- port[0x3c4] = 2;
- port[0x3ce] = 4;
- port[0x3c5] = 1 << bit;
- port[0x3cf] = bit;
- blockread(f, mem[0xa000 * 0], 16000);
- }
-#endif
-
- f.close();
-
- warning("STUB: Pingo::winningPic()");
-
- _vm->fadeIn();
-
-#if 0
- do {
- _vm->check();
- } while (!(keypressed() || (mrelease > 0)));
- while (keypressed())
- char r = readkey();
- major_redraw();
-#endif
-
- warning("STUB: Pingo::winningPic()");
-}
-
-} // End of namespace Avalanche.
diff --git a/engines/avalanche/sequence.cpp b/engines/avalanche/sequence.cpp
index 10fa7f0a00..d63532a457 100644
--- a/engines/avalanche/sequence.cpp
+++ b/engines/avalanche/sequence.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -34,6 +34,8 @@ namespace Avalanche {
Sequence::Sequence(AvalancheEngine *vm) {
_vm = vm;
+
+ resetVariables();
}
void Sequence::resetVariables() {
diff --git a/engines/avalanche/sequence.h b/engines/avalanche/sequence.h
index d3c1b54963..8062118059 100644
--- a/engines/avalanche/sequence.h
+++ b/engines/avalanche/sequence.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/avalanche/shootemup.cpp b/engines/avalanche/shootemup.cpp
new file mode 100644
index 0000000000..e5e44ed934
--- /dev/null
+++ b/engines/avalanche/shootemup.cpp
@@ -0,0 +1,693 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public 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 the original source code of Lord Avalot d'Argent version 1.3.
+* Copyright (c) 1994-1995 Mike, Mark and Thomas Thurman.
+*/
+
+#include "avalanche/avalanche.h"
+#include "avalanche/shootemup.h"
+
+#include "common/random.h"
+
+namespace Avalanche {
+
+const byte ShootEmUp::kStocks = 27;
+const byte ShootEmUp::kAvvyShoots = 86;
+const byte ShootEmUp::kFacingRight = 87;
+const byte ShootEmUp::kFacingLeft = 93;
+const long int ShootEmUp::kFlag = -20047;
+const byte ShootEmUp::kFrameDelayMax = 2;
+const byte ShootEmUp::kAvvyY = 150;
+const byte ShootEmUp::kShooting[7] = { 86, 79, 80, 81, 80, 79, 86 };
+const byte ShootEmUp::kTimesASecond = 18;
+const byte ShootEmUp::kFlashTime = 20; // If flash_time is <= this, the word "time" will flash. Should be about 20.
+const byte ShootEmUp::kLeftMargin = 10;
+const int16 ShootEmUp::kRightMargin = 605;
+
+ShootEmUp::ShootEmUp(AvalancheEngine *vm) {
+ _vm = vm;
+
+ _time = 120;
+ for (int i = 0; i < 7; i++)
+ _stockStatus[i] = 0;
+ for (int i = 0; i < 99; i++) {
+ _sprites[i]._ix = 0;
+ _sprites[i]._iy = 0;
+ _sprites[i]._x = kFlag;
+ _sprites[i]._y = 0;
+ _sprites[i]._p = 0;
+ _sprites[i]._timeout = 0;
+ _sprites[i]._cameo = false;
+ _sprites[i]._cameoFrame = 0;
+ _sprites[i]._missile = false;
+ _sprites[i]._wipe = false;
+ }
+ _rectNum = 0;
+ _avvyWas = 320;
+ _avvyPos = 320;
+ _avvyAnim = 1;
+ _avvyFacing = kFacingLeft;
+ _altWasPressedBefore = false;
+ _throwNext = 73;
+ _firing = false;
+ for (int i = 0; i < 4; i++) {
+ _running[i]._x = kFlag;
+ _running[i]._y = 0;
+ _running[i]._frame = 0;
+ _running[i]._tooHigh = 0;
+ _running[i]._lowest = 0;
+ _running[i]._ix = 0;
+ _running[i]._iy = 0;
+ _running[i]._frameDelay = 0;
+ }
+ for (int i = 0; i < 7; i++)
+ _hasEscaped[i] = false;
+ _count321 = 255; // Counting down.
+ _howManyHaveEscaped = 0;
+ _escapeCount = 0;
+ _escaping = false;
+ _timeThisSecond = 0;
+ _cp = false;
+ _wasFacing = 0;
+ _score = 0;
+ _escapeStock = 0;
+ _gotOut = false;
+}
+
+uint16 ShootEmUp::run() {
+ CursorMan.showMouse(false);
+ _vm->_graphics->saveScreen();
+ _vm->fadeOut();
+ _vm->_graphics->seuDrawTitle();
+ _vm->fadeIn();
+
+ _vm->_graphics->seuLoad();
+
+ // Should we show the instructions?
+ while (!_vm->shouldQuit()) {
+ Common::Event event;
+ _vm->getEvent(event);
+ if (event.type == Common::EVENT_KEYDOWN) {
+ if ((event.kbd.keycode == Common::KEYCODE_i) || (event.kbd.keycode == Common::KEYCODE_F1))
+ instructions();
+ break; // We don't show the instructions and simply go on with the minigame if not I or F1 was pressed.
+ }
+ }
+
+ setup();
+
+ while ((_time != 0) && (!_vm->shouldQuit())) {
+ uint32 beginLoop = _vm->_system->getMillis();
+
+ blankIt();
+ hitPeople();
+ plotThem();
+ moveThem();
+ moveAvvy();
+ bumpFolk();
+ peopleRunning();
+ animate();
+ escapeCheck();
+ collisionCheck();
+ updateTime();
+ check321();
+ readKbd();
+
+ _cp = !_cp;
+
+ _vm->_graphics->refreshScreen();
+
+ uint32 delay = _vm->_system->getMillis() - beginLoop;
+ if (delay <= 55)
+ _vm->_system->delayMillis(55 - delay); // Replaces slowdown(); 55 comes from 18.2 Hz (B Flight).
+ };
+
+ _vm->fadeOut();
+ _vm->_graphics->restoreScreen();
+ _vm->_graphics->removeBackup();
+ _vm->fadeIn();
+ CursorMan.showMouse(true);
+
+ return _score;
+}
+
+bool ShootEmUp::overlap(uint16 a1x, uint16 a1y, uint16 a2x, uint16 a2y, uint16 b1x, uint16 b1y, uint16 b2x, uint16 b2y) {
+ // By De Morgan's law:
+ return (a2x >= b1x) && (b2x >= a1x) && (a2y >= b1y) && (b2y >= a1y);
+}
+
+byte ShootEmUp::getStockNumber(byte index) {
+ while (_hasEscaped[index]) {
+ index++;
+ if (index == 7)
+ index = 0;
+ }
+ return index;
+}
+
+void ShootEmUp::blankIt() {
+ for (int i = 0; i < _rectNum; i++)
+ _vm->_graphics->drawFilledRectangle(_rectangles[i], kColorBlack);
+ _rectNum = 0;
+}
+
+void ShootEmUp::moveThem() {
+ for (int i = 0; i < 99; i++) {
+ if (_sprites[i]._x != kFlag) {
+ _sprites[i]._x += _sprites[i]._ix;
+ _sprites[i]._y += _sprites[i]._iy;
+ }
+ }
+}
+
+void ShootEmUp::blank(Common::Rect rect) {
+ _rectangles[_rectNum++] = rect;
+}
+
+void ShootEmUp::plotThem() {
+ for (int i = 0; i < 99; i++) {
+ if (_sprites[i]._x != kFlag) {
+ if (_sprites[i]._cameo) {
+ _vm->_graphics->seuDrawCameo(_sprites[i]._x, _sprites[i]._y, _sprites[i]._p, _sprites[i]._cameoFrame);
+ if (!_cp) {
+ _sprites[i]._cameoFrame += 2;
+ _sprites[i]._p += 2;
+ }
+ } else
+ _vm->_graphics->seuDrawPicture(_sprites[i]._x, _sprites[i]._y, _sprites[i]._p);
+
+ if (_sprites[i]._wipe)
+ blank(Common::Rect(_sprites[i]._x, _sprites[i]._y, _sprites[i]._x + _vm->_graphics->seuGetPicWidth(_sprites[i]._p), _sprites[i]._y + _vm->_graphics->seuGetPicHeight(_sprites[i]._p)));
+
+ if (_sprites[i]._timeout > 0) {
+ _sprites[i]._timeout--;
+ if (_sprites[i]._timeout == 0)
+ _sprites[i]._x = kFlag;
+ }
+ }
+ }
+}
+
+void ShootEmUp::define(int16 x, int16 y, int8 p, int8 ix, int8 iy, int16 time, bool isAMissile, bool doWeWipe) {
+ for (int i = 0; i < 99; i++) {
+ if (_sprites[i]._x == kFlag) {
+ _sprites[i]._x = x;
+ _sprites[i]._y = y;
+ _sprites[i]._p = p;
+ _sprites[i]._ix = ix;
+ _sprites[i]._iy = iy;
+ _sprites[i]._timeout = time;
+ _sprites[i]._cameo = false;
+ _sprites[i]._missile = isAMissile;
+ _sprites[i]._wipe = doWeWipe;
+ return;
+ }
+ }
+}
+
+void ShootEmUp::defineCameo(int16 x, int16 y, int8 p, int16 time) {
+ for (int i = 0; i < 99; i++) {
+ if (_sprites[i]._x == kFlag) {
+ _sprites[i]._x = x;
+ _sprites[i]._y = y;
+ _sprites[i]._p = p;
+ _sprites[i]._ix = 0;
+ _sprites[i]._iy = 0;
+ _sprites[i]._timeout = time;
+ _sprites[i]._cameo = true;
+ _sprites[i]._cameoFrame = p + 1;
+ _sprites[i]._missile = false;
+ _sprites[i]._wipe = false;
+ return;
+ }
+ }
+}
+
+void ShootEmUp::showStock(byte index) {
+ if (_escaping && (index == _escapeStock)) {
+ _vm->_graphics->seuDrawPicture(index * 90 + 20, 30, kStocks + 2);
+ return;
+ }
+
+ if (_stockStatus[index] > 5)
+ return;
+
+ _vm->_graphics->seuDrawPicture(index * 90 + 20, 30, kStocks + _stockStatus[index]);
+ _stockStatus[index] = 1 - _stockStatus[index];
+}
+
+void ShootEmUp::drawNumber(int number, int size, int x) {
+ for (int i = 0; i < size - 1; i++) {
+ int divisor = 10;
+ for (int j = 0; j < size - 2 - i; j++)
+ divisor *= 10;
+ char value = number / divisor;
+ _vm->_graphics->seuDrawPicture(x + i * 10, 0, value);
+ number -= value * divisor;
+ }
+ _vm->_graphics->seuDrawPicture(x + (size - 1) * 10, 0, number % 10);
+}
+
+void ShootEmUp::showScore() {
+ drawNumber(_score, 5, 40);
+}
+
+void ShootEmUp::showTime() {
+ drawNumber(_time, 3, 140);
+}
+
+void ShootEmUp::gain(int8 howMuch) {
+ if ((_score + howMuch) < 0) // howMuch can be negative!
+ _score = 0;
+ else
+ _score += howMuch;
+
+ showScore();
+}
+
+void ShootEmUp::newEscape() {
+ _escapeCount = _vm->_rnd->getRandomNumber(17) * 20;
+ _escaping = false;
+}
+
+void ShootEmUp::nextPage() {
+ _vm->_graphics->drawNormalText("Press a key for next page >", _vm->_font, 8, 400, 190, kColorWhite);
+ _vm->_graphics->refreshScreen();
+
+ while (!_vm->shouldQuit()) {
+ Common::Event event;
+ _vm->getEvent(event);
+ if (event.type == Common::EVENT_KEYDOWN) {
+ break;
+ }
+ }
+
+ _vm->_graphics->blackOutScreen();
+}
+
+void ShootEmUp::instructions() {
+ _vm->_graphics->blackOutScreen();
+ _vm->_graphics->seuDrawPicture(25, 25, kFacingRight);
+ _vm->_graphics->drawNormalText("< Avvy, our hero, needs your help - you must move him around.", _vm->_font, 8, 60, 35, kColorWhite);
+ _vm->_graphics->drawNormalText("(He''s too terrified to move himself!)", _vm->_font, 8, 80, 45, kColorWhite);
+ _vm->_graphics->drawNormalText("Your task is to prevent the people in the stocks from escaping", _vm->_font, 8, 0, 75, kColorWhite);
+ _vm->_graphics->drawNormalText("by pelting them with rotten fruit, eggs and bread. The keys are:", _vm->_font, 8, 0, 85, kColorWhite);
+ _vm->_graphics->drawNormalText("LEFT SHIFT", _vm->_font, 8, 80, 115, kColorWhite);
+ _vm->_graphics->drawNormalText("Move left.", _vm->_font, 8, 200, 115, kColorWhite);
+ _vm->_graphics->drawNormalText("RIGHT SHIFT", _vm->_font, 8, 72, 135, kColorWhite);
+ _vm->_graphics->drawNormalText("Move right.", _vm->_font, 8, 200, 135, kColorWhite);
+ _vm->_graphics->drawNormalText("ALT", _vm->_font, 8, 136, 155, kColorWhite);
+ _vm->_graphics->drawNormalText("Throw something.", _vm->_font, 8, 200, 155, kColorWhite);
+
+ nextPage();
+
+ _vm->_graphics->seuDrawPicture(25, 35, kStocks);
+ _vm->_graphics->drawNormalText("This man is in the stocks. Your job is to stop him getting out.", _vm->_font, 8, 80, 35, kColorWhite);
+ _vm->_graphics->drawNormalText("UNFORTUNATELY... the locks on the stocks are loose, and every", _vm->_font, 8, 88, 45, kColorWhite);
+ _vm->_graphics->drawNormalText("so often, someone will discover this and try to get out.", _vm->_font, 8, 88, 55, kColorWhite);
+ _vm->_graphics->seuDrawPicture(25, 85, kStocks + 2);
+ _vm->_graphics->drawNormalText("< Someone who has found a way out!", _vm->_font, 8, 80, 85, kColorWhite);
+ _vm->_graphics->drawNormalText("You MUST IMMEDIATELY hit people smiling like this, or they", _vm->_font, 8, 88, 95, kColorWhite);
+ _vm->_graphics->drawNormalText("will disappear and lose you points.", _vm->_font, 8, 88, 105, kColorWhite);
+ _vm->_graphics->seuDrawPicture(25, 125, kStocks + 5);
+ _vm->_graphics->seuDrawPicture(25, 155, kStocks + 4);
+ _vm->_graphics->drawNormalText("< Oh dear!", _vm->_font, 8, 80, 125, kColorWhite);
+
+ nextPage();
+
+ _vm->_graphics->drawNormalText("Your task is made harder by:", _vm->_font, 8, 0, 35, kColorWhite);
+ _vm->_graphics->seuDrawPicture(25, 55, 48);
+ _vm->_graphics->drawNormalText("< Yokels. These people will run in front of you. If you hit", _vm->_font, 8, 60, 55, kColorWhite);
+ _vm->_graphics->drawNormalText("them, you will lose MORE points than you get hitting people", _vm->_font, 8, 68, 65, kColorWhite);
+ _vm->_graphics->drawNormalText("in the stocks. So BEWARE!", _vm->_font, 8, 68, 75, kColorWhite);
+ _vm->_graphics->drawNormalText("Good luck with the game!", _vm->_font, 8, 80, 125, kColorWhite);
+
+ nextPage();
+}
+
+void ShootEmUp::setup() {
+ _vm->_graphics->blackOutScreen();
+
+ newEscape();
+
+ for (int i = 0; i < 7; i++) {
+ _stockStatus[i] = _vm->_rnd->getRandomNumber(1);
+ showStock(i);
+ }
+
+ // Set up status line:
+ _vm->_graphics->seuDrawPicture(0, 0, 16); // Score:
+ showScore(); // Value of score (00000 here).
+ _vm->_graphics->seuDrawPicture(110, 0, 19); // Time:
+ showTime(); // Value of time.
+
+ _vm->_graphics->refreshScreen();
+
+ // From the original core cycle:
+ initRunner(20, 70, 48, 54, _vm->_rnd->getRandomNumber(4) + 1, _vm->_rnd->getRandomNumber(3) - 2);
+ initRunner(600, 70, 48, 54, _vm->_rnd->getRandomNumber(4) + 1, _vm->_rnd->getRandomNumber(3) - 2);
+ initRunner(600, 100, 61, 67, (-(int8)_vm->_rnd->getRandomNumber(4)) + 1, _vm->_rnd->getRandomNumber(3) - 2);
+ initRunner(20, 100, 61, 67, (-(int8)_vm->_rnd->getRandomNumber(4)) + 1, _vm->_rnd->getRandomNumber(3) - 2);
+}
+
+void ShootEmUp::initRunner(int16 x, int16 y, byte f1, byte f2, int8 ix, int8 iy) {
+ for (int i = 0; i < 4; i++) {
+ if (_running[i]._x == kFlag) {
+ _running[i]._x = x;
+ _running[i]._y = y;
+ _running[i]._frame = f1;
+ _running[i]._tooHigh = f2;
+ _running[i]._lowest = f1;
+ _running[i]._ix = ix;
+ _running[i]._iy = iy;
+ if ((ix == 0) && (iy == 0))
+ _running[i]._ix = 2; // To stop them running on the spot!
+ _running[i]._frameDelay = kFrameDelayMax;
+ return;
+ }
+ }
+}
+
+void ShootEmUp::moveAvvy() {
+ if (_avvyWas < _avvyPos)
+ _avvyFacing = kFacingRight;
+ else if (_avvyWas > _avvyPos)
+ _avvyFacing = kFacingLeft;
+
+ if (!_firing) {
+ if (_avvyWas == _avvyPos)
+ _avvyAnim = 1;
+ else {
+ _avvyAnim++;
+ if (_avvyAnim == 6)
+ _avvyAnim = 0;
+ }
+ }
+
+ if (_avvyFacing == kAvvyShoots)
+ define(_avvyPos, kAvvyY, kShooting[_avvyAnim], 0, 0, 1, false, true);
+ else
+ define(_avvyPos, kAvvyY, _avvyAnim + _avvyFacing, 0, 0, 1, false, true);
+
+ _avvyWas = _avvyPos;
+
+ if (_avvyFacing == kAvvyShoots) {
+ if (_avvyAnim == 6) {
+ _avvyFacing = _wasFacing;
+ _avvyAnim = 0;
+ _firing = false;
+ } else
+ _avvyAnim++;
+ }
+}
+
+void ShootEmUp::readKbd() {
+ Common::Event event;
+ _vm->getEvent(event);
+
+ if ((event.type == Common::EVENT_KEYUP) && ((event.kbd.keycode == Common::KEYCODE_LALT) || (event.kbd.keycode == Common::KEYCODE_RALT))) {
+ // Don't let the player fire continuously by holding down one of the ALT keys.
+ _altWasPressedBefore = false;
+ return;
+ }
+
+ if (_firing) // So you can't stack up shots while the shooting animation plays.
+ return;
+
+ if (event.type == Common::EVENT_KEYDOWN) {
+ switch (event.kbd.keycode) {
+ case Common::KEYCODE_LALT: // Alt was pressed - shoot!
+ case Common::KEYCODE_RALT: // Falltrough is intended.
+ if (_altWasPressedBefore || (_count321 != 0))
+ return;
+
+ _altWasPressedBefore = true;
+ _firing = true;
+ define(_avvyPos + 27, kAvvyY + 5, _throwNext, 0, -2, 53, true, true);
+ _throwNext++;
+ if (_throwNext == 79)
+ _throwNext = 73;
+ _avvyAnim = 0;
+ _wasFacing = _avvyFacing;
+ _avvyFacing = kAvvyShoots;
+ return;
+ case Common::KEYCODE_RSHIFT: // Right shift: move right.
+ _avvyPos += 5;
+ if (_avvyPos > kRightMargin)
+ _avvyPos = kRightMargin;
+ return;
+ case Common::KEYCODE_LSHIFT: // Left shift: move left.
+ _avvyPos -= 5;
+ if (_avvyPos < kLeftMargin)
+ _avvyPos = kLeftMargin;
+ return;
+ default:
+ break;
+ }
+ }
+}
+
+void ShootEmUp::animate() {
+ if (_vm->_rnd->getRandomNumber(9) == 1)
+ showStock(getStockNumber(_vm->_rnd->getRandomNumber(5)));
+ for (int i = 0; i < 7; i++) {
+ if (_stockStatus[i] > 5) {
+ _stockStatus[i]--;
+ if (_stockStatus[i] == 8) {
+ _stockStatus[i] = 0;
+ showStock(i);
+ }
+ }
+ }
+}
+
+void ShootEmUp::collisionCheck() {
+ for (int i = 0; i < 99; i++) {
+ if ((_sprites[i]._x != kFlag) && (_sprites[i]._missile) &&
+ (_sprites[i]._y < 60) && (_sprites[i]._timeout == 1)) {
+ int distFromSide = (_sprites[i]._x - 20) % 90;
+ int thisStock = (_sprites[i]._x - 20) / 90;
+ if ((!_hasEscaped[thisStock]) && (distFromSide > 17) && (distFromSide < 34)) {
+ _vm->_sound->playNote(999, 3);
+ _vm->_system->delayMillis(3);
+ define(_sprites[i]._x + 20, _sprites[i]._y, 25 + _vm->_rnd->getRandomNumber(1), 3, 1, 12, false, true); // Well done!
+ define(thisStock * 90 + 20, 30, 30, 0, 0, 7, false, false); // Face of man
+ defineCameo(thisStock * 90 + 20 + 10, 35, 40, 7); // Splat!
+ define(thisStock * 90 + 20 + 20, 50, 33 + _vm->_rnd->getRandomNumber(4), 0, 2, 9, false, true); // Oof!
+ _stockStatus[thisStock] = 17;
+ gain(3); // Score for hitting a face.
+
+ if (_escaping && (_escapeStock = thisStock)) { // Hit the escaper.
+ _vm->_sound->playNote(1777, 1);
+ _vm->_system->delayMillis(1);
+ gain(5); // Bonus for hitting escaper.
+ _escaping = false;
+ newEscape();
+ }
+ } else {
+ define(_sprites[i]._x, _sprites[i]._y, 82 + _vm->_rnd->getRandomNumber(2), 2, 2, 17, false, true); // Missed!
+ if ((!_hasEscaped[thisStock]) && (distFromSide > 3) && (distFromSide < 43)) {
+ define(thisStock * 90 + 20, 30, 29, 0, 0, 7, false, false); // Face of man
+ if (distFromSide > 35)
+ defineCameo(_sprites[i]._x - 27, 35, 40, 7); // Splat!
+ else
+ defineCameo(_sprites[i]._x - 7, 35, 40, 7);
+ _stockStatus[thisStock] = 17;
+ }
+ }
+ }
+ }
+}
+
+void ShootEmUp::turnAround(byte who, bool randomX) {
+ if (randomX) {
+ int8 ix = (_vm->_rnd->getRandomNumber(4) + 1);
+ if (_running[who]._ix > 0)
+ _running[who]._ix = -(ix);
+ else
+ _running[who]._ix = ix;
+ } else
+ _running[who]._ix = -(_running[who]._ix);
+
+ _running[who]._iy = -(_running[who]._iy);
+}
+
+void ShootEmUp::bumpFolk() {
+ for (int i = 0; i < 4; i++) {
+ if (_running[i]._x != kFlag) {
+ for (int j = i + 1; j < 4; j++) {
+ bool overlaps = overlap(_running[i]._x, _running[i]._y, _running[i]._x + 17, _running[i]._y + 24,
+ _running[j]._x, _running[j]._y, _running[j]._x + 17, _running[j]._y + 24);
+ if ((_running[i]._x != kFlag) && overlaps) {
+ turnAround(i, false); // Opp. directions.
+ turnAround(j, false);
+ }
+ }
+ }
+ }
+}
+
+void ShootEmUp::peopleRunning() {
+ if (_count321 != 0)
+ return;
+
+ for (int i = 0; i < 4; i++) {
+ if (_running[i]._x != kFlag) {
+ if (((_running[i]._y + _running[i]._iy) <= 53) || ((_running[i]._y + _running[i]._iy) >= 120))
+ _running[i]._iy = -(_running[i]._iy);
+
+ byte frame = 0;
+ if (_running[i]._ix < 0)
+ frame = _running[i]._frame - 1;
+ else
+ frame = _running[i]._frame + 6;
+ define(_running[i]._x, _running[i]._y, frame, 0, 0, 1, false, true);
+
+ if (_running[i]._frameDelay == 0) {
+ _running[i]._frame++;
+ if (_running[i]._frame == _running[i]._tooHigh)
+ _running[i]._frame = _running[i]._lowest;
+ _running[i]._frameDelay = kFrameDelayMax;
+ _running[i]._y += _running[i]._iy;
+ } else
+ _running[i]._frameDelay--;
+
+ if (((_running[i]._x + _running[i]._ix) <= 0) || ((_running[i]._x + _running[i]._ix) >= 620))
+ turnAround(i, true);
+
+ _running[i]._x += _running[i]._ix;
+ }
+ }
+}
+
+void ShootEmUp::updateTime() {
+ if (_count321 != 0)
+ return;
+
+ _timeThisSecond++;
+
+ if (_timeThisSecond < kTimesASecond)
+ return;
+
+ _time--;
+ showTime();
+ _timeThisSecond = 0;
+
+ if (_time <= kFlashTime) {
+ int timeMode = 0;
+ if ((_time % 2) == 1)
+ timeMode = 19; // Normal 'Time:'
+ else
+ timeMode = 85; // Flash 'Time:'
+
+ _vm->_graphics->seuDrawPicture(110, 0, timeMode);
+ }
+}
+
+void ShootEmUp::hitPeople() {
+ if (_count321 != 0)
+ return;
+
+ for (int i = 0; i < 99; i++) {
+ if ((_sprites[i]._missile) && (_sprites[i]._x != kFlag)) {
+ for (int j = 0; j < 4; j++) {
+
+ bool overlaps = overlap(_sprites[i]._x, _sprites[i]._y, _sprites[i]._x + 7, _sprites[i]._y + 10,
+ _running[j]._x, _running[j]._y, _running[j]._x + 17, _running[j]._y + 24);
+
+ if ((_running[j]._x != kFlag) && (overlaps)) {
+ _vm->_sound->playNote(7177, 1);
+ _sprites[i]._x = kFlag;
+ gain(-5);
+ define(_running[j]._x + 20, _running[j]._y + 3, 33 + _vm->_rnd->getRandomNumber(5), 1, 3, 9, false, true); // Oof!
+ define(_sprites[i]._x, _sprites[i]._y, 82, 1, 0, 17, false, true); // Oops!
+ }
+ }
+ }
+ }
+}
+
+void ShootEmUp::escapeCheck() {
+ if (_count321 != 0)
+ return;
+
+ if (_escapeCount > 0) {
+ _escapeCount--;
+ return;
+ }
+
+ // Escape_count = 0; now what ?
+
+ if (_escaping) {
+ if (_gotOut) {
+ newEscape();
+ _escaping = false;
+ _vm->_graphics->seuDrawPicture(_escapeStock * 90 + 20, 30, kStocks + 4);
+ } else {
+ _vm->_graphics->seuDrawPicture(_escapeStock * 90 + 20, 30, kStocks + 5);
+ _escapeCount = 20;
+ _gotOut = true;
+ define(_escapeStock * 90 + 20, 50, 24, 0, 2, 17, false, true); // Escaped!
+ gain(-10);
+ _hasEscaped[_escapeStock] = true;
+
+ _howManyHaveEscaped++;
+
+ if (_howManyHaveEscaped == 7) {
+ _vm->_graphics->seuDrawPicture(266, 90, 23);
+ _time = 0;
+ }
+ }
+ } else {
+ _escapeStock = getStockNumber(_vm->_rnd->getRandomNumber(6));
+ _escaping = true;
+ _gotOut = false;
+ _vm->_graphics->seuDrawPicture(_escapeStock * 90 + 20, 30, kStocks + 2); // Smiling!
+ _escapeCount = 200;
+ }
+}
+
+void ShootEmUp::check321() {
+ if (_count321 == 0)
+ return;
+
+ _count321--;
+
+ switch (_count321) {
+ case 84:
+ define(320, 60, 15, 2, 1, 94, false, true);
+ break;
+ case 169:
+ define(320, 60, 14, 0, 1, 94, false, true);
+ break;
+ case 254:
+ define(320, 60, 13, -2, 1, 94, false, true);
+ define(0, 100, 17, 2, 0, 254, false, true);
+ break;
+ default:
+ break;
+ }
+}
+
+} // End of namespace Avalanche
diff --git a/engines/avalanche/shootemup.h b/engines/avalanche/shootemup.h
new file mode 100644
index 0000000000..3cdcc1d5cd
--- /dev/null
+++ b/engines/avalanche/shootemup.h
@@ -0,0 +1,134 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public 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 the original source code of Lord Avalot d'Argent version 1.3.
+* Copyright (c) 1994-1995 Mike, Mark and Thomas Thurman.
+*/
+
+#ifndef AVALANCHE_SHOOTEMUP_H
+#define AVALANCHE_SHOOTEMUP_H
+
+namespace Avalanche {
+class AvalancheEngine;
+
+class ShootEmUp {
+public:
+ ShootEmUp(AvalancheEngine *vm);
+
+ uint16 run();
+
+private:
+ struct Sprite {
+ int8 _ix, _iy;
+ int16 _x, _y;
+ int8 _p;
+ int16 _timeout;
+ bool _cameo;
+ byte _cameoFrame;
+ bool _missile;
+ bool _wipe;
+ };
+
+ struct Runner {
+ int16 _x, _y;
+ byte _frame;
+ byte _tooHigh;
+ byte _lowest;
+ int8 _ix, _iy;
+ byte _frameDelay;
+ };
+
+ static const byte kStocks;
+ static const byte kAvvyShoots;
+ static const byte kFacingRight;
+ static const byte kFacingLeft;
+ static const long int kFlag;
+ static const byte kFrameDelayMax;
+ static const byte kAvvyY;
+ static const byte kShooting[7];
+ static const byte kTimesASecond;
+ static const byte kFlashTime;
+ static const byte kLeftMargin;
+ static const int16 kRightMargin;
+
+ AvalancheEngine *_vm;
+
+ uint16 _score;
+ byte _time;
+ byte _stockStatus[7];
+ Sprite _sprites[99];
+ byte _rectNum; // Original: 'rsize'
+ Common::Rect _rectangles[99];
+ uint16 _avvyWas;
+ uint16 _avvyPos;
+ byte _avvyAnim;
+ byte _avvyFacing;
+ bool _altWasPressedBefore;
+ byte _throwNext;
+ bool _firing;
+ Runner _running[4];
+ bool _hasEscaped[7];
+ byte _count321;
+ byte _howManyHaveEscaped;
+ uint16 _escapeCount;
+ bool _escaping;
+ byte _timeThisSecond;
+ bool _cp;
+ byte _wasFacing;
+ byte _escapeStock;
+ bool _gotOut;
+
+ bool overlap(uint16 a1x, uint16 a1y, uint16 a2x, uint16 a2y, uint16 b1x, uint16 b1y, uint16 b2x, uint16 b2y);
+ byte getStockNumber(byte index);
+ void blankIt();
+ void moveThem();
+ void blank(Common::Rect rect);
+ void plotThem();
+ void define(int16 x, int16 y, int8 p, int8 ix, int8 iy, int16 time, bool isAMissile, bool doWeWipe);
+ void defineCameo(int16 x, int16 y, int8 p, int16 time);
+ void showStock(byte index);
+ void drawNumber(int number, int size, int x);
+ void showScore();
+ void showTime();
+ void gain(int8 howMuch);
+ void newEscape();
+ void nextPage(); // Internal function of 'instructions' in the original.
+ void instructions();
+ void setup();
+ void initRunner(int16 xx, int16 yy, byte f1, byte f2, int8 ixx, int8 iyy);
+ void moveAvvy();
+ void readKbd();
+ void animate();
+ void collisionCheck();
+ void turnAround(byte who, bool randomX);
+ void bumpFolk();
+ void peopleRunning();
+ void updateTime();
+ void hitPeople();
+ void escapeCheck();
+ void check321();
+};
+
+} // End of namespace Avalanche
+
+#endif // AVALANCHE_SHOOTEMUP_H
diff --git a/engines/avalanche/sound.cpp b/engines/avalanche/sound.cpp
index c324df4713..0223bead48 100644
--- a/engines/avalanche/sound.cpp
+++ b/engines/avalanche/sound.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -51,6 +51,7 @@ void SoundHandler::stopSound() {
*/
void SoundHandler::toggleSound() {
_soundFl = !_soundFl;
+ _vm->_graphics->drawSoundLight(_soundFl);
}
void SoundHandler::syncVolume() {
diff --git a/engines/avalanche/sound.h b/engines/avalanche/sound.h
index 25b6b267d3..a67016a206 100644
--- a/engines/avalanche/sound.h
+++ b/engines/avalanche/sound.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/avalanche/timer.cpp b/engines/avalanche/timer.cpp
index 4e90c7fe48..a9753b3cce 100644
--- a/engines/avalanche/timer.cpp
+++ b/engines/avalanche/timer.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -35,12 +35,7 @@ namespace Avalanche {
Timer::Timer(AvalancheEngine *vm) {
_vm = vm;
- for (int i = 0; i < 7; i++) {
- _times[i]._timeLeft = 0;
- _times[i]._action = 0;
- _times[i]._reason = 0;
- }
- _timerLost = false;
+ resetVariables();
}
/**
@@ -48,22 +43,20 @@ Timer::Timer(AvalancheEngine *vm) {
* @remarks Originally called 'set_up_timer'
*/
void Timer::addTimer(int32 duration, byte action, byte reason) {
- if ((_vm->_isLoaded == false) || (_timerLost == true)) {
- byte i = 0;
- while ((i < 7) && (_times[i]._timeLeft != 0))
- i++;
-
- if (i == 7)
- return; // Oh dear... No timer left
-
- // Everything's OK here!
- _times[i]._timeLeft = duration;
- _times[i]._action = action;
- _times[i]._reason = reason;
- } else {
- _vm->_isLoaded = false;
- return;
+ byte i = 0;
+ while ((i < 7) && (_times[i]._timeLeft != 0)) {
+ if (_times[i]._reason == reason) // We only add a timer if it's not already in the array.
+ return;
+ i++;
}
+
+ if (i == 7)
+ return; // Oh dear... No timer left
+
+ // Everything's OK here!
+ _times[i]._timeLeft = duration;
+ _times[i]._action = action;
+ _times[i]._reason = reason;
}
/**
@@ -71,7 +64,7 @@ void Timer::addTimer(int32 duration, byte action, byte reason) {
* @remarks Originally called 'one_tick'
*/
void Timer::updateTimer() {
- if (_vm->_menu->isActive())
+ if (_vm->_dropdown->isActive())
return;
for (int i = 0; i < 7; i++) {
@@ -208,8 +201,8 @@ void Timer::updateTimer() {
}
}
}
- _vm->_roomTime++; // Cycles since you've been in this room.
- _vm->_totalTime++; // Total amount of time for this game.
+
+ _vm->_roomCycles++; // Cycles since you've been in this room.
}
void Timer::loseTimer(byte which) {
@@ -218,7 +211,6 @@ void Timer::loseTimer(byte which) {
_times[i]._timeLeft = 0; // Cancel this one!
}
- _timerLost = true;
}
void Timer::openDrawbridge() {
@@ -232,7 +224,7 @@ void Timer::openDrawbridge() {
}
void Timer::avariciusTalks() {
- _vm->_dialogs->displayScrollChain('q', _vm->_avariciusTalk);
+ _vm->_dialogs->displayScrollChain('Q', _vm->_avariciusTalk);
_vm->_avariciusTalk++;
if (_vm->_avariciusTalk < 17)
@@ -275,25 +267,25 @@ void Timer::stairs() {
void Timer::cardiffSurvey() {
if (_vm->_cardiffQuestionNum == 0) {
_vm->_cardiffQuestionNum++;
- _vm->_dialogs->displayScrollChain('q', 27);
+ _vm->_dialogs->displayScrollChain('Q', 27);
}
- _vm->_dialogs->displayScrollChain('z', _vm->_cardiffQuestionNum);
+ _vm->_dialogs->displayScrollChain('Z', _vm->_cardiffQuestionNum);
_vm->_interrogation = _vm->_cardiffQuestionNum;
addTimer(182, kProcCardiffSurvey, kReasonCardiffsurvey);
}
void Timer::cardiffReturn() {
- _vm->_dialogs->displayScrollChain('q', 28);
+ _vm->_dialogs->displayScrollChain('Q', 28);
cardiffSurvey(); // Add end of question.
}
void Timer::cwytalotInHerts() {
- _vm->_dialogs->displayScrollChain('q', 29);
+ _vm->_dialogs->displayScrollChain('Q', 29);
}
void Timer::getTiedUp() {
- _vm->_dialogs->displayScrollChain('q', 34); // ...Trouble!
+ _vm->_dialogs->displayScrollChain('Q', 34); // ...Trouble!
_vm->_userMovesAvvy = false;
_vm->_beenTiedUp = true;
_vm->_animation->stopWalking();
@@ -320,31 +312,32 @@ void Timer::hangAround() {
avvy->init(7, true); // Robin Hood
_vm->setRoom(kPeopleRobinHood, kRoomRobins);
_vm->_animation->appearPed(0, 1);
- _vm->_dialogs->displayScrollChain('q', 39);
+ _vm->_dialogs->displayScrollChain('Q', 39);
avvy->walkTo(6);
addTimer(55, kProcHangAround2, kReasonHangingAround);
}
void Timer::hangAround2() {
- _vm->_dialogs->displayScrollChain('q', 40);
+ _vm->_dialogs->displayScrollChain('Q', 40);
AnimationType *spr = _vm->_animation->_sprites[1];
spr->_vanishIfStill = false;
spr->walkTo(3);
_vm->setRoom(kPeopleFriarTuck, kRoomRobins);
- _vm->_dialogs->displayScrollChain('q', 41);
+ _vm->_dialogs->displayScrollChain('Q', 41);
_vm->_animation->_sprites[0]->remove();
spr->remove(); // Get rid of Robin Hood and Friar Tuck.
- addTimer(1, kProcAfterTheShootemup, kReasonHangingAround);
- // Immediately call the following proc (when you have a chance).
+ addTimer(1, kProcAfterTheShootemup, kReasonHangingAround); // Immediately call the following proc (when you have a chance).
_vm->_tiedUp = false;
- // _vm->_enid->backToBootstrap(1); Call the shoot-'em-up. TODO: Replace it with proper ScummVM-friendly function(s)! Do not remove until then!
+ // We don't need the ShootEmUp during the whole game, it's only playable once.
+ ShootEmUp *shootemup = new ShootEmUp(_vm);
+ _shootEmUpScore = shootemup->run();
+ delete shootemup;
}
void Timer::afterTheShootemup() {
- // Only placed this here to replace the minigame. TODO: Remove it when the shoot em' up is implemented!
_vm->flipRoom(_vm->_room, 1);
_vm->_animation->_sprites[0]->init(0, true); // Avalot.
@@ -353,29 +346,17 @@ void Timer::afterTheShootemup() {
_vm->_objects[kObjectCrossbow - 1] = true;
_vm->refreshObjectList();
- // Same as the added line above: TODO: Remove it later!!!
- _vm->_dialogs->displayText(Common::String("P.S.: There should have been the mini-game called \"shoot em' up\", " \
- "but I haven't implemented it yet: you get the crossbow automatically.") + kControlNewLine + kControlNewLine + "Peter (uruk)");
-
-#if 0
- byte shootscore, gain;
-
- shootscore = mem[storage_seg * storage_ofs];
- gain = (shootscore + 5) / 10; // Rounding up.
-
- display(string("\6Your score was ") + strf(shootscore) + '.' + "\r\rYou gain (" +
- strf(shootscore) + " 0xF6 10) = " + strf(gain) + " points.");
+ byte gain = (_shootEmUpScore + 5) / 10; // Rounding up.
+ _vm->_dialogs->displayText(Common::String::format("%cYour score was %d.%c%cYou gain (%d \xf6 10) = %d points.", kControlItalic, _shootEmUpScore, kControlNewLine, kControlNewLine, _shootEmUpScore, gain));
if (gain > 20) {
- display("But we won't let you have more than 20 points!");
- points(20);
+ _vm->_dialogs->displayText("But we won't let you have more than 20 points!");
+ _vm->incScore(20);
} else
- points(gain);
-#endif
+ _vm->incScore(gain);
- warning("STUB: Timer::after_the_shootemup()");
- _vm->_dialogs->displayScrollChain('q', 70);
+ _vm->_dialogs->displayScrollChain('Q', 70);
}
void Timer::jacquesWakesUp() {
@@ -431,7 +412,7 @@ void Timer::naughtyDuke() { // This is when the Duke comes in and takes your mon
void Timer::naughtyDuke2() {
AnimationType *spr = _vm->_animation->_sprites[1];
- _vm->_dialogs->displayScrollChain('q', 48); // "Ha ha, it worked again!"
+ _vm->_dialogs->displayScrollChain('Q', 48); // "Ha ha, it worked again!"
spr->walkTo(0); // Walk to the door.
spr->_vanishIfStill = true; // Then go away!
@@ -484,14 +465,14 @@ void Timer::jump() {
_vm->_arrowInTheDoor = false; // You've got it.
_vm->_objects[kObjectBolt - 1] = true;
_vm->refreshObjectList();
- _vm->_dialogs->displayScrollChain('q', 50);
+ _vm->_dialogs->displayScrollChain('Q', 50);
_vm->incScore(3);
}
}
}
void Timer::crapulusSaysSpludOut() {
- _vm->_dialogs->displayScrollChain('q', 56);
+ _vm->_dialogs->displayScrollChain('Q', 56);
_vm->_crapulusWillTell = false;
}
@@ -500,7 +481,7 @@ void Timer::buyDrinks() {
_vm->_malagauche = 0;
_vm->_dialogs->displayScrollChain('D', _vm->_drinking); // Display message about it.
- _vm->_pingo->wobble(); // Do the special effects.
+ _vm->_animation->wobble(); // Do the special effects.
_vm->_dialogs->displayScrollChain('D', 1); // That'll be thruppence.
if (_vm->decreaseMoney(3)) // Pay 3d.
_vm->_dialogs->displayScrollChain('D', 3); // Tell 'em you paid up.
@@ -586,7 +567,7 @@ void Timer::robinHoodAndGeida() {
}
void Timer::robinHoodAndGeidaTalk() {
- _vm->_dialogs->displayScrollChain('q', 66);
+ _vm->_dialogs->displayScrollChain('Q', 66);
AnimationType *avvy = _vm->_animation->_sprites[0];
AnimationType *spr = _vm->_animation->_sprites[1];
@@ -605,7 +586,7 @@ void Timer::avalotReturns() {
spr->remove();
avvy->init(0, true);
_vm->_animation->appearPed(0, 0);
- _vm->_dialogs->displayScrollChain('q', 67);
+ _vm->_dialogs->displayScrollChain('Q', 67);
_vm->_userMovesAvvy = true;
}
@@ -636,21 +617,43 @@ void Timer::arkataShouts() {
if (_vm->_teetotal)
return;
- _vm->_dialogs->displayScrollChain('q', 76);
+ _vm->_dialogs->displayScrollChain('Q', 76);
addTimer(160, kProcArkataShouts, kReasonArkataShouts);
}
+/**
+ * @remarks Contains the content of the function 'winning_pic', originally located in PINGO.
+ */
void Timer::winning() {
- _vm->_dialogs->displayScrollChain('q', 79);
- _vm->_pingo->winningPic();
+ _vm->_dialogs->displayScrollChain('Q', 79);
+
+ // This was originally located in winning_pic:
+ CursorMan.showMouse(false);
+ _vm->_graphics->saveScreen();
+ _vm->fadeOut();
+ _vm->_graphics->drawWinningPic();
+ _vm->_graphics->refreshScreen();
+ _vm->fadeIn();
+
+ // Waiting for a keypress or a left mouseclick:
+ Common::Event event;
+ bool escape = false;
+ while (!_vm->shouldQuit() && !escape) {
+ _vm->_graphics->refreshScreen();
+ while (_vm->getEvent(event)) {
+ if ((event.type == Common::EVENT_LBUTTONUP) || (event.type == Common::EVENT_KEYDOWN)) {
+ escape = true;
+ break;
+ }
+ }
+ }
- warning("STUB: Timer::winning()");
-#if 0
- do {
- _vm->checkclick();
- } while (!(_vm->mrelease == 0));
-#endif
- // TODO: To be implemented with Pingo::winningPic().
+ _vm->fadeOut();
+ _vm->_graphics->restoreScreen();
+ _vm->_graphics->removeBackup();
+ _vm->fadeIn();
+ CursorMan.showMouse(true);
+ // winning_pic's end.
_vm->callVerb(kVerbCodeScore);
_vm->_dialogs->displayText(" T H E E N D ");
@@ -690,4 +693,14 @@ void Timer::giveLuteToGeida() { // Moved here from Acci.
_vm->_sequence->startGeidaLuteSeq();
}
+void Timer::resetVariables() {
+ for (int i = 0; i < 7; i++) {
+ _times[i]._timeLeft = 0;
+ _times[i]._action = 0;
+ _times[i]._reason = 0;
+ }
+
+ _shootEmUpScore = 0;
+}
+
} // End of namespace Avalanche.
diff --git a/engines/avalanche/timer.h b/engines/avalanche/timer.h
index 6cd894b0a5..ad6ac0eae6 100644
--- a/engines/avalanche/timer.h
+++ b/engines/avalanche/timer.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -119,10 +119,10 @@ public:
};
TimerType _times[7];
- bool _timerLost; // Is the timer "lost"? (Because of using loseTimer())
Timer(AvalancheEngine *vm);
+ void resetVariables();
void addTimer(int32 duration, byte action, byte reason);
void updateTimer();
void loseTimer(byte which);
@@ -170,7 +170,7 @@ public:
private:
AvalancheEngine *_vm;
-
+ byte _shootEmUpScore;
};
} // End of namespace Avalanche.
diff --git a/engines/bbvs/bbvs.cpp b/engines/bbvs/bbvs.cpp
new file mode 100644
index 0000000000..d2e13e525c
--- /dev/null
+++ b/engines/bbvs/bbvs.cpp
@@ -0,0 +1,1392 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+
+ * You should have received a copy of the GNU General Public 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 "bbvs/bbvs.h"
+#include "bbvs/dialogs.h"
+#include "bbvs/gamemodule.h"
+#include "bbvs/graphics.h"
+#include "bbvs/sound.h"
+#include "bbvs/spritemodule.h"
+#include "bbvs/minigames/minigame.h"
+#include "bbvs/minigames/bbairguitar.h"
+#include "bbvs/minigames/bbant.h"
+#include "bbvs/minigames/bbloogie.h"
+#include "bbvs/minigames/bbtennis.h"
+#include "bbvs/minigames/minigame.h"
+
+#include "audio/audiostream.h"
+#include "common/config-manager.h"
+#include "common/debug-channels.h"
+#include "common/error.h"
+#include "common/fs.h"
+#include "common/timer.h"
+#include "engines/util.h"
+#include "graphics/cursorman.h"
+#include "graphics/font.h"
+#include "graphics/fontman.h"
+#include "graphics/palette.h"
+#include "graphics/surface.h"
+
+namespace Bbvs {
+
+static const BBPoint kInventorySlotPositions[] = {
+ { 66, 191}, { 94, 217}, {192, 217}, {159, 213}, {228, 49},
+ {137, 49}, {168, 165}, {101, 55}, {177, 46}, {165, 165},
+ {202, 74}, {141, 53}, {164, 164}, {165, 78}, {167, 71},
+ {142, 188}, {171, 100}, {250, 216}, {200, 72}, {200, 72},
+ {101, 82}, { 67, 93}, {133, 87}, {123, 220}, {199, 129},
+ {188, 192}, {102, 82}, {188, 192}, { 99, 170}, { 68, 126},
+ {159, 130}, {102, 116}, {207, 157}, {130, 141}, {236, 100},
+ {102, 197}, {141, 186}, {200, 102}, {221, 220}, {222, 188},
+ {135, 93}, {134, 145}, { 96, 224}, {128, 224}, {160, 224},
+ {192, 224}, {224, 224}, {240, 224}, {256, 224}, { 0, 0}
+};
+
+static const BBRect kVerbRects[6] = {
+ {-32, -2, 19, 27}, {-33, -33, 19, 27}, { 12, -2, 19, 27},
+ { 13, -33, 19, 27}, {-10, 8, 19, 27}, {-11, -49, 19, 27}
+};
+
+static const byte kTurnTbl[] = {
+ 2, 6, 4, 0, 2, 6, 4, 0,
+ 3, 1, 5, 7, 0, 0, 0, 0
+};
+
+bool WalkArea::contains(const Common::Point &pt) const {
+ return Common::Rect(x, y, x + width, y + height).contains(pt);
+}
+
+BbvsEngine::BbvsEngine(OSystem *syst, const ADGameDescription *gd) :
+ Engine(syst), _gameDescription(gd) {
+
+ _random = new Common::RandomSource("bbvs");
+ _currActionCommandIndex = -1;
+ _buttheadObject = nullptr;
+ _beavisObject = nullptr;
+ _currCameraNum = 0;
+ _walkAreasCount = 0;
+ _walkInfosCount = 0;
+ _walkableRectsCount = 0;
+ _sourceWalkArea = nullptr;
+ _destWalkArea = nullptr;
+ _currWalkDistance = kMaxDistance;
+ _walkReachedDestArea = false;
+ _hasSnapshot = false;
+ _snapshot = nullptr;
+ _snapshotStream = nullptr;
+ _isSaveAllowed = false;
+
+ for (int i = 0; i < 80; i++) {
+ _walkAreas[i].x = 0;
+ _walkAreas[i].y = 0;
+ _walkAreas[i].width = 0;
+ _walkAreas[i].height = 0;
+ _walkAreas[i].checked = false;
+ _walkAreas[i].linksCount = 0;
+ for (int j = 0; j < 16; j++)
+ _walkAreas[i].links[j] = nullptr;
+ for (int j = 0; j < 32; j++) {
+ _walkAreas[i].linksD1[j] = nullptr;
+ _walkAreas[i].linksD2[j] = nullptr;
+ }
+ }
+
+ for (int i = 0; i < 256; i++) {
+ _walkInfoPtrs[i] = nullptr;
+ }
+
+ Engine::syncSoundSettings();
+
+}
+
+BbvsEngine::~BbvsEngine() {
+
+ delete _random;
+
+}
+
+void BbvsEngine::newGame() {
+ _currInventoryItem = -1;
+ _newSceneNum = 32;
+}
+
+void BbvsEngine::continueGameFromQuickSave() {
+ _bootSaveSlot = 0;
+}
+
+void BbvsEngine::setNewSceneNum(int newSceneNum) {
+ _newSceneNum = newSceneNum;
+}
+
+Common::Error BbvsEngine::run() {
+
+ _isSaveAllowed = false;
+ _hasSnapshot = false;
+
+ initGraphics(320, 240, false);
+
+ _screen = new Screen(_system);
+ _gameModule = new GameModule();
+ _spriteModule = new SpriteModule();
+ _sound = new SoundMan();
+
+ allocSnapshot();
+ memset(_easterEggInput, 0, sizeof(_easterEggInput));
+
+ _gameTicks = 0;
+ _playVideoNumber = 0;
+ _bootSaveSlot = -1;
+
+ memset(_inventoryItemStatus, 0, sizeof(_inventoryItemStatus));
+ memset(_gameVars, 0, sizeof(_gameVars));
+ memset(_sceneVisited, 0, sizeof(_sceneVisited));
+
+ _mouseX = 160;
+ _mouseY = 120;
+ _mouseButtons = 0;
+
+ _currVerbNum = kVerbLook;
+ _currInventoryItem = -1;
+ _currTalkObjectIndex = -1;
+ _currSceneNum = 0;
+ _newSceneNum = 31;
+
+ if (ConfMan.hasKey("save_slot"))
+ _bootSaveSlot = ConfMan.getInt("save_slot");
+
+ while (!shouldQuit()) {
+ updateEvents();
+ if (_currSceneNum < kMainMenu || _newSceneNum > 0 || _bootSaveSlot >= 0)
+ updateGame();
+ else if (_currSceneNum == kMainMenu)
+ runMainMenu();
+ else if (_currSceneNum == kCredits &&
+ (_mouseButtons & kAnyButtonClicked)) {
+ _mouseButtons &= ~kAnyButtonClicked;
+ _newSceneNum = kMainMenu;
+ }
+ if (_playVideoNumber > 0) {
+ playVideo(_playVideoNumber);
+ _playVideoNumber = 0;
+ }
+ }
+
+ writeContinueSavegame();
+
+ freeSnapshot();
+
+ delete _sound;
+ delete _spriteModule;
+ delete _gameModule;
+ delete _screen;
+
+ return Common::kNoError;
+}
+
+bool BbvsEngine::hasFeature(EngineFeature f) const {
+ return
+ (f == kSupportsRTL) ||
+ (f == kSupportsLoadingDuringRuntime) ||
+ (f == kSupportsSavingDuringRuntime);
+}
+
+void BbvsEngine::updateEvents() {
+ Common::Event event;
+
+ while (_eventMan->pollEvent(event)) {
+ switch (event.type) {
+ case Common::EVENT_KEYDOWN:
+ _keyCode = event.kbd.keycode;
+ break;
+ case Common::EVENT_KEYUP:
+ checkEasterEgg(event.kbd.ascii);
+ _keyCode = Common::KEYCODE_INVALID;
+ break;
+ case Common::EVENT_MOUSEMOVE:
+ _mouseX = event.mouse.x;
+ _mouseY = event.mouse.y;
+ break;
+ case Common::EVENT_LBUTTONDOWN:
+ _mouseButtons |= kLeftButtonClicked;
+ _mouseButtons |= kLeftButtonDown;
+ break;
+ case Common::EVENT_LBUTTONUP:
+ _mouseButtons &= ~kLeftButtonDown;
+ break;
+ case Common::EVENT_RBUTTONDOWN:
+ _mouseButtons |= kRightButtonClicked;
+ _mouseButtons |= kRightButtonDown;
+ break;
+ case Common::EVENT_RBUTTONUP:
+ _mouseButtons &= ~kRightButtonDown;
+ break;
+ case Common::EVENT_QUIT:
+ quitGame();
+ break;
+ default:
+ break;
+ }
+ }
+}
+
+int BbvsEngine::getRandom(int max) {
+ return max == 0 ? 0 : _random->getRandomNumber(max - 1);
+}
+
+void BbvsEngine::drawDebugInfo() {
+#if 0
+ Graphics::Surface *s = _screen->_surface;
+ const Graphics::Font *font = FontMan.getFontByUsage(Graphics::FontManager::kConsoleFont);
+ for (int i = 0; i < _walkAreasCount; ++i) {
+ WalkArea *walkArea = &_walkAreas[i];
+ Common::Rect r(walkArea->x, walkArea->y, walkArea->x + walkArea->width, walkArea->y + walkArea->height);
+ s->frameRect(r, 255);
+ Common::String text = Common::String::format("%d", i);
+ font->drawString(s, text, r.left + 1, r.top + 1, 100, 11);
+ }
+#endif
+}
+
+void BbvsEngine::drawScreen() {
+ drawDebugInfo();
+ _screen->copyToScreen();
+}
+
+void BbvsEngine::updateGame() {
+ int inputTicks;
+
+ if (_gameTicks > 0) {
+ int currTicks = _system->getMillis();
+ inputTicks = (currTicks - _gameTicks) / 17;
+ _gameTicks = currTicks - (currTicks - _gameTicks) % 17;
+ } else {
+ inputTicks = 1;
+ _gameTicks = _system->getMillis();
+ }
+
+ if (inputTicks > 20) {
+ inputTicks = 20;
+ _gameTicks = _system->getMillis();
+ }
+
+ if (inputTicks == 0)
+ return;
+
+ if (_mouseX >= 320 || _mouseY >= 240) {
+ _mouseY = -1;
+ _mouseX = -1;
+ }
+
+ bool done;
+
+ do {
+ done = !update(_mouseX, _mouseY, _mouseButtons, _keyCode);
+ _mouseButtons &= ~kLeftButtonClicked;
+ _mouseButtons &= ~kRightButtonClicked;
+ _keyCode = Common::KEYCODE_INVALID;
+ } while (--inputTicks && _playVideoNumber == 0 && _gameTicks > 0 && !done);
+
+ if (!done && _playVideoNumber == 0 && _gameTicks > 0) {
+ DrawList drawList;
+ buildDrawList(drawList);
+ _screen->drawDrawList(drawList, _spriteModule);
+ drawScreen();
+ }
+
+ _system->delayMillis(10);
+
+}
+
+void BbvsEngine::updateBackgroundSounds() {
+ for (int i = 0; i < _gameModule->getSceneSoundsCount(); ++i) {
+ SceneSound *sceneSound = _gameModule->getSceneSound(i);
+ bool isActive = evalCondition(sceneSound->conditions);
+ debug(5, "bgSound(%d) isActive: %d; soundNum: %d", i, isActive, sceneSound->soundNum);
+ if (isActive && !_backgroundSoundsActive[i]) {
+ playSound(sceneSound->soundNum, true);
+ _backgroundSoundsActive[i] = 1;
+ } else if (!isActive && _backgroundSoundsActive[i]) {
+ stopSound(sceneSound->soundNum);
+ _backgroundSoundsActive[i] = 0;
+ }
+ }
+}
+
+bool BbvsEngine::update(int mouseX, int mouseY, uint mouseButtons, Common::KeyCode keyCode) {
+
+ if (_bootSaveSlot >= 0) {
+ loadGameState(_bootSaveSlot);
+ _gameTicks = 0;
+ _bootSaveSlot = -1;
+ return false;
+ }
+
+ if (_newSceneNum != 0) {
+ _gameTicks = 0;
+ return changeScene();
+ }
+
+ _mousePos.x = mouseX + _cameraPos.x;
+ _mousePos.y = mouseY + _cameraPos.y;
+
+ switch (_gameState) {
+
+ case kGSScene:
+ _isSaveAllowed = true;
+ saveSnapshot();
+ if (mouseButtons & kRightButtonDown) {
+ _verbPos = _mousePos;
+ if (_mousePos.x - _cameraPos.x < 33)
+ _verbPos.x = _cameraPos.x + 33;
+ if (_verbPos.x - _cameraPos.x > 287)
+ _verbPos.x = _cameraPos.x + 287;
+ if (_verbPos.y - _cameraPos.y < 51)
+ _verbPos.y = _cameraPos.y + 51;
+ if (_verbPos.y - _cameraPos.y > 208)
+ _verbPos.y = _cameraPos.y + 208;
+ _gameState = kGSVerbs;
+ } else {
+ switch (keyCode) {
+ case Common::KEYCODE_SPACE:
+ case Common::KEYCODE_i:
+ _inventoryButtonIndex = -1;
+ _gameState = kGSInventory;
+ return true;
+ case Common::KEYCODE_l:
+ _currVerbNum = kVerbLook;
+ break;
+ case Common::KEYCODE_t:
+ _currVerbNum = kVerbTalk;
+ break;
+ case Common::KEYCODE_u:
+ _currVerbNum = kVerbUse;
+ break;
+ case Common::KEYCODE_w:
+ _currVerbNum = kVerbWalk;
+ break;
+ default:
+ break;
+ }
+ updateScene(mouseButtons & kLeftButtonClicked);
+ updateCommon();
+ }
+ break;
+
+ case kGSInventory:
+ _isSaveAllowed = true;
+ saveSnapshot();
+ if (mouseButtons & kRightButtonClicked)
+ _currVerbNum = kVerbUse;
+ switch (keyCode) {
+ case Common::KEYCODE_SPACE:
+ case Common::KEYCODE_i:
+ _gameState = kGSScene;
+ stopSpeech();
+ return true;
+ case Common::KEYCODE_l:
+ _currVerbNum = kVerbLook;
+ break;
+ case Common::KEYCODE_u:
+ _currVerbNum = kVerbUse;
+ break;
+ default:
+ break;
+ }
+ updateInventory(mouseButtons & kLeftButtonClicked);
+ break;
+
+ case kGSVerbs:
+ _isSaveAllowed = false;
+ updateVerbs();
+ if (!(mouseButtons & kRightButtonDown)) {
+ if (_currVerbNum == kVerbShowInv) {
+ _inventoryButtonIndex = -1;
+ _gameState = kGSInventory;
+ } else {
+ _gameState = kGSScene;
+ }
+ }
+ break;
+
+ case kGSWait:
+ case kGSWaitDialog:
+ _isSaveAllowed = false;
+ _activeItemType = kITEmpty;
+ _activeItemIndex = 0;
+ _mouseCursorSpriteIndex = _gameModule->getGuiSpriteIndex(9);
+ if (keyCode == Common::KEYCODE_ESCAPE)
+ skipCurrAction();
+ else
+ updateCommon();
+ break;
+
+ case kGSDialog:
+ _isSaveAllowed = true;
+ saveSnapshot();
+ updateDialog(mouseButtons & kLeftButtonClicked);
+ updateCommon();
+ break;
+
+ }
+
+ return true;
+}
+
+void BbvsEngine::buildDrawList(DrawList &drawList) {
+
+ if (_gameState == kGSInventory) {
+
+ // Inventory background
+ drawList.add(_gameModule->getGuiSpriteIndex(15), 0, 0, 0);
+
+ // Inventory button
+ if (_inventoryButtonIndex == 0)
+ drawList.add(_gameModule->getGuiSpriteIndex(18 + 0), 97, 13, 1);
+ else if (_inventoryButtonIndex == 1)
+ drawList.add(_gameModule->getGuiSpriteIndex(18 + 1), 135, 15, 1);
+ else if (_inventoryButtonIndex == 2)
+ drawList.add(_gameModule->getGuiSpriteIndex(18 + 2), 202, 13, 1);
+
+ // Inventory items
+ int currItem = -1;
+ if (_currVerbNum == kVerbInvItem)
+ currItem = _currInventoryItem;
+ for (int i = 0; i < 50; ++i)
+ if (_inventoryItemStatus[i] && currItem != i)
+ drawList.add(_gameModule->getInventoryItemSpriteIndex(i * 2), kInventorySlotPositions[i].x, kInventorySlotPositions[i].y, 1);
+
+ } else {
+
+ // Scene objects
+ for (int i = 0; i < _gameModule->getSceneObjectDefsCount(); ++i) {
+ SceneObject *sceneObject = &_sceneObjects[i];
+ Animation *anim = sceneObject->anim;
+ if (anim) {
+ drawList.add(anim->frameSpriteIndices[sceneObject->frameIndex],
+ (sceneObject->x >> 16) - _cameraPos.x, (sceneObject->y >> 16) - _cameraPos.y,
+ sceneObject->y >> 16);
+ }
+ }
+
+ // Background objects
+ for (int i = 0; i < _gameModule->getBgSpritesCount(); ++i)
+ drawList.add(_gameModule->getBgSpriteIndex(i), -_cameraPos.x, -_cameraPos.y, _gameModule->getBgSpritePriority(i));
+
+ if (_gameState == kGSVerbs) {
+ // Verbs icon background
+ for (int i = 0; i < 6; ++i) {
+ if (i != 4) {
+ int index = (i == _activeItemIndex) ? 17 : 16;
+ drawList.add(_gameModule->getGuiSpriteIndex(index), _verbPos.x + kVerbRects[i].x - _cameraPos.x,
+ _verbPos.y + kVerbRects[i].y - _cameraPos.y, 499);
+ }
+ }
+ // Verbs background
+ drawList.add(_gameModule->getGuiSpriteIndex(13), _verbPos.x - _cameraPos.x,
+ _verbPos.y - _cameraPos.y, 500);
+ // Selected inventory item
+ if (_currInventoryItem >= 0) {
+ drawList.add(_gameModule->getInventoryItemSpriteIndex(2 * _currInventoryItem), _verbPos.x - _cameraPos.x,
+ _verbPos.y - _cameraPos.y + 27, 500);
+ }
+ }
+
+ if (_gameState == kGSDialog) {
+ // Dialog background
+ drawList.add(_gameModule->getGuiSpriteIndex(14), 0, 0, 500);
+ // Dialog icons
+ int iconX = 16;
+ for (int i = 0; i < 50; ++i)
+ if (_dialogItemStatus[i]) {
+ drawList.add(_gameModule->getDialogItemSpriteIndex(i), iconX, 36, 501);
+ iconX += 32;
+ }
+ }
+
+ }
+
+ // Mouse cursor
+ if (_mouseCursorSpriteIndex > 0 && _mousePos.x >= 0)
+ drawList.add(_mouseCursorSpriteIndex, _mousePos.x - _cameraPos.x, _mousePos.y - _cameraPos.y, 1000);
+
+}
+
+void BbvsEngine::updateVerbs() {
+
+ _activeItemIndex = 99;
+
+ if (_mousePos.x < 0) {
+ _mouseCursorSpriteIndex = 0;
+ return;
+ }
+
+ for (int i = 0; i < 6; ++i) {
+ const BBRect &verbRect = kVerbRects[i];
+ const int16 x = _verbPos.x + verbRect.x;
+ const int16 y = _verbPos.y + verbRect.y;
+ if (Common::Rect(x, y, x + verbRect.width, y + verbRect.height).contains(_mousePos)) {
+ if (i != kVerbInvItem || _currInventoryItem >= 0) {
+ _currVerbNum = i;
+ _activeItemIndex = i;
+ }
+ break;
+ }
+ }
+
+ switch (_currVerbNum) {
+ case kVerbLook:
+ case kVerbUse:
+ case kVerbTalk:
+ case kVerbWalk:
+ _mouseCursorSpriteIndex = _gameModule->getGuiSpriteIndex(2 * _currVerbNum);
+ break;
+ case kVerbInvItem:
+ _mouseCursorSpriteIndex = _gameModule->getInventoryItemSpriteIndex(2 * _currInventoryItem);
+ break;
+ case kVerbShowInv:
+ _mouseCursorSpriteIndex = _gameModule->getGuiSpriteIndex(8);
+ break;
+ }
+
+}
+
+void BbvsEngine::updateDialog(bool clicked) {
+
+ if (_mousePos.x < 0) {
+ _mouseCursorSpriteIndex = 0;
+ _activeItemType = 0;
+ return;
+ }
+
+ if (_mousePos.y > 32) {
+ _mouseCursorSpriteIndex = _gameModule->getGuiSpriteIndex(10);
+ _activeItemIndex = 0;
+ _activeItemType = kITEmpty;
+ if (clicked)
+ _gameState = kGSScene;
+ return;
+ }
+
+ int slotX = (_mousePos.x - _cameraPos.x) / 32;
+
+ if (slotX >= _dialogSlotCount) {
+ _mouseCursorSpriteIndex = _gameModule->getGuiSpriteIndex(4);
+ _activeItemType = kITEmpty;
+ _activeItemIndex = 0;
+ return;
+ }
+
+ _mouseCursorSpriteIndex = _gameModule->getGuiSpriteIndex(5);
+ _activeItemType = kITDialog;
+
+ // Find the selected dialog item index
+ for (int i = 0; i < 50 && slotX >= 0; ++i) {
+ if (_dialogItemStatus[i]) {
+ --slotX;
+ _activeItemIndex = i;
+ }
+ }
+
+ // Select the dialog item action if it was clicked
+ if (clicked) {
+ for (int i = 0; i < _gameModule->getActionsCount(); ++i) {
+ Action *action = _gameModule->getAction(i);
+ if (evalCondition(action->conditions)) {
+ _mouseCursorSpriteIndex = 0;
+ _gameState = kGSWaitDialog;
+ _currAction = action;
+ break;
+ }
+ }
+ }
+
+}
+
+void BbvsEngine::updateInventory(bool clicked) {
+
+ Common::Rect kInvButtonRects[3] = {
+ Common::Rect(97, 13, 97 + 20, 13 + 26),
+ Common::Rect(135, 15, 135 + 46, 15 + 25),
+ Common::Rect(202, 13, 202 + 20, 13 + 26)};
+
+ if (_mousePos.x < 0) {
+ _mouseCursorSpriteIndex = 0;
+ _activeItemType = 0;
+ return;
+ }
+
+ if (_currVerbNum != kVerbLook && _currVerbNum != kVerbUse && _currVerbNum != kVerbInvItem)
+ _currVerbNum = kVerbUse;
+
+ const int16 mx = _mousePos.x - _cameraPos.x;
+ const int16 my = _mousePos.y - _cameraPos.y;
+
+ // Check inventory exit left/right edge of screen
+ if (mx < 40 || mx > 280) {
+ _mouseCursorSpriteIndex = _gameModule->getGuiSpriteIndex(10);
+ _activeItemIndex = 0;
+ _activeItemType = kITEmpty;
+ if (clicked) {
+ _gameState = kGSScene;
+ stopSpeech();
+ }
+ return;
+ }
+
+ // Check hovered/clicked inventory button
+ _inventoryButtonIndex = -1;
+ if (kInvButtonRects[0].contains(mx, my)) {
+ _inventoryButtonIndex = 0;
+ if (clicked)
+ _currVerbNum = kVerbLook;
+ } else if (kInvButtonRects[2].contains(mx, my)) {
+ _inventoryButtonIndex = 2;
+ if (clicked)
+ _currVerbNum = kVerbUse;
+ } else if (kInvButtonRects[1].contains(mx, my)) {
+ _inventoryButtonIndex = 1;
+ _mouseCursorSpriteIndex = _gameModule->getGuiSpriteIndex(10);
+ _activeItemIndex = 0;
+ _activeItemType = kITEmpty;
+ if (clicked) {
+ _gameState = kGSScene;
+ stopSpeech();
+ }
+ return;
+ }
+
+ // Find hovered/clicked inventory item
+
+ int currItem = -1;
+
+ if (_currVerbNum == kVerbInvItem)
+ currItem = _currInventoryItem;
+
+ _activeItemType = kITEmpty;
+
+ for (int i = 0; i < 50; ++i) {
+ if (_inventoryItemStatus[i] && i != currItem) {
+ InventoryItemInfo *info = _gameModule->getInventoryItemInfo(i);
+ const int16 sx = kInventorySlotPositions[i].x + info->xOffs;
+ const int16 sy = kInventorySlotPositions[i].y + info->yOffs;
+ if (Common::Rect(sx, sy, sx + info->width, sy + info->height).contains(mx, my)) {
+ _activeItemType = kITInvItem;
+ _activeItemIndex = i;
+ break;
+ }
+ }
+ }
+
+ // Update mouse cursor and select inventory item if clicked
+
+ if (_activeItemType == kITInvItem) {
+ if (clicked) {
+ if (_currVerbNum == kVerbLook) {
+ stopSpeech();
+ playSpeech(_activeItemIndex + 10000);
+ } else if (_currVerbNum == kVerbUse) {
+ _currInventoryItem = _activeItemIndex;
+ _currVerbNum = kVerbInvItem;
+ _mouseCursorSpriteIndex = _gameModule->getInventoryItemSpriteIndex(2 * _activeItemIndex);
+ } else if (_currVerbNum == kVerbInvItem) {
+ if ((_currInventoryItem == 22 && _activeItemIndex == 39) ||
+ (_currInventoryItem == 39 && _activeItemIndex == 22)) {
+ _inventoryItemStatus[22] = 0;
+ _inventoryItemStatus[39] = 0;
+ _inventoryItemStatus[40] = 1;
+ _currVerbNum = kVerbInvItem;
+ _currInventoryItem = 40;
+ _mouseCursorSpriteIndex = _gameModule->getInventoryItemSpriteIndex(40);
+ }
+ if ((_currInventoryItem == 25 && _activeItemIndex == 26) ||
+ (_currInventoryItem == 26 && _activeItemIndex == 25)) {
+ _inventoryItemStatus[26] = 0;
+ _inventoryItemStatus[25] = 0;
+ _inventoryItemStatus[27] = 1;
+ _currVerbNum = kVerbInvItem;
+ _currInventoryItem = 27;
+ _mouseCursorSpriteIndex = _gameModule->getInventoryItemSpriteIndex(27);
+ }
+ }
+ } else {
+ if (_currVerbNum == kVerbLook)
+ _mouseCursorSpriteIndex = _gameModule->getGuiSpriteIndex(1);
+ else if (_currVerbNum == kVerbUse)
+ _mouseCursorSpriteIndex = _gameModule->getGuiSpriteIndex(3);
+ else if (_currVerbNum == kVerbInvItem)
+ _mouseCursorSpriteIndex = _gameModule->getInventoryItemSpriteIndex(2 * _currInventoryItem + 1);
+ }
+ } else {
+ if (_currVerbNum >= kVerbInvItem)
+ _mouseCursorSpriteIndex = _gameModule->getInventoryItemSpriteIndex(2 * _currInventoryItem);
+ else
+ _mouseCursorSpriteIndex = _gameModule->getGuiSpriteIndex(2 * _currVerbNum);
+ }
+
+}
+
+void BbvsEngine::updateScene(bool clicked) {
+
+ if (_mousePos.x < 0) {
+ _mouseCursorSpriteIndex = 0;
+ _activeItemType = kITNone;
+ return;
+ }
+
+ int lastPriority = 0;
+
+ _activeItemType = kITEmpty;
+
+ for (int i = 0; i < _gameModule->getSceneObjectDefsCount(); ++i) {
+ SceneObject *sceneObject = &_sceneObjects[i];
+ if (sceneObject->anim) {
+ Common::Rect frameRect = sceneObject->anim->frameRects1[sceneObject->frameIndex];
+ const int objY = sceneObject->y >> 16;
+ frameRect.translate(sceneObject->x >> 16, objY);
+ if (lastPriority <= objY && frameRect.width() > 0 && frameRect.contains(_mousePos)) {
+ lastPriority = objY;
+ _activeItemIndex = i;
+ _activeItemType = KITSceneObject;
+ }
+ }
+ }
+
+ for (int i = 0; i < _gameModule->getBgObjectsCount(); ++i) {
+ BgObject *bgObject = _gameModule->getBgObject(i);
+ if (lastPriority <= bgObject->rect.bottom && bgObject->rect.contains(_mousePos)) {
+ lastPriority = bgObject->rect.bottom;
+ _activeItemIndex = i;
+ _activeItemType = kITBgObject;
+ }
+ }
+
+ if (_currVerbNum >= kVerbInvItem)
+ _mouseCursorSpriteIndex = _gameModule->getInventoryItemSpriteIndex(2 * _currInventoryItem);
+ else
+ _mouseCursorSpriteIndex = _gameModule->getGuiSpriteIndex(2 * _currVerbNum);
+
+ bool checkMore = true;
+
+ if (_activeItemType == KITSceneObject || _activeItemType == kITBgObject) {
+ for (int i = 0; i < _gameModule->getActionsCount(); ++i) {
+ Action *action = _gameModule->getAction(i);
+ if (evalCondition(action->conditions)) {
+ checkMore = false;
+ if (clicked) {
+ _mouseCursorSpriteIndex = 0;
+ _gameState = kGSWait;
+ _currAction = action;
+ if (_currVerbNum == kVerbTalk)
+ _currTalkObjectIndex = _activeItemIndex;
+ if (_buttheadObject) {
+ _buttheadObject->walkDestPt.x = -1;
+ _buttheadObject->walkCount = 0;
+ }
+ } else {
+ if (_currVerbNum >= kVerbInvItem)
+ _mouseCursorSpriteIndex = _gameModule->getInventoryItemSpriteIndex(2 * _currInventoryItem + 1);
+ else
+ _mouseCursorSpriteIndex = _gameModule->getGuiSpriteIndex(2 * _currVerbNum + 1);
+ }
+ break;
+ }
+ }
+ }
+
+ // Test scroll arrow left
+ if (checkMore && _buttheadObject && _buttheadObject->anim && _mousePos.x - _cameraPos.x < 16 && _currCameraNum > 0) {
+ --_currCameraNum;
+ for (int i = 0; i < _gameModule->getActionsCount(); ++i) {
+ Action *action = _gameModule->getAction(i);
+ if (evalCameraCondition(action->conditions, _currCameraNum + 1)) {
+ checkMore = false;
+ if (clicked) {
+ _mouseCursorSpriteIndex = 0;
+ _gameState = kGSWait;
+ _currAction = action;
+ _buttheadObject->walkDestPt.x = -1;
+ _buttheadObject->walkCount = 0;
+ } else {
+ _activeItemType = kITScroll;
+ _mouseCursorSpriteIndex = _gameModule->getGuiSpriteIndex(12);
+ }
+ break;
+ }
+ }
+ ++_currCameraNum;
+ }
+
+ // Test scroll arrow right
+ if (checkMore && _buttheadObject && _buttheadObject->anim && _mousePos.x - _cameraPos.x >= 304 && _currCameraNum < 4) {
+ ++_currCameraNum;
+ for (int i = 0; i < _gameModule->getActionsCount(); ++i) {
+ Action *action = _gameModule->getAction(i);
+ if (evalCameraCondition(action->conditions, _currCameraNum - 1)) {
+ checkMore = false;
+ if (clicked) {
+ _mouseCursorSpriteIndex = 0;
+ _gameState = kGSWait;
+ _currAction = action;
+ _buttheadObject->walkDestPt.x = -1;
+ _buttheadObject->walkCount = 0;
+ } else {
+ _activeItemType = kITScroll;
+ _mouseCursorSpriteIndex = _gameModule->getGuiSpriteIndex(11);
+ }
+ break;
+ }
+ }
+ --_currCameraNum;
+ }
+
+ if (checkMore && _buttheadObject && _buttheadObject->anim) {
+ _walkMousePos = _mousePos;
+
+ while (1) {
+ int foundIndex = -1;
+
+ for (int i = 0; i < _walkableRectsCount; ++i)
+ if (_walkableRects[i].contains(_walkMousePos)) {
+ foundIndex = i;
+ break;
+ }
+
+ if (foundIndex >= 0) {
+ if (_walkMousePos.y != _mousePos.y)
+ _walkMousePos.y = _walkableRects[foundIndex].top;
+ break;
+ } else {
+ _walkMousePos.y += 4;
+ if (_walkMousePos.y >= 240)
+ break;
+ }
+
+ }
+
+ if (_beavisObject->anim) {
+ Common::Rect frameRect = _beavisObject->anim->frameRects2[_beavisObject->frameIndex];
+ frameRect.translate(_beavisObject->x >> 16, (_beavisObject->y >> 16) + 1);
+ if (!frameRect.isEmpty() && frameRect.contains(_walkMousePos))
+ _walkMousePos.y = frameRect.bottom;
+ }
+
+ if (_walkMousePos.y < 240 && canButtheadWalkToDest(_walkMousePos)) {
+ if (clicked) {
+ _buttheadObject->walkDestPt = _walkMousePos;
+ _buttheadObject->walkCount = 0;
+ }
+ for (int i = 0; i < _gameModule->getSceneExitsCount(); ++i) {
+ SceneExit *sceneExit = _gameModule->getSceneExit(i);
+ if (sceneExit->rect.contains(_walkMousePos.x, _walkMousePos.y)) {
+ _activeItemIndex = i;
+ _activeItemType = kITSceneExit;
+ _mouseCursorSpriteIndex = _gameModule->getGuiSpriteIndex(10);
+ }
+ }
+ } else {
+ _walkMousePos.x = -1;
+ _walkMousePos.y = -1;
+ }
+
+ }
+
+}
+
+bool BbvsEngine::performActionCommand(ActionCommand *actionCommand) {
+ debug(5, "BbvsEngine::performActionCommand() cmd: %d", actionCommand->cmd);
+
+ switch (actionCommand->cmd) {
+
+ case kActionCmdStop:
+ stopSpeech();
+ return false;
+
+ case kActionCmdWalkObject:
+ {
+ SceneObject *sceneObject = &_sceneObjects[actionCommand->sceneObjectIndex];
+ debug(5, "[%s] walks from (%d, %d) to (%d, %d)", sceneObject->sceneObjectDef->name,
+ sceneObject->x >> 16, sceneObject->y >> 16, actionCommand->walkDest.x, actionCommand->walkDest.y);
+ walkObject(sceneObject, actionCommand->walkDest, actionCommand->param);
+ }
+ return true;
+
+ case kActionCmdMoveObject:
+ {
+ SceneObject *sceneObject = &_sceneObjects[actionCommand->sceneObjectIndex];
+ sceneObject->x = actionCommand->walkDest.x << 16;
+ sceneObject->y = actionCommand->walkDest.y << 16;
+ sceneObject->xIncr = 0;
+ sceneObject->yIncr = 0;
+ sceneObject->walkCount = 0;
+ }
+ return true;
+
+ case kActionCmdAnimObject:
+ {
+ SceneObject *sceneObject = &_sceneObjects[actionCommand->sceneObjectIndex];
+ if (actionCommand->param == 0) {
+ sceneObject->anim = 0;
+ sceneObject->animIndex = 0;
+ sceneObject->frameTicks = 0;
+ sceneObject->frameIndex = 0;
+ } else if (actionCommand->timeStamp != 0 || sceneObject->anim != _gameModule->getAnimation(actionCommand->param)) {
+ sceneObject->animIndex = actionCommand->param;
+ sceneObject->anim = _gameModule->getAnimation(actionCommand->param);
+ sceneObject->frameIndex = sceneObject->anim->frameCount - 1;
+ sceneObject->frameTicks = 1;
+ }
+ }
+ return true;
+
+ case kActionCmdSetCameraPos:
+ _currCameraNum = actionCommand->param;
+ _newCameraPos = _gameModule->getCameraInit(_currCameraNum)->cameraPos;
+ updateBackgroundSounds();
+ return true;
+
+ case kActionCmdPlaySpeech:
+ playSpeech(actionCommand->param);
+ return true;
+
+ case kActionCmdPlaySound:
+ playSound(actionCommand->param);
+ return true;
+
+ case kActionCmdStartBackgroundSound:
+ {
+ const uint soundIndex = _gameModule->getSceneSoundIndex(actionCommand->param);
+ if (!_backgroundSoundsActive[soundIndex]) {
+ _backgroundSoundsActive[soundIndex] = 1;
+ playSound(actionCommand->param, true);
+ }
+ }
+ return true;
+
+ case kActionCmdStopBackgroundSound:
+ {
+ const uint soundIndex = _gameModule->getSceneSoundIndex(actionCommand->param);
+ _backgroundSoundsActive[soundIndex] = 0;
+ stopSound(actionCommand->param);
+ }
+ return true;
+
+ default:
+ return true;
+
+ }
+
+}
+
+bool BbvsEngine::processCurrAction() {
+ bool actionsFinished = false;
+
+ if (_sceneObjectActions.size() == 0) {
+
+ for (uint i = 0; i < _currAction->actionCommands.size(); ++i) {
+ ActionCommand *actionCommand = &_currAction->actionCommands[i];
+ if (actionCommand->timeStamp != 0)
+ break;
+
+ if (actionCommand->cmd == kActionCmdMoveObject || actionCommand->cmd == kActionCmdAnimObject) {
+ SceneObjectAction *sceneObjectAction = 0;
+ // See if there's already an entry for the SceneObject
+ for (uint j = 0; j < _sceneObjectActions.size(); ++j)
+ if (_sceneObjectActions[j].sceneObjectIndex == actionCommand->sceneObjectIndex) {
+ sceneObjectAction = &_sceneObjectActions[j];
+ break;
+ }
+ // If not, add one
+ if (!sceneObjectAction) {
+ SceneObjectAction newSceneObjectAction;
+ newSceneObjectAction.sceneObjectIndex = actionCommand->sceneObjectIndex;
+ _sceneObjectActions.push_back(newSceneObjectAction);
+ sceneObjectAction = &_sceneObjectActions.back();
+ }
+ if (actionCommand->cmd == kActionCmdMoveObject) {
+ sceneObjectAction->walkDest = actionCommand->walkDest;
+ } else {
+ sceneObjectAction->animationIndex = actionCommand->param;
+ }
+ }
+
+ if (actionCommand->cmd == kActionCmdSetCameraPos) {
+ _currCameraNum = actionCommand->param;
+ _newCameraPos = _gameModule->getCameraInit(actionCommand->param)->cameraPos;
+ }
+
+ }
+
+ // Delete entries for SceneObjects without anim
+ for (uint i = 0; i < _sceneObjectActions.size();) {
+ if (!_sceneObjects[_sceneObjectActions[i].sceneObjectIndex].anim)
+ _sceneObjectActions.remove_at(i);
+ else
+ ++i;
+ }
+
+ // Prepare affected scene objects
+ for (uint i = 0; i < _sceneObjectActions.size(); ++i) {
+ _sceneObjects[_sceneObjectActions[i].sceneObjectIndex].walkCount = 0;
+ _sceneObjects[_sceneObjectActions[i].sceneObjectIndex].turnCount = 0;
+ }
+
+ }
+
+ actionsFinished = true;
+
+ // Update SceneObject actions (walk and turn)
+ for (uint i = 0; i < _sceneObjectActions.size(); ++i) {
+ SceneObjectAction *soAction = &_sceneObjectActions[i];
+ SceneObject *sceneObject = &_sceneObjects[soAction->sceneObjectIndex];
+ if (sceneObject->walkDestPt.x != -1) {
+ debug(5, "waiting for walk to finish");
+ actionsFinished = false;
+ } else if ((int16)(sceneObject->x >> 16) != soAction->walkDest.x || (int16)(sceneObject->y >> 16) != soAction->walkDest.y) {
+ debug(5, "starting to walk");
+ sceneObject->walkDestPt = soAction->walkDest;
+ actionsFinished = false;
+ } else if (sceneObject->walkCount == 0 && sceneObject->turnCount == 0) {
+ debug(5, "not walking");
+ for (int turnCount = 0; turnCount < 8; ++turnCount)
+ if (sceneObject->sceneObjectDef->animIndices[kWalkTurnTbl[turnCount]] == soAction->animationIndex && sceneObject->turnValue != turnCount) {
+ sceneObject->turnCount = turnCount | 0x80;
+ break;
+ }
+ }
+ if (sceneObject->turnCount)
+ actionsFinished = false;
+ }
+
+ if (actionsFinished)
+ _sceneObjectActions.clear();
+
+ return actionsFinished;
+}
+
+void BbvsEngine::skipCurrAction() {
+ ActionCommands &actionCommands = _currAction->actionCommands;
+ while (_currAction && _newSceneNum == 0)
+ updateCommon();
+ for (uint i = 0; i < actionCommands.size(); ++i)
+ if (actionCommands[i].cmd == kActionCmdPlaySound)
+ stopSound(actionCommands[i].param);
+ _system->delayMillis(250);
+ _gameTicks = 0;
+}
+
+void BbvsEngine::updateCommon() {
+
+ if (_currAction) {
+
+ bool doActionCommands = true;
+
+ if (_currActionCommandTimeStamp == 0) {
+ doActionCommands = processCurrAction();
+ _currActionCommandIndex = 0;
+ }
+
+ if (doActionCommands) {
+
+ ActionCommand *actionCommand = &_currAction->actionCommands[_currActionCommandIndex];
+
+ while (actionCommand->timeStamp == _currActionCommandTimeStamp &&
+ _currActionCommandIndex < (int)_currAction->actionCommands.size()) {
+ if (!performActionCommand(actionCommand)) {
+ _gameState = kGSScene;
+ evalActionResults(_currAction->results);
+ if (_gameState == kGSDialog)
+ updateDialogConditions();
+ _currAction = 0;
+ _currActionCommandTimeStamp = 0;
+ _currActionCommandIndex = -1;
+ updateSceneObjectsTurnValue();
+ updateWalkableRects();
+ break;
+ }
+ actionCommand = &_currAction->actionCommands[++_currActionCommandIndex];
+ }
+
+ if (_currAction) {
+ ++_currActionCommandTimeStamp;
+ } else {
+ _activeItemIndex = 0;
+ _mouseCursorSpriteIndex = 0;
+ _activeItemType = kITEmpty;
+ for (int i = 0; i < _gameModule->getActionsCount(); ++i) {
+ Action *action = _gameModule->getAction(i);
+ if (evalCondition(action->conditions)) {
+ _gameState = kGSWait;
+ _currAction = action;
+ }
+ }
+ }
+
+ }
+
+ }
+
+ for (int i = 0; i < _gameModule->getSceneObjectDefsCount(); ++i) {
+ SceneObject *sceneObject = &_sceneObjects[i];
+
+ if (sceneObject->walkDestPt.x != -1) {
+ if (sceneObject->walkCount == 0) {
+ debug(5, "[%s] needs to walk", sceneObject->sceneObjectDef->name);
+ startWalkObject(sceneObject);
+ if (sceneObject->walkCount == 0) {
+ debug(5, "no walk possible");
+ sceneObject->walkDestPt.x = -1;
+ sceneObject->walkDestPt.y = -1;
+ sceneObject->xIncr = 0;
+ sceneObject->yIncr = 0;
+ }
+ }
+ updateWalkObject(sceneObject);
+ }
+
+ if (sceneObject->walkCount > 0 && sceneObject->turnCount == 0) {
+ debug(5, "walk step, xIncr: %d, yIncr: %d", sceneObject->xIncr, sceneObject->yIncr);
+ sceneObject->x += sceneObject->xIncr;
+ sceneObject->y += sceneObject->yIncr;
+ --sceneObject->walkCount;
+ } else if (sceneObject->turnCount != 0) {
+ debug(5, "need turn, turnCount: %d", sceneObject->turnCount);
+ turnObject(sceneObject);
+ }
+
+ if (sceneObject == _buttheadObject && sceneObject->walkDestPt.x != -1) {
+ for (uint j = 0; j < _walkAreaActions.size(); ++j) {
+ if (_walkAreaActions[j] != _currAction && evalCondition(_walkAreaActions[j]->conditions)) {
+ _sceneObjectActions.clear();
+ _gameState = kGSWait;
+ _currAction = _walkAreaActions[j];
+ _currActionCommandTimeStamp = 0;
+ _currActionCommandIndex = -1;
+ for (int k = 0; k < _gameModule->getSceneObjectDefsCount(); ++k) {
+ SceneObject *sceneObject2 = &_sceneObjects[k];
+ sceneObject2->walkDestPt.x = -1;
+ sceneObject2->walkDestPt.y = -1;
+ sceneObject2->walkCount = 0;
+ }
+ break;
+ }
+ }
+ }
+
+ if (sceneObject->anim && --sceneObject->frameTicks == 0) {
+ if (++sceneObject->frameIndex >= sceneObject->anim->frameCount)
+ sceneObject->frameIndex = 0;
+ sceneObject->frameTicks = sceneObject->anim->frameTicks[sceneObject->frameIndex];
+ }
+
+ }
+
+ if (!_currAction && _buttheadObject) {
+ int16 buttheadX = _buttheadObject->x >> 16;
+ int16 buttheadY = _buttheadObject->y >> 16;
+ CameraInit *cameraInit = _gameModule->getCameraInit(_currCameraNum);
+ for (int i = 0; i < 8; ++i) {
+ if (cameraInit->rects[i].contains(buttheadX, buttheadY)) {
+ int newCameraNum = cameraInit->cameraLinks[i];
+ if (_currCameraNum != newCameraNum) {
+ int prevCameraNum = _currCameraNum;
+ _currCameraNum = newCameraNum;
+ _newCameraPos = _gameModule->getCameraInit(newCameraNum)->cameraPos;
+ for (int j = 0; j < _gameModule->getActionsCount(); ++j) {
+ Action *action = _gameModule->getAction(j);
+ if (evalCameraCondition(action->conditions, prevCameraNum)) {
+ _gameState = kGSWait;
+ _currAction = action;
+ _mouseCursorSpriteIndex = 0;
+ _buttheadObject->walkDestPt.x = -1;
+ _buttheadObject->walkCount = 0;
+ break;
+ }
+ }
+ updateBackgroundSounds();
+ }
+ }
+ }
+ }
+
+ if (_cameraPos.x < _newCameraPos.x)
+ ++_cameraPos.x;
+ if (_cameraPos.x > _newCameraPos.x)
+ --_cameraPos.x;
+ if (_cameraPos.y < _newCameraPos.y)
+ ++_cameraPos.y;
+ if (_cameraPos.y > _newCameraPos.y)
+ --_cameraPos.y;
+
+ // Check if Butthead is inside a scene exit
+ if (_newSceneNum == 0 && !_currAction && _buttheadObject) {
+ int16 buttheadX = _buttheadObject->x >> 16;
+ int16 buttheadY = _buttheadObject->y >> 16;
+ for (int i = 0; i < _gameModule->getSceneExitsCount(); ++i) {
+ SceneExit *sceneExit = _gameModule->getSceneExit(i);
+ if (sceneExit->rect.contains(buttheadX, buttheadY)) {
+ _newSceneNum = sceneExit->newModuleNum;
+ break;
+ }
+ }
+ }
+
+}
+
+void BbvsEngine::updateSceneObjectsTurnValue() {
+ for (int i = 0; i < _gameModule->getSceneObjectDefsCount(); ++i) {
+ SceneObject *sceneObject = &_sceneObjects[i];
+ sceneObject->turnValue = 0;
+ for (int j = 0; j < 12; ++j) {
+ if (sceneObject->sceneObjectDef->animIndices[j] == sceneObject->animIndex) {
+ sceneObject->turnValue = kTurnTbl[j];
+ break;
+ }
+ }
+ }
+}
+
+void BbvsEngine::updateDialogConditions() {
+ _dialogSlotCount = 0;
+ memset(_dialogItemStatus, 0, sizeof(_dialogItemStatus));
+ for (int i = 0; i < _gameModule->getActionsCount(); ++i) {
+ Action *action = _gameModule->getAction(i);
+ int slotIndex = evalDialogCondition(action->conditions);
+ if (slotIndex >= 0) {
+ _dialogItemStatus[slotIndex] = 1;
+ ++_dialogSlotCount;
+ }
+ }
+}
+
+void BbvsEngine::playSpeech(int soundNum) {
+ debug(5, "playSpeech(%0d)", soundNum);
+ Common::String sndFilename = Common::String::format("snd/snd%05d.aif", soundNum);
+ Common::File *fd = new Common::File();
+ fd->open(sndFilename);
+ Audio::AudioStream *audioStream = Audio::makeAIFFStream(fd, DisposeAfterUse::YES);
+ _mixer->playStream(Audio::Mixer::kSpeechSoundType, &_speechSoundHandle, audioStream);
+
+}
+
+void BbvsEngine::stopSpeech() {
+ _mixer->stopHandle(_speechSoundHandle);
+}
+
+void BbvsEngine::playSound(uint soundNum, bool loop) {
+ debug(5, "playSound(%0d)", soundNum);
+ for (uint i = 0; i < _gameModule->getPreloadSoundsCount(); ++i)
+ if (_gameModule->getPreloadSound(i) == soundNum) {
+ _sound->playSound(i, loop);
+ break;
+ }
+}
+
+void BbvsEngine::stopSound(uint soundNum) {
+ for (uint i = 0; i < _gameModule->getPreloadSoundsCount(); ++i)
+ if (_gameModule->getPreloadSound(i) == soundNum) {
+ _sound->stopSound(i);
+ break;
+ }
+}
+
+void BbvsEngine::stopSounds() {
+ _sound->stopAllSounds();
+}
+
+bool BbvsEngine::runMinigame(int minigameNum) {
+ debug(0, "BbvsEngine::runMinigame() minigameNum: %d", minigameNum);
+
+ bool fromMainGame = _currSceneNum != kMainMenu;
+
+ _sound->unloadSounds();
+
+ Minigame *minigame = 0;
+
+ switch (minigameNum) {
+ case kMinigameBbLoogie:
+ minigame = new MinigameBbLoogie(this);
+ break;
+ case kMinigameBbTennis:
+ minigame = new MinigameBbTennis(this);
+ break;
+ case kMinigameBbAnt:
+ minigame = new MinigameBbAnt(this);
+ break;
+ case kMinigameBbAirGuitar:
+ minigame = new MinigameBbAirGuitar(this);
+ break;
+ default:
+ error("Incorrect minigame number %d", minigameNum);
+ break;
+ }
+
+ bool minigameResult = minigame->run(fromMainGame);
+
+ delete minigame;
+
+ // Check if the principal was hit with a megaloogie in the loogie minigame
+ if (minigameNum == 0 && minigameResult)
+ _gameVars[42] = 1;
+
+#if 0
+ //DEBUG Fake it :)
+ if (minigameNum == 0)
+ _gameVars[42] = 1;
+#endif
+
+ return true;
+}
+
+void BbvsEngine::runMainMenu() {
+ MainMenu *mainMenu = new MainMenu(this);
+ mainMenu->runModal();
+ delete mainMenu;
+}
+
+void BbvsEngine::checkEasterEgg(char key) {
+
+ static const char * const kEasterEggStrings[] = {
+ "BOIDUTS",
+ "YNNIF",
+ "SKCUS",
+ "NAMTAH"
+ };
+
+ static const int kEasterEggLengths[] = {
+ 7, 5, 5, 6
+ };
+
+ if (_currSceneNum == kCredits) {
+ memcpy(&_easterEggInput[1], &_easterEggInput[0], 6);
+ _easterEggInput[0] = key;
+ for (int i = 0; i < ARRAYSIZE(kEasterEggStrings); ++i) {
+ if (!scumm_strnicmp(kEasterEggStrings[i], _easterEggInput, kEasterEggLengths[i])) {
+ _easterEggInput[0] = 0;
+ _newSceneNum = 100 + i;
+ break;
+ }
+ }
+ }
+
+}
+
+} // End of namespace Bbvs
diff --git a/engines/bbvs/bbvs.h b/engines/bbvs/bbvs.h
new file mode 100644
index 0000000000..6a9a13905c
--- /dev/null
+++ b/engines/bbvs/bbvs.h
@@ -0,0 +1,423 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+
+ * You should have received a copy of the GNU General Public 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 BBVS_BBVS_H
+#define BBVS_BBVS_H
+
+#include "audio/mixer.h"
+#include "audio/decoders/aiff.h"
+#include "common/array.h"
+#include "common/events.h"
+#include "common/file.h"
+#include "common/memstream.h"
+#include "common/random.h"
+#include "common/str.h"
+#include "common/substream.h"
+#include "common/system.h"
+#include "common/winexe.h"
+#include "common/winexe_pe.h"
+#include "engines/engine.h"
+
+struct ADGameDescription;
+
+namespace Bbvs {
+
+class ActionCommands;
+struct Action;
+class GameModule;
+struct Condition;
+struct Conditions;
+struct ActionResult;
+struct ActionResults;
+struct ActionCommand;
+struct CameraInit;
+struct SceneObjectDef;
+struct SceneObjectInit;
+struct SceneExit;
+struct Animation;
+struct SceneSound;
+class DrawList;
+class SpriteModule;
+class Screen;
+class SoundMan;
+
+#define BBVS_SAVEGAME_VERSION 0
+
+enum {
+ kVerbLook = 0,
+ kVerbUse = 1,
+ kVerbTalk = 2,
+ kVerbWalk = 3,
+ kVerbInvItem = 4,
+ kVerbShowInv = 5
+};
+
+enum {
+ kITNone = 0,
+ kITEmpty = 1,
+ KITSceneObject = 2,
+ kITBgObject = 3,
+ kITDialog = 4,
+ kITScroll = 5,
+ kITSceneExit = 6,
+ kITInvItem = 7
+};
+
+enum {
+ kGSScene = 0,
+ kGSInventory = 1,
+ kGSVerbs = 2,
+ kGSWait = 3,
+ kGSDialog = 4,
+ kGSWaitDialog = 5
+};
+
+enum {
+ kActionCmdStop = 0,
+ kActionCmdWalkObject = 3,
+ kActionCmdMoveObject = 4,
+ kActionCmdAnimObject = 5,
+ kActionCmdSetCameraPos = 7,
+ kActionCmdPlaySpeech = 8,
+ kActionCmdPlaySound = 10,
+ kActionCmdStartBackgroundSound = 11,
+ kActionCmdStopBackgroundSound = 12
+};
+
+enum {
+ kCondUnused = 1,
+ kCondSceneObjectVerb = 2,
+ kCondBgObjectVerb = 3,
+ kCondSceneObjectInventory = 4,
+ kCondBgObjectInventory = 5,
+ kCondHasInventoryItem = 6,
+ kCondHasNotInventoryItem = 7,
+ kCondIsGameVar = 8,
+ kCondIsNotGameVar = 9,
+ kCondIsPrevSceneNum = 10,
+ kCondIsCurrTalkObject = 11,
+ kCondIsDialogItem = 12,
+ kCondIsCameraNum = 13,
+ kCondIsNotPrevSceneNum = 14,
+ kCondDialogItem0 = 15,
+ kCondIsButtheadAtBgObject = 16,
+ kCondIsNotSceneVisited = 17,
+ kCondIsSceneVisited = 18,
+ kCondIsCameraNumTransition = 19
+};
+
+enum {
+ kActResAddInventoryItem = 1,
+ kActResRemoveInventoryItem = 2,
+ kActResSetGameVar = 3,
+ kActResUnsetGameVar = 4,
+ kActResStartDialog = 5,
+ kActResChangeScene = 6
+};
+
+enum {
+ kLeftButtonClicked = 1,
+ kRightButtonClicked = 2,
+ kLeftButtonDown = 4,
+ kRightButtonDown = 8,
+ kAnyButtonClicked = kLeftButtonClicked | kRightButtonClicked,
+ kAnyButtonDown = kLeftButtonDown | kRightButtonDown
+};
+
+struct BBPoint {
+ int16 x, y;
+};
+
+struct BBRect {
+ int16 x, y, width, height;
+};
+
+struct BBPolygon {
+ const BBPoint *points;
+ int pointsCount;
+};
+
+struct Rect {
+ int16 left, top, right, bottom;
+};
+
+struct SceneObject {
+ uint32 x, y;
+ SceneObjectDef *sceneObjectDef;
+ Animation *anim;
+ int animIndex;
+ int frameIndex;
+ int frameTicks;
+ int walkCount;
+ int xIncr, yIncr;
+ int turnValue, turnCount, turnTicks;
+ Common::Point walkDestPt;
+ SceneObject() : sceneObjectDef(0), anim(0) {
+ }
+};
+
+struct SceneObjectAction {
+ int sceneObjectIndex;
+ int animationIndex;
+ Common::Point walkDest;
+};
+
+struct WalkInfo {
+ int16 x, y;
+ int delta;
+ int direction;
+ Common::Point midPt;
+ int walkAreaIndex;
+};
+
+struct WalkArea {
+ int16 x, y, width, height;
+ bool checked;
+ int linksCount;
+ WalkArea *links[16];
+ WalkInfo *linksD1[32];
+ WalkInfo *linksD2[32];
+ bool contains(const Common::Point &pt) const;
+};
+
+const int kSnapshotSize = 23072;
+const int kSceneObjectsCount = 64;
+const int kSceneSoundsCount = 8;
+const int kInventoryItemStatusCount = 50;
+const int kDialogItemStatusCount = 50;
+const int kGameVarsCount = 2000;
+const int kSceneVisitedCount = 64;
+
+const int kMainMenu = 44;
+const int kCredits = 45;
+
+const int kMaxDistance = 0xFFFFFF;
+static const int8 kWalkTurnTbl[] = {
+ 7, 9, 4, 8, 6, 10, 5, 11
+};
+
+class BbvsEngine : public Engine {
+protected:
+ Common::Error run();
+ virtual bool hasFeature(EngineFeature f) const;
+public:
+ BbvsEngine(OSystem *syst, const ADGameDescription *gd);
+ ~BbvsEngine();
+ void newGame();
+ void continueGameFromQuickSave();
+ void setNewSceneNum(int newSceneNum);
+ const Common::String getTargetName() { return _targetName; }
+private:
+ const ADGameDescription *_gameDescription;
+ Graphics::PixelFormat _pixelFormat;
+public:
+ Common::RandomSource *_random;
+
+ GameModule *_gameModule;
+ SpriteModule *_spriteModule;
+ SoundMan *_sound;
+
+ Screen *_screen;
+
+ int _bootSaveSlot;
+
+ int _mouseX, _mouseY;
+ uint _mouseButtons;
+ Common::KeyCode _keyCode;
+
+ int _mouseCursorSpriteIndex;
+
+ int _gameState;
+ int _gameTicks;
+
+ Common::Point _mousePos;
+ Common::Point _verbPos;
+ Common::Point _walkMousePos;
+
+ int _activeItemType;
+ int _activeItemIndex;
+ int _currTalkObjectIndex;
+
+ Common::Point _cameraPos, _newCameraPos;
+
+ int _newSceneNum, _prevSceneNum, _currSceneNum;
+ int _playVideoNumber;
+
+ int _dialogSlotCount;
+ byte _dialogItemStatus[kDialogItemStatusCount];
+
+ byte _gameVars[kGameVarsCount];
+ byte _sceneVisited[kSceneVisitedCount];
+
+ int _currVerbNum;
+
+ int _currInventoryItem;
+ byte _inventoryItemStatus[kInventoryItemStatusCount];
+ int _inventoryButtonIndex;
+
+ Action *_currAction;
+ uint32 _currActionCommandTimeStamp;
+ int _currActionCommandIndex;
+
+ Common::Array<Action*> _walkAreaActions;
+
+ SceneObject _sceneObjects[kSceneObjectsCount];
+ Common::Array<SceneObjectAction> _sceneObjectActions;
+
+ SceneObject *_buttheadObject, *_beavisObject;
+ int _currCameraNum;
+
+ byte _backgroundSoundsActive[kSceneSoundsCount];
+ Audio::SoundHandle _speechSoundHandle;
+
+ int _walkAreasCount;
+ WalkArea _walkAreas[80];
+ int _walkInfosCount;
+ WalkInfo _walkInfos[256];
+ int _walkableRectsCount;
+ Common::Rect _walkableRects[256];
+ Common::Rect _tempWalkableRects1[256];
+ Common::Rect _tempWalkableRects2[256];
+ WalkInfo *_walkInfoPtrs[256];
+
+ WalkArea *_sourceWalkArea, *_destWalkArea;
+ Common::Point _sourceWalkAreaPt, _destWalkAreaPt, _finalWalkPt;
+ int _currWalkDistance;
+ bool _walkReachedDestArea;
+
+ bool _hasSnapshot;
+ byte *_snapshot;
+ Common::SeekableMemoryWriteStream *_snapshotStream;
+
+ char _easterEggInput[7];
+
+ void updateEvents();
+ int getRandom(int max);
+
+ void drawDebugInfo();
+ void drawScreen();
+
+ void updateGame();
+
+ bool evalCondition(Conditions &conditions);
+ bool evalCameraCondition(Conditions &conditions, int value);
+ int evalDialogCondition(Conditions &conditions);
+ void evalActionResults(ActionResults &results);
+
+ void updateBackgroundSounds();
+
+ void loadScene(int sceneNum);
+ void initScene(bool sounds);
+ bool changeScene();
+ bool update(int mouseX, int mouseY, uint mouseButtons, Common::KeyCode keyCode);
+
+ void buildDrawList(DrawList &drawList);
+
+ void updateVerbs();
+ void updateDialog(bool clicked);
+ void updateInventory(bool clicked);
+ void updateScene(bool clicked);
+
+ bool performActionCommand(ActionCommand *actionCommand);
+ bool processCurrAction();
+ void skipCurrAction();
+
+ void updateCommon();
+
+ void updateWalkableRects();
+ void startWalkObject(SceneObject *sceneObject);
+ void updateWalkObject(SceneObject *sceneObject);
+ void walkObject(SceneObject *sceneObject, const Common::Point &destPt, int walkSpeed);
+ void turnObject(SceneObject *sceneObject);
+
+ int rectSubtract(const Common::Rect &rect1, const Common::Rect &rect2, Common::Rect *outRects);
+
+ WalkInfo *addWalkInfo(int16 x, int16 y, int delta, int direction, int16 midPtX, int16 midPtY, int walkAreaIndex);
+ void initWalkAreas(SceneObject *sceneObject);
+ WalkArea *getWalkAreaAtPos(const Common::Point &pt);
+ bool canButtheadWalkToDest(const Common::Point &destPt);
+ void canWalkToDest(WalkArea *walkArea, int infoCount);
+ bool walkTestLineWalkable(const Common::Point &sourcePt, const Common::Point &destPt, WalkInfo *walkInfo);
+ void walkFindPath(WalkArea *sourceWalkArea, int infoCount);
+ int calcDistance(const Common::Point &pt1, const Common::Point &pt2);
+ void walkFoundPath(int count);
+
+ void updateSceneObjectsTurnValue();
+ void updateDialogConditions();
+
+ void playSpeech(int soundNum);
+ void stopSpeech();
+
+ void playSound(uint soundNum, bool loop = false);
+ void stopSound(uint soundNum);
+ void stopSounds();
+
+ bool runMinigame(int minigameNum);
+ void playVideo(int videoNum);
+
+ void runMainMenu();
+ void checkEasterEgg(char key);
+
+ // Savegame API
+
+ enum kReadSaveHeaderError {
+ kRSHENoError = 0,
+ kRSHEInvalidType = 1,
+ kRSHEInvalidVersion = 2,
+ kRSHEIoError = 3
+ };
+
+ struct SaveHeader {
+ Common::String description;
+ uint32 version;
+ byte gameID;
+ uint32 flags;
+ uint32 saveDate;
+ uint32 saveTime;
+ uint32 playTime;
+ Graphics::Surface *thumbnail;
+ };
+
+ bool _isSaveAllowed;
+
+ bool canLoadGameStateCurrently() { return _isSaveAllowed; }
+ bool canSaveGameStateCurrently() { return _isSaveAllowed; }
+ Common::Error loadGameState(int slot);
+ Common::Error saveGameState(int slot, const Common::String &description);
+ void savegame(const char *filename, const char *description);
+ void loadgame(const char *filename);
+ const char *getSavegameFilename(int num);
+ bool existsSavegame(int num);
+ static Common::String getSavegameFilename(const Common::String &target, int num);
+ static kReadSaveHeaderError readSaveHeader(Common::SeekableReadStream *in, bool loadThumbnail, SaveHeader &header);
+
+ void allocSnapshot();
+ void freeSnapshot();
+ void saveSnapshot();
+
+ void writeContinueSavegame();
+
+};
+
+} // End of namespace Bbvs
+
+#endif // BBVS_BBVS_H
diff --git a/engines/bbvs/configure.engine b/engines/bbvs/configure.engine
new file mode 100644
index 0000000000..c1dc1ef924
--- /dev/null
+++ b/engines/bbvs/configure.engine
@@ -0,0 +1,3 @@
+# This file is included from the main "configure" script
+# add_engine [name] [desc] [build-by-default] [subengines] [base games] [deps]
+add_engine bbvs "Beavis and Butthead in Virtual Stupidity" no
diff --git a/engines/bbvs/detection.cpp b/engines/bbvs/detection.cpp
new file mode 100644
index 0000000000..e7383163f5
--- /dev/null
+++ b/engines/bbvs/detection.cpp
@@ -0,0 +1,162 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+
+ * You should have received a copy of the GNU General Public 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 "bbvs/bbvs.h"
+
+#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"
+
+static const PlainGameDescriptor bbvsGames[] = {
+ { "bbvs", "Beavis and Butthead in Virtual Stupidity" },
+ { 0, 0 }
+};
+
+namespace Bbvs {
+
+static const ADGameDescription gameDescriptions[] = {
+ {
+ "bbvs",
+ 0,
+ AD_ENTRY1s("game0001.vnm", "637e5411751c7065bc385dd73d224561", 64004),
+ Common::EN_ANY,
+ Common::kPlatformWindows,
+ ADGF_NO_FLAGS,
+ GUIO0()
+ },
+
+ AD_TABLE_END_MARKER
+};
+
+} // End of namespace Bbvs
+
+static const char * const directoryGlobs[] = {
+ "vnm",
+ 0
+};
+
+class BbvsMetaEngine : public AdvancedMetaEngine {
+public:
+ BbvsMetaEngine() : AdvancedMetaEngine(Bbvs::gameDescriptions, sizeof(ADGameDescription), bbvsGames) {
+ _singleid = "bbvs";
+ _maxScanDepth = 3;
+ _directoryGlobs = directoryGlobs;
+ }
+
+ virtual const char *getName() const {
+ return "MTV's Beavis and Butt-Head in Virtual Stupidity";
+ }
+
+ virtual const char *getOriginalCopyright() const {
+ return "(C) 1995 Viacom New Media";
+ }
+
+ 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 BbvsMetaEngine::hasFeature(MetaEngineFeature f) const {
+ return
+ (f == kSupportsListSaves) ||
+ (f == kSupportsDeleteSave) ||
+ (f == kSupportsLoadingDuringStartup) ||
+ (f == kSavesSupportMetaInfo) ||
+ (f == kSavesSupportThumbnail) ||
+ (f == kSavesSupportCreationDate);
+}
+
+void BbvsMetaEngine::removeSaveState(const char *target, int slot) const {
+ Common::String fileName = Common::String::format("%s.%03d", target, slot);
+ g_system->getSavefileManager()->removeSavefile(fileName);
+}
+
+int BbvsMetaEngine::getMaximumSaveSlot() const {
+ return 999;
+}
+
+SaveStateList BbvsMetaEngine::listSaves(const char *target) const {
+ Common::SaveFileManager *saveFileMan = g_system->getSavefileManager();
+ Bbvs::BbvsEngine::SaveHeader header;
+ Common::String pattern = target;
+ pattern += ".???";
+ Common::StringArray filenames;
+ filenames = saveFileMan->listSavefiles(pattern.c_str());
+ Common::sort(filenames.begin(), filenames.end()); // Sort (hopefully ensuring we are sorted numerically..)
+ SaveStateList saveList;
+ for (Common::StringArray::const_iterator file = filenames.begin(); file != filenames.end(); ++file) {
+ // Obtain the last 3 digits of the filename, since they correspond to the save slot
+ int slotNum = atoi(file->c_str() + file->size() - 3);
+ if (slotNum >= 0 && slotNum <= 999) {
+ Common::InSaveFile *in = saveFileMan->openForLoading(file->c_str());
+ if (in) {
+ if (Bbvs::BbvsEngine::readSaveHeader(in, false, header) == Bbvs::BbvsEngine::kRSHENoError) {
+ saveList.push_back(SaveStateDescriptor(slotNum, header.description));
+ }
+ delete in;
+ }
+ }
+ }
+ return saveList;
+}
+
+SaveStateDescriptor BbvsMetaEngine::querySaveMetaInfos(const char *target, int slot) const {
+ Common::String filename = Bbvs::BbvsEngine::getSavegameFilename(target, slot);
+ Common::InSaveFile *in = g_system->getSavefileManager()->openForLoading(filename.c_str());
+ if (in) {
+ Bbvs::BbvsEngine::SaveHeader header;
+ Bbvs::BbvsEngine::kReadSaveHeaderError error;
+ error = Bbvs::BbvsEngine::readSaveHeader(in, true, header);
+ delete in;
+ if (error == Bbvs::BbvsEngine::kRSHENoError) {
+ SaveStateDescriptor desc(slot, header.description);
+ // Slot 0 is used for the "Continue" save
+ desc.setDeletableFlag(slot != 0);
+ desc.setWriteProtectedFlag(slot == 0);
+ desc.setThumbnail(header.thumbnail);
+ desc.setSaveDate(header.saveDate & 0xFFFF, (header.saveDate >> 16) & 0xFF, (header.saveDate >> 24) & 0xFF);
+ desc.setSaveTime((header.saveTime >> 16) & 0xFF, (header.saveTime >> 8) & 0xFF);
+ desc.setPlayTime(header.playTime * 1000);
+ return desc;
+ }
+ }
+ return SaveStateDescriptor();
+}
+
+bool BbvsMetaEngine::createInstance(OSystem *syst, Engine **engine, const ADGameDescription *desc) const {
+ if (desc) {
+ *engine = new Bbvs::BbvsEngine(syst, desc);
+ }
+ return desc != 0;
+}
+
+#if PLUGIN_ENABLED_DYNAMIC(BBVS)
+ REGISTER_PLUGIN_DYNAMIC(BBVS, PLUGIN_TYPE_ENGINE, BbvsMetaEngine);
+#else
+ REGISTER_PLUGIN_STATIC(BBVS, PLUGIN_TYPE_ENGINE, BbvsMetaEngine);
+#endif
diff --git a/engines/bbvs/dialogs.cpp b/engines/bbvs/dialogs.cpp
new file mode 100644
index 0000000000..5247a58ec8
--- /dev/null
+++ b/engines/bbvs/dialogs.cpp
@@ -0,0 +1,182 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+
+ * You should have received a copy of the GNU General Public 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 "bbvs/dialogs.h"
+#include "common/events.h"
+#include "gui/gui-manager.h"
+#include "gui/ThemeEval.h"
+
+namespace Bbvs {
+
+struct MenuButton {
+ const char *label;
+ uint32 cmd;
+};
+
+static const MenuButton kMenuButtons[] = {
+ // Main menu
+ {"New Game", kCmdNewGame},
+ {"Continue", kCmdContinue},
+ {"Options", kCmdOptions},
+ {"Mini Games", kCmdMiniGames},
+ {"Quit", kCmdQuit},
+ // Options
+ {"Uninstall", kCmdUninstall},
+ {"Credits", kCmdCredits},
+ {"Opening", kCmdOpening},
+ {"Chicks 'n' Stuff", kCmdChicksNStuff},
+ {"Back ..", kCmdBack},
+ // Minigames
+ {"Hock-A-Loogie", kCmdHockALoogie},
+ {"Bug Justice", kCmdBugJustice},
+ {"Court Chaos", kCmdCourtChaos},
+ {"Air Guitar", kCmdAirGuitar},
+ {"Back ..", kCmdBack}
+};
+
+MainMenu::MainMenu(BbvsEngine *vm) : Dialog(0, 0, 1, 1), _vm(vm) {
+ init();
+}
+
+MainMenu::~MainMenu() {
+}
+
+void MainMenu::init() {
+ _buttons[0] = new GUI::ButtonWidget(this, 0, 0, 1, 1, "", 0, 0);
+ _buttons[1] = new GUI::ButtonWidget(this, 0, 0, 1, 1, "", 0, 0);
+ _buttons[2] = new GUI::ButtonWidget(this, 0, 0, 1, 1, "", 0, 0);
+ _buttons[3] = new GUI::ButtonWidget(this, 0, 0, 1, 1, "", 0, 0);
+ _buttons[4] = new GUI::ButtonWidget(this, 0, 0, 1, 1, "", 0, 0);
+ gotoMenuScreen(kMainMenuScr);
+}
+
+void MainMenu::reflowLayout() {
+ const int screenW = g_system->getOverlayWidth();
+ const int screenH = g_system->getOverlayHeight();
+
+ const int buttonWidth = screenW * 70 / 320;
+ const int buttonHeight = screenH * 14 / 240;
+ const int buttonPadding = screenW * 3 / 320;
+
+ _w = 2 * buttonWidth + buttonPadding;
+ _h = 3 * buttonHeight + 3 * buttonPadding;
+ _x = (screenW - _w) / 2;
+ _y = screenH - _h;
+
+ int x = 0, y = 0;
+
+ x = 0;
+ y = 0;
+ _buttons[0]->resize(x, y, buttonWidth, buttonHeight);
+ x += buttonWidth + buttonPadding;
+ _buttons[1]->resize(x, y, buttonWidth, buttonHeight);
+
+ x = 0;
+ y += buttonHeight + buttonPadding;
+ _buttons[2]->resize(x, y, buttonWidth, buttonHeight);
+ x += buttonWidth + buttonPadding;
+ _buttons[3]->resize(x, y, buttonWidth, buttonHeight);
+
+ x = (_w - buttonWidth) / 2; // Center the last button
+ y += buttonHeight + buttonPadding;
+ _buttons[4]->resize(x, y, buttonWidth, buttonHeight);
+
+ GUI::Dialog::reflowLayout();
+
+}
+
+void MainMenu::handleCommand(GUI::CommandSender *sender, uint32 command, uint32 data) {
+ switch (command) {
+ // Main menu
+ case kCmdNewGame:
+ close();
+ _vm->newGame();
+ break;
+ case kCmdContinue:
+ close();
+ _vm->continueGameFromQuickSave();
+ break;
+ case kCmdOptions:
+ gotoMenuScreen(kOptionsMenuScr);
+ break;
+ case kCmdMiniGames:
+ gotoMenuScreen(kMiniGamesMenuScr);
+ break;
+ case kCmdQuit:
+ close();
+ _vm->quitGame();
+ break;
+ // Options menu
+ case kCmdUninstall:
+ break;
+ case kCmdCredits:
+ gotoScene(45);
+ break;
+ case kCmdOpening:
+ gotoScene(43);
+ break;
+ case kCmdChicksNStuff:
+ gotoScene(41);
+ break;
+ // Minigames menu
+ case kCmdHockALoogie:
+ gotoScene(27);
+ break;
+ case kCmdBugJustice:
+ gotoScene(29);
+ break;
+ case kCmdCourtChaos:
+ gotoScene(28);
+ break;
+ case kCmdAirGuitar:
+ gotoScene(30);
+ break;
+ case kCmdBack:
+ gotoMenuScreen(kMainMenuScr);
+ break;
+ default:
+ Dialog::handleCommand(sender, command, data);
+ }
+}
+
+void MainMenu::gotoMenuScreen(int screen) {
+ for (int i = 0; i < 5; ++i) {
+ const MenuButton *btn = &kMenuButtons[screen * 5 + i];
+ _buttons[i]->setLabel(btn->label);
+ _buttons[i]->setCmd(btn->cmd);
+ _buttons[i]->setEnabled(btn->cmd != 0);
+ }
+ // Enable the "Continue" button if a savegame at slot 0 exists
+ if (screen == kMainMenuScr)
+ _buttons[1]->setEnabled(canContinue());
+}
+
+bool MainMenu::canContinue() {
+ return _vm->existsSavegame(0);
+}
+
+void MainMenu::gotoScene(int sceneNum) {
+ close();
+ _vm->setNewSceneNum(sceneNum);
+}
+
+} // End of namespace Hugo
diff --git a/engines/bbvs/dialogs.h b/engines/bbvs/dialogs.h
new file mode 100644
index 0000000000..2dce2a110b
--- /dev/null
+++ b/engines/bbvs/dialogs.h
@@ -0,0 +1,81 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+
+ * You should have received a copy of the GNU General Public 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 BBVS_DIALOGS_H
+#define BBVS_DIALOGS_H
+
+#include "bbvs/bbvs.h"
+#include "gui/dialog.h"
+#include "gui/widgets/edittext.h"
+
+namespace Bbvs {
+
+enum {
+ // Main menu
+ kCmdNewGame = 'NEWG',
+ kCmdContinue = 'CONT',
+ kCmdOptions = 'OPTN',
+ kCmdMiniGames = 'MINI',
+ kCmdQuit = 'QUIT',
+ // Options
+ kCmdUninstall = 0,
+ kCmdCredits = 'CRED',
+ kCmdOpening = 'OPEN',
+ kCmdChicksNStuff = 'CHIC',
+ // Minigames
+ kCmdHockALoogie = 'HOCK',
+ kCmdBugJustice = 'BUGJ',
+ kCmdCourtChaos = 'CORT',
+ kCmdAirGuitar = 'AIRG',
+ kCmdBack = 'BACK'
+};
+
+enum {
+ kMainMenuScr = 0,
+ kOptionsMenuScr = 1,
+ kMiniGamesMenuScr = 2
+};
+
+class MainMenu : public GUI::Dialog {
+public:
+ MainMenu(BbvsEngine *vm);
+ ~MainMenu();
+
+ void reflowLayout();
+ void handleCommand(GUI::CommandSender *sender, uint32 command, uint32 data);
+
+protected:
+ BbvsEngine *_vm;
+
+ void init();
+
+ GUI::ButtonWidget *_buttons[5];
+
+ void gotoMenuScreen(int index);
+ bool canContinue();
+ void gotoScene(int sceneNum);
+
+};
+
+}
+
+#endif // BBVS_DIALOGS_H
diff --git a/engines/bbvs/gamemodule.cpp b/engines/bbvs/gamemodule.cpp
new file mode 100644
index 0000000000..d6343084ab
--- /dev/null
+++ b/engines/bbvs/gamemodule.cpp
@@ -0,0 +1,500 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+
+ * You should have received a copy of the GNU General Public 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 "bbvs/gamemodule.h"
+#include "engines/util.h"
+
+namespace Bbvs {
+
+GameModule::GameModule()
+ : _bgSpriteCount(0), _bgSpriteIndices(0), _bgSpritePriorities(0), _walkRectsCount(0),
+ _walkRects(0), _sceneExitsCount(0), _sceneExits(0), _bgObjectsCount(0), _bgObjects(0),
+ _animationsCount(0), _animations(0), _sceneObjectDefsCount(0), _sceneObjectDefs(0),
+ _sceneObjectInitsCount(0), _sceneObjectInits(0), _actionsCount(0), _actions(0),
+ _sceneSoundsCount(0), _sceneSounds(0), _preloadSoundsCount(0), _preloadSounds(0) {
+}
+
+GameModule::~GameModule() {
+ unload();
+}
+
+void GameModule::load(const char *filename) {
+ debug(0, "GameModule::load()");
+
+ unload();
+
+ Common::File fd;
+
+ if (!fd.open(filename))
+ error("GameModule::load() Could not open %s", filename);
+
+ loadBgSprites(fd);
+ loadCameraInits(fd);
+ loadWalkRects(fd);
+ loadSceneExits(fd);
+ loadBgObjects(fd);
+ loadAnimations(fd);
+ loadSceneObjectDefs(fd);
+ loadSceneObjectInits(fd);
+ loadActions(fd);
+ loadGuiSpriteIndices(fd);
+ loadInventoryItemSpriteIndices(fd);
+ loadInventoryItemInfos(fd);
+ loadDialogItemSpriteIndices(fd);
+ loadSceneSounds(fd);
+ loadPreloadSounds(fd);
+
+ fd.seek(0xC);
+ _fieldC = fd.readUint32LE();
+
+ fd.seek(0x1A8);
+ _buttheadObjectIndex = fd.readUint32LE();
+
+ fd.close();
+
+ debug(0, "GameModule::load() OK");
+}
+
+int GameModule::getFieldC() {
+ return _fieldC;
+}
+
+int GameModule::getButtheadObjectIndex() {
+ return _buttheadObjectIndex;
+}
+
+int GameModule::getGuiSpriteIndex(int index) {
+ assert(index < kGuiSpriteCount);
+ return _guiSpriteIndices[index];
+}
+
+int GameModule::getInventoryItemSpriteIndex(int index) {
+ assert(index < kInventoryItemSpriteCount);
+ return _inventoryItemSpriteIndices[index];
+}
+
+int GameModule::getDialogItemSpriteIndex(int index) {
+ assert(index < kDialogItemSpriteCount);
+ return _dialogItemSpriteIndices[index];
+}
+
+int GameModule::getActionsCount() {
+ return _actionsCount;
+}
+
+Action *GameModule::getAction(int index) {
+ assert(index < _actionsCount);
+ return &_actions[index];
+}
+
+InventoryItemInfo *GameModule::getInventoryItemInfo(int index) {
+ assert(index < kInventoryItemCount);
+ return &_inventoryItemInfos[index];
+}
+
+CameraInit *GameModule::getCameraInit(int cameraNum) {
+ assert(cameraNum < kCameraInitsCount);
+ return &_cameraInits[cameraNum];
+}
+
+int GameModule::getSceneExitsCount() {
+ return _sceneExitsCount;
+}
+
+SceneExit *GameModule::getSceneExit(int index) {
+ assert(index < _sceneExitsCount);
+ return &_sceneExits[index];
+}
+
+int GameModule::getWalkRectsCount() {
+ return _walkRectsCount;
+}
+
+Common::Rect *GameModule::getWalkRects() {
+ return _walkRects;
+}
+
+int GameModule::getSceneObjectDefsCount() {
+ return _sceneObjectDefsCount;
+}
+
+SceneObjectDef *GameModule::getSceneObjectDef(int index) {
+ assert(index < _sceneObjectDefsCount);
+ return &_sceneObjectDefs[index];
+}
+
+int GameModule::getSceneObjectInitsCount() {
+ return _sceneObjectInitsCount;
+}
+
+SceneObjectInit *GameModule::getSceneObjectInit(int index) {
+ assert(index < _sceneObjectInitsCount);
+ return &_sceneObjectInits[index];
+}
+
+int GameModule::getBgObjectsCount() {
+ return _bgObjectsCount;
+}
+
+BgObject *GameModule::getBgObject(int index) {
+ assert(index < _bgObjectsCount);
+ return &_bgObjects[index];
+}
+
+int GameModule::getBgSpritesCount() {
+ return _bgSpriteCount;
+}
+
+int GameModule::getBgSpriteIndex(int index) {
+ assert(index < _bgSpriteCount);
+ return _bgSpriteIndices[index];
+}
+
+int GameModule::getBgSpritePriority(int index) {
+ assert(index < _bgSpriteCount);
+ return _bgSpritePriorities[index];
+}
+
+int GameModule::getSceneSoundsCount() {
+ return _sceneSoundsCount;
+}
+
+SceneSound *GameModule::getSceneSound(int index) {
+ assert(index < _sceneSoundsCount);
+ return &_sceneSounds[index];
+}
+
+uint GameModule::getSceneSoundIndex(uint soundNum) {
+ for (int i = 0; i < getSceneSoundsCount(); ++i)
+ if (getSceneSound(i)->soundNum == soundNum)
+ return i;
+ return 0;
+}
+
+uint GameModule::getPreloadSoundsCount() {
+ return _preloadSoundsCount;
+}
+
+uint GameModule::getPreloadSound(uint index) {
+ assert(index < _preloadSoundsCount);
+ return _preloadSounds[index];
+}
+
+Animation *GameModule::getAnimation(int index) {
+ assert(index < _animationsCount);
+ return &_animations[index];
+}
+
+Common::Point GameModule::readPoint(Common::SeekableReadStream &s) {
+ Common::Point p;
+ p.x = s.readUint16LE();
+ p.y = s.readUint16LE();
+ return p;
+}
+
+Common::Rect GameModule::readRect(Common::SeekableReadStream &s) {
+ Common::Rect r;
+ r.left = s.readUint16LE();
+ r.top = s.readUint16LE();
+ r.setWidth(s.readUint16LE());
+ r.setHeight(s.readUint16LE());
+ return r;
+}
+
+Conditions GameModule::readConditions(Common::SeekableReadStream &s) {
+ Conditions c;
+ for (int i = 0; i < 8; ++i) {
+ c.conditions[i].cond = s.readByte();
+ c.conditions[i].value1 = s.readByte();
+ c.conditions[i].value2 = s.readUint16LE();
+ }
+ return c;
+}
+
+void GameModule::unload() {
+ delete[] _bgSpriteIndices;
+ delete[] _bgSpritePriorities;
+ delete[] _walkRects;
+ delete[] _sceneExits;
+ delete[] _bgObjects;
+ delete[] _animations;
+ delete[] _sceneObjectDefs;
+ delete[] _sceneObjectInits;
+ delete[] _actions;
+ delete[] _sceneSounds;
+ delete[] _preloadSounds;
+ _bgSpriteIndices = 0;
+ _bgSpritePriorities = 0;
+ _walkRects = 0;
+ _sceneExits = 0;
+ _bgObjects = 0;
+ _animations = 0;
+ _sceneObjectDefs = 0;
+ _sceneObjectInits = 0;
+ _actions = 0;
+ _sceneSounds = 0;
+ _preloadSounds = 0;
+}
+
+void GameModule::loadBgSprites(Common::SeekableReadStream &s) {
+ debug(0, "GameModule::loadBgSprites()");
+
+ s.seek(0x14);
+ _bgSpriteCount = s.readUint32LE();
+ uint32 bgSpriteIndicesOffs = s.readUint32LE();
+ uint32 bgSpritePrioritiesOffs = s.readUint32LE();
+ _bgSpriteIndices = new int[_bgSpriteCount];
+ _bgSpritePriorities = new int16[_bgSpriteCount];
+ s.seek(bgSpriteIndicesOffs);
+ for (int i = 0; i < _bgSpriteCount; ++i)
+ _bgSpriteIndices[i] = s.readUint32LE();
+ s.seek(bgSpritePrioritiesOffs);
+ for (int i = 0; i < _bgSpriteCount; ++i)
+ _bgSpritePriorities[i] = s.readUint16LE();
+
+}
+
+void GameModule::loadCameraInits(Common::SeekableReadStream &s) {
+ debug(0, "GameModule::loadCameraInits()");
+
+ s.seek(0x20);
+ for (int i = 0; i < kCameraInitsCount; ++i) {
+ CameraInit &cameraInit = _cameraInits[i];
+ cameraInit.cameraPos = readPoint(s);
+ for (int j = 0; j < 8; ++j)
+ cameraInit.cameraLinks[j] = s.readByte();
+ for (int j = 0; j < 8; ++j)
+ cameraInit.rects[j] = readRect(s);
+ }
+}
+
+void GameModule::loadWalkRects(Common::SeekableReadStream &s) {
+ debug(0, "GameModule::loadWalkRects()");
+
+ s.seek(0x150);
+ _walkRectsCount = s.readUint32LE();
+ uint32 offs = s.readUint32LE();
+ _walkRects = new Common::Rect[_walkRectsCount];
+ s.seek(offs);
+ for (int i = 0; i < _walkRectsCount; ++i)
+ _walkRects[i] = readRect(s);
+}
+
+void GameModule::loadSceneExits(Common::SeekableReadStream &s) {
+ debug(0, "GameModule::loadSceneExits()");
+
+ s.seek(0x158);
+ _sceneExitsCount = s.readUint32LE();
+ uint32 offs = s.readUint32LE();
+ _sceneExits = new SceneExit[_sceneExitsCount];
+ s.seek(offs);
+ for (int i = 0; i < _sceneExitsCount; ++i) {
+ _sceneExits[i].rect = readRect(s);
+ _sceneExits[i].newModuleNum = s.readUint32LE();
+ }
+}
+
+void GameModule::loadBgObjects(Common::SeekableReadStream &s) {
+ debug(0, "GameModule::loadBgObjects()");
+
+ s.seek(0x160);
+ _bgObjectsCount = s.readUint32LE();
+ uint32 offs = s.readUint32LE();
+ _bgObjects = new BgObject[_bgObjectsCount];
+ s.seek(offs);
+ for (int i = 0; i < _bgObjectsCount; ++i) {
+ s.read(_bgObjects[i].name, 20);
+ _bgObjects[i].rect = readRect(s);
+ }
+}
+
+void GameModule::loadAnimations(Common::SeekableReadStream &s) {
+ debug(0, "GameModule::loadAnimations()");
+
+ s.seek(0x168);
+ _animationsCount = s.readUint32LE();
+ uint32 offs = s.readUint32LE();
+ _animations = new Animation[_animationsCount];
+ for (int i = 0; i < _animationsCount; ++i) {
+ Animation &anim = _animations[i];
+ s.seek(offs + i * 20);
+ anim.frameCount = s.readUint32LE();
+ uint32 frameSpriteIndicesOffs = s.readUint32LE();
+ uint32 frameTicksOffs = s.readUint32LE();
+ uint32 frameRects1Offs = s.readUint32LE();
+ uint32 frameRects2Offs = s.readUint32LE();
+ anim.frameSpriteIndices = new int[anim.frameCount];
+ s.seek(frameSpriteIndicesOffs);
+ for (int j = 0; j < anim.frameCount; ++j)
+ anim.frameSpriteIndices[j] = s.readUint32LE();
+ anim.frameTicks = new int16[anim.frameCount];
+ s.seek(frameTicksOffs);
+ for (int j = 0; j < anim.frameCount; ++j)
+ anim.frameTicks[j] = s.readUint16LE();
+ anim.frameRects1 = new Common::Rect[anim.frameCount];
+ s.seek(frameRects1Offs);
+ for (int j = 0; j < anim.frameCount; ++j)
+ anim.frameRects1[j] = readRect(s);
+ anim.frameRects2 = new Common::Rect[anim.frameCount];
+ s.seek(frameRects2Offs);
+ for (int j = 0; j < anim.frameCount; ++j)
+ anim.frameRects2[j] = readRect(s);
+ }
+}
+
+void GameModule::loadSceneObjectDefs(Common::SeekableReadStream &s) {
+ debug(0, "GameModule::loadSceneObjectDefs()");
+
+ s.seek(0x170);
+ _sceneObjectDefsCount = s.readUint32LE();
+ uint32 offs = s.readUint32LE();
+ _sceneObjectDefs = new SceneObjectDef[_sceneObjectDefsCount];
+ s.seek(offs);
+ for (int i = 0; i < _sceneObjectDefsCount; ++i) {
+ s.read(_sceneObjectDefs[i].name, 20);
+ _sceneObjectDefs[i].walkSpeed = s.readUint32LE();
+ for (int j = 0; j < 16; ++j)
+ _sceneObjectDefs[i].animIndices[j] = s.readUint32LE();
+ }
+}
+
+void GameModule::loadSceneObjectInits(Common::SeekableReadStream &s) {
+ debug(0, "GameModule::loadSceneObjectInits()");
+
+ s.seek(0x178);
+ _sceneObjectInitsCount = s.readUint32LE();
+ uint32 offs = s.readUint32LE();
+ _sceneObjectInits = new SceneObjectInit[_sceneObjectInitsCount];
+ s.seek(offs);
+ for (int i = 0; i < _sceneObjectInitsCount; ++i) {
+ _sceneObjectInits[i].conditions = readConditions(s);
+ _sceneObjectInits[i].sceneObjectIndex = s.readUint32LE();
+ _sceneObjectInits[i].animIndex = s.readUint32LE();
+ _sceneObjectInits[i].x = s.readUint16LE();
+ _sceneObjectInits[i].y = s.readUint16LE();
+ }
+}
+
+void GameModule::loadActions(Common::SeekableReadStream &s) {
+ debug(0, "GameModule::loadActions()");
+
+ s.seek(0x180);
+ _actionsCount = s.readUint32LE();
+ uint32 offs = s.readUint32LE();
+ _actions = new Action[_actionsCount];
+ for (int i = 0; i < _actionsCount; ++i) {
+ s.seek(offs + i * 72);
+ debug(0, "Action(%d) offs: %08X", i, offs + i * 72);
+ _actions[i].conditions = readConditions(s);
+ for (int j = 0; j < 8; ++j) {
+ _actions[i].results.actionResults[j].kind = s.readByte();
+ _actions[i].results.actionResults[j].value1 = s.readByte();
+ _actions[i].results.actionResults[j].value2 = s.readUint16LE();
+ }
+ const int actionListCount = s.readUint32LE();
+ const uint32 actionListOffs = s.readUint32LE();
+ s.seek(actionListOffs);
+ for (int j = 0; j < actionListCount; ++j) {
+ ActionCommand actionCommand;
+ actionCommand.cmd = s.readUint16LE();
+ actionCommand.sceneObjectIndex = s.readUint16LE();
+ actionCommand.timeStamp = s.readUint32LE();
+ actionCommand.walkDest = readPoint(s);
+ actionCommand.param = s.readUint32LE();
+ _actions[i].actionCommands.push_back(actionCommand);
+ }
+ }
+}
+
+void GameModule::loadGuiSpriteIndices(Common::SeekableReadStream &s) {
+ debug(0, "GameModule::loadGuiSpriteIndices()");
+
+ s.seek(0x188);
+ uint32 offs = s.readUint32LE();
+ s.seek(offs);
+ for (int i = 0; i < kGuiSpriteCount; ++i)
+ _guiSpriteIndices[i] = s.readUint32LE();
+}
+
+void GameModule::loadInventoryItemSpriteIndices(Common::SeekableReadStream &s) {
+ debug(0, "GameModule::loadInventoryItemSpriteIndices()");
+
+ s.seek(0x18C);
+ uint32 offs = s.readUint32LE();
+ s.seek(offs);
+ for (int i = 0; i < kInventoryItemSpriteCount; ++i)
+ _inventoryItemSpriteIndices[i] = s.readUint32LE();
+}
+
+void GameModule::loadInventoryItemInfos(Common::SeekableReadStream &s) {
+ debug(0, "GameModule::loadInventoryItemInfos()");
+
+ s.seek(0x190);
+ uint32 offs = s.readUint32LE();
+ s.seek(offs);
+ for (int i = 0; i < kInventoryItemCount; ++i) {
+ _inventoryItemInfos[i].xOffs = s.readUint16LE();
+ _inventoryItemInfos[i].yOffs = s.readUint16LE();
+ _inventoryItemInfos[i].width = s.readUint16LE();
+ _inventoryItemInfos[i].height = s.readUint16LE();
+ s.skip(8); // Unused
+ }
+}
+
+void GameModule::loadDialogItemSpriteIndices(Common::SeekableReadStream &s) {
+ debug(0, "GameModule::loadDialogItemSpriteIndices()");
+
+ s.seek(0x194);
+ uint32 offs = s.readUint32LE();
+ s.seek(offs);
+ for (int i = 0; i < kDialogItemSpriteCount; ++i) {
+ _dialogItemSpriteIndices[i] = s.readUint32LE();
+ }
+}
+
+void GameModule::loadSceneSounds(Common::SeekableReadStream &s) {
+ debug(0, "GameModule::loadSceneSounds()");
+
+ s.seek(0x1A0);
+ _sceneSoundsCount = s.readUint32LE();
+ uint32 offs = s.readUint32LE();
+ _sceneSounds = new SceneSound[_sceneSoundsCount];
+ s.seek(offs);
+ for (int i = 0; i < _sceneSoundsCount; ++i) {
+ _sceneSounds[i].conditions = readConditions(s);
+ _sceneSounds[i].soundNum = s.readUint32LE();
+ }
+}
+
+void GameModule::loadPreloadSounds(Common::SeekableReadStream &s) {
+ debug(0, "GameModule::loadPreloadSounds()");
+
+ s.seek(0x198);
+ _preloadSoundsCount = s.readUint32LE();
+ uint32 offs = s.readUint32LE();
+ _preloadSounds = new uint[_preloadSoundsCount];
+ s.seek(offs);
+ for (uint i = 0; i < _preloadSoundsCount; ++i)
+ _preloadSounds[i] = s.readUint32LE();
+}
+
+} // End of namespace Bbvs
diff --git a/engines/bbvs/gamemodule.h b/engines/bbvs/gamemodule.h
new file mode 100644
index 0000000000..4d4f5b90a1
--- /dev/null
+++ b/engines/bbvs/gamemodule.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.
+ *
+ */
+
+#ifndef BBVS_GAMEMODULE_H
+#define BBVS_GAMEMODULE_H
+
+#include "common/array.h"
+#include "common/file.h"
+#include "common/memstream.h"
+#include "common/rect.h"
+#include "common/str.h"
+
+namespace Bbvs {
+
+const int kInventoryItemCount = 42;
+const int kInventoryItemSpriteCount = 2 * kInventoryItemCount;
+const int kDialogItemSpriteCount = 26;
+const int kGuiSpriteCount = 21;
+const int kCameraInitsCount = 4;
+
+struct Condition {
+ byte cond;
+ byte value1;
+ int16 value2;
+};
+
+struct Conditions {
+ Condition conditions[8];
+};
+
+struct ActionResult {
+ byte kind;
+ byte value1;
+ int16 value2;
+};
+
+struct ActionResults {
+ ActionResult actionResults[8];
+};
+
+struct ActionCommand {
+ uint16 cmd;
+ int16 sceneObjectIndex;
+ uint32 timeStamp;
+ Common::Point walkDest;
+ int32 param;
+};
+
+class ActionCommands : public Common::Array<ActionCommand> {
+};
+
+struct Action {
+ Conditions conditions;
+ ActionResults results;
+ ActionCommands actionCommands;
+};
+
+struct InventoryItemInfo {
+ int16 xOffs, yOffs;
+ int16 width, height;
+};
+
+struct CameraInit {
+ Common::Point cameraPos;
+ byte cameraLinks[8];
+ Common::Rect rects[8];
+};
+
+struct SceneObjectDef {
+ char name[20];
+ int animIndices[16];
+ int walkSpeed;
+};
+
+struct SceneObjectInit {
+ Conditions conditions;
+ int sceneObjectIndex;
+ int animIndex;
+ int x, y;
+};
+
+struct BgObject {
+ char name[20];
+ Common::Rect rect;
+};
+
+struct Animation {
+ int frameCount;
+ int *frameSpriteIndices;
+ int16 *frameTicks;
+ Common::Rect *frameRects1;
+ Common::Rect *frameRects2;
+ Animation()
+ : frameCount(0), frameSpriteIndices(0), frameTicks(0), frameRects1(0), frameRects2(0) {
+ }
+ ~Animation() {
+ delete[] frameSpriteIndices;
+ delete[] frameTicks;
+ delete[] frameRects1;
+ delete[] frameRects2;
+ }
+};
+
+struct SceneExit {
+ Common::Rect rect;
+ int newModuleNum;
+};
+
+struct SceneSound {
+ Conditions conditions;
+ uint soundNum;
+};
+
+class GameModule {
+public:
+ GameModule();
+ ~GameModule();
+
+ void load(const char *filename);
+
+ int getFieldC();
+ int getButtheadObjectIndex();
+
+ int getGuiSpriteIndex(int index);
+ int getInventoryItemSpriteIndex(int index);
+ int getDialogItemSpriteIndex(int index);
+
+ int getActionsCount();
+ Action *getAction(int index);
+
+ InventoryItemInfo *getInventoryItemInfo(int index);
+
+ CameraInit *getCameraInit(int cameraNum);
+
+ int getSceneExitsCount();
+ SceneExit *getSceneExit(int index);
+
+ int getWalkRectsCount();
+ Common::Rect *getWalkRects();
+
+ int getSceneObjectDefsCount();
+ SceneObjectDef *getSceneObjectDef(int index);
+
+ int getSceneObjectInitsCount();
+ SceneObjectInit *getSceneObjectInit(int index);
+
+ int getBgObjectsCount();
+ BgObject *getBgObject(int index);
+
+ int getBgSpritesCount();
+ int getBgSpriteIndex(int index);
+ int getBgSpritePriority(int index);
+
+ int getSceneSoundsCount();
+ SceneSound *getSceneSound(int index);
+ uint getSceneSoundIndex(uint soundNum);
+
+ uint getPreloadSoundsCount();
+ uint getPreloadSound(uint index);
+
+ Animation *getAnimation(int index);
+
+protected:
+
+ int _bgSpriteCount;
+ int *_bgSpriteIndices;
+ int16 *_bgSpritePriorities;
+
+ CameraInit _cameraInits[kCameraInitsCount];
+
+ int _walkRectsCount;
+ Common::Rect *_walkRects;
+
+ int _sceneExitsCount;
+ SceneExit *_sceneExits;
+
+ int _bgObjectsCount;
+ BgObject *_bgObjects;
+
+ int _animationsCount;
+ Animation *_animations;
+
+ int _sceneObjectDefsCount;
+ SceneObjectDef *_sceneObjectDefs;
+
+ int _sceneObjectInitsCount;
+ SceneObjectInit *_sceneObjectInits;
+
+ int _actionsCount;
+ Action *_actions;
+
+ int _sceneSoundsCount;
+ SceneSound *_sceneSounds;
+
+ uint _preloadSoundsCount;
+ uint *_preloadSounds;
+
+ int _guiSpriteIndices[kGuiSpriteCount];
+ int _inventoryItemSpriteIndices[kInventoryItemSpriteCount];
+ InventoryItemInfo _inventoryItemInfos[kInventoryItemCount];
+ int _dialogItemSpriteIndices[kDialogItemSpriteCount];
+
+ int _fieldC;
+ int _buttheadObjectIndex;
+
+ Common::Point readPoint(Common::SeekableReadStream &s);
+ Common::Rect readRect(Common::SeekableReadStream &s);
+ Conditions readConditions(Common::SeekableReadStream &s);
+
+ void unload();
+
+ void loadBgSprites(Common::SeekableReadStream &s);
+ void loadCameraInits(Common::SeekableReadStream &s);
+ void loadWalkRects(Common::SeekableReadStream &s);
+ void loadSceneExits(Common::SeekableReadStream &s);
+ void loadBgObjects(Common::SeekableReadStream &s);
+ void loadAnimations(Common::SeekableReadStream &s);
+ void loadSceneObjectDefs(Common::SeekableReadStream &s);
+ void loadSceneObjectInits(Common::SeekableReadStream &s);
+ void loadActions(Common::SeekableReadStream &s);
+ void loadGuiSpriteIndices(Common::SeekableReadStream &s);
+ void loadInventoryItemSpriteIndices(Common::SeekableReadStream &s);
+ void loadInventoryItemInfos(Common::SeekableReadStream &s);
+ void loadDialogItemSpriteIndices(Common::SeekableReadStream &s);
+ void loadSceneSounds(Common::SeekableReadStream &s);
+ void loadPreloadSounds(Common::SeekableReadStream &s);
+
+};
+
+} // End of namespace Bbvs
+
+#endif // BBVS_GAMEMODULE_H
diff --git a/engines/bbvs/graphics.cpp b/engines/bbvs/graphics.cpp
new file mode 100644
index 0000000000..810d910abf
--- /dev/null
+++ b/engines/bbvs/graphics.cpp
@@ -0,0 +1,141 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+
+ * You should have received a copy of the GNU General Public 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 "bbvs/graphics.h"
+
+namespace Bbvs {
+
+void DrawList::add(int index, int x, int y, int priority) {
+ debug(5, "DrawList::add() %d (%d, %d) %d", index, x, y, priority);
+ DrawListEntry drawListEntry;
+ drawListEntry.index = index;
+ drawListEntry.x = x;
+ drawListEntry.y = y;
+ drawListEntry.priority = priority;
+ // Insert the sprite at the correct position
+ uint insertIndex = 0;
+ while (insertIndex < size() && (*this)[insertIndex].priority <= priority)
+ ++insertIndex;
+ insert_at(insertIndex, drawListEntry);
+}
+
+Screen::Screen(OSystem *system) : _system(system) {
+ _surface = new Graphics::Surface();
+ _surface->create(320, 240, Graphics::PixelFormat::createFormatCLUT8());
+}
+
+Screen::~Screen() {
+ _surface->free();
+ delete _surface;
+}
+
+void Screen::setPalette(Palette &palette) {
+ byte pal[768];
+ memset(pal, 0, 768);
+ memcpy(&pal[palette.start * 3], palette.data, palette.count * 3);
+ _system->getPaletteManager()->setPalette(pal, 0, 256);
+}
+
+void Screen::copyToScreen() {
+ _system->copyRectToScreen((const byte*)_surface->getBasePtr(0, 0), _surface->pitch, 0, 0, 320, 240);
+ _system->updateScreen();
+}
+
+void Screen::clear() {
+ _surface->fillRect(Common::Rect(0, 0, 320, 240), 0);
+}
+
+void Screen::drawDrawList(DrawList &drawList, SpriteModule *spriteModule) {
+ for (uint i = 0; i < drawList.size(); ++i) {
+ debug(1, "index: %d; x: %d; y: %d; priority: %d", drawList[i].index, drawList[i].x, drawList[i].y, drawList[i].priority);
+ Sprite sprite = spriteModule->getSprite(drawList[i].index);
+ drawSprite(sprite, drawList[i].x, drawList[i].y);
+ }
+}
+
+void Screen::drawSprite(Sprite &sprite, int x, int y) {
+ debug(5, "Screen::drawSprite()");
+
+ int destX, destY, width, height, skipX = 0, skipY = 0;
+
+ destX = sprite.xOffs + x;
+ destY = sprite.yOffs + y;
+
+ if (destX >= _surface->w || destY >= _surface->h)
+ return;
+
+ height = sprite.height;
+ if (destY < 0) {
+ height += destY;
+ if (height <= 0)
+ return;
+ skipY = -destY;
+ destY = 0;
+ }
+ if (destY + height > _surface->h)
+ height = _surface->h - destY;
+
+ width = sprite.width;
+ if (destX < 0) {
+ width += destX;
+ if (width <= 0)
+ return;
+ skipX = -destX;
+ destX = 0;
+ }
+ if (destX + width >= _surface->w)
+ width = _surface->w - destX;
+
+ debug(0, "drawSprite() (%d, %d, %d, %d); skipX: %d; skipY: %d; %d", destX, destY, width, height, skipX, skipY, sprite.type);
+
+ if (sprite.type == 1) {
+ for (int yc = 0; yc < height; ++yc) {
+ byte *source = sprite.getRow(skipY + yc);
+ byte *dest = (byte*)_surface->getBasePtr(destX, destY + yc);
+ int currWidth = -skipX;
+ while (currWidth < width) {
+ int8 op = *source++;
+ if (op < 0) {
+ currWidth += (-op);
+ } else {
+ while (op >= 0 && currWidth < width) {
+ if (currWidth >= 0)
+ dest[currWidth] = *source;
+ ++source;
+ ++currWidth;
+ --op;
+ }
+ }
+ }
+ }
+ } else {
+ for (int yc = 0; yc < height; ++yc) {
+ byte *source = sprite.getRow(skipY + yc) + skipX;
+ byte *dest = (byte*)_surface->getBasePtr(destX, destY + yc);
+ memcpy(dest, source, width);
+ }
+ }
+
+ debug(5, "Screen::drawSprite() OK");
+}
+
+} // End of namespace Bbvs
diff --git a/engines/bbvs/graphics.h b/engines/bbvs/graphics.h
new file mode 100644
index 0000000000..acb8eb953a
--- /dev/null
+++ b/engines/bbvs/graphics.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 BBVS_GRAPHICS_H
+#define BBVS_GRAPHICS_H
+
+#include "bbvs/spritemodule.h"
+#include "common/array.h"
+#include "common/system.h"
+#include "graphics/palette.h"
+#include "graphics/surface.h"
+
+namespace Bbvs {
+
+struct DrawListEntry {
+ int index;
+ int x, y;
+ int priority;
+};
+
+class DrawList : public Common::Array<DrawListEntry> {
+public:
+ void add(int index, int x, int y, int priority);
+};
+
+class Screen {
+public:
+ Screen(OSystem *system);
+ ~Screen();
+ void setPalette(Palette &palette);
+ void copyToScreen();
+ void drawDrawList(DrawList &drawList, SpriteModule *spriteModule);
+ void drawSprite(Sprite &sprite, int x, int y);
+ void clear();
+//protected:
+ OSystem *_system;
+ Graphics::Surface *_surface;
+};
+
+} // End of namespace Bbvs
+
+#endif // BBVS_GRAPHICS_H
diff --git a/engines/bbvs/logic.cpp b/engines/bbvs/logic.cpp
new file mode 100644
index 0000000000..06792e2df1
--- /dev/null
+++ b/engines/bbvs/logic.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 "bbvs/bbvs.h"
+#include "bbvs/gamemodule.h"
+
+namespace Bbvs {
+
+bool BbvsEngine::evalCondition(Conditions &conditions) {
+ bool result = true;
+ for (int i = 0; i < 8 && result; ++i) {
+ const Condition &condition = conditions.conditions[i];
+ switch (condition.cond) {
+ case kCondSceneObjectVerb:
+ result = _activeItemType == KITSceneObject &&
+ condition.value1 == _currVerbNum &&
+ condition.value2 == _activeItemIndex;
+ break;
+ case kCondBgObjectVerb:
+ result = _activeItemType == kITBgObject &&
+ condition.value1 == _currVerbNum &&
+ condition.value2 == _activeItemIndex;
+ break;
+ case kCondSceneObjectInventory:
+ result = _activeItemType == KITSceneObject &&
+ _currVerbNum == kVerbInvItem &&
+ condition.value1 == _currInventoryItem &&
+ condition.value2 == _activeItemIndex;
+ break;
+ case kCondBgObjectInventory:
+ result = _activeItemType == kITBgObject &&
+ _currVerbNum == kVerbInvItem &&
+ condition.value1 == _currInventoryItem &&
+ condition.value2 == _activeItemIndex;
+ break;
+ case kCondHasInventoryItem:
+ result = _inventoryItemStatus[condition.value1] != 0;
+ break;
+ case kCondHasNotInventoryItem:
+ result = _inventoryItemStatus[condition.value1] == 0;
+ break;
+ case kCondIsGameVar:
+ result = _gameVars[condition.value2] != 0;
+ break;
+ case kCondIsNotGameVar:
+ result = _gameVars[condition.value2] == 0;
+ break;
+ case kCondIsPrevSceneNum:
+ result = condition.value2 == _prevSceneNum;
+ break;
+ case kCondIsCurrTalkObject:
+ result = condition.value2 == _currTalkObjectIndex;
+ break;
+ case kCondIsDialogItem:
+ result = _activeItemType == kITDialog &&
+ condition.value1 == _activeItemIndex;
+ break;
+ case kCondIsCameraNum:
+ result = condition.value1 == _currCameraNum;
+ break;
+ case kCondIsNotPrevSceneNum:
+ result = condition.value2 != _prevSceneNum;
+ break;
+ case kCondIsButtheadAtBgObject:
+ result = _buttheadObject &&
+ _gameModule->getBgObject(condition.value2)->rect.contains(_buttheadObject->x >> 16, _buttheadObject->y >> 16);
+ break;
+ case kCondIsNotSceneVisited:
+ result = _sceneVisited[_currSceneNum] == 0;
+ break;
+ case kCondIsSceneVisited:
+ result = _sceneVisited[_currSceneNum] != 0;
+ break;
+ case kCondUnused:
+ case kCondDialogItem0:
+ case kCondIsCameraNumTransition:
+ result = false;
+ break;
+ }
+ }
+ return result;
+}
+
+bool BbvsEngine::evalCameraCondition(Conditions &conditions, int value) {
+ bool result = true;
+ for (int i = 0; i < 8 && result; ++i) {
+ const Condition &condition = conditions.conditions[i];
+ switch (condition.cond) {
+ case kCondHasInventoryItem:
+ result = _inventoryItemStatus[condition.value1] != 0;
+ break;
+ case kCondHasNotInventoryItem:
+ result = _inventoryItemStatus[condition.value1] == 0;
+ break;
+ case kCondIsGameVar:
+ result = _gameVars[condition.value2] != 0;
+ break;
+ case kCondIsNotGameVar:
+ result = _gameVars[condition.value2] == 0;
+ break;
+ case kCondIsPrevSceneNum:
+ result = condition.value2 == _prevSceneNum;
+ break;
+ case kCondIsNotPrevSceneNum:
+ result = condition.value2 != _prevSceneNum;
+ break;
+ case kCondIsNotSceneVisited:
+ result = _sceneVisited[_currSceneNum] == 0;
+ break;
+ case kCondIsSceneVisited:
+ result = _sceneVisited[_currSceneNum] != 0;
+ break;
+ case kCondIsCameraNumTransition:
+ result = condition.value1 == _currCameraNum &&
+ condition.value2 == value;
+ break;
+ case kCondUnused:
+ case kCondSceneObjectVerb:
+ case kCondBgObjectVerb:
+ case kCondSceneObjectInventory:
+ case kCondBgObjectInventory:
+ case kCondIsCurrTalkObject:
+ case kCondIsDialogItem:
+ case kCondIsCameraNum:
+ case kCondDialogItem0:
+ case kCondIsButtheadAtBgObject:
+ result = false;
+ break;
+ default:
+ break;
+ }
+ }
+ return result;
+}
+
+int BbvsEngine::evalDialogCondition(Conditions &conditions) {
+ int result = -1;
+ bool success = false;
+ for (int i = 0; i < 8; ++i) {
+ const Condition &condition = conditions.conditions[i];
+ switch (condition.cond) {
+ case kCondSceneObjectVerb:
+ success = _activeItemType == KITSceneObject &&
+ condition.value1 == _currVerbNum &&
+ condition.value2 == _activeItemIndex;
+ break;
+ case kCondBgObjectVerb:
+ success = _activeItemType == kITBgObject &&
+ condition.value1 == _currVerbNum &&
+ condition.value2 == _activeItemIndex;
+ break;
+ case kCondSceneObjectInventory:
+ success = _activeItemType == KITSceneObject &&
+ _currVerbNum == kVerbInvItem &&
+ condition.value1 == _currInventoryItem &&
+ condition.value2 == _activeItemIndex;
+ break;
+ case kCondBgObjectInventory:
+ success = _activeItemType == kITBgObject &&
+ _currVerbNum == kVerbInvItem &&
+ condition.value1 == _currInventoryItem &&
+ condition.value2 == _activeItemIndex;
+ break;
+ case kCondHasInventoryItem:
+ success = _inventoryItemStatus[condition.value1] != 0;
+ break;
+ case kCondHasNotInventoryItem:
+ success = _inventoryItemStatus[condition.value1] == 0;
+ break;
+ case kCondIsGameVar:
+ success = _gameVars[condition.value2] != 0;
+ break;
+ case kCondIsNotGameVar:
+ success = _gameVars[condition.value2] == 0;
+ break;
+ case kCondIsPrevSceneNum:
+ success = condition.value2 == _prevSceneNum;
+ break;
+ case kCondIsCurrTalkObject:
+ success = condition.value2 == _currTalkObjectIndex;
+ break;
+ case kCondIsDialogItem:
+ result = condition.value1;
+ break;
+ case kCondIsCameraNum:
+ success = condition.value1 == _currCameraNum;
+ break;
+ case kCondIsNotPrevSceneNum:
+ success = condition.value2 != _prevSceneNum;
+ break;
+ case kCondIsButtheadAtBgObject:
+ success = _buttheadObject &&
+ _gameModule->getBgObject(condition.value2)->rect.contains(_buttheadObject->x >> 16, _buttheadObject->y >> 16);
+ break;
+ case kCondIsNotSceneVisited:
+ success = _sceneVisited[_currSceneNum] == 0;
+ break;
+ case kCondIsSceneVisited:
+ success = _sceneVisited[_currSceneNum] != 0;
+ break;
+ case kCondDialogItem0:
+ return 0;
+ case kCondUnused:
+ case kCondIsCameraNumTransition:
+ success = false;
+ break;
+ }
+ if (!success)
+ return -1;
+ }
+ return result;
+}
+
+void BbvsEngine::evalActionResults(ActionResults &results) {
+ for (int i = 0; i < 8; ++i) {
+ const ActionResult &result = results.actionResults[i];
+ switch (result.kind) {
+ case kActResAddInventoryItem:
+ _inventoryItemStatus[result.value1] = 1;
+ _currVerbNum = kVerbInvItem;
+ _currInventoryItem = result.value1;
+ break;
+ case kActResRemoveInventoryItem:
+ _inventoryItemStatus[result.value1] = 0;
+ if (result.value1 == _currInventoryItem)
+ _currInventoryItem = -1;
+ if (_currVerbNum == kVerbInvItem)
+ _currVerbNum = kVerbLook;
+ break;
+ case kActResSetGameVar:
+ _gameVars[result.value2] = 1;
+ break;
+ case kActResUnsetGameVar:
+ _gameVars[result.value2] = 0;
+ break;
+ case kActResStartDialog:
+ _gameState = kGSDialog;
+ break;
+ case kActResChangeScene:
+ _newSceneNum = result.value2;
+ break;
+ }
+ }
+}
+
+} // End of namespace Bbvs
diff --git a/engines/bbvs/minigames/bbairguitar.cpp b/engines/bbvs/minigames/bbairguitar.cpp
new file mode 100644
index 0000000000..f2e42313e3
--- /dev/null
+++ b/engines/bbvs/minigames/bbairguitar.cpp
@@ -0,0 +1,1198 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+
+ * You should have received a copy of the GNU General Public 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 "bbvs/minigames/bbairguitar.h"
+
+namespace Bbvs {
+
+static const char * const kNoteSoundFilenames[] = {
+ "a.aif", "a#.aif", "b.aif", "c.aif", "c#.aif",
+ "d.aif", "d#.aif", "e.aif", "f.aif", "f#.aif",
+ "g.aif", "g#.aif", "a_oct.aif"
+};
+
+static const uint kNoteSoundFilenamesCount = ARRAYSIZE(kNoteSoundFilenames);
+
+static const char * const kPatchDirectories[] = {
+ "rock", "burp", "fart"
+};
+
+static const uint kPatchDirectoriesCount = ARRAYSIZE(kPatchDirectories);
+
+static const BBPoint kPianoKeyArea1[] = {{29, 192}, {38, 192}, {38, 222}, {41, 222}, {41, 239}, {29, 239}};
+static const BBPoint kPianoKeyArea2[] = {{38, 192}, {43, 192}, {43, 222}, {38, 222}};
+static const BBPoint kPianoKeyArea3[] = {{43, 192}, {49, 192}, {49, 222}, {52, 222}, {52, 239}, {41, 239}, {41, 222}, {43, 222}};
+static const BBPoint kPianoKeyArea4[] = {{49, 192}, {54, 192}, {54, 222}, {49, 222}};
+static const BBPoint kPianoKeyArea5[] = {{54, 192}, {63, 192}, {63, 239}, {52, 239}, {52, 222}, {54, 222}};
+static const BBPoint kPianoKeyArea6[] = {{63, 192}, {71, 192}, {71, 222}, {74, 222}, {74, 239}, {63, 239}};
+static const BBPoint kPianoKeyArea7[] = {{71, 192}, {76, 192}, {76, 222}, {71, 222}};
+static const BBPoint kPianoKeyArea8[] = {{76, 192}, {82, 192}, {82, 222}, {85, 222}, {85, 239}, {74, 239}, {74, 222}, {76, 222}};
+static const BBPoint kPianoKeyArea9[] = {{82, 192}, {87, 192}, {87, 222}, {82, 222}};
+static const BBPoint kPianoKeyArea10[] = {{87, 192}, {94, 192}, {94, 222}, {96, 222}, {96, 239}, {85, 239}, {85, 222}, {87, 222}};
+static const BBPoint kPianoKeyArea11[] = {{94, 192}, {99, 192}, {99, 222}, {94, 222}};
+static const BBPoint kPianoKeyArea12[] = {{99, 192}, {107, 192}, {107, 239}, {96, 239}, {96, 222}, {99, 222}};
+static const BBPoint kPianoKeyArea13[] = {{107, 192}, {118, 192}, {118, 239}, {107, 239}};
+
+static const BBPolygon kPianoKeyAreas[] = {
+ {kPianoKeyArea1, ARRAYSIZE(kPianoKeyArea1)},
+ {kPianoKeyArea2, ARRAYSIZE(kPianoKeyArea2)},
+ {kPianoKeyArea3, ARRAYSIZE(kPianoKeyArea3)},
+ {kPianoKeyArea4, ARRAYSIZE(kPianoKeyArea4)},
+ {kPianoKeyArea5, ARRAYSIZE(kPianoKeyArea5)},
+ {kPianoKeyArea6, ARRAYSIZE(kPianoKeyArea6)},
+ {kPianoKeyArea7, ARRAYSIZE(kPianoKeyArea7)},
+ {kPianoKeyArea8, ARRAYSIZE(kPianoKeyArea8)},
+ {kPianoKeyArea9, ARRAYSIZE(kPianoKeyArea9)},
+ {kPianoKeyArea10, ARRAYSIZE(kPianoKeyArea10)},
+ {kPianoKeyArea11, ARRAYSIZE(kPianoKeyArea11)},
+ {kPianoKeyArea12, ARRAYSIZE(kPianoKeyArea12)},
+ {kPianoKeyArea13, ARRAYSIZE(kPianoKeyArea13)},
+};
+
+static const BBPoint kObjPoints[] = {
+ {161, 189}, {269, 189}, {161, 208}, {279, 208}, {172, 208},
+ {141, 224}, {257, 191}, {257, 199}, {148, 223}, {124, 224},
+ { 29, 192}, {182, 220}, {245, 220}, {269, 220}, {161, 220},
+ {203, 220}, {224, 220}, {123, 189}, {123, 199}, {123, 209},
+ {134, 224}, { 29, 185}, {124, 224}, {226, 127}, {226, 127},
+ {209, 141}, {244, 141}, {226, 127}, { 99, 107}, { 99, 107},
+ { 76, 137}, {118, 136}, { 99, 107}, {195, 104}, {100, 78}
+};
+
+static const MinigameBbAirGuitar::PianoKeyInfo kPianoKeyInfos[] = {
+ { 30, 192, 0},
+ { 38, 192, 5},
+ { 41, 192, 1},
+ { 49, 192, 5},
+ { 52, 192, 2},
+ { 63, 192, 3},
+ { 71, 192, 5},
+ { 74, 192, 1},
+ { 82, 192, 5},
+ { 85, 192, 1},
+ { 94, 192, 5},
+ { 96, 192, 2},
+ {107, 192, 4}
+};
+
+static const Rect kRect2 = {29, 189, 290, 239};
+static const Rect kPianoRect = {29, 192, 118, 239};
+
+static const Rect kPlayerButtonRects[] = {
+ {123, 189, 145, 199},
+ {123, 199, 145, 209},
+ {123, 209, 145, 220},
+ {148, 223, 156, 236},
+ {161, 189, 182, 205},
+ {161, 208, 171, 218},
+ {161, 220, 182, 231},
+ {182, 220, 203, 231},
+ {203, 220, 224, 231},
+ {224, 220, 245, 231},
+ {245, 220, 266, 231},
+ {269, 220, 290, 231},
+ {269, 189, 290, 205},
+ {279, 208, 290, 218}
+};
+
+static const BBPoint kPointsTbl1[] = {
+ {196, 191}, {202, 191}, {207, 191}, {212, 191}, {217, 191},
+ {223, 191}, {228, 191}, {233, 191}, {238, 191}, {244, 191},
+ {249, 191}
+};
+
+static const BBPoint kPointsTbl2[] = {
+ {196, 199}, {202, 199}, {207, 199}, {212, 199}, {217, 199},
+ {223, 199}, {228, 199}, {233, 199}, {238, 199}, {244, 199},
+ {249, 199}
+};
+
+static const struct { int frameIndex; byte flag; } kNoteFrameTbl[13] = {
+ {2, 0}, {2, 1}, {3, 0}, {3, 1}, {4, 0},
+ {5, 0}, {5, 1}, {6, 0}, {6, 1}, {0, 0},
+ {0, 1}, {1, 0}, {2, 0}
+};
+
+const int kTrackBarMinX = 172;
+const int kTrackBarMaxX = 272;
+
+bool MinigameBbAirGuitar::ptInRect(const Rect *r, int x, int y) {
+ return r && Common::Rect(r->left, r->top, r->right, r->bottom).contains(x, y);
+}
+
+bool MinigameBbAirGuitar::ptInPoly(const BBPolygon *poly, int x, int y) {
+ if (!poly)
+ return false;
+ const BBPoint *points = poly->points;
+ int pointsCount = poly->pointsCount;
+ bool result = false;
+ if (pointsCount > 0)
+ for (int i = 0, j = pointsCount - 1; i < pointsCount; j = i++)
+ if (((points[i].y > y) != (points[j].y > y)) &&
+ (x < (points[j].x - points[i].x) * (y - points[i].y) /
+ (points[j].y - points[i].y) + points[i].x))
+ result = !result;
+ return result;
+}
+
+void MinigameBbAirGuitar::buildDrawList(DrawList &drawList) {
+ switch (_gameState) {
+ case 0:
+ buildDrawList0(drawList);
+ break;
+ case 1:
+ buildDrawList1(drawList);
+ break;
+ }
+}
+
+void MinigameBbAirGuitar::buildDrawList0(DrawList &drawList) {
+
+ drawList.add(_objects[0].anim->frameIndices[0], _objects[0].x, _objects[0].y, 2000);
+
+ for (int i = 1; i < kMaxObjectsCount; ++i) {
+ Obj *obj = &_objects[i];
+ if (obj->kind)
+ drawList.add(obj->anim->frameIndices[obj->frameIndex], obj->x, obj->y, obj->y + 16);
+ }
+
+ if (_titleScreenSpriteIndex> 0)
+ drawList.add(_titleScreenSpriteIndex, 0, 0, 0);
+
+}
+
+void MinigameBbAirGuitar::buildDrawList1(DrawList &drawList) {
+
+ for (int i = 0; i < kMaxObjectsCount; ++i) {
+ Obj *obj = &_objects[i];
+ if (obj->kind)
+ drawList.add(obj->anim->frameIndices[obj->frameIndex], obj->x, obj->y, 255 - i);
+ }
+
+ if (_movingTrackBar) {
+ _trackBarX = _trackBarMouseX;
+ } else if (_totalTrackLength > 0) {
+ _trackBarX = 100 * _currTrackPos / _totalTrackLength + kTrackBarMinX;
+ } else {
+ _trackBarX = kTrackBarMinX;
+ }
+
+ if (_trackBarX > kTrackBarMaxX)
+ _trackBarX = kTrackBarMaxX;
+
+ _trackBarThumbRect.top = 208;
+ _trackBarThumbRect.bottom = 218;
+ _trackBarThumbRect.left = _trackBarX;
+ _trackBarThumbRect.right = _trackBarX + 6;
+
+ drawList.add(_objects[5].anim->frameIndices[0], _trackBarX, 208, 100);
+
+ if (_playerMode != 0) {
+ for (int i = 36; i < _vuMeterLeft2 + 36; ++i) {
+ int frameIndex = 0;
+ if (i >= 45)
+ frameIndex = 3;
+ else if (i >= 43)
+ frameIndex = 2;
+ else if (i >= 41)
+ frameIndex = 1;
+ drawList.add(_objects[i].anim->frameIndices[frameIndex], kPointsTbl1[i - 36].x, kPointsTbl1[i - 36].y, 254);
+ }
+ for (int i = 47; i < _vuMeterRight2 + 47; ++i) {
+ int frameIndex = 0;
+ if (i >= 56)
+ frameIndex = 3;
+ else if (i >= 54)
+ frameIndex = 2;
+ else if (i >= 52)
+ frameIndex = 1;
+ drawList.add(_objects[i].anim->frameIndices[frameIndex], kPointsTbl2[i - 47].x, kPointsTbl2[i - 47].y, 254);
+ }
+ }
+
+ if (_backgroundSpriteIndex > 0)
+ drawList.add(_backgroundSpriteIndex, 0, 0, 0);
+
+}
+
+void MinigameBbAirGuitar::drawSprites() {
+ DrawList drawList;
+ buildDrawList(drawList);
+ _vm->_screen->drawDrawList(drawList, _spriteModule);
+ _vm->_screen->copyToScreen();
+}
+
+void MinigameBbAirGuitar::initObjs() {
+ for (int i = 0; i < kMaxObjectsCount; ++i)
+ _objects[i].kind = 0;
+}
+
+MinigameBbAirGuitar::Obj *MinigameBbAirGuitar::getFreeObject() {
+ for (int i = 0; i < kMaxObjectsCount; ++i)
+ if (_objects[i].kind == 0)
+ return &_objects[i];
+ return 0;
+}
+
+void MinigameBbAirGuitar::initObjects() {
+ switch (_gameState) {
+ case 0:
+ initObjects0();
+ break;
+ case 1:
+ initObjects1();
+ break;
+ }
+}
+
+void MinigameBbAirGuitar::initObjects0() {
+ _objects[0].anim = getAnimation(0);
+ _objects[0].frameIndex = 0;
+ _objects[0].ticks = getAnimation(0)->frameTicks[0];
+ _objects[0].x = 160;
+ _objects[0].y = 120;
+ _objects[0].kind = 1;
+ _objects[1].anim = getAnimation(37);
+ _objects[1].frameIndex = 0;
+ _objects[1].ticks = getAnimation(37)->frameTicks[0];
+ _objects[1].x = 40;
+ _objects[1].y = 240;
+ _objects[1].kind = 2;
+ _objects[2].anim = getAnimation(36);
+ _objects[2].frameIndex = 0;
+ _objects[2].ticks = getAnimation(36)->frameTicks[0];
+ _objects[2].x = 280;
+ _objects[2].y = 240;
+ _objects[2].kind = 2;
+
+}
+
+void MinigameBbAirGuitar::initObjects1() {
+
+ for (int i = 0; i < 60; ++i)
+ _objects[i].kind = 0;
+
+ _objects[0].kind = 0;
+ _objects[0].kind = 1;
+ _objects[0].anim = getAnimation(0);
+ _objects[0].ticks = getAnimation(0)->frameTicks[0];
+ _objects[1].anim = getAnimation(1);
+ _objects[1].ticks = getAnimation(1)->frameTicks[0];
+ _objects[2].anim = getAnimation(2);
+ _objects[2].ticks = getAnimation(2)->frameTicks[0];
+ _objects[3].anim = getAnimation(3);
+ _objects[3].ticks = getAnimation(3)->frameTicks[0];
+ _objects[4].anim = getAnimation(4);
+ _objects[4].ticks = getAnimation(4)->frameTicks[0];
+ _objects[5].anim = getAnimation(5);
+ _objects[5].ticks = getAnimation(5)->frameTicks[0];
+ _objects[6].anim = getAnimation(6);
+ _objects[6].ticks = getAnimation(6)->frameTicks[0];
+ _objects[7].anim = getAnimation(8);
+ _objects[7].ticks = getAnimation(8)->frameTicks[0];
+ _objects[8].anim = getAnimation(9);
+ _objects[8].ticks = getAnimation(9)->frameTicks[0];
+ _objects[9].anim = getAnimation(10);
+ _objects[9].ticks = getAnimation(10)->frameTicks[0];
+ _objects[10].anim = getAnimation(11);
+ _objects[10].ticks = getAnimation(11)->frameTicks[0];
+ _objects[11].anim = getAnimation(12);
+ _objects[11].ticks = getAnimation(12)->frameTicks[0];
+ _objects[12].anim = getAnimation(13);
+ _objects[12].ticks = getAnimation(13)->frameTicks[0];
+ _objects[13].anim = getAnimation(14);
+ _objects[13].ticks = getAnimation(14)->frameTicks[0];
+ _objects[14].anim = getAnimation(15);
+ _objects[14].ticks = getAnimation(15)->frameTicks[0];
+ _objects[15].anim = getAnimation(16);
+ _objects[15].ticks = getAnimation(16)->frameTicks[0];
+ _objects[16].anim = getAnimation(17);
+ _objects[16].ticks = getAnimation(17)->frameTicks[0];
+ _objects[17].anim = getAnimation(18);
+ _objects[17].ticks = getAnimation(18)->frameTicks[0];
+ _objects[18].anim = getAnimation(19);
+ _objects[18].ticks = getAnimation(19)->frameTicks[0];
+ _objects[19].anim = getAnimation(20);
+ _objects[19].ticks = getAnimation(20)->frameTicks[0];
+ _objects[20].anim = getAnimation(21);
+ _objects[20].ticks = getAnimation(21)->frameTicks[0];
+ _objects[21].anim = getAnimation(11);
+ _objects[21].ticks = getAnimation(11)->frameTicks[0];
+ _objects[22].anim = getAnimation(22);
+ _objects[22].ticks = getAnimation(22)->frameTicks[0];
+ _objects[23].anim = getAnimation(23);
+ _objects[23].ticks = getAnimation(23)->frameTicks[0];
+ _objects[24].anim = getAnimation(24);
+ _objects[24].ticks = getAnimation(24)->frameTicks[0];
+ _objects[25].anim = getAnimation(25);
+ _objects[25].ticks = getAnimation(25)->frameTicks[0];
+ _objects[26].anim = getAnimation(26);
+ _objects[26].ticks = getAnimation(26)->frameTicks[0];
+ _objects[27].anim = getAnimation(27);
+ _objects[27].ticks = getAnimation(27)->frameTicks[0];
+ _objects[28].anim = getAnimation(28);
+ _objects[28].ticks = getAnimation(28)->frameTicks[0];
+ _objects[29].anim = getAnimation(29);
+ _objects[29].ticks = getAnimation(29)->frameTicks[0];
+ _objects[30].anim = getAnimation(30);
+ _objects[30].ticks = getAnimation(30)->frameTicks[0];
+ _objects[31].anim = getAnimation(31);
+ _objects[31].ticks = getAnimation(31)->frameTicks[0];
+ _objects[32].anim = getAnimation(32);
+ _objects[32].ticks = getAnimation(32)->frameTicks[0];
+ _objects[33].anim = getAnimation(33);
+ _objects[33].ticks = getAnimation(33)->frameTicks[0];
+ _objects[34].anim = getAnimation(34);
+ _objects[34].ticks = getAnimation(34)->frameTicks[0];
+ _objects[35].anim = getAnimation(35);
+ _objects[35].ticks = getAnimation(35)->frameTicks[0];
+
+ for (int i = 36; i <= 57; ++i) {
+ _objects[i].anim = getAnimation(7);
+ _objects[i].ticks = getAnimation(7)->frameTicks[0];
+ }
+
+ for (int i = 1; i <= 35; ++i) {
+ _objects[i].x = kObjPoints[i - 1].x;
+ _objects[i].y = kObjPoints[i - 1].y;
+ }
+
+ _objects[22].kind = 1;
+ _objects[6].kind = 1;
+ _objects[26].kind = 1;
+ _objects[26].frameIndex = 3;
+ _objects[27].kind = 1;
+ _objects[27].frameIndex = 3;
+ _objects[31].kind = 1;
+ _objects[31].frameIndex = 3;
+ _objects[32].kind = 1;
+ _objects[32].frameIndex = 3;
+ _objects[28].kind = 1;
+ _objects[33].kind = 1;
+ _objects[34].kind = 1;
+ _objects[35].kind = 1;
+
+ _track[0].noteNum = -1;
+ stop();
+ changePatch(0);
+
+}
+
+bool MinigameBbAirGuitar::updateStatus(int mouseX, int mouseY, uint mouseButtons) {
+ switch (_gameState) {
+ case 0:
+ return updateStatus0(mouseX, mouseY, mouseButtons);
+ case 1:
+ return updateStatus1(mouseX, mouseY, mouseButtons);
+ }
+ return false;
+}
+
+bool MinigameBbAirGuitar::updateStatus0(int mouseX, int mouseY, uint mouseButtons) {
+
+ if (mouseButtons & kAnyButtonDown) {
+ stopSound(1);
+ _rockTunePlaying = false;
+ _gameState = 1;
+ initObjects();
+ _gameTicks = 0;
+ } else {
+
+ if (!_rockTunePlaying) {
+ _rockTunePlaying = true;
+ playSound(1, true);
+ }
+
+ _objects[0].x = mouseX;
+ _objects[0].y = mouseY;
+
+ for (int i = 1; i < kMaxObjectsCount; ++i) {
+ Obj *obj = &_objects[i];
+ if (obj->kind && --obj->ticks == 0) {
+ ++obj->frameIndex;
+ if (obj->frameIndex >= obj->anim->frameCount)
+ obj->frameIndex = 0;
+ obj->ticks = obj->anim->frameTicks[obj->frameIndex];
+ }
+ }
+
+ }
+
+ return true;
+}
+
+bool MinigameBbAirGuitar::updateStatus1(int mouseX, int mouseY, uint mouseButtons) {
+
+ int currTicks = _vm->_system->getMillis();
+
+ if (_playerMode == 1 && _track[_trackIndex].ticks <= currTicks - _noteStartTime) {
+ noteOff(_track[_trackIndex].noteNum);
+ if (_trackIndex < _trackCount && _track[++_trackIndex].noteNum != -1)
+ noteOn(_track[_trackIndex].noteNum);
+ else
+ stop();
+ }
+
+ if (_vuMeterLeft1 - 2 <= _vuMeterLeft2) {
+ if (_vuMeterLeft1 + 1 >= _vuMeterLeft2) {
+ int incr = MIN(_vm->getRandom(4), 2) - 1;
+ if (incr < 0 && _vuMeterLeft2 == 0)
+ incr = -incr;
+ if (incr > 0 && _vuMeterLeft2 == 11)
+ incr = -incr;
+ _vuMeterLeft2 += incr;
+ } else {
+ --_vuMeterLeft2;
+ }
+ } else {
+ ++_vuMeterLeft2;
+ }
+
+ if (_vuMeterRight1 - 2 <= _vuMeterRight2) {
+ if (_vuMeterRight1 + 1 >= _vuMeterRight2) {
+ int incr = MIN(_vm->getRandom(4), 2) - 1;
+ if (incr < 0 && _vuMeterRight2 == 0)
+ incr = -incr;
+ if (incr > 0 && _vuMeterRight2 == 11)
+ incr = -incr;
+ _vuMeterRight2 += incr;
+ } else {
+ --_vuMeterRight2;
+ }
+ } else {
+ ++_vuMeterRight2;
+ }
+
+ if (_resetAnims && _vm->_system->getMillis() - _noteStartTime >= 1000)
+ resetObjs();
+
+ _objects[0].x = mouseX;
+ _objects[0].y = mouseY;
+
+ _trackBarMouseX = CLIP(mouseX, kTrackBarMinX, kTrackBarMaxX);
+
+ bool checkClick = false;
+
+ if (mouseButtons & kAnyButtonClicked) {
+ checkClick = true;
+ } else if (!(mouseButtons & kAnyButtonDown)) {
+ afterButtonReleased();
+ } else if (!_movingTrackBar && ((_currButtonNum >= 14 && ptInPoly(_currPianoKeyArea, mouseX, mouseY)) || ptInRect(_currPlayerButtonRect, mouseX, mouseY))) {
+ if (_currButtonNum == 5 && _trackIndex > 0) {
+ --_trackIndex;
+ calcTotalTicks2();
+ } else if (_currButtonNum == 13 && _trackIndex < _trackCount) {
+ ++_trackIndex;
+ calcTotalTicks2();
+ }
+ } else if (!_movingTrackBar)
+ checkClick = true;
+
+ if (checkClick) {
+
+ afterButtonReleased();
+ _objects[0].frameIndex = 1;
+
+ if (ptInRect(&kRect2, mouseX, mouseY)) {
+
+ if (_playerMode != 1 && ptInRect(&kPianoRect, mouseX, mouseY)) {
+ for (int i = 0; i <= 12; ++i) {
+ if (ptInPoly(&kPianoKeyAreas[i], mouseX, mouseY)) {
+ _currButtonNum = i + 14;
+ _currPianoKeyArea = &kPianoKeyAreas[i];
+ _objects[11].kind = 1;
+ _objects[11].x = kPianoKeyInfos[i].x;
+ _objects[11].y = kPianoKeyInfos[i].y;
+ _objects[11].frameIndex = kPianoKeyInfos[i].frameIndex;
+ noteOn(i);
+ break;
+ }
+ }
+ } else if (_playerMode != 1 && ptInRect(&_trackBarThumbRect, mouseX, mouseY)) {
+ _movingTrackBar = true;
+ } else {
+
+ int playerButtonNum = -1;
+ for (int i = 0; i < 14; ++i) {
+ if (ptInRect(&kPlayerButtonRects[i], mouseX, mouseY)) {
+ playerButtonNum = i;
+ break;
+ }
+ }
+
+ if (playerButtonNum >= 0) {
+ _currButtonNum = playerButtonNum;
+ _currPlayerButtonRect = &kPlayerButtonRects[playerButtonNum];
+
+ switch (playerButtonNum) {
+
+ case 0:
+ if (_playerMode == 0) {
+ changePatch(0);
+ _currFrameIndex = &_objects[18 + 0].frameIndex;
+ *_currFrameIndex = 0;
+ }
+ break;
+
+ case 1:
+ if (_playerMode == 0) {
+ changePatch(1);
+ _currFrameIndex = &_objects[18 + 1].frameIndex;
+ *_currFrameIndex = 0;
+ }
+ break;
+
+ case 2:
+ if (_playerMode == 0) {
+ changePatch(2);
+ _currFrameIndex = &_objects[18 + 2].frameIndex;
+ *_currFrameIndex = 0;
+ }
+ break;
+
+ case 3:
+ _btn3KindToggle = !_btn3KindToggle;
+ _objects[9].kind = _btn3KindToggle ? 0 : 1;
+ _objects[22].frameIndex = _btn3KindToggle ? 0 : 1;
+ break;
+
+ case 4:
+ if (_playerMode == 0) {
+ _objects[1].kind = 1;
+ _currFrameIndex = &_objects[1].frameIndex;
+ _objects[1].frameIndex = 0;
+ }
+ break;
+
+ case 5:
+ if (_playerMode == 0) {
+ if (_trackIndex > 0)
+ --_trackIndex;
+ _objects[3].kind = 1;
+ calcTotalTicks2();
+ }
+ break;
+
+ case 6:
+ stop();
+ _currFrameIndex = &_objects[15].frameIndex;
+ _objects[15].frameIndex = 0;
+ break;
+
+ case 7:
+ if (_playerMode == 0) {
+ play();
+ _currFrameIndex = &_objects[12].frameIndex;
+ _objects[12].frameIndex = 0;
+ }
+ break;
+
+ case 8:
+ if (_playerMode == 0) {
+ _trackIndex = 0;
+ _objects[16].kind = 1;
+ calcTotalTicks2();
+ }
+ break;
+
+ case 9:
+ if (_playerMode == 0) {
+ _trackIndex = _trackCount;
+ _objects[17].kind = 1;
+ calcTotalTicks2();
+ }
+ break;
+
+ case 10:
+ if (_playerMode == 0) {
+ record();
+ _currFrameIndex = &_objects[13].frameIndex;
+ _objects[13].frameIndex = 0;
+ }
+ break;
+
+ case 11:
+ if (_playerMode == 0) {
+ setPlayerMode3();
+ _currFrameIndex = &_objects[14].frameIndex;
+ _objects[14].frameIndex = 0;
+ }
+ break;
+
+ case 12:
+ if (_playerMode == 0) {
+ _objects[2].kind = 1;
+ _currFrameIndex = &_objects[2].frameIndex;
+ _objects[2].frameIndex = 0;
+ }
+ break;
+
+ case 13:
+ if (_playerMode == 0) {
+ if (_trackIndex < _trackCount)
+ ++_trackIndex;
+ _objects[4].kind = 1;
+ calcTotalTicks2();
+ }
+ break;
+
+ }
+ }
+ }
+ }
+ }
+
+ if (_playerMode != 0) {
+ _currTrackPos = currTicks + _actionStartTrackPos - _actionStartTime;
+ if (_currTrackPos > _actionTrackPos && _playerMode != 1) {
+ if (_currTrackPos >= 15000) {
+ _currTrackPos = 15000;
+ _actionTrackPos = 15000;
+ stop();
+ } else {
+ _actionTrackPos = currTicks + _actionStartTrackPos - _actionStartTime;
+ }
+ }
+ }
+
+ if (_buttonClickTicks + 1000 < currTicks)
+ _buttonClickTicks = currTicks;
+
+ int newKind = _buttonClickTicks + 500 < currTicks ? 1 : 0;
+
+ switch (_playerMode) {
+
+ case 1:
+ if (_currButtonNum == 7) {
+ _objects[12].kind = 1;
+ _objects[12].frameIndex = 0;
+ } else {
+ _objects[12].kind = newKind;
+ _objects[12].frameIndex = 1;
+ }
+ break;
+
+ case 2:
+ if (_currButtonNum == 10) {
+ _objects[13].kind = 1;
+ _objects[13].frameIndex = 0;
+ } else {
+ _objects[13].kind = newKind;
+ _objects[13].frameIndex = 1;
+ }
+ break;
+
+ case 3:
+ if (_currButtonNum == 11) {
+ _objects[14].kind = 1;
+ _objects[14].frameIndex = 0;
+ } else {
+ _objects[14].kind = newKind;
+ _objects[14].frameIndex = 1;
+ }
+ break;
+
+ }
+
+ updateObjs();
+
+ return true;
+}
+
+void MinigameBbAirGuitar::updateObjs() {
+ for (int i = 24; i <= 33; ++i) {
+ Obj *obj = &_objects[i];
+ if (obj->kind && --obj->ticks == 0) {
+ if (obj->frameIndex + 1 >= obj->anim->frameCount) {
+ obj->ticks = -1;
+ } else {
+ ++obj->frameIndex;
+ obj->ticks = obj->anim->frameTicks[obj->frameIndex];
+ }
+ }
+ }
+}
+
+bool MinigameBbAirGuitar::run(bool fromMainGame) {
+
+ memset(_objects, 0, sizeof(_objects));
+
+ _modified = false;
+ _currPatchNum = -1;
+ _btn3KindToggle = 0;
+ _currButtonNum = 27;
+ _actionStartTime = 0;
+ _currFrameIndex = 0;
+ _currPlayerButtonRect = 0;
+ _currPianoKeyArea = 0;
+ _trackCount = 0;
+ _trackIndex = 0;
+ _totalTrackLength = 0;
+ _actionTrackPos = 0;
+ _noteStartTime = 0;
+ _actionStartTrackPos = 0;
+ _trackBarX = kTrackBarMinX;
+ _currTrackPos = 0;
+ _currNoteNum = -2;
+ _resetAnims = false;
+ _vuMeterLeft2 = 0;
+ _vuMeterRight2 = 0;
+ _vuMeterLeft1 = 0;
+ _vuMeterRight1 = 0;
+ _rockTunePlaying = false;
+
+ _backgroundSpriteIndex = 97;
+ _titleScreenSpriteIndex = 98;
+
+ _fromMainGame = fromMainGame;
+
+ _gameState = 0;
+ _gameTicks = 0;
+ _gameResult = false;
+ _gameDone = false;
+ initObjects();
+
+ _spriteModule = new SpriteModule();
+ _spriteModule->load("bbairg/bbairg.000");
+
+ Palette palette = _spriteModule->getPalette();
+ _vm->_screen->setPalette(palette);
+
+ loadSounds();
+
+ while (!_vm->shouldQuit() &&!_gameDone) {
+ _vm->updateEvents();
+ update();
+ }
+
+ _vm->_sound->unloadSounds();
+
+ delete _spriteModule;
+
+ return _gameResult;
+}
+
+void MinigameBbAirGuitar::update() {
+
+ int inputTicks;
+
+ if (_gameTicks > 0) {
+ int currTicks = _vm->_system->getMillis();
+ inputTicks = 3 * (currTicks - _gameTicks) / 50;
+ _gameTicks = currTicks - (currTicks - _gameTicks - 50 * inputTicks / 3);
+ } else {
+ inputTicks = 1;
+ _gameTicks = _vm->_system->getMillis();
+ }
+
+ if (_vm->_keyCode == Common::KEYCODE_ESCAPE) {
+ _gameDone = true;
+ return;
+ }
+
+ if (inputTicks == 0)
+ return;
+
+ bool done;
+
+ do {
+ done = !updateStatus(_vm->_mouseX, _vm->_mouseY, _vm->_mouseButtons);
+ _vm->_mouseButtons &= ~kLeftButtonClicked;
+ _vm->_mouseButtons &= ~kRightButtonClicked;
+ _vm->_keyCode = Common::KEYCODE_INVALID;
+ } while (--inputTicks && _gameTicks > 0 && !done);
+
+ drawSprites();
+
+ _vm->_system->delayMillis(10);
+
+}
+
+void MinigameBbAirGuitar::play() {
+ if (_track[_trackIndex].noteNum != -1) {
+ _playerMode = 1;
+ _objects[7].kind = 1;
+ _objects[8].kind = 0;
+ _objects[15].kind = 0;
+ _actionStartTime = _vm->_system->getMillis();
+ _actionStartTrackPos = _currTrackPos;
+ noteOn(_track[_trackIndex].noteNum);
+ }
+}
+
+
+void MinigameBbAirGuitar::record() {
+ _playerMode = 2;
+ _objects[7].kind = 1;
+ _objects[8].kind = 0;
+ _objects[15].kind = 0;
+ _totalTrackLength = 15000;
+ _actionStartTime = _vm->_system->getMillis();
+ _actionStartTrackPos = _currTrackPos;
+ _noteStartTime = _vm->_system->getMillis();
+ _actionTrackPos = _currTrackPos;
+ _trackCount = _trackIndex;
+ _vuMeterRight1 = 0;
+ _vuMeterRight2 = 0;
+ _vuMeterLeft1 = 0;
+ _vuMeterLeft2 = 0;
+ _modified = true;
+ _track[_trackIndex].noteNum = -2;
+}
+
+void MinigameBbAirGuitar::setPlayerMode3() {
+ _playerMode = 3;
+ _objects[7].kind = 1;
+ _objects[8].kind = 0;
+ _objects[15].kind = 0;
+ _totalTrackLength = 15000;
+ _actionStartTime = _vm->_system->getMillis();
+ _actionStartTrackPos = _currTrackPos;
+ _noteStartTime = _vm->_system->getMillis();
+ _actionTrackPos = _currTrackPos;
+ _trackCount = _trackIndex;
+ _vuMeterRight1 = 0;
+ _vuMeterRight2 = 0;
+ _vuMeterLeft1 = 0;
+ _vuMeterLeft2 = 0;
+ _modified = true;
+ _track[_trackIndex].noteNum = -2;
+}
+
+void MinigameBbAirGuitar::stop() {
+ noteOff(_currNoteNum);
+ if (_playerMode == 2 || _playerMode == 3) {
+ _totalTrackLength = _actionTrackPos;
+ _track[_trackCount].noteNum = -1;
+ }
+ _playerMode = 0;
+ _objects[7].kind = 0;
+ _objects[8].kind = 1;
+ _objects[15].kind = 1;
+ _objects[15].frameIndex = 1;
+ _objects[12].kind = 0;
+ _objects[13].kind = 0;
+ _objects[14].kind = 0;
+ resetObjs();
+}
+
+void MinigameBbAirGuitar::changePatch(int patchNum) {
+
+ resetObjs();
+
+ if (patchNum == -1 || patchNum != _currPatchNum)
+ _currPatchNum = -1;
+
+ _objects[20].kind = 0;
+ _objects[19].kind = _objects[20].kind;
+ _objects[18].kind = _objects[19].kind;
+ _objects[patchNum + 18].kind = 1;
+ _objects[patchNum + 18].frameIndex = 1;
+ _objects[6].frameIndex = patchNum;
+ _currPatchNum = patchNum;
+}
+
+void MinigameBbAirGuitar::afterButtonReleased() {
+ if (_movingTrackBar) {
+ _movingTrackBar = false;
+ _currTrackPos = _totalTrackLength * (_trackBarX - kTrackBarMinX) / 100;
+ calcTotalTicks1();
+ } else {
+ switch (_currButtonNum) {
+ case 0:
+ case 1:
+ case 2:
+ *_currFrameIndex = 1;
+ break;
+ case 4:
+ *_currFrameIndex = 1;
+ // TODO Run load dialog
+ break;
+ case 5:
+ _objects[3].kind = 0;
+ break;
+ case 6:
+ *_currFrameIndex = 1;
+ break;
+ case 7:
+ *_currFrameIndex = 1;
+ break;
+ case 8:
+ _objects[16].kind = 0;
+ break;
+ case 9:
+ _objects[17].kind = 0;
+ break;
+ case 10:
+ *_currFrameIndex = 1;
+ break;
+ case 11:
+ *_currFrameIndex = 1;
+ break;
+ case 12:
+ *_currFrameIndex = 1;
+ // TODO Run save dialog
+ break;
+ case 13:
+ _objects[4].kind = 0;
+ break;
+ case 14:
+ case 15:
+ case 16:
+ case 17:
+ case 18:
+ case 19:
+ case 20:
+ case 21:
+ case 22:
+ case 23:
+ case 24:
+ case 25:
+ case 26:
+ noteOff(_currButtonNum - 14);
+ break;
+ }
+ }
+
+ _objects->frameIndex = 0;
+ _currPlayerButtonRect = 0;
+ _currPianoKeyArea = 0;
+ _currButtonNum = 27;
+}
+
+void MinigameBbAirGuitar::calcTotalTicks2() {
+ _currTrackPos = 0;
+ for (int i = 0; i < _trackIndex; ++i)
+ _currTrackPos += _track[i].ticks;
+}
+
+void MinigameBbAirGuitar::calcTotalTicks1() {
+ int totalTicks = 0;
+ // TODO Try to clean this up
+ _trackIndex = 0;
+ if (_track[0].ticks <= _currTrackPos) {
+ do {
+ totalTicks += _track[_trackIndex].ticks;
+ if (_trackIndex >= _trackCount)
+ break;
+ ++_trackIndex;
+ } while (totalTicks + _track[_trackIndex].ticks <= _currTrackPos);
+ }
+ _currTrackPos = totalTicks;
+}
+
+void MinigameBbAirGuitar::noteOn(int noteNum) {
+
+ if (_currNoteNum != -2) {
+ if (noteNum == _currNoteNum)
+ return;
+ noteOff(_currNoteNum);
+ }
+
+ if (noteNum == -2) {
+ _vuMeterRight1 = 0;
+ _vuMeterRight2 = 0;
+ _vuMeterLeft1 = 0;
+ _vuMeterLeft2 = 0;
+ } else {
+ playNote(noteNum);
+ _vuMeterRight1 = 10;
+ _vuMeterRight2 = 10;
+ _vuMeterLeft1 = 10;
+ _vuMeterLeft2 = 10;
+ if (_btn3KindToggle) {
+ _objects[23].kind = 1;
+ _objects[23].frameIndex = noteNum;
+ } else {
+ _objects[10].kind = 1;
+ _objects[10].frameIndex = kNoteFrameTbl[noteNum].frameIndex;
+ if (kNoteFrameTbl[noteNum].flag) {
+ _objects[21].kind = 1;
+ _objects[21].frameIndex = 7;
+ }
+ }
+ }
+
+ _currNoteNum = noteNum;
+
+ if (_playerMode == 2 || _playerMode == 3) {
+ _ticksDelta = _vm->_system->getMillis() - _noteStartTime;
+ _track[_trackCount].ticks = _ticksDelta;
+ if (_trackCount < kMaxTracks - 1)
+ ++_trackCount;
+ _track[_trackCount].noteNum = noteNum;
+ }
+
+ _noteStartTime = _vm->_system->getMillis();
+
+ if (noteNum != -2) {
+ _resetAnims = false;
+ if (_currPatchNum == 0) {
+ _objects[25].kind = 1;
+ _objects[28].kind = 0;
+ _objects[25].frameIndex = 0;
+ _objects[25].ticks = getAnimation(25)->frameTicks[0];
+ _objects[26].frameIndex = 0;
+ _objects[26].ticks = getAnimation(26)->frameTicks[0];
+ _objects[27].frameIndex = 0;
+ _objects[27].ticks = getAnimation(27)->frameTicks[0];
+ _objects[30].kind = 1;
+ _objects[33].kind = 0;
+ _objects[30].frameIndex = 0;
+ _objects[30].ticks = getAnimation(30)->frameTicks[0];
+ _objects[31].frameIndex = 0;
+ _objects[31].ticks = getAnimation(31)->frameTicks[0];
+ _objects[32].frameIndex = 0;
+ _objects[32].ticks = getAnimation(32)->frameTicks[0];
+ } else if (_currPatchNum == 1) {
+ _objects[29].kind = 1;
+ _objects[33].kind = 0;
+ _objects[29].frameIndex = 0;
+ _objects[29].ticks = getAnimation(29)->frameTicks[0];
+ _objects[31].frameIndex = 0;
+ _objects[31].ticks = getAnimation(31)->frameTicks[0];
+ _objects[32].frameIndex = 0;
+ _objects[32].ticks = getAnimation(32)->frameTicks[0];
+ } else if (_currPatchNum == 2) {
+ _objects[24].kind = 1;
+ _objects[28].kind = 0;
+ _objects[24].frameIndex = 0;
+ _objects[24].ticks = getAnimation(24)->frameTicks[0];
+ _objects[26].frameIndex = 0;
+ _objects[26].ticks = getAnimation(26)->frameTicks[0];
+ _objects[27].frameIndex = 0;
+ _objects[27].ticks = getAnimation(27)->frameTicks[0];
+ }
+ }
+
+}
+
+void MinigameBbAirGuitar::noteOff(int noteNum) {
+
+ if (_currNoteNum != noteNum)
+ return;
+
+ if (noteNum != -2)
+ stopNote(noteNum);
+
+ _objects[21].kind = 0;
+ _objects[23].kind = _objects[21].kind;
+ _objects[10].kind = _objects[23].kind;
+
+ _vuMeterRight1 = 0;
+ _vuMeterRight2 = 0;
+ _vuMeterLeft1 = 0;
+ _vuMeterLeft2 = 0;
+
+ _currNoteNum = -2;
+
+ _objects[11].kind = 0;
+
+ _ticksDelta = _vm->_system->getMillis() - _noteStartTime;
+
+ if (_playerMode == 2 || _playerMode == 3) {
+ if (_actionTrackPos + _ticksDelta > 15000)
+ _ticksDelta = 15000 - _actionTrackPos;
+ _track[_trackCount].ticks = _ticksDelta;
+ if (_trackCount < 2048)
+ ++_trackCount;
+ _track[_trackCount].noteNum = -2;
+ _noteStartTime = _vm->_system->getMillis();
+ }
+
+ if (noteNum != -2) {
+ if (_playerMode == 0) {
+ _resetAnims = true;
+ _noteStartTime = _vm->_system->getMillis();
+ }
+ if (_currPatchNum == 0) {
+ _objects[25].frameIndex = 3;
+ _objects[25].ticks = -1;
+ _objects[26].frameIndex = 3;
+ _objects[26].ticks = -1;
+ _objects[27].frameIndex = 3;
+ _objects[27].ticks = -1;
+ _objects[30].frameIndex = 3;
+ _objects[30].ticks = -1;
+ _objects[31].frameIndex = 3;
+ _objects[31].ticks = -1;
+ _objects[32].frameIndex = 3;
+ _objects[32].ticks = -1;
+ } else if (_currPatchNum == 1) {
+ _objects[29].frameIndex = 3;
+ _objects[29].ticks = -1;
+ _objects[31].frameIndex = 3;
+ _objects[31].ticks = -1;
+ _objects[32].frameIndex = 3;
+ _objects[32].ticks = -1;
+ } else if (_currPatchNum == 2) {
+ _objects[24].frameIndex = 2;
+ _objects[24].ticks = -1;
+ _objects[26].frameIndex = 3;
+ _objects[26].ticks = -1;
+ _objects[27].frameIndex = 3;
+ _objects[27].ticks = -1;
+ }
+ }
+
+}
+
+void MinigameBbAirGuitar::resetObjs() {
+ _resetAnims = false;
+ _objects[25].kind = 0;
+ _objects[24].kind = 0;
+ _objects[28].kind = 1;
+ _objects[26].frameIndex = 0;
+ _objects[26].ticks = -1;
+ _objects[27].frameIndex = 0;
+ _objects[27].ticks = -1;
+ _objects[30].kind = 0;
+ _objects[29].kind = 0;
+ _objects[33].kind = 1;
+ _objects[31].frameIndex = 0;
+ _objects[31].ticks = -1;
+ _objects[32].frameIndex = 0;
+ _objects[32].ticks = -1;
+}
+
+void MinigameBbAirGuitar::loadSounds() {
+ _vm->_sound->loadSound("bbairg/audio/rocktune.aif");
+ for (uint i = 0; i < kPatchDirectoriesCount; ++i) {
+ const char *patchDirectory = kPatchDirectories[i];
+ for (uint j = 0; j < kNoteSoundFilenamesCount; ++j) {
+ Common::String filename = Common::String::format("bbairg/audio/%s/%s", patchDirectory, kNoteSoundFilenames[j]);
+ _vm->_sound->loadSound(filename.c_str());
+ }
+ }
+}
+
+void MinigameBbAirGuitar::playNote(int noteNum) {
+ if (noteNum >= 0 && _currPatchNum >= 0)
+ playSound(2 + _currPatchNum * kNoteSoundFilenamesCount + noteNum);
+}
+
+void MinigameBbAirGuitar::stopNote(int noteNum) {
+ if (noteNum >= 0 && _currPatchNum >= 0)
+ stopSound(2 + _currPatchNum * kNoteSoundFilenamesCount + noteNum);
+}
+
+} // End of namespace Bbvs
diff --git a/engines/bbvs/minigames/bbairguitar.h b/engines/bbvs/minigames/bbairguitar.h
new file mode 100644
index 0000000000..d4fd6ec30c
--- /dev/null
+++ b/engines/bbvs/minigames/bbairguitar.h
@@ -0,0 +1,148 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+
+ * You should have received a copy of the GNU General Public 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 BBVS_MINIGAMES_BBAIRGUITAR_H
+#define BBVS_MINIGAMES_BBAIRGUITAR_H
+
+#include "bbvs/minigames/minigame.h"
+
+namespace Bbvs {
+
+class MinigameBbAirGuitar : public Minigame {
+public:
+ MinigameBbAirGuitar(BbvsEngine *vm) : Minigame(vm) {};
+ bool run(bool fromMainGame);
+public:
+
+ struct Obj {
+ int kind;
+ int x, y;
+ int xIncr, yIncr;
+ const ObjAnimation *anim;
+ int frameIndex;
+ int ticks;
+ int status;
+ int16 frameIndexAdd;
+ int16 unk2;
+ };
+
+ enum {
+ kMaxObjectsCount = 256,
+ kMaxTracks = 2049
+ };
+
+ struct PianoKeyInfo {
+ int x, y;
+ int frameIndex;
+ };
+
+ struct TrackEvt {
+ int8 noteNum;
+ int16 ticks;
+ };
+
+ Obj _objects[kMaxObjectsCount];
+
+ int _playerMode;
+
+ bool _modified;
+
+ TrackEvt _track[kMaxTracks];
+ int _trackIndex, _trackCount;
+
+ int _noteStartTime;
+
+ int _vuMeterLeft1, _vuMeterLeft2;
+ int _vuMeterRight1, _vuMeterRight2;
+
+ bool _resetAnims;
+ bool _rockTunePlaying;
+
+ int _currButtonNum;
+ int _buttonClickTicks;
+
+ int *_currFrameIndex;
+ int _btn3KindToggle;
+
+ const BBPolygon *_currPianoKeyArea;
+ const Rect *_currPlayerButtonRect;
+
+ bool _movingTrackBar;
+ int _trackBarMouseX;
+ int _trackBarX;
+ Rect _trackBarThumbRect;
+
+ int _currTrackPos, _totalTrackLength;
+ int _ticksDelta;
+
+ int _actionStartTrackPos, _actionTrackPos;
+ int _actionStartTime;
+
+ int _currNoteNum;
+ int _currPatchNum;
+
+ const ObjAnimation *getAnimation(int animIndex);
+ bool ptInRect(const Rect *r, int x, int y);
+ bool ptInPoly(const BBPolygon *poly, int x, int y);
+
+ void buildDrawList(DrawList &drawList);
+ void buildDrawList0(DrawList &drawList);
+ void buildDrawList1(DrawList &drawList);
+
+ void drawSprites();
+
+ void initObjs();
+ Obj *getFreeObject();
+
+ void initObjects();
+ void initObjects0();
+ void initObjects1();
+
+ bool updateStatus(int mouseX, int mouseY, uint mouseButtons);
+ bool updateStatus0(int mouseX, int mouseY, uint mouseButtons);
+ bool updateStatus1(int mouseX, int mouseY, uint mouseButtons);
+
+ void updateObjs();
+
+ void update();
+
+ void play();
+ void record();
+ void setPlayerMode3();
+ void stop();
+ void changePatch(int patchNum);
+ void afterButtonReleased();
+ void calcTotalTicks2();
+ void calcTotalTicks1();
+ void noteOn(int noteNum);
+ void noteOff(int noteNum);
+ void resetObjs();
+
+ void loadSounds();
+ void playNote(int noteNum);
+ void stopNote(int noteNum);
+
+};
+
+} // End of namespace Bbvs
+
+#endif // BBVS_MINIGAMES_BBAIRGUITAR_H
diff --git a/engines/bbvs/minigames/bbairguitar_anims.cpp b/engines/bbvs/minigames/bbairguitar_anims.cpp
new file mode 100644
index 0000000000..4f87eb5c78
--- /dev/null
+++ b/engines/bbvs/minigames/bbairguitar_anims.cpp
@@ -0,0 +1,186 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ */
+
+#include "bbvs/minigames/bbairguitar.h"
+
+namespace Bbvs {
+
+static const int kAnim0FrameIndices[] = {0, 1};
+static const int16 kAnim0FrameTicks[] = {6, 6};
+static const BBRect kAnim0FrameRects[] = {{0, 0, 0, 0}, {0, 0, 0, 0}};
+static const int kAnim1FrameIndices[] = {2, 3};
+static const int16 kAnim1FrameTicks[] = {6, 6};
+static const BBRect kAnim1FrameRects[] = {{0, 0, 0, 0}, {0, 0, 0, 0}};
+static const int kAnim2FrameIndices[] = {4, 5};
+static const int16 kAnim2FrameTicks[] = {6, 6};
+static const BBRect kAnim2FrameRects[] = {{0, 0, 0, 0}, {0, 0, 0, 0}};
+static const int kAnim3FrameIndices[] = {6};
+static const int16 kAnim3FrameTicks[] = {6};
+static const BBRect kAnim3FrameRects[] = {{0, 0, 0, 0}};
+static const int kAnim4FrameIndices[] = {7};
+static const int16 kAnim4FrameTicks[] = {6};
+static const BBRect kAnim4FrameRects[] = {{0, 0, 0, 0}};
+static const int kAnim5FrameIndices[] = {8};
+static const int16 kAnim5FrameTicks[] = {6};
+static const BBRect kAnim5FrameRects[] = {{0, 0, 0, 0}};
+static const int kAnim6FrameIndices[] = {9, 10, 11};
+static const int16 kAnim6FrameTicks[] = {6, 6, 6};
+static const BBRect kAnim6FrameRects[] = {{0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}};
+static const int kAnim7FrameIndices[] = {12, 13, 14, 15};
+static const int16 kAnim7FrameTicks[] = {10, 10, 10, 10};
+static const BBRect kAnim7FrameRects[] = {{0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}};
+static const int kAnim8FrameIndices[] = {16};
+static const int16 kAnim8FrameTicks[] = {10};
+static const BBRect kAnim8FrameRects[] = {{0, 0, 0, 0}};
+static const int kAnim9FrameIndices[] = {17};
+static const int16 kAnim9FrameTicks[] = {10};
+static const BBRect kAnim9FrameRects[] = {{0, 0, 0, 0}};
+static const int kAnim10FrameIndices[] = {18};
+static const int16 kAnim10FrameTicks[] = {6};
+static const BBRect kAnim10FrameRects[] = {{0, 0, 0, 0}};
+static const int kAnim11FrameIndices[] = {19, 20, 21, 22, 23, 24, 25, 26, 27};
+static const int16 kAnim11FrameTicks[] = {6, 6, 6, 6, 6, 6, 6, 6, 6};
+static const BBRect kAnim11FrameRects[] = {{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}};
+static const int kAnim12FrameIndices[] = {28, 29, 30, 31, 32, 33};
+static const int16 kAnim12FrameTicks[] = {10, 10, 10, 10, 10, 10};
+static const BBRect kAnim12FrameRects[] = {{0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}};
+static const int kAnim13FrameIndices[] = {34, 35};
+static const int16 kAnim13FrameTicks[] = {6, 6};
+static const BBRect kAnim13FrameRects[] = {{0, 0, 0, 0}, {0, 0, 0, 0}};
+static const int kAnim14FrameIndices[] = {36, 37};
+static const int16 kAnim14FrameTicks[] = {6, 6};
+static const BBRect kAnim14FrameRects[] = {{0, 0, 0, 0}, {0, 0, 0, 0}};
+static const int kAnim15FrameIndices[] = {38, 39};
+static const int16 kAnim15FrameTicks[] = {6, 6};
+static const BBRect kAnim15FrameRects[] = {{0, 0, 0, 0}, {0, 0, 0, 0}};
+static const int kAnim16FrameIndices[] = {40, 41};
+static const int16 kAnim16FrameTicks[] = {6, 6};
+static const BBRect kAnim16FrameRects[] = {{0, 0, 0, 0}, {0, 0, 0, 0}};
+static const int kAnim17FrameIndices[] = {42};
+static const int16 kAnim17FrameTicks[] = {6};
+static const BBRect kAnim17FrameRects[] = {{0, 0, 0, 0}};
+static const int kAnim18FrameIndices[] = {43};
+static const int16 kAnim18FrameTicks[] = {6};
+static const BBRect kAnim18FrameRects[] = {{0, 0, 0, 0}};
+static const int kAnim19FrameIndices[] = {44, 45};
+static const int16 kAnim19FrameTicks[] = {6, 6};
+static const BBRect kAnim19FrameRects[] = {{0, 0, 0, 0}, {0, 0, 0, 0}};
+static const int kAnim20FrameIndices[] = {46, 47};
+static const int16 kAnim20FrameTicks[] = {6, 6};
+static const BBRect kAnim20FrameRects[] = {{0, 0, 0, 0}, {0, 0, 0, 0}};
+static const int kAnim21FrameIndices[] = {48, 49};
+static const int16 kAnim21FrameTicks[] = {6, 6};
+static const BBRect kAnim21FrameRects[] = {{0, 0, 0, 0}, {0, 0, 0, 0}};
+static const int kAnim22FrameIndices[] = {50, 51};
+static const int16 kAnim22FrameTicks[] = {10, 10};
+static const BBRect kAnim22FrameRects[] = {{0, 0, 0, 0}, {0, 0, 0, 0}};
+static const int kAnim23FrameIndices[] = {52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64};
+static const int16 kAnim23FrameTicks[] = {8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8};
+static const BBRect kAnim23FrameRects[] = {{0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}};
+static const int kAnim24FrameIndices[] = {65, 66, 67};
+static const int16 kAnim24FrameTicks[] = {11, 16, 6};
+static const BBRect kAnim24FrameRects[] = {{0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}};
+static const int kAnim25FrameIndices[] = {68, 67, 69, 67};
+static const int16 kAnim25FrameTicks[] = {6, 6, 11, 6};
+static const BBRect kAnim25FrameRects[] = {{0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}};
+static const int kAnim26FrameIndices[] = {70, 71, 72, 71};
+static const int16 kAnim26FrameTicks[] = {6, 6, 6, 6};
+static const BBRect kAnim26FrameRects[] = {{0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}};
+static const int kAnim27FrameIndices[] = {73, 74, 75, 74};
+static const int16 kAnim27FrameTicks[] = {6, 6, 6, 6};
+static const BBRect kAnim27FrameRects[] = {{0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}};
+static const int kAnim28FrameIndices[] = {76};
+static const int16 kAnim28FrameTicks[] = {6};
+static const BBRect kAnim28FrameRects[] = {{0, 0, 0, 0}};
+static const int kAnim29FrameIndices[] = {77, 78, 79, 78};
+static const int16 kAnim29FrameTicks[] = {6, 6, 18, 6};
+static const BBRect kAnim29FrameRects[] = {{0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}};
+static const int kAnim30FrameIndices[] = {77, 80, 81, 80};
+static const int16 kAnim30FrameTicks[] = {6, 6, 10, 6};
+static const BBRect kAnim30FrameRects[] = {{0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}};
+static const int kAnim31FrameIndices[] = {82, 83, 84, 83};
+static const int16 kAnim31FrameTicks[] = {6, 6, 6, 6};
+static const BBRect kAnim31FrameRects[] = {{0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}};
+static const int kAnim32FrameIndices[] = {85, 86, 87, 86};
+static const int16 kAnim32FrameTicks[] = {6, 6, 6, 6};
+static const BBRect kAnim32FrameRects[] = {{0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}};
+static const int kAnim33FrameIndices[] = {88};
+static const int16 kAnim33FrameTicks[] = {6};
+static const BBRect kAnim33FrameRects[] = {{0, 0, 0, 0}};
+static const int kAnim34FrameIndices[] = {89};
+static const int16 kAnim34FrameTicks[] = {6};
+static const BBRect kAnim34FrameRects[] = {{0, 0, 0, 0}};
+static const int kAnim35FrameIndices[] = {90};
+static const int16 kAnim35FrameTicks[] = {6};
+static const BBRect kAnim35FrameRects[] = {{0, 0, 0, 0}};
+static const int kAnim36FrameIndices[] = {91, 92, 93, 91, 93, 91, 92, 93, 92, 91, 92, 93, 91, 93, 91, 92, 93, 92};
+static const int16 kAnim36FrameTicks[] = {10, 6, 8, 6, 6, 8, 6, 6, 6, 10, 6, 8, 6, 6, 8, 6, 6, 6};
+static const BBRect kAnim36FrameRects[] = {{0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}};
+static const int kAnim37FrameIndices[] = {94, 95, 96, 94, 96, 94, 95, 96, 95, 94, 95, 96, 94, 96, 94, 95, 96, 95};
+static const int16 kAnim37FrameTicks[] = {10, 6, 8, 6, 6, 8, 6, 6, 6, 10, 6, 8, 6, 6, 8, 6, 6, 6};
+static const BBRect kAnim37FrameRects[] = {{0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}};
+static const ObjAnimation kAnimations[] = {
+ {2, kAnim0FrameIndices, kAnim0FrameTicks, kAnim0FrameRects},
+ {2, kAnim1FrameIndices, kAnim1FrameTicks, kAnim1FrameRects},
+ {2, kAnim2FrameIndices, kAnim2FrameTicks, kAnim2FrameRects},
+ {1, kAnim3FrameIndices, kAnim3FrameTicks, kAnim3FrameRects},
+ {1, kAnim4FrameIndices, kAnim4FrameTicks, kAnim4FrameRects},
+ {1, kAnim5FrameIndices, kAnim5FrameTicks, kAnim5FrameRects},
+ {3, kAnim6FrameIndices, kAnim6FrameTicks, kAnim6FrameRects},
+ {4, kAnim7FrameIndices, kAnim7FrameTicks, kAnim7FrameRects},
+ {1, kAnim8FrameIndices, kAnim8FrameTicks, kAnim8FrameRects},
+ {1, kAnim9FrameIndices, kAnim9FrameTicks, kAnim9FrameRects},
+ {1, kAnim10FrameIndices, kAnim10FrameTicks, kAnim10FrameRects},
+ {9, kAnim11FrameIndices, kAnim11FrameTicks, kAnim11FrameRects},
+ {6, kAnim12FrameIndices, kAnim12FrameTicks, kAnim12FrameRects},
+ {2, kAnim13FrameIndices, kAnim13FrameTicks, kAnim13FrameRects},
+ {2, kAnim14FrameIndices, kAnim14FrameTicks, kAnim14FrameRects},
+ {2, kAnim15FrameIndices, kAnim15FrameTicks, kAnim15FrameRects},
+ {2, kAnim16FrameIndices, kAnim16FrameTicks, kAnim16FrameRects},
+ {1, kAnim17FrameIndices, kAnim17FrameTicks, kAnim17FrameRects},
+ {1, kAnim18FrameIndices, kAnim18FrameTicks, kAnim18FrameRects},
+ {2, kAnim19FrameIndices, kAnim19FrameTicks, kAnim19FrameRects},
+ {2, kAnim20FrameIndices, kAnim20FrameTicks, kAnim20FrameRects},
+ {2, kAnim21FrameIndices, kAnim21FrameTicks, kAnim21FrameRects},
+ {2, kAnim22FrameIndices, kAnim22FrameTicks, kAnim22FrameRects},
+ {13, kAnim23FrameIndices, kAnim23FrameTicks, kAnim23FrameRects},
+ {3, kAnim24FrameIndices, kAnim24FrameTicks, kAnim24FrameRects},
+ {4, kAnim25FrameIndices, kAnim25FrameTicks, kAnim25FrameRects},
+ {4, kAnim26FrameIndices, kAnim26FrameTicks, kAnim26FrameRects},
+ {4, kAnim27FrameIndices, kAnim27FrameTicks, kAnim27FrameRects},
+ {1, kAnim28FrameIndices, kAnim28FrameTicks, kAnim28FrameRects},
+ {4, kAnim29FrameIndices, kAnim29FrameTicks, kAnim29FrameRects},
+ {4, kAnim30FrameIndices, kAnim30FrameTicks, kAnim30FrameRects},
+ {4, kAnim31FrameIndices, kAnim31FrameTicks, kAnim31FrameRects},
+ {4, kAnim32FrameIndices, kAnim32FrameTicks, kAnim32FrameRects},
+ {1, kAnim33FrameIndices, kAnim33FrameTicks, kAnim33FrameRects},
+ {1, kAnim34FrameIndices, kAnim34FrameTicks, kAnim34FrameRects},
+ {1, kAnim35FrameIndices, kAnim35FrameTicks, kAnim35FrameRects},
+ {18, kAnim36FrameIndices, kAnim36FrameTicks, kAnim36FrameRects},
+ {18, kAnim37FrameIndices, kAnim37FrameTicks, kAnim37FrameRects}
+};
+
+const ObjAnimation *MinigameBbAirGuitar::getAnimation(int animIndex) {
+ return &kAnimations[animIndex];
+}
+
+} // End of namespace Bbvs
diff --git a/engines/bbvs/minigames/bbant.cpp b/engines/bbvs/minigames/bbant.cpp
new file mode 100644
index 0000000000..9786682ada
--- /dev/null
+++ b/engines/bbvs/minigames/bbant.cpp
@@ -0,0 +1,1317 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+
+ * You should have received a copy of the GNU General Public 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 "bbvs/minigames/bbant.h"
+
+namespace Bbvs {
+
+static const BBPoint kPosIncrTbl1[] = {
+ {0, -1}, {-1, -1}, {-1, 0}, {-1, 1},
+ { 0, 1}, { 1, 1}, { 1, 0}, { 1, -1}
+};
+
+static const BBPoint kPosIncrTbl2[] = {
+ {0, -2}, {-2, -2}, {-2, 0}, {-2, 2},
+ { 0, 2}, { 2, 2}, { 2, 0}, { 2, -2}
+};
+
+static const int kScoreTbl[] = {
+ 0, 1, 1, 3, 2, 4
+};
+
+static const char * const kSoundFilenames[] = {
+ "ant1.aif", "ant2.aif", "ant3.aif", "ant4.aif", "ant5.aif",
+ "ant6.aif", "ant7.aif", "ant8.aif", "ant9.aif", "ant10.aif",
+ "ant11.aif", "antmus1.aif", "fryant.aif", "stomp.aif", "bing.aif",
+ "bvyell.aif"
+};
+
+static const uint kSoundFilenamesCount = ARRAYSIZE(kSoundFilenames);
+
+static const uint kSoundTbl1[] = {
+ 2, 3, 4, 6
+};
+
+static const uint kSoundTbl2[] = {
+ 5, 7, 11
+};
+
+static const uint kSoundTbl3[] = {
+ 8, 10, 11
+};
+
+static const uint kSoundTbl4[] = {
+ 2, 3, 4, 6, 8, 10, 11, 5, 7, 16
+};
+
+void MinigameBbAnt::buildDrawList0(DrawList &drawList) {
+
+ if (_titleScreenSpriteIndex)
+ drawList.add(_titleScreenSpriteIndex, 0, 0, 0);
+
+ for (int i = 0; i < kMaxObjectsCount; ++i) {
+ Obj *obj = &_objects[i];
+ if (obj->kind)
+ drawList.add(obj->anim->frameIndices[obj->frameIndex], obj->x, obj->y, obj->priority);
+ }
+
+}
+
+void MinigameBbAnt::buildDrawList1(DrawList &drawList) {
+
+ if (_backgroundSpriteIndex)
+ drawList.add(_backgroundSpriteIndex, _stompX, _stompY, 0);
+
+ for (int i = 1; i < kMaxObjectsCount; ++i) {
+ Obj *obj = &_objects[i];
+ if (obj->kind) {
+ drawList.add(obj->anim->frameIndices[obj->frameIndex],
+ _stompX + (obj->x >> 16), _stompY + (obj->y >> 16),
+ obj->priority);
+ }
+ }
+
+ drawList.add(getAnimation(164)->frameIndices[0], 5, 2, 2000);
+ drawNumber(drawList, _score, 68, 16);
+ drawList.add(getAnimation(166)->frameIndices[0], 230, 2, 2000);
+ drawNumber(drawList, _levelTimeLeft, 280, 16);
+
+ for (int i = 0; i < _stompCount; ++i)
+ drawList.add(getAnimation(130)->frameIndices[0], 20 + i * 30, 230, 2000);
+
+}
+
+void MinigameBbAnt::buildDrawList2(DrawList &drawList) {
+ buildDrawList1(drawList);
+ drawList.add(getAnimation(168)->frameIndices[0], 40, 100, 2000);
+ drawNumber(drawList, _counter1, 190, 112);
+ drawNumber(drawList, _countdown5, 258, 112);
+ drawList.add(getAnimation(169)->frameIndices[0], 120, 120, 2000);
+ drawNumber(drawList, _counter4, 192, 132);
+}
+
+void MinigameBbAnt::buildDrawList3(DrawList &drawList) {
+ buildDrawList1(drawList);
+ drawList.add(getAnimation(163)->frameIndices[0], 120, 70, 2000);
+ drawList.add(getAnimation(165)->frameIndices[0], 95, 95, 2000);
+ drawNumber(drawList, _hiScore, 208, 107);
+}
+
+void MinigameBbAnt::drawMagnifyingGlass(DrawList &drawList) {
+ scale2x(_objects[0].x - 28, _objects[0].y - 27);
+ drawList.clear();
+ drawList.add(_objects[0].anim->frameIndices[0], _objects[0].x, _objects[0].y, _objects[0].priority);
+ drawList.add(_objects[0].anim->frameIndices[1], _objects[0].x, _objects[0].y, _objects[0].priority);
+ drawList.add(_objects[0].anim->frameIndices[2], _objects[0].x, _objects[0].y, _objects[0].priority);
+}
+
+void MinigameBbAnt::drawSprites() {
+ switch (_gameState) {
+ case 0:
+ drawSprites0();
+ break;
+ case 1:
+ drawSprites1();
+ break;
+ case 2:
+ drawSprites2();
+ break;
+ case 3:
+ drawSprites3();
+ break;
+ }
+}
+
+void MinigameBbAnt::drawSprites0() {
+ DrawList drawList;
+ buildDrawList0(drawList);
+ _vm->_screen->drawDrawList(drawList, _spriteModule);
+ _vm->_screen->copyToScreen();
+}
+
+void MinigameBbAnt::drawSprites1() {
+ DrawList drawList;
+ buildDrawList1(drawList);
+ _vm->_screen->drawDrawList(drawList, _spriteModule);
+ drawMagnifyingGlass(drawList);
+ _vm->_screen->drawDrawList(drawList, _spriteModule);
+ _vm->_screen->copyToScreen();
+}
+
+void MinigameBbAnt::drawSprites2() {
+ DrawList drawList;
+ buildDrawList2(drawList);
+ _vm->_screen->drawDrawList(drawList, _spriteModule);
+ drawMagnifyingGlass(drawList);
+ _vm->_screen->drawDrawList(drawList, _spriteModule);
+ _vm->_screen->copyToScreen();
+}
+
+void MinigameBbAnt::drawSprites3() {
+ DrawList drawList;
+ buildDrawList3(drawList);
+ _vm->_screen->drawDrawList(drawList, _spriteModule);
+ _vm->_screen->copyToScreen();
+}
+
+MinigameBbAnt::Obj *MinigameBbAnt::getFreeObject() {
+ for (int i = 12; i < kMaxObjectsCount; ++i)
+ if (_objects[i].kind == 0)
+ return &_objects[i];
+ return 0;
+}
+
+void MinigameBbAnt::initObjects() {
+ switch (_gameState) {
+ case 0:
+ initObjects0();
+ break;
+ case 1:
+ initObjects1();
+ break;
+ case 2:
+ case 3:
+ // Nothing
+ break;
+ }
+}
+
+void MinigameBbAnt::initObjects0() {
+ _objects[0].anim = getAnimation(172);
+ _objects[0].frameIndex = 0;
+ _objects[0].ticks = getAnimation(172)->frameTicks[0];
+ _objects[0].x = 160;
+ _objects[0].y = 120;
+ _objects[0].priority = 2000;
+ _objects[0].kind = 1;
+ _objects[1].anim = getAnimation(170);
+ _objects[1].frameIndex = 0;
+ _objects[1].ticks = getAnimation(170)->frameTicks[0];
+ _objects[1].x = 40;
+ _objects[1].y = 240;
+ _objects[1].priority = 100;
+ _objects[1].kind = 2;
+ _objects[2].anim = getAnimation(171);
+ _objects[2].frameIndex = 0;
+ _objects[2].ticks = getAnimation(171)->frameTicks[0];
+ _objects[2].x = 280;
+ _objects[2].y = 240;
+ _objects[2].priority = 100;
+ _objects[2].kind = 2;
+}
+
+void MinigameBbAnt::initObjects1() {
+ _objects[0].kind = 0;
+ _objects[0].x = 160;
+ _objects[0].y = 120;
+ _objects[0].xIncr = 0;
+ _objects[0].yIncr = 0;
+ _objects[0].anim = getAnimation(159);
+ _objects[0].frameIndex = 0;
+ _objects[0].ticks = _objects[0].anim->frameTicks[0];
+ _objects[0].priority = 1000;
+ _objects[1].kind = 8;
+ _objects[1].x = 0x1E0000;
+ _objects[1].y = 0x280000;
+ _objects[1].xIncr = 0;
+ _objects[1].yIncr = 0;
+ _objects[1].anim = getAnimation(160);
+ _objects[1].frameIndex = 0;
+ _objects[1].ticks = _objects[0].anim->frameTicks[0];
+ _objects[1].priority = 900;
+ _objects[1].smokeCtr = 0;
+ _objects[1].hasSmoke = false;
+ _objects[1].status = 0;
+ _objects[2].kind = 8;
+ _objects[2].x = 0x280000;
+ _objects[2].y = 0x4B0000;
+ _objects[2].xIncr = 0;
+ _objects[2].yIncr = 0;
+ _objects[2].anim = getAnimation(161);
+ _objects[2].frameIndex = 0;
+ _objects[2].ticks = _objects[0].anim->frameTicks[0];
+ _objects[2].priority = 900;
+ _objects[2].smokeCtr = 0;
+ _objects[2].hasSmoke = false;
+ _objects[2].status = 0;
+ for (int i = 3; i < 12; ++i) {
+ const ObjInit *objInit = getObjInit(i - 3);
+ _objects[i].kind = 6;
+ _objects[i].x = objInit->x << 16;
+ _objects[i].y = objInit->y << 16;
+ _objects[i].xIncr = 0;
+ _objects[i].yIncr = 0;
+ _objects[i].anim = objInit->anim1;
+ _objects[i].frameIndex = 0;
+ _objects[i].ticks = _objects[0].anim->frameTicks[0];
+ _objects[i].priority = 600;
+ _objects[i].status = 9;
+ _objects[i].damageCtr = 0;
+
+ }
+}
+
+void MinigameBbAnt::initVars() {
+ switch (_gameState) {
+ case 0:
+ // Nothing
+ break;
+ case 1:
+ initVars1();
+ break;
+ case 2:
+ initVars2();
+ break;
+ case 3:
+ initVars3();
+ break;
+ }
+}
+
+void MinigameBbAnt::initVars1() {
+ _stompX = 0;
+ _stompY = 0;
+ _stompDelay1 = 0;
+ _stompCount = 1;
+ _stompCounter1 = 80;
+ _stompCounter2 = 80;
+ _totalBugsCount = 0;
+ _hasLastStompObj = false;
+ _counter1 = 9;
+ _countdown10 = 140;
+ _score = 0;
+ _counter4 = 1;
+ _gameTicks = 0;
+ _skullBugCtr = 500;
+ _levelTimeDelay = 58;
+ _levelTimeLeft = 30;
+ _bugsChanceByKind[0] = 0;
+ _bugsChanceByKind[1] = 20;
+ _bugsChanceByKind[2] = 20;
+ _bugsChanceByKind[3] = 5;
+ _bugsChanceByKind[4] = 7;
+ _bugsCountByKind[0] = 0;
+ _bugsCountByKind[1] = 0;
+ _bugsCountByKind[2] = 0;
+ _bugsCountByKind[3] = 0;
+ _bugsCountByKind[4] = 0;
+ _bugsCountByKind[5] = 0;
+}
+
+void MinigameBbAnt::initVars2() {
+ _countdown4 = 0;
+ _countdown3 = 0;
+ _levelTimeDelay = 58;
+ _countdown6 = 60;
+ _countdown5 = 50 * _counter1;
+}
+
+void MinigameBbAnt::initVars3() {
+ if (_score > _hiScore)
+ _hiScore = _score;
+ playSound(9);
+}
+
+bool MinigameBbAnt::updateStatus(int mouseX, int mouseY, uint mouseButtons) {
+ switch (_gameState) {
+ case 0:
+ return updateStatus0(mouseX, mouseY, mouseButtons);
+ case 1:
+ return updateStatus1(mouseX, mouseY, mouseButtons);
+ case 2:
+ return updateStatus2(mouseX, mouseY, mouseButtons);
+ case 3:
+ return updateStatus3(mouseX, mouseY, mouseButtons);
+ }
+ return false;
+}
+
+bool MinigameBbAnt::updateStatus0(int mouseX, int mouseY, uint mouseButtons) {
+
+ _objects[0].x = mouseX;
+ _objects[0].y = mouseY;
+
+ if (_objects[0].x >= 320)
+ _objects[0].x = 320 - 1;
+ if (_objects[0].y >= 240)
+ _objects[0].y = 240 - 1;
+ if (_objects[0].x < 0)
+ _objects[0].x = 0;
+ if (_objects[0].y < 0)
+ _objects[0].y = 0;
+
+ if ((mouseButtons & kLeftButtonDown) || (mouseButtons & kRightButtonDown)) {
+ _gameState = 1;
+ initObjects();
+ initVars();
+ _gameTicks = 0;
+ playSound(1);
+ } else {
+ for (int i = 0; i < kMaxObjectsCount; ++i) {
+ Obj *obj = &_objects[i];
+ if (obj->kind == 2) {
+ if (--obj->ticks == 0) {
+ ++obj->frameIndex;
+ if (obj->frameIndex >= obj->anim->frameCount)
+ obj->frameIndex = 0;
+ obj->ticks = obj->anim->frameTicks[0];
+ }
+ }
+ }
+ }
+
+ return true;
+}
+
+bool MinigameBbAnt::updateStatus1(int mouseX, int mouseY, uint mouseButtons) {
+ const int kMaxBugsCount = 52;
+
+ --_levelTimeDelay;
+ if (!_levelTimeDelay) {
+ _levelTimeDelay = 58;
+ --_levelTimeLeft;
+ }
+
+ _objects[0].x = mouseX;
+ _objects[0].y = mouseY;
+
+ if (_objects[0].x >= 320)
+ _objects[0].x = 320 - 1;
+ if (_objects[0].y >= 240)
+ _objects[0].y = 240 - 1;
+ if (_objects[0].x < 0)
+ _objects[0].x = 0;
+ if (_objects[0].y < 0)
+ _objects[0].y = 0;
+
+ if (!_levelTimeLeft) {
+ _gameState = 2;
+ initVars();
+ initObjects();
+ _gameTicks = 0;
+ return true;
+ }
+
+ if (_counter1 == 0) {
+ _gameState = 3;
+ initVars();
+ initObjects();
+ _gameTicks = 0;
+ return true;
+ }
+
+ if ((mouseButtons & kRightButtonClicked) && (_stompCount > 0|| _hasLastStompObj) && !_objects[2].status) {
+ if (_hasLastStompObj)
+ removeStompObj(_lastStompObj);
+ --_stompCount;
+ _objects[2].status = 1;
+ }
+
+ if ((mouseButtons & kLeftButtonClicked) && _objects[2].status == 0 && isMagGlassAtBeavisLeg(2)) {
+ if (_vm->getRandom(10) == 1 && !isAnySoundPlaying(kSoundTbl4, 10))
+ playSound(16);
+ insertSmokeObj(_objects[0].x << 16, _objects[0].y << 16);
+ }
+
+ if (_skullBugCtr > 0) {
+ if (--_skullBugCtr == 0) {
+ _skullBugCtr = _vm->getRandom(150) + 500;
+ insertRandomBugObj(5);
+ }
+ }
+
+ if (_stompCounter2 > 0)
+ --_stompCounter2;
+
+ if (_totalBugsCount < kMaxBugsCount && _vm->getRandom(_stompCounter2) == 0) {
+ int testTbl[4];
+ int maxKindCount = 0, objKind = 0;
+
+ _stompCounter2 = _stompCounter1;
+
+ for (int i = 0; i < 4; ++i)
+ testTbl[i] = _vm->getRandom(_bugsChanceByKind[i] - _bugsCountByKind[i]);
+
+ for (int i = 0; i < 4; ++i) {
+ if (testTbl[i] >= maxKindCount) {
+ maxKindCount = testTbl[i];
+ objKind = i + 1;
+ }
+ }
+
+ if (objKind)
+ insertRandomBugObj(objKind);
+
+ }
+
+ updateObjs(mouseButtons);
+ updateFootObj(2);
+
+ if (--_countdown10 == 0) {
+ _countdown10 = 140;
+ if (_stompCounter1 > 20)
+ --_stompCounter1;
+ }
+
+ return true;
+}
+
+bool MinigameBbAnt::updateStatus2(int mouseX, int mouseY, uint mouseButtons) {
+
+ _objects[0].x = mouseX;
+ _objects[0].y = mouseY;
+
+ if (_objects[0].x >= 320)
+ _objects[0].x = 320 - 1;
+ if (_objects[0].y >= 240)
+ _objects[0].y = 240 - 1;
+ if (_objects[0].x < 0)
+ _objects[0].x = 0;
+ if (_objects[0].y < 0)
+ _objects[0].y = 0;
+
+ if (_countdown6 > 0) {
+ if (--_countdown6 == 0) {
+ _countdown4 = 150;
+ playSound(15, true);
+ }
+ } else if (_countdown4 > 0) {
+ if (--_countdown4 == 0) {
+ _countdown3 = 150;
+ } else if (_countdown5 > 0) {
+ ++_countdown4;
+ ++_score;
+ if (--_countdown5 == 0) {
+ stopSound(15);
+ _bugsChanceByKind[5] = 10;
+ _countdown7 = 40;
+ _countdown4 = 10 * (13 - _counter1);
+ return true;
+ }
+ } else {
+ if (--_countdown7 == 0) {
+ bool flag1 = false;
+ _countdown7 = _bugsChanceByKind[5];
+ for (int i = 3; i < 12 && !flag1; ++i) {
+ Obj *obj = &_objects[i];
+ if (obj->status == 13) {
+ const ObjInit *objInit = getObjInit(i - 3);
+ obj->x = objInit->x << 16;
+ obj->y = objInit->y << 16;
+ obj->anim = objInit->anim3;
+ obj->frameIndex = 0;
+ obj->ticks = _objects[0].anim->frameTicks[0];
+ obj->status = 9;
+ obj->damageCtr = 0;
+ obj->priority = 600;
+ ++_counter1;
+ playSound(15);
+ flag1 = true;
+ }
+ }
+ }
+ }
+ } else if (_countdown3 > 0) {
+ if ((mouseButtons & kLeftButtonDown) || (mouseButtons & kRightButtonDown) || (--_countdown3 == 0)) {
+ _levelTimeDelay = 58;
+ _levelTimeLeft = 30;
+ _gameState = 1;
+ _gameTicks = 0;
+ ++_counter4;
+ }
+ }
+
+ return true;
+}
+
+bool MinigameBbAnt::updateStatus3(int mouseX, int mouseY, uint mouseButtons) {
+ if (!isSoundPlaying(9) && _fromMainGame) {
+ _vm->_system->delayMillis(1000);
+ _gameDone = true;
+ }
+ return true;
+}
+
+void MinigameBbAnt::getRandomBugObjValues(int &x, int &y, int &animIndexIncr, int &field30) {
+ field30 = _vm->getRandom(4);
+ switch (field30) {
+ case 0:
+ y = -5;
+ x = _vm->getRandom(190) + 120;
+ animIndexIncr = 4;
+ break;
+ case 1:
+ x = 325;
+ y = _vm->getRandom(220) + 10;
+ animIndexIncr = 2;
+ break;
+ case 2:
+ y = 245;
+ x = _vm->getRandom(300) + 10;
+ animIndexIncr = 0;
+ break;
+ case 3:
+ x = -5;
+ y = _vm->getRandom(190) + 120;
+ animIndexIncr = 6;
+ break;
+ }
+}
+
+void MinigameBbAnt::insertBugSmokeObj(int x, int y, int bugObjIndex) {
+ Obj *obj = getFreeObject();
+ if (obj) {
+ Obj *bugObj = &_objects[bugObjIndex];
+ bugObj->hasSmoke = true;
+ obj->kind = 7;
+ obj->x = x;
+ obj->y = y;
+ obj->priority = 950;
+ if (bugObj->status >= 4 && (bugObj->status <= 6 || bugObj->status == 8)) {
+ obj->xIncr = 0;
+ obj->yIncr = (-1 << 16);
+ } else {
+ obj->xIncr = bugObj->xIncr / 8;
+ obj->yIncr = bugObj->yIncr / 8;
+ }
+ obj->anim = getAnimation(158);
+ obj->frameIndex = 0;
+ obj->ticks = obj->anim->frameTicks[0];
+ }
+}
+
+void MinigameBbAnt::insertSmokeObj(int x, int y) {
+ Obj *obj = getFreeObject();
+ if (obj) {
+ obj->kind = 7;
+ obj->x = x;
+ obj->y = y;
+ obj->priority = 950;
+ obj->xIncr = 0x2000;
+ obj->yIncr = -0xC000;
+ obj->anim = getAnimation(158);
+ obj->frameIndex = 0;
+ obj->ticks = obj->anim->frameTicks[0];
+ }
+}
+
+void MinigameBbAnt::resetObj(int objIndex) {
+ _objects[objIndex].kind = 0;
+}
+
+void MinigameBbAnt::insertStompObj(int x, int y) {
+ Obj *obj = getFreeObject();
+ if (obj) {
+ obj->kind = 9;
+ obj->x = x;
+ obj->y = y;
+ obj->priority = 2000;
+ obj->xIncr = (0x1E0000 * _stompCount - x + 0x140000) / 15;
+ obj->yIncr = (0xE60000 - y) / 15;
+ obj->anim = getAnimation(130);
+ obj->frameIndex = 0;
+ obj->ticks = 15;
+ _lastStompObj = obj;
+ _hasLastStompObj = true;
+ }
+}
+
+void MinigameBbAnt::removeStompObj(Obj *obj) {
+ ++_stompCount;
+ _hasLastStompObj = false;
+ obj->kind = 0;
+}
+
+void MinigameBbAnt::insertBugObj(int kind, int animIndexIncr, int always0, int x, int y, int field30, int always1) {
+ Obj *obj = getFreeObject();
+ if (obj) {
+ const ObjAnimation * const *objKindAnimTable = getObjKindAnimTable(kind);
+ obj->field30 = field30;
+ obj->animIndexIncr = animIndexIncr;
+ obj->kind = kind;
+ obj->x = x << 16;
+ obj->y = y << 16;
+ obj->priority = 610;
+ obj->xIncr = kPosIncrTbl1[0].x << 16;
+ obj->yIncr = kPosIncrTbl1[0].y << 16;
+ obj->anim = objKindAnimTable[0];
+ obj->frameIndex = 0;
+ obj->ticks = obj->anim->frameTicks[0];
+ obj->animIndex = 0;
+ obj->status = 1;
+ obj->damageCtr = 0;
+ obj->hasSmoke = false;
+ obj->flag = 0;
+ ++_bugsCountByKind[kind];
+ ++_totalBugsCount;
+ }
+}
+
+void MinigameBbAnt::removeBugObj(int objIndex) {
+ Obj *obj = &_objects[objIndex];
+ --_totalBugsCount;
+ --_bugsCountByKind[obj->kind];
+ obj->hasSmoke = false;
+ obj->kind = 0;
+}
+
+void MinigameBbAnt::updateBugObjAnim(int objIndex) {
+ Obj *obj = &_objects[objIndex];
+
+ switch (obj->field30) {
+ case 0:
+ obj->animIndexIncr = 4;
+ break;
+ case 1:
+ obj->animIndexIncr = 2;
+ break;
+ case 2:
+ obj->animIndexIncr = 0;
+ break;
+ case 3:
+ obj->animIndexIncr = 6;
+ break;
+ }
+ const ObjAnimation * const *objKindAnimTable = getObjKindAnimTable(obj->kind);
+ obj->xIncr = kPosIncrTbl1[obj->animIndexIncr].x << 16;
+ obj->yIncr = kPosIncrTbl1[obj->animIndexIncr].y << 16;
+ obj->anim = objKindAnimTable[obj->animIndexIncr];
+ obj->frameIndex = 0;
+ obj->ticks = obj->anim->frameTicks[0];
+}
+
+void MinigameBbAnt::updateObjAnim2(int objIndex) {
+ Obj *obj = &_objects[objIndex];
+
+ obj->animIndexIncr += _vm->getRandom(3) - 1;
+ if (obj->animIndexIncr < 0)
+ obj->animIndexIncr = 7;
+ if (obj->animIndexIncr > 7)
+ obj->animIndexIncr = 0;
+ obj->animIndexIncr += 4;
+ if (obj->animIndexIncr >= 8)
+ obj->animIndexIncr %= 8;
+ const ObjAnimation * const *objKindAnimTable = getObjKindAnimTable(obj->kind);
+ obj->xIncr = kPosIncrTbl1[obj->animIndex + obj->animIndexIncr].x << 16;
+ obj->yIncr = kPosIncrTbl1[obj->animIndex + obj->animIndexIncr].y << 16;
+ obj->anim = objKindAnimTable[obj->animIndex + obj->animIndexIncr];
+ obj->frameIndex = 0;
+ obj->ticks = obj->anim->frameTicks[0];
+ obj->x += obj->xIncr;
+ obj->y += obj->yIncr;
+}
+
+void MinigameBbAnt::insertRandomBugObj(int kind) {
+ int x, y, animIndexIncr, field30;
+ getRandomBugObjValues(x, y, animIndexIncr, field30);
+ insertBugObj(kind, animIndexIncr, 0, x, y, field30, 1);
+}
+
+bool MinigameBbAnt::isBugOutOfScreen(int objIndex) {
+ Obj *obj = &_objects[objIndex];
+
+ return
+ obj->x < (-10 << 16) || obj->x > (330 << 16) ||
+ obj->y < (-10 << 16) || obj->y > (250 << 16);
+}
+
+void MinigameBbAnt::updateObjAnim3(int objIndex) {
+ Obj *obj = &_objects[objIndex];
+
+ obj->animIndexIncr += _vm->getRandom(3) - 1;
+ if (obj->animIndexIncr < 0)
+ obj->animIndexIncr = 7;
+ if (obj->animIndexIncr > 7)
+ obj->animIndexIncr = 0;
+ const ObjAnimation * const *objKindAnimTable = getObjKindAnimTable(obj->kind);
+ obj->xIncr = kPosIncrTbl1[obj->animIndexIncr].x << 16;
+ obj->yIncr = kPosIncrTbl1[obj->animIndexIncr].y << 16;
+ obj->anim = objKindAnimTable[obj->animIndexIncr];
+}
+
+void MinigameBbAnt::updateBugObj1(int objIndex) {
+ Obj *obj = &_objects[objIndex];
+ bool flag1 = false;
+ bool flag2 = false;
+
+ if (--obj->ticks == 0) {
+ ++obj->frameIndex;
+ if (obj->anim->frameCount == obj->frameIndex) {
+ obj->frameIndex = 0;
+ obj->ticks = obj->anim->frameTicks[0];
+ flag1 = true;
+ } else {
+ obj->ticks = obj->anim->frameTicks[obj->frameIndex];
+ flag2 = true;
+ }
+ }
+
+ obj->x += obj->xIncr;
+ obj->y += obj->yIncr;
+
+ if (obj->status != 7) {
+ if (obj->damageCtr <= 5) {
+ obj->hasSmoke = false;
+ } else if (!obj->hasSmoke) {
+ obj->smokeCtr = 6;
+ insertBugSmokeObj(obj->x, obj->y, objIndex);
+ } else if (obj->damageCtr > 200 && obj->status != 4 && obj->status != 6) {
+ _score += kScoreTbl[obj->kind];
+ if (obj->status == 3) {
+ _objects[obj->otherObjIndex].status = 9;
+ _objects[obj->otherObjIndex].priority = 600;
+ if (_vm->getRandom(3) == 1 && !isAnySoundPlaying(kSoundTbl4, 10))
+ playSound(kSoundTbl3[_vm->getRandom(3)]);
+ } else {
+ if (_vm->getRandom(3) == 1 && !isAnySoundPlaying(kSoundTbl4, 10))
+ playSound(kSoundTbl2[_vm->getRandom(3)]);
+ }
+ flag1 = false;
+ const ObjAnimation * const *objKindAnimTable = getObjKindAnimTable(obj->kind);
+ obj->hasSmoke = false;
+ obj->status = 4;
+ obj->xIncr = 0;
+ obj->yIncr = 0;
+ obj->anim = objKindAnimTable[16];
+ obj->frameIndex = 0;
+ obj->ticks = obj->anim->frameTicks[0];
+ obj->priority = 605;
+ if (obj->kind == 5) {
+ // Skull Beetle
+ if (_stompCount < 10)
+ insertStompObj(obj->x, obj->y);
+ obj->kind = 4;
+ obj->anim = getObjAnim(70);
+ obj->ticks = obj->anim->frameTicks[0];
+ }
+ } else if (--obj->smokeCtr == 0) {
+ obj->smokeCtr = 6;
+ insertBugSmokeObj(obj->x, obj->y, objIndex);
+ }
+ }
+
+ switch (obj->status) {
+
+ case 1:
+ if (isBugOutOfScreen(objIndex))
+ removeBugObj(objIndex);
+ else if (flag1 && !obj->flag)
+ updateObjAnim3(objIndex);
+ break;
+
+ case 3:
+ // Bug carries candy
+ _objects[obj->otherObjIndex].x = obj->x;
+ _objects[obj->otherObjIndex].y = obj->y;
+ if (isBugOutOfScreen(objIndex)) {
+ _objects[obj->otherObjIndex].status = 13;
+ _objects[obj->otherObjIndex].x = (500 << 16);
+ _objects[obj->otherObjIndex].y = (500 << 16);
+ removeBugObj(objIndex);
+ --_counter1;
+ }
+ break;
+
+ case 4:
+ if (flag1) {
+ const ObjAnimation * const *objKindAnimTable = getObjKindAnimTable(obj->kind);
+ obj->status = 6;
+ obj->xIncr = 0;
+ obj->yIncr = 0;
+ obj->anim = objKindAnimTable[17];
+ obj->frameIndex = 0;
+ obj->ticks = obj->anim->frameTicks[0];
+ }
+ break;
+
+ case 6:
+ if (flag1) {
+ const ObjAnimation * const *objKindAnimTable = getObjKindAnimTable(obj->kind);
+ obj->status = 7;
+ obj->xIncr = kPosIncrTbl2[obj->animIndexIncr].x << 16;
+ obj->yIncr = kPosIncrTbl2[obj->animIndexIncr].y << 16;
+ obj->anim = objKindAnimTable[obj->animIndexIncr + 8];
+ obj->frameIndex = 0;
+ obj->ticks = obj->anim->frameTicks[0];
+ obj->animIndex = 8;
+ obj->priority = 610;
+ }
+ break;
+
+ case 7:
+ if (isBugOutOfScreen(objIndex))
+ removeBugObj(objIndex);
+ break;
+
+ case 8:
+ if (--obj->counter != 0) {
+ if (flag2 && obj->frameIndex == 13) {
+ obj->frameIndex = 4;
+ obj->ticks = obj->anim->frameTicks[4];
+ }
+ } else {
+ obj->status = obj->status2;
+ obj->anim = obj->anim2;
+ obj->frameIndex = obj->frameIndex2;
+ obj->ticks = obj->ticks2;
+ obj->xIncr = kPosIncrTbl1[obj->animIndex + obj->animIndexIncr].x << 16;
+ obj->yIncr = kPosIncrTbl1[obj->animIndex + obj->animIndexIncr].y << 16;
+ obj->priority = 610;
+ }
+ break;
+
+ }
+
+}
+
+void MinigameBbAnt::updateObjKind2(int objIndex) {
+ updateBugObj1(objIndex);
+}
+
+void MinigameBbAnt::updateObjKind3(int objIndex) {
+ updateBugObj1(objIndex);
+}
+
+void MinigameBbAnt::updateObjKind4(int objIndex) {
+ updateBugObj1(objIndex);
+}
+
+void MinigameBbAnt::updateObjKind5(int objIndex) {
+ ++_skullBugCtr;
+ updateBugObj1(objIndex);
+}
+
+void MinigameBbAnt::updateStompObj(int objIndex) {
+ Obj *obj = &_objects[objIndex];
+
+ obj->x += obj->xIncr;
+ obj->y += obj->yIncr;
+ if (--obj->ticks == 0)
+ removeStompObj(obj);
+}
+
+void MinigameBbAnt::updateSmokeObj(int objIndex) {
+ Obj *obj = &_objects[objIndex];
+
+ obj->x += obj->xIncr;
+ obj->y += obj->yIncr;
+
+ if (--obj->ticks == 0) {
+ ++obj->frameIndex;
+ if (obj->anim->frameCount == obj->frameIndex)
+ resetObj(objIndex);
+ else
+ obj->ticks = obj->anim->frameTicks[obj->frameIndex];
+ }
+}
+
+void MinigameBbAnt::updateFootObj(int objIndex) {
+ Obj *obj = &_objects[objIndex];
+
+ switch (obj->status) {
+
+ case 1:
+ obj->xIncr = -0x8000;
+ obj->yIncr = (-4 << 16);
+ obj->status = 2;
+ _stompCounter1 += 5;
+ _stompCounter2 = 100;
+ break;
+
+ case 2:
+ obj->x += obj->xIncr;
+ obj->y += obj->yIncr;
+ obj->yIncr += 0x2000;
+ if (obj->y < (20 << 16)) {
+ obj->xIncr = 0x8000;
+ obj->yIncr = (7 << 16);
+ obj->status = 3;
+ }
+ break;
+
+ case 3:
+ obj->x += obj->xIncr;
+ obj->y += obj->yIncr;
+ obj->yIncr += 0x2000;
+ if (obj->y >= 0x4B0000) {
+ obj->x = (40 << 16);
+ obj->y = (75 << 16);
+ obj->status = 4;
+ _stompDelay1 = 6;
+ _stompY = 0;
+ playSound(14);
+ }
+ break;
+
+ case 4:
+ if (--_stompDelay1 == 0) {
+ _gameTicks = 0;
+ if (_stompDelay1 % 2)
+ _stompY = _stompY < 1 ? -8 : 0;
+ } else {
+ obj->status = 0;
+ _stompX = 0;
+ _stompY = 0;
+ // Stun all bugs
+ for (int i = 12; i < kMaxObjectsCount; ++i) {
+ Obj *bugObj = &_objects[i];
+ if (bugObj->kind >= 1 && bugObj->kind <= 5) {
+ bugObj->counter = _vm->getRandom(200) + 360;
+ const ObjAnimation * const *objKindAnimTable = getObjKindAnimTable(bugObj->kind);
+ if (bugObj->status == 8) {
+ bugObj->hasSmoke = false;
+ bugObj->xIncr = 0;
+ bugObj->yIncr = 0;
+ bugObj->status2 = 7;
+ bugObj->anim2 = objKindAnimTable[bugObj->animIndexIncr + 8];
+ bugObj->frameIndex2 = 0;
+ bugObj->ticks2 = obj->anim->frameTicks[0];
+ bugObj->anim = objKindAnimTable[17];
+ bugObj->frameIndex = 0;
+ bugObj->ticks = _vm->getRandom(4) + obj->anim->frameTicks[0];
+ bugObj->animIndex = 8;
+ } else {
+ if (bugObj->status == 3) {
+ bugObj->priority = 610;
+ _objects[bugObj->otherObjIndex].status = 9;
+ _objects[bugObj->otherObjIndex].priority = 600;
+ }
+ bugObj->hasSmoke = false;
+ bugObj->xIncr = 0;
+ bugObj->yIncr = 0;
+ bugObj->status2 = 1;
+ bugObj->anim2 = bugObj->anim;
+ bugObj->frameIndex2 = bugObj->frameIndex;
+ bugObj->ticks2 = bugObj->ticks;
+ bugObj->anim = objKindAnimTable[17];
+ bugObj->frameIndex = 0;
+ bugObj->ticks = _vm->getRandom(4) + obj->anim->frameTicks[0];
+ }
+ bugObj->status = 8;
+ bugObj->priority = 605;
+ }
+ }
+ }
+ break;
+
+ }
+
+}
+
+bool MinigameBbAnt::isBugAtCandy(int objIndex, int &candyObjIndex) {
+ Obj *obj = &_objects[objIndex];
+ bool result = false;
+
+ if (obj->kind >= 1 && obj->kind <= 4) {
+ const BBRect &frameRect1 = obj->anim->frameRects[obj->frameIndex];
+ const int obj1X1 = frameRect1.x + (obj->x >> 16);
+ const int obj1Y1 = frameRect1.y + (obj->y >> 16);
+ const int obj1X2 = obj1X1 + frameRect1.width;
+ const int obj1Y2 = obj1Y1 + frameRect1.height;
+ for (int i = 3; i < 12 && !result; ++i) {
+ Obj *obj2 = &_objects[i];
+ const BBRect &frameRect2 = obj->anim->frameRects[obj2->frameIndex]; // sic
+ const int obj2X1 = (obj2->x >> 16) + frameRect2.x;
+ const int obj2Y1 = (obj2->y >> 16) + frameRect2.y;
+ const int obj2X2 = obj2X1 + frameRect2.width;
+ const int obj2Y2 = obj2Y1 + frameRect2.height;
+ if (obj2->status == 9 && obj1X1 <= obj2X2 && obj1X2 >= obj2X1 && obj1Y1 <= obj2Y2 && obj1Y2 >= obj2Y1) {
+ result = true;
+ candyObjIndex = i;
+ }
+ }
+ }
+ return result;
+}
+
+bool MinigameBbAnt::isMagGlassAtBug(int objIndex) {
+ Obj *obj = &_objects[objIndex];
+ Obj *obj0 = &_objects[0];
+ bool result = false;
+
+ if (obj->kind >= 1 && obj->kind <= 5) {
+ const BBRect &frameRect1 = obj0->anim->frameRects[0];
+ const int obj1X1 = obj0->x + frameRect1.x;
+ const int obj1Y1 = obj0->y + frameRect1.y;
+ const int obj1X2 = obj1X1 + frameRect1.width;
+ const int obj1Y2 = obj1Y1 + frameRect1.height;
+ const BBRect &frameRect2 = obj->anim->frameRects[obj->frameIndex];
+ const int obj2X1 = (obj->x >> 16) + frameRect2.x;
+ const int obj2Y1 = (obj->y >> 16) + frameRect2.y;
+ const int obj2X2 = obj2X1 + frameRect2.width;
+ const int obj2Y2 = obj2Y1 + frameRect2.height;
+ if (obj2X2 >= obj1X1 && obj1X2 >= obj2X1 && obj1Y1 <= obj2Y2 && obj1Y2 >= obj2Y1)
+ result = true;
+ }
+ return result;
+}
+
+bool MinigameBbAnt::isMagGlassAtBeavisLeg(int objIndex) {
+ Obj *obj = &_objects[objIndex];
+ Obj *magGlassObj = &_objects[0];
+ bool result = false;
+
+ const BBRect &frameRect1 = magGlassObj->anim->frameRects[0];
+ const int obj1X1 = magGlassObj->x + frameRect1.x;
+ const int obj1Y1 = magGlassObj->y + frameRect1.y;
+ const int obj1X2 = obj1X1 + frameRect1.width;
+ const int obj1Y2 = obj1Y1 + frameRect1.height;
+ const BBRect &frameRect2 = obj->anim->frameRects[obj->frameIndex];
+ const int obj2X1 = (obj->x >> 16) + frameRect2.x;
+ const int obj2Y1 = (obj->y >> 16) + frameRect2.y;
+ const int obj2X2 = obj2X1 + frameRect2.width;
+ const int obj2Y2 = obj2Y1 + frameRect2.height;
+ if (obj2X2 >= obj1X1 && obj1X2 >= obj2X1 && obj1Y1 <= obj2Y2 && obj1Y2 >= obj2Y1)
+ result = true;
+ return result;
+}
+
+bool MinigameBbAnt::testObj5(int objIndex) {
+ Obj *obj = &_objects[objIndex];
+ bool result = false;
+ if (obj->kind >= 1 && obj->kind <= 5) {
+ const int x = obj->x >> 16;
+ const int y = obj->y >> 16;
+ if (x < 0 || x >= 110 || y < 0 || y >= 110) {
+ obj->flag = 0;
+ } else if (!obj->flag) {
+ obj->flag = 1;
+ result = true;
+ }
+ }
+ return result;
+}
+
+void MinigameBbAnt::updateObjs(uint mouseButtons) {
+
+ for (int i = 12; i < kMaxObjectsCount; ++i) {
+ Obj *obj = &_objects[i];
+
+ if (obj->kind) {
+
+ if ((mouseButtons & kLeftButtonClicked) && isMagGlassAtBug(i))
+ obj->damageCtr += 100;
+
+ if (obj->status == 1) {
+ int candyObjIndex;
+ if (isBugAtCandy(i, candyObjIndex)) {
+ obj->status = 3;
+ obj->otherObjIndex = candyObjIndex;
+ _objects[candyObjIndex].otherObjIndex = i;
+ _objects[candyObjIndex].status = 10;
+ _objects[candyObjIndex].priority = 620;
+ _objects[candyObjIndex].status = 11;
+ _objects[candyObjIndex].anim = getObjInit(candyObjIndex - 3)->anim3;
+ updateBugObjAnim(i);
+ if (_vm->getRandom(3) == 1 && !isAnySoundPlaying(kSoundTbl4, 10))
+ playSound(kSoundTbl1[_vm->getRandom(4)]);
+ }
+ }
+
+ if (testObj5(i)) {
+ updateObjAnim2(i);
+ }
+
+ if (obj->damageCtr) {
+ --obj->damageCtr;
+ if (!isSoundPlaying(13))
+ playSound(13);
+ }
+
+ switch (obj->kind) {
+ case 1:
+ updateBugObj1(i);
+ break;
+ case 2:
+ updateObjKind2(i);
+ break;
+ case 3:
+ updateObjKind3(i);
+ break;
+ case 4:
+ updateObjKind4(i);
+ break;
+ case 5:
+ updateObjKind5(i);
+ break;
+ case 7:
+ updateSmokeObj(i);
+ break;
+ case 9:
+ updateStompObj(i);
+ break;
+ }
+
+ }
+
+ }
+
+}
+
+bool MinigameBbAnt::run(bool fromMainGame) {
+
+ memset(_objects, 0, sizeof(_objects));
+
+ _numbersAnim = getAnimation(167);
+
+ _backgroundSpriteIndex = 303;
+ _titleScreenSpriteIndex = 304;
+
+ _fromMainGame = fromMainGame;
+
+ _hiScore = 0;
+ if (!_fromMainGame)
+ _hiScore = loadHiscore(kMinigameBbAnt);
+
+ _gameState = 0;
+ _gameResult = false;
+ _gameDone = false;
+ initObjects();
+ initVars();
+
+ _spriteModule = new SpriteModule();
+ _spriteModule->load("bbant/bbant.000");
+
+ Palette palette = _spriteModule->getPalette();
+ _vm->_screen->setPalette(palette);
+
+ loadSounds();
+
+ _gameTicks = 0;
+ playSound(12, true);
+
+ while (!_vm->shouldQuit() &&!_gameDone) {
+ _vm->updateEvents();
+ update();
+ }
+
+ _vm->_sound->unloadSounds();
+
+ if (!_fromMainGame)
+ saveHiscore(kMinigameBbAnt, _hiScore);
+
+ delete _spriteModule;
+
+ return _gameResult;
+}
+
+void MinigameBbAnt::update() {
+
+ int inputTicks;
+
+ if (_gameTicks > 0) {
+ int currTicks = _vm->_system->getMillis();
+ inputTicks = 3 * (currTicks - _gameTicks) / 50;
+ _gameTicks = currTicks - (currTicks - _gameTicks - 50 * inputTicks / 3);
+ } else {
+ inputTicks = 1;
+ _gameTicks = _vm->_system->getMillis();
+ }
+
+ if (_vm->_keyCode == Common::KEYCODE_ESCAPE) {
+ _gameDone = true;
+ return;
+ }
+
+ if (inputTicks == 0)
+ return;
+
+ bool done;
+
+ do {
+ done = !updateStatus(_vm->_mouseX, _vm->_mouseY, _vm->_mouseButtons);
+ _vm->_mouseButtons &= ~kLeftButtonClicked;
+ _vm->_mouseButtons &= ~kRightButtonClicked;
+ _vm->_keyCode = Common::KEYCODE_INVALID;
+ } while (--inputTicks && _gameTicks > 0 && !done);
+
+ drawSprites();
+
+ _vm->_system->delayMillis(10);
+
+}
+
+void MinigameBbAnt::scale2x(int x, int y) {
+ Graphics::Surface *surface = _vm->_screen->_surface;
+
+ int srcX = x + 14, srcY = y + 14;
+ int srcW = kScaleDim, srcH = kScaleDim;
+
+ if (srcX < 0) {
+ srcW += srcX;
+ srcX = 0;
+ }
+
+ if (srcY < 0) {
+ srcH += srcY;
+ srcY = 0;
+ }
+
+ if (srcX + srcW >= 320)
+ srcW = 320 - srcX - 1;
+
+ if (srcY + srcH >= 240)
+ srcH = 240 - srcY - 1;
+
+ for (int yc = 0; yc < srcH; ++yc) {
+ byte *src = (byte*)surface->getBasePtr(srcX, srcY + yc);
+ memcpy(&_scaleBuf[yc * kScaleDim], src, srcW);
+ }
+
+ int dstX = x, dstY = y;
+ int dstW = 2 * kScaleDim, dstH = 2 * kScaleDim;
+
+ if (dstX < 0) {
+ dstW += dstX;
+ dstX = 0;
+ }
+
+ if (dstY < 0) {
+ dstH += dstY;
+ dstY = 0;
+ }
+
+ if (dstX + dstW >= 320)
+ dstW = 320 - dstX - 1;
+
+ if (dstY + dstH >= 240)
+ dstH = 240 - dstY - 1;
+
+ int w = MIN(srcW * 2, dstW), h = MIN(srcH * 2, dstH);
+
+ for (int yc = 0; yc < h; ++yc) {
+ byte *src = _scaleBuf + kScaleDim * (yc / 2);
+ byte *dst = (byte*)surface->getBasePtr(dstX, dstY + yc);
+ for (int xc = 0; xc < w; ++xc)
+ dst[xc] = src[xc / 2];
+ }
+
+}
+
+void MinigameBbAnt::loadSounds() {
+ for (uint i = 0; i < kSoundFilenamesCount; ++i) {
+ Common::String filename = Common::String::format("bbant/%s", kSoundFilenames[i]);
+ _vm->_sound->loadSound(filename.c_str());
+ }
+}
+
+} // End of namespace Bbvs
diff --git a/engines/bbvs/minigames/bbant.h b/engines/bbvs/minigames/bbant.h
new file mode 100644
index 0000000000..be2afe688d
--- /dev/null
+++ b/engines/bbvs/minigames/bbant.h
@@ -0,0 +1,173 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+
+ * You should have received a copy of the GNU General Public 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 BBVS_MINIGAMES_BBANT_H
+#define BBVS_MINIGAMES_BBANT_H
+
+#include "bbvs/minigames/minigame.h"
+
+namespace Bbvs {
+
+class MinigameBbAnt : public Minigame {
+public:
+ MinigameBbAnt(BbvsEngine *vm) : Minigame(vm) {};
+ bool run(bool fromMainGame);
+public:
+
+ struct Obj {
+ int kind;
+ int x, y, priority;
+ int xIncr, yIncr;
+ const ObjAnimation *anim;
+ int frameIndex;
+ int ticks;
+ int otherObjIndex;
+ int animIndex;
+ int animIndexIncr;
+ int status;
+ int field30;
+ int damageCtr;
+ int smokeCtr;
+ int counter;
+ int hasSmoke;
+ const ObjAnimation *anim2;
+ int frameIndex2;
+ int ticks2;
+ int status2;
+ int flag;
+ };
+
+ enum {
+ kMaxObjectsCount = 256,
+ kScaleDim = 28
+ };
+
+ struct ObjInit {
+ const ObjAnimation *anim1;
+ const ObjAnimation *anim2;
+ const ObjAnimation *anim3;
+ int x, y;
+ };
+
+ Obj _objects[kMaxObjectsCount];
+
+ int _score, _hiScore;
+
+ int _totalBugsCount;
+ int _bugsChanceByKind[6], _bugsCountByKind[6];
+ int _skullBugCtr;
+
+ int _stompX, _stompY;
+ int _stompDelay1;
+ int _stompCounter1;
+ int _stompCounter2;
+
+ int _stompCount;
+ int _hasLastStompObj;
+ Obj *_lastStompObj;
+
+ int _counter1;
+ int _countdown10;
+ int _counter4;
+ int _levelTimeDelay;
+ int _levelTimeLeft;
+
+ int _countdown4;
+ int _countdown3;
+ int _countdown6;
+ int _countdown5;
+ int _countdown7;
+
+ byte _scaleBuf[kScaleDim * kScaleDim];
+
+ const ObjAnimation *getAnimation(int animIndex);
+ const ObjInit *getObjInit(int index);
+ const ObjAnimation * const *getObjKindAnimTable(int kind);
+ const ObjAnimation *getObjAnim(int index);
+
+ void buildDrawList0(DrawList &drawList);
+ void buildDrawList1(DrawList &drawList);
+ void buildDrawList2(DrawList &drawList);
+ void buildDrawList3(DrawList &drawList);
+ void drawMagnifyingGlass(DrawList &drawList);
+
+ void drawSprites();
+ void drawSprites0();
+ void drawSprites1();
+ void drawSprites2();
+ void drawSprites3();
+
+ Obj *getFreeObject();
+
+ void initObjects();
+ void initObjects0();
+ void initObjects1();
+
+ void initVars();
+ void initVars1();
+ void initVars2();
+ void initVars3();
+
+ bool updateStatus(int mouseX, int mouseY, uint mouseButtons);
+ bool updateStatus0(int mouseX, int mouseY, uint mouseButtons);
+ bool updateStatus1(int mouseX, int mouseY, uint mouseButtons);
+ bool updateStatus2(int mouseX, int mouseY, uint mouseButtons);
+ bool updateStatus3(int mouseX, int mouseY, uint mouseButtons);
+
+ void getRandomBugObjValues(int &x, int &y, int &animIndexIncr, int &field30);
+ void insertBugSmokeObj(int x, int y, int bugObjIndex);
+ void insertSmokeObj(int x, int y);
+ void resetObj(int objIndex);
+ void insertStompObj(int x, int y);
+ void removeStompObj(Obj *obj);
+ void insertBugObj(int kind, int animIndexIncr, int always0, int x, int y, int field30, int always1);
+ void removeBugObj(int objIndex);
+ void updateBugObjAnim(int objIndex);
+ void updateObjAnim2(int objIndex);
+ void insertRandomBugObj(int kind);
+ bool isBugOutOfScreen(int objIndex);
+ void updateObjAnim3(int objIndex);
+ void updateBugObj1(int objIndex);
+ void updateObjKind2(int objIndex);
+ void updateObjKind3(int objIndex);
+ void updateObjKind4(int objIndex);
+ void updateObjKind5(int objIndex);
+ void updateStompObj(int objIndex);
+ void updateSmokeObj(int objIndex);
+ void updateFootObj(int objIndex);
+ bool isBugAtCandy(int objIndex, int &candyObjIndex);
+ bool isMagGlassAtBug(int objIndex);
+ bool isMagGlassAtBeavisLeg(int objIndex);
+ bool testObj5(int objIndex);
+ void updateObjs(uint mouseButtons);
+
+ void update();
+
+ void scale2x(int x, int y);
+
+ void loadSounds();
+
+};
+
+} // End of namespace Bbvs
+
+#endif // BBVS_MINIGAMES_BBANT_H
diff --git a/engines/bbvs/minigames/bbant_anims.cpp b/engines/bbvs/minigames/bbant_anims.cpp
new file mode 100644
index 0000000000..c9223adca1
--- /dev/null
+++ b/engines/bbvs/minigames/bbant_anims.cpp
@@ -0,0 +1,757 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+
+ * You should have received a copy of the GNU General Public 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 "bbvs/minigames/bbant.h"
+
+namespace Bbvs {
+
+static const int kAnim0FrameIndices[] = {0, 1, 2};
+static const int16 kAnim0FrameTicks[] = {10, 8, 8};
+static const BBRect kAnim0FrameRects[] = {{-3, -8, 6, 14}, {-3, -8, 6, 13}, {-3, -7, 6, 12}};
+static const int kAnim1FrameIndices[] = {3, 4, 5};
+static const int16 kAnim1FrameTicks[] = {10, 8, 8};
+static const BBRect kAnim1FrameRects[] = {{-5, -6, 13, 9}, {-5, -6, 13, 10}, {-5, -6, 13, 10}};
+static const int kAnim2FrameIndices[] = {6, 7, 8};
+static const int16 kAnim2FrameTicks[] = {10, 8, 8};
+static const BBRect kAnim2FrameRects[] = {{-6, -6, 17, 7}, {-6, -6, 15, 6}, {-7, -6, 17, 6}};
+static const int kAnim3FrameIndices[] = {9, 10, 11};
+static const int16 kAnim3FrameTicks[] = {10, 8, 8};
+static const BBRect kAnim3FrameRects[] = {{-5, -7, 13, 8}, {-5, -7, 12, 7}, {-5, -7, 12, 9}};
+static const int kAnim4FrameIndices[] = {12, 13, 14};
+static const int16 kAnim4FrameTicks[] = {10, 8, 8};
+static const BBRect kAnim4FrameRects[] = {{-3, -9, 7, 11}, {-3, -9, 7, 11}, {-3, -9, 7, 11}};
+static const int kAnim5FrameIndices[] = {15, 16, 17};
+static const int16 kAnim5FrameTicks[] = {10, 8, 8};
+static const BBRect kAnim5FrameRects[] = {{-7, -8, 13, 9}, {-7, -7, 13, 8}, {-7, -7, 13, 8}};
+static const int kAnim6FrameIndices[] = {18, 19, 20};
+static const int16 kAnim6FrameTicks[] = {10, 8, 8};
+static const BBRect kAnim6FrameRects[] = {{-10, -6, 17, 7}, {-11, -6, 18, 7}, {-11, -6, 18, 6}};
+static const int kAnim7FrameIndices[] = {21, 22, 23};
+static const int16 kAnim7FrameTicks[] = {10, 8, 8};
+static const BBRect kAnim7FrameRects[] = {{-7, -6, 13, 8}, {-7, -7, 12, 9}, {-7, -7, 13, 9}};
+static const int kAnim8FrameIndices[] = {24};
+static const int16 kAnim8FrameTicks[] = {8};
+static const BBRect kAnim8FrameRects[] = {{-3, -9, 6, 12}};
+static const int kAnim9FrameIndices[] = {25};
+static const int16 kAnim9FrameTicks[] = {8};
+static const BBRect kAnim9FrameRects[] = {{-5, -6, 12, 7}};
+static const int kAnim10FrameIndices[] = {26};
+static const int16 kAnim10FrameTicks[] = {8};
+static const BBRect kAnim10FrameRects[] = {{-4, -6, 13, 6}};
+static const int kAnim11FrameIndices[] = {27};
+static const int16 kAnim11FrameTicks[] = {8};
+static const BBRect kAnim11FrameRects[] = {{-5, -7, 11, 8}};
+static const int kAnim12FrameIndices[] = {28};
+static const int16 kAnim12FrameTicks[] = {8};
+static const BBRect kAnim12FrameRects[] = {{-2, -10, 5, 12}};
+static const int kAnim13FrameIndices[] = {29};
+static const int16 kAnim13FrameTicks[] = {8};
+static const BBRect kAnim13FrameRects[] = {{-6, -8, 13, 9}};
+static const int kAnim14FrameIndices[] = {30};
+static const int16 kAnim14FrameTicks[] = {8};
+static const BBRect kAnim14FrameRects[] = {{-8, -6, 13, 6}};
+static const int kAnim15FrameIndices[] = {31};
+static const int16 kAnim15FrameTicks[] = {8};
+static const BBRect kAnim15FrameRects[] = {{-7, -7, 12, 8}};
+static const int kAnim16FrameIndices[] = {0, 1, 2};
+static const int16 kAnim16FrameTicks[] = {6, 6, 6};
+static const BBRect kAnim16FrameRects[] = {{-3, -8, 6, 14}, {-3, -8, 6, 13}, {-3, -7, 6, 12}};
+static const int kAnim17FrameIndices[] = {3, 4, 5};
+static const int16 kAnim17FrameTicks[] = {6, 6, 6};
+static const BBRect kAnim17FrameRects[] = {{-5, -6, 13, 9}, {-5, -6, 13, 10}, {-5, -6, 13, 10}};
+static const int kAnim18FrameIndices[] = {6, 7, 8};
+static const int16 kAnim18FrameTicks[] = {6, 6, 6};
+static const BBRect kAnim18FrameRects[] = {{-6, -6, 17, 7}, {-6, -6, 15, 6}, {-7, -6, 17, 6}};
+static const int kAnim19FrameIndices[] = {9, 10, 11};
+static const int16 kAnim19FrameTicks[] = {6, 6, 6};
+static const BBRect kAnim19FrameRects[] = {{-5, -7, 13, 8}, {-5, -7, 12, 7}, {-5, -7, 12, 9}};
+static const int kAnim20FrameIndices[] = {12, 13, 14};
+static const int16 kAnim20FrameTicks[] = {6, 6, 6};
+static const BBRect kAnim20FrameRects[] = {{-3, -9, 7, 11}, {-3, -9, 7, 11}, {-3, -9, 7, 11}};
+static const int kAnim21FrameIndices[] = {15, 16, 17};
+static const int16 kAnim21FrameTicks[] = {6, 6, 6};
+static const BBRect kAnim21FrameRects[] = {{-7, -8, 13, 9}, {-7, -7, 13, 8}, {-7, -7, 13, 8}};
+static const int kAnim22FrameIndices[] = {18, 19, 20};
+static const int16 kAnim22FrameTicks[] = {6, 6, 6};
+static const BBRect kAnim22FrameRects[] = {{-10, -6, 17, 7}, {-11, -6, 18, 7}, {-11, -6, 18, 6}};
+static const int kAnim23FrameIndices[] = {21, 22, 23};
+static const int16 kAnim23FrameTicks[] = {6, 6, 6};
+static const BBRect kAnim23FrameRects[] = {{-7, -6, 13, 8}, {-7, -7, 12, 9}, {-7, -7, 13, 9}};
+static const int kAnim24FrameIndices[] = {32, 33, 34, 35, 36, 37, 36, 37, 36, 37, 36, 37, 36, 38};
+static const int16 kAnim24FrameTicks[] = {6, 6, 6, 6, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10};
+static const BBRect kAnim24FrameRects[] = {{-3, -14, 12, 10}, {-2, -21, 11, 11}, {0, -23, 8, 14}, {-6, -15, 13, 11}, {-8, -4, 15, 5}, {-9, -4, 16, 6}, {-8, -4, 15, 5}, {-9, -4, 16, 6}, {-8, -4, 15, 5}, {-9, -4, 16, 6}, {-8, -4, 15, 5}, {-9, -4, 16, 6}, {-8, -4, 15, 5}, {-9, -4, 16, 5}};
+static const int kAnim25FrameIndices[] = {39, 40, 41, 42, 43, 44, 43, 44, 43, 44, 43, 44, 43, 45};
+static const int16 kAnim25FrameTicks[] = {6, 6, 6, 6, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10};
+static const BBRect kAnim25FrameRects[] = {{-9, -14, 13, 10}, {-8, -22, 12, 12}, {-8, -24, 8, 15}, {-7, -15, 13, 10}, {-6, -4, 15, 7}, {-7, -4, 16, 6}, {-6, -4, 15, 7}, {-7, -4, 16, 6}, {-6, -4, 15, 7}, {-7, -4, 16, 6}, {-6, -4, 15, 7}, {-7, -4, 16, 6}, {-6, -4, 15, 7}, {-7, -4, 16, 6}};
+static const int kAnim26FrameIndices[] = {46, 47, 48};
+static const int16 kAnim26FrameTicks[] = {10, 8, 8};
+static const BBRect kAnim26FrameRects[] = {{-3, -8, 6, 14}, {-3, -8, 6, 13}, {-3, -7, 6, 12}};
+static const int kAnim27FrameIndices[] = {49, 50, 51};
+static const int16 kAnim27FrameTicks[] = {10, 8, 8};
+static const BBRect kAnim27FrameRects[] = {{-5, -6, 13, 9}, {-5, -6, 13, 10}, {-5, -6, 13, 10}};
+static const int kAnim28FrameIndices[] = {52, 53, 54};
+static const int16 kAnim28FrameTicks[] = {10, 8, 8};
+static const BBRect kAnim28FrameRects[] = {{-6, -6, 17, 7}, {-6, -6, 15, 6}, {-7, -6, 17, 6}};
+static const int kAnim29FrameIndices[] = {55, 56, 57};
+static const int16 kAnim29FrameTicks[] = {10, 8, 8};
+static const BBRect kAnim29FrameRects[] = {{-5, -7, 13, 8}, {-5, -7, 12, 7}, {-5, -7, 12, 9}};
+static const int kAnim30FrameIndices[] = {58, 59, 60};
+static const int16 kAnim30FrameTicks[] = {10, 8, 8};
+static const BBRect kAnim30FrameRects[] = {{-3, -9, 7, 11}, {-3, -9, 7, 11}, {-3, -9, 7, 11}};
+static const int kAnim31FrameIndices[] = {61, 62, 63};
+static const int16 kAnim31FrameTicks[] = {10, 8, 8};
+static const BBRect kAnim31FrameRects[] = {{-7, -8, 13, 9}, {-7, -7, 13, 8}, {-7, -7, 13, 8}};
+static const int kAnim32FrameIndices[] = {64, 65, 66};
+static const int16 kAnim32FrameTicks[] = {10, 8, 8};
+static const BBRect kAnim32FrameRects[] = {{-10, -6, 17, 7}, {-11, -6, 18, 7}, {-11, -6, 18, 6}};
+static const int kAnim33FrameIndices[] = {67, 68, 69};
+static const int16 kAnim33FrameTicks[] = {10, 8, 8};
+static const BBRect kAnim33FrameRects[] = {{-7, -6, 13, 8}, {-7, -7, 12, 9}, {-7, -7, 13, 9}};
+static const int kAnim34FrameIndices[] = {70};
+static const int16 kAnim34FrameTicks[] = {8};
+static const BBRect kAnim34FrameRects[] = {{-3, -9, 6, 12}};
+static const int kAnim35FrameIndices[] = {71};
+static const int16 kAnim35FrameTicks[] = {8};
+static const BBRect kAnim35FrameRects[] = {{-5, -6, 12, 7}};
+static const int kAnim36FrameIndices[] = {72};
+static const int16 kAnim36FrameTicks[] = {8};
+static const BBRect kAnim36FrameRects[] = {{-4, -6, 13, 6}};
+static const int kAnim37FrameIndices[] = {73};
+static const int16 kAnim37FrameTicks[] = {8};
+static const BBRect kAnim37FrameRects[] = {{-5, -7, 11, 8}};
+static const int kAnim38FrameIndices[] = {74};
+static const int16 kAnim38FrameTicks[] = {8};
+static const BBRect kAnim38FrameRects[] = {{-2, -10, 5, 12}};
+static const int kAnim39FrameIndices[] = {75};
+static const int16 kAnim39FrameTicks[] = {8};
+static const BBRect kAnim39FrameRects[] = {{-6, -8, 13, 9}};
+static const int kAnim40FrameIndices[] = {76};
+static const int16 kAnim40FrameTicks[] = {8};
+static const BBRect kAnim40FrameRects[] = {{-8, -6, 13, 6}};
+static const int kAnim41FrameIndices[] = {77};
+static const int16 kAnim41FrameTicks[] = {8};
+static const BBRect kAnim41FrameRects[] = {{-7, -7, 12, 8}};
+static const int kAnim42FrameIndices[] = {46, 47, 48};
+static const int16 kAnim42FrameTicks[] = {6, 6, 6};
+static const BBRect kAnim42FrameRects[] = {{-3, -8, 6, 14}, {-3, -8, 6, 13}, {-3, -7, 6, 12}};
+static const int kAnim43FrameIndices[] = {49, 50, 51};
+static const int16 kAnim43FrameTicks[] = {6, 6, 6};
+static const BBRect kAnim43FrameRects[] = {{-5, -6, 13, 9}, {-5, -6, 13, 10}, {-5, -6, 13, 10}};
+static const int kAnim44FrameIndices[] = {52, 53, 54};
+static const int16 kAnim44FrameTicks[] = {6, 6, 6};
+static const BBRect kAnim44FrameRects[] = {{-6, -6, 17, 7}, {-6, -6, 15, 6}, {-7, -6, 17, 6}};
+static const int kAnim45FrameIndices[] = {55, 56, 57};
+static const int16 kAnim45FrameTicks[] = {6, 6, 6};
+static const BBRect kAnim45FrameRects[] = {{-5, -7, 13, 8}, {-5, -7, 12, 7}, {-5, -7, 12, 9}};
+static const int kAnim46FrameIndices[] = {58, 59, 60};
+static const int16 kAnim46FrameTicks[] = {6, 6, 6};
+static const BBRect kAnim46FrameRects[] = {{-3, -9, 7, 11}, {-3, -9, 7, 11}, {-3, -9, 7, 11}};
+static const int kAnim47FrameIndices[] = {61, 62, 63};
+static const int16 kAnim47FrameTicks[] = {6, 6, 6};
+static const BBRect kAnim47FrameRects[] = {{-7, -8, 13, 9}, {-7, -7, 13, 8}, {-7, -7, 13, 8}};
+static const int kAnim48FrameIndices[] = {64, 65, 66};
+static const int16 kAnim48FrameTicks[] = {6, 6, 6};
+static const BBRect kAnim48FrameRects[] = {{-10, -6, 17, 7}, {-11, -6, 18, 7}, {-11, -6, 18, 6}};
+static const int kAnim49FrameIndices[] = {67, 68, 69};
+static const int16 kAnim49FrameTicks[] = {6, 6, 6};
+static const BBRect kAnim49FrameRects[] = {{-7, -6, 13, 8}, {-7, -7, 12, 9}, {-7, -7, 13, 9}};
+static const int kAnim50FrameIndices[] = {78, 79, 80, 81, 82, 83, 82, 83, 82, 83, 82, 83, 82, 84};
+static const int16 kAnim50FrameTicks[] = {6, 6, 6, 6, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10};
+static const BBRect kAnim50FrameRects[] = {{-3, -14, 12, 10}, {-2, -21, 11, 11}, {0, -23, 8, 14}, {-6, -15, 13, 11}, {-8, -4, 15, 5}, {-9, -4, 16, 6}, {-8, -4, 15, 5}, {-9, -4, 16, 6}, {-8, -4, 15, 5}, {-9, -4, 16, 6}, {-8, -4, 15, 5}, {-9, -4, 16, 6}, {-8, -4, 15, 5}, {-9, -4, 16, 5}};
+static const int kAnim51FrameIndices[] = {85, 86, 87, 88, 89, 90, 89, 90, 89, 90, 89, 90, 89, 91};
+static const int16 kAnim51FrameTicks[] = {6, 6, 6, 6, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10};
+static const BBRect kAnim51FrameRects[] = {{-9, -14, 13, 10}, {-8, -22, 12, 12}, {-8, -24, 8, 15}, {-7, -15, 13, 10}, {-6, -4, 15, 7}, {-7, -4, 16, 6}, {-6, -4, 15, 7}, {-7, -4, 16, 6}, {-6, -4, 15, 7}, {-7, -4, 16, 6}, {-6, -4, 15, 7}, {-7, -4, 16, 6}, {-6, -4, 15, 7}, {-7, -4, 16, 6}};
+static const int kAnim52FrameIndices[] = {92, 93, 94};
+static const int16 kAnim52FrameTicks[] = {10, 8, 8};
+static const BBRect kAnim52FrameRects[] = {{-6, -14, 13, 24}, {-7, -13, 14, 23}, {-6, -13, 12, 22}};
+static const int kAnim53FrameIndices[] = {95, 96, 97};
+static const int16 kAnim53FrameTicks[] = {10, 8, 8};
+static const BBRect kAnim53FrameRects[] = {{-4, -12, 19, 17}, {-3, -12, 18, 18}, {-2, -12, 17, 18}};
+static const int kAnim54FrameIndices[] = {98, 99, 100};
+static const int16 kAnim54FrameTicks[] = {10, 8, 8};
+static const BBRect kAnim54FrameRects[] = {{-6, -16, 23, 14}, {-6, -15, 24, 13}, {-7, -15, 25, 14}};
+static const int kAnim55FrameIndices[] = {101, 102, 103};
+static const int16 kAnim55FrameTicks[] = {10, 8, 8};
+static const BBRect kAnim55FrameRects[] = {{-4, -22, 16, 20}, {-3, -23, 14, 22}, {-4, -23, 14, 22}};
+static const int kAnim56FrameIndices[] = {104, 105, 106};
+static const int16 kAnim56FrameTicks[] = {10, 8, 8};
+static const BBRect kAnim56FrameRects[] = {{-5, -24, 11, 23}, {-5, -25, 11, 25}, {-5, -25, 11, 26}};
+static const int kAnim57FrameIndices[] = {107, 108, 109};
+static const int16 kAnim57FrameTicks[] = {10, 8, 8};
+static const BBRect kAnim57FrameRects[] = {{-10, -23, 15, 21}, {-11, -22, 16, 20}, {-11, -23, 17, 21}};
+static const int kAnim58FrameIndices[] = {110, 111, 112};
+static const int16 kAnim58FrameTicks[] = {10, 8, 8};
+static const BBRect kAnim58FrameRects[] = {{-17, -15, 25, 15}, {-17, -15, 25, 14}, {-17, -15, 25, 14}};
+static const int kAnim59FrameIndices[] = {113, 114, 115};
+static const int16 kAnim59FrameTicks[] = {10, 8, 8};
+static const BBRect kAnim59FrameRects[] = {{-14, -12, 20, 17}, {-14, -13, 19, 18}, {-14, -13, 19, 18}};
+static const int kAnim60FrameIndices[] = {116};
+static const int16 kAnim60FrameTicks[] = {6};
+static const BBRect kAnim60FrameRects[] = {{-6, -12, 12, 23}};
+static const int kAnim61FrameIndices[] = {117};
+static const int16 kAnim61FrameTicks[] = {6};
+static const BBRect kAnim61FrameRects[] = {{-5, -11, 20, 19}};
+static const int kAnim62FrameIndices[] = {118};
+static const int16 kAnim62FrameTicks[] = {6};
+static const BBRect kAnim62FrameRects[] = {{-8, -14, 27, 15}};
+static const int kAnim63FrameIndices[] = {119};
+static const int16 kAnim63FrameTicks[] = {6};
+static const BBRect kAnim63FrameRects[] = {{-4, -22, 17, 20}};
+static const int kAnim64FrameIndices[] = {120};
+static const int16 kAnim64FrameTicks[] = {6};
+static const BBRect kAnim64FrameRects[] = {{-6, -25, 13, 25}};
+static const int kAnim65FrameIndices[] = {121};
+static const int16 kAnim65FrameTicks[] = {6};
+static const BBRect kAnim65FrameRects[] = {{-11, -23, 17, 23}};
+static const int kAnim66FrameIndices[] = {122};
+static const int16 kAnim66FrameTicks[] = {6};
+static const BBRect kAnim66FrameRects[] = {{-18, -13, 29, 13}};
+static const int kAnim67FrameIndices[] = {123};
+static const int16 kAnim67FrameTicks[] = {6};
+static const BBRect kAnim67FrameRects[] = {{-14, -12, 21, 19}};
+static const int kAnim68FrameIndices[] = {92, 93, 94};
+static const int16 kAnim68FrameTicks[] = {6, 6, 6};
+static const BBRect kAnim68FrameRects[] = {{-6, -14, 13, 24}, {-7, -13, 14, 23}, {-6, -13, 12, 22}};
+static const int kAnim69FrameIndices[] = {95, 96, 97};
+static const int16 kAnim69FrameTicks[] = {6, 6, 6};
+static const BBRect kAnim69FrameRects[] = {{-4, -12, 19, 17}, {-3, -12, 18, 18}, {-2, -12, 17, 18}};
+static const int kAnim70FrameIndices[] = {98, 99, 100};
+static const int16 kAnim70FrameTicks[] = {6, 6, 6};
+static const BBRect kAnim70FrameRects[] = {{-6, -16, 23, 14}, {-6, -15, 24, 13}, {-7, -15, 25, 14}};
+static const int kAnim71FrameIndices[] = {101, 102, 103};
+static const int16 kAnim71FrameTicks[] = {6, 6, 6};
+static const BBRect kAnim71FrameRects[] = {{-4, -22, 16, 20}, {-3, -23, 14, 22}, {-4, -23, 14, 22}};
+static const int kAnim72FrameIndices[] = {104, 105, 106};
+static const int16 kAnim72FrameTicks[] = {6, 6, 6};
+static const BBRect kAnim72FrameRects[] = {{-5, -24, 11, 23}, {-5, -25, 11, 25}, {-5, -25, 11, 26}};
+static const int kAnim73FrameIndices[] = {107, 108, 109};
+static const int16 kAnim73FrameTicks[] = {6, 6, 6};
+static const BBRect kAnim73FrameRects[] = {{-10, -23, 15, 21}, {-11, -22, 16, 20}, {-11, -23, 17, 21}};
+static const int kAnim74FrameIndices[] = {110, 111, 112};
+static const int16 kAnim74FrameTicks[] = {6, 6, 6};
+static const BBRect kAnim74FrameRects[] = {{-17, -15, 25, 15}, {-17, -15, 25, 14}, {-17, -15, 25, 14}};
+static const int kAnim75FrameIndices[] = {113, 114, 115};
+static const int16 kAnim75FrameTicks[] = {6, 6, 6};
+static const BBRect kAnim75FrameRects[] = {{-14, -12, 20, 17}, {-14, -13, 19, 18}, {-14, -13, 19, 18}};
+static const int kAnim76FrameIndices[] = {124, 125, 126, 127, 128, 129, 128, 129, 128, 129, 128, 129, 128, 130};
+static const int16 kAnim76FrameTicks[] = {6, 6, 6, 6, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10};
+static const BBRect kAnim76FrameRects[] = {{-14, -23, 23, 18}, {-12, -32, 18, 23}, {-16, -29, 18, 22}, {-17, -17, 23, 17}, {-17, -10, 26, 14}, {-17, -12, 25, 15}, {-17, -10, 26, 14}, {-17, -12, 25, 15}, {-17, -10, 26, 14}, {-17, -12, 25, 15}, {-17, -10, 26, 14}, {-17, -12, 25, 15}, {-17, -10, 26, 14}, {-18, -13, 28, 14}};
+static const int kAnim77FrameIndices[] = {131, 132, 133, 134, 135, 136, 135, 136, 135, 136, 135, 136, 135, 137};
+static const int16 kAnim77FrameTicks[] = {6, 6, 6, 6, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10};
+static const BBRect kAnim77FrameRects[] = {{-6, -24, 21, 19}, {-5, -33, 19, 24}, {-1, -29, 18, 22}, {-5, -17, 22, 17}, {-6, -10, 23, 14}, {-7, -10, 26, 13}, {-6, -10, 23, 14}, {-7, -10, 26, 13}, {-6, -10, 23, 14}, {-7, -10, 26, 13}, {-6, -10, 23, 14}, {-7, -10, 26, 13}, {-6, -10, 23, 14}, {-7, -12, 26, 14}};
+static const int kAnim78FrameIndices[] = {138, 139, 140};
+static const int16 kAnim78FrameTicks[] = {10, 8, 8};
+static const BBRect kAnim78FrameRects[] = {{-3, -17, 7, 20}, {-3, -16, 7, 19}, {-3, -16, 7, 19}};
+static const int kAnim79FrameIndices[] = {141, 142, 143};
+static const int16 kAnim79FrameTicks[] = {10, 8, 8};
+static const BBRect kAnim79FrameRects[] = {{-6, -14, 13, 15}, {-7, -13, 14, 14}, {-6, -13, 13, 14}};
+static const int kAnim80FrameIndices[] = {144, 145, 146};
+static const int16 kAnim80FrameTicks[] = {10, 8, 8};
+static const BBRect kAnim80FrameRects[] = {{-10, -10, 20, 9}, {-9, -9, 19, 8}, {-9, -9, 19, 8}};
+static const int kAnim81FrameIndices[] = {147, 148, 149};
+static const int16 kAnim81FrameTicks[] = {10, 8, 8};
+static const BBRect kAnim81FrameRects[] = {{-7, -11, 16, 10}, {-7, -11, 16, 10}, {-7, -11, 16, 10}};
+static const int kAnim82FrameIndices[] = {150, 151, 152};
+static const int16 kAnim82FrameTicks[] = {10, 8, 8};
+static const BBRect kAnim82FrameRects[] = {{-3, -13, 7, 16}, {-3, -13, 7, 16}, {-3, -12, 7, 15}};
+static const int kAnim83FrameIndices[] = {153, 154, 155};
+static const int16 kAnim83FrameTicks[] = {10, 8, 8};
+static const BBRect kAnim83FrameRects[] = {{-8, -11, 18, 10}, {-7, -11, 16, 11}, {-7, -10, 17, 9}};
+static const int kAnim84FrameIndices[] = {156, 157, 158};
+static const int16 kAnim84FrameTicks[] = {10, 8, 8};
+static const BBRect kAnim84FrameRects[] = {{-8, -9, 20, 7}, {-9, -9, 21, 8}, {-9, -9, 21, 8}};
+static const int kAnim85FrameIndices[] = {159, 160, 161};
+static const int16 kAnim85FrameTicks[] = {10, 8, 8};
+static const BBRect kAnim85FrameRects[] = {{-6, -14, 15, 15}, {-5, -13, 12, 14}, {-6, -13, 14, 14}};
+static const int kAnim86FrameIndices[] = {162};
+static const int16 kAnim86FrameTicks[] = {6};
+static const BBRect kAnim86FrameRects[] = {{-3, -15, 8, 18}};
+static const int kAnim87FrameIndices[] = {163};
+static const int16 kAnim87FrameTicks[] = {6};
+static const BBRect kAnim87FrameRects[] = {{-7, -13, 14, 14}};
+static const int kAnim88FrameIndices[] = {164};
+static const int16 kAnim88FrameTicks[] = {6};
+static const BBRect kAnim88FrameRects[] = {{-11, -9, 21, 8}};
+static const int kAnim89FrameIndices[] = {165};
+static const int16 kAnim89FrameTicks[] = {6};
+static const BBRect kAnim89FrameRects[] = {{-9, -11, 18, 11}};
+static const int kAnim90FrameIndices[] = {166};
+static const int16 kAnim90FrameTicks[] = {6};
+static const BBRect kAnim90FrameRects[] = {{-3, -12, 7, 15}};
+static const int kAnim91FrameIndices[] = {167};
+static const int16 kAnim91FrameTicks[] = {6};
+static const BBRect kAnim91FrameRects[] = {{-8, -11, 17, 12}};
+static const int kAnim92FrameIndices[] = {168};
+static const int16 kAnim92FrameTicks[] = {6};
+static const BBRect kAnim92FrameRects[] = {{-9, -10, 21, 9}};
+static const int kAnim93FrameIndices[] = {169};
+static const int16 kAnim93FrameTicks[] = {6};
+static const BBRect kAnim93FrameRects[] = {{-6, -14, 14, 15}};
+static const int kAnim94FrameIndices[] = {138, 139, 140};
+static const int16 kAnim94FrameTicks[] = {6, 6, 6};
+static const BBRect kAnim94FrameRects[] = {{-3, -17, 7, 20}, {-3, -16, 7, 19}, {-3, -16, 7, 19}};
+static const int kAnim95FrameIndices[] = {141, 142, 143};
+static const int16 kAnim95FrameTicks[] = {6, 6, 6};
+static const BBRect kAnim95FrameRects[] = {{-6, -14, 13, 15}, {-7, -13, 14, 14}, {-6, -13, 13, 14}};
+static const int kAnim96FrameIndices[] = {144, 145, 146};
+static const int16 kAnim96FrameTicks[] = {6, 6, 6};
+static const BBRect kAnim96FrameRects[] = {{-10, -10, 20, 9}, {-9, -9, 19, 8}, {-9, -9, 19, 8}};
+static const int kAnim97FrameIndices[] = {147, 148, 149};
+static const int16 kAnim97FrameTicks[] = {6, 6, 6};
+static const BBRect kAnim97FrameRects[] = {{-7, -11, 16, 10}, {-7, -11, 16, 10}, {-7, -11, 16, 10}};
+static const int kAnim98FrameIndices[] = {150, 151, 152};
+static const int16 kAnim98FrameTicks[] = {6, 6, 6};
+static const BBRect kAnim98FrameRects[] = {{-3, -13, 7, 16}, {-3, -13, 7, 16}, {-3, -12, 7, 15}};
+static const int kAnim99FrameIndices[] = {153, 154, 155};
+static const int16 kAnim99FrameTicks[] = {6, 6, 6};
+static const BBRect kAnim99FrameRects[] = {{-8, -11, 18, 10}, {-7, -11, 16, 11}, {-7, -10, 17, 9}};
+static const int kAnim100FrameIndices[] = {156, 157, 158};
+static const int16 kAnim100FrameTicks[] = {6, 6, 6};
+static const BBRect kAnim100FrameRects[] = {{-8, -9, 20, 7}, {-9, -9, 21, 8}, {-9, -9, 21, 8}};
+static const int kAnim101FrameIndices[] = {159, 160, 161};
+static const int16 kAnim101FrameTicks[] = {6, 6, 6};
+static const BBRect kAnim101FrameRects[] = {{-6, -14, 15, 15}, {-5, -13, 12, 14}, {-6, -13, 14, 14}};
+static const int kAnim102FrameIndices[] = {170, 171, 172, 173, 174, 175, 174, 175, 174, 175, 174, 175, 174, 176};
+static const int16 kAnim102FrameTicks[] = {6, 6, 6, 6, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10};
+static const BBRect kAnim102FrameRects[] = {{-7, -18, 15, 14}, {-6, -24, 11, 18}, {-6, -24, 9, 17}, {-5, -14, 16, 11}, {-7, -6, 18, 7}, {-8, -7, 19, 8}, {-7, -6, 18, 7}, {-8, -7, 19, 8}, {-7, -6, 18, 7}, {-8, -7, 19, 8}, {-7, -6, 18, 7}, {-8, -7, 19, 8}, {-7, -6, 18, 7}, {-8, -7, 19, 8}};
+static const int kAnim103FrameIndices[] = {177, 178, 179, 180, 181, 182, 181, 182, 181, 182, 181, 182, 181, 183};
+static const int16 kAnim103FrameTicks[] = {6, 6, 6, 6, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10};
+static const BBRect kAnim103FrameRects[] = {{-9, -18, 16, 15}, {-6, -24, 12, 18}, {-6, -24, 13, 16}, {-12, -15, 17, 13}, {-10, -7, 19, 8}, {-11, -7, 21, 9}, {-10, -7, 19, 8}, {-11, -7, 21, 9}, {-10, -7, 19, 8}, {-11, -7, 21, 9}, {-10, -7, 19, 8}, {-11, -7, 21, 9}, {-10, -7, 19, 8}, {-11, -6, 21, 6}};
+static const int kAnim104FrameIndices[] = {184, 185, 186};
+static const int16 kAnim104FrameTicks[] = {10, 8, 8};
+static const BBRect kAnim104FrameRects[] = {{-3, -17, 7, 20}, {-3, -16, 7, 19}, {-3, -16, 7, 19}};
+static const int kAnim105FrameIndices[] = {187, 188, 189};
+static const int16 kAnim105FrameTicks[] = {10, 8, 8};
+static const BBRect kAnim105FrameRects[] = {{-6, -14, 13, 15}, {-7, -13, 14, 14}, {-6, -13, 13, 14}};
+static const int kAnim106FrameIndices[] = {190, 191, 192};
+static const int16 kAnim106FrameTicks[] = {10, 8, 8};
+static const BBRect kAnim106FrameRects[] = {{-10, -10, 20, 9}, {-9, -9, 19, 8}, {-9, -9, 19, 8}};
+static const int kAnim107FrameIndices[] = {193, 194, 195};
+static const int16 kAnim107FrameTicks[] = {10, 8, 8};
+static const BBRect kAnim107FrameRects[] = {{-7, -11, 16, 10}, {-7, -11, 16, 10}, {-7, -11, 16, 10}};
+static const int kAnim108FrameIndices[] = {196, 197, 198};
+static const int16 kAnim108FrameTicks[] = {10, 8, 8};
+static const BBRect kAnim108FrameRects[] = {{-3, -13, 7, 16}, {-3, -13, 7, 16}, {-3, -12, 7, 15}};
+static const int kAnim109FrameIndices[] = {199, 200, 201};
+static const int16 kAnim109FrameTicks[] = {10, 8, 8};
+static const BBRect kAnim109FrameRects[] = {{-8, -11, 18, 10}, {-7, -11, 16, 11}, {-7, -10, 17, 9}};
+static const int kAnim110FrameIndices[] = {202, 203, 204};
+static const int16 kAnim110FrameTicks[] = {10, 8, 8};
+static const BBRect kAnim110FrameRects[] = {{-8, -9, 20, 7}, {-9, -9, 21, 8}, {-9, -9, 21, 8}};
+static const int kAnim111FrameIndices[] = {205, 206, 207};
+static const int16 kAnim111FrameTicks[] = {10, 8, 8};
+static const BBRect kAnim111FrameRects[] = {{-6, -14, 15, 15}, {-5, -13, 12, 14}, {-6, -13, 14, 14}};
+static const int kAnim112FrameIndices[] = {208};
+static const int16 kAnim112FrameTicks[] = {6};
+static const BBRect kAnim112FrameRects[] = {{-3, -15, 8, 18}};
+static const int kAnim113FrameIndices[] = {209};
+static const int16 kAnim113FrameTicks[] = {6};
+static const BBRect kAnim113FrameRects[] = {{-7, -13, 14, 14}};
+static const int kAnim114FrameIndices[] = {210};
+static const int16 kAnim114FrameTicks[] = {6};
+static const BBRect kAnim114FrameRects[] = {{-11, -9, 21, 8}};
+static const int kAnim115FrameIndices[] = {211};
+static const int16 kAnim115FrameTicks[] = {6};
+static const BBRect kAnim115FrameRects[] = {{-9, -11, 18, 11}};
+static const int kAnim116FrameIndices[] = {212};
+static const int16 kAnim116FrameTicks[] = {6};
+static const BBRect kAnim116FrameRects[] = {{-3, -12, 7, 15}};
+static const int kAnim117FrameIndices[] = {213};
+static const int16 kAnim117FrameTicks[] = {6};
+static const BBRect kAnim117FrameRects[] = {{-8, -11, 17, 12}};
+static const int kAnim118FrameIndices[] = {214};
+static const int16 kAnim118FrameTicks[] = {6};
+static const BBRect kAnim118FrameRects[] = {{-9, -10, 21, 9}};
+static const int kAnim119FrameIndices[] = {215};
+static const int16 kAnim119FrameTicks[] = {6};
+static const BBRect kAnim119FrameRects[] = {{-6, -14, 14, 15}};
+static const int kAnim120FrameIndices[] = {184, 185, 186};
+static const int16 kAnim120FrameTicks[] = {6, 6, 6};
+static const BBRect kAnim120FrameRects[] = {{-3, -17, 7, 20}, {-3, -16, 7, 19}, {-3, -16, 7, 19}};
+static const int kAnim121FrameIndices[] = {187, 188, 189};
+static const int16 kAnim121FrameTicks[] = {6, 6, 6};
+static const BBRect kAnim121FrameRects[] = {{-6, -14, 13, 15}, {-7, -13, 14, 14}, {-6, -13, 13, 14}};
+static const int kAnim122FrameIndices[] = {190, 191, 192};
+static const int16 kAnim122FrameTicks[] = {6, 6, 6};
+static const BBRect kAnim122FrameRects[] = {{-10, -10, 20, 9}, {-9, -9, 19, 8}, {-9, -9, 19, 8}};
+static const int kAnim123FrameIndices[] = {193, 194, 195};
+static const int16 kAnim123FrameTicks[] = {6, 6, 6};
+static const BBRect kAnim123FrameRects[] = {{-7, -11, 16, 10}, {-7, -11, 16, 10}, {-7, -11, 16, 10}};
+static const int kAnim124FrameIndices[] = {196, 197, 198};
+static const int16 kAnim124FrameTicks[] = {6, 6, 6};
+static const BBRect kAnim124FrameRects[] = {{-3, -13, 7, 16}, {-3, -13, 7, 16}, {-3, -12, 7, 15}};
+static const int kAnim125FrameIndices[] = {199, 200, 201};
+static const int16 kAnim125FrameTicks[] = {6, 6, 6};
+static const BBRect kAnim125FrameRects[] = {{-8, -11, 18, 10}, {-7, -11, 16, 11}, {-7, -10, 17, 9}};
+static const int kAnim126FrameIndices[] = {202, 203, 204};
+static const int16 kAnim126FrameTicks[] = {6, 6, 6};
+static const BBRect kAnim126FrameRects[] = {{-8, -9, 20, 7}, {-9, -9, 21, 8}, {-9, -9, 21, 8}};
+static const int kAnim127FrameIndices[] = {205, 206, 207};
+static const int16 kAnim127FrameTicks[] = {6, 6, 6};
+static const BBRect kAnim127FrameRects[] = {{-6, -14, 15, 15}, {-5, -13, 12, 14}, {-6, -13, 14, 14}};
+static const int kAnim128FrameIndices[] = {216, 217, 218, 219, 220, 221, 220, 221, 220, 221, 220, 221, 220, 222};
+static const int16 kAnim128FrameTicks[] = {6, 6, 6, 6, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10};
+static const BBRect kAnim128FrameRects[] = {{-7, -18, 15, 14}, {-6, -24, 11, 18}, {-6, -24, 9, 17}, {-5, -14, 16, 11}, {-7, -6, 18, 7}, {-8, -7, 19, 8}, {-7, -6, 18, 7}, {-8, -7, 19, 8}, {-7, -6, 18, 7}, {-8, -7, 19, 8}, {-7, -6, 18, 7}, {-8, -7, 19, 8}, {-7, -6, 18, 7}, {-8, -7, 19, 8}};
+static const int kAnim129FrameIndices[] = {223, 224, 225, 226, 227, 228, 227, 228, 227, 228, 227, 228, 227, 229};
+static const int16 kAnim129FrameTicks[] = {6, 6, 6, 6, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10};
+static const BBRect kAnim129FrameRects[] = {{-9, -18, 16, 15}, {-6, -24, 12, 18}, {-6, -24, 13, 16}, {-12, -15, 17, 13}, {-10, -7, 19, 8}, {-11, -7, 21, 9}, {-10, -7, 19, 8}, {-11, -7, 21, 9}, {-10, -7, 19, 8}, {-11, -7, 21, 9}, {-10, -7, 19, 8}, {-11, -7, 21, 9}, {-10, -7, 19, 8}, {-11, -6, 21, 6}};
+static const int kAnim130FrameIndices[] = {230};
+static const int16 kAnim130FrameTicks[] = {6};
+static const BBRect kAnim130FrameRects[] = {{0, 0, 0, 0}};
+static const int kAnim131FrameIndices[] = {231};
+static const int16 kAnim131FrameTicks[] = {6};
+static const BBRect kAnim131FrameRects[] = {{-8, -9, 16, 12}};
+static const int kAnim132FrameIndices[] = {231, 232, 233};
+static const int16 kAnim132FrameTicks[] = {6, 6, 6};
+static const BBRect kAnim132FrameRects[] = {{-8, -9, 16, 12}, {-8, -11, 16, 12}, {-8, -13, 16, 12}};
+static const int kAnim133FrameIndices[] = {233};
+static const int16 kAnim133FrameTicks[] = {6};
+static const BBRect kAnim133FrameRects[] = {{-8, -13, 16, 12}};
+static const int kAnim134FrameIndices[] = {234};
+static const int16 kAnim134FrameTicks[] = {6};
+static const BBRect kAnim134FrameRects[] = {{-7, -6, 14, 10}};
+static const int kAnim135FrameIndices[] = {234, 235, 236};
+static const int16 kAnim135FrameTicks[] = {6, 6, 6};
+static const BBRect kAnim135FrameRects[] = {{-7, -6, 14, 10}, {-7, -9, 14, 9}, {-7, -12, 14, 9}};
+static const int kAnim136FrameIndices[] = {236};
+static const int16 kAnim136FrameTicks[] = {6};
+static const BBRect kAnim136FrameRects[] = {{-7, -12, 14, 9}};
+static const int kAnim137FrameIndices[] = {237};
+static const int16 kAnim137FrameTicks[] = {6};
+static const BBRect kAnim137FrameRects[] = {{-7, -8, 16, 13}};
+static const int kAnim138FrameIndices[] = {237, 238, 239};
+static const int16 kAnim138FrameTicks[] = {6, 6, 6};
+static const BBRect kAnim138FrameRects[] = {{-7, -8, 16, 13}, {-7, -11, 16, 12}, {-7, -14, 16, 13}};
+static const int kAnim139FrameIndices[] = {239};
+static const int16 kAnim139FrameTicks[] = {6};
+static const BBRect kAnim139FrameRects[] = {{-7, -14, 16, 13}};
+static const int kAnim140FrameIndices[] = {240};
+static const int16 kAnim140FrameTicks[] = {6};
+static const BBRect kAnim140FrameRects[] = {{-4, -4, 11, 7}};
+static const int kAnim141FrameIndices[] = {240, 241, 242};
+static const int16 kAnim141FrameTicks[] = {6, 6, 6};
+static const BBRect kAnim141FrameRects[] = {{-4, -4, 11, 7}, {-5, -7, 12, 7}, {-5, -10, 12, 7}};
+static const int kAnim142FrameIndices[] = {242};
+static const int16 kAnim142FrameTicks[] = {6};
+static const BBRect kAnim142FrameRects[] = {{-5, -10, 12, 7}};
+static const int kAnim143FrameIndices[] = {243};
+static const int16 kAnim143FrameTicks[] = {6};
+static const BBRect kAnim143FrameRects[] = {{-5, -4, 12, 7}};
+static const int kAnim144FrameIndices[] = {243, 244, 245};
+static const int16 kAnim144FrameTicks[] = {6, 6, 6};
+static const BBRect kAnim144FrameRects[] = {{-5, -4, 12, 7}, {-5, -7, 12, 7}, {-5, -10, 11, 7}};
+static const int kAnim145FrameIndices[] = {245};
+static const int16 kAnim145FrameTicks[] = {6};
+static const BBRect kAnim145FrameRects[] = {{-5, -10, 11, 7}};
+static const int kAnim146FrameIndices[] = {246};
+static const int16 kAnim146FrameTicks[] = {6};
+static const BBRect kAnim146FrameRects[] = {{-9, -11, 19, 15}};
+static const int kAnim147FrameIndices[] = {246, 247, 248};
+static const int16 kAnim147FrameTicks[] = {6, 6, 6};
+static const BBRect kAnim147FrameRects[] = {{-9, -11, 19, 15}, {-9, -13, 19, 14}, {-9, -17, 19, 15}};
+static const int kAnim148FrameIndices[] = {248};
+static const int16 kAnim148FrameTicks[] = {6};
+static const BBRect kAnim148FrameRects[] = {{-9, -17, 19, 15}};
+static const int kAnim149FrameIndices[] = {249};
+static const int16 kAnim149FrameTicks[] = {6};
+static const BBRect kAnim149FrameRects[] = {{-9, -12, 22, 17}};
+static const int kAnim150FrameIndices[] = {249, 250, 251};
+static const int16 kAnim150FrameTicks[] = {6, 6, 6};
+static const BBRect kAnim150FrameRects[] = {{-9, -12, 22, 17}, {-9, -15, 22, 17}, {-9, -18, 22, 17}};
+static const int kAnim151FrameIndices[] = {251};
+static const int16 kAnim151FrameTicks[] = {6};
+static const BBRect kAnim151FrameRects[] = {{-9, -18, 22, 17}};
+static const int kAnim152FrameIndices[] = {252};
+static const int16 kAnim152FrameTicks[] = {6};
+static const BBRect kAnim152FrameRects[] = {{-8, -5, 18, 9}};
+static const int kAnim153FrameIndices[] = {252, 253, 254};
+static const int16 kAnim153FrameTicks[] = {6, 6, 6};
+static const BBRect kAnim153FrameRects[] = {{-8, -5, 18, 9}, {-7, -9, 17, 9}, {-8, -11, 19, 9}};
+static const int kAnim154FrameIndices[] = {254};
+static const int16 kAnim154FrameTicks[] = {6};
+static const BBRect kAnim154FrameRects[] = {{-8, -11, 19, 9}};
+static const int kAnim155FrameIndices[] = {255};
+static const int16 kAnim155FrameTicks[] = {6};
+static const BBRect kAnim155FrameRects[] = {{-8, -9, 18, 13}};
+static const int kAnim156FrameIndices[] = {255, 256, 257};
+static const int16 kAnim156FrameTicks[] = {6, 6, 6};
+static const BBRect kAnim156FrameRects[] = {{-8, -9, 18, 13}, {-8, -12, 18, 13}, {-7, -15, 17, 13}};
+static const int kAnim157FrameIndices[] = {257};
+static const int16 kAnim157FrameTicks[] = {6};
+static const BBRect kAnim157FrameRects[] = {{-7, -15, 17, 13}};
+static const int kAnim158FrameIndices[] = {258, 259, 260, 261, 262, 263};
+static const int16 kAnim158FrameTicks[] = {6, 8, 8, 8, 6, 6};
+static const BBRect kAnim158FrameRects[] = {{0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}};
+static const int kAnim159FrameIndices[] = {264, 265, 266};
+static const int16 kAnim159FrameTicks[] = {1, 1, 1};
+static const BBRect kAnim159FrameRects[] = {{-9, -8, 18, 16}, {0, 0, 0, 0}, {0, 0, 0, 0}};
+static const int kAnim160FrameIndices[] = {267};
+static const int16 kAnim160FrameTicks[] = {6};
+static const BBRect kAnim160FrameRects[] = {{-25, -83, 43, 54}};
+static const int kAnim161FrameIndices[] = {268};
+static const int16 kAnim161FrameTicks[] = {6};
+static const BBRect kAnim161FrameRects[] = {{-33, -93, 41, 60}};
+static const int kAnim162FrameIndices[] = {269};
+static const int16 kAnim162FrameTicks[] = {1};
+static const BBRect kAnim162FrameRects[] = {{0, 0, 0, 0}};
+static const int kAnim163FrameIndices[] = {270};
+static const int16 kAnim163FrameTicks[] = {5};
+static const BBRect kAnim163FrameRects[] = {{0, 0, 0, 0}};
+static const int kAnim164FrameIndices[] = {271};
+static const int16 kAnim164FrameTicks[] = {1};
+static const BBRect kAnim164FrameRects[] = {{0, 0, 0, 0}};
+static const int kAnim165FrameIndices[] = {272};
+static const int16 kAnim165FrameTicks[] = {1};
+static const BBRect kAnim165FrameRects[] = {{0, 0, 0, 0}};
+static const int kAnim166FrameIndices[] = {273};
+static const int16 kAnim166FrameTicks[] = {2};
+static const BBRect kAnim166FrameRects[] = {{0, 0, 0, 0}};
+static const int kAnim167FrameIndices[] = {274, 275, 276, 277, 278, 279, 280, 281, 282, 283, 284, 285, 286};
+static const int16 kAnim167FrameTicks[] = {6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6};
+static const BBRect kAnim167FrameRects[] = {{0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}};
+static const int kAnim168FrameIndices[] = {287};
+static const int16 kAnim168FrameTicks[] = {1};
+static const BBRect kAnim168FrameRects[] = {{0, 0, 0, 0}};
+static const int kAnim169FrameIndices[] = {288};
+static const int16 kAnim169FrameTicks[] = {6};
+static const BBRect kAnim169FrameRects[] = {{0, 0, 0, 0}};
+static const int kAnim170FrameIndices[] = {289, 290, 291, 292, 293, 294};
+static const int16 kAnim170FrameTicks[] = {6, 6, 6, 6, 6, 6};
+static const BBRect kAnim170FrameRects[] = {{-22, -91, 45, 93}, {-21, -92, 43, 95}, {-21, -92, 43, 95}, {-21, -92, 43, 95}, {-21, -92, 43, 95}, {-21, -92, 43, 95}};
+static const int kAnim171FrameIndices[] = {295, 296, 297, 298, 299, 300};
+static const int16 kAnim171FrameTicks[] = {6, 6, 6, 6, 6, 6};
+static const BBRect kAnim171FrameRects[] = {{-21, -85, 38, 86}, {-21, -85, 38, 86}, {-21, -85, 38, 86}, {-21, -85, 38, 86}, {-21, -85, 38, 86}, {-21, -85, 38, 86}};
+static const int kAnim172FrameIndices[] = {301, 302};
+static const int16 kAnim172FrameTicks[] = {6, 6};
+static const BBRect kAnim172FrameRects[] = {{-9, -9, 17, 15}, {-11, -10, 19, 16}};
+static const ObjAnimation kAnimations[] = {
+ {3, kAnim0FrameIndices, kAnim0FrameTicks, kAnim0FrameRects},
+ {3, kAnim1FrameIndices, kAnim1FrameTicks, kAnim1FrameRects},
+ {3, kAnim2FrameIndices, kAnim2FrameTicks, kAnim2FrameRects},
+ {3, kAnim3FrameIndices, kAnim3FrameTicks, kAnim3FrameRects},
+ {3, kAnim4FrameIndices, kAnim4FrameTicks, kAnim4FrameRects},
+ {3, kAnim5FrameIndices, kAnim5FrameTicks, kAnim5FrameRects},
+ {3, kAnim6FrameIndices, kAnim6FrameTicks, kAnim6FrameRects},
+ {3, kAnim7FrameIndices, kAnim7FrameTicks, kAnim7FrameRects},
+ {1, kAnim8FrameIndices, kAnim8FrameTicks, kAnim8FrameRects},
+ {1, kAnim9FrameIndices, kAnim9FrameTicks, kAnim9FrameRects},
+ {1, kAnim10FrameIndices, kAnim10FrameTicks, kAnim10FrameRects},
+ {1, kAnim11FrameIndices, kAnim11FrameTicks, kAnim11FrameRects},
+ {1, kAnim12FrameIndices, kAnim12FrameTicks, kAnim12FrameRects},
+ {1, kAnim13FrameIndices, kAnim13FrameTicks, kAnim13FrameRects},
+ {1, kAnim14FrameIndices, kAnim14FrameTicks, kAnim14FrameRects},
+ {1, kAnim15FrameIndices, kAnim15FrameTicks, kAnim15FrameRects},
+ {3, kAnim16FrameIndices, kAnim16FrameTicks, kAnim16FrameRects},
+ {3, kAnim17FrameIndices, kAnim17FrameTicks, kAnim17FrameRects},
+ {3, kAnim18FrameIndices, kAnim18FrameTicks, kAnim18FrameRects},
+ {3, kAnim19FrameIndices, kAnim19FrameTicks, kAnim19FrameRects},
+ {3, kAnim20FrameIndices, kAnim20FrameTicks, kAnim20FrameRects},
+ {3, kAnim21FrameIndices, kAnim21FrameTicks, kAnim21FrameRects},
+ {3, kAnim22FrameIndices, kAnim22FrameTicks, kAnim22FrameRects},
+ {3, kAnim23FrameIndices, kAnim23FrameTicks, kAnim23FrameRects},
+ {14, kAnim24FrameIndices, kAnim24FrameTicks, kAnim24FrameRects},
+ {14, kAnim25FrameIndices, kAnim25FrameTicks, kAnim25FrameRects},
+ {3, kAnim26FrameIndices, kAnim26FrameTicks, kAnim26FrameRects},
+ {3, kAnim27FrameIndices, kAnim27FrameTicks, kAnim27FrameRects},
+ {3, kAnim28FrameIndices, kAnim28FrameTicks, kAnim28FrameRects},
+ {3, kAnim29FrameIndices, kAnim29FrameTicks, kAnim29FrameRects},
+ {3, kAnim30FrameIndices, kAnim30FrameTicks, kAnim30FrameRects},
+ {3, kAnim31FrameIndices, kAnim31FrameTicks, kAnim31FrameRects},
+ {3, kAnim32FrameIndices, kAnim32FrameTicks, kAnim32FrameRects},
+ {3, kAnim33FrameIndices, kAnim33FrameTicks, kAnim33FrameRects},
+ {1, kAnim34FrameIndices, kAnim34FrameTicks, kAnim34FrameRects},
+ {1, kAnim35FrameIndices, kAnim35FrameTicks, kAnim35FrameRects},
+ {1, kAnim36FrameIndices, kAnim36FrameTicks, kAnim36FrameRects},
+ {1, kAnim37FrameIndices, kAnim37FrameTicks, kAnim37FrameRects},
+ {1, kAnim38FrameIndices, kAnim38FrameTicks, kAnim38FrameRects},
+ {1, kAnim39FrameIndices, kAnim39FrameTicks, kAnim39FrameRects},
+ {1, kAnim40FrameIndices, kAnim40FrameTicks, kAnim40FrameRects},
+ {1, kAnim41FrameIndices, kAnim41FrameTicks, kAnim41FrameRects},
+ {3, kAnim42FrameIndices, kAnim42FrameTicks, kAnim42FrameRects},
+ {3, kAnim43FrameIndices, kAnim43FrameTicks, kAnim43FrameRects},
+ {3, kAnim44FrameIndices, kAnim44FrameTicks, kAnim44FrameRects},
+ {3, kAnim45FrameIndices, kAnim45FrameTicks, kAnim45FrameRects},
+ {3, kAnim46FrameIndices, kAnim46FrameTicks, kAnim46FrameRects},
+ {3, kAnim47FrameIndices, kAnim47FrameTicks, kAnim47FrameRects},
+ {3, kAnim48FrameIndices, kAnim48FrameTicks, kAnim48FrameRects},
+ {3, kAnim49FrameIndices, kAnim49FrameTicks, kAnim49FrameRects},
+ {14, kAnim50FrameIndices, kAnim50FrameTicks, kAnim50FrameRects},
+ {14, kAnim51FrameIndices, kAnim51FrameTicks, kAnim51FrameRects},
+ {3, kAnim52FrameIndices, kAnim52FrameTicks, kAnim52FrameRects},
+ {3, kAnim53FrameIndices, kAnim53FrameTicks, kAnim53FrameRects},
+ {3, kAnim54FrameIndices, kAnim54FrameTicks, kAnim54FrameRects},
+ {3, kAnim55FrameIndices, kAnim55FrameTicks, kAnim55FrameRects},
+ {3, kAnim56FrameIndices, kAnim56FrameTicks, kAnim56FrameRects},
+ {3, kAnim57FrameIndices, kAnim57FrameTicks, kAnim57FrameRects},
+ {3, kAnim58FrameIndices, kAnim58FrameTicks, kAnim58FrameRects},
+ {3, kAnim59FrameIndices, kAnim59FrameTicks, kAnim59FrameRects},
+ {1, kAnim60FrameIndices, kAnim60FrameTicks, kAnim60FrameRects},
+ {1, kAnim61FrameIndices, kAnim61FrameTicks, kAnim61FrameRects},
+ {1, kAnim62FrameIndices, kAnim62FrameTicks, kAnim62FrameRects},
+ {1, kAnim63FrameIndices, kAnim63FrameTicks, kAnim63FrameRects},
+ {1, kAnim64FrameIndices, kAnim64FrameTicks, kAnim64FrameRects},
+ {1, kAnim65FrameIndices, kAnim65FrameTicks, kAnim65FrameRects},
+ {1, kAnim66FrameIndices, kAnim66FrameTicks, kAnim66FrameRects},
+ {1, kAnim67FrameIndices, kAnim67FrameTicks, kAnim67FrameRects},
+ {3, kAnim68FrameIndices, kAnim68FrameTicks, kAnim68FrameRects},
+ {3, kAnim69FrameIndices, kAnim69FrameTicks, kAnim69FrameRects},
+ {3, kAnim70FrameIndices, kAnim70FrameTicks, kAnim70FrameRects},
+ {3, kAnim71FrameIndices, kAnim71FrameTicks, kAnim71FrameRects},
+ {3, kAnim72FrameIndices, kAnim72FrameTicks, kAnim72FrameRects},
+ {3, kAnim73FrameIndices, kAnim73FrameTicks, kAnim73FrameRects},
+ {3, kAnim74FrameIndices, kAnim74FrameTicks, kAnim74FrameRects},
+ {3, kAnim75FrameIndices, kAnim75FrameTicks, kAnim75FrameRects},
+ {14, kAnim76FrameIndices, kAnim76FrameTicks, kAnim76FrameRects},
+ {14, kAnim77FrameIndices, kAnim77FrameTicks, kAnim77FrameRects},
+ {3, kAnim78FrameIndices, kAnim78FrameTicks, kAnim78FrameRects},
+ {3, kAnim79FrameIndices, kAnim79FrameTicks, kAnim79FrameRects},
+ {3, kAnim80FrameIndices, kAnim80FrameTicks, kAnim80FrameRects},
+ {3, kAnim81FrameIndices, kAnim81FrameTicks, kAnim81FrameRects},
+ {3, kAnim82FrameIndices, kAnim82FrameTicks, kAnim82FrameRects},
+ {3, kAnim83FrameIndices, kAnim83FrameTicks, kAnim83FrameRects},
+ {3, kAnim84FrameIndices, kAnim84FrameTicks, kAnim84FrameRects},
+ {3, kAnim85FrameIndices, kAnim85FrameTicks, kAnim85FrameRects},
+ {1, kAnim86FrameIndices, kAnim86FrameTicks, kAnim86FrameRects},
+ {1, kAnim87FrameIndices, kAnim87FrameTicks, kAnim87FrameRects},
+ {1, kAnim88FrameIndices, kAnim88FrameTicks, kAnim88FrameRects},
+ {1, kAnim89FrameIndices, kAnim89FrameTicks, kAnim89FrameRects},
+ {1, kAnim90FrameIndices, kAnim90FrameTicks, kAnim90FrameRects},
+ {1, kAnim91FrameIndices, kAnim91FrameTicks, kAnim91FrameRects},
+ {1, kAnim92FrameIndices, kAnim92FrameTicks, kAnim92FrameRects},
+ {1, kAnim93FrameIndices, kAnim93FrameTicks, kAnim93FrameRects},
+ {3, kAnim94FrameIndices, kAnim94FrameTicks, kAnim94FrameRects},
+ {3, kAnim95FrameIndices, kAnim95FrameTicks, kAnim95FrameRects},
+ {3, kAnim96FrameIndices, kAnim96FrameTicks, kAnim96FrameRects},
+ {3, kAnim97FrameIndices, kAnim97FrameTicks, kAnim97FrameRects},
+ {3, kAnim98FrameIndices, kAnim98FrameTicks, kAnim98FrameRects},
+ {3, kAnim99FrameIndices, kAnim99FrameTicks, kAnim99FrameRects},
+ {3, kAnim100FrameIndices, kAnim100FrameTicks, kAnim100FrameRects},
+ {3, kAnim101FrameIndices, kAnim101FrameTicks, kAnim101FrameRects},
+ {14, kAnim102FrameIndices, kAnim102FrameTicks, kAnim102FrameRects},
+ {14, kAnim103FrameIndices, kAnim103FrameTicks, kAnim103FrameRects},
+ {3, kAnim104FrameIndices, kAnim104FrameTicks, kAnim104FrameRects},
+ {3, kAnim105FrameIndices, kAnim105FrameTicks, kAnim105FrameRects},
+ {3, kAnim106FrameIndices, kAnim106FrameTicks, kAnim106FrameRects},
+ {3, kAnim107FrameIndices, kAnim107FrameTicks, kAnim107FrameRects},
+ {3, kAnim108FrameIndices, kAnim108FrameTicks, kAnim108FrameRects},
+ {3, kAnim109FrameIndices, kAnim109FrameTicks, kAnim109FrameRects},
+ {3, kAnim110FrameIndices, kAnim110FrameTicks, kAnim110FrameRects},
+ {3, kAnim111FrameIndices, kAnim111FrameTicks, kAnim111FrameRects},
+ {1, kAnim112FrameIndices, kAnim112FrameTicks, kAnim112FrameRects},
+ {1, kAnim113FrameIndices, kAnim113FrameTicks, kAnim113FrameRects},
+ {1, kAnim114FrameIndices, kAnim114FrameTicks, kAnim114FrameRects},
+ {1, kAnim115FrameIndices, kAnim115FrameTicks, kAnim115FrameRects},
+ {1, kAnim116FrameIndices, kAnim116FrameTicks, kAnim116FrameRects},
+ {1, kAnim117FrameIndices, kAnim117FrameTicks, kAnim117FrameRects},
+ {1, kAnim118FrameIndices, kAnim118FrameTicks, kAnim118FrameRects},
+ {1, kAnim119FrameIndices, kAnim119FrameTicks, kAnim119FrameRects},
+ {3, kAnim120FrameIndices, kAnim120FrameTicks, kAnim120FrameRects},
+ {3, kAnim121FrameIndices, kAnim121FrameTicks, kAnim121FrameRects},
+ {3, kAnim122FrameIndices, kAnim122FrameTicks, kAnim122FrameRects},
+ {3, kAnim123FrameIndices, kAnim123FrameTicks, kAnim123FrameRects},
+ {3, kAnim124FrameIndices, kAnim124FrameTicks, kAnim124FrameRects},
+ {3, kAnim125FrameIndices, kAnim125FrameTicks, kAnim125FrameRects},
+ {3, kAnim126FrameIndices, kAnim126FrameTicks, kAnim126FrameRects},
+ {3, kAnim127FrameIndices, kAnim127FrameTicks, kAnim127FrameRects},
+ {14, kAnim128FrameIndices, kAnim128FrameTicks, kAnim128FrameRects},
+ {14, kAnim129FrameIndices, kAnim129FrameTicks, kAnim129FrameRects},
+ {1, kAnim130FrameIndices, kAnim130FrameTicks, kAnim130FrameRects},
+ {1, kAnim131FrameIndices, kAnim131FrameTicks, kAnim131FrameRects},
+ {3, kAnim132FrameIndices, kAnim132FrameTicks, kAnim132FrameRects},
+ {1, kAnim133FrameIndices, kAnim133FrameTicks, kAnim133FrameRects},
+ {1, kAnim134FrameIndices, kAnim134FrameTicks, kAnim134FrameRects},
+ {3, kAnim135FrameIndices, kAnim135FrameTicks, kAnim135FrameRects},
+ {1, kAnim136FrameIndices, kAnim136FrameTicks, kAnim136FrameRects},
+ {1, kAnim137FrameIndices, kAnim137FrameTicks, kAnim137FrameRects},
+ {3, kAnim138FrameIndices, kAnim138FrameTicks, kAnim138FrameRects},
+ {1, kAnim139FrameIndices, kAnim139FrameTicks, kAnim139FrameRects},
+ {1, kAnim140FrameIndices, kAnim140FrameTicks, kAnim140FrameRects},
+ {3, kAnim141FrameIndices, kAnim141FrameTicks, kAnim141FrameRects},
+ {1, kAnim142FrameIndices, kAnim142FrameTicks, kAnim142FrameRects},
+ {1, kAnim143FrameIndices, kAnim143FrameTicks, kAnim143FrameRects},
+ {3, kAnim144FrameIndices, kAnim144FrameTicks, kAnim144FrameRects},
+ {1, kAnim145FrameIndices, kAnim145FrameTicks, kAnim145FrameRects},
+ {1, kAnim146FrameIndices, kAnim146FrameTicks, kAnim146FrameRects},
+ {3, kAnim147FrameIndices, kAnim147FrameTicks, kAnim147FrameRects},
+ {1, kAnim148FrameIndices, kAnim148FrameTicks, kAnim148FrameRects},
+ {1, kAnim149FrameIndices, kAnim149FrameTicks, kAnim149FrameRects},
+ {3, kAnim150FrameIndices, kAnim150FrameTicks, kAnim150FrameRects},
+ {1, kAnim151FrameIndices, kAnim151FrameTicks, kAnim151FrameRects},
+ {1, kAnim152FrameIndices, kAnim152FrameTicks, kAnim152FrameRects},
+ {3, kAnim153FrameIndices, kAnim153FrameTicks, kAnim153FrameRects},
+ {1, kAnim154FrameIndices, kAnim154FrameTicks, kAnim154FrameRects},
+ {1, kAnim155FrameIndices, kAnim155FrameTicks, kAnim155FrameRects},
+ {3, kAnim156FrameIndices, kAnim156FrameTicks, kAnim156FrameRects},
+ {1, kAnim157FrameIndices, kAnim157FrameTicks, kAnim157FrameRects},
+ {6, kAnim158FrameIndices, kAnim158FrameTicks, kAnim158FrameRects},
+ {3, kAnim159FrameIndices, kAnim159FrameTicks, kAnim159FrameRects},
+ {1, kAnim160FrameIndices, kAnim160FrameTicks, kAnim160FrameRects},
+ {1, kAnim161FrameIndices, kAnim161FrameTicks, kAnim161FrameRects},
+ {1, kAnim162FrameIndices, kAnim162FrameTicks, kAnim162FrameRects},
+ {1, kAnim163FrameIndices, kAnim163FrameTicks, kAnim163FrameRects},
+ {1, kAnim164FrameIndices, kAnim164FrameTicks, kAnim164FrameRects},
+ {1, kAnim165FrameIndices, kAnim165FrameTicks, kAnim165FrameRects},
+ {1, kAnim166FrameIndices, kAnim166FrameTicks, kAnim166FrameRects},
+ {13, kAnim167FrameIndices, kAnim167FrameTicks, kAnim167FrameRects},
+ {1, kAnim168FrameIndices, kAnim168FrameTicks, kAnim168FrameRects},
+ {1, kAnim169FrameIndices, kAnim169FrameTicks, kAnim169FrameRects},
+ {6, kAnim170FrameIndices, kAnim170FrameTicks, kAnim170FrameRects},
+ {6, kAnim171FrameIndices, kAnim171FrameTicks, kAnim171FrameRects},
+ {2, kAnim172FrameIndices, kAnim172FrameTicks, kAnim172FrameRects}
+};
+
+static const MinigameBbAnt::ObjInit kObjInits[] = {
+ {&kAnimations[131], &kAnimations[132], &kAnimations[133], 160, 120},
+ {&kAnimations[134], &kAnimations[135], &kAnimations[136], 155, 130},
+ {&kAnimations[137], &kAnimations[138], &kAnimations[139], 150, 100},
+ {&kAnimations[140], &kAnimations[141], &kAnimations[142], 195, 150},
+ {&kAnimations[143], &kAnimations[144], &kAnimations[145], 120, 110},
+ {&kAnimations[146], &kAnimations[147], &kAnimations[148], 170, 170},
+ {&kAnimations[149], &kAnimations[150], &kAnimations[151], 175, 95},
+ {&kAnimations[152], &kAnimations[153], &kAnimations[154], 145, 165},
+ {&kAnimations[155], &kAnimations[156], &kAnimations[157], 110, 175}
+};
+static const ObjAnimation * const kAnimationsTbl[] = {&kAnimations[0], &kAnimations[1], &kAnimations[2], &kAnimations[3], &kAnimations[4], &kAnimations[5], &kAnimations[6], &kAnimations[7], &kAnimations[16], &kAnimations[17], &kAnimations[18], &kAnimations[19], &kAnimations[20], &kAnimations[21], &kAnimations[22], &kAnimations[23], &kAnimations[24], &kAnimations[25], &kAnimations[26], &kAnimations[27], &kAnimations[28], &kAnimations[29], &kAnimations[30], &kAnimations[31], &kAnimations[32], &kAnimations[33], &kAnimations[42], &kAnimations[43], &kAnimations[44], &kAnimations[45], &kAnimations[46], &kAnimations[47], &kAnimations[48], &kAnimations[49], &kAnimations[50], &kAnimations[51], &kAnimations[52], &kAnimations[53], &kAnimations[54], &kAnimations[55], &kAnimations[56], &kAnimations[57], &kAnimations[58], &kAnimations[59], &kAnimations[68], &kAnimations[69], &kAnimations[70], &kAnimations[71], &kAnimations[72], &kAnimations[73], &kAnimations[74], &kAnimations[75], &kAnimations[76], &kAnimations[77], &kAnimations[78], &kAnimations[79], &kAnimations[80], &kAnimations[81], &kAnimations[82], &kAnimations[83], &kAnimations[84], &kAnimations[85], &kAnimations[94], &kAnimations[95], &kAnimations[96], &kAnimations[97], &kAnimations[98], &kAnimations[99], &kAnimations[100], &kAnimations[101], &kAnimations[102], &kAnimations[103], &kAnimations[104], &kAnimations[105], &kAnimations[106], &kAnimations[107], &kAnimations[108], &kAnimations[109], &kAnimations[110], &kAnimations[111], &kAnimations[120], &kAnimations[121], &kAnimations[122], &kAnimations[123], &kAnimations[124], &kAnimations[125], &kAnimations[126], &kAnimations[127], &kAnimations[128], &kAnimations[129]};
+
+static const ObjAnimation * const * const kObjKindAnimTables[] = {
+ 0, &kAnimationsTbl[0],
+ &kAnimationsTbl[18], &kAnimationsTbl[36],
+ &kAnimationsTbl[54], &kAnimationsTbl[72]
+};
+
+const ObjAnimation *MinigameBbAnt::getAnimation(int animIndex) {
+ return &kAnimations[animIndex];
+}
+
+const MinigameBbAnt::ObjInit *MinigameBbAnt::getObjInit(int index) {
+ return &kObjInits[index];
+}
+
+const ObjAnimation * const *MinigameBbAnt::getObjKindAnimTable(int kind) {
+ return kObjKindAnimTables[kind];
+}
+
+const ObjAnimation *MinigameBbAnt::getObjAnim(int index) {
+ return kAnimationsTbl[index];
+}
+
+} // End of namespace Bbvs
diff --git a/engines/bbvs/minigames/bbloogie.cpp b/engines/bbvs/minigames/bbloogie.cpp
new file mode 100644
index 0000000000..4601e9ff93
--- /dev/null
+++ b/engines/bbvs/minigames/bbloogie.cpp
@@ -0,0 +1,1353 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+
+ * You should have received a copy of the GNU General Public 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 "bbvs/minigames/bbloogie.h"
+
+namespace Bbvs {
+
+static const int kLoogieOffY[16] = {
+ 0, 1, 1, 2, 2, 3, 3, 4,
+ 4, 5, 5, 6, 6, 7, 7, 0
+};
+
+static const int kSquirrelOffX[] = {
+ -43, -43, -38, -33, -33, -27, -23, -23,
+ -23, -23, -23, -23, -18, -14, -8, -4,
+ 2, 8, 12, 18, 20, 20, 26, 31,
+ 37, 37, 37, 37, 37, 37, 37, 32,
+ 29, 26, 21, 14, 10, 6, 6, 6,
+ 6, 6, 6, 6, 0, -6, -15, -20,
+ -27, -37, -41, -41, -41, -41
+};
+
+static const int kPlaneOffX[] = {
+ 0, -1, -1, -1, 0, 1, 1, 1
+};
+
+static const int kPlaneOffY[] = {
+ -1, -1, 0, 1, 1, 1, 0, -1
+};
+
+static const int kLevelScores[] = {
+ 20, 50, 90, 140, 200, 270, 350, 440, 540, 10000
+};
+
+static const int kLevelTimes[] = {
+ 120, 110, 100, 90, 80, 70, 60, 50, 40, 30
+};
+
+static const uint kBeavisSounds1[] = {
+ 14, 15, 19, 20, 22, 23, 24, 26
+};
+
+static const uint kButtheadSounds1[] = {
+ 16, 14, 15, 22, 23
+};
+
+static const uint kBeavisSounds2[] = {
+ 9, 3, 4, 5, 7, 14, 15, 19, 20, 22, 23, 24, 26
+};
+
+static const uint kButtheadSounds2[] = {
+ 9, 3, 4, 5, 7, 16, 14, 15, 22, 23
+};
+
+static const uint kPrincipalSounds[] = {
+ 3, 4, 5, 7
+};
+
+static const char * const kSoundFilenames[] = {
+ "loog1.aif", "loog2.aif", "loog3.aif", "loog4.aif", "loog5.aif",
+ "loog6.aif", "loog7.aif", "loog8.aif", "loog9.aif", "loog10.aif",
+ "loog11.aif", "loog12.aif", "loog13.aif", "loog14.aif", "loog15.aif",
+ "loog16.aif", "loog17.aif", "loog18.aif", "loog19.aif", "loog20.aif",
+ "loog21.aif", "loog22.aif", "loog23.aif", "loog24.aif", "loog25.aif",
+ "loog26.aif", "loog27.aif", "meghoker.aif", "spit1.aif", "megaloog.aif",
+ "megaspit.aif", "gamemuse.aif", "bing.aif", "carhit.aif", "bikehit.aif",
+ "squirhit.aif", "planehit.aif", "bing2.aif"
+};
+
+static const uint kSoundFilenamesCount = ARRAYSIZE(kSoundFilenames);
+
+void MinigameBbLoogie::buildDrawList(DrawList &drawList) {
+ switch (_gameState) {
+ case kGSTitleScreen:
+ buildDrawList0(drawList);
+ break;
+ case kGSMainGame:
+ buildDrawList1(drawList);
+ break;
+ case kGSStandaloneGame:
+ buildDrawList2(drawList);
+ break;
+ case kGSScoreCountUp:
+ buildDrawList3(drawList);
+ break;
+ }
+}
+
+void MinigameBbLoogie::buildDrawList0(DrawList &drawList) {
+ drawList.add(_objects[0].anim->frameIndices[_objects[0].frameIndex], _objects[0].x, _objects[0].y, 2000);
+ for (int i = 1; i < kMaxObjectsCount; ++i) {
+ Obj *obj = &_objects[i];
+ if (obj->kind != 0)
+ drawList.add(obj->anim->frameIndices[obj->frameIndex], obj->x, obj->y, obj->y + 16);
+ }
+ if (_titleScreenSpriteIndex)
+ drawList.add(_titleScreenSpriteIndex, 0, 0, 0);
+}
+
+void MinigameBbLoogie::buildDrawList1(DrawList &drawList) {
+
+ for (int i = 0; i < kMaxObjectsCount; ++i) {
+ Obj *obj = &_objects[i];
+ switch (obj->kind) {
+ case 0:
+ // Empty object
+ break;
+ case 2:
+ drawList.add(obj->anim->frameIndices[obj->frameIndex], obj->x, obj->y, 400);
+ break;
+ case 3:
+ drawList.add(obj->anim->frameIndices[obj->frameIndex + obj->frameIndexAdd], obj->x, obj->y, 1000);
+ break;
+ case 7:
+ drawList.add(obj->anim->frameIndices[obj->frameIndex], obj->x, obj->y, 390);
+ break;
+ case 8:
+ drawList.add(obj->anim->frameIndices[obj->frameIndex], obj->x, obj->y, 1000);
+ break;
+ default:
+ drawList.add(obj->anim->frameIndices[obj->frameIndex], obj->x, obj->y, obj->y + 16);
+ break;
+ }
+ }
+
+ if (_backgroundSpriteIndex)
+ drawList.add(_backgroundSpriteIndex, 0, 0, 0);
+
+ if (_fromMainGame) {
+ drawList.add(getAnimation(8)->frameIndices[0], 8, 2, 2000);
+ drawNumber(drawList, _numberOfHits, 56, 16);
+ } else {
+ drawList.add(getAnimation(10)->frameIndices[0], 230, 2, 2000);
+ drawNumber(drawList, _levelTimeLeft, 280, 16);
+ drawList.add(getAnimation(15)->frameIndices[0], 5, 2, 2000);
+ int numberX2 = drawNumber(drawList, _currScore, 68, 16);
+ drawList.add(getAnimation(9)->frameIndices[10], numberX2, 16, 2000);
+ drawNumber(drawList, _dispLevelScore, numberX2 + 10, 16);
+ }
+
+ for (int i = 0; i < _megaLoogieCount; ++i)
+ drawList.add(getAnimation(19)->frameIndices[0], 20 + i * 25, 236, 2000);
+
+}
+
+void MinigameBbLoogie::buildDrawList2(DrawList &drawList) {
+
+ buildDrawList1(drawList);
+
+ if (_level > 0 && (_bonusDisplayDelay1 > 0 || _bonusDisplayDelay2 > 0)) {
+ drawList.add(getAnimation(12)->frameIndices[0], 100, 80, 2000);
+ drawNumber(drawList, _timeBonusCtr, 212, 94);
+ }
+
+ if (_bonusDisplayDelay3 > 0) {
+ drawList.add(getAnimation(14)->frameIndices[0], 65, 80, 2000);
+ int numberX2 = drawNumber(drawList, _nextLevelScore, 170, 92);
+ drawList.add(getAnimation(11)->frameIndices[0], numberX2, 80, 2000);
+ }
+
+}
+
+void MinigameBbLoogie::buildDrawList3(DrawList &drawList) {
+
+ for (int i = 0; i < kMaxObjectsCount; ++i) {
+ Obj *obj = &_objects[i];
+ if (obj->kind == 2)
+ drawList.add(obj->anim->frameIndices[obj->frameIndex], obj->x, obj->y, 400);
+ else
+ drawList.add(obj->anim->frameIndices[obj->frameIndex], obj->x, obj->y, obj->y + 16);
+ }
+
+ if (_backgroundSpriteIndex)
+ drawList.add(_backgroundSpriteIndex, 0, 0, 0);
+
+ drawList.add(getAnimation(10)->frameIndices[0], 230, 2, 2000);
+
+ drawNumber(drawList, _levelTimeLeft, 280, 16);
+
+ drawList.add(getAnimation(15)->frameIndices[0], 5, 2, 2000);
+
+ int numberX2 = drawNumber(drawList, _currScore, 68, 16);
+ drawList.add(getAnimation(9)->frameIndices[10], numberX2, 16, 2000);
+ drawNumber(drawList, _dispLevelScore, numberX2 + 10, 16);
+
+ drawList.add(getAnimation(20)->frameIndices[0], 120, 70, 2000);
+ drawList.add(getAnimation(13)->frameIndices[0], 95, 95, 2000);
+
+ drawNumber(drawList, _hiScore, 210, 109);
+
+}
+
+void MinigameBbLoogie::drawSprites() {
+ DrawList drawList;
+ buildDrawList(drawList);
+ _vm->_screen->drawDrawList(drawList, _spriteModule);
+ _vm->_screen->copyToScreen();
+}
+
+void MinigameBbLoogie::initObjs() {
+ for (int i = 0; i < kMaxObjectsCount; ++i)
+ _objects[i].kind = 0;
+}
+
+MinigameBbLoogie::Obj *MinigameBbLoogie::getFreeObject() {
+ for (int i = 0; i < kMaxObjectsCount; ++i)
+ if (_objects[i].kind == 0)
+ return &_objects[i];
+ return 0;
+}
+
+MinigameBbLoogie::Obj *MinigameBbLoogie::findLoogieObj(int startObjIndex) {
+ for (int i = startObjIndex; i < kMaxObjectsCount; ++i)
+ if (_objects[i].kind == 3)
+ return &_objects[i];
+ return 0;
+}
+
+bool MinigameBbLoogie::isHit(Obj *obj1, Obj *obj2) {
+ const BBRect &frameRect1 = obj1->anim->frameRects[obj1->frameIndex];
+ const BBRect &frameRect2 = obj2->anim->frameRects[obj2->frameIndex];
+ const int obj1X1 = obj1->x + frameRect1.x;
+ const int obj1Y1 = obj1->y + frameRect1.y;
+ const int obj1X2 = obj1X1 + frameRect1.width;
+ const int obj1Y2 = obj1Y1 + frameRect1.height;
+ const int obj2X1 = obj2->x + frameRect2.x;
+ const int obj2Y1 = obj2->y + frameRect2.y;
+ const int obj2X2 = obj2X1 + frameRect2.width;
+ const int obj2Y2 = obj2Y1 + frameRect2.height;
+ return obj1X1 <= obj2X2 && obj1X2 >= obj2X1 && obj1Y1 <= obj2Y2 && obj1Y2 >= obj2Y1;
+}
+
+bool MinigameBbLoogie::isCursorAtObj(int objIndex) {
+ return isHit(&_objects[0], &_objects[objIndex]);
+}
+
+void MinigameBbLoogie::initObjects() {
+ switch (_gameState) {
+ case kGSTitleScreen:
+ initObjects0();
+ break;
+ case kGSMainGame:
+ initObjects1();
+ break;
+ case kGSStandaloneGame:
+ // Nothing
+ break;
+ case kGSScoreCountUp:
+ initObjects3();
+ break;
+ }
+}
+
+void MinigameBbLoogie::initObjects0() {
+ initObjs();
+ _objects[0].anim = getAnimation(25);
+ _objects[0].frameIndex = 0;
+ _objects[0].ticks = getAnimation(25)->frameTicks[0];
+ _objects[0].x = 160;
+ _objects[0].y = 120;
+ _objects[0].kind = 1;
+ _objects[1].anim = getAnimation(21);
+ _objects[1].frameIndex = 0;
+ _objects[1].ticks = getAnimation(21)->frameTicks[0];
+ _objects[1].x = 40;
+ _objects[1].y = 240;
+ _objects[1].kind = 1;
+ _objects[2].anim = getAnimation(23);
+ _objects[2].frameIndex = 0;
+ _objects[2].ticks = getAnimation(23)->frameTicks[0];
+ _objects[2].x = 280;
+ _objects[2].y = 240;
+ _objects[2].kind = 1;
+ _objects[3].anim = getAnimation(22);
+ _objects[3].frameIndex = 0;
+ _objects[3].ticks = getAnimation(22)->frameTicks[0];
+ _objects[3].x = 40;
+ _objects[3].y = 240;
+ _objects[3].kind = 0;
+ _objects[4].anim = getAnimation(24);
+ _objects[4].frameIndex = 0;
+ _objects[4].ticks = getAnimation(24)->frameTicks[0];
+ _objects[4].x = 280;
+ _objects[4].y = 240;
+ _objects[4].kind = 0;
+}
+
+void MinigameBbLoogie::initObjects1() {
+ initObjs();
+ _objects[0].anim = _playerAnim;
+ _objects[0].frameIndex = 0;
+ _objects[0].ticks = _playerAnim->frameTicks[0];
+ _objects[0].status = 0;
+ _objects[0].x = 160;
+ _objects[0].y = 240;
+ _objects[0].kind = 1;
+ _objects[1].anim = getAnimation(4);
+ _objects[1].frameIndex = 0;
+ _objects[1].ticks = getAnimation(4)->frameTicks[0];
+ _objects[1].x = 248;
+ _objects[1].y = 24;
+ _objects[1].kind = 2;
+}
+
+void MinigameBbLoogie::initObjects3() {
+ initObjs();
+ _objects[0].anim = _playerAnim;
+ _objects[0].frameIndex = 0;
+ _objects[0].ticks = _playerAnim->frameTicks[0];
+ _objects[0].status = 0;
+ _objects[0].kind = 1;
+ _objects[1].anim = getAnimation(4);
+ _objects[1].frameIndex = 0;
+ _objects[1].ticks = getAnimation(4)->frameTicks[0];
+ _objects[1].x = 248;
+ _objects[1].y = 24;
+ _objects[1].kind = 2;
+}
+
+void MinigameBbLoogie::initVars() {
+ switch (_gameState) {
+ case kGSTitleScreen:
+ initVars0();
+ break;
+ case kGSMainGame:
+ initVars1();
+ break;
+ case kGSStandaloneGame:
+ initVars2();
+ break;
+ case kGSScoreCountUp:
+ initVars3();
+ break;
+ }
+}
+
+void MinigameBbLoogie::initVars0() {
+ _carDelay = 120;
+ _bikeDelay = 250;
+ _squirrelDelay = 40;
+ _paperPlaneDelay = 400; // Uninitialized in the original
+ _principalDelay = 1750;
+ _levelTimeDelay = 58;
+ _principalAngry = false;
+ _squirrelDirection = false;
+ _numberOfHits = 0;
+ _megaLoogieCount = 0;
+ _level = 0;
+ _levelTimeLeft = 0;
+ _currScore = 0;
+ _dispLevelScore = 0;
+}
+
+void MinigameBbLoogie::initVars1() {
+ _carDelay = 120;
+ _bikeDelay = 250;
+ _squirrelDelay = 40;
+ _paperPlaneDelay = 400; // Uninitialized in the original
+ _principalDelay = 1750;
+ _squirrelDirection = false;
+ _numberOfHits = 0;
+ _megaLoogieCount = 0;
+}
+
+void MinigameBbLoogie::initVars2() {
+ _timeBonusCtr = _levelTimeLeft;
+ _levelTimeDelay = 58;
+ _bonusDisplayDelay1 = 60;
+ _levelTimeLeft = kLevelTimes[_level];
+ _nextLevelScore = kLevelScores[_level] + _currScore;
+ _bonusDisplayDelay2 = 0;
+ _bonusDisplayDelay3 = 0;
+}
+
+void MinigameBbLoogie::initVars3() {
+ if (_currScore > _hiScore)
+ _hiScore = _currScore;
+ if (_playerKind) {
+ playSound(11);
+ } else {
+ playSound(21);
+ }
+}
+
+bool MinigameBbLoogie::updateStatus(int mouseX, int mouseY, uint mouseButtons) {
+ switch (_gameState) {
+ case kGSTitleScreen:
+ return updateStatus0(mouseX, mouseY, mouseButtons);
+ case kGSMainGame:
+ return updateStatus1(mouseX, mouseY, mouseButtons);
+ case kGSStandaloneGame:
+ return updateStatus2(mouseX, mouseY, mouseButtons);
+ case kGSScoreCountUp:
+ return updateStatus3(mouseX, mouseY, mouseButtons);
+ }
+ return false;
+}
+
+bool MinigameBbLoogie::updateStatus0(int mouseX, int mouseY, uint mouseButtons) {
+
+ _objects[0].x = mouseX;
+ _objects[0].y = mouseY;
+
+ if (_objects[1].kind != 0 && isCursorAtObj(1)) {
+ _objects[0].frameIndex = 1;
+ _objects[1].kind = 0;
+ _objects[3].kind = 11;
+ _objects[3].frameIndex = 0;
+ _objects[3].ticks = _objects[3].anim->frameTicks[0];
+ } else if (!isCursorAtObj(3)) {
+ if (_objects[4].kind == 0)
+ _objects[0].frameIndex = 0;
+ _objects[3].kind = 0;
+ _objects[1].kind = 1;
+ }
+
+ if (_objects[2].kind && isCursorAtObj(2)) {
+ _objects[0].frameIndex = 1;
+ _objects[2].kind = 0;
+ _objects[4].kind = 11;
+ _objects[4].frameIndex = 0;
+ _objects[4].ticks = _objects[4].anim->frameTicks[0];
+ } else if (!isCursorAtObj(4)) {
+ if (_objects[3].kind == 0)
+ _objects[0].frameIndex = 0;
+ _objects[4].kind = 0;
+ _objects[2].kind = 1;
+ }
+
+ for (int i = 0; i < kMaxObjectsCount; ++i) {
+ Obj *obj = &_objects[i];
+ if (obj->kind == 11) {
+ if (--obj->ticks == 0) {
+ ++obj->frameIndex;
+ if (obj->frameIndex >= obj->anim->frameCount)
+ obj->frameIndex = 0;
+ obj->ticks = obj->anim->frameTicks[obj->frameIndex];
+ }
+ }
+ }
+
+ if ((mouseButtons & kLeftButtonDown) &&
+ (_objects[3].kind != 0 || _objects[4].kind != 0)) {
+ if (_objects[4].kind != 0) {
+ // Beavis
+ _playerKind = 0;
+ _playerAnim = getAnimation(0);
+ _playerSounds1 = kBeavisSounds1;
+ _playerSounds1Count = 8;
+ _playerSounds2 = kBeavisSounds2;
+ _playerSounds2Count = 13;
+ playSound(15);
+ while (isSoundPlaying(15)) { }
+ } else {
+ // Butt-head
+ _playerKind = 1;
+ _playerAnim = getAnimation(1);
+ _playerSounds1 = kButtheadSounds1;
+ _playerSounds1Count = 5;
+ _playerSounds2 = kButtheadSounds2;
+ _playerSounds2Count = 10;
+ playSound(23);
+ while (isSoundPlaying(23)) { }
+ }
+ _gameState = _fromMainGame ? kGSMainGame : kGSStandaloneGame;
+ initObjects1();
+ initObjects();
+ initVars();
+ _gameTicks = 0;
+ }
+
+ return true;
+}
+
+bool MinigameBbLoogie::updateStatus1(int mouseX, int mouseY, uint mouseButtons) {
+
+ if (--_levelTimeDelay == 0) {
+ _levelTimeDelay = 58;
+ --_levelTimeLeft;
+ }
+
+ if (!_fromMainGame && _levelTimeLeft == 0) {
+ _gameState = kGSScoreCountUp;
+ initObjects();
+ initVars();
+ } else if (_fromMainGame || _currScore < _nextLevelScore) {
+ _objects->x = CLIP(mouseX, 0, 319);
+ _objects->y = 240;
+ if (!_principalAngry &&
+ ((mouseButtons & kLeftButtonDown) || ((mouseButtons & kRightButtonDown) && _megaLoogieCount)) &&
+ _objects[0].status == 0 && mouseX != 32512 && mouseY != 32512) {
+ _objects[0].ticks = _playerAnim->frameTicks[13];
+ _objects[0].frameIndex = 14;
+ _objects[0].status = 1;
+ _objects[0].unk2 = 0;
+ Obj *newObj = getFreeObject();
+ newObj->anim = getAnimation(17);
+ newObj->frameIndex = 0;
+ newObj->ticks = 1;
+ newObj->x = 0;
+ newObj->y = 140;
+ newObj->kind = 8;
+ if (mouseButtons & kLeftButtonDown) {
+ _doubleScore = 0;
+ playSound(28);
+ } else {
+ _doubleScore = 17;
+ playSound(30);
+ }
+ }
+ updateObjs(mouseButtons);
+ } else {
+ _gameState = kGSStandaloneGame;
+ ++_level;
+ initObjects();
+ initVars();
+ }
+ return true;
+}
+
+bool MinigameBbLoogie::updateStatus2(int mouseX, int mouseY, uint mouseButtons) {
+
+ _objects[0].x = mouseX;
+
+ if (_bonusDisplayDelay1 > 0) {
+ if (--_bonusDisplayDelay1 == 0) {
+ _bonusDisplayDelay2 = 60;
+ if (_timeBonusCtr)
+ playSound(33, true);
+ }
+ } else if (_bonusDisplayDelay2 > 0) {
+ if (--_bonusDisplayDelay2 == 0) {
+ _bonusDisplayDelay3 = 150;
+ playSound(38);
+ } else if (_timeBonusCtr > 0) {
+ ++_bonusDisplayDelay2;
+ ++_levelTimeLeft;
+ if (--_timeBonusCtr == 0)
+ stopSound(33);
+ }
+ } else if (_bonusDisplayDelay3 > 0) {
+ if ((mouseButtons & kAnyButtonDown) || (--_bonusDisplayDelay3 == 0)) {
+ _dispLevelScore = _nextLevelScore;
+ _gameState = kGSMainGame;
+ _gameTicks = 0;
+ }
+ }
+ return true;
+}
+
+bool MinigameBbLoogie::updateStatus3(int mouseX, int mouseY, uint mouseButtons) {
+
+ _objects[0].x = mouseX;
+
+ for (int i = 0; i < kMaxObjectsCount; ++i) {
+ Obj *obj = &_objects[i];
+ if (obj->kind == 2) {
+ if (--obj->ticks == 0) {
+ ++obj->frameIndex;
+ if (obj->frameIndex >= obj->anim->frameCount)
+ obj->frameIndex = 0;
+ obj->ticks = obj->anim->frameTicks[obj->frameIndex];
+ }
+ }
+ }
+
+ return true;
+}
+
+void MinigameBbLoogie::updateObjs(uint mouseButtons) {
+
+ for (int i = 0; i < kMaxObjectsCount; ++i) {
+ Obj *obj = &_objects[i];
+ switch (obj->kind) {
+ case 1:
+ updatePlayer(i, mouseButtons);
+ break;
+ case 2:
+ updateObjKind2(i);
+ break;
+ case 3:
+ updateLoogie(i);
+ break;
+ case 4:
+ updateCar(i);
+ break;
+ case 5:
+ updateBike(i);
+ break;
+ case 6:
+ updateSquirrel(i);
+ break;
+ case 7:
+ updatePaperPlane(i);
+ break;
+ case 8:
+ updateIndicator(i);
+ break;
+ case 9:
+ updatePrincipal(i);
+ break;
+ }
+ }
+
+ if (--_carDelay == 0) {
+ // Car
+ Obj *obj = getFreeObject();
+ obj->anim = getAnimation(2);
+ obj->kind = 4;
+ obj->frameIndex = 0;
+ obj->x = 379;
+ obj->y = 22;
+ obj->xIncr = -2;
+ obj->yIncr = 0;
+ _carDelay = _vm->getRandom(256) + 800;
+ }
+
+ if (--_bikeDelay == 0) {
+ // Bike
+ Obj *obj = getFreeObject();
+ obj->kind = 5;
+ obj->anim = getAnimation(3);
+ obj->frameIndex = 0;
+ obj->x = 360;
+ obj->y = _vm->getRandom(32) + 82;
+ obj->xIncr = -1;
+ obj->yIncr = 0;
+ _bikeDelay = _vm->getRandom(512) + 500;
+ }
+
+ if (--_squirrelDelay == 0) {
+ // Squirrel
+ Obj *obj = getFreeObject();
+ obj->kind = 6;
+ obj->anim = getAnimation(7);
+ obj->frameIndex = !_squirrelDirection ? 0 : 29;
+ obj->x = 160;
+ obj->y = 36;
+ obj->xIncr = 0;
+ obj->yIncr = 0;
+ _squirrelDirection = !_squirrelDirection;
+ if (_vm->getRandom(5) == 1 && !isAnySoundPlaying(_playerSounds2, _playerSounds2Count))
+ playSound(9);
+ _squirrelDelay = _vm->getRandom(512) + 300;
+ }
+
+ if (--_paperPlaneDelay == 0) {
+ // Paper plane
+ Obj *obj = getFreeObject();
+ obj->kind = 7;
+ obj->anim = getAnimation(16);
+ obj->frameIndex = 0;
+ obj->x = 86;
+ obj->y = 187;
+ obj->xIncr = 0;
+ obj->yIncr = -1;
+ switch (_vm->getRandom(3)) {
+ case 1:
+ obj->frameIndex = 1;
+ obj->xIncr = -1;
+ break;
+ case 2:
+ obj->frameIndex = 7;
+ obj->xIncr = 1;
+ break;
+ }
+ _paperPlaneDelay = 400;
+ }
+
+ if (_principalDelay >= 0 && --_principalDelay == 0) {
+ // Principal
+ Obj *obj = getFreeObject();
+ obj->kind = 9;
+ obj->anim = getAnimation(18);
+ obj->frameIndex = 11;
+ obj->x = -20;
+ obj->y = 130;
+ obj->xIncr = 1;
+ obj->yIncr = 0;
+ obj->status = 0;
+ obj->frameIndexAdd = 0;
+ obj->unk2 = _vm->getRandom(256) + 100;
+ _principalCtr = 0;
+ _principalFirstFrameIndex = 11;
+ _principalLastFrameIndex = 16;
+ }
+
+}
+
+void MinigameBbLoogie::updatePlayer(int objIndex, uint mouseButtons) {
+
+ Obj *obj = &_objects[0];
+
+ switch (obj->status) {
+
+ case 1:
+ if (obj->ticks-- == 0) {
+ if (obj->frameIndex != 15) {
+ ++obj->frameIndex;
+ obj->ticks = _playerAnim->frameTicks[obj->frameIndex];
+ }
+ }
+ if ((((mouseButtons & kLeftButtonDown) && _doubleScore == 0) ||
+ ((mouseButtons & kRightButtonDown) && _doubleScore == 17))
+ && obj->unk2 != 61) {
+ ++obj->unk2;
+ } else {
+ obj->status = 2;
+ obj->frameIndex = 16;
+ obj->ticks = _playerAnim->frameTicks[16];
+ if (obj->unk2 >= 30) {
+ obj->status = 3;
+ obj->frameIndex = 21;
+ obj->ticks = _playerAnim->frameTicks[21];
+ }
+ if (obj->unk2 < 30) {
+ Obj *newObj = getFreeObject();
+ newObj->kind = 3;
+ newObj->anim = getAnimation(5);
+ newObj->frameIndex = 0;
+ newObj->ticks = getAnimation(5)->frameTicks[0];
+ newObj->x = obj->x;
+ newObj->y = 172;
+ newObj->unk2 = obj->unk2;
+ newObj->frameIndexAdd = _doubleScore;
+ if (_doubleScore)
+ --_megaLoogieCount;
+ }
+ if (_doubleScore) {
+ stopSound(30);
+ playSound(31);
+ } else {
+ stopSound(28);
+ playSound(29);
+ }
+ }
+ break;
+
+ case 2:
+ if (obj->ticks-- == 0) {
+ if (obj->frameIndex == 17) {
+ obj->frameIndex = 0;
+ obj->status = 0;
+ } else {
+ ++obj->frameIndex;
+ obj->ticks = _playerAnim->frameTicks[obj->frameIndex];
+ }
+ }
+ break;
+
+ case 3:
+ if (obj->ticks-- == 0) {
+ if (obj->frameIndex == 23) {
+ obj->frameIndex = 0;
+ obj->status = 0;
+ } else {
+ ++obj->frameIndex;
+ obj->ticks = _playerAnim->frameTicks[obj->frameIndex];
+ if (obj->frameIndex == 22) {
+ Obj *newObj = getFreeObject();
+ newObj->kind = 3;
+ newObj->anim = getAnimation(5);
+ newObj->frameIndex = 0;
+ newObj->ticks = getAnimation(5)->frameTicks[0];
+ newObj->x = obj->x;
+ newObj->y = 154;
+ newObj->unk2 = obj->unk2;
+ newObj->frameIndexAdd = _doubleScore;
+ if (_doubleScore)
+ --_megaLoogieCount;
+ }
+ }
+ }
+ break;
+
+ }
+
+}
+
+void MinigameBbLoogie::updateObjKind2(int objIndex) {
+
+ Obj *obj = &_objects[objIndex];
+
+ if (obj->ticks-- == 0) {
+ obj->ticks = getAnimation(4)->frameTicks[0];
+ if (obj->frameIndex > 7)
+ obj->frameIndex = 1;
+ if (obj->frameIndex++ >= 7)
+ obj->frameIndex = 0;
+ }
+
+}
+
+void MinigameBbLoogie::updateLoogie(int objIndex) {
+ Obj *obj = &_objects[objIndex];
+
+ if (obj->unk2 > 0) {
+ obj->y -= kLoogieOffY[obj->unk2 / 8];
+ --obj->unk2;
+ }
+
+ if (obj->ticks-- == 0) {
+ obj->ticks = getAnimation(5)->frameTicks[0];
+ ++obj->frameIndex;
+ if (obj->frameIndex >= 17) {
+ obj->kind = 0;
+ obj->anim = getAnimation(6);
+ obj->frameIndex = 0;
+ }
+ }
+
+}
+
+void MinigameBbLoogie::updateCar(int objIndex) {
+ Obj *obj = &_objects[objIndex];
+
+ obj->x += obj->xIncr;
+
+ if (obj->ticks-- == 0) {
+ if (obj->frameIndex++ == 3 || obj->frameIndex == 6)
+ obj->frameIndex = 0;
+ obj->ticks = getAnimation(2)->frameTicks[obj->frameIndex];
+ }
+
+ if (obj->x <= -60) {
+ obj->kind = 0;
+ obj->anim = getAnimation(6);
+ obj->frameIndex = 0;
+ } else if (!_principalAngry && obj->frameIndex <= 3) {
+ int loogieObjIndex = 0;
+ Obj *loogieObj = findLoogieObj(loogieObjIndex++);
+ while (loogieObj) {
+ if (loogieObj->frameIndex >= 8 && loogieObj->frameIndex <= 10 && isHit(obj, loogieObj)) {
+ incNumberOfHits();
+ incScore(7);
+ loogieObj->frameIndex = 13;
+ loogieObj->ticks = getAnimation(5)->frameTicks[12];
+ obj->frameIndex = 4;
+ obj->ticks = getAnimation(2)->frameTicks[4];
+ playSound(34);
+ playRndSound();
+ }
+ loogieObj = findLoogieObj(loogieObjIndex++);
+ }
+ }
+
+}
+
+void MinigameBbLoogie::updateBike(int objIndex) {
+ Obj *obj = &_objects[objIndex];
+
+ obj->x += obj->xIncr;
+
+ if (obj->ticks-- == 0) {
+ if (obj->frameIndex++ == 3 || obj->frameIndex == 7)
+ obj->frameIndex = 0;
+ obj->ticks = getAnimation(3)->frameTicks[obj->frameIndex];
+ }
+
+ if (obj->x == -40) {
+ obj->kind = 0;
+ obj->anim = getAnimation(6);
+ obj->frameIndex = 0;
+ } else if (!_principalAngry && obj->frameIndex <= 3) {
+ int loogieObjIndex = 0;
+ Obj *loogieObj = findLoogieObj(loogieObjIndex++);
+ while (loogieObj) {
+ if (loogieObj->frameIndex >= 7 && loogieObj->frameIndex <= 11 && isHit(obj, loogieObj)) {
+ incNumberOfHits();
+ incScore(2);
+ loogieObj->frameIndex = 13;
+ loogieObj->ticks = getAnimation(5)->frameTicks[12];
+ obj->frameIndex = 4;
+ obj->ticks = getAnimation(3)->frameTicks[4];
+ playSound(35);
+ playRndSound();
+ }
+ loogieObj = findLoogieObj(loogieObjIndex++);
+ }
+ }
+
+}
+
+void MinigameBbLoogie::updateSquirrel(int objIndex) {
+ Obj *obj = &_objects[objIndex];
+
+ if (obj->ticks-- == 0) {
+ ++obj->frameIndex;
+ if (obj->frameIndex == 29 || obj->frameIndex == 54 ||
+ obj->frameIndex == 58 || obj->frameIndex == 62) {
+ obj->kind = 0;
+ obj->anim = getAnimation(6);
+ obj->frameIndex = 0;
+ }
+ obj->ticks = getAnimation(7)->frameTicks[obj->frameIndex];
+ }
+
+ if (!_principalAngry && obj->frameIndex <= 53) {
+ int loogieObjIndex = 0;
+ Obj *loogieObj = findLoogieObj(loogieObjIndex++);
+ while (loogieObj) {
+ if (loogieObj->frameIndex >= 7 && loogieObj->frameIndex <= 9 && isHit(obj, loogieObj)) {
+ incNumberOfHits();
+ incScore(10);
+ loogieObj->frameIndex = 13;
+ loogieObj->ticks = getAnimation(5)->frameTicks[12];
+ obj->x += kSquirrelOffX[obj->frameIndex];
+ obj->frameIndex = obj->frameIndex < 29 ? 54 : 58;
+ obj->ticks = getAnimation(7)->frameTicks[obj->frameIndex];
+ playSound(36);
+ playRndSound();
+ }
+ loogieObj = findLoogieObj(loogieObjIndex++);
+ }
+ }
+
+}
+
+void MinigameBbLoogie::updatePaperPlane(int objIndex) {
+ Obj *obj = &_objects[objIndex];
+
+ obj->x += obj->xIncr;
+ obj->y += obj->yIncr;
+
+ if (obj->x == -16 || obj->x == 336 || obj->y == -16) {
+ obj->kind = 0;
+ obj->anim = getAnimation(6);
+ obj->frameIndex = 0;
+ }
+
+ if (!_principalAngry && obj->frameIndex <= 53) {
+ int loogieObjIndex = 0;
+ Obj *loogieObj = findLoogieObj(loogieObjIndex++);
+ while (loogieObj) {
+ if (loogieObj->frameIndex >= 4 && loogieObj->frameIndex <= 7 && isHit(obj, loogieObj)) {
+ incNumberOfHits();
+ incScore(5);
+ loogieObj->frameIndex = 13;
+ loogieObj->ticks = getAnimation(5)->frameTicks[12];
+ obj->frameIndex = (obj->frameIndex + 1) % 8;
+ obj->xIncr = kPlaneOffX[obj->frameIndex];
+ obj->yIncr = kPlaneOffY[obj->frameIndex];
+ playSound(37);
+ playRndSound();
+ }
+ loogieObj = findLoogieObj(loogieObjIndex++);
+ }
+ }
+
+}
+
+void MinigameBbLoogie::updateIndicator(int objIndex) {
+ Obj *obj = &_objects[objIndex];
+ Obj *loogieObj = &_objects[0];
+
+ if (obj->ticks-- == 0) {
+ obj->frameIndex = (obj->frameIndex + 1) % 2;
+ obj->ticks = getAnimation(17)->frameTicks[0];
+ }
+
+ if (loogieObj->status != 0) {
+ int unk2mod = loogieObj->unk2 / 8;
+ int unk2div = loogieObj->unk2 / 8 * 8;
+ int v6 = 0;
+ if (unk2div > 8) {
+ int v7 = 1;
+ do {
+ v6 += 8 * kLoogieOffY[v7++];
+ } while (v7 != unk2mod);
+ }
+ int yOfs = (loogieObj->unk2 % 8 + 1) * kLoogieOffY[loogieObj->unk2 / 8] + v6;
+ if (loogieObj->unk2 >= 30)
+ yOfs += 18;
+ obj->y = 140 - yOfs;
+ } else {
+ obj->kind = 0;
+ obj->anim = getAnimation(6);
+ }
+
+}
+
+void MinigameBbLoogie::updatePrincipal(int objIndex) {
+ Obj *obj = &_objects[objIndex];
+
+ switch (obj->status) {
+
+ case 0:
+ if (obj->unk2--) {
+ if (obj->ticks-- == 0) {
+ ++obj->frameIndex;
+ if (obj->frameIndex == _principalLastFrameIndex)
+ obj->frameIndex = _principalFirstFrameIndex;
+ obj->ticks = getAnimation(18)->frameTicks[obj->frameIndex];
+ }
+ ++_principalCtr;
+ if (_principalCtr % 2 != 0) {
+ obj->x += obj->xIncr;
+ obj->y += obj->yIncr;
+ if (obj->xIncr > 0 && obj->x == 340) {
+ obj->xIncr = -1;
+ _principalLastFrameIndex = 34;
+ _principalFirstFrameIndex = 29;
+ obj->frameIndex = 29;
+ obj->status = 2;
+ obj->ticks = _vm->getRandom(256) + 60;
+ }
+ if (obj->xIncr < 0 && obj->x == -20) {
+ obj->xIncr = 1;
+ _principalLastFrameIndex = 16;
+ _principalFirstFrameIndex = 11;
+ obj->frameIndex = 11;
+ obj->status = 2;
+ obj->ticks = _vm->getRandom(256) + 60;
+ }
+ }
+ } else {
+ obj->unk2 = _vm->getRandom(64) + 20;
+ ++obj->status;
+ if (_vm->getRandom(2) == 1) {
+ obj->frameIndex = _principalFirstFrameIndex < 11 ? 17 : 26;
+ _principalFirstFrameIndex = 19;
+ } else {
+ obj->frameIndex = _principalFirstFrameIndex < 11 ? 8 : 35;
+ _principalFirstFrameIndex = 1;
+ }
+ obj->ticks = getAnimation(18)->frameTicks[obj->frameIndex];
+ }
+ break;
+
+ case 1:
+ if (obj->unk2--) {
+ if (obj->ticks-- == 0)
+ obj->frameIndex = _principalFirstFrameIndex;
+ } else {
+ obj->unk2 = _vm->getRandom(256) + 100;
+ ++obj->status;
+ if (_vm->getRandom(2) == 1) {
+ _principalLastFrameIndex = 16;
+ _principalFirstFrameIndex = 11;
+ obj->frameIndex = obj->frameIndex < 1 ? 8 : 17;
+ obj->ticks = getAnimation(18)->frameTicks[obj->frameIndex];
+ obj->xIncr = 1;
+ } else {
+ _principalLastFrameIndex = 34;
+ _principalFirstFrameIndex = 29;
+ obj->frameIndex = obj->frameIndex < 1 ? 35 : 26;
+ obj->ticks = getAnimation(18)->frameTicks[obj->frameIndex];
+ obj->xIncr = -1;
+ }
+ }
+ break;
+
+ case 2:
+ if (obj->ticks-- == 0) {
+ obj->status = 0;
+ obj->frameIndex = _principalFirstFrameIndex;
+ obj->ticks = getAnimation(18)->frameTicks[obj->frameIndex];
+ }
+ break;
+
+ case 3:
+ if (obj->ticks-- == 0) {
+ obj->status = _prevPrincipalStatus;
+ obj->frameIndex = _principalFirstFrameIndex;
+ obj->ticks = getAnimation(18)->frameTicks[obj->frameIndex];
+ }
+ break;
+
+ case 4:
+ if (obj->ticks-- == 0) {
+ switch (obj->frameIndex) {
+ case 8:
+ obj->frameIndex = 36;
+ break;
+ case 26:
+ obj->frameIndex = 28;
+ break;
+ case 28:
+ obj->frameIndex = 35;
+ break;
+ case 35:
+ ++obj->frameIndex;
+ break;
+ case 36:
+ obj->status = 5;
+ ++obj->frameIndex;
+ break;
+ }
+ obj->ticks = getAnimation(18)->frameTicks[obj->frameIndex];
+ }
+ break;
+
+ case 5:
+ if (obj->ticks-- == 0) {
+ ++obj->frameIndex;
+ if (obj->frameIndex == 48)
+ obj->frameIndex = 36;
+ obj->ticks = getAnimation(18)->frameTicks[obj->frameIndex];
+ }
+ if (!isSoundPlaying(1)) {
+ _gameResult = true;
+ if (_fromMainGame) {
+ _principalAngry = true;
+ if (obj->x <= 140 || obj->x >= 165) {
+ obj->status = 6;
+ if (obj->x >= 160) {
+ _principalLastFrameIndex = 34;
+ _principalFirstFrameIndex = 29;
+ obj->frameIndex = 29;
+ obj->ticks = getAnimation(18)->frameTicks[obj->frameIndex];
+ obj->xIncr = -1;
+ } else {
+ _principalLastFrameIndex = 16;
+ _principalFirstFrameIndex = 11;
+ obj->frameIndex = 11;
+ obj->ticks = getAnimation(18)->frameTicks[obj->frameIndex];
+ obj->xIncr = 1;
+ }
+ } else {
+ obj->status = 7;
+ _principalFirstFrameIndex = 2;
+ _principalLastFrameIndex = 7;
+ obj->frameIndex = 2;
+ obj->ticks = getAnimation(18)->frameTicks[obj->frameIndex];
+ obj->xIncr = 0;
+ obj->yIncr = 1;
+ }
+ } else {
+ obj->status = _prevPrincipalStatus;
+ obj->frameIndex = _principalFirstFrameIndex;
+ obj->ticks = getAnimation(18)->frameTicks[obj->frameIndex];
+ }
+ }
+ break;
+
+ case 6:
+ obj->x += obj->xIncr;
+ obj->y += obj->yIncr;
+ if (obj->ticks-- == 0) {
+ ++obj->frameIndex;
+ if (obj->frameIndex == _principalLastFrameIndex)
+ obj->frameIndex = _principalFirstFrameIndex;
+ obj->ticks = getAnimation(18)->frameTicks[obj->frameIndex];
+ }
+ if (obj->x > 145 && obj->x < 160) {
+ obj->status = 7;
+ _principalFirstFrameIndex = 2;
+ _principalLastFrameIndex = 7;
+ obj->frameIndex = 2;
+ obj->ticks = getAnimation(18)->frameTicks[obj->frameIndex];
+ obj->xIncr = 0;
+ obj->yIncr = 1;
+ }
+ break;
+
+ case 7:
+ obj->x += obj->xIncr;
+ obj->y += obj->yIncr;
+ if (obj->ticks-- == 0) {
+ ++obj->frameIndex;
+ if (obj->frameIndex == _principalLastFrameIndex)
+ obj->frameIndex = _principalFirstFrameIndex;
+ obj->ticks = getAnimation(18)->frameTicks[obj->frameIndex];
+ }
+ if (obj->y > 175) {
+ // Angry principal enters school, end the minigame
+ _gameDone = true;
+ }
+ break;
+
+ }
+
+ if (!_principalAngry) {
+ int loogieObjIndex = 0;
+ Obj *loogieObj = findLoogieObj(loogieObjIndex++);
+ while (loogieObj) {
+ if (loogieObj->frameIndex >= 7 && loogieObj->frameIndex <= 12 && isHit(obj, loogieObj)) {
+ incNumberOfHits();
+ incScore(1);
+ loogieObj->frameIndex = 13;
+ loogieObj->ticks = getAnimation(5)->frameTicks[12];
+ if (obj->status != 3 && obj->status != 4 && obj->status != 5) {
+ _prevPrincipalStatus = obj->status;
+ obj->status = 3;
+ if (_principalFirstFrameIndex == 1 || _principalFirstFrameIndex == 19)
+ obj->frameIndex = _principalFirstFrameIndex - 1;
+ else
+ obj->frameIndex = _principalFirstFrameIndex - 2;
+ obj->ticks = getAnimation(18)->frameTicks[obj->frameIndex];
+ if (loogieObj->frameIndexAdd > 0) {
+ obj->status = 4;
+ switch (obj->frameIndex) {
+ case 0:
+ obj->frameIndex = 36;
+ break;
+ case 9:
+ obj->frameIndex = 8;
+ break;
+ case 27:
+ obj->frameIndex = 35;
+ break;
+ case 18:
+ obj->frameIndex = 26;
+ break;
+ }
+ obj->ticks = getAnimation(18)->frameTicks[obj->frameIndex];
+ playSound(1);
+ } else {
+ if (!isAnySoundPlaying(_playerSounds2, _playerSounds2Count))
+ playSound(kPrincipalSounds[_vm->getRandom(4)]);
+ playRndSound();
+ }
+ }
+ }
+ loogieObj = findLoogieObj(loogieObjIndex++);
+ }
+ }
+
+}
+
+void MinigameBbLoogie::incNumberOfHits() {
+ ++_numberOfHits;
+ if (_numberOfHits == 1000)
+ _numberOfHits = 0;
+ if (_numberOfHits % 10 == 0) {
+ ++_megaLoogieCount;
+ if (_megaLoogieCount > 11)
+ _megaLoogieCount = 11;
+ }
+}
+
+void MinigameBbLoogie::incScore(int incrAmount) {
+ if (_doubleScore)
+ _currScore += 2 * incrAmount;
+ else
+ _currScore += incrAmount;
+}
+
+void MinigameBbLoogie::playRndSound() {
+ if (!isAnySoundPlaying(_playerSounds2, _playerSounds2Count))
+ playSound(_playerSounds1[_vm->getRandom(_playerSounds1Count)]);
+}
+
+bool MinigameBbLoogie::run(bool fromMainGame) {
+
+ memset(_objects, 0, sizeof(_objects));
+
+ _numbersAnim = getAnimation(9);
+
+ _backgroundSpriteIndex = 210;
+ _titleScreenSpriteIndex = 211;
+
+ _fromMainGame = fromMainGame;
+
+ _hiScore = 0;
+ if (!_fromMainGame)
+ _hiScore = loadHiscore(kMinigameBbLoogie);
+
+ _gameState = kGSTitleScreen;
+ _gameTicks = 0;
+ _gameResult = false;
+ _gameDone = false;
+ initObjects();
+ initVars();
+
+ _spriteModule = new SpriteModule();
+ _spriteModule->load("bbloogie/bbloogie.000");
+
+ Palette palette = _spriteModule->getPalette();
+ _vm->_screen->setPalette(palette);
+
+ loadSounds();
+
+ playSound(32, true);
+
+ while (!_vm->shouldQuit() &&!_gameDone) {
+ _vm->updateEvents();
+ update();
+ }
+
+ _vm->_sound->unloadSounds();
+
+ if (!_fromMainGame)
+ saveHiscore(kMinigameBbLoogie, _hiScore);
+
+ delete _spriteModule;
+
+ return _gameResult;
+}
+
+void MinigameBbLoogie::update() {
+
+ int inputTicks;
+
+ if (_gameTicks > 0) {
+ int currTicks = _vm->_system->getMillis();
+ inputTicks = (currTicks - _gameTicks) / 17;
+ _gameTicks = currTicks - (currTicks - _gameTicks) % 17;
+ } else {
+ inputTicks = 1;
+ _gameTicks = _vm->_system->getMillis();
+ }
+
+ if (_vm->_keyCode == Common::KEYCODE_ESCAPE) {
+ _gameDone = true;
+ return;
+ }
+
+ if (inputTicks == 0)
+ return;
+
+ bool done;
+
+ do {
+ done = !updateStatus(_vm->_mouseX, _vm->_mouseY, _vm->_mouseButtons);
+ _vm->_mouseButtons &= ~kLeftButtonClicked;
+ _vm->_mouseButtons &= ~kRightButtonClicked;
+ _vm->_keyCode = Common::KEYCODE_INVALID;
+ } while (--inputTicks && _gameTicks > 0 && !done);
+
+ drawSprites();
+
+ _vm->_system->delayMillis(10);
+
+}
+
+void MinigameBbLoogie::loadSounds() {
+ for (uint i = 0; i < kSoundFilenamesCount; ++i) {
+ Common::String filename = Common::String::format("bbloogie/%s", kSoundFilenames[i]);
+ _vm->_sound->loadSound(filename.c_str());
+ }
+}
+
+} // End of namespace Bbvs
diff --git a/engines/bbvs/minigames/bbloogie.h b/engines/bbvs/minigames/bbloogie.h
new file mode 100644
index 0000000000..1dd4049b41
--- /dev/null
+++ b/engines/bbvs/minigames/bbloogie.h
@@ -0,0 +1,141 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+
+ * You should have received a copy of the GNU General Public 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 BBVS_MINIGAMES_BBLOOGIE_H
+#define BBVS_MINIGAMES_BBLOOGIE_H
+
+#include "bbvs/minigames/minigame.h"
+
+namespace Bbvs {
+
+class MinigameBbLoogie : public Minigame {
+public:
+ MinigameBbLoogie(BbvsEngine *vm) : Minigame(vm) {};
+ bool run(bool fromMainGame);
+public:
+
+ struct Obj {
+ int kind;
+ int x, y;
+ int xIncr, yIncr;
+ const ObjAnimation *anim;
+ int frameIndex;
+ int ticks;
+ int status;
+ int16 frameIndexAdd;
+ int16 unk2;
+ };
+
+ enum {
+ kMaxObjectsCount = 256
+ };
+
+ enum {
+ kGSTitleScreen = 0, // Title screen
+ kGSMainGame = 1, // Game when called as part of the main game
+ kGSStandaloneGame = 2, // Game when called as standalone game
+ kGSScoreCountUp = 3 // Score countup and next level text
+ };
+
+ Obj _objects[kMaxObjectsCount];
+
+ int _playerKind;
+ const ObjAnimation *_playerAnim;
+ const uint *_playerSounds1, *_playerSounds2;
+ uint _playerSounds1Count, _playerSounds2Count;
+
+ int _level, _levelTimeLeft, _levelTimeDelay;
+ int _numberOfHits, _currScore, _hiScore;
+ int _doubleScore, _megaLoogieCount;
+
+ int _dispLevelScore, _nextLevelScore;
+
+ int _timeBonusCtr, _bonusDisplayDelay1, _bonusDisplayDelay2, _bonusDisplayDelay3;
+
+ int _carDelay;
+ int _bikeDelay;
+ int _squirrelDelay;
+ bool _squirrelDirection;
+ int _paperPlaneDelay;
+ int _principalDelay;
+
+ int _prevPrincipalStatus;
+ int _principalCtr, _principalFirstFrameIndex, _principalLastFrameIndex;
+ bool _principalAngry;
+
+ const ObjAnimation *getAnimation(int animIndex);
+
+ void buildDrawList(DrawList &drawList);
+ void buildDrawList0(DrawList &drawList);
+ void buildDrawList1(DrawList &drawList);
+ void buildDrawList2(DrawList &drawList);
+ void buildDrawList3(DrawList &drawList);
+
+ void drawSprites();
+
+ void initObjs();
+ Obj *getFreeObject();
+ Obj *findLoogieObj(int startObjIndex);
+ bool isHit(Obj *obj1, Obj *obj2);
+ bool isCursorAtObj(int objIndex);
+
+ void initObjects();
+ void initObjects0();
+ void initObjects1();
+ void initObjects3();
+
+ void initVars();
+ void initVars0();
+ void initVars1();
+ void initVars2();
+ void initVars3();
+
+ bool updateStatus(int mouseX, int mouseY, uint mouseButtons);
+ bool updateStatus0(int mouseX, int mouseY, uint mouseButtons);
+ bool updateStatus1(int mouseX, int mouseY, uint mouseButtons);
+ bool updateStatus2(int mouseX, int mouseY, uint mouseButtons);
+ bool updateStatus3(int mouseX, int mouseY, uint mouseButtons);
+
+ void updateObjs(uint mouseButtons);
+ void updatePlayer(int objIndex, uint mouseButtons);
+ void updateObjKind2(int objIndex);
+ void updateLoogie(int objIndex);
+ void updateCar(int objIndex);
+ void updateBike(int objIndex);
+ void updateSquirrel(int objIndex);
+ void updatePaperPlane(int objIndex);
+ void updateIndicator(int objIndex);
+ void updatePrincipal(int objIndex);
+
+ void incNumberOfHits();
+ void incScore(int incrAmount);
+ void playRndSound();
+
+ void update();
+
+ void loadSounds();
+
+};
+
+} // End of namespace Bbvs
+
+#endif // BBVS_MINIGAMES_BBLOOGIE_H
diff --git a/engines/bbvs/minigames/bbloogie_anims.cpp b/engines/bbvs/minigames/bbloogie_anims.cpp
new file mode 100644
index 0000000000..a82be8a279
--- /dev/null
+++ b/engines/bbvs/minigames/bbloogie_anims.cpp
@@ -0,0 +1,138 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+
+ * You should have received a copy of the GNU General Public 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 "bbvs/minigames/bbloogie.h"
+
+namespace Bbvs {
+
+static const int kAnim0FrameIndices[] = {0, 1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4, 0, 5, 6, 7, 0, 0, 5, 6, 7, 8, 0, 4, 3, 2, 1, 4, 3, 2, 1, 4, 3, 2, 1, 0};
+static const int16 kAnim0FrameTicks[] = {22, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 20, 8, 8, 10, 10, 10, 8, 22, 6, 12, 20, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 22};
+static const BBRect kAnim0FrameRects[] = {{0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}};
+static const int kAnim1FrameIndices[] = {9, 10, 11, 12, 13, 10, 11, 12, 13, 10, 11, 12, 13, 9, 14, 15, 16, 9, 9, 14, 15, 16, 17, 9, 13, 12, 11, 10, 13, 12, 11, 10, 13, 12, 11, 10, 9};
+static const int16 kAnim1FrameTicks[] = {22, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 20, 8, 8, 10, 10, 10, 8, 22, 6, 12, 20, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 22};
+static const BBRect kAnim1FrameRects[] = {{0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}};
+static const int kAnim2FrameIndices[] = {18, 19, 20, 18, 21, 22};
+static const int16 kAnim2FrameTicks[] = {6, 6, 6, 6, 6, 6};
+static const BBRect kAnim2FrameRects[] = {{-45, -43, 86, 38}, {-45, -43, 86, 38}, {-45, -43, 86, 38}, {-45, -43, 86, 38}, {-45, -43, 86, 38}, {-45, -43, 86, 38}};
+static const int kAnim3FrameIndices[] = {23, 24, 25, 26, 27, 28, 27};
+static const int16 kAnim3FrameTicks[] = {6, 6, 6, 6, 6, 7, 6};
+static const BBRect kAnim3FrameRects[] = {{-24, -17, 48, 14}, {-24, -17, 48, 14}, {-24, -17, 48, 14}, {-24, -17, 48, 14}, {-24, -17, 48, 14}, {-24, -17, 48, 14}, {-24, -17, 48, 14}};
+static const int kAnim4FrameIndices[] = {29, 30, 31, 32, 33, 34, 35, 36};
+static const int16 kAnim4FrameTicks[] = {6, 6, 6, 6, 6, 6, 6, 6};
+static const BBRect kAnim4FrameRects[] = {{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}};
+static const int kAnim5FrameIndices[] = {37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70};
+static const int16 kAnim5FrameTicks[] = {6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6};
+static const BBRect kAnim5FrameRects[] = {{-1, -11, 4, 11}, {-2, -15, 6, 8}, {-3, -24, 8, 8}, {-3, -31, 7, 9}, {-3, -33, 8, 8}, {-3, -34, 8, 10}, {-2, -34, 7, 8}, {-1, -34, 6, 7}, {-1, -34, 5, 6}, {-1, -34, 4, 4}, {0, -34, 3, 4}, {-1, -34, 4, 3}, {0, -34, 3, 4}, {0, -33, 3, 3}, {-1, -35, 5, 5}, {-3, -37, 9, 9}, {-4, -39, 12, 13}, {-3, -11, 7, 8}, {-3, -15, 8, 9}, {-5, -24, 11, 13}, {-4, -31, 10, 13}, {-5, -34, 11, 13}, {-5, -34, 11, 11}, {-4, -34, 9, 10}, {-4, -34, 9, 9}, {-3, -34, 7, 8}, {-2, -34, 6, 7}, {-2, -34, 5, 6}, {-2, -34, 4, 5}, {-7, -38, 13, 13}, {-10, -44, 22, 22}, {-13, -47, 27, 27}, {-17, -49, 32, 30}, {-17, -50, 34, 33}};
+static const int kAnim6FrameIndices[] = {71};
+static const int16 kAnim6FrameTicks[] = {1};
+static const BBRect kAnim6FrameRects[] = {{0, 0, 0, 0}};
+static const int kAnim7FrameIndices[] = {72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 80, 79, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 110, 109, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129};
+static const int16 kAnim7FrameTicks[] = {6, 6, 6, 6, 6, 6, 6, 30, 6, 20, 6, 30, 6, 6, 6, 6, 6, 6, 6, 6, 6, 30, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 30, 6, 20, 6, 30, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6};
+static const BBRect kAnim7FrameRects[] = {{-46, -6, 7, 6}, {-46, -12, 11, 12}, {-47, -15, 17, 15}, {-46, -14, 20, 12}, {-47, -10, 24, 10}, {-41, -11, 22, 11}, {-33, -10, 15, 10}, {-32, -10, 14, 10}, {-32, -9, 13, 9}, {-32, -9, 13, 9}, {-32, -9, 13, 9}, {-32, -10, 13, 10}, {-34, -11, 24, 11}, {-30, -12, 25, 9}, {-24, -10, 24, 10}, {-18, -11, 22, 11}, {-14, -11, 24, 10}, {-9, -12, 25, 9}, {-3, -10, 24, 10}, {4, -11, 22, 11}, {11, -10, 15, 10}, {12, -10, 13, 10}, {10, -11, 24, 11}, {15, -12, 25, 9}, {22, -16, 22, 16}, {34, -16, 9, 16}, {35, -12, 9, 12}, {38, -6, 6, 6}, {38, -6, 4, 4}, {36, -6, 7, 6}, {31, -12, 12, 12}, {27, -15, 17, 15}, {24, -12, 20, 12}, {19, -11, 22, 11}, {13, -11, 24, 11}, {7, -11, 25, 9}, {4, -10, 24, 10}, {1, -11, 22, 11}, {1, -10, 15, 10}, {2, -10, 13, 10}, {2, -10, 13, 10}, {2, -9, 13, 9}, {2, -10, 13, 10}, {2, -10, 13, 10}, {-7, -11, 24, 11}, {-14, -11, 25, 9}, {-21, -10, 24, 11}, {-27, -11, 23, 11}, {-34, -12, 24, 11}, {-44, -18, 22, 16}, {-44, -16, 9, 16}, {-46, -12, 9, 12}, {-45, -6, 7, 6}, {-45, -4, 6, 5}, {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}};
+static const int kAnim8FrameIndices[] = {130};
+static const int16 kAnim8FrameTicks[] = {6};
+static const BBRect kAnim8FrameRects[] = {{0, 0, 0, 0}};
+static const int kAnim9FrameIndices[] = {131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141};
+static const int16 kAnim9FrameTicks[] = {6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6};
+static const BBRect kAnim9FrameRects[] = {{0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}};
+static const int kAnim10FrameIndices[] = {142};
+static const int16 kAnim10FrameTicks[] = {2};
+static const BBRect kAnim10FrameRects[] = {{0, 0, 0, 0}};
+static const int kAnim11FrameIndices[] = {143};
+static const int16 kAnim11FrameTicks[] = {1};
+static const BBRect kAnim11FrameRects[] = {{0, 0, 0, 0}};
+static const int kAnim12FrameIndices[] = {144};
+static const int16 kAnim12FrameTicks[] = {1};
+static const BBRect kAnim12FrameRects[] = {{0, 0, 0, 0}};
+static const int kAnim13FrameIndices[] = {145};
+static const int16 kAnim13FrameTicks[] = {1};
+static const BBRect kAnim13FrameRects[] = {{0, 0, 0, 0}};
+static const int kAnim14FrameIndices[] = {146};
+static const int16 kAnim14FrameTicks[] = {1};
+static const BBRect kAnim14FrameRects[] = {{0, 0, 0, 0}};
+static const int kAnim15FrameIndices[] = {147};
+static const int16 kAnim15FrameTicks[] = {1};
+static const BBRect kAnim15FrameRects[] = {{0, 0, 0, 0}};
+static const int kAnim16FrameIndices[] = {148, 149, 150, 151, 152, 153, 154, 155};
+static const int16 kAnim16FrameTicks[] = {6, 6, 6, 6, 6, 6, 6, 6};
+static const BBRect kAnim16FrameRects[] = {{-5, -5, 9, 9}, {-6, -5, 11, 11}, {-6, -4, 9, 9}, {-5, -5, 10, 10}, {-5, -3, 9, 9}, {-6, -5, 10, 10}, {-4, -4, 9, 9}, {-6, -4, 10, 10}};
+static const int kAnim17FrameIndices[] = {156, 157};
+static const int16 kAnim17FrameTicks[] = {6, 6};
+static const BBRect kAnim17FrameRects[] = {{0, 0, 0, 0}, {0, 0, 0, 0}};
+static const int kAnim18FrameIndices[] = {158, 159, 160, 161, 160, 162, 163, 162, 164, 165, 166, 167, 168, 167, 169, 170, 169, 171, 172, 173, 174, 175, 174, 176, 177, 176, 178, 179, 180, 181, 182, 181, 183, 184, 183, 185, 186, 187, 188, 189, 190, 188, 189, 191, 188, 190, 189, 187, 186};
+static const int16 kAnim18FrameTicks[] = {10, 20, 8, 8, 8, 8, 8, 8, 6, 10, 20, 8, 8, 8, 8, 8, 8, 6, 10, 20, 8, 8, 8, 8, 8, 8, 6, 10, 20, 8, 8, 8, 8, 8, 8, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6};
+static const BBRect kAnim18FrameRects[] = {{-13, -16, 26, 16}, {-12, -16, 24, 16}, {-12, -16, 24, 16}, {-12, -16, 24, 16}, {-12, -16, 24, 16}, {-12, -16, 24, 16}, {-12, -16, 24, 16}, {-12, -16, 24, 16}, {-10, -19, 18, 20}, {-8, -20, 15, 23}, {-8, -20, 16, 22}, {-8, -20, 16, 22}, {-8, -20, 16, 22}, {-8, -20, 16, 22}, {-8, -20, 16, 22}, {-8, -20, 16, 22}, {-8, -20, 16, 22}, {-10, -18, 19, 20}, {-12, -17, 24, 16}, {-12, -16, 24, 16}, {-12, -16, 24, 16}, {-12, -16, 24, 16}, {-12, -16, 24, 16}, {-12, -16, 24, 16}, {-12, -16, 24, 16}, {-12, -16, 24, 16}, {-10, -18, 20, 19}, {-8, -20, 16, 22}, {-8, -20, 16, 22}, {-8, -20, 16, 22}, {-8, -20, 16, 22}, {-8, -20, 16, 22}, {-8, -20, 16, 22}, {-8, -20, 16, 22}, {-8, -20, 16, 22}, {-9, -19, 18, 20}, {-12, -17, 24, 17}, {-12, -17, 24, 17}, {-12, -17, 24, 17}, {-12, -17, 24, 17}, {-12, -17, 24, 17}, {-12, -17, 24, 17}, {-12, -17, 24, 17}, {-12, -17, 24, 17}, {-12, -17, 24, 17}, {-12, -17, 24, 17}, {-12, -17, 24, 17}, {-12, -17, 24, 17}, {-12, -17, 24, 17}};
+static const int kAnim19FrameIndices[] = {192};
+static const int16 kAnim19FrameTicks[] = {8};
+static const BBRect kAnim19FrameRects[] = {{0, 0, 0, 0}};
+static const int kAnim20FrameIndices[] = {193};
+static const int16 kAnim20FrameTicks[] = {5};
+static const BBRect kAnim20FrameRects[] = {{0, 0, 0, 0}};
+static const int kAnim21FrameIndices[] = {194};
+static const int16 kAnim21FrameTicks[] = {6};
+static const BBRect kAnim21FrameRects[] = {{-7, -80, 17, 81}};
+static const int kAnim22FrameIndices[] = {195, 196, 197, 198, 199, 200};
+static const int16 kAnim22FrameTicks[] = {6, 6, 6, 6, 6, 6};
+static const BBRect kAnim22FrameRects[] = {{-22, -91, 45, 93}, {-21, -92, 43, 95}, {-21, -92, 43, 95}, {-21, -92, 43, 95}, {-21, -92, 43, 95}, {-21, -92, 43, 95}};
+static const int kAnim23FrameIndices[] = {201};
+static const int16 kAnim23FrameTicks[] = {6};
+static const BBRect kAnim23FrameRects[] = {{-12, -75, 21, 75}};
+static const int kAnim24FrameIndices[] = {202, 203, 204, 205, 206, 207};
+static const int16 kAnim24FrameTicks[] = {6, 6, 6, 6, 6, 6};
+static const BBRect kAnim24FrameRects[] = {{-21, -85, 38, 86}, {-21, -85, 38, 86}, {-21, -85, 38, 86}, {-21, -85, 38, 86}, {-21, -85, 38, 86}, {-21, -85, 38, 86}};
+static const int kAnim25FrameIndices[] = {208, 209};
+static const int16 kAnim25FrameTicks[] = {6, 6};
+static const BBRect kAnim25FrameRects[] = {{-9, -9, 17, 15}, {-11, -10, 19, 16}};
+static const ObjAnimation kAnimations[] = {
+ {37, kAnim0FrameIndices, kAnim0FrameTicks, kAnim0FrameRects},
+ {37, kAnim1FrameIndices, kAnim1FrameTicks, kAnim1FrameRects},
+ {6, kAnim2FrameIndices, kAnim2FrameTicks, kAnim2FrameRects},
+ {7, kAnim3FrameIndices, kAnim3FrameTicks, kAnim3FrameRects},
+ {8, kAnim4FrameIndices, kAnim4FrameTicks, kAnim4FrameRects},
+ {34, kAnim5FrameIndices, kAnim5FrameTicks, kAnim5FrameRects},
+ {1, kAnim6FrameIndices, kAnim6FrameTicks, kAnim6FrameRects},
+ {62, kAnim7FrameIndices, kAnim7FrameTicks, kAnim7FrameRects},
+ {1, kAnim8FrameIndices, kAnim8FrameTicks, kAnim8FrameRects},
+ {11, kAnim9FrameIndices, kAnim9FrameTicks, kAnim9FrameRects},
+ {1, kAnim10FrameIndices, kAnim10FrameTicks, kAnim10FrameRects},
+ {1, kAnim11FrameIndices, kAnim11FrameTicks, kAnim11FrameRects},
+ {1, kAnim12FrameIndices, kAnim12FrameTicks, kAnim12FrameRects},
+ {1, kAnim13FrameIndices, kAnim13FrameTicks, kAnim13FrameRects},
+ {1, kAnim14FrameIndices, kAnim14FrameTicks, kAnim14FrameRects},
+ {1, kAnim15FrameIndices, kAnim15FrameTicks, kAnim15FrameRects},
+ {8, kAnim16FrameIndices, kAnim16FrameTicks, kAnim16FrameRects},
+ {2, kAnim17FrameIndices, kAnim17FrameTicks, kAnim17FrameRects},
+ {49, kAnim18FrameIndices, kAnim18FrameTicks, kAnim18FrameRects},
+ {1, kAnim19FrameIndices, kAnim19FrameTicks, kAnim19FrameRects},
+ {1, kAnim20FrameIndices, kAnim20FrameTicks, kAnim20FrameRects},
+ {1, kAnim21FrameIndices, kAnim21FrameTicks, kAnim21FrameRects},
+ {6, kAnim22FrameIndices, kAnim22FrameTicks, kAnim22FrameRects},
+ {1, kAnim23FrameIndices, kAnim23FrameTicks, kAnim23FrameRects},
+ {6, kAnim24FrameIndices, kAnim24FrameTicks, kAnim24FrameRects},
+ {2, kAnim25FrameIndices, kAnim25FrameTicks, kAnim25FrameRects}
+};
+
+const ObjAnimation *MinigameBbLoogie::getAnimation(int animIndex) {
+ return &kAnimations[animIndex];
+}
+
+} // End of namespace Bbvs
diff --git a/engines/bbvs/minigames/bbtennis.cpp b/engines/bbvs/minigames/bbtennis.cpp
new file mode 100644
index 0000000000..ddd5cfc804
--- /dev/null
+++ b/engines/bbvs/minigames/bbtennis.cpp
@@ -0,0 +1,1274 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+
+ * You should have received a copy of the GNU General Public 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 "bbvs/sound.h"
+#include "bbvs/minigames/bbtennis.h"
+
+namespace Bbvs {
+
+static const int kLeftPlayerOffX[] = {
+ -44, -44, -44, -44, -39, -39, -34,
+ -26, -26, -14, -6, -6, -6, -6
+};
+
+static const int kLeftPlayerOffY[] = {
+ -31, -31, -31, -31, -23, -23, -21,
+ -18, -18, -14, -11, -11, -11, -11
+};
+
+static const char * const kSoundFilenames[] = {
+ "tenis9.aif", "tenis10.aif", "tenis11.aif", "tenis12.aif", "tenis13.aif",
+ "tenis14.aif", "tenis15.aif", "tenis16.aif", "tenis17.aif", "tenis18.aif",
+ "tenis19.aif", "tenis20.aif", "tenis21.aif", "1ahh.aif", "1dammit.aif",
+ "1getawy.aif", "1getthem.aif", "1owww.aif", "1pardon.aif", "1rcktbll.aif",
+ "1yourout.aif", "2hey.aif", "2inhere.aif", "2stoptht.aif", "2theyare.aif",
+ "3oh.aif", "3ow.aif", "3upunks.aif", "tenismus.aif", "canon1.aif",
+ "canon2.aif"
+};
+
+static const uint kSoundFilenamesCount = ARRAYSIZE(kSoundFilenames);
+
+static const int kLeftNetPlayAnims[] = {
+ 13, 15, 17
+};
+
+static const int kRightNetPlayAnims[] = {
+ 14, 16, 18
+};
+
+static const uint kYuppieHitSounds[] = {
+ 14, 15, 18, 22, 26, 27
+};
+
+static const uint kYuppieEnteringCourtSounds[] = {
+ 19, 20
+};
+
+static const uint kYuppieChargeSounds[] = {
+ 16, 17, 23, 24, 28, 0
+};
+
+static const uint kAllSounds[] = {
+ 3, 4, 7, 9, 19, 20, 16, 17, 23, 24, 28
+};
+
+void MinigameBbTennis::buildDrawList(DrawList &drawList) {
+ switch (_gameState) {
+ case 0:
+ buildDrawList0(drawList);
+ break;
+ case 1:
+ buildDrawList1(drawList);
+ break;
+ case 2:
+ buildDrawList2(drawList);
+ break;
+ }
+}
+
+void MinigameBbTennis::buildDrawList0(DrawList &drawList) {
+
+ drawList.add(_objects[0].anim->frameIndices[_objects[0].frameIndex], _objects[0].x, _objects[0].y, 2000);
+
+ for (int i = 0; i < kMaxObjectsCount; ++i) {
+ Obj *obj = &_objects[i];
+ if (obj->kind)
+ drawList.add(obj->anim->frameIndices[obj->frameIndex], obj->x, obj->y, obj->y + 16);
+ }
+
+ if (_titleScreenSpriteIndex > 0)
+ drawList.add(_titleScreenSpriteIndex, 0, 0, 0);
+
+}
+
+void MinigameBbTennis::buildDrawList1(DrawList &drawList) {
+
+ for (int i = 0; i < kMaxObjectsCount; ++i) {
+ Obj *obj = &_objects[i];
+
+ if (obj->kind) {
+ int index = obj->anim->frameIndices[obj->frameIndex];
+ int x = obj->x;
+ int y = obj->y;
+ int priority = obj->y + 16;
+
+ switch (obj->kind) {
+
+ case 1:
+ priority = 3000;
+ break;
+
+ case 2:
+ priority = 550;
+ if (obj->frameIndex == 0)
+ drawList.add(obj->anim->frameIndices[8], obj->x, obj->y, 550);
+ break;
+
+ case 6:
+ if (obj->frameIndex == 31) {
+ y = 640;
+ index = obj->anim->frameIndices[26];
+ }
+ if (obj->status == 4) {
+ --obj->blinkCtr;
+ if (obj->blinkCtr % 2)
+ y = 600;
+ if (obj->blinkCtr == 0)
+ obj->kind = 0;
+ }
+ break;
+
+ case 7:
+ priority = 540;
+ if (obj->frameIndex == 0)
+ drawList.add(obj->anim->frameIndices[8], obj->x, obj->y, 550);
+ break;
+
+ case 4:
+ if (obj->status == 8) {
+ --obj->blinkCtr;
+ if (obj->blinkCtr % 2)
+ y = 600;
+ if (obj->blinkCtr == 0)
+ obj->kind = 0;
+ }
+ break;
+
+ }
+
+ drawList.add(index, x, y, priority);
+
+ }
+ }
+
+ if (_rapidFireBallsCount > 0) {
+ drawList.add(getAnimation(19)->frameIndices[0], 24, 208, 990);
+ drawList.add(getAnimation(20)->frameIndices[_rapidFireBallsCount / 10 % 10], 19, 198, 2000);
+ drawList.add(getAnimation(20)->frameIndices[_rapidFireBallsCount % 10], 29, 198, 2000);
+
+ }
+
+ if (_backgroundSpriteIndex > 0)
+ drawList.add(_backgroundSpriteIndex, 0, 0, 0);
+
+ drawList.add(getAnimation(8)->frameIndices[0], 9, 53, 500);
+ drawList.add(getAnimation(9)->frameIndices[0], 256, 52, 500);
+ drawList.add(getAnimation(10)->frameIndices[0], 60, 162, 500);
+ drawList.add(getAnimation(21)->frameIndices[0], 36, 18, 2000);
+
+ drawNumber(drawList, _score, 70, 18);
+
+ for (int i = 0; i < _numHearts; ++i)
+ drawList.add(getAnimation(7)->frameIndices[0], 20 + i * 20, 236, 990);
+
+}
+
+void MinigameBbTennis::buildDrawList2(DrawList &drawList) {
+
+ for (int i = 0; i < kMaxObjectsCount; ++i) {
+ Obj *obj = &_objects[i];
+ if (obj->kind)
+ drawList.add(obj->anim->frameIndices[obj->frameIndex], obj->x, obj->y, obj->y + 16);
+ }
+
+ if (_backgroundSpriteIndex > 0)
+ drawList.add(_backgroundSpriteIndex, 0, 0, 0);
+
+ drawList.add(getAnimation(21)->frameIndices[0], 36, 18, 2000);
+
+ drawNumber(drawList, _score, 70, 18);
+
+ drawList.add(getAnimation(22)->frameIndices[0], 120, 70, 2000);
+ drawList.add(getAnimation(23)->frameIndices[0], 95, 95, 2000);
+
+ drawNumber(drawList, _hiScore, 210, 109);
+
+}
+
+void MinigameBbTennis::drawSprites() {
+ DrawList drawList;
+ buildDrawList(drawList);
+ _vm->_screen->drawDrawList(drawList, _spriteModule);
+ _vm->_screen->copyToScreen();
+}
+
+void MinigameBbTennis::initObjs() {
+ for (int i = 0; i < kMaxObjectsCount; ++i)
+ _objects[i].kind = 0;
+}
+
+MinigameBbTennis::Obj *MinigameBbTennis::getFreeObject() {
+ for (int i = 0; i < kMaxObjectsCount; ++i)
+ if (_objects[i].kind == 0)
+ return &_objects[i];
+ return 0;
+}
+
+MinigameBbTennis::Obj *MinigameBbTennis::findTennisBall(int startObjIndex) {
+ for (int i = startObjIndex; i < kMaxObjectsCount; ++i)
+ if (_objects[i].kind == 2)
+ return &_objects[i];
+ return 0;
+}
+
+bool MinigameBbTennis::isHit(Obj *obj1, Obj *obj2) {
+ const BBRect &frameRect1 = obj1->anim->frameRects[obj1->frameIndex];
+ const BBRect &frameRect2 = obj2->anim->frameRects[obj2->frameIndex];
+ const int obj1X1 = obj1->x + frameRect1.x;
+ const int obj1Y1 = obj1->y + frameRect1.y;
+ const int obj1X2 = obj1X1 + frameRect1.width;
+ const int obj1Y2 = obj1Y1 + frameRect1.height;
+ const int obj2X1 = obj2->x + frameRect2.x;
+ const int obj2Y1 = obj2->y + frameRect2.y;
+ const int obj2X2 = obj2X1 + frameRect2.width;
+ const int obj2Y2 = obj2Y1 + frameRect2.height;
+ return obj1X1 <= obj2X2 && obj1X2 >= obj2X1 && obj1Y1 <= obj2Y2 && obj1Y2 >= obj2Y1;
+}
+
+void MinigameBbTennis::initObjects() {
+ switch (_gameState) {
+ case 0:
+ initObjects0();
+ break;
+ case 1:
+ initObjects1();
+ break;
+ case 2:
+ initObjects2();
+ break;
+ }
+}
+
+void MinigameBbTennis::initObjects0() {
+ _objects[0].anim = getAnimation(24);
+ _objects[0].frameIndex = 0;
+ _objects[0].ticks = getAnimation(24)->frameTicks[0];
+ _objects[0].x = 160;
+ _objects[0].y = 100;
+ _objects[0].kind = 1;
+ _objects[1].anim = getAnimation(25);
+ _objects[1].frameIndex = 0;
+ _objects[1].ticks = getAnimation(25)->frameTicks[0];
+ _objects[1].x = 40;
+ _objects[1].y = 240;
+ _objects[1].kind = 2;
+ _objects[2].anim = getAnimation(26);
+ _objects[2].frameIndex = 0;
+ _objects[2].ticks = getAnimation(26)->frameTicks[0];
+ _objects[2].x = 280;
+ _objects[2].y = 240;
+ _objects[2].kind = 2;
+}
+
+void MinigameBbTennis::initObjects1() {
+ _objects[0].anim = getAnimation(5);
+ _objects[0].frameIndex = 0;
+ _objects[0].ticks = getAnimation(5)->frameTicks[0];
+ _objects[0].status = 0;
+ _objects[0].x = 160;
+ _objects[0].y = 100;
+ _objects[0].kind = 1;
+ for (int i = 1; i < kMaxObjectsCount; ++i)
+ _objects[i].kind = 0;
+}
+
+void MinigameBbTennis::initObjects2() {
+ // Nothing
+}
+
+void MinigameBbTennis::initVars() {
+ switch (_gameState) {
+ case 0:
+ initVars0();
+ break;
+ case 1:
+ initVars1();
+ break;
+ case 2:
+ initVars2();
+ break;
+ }
+}
+
+void MinigameBbTennis::initVars0() {
+ // Nothing
+}
+
+void MinigameBbTennis::initVars1() {
+ _numHearts = 15;
+ _allHeartsGone = false;
+ _squirrelDelay = 500;
+ _tennisPlayerDelay = 300;
+ _throwerDelay = 400;
+ _netPlayerDelay = 340;
+ _playerDecrease = 0;
+ _delayDecreaseTimer = 0;
+ _numBalls = 0;
+ _newBallTimer = 1;
+ _initBallTimer = 10;
+ _maxBalls = 5;
+ _rapidFireBallsCount = 0;
+ _score = 0;
+ _hitMissRatio = 0;
+ _playedThisIsTheCoolest = false;
+ _startSoundPlayed = false;
+ _endSoundPlaying = false;
+ stopSound(12);
+}
+
+void MinigameBbTennis::initVars2() {
+ if (_score > _hiScore)
+ _hiScore = _score;
+}
+
+bool MinigameBbTennis::updateStatus(int mouseX, int mouseY, uint mouseButtons) {
+ switch (_gameState) {
+ case 0:
+ return updateStatus0(mouseX, mouseY, mouseButtons);
+ case 1:
+ return updateStatus1(mouseX, mouseY, mouseButtons);
+ case 2:
+ return updateStatus2(mouseX, mouseY, mouseButtons);
+ }
+ return false;
+}
+
+bool MinigameBbTennis::updateStatus0(int mouseX, int mouseY, uint mouseButtons) {
+
+ if ((mouseButtons & kLeftButtonDown) || (mouseButtons & kRightButtonDown)) {
+ _gameState = 1;
+ initObjects();
+ initVars();
+ _gameTicks = 0;
+ return true;
+ }
+
+ _objects[0].x = mouseX;
+ _objects[0].y = mouseY;
+
+ for (int i = 0; i < kMaxObjectsCount; ++i) {
+ Obj *obj = &_objects[i];
+ if (obj->kind == 2) {
+ if (--obj->ticks == 0) {
+ ++obj->frameIndex;
+ if (obj->frameIndex >= obj->anim->frameCount)
+ obj->frameIndex = 0;
+ obj->ticks = obj->anim->frameTicks[obj->frameIndex];
+ }
+ }
+ }
+
+ return true;
+}
+
+bool MinigameBbTennis::updateStatus1(int mouseX, int mouseY, uint mouseButtons) {
+
+ _objects[0].x = mouseX;
+ _objects[0].y = mouseY;
+
+ if (_allHeartsGone) {
+ _gameState = 2;
+ initObjects();
+ initVars();
+ _gameTicks = 0;
+ return true;
+ }
+
+ if (!_startSoundPlayed) {
+ playSound(12);
+ _startSoundPlayed = true;
+ }
+
+ if (((mouseButtons & kLeftButtonClicked) || (_rapidFireBallsCount > 0 && (mouseButtons & kLeftButtonDown))) &&
+ _newBallTimer == 0 && _numBalls < _maxBalls) {
+ // Insert a ball
+ Obj *obj = getFreeObject();
+ obj->anim = getAnimation(6);
+ obj->frameIndex = 0;
+ obj->ticks = getAnimation(6)->frameTicks[0];
+ obj->x = 160;
+ obj->y = 240;
+ obj->kind = 2;
+ obj->targetX = mouseX;
+ obj->targetY = mouseY;
+ obj->ballStep = 12;
+ obj->ballStepCtr = 0;
+ obj->fltX = 160.0f;
+ obj->fltY = 240.0f;
+ obj->fltStepX = ((160 - mouseX) * 0.75f) / 12.0f;
+ obj->fltStepY = ((240 - mouseY) * 0.75f) / 12.0f;
+ _newBallTimer = _initBallTimer;
+ ++_numBalls;
+ playSound(31);
+ if (_rapidFireBallsCount > 0 && --_rapidFireBallsCount == 0) {
+ _initBallTimer = 10;
+ _maxBalls = 5;
+ }
+ }
+
+ if (_newBallTimer > 0)
+ --_newBallTimer;
+
+ if (++_delayDecreaseTimer == 30) {
+ _delayDecreaseTimer = 0;
+ if (_playerDecrease < 199)
+ ++_playerDecrease;
+ }
+
+ updateObjs();
+
+ if (!_playedThisIsTheCoolest && _score > 3 && _vm->getRandom(10) == 1 && !isAnySoundPlaying(kAllSounds, 11)) {
+ _playedThisIsTheCoolest = true;
+ playSound(9);
+ }
+
+ return true;
+}
+
+bool MinigameBbTennis::updateStatus2(int mouseX, int mouseY, uint mouseButtons) {
+ if (_endSoundPlaying) {
+ if (!isSoundPlaying(21) && _fromMainGame) {
+ //_vm->delayMillis(1000);
+ _gameDone = true;
+ }
+ } else {
+ playSound(21);
+ _endSoundPlaying = true;
+ }
+ return true;
+}
+
+void MinigameBbTennis::updateObjs() {
+
+ for (int i = 0; i < kMaxObjectsCount; ++i) {
+ Obj *obj = &_objects[i];
+ switch (obj->kind) {
+ case 2:
+ updateTennisBall(i);
+ break;
+ case 3:
+ updateSquirrel(i);
+ break;
+ case 4:
+ updateTennisPlayer(i);
+ break;
+ case 5:
+ updateThrower(i);
+ break;
+ case 6:
+ updateNetPlayer(i);
+ break;
+ case 7:
+ updateEnemyTennisBall(i);
+ break;
+ }
+ }
+
+ if (_rapidFireBallsCount == 0) {
+ --_squirrelDelay;
+ if (--_squirrelDelay == 0) {
+ Obj *obj = getFreeObject();
+ obj->kind = 3;
+ obj->x = 100;
+ obj->y = 69;
+ obj->anim = getAnimation(1);
+ obj->frameIndex = 0;
+ obj->ticks = getAnimation(1)->frameTicks[0];
+ obj->status = 0;
+ obj->blinkCtr = _vm->getRandom(128) + 10;
+ _squirrelDelay = _vm->getRandom(512) + 1000;
+ }
+ }
+
+ if (--_tennisPlayerDelay == 0) {
+ Obj *obj = getFreeObject();
+ obj->kind = 4;
+ obj->y = 146;
+ obj->anim = getAnimation(11);
+ obj->ticks = getAnimation(11)->frameTicks[0];
+ if (_vm->getRandom(2) == 1) {
+ obj->x = 40;
+ obj->frameIndex = 0;
+ obj->status = 0;
+ } else {
+ obj->x = _vm->getRandom(2) == 1 ? 40 : 274;
+ obj->frameIndex = 16;
+ obj->status = 4;
+ }
+ obj->blinkCtr = _vm->getRandom(64) + 60;
+ _tennisPlayerDelay = _vm->getRandom(128) + 400 - _playerDecrease;
+ if (_vm->getRandom(10) == 1 && !isAnySoundPlaying(kAllSounds, 0x11))
+ playSound(kYuppieEnteringCourtSounds[_vm->getRandom(2)]);
+ }
+
+ if (--_throwerDelay == 0) {
+ Obj *obj = getFreeObject();
+ obj->kind = 5;
+ obj->x = 50;
+ obj->y = 62;
+ obj->anim = getAnimation(12);
+ obj->frameIndex = 0;
+ obj->ticks = getAnimation(12)->frameTicks[0];
+ obj->status = 0;
+ _throwerDelay = _vm->getRandom(128) + 200 - _playerDecrease;
+ if (_vm->getRandom(10) == 1 && !isAnySoundPlaying(kAllSounds, 11))
+ playSound(kYuppieChargeSounds[_vm->getRandom(2)]);
+ }
+
+ if (--_netPlayerDelay == 0) {
+ Obj *obj = getFreeObject();
+ obj->kind = 6;
+ obj->y = 176;
+ if (_vm->getRandom(2) == 1) {
+ obj->x = 110;
+ obj->netPlayDirection = 1;
+ obj->anim = getAnimation(kLeftNetPlayAnims[_vm->getRandom(3)]);
+ } else {
+ obj->x = 216;
+ obj->netPlayDirection = 0;
+ obj->anim = getAnimation(kRightNetPlayAnims[_vm->getRandom(3)]);
+ }
+ obj->frameIndex = 1;
+ obj->ticks = obj->anim->frameTicks[1];
+ obj->status = 0;
+ obj->blinkCtr = 1;
+ _netPlayerDelay = _vm->getRandom(128) + 250 - _playerDecrease;
+ if (_vm->getRandom(10) == 1 && !isAnySoundPlaying(kAllSounds, 11))
+ playSound(kYuppieChargeSounds[_vm->getRandom(2)]);
+ }
+
+}
+
+void MinigameBbTennis::updateTennisBall(int objIndex) {
+ Obj *obj = &_objects[objIndex];
+
+ if (--obj->ticks == 0) {
+ ++obj->frameIndex;
+ if (obj->frameIndex == 7) {
+ obj->kind = 0;
+ --_numBalls;
+ if (_hitMissRatio > 0) {
+ if (--_hitMissRatio == 0 && _vm->getRandom(8) == 1 && !isAnySoundPlaying(kAllSounds, 11))
+ playSound(3);
+ } else {
+ if (_vm->getRandom(10) == 1 && !isAnySoundPlaying(kAllSounds, 11))
+ playSound(3);
+ }
+ return;
+ }
+ obj->ticks = getAnimation(6)->frameTicks[obj->frameIndex];
+ }
+
+ if (--obj->ballStep == 0) {
+ obj->ballStep = 12;
+ ++obj->ballStepCtr;
+ if (obj->ballStepCtr == 1) {
+ obj->fltStepX = ((obj->fltX - (float)obj->targetX) * 0.75f) / 12.0f;
+ obj->fltStepY = ((obj->fltY - (float)obj->targetY) * 0.75f) / 12.0f;
+ } else if (obj->ballStepCtr == 2) {
+ obj->fltStepX = (obj->fltX - (float)obj->targetX) / 12.0f;
+ obj->fltStepY = (obj->fltY - (float)obj->targetY) / 12.0f;
+ } else {
+ obj->fltStepX = 0.0f;
+ obj->fltStepY = 0.0f;
+ }
+ }
+
+ obj->fltX = obj->fltX - obj->fltStepX;
+ obj->x = (int)obj->fltX;
+ obj->fltY = obj->fltY - obj->fltStepY;
+ obj->y = (int)obj->fltY;
+
+}
+
+void MinigameBbTennis::updateSquirrel(int objIndex) {
+ Obj *obj = &_objects[objIndex];
+
+ switch (obj->status) {
+
+ case 0:
+ --obj->ticks;
+ if (--obj->ticks == 0) {
+ if (++obj->frameIndex == 4) {
+ obj->anim = getAnimation(0);
+ obj->frameIndex = 0;
+ obj->ticks = getAnimation(0)->frameTicks[0];
+ obj->y += 2;
+ ++obj->status;
+ } else {
+ obj->ticks = getAnimation(1)->frameTicks[obj->frameIndex];
+ ++_squirrelDelay;
+ }
+ } else {
+ ++_squirrelDelay;
+ }
+ break;
+
+ case 1:
+ if (--obj->ticks == 0) {
+ ++obj->frameIndex;
+ if (obj->frameIndex == 4)
+ obj->frameIndex = 0;
+ obj->ticks = getAnimation(0)->frameTicks[obj->frameIndex];
+ }
+ ++obj->x;
+ if (obj->x < 230) {
+ if (--obj->blinkCtr <= 0) {
+ obj->anim = getAnimation(4);
+ obj->frameIndex = 0;
+ obj->ticks = getAnimation(4)->frameTicks[obj->frameIndex];
+ obj->status = 3;
+ }
+ ++_squirrelDelay;
+ } else {
+ obj->anim = getAnimation(2);
+ obj->frameIndex = 0;
+ obj->ticks = getAnimation(2)->frameTicks[0];
+ obj->y -= 2;
+ ++obj->status;
+ }
+ break;
+
+ case 2:
+ if (--obj->ticks == 0) {
+ if (++obj->frameIndex == 4) {
+ obj->kind = 0;
+ } else {
+ obj->ticks = getAnimation(2)->frameTicks[0];
+ ++_squirrelDelay;
+ }
+ } else {
+ ++_squirrelDelay;
+ }
+ break;
+
+ case 3:
+ if (--obj->ticks) {
+ if (++obj->frameIndex == 2) {
+ obj->anim = getAnimation(0);
+ obj->frameIndex = 0;
+ obj->ticks = getAnimation(0)->frameTicks[0];
+ obj->status = 1;
+ obj->blinkCtr = _vm->getRandom(128) + 10;
+ } else {
+ obj->ticks = getAnimation(4)->frameTicks[obj->frameIndex];
+ ++_squirrelDelay;
+ }
+ } else {
+ ++_squirrelDelay;
+ }
+ break;
+
+ case 4:
+ if (--obj->ticks == 0) {
+ if (++obj->frameIndex == 5) {
+ obj->kind = 0;
+ } else {
+ obj->ticks = getAnimation(3)->frameTicks[obj->frameIndex];
+ ++_squirrelDelay;
+ }
+ } else {
+ ++_squirrelDelay;
+ }
+ break;
+
+ }
+
+ if (obj->status != 4) {
+ int tennisBallObjIndex = 0;
+ Obj *tennisBallObj = findTennisBall(tennisBallObjIndex++);
+ while (tennisBallObj) {
+ if (tennisBallObj->frameIndex >= 6 && isHit(obj, tennisBallObj)) {
+ hitSomething();
+ tennisBallObj->kind = 0;
+ --_numBalls;
+ obj->status = 4;
+ obj->anim = getAnimation(3);
+ obj->frameIndex = 0;
+ obj->ticks = getAnimation(3)->frameTicks[0];
+ _rapidFireBallsCount = 50;
+ _maxBalls = 10;
+ _initBallTimer = 6;
+ if (!isAnySoundPlaying(kAllSounds, 11))
+ playSound(4);
+ break;
+ }
+ tennisBallObj = findTennisBall(tennisBallObjIndex++);
+ }
+ }
+
+}
+
+void MinigameBbTennis::updateTennisPlayer(int objIndex) {
+ Obj *obj = &_objects[objIndex];
+
+ switch (obj->status) {
+
+ case 0:
+ if (--obj->ticks == 0) {
+ ++obj->frameIndex;
+ if (obj->frameIndex == 6)
+ obj->frameIndex = 0;
+ obj->ticks = getAnimation(11)->frameTicks[0];
+ }
+ ++obj->x;
+ if (obj->x == 280)
+ obj->kind = 0;
+ --obj->blinkCtr;
+ if (obj->blinkCtr <= 0) {
+ obj->frameIndex = 6;
+ obj->ticks = getAnimation(11)->frameTicks[6];
+ ++obj->status;
+ }
+ ++_tennisPlayerDelay;
+ break;
+
+ case 1:
+ if (--obj->ticks == 0) {
+ if (++obj->frameIndex == 9) {
+ if (obj->x < 210) {
+ obj->frameIndex = 9;
+ obj->status = 2;
+ } else {
+ obj->frameIndex = 15;
+ obj->status = 3;
+ }
+ obj->blinkCtr = _vm->getRandom(64) + 40;
+ }
+ obj->ticks = getAnimation(11)->frameTicks[obj->frameIndex];
+ }
+ if ((obj->ticks % 2) && obj->frameIndex != 8) {
+ ++obj->x;
+ if (obj->x == 280)
+ obj->kind = 0;
+ }
+ ++_tennisPlayerDelay;
+ break;
+
+ case 2:
+ if (--obj->ticks == 0) {
+ ++obj->frameIndex;
+ if (obj->frameIndex == 15)
+ ++obj->status;
+ obj->ticks = getAnimation(11)->frameTicks[obj->frameIndex];
+ if (obj->frameIndex == 13)
+ makeEnemyBall(obj->x, obj->y - 31, 4);
+ }
+ ++_tennisPlayerDelay;
+ break;
+
+ case 3:
+ if (--obj->ticks == 0) {
+ ++obj->status;
+ obj->frameIndex = 16;
+ obj->ticks = getAnimation(11)->frameTicks[16];
+ }
+ if (obj->ticks % 2) {
+ --obj->x;
+ if (obj->x <= 40)
+ obj->kind = 0;
+ } else
+ ++_tennisPlayerDelay;
+ break;
+
+ case 4:
+ if (--obj->ticks == 0) {
+ ++obj->frameIndex;
+ if (obj->frameIndex == 22)
+ obj->frameIndex = 16;
+ obj->ticks = getAnimation(11)->frameTicks[obj->frameIndex];
+ }
+ --obj->x;
+ if (obj->x > 40) {
+ if (--obj->blinkCtr <= 0) {
+ ++obj->status;
+ obj->frameIndex = 22;
+ obj->ticks = getAnimation(11)->frameTicks[22];
+ }
+ ++_tennisPlayerDelay;
+ } else {
+ obj->kind = 0;
+ }
+ break;
+
+ case 5:
+ if (--obj->ticks == 0) {
+ ++obj->frameIndex;
+ if (obj->frameIndex == 25) {
+ if (obj->x <= 70) {
+ obj->frameIndex = 33;
+ obj->status = 7;
+ } else {
+ obj->frameIndex = 25;
+ obj->status = 6;
+ }
+ obj->blinkCtr = _vm->getRandom(64) + 40;
+ }
+ obj->ticks = getAnimation(11)->frameTicks[obj->frameIndex];
+ }
+ if ((obj->ticks % 2) && obj->frameIndex != 24) {
+ --obj->x;
+ if (obj->x <= 40)
+ obj->kind = 0;
+ } else
+ ++_tennisPlayerDelay;
+ break;
+
+ case 6:
+ if (--obj->ticks == 0) {
+ ++obj->frameIndex;
+ if (obj->frameIndex == 33)
+ ++obj->status;
+ obj->ticks = getAnimation(11)->frameTicks[obj->frameIndex];
+ if (obj->frameIndex == 31)
+ makeEnemyBall(obj->x + 8, obj->y - 49, 4);
+ }
+ ++_tennisPlayerDelay;
+ break;
+
+ case 7:
+ if (--obj->ticks == 0) {
+ obj->frameIndex = 0;
+ obj->ticks = getAnimation(11)->frameTicks[0];
+ obj->status = 0;
+ }
+ if (obj->ticks % 2) {
+ ++obj->x;
+ if (obj->x == 280)
+ obj->kind = 0;
+ }
+ ++_tennisPlayerDelay;
+ break;
+
+ case 8:
+ break;
+
+ }
+
+ if (obj->status != 8) {
+ int tennisBallObjIndex = 0;
+ Obj *tennisBallObj = findTennisBall(tennisBallObjIndex++);
+ while (tennisBallObj) {
+ if (tennisBallObj->frameIndex >= 6 && isHit(obj, tennisBallObj)) {
+ hitSomething();
+ tennisBallObj->kind = 0;
+ --_numBalls;
+ obj->status = 8;
+ obj->blinkCtr = 20;
+ playSound(kYuppieHitSounds[_vm->getRandom(6)]);
+ break;
+ }
+ tennisBallObj = findTennisBall(tennisBallObjIndex++);
+ }
+ }
+
+}
+
+void MinigameBbTennis::updateThrower(int objIndex) {
+ Obj *obj = &_objects[objIndex];
+
+ switch (obj->status) {
+
+ case 0:
+ if (--obj->ticks == 0) {
+ ++obj->frameIndex;
+ if (obj->frameIndex == 4)
+ ++obj->status;
+ obj->ticks = getAnimation(12)->frameTicks[obj->frameIndex];
+ }
+ ++_throwerDelay;
+ break;
+
+ case 1:
+ if (--obj->ticks == 0) {
+ ++obj->frameIndex;
+ if (obj->frameIndex == 8)
+ ++obj->status;
+ obj->ticks = getAnimation(12)->frameTicks[obj->frameIndex];
+ if (obj->frameIndex == 7)
+ makeEnemyBall(obj->x - 10, obj->y - 10, 3);
+ }
+ ++_throwerDelay;
+ break;
+
+ case 2:
+ --obj->ticks;
+ if (--obj->ticks == 0) {
+ ++obj->frameIndex;
+ if (obj->frameIndex == 12) {
+ obj->kind = 0;
+ } else {
+ obj->ticks = getAnimation(12)->frameTicks[obj->frameIndex];
+ ++_throwerDelay;
+ }
+ } else {
+ ++_throwerDelay;
+ }
+ break;
+
+ case 3:
+ --obj->ticks;
+ if (--obj->ticks == 0) {
+ ++obj->frameIndex;
+ if (obj->frameIndex == 14) {
+ obj->kind = 0;
+ } else {
+ obj->ticks = getAnimation(12)->frameTicks[obj->frameIndex];
+ ++_throwerDelay;
+ }
+ } else {
+ ++_throwerDelay;
+ }
+ break;
+
+ }
+
+ if (obj->status != 3) {
+ int tennisBallObjIndex = 0;
+ Obj *tennisBallObj = findTennisBall(tennisBallObjIndex++);
+ while (tennisBallObj) {
+ if (tennisBallObj->frameIndex >= 5 && tennisBallObj->frameIndex <= 7 && isHit(obj, tennisBallObj)) {
+ hitSomething();
+ tennisBallObj->kind = 0;
+ --_numBalls;
+ obj->status = 3;
+ obj->frameIndex = 12;
+ obj->ticks = getAnimation(12)->frameTicks[12];
+ playSound(kYuppieHitSounds[_vm->getRandom(6)]);
+ break;
+ }
+ tennisBallObj = findTennisBall(tennisBallObjIndex++);
+ }
+ }
+
+}
+
+void MinigameBbTennis::updateNetPlayer(int objIndex) {
+ Obj *obj = &_objects[objIndex];
+
+ switch (obj->status) {
+
+ case 0:
+ if (--obj->ticks == 0) {
+ ++obj->frameIndex;
+ if (obj->frameIndex == 15) {
+ obj->blinkCtr = _vm->getRandom(32) + 10;
+ ++obj->status;
+ obj->frameIndex = 31;
+ } else {
+ obj->ticks = obj->anim->frameTicks[obj->frameIndex];
+ ++_netPlayerDelay;
+ }
+ } else {
+ ++_netPlayerDelay;
+ }
+ break;
+
+ case 1:
+ if (--obj->blinkCtr <= 0) {
+ ++obj->status;
+ obj->frameIndex = 15;
+ obj->ticks = obj->anim->frameTicks[15];
+ obj->x = _vm->getRandom(128) + 100;
+ }
+ ++_netPlayerDelay;
+ break;
+
+ case 2:
+ if (--obj->ticks == 0) {
+ ++obj->frameIndex;
+ if (obj->frameIndex == 24) {
+ ++obj->status;
+ obj->frameIndex = 28;
+ }
+ obj->ticks = obj->anim->frameTicks[obj->frameIndex];
+ if (obj->frameIndex == 23)
+ makeEnemyBall(obj->x - 8, obj->y - 40, 3);
+ }
+ ++_netPlayerDelay;
+ break;
+
+ case 3:
+ if (--obj->ticks == 0) {
+ ++obj->frameIndex;
+ if (obj->frameIndex == 31) {
+ obj->status = 1;
+ obj->frameIndex = 31;
+ obj->blinkCtr = _vm->getRandom(32) + 10;
+ } else {
+ obj->ticks = obj->anim->frameTicks[obj->frameIndex];
+ ++_netPlayerDelay;
+ }
+ } else {
+ ++_netPlayerDelay;
+ }
+ break;
+
+ case 5:
+ if (--obj->ticks == 0) {
+ ++obj->frameIndex;
+ if (obj->frameIndex == 27)
+ obj->kind = 0;
+ obj->ticks = obj->anim->frameTicks[obj->frameIndex];
+ }
+ break;
+
+ case 4:
+ break;
+
+ }
+
+ if (obj->status < 4 && obj->frameIndex != 31) {
+ int tennisBallObjIndex = 0;
+ Obj *tennisBallObj = findTennisBall(tennisBallObjIndex++);
+ while (tennisBallObj) {
+ if (obj->status == 0 && tennisBallObj->frameIndex >= 3 && tennisBallObj->frameIndex <= 6 &&
+ isHit(obj, tennisBallObj)) {
+ hitSomething();
+ tennisBallObj->kind = 0;
+ --_numBalls;
+ if (obj->netPlayDirection) {
+ obj->x += kLeftPlayerOffX[obj->frameIndex] + 10;
+ obj->y += kLeftPlayerOffY[obj->frameIndex] + 10;
+ } else {
+ obj->x -= kLeftPlayerOffX[obj->frameIndex] + 12;
+ obj->y += kLeftPlayerOffY[obj->frameIndex] + 10;
+ }
+ obj->status = 4;
+ obj->frameIndex = 0;
+ obj->blinkCtr = 20;
+ playSound(kYuppieHitSounds[_vm->getRandom(6)]);
+ break;
+ } else if (obj->status > 1 && obj->status < 4 && tennisBallObj->frameIndex >= 3 && tennisBallObj->frameIndex <= 4 &&
+ isHit(obj, tennisBallObj)) {
+ hitSomething();
+ tennisBallObj->kind = 0;
+ --_numBalls;
+ obj->status = 5;
+ obj->frameIndex = 24;
+ obj->ticks = obj->anim->frameTicks[24];
+ playSound(kYuppieHitSounds[_vm->getRandom(6)]);
+ break;
+ }
+ tennisBallObj = findTennisBall(tennisBallObjIndex++);
+ }
+ }
+
+}
+
+void MinigameBbTennis::updateEnemyTennisBall(int objIndex) {
+ Obj *obj = &_objects[objIndex];
+
+ if (--obj->ticks == 0) {
+ --obj->frameIndex;
+ obj->ticks = getAnimation(6)->frameTicks[obj->frameIndex];
+ }
+
+ if (--obj->ballStep == 0) {
+ obj->ballStep = 12;
+ --obj->ballStepCtr;
+ if (obj->ballStepCtr == 1) {
+ obj->fltStepX = (obj->fltX - (float)obj->targetX) / 12.0f;
+ obj->fltStepY = (obj->fltY - (float)obj->targetY) / 12.0f;
+ } else if (obj->ballStepCtr == 2) {
+ obj->fltStepX = ((obj->fltX - (float)obj->targetX) * 0.18f) / 12.0f;
+ obj->fltStepY = ((obj->fltY - (float)obj->targetY) * 0.18f) / 12.0f;
+ } else {
+ obj->kind = 0;
+ if (_numHearts > 0 && --_numHearts == 0)
+ _allHeartsGone = true;
+ }
+ }
+
+ obj->fltX = obj->fltX - obj->fltStepX;
+ obj->x = (int)obj->fltX;
+ obj->fltY = obj->fltY - obj->fltStepY;
+ obj->y = (int)obj->fltY;
+
+}
+
+void MinigameBbTennis::makeEnemyBall(int x, int y, int frameIndex) {
+ Obj *obj = getFreeObject();
+
+ obj->kind = 7;
+ obj->x = x;
+ obj->y = y;
+ obj->anim = getAnimation(6);
+ obj->frameIndex = frameIndex;
+ obj->ticks = getAnimation(6)->frameTicks[frameIndex];
+ obj->targetX = 160;
+ obj->targetY = 180;
+ obj->fltX = (float)x;
+ obj->fltY = (float)y;
+
+ switch (frameIndex) {
+
+ case 6:
+ obj->ballStep = 18;
+ obj->ballStepCtr = 3;
+ obj->fltStepX = 0.0f;
+ obj->fltStepY = 0.0f;
+ break;
+
+ case 5:
+ obj->ballStep = 12;
+ obj->ballStepCtr = 3;
+ obj->fltStepX = ((float)(x - 160) * 0.07f) / 12.0f;
+ obj->fltStepY = ((float)(y - 180) * 0.07f) / 12.0f;
+ break;
+
+ case 4:
+ obj->ballStep = 6;
+ obj->ballStepCtr = 3;
+ obj->fltStepX = ((float)(x - 160) * 0.07f) / 6.0f;
+ obj->fltStepY = ((float)(y - 180) * 0.07f) / 6.0f;
+ break;
+
+ case 3:
+ obj->ballStep = 12;
+ obj->ballStepCtr = 2;
+ obj->fltStepX = ((float)(x - 160) * 0.18f) / 12.0f;
+ obj->fltStepY = ((float)(y - 180) * 0.18f) / 12.0f;
+ break;
+
+ case 2:
+ obj->ballStep = 6;
+ obj->ballStepCtr = 2;
+ obj->fltStepX = ((float)(x - 160) * 0.18f) / 6.0f;
+ obj->fltStepY = ((float)(y - 180) * 0.18f) / 6.0f;
+ break;
+
+ case 1:
+ obj->ballStep = 12;
+ obj->ballStepCtr = 1;
+ obj->fltStepX = (float)((x - 160) / 12);
+ obj->fltStepY = (float)((y - 180) / 12);
+ break;
+
+ case 0:
+ obj->ballStep = 6;
+ obj->ballStepCtr = 1;
+ obj->fltStepX = (float)((x - 160) / 6);
+ obj->fltStepY = (float)((y - 180) / 6);
+ break;
+
+ }
+
+}
+
+void MinigameBbTennis::hitSomething() {
+ if (_hitMissRatio < 15)
+ _hitMissRatio += 3;
+ ++_score;
+}
+
+bool MinigameBbTennis::run(bool fromMainGame) {
+
+ memset(_objects, 0, sizeof(_objects));
+
+ _numbersAnim = getAnimation(20);
+
+ _backgroundSpriteIndex = 272;
+ _titleScreenSpriteIndex = 273;
+
+ _fromMainGame = fromMainGame;
+
+ _hiScore = 0;
+ if (!_fromMainGame)
+ _hiScore = loadHiscore(kMinigameBbTennis);
+
+ _gameState = 0;
+ _gameResult = false;
+ _gameDone = false;
+ initObjects();
+ initVars();
+
+ _spriteModule = new SpriteModule();
+ _spriteModule->load("bbtennis/bbtennis.000");
+
+ Palette palette = _spriteModule->getPalette();
+ _vm->_screen->setPalette(palette);
+
+ loadSounds();
+
+ _gameTicks = 0;
+ playSound(29, true);
+
+ while (!_vm->shouldQuit() &&!_gameDone) {
+ _vm->updateEvents();
+ update();
+ }
+
+ _vm->_sound->unloadSounds();
+
+ if (!_fromMainGame)
+ saveHiscore(kMinigameBbTennis, _hiScore);
+
+ delete _spriteModule;
+
+ return _gameResult;
+}
+
+void MinigameBbTennis::update() {
+
+ int inputTicks;
+
+ if (_gameTicks > 0) {
+ int currTicks = _vm->_system->getMillis();
+ inputTicks = 3 * (currTicks - _gameTicks) / 50;
+ _gameTicks = currTicks - (currTicks - _gameTicks - 50 * inputTicks / 3);
+ } else {
+ inputTicks = 1;
+ _gameTicks = _vm->_system->getMillis();
+ }
+
+ if (_vm->_keyCode == Common::KEYCODE_ESCAPE) {
+ _gameDone = true;
+ return;
+ }
+
+ if (inputTicks == 0)
+ return;
+
+ bool done;
+
+ do {
+ done = !updateStatus(_vm->_mouseX, _vm->_mouseY, _vm->_mouseButtons);
+ _vm->_mouseButtons &= ~kLeftButtonClicked;
+ _vm->_mouseButtons &= ~kRightButtonClicked;
+ _vm->_keyCode = Common::KEYCODE_INVALID;
+ } while (--inputTicks && _gameTicks > 0 && !done);
+
+ drawSprites();
+
+ _vm->_system->delayMillis(10);
+
+}
+
+void MinigameBbTennis::loadSounds() {
+ for (uint i = 0; i < kSoundFilenamesCount; ++i) {
+ Common::String filename = Common::String::format("bbtennis/%s", kSoundFilenames[i]);
+ _vm->_sound->loadSound(filename.c_str());
+ }
+}
+
+} // End of namespace Bbvs
diff --git a/engines/bbvs/minigames/bbtennis.h b/engines/bbvs/minigames/bbtennis.h
new file mode 100644
index 0000000000..690bd724a0
--- /dev/null
+++ b/engines/bbvs/minigames/bbtennis.h
@@ -0,0 +1,134 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+
+ * You should have received a copy of the GNU General Public 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 BBVS_MINIGAMES_BBTENNIS_H
+#define BBVS_MINIGAMES_BBTENNIS_H
+
+#include "bbvs/minigames/minigame.h"
+
+namespace Bbvs {
+
+class MinigameBbTennis : public Minigame {
+public:
+ MinigameBbTennis(BbvsEngine *vm) : Minigame(vm) {};
+ bool run(bool fromMainGame);
+public:
+
+ struct Obj {
+ int kind;
+ int x, y;
+ const ObjAnimation *anim;
+ int frameIndex;
+ int ticks;
+ int status;
+ int blinkCtr;
+ float fltStepX;
+ float fltStepY;
+ float fltX;
+ float fltY;
+ int targetX;
+ int targetY;
+ int ballStep;
+ int ballStepCtr;
+ int netPlayDirection;
+ };
+
+ enum {
+ kMaxObjectsCount = 256
+ };
+
+ enum {
+ kGSTitleScreen = 0, // Title screen
+ kGSMainGame = 1, // Game when called as part of the main game
+ kGSStandaloneGame = 2, // Game when called as standalone game
+ kGSScoreCountUp = 3 // Score countup and next level text
+ };
+
+ Obj _objects[kMaxObjectsCount];
+
+ int _numHearts;
+ int _squirrelDelay;
+ int _tennisPlayerDelay;
+ int _throwerDelay;
+ int _netPlayerDelay;
+ int _playerDecrease;
+ int _delayDecreaseTimer;
+ int _numBalls;
+ int _newBallTimer;
+ int _initBallTimer;
+ int _maxBalls;
+ int _rapidFireBallsCount;
+ int _score, _hiScore;
+ int _hitMissRatio;
+ bool _allHeartsGone;
+ bool _playedThisIsTheCoolest;
+ bool _startSoundPlayed;
+ bool _endSoundPlaying;
+
+ const ObjAnimation *getAnimation(int animIndex);
+
+ void buildDrawList(DrawList &drawList);
+ void buildDrawList0(DrawList &drawList);
+ void buildDrawList1(DrawList &drawList);
+ void buildDrawList2(DrawList &drawList);
+
+ void drawSprites();
+
+ void initObjs();
+ Obj *getFreeObject();
+ Obj *findTennisBall(int startObjIndex);
+ bool isHit(Obj *obj1, Obj *obj2);
+
+ void initObjects();
+ void initObjects0();
+ void initObjects1();
+ void initObjects2();
+
+ void initVars();
+ void initVars0();
+ void initVars1();
+ void initVars2();
+
+ bool updateStatus(int mouseX, int mouseY, uint mouseButtons);
+ bool updateStatus0(int mouseX, int mouseY, uint mouseButtons);
+ bool updateStatus1(int mouseX, int mouseY, uint mouseButtons);
+ bool updateStatus2(int mouseX, int mouseY, uint mouseButtons);
+
+ void updateObjs();
+ void updateTennisBall(int objIndex);
+ void updateSquirrel(int objIndex);
+ void updateTennisPlayer(int objIndex);
+ void updateThrower(int objIndex);
+ void updateNetPlayer(int objIndex);
+ void updateEnemyTennisBall(int objIndex);
+ void makeEnemyBall(int x, int y, int frameIndex);
+ void hitSomething();
+
+ void update();
+
+ void loadSounds();
+
+};
+
+} // End of namespace Bbvs
+
+#endif // BBVS_MINIGAMES_BBTENNIS_H
diff --git a/engines/bbvs/minigames/bbtennis_anims.cpp b/engines/bbvs/minigames/bbtennis_anims.cpp
new file mode 100644
index 0000000000..7441c66749
--- /dev/null
+++ b/engines/bbvs/minigames/bbtennis_anims.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 "bbvs/minigames/bbtennis.h"
+
+namespace Bbvs {
+
+static const int kAnim0FrameIndices[] = {0, 1, 2, 3};
+static const int16 kAnim0FrameTicks[] = {6, 6, 6, 6};
+static const BBRect kAnim0FrameRects[] = {{-15, -11, 22, 10}, {-15, -12, 23, 10}, {-14, -11, 22, 8}, {-13, -11, 20, 10}};
+static const int kAnim1FrameIndices[] = {4, 5, 6, 7, 8, 3};
+static const int16 kAnim1FrameTicks[] = {6, 6, 6, 6, 6, 6};
+static const BBRect kAnim1FrameRects[] = {{-16, -3, 7, 6}, {-13, -8, 11, 10}, {-14, -12, 15, 12}, {-15, -10, 17, 10}, {-17, -10, 22, 9}, {-13, -12, 20, 12}};
+static const int kAnim2FrameIndices[] = {9, 10, 11, 12};
+static const int16 kAnim2FrameTicks[] = {6, 8, 8, 8};
+static const BBRect kAnim2FrameRects[] = {{-11, -14, 20, 14}, {-1, -14, 10, 15}, {3, -9, 6, 10}, {2, -5, 7, 6}};
+static const int kAnim3FrameIndices[] = {13, 14, 15, 16, 17};
+static const int16 kAnim3FrameTicks[] = {8, 8, 6, 6, 6};
+static const BBRect kAnim3FrameRects[] = {{0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}};
+static const int kAnim4FrameIndices[] = {18, 19};
+static const int16 kAnim4FrameTicks[] = {61, 22};
+static const BBRect kAnim4FrameRects[] = {{-8, -12, 14, 11}, {-8, -12, 14, 11}};
+static const int kAnim5FrameIndices[] = {20};
+static const int16 kAnim5FrameTicks[] = {6};
+static const BBRect kAnim5FrameRects[] = {{0, 0, 0, 0}};
+static const int kAnim6FrameIndices[] = {21, 22, 23, 24, 25, 26, 27, 28, 29};
+static const int16 kAnim6FrameTicks[] = {6, 6, 6, 6, 6, 6, 6, 6, 6};
+static const BBRect kAnim6FrameRects[] = {{-59, -43, 114, 114}, {-24, -13, 44, 46}, {-12, -5, 24, 25}, {-8, -3, 15, 15}, {-5, -3, 8, 8}, {-3, -2, 5, 5}, {-1, -1, 3, 3}, {0, 0, 2, 2}, {-56, 25, 102, 50}};
+static const int kAnim7FrameIndices[] = {30};
+static const int16 kAnim7FrameTicks[] = {6};
+static const BBRect kAnim7FrameRects[] = {{0, 0, 0, 0}};
+static const int kAnim8FrameIndices[] = {31};
+static const int16 kAnim8FrameTicks[] = {6};
+static const BBRect kAnim8FrameRects[] = {{0, 0, 0, 0}};
+static const int kAnim9FrameIndices[] = {32};
+static const int16 kAnim9FrameTicks[] = {6};
+static const BBRect kAnim9FrameRects[] = {{0, 0, 0, 0}};
+static const int kAnim10FrameIndices[] = {33};
+static const int16 kAnim10FrameTicks[] = {6};
+static const BBRect kAnim10FrameRects[] = {{0, 0, 0, 0}};
+static const int kAnim11FrameIndices[] = {34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 48, 58, 59, 60, 61, 62, 63, 64, 42, 65};
+static const int16 kAnim11FrameTicks[] = {10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 6, 6, 6, 6, 10, 10, 10, 10};
+static const BBRect kAnim11FrameRects[] = {{0, -50, 16, 47}, {1, -49, 16, 47}, {-1, -49, 17, 46}, {0, -47, 16, 45}, {2, -46, 15, 46}, {0, -48, 17, 45}, {2, -50, 14, 49}, {-2, -46, 17, 46}, {0, -57, 15, 57}, {-2, -56, 14, 56}, {-4, -56, 13, 56}, {-4, -56, 15, 56}, {5, -51, 14, 49}, {4, -52, 15, 52}, {-1, -57, 13, 57}, {0, -55, 14, 55}, {-5, -50, 17, 49}, {-9, -50, 17, 49}, {-9, -48, 16, 47}, {-6, -49, 14, 48}, {-8, -50, 17, 50}, {-10, -48, 19, 48}, {-2, -50, 14, 50}, {2, -47, 13, 48}, {-1, -57, 13, 57}, {4, -55, 12, 56}, {4, -58, 13, 59}, {5, -58, 12, 59}, {5, -57, 15, 58}, {1, -57, 14, 57}, {-7, -51, 15, 51}, {-5, -53, 16, 53}, {0, -57, 15, 57}, {1, -55, 14, 55}};
+static const int kAnim12FrameIndices[] = {66, 67, 68, 69, 70, 71, 72, 73, 69, 68, 67, 66, 74, 75};
+static const int16 kAnim12FrameTicks[] = {10, 10, 10, 20, 10, 10, 6, 10, 20, 10, 10, 10, 8, 6};
+static const BBRect kAnim12FrameRects[] = {{-5, -8, 12, 6}, {-12, -17, 24, 15}, {-12, -28, 24, 28}, {-10, -36, 20, 35}, {-9, -36, 18, 37}, {-11, -37, 17, 38}, {-6, -36, 16, 34}, {-5, -35, 20, 39}, {-10, -36, 20, 35}, {-12, -28, 24, 28}, {-12, -17, 24, 15}, {-5, -8, 12, 6}, {-15, -27, 23, 38}, {-19, -17, 15, 17}};
+static const int kAnim13FrameIndices[] = {76, 77, 78, 77, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 98, 102, 103, 90};
+static const int16 kAnim13FrameTicks[] = {16, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 6, 10, 10, 6, 10, 10, 10, 10, 10, 10};
+static const BBRect kAnim13FrameRects[] = {{-21, -61, 16, 52}, {-42, -76, 7, 14}, {-43, -75, 13, 24}, {-42, -76, 7, 14}, {-42, -75, 4, 42}, {-42, -76, 11, 57}, {-40, -74, 13, 55}, {-36, -74, 11, 55}, {-31, -72, 12, 56}, {-27, -71, 14, 57}, {-20, -69, 15, 55}, {-12, -65, 15, 51}, {-7, -57, 18, 44}, {-3, -43, 18, 29}, {4, -27, 20, 14}, {0, -28, 13, 14}, {0, -38, 14, 24}, {-1, -49, 19, 36}, {0, -61, 17, 47}, {-2, -63, 19, 49}, {-5, -64, 19, 50}, {-3, -62, 18, 48}, {0, -61, 19, 47}, {0, -61, 16, 47}, {-4, -48, 17, 34}, {-9, -37, 15, 23}, {-13, -26, 14, 12}, {0, -61, 16, 47}, {0, -50, 15, 36}, {0, -39, 13, 25}, {0, -28, 12, 14}};
+static const int kAnim14FrameIndices[] = {104, 105, 106, 105, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 126, 130, 131, 118};
+static const int16 kAnim14FrameTicks[] = {16, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 6, 10, 10, 6, 10, 10, 10, 10, 10, 10};
+static const BBRect kAnim14FrameRects[] = {{6, -61, 14, 52}, {35, -77, 7, 16}, {29, -76, 13, 24}, {35, -77, 7, 16}, {38, -76, 4, 43}, {32, -75, 10, 55}, {24, -74, 16, 54}, {22, -74, 14, 53}, {18, -72, 12, 55}, {12, -71, 15, 57}, {2, -69, 17, 55}, {-5, -65, 18, 51}, {-13, -57, 18, 43}, {-20, -43, 23, 29}, {-26, -30, 25, 16}, {-13, -28, 13, 14}, {-16, -38, 24, 24}, {-16, -49, 20, 35}, {-15, -61, 17, 47}, {-15, -63, 17, 49}, {-13, -64, 17, 51}, {-14, -62, 15, 48}, {-19, -61, 19, 47}, {-16, -61, 16, 48}, {-18, -48, 22, 34}, {-6, -37, 14, 23}, {0, -27, 12, 14}, {-16, -61, 16, 48}, {-16, -50, 19, 36}, {-14, -39, 15, 25}, {-12, -28, 12, 15}};
+static const int kAnim15FrameIndices[] = {132, 133, 134, 133, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 154, 158, 159, 146};
+static const int16 kAnim15FrameTicks[] = {16, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 6, 10, 10, 6, 10, 10, 10, 10, 10, 10};
+static const BBRect kAnim15FrameRects[] = {{-21, -61, 16, 52}, {-42, -76, 7, 14}, {-43, -75, 13, 24}, {-42, -76, 7, 14}, {-42, -75, 4, 42}, {-42, -76, 11, 57}, {-40, -74, 13, 55}, {-36, -74, 11, 55}, {-31, -72, 12, 56}, {-27, -71, 14, 57}, {-20, -69, 15, 55}, {-12, -65, 15, 51}, {-7, -57, 18, 44}, {-3, -43, 18, 29}, {4, -27, 20, 14}, {0, -28, 13, 14}, {0, -38, 14, 24}, {-1, -49, 19, 36}, {0, -61, 17, 47}, {-2, -63, 19, 49}, {-5, -64, 19, 50}, {-3, -62, 18, 48}, {0, -61, 19, 47}, {0, -61, 16, 47}, {-4, -48, 17, 34}, {-9, -37, 15, 23}, {-13, -26, 14, 12}, {0, -61, 16, 47}, {0, -50, 15, 36}, {0, -39, 13, 25}, {0, -28, 12, 14}};
+static const int kAnim16FrameIndices[] = {160, 161, 162, 161, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 182, 186, 187, 174};
+static const int16 kAnim16FrameTicks[] = {16, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 6, 10, 10, 6, 10, 10, 10, 10, 10, 10};
+static const BBRect kAnim16FrameRects[] = {{6, -61, 14, 52}, {35, -77, 7, 16}, {29, -76, 13, 24}, {35, -77, 7, 16}, {38, -76, 4, 43}, {32, -75, 10, 55}, {24, -74, 16, 54}, {22, -74, 14, 53}, {18, -72, 12, 55}, {12, -71, 15, 57}, {2, -69, 17, 55}, {-5, -65, 18, 51}, {-13, -57, 18, 43}, {-20, -43, 23, 29}, {-26, -30, 25, 16}, {-13, -28, 13, 14}, {-16, -38, 24, 24}, {-16, -49, 20, 35}, {-15, -61, 17, 47}, {-15, -63, 17, 49}, {-13, -64, 17, 51}, {-14, -62, 15, 48}, {-19, -61, 19, 47}, {-16, -61, 16, 48}, {-18, -48, 22, 34}, {-6, -37, 14, 23}, {0, -27, 12, 14}, {-16, -61, 16, 48}, {-16, -50, 19, 36}, {-14, -39, 15, 25}, {-12, -28, 12, 15}};
+static const int kAnim17FrameIndices[] = {188, 189, 190, 189, 191, 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, 210, 214, 215, 202};
+static const int16 kAnim17FrameTicks[] = {16, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 6, 10, 10, 6, 10, 10, 10, 10, 10, 10};
+static const BBRect kAnim17FrameRects[] = {{-21, -61, 16, 52}, {-42, -76, 7, 14}, {-43, -75, 13, 24}, {-42, -76, 7, 14}, {-42, -75, 4, 42}, {-42, -76, 11, 57}, {-40, -74, 13, 55}, {-36, -74, 11, 55}, {-31, -72, 12, 56}, {-27, -71, 14, 57}, {-20, -69, 15, 55}, {-12, -65, 15, 51}, {-7, -57, 18, 44}, {-3, -43, 18, 29}, {4, -27, 20, 14}, {0, -28, 13, 14}, {0, -38, 14, 24}, {-1, -49, 19, 36}, {0, -61, 17, 47}, {-2, -63, 19, 49}, {-5, -64, 19, 50}, {-3, -62, 18, 48}, {0, -61, 19, 47}, {0, -61, 16, 47}, {-4, -48, 17, 34}, {-9, -37, 15, 23}, {-13, -26, 14, 12}, {0, -61, 16, 47}, {0, -50, 15, 36}, {0, -39, 13, 25}, {0, -28, 12, 14}};
+static const int kAnim18FrameIndices[] = {216, 217, 218, 217, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, 241, 238, 242, 243, 230};
+static const int16 kAnim18FrameTicks[] = {16, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 6, 10, 10, 6, 10, 10, 10, 10, 10, 10};
+static const BBRect kAnim18FrameRects[] = {{6, -61, 14, 52}, {35, -77, 7, 16}, {29, -76, 13, 24}, {35, -77, 7, 16}, {38, -76, 4, 43}, {32, -75, 10, 55}, {24, -74, 16, 54}, {22, -74, 14, 53}, {18, -72, 12, 55}, {12, -71, 15, 57}, {2, -69, 17, 55}, {-5, -65, 18, 51}, {-13, -57, 18, 43}, {-20, -43, 23, 29}, {-26, -30, 25, 16}, {-13, -28, 13, 14}, {-16, -38, 24, 24}, {-16, -49, 20, 35}, {-15, -61, 17, 47}, {-15, -63, 17, 49}, {-13, -64, 17, 51}, {-14, -62, 15, 48}, {-19, -61, 19, 47}, {-16, -61, 16, 48}, {-18, -48, 22, 34}, {-6, -37, 14, 23}, {0, -27, 12, 14}, {-16, -61, 16, 48}, {-16, -50, 19, 36}, {-14, -39, 15, 25}, {-12, -28, 12, 15}};
+static const int kAnim19FrameIndices[] = {244};
+static const int16 kAnim19FrameTicks[] = {6};
+static const BBRect kAnim19FrameRects[] = {{0, 0, 0, 0}};
+static const int kAnim20FrameIndices[] = {245, 246, 247, 248, 249, 250, 251, 252, 253, 254};
+static const int16 kAnim20FrameTicks[] = {6, 6, 6, 6, 6, 6, 6, 6, 6, 6};
+static const BBRect kAnim20FrameRects[] = {{0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}};
+static const int kAnim21FrameIndices[] = {255};
+static const int16 kAnim21FrameTicks[] = {1};
+static const BBRect kAnim21FrameRects[] = {{0, 0, 0, 0}};
+static const int kAnim22FrameIndices[] = {256};
+static const int16 kAnim22FrameTicks[] = {5};
+static const BBRect kAnim22FrameRects[] = {{0, 0, 0, 0}};
+static const int kAnim23FrameIndices[] = {257};
+static const int16 kAnim23FrameTicks[] = {1};
+static const BBRect kAnim23FrameRects[] = {{0, 0, 0, 0}};
+static const int kAnim24FrameIndices[] = {258, 259};
+static const int16 kAnim24FrameTicks[] = {6, 6};
+static const BBRect kAnim24FrameRects[] = {{-9, -9, 17, 15}, {-11, -10, 19, 16}};
+static const int kAnim25FrameIndices[] = {260, 261, 262, 263, 264, 265};
+static const int16 kAnim25FrameTicks[] = {6, 6, 6, 6, 6, 6};
+static const BBRect kAnim25FrameRects[] = {{-22, -91, 45, 93}, {-21, -92, 43, 95}, {-21, -92, 43, 95}, {-21, -92, 43, 95}, {-21, -92, 43, 95}, {-21, -92, 43, 95}};
+static const int kAnim26FrameIndices[] = {266, 267, 268, 269, 270, 271};
+static const int16 kAnim26FrameTicks[] = {6, 6, 6, 6, 6, 6};
+static const BBRect kAnim26FrameRects[] = {{-21, -85, 38, 86}, {-21, -85, 38, 86}, {-21, -85, 38, 86}, {-21, -85, 38, 86}, {-21, -85, 38, 86}, {-21, -85, 38, 86}};
+static const ObjAnimation kAnimations[] = {
+ {4, kAnim0FrameIndices, kAnim0FrameTicks, kAnim0FrameRects},
+ {6, kAnim1FrameIndices, kAnim1FrameTicks, kAnim1FrameRects},
+ {4, kAnim2FrameIndices, kAnim2FrameTicks, kAnim2FrameRects},
+ {5, kAnim3FrameIndices, kAnim3FrameTicks, kAnim3FrameRects},
+ {2, kAnim4FrameIndices, kAnim4FrameTicks, kAnim4FrameRects},
+ {1, kAnim5FrameIndices, kAnim5FrameTicks, kAnim5FrameRects},
+ {9, kAnim6FrameIndices, kAnim6FrameTicks, kAnim6FrameRects},
+ {1, kAnim7FrameIndices, kAnim7FrameTicks, kAnim7FrameRects},
+ {1, kAnim8FrameIndices, kAnim8FrameTicks, kAnim8FrameRects},
+ {1, kAnim9FrameIndices, kAnim9FrameTicks, kAnim9FrameRects},
+ {1, kAnim10FrameIndices, kAnim10FrameTicks, kAnim10FrameRects},
+ {34, kAnim11FrameIndices, kAnim11FrameTicks, kAnim11FrameRects},
+ {14, kAnim12FrameIndices, kAnim12FrameTicks, kAnim12FrameRects},
+ {31, kAnim13FrameIndices, kAnim13FrameTicks, kAnim13FrameRects},
+ {31, kAnim14FrameIndices, kAnim14FrameTicks, kAnim14FrameRects},
+ {31, kAnim15FrameIndices, kAnim15FrameTicks, kAnim15FrameRects},
+ {31, kAnim16FrameIndices, kAnim16FrameTicks, kAnim16FrameRects},
+ {31, kAnim17FrameIndices, kAnim17FrameTicks, kAnim17FrameRects},
+ {31, kAnim18FrameIndices, kAnim18FrameTicks, kAnim18FrameRects},
+ {1, kAnim19FrameIndices, kAnim19FrameTicks, kAnim19FrameRects},
+ {10, kAnim20FrameIndices, kAnim20FrameTicks, kAnim20FrameRects},
+ {1, kAnim21FrameIndices, kAnim21FrameTicks, kAnim21FrameRects},
+ {1, kAnim22FrameIndices, kAnim22FrameTicks, kAnim22FrameRects},
+ {1, kAnim23FrameIndices, kAnim23FrameTicks, kAnim23FrameRects},
+ {2, kAnim24FrameIndices, kAnim24FrameTicks, kAnim24FrameRects},
+ {6, kAnim25FrameIndices, kAnim25FrameTicks, kAnim25FrameRects},
+ {6, kAnim26FrameIndices, kAnim26FrameTicks, kAnim26FrameRects}
+};
+
+const ObjAnimation *MinigameBbTennis::getAnimation(int animIndex) {
+ return &kAnimations[animIndex];
+}
+
+} // End of namespace Bbvs
diff --git a/engines/bbvs/minigames/minigame.cpp b/engines/bbvs/minigames/minigame.cpp
new file mode 100644
index 0000000000..aae18072d9
--- /dev/null
+++ b/engines/bbvs/minigames/minigame.cpp
@@ -0,0 +1,112 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+
+ * You should have received a copy of the GNU General Public 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 "bbvs/minigames/minigame.h"
+#include "common/savefile.h"
+
+namespace Bbvs {
+
+Minigame::Minigame(BbvsEngine *vm)
+ : _vm(vm), _spriteModule(nullptr) {
+
+ memset(_hiScoreTable, 0, sizeof(_hiScoreTable));
+ _gameState = 0;
+ _gameTicks = 0;
+ _gameResult = false;
+ _gameDone = false;
+ _fromMainGame = false;
+ _backgroundSpriteIndex = 0;
+ _titleScreenSpriteIndex = 0;
+ _numbersAnim = nullptr;
+}
+
+Minigame::~Minigame() {
+}
+
+int Minigame::drawNumber(DrawList &drawList, int number, int x, int y) {
+ int digits = 1, rightX = x;
+
+ for (int mag = 10; number / mag != 0; mag *= 10)
+ ++digits;
+
+ rightX = x + digits * 10;
+ x = rightX;
+
+ while (digits--) {
+ const int n = number % 10;
+ x -= 10;
+ drawList.add(_numbersAnim->frameIndices[n], x, y, 2000);
+ number /= 10;
+ }
+
+ return rightX;
+}
+
+void Minigame::playSound(uint index, bool loop) {
+ if (index > 0)
+ _vm->_sound->playSound(index - 1, loop);
+}
+
+void Minigame::stopSound(uint index) {
+ if (index > 0)
+ _vm->_sound->stopSound(index - 1);
+}
+
+bool Minigame::isSoundPlaying(uint index) {
+ return index > 0 && _vm->_sound->isSoundPlaying(index - 1);
+}
+
+bool Minigame::isAnySoundPlaying(const uint *indices, uint count) {
+ for (uint i = 0; i < count; ++i)
+ if (isSoundPlaying(indices[i]))
+ return true;
+ return false;
+}
+
+void Minigame::saveHiscore(int minigameNum, int score) {
+ Common::String filename = _vm->getTargetName() + "-highscore.dat";
+ Common::OutSaveFile *file = g_system->getSavefileManager()->openForSaving(filename);
+ if (file) {
+ // Reserve a byte for future usage (rarely a bad idea, you never know...)
+ file->writeByte(0);
+ _hiScoreTable[minigameNum] = score;
+ for (int i = 0; i < kMinigameCount; ++i)
+ file->writeUint32LE(_hiScoreTable[i]);
+ delete file;
+ }
+}
+
+int Minigame::loadHiscore(int minigameNum) {
+ int score = 0;
+ Common::String filename = _vm->getTargetName() + "-highscore.dat";
+ Common::InSaveFile *file = g_system->getSavefileManager()->openForLoading(filename);
+ if (file) {
+ file->readByte();
+ for (int i = 0; i < kMinigameCount; ++i)
+ _hiScoreTable[i] = file->readUint32LE();
+ delete file;
+ score = _hiScoreTable[minigameNum];
+ }
+ return score;
+}
+
+} // End of namespace Bbvs
diff --git a/engines/bbvs/minigames/minigame.h b/engines/bbvs/minigames/minigame.h
new file mode 100644
index 0000000000..675dec360d
--- /dev/null
+++ b/engines/bbvs/minigames/minigame.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 BBVS_MINIGAMES_MINIGAME_H
+#define BBVS_MINIGAMES_MINIGAME_H
+
+#include "bbvs/bbvs.h"
+#include "bbvs/graphics.h"
+#include "bbvs/sound.h"
+#include "bbvs/spritemodule.h"
+
+namespace Bbvs {
+
+enum {
+ kMinigameBbLoogie = 0,
+ kMinigameBbTennis = 1,
+ kMinigameBbAnt = 2,
+ kMinigameBbAirGuitar = 3,
+ kMinigameCount
+};
+
+struct ObjAnimation {
+ int frameCount;
+ const int *frameIndices;
+ const int16 *frameTicks;
+ const BBRect *frameRects;
+};
+
+class Minigame {
+public:
+ Minigame(BbvsEngine *vm);
+ virtual ~Minigame();
+ virtual bool run(bool fromMainGame) = 0;
+protected:
+ BbvsEngine *_vm;
+ SpriteModule *_spriteModule;
+
+ int _gameState;
+ int _gameTicks;
+ bool _gameResult;
+ bool _gameDone;
+ bool _fromMainGame;
+ int _hiScoreTable[kMinigameCount];
+
+ int _backgroundSpriteIndex, _titleScreenSpriteIndex;
+
+ const ObjAnimation *_numbersAnim;
+
+ int drawNumber(DrawList &drawList, int number, int x, int y);
+
+ void playSound(uint index, bool loop = false);
+ void stopSound(uint index);
+ bool isSoundPlaying(uint index);
+ bool isAnySoundPlaying(const uint *indices, uint count);
+
+ void saveHiscore(int minigameNum, int score);
+ int loadHiscore(int minigameNum);
+
+};
+
+} // End of namespace Bbvs
+
+#endif // BBVS_MINIGAMES_MINIGAME_H
diff --git a/engines/bbvs/module.mk b/engines/bbvs/module.mk
new file mode 100644
index 0000000000..90c62d0acb
--- /dev/null
+++ b/engines/bbvs/module.mk
@@ -0,0 +1,32 @@
+MODULE := engines/bbvs
+
+MODULE_OBJS := \
+ bbvs.o \
+ detection.o \
+ dialogs.o \
+ gamemodule.o \
+ graphics.o \
+ logic.o \
+ saveload.o \
+ scene.o \
+ sound.o \
+ spritemodule.o \
+ videoplayer.o \
+ walk.o \
+ minigames/bbairguitar.o \
+ minigames/bbairguitar_anims.o \
+ minigames/bbant.o \
+ minigames/bbant_anims.o \
+ minigames/bbloogie.o \
+ minigames/bbloogie_anims.o \
+ minigames/bbtennis.o \
+ minigames/bbtennis_anims.o \
+ minigames/minigame.o
+
+# This module can be built as a plugin
+ifeq ($(ENABLE_BBVS), DYNAMIC_PLUGIN)
+PLUGIN := 1
+endif
+
+# Include common rules
+include $(srcdir)/rules.mk
diff --git a/engines/bbvs/saveload.cpp b/engines/bbvs/saveload.cpp
new file mode 100644
index 0000000000..ff53cc457b
--- /dev/null
+++ b/engines/bbvs/saveload.cpp
@@ -0,0 +1,278 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+
+ * You should have received a copy of the GNU General Public 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 "bbvs/bbvs.h"
+#include "bbvs/gamemodule.h"
+#include "common/savefile.h"
+#include "graphics/thumbnail.h"
+
+namespace Bbvs {
+
+BbvsEngine::kReadSaveHeaderError BbvsEngine::readSaveHeader(Common::SeekableReadStream *in, bool loadThumbnail, SaveHeader &header) {
+
+ header.version = in->readUint32LE();
+ if (header.version > BBVS_SAVEGAME_VERSION)
+ return kRSHEInvalidVersion;
+
+ byte descriptionLen = in->readByte();
+ header.description = "";
+ while (descriptionLen--)
+ header.description += (char)in->readByte();
+
+ if (loadThumbnail) {
+ header.thumbnail = Graphics::loadThumbnail(*in);
+ } else {
+ Graphics::skipThumbnail(*in);
+ }
+
+ // Not used yet, reserved for future usage
+ header.gameID = in->readByte();
+ header.flags = in->readUint32LE();
+
+ header.saveDate = in->readUint32LE();
+ header.saveTime = in->readUint32LE();
+ header.playTime = in->readUint32LE();
+
+ return ((in->eos() || in->err()) ? kRSHEIoError : kRSHENoError);
+}
+
+void BbvsEngine::savegame(const char *filename, const char *description) {
+
+ Common::OutSaveFile *out;
+ if (!(out = g_system->getSavefileManager()->openForSaving(filename))) {
+ warning("Can't create file '%s', game not saved", filename);
+ return;
+ }
+
+ TimeDate curTime;
+ g_system->getTimeAndDate(curTime);
+
+ // Header start
+ out->writeUint32LE(BBVS_SAVEGAME_VERSION);
+
+ byte descriptionLen = strlen(description);
+ out->writeByte(descriptionLen);
+ out->write(description, descriptionLen);
+
+ Graphics::saveThumbnail(*out);
+
+ // Not used yet, reserved for future usage
+ out->writeByte(0);
+ out->writeUint32LE(0);
+ uint32 saveDate = ((curTime.tm_mday & 0xFF) << 24) | (((curTime.tm_mon + 1) & 0xFF) << 16) | ((curTime.tm_year + 1900) & 0xFFFF);
+ uint32 saveTime = ((curTime.tm_hour & 0xFF) << 16) | (((curTime.tm_min) & 0xFF) << 8) | ((curTime.tm_sec) & 0xFF);
+ uint32 playTime = g_engine->getTotalPlayTime() / 1000;
+ out->writeUint32LE(saveDate);
+ out->writeUint32LE(saveTime);
+ out->writeUint32LE(playTime);
+ // Header end
+
+ out->write(_snapshot, _snapshotStream->pos());
+
+ out->finalize();
+ delete out;
+}
+
+void BbvsEngine::loadgame(const char *filename) {
+ Common::InSaveFile *in;
+ if (!(in = g_system->getSavefileManager()->openForLoading(filename))) {
+ warning("Can't open file '%s', game not loaded", filename);
+ return;
+ }
+
+ SaveHeader header;
+
+ kReadSaveHeaderError errorCode = readSaveHeader(in, false, header);
+
+ if (errorCode != kRSHENoError) {
+ warning("Error loading savegame '%s'", filename);
+ delete in;
+ return;
+ }
+
+ g_engine->setTotalPlayTime(header.playTime * 1000);
+
+ memset(_sceneObjects, 0, sizeof(_sceneObjects));
+ for (int i = 0; i < kSceneObjectsCount; ++i) {
+ _sceneObjects[i].walkDestPt.x = -1;
+ _sceneObjects[i].walkDestPt.y = -1;
+ }
+
+ _currSceneNum = 0;
+ _newSceneNum = in->readUint32LE();
+
+ initScene(false);
+
+ _prevSceneNum = in->readUint32LE();
+ _gameState = in->readUint32LE();
+ _mouseCursorSpriteIndex = in->readUint32LE();
+ _mousePos.x = in->readUint16LE();
+ _mousePos.y = in->readUint16LE();
+ _currVerbNum = in->readUint32LE();
+ _activeItemType = in->readUint32LE();
+ _activeItemIndex = in->readUint32LE();
+ _verbPos.x = in->readUint16LE();
+ _verbPos.y = in->readUint16LE();
+ _inventoryButtonIndex = in->readUint32LE();
+ _currInventoryItem = in->readUint32LE();
+ _currTalkObjectIndex = in->readUint32LE();
+ _currCameraNum = in->readUint32LE();
+ _cameraPos.x = in->readUint16LE();
+ _cameraPos.y = in->readUint16LE();
+ _newCameraPos.x = in->readUint16LE();
+ _newCameraPos.y = in->readUint16LE();
+ _dialogSlotCount = in->readUint32LE();
+ _walkMousePos.x = in->readUint16LE();
+ _walkMousePos.y = in->readUint16LE();
+ in->read(_backgroundSoundsActive, kSceneSoundsCount);
+ in->read(_inventoryItemStatus, kInventoryItemStatusCount);
+ in->read(_dialogItemStatus, kDialogItemStatusCount);
+ in->read(_gameVars, kGameVarsCount);
+ in->read(_sceneVisited, kSceneVisitedCount);
+ for (int i = 0; i < _gameModule->getSceneObjectDefsCount(); ++i) {
+ SceneObject *obj = &_sceneObjects[i];
+ obj->x = in->readUint32LE();
+ obj->y = in->readUint32LE();
+ obj->animIndex = in->readUint32LE();
+ obj->frameIndex = in->readUint32LE();
+ obj->frameTicks = in->readUint32LE();
+ obj->walkCount = in->readUint32LE();
+ obj->xIncr = in->readUint32LE();
+ obj->yIncr = in->readUint32LE();
+ obj->turnValue = in->readUint32LE();
+ obj->turnCount = in->readUint32LE();
+ obj->turnTicks = in->readUint32LE();
+ obj->walkDestPt.x = in->readUint16LE();
+ obj->walkDestPt.y = in->readUint16LE();
+ obj->anim = obj->animIndex > 0 ? _gameModule->getAnimation(obj->animIndex) : 0;
+ }
+
+ updateWalkableRects();
+
+ // Restart scene background sounds
+ for (int i = 0; i < _gameModule->getSceneSoundsCount(); ++i) {
+ if (_backgroundSoundsActive[i]) {
+ SceneSound *sceneSound = _gameModule->getSceneSound(i);
+ playSound(sceneSound->soundNum, true);
+ }
+ }
+
+ _currAction = 0;
+ _currActionCommandIndex = -1;
+
+ delete in;
+
+}
+
+Common::Error BbvsEngine::loadGameState(int slot) {
+ const char *fileName = getSavegameFilename(slot);
+ loadgame(fileName);
+ return Common::kNoError;
+}
+
+Common::Error BbvsEngine::saveGameState(int slot, const Common::String &description) {
+ const char *fileName = getSavegameFilename(slot);
+ savegame(fileName, description.c_str());
+ return Common::kNoError;
+}
+
+const char *BbvsEngine::getSavegameFilename(int num) {
+ static Common::String filename;
+ filename = getSavegameFilename(_targetName, num);
+ return filename.c_str();
+}
+
+Common::String BbvsEngine::getSavegameFilename(const Common::String &target, int num) {
+ assert(num >= 0 && num <= 999);
+ return Common::String::format("%s.%03d", target.c_str(), num);
+}
+
+bool BbvsEngine::existsSavegame(int num) {
+ return _system->getSavefileManager()->listSavefiles(getSavegameFilename(_targetName, num)).size() != 0;
+}
+
+void BbvsEngine::allocSnapshot() {
+ _snapshot = new byte[kSnapshotSize];
+ _snapshotStream = new Common::SeekableMemoryWriteStream(_snapshot, kSnapshotSize);
+}
+
+void BbvsEngine::freeSnapshot() {
+ delete _snapshotStream;
+ delete[] _snapshot;
+}
+
+void BbvsEngine::saveSnapshot() {
+ _hasSnapshot = true;
+ _snapshotStream->seek(0);
+ _snapshotStream->writeUint32LE(_currSceneNum);
+ _snapshotStream->writeUint32LE(_prevSceneNum);
+ _snapshotStream->writeUint32LE(_gameState);
+ _snapshotStream->writeUint32LE(_mouseCursorSpriteIndex);
+ _snapshotStream->writeUint16LE(_mousePos.x);
+ _snapshotStream->writeUint16LE(_mousePos.y);
+ _snapshotStream->writeUint32LE(_currVerbNum);
+ _snapshotStream->writeUint32LE(_activeItemType);
+ _snapshotStream->writeUint32LE(_activeItemIndex);
+ _snapshotStream->writeUint16LE(_verbPos.x);
+ _snapshotStream->writeUint16LE(_verbPos.y);
+ _snapshotStream->writeUint32LE(_inventoryButtonIndex);
+ _snapshotStream->writeUint32LE(_currInventoryItem);
+ _snapshotStream->writeUint32LE(_currTalkObjectIndex);
+ _snapshotStream->writeUint32LE(_currCameraNum);
+ _snapshotStream->writeUint16LE(_cameraPos.x);
+ _snapshotStream->writeUint16LE(_cameraPos.y);
+ _snapshotStream->writeUint16LE(_newCameraPos.x);
+ _snapshotStream->writeUint16LE(_newCameraPos.y);
+ _snapshotStream->writeUint32LE(_dialogSlotCount);
+ _snapshotStream->writeUint16LE(_walkMousePos.x);
+ _snapshotStream->writeUint16LE(_walkMousePos.y);
+ _snapshotStream->write(_backgroundSoundsActive, kSceneSoundsCount);
+ _snapshotStream->write(_inventoryItemStatus, kInventoryItemStatusCount);
+ _snapshotStream->write(_dialogItemStatus, kDialogItemStatusCount);
+ _snapshotStream->write(_gameVars, kGameVarsCount);
+ _snapshotStream->write(_sceneVisited, kSceneVisitedCount);
+ for (int i = 0; i < _gameModule->getSceneObjectDefsCount(); ++i) {
+ SceneObject *obj = &_sceneObjects[i];
+ _snapshotStream->writeUint32LE(obj->x);
+ _snapshotStream->writeUint32LE(obj->y);
+ _snapshotStream->writeUint32LE(obj->animIndex);
+ _snapshotStream->writeUint32LE(obj->frameIndex);
+ _snapshotStream->writeUint32LE(obj->frameTicks);
+ _snapshotStream->writeUint32LE(obj->walkCount);
+ _snapshotStream->writeUint32LE(obj->xIncr);
+ _snapshotStream->writeUint32LE(obj->yIncr);
+ _snapshotStream->writeUint32LE(obj->turnValue);
+ _snapshotStream->writeUint32LE(obj->turnCount);
+ _snapshotStream->writeUint32LE(obj->turnTicks);
+ _snapshotStream->writeUint16LE(obj->walkDestPt.x);
+ _snapshotStream->writeUint16LE(obj->walkDestPt.y);
+ }
+}
+
+void BbvsEngine::writeContinueSavegame() {
+ if (_hasSnapshot) {
+ saveGameState(0, "Continue");
+ }
+}
+
+} // End of namespace Bbvs
diff --git a/engines/bbvs/scene.cpp b/engines/bbvs/scene.cpp
new file mode 100644
index 0000000000..0d86eb4dbc
--- /dev/null
+++ b/engines/bbvs/scene.cpp
@@ -0,0 +1,227 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+
+ * You should have received a copy of the GNU General Public 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 "bbvs/bbvs.h"
+#include "bbvs/gamemodule.h"
+#include "bbvs/graphics.h"
+#include "bbvs/sound.h"
+
+namespace Bbvs {
+
+static const int kAfterVideoSceneNum[] = {
+ 0, 43, 23, 12, 4, 44, 2,
+ 16, 4, 4, 4, 44, 12, 44
+};
+
+void BbvsEngine::loadScene(int sceneNum) {
+ debug(0, "BbvsEngine::loadScene() sceneNum: %d", sceneNum);
+
+ Common::String sprFilename = Common::String::format("vnm/vspr%04d.vnm", sceneNum);
+ Common::String gamFilename = Common::String::format("vnm/game%04d.vnm", sceneNum);
+
+ _screen->clear();
+
+ _spriteModule->load(sprFilename.c_str());
+ _gameModule->load(gamFilename.c_str());
+
+ Palette palette = _spriteModule->getPalette();
+ _screen->setPalette(palette);
+
+ // Preload sounds
+ for (uint i = 0; i < _gameModule->getPreloadSoundsCount(); ++i) {
+ Common::String filename = Common::String::format("snd/snd%05d.aif", _gameModule->getPreloadSound(i));
+ _sound->loadSound(filename);
+ }
+
+ if (sceneNum >= kMainMenu) {
+ DrawList drawList;
+ drawList.add(_gameModule->getBgSpriteIndex(0), 0, 0, 0);
+ _screen->drawDrawList(drawList, _spriteModule);
+ drawScreen();
+ }
+
+}
+
+void BbvsEngine::initScene(bool sounds) {
+
+ stopSpeech();
+ stopSounds();
+ _sound->unloadSounds();
+
+ _gameState = kGSScene;
+ _prevSceneNum = _currSceneNum;
+ _sceneVisited[_currSceneNum] = 1;
+ _mouseCursorSpriteIndex = 0;
+ _verbPos.x = -1;
+ _verbPos.y = -1;
+ _activeItemType = kITEmpty;
+ _activeItemIndex = 0;
+ _cameraPos.x = 0;
+ _cameraPos.y = 0;
+ _newCameraPos.x = 0;
+ _newCameraPos.y = 0;
+ _inventoryButtonIndex = -1;
+ _currTalkObjectIndex = -1;
+ _currCameraNum = 0;
+ _walkMousePos.x = -1;
+ _walkMousePos.y = -1;
+ _currAction = 0;
+ _currActionCommandIndex = -1;
+ _currActionCommandTimeStamp = 0;
+ _dialogSlotCount = 0;
+ _buttheadObject = 0;
+ _beavisObject = 0;
+
+ memset(_backgroundSoundsActive, 0, sizeof(_backgroundSoundsActive));
+
+ memset(_sceneObjects, 0, sizeof(_sceneObjects));
+ for (int i = 0; i < kSceneObjectsCount; ++i) {
+ _sceneObjects[i].walkDestPt.x = -1;
+ _sceneObjects[i].walkDestPt.y = -1;
+ }
+
+ memset(_dialogItemStatus, 0, sizeof(_dialogItemStatus));
+
+ _sceneObjectActions.clear();
+
+ loadScene(_newSceneNum);
+ _currSceneNum = _newSceneNum;
+ _newSceneNum = 0;
+
+ for (int i = 0; i < _gameModule->getSceneObjectDefsCount(); ++i)
+ _sceneObjects[i].sceneObjectDef = _gameModule->getSceneObjectDef(i);
+
+ for (int i = 0; i < _gameModule->getSceneObjectInitsCount(); ++i) {
+ SceneObjectInit *soInit = _gameModule->getSceneObjectInit(i);
+ if (evalCondition(soInit->conditions)) {
+ SceneObject *sceneObject = &_sceneObjects[soInit->sceneObjectIndex];
+ sceneObject->anim = _gameModule->getAnimation(soInit->animIndex);
+ sceneObject->animIndex = soInit->animIndex;
+ sceneObject->frameIndex = sceneObject->anim->frameCount - 1;
+ sceneObject->frameTicks = 1;
+ sceneObject->x = soInit->x << 16;
+ sceneObject->y = soInit->y << 16;
+ }
+ }
+
+ if (_gameModule->getButtheadObjectIndex() >= 0) {
+ _buttheadObject = &_sceneObjects[_gameModule->getButtheadObjectIndex()];
+ // Search for the Beavis object
+ for (int i = 0; i < _gameModule->getSceneObjectDefsCount(); ++i)
+ if (!strcmp(_sceneObjects[i].sceneObjectDef->name, "Beavis")) {
+ _beavisObject = &_sceneObjects[i];
+ break;
+ }
+ }
+
+ updateSceneObjectsTurnValue();
+
+ updateWalkableRects();
+
+ _currCameraNum = 0;
+ if (_buttheadObject) {
+ int minDistance = 0xFFFFFF;
+ for (int cameraNum = 0; cameraNum < 4; ++cameraNum) {
+ CameraInit *cameraInit = _gameModule->getCameraInit(cameraNum);
+ int curDistance = ABS(cameraInit->cameraPos.x - (int)(_buttheadObject->x >> 16) + 160);
+ if (curDistance < minDistance) {
+ minDistance = curDistance;
+ _currCameraNum = cameraNum;
+ }
+ }
+ }
+
+ _cameraPos = _gameModule->getCameraInit(_currCameraNum)->cameraPos;
+ _newCameraPos = _cameraPos;
+
+ _walkAreaActions.clear();
+ for (int i = 0; i < _gameModule->getActionsCount(); ++i) {
+ Action *action = _gameModule->getAction(i);
+ for (int j = 0; j < 8; ++j)
+ if (action->conditions.conditions[j].cond == kCondIsButtheadAtBgObject)
+ _walkAreaActions.push_back(action);
+ }
+
+ _mouseCursorSpriteIndex = 0;
+
+ _activeItemIndex = 0;
+ _activeItemType = kITEmpty;
+
+ for (int i = 0; i < _gameModule->getActionsCount(); ++i) {
+ Action *action = _gameModule->getAction(i);
+ if (evalCondition(action->conditions)) {
+ _gameState = kGSWait;
+ _currAction = action;
+ for (uint j = 0; j < action->actionCommands.size(); ++j) {
+ ActionCommand *actionCommand = &action->actionCommands[j];
+ if (actionCommand->cmd == kActionCmdSetCameraPos) {
+ _currCameraNum = actionCommand->param;
+ _cameraPos = _gameModule->getCameraInit(_currCameraNum)->cameraPos;
+ _newCameraPos = _cameraPos;
+ break;
+ }
+ }
+ break;
+ }
+ }
+
+ if (sounds)
+ updateBackgroundSounds();
+
+}
+
+bool BbvsEngine::changeScene() {
+
+ writeContinueSavegame();
+
+ if (_newSceneNum >= 27 && _newSceneNum <= 30) {
+ // Run minigames
+ stopSpeech();
+ stopSounds();
+ _sceneVisited[_currSceneNum] = 1;
+ if (runMinigame(_newSceneNum - 27)) {
+ SWAP(_currSceneNum, _newSceneNum);
+ }
+ } else if (_newSceneNum >= 31 && _newSceneNum <= 43) {
+ // Play video
+ stopSpeech();
+ stopSounds();
+ _sceneVisited[_currSceneNum] = 1;
+ _playVideoNumber = _newSceneNum - 30;
+ _currSceneNum = _newSceneNum;
+ _newSceneNum = kAfterVideoSceneNum[_playVideoNumber];
+ } else if (_newSceneNum >= 100 && _currSceneNum == kCredits) {
+ // Play secret video
+ stopSounds();
+ _playVideoNumber = _newSceneNum;
+ _currSceneNum = 49;
+ _newSceneNum = kCredits;
+ } else {
+ // Normal scene
+ initScene(true);
+ }
+
+ return true;
+
+}
+
+} // End of namespace Bbvs
diff --git a/engines/bbvs/sound.cpp b/engines/bbvs/sound.cpp
new file mode 100644
index 0000000000..7f9c00ad48
--- /dev/null
+++ b/engines/bbvs/sound.cpp
@@ -0,0 +1,107 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+
+ * You should have received a copy of the GNU General Public 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 "bbvs/sound.h"
+#include "audio/decoders/aiff.h"
+#include "common/debug.h"
+#include "common/file.h"
+#include "common/system.h"
+
+namespace Bbvs {
+
+Sound::Sound() : _stream(0) {
+}
+
+Sound::~Sound() {
+ stop();
+ delete _stream;
+}
+
+void Sound::load(const Common::String &filename) {
+ Common::File *fd = new Common::File();
+ if (!fd->open(filename)) {
+ delete fd;
+ error("SoundMan::loadSound() Could not load %s", filename.c_str());
+ }
+ _stream = Audio::makeAIFFStream(fd, DisposeAfterUse::YES);
+ _filename = filename;
+}
+
+void Sound::play(bool loop) {
+ debug(0, "Sound::play() [%s] loop:%d", _filename.c_str(), loop);
+ stop();
+ _stream->rewind();
+ Audio::AudioStream *audioStream = Audio::makeLoopingAudioStream(_stream, loop ? 0 : 1);
+ g_system->getMixer()->playStream(Audio::Mixer::kSFXSoundType, &_handle, audioStream,
+ -1, Audio::Mixer::kMaxChannelVolume, 0, DisposeAfterUse::NO);
+}
+
+void Sound::stop() {
+ g_system->getMixer()->stopHandle(_handle);
+}
+
+bool Sound::isPlaying() {
+ return g_system->getMixer()->isSoundHandleActive(_handle);
+}
+
+SoundMan::~SoundMan() {
+ stopAllSounds();
+ unloadSounds();
+}
+
+void SoundMan::loadSound(const Common::String &filename) {
+ Sound *sound = new Sound();
+ sound->load(filename);
+ _sounds.push_back(sound);
+}
+
+void SoundMan::playSound(uint index, bool loop) {
+ _sounds[index]->play(loop);
+}
+
+void SoundMan::stopSound(uint index) {
+ _sounds[index]->stop();
+}
+
+bool SoundMan::isSoundPlaying(uint index) {
+ return _sounds[index]->isPlaying();
+}
+
+bool SoundMan::isAnySoundPlaying(uint *indices, uint count) {
+ for (uint i = 0; i < count; ++i)
+ if (isSoundPlaying(indices[i]))
+ return true;
+ return false;
+}
+
+void SoundMan::unloadSounds() {
+ for (uint i = 0; i < _sounds.size(); ++i)
+ delete _sounds[i];
+ _sounds.clear();
+}
+
+void SoundMan::stopAllSounds() {
+ for (uint i = 0; i < _sounds.size(); ++i)
+ _sounds[i]->stop();
+}
+
+} // End of namespace Bbvs
diff --git a/engines/bbvs/sound.h b/engines/bbvs/sound.h
new file mode 100644
index 0000000000..4e44c2b962
--- /dev/null
+++ b/engines/bbvs/sound.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 BBVS_SOUND_H
+#define BBVS_SOUND_H
+
+#include "audio/audiostream.h"
+#include "audio/mixer.h"
+#include "common/array.h"
+
+namespace Bbvs {
+
+class Sound {
+public:
+ Sound();
+ ~Sound();
+ void load(const Common::String &filename);
+ void play(bool loop);
+ void stop();
+ bool isPlaying();
+protected:
+ Audio::SeekableAudioStream *_stream;
+ Audio::SoundHandle _handle;
+ // Keep the filename for debugging purposes
+ Common::String _filename;
+};
+
+class SoundMan {
+public:
+ ~SoundMan();
+ void loadSound(const Common::String &fileName);
+ void playSound(uint index, bool loop = false);
+ void stopSound(uint index);
+ bool isSoundPlaying(uint index);
+ bool isAnySoundPlaying(uint *indices, uint count);
+ void unloadSounds();
+ void stopAllSounds();
+protected:
+ Common::Array<Sound*> _sounds;
+};
+
+} // End of namespace Bbvs
+
+#endif // BBVS_SOUND_H
diff --git a/engines/bbvs/spritemodule.cpp b/engines/bbvs/spritemodule.cpp
new file mode 100644
index 0000000000..8eae7f9a6a
--- /dev/null
+++ b/engines/bbvs/spritemodule.cpp
@@ -0,0 +1,112 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+
+ * You should have received a copy of the GNU General Public 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 "bbvs/spritemodule.h"
+
+namespace Bbvs {
+
+byte *Sprite::getRow(int y) {
+ if (type == 1)
+ return data + READ_LE_UINT32((data + offset) + y * 4);
+ else
+ return data + offset + y * width;
+}
+
+SpriteModule::SpriteModule()
+ : _spritesCount(0), _paletteStart(0), _paletteCount(0), _spriteData(0) {
+}
+
+SpriteModule::~SpriteModule() {
+ unload();
+}
+
+void SpriteModule::load(const char *filename) {
+ unload();
+
+ Common::File fd;
+ if (!fd.open(filename))
+ error("SpriteModule::load() Could not open %s", filename);
+
+ fd.readUint32LE(); // Skip magic
+ fd.readUint32LE(); // Skip unused
+ fd.readUint32LE(); // Skip filesize
+
+ _paletteOffs = fd.readUint32LE();
+ fd.readUint32LE(); // Skip unused flagsTbl1Ofs
+ fd.readUint32LE(); // Skip unused flagsTbl2Ofs
+ _spriteTblOffs = fd.readUint32LE();
+ _paletteStart = fd.readUint32LE();
+ _paletteCount = fd.readUint32LE();
+ _spritesCount = fd.readUint32LE();
+
+ debug(0, "_paletteOffs: %08X", _paletteOffs);
+ debug(0, "_spriteTblOffs: %08X", _spriteTblOffs);
+ debug(0, "_paletteStart: %d", _paletteStart);
+ debug(0, "_paletteCount: %d", _paletteCount);
+ debug(0, "_spritesCount: %d", _spritesCount);
+
+ _spriteDataSize = fd.size();
+ _spriteData = new byte[_spriteDataSize];
+ fd.seek(0);
+ fd.read(_spriteData, _spriteDataSize);
+
+ // Convert palette
+ byte *palette = _spriteData + _paletteOffs;
+ for (int i = 0; i < _paletteCount; ++i) {
+ palette[i * 3 + 0] <<= 2;
+ palette[i * 3 + 1] <<= 2;
+ palette[i * 3 + 2] <<= 2;
+ }
+
+}
+
+Sprite SpriteModule::getSprite(int index) {
+ Sprite sprite;
+ uint32 spriteOffs = READ_LE_UINT32(_spriteData + _spriteTblOffs + index * 4);
+ byte *info = _spriteData + spriteOffs;
+ sprite.data = _spriteData;
+ sprite.offset = READ_LE_UINT32(info + 0);
+ sprite.type = READ_LE_UINT32(info + 4);
+ sprite.width = READ_LE_UINT32(info + 8);
+ sprite.height = READ_LE_UINT32(info + 12);
+ sprite.xOffs = READ_LE_UINT32(info + 16);
+ sprite.yOffs = READ_LE_UINT32(info + 20);
+ return sprite;
+}
+
+Palette SpriteModule::getPalette() {
+ Palette palette;
+ palette.data = _spriteData + _paletteOffs;
+ palette.start = _paletteStart;
+ palette.count = _paletteCount;
+ return palette;
+}
+
+void SpriteModule::unload() {
+ _spritesCount = 0;
+ _paletteStart = 0;
+ _paletteCount = 0;
+ delete[] _spriteData;
+ _spriteData = 0;
+}
+
+} // End of namespace Bbvs
diff --git a/engines/bbvs/spritemodule.h b/engines/bbvs/spritemodule.h
new file mode 100644
index 0000000000..c287815dec
--- /dev/null
+++ b/engines/bbvs/spritemodule.h
@@ -0,0 +1,68 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+
+ * You should have received a copy of the GNU General Public 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 BBVS_SPRITEMODULE_H
+#define BBVS_SPRITEMODULE_H
+
+#include "common/array.h"
+#include "common/file.h"
+#include "common/memstream.h"
+#include "common/rect.h"
+#include "common/str.h"
+
+namespace Bbvs {
+
+struct Sprite {
+ int type;
+ int xOffs, yOffs;
+ int width, height;
+ byte *data;
+ uint32 offset;
+ byte *getRow(int y);
+};
+
+struct Palette {
+ byte *data;
+ int start, count;
+};
+
+class SpriteModule {
+public:
+ SpriteModule();
+ ~SpriteModule();
+ void load(const char *filename);
+ int getSpriteCount() { return _spritesCount; }
+ Sprite getSprite(int index);
+ Palette getPalette();
+protected:
+ byte *_spriteData;
+ int _spriteDataSize;
+ int _spritesCount;
+ uint32 _spriteTblOffs;
+ uint32 _paletteOffs;
+ int _paletteStart, _paletteCount;
+ void unload();
+};
+
+} // End of namespace Bbvs
+
+#endif // BBVS_SPRITEMODULE_H
diff --git a/engines/bbvs/videoplayer.cpp b/engines/bbvs/videoplayer.cpp
new file mode 100644
index 0000000000..fda9372ade
--- /dev/null
+++ b/engines/bbvs/videoplayer.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 "bbvs/bbvs.h"
+#include "engines/util.h"
+#include "graphics/palette.h"
+#include "graphics/surface.h"
+#include "video/avi_decoder.h"
+
+namespace Bbvs {
+
+void BbvsEngine::playVideo(int videoNum) {
+ Common::String videoFilename;
+
+ if (videoNum >= 100)
+ videoFilename = Common::String::format("snd/snd%05d.aif", videoNum + 1400);
+ else
+ videoFilename = Common::String::format("vid/video%03d.avi", videoNum - 1);
+
+ // Set the correct video mode
+ initGraphics(320, 240, false, 0);
+ if (_system->getScreenFormat().bytesPerPixel == 1) {
+ warning("Couldn't switch to a RGB color video mode to play a video.");
+ return;
+ }
+
+ Video::VideoDecoder *videoDecoder = new Video::AVIDecoder();
+ if (!videoDecoder->loadFile(videoFilename)) {
+ delete videoDecoder;
+ warning("Unable to open video %s", videoFilename.c_str());
+ return;
+ }
+
+ videoDecoder->start();
+
+ bool skipVideo = false;
+
+ while (!shouldQuit() && !videoDecoder->endOfVideo() && !skipVideo) {
+ if (videoDecoder->needsUpdate()) {
+ const Graphics::Surface *frame = videoDecoder->decodeNextFrame();
+ if (frame) {
+ _system->copyRectToScreen(frame->getPixels(), frame->pitch, 0, 0, frame->w, frame->h);
+ _system->updateScreen();
+ }
+ }
+
+ Common::Event event;
+ while (g_system->getEventManager()->pollEvent(event)) {
+ if ((event.type == Common::EVENT_KEYDOWN && event.kbd.keycode == Common::KEYCODE_ESCAPE) ||
+ event.type == Common::EVENT_LBUTTONUP)
+ skipVideo = true;
+ }
+
+ _system->delayMillis(10);
+ }
+
+ delete videoDecoder;
+
+ initGraphics(320, 240, false);
+
+}
+
+} // End of namespace Bbvs
diff --git a/engines/bbvs/walk.cpp b/engines/bbvs/walk.cpp
new file mode 100644
index 0000000000..077110b867
--- /dev/null
+++ b/engines/bbvs/walk.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 "bbvs/bbvs.h"
+#include "bbvs/gamemodule.h"
+
+namespace Bbvs {
+
+static const int8 kTurnInfo[8][8] = {
+ { 0, 1, 1, 1, 1, -1, -1, -1},
+ {-1, 0, 1, 1, 1, 1, -1, -1},
+ {-1, -1, 0, 1, 1, 1, 1, -1},
+ {-1, -1, -1, 0, 1, 1, 1, 1},
+ { 1, -1, -1, -1, 0, 1, 1, 1},
+ { 1, 1, -1, -1, -1, 0, 1, 1},
+ { 1, 1, 1, -1, -1, -1, 0, 1},
+ { 1, 1, 1, 1, -1, -1, -1, 0}
+};
+
+static const int8 kWalkAnimTbl[32] = {
+ 3, 0, 0, 0, 2, 1, 1, 1,
+ 15, 12, 14, 13, 0, 0, 0, 0,
+ 7, 9, 4, 8, 6, 10, 5, 11,
+ 3, 0, 2, 1, 15, 12, 14, 13
+};
+
+void BbvsEngine::startWalkObject(SceneObject *sceneObject) {
+ if (_buttheadObject != sceneObject && _beavisObject != sceneObject)
+ return;
+
+ initWalkAreas(sceneObject);
+ _sourceWalkAreaPt.x = sceneObject->x >> 16;
+ _sourceWalkAreaPt.y = sceneObject->y >> 16;
+
+ _sourceWalkArea = getWalkAreaAtPos(_sourceWalkAreaPt);
+ if (!_sourceWalkArea)
+ return;
+
+ _destWalkAreaPt = sceneObject->walkDestPt;
+
+ _destWalkArea = getWalkAreaAtPos(_destWalkAreaPt);
+ if (!_destWalkArea)
+ return;
+
+ if (_sourceWalkArea != _destWalkArea) {
+ _currWalkDistance = kMaxDistance;
+ walkFindPath(_sourceWalkArea, 0);
+ _destWalkAreaPt = _currWalkDistance == kMaxDistance ? _sourceWalkAreaPt : _finalWalkPt;
+ }
+
+ walkObject(sceneObject, _destWalkAreaPt, sceneObject->sceneObjectDef->walkSpeed);
+
+}
+
+void BbvsEngine::updateWalkObject(SceneObject *sceneObject) {
+ int animIndex;
+
+ if (sceneObject->walkCount > 0 && (sceneObject->xIncr != 0 || sceneObject->yIncr != 0)) {
+ if (ABS(sceneObject->xIncr) <= ABS(sceneObject->yIncr))
+ sceneObject->turnValue = sceneObject->yIncr >= 0 ? 0 : 4;
+ else
+ sceneObject->turnValue = sceneObject->xIncr >= 0 ? 6 : 2;
+ animIndex = sceneObject->sceneObjectDef->animIndices[kWalkAnimTbl[sceneObject->turnValue]];
+ sceneObject->turnCount = 0;
+ sceneObject->turnTicks = 0;
+ } else {
+ animIndex = sceneObject->sceneObjectDef->animIndices[kWalkTurnTbl[sceneObject->turnValue]];
+ }
+
+ Animation *anim = 0;
+ if (animIndex > 0)
+ anim = _gameModule->getAnimation(animIndex);
+
+ if (sceneObject->anim != anim) {
+ if (anim) {
+ sceneObject->anim = anim;
+ sceneObject->animIndex = animIndex;
+ sceneObject->frameTicks = 1;
+ sceneObject->frameIndex = anim->frameCount - 1;
+ } else {
+ sceneObject->anim = 0;
+ sceneObject->animIndex = 0;
+ sceneObject->frameTicks = 0;
+ sceneObject->frameIndex = 0;
+ }
+ }
+
+}
+
+void BbvsEngine::walkObject(SceneObject *sceneObject, const Common::Point &destPt, int walkSpeed) {
+ int deltaX = destPt.x - (sceneObject->x >> 16);
+ int deltaY = destPt.y - (sceneObject->y >> 16);
+ float distance = (float)sqrt((double)(deltaX * deltaX + deltaY * deltaY));
+ // NOTE The original doesn't have this check but without it the whole pathfinding breaks
+ if (distance > 0.0f) {
+ sceneObject->walkCount = (int)(distance / ((((float)ABS(deltaX) / distance) + 1.0f) * ((float)walkSpeed / 120)));
+ sceneObject->xIncr = (int)(((float)deltaX / sceneObject->walkCount) * 65536.0f);
+ sceneObject->yIncr = (int)(((float)deltaY / sceneObject->walkCount) * 65536.0f);
+ sceneObject->x = (sceneObject->x & 0xFFFF0000) | 0x8000;
+ sceneObject->y = (sceneObject->y & 0xFFFF0000) | 0x8000;
+ } else
+ sceneObject->walkCount = 0;
+}
+
+void BbvsEngine::turnObject(SceneObject *sceneObject) {
+ if (sceneObject->turnTicks > 0) {
+ --sceneObject->turnTicks;
+ } else {
+ int turnDir = kTurnInfo[sceneObject->turnValue][sceneObject->turnCount & 0x7F];
+ if (turnDir) {
+ sceneObject->turnValue = (sceneObject->turnValue + turnDir) & 7;
+ int turnAnimIndex = sceneObject->sceneObjectDef->animIndices[kWalkTurnTbl[sceneObject->turnValue]];
+ if (turnAnimIndex) {
+ Animation *anim = _gameModule->getAnimation(turnAnimIndex);
+ if (anim) {
+ sceneObject->anim = anim;
+ sceneObject->animIndex = turnAnimIndex;
+ sceneObject->turnTicks = 4;
+ sceneObject->frameTicks = 1;
+ sceneObject->frameIndex = anim->frameCount - 1;
+ }
+ }
+ } else {
+ sceneObject->turnCount = 0;
+ }
+ }
+}
+
+int BbvsEngine::rectSubtract(const Common::Rect &rect1, const Common::Rect &rect2, Common::Rect *outRects) {
+ int count = 0;
+ Common::Rect workRect = rect1.findIntersectingRect(rect2);
+ if (!workRect.isEmpty()) {
+ count = 0;
+ outRects[count] = Common::Rect(rect2.width(), workRect.top - rect2.top);
+ if (!outRects[count].isEmpty()) {
+ outRects[count].translate(rect2.left, rect2.top);
+ ++count;
+ }
+ outRects[count] = Common::Rect(workRect.left - rect2.left, workRect.height());
+ if (!outRects[count].isEmpty()) {
+ outRects[count].translate(rect2.left, workRect.top);
+ ++count;
+ }
+ outRects[count] = Common::Rect(rect2.right - workRect.right, workRect.height());
+ if (!outRects[count].isEmpty()) {
+ outRects[count].translate(workRect.right, workRect.top);
+ ++count;
+ }
+ outRects[count] = Common::Rect(rect2.width(), rect2.bottom - workRect.bottom);
+ if (!outRects[count].isEmpty()) {
+ outRects[count].translate(rect2.left, workRect.bottom);
+ ++count;
+ }
+ } else {
+ outRects[0] = rect2;
+ count = 1;
+ }
+ return count;
+}
+
+WalkInfo *BbvsEngine::addWalkInfo(int16 x, int16 y, int delta, int direction, int16 midPtX, int16 midPtY, int walkAreaIndex) {
+ WalkInfo *walkInfo = &_walkInfos[_walkInfosCount++];
+ walkInfo->walkAreaIndex = walkAreaIndex;
+ walkInfo->direction = direction;
+ walkInfo->x = x;
+ walkInfo->y = y;
+ walkInfo->delta = delta;
+ walkInfo->midPt.x = midPtX;
+ walkInfo->midPt.y = midPtY;
+ return walkInfo;
+}
+
+void BbvsEngine::initWalkAreas(SceneObject *sceneObject) {
+ int16 objX = sceneObject->x >> 16;
+ int16 objY = sceneObject->y >> 16;
+ Common::Rect rect;
+ bool doRect = false;
+ Common::Rect *workWalkableRects;
+
+ if (_buttheadObject == sceneObject && _beavisObject->anim) {
+ rect = _beavisObject->anim->frameRects2[_beavisObject->frameIndex];
+ rect.translate(_beavisObject->x >> 16, 1 + (_beavisObject->y >> 16));
+ doRect = !rect.isEmpty();
+ } else if (_buttheadObject->anim) {
+ rect = _buttheadObject->anim->frameRects2[_buttheadObject->frameIndex];
+ rect.translate(_buttheadObject->x >> 16, 1 + (_buttheadObject->y >> 16));
+ doRect = !rect.isEmpty();
+ }
+
+ workWalkableRects = _walkableRects;
+
+ _walkAreasCount = _walkableRectsCount;
+
+ if (doRect && !rect.contains(objX, objY)) {
+ _walkAreasCount = 0;
+ for (int i = 0; i < _walkableRectsCount; ++i)
+ _walkAreasCount += rectSubtract(rect, _walkableRects[i], &_tempWalkableRects1[_walkAreasCount]);
+ workWalkableRects = _tempWalkableRects1;
+ }
+
+ for (int i = 0; i < _walkAreasCount; ++i) {
+ _walkAreas[i].x = workWalkableRects[i].left;
+ _walkAreas[i].y = workWalkableRects[i].top;
+ _walkAreas[i].width = workWalkableRects[i].width();
+ _walkAreas[i].height = workWalkableRects[i].height();
+ _walkAreas[i].checked = false;
+ _walkAreas[i].linksCount = 0;
+ }
+
+ _walkInfosCount = 0;
+
+ // Find connections between the walkRects
+
+ for (int i = 0; i < _walkAreasCount; ++i) {
+ WalkArea *walkArea1 = &_walkAreas[i];
+ int xIter = walkArea1->x + walkArea1->width;
+ int yIter = walkArea1->y + walkArea1->height;
+
+ for (int j = 0; j < _walkAreasCount; ++j) {
+ WalkArea *walkArea2 = &_walkAreas[j];
+
+ if (i == j)
+ continue;
+
+ if (walkArea2->y == yIter) {
+ int wa1x = MAX(walkArea1->x, walkArea2->x);
+ int wa2x = MIN(walkArea2->x + walkArea2->width, xIter);
+ if (wa2x > wa1x) {
+ debug(5, "WalkArea %d connected to %d by Y", i, j);
+ WalkInfo *walkInfo1 = addWalkInfo(wa1x, yIter - 1, wa2x - wa1x, 0, wa1x + (wa2x - wa1x) / 2, yIter - 1, i);
+ WalkInfo *walkInfo2 = addWalkInfo(wa1x, yIter, wa2x - wa1x, 0, wa1x + (wa2x - wa1x) / 2, yIter, j);
+ walkArea1->linksD1[walkArea1->linksCount] = walkInfo1;
+ walkArea1->linksD2[walkArea1->linksCount] = walkInfo2;
+ walkArea1->links[walkArea1->linksCount++] = walkArea2;
+ walkArea2->linksD1[walkArea2->linksCount] = walkInfo2;
+ walkArea2->linksD2[walkArea2->linksCount] = walkInfo1;
+ walkArea2->links[walkArea2->linksCount++] = walkArea1;
+ }
+ }
+
+ if (walkArea2->x == xIter) {
+ int wa1y = MAX(walkArea1->y, walkArea2->y);
+ int wa2y = MIN(walkArea2->y + walkArea2->height, yIter);
+ if (wa2y > wa1y) {
+ debug(5, "WalkArea %d connected to %d by X", i, j);
+ WalkInfo *walkInfo1 = addWalkInfo(xIter - 1, wa1y, wa2y - wa1y, 1, xIter - 1, wa1y + (wa2y - wa1y) / 2, i);
+ WalkInfo *walkInfo2 = addWalkInfo(xIter, wa1y, wa2y - wa1y, 1, xIter, wa1y + (wa2y - wa1y) / 2, j);
+ walkArea1->linksD1[walkArea1->linksCount] = walkInfo1;
+ walkArea1->linksD2[walkArea1->linksCount] = walkInfo2;
+ walkArea1->links[walkArea1->linksCount++] = walkArea2;
+ walkArea2->linksD1[walkArea2->linksCount] = walkInfo2;
+ walkArea2->linksD2[walkArea2->linksCount] = walkInfo1;
+ walkArea2->links[walkArea2->linksCount++] = walkArea1;
+ }
+ }
+
+ }
+
+ }
+
+}
+
+WalkArea *BbvsEngine::getWalkAreaAtPos(const Common::Point &pt) {
+ for (int i = 0; i < _walkAreasCount; ++i) {
+ WalkArea *walkArea = &_walkAreas[i];
+ if (walkArea->contains(pt))
+ return walkArea;
+ }
+ return 0;
+}
+
+bool BbvsEngine::canButtheadWalkToDest(const Common::Point &destPt) {
+ Common::Point srcPt;
+
+ _walkReachedDestArea = false;
+ initWalkAreas(_buttheadObject);
+ srcPt.x = _buttheadObject->x >> 16;
+ srcPt.y = _buttheadObject->y >> 16;
+ _sourceWalkArea = getWalkAreaAtPos(srcPt);
+ if (_sourceWalkArea) {
+ _destWalkArea = getWalkAreaAtPos(destPt);
+ if (_destWalkArea)
+ canWalkToDest(_sourceWalkArea, 0);
+ }
+ return _walkReachedDestArea;
+}
+
+void BbvsEngine::canWalkToDest(WalkArea *walkArea, int infoCount) {
+
+ if (_destWalkArea == walkArea) {
+ _walkReachedDestArea = true;
+ return;
+ }
+
+ if (_gameModule->getFieldC() <= 320 || infoCount <= 20) {
+ walkArea->checked = true;
+ for (int linkIndex = 0; linkIndex < walkArea->linksCount; ++linkIndex) {
+ if (!walkArea->links[linkIndex]->checked) {
+ canWalkToDest(walkArea->links[linkIndex], infoCount + 2);
+ if (_walkReachedDestArea)
+ break;
+ }
+ }
+ walkArea->checked = false;
+ }
+
+}
+
+bool BbvsEngine::walkTestLineWalkable(const Common::Point &sourcePt, const Common::Point &destPt, WalkInfo *walkInfo) {
+ const float ptDeltaX = destPt.x - sourcePt.x;
+ const float ptDeltaY = destPt.y - sourcePt.y;
+ const float wDeltaX = walkInfo->x - sourcePt.x;
+ const float wDeltaY = walkInfo->y - sourcePt.y;
+ if (destPt.x == sourcePt.x)
+ return true;
+ if (walkInfo->direction) {
+ const float nDeltaY = wDeltaX * ptDeltaY / ptDeltaX + (float)sourcePt.y - (float)walkInfo->y;
+ return (nDeltaY >= 0.0f) && (nDeltaY < (float)walkInfo->delta);
+ } else {
+ const float nDeltaX = wDeltaY / ptDeltaX * ptDeltaY + (float)sourcePt.x - (float)walkInfo->x;
+ return (nDeltaX >= 0.0f) && (nDeltaX < (float)walkInfo->delta);
+ }
+ return false;
+}
+
+void BbvsEngine::walkFindPath(WalkArea *sourceWalkArea, int infoCount) {
+ if (_destWalkArea == sourceWalkArea) {
+ walkFoundPath(infoCount);
+ } else if (_gameModule->getFieldC() <= 320 || infoCount <= 20) {
+ sourceWalkArea->checked = true;
+ for (int linkIndex = 0; linkIndex < sourceWalkArea->linksCount; ++linkIndex) {
+ if (!sourceWalkArea->links[linkIndex]->checked) {
+ _walkInfoPtrs[infoCount + 0] = sourceWalkArea->linksD1[linkIndex];
+ _walkInfoPtrs[infoCount + 1] = sourceWalkArea->linksD2[linkIndex];
+ walkFindPath(sourceWalkArea->links[linkIndex], infoCount + 2);
+ }
+ }
+ sourceWalkArea->checked = false;
+ }
+}
+
+int BbvsEngine::calcDistance(const Common::Point &pt1, const Common::Point &pt2) {
+ return (int)sqrt((double)(pt1.x - pt2.x) * (pt1.x - pt2.x) + (pt1.y - pt2.y) * (pt1.y - pt2.y));
+}
+
+void BbvsEngine::walkFoundPath(int count) {
+ debug(5, "BbvsEngine::walkFoundPath(%d)", count);
+
+ Common::Point midPt = _sourceWalkAreaPt;
+ int totalMidPtDistance = 0;
+
+ if (count > 0) {
+ Common::Point lastMidPt;
+ int halfCount = (count + 1) >> 1;
+ for (int i = 0; i < halfCount; ++i) {
+ lastMidPt = midPt;
+ midPt = _walkInfoPtrs[i * 2]->midPt;
+ totalMidPtDistance += calcDistance(midPt, lastMidPt);
+ }
+ }
+
+ int distance = calcDistance(midPt, _destWalkAreaPt) + totalMidPtDistance;
+
+ debug(5, "BbvsEngine::walkFoundPath() distance: %d; _currWalkDistance: %d", distance, _currWalkDistance);
+
+ if (distance >= _currWalkDistance)
+ return;
+
+ debug(5, "BbvsEngine::walkFoundPath() distance smaller");
+
+ _currWalkDistance = distance;
+
+ Common::Point destPt = _destWalkAreaPt, newDestPt;
+
+ while (1) {
+
+ int index = 0;
+ if (count > 0) {
+ do {
+ if (!walkTestLineWalkable(_sourceWalkAreaPt, destPt, _walkInfoPtrs[index]))
+ break;
+ ++index;
+ } while (index < count);
+ }
+
+ if (index == count)
+ break;
+
+ WalkInfo *walkInfo = _walkInfoPtrs[--count];
+ destPt.x = walkInfo->x;
+ destPt.y = walkInfo->y;
+
+ if (walkInfo->direction) {
+ newDestPt.x = walkInfo->x;
+ newDestPt.y = walkInfo->y + walkInfo->delta - 1;
+ } else {
+ newDestPt.x = walkInfo->x + walkInfo->delta - 1;
+ newDestPt.y = walkInfo->y;
+ }
+
+ if ((newDestPt.x - _destWalkAreaPt.x) * (newDestPt.x - _destWalkAreaPt.x) +
+ (newDestPt.y - _destWalkAreaPt.y) * (newDestPt.y - _destWalkAreaPt.y) <
+ (destPt.x - _destWalkAreaPt.x) * (destPt.x - _destWalkAreaPt.x) +
+ (destPt.y - _destWalkAreaPt.y) * (destPt.y - _destWalkAreaPt.y))
+ destPt = newDestPt;
+
+ }
+
+ debug(5, "BbvsEngine::walkFoundPath() destPt: (%d, %d)", destPt.x, destPt.y);
+
+ _finalWalkPt = destPt;
+
+ debug(5, "BbvsEngine::walkFoundPath() OK");
+
+}
+
+void BbvsEngine::updateWalkableRects() {
+ // Go through all walkable rects and subtract all scene object rects
+ Common::Rect *rectsList1 = _tempWalkableRects1;
+ Common::Rect *rectsList2 = _gameModule->getWalkRects();
+ _walkableRectsCount = _gameModule->getWalkRectsCount();
+ for (int i = 0; i < _gameModule->getSceneObjectDefsCount(); ++i) {
+ SceneObject *sceneObject = &_sceneObjects[i];
+ Animation *anim = sceneObject->anim;
+ if (anim && _buttheadObject != sceneObject && _beavisObject != sceneObject) {
+ Common::Rect rect = sceneObject->anim->frameRects2[sceneObject->frameIndex];
+ rect.translate(sceneObject->x >> 16, sceneObject->y >> 16);
+ int count = _walkableRectsCount;
+ _walkableRectsCount = 0;
+ for (int j = 0; j < count; ++j)
+ _walkableRectsCount += rectSubtract(rect, rectsList2[j], &rectsList1[_walkableRectsCount]);
+ if (rectsList1 == _tempWalkableRects1) {
+ rectsList1 = _tempWalkableRects2;
+ rectsList2 = _tempWalkableRects1;
+ } else {
+ rectsList1 = _tempWalkableRects1;
+ rectsList2 = _tempWalkableRects2;
+ }
+ }
+ }
+ for (int i = 0; i < _walkableRectsCount; ++i)
+ _walkableRects[i] = rectsList2[i];
+}
+
+} // End of namespace Bbvs
diff --git a/engines/cge/bitmap.cpp b/engines/cge/bitmap.cpp
index 989d2bbe99..536db5e73b 100644
--- a/engines/cge/bitmap.cpp
+++ b/engines/cge/bitmap.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -72,16 +72,16 @@ Bitmap::Bitmap(CGEEngine *vm, uint16 w, uint16 h, uint8 fill)
// + room for wash table
assert(v != NULL);
- *(uint16 *) v = TO_LE_16(kBmpCPY | dsiz); // data chunk hader
+ WRITE_LE_UINT16(v, (kBmpCPY | dsiz)); // data chunk hader
memset(v + 2, fill, dsiz); // data bytes
- *(uint16 *)(v + lsiz - 2) = TO_LE_16(kBmpSKP | ((kScrWidth / 4) - dsiz)); // gap
+ WRITE_LE_UINT16(v + lsiz - 2, (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
+ WRITE_LE_UINT16(v + psiz - 2, kBmpEOI); // plane trailer uint16
// Replicate planes
for (destP = v + psiz; destP < (v + 4 * psiz); destP += psiz)
@@ -293,6 +293,7 @@ bool Bitmap::solidAt(int16 x, int16 y) {
switch (t) {
case kBmpEOI:
r--;
+ // No break on purpose
case kBmpSKP:
w = 0;
break;
diff --git a/engines/cge/bitmap.h b/engines/cge/bitmap.h
index 3de05ac2fd..2768271b23 100644
--- a/engines/cge/bitmap.h
+++ b/engines/cge/bitmap.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/cge/cge.cpp b/engines/cge/cge.cpp
index af7e91f7eb..7058314b9d 100644
--- a/engines/cge/cge.cpp
+++ b/engines/cge/cge.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -50,12 +50,68 @@ CGEEngine::CGEEngine(OSystem *syst, const ADGameDescription *gameDescription)
DebugMan.addDebugChannel(kCGEDebugFile, "file", "CGE IO debug channel");
DebugMan.addDebugChannel(kCGEDebugEngine, "engine", "CGE Engine debug channel");
- _startupMode = 1;
- _oldLev = 0;
- _pocPtr = 0;
- _bitmapPalette = NULL;
+ _bitmapPalette = nullptr;
+ _pocLight = nullptr;
+ _keyboard = nullptr;
+ _mouse = nullptr;
+ _sprite = nullptr;
+ _miniScene = nullptr;
+ _shadow = nullptr;
+ _horzLine = nullptr;
+ _infoLine = nullptr;
+ _debugLine = nullptr;
+ _sceneLight = nullptr;
+ _commandHandler = nullptr;
+ _commandHandlerTurbo = nullptr;
+ _eventManager = nullptr;
+ _fx = nullptr;
+ _sound = nullptr;
+ _resman = nullptr;
+ for (int i = 0; i < 8; i++)
+ _pocket[i] = nullptr;
+ _hero = nullptr;
+ _text = nullptr;
+ _talk = nullptr;
+ _midiPlayer = nullptr;
+ _miniShp = nullptr;
+ _miniShpList = nullptr;
+ _console = nullptr;
+ _sprTv = nullptr;
+ _sprK1 = nullptr;
+ _sprK2 = nullptr;
+ _sprK3 = nullptr;
+ _font = nullptr;
+ _vga = nullptr;
+ _sys = nullptr;
+
_quitFlag = false;
_showBoundariesFl = false;
+ _music = true;
+ _dark = false;
+ _game = false;
+ _endGame = false;
+ for (int i = 0; i < 4; i++)
+ _flag[i] = false;
+
+ _startupMode = 1;
+ _oldLev = 0;
+ _pocPtr = 0;
+ _startGameSlot = -1;
+ _recentStep = -2;
+ _lastFrame = 0;
+ _lastTick = 0;
+ _maxScene = 0;
+ _now = 1;
+ _lev = -1;
+ _mode = 0;
+ _gameCase2Cpt = 0;
+ _offUseCount = 0;
+ _volume[0] = 0;
+ _volume[1] = 0;
+ for (int i = 0; i < kPocketNX; i++)
+ _pocref[i] = -1;
+
+ initSceneValues();
}
void CGEEngine::initSceneValues() {
@@ -71,31 +127,30 @@ void CGEEngine::initSceneValues() {
}
void CGEEngine::init() {
- debugC(1, kCGEDebugEngine, "CGEEngine::setup()");
+ debugC(1, kCGEDebugEngine, "CGEEngine::init()");
+
+ // Initialize fields
+ _hero = nullptr;
+ _shadow = nullptr;
+ _miniScene = nullptr;
+ _miniShp = nullptr;
+ _miniShpList = nullptr;
+ _sprite = nullptr;
- // 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
+ // Initialize engine objects
_font = new Font(this, "CGE");
_text = new Text(this, "CGE");
- _talk = NULL;
+ _talk = nullptr;
_vga = new Vga(this);
_sys = new System(this);
_pocLight = new PocLight(this);
for (int i = 0; i < kPocketNX; i++)
- _pocket[i] = NULL;
+ _pocket[i] = nullptr;
_horzLine = new HorizLine(this);
_infoLine = new InfoLine(this, kInfoW);
_sceneLight = new SceneLight(this);
@@ -110,30 +165,6 @@ void CGEEngine::init() {
_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;
- _endGame = 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;
_startGameSlot = ConfMan.hasKey("save_slot") ? ConfMan.getInt("save_slot") : -1;
}
@@ -188,7 +219,7 @@ Common::Error CGEEngine::run() {
}
// Initialize graphics using following:
- initGraphics(320, 200, false);
+ initGraphics(kScrWidth, kScrHeight, false);
// Setup necessary game objects
init();
diff --git a/engines/cge/cge.h b/engines/cge/cge.h
index 61558c0989..a65069ff46 100644
--- a/engines/cge/cge.h
+++ b/engines/cge/cge.h
@@ -1,24 +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.
-*
-*/
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public 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
@@ -107,7 +107,6 @@ struct SavegameHeader {
Graphics::Surface *thumbnail;
int saveYear, saveMonth, saveDay;
int saveHour, saveMinutes;
- int totalFrames;
};
extern const char *savegameStr;
@@ -168,7 +167,6 @@ public:
int _now;
int _lev;
int _mode;
- int _soundOk;
int _gameCase2Cpt;
int _offUseCount;
Dac *_bitmapPalette;
diff --git a/engines/cge/cge_main.cpp b/engines/cge/cge_main.cpp
index ae4dee6090..e738b6ebb3 100644
--- a/engines/cge/cge_main.cpp
+++ b/engines/cge/cge_main.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -125,9 +125,8 @@ char *CGEEngine::mergeExt(char *buf, const char *name, const char *ext) {
}
int CGEEngine::takeEnum(const char **tab, const char *text) {
- const char **e;
if (text) {
- for (e = tab; *e; e++) {
+ for (const char **e = tab; *e; e++) {
if (scumm_stricmp(text, *e) == 0) {
return e - tab;
}
@@ -196,7 +195,6 @@ 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
@@ -232,6 +230,8 @@ bool CGEEngine::loadGame(int slotNumber, SavegameHeader *header, bool tiny) {
return false;
} else {
// Found header
+ SavegameHeader saveHeader;
+
if (!readSavegameHeader(readStream, saveHeader)) {
delete readStream;
return false;
@@ -398,7 +398,7 @@ void CGEEngine::syncGame(Common::SeekableReadStream *readStream, Common::WriteSt
}
} else {
// Loading game
- if (_soundOk == 1 && _mode == 0) {
+ if (_mode == 0) {
// Skip Digital and Midi volumes, useless under ScummVM
sndSetVolume();
}
@@ -425,7 +425,7 @@ void CGEEngine::syncGame(Common::SeekableReadStream *readStream, Common::WriteSt
}
bool CGEEngine::readSavegameHeader(Common::InSaveFile *in, SavegameHeader &header) {
- header.thumbnail = NULL;
+ header.thumbnail = nullptr;
// Get the savegame version
header.version = in->readByte();
@@ -539,14 +539,12 @@ 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());
- }
+ 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() {
@@ -659,14 +657,15 @@ void CGEEngine::sceneUp() {
_vga->copyPage(0, 1);
selectPocket(-1);
- if (_hero)
+ 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;
+ 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();
@@ -1031,7 +1030,6 @@ void CGEEngine::loadSprite(const char *fname, int ref, int scene, int col = 0, i
bool east = false;
bool port = false;
bool tran = false;
- int i, lcnt = 0;
char tmpStr[kLineMax + 1];
Common::String line;
@@ -1043,10 +1041,11 @@ void CGEEngine::loadSprite(const char *fname, int ref, int scene, int col = 0, i
error("Bad SPR [%s]", tmpStr);
uint16 len;
+ int i, lcnt = 0;
for (line = sprf.readLine(); !sprf.eos(); line = sprf.readLine()) {
len = line.size();
lcnt++;
- strcpy(tmpStr, line.c_str());
+ Common::strlcpy(tmpStr, line.c_str(), sizeof(tmpStr));
if (len == 0 || *tmpStr == '.')
continue;
@@ -1132,7 +1131,7 @@ void CGEEngine::loadSprite(const char *fname, int ref, int scene, int col = 0, i
_sprite->_flags._bDel = true;
// Extract the filename, without the extension
- strcpy(_sprite->_file, fname);
+ Common::strlcpy(_sprite->_file, fname, sizeof(_sprite->_file));
char *p = strchr(_sprite->_file, '.');
if (p)
*p = '\0';
@@ -1158,7 +1157,7 @@ void CGEEngine::loadScript(const char *fname) {
char *p;
lcnt++;
- strcpy(tmpStr, line.c_str());
+ Common::strlcpy(tmpStr, line.c_str(), sizeof(tmpStr));
if ((line.size() == 0) || (*tmpStr == '.'))
continue;
@@ -1485,25 +1484,6 @@ bool CGEEngine::showTitle(const char *name) {
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 (_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
@@ -1542,7 +1522,7 @@ void CGEEngine::cge_main() {
if (_horzLine)
_horzLine->_flags._hide = true;
- if (_music && _soundOk)
+ if (_music)
_midiPlayer->loadMidi(0);
if (_startGameSlot != -1) {
diff --git a/engines/cge/cge_main.h b/engines/cge/cge_main.h
index bde8306f36..e0438f7a39 100644
--- a/engines/cge/cge_main.h
+++ b/engines/cge/cge_main.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/cge/configure.engine b/engines/cge/configure.engine
new file mode 100644
index 0000000000..72af1197be
--- /dev/null
+++ b/engines/cge/configure.engine
@@ -0,0 +1,3 @@
+# This file is included from the main "configure" script
+# add_engine [name] [desc] [build-by-default] [subengines] [base games] [deps]
+add_engine cge "CGE" yes
diff --git a/engines/cge/console.cpp b/engines/cge/console.cpp
index 105f241944..e926e89506 100644
--- a/engines/cge/console.cpp
+++ b/engines/cge/console.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -26,7 +26,7 @@
namespace CGE {
CGEConsole::CGEConsole(CGEEngine *vm) : GUI::Debugger(), _vm(vm) {
- DCmd_Register("Boundaries", WRAP_METHOD(CGEConsole, Cmd_boundaries));
+ registerCmd("Boundaries", WRAP_METHOD(CGEConsole, Cmd_boundaries));
}
CGEConsole::~CGEConsole() {
@@ -37,7 +37,7 @@ CGEConsole::~CGEConsole() {
*/
bool CGEConsole::Cmd_boundaries(int argc, const char **argv) {
if (argc != 1) {
- DebugPrintf("Usage: %s\n", argv[0]);
+ debugPrintf("Usage: %s\n", argv[0]);
return true;
}
diff --git a/engines/cge/console.h b/engines/cge/console.h
index ea36dfbaae..ad4471283f 100644
--- a/engines/cge/console.h
+++ b/engines/cge/console.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/cge/detection.cpp b/engines/cge/detection.cpp
index 3b01421903..4c2f81c1ae 100644
--- a/engines/cge/detection.cpp
+++ b/engines/cge/detection.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -24,10 +24,22 @@
#include "engines/advancedDetector.h"
#include "common/savefile.h"
#include "common/system.h"
+#include "common/translation.h"
#include "base/plugins.h"
#include "graphics/thumbnail.h"
#include "cge/cge.h"
+namespace CGE {
+
+struct CgeGameDescription {
+ ADGameDescription desc;
+ GameType gameType;
+};
+
+#define GAMEOPTION_COLOR_BLIND_DEFAULT_OFF GUIO_GAMEOPTIONS1
+
+} // End of namespace CGE
+
static const PlainGameDescriptor CGEGames[] = {
{ "soltys", "Soltys" },
{ "sfinx", "Sfinx" },
@@ -36,11 +48,6 @@ static const PlainGameDescriptor CGEGames[] = {
namespace CGE {
-struct CgeGameDescription {
- ADGameDescription desc;
- GameType gameType;
-};
-
static const CgeGameDescription gameDescriptions[] = {
{
@@ -63,7 +70,7 @@ static const CgeGameDescription gameDescriptions[] = {
{"vol.dat", 0, "f9ae2e7f8f7cac91378cdafca43faf1e", 8437676},
AD_LISTEND
},
- Common::PL_POL, Common::kPlatformDOS, ADGF_NO_FLAGS, GUIO0()
+ Common::PL_POL, Common::kPlatformDOS, ADGF_NO_FLAGS, GUIO1(GAMEOPTION_COLOR_BLIND_DEFAULT_OFF)
},
kGameTypeSoltys
},
@@ -75,7 +82,7 @@ static const CgeGameDescription gameDescriptions[] = {
{"vol.dat", 0, "75d385a6074c58b69f7730481f256051", 1796710},
AD_LISTEND
},
- Common::EN_ANY, Common::kPlatformDOS, ADGF_DEMO , GUIO0()
+ Common::EN_ANY, Common::kPlatformDOS, ADGF_DEMO , GUIO1(GAMEOPTION_COLOR_BLIND_DEFAULT_OFF)
},
kGameTypeSoltys
},
@@ -87,7 +94,7 @@ static const CgeGameDescription gameDescriptions[] = {
{"vol.dat", 0, "c5d9b15863cab61dc125551576dece04", 1075272},
AD_LISTEND
},
- Common::PL_POL, Common::kPlatformDOS, ADGF_DEMO , GUIO0()
+ Common::PL_POL, Common::kPlatformDOS, ADGF_DEMO , GUIO1(GAMEOPTION_COLOR_BLIND_DEFAULT_OFF)
},
kGameTypeSoltys
},
@@ -99,7 +106,7 @@ static const CgeGameDescription gameDescriptions[] = {
{"vol.dat", 0, "4ffeff4abc99ac5999b55ccfc56ab1df", 8430868},
AD_LISTEND
},
- Common::EN_ANY, Common::kPlatformDOS, ADGF_NO_FLAGS , GUIO0()
+ Common::EN_ANY, Common::kPlatformDOS, ADGF_NO_FLAGS , GUIO1(GAMEOPTION_COLOR_BLIND_DEFAULT_OFF)
},
kGameTypeSoltys
},
@@ -111,7 +118,19 @@ static const CgeGameDescription gameDescriptions[] = {
{"vol.dat", 0, "0e43331c846094d77f5dd201827e0a3b", 8439339},
AD_LISTEND
},
- Common::PL_POL, Common::kPlatformDOS, ADGF_NO_FLAGS, GUIO0()
+ Common::PL_POL, Common::kPlatformDOS, ADGF_NO_FLAGS, GUIO1(GAMEOPTION_COLOR_BLIND_DEFAULT_OFF)
+ },
+ kGameTypeSoltys
+ },
+ {
+ {
+ "soltys", "Soltys Freeware v1.0",
+ {
+ {"vol.cat", 0, "fcae86b20eaa5cedec17b24fa5e85eb4", 50176},
+ {"vol.dat", 0, "ff10d54acc2c95696c57e05819b6906f", 8450151},
+ AD_LISTEND
+ },
+ Common::ES_ESP, Common::kPlatformDOS, ADGF_NO_FLAGS , GUIO1(GAMEOPTION_COLOR_BLIND_DEFAULT_OFF)
},
kGameTypeSoltys
},
@@ -124,7 +143,7 @@ static const CgeGameDescription gameDescriptions[] = {
{"vol.dat", 0, "de14291869a8eb7c2732ab783c7542ef", 34180844},
AD_LISTEND
},
- Common::PL_POL, Common::kPlatformDOS, ADGF_NO_FLAGS, GUIO0()
+ Common::PL_POL, Common::kPlatformDOS, ADGF_NO_FLAGS, GUIO1(GAMEOPTION_COLOR_BLIND_DEFAULT_OFF)
},
kGameTypeSfinx
},
@@ -136,12 +155,25 @@ static const ADFileBasedFallback fileBasedFallback[] = {
{ &gameDescriptions[0].desc, { "vol.cat", "vol.dat", 0 } },
{ 0, { 0 } }
};
-
} // End of namespace CGE
+static const ADExtraGuiOptionsMap optionsList[] = {
+ {
+ GAMEOPTION_COLOR_BLIND_DEFAULT_OFF,
+ {
+ _s("Color Blind Mode"),
+ _s("Enable Color Blind Mode by default"),
+ "enable_color_blind",
+ false
+ }
+ },
+
+ AD_EXTRA_GUI_OPTIONS_TERMINATOR
+};
+
class CGEMetaEngine : public AdvancedMetaEngine {
public:
- CGEMetaEngine() : AdvancedMetaEngine(CGE::gameDescriptions, sizeof(CGE::CgeGameDescription), CGEGames) {
+ CGEMetaEngine() : AdvancedMetaEngine(CGE::gameDescriptions, sizeof(CGE::CgeGameDescription), CGEGames, optionsList) {
_singleid = "soltys";
}
@@ -157,8 +189,6 @@ public:
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;
@@ -196,10 +226,9 @@ SaveStateList CGEMetaEngine::listSaves(const char *target) const {
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);
+ int slotNum = atoi(filename->c_str() + filename->size() - 3);
if (slotNum >= 0 && slotNum <= 99) {
@@ -279,7 +308,7 @@ bool CGEMetaEngine::createInstance(OSystem *syst, Engine **engine, const ADGameD
}
#if PLUGIN_ENABLED_DYNAMIC(CGE)
-REGISTER_PLUGIN_DYNAMIC(CGE, PLUGIN_TYPE_ENGINE, CGEMetaEngine);
+ REGISTER_PLUGIN_DYNAMIC(CGE, PLUGIN_TYPE_ENGINE, CGEMetaEngine);
#else
-REGISTER_PLUGIN_STATIC(CGE, PLUGIN_TYPE_ENGINE, CGEMetaEngine);
+ REGISTER_PLUGIN_STATIC(CGE, PLUGIN_TYPE_ENGINE, CGEMetaEngine);
#endif
diff --git a/engines/cge/events.cpp b/engines/cge/events.cpp
index 89802058f4..24b3a270cf 100644
--- a/engines/cge/events.cpp
+++ b/engines/cge/events.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/cge/events.h b/engines/cge/events.h
index ab8d87212d..63f02b7475 100644
--- a/engines/cge/events.h
+++ b/engines/cge/events.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/cge/fileio.cpp b/engines/cge/fileio.cpp
index 609d5e86aa..2b1f74db02 100644
--- a/engines/cge/fileio.cpp
+++ b/engines/cge/fileio.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -70,7 +70,7 @@ ResourceManager::ResourceManager() {
_catFile = new Common::File();
_catFile->open(kCatName);
- if ((!_datFile) || (!_catFile))
+ if (!_datFile->isOpen() || !_catFile->isOpen())
error("Unable to open data files");
for (int i = 0; i < kBtLevel; i++) {
@@ -93,20 +93,18 @@ ResourceManager::~ResourceManager() {
delete _buff[i]._page;
}
-uint16 ResourceManager::XCrypt(void *buf, uint16 length) {
- byte *b = static_cast<byte *>(buf);
+void ResourceManager::XCrypt(byte *buf, uint16 length) {
+ byte *b = 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) {
+uint16 ResourceManager::read(byte *buf, uint16 length) {
if (!_datFile->isOpen())
return 0;
@@ -118,7 +116,7 @@ uint16 ResourceManager::read(void *buf, uint16 length) {
}
BtPage *ResourceManager::getPage(int level, uint16 pageId) {
- debugC(1, kCGEDebugFile, "IoHand::getPage(%d, %d)", level, pageId);
+ debugC(1, kCGEDebugFile, "ResourceManager::getPage(%d, %d)", level, pageId);
if (_buff[level]._pageNo != pageId) {
int32 pos = pageId * kBtSize;
@@ -142,7 +140,7 @@ BtPage *ResourceManager::getPage(int level, uint16 pageId) {
}
BtKeypack *ResourceManager::find(const char *key) {
- debugC(1, kCGEDebugFile, "IoHand::find(%s)", key);
+ debugC(1, kCGEDebugFile, "ResourceManager::find(%s)", key);
int lev = 0;
uint16 nxt = kBtValRoot;
@@ -178,7 +176,7 @@ bool ResourceManager::exist(const char *name) {
return scumm_stricmp(find(name)->_key, name) == 0;
}
-uint16 ResourceManager::catRead(void *buf, uint16 length) {
+uint16 ResourceManager::catRead(byte *buf, uint16 length) {
if (!_catFile->isOpen())
return 0;
@@ -225,7 +223,7 @@ EncryptedStream::EncryptedStream(CGEEngine *vm, const char *name) : _vm(vm) {
_readStream = new Common::MemoryReadStream(dataBuffer, bufSize, DisposeAfterUse::YES);
}
-uint32 EncryptedStream::read(void *dataPtr, uint32 dataSize) {
+uint32 EncryptedStream::read(byte *dataPtr, uint32 dataSize) {
return _readStream->read(dataPtr, dataSize);
}
diff --git a/engines/cge/fileio.h b/engines/cge/fileio.h
index cee1fa79ef..059d2c9a44 100644
--- a/engines/cge/fileio.h
+++ b/engines/cge/fileio.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -83,16 +83,16 @@ class ResourceManager {
} _buff[kBtLevel];
BtPage *getPage(int level, uint16 pageId);
- uint16 catRead(void *buf, uint16 length);
+ uint16 catRead(byte *buf, uint16 length);
Common::File *_catFile;
Common::File *_datFile;
- uint16 XCrypt(void *buf, uint16 length);
+ void XCrypt(byte *buf, uint16 length);
public:
ResourceManager();
~ResourceManager();
- uint16 read(void *buf, uint16 length);
- bool seek(int32 offs, int whence = 0);
+ uint16 read(byte *buf, uint16 length);
+ bool seek(int32 offs, int whence = SEEK_SET);
BtKeypack *find(const char *key);
bool exist(const char *name);
@@ -111,7 +111,7 @@ public:
bool seek(int32 offset);
int32 pos();
int32 size();
- uint32 read(void *dataPtr, uint32 dataSize);
+ uint32 read(byte *dataPtr, uint32 dataSize);
Common::String readLine();
};
diff --git a/engines/cge/game.cpp b/engines/cge/game.cpp
index 851f6c59fb..49fe12f517 100644
--- a/engines/cge/game.cpp
+++ b/engines/cge/game.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/cge/game.h b/engines/cge/game.h
index 4d5acf7371..330eb20928 100644
--- a/engines/cge/game.h
+++ b/engines/cge/game.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/cge/general.h b/engines/cge/general.h
index 9e3fc7f249..ac7c6f4da5 100644
--- a/engines/cge/general.h
+++ b/engines/cge/general.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/cge/module.mk b/engines/cge/module.mk
index 5745aa5d48..1fa406f6c8 100644
--- a/engines/cge/module.mk
+++ b/engines/cge/module.mk
@@ -25,6 +25,6 @@ ifeq ($(ENABLE_CGE), DYNAMIC_PLUGIN)
PLUGIN := 1
endif
-# Include common rules
+# Include common rules
include $(srcdir)/rules.mk
diff --git a/engines/cge/snail.cpp b/engines/cge/snail.cpp
index b9030efb4d..1a6ca0789e 100644
--- a/engines/cge/snail.cpp
+++ b/engines/cge/snail.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -658,6 +658,9 @@ void CGEEngine::selectPocket(int n) {
void CGEEngine::pocFul() {
debugC(1, kCGEDebugEngine, "CGEEngine::pocFul()");
+ if (!_hero)
+ error("pocFul - Unexpected null _hero");
+
_hero->park();
_commandHandler->addCommand(kCmdWait, -1, -1, _hero);
_commandHandler->addCommand(kCmdSeq, -1, kSeqPocketFull, _hero);
diff --git a/engines/cge/snail.h b/engines/cge/snail.h
index 6a9e717441..2f56768fed 100644
--- a/engines/cge/snail.h
+++ b/engines/cge/snail.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/cge/sound.cpp b/engines/cge/sound.cpp
index b378898955..370b768bca 100644
--- a/engines/cge/sound.cpp
+++ b/engines/cge/sound.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -186,6 +186,10 @@ DataCk *Fx::load(int idx, int ref) {
DataCk *Fx::loadWave(EncryptedStream *file) {
byte *data = (byte *)malloc(file->size());
+
+ if (!data)
+ return 0;
+
file->read(data, file->size());
return new DataCk(data, file->size());
@@ -224,6 +228,7 @@ MusicPlayer::MusicPlayer(CGEEngine *vm) : _vm(vm) {
_driver->setTimerCallback(this, &timerCallback);
}
+ _dataSize = -1;
}
MusicPlayer::~MusicPlayer() {
diff --git a/engines/cge/sound.h b/engines/cge/sound.h
index a3f4d4d777..dc67f9408b 100644
--- a/engines/cge/sound.h
+++ b/engines/cge/sound.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/cge/talk.cpp b/engines/cge/talk.cpp
index f5d570b389..e377a72601 100644
--- a/engines/cge/talk.cpp
+++ b/engines/cge/talk.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/cge/talk.h b/engines/cge/talk.h
index 66e3d85214..2f89881b8d 100644
--- a/engines/cge/talk.h
+++ b/engines/cge/talk.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/cge/text.cpp b/engines/cge/text.cpp
index 27bb0608fd..7d8c89befa 100644
--- a/engines/cge/text.cpp
+++ b/engines/cge/text.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -69,7 +69,7 @@ int16 Text::count() {
for (line = tf.readLine(); !tf.eos(); line = tf.readLine()) {
char *s;
assert(line.size() <= 513);
- strcpy(tmpStr, line.c_str());
+ Common::strlcpy(tmpStr, line.c_str(), sizeof(tmpStr));
if ((s = strtok(tmpStr, " =,;/\t\n")) == NULL)
continue;
if (!Common::isDigit(*s))
@@ -101,8 +101,7 @@ void Text::load() {
for (idx = 0, line = tf.readLine(); !tf.eos(); line = tf.readLine()) {
int n = line.size();
char *s;
- assert(n <= 513);
- strcpy(tmpStr, line.c_str());
+ Common::strlcpy(tmpStr, line.c_str(), sizeof(tmpStr));
if ((s = strtok(tmpStr, " =,;/\t\n")) == NULL)
continue;
if (!Common::isDigit(*s))
diff --git a/engines/cge/text.h b/engines/cge/text.h
index 13ce6bbfbb..9bd990f486 100644
--- a/engines/cge/text.h
+++ b/engines/cge/text.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/cge/vga13h.cpp b/engines/cge/vga13h.cpp
index c0407cab42..d7dccd2c65 100644
--- a/engines/cge/vga13h.cpp
+++ b/engines/cge/vga13h.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -26,6 +26,7 @@
*/
#include "common/array.h"
+#include "common/config-manager.h"
#include "common/rect.h"
#include "graphics/palette.h"
#include "cge/general.h"
@@ -210,12 +211,11 @@ Sprite *Sprite::expand() {
error("Bad SPR [%s]", fname);
Common::String line;
char tmpStr[kLineMax + 1];
- int len = 0, lcnt = 0;
+ int lcnt = 0;
for (line = sprf.readLine(); !sprf.eos(); line = sprf.readLine()) {
- len = line.size();
- assert(len <= 513);
- strcpy(tmpStr, line.c_str());
+ int len = line.size();
+ Common::strlcpy(tmpStr, line.c_str(), sizeof(tmpStr));
lcnt++;
if (len == 0 || *tmpStr == '.')
continue;
@@ -638,6 +638,10 @@ Vga::Vga(CGEEngine *vm) : _frmCnt(0), _msg(NULL), _name(NULL), _setPal(false), _
_page[idx]->create(320, 200, Graphics::PixelFormat::createFormatCLUT8());
}
+ if (ConfMan.getBool("enable_color_blind"))
+ _mono = 1;
+
+
_oldColors = (Dac *)malloc(sizeof(Dac) * kPalCount);
_newColors = (Dac *)malloc(sizeof(Dac) * kPalCount);
getColors(_oldColors);
@@ -757,7 +761,7 @@ void Vga::setColors(Dac *tab, int lum) {
if (_mono) {
destP = _newColors;
for (int idx = 0; idx < kPalCount; idx++, destP++) {
- // Form a greyscalce colour from 30% R, 59% G, 11% B
+ // Form a greyscalce color 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;
@@ -815,14 +819,14 @@ void Vga::update() {
_setPal = false;
}
if (_vm->_showBoundariesFl) {
- Vga::_page[0]->hLine(0, 200 - kPanHeight, 320, 0xee);
+ Vga::_page[0]->hLine(0, kScrHeight - kPanHeight, kScrWidth, 0xee);
if (_vm->_barriers[_vm->_now]._horz != 255) {
for (int i = 0; i < 8; i++)
- Vga::_page[0]->vLine((_vm->_barriers[_vm->_now]._horz * 8) + i, 0, 200, 0xff);
+ Vga::_page[0]->vLine((_vm->_barriers[_vm->_now]._horz * 8) + i, 0, kScrHeight, 0xff);
}
if (_vm->_barriers[_vm->_now]._vert != 255) {
for (int i = 0; i < 4; i++)
- Vga::_page[0]->hLine(0, 80 + (_vm->_barriers[_vm->_now]._vert * 4) + i, 320, 0xff);
+ Vga::_page[0]->hLine(0, 80 + (_vm->_barriers[_vm->_now]._vert * 4) + i, kScrWidth, 0xff);
}
}
diff --git a/engines/cge/vga13h.h b/engines/cge/vga13h.h
index a816f7756f..9511559df0 100644
--- a/engines/cge/vga13h.h
+++ b/engines/cge/vga13h.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/cge/vmenu.cpp b/engines/cge/vmenu.cpp
index 910e54d267..89f0039e02 100644
--- a/engines/cge/vmenu.cpp
+++ b/engines/cge/vmenu.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/cge/vmenu.h b/engines/cge/vmenu.h
index 928b48f11c..1cab57080d 100644
--- a/engines/cge/vmenu.h
+++ b/engines/cge/vmenu.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/cge/walk.cpp b/engines/cge/walk.cpp
index 22c06a17c1..1ab7574c0c 100644
--- a/engines/cge/walk.cpp
+++ b/engines/cge/walk.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/cge/walk.h b/engines/cge/walk.h
index 00ec080416..982c96dbaa 100644
--- a/engines/cge/walk.h
+++ b/engines/cge/walk.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/cine/anim.cpp b/engines/cine/anim.cpp
index 075a59cfb6..c6099447d8 100644
--- a/engines/cine/anim.cpp
+++ b/engines/cine/anim.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -287,7 +287,7 @@ void AnimData::load(byte *d, int type, uint16 w, uint16 h, int16 file,
_fileIdx = file;
_frameIdx = frame;
memset(_name, 0, sizeof(_name));
- strcpy(_name, n);
+ Common::strlcpy(_name, n, sizeof(_name));
_realWidth = w;
switch (type) {
diff --git a/engines/cine/anim.h b/engines/cine/anim.h
index c5130aab82..7b4daafa88 100644
--- a/engines/cine/anim.h
+++ b/engines/cine/anim.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/cine/bg.cpp b/engines/cine/bg.cpp
index 2bad2183f5..ce808e0f6a 100644
--- a/engines/cine/bg.cpp
+++ b/engines/cine/bg.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -48,7 +48,7 @@ byte loadCtFW(const char *ctName) {
}
if (currentCtName != ctName)
- strcpy(currentCtName, ctName);
+ Common::strlcpy(currentCtName, ctName, sizeof(currentCtName));
ptr = dataPtr = readBundleFile(foundFileIdx);
@@ -75,7 +75,7 @@ byte loadCtOS(const char *ctName) {
}
if (currentCtName != ctName)
- strcpy(currentCtName, ctName);
+ Common::strlcpy(currentCtName, ctName, sizeof(currentCtName));
ptr = dataPtr = readBundleFile(foundFileIdx);
diff --git a/engines/cine/bg.h b/engines/cine/bg.h
index c464cd68be..ac884463cb 100644
--- a/engines/cine/bg.h
+++ b/engines/cine/bg.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/cine/bg_list.cpp b/engines/cine/bg_list.cpp
index 36ecf53dea..d2f05a3fbd 100644
--- a/engines/cine/bg_list.cpp
+++ b/engines/cine/bg_list.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/cine/bg_list.h b/engines/cine/bg_list.h
index c564b4b43f..3cfc33e274 100644
--- a/engines/cine/bg_list.h
+++ b/engines/cine/bg_list.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/cine/cine.cpp b/engines/cine/cine.cpp
index 63092a8ffd..a4af8f2201 100644
--- a/engines/cine/cine.cpp
+++ b/engines/cine/cine.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -55,6 +55,14 @@ CineEngine::CineEngine(OSystem *syst, const CINEGameDescription *gameDesc)
_console = new CineConsole(this);
g_cine = this;
+
+ for (int i = 0; i < NUM_FONT_CHARS; i++) {
+ _textHandler.fontParamTable[i].characterIdx = 0;
+ _textHandler.fontParamTable[i].characterWidth = 0;
+ }
+ _restartRequested = false;
+ _preLoad = false;
+ _timerDelayMultiplier = 12;
}
CineEngine::~CineEngine() {
diff --git a/engines/cine/cine.h b/engines/cine/cine.h
index 47edf51c30..e620d2ffa5 100644
--- a/engines/cine/cine.h
+++ b/engines/cine/cine.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/cine/configure.engine b/engines/cine/configure.engine
new file mode 100644
index 0000000000..2b7e2085fa
--- /dev/null
+++ b/engines/cine/configure.engine
@@ -0,0 +1,3 @@
+# This file is included from the main "configure" script
+# add_engine [name] [desc] [build-by-default] [subengines] [base games] [deps]
+add_engine cine "Cinematique evo 1" yes
diff --git a/engines/cine/console.cpp b/engines/cine/console.cpp
index 46f0ea61d3..4646bdf280 100644
--- a/engines/cine/console.cpp
+++ b/engines/cine/console.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -29,7 +29,7 @@ bool labyrinthCheat;
CineConsole::CineConsole(CineEngine *vm) : GUI::Debugger(), _vm(vm) {
assert(_vm);
- DCmd_Register("labyrinthCheat", WRAP_METHOD(CineConsole, Cmd_LabyrinthCheat));
+ registerCmd("labyrinthCheat", WRAP_METHOD(CineConsole, Cmd_LabyrinthCheat));
labyrinthCheat = false;
}
diff --git a/engines/cine/console.h b/engines/cine/console.h
index 7c19621e5f..9b901982b9 100644
--- a/engines/cine/console.h
+++ b/engines/cine/console.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/cine/detection.cpp b/engines/cine/detection.cpp
index a3d36cfd97..4202bdc942 100644
--- a/engines/cine/detection.cpp
+++ b/engines/cine/detection.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/cine/detection_tables.h b/engines/cine/detection_tables.h
index 224ebe5de2..6069e3a99b 100644
--- a/engines/cine/detection_tables.h
+++ b/engines/cine/detection_tables.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/cine/gfx.cpp b/engines/cine/gfx.cpp
index 636c0cf8d9..b9175cac72 100644
--- a/engines/cine/gfx.cpp
+++ b/engines/cine/gfx.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -246,17 +246,16 @@ void FWRenderer::incrustSprite(const BGIncrust &incrust) {
* Draw command box on screen
*/
void FWRenderer::drawCommand() {
- unsigned int i;
- int x = 10, y = _cmdY;
-
if (disableSystemMenu == 0) {
+ int x = 10, y = _cmdY;
+
drawPlainBox(x, y, 301, 11, 0);
drawBorder(x - 1, y - 1, 302, 12, 2);
x += 2;
y += 2;
- for (i = 0; i < _cmd.size(); i++) {
+ for (unsigned int i = 0; i < _cmd.size(); i++) {
x = drawChar(_cmd[i], x, y);
}
}
@@ -458,12 +457,12 @@ void FWRenderer::drawDoubleBorder(int x, int y, int width, int height, byte colo
* @param y Character coordinate
*/
int FWRenderer::drawChar(char character, int x, int y) {
- int width, idx;
+ int width;
if (character == ' ') {
x += 5;
} else if ((width = g_cine->_textHandler.fontParamTable[(unsigned char)character].characterWidth)) {
- idx = g_cine->_textHandler.fontParamTable[(unsigned char)character].characterIdx;
+ int idx = g_cine->_textHandler.fontParamTable[(unsigned char)character].characterIdx;
drawSpriteRaw(g_cine->_textHandler.textTable[idx][FONT_DATA], g_cine->_textHandler.textTable[idx][FONT_MASK], FONT_WIDTH, FONT_HEIGHT, _backBuffer, x, y);
x += width + 1;
}
@@ -481,12 +480,12 @@ int FWRenderer::drawChar(char character, int x, int y) {
* @param y Character coordinate
*/
int FWRenderer::undrawChar(char character, int x, int y) {
- int width, idx;
+ int width;
if (character == ' ') {
x += 5;
} else if ((width = g_cine->_textHandler.fontParamTable[(unsigned char)character].characterWidth)) {
- idx = g_cine->_textHandler.fontParamTable[(unsigned char)character].characterIdx;
+ int idx = g_cine->_textHandler.fontParamTable[(unsigned char)character].characterIdx;
const byte *sprite = g_cine->_textHandler.textTable[idx][FONT_DATA];
for (uint i = 0; i < FONT_HEIGHT; ++i) {
byte *dst = _backBuffer + (y + i) * 320 + x;
@@ -731,7 +730,7 @@ void FWRenderer::loadBg16(const byte *bg, const char *name, unsigned int idx) {
assert(_background);
- strcpy(_bgName, name);
+ Common::strlcpy(_bgName, name, sizeof(_bgName));
// Load the 16 color palette
_backupPal.load(bg, kLowPalNumBytes, kLowPalFormat, kLowPalNumColors, CINE_BIG_ENDIAN);
@@ -997,11 +996,10 @@ void SelectionMenu::drawMenu(FWRenderer &r, bool top) {
}
int lineY = y + 4;
- int charX;
const int elemCount = getElementCount();
for (int i = 0; i < elemCount; ++i, lineY += 9) {
- charX = x + 4;
+ int charX = x + 4;
if (i == _selection) {
int color;
@@ -1228,12 +1226,12 @@ void OSRenderer::incrustSprite(const BGIncrust &incrust) {
* @param y Character coordinate
*/
int OSRenderer::drawChar(char character, int x, int y) {
- int width, idx;
+ int width;
if (character == ' ') {
x += 5;
} else if ((width = g_cine->_textHandler.fontParamTable[(unsigned char)character].characterWidth)) {
- idx = g_cine->_textHandler.fontParamTable[(unsigned char)character].characterIdx;
+ int idx = g_cine->_textHandler.fontParamTable[(unsigned char)character].characterIdx;
drawSpriteRaw2(g_cine->_textHandler.textTable[idx][FONT_DATA], 0, FONT_WIDTH, FONT_HEIGHT, _backBuffer, x, y);
x += width + 1;
}
@@ -1405,7 +1403,7 @@ void OSRenderer::loadBg16(const byte *bg, const char *name, unsigned int idx) {
assert(_bgTable[idx].bg);
- strcpy(_bgTable[idx].name, name);
+ Common::strlcpy(_bgTable[idx].name, name, sizeof(_bgTable[idx].name));
// Load the 16 color palette
_bgTable[idx].pal.load(bg, kLowPalNumBytes, kLowPalFormat, kLowPalNumColors, CINE_BIG_ENDIAN);
@@ -1443,7 +1441,7 @@ void OSRenderer::loadBg256(const byte *bg, const char *name, unsigned int idx) {
assert(_bgTable[idx].bg);
- strcpy(_bgTable[idx].name, name);
+ Common::strlcpy(_bgTable[idx].name, name, sizeof(_bgTable[idx].name));
_bgTable[idx].pal.load(bg, kHighPalNumBytes, kHighPalFormat, kHighPalNumColors, CINE_LITTLE_ENDIAN);
memcpy(_bgTable[idx].bg, bg + kHighPalNumBytes, _screenSize);
}
@@ -1834,7 +1832,7 @@ void OSRenderer::drawSprite(overlay *overlayPtr, const byte *spritePtr, int16 wi
}
}
}
- it++;
+ ++it;
}
// now, draw with the mask we created
@@ -1887,7 +1885,6 @@ void maskBgOverlay(const byte *bgPtr, const byte *maskPtr, int16 width, int16 he
byte *page, int16 x, int16 y) {
int16 i, j, tmpWidth, tmpHeight;
Common::List<BGIncrust>::iterator it;
- byte *mask;
const byte *backup = maskPtr;
// background pass
@@ -1905,7 +1902,9 @@ void maskBgOverlay(const byte *bgPtr, const byte *maskPtr, int16 width, int16 he
destPtr++;
srcPtr++;
- maskPtr++;
+
+ if (maskPtr)
+ maskPtr++;
}
}
@@ -1915,7 +1914,7 @@ void maskBgOverlay(const byte *bgPtr, const byte *maskPtr, int16 width, int16 he
for (it = g_cine->_bgIncrustList.begin(); it != g_cine->_bgIncrustList.end(); ++it) {
tmpWidth = g_cine->_animDataTable[it->frame]._realWidth;
tmpHeight = g_cine->_animDataTable[it->frame]._height;
- mask = (byte *)malloc(tmpWidth * tmpHeight);
+ byte *mask = (byte *)malloc(tmpWidth * tmpHeight);
if (it->param == 0) {
generateMask(g_cine->_animDataTable[it->frame].data(), mask, tmpWidth * tmpHeight, it->part);
diff --git a/engines/cine/gfx.h b/engines/cine/gfx.h
index 8b8843fd72..bfb7dbde1d 100644
--- a/engines/cine/gfx.h
+++ b/engines/cine/gfx.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/cine/main_loop.cpp b/engines/cine/main_loop.cpp
index c822f1cabd..9ce683445f 100644
--- a/engines/cine/main_loop.cpp
+++ b/engines/cine/main_loop.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -254,7 +254,7 @@ void purgeSeqList() {
it = g_cine->_seqList.erase(it);
} else {
// Let the element be and jump to the next element
- it++;
+ ++it;
}
}
}
diff --git a/engines/cine/main_loop.h b/engines/cine/main_loop.h
index 4ab29149d8..98e8f8878a 100644
--- a/engines/cine/main_loop.h
+++ b/engines/cine/main_loop.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/cine/msg.cpp b/engines/cine/msg.cpp
index b84982b19e..5366da4a05 100644
--- a/engines/cine/msg.cpp
+++ b/engines/cine/msg.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/cine/msg.h b/engines/cine/msg.h
index 8d6291e2df..dce70c4295 100644
--- a/engines/cine/msg.h
+++ b/engines/cine/msg.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/cine/object.cpp b/engines/cine/object.cpp
index a75828abb1..f014843f9d 100644
--- a/engines/cine/object.cpp
+++ b/engines/cine/object.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/cine/object.h b/engines/cine/object.h
index 8331cf9f89..9c44162d28 100644
--- a/engines/cine/object.h
+++ b/engines/cine/object.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/cine/pal.cpp b/engines/cine/pal.cpp
index 10077ecdc9..18f260cab7 100644
--- a/engines/cine/pal.cpp
+++ b/engines/cine/pal.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -62,9 +62,9 @@ int16 findPaletteFromName(const char *fileName) {
uint16 position = 0;
uint16 i;
- strcpy(buffer, fileName);
+ Common::strlcpy(buffer, fileName, sizeof(buffer));
- while (position < strlen(fileName)) {
+ while (position < strlen(buffer)) {
if (buffer[position] > 'a' && buffer[position] < 'z') {
buffer[position] += 'A' - 'a';
}
@@ -332,9 +332,9 @@ byte *Palette::save(byte *buf, const uint size, const Graphics::PixelFormat form
// Save the palette to the output in the specified format
for (uint i = firstIndex; i < firstIndex + numColors; i++) {
- const uint r = (_colors[i].r * rNewMax) / rOrigMax;
- const uint g = (_colors[i].g * gNewMax) / gOrigMax;
- const uint b = (_colors[i].b * bNewMax) / bOrigMax;
+ const uint r = (_colors[i].r * rNewMax) / (rOrigMax == 0 ? 1 : rOrigMax);
+ const uint g = (_colors[i].g * gNewMax) / (gOrigMax == 0 ? 1 : gOrigMax);
+ const uint b = (_colors[i].b * bNewMax) / (bOrigMax == 0 ? 1 : bOrigMax);
buf[i * format.bytesPerPixel + rBytePos] |= r << (format.rShift % 8);
buf[i * format.bytesPerPixel + gBytePos] |= g << (format.gShift % 8);
diff --git a/engines/cine/pal.h b/engines/cine/pal.h
index d41154aa0b..6dc56d8c19 100644
--- a/engines/cine/pal.h
+++ b/engines/cine/pal.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/cine/part.cpp b/engines/cine/part.cpp
index 7c0ba3af0a..30d9461a6a 100644
--- a/engines/cine/part.cpp
+++ b/engines/cine/part.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -47,7 +47,7 @@ void loadPart(const char *partName) {
g_cine->_partFileHandle.readUint16BE(); // entry size
if (currentPartName != partName)
- strcpy(currentPartName, partName);
+ Common::strlcpy(currentPartName, partName, sizeof(currentPartName));
for (uint16 i = 0; i < g_cine->_partBuffer.size(); i++) {
g_cine->_partFileHandle.read(g_cine->_partBuffer[i].partName, 14);
diff --git a/engines/cine/part.h b/engines/cine/part.h
index 3d321f17e1..9886a4ab43 100644
--- a/engines/cine/part.h
+++ b/engines/cine/part.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/cine/prc.cpp b/engines/cine/prc.cpp
index ba9ba70110..6c78274a09 100644
--- a/engines/cine/prc.cpp
+++ b/engines/cine/prc.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/cine/prc.h b/engines/cine/prc.h
index ff0147d81e..262b129e1c 100644
--- a/engines/cine/prc.h
+++ b/engines/cine/prc.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/cine/rel.cpp b/engines/cine/rel.cpp
index 0af9a2bc1f..09b8499618 100644
--- a/engines/cine/rel.cpp
+++ b/engines/cine/rel.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/cine/rel.h b/engines/cine/rel.h
index d102791f6b..f32f6301c4 100644
--- a/engines/cine/rel.h
+++ b/engines/cine/rel.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/cine/saveload.cpp b/engines/cine/saveload.cpp
index 51d2c1f6be..c707c60695 100644
--- a/engines/cine/saveload.cpp
+++ b/engines/cine/saveload.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/cine/saveload.h b/engines/cine/saveload.h
index fd661904af..91c9452d60 100644
--- a/engines/cine/saveload.h
+++ b/engines/cine/saveload.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/cine/script.h b/engines/cine/script.h
index a07c8d6cfc..ec8278065f 100644
--- a/engines/cine/script.h
+++ b/engines/cine/script.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/cine/script_fw.cpp b/engines/cine/script_fw.cpp
index 2abe32f797..c0b0c1f5da 100644
--- a/engines/cine/script_fw.cpp
+++ b/engines/cine/script_fw.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -1419,19 +1419,19 @@ int FWScript::o1_loadNewPrcName() {
switch (param1) {
case 0:
debugC(5, kCineDebugScript, "Line: %d: loadPrc(\"%s\")", _line, param2);
- strcpy(newPrcName, param2);
+ Common::strlcpy(newPrcName, param2, sizeof(newPrcName));
break;
case 1:
debugC(5, kCineDebugScript, "Line: %d: loadRel(\"%s\")", _line, param2);
- strcpy(newRelName, param2);
+ Common::strlcpy(newRelName, param2, sizeof(newRelName));
break;
case 2:
debugC(5, kCineDebugScript, "Line: %d: loadObject(\"%s\")", _line, param2);
- strcpy(newObjectName, param2);
+ Common::strlcpy(newObjectName, param2, sizeof(newObjectName));
break;
case 3:
debugC(5, kCineDebugScript, "Line: %d: loadMsg(\"%s\")", _line, param2);
- strcpy(newMsgName, param2);
+ Common::strlcpy(newMsgName, param2, sizeof(newMsgName));
break;
}
return 0;
diff --git a/engines/cine/script_os.cpp b/engines/cine/script_os.cpp
index 84bb484369..07ed295eab 100644
--- a/engines/cine/script_os.cpp
+++ b/engines/cine/script_os.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/cine/sound.cpp b/engines/cine/sound.cpp
index 0df926675e..069a4787ac 100644
--- a/engines/cine/sound.cpp
+++ b/engines/cine/sound.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -309,9 +309,7 @@ void AdLibSoundDriver::setupChannel(int channel, const byte *data, int instrumen
volume = 0;
}
volume += volume / 4;
- if (volume > 127) {
- volume = 127;
- }
+
_channelsVolumeTable[channel] = volume;
setupInstrument(data, channel);
}
@@ -815,7 +813,7 @@ bool PCSoundFxPlayer::load(const char *song) {
if (dot) {
*dot = '\0';
}
- strcat(instrument, _driver->getInstrumentExtension());
+ Common::strlcat(instrument, _driver->getInstrumentExtension(), sizeof(instrument));
uint32 instrumentSize;
_instrumentsData[i] = readBundleSoundFile(instrument, &instrumentSize);
if (!_instrumentsData[i]) {
diff --git a/engines/cine/sound.h b/engines/cine/sound.h
index fdb183ad34..efb3811f9a 100644
--- a/engines/cine/sound.h
+++ b/engines/cine/sound.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/cine/texte.cpp b/engines/cine/texte.cpp
index 998075c6ce..8d904cb1f2 100644
--- a/engines/cine/texte.cpp
+++ b/engines/cine/texte.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/cine/texte.h b/engines/cine/texte.h
index 185dc53bfd..1e0944c312 100644
--- a/engines/cine/texte.h
+++ b/engines/cine/texte.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/cine/unpack.cpp b/engines/cine/unpack.cpp
index f68fbbc02c..6741b07118 100644
--- a/engines/cine/unpack.cpp
+++ b/engines/cine/unpack.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/cine/unpack.h b/engines/cine/unpack.h
index d22c4944a7..0fa58874df 100644
--- a/engines/cine/unpack.h
+++ b/engines/cine/unpack.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/cine/various.cpp b/engines/cine/various.cpp
index 99d93cfc09..8687699a44 100644
--- a/engines/cine/various.cpp
+++ b/engines/cine/various.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -557,12 +557,20 @@ int16 selectSubObject(int16 x, int16 y, int16 param) {
}
}
+ if (selectedObject >= 20)
+ error("Invalid value for selectedObject: %d", selectedObject);
return objListTab[selectedObject];
}
-// TODO: Make separate functions for Future Wars's and Operation Stealth's version of this function, this is getting too messy
-// TODO: Add support for using the different prepositions for different verbs (Doesn't work currently)
void makeCommandLine() {
+ if (g_cine->getGameType() == Cine::GType_FW)
+ makeFWCommandLine();
+ else
+ makeOSCommandLine();
+}
+
+// TODO: Add support for using the different prepositions for different verbs (Doesn't work currently)
+void makeOSCommandLine() {
uint16 x, y;
commandVar1 = 0;
@@ -578,28 +586,16 @@ void makeCommandLine() {
int16 si;
getMouseData(mouseUpdateStatus, &dummyU16, &x, &y);
-
- if (g_cine->getGameType() == Cine::GType_FW) {
- si = selectSubObject(x, y + 8, -2);
- } else {
- si = selectSubObject(x, y + 8, -subObjectUseTable[playerCommand]);
- }
+ si = selectSubObject(x, y + 8, -subObjectUseTable[playerCommand]);
if (si < 0) {
- if (g_cine->getGameType() == Cine::GType_OS) {
- canUseOnObject = 0;
- } else { // Future Wars
- playerCommand = -1;
- g_cine->_commandBuffer = "";
- }
+ canUseOnObject = 0;
} else {
- if (g_cine->getGameType() == Cine::GType_OS) {
- if (si >= 8000) {
- si -= 8000;
- canUseOnObject = canUseOnItemTable[playerCommand];
- } else {
- canUseOnObject = 0;
- }
+ if (si >= 8000) {
+ si -= 8000;
+ canUseOnObject = canUseOnItemTable[playerCommand];
+ } else {
+ canUseOnObject = 0;
}
commandVar3[0] = si;
@@ -607,27 +603,21 @@ void makeCommandLine() {
g_cine->_commandBuffer += " ";
g_cine->_commandBuffer += g_cine->_objectTable[commandVar3[0]].name;
g_cine->_commandBuffer += " ";
- if (g_cine->getGameType() == Cine::GType_OS) {
- g_cine->_commandBuffer += commandPrepositionTable[playerCommand];
- } else { // Future Wars
- g_cine->_commandBuffer += defaultCommandPreposition;
- }
+ g_cine->_commandBuffer += commandPrepositionTable[playerCommand];
}
}
- if (g_cine->getGameType() == Cine::GType_OS || !(playerCommand != -1 && choiceResultTable[playerCommand] == 2)) {
- if (playerCommand == 2) {
- getMouseData(mouseUpdateStatus, &dummyU16, &x, &y);
- CursorMan.showMouse(false);
- processInventory(x, y + 8);
- playerCommand = -1;
- commandVar1 = 0;
- g_cine->_commandBuffer = "";
- CursorMan.showMouse(true);
- }
+ if (playerCommand == 2) {
+ getMouseData(mouseUpdateStatus, &dummyU16, &x, &y);
+ CursorMan.showMouse(false);
+ processInventory(x, y + 8);
+ playerCommand = -1;
+ commandVar1 = 0;
+ g_cine->_commandBuffer = "";
+ CursorMan.showMouse(true);
}
- if (g_cine->getGameType() == Cine::GType_OS && playerCommand != 2) {
+ if (playerCommand != 2) {
if (playerCommand != -1 && canUseOnObject != 0) { // call use on sub object
int16 si;
@@ -665,7 +655,55 @@ void makeCommandLine() {
}
}
- if (g_cine->getGameType() == Cine::GType_OS || !disableSystemMenu) {
+ isDrawCommandEnabled = 1;
+ renderer->setCommand(g_cine->_commandBuffer);
+}
+
+// TODO: Add support for using the different prepositions for different verbs (Doesn't work currently)
+void makeFWCommandLine() {
+ uint16 x, y;
+
+ commandVar1 = 0;
+ commandVar2 = -10;
+
+ if (playerCommand != -1) {
+ g_cine->_commandBuffer = defaultActionCommand[playerCommand];
+ } else {
+ g_cine->_commandBuffer = "";
+ }
+
+ if ((playerCommand != -1) && (choiceResultTable[playerCommand] == 2)) { // need object selection?
+ int16 si;
+
+ getMouseData(mouseUpdateStatus, &dummyU16, &x, &y);
+ si = selectSubObject(x, y + 8, -2);
+
+ if (si < 0) {
+ playerCommand = -1;
+ g_cine->_commandBuffer = "";
+ } else {
+ commandVar3[0] = si;
+ commandVar1 = 1;
+ g_cine->_commandBuffer += " ";
+ g_cine->_commandBuffer += g_cine->_objectTable[commandVar3[0]].name;
+ g_cine->_commandBuffer += " ";
+ g_cine->_commandBuffer += defaultCommandPreposition;
+ }
+ }
+
+ if (!(playerCommand != -1 && choiceResultTable[playerCommand] == 2)) {
+ if (playerCommand == 2) {
+ getMouseData(mouseUpdateStatus, &dummyU16, &x, &y);
+ CursorMan.showMouse(false);
+ processInventory(x, y + 8);
+ playerCommand = -1;
+ commandVar1 = 0;
+ g_cine->_commandBuffer = "";
+ CursorMan.showMouse(true);
+ }
+ }
+
+ if (!disableSystemMenu) {
isDrawCommandEnabled = 1;
renderer->setCommand(g_cine->_commandBuffer);
}
diff --git a/engines/cine/various.h b/engines/cine/various.h
index 813619816d..eb6312997d 100644
--- a/engines/cine/various.h
+++ b/engines/cine/various.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -37,6 +37,8 @@ void initLanguage(Common::Language lang);
int16 makeMenuChoice(const CommandeType commandList[], uint16 height, uint16 X, uint16 Y, uint16 width, bool recheckValue = false);
void makeCommandLine();
+void makeFWCommandLine();
+void makeOSCommandLine();
void makeActionMenu();
void waitPlayerInput();
void setTextWindow(uint16 param1, uint16 param2, uint16 param3, uint16 param4);
diff --git a/engines/composer/composer.cpp b/engines/composer/composer.cpp
index 2d7075cba1..471a29030b 100644
--- a/engines/composer/composer.cpp
+++ b/engines/composer/composer.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -42,6 +42,7 @@
#include "composer/composer.h"
#include "composer/graphics.h"
#include "composer/resource.h"
+#include "composer/console.h"
namespace Composer {
@@ -57,6 +58,7 @@ ComposerEngine::ComposerEngine(OSystem *syst, const ComposerGameDescription *gam
_mouseEnabled = false;
_mouseSpriteId = 0;
_lastButton = NULL;
+ _console = NULL;
}
ComposerEngine::~ComposerEngine() {
@@ -73,6 +75,7 @@ ComposerEngine::~ComposerEngine() {
i->_surface.free();
delete _rnd;
+ delete _console;
}
Common::Error ComposerEngine::run() {
@@ -113,6 +116,8 @@ Common::Error ComposerEngine::run() {
CursorMan.replaceCursorPalette(cursor->getPalette(), cursor->getPaletteStartIndex(), cursor->getPaletteCount());
delete cursor;
+ _console = new Console(this);
+
loadLibrary(0);
uint fps = atoi(getStringFromConfig("Common", "FPS").c_str());
@@ -190,11 +195,11 @@ Common::Error ComposerEngine::run() {
case Common::EVENT_KEYDOWN:
switch (event.kbd.keycode) {
case Common::KEYCODE_d:
- /*if (event.kbd.hasFlags(Common::KBD_CTRL)) {
+ if (event.kbd.hasFlags(Common::KBD_CTRL)) {
// Start the debugger
getDebugger()->attach();
getDebugger()->onFrame();
- }*/
+ }
break;
case Common::KEYCODE_q:
diff --git a/engines/composer/composer.h b/engines/composer/composer.h
index 7d8022455a..47398fe36d 100644
--- a/engines/composer/composer.h
+++ b/engines/composer/composer.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -34,11 +34,14 @@
#include "engines/engine.h"
#include "engines/util.h"
+#include "gui/debugger.h"
+
#include "graphics/surface.h"
#include "audio/mixer.h"
#include "composer/resource.h"
+#include "composer/console.h"
namespace Audio {
class QueuingAudioStream;
@@ -159,6 +162,9 @@ public:
const ComposerGameDescription *_gameDescription;
+ Console *_console;
+ GUI::Debugger *getDebugger() { return _console; }
+
private:
Common::RandomSource *_rnd;
diff --git a/engines/composer/configure.engine b/engines/composer/configure.engine
new file mode 100644
index 0000000000..71a79acb5d
--- /dev/null
+++ b/engines/composer/configure.engine
@@ -0,0 +1,3 @@
+# This file is included from the main "configure" script
+# add_engine [name] [desc] [build-by-default] [subengines] [base games] [deps]
+add_engine composer "Magic Composer" yes
diff --git a/engines/composer/console.cpp b/engines/composer/console.cpp
new file mode 100644
index 0000000000..d4676b0de5
--- /dev/null
+++ b/engines/composer/console.cpp
@@ -0,0 +1,31 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public 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/composer.h"
+
+namespace Composer {
+
+Console::Console(ComposerEngine *vm) : GUI::Debugger() {
+ _vm = vm;
+}
+
+} // End of namespace Composer
diff --git a/devtools/create_kyradat/tables.h b/engines/composer/console.h
index 833c70a4fe..fc2583611f 100644
--- a/devtools/create_kyradat/tables.h
+++ b/engines/composer/console.h
@@ -8,34 +8,33 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*
*/
-#ifndef CREATE_KYRADAT_TABLES_H
-#define CREATE_KYRADAT_TABLES_H
+#ifndef COMPOSER_CONSOLE_H
+#define COMPOSER_CONSOLE_H
-#include "search.h"
-#include "util.h"
+namespace Composer {
-#include <list>
+class ComposerEngine;
-struct ExtractEntrySearchData {
- int lang;
- int platform;
+class Console : public GUI::Debugger {
+public:
+ Console(ComposerEngine *vm);
- SearchData hint;
+private:
+ ComposerEngine *_vm;
};
-typedef std::list<ExtractEntrySearchData> ExtractEntryList;
-ExtractEntryList getProvidersForId(int id);
+} // End of namespace Composer
-#endif
+#endif /* COMPOSER_CONSOLE_H */
diff --git a/engines/composer/detection.cpp b/engines/composer/detection.cpp
index 8411441c60..036c1e88d8 100644
--- a/engines/composer/detection.cpp
+++ b/engines/composer/detection.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -420,7 +420,7 @@ bool Composer::ComposerEngine::hasFeature(EngineFeature f) const {
}
#if PLUGIN_ENABLED_DYNAMIC(COMPOSER)
-REGISTER_PLUGIN_DYNAMIC(COMPOSER, PLUGIN_TYPE_ENGINE, ComposerMetaEngine);
+ REGISTER_PLUGIN_DYNAMIC(COMPOSER, PLUGIN_TYPE_ENGINE, ComposerMetaEngine);
#else
-REGISTER_PLUGIN_STATIC(COMPOSER, PLUGIN_TYPE_ENGINE, ComposerMetaEngine);
+ REGISTER_PLUGIN_STATIC(COMPOSER, PLUGIN_TYPE_ENGINE, ComposerMetaEngine);
#endif
diff --git a/engines/composer/graphics.cpp b/engines/composer/graphics.cpp
index caf3ba3a40..87694636d8 100644
--- a/engines/composer/graphics.cpp
+++ b/engines/composer/graphics.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/composer/graphics.h b/engines/composer/graphics.h
index e9d82920ba..a8f37ddf60 100644
--- a/engines/composer/graphics.h
+++ b/engines/composer/graphics.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/composer/module.mk b/engines/composer/module.mk
index 8bfaf932e8..c879d53630 100644
--- a/engines/composer/module.mk
+++ b/engines/composer/module.mk
@@ -1,6 +1,7 @@
MODULE := engines/composer
MODULE_OBJS = \
+ console.o \
composer.o \
detection.o \
graphics.o \
diff --git a/engines/composer/resource.cpp b/engines/composer/resource.cpp
index fa29cc886b..d867f734a9 100644
--- a/engines/composer/resource.cpp
+++ b/engines/composer/resource.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/composer/resource.h b/engines/composer/resource.h
index e0052cd868..b624da1776 100644
--- a/engines/composer/resource.h
+++ b/engines/composer/resource.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/composer/scripting.cpp b/engines/composer/scripting.cpp
index 3a201c841a..94ca2c1bc8 100644
--- a/engines/composer/scripting.cpp
+++ b/engines/composer/scripting.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/configure.engines b/engines/configure.engines
deleted file mode 100644
index ec7d4667ca..0000000000
--- a/engines/configure.engines
+++ /dev/null
@@ -1,57 +0,0 @@
-# This file is included from the main "configure" script
-# add_engine [name] [desc] [build-by-default] [subengines] [base games] [deps]
-add_engine scumm "SCUMM" yes "scumm_7_8 he" "v0-v6 games"
-add_engine scumm_7_8 "v7 & v8 games" yes
-add_engine he "HE71+ games" yes
-add_engine agi "AGI" yes
-add_engine agos "AGOS" yes "agos2" "AGOS 1 games"
-add_engine agos2 "AGOS 2 games" yes
-add_engine avalanche "Lord Avalot d'Argent" no
-add_engine cge "CGE" yes
-add_engine cine "Cinematique evo 1" yes
-add_engine composer "Magic Composer" yes
-add_engine cruise "Cinematique evo 2" yes
-add_engine draci "Dragon History" yes
-add_engine drascula "Drascula: The Vampire Strikes Back" yes
-add_engine dreamweb "Dreamweb" yes
-add_engine fullpipe "Full Pipe" no
-add_engine gob "Gobli*ns" yes
-add_engine groovie "Groovie" yes "groovie2" "7th Guest"
-add_engine groovie2 "Groovie 2 games" no "" "" "jpeg"
-add_engine hopkins "Hopkins FBI" yes "" "" "16bit"
-add_engine hugo "Hugo Trilogy" yes
-add_engine kyra "Kyra" yes "lol eob" "Legend of Kyrandia 1-3"
-add_engine lol "Lands of Lore" yes
-add_engine eob "Eye of the Beholder" yes
-add_engine lastexpress "The Last Express" no "" "" "16bit"
-add_engine lure "Lure of the Temptress" yes
-add_engine made "MADE" yes
-add_engine mohawk "Mohawk" yes "cstime myst riven" "Living Books"
-add_engine mortevielle "Mortevielle" no
-add_engine cstime "Where in Time is Carmen Sandiego?" no
-add_engine riven "Riven: The Sequel to Myst" no "" "" "16bit"
-add_engine myst "Myst" no "" "" "16bit"
-add_engine neverhood "Neverhood" no
-add_engine parallaction "Parallaction" yes
-add_engine pegasus "The Journeyman Project: Pegasus Prime" yes "" "" "16bit"
-add_engine queen "Flight of the Amazon Queen" yes
-add_engine saga "SAGA" yes "ihnm saga2" "ITE"
-add_engine ihnm "IHNM" yes
-add_engine saga2 "SAGA 2 games" no
-add_engine sci "SCI" yes "sci32" "SCI 0-1.1 games"
-add_engine sci32 "SCI32 games" no
-add_engine sky "Beneath a Steel Sky" yes
-add_engine sword1 "Broken Sword" yes
-add_engine sword2 "Broken Sword II" yes
-add_engine sword25 "Broken Sword 2.5" no "" "" "png zlib 16bit"
-add_engine teenagent "Teen Agent" yes
-add_engine testbed "TestBed: the Testing framework" no
-add_engine tinsel "Tinsel" yes
-add_engine toltecs "3 Skulls of the Toltecs" yes
-add_engine toon "Toonstruck" yes
-add_engine touche "Touche: The Adventures of the Fifth Musketeer" yes
-add_engine tony "Tony Tough and the Night of Roasted Moths" yes "" "" "16bit"
-add_engine tsage "TsAGE" yes
-add_engine tucker "Bud Tucker in Double Trouble" yes
-add_engine wintermute "Wintermute" no "" "" "jpeg png zlib vorbis 16bit"
-add_engine zvision "ZVision" no "" "" "freetype2 16bit"
diff --git a/engines/cruise/actor.cpp b/engines/cruise/actor.cpp
index 94f620ed7b..331b1c1edd 100644
--- a/engines/cruise/actor.cpp
+++ b/engines/cruise/actor.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -289,16 +289,15 @@ void poly2(int x1, int y1, int x2, int y2) {
}
int point_proche(int16 table[][2]) {
- int x1, y1, i, x, y, p;
int d1 = 1000;
_vm->_polyStructs = &_vm->_polyStructNorm;
if (nclick_noeud == 1) {
- x = x_mouse;
- y = y_mouse;
- x1 = table_ptselect[0][0];
- y1 = table_ptselect[0][1];
+ int x = x_mouse;
+ int y = y_mouse;
+ int x1 = table_ptselect[0][0];
+ int y1 = table_ptselect[0][1];
_vm->_polyStructs = &_vm->_polyStructExp;
@@ -326,10 +325,10 @@ int point_proche(int16 table[][2]) {
}
_vm->_polyStructs = &_vm->_polyStructNorm;
- p = -1;
- for (i = 0; i < ctp_routeCoordCount; i++) {
- x = table[i][0];
- y = table[i][1];
+ int p = -1;
+ for (int i = 0; i < ctp_routeCoordCount; i++) {
+ int x = table[i][0];
+ int y = table[i][1];
int pointDistance = computeDistance(x_mouse, y_mouse, x, y);
if (pointDistance < d1) {
@@ -363,9 +362,7 @@ int8 Fsol[NBNOEUD + 1];
int D;
void explore(int depart, int arrivee) {
- int id1, id2, i;
-
- id1 = depart;
+ int id1 = depart;
fl[id1]++;
sol[idsol++] = (char)id1;
@@ -377,8 +374,9 @@ void explore(int depart, int arrivee) {
return;
}
+ int i;
while ((i = fl[id1]) < 20) {
- id2 = ctp_routes[id1][i + 1];
+ int id2 = ctp_routes[id1][i + 1];
if (id2 == arrivee) {
if (idsol < solmax) {
@@ -426,16 +424,13 @@ void explore(int depart, int arrivee) {
}
void chemin0(int depart, int arrivee) {
- int i;
- //int y=30;
-
prem = 0;
prem2 = 0;
dist_chemin = 0;
idsol = 0;
solmax = 999;
- for (i = 0; i < 20 + 1; i++)
+ for (int i = 0; i < 20 + 1; i++)
fl[i] = -1;
X = 0, Y = 30;
@@ -444,9 +439,6 @@ void chemin0(int depart, int arrivee) {
}
void valide_noeud(int16 table[], int16 p, int *nclick, int16 solution0[20 + 3][2]) {
- int a, b, d, i, p1, x1, x2, y1, y2;
- //int y=30;
-
table[*nclick] = p;
table[(*nclick) + 1] = -1;
table_ptselect[*nclick][0] = x_mouse;
@@ -455,10 +447,10 @@ void valide_noeud(int16 table[], int16 p, int *nclick, int16 solution0[20 + 3][2
_vm->_polyStructs = &_vm->_polyStructNorm;
if (*nclick == 2) { // second point
- x1 = table_ptselect[0][0];
- y1 = table_ptselect[0][1];
- x2 = table_ptselect[1][0];
- y2 = table_ptselect[1][1];
+ int x1 = table_ptselect[0][0];
+ int y1 = table_ptselect[0][1];
+ int x2 = table_ptselect[1][0];
+ int y2 = table_ptselect[1][1];
if ((x1 == x2) && (y1 == y2)) {
return;
}
@@ -507,13 +499,11 @@ void valide_noeud(int16 table[], int16 p, int *nclick, int16 solution0[20 + 3][2
} else {
solution0[0][0] = x1;
solution0[0][1] = y1;
- i = 0;
+ int i = 0;
while (solution[i] != -1) {
- p1 = solution[i];
- solution0[i + 1][0] =
- ctp_routeCoords[p1][0];
- solution0[++i][1] =
- ctp_routeCoords[p1][1];
+ int p1 = solution[i];
+ solution0[i + 1][0] = ctp_routeCoords[p1][0];
+ solution0[++i][1] = ctp_routeCoords[p1][1];
}
_vm->_polyStructs = &_vm->_polyStructExp;
poly2(x2, y2,
@@ -530,8 +520,8 @@ void valide_noeud(int16 table[], int16 p, int *nclick, int16 solution0[20 + 3][2
/****** Trim down any un-necessary walk points ******/
i++;
- d = 0;
- a = i;
+ int d = 0;
+ int a = i;
flag_obstacle = 1;
while (d != a) {
x1 = solution0[d][0];
@@ -547,7 +537,7 @@ void valide_noeud(int16 table[], int16 p, int *nclick, int16 solution0[20 + 3][2
flag_obstacle = 1;
if (d != i) {
i++;
- for (b = d + 1; b < i; b++) {
+ for (int b = d + 1; b < i; b++) {
solution0[b][0] = -2;
}
} else
@@ -582,10 +572,9 @@ int16 computePathfinding(MovementEntry &moveInfo, int16 x, int16 y, int16 destX,
}
if (!flagCt) {
- int i;
int16 *ptr;
-
- for (i = 0; i < NUM_PERSONS; i++) { // 10 = num perso
+ int i = 0;
+ for (; i < NUM_PERSONS; i++) { // 10 = num perso
if (!persoTable[i]) {
break;
}
diff --git a/engines/cruise/actor.h b/engines/cruise/actor.h
index b409bf7b7f..5d8cce1f99 100644
--- a/engines/cruise/actor.h
+++ b/engines/cruise/actor.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/cruise/background.cpp b/engines/cruise/background.cpp
index 9da5413013..4cf52f62e1 100644
--- a/engines/cruise/background.cpp
+++ b/engines/cruise/background.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -65,12 +65,10 @@ int loadCVT(uint8 **ptr) {
char *localPtr = (char *) * ptr;
if (!strcmp(localPtr, "CVT")) {
- int i;
localPtr += 4;
- for (i = 0; i < 0x20; i++) {
+ for (int i = 0; i < 0x20; i++)
cvtPalette[i] = *(localPtr++);
- }
*ptr = (uint8 *) localPtr;
@@ -180,7 +178,7 @@ int loadBackground(const char *name, int idx) {
break;
default:
- ASSERT(0);
+ assert(0);
}
gfxModuleData_setPal256(palScreen[idx]);
diff --git a/engines/cruise/background.h b/engines/cruise/background.h
index 7a8f2d5494..ea9e7bba87 100644
--- a/engines/cruise/background.h
+++ b/engines/cruise/background.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/cruise/backgroundIncrust.cpp b/engines/cruise/backgroundIncrust.cpp
index ddda8dee45..77e15ccf4c 100644
--- a/engines/cruise/backgroundIncrust.cpp
+++ b/engines/cruise/backgroundIncrust.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -59,6 +59,8 @@ void backupBackground(backgroundIncrustStruct *pIncrust, int X, int Y, int width
}
void restoreBackground(backgroundIncrustStruct *pIncrust) {
+ if (!pIncrust)
+ return;
if (pIncrust->type != 1)
return;
if (pIncrust->ptr == NULL)
@@ -87,39 +89,32 @@ void restoreBackground(backgroundIncrustStruct *pIncrust) {
}
backgroundIncrustStruct *addBackgroundIncrust(int16 overlayIdx, int16 objectIdx, backgroundIncrustStruct *pHead, int16 scriptNumber, int16 scriptOverlay, int16 backgroundIdx, int16 saveBuffer) {
- uint8 *backgroundPtr;
- uint8 *ptr;
objectParamsQuery params;
- backgroundIncrustStruct *newElement;
- backgroundIncrustStruct *currentHead;
- backgroundIncrustStruct *currentHead2;
-
getMultipleObjectParam(overlayIdx, objectIdx, &params);
- ptr = filesDatabase[params.fileIdx].subData.ptr;
+ uint8 *ptr = filesDatabase[params.fileIdx].subData.ptr;
// Don't process any further if not a sprite or polygon
- if (!ptr) return NULL;
- if ((filesDatabase[params.fileIdx].subData.resourceType != OBJ_TYPE_SPRITE) &&
- (filesDatabase[params.fileIdx].subData.resourceType != OBJ_TYPE_POLY)) {
+ if (!ptr)
return NULL;
- }
-
- backgroundPtr = backgroundScreens[backgroundIdx];
- backgroundChanged[backgroundIdx] = true;
+ if ((filesDatabase[params.fileIdx].subData.resourceType != OBJ_TYPE_SPRITE) &&
+ (filesDatabase[params.fileIdx].subData.resourceType != OBJ_TYPE_POLY))
+ return NULL;
+ uint8 *backgroundPtr = backgroundScreens[backgroundIdx];
assert(backgroundPtr != NULL);
- currentHead = pHead;
- currentHead2 = currentHead->next;
+ backgroundChanged[backgroundIdx] = true;
+ backgroundIncrustStruct *currentHead = pHead;
+ backgroundIncrustStruct *currentHead2 = currentHead->next;
while (currentHead2) {
currentHead = currentHead2;
currentHead2 = currentHead->next;
}
- newElement = (backgroundIncrustStruct *)mallocAndZero(sizeof(backgroundIncrustStruct));
+ backgroundIncrustStruct *newElement = (backgroundIncrustStruct *)mallocAndZero(sizeof(backgroundIncrustStruct));
if (!newElement)
return NULL;
@@ -127,13 +122,11 @@ backgroundIncrustStruct *addBackgroundIncrust(int16 overlayIdx, int16 objectIdx,
newElement->next = currentHead->next;
currentHead->next = newElement;
- if (!currentHead2) {
+ if (!currentHead2)
currentHead2 = pHead;
- }
newElement->prev = currentHead2->prev;
currentHead2->prev = newElement;
-
newElement->objectIdx = objectIdx;
newElement->type = saveBuffer;
newElement->backgroundIdx = backgroundIdx;
@@ -152,9 +145,8 @@ backgroundIncrustStruct *addBackgroundIncrust(int16 overlayIdx, int16 objectIdx,
// sprite
int width = filesDatabase[params.fileIdx].width;
int height = filesDatabase[params.fileIdx].height;
- if (saveBuffer == 1) {
+ if (saveBuffer == 1)
backupBackground(newElement, newElement->X, newElement->Y, width, height, backgroundPtr);
- }
drawSprite(width, height, NULL, filesDatabase[params.fileIdx].subData.ptr, newElement->Y,
newElement->X, backgroundPtr, filesDatabase[params.fileIdx].subData.ptrMask);
@@ -168,7 +160,7 @@ backgroundIncrustStruct *addBackgroundIncrust(int16 overlayIdx, int16 objectIdx,
int sizeTable[4]; // 0 = left, 1 = right, 2 = bottom, 3 = top
- // this function checks if the dataPtr is not 0, else it retrives the data for X, Y, scale and DataPtr again (OLD: mainDrawSub1Sub1)
+ // this function checks if the dataPtr is not 0, else it retrieves the data for X, Y, scale and DataPtr again (OLD: mainDrawSub1Sub1)
flipPoly(params.fileIdx, (int16 *)filesDatabase[params.fileIdx].subData.ptr, params.scale, &newFrame, newElement->X, newElement->Y, &newX, &newY, &newScale);
// this function fills the sizeTable for the poly (OLD: mainDrawSub1Sub2)
@@ -187,16 +179,15 @@ backgroundIncrustStruct *addBackgroundIncrust(int16 overlayIdx, int16 objectIdx,
}
void regenerateBackgroundIncrust(backgroundIncrustStruct *pHead) {
-
lastAni[0] = 0;
-
- backgroundIncrustStruct* pl = pHead->next;
+ backgroundIncrustStruct *pl = pHead->next;
while (pl) {
backgroundIncrustStruct* pl2 = pl->next;
int frame = pl->frame;
- //int screen = pl->backgroundIdx;
+ if (frame < 0)
+ error("regenerateBackgroundIncrust() : Unexpected use of negative frame index");
if ((filesDatabase[frame].subData.ptr == NULL) || (strcmp(pl->name, filesDatabase[frame].subData.name))) {
frame = NUM_FILE_ENTRIES - 1;
@@ -235,7 +226,6 @@ void freeBackgroundIncrustList(backgroundIncrustStruct *pHead) {
MemFree(pCurrent->ptr);
MemFree(pCurrent);
-
pCurrent = pNext;
}
@@ -244,52 +234,41 @@ void freeBackgroundIncrustList(backgroundIncrustStruct *pHead) {
void removeBackgroundIncrust(int overlay, int idx, backgroundIncrustStruct * pHead) {
objectParamsQuery params;
- int var_4;
- int var_6;
-
- backgroundIncrustStruct *pCurrent;
- backgroundIncrustStruct *pCurrentHead;
getMultipleObjectParam(overlay, idx, &params);
- var_4 = params.X;
- var_6 = params.Y;
-
- pCurrent = pHead->next;
+ int x = params.X;
+ int y = params.Y;
+ backgroundIncrustStruct *pCurrent = pHead->next;
while (pCurrent) {
- if ((pCurrent->overlayIdx == overlay || overlay == -1) && (pCurrent->objectIdx == idx || idx == -1) && (pCurrent->X == var_4) && (pCurrent->Y == var_6)) {
- pCurrent->type = - 1;
- }
+ if ((pCurrent->overlayIdx == overlay || overlay == -1) && (pCurrent->objectIdx == idx || idx == -1) && (pCurrent->X == x) && (pCurrent->Y == y))
+ pCurrent->type = -1;
pCurrent = pCurrent->next;
}
- pCurrentHead = pHead;
+ backgroundIncrustStruct *pCurrentHead = pHead;
pCurrent = pHead->next;
while (pCurrent) {
- if (pCurrent->type == - 1) {
+ if (pCurrent->type == -1) {
backgroundIncrustStruct *pNext = pCurrent->next;
backgroundIncrustStruct *bx = pCurrentHead;
- backgroundIncrustStruct *cx;
bx->next = pNext;
- cx = pNext;
+ backgroundIncrustStruct *cx = pNext;
- if (!pNext) {
+ if (!pNext)
cx = pHead;
- }
bx = cx;
bx->prev = pCurrent->next;
- if (pCurrent->ptr) {
+ if (pCurrent->ptr)
MemFree(pCurrent->ptr);
- }
MemFree(pCurrent);
-
pCurrent = pNext;
} else {
pCurrentHead = pCurrent;
@@ -299,25 +278,24 @@ void removeBackgroundIncrust(int overlay, int idx, backgroundIncrustStruct * pHe
}
void unmergeBackgroundIncrust(backgroundIncrustStruct * pHead, int ovl, int idx) {
- backgroundIncrustStruct *pl;
- backgroundIncrustStruct *pl2;
-
objectParamsQuery params;
getMultipleObjectParam(ovl, idx, &params);
int x = params.X;
int y = params.Y;
- pl = pHead;
- pl2 = pl;
+ backgroundIncrustStruct *pl = pHead;
+ backgroundIncrustStruct *pl2 = pl;
pl = pl2->next;
while (pl) {
pl2 = pl;
- if ((pl->overlayIdx == ovl) || (ovl == -1))
- if ((pl->objectIdx == idx) || (idx == -1))
+ if ((pl->overlayIdx == ovl) || (ovl == -1)) {
+ if ((pl->objectIdx == idx) || (idx == -1)) {
if ((pl->X == x) && (pl->Y == y))
restoreBackground(pl);
+ }
+ }
pl = pl2->next;
}
diff --git a/engines/cruise/backgroundIncrust.h b/engines/cruise/backgroundIncrust.h
index 567df0a51e..f29e38edcf 100644
--- a/engines/cruise/backgroundIncrust.h
+++ b/engines/cruise/backgroundIncrust.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/cruise/cell.cpp b/engines/cruise/cell.cpp
index f0fb580ec1..b7cef41764 100644
--- a/engines/cruise/cell.cpp
+++ b/engines/cruise/cell.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/cruise/cell.h b/engines/cruise/cell.h
index 3620a0c945..7865f02fe1 100644
--- a/engines/cruise/cell.h
+++ b/engines/cruise/cell.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/cruise/configure.engine b/engines/cruise/configure.engine
new file mode 100644
index 0000000000..925da25370
--- /dev/null
+++ b/engines/cruise/configure.engine
@@ -0,0 +1,3 @@
+# This file is included from the main "configure" script
+# add_engine [name] [desc] [build-by-default] [subengines] [base games] [deps]
+add_engine cruise "Cinematique evo 2" yes
diff --git a/engines/cruise/cruise.cpp b/engines/cruise/cruise.cpp
index 2147419886..eebd8fdc15 100644
--- a/engines/cruise/cruise.cpp
+++ b/engines/cruise/cruise.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -50,6 +50,15 @@ CruiseEngine::CruiseEngine(OSystem * syst, const CRUISEGameDescription *gameDesc
_debugger = new Debugger();
_sound = new PCSound(_mixer, this);
+ PCFadeFlag = false;
+ _preLoad = false;
+ _savedCursor = CURSOR_NOMOUSE;
+ _lastTick = 0;
+ _gameSpeed = GAME_FRAME_DELAY_1;
+ _speedFlag = false;
+ _polyStructs = nullptr;
+ _polyStruct = nullptr;
+
// Setup mixer
syncSoundSettings();
}
@@ -87,9 +96,6 @@ Common::Error CruiseEngine::run() {
Cruise::changeCursor(Cruise::CURSOR_NORMAL);
CursorMan.showMouse(true);
- lastTick = 0;
- lastTickDebug = 0;
-
mainLoop();
deinitialize();
@@ -98,24 +104,12 @@ Common::Error CruiseEngine::run() {
}
void CruiseEngine::initialize() {
- PCFadeFlag = 0;
- _gameSpeed = GAME_FRAME_DELAY_1;
- _speedFlag = false;
-
- /*volVar1 = 0;
- * fileData1 = 0; */
-
- /*PAL_fileHandle = -1; */
-
// video init stuff
-
initSystem();
gfxModuleData_Init();
// another bit of video init
-
readVolCnf();
- _vm->_polyStruct = NULL;
}
void CruiseEngine::deinitialize() {
diff --git a/engines/cruise/cruise.h b/engines/cruise/cruise.h
index 3e49e77770..8624ba693e 100644
--- a/engines/cruise/cruise.h
+++ b/engines/cruise/cruise.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -60,7 +60,7 @@ private:
PCSound *_sound;
Common::StringArray _langStrings;
CursorType _savedCursor;
- uint32 lastTick, lastTickDebug;
+ uint32 _lastTick;
int _gameSpeed;
bool _speedFlag;
diff --git a/engines/cruise/cruise_main.cpp b/engines/cruise/cruise_main.cpp
index 911041c1a4..2de8d273f7 100644
--- a/engines/cruise/cruise_main.cpp
+++ b/engines/cruise/cruise_main.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -35,10 +35,10 @@ namespace Cruise {
enum RelationType {RT_REL = 30, RT_MSG = 50};
-static int playerDontAskQuit;
+static bool _playerDontAskQuit;
unsigned int timer = 0;
-gfxEntryStruct* linkedMsgList = NULL;
+gfxEntryStruct *linkedMsgList = nullptr;
typedef CruiseEngine::MemInfo MemInfo;
@@ -110,7 +110,6 @@ void loadPackedFileToMem(int fileIdx, uint8 *buffer) {
int getNumObjectsByClass(int scriptIdx, int param) {
objDataStruct *ptr2;
int counter;
- int i;
if (!overlayTable[scriptIdx].ovlData)
return (0);
@@ -125,7 +124,7 @@ int getNumObjectsByClass(int scriptIdx, int param) {
counter = 0;
- for (i = 0; i < overlayTable[scriptIdx].ovlData->numObj; i++) {
+ for (int i = 0; i < overlayTable[scriptIdx].ovlData->numObj; i++) {
if (ptr2[i]._class == param) {
counter++;
}
@@ -135,15 +134,12 @@ int getNumObjectsByClass(int scriptIdx, int param) {
}
void resetFileEntryRange(int start, int count) {
- int i;
-
- for (i = 0; i < count; ++i)
+ for (int i = 0; i < count; ++i)
resetFileEntry(start + i);
}
int getProcParam(int overlayIdx, int param2, const char *name) {
int numSymbGlob;
- int i;
exportEntryStruct *arraySymbGlob;
char *exportNamePtr;
char exportName[80];
@@ -161,9 +157,9 @@ int getProcParam(int overlayIdx, int param2, const char *name) {
if (!exportNamePtr)
return 0;
- for (i = 0; i < numSymbGlob; i++) {
+ for (int i = 0; i < numSymbGlob; i++) {
if (arraySymbGlob[i].var4 == param2) {
- strcpy(exportName, arraySymbGlob[i].offsetToName + exportNamePtr);
+ Common::strlcpy(exportName, arraySymbGlob[i].offsetToName + exportNamePtr, sizeof(exportName));
if (!strcmp(exportName, name)) {
return (arraySymbGlob[i].idx);
@@ -188,9 +184,7 @@ void changeScriptParamInList(int param1, int param2, scriptInstanceStruct *pScri
}
void initBigVar3() {
- int i;
-
- for (i = 0; i < NUM_FILE_ENTRIES; i++) {
+ for (int i = 0; i < NUM_FILE_ENTRIES; i++) {
if (filesDatabase[i].subData.ptr) {
MemFree(filesDatabase[i].subData.ptr);
}
@@ -338,13 +332,12 @@ void removeExtention(const char *name, char *buffer) { // not like in original
int lastFileSize;
int loadFileSub1(uint8 **ptr, const char *name, uint8 *ptr2) {
- int i;
char buffer[256];
int fileIdx;
int unpackedSize;
uint8 *unpackedBuffer;
- for (i = 0; i < 64; i++) {
+ for (int i = 0; i < 64; i++) {
if (preloadData[i].ptr) {
if (!strcmp(preloadData[i].name, name)) {
error("Unsupported code in loadFIleSub1");
@@ -371,7 +364,7 @@ int loadFileSub1(uint8 **ptr, const char *name, uint8 *ptr2) {
* strcatuint8(buffer,".HP");
* } */
} else {
- strcpy(buffer, name);
+ Common::strlcpy(buffer, name, sizeof(buffer));
}
fileIdx = findFileInDisks(buffer);
@@ -434,14 +427,12 @@ void resetFileEntry(int32 entryNumber) {
}
uint8 *mainProc14(uint16 overlay, uint16 idx) {
- ASSERT(0);
+ assert(0);
return NULL;
}
void CruiseEngine::initAllData() {
- int i;
-
setupFuncArray();
initOverlayTable();
@@ -457,15 +448,13 @@ void CruiseEngine::initAllData() {
menuTable[0] = NULL;
- for (i = 0; i < 2000; i++) {
+ for (int i = 0; i < 2000; i++)
globalVars[i] = 0;
- }
- for (i = 0; i < 8; i++) {
+ for (int i = 0; i < 8; i++)
backgroundTable[i].name[0] = 0;
- }
- for (i = 0; i < NUM_FILE_ENTRIES; i++) {
+ for (int i = 0; i < NUM_FILE_ENTRIES; i++) {
filesDatabase[i].subData.ptr = NULL;
filesDatabase[i].subData.ptrMask = NULL;
}
@@ -653,8 +642,7 @@ int findObject(int mouseX, int mouseY, int *outObjOvl, int *outObjIdx) {
(currentObject->type == OBJ_TYPE_SPRITE || currentObject->type == OBJ_TYPE_MASK ||
currentObject->type == OBJ_TYPE_EXIT || currentObject->type == OBJ_TYPE_VIRTUAL)) {
const char* pObjectName = getObjectName(currentObject->idx, overlayTable[currentObject->overlay].ovlData->arrayNameObj);
-
- strcpy(objectName, pObjectName);
+ Common::strlcpy(objectName, pObjectName, sizeof(objectName));
if (strlen(objectName) && (currentObject->freeze == 0)) {
int objIdx = currentObject->idx;
@@ -863,7 +851,6 @@ bool createDialog(int objOvl, int objIdx, int x, int y) {
bool found = false;
int testState1 = -1;
int testState2 = -1;
- int j;
int16 objectState;
int16 objectState2;
@@ -871,7 +858,7 @@ bool createDialog(int objOvl, int objIdx, int x, int y) {
menuTable[0] = createMenu(x, y, _vm->langString(ID_SPEAK_ABOUT));
- for (j = 1; j < numOfLoadedOverlay; j++) {
+ for (int j = 1; j < numOfLoadedOverlay; j++) {
if (overlayTable[j].alreadyLoaded) {
int idHeader = overlayTable[j].ovlData->numMsgRelHeader;
@@ -895,24 +882,26 @@ bool createDialog(int objOvl, int objIdx, int x, int y) {
}
if ((thisOvl == objOvl) && (ptrHead->obj2Number == objIdx)) {
- int verbeOvl = ptrHead->verbOverlay;
+ int verbOvl = ptrHead->verbOverlay;
int obj1Ovl = ptrHead->obj1Overlay;
int obj2Ovl = ptrHead->obj2Overlay;
- if (!verbeOvl) verbeOvl = j;
- if (!obj1Ovl) obj1Ovl = j;
- if (!obj2Ovl) obj2Ovl = j;
+ if (!verbOvl)
+ verbOvl = j;
+ if (!obj1Ovl)
+ obj1Ovl = j;
+ if (!obj2Ovl)
+ obj2Ovl = j;
- char verbe_name[80];
-
- verbe_name[0] = 0;
+ char verbName[80];
+ verbName[0] = 0;
ovlDataStruct *ovl2 = NULL;
ovlDataStruct *ovl3 = NULL;
ovlDataStruct *ovl4 = NULL;
- if (verbeOvl > 0)
- ovl2 = overlayTable[verbeOvl].ovlData;
+ if (verbOvl > 0)
+ ovl2 = overlayTable[verbOvl].ovlData;
if (obj1Ovl > 0)
ovl3 = overlayTable[obj1Ovl].ovlData;
@@ -920,21 +909,21 @@ bool createDialog(int objOvl, int objIdx, int x, int y) {
if (obj2Ovl > 0)
ovl4 = overlayTable[obj2Ovl].ovlData;
- if ((ovl3) && (ptrHead->obj1Number >= 0)) {
+ if (ovl3 && (ptrHead->obj1Number >= 0)) {
testState1 = ptrHead->obj1OldState;
}
- if ((ovl4) && (ptrHead->obj2Number >= 0)) {
+ if (ovl4 && (ptrHead->obj2Number >= 0)) {
testState2 = ptrHead->obj2OldState;
}
- if ((ovl4) && (ptrHead->verbNumber >= 0) &&
+ if (ovl4 && ovl2 && (ptrHead->verbNumber >= 0) &&
((testState1 == -1) || (testState1 == objectState2)) &&
((testState2 == -1) || (testState2 == objectState))) {
if (ovl2->nameVerbGlob) {
const char *ptr = getObjectName(ptrHead->verbNumber, ovl2->nameVerbGlob);
- strcpy(verbe_name, ptr);
+ Common::strlcpy(verbName, ptr, sizeof(verbName));
- if (!strlen(verbe_name))
+ if (!strlen(verbName))
attacheNewScriptToTail(&relHead, j, ptrHead->id, 30, currentScriptPtr->scriptNumber, currentScriptPtr->overlayNumber, scriptType_REL);
else if (ovl2->nameVerbGlob) {
found = true;
@@ -963,12 +952,11 @@ bool findRelation(int objOvl, int objIdx, int x, int y) {
bool found = false;
bool first = true;
int testState = -1;
- int j;
int16 objectState;
getSingleObjectParam(objOvl, objIdx, 5, &objectState);
- for (j = 1; j < numOfLoadedOverlay; j++) {
+ for (int j = 1; j < numOfLoadedOverlay; j++) {
if (overlayTable[j].alreadyLoaded) {
int idHeader = overlayTable[j].ovlData->numMsgRelHeader;
@@ -985,23 +973,27 @@ bool findRelation(int objOvl, int objIdx, int x, int y) {
objDataStruct* pObject = getObjectDataFromOverlay(thisOvl, ptrHead->obj1Number);
if ((thisOvl == objOvl) && (objIdx == ptrHead->obj1Number) && pObject && (pObject->_class != THEME)) {
- int verbeOvl = ptrHead->verbOverlay;
+ int verbOvl = ptrHead->verbOverlay;
int obj1Ovl = ptrHead->obj1Overlay;
- int obj2Ovl = ptrHead->obj2Overlay;
+ // Unused variable
+ // int obj2Ovl = ptrHead->obj2Overlay;
- if (!verbeOvl) verbeOvl = j;
- if (!obj1Ovl) obj1Ovl = j;
- if (!obj2Ovl) obj2Ovl = j;
+ if (!verbOvl)
+ verbOvl = j;
+ if (!obj1Ovl)
+ obj1Ovl = j;
+ // Unused variable
+ // if (!obj2Ovl)
+ // obj2Ovl = j;
- char verbe_name[80];
- verbe_name[0] = 0;
+ char verbName[80];
+ verbName[0] = 0;
ovlDataStruct *ovl2 = NULL;
ovlDataStruct *ovl3 = NULL;
- //ovlDataStruct *ovl4 = NULL;
- if (verbeOvl > 0)
- ovl2 = overlayTable[verbeOvl].ovlData;
+ if (verbOvl > 0)
+ ovl2 = overlayTable[verbOvl].ovlData;
if (obj1Ovl > 0)
ovl3 = overlayTable[obj1Ovl].ovlData;
@@ -1022,10 +1014,10 @@ bool findRelation(int objOvl, int objIdx, int x, int y) {
if ((ovl2) && (ptrHead->verbNumber >= 0)) {
if (ovl2->nameVerbGlob) {
const char *ptr = getObjectName(ptrHead->verbNumber, ovl2->nameVerbGlob);
- strcpy(verbe_name, ptr);
+ Common::strlcpy(verbName, ptr, sizeof(verbName));
if ((!first) && ((testState == -1) || (testState == objectState))) {
- if (!strlen(verbe_name)) {
+ if (!strlen(verbName)) {
if (currentScriptPtr) {
attacheNewScriptToTail(&relHead, j, ptrHead->id, 30, currentScriptPtr->scriptNumber, currentScriptPtr->overlayNumber, scriptType_REL);
} else {
@@ -1088,9 +1080,6 @@ void callSubRelation(menuElementSubStruct *pMenuElement, int nOvl, int nObj) {
}
if ((obj2Ovl == nOvl) && (pHeader->obj2Number != -1) && (pHeader->obj2Number == nObj)) {
- int x = 60;
- int y = 60;
-
objectParamsQuery params;
memset(&params, 0, sizeof(objectParamsQuery)); // to remove warning
@@ -1138,6 +1127,8 @@ void callSubRelation(menuElementSubStruct *pMenuElement, int nOvl, int nObj) {
}
}
} else if (pHeader->type == RT_MSG) {
+ int x = 60;
+ int y = 60;
if (pHeader->obj2Number >= 0) {
if ((pHeader->trackX !=-1) && (pHeader->trackY !=-1) &&
@@ -1166,7 +1157,7 @@ void callSubRelation(menuElementSubStruct *pMenuElement, int nOvl, int nObj) {
createTextObject(&cellHead, ovlIdx, pHeader->id, x, y, 200, findHighColor(), masterScreen, 0, 0);
}
- userWait = 1;
+ userWait = true;
autoOvl = ovlIdx;
autoMsg = pHeader->id;
@@ -1195,7 +1186,7 @@ void callSubRelation(menuElementSubStruct *pMenuElement, int nOvl, int nObj) {
pTrack->flag = 1;
autoTrack = true;
- userWait = 0;
+ userWait = false;
userEnabled = 0;
freezeCell(&cellHead, ovlIdx, pHeader->id, 5, -1, 0, 9998);
}
@@ -1312,7 +1303,7 @@ void callRelation(menuElementSubStruct *pMenuElement, int nObj2) {
createTextObject(&cellHead, ovlIdx, pHeader->id, x, y, 200, findHighColor(), masterScreen, 0, 0);
}
- userWait = 1;
+ userWait = true;
autoOvl = ovlIdx;
autoMsg = pHeader->id;
@@ -1343,7 +1334,7 @@ void callRelation(menuElementSubStruct *pMenuElement, int nObj2) {
pTrack->flag = 1;
autoTrack = true;
- userWait = 0;
+ userWait = false;
userEnabled = 0;
freezeCell(&cellHead, ovlIdx, pHeader->id, 5, -1, 0, 9998);
}
@@ -1368,7 +1359,7 @@ void closeAllMenu() {
menuTable[1] = NULL;
}
if (linkedMsgList) {
- ASSERT(0);
+ assert(0);
// freeMsgList(linkedMsgList);
}
@@ -1464,7 +1455,7 @@ int CruiseEngine::processInput() {
if (userWait) {
// Check for left mouse button click or Space to end user waiting
if ((keyboardCode == Common::KEYCODE_SPACE) || (button == CRS_MB_LEFT))
- userWait = 0;
+ userWait = false;
keyboardCode = Common::KEYCODE_INVALID;
return 0;
@@ -1523,7 +1514,7 @@ int CruiseEngine::processInput() {
menuTable[0] = NULL;
if (linkedMsgList) {
- ASSERT(0);
+ assert(0);
// freeMsgList(linkedMsgList);
}
@@ -1715,7 +1706,7 @@ bool manageEvents() {
break;
case Common::EVENT_QUIT:
case Common::EVENT_RTL:
- playerDontAskQuit = 1;
+ _playerDontAskQuit = true;
break;
case Common::EVENT_KEYUP:
switch (event.kbd.keycode) {
@@ -1781,16 +1772,12 @@ void CruiseEngine::mainLoop() {
currentActiveMenu = -1;
autoMsg = -1;
linkedRelation = 0;
- main21 = 0;
- main22 = 0;
- userWait = 0;
+ userWait = false;
autoTrack = false;
initAllData();
- playerDontAskQuit = 0;
- int quitValue2 = 1;
- int quitValue = 0;
+ _playerDontAskQuit = false;
if (ConfMan.hasKey("save_slot"))
loadGameState(ConfMan.getInt("save_slot"));
@@ -1840,23 +1827,20 @@ void CruiseEngine::mainLoop() {
if (!skipEvents || bFastMode)
skipEvents = manageEvents();
- if (bFastMode) {
- if (currentTick >= (lastTickDebug + 10))
- lastTickDebug = currentTick;
- } else {
+ if (!bFastMode) {
g_system->delayMillis(10);
currentTick = g_system->getMillis();
}
- if (playerDontAskQuit)
+ if (_playerDontAskQuit)
break;
_vm->getDebugger()->onFrame();
- } while (currentTick < lastTick + _gameSpeed && !bFastMode);
- if (playerDontAskQuit)
+ } while (currentTick < _lastTick + _gameSpeed && !bFastMode);
+ if (_playerDontAskQuit)
break;
- lastTick = g_system->getMillis();
+ _lastTick = g_system->getMillis();
// Handle switchover in game speed after intro
if (!_speedFlag && canLoadGameStateCurrently()) {
@@ -1871,7 +1855,7 @@ void CruiseEngine::mainLoop() {
// readKeyboard();
- bool isUserWait = userWait != 0;
+ bool isUserWait = userWait;
// WORKAROUND: This prevents hotspots responding during
// delays i.e. Menu opening if you click fast on another
// hotspot after trying to open a locked door, which
@@ -1880,8 +1864,8 @@ void CruiseEngine::mainLoop() {
currentMouseButton = 0;
}
- playerDontAskQuit = processInput();
- if (playerDontAskQuit)
+ _playerDontAskQuit = processInput();
+ if (_playerDontAskQuit)
break;
if (enableUser) {
@@ -1906,11 +1890,10 @@ void CruiseEngine::mainLoop() {
// Raoul appearing when looking at the book is being there are 3 script iterations separation between the
// scene being changed to the book, and the Raoul actor being frozen/disabled. This loop is a hack to ensure
// that does a few extra script executions for that scene
- bool bgChanged;
int numIterations = 1;
while (numIterations-- > 0) {
- bgChanged = backgroundChanged[masterScreen];
+ bool bgChanged = backgroundChanged[masterScreen];
manageScripts(&relHead);
manageScripts(&procHead);
@@ -1928,7 +1911,7 @@ void CruiseEngine::mainLoop() {
processAnimation();
if (remdo) {
- // ASSERT(0);
+ // assert(0);
/* main3 = 0;
* var24 = 0;
* var23 = 0;
@@ -1937,7 +1920,7 @@ void CruiseEngine::mainLoop() {
}
if (cmdLine[0]) {
- ASSERT(0);
+ assert(0);
/* redrawStrings(0,&cmdLine,8);
waitForPlayerInput();
@@ -1947,13 +1930,13 @@ void CruiseEngine::mainLoop() {
if (displayOn) {
if (doFade)
- PCFadeFlag = 0;
+ PCFadeFlag = false;
/*if (!PCFadeFlag)*/
mainDraw(userWait);
flipScreen();
- if (userWait == 1) {
+ if (userWait) {
// Waiting for press - original wait loop has been integrated into the
// main event loop
continue;
@@ -1968,7 +1951,7 @@ void CruiseEngine::mainLoop() {
char* pText = getText(autoMsg, autoOvl);
if (strlen(pText))
- userWait = 1;
+ userWait = true;
}
changeScriptParamInList(-1, -1, &relHead, 9998, 0);
@@ -1986,7 +1969,7 @@ void CruiseEngine::mainLoop() {
g_system->updateScreen();
}
- } while (!playerDontAskQuit && quitValue2 && quitValue != 7);
+ } while (!_playerDontAskQuit);
// Free data
removeAllScripts(&relHead);
diff --git a/engines/cruise/cruise_main.h b/engines/cruise/cruise_main.h
index 9afae4336b..f9d0e2fc78 100644
--- a/engines/cruise/cruise_main.h
+++ b/engines/cruise/cruise_main.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -62,9 +62,6 @@ enum MouseButton {
/*#define DUMP_SCRIPT
#define DUMP_OBJECT*/
-#define ASSERT_PTR assert
-#define ASSERT assert
-
enum ResType {
OBJ_TYPE_LINE = 0,
OBJ_TYPE_MASK = 1,
diff --git a/engines/cruise/ctp.cpp b/engines/cruise/ctp.cpp
index a7b6faec1c..9515b552e1 100644
--- a/engines/cruise/ctp.cpp
+++ b/engines/cruise/ctp.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -95,7 +95,6 @@ void getWalkBoxCenter(int n, int16 table[][40]) {
// ax dx bx
void renderCTPWalkBox(int16 *walkboxData, int hotPointX, int hotPointY, int X, int Y, int scale) {
int numPoints;
- int i;
int16 *destination;
int startX = X - ((upscaleValue(hotPointX, scale) + 0x8000) >> 16);
@@ -105,7 +104,7 @@ void renderCTPWalkBox(int16 *walkboxData, int hotPointX, int hotPointY, int X, i
destination = polyBuffer2;
- for (i = 0; i < numPoints; i++) {
+ for (int i = 0; i < numPoints; i++) {
int pointX = *(walkboxData++);
int pointY = *(walkboxData++);
@@ -119,7 +118,7 @@ void renderCTPWalkBox(int16 *walkboxData, int hotPointX, int hotPointY, int X, i
m_color = 0;
ctpVarUnk = 0;
- for (i = 0; i < numPoints; i++) {
+ for (int i = 0; i < numPoints; i++) {
walkboxTable[i] = i;
}
@@ -245,7 +244,7 @@ int initCt(const char *ctpName) {
}
// get the path-finding coordinates
- ASSERT((segementSizeTable[0] % 4) == 0);
+ assert((segementSizeTable[0] % 4) == 0);
for (int i = 0; i < segementSizeTable[0] / 4; i++) {
ctp_routeCoords[i][0] = (int16)READ_BE_UINT16(dataPointer);
dataPointer += 2;
@@ -254,7 +253,7 @@ int initCt(const char *ctpName) {
}
// get the path-finding line informations (indexing the routeCoords array)
- ASSERT((segementSizeTable[1] % 20) == 0);
+ assert((segementSizeTable[1] % 20) == 0);
for (int i = 0; i < segementSizeTable[1] / 20; i++) {
for (int j = 0; j < 10; j++) {
ctp_routes[i][j] = (int16)READ_BE_UINT16(dataPointer);
@@ -263,7 +262,7 @@ int initCt(const char *ctpName) {
}
// read polygons
- ASSERT((segementSizeTable[2] % 80) == 0);
+ assert((segementSizeTable[2] % 80) == 0);
for (int i = 0; i < segementSizeTable[2] / 80; i++) {
for (int j = 0; j < 40; j++) {
ctp_walkboxTable[i][j] = (int16)READ_BE_UINT16(dataPointer);
@@ -278,14 +277,14 @@ int initCt(const char *ctpName) {
} else {
// get the walkbox type
// Type: 0x00 - non walkable, 0x01 - walkable, 0x02 - exit zone
- ASSERT((segementSizeTable[3] % 2) == 0);
+ assert((segementSizeTable[3] % 2) == 0);
for (int i = 0; i < segementSizeTable[3] / 2; i++) {
walkboxColor[i] = (int16)READ_BE_UINT16(dataPointer);
dataPointer += 2;
}
// change indicator, walkbox type can change, i.e. blocked by object (values are either 0x00 or 0x01)
- ASSERT((segementSizeTable[4] % 2) == 0);
+ assert((segementSizeTable[4] % 2) == 0);
for (int i = 0; i < segementSizeTable[4] / 2; i++) {
walkboxState[i] = (int16)READ_BE_UINT16(dataPointer);
dataPointer += 2;
@@ -293,14 +292,14 @@ int initCt(const char *ctpName) {
}
//
- ASSERT((segementSizeTable[5] % 2) == 0);
+ assert((segementSizeTable[5] % 2) == 0);
for (int i = 0; i < segementSizeTable[5] / 2; i++) {
walkboxColorIndex[i] = (int16)READ_BE_UINT16(dataPointer);
dataPointer += 2;
}
//
- ASSERT((segementSizeTable[6] % 2) == 0);
+ assert((segementSizeTable[6] % 2) == 0);
for (int i = 0; i < segementSizeTable[6] / 2; i++) {
walkboxZoom[i] = (int16)READ_BE_UINT16(dataPointer);
dataPointer += 2;
diff --git a/engines/cruise/ctp.h b/engines/cruise/ctp.h
index 340832e6fb..93f7466c52 100644
--- a/engines/cruise/ctp.h
+++ b/engines/cruise/ctp.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/cruise/dataLoader.cpp b/engines/cruise/dataLoader.cpp
index b2a319bb85..7a1258dbde 100644
--- a/engines/cruise/dataLoader.cpp
+++ b/engines/cruise/dataLoader.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -170,11 +170,11 @@ int createResFileEntry(int width, int height, int size, int resType) {
return 0; // for compilers that don't support NORETURN
#if 0
- int i;
int entryNumber;
int div = 0;
- for (i = 0; i < NUM_FILE_ENTRIES; i++) {
+ int i = 0;
+ for (; i < NUM_FILE_ENTRIES; i++) {
if (!filesDatabase[i].subData.ptr)
break;
}
@@ -225,7 +225,7 @@ fileTypeEnum getFileType(const char *name) {
newFileType = type_FNT;
}
- ASSERT(newFileType != type_UNK);
+ assert(newFileType != type_UNK);
return newFileType;
}
@@ -280,10 +280,9 @@ int loadFileRange(const char *name, int startIdx, int currentEntryIdx, int numId
switch (fileType) {
case type_SET: {
- int i;
int numMaxEntriesInSet = getNumMaxEntiresInSet(ptr);
- for (i = 0; i < numIdx; i++) {
+ for (int i = 0; i < numIdx; i++) {
if ((startIdx + i) > numMaxEntriesInSet) {
MemFree(ptr);
return 0; // exit if limit is reached
@@ -325,12 +324,9 @@ int loadFullBundle(const char *name, int startIdx) {
switch (fileType) {
case type_SET: {
// Sprite set
- int i;
- int numMaxEntriesInSet;
-
- numMaxEntriesInSet = getNumMaxEntiresInSet(ptr); // get maximum number of sprites/animations in SET file
+ int numMaxEntriesInSet = getNumMaxEntiresInSet(ptr); // get maximum number of sprites/animations in SET file
- for (i = 0; i < numMaxEntriesInSet; i++) {
+ for (int i = 0; i < numMaxEntriesInSet; i++) {
loadSetEntry(name, ptr, i, startIdx + i);
}
@@ -356,39 +352,32 @@ int loadFullBundle(const char *name, int startIdx) {
}
int loadFNTSub(uint8 *ptr, int destIdx) {
- uint8 *ptr2 = ptr;
- uint8 *destPtr;
- int fileIndex;
- //uint32 fontSize;
-
- ptr2 += 4;
+ uint8 *ptr2 = ptr + 4;
loadFileVar1 = READ_BE_UINT32(ptr2);
- if (destIdx == -1) {
+ int fileIndex;
+ if (destIdx == -1)
fileIndex = createResFileEntry(loadFileVar1, 1, loadFileVar1, 1);
- } else {
+ else
fileIndex = updateResFileEntry(loadFileVar1, 1, loadFileVar1, destIdx, 1);
- }
- destPtr = filesDatabase[fileIndex].subData.ptr;
+ if (fileIndex < 0)
+ error("Unable to load FNT resource");
- if (destPtr != NULL) {
- int32 i;
- uint8 *currentPtr;
+ uint8 *destPtr = filesDatabase[fileIndex].subData.ptr;
+ if (destPtr != NULL) {
memcpy(destPtr, ptr2, loadFileVar1);
- //fontSize = READ_BE_UINT32(ptr2);
-
destPtr = filesDatabase[fileIndex].subData.ptr;
bigEndianLongToNative((int32 *) destPtr);
bigEndianLongToNative((int32 *)(destPtr + 4));
flipGen(destPtr + 8, 6);
- currentPtr = destPtr + 14;
+ uint8 *currentPtr = destPtr + 14;
- for (i = 0; i < (int16)READ_UINT16(destPtr + 8); i++) {
+ for (int i = 0; i < (int16)READ_UINT16(destPtr + 8); i++) {
bigEndianLongToNative((int32 *) currentPtr);
currentPtr += 4;
@@ -401,16 +390,17 @@ int loadFNTSub(uint8 *ptr, int destIdx) {
}
int loadSPLSub(uint8 *ptr, int destIdx) {
- uint8 *destPtr;
int fileIndex;
- if (destIdx == -1) {
+ if (destIdx == -1)
fileIndex = createResFileEntry(loadFileVar1, 1, loadFileVar1, 1);
- } else {
+ else
fileIndex = updateResFileEntry(loadFileVar1, 1, loadFileVar1, destIdx, 1);
- }
- destPtr = filesDatabase[fileIndex].subData.ptr;
+ if (fileIndex < 0)
+ error("Unable to load SPL resource");
+
+ uint8* destPtr = filesDatabase[fileIndex].subData.ptr;
memcpy(destPtr, ptr, loadFileVar1);
return 1;
@@ -423,135 +413,119 @@ int loadSetEntry(const char *name, uint8 *ptr, int currentEntryIdx, int currentD
int sec = 0;
uint16 numIdx;
- if (!strcmp((char *)ptr, "SEC")) {
+ if (!strcmp((char *)ptr, "SEC"))
sec = 1;
- }
numIdx = READ_BE_UINT16(ptr + 4);
-
ptr3 = ptr + 6;
-
offset = currentEntryIdx * 16;
- {
- int resourceSize;
- int fileIndex;
- setHeaderEntry localBuffer;
- uint8 *ptr5;
-
- Common::MemoryReadStream s4(ptr + offset + 6, 16);
+ int resourceSize;
+ int fileIndex;
+ setHeaderEntry localBuffer;
- localBuffer.offset = s4.readUint32BE();
- localBuffer.width = s4.readUint16BE();
- localBuffer.height = s4.readUint16BE();
- localBuffer.type = s4.readUint16BE();
- localBuffer.transparency = s4.readUint16BE() & 0x1F;
- localBuffer.hotspotY = s4.readUint16BE();
- localBuffer.hotspotX = s4.readUint16BE();
+ Common::MemoryReadStream s4(ptr + offset + 6, 16);
- if (sec == 1)
- // Type 1: Width - (1*2) , Type 5: Width - (5*2)
- localBuffer.width -= localBuffer.type * 2;
+ localBuffer.offset = s4.readUint32BE();
+ localBuffer.width = s4.readUint16BE();
+ localBuffer.height = s4.readUint16BE();
+ localBuffer.type = s4.readUint16BE();
+ localBuffer.transparency = s4.readUint16BE() & 0x1F;
+ localBuffer.hotspotY = s4.readUint16BE();
+ localBuffer.hotspotX = s4.readUint16BE();
- resourceSize = localBuffer.width * localBuffer.height;
+ if (sec == 1)
+ // Type 1: Width - (1*2) , Type 5: Width - (5*2)
+ localBuffer.width -= localBuffer.type * 2;
- if (!sec && (localBuffer.type == 5))
- // Type 5: Width - (2*5)
- localBuffer.width -= 10;
+ resourceSize = localBuffer.width * localBuffer.height;
- if (currentDestEntry == -1) {
- fileIndex = createResFileEntry(localBuffer.width, localBuffer.height, resourceSize, localBuffer.type);
- } else {
- fileIndex = updateResFileEntry(localBuffer.height, localBuffer.width, resourceSize, currentDestEntry, localBuffer.type);
- }
+ if (!sec && (localBuffer.type == 5))
+ // Type 5: Width - (2*5)
+ localBuffer.width -= 10;
- if (fileIndex < 0) {
- return -1; // TODO: buffer is not freed
- }
-
- if (!sec && (localBuffer.type == 5)) {
- // There are sometimes sprites with a reduced width than what their pixels provide.
- // The original handled this here by copy parts of each line - for ScummVM, we're
- // simply setting the width in bytes and letting the decoder do the rest
- filesDatabase[fileIndex].width += 2;
- }
+ if (currentDestEntry == -1)
+ fileIndex = createResFileEntry(localBuffer.width, localBuffer.height, resourceSize, localBuffer.type);
+ else
+ fileIndex = updateResFileEntry(localBuffer.height, localBuffer.width, resourceSize, currentDestEntry, localBuffer.type);
- ptr5 = ptr3 + localBuffer.offset + numIdx * 16;
+ if (fileIndex < 0)
+ return -1; // TODO: buffer is not freed
- memcpy(filesDatabase[fileIndex].subData.ptr, ptr5, resourceSize);
+ if (!sec && (localBuffer.type == 5)) {
+ // There are sometimes sprites with a reduced width than what their pixels provide.
+ // The original handled this here by copy parts of each line - for ScummVM, we're
+ // simply setting the width in bytes and letting the decoder do the rest
+ filesDatabase[fileIndex].width += 2;
+ }
- ptr5 += resourceSize;
+ uint8 *ptr5 = ptr3 + localBuffer.offset + numIdx * 16;
+ memcpy(filesDatabase[fileIndex].subData.ptr, ptr5, resourceSize);
- switch (localBuffer.type) {
- case 0: { // polygon
+ switch (localBuffer.type) {
+ case 0: // polygon
filesDatabase[fileIndex].subData.resourceType = OBJ_TYPE_POLY;
filesDatabase[fileIndex].subData.index = currentEntryIdx;
break;
- }
- case 1: {
+
+ case 1:
filesDatabase[fileIndex].width = filesDatabase[fileIndex].widthInColumn * 8;
filesDatabase[fileIndex].subData.resourceType = OBJ_TYPE_BGMASK;
decodeGfxUnified(&filesDatabase[fileIndex], localBuffer.type);
filesDatabase[fileIndex].subData.index = currentEntryIdx;
filesDatabase[fileIndex].subData.transparency = 0;
break;
- }
- case 4: {
+
+ case 4:
filesDatabase[fileIndex].width = filesDatabase[fileIndex].widthInColumn * 2;
filesDatabase[fileIndex].subData.resourceType = OBJ_TYPE_SPRITE;
decodeGfxUnified(&filesDatabase[fileIndex], localBuffer.type);
filesDatabase[fileIndex].subData.index = currentEntryIdx;
filesDatabase[fileIndex].subData.transparency = localBuffer.transparency % 0x10;
break;
- }
- case 5: {
+
+ case 5:
filesDatabase[fileIndex].subData.resourceType = OBJ_TYPE_SPRITE;
decodeGfxUnified(&filesDatabase[fileIndex], localBuffer.type);
filesDatabase[fileIndex].width = filesDatabase[fileIndex].widthInColumn;
filesDatabase[fileIndex].subData.index = currentEntryIdx;
filesDatabase[fileIndex].subData.transparency = localBuffer.transparency;
break;
- }
- case 8: {
+
+ case 8:
filesDatabase[fileIndex].subData.resourceType = OBJ_TYPE_SPRITE;
filesDatabase[fileIndex].width = filesDatabase[fileIndex].widthInColumn;
filesDatabase[fileIndex].subData.index = currentEntryIdx;
filesDatabase[fileIndex].subData.transparency = localBuffer.transparency;
break;
- }
- default: {
- warning("Unsuported gfx loading type: %d", localBuffer.type);
+
+ default:
+ warning("Unsupported gfx loading type: %d", localBuffer.type);
break;
- }
- }
+ }
- if (name != filesDatabase[fileIndex].subData.name)
- strcpy(filesDatabase[fileIndex].subData.name, name);
+ if (name != filesDatabase[fileIndex].subData.name)
+ Common::strlcpy(filesDatabase[fileIndex].subData.name, name, sizeof(filesDatabase[fileIndex].subData.name));
- // create the mask
- switch (localBuffer.type) {
+ // create the mask
+ switch (localBuffer.type) {
case 1:
case 4:
case 5:
- case 8: {
- int maskX;
- int maskY;
-
+ case 8:
memset(filesDatabase[fileIndex].subData.ptrMask, 0, filesDatabase[fileIndex].width / 8 * filesDatabase[fileIndex].height);
- for (maskY = 0; maskY < filesDatabase[fileIndex].height; maskY++) {
- for (maskX = 0; maskX < filesDatabase[fileIndex].width; maskX++) {
+ for (int maskY = 0; maskY < filesDatabase[fileIndex].height; maskY++) {
+ for (int maskX = 0; maskX < filesDatabase[fileIndex].width; maskX++) {
if (*(filesDatabase[fileIndex].subData.ptr + filesDatabase[fileIndex].width * maskY + maskX) != filesDatabase[fileIndex].subData.transparency) {
*(filesDatabase[fileIndex].subData.ptrMask + filesDatabase[fileIndex].width / 8 * maskY + maskX / 8) |= 0x80 >> (maskX & 7);
}
}
}
+ break;
+ default:
break;
- }
- default: {
- }
- }
}
// TODO: free
diff --git a/engines/cruise/dataLoader.h b/engines/cruise/dataLoader.h
index 96188c7982..cf19145beb 100644
--- a/engines/cruise/dataLoader.h
+++ b/engines/cruise/dataLoader.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/cruise/debugger.cpp b/engines/cruise/debugger.cpp
index a74f600ddd..d4e706a094 100644
--- a/engines/cruise/debugger.cpp
+++ b/engines/cruise/debugger.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -29,9 +29,9 @@
namespace Cruise {
Debugger::Debugger(): GUI::Debugger() {
- DCmd_Register("continue", WRAP_METHOD(Debugger, Cmd_Exit));
- DCmd_Register("hotspots", WRAP_METHOD(Debugger, cmd_hotspots));
- DCmd_Register("items", WRAP_METHOD(Debugger, cmd_items));
+ registerCmd("continue", WRAP_METHOD(Debugger, cmdExit));
+ registerCmd("hotspots", WRAP_METHOD(Debugger, cmd_hotspots));
+ registerCmd("items", WRAP_METHOD(Debugger, cmd_items));
}
/**
@@ -70,7 +70,7 @@ bool Debugger::cmd_hotspots(int argc, const char **argv) {
if (*pObjectName) {
getMultipleObjectParam(currentObject->overlay, currentObject->idx, &params);
- DebugPrintf("%s %s - %d,%d\n", pObjectName, pObjType, params.X, params.Y);
+ debugPrintf("%s %s - %d,%d\n", pObjectName, pObjType, params.X, params.Y);
}
}
@@ -96,7 +96,7 @@ bool Debugger::cmd_items(int argc, const char **argv) {
getSingleObjectParam(i, j, 5, &returnVar);
if (returnVar < -1)
- DebugPrintf("%s\n", getObjectName(j, pOvlData->arrayNameObj));
+ debugPrintf("%s\n", getObjectName(j, pOvlData->arrayNameObj));
}
}
}
diff --git a/engines/cruise/debugger.h b/engines/cruise/debugger.h
index 3cef6b371d..a79773f37e 100644
--- a/engines/cruise/debugger.h
+++ b/engines/cruise/debugger.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/cruise/decompiler.cpp b/engines/cruise/decompiler.cpp
index 74a78201bc..7691a1bba7 100644
--- a/engines/cruise/decompiler.cpp
+++ b/engines/cruise/decompiler.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -130,13 +130,12 @@ void pushDecomp(char *string, ...) {
void resolveDecompShort(char *buffer) {
ovlData3Struct *data3Ptr = currentScript;
- int i;
importScriptStruct *importEntry =
(importScriptStruct *)(data3Ptr->dataPtr +
data3Ptr->offsetToImportData);
- for (i = 0; i < data3Ptr->numRelocGlob; i++) {
+ for (int i = 0; i < data3Ptr->numRelocGlob; i++) {
switch (importEntry->type) {
case 20: // script
case 30:
@@ -177,13 +176,12 @@ void resolveDecompShort(char *buffer) {
void resolveDecompChar(char *buffer) {
ovlData3Struct *data3Ptr = currentScript;
- int i;
importScriptStruct *importEntry =
(importScriptStruct *)(data3Ptr->dataPtr +
data3Ptr->offsetToImportData);
- for (i = 0; i < data3Ptr->numRelocGlob; i++) {
+ for (int i = 0; i < data3Ptr->numRelocGlob; i++) {
switch (importEntry->type) {
default: {
if (importEntry->offset ==
@@ -315,9 +313,7 @@ void resolveVarName(char *ovlIdxString, int varType, char *varIdxString,
}
if (!strcmp(ovlIdxString, "0")) {
- int i;
-
- for (i = 0; i < currentDecompOvl->numSymbGlob; i++) {
+ for (int i = 0; i < currentDecompOvl->numSymbGlob; i++) {
if (varIdx == currentDecompOvl->arraySymbGlob[i].idx) {
if (((currentDecompOvl->arraySymbGlob[i].var4 & 0xF0) == 0) && varType != 0x20) { // var
strcpy(outputName,
@@ -495,7 +491,7 @@ int decompOpcodeType2() {
char buffer3[256];
char varName[256];
int byte1 = getByteFromDecompScriptReal();
- int byte2 = getByteFromDecompScriptReal();
+ getByteFromDecompScriptReal();
getShortFromDecompScript(buffer3);
resolveVarName("0", byte1 & 7, buffer3, varName);
@@ -506,7 +502,7 @@ int decompOpcodeType2() {
}
case 5: {
int byte1 = getByteFromDecompScriptReal();
- int byte2 = getByteFromDecompScriptReal();
+ getByteFromDecompScriptReal();
short int short1 = getShortFromDecompScriptReal();
int8 *ptr = scriptDataPtrTable[byte1 & 7] + short1;
@@ -559,7 +555,7 @@ int decompMath() {
break;
}
case 4: {
- sprintf(tempbuffer, "%s\%%s", param1, param2);
+ sprintf(tempbuffer, "%s % %s", param1, param2);
pushDecomp(tempbuffer);
break;
}
@@ -701,49 +697,41 @@ int decompSwapStack() {
int decompFunction() {
currentScriptOpcodeType = getByteFromDecompScriptReal();
-// addDecomp("OP_%X", currentScriptOpcodeType);
switch (currentScriptOpcodeType) {
- case 0x1: {
- pushDecomp("_setdoFade()");
+ case 0x1:
+ pushDecomp("Op_FadeIn()");
break;
- }
- case 0x2: {
- pushDecomp("_prepareFade()");
+
+ case 0x2:
+ pushDecomp("Op_FadeOut()");
break;
- }
- case 0x3: {
- sprintf(tempbuffer, "_loadBackground(%s,%s)",
- popDecomp(), popDecomp());
+
+ case 0x3:
+ sprintf(tempbuffer, "Op_loadBackground(%s,%s)", popDecomp(), popDecomp());
pushDecomp(tempbuffer);
break;
- }
- case 0x4: {
- sprintf(tempbuffer, "_loadFullBundle(%s,%s)",
- popDecomp(), popDecomp());
+
+ case 0x4:
+ sprintf(tempbuffer, "Op_LoadAbs(%s,%s)", popDecomp(), popDecomp());
pushDecomp(tempbuffer);
break;
- }
- case 0x5: {
- sprintf(tempbuffer, "_addCell(%s,%s,%s)", popDecomp(),
- popDecomp(), popDecomp());
+
+ case 0x5:
+ sprintf(tempbuffer, "Op_AddCell(%s,%s,%s)", popDecomp(), popDecomp(), popDecomp());
pushDecomp(tempbuffer);
break;
- }
+
case 0x6: {
unsigned long int numArg = atoi(popDecomp());
- char *ovlStr;
- char *idxStr;
- int i;
char functionName[100];
- idxStr = popDecomp();
- ovlStr = popDecomp();
+ char *idxStr = popDecomp();
+ char *ovlStr = popDecomp();
resolveVarName(ovlStr, 0x20, idxStr, functionName);
+ sprintf(tempbuffer, "Op_AddProc(%s", functionName);
- sprintf(tempbuffer, "_startASync(%s", functionName);
-
- for (i = 0; i < numArg; i++) {
+ for (int i = 0; i < numArg; i++) {
strcatuint8(tempbuffer, ",");
strcatuint8(tempbuffer, popDecomp());
}
@@ -752,196 +740,165 @@ int decompFunction() {
pushDecomp(tempbuffer);
break;
- }
- case 0x7: {
- char *var1;
- char *objIdxStr;
- char *ovlStr;
+ }
- var1 = popDecomp();
- objIdxStr = popDecomp();
- ovlStr = popDecomp();
+ case 0x7: {
+ char *var1 = popDecomp();
+ char *objIdxStr = popDecomp();
+ char *ovlStr = popDecomp();
- sprintf(tempbuffer,
- "_createObjectFromOvlData(ovl:%s,dataIdx:%s,%s)",
- ovlStr, objIdxStr, var1);
+ sprintf(tempbuffer, "Op_InitializeState(ovl:%s,dataIdx:%s,%s)", ovlStr, objIdxStr, var1);
pushDecomp(tempbuffer);
break;
- }
- case 0x8: {
- sprintf(tempbuffer, "_removeCell(%s,%s,%s)",
- popDecomp(), popDecomp(), popDecomp());
+ }
+
+ case 0x8:
+ sprintf(tempbuffer, "Op_RemoveCell(%s,%s,%s)", popDecomp(), popDecomp(), popDecomp());
pushDecomp(tempbuffer);
break;
- }
- case 0x9: {
- pushDecomp("_freeobjectList()");
+
+ case 0x9:
+ pushDecomp("Op_FreeCell()");
break;
- }
- case 0xA: {
- sprintf(tempbuffer, "_removeScript(ovl(%s),%s)",
- popDecomp(), popDecomp());
+
+ case 0xA:
+ sprintf(tempbuffer, "Op_RemoveProc(ovl(%s),%s)", popDecomp(), popDecomp());
pushDecomp(tempbuffer);
break;
- }
- case 0xB: {
- sprintf(tempbuffer, "_resetFilesEntries(%s,%s)",
- popDecomp(), popDecomp());
+
+ case 0xB:
+ sprintf(tempbuffer, "Op_RemoveFrame(%s,%s)", popDecomp(), popDecomp());
pushDecomp(tempbuffer);
break;
- }
- case 0xC: {
- sprintf(tempbuffer, "_loadOverlay(%s)", popDecomp());
+
+ case 0xC:
+ sprintf(tempbuffer, "Op_LoadOverlay(%s)", popDecomp());
pushDecomp(tempbuffer);
break;
- }
- case 0xD: {
- sprintf(tempbuffer, "_palManipulation(%s,%s,%s,%s,%s)",
- popDecomp(), popDecomp(), popDecomp(), popDecomp(),
- popDecomp());
+
+ case 0xD:
+ sprintf(tempbuffer, "Op_SetColor(%s,%s,%s,%s,%s)", popDecomp(), popDecomp(), popDecomp(), popDecomp(), popDecomp());
pushDecomp(tempbuffer);
break;
- }
- case 0xE: {
- sprintf(tempbuffer, "_playSample(%s,%s,%s,%s)",
- popDecomp(), popDecomp(), popDecomp(),
- popDecomp());
+
+ case 0xE:
+ sprintf(tempbuffer, "Op_PlayFX(%s,%s,%s,%s)", popDecomp(), popDecomp(), popDecomp(), popDecomp());
pushDecomp(tempbuffer);
break;
- }
- case 0x10: {
- sprintf(tempbuffer, "_releaseScript2(%s)",
- popDecomp());
+
+ case 0x10:
+ sprintf(tempbuffer, "Op_FreeOverlay(%s)", popDecomp());
pushDecomp(tempbuffer);
break;
- }
- case 0x11: {
- sprintf(tempbuffer, "_getOverlayIdx(%s)", popDecomp());
+
+ case 0x11:
+ sprintf(tempbuffer, "Op_FindOverlay(%s)", popDecomp());
pushDecomp(tempbuffer);
break;
- }
- case 0x13: {
- sprintf(tempbuffer,
- "_displayMessage(%s,\"%s\",%s,%s,%s,%s)",
- popDecomp(), resolveMessage(popDecomp()),
- popDecomp(), popDecomp(), popDecomp(),
- popDecomp());
+
+ case 0x13:
+ sprintf(tempbuffer, "Op_AddMessage(%s,\"%s\",%s,%s,%s,%s)", popDecomp(),
+ resolveMessage(popDecomp()), popDecomp(), popDecomp(), popDecomp(), popDecomp());
pushDecomp(tempbuffer);
break;
- }
- case 0x14: {
- sprintf(tempbuffer, "_removeObject(ovl(%s),%s)",
- popDecomp(), popDecomp());
+
+ case 0x14:
+ sprintf(tempbuffer, "Op_RemoveMessage(ovl(%s),%s)", popDecomp(), popDecomp());
pushDecomp(tempbuffer);
break;
- }
- case 0x15: {
- pushDecomp("_pauseScript()");
+
+ case 0x15:
+ pushDecomp("Op_UserWait()");
break;
- }
- case 0x16: {
- sprintf(tempbuffer,
- "_Op_FreezeCell(%s,%s,%s,%s,%s,%s)", popDecomp(),
- popDecomp(), popDecomp(), popDecomp(), popDecomp(),
- popDecomp());
+
+ case 0x16:
+ sprintf(tempbuffer, "Op_FreezeCell(%s,%s,%s,%s,%s,%s)", popDecomp(), popDecomp(),
+ popDecomp(), popDecomp(), popDecomp(), popDecomp());
pushDecomp(tempbuffer);
break;
- }
- case 0x17: {
- sprintf(tempbuffer, "_loadCtp(%s)", popDecomp());
+
+ case 0x17:
+ sprintf(tempbuffer, "Op_LoadCt(%s)", popDecomp());
pushDecomp(tempbuffer);
break;
- }
- case 0x18: {
- sprintf(tempbuffer,
- "_Op_AddAnimation(%s,%s,%s,%s,%s,%s,%s)",
- popDecomp(), popDecomp(), popDecomp(), popDecomp(),
- popDecomp(), popDecomp(), popDecomp());
+
+ case 0x18:
+ sprintf(tempbuffer, "Op_AddAnimation(%s,%s,%s,%s,%s,%s,%s)", popDecomp(), popDecomp(),
+ popDecomp(), popDecomp(), popDecomp(), popDecomp(), popDecomp());
pushDecomp(tempbuffer);
break;
- }
- case 0x19: {
- sprintf(tempbuffer, "_Op_RemoveAnimation(%s,%s,%s)",
- popDecomp(), popDecomp(), popDecomp());
+
+ case 0x19:
+ sprintf(tempbuffer, "Op_RemoveAnimation(%s,%s,%s)", popDecomp(), popDecomp(), popDecomp());
pushDecomp(tempbuffer);
break;
- }
- case 0x1A: {
- sprintf(tempbuffer, "_setupScaleFormula(%s,%s,%s,%s)",
- popDecomp(), popDecomp(), popDecomp(),
- popDecomp());
+
+ case 0x1A:
+ sprintf(tempbuffer, "Op_SetZoom(%s,%s,%s,%s)", popDecomp(), popDecomp(), popDecomp(), popDecomp());
pushDecomp(tempbuffer);
break;
- }
- case 0x1E: {
- sprintf(tempbuffer, "_Op_TrackAnim(%s,%s,%s,%s,%s,%s)",
- popDecomp(), popDecomp(), popDecomp(), popDecomp(),
- popDecomp(), popDecomp());
+
+ case 0x1E:
+ sprintf(tempbuffer, "Op_TrackAnim(%s,%s,%s,%s,%s,%s)", popDecomp(), popDecomp(),
+ popDecomp(), popDecomp(), popDecomp(), popDecomp());
pushDecomp(tempbuffer);
break;
- }
- case 0x21: {
- sprintf(tempbuffer, "_isActorLoaded(%s,%s,%s)",
- popDecomp(), popDecomp(), popDecomp());
+
+ case 0x21:
+ sprintf(tempbuffer, "Op_EndAnim(%s,%s,%s)", popDecomp(), popDecomp(), popDecomp());
pushDecomp(tempbuffer);
break;
- }
- case 0x22: {
- sprintf(tempbuffer, "_computeScale(%s)", popDecomp());
+
+ case 0x22:
+ sprintf(tempbuffer, "Op_GetZoom(%s)", popDecomp());
pushDecomp(tempbuffer);
break;
- }
- case 0x23: {
- sprintf(tempbuffer, "_convertToScale(%s,%s)",
- popDecomp(), popDecomp());
+
+ case 0x23:
+ sprintf(tempbuffer, "Op_GetStep(%s,%s)", popDecomp(), popDecomp());
pushDecomp(tempbuffer);
break;
- }
- case 0x24: {
- sprintf(tempbuffer, "_op_24(%s,%s,%s,%s)", popDecomp(),
- popDecomp(), popDecomp(), popDecomp());
+
+ case 0x24:
+ sprintf(tempbuffer, "Op_SetStringColors(%s,%s,%s,%s)", popDecomp(), popDecomp(),
+ popDecomp(), popDecomp());
pushDecomp(tempbuffer);
break;
- }
- case 0x27: {
- sprintf(tempbuffer, "_getWalkBoxCollision(%s,%s)",
- popDecomp(), popDecomp());
+
+ case 0x27:
+ sprintf(tempbuffer, "Op_getPixel(%s,%s)", popDecomp(), popDecomp());
pushDecomp(tempbuffer);
break;
- }
- case 0x28: {
- sprintf(tempbuffer, "_changeSaveAllowedState(%s)",
- popDecomp());
+
+ case 0x28:
+ sprintf(tempbuffer, "Op_UserOn(%s)", popDecomp());
pushDecomp(tempbuffer);
break;
- }
- case 0x29: {
- pushDecomp("_freeAllPerso()");
+
+ case 0x29:
+ pushDecomp("Op_FreeCT()");
break;
- }
- case 0x2B: {
- sprintf(tempbuffer, "_getProcIdx(%s,%s)", popDecomp(),
- popDecomp());
+
+ case 0x2B:
+ sprintf(tempbuffer, "Op_FindProc(%s,%s)", popDecomp(), popDecomp());
pushDecomp(tempbuffer);
break;
- }
- case 0x2C: {
- sprintf(tempbuffer, "_setObjectPosition(%s,%s,%s)",
- popDecomp(), popDecomp(), popDecomp());
+
+ case 0x2C:
+ sprintf(tempbuffer, "Op_WriteObject(%s,%s,%s)", popDecomp(), popDecomp(), popDecomp());
pushDecomp(tempbuffer);
break;
- }
- case 0x2E: {
- sprintf(tempbuffer, "_releaseScript(%s)", popDecomp());
+
+ case 0x2E:
+ sprintf(tempbuffer, "Op_RemoveOverlay(%s)", popDecomp());
pushDecomp(tempbuffer);
break;
- }
- case 0x2F: {
- sprintf(tempbuffer, "_addBackgroundIncrust(%s,%s,%s)",
- popDecomp(), popDecomp(), popDecomp());
+
+ case 0x2F:
+ sprintf(tempbuffer, "Op_AddBackgroundIncrust(%s,%s,%s)", popDecomp(), popDecomp(), popDecomp());
pushDecomp(tempbuffer);
break;
- }
+
case 0x30: {
sprintf(tempbuffer, "_removeBackgroundIncrust(%s,%s)",
popDecomp(), popDecomp());
@@ -1094,7 +1051,6 @@ int decompFunction() {
unsigned long int numArg = atoi(popDecomp());
char *ovlStr;
char *idxStr;
- int i;
char functionName[256];
idxStr = popDecomp();
@@ -1104,7 +1060,7 @@ int decompFunction() {
sprintf(tempbuffer, "%s(", functionName);
- for (i = 0; i < numArg; i++) {
+ for (int i = 0; i < numArg; i++) {
if (i)
strcatuint8(tempbuffer, ",");
strcatuint8(tempbuffer, popDecomp());
@@ -1174,14 +1130,13 @@ int decompFunction() {
unsigned long int numArg = atoi(popDecomp());
char *ovlStr;
char *idxStr;
- int i;
idxStr = popDecomp();
ovlStr = popDecomp();
sprintf(tempbuffer, "_op_6F(%s,%s", idxStr, ovlStr);
- for (i = 0; i < numArg; i++) {
+ for (int i = 0; i < numArg; i++) {
strcatuint8(tempbuffer, ",");
strcatuint8(tempbuffer, popDecomp());
}
@@ -1286,9 +1241,7 @@ int decompBreak() {
}
void generateIndentation() {
- int i, j;
-
- for (i = 0; i < positionInDecompileLineTable; i++) {
+ for (int i = 0; i < positionInDecompileLineTable; i++) {
if (decompileLineTable[i].type != 0) {
char *gotoStatement;
int destLine;
@@ -1302,7 +1255,7 @@ void generateIndentation() {
destLine = atoi(gotoStatement);
destLineIdx = -1;
- for (j = 0; j < positionInDecompileLineTable; j++) {
+ for (int j = 0; j < positionInDecompileLineTable; j++) {
if (decompileLineTable[j].lineOffset == destLine) {
destLineIdx = j;
break;
@@ -1312,7 +1265,7 @@ void generateIndentation() {
assert(destLineIdx != -1);
if (destLineIdx > i) {
- for (j = i + 1; j < destLineIdx; j++) {
+ for (int j = i + 1; j < destLineIdx; j++) {
decompileLineTable[j].indent++;
}
@@ -1328,7 +1281,6 @@ void generateIndentation() {
void dumpScript(uint8 *ovlName, ovlDataStruct *ovlData, int idx) {
uint8 opcodeType;
char buffer[256];
- int i;
char temp[256];
char scriptName[256];
@@ -1367,9 +1319,8 @@ void dumpScript(uint8 *ovlName, ovlDataStruct *ovlData, int idx) {
decompileStackPosition = 0;
- for (i = 0; i < 64; i++) {
+ for (int i = 0; i < 64; i++)
decompOpcodeTypeTable[i] = NULL;
- }
decompOpcodeTypeTable[1] = decompLoadVar;
decompOpcodeTypeTable[2] = decompSaveVar;
@@ -1412,22 +1363,18 @@ void dumpScript(uint8 *ovlName, ovlDataStruct *ovlData, int idx) {
generateIndentation();
- for (i = 0; i < positionInDecompileLineTable; i++) {
- int j;
-
+ for (int i = 0; i < positionInDecompileLineTable; i++) {
if (decompileLineTable[i].pendingElse) {
fprintf(fHandle, "%05d:\t",
decompileLineTable[i].lineOffset);
- fprintf(fHandle, "else", decompileLineTable[i].line);
- fprintf(fHandle, "\n");
+ fprintf(fHandle, "else %s\n", decompileLineTable[i].line);
}
fprintf(fHandle, "%05d:\t", decompileLineTable[i].lineOffset);
- for (j = 0; j < decompileLineTable[i].indent; j++) {
+ for (int j = 0; j < decompileLineTable[i].indent; j++)
fprintf(fHandle, "\t");
- }
- fprintf(fHandle, "%s", decompileLineTable[i].line);
- fprintf(fHandle, "\n");
+
+ fprintf(fHandle, "%s\n", decompileLineTable[i].line);
}
fclose(fHandle);
diff --git a/engines/cruise/delphine-unpack.cpp b/engines/cruise/delphine-unpack.cpp
index ee7dbd3c5e..84140fb896 100644
--- a/engines/cruise/delphine-unpack.cpp
+++ b/engines/cruise/delphine-unpack.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/cruise/detection.cpp b/engines/cruise/detection.cpp
index bce3f184db..4ca88a08d6 100644
--- a/engines/cruise/detection.cpp
+++ b/engines/cruise/detection.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -286,7 +286,7 @@ bool CruiseMetaEngine::createInstance(OSystem *syst, Engine **engine, const ADGa
#if PLUGIN_ENABLED_DYNAMIC(CRUISE)
-REGISTER_PLUGIN_DYNAMIC(CRUISE, PLUGIN_TYPE_ENGINE, CruiseMetaEngine);
+ REGISTER_PLUGIN_DYNAMIC(CRUISE, PLUGIN_TYPE_ENGINE, CruiseMetaEngine);
#else
-REGISTER_PLUGIN_STATIC(CRUISE, PLUGIN_TYPE_ENGINE, CruiseMetaEngine);
+ REGISTER_PLUGIN_STATIC(CRUISE, PLUGIN_TYPE_ENGINE, CruiseMetaEngine);
#endif
diff --git a/engines/cruise/font.cpp b/engines/cruise/font.cpp
index 2fd86a11b7..43fbf8c79b 100644
--- a/engines/cruise/font.cpp
+++ b/engines/cruise/font.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -50,7 +50,7 @@ int32 getLineHeight(int16 charCount, const FontEntry *fontPtr) {
}
/**
- * This function determins how many lines the text will have
+ * This function determines how many lines the text will have
*/
int32 getTextLineCount(int32 rightBorder_X, int16 wordSpacingWidth,
const FontEntry *fontData, const char *textString) {
@@ -59,6 +59,9 @@ int32 getTextLineCount(int32 rightBorder_X, int16 wordSpacingWidth,
uint8 ch;
int32 total = 0, lineLength = 0;
+ if (rightBorder_X == 0)
+ error("getTextLineCount() - invalid parameter");
+
if (!*textString)
return (0);
@@ -89,6 +92,7 @@ int32 getTextLineCount(int32 rightBorder_X, int16 wordSpacingWidth,
if (lineLength > 0)
total += rightBorder_X;
+
return (total / rightBorder_X);
}
@@ -148,8 +152,6 @@ void initSystem() {
preloadData[i].nofree = 0;
}
- lowMemory = 0;
-
doFade = 0;
fadeFlag = 0;
scroll = 0;
@@ -178,30 +180,26 @@ void bigEndianLongToNative(void *var) {
}
void flipGen(void *var, int32 length) {
- int i;
short int *varPtr = (int16 *) var;
- for (i = 0; i < (length / 2); i++) {
+ for (int i = 0; i < (length / 2); i++) {
bigEndianShortToNative(&varPtr[i]);
}
}
void renderWord(const uint8 *fontPtr_Data, uint8 *outBufferPtr, int xOffset, int yOffset,
int32 height, int32 param4, int32 stringRenderBufferSize, int32 width, int32 charWidth) {
- int i;
- int j;
const uint8 *fontPtr_Data2 = fontPtr_Data + height * 2;
-
outBufferPtr += yOffset * width + xOffset;
- for (i = 0; i < height; i++) { // y++
+ for (int i = 0; i < height; i++) { // y++
uint16 bitSet1 = READ_BE_UINT16(fontPtr_Data);
uint16 bitSet2 = READ_BE_UINT16(fontPtr_Data2);
fontPtr_Data += sizeof(uint16);
fontPtr_Data2 += sizeof(uint16);
- for (j = 0; j < charWidth; j++) {
+ for (int j = 0; j < charWidth; j++) {
*outBufferPtr = ((bitSet1 >> 15) & 1) | ((bitSet2 >> 14) & 2);
outBufferPtr++;
diff --git a/engines/cruise/font.h b/engines/cruise/font.h
index 679faf194d..12745c5b59 100644
--- a/engines/cruise/font.h
+++ b/engines/cruise/font.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/cruise/function.cpp b/engines/cruise/function.cpp
index 610465e962..3f794c4e70 100644
--- a/engines/cruise/function.cpp
+++ b/engines/cruise/function.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -87,9 +87,7 @@ int16 Op_Exec() {
int numOfArgToPop = popVar();
- int i = 0;
-
- for (i = 0; i < numOfArgToPop; i++) {
+ for (int i = 0; i < numOfArgToPop; i++) {
popTable[numOfArgToPop - i - 1] = popVar();
}
@@ -111,7 +109,7 @@ int16 Op_Exec() {
ptr2 = ptr;
- for (i = 0; i < numOfArgToPop; i++) {
+ for (int i = 0; i < numOfArgToPop; i++) {
WRITE_BE_UINT16(ptr2, popTable[i]);
ptr2 += 2;
}
@@ -198,13 +196,22 @@ int16 Op_Random() {
int16 Op_PlayFX() {
int volume = popVar();
+
+#if 0
int speed = popVar();
- /*int channelNum = */popVar();
+ int channelNum = popVar();
+#else
+ popVar();
+ popVar();
+#endif
+
int sampleNum = popVar();
if ((sampleNum >= 0) && (sampleNum < NUM_FILE_ENTRIES) && (filesDatabase[sampleNum].subData.ptr)) {
+#if 0
if (speed == -1)
speed = filesDatabase[sampleNum].subData.transparency;
+#endif
_vm->sound().playSound(filesDatabase[sampleNum].subData.ptr,
filesDatabase[sampleNum].width, volume);
@@ -215,13 +222,23 @@ int16 Op_PlayFX() {
int16 Op_LoopFX() {
int volume = popVar();
+
+#if 0
int speed = popVar();
- /*int channelNum = */popVar();
+ int channelNum = popVar();
+#else
+ popVar();
+ popVar();
+#endif
+
int sampleNum = popVar();
if ((sampleNum >= 0) && (sampleNum < NUM_FILE_ENTRIES) && (filesDatabase[sampleNum].subData.ptr)) {
+
+#if 0
if (speed == -1)
speed = filesDatabase[sampleNum].subData.transparency;
+#endif
_vm->sound().playSound(filesDatabase[sampleNum].subData.ptr,
filesDatabase[sampleNum].width, volume);
@@ -335,20 +352,15 @@ int16 Op_RemoveMessage() {
}
int16 Op_FindSet() {
- int16 i;
- char name[36] = "";
- char *ptr;
-
- ptr = (char *) popPtr();
-
- if (!ptr) {
+ char *ptr = (char *) popPtr();
+ if (!ptr)
return -1;
- }
- strcpy(name, ptr);
+ char name[36] = "";
+ Common::strlcpy(name, ptr, sizeof(name));
strToUpper(name);
- for (i = 0; i < NUM_FILE_ENTRIES; i++) {
+ for (int i = 0; i < NUM_FILE_ENTRIES; i++) {
if (!strcmp(name, filesDatabase[i].subData.name)) {
return (i);
}
@@ -397,8 +409,7 @@ int16 Op_FreeOverlay() {
char *namePtr;
namePtr = (char *) popPtr();
-
- strcpy(localName, namePtr);
+ Common::strlcpy(localName, namePtr, sizeof(localName));
if (localName[0]) {
strToUpper(localName);
@@ -410,14 +421,10 @@ int16 Op_FreeOverlay() {
int16 Op_FindProc() {
char name[36] = "";
- char *ptr;
- int param;
-
- ptr = (char *)popPtr();
- strcpy(name, ptr);
-
- param = getProcParam(popVar(), 20, name);
+ char *ptr = (char *)popPtr();
+ Common::strlcpy(name, ptr, sizeof(name));
+ int param = getProcParam(popVar(), 20, name);
return param;
}
@@ -497,7 +504,7 @@ int16 Op_LoadBackground() {
ptr = (char *) popPtr();
- strcpy(bgName, ptr);
+ Common::strlcpy(bgName, ptr, sizeof(bgName));
bgIdx = popVar();
@@ -537,12 +544,10 @@ int16 Op_LoadFrame() {
int param1;
int param2;
int param3;
- char name[36] = "";
- char *ptr;
-
- ptr = (char *) popPtr();
- strcpy(name, ptr);
+ char name[36] = "";
+ char *ptr = (char *) popPtr();
+ Common::strlcpy(name, ptr, sizeof(name));
param1 = popVar();
param2 = popVar();
@@ -566,16 +571,14 @@ int16 Op_LoadFrame() {
}
int16 Op_LoadAbs() {
- int slot;
- char name[36] = "";
- char *ptr;
int result = 0;
- ptr = (char *) popPtr();
- slot = popVar();
+ char *ptr = (char *) popPtr();
+ int slot = popVar();
if ((slot >= 0) && (slot < NUM_FILE_ENTRIES)) {
- strcpy(name, ptr);
+ char name[36] = "";
+ Common::strlcpy(name, ptr, sizeof(name));
strToUpper(name);
gfxModuleData_gfxWaitVSync();
@@ -606,7 +609,7 @@ int16 Op_InitializeState() {
}
int16 Op_GetlowMemory() {
- return lowMemory;
+ return 0;
}
int16 Op_AniDir() {
@@ -641,7 +644,7 @@ int16 Op_FadeOut() {
flip();
fadeFlag = 1;
- PCFadeFlag = 1;
+ PCFadeFlag = true;
return 0;
}
@@ -663,8 +666,7 @@ int16 Op_FindOverlay() {
char *ptr;
ptr = (char *) popPtr();
-
- strcpy(name, ptr);
+ Common::strlcpy(name, ptr, sizeof(name));
strToUpper(name);
return (isOverlayLoaded(name));
@@ -996,11 +998,9 @@ int16 Op_SetColor() {
int endIdx = popVar();
int startIdx = popVar();
- int i;
-
#define convertRatio 36.571428571428571428571428571429
- for (i = startIdx; i <= endIdx; i++) {
+ for (int i = startIdx; i <= endIdx; i++) {
int offsetTable[3];
offsetTable[0] = (int)(colorR * convertRatio);
@@ -1099,11 +1099,6 @@ actorStruct *addAnimation(actorStruct * pHead, int overlay, int objIdx, int para
pCurrent = pPrevious->next;
}
- if (pCurrent && (pCurrent->overlayNumber == overlay)
- && (pCurrent->idx == objIdx) && (pCurrent->type == param2)) {
- return NULL;
- }
-
actorStruct *pNewElement = (actorStruct *) MemAlloc(sizeof(actorStruct));
if (!pNewElement)
return NULL;
@@ -1353,7 +1348,7 @@ int16 Op_LoadSong() {
const char *ptr = (const char *)popPtr();
char buffer[33];
- strcpy(buffer, ptr);
+ Common::strlcpy(buffer, ptr, sizeof(buffer));
strToUpper(buffer);
_vm->sound().loadMusic(buffer);
@@ -1382,12 +1377,11 @@ int16 Op_RestoreSong() {
}
int16 Op_SongSize() {
- int size, oldSize;
-
+ int oldSize;
if (_vm->sound().songLoaded()) {
oldSize = _vm->sound().numOrders();
- size = popVar();
+ int size = popVar();
if ((size >= 1) && (size < 128))
_vm->sound().setNumOrders(size);
} else
@@ -1517,8 +1511,9 @@ int16 Op_Itoa() {
int nbp = popVar();
int param[160];
char txt[40];
- char format[30];
- char nbf[20];
+
+ for (int i = 0; i < 160; ++i)
+ param[i] = 0;
for (int i = nbp - 1; i >= 0; i--)
param[i] = popVar();
@@ -1529,6 +1524,8 @@ int16 Op_Itoa() {
if (!nbp)
sprintf(txt, "%d", val);
else {
+ char format[30];
+ char nbf[20];
strcpy(format, "%");
sprintf(nbf, "%d", param[0]);
strcat(format, nbf);
@@ -1576,7 +1573,7 @@ int16 Op_FindObject() {
var_26[0] = 0;
if (ptr) {
- strcpy(var_26, ptr);
+ Common::strlcpy(var_26, ptr, sizeof(var_26));
}
overlayIdx = popVar();
@@ -1614,7 +1611,7 @@ int16 Op_GetNodeX() {
int result = getNode(nodeInfo, node);
- ASSERT(result == 0);
+ assert(result == 0);
return nodeInfo[0];
}
@@ -1626,7 +1623,7 @@ int16 Op_GetNodeY() {
int result = getNode(nodeInfo, node);
- ASSERT(result == 0);
+ assert(result == 0);
return nodeInfo[1];
}
@@ -1649,7 +1646,7 @@ int16 Op_SongExist() {
if (songName) {
char name[33];
- strcpy(name, songName);
+ Common::strlcpy(name, songName, sizeof(name));
strToUpper(name);
if (!strcmp(_vm->sound().musicName(), name))
@@ -1835,7 +1832,7 @@ int16 Op_ThemeReset() {
}
int16 Op_UserWait() {
- userWait = 1;
+ userWait = true;
if (currentScriptPtr->type == scriptType_PROC) {
changeScriptParamInList(currentScriptPtr->overlayNumber, currentScriptPtr->scriptNumber, &procHead, -1, 9999);
} else if (currentScriptPtr->type == scriptType_REL) {
diff --git a/engines/cruise/function.h b/engines/cruise/function.h
index 4fba8d3c63..39e7e22506 100644
--- a/engines/cruise/function.h
+++ b/engines/cruise/function.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/cruise/gfxModule.cpp b/engines/cruise/gfxModule.cpp
index aa2dbc5370..9fd94d7ea6 100644
--- a/engines/cruise/gfxModule.cpp
+++ b/engines/cruise/gfxModule.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -121,12 +121,10 @@ void gfxModuleData_setPalColor(int idx, int r, int g, int b) {
}
void gfxModuleData_setPalEntries(const byte *ptr, int start, int num) {
- int R, G, B, i;
-
- for (i = start; i < start + num; i++) {
- R = *(ptr++);
- G = *(ptr++);
- B = *(ptr++);
+ for (int i = start; i < start + num; i++) {
+ int R = *(ptr++);
+ int G = *(ptr++);
+ int B = *(ptr++);
lpalette[i].R = R;
lpalette[i].G = G;
@@ -142,12 +140,11 @@ void gfxModuleData_setPal256(const byte *ptr) {
}
/*void gfxModuleData_setPal(uint8 *ptr) {
- int i;
int R;
int G;
int B;
- for (i = 0; i < 256; i++) {
+ for (int i = 0; i < 256; i++) {
#define convertRatio 36.571428571428571428571428571429
uint16 atariColor = *ptr;
//bigEndianShortToNative(&atariColor);
@@ -340,7 +337,6 @@ void resetBitmap(uint8 *dataPtr, int32 dataSize) {
*/
void switchBackground(const byte *newBg) {
const byte *bg = gfxModuleData.pPage00;
- int sliceXStart, sliceXEnd;
// If both the upper corners are different, presume it's a full screen change
if ((*newBg != *bg) && (*(newBg + 319) != *(bg + 319))) {
@@ -353,7 +349,8 @@ void switchBackground(const byte *newBg) {
*/
for (int yp = 0; yp < 200; ++yp) {
- sliceXStart = -1; sliceXEnd = -1;
+ int sliceXStart = -1;
+ int sliceXEnd = -1;
for (int xp = 0; xp < 320; ++xp, ++bg, ++newBg) {
if (*bg != *newBg) {
if (sliceXStart == -1) {
diff --git a/engines/cruise/gfxModule.h b/engines/cruise/gfxModule.h
index ce58c65d34..a394ccfe97 100644
--- a/engines/cruise/gfxModule.h
+++ b/engines/cruise/gfxModule.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/cruise/linker.cpp b/engines/cruise/linker.cpp
index e8ef415fe7..9786de775f 100644
--- a/engines/cruise/linker.cpp
+++ b/engines/cruise/linker.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -35,23 +35,22 @@ exportEntryStruct *parseExport(int *out1, int *pExportedFuncionIdx, char *buffer
int numSymbGlob;
exportEntryStruct *currentExportEntry;
char *entity1Name;
- int i;
*out1 = 0;
*pExportedFuncionIdx = 0;
- strcpy(localBuffer, buffer);
+ Common::strlcpy(localBuffer, buffer, sizeof(localBuffer));
dotPtr = strchr(localBuffer, '.');
if (dotPtr) {
- strcpy(functionName, dotPtr + 1);
+ Common::strlcpy(functionName, dotPtr + 1, sizeof(functionName));
*dotPtr = 0;
strcpy(overlayName, localBuffer);
} else {
overlayName[0] = 0;
- strcpy(functionName, buffer);
+ Common::strlcpy(functionName, buffer, sizeof(functionName));
}
ptr2 = strchr((char *)functionName, ':');
@@ -85,11 +84,11 @@ exportEntryStruct *parseExport(int *out1, int *pExportedFuncionIdx, char *buffer
if (!entity1Name)
return (0);
- for (i = 0; i < numSymbGlob; i++) {
+ for (int i = 0; i < numSymbGlob; i++) {
char exportedName[256];
char *name = entity1Name + currentExportEntry->offsetToName;
- strcpy(exportedName, name);
+ Common::strlcpy(exportedName, name, sizeof(exportedName));
strToUpper(exportedName);
if (!strcmp(functionName, exportedName)) {
@@ -130,8 +129,6 @@ int updateScriptImport(int ovlIdx) {
// do it for the 2 first string types
do {
- int i = 0;
-
if (param == 0) {
var_32 = numData3;
} else {
@@ -139,16 +136,16 @@ int updateScriptImport(int ovlIdx) {
}
if (var_32) {
+ int i = 0;
do {
importScriptStruct *ptrImportData;
const char *ptrImportName;
uint8 *ptrData;
- if (param == 0) {
+ if (param == 0)
pScript = getOvlData3Entry(ovlIdx, i);
- } else {
+ else
pScript = scriptFunc1Sub2(ovlIdx, i);
- }
ptrImportData = (importScriptStruct *)(pScript->dataPtr + pScript->offsetToImportData); // import data
ptrImportName = (const char*)(pScript->dataPtr + pScript->offsetToImportName); // import name
@@ -165,7 +162,7 @@ int updateScriptImport(int ovlIdx) {
int out1;
int out2;
- strcpy(buffer, ptrImportName + ptrImportData->offsetToName);
+ Common::strlcpy(buffer, ptrImportName + ptrImportData->offsetToName, sizeof(buffer));
ptrDest2 = parseExport(&out1, &out2, buffer);
if (ptrDest2 && out2) {
@@ -221,16 +218,14 @@ int updateScriptImport(int ovlIdx) {
if (ovlData->arrayRelocGlob && ovlData->arrayNameRelocGlob && numRelocGlob) {
int numImport2 = numRelocGlob;
- int i;
-
- for (i = 0; i < numImport2; i++) {
+ for (int i = 0; i < numImport2; i++) {
int out1;
int foundExportIdx;
exportEntryStruct *pFoundExport;
int linkType;
int linkEntryIdx;
- strcpy(buffer, ovlData->arrayNameRelocGlob + ovlData->arrayRelocGlob[i].nameOffset);
+ Common::strlcpy(buffer, ovlData->arrayNameRelocGlob + ovlData->arrayRelocGlob[i].nameOffset, sizeof(buffer));
pFoundExport = parseExport(&out1, &foundExportIdx, buffer);
@@ -264,12 +259,9 @@ int updateScriptImport(int ovlIdx) {
// check that the newly loaded isn't used by the already loaded overlays
void updateAllScriptsImports() {
- int i;
-
- for (i = 0; i < 90; i++) {
- if (overlayTable[i].ovlData && overlayTable[i].alreadyLoaded) {
+ for (int i = 0; i < 90; i++) {
+ if (overlayTable[i].ovlData && overlayTable[i].alreadyLoaded)
updateScriptImport(i);
- }
}
}
diff --git a/engines/cruise/linker.h b/engines/cruise/linker.h
index 25f4a5cc2a..85f65348f4 100644
--- a/engines/cruise/linker.h
+++ b/engines/cruise/linker.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/cruise/mainDraw.cpp b/engines/cruise/mainDraw.cpp
index 24f65500db..5777b846b4 100644
--- a/engines/cruise/mainDraw.cpp
+++ b/engines/cruise/mainDraw.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -120,7 +120,7 @@ void fadeIn() {
gfxModuleData_setPal256(workpal);
fadeFlag = 0;
- PCFadeFlag = 0;
+ PCFadeFlag = false;
}
void flipScreen() {
@@ -479,10 +479,7 @@ void buildSegment() {
// swap again ?
SWAP(X1, X2);
- int patchAdd = 2;
-
int dy = Y2 - Y1;
-
if (dy == 0) {
// hline
int16* ptr = (Y1 - ydep) * 2 + XMIN_XMAX + 1;
@@ -503,6 +500,8 @@ void buildSegment() {
ptr[1] = SI;
}
} else {
+ int patchAdd = 2;
+
if (dy < 0) {
dy = -dy;
patchAdd = -2;
@@ -721,7 +720,6 @@ void buildPolyModel(int positionX, int positionY, int scale, char *pMask, char *
int startX = 0; // first X in model
int startY = 0; // first Y in model
int x = 0; // current X
- int y = 0; // current Y
int offsetXinModel = 0; // offset of the X value in the model
int offsetYinModel = 0; // offset of the Y value in the model
unsigned char *dataPointer = (unsigned char *)dataPtr;
@@ -761,9 +759,8 @@ void buildPolyModel(int positionX, int positionY, int scale, char *pMask, char *
startY >>= 1;
}
- if (m_flipLeftRight) {
+ if (m_flipLeftRight)
startX = -startX;
- }
/*
* NOTE:
@@ -796,7 +793,7 @@ void buildPolyModel(int positionX, int positionY, int scale, char *pMask, char *
ptrPoly_1_Buf++;
offsetXinModel = x;
- y = *(dataPointer) - m_first_Y;
+ int y = *(dataPointer) - m_first_Y;
dataPointer++;
if (m_useSmallScale) {
y >>= 1;
@@ -881,7 +878,6 @@ bool findPoly(char* dataPtr, int positionX, int positionY, int scale, int mouseX
int startX = 0; // first X in model
int startY = 0; // first Y in model
int x = 0; // current X
- int y = 0; // current Y
int offsetXinModel = 0; // offset of the X value in the model
int offsetYinModel = 0; // offset of the Y value in the model
unsigned char *dataPointer = (unsigned char *)dataPtr;
@@ -955,11 +951,11 @@ bool findPoly(char* dataPtr, int positionX, int positionY, int scale, int mouseX
ptrPoly_1_Buf++;
offsetXinModel = x;
- y = *(dataPointer) - m_first_Y;
+ int y = *(dataPointer) - m_first_Y;
dataPointer++;
- if (m_useSmallScale) {
+ if (m_useSmallScale)
y >>= 1;
- }
+
ptrPoly_1_Buf[0] = -(offsetYinModel - y);
ptrPoly_1_Buf++;
offsetYinModel = y;
@@ -1150,10 +1146,6 @@ void drawMessage(const gfxEntryStruct *pGfxPtr, int globalX, int globalY, int wi
// this is used for font only
if (pGfxPtr) {
- uint8 *initialOuput;
- uint8 *output;
- int xp, yp;
- int x, y;
const uint8 *ptr = pGfxPtr->imagePtr;
int height = pGfxPtr->height;
@@ -1172,14 +1164,14 @@ void drawMessage(const gfxEntryStruct *pGfxPtr, int globalX, int globalY, int wi
gfxModuleData_addDirtyRect(Common::Rect(globalX, globalY, globalX + width, globalY + height));
- initialOuput = ouputPtr + (globalY * 320) + globalX;
+ uint8 *initialOuput = ouputPtr + (globalY * 320) + globalX;
- for (yp = 0; yp < height; yp++) {
- output = initialOuput + 320 * yp;
- y = globalY + yp;
+ for (int yp = 0; yp < height; yp++) {
+ uint8 *output = initialOuput + 320 * yp;
+ int y = globalY + yp;
- for (xp = 0; xp < pGfxPtr->width; xp++) {
- x = globalX + xp;
+ for (int xp = 0; xp < pGfxPtr->width; xp++) {
+ int x = globalX + xp;
uint8 color = *(ptr++);
if (color) {
@@ -1255,18 +1247,15 @@ void drawSprite(int width, int height, cellStruct *currentObjPtr, const uint8 *d
#ifdef _DEBUG
void drawCtp() {
- /* int i;
-
- if (ctp_walkboxTable) {
- for (i = 0; i < 15; i++) {
+ /* if (ctp_walkboxTable) {
+ for (int i = 0; i < 15; i++) {
uint16 *dataPtr = &ctp_walkboxTable[i * 40];
int type = walkboxColor[i]; // show different types in different colors
if (*dataPtr) {
- int j;
fillpoly((short *)dataPtr + 1, *dataPtr, type);
- for (j = 0; j < (*dataPtr - 1); j++) {
+ for (int j = 0; j < (*dataPtr - 1); j++) {
line(dataPtr[1 + j * 2],
dataPtr[1 + j * 2 + 1],
dataPtr[1 + (j + 1) * 2],
@@ -1388,7 +1377,7 @@ int getValueFromObjectQuerry(objectParamsQuery *params, int idx) {
return 0;
}
-void mainDraw(int16 param) {
+void mainDraw(bool waitFl) {
uint8 *bgPtr;
cellStruct *currentObjPtr;
int16 currentObjIdx;
@@ -1472,7 +1461,7 @@ void mainDraw(int16 param) {
}
// automatic animation process
- if (currentObjPtr->animStep && !param) {
+ if (currentObjPtr->animStep && !waitFl) {
if (currentObjPtr->animCounter <= 0) {
bool change = true;
diff --git a/engines/cruise/mainDraw.h b/engines/cruise/mainDraw.h
index bb21f515af..1af403fca5 100644
--- a/engines/cruise/mainDraw.h
+++ b/engines/cruise/mainDraw.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -33,7 +33,7 @@ extern int m_color;
int upscaleValue(int value, int scale);
void pixel(int x, int y, char color);
-void mainDraw(int16 param);
+void mainDraw(bool waitFl);
void flipScreen();
void buildPolyModel(int X, int Y, int scale, char *ptr2, char *destBuffer, char *dataPtr);
void drawSprite(int width, int height, cellStruct *currentObjPtr, const uint8 *dataIn, int ys, int xs, uint8 *output, const uint8 *dataBuf);
diff --git a/engines/cruise/menu.cpp b/engines/cruise/menu.cpp
index 512259f7d7..cf0b872646 100644
--- a/engines/cruise/menu.cpp
+++ b/engines/cruise/menu.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -39,7 +39,7 @@ menuStruct *createMenu(int X, int Y, const char *menuName) {
menuStruct *entry;
entry = (menuStruct *) MemAlloc(sizeof(menuStruct));
- ASSERT(entry);
+ assert(entry);
entry->x = X - 160 / 2;
entry->y = Y;
@@ -69,7 +69,7 @@ void addSelectableMenuEntry(int ovlIdx, int headerIdx, menuStruct *pMenu, int pa
if (!strcmp(var_6->string, menuText)) {
pNewElement = var_6;
pSubStruct = (menuElementSubStruct *)allocAndZero(sizeof(menuElementSubStruct));
- ASSERT(pSubStruct);
+ assert(pSubStruct);
pSubStruct->pNext = NULL;
pSubStruct->ovlIdx = ovlIdx;
@@ -99,9 +99,9 @@ void addSelectableMenuEntry(int ovlIdx, int headerIdx, menuStruct *pMenu, int pa
}
pNewElement = (menuElementStruct *)allocAndZero(sizeof(menuElementStruct));
- ASSERT(pNewElement);
+ assert(pNewElement);
pSubStruct = (menuElementSubStruct *)allocAndZero(sizeof(menuElementSubStruct));
- ASSERT(pSubStruct);
+ assert(pSubStruct);
pNewElement->string = menuText;
pNewElement->next = NULL;
@@ -160,7 +160,7 @@ int processMenu(menuStruct *pMenu) {
int si;
currentActiveMenu = 0;
- mainDraw(1);
+ mainDraw(true);
flipScreen();
di = 0;
@@ -179,7 +179,7 @@ int processMenu(menuStruct *pMenu) {
di = 1;
}
- mainDraw(1);
+ mainDraw(true);
flipScreen();
manageEvents();
@@ -190,7 +190,7 @@ int processMenu(menuStruct *pMenu) {
currentActiveMenu = -1;
- mainDraw(1);
+ mainDraw(true);
flipScreen();
if (mouseButton & 1) {
@@ -233,7 +233,6 @@ static void handleSaveLoad(bool saveFlag) {
}
int playerMenu(int menuX, int menuY) {
- int retourMenu;
//int restartGame = 0;
if (playerMenuEnabled && displayOn) {
@@ -267,7 +266,7 @@ int playerMenu(int menuX, int menuY) {
freeDisk();
menuTable[0] = createMenu(menuX, menuY, _vm->langString(ID_PLAYER_MENU));
- ASSERT(menuTable[0]);
+ assert(menuTable[0]);
//addSelectableMenuEntry(0, 3, menuTable[0], 1, -1, "Save game disk");
if (userEnabled) {
@@ -277,7 +276,7 @@ int playerMenu(int menuX, int menuY) {
addSelectableMenuEntry(0, 6, menuTable[0], 1, -1, _vm->langString(ID_RESTART));
addSelectableMenuEntry(0, 7, menuTable[0], 1, -1, _vm->langString(ID_QUIT));
- retourMenu = processMenu(menuTable[0]);
+ int retourMenu = processMenu(menuTable[0]);
freeMenu(menuTable[0]);
menuTable[0] = NULL;
diff --git a/engines/cruise/menu.h b/engines/cruise/menu.h
index d605903cdc..c6f607506e 100644
--- a/engines/cruise/menu.h
+++ b/engines/cruise/menu.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/cruise/mouse.cpp b/engines/cruise/mouse.cpp
index 6248bd01d3..9e01044bb0 100644
--- a/engines/cruise/mouse.cpp
+++ b/engines/cruise/mouse.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/cruise/mouse.h b/engines/cruise/mouse.h
index a5f5c19073..4407718168 100644
--- a/engines/cruise/mouse.h
+++ b/engines/cruise/mouse.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/cruise/object.cpp b/engines/cruise/object.cpp
index b4a3489c1d..845fc34d1f 100644
--- a/engines/cruise/object.cpp
+++ b/engines/cruise/object.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -116,14 +116,10 @@ int16 getMultipleObjectParam(int16 overlayIdx, int16 objectIdx, objectParamsQuer
}
void setObjectPosition(int16 ovlIdx, int16 objIdx, int16 param3, int16 param4) {
- objDataStruct *ptr;
- objectParams *ptr2;
-
- ptr = getObjectDataFromOverlay(ovlIdx, objIdx);
-
- if (!ptr) {
+ objDataStruct *ptr = getObjectDataFromOverlay(ovlIdx, objIdx);
+ if (!ptr)
return;
- }
+
//overlayTable[param1].ovlData
switch (ptr->_class) {
@@ -138,7 +134,7 @@ void setObjectPosition(int16 ovlIdx, int16 objIdx, int16 param3, int16 param4) {
case UNIQUE:
return;
case VARIABLE: {
- ptr2 = &overlayTable[ovlIdx].ovlData->arrayObjVar[ptr->_varTableIdx];
+ objectParams *ptr2 = &overlayTable[ovlIdx].ovlData->arrayObjVar[ptr->_varTableIdx];
switch (param3) {
case 0: { // x
@@ -167,14 +163,14 @@ void setObjectPosition(int16 ovlIdx, int16 objIdx, int16 param3, int16 param4) {
break;
}
default: {
- ASSERT(0);
+ assert(0);
}
}
break;
}
default: {
- ASSERT(0);
+ assert(0);
}
}
}
diff --git a/engines/cruise/object.h b/engines/cruise/object.h
index cbe5872a9d..954bed0687 100644
--- a/engines/cruise/object.h
+++ b/engines/cruise/object.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/cruise/overlay.cpp b/engines/cruise/overlay.cpp
index d618ab5599..f7df741892 100644
--- a/engines/cruise/overlay.cpp
+++ b/engines/cruise/overlay.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -32,9 +32,7 @@ overlayStruct overlayTable[90];
int numOfLoadedOverlay;
void initOverlayTable() {
- int i;
-
- for (i = 0; i < 90; i++) {
+ for (int i = 0; i < 90; i++) {
overlayTable[i].overlayName[0] = 0;
overlayTable[i].ovlData = NULL;
overlayTable[i].alreadyLoaded = 0;
@@ -53,7 +51,6 @@ void freeOverlayTable() {
int freeOverlay(int overlayIdx) {
ovlDataStruct *ovlDataPtr;
- int i;
if (overlayTable[overlayIdx].alreadyLoaded == 0)
return -4;
@@ -65,7 +62,6 @@ int freeOverlay(int overlayIdx) {
if (!ovlDataPtr)
return -4;
-
/*
if (overlayTable[overlayIdx].var1E) {
MemFree(overlayTable[overlayIdx].var1E);
@@ -84,19 +80,19 @@ int freeOverlay(int overlayIdx) {
removeScript(overlayIdx, -1, &relHead);
if (ovlDataPtr->stringTable) {
- for (i = 0; i < ovlDataPtr->numStrings; ++i)
+ for (int i = 0; i < ovlDataPtr->numStrings; ++i)
MemFree(ovlDataPtr->stringTable[i].string);
MemFree(ovlDataPtr->stringTable);
}
if (ovlDataPtr->arrayProc) {
ovlData3Struct *tempPtr = ovlDataPtr->arrayProc;
- for (i = 0; i < ovlDataPtr->numProc; ++i, ++tempPtr)
+ for (int i = 0; i < ovlDataPtr->numProc; ++i, ++tempPtr)
MemFree(tempPtr->dataPtr);
MemFree(ovlDataPtr->arrayProc);
}
if (ovlDataPtr->ptr1) {
ovlData3Struct *tempPtr = (ovlData3Struct *)ovlDataPtr->ptr1;
- for (i = 0; i < ovlDataPtr->numRel; ++i, ++tempPtr)
+ for (int i = 0; i < ovlDataPtr->numRel; ++i, ++tempPtr)
MemFree(tempPtr->dataPtr);
MemFree(ovlDataPtr->ptr1);
}
@@ -159,7 +155,7 @@ int loadOverlay(const char *scriptName) {
return (-2);
if (scriptName != overlayTable[scriptIdx].overlayName)
- strcpy(overlayTable[scriptIdx].overlayName, scriptName);
+ Common::strlcpy(overlayTable[scriptIdx].overlayName, scriptName, sizeof(overlayTable[scriptIdx].overlayName));
overlayTable[scriptIdx].alreadyLoaded = 1;
@@ -167,9 +163,8 @@ int loadOverlay(const char *scriptName) {
overlayTable[scriptIdx].ovlData->scriptNumber = scriptIdx;
- strcpy(fileName, scriptName);
-
- strcat(fileName, ".OVL");
+ Common::strlcpy(fileName, scriptName, sizeof(fileName));
+ Common::strlcat(fileName, ".OVL", sizeof(fileName));
debug(1, "Attempting to load overlay file %s...", fileName);
@@ -247,15 +242,13 @@ int loadOverlay(const char *scriptName) {
ovlData->scriptNumber = s.readUint16BE();
if (ovlData->numSymbGlob) { // export data
- int i;
ovlData->arraySymbGlob =
(exportEntryStruct *) mallocAndZero(ovlData->numSymbGlob * sizeof(exportEntryStruct));
- if (!ovlData->arraySymbGlob) {
+ if (!ovlData->arraySymbGlob)
return (-2);
- }
- for (i = 0; i < ovlData->numSymbGlob; i++) {
+ for (int i = 0; i < ovlData->numSymbGlob; i++) {
ovlData->arraySymbGlob[i].var0 = s.readUint16BE();
ovlData->arraySymbGlob[i].var2 = s.readUint16BE();
ovlData->arraySymbGlob[i].var4 = s.readUint16BE();
@@ -275,17 +268,14 @@ int loadOverlay(const char *scriptName) {
}
if (ovlData->numRelocGlob) { // import data
- int i;
-
ovlData->arrayRelocGlob =
(importDataStruct *) mallocAndZero(ovlData->numRelocGlob *
sizeof(importDataStruct));
- if (!ovlData->arrayRelocGlob) {
+ if (!ovlData->arrayRelocGlob)
return (-2);
- }
- for (i = 0; i < ovlData->numRelocGlob; i++) {
+ for (int i = 0; i < ovlData->numRelocGlob; i++) {
ovlData->arrayRelocGlob[i].var0 = s.readUint16BE();
ovlData->arrayRelocGlob[i].var1 = s.readUint16BE();
ovlData->arrayRelocGlob[i].linkType = s.readUint16BE();
@@ -305,16 +295,14 @@ int loadOverlay(const char *scriptName) {
}
if (ovlData->numMsgRelHeader) { // link data
- int i;
- ASSERT(sizeof(linkDataStruct) == 0x22);
+ assert(sizeof(linkDataStruct) == 0x22);
ovlData->arrayMsgRelHeader = (linkDataStruct *) mallocAndZero(ovlData->numMsgRelHeader * sizeof(linkDataStruct));
- if (!ovlData->arrayMsgRelHeader) {
+ if (!ovlData->arrayMsgRelHeader)
return (-2);
- }
- for (i = 0; i < ovlData->numMsgRelHeader; i++) {
+ for (int i = 0; i < ovlData->numMsgRelHeader; i++) {
ovlData->arrayMsgRelHeader[i].type = s.readUint16BE();
ovlData->arrayMsgRelHeader[i].id = s.readUint16BE();
ovlData->arrayMsgRelHeader[i].offsetVerbeName = s.readUint16BE();
@@ -342,16 +330,13 @@ int loadOverlay(const char *scriptName) {
if (ovlData->numProc) { // script
ovlData3Struct *tempPtr;
- int i;
- ovlData->arrayProc =
- (ovlData3Struct *) mallocAndZero(ovlData->numProc * sizeof(ovlData3Struct));
+ ovlData->arrayProc = (ovlData3Struct *) mallocAndZero(ovlData->numProc * sizeof(ovlData3Struct));
- if (!ovlData->arrayProc) {
+ if (!ovlData->arrayProc)
return (-2);
- }
- for (i = 0; i < ovlData->numProc; i++) {
+ for (int i = 0; i < ovlData->numProc; i++) {
s.skip(4);
ovlData->arrayProc[i].dataPtr = NULL;
ovlData->arrayProc[i].sizeOfData = s.readUint16BE();
@@ -370,7 +355,7 @@ int loadOverlay(const char *scriptName) {
tempPtr = ovlData->arrayProc;
- for (i = 0; i < ovlData->numProc; i++) {
+ for (int i = 0; i < ovlData->numProc; i++) {
tempPtr->dataPtr = (uint8 *) mallocAndZero(tempPtr->sizeOfData);
if (!tempPtr->dataPtr) {
@@ -395,16 +380,13 @@ int loadOverlay(const char *scriptName) {
if (ovlData->numRel) {
ovlData3Struct *tempPtr;
- int i;
- ovlData->ptr1 =
- (ovlData3Struct *) mallocAndZero(ovlData->numRel * sizeof(ovlData3Struct));
+ ovlData->ptr1 = (ovlData3Struct *) mallocAndZero(ovlData->numRel * sizeof(ovlData3Struct));
- if (!ovlData->ptr1) {
+ if (!ovlData->ptr1)
return (-2);
- }
- for (i = 0; i < ovlData->numRel; i++) {
+ for (int i = 0; i < ovlData->numRel; i++) {
s.skip(4);
ovlData->ptr1[i].dataPtr = NULL;
ovlData->ptr1[i].sizeOfData = s.readUint16BE();
@@ -423,12 +405,11 @@ int loadOverlay(const char *scriptName) {
tempPtr = (ovlData3Struct *) ovlData->ptr1;
- for (i = 0; i < ovlData->numRel; i++) {
+ for (int i = 0; i < ovlData->numRel; i++) {
tempPtr->dataPtr = (uint8 *) mallocAndZero(tempPtr->sizeOfData);
- if (!tempPtr->dataPtr) {
+ if (!tempPtr->dataPtr)
return (-2);
- }
s.read(tempPtr->dataPtr, tempPtr->sizeOfData);
@@ -463,16 +444,12 @@ int loadOverlay(const char *scriptName) {
}
if (ovlData->numObj) {
- int i;
- ovlData->arrayObject =
- (objDataStruct *) mallocAndZero(ovlData->numObj *
- sizeof(objDataStruct));
+ ovlData->arrayObject = (objDataStruct *) mallocAndZero(ovlData->numObj * sizeof(objDataStruct));
- if (!ovlData->arrayObject) {
+ if (!ovlData->arrayObject)
return (-2);
- }
- for (i = 0; i < ovlData->numObj; i++) {
+ for (int i = 0; i < ovlData->numObj; i++) {
ovlData->arrayObject[i]._type = s.readUint16BE();
ovlData->arrayObject[i]._class = (eClass) s.readUint16BE();
ovlData->arrayObject[i]._nameOffset = s.readUint16BE();
@@ -501,16 +478,12 @@ int loadOverlay(const char *scriptName) {
}
if (ovlData->size8) {
- int i;
- ovlData->arrayStates =
- (objectParams *) mallocAndZero(ovlData->size8 *
- sizeof(objectParams));
+ ovlData->arrayStates = (objectParams *) mallocAndZero(ovlData->size8 * sizeof(objectParams));
- if (!ovlData->arrayStates) {
+ if (!ovlData->arrayStates)
return (-2);
- }
- for (i = 0; i < ovlData->size8; i++) {
+ for (int i = 0; i < ovlData->size8; i++) {
ovlData->arrayStates[i].X = s.readUint16BE();
ovlData->arrayStates[i].Y = s.readUint16BE();
ovlData->arrayStates[i].Z = s.readUint16BE();
@@ -521,38 +494,28 @@ int loadOverlay(const char *scriptName) {
}
if (ovlData->numStrings) {
- int i;
-
- ovlData->stringTable =
- (stringEntryStruct *) mallocAndZero(ovlData->numStrings *
- sizeof(stringEntryStruct));
+ ovlData->stringTable = (stringEntryStruct *) mallocAndZero(ovlData->numStrings * sizeof(stringEntryStruct));
- for (i = 0; i < ovlData->numStrings; i++) {
+ for (int i = 0; i < ovlData->numStrings; i++)
ovlData->stringTable[i].idx = s.readUint16BE();
- }
}
if (ovlData->sizeOfData4) {
- ovlData->data4Ptr =
- (uint8 *) mallocAndZero(ovlData->sizeOfData4);
+ ovlData->data4Ptr = (uint8 *) mallocAndZero(ovlData->sizeOfData4);
- if (!ovlData->data4Ptr) {
+ if (!ovlData->data4Ptr)
return (-2);
- }
}
- if (ovlData->
- specialString1Length /*|| ovlData->specialString2Length */
+ if (ovlData->specialString1Length /*|| ovlData->specialString2Length */
|| ovlData->stringTable) {
- int i;
//int unpackedSize;
//int fileIdx;
//uint8 fileName[50];
//char* unpackedBuffer;
- strcpy(fileName, scriptName);
-
- strcat(fileName, ".FR");
+ Common::strlcpy(fileName, scriptName, sizeof(fileName));
+ Common::strlcat(fileName, ".FR", sizeof(fileName));
fileIdx = findFileInDisks(fileName);
@@ -625,7 +588,7 @@ int loadOverlay(const char *scriptName) {
s2.read(ovlData->arrayNameObj, ovlData->specialString2Length);
}
- for (i = 0; i < ovlData->numStrings; i++) {
+ for (int i = 0; i < ovlData->numStrings; i++) {
ovlData->stringTable[i].length = s2.readUint16BE();
if (ovlData->stringTable[i].length) {
@@ -650,8 +613,7 @@ int loadOverlay(const char *scriptName) {
}
#ifdef DUMP_SCRIPT
{
- int i;
- for (i = 0; i < ovlData->numProc; i++) {
+ for (int i = 0; i < ovlData->numProc; i++) {
dumpScript(scriptName, ovlData, i);
}
}
@@ -659,15 +621,14 @@ int loadOverlay(const char *scriptName) {
#ifdef DUMP_OBJECT
{
// TODO: Rewrite this to use Common::DumpFile
- int i;
FILE *fHandle;
char nameBundle[100];
sprintf(nameBundle, "%s-objs.txt", scriptName);
fHandle = fopen(nameBundle, "w+");
- ASSERT(fHandle);
+ assert(fHandle);
- for (i = 0; i < ovlData->numMsgRelHeader; i++) {
+ for (int i = 0; i < ovlData->numMsgRelHeader; i++) {
linkDataStruct *var_34;
var_34 = &ovlData->arrayMsgRelHeader[i];
@@ -700,9 +661,7 @@ int releaseOverlay(const char *name) {
}
int32 findOverlayByName2(const char *name) {
- int i;
-
- for (i = 1; i < numOfLoadedOverlay; i++) {
+ for (int i = 1; i < numOfLoadedOverlay; i++) {
if (!strcmp(overlayTable[i].overlayName, name))
return (i);
}
@@ -711,12 +670,9 @@ int32 findOverlayByName2(const char *name) {
}
int findOverlayByName(const char *overlayName) {
- int i;
-
- for (i = 1; i < numOfLoadedOverlay; i++) {
- if (!strcmp(overlayTable[i].overlayName, overlayName)) {
+ for (int i = 1; i < numOfLoadedOverlay; i++) {
+ if (!strcmp(overlayTable[i].overlayName, overlayName))
return (i);
- }
}
return (-4);
diff --git a/engines/cruise/overlay.h b/engines/cruise/overlay.h
index 3b69f2acef..cfba75dd7a 100644
--- a/engines/cruise/overlay.h
+++ b/engines/cruise/overlay.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/cruise/perso.cpp b/engines/cruise/perso.cpp
index 85c9b1614f..ff33eca14b 100644
--- a/engines/cruise/perso.cpp
+++ b/engines/cruise/perso.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -172,23 +172,20 @@ void processActorWalk(MovementEntry &resx_y, int16 *inc_droite, int16 *inc_droit
int16 *inc_chemin, point* cor_joueur,
int16 solution0[NUM_NODES + 3][2], int16 *inc_jo1, int16 *inc_jo2,
int16 *dir_perso, int16 *inc_jo0, int16 num) {
- int x1, x2, y1, y2;
- int i, u;
-
- u = 0;
+ int u = 0;
inc_jo = *inc_jo0;
- i = *inc_chemin;
+ int i = *inc_chemin;
if (!*inc_droite) {
- x1 = solution0[i][0];
- y1 = solution0[i][1];
+ int x1 = solution0[i][0];
+ int y1 = solution0[i][1];
i++;
if (solution0[i][0] != -1) {
do {
if (solution0[i][0] != -2) {
- x2 = solution0[i][0];
- y2 = solution0[i][1];
+ int x2 = solution0[i][0];
+ int y2 = solution0[i][1];
if ((x1 == x2) && (y1 == y2)) {
resx_y.x = -1;
resx_y.y = -1;
@@ -240,7 +237,7 @@ void processActorWalk(MovementEntry &resx_y, int16 *inc_droite, int16 *inc_droit
void affiche_chemin(int16 persoIdx, MovementEntry &data) {
persoStruct *pPerso = persoTable[persoIdx];
- ASSERT(pPerso);
+ assert(pPerso);
processActorWalk(data, &pPerso->inc_droite, &pPerso->inc_droite0,
&pPerso->inc_chemin, pPerso->coordinates, pPerso->solution,
diff --git a/engines/cruise/perso.h b/engines/cruise/perso.h
index e0ca479dff..6d8120793e 100644
--- a/engines/cruise/perso.h
+++ b/engines/cruise/perso.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/cruise/polys.cpp b/engines/cruise/polys.cpp
index 964540f802..f6d0691c69 100644
--- a/engines/cruise/polys.cpp
+++ b/engines/cruise/polys.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -183,11 +183,10 @@ void line(int x1, int y1, int x2, int y2, char c) {
static void add_intersect(int *intersect, int x, byte &num) {
if (num < MAXPTS) {
- int i;
- for (i = num; i > 0 && intersect[i - 1] > x; i--) {
+ int i = 0;
+ for (i = num; i > 0 && intersect[i - 1] > x; i--)
intersect[i] = intersect[i - 1];
- }
intersect[i] = x;
num++;
@@ -212,20 +211,15 @@ void fillpoly(int16 *point_data, int lineCount, ColorP color) {
}
// Reinit array counters
-
- int x1, y1, x2, y2;
- int y, i;
-
- for (i = 0; i < SCREENHEIGHT; i++) {
+ for (int i = 0; i < SCREENHEIGHT; i++) {
num_intersect[i] = 0;
}
// Find the top/bottom of the polygon.
-
int top = point_data[1];
int bottom = point_data[1];
- for (i = 1; i < lineCount; i++) {
+ for (int i = 1; i < lineCount; i++) {
if (point_data[2 * i + 1] < top)
top = point_data[2 * i + 1];
else if (point_data[2 * i + 1] > bottom)
@@ -238,14 +232,13 @@ void fillpoly(int16 *point_data, int lineCount, ColorP color) {
bottom = SCREENHEIGHT - 1;
// Calculate intersections for each scan line
+ for (int y = top; y <= bottom; y++) {
+ int x2 = point_data[2 * lineCount - 2];
+ int y2 = point_data[2 * lineCount - 1];
- for (y = top; y <= bottom; y++) {
- x2 = point_data[2 * lineCount - 2];
- y2 = point_data[2 * lineCount - 1];
-
- for (i = 0; i < lineCount; i++) {
- x1 = x2;
- y1 = y2;
+ for (int i = 0; i < lineCount; i++) {
+ int x1 = x2;
+ int y1 = y2;
x2 = point_data[2 * i];
y2 = point_data[2 * i + 1];
@@ -265,9 +258,8 @@ void fillpoly(int16 *point_data, int lineCount, ColorP color) {
}
// Drawing.
-
- for (y = top; y <= bottom; y++) {
- for (i = 0; i < num_intersect[y]; i += 2) {
+ for (int y = top; y <= bottom; y++) {
+ for (int i = 0; i < num_intersect[y]; i += 2) {
hline(intersect[y][i], intersect[y][i + 1], y, color);
}
}
diff --git a/engines/cruise/polys.h b/engines/cruise/polys.h
index 8505f791a6..6add9c6ded 100644
--- a/engines/cruise/polys.h
+++ b/engines/cruise/polys.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/cruise/saveload.cpp b/engines/cruise/saveload.cpp
index 26bea0441c..a62648df08 100644
--- a/engines/cruise/saveload.cpp
+++ b/engines/cruise/saveload.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -182,11 +182,13 @@ static void syncFilesDatabase(Common::Serializer &s) {
s.syncAsUint16LE(fe.resType);
s.syncAsUint16LE(fe.height);
- // TODO: Have a look at the saving/loading of this pointer
+ // Remember whether this file database was open or not.
+ // Upon loading, loadSavegameData uses this information
+ // in order to re-open the file databases accordingly.
tmp = (fe.subData.ptr) ? 1 : 0;
s.syncAsUint32LE(tmp);
if (s.isLoading()) {
- fe.subData.ptr = (uint8 *)tmp;
+ fe.subData.ptr = tmp ? (uint8 *)1 : 0;
}
s.syncAsSint16LE(fe.subData.index);
@@ -195,11 +197,11 @@ static void syncFilesDatabase(Common::Serializer &s) {
s.syncAsSint16LE(fe.subData.transparency);
- // TODO: Have a look at the saving/loading of this pointer
+ // Treat fe.subData.ptrMask the same as fe.subData.ptr.
tmp = (fe.subData.ptrMask) ? 1 : 0;
s.syncAsUint32LE(tmp);
if (s.isLoading()) {
- fe.subData.ptrMask = (uint8 *)tmp;
+ fe.subData.ptrMask = tmp ? (uint8 *)1 : 0;
}
s.syncAsUint16LE(fe.subData.resourceType);
@@ -282,7 +284,7 @@ static void syncOverlays2(Common::Serializer &s) {
if (ovlRestoreData[i]._sBssSize) {
ovlRestoreData[i]._pBss = (uint8 *) mallocAndZero(ovlRestoreData[i]._sBssSize);
- ASSERT(ovlRestoreData[i]._pBss);
+ assert(ovlRestoreData[i]._pBss);
s.syncBytes(ovlRestoreData[i]._pBss, ovlRestoreData[i]._sBssSize);
}
@@ -291,7 +293,7 @@ static void syncOverlays2(Common::Serializer &s) {
if (ovlRestoreData[i]._sNumObj) {
ovlRestoreData[i]._pObj = (objectParams *) mallocAndZero(ovlRestoreData[i]._sNumObj * sizeof(objectParams));
- ASSERT(ovlRestoreData[i]._pObj);
+ assert(ovlRestoreData[i]._pObj);
for (int j = 0; j < ovlRestoreData[i]._sNumObj; j++) {
s.syncAsSint16LE(ovlRestoreData[i]._pObj[j].X);
@@ -733,7 +735,7 @@ void initVars() {
resetBackgroundIncrustList(&backgroundIncrustHead);
vblLimit = 0;
- remdo = 0;
+ remdo = false;
songLoaded = 0;
songPlayed = 0;
songLoop = 1;
@@ -775,7 +777,7 @@ void initVars() {
buttonDown = 0;
var41 = 0;
playerMenuEnabled = 0;
- PCFadeFlag = 0;
+ PCFadeFlag = false;
}
Common::Error saveSavegameData(int saveGameIdx, const Common::String &saveName) {
@@ -806,7 +808,6 @@ Common::Error saveSavegameData(int saveGameIdx, const Common::String &saveName)
}
Common::Error loadSavegameData(int saveGameIdx) {
- int lowMemorySave;
Common::String saveName;
cellStruct *currentcellHead;
@@ -878,20 +879,17 @@ Common::Error loadSavegameData(int saveGameIdx) {
lastAni[0] = 0;
- lowMemorySave = lowMemory;
-
for (int i = 0; i < NUM_FILE_ENTRIES; i++) {
if (filesDatabase[i].subData.ptr) {
- int j;
- int k;
-
- for (j = i + 1; j < NUM_FILE_ENTRIES && filesDatabase[j].subData.ptr && !strcmp(filesDatabase[i].subData.name, filesDatabase[j].subData.name) && (filesDatabase[j].subData.index == (j - i)); j++)
+ int j = i + 1;
+ for (; j < NUM_FILE_ENTRIES &&
+ filesDatabase[j].subData.ptr &&
+ !strcmp(filesDatabase[i].subData.name, filesDatabase[j].subData.name) &&
+ (filesDatabase[j].subData.index == (j - i));
+ j++)
;
- for (k = i; k < j; k++) {
- if (filesDatabase[k].subData.ptrMask)
- lowMemory = 0;
-
+ for (int k = i; k < j; k++) {
filesDatabase[k].subData.ptr = NULL;
filesDatabase[k].subData.ptrMask = NULL;
}
@@ -908,7 +906,6 @@ Common::Error loadSavegameData(int saveGameIdx) {
}
i = j - 1;
- lowMemory = lowMemorySave;
}
}
@@ -918,17 +915,14 @@ Common::Error loadSavegameData(int saveGameIdx) {
while (currentcellHead) {
if (currentcellHead->type == 5) {
+ assert(0);
+#if 0
uint8 *ptr = mainProc14(currentcellHead->overlay, currentcellHead->idx);
-
- ASSERT(0);
-
- if (ptr) {
- ASSERT(0);
- //*(int16 *)(currentcellHead->datas+0x2E) = getSprite(ptr,*(int16 *)(currentcellHead->datas+0xE));
- } else {
- ASSERT(0);
- //*(int16 *)(currentcellHead->datas+0x2E) = 0;
- }
+ if (ptr)
+ *(int16 *)(currentcellHead->datas+0x2E) = getSprite(ptr,*(int16 *)(currentcellHead->datas+0xE));
+ else
+ *(int16 *)(currentcellHead->datas+0x2E) = 0;
+#endif
}
currentcellHead = currentcellHead->next;
@@ -953,7 +947,7 @@ Common::Error loadSavegameData(int saveGameIdx) {
// to finish
changeCursor(CURSOR_NORMAL);
- mainDraw(1);
+ mainDraw(true);
flipScreen();
return Common::kNoError;
diff --git a/engines/cruise/saveload.h b/engines/cruise/saveload.h
index 695913f46f..6fb1f4b545 100644
--- a/engines/cruise/saveload.h
+++ b/engines/cruise/saveload.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/cruise/script.cpp b/engines/cruise/script.cpp
index d753d938bd..1f308714f7 100644
--- a/engines/cruise/script.cpp
+++ b/engines/cruise/script.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -51,12 +51,13 @@ int32 opcodeType0() {
int index = 0;
switch (currentScriptOpcodeType) {
- case 0: {
+ case 0:
pushVar(getShortFromScript());
return (0);
- }
+
case 5:
index = saveOpcodeVar;
+ // No break on purpose
case 1: {
uint8 *address = 0;
int type = getByteFromScript();
@@ -131,12 +132,12 @@ int32 opcodeType1() {
int offset = 0;
switch (currentScriptOpcodeType) {
- case 0: {
+ case 0:
return (0); // strange, but happens also in original interpreter
- }
- case 5: {
+
+ case 5:
offset = saveOpcodeVar;
- }
+ //no break on purpose
case 1: {
int var_A = 0;
@@ -169,7 +170,7 @@ int32 opcodeType1() {
if (var_6 == 5) {
ptr = overlayTable[byte2].ovlData->data4Ptr + var_C;
} else {
- ASSERT(0);
+ assert(0);
}
} else {
ptr = scriptDataPtrTable[var_6] + var_C;
@@ -226,6 +227,7 @@ int32 opcodeType2() {
switch (currentScriptOpcodeType) {
case 5:
index = saveOpcodeVar;
+ // No break on purpose
case 1: {
uint8* adresse = NULL;
int type = getByteFromScript();
@@ -247,7 +249,7 @@ int32 opcodeType2() {
if (!overlayTable[overlay].ovlData) {
return (-4);
}
- ASSERT(0);
+ assert(0);
}
adresse += offset;
@@ -261,6 +263,7 @@ int32 opcodeType2() {
}
}
+ break;
}
return 0;
@@ -281,39 +284,37 @@ int32 opcodeType4() { // test
int var2 = popVar();
switch (currentScriptOpcodeType) {
- case 0: {
+ case 0:
if (var2 != var1)
boolVar = 1;
break;
- }
- case 1: {
+
+ case 1:
if (var2 == var1)
boolVar = 1;
break;
- }
- case 2: {
+
+ case 2:
if (var2 < var1)
boolVar = 1;
break;
- }
- case 3: {
+
+ case 3:
if (var2 <= var1)
boolVar = 1;
break;
- }
- case 4: {
+
+ case 4:
if (var2 > var1)
boolVar = 1;
break;
- }
- case 5: {
+
+ case 5:
if (var2 >= var1)
boolVar = 1;
break;
}
- }
-
pushVar(boolVar);
return (0);
@@ -327,13 +328,11 @@ int32 opcodeType6() {
if (!pop)
si = 1;
- if (pop < 0) {
+ if (pop < 0)
si |= 4;
- }
- if (pop > 0) {
+ if (pop > 0)
si |= 2;
- }
currentScriptPtr->ccr = si;
@@ -357,50 +356,49 @@ int32 opcodeType5() {
int bitMask = currentScriptPtr->ccr;
switch (currentScriptOpcodeType) {
- case 0: {
- if (!(bitMask & 1)) {
+ case 0:
+ if (!(bitMask & 1))
currentScriptPtr->scriptOffset = newSi;
- }
+
break;
- }
- case 1: {
- if (bitMask & 1) {
+
+ case 1:
+ if (bitMask & 1)
currentScriptPtr->scriptOffset = newSi;
- }
+
break;
- }
- case 2: {
- if (bitMask & 2) {
+
+ case 2:
+ if (bitMask & 2)
currentScriptPtr->scriptOffset = newSi;
- }
+
break;
- }
- case 3: {
- if (bitMask & 3) {
+
+ case 3:
+ if (bitMask & 3)
currentScriptPtr->scriptOffset = newSi;
- }
+
break;
- }
- case 4: {
- if (bitMask & 4) {
+
+ case 4:
+ if (bitMask & 4)
currentScriptPtr->scriptOffset = newSi;
- }
+
break;
- }
- case 5: {
- if (bitMask & 5) {
+
+ case 5:
+ if (bitMask & 5)
currentScriptPtr->scriptOffset = newSi;
- }
+
break;
- }
- case 6: {
+
+ case 6:
break; // never
- }
- case 7: {
+
+ case 7:
currentScriptPtr->scriptOffset = newSi; //always
break;
}
- }
return (0);
}
@@ -410,35 +408,39 @@ int32 opcodeType3() { // math
int pop2 = popVar();
switch (currentScriptOpcodeType) {
- case 0: {
+ case 0:
pushVar(pop1 + pop2);
return (0);
- }
- case 1: {
+
+ case 1:
+ if (pop2 == 0)
+ error("opcodeType3 - Invalid value for pop2");
pushVar(pop1 / pop2);
return (0);
- }
- case 2: {
+
+ case 2:
pushVar(pop1 - pop2);
return (0);
- }
- case 3: {
+
+ case 3:
pushVar(pop1 * pop2);
return (0);
- }
- case 4: {
+
+ case 4:
+ if (pop2 == 0)
+ error("opcodeType3 - Invalid value for pop2");
pushVar(pop1 % pop2);
return (0);
- }
+
case 7:
- case 5: {
+ case 5:
pushVar(pop2 | pop1);
return (0);
- }
- case 6: {
+
+ case 6:
pushVar(pop2 & pop1);
return (0);
- }
+
}
return 0;
@@ -451,11 +453,8 @@ int32 opcodeType9() { // stop script
}
void setupFuncArray() {
- int i;
-
- for (i = 0; i < 64; i++) {
+ for (int i = 0; i < 64; i++)
opcodeTypeTable[i] = NULL;
- }
opcodeTypeTable[1] = opcodeType0;
opcodeTypeTable[2] = opcodeType1;
@@ -472,19 +471,13 @@ void setupFuncArray() {
}
int removeScript(int overlay, int idx, scriptInstanceStruct *headPtr) {
- scriptInstanceStruct *scriptPtr;
+ scriptInstanceStruct *scriptPtr = headPtr->nextScriptPtr;
- scriptPtr = headPtr->nextScriptPtr;
+ while (scriptPtr) {
+ if (scriptPtr->overlayNumber == overlay && (scriptPtr->scriptNumber == idx || idx == -1))
+ scriptPtr->scriptNumber = -1;
- if (scriptPtr) {
- do {
- if (scriptPtr->overlayNumber == overlay
- && (scriptPtr->scriptNumber == idx || idx == -1)) {
- scriptPtr->scriptNumber = -1;
- }
-
- scriptPtr = scriptPtr->nextScriptPtr;
- } while (scriptPtr);
+ scriptPtr = scriptPtr->nextScriptPtr;
}
return (0);
@@ -493,77 +486,61 @@ int removeScript(int overlay, int idx, scriptInstanceStruct *headPtr) {
uint8 *attacheNewScriptToTail(scriptInstanceStruct *scriptHandlePtr, int16 overlayNumber, int16 param, int16 arg0, int16 arg1, int16 arg2, scriptTypeEnum scriptType) {
int useArg3Neg = 0;
ovlData3Struct *data3Ptr;
- scriptInstanceStruct *tempPtr;
int var_C;
scriptInstanceStruct *oldTail;
- //debug("Starting script %d of overlay %s", param,overlayTable[overlayNumber].overlayName);
-
if (scriptType < 0) {
useArg3Neg = 1;
- scriptType = (scriptTypeEnum) - scriptType;
+ scriptType = (scriptTypeEnum) -scriptType;
}
- if (scriptType == 20) {
+ if (scriptType == 20)
data3Ptr = getOvlData3Entry(overlayNumber, param);
- } else {
- if (scriptType == 30) {
- data3Ptr = scriptFunc1Sub2(overlayNumber, param);
- } else {
- return (NULL);
- }
- }
+ else if (scriptType == 30)
+ data3Ptr = scriptFunc1Sub2(overlayNumber, param);
+ else
+ return (NULL);
- if (!data3Ptr) {
+ if (!data3Ptr)
return (NULL);
- }
- if (!data3Ptr->dataPtr) {
+ if (!data3Ptr->dataPtr)
return (NULL);
- }
var_C = data3Ptr->sysKey;
-
oldTail = scriptHandlePtr;
- while (oldTail->nextScriptPtr) { // go to the end of the list
+ while (oldTail->nextScriptPtr) // go to the end of the list
oldTail = oldTail->nextScriptPtr;
- }
- tempPtr =
- (scriptInstanceStruct *)
- mallocAndZero(sizeof(scriptInstanceStruct));
+ scriptInstanceStruct *tempPtr = (scriptInstanceStruct *)mallocAndZero(sizeof(scriptInstanceStruct));
if (!tempPtr)
return (NULL);
tempPtr->data = NULL;
- if (var_C) {
+ if (var_C)
tempPtr->data = (uint8 *) mallocAndZero(var_C);
- }
tempPtr->dataSize = var_C;
tempPtr->nextScriptPtr = NULL;
tempPtr->scriptOffset = 0;
-
tempPtr->scriptNumber = param;
tempPtr->overlayNumber = overlayNumber;
- if (scriptType == 20) { // Obj or not ?
+ if (scriptType == 20) // Obj or not ?
tempPtr->sysKey = useArg3Neg;
- } else {
+ else
tempPtr->sysKey = 1;
- }
tempPtr->freeze = 0;
tempPtr->type = scriptType;
tempPtr->var18 = arg2;
tempPtr->var16 = arg1;
tempPtr->var1A = arg0;
- tempPtr->nextScriptPtr = oldTail->nextScriptPtr; // should always be NULL as it's the tail
-
- oldTail->nextScriptPtr = tempPtr; // attache the new node to the list
+ tempPtr->nextScriptPtr = oldTail->nextScriptPtr; // should always be NULL as it's the tail
+ oldTail->nextScriptPtr = tempPtr; // attach the new node to the list
return (tempPtr->data);
}
@@ -576,27 +553,18 @@ int executeScripts(scriptInstanceStruct *ptr) {
numScript2 = ptr->scriptNumber;
- if (ptr->type == 20) {
+ if (ptr->type == 20)
ptr2 = getOvlData3Entry(ptr->overlayNumber, numScript2);
+ else if (ptr->type == 30)
+ ptr2 = scriptFunc1Sub2(ptr->overlayNumber, numScript2);
+ else
+ return (-6);
- if (!ptr2) {
- return (-4);
- }
- } else {
- if (ptr->type == 30) {
- ptr2 = scriptFunc1Sub2(ptr->overlayNumber, numScript2);
-
- if (!ptr2) {
- return (-4);
- }
- } else {
- return (-6);
- }
- }
+ if (!ptr2)
+ return (-4);
- if (!overlayTable[ptr->overlayNumber].alreadyLoaded) {
+ if (!overlayTable[ptr->overlayNumber].alreadyLoaded)
return (-7);
- }
ovlData = overlayTable[ptr->overlayNumber].ovlData;
@@ -604,14 +572,11 @@ int executeScripts(scriptInstanceStruct *ptr) {
return (-4);
currentData3DataPtr = ptr2->dataPtr;
-
scriptDataPtrTable[1] = (uint8 *) ptr->data;
scriptDataPtrTable[2] = getDataFromData3(ptr2, 1);
scriptDataPtrTable[5] = ovlData->data4Ptr; // free strings
scriptDataPtrTable[6] = ovlData->ptr8;
-
currentScriptPtr = ptr;
-
positionInStack = 0;
do {
@@ -645,21 +610,15 @@ int executeScripts(scriptInstanceStruct *ptr) {
void manageScripts(scriptInstanceStruct *scriptHandle) {
scriptInstanceStruct *ptr = scriptHandle;
- if (ptr) {
- do {
- if (!overlayTable[ptr->overlayNumber].executeScripts) {
- if ((ptr->scriptNumber != -1) && (ptr->freeze == 0) && (ptr->sysKey != 0)) {
- executeScripts(ptr);
- }
+ while (ptr) {
+ if (!overlayTable[ptr->overlayNumber].executeScripts) {
+ if ((ptr->scriptNumber != -1) && (ptr->freeze == 0) && (ptr->sysKey != 0))
+ executeScripts(ptr);
- if (ptr->sysKey == 0) {
- ptr->sysKey = 1;
- }
- }
-
- ptr = ptr->nextScriptPtr;
-
- } while (ptr);
+ if (ptr->sysKey == 0)
+ ptr->sysKey = 1;
+ }
+ ptr = ptr->nextScriptPtr;
}
}
diff --git a/engines/cruise/script.h b/engines/cruise/script.h
index cba4f580f8..15f29e8921 100644
--- a/engines/cruise/script.h
+++ b/engines/cruise/script.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/cruise/sound.cpp b/engines/cruise/sound.cpp
index 21d9a75297..0b0fab8c4a 100644
--- a/engines/cruise/sound.cpp
+++ b/engines/cruise/sound.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -342,9 +342,7 @@ void AdLibSoundDriver::adjustVolume(int channel, int volume) {
volume = 0;
}
volume += volume / 4;
- if (volume > 127) {
- volume = 127;
- }
+ // The higher possible value for volume is 100
int volAdjust = (channel == 4) ? _sfxVolume : _musicVolume;
volume = (volume * volAdjust) / 128;
@@ -379,13 +377,12 @@ void AdLibSoundDriver::stopChannel(int channel) {
}
void AdLibSoundDriver::stopAll() {
- int i;
- for (i = 0; i < 18; ++i) {
+ for (int i = 0; i < 18; ++i)
OPLWriteReg(_opl, 0x40 | _operatorsTable[i], 63);
- }
- for (i = 0; i < 9; ++i) {
+
+ for (int i = 0; i < 9; ++i)
OPLWriteReg(_opl, 0xB0 | i, 0);
- }
+
OPLWriteReg(_opl, 0xBD, 0);
}
@@ -610,6 +607,13 @@ PCSoundFxPlayer::PCSoundFxPlayer(PCSoundDriver *driver)
_sfxData = NULL;
_fadeOutCounter = 0;
_driver->setUpdateCallback(updateCallback, this);
+
+ _currentPos = 0;
+ _currentOrder = 0;
+ _numOrders = 0;
+ _eventsDelay = 0;
+ _looping = false;
+ _updateTicksCounter = 0;
}
PCSoundFxPlayer::~PCSoundFxPlayer() {
@@ -630,7 +634,7 @@ bool PCSoundFxPlayer::load(const char *song) {
stop();
}
- strcpy(_musicName, song);
+ Common::strlcpy(_musicName, song, sizeof(_musicName));
_songPlayed = false;
_looping = false;
_sfxData = readBundleSoundFile(song);
@@ -652,7 +656,7 @@ bool PCSoundFxPlayer::load(const char *song) {
if (dot) {
*dot = '\0';
}
- strcat(instrument, _driver->getInstrumentExtension());
+ Common::strlcat(instrument, _driver->getInstrumentExtension(), sizeof(instrument));
_instrumentsData[i] = readBundleSoundFile(instrument);
if (!_instrumentsData[i]) {
warning("Unable to load soundfx instrument '%s'", instrument);
@@ -795,6 +799,7 @@ PCSound::PCSound(Audio::Mixer *mixer, CruiseEngine *vm) {
_mixer = mixer;
_soundDriver = new AdLibSoundDriverADL(_mixer);
_player = new PCSoundFxPlayer(_soundDriver);
+ _genVolume = 0;
}
PCSound::~PCSound() {
diff --git a/engines/cruise/sound.h b/engines/cruise/sound.h
index c1975dc579..57035e2b11 100644
--- a/engines/cruise/sound.h
+++ b/engines/cruise/sound.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/cruise/stack.cpp b/engines/cruise/stack.cpp
index 985fe8d7fd..52a7a84814 100644
--- a/engines/cruise/stack.cpp
+++ b/engines/cruise/stack.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -44,7 +44,7 @@ int16 popVar() {
positionInStack--;
- ASSERT(scriptStack[positionInStack].type == STACK_SHORT);
+ assert(scriptStack[positionInStack].type == STACK_SHORT);
return (scriptStack[positionInStack].data.shortVar);
}
@@ -66,7 +66,7 @@ void *popPtr() {
positionInStack--;
- ASSERT(scriptStack[positionInStack].type == STACK_PTR);
+ assert(scriptStack[positionInStack].type == STACK_PTR);
return (scriptStack[positionInStack].data.ptrVar);
}
diff --git a/engines/cruise/stack.h b/engines/cruise/stack.h
index fe2d594c9e..1c96f430d9 100644
--- a/engines/cruise/stack.h
+++ b/engines/cruise/stack.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/cruise/staticres.cpp b/engines/cruise/staticres.cpp
index 08ff4d7548..e9ba941ae0 100644
--- a/engines/cruise/staticres.cpp
+++ b/engines/cruise/staticres.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/cruise/staticres.h b/engines/cruise/staticres.h
index acf0b640be..3691260078 100644
--- a/engines/cruise/staticres.h
+++ b/engines/cruise/staticres.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/cruise/various.cpp b/engines/cruise/various.cpp
index 90b072b478..df09ac92c8 100644
--- a/engines/cruise/various.cpp
+++ b/engines/cruise/various.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -24,8 +24,8 @@
namespace Cruise {
-uint16 remdo = 0;
-uint16 PCFadeFlag;
+bool remdo = false;
+bool PCFadeFlag;
char *getText(int textIndex, int overlayIndex) {
if (!overlayTable[overlayIndex].ovlData) {
diff --git a/engines/cruise/various.h b/engines/cruise/various.h
index b59593961d..94fc29173a 100644
--- a/engines/cruise/various.h
+++ b/engines/cruise/various.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -27,8 +27,8 @@
namespace Cruise {
-extern uint16 remdo;
-extern uint16 PCFadeFlag;
+extern bool remdo;
+extern bool PCFadeFlag;
int16 objInit(int ovlIdx, int param1, int param2);
char *getText(int textIndex, int overlayIndex);
diff --git a/engines/cruise/vars.cpp b/engines/cruise/vars.cpp
index f381358356..e9b68968ef 100644
--- a/engines/cruise/vars.cpp
+++ b/engines/cruise/vars.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -31,7 +31,6 @@ uint8 selectColor = 3;
uint8 titleColor = 2;
uint8 subColor = 5;
-int16 lowMemory;
int16 scroll;
int16 switchPal;
char cmdLine[90];
@@ -54,9 +53,7 @@ char nextOverlay[38];
int16 currentActiveMenu;
int16 autoMsg;
menuElementSubStruct* linkedRelation;
-int16 main21;
-int16 main22;
-int16 userWait;
+bool userWait;
int16 autoTrack;
int16 currentDiskNumber = 1;
diff --git a/engines/cruise/vars.h b/engines/cruise/vars.h
index ccbf149610..e7c687d5fb 100644
--- a/engines/cruise/vars.h
+++ b/engines/cruise/vars.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -59,7 +59,6 @@ extern uint8 selectColor;
extern uint8 titleColor;
extern uint8 subColor;
-extern int16 lowMemory;
extern int16 scroll;
extern int16 switchPal;
extern char cmdLine[90];
@@ -157,9 +156,7 @@ extern char nextOverlay[38];
extern int16 currentActiveMenu;
extern int16 autoMsg;
extern menuElementSubStruct* linkedRelation;
-extern int16 main21;
-extern int16 main22;
-extern int16 userWait;
+extern bool userWait;
extern int16 autoTrack;
extern int16 currentDiskNumber;
diff --git a/engines/cruise/volume.cpp b/engines/cruise/volume.cpp
index 9fb6842882..99d86e48bb 100644
--- a/engines/cruise/volume.cpp
+++ b/engines/cruise/volume.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -83,14 +83,12 @@ int closeBase() {
int getVolumeDataEntry(volumeDataStruct *entry) {
char buffer[256];
- int i;
volumeNumEntry = 0;
volumeNumberOfEntry = 0;
- if (_vm->_currentVolumeFile.isOpen()) {
+ if (_vm->_currentVolumeFile.isOpen())
freeDisk();
- }
askDisk(-1);
@@ -98,9 +96,8 @@ int getVolumeDataEntry(volumeDataStruct *entry) {
_vm->_currentVolumeFile.open(buffer);
- if (!_vm->_currentVolumeFile.isOpen()) {
+ if (!_vm->_currentVolumeFile.isOpen())
return (-14);
- }
changeCursor(CURSOR_DISK);
@@ -113,7 +110,7 @@ int getVolumeDataEntry(volumeDataStruct *entry) {
volumePtrToFileDescriptor = (fileEntry *) mallocAndZero(sizeof(fileEntry) * volumeNumEntry);
- for (i = 0; i < volumeNumEntry; i++) {
+ for (int i = 0; i < volumeNumEntry; i++) {
volumePtrToFileDescriptor[i].name[0] = 0;
volumePtrToFileDescriptor[i].offset = 0;
volumePtrToFileDescriptor[i].size = 0;
@@ -121,7 +118,7 @@ int getVolumeDataEntry(volumeDataStruct *entry) {
volumePtrToFileDescriptor[i].unk3 = 0;
}
- for (i = 0; i < volumeNumEntry; i++) {
+ for (int i = 0; i < volumeNumEntry; i++) {
_vm->_currentVolumeFile.read(&volumePtrToFileDescriptor[i].name, 14);
volumePtrToFileDescriptor[i].offset = _vm->_currentVolumeFile.readSint32BE();
volumePtrToFileDescriptor[i].size = _vm->_currentVolumeFile.readSint32BE();
@@ -138,14 +135,12 @@ int getVolumeDataEntry(volumeDataStruct *entry) {
int searchFileInVolCnf(const char *fileName, int32 diskNumber) {
int foundDisk = -1;
- int i;
- for (i = 0; i < numOfDisks; i++) {
+ for (int i = 0; i < numOfDisks; i++) {
if (volumeData[i].diskNumber == diskNumber) {
- int j;
int numOfEntry = volumeData[i].size / 13;
- for (j = 0; j < numOfEntry; j++) {
+ for (int j = 0; j < numOfEntry; j++) {
if (!strcmp(volumeData[i].ptr[j].name, fileName)) {
return (i);
}
@@ -158,13 +153,11 @@ int searchFileInVolCnf(const char *fileName, int32 diskNumber) {
int32 findFileInDisksSub1(const char *fileName) {
int foundDisk = -1;
- int i;
- for (i = 0; i < numOfDisks; i++) {
- int j;
+ for (int i = 0; i < numOfDisks; i++) {
int numOfEntry = volumeData[i].size / 13;
- for (j = 0; j < numOfEntry; j++) {
+ for (int j = 0; j < numOfEntry; j++) {
if (!strcmp(volumeData[i].ptr[j].name, fileName)) {
return (i);
}
@@ -189,19 +182,15 @@ void freeDisk() {
}
int16 findFileInList(char *fileName) {
- int i;
-
- if (!_vm->_currentVolumeFile.isOpen()) {
+ if (!_vm->_currentVolumeFile.isOpen())
return (-1);
- }
strToUpper(fileName);
- if (volumeNumEntry <= 0) {
+ if (volumeNumEntry <= 0)
return (-1);
- }
- for (i = 0; i < volumeNumEntry; i++) {
+ for (int i = 0; i < volumeNumEntry; i++) {
if (!strcmp(volumePtrToFileDescriptor[i].name, fileName)) {
return (i);
}
@@ -213,24 +202,25 @@ int16 findFileInList(char *fileName) {
void askDisk(int16 discNumber) {
char fileName[256];
char string[256];
- char messageDrawn = 0;
if (discNumber != -1) {
currentDiskNumber = discNumber;
}
- // skip drive selection stuff
sprintf(fileName, "VOL.%d", currentDiskNumber);
-
sprintf(string, "INSERER LE DISQUE %d EN ", currentDiskNumber);
- //while (Common::File::exists((const char*)fileName))
- {
+#if 0 // skip drive selection stuff
+ bool messageDrawn = false;
+ while (Common::File::exists((const char*)fileName)) {
if (!messageDrawn) {
drawMsgString(string);
- messageDrawn = 1;
+ messageDrawn = true;
}
}
+#else
+ drawMsgString(string);
+#endif
changeCursor(currentCursor);
}
@@ -240,7 +230,7 @@ int16 findFileInDisks(const char *name) {
int disk;
int fileIdx;
- strcpy(fileName, name);
+ Common::strlcpy(fileName, name, sizeof(fileName));
strToUpper(fileName);
if (!volumeDataLoaded) {
@@ -324,13 +314,12 @@ int closeCnf() {
}
int16 readVolCnf() {
- int i;
Common::File fileHandle;
//short int sizeHEntry;
volumeDataLoaded = 0;
- for (i = 0; i < 20; i++) {
+ for (int i = 0; i < 20; i++) {
volumeData[i].ident[0] = 0;
volumeData[i].ptr = NULL;
volumeData[i].diskNumber = i + 1;
@@ -339,14 +328,13 @@ int16 readVolCnf() {
fileHandle.open("VOL.CNF");
- if (!fileHandle.isOpen()) {
+ if (!fileHandle.isOpen())
return (0);
- }
numOfDisks = fileHandle.readSint16BE();
/*sizeHEntry =*/ fileHandle.readSint16BE(); // size of one header entry - 20 bytes
- for (i = 0; i < numOfDisks; i++) {
+ for (int i = 0; i < numOfDisks; i++) {
// fread(&volumeData[i],20,1,fileHandle);
fileHandle.read(&volumeData[i].ident, 10);
fileHandle.read(&volumeData[i].ptr, 4);
@@ -356,7 +344,7 @@ int16 readVolCnf() {
debug(1, "Disk number: %d", volumeData[i].diskNumber);
}
- for (i = 0; i < numOfDisks; i++) {
+ for (int i = 0; i < numOfDisks; i++) {
dataFileName *ptr;
volumeData[i].size = fileHandle.readSint32BE();
@@ -381,7 +369,6 @@ int16 readVolCnf() {
#ifdef dumpResources
for (i = 0; i < numOfDisks; i++) {
- int j;
char nameBuffer[256];
fileEntry *buffer;
@@ -397,7 +384,7 @@ int16 readVolCnf() {
buffer = (fileEntry *) mallocAndZero(numEntry * sizeEntry);
- for (j = 0; j < numEntry; j++) {
+ for (int j = 0; j < numEntry; j++) {
fileHandle.seek(4 + j*0x1E);
fileHandle.read(buffer[j].name, 14);
buffer[j].offset = fileHandle.readSint32BE();
diff --git a/engines/cruise/volume.h b/engines/cruise/volume.h
index 80e1f10db2..0caa894744 100644
--- a/engines/cruise/volume.h
+++ b/engines/cruise/volume.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/dialogs.cpp b/engines/dialogs.cpp
index c884075093..8498e50b8d 100644
--- a/engines/dialogs.cpp
+++ b/engines/dialogs.cpp
@@ -17,6 +17,7 @@
* You should have received a copy of the GNU General Public 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/version.h"
@@ -216,6 +217,11 @@ void MainMenuDialog::reflowLayout() {
void MainMenuDialog::save() {
int slot = _saveDialog->runModalWithCurrentTarget();
+ #if defined(__PLAYSTATION2__) && defined(DYNAMIC_MODULES)
+ char pokeme[32];
+ snprintf(pokeme,32,"hack");
+ #endif
+
if (slot >= 0) {
Common::String result(_saveDialog->getResultString());
if (result.empty()) {
diff --git a/engines/dialogs.h b/engines/dialogs.h
index 32174031cc..a38cf2f61e 100644
--- a/engines/dialogs.h
+++ b/engines/dialogs.h
@@ -17,6 +17,7 @@
* You should have received a copy of the GNU General Public 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 GLOBAL_DIALOGS_H
diff --git a/engines/draci/animation.cpp b/engines/draci/animation.cpp
index 6e6f167fba..2528383f4f 100644
--- a/engines/draci/animation.cpp
+++ b/engines/draci/animation.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/draci/animation.h b/engines/draci/animation.h
index 8b2a3d98b8..c555e383ee 100644
--- a/engines/draci/animation.h
+++ b/engines/draci/animation.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/draci/barchive.cpp b/engines/draci/barchive.cpp
index 31dfe62dee..0cd1097981 100644
--- a/engines/draci/barchive.cpp
+++ b/engines/draci/barchive.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -203,12 +203,12 @@ void BArchive::openArchive(const Common::String &path) {
uint32 fileOffset;
fileOffset = reader.readUint32LE();
- _f.seek(fileOffset); // Seek to next file in archive
+ _f.seek(fileOffset); // Seek to next file in archive
- _files[i]._compLength = _f.readUint16LE(); // Compressed size
+ _files[i]._compLength = _f.readUint16LE(); // Compressed size
// should be the same as uncompressed
- _files[i]._length = _f.readUint16LE(); // Original size
+ _files[i]._length = _f.readUint16LE(); // Original size
_files[i]._offset = fileOffset; // Offset of file from start
@@ -216,9 +216,9 @@ void BArchive::openArchive(const Common::String &path) {
assert(compressionType == 0 &&
"Compression type flag is non-zero (file is compressed)");
- _files[i]._crc = _f.readByte(); // CRC checksum of the file
- _files[i]._data = NULL; // File data will be read in on demand
- _files[i]._stopper = 0; // Dummy value; not used in BAR files, needed in DFW
+ _files[i]._crc = _f.readByte(); // CRC checksum of the file
+ _files[i]._data = NULL; // File data will be read in on demand
+ _files[i]._stopper = 0; // Dummy value; not used in BAR files, needed in DFW
}
// Last footer item should be equal to footerOffset
diff --git a/engines/draci/barchive.h b/engines/draci/barchive.h
index 52ce79ad2d..cb0619612a 100644
--- a/engines/draci/barchive.h
+++ b/engines/draci/barchive.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/draci/configure.engine b/engines/draci/configure.engine
new file mode 100644
index 0000000000..09022b06f5
--- /dev/null
+++ b/engines/draci/configure.engine
@@ -0,0 +1,3 @@
+# This file is included from the main "configure" script
+# add_engine [name] [desc] [build-by-default] [subengines] [base games] [deps]
+add_engine draci "Dragon History" yes
diff --git a/engines/draci/console.cpp b/engines/draci/console.cpp
index 07f0ff5542..dc87b06cf4 100644
--- a/engines/draci/console.cpp
+++ b/engines/draci/console.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/draci/console.h b/engines/draci/console.h
index 714871ffd3..a1a584bdb3 100644
--- a/engines/draci/console.h
+++ b/engines/draci/console.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/draci/detection.cpp b/engines/draci/detection.cpp
index 98a74824c8..c7cfe227df 100644
--- a/engines/draci/detection.cpp
+++ b/engines/draci/detection.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/draci/draci.cpp b/engines/draci/draci.cpp
index 06730cfba7..b40d61a04f 100644
--- a/engines/draci/draci.cpp
+++ b/engines/draci/draci.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/draci/draci.h b/engines/draci/draci.h
index 55ebff083e..540c288d3d 100644
--- a/engines/draci/draci.h
+++ b/engines/draci/draci.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/draci/font.cpp b/engines/draci/font.cpp
index b4e799deb7..c688f4292d 100644
--- a/engines/draci/font.cpp
+++ b/engines/draci/font.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/draci/font.h b/engines/draci/font.h
index 3d150f733e..2c640837de 100644
--- a/engines/draci/font.h
+++ b/engines/draci/font.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/draci/game.cpp b/engines/draci/game.cpp
index 271eb1e02e..4fbf2d31ea 100644
--- a/engines/draci/game.cpp
+++ b/engines/draci/game.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -50,37 +50,59 @@ enum {
};
Game::Game(DraciEngine *vm) : _vm(vm), _walkingState(vm) {
- uint i;
-
_dialogueLinesNum = 0;
_blockNum = 0;
- for (i = 0; i < kDialogueLines; i++)
- _dialogueAnims[0] = 0;
+ for (uint i = 0; i < kDialogueLines; i++)
+ _dialogueAnims[0] = nullptr;
_loopStatus = kStatusOrdinary;
_loopSubstatus = kOuterLoop;
- _shouldQuit = 0;
- _shouldExitLoop = 0;
- _isReloaded = 0;
_speechTick = 0;
_speechDuration = 0;
- _objUnderCursor = 0;
- _animUnderCursor = 0;
_markedAnimationIndex = 0;
_scheduledPalette = 0;
_fadePhases = 0;
_fadePhase = 0;
_fadeTick = 0;
_mouseChangeTick = 0;
- _enableQuickHero = 0;
- _wantQuickHero = 0;
- _enableSpeedText = 0;
- _titleAnim = 0;
- _inventoryAnim = 0;
- _walkingMapOverlay = 0;
- _walkingShortestPathOverlay = 0;
- _walkingObliquePathOverlay = 0;
+ _previousItemPosition = 0;
+
+ _shouldQuit = false;
+ _shouldExitLoop = false;
+ _isReloaded = false;
+ _isPositionLoaded = false;
+ _isFadeOut = true;
+ _enableQuickHero = false;
+ _wantQuickHero = false;
+ _enableSpeedText = false;
+ _isPositionLoaded = false;
+
+ _objUnderCursor = nullptr;
+ _animUnderCursor = nullptr;
+ _titleAnim = nullptr;
+ _inventoryAnim = nullptr;
+ _walkingMapOverlay = nullptr;
+ _walkingShortestPathOverlay = nullptr;
+ _walkingObliquePathOverlay = nullptr;
+ _currentItem = nullptr;
+ _itemUnderCursor = nullptr;
+
+ for (int i = 0; i < kInventorySlots; i++)
+ _inventory[i] = nullptr;
+
+ _newRoom = 0;
+ _newGate = 0;
+ _previousRoom = 0;
+ _pushedNewRoom = 0;
+ _pushedNewGate = 0;
+ _currentDialogue = 0;
+ _dialogueArchive = nullptr;
+ _dialogueBlocks = nullptr;
+ _dialogueBegin = false;
+ _dialogueExit = false;
+ _currentBlock = 0;
+ _lastBlock = 0;
BArchive *initArchive = _vm->_initArchive;
const BAFile *file;
@@ -93,7 +115,7 @@ Game::Game(DraciEngine *vm) : _vm(vm), _walkingState(vm) {
uint numPersons = file->_length / personSize;
_persons = new Person[numPersons];
- for (i = 0; i < numPersons; ++i) {
+ for (uint i = 0; i < numPersons; ++i) {
_persons[i]._x = personData.readUint16LE();
_persons[i]._y = personData.readUint16LE();
_persons[i]._fontColor = personData.readByte();
@@ -106,9 +128,9 @@ Game::Game(DraciEngine *vm) : _vm(vm), _walkingState(vm) {
uint numDialogues = file->_length / sizeof(uint16);
_dialogueOffsets = new uint[numDialogues];
- uint curOffset;
- for (i = 0, curOffset = 0; i < numDialogues; ++i) {
- _dialogueOffsets[i] = curOffset;
+ uint curOffset, idx;
+ for (idx = 0, curOffset = 0; idx < numDialogues; ++idx) {
+ _dialogueOffsets[idx] = curOffset;
curOffset += dialogueData.readUint16LE();
}
@@ -143,7 +165,7 @@ Game::Game(DraciEngine *vm) : _vm(vm), _walkingState(vm) {
_variables = new int[numVariables];
Common::MemoryReadStream variableData(file->_data, file->_length);
- for (i = 0; i < numVariables; ++i) {
+ for (uint i = 0; i < numVariables; ++i) {
_variables[i] = variableData.readUint16LE();
}
@@ -161,7 +183,7 @@ Game::Game(DraciEngine *vm) : _vm(vm), _walkingState(vm) {
_objects = new GameObject[numObjects];
Common::MemoryReadStream objStatus(file->_data, file->_length);
- for (i = 0; i < numObjects; ++i) {
+ for (uint i = 0; i < numObjects; ++i) {
byte tmp = objStatus.readByte();
// Set object visibility
@@ -197,6 +219,7 @@ void Game::start() {
// init scripts. This flag was turned on to skip the rest of
// those programs. Don't call loop(), because the
// location may have changed.
+ fadePalette(true);
continue;
}
@@ -230,14 +253,14 @@ void Game::init() {
setLoopStatus(kStatusGate);
setLoopSubstatus(kOuterLoop);
- _animUnderCursor = NULL;
+ _animUnderCursor = nullptr;
- _currentItem = _itemUnderCursor = NULL;
+ _currentItem = _itemUnderCursor = nullptr;
_previousItemPosition = -1;
_vm->_mouse->setCursorType(kHighlightedCursor); // anything different from kNormalCursor
- _objUnderCursor = NULL;
+ _objUnderCursor = nullptr;
// Set the inventory to empty initially
memset(_inventory, 0, kInventorySlots * sizeof(GameItem *));
@@ -381,12 +404,12 @@ void Game::handleInventoryLoop() {
// an overlay, for which we check. Item animations have their IDs
// calculated by offseting their itemID from the ID of the last "special"
// animation ID. In this way, we obtain its itemID.
- if (_animUnderCursor != NULL && _animUnderCursor != _inventoryAnim && _animUnderCursor->getID() != kOverlayImage) {
+ if (_animUnderCursor != nullptr && _animUnderCursor != _inventoryAnim && _animUnderCursor->getID() != kOverlayImage) {
_itemUnderCursor = getItem(kInventoryItemsID - _animUnderCursor->getID());
- assert(_itemUnderCursor != NULL);
+ assert(_itemUnderCursor != nullptr);
assert(_itemUnderCursor->_anim == _animUnderCursor);
} else {
- _itemUnderCursor = NULL;
+ _itemUnderCursor = nullptr;
}
// If the user pressed the left mouse button
@@ -459,6 +482,7 @@ void Game::handleDialogueLoop() {
}
void Game::fadePalette(bool fading_out) {
+ _isFadeOut = fading_out;
const byte *startPal = NULL;
const byte *endPal = _currentRoom._palette >= 0
? _vm->_paletteArchive->getFile(_currentRoom._palette)->_data
@@ -532,6 +556,19 @@ void Game::advanceAnimationsAndTestLoopExit() {
_vm->_anims->drawScene(_vm->_screen->getSurface());
_vm->_screen->copyToScreen();
_vm->_system->delayMillis(kTimeUnit);
+ if(_isFadeOut) {
+ fadePalette(false);
+ // Set cursor state
+ // Need to do this after we set the palette since the cursors use it
+ if (_currentRoom._mouseOn) {
+ debugC(6, kDraciLogicDebugLevel, "Mouse: ON");
+ _vm->_mouse->cursorOn();
+ _vm->_mouse->setCursorType(kNormalCursor);
+ } else {
+ debugC(6, kDraciLogicDebugLevel, "Mouse: OFF");
+ _vm->_mouse->cursorOff();
+ }
+ }
// If the hero has arrived at his destination, after even the last
// phase was correctly animated, run the callback.
@@ -579,6 +616,8 @@ void Game::loop(LoopSubstatus substatus, bool shouldExit) {
break;
}
+ advanceAnimationsAndTestLoopExit();
+
if (_vm->_mouse->isCursorOn()) {
// Find animation under cursor and the game object
// corresponding to it
@@ -610,8 +649,6 @@ void Game::loop(LoopSubstatus substatus, bool shouldExit) {
}
}
- advanceAnimationsAndTestLoopExit();
-
} while (!shouldExitLoop());
setLoopSubstatus(kOuterLoop);
@@ -789,7 +826,7 @@ void Game::removeItem(GameItem *item) {
return;
for (uint i = 0; i < kInventorySlots; ++i) {
if (_inventory[i] == item) {
- _inventory[i] = NULL;
+ _inventory[i] = nullptr;
item->_anim->stop();
break;
}
@@ -856,9 +893,6 @@ void Game::putItem(GameItem *item, int position) {
void Game::inventoryInit() {
// Pause all "background" animations
_vm->_anims->pauseAnimations();
- if (_walkingState.isActive()) {
- walkHero(_hero.x, _hero.y, kDirectionLast);
- }
// Draw the inventory and the current items
inventoryDraw();
@@ -869,6 +903,13 @@ void Game::inventoryInit() {
// Set the appropriate loop status
setLoopStatus(kStatusInventory);
+ if (_walkingState.isActive()) {
+ _walkingState.stopWalking();
+ walkHero(_hero.x, _hero.y, kDirectionLast);
+ } else {
+ _lastTarget = _hero;
+ }
+
// Don't return from the inventory mode immediately if the mouse is out.
_mouseChangeTick = kMouseDoNotSwitch;
}
@@ -887,8 +928,12 @@ void Game::inventoryDone() {
}
}
+ // Start moving to last target
+ walkHero(_lastTarget.x, _lastTarget.y, kDirectionLast);
+ _walkingState.callbackLast();
+
// Reset item under cursor
- _itemUnderCursor = NULL;
+ _itemUnderCursor = nullptr;
// Don't start the inventory mode again if the mouse is on the top.
_mouseChangeTick = kMouseDoNotSwitch;
@@ -907,10 +952,12 @@ void Game::inventoryDraw() {
void Game::inventoryReload() {
// Make sure all items are loaded into memory (e.g., after loading a
// savegame) by re-putting them on the same spot in the inventory.
+ GameItem *tempItem = _currentItem;
for (uint i = 0; i < kInventorySlots; ++i) {
putItem(_inventory[i], i);
}
setPreviousItemPosition(0);
+ _currentItem = tempItem;
}
void Game::inventorySwitch(int keycode) {
@@ -981,7 +1028,7 @@ void Game::dialogueMenu(int dialogueID) {
debugC(7, kDraciLogicDebugLevel,
"hit: %d, _lines[hit]: %d, lastblock: %d, dialogueLines: %d, dialogueExit: %d",
- hit, _lines[hit], _lastBlock, _dialogueLinesNum, _dialogueExit);
+ hit, (hit >= 0 ? _lines[hit] : -1), _lastBlock, _dialogueLinesNum, _dialogueExit);
if ((!_dialogueExit) && (hit >= 0) && (_lines[hit] != -1)) {
if ((oldLines == 1) && (_dialogueLinesNum == 1) && (_lines[hit] == _lastBlock)) {
@@ -1171,6 +1218,12 @@ void Game::walkHero(int x, int y, SightDirection dir) {
debug(1, "Unreachable point [%d,%d]", target.x, target.y);
return;
}
+
+ // Save point of player's last target.
+ if (_loopStatus != kStatusInventory) {
+ _lastTarget = target;
+ }
+
_walkingMap.obliquePath(shortestPath, &obliquePath);
debugC(2, kDraciWalkingDebugLevel, "Walking path lengths: shortest=%d oblique=%d", shortestPath.size(), obliquePath.size());
if (_vm->_showWalkingMap) {
@@ -1391,7 +1444,7 @@ void Game::enterNewRoom() {
// for the dragon in the persons array
if (_newRoom == _info._mapRoom) {
_persons[kDragonObject]._x = 160;
- _persons[kDragonObject]._y = 0;
+ _persons[kDragonObject]._y = 0;
}
// Set the appropriate loop status before loading the room
@@ -1414,7 +1467,6 @@ void Game::enterNewRoom() {
_vm->_screen->setPalette(NULL, 0, kNumColors);
_vm->_anims->drawScene(_vm->_screen->getSurface());
_vm->_screen->copyToScreen();
- fadePalette(false);
// Run the program for the gate the dragon came through
debugC(6, kDraciLogicDebugLevel, "Running program for gate %d", _newGate);
@@ -1427,17 +1479,6 @@ void Game::enterNewRoom() {
// Don't immediately switch to the map or inventory even if the mouse
// position tell us to.
_mouseChangeTick = kMouseDoNotSwitch;
-
- // Set cursor state
- // Need to do this after we set the palette since the cursors use it
- if (_currentRoom._mouseOn) {
- debugC(6, kDraciLogicDebugLevel, "Mouse: ON");
- _vm->_mouse->cursorOn();
- _vm->_mouse->setCursorType(kNormalCursor);
- } else {
- debugC(6, kDraciLogicDebugLevel, "Mouse: OFF");
- _vm->_mouse->cursorOff();
- }
}
void Game::positionAnimAsHero(Animation *anim) {
@@ -1553,7 +1594,7 @@ Game::~Game() {
delete[] _items;
}
-void Game::DoSync(Common::Serializer &s) {
+void Game::DoSync(Common::Serializer &s, uint8 saveVersion) {
s.syncAsUint16LE(_currentRoom._roomNum);
for (uint i = 0; i < _info._numObjects; ++i) {
@@ -1584,6 +1625,25 @@ void Game::DoSync(Common::Serializer &s) {
s.syncAsSint16LE(_dialogueVars[i]);
}
+ if(saveVersion >= 2) {
+ setPositionLoaded(true);
+ if (s.isSaving()) {
+ s.syncAsSint16LE(_hero.x);
+ s.syncAsSint16LE(_hero.y);
+
+ int handItemID = _currentItem ? _currentItem->_absNum : -1;
+ s.syncAsSint16LE(handItemID);
+ } else {
+ s.syncAsSint16LE(_heroLoading.x);
+ s.syncAsSint16LE(_heroLoading.y);
+
+ int handItemID = -1;
+ s.syncAsSint16LE(handItemID);
+ _currentItem = getItem(handItemID);
+ }
+ } else {
+ _currentItem = nullptr;
+ }
}
static double real_to_double(byte real[6]) {
diff --git a/engines/draci/game.h b/engines/draci/game.h
index 47821fcf86..53a472a552 100644
--- a/engines/draci/game.h
+++ b/engines/draci/game.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -215,6 +215,7 @@ public:
void walkHero(int x, int y, SightDirection dir); // start walking and leave callback as is
void setHeroPosition(const Common::Point &p);
const Common::Point &getHeroPosition() const { return _hero; }
+ const Common::Point &getHeroLoadingPosition() const { return _heroLoading; }
void positionAnimAsHero(Animation *anim);
void positionHeroAsAnim(Animation *anim);
@@ -290,6 +291,8 @@ public:
void setExitLoop(bool exit) { _shouldExitLoop = exit; }
bool isReloaded() const { return _isReloaded; }
void setIsReloaded(bool value) { _isReloaded = value; }
+ bool isPositionLoaded() { return _isPositionLoaded; }
+ void setPositionLoaded(bool value) { _isPositionLoaded = value; }
void setSpeechTiming(uint tick, uint duration);
void shiftSpeechAndFadeTick(int delta);
@@ -327,7 +330,7 @@ public:
void setEnableSpeedText(bool value) { _enableSpeedText = value; }
bool getEnableSpeedText() const { return _enableSpeedText; }
- void DoSync(Common::Serializer &s);
+ void DoSync(Common::Serializer &s, uint8 saveVersion);
private:
void updateOrdinaryCursor();
@@ -352,6 +355,8 @@ private:
GameInfo _info;
Common::Point _hero;
+ Common::Point _heroLoading;
+ Common::Point _lastTarget;
int *_variables;
Person *_persons;
@@ -395,6 +400,7 @@ private:
bool _shouldQuit;
bool _shouldExitLoop;
bool _isReloaded;
+ bool _isPositionLoaded;
uint _speechTick;
uint _speechDuration;
@@ -408,6 +414,7 @@ private:
int _fadePhases;
int _fadePhase;
uint _fadeTick;
+ bool _isFadeOut;
int _mouseChangeTick;
bool _enableQuickHero;
diff --git a/engines/draci/module.mk b/engines/draci/module.mk
index e6c9511687..9bac1d9ddc 100644
--- a/engines/draci/module.mk
+++ b/engines/draci/module.mk
@@ -1,5 +1,5 @@
MODULE := engines/draci
-
+
MODULE_OBJS := \
animation.o \
barchive.o \
@@ -17,11 +17,11 @@ MODULE_OBJS := \
sprite.o \
surface.o \
walking.o
-
+
# This module can be built as a plugin
ifeq ($(ENABLE_DRACI), DYNAMIC_PLUGIN)
PLUGIN := 1
endif
-
-# Include common rules
+
+# Include common rules
include $(srcdir)/rules.mk
diff --git a/engines/draci/mouse.cpp b/engines/draci/mouse.cpp
index 90c04ed4c3..6bbdee787f 100644
--- a/engines/draci/mouse.cpp
+++ b/engines/draci/mouse.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/draci/mouse.h b/engines/draci/mouse.h
index b934475ade..8806bd942d 100644
--- a/engines/draci/mouse.h
+++ b/engines/draci/mouse.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/draci/music.cpp b/engines/draci/music.cpp
index 3179c79ca4..cda2007a8e 100644
--- a/engines/draci/music.cpp
+++ b/engines/draci/music.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/draci/music.h b/engines/draci/music.h
index 62288a01dc..a3010c93ce 100644
--- a/engines/draci/music.h
+++ b/engines/draci/music.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/draci/saveload.cpp b/engines/draci/saveload.cpp
index e3551c78b3..3e7f8651c1 100644
--- a/engines/draci/saveload.cpp
+++ b/engines/draci/saveload.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -45,7 +45,8 @@ bool readSavegameHeader(Common::InSaveFile *in, DraciSavegameHeader &header) {
return false;
header.version = in->readByte();
- if (header.version != DRACI_SAVEGAME_VERSION)
+ // Version 1 is compatible with Version 2
+ if (header.version > DRACI_SAVEGAME_VERSION)
return false;
// Read in the string
@@ -106,7 +107,7 @@ Common::Error saveSavegameData(int saveGameIdx, const Common::String &saveName,
} else {
// Create the remainder of the savegame
Common::Serializer s(NULL, f);
- vm._game->DoSync(s);
+ vm._game->DoSync(s, header.version);
f->finalize();
delete f;
@@ -140,7 +141,7 @@ Common::Error loadSavegameData(int saveGameIdx, DraciEngine *vm) {
// Synchronise the remaining data of the savegame
Common::Serializer s(f, NULL);
- vm->_game->DoSync(s);
+ vm->_game->DoSync(s, header.version);
delete f;
// Post-processing
diff --git a/engines/draci/saveload.h b/engines/draci/saveload.h
index 3cc13701db..6f951a3409 100644
--- a/engines/draci/saveload.h
+++ b/engines/draci/saveload.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -29,7 +29,7 @@
namespace Draci {
-#define DRACI_SAVEGAME_VERSION 1
+#define DRACI_SAVEGAME_VERSION 2
struct DraciSavegameHeader {
uint8 version;
diff --git a/engines/draci/screen.cpp b/engines/draci/screen.cpp
index e43e367300..2434a1312e 100644
--- a/engines/draci/screen.cpp
+++ b/engines/draci/screen.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/draci/screen.h b/engines/draci/screen.h
index 5a8297feba..55d2a9c171 100644
--- a/engines/draci/screen.h
+++ b/engines/draci/screen.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/draci/script.cpp b/engines/draci/script.cpp
index 8ff60033ed..09c74f5e0d 100644
--- a/engines/draci/script.cpp
+++ b/engines/draci/script.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -41,65 +41,65 @@ namespace Draci {
void Script::setupCommandList() {
/** A table of all the commands the game player uses */
static const GPL2Command gplCommands[] = {
- { 0, 0, "gplend", 0, { }, NULL },
- { 0, 1, "exit", 0, { }, NULL },
- { 1, 1, "goto", 1, { kGPL2Ident }, &Script::c_Goto },
- { 2, 1, "Let", 2, { kGPL2Ident, kGPL2Math }, &Script::c_Let },
- { 3, 1, "if", 2, { kGPL2Math, kGPL2Ident }, &Script::c_If },
- { 4, 1, "Start", 2, { kGPL2Ident, kGPL2Str }, &Script::start },
- { 5, 1, "Load", 2, { kGPL2Ident, kGPL2Str }, &Script::load },
- { 5, 2, "StartPlay", 2, { kGPL2Ident, kGPL2Str }, &Script::startPlay },
- { 5, 3, "JustTalk", 0, { }, &Script::justTalk },
- { 5, 4, "JustStay", 0, { }, &Script::justStay },
- { 6, 1, "Talk", 2, { kGPL2Ident, kGPL2Str }, &Script::talk },
- { 7, 1, "ObjStat", 2, { kGPL2Ident, kGPL2Ident }, &Script::objStat },
- { 7, 2, "ObjStat_On", 2, { kGPL2Ident, kGPL2Ident }, &Script::objStatOn },
- { 8, 1, "IcoStat", 2, { kGPL2Ident, kGPL2Ident }, &Script::icoStat },
- { 9, 1, "Dialogue", 1, { kGPL2Str }, &Script::dialogue },
- { 9, 2, "ExitDialogue", 0, { }, &Script::exitDialogue },
- { 9, 3, "ResetDialogue", 0, { }, &Script::resetDialogue },
- { 9, 4, "ResetDialogueFrom", 0, { }, &Script::resetDialogueFrom },
- { 9, 5, "ResetBlock", 1, { kGPL2Ident }, &Script::resetBlock },
- { 10, 1, "WalkOn", 3, { kGPL2Num, kGPL2Num, kGPL2Ident }, &Script::walkOn },
- { 10, 2, "StayOn", 3, { kGPL2Num, kGPL2Num, kGPL2Ident }, &Script::stayOn },
- { 10, 3, "WalkOnPlay", 3, { kGPL2Num, kGPL2Num, kGPL2Ident }, &Script::walkOnPlay },
- { 11, 1, "LoadPalette", 1, { kGPL2Str }, &Script::loadPalette },
- { 12, 1, "SetPalette", 0, { }, &Script::setPalette },
- { 12, 2, "BlackPalette", 0, { }, &Script::blackPalette },
- { 13, 1, "FadePalette", 3, { kGPL2Num, kGPL2Num, kGPL2Num }, &Script::fadePalette },
- { 13, 2, "FadePalettePlay", 3, { kGPL2Num, kGPL2Num, kGPL2Num }, &Script::fadePalettePlay },
- { 14, 1, "NewRoom", 2, { kGPL2Ident, kGPL2Num }, &Script::newRoom },
- { 15, 1, "ExecInit", 1, { kGPL2Ident }, &Script::execInit },
- { 15, 2, "ExecLook", 1, { kGPL2Ident }, &Script::execLook },
- { 15, 3, "ExecUse", 1, { kGPL2Ident }, &Script::execUse },
- { 18, 1, "LoadMusic", 1, { kGPL2Str }, &Script::loadMusic },
- { 18, 2, "StartMusic", 0, { }, &Script::startMusic },
- { 18, 3, "StopMusic", 0, { }, &Script::stopMusic },
- { 19, 1, "Mark", 0, { }, &Script::mark },
- { 19, 2, "Release", 0, { }, &Script::release },
- { 20, 1, "Play", 0, { }, &Script::play },
- { 21, 1, "LoadMap", 1, { kGPL2Str }, &Script::loadMap },
- { 21, 2, "RoomMap", 0, { }, &Script::roomMap },
- { 22, 1, "DisableQuickHero", 0, { }, &Script::disableQuickHero },
- { 22, 2, "EnableQuickHero", 0, { }, &Script::enableQuickHero },
- { 23, 1, "DisableSpeedText", 0, { }, &Script::disableSpeedText },
- { 23, 2, "EnableSpeedText", 0, { }, &Script::enableSpeedText },
- { 24, 1, "QuitGame", 0, { }, &Script::quitGame },
- { 25, 1, "PushNewRoom", 0, { }, &Script::pushNewRoom },
- { 25, 2, "PopNewRoom", 0, { }, &Script::popNewRoom },
+ { 0, 0, "gplend", 0, { }, NULL },
+ { 0, 1, "exit", 0, { }, NULL },
+ { 1, 1, "goto", 1, { kGPL2Ident }, &Script::c_Goto },
+ { 2, 1, "Let", 2, { kGPL2Ident, kGPL2Math }, &Script::c_Let },
+ { 3, 1, "if", 2, { kGPL2Math, kGPL2Ident }, &Script::c_If },
+ { 4, 1, "Start", 2, { kGPL2Ident, kGPL2Str }, &Script::start },
+ { 5, 1, "Load", 2, { kGPL2Ident, kGPL2Str }, &Script::load },
+ { 5, 2, "StartPlay", 2, { kGPL2Ident, kGPL2Str }, &Script::startPlay },
+ { 5, 3, "JustTalk", 0, { }, &Script::justTalk },
+ { 5, 4, "JustStay", 0, { }, &Script::justStay },
+ { 6, 1, "Talk", 2, { kGPL2Ident, kGPL2Str }, &Script::talk },
+ { 7, 1, "ObjStat", 2, { kGPL2Ident, kGPL2Ident }, &Script::objStat },
+ { 7, 2, "ObjStat_On", 2, { kGPL2Ident, kGPL2Ident }, &Script::objStatOn },
+ { 8, 1, "IcoStat", 2, { kGPL2Ident, kGPL2Ident }, &Script::icoStat },
+ { 9, 1, "Dialogue", 1, { kGPL2Str }, &Script::dialogue },
+ { 9, 2, "ExitDialogue", 0, { }, &Script::exitDialogue },
+ { 9, 3, "ResetDialogue", 0, { }, &Script::resetDialogue },
+ { 9, 4, "ResetDialogueFrom", 0, { }, &Script::resetDialogueFrom },
+ { 9, 5, "ResetBlock", 1, { kGPL2Ident }, &Script::resetBlock },
+ { 10, 1, "WalkOn", 3, { kGPL2Num, kGPL2Num, kGPL2Ident }, &Script::walkOn },
+ { 10, 2, "StayOn", 3, { kGPL2Num, kGPL2Num, kGPL2Ident }, &Script::stayOn },
+ { 10, 3, "WalkOnPlay", 3, { kGPL2Num, kGPL2Num, kGPL2Ident }, &Script::walkOnPlay },
+ { 11, 1, "LoadPalette", 1, { kGPL2Str }, &Script::loadPalette },
+ { 12, 1, "SetPalette", 0, { }, &Script::setPalette },
+ { 12, 2, "BlackPalette", 0, { }, &Script::blackPalette },
+ { 13, 1, "FadePalette", 3, { kGPL2Num, kGPL2Num, kGPL2Num }, &Script::fadePalette },
+ { 13, 2, "FadePalettePlay", 3, { kGPL2Num, kGPL2Num, kGPL2Num }, &Script::fadePalettePlay },
+ { 14, 1, "NewRoom", 2, { kGPL2Ident, kGPL2Num }, &Script::newRoom },
+ { 15, 1, "ExecInit", 1, { kGPL2Ident }, &Script::execInit },
+ { 15, 2, "ExecLook", 1, { kGPL2Ident }, &Script::execLook },
+ { 15, 3, "ExecUse", 1, { kGPL2Ident }, &Script::execUse },
+ { 18, 1, "LoadMusic", 1, { kGPL2Str }, &Script::loadMusic },
+ { 18, 2, "StartMusic", 0, { }, &Script::startMusic },
+ { 18, 3, "StopMusic", 0, { }, &Script::stopMusic },
+ { 19, 1, "Mark", 0, { }, &Script::mark },
+ { 19, 2, "Release", 0, { }, &Script::release },
+ { 20, 1, "Play", 0, { }, &Script::play },
+ { 21, 1, "LoadMap", 1, { kGPL2Str }, &Script::loadMap },
+ { 21, 2, "RoomMap", 0, { }, &Script::roomMap },
+ { 22, 1, "DisableQuickHero", 0, { }, &Script::disableQuickHero },
+ { 22, 2, "EnableQuickHero", 0, { }, &Script::enableQuickHero },
+ { 23, 1, "DisableSpeedText", 0, { }, &Script::disableSpeedText },
+ { 23, 2, "EnableSpeedText", 0, { }, &Script::enableSpeedText },
+ { 24, 1, "QuitGame", 0, { }, &Script::quitGame },
+ { 25, 1, "PushNewRoom", 0, { }, &Script::pushNewRoom },
+ { 25, 2, "PopNewRoom", 0, { }, &Script::popNewRoom },
// The following commands are not used in the original game files.
- { 16, 1, "RepaintInventory", 0, { }, NULL },
- { 16, 2, "ExitInventory", 0, { }, NULL },
- { 17, 1, "ExitMap", 0, { }, NULL },
- { 18, 4, "FadeOutMusic", 1, { kGPL2Num }, NULL },
- { 18, 5, "FadeInMusic", 1, { kGPL2Num }, NULL },
+ { 16, 1, "RepaintInventory", 0, { }, NULL },
+ { 16, 2, "ExitInventory", 0, { }, NULL },
+ { 17, 1, "ExitMap", 0, { }, NULL },
+ { 18, 4, "FadeOutMusic", 1, { kGPL2Num }, NULL },
+ { 18, 5, "FadeInMusic", 1, { kGPL2Num }, NULL },
// The following commands are not even defined in the game
// sources, but their numbers are allocated for internal
// purposes of the old player.
- { 26, 1, "ShowCheat", 0, { }, NULL },
- { 26, 2, "HideCheat", 0, { }, NULL },
- { 26, 3, "ClearCheat", 1, { kGPL2Num }, NULL },
- { 27, 1, "FeedPassword", 3, { kGPL2Num, kGPL2Num, kGPL2Num }, NULL }
+ { 26, 1, "ShowCheat", 0, { }, NULL },
+ { 26, 2, "HideCheat", 0, { }, NULL },
+ { 26, 3, "ClearCheat", 1, { kGPL2Num }, NULL },
+ { 27, 1, "FeedPassword", 3, { kGPL2Num, kGPL2Num, kGPL2Num }, NULL }
};
/** Operators used by the mathematical evaluator */
@@ -634,8 +634,16 @@ void Script::stayOn(const Common::Array<int> &params) {
return;
}
- int x = params[0];
- int y = params[1];
+ int x, y;
+ Common::Point afterLoadingPos = _vm->_game->getHeroLoadingPosition();
+ if(_vm->_game->isPositionLoaded() == true) {
+ x = afterLoadingPos.x;
+ y = afterLoadingPos.y;
+ }
+ else {
+ x = params[0];
+ y = params[1];
+ }
SightDirection dir = static_cast<SightDirection> (params[2]);
// Jumps into the given position regardless of the walking map.
@@ -670,6 +678,11 @@ void Script::walkOnPlay(const Common::Array<int> &params) {
return;
}
+ if(_vm->_game->isPositionLoaded() == true) {
+ _vm->_game->setPositionLoaded(false);
+ return;
+ }
+
int x = params[0];
int y = params[1];
SightDirection dir = static_cast<SightDirection> (params[2]);
@@ -687,6 +700,10 @@ void Script::newRoom(const Common::Array<int> &params) {
return;
}
+ if(_vm->_game->isPositionLoaded() == true) {
+ _vm->_game->setPositionLoaded(false);
+ }
+
int room = params[0] - 1;
int gate = params[1] - 1;
diff --git a/engines/draci/script.h b/engines/draci/script.h
index 72d6f6c344..aa36a30408 100644
--- a/engines/draci/script.h
+++ b/engines/draci/script.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/draci/sound.cpp b/engines/draci/sound.cpp
index d534f46a6e..cbc9eb983d 100644
--- a/engines/draci/sound.cpp
+++ b/engines/draci/sound.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/draci/sound.h b/engines/draci/sound.h
index 358c228604..d8d19e62e2 100644
--- a/engines/draci/sound.h
+++ b/engines/draci/sound.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/draci/sprite.cpp b/engines/draci/sprite.cpp
index 9a78904d25..8b5e5a918a 100644
--- a/engines/draci/sprite.cpp
+++ b/engines/draci/sprite.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/draci/sprite.h b/engines/draci/sprite.h
index c86728914e..5831f7772e 100644
--- a/engines/draci/sprite.h
+++ b/engines/draci/sprite.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/draci/surface.cpp b/engines/draci/surface.cpp
index 4156398070..4b438880ad 100644
--- a/engines/draci/surface.cpp
+++ b/engines/draci/surface.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/draci/surface.h b/engines/draci/surface.h
index 71a3722a2a..fa2d931a43 100644
--- a/engines/draci/surface.h
+++ b/engines/draci/surface.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/draci/walking.cpp b/engines/draci/walking.cpp
index 195b968860..04cd929ac6 100644
--- a/engines/draci/walking.cpp
+++ b/engines/draci/walking.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -439,8 +439,8 @@ void WalkingState::startWalking(const Common::Point &p1, const Common::Point &p2
}
void WalkingState::setCallback(const GPL2Program *program, uint16 offset) {
- _callback = program;
- _callbackOffset = offset;
+ _callback = _callbackLast = program;
+ _callbackOffset = _callbackOffsetLast = offset;
}
void WalkingState::callback() {
@@ -452,6 +452,12 @@ void WalkingState::callback() {
const GPL2Program &originalCallback = *_callback;
_callback = NULL;
_vm->_script->runWrapper(originalCallback, _callbackOffset, true, false);
+ _callbackLast = NULL;
+ _callbackOffset = 0;
+}
+
+void WalkingState::callbackLast() {
+ setCallback(_callbackLast, _callbackOffsetLast);
}
bool WalkingState::continueWalkingOrClearPath() {
diff --git a/engines/draci/walking.h b/engines/draci/walking.h
index 7e4a3184f5..fcdef3830e 100644
--- a/engines/draci/walking.h
+++ b/engines/draci/walking.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -110,8 +110,10 @@ public:
_lastAnimPhase = 0;
_turningFinished = 0;
_callbackOffset = 0;
+ _callbackOffsetLast = 0;
+ _callbackLast = 0;
- stopWalking();
+ stopWalking();
}
~WalkingState() {}
@@ -124,6 +126,7 @@ public:
void setCallback(const GPL2Program *program, uint16 offset);
void callback();
+ void callbackLast();
bool isActive() const { return _path.size() > 0; }
@@ -157,7 +160,9 @@ private:
bool _turningFinished;
const GPL2Program *_callback;
+ const GPL2Program *_callbackLast;
uint16 _callbackOffset;
+ uint16 _callbackOffsetLast;
// Initiates turning of the dragon into the direction for the next
// segment / after walking. Returns false when there is nothing left
diff --git a/engines/drascula/actors.cpp b/engines/drascula/actors.cpp
index e0983809fa..51148bbc05 100644
--- a/engines/drascula/actors.cpp
+++ b/engines/drascula/actors.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/drascula/animation.cpp b/engines/drascula/animation.cpp
index ee981c36da..b158969f46 100644
--- a/engines/drascula/animation.cpp
+++ b/engines/drascula/animation.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/drascula/configure.engine b/engines/drascula/configure.engine
new file mode 100644
index 0000000000..b9b76638fd
--- /dev/null
+++ b/engines/drascula/configure.engine
@@ -0,0 +1,3 @@
+# This file is included from the main "configure" script
+# add_engine [name] [desc] [build-by-default] [subengines] [base games] [deps]
+add_engine drascula "Drascula: The Vampire Strikes Back" yes
diff --git a/engines/drascula/console.cpp b/engines/drascula/console.cpp
index c0d2748ec3..b545c096d0 100644
--- a/engines/drascula/console.cpp
+++ b/engines/drascula/console.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -27,7 +27,7 @@
namespace Drascula {
Console::Console(DrasculaEngine *vm) : GUI::Debugger(), _vm(vm) {
- DCmd_Register("room", WRAP_METHOD(Console, Cmd_Room));
+ registerCmd("room", WRAP_METHOD(Console, Cmd_Room));
}
Console::~Console() {
@@ -35,7 +35,7 @@ Console::~Console() {
bool Console::Cmd_Room(int argc, const char **argv) {
if (argc < 2) {
- DebugPrintf("Usage: room <number>\n");
+ debugPrintf("Usage: room <number>\n");
return true;
}
diff --git a/engines/drascula/console.h b/engines/drascula/console.h
index 894c85ff42..01a5e8cba7 100644
--- a/engines/drascula/console.h
+++ b/engines/drascula/console.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/drascula/converse.cpp b/engines/drascula/converse.cpp
index b3749445ec..48317289d5 100644
--- a/engines/drascula/converse.cpp
+++ b/engines/drascula/converse.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/drascula/detection.cpp b/engines/drascula/detection.cpp
index 1917bc879d..833363669d 100644
--- a/engines/drascula/detection.cpp
+++ b/engines/drascula/detection.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/drascula/drascula.cpp b/engines/drascula/drascula.cpp
index d25b37d18d..35461f1d71 100644
--- a/engines/drascula/drascula.cpp
+++ b/engines/drascula/drascula.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -115,6 +115,58 @@ DrasculaEngine::DrasculaEngine(OSystem *syst, const DrasculaGameDescription *gam
_roomActionsSize = 0;
_talkSequencesSize = 0;
_numLangs = 0;
+ feetHeight = 0;
+ floorX1 = 0;
+ floorY1 = 0;
+ floorX2 = 0;
+ floorY2 = 0;
+ lowerLimit = 0;
+ upperLimit = 0;
+ trackFinal = 0;
+ walkToObject = 0;
+ objExit = 0;
+ _startTime = 0;
+ hasAnswer = 0;
+ savedTime = 0;
+ breakOut = 0;
+ vonBraunX = 0;
+ trackVonBraun = 0;
+ vonBraunHasMoved = 0;
+ newHeight = 0;
+ newWidth = 0;
+ color_solo = 0;
+ igorX = 0;
+ igorY = 0;
+ trackIgor = 0;
+ drasculaX = 0;
+ drasculaY = 0;
+ trackDrascula = 0;
+ _roomNumber = 0;
+ numRoomObjs = 0;
+ takeObject = 0;
+ pickedObject = 0;
+ _subtitlesDisabled = 0;
+ _menuBar = 0;
+ _menuScreen = 0;
+ _hasName = 0;
+ curExcuseLook = 0;
+ curExcuseAction = 0;
+ frame_y = 0;
+ curX = 0;
+ curY = 0;
+ characterMoved = 0;
+ curDirection = 0;
+ trackProtagonist = 0;
+ _characterFrame = 0;
+ hare_se_ve = 0;
+ roomX = 0;
+ roomY = 0;
+ checkFlags = 0;
+ doBreak = 0;
+ stepX = 0;
+ stepY = 0;
+ curHeight = 0;
+ curWidth = 0;
_color = 0;
blinking = 0;
@@ -124,6 +176,20 @@ DrasculaEngine::DrasculaEngine(OSystem *syst, const DrasculaGameDescription *gam
_rightMouseButton = 0;
*textName = 0;
+ crosshairCursor = 0;
+ mouseCursor = 0;
+ bgSurface = 0;
+ backSurface = 0;
+ cursorSurface = 0;
+ drawSurface3 = 0;
+ drawSurface2 = 0;
+ tableSurface = 0;
+ extraSurface = 0;
+ screenSurface = 0;
+ frontSurface = 0;
+ previousMusic = 0;
+ roomMusic = 0;
+
_rnd = new Common::RandomSource("drascula");
_console = 0;
@@ -798,6 +864,11 @@ void DrasculaEngine::updateEvents() {
#endif
switch (event.type) {
case Common::EVENT_KEYDOWN:
+ if (event.kbd.keycode == Common::KEYCODE_d && event.kbd.hasFlags(Common::KBD_CTRL)) {
+ // Start the debugger
+ getDebugger()->attach();
+ getDebugger()->onFrame();
+ }
addKeyToBuffer(event.kbd);
break;
case Common::EVENT_KEYUP:
diff --git a/engines/drascula/drascula.h b/engines/drascula/drascula.h
index 944191b5fb..762add50a5 100644
--- a/engines/drascula/drascula.h
+++ b/engines/drascula/drascula.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -38,6 +38,8 @@
#include "engines/savestate.h"
+#include "drascula/console.h"
+
#include "audio/mixer.h"
#include "engines/engine.h"
@@ -313,8 +315,6 @@ static const int interf_y[] = { 51, 51, 51, 51, 83, 83, 83 };
struct RoomHandlers;
-class Console;
-
class DrasculaEngine : public Engine {
protected:
// Engine APIs
@@ -724,11 +724,12 @@ public:
void update_62_pre();
void update_102();
+ Console *_console;
+ GUI::Debugger *getDebugger() { return _console; }
+
private:
int _lang;
- Console *_console;
-
CharInfo *_charMap;
int _charMapSize;
diff --git a/engines/drascula/graphics.cpp b/engines/drascula/graphics.cpp
index fe954279c3..077047a6eb 100644
--- a/engines/drascula/graphics.cpp
+++ b/engines/drascula/graphics.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/drascula/interface.cpp b/engines/drascula/interface.cpp
index f0b6d12027..07f192cd4c 100644
--- a/engines/drascula/interface.cpp
+++ b/engines/drascula/interface.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/drascula/objects.cpp b/engines/drascula/objects.cpp
index 519e919433..cd7d502194 100644
--- a/engines/drascula/objects.cpp
+++ b/engines/drascula/objects.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/drascula/palette.cpp b/engines/drascula/palette.cpp
index 500333badf..1bd9a03c14 100644
--- a/engines/drascula/palette.cpp
+++ b/engines/drascula/palette.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/drascula/resource.cpp b/engines/drascula/resource.cpp
index 95a95e3487..5e0e2fe9cc 100644
--- a/engines/drascula/resource.cpp
+++ b/engines/drascula/resource.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/drascula/rooms.cpp b/engines/drascula/rooms.cpp
index 25f3da0080..8691bd2cb4 100644
--- a/engines/drascula/rooms.cpp
+++ b/engines/drascula/rooms.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/drascula/saveload.cpp b/engines/drascula/saveload.cpp
index 61d6f0b4af..d0f16aa941 100644
--- a/engines/drascula/saveload.cpp
+++ b/engines/drascula/saveload.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/drascula/sound.cpp b/engines/drascula/sound.cpp
index 59b5e1d237..148dae76f5 100644
--- a/engines/drascula/sound.cpp
+++ b/engines/drascula/sound.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/drascula/talk.cpp b/engines/drascula/talk.cpp
index 6aabd91c6a..ed29dc5fe4 100644
--- a/engines/drascula/talk.cpp
+++ b/engines/drascula/talk.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/dreamweb/backdrop.cpp b/engines/dreamweb/backdrop.cpp
index 5ccc68704a..783c5e349a 100644
--- a/engines/dreamweb/backdrop.cpp
+++ b/engines/dreamweb/backdrop.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/dreamweb/configure.engine b/engines/dreamweb/configure.engine
new file mode 100644
index 0000000000..27506e650f
--- /dev/null
+++ b/engines/dreamweb/configure.engine
@@ -0,0 +1,3 @@
+# This file is included from the main "configure" script
+# add_engine [name] [desc] [build-by-default] [subengines] [base games] [deps]
+add_engine dreamweb "Dreamweb" yes
diff --git a/engines/dreamweb/console.cpp b/engines/dreamweb/console.cpp
index 532bf815ef..62c02b8617 100644
--- a/engines/dreamweb/console.cpp
+++ b/engines/dreamweb/console.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/dreamweb/console.h b/engines/dreamweb/console.h
index a90794e94e..5517d7ffa8 100644
--- a/engines/dreamweb/console.h
+++ b/engines/dreamweb/console.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/dreamweb/detection.cpp b/engines/dreamweb/detection.cpp
index f2e2f42216..01cfc7e506 100644
--- a/engines/dreamweb/detection.cpp
+++ b/engines/dreamweb/detection.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/dreamweb/detection_tables.h b/engines/dreamweb/detection_tables.h
index ec54484d28..cb9bebb304 100644
--- a/engines/dreamweb/detection_tables.h
+++ b/engines/dreamweb/detection_tables.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/dreamweb/dreamweb.cpp b/engines/dreamweb/dreamweb.cpp
index 08838a784a..94a2e60ef1 100644
--- a/engines/dreamweb/dreamweb.cpp
+++ b/engines/dreamweb/dreamweb.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -199,7 +199,7 @@ DreamWebEngine::DreamWebEngine(OSystem *syst, const DreamWebGameDescription *gam
_saveLoadPage = 0;
_currentSlot = 0;
_cursorPos = 0;
- _colourPos = 0;
+ _colorPos = 0;
_fadeDirection = 0;
_numToFade = 0;
_fadeCount = 0;
@@ -225,6 +225,49 @@ DreamWebEngine::DreamWebEngine(OSystem *syst, const DreamWebGameDescription *gam
_linePointer = 0;
_lineDirection = 0;
_lineLength = 0;
+
+ _subtitles = 0;
+ _foreignRelease = 0;
+ _wonGame = 0;
+ _hasSpeech = 0;
+ _roomsSample = 0;
+ _copyProtection = 0;
+
+ for (uint i = 0; i < 128; i++)
+ memset(&_setDat[i], 0, sizeof(SetObject));
+
+ for (uint i = 0; i < 80; i++)
+ memset(&_freeDat[i], 0, sizeof(DynObject));
+
+ for (uint i = 0; i < kNumExObjects; i++)
+ memset(&_exData[i], 0, sizeof(DynObject));
+
+ memset(&_vars, 0, sizeof(GameVars));
+
+ for (uint i = 0; i < 96; i++)
+ memset(&_backdropFlags[i], 0, sizeof(BackdropMapFlag));
+
+ for (uint i = 0; i < kNumReelRoutines+1; i++)
+ memset(&_reelRoutines[i], 0, sizeof(ReelRoutine));
+
+ _personData = 0;
+
+ for (uint i = 0; i < 16; i++)
+ memset(&_openInvList[i], 0, sizeof(ObjectRef));
+
+ for (uint i = 0; i < 30; i++)
+ memset(&_ryanInvList[i], 0, sizeof(ObjectRef));
+
+ for (uint i = 0; i < 11*10; i++)
+ memset(&_mapFlags[i], 0, sizeof(MapFlag));
+
+ for (uint i = 0; i < kNumChanges; i++)
+ memset(&_listOfChanges[i], 0, sizeof(Change));
+
+ _currentCharset = 0;
+
+ for (uint i = 0; i < 36; i++)
+ memset(&_pathData[i], 0, sizeof(RoomPaths));
}
DreamWebEngine::~DreamWebEngine() {
diff --git a/engines/dreamweb/dreamweb.h b/engines/dreamweb/dreamweb.h
index 5746568e4e..e39f8c0d51 100644
--- a/engines/dreamweb/dreamweb.h
+++ b/engines/dreamweb/dreamweb.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -110,6 +110,8 @@ protected:
virtual Common::Error run();
virtual bool hasFeature(EngineFeature f) const;
+ GUI::Debugger *getDebugger() { return _console; }
+
public:
DreamWebEngine(OSystem *syst, const DreamWebGameDescription *gameDesc);
virtual ~DreamWebEngine();
@@ -144,8 +146,6 @@ public:
bool loadSpeech(const Common::String &filename);
- void enableSavingOrLoading(bool enable = true) { _enableSavingOrLoading = enable; }
-
Common::Language getLanguage() const;
uint8 modifyChar(uint8 c) const;
Common::String modifyFileName(const char *);
@@ -171,7 +171,6 @@ private:
uint _speed;
bool _turbo;
uint _oldMouseState;
- bool _enableSavingOrLoading;
protected:
GameVars _vars; // saved variables
@@ -416,7 +415,7 @@ public:
uint8 _saveLoadPage;
uint8 _currentSlot;
uint8 _cursorPos;
- uint8 _colourPos;
+ uint8 _colorPos;
uint8 _fadeDirection;
uint8 _numToFade;
uint8 _fadeCount;
@@ -516,8 +515,8 @@ public:
int findCommand(const char *const cmdList[]);
// from newplace.cpp
- void getUnderCentre();
- void putUnderCentre();
+ void getUnderCenter();
+ void putUnderCenter();
void showArrows();
uint8 getLocation(uint8 index);
void setLocation(uint8 index);
@@ -997,7 +996,7 @@ public:
void useDryer();
void callEdensDLift();
void callEdensLift();
- void openYourNeighbour();
+ void openYourNeighbor();
void openRyan();
void openPoolBoss();
void openEden();
diff --git a/engines/dreamweb/keypad.cpp b/engines/dreamweb/keypad.cpp
index 7bbca2b979..50e452eb82 100644
--- a/engines/dreamweb/keypad.cpp
+++ b/engines/dreamweb/keypad.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/dreamweb/monitor.cpp b/engines/dreamweb/monitor.cpp
index 108f9d2b60..5f0566c8ba 100644
--- a/engines/dreamweb/monitor.cpp
+++ b/engines/dreamweb/monitor.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/dreamweb/mouse.cpp b/engines/dreamweb/mouse.cpp
index 77d907611d..fe5c580738 100644
--- a/engines/dreamweb/mouse.cpp
+++ b/engines/dreamweb/mouse.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/dreamweb/newplace.cpp b/engines/dreamweb/newplace.cpp
index 6b1f9d097b..3834a114e5 100644
--- a/engines/dreamweb/newplace.cpp
+++ b/engines/dreamweb/newplace.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -113,7 +113,7 @@ void DreamWebEngine::lookAtPlace() {
delPointer();
delTextLine();
- getUnderCentre();
+ getUnderCenter();
showFrame(_newplaceGraphics3, 60, 72, 0, 0);
showFrame(_newplaceGraphics3, 60, 72 + 55, 4, 0);
if (_foreignRelease)
@@ -127,15 +127,15 @@ void DreamWebEngine::lookAtPlace() {
hangOnP(500);
_pointerMode = 0;
_pointerFrame = 0;
- putUnderCentre();
+ putUnderCenter();
workToScreenM();
}
-void DreamWebEngine::getUnderCentre() {
+void DreamWebEngine::getUnderCenter() {
multiGet(_mapStore, 58, 72, 254, 110);
}
-void DreamWebEngine::putUnderCentre() {
+void DreamWebEngine::putUnderCenter() {
multiPut(_mapStore, 58, 72, 254, 110);
}
diff --git a/engines/dreamweb/object.cpp b/engines/dreamweb/object.cpp
index bee3a6d511..181987d721 100644
--- a/engines/dreamweb/object.cpp
+++ b/engines/dreamweb/object.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/dreamweb/pathfind.cpp b/engines/dreamweb/pathfind.cpp
index 64cffde4de..8351a3798a 100644
--- a/engines/dreamweb/pathfind.cpp
+++ b/engines/dreamweb/pathfind.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/dreamweb/people.cpp b/engines/dreamweb/people.cpp
index 53f04d482b..6e47513a21 100644
--- a/engines/dreamweb/people.cpp
+++ b/engines/dreamweb/people.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/dreamweb/print.cpp b/engines/dreamweb/print.cpp
index bec58322d5..c119f284cc 100644
--- a/engines/dreamweb/print.cpp
+++ b/engines/dreamweb/print.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/dreamweb/rain.cpp b/engines/dreamweb/rain.cpp
index b636b7def7..4f68811a3e 100644
--- a/engines/dreamweb/rain.cpp
+++ b/engines/dreamweb/rain.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/dreamweb/saveload.cpp b/engines/dreamweb/saveload.cpp
index 8a0791d19b..ce89dae732 100644
--- a/engines/dreamweb/saveload.cpp
+++ b/engines/dreamweb/saveload.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/dreamweb/sound.cpp b/engines/dreamweb/sound.cpp
index 570f76f2f9..d3b417de90 100644
--- a/engines/dreamweb/sound.cpp
+++ b/engines/dreamweb/sound.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/dreamweb/sound.h b/engines/dreamweb/sound.h
index 1ab06dc694..6553a81b62 100644
--- a/engines/dreamweb/sound.h
+++ b/engines/dreamweb/sound.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/dreamweb/sprite.cpp b/engines/dreamweb/sprite.cpp
index 1fa2e7d6a4..633db73bcd 100644
--- a/engines/dreamweb/sprite.cpp
+++ b/engines/dreamweb/sprite.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/dreamweb/structs.h b/engines/dreamweb/structs.h
index 24b67e317a..cc300e8931 100644
--- a/engines/dreamweb/structs.h
+++ b/engines/dreamweb/structs.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/dreamweb/stubs.cpp b/engines/dreamweb/stubs.cpp
index 057a0c847a..68b223392c 100644
--- a/engines/dreamweb/stubs.cpp
+++ b/engines/dreamweb/stubs.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -2566,14 +2566,14 @@ void DreamWebEngine::showGun() {
greyscaleSum();
_fadeDirection = 1;
_fadeCount = 63;
- _colourPos = 0;
+ _colorPos = 0;
_numToFade = 128;
hangOn(130);
endPalToStart();
clearEndPal();
_fadeDirection = 1;
_fadeCount = 63;
- _colourPos = 0;
+ _colorPos = 0;
_numToFade = 128;
hangOn(200);
_roomsSample = 34;
@@ -2749,7 +2749,7 @@ void DreamWebEngine::entryAnims() {
// Make doors open
removeSetObject(4);
placeSetObject(5);
- } else if (_vars._location == 47) { // Dream centre
+ } else if (_vars._location == 47) { // Dream center
placeSetObject(4);
placeSetObject(5);
} else if (_vars._location == 38) { // Car park
diff --git a/engines/dreamweb/talk.cpp b/engines/dreamweb/talk.cpp
index 2629c23355..8bb469b8fd 100644
--- a/engines/dreamweb/talk.cpp
+++ b/engines/dreamweb/talk.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/dreamweb/titles.cpp b/engines/dreamweb/titles.cpp
index 4e4faa75a0..bd0957c1bd 100644
--- a/engines/dreamweb/titles.cpp
+++ b/engines/dreamweb/titles.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/dreamweb/use.cpp b/engines/dreamweb/use.cpp
index 476f847c40..c393fa1173 100644
--- a/engines/dreamweb/use.cpp
+++ b/engines/dreamweb/use.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -73,7 +73,7 @@ void DreamWebEngine::useRoutine() {
{ &DreamWebEngine::openLouis, "ENTA" },
{ &DreamWebEngine::openRyan, "ENTB" },
{ &DreamWebEngine::openPoolBoss, "ENTE" },
- { &DreamWebEngine::openYourNeighbour, "ENTC" },
+ { &DreamWebEngine::openYourNeighbor, "ENTC" },
{ &DreamWebEngine::openEden, "ENTD" },
{ &DreamWebEngine::openSarters, "ENTH" },
{ &DreamWebEngine::wearWatch, "WWAT" },
@@ -458,7 +458,7 @@ void DreamWebEngine::callEdensDLift() {
}
}
-void DreamWebEngine::openYourNeighbour() {
+void DreamWebEngine::openYourNeighbor() {
enterCode(255, 255, 255, 255);
_getBack = 1;
}
diff --git a/engines/dreamweb/vgafades.cpp b/engines/dreamweb/vgafades.cpp
index d1e2480f70..65930aef7d 100644
--- a/engines/dreamweb/vgafades.cpp
+++ b/engines/dreamweb/vgafades.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -72,11 +72,11 @@ void DreamWebEngine::doFade() {
return;
processEvents();
- uint8 *src = _startPal + 3 * _colourPos;
- setPalette(src, _colourPos, _numToFade);
+ uint8 *src = _startPal + 3 * _colorPos;
+ setPalette(src, _colorPos, _numToFade);
- _colourPos += _numToFade;
- if (_colourPos == 0)
+ _colorPos += _numToFade;
+ if (_colorPos == 0)
fadeCalculation();
}
@@ -109,7 +109,7 @@ void DreamWebEngine::fadeUpYellows() {
memset(_endPal + 246 * 3, 0, 1 * 3);
_fadeDirection = 1;
_fadeCount = 63;
- _colourPos = 0;
+ _colorPos = 0;
_numToFade = 128;
hangOn(128);
}
@@ -121,7 +121,7 @@ void DreamWebEngine::fadeUpMonFirst() {
memset(_startPal + 246 * 3, 0, 1 * 3);
_fadeDirection = 1;
_fadeCount = 63;
- _colourPos = 0;
+ _colorPos = 0;
_numToFade = 128;
hangOn(64);
_sound->playChannel1(26);
@@ -136,7 +136,7 @@ void DreamWebEngine::fadeDownMon() {
memset(_endPal + 246 * 3, 0, 1 * 3);
_fadeDirection = 1;
_fadeCount = 63;
- _colourPos = 0;
+ _colorPos = 0;
_numToFade = 128;
hangOn(64);
}
@@ -148,7 +148,7 @@ void DreamWebEngine::fadeUpMon() {
memset(_startPal + 246 * 3, 0, 1 * 3);
_fadeDirection = 1;
_fadeCount = 63;
- _colourPos = 0;
+ _colorPos = 0;
_numToFade = 128;
hangOn(128);
}
@@ -166,7 +166,7 @@ void DreamWebEngine::fadeScreenUp() {
palToEndPal();
_fadeDirection = 1;
_fadeCount = 63;
- _colourPos = 0;
+ _colorPos = 0;
_numToFade = 128;
}
@@ -175,7 +175,7 @@ void DreamWebEngine::fadeScreenUps() {
palToEndPal();
_fadeDirection = 1;
_fadeCount = 63;
- _colourPos = 0;
+ _colorPos = 0;
_numToFade = 64;
}
@@ -184,7 +184,7 @@ void DreamWebEngine::fadeScreenUpHalf() {
palToEndPal();
_fadeDirection = 1;
_fadeCount = 31;
- _colourPos = 0;
+ _colorPos = 0;
_numToFade = 32;
}
@@ -193,7 +193,7 @@ void DreamWebEngine::fadeScreenDown() {
clearEndPal();
_fadeDirection = 1;
_fadeCount = 63;
- _colourPos = 0;
+ _colorPos = 0;
_numToFade = 128;
}
@@ -202,7 +202,7 @@ void DreamWebEngine::fadeScreenDowns() {
clearEndPal();
_fadeDirection = 1;
_fadeCount = 63;
- _colourPos = 0;
+ _colorPos = 0;
_numToFade = 64;
}
@@ -222,7 +222,7 @@ void DreamWebEngine::fadeScreenDownHalf() {
_fadeDirection = 1;
_fadeCount = 31;
- _colourPos = 0;
+ _colorPos = 0;
_numToFade = 32;
}
diff --git a/engines/dreamweb/vgagrafx.cpp b/engines/dreamweb/vgagrafx.cpp
index d8984d312b..c59d3e3ad5 100644
--- a/engines/dreamweb/vgagrafx.cpp
+++ b/engines/dreamweb/vgagrafx.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -23,7 +23,7 @@
#include "dreamweb/dreamweb.h"
#include "engines/util.h"
#include "graphics/surface.h"
-#include "graphics/decoders/pcx.h"
+#include "image/pcx.h"
namespace DreamWeb {
@@ -161,7 +161,7 @@ void DreamWebEngine::showPCX(const Common::String &suffix) {
return;
}
- Graphics::PCXDecoder pcx;
+ Image::PCXDecoder pcx;
if (!pcx.loadStream(pcxFile)) {
warning("showpcx: Could not process '%s'", name.c_str());
return;
@@ -235,7 +235,7 @@ void DreamWebEngine::showFrame(const GraphicsFile &frameData, uint16 x, uint16 y
void DreamWebEngine::showFrameInternal(const uint8 *pSrc, uint16 x, uint16 y, uint8 effectsFlag, uint8 width, uint8 height) {
if (effectsFlag) {
- if (effectsFlag & 128) { //centred
+ if (effectsFlag & 128) { //centered
x -= width / 2;
y -= height / 2;
}
diff --git a/engines/engine.cpp b/engines/engine.cpp
index c84404cc68..c63437f800 100644
--- a/engines/engine.cpp
+++ b/engines/engine.cpp
@@ -17,6 +17,7 @@
* You should have received a copy of the GNU General Public 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_getcwd
@@ -154,6 +155,10 @@ Engine::~Engine() {
CursorMan.popCursorPalette();
}
+void Engine::initializePath(const Common::FSNode &gamePath) {
+ SearchMan.addDirectory(gamePath.getPath(), gamePath, 0, 4);
+}
+
void initCommonGFX(bool defaultTo1XScaler) {
const Common::ConfigManager::Domain *transientDomain = ConfMan.getDomain(Common::ConfigManager::kTransientDomain);
const Common::ConfigManager::Domain *gameDomain = ConfMan.getActiveDomain();
@@ -183,7 +188,7 @@ void initCommonGFX(bool defaultTo1XScaler) {
g_system->setGraphicsMode(gfxMode.c_str());
// HACK: For OpenGL modes, we will still honor the graphics scale override
- if (defaultTo1XScaler && (gfxMode.equalsIgnoreCase("gl1") || gfxMode.equalsIgnoreCase("gl2") || gfxMode.equalsIgnoreCase("gl4")))
+ if (defaultTo1XScaler && (gfxMode.equalsIgnoreCase("opengl_linear") || gfxMode.equalsIgnoreCase("opengl_nearest")))
g_system->resetGraphicsScale();
}
}
diff --git a/engines/engine.h b/engines/engine.h
index 4f4223384a..e325cc1ba2 100644
--- a/engines/engine.h
+++ b/engines/engine.h
@@ -17,6 +17,7 @@
* You should have received a copy of the GNU General Public 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 ENGINES_ENGINE_H
@@ -37,6 +38,7 @@ class Error;
class EventManager;
class SaveFileManager;
class TimerManager;
+class FSNode;
}
namespace GUI {
class Debugger;
@@ -142,6 +144,16 @@ public:
virtual ~Engine();
/**
+ * Init SearchMan according to the game path.
+ *
+ * By default it adds the directory in non-flat mode with a depth of 4 as
+ * priority 0 to SearchMan.
+ *
+ * @param gamePath The base directory of the game data.
+ */
+ virtual void initializePath(const Common::FSNode &gamePath);
+
+ /**
* Init the engine and start its main loop.
* @return returns kNoError on success, else an error code.
*/
diff --git a/engines/engines.mk b/engines/engines.mk
deleted file mode 100644
index 1d9d8fd89b..0000000000
--- a/engines/engines.mk
+++ /dev/null
@@ -1,263 +0,0 @@
-ifdef ENABLE_SCUMM
-DEFINES += -DENABLE_SCUMM=$(ENABLE_SCUMM)
-MODULES += engines/scumm
-
-ifdef ENABLE_SCUMM_7_8
-DEFINES += -DENABLE_SCUMM_7_8
-endif
-
-ifdef ENABLE_HE
-DEFINES += -DENABLE_HE
-endif
-
-endif
-
-ifdef ENABLE_AGI
-DEFINES += -DENABLE_AGI=$(ENABLE_AGI)
-MODULES += engines/agi
-endif
-
-ifdef ENABLE_AGOS
-DEFINES += -DENABLE_AGOS=$(ENABLE_AGOS)
-MODULES += engines/agos
-
-ifdef ENABLE_AGOS2
-DEFINES += -DENABLE_AGOS2
-endif
-endif
-
-ifdef ENABLE_AVALANCHE
-DEFINES += -DENABLE_AVALANCHE=$(ENABLE_AVALANCHE)
-MODULES += engines/avalanche
-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
-endif
-
-ifdef ENABLE_DRACI
-DEFINES += -DENABLE_DRACI=$(ENABLE_DRACI)
-MODULES += engines/draci
-endif
-
-ifdef ENABLE_DRASCULA
-DEFINES += -DENABLE_DRASCULA=$(ENABLE_DRASCULA)
-MODULES += engines/drascula
-endif
-
-ifdef ENABLE_DREAMWEB
-DEFINES += -DENABLE_DREAMWEB=$(ENABLE_DREAMWEB)
-MODULES += engines/dreamweb
-endif
-
-ifdef ENABLE_FULLPIPE
-DEFINES += -DENABLE_FULLPIPE=$(ENABLE_FULLPIPE)
-MODULES += engines/fullpipe
-endif
-
-ifdef ENABLE_GOB
-DEFINES += -DENABLE_GOB=$(ENABLE_GOB)
-MODULES += engines/gob
-endif
-
-ifdef ENABLE_GROOVIE
-DEFINES += -DENABLE_GROOVIE=$(ENABLE_GROOVIE)
-MODULES += engines/groovie
-
-ifdef ENABLE_GROOVIE2
-DEFINES += -DENABLE_GROOVIE2
-endif
-endif
-
-ifdef ENABLE_HOPKINS
-DEFINES += -DENABLE_HOPKINS=$(ENABLE_HOPKINS)
-MODULES += engines/hopkins
-endif
-
-ifdef ENABLE_HUGO
-DEFINES += -DENABLE_HUGO=$(ENABLE_HUGO)
-MODULES += engines/hugo
-endif
-
-ifdef ENABLE_KYRA
-DEFINES += -DENABLE_KYRA=$(ENABLE_KYRA)
-MODULES += engines/kyra
-
-ifdef ENABLE_LOL
-DEFINES += -DENABLE_LOL
-endif
-
-ifdef ENABLE_EOB
-DEFINES += -DENABLE_EOB
-endif
-endif
-
-ifdef ENABLE_LASTEXPRESS
-DEFINES += -DENABLE_LASTEXPRESS=$(ENABLE_LASTEXPRESS)
-MODULES += engines/lastexpress
-endif
-
-ifdef ENABLE_LURE
-DEFINES += -DENABLE_LURE=$(ENABLE_LURE)
-MODULES += engines/lure
-endif
-
-ifdef ENABLE_MADE
-DEFINES += -DENABLE_MADE=$(ENABLE_MADE)
-MODULES += engines/made
-endif
-
-ifdef ENABLE_MOHAWK
-DEFINES += -DENABLE_MOHAWK=$(ENABLE_MOHAWK)
-MODULES += engines/mohawk
-
-ifdef ENABLE_CSTIME
-DEFINES += -DENABLE_CSTIME
-endif
-
-ifdef ENABLE_MYST
-DEFINES += -DENABLE_MYST
-endif
-
-ifdef ENABLE_RIVEN
-DEFINES += -DENABLE_RIVEN
-endif
-endif
-
-ifdef ENABLE_NEVERHOOD
-DEFINES += -DENABLE_NEVERHOOD=$(ENABLE_NEVERHOOD)
-MODULES += engines/neverhood
-endif
-
-ifdef ENABLE_MORTEVIELLE
-DEFINES += -DENABLE_MORTEVIELLE=$(ENABLE_MORTEVIELLE)
-MODULES += engines/mortevielle
-endif
-
-ifdef ENABLE_PARALLACTION
-DEFINES += -DENABLE_PARALLACTION=$(ENABLE_PARALLACTION)
-MODULES += engines/parallaction
-endif
-
-ifdef ENABLE_PEGASUS
-DEFINES += -DENABLE_PEGASUS=$(ENABLE_PEGASUS)
-MODULES += engines/pegasus
-endif
-
-ifdef ENABLE_QUEEN
-DEFINES += -DENABLE_QUEEN=$(ENABLE_QUEEN)
-MODULES += engines/queen
-endif
-
-ifdef ENABLE_SAGA
-DEFINES += -DENABLE_SAGA=$(ENABLE_SAGA)
-MODULES += engines/saga
-
-ifdef ENABLE_IHNM
-DEFINES += -DENABLE_IHNM
-endif
-
-ifdef ENABLE_SAGA2
-DEFINES += -DENABLE_SAGA2
-endif
-endif
-
-ifdef ENABLE_SCI
-DEFINES += -DENABLE_SCI=$(ENABLE_SCI)
-MODULES += engines/sci
-
-ifdef ENABLE_SCI32
-DEFINES += -DENABLE_SCI32
-endif
-endif
-
-ifdef ENABLE_SKY
-DEFINES += -DENABLE_SKY=$(ENABLE_SKY)
-MODULES += engines/sky
-endif
-
-ifdef ENABLE_SWORD1
-DEFINES += -DENABLE_SWORD1=$(ENABLE_SWORD1)
-MODULES += engines/sword1
-endif
-
-ifdef ENABLE_SWORD2
-DEFINES += -DENABLE_SWORD2=$(ENABLE_SWORD2)
-MODULES += engines/sword2
-endif
-
-ifdef ENABLE_SWORD25
-DEFINES += -DENABLE_SWORD25=$(ENABLE_SWORD25)
-MODULES += engines/sword25
-endif
-
-ifdef ENABLE_TESTBED
-DEFINES += -DENABLE_TESTBED=$(ENABLE_TESTBED)
-MODULES += engines/testbed
-endif
-
-ifdef ENABLE_TEENAGENT
-DEFINES += -DENABLE_TEENAGENT=$(ENABLE_TEENAGENT)
-MODULES += engines/teenagent
-endif
-
-ifdef ENABLE_TINSEL
-DEFINES += -DENABLE_TINSEL=$(ENABLE_TINSEL)
-MODULES += engines/tinsel
-endif
-
-ifdef ENABLE_TOLTECS
-DEFINES += -DENABLE_TOLTECS=$(ENABLE_TOLTECS)
-MODULES += engines/toltecs
-endif
-
-ifdef ENABLE_TONY
-DEFINES += -DENABLE_TONY=$(ENABLE_TONY)
-MODULES += engines/tony
-endif
-
-ifdef ENABLE_TOON
-DEFINES += -DENABLE_TOON=$(ENABLE_TOON)
-MODULES += engines/toon
-endif
-
-ifdef ENABLE_TOUCHE
-DEFINES += -DENABLE_TOUCHE=$(ENABLE_TOUCHE)
-MODULES += engines/touche
-endif
-
-ifdef ENABLE_TSAGE
-DEFINES += -DENABLE_TSAGE=$(ENABLE_TSAGE)
-MODULES += engines/tsage
-endif
-
-ifdef ENABLE_TUCKER
-DEFINES += -DENABLE_TUCKER=$(ENABLE_TUCKER)
-MODULES += engines/tucker
-endif
-
-ifdef ENABLE_WINTERMUTE
-DEFINES += -DENABLE_WINTERMUTE=$(ENABLE_WINTERMUTE)
-MODULES += engines/wintermute
-endif
-
-ifdef ENABLE_ZVISION
-DEFINES += -DENABLE_ZVISION=$(ENABLE_ZVISION)
-MODULES += engines/zvision
-endif
diff --git a/engines/fullpipe/behavior.cpp b/engines/fullpipe/behavior.cpp
index c1fe835b81..14e9c33bdf 100644
--- a/engines/fullpipe/behavior.cpp
+++ b/engines/fullpipe/behavior.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -83,7 +83,7 @@ void BehaviorManager::updateBehaviors() {
if (!_isActive)
return;
- debug(0, "BehaviorManager::updateBehaviors()");
+ debug(4, "BehaviorManager::updateBehaviors()");
for (uint i = 0; i < _behaviors.size(); i++) {
BehaviorInfo *beh = _behaviors[i];
@@ -122,7 +122,7 @@ void BehaviorManager::updateBehaviors() {
}
void BehaviorManager::updateBehavior(BehaviorInfo *behaviorInfo, BehaviorEntry *entry) {
- debug(0, "BehaviorManager::updateBehavior() %d", entry->_itemsCount);
+ debug(4, "BehaviorManager::updateBehavior() %d", entry->_itemsCount);
for (int i = 0; i < entry->_itemsCount; i++) {
BehaviorEntryInfo *bhi = entry->_items[i];
if (!(bhi->_flags & 1)) {
@@ -132,7 +132,7 @@ void BehaviorManager::updateBehavior(BehaviorInfo *behaviorInfo, BehaviorEntry *
mq->sendNextCommand();
bhi->_flags &= 0xFFFFFFFD;
- } else if (behaviorInfo->_counter >= bhi->_delay && bhi->_percent && g_fullpipe->_rnd->getRandomNumber(32767) <= entry->_items[i]->_percent) {
+ } else if (behaviorInfo->_counter >= bhi->_delay && bhi->_percent && g_fp->_rnd->getRandomNumber(32767) <= entry->_items[i]->_percent) {
MessageQueue *mq = new MessageQueue(bhi->_messageQueue, 0, 1);
mq->sendNextCommand();
@@ -144,12 +144,12 @@ void BehaviorManager::updateBehavior(BehaviorInfo *behaviorInfo, BehaviorEntry *
}
void BehaviorManager::updateStaticAniBehavior(StaticANIObject *ani, int delay, BehaviorEntry *bhe) {
- debug(0, "BehaviorManager::updateStaticAniBehavior(%s)", transCyrillic((byte *)ani->_objectName));
+ debug(4, "BehaviorManager::updateStaticAniBehavior(%s)", transCyrillic((byte *)ani->_objectName));
MessageQueue *mq = 0;
if (bhe->_flags & 1) {
- uint rnd = g_fullpipe->_rnd->getRandomNumber(32767);
+ uint rnd = g_fp->_rnd->getRandomNumber(32767);
uint runPercent = 0;
for (int i = 0; i < bhe->_itemsCount; i++) {
if (!(bhe->_items[i]->_flags & 1) && bhe->_items[i]->_percent) {
@@ -164,7 +164,7 @@ void BehaviorManager::updateStaticAniBehavior(StaticANIObject *ani, int delay, B
for (int i = 0; i < bhe->_itemsCount; i++) {
if (!(bhe->_items[i]->_flags & 1) && delay >= bhe->_items[i]->_delay) {
if (bhe->_items[i]->_percent) {
- if (g_fullpipe->_rnd->getRandomNumber(32767) <= bhe->_items[i]->_percent) {
+ if (g_fp->_rnd->getRandomNumber(32767) <= bhe->_items[i]->_percent) {
mq = new MessageQueue(bhe->_items[i]->_messageQueue, 0, 1);
break;
}
@@ -179,6 +179,50 @@ void BehaviorManager::updateStaticAniBehavior(StaticANIObject *ani, int delay, B
}
}
+bool BehaviorManager::setBehaviorEnabled(StaticANIObject *obj, int aniId, int quId, int flag) {
+ BehaviorEntryInfo *entry = getBehaviorEntryInfoByMessageQueueDataId(obj, aniId, quId);
+
+ if (entry) {
+ if (flag)
+ entry->_flags &= 0xFFFFFFFE;
+ else
+ entry->_flags |= 1;
+ } else
+ return false;
+
+ return true;
+}
+
+void BehaviorManager::setFlagByStaticAniObject(StaticANIObject *ani, int flag) {
+ for (uint i = 0; i < _behaviors.size(); i++) {
+ BehaviorInfo *beh = _behaviors[i];
+
+ if (ani == beh->_ani) {
+ if (flag)
+ beh->_flags &= 0xfe;
+ else
+ beh->_flags |= 1;
+ }
+ }
+}
+
+BehaviorEntryInfo *BehaviorManager::getBehaviorEntryInfoByMessageQueueDataId(StaticANIObject *ani, int id1, int id2) {
+ for (uint i = 0; i < _behaviors.size(); i++) {
+ if (_behaviors[i]->_ani == ani) {
+ for (uint j = 0; j < _behaviors[i]->_bheItems.size(); j++) {
+ if (_behaviors[i]->_bheItems[j]->_staticsId == id1) {
+ for (int k = 0; k < _behaviors[i]->_bheItems[j]->_itemsCount; k++) {
+ if (_behaviors[i]->_bheItems[j]->_items[k]->_messageQueue->_dataId == id2)
+ return _behaviors[i]->_bheItems[j]->_items[k];
+ }
+ }
+ }
+ }
+ }
+
+ return 0;
+}
+
void BehaviorInfo::clear() {
_ani = 0;
_staticsId = 0;
@@ -192,7 +236,7 @@ void BehaviorInfo::clear() {
}
void BehaviorInfo::initAmbientBehavior(GameVar *var, Scene *sc) {
- debug(0, "BehaviorInfo::initAmbientBehavior(%s)", transCyrillic((byte *)var->_varName));
+ debug(4, "BehaviorInfo::initAmbientBehavior(%s)", transCyrillic((byte *)var->_varName));
clear();
_itemsCount = 1;
@@ -216,7 +260,7 @@ void BehaviorInfo::initAmbientBehavior(GameVar *var, Scene *sc) {
}
void BehaviorInfo::initObjectBehavior(GameVar *var, Scene *sc, StaticANIObject *ani) {
- debug(0, "BehaviorInfo::initObjectBehavior(%s)", transCyrillic((byte *)var->_varName));
+ debug(4, "BehaviorInfo::initObjectBehavior(%s)", transCyrillic((byte *)var->_varName));
clear();
@@ -227,11 +271,11 @@ void BehaviorInfo::initObjectBehavior(GameVar *var, Scene *sc, StaticANIObject *
if (strcmp(var->_value.stringValue, "ROOT"))
break;
- GameVar *v1 = g_fullpipe->getGameLoaderGameVar()->getSubVarByName("BEHAVIOR")->getSubVarByName(ani->getName());
+ GameVar *v1 = g_fp->getGameLoaderGameVar()->getSubVarByName("BEHAVIOR")->getSubVarByName(ani->getName());
if (v1 == var)
return;
- sc = g_fullpipe->accessScene(ani->_sceneId);
+ sc = g_fp->accessScene(ani->_sceneId);
clear();
var = v1;
_itemsCount = var->getSubVarsCount();
diff --git a/engines/fullpipe/behavior.h b/engines/fullpipe/behavior.h
index 83a548f486..1ec98d5bf2 100644
--- a/engines/fullpipe/behavior.h
+++ b/engines/fullpipe/behavior.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -77,6 +77,12 @@ class BehaviorManager : public CObject {
void updateBehaviors();
void updateBehavior(BehaviorInfo *behaviorInfo, BehaviorEntry *entry);
void updateStaticAniBehavior(StaticANIObject *ani, int delay, BehaviorEntry *beh);
+
+ bool setBehaviorEnabled(StaticANIObject *obj, int aniId, int quId, int flag);
+
+ void setFlagByStaticAniObject(StaticANIObject *ani, int flag);
+
+ BehaviorEntryInfo *getBehaviorEntryInfoByMessageQueueDataId(StaticANIObject *ani, int id1, int id2);
};
} // End of namespace Fullpipe
diff --git a/engines/fullpipe/configure.engine b/engines/fullpipe/configure.engine
new file mode 100644
index 0000000000..fce5951e26
--- /dev/null
+++ b/engines/fullpipe/configure.engine
@@ -0,0 +1,3 @@
+# This file is included from the main "configure" script
+# add_engine [name] [desc] [build-by-default] [subengines] [base games] [deps]
+add_engine fullpipe "Full Pipe" no
diff --git a/video/codecs/mjpeg.cpp b/engines/fullpipe/console.cpp
index 10fd9d7c50..dd3d1bf693 100644
--- a/video/codecs/mjpeg.cpp
+++ b/engines/fullpipe/console.cpp
@@ -8,59 +8,45 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public 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/system.h"
-#include "common/textconsole.h"
-#include "graphics/surface.h"
-#include "graphics/decoders/jpeg.h"
+#include "fullpipe/constants.h"
+#include "fullpipe/fullpipe.h"
+#include "fullpipe/gameloader.h"
+#include "fullpipe/scene.h"
-#include "video/codecs/mjpeg.h"
+namespace Fullpipe {
-namespace Common {
-class SeekableReadStream;
+Console::Console(FullpipeEngine *vm) : GUI::Debugger(), _vm(vm) {
+ registerCmd("scene", WRAP_METHOD(Console, Cmd_Scene));
}
-namespace Video {
-
-JPEGDecoder::JPEGDecoder() : Codec() {
- _pixelFormat = g_system->getScreenFormat();
- _surface = NULL;
-}
-
-JPEGDecoder::~JPEGDecoder() {
- if (_surface) {
- _surface->free();
- delete _surface;
+bool Console::Cmd_Scene(int argc, const char **argv) {
+ if (argc != 2) {
+ int sceneTag = _vm->_currentScene->_sceneId;
+ debugPrintf("Current scene: %d (scene tag: %d)\n", _vm->getSceneFromTag(sceneTag), sceneTag);
+ debugPrintf("Use %s <scene> to change the current scene\n", argv[0]);
+ return true;
+ } else {
+ int scene = _vm->convertScene(atoi(argv[1]));
+ _vm->_gameLoader->loadScene(726);
+ _vm->_gameLoader->gotoScene(726, TrubaLeft);
+
+ if (scene != 726)
+ _vm->_gameLoader->preloadScene(726, _vm->getSceneEntrance(scene));
+
+ return false;
}
}
-const Graphics::Surface *JPEGDecoder::decodeImage(Common::SeekableReadStream *stream) {
- Graphics::JPEGDecoder jpeg;
-
- if (!jpeg.loadStream(*stream)) {
- warning("Failed to decode JPEG frame");
- return 0;
- }
-
- if (_surface) {
- _surface->free();
- delete _surface;
- }
-
- _surface = jpeg.getSurface()->convertTo(_pixelFormat);
-
- return _surface;
-}
-
-} // End of namespace Video
+} // End of namespace Fullpipe
diff --git a/engines/fullpipe/console.h b/engines/fullpipe/console.h
new file mode 100644
index 0000000000..24f213a50f
--- /dev/null
+++ b/engines/fullpipe/console.h
@@ -0,0 +1,42 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public 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 FULLPIPE_CONSOLE_H
+#define FULLPIPE_CONSOLE_H
+
+namespace Fullpipe {
+
+class FullpipeEngine;
+
+class Console : public GUI::Debugger {
+public:
+ Console(FullpipeEngine *vm);
+
+private:
+ FullpipeEngine *_vm;
+
+ bool Cmd_Scene(int argc, const char **argv);
+};
+
+} // End of namespace Fullpipe
+
+#endif /* FULLPIPE_CONSOLE_H */
diff --git a/engines/fullpipe/constants.h b/engines/fullpipe/constants.h
index 796764d0a9..b257fca949 100644
--- a/engines/fullpipe/constants.h
+++ b/engines/fullpipe/constants.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -25,11 +25,12 @@
namespace Fullpipe {
-#define ANI_BOOT_1 4231
-#define ANI_IN1MAN 5110
+// Common
+#define ANI_FLY 4916
#define ANI_INV_MAP 5321
#define ANI_LIFTBUTTON 2751
#define ANI_MAN 322
+#define ANI_PBAR 896
#define MSG_CMN_WINARCADE 4778
#define MSG_DISABLESAVES 5201
#define MSG_ENABLESAVES 5202
@@ -37,21 +38,26 @@ namespace Fullpipe {
#define MSG_HMRKICK_STUCCO 4765
#define MSG_MANSHADOWSOFF 5196
#define MSG_MANSHADOWSON 5197
-#define MSG_RESTARTGAME 4767
-#define MSG_SC1_SHOWOSK 1019
-#define MSG_SC1_SHOWOSK2 468
-#define MSG_SC1_UTRUBACLICK 1100
+#define MV_FLY_FLY 4917
+#define MV_LFT_CLOSE 1053
+#define MV_LFT_OPEN 1048
#define MV_MAN_GOLADDER 451
#define MV_MAN_GOLADDER2 2844
+#define MV_MAN_HMRKICK 1028
+#define MV_MAN_HMRKICK_COINLESS 1445
+#define MV_MAN_LIFTDOWN 1052
+#define MV_MAN_LIFTUP 1051
#define MV_MAN_LOOKUP 4773
+#define rMV_MAN_LOOKUP 4775
+#define MV_MAN_TOLADDER 448
+#define MV_MAN_TOLADDER2 2841
+#define MV_MAN_STARTD 478
#define MV_MAN_STARTLADDER 452
#define MV_MAN_STARTLADDER2 2842
#define MV_MAN_STOPLADDER 454
#define MV_MAN_STOPLADDER2 2845
-#define MV_MAN_TOLADDER 448
-#define MV_MAN_TOLADDER2 2841
#define MV_MAN_TURN_LU 486
-#define PIC_CMN_EVAL 3468
+#define MV_PBAR_RUN 897
#define PIC_CSR_DEFAULT 4891
#define PIC_CSR_DEFAULT_INV 4892
#define PIC_CSR_ITN 4893
@@ -84,16 +90,95 @@ namespace Fullpipe {
#define PIC_CSR_ITN_RED 5329
#define PIC_CSR_LIFT 5176
#define PIC_CSR_MAP 5339
+#define PIC_HLP_BGR 3562
+#define PIC_IN1_GAMETITLE 5169
#define PIC_IN1_PIPETITLE 5167
#define PIC_INV_MENU 991
+#define PIC_MAP_A01 5263
+#define PIC_MAP_A02 5264
+#define PIC_MAP_A03 5265
+#define PIC_MAP_A04 5266
+#define PIC_MAP_A05 5267
+#define PIC_MAP_A06 5268
+#define PIC_MAP_A07 5269
+#define PIC_MAP_A08 5270
+#define PIC_MAP_A09 5271
+#define PIC_MAP_A10 5272
+#define PIC_MAP_A11 5273
+#define PIC_MAP_A12 5274
#define PIC_MAP_A13 5275
+#define PIC_MAP_A14 5276
+#define PIC_MAP_I01 5295
+#define PIC_MAP_I02 5296
+#define PIC_MAP_P01 5277
+#define PIC_MAP_P02 5278
+#define PIC_MAP_P03 5279
+#define PIC_MAP_P04 5280
+#define PIC_MAP_P05 5281
+#define PIC_MAP_P06 5282
+#define PIC_MAP_P07 5283
+#define PIC_MAP_P08 5284
+#define PIC_MAP_P09 5285
+#define PIC_MAP_P10 5286
+#define PIC_MAP_P11 5287
+#define PIC_MAP_P12 5288
+#define PIC_MAP_P13 5289
+#define PIC_MAP_P14 5290
+#define PIC_MAP_P15 5291
+#define PIC_MAP_P16 5292
+#define PIC_MAP_P17 5293
+#define PIC_MAP_P18 5294
#define PIC_MAP_S01 5223
-#define PIC_SC1_KUCHKA 1321
-#define PIC_SC1_LADDER 1091
-#define PIC_SC1_OSK 1018
-#define PIC_SC1_OSK2 2932
-#define PIC_SCD_SEL 734
+#define PIC_MAP_S02 5224
+#define PIC_MAP_S03 5225
+#define PIC_MAP_S04 5226
+#define PIC_MAP_S05 5227
+#define PIC_MAP_S06 5228
+#define PIC_MAP_S07 5229
+#define PIC_MAP_S08 5231
+#define PIC_MAP_S09 5230
+#define PIC_MAP_S10 5232
+#define PIC_MAP_S11 5233
+#define PIC_MAP_S12 5234
+#define PIC_MAP_S13 5235
+#define PIC_MAP_S14 5236
+#define PIC_MAP_S15 5237
+#define PIC_MAP_S16 5238
+#define PIC_MAP_S17 5239
+#define PIC_MAP_S1819 5240
+#define PIC_MAP_S20 5241
+#define PIC_MAP_S21 5242
+#define PIC_MAP_S22 5243
+#define PIC_MAP_S23_1 5244
+#define PIC_MAP_S23_2 5245
+#define PIC_MAP_S24 5246
+#define PIC_MAP_S25 5247
+#define PIC_MAP_S26 5248
+#define PIC_MAP_S27 5249
+#define PIC_MAP_S28 5250
+#define PIC_MAP_S29 5251
+#define PIC_MAP_S30 5252
+#define PIC_MAP_S31_1 5253
+#define PIC_MAP_S31_2 5254
+#define PIC_MAP_S32_1 5255
+#define PIC_MAP_S32_2 5256
+#define PIC_MAP_S33 5257
+#define PIC_MAP_S34 5258
+#define PIC_MAP_S35 5259
+#define PIC_MAP_S36 5260
+#define PIC_MAP_S37 5261
+#define PIC_MAP_S38 5262
+#define PIC_TTL_CREDITS 5172
+#define QU_INTR_STARTINTRO 5133
#define SC_1 301
+#define SC_2 302
+#define SC_3 303
+#define SC_4 304
+#define SC_5 305
+#define SC_6 649
+#define SC_7 650
+#define SC_8 651
+#define SC_9 652
#define SC_10 653
#define SC_11 654
#define SC_12 655
@@ -104,7 +189,6 @@ namespace Fullpipe {
#define SC_17 1141
#define SC_18 1142
#define SC_19 1143
-#define SC_2 302
#define SC_20 1144
#define SC_21 1546
#define SC_22 1547
@@ -115,7 +199,6 @@ namespace Fullpipe {
#define SC_27 1552
#define SC_28 2062
#define SC_29 2063
-#define SC_3 303
#define SC_30 2064
#define SC_31 2065
#define SC_32 2066
@@ -125,12 +208,6 @@ namespace Fullpipe {
#define SC_36 2070
#define SC_37 2071
#define SC_38 2072
-#define SC_4 304
-#define SC_5 305
-#define SC_6 649
-#define SC_7 650
-#define SC_8 651
-#define SC_9 652
#define SC_COMMON 321
#define SC_DBGMENU 726
#define SC_FINAL1 4999
@@ -143,37 +220,1479 @@ namespace Fullpipe {
#define SC_LDR 635
#define SC_MAINMENU 4620
#define SC_MAP 5222
-#define SC_TEST 903
#define SC_TITLES 5166
+#define SND_CMN_015 3139
#define SND_CMN_031 3516
+#define SND_CMN_032 3517
+#define SND_CMN_054 4762
+#define SND_CMN_055 4763
+#define SND_CMN_060 4921
+#define SND_CMN_061 4922
#define SND_CMN_070 5199
+#define SND_INTR_019 5220
+#define ST_EGTR_SLIMSORROW 340
+#define ST_FLY_FLY 4918
+#define ST_LBN_0H 2835
+#define ST_LBN_1H 2791
+#define ST_LBN_2H 2793
+#define ST_LBN_3H 2795
+#define ST_LBN_4H 2797
+#define ST_LBN_5H 2799
+#define ST_LBN_6H 2801
+#define ST_LBN_7H 2803
+#define ST_LBN_8H 2805
+#define ST_LBN_9H 2807
#define ST_LBN_0N 2832
-#define ST_LBN_0P 2833
#define ST_LBN_1N 2753
-#define ST_LBN_1P 2754
#define ST_LBN_2N 2756
-#define ST_LBN_2P 2757
#define ST_LBN_3N 2759
-#define ST_LBN_3P 2760
#define ST_LBN_4N 2762
-#define ST_LBN_4P 2763
#define ST_LBN_5N 2765
-#define ST_LBN_5P 2766
#define ST_LBN_6N 2768
-#define ST_LBN_6P 2769
#define ST_LBN_7N 2771
-#define ST_LBN_7P 2772
#define ST_LBN_8N 2774
-#define ST_LBN_8P 2775
#define ST_LBN_9N 2777
+#define ST_LBN_0P 2833
+#define ST_LBN_1P 2754
+#define ST_LBN_2P 2757
+#define ST_LBN_3P 2760
+#define ST_LBN_4P 2763
+#define ST_LBN_5P 2766
+#define ST_LBN_6P 2769
+#define ST_LBN_7P 2772
+#define ST_LBN_8P 2775
#define ST_LBN_9P 2778
+#define ST_LFT_CLOSED 1049
+#define ST_LFT_OPEN_NEW 1071
#define ST_MAN_EMPTY 476
+#define ST_MAN_GOU 459
#define ST_MAN_RIGHT 325
#define TrubaDown 697
#define TrubaLeft 474
-#define TrubaRight 696
#define TrubaUp 680
-#define rMV_MAN_LOOKUP 4775
+
+// Main Menu
+#define PIC_MNU_AUTHORS_L 4624
+#define PIC_MNU_CONTINUE_L 4626
+#define PIC_MNU_DEBUG_L 4632
+#define PIC_MNU_EXIT_L 4622
+#define PIC_MNU_LOAD_L 4628
+#define PIC_MNU_MUSICSLIDER_D 4914
+#define PIC_MNU_MUSICSLIDER_L 4915
+#define PIC_MNU_RESTART_L 5299
+#define PIC_MNU_SAVE_L 4630
+#define PIC_MNU_SLIDER_D 4913
+#define PIC_MNU_SLIDER_L 4912
+
+// Query dialog
+#define PIC_MEX_BGR 5300
+#define PIC_MEX_CANCEL 5302
+#define PIC_MEX_OK 5301
+#define PIC_MOV_BGR 5343
+#define PIC_MOV_CANCEL 5345
+#define PIC_MOV_OK 5344
+
+// Saveload dialog
+#define PIC_MLD_BGR 4645
+#define PIC_MLD_CANCEL_D 4648
+#define PIC_MLD_CANCEL_L 4649
+#define PIC_MLD_OK_D 4646
+#define PIC_MLD_OK_L 4647
+#define PIC_MSV_0_D 4643
+#define PIC_MSV_0_L 4644
+#define PIC_MSV_1_D 4651
+#define PIC_MSV_1_L 4660
+#define PIC_MSV_2_D 4652
+#define PIC_MSV_2_L 4661
+#define PIC_MSV_3_D 4653
+#define PIC_MSV_3_L 4662
+#define PIC_MSV_4_D 4654
+#define PIC_MSV_4_L 4663
+#define PIC_MSV_5_D 4655
+#define PIC_MSV_5_L 4664
+#define PIC_MSV_6_D 4656
+#define PIC_MSV_6_L 4665
+#define PIC_MSV_7_D 4657
+#define PIC_MSV_7_L 4666
+#define PIC_MSV_8_D 4658
+#define PIC_MSV_8_L 4667
+#define PIC_MSV_9_D 4659
+#define PIC_MSV_9_L 4668
+#define PIC_MSV_BGR 4634
+#define PIC_MSV_CANCEL_D 4637
+#define PIC_MSV_CANCEL_L 4638
+#define PIC_MSV_DOTS_D 4670
+#define PIC_MSV_DOTS_L 4669
+#define PIC_MSV_DOT_D 5188
+#define PIC_MSV_DOT_L 5189
+#define PIC_MSV_EMPTY_D 4639
+#define PIC_MSV_EMPTY_L 4640
+#define PIC_MSV_FULL_D 4641
+#define PIC_MSV_FULL_L 4642
+#define PIC_MSV_OK_D 4635
+#define PIC_MSV_OK_L 4636
+#define PIC_MSV_SPACE_D 5190
+#define PIC_MSV_SPACE_L 5191
+
+// Intro
+#define ANI_IN1MAN 5110
+#define MSG_INTR_ENDINTRO 5139
+#define MSG_INTR_GETUPMAN 5135
+#define MSG_INTR_SWITCHTO1 5145
+#define MSG_INTR_SWITCHTO2 5134
+#define MV_IN1MAN_SLEEP 5111
+#define QU_IN2_DO 5144
+#define QU_INTR_FINISH 5138
+#define QU_INTR_GETUPMAN 5136
+#define ST_IN1MAN_SLEEP 5112
+
+// Scene 1
+#define ANI_BOOT_1 4231
+#define MSG_SC1_SHOWOSK 1019
+#define MSG_SC1_SHOWOSK2 468
+#define MSG_SC1_UTRUBACLICK 1100
+#define PIC_SC1_KUCHKA 1321
+#define PIC_SC1_LADDER 1091
+#define PIC_SC1_OSK 1018
+#define PIC_SC1_OSK2 2932
+#define TrubaRight 696
+
+// Scene 2
+#define ANI_SC2_BOX 1020
+#define ANI_DADAYASHIK 306
+#define MSG_SC2_HIDELADDER 1023
+#define MSG_SC2_LADDERCLICK 1101
+#define MSG_SC2_PUTMANUP 1026
+#define MSG_SC2_SHOWLADDER 1027
+#define PIC_SC2_DTRUBA 841
+#define PIC_SC2_LADDER 412
+#define ST_DYAS_LIES 318
+
+// Scene 3
+#define ANI_DOMINO_3 2732
+#define ANI_EGGEATER 334
+#define ANI_INV_COIN 875
+#define ANI_INV_EGGAPL 1564
+#define ANI_INV_EGGBOOT 1570
+#define ANI_INV_EGGCOIN 1567
+#define ANI_INV_EGGDOM 1561
+#define ANI_INV_EGGGLS 1573
+#define MSG_LIFT_CLICKBUTTON 2780
+#define MSG_LIFT_CLOSEDOOR 5194
+#define MSG_LIFT_EXITLIFT 5187
+#define MSG_LIFT_GO 1065
+#define MSG_LIFT_STARTEXITQUEUE 5186
+#define MSG_SC3_HIDEDOMINO 3177
+#define MSG_SC3_ONTAKECOIN 5338
+#define MSG_SC3_RELEASEEGG 2681
+#define MSG_SC3_TAKEEGG 1583
+#define MSG_SC3_TESTFAT 1582
+#define MSG_SC3_UTRUBACLICK 1103
+#define MV_EGTR_FATASK 5332
+#define PIC_SC3_DOMIN 5182
+#define PIC_SC3_LADDER 1102
+#define ST_EGTR_MID1 2863
+#define ST_EGTR_MID2 2869
+#define ST_EGTR_SLIM 336
+#define QU_EGTR_MD2_SHOW 4698
+#define QU_EGTR_MD1_SHOW 4697
+#define QU_EGTR_SLIMSHOW 4883
+#define QU_SC3_ENTERLIFT 2779
+#define QU_SC3_EXITLIFT 2808
+
+// Scene 4
+#define ANI_BIGBALL 4923
+#define ANI_BUTTON 598
+#define ANI_CLOCK 588
+#define ANI_HAND 601
+#define ANI_KOZAWKA 495
+#define ANI_MAMASHA_4 660
+#define ANI_PLANK 501
+#define ANI_SC4_BOOT 1035
+#define ANI_SC4_COIN 690
+#define ANI_SPEAKER_4 3275
+#define ANI_SPRING 542
+#define MSG_GOTOLADDER 618
+#define MSG_KOZAWRESTART 546
+#define MSG_SC4_COINOUT 2895
+#define MSG_SC4_COINPUT 1032
+#define MSG_SC4_CLICKLADDER 1439
+#define MSG_SC4_DROPBOTTLE 2896
+#define MSG_SC4_HANDOVER 2960
+#define MSG_SC4_HIDEBOOT 4563
+#define MSG_SC4_KOZAWFALL 2858
+#define MSG_SC4_MANFROMBOTTLE 2854
+#define MSG_SC4_MANTOBOTTLE 2852
+#define MSG_SHAKEBOTTLE 584
+#define MSG_SHOOTKOZAW 557
+#define MSG_STARTHAND 612
+#define MSG_CLICKBOTTLE 569
+#define MSG_CLICKBUTTON 609
+#define MSG_CLICKPLANK 549
+#define MSG_LOWERPLANK 540
+#define MSG_RAISEPLANK 547
+#define MSG_SHOWCOIN 1033
+#define MSG_TAKEBOTTLE 614
+#define MSG_TAKEKOZAW 611
+#define MSG_TESTPLANK 538
+#define MSG_UPDATEBOTTLE 613
+#define MV_BTN_CLICK 599
+#define MV_CLK_GO 589
+#define MV_HND_POINT 602
+#define MV_KZW_GOR 564
+#define rMV_KZW_GOR 566
+#define MV_KZW_JUMP 558
+#define MV_KZW_JUMPROTATE 561
+#define MV_KZW_TOHOLERV 537
+#define MV_KZW_WALKPLANK 500
+#define MV_KZW_JUMPHIT 2857
+#define MV_KZW_JUMPOUT 586
+#define MV_KZW_RAISEHEAD 577
+#define MV_KZW_STANDUP 563
+#define MV_KZW_TURN 562
+#define MV_MAN_FROMLADDER 493
+#define MV_MAN_GOD 481
+#define MV_MAN_GOU 460
+#define MV_MAN_JUMPONPLANK 551
+#define MV_MAN_LOOKLADDER 520
+#define MV_MAN_PLANKTOLADDER 553
+#define MV_MAN_STARTLADDERD 457
+#define MV_PNK_WEIGHTLEFT 541
+#define MV_PNK_WEIGHTRIGHT 502
+#define MV_SC4_COIN_default 1029
+#define MV_SPK4_PLAY 3276
+#define MV_SPR_LOWER 543
+#define PIC_MAP_P03 5279
+#define PIC_SC4_BOTTLE 568
+#define PIC_SC4_BOTTLE2 2936
+#define PIC_SC4_DOWNTRUBA 619
+#define PIC_SC4_LADDER 1438
+#define PIC_SC4_LRTRUBA 616
+#define PIC_SC4_MASK 585
+#define PIC_SC4_PLANK 5183
+#define QU_BALL_WALKL 4920
+#define QU_BALL_WALKR 4919
+#define QU_HND_TAKE0 1440
+#define QU_HND_TAKE1 1441
+#define QU_HND_TAKE2 1442
+#define QU_HND_TAKEBOTTLE 1443
+#define QU_KOZAW_WALK 505
+#define QU_PNK_CLICK 550
+#define QU_SC4_GOCLOCK 595
+#define QU_SC4_MANFROMBOTTLE 2851
+#define QU_SC4_MANTOBOTTLE 2850
+#define SND_4_010 3125
+#define SND_4_012 3127
+#define SND_4_033 4990
+#define ST_CLK_CLOSED 590
+#define ST_HND_EMPTY 603
+#define ST_KZW_EMPTY 498
+#define ST_KZW_JUMPOUT 587
+#define ST_KZW_RIGHT 559
+#define ST_KZW_SIT 560
+#define ST_MAN_GOLADDER 450
+#define ST_MAN_GOLADDER2 2843
+#define MV_MAN_LOOKLADDERRV 556
+#define ST_MAN_LADDERDOWN 521
+#define ST_MAN_LOOKPLANK 555
+#define ST_MAN_ONPLANK 552
+#define ST_MAN_SIT 1164
+#define ST_MAN_STANDLADDER 453
+#define ST_MAN_UP 449
+#define ST_PNK_WEIGHTLEFT 503
+#define ST_PNK_WEIGHTRIGHT 504
+#define ST_SPR_UP 544
+
+// Scene 5
+#define ANI_BIGLUK 909
+#define ANI_HANDLE 622
+#define ANI_OTMOROZ 419
+#define MSG_SC5_BGRSOUNDOFF 5315
+#define MSG_SC5_BGRSOUNDON 5314
+#define MSG_SC5_HANDLEDOWN 916
+#define MSG_SC5_HANDLEUP 915
+#define MSG_SC5_HIDEHANDLE 917
+#define MSG_SC5_MAKEMANFLIGHT 1136
+#define MSG_SC5_MAKEOTMFEEDBACK 1169
+#define MSG_SC5_SHOWHANDLE 918
+#define MSG_SC5_TESTLUK 914
+#define MV_BLK_CLOSE 911
+#define MV_BLK_OPEN 910
+#define MV_MANHDL_HANDLEDOWN 630
+#define MV_MANHDL_HANDLEUP 631
+#define MV_OTM_BOXHANDLEDOWN 626
+#define MV_OTM_BOXHANDLEUP 627
+#define MV_OTM_HANDLEDOWN 620
+#define MV_OTM_HANDLEUP 621
+#define QU_SC5_MANBUMP 1167
+#define QU_SC5_MANFLY 1168
+#define SND_5_026 5316
+#define ST_BLK_CLOSED 912
+#define ST_BLK_OPEN 913
+#define ST_HDL_BROKEN 3342
+#define ST_HDL_DOWN 625
+#define ST_HDL_UP 624
+#define ST_OTM_BOX_LEFT 429
+#define ST_OTM_GLS_LEFT 421
+#define ST_OTM_VNT_LEFT 434
+
+// Scene 6
+#define ANI_BALLDROP 2685
+#define ANI_BUTTON_6 2988
+#define ANI_EGGIE 4929
+#define ANI_INV_HANDLE 893
+#define ANI_MAMASHA 656
+#define ANI_NEWBALL 1073
+#define MSG_SC6_BTNPUSH 1017
+#define MSG_SC6_ENABLEDROPS 687
+#define MSG_SC6_INSTHANDLE 1012
+#define MSG_SC6_JUMPBK 2900
+#define MSG_SC6_JUMPFW 2901
+#define MSG_SC6_RESTORESCROLL 2906
+#define MSG_SC6_SHOWNEXTBALL 790
+#define MSG_SC6_STARTDROPS 2897
+#define MSG_SC6_TAKEBALL 682
+#define MSG_SC6_TESTNUMBALLS 2904
+#define MSG_SC6_UTRUBACLICK 1105
+#define MSG_SPINHANDLE 2398
+#define MV_MAN6_TAKEBALL 2691
+#define MV_MAN6_THROWBALL 2692
+#define MV_MOM_CYCLEBK 3012
+#define MV_MOM_JUMPBK 662
+#define MV_MOM_JUMPFW 661
+#define MV_MOM_STARTBK 3010
+#define MV_MOM_STOPBK 3013
+#define MV_MOM_TAKE1 2885
+#define MV_MOM_TAKE2 2886
+#define MV_MOM_TAKE3 2887
+#define MV_MOM_TAKE4 2888
+#define MV_MOM_TAKE5 2889
+#define PIC_SC6_LADDER 1104
+#define QU_EGG6_GOL 4936
+#define QU_EGG6_GOR 4935
+#define QU_MOM_JUMPBK 671
+#define QU_MOM_JUMPFW 670
+#define QU_MOM_PUTBALL 2903
+#define QU_MOM_SITDOWN 685
+#define QU_MOM_STANDUP 2899
+#define QU_MOM_TOLIFT 2902
+#define QU_SC6_DROPS 2898
+#define QU_SC6_DROPS3 2955
+#define QU_SC6_ENTERLIFT 1054
+#define QU_SC6_EXITLIFT 1055
+#define QU_SC6_FALLBALL 2690
+#define QU_SC6_FALLHANDLE 2995
+#define QU_SC6_SHOWHANDLE 1689
+#define QU_SC6_SHOWNEXTBALL 2689
+#define ST_HDL_PLUGGED 2397
+#define ST_MAN6_BALL 2688
+#define ST_MOM_SITS 659
+#define ST_MOM_STANDS 658
+#define ST_NBL_NORM 1076
+
+// Scene 7
+#define ANI_CORNERSITTER 71
+#define ANI_HOOLIGAN 808
+#define ANI_LUKE 803
+#define ANI_PLUSMINUS 2938
+#define ANI_SC7_BOX 791
+#define MSG_SC7_CLOSELUKE 822
+#define MSG_SC7_HIDEBOX 817
+#define MSG_SC7_HIDELUKE 821
+#define MSG_SC7_OPENLUKE 823
+#define MSG_SC7_PULL 2943
+#define MSG_SC7_SHOWBOX 816
+#define MV_CST_CLOSELUKE 807
+#define MV_SC7_BOX_default 792
+#define QU_CST_CLOSELUKE 820
+#define ST_CST_HANDLELESS 794
+#define ST_HGN_LOOK 811
+#define ST_HGN_LUKE 810
+#define ST_LUK_CLOSED 805
+#define ST_LUK_OPEN 806
+#define ST_PMS_MINUS 2942
+#define ST_PMS_PLUS 2941
+
+// Scene 8
+#define ANI_BATUTA 737
+#define ANI_CLOCK_8 2989
+#define ANI_VMYATS 764
+#define MSG_SC8_ARCADENOW 1044
+#define MSG_SC8_ENTERUP 3037
+#define MSG_SC8_GETHIMUP 789
+#define MSG_SC8_HIDELADDER_D 1107
+#define MSG_SC8_RESUMEFLIGHT 784
+#define MSG_SC8_STANDUP 2976
+#define MSG_STARTARCADE 781
+#define MV_CLK8_GO 2990
+#define MV_MAN_FROMLADDERUP 1522
+#define MV_MAN_TOLADDERD 1524
+#define MV_MAN8_BADLUCK 783
+#define MV_MAN8_DRYGDOWN 770
+#define MV_MAN8_DRYGUP 768
+#define MV_MAN8_HANDSDOWN 772
+#define MV_MAN8_HANDSUP 777
+#define MV_MAN8_JUMP 775
+#define MV_MAN8_JUMPOFF 2969
+#define MV_MAN8_SITDOWN 2968
+#define MV_VMT_DEF 765
+#define PIC_SC8_ARCADENOW 1043
+#define PIC_SC8_LADDER 754
+#define PIC_SC8_LADDER_D 755
+#define PIC_SC8_LADDERD 1106
+#define QU_SC8_FINISH 788
+#define QU_SC8_STANDUP 2975
+#define SND_8_014 3624
+#define ST_BTT_CHESHET 746
+#define ST_BTT_NOSPOON 739
+#define ST_BTT_SLEEPS 748
+#define ST_BTT_SPOON 741
+#define ST_MAN8_FLYDOWN 771
+#define ST_MAN8_FLYUP 769
+#define ST_MAN8_HANDSUP 773
+#define ST_MAN8_STAND 774
+#define ST_VMT_MIN 766
+
+// Scene 9
+#define ANI_BALL9 933
+#define ANI_GLOTATEL 924
+#define ANI_GRIT_9 2719
+#define ANI_PLEVATEL 919
+#define ANI_VISUNCHIK 904
+#define MSG_SC9_EATBALL 941
+#define MSG_SC9_FLOWN 943
+#define MSG_SC9_FROMLADDER 4207
+#define MSG_SC9_PLVCLICK 965
+#define MSG_SC9_SETSCROLL 964
+#define MSG_SC9_SHOWBALL 936
+#define MSG_SC9_STARTTIOTIA 4942
+#define MSG_SC9_TOLADDER 4206
+#define MV_BALL9_EXPLODE 939
+#define MV_GLT_FLYAWAY 931
+#define MV_MAN9_SHOOT 922
+#define MV_VSN_CYCLE2 2987
+#define PIC_SC9_LADDER_R 2700
+#define QU_SC9_BALLEXPLODE 938
+#define QU_SC9_EATBALL 942
+#define QU_TTA9_GOL 4937
+#define SND_9_006 3650
+#define SND_9_018 4200
+#define SND_9_019 4201
+#define ST_GLT_SIT 926
+#define ST_GRT9_GRIT 2722
+#define ST_GRT9_NORM 2721
+#define ST_PLV_SIT 921
+#define ST_VSN_NORMAL 906
+
+// Scene 10
+#define ANI_GUM 978
+#define ANI_NADUVATEL 944
+#define ANI_PACHKA 975
+#define ANI_PACHKA2 3008
+#define MSG_SC10_CLICKGUM 992
+#define MSG_SC10_HIDEGUM 993
+#define MSG_SC10_LADDERTOBACK 3002
+#define MSG_SC10_LADDERTOFORE 3004
+#define MSG_SC10_SHOWGUM 994
+#define MV_NDV_BLOW2 2855
+#define MV_NDV_DENIES 952
+#define MV_NDV_DENY_NOGUM 3022
+#define PIC_SC10_DTRUBA 974
+#define PIC_SC10_LADDER 995
+#define QU_SC10_ENTERLIFT 1067
+#define QU_SC10_EXITLIFT 2809
+#define QU_SC10_TAKEGUM 3026
+#define ST_NDV_SIT 946
+
+// Scene 11
+#define ANI_BOOTS_11 2704
+#define ANI_KACHELI 1094
+#define ANI_MAN11 1108
+#define ANI_SWINGER 1113
+#define MSG_SC11_HITMAN 3019
+#define MSG_SC11_MANCRY 4691
+#define MSG_SC11_MANTOSWING 1128
+#define MSG_SC11_PUTBOOT 1117
+#define MSG_SC11_RESTARTMAN 1133
+#define MSG_SC11_SHOWSWING 1124
+#define MSG_SC11_SITSWINGER 5198
+#define MV_KCH_MOVE2 1099
+#define MV_KCH_START 1121
+#define MV_MAN11_JUMPHIT 1129
+#define MV_MAN11_JUMPFROMSWING 5209
+#define MV_MAN11_JUMPOVER 1131
+#define MV_MAN11_SWING_0 1109
+#define MV_MAN11_SWING_1 1111
+#define MV_MAN11_SWING_2 1112
+#define PIC_SC11_HINT 5170
+#define QU_SC11_MANFALL 3017
+#define QU_SC11_PUTBOOT1 2709
+#define QU_SC11_PUTBOOT2 2710
+#define QU_SC11_RESTARTMAN 1134
+#define QU_SWR_JUMPDOWN 1123
+#define SND_11_020 3704
+#define SND_11_022 3706
+#define SND_11_024 3708
+#define SND_11_031 5171
+#define ST_BTS11_2 2707
+#define ST_BTS11_ONE 2706
+#define ST_KCH_0 1096
+#define ST_KCH_EMPTY 1132
+#define ST_KCH_STATIC 1122
+#define ST_MAN_1PIX 518
+#define ST_MAN11_EMPTY 1110
+#define ST_MAN11_SWING 1127
+#define ST_SWR_SIT 1147
+#define ST_SWR_SITBALD 1153
+#define ST_SWR_STAND3 3014
+
+// Scene 13
+#define ANI_BRIDGE 1378
+#define ANI_HANDLE_L 1209
+#define ANI_HANDLE_R 1196
+#define ANI_STOROZH 1172
+#define ANI_WHIRLGIG_13 1383
+#define MSG_SC13_CHEW 1220
+#define MSG_SC13_CLOSEBRIDGE 3046
+#define MSG_SC13_CLOSEFAST 1267
+#define MSG_SC13_EATGUM 1219
+#define MSG_SC13_OPENBRIDGE 3064
+#define MSG_SC13_OPENFAST 1266
+#define MSG_SC13_SHOWGUM 1215
+#define MSG_SC13_STARTWHIRLGIG 1388
+#define MSG_SC13_STOPWHIRLGIG 1387
+#define MSG_SC13_TESTCLOSE 3065
+#define MSG_SC13_TESTOPEN 3048
+#define MSG_SC13_UNEATGUM 1218
+#define MSG_SC13_UPDATEBRIDGE 1217
+#define MV_BDG_CLOSE 1382
+#define MV_BDG_OPEN 1379
+#define MV_WHR13_SPIN 1384
+#define QU_SC13_CLOSEFAIL 3063
+#define QU_SC13_CLOSESUCCESS 3062
+#define QU_SC13_OPENFAIL 3042
+#define QU_SC13_OPENSUCCESS 3047
+#define QU_SC13_SHOWGUM 1216
+#define QU_STR_CHEW 1190
+#define QU_STR_LTOR 3054
+#define QU_STR_PLUU 1189
+#define QU_STR_RTOL 3053
+#define QU_STR_TURNR 1186
+#define QU_STR_TURNR_L 3059
+#define SND_13_018 3763
+#define SND_13_033 4685
+#define SND_13_034 4686
+#define SND_13_037 5335
+#define ST_BDG_CLOSED 1380
+#define ST_BDG_OPEN2 1381
+#define ST_HDLL_FIRECAN 1310
+#define ST_HDLL_HAMMER 3205
+#define ST_HDLL_UP 1211
+#define ST_HDLR_DOWN 1199
+#define ST_HDLR_DOWN_GUM 3044
+#define ST_HDLR_GUM 1201
+#define ST_STR_LEFT 1175
+#define ST_STR_RIGHT 1174
+
+// Scene 14
+#define ANI_BALL14 1246
+#define ANI_GRANDMA 1227
+#define MSG_SC14_ENDARCADE 3250
+#define MSG_SC14_GMAJUMP 1250
+#define MSG_SC14_GMATOTRUBA 3249
+#define MSG_SC14_HIDEBALLLAST 3251
+#define MSG_SC14_HIDEPINK 3248
+#define MSG_SC14_MANKICKBALL 1257
+#define MSG_SC14_RESTORESCROLL 4769
+#define MSG_SC14_SCROLLLEFT 4768
+#define MSG_SC14_SHOWBALLFLY 1253
+#define MSG_SC14_SHOWBALLGMADIVE 1260
+#define MSG_SC14_SHOWBALLGMAHIT 1259
+#define MSG_SC14_SHOWBALLGMAHIT2 3245
+#define MSG_SC14_SHOWBALLLAST 3246
+#define MSG_SC14_SHOWBALLMAN 1254
+#define MSG_SC14_STARTARCADE 3252
+#define MV_BAL14_FALL 1258
+#define MV_BAL14_SPIN 1247
+#define MV_BAL14_TOGMA 3214
+#define MV_GMA_BACKOFF 1233
+#define MV_GMA_BACKOFF2 3217
+#define MV_GMA_JUMPFW 1230
+#define MV_GMA_THROW 1232
+#define MV_MAN14_DECLINE 1239
+#define MV_MAN14_FALL 1236
+#define MV_MAN14_KICK 1237
+#define MV_MAN14_KICKAIR 1256
+#define MV_MAN14_STEPFW 1240
+#define PIC_SC14_RTRUBA 1221
+#define ST_GMA_SIT 1229
+#define QU_GMA_BLINK 1252
+#define QU_GMA_JUMPBK 1251
+#define QU_GMA_JUMPFW 1249
+#define QU_GMA_THROW 1255
+#define QU_SC14_ENDARCADE 1391
+#define QU_SC14_ENTERLIFT 1225
+#define QU_SC14_EXITLIFT 1226
+#define QU_SC14_STARTARCADE 1390
+#define QU_SC14_WINARCADE 3247
+
+// Scene 15
+#define ANI_BOOT_15 4779
+#define ANI_INV_BOOT 881
+#define ANI_GRANDMA_ASS 1265
+#define MSG_SC15_ASSDRYG 4755
+#define MSG_SC15_LADDERTOBACK 3259
+#define MSG_SC15_PULL 2940
+#define MSG_SC15_STOPCHANTING 4753
+#define MV_SWR_SWING 1114
+#define PIC_SC15_DTRUBA 1263
+#define PIC_SC15_LADDER 3253
+#define PIC_SC15_LTRUBA 1261
+#define QU_SC15_ENTERLIFT 2811
+#define QU_SC15_EXITLIFT 2812
+#define SND_15_001 3798
+#define SND_15_006 3808
+#define SND_15_011 4754
+#define ST_GMS_BOOT 1270
+#define ST_GMS_BOOTLESS2 3316
+
+// Scene 16
+#define ANI_BEARDED_CMN 3420
+#define ANI_BOOT_16 3285
+#define ANI_BOY 1327
+#define ANI_GIRL 1328
+#define ANI_JETTIE 1392
+#define ANI_MUG 1296
+#define ANI_WIRE16 1344
+#define MSG_SC16_FILLMUG 1363
+#define MSG_SC16_HIDEMAN 1357
+#define MSG_SC16_HIDEMUG 1351
+#define MSG_SC16_HIDEWIRE 1349
+#define MSG_SC16_LAUGHSOUND 4993
+#define MSG_SC16_MUGCLICK 1366
+#define MSG_SC16_SHOWBEARDED 4956
+#define MSG_SC16_SHOWMAN 1358
+#define MSG_SC16_SHOWMUG 1352
+#define MSG_SC16_SHOWMUGFULL 1396
+#define MSG_SC16_SHOWWIRE 1350
+#define MSG_SC16_STARTLAUGH 1374
+#define MV_BOY_DRINK 1333
+#define MV_BT16_FILL 3286
+#define MV_GRL_DRINK 1339
+#define MV_GRL_FALL 3115
+#define MV_GRL_LAUGH_POPA 3278
+#define MV_JTI_FLOWBY 1393
+#define MV_JTI_FLOWIN 1394
+#define MV_MAN16_TAKEMUG 1362
+#define PIC_SC16_TUMBA 1368
+#define QU_BRD16_STARTBEARDED 4948
+#define QU_SC16_BOYKICK 1367
+#define QU_SC16_BOYOUT 1364
+#define QU_SC16_GIRLLAUGH 1375
+#define QU_SC16_GIRLOUT 1365
+#define QU_SC16_GOBOY 1347
+#define QU_SC16_GOGIRL 1348
+#define QU_SC16_MANDRINK 5200
+#define QU_SC16_SHOWMUG 1361
+#define QU_SC16_TAKEMUG 1435
+#define SND_16_034 3854
+#define SND_16_035 3855
+#define SND_16_037 3857
+#define ST_BOY_STAND 1331
+#define ST_GRL_LAUGH 1342
+#define ST_GRL_STAND 1337
+#define ST_MUG_EMPTY 1298
+#define ST_MUG_FULL 1360
+
+// Scene 17
+#define ANI_BOOT_17 4220
+#define ANI_HAND17 1446
+#define ANI_INV_BOTTLE 1418
+#define ANI_INV_SUGAR 1410
+#define ANI_JET_17 2746
+#define ANI_MUG_17 2737
+#define ANI_SAMOGONSHCHIK 1397
+#define MSG_SC17_DROP 3414
+#define MSG_SC17_FILLBOTTLE 1436
+#define MSG_SC17_HIDESUGAR 1417
+#define MSG_SC17_SHOWBOTTLE 1432
+#define MSG_SC17_SHOWSUGAR 1416
+#define MSG_SC17_TESTTRUBA 1458
+#define MSG_SC17_UPDATEHAND 1560
+#define MV_HND17_FIGA 1449
+#define PIC_SC17_RTRUBA 1323
+#define PIC_SC17_RTRUBA2 5297
+#define QU_HND17_ASK 1456
+#define QU_HND17_ATTRACT 1455
+#define QU_HND17_TOCYCLE 1454
+#define QU_JET17_DROP 3295
+#define QU_JET17_FLOW 3294
+#define QU_SC17_FILLBOOT 4237
+#define QU_SC17_FILLBOTTLE 1437
+#define QU_SC17_FILLMUG 2750
+#define QU_SC17_FILLMUG_DROP 3415
+#define QU_SC17_SHOWBOTTLE 1429
+#define QU_SC17_SHOWSUGAR 1415
+#define QU_SMG_FILLBOTTLE 1433
+#define ST_HND17_ATTRACT 1451
+#define ST_HND17_EMPTY 1448
+#define ST_MUG17_EMPTY 2739
+#define ST_SMG_SIT 1399
+
+// Scene 18
+#define ANI_BOY18 1477
+#define ANI_DOMINO_18 3174
+#define ANI_GIRL18 1484
+#define ANI_KRESLO 1459
+#define ANI_WHIRLIGIG_18 829
+#define MSG_SC18_CLICKBOARD 3297
+#define MSG_SC18_MANCLIMBEDDOWN 1540
+#define MSG_SC18_MANCLIMBEDUP 1539
+#define MSG_SC18_MANREADY 1507
+#define MSG_SC18_SHOWBOYJUMP 1495
+#define MSG_SC18_SHOWBOYJUMPTO 1497
+#define MSG_SC18_SHOWGIRLJUMP 1496
+#define MSG_SC18_SHOWGIRLJUMPTO 1499
+#define MSG_SC18_SHOWMANJUMP 1510
+#define MSG_SC18_SHOWMANJUMPTO 1508
+#define MV_BOY18_JUMPFROM 1478
+#define MV_BOY18_JUMPTO 1481
+#define MV_GRL18_JUMPFROM 1485
+#define MV_GRL18_JUMPTO 1488
+#define MV_KSL_CALMDOWN 1476
+#define MV_KSL_INBOY 1491
+#define MV_KSL_INGIRL 1493
+#define MV_KSL_INMAN 1504
+#define MV_KSL_JUMPBOY 1473
+#define MV_KSL_JUMPGIRL 1475
+#define MV_KSL_JUMPMAN 1509
+#define MV_KSL_SWING 1460
+#define MV_KSL_SWINGBOY 1462
+#define MV_KSL_SWINGGIRL 1464
+#define MV_KSL_SWINGMAN 1502
+#define MV_MAN18_JUMPTOTRUBA 1511
+#define MV_MAN18_STANDKRESLO 1500
+#define MV_WHR18_SPIN 1300
+#define PIC_SC18_DOMIN 5184
+#define PIC_SC18_LADDER1 1471
+#define PIC_SC18_LADDER2 1472
+#define PIC_SC18_LADDER3 3299
+#define PIC_SC18_RTRUBA 1520
+#define QU_SC19_MANJUMP1 1516
+#define QU_SC19_MANJUMP2 1517
+#define QU_SC19_MANJUMP3 1518
+#define SND_18_006 3906
+#define SND_18_010 4994
+#define ST_KSL_BOY 1463
+#define ST_KSL_GIRL 1465
+#define ST_KSL_JUMPBOY 1492
+#define ST_KSL_JUMPGIRL 1494
+#define ST_KSL_JUMPMAN 1505
+#define ST_KSL_MAN 1503
+#define ST_KSL_REACT 1474
+
+// Scene 19
+#define ANI_CORDIE 1529
+#define ANI_WHIRLGIG_19 1302
+#define MSG_SC19_UPDATENUMRIDES 5203
+#define MV_WHR19_SPIN 1317
+#define PIC_SC19_RTRUBA1 1513
+#define PIC_SC19_RTRUBA2 1514
+#define PIC_SC19_RTRUBA3 1515
+#define PIC_SC19_RTRUBA31 5320
+#define SND_19_015 3928
+#define SND_19_016 4995
+#define ST_CDI_EMPTY2 1543
+#define ST_KSL_NORM 1461
+
+// Scene 20
+#define ANI_GRANDMA_20 2427
+#define MSG_SC20_UPDATELOCKABLE 5217
+#define ST_GMA20_FLOOR 2429
+#define ST_GMA20_STAND 2436
+#define ST_GMA20_STOOL 2432
+
+// Scene 21
+#define ANI_GIRAFFE_BOTTOM 1633
+#define ANI_INV_BOX 890
+#define ANI_INV_STOOL 1780
+#define MSG_SC21_UPDATEASS 4211
+#define PIC_SC21_DTRUBA 1823
+#define ST_GRFB_SIT 1687
+#define ST_GRFB_HANG 1638
+
+// Scene 22
+#define ANI_GIRAFFE_MIDDLE 1981
+#define ANI_MESHOK 1754
+#define ANI_TABURETTE 1745
+#define MSG_SC22_CHECKGMABOOT 4782
+#define MSG_SC22_CRANEOUT_GMA 5218
+#define MSG_SC22_FROMSTOOL 1799
+#define MSG_SC22_HANDLEDOWN 1796
+#define MSG_SC22_HIDESTOOL 2503
+#define MSG_SC22_ONSTOOL 1798
+#define MSG_SC22_SHOWSTOOL 2495
+#define QU_MSH_CRANEOUT 1811
+#define QU_MSH_CRANEOUT_GMA 5219
+#define QU_SC22_FALLBROOM 1786
+#define QU_SC22_FALLSACK 1791
+#define QU_SC22_FALLSACK_GMA 2613
+#define QU_SC22_FROMSTOOL 1800
+#define QU_SC22_HANDLEDOWN 1804
+#define QU_SC22_PUTSTOOL 1803
+#define QU_SC22_SHOWSTOOL 1793
+#define QU_SC22_TOSTOOL 1801
+#define QU_SC22_TOSTOOL_R 3332
+#define QU_SC22_TRYBOX 5311
+#define QU_SC22_TRYHANDLE 1802
+#define QU_MSH_MOVE 1812
+#define rMV_MAN_TURN_SRL 1090
+#define ST_GRFM_AFTER 3472
+#define ST_GRFM_NORM 1983
+#define ST_MSH_SIT 1756
+
+// Scene 23
+#define ANI_CALENDWHEEL 1702
+#define ANI_GIRAFFE_TOP 1645
+#define ANI_GIRAFFEE 1672
+#define ANI_HANDLE23 1978
+#define ANI_INV_LEVERHANDLE 1777
+#define ANI_LUK23_D 1813
+#define ANI_LUK23_U 1817
+#define MSG_SC23_CLICKBTN1 1736
+#define MSG_SC23_CLICKBTN2 1737
+#define MSG_SC23_CLICKBTN3 1738
+#define MSG_SC23_CLICKBTN4 1739
+#define MSG_SC23_FROMSTOOL 3339
+#define MSG_SC23_HIDEGIRAFFEE 4650
+#define MSG_SC23_ONSTOOL 3334
+#define MSG_SC23_SPINWHEEL1 1740
+#define MSG_SC23_SPINWHEEL2 1741
+#define MSG_SC23_SPINWHEEL3 1742
+#define MSG_SC23_SPINWHEEL4 1743
+#define MV_CND_0_1 1703
+#define MV_CND_1_2 1706
+#define MV_CND_2_3 1708
+#define MV_CND_3_4 1710
+#define MV_CND_4_5 1712
+#define MV_CND_5_6 1714
+#define MV_CND_6_7 1716
+#define MV_CND_7_8 1718
+#define MV_CND_8_9 1720
+#define MV_CND_9_0 1722
+#define MV_MAN23_PUSH1 1724
+#define MV_MAN23_PUSH2 1725
+#define MV_MAN23_PUSH3 1726
+#define MV_MAN23_PUSH4 1727
+#define PIC_SC23_BOXCLOSED 1728
+#define PIC_SC23_BOXOPEN 1723
+#define PIC_SC23_BTN1 1729
+#define PIC_SC23_BTN2 1730
+#define PIC_SC23_BTN3 1731
+#define PIC_SC23_BTN4 1732
+#define PIC_SC23_LADDER 1628
+#define PIC_SC23_LADDERU 3411
+#define QU_GRFU_TURN_UD 1664
+#define QU_GRFU_TURN_UL 1662
+#define QU_SC23_FROMCALENDAR 1734
+#define QU_SC23_FROMCALENDAREXIT 1735
+#define QU_SC23_FROMSTOOL 3338
+#define QU_SC23_SHOWSTOOL 3335
+#define QU_SC23_STARTKISS 1822
+#define QU_SC23_TOCALENDAR 1733
+#define ST_CND_0 1704
+#define ST_CND_1 1705
+#define ST_CND_2 1707
+#define ST_CND_3 1709
+#define ST_CND_4 1711
+#define ST_CND_5 1713
+#define ST_CND_6 1715
+#define ST_CND_7 1717
+#define ST_CND_8 1719
+#define ST_CND_9 1721
+#define ST_GRFG_BALD 1675
+#define ST_GRFG_EMPTY 1674
+#define ST_GRFU_KISS 1681
+#define ST_GRFU_UP 1648
+#define ST_LUK23_OPEN 1816
+#define ST_LUK23_WHANDLE2 1977
+#define ST_LUK23U_CLOSED 1819
+#define ST_LUK23U_OPEN 1820
+
+// Scene 24
+#define ANI_DROP_24 3505
+#define ANI_INV_HAMMER 884
+#define ANI_JET24 1837
+#define ANI_WATER24 1834
+#define MV_MAN_TURN_RL 332
+#define MV_WTR24_FLOW 1835
+#define MV_WTR24_FLOWLOWER 1844
+#define MV_JET24_FLOW 1838
+#define QU_DRP24_TOFLOOR 3510
+#define QU_DRP24_TOWATER 3509
+#define QU_DRP24_TOWATER2 4046
+#define SND_24_006 4041
+#define SND_24_007 4042
+#define ST_DRP24_EMPTY 3507
+#define ST_WTR24_FLOWLOWER 1843
+
+// Scene 25
+#define ANI_BEARDED_CMN 3420
+#define ANI_BOARD25 1898
+#define ANI_DROP_25 3499
+#define ANI_INV_BOARD 1872
+#define ANI_INV_BROOM 1774
+#define ANI_INV_LOPAT 1920
+#define ANI_INV_SWAB 1917
+#define ANI_WATER25 1856
+#define MSG_BRD_TURN 4877
+#define MSG_SC25_ENTERMAN 1861
+#define MSG_SC25_ENTERTRUBA 4214
+#define MSG_SC25_STARTBEARDEDS 3423
+#define MSG_SC25_STOPBEARDEDS 3424
+#define MSG_SC25_TOLADDER 4215
+#define MV_MAN_GOLADDERDOWN 455
+#define MV_MAN25_CHIH 1886
+#define rMV_MAN25_CHIH 3343
+#define MV_BRD25_RIGHT 1899
+#define rMV_BRD25_RIGHT 1903
+#define MV_MAN25_ONBOARD 1885
+#define rMV_MAN25_ONBOARD 1966
+#define MV_WTR25_FLOW 1857
+#define PIC_SC25_LADDERDOWN 1855
+#define PIC_SC25_LADDERUP 1854
+#define PIC_SC25_RTRUBA 1853
+#define QU_DRP25_TOFLOOR 3502
+#define QU_DRP25_TOWATER 3504
+#define QU_SC25_BACKTOLADDER 1955
+#define QU_SC25_BACKTOTRUBA 2061
+#define QU_SC25_BEARDED 3425
+#define QU_SC25_BEARDED2 3426
+#define QU_SC25_BEARDED3 3427
+#define QU_SC25_BOARDTOLADDER 1911
+#define QU_SC25_ENTERUP_FLOOR 1904
+#define QU_SC25_ENTERUP_WATER 1895
+#define QU_SC25_LADDERUP 1925
+#define QU_SC25_MANTOTRUBA 1905
+#define QU_SC25_MANTOTRUBA_R 4218
+#define QU_SC25_PUTBOARD 1896
+#define QU_SC25_ROWTOLADDER 1910
+#define QU_SC25_ROWTOTRUBA 1897
+#define QU_SC25_TRUBATOBOARD 1909
+#define QU_SC25_TRYBROOM 1912
+#define QU_SC25_TRYHAND 4219
+#define QU_SC25_TRYROWHAND 3493
+#define QU_SC25_TRYROWHAND_R 3494
+#define QU_SC25_TRYSPADE 3498
+#define QU_SC25_TRYSWAB 1913
+#define QU_SC25_TRYWATER 1906
+#define SND_25_006 4059
+#define SND_25_025 4874
+#define SND_25_026 4875
+#define SND_25_027 4876
+#define SND_25_028 5173
+#define SND_25_029 5174
+#define SND_25_030 5175
+#define ST_BRD25_RIGHT2 1902
+#define ST_BRDCMN_EMPTY 3422
+#define ST_DRP25_EMPTY 3501
+#define ST_MAN_GOLADDERD 456
+#define ST_MAN_LADDERDOWN_R 3419
+#define ST_MAN25_ONBOARD 1879
+
+// Scene 26
+#define ANI_CHHI 1957
+#define ANI_DROP_26 3345
+#define ANI_INV_SOCK 1698
+#define ANI_INV_VENT 1968
+#define ANI_LUK26 1867
+#define ANI_SOCK_26 4553
+#define ANI_VENT 1927
+#define MSG_SC26_CLICKVENT 1947
+#define MSG_SC26_HIDECHI 1967
+#define MSG_SC26_HIDEVENT 1945
+#define MSG_SC26_SHOWCHI 3495
+#define MSG_SC26_SHOWVENT 1946
+#define MSG_SC26_TESTVENT 1952
+#define MSG_SC26_UPDATEDROP 3496
+#define MSG_SC26_UPDATEPOOL 1956
+#define PIC_SC26_LTRUBA 1864
+#define PIC_SC26_SOCK 5312
+#define QU_CHI_HIDE 1965
+#define QU_CHI_SHOW 1964
+#define QU_SC26_AUTOCLOSE1 1949
+#define QU_SC26_AUTOCLOSE2 1950
+#define QU_SC26_AUTOCLOSE3 1951
+#define QU_SC26_CLOSE1 1936
+#define QU_SC26_CLOSE2 1938
+#define QU_SC26_CLOSE3 1940
+#define QU_SC26_CLOSE4 1942
+#define QU_SC26_CLOSE5 1944
+#define QU_SC26_OPEN1 1935
+#define QU_SC26_OPEN2 1937
+#define QU_SC26_OPEN3 1939
+#define QU_SC26_OPEN4 1941
+#define QU_SC26_OPEN5 1943
+#define SND_26_003 4079
+#define SND_26_018 5340
+#define SND_26_019 5341
+#define SND_26_020 5342
+#define ST_CHI_EMPTY 1959
+#define ST_CHI_NORM 1960
+#define ST_VNT26_RIGHT2 3348
+#define ST_VNT26_UP2 1948
+
+// Scene 27
+#define ANI_BITA 2026
+#define ANI_BITAHANDLER 3349
+#define ANI_MAID 2015
+#define ANI_VODILLA 1994
+#define MSG_SC27_CLICKBET 2048
+#define MSG_SC27_HANDLERTOBACK 3372
+#define MSG_SC27_HANDLERTOFRONT 3371
+#define MSG_SC27_SHOWNEXTBET 3369
+#define MSG_SC27_STARTBET 2047
+#define MSG_SC27_STARTWIPE 2057
+#define MSG_SC27_TAKEVENT 4584
+#define MV_BTA_FALL 2049
+#define MV_BTH_1_0 3366
+#define MV_BTH_2_1 3364
+#define MV_BTH_3_2 3362
+#define MV_BTH_4_3 3360
+#define MV_BTH_5_4 3358
+#define MV_MAN27_FLOW 1990
+#define MV_MAN27_THROWBET 1989
+#define PIC_SC27_HITZONE2 4756
+#define QU_DRV_GIVEVENT 2040
+#define QU_DRV_PUSHBUTTON 2056
+#define QU_DRV_PUSHBUTTON_NOVENT 4578
+#define QU_MID_CLEANVENT 4583
+#define QU_MID_SWITCHBACK 2044
+#define QU_SC27_RESTARTBETS 3370
+#define QU_SC27_SHOWBET 3368
+#define SND_27_026 4127
+#define SND_27_027 4128
+#define SND_27_044 4687
+#define ST_BTA_FALL 2054
+#define ST_BTA_HILITE 2052
+#define ST_BTA_NORM 2028
+#define ST_BTH_1 3365
+#define ST_BTH_2 3363
+#define ST_BTH_3 3361
+#define ST_BTH_4 3359
+#define ST_BTH_5 3357
+#define ST_DRV_SITNOVENT 1999
+#define ST_DRV_VENT 1996
+#define ST_MID_BROOM 2022
+#define ST_MID_SPADE 3489
+#define ST_MID_SWAB 2017
+#define ST_MID_SWAB2 2019
+
+// Scene 28
+#define ANI_LIFT 982
+#define ANI_LIFT_28 4238
+#define ANI_MAN_28 4247
+#define ANI_TIOTIA 4286
+#define MSG_SC28_CLICKLIFT 4258
+#define MSG_SC28_ENDCABIN 3456
+#define MSG_SC28_ENDLIFT1 4259
+#define MSG_SC28_ENDLIFT6 4244
+#define MSG_SC28_LIFT1_SHOWAFTER 4261
+#define MSG_SC28_LIFT6INSIDE 5354
+#define MSG_SC28_LIFT6MUSIC 5355
+#define MSG_SC28_MAKEFACES 4684
+#define MSG_SC28_STARTWORK1 4255
+#define MSG_SC28_TRYVTORPERS 4961
+#define MSG_SC28_TURNOFF_0 4678
+#define MSG_SC28_TURNOFF_1 4279
+#define MSG_SC28_TURNOFF_2 4277
+#define MSG_SC28_TURNOFF_3 4275
+#define MSG_SC28_TURNOFF_4 4282
+#define MSG_SC28_TURNOFF_6 4273
+#define MSG_SC28_TURNON4 4280
+#define MSG_SC28_TURNON_0 4677
+#define MSG_SC28_TURNON_1 4278
+#define MSG_SC28_TURNON_2 4276
+#define MSG_SC28_TURNON_3 4274
+#define MSG_SC28_TURNON_4 4281
+#define MSG_SC28_TURNON_6 4272
+#define MV_WMN28_IN_1 3443
+#define MV_WMN28_IN_2 3445
+#define MV_WMN28_IN_3 3446
+#define MV_WMN28_IN_4 3447
+#define MV_WMN28_IN_5 3448
+#define PIC_SC28_DARK0 4675
+#define PIC_SC28_DARK1 4266
+#define PIC_SC28_DARK2 4267
+#define PIC_SC28_DARK3 4268
+#define PIC_SC28_DARK4 4269
+#define PIC_SC28_DARK5 4270
+#define PIC_SC28_DARK6 4271
+#define QU_BRD28_GOL 4960
+#define QU_BRD28_GOR 4959
+#define QU_GLV28_GOL 4958
+#define QU_GLV28_GOR 4957
+#define QU_SC28_LIFT0_START 4676
+#define QU_SC28_LIFT1_START 4254
+#define QU_SC28_LIFT1_WORK 4256
+#define QU_SC28_LIFT2_START 4246
+#define QU_SC28_LIFT3_START 4245
+#define QU_SC28_LIFT5_START 4674
+#define QU_SC28_LIFT6_END 3563
+#define QU_SC28_LIFT6_START 4243
+#define QU_SC28_LIFT6_START2 4295
+#define QU_SC28_WMN_START 3452
+#define ST_MAN28_RIGHT 4249
+
+// Scene 29
+#define ANI_ASS 2120
+#define ANI_PORTER 2082
+#define ANI_SHELL_GREEN 2116
+#define ANI_SHELL_RED 2130
+#define ANI_SHOOTER1 2108
+#define ANI_SHOOTER2 2111
+#define MSG_SC29_DISABLEPORTER 2097
+#define MSG_SC29_DISABLERIDEBACK 2106
+#define MSG_SC29_ENABLEPORTER 2096
+#define MSG_SC29_ENABLERIDEBACK 2105
+#define MSG_SC29_LAUGH 4760
+#define MSG_SC29_SHOOTGREEN 2119
+#define MSG_SC29_SHOOTRED 2137
+#define MSG_SC29_SHOWLASTGREEN 2730
+#define MSG_SC29_SHOWLASTRED 2731
+#define MSG_SC29_STOPRIDE 2107
+#define MV_ASS_HITGREEN 2138
+#define MV_ASS_HITRED 2139
+#define MV_BRDCMN_GOR 4735
+#define MV_MAN29_BEND 2091
+#define MV_MAN29_HIT 2088
+#define MV_MAN29_JUMP 2090
+#define MV_MAN29_RUN 2095
+#define MV_MAN29_STANDUP 2092
+#define MV_MAN29_STANDUP_NORM 2093
+#define MV_PTR_MOVEFAST 2102
+#define MV_SHG_HITASS 2151
+#define MV_SHG_HITMAN 2147
+#define MV_SHG_NORM 2117
+#define MV_SHR_HITASS 2152
+#define MV_SHR_HITMAN 2149
+#define MV_SHR_NORM 2131
+#define MV_STR1_SHOOT 2109
+#define MV_STR2_SHOOT 2112
+#define PIC_SC29_LTRUBA 2081
+#define QU_SC29_BRD1 4741
+#define QU_SC29_BRD2 4742
+#define QU_SC29_BRDOUT1 4743
+#define QU_SC29_BRDOUT2 4744
+#define QU_SC29_ESCAPE 2129
+#define QU_SC29_MANFROM_L 2101
+#define QU_SC29_MANFROM_R 2104
+#define QU_SC29_MANTO_L 2103
+#define QU_SC29_MANTO_R 2100
+#define SND_29_014 4348
+#define SND_29_027 4757
+#define SND_29_028 4758
+#define SND_29_029 4759
+#define ST_ASS_NORM 2122
+#define ST_BRDCMN_GOR 4734
+#define ST_BRDCMN_RIGHT 4732
+#define ST_MAN29_RUNR 2140
+#define ST_MAN29_SITR 2141
+#define ST_STR1_RIGHT 2143
+#define ST_STR2_RIGHT 2144
+#define ST_STR1_STAND 2110
+#define ST_STR2_STAND 2113
+
+// Scene 30
+#define ANI_LEG 2322
+#define MSG_SC30_UPDATEPATH 2358
+#define PIC_SC30_LTRUBA 2354
+#define QU_SC30_ENTERLIFT 2823
+#define QU_SC30_EXITLIFT 2824
+#define ST_LEG_DOWN 2325
+#define ST_LEG_DOWN1 2330
+#define ST_LEG_DOWN2 2334
+#define ST_LEG_EMPTY 2338
+#define ST_LEG_UP 2324
+
+// Scene 31
+#define LiftDown 1058
+#define LiftUp 1057
+#define ANI_CACTUS_31 2456
+#define MSG_SC31_PULL 2944
+#define MSG_SC31_TESTCACTUS 5095
+#define SND_31_001 4377
+#define ST_CTS31_GROWN2 2472
+
+// Scene 32
+#define ANI_BUTTON_32 5347
+#define ANI_CACTUS 2267
+#define ANI_FLAG 2257
+#define ANI_KADKA 2670
+#define ANI_TESTO_BLUE 2659
+#define ANI_TESTO_GREEN 2662
+#define ANI_TESTO_ORANGE 2656
+#define MSG_SC32_ONLADDER 2270
+#define MSG_SC32_SPIN 2405
+#define MSG_SC32_STARTCACTUS 2414
+#define MSG_SC32_STARTFLAGLEFT 2310
+#define MSG_SC32_STARTFLAGRIGHT 2309
+#define MSG_SC32_STOPFLAG 2311
+#define MSG_SC32_TRUBATOBACK 5181
+#define MSG_SC32_TRUBATOFRONT 5180
+#define MSG_SC32_TRYSIT 2294
+#define MV_CTS_DEFAULT 4299
+#define MV_FLG_CYCLEL 2262
+#define MV_FLG_CYCLER 2266
+#define MV_FLG_STARTL 2258
+#define MV_FLG_STARTR 2263
+#define MV_FLG_STOPL 2261
+#define MV_FLG_STOPR 2265
+#define MV_MAN32_SITDOWN 2276
+#define MV_MAN32_STANDUP 2313
+#define MV_TSTG_FLOW 2663
+#define MV_TSTO_FLOW 2657
+#define PIC_SC32_LADDER 4296
+#define PIC_SC32_RTRUBA 2292
+#define QU_CTS_BACK 2415
+#define QU_CTS_GROW 2416
+#define QU_CTS_GROWMAN 2417
+#define QU_KBK32_GO 4977
+#define QU_KBK32_START 4982
+#define QU_KDK_DRIZZLE 4301
+#define QU_SC32_ENTERLIFT 2827
+#define QU_SC32_EXITLIFT 2828
+#define QU_SC32_FALLHANDLE 5351
+#define QU_SC32_FROMLADDER 4300
+#define QU_SC32_SHOWHANDLE 2399
+#define ST_BTN32_OFF 5349
+#define ST_BTN32_ON 5350
+#define ST_CTS_EMPTY 2269
+#define ST_CTS_GROWUP 2467
+#define ST_FLG_LEFT 2260
+#define ST_FLG_NORM 2259
+#define ST_FLG_RIGHT 2264
+#define ST_HDL_LAID 3039
+#define ST_MAN32_SIT 2277
+
+// Scene 33
+#define ANI_KUBIK 4963
+#define ANI_JETTIE_FLOW 2627
+#define ANI_MUG_33 2623
+#define ANI_VENT_33 2637
+#define MSG_SC33_HANDLEDOWN 2643
+#define MSG_SC33_POUR 2645
+#define MSG_SC33_TESTMUG 5185
+#define MSG_SC33_TRYKUBIK 4980
+#define MSG_SC33_UPDATEKUBIK 5346
+#define MV_JTI33_FLOW 2628
+#define MV_JTI33_POUR 2630
+#define MV_JTI33_POURFULL 4455
+#define MV_VNT33_TURND 2638
+#define MV_VNT33_TURNR 2641
+#define PIC_SC33_LTRUBA 2618
+#define PIC_SC33_ZONES 5298
+#define QU_KBK33_GO 4978
+#define QU_KBK33_START 4983
+#define QU_SC33_STARTWATER 2644
+#define ST_MUG33_EMPTY 2625
+#define ST_MUG33_FULL 2626
+#define ST_VNT33_DOWN 2640
+#define ST_VNT33_RIGHT 2639
+
+// Scene 34
+#define ANI_BOOT_34 4560
+#define ANI_BOX_34 2498
+#define ANI_CACTUS_34 2381
+#define ANI_LUK_34 2541
+#define ANI_STOOL_34 2486
+#define ANI_VENT_34 2473
+#define MSG_SC34_CLIMB 2490
+#define MSG_SC34_CLIMBBOX 4571
+#define MSG_SC34_FROMCACTUS 4313
+#define MSG_SC34_LEAVEBOARD 2576
+#define MSG_SC34_ONBOARD 2550
+#define MSG_SC34_ONBUMP 5313
+#define MSG_SC34_ONCACTUS 2482
+#define MSG_SC34_RETRYVENT 5210
+#define MSG_SC34_SHOWBOX 2497
+#define MSG_SC34_SHOWVENT 2481
+#define MSG_SC34_TESTVENT 2557
+#define MSG_SC34_UNCLIMB 2492
+#define MV_MAN34_TRY 2485
+#define MV_MAN34_TRYTABUR 2489
+#define MV_MAN34_TURNVENT_L 4307
+#define MV_MAN34_TURNVENT_R 2500
+#define QU_SC34_ENTERLIFT 2819
+#define QU_SC34_EXITLIFT 2820
+#define QU_SC34_FROMBOX 2494
+#define QU_SC34_FROMBOX_FLOOR 4572
+#define QU_SC34_FROMCACTUS 4312
+#define QU_SC34_FROMSTOOL 2491
+#define QU_SC34_LEAVEBOARD 2575
+#define QU_SC34_SHOWSTOOL 2496
+#define QU_CTS34_FALLEFT 4316
+#define QU_CTS34_FALLRIGHT 4317
+#define QU_LUK34_CLOSE 2547
+#define QU_LUK34_OPEN 2546
+#define ST_CTS34_EMPTY 2383
+#define ST_CTS34_GROWNEMPTY2 2475
+#define ST_LUK34_CLOSED 2543
+#define ST_LUK34_OPEN 2544
+#define ST_STL34_BOX2 4305
+#define ST_VNT34_RIGHT3 4318
+#define ST_VNT34_UP2 4310
+
+// Scene 35
+#define ANI_HOSE 2424
+#define ANI_PUZODUV 2418
+#define MSG_SC35_CHECKPIPESOUND 4761
+#define MSG_SC35_PLUGHOSE 2524
+#define MSG_SC35_SHRINK 2570
+#define MSG_SC35_STARTFLOW 2523
+#define MSG_SC35_STOPFLOW 4864
+#define MSG_SC35_TRYFLY 4985
+#define QU_PDV_SML_BLINK 2553
+#define QU_PDV_SML_TRY 2554
+#define QU_SC35_EATHOZE 2540
+#define QU_SC35_ENTERLIFT 2815
+#define QU_SC35_EXITLIFT 2816
+#define SND_35_011 4509
+#define SND_35_012 4510
+#define SND_35_026 4863
+#define ST_HZE_NORM 2426
+#define ST_PDV_LARGE 2421
+#define ST_PDV_SMALL 2420
+
+// Scene 36
+#define ANI_SCISSORS_36 2647
+#define ANI_ROTOHRUST 2360
+#define PIC_SC36_MASK 5221
+#define ST_RHT_OPEN 2362
+
+// Scene 37
+#define ANI_GUARD_37 2588
+#define ANI_RING 2604
+#define MSG_SC37_EXITLEFT 5006
+#define MSG_SC37_PULL 2945
+#define MV_GRD37_PULL 2589
+#define MV_RNG_CLOSE 2605
+#define MV_RNG_OPEN 4612
+#define PIC_SC37_MASK 2608
+#define SND_37_007 4547
+#define ST_GRD37_STAND 2590
+#define ST_RNG_CLOSED2 4865
+#define ST_RNG_OPEN 2606
+
+// Scene 38
+#define ANI_BOTTLE38 2188
+#define ANI_DOMINO38 2200
+#define ANI_DOMINOS 3317
+#define ANI_DYLDA 2169
+#define ANI_GLAVAR 2154
+#define ANI_MALYSH 2165
+#define MSG_SC38_DRINK 2225
+#define MSG_SC38_HMRKICK 2224
+#define MSG_SC38_POINT 2226
+#define MSG_SC38_POSTHMRKICK 2256
+#define MSG_SC38_PROPOSE 2287
+#define MSG_SC38_TRYTAKEBOTTLE 3179
+#define MV_DMS_FOUR 3322
+#define MV_DMS_THREE 3321
+#define MV_GLV_LOOKMAN 2167
+#define ST_BTL38_FULL 3172
+#define ST_DMN38_6 2288
+#define ST_DMN38_NORM3 2251
+#define ST_DMN38_NORM4 2253
+#define ST_DMS_3 3319
+#define ST_DMS_4 3320
+#define ST_GLV_HAMMER 2156
+#define ST_GLV_NOHAMMER 2159
+#define ST_GLV_SLEEP2 2166
+#define ST_MLS_LEFT2 2291
+#define ST_MLS_RIGHT2 3323
+#define QU_DLD_BLINK 2216
+#define QU_DLD_DENY 2218
+#define QU_DLD_GLOT 2217
+#define QU_DLD_ICK 2219
+#define QU_DLD_TAKE1 2214
+#define QU_DLD_TAKE2 2215
+#define QU_GLV_DRINK 2210
+#define QU_GLV_DRINKBOTTLE 2286
+#define QU_GLV_DRINK_NOHMR 2211
+#define QU_GLV_HMRKICK 2207
+#define QU_GLV_PROPOSE 2280
+#define QU_GLV_PROPOSE_NOHMR 2281
+#define QU_GLV_TAKEDOMINO 2170
+#define QU_GLV_TAKEDOMINO_NOHMR 3182
+#define QU_GLV_TOSMALL 2208
+#define QU_GLV_TOSMALL_NOHMR 2209
+#define QU_MLS_BLINK 2222
+#define QU_MLS_HAND 2223
+#define QU_MLS_TURNL 2220
+#define QU_MLS_TURNR 2221
+#define QU_SC38_SHOWBOTTLE 2199
+#define QU_SC38_SHOWBOTTLE_ONTABLE 2838
+#define QU_SC38_ENTERLIFT 2836
+#define QU_SC38_EXITLIFT 2837
+
+// Final scene
+#define ANI_FIN_COIN 5014
+#define MSG_FIN_ENDFINAL 5109
+#define MSG_FIN_GOTO2 5024
+#define MSG_FIN_GOTO3 5071
+#define MSG_FIN_GOTO4 5075
+#define MSG_FIN_STARTFINAL 5025
+#define MSG_FN4_STARTMUSIC 5356
+#define QU_FIN1_FALLCOIN 5018
+#define QU_FIN1_TAKECOIN 5023
+#define QU_FN2_DOFINAL 5066
+#define QU_FN3_DOFINAL 5072
+#define QU_FN4_DOFINAL 5108
+#define ST_FCN_NORM 5017
+
+// Debug scene
+#define MSG_RESTARTGAME 4767
+#define PIC_SCD_1 727
+#define PIC_SCD_2 728
+#define PIC_SCD_3 729
+#define PIC_SCD_4 730
+#define PIC_SCD_5 731
+#define PIC_SCD_6 732
+#define PIC_SCD_7 733
+#define PIC_SCD_8 756
+#define PIC_SCD_9 907
+#define PIC_SCD_10 981
+#define PIC_SCD_11 1098
+#define PIC_SCD_12 857
+#define PIC_SCD_13 1195
+#define PIC_SCD_14 1224
+#define PIC_SCD_15 1278
+#define PIC_SCD_16 1299
+#define PIC_SCD_17 1305
+#define PIC_SCD_18 1306
+#define PIC_SCD_19 1319
+#define PIC_SCD_20 1622
+#define PIC_SCD_21 1623
+#define PIC_SCD_22 1624
+#define PIC_SCD_23 1625
+#define PIC_SCD_24 1845
+#define PIC_SCD_25 1846
+#define PIC_SCD_26 1847
+#define PIC_SCD_27 1916
+#define PIC_SCD_28 2098
+#define PIC_SCD_29 2099
+#define PIC_SCD_30 2359
+#define PIC_SCD_31 2566
+#define PIC_SCD_32 2312
+#define PIC_SCD_33 2636
+#define PIC_SCD_34 2389
+#define PIC_SCD_35 2412
+#define PIC_SCD_36 2567
+#define PIC_SCD_37 2568
+#define PIC_SCD_38 2228
+#define PIC_SCD_FIN 5026
+#define PIC_SCD_SEL 734
} // End of namespace Fullpipe
diff --git a/engines/fullpipe/detection.cpp b/engines/fullpipe/detection.cpp
index 8c4a422333..de0ed04d25 100644
--- a/engines/fullpipe/detection.cpp
+++ b/engines/fullpipe/detection.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -26,6 +26,7 @@
#include "common/file.h"
#include "fullpipe/fullpipe.h"
+#include "fullpipe/gameloader.h"
namespace Fullpipe {
@@ -87,15 +88,72 @@ public:
}
virtual bool hasFeature(MetaEngineFeature f) const;
+ virtual int getMaximumSaveSlot() const { return 8; }
+ virtual SaveStateList listSaves(const char *target) const;
+ virtual void removeSaveState(const char *target, int slot) const;
+ virtual SaveStateDescriptor querySaveMetaInfos(const char *target, int slot) const;
virtual bool createInstance(OSystem *syst, Engine **engine, const ADGameDescription *desc) const;
};
bool FullpipeMetaEngine::hasFeature(MetaEngineFeature f) const {
- return false;
+ return
+ (f == kSupportsListSaves) ||
+ (f == kSupportsDeleteSave) ||
+ (f == kSavesSupportMetaInfo) ||
+ (f == kSavesSupportThumbnail) ||
+ (f == kSavesSupportCreationDate) ||
+ (f == kSupportsLoadingDuringStartup);
+}
+
+SaveStateList FullpipeMetaEngine::listSaves(const char *target) const {
+ Common::SaveFileManager *saveFileMan = g_system->getSavefileManager();
+ Common::StringArray filenames;
+ Common::String pattern("fullpipe.s??");
+
+ filenames = saveFileMan->listSavefiles(pattern);
+ sort(filenames.begin(), filenames.end()); // Sort (hopefully ensuring we are sorted numerically..)
+
+ SaveStateList saveList;
+ for (Common::StringArray::const_iterator file = filenames.begin(); file != filenames.end(); ++file) {
+ // Obtain the last 2 digits of the filename, since they correspond to the save slot
+ int slotNum = atoi(file->c_str() + file->size() - 2);
+
+ if (slotNum >= 0 && slotNum <= getMaximumSaveSlot()) {
+ Common::InSaveFile *in = saveFileMan->openForLoading(*file);
+ if (in) {
+ Fullpipe::FullpipeSavegameHeader header;
+ Fullpipe::readSavegameHeader(in, header);
+ saveList.push_back(SaveStateDescriptor(slotNum, header.saveName));
+ delete header.thumbnail;
+ delete in;
+ }
+ }
+ }
+
+ return saveList;
}
-bool Fullpipe::FullpipeEngine::hasFeature(EngineFeature f) const {
- return false;
+void FullpipeMetaEngine::removeSaveState(const char *target, int slot) const {
+ g_system->getSavefileManager()->removeSavefile(Fullpipe::getSavegameFile(slot));
+}
+
+SaveStateDescriptor FullpipeMetaEngine::querySaveMetaInfos(const char *target, int slot) const {
+ Common::InSaveFile *f = g_system->getSavefileManager()->openForLoading(
+ Fullpipe::getSavegameFile(slot));
+
+ if (f) {
+ Fullpipe::FullpipeSavegameHeader header;
+ Fullpipe::readSavegameHeader(f, header);
+ delete f;
+
+ // Create the return descriptor
+ SaveStateDescriptor desc(slot, header.saveName);
+ desc.setThumbnail(header.thumbnail);
+
+ return desc;
+ }
+
+ return SaveStateDescriptor();
}
bool FullpipeMetaEngine::createInstance(OSystem *syst, Engine **engine, const ADGameDescription *desc) const {
diff --git a/engines/fullpipe/floaters.cpp b/engines/fullpipe/floaters.cpp
new file mode 100644
index 0000000000..eb29706f72
--- /dev/null
+++ b/engines/fullpipe/floaters.cpp
@@ -0,0 +1,255 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public 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 "fullpipe/fullpipe.h"
+#include "fullpipe/floaters.h"
+#include "fullpipe/utils.h"
+#include "fullpipe/objects.h"
+#include "fullpipe/motion.h"
+#include "fullpipe/statics.h"
+#include "fullpipe/scene.h"
+#include "fullpipe/constants.h"
+#include "fullpipe/objectnames.h"
+
+namespace Fullpipe {
+
+Floaters::~Floaters() {
+ delete _hRgn;
+}
+
+void Floaters::init(GameVar *var) {
+ _array1.clear();
+ _array2.clear();
+
+ GameVar *varFliers = var->getSubVarByName(sO_Fliers);
+
+ if (!varFliers)
+ return;
+
+ GameVar *sub = varFliers->getSubVarByName("flyIdleRegion");
+
+ if (sub) {
+ _hRgn = new ReactPolygonal();
+
+ _hRgn->_pointCount = sub->getSubVarsCount();
+ _hRgn->_points = (Common::Point **)malloc(sizeof(Common::Point *) * _hRgn->_pointCount);
+
+ sub = sub->_subVars;
+
+ int idx = 0;
+
+ while (sub) {
+ _hRgn->_points[idx] = new Common::Point;
+ _hRgn->_points[idx]->x = sub->_subVars->_value.intValue;
+ _hRgn->_points[idx]->y = sub->_subVars->_nextVarObj->_value.intValue;
+
+ idx++;
+ sub = sub->_nextVarObj;
+ }
+ }
+
+ sub = varFliers->getSubVarByName("flyIdlePath");
+
+ if (sub) {
+ _array1.reserve(sub->getSubVarsCount());
+
+ sub = sub->_subVars;
+
+ int idx = 0;
+
+ while (sub) {
+ FloaterArray1 *f = new FloaterArray1;
+
+ f->val1 = sub->_subVars->_value.intValue;
+ f->val2 = sub->_subVars->_nextVarObj->_value.intValue;
+
+ _array1.push_back(f);
+
+ idx++;
+ sub = sub->_nextVarObj;
+ }
+
+ }
+}
+
+void Floaters::genFlies(Scene *sc, int x, int y, int priority, int flags) {
+ StaticANIObject *ani = new StaticANIObject(g_fp->accessScene(SC_COMMON)->getStaticANIObject1ById(ANI_FLY, -1));
+
+ ani->_statics = ani->getStaticsById(ST_FLY_FLY);
+ ani->_movement = 0;
+ ani->setOXY(x, y);
+ ani->_flags |= 4;
+ ani->_priority = priority;
+
+ sc->addStaticANIObject(ani, 1);
+
+ ani->startAnim(MV_FLY_FLY, 0, -1);
+
+ int nummoves;
+
+ if (ani->_movement->_currMovement)
+ nummoves = ani->_movement->_currMovement->_dynamicPhases.size();
+ else
+ nummoves = ani->_movement->_dynamicPhases.size();
+
+ ani->_movement->setDynamicPhaseIndex(g_fp->_rnd->getRandomNumber(nummoves - 1));
+
+ FloaterArray2 *arr2 = new FloaterArray2;
+
+ arr2->ani = ani;
+ arr2->val11 = 15.0;
+ arr2->val3 = y;
+ arr2->val5 = y;
+ arr2->val2 = x;
+ arr2->val4 = x;
+ arr2->fflags = flags;
+
+ _array2.push_back(arr2);
+}
+
+void Floaters::update() {
+ for (uint i = 0; i < _array2.size(); ++i) {
+ if (_array2[i]->val13 <= 0) {
+ if (_array2[i]->val4 != _array2[i]->val2 || _array2[i]->val5 != _array2[i]->val3) {
+ if (_array2[i]->val9 < 2.0)
+ _array2[i]->val9 = 2.0;
+
+ int dy = _array2[i]->val3 - _array2[i]->val5;
+ int dx = _array2[i]->val2 - _array2[i]->val4;
+ double dst = sqrt((double)(dy * dy + dx * dx));
+ double at = atan2((double)dx, (double)dy);
+ int newX = (int)(cos(at) * _array2[i]->val9);
+ int newY = (int)(sin(at) * _array2[i]->val9);
+
+ if (dst < _array2[i]->val9) {
+ newX = _array2[i]->val2 - _array2[i]->val4;
+ newY = _array2[i]->val3 - _array2[i]->val5;
+ }
+ if (dst <= 30.0) {
+ if (dst < 30.0) {
+ _array2[i]->val9 = _array2[i]->val9 - _array2[i]->val9 * 0.5;
+
+ if (_array2[i]->val9 < 2.0)
+ _array2[i]->val9 = 2.0;
+ }
+ } else {
+ _array2[i]->val9 = _array2[i]->val9 * 0.5 + _array2[i]->val9;
+
+ if (_array2[i]->val9 > _array2[i]->val11)
+ _array2[i]->val9 = _array2[i]->val11;
+ }
+
+ _array2[i]->val4 += newX;
+ _array2[i]->val5 += newY;
+ _array2[i]->ani->setOXY(newX + _array2[i]->ani->_ox, newY + _array2[i]->ani->_oy);
+
+ if (_array2[i]->val4 == _array2[i]->val2 && _array2[i]->val5 == _array2[i]->val3) {
+ _array2[i]->val9 = 0.0;
+
+ _array2[i]->val13 = g_fp->_rnd->getRandomNumber(200) + 20;
+
+ if (_array2[i]->fflags & 1) {
+ g_fp->_currentScene->deleteStaticANIObject(_array2[i]->ani);
+
+ if (_array2[i]->ani)
+ delete _array2[i]->ani;
+
+ _array2.remove_at(i);
+
+ i--;
+
+ if (!_array2.size())
+ g_fp->stopAllSoundInstances(SND_CMN_060);
+
+ continue;
+ }
+ }
+ } else {
+ if ((_array2[i]->fflags & 4) && _array2[i]->countdown < 1) {
+ _array2[i]->fflags |= 1;
+ _array2[i]->val2 = _array2[i]->val6;
+ _array2[i]->val3 = _array2[i]->val7;
+ } else {
+ if (_array2[i]->fflags & 2) {
+ int idx1 = g_fp->_rnd->getRandomNumber(_array1.size() - 1);
+
+ _array2[i]->val2 = _array1[idx1]->val1;
+ _array2[i]->val3 = _array1[idx1]->val2;
+ } else {
+ Common::Rect rect;
+
+ if (!_hRgn)
+ error("Floaters::update(): empty fliers region");
+
+ _hRgn->getBBox(&rect);
+
+ int x2 = rect.left + g_fp->_rnd->getRandomNumber(rect.right - rect.left);
+ int y2 = rect.top + g_fp->_rnd->getRandomNumber(rect.bottom - rect.top);
+
+ if (_hRgn->pointInRegion(x2, y2)) {
+ int dx = _array2[i]->val2 - x2;
+ int dy = _array2[i]->val3 - y2;
+ double dst = sqrt((double)(dy * dy + dx * dx));
+
+ if (dst < 300.0 || !_hRgn->pointInRegion(_array2[i]->val4, _array2[i]->val5)) {
+ _array2[i]->val2 = x2;
+ _array2[i]->val3 = y2;
+ }
+ }
+ }
+
+ g_fp->playSound(SND_CMN_061, 0);
+
+ if (_array2[i]->fflags & 4)
+ _array2[i]->countdown--;
+ }
+ }
+ } else {
+ _array2[i]->val13--;
+ }
+
+ if (!_array2[i]->ani->_movement && _array2[i]->ani->_statics->_staticsId == ST_FLY_FLY) {
+ if (!_array2[i]->val15) {
+ g_fp->playSound(SND_CMN_060, 1);
+
+ _array2[i]->val15 = 1;
+ }
+
+ _array2[i]->ani->startAnim(MV_FLY_FLY, 0, -1);
+ }
+ }
+}
+
+void Floaters::stopAll() {
+ for (uint i = 0; i < _array2.size(); i++) {
+ g_fp->_currentScene->deleteStaticANIObject(_array2[i]->ani);
+
+ delete _array2[i]->ani;
+ }
+
+ _array2.clear();
+
+ g_fp->stopAllSoundInstances(SND_CMN_060);
+}
+
+
+} // End of namespace Fullpipe
diff --git a/engines/fullpipe/floaters.h b/engines/fullpipe/floaters.h
new file mode 100644
index 0000000000..bd7b7ffd2c
--- /dev/null
+++ b/engines/fullpipe/floaters.h
@@ -0,0 +1,75 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public 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 FULLPIPE_FLOATERS_H
+#define FULLPIPE_FLOATERS_H
+
+namespace Fullpipe {
+
+class StaticANIObject;
+class Scene;
+class ReactPolygonal;
+
+struct FloaterArray1 {
+ int val1;
+ int val2;
+
+ FloaterArray1() { val1 = 0; val2 = 0; }
+};
+
+struct FloaterArray2 {
+ StaticANIObject *ani;
+ int val2;
+ int val3;
+ int val4;
+ int val5;
+ int val6;
+ int val7;
+ int val8;
+ double val9;
+ double val11;
+ int val13;
+ int countdown;
+ int val15;
+ int fflags;
+
+ FloaterArray2() : ani(0), val2(0), val3(0), val4(0), val5(0), val6(0), val7(0), val8(0),
+ val9(0.0), val11(0.0), val13(0), countdown(0), val15(0), fflags(0) {}
+};
+
+class Floaters {
+public:
+ ReactPolygonal *_hRgn;
+ Common::Array<FloaterArray1 *> _array1;
+ Common::Array<FloaterArray2 *> _array2;
+
+ Floaters() { _hRgn = 0; }
+ ~Floaters();
+ void init(GameVar *var);
+ void genFlies(Scene *sc, int x, int y, int priority, int flags);
+ void update();
+ void stopAll();
+};
+
+} // End of namespace Fullpipe
+
+#endif /* FULLPIPE_FLOATERS_H */
diff --git a/engines/fullpipe/fullpipe.cpp b/engines/fullpipe/fullpipe.cpp
index a0db6aa08c..f79564eb27 100644
--- a/engines/fullpipe/fullpipe.cpp
+++ b/engines/fullpipe/fullpipe.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -33,11 +33,16 @@
#include "fullpipe/behavior.h"
#include "fullpipe/modal.h"
#include "fullpipe/input.h"
+#include "fullpipe/motion.h"
+#include "fullpipe/statics.h"
#include "fullpipe/scenes.h"
+#include "fullpipe/floaters.h"
+#include "fullpipe/console.h"
+#include "fullpipe/constants.h"
namespace Fullpipe {
-FullpipeEngine *g_fullpipe = 0;
+FullpipeEngine *g_fp = 0;
Vars *g_vars = 0;
FullpipeEngine::FullpipeEngine(OSystem *syst, const ADGameDescription *gameDesc) : Engine(syst), _gameDescription(gameDesc) {
@@ -50,6 +55,7 @@ FullpipeEngine::FullpipeEngine(OSystem *syst, const ADGameDescription *gameDesc)
_mixer->setVolumeForSoundType(Audio::Mixer::kMusicSoundType, ConfMan.getInt("music_volume"));
_rnd = new Common::RandomSource("fullpipe");
+ _console = 0;
_gameProjectVersion = 0;
_pictureScale = 8;
@@ -67,6 +73,7 @@ FullpipeEngine::FullpipeEngine(OSystem *syst, const ADGameDescription *gameDesc)
_flgSoundList = true;
_sfxVolume = 0;
+ _musicVolume = 0;
_inputController = 0;
_inputDisabled = false;
@@ -78,24 +85,49 @@ FullpipeEngine::FullpipeEngine(OSystem *syst, const ADGameDescription *gameDesc)
_modalObject = 0;
+ _liftEnterMQ = 0;
+ _liftExitMQ = 0;
+ _lift = 0;
+ _lastLiftButton = 0;
+ _liftX = 0;
+ _liftY = 0;
+
_gameContinue = true;
_needRestart = false;
- _flgPlayIntro = false;
+ _flgPlayIntro = true;
_gamePaused = false;
_inputArFlag = false;
_recordEvents = false;
+ _mainMenu_debugEnabled = false;
_flgGameIsRunning = true;
_isProcessingMessages = false;
_musicAllowed = -1;
+ _musicGameVar = 0;
+ _musicMinDelay = 0;
+ _musicMaxDelay = 0;
+ _musicLocal = 0;
+ _trackStartDelay = 0;
+
+ memset(_sceneTracks, 0, sizeof(_sceneTracks));
+ memset(_trackName, 0, sizeof(_trackName));
+ memset(_sceneTracksCurrentTrack, 0, sizeof(_sceneTracksCurrentTrack));
+
+ _numSceneTracks = 0;
+ _sceneTrackHasSequence = false;
+ _sceneTrackIsPlaying = false;
_aniMan = 0;
_aniMan2 = 0;
_currentScene = 0;
+ _loaderScene = 0;
_scene2 = 0;
+ _scene3 = 0;
_movTable = 0;
+ _floaters = 0;
+ _mgm = 0;
_globalMessageQueueList = 0;
_messageHandlers = 0;
@@ -142,14 +174,22 @@ FullpipeEngine::FullpipeEngine(OSystem *syst, const ADGameDescription *gameDesc)
_objectAtCursor = 0;
_objectIdAtCursor = 0;
+ _arcadeOverlay = 0;
+ _arcadeOverlayHelper = 0;
+ _arcadeOverlayX = 0;
+ _arcadeOverlayY = 0;
+ _arcadeOverlayMidX = 0;
+ _arcadeOverlayMidY = 0;
+
_isSaveAllowed = true;
- g_fullpipe = this;
+ g_fp = this;
g_vars = new Vars;
}
FullpipeEngine::~FullpipeEngine() {
delete _rnd;
+ delete _console;
delete _globalMessageQueueList;
}
@@ -161,6 +201,45 @@ void FullpipeEngine::initialize() {
_sceneRect.top = 0;
_sceneRect.right = 799;
_sceneRect.bottom = 599;
+
+ _floaters = new Floaters;
+ _mgm = new MGM;
+}
+
+void FullpipeEngine::restartGame() {
+ _floaters->stopAll();
+
+ clearGlobalMessageQueueList();
+ clearMessages();
+
+ initObjectStates();
+
+ if (_scene2) {
+ _scene2->getAniMan();
+ _scene2 = 0;
+ }
+
+ if (_currentScene) {
+ _gameLoader->unloadScene(_currentScene->_sceneId);
+
+ _currentScene = 0;
+ }
+
+ _gameLoader->restoreDefPicAniInfos();
+
+ getGameLoaderInventory()->clear();
+ getGameLoaderInventory()->addItem(ANI_INV_MAP, 1);
+ getGameLoaderInventory()->rebuildItemRects();
+
+ initMap();
+
+ if (_flgPlayIntro) {
+ _gameLoader->loadScene(SC_INTRO1);
+ _gameLoader->gotoScene(SC_INTRO1, TrubaUp);
+ } else {
+ _gameLoader->loadScene(SC_1);
+ _gameLoader->gotoScene(SC_1, TrubaLeft);
+ }
}
Common::Error FullpipeEngine::run() {
@@ -170,6 +249,8 @@ Common::Error FullpipeEngine::run() {
_backgroundSurface.create(800, 600, format);
+ _console = new Console(this);
+
initialize();
_isSaveAllowed = false;
@@ -268,6 +349,11 @@ void FullpipeEngine::updateEvents() {
return;
break;
default:
+ if (event.kbd.keycode == Common::KEYCODE_d && event.kbd.hasFlags(Common::KBD_CTRL)) {
+ // Start the debugger
+ getDebugger()->attach();
+ getDebugger()->onFrame();
+ }
ex = new ExCommand(0, 17, 36, 0, 0, 0, 1, 0, 0, 0);
ex->_keyCode = event.kbd.keycode;
ex->_excFlags |= 3;
@@ -295,7 +381,7 @@ void FullpipeEngine::updateEvents() {
case Common::EVENT_QUIT:
_gameContinue = false;
break;
- case Common::EVENT_RBUTTONDOWN:
+ case Common::EVENT_RBUTTONDOWN:
if (!_inputArFlag && (_updateTicks - _lastInputTicks) >= 2) {
ex = new ExCommand(0, 17, 107, event.mouse.x, event.mouse.y, 0, 1, 0, 0, 0);
ex->_excFlags |= 3;
@@ -328,21 +414,32 @@ void FullpipeEngine::updateEvents() {
}
}
-
-#if 0
- warning("STUB: FullpipeEngine::updateEvents() <mainWindowProc>");
- if (Msg == MSG_SC11_SHOWSWING && _modalObject) {
- _modalObject->method14();
- }
-#endif
+ // pollEvent() is implemented only for video player. So skip it.
+ //if (event.kbd.keycode == MSG_SC11_SHOWSWING && _modalObject) {
+ // _modalObject->pollEvent();
+ //}
}
void FullpipeEngine::freeGameLoader() {
- warning("STUB: FullpipeEngine::freeGameLoader()");
+ setCursor(0);
+ delete _movTable;
+ _floaters->stopAll();
+ delete _gameLoader;
+ _currentScene = 0;
+ _scene2 = 0;
+ _loaderScene = 0;
}
void FullpipeEngine::cleanup() {
- warning("STUB: FullpipeEngine::cleanup()");
+ //cleanRecorder();
+ clearMessageHandlers();
+ clearMessages();
+ _globalMessageQueueList->compact();
+
+ for (uint i = 0; i < _globalMessageQueueList->size(); i++)
+ delete (*_globalMessageQueueList)[i];
+
+ stopAllSoundStreams();
}
void FullpipeEngine::updateScreen() {
@@ -424,23 +521,21 @@ void FullpipeEngine::setObjectState(const char *name, int state) {
var->setSubVarAsInt(name, state);
}
-void FullpipeEngine::updateMapPiece(int mapId, int update) {
- for (int i = 0; i < 200; i++) {
- int hiWord = (_mapTable[i] >> 16) & 0xffff;
-
- if (hiWord == mapId) {
- _mapTable[i] |= update;
- return;
- }
- if (!hiWord) {
- _mapTable[i] = (mapId << 16) | update;
- return;
+void FullpipeEngine::disableSaves(ExCommand *ex) {
+ if (_isSaveAllowed) {
+ _isSaveAllowed = false;
+
+ if (_globalMessageQueueList->size() && (*_globalMessageQueueList)[0] != 0) {
+ for (uint i = 0; i < _globalMessageQueueList->size(); i++) {
+ if ((*_globalMessageQueueList)[i]->_flags & 1)
+ if ((*_globalMessageQueueList)[i]->_id != ex->_parId && !(*_globalMessageQueueList)[i]->_isFinished)
+ return;
+ }
}
- }
-}
-void FullpipeEngine::disableSaves(ExCommand *ex) {
- warning("STUB: FullpipeEngine::disableSaves()");
+ if (_currentScene)
+ _gameLoader->writeSavegame(_currentScene, "savetmp.sav");
+ }
}
diff --git a/engines/fullpipe/fullpipe.h b/engines/fullpipe/fullpipe.h
index 22e4f1d8f4..afdc493258 100644
--- a/engines/fullpipe/fullpipe.h
+++ b/engines/fullpipe/fullpipe.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -36,6 +36,9 @@
#include "engines/engine.h"
+#include "gui/debugger.h"
+#include "fullpipe/console.h"
+
struct ADGameDescription;
namespace Fullpipe {
@@ -52,12 +55,17 @@ class Inventory2;
struct CursorInfo;
struct EntranceInfo;
class ExCommand;
+class Floaters;
class GameProject;
class GameObject;
class GlobalMessageQueueList;
struct MessageHandler;
+class MessageQueue;
struct MovTable;
+class MGM;
class NGIArchive;
+class PictureObject;
+struct PreloadItem;
class Scene;
class SoundList;
class StaticANIObject;
@@ -79,7 +87,11 @@ public:
FullpipeEngine(OSystem *syst, const ADGameDescription *gameDesc);
virtual ~FullpipeEngine();
+ Console *_console;
+ GUI::Debugger *getDebugger() { return _console; }
+
void initialize();
+ void restartGame();
void setMusicAllowed(int val) { _musicAllowed = val; }
@@ -87,7 +99,6 @@ public:
const ADGameDescription *_gameDescription;
const char *getGameId() const;
Common::Platform getPlatform() const;
- bool hasFeature(EngineFeature f) const;
Common::RandomSource *_rnd;
@@ -114,12 +125,15 @@ public:
bool _flgGameIsRunning;
bool _inputArFlag;
bool _recordEvents;
+ bool _mainMenu_debugEnabled;
Common::Rect _sceneRect;
int _sceneWidth;
int _sceneHeight;
Scene *_currentScene;
+ Scene *_loaderScene;
Scene *_scene2;
+ Scene *_scene3;
StaticANIObject *_aniMan;
StaticANIObject *_aniMan2;
byte *_globalPalette;
@@ -136,13 +150,32 @@ public:
int _currSoundListCount;
bool _soundEnabled;
bool _flgSoundList;
+ char _sceneTracks[10][260];
+ int _numSceneTracks;
+ bool _sceneTrackHasSequence;
+ int _musicMinDelay;
+ int _musicMaxDelay;
+ int _musicLocal;
+ char _trackName[2600];
+ int _trackStartDelay;
+ char _sceneTracksCurrentTrack[260];
+ bool _sceneTrackIsPlaying;
void stopAllSounds();
void toggleMute();
void playSound(int id, int flag);
+ void playTrack(GameVar *sceneVar, const char *name, bool delayed);
+ int getSceneTrack();
void startSceneTrack();
+ void startSoundStream1(char *trackName);
+ void stopSoundStream2();
+ void stopAllSoundStreams();
+ void stopAllSoundInstances(int id);
+ void updateSoundVolume();
+ void setMusicVolume(int vol);
int _sfxVolume;
+ int _musicVolume;
GlobalMessageQueueList *_globalMessageQueueList;
MessageHandler *_messageHandlers;
@@ -163,7 +196,13 @@ public:
MovTable *_movTable;
+ Floaters *_floaters;
+ MGM *_mgm;
+
+ Common::Array<Common::Point *> _arcadeKeys;
+
void initMap();
+ void updateMap(PreloadItem *pre);
void updateMapPiece(int mapId, int update);
void updateScreen();
@@ -202,6 +241,8 @@ public:
int (*_updateScreenCallback)();
int (*_updateCursorCallback)();
+ void drawAlphaRectangle(int x1, int y1, int x2, int y2, int alpha);
+
int _cursorId;
int _minCursorId;
int _maxCursorId;
@@ -210,7 +251,7 @@ public:
int _objectIdAtCursor;
void setCursor(int id);
- void updateCursorsCommon();
+ void updateCursorCommon();
int getObjectState(const char *objname);
void setObjectState(const char *name, int state);
@@ -220,6 +261,8 @@ public:
Scene *accessScene(int sceneId);
void setSceneMusicParameters(GameVar *var);
int convertScene(int scene);
+ int getSceneEntrance(int scene);
+ int getSceneFromTag(int tag);
NGIArchive *_currArchive;
@@ -227,10 +270,47 @@ public:
void openHelp();
void openMainMenu();
+ PictureObject *_arcadeOverlay;
+ PictureObject *_arcadeOverlayHelper;
+ int _arcadeOverlayX;
+ int _arcadeOverlayY;
+ int _arcadeOverlayMidX;
+ int _arcadeOverlayMidY;
+
+ void initArcadeKeys(const char *varname);
+ void processArcade(ExCommand *ex);
void winArcade();
+ void setArcadeOverlay(int picId);
+ int drawArcadeOverlay(int adjust);
+
void getAllInventory();
+ StaticANIObject *_lastLiftButton;
+ MessageQueue *_liftEnterMQ;
+ MessageQueue *_liftExitMQ;
+ StaticANIObject *_lift;
+ int _liftX;
+ int _liftY;
+
int lift_getButtonIdP(int objid);
+ int lift_getButtonIdH(int objid);
+ int lift_getButtonIdN(int objid);
+ void lift_setButton(const char *name, int state);
+ void lift_init(Scene *sc, int qu1, int qu2);
+ void lift_setButtonStatics(Scene *sc, int buttonId);
+ void lift_exitSeq(ExCommand *ex);
+ void lift_closedoorSeq();
+ void lift_clickButton();
+ void lift_walkAndGo();
+ void lift_goAnimation();
+ void lift_animateButton(StaticANIObject *button);
+ void lift_startExitQueue();
+ void lift_hoverButton(ExCommand *ex);
+ bool lift_checkButton(const char *varname);
+ void lift_openLift();
+
+ GameVar *_musicGameVar;
+ Audio::SoundHandle _sceneTrackHandle;
public:
@@ -241,7 +321,7 @@ public:
};
-extern FullpipeEngine *g_fullpipe;
+extern FullpipeEngine *g_fp;
extern Vars *g_vars;
} // End of namespace Fullpipe
diff --git a/engines/fullpipe/gameloader.cpp b/engines/fullpipe/gameloader.cpp
index f8ede5cff2..25cda5317e 100644
--- a/engines/fullpipe/gameloader.cpp
+++ b/engines/fullpipe/gameloader.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -21,6 +21,7 @@
*/
#include "fullpipe/fullpipe.h"
+#include "graphics/thumbnail.h"
#include "fullpipe/gameloader.h"
#include "fullpipe/scene.h"
@@ -28,23 +29,26 @@
#include "fullpipe/statics.h"
#include "fullpipe/interaction.h"
#include "fullpipe/motion.h"
+#include "fullpipe/constants.h"
+#include "fullpipe/scenes.h"
+#include "fullpipe/floaters.h"
namespace Fullpipe {
Inventory2 *getGameLoaderInventory() {
- return &g_fullpipe->_gameLoader->_inventory;
+ return &g_fp->_gameLoader->_inventory;
}
MctlCompound *getSc2MctlCompoundBySceneId(int16 sceneId) {
- for (uint i = 0; i < g_fullpipe->_gameLoader->_sc2array.size(); i++)
- if (g_fullpipe->_gameLoader->_sc2array[i]._sceneId == sceneId)
- return (MctlCompound *)g_fullpipe->_gameLoader->_sc2array[i]._motionController;
+ for (uint i = 0; i < g_fp->_gameLoader->_sc2array.size(); i++)
+ if (g_fp->_gameLoader->_sc2array[i]._sceneId == sceneId)
+ return (MctlCompound *)g_fp->_gameLoader->_sc2array[i]._motionController;
return 0;
}
InteractionController *getGameLoaderInteractionController() {
- return g_fullpipe->_gameLoader->_interactionController;
+ return g_fp->_gameLoader->_interactionController;
}
GameLoader::GameLoader() {
@@ -68,10 +72,10 @@ GameLoader::GameLoader() {
_preloadEntranceId = 0;
_updateCounter = 0;
- g_fullpipe->_msgX = 0;
- g_fullpipe->_msgY = 0;
- g_fullpipe->_msgObjectId2 = 0;
- g_fullpipe->_msgId = 0;
+ g_fp->_msgX = 0;
+ g_fp->_msgY = 0;
+ g_fp->_msgObjectId2 = 0;
+ g_fp->_msgId = 0;
}
GameLoader::~GameLoader() {
@@ -79,6 +83,35 @@ GameLoader::~GameLoader() {
delete _gameProject;
delete _interactionController;
delete _inputController;
+
+ g_fp->_gameLoader = 0;
+
+ for (uint i = 0; i < _sc2array.size(); i++) {
+ if (_sc2array[i]._defPicAniInfos)
+ delete _sc2array[i]._defPicAniInfos;
+
+ if (_sc2array[i]._picAniInfos)
+ delete _sc2array[i]._picAniInfos;
+
+ if (_sc2array[i]._motionController)
+ delete _sc2array[i]._motionController;
+
+ if (_sc2array[i]._data1)
+ free(_sc2array[i]._data1);
+
+ if (_sc2array[i]._entranceData)
+ free(_sc2array[i]._entranceData);
+ }
+
+ delete _gameVar;
+ _gameVar = 0;
+
+ if (g_fp->_globalPalette) {
+ free(g_fp->_globalPalette);
+ g_fp->_globalPalette = 0;
+ }
+
+ _sc2array.clear();
}
bool GameLoader::load(MfcArchive &file) {
@@ -91,10 +124,10 @@ bool GameLoader::load(MfcArchive &file) {
_gameProject->load(file);
- g_fullpipe->_gameProject = _gameProject;
+ g_fp->_gameProject = _gameProject;
- if (g_fullpipe->_gameProjectVersion < 12) {
- error("Old gameProjectVersion: %d", g_fullpipe->_gameProjectVersion);
+ if (g_fp->_gameProjectVersion < 12) {
+ error("Old gameProjectVersion: %d", g_fp->_gameProjectVersion);
}
_gameName = file.readPascalString();
@@ -167,7 +200,7 @@ bool GameLoader::gotoScene(int sceneId, int entranceId) {
return false;
if (_sc2array[sc2idx]._entranceDataCount < 1) {
- g_fullpipe->_currentScene = st->_scene;
+ g_fp->_currentScene = st->_scene;
return true;
}
@@ -186,20 +219,20 @@ bool GameLoader::gotoScene(int sceneId, int entranceId) {
if (sg || (sg = _gameVar->getSubVarByName("OBJSTATES")->addSubVarAsInt("SAVEGAME", 0)) != 0)
sg->setSubVarAsInt("Entrance", entranceId);
- if (!g_fullpipe->sceneSwitcher(_sc2array[sc2idx]._entranceData[entranceIdx]))
+ if (!g_fp->sceneSwitcher(_sc2array[sc2idx]._entranceData[entranceIdx]))
return false;
- g_fullpipe->_msgObjectId2 = 0;
- g_fullpipe->_msgY = -1;
- g_fullpipe->_msgX = -1;
+ g_fp->_msgObjectId2 = 0;
+ g_fp->_msgY = -1;
+ g_fp->_msgX = -1;
- g_fullpipe->_currentScene = st->_scene;
+ g_fp->_currentScene = st->_scene;
- MessageQueue *mq1 = g_fullpipe->_currentScene->getMessageQueueById(_sc2array[sc2idx]._entranceData[entranceIdx]->_messageQueueId);
+ MessageQueue *mq1 = g_fp->_currentScene->getMessageQueueById(_sc2array[sc2idx]._entranceData[entranceIdx]->_messageQueueId);
if (mq1) {
MessageQueue *mq = new MessageQueue(mq1, 0, 0);
- StaticANIObject *stobj = g_fullpipe->_currentScene->getStaticANIObject1ById(_field_FA, -1);
+ StaticANIObject *stobj = g_fp->_currentScene->getStaticANIObject1ById(_field_FA, -1);
if (stobj) {
stobj->_flags &= 0x100;
@@ -209,7 +242,7 @@ bool GameLoader::gotoScene(int sceneId, int entranceId) {
ex->_messageNum = 0;
ex->_excFlags |= 3;
- mq->_exCommands.push_back(ex);
+ mq->addExCommandToEnd(ex);
}
mq->setFlags(mq->getFlags() | 1);
@@ -220,7 +253,7 @@ bool GameLoader::gotoScene(int sceneId, int entranceId) {
return false;
}
} else {
- StaticANIObject *stobj = g_fullpipe->_currentScene->getStaticANIObject1ById(_field_FA, -1);
+ StaticANIObject *stobj = g_fp->_currentScene->getStaticANIObject1ById(_field_FA, -1);
if (stobj)
stobj->_flags &= 0xfeff;
}
@@ -228,8 +261,100 @@ bool GameLoader::gotoScene(int sceneId, int entranceId) {
return true;
}
-bool preloadCallback(const PreloadItem &pre, int flag) {
- warning("STUB: preloadCallback");
+bool preloadCallback(PreloadItem &pre, int flag) {
+ if (flag) {
+ if (flag == 50)
+ g_fp->_aniMan->preloadMovements(g_fp->_movTable);
+
+ StaticANIObject *pbar = g_fp->_loaderScene->getStaticANIObject1ById(ANI_PBAR, -1);
+
+ if (pbar) {
+ int sz;
+
+ if (pbar->_movement->_currMovement)
+ sz = pbar->_movement->_currMovement->_dynamicPhases.size();
+ else
+ sz = pbar->_movement->_dynamicPhases.size();
+
+ pbar->_movement->setDynamicPhaseIndex(flag * (sz - 1) / 100);
+ }
+
+ g_fp->updateMap(&pre);
+
+ g_fp->_currentScene = g_fp->_loaderScene;
+
+ g_fp->_loaderScene->draw();
+
+ g_fp->_system->updateScreen();
+ } else {
+ if (g_fp->_scene2) {
+ g_fp->_aniMan = g_fp->_scene2->getAniMan();
+ g_fp->_scene2 = 0;
+ setInputDisabled(1);
+ }
+
+ g_fp->_floaters->stopAll();
+
+ if (g_fp->_soundEnabled) {
+ g_fp->_currSoundListCount = 1;
+ g_fp->_currSoundList1[0] = g_fp->accessScene(SC_COMMON)->_soundList;
+ }
+
+ g_vars->scene18_inScene18p1 = false;
+
+ if ((pre.preloadId1 != SC_18 || pre.sceneId != SC_19) && (pre.preloadId1 != SC_19 || (pre.sceneId != SC_18 && pre.sceneId != SC_19))) {
+ if (g_fp->_scene3) {
+ if (pre.preloadId1 != SC_18)
+ g_fp->_gameLoader->unloadScene(SC_18);
+
+ g_fp->_scene3 = 0;
+ }
+ } else {
+ scene19_setMovements(g_fp->accessScene(pre.preloadId1), pre.keyCode);
+
+ g_vars->scene18_inScene18p1 = true;
+
+ if (pre.preloadId1 == SC_18) {
+ g_fp->_gameLoader->saveScenePicAniInfos(SC_18);
+
+ scene18_preload();
+ }
+ }
+
+ if (((pre.sceneId == SC_19 && pre.keyCode == TrubaRight) || (pre.sceneId == SC_18 && pre.keyCode == TrubaRight)) && !pre.preloadId2) {
+ pre.sceneId = SC_18;
+ pre.keyCode = TrubaLeft;
+ }
+
+ if (!g_fp->_loaderScene) {
+ g_fp->_gameLoader->loadScene(SC_LDR);
+ g_fp->_loaderScene = g_fp->accessScene(SC_LDR);;
+ }
+
+ StaticANIObject *pbar = g_fp->_loaderScene->getStaticANIObject1ById(ANI_PBAR, -1);
+
+ if (pbar) {
+ pbar->show1(ST_EGTR_SLIMSORROW, ST_MAN_GOU, MV_PBAR_RUN, 0);
+ pbar->startAnim(MV_PBAR_RUN, 0, -1);
+ }
+
+ g_fp->_inventoryScene = 0;
+ g_fp->_updateCursorCallback = 0;
+
+ g_fp->_sceneRect.translate(-g_fp->_sceneRect.left, -g_fp->_sceneRect.top);
+
+ g_fp->_system->delayMillis(10);
+
+ Scene *oldsc = g_fp->_currentScene;
+
+ g_fp->_currentScene = g_fp->_loaderScene;
+
+ g_fp->_loaderScene->draw();
+
+ g_fp->_system->updateScreen();
+
+ g_fp->_currentScene = oldsc;
+ }
return true;
}
@@ -262,8 +387,8 @@ bool GameLoader::preloadScene(int sceneId, int entranceId) {
return false;
}
- if (g_fullpipe->_currentScene && g_fullpipe->_currentScene->_sceneId == sceneId)
- g_fullpipe->_currentScene = 0;
+ if (g_fp->_currentScene && g_fp->_currentScene->_sceneId == sceneId)
+ g_fp->_currentScene = 0;
saveScenePicAniInfos(sceneId);
clearGlobalMessageQueueList1();
@@ -358,7 +483,7 @@ void GameLoader::applyPicAniInfos(Scene *sc, PicAniInfo **picAniInfo, int picAni
if (!(picAniInfo[i]->type & 1))
continue;
- Scene *scNew = g_fullpipe->accessScene(picAniInfo[i]->sceneId);
+ Scene *scNew = g_fp->accessScene(picAniInfo[i]->sceneId);
if (!scNew)
continue;
@@ -386,8 +511,8 @@ void GameLoader::saveScenePicAniInfos(int sceneId) {
}
void GameLoader::updateSystems(int counterdiff) {
- if (g_fullpipe->_currentScene) {
- g_fullpipe->_currentScene->update(counterdiff);
+ if (g_fp->_currentScene) {
+ g_fp->_currentScene->update(counterdiff);
_exCommand._messageKind = 17;
_updateCounter++;
@@ -404,6 +529,14 @@ void GameLoader::updateSystems(int counterdiff) {
}
}
+void GameLoader::readSavegame(const char *fname) {
+ warning("STUB: readSavegame(%s)", fname);
+}
+
+void GameLoader::writeSavegame(Scene *sc, const char *fname) {
+ warning("STUB: writeSavegame(sc, %s)", fname);
+}
+
Sc2::Sc2() {
_sceneId = 0;
_field_2 = 0;
@@ -481,7 +614,7 @@ bool PreloadItems::load(MfcArchive &file) {
int count = file.readCount();
- resize(count);
+ clear();
for (int i = 0; i < count; i++) {
PreloadItem *t = new PreloadItem();
@@ -496,6 +629,51 @@ bool PreloadItems::load(MfcArchive &file) {
return true;
}
+const char *getSavegameFile(int saveGameIdx) {
+ static char buffer[20];
+ sprintf(buffer, "fullpipe.s%02d", saveGameIdx);
+ return buffer;
+}
+
+bool readSavegameHeader(Common::InSaveFile *in, FullpipeSavegameHeader &header) {
+ char saveIdentBuffer[6];
+ header.thumbnail = NULL;
+
+ // Validate the header Id
+ in->read(saveIdentBuffer, 6);
+ if (strcmp(saveIdentBuffer, "SVMCR"))
+ return false;
+
+ header.version = in->readByte();
+ if (header.version != FULLPIPE_SAVEGAME_VERSION)
+ 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)
+ return false;
+
+ return true;
+}
+
+void GameLoader::restoreDefPicAniInfos() {
+ for (uint i = 0; i < _sc2array.size(); i++) {
+ if (_sc2array[i]._picAniInfos) {
+ free(_sc2array[i]._picAniInfos);
+ _sc2array[i]._picAniInfos = 0;
+ _sc2array[i]._picAniInfosCount = 0;
+ }
+
+ if (_sc2array[i]._scene)
+ applyPicAniInfos(_sc2array[i]._scene, _sc2array[i]._defPicAniInfos, _sc2array[i]._defPicAniInfosCount);
+ }
+}
+
GameVar *FullpipeEngine::getGameLoaderGameVar() {
if (_gameLoader)
return _gameLoader->_gameVar;
@@ -510,4 +688,8 @@ InputController *FullpipeEngine::getGameLoaderInputController() {
return 0;
}
+MctlCompound *getCurrSceneSc2MotionController() {
+ return getSc2MctlCompoundBySceneId(g_fp->_currentScene->_sceneId);
+}
+
} // End of namespace Fullpipe
diff --git a/engines/fullpipe/gameloader.h b/engines/fullpipe/gameloader.h
index 4f5462671d..772cc51130 100644
--- a/engines/fullpipe/gameloader.h
+++ b/engines/fullpipe/gameloader.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -29,6 +29,8 @@
namespace Fullpipe {
+#define FULLPIPE_SAVEGAME_VERSION 1
+
class SceneTag;
class MctlCompound;
class InputController;
@@ -65,13 +67,19 @@ struct PreloadItem {
int keyCode;
};
-bool preloadCallback(const PreloadItem &pre, int flag);
+bool preloadCallback(PreloadItem &pre, int flag);
class PreloadItems : public Common::Array<PreloadItem *>, public CObject {
public:
virtual bool load(MfcArchive &file);
};
+struct FullpipeSavegameHeader {
+ uint8 version;
+ Common::String saveName;
+ Graphics::Surface *thumbnail;
+};
+
class GameLoader : public CObject {
public:
GameLoader();
@@ -89,13 +97,18 @@ class GameLoader : public CObject {
void applyPicAniInfos(Scene *sc, PicAniInfo **picAniInfo, int picAniInfoCount);
void saveScenePicAniInfos(int sceneId);
+ void readSavegame(const char *fname);
+ void writeSavegame(Scene *sc, const char *fname);
+
+ void restoreDefPicAniInfos();
+
GameProject *_gameProject;
InteractionController *_interactionController;
InputController *_inputController;
Inventory2 _inventory;
Sc2Array _sc2array;
void *_sceneSwitcher;
- bool (*_preloadCallback)(const PreloadItem &pre, int flag);
+ bool (*_preloadCallback)(PreloadItem &pre, int flag);
void *_readSavegameCallback;
int16 _field_F8;
int16 _field_FA;
@@ -108,9 +121,13 @@ class GameLoader : public CObject {
int _preloadEntranceId;
};
+const char *getSavegameFile(int saveGameIdx);
+bool readSavegameHeader(Common::InSaveFile *in, FullpipeSavegameHeader &header);
+
Inventory2 *getGameLoaderInventory();
InteractionController *getGameLoaderInteractionController();
MctlCompound *getSc2MctlCompoundBySceneId(int16 sceneId);
+MctlCompound *getCurrSceneSc2MotionController();
} // End of namespace Fullpipe
diff --git a/engines/fullpipe/gfx.cpp b/engines/fullpipe/gfx.cpp
index 2e89bd6003..520e81835b 100644
--- a/engines/fullpipe/gfx.cpp
+++ b/engines/fullpipe/gfx.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -58,6 +58,8 @@ Bitmap::Bitmap(Bitmap *src) {
Bitmap::~Bitmap() {
if (_pixels)
free(_pixels);
+
+ _pixels = 0;
}
void Bitmap::load(Common::ReadStream *s) {
@@ -87,6 +89,19 @@ Background::Background() {
_palette = 0;
}
+Background::~Background() {
+ _picObjList.clear();
+
+ for (int i = 0; i < _bigPictureArray1Count; i++) {
+ for (int j = 0; j < _bigPictureArray2Count; j++)
+ delete _bigPictureArray[i][j];
+
+ free(_bigPictureArray[i]);
+ }
+
+ free(_bigPictureArray);
+}
+
bool Background::load(MfcArchive &file) {
debug(5, "Background::load()");
_bgname = file.readPascalString();
@@ -100,11 +115,11 @@ bool Background::load(MfcArchive &file) {
addPictureObject(pct);
}
- assert(g_fullpipe->_gameProjectVersion >= 4);
+ assert(g_fp->_gameProjectVersion >= 4);
_bigPictureArray1Count = file.readUint32LE();
- assert(g_fullpipe->_gameProjectVersion >= 5);
+ assert(g_fp->_gameProjectVersion >= 5);
_bigPictureArray2Count = file.readUint32LE();
@@ -129,8 +144,8 @@ void Background::addPictureObject(PictureObject *pct) {
pct->renumPictures(&_picObjList);
bool inserted = false;
- for (uint i = 0; i < _picObjList.size(); i++) {
- if (((PictureObject *)_picObjList[i])->_priority == pct->_priority) {
+ for (uint i = 1; i < _picObjList.size(); i++) {
+ if (_picObjList[i]->_priority <= pct->_priority) {
_picObjList.insert_at(i, pct);
inserted = true;
break;
@@ -152,6 +167,12 @@ PictureObject::PictureObject() {
_objtype = kObjTypePictureObject;
}
+PictureObject::~PictureObject() {
+ delete _picture;
+ _pictureObject2List->clear();
+ delete _pictureObject2List;
+}
+
PictureObject::PictureObject(PictureObject *src) : GameObject(src) {
_picture = src->_picture;
_ox2 = _ox;
@@ -171,7 +192,7 @@ bool PictureObject::load(MfcArchive &file, bool bigPicture) {
_picture->load(file);
- _pictureObject2List = new PtrList();
+ _pictureObject2List = new Common::Array<GameObject *>;
int count = file.readUint16LE();
@@ -222,7 +243,7 @@ void PictureObject::drawAt(int x, int y) {
bool PictureObject::setPicAniInfo(PicAniInfo *picAniInfo) {
if (!(picAniInfo->type & 2) || (picAniInfo->type & 1)) {
- error("Picture::setPicAniInfo(): Wrong type: %d", picAniInfo->type);
+ error("PictureObject::setPicAniInfo(): Wrong type: %d", picAniInfo->type);
return false;
}
@@ -269,6 +290,11 @@ bool PictureObject::isPixelHitAtPos(int x, int y) {
return res;
}
+void PictureObject::setOXY2() {
+ _ox2 = _ox;
+ _oy2 = _oy;
+}
+
GameObject::GameObject() {
_okeyCode = 0;
_flags = 0;
@@ -313,7 +339,7 @@ bool GameObject::load(MfcArchive &file) {
_oy = file.readUint32LE();
_priority = file.readUint16LE();
- if (g_fullpipe->_gameProjectVersion >= 11) {
+ if (g_fp->_gameProjectVersion >= 11) {
_field_8 = file.readUint32LE();
}
@@ -325,12 +351,30 @@ void GameObject::setOXY(int x, int y) {
_oy = y;
}
-void GameObject::renumPictures(PtrList *lst) {
+void GameObject::renumPictures(Common::Array<StaticANIObject *> *lst) {
+ int *buf = (int *)calloc(lst->size() + 2, sizeof(int));
+
+ for (uint i = 0; i < lst->size(); i++) {
+ if (_id == ((GameObject *)((*lst)[i]))->_id)
+ buf[((GameObject *)((*lst)[i]))->_okeyCode] = 1;
+ }
+
+ if (buf[_okeyCode]) {
+ uint count;
+ for (count = 1; buf[count] && count < lst->size() + 2; count++)
+ ;
+ _okeyCode = count;
+ }
+
+ free(buf);
+}
+
+void GameObject::renumPictures(Common::Array<PictureObject *> *lst) {
int *buf = (int *)calloc(lst->size() + 2, sizeof(int));
for (uint i = 0; i < lst->size(); i++) {
- if (_id == ((PictureObject *)((*lst)[i]))->_id)
- buf[((PictureObject *)((*lst)[i]))->_okeyCode] = 1;
+ if (_id == ((GameObject *)((*lst)[i]))->_id)
+ buf[((GameObject *)((*lst)[i]))->_okeyCode] = 1;
}
if (buf[_okeyCode]) {
@@ -354,6 +398,7 @@ bool GameObject::getPicAniInfo(PicAniInfo *info) {
info->ox = _ox;
info->oy = _oy;
info->priority = _priority;
+ warning("Yep %d", _id);
return true;
}
@@ -464,10 +509,12 @@ Picture::~Picture() {
}
void Picture::freePicture() {
+ debug(5, "Picture::freePicture(): file: %s", _memfilename);
+
if (_bitmap) {
if (testFlags() && !_field_54) {
freeData();
- delete _bitmap;
+ free(_bitmap);
_bitmap = 0;
}
}
@@ -484,6 +531,11 @@ void Picture::freePicture() {
}
}
+void Picture::freePixelData() {
+ freePicture();
+ freeData();
+}
+
bool Picture::load(MfcArchive &file) {
debug(5, "Picture::load()");
MemoryObject::load(file);
@@ -492,7 +544,7 @@ bool Picture::load(MfcArchive &file) {
_y = file.readUint32LE();
_field_44 = file.readUint16LE();
- assert(g_fullpipe->_gameProjectVersion >= 2);
+ assert(g_fp->_gameProjectVersion >= 2);
_width = file.readUint32LE();
_height = file.readUint32LE();
@@ -506,7 +558,7 @@ bool Picture::load(MfcArchive &file) {
setAOIDs();
}
- assert (g_fullpipe->_gameProjectVersion >= 12);
+ assert (g_fp->_gameProjectVersion >= 12);
_alpha = file.readUint32LE() & 0xff;
@@ -519,14 +571,14 @@ bool Picture::load(MfcArchive &file) {
getData();
- debug(5, "Picture::load: <%s>", _memfilename);
+ debug(5, "Picture::load: loaded <%s>", _memfilename);
return true;
}
void Picture::setAOIDs() {
- int w = (g_fullpipe->_pictureScale + _width - 1) / g_fullpipe->_pictureScale;
- int h = (g_fullpipe->_pictureScale + _height - 1) / g_fullpipe->_pictureScale;
+ int w = (g_fp->_pictureScale + _width - 1) / g_fp->_pictureScale;
+ int h = (g_fp->_pictureScale + _height - 1) / g_fp->_pictureScale;
_memoryObject2->_rows = (byte **)malloc(w * sizeof(int *));
@@ -539,6 +591,10 @@ void Picture::setAOIDs() {
}
void Picture::init() {
+ debug(5, "Picture::init(), %s", _memfilename);
+
+ MemoryObject::getData();
+
_bitmap = new Bitmap();
getDibInfo();
@@ -567,6 +623,12 @@ void Picture::getDibInfo() {
warning("Uneven data size: 0x%x", _dataSize);
}
+ if (!_data) {
+ warning("Picture::getDibInfo: data is empty <%s>", _memfilename);
+
+ MemoryObject::load();
+ }
+
Common::MemoryReadStream *s = new Common::MemoryReadStream(_data + off - 32, 32);
_bitmap->load(s);
@@ -584,7 +646,7 @@ void Picture::draw(int x, int y, int style, int angle) {
int x1 = x;
int y1 = y;
- debug(0, "Picture::draw(%d, %d, %d, %d) (%s)", x, y, style, angle, _memfilename);
+ debug(7, "Picture::draw(%d, %d, %d, %d) (%s)", x, y, style, angle, _memfilename);
if (x != -1)
x1 = x;
@@ -599,14 +661,14 @@ void Picture::draw(int x, int y, int style, int angle) {
return;
if ((_alpha & 0xff) < 0xff) {
- debug(0, "Picture:draw: alpha = %0x", _alpha);
+ debug(7, "Picture:draw: alpha = %0x", _alpha);
}
byte *pal = _paletteData;
if (!pal) {
//warning("Picture:draw: using global palette");
- pal = g_fullpipe->_globalPalette;
+ pal = g_fp->_globalPalette;
}
Common::Point point;
@@ -638,7 +700,7 @@ void Picture::drawRotated(int x, int y, int angle) {
}
void Picture::displayPicture() {
- if (!g_fullpipe->_gameContinue)
+ if (!g_fp->_gameContinue)
return;
getData();
@@ -647,22 +709,22 @@ void Picture::displayPicture() {
if (!_dataSize)
return;
- g_fullpipe->_backgroundSurface.fillRect(Common::Rect(0, 0, 799, 599), 0);
- g_fullpipe->_system->copyRectToScreen(g_fullpipe->_backgroundSurface.getBasePtr(0, 0), g_fullpipe->_backgroundSurface.pitch, 0, 0, 799, 599);
+ g_fp->_backgroundSurface.fillRect(Common::Rect(0, 0, 800, 600), 0);
+ g_fp->_system->copyRectToScreen(g_fp->_backgroundSurface.getBasePtr(0, 0), g_fp->_backgroundSurface.pitch, 0, 0, 800, 600);
draw(0, 0, 0, 0);
- g_fullpipe->updateEvents();
- g_fullpipe->_system->delayMillis(10);
- g_fullpipe->_system->updateScreen();
+ g_fp->updateEvents();
+ g_fp->_system->delayMillis(10);
+ g_fp->_system->updateScreen();
- while (g_fullpipe->_gameContinue) {
- g_fullpipe->updateEvents();
- g_fullpipe->_system->delayMillis(10);
- g_fullpipe->_system->updateScreen();
+ while (g_fp->_gameContinue) {
+ g_fp->updateEvents();
+ g_fp->_system->delayMillis(10);
+ g_fp->_system->updateScreen();
- if (g_fullpipe->_keyState == ' ') {
- g_fullpipe->_keyState = Common::KEYCODE_INVALID;
+ if (g_fp->_keyState == ' ') {
+ g_fp->_keyState = Common::KEYCODE_INVALID;
break;
}
}
@@ -710,7 +772,7 @@ bool Picture::isPixelHitAtPos(int x, int y) {
}
int Picture::getPixelAtPos(int x, int y) {
- return getPixelAtPosEx(x / g_fullpipe->_pictureScale, y / g_fullpipe->_pictureScale);
+ return getPixelAtPosEx(x / g_fp->_pictureScale, y / g_fp->_pictureScale);
return false;
}
@@ -719,8 +781,8 @@ int Picture::getPixelAtPosEx(int x, int y) {
if (x < 0 || y < 0)
return 0;
- if (x < (g_fullpipe->_pictureScale + _width - 1) / g_fullpipe->_pictureScale &&
- y < (g_fullpipe->_pictureScale + _height - 1) / g_fullpipe->_pictureScale &&
+ if (x < (g_fp->_pictureScale + _width - 1) / g_fp->_pictureScale &&
+ y < (g_fp->_pictureScale + _height - 1) / g_fp->_pictureScale &&
_memoryObject2 != 0 && _memoryObject2->_rows != 0)
return _memoryObject2->_rows[x][2 * y];
@@ -771,10 +833,10 @@ bool Bitmap::isPixelAtHitPosRB(int x, int y) {
}
void Bitmap::putDib(int x, int y, int32 *palette) {
- debug(0, "Bitmap::putDib(%d, %d)", x, y);
+ debug(7, "Bitmap::putDib(%d, %d)", x, y);
- _x = x - g_fullpipe->_sceneRect.left;
- _y = y - g_fullpipe->_sceneRect.top;
+ _x = x - g_fp->_sceneRect.left;
+ _y = y - g_fp->_sceneRect.top;
if (_type == MKTAG('R', 'B', '\0', '\0'))
putDibRB(palette);
@@ -795,7 +857,7 @@ bool Bitmap::putDibRB(int32 *palette, int pX, int pY) {
uint16 *srcPtr;
if (!palette && pX == -1) {
- warning("Bitmap::putDibRB(): Both global and local palettes are empty");
+ debug(2, "Bitmap::putDibRB(): Both global and local palettes are empty");
return false;
}
@@ -867,7 +929,7 @@ bool Bitmap::putDibRB(int32 *palette, int pX, int pY) {
if (y <= endy) {
if (pX == -1) {
int bgcolor = palette[(pixel >> 8) & 0xff];
- curDestPtr = (uint16 *)g_fullpipe->_backgroundSurface.getBasePtr(start1, y);
+ curDestPtr = (uint16 *)g_fp->_backgroundSurface.getBasePtr(start1, y);
colorFill(curDestPtr, fillLen, bgcolor);
} else {
if (y == pY && pX >= start1 && pX < start1 + fillLen)
@@ -898,7 +960,7 @@ bool Bitmap::putDibRB(int32 *palette, int pX, int pY) {
if (y <= endy) {
if (pX == -1) {
- curDestPtr = (uint16 *)g_fullpipe->_backgroundSurface.getBasePtr(start1, y);
+ curDestPtr = (uint16 *)g_fp->_backgroundSurface.getBasePtr(start1, y);
paletteFill(curDestPtr, (byte *)srcPtr2, fillLen, (int32 *)palette);
} else {
if (y == pY && pX >= start1 && pX < start1 + fillLen)
@@ -910,7 +972,7 @@ bool Bitmap::putDibRB(int32 *palette, int pX, int pY) {
}
if (pX == -1)
- g_fullpipe->_system->copyRectToScreen(g_fullpipe->_backgroundSurface.getBasePtr(startx, starty), g_fullpipe->_backgroundSurface.pitch, startx, starty, endx + 1 - startx, endy + 1 - starty);
+ g_fp->_system->copyRectToScreen(g_fp->_backgroundSurface.getBasePtr(startx, starty), g_fp->_backgroundSurface.pitch, startx, starty, endx + 1 - startx, endy + 1 - starty);
return false;
}
@@ -947,6 +1009,9 @@ void Bitmap::putDibCB(int32 *palette) {
byte *srcPtr = &_pixels[pitch * (endy - _y)];
+ if (endy - _y < _height)
+ srcPtr = &_pixels[pitch * (_height - 1)];
+
int starty = _y;
if (starty < 0) {
starty = 0;
@@ -960,18 +1025,18 @@ void Bitmap::putDibCB(int32 *palette) {
}
if (_flags & 0x1000000) {
- for (int y = starty; y < endy; srcPtr -= pitch, y++) {
- curDestPtr = (uint16 *)g_fullpipe->_backgroundSurface.getBasePtr(startx, y);
+ for (int y = starty; y <= endy; srcPtr -= pitch, y++) {
+ curDestPtr = (uint16 *)g_fp->_backgroundSurface.getBasePtr(startx, y);
copierKeyColor(curDestPtr, srcPtr, endx - startx + 1, _flags & 0xff, (int32 *)palette, cb05_format);
}
} else {
for (int y = starty; y <= endy; srcPtr -= pitch, y++) {
- curDestPtr = (uint16 *)g_fullpipe->_backgroundSurface.getBasePtr(startx, y);
+ curDestPtr = (uint16 *)g_fp->_backgroundSurface.getBasePtr(startx, y);
copier(curDestPtr, srcPtr, endx - startx + 1, (int32 *)palette, cb05_format);
}
}
- g_fullpipe->_system->copyRectToScreen(g_fullpipe->_backgroundSurface.getBasePtr(startx, starty), g_fullpipe->_backgroundSurface.pitch, startx, starty, endx + 1 - startx, endy + 1 - starty);
+ g_fp->_system->copyRectToScreen(g_fp->_backgroundSurface.getBasePtr(startx, starty), g_fp->_backgroundSurface.pitch, startx, starty, endx + 1 - startx, endy + 1 - starty);
}
void Bitmap::colorFill(uint16 *dest, int len, int32 color) {
@@ -1166,6 +1231,34 @@ bool BigPicture::load(MfcArchive &file) {
return true;
}
+void BigPicture::draw(int x, int y, int style, int angle) {
+ if (!_bitmap)
+ init();
+
+ if (_bitmap) {
+ _bitmap->_flags &= 0xFEFFFFFF;
+
+ int nx = _x;
+ int ny = _y;
+
+ if (x != -1)
+ nx = x;
+
+ if (y != -1)
+ ny = y;
+
+ if (_alpha < 0xFF) {
+ //vrtSetAlphaBlendMode(g_vrtDrawHandle, 1, v9);
+ }
+
+ _bitmap->putDib(nx, ny, 0);
+
+ if (_alpha < 0xFF) {
+ //vrtSetAlphaBlendMode(g_vrtDrawHandle, 0, 255);
+ }
+ }
+}
+
Shadows::Shadows() {
_staticAniObjectId = 0;
_movementId = 0;
@@ -1182,7 +1275,7 @@ bool Shadows::load(MfcArchive &file) {
}
void Shadows::init() {
- Scene *scene = g_fullpipe->accessScene(_sceneId);
+ Scene *scene = g_fp->accessScene(_sceneId);
StaticANIObject *st;
Movement *mov;
@@ -1235,4 +1328,8 @@ DynamicPhase *Shadows::findSize(int width, int height) {
return _items[idx].dynPhase;
}
+void FullpipeEngine::drawAlphaRectangle(int x1, int y1, int x2, int y2, int alpha) {
+ warning("STUB: FullpipeEngine::drawAlphaRectangle()");
+}
+
} // End of namespace Fullpipe
diff --git a/engines/fullpipe/gfx.h b/engines/fullpipe/gfx.h
index 9d5c45de0b..191df7709a 100644
--- a/engines/fullpipe/gfx.h
+++ b/engines/fullpipe/gfx.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -88,13 +88,14 @@ class Picture : public MemoryObject {
virtual ~Picture();
void freePicture();
+ void freePixelData();
virtual bool load(MfcArchive &file);
void setAOIDs();
- void init();
+ virtual void init();
void getDibInfo();
Bitmap *getPixelData();
- void draw(int x, int y, int style, int angle);
+ virtual void draw(int x, int y, int style, int angle);
void drawRotated(int x, int y, int angle);
byte getAlpha() { return (byte)_alpha; }
@@ -115,7 +116,10 @@ class Picture : public MemoryObject {
class BigPicture : public Picture {
public:
BigPicture() {}
+ virtual ~BigPicture() {}
+
virtual bool load(MfcArchive &file);
+ virtual void draw(int x, int y, int style, int angle);
};
class GameObject : public CObject {
@@ -137,7 +141,8 @@ class GameObject : public CObject {
virtual bool load(MfcArchive &file);
void setOXY(int x, int y);
- void renumPictures(PtrList *lst);
+ void renumPictures(Common::Array<StaticANIObject *> *lst);
+ void renumPictures(Common::Array<PictureObject *> *lst);
void setFlags(int16 flags) { _flags = flags; }
void clearFlags() { _flags = 0; }
const char *getName() { return _objectName; }
@@ -149,13 +154,15 @@ class GameObject : public CObject {
class PictureObject : public GameObject {
public:
Picture *_picture;
- PtrList *_pictureObject2List;
+ Common::Array<GameObject *> *_pictureObject2List;
int _ox2;
int _oy2;
public:
PictureObject();
+
PictureObject(PictureObject *src);
+ virtual ~PictureObject();
virtual bool load(MfcArchive &file, bool bigPicture);
virtual bool load(MfcArchive &file) { assert(0); return false; } // Disable base class
@@ -167,11 +174,12 @@ class PictureObject : public GameObject {
bool setPicAniInfo(PicAniInfo *picAniInfo);
bool isPointInside(int x, int y);
bool isPixelHitAtPos(int x, int y);
+ void setOXY2();
};
class Background : public CObject {
public:
- PtrList _picObjList;
+ Common::Array<PictureObject *> _picObjList;
char *_bgname;
int _x;
@@ -184,6 +192,8 @@ class Background : public CObject {
public:
Background();
+ virtual ~Background();
+
virtual bool load(MfcArchive &file);
void addPictureObject(PictureObject *pct);
diff --git a/engines/fullpipe/init.cpp b/engines/fullpipe/init.cpp
index fb60a4cc57..9602803010 100644
--- a/engines/fullpipe/init.cpp
+++ b/engines/fullpipe/init.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -45,35 +45,35 @@ void FullpipeEngine::initObjectStates() {
setSwallowedEggsState();
setObjectState(sO_WeirdWacko, getObjectEnumState(sO_WeirdWacko, sO_InGlasses));
- setObjectState(sO_TumyTrampie, getObjectEnumState(sO_TumyTrampie, sO_Drinking));
+ setObjectState(sO_TummyTrampie, getObjectEnumState(sO_TummyTrampie, sO_IsDrinking));
setObjectState(sO_StairsUp_8, getObjectEnumState(sO_StairsUp_8, sO_NotBroken));
setObjectState(sO_HareTheNooksiter, getObjectEnumState(sO_HareTheNooksiter, sO_WithHandle));
setObjectState(sO_Elephantine, getObjectEnumState(sO_Elephantine, sO_WithBoot));
setObjectState(sO_Fly_12, 0);
- setObjectState(sO_ClockAxis, getObjectEnumState(sO_ClockAxis, sO_NotAvailable));
+ setObjectState(sO_ClockAxis, getObjectEnumState(sO_ClockAxis, sO_IsNotAvailable));
setObjectState(sO_ClockHandle, getObjectEnumState(sO_ClockHandle, sO_In_7));
- setObjectState(sO_BigMumsy, getObjectEnumState(sO_BigMumsy, sO_Sleeping));
+ setObjectState(sO_BigMumsy, getObjectEnumState(sO_BigMumsy, sO_IsSleeping));
setObjectState(sO_CoinSlot_1, getObjectEnumState(sO_CoinSlot_1, sO_Empty));
setObjectState(sO_FriesPit, getObjectEnumState(sO_FriesPit, sO_WithApple));
setObjectState(sO_Jug, getObjectEnumState(sO_Jug, sO_Blocked));
- setObjectState(sO_RightStairs_9, getObjectEnumState(sO_RightStairs_9, sO_ClosedShe));
+ setObjectState(sO_RightStairs_9, getObjectEnumState(sO_RightStairs_9, sO_IsClosed));
setObjectState(sO_Pipe_9, getObjectEnumState(sO_Pipe_9, sO_WithJug));
setObjectState(sO_Inflater, getObjectEnumState(sO_Inflater, sO_WithGum));
- setObjectState(sO_Swingie, getObjectEnumState(sO_Swingie, sO_Swinging));
- setObjectState(sO_DudeJumped, getObjectEnumState(sO_DudeJumped, sO_No));
+ setObjectState(sO_Swingie, getObjectEnumState(sO_Swingie, sO_IsSwinging));
+ setObjectState(sO_DudeHasJumped, getObjectEnumState(sO_DudeHasJumped, sO_No));
setObjectState(sO_Bridge, getObjectEnumState(sO_Bridge, sO_Convoluted));
setObjectState(sO_Guardian, getObjectEnumState(sO_Guardian, sO_OnRight));
setObjectState(sO_Grandma, getObjectEnumState(sO_Grandma, sO_In_14));
setObjectState(sO_Boot_15, getObjectEnumState(sO_Boot_15, sO_NotPresent));
- setObjectState(sO_LeftPipe_15, getObjectEnumState(sO_LeftPipe_15, sO_OpenedShe));
+ setObjectState(sO_LeftPipe_15, getObjectEnumState(sO_LeftPipe_15, sO_IsOpened));
setObjectState(sO_Pedestal_16, getObjectEnumState(sO_Pedestal_16, sO_IsFree));
setObjectState(sO_Cup, getObjectEnumState(sO_Cup, sO_InSmokeRoom));
setObjectState(sO_Pedestal_17, getObjectEnumState(sO_Pedestal_17, sO_IsFree));
setObjectState(sO_UsherHand, getObjectEnumState(sO_UsherHand, sO_WithoutCoin));
- setObjectState(sO_RightPipe_17, getObjectEnumState(sO_RightPipe_17, sO_ClosedShe));
+ setObjectState(sO_RightPipe_17, getObjectEnumState(sO_RightPipe_17, sO_IsClosed));
setObjectState(sO_Fly_17, 1);
setObjectState(sO_DudeSwinged, 0);
- setObjectState(sO_Girl, getObjectEnumState(sO_Girl, sO_Swinging));
+ setObjectState(sO_Girl, getObjectEnumState(sO_Girl, sO_IsSwinging));
setObjectState(sO_Sugar, getObjectEnumState(sO_Sugar, sO_Present));
setObjectState(sO_Janitors, getObjectEnumState(sO_Janitors, sO_Together));
setObjectState(sO_Bag_22, getObjectEnumState(sO_Bag_22, sO_NotFallen));
@@ -83,22 +83,22 @@ void FullpipeEngine::initObjectStates() {
setObjectState(sO_LowerHatch_23, getObjectEnumState(sO_LowerHatch_23, sO_Closed));
setObjectState(sO_Lever_23, getObjectEnumState(sO_Lever_23, sO_NotTaken));
setObjectState(sO_LeverHandle_23, getObjectEnumState(sO_LeverHandle_23, sO_WithoutStool));
- setObjectState(sO_LowerPipe_21, getObjectEnumState(sO_LowerPipe_21, sO_ClosedShe));
- setObjectState(sO_StarsDown_24, getObjectEnumState(sO_StarsDown_24, sO_OpenedShe));
+ setObjectState(sO_LowerPipe_21, getObjectEnumState(sO_LowerPipe_21, sO_IsClosed));
+ setObjectState(sO_StairsDown_24, getObjectEnumState(sO_StairsDown_24, sO_IsOpened));
setObjectState(sO_Hatch_26, getObjectEnumState(sO_Hatch_26, sO_Closed));
setObjectState(sO_Sock_26, getObjectEnumState(sO_Sock_26, sO_NotHanging));
- setObjectState(sO_LeftPipe_26, getObjectEnumState(sO_LeftPipe_26, sO_ClosedShe));
+ setObjectState(sO_LeftPipe_26, getObjectEnumState(sO_LeftPipe_26, sO_IsClosed));
setObjectState(sO_Valve1_26, getObjectEnumState(sO_Valve1_26, sO_Opened));
setObjectState(sO_Valve2_26, getObjectEnumState(sO_Valve2_26, sO_Closed));
setObjectState(sO_Valve3_26, getObjectEnumState(sO_Valve3_26, sO_Closed));
setObjectState(sO_Valve4_26, getObjectEnumState(sO_Valve4_26, sO_Closed));
setObjectState(sO_Valve5_26, getObjectEnumState(sO_Valve5_26, sO_Opened));
setObjectState(sO_Pool, getObjectEnumState(sO_Pool, sO_Overfull));
- setObjectState(sO_Plank_25, getObjectEnumState(sO_Plank_25, sO_NearDudesStairs));
+ setObjectState(sO_Board_25, getObjectEnumState(sO_Board_25, sO_NearDudesStairs));
setObjectState(sO_Driver, getObjectEnumState(sO_Driver, sO_WithSteering));
- setObjectState(sO_Janitress, getObjectEnumState(sO_Janitress, sO_WithMop));
- setObjectState(sO_LeftPipe_29, getObjectEnumState(sO_LeftPipe_29, sO_ClosedShe));
- setObjectState(sO_LeftPipe_30, getObjectEnumState(sO_LeftPipe_30, sO_ClosedShe));
+ setObjectState(sO_Maid, getObjectEnumState(sO_Maid, sO_WithSwab));
+ setObjectState(sO_LeftPipe_29, getObjectEnumState(sO_LeftPipe_29, sO_IsClosed));
+ setObjectState(sO_LeftPipe_30, getObjectEnumState(sO_LeftPipe_30, sO_IsClosed));
setObjectState(sO_Leg, getObjectEnumState(sO_Leg, sO_ShowingHeel));
setObjectState(sO_Tub, getObjectEnumState(sO_Tub, sO_EmptyShe));
setObjectState(sO_Cactus, getObjectEnumState(sO_Cactus, sO_NotGrown));
@@ -116,7 +116,7 @@ void FullpipeEngine::initObjectStates() {
setObjectState(sO_BellyInflater, getObjectEnumState(sO_BellyInflater, sO_WithCork));
setObjectState(sO_Jawcrucnher, getObjectEnumState(sO_Jawcrucnher, sO_WithoutCarpet));
setObjectState(sO_Guard_1, getObjectEnumState(sO_Guard_1, sO_On));
- setObjectState(sO_Gurad_2, getObjectEnumState(sO_Gurad_2, sO_On));
+ setObjectState(sO_Guard_2, getObjectEnumState(sO_Guard_2, sO_On));
setObjectState(sO_Guard_3, getObjectEnumState(sO_Guard_3, sO_On));
setObjectState(sO_Bottle_38, getObjectEnumState(sO_Bottle_38, sO_OnTheTable));
setObjectState(sO_Boss, getObjectEnumState(sO_Boss, sO_WithHammer));
diff --git a/engines/fullpipe/input.cpp b/engines/fullpipe/input.cpp
index ee826fd359..7c97461a24 100644
--- a/engines/fullpipe/input.cpp
+++ b/engines/fullpipe/input.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -34,7 +34,7 @@
namespace Fullpipe {
InputController::InputController() {
- g_fullpipe->_inputController = this;
+ g_fp->_inputController = this;
_flag = 0;
_cursorHandle = 0;
@@ -55,16 +55,16 @@ InputController::InputController() {
InputController::~InputController() {
removeMessageHandler(126, -1);
- g_fullpipe->_inputController = 0;
+ g_fp->_inputController = 0;
}
void InputController::setInputDisabled(bool state) {
_flag = state;
- g_fullpipe->_inputDisabled = state;
+ g_fp->_inputDisabled = state;
}
void setInputDisabled(bool state) {
- g_fullpipe->_inputController->setInputDisabled(state);
+ g_fp->_inputController->setInputDisabled(state);
}
void InputController::addCursor(CursorInfo *cursor) {
@@ -93,8 +93,8 @@ void InputController::drawCursor(int x, int y) {
if (_cursorIndex == -1)
return;
- _cursorBounds.left = g_fullpipe->_sceneRect.left + x - _cursorsArray[_cursorIndex]->hotspotX;
- _cursorBounds.top = g_fullpipe->_sceneRect.top + y - _cursorsArray[_cursorIndex]->hotspotY;
+ _cursorBounds.left = g_fp->_sceneRect.left + x - _cursorsArray[_cursorIndex]->hotspotX;
+ _cursorBounds.top = g_fp->_sceneRect.top + y - _cursorsArray[_cursorIndex]->hotspotY;
_cursorBounds.right = _cursorBounds.left + _cursorsArray[_cursorIndex]->width;
_cursorBounds.bottom = _cursorBounds.top + _cursorsArray[_cursorIndex]->height;
@@ -211,7 +211,7 @@ void FullpipeEngine::winArcade() {
}
-void FullpipeEngine::updateCursorsCommon() {
+void FullpipeEngine::updateCursorCommon() {
GameObject *ani = _currentScene->getStaticANIObjectAtPos(_mouseVirtX, _mouseVirtY);
GameObject *pic = _currentScene->getPictureObjectAtPos(_mouseVirtX, _mouseVirtY);
@@ -274,4 +274,103 @@ void FullpipeEngine::updateCursorsCommon() {
_cursorId = PIC_CSR_DEFAULT;
}
+void FullpipeEngine::initArcadeKeys(const char *varname) {
+ _arcadeKeys.clear();
+
+ GameVar *var = getGameLoaderGameVar()->getSubVarByName(varname)->getSubVarByName("KEYPOS");
+
+ if (!var)
+ return;
+
+ int cnt = var->getSubVarsCount();
+
+ for (int i = 0; i < cnt; i++) {
+ Common::Point *point = new Common::Point;
+
+ GameVar *sub = var->getSubVarByIndex(i);
+
+ point->x = sub->getSubVarAsInt("X");
+ point->y = sub->getSubVarAsInt("Y");
+
+ _arcadeKeys.push_back(point);
+ }
+}
+
+void FullpipeEngine::processArcade(ExCommand *cmd) {
+ if (!g_fp->_aniMan2)
+ return;
+
+ int idx;
+
+ if (cmd->_sceneClickX <= g_fp->_aniMan2->_ox) {
+ for (idx = (int)_arcadeKeys.size() - 1; idx >= 0; idx--) {
+ if (_arcadeKeys[idx]->x < g_fp->_aniMan2->_ox)
+ break;
+ }
+
+ if (idx < 0)
+ return;
+ } else {
+ for (idx = 0; idx < (int)_arcadeKeys.size(); idx++) {
+ if (_arcadeKeys[idx]->x > g_fp->_aniMan2->_ox)
+ break;
+ }
+
+ if (idx >= (int)_arcadeKeys.size())
+ return;
+ }
+
+ cmd->_sceneClickX = _arcadeKeys[idx]->x;
+ cmd->_sceneClickY = _arcadeKeys[idx]->y;
+
+ cmd->_x = cmd->_sceneClickX - g_fp->_sceneRect.left;
+ cmd->_y = cmd->_sceneClickY - g_fp->_sceneRect.top;
+}
+
+void FullpipeEngine::setArcadeOverlay(int picId) {
+ Common::Point point;
+ Common::Point point2;
+
+ _arcadeOverlayX = 800;
+ _arcadeOverlayY = 545;
+
+ _arcadeOverlayHelper = accessScene(SC_INV)->getPictureObjectById(PIC_CSR_HELPERBGR, 0);
+ _arcadeOverlay = accessScene(SC_INV)->getPictureObjectById(picId, 0);
+
+ _arcadeOverlay->getDimensions(&point);
+ _arcadeOverlayHelper->getDimensions(&point2);
+
+ _arcadeOverlayMidX = (point2.x - point.x) / 2;
+ _arcadeOverlayMidY = abs(point2.y - point.y) / 2;
+}
+
+int FullpipeEngine::drawArcadeOverlay(int adjust) {
+ _arcadeOverlayHelper->drawAt(_sceneRect.left + _arcadeOverlayX, _sceneRect.top + _arcadeOverlayY);
+ _arcadeOverlay->drawAt(_sceneRect.left + _arcadeOverlayX + _arcadeOverlayMidX, _sceneRect.top + _arcadeOverlayY + _arcadeOverlayMidY);
+
+ if (adjust) {
+ if (_arcadeOverlayX > 745) {
+ _arcadeOverlayX -= 15;
+
+ if (_arcadeOverlayX < 745)
+ _arcadeOverlayX = 745;
+ }
+
+ return 1;
+ }
+
+ if (_arcadeOverlayX >= 800) {
+ return 0;
+ } else {
+ _arcadeOverlayX += 15;
+
+ if (_arcadeOverlayX <= 800)
+ return 1;
+
+ _arcadeOverlayX = 800;
+ }
+
+ return 1;
+}
+
} // End of namespace Fullpipe
diff --git a/engines/fullpipe/input.h b/engines/fullpipe/input.h
index bfd547ae2f..6a1d0f8b07 100644
--- a/engines/fullpipe/input.h
+++ b/engines/fullpipe/input.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/fullpipe/interaction.cpp b/engines/fullpipe/interaction.cpp
index 80cbce946b..84e9688e30 100644
--- a/engines/fullpipe/interaction.cpp
+++ b/engines/fullpipe/interaction.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -36,8 +36,8 @@ int handleObjectInteraction(StaticANIObject *subject, GameObject *object, int in
bool canInteractAny(GameObject *obj1, GameObject *obj2, int invId) {
int sceneId = 0;
- if (g_fullpipe->_currentScene)
- sceneId = g_fullpipe->_currentScene->_sceneId;
+ if (g_fp->_currentScene)
+ sceneId = g_fp->_currentScene->_sceneId;
InteractionController *intC = getGameLoaderInteractionController();
for (ObList::iterator i = intC->_interactions.begin(); i != intC->_interactions.end(); ++i) {
@@ -55,6 +55,12 @@ bool canInteractAny(GameObject *obj1, GameObject *obj2, int invId) {
return false;
}
+InteractionController::~InteractionController() {
+ _interactions.clear();
+
+ removeMessageHandler(124, -1);
+}
+
bool InteractionController::load(MfcArchive &file) {
debug(5, "InteractionController::load()");
@@ -137,7 +143,7 @@ bool InteractionController::handleInteraction(StaticANIObject *subj, GameObject
obj->setPicAniInfo(&aniInfo);
if (abs(xpos - subj->_ox) > 1 || abs(ypos - subj->_oy) > 1) {
- mq = getSc2MctlCompoundBySceneId(g_fullpipe->_currentScene->_sceneId)->doWalkTo(subj, xpos, ypos, 1, cinter->_staticsId2);
+ mq = getSc2MctlCompoundBySceneId(g_fp->_currentScene->_sceneId)->doWalkTo(subj, xpos, ypos, 1, cinter->_staticsId2);
if (mq) {
dur = mq->calcDuration(subj);
delete mq;
@@ -186,7 +192,7 @@ bool InteractionController::handleInteraction(StaticANIObject *subj, GameObject
ex->_excFlags = 3;
ex->_field_14 = (obj->_objtype != kObjTypePictureObject);
ex->_field_20 = invId;
- mq->_exCommands.push_back(ex);
+ mq->addExCommandToEnd(ex);
if (mq->_isFinished) {
mq->_isFinished = 0;
@@ -255,7 +261,7 @@ LABEL_38:
ex->_field_14 = 0x100;
ex->_messageNum = 0;
ex->_excFlags = 3;
- mq->_exCommands.push_back(ex);
+ mq->addExCommandToEnd(ex);
}
ex = new ExCommand(obj->_id, 34, 0x100, 0, 0, 0, 1, 0, 0, 0);
@@ -263,19 +269,19 @@ LABEL_38:
ex->_field_14 = 0x100;
ex->_messageNum = 0;
ex->_excFlags = 3;
- mq->_exCommands.push_back(ex);
+ mq->addExCommandToEnd(ex);
ex = new ExCommand(subj->_id, 34, 0x100, 0, 0, 0, 1, 0, 0, 0);
ex->_keyCode = subj->_okeyCode;
ex->_field_14 = 0x100;
ex->_messageNum = 0;
ex->_excFlags = 3;
- mq->_exCommands.push_back(ex);
+ mq->addExCommandToEnd(ex);
ex = new ExCommand(subj->_id, 17, 0x40, 0, 0, 0, 1, 0, 0, 0);
ex->_excFlags |= 3;
ex->_keyCode = 0;
- mq->_exCommands.push_back(ex);
+ mq->addExCommandToEnd(ex);
if (!mq->chain(subj)) {
delete mq;
@@ -305,7 +311,7 @@ LABEL_38:
if (abs(xpos - subj->_ox) > 1 || abs(ypos - subj->_oy) > 1
|| (inter->_staticsId2 != 0 && (subj->_statics == 0 || subj->_statics->_staticsId != inter->_staticsId2))) {
- mq = getSc2MctlCompoundBySceneId(g_fullpipe->_currentScene->_sceneId)->method34(subj, xpos, ypos, 1, inter->_staticsId2);
+ mq = getSc2MctlCompoundBySceneId(g_fp->_currentScene->_sceneId)->method34(subj, xpos, ypos, 1, inter->_staticsId2);
if (!mq)
return false;
@@ -317,7 +323,7 @@ LABEL_38:
ex->_excFlags = 3;
ex->_field_20 = invId;
ex->_field_14 = (obj->_objtype != kObjTypePictureObject);
- mq->_exCommands.push_back(ex);
+ mq->addExCommandToEnd(ex);
someFlag = true;
@@ -357,14 +363,14 @@ LABEL_38:
ex->_field_14 = 0x80;
ex->_keyCode = ani->_okeyCode;
ex->_excFlags = 3;
- mq->_exCommands.push_back(ex);
+ mq->addExCommandToEnd(ex);
}
}
ex = new ExCommand(ani->_id, 34, 0x100, 0, 0, 0, 1, 0, 0, 0);
ex->_keyCode = ani->_okeyCode;
ex->_field_14 = 0x100;
ex->_excFlags = 3;
- mq->_exCommands.push_back(ex);
+ mq->addExCommandToEnd(ex);
} else {
ex = new ExCommand(subj->_id, 55, 0, 0, 0, 0, 1, 0, 0, 0);
ex->_x = ani->_id;
@@ -373,7 +379,7 @@ LABEL_38:
ex->_excFlags = 2;
ex->_field_14 = (obj->_objtype != kObjTypePictureObject);
ex->_field_20 = invId;
- mq->_exCommands.push_back(ex);
+ mq->addExCommandToEnd(ex);
if (!mq->_isFinished)
return true;
@@ -394,6 +400,17 @@ LABEL_38:
return true;
}
+Interaction *InteractionController::getInteractionByObjectIds(int obId, int obId2, int obId3) {
+ for (ObList::iterator i = _interactions.begin(); i != _interactions.end(); ++i) {
+ Interaction *intr = (Interaction *)*i;
+
+ if (intr->_objectId1 == obId && intr->_objectId2 == obId2 && intr->_objectId3 == obId3)
+ return intr;
+ }
+
+ return 0;
+}
+
Interaction::Interaction() {
_objectId1 = 0;
_objectId2 = 0;
@@ -411,6 +428,17 @@ Interaction::Interaction() {
_actionName = 0;
}
+Interaction::~Interaction() {
+ if (_messageQueue) {
+ while (_messageQueue->getExCommandByIndex(0))
+ _messageQueue->deleteExCommandByIndex(0, 1);
+ }
+
+ delete _messageQueue;
+
+ free(_actionName);
+}
+
bool Interaction::load(MfcArchive &file) {
debug(5, "Interaction::load()");
@@ -433,7 +461,7 @@ bool Interaction::load(MfcArchive &file) {
}
bool Interaction::canInteract(GameObject *obj1, GameObject *obj2, int invId) {
- if (_sceneId > 0 && g_fullpipe->_currentScene && g_fullpipe->_currentScene->_sceneId != _sceneId)
+ if (_sceneId > 0 && g_fp->_currentScene && g_fp->_currentScene->_sceneId != _sceneId)
return false;
if (_flags & 0x20000)
@@ -465,20 +493,20 @@ bool Interaction::canInteract(GameObject *obj1, GameObject *obj2, int invId) {
if (_objectState1) {
if (_flags & 0x10) {
- if ((g_fullpipe->getObjectState(obj1->getName()) & _objectState1) == 0)
+ if ((g_fp->getObjectState(obj1->getName()) & _objectState1) == 0)
return false;
} else {
- if (g_fullpipe->getObjectState(obj1->getName()) != _objectState1)
+ if (g_fp->getObjectState(obj1->getName()) != _objectState1)
return false;
}
}
if (_objectState2) {
if (_flags & 0x10) {
- if ((g_fullpipe->getObjectState(obj2->getName()) & _objectState2) == 0)
+ if ((g_fp->getObjectState(obj2->getName()) & _objectState2) == 0)
return false;
} else {
- if (g_fullpipe->getObjectState(obj2->getName()) != _objectState2)
+ if (g_fp->getObjectState(obj2->getName()) != _objectState2)
return false;
}
}
diff --git a/engines/fullpipe/interaction.h b/engines/fullpipe/interaction.h
index f968cca8ee..cb1eac002a 100644
--- a/engines/fullpipe/interaction.h
+++ b/engines/fullpipe/interaction.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -54,6 +54,8 @@ class Interaction : public CObject {
public:
Interaction();
+ virtual ~Interaction();
+
virtual bool load(MfcArchive &file);
bool canInteract(GameObject *obj1, GameObject *obj2, int invId);
bool isOverlapping(StaticANIObject *subj, GameObject *obj);
@@ -70,6 +72,7 @@ class InteractionController : public CObject {
public:
InteractionController() : _field_20(0), _flag24(true) {}
+ virtual ~InteractionController();
virtual bool load(MfcArchive &file);
@@ -79,6 +82,8 @@ class InteractionController : public CObject {
void sortInteractions(int sceneId);
bool handleInteraction(StaticANIObject *subj, GameObject *obj, int invId);
+
+ Interaction *getInteractionByObjectIds(int obId, int obId2, int obId3);
};
struct EntranceInfo {
diff --git a/engines/fullpipe/inventory.cpp b/engines/fullpipe/inventory.cpp
index 18ef3c4d97..e79f9c54df 100644
--- a/engines/fullpipe/inventory.cpp
+++ b/engines/fullpipe/inventory.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -30,6 +30,10 @@
namespace Fullpipe {
+Inventory::~Inventory() {
+ _itemsPool.clear();
+}
+
bool Inventory::load(MfcArchive &file) {
debug(5, "Inventory::load()");
@@ -85,6 +89,10 @@ Inventory2::Inventory2() {
_topOffset = -65;
}
+Inventory2::~Inventory2() {
+ removeMessageHandler(125, -1);
+}
+
bool Inventory2::loadPartial(MfcArchive &file) { // Inventory2_SerializePartially
int numInvs = file.readUint32LE();
@@ -115,7 +123,25 @@ void Inventory2::removeItem(int itemId, int count) {
}
void Inventory2::removeItem2(Scene *sceneObj, int itemId, int x, int y, int priority) {
- warning("STUB: void removeItem2(sc, %d, %d, %d, %d)", itemId, x, y, priority);
+ int idx = getInventoryItemIndexById(itemId);
+
+ if (idx >= 0) {
+ if (_inventoryItems[idx]->itemId >> 16) {
+ removeItem(itemId, 1);
+
+ Scene *sc = g_fp->accessScene(_sceneId);
+
+ if (sc) {
+ StaticANIObject *ani = new StaticANIObject(sc->getStaticANIObject1ById(itemId, -1));
+
+ sceneObj->addStaticANIObject(ani, 1);
+
+ ani->_statics = (Statics *)ani->_staticsList[0];
+ ani->setOXY(x, y);
+ ani->_priority = priority;
+ }
+ }
+ }
}
int Inventory2::getCountItemsWithId(int itemId) {
@@ -161,7 +187,7 @@ int Inventory2::getItemFlags(int itemId) {
}
void Inventory2::rebuildItemRects() {
- _scene = g_fullpipe->accessScene(_sceneId);
+ _scene = g_fp->accessScene(_sceneId);
if (!_scene)
return;
@@ -193,7 +219,7 @@ void Inventory2::rebuildItemRects() {
InventoryIcon *icn = new InventoryIcon();
icn->inventoryItemId = _itemsPool[idx]->id;
-
+
icn->pictureObjectNormal = _scene->getPictureObjectById(_itemsPool[idx]->pictureObjectNormal, 0);
icn->pictureObjectHover = _scene->getPictureObjectById(_itemsPool[idx]->pictureObjectHover, 0);
icn->pictureObjectSelected = _scene->getPictureObjectById(_itemsPool[idx]->pictureObjectSelected, 0);
@@ -226,11 +252,11 @@ void Inventory2::draw() {
if (!_scene)
return;
- int oldScLeft = g_fullpipe->_sceneRect.left;
- int oldScTop = g_fullpipe->_sceneRect.top;
+ int oldScLeft = g_fp->_sceneRect.left;
+ int oldScTop = g_fp->_sceneRect.top;
- g_fullpipe->_sceneRect.top = -_topOffset;
- g_fullpipe->_sceneRect.left = 0;
+ g_fp->_sceneRect.top = -_topOffset;
+ g_fp->_sceneRect.left = 0;
_picture->draw(-1, -1, 0, 0);
@@ -290,8 +316,8 @@ LABEL_25:
reset:
- g_fullpipe->_sceneRect.top = oldScTop;
- g_fullpipe->_sceneRect.left = oldScLeft;
+ g_fp->_sceneRect.top = oldScTop;
+ g_fp->_sceneRect.left = oldScLeft;
}
@@ -326,7 +352,7 @@ bool Inventory2::handleLeftClick(ExCommand *cmd) {
bool res = false;
for (uint i = 0; i < _inventoryIcons.size(); i++) {
- if (cmd->_x >= _inventoryIcons[i]->x1 && cmd->_x <= _inventoryIcons[i]->x2 &&
+ if (cmd->_x >= _inventoryIcons[i]->x1 && cmd->_x <= _inventoryIcons[i]->x2 &&
cmd->_y >= _inventoryIcons[i]->y1 && cmd->_y <= _inventoryIcons[i]->y2) {
if (getSelectedItemId()) {
if (getSelectedItemId() != _inventoryIcons[i]->inventoryItemId)
@@ -365,7 +391,7 @@ int Inventory2::selectItem(int itemId) {
int idx = getInventoryPoolItemIndexById(itemId);
Picture *pic = _scene->getPictureObjectById(_itemsPool[idx]->pictureObjectId1, 0)->_picture;
- g_fullpipe->getGameLoaderInputController()->setCursorItemPicture(pic);
+ g_fp->getGameLoaderInputController()->setCursorItemPicture(pic);
}
return _selectedId;
@@ -382,7 +408,7 @@ bool Inventory2::unselectItem(bool flag) {
_inventoryIcons[i]->isSelected = false;
}
- g_fullpipe->getGameLoaderInputController()->setCursorItemPicture(0);
+ g_fp->getGameLoaderInputController()->setCursorItemPicture(0);
return true;
}
@@ -421,6 +447,15 @@ int Inventory2::getHoveredItem(Common::Point *point) {
return 0;
}
+void Inventory2::clear() {
+ unselectItem(0);
+
+ for (uint i = 0; i < _inventoryItems.size(); i++)
+ getInventoryPoolItemFieldCById(_inventoryItems[i]->itemId);
+
+ _inventoryItems.clear();
+}
+
void FullpipeEngine::getAllInventory() {
Inventory2 *inv = getGameLoaderInventory();
diff --git a/engines/fullpipe/inventory.h b/engines/fullpipe/inventory.h
index 6d07f069bd..46b55c5669 100644
--- a/engines/fullpipe/inventory.h
+++ b/engines/fullpipe/inventory.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -49,6 +49,8 @@ class Inventory : public CObject {
public:
Inventory() { _sceneId = 0; }
+ virtual ~Inventory();
+
virtual bool load(MfcArchive &file);
int getInventoryPoolItemIndexById(int itemId);
@@ -96,6 +98,8 @@ class Inventory2 : public Inventory {
public:
Inventory2();
+ virtual ~Inventory2();
+
bool loadPartial(MfcArchive &file);
void addItem(int itemId, int count);
void addItem2(StaticANIObject *obj);
@@ -125,6 +129,8 @@ class Inventory2 : public Inventory {
bool unselectItem(bool flag);
void draw();
+
+ void clear();
};
} // End of namespace Fullpipe
diff --git a/engines/fullpipe/lift.cpp b/engines/fullpipe/lift.cpp
index 25dd2613fe..9a3d91540a 100644
--- a/engines/fullpipe/lift.cpp
+++ b/engines/fullpipe/lift.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -22,46 +22,497 @@
#include "fullpipe/fullpipe.h"
+#include "fullpipe/objects.h"
+#include "fullpipe/objectnames.h"
#include "fullpipe/constants.h"
+#include "fullpipe/scene.h"
+#include "fullpipe/statics.h"
+#include "fullpipe/messages.h"
+#include "fullpipe/gameloader.h"
+#include "fullpipe/motion.h"
+
namespace Fullpipe {
int FullpipeEngine::lift_getButtonIdP(int objid) {
switch (objid) {
case ST_LBN_0N:
return ST_LBN_0P;
- break;
+
case ST_LBN_1N:
return ST_LBN_1P;
- break;
+
case ST_LBN_2N:
return ST_LBN_2P;
- break;
+
case ST_LBN_3N:
return ST_LBN_3P;
- break;
+
case ST_LBN_4N:
return ST_LBN_4P;
- break;
+
case ST_LBN_5N:
return ST_LBN_5P;
- break;
+
case ST_LBN_6N:
return ST_LBN_6P;
- break;
+
case ST_LBN_7N:
return ST_LBN_7P;
- break;
+
case ST_LBN_8N:
return ST_LBN_8P;
- break;
+
case ST_LBN_9N:
return ST_LBN_9P;
- break;
+
default:
return 0;
- break;
}
}
+int FullpipeEngine::lift_getButtonIdH(int objid) {
+ switch (objid) {
+ case ST_LBN_0P:
+ return ST_LBN_0H;
+
+ case ST_LBN_1P:
+ return ST_LBN_1H;
+
+ case ST_LBN_2P:
+ return ST_LBN_2H;
+
+ case ST_LBN_3P:
+ return ST_LBN_3H;
+
+ case ST_LBN_4P:
+ return ST_LBN_4H;
+
+ case ST_LBN_5P:
+ return ST_LBN_5H;
+
+ case ST_LBN_6P:
+ return ST_LBN_6H;
+
+ case ST_LBN_7P:
+ return ST_LBN_7H;
+
+ case ST_LBN_8P:
+ return ST_LBN_8H;
+
+ case ST_LBN_9P:
+ return ST_LBN_9H;
+
+ default:
+ return 0;
+ }
+}
+
+int FullpipeEngine::lift_getButtonIdN(int objid) {
+ switch (objid) {
+ case ST_LBN_0H:
+ case ST_LBN_0N:
+ case ST_LBN_0P:
+ return ST_LBN_0N;
+
+ case ST_LBN_1H:
+ case ST_LBN_1N:
+ case ST_LBN_1P:
+ return ST_LBN_1N;
+
+ case ST_LBN_2H:
+ case ST_LBN_2N:
+ case ST_LBN_2P:
+ return ST_LBN_2N;
+
+ case ST_LBN_3H:
+ case ST_LBN_3N:
+ case ST_LBN_3P:
+ return ST_LBN_3N;
+
+ case ST_LBN_4H:
+ case ST_LBN_4N:
+ case ST_LBN_4P:
+ return ST_LBN_4N;
+
+ case ST_LBN_5H:
+ case ST_LBN_5N:
+ case ST_LBN_5P:
+ return ST_LBN_5N;
+
+ case ST_LBN_6H:
+ case ST_LBN_6N:
+ case ST_LBN_6P:
+ return ST_LBN_6N;
+
+ case ST_LBN_7H:
+ case ST_LBN_7N:
+ case ST_LBN_7P:
+ return ST_LBN_7N;
+
+ case ST_LBN_8H:
+ case ST_LBN_8N:
+ case ST_LBN_8P:
+ return ST_LBN_8N;
+
+ case ST_LBN_9H:
+ case ST_LBN_9N:
+ case ST_LBN_9P:
+ return ST_LBN_9N;
+
+ default:
+ return 0;
+ }
+}
+
+void FullpipeEngine::lift_setButton(const char *name, int state) {
+ GameVar *var = g_fp->getGameLoaderGameVar()->getSubVarByName("OBJSTATES")->getSubVarByName(sO_LiftButtons);
+
+ if (var)
+ var->setSubVarAsInt(name, state);
+}
+
+void FullpipeEngine::lift_init(Scene *sc, int enterSeq, int exitSeq) {
+ _lastLiftButton = 0;
+
+ _liftEnterMQ = sc->getMessageQueueById(enterSeq);
+ if (!_liftEnterMQ)
+ return;
+
+ _liftExitMQ = sc->getMessageQueueById(exitSeq);
+
+ if (!_liftExitMQ)
+ return;
+
+ ExCommand *ex = _liftEnterMQ->getExCommandByIndex(0);
+
+ if (!ex)
+ return;
+
+ _liftX = ex->_x;
+ _liftY = ex->_y;
+
+ _lift = sc->getStaticANIObject1ById(ANI_LIFT, -1);
+
+ for (uint i = 0; i < sc->_staticANIObjectList1.size(); i++) {
+ StaticANIObject *ani = (StaticANIObject *)sc->_staticANIObjectList1[i];
+
+ if (ani->_id == ANI_LIFTBUTTON)
+ ani->_statics = ani->getStaticsById(lift_getButtonIdP(ani->_statics->_staticsId));
+ }
+
+ GameVar *var = getGameLoaderGameVar()->getSubVarByName("OBJSTATES")->getSubVarByName(sO_LiftButtons);
+ if (var) {
+ for (var = var->_subVars; var; var = var->_nextVarObj) {
+ for (uint i = 0; i < sc->_staticANIObjectList1.size(); i++) {
+ StaticANIObject *ani = (StaticANIObject *)sc->_staticANIObjectList1[i];
+
+ if (ani->_id == ANI_LIFTBUTTON) {
+ int id = lift_getButtonIdN(ani->_statics->_staticsId);
+
+ if (id == var->_value.intValue)
+ ani->_statics = ani->getStaticsById(id);
+ }
+
+ }
+ }
+ }
+}
+
+void FullpipeEngine::lift_exitSeq(ExCommand *cmd) {
+ if (cmd) {
+ MessageQueue *mq = _globalMessageQueueList->getMessageQueueById(cmd->_parId);
+
+ if (mq)
+ mq->activateExCommandsByKind(34);
+ }
+
+ _lift->changeStatics2(ST_LFT_CLOSED);
+
+ MessageQueue *mq = new MessageQueue(_globalMessageQueueList->compact());
+
+ ExCommand *ex = new ExCommand(_aniMan->_id, 34, 256, 0, 0, 0, 1, 0, 0, 0);
+
+ ex->_field_14 = 256;
+ ex->_messageNum = 256;
+ ex->_excFlags |= 3;
+ mq->addExCommandToEnd(ex);
+
+ if (!cmd) {
+ ex = new ExCommand(_aniMan->_id, 2, 40, 0, 0, 0, 1, 0, 0, 0);
+ ex->_keyCode = _aniMan->_okeyCode;
+ ex->_excFlags |= 2;
+ mq->addExCommandToEnd(ex);
+ }
+
+ ex = new ExCommand(_lift->_id, 1, MV_LFT_OPEN, 0, 0, 0, 1, 0, 0, 0);
+ ex->_keyCode = _lift->_okeyCode;
+ ex->_excFlags |= 2;
+ mq->addExCommandToEnd(ex);
+
+ ex = new ExCommand(_aniMan->_id, 1, MV_MAN_STARTD, 0, 0, 0, 1, 0, 0, 0);
+ ex->_keyCode = _aniMan->_okeyCode;
+ ex->_excFlags |= 2;
+ mq->addExCommandToEnd(ex);
+
+ ex = new ExCommand(_aniMan->_id, 5, -1, 0, 0, 0, 1, 0, 0, 0);
+ ex->_keyCode = _aniMan->_okeyCode;
+ ex->_field_14 = 10;
+ ex->_x = -1;
+ ex->_y = -1;
+ ex->_excFlags |= 3;
+ mq->addExCommandToEnd(ex);
+
+ ex = new ExCommand(_aniMan->_id, 34, 256, 0, 0, 0, 1, 0, 0, 0);
+ ex->_excFlags |= 3;
+ ex->_field_14 = 256;
+ ex->_messageNum = 0;
+ mq->addExCommandToEnd(ex);
+
+ ex = new ExCommand(0, 17, MSG_LIFT_STARTEXITQUEUE, 0, 0, 0, 1, 0, 0, 0);
+ ex->_excFlags |= 3;
+ mq->addExCommandToEnd(ex);
+
+ ex = new ExCommand(_lift->_id, 1, MV_LFT_CLOSE, 0, 0, 0, 1, 0, 0, 0);
+ ex->_keyCode = _lift->_okeyCode;
+ ex->_excFlags |= 2;
+
+ mq->addExCommandToEnd(ex);
+
+ mq->chain(0);
+}
+
+void FullpipeEngine::lift_closedoorSeq() {
+ if (_lift->_movement) {
+ if (_lift->_movement->_id == MV_LFT_CLOSE) {
+ _lift->queueMessageQueue(0);
+ } else if (_lift->_movement->_id == MV_LFT_OPEN) {
+ int ph = _lift->_movement->_currDynamicPhaseIndex;
+
+ _lift->changeStatics2(ST_LFT_OPEN_NEW);
+ _lift->startAnim(MV_LFT_CLOSE, 0, -1);
+
+ if (_lift->_movement->_currMovement)
+ _lift->_movement->setDynamicPhaseIndex(_lift->_movement->_currMovement->_dynamicPhases.size() - ph);
+ else
+ _lift->_movement->setDynamicPhaseIndex(_lift->_movement->_dynamicPhases.size() - ph);
+ } else {
+ _lift->changeStatics2(ST_LFT_OPEN_NEW);
+
+ _lift->startAnim(MV_LFT_CLOSE, 0, -1);
+ }
+ } else {
+ if (_lift->_statics->_staticsId == ST_LFT_CLOSED ) {
+ _lift->changeStatics2(ST_LFT_CLOSED);
+ } else {
+ _lift->startAnim(MV_LFT_CLOSE, 0, -1);
+ }
+ }
+
+ MessageQueue *mq = new MessageQueue(_globalMessageQueueList->compact());
+ ExCommand *ex = new ExCommand(0, 17, MSG_LIFT_GO, 0, 0, 0, 1, 0, 0, 0);
+
+ ex->_excFlags |= 3;
+ mq->addExCommandToEnd(ex);
+
+ if (!mq->chain(_lift))
+ delete mq;
+}
+
+void FullpipeEngine::lift_walkAndGo() {
+ MessageQueue *mq;
+ ExCommand *ex;
+
+ if (abs(_liftX - _aniMan->_ox) > 1 || abs(_liftY - _aniMan->_oy) > 1 || _aniMan->_movement || _aniMan->_statics->_staticsId != ST_MAN_UP) {
+ mq = getCurrSceneSc2MotionController()->method34(_aniMan, _liftX, _liftY, 1, ST_MAN_UP);
+
+ if (mq) {
+ ex = new ExCommand(0, 17, MSG_LIFT_CLICKBUTTON, 0, 0, 0, 1, 0, 0, 0);
+ ex->_excFlags |= 3;
+
+ mq->addExCommandToEnd(ex);
+ }
+ } else {
+ lift_openLift();
+
+ mq = new MessageQueue(_liftEnterMQ, 0, 0);
+
+ mq->setFlags(mq->getFlags() | 1);
+
+ ex = new ExCommand(_aniMan->_id, 2, 15, 0, 0, 0, 1, 0, 0, 0);
+ ex->_keyCode = _aniMan->_okeyCode;
+ ex->_excFlags |= 2;
+ mq->addExCommand(ex);
+
+ ex = new ExCommand(_aniMan->_id, 5, -1, 0, 0, 0, 1, 0, 0, 0);
+ ex->_keyCode = _aniMan->_okeyCode;
+ ex->_field_14 = _lift->_priority + 1;
+ ex->_x = -1;
+ ex->_y = -1;
+ ex->_excFlags |= 3;
+ mq->addExCommandToEnd(ex);
+
+ ex = new ExCommand(0, 17, MSG_LIFT_CLOSEDOOR, 0, 0, 0, 1, 0, 0, 0);
+ ex->_excFlags |= 3;
+ mq->addExCommandToEnd(ex);
+
+ mq->chain(0);
+
+ _aniMan->_flags |= 1;
+ }
+}
+
+void FullpipeEngine::lift_openLift() {
+ if (_lift->_movement) {
+ if (_lift->_movement->_id == MV_LFT_OPEN) {
+ _lift->queueMessageQueue(0);
+ } else if (_lift->_movement->_id == MV_LFT_CLOSE) {
+ int idx = _lift->_movement->_currDynamicPhaseIndex;
+
+ _lift->changeStatics2(ST_LFT_CLOSED);
+ _lift->startAnim(MV_LFT_OPEN, 0, -1);
+
+ if (_lift->_movement->_currMovement)
+ _lift->_movement->setDynamicPhaseIndex(_lift->_movement->_currMovement->_dynamicPhases.size() - idx);
+ else
+ _lift->_movement->setDynamicPhaseIndex(_lift->_movement->_dynamicPhases.size() - idx);
+ } else {
+ _lift->changeStatics2(ST_LFT_CLOSED);
+ _lift->startAnim(MV_LFT_OPEN, 0, -1);
+ }
+ } else if (_lift->_statics->_staticsId == ST_LFT_OPEN_NEW) {
+ _lift->changeStatics2(ST_LFT_OPEN_NEW);
+ } else {
+ _lift->startAnim(MV_LFT_OPEN, 0, -1);
+ }
+}
+
+void FullpipeEngine::lift_clickButton() {
+ if (_lastLiftButton)
+ lift_walkAndGo();
+}
+
+void FullpipeEngine::lift_goAnimation() { if (_lastLiftButton) {
+ int parentId = _currentScene->_sceneId;
+ int buttonId = lift_getButtonIdN(_lastLiftButton->_statics->_staticsId);
+
+ if (!buttonId)
+ return;
+
+ int numItems = _gameLoader->_preloadItems.size();
+
+ for (int i = 0; i < numItems; i++) {
+ PreloadItem *pre = _gameLoader->_preloadItems[i];
+
+ if (pre->preloadId2 == buttonId && pre->preloadId1 == _currentScene->_sceneId) {
+ MessageQueue *mq = new MessageQueue(_globalMessageQueueList->compact());
+
+ ExCommand *ex = new ExCommand(ANI_MAN, 1, (pre->keyCode != LiftDown ? MV_MAN_LIFTDOWN : MV_MAN_LIFTUP), 0, 0, 0, 1, 0, 0, 0);
+
+ ex->_keyCode = -1;
+ ex->_field_24 = 1;
+ ex->_excFlags |= 2;
+
+ mq->addExCommandToEnd(ex);
+
+ ex = new ExCommand(parentId, 17, 61, 0, 0, 0, 1, 0, 0, 0);
+
+ ex->_keyCode = buttonId;
+ ex->_excFlags |= 3;
+
+ mq->addExCommandToEnd(ex);
+
+ _aniMan->_flags &= 0xFEFF;
+
+ if (!mq->chain(_aniMan))
+ delete mq;
+
+ _aniMan->_flags |= 1;
+ }
+ }
+ }
+
+ lift_exitSeq(0);
+
+ if (_lastLiftButton) {
+ _lastLiftButton->_statics = _lastLiftButton->getStaticsById(lift_getButtonIdN(_lastLiftButton->_statics->_staticsId));
+ _lastLiftButton = 0;
+ }
+}
+
+void FullpipeEngine::lift_animateButton(StaticANIObject *button) {
+ int butId = lift_getButtonIdP(button->_statics->_staticsId);
+
+ if (butId && butId != button->_statics->_staticsId) {
+ if (button == _lastLiftButton) {
+ playSound(SND_CMN_032, 0);
+ } else {
+ if (_lastLiftButton) {
+ int id = lift_getButtonIdN(_lastLiftButton->_statics->_staticsId);
+
+ if (id)
+ _lastLiftButton->_statics = _lastLiftButton->getStaticsById(id);
+
+ _lastLiftButton = 0;
+ }
+
+ if (_aniMan->isIdle() && !(_aniMan->_flags & 0x100)) {
+ _lastLiftButton = button;
+ button->_statics = button->getStaticsById(butId);
+
+ ExCommand *ex = new ExCommand(0, 35, SND_CMN_032, 0, 0, 0, 1, 0, 0, 0);
+ ex->_excFlags |= 3;
+ ex->_field_14 = 1;
+ ex->postMessage();
+
+ int id = lift_getButtonIdH(_lastLiftButton->_statics->_staticsId);
+
+ if (id) {
+ _lastLiftButton->_statics = _lastLiftButton->getStaticsById(id);
+
+ lift_walkAndGo();
+ }
+ }
+ }
+ }
+}
+
+void FullpipeEngine::lift_startExitQueue() {
+ MessageQueue *mq = new MessageQueue(_liftExitMQ, 0, 0);
+
+ mq->chain(0);
+}
+
+void FullpipeEngine::lift_hoverButton(ExCommand *cmd) {
+ if (_lastLiftButton) {
+ if (!(cmd->_keyCode & 2) || _liftX != cmd->_x || _liftY != cmd->_y) {
+ _lastLiftButton->_statics = _lastLiftButton->getStaticsById(lift_getButtonIdN(_lastLiftButton->_statics->_staticsId));
+ _lastLiftButton = 0;
+ }
+ }
+}
+
+bool FullpipeEngine::lift_checkButton(const char *varName) {
+ GameVar *var = g_fp->getGameLoaderGameVar()->getSubVarByName("OBJSTATES")->getSubVarByName(sO_LiftButtons);
+
+ if (var)
+ return lift_getButtonIdP(var->getSubVarByName(varName)->_value.intValue) > 0;
+
+ return false;
+}
+
+void FullpipeEngine::lift_setButtonStatics(Scene *sc, int buttonId) {
+ for (uint i = 0; i < sc->_staticANIObjectList1.size(); i++) {
+ StaticANIObject *ani = (StaticANIObject *)sc->_staticANIObjectList1[i];
+
+ if (ani->_id == ANI_LIFTBUTTON) {
+ int id = lift_getButtonIdN(ani->_statics->_staticsId);
+
+ if (id == buttonId)
+ ani->_statics = ani->getStaticsById(id);
+ }
+ }
+}
+
+
} // End of namespace Fullpipe
diff --git a/engines/fullpipe/messagehandlers.cpp b/engines/fullpipe/messagehandlers.cpp
new file mode 100644
index 0000000000..d4f79d1dd8
--- /dev/null
+++ b/engines/fullpipe/messagehandlers.cpp
@@ -0,0 +1,800 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public 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 "fullpipe/fullpipe.h"
+
+#include "fullpipe/messages.h"
+#include "fullpipe/statics.h"
+#include "fullpipe/gameloader.h"
+#include "fullpipe/interaction.h"
+#include "fullpipe/motion.h"
+#include "fullpipe/input.h"
+
+#include "fullpipe/constants.h"
+
+namespace Fullpipe {
+
+void global_messageHandler_KickStucco() {
+ Movement *mov = g_fp->_aniMan->getMovementById(MV_MAN_HMRKICK);
+ int end = mov->_currMovement ? mov->_currMovement->_dynamicPhases.size() : mov->_dynamicPhases.size();
+ bool flip = false;
+
+ for (int i = 0; i < end; i++) {
+ ExCommand *ex = mov->getDynamicPhaseByIndex(i)->_exCommand;
+
+ if (ex)
+ if (ex->_messageKind == 35)
+ if (ex->_messageNum == SND_CMN_015) {
+ if (flip) {
+ ex->_messageNum = SND_CMN_055;
+ } else {
+ ex->_messageNum = SND_CMN_054;
+ flip = true;
+ }
+ }
+ }
+
+ mov = g_fp->_aniMan->getMovementById(MV_MAN_HMRKICK_COINLESS);
+ end = mov->_currMovement ? mov->_currMovement->_dynamicPhases.size() : mov->_dynamicPhases.size();
+ flip = false;
+
+ for (int i = 0; i < end; i++) {
+ ExCommand *ex = mov->getDynamicPhaseByIndex(i)->_exCommand;
+
+ if (ex)
+ if (ex->_messageKind == 35)
+ if (ex->_messageNum == SND_CMN_015) {
+ if (flip) {
+ ex->_messageNum = SND_CMN_055;
+ } else {
+ ex->_messageNum = SND_CMN_054;
+ flip = true;
+ }
+ }
+ }
+}
+
+void global_messageHandler_KickMetal() {
+ Movement *mov = g_fp->_aniMan->getMovementById(MV_MAN_HMRKICK);
+ int end = mov->_currMovement ? mov->_currMovement->_dynamicPhases.size() : mov->_dynamicPhases.size();
+
+ for (int i = 0; i < end; i++) {
+ ExCommand *ex = mov->getDynamicPhaseByIndex(i)->_exCommand;
+
+ if (ex)
+ if (ex->_messageKind == 35)
+ if (ex->_messageNum == SND_CMN_054 || ex->_messageNum == SND_CMN_055)
+ ex->_messageNum = SND_CMN_015;
+ }
+
+ mov = g_fp->_aniMan->getMovementById(MV_MAN_HMRKICK_COINLESS);
+ end = mov->_currMovement ? mov->_currMovement->_dynamicPhases.size() : mov->_dynamicPhases.size();
+
+ for (int i = 0; i < end; i++) {
+ ExCommand *ex = mov->getDynamicPhaseByIndex(i)->_exCommand;
+
+ if (ex)
+ if (ex->_messageKind == 35)
+ if (ex->_messageNum == SND_CMN_054 || ex->_messageNum == SND_CMN_055)
+ ex->_messageNum = SND_CMN_015;
+ }
+}
+
+int global_messageHandler1(ExCommand *cmd) {
+ debug(5, "global_messageHandler1: %d %d", cmd->_messageKind, cmd->_messageNum);
+
+ if (cmd->_excFlags & 0x10000) {
+ if (cmd->_messageNum == MV_MAN_TOLADDER)
+ cmd->_messageNum = MV_MAN_TOLADDER2;
+ if (cmd->_messageNum == MV_MAN_STARTLADDER)
+ cmd->_messageNum = MV_MAN_STARTLADDER2;
+ if (cmd->_messageNum == MV_MAN_GOLADDER)
+ cmd->_messageNum = MV_MAN_GOLADDER2;
+ if (cmd->_messageNum == MV_MAN_STOPLADDER)
+ cmd->_messageNum = MV_MAN_STOPLADDER2;
+ }
+
+ if (g_fp->_inputDisabled) {
+ if (cmd->_messageKind == 17) {
+ switch (cmd->_messageNum) {
+ case 29:
+ case 30:
+ case 36:
+ case 106:
+ cmd->_messageKind = 0;
+ break;
+ default:
+ break;
+ }
+ }
+ } else if (cmd->_messageKind == 17) {
+ switch (cmd->_messageNum) {
+ case MSG_MANSHADOWSON:
+ g_fp->_aniMan->_shadowsOn = 1;
+ break;
+ case MSG_HMRKICK_STUCCO:
+ global_messageHandler_KickStucco();
+ break;
+ case MSG_MANSHADOWSOFF:
+ g_fp->_aniMan->_shadowsOn = 0;
+ break;
+ case MSG_DISABLESAVES:
+ g_fp->disableSaves(cmd);
+ break;
+ case MSG_ENABLESAVES:
+ g_fp->enableSaves();
+ break;
+ case MSG_HMRKICK_METAL:
+ global_messageHandler_KickMetal();
+ break;
+ case 29: // left mouse
+ if (g_fp->_inventoryScene) {
+ if (getGameLoaderInventory()->handleLeftClick(cmd))
+ cmd->_messageKind = 0;
+ }
+ break;
+ case 107: // right mouse
+ if (getGameLoaderInventory()->getSelectedItemId()) {
+ getGameLoaderInventory()->unselectItem(0);
+ cmd->_messageKind = 0;
+ }
+ break;
+ case 36: // keydown
+ g_fp->defHandleKeyDown(cmd->_keyCode);
+
+ switch (cmd->_keyCode) {
+ case '\x1B': // ESC
+ if (g_fp->_currentScene) {
+ getGameLoaderInventory()->unselectItem(0);
+ g_fp->openMainMenu();
+ cmd->_messageKind = 0;
+ }
+ break;
+ case 't':
+ g_fp->stopAllSounds();
+ cmd->_messageKind = 0;
+ break;
+ case 'u':
+ g_fp->toggleMute();
+ cmd->_messageKind = 0;
+ break;
+ case ' ':
+ if (getGameLoaderInventory()->getIsLocked()) {
+ if (getGameLoaderInventory()->getIsInventoryOut()) {
+ getGameLoaderInventory()->setIsLocked(0);
+ }
+ } else {
+ getGameLoaderInventory()->slideOut();
+ getGameLoaderInventory()->setIsLocked(1);
+ }
+ break;
+ case '\t':
+ if (g_fp->_flgCanOpenMap)
+ g_fp->openMap();
+ cmd->_messageKind = 0;
+ break;
+ case 'p':
+ if (g_fp->_flgCanOpenMap)
+ g_fp->openHelp();
+ cmd->_messageKind = 0;
+ break;
+ default:
+ break;
+ }
+ break;
+ case 33:
+ if (!g_fp->_inventoryScene)
+ break;
+
+ int invItem;
+
+ if (g_fp->_updateFlag && (invItem = g_fp->_inventory->getHoveredItem(&g_fp->_mouseScreenPos))) {
+ g_fp->_cursorId = PIC_CSR_ITN;
+ if (!g_fp->_currSelectedInventoryItemId && !g_fp->_aniMan->_movement &&
+ !(g_fp->_aniMan->_flags & 0x100) && g_fp->_aniMan->isIdle()) {
+ int st = g_fp->_aniMan->_statics->_staticsId;
+ ExCommand *newex = 0;
+
+ if (st == ST_MAN_RIGHT) {
+ newex = new ExCommand(g_fp->_aniMan->_id, 1, rMV_MAN_LOOKUP, 0, 0, 0, 1, 0, 0, 0);
+ } else if (st == (0x4000 | ST_MAN_RIGHT)) {
+ newex = new ExCommand(g_fp->_aniMan->_id, 1, MV_MAN_LOOKUP, 0, 0, 0, 1, 0, 0, 0);
+ }
+
+ if (newex) {
+ newex->_keyCode = g_fp->_aniMan->_okeyCode;
+ newex->_excFlags |= 3;
+ newex->postMessage();
+ }
+ }
+
+ if (g_fp->_currSelectedInventoryItemId != invItem)
+ g_fp->playSound(SND_CMN_070, 0);
+
+ g_fp->_currSelectedInventoryItemId = invItem;
+ g_fp->setCursor(g_fp->_cursorId);
+ break;
+ }
+ if (g_fp->_updateCursorCallback)
+ g_fp->_updateCursorCallback();
+
+ g_fp->_currSelectedInventoryItemId = 0;
+ g_fp->setCursor(g_fp->_cursorId);
+ break;
+ case 65: // open map
+ if (cmd->_field_2C == 11 && cmd->_field_14 == ANI_INV_MAP && g_fp->_flgCanOpenMap)
+ g_fp->openMap();
+ break;
+ default:
+ break;
+ }
+ }
+
+ if (cmd->_messageKind == 56) {
+ getGameLoaderInventory()->rebuildItemRects();
+
+ ExCommand *newex = new ExCommand(0, 35, SND_CMN_031, 0, 0, 0, 1, 0, 0, 0);
+
+ newex->_field_14 = 1;
+ newex->_excFlags |= 3;
+ newex->postMessage();
+
+ return 1;
+ } else if (cmd->_messageKind == 57) {
+ getGameLoaderInventory()->rebuildItemRects();
+
+ return 1;
+ }
+
+ return 0;
+}
+
+void staticANIObjectCallback(int *arg) {
+ (*arg)--;
+}
+
+int global_messageHandler2(ExCommand *cmd) {
+ if (cmd->_messageKind != 17)
+ return 0;
+
+ int res = 0;
+ StaticANIObject *ani;
+
+ switch (cmd->_messageNum) {
+ case 0x44c8:
+ error("0x44c8");
+ // Unk3_sub_4477A0(&unk3, _parentId, _field_14 != 0);
+ break;
+
+ case 28:
+ ani = g_fp->_currentScene->getStaticANIObject1ById(cmd->_parentId, cmd->_keyCode);
+ if (ani)
+ ani->_priority = cmd->_field_14;
+ break;
+
+ case 25:
+ ani = g_fp->_currentScene->getStaticANIObject1ById(cmd->_parentId, cmd->_keyCode);
+ if (ani) {
+ if (cmd->_field_14) {
+ ani->setFlags40(true);
+ ani->_callback2 = staticANIObjectCallback;
+ } else {
+ ani->setFlags40(false);
+ ani->_callback2 = 0;
+ }
+ }
+ break;
+
+ case 26:
+ ani = g_fp->_currentScene->getStaticANIObject1ById(cmd->_parentId, cmd->_keyCode);
+ if (ani) {
+ Movement *mov = ani->_movement;
+ if (mov)
+ mov->_currDynamicPhase->_field_68 = 0;
+ }
+ break;
+
+ default:
+#if 0
+ // We never put anything into _defMsgArray
+ while (::iterator it = g_fp->_defMsgArray.begin(); it != g_fp->_defMsgArray.end(); ++it)
+ if (((ExCommand *)*it)->_field_24 == _messageNum) {
+ ((ExCommand *)*it)->firef34(v13);
+ res = 1;
+ }
+#endif
+
+ //debug_msg(_messageNum);
+
+ if (!g_fp->_soundEnabled || cmd->_messageNum != 33 || g_fp->_currSoundListCount <= 0)
+ return res;
+
+ for (int snd = 0; snd < g_fp->_currSoundListCount; snd++) {
+ SoundList *s = g_fp->_currSoundList1[snd];
+ int ms = s->getCount();
+ for (int i = 0; i < ms; i++) {
+ s->getSoundByIndex(i)->setPanAndVolumeByStaticAni();
+ }
+ }
+ }
+
+ return res;
+}
+
+int global_messageHandler3(ExCommand *cmd) {
+ int result = 0;
+
+ if (cmd->_messageKind == 17) {
+ switch (cmd->_messageNum) {
+ case 29:
+ case 30:
+ case 31:
+ case 32:
+ case 36:
+ if (g_fp->_inputDisabled)
+ cmd->_messageKind = 0;
+ break;
+ default:
+ break;
+ }
+ }
+
+ StaticANIObject *ani, *ani2;
+
+ switch (cmd->_messageKind) {
+ case 17:
+ switch (cmd->_messageNum) {
+ case 61:
+ debug(0, "preload: { %d, %d },", cmd->_parentId, cmd->_keyCode);
+ return g_fp->_gameLoader->preloadScene(cmd->_parentId, cmd->_keyCode);
+ case 62:
+ return g_fp->_gameLoader->gotoScene(cmd->_parentId, cmd->_keyCode);
+ case 64:
+ if (g_fp->_currentScene && g_fp->_msgObjectId2
+ && (!(cmd->_keyCode & 4) || g_fp->_msgObjectId2 != cmd->_field_14 || g_fp->_msgId != cmd->_field_20)) {
+ ani = g_fp->_currentScene->getStaticANIObject1ById(g_fp->_msgObjectId2, g_fp->_msgId);
+ if (ani) {
+ ani->_flags &= 0xFF7F;
+ ani->_flags &= 0xFEFF;
+ ani->deleteFromGlobalMessageQueue();
+ }
+ }
+ g_fp->_msgX = 0;
+ g_fp->_msgY = 0;
+ g_fp->_msgObjectId2 = 0;
+ g_fp->_msgId = 0;
+ if ((cmd->_keyCode & 1) || (cmd->_keyCode & 2)) {
+ g_fp->_msgX = cmd->_x;
+ g_fp->_msgY = cmd->_y;
+ }
+ if (cmd->_keyCode & 4) {
+ g_fp->_msgObjectId2 = cmd->_field_14;
+ g_fp->_msgId = cmd->_field_20;
+ }
+ return result;
+ case 29:
+ if (g_fp->_gameLoader->_interactionController->_flag24 && g_fp->_currentScene) {
+ ani = g_fp->_currentScene->getStaticANIObjectAtPos(cmd->_sceneClickX, cmd->_sceneClickY);
+ ani2 = g_fp->_currentScene->getStaticANIObject1ById(g_fp->_gameLoader->_field_FA, -1);
+
+ if (ani) {
+ if (g_fp->_msgObjectId2 == ani->_id && g_fp->_msgId == ani->_okeyCode) {
+ cmd->_messageKind = 0;
+ return result;
+ }
+ if (canInteractAny(ani2, ani, cmd->_keyCode)) {
+ handleObjectInteraction(ani2, ani, cmd->_keyCode);
+ return 1;
+ }
+ } else {
+ int id = g_fp->_currentScene->getPictureObjectIdAtPos(cmd->_sceneClickX, cmd->_sceneClickY);
+ PictureObject *pic = g_fp->_currentScene->getPictureObjectById(id, 0);
+ if (pic) {
+ if (g_fp->_msgObjectId2 == pic->_id && g_fp->_msgId == pic->_okeyCode) {
+ cmd->_messageKind = 0;
+ return result;
+ }
+ if (!ani2 || canInteractAny(ani2, pic, cmd->_keyCode)) {
+ if (!ani2 || (ani2->isIdle() && !(ani2->_flags & 0x80) && !(ani2->_flags & 0x100)))
+ handleObjectInteraction(ani2, pic, cmd->_keyCode);
+ return 1;
+ }
+ }
+ }
+ }
+ if (getSc2MctlCompoundBySceneId(g_fp->_currentScene->_sceneId)->_isEnabled && cmd->_keyCode <= 0) {
+ if (g_fp->_msgX != cmd->_sceneClickX || g_fp->_msgY != cmd->_sceneClickY) {
+ ani = g_fp->_currentScene->getStaticANIObject1ById(g_fp->_gameLoader->_field_FA, -1);
+ if (!ani || (ani->isIdle() && !(ani->_flags & 0x80) && !(ani->_flags & 0x100))) {
+ result = startWalkTo(g_fp->_gameLoader->_field_FA, -1, cmd->_sceneClickX, cmd->_sceneClickY, 0);
+ if (result) {
+ ExCommand *ex = new ExCommand(g_fp->_gameLoader->_field_FA, 17, 64, 0, 0, 0, 1, 0, 0, 0);
+
+ ex->_keyCode = 1;
+ ex->_excFlags |= 3;
+ ex->_x = cmd->_sceneClickX;
+ ex->_y = cmd->_sceneClickY;
+ ex->postMessage();
+ }
+ }
+ } else {
+ cmd->_messageKind = 0;
+ }
+ }
+ return result;
+ default:
+ return result;
+ }
+ case 58:
+ g_fp->setCursor(cmd->_keyCode);
+ return result;
+ case 59:
+ setInputDisabled(1);
+ return result;
+ case 60:
+ setInputDisabled(0);
+ return result;
+ case 56:
+ if (cmd->_field_2C) {
+ ani = g_fp->_currentScene->getStaticANIObject1ById(cmd->_parentId, cmd->_keyCode);
+ if (ani) {
+ getGameLoaderInventory()->addItem2(ani);
+ result = 1;
+ }
+ } else {
+ result = 1;
+ getGameLoaderInventory()->addItem(cmd->_parentId, 1);
+ }
+ getGameLoaderInventory()->rebuildItemRects();
+ return result;
+ case 57:
+ if (cmd->_field_2C) {
+ if (!cmd->_field_20) {
+ getGameLoaderInventory()->removeItem2(g_fp->_currentScene, cmd->_parentId, cmd->_x, cmd->_y, cmd->_field_14);
+ getGameLoaderInventory()->rebuildItemRects();
+ return 1;
+ }
+ ani = g_fp->_currentScene->getStaticANIObject1ById(g_fp->_gameLoader->_field_FA, -1);
+ if (ani) {
+ getGameLoaderInventory()->removeItem2(g_fp->_currentScene, cmd->_parentId, ani->_ox + cmd->_x, ani->_oy + cmd->_y, ani->_priority + cmd->_field_14);
+ getGameLoaderInventory()->rebuildItemRects();
+ return 1;
+ }
+ } else {
+ getGameLoaderInventory()->removeItem(cmd->_parentId, 1);
+ }
+ getGameLoaderInventory()->rebuildItemRects();
+ return 1;
+ case 55:
+ if (g_fp->_currentScene) {
+ GameObject *obj;
+ if (cmd->_field_14)
+ obj = g_fp->_currentScene->getStaticANIObject1ById(cmd->_x, cmd->_y);
+ else
+ obj = g_fp->_currentScene->getPictureObjectById(cmd->_x, cmd->_y);
+ handleObjectInteraction(g_fp->_currentScene->getStaticANIObject1ById(cmd->_parentId, cmd->_keyCode), obj, cmd->_field_20);
+ result = 1;
+ }
+ return result;
+ case 51:
+ return startWalkTo(cmd->_parentId, cmd->_keyCode, cmd->_x, cmd->_y, cmd->_field_20);
+ case 52:
+ return doSomeAnimation(cmd->_parentId, cmd->_keyCode, cmd->_field_20);
+ case 53:
+ return doSomeAnimation2(cmd->_parentId, cmd->_keyCode);
+ case 63:
+ if (cmd->_objtype == kObjTypeObjstateCommand) {
+ ObjstateCommand *c = (ObjstateCommand *)cmd;
+ result = 1;
+ g_fp->setObjectState(c->_objCommandName, c->_value);
+ }
+ return result;
+ default:
+ return result;
+ }
+}
+
+int global_messageHandler4(ExCommand *cmd) {
+ StaticANIObject *ani = 0;
+
+ switch (cmd->_messageKind) {
+ case 18: {
+ MessageQueue *mq = new MessageQueue(g_fp->_currentScene->getMessageQueueById(cmd->_messageNum), cmd->_parId, 0);
+
+ if (cmd->_excFlags & 1)
+ mq->_flag1 = 1;
+ else
+ mq->_flag1 = 0;
+
+ mq->sendNextCommand();
+ break;
+ }
+ case 2:
+ if (!g_fp->_currentScene)
+ break;
+
+ ani = g_fp->_currentScene->getStaticANIObject1ById(cmd->_parentId, cmd->_keyCode);
+ if (!ani)
+ break;
+
+ ani->trySetMessageQueue(cmd->_messageNum, cmd->_parId);
+ break;
+
+ case 1: {
+ if (!g_fp->_currentScene)
+ break;
+
+ ani = g_fp->_currentScene->getStaticANIObject1ById(cmd->_parentId, cmd->_keyCode);
+ if (!ani)
+ break;
+
+ int flags = cmd->_field_14;
+ if (flags <= 0)
+ flags = -1;
+
+ if (cmd->_excFlags & 1)
+ ani->startAnim(cmd->_messageNum, 0, flags);
+ else
+ ani->startAnim(cmd->_messageNum, cmd->_parId, flags);
+
+ break;
+ }
+ case 8:
+ if (!g_fp->_currentScene)
+ break;
+
+ ani = g_fp->_currentScene->getStaticANIObject1ById(cmd->_parentId, cmd->_keyCode);
+ if (!ani)
+ break;
+
+ ani->startAnimEx(cmd->_messageNum, cmd->_parId, -1, -1);
+ break;
+
+ case 20: {
+ if (!g_fp->_currentScene)
+ break;
+
+ ani = g_fp->_currentScene->getStaticANIObject1ById(cmd->_parentId, cmd->_keyCode);
+ if (!ani)
+ break;
+
+ int flags = cmd->_field_14;
+ if (flags <= 0)
+ flags = -1;
+
+ ExCommand2 *cmd2 = (ExCommand2 *)cmd;
+
+ if (cmd->_excFlags & 1) {
+ ani->startAnimSteps(cmd->_messageNum, 0, cmd->_x, cmd->_y, cmd2->_points, cmd2->_pointsSize, flags);
+ } else {
+ ani->startAnimSteps(cmd->_messageNum, cmd->_parId, cmd->_x, cmd->_y, cmd2->_points, cmd2->_pointsSize, flags);
+ }
+ break;
+ }
+ case 21:
+ if (!g_fp->_currentScene)
+ break;
+
+ ani = g_fp->_currentScene->getStaticANIObject1ById(cmd->_parentId, cmd->_keyCode);
+ if (!ani)
+ break;
+
+ ani->queueMessageQueue(0);
+ ani->playIdle();
+ break;
+ case 9:
+ // Nop in original
+ break;
+ case 3:
+ g_fp->_currentScene->_y = cmd->_messageNum - cmd->_messageNum % g_fp->_scrollSpeed;
+ break;
+
+ case 4:
+ g_fp->_currentScene->_x = cmd->_messageNum - cmd->_messageNum % g_fp->_scrollSpeed;
+ break;
+
+ case 19: {
+ if (!g_fp->_currentScene)
+ break;
+ ani = g_fp->_currentScene->getStaticANIObject1ById(cmd->_parentId, cmd->_keyCode);
+ if (!ani)
+ break;
+
+ MessageQueue *mq = ani->getMessageQueue();
+ MessageQueue *mq2 = ani->changeStatics1(cmd->_messageNum);
+
+ if (!mq2 || !mq2->getExCommandByIndex(0) || !mq)
+ break;
+
+ mq2->_parId = mq->_id;
+ mq2->_flag1 = (cmd->_field_24 == 0);
+ break;
+ }
+ case 22:
+ if (!g_fp->_currentScene)
+ break;
+
+ ani = g_fp->_currentScene->getStaticANIObject1ById(cmd->_parentId, cmd->_keyCode);
+ if (!ani)
+ break;
+
+ ani->_flags |= 4;
+ ani->changeStatics2(cmd->_messageNum);
+ break;
+
+ case 6:
+ if (!g_fp->_currentScene)
+ break;
+
+ ani = g_fp->_currentScene->getStaticANIObject1ById(cmd->_parentId, cmd->_keyCode);
+ if (!ani)
+ break;
+
+ ani->hide();
+ break;
+
+ case 27:
+ if (!g_fp->_currentScene || g_fp->_currentScene->getStaticANIObject1ById(cmd->_parentId, cmd->_keyCode) == 0) {
+ ani = g_fp->accessScene(cmd->_field_20)->getStaticANIObject1ById(cmd->_parentId, -1);
+ if (ani) {
+ ani = new StaticANIObject(ani);
+ g_fp->_currentScene->addStaticANIObject(ani, 1);
+ }
+ }
+
+ // fall through
+ case 5:
+ if (g_fp->_currentScene)
+ ani = g_fp->_currentScene->getStaticANIObject1ById(cmd->_parentId, cmd->_keyCode);
+
+ if (!ani)
+ break;
+
+ if (cmd->_field_14 >= 0)
+ ani->_priority = cmd->_field_14;
+
+ ani->show1(cmd->_x, cmd->_y, cmd->_messageNum, cmd->_parId);
+ break;
+
+ case 10:
+ if (!g_fp->_currentScene)
+ break;
+
+ ani = g_fp->_currentScene->getStaticANIObject1ById(cmd->_parentId, cmd->_keyCode);
+ if (!ani)
+ break;
+
+ if (cmd->_field_14 >= 0)
+ ani->_priority = cmd->_field_14;
+
+ ani->show2(cmd->_x, cmd->_y, cmd->_messageNum, cmd->_parId);
+ break;
+
+ case 7: {
+ if (!g_fp->_currentScene->_picObjList.size())
+ break;
+
+ int offX = g_fp->_scrollSpeed * (cmd->_x / g_fp->_scrollSpeed);
+ int offY = g_fp->_scrollSpeed * (cmd->_y / g_fp->_scrollSpeed);
+
+ if (cmd->_messageNum) {
+ g_fp->_currentScene->_x = offX - g_fp->_sceneRect.left;
+ g_fp->_currentScene->_y = offY - g_fp->_sceneRect.top;
+
+ if (cmd->_field_24) {
+ g_fp->_currentScene->_messageQueueId = cmd->_parId;
+ }
+ } else {
+ g_fp->_sceneRect.translate(offX - g_fp->_sceneRect.left, offY - g_fp->_sceneRect.top);
+
+ g_fp->_currentScene->_x = 0;
+ g_fp->_currentScene->_y = 0;
+
+ g_fp->_currentScene->updateScrolling2();
+ }
+ break;
+ }
+ case 34:
+ if (!g_fp->_currentScene)
+ break;
+
+ ani = g_fp->_currentScene->getStaticANIObject1ById(cmd->_parentId, cmd->_keyCode);
+ if (!ani)
+ break;
+
+ ani->_flags = cmd->_messageNum | (ani->_flags & ~cmd->_field_14);
+
+ break;
+
+ case 35:
+ global_messageHandler_handleSound(cmd);
+ break;
+
+ case 11:
+ case 12:
+ break;
+ default:
+ return 0;
+ break;
+ }
+
+ return 1;
+}
+
+int MovGraph_messageHandler(ExCommand *cmd) {
+ if (cmd->_messageKind != 17)
+ return 0;
+
+ if (cmd->_messageNum != 33)
+ return 0;
+
+ StaticANIObject *ani = g_fp->_currentScene->getStaticANIObject1ById(g_fp->_gameLoader->_field_FA, -1);
+
+ if (!getSc2MctlCompoundBySceneId(g_fp->_currentScene->_sceneId))
+ return 0;
+
+ if (getSc2MctlCompoundBySceneId(g_fp->_currentScene->_sceneId)->_objtype != kObjTypeMovGraph || !ani)
+ return 0;
+
+ MovGraph *gr = (MovGraph *)getSc2MctlCompoundBySceneId(g_fp->_currentScene->_sceneId);
+
+ MovGraphLink *link = 0;
+ double mindistance = 1.0e10;
+ Common::Point point;
+
+ for (ObList::iterator i = gr->_links.begin(); i != gr->_links.end(); ++i) {
+ point.x = ani->_ox;
+ point.y = ani->_oy;
+
+ double dst = gr->calcDistance(&point, (MovGraphLink *)(*i), 0);
+ if (dst >= 0.0 && dst < mindistance) {
+ mindistance = dst;
+ link = (MovGraphLink *)(*i);
+ }
+ }
+
+ int top;
+
+ if (link) {
+ MovGraphNode *node = link->_movGraphNode1;
+
+ double sq = (ani->_oy - node->_y) * (ani->_oy - node->_y) + (ani->_ox - node->_x) * (ani->_ox - node->_x);
+ int off = (node->_field_14 >> 16) & 0xFF;
+ double off2 = ((link->_movGraphNode2->_field_14 >> 8) & 0xff) - off;
+
+ top = off + (int)(sqrt(sq) * off2 / link->_distance);
+ } else {
+ top = (gr->calcOffset(ani->_ox, ani->_oy)->_field_14 >> 8) & 0xff;
+ }
+
+ if (ani->_movement) {
+ ani->_movement->_currDynamicPhase->_rect->top = 255 - top;
+ return 0;
+ }
+
+ if (ani->_statics)
+ ani->_statics->_rect->top = 255 - top;
+
+ return 0;
+}
+
+} // End of namespace Fullpipe
diff --git a/engines/fullpipe/messages.cpp b/engines/fullpipe/messages.cpp
index d58212dc29..a7337b98ed 100644
--- a/engines/fullpipe/messages.cpp
+++ b/engines/fullpipe/messages.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -26,6 +26,7 @@
#include "fullpipe/messages.h"
#include "fullpipe/modal.h"
#include "fullpipe/statics.h"
+#include "fullpipe/gameloader.h"
namespace Fullpipe {
@@ -41,10 +42,13 @@ ExCommand::ExCommand(ExCommand *src) : Message(src) {
_messageNum = src->_messageNum;
_excFlags = src->_excFlags;
_parId = src->_parId;
+}
+ExCommand *ExCommand::createClone() {
+ return new ExCommand(this);
}
-ExCommand::ExCommand(int16 parentId, int messageKind, int messageNum, int x, int y, int a7, int a8, int sceneClickX, int sceneClickY, int a11) :
+ExCommand::ExCommand(int16 parentId, int messageKind, int messageNum, int x, int y, int a7, int a8, int sceneClickX, int sceneClickY, int a11) :
Message(parentId, messageKind, x, y, a7, a8, sceneClickX, sceneClickY, a11) {
_field_3C = 1;
_messageNum = messageNum;
@@ -73,22 +77,24 @@ bool ExCommand::load(MfcArchive &file) {
_field_3C = 0;
- if (g_fullpipe->_gameProjectVersion >= 12) {
+ if (g_fp->_gameProjectVersion >= 12) {
_excFlags = file.readUint32LE();
_parId = file.readUint32LE();
}
+ _objtype = kObjTypeExCommand;
+
return true;
}
bool ExCommand::handleMessage() {
int cnt = 0;
- for (MessageHandler *m = g_fullpipe->_messageHandlers; m; m = m->nextItem)
+ for (MessageHandler *m = g_fp->_messageHandlers; m; m = m->nextItem)
cnt += m->callback(this);
if (_messageKind == 17 || (_excFlags & 1)) {
if (_parId) {
- MessageQueue *mq = g_fullpipe->_globalMessageQueueList->getMessageQueueById(_parId);
+ MessageQueue *mq = g_fp->_globalMessageQueueList->getMessageQueueById(_parId);
if (mq)
mq->update();
}
@@ -101,18 +107,18 @@ bool ExCommand::handleMessage() {
}
void ExCommand::sendMessage() {
- g_fullpipe->_exCommandList.push_back(this);
+ g_fp->_exCommandList.push_back(this);
processMessages();
}
void ExCommand::postMessage() {
- g_fullpipe->_exCommandList.push_back(this);
+ g_fp->_exCommandList.push_back(this);
}
void ExCommand::handle() {
- if (g_fullpipe->_modalObject) {
- g_fullpipe->_modalObject->handleMessage(this);
+ if (g_fp->_modalObject) {
+ g_fp->_modalObject->handleMessage(this);
delete this;
} else {
@@ -120,9 +126,64 @@ void ExCommand::handle() {
}
}
+void ExCommand::setf3c(int val) {
+ if (val != -1)
+ _field_3C = val;
+
+ _field_34 = 1;
+}
+
+void ExCommand::firef34() {
+ if (_field_34) {
+ if (_field_3C >= _keyCode) {
+ _field_34 = 0;
+
+ sendMessage();
+
+ if (!_field_30 )
+ setf3c(_field_2C);
+ }
+ }
+}
+
+ExCommand2::ExCommand2(int messageKind, int parentId, Common::Point **points, int pointsSize) : ExCommand(parentId, messageKind, 0, 0, 0, 0, 1, 0, 0, 0) {
+ _objtype = kObjTypeExCommand2;
+
+ _pointsSize = pointsSize;
+ _points = (Common::Point **)malloc(sizeof(Common::Point *) * pointsSize);
+
+ for (int i = 0; i < pointsSize; i++) {
+ _points[i] = new Common::Point;
+
+ *_points[i] = *points[i];
+ }
+}
+
+ExCommand2::ExCommand2(ExCommand2 *src) : ExCommand(src) {
+ _pointsSize = src->_pointsSize;
+ _points = (Common::Point **)malloc(sizeof(Common::Point *) * _pointsSize);
+
+ for (int i = 0; i < _pointsSize; i++) {
+ _points[i] = new Common::Point;
+
+ *_points[i] = *src->_points[i];
+ }
+}
+
+ExCommand2::~ExCommand2() {
+ for (int i = 0; i < _pointsSize; i++)
+ delete _points[i];
+
+ free(_points);
+}
+
+ExCommand2 *ExCommand2::createClone() {
+ return new ExCommand2(this);
+}
+
Message::Message() {
_messageKind = 0;
- _parentId = 0;
+ _parentId = 0;
_x = 0;
_y = 0;
@@ -174,12 +235,23 @@ ObjstateCommand::ObjstateCommand() {
_objCommandName = 0;
}
+ObjstateCommand::ObjstateCommand(ObjstateCommand *src) : ExCommand(src) {
+ _value = src->_value;
+ _objCommandName = (char *)calloc(strlen(src->_objCommandName) + 1, 1);
+
+ strncpy(_objCommandName, src->_objCommandName, strlen(src->_objCommandName));
+}
+
+ObjstateCommand::~ObjstateCommand() {
+ free(_objCommandName);
+}
+
bool ObjstateCommand::load(MfcArchive &file) {
debug(5, "ObjStateCommand::load()");
_objtype = kObjTypeObjstateCommand;
- _cmd.load(file);
+ ExCommand::load(file);
_value = file.readUint32LE();
@@ -188,6 +260,10 @@ bool ObjstateCommand::load(MfcArchive &file) {
return true;
}
+ObjstateCommand *ObjstateCommand::createClone() {
+ return new ObjstateCommand(this);
+}
+
MessageQueue::MessageQueue() {
_field_14 = 0;
_parId = 0;
@@ -201,12 +277,25 @@ MessageQueue::MessageQueue() {
_flag1 = 0;
}
+MessageQueue::MessageQueue(int dataId) {
+ _field_14 = 0;
+ _parId = 0;
+ _dataId = dataId;
+ _id = g_fp->_globalMessageQueueList->compact();
+ _isFinished = 0;
+ _flags = 0;
+ _queueName = 0;
+ _counter = 0;
+ _field_38 = 0;
+ _flag1 = 0;
+}
+
MessageQueue::MessageQueue(MessageQueue *src, int parId, int field_38) {
_counter = 0;
_field_38 = (field_38 == 0);
for (Common::List<ExCommand *>::iterator it = src->_exCommands.begin(); it != src->_exCommands.end(); ++it) {
- ExCommand *ex = new ExCommand(*it);
+ ExCommand *ex = (*it)->createClone();
ex->_excFlags |= 2;
_exCommands.push_back(ex);
@@ -218,11 +307,12 @@ MessageQueue::MessageQueue(MessageQueue *src, int parId, int field_38) {
else
_parId = src->_parId;
- _id = g_fullpipe->_globalMessageQueueList->compact();
+ _id = g_fp->_globalMessageQueueList->compact();
_dataId = src->_dataId;
_flags = src->_flags;
+ _queueName = 0;
- g_fullpipe->_globalMessageQueueList->addMessageQueue(this);
+ g_fp->_globalMessageQueueList->addMessageQueue(this);
_isFinished = 0;
_flag1 = 0;
@@ -242,7 +332,7 @@ MessageQueue::~MessageQueue() {
delete _field_14;
if (_flags & 2) {
- g_fullpipe->_globalMessageQueueList->removeQueueById(_id);
+ g_fp->_globalMessageQueueList->removeQueueById(_id);
}
finish();
@@ -257,7 +347,7 @@ bool MessageQueue::load(MfcArchive &file) {
int count = file.readUint16LE();
- assert(g_fullpipe->_gameProjectVersion >= 12);
+ assert(g_fp->_gameProjectVersion >= 12);
_queueName = file.readPascalString();
@@ -278,7 +368,7 @@ bool MessageQueue::load(MfcArchive &file) {
bool MessageQueue::chain(StaticANIObject *ani) {
if (checkGlobalExCommandList1() && checkGlobalExCommandList2()) {
if (!(getFlags() & 2)) {
- g_fullpipe->_globalMessageQueueList->addMessageQueue(this);
+ g_fp->_globalMessageQueueList->addMessageQueue(this);
_flags |= 2;
}
if (ani) {
@@ -296,7 +386,7 @@ void MessageQueue::update() {
if (_counter > 0)
_counter--;
- if (_exCommands.size()) {
+ if (getCount()) {
sendNextCommand();
} else if (_counter == 0) {
_isFinished = 1;
@@ -305,16 +395,39 @@ void MessageQueue::update() {
}
void MessageQueue::messageQueueCallback1(int par) {
- // Autosave
- debug(3, "STUB: MessageQueue::messageQueueCallback1()");
+ if (g_fp->_isSaveAllowed && par == 16) {
+ if (g_fp->_globalMessageQueueList->size() && (*g_fp->_globalMessageQueueList)[0] != 0) {
+ for (uint i = 0; i < g_fp->_globalMessageQueueList->size(); i++) {
+ if ((*g_fp->_globalMessageQueueList)[i]->_flags & 1)
+ if ((*g_fp->_globalMessageQueueList)[i] != this && !(*g_fp->_globalMessageQueueList)[i]->_isFinished)
+ return;
+ }
+ }
+
+ if (g_fp->_currentScene)
+ g_fp->_gameLoader->writeSavegame(g_fp->_currentScene, "savetmp.sav");
+ }
}
void MessageQueue::addExCommand(ExCommand *ex) {
_exCommands.push_front(ex);
}
+void MessageQueue::addExCommandToEnd(ExCommand *ex) {
+ _exCommands.push_back(ex);
+}
+
+void MessageQueue::insertExCommandAt(int pos, ExCommand *ex) {
+ Common::List<ExCommand *>::iterator it = _exCommands.begin();
+
+ for (int i = pos; i > 0; i--)
+ ++it;
+
+ _exCommands.insert(it, ex);
+}
+
ExCommand *MessageQueue::getExCommandByIndex(uint idx) {
- if (idx > _exCommands.size())
+ if (idx >= getCount())
return 0;
Common::List<ExCommand *>::iterator it = _exCommands.begin();
@@ -328,7 +441,7 @@ ExCommand *MessageQueue::getExCommandByIndex(uint idx) {
}
void MessageQueue::deleteExCommandByIndex(uint idx, bool doFree) {
- if (idx > _exCommands.size())
+ if (idx >= getCount())
return;
Common::List<ExCommand *>::iterator it = _exCommands.begin();
@@ -338,14 +451,21 @@ void MessageQueue::deleteExCommandByIndex(uint idx, bool doFree) {
idx--;
}
- _exCommands.erase(it);
-
if (doFree)
delete *it;
+
+ _exCommands.erase(it);
+}
+
+void MessageQueue::transferExCommands(MessageQueue *mq) {
+ while (mq->_exCommands.size()) {
+ _exCommands.push_back(mq->_exCommands.front());
+ mq->_exCommands.pop_front();
+ }
}
void MessageQueue::sendNextCommand() {
- if (_exCommands.size()) {
+ if (getCount()) {
if (!(_flags & 4) && (_flags & 1)) {
messageQueueCallback1(16);
}
@@ -374,7 +494,7 @@ bool MessageQueue::checkGlobalExCommandList1() {
if (ex->_messageKind != 1 && ex->_messageKind != 20 && ex->_messageKind != 5 && ex->_messageKind != 27)
continue;
- for (Common::List<ExCommand *>::iterator it = g_fullpipe->_exCommandList.begin(); it != g_fullpipe->_exCommandList.end(); it++) {
+ for (Common::List<ExCommand *>::iterator it = g_fp->_exCommandList.begin(); it != g_fp->_exCommandList.end(); it++) {
ex1 = *it;
if (ex1->_messageKind != 1 && ex1->_messageKind != 20 && ex1->_messageKind != 5 && ex1->_messageKind != 27)
@@ -383,7 +503,7 @@ bool MessageQueue::checkGlobalExCommandList1() {
if (ex1->_keyCode != ex->_keyCode && ex1->_keyCode != -1 && ex->_keyCode != -1)
continue;
- MessageQueue *mq = g_fullpipe->_globalMessageQueueList->getMessageQueueById(ex1->_parId);
+ MessageQueue *mq = g_fp->_globalMessageQueueList->getMessageQueueById(ex1->_parId);
if (mq) {
if (mq->getFlags() & 1)
@@ -403,7 +523,7 @@ bool MessageQueue::checkGlobalExCommandList2() {
if (ex->_messageKind != 1 && ex->_messageKind != 20 && ex->_messageKind != 5 && ex->_messageKind != 27)
continue;
- for (Common::List<ExCommand *>::iterator it = g_fullpipe->_exCommandList.begin(); it != g_fullpipe->_exCommandList.end();) {
+ for (Common::List<ExCommand *>::iterator it = g_fp->_exCommandList.begin(); it != g_fp->_exCommandList.end();) {
ex1 = *it;
if (ex1->_messageKind != 1 && ex1->_messageKind != 20 && ex1->_messageKind != 5 && ex1->_messageKind != 27) {
@@ -416,7 +536,7 @@ bool MessageQueue::checkGlobalExCommandList2() {
continue;
}
- MessageQueue *mq = g_fullpipe->_globalMessageQueueList->getMessageQueueById(ex1->_parId);
+ MessageQueue *mq = g_fp->_globalMessageQueueList->getMessageQueueById(ex1->_parId);
if (mq) {
if (mq->getFlags() & 1)
@@ -425,7 +545,7 @@ bool MessageQueue::checkGlobalExCommandList2() {
delete mq;
}
- it = g_fullpipe->_exCommandList.erase(it);
+ it = g_fp->_exCommandList.erase(it);
if (ex1->_excFlags & 2) {
delete ex1;
@@ -439,7 +559,7 @@ void MessageQueue::finish() {
if (!_parId)
return;
- MessageQueue *mq = g_fullpipe->_globalMessageQueueList->getMessageQueueById(_parId);
+ MessageQueue *mq = g_fp->_globalMessageQueueList->getMessageQueueById(_parId);
_parId = 0;
@@ -472,7 +592,8 @@ int MessageQueue::calcDuration(StaticANIObject *obj) {
ExCommand *ex;
Movement *mov;
- for (uint i = 0; (ex = getExCommandByIndex(i)); i++)
+ for (uint i = 0; i < getCount(); i++) {
+ ex = getExCommandByIndex(i);
if (ex->_parentId == obj->_id) {
if (ex->_messageKind == 1 || ex->_messageKind == 20) {
if ((mov = obj->getMovementById(ex->_messageNum)) != 0) {
@@ -483,12 +604,13 @@ int MessageQueue::calcDuration(StaticANIObject *obj) {
}
}
}
+ }
return res;
}
void MessageQueue::changeParam28ForObjectId(int objId, int oldParam28, int newParam28) {
- for (uint i = 0; i < _exCommands.size(); i++) {
+ for (uint i = 0; i < getCount(); i++) {
ExCommand *ex = getExCommandByIndex(i);
int k = ex->_messageKind;
@@ -499,6 +621,23 @@ void MessageQueue::changeParam28ForObjectId(int objId, int oldParam28, int newPa
}
}
+int MessageQueue::activateExCommandsByKind(int kind) {
+ int res = 0;
+
+ for (uint i = 0; i < getCount(); i++) {
+ ExCommand *ex = getExCommandByIndex(i);
+
+ if (ex->_messageKind == kind) {
+ ex->_messageKind = 0;
+ ex->_excFlags |= 1;
+
+ res++;
+ }
+ }
+
+ return res;
+}
+
MessageQueue *GlobalMessageQueueList::getMessageQueueById(int id) {
for (Common::Array<MessageQueue *>::iterator s = begin(); s != end(); ++s) {
if ((*s)->_id == id)
@@ -537,16 +676,32 @@ void GlobalMessageQueueList::disableQueueById(int id) {
}
int GlobalMessageQueueList::compact() {
+ int *useList = new int[size() + 2];
+
+ for (uint i = 0; i < size() + 2; i++)
+ useList[i] = 0;
+
for (uint i = 0; i < size();) {
if (((MessageQueue *)_storage[i])->_isFinished) {
disableQueueById(_storage[i]->_id);
remove_at(i);
} else {
+ if ((uint)_storage[i]->_id < size() + 2)
+ useList[_storage[i]->_id] = 1;
i++;
}
}
- return size() + 1;
+ uint i;
+
+ for (i = 1; i < size() + 2; i++) {
+ if (!useList[i])
+ break;
+ }
+
+ delete [] useList;
+
+ return i;
}
void GlobalMessageQueueList::addMessageQueue(MessageQueue *msg) {
@@ -555,13 +710,30 @@ void GlobalMessageQueueList::addMessageQueue(MessageQueue *msg) {
push_back(msg);
}
+void clearGlobalMessageQueueList() {
+ g_fp->_globalMessageQueueList->clear();
+}
+
void clearGlobalMessageQueueList1() {
- warning("STUB: clearGlobalMessageQueueList1()");
+ clearMessages();
+
+ g_fp->_globalMessageQueueList->clear();
+}
+
+void clearMessages() {
+ while (g_fp->_exCommandList.size()) {
+ ExCommand *ex = g_fp->_exCommandList.front();
+
+ g_fp->_exCommandList.pop_front();
+
+ if (ex->_excFlags & 2)
+ delete ex;
+ }
}
bool removeMessageHandler(int16 id, int pos) {
- if (g_fullpipe->_messageHandlers) {
- MessageHandler *curItem = g_fullpipe->_messageHandlers;
+ if (g_fp->_messageHandlers) {
+ MessageHandler *curItem = g_fp->_messageHandlers;
MessageHandler *prevItem = 0;
int curPos = 0;
@@ -595,13 +767,13 @@ void addMessageHandler(int (*callback)(ExCommand *), int16 id) {
if (getMessageHandlerById(id))
return;
- MessageHandler *curItem = g_fullpipe->_messageHandlers;
+ MessageHandler *curItem = g_fp->_messageHandlers;
if (!curItem)
return;
int index = 0;
- for (MessageHandler *i = g_fullpipe->_messageHandlers->nextItem; i; i = i->nextItem) {
+ for (MessageHandler *i = g_fp->_messageHandlers->nextItem; i; i = i->nextItem) {
curItem = i;
index++;
}
@@ -613,7 +785,7 @@ void addMessageHandler(int (*callback)(ExCommand *), int16 id) {
}
MessageHandler *getMessageHandlerById(int16 id) {
- MessageHandler *curItem = g_fullpipe->_messageHandlers;
+ MessageHandler *curItem = g_fp->_messageHandlers;
if (!curItem)
return 0;
@@ -643,7 +815,7 @@ bool allocMessageHandler(MessageHandler *where, int16 id, int (*callback)(ExComm
msg->callback = callback;
msg->index = 0;
- g_fullpipe->_messageHandlers = msg;
+ g_fp->_messageHandlers = msg;
}
return true;
@@ -651,7 +823,7 @@ bool allocMessageHandler(MessageHandler *where, int16 id, int (*callback)(ExComm
int getMessageHandlersCount() {
int result;
- MessageHandler *curItem = g_fullpipe->_messageHandlers;
+ MessageHandler *curItem = g_fp->_messageHandlers;
for (result = 0; curItem; result++)
curItem = curItem->nextItem;
@@ -664,7 +836,7 @@ bool addMessageHandlerByIndex(int (*callback)(ExCommand *), int index, int16 id)
return false;
if (index) {
- MessageHandler *curItem = g_fullpipe->_messageHandlers;
+ MessageHandler *curItem = g_fp->_messageHandlers;
for (int i = index - 1; i > 0; i--)
if (curItem)
@@ -682,13 +854,13 @@ bool addMessageHandlerByIndex(int (*callback)(ExCommand *), int index, int16 id)
} else {
MessageHandler *newItem = new MessageHandler;
- newItem->nextItem = g_fullpipe->_messageHandlers;
+ newItem->nextItem = g_fp->_messageHandlers;
newItem->id = id;
newItem->callback = callback;
newItem->index = 0;
- updateMessageHandlerIndex(g_fullpipe->_messageHandlers, 1);
- g_fullpipe->_messageHandlers = newItem;
+ updateMessageHandlerIndex(g_fp->_messageHandlers, 1);
+ g_fp->_messageHandlers = newItem;
return true;
}
@@ -698,7 +870,7 @@ bool insertMessageHandler(int (*callback)(ExCommand *), int index, int16 id) {
if (getMessageHandlerById(id))
return false;
- MessageHandler *curItem = g_fullpipe->_messageHandlers;
+ MessageHandler *curItem = g_fp->_messageHandlers;
for (int i = index; i > 0; i--)
if (curItem)
@@ -715,7 +887,7 @@ void clearMessageHandlers() {
MessageHandler *curItem;
MessageHandler *nextItem;
- curItem = g_fullpipe->_messageHandlers;
+ curItem = g_fp->_messageHandlers;
if (curItem) {
do {
nextItem = curItem->nextItem;
@@ -725,28 +897,79 @@ void clearMessageHandlers() {
curItem = nextItem;
} while (nextItem);
- g_fullpipe->_messageHandlers = 0;
+ g_fp->_messageHandlers = 0;
}
}
void processMessages() {
- if (!g_fullpipe->_isProcessingMessages) {
- g_fullpipe->_isProcessingMessages = true;
+ if (!g_fp->_isProcessingMessages) {
+ g_fp->_isProcessingMessages = true;
- while (g_fullpipe->_exCommandList.size()) {
- ExCommand *ex = g_fullpipe->_exCommandList.front();
- g_fullpipe->_exCommandList.pop_front();
+ while (g_fp->_exCommandList.size()) {
+ ExCommand *ex = g_fp->_exCommandList.front();
+ g_fp->_exCommandList.pop_front();
ex->handleMessage();
}
- g_fullpipe->_isProcessingMessages = false;
+ g_fp->_isProcessingMessages = false;
}
}
void updateGlobalMessageQueue(int id, int objid) {
- MessageQueue *m = g_fullpipe->_globalMessageQueueList->getMessageQueueById(id);
+ MessageQueue *m = g_fp->_globalMessageQueueList->getMessageQueueById(id);
if (m) {
m->update();
}
}
+bool chainQueue(int queueId, int flags) {
+ MessageQueue *mq = g_fp->_currentScene->getMessageQueueById(queueId);
+
+ if (!mq)
+ return false;
+
+ MessageQueue *nmq = new MessageQueue(mq, 0, 0);
+
+ nmq->_flags |= flags;
+
+ if (!nmq->chain(0)) {
+ delete nmq;
+
+ return false;
+ }
+
+ return true;
+}
+
+bool chainObjQueue(StaticANIObject *obj, int queueId, int flags) {
+ MessageQueue *mq = g_fp->_currentScene->getMessageQueueById(queueId);
+
+ if (!mq)
+ return false;
+
+ MessageQueue *nmq = new MessageQueue(mq, 0, 0);
+
+ nmq->_flags |= flags;
+
+ if (!nmq->chain(obj)) {
+ delete nmq;
+
+ return false;
+ }
+
+ return true;
+}
+
+void postExCommand(int parentId, int keyCode, int x, int y, int f20, int f14) {
+ ExCommand *ex = new ExCommand(parentId, 17, 64, 0, 0, 0, 1, 0, 0, 0);
+
+ ex->_keyCode = keyCode;
+ ex->_excFlags |= 3;
+ ex->_x = x;
+ ex->_y = y;
+ ex->_field_20 = f20;
+ ex->_field_14 = f14;
+
+ ex->postMessage();
+}
+
} // End of namespace Fullpipe
diff --git a/engines/fullpipe/messages.h b/engines/fullpipe/messages.h
index a3533e1bd2..e6f7f05150 100644
--- a/engines/fullpipe/messages.h
+++ b/engines/fullpipe/messages.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -57,7 +57,6 @@ class Message : public CObject {
class ExCommand : public Message {
public:
-
int _messageNum;
int _field_3C;
int _excFlags;
@@ -70,27 +69,42 @@ class ExCommand : public Message {
virtual bool load(MfcArchive &file);
+ virtual ExCommand *createClone();
+
bool handleMessage();
void sendMessage();
void postMessage();
void handle();
+
+ void firef34();
+ void setf3c(int val);
};
class ExCommand2 : public ExCommand {
public:
Common::Point **_points;
int _pointsSize;
+
+ ExCommand2(int messageKind, int parentId, Common::Point **points, int pointsSize);
+ ExCommand2(ExCommand2 *src);
+ virtual ~ExCommand2();
+
+ virtual ExCommand2 *createClone();
};
-class ObjstateCommand : public CObject {
+class ObjstateCommand : public ExCommand {
public:
- ExCommand _cmd;
char *_objCommandName;
int _value;
public:
ObjstateCommand();
+ ObjstateCommand(ObjstateCommand *src);
+ virtual ~ObjstateCommand();
+
virtual bool load(MfcArchive &file);
+
+ virtual ObjstateCommand *createClone();
};
class MessageQueue : public CObject {
@@ -100,15 +114,18 @@ class MessageQueue : public CObject {
char *_queueName;
int16 _dataId;
CObject *_field_14;
- Common::List<ExCommand *> _exCommands;
int _counter;
int _field_38;
int _isFinished;
int _parId;
int _flag1;
+ private:
+ Common::List<ExCommand *> _exCommands;
+
public:
MessageQueue();
+ MessageQueue(int dataId);
MessageQueue(MessageQueue *src, int parId, int field_38);
virtual ~MessageQueue();
@@ -120,9 +137,13 @@ class MessageQueue : public CObject {
uint getCount() { return _exCommands.size(); }
void addExCommand(ExCommand *ex);
+ void addExCommandToEnd(ExCommand *ex);
+ void insertExCommandAt(int pos, ExCommand *ex);
ExCommand *getExCommandByIndex(uint idx);
void deleteExCommandByIndex(uint idx, bool doFree);
+ void transferExCommands(MessageQueue *mq);
+
void replaceKeyCode(int key1, int key2);
bool chain(StaticANIObject *ani);
@@ -137,6 +158,8 @@ class MessageQueue : public CObject {
int calcDuration(StaticANIObject *obj);
void changeParam28ForObjectId(int objId, int oldParam28, int newParam28);
+
+ int activateExCommandsByKind(int kind);
};
class GlobalMessageQueueList : public Common::Array<MessageQueue *> {
@@ -169,8 +192,14 @@ bool insertMessageHandler(int (*callback)(ExCommand *), int index, int16 id);
void clearMessageHandlers();
void processMessages();
void updateGlobalMessageQueue(int id, int objid);
+void clearMessages();
+void clearGlobalMessageQueueList();
void clearGlobalMessageQueueList1();
+bool chainQueue(int queueId, int flags);
+bool chainObjQueue(StaticANIObject *obj, int queueId, int flags);
+void postExCommand(int parentId, int keyCode, int x, int y, int f20, int f16);
+
} // End of namespace Fullpipe
#endif /* FULLPIPE_MESSAGEQUEUE_H */
diff --git a/engines/fullpipe/modal.cpp b/engines/fullpipe/modal.cpp
index 26048ced13..6f99200529 100644
--- a/engines/fullpipe/modal.cpp
+++ b/engines/fullpipe/modal.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -21,51 +21,45 @@
*/
#include "fullpipe/fullpipe.h"
-#include "fullpipe/modal.h"
#include "fullpipe/messages.h"
#include "fullpipe/constants.h"
+#include "fullpipe/motion.h"
#include "fullpipe/scenes.h"
+#include "fullpipe/gameloader.h"
+#include "fullpipe/statics.h"
+#include "fullpipe/modal.h"
-namespace Fullpipe {
-
-bool BaseModalObject::handleMessage(ExCommand *message) {
- warning("STUB: BaseModalObject::handleMessage()");
-
- return true;
-}
-
-bool BaseModalObject::init(int counterdiff) {
- warning("STUB: BaseModalObject::init(%d)", counterdiff);
-
- return true;
-}
-
-bool BaseModalObject::update() {
- warning("STUB: BaseModalObject::update()");
+#include "fullpipe/constants.h"
- return true;
-}
+#include "graphics/palette.h"
+#include "video/avi_decoder.h"
-void BaseModalObject::saveload() {
- warning("STUB: BaseModalObject::saveload()");
-}
+#include "engines/savestate.h"
+namespace Fullpipe {
ModalIntro::ModalIntro() {
_field_8 = 0;
_countDown = 0;
- _needRedraw = 0;
+ _stillRunning = 0;
+
if (g_vars->sceneIntro_skipIntro) {
_introFlags = 4;
} else {
_introFlags = 33;
_countDown = 150;
- PictureObject *pict = g_fullpipe->accessScene(SC_INTRO1)->getPictureObjectById(PIC_IN1_PIPETITLE, 0);
+ PictureObject *pict = g_fp->accessScene(SC_INTRO1)->getPictureObjectById(PIC_IN1_PIPETITLE, 0);
pict->setFlags(pict->_flags & 0xFFFB);
}
+
g_vars->sceneIntro_skipIntro = false;
- _sfxVolume = g_fullpipe->_sfxVolume;
+ _sfxVolume = g_fp->_sfxVolume;
+}
+
+ModalIntro::~ModalIntro() {
+ g_fp->stopAllSounds();
+ g_fp->_sfxVolume = _sfxVolume;
}
bool ModalIntro::handleMessage(ExCommand *message) {
@@ -78,7 +72,7 @@ bool ModalIntro::handleMessage(ExCommand *message) {
if (message->_keyCode != 13 && message->_keyCode != 27 && message->_keyCode != 32)
return false;
- if (_needRedraw) {
+ if (_stillRunning) {
if (!(_introFlags & 0x10)) {
_countDown = 0;
g_vars->sceneIntro_needBlackout = true;
@@ -91,16 +85,1734 @@ bool ModalIntro::handleMessage(ExCommand *message) {
return true;
}
+bool ModalIntro::init(int counterdiff) {
+ if (!g_vars->sceneIntro_playing) {
+ if (!_stillRunning) {
+ finish();
+ return false;
+ }
+
+ if (_introFlags & 0x10)
+ g_fp->_gameLoader->updateSystems(42);
+
+ _introFlags |= 2;
+
+ return true;
+ }
+
+ if (_introFlags & 4) {
+ ModalVideoPlayer *player = new ModalVideoPlayer();
+
+ g_fp->_modalObject = player;
+ player->_parentObj = this;
+ player->play("intro.avi");
+
+ _countDown--;
+
+ if (_countDown > 0 )
+ return true;
+
+ if (_stillRunning <= 0) {
+ _countDown = 0;
+ _stillRunning = 0;
+ _introFlags = (_introFlags & 0xfb) | 0x40;
+
+ return true;
+ }
+
+ _introFlags |= 2;
+ return true;
+ }
+
+ if (_introFlags & 0x40) {
+ ModalVideoPlayer *player = new ModalVideoPlayer();
+
+ g_fp->_modalObject = player;
+ player->_parentObj = this;
+ player->play("intro2.avi");
+
+ _countDown--;
+ if (_countDown > 0)
+ return true;
+
+ if (_stillRunning <= 0) {
+ _countDown = 50;
+ _stillRunning = 0;
+ _introFlags = (_introFlags & 0xbf) | 9;
+
+ return true;
+ }
+
+ _introFlags |= 2;
+ return true;
+ }
+
+ if (_introFlags & 8) {
+ _countDown--;
+
+ if (_countDown > 0 )
+ return true;
+
+ if (_stillRunning > 0) {
+ _introFlags |= 2;
+ return true;
+ }
+
+ _countDown = 150;
+ _introFlags = (_introFlags & 0xf7) | 0x21;
+ g_fp->accessScene(SC_INTRO1)->getPictureObjectById(PIC_IN1_PIPETITLE, 0)->_flags &= 0xfffb;
+ }
+
+ if (!(_introFlags & 0x20)) {
+ if (_introFlags & 0x10) {
+ if (!_stillRunning) {
+ _introFlags |= 1;
+
+ g_fp->accessScene(SC_INTRO1)->getPictureObjectById(PIC_IN1_PIPETITLE, 0)->_flags &= 0xfffb;
+ g_fp->accessScene(SC_INTRO1)->getPictureObjectById(PIC_IN1_GAMETITLE, 0)->_flags &= 0xfffb;
+
+ chainQueue(QU_INTR_STARTINTRO, 1);
+ }
+ g_fp->_gameLoader->updateSystems(42);
+ }
+ return true;
+ }
+
+ _countDown--;
+
+ if (_countDown <= 0) {
+ if (_stillRunning > 0) {
+ _introFlags |= 2;
+
+ return true;
+ }
+
+ _introFlags = (_introFlags & 0xdf) | 0x10;
+
+ g_fp->accessScene(SC_INTRO1)->getPictureObjectById(PIC_IN1_GAMETITLE, 0)->_flags &= 0xfffb;
+
+ _stillRunning = 0;
+ }
+
+ return true;
+}
+
+void ModalIntro::update() {
+ warning("STUB: ModalIntro::update()");
+
+ if (g_fp->_currentScene) {
+ if (_introFlags & 1) {
+ //sceneFade(virt, g_currentScene, 1);
+ _stillRunning = 255;
+ _introFlags &= 0xfe;
+
+ if (_introFlags & 0x20)
+ g_fp->playSound(SND_INTR_019, 0);
+ } else if (_introFlags & 2) {
+ if (g_vars->sceneIntro_needBlackout) {
+ //vrtRectangle(*(_DWORD *)virt, 0, 0, 0, 800, 600);
+ g_vars->sceneIntro_needBlackout = 0;
+ _stillRunning = 0;
+ _introFlags &= 0xfd;
+ } else {
+ //sceneFade(virt, g_currentScene, 0);
+ _stillRunning = 0;
+ _introFlags &= 0xfd;
+ }
+ } else if (_stillRunning) {
+ g_fp->_currentScene->draw();
+ }
+ }
+}
+
+void ModalIntro::finish() {
+ g_fp->_gameLoader->unloadScene(SC_INTRO2);
+ g_fp->_currentScene = g_fp->accessScene(SC_INTRO1);
+ g_fp->_gameLoader->preloadScene(SC_INTRO1, TrubaDown);
+
+ if (g_fp->_currentScene)
+ g_fp->_gameLoader->updateSystems(42);
+}
+
+void ModalVideoPlayer::play(const char *filename) {
+ // TODO: Videos are encoded using Intel Indeo 5 (IV50), which isn't supported yet
+
+ Video::AVIDecoder *aviDecoder = new Video::AVIDecoder();
+
+ if (!aviDecoder->loadFile(filename))
+ return;
+
+ uint16 x = (g_system->getWidth() - aviDecoder->getWidth()) / 2;
+ uint16 y = (g_system->getHeight() - aviDecoder->getHeight()) / 2;
+ bool skipVideo = false;
+
+ aviDecoder->start();
+
+ while (!g_fp->shouldQuit() && !aviDecoder->endOfVideo() && !skipVideo) {
+ if (aviDecoder->needsUpdate()) {
+ const Graphics::Surface *frame = aviDecoder->decodeNextFrame();
+ if (frame) {
+ g_fp->_system->copyRectToScreen(frame->getPixels(), frame->pitch, x, y, frame->w, frame->h);
+
+ if (aviDecoder->hasDirtyPalette())
+ g_fp->_system->getPaletteManager()->setPalette(aviDecoder->getPalette(), 0, 256);
+
+ g_fp->_system->updateScreen();
+ }
+ }
+
+ Common::Event event;
+ while (g_fp->_system->getEventManager()->pollEvent(event)) {
+ if ((event.type == Common::EVENT_KEYDOWN && (event.kbd.keycode == Common::KEYCODE_ESCAPE ||
+ event.kbd.keycode == Common::KEYCODE_RETURN ||
+ event.kbd.keycode == Common::KEYCODE_SPACE))
+ || event.type == Common::EVENT_LBUTTONUP)
+ skipVideo = true;
+ }
+
+ g_fp->_system->delayMillis(aviDecoder->getTimeToNextFrame());
+ }
+}
+
+ModalMap::ModalMap() {
+ _mapScene = 0;
+ _pic = 0;
+ _isRunning = false;
+ _rect1 = g_fp->_sceneRect;
+ _x = g_fp->_currentScene->_x;
+ _y = g_fp->_currentScene->_y;
+ _flag = 0;
+ _mouseX = 0;
+ _mouseY = 0;
+ _field_38 = 0;
+ _field_3C = 0;
+ _field_40 = 12;
+ _rect2.top = 0;
+ _rect2.left = 0;
+ _rect2.bottom = 600;
+ _rect2.right = 800;
+}
+
+ModalMap::~ModalMap() {
+ g_fp->_gameLoader->unloadScene(SC_MAP);
+
+ g_fp->_sceneRect = _rect1;
+
+ g_fp->_currentScene->_x = _x;
+ g_fp->_currentScene->_y = _y;
+}
+
+bool ModalMap::init(int counterdiff) {
+ g_fp->setCursor(PIC_CSR_ITN);
+
+ if (_flag) {
+ _rect2.left = _mouseX + _field_38 - g_fp->_mouseScreenPos.x;
+ _rect2.top = _mouseY + _field_3C - g_fp->_mouseScreenPos.y;;
+ _rect2.right = _rect2.left + 800;
+ _rect2.bottom = _rect2.top + 600;
+
+ g_fp->_sceneRect =_rect2;
+
+ _mapScene->updateScrolling2();
+
+ _rect2 = g_fp->_sceneRect;
+ }
+
+ _field_40--;
+
+ if (_field_40 <= 0) {
+ _field_40 = 12;
+
+ if (_pic)
+ _pic->_flags ^= 4;
+ }
+
+ return _isRunning;
+}
+
+void ModalMap::update() {
+ g_fp->_sceneRect = _rect2;
+
+ _mapScene->draw();
+
+ g_fp->drawArcadeOverlay(1);
+}
+
+bool ModalMap::handleMessage(ExCommand *cmd) {
+ if (cmd->_messageKind != 17)
+ return false;
+
+ switch (cmd->_messageNum) {
+ case 29:
+ _flag = 1;
+ _mouseX = g_fp->_mouseScreenPos.x;
+ _mouseY = g_fp->_mouseScreenPos.x;
+
+ _field_3C = _rect2.top;
+ _field_38 = _rect2.left;
+
+ break;
+
+ case 30:
+ _flag = 0;
+ break;
+
+ case 36:
+ if (cmd->_keyCode != 9 && cmd->_keyCode != 27 )
+ return false;
+
+ break;
+
+ case 107:
+ break;
+
+ default:
+ return false;
+ }
+
+ _isRunning = 0;
+
+ return true;
+}
+
+void ModalMap::initMap() {
+ _isRunning = 1;
+
+ _mapScene = g_fp->accessScene(SC_MAP);
+
+ if (!_mapScene)
+ error("ModalMap::initMap(): error accessing scene SC_MAP");
+
+ PictureObject *pic;
+
+ for (int i = 0; i < 200; i++) {
+ if (!(g_fp->_mapTable[i] >> 16))
+ break;
+
+ pic = _mapScene->getPictureObjectById(g_fp->_mapTable[i] >> 16, 0);
+
+ if ((g_fp->_mapTable[i] & 0xffff) == 1)
+ pic->_flags |= 4;
+ else
+ pic->_flags &= 0xfffb;
+ }
+
+ pic = getScenePicture();
+
+ Common::Point point;
+ Common::Point point2;
+
+ if (pic) {
+ pic->getDimensions(&point);
+
+ _rect2.left = point.x / 2 + pic->_ox - 400;
+ _rect2.top = point.y / 2 + pic->_oy - 300;
+ _rect2.right = _rect2.left + 800;
+ _rect2.bottom = _rect2.top + 600;
+
+ _mapScene->updateScrolling2();
+
+ _pic = _mapScene->getPictureObjectById(PIC_MAP_I02, 0);
+ _pic->getDimensions(&point2);
+
+ _pic->setOXY(pic->_ox + point.x / 2 - point2.x / 2, point.y - point2.y / 2 + pic->_oy - 24);
+ _pic->_flags |= 4;
+
+ _pic = _mapScene->getPictureObjectById(PIC_MAP_I01, 0);
+ _pic->getDimensions(&point2);
+
+ _pic->setOXY(pic->_ox + point.x / 2 - point2.x / 2, point.y - point2.y / 2 + pic->_oy - 25);
+ _pic->_flags |= 4;
+ }
+
+ g_fp->setArcadeOverlay(PIC_CSR_MAP);
+}
+
+PictureObject *ModalMap::getScenePicture() {
+ int picId = 0;
+
+ switch (g_fp->_currentScene->_sceneId) {
+ case SC_1:
+ picId = PIC_MAP_S01;
+ break;
+ case SC_2:
+ picId = PIC_MAP_S02;
+ break;
+ case SC_3:
+ picId = PIC_MAP_S03;
+ break;
+ case SC_4:
+ picId = PIC_MAP_S04;
+ break;
+ case SC_5:
+ picId = PIC_MAP_S05;
+ break;
+ case SC_6:
+ picId = PIC_MAP_S06;
+ break;
+ case SC_7:
+ picId = PIC_MAP_S07;
+ break;
+ case SC_8:
+ picId = PIC_MAP_S08;
+ break;
+ case SC_9:
+ picId = PIC_MAP_S09;
+ break;
+ case SC_10:
+ picId = PIC_MAP_S10;
+ break;
+ case SC_11:
+ picId = PIC_MAP_S11;
+ break;
+ case SC_12:
+ picId = PIC_MAP_S12;
+ break;
+ case SC_13:
+ picId = PIC_MAP_S13;
+ break;
+ case SC_14:
+ picId = PIC_MAP_S14;
+ break;
+ case SC_15:
+ picId = PIC_MAP_S15;
+ break;
+ case SC_16:
+ picId = PIC_MAP_S16;
+ break;
+ case SC_17:
+ picId = PIC_MAP_S17;
+ break;
+ case SC_18:
+ case SC_19:
+ picId = PIC_MAP_S1819;
+ break;
+ case SC_20:
+ picId = PIC_MAP_S20;
+ break;
+ case SC_21:
+ picId = PIC_MAP_S21;
+ break;
+ case SC_22:
+ picId = PIC_MAP_S22;
+ break;
+ case SC_23:
+ picId = PIC_MAP_S23_1;
+ break;
+ case SC_24:
+ picId = PIC_MAP_S24;
+ break;
+ case SC_25:
+ picId = PIC_MAP_S25;
+ break;
+ case SC_26:
+ picId = PIC_MAP_S26;
+ break;
+ case SC_27:
+ picId = PIC_MAP_S27;
+ break;
+ case SC_28:
+ picId = PIC_MAP_S28;
+ break;
+ case SC_29:
+ picId = PIC_MAP_S29;
+ break;
+ case SC_30:
+ picId = PIC_MAP_S30;
+ break;
+ case SC_31:
+ picId = PIC_MAP_S31_1;
+ break;
+ case SC_32:
+ picId = PIC_MAP_S32_1;
+ break;
+ case SC_33:
+ picId = PIC_MAP_S33;
+ break;
+ case SC_34:
+ picId = PIC_MAP_S34;
+ break;
+ case SC_35:
+ picId = PIC_MAP_S35;
+ break;
+ case SC_36:
+ picId = PIC_MAP_S36;
+ break;
+ case SC_37:
+ picId = PIC_MAP_S37;
+ break;
+ case SC_38:
+ picId = PIC_MAP_S38;
+ break;
+ case SC_FINAL1:
+ picId = PIC_MAP_S38;
+ break;
+ }
+
+ if (picId)
+ return _mapScene->getPictureObjectById(picId, 0);
+
+ error("ModalMap::getScenePicture(): Unknown scene id: %d", g_fp->_currentScene->_sceneId);
+}
+
void FullpipeEngine::openMap() {
- warning("STUB: FullpipeEngine::openMap()");
+ if (!_modalObject) {
+ ModalMap *map = new ModalMap;
+
+ _modalObject = map;
+
+ map->initMap();
+ }
+}
+
+ModalFinal::ModalFinal() {
+ _flags = 0;
+ _counter = 255;
+ _sfxVolume = g_fp->_sfxVolume;
+}
+
+ModalFinal::~ModalFinal() {
+ if (g_vars->sceneFinal_var01) {
+ g_fp->_gameLoader->unloadScene(SC_FINAL2);
+ g_fp->_gameLoader->unloadScene(SC_FINAL3);
+ g_fp->_gameLoader->unloadScene(SC_FINAL4);
+
+ g_fp->_currentScene = g_fp->accessScene(SC_FINAL1);
+
+ g_fp->stopAllSounds();
+
+ g_vars->sceneFinal_var01 = 0;
+ }
+
+ g_fp->_sfxVolume = _sfxVolume;
+}
+
+bool ModalFinal::init(int counterdiff) {
+ if (g_vars->sceneFinal_var01) {
+ g_fp->_gameLoader->updateSystems(42);
+
+ return true;
+ }
+
+ if (_counter > 0) {
+ _flags |= 2u;
+
+ g_fp->_gameLoader->updateSystems(42);
+
+ return true;
+ }
+
+ unloadScenes();
+
+ g_fp->_modalObject = new ModalCredits();
+
+ return true;
+}
+
+void ModalFinal::unloadScenes() {
+ g_fp->_gameLoader->unloadScene(SC_FINAL2);
+ g_fp->_gameLoader->unloadScene(SC_FINAL3);
+ g_fp->_gameLoader->unloadScene(SC_FINAL4);
+
+ g_fp->_currentScene = g_fp->accessScene(SC_FINAL1);
+
+ g_fp->stopAllSounds();
+}
+
+bool ModalFinal::handleMessage(ExCommand *cmd) {
+ if (cmd->_messageKind == 17 && cmd->_messageNum == 36 && cmd->_keyCode == 27) {
+ g_fp->_modalObject = new ModalMainMenu();
+ g_fp->_modalObject->_parentObj = this;
+
+ return true;
+ }
+
+ return false;
+}
+
+void ModalFinal::update() {
+ if (g_fp->_currentScene) {
+ g_fp->_currentScene->draw();
+
+ if (_flags & 1) {
+ g_fp->drawAlphaRectangle(0, 0, 800, 600, 0xff - _counter);
+
+ _counter += 10;
+
+ if (_counter >= 255) {
+ _counter = 255;
+ _flags &= 0xfe;
+ }
+ } else {
+ if (!(_flags & 2))
+ return;
+
+ g_fp->drawAlphaRectangle(0, 0, 800, 600, 0xff - _counter);
+ _counter -= 10;
+
+ if (_counter <= 0) {
+ _counter = 0;
+ _flags &= 0xFD;
+ }
+ }
+
+ g_fp->_sfxVolume = _counter * (_sfxVolume + 3000) / 255 - 3000;
+
+ g_fp->updateSoundVolume();
+ }
+}
+
+ModalCredits::ModalCredits() {
+ Common::Point point;
+
+ _sceneTitles = g_fp->accessScene(SC_TITLES);
+
+ _creditsPic = _sceneTitles->getPictureObjectById(PIC_TTL_CREDITS, 0);
+ _creditsPic->_flags |= 4;
+
+ _fadeIn = true;
+ _fadeOut = false;
+
+ _creditsPic->getDimensions(&point);
+
+ _countdown = point.y / 2 + 470;
+ _sfxVolume = g_fp->_sfxVolume;
+
+ _currY = 630;
+ _maxY = -1000 - point.y;
+
+ _currX = 400 - point.x / 2;
+
+ _creditsPic->setOXY(_currX, _currY);
+}
+
+ModalCredits::~ModalCredits() {
+ g_fp->_gameLoader->unloadScene(SC_TITLES);
+
+ g_fp->_sfxVolume = _sfxVolume;
+}
+
+bool ModalCredits::handleMessage(ExCommand *cmd) {
+ if (cmd->_messageKind == 17 && cmd->_messageNum == 36 && cmd->_keyCode == 27) {
+ _fadeIn = false;
+
+ return true;
+ }
+
+ return false;
+}
+
+bool ModalCredits::init(int counterdiff) {
+ if (_fadeIn || _fadeOut) {
+ _countdown--;
+
+ if (_countdown < 0)
+ _fadeIn = false;
+
+ _creditsPic->setOXY(_currX, _currY);
+
+ if (_currY > _maxY)
+ _currY -= 2;
+ } else {
+ if (_parentObj)
+ return 0;
+
+ ModalMainMenu *menu = new ModalMainMenu;
+
+ g_fp->_modalObject = menu;
+
+ menu->_mfield_34 = 1;
+ }
+
+ return true;
+}
+
+void ModalCredits::update() {
+ warning("STUB: ModalCredits::update()");
+
+ if (_fadeOut) {
+ if (_fadeIn) {
+ _sceneTitles->draw();
+
+ return;
+ }
+ } else if (_fadeIn) {
+ //sceneFade(virt, this->_sceneTitles, 1); // TODO
+ _fadeOut = 1;
+
+ return;
+ }
+
+ if (_fadeOut) {
+ //sceneFade(virt, this->_sceneTitles, 0); // TODO
+ _fadeOut = 0;
+ return;
+ }
+
+ _sceneTitles->draw();
+}
+
+ModalMainMenu::ModalMainMenu() {
+ _areas.clear();
+
+ _lastArea = 0;
+ _hoverAreaId = 0;
+ _mfield_34 = 0;
+ _scene = g_fp->accessScene(SC_MAINMENU);
+ _debugKeyCount = 0;
+ _sliderOffset = 0;
+ _screct.left = g_fp->_sceneRect.left;
+ _screct.top = g_fp->_sceneRect.top;
+ _screct.right = g_fp->_sceneRect.right;
+ _screct.bottom = g_fp->_sceneRect.bottom;
+
+ if (g_fp->_currentScene) {
+ _bgX = g_fp->_currentScene->_x;
+ _bgY = g_fp->_currentScene->_y;
+ } else {
+ _bgX = 0;
+ _bgY = 0;
+ }
+
+ g_fp->_sceneRect.top = 0;
+ g_fp->_sceneRect.left = 0;
+ g_fp->_sceneRect.right = 800;
+ g_fp->_sceneRect.bottom = 600;
+
+ MenuArea *area;
+
+ area = new MenuArea();
+ area->picIdL = PIC_MNU_EXIT_L;
+ area->picObjD = 0;
+ area->picObjL = _scene->getPictureObjectById(area->picIdL, 0);
+ area->picObjL->_flags &= 0xFFFB;
+ _areas.push_back(area);
+
+ area = new MenuArea();
+ area->picIdL = PIC_MNU_CONTINUE_L;
+ area->picObjD = 0;
+ area->picObjL = _scene->getPictureObjectById(area->picIdL, 0);
+ area->picObjL->_flags &= 0xFFFB;
+ _areas.push_back(area);
+
+ if (isSaveAllowed()) {
+ area = new MenuArea();
+ area->picIdL = PIC_MNU_SAVE_L;
+ area->picObjD = 0;
+ area->picObjL = _scene->getPictureObjectById(area->picIdL, 0);
+ area->picObjL->_flags &= 0xFFFB;
+ _areas.push_back(area);
+ }
+
+ area = new MenuArea();
+ area->picIdL = PIC_MNU_LOAD_L;
+ area->picObjD = 0;
+ area->picObjL = _scene->getPictureObjectById(area->picIdL, 0);
+ area->picObjL->_flags &= 0xFFFB;
+ _areas.push_back(area);
+
+ area = new MenuArea();
+ area->picIdL = PIC_MNU_RESTART_L;
+ area->picObjD = 0;
+ area->picObjL = _scene->getPictureObjectById(area->picIdL, 0);
+ area->picObjL->_flags &= 0xFFFB;
+ _areas.push_back(area);
+
+ area = new MenuArea();
+ area->picIdL = PIC_MNU_AUTHORS_L;
+ area->picObjD = 0;
+ area->picObjL = _scene->getPictureObjectById(area->picIdL, 0);
+ area->picObjL->_flags &= 0xFFFB;
+ _areas.push_back(area);
+
+ area = new MenuArea();
+ area->picIdL = PIC_MNU_SLIDER_L;
+ area->picObjD = _scene->getPictureObjectById(PIC_MNU_SLIDER_D, 0);
+ area->picObjD->_flags |= 4;
+ area->picObjL = _scene->getPictureObjectById(area->picIdL, 0);
+ area->picObjL->_flags &= 0xFFFB;
+ _areas.push_back(area);
+ _menuSliderIdx = _areas.size() - 1;
+
+ area = new MenuArea();
+ area->picIdL = PIC_MNU_MUSICSLIDER_L;
+ area->picObjD = _scene->getPictureObjectById(PIC_MNU_MUSICSLIDER_D, 0);
+ area->picObjD->_flags |= 4;
+ area->picObjL = _scene->getPictureObjectById(area->picIdL, 0);
+ area->picObjL->_flags &= 0xFFFB;
+ _areas.push_back(area);
+ _musicSliderIdx = _areas.size() - 1;
+
+ if (g_fp->_mainMenu_debugEnabled)
+ enableDebugMenuButton();
+
+ setSliderPos();
+}
+
+void ModalMainMenu::update() {
+ _scene->draw();
+}
+
+bool ModalMainMenu::handleMessage(ExCommand *message) {
+ if (message->_messageKind != 17)
+ return false;
+
+ Common::Point point;
+
+ if (message->_messageNum == 29) {
+ point.x = message->_x;
+ point.y = message->_y;
+
+ int numarea = checkHover(point);
+
+ if (numarea >= 0) {
+ if (numarea == _menuSliderIdx) {
+ _lastArea = _areas[_menuSliderIdx];
+ _sliderOffset = _lastArea->picObjL->_ox - point.x;
+
+ return false;
+ }
+
+ if (numarea == _musicSliderIdx) {
+ _lastArea = _areas[_musicSliderIdx];
+ _sliderOffset = _lastArea->picObjL->_ox - point.x;
+
+ return false;
+ }
+
+ _hoverAreaId = _areas[numarea]->picIdL;
+ }
+
+ return false;
+ }
+
+ if (message->_messageNum == 30) {
+ if (_lastArea)
+ _lastArea = 0;
+
+ return false;
+ }
+
+ if (message->_messageNum != 36)
+ return false;
+
+ if (message->_keyCode == 27)
+ _hoverAreaId = PIC_MNU_CONTINUE_L;
+ else
+ enableDebugMenu(message->_keyCode);
+
+ return false;
+}
+
+bool ModalMainMenu::init(int counterdiff) {
+ switch (_hoverAreaId) {
+ case PIC_MNU_RESTART_L:
+ g_fp->restartGame();
+
+ if (this == g_fp->_modalObject)
+ return false;
+
+ delete this;
+ break;
+
+ case PIC_MNU_EXIT_L:
+ {
+ ModalQuery *mq = new ModalQuery();
+
+ g_fp->_modalObject = mq;
+
+ mq->_parentObj = this;
+ mq->create(_scene, (PictureObject *)_scene->_picObjList[0], PIC_MEX_BGR);
+
+ _hoverAreaId = 0;
+
+ return true;
+ }
+
+ case PIC_MNU_DEBUG_L:
+ g_fp->_gameLoader->unloadScene(SC_MAINMENU);
+ g_fp->_sceneRect = _screct;
+
+ if (!g_fp->_currentScene)
+ error("ModalMainMenu::init: Bad state");
+
+ g_fp->_currentScene->_x = _bgX;
+ g_fp->_currentScene->_y = _bgY;
+
+ g_fp->_gameLoader->preloadScene(g_fp->_currentScene->_sceneId, SC_DBGMENU);
+
+ return false;
+
+ case PIC_MNU_CONTINUE_L:
+ if (!_mfield_34) {
+ g_fp->_gameLoader->unloadScene(SC_MAINMENU);
+ g_fp->_sceneRect = _screct;
+
+ if (g_fp->_currentScene) {
+ g_fp->_currentScene->_x = _bgX;
+ g_fp->_currentScene->_y = _bgY;
+ }
+
+ return false;
+ }
+
+ g_fp->restartGame();
+
+ if (this == g_fp->_modalObject)
+ return false;
+
+ delete this;
+ break;
+
+ case PIC_MNU_AUTHORS_L:
+ g_fp->_modalObject = new ModalCredits();
+ g_fp->_modalObject->_parentObj = this;
+
+ _hoverAreaId = 0;
+
+ return true;
+
+ case PIC_MNU_SAVE_L:
+ case PIC_MNU_LOAD_L:
+ {
+ ModalSaveGame *sg = new ModalSaveGame();
+
+ g_fp->_modalObject = sg;
+ g_fp->_modalObject->_parentObj = _parentObj;
+
+ int mode = 0;
+ if (_hoverAreaId == PIC_MNU_SAVE_L)
+ mode = 1;
+
+ sg->setup(g_fp->accessScene(SC_MAINMENU), mode);
+ sg->setScene(g_fp->accessScene(SC_MAINMENU));
+
+ sg->_rect = _screct;
+ sg->_oldBgX = _bgX;
+ sg->_oldBgY = _bgY;
+
+ delete this;
+ }
+
+ break;
+
+ default:
+ if (_lastArea) {
+ updateSliderPos();
+ } else {
+ g_fp->_cursorId = PIC_CSR_DEFAULT;
+
+ int idx = checkHover(g_fp->_mouseScreenPos);
+
+ if (idx < 0)
+ goto LABEL_40;
+
+ g_fp->_cursorId = PIC_CSR_DEFAULT;
+
+ if (idx != this->_menuSliderIdx && idx != this->_musicSliderIdx )
+ goto LABEL_40;
+ }
+
+ g_fp->_cursorId = PIC_CSR_LIFT;
+
+ LABEL_40:
+ g_fp->setCursor(g_fp->_cursorId);
+
+ updateVolume();
+
+ return true;
+ }
+
+ return true;
+}
+
+void ModalMainMenu::updateVolume() {
+ if (g_fp->_soundEnabled ) {
+ for (int s = 0; s < g_fp->_currSoundListCount; s++)
+ for (int i = 0; i < g_fp->_currSoundList1[s]->getCount(); i++) {
+ updateSoundVolume(g_fp->_currSoundList1[s]->getSoundByIndex(i));
+ }
+ }
+}
+
+void ModalMainMenu::updateSoundVolume(Sound *snd) {
+ if (!snd->_objectId)
+ return;
+
+ StaticANIObject *ani = g_fp->_currentScene->getStaticANIObject1ById(snd->_objectId, -1);
+ if (!ani)
+ return;
+
+ int a, b;
+
+ if (ani->_ox >= _screct.left) {
+ int par, pan;
+
+ if (ani->_ox <= _screct.right) {
+ int dx;
+
+ if (ani->_oy <= _screct.bottom) {
+ if (ani->_oy >= _screct.top) {
+ snd->setPanAndVolume(g_fp->_sfxVolume, 0);
+
+ return;
+ }
+ dx = _screct.top - ani->_oy;
+ } else {
+ dx = ani->_oy - _screct.bottom;
+ }
+
+ par = 0;
+
+ if (dx > 800) {
+ snd->setPanAndVolume(-3500, 0);
+ return;
+ }
+
+ pan = -3500;
+ a = g_fp->_sfxVolume - (-3500);
+ b = 800 - dx;
+ } else {
+ int dx = ani->_ox - _screct.right;
+
+ if (dx > 800) {
+ snd->setPanAndVolume(-3500, 0);
+ return;
+ }
+
+ pan = -3500;
+ par = dx * (-3500) / -800;
+ a = g_fp->_sfxVolume - (-3500);
+ b = 800 - dx;
+ }
+
+ int32 pp = b * a;
+
+ snd->setPanAndVolume(pan + pp / 800, par);
+
+ return;
+ }
+
+ int dx = _screct.left - ani->_ox;
+ if (dx <= 800) {
+ int32 s = (800 - dx) * (g_fp->_sfxVolume - (-3500));
+ int32 p = -3500 + s / 800;
+
+ if (p > g_fp->_sfxVolume)
+ p = g_fp->_sfxVolume;
+
+ snd->setPanAndVolume(p, dx * (-3500) / 800);
+ } else {
+ snd->setPanAndVolume(-3500, 0);
+ }
+}
+
+void ModalMainMenu::updateSliderPos() {
+ if (_lastArea->picIdL == PIC_MNU_SLIDER_L) {
+ int x = g_fp->_mouseScreenPos.x + _sliderOffset;
+
+ if (x >= 65) {
+ if (x > 238)
+ x = 238;
+ } else {
+ x = 65;
+ }
+
+ _lastArea->picObjD->setOXY(x, _lastArea->picObjD->_oy);
+ _lastArea->picObjL->setOXY(x, _lastArea->picObjD->_oy);
+
+ int vol = 1000 * (3 * x - 195);
+ g_fp->_sfxVolume = vol / 173 - 3000;
+
+ if (!(vol / 173))
+ g_fp->_sfxVolume = -10000;
+
+ g_fp->updateSoundVolume();
+ } else if (_lastArea->picIdL == PIC_MNU_MUSICSLIDER_L) {
+ int x = g_fp->_mouseScreenPos.x + _sliderOffset;
+
+ if (x >= 65) {
+ if (x > 238)
+ x = 238;
+ } else {
+ x = 65;
+ }
+
+ _lastArea->picObjD->setOXY(x, _lastArea->picObjD->_oy);
+ _lastArea->picObjL->setOXY(x, _lastArea->picObjD->_oy);
+
+ g_fp->setMusicVolume(255 * (x - 65) / 173);
+ }
+}
+
+int ModalMainMenu::checkHover(Common::Point &point) {
+ for (uint i = 0; i < _areas.size(); i++) {
+ if (_areas[i]->picObjL->isPixelHitAtPos(point.x, point.y)) {
+ _areas[i]->picObjL->_flags |= 4;
+
+ return i;
+ } else {
+ _areas[i]->picObjL->_flags &= 0xFFFB;
+ }
+ }
+
+ if (isOverArea(_areas[_menuSliderIdx]->picObjL, &point)) {
+ _areas[_menuSliderIdx]->picObjL->_flags |= 4;
+
+ return _menuSliderIdx;
+ }
+
+ if (isOverArea(_areas[_musicSliderIdx]->picObjL, &point)) {
+ _areas[_musicSliderIdx]->picObjL->_flags |= 4;
+
+ return _musicSliderIdx;
+ }
+
+ return -1;
+}
+
+bool ModalMainMenu::isOverArea(PictureObject *obj, Common::Point *point) {
+ Common::Point p;
+
+ obj->getDimensions(&p);
+
+ int left = point->x - 8;
+ int right = point->x + 12;
+ int down = point->y - 11;
+ int up = point->y + 9;
+
+ if (left >= obj->_ox && right < obj->_ox + p.x && down >= obj->_oy && up < obj->_oy + p.y)
+ return true;
+
+ return false;
+}
+
+bool ModalMainMenu::isSaveAllowed() {
+ if (!g_fp->_isSaveAllowed)
+ return false;
+
+ if (g_fp->_aniMan->_flags & 0x100)
+ return false;
+
+ for (Common::Array<MessageQueue *>::iterator s = g_fp->_globalMessageQueueList->begin(); s != g_fp->_globalMessageQueueList->end(); ++s) {
+ if (!(*s)->_isFinished && ((*s)->getFlags() & 1))
+ return false;
+ }
+
+ return true;
+}
+
+void ModalMainMenu::enableDebugMenu(char c) {
+ const char deb[] = "DEBUGER";
+
+ if (c == deb[_debugKeyCount]) {
+ _debugKeyCount++;
+
+ if (deb[_debugKeyCount] )
+ return;
+
+ enableDebugMenuButton();
+ }
+
+ _debugKeyCount = 0;
+}
+
+void ModalMainMenu::enableDebugMenuButton() {
+ MenuArea *area;
+
+ for (uint i = 0; i < _areas.size(); i++)
+ if (_areas[i]->picIdL == PIC_MNU_DEBUG_L)
+ return;
+
+ area = new MenuArea();
+ area->picIdL = PIC_MNU_DEBUG_L;
+ area->picObjD = 0;
+ area->picObjL = _scene->getPictureObjectById(area->picIdL, 0);
+ area->picObjL->_flags &= 0xFFFB;
+ _areas.push_back(area);
+}
+
+void ModalMainMenu::setSliderPos() {
+ int x = 173 * (g_fp->_sfxVolume + 3000) / 3000 + 65;
+ PictureObject *obj = _areas[_menuSliderIdx]->picObjD;
+
+ if (x >= 65) {
+ if (x > 238)
+ x = 238;
+ } else {
+ x = 65;
+ }
+
+ obj->setOXY(x, obj->_oy);
+ _areas[_menuSliderIdx]->picObjL->setOXY(x, obj->_oy);
+
+ x = 173 * g_fp->_musicVolume / 255 + 65;
+ obj = _areas[_musicSliderIdx]->picObjD;
+
+ if (x >= 65) {
+ if (x > 238)
+ x = 238;
+ } else {
+ x = 65;
+ }
+
+ obj->setOXY(x, obj->_oy);
+ _areas[_musicSliderIdx]->picObjL->setOXY(x, obj->_oy);
+}
+
+ModalHelp::ModalHelp() {
+ _mainMenuScene = 0;
+ _bg = 0;
+ _isRunning = false;
+ _rect = g_fp->_sceneRect;
+ _hx = g_fp->_currentScene->_x;
+ _hy = g_fp->_currentScene->_y;
+
+ g_fp->_sceneRect.left = 0;
+ g_fp->_sceneRect.bottom = 600;
+ g_fp->_sceneRect.top = 0;
+ g_fp->_sceneRect.right = 800;
+}
+
+ModalHelp::~ModalHelp() {
+ g_fp->_gameLoader->unloadScene(SC_MAINMENU);
+
+ g_fp->_sceneRect = _rect;
+
+ g_fp->_currentScene->_x = _hx;
+ g_fp->_currentScene->_y = _hy;
+}
+
+bool ModalHelp::handleMessage(ExCommand *cmd) {
+ if (cmd->_messageKind == 17) {
+ int msg = cmd->_messageNum;
+
+ if (msg == 29 || msg == 36 || msg == 107) {
+ _isRunning = 0;
+
+ return true;
+ }
+ }
+
+ return false;
+}
+
+bool ModalHelp::init(int counterdiff) {
+ g_fp->setCursor(PIC_CSR_DEFAULT);
+
+ return _isRunning;
+}
+
+void ModalHelp::update() {
+ g_fp->_sceneRect.left = 0;
+ g_fp->_sceneRect.top = 0;
+ g_fp->_sceneRect.right = 800;
+ g_fp->_sceneRect.bottom = 600;
+
+ _bg->draw(0, 0, 0, 0);
+}
+
+void ModalHelp::launch() {
+ _mainMenuScene = g_fp->accessScene(SC_MAINMENU);
+
+ if (_mainMenuScene) {
+ _bg = _mainMenuScene->getPictureObjectById(PIC_HLP_BGR, 0)->_picture;
+ _isRunning = 1;
+ }
+}
+
+ModalQuery::ModalQuery() {
+ _picObjList = 0;
+ _bg = 0;
+ _okBtn = 0;
+ _cancelBtn = 0;
+ _queryResult = -1;
+}
+
+ModalQuery::~ModalQuery() {
+ _bg->_flags &= 0xFFFB;
+ _cancelBtn->_flags &= 0xFFFB;
+ _okBtn->_flags &= 0xFFFB;
+}
+
+bool ModalQuery::create(Scene *sc, PictureObject *picObjList, int id) {
+ if (id == PIC_MEX_BGR) {
+ _bg = sc->getPictureObjectById(PIC_MEX_BGR, 0);
+
+ if (!_bg)
+ return false;
+
+ _okBtn = sc->getPictureObjectById(PIC_MEX_OK, 0);
+
+ if (!_okBtn)
+ return false;
+
+ _cancelBtn = sc->getPictureObjectById(PIC_MEX_CANCEL, 0);
+
+ if (!_cancelBtn)
+ return 0;
+ } else {
+ if (id != PIC_MOV_BGR)
+ return false;
+
+ _bg = sc->getPictureObjectById(PIC_MOV_BGR, 0);
+
+ if (!_bg)
+ return false;
+
+ _okBtn = sc->getPictureObjectById(PIC_MOV_OK, 0);
+
+ if (!_okBtn)
+ return false;
+
+ _cancelBtn = sc->getPictureObjectById(PIC_MOV_CANCEL, 0);
+
+ if (!_cancelBtn)
+ return false;
+ }
+
+ _queryResult = -1;
+ _picObjList = picObjList;
+
+ return true;
+}
+
+void ModalQuery::update() {
+ if (_picObjList)
+ _picObjList->draw();
+
+ _bg->draw();
+
+ if (_okBtn->_flags & 4)
+ _okBtn->draw();
+
+ if (_cancelBtn->_flags & 4)
+ _cancelBtn->draw();
+}
+
+bool ModalQuery::handleMessage(ExCommand *cmd) {
+ if (cmd->_messageKind == 17) {
+ if (cmd->_messageNum == 29) {
+ if (_okBtn->isPointInside(g_fp->_mouseScreenPos.x, g_fp->_mouseScreenPos.y)) {
+ _queryResult = 1;
+
+ return false;
+ }
+
+ if (_cancelBtn->isPointInside(g_fp->_mouseScreenPos.x, g_fp->_mouseScreenPos.y))
+ _queryResult = 0;
+ } else if (cmd->_messageNum == 36 && cmd->_keyCode == 27) {
+ _queryResult = 0;
+
+ return false;
+ }
+ }
+
+ return false;
+}
+
+bool ModalQuery::init(int counterdiff) {
+ if (_okBtn->isPointInside(g_fp->_mouseScreenPos.x, g_fp->_mouseScreenPos.y))
+ _okBtn->_flags |= 4;
+ else
+ _okBtn->_flags &= 0xFFFB;
+
+ if (_cancelBtn->isPointInside(g_fp->_mouseScreenPos.x, g_fp->_mouseScreenPos.y))
+ _cancelBtn->_flags |= 4;
+ else
+ _cancelBtn->_flags &= 0xFFFB;
+
+ if (_queryResult == -1) {
+ return true;
+ } else {
+ if (_bg->_id == PIC_MEX_BGR) {
+ _cancelBtn->_flags &= 0xFFFB;
+ _okBtn->_flags &= 0xFFFB;
+
+ if (_queryResult == 1) {
+ warning("STUB: ModalQuery::init()");
+ //sceneFade(g_vrtDrawHandle, (Scene *)this->_picObjList, 0);
+
+ //if (inputArFlag) {
+ // g_needRestart = 1;
+ // return 0;
+ //}
+ //SendMessageA(hwndCallback, WM_DESTROY, 0, 0);
+ }
+ }
+ }
+
+ return false;
+}
+
+ModalSaveGame::ModalSaveGame() {
+ _oldBgX = 0;
+ _oldBgY = 0;
+
+ _bgr = 0;
+ _okD = 0;
+ _okL = 0;
+ _cancelD = 0;
+ _cancelL = 0;
+ _emptyD = 0;
+ _emptyL = 0;
+ _fullD = 0;
+ _fullL = 0;
+ _menuScene = 0;
+ _queryRes = -1;
+ _rect = g_fp->_sceneRect;
+ _queryDlg = 0;
+ _mode = 1;
+
+ _objtype = kObjTypeModalSaveGame;
+}
+
+ModalSaveGame::~ModalSaveGame() {
+ g_fp->_sceneRect = _rect;
+
+ _arrayD.clear();
+ _arrayL.clear();
+
+ for (uint i = 0; i < _files.size(); i++)
+ free(_files[i]);
+
+ _files.clear();
+}
+
+void ModalSaveGame::setScene(Scene *sc) {
+ _queryRes = -1;
+ _menuScene = sc;
+}
+
+void ModalSaveGame::processKey(int key) {
+ if (key == 27)
+ _queryRes = 0;
+}
+
+bool ModalSaveGame::init(int counterdiff) {
+ if (_queryDlg) {
+ if (!_queryDlg->init(counterdiff)) {
+ if (!_queryDlg->getQueryResult())
+ _queryRes = -1;
+
+ delete _queryDlg;
+ _queryDlg = 0;
+ }
+
+ return true;
+ }
+
+ if (_queryRes == -1)
+ return true;
+
+ g_fp->_sceneRect = _rect;
+
+ if (g_fp->_currentScene) {
+ g_fp->_currentScene->_x = _oldBgX;
+ g_fp->_currentScene->_y = _oldBgY;
+ }
+
+ if (!_queryRes) {
+ ModalMainMenu *m = new ModalMainMenu;
+
+ g_fp->_modalObject = m;
+
+ m->_parentObj = _parentObj;
+ m->_screct = _rect;
+ m->_bgX = _oldBgX;
+ m->_bgY = _oldBgY;
+
+ delete this;
+
+ return true;
+ }
+
+ return false;
+}
+
+void ModalSaveGame::setup(Scene *sc, int mode) {
+ _files.clear();
+ _arrayL.clear();
+ _arrayD.clear();
+ _mode = mode;
+
+ if (mode) {
+ _bgr = sc->getPictureObjectById(PIC_MSV_BGR, 0);
+ _cancelD = sc->getPictureObjectById(PIC_MSV_CANCEL_D, 0);
+ _cancelL = sc->getPictureObjectById(PIC_MSV_CANCEL_L, 0);
+ _okD = sc->getPictureObjectById(PIC_MSV_OK_D, 0);
+ _okL = sc->getPictureObjectById(PIC_MSV_OK_L, 0);
+ _emptyD = sc->getPictureObjectById(PIC_MSV_EMPTY_D, 0);
+ _emptyL = sc->getPictureObjectById(PIC_MSV_EMPTY_L, 0);
+ } else {
+ _bgr = sc->getPictureObjectById(PIC_MLD_BGR, 0);
+ _cancelD = sc->getPictureObjectById(PIC_MLD_CANCEL_D, 0);
+ _cancelL = sc->getPictureObjectById(PIC_MLD_CANCEL_L, 0);
+ _okD = sc->getPictureObjectById(PIC_MLD_OK_D, 0);
+ _okL = sc->getPictureObjectById(PIC_MLD_OK_L, 0);
+ _emptyD = sc->getPictureObjectById(PIC_MSV_EMPTY_D, 0);
+ _emptyL = sc->getPictureObjectById(PIC_MSV_EMPTY_D, 0);
+ }
+
+ _fullD = sc->getPictureObjectById(PIC_MSV_FULL_D, 0);
+ _fullL = sc->getPictureObjectById(PIC_MSV_FULL_L, 0);
+ _queryRes = -1;
+
+ _arrayL.push_back(sc->getPictureObjectById(PIC_MSV_0_D, 0));
+ _arrayD.push_back(sc->getPictureObjectById(PIC_MSV_0_L, 0));
+ _arrayL.push_back(sc->getPictureObjectById(PIC_MSV_1_D, 0));
+ _arrayD.push_back(sc->getPictureObjectById(PIC_MSV_1_L, 0));
+ _arrayL.push_back(sc->getPictureObjectById(PIC_MSV_2_D, 0));
+ _arrayD.push_back(sc->getPictureObjectById(PIC_MSV_2_L, 0));
+ _arrayL.push_back(sc->getPictureObjectById(PIC_MSV_3_D, 0));
+ _arrayD.push_back(sc->getPictureObjectById(PIC_MSV_3_L, 0));
+ _arrayL.push_back(sc->getPictureObjectById(PIC_MSV_4_D, 0));
+ _arrayD.push_back(sc->getPictureObjectById(PIC_MSV_4_L, 0));
+ _arrayL.push_back(sc->getPictureObjectById(PIC_MSV_5_D, 0));
+ _arrayD.push_back(sc->getPictureObjectById(PIC_MSV_5_L, 0));
+ _arrayL.push_back(sc->getPictureObjectById(PIC_MSV_6_D, 0));
+ _arrayD.push_back(sc->getPictureObjectById(PIC_MSV_6_L, 0));
+ _arrayL.push_back(sc->getPictureObjectById(PIC_MSV_7_D, 0));
+ _arrayD.push_back(sc->getPictureObjectById(PIC_MSV_7_L, 0));
+ _arrayL.push_back(sc->getPictureObjectById(PIC_MSV_8_D, 0));
+ _arrayD.push_back(sc->getPictureObjectById(PIC_MSV_8_L, 0));
+ _arrayL.push_back(sc->getPictureObjectById(PIC_MSV_9_D, 0));
+ _arrayD.push_back(sc->getPictureObjectById(PIC_MSV_9_L, 0));
+ _arrayL.push_back(sc->getPictureObjectById(PIC_MSV_DOTS_D, 0));
+ _arrayD.push_back(sc->getPictureObjectById(PIC_MSV_DOTS_L, 0));
+ _arrayL.push_back(sc->getPictureObjectById(PIC_MSV_DOT_D, 0));
+ _arrayD.push_back(sc->getPictureObjectById(PIC_MSV_DOT_L, 0));
+ _arrayL.push_back(sc->getPictureObjectById(PIC_MSV_SPACE_D, 0));
+ _arrayD.push_back(sc->getPictureObjectById(PIC_MSV_SPACE_L, 0));
+
+ Common::Point point;
+
+ int x = _bgr->_ox + _bgr->getDimensions(&point)->x / 2;
+ int y = _bgr->_oy + 90;
+ int w;
+ FileInfo *fileinfo;
+
+ for (int i = 0; i < 7; i++) {
+ fileinfo = new FileInfo;
+ memset(fileinfo, 0, sizeof(FileInfo));
+
+ Common::strlcpy(fileinfo->filename, getSavegameFile(i), 160);
+
+ if (!getFileInfo(i, fileinfo)) {
+ fileinfo->empty = true;
+ w = _emptyD->getDimensions(&point)->x;
+ } else {
+ w = 0;
+
+ for (int j = 0; j < 16; j++) {
+ _arrayL[j]->getDimensions(&point);
+ w += point.x + 2;
+ }
+ }
+
+ fileinfo->fx1 = x - w / 2;
+ fileinfo->fx2 = x + w / 2;
+ fileinfo->fy1 = y;
+ fileinfo->fy2 = y + _emptyD->getDimensions(&point)->y;
+
+ _files.push_back(fileinfo);
+
+ y = fileinfo->fy2 + 3;
+ }
+}
+
+char *ModalSaveGame::getSaveName() {
+ if (_queryRes < 0)
+ return 0;
+
+ return _files[_queryRes]->filename;
+}
+
+bool ModalSaveGame::getFileInfo(int slot, FileInfo *fileinfo) {
+ Common::InSaveFile *f = g_system->getSavefileManager()->openForLoading(
+ Fullpipe::getSavegameFile(slot));
+
+ if (!f)
+ return false;
+
+ Fullpipe::FullpipeSavegameHeader header;
+ Fullpipe::readSavegameHeader(f, header);
+ delete f;
+
+ // Create the return descriptor
+ SaveStateDescriptor desc(slot, header.saveName);
+ char res[17];
+
+ snprintf(res, 17, "%s %s", desc.getSaveDate().c_str(), desc.getSaveTime().c_str());
+
+ for (int i = 0; i < 16; i++) {
+ switch(res[i]) {
+ case '.':
+ fileinfo->date[i] = 11;
+ break;
+ case ' ':
+ fileinfo->date[i] = 12;
+ break;
+ case ':':
+ fileinfo->date[i] = 10;
+ break;
+ case '0':
+ case '1':
+ case '2':
+ case '3':
+ case '4':
+ case '5':
+ case '6':
+ case '7':
+ case '8':
+ case '9':
+ fileinfo->date[i] = res[i] - '0';
+ break;
+ default:
+ error("Incorrect date format: %s", res);
+ }
+ }
+
+ return true;
+}
+
+void ModalSaveGame::update() {
+ if (_menuScene)
+ _menuScene->draw();
+
+ _bgr->draw();
+
+ if (_queryDlg) {
+ _queryDlg->update();
+
+ return;
+ }
+
+ g_fp->_cursorId = PIC_CSR_DEFAULT;
+
+ g_fp->setCursor(g_fp->_cursorId);
+
+ Common::Point point;
+
+ for (uint i = 0; i < _files.size(); i++) {
+ if (g_fp->_mouseScreenPos.x < _files[i]->fx1 || g_fp->_mouseScreenPos.x > _files[i]->fx2 ||
+ g_fp->_mouseScreenPos.y < _files[i]->fy1 || g_fp->_mouseScreenPos.y > _files[i]->fy2 ) {
+ if (_files[i]->empty) {
+ _emptyD->setOXY(_files[i]->fx1, _files[i]->fy1);
+ _emptyD->draw();
+ } else {
+ int x = _files[i]->fx1;
+
+ for (int j = 0; j < 16; j++) {
+ _arrayL[_files[i]->date[j]]->setOXY(x + 1, _files[i]->fy1);
+ _arrayL[_files[i]->date[j]]->draw();
+
+ x += _arrayL[_files[i]->date[j]]->getDimensions(&point)->x + 2;
+ }
+ }
+ } else {
+ if (_files[i]->empty) {
+ _emptyL->setOXY(_files[i]->fx1, _files[i]->fy1);
+ _emptyL->draw();
+ } else {
+ int x = _files[i]->fx1;
+
+ for (int j = 0; j < 16; j++) {
+ _arrayD[_files[i]->date[j]]->setOXY(x + 1, _files[i]->fy1);
+ _arrayD[_files[i]->date[j]]->draw();
+
+ x += _arrayD[_files[i]->date[j]]->getDimensions(&point)->x + 2;
+ }
+ }
+ }
+ }
+ if (_cancelL->isPixelHitAtPos(g_fp->_mouseScreenPos.x, g_fp->_mouseScreenPos.y))
+ _cancelL->draw();
+ else if (_okL->isPixelHitAtPos(g_fp->_mouseScreenPos.x, g_fp->_mouseScreenPos.y))
+ _okL->draw();
+}
+
+bool ModalSaveGame::handleMessage(ExCommand *cmd) {
+ if (_queryDlg)
+ return _queryDlg->handleMessage(cmd);
+
+ if (cmd->_messageNum == 29)
+ processMouse(cmd->_x, cmd->_y);
+ else if (cmd->_messageNum == 36)
+ processKey(cmd->_keyCode);
+
+ return false;
+}
+
+void ModalSaveGame::processMouse(int x, int y) {
+ for (uint i = 0; i < _files.size(); i++) {
+ if (x >= _files[i]->fx1 && x <= _files[i]->fx2 && y >= _files[i]->fy1 && y <= _files[i]->fy2) {
+ _queryRes = i + 1;
+
+ if (_mode) {
+ if (!_files[i]->empty) {
+ _queryDlg = new ModalQuery;
+
+ _queryDlg->create(_menuScene, 0, PIC_MOV_BGR);
+ }
+ }
+
+ return;
+ }
+ }
+
+ if (_cancelL->isPixelHitAtPos(x, y))
+ _queryRes = 0;
+}
+
+void ModalSaveGame::saveload() {
+ if (_objtype != kObjTypeModalSaveGame)
+ return;
+
+ if (_mode) {
+ if (getSaveName()) {
+ bool allowed = true;
+
+ for (Common::Array<MessageQueue *>::iterator s = g_fp->_globalMessageQueueList->begin(); s != g_fp->_globalMessageQueueList->end(); ++s) {
+ if (!(*s)->_isFinished && ((*s)->getFlags() & 1))
+ allowed = false;
+ }
+
+ if (g_fp->_isSaveAllowed && allowed)
+ g_fp->_gameLoader->writeSavegame(g_fp->_currentScene, getSaveName());
+ }
+ } else {
+ if (getSaveName()) {
+ if (_parentObj) {
+ delete _parentObj;
+
+ _parentObj = 0;
+ }
+
+ g_fp->stopAllSoundStreams();
+ g_fp->stopSoundStream2();
+
+ g_fp->_gameLoader->readSavegame(getSaveName());
+ }
+ }
}
void FullpipeEngine::openHelp() {
- warning("STUB: FullpipeEngine::openHelp()");
+ if (!_modalObject) {
+ ModalHelp *help = new ModalHelp;
+
+ _modalObject = help;
+
+ help->launch();
+ }
}
void FullpipeEngine::openMainMenu() {
- warning("STUB: FullpipeEngine::openMainMenu()");
+ ModalMainMenu *menu = new ModalMainMenu;
+
+ menu->_parentObj = g_fp->_modalObject;
+
+ g_fp->_modalObject = menu;
}
} // End of namespace Fullpipe
diff --git a/engines/fullpipe/modal.h b/engines/fullpipe/modal.h
index 7d98427e20..01d8e6b0ee 100644
--- a/engines/fullpipe/modal.h
+++ b/engines/fullpipe/modal.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -25,35 +25,271 @@
namespace Fullpipe {
+class PictureObject;
+class Picture;
+class Sound;
+
+struct FileInfo {
+ char filename[260];
+ bool empty;
+ char date[16];
+ int fx1;
+ int fx2;
+ int fy1;
+ int fy2;
+};
+
class BaseModalObject {
public:
BaseModalObject *_parentObj;
+ ObjType _objtype;
public:
- BaseModalObject() : _parentObj(0) {}
+ BaseModalObject() : _parentObj(0) { _objtype = kObjTypeDefault; }
virtual ~BaseModalObject() {}
- virtual bool handleMessage(ExCommand *message);
- virtual bool init(int counterdiff);
- virtual bool update();
- void saveload();
+ virtual bool pollEvent() = 0;
+ virtual bool handleMessage(ExCommand *message) = 0;
+ virtual bool init(int counterdiff) = 0;
+ virtual void update() = 0;
+
+ virtual void saveload() = 0;
};
class ModalIntro : public BaseModalObject {
int _field_8;
int _introFlags;
int _countDown;
- int _needRedraw;
+ int _stillRunning;
int _sfxVolume;
public:
ModalIntro();
+ virtual ~ModalIntro();
+
+ virtual bool pollEvent() { return true; }
+ virtual bool handleMessage(ExCommand *message);
+ virtual bool init(int counterdiff);
+ virtual void update();
+ virtual void saveload() {}
+
+ void finish();
+};
+
+class ModalVideoPlayer : public BaseModalObject {
+public:
+
+ virtual bool pollEvent() { return true; }
+ virtual bool handleMessage(ExCommand *message) { return true; }
+ virtual bool init(int counterdiff) { return false; }
+ virtual void update() {}
+ virtual void saveload() {}
+
+ void play(const char *fname);
+};
+
+class ModalMap : public BaseModalObject {
+ Scene *_mapScene;
+ PictureObject *_pic;
+ bool _isRunning;
+ Common::Rect _rect1;
+ int _x;
+ int _y;
+ int _flag;
+ int _mouseX;
+ int _mouseY;
+ int _field_38;
+ int _field_3C;
+ int _field_40;
+ Common::Rect _rect2;
+
+ public:
+ ModalMap();
+ virtual ~ModalMap();
+
+ virtual bool pollEvent() { return true; }
+ virtual bool handleMessage(ExCommand *message);
+ virtual bool init(int counterdiff);
+ virtual void update();
+ virtual void saveload() {}
+
+ void initMap();
+ PictureObject *getScenePicture();
+};
+
+class ModalFinal : public BaseModalObject {
+ int _flags;
+ int _counter;
+ int _sfxVolume;
+
+ public:
+ ModalFinal();
+ virtual ~ModalFinal();
+
+ virtual bool pollEvent() { return true; }
+ virtual bool handleMessage(ExCommand *message);
+ virtual bool init(int counterdiff);
+ virtual void update();
+ virtual void saveload() {}
+
+ void unloadScenes();
+};
+
+class ModalCredits : public BaseModalObject {
+ Scene *_sceneTitles;
+ PictureObject *_creditsPic;
+ bool _fadeIn;
+ bool _fadeOut;
+ int _countdown;
+ int _sfxVolume;
+ int _currX;
+ int _currY;
+ int _maxY;
+ public:
+ ModalCredits();
+ virtual ~ModalCredits();
+
+ virtual bool pollEvent() { return true; }
+ virtual bool handleMessage(ExCommand *message);
+ virtual bool init(int counterdiff);
+ virtual void update();
+ virtual void saveload() {}
+};
+
+struct MenuArea {
+ int picIdL;
+ PictureObject *picObjD;
+ PictureObject *picObjL;
+};
+
+class ModalMainMenu : public BaseModalObject {
+public:
+ Scene *_scene;
+ int _hoverAreaId;
+ Common::Array<MenuArea *> _areas;
+ int _menuSliderIdx;
+ int _musicSliderIdx;
+ MenuArea *_lastArea;
+ int _sliderOffset;
+ int _mfield_34;
+ Common::Rect _screct;
+ int _bgX;
+ int _bgY;
+ int _debugKeyCount;
+
+public:
+ ModalMainMenu();
+ virtual ~ModalMainMenu() {}
+
+ virtual bool pollEvent() { return true; }
+ virtual bool handleMessage(ExCommand *message);
+ virtual bool init(int counterdiff);
+ virtual void update();
+ virtual void saveload() {}
+
+private:
+ bool isSaveAllowed();
+ void enableDebugMenuButton();
+ void setSliderPos();
+ void enableDebugMenu(char c);
+ int checkHover(Common::Point &point);
+ void updateVolume();
+ void updateSoundVolume(Sound *snd);
+ void updateSliderPos();
+ bool isOverArea(PictureObject *obj, Common::Point *point);
+};
+
+class ModalHelp : public BaseModalObject {
+public:
+ Scene *_mainMenuScene;
+ Picture *_bg;
+ bool _isRunning;
+ Common::Rect _rect;
+ int _hx;
+ int _hy;
+
+public:
+ ModalHelp();
+ virtual ~ModalHelp();
+
+ virtual bool pollEvent() { return true; }
+ virtual bool handleMessage(ExCommand *message);
+ virtual bool init(int counterdiff);
+ virtual void update();
+ virtual void saveload() {}
+
+ void launch();
+};
+
+class ModalQuery : public BaseModalObject {
+public:
+ ModalQuery();
+ virtual ~ModalQuery();
+
+ virtual bool pollEvent() { return true; }
virtual bool handleMessage(ExCommand *message);
+ virtual bool init(int counterdiff);
+ virtual void update();
+ virtual void saveload() {}
+
+ bool create(Scene *sc, PictureObject *picObjList, int picId);
+ int getQueryResult() { return _queryResult; }
+
+
+private:
+ PictureObject *_picObjList;
+ PictureObject *_bg;
+ PictureObject *_okBtn;
+ PictureObject *_cancelBtn;
+ int _queryResult;
+
};
+class ModalSaveGame : public BaseModalObject {
+public:
+ ModalSaveGame();
+ virtual ~ModalSaveGame();
+
+ virtual bool pollEvent() { return true; }
+ virtual bool handleMessage(ExCommand *message);
+ virtual bool init(int counterdiff);
+ virtual void update();
+ virtual void saveload();
+
+ void processMouse(int x, int y);
+
+ void setScene(Scene *sc);
+ void setup(Scene *sc, int mode);
+ void processKey(int key);
+
+ char *getSaveName();
+ bool getFileInfo(int slot, FileInfo *fileinfo);
+
+ Common::Rect _rect;
+ int _oldBgX;
+ int _oldBgY;
+ PictureObject *_bgr;
+ PictureObject *_okD;
+ PictureObject *_okL;
+ PictureObject *_cancelD;
+ PictureObject *_cancelL;
+ PictureObject *_emptyD;
+ PictureObject *_emptyL;
+ PictureObject *_fullD;
+ PictureObject *_fullL;
+ Scene *_menuScene;
+ int _mode;
+ ModalQuery *_queryDlg;
+ Common::Array <FileInfo *> _files;
+ Common::Array <PictureObject *> _arrayL;
+ Common::Array <PictureObject *> _arrayD;
+ int _queryRes;
+};
+
+
} // End of namespace Fullpipe
#endif /* FULLPIPE_MODAL_H */
diff --git a/engines/fullpipe/module.mk b/engines/fullpipe/module.mk
index 380f582c08..3962fe64ba 100644
--- a/engines/fullpipe/module.mk
+++ b/engines/fullpipe/module.mk
@@ -2,7 +2,9 @@ MODULE := engines/fullpipe
MODULE_OBJS = \
behavior.o \
+ console.o \
detection.o \
+ floaters.o \
fullpipe.o \
gameloader.o \
gfx.o \
@@ -11,6 +13,7 @@ MODULE_OBJS = \
interaction.o \
inventory.o \
lift.o \
+ messagehandlers.o \
messages.o \
modal.o \
motion.o \
@@ -20,7 +23,47 @@ MODULE_OBJS = \
sound.o \
stateloader.o \
statics.o \
- utils.o
+ utils.o \
+ scenes/sceneIntro.o \
+ scenes/scene01.o \
+ scenes/scene02.o \
+ scenes/scene03.o \
+ scenes/scene04.o \
+ scenes/scene05.o \
+ scenes/scene06.o \
+ scenes/scene07.o \
+ scenes/scene08.o \
+ scenes/scene09.o \
+ scenes/scene10.o \
+ scenes/scene11.o \
+ scenes/scene12.o \
+ scenes/scene13.o \
+ scenes/scene14.o \
+ scenes/scene15.o \
+ scenes/scene16.o \
+ scenes/scene17.o \
+ scenes/scene18and19.o \
+ scenes/scene20.o \
+ scenes/scene21.o \
+ scenes/scene22.o \
+ scenes/scene23.o \
+ scenes/scene24.o \
+ scenes/scene25.o \
+ scenes/scene26.o \
+ scenes/scene27.o \
+ scenes/scene28.o \
+ scenes/scene29.o \
+ scenes/scene30.o \
+ scenes/scene31.o \
+ scenes/scene32.o \
+ scenes/scene33.o \
+ scenes/scene34.o \
+ scenes/scene35.o \
+ scenes/scene36.o \
+ scenes/scene37.o \
+ scenes/scene38.o \
+ scenes/sceneFinal.o \
+ scenes/sceneDbg.o
# This module can be built as a plugin
ifeq ($(ENABLE_FULLPIPE), DYNAMIC_PLUGIN)
diff --git a/engines/fullpipe/motion.cpp b/engines/fullpipe/motion.cpp
index b49b297451..66d587f134 100644
--- a/engines/fullpipe/motion.cpp
+++ b/engines/fullpipe/motion.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -28,9 +28,9 @@
#include "fullpipe/objects.h"
#include "fullpipe/statics.h"
+#include "fullpipe/gameloader.h"
#include "fullpipe/motion.h"
#include "fullpipe/messages.h"
-#include "fullpipe/gameloader.h"
namespace Fullpipe {
@@ -42,6 +42,48 @@ bool MotionController::load(MfcArchive &file) {
return true;
}
+void MotionController::enableLinks(const char *linkName, bool enable) {
+ warning("STUB: MotionController::enableLinks()");
+}
+
+MovGraphLink *MotionController::getLinkByName(const char *name) {
+ if (_objtype == kObjTypeMctlCompound) {
+ MctlCompound *obj = (MctlCompound *)this;
+
+ for (uint i = 0; i < obj->getMotionControllerCount(); i++) {
+ MotionController *con = obj->getMotionController(i);
+
+ if (con->_objtype == kObjTypeMovGraph) {
+ MovGraph *gr = (MovGraph *)con;
+
+ for (ObList::iterator l = gr->_links.begin(); l != gr->_links.end(); ++l) {
+ assert(((CObject *)*l)->_objtype == kObjTypeMovGraphLink);
+
+ MovGraphLink *lnk = (MovGraphLink *)*l;
+
+ if (!strcmp(lnk->_name, name))
+ return lnk;
+ }
+ }
+ }
+ }
+
+ if (_objtype == kObjTypeMovGraph) {
+ MovGraph *gr = (MovGraph *)this;
+
+ for (ObList::iterator l = gr->_links.begin(); l != gr->_links.end(); ++l) {
+ assert(((CObject *)*l)->_objtype == kObjTypeMovGraphLink);
+
+ MovGraphLink *lnk = (MovGraphLink *)*l;
+
+ if (!strcmp(lnk->_name, name))
+ return lnk;
+ }
+ }
+
+ return 0;
+}
+
bool MctlCompound::load(MfcArchive &file) {
debug(5, "MctlCompound::load()");
@@ -83,9 +125,10 @@ void MctlCompound::addObject(StaticANIObject *obj) {
}
int MctlCompound::removeObject(StaticANIObject *obj) {
- warning("STUB: MctlCompound::removeObject()");
+ for (uint i = 0; i < _motionControllers.size(); i++)
+ _motionControllers[i]->_motionControllerObj->removeObject(obj);
- return 0;
+ return 1;
}
void MctlCompound::initMovGraph2() {
@@ -113,13 +156,77 @@ void MctlCompound::initMovGraph2() {
}
void MctlCompound::freeItems() {
- warning("STUB: MctlCompound::freeItems()");
+ for (uint i = 0; i < _motionControllers.size(); i++)
+ _motionControllers[i]->_motionControllerObj->freeItems();
}
-MessageQueue *MctlCompound::method34(StaticANIObject *subj, int xpos, int ypos, int fuzzyMatch, int staticsId) {
- warning("STUB: MctlCompound::method34()");
+MessageQueue *MctlCompound::method34(StaticANIObject *ani, int sourceX, int sourceY, int fuzzyMatch, int staticsId) {
+ int idx = -1;
+ int sourceIdx = -1;
- return 0;
+ if (!ani)
+ return 0;
+
+ for (uint i = 0; i < _motionControllers.size(); i++) {
+ if (_motionControllers[i]->_movGraphReactObj) {
+ if (_motionControllers[i]->_movGraphReactObj->pointInRegion(ani->_ox, ani->_oy)) {
+ idx = i;
+ break;
+ }
+ }
+ }
+
+ for (uint i = 0; i < _motionControllers.size(); i++) {
+ if (_motionControllers[i]->_movGraphReactObj) {
+ if (_motionControllers[i]->_movGraphReactObj->pointInRegion(sourceX, sourceY)) {
+ sourceIdx = i;
+ break;
+ }
+ }
+ }
+
+ if (idx == -1)
+ return 0;
+
+ if (sourceIdx == -1)
+ return 0;
+
+ if (idx == sourceIdx)
+ return _motionControllers[idx]->_motionControllerObj->method34(ani, sourceX, sourceY, fuzzyMatch, staticsId);
+
+ double dist;
+ MctlConnectionPoint *cp = findClosestConnectionPoint(ani->_ox, ani->_oy, idx, sourceX, sourceY, sourceIdx, &dist);
+
+ if (!cp)
+ return 0;
+
+ MessageQueue *mq = _motionControllers[idx]->_motionControllerObj->doWalkTo(ani, cp->_connectionX, cp->_connectionY, 1, cp->_field_14);
+
+ if (!mq)
+ return 0;
+
+ for (uint i = 0; i < cp->_messageQueueObj->getCount(); i++) {
+ ExCommand *ex = new ExCommand(cp->_messageQueueObj->getExCommandByIndex(i));
+
+ ex->_excFlags |= 2;
+
+ mq->addExCommandToEnd(ex);
+ }
+
+ ExCommand *ex = new ExCommand(ani->_id, 51, 0, sourceX, sourceY, 0, 1, 0, 0, 0);
+
+ ex->_excFlags |= 2;
+ ex->_field_20 = fuzzyMatch;
+ ex->_keyCode = ani->_okeyCode;
+
+ mq->addExCommandToEnd(ex);
+
+ if (!mq->chain(ani)) {
+ delete mq;
+ return 0;
+ }
+
+ return mq;
}
MessageQueue *MctlCompound::doWalkTo(StaticANIObject *subj, int xpos, int ypos, int fuzzyMatch, int staticsId) {
@@ -156,7 +263,8 @@ MessageQueue *MctlCompound::doWalkTo(StaticANIObject *subj, int xpos, int ypos,
if (match1 == match2)
return _motionControllers[match1]->_motionControllerObj->doWalkTo(subj, xpos, ypos, fuzzyMatch, staticsId);
- MctlConnectionPoint *closestP = findClosestConnectionPoint(subj->_ox, subj->_oy, match1, xpos, ypos, match2, &match2);
+ double dist;
+ MctlConnectionPoint *closestP = findClosestConnectionPoint(subj->_ox, subj->_oy, match1, xpos, ypos, match2, &dist);
if (!closestP)
return 0;
@@ -167,9 +275,9 @@ MessageQueue *MctlCompound::doWalkTo(StaticANIObject *subj, int xpos, int ypos,
if (mq) {
for (uint i = 0; i < closestP->_messageQueueObj->getCount(); i++) {
- ex = new ExCommand(closestP->_messageQueueObj->getExCommandByIndex(i));
+ ex = closestP->_messageQueueObj->getExCommandByIndex(i)->createClone();
ex->_excFlags |= 2;
- mq->_exCommands.push_back(ex);
+ mq->addExCommandToEnd(ex);
}
ex = new ExCommand(subj->_id, 51, 0, xpos, ypos, 0, 1, 0, 0, 0);
@@ -178,18 +286,432 @@ MessageQueue *MctlCompound::doWalkTo(StaticANIObject *subj, int xpos, int ypos,
ex->_keyCode = subj->_okeyCode;
ex->_excFlags |= 2;
- mq->_exCommands.push_back(ex);
+ mq->addExCommandToEnd(ex);
}
return mq;
}
-MctlConnectionPoint *MctlCompound::findClosestConnectionPoint(int ox, int oy, int destIndex, int connectionX, int connectionY, int sourceIndex, int *minDistancePtr) {
- warning("STUB: MctlCompound::findClosestConnectionPoint()");
+MctlCompoundArrayItem::~MctlCompoundArrayItem() {
+ delete _movGraphReactObj;
+ delete _motionControllerObj;
+}
+
+MctlLadder::MctlLadder() {
+ _width = 0;
+ _ladderX = 0;
+ _height = 0;
+ _ladderY = 0;
+ _ladder_field_14 = 0;
+
+ _ladder_field_20 = 0;
+ _ladder_field_24 = 0;
+}
+
+MctlLadder::~MctlLadder() {
+ freeItems();
+}
+
+int MctlLadder::collisionDetection(StaticANIObject *man) {
+ if (findObjectPos(man) < 0)
+ return 0;
+
+ double delta;
+
+ if ((double)(man->_oy - _ladderY) / (double)_height < 0.0)
+ delta = -0.5;
+ else
+ delta = 0.5;
+
+ int res = (int)((double)(man->_oy - _ladderY) / (double)_height + delta);
+
+ if (res < 0)
+ return 0;
+
+ return res;
+}
+
+void MctlLadder::addObject(StaticANIObject *obj) {
+ if (findObjectPos(obj) < 0) {
+ MctlLadderMovement *movement = new MctlLadderMovement;
+
+ if (initMovement(obj, movement)) {
+ _mgm.addItem(obj->_id);
+ _ladmovements.push_back(movement);
+ } else {
+ delete movement;
+ }
+ }
+}
+
+int MctlLadder::findObjectPos(StaticANIObject *obj) {
+ for (uint i = 0; i < _ladmovements.size(); i++)
+ if (_ladmovements[i]->objId == obj->_id)
+ return i;
+
+ return -1;
+}
+
+bool MctlLadder::initMovement(StaticANIObject *ani, MctlLadderMovement *movement) {
+ GameVar *v = g_fp->getGameLoaderGameVar()->getSubVarByName(ani->getName());
+
+ if (!v)
+ return false;
+
+ v = v->getSubVarByName("Test_Ladder");
+
+ if (!v)
+ return false;
+
+ movement->staticIdsSize = 6;
+ movement->movVars = new MctlLadderMovementVars;
+ movement->staticIds = new int[movement->staticIdsSize];
+
+ v = v->getSubVarByName("Up");
+
+ if (!v)
+ return false;
+
+ movement->movVars->varUpStart = v->getSubVarAsInt("Start");
+ movement->movVars->varUpGo = v->getSubVarAsInt("Go");
+ movement->movVars->varUpStop = v->getSubVarAsInt("Stop");
+
+ movement->staticIds[0] = ani->getMovementById(movement->movVars->varUpStart)->_staticsObj1->_staticsId;
+ movement->staticIds[2] = ani->getMovementById(movement->movVars->varUpGo)->_staticsObj1->_staticsId;
+
+ v = v->getSubVarByName("Down");
+
+ if (!v)
+ return false;
+
+ movement->movVars->varDownStart = v->getSubVarAsInt("Start");
+ movement->movVars->varDownGo = v->getSubVarAsInt("Go");
+ movement->movVars->varDownStop = v->getSubVarAsInt("Stop");
+
+ movement->staticIds[1] = ani->getMovementById(movement->movVars->varDownStart)->_staticsObj1->_staticsId;
+ movement->staticIds[3] = ani->getMovementById(movement->movVars->varDownGo)->_staticsObj1->_staticsId;
+
+ movement->objId = ani->_id;
+
+ return true;
+}
+
+void MctlLadder::freeItems() {
+ _mgm.clear();
+
+ for (uint i = 0; i < _ladmovements.size(); i++) {
+ delete _ladmovements[i]->movVars;
+ delete[] _ladmovements[i]->staticIds;
+ }
+
+ _ladmovements.clear();
+}
+
+MessageQueue *MctlLadder::method34(StaticANIObject *subj, int xpos, int ypos, int fuzzyMatch, int staticsId) {
+ MessageQueue *mq = doWalkTo(subj, xpos, ypos, fuzzyMatch, staticsId);
+
+ if (mq) {
+ if (mq->chain(subj))
+ return mq;
+ }
return 0;
}
+MessageQueue *MctlLadder::doWalkTo(StaticANIObject *ani, int xpos, int ypos, int fuzzyMatch, int staticsId) {
+ int pos = findObjectPos(ani);
+
+ if (pos < 0)
+ return 0;
+
+ double dh = _height;
+ double corr = (double)(ani->_oy - _ladderY) / dh;
+ int dl = (int)(corr + (corr < 0.0 ? -0.5 : 0.5));
+
+ corr = (double)(ypos - _ladderY) / dh;
+ int dl2 = (int)(corr + (corr < 0.0 ? -0.5 : 0.5));
+
+ int normx = _ladderX + dl2 * _width;
+ int normy = _ladderY + dl2 * _height;
+
+ if (dl == dl2 || dl2 < 0)
+ return 0;
+
+ int direction = (normy - ani->_oy) < 0 ? 0 : 1;
+
+ MGMInfo mgminfo;
+ PicAniInfo picinfo;
+ MessageQueue *mq;
+ ExCommand *ex;
+ Common::Point point;
+
+ if (ani->_movement) {
+ ani->getPicAniInfo(&picinfo);
+
+ int ox = ani->_ox;
+ int oy = ani->_oy;
+
+ ani->_movement->calcSomeXY(point, 1, ani->_someDynamicPhaseIndex);
+ ani->_statics = ani->_movement->_staticsObj2;
+ ani->_movement = 0;
+ ani->setOXY(point.x + ox, point.y + oy);
+
+ mq = doWalkTo(ani, normx, normy, fuzzyMatch, staticsId);
+
+ ani->setPicAniInfo(&picinfo);
+
+ return mq;
+ }
+
+ if (ani->_statics->_staticsId == _ladmovements[pos]->staticIds[0]) {
+ mgminfo.ani = ani;
+
+ if (staticsId)
+ mgminfo.staticsId2 = staticsId;
+ else
+ mgminfo.staticsId2 = _ladmovements[pos]->staticIds[direction];
+
+ mgminfo.x1 = normx;
+ mgminfo.y1 = normy;
+ mgminfo.field_1C = _ladder_field_14;
+ mgminfo.flags = 14;
+ mgminfo.movementId = direction ? _ladmovements[pos]->movVars->varDownGo : _ladmovements[pos]->movVars->varUpGo;
+
+ return _mgm.genMovement(&mgminfo);
+ }
+
+ if (ani->_statics->_staticsId == _ladmovements[pos]->staticIds[2]) {
+ if (!direction) {
+ mgminfo.ani = ani;
+
+ if (staticsId)
+ mgminfo.staticsId2 = staticsId;
+ else
+ mgminfo.staticsId2 = _ladmovements[pos]->staticIds[0];
+
+ mgminfo.x1 = normx;
+ mgminfo.y1 = normy;
+ mgminfo.field_1C = _ladder_field_14;
+ mgminfo.flags = 14;
+ mgminfo.movementId = _ladmovements[pos]->movVars->varUpGo;
+
+ return _mgm.genMovement(&mgminfo);
+ }
+
+ int ox = ani->_ox;
+ int oy = ani->_oy;
+
+ ani->getMovementById(_ladmovements[pos]->movVars->varUpStop)->calcSomeXY(point, 0, -1);
+
+ mgminfo.ani = ani;
+
+ if (staticsId)
+ mgminfo.staticsId2 = staticsId;
+ else
+ mgminfo.staticsId2 = _ladmovements[pos]->staticIds[1];
+
+ mgminfo.field_1C = _ladder_field_14;
+ mgminfo.x1 = normx;
+ mgminfo.y1 = normy;
+ mgminfo.y2 = point.y + oy;
+ mgminfo.x2 = point.x + ox;
+ mgminfo.flags = 63;
+ mgminfo.staticsId1 = _ladmovements[pos]->staticIds[0];
+ mgminfo.movementId = _ladmovements[pos]->movVars->varDownGo;
+
+ mq = _mgm.genMovement(&mgminfo);
+
+ ex = new ExCommand(ani->_id, 1, _ladmovements[pos]->movVars->varUpStop, 0, 0, 0, 1, 0, 0, 0);
+ ex->_keyCode = ani->_okeyCode;
+ ex->_excFlags |= 2;
+
+ mq->insertExCommandAt(0, ex);
+
+ return mq;
+ }
+
+ if (ani->_statics->_staticsId != _ladmovements[pos]->staticIds[3]) {
+ mq = _mgm.genMQ(ani, _ladmovements[pos]->staticIds[0], 0, 0, 0);
+
+ if (!mq)
+ return 0;
+
+ int nx = ani->_ox;
+ int ny = ani->_oy;
+
+ _mgm.getPoint(&point, ani->_id, ani->_statics->_staticsId, _ladmovements[pos]->staticIds[0]);
+
+ nx += point.x;
+ ny += point.y;
+
+ ani->getPicAniInfo(&picinfo);
+
+ ani->_statics = ani->getStaticsById(_ladmovements[pos]->staticIds[0]);
+ ani->_movement = 0;
+ ani->setOXY(nx, ny);
+
+ MessageQueue *newmq = doWalkTo(ani, normx, normy, fuzzyMatch, staticsId);
+
+ mq->transferExCommands(newmq);
+
+ delete newmq;
+
+ ani->setPicAniInfo(&picinfo);
+
+ return mq;
+ }
+
+ if (!direction) {
+ int nx = ani->_ox;
+ int ny = ani->_oy;
+
+ ani->getMovementById(_ladmovements[pos]->movVars->varDownStop)->calcSomeXY(point, 0, -1);
+
+ nx += point.x;
+ ny += point.y;
+
+ mgminfo.ani = ani;
+ if (staticsId)
+ mgminfo.staticsId2 = staticsId;
+ else
+ mgminfo.staticsId2 = _ladmovements[pos]->staticIds[0];
+
+ mgminfo.field_1C = _ladder_field_14;
+ mgminfo.x1 = normx;
+ mgminfo.y1 = normy;
+ mgminfo.y2 = ny;
+ mgminfo.x2 = nx;
+ mgminfo.flags = 63;
+ mgminfo.staticsId1 = _ladmovements[pos]->staticIds[1];
+ mgminfo.movementId = _ladmovements[pos]->movVars->varUpGo;
+
+ mq = _mgm.genMovement(&mgminfo);
+
+ ex = new ExCommand(ani->_id, 1, _ladmovements[pos]->movVars->varDownStop, 0, 0, 0, 1, 0, 0, 0);
+ ex->_keyCode = ani->_okeyCode;
+ ex->_excFlags |= 2;
+
+ mq->insertExCommandAt(0, ex);
+
+ return mq;
+ }
+
+
+ mgminfo.ani = ani;
+
+ if (staticsId)
+ mgminfo.staticsId2 = staticsId;
+ else
+ mgminfo.staticsId2 = _ladmovements[pos]->staticIds[1];
+
+ mgminfo.x1 = normx;
+ mgminfo.y1 = normy;
+ mgminfo.field_1C = _ladder_field_14;
+ mgminfo.flags = 14;
+ mgminfo.movementId = _ladmovements[pos]->movVars->varDownGo;
+
+ return _mgm.genMovement(&mgminfo);
+}
+
+MessageQueue *MctlLadder::controllerWalkTo(StaticANIObject *ani, int off) {
+ return doWalkTo(ani, _ladderX + off * _width, _ladderY + off * _height, 1, 0);
+}
+
+MctlConnectionPoint *MctlCompound::findClosestConnectionPoint(int ox, int oy, int destIndex, int connectionX, int connectionY, int sourceIdx, double *minDistancePtr) {
+ if (destIndex == sourceIdx) {
+ *minDistancePtr = sqrt((double)((oy - connectionY) * (oy - connectionY) + (ox - connectionX) * (ox - connectionX)));
+
+ return 0;
+ }
+
+ double currDistance = 0.0;
+ double minDistance = 1.0e10;
+ MctlConnectionPoint *minConnectionPoint = 0;
+
+ for (uint i = 0; i < _motionControllers[sourceIdx]->_connectionPoints.size(); i++) {
+ for (uint j = 0; j < _motionControllers.size(); j++) {
+ if (_motionControllers[j]->_movGraphReactObj) {
+ MctlConnectionPoint *pt = _motionControllers[sourceIdx]->_connectionPoints[i];
+
+ if (_motionControllers[j]->_movGraphReactObj->pointInRegion(pt->_connectionX, pt->_connectionY)) {
+ MctlConnectionPoint *npt = findClosestConnectionPoint(ox, oy, destIndex, pt->_connectionX, pt->_connectionY, j, &currDistance);
+
+ if (currDistance < minDistance) {
+ minDistance = currDistance;
+
+ if (npt)
+ minConnectionPoint = npt;
+ else
+ minConnectionPoint = pt;
+ }
+ }
+ }
+ }
+ }
+
+ *minDistancePtr = minDistance;
+
+ return minConnectionPoint;
+}
+
+void MctlCompound::replaceNodeX(int from, int to) {
+ for (uint i = 0; i < _motionControllers.size(); i++) {
+ if (_motionControllers[i]->_motionControllerObj->_objtype == kObjTypeMovGraph) {
+ MovGraph *gr = (MovGraph *)_motionControllers[i]->_motionControllerObj;
+
+ for (ObList::iterator n = gr->_nodes.begin(); n != gr->_nodes.end(); ++n) {
+ MovGraphNode *node = (MovGraphNode *)*n;
+
+ if (node->_x == from)
+ node->_x = to;
+ }
+
+ gr->calcNodeDistancesAndAngles();
+ }
+ }
+}
+
+MctlConnectionPoint::MctlConnectionPoint() {
+ _connectionX = 0;
+ _connectionY = 0;
+ _field_C = 0;
+ _field_10 = 0;
+ _field_14 = 0;
+ _field_16 = 0;
+ _messageQueueObj = 0;
+ _motionControllerObj = 0;
+}
+
+MctlConnectionPoint::~MctlConnectionPoint() {
+ delete _messageQueueObj;
+}
+
+MovInfo1::MovInfo1(MovInfo1 *src) {
+ index = src->index;
+ pt1 = src->pt1;
+ pt2 = src->pt2;
+ distance1 = src->distance1;
+ distance2 = src->distance2;
+ subIndex = src->subIndex;
+ item1Index = src->item1Index;
+ items = src->items;
+ itemsCount = src->itemsCount;
+ flags = src->flags;
+}
+
+void MovInfo1::clear() {
+ index = 0;
+ pt1.x = pt1.y = 0;
+ pt2.x = pt2.y = 0;
+ distance1 = 0;
+ distance2 = 0;
+ subIndex = 0;
+ item1Index = 0;
+ items.clear();
+ itemsCount = 0;
+ flags = 0;
+}
+
bool MctlCompoundArray::load(MfcArchive &file) {
debug(5, "MctlCompoundArray::load()");
@@ -205,15 +727,7 @@ bool MctlCompoundArray::load(MfcArchive &file) {
MovGraphItem::MovGraphItem() {
ani = 0;
field_4 = 0;
- field_8 = 0;
- field_C = 0;
- field_10 = 0;
- field_14 = 0;
- field_18 = 0;
- field_1C = 0;
- field_20 = 0;
- field_24 = 0;
- items = 0;
+ movitems = 0;
count = 0;
field_30 = 0;
field_34 = 0;
@@ -221,22 +735,46 @@ MovGraphItem::MovGraphItem() {
field_3C = 0;
}
+void MovGraphItem::free() {
+ for (uint i = 0; i < movitems->size(); i++) {
+ (*movitems)[i]->movarr->_movSteps.clear();
+ delete (*movitems)[i]->movarr;
+ }
+
+ delete movitems;
+
+ movitems = 0;
+}
+
int MovGraph_messageHandler(ExCommand *cmd);
-int MovGraphCallback(int a1, int a2, int a3) {
- warning("STUB: MovgraphCallback");
+MovArr *movGraphCallback(StaticANIObject *ani, Common::Array<MovItem *> *items, signed int counter) {
+ int residx = 0;
+ int itemidx = 0;
- return 0;
+ while (counter > 1) {
+ if ((*items)[itemidx]->_mfield_4 > (*items)[itemidx + 1]->_mfield_4)
+ residx = itemidx;
+
+ counter--;
+ itemidx++;
+ }
+
+ return (*items)[residx]->movarr;
}
MovGraph::MovGraph() {
- _callback1 = MovGraphCallback;
+ _callback1 = movGraphCallback;
_field_44 = 0;
insertMessageHandler(MovGraph_messageHandler, getMessageHandlersCount() - 1, 129);
_objtype = kObjTypeMovGraph;
}
+MovGraph::~MovGraph() {
+ warning("STUB: MovGraph::~MovGraph()");
+}
+
bool MovGraph::load(MfcArchive &file) {
debug(5, "MovGraph::load()");
@@ -270,55 +808,485 @@ int MovGraph::removeObject(StaticANIObject *obj) {
}
void MovGraph::freeItems() {
- warning("STUB: MovGraph::freeItems()");
+ for (uint i = 0; i < _items.size(); i++) {
+ _items[i]->free();
+
+ _items[i]->movarr._movSteps.clear();
+ }
+
+ _items.clear();
}
-int MovGraph::method28() {
- warning("STUB: MovGraph::method28()");
+Common::Array<MovItem *> *MovGraph::method28(StaticANIObject *ani, int x, int y, int flag1, int *rescount) {
+ *rescount = 0;
+
+ if (_items.size() <= 0)
+ return 0;
+
+ uint idx = 0;
+
+ while (_items[idx]->ani != ani) {
+ idx++;
+
+ if (idx >= _items.size())
+ return 0;
+ }
+ _items[idx]->free();
+
+ calcNodeDistancesAndAngles();
+
+ _items[idx]->movarr._movSteps.clear();
+
+ Common::Point point;
+
+ point.x = ani->_ox;
+ point.y = ani->_oy;
+
+ if (!calcChunk(idx, ani->_ox, ani->_oy, &_items[idx]->movarr, 0))
+ findClosestLink(idx, &point, &_items[idx]->movarr);
+
+ _items[idx]->count = 0;
+
+ delete _items[idx]->movitems;
+ _items[idx]->movitems = 0;
+
+ int arrSize;
+ Common::Array<MovArr *> *movarr = genMovArr(x, y, &arrSize, flag1, 0);
+
+ if (movarr) {
+ for (int i = 0; i < arrSize; i++) {
+ int sz;
+ Common::Array<MovItem *> *movitems = calcMovItems(&_items[idx]->movarr, (*movarr)[i], &sz);
+
+ if (sz > 0) {
+ for (int j = 0; j < sz; j++)
+ _items[idx]->movitems->push_back(movitems[j]);
+
+ delete movitems;
+ }
+ }
+
+ delete movarr;
+ }
+
+ if (_items[idx]->count) {
+ *rescount = _items[idx]->count;
+
+ return _items[idx]->movitems;
+ }
return 0;
}
-int MovGraph::method2C() {
- warning("STUB: MovGraph::method2C()");
+bool MovGraph::method2C(StaticANIObject *obj, int x, int y) {
+ obj->setOXY(x, y);
+ return method3C(obj, 1);
+}
- return 0;
+MessageQueue *MovGraph::method34(StaticANIObject *ani, int xpos, int ypos, int fuzzyMatch, int staticsId) {
+ if (!ani) {
+ if (!_items.size())
+ return 0;
+
+ ani = _items[0]->ani;
+ }
+
+ if (ABS(ani->_ox - xpos) < 50 && ABS(ani->_oy - ypos) < 50)
+ return 0;
+
+ if (!ani->isIdle())
+ return 0;
+
+ if (ani->_flags & 0x100)
+ return 0;
+
+ int count;
+ Common::Array<MovItem *> *movitems = method28(ani, xpos, ypos, fuzzyMatch, &count);
+
+ if (!movitems)
+ return 0;
+
+ if (ani->_movement) {
+ Common::Point point;
+
+ ani->calcStepLen(&point);
+
+ MessageQueue *mq = sub1(ani, ani->_ox - point.x, ani->_oy - point.y, ani->_movement->_staticsObj1->_staticsId, xpos, ypos, 0, fuzzyMatch);
+
+ if (!mq || !mq->getExCommandByIndex(0))
+ return 0;
+
+ ExCommand *ex = mq->getExCommandByIndex(0);
+
+ if ((ex->_messageKind != 1 && ex->_messageKind != 20) || ex->_messageNum != ani->_movement->_id ||
+ (ex->_field_14 >= 1 && ex->_field_14 <= ani->_movement->_currDynamicPhaseIndex)) {
+ mq = new MessageQueue(g_fp->_globalMessageQueueList->compact());
+
+ ex = new ExCommand(ani->_id, 21, 0, 0, 0, 0, 1, 0, 0, 0);
+ ex->_keyCode = ani->_okeyCode;
+ ex->_field_3C = 1;
+ ex->_field_24 = 0;
+ mq->addExCommandToEnd(ex);
+
+ ex = new ExCommand(ani->_id, 51, 0, xpos, ypos, 0, 1, 0, 0, 0);
+ ex->_keyCode = ani->_okeyCode;
+ ex->_field_3C = 1;
+ ex->_field_24 = 0;
+ ex->_field_20 = fuzzyMatch;
+ mq->addExCommandToEnd(ex);
+
+ if (mq->chain(0))
+ return mq;
+
+ delete mq;
+
+ return 0;
+ }
+
+ int count2;
+
+ ani->setSomeDynamicPhaseIndex(ex->_field_14);
+ method28(ani, xpos, ypos, fuzzyMatch, &count2);
+
+ int idx = getItemIndexByStaticAni(ani);
+ count = _items[idx]->count;
+ movitems = _items[idx]->movitems;
+ }
+
+ return method50(ani, _callback1(ani, movitems, count), staticsId);
+}
+
+void MovGraph::changeCallback(MovArr *(*callback1)(StaticANIObject *ani, Common::Array<MovItem *> *items, signed int counter)) {
+ _callback1 = callback1;
}
-MessageQueue *MovGraph::method34(StaticANIObject *subj, int xpos, int ypos, int fuzzyMatch, int staticsId) {
- warning("STUB: MovGraph::method34()");
+bool MovGraph::method3C(StaticANIObject *ani, int flag) {
+ int idx = getItemIndexByStaticAni(ani);
- return 0;
+ if (idx == -1)
+ return false;
+
+ Common::Point point;
+ MovArr movarr;
+
+ point.x = ani->_ox;
+ point.y = ani->_oy;
+
+ findClosestLink(idx, &point, &movarr);
+ ani->setOXY(point.x, point.y);
+
+ if (flag) {
+ Statics *st;
+
+ if (ani->_statics) {
+ int t = _mgm.refreshOffsets(ani->_id, ani->_statics->_staticsId, movarr._link->_dwordArray2[_field_44]);
+ if (t > _mgm.refreshOffsets(ani->_id, ani->_statics->_staticsId, movarr._link->_dwordArray2[_field_44 + 1]))
+ st = ani->getStaticsById(movarr._link->_dwordArray2[_field_44 + 1]);
+ else
+ st = ani->getStaticsById(movarr._link->_dwordArray2[_field_44]);
+ } else {
+ ani->stopAnim_maybe();
+ st = ani->getStaticsById(movarr._link->_dwordArray2[_field_44]);
+ }
+
+ ani->_statics = st;
+ }
+
+ return true;
}
-int MovGraph::changeCallback() {
- warning("STUB: MovGraph::changeCallback()");
+bool MovGraph::method44(StaticANIObject *ani, int x, int y) {
+ int idx = getItemIndexByStaticAni(ani);
+ MovArr m;
- return 0;
+ if (idx != -1) {
+ if (x != -1 || y != -1) {
+ int counter;
+
+ Common::Array<MovItem *> *movitem = method28(ani, x, y, 0, &counter);
+
+ if (movitem) {
+ MovArr *movarr = _callback1(ani, movitem, counter);
+ int cnt = movarr->_movStepCount;
+
+ if (cnt > 0) {
+ if (movarr->_movSteps[cnt - 1]->link->_flags & 0x4000000)
+ return true;
+ }
+ }
+ } else if (calcChunk(idx, ani->_ox, ani->_oy, &m, 0) && m._link && (m._link->_flags & 0x4000000)) {
+ return true;
+ }
+ }
+
+ return false;
}
-int MovGraph::method3C() {
- warning("STUB: MovGraph::method3C()");
+MessageQueue *MovGraph::doWalkTo(StaticANIObject *subj, int xpos, int ypos, int fuzzyMatch, int staticsId) {
+ PicAniInfo picAniInfo;
+ int ss;
+
+ Common::Array<MovItem *> *movitem = method28(subj, xpos, ypos, fuzzyMatch, &ss);
+
+ subj->getPicAniInfo(&picAniInfo);
+
+ if (movitem) {
+ MovArr *goal = _callback1(subj, movitem, ss);
+ int idx = getItemIndexByStaticAni(subj);
+
+ for (int i = 0; i < _items[idx]->count; i++) {
+ if ((*_items[idx]->movitems)[i]->movarr == goal) {
+ if (subj->_movement) {
+ Common::Point point;
+
+ subj->calcStepLen(&point);
+
+ MessageQueue *mq = sub1(subj, subj->_ox - point.x, subj->_oy - point.y, subj->_movement->_staticsObj1->_staticsId, xpos, ypos, 0, fuzzyMatch);
+
+ if (!mq || !mq->getExCommandByIndex(0))
+ return 0;
+
+ ExCommand *ex = mq->getExCommandByIndex(0);
+
+ if ((ex->_messageKind != 1 && ex->_messageKind != 20) ||
+ ex->_messageNum != subj->_movement->_id ||
+ (ex->_field_14 >= 1 && ex->_field_14 <= subj->_movement->_currDynamicPhaseIndex))
+ subj->playIdle();
+ }
+ }
+ }
+ }
+
+ movitem = method28(subj, xpos, ypos, fuzzyMatch, &ss);
+ if (movitem) {
+ MovArr *goal = _callback1(subj, movitem, ss);
+ int idx = getItemIndexByStaticAni(subj);
+
+ if (_items[idx]->count > 0) {
+ int arridx = 0;
+
+ while ((*_items[idx]->movitems)[arridx]->movarr != goal) {
+ arridx++;
+
+ if (arridx >= _items[idx]->count) {
+ subj->setPicAniInfo(&picAniInfo);
+ return 0;
+ }
+ }
+
+ _items[idx]->movarr._movSteps.clear();
+ _items[idx]->movarr = *(*_items[idx]->movitems)[arridx]->movarr;
+ _items[idx]->movarr._movSteps = (*_items[idx]->movitems)[arridx]->movarr->_movSteps;
+ _items[idx]->movarr._afield_8 = -1;
+ _items[idx]->movarr._link = 0;
+
+ MessageQueue *mq = fillMGMinfo(_items[idx]->ani, &_items[idx]->movarr, staticsId);
+ if (mq) {
+ ExCommand *ex = new ExCommand();
+ ex->_messageKind = 17;
+ ex->_messageNum = 54;
+ ex->_parentId = subj->_id;
+ ex->_field_3C = 1;
+ mq->addExCommandToEnd(ex);
+ }
+ subj->setPicAniInfo(&picAniInfo);
+
+ return mq;
+ }
+ }
+
+ subj->setPicAniInfo(&picAniInfo);
return 0;
}
-int MovGraph::method44() {
- warning("STUB: MovGraph::method44()");
+MessageQueue *MovGraph::sub1(StaticANIObject *ani, int x, int y, int stid, int x1, int y1, int stid2, int flag1) {
+ PicAniInfo picinfo;
- return 0;
+ ani->getPicAniInfo(&picinfo);
+
+ ani->_statics = ani->getStaticsById(stid);
+ ani->_movement = 0;
+ ani->setOXY(x, y);
+
+ int rescount;
+
+ Common::Array<MovItem *> *movitems = method28(ani, x1, y1, flag1, &rescount);
+
+ if (!movitems) {
+ ani->setPicAniInfo(&picinfo);
+
+ return 0;
+ }
+
+ MessageQueue *res = 0;
+
+ MovArr *goal = _callback1(ani, movitems, rescount);
+ int idx = getItemIndexByStaticAni(ani);
+
+ MovGraphItem *movgitem = _items[idx];
+ int cnt = movgitem->count;
+
+ for (int nidx = 0; nidx < cnt; nidx++) {
+ if ((*movgitem->movitems)[nidx]->movarr == goal) {
+ movgitem->movarr._movSteps.clear();
+ _items[idx]->movarr = *(*movgitem->movitems)[nidx]->movarr;
+ _items[idx]->movarr._movSteps = (*movgitem->movitems)[nidx]->movarr->_movSteps;
+ _items[idx]->movarr._afield_8 = -1;
+ _items[idx]->movarr._link = 0;
+
+ res = fillMGMinfo(_items[idx]->ani, &_items[idx]->movarr, stid2);
+
+ break;
+ }
+ }
+
+ ani->setPicAniInfo(&picinfo);
+
+ return res;
}
-MessageQueue *MovGraph::doWalkTo(StaticANIObject *subj, int xpos, int ypos, int fuzzyMatch, int staticsId) {
- warning("STUB: MovGraph::doWalkTo()");
+MessageQueue *MovGraph::fillMGMinfo(StaticANIObject *ani, MovArr *movarr, int staticsId) {
+ if (!movarr->_movStepCount)
+ return 0;
- return 0;
+ MessageQueue *mq = 0;
+ int ox = ani->_ox;
+ int oy = ani->_oy;
+ int id1 = 0;
+ int id2;
+
+ for (int i = 0; i < movarr->_movStepCount; i++) {
+ while (i < movarr->_movStepCount - 1) {
+ if (movarr->_movSteps[i ]->link->_dwordArray1[movarr->_movSteps[i - 1]->sfield_0 + _field_44] !=
+ movarr->_movSteps[i + 1]->link->_dwordArray1[movarr->_movSteps[i ]->sfield_0 + _field_44])
+ break;
+ i++;
+ }
+
+ MovStep *st = movarr->_movSteps[i];
+
+ ani->getMovementById(st->link->_dwordArray1[_field_44 + st->sfield_0]);
+
+ if (i == movarr->_movStepCount - 1 && staticsId) {
+ id2 = staticsId;
+ } else {
+ if (i < movarr->_movStepCount - 1)
+ id2 = ani->getMovementById(movarr->_movSteps[i + 1]->link->_dwordArray1[_field_44 + st->sfield_0])->_staticsObj1->_staticsId;
+ else
+ id2 = st->link->_dwordArray2[_field_44 + st->sfield_0];
+ }
+
+ int nx, ny, nd;
+
+ if (i == movarr->_movStepCount - 1) {
+ nx = movarr->_point.x;
+ ny = movarr->_point.y;
+ nd = st->link->_movGraphNode1->_distance;
+ } else {
+ if (st->sfield_0) {
+ nx = st->link->_movGraphNode1->_x;
+ ny = st->link->_movGraphNode1->_y;
+ nd = st->link->_movGraphNode1->_distance;
+ } else {
+ nx = st->link->_movGraphNode2->_x;
+ ny = st->link->_movGraphNode2->_y;
+ nd = st->link->_movGraphNode2->_distance;
+ }
+ }
+
+ MGMInfo mgminfo;
+
+ memset(&mgminfo, 0, sizeof(mgminfo));
+ mgminfo.ani = ani;
+ mgminfo.staticsId2 = id2;
+ mgminfo.staticsId1 = id1;
+ mgminfo.x1 = nx;
+ mgminfo.x2 = ox;
+ mgminfo.y2 = oy;
+ mgminfo.y1 = ny;
+ mgminfo.field_1C = nd;
+ mgminfo.movementId = st->link->_dwordArray1[_field_44 + st->sfield_0];
+
+ mgminfo.flags = 0xe;
+ if (mq)
+ mgminfo.flags |= 0x31;
+
+ MessageQueue *newmq = _mgm.genMovement(&mgminfo);
+
+ if (mq) {
+ if (newmq) {
+ mq->transferExCommands(newmq);
+
+ delete newmq;
+ }
+ } else {
+ mq = newmq;
+ }
+
+ ox = nx;
+ oy = ny;
+ id1 = id2;
+ }
+
+ return mq;
}
-int MovGraph::method50() {
- warning("STUB: MovGraph::method50()");
+MessageQueue *MovGraph::method50(StaticANIObject *ani, MovArr *movarr, int staticsId) {
+ if (_items.size() == 0)
+ return 0;
- return 0;
+ uint idx;
+ int movidx;
+ bool done = false;
+
+ for (idx = 0; idx <= _items.size() && !done; idx++) {
+ if (idx == _items.size())
+ return 0;
+
+ if (_items[idx]->ani == ani) {
+ if (!_items[idx]->movitems)
+ return 0;
+
+ if (_items[idx]->count < 1)
+ return 0;
+
+ for (movidx = 0; movidx < _items[idx]->count; movidx++) {
+ if ((*_items[idx]->movitems)[movidx]->movarr == movarr) {
+ done = true;
+
+ break;
+ }
+ }
+ }
+ }
+
+ _items[idx]->movarr._movSteps.clear();
+ _items[idx]->movarr = *(*_items[idx]->movitems)[movidx]->movarr;
+ _items[idx]->movarr._movSteps = (*_items[idx]->movitems)[movidx]->movarr->_movSteps;
+ _items[idx]->movarr._afield_8 = -1;
+ _items[idx]->movarr._link = 0;
+
+ MessageQueue *mq = fillMGMinfo(_items[idx]->ani, &_items[idx]->movarr, 0);
+
+ if (!mq)
+ return 0;
+
+ ExCommand *ex = new ExCommand();
+
+ ex->_messageKind = 17;
+ ex->_messageNum = 54;
+ ex->_parentId = ani->_id;
+ ex->_field_3C = 1;
+ mq->addExCommandToEnd(ex);
+
+ if (!mq->chain(ani)) {
+ delete mq;
+
+ return 0;
+ }
+
+ return mq;
}
double MovGraph::calcDistance(Common::Point *point, MovGraphLink *link, int fuzzyMatch) {
@@ -350,16 +1318,296 @@ double MovGraph::calcDistance(Common::Point *point, MovGraphLink *link, int fuzz
return -1.0;
}
} else {
- point->x = n1x + (dist2x * distm / link->_distance);
- point->y = n1y + (dist2y * distm / link->_distance);
+ point->x = (int)(n1x + (dist2x * distm / link->_distance));
+ point->y = (int)(n1y + (dist2y * distm / link->_distance));
}
return res;
}
-int MovGraph2::getItemIndexByGameObjectId(int objectId) {
+void MovGraph::calcNodeDistancesAndAngles() {
+ for (ObList::iterator i = _links.begin(); i != _links.end(); ++i) {
+ assert(((CObject *)*i)->_objtype == kObjTypeMovGraphLink);
+
+ MovGraphLink *lnk = (MovGraphLink *)*i;
+
+ lnk->_flags &= 0x7FFFFFFF;
+
+ lnk->calcNodeDistanceAndAngle();
+ }
+}
+
+bool MovGraph::findClosestLink(int unusedArg, Common::Point *p, MovArr *movarr) {
+ MovGraphLink *link = 0;
+ double mindist = 1.0e20;
+ int resx = 0, resy = 0;
+
+ for (ObList::iterator i = _links.begin(); i != _links.end(); ++i) {
+ MovGraphLink *lnk = (MovGraphLink *)*i;
+
+ if ((lnk->_flags & 0x10000000) && !(lnk->_flags & 0x20000000) ) {
+ double dx1 = lnk->_movGraphNode1->_x - p->x;
+ double dy1 = lnk->_movGraphNode1->_y - p->y;
+ double dx2 = lnk->_movGraphNode2->_x - p->x;
+ double dy2 = lnk->_movGraphNode2->_y - p->y;
+ double dx3 = lnk->_movGraphNode2->_x - lnk->_movGraphNode1->_x;
+ double dy3 = lnk->_movGraphNode2->_y - lnk->_movGraphNode1->_y;
+ double sq1 = sqrt(dy1 * dy1 + dx1 * dx1);
+ double sdist = (dy3 * dy1 + dx3 * dx1) / lnk->_distance / sq1;
+ double ldist = sdist * sq1;
+ double dist = sqrt(1.0 - sdist * sdist) * sq1;
+
+ if (ldist < 0.0) {
+ ldist = 0.0;
+ dist = sqrt(dx1 * dx1 + dy1 * dy1);
+ }
+
+ if (ldist > lnk->_distance) {
+ ldist = lnk->_distance;
+ dist = sqrt(dx2 * dx2 + dy2 * dy2);
+ }
+
+ if (ldist >= 0.0 && ldist <= lnk->_distance && dist < mindist) {
+ resx = lnk->_movGraphNode1->_x + (int)(dx3 * ldist / lnk->_distance);
+ resy = lnk->_movGraphNode1->_y + (int)(dy3 * ldist / lnk->_distance);
+
+ mindist = dist;
+ link = lnk;
+ }
+ }
+ }
+
+ if (mindist < 1.0e20) {
+ if (movarr)
+ movarr->_link = link;
+
+ if (p) {
+ p->x = resx;
+ p->y = resy;
+ }
+
+ return true;
+ }
+
+ return false;
+}
+
+int MovGraph::getItemIndexByStaticAni(StaticANIObject *ani) {
for (uint i = 0; i < _items.size(); i++)
- if (_items[i]->_objectId == objectId)
+ if (_items[i]->ani == ani)
+ return i;
+
+ return -1;
+}
+
+Common::Array<MovArr *> *MovGraph::genMovArr(int x, int y, int *arrSize, int flag1, int flag2) {
+ if (!_links.size()) {
+ *arrSize = 0;
+
+ return 0;
+ }
+
+ Common::Array<MovArr *> *arr = new Common::Array<MovArr *>;
+ MovArr *movarr;
+
+ for (ObList::iterator i = _links.begin(); i != _links.end(); ++i) {
+ MovGraphLink *lnk = (MovGraphLink *)*i;
+
+ if (flag1) {
+ Common::Point point(x, y);
+ double dist = calcDistance(&point, lnk, 0);
+
+ if (dist >= 0.0 && dist < 2.0) {
+ movarr = new MovArr;
+
+ movarr->_link = lnk;
+ movarr->_dist = ((double)(lnk->_movGraphNode1->_y - lnk->_movGraphNode2->_y) * (double)(lnk->_movGraphNode1->_y - point.y) +
+ (double)(lnk->_movGraphNode2->_x - lnk->_movGraphNode1->_x) * (double)(point.x - lnk->_movGraphNode1->_x)) /
+ lnk->_distance / lnk->_distance;
+ movarr->_point = point;
+
+ arr->push_back(movarr);
+ }
+ } else {
+ if (lnk->_movGraphReact) {
+ if (lnk->_movGraphReact->pointInRegion(x, y)) {
+ if (!(lnk->_flags & 0x10000000) || lnk->_flags & 0x20000000) {
+ if (!flag2) {
+ movarr = new MovArr;
+ movarr->_link = lnk;
+ movarr->_dist = 0.0;
+ movarr->_point.x = lnk->_movGraphNode1->_x;
+ movarr->_point.y = lnk->_movGraphNode1->_y;
+ arr->push_back(movarr);
+
+ movarr = new MovArr;
+ movarr->_link = lnk;
+ movarr->_dist = 1.0;
+ movarr->_point.x = lnk->_movGraphNode1->_x;
+ movarr->_point.y = lnk->_movGraphNode1->_y;
+ arr->push_back(movarr);
+ }
+ } else {
+ movarr = new MovArr;
+ movarr->_link = lnk;
+ movarr->_dist = ((double)(lnk->_movGraphNode1->_y - lnk->_movGraphNode2->_y) * (double)(lnk->_movGraphNode1->_y - y) +
+ (double)(lnk->_movGraphNode2->_x - lnk->_movGraphNode1->_x) * (double)(x - lnk->_movGraphNode1->_x)) /
+ lnk->_distance / lnk->_distance;
+ movarr->_point.x = x;
+ movarr->_point.y = y;
+
+ calcDistance(&movarr->_point, lnk, 0);
+
+ arr->push_back(movarr);
+ }
+ }
+ }
+ }
+ }
+
+ *arrSize = arr->size();
+
+ return arr;
+}
+
+void MovGraph::shuffleTree(MovGraphLink *lnk, MovGraphLink *lnk2, Common::Array<MovGraphLink *> &tempObList1, Common::Array<MovGraphLink *> &tempObList2) {
+ if (lnk == lnk2) {
+ for (uint i = 0; i < tempObList1.size(); i++)
+ tempObList2.push_back(tempObList1[i]);
+
+ tempObList2.push_back(lnk);
+ } else {
+ lnk->_flags |= 0x80000000;
+
+ tempObList1.push_back(lnk);
+
+ for (ObList::iterator i = _links.begin(); i != _links.end(); ++i) {
+ MovGraphLink *l = (MovGraphLink *)*i;
+
+ if (l->_movGraphNode1 != lnk->_movGraphNode1) {
+ if (l->_movGraphNode2 != lnk->_movGraphNode1) {
+ if (l->_movGraphNode1 != lnk->_movGraphNode2 && l->_movGraphNode2 != lnk->_movGraphNode2)
+ continue;
+ }
+ }
+
+ if (!(l->_flags & 0xA0000000))
+ shuffleTree(l, lnk2, tempObList1, tempObList2);
+ }
+
+ lnk->_flags &= 0x7FFFFFFF;
+ }
+}
+
+Common::Array<MovItem *> *MovGraph::calcMovItems(MovArr *movarr1, MovArr *movarr2, int *listCount) {
+ Common::Array<MovGraphLink *> tempObList1;
+ Common::Array<MovGraphLink *> tempObList2;
+
+ shuffleTree(movarr1->_link, movarr2->_link, tempObList1, tempObList2);
+
+ *listCount = 0;
+
+ if (!tempObList2.size())
+ return 0;
+
+ *listCount = tempObList2.size();
+
+ Common::Array<MovItem *> *res = new Common::Array<MovItem *>;
+
+ for (int i = 0; i < *listCount; i++) {
+ MovItem *r = new MovItem;
+
+ genMovItem(r, tempObList2[i], movarr1, movarr2);
+
+ res->push_back(r);
+
+ delete tempObList2[i];
+ }
+
+ movarr2->_link = movarr1->_link;
+
+ return res;
+}
+
+void MovGraph::genMovItem(MovItem *movitem, MovGraphLink *grlink, MovArr *movarr1, MovArr *movarr2) {
+ warning("STUB: MovGraph::genMovItem()");
+}
+
+bool MovGraph::calcChunk(int idx, int x, int y, MovArr *arr, int a6) {
+ int staticsId;
+
+ if (_items[idx]->ani->_statics) {
+ staticsId = _items[idx]->ani->_statics->_staticsId;
+ } else {
+ if (!_items[idx]->ani->_movement->_staticsObj2)
+ return 0;
+
+ staticsId = _items[idx]->ani->_movement->_staticsObj2->_staticsId;
+ }
+
+ int arrSize;
+
+ Common::Array<MovArr *> *movarr = genMovArr(x, y, &arrSize, 0, 1);
+
+ if (!movarr)
+ return findClosestLink(idx, 0, arr);
+
+ bool res = false;
+
+ int idxmin = -1;
+ int offmin = 100;
+
+ for (int i = 0; i < arrSize; i++) {
+ int off = _mgm.refreshOffsets(_items[idx]->ani->_id, staticsId, (*movarr)[i]->_link->_dwordArray2[_field_44]);
+
+ if (off < offmin) {
+ offmin = off;
+ idxmin = i;
+ }
+
+ off = _mgm.refreshOffsets(_items[idx]->ani->_id, staticsId, (*movarr)[i]->_link->_dwordArray2[_field_44 + 1]);
+ if (off < offmin) {
+ offmin = off;
+ idxmin = i;
+ }
+ }
+
+ if (idxmin != -1) {
+ *arr = *(*movarr)[idxmin];
+
+ res = true;
+ }
+
+ delete movarr;
+
+ return res;
+}
+
+void MovGraph::setEnds(MovStep *step1, MovStep *step2) {
+ if (step1->link->_movGraphNode1 == step2->link->_movGraphNode2) {
+ step1->sfield_0 = 1;
+ step2->sfield_0 = 1;
+
+ return;
+ }
+
+ if (step1->link->_movGraphNode1 == step2->link->_movGraphNode1) {
+ step1->sfield_0 = 1;
+ step2->sfield_0 = 0;
+ } else {
+ step1->sfield_0 = 0;
+
+ if (step1->link->_movGraphNode2 != step2->link->_movGraphNode1) {
+ step2->sfield_0 = 1;
+ } else {
+ step2->sfield_0 = 0;
+ }
+ }
+}
+
+int MovGraph2::getItemIndexByGameObjectId(int objectId) {
+ for (uint i = 0; i < _items2.size(); i++)
+ if (_items2[i]->_objectId == objectId)
return i;
return -1;
@@ -367,7 +1615,7 @@ int MovGraph2::getItemIndexByGameObjectId(int objectId) {
int MovGraph2::getItemSubIndexByStaticsId(int idx, int staticsId) {
for (int i = 0; i < 4; i++)
- if (_items[idx]->_subItems[i]._staticsId1 == staticsId || _items[idx]->_subItems[i]._staticsId2 == staticsId)
+ if (_items2[idx]->_subItems[i]._staticsId1 == staticsId || _items2[idx]->_subItems[i]._staticsId2 == staticsId)
return i;
return -1;
@@ -375,15 +1623,29 @@ int MovGraph2::getItemSubIndexByStaticsId(int idx, int staticsId) {
int MovGraph2::getItemSubIndexByMovementId(int idx, int movId) {
for (int i = 0; i < 4; i++)
- if (_items[idx]->_subItems[i]._walk[0]._movementId == movId || _items[idx]->_subItems[i]._turn[0]._movementId == movId ||
- _items[idx]->_subItems[i]._turnS[0]._movementId == movId)
+ if (_items2[idx]->_subItems[i]._walk[0]._movementId == movId || _items2[idx]->_subItems[i]._turn[0]._movementId == movId ||
+ _items2[idx]->_subItems[i]._turnS[0]._movementId == movId)
return i;
return -1;
}
-int MovGraph2::getItemSubIndexByMGM(int idx, StaticANIObject *ani) {
- warning("STUB: MovGraph2::getItemSubIndexByMGM()");
+int MovGraph2::getItemSubIndexByMGM(int index, StaticANIObject *ani) {
+ if (findNode(ani->_ox, ani->_oy, 0) || findLink1(ani->_ox, ani->_oy, -1, 0) || findLink2(ani->_ox, ani->_oy)) {
+ int minidx = -1;
+ int min = 0;
+
+ for (int i = 0; i < 4; i++) {
+ int tmp = _mgm.refreshOffsets(ani->_id, ani->_statics->_staticsId, _items2[index]->_subItems[i]._staticsId1);
+
+ if (tmp >= 0 && (minidx == -1 || tmp < min)) {
+ minidx = i;
+ min = tmp;
+ }
+ }
+
+ return minidx;
+ }
return -1;
}
@@ -392,7 +1654,7 @@ bool MovGraph2::initDirections(StaticANIObject *obj, MovGraph2Item *item) {
item->_obj = obj;
item->_objectId = obj->_id;
- GameVar *var = g_fullpipe->getGameLoaderGameVar()->getSubVarByName(obj->_objectName);
+ GameVar *var = g_fp->getGameLoaderGameVar()->getSubVarByName(obj->_objectName);
if (!var)
return false;
@@ -444,7 +1706,7 @@ bool MovGraph2::initDirections(StaticANIObject *obj, MovGraph2Item *item) {
item->_subItems[dir]._walk[act]._mov = mov;
if (mov) {
- mov->calcSomeXY(point, 0);
+ mov->calcSomeXY(point, 0, -1);
item->_subItems[dir]._walk[act]._mx = point.x;
item->_subItems[dir]._walk[act]._my = point.y;
}
@@ -474,7 +1736,7 @@ bool MovGraph2::initDirections(StaticANIObject *obj, MovGraph2Item *item) {
item->_subItems[dir]._turn[act]._mov = mov;
if (mov) {
- mov->calcSomeXY(point, 0);
+ mov->calcSomeXY(point, 0, -1);
item->_subItems[dir]._turn[act]._mx = point.x;
item->_subItems[dir]._turn[act]._my = point.y;
}
@@ -504,7 +1766,7 @@ bool MovGraph2::initDirections(StaticANIObject *obj, MovGraph2Item *item) {
item->_subItems[dir]._turnS[act]._mov = mov;
if (mov) {
- mov->calcSomeXY(point, 0);
+ mov->calcSomeXY(point, 0, -1);
item->_subItems[dir]._turnS[act]._mx = point.x;
item->_subItems[dir]._turnS[act]._my = point.y;
}
@@ -523,12 +1785,12 @@ void MovGraph2::addObject(StaticANIObject *obj) {
int id = getItemIndexByGameObjectId(obj->_id);
if (id >= 0) {
- _items[id]->_obj = obj;
+ _items2[id]->_obj = obj;
} else {
MovGraph2Item *item = new MovGraph2Item;
if (initDirections(obj, item)) {
- _items.push_back(item);
+ _items2.push_back(item);
} else {
delete item;
}
@@ -536,13 +1798,239 @@ void MovGraph2::addObject(StaticANIObject *obj) {
}
void MovGraph2::buildMovInfo1SubItems(MovInfo1 *movinfo, Common::Array<MovGraphLink *> *linkList, LinkInfo *lnkSrc, LinkInfo *lnkDst) {
- warning("STUB: MovGraph2::buildMovInfo1SubItems()");
+ MovInfo1Sub *elem;
+ Common::Point point;
+ Common::Rect rect;
+
+ int subIndex = movinfo->subIndex;
+
+ movinfo->items.clear();
+
+ elem = new MovInfo1Sub;
+ elem->subIndex = subIndex;
+ elem->x = movinfo->pt1.x;
+ elem->y = movinfo->pt1.y;
+ elem->distance = -1;
+
+ movinfo->items.push_back(elem);
+
+ int prevSubIndex = movinfo->subIndex;
+
+ for (uint i = 0; i < linkList->size(); i++) {
+ int idx1;
+
+ if (linkList->size() <= 1) {
+ if (linkList->size() == 1)
+ idx1 = getShortSide((*linkList)[0], movinfo->pt2.x - movinfo->pt1.x, movinfo->pt2.y - movinfo->pt1.y);
+ else
+ idx1 = getShortSide(0, movinfo->pt2.x - movinfo->pt1.x, movinfo->pt2.y - movinfo->pt1.y);
+
+ point.y = -1;
+ rect.bottom = -1;
+ rect.right = -1;
+ rect.top = -1;
+ rect.left = -1;
+ } else {
+ idx1 = findLink(linkList, i, &rect, &point);
+ }
+
+ if (idx1 != prevSubIndex) {
+ prevSubIndex = idx1;
+ subIndex = idx1;
+
+ elem = new MovInfo1Sub;
+ elem->subIndex = subIndex;
+ elem->x = rect.left;
+ elem->y = rect.top;
+ elem->distance = -1;
+
+ movinfo->items.push_back(elem);
+ }
+
+ if (i != linkList->size() - 1) {
+ while (1) {
+ i++;
+ if (findLink(linkList, i, &rect, 0) != prevSubIndex) {
+ i--;
+ findLink(linkList, i, &rect, &point);
+
+ break;
+ }
+
+ if (i == linkList->size() - 1)
+ break;
+ }
+ }
+
+ if (movinfo->items.back()->subIndex != 10) {
+ subIndex = prevSubIndex;
+
+ elem = new MovInfo1Sub;
+ elem->subIndex = 10;
+ elem->x = -1;
+ elem->y = -1;
+ elem->distance = -1;
+
+ movinfo->items.push_back(elem);
+
+ if (i == linkList->size()) {
+ elem = new MovInfo1Sub;
+ elem->subIndex = prevSubIndex;
+ elem->x = movinfo->pt2.x;
+ elem->y = movinfo->pt2.y;
+ elem->distance = movinfo->distance2;
+
+ movinfo->items.push_back(elem);
+ } else {
+ elem = new MovInfo1Sub;
+ elem->subIndex = prevSubIndex;
+ elem->x = rect.right;
+ elem->y = rect.bottom;
+ elem->distance = point.y;
+
+ movinfo->items.push_back(elem);
+ }
+ }
+ }
+
+ if (subIndex != movinfo->item1Index) {
+ elem = new MovInfo1Sub;
+ elem->subIndex = movinfo->item1Index;
+ elem->x = movinfo->pt2.x;
+ elem->y = movinfo->pt2.y;
+ elem->distance = movinfo->distance2;
+
+ movinfo->items.push_back(elem);
+ }
+
+ movinfo->itemsCount = movinfo->items.size();
}
MessageQueue *MovGraph2::buildMovInfo1MessageQueue(MovInfo1 *movInfo) {
- warning("STUB: MovGraph2::buildMovInfo1MessageQueue()");
+ MovInfo1 movinfo(movInfo);
- return 0;
+ int curX = movInfo->pt1.x;
+ int curY = movInfo->pt1.y;
+ int curDistance = movInfo->distance1;
+
+ MessageQueue *mq = new MessageQueue(g_fp->_globalMessageQueueList->compact());
+
+ for (int i = 0; i < movInfo->itemsCount - 1; i++) {
+ if (movInfo->items[i + 1]->subIndex != 10) {
+ MG2I *mg2i;
+
+ if (i >= movInfo->itemsCount - 2 || movInfo->items[i + 2]->subIndex != 10) {
+ movinfo.flags = 0;
+ mg2i = &_items2[movInfo->index]->_subItems[movInfo->items[i]->subIndex]._turnS[movInfo->items[i + 1]->subIndex];
+ } else {
+ movinfo.flags = 2;
+ mg2i = &_items2[movInfo->index]->_subItems[movInfo->items[i]->subIndex]._turn[movInfo->items[i + 1]->subIndex];
+ }
+ if (i < movInfo->itemsCount - 2
+ || (movInfo->items[i]->x == movInfo->items[i + 1]->x
+ && movInfo->items[i]->y == movInfo->items[i + 1]->y)
+ || movInfo->items[i]->x == -1
+ || movInfo->items[i]->y == -1
+ || movInfo->items[i + 1]->x == -1
+ || movInfo->items[i + 1]->y == -1) {
+
+ ExCommand *ex = new ExCommand(_items2[movInfo->index]->_objectId, 1, mg2i->_movementId, 0, 0, 0, 1, 0, 0, 0);
+
+ ex->_excFlags |= 2;
+ ex->_keyCode = _items2[movInfo->index]->_obj->_okeyCode;
+ ex->_field_24 = 1;
+ ex->_field_14 = -1;
+ mq->addExCommandToEnd(ex);
+
+ curX += mg2i->_mx;
+ curY += mg2i->_my;
+ } else {
+ MGMInfo mgminfo;
+
+ memset(&mgminfo, 0, sizeof(mgminfo));
+
+ mgminfo.ani = _items2[movInfo->index]->_obj;
+ mgminfo.staticsId2 = mg2i->_mov->_staticsObj2->_staticsId;
+ mgminfo.x1 = movInfo->items[i + 1]->x;
+ mgminfo.y1 = movInfo->items[i + 1]->y;
+ mgminfo.field_1C = movInfo->items[i + 1]->distance;
+ mgminfo.staticsId1 = mg2i->_mov->_staticsObj1->_staticsId;
+
+ mgminfo.x2 = movInfo->items[i]->x;
+ mgminfo.y2 = movInfo->items[i]->y;
+ mgminfo.field_10 = 1;
+ mgminfo.flags = 0x7f;
+ mgminfo.movementId = mg2i->_movementId;
+
+ MessageQueue *mq2 = _mgm.genMovement(&mgminfo);
+ mq->transferExCommands(mq2);
+
+ delete mq2;
+
+ curX = movInfo->items[i + 1]->x;
+ curY = movInfo->items[i + 1]->y;
+ }
+ } else {
+ movinfo.item1Index = movInfo->items[i]->subIndex;
+ movinfo.subIndex = movinfo.item1Index;
+ movinfo.pt1.y = curY;
+ movinfo.pt1.x = curX;
+
+ movinfo.distance1 = curDistance;
+ movinfo.pt2.x = movInfo->items[i + 2]->x;
+ movinfo.pt2.y = movInfo->items[i + 2]->y;
+ movinfo.distance2 = movInfo->items[i + 2]->distance;
+
+ if (i >= movInfo->itemsCount - 4
+ || movInfo->items[i + 2]->subIndex == 10
+ || movInfo->items[i + 3]->subIndex == 10
+ || movInfo->items[i + 2]->subIndex == movInfo->items[i + 3]->subIndex
+ || movInfo->items[i + 4]->subIndex != 10) {
+ if (i >= movInfo->itemsCount - 3
+ || movInfo->items[i + 2]->subIndex == 10
+ || movInfo->items[i + 3]->subIndex == 10
+ || movInfo->items[i + 2]->subIndex == movInfo->items[i + 3]->subIndex) {
+ movinfo.flags &= 3;
+ } else {
+ MG2I *m = &_items2[movInfo->index]->_subItems[movInfo->items[i + 2]->subIndex]._turnS[movInfo->items[i + 3]->subIndex];
+ movinfo.pt2.x -= m->_mx;
+ movinfo.pt2.y -= m->_my;
+ movinfo.flags &= 3;
+ }
+ } else {
+ MG2I *m = &_items2[movInfo->index]->_subItems[movInfo->items[i + 2]->subIndex]._turn[movInfo->items[i + 3]->subIndex];
+
+ if (movinfo.item1Index && movinfo.item1Index != 1) {
+ movinfo.pt2.y -= m->_my;
+ movinfo.flags = (movinfo.flags & 2) | 1;
+ } else {
+ movinfo.pt2.x -= m->_mx;
+ movinfo.flags = (movinfo.flags & 2) | 1;
+ }
+ }
+ i++; // intentional
+
+ MessageQueue *mq2 = genMovement(&movinfo);
+
+ if (!mq2) {
+ delete mq;
+ return 0;
+ }
+
+ mq->transferExCommands(mq2);
+
+ delete mq2;
+
+ curX = movinfo.pt2.x;
+ curY = movinfo.pt2.y;
+ curDistance = movinfo.distance2;
+ }
+ }
+
+ movInfo->pt2.x = movinfo.pt2.x;
+ movInfo->pt2.y = movinfo.pt2.y;
+
+ return mq;
}
int MovGraph2::removeObject(StaticANIObject *obj) {
@@ -552,13 +2040,51 @@ int MovGraph2::removeObject(StaticANIObject *obj) {
}
void MovGraph2::freeItems() {
- warning("STUB: MovGraph2::freeItems()");
+ for (uint i = 0; i < _items2.size(); i++)
+ delete _items2[i];
+
+ _items2.clear();
}
-MessageQueue *MovGraph2::method34(StaticANIObject *subj, int xpos, int ypos, int fuzzyMatch, int staticsId) {
- warning("STUB: MovGraph2::method34()");
+MessageQueue *MovGraph2::method34(StaticANIObject *ani, int xpos, int ypos, int fuzzyMatch, int staticsId) {
+ if (!ani->isIdle())
+ return 0;
- return 0;
+ if (ani->_flags & 0x100)
+ return 0;
+
+ MessageQueue *mq = doWalkTo(ani, xpos, ypos, fuzzyMatch, staticsId);
+
+ if (!mq)
+ return 0;
+
+ if (ani->_movement) {
+ if (mq->getCount() <= 1 || mq->getExCommandByIndex(0)->_messageKind != 22) {
+ PicAniInfo picAniInfo;
+
+ ani->getPicAniInfo(&picAniInfo);
+ ani->updateStepPos();
+ MessageQueue *mq1 = doWalkTo(ani, xpos, ypos, fuzzyMatch, staticsId);
+
+ ani->setPicAniInfo(&picAniInfo);
+
+ if (mq1) {
+ delete mq;
+
+ mq = mq1;
+ }
+ } else {
+ ani->_movement = 0;
+ }
+ }
+
+ if (!mq->chain(ani)) {
+ delete mq;
+
+ return 0;
+ }
+
+ return mq;
}
MessageQueue *MovGraph2::doWalkTo(StaticANIObject *obj, int xpos, int ypos, int fuzzyMatch, int staticsId) {
@@ -568,6 +2094,8 @@ MessageQueue *MovGraph2::doWalkTo(StaticANIObject *obj, int xpos, int ypos, int
PicAniInfo picAniInfo;
Common::Point point;
+ debug(0, "MovGraph2::doWalkTo(%d, %d, %d, %d, %d)", obj->_id, xpos, ypos, fuzzyMatch, staticsId);
+
int idx = getItemIndexByGameObjectId(obj->_id);
if (idx < 0)
@@ -605,11 +2133,11 @@ MessageQueue *MovGraph2::doWalkTo(StaticANIObject *obj, int xpos, int ypos, int
if (subMgm) {
obj->_messageQueueId = 0;
- obj->changeStatics2(_items[idx]->_subItems[idxsub]._staticsId1);
+ obj->changeStatics2(_items2[idx]->_subItems[idxsub]._staticsId1);
newx = obj->_ox;
newy = obj->_oy;
} else {
- obj->_movement->calcSomeXY(point, 0);
+ obj->_movement->calcSomeXY(point, 0, picAniInfo.dynamicPhaseIndex);
newx = obj->_movement->_ox - point.x;
newy = obj->_movement->_oy - point.y;
if (idxsub != 1 && idxsub) {
@@ -626,7 +2154,7 @@ MessageQueue *MovGraph2::doWalkTo(StaticANIObject *obj, int xpos, int ypos, int
}
if (obj->_ox == xpos && obj->_oy == ypos) {
- g_fullpipe->_globalMessageQueueList->compact();
+ g_fp->_globalMessageQueueList->compact();
MessageQueue *mq = new MessageQueue();
@@ -635,29 +2163,31 @@ MessageQueue *MovGraph2::doWalkTo(StaticANIObject *obj, int xpos, int ypos, int
if (idxwalk == -1) {
obj->setPicAniInfo(&picAniInfo);
+ delete mq;
+
return 0;
}
- ExCommand *ex = new ExCommand(picAniInfo.objectId, 1, _items[idx]->_subItems[idxsub]._walk[idxwalk]._movementId, 0, 0, 0, 1, 0, 0, 0);
+ ExCommand *ex = new ExCommand(picAniInfo.objectId, 1, _items2[idx]->_subItems[idxsub]._walk[idxwalk]._movementId, 0, 0, 0, 1, 0, 0, 0);
ex->_field_24 = 1;
ex->_keyCode = picAniInfo.field_8;
ex->_excFlags |= 2;
- mq->_exCommands.push_back(ex);
+ mq->addExCommandToEnd(ex);
} else {
ExCommand *ex = new ExCommand(picAniInfo.objectId, 22, obj->_statics->_staticsId, 0, 0, 0, 1, 0, 0, 0);
ex->_keyCode = picAniInfo.field_8;
ex->_excFlags |= 3;
- mq->_exCommands.push_back(ex);
+ mq->addExCommandToEnd(ex);
ex = new ExCommand(picAniInfo.objectId, 5, -1, obj->_ox, obj->_oy, 0, 1, 0, 0, 0);
ex->_field_14 = -1;
ex->_keyCode = picAniInfo.field_8;
ex->_excFlags |= 3;
- mq->_exCommands.push_back(ex);
+ mq->addExCommandToEnd(ex);
}
obj->setPicAniInfo(&picAniInfo);
@@ -694,11 +2224,15 @@ MessageQueue *MovGraph2::doWalkTo(StaticANIObject *obj, int xpos, int ypos, int
}
Common::Array<MovGraphLink *> tempLinkList;
+ double minPath = findMinPath(&linkInfoSource, &linkInfoDest, &tempLinkList);
- if (findMinPath(&linkInfoSource, &linkInfoDest, &tempLinkList) < 0.0 ||
- ((linkInfoSource.node != linkInfoDest.node || !linkInfoSource.node) && !tempLinkList.size()))
+ debug(0, "MovGraph2::doWalkTo(): path: %g parts: %d", minPath, tempLinkList.size());
+
+ if (minPath < 0.0 || ((linkInfoSource.node != linkInfoDest.node || !linkInfoSource.node) && !tempLinkList.size()))
return 0;
+ movInfo1.clear();
+
movInfo1.subIndex = idxsub;
movInfo1.pt1.x = obj->_ox;
movInfo1.pt1.y = obj->_oy;
@@ -728,7 +2262,7 @@ MessageQueue *MovGraph2::doWalkTo(StaticANIObject *obj, int xpos, int ypos, int
double dst1 = sqrt((double)((ypos - nod->_y) * (ypos - nod->_y) + (xpos - nod->_x) * (xpos - nod->_x)));
int dst = linkInfoDest.link->_movGraphNode2->_distance - nod->_distance;
- movInfo1.distance2 = nod->_distance + (dst1 * (double)dst / linkInfoDest.link->_distance);
+ movInfo1.distance2 = (int)(nod->_distance + (dst1 * (double)dst / linkInfoDest.link->_distance));
calcDistance(&movInfo1.pt2, linkInfoDest.link, 1);
@@ -746,12 +2280,12 @@ MessageQueue *MovGraph2::doWalkTo(StaticANIObject *obj, int xpos, int ypos, int
else
movInfo1.item1Index = getShortSide(0, dx2 - dx1, dy2 - dy1);
} else {
- movInfo1.item1Index = findLink(&tempLinkList, tempLinkList.back(), 0, 0);
+ movInfo1.item1Index = findLink(&tempLinkList, tempLinkList.size() - 1, 0, 0);
}
movInfo1.flags = fuzzyMatch != 0;
- if (_items[idx]->_subItems[idxsub]._staticsId1 != obj->_statics->_staticsId)
+ if (_items2[idx]->_subItems[idxsub]._staticsId1 != obj->_statics->_staticsId)
movInfo1.flags |= 2;
buildMovInfo1SubItems(&movInfo1, &tempLinkList, &linkInfoSource, &linkInfoDest);
@@ -778,7 +2312,7 @@ MessageQueue *MovGraph2::doWalkTo(StaticANIObject *obj, int xpos, int ypos, int
ex->_excFlags |= 2;
mq->addExCommand(ex);
- ex = new ExCommand(picAniInfo.objectId, 22, _items[idx]->_subItems[idxsub]._staticsId1, 0, 0, 0, 1, 0, 0, 0);
+ ex = new ExCommand(picAniInfo.objectId, 22, _items2[idx]->_subItems[idxsub]._staticsId1, 0, 0, 0, 1, 0, 0, 0);
ex->_keyCode = picAniInfo.field_8;
ex->_excFlags |= 3;
@@ -815,15 +2349,265 @@ MovGraphNode *MovGraph2::findNode(int x, int y, int fuzzyMatch) {
}
int MovGraph2::getShortSide(MovGraphLink *lnk, int x, int y) {
- warning("STUB: MovGraph2::getShortSide()");
+ bool cond;
- return 0;
+ if (lnk)
+ cond = abs(lnk->_movGraphNode2->_x - lnk->_movGraphNode1->_x) > abs(lnk->_movGraphNode2->_y - lnk->_movGraphNode1->_y);
+ else
+ cond = abs(x) > abs(y);
+
+ if (cond)
+ return x <= 0;
+ else
+ return ((y > 0) + 2);
}
-int MovGraph2::findLink(Common::Array<MovGraphLink *> *linkList, MovGraphLink *lnk, Common::Rect *a3, Common::Point *a4) {
- warning("STUB: MovGraphLink *MovGraph2::findLink()");
+int MovGraph2::findLink(Common::Array<MovGraphLink *> *linkList, int idx, Common::Rect *rect, Common::Point *point) {
+ MovGraphNode *node1 = (*linkList)[idx]->_movGraphNode1;
+ MovGraphNode *node2 = (*linkList)[idx]->_movGraphNode2;
+ MovGraphNode *node3 = node1;
- return 0;
+ if (idx != 0) {
+ MovGraphLink *lnk = (*linkList)[idx - 1];
+
+ if (lnk->_movGraphNode2 != node1) {
+ if (lnk->_movGraphNode1 != node1) {
+ if (lnk->_movGraphNode2 == node2 || lnk->_movGraphNode1 == node2) {
+ node3 = node2;
+ node2 = node1;
+ }
+ goto LABEL_7;
+ }
+ }
+ node3 = node1;
+ } else if (idx != (int)(linkList->size() - 1)) {
+ MovGraphLink *lnk = (*linkList)[idx + 1];
+
+ if (lnk->_movGraphNode2 == node1 || lnk->_movGraphNode1 == node1) {
+ node3 = node2;
+ node2 = node1;
+ } else if (lnk->_movGraphNode2 == node2 || lnk->_movGraphNode1 == node2) {
+ node3 = node1;
+ }
+ }
+
+ LABEL_7:
+ if (rect) {
+ rect->left = node3->_x;
+ rect->top = node3->_y;
+ rect->right = node2->_x;
+ rect->bottom = node2->_y;
+ }
+ if (point) {
+ point->x = node3->_distance;
+ point->y = node2->_distance;
+ }
+
+ if (abs(node3->_x - node2->_x) <= abs(node3->_y - node2->_y))
+ return (node3->_y < node2->_x) + 2;
+ else
+ return node3->_x >= node2->_x;
+}
+
+MessageQueue *MovGraph2::genMovement(MovInfo1 *info) {
+ int mx1 = 0;
+ int my1 = 0;
+
+ if (!(info->flags & 2)) {
+ mx1 = _items2[info->index]->_subItems[info->subIndex]._walk[0]._mx;
+ my1 = _items2[info->index]->_subItems[info->subIndex]._walk[0]._my;
+ }
+
+ int mx2 = 0;
+ int my2 = 0;
+
+ if (!(info->flags & 4)) {
+ mx2 = _items2[info->index]->_subItems[info->subIndex]._walk[2]._mx;
+ my2 = _items2[info->index]->_subItems[info->subIndex]._walk[2]._my;
+ }
+
+ Common::Point point;
+
+ int y = info->pt2.y - info->pt1.y - my2 - my1;
+ int x = info->pt2.x - info->pt1.x - mx2 - mx1;
+ int a2 = 0;
+ int mgmLen;
+
+ _mgm.calcLength(&point, _items2[info->index]->_subItems[info->subIndex]._walk[1]._mov, x, y, &mgmLen, &a2, info->flags & 1);
+
+ int x1 = point.x;
+ int y1 = point.y;
+
+ if (!(info->flags & 1)) {
+ if (info->subIndex == 1 || info->subIndex == 0) {
+ a2 = -1;
+ x1 = mgmLen * _items2[info->index]->_subItems[info->subIndex]._walk[1]._mx;
+ x = x1;
+ info->pt2.x = x1 + info->pt1.x + mx1 + mx2;
+ }
+ }
+
+ if (!(info->flags & 1)) {
+ if (info->subIndex == 2 || info->subIndex == 3) {
+ a2 = -1;
+ y1 = mgmLen * _items2[info->index]->_subItems[info->subIndex]._walk[1]._my;
+ y = y1;
+ info->pt2.y = y1 + info->pt1.y + my1 + my2;
+ }
+ }
+
+ int cntX = 0;
+ int cntY = 0;
+
+ if (!(info->flags & 2)) {
+ cntX = _items2[info->index]->_subItems[info->subIndex]._walk[0]._mov->countPhasesWithFlag(-1, 1);
+ cntY = _items2[info->index]->_subItems[info->subIndex]._walk[0]._mov->countPhasesWithFlag(-1, 2);
+ }
+
+ if (mgmLen > 1) {
+ cntX += (mgmLen - 1) * _items2[info->index]->_subItems[info->subIndex]._walk[1]._mov->countPhasesWithFlag(-1, 1);
+ cntY += (mgmLen - 1) * _items2[info->index]->_subItems[info->subIndex]._walk[1]._mov->countPhasesWithFlag(-1, 2);
+ }
+
+ if (mgmLen > 0) {
+ cntX += _items2[info->index]->_subItems[info->subIndex]._walk[1]._mov->countPhasesWithFlag(a2, 1);
+ cntY += _items2[info->index]->_subItems[info->subIndex]._walk[1]._mov->countPhasesWithFlag(a2, 2);
+ }
+
+ if (!(info->flags & 4)) {
+ cntX += _items2[info->index]->_subItems[info->subIndex]._walk[2]._mov->countPhasesWithFlag(-1, 1);
+ cntY += _items2[info->index]->_subItems[info->subIndex]._walk[2]._mov->countPhasesWithFlag(-1, 2);
+ }
+
+ int dx1 = x - x1;
+ int dy1 = y - y1;
+
+ if (cntX)
+ x1 = (int)((double)dx1 / (double)cntX);
+ else
+ x1 = 0;
+
+ if (cntY)
+ y1 = (int)((double)dy1 / (double)cntY);
+ else
+ y1 = 0;
+
+ int v34 = dx1 - cntX * x1;
+ int v35 = dy1 - cntY * y1;
+ Common::Point x2;
+ Common::Point y2(v34, v35);
+
+ if (v34)
+ x2.x = v34 / abs(v34);
+ else
+ x2.x = 0;
+
+ if (v35)
+ x2.y = v35 / abs(v35);
+ else
+ x2.y = 0;
+
+ MessageQueue *mq = new MessageQueue(g_fp->_globalMessageQueueList->compact());
+ ExCommand *ex;
+
+ if (info->flags & 2) {
+ ex = new ExCommand(
+ _items2[info->index]->_objectId,
+ 5,
+ _items2[info->index]->_subItems[info->subIndex]._walk[1]._movementId,
+ info->pt1.x,
+ info->pt1.y,
+ 0,
+ 1,
+ 0,
+ 0,
+ 0);
+
+ ex->_field_14 = info->distance1;
+
+ ex->_keyCode = _items2[info->index]->_obj->_okeyCode;
+ ex->_field_24 = 1;
+ ex->_excFlags |= 2;
+ } else {
+ ex = new ExCommand(
+ _items2[info->index]->_objectId,
+ 5,
+ _items2[info->index]->_subItems[info->subIndex]._walk[0]._movementId,
+ info->pt1.x,
+ info->pt1.y,
+ 0,
+ 1,
+ 0,
+ 0,
+ 0);
+
+ ex->_field_14 = info->distance1;
+
+ ex->_keyCode = _items2[info->index]->_obj->_okeyCode;
+ ex->_field_24 = 1;
+ ex->_excFlags |= 2;
+ mq->addExCommandToEnd(ex);
+
+ ex = _mgm.buildExCommand2(
+ _items2[info->index]->_subItems[info->subIndex]._walk[0]._mov,
+ _items2[info->index]->_objectId,
+ x1,
+ y1,
+ &x2,
+ &y2,
+ -1);
+ ex->_parId = mq->_id;
+ ex->_keyCode = _items2[info->index]->_obj->_okeyCode;
+ }
+
+ mq->addExCommandToEnd(ex);
+
+ for (int i = 0; i < mgmLen; ++i) {
+ int par;
+
+ if (i == mgmLen - 1)
+ par = a2;
+ else
+ par = -1;
+
+ ex = _mgm.buildExCommand2(
+ _items2[info->index]->_subItems[info->subIndex]._walk[1]._mov,
+ _items2[info->index]->_objectId,
+ x1,
+ y1,
+ &x2,
+ &y2,
+ par);
+ ex->_parId = mq->_id;
+ ex->_keyCode = _items2[info->index]->_obj->_okeyCode;
+ mq->addExCommandToEnd(ex);
+ }
+
+ if (!(info->flags & 4)) {
+ ex = _mgm.buildExCommand2(
+ _items2[info->index]->_subItems[info->subIndex]._walk[2]._mov,
+ _items2[info->index]->_objectId,
+ x1,
+ y1,
+ &x2,
+ &y2,
+ -1);
+ ex->_parId = mq->_id;
+ ex->_keyCode = _items2[info->index]->_obj->_okeyCode;
+
+ mq->addExCommandToEnd(ex);
+ }
+
+ ex = new ExCommand(_items2[info->index]->_objectId, 5, -1, info->pt2.x, info->pt2.y, 0, 1, 0, 0, 0);
+ ex->_field_14 = info->distance2;
+
+ ex->_keyCode = _items2[info->index]->_obj->_okeyCode;
+ ex->_field_24 = 0;
+ ex->_excFlags |= 2;
+
+ mq->addExCommandToEnd(ex);
+
+ return mq;
}
MovGraphLink *MovGraph2::findLink1(int x, int y, int idx, int fuzzyMatch) {
@@ -862,7 +2646,7 @@ MovGraphLink *MovGraph2::findLink1(int x, int y, int idx, int fuzzyMatch) {
MovGraphLink *MovGraph2::findLink2(int x, int y) {
double mindist = 1.0e20;
- MovGraphLink *res;
+ MovGraphLink *res = 0;
for (ObList::iterator i = _links.begin(); i != _links.end(); ++i) {
assert(((CObject *)*i)->_objtype == kObjTypeMovGraphLink);
@@ -903,21 +2687,182 @@ MovGraphLink *MovGraph2::findLink2(int x, int y) {
}
double MovGraph2::findMinPath(LinkInfo *linkInfoSource, LinkInfo *linkInfoDest, Common::Array<MovGraphLink *> *listObj) {
- warning("STUB: MovGraph2::findMinPath()");
+ LinkInfo linkInfoWorkSource;
+
+ if (linkInfoSource->link != linkInfoDest->link || linkInfoSource->node != linkInfoDest->node) {
+ double minDistance = -1.0;
+
+ if (linkInfoSource->node) {
+ for (ObList::iterator i = _links.begin(); i != _links.end(); ++i) {
+ MovGraphLink *lnk = (MovGraphLink *)*i;
- return 0.0;
+ if ((lnk->_movGraphNode1 == linkInfoSource->node || lnk->_movGraphNode2 == linkInfoSource->node) && !(lnk->_flags & 0xA0000000)) {
+ linkInfoWorkSource.node = 0;
+ linkInfoWorkSource.link = lnk;
+
+ Common::Array<MovGraphLink *> tmpList;
+
+ lnk->_flags |= 0x80000000;
+
+ double newDistance = findMinPath(&linkInfoWorkSource, linkInfoDest, &tmpList);
+
+ if (newDistance >= 0.0 && (minDistance < 0.0 || newDistance + lnk->_distance < minDistance)) {
+ listObj->clear();
+ listObj->push_back(tmpList);
+
+ minDistance = newDistance + lnk->_distance;
+ }
+
+ lnk->_flags &= 0x7FFFFFFF;
+ }
+ }
+ } else if (linkInfoSource->link) {
+ linkInfoWorkSource.node = linkInfoSource->link->_movGraphNode1;
+ linkInfoWorkSource.link = 0;
+
+ Common::Array<MovGraphLink *> tmpList;
+
+ double newDistance = findMinPath(&linkInfoWorkSource, linkInfoDest, &tmpList);
+
+ if (newDistance >= 0.0) {
+ listObj->clear();
+
+ listObj->push_back(linkInfoSource->link);
+ listObj->push_back(tmpList);
+
+ minDistance = newDistance;
+ }
+
+ linkInfoWorkSource.link = 0;
+ linkInfoWorkSource.node = linkInfoSource->link->_movGraphNode2;
+
+ tmpList.clear();
+
+ newDistance = findMinPath(&linkInfoWorkSource, linkInfoDest, &tmpList);
+
+ if (newDistance >= 0 && (minDistance < 0.0 || newDistance < minDistance)) {
+ listObj->push_back(linkInfoSource->link);
+ listObj->push_back(tmpList);
+
+ minDistance = newDistance;
+ }
+ }
+
+ return minDistance;
+ } else {
+ if (linkInfoSource->link)
+ listObj->push_back(linkInfoSource->link);
+
+ return 0.0;
+ }
}
MovGraphNode *MovGraph::calcOffset(int ox, int oy) {
- warning("STUB: MovGraph::calcOffset()");
+ MovGraphNode *res = 0;
+ double mindist = 1.0e10;
- return 0;
+ for (ObList::iterator i = _nodes.begin(); i != _nodes.end(); ++i) {
+ assert(((CObject *)*i)->_objtype == kObjTypeMovGraphNode);
+
+ MovGraphNode *node = (MovGraphNode *)*i;
+
+ double dist = sqrt((double)((node->_x - oy) * (node->_x - oy) + (node->_x - ox) * (node->_x - ox)));
+ if (dist < mindist) {
+ mindist = dist;
+ res = node;
+ }
+ }
+
+ return res;
}
void MGM::clear() {
_items.clear();
}
+MessageQueue *MGM::genMQ(StaticANIObject *ani, int staticsIndex, int staticsId, int *resStatId, Common::Point **pointArr) {
+ int idx = getItemIndexById(ani->_id);
+
+ if (idx == -1)
+ return 0;
+
+ int stid = staticsId;
+
+ if (!staticsId) {
+ if (ani->_movement) {
+ stid = ani->_movement->_staticsObj2->_staticsId;
+ } else {
+ if (!ani->_statics)
+ return 0;
+
+ stid = ani->_statics->_staticsId;
+ }
+ }
+
+ if (stid == staticsIndex)
+ return new MessageQueue(g_fp->_globalMessageQueueList->compact());
+
+ int startidx = getStaticsIndexById(idx, stid);
+ int endidx = getStaticsIndexById(idx, staticsIndex);
+ int subidx = startidx + endidx * _items[idx]->statics.size();
+
+ if (!_items[idx]->subItems[subidx]->movement) {
+ clearMovements2(idx);
+ recalcOffsets(idx, startidx, endidx, 0, 1);
+ }
+
+ if (!_items[idx]->subItems[subidx]->movement)
+ return 0;
+
+ MessageQueue *mq = new MessageQueue(g_fp->_globalMessageQueueList->compact());
+ Common::Point point;
+ ExCommand *ex;
+
+ int i = 0;
+ do {
+ subidx = startidx + endidx * _items[idx]->statics.size();
+
+ _items[idx]->subItems[subidx]->movement->calcSomeXY(point, 0, -1);
+
+ if (pointArr) {
+ int sz;
+
+ if (_items[idx]->subItems[subidx]->movement->_currMovement)
+ sz = _items[idx]->subItems[subidx]->movement->_currMovement->_dynamicPhases.size();
+ else
+ sz = _items[idx]->subItems[subidx]->movement->_dynamicPhases.size();
+
+ ex = new ExCommand2(20, ani->_id, &pointArr[i], sz);
+
+ ex->_messageNum = _items[idx]->subItems[subidx]->movement->_id;
+ } else {
+ ex = new ExCommand(ani->_id, 1, _items[idx]->subItems[subidx]->movement->_id, 0, 0, 0, 1, 0, 0, 0);
+ }
+
+ ex->_keyCode = ani->_okeyCode;
+ ex->_field_3C = 1;
+ ex->_field_24 = 1;
+
+ mq->addExCommandToEnd(ex);
+
+ if (resStatId)
+ *resStatId = _items[idx]->subItems[subidx]->movement->_id;
+
+ startidx = _items[idx]->subItems[subidx]->staticsIndex;
+
+ uint step;
+
+ if (_items[idx]->subItems[subidx]->movement->_currMovement)
+ step = _items[idx]->subItems[subidx]->movement->_currMovement->_dynamicPhases.size();
+ else
+ step = _items[idx]->subItems[subidx]->movement->_dynamicPhases.size();
+
+ i += step;
+ } while (startidx != endidx);
+
+ return mq;
+}
+
MGMItem::MGMItem() {
objId = 0;
}
@@ -952,7 +2897,7 @@ void MGM::rebuildTables(int objId) {
_items[idx]->movements1.clear();
_items[idx]->movements2.clear();
- StaticANIObject *obj = g_fullpipe->_currentScene->getStaticANIObject1ById(objId, -1);
+ StaticANIObject *obj = g_fp->_currentScene->getStaticANIObject1ById(objId, -1);
if (!obj)
return;
@@ -974,6 +2919,550 @@ int MGM::getItemIndexById(int objId) {
return -1;
}
+MessageQueue *MGM::genMovement(MGMInfo *mgminfo) {
+ if (!mgminfo->ani)
+ return 0;
+
+ Movement *mov = mgminfo->ani->_movement;
+
+ if (!mov && !mgminfo->ani->_statics)
+ return 0;
+
+ if (!(mgminfo->flags & 1)) {
+ if (mov)
+ mgminfo->staticsId1 = mov->_staticsObj2->_staticsId;
+ else
+ mgminfo->staticsId1 = mgminfo->ani->_statics->_staticsId;
+ }
+
+ Common::Point point;
+
+ if (!(mgminfo->flags & 0x10) || !(mgminfo->flags & 0x20)) {
+ int nx = mgminfo->ani->_ox;
+ int ny = mgminfo->ani->_oy;
+
+ if (mgminfo->ani->_movement) {
+ mgminfo->ani->calcNextStep(&point);
+
+ nx += point.x;
+ ny += point.y;
+ }
+
+ if (!(mgminfo->flags & 0x10))
+ mgminfo->x2 = nx;
+
+ if (!(mgminfo->flags & 0x20))
+ mgminfo->y2 = ny;
+ }
+
+ mov = mgminfo->ani->getMovementById(mgminfo->movementId);
+
+ if (!mov)
+ return 0;
+
+ int itemIdx = getItemIndexById(mgminfo->ani->_id);
+ int subIdx = getStaticsIndexById(itemIdx, mgminfo->staticsId1);
+ int st2idx = getStaticsIndexById(itemIdx, mov->_staticsObj1->_staticsId);
+ int st1idx = getStaticsIndexById(itemIdx, mov->_staticsObj2->_staticsId);
+ int subOffset = getStaticsIndexById(itemIdx, mgminfo->staticsId2);
+
+ clearMovements2(itemIdx);
+ recalcOffsets(itemIdx, subIdx, st2idx, 0, 1);
+ clearMovements2(itemIdx);
+ recalcOffsets(itemIdx, st1idx, subOffset, 0, 1);
+
+ MGMSubItem *sub1 = _items[itemIdx]->subItems[subIdx + st2idx * _items[itemIdx]->statics.size()];
+ MGMSubItem *sub2 = _items[itemIdx]->subItems[st1idx + subOffset * _items[itemIdx]->statics.size()];
+
+ if (subIdx != st2idx && !sub1->movement)
+ return 0;
+
+ if (st1idx != subOffset && !sub2->movement)
+ return 0;
+
+ int n1x = mgminfo->x1 - mgminfo->x2 - sub1->x - sub2->x;
+ int n1y = mgminfo->y1 - mgminfo->y2 - sub1->y - sub2->y;
+
+ Common::Point point1;
+
+ mov->calcSomeXY(point1, 0, -1);
+
+ int n2x = point1.x;
+ int n2y = point1.y;
+ int mult;
+ int len = -1;
+
+ if (mgminfo->flags & 0x40) {
+ mult = mgminfo->field_10;
+ len = -1;
+ n2x *= mult;
+ n2y *= mult;
+ } else {
+ calcLength(&point, mov, n1x, n1y, &mult, &len, 1);
+ n2x = point.x;
+ n2y = point.y;
+ }
+
+ if (!(mgminfo->flags & 2)) {
+ len = -1;
+ n2x = mult * point1.x;
+ n1x = mult * point1.x;
+ mgminfo->x1 = mgminfo->x2 + mult * point1.x + sub1->x + sub2->x;
+ }
+
+ if (!(mgminfo->flags & 4)) {
+ n2y = mult * point1.y;
+ n1y = mult * point1.y;
+ len = -1;
+ mgminfo->y1 = mgminfo->y2 + mult * point1.y + sub1->y + sub2->y;
+ }
+
+ int px = 0;
+ int py = 0;
+
+ if (sub1->movement) {
+ px = countPhases(itemIdx, subIdx, st2idx, 1);
+ py = countPhases(itemIdx, subIdx, st2idx, 2);
+ }
+
+ if (mult > 1) {
+ px += (mult - 1) * mov->countPhasesWithFlag(-1, 1);
+ py += (mult - 1) * mov->countPhasesWithFlag(-1, 2);
+ }
+
+ if (mult > 0) {
+ px += mov->countPhasesWithFlag(len, 1);
+ py += mov->countPhasesWithFlag(len, 2);
+ }
+
+ if (sub2->movement) {
+ px += countPhases(itemIdx, st1idx, subOffset, 1);
+ py += countPhases(itemIdx, st1idx, subOffset, 2);
+ }
+
+ int dx1 = n1x - n2x;
+ int dy1 = n1y - n2y;
+ int x1, y1;
+
+ if (px) {
+ x1 = (int)((double)dx1 / (double)px);
+ } else {
+ x1 = 0;
+ }
+
+ if (py) {
+ y1 = (int)((double)dy1 / (double)py);
+ } else {
+ y1 = 0;
+ }
+
+ Common::Point x2, y2;
+
+ y2.x = dx1 - px * x1;
+ y2.y = dy1 - py * y1;
+
+ if (n1x - n2x == px * x1)
+ x2.x = 0;
+ else
+ x2.x = (dx1 - px * x1) / abs(dx1 - px * x1);
+
+ if (dy1 == py * y1)
+ x2.y = 0;
+ else
+ x2.y = (dy1 - py * y1) / abs(dy1 - py * y1);
+
+ MessageQueue *mq = new MessageQueue(g_fp->_globalMessageQueueList->compact());
+ ExCommand2 *ex2;
+
+ for (int i = subIdx; i != st2idx;) {
+ MGMSubItem *s = _items[itemIdx]->subItems[i + subOffset * _items[itemIdx]->statics.size()];
+
+ ex2 = buildExCommand2(s->movement, mgminfo->ani->_id, x1, y1, &x2, &y2, -1);
+ ex2->_parId = mq->_id;
+ ex2->_keyCode = mgminfo->ani->_okeyCode;
+
+ mq->addExCommandToEnd(ex2);
+
+ i = s->staticsIndex;
+ }
+
+ for (int i = 0; i < mult; ++i) {
+ int plen;
+
+ if (i == mult - 1)
+ plen = len;
+ else
+ plen = -1;
+
+ ex2 = buildExCommand2(mov, mgminfo->ani->_id, x1, y1, &x2, &y2, plen);
+ ex2->_parId = mq->_id;
+ ex2->_keyCode = mgminfo->ani->_okeyCode;
+
+ mq->addExCommandToEnd(ex2);
+ }
+
+ for (int j = st1idx; j != subOffset;) {
+ MGMSubItem *s = _items[itemIdx]->subItems[j + subOffset * _items[itemIdx]->statics.size()];
+
+ ex2 = buildExCommand2(s->movement, mgminfo->ani->_id, x1, y1, &x2, &y2, -1);
+ ex2->_parId = mq->_id;
+ ex2->_keyCode = mgminfo->ani->_okeyCode;
+
+ mq->addExCommandToEnd(ex2);
+
+ j = s->staticsIndex;
+ }
+
+ ExCommand *ex = new ExCommand(mgminfo->ani->_id, 5, -1, mgminfo->x1, mgminfo->y1, 0, 1, 0, 0, 0);
+
+ ex->_field_14 = mgminfo->field_1C;
+ ex->_keyCode = mgminfo->ani->_okeyCode;
+ ex->_field_24 = 0;
+ ex->_excFlags |= 3;
+
+ mq->addExCommandToEnd(ex);
+
+ return mq;
+}
+
+int MGM::countPhases(int idx, int subIdx, int endIdx, int flag) {
+ int res = 0;
+
+ if (endIdx < 0)
+ return 0;
+
+ while (subIdx != endIdx) {
+ if (subIdx < 0)
+ break;
+
+ res += _items[idx]->subItems[subIdx + endIdx * _items[idx]->statics.size()]->movement->countPhasesWithFlag(-1, flag);
+
+ subIdx = _items[idx]->subItems[subIdx + 6 * endIdx * _items[idx]->statics.size()]->staticsIndex;
+ }
+
+ return res;
+}
+void MGM::updateAnimStatics(StaticANIObject *ani, int staticsId) {
+ if (getItemIndexById(ani->_id) == -1)
+ return;
+
+ if (ani->_movement) {
+ ani->queueMessageQueue(0);
+ ani->_movement->gotoLastFrame();
+ ani->_statics = ani->_movement->_staticsObj2;
+
+ int x = ani->_movement->_ox;
+ int y = ani->_movement->_oy;
+
+ ani->_movement = 0;
+
+ ani->setOXY(x, y);
+ }
+
+ if (ani->_statics) {
+ Common::Point point;
+
+ getPoint(&point, ani->_id, ani->_statics->_staticsId, staticsId);
+
+ ani->setOXY(ani->_ox + point.x, ani->_oy + point.y);
+
+ ani->_statics = ani->getStaticsById(staticsId);
+ }
+}
+
+Common::Point *MGM::getPoint(Common::Point *point, int objectId, int staticsId1, int staticsId2) {
+ int idx = getItemIndexById(objectId);
+
+ if (idx == -1) {
+ point->x = -1;
+ point->y = -1;
+ } else {
+ int st1idx = getStaticsIndexById(idx, staticsId1);
+ int st2idx = getStaticsIndexById(idx, staticsId2);
+
+ if (st1idx == st2idx) {
+ point->x = 0;
+ point->y = 0;
+ } else {
+ int subidx = st1idx + st2idx * _items[idx]->statics.size();
+
+ if (!_items[idx]->subItems[subidx]->movement) {
+ clearMovements2(idx);
+ recalcOffsets(idx, st1idx, st2idx, false, true);
+
+ if (!_items[idx]->subItems[subidx]->movement) {
+ clearMovements2(idx);
+ recalcOffsets(idx, st1idx, st2idx, true, false);
+ }
+ }
+
+ MGMSubItem *sub = _items[idx]->subItems[subidx];
+
+ if (sub->movement) {
+ point->x = sub->x;
+ point->y = sub->y;
+ } else {
+ point->x = 0;
+ point->y = 0;
+ }
+ }
+ }
+
+ return point;
+}
+
+int MGM::getStaticsIndexById(int idx, int16 id) {
+ if (!_items[idx]->statics.size())
+ return -1;
+
+ for (uint i = 0; i < _items[idx]->statics.size(); i++) {
+ if (_items[idx]->statics[i]->_staticsId == id)
+ return i;
+ }
+
+ return 0;
+}
+
+int MGM::getStaticsIndex(int idx, Statics *st) {
+ if (!_items[idx]->statics.size())
+ return -1;
+
+ for (uint i = 0; i < _items[idx]->statics.size(); i++) {
+ if (_items[idx]->statics[i] == st)
+ return i;
+ }
+
+ return 0;
+}
+
+void MGM::clearMovements2(int idx) {
+ _items[idx]->movements2.clear();
+}
+
+int MGM::recalcOffsets(int idx, int st1idx, int st2idx, bool flip, bool flop) {
+ MGMItem *item = _items[idx];
+ int subIdx = st1idx + st2idx * item->statics.size();
+
+ if (st1idx == st2idx) {
+ memset(&item->subItems[subIdx], 0, sizeof(item->subItems[subIdx]));
+ return 0;
+ }
+
+ if (item->subItems[subIdx])
+ return item->subItems[subIdx]->field_8;
+
+ Common::Point point;
+
+ for (uint i = 0; i < item->movements1.size(); i++) {
+ Movement *mov = item->movements1[i];
+
+ if (mov->_staticsObj1 == item->statics[st1idx]) {
+ if (!item->movements2[i] && (!flop || mov->_field_50)) {
+ item->movements2[i] = 1;
+
+ int stidx = getStaticsIndex(idx, item->movements1[i]->_staticsObj2);
+ int recalc = recalcOffsets(idx, stidx, st2idx, flip, flop);
+ int sz = mov->_currMovement ? mov->_currMovement->_dynamicPhases.size() : mov->_dynamicPhases.size();
+ int newsz = sz + item->subItems[stidx + 6 * st2idx * _items[idx]->statics.size()]->field_C;
+
+ if (recalc >= 0) {
+ if (!item->subItems[subIdx]->movement || item->subItems[subIdx]->field_8 > recalc + 1 ||
+ (item->subItems[subIdx]->field_8 == recalc + 1 && item->subItems[subIdx]->field_C > newsz)) {
+ item->subItems[subIdx]->movement = mov;
+ item->subItems[subIdx]->staticsIndex = stidx;
+ item->subItems[subIdx]->field_8 = recalc + 1;
+ item->subItems[subIdx]->field_C = newsz;
+
+ mov->calcSomeXY(point, 0, -1);
+
+ item->subItems[subIdx]->x = item->subItems[stidx + 6 * st2idx * _items[idx]->statics.size()]->x + point.x;
+ item->subItems[subIdx]->y = item->subItems[stidx + 6 * st2idx * _items[idx]->statics.size()]->y + point.y;
+ }
+ }
+ }
+ } else if (flip) {
+ if (mov->_staticsObj2 == item->statics[st1idx]) {
+ if (!item->movements2[i] && (!flop || mov->_field_50)) {
+ item->movements2[i] = 1;
+
+ int stidx = getStaticsIndex(idx, mov->_staticsObj1);
+ int recalc = recalcOffsets(idx, stidx, st2idx, flip, flop);
+
+ if (recalc >= 0) {
+ if (!item->subItems[subIdx]->movement || item->subItems[subIdx]->field_8 > recalc + 1) {
+ item->subItems[subIdx]->movement = mov;
+ item->subItems[subIdx]->staticsIndex = stidx;
+ item->subItems[subIdx]->field_8 = recalc + 1;
+
+ int sz = mov->_currMovement ? mov->_currMovement->_dynamicPhases.size() : mov->_dynamicPhases.size();
+
+ item->subItems[subIdx]->field_C = sz + item->subItems[stidx + 6 * st2idx * _items[idx]->statics.size()]->field_C;
+
+ mov->calcSomeXY(point, 0, -1);
+
+ item->subItems[subIdx]->x = item->subItems[stidx + 6 * st2idx * _items[idx]->statics.size()]->x - point.x;
+ item->subItems[subIdx]->y = item->subItems[stidx + 6 * st2idx * _items[idx]->statics.size()]->y - point.y;
+ }
+ }
+ }
+ }
+ }
+ }
+
+ if (item->subItems[subIdx]->movement)
+ return item->subItems[subIdx]->field_8;
+
+ return -1;
+}
+
+int MGM::refreshOffsets(int objectId, int idx1, int idx2) {
+ int idx = getItemIndexById(objectId);
+
+ if (idx != -1) {
+ int from = getStaticsIndexById(idx, idx1);
+ int to = getStaticsIndexById(idx, idx2);
+
+ MGMSubItem *sub = _items[idx]->subItems[from + to * _items[idx]->statics.size()];
+
+ if (sub->movement) {
+ idx = sub->field_8;
+ } else {
+ clearMovements2(idx);
+ idx = recalcOffsets(idx, from, to, 0, 1);
+ }
+ }
+
+ return idx;
+}
+
+Common::Point *MGM::calcLength(Common::Point *pRes, Movement *mov, int x, int y, int *mult, int *len, int flag) {
+ Common::Point point;
+
+ mov->calcSomeXY(point, 0, -1);
+ int p1x = point.x;
+ int p1y = point.y;
+
+ int newmult = 0;
+ int oldlen = *len;
+
+ if (abs(p1y) > abs(p1x)) {
+ if (mov->calcSomeXY(point, 0, -1)->y)
+ newmult = (int)((double)y / mov->calcSomeXY(point, 0, -1)->y);
+ } else if (mov->calcSomeXY(point, 0, -1)->x) {
+ newmult = (int)((double)x / mov->calcSomeXY(point, 0, -1)->x);
+ }
+
+ if (newmult < 0)
+ newmult = 0;
+
+ *mult = newmult;
+
+ int phase = 1;
+ int sz;
+
+ if (flag) {
+ if (abs(p1y) > abs(p1x)) {
+ while (abs(p1y * newmult + mov->calcSomeXY(point, 0, phase)->y) < abs(y)) {
+ sz = mov->_currMovement ? mov->_currMovement->_dynamicPhases.size() : mov->_dynamicPhases.size();
+
+ if (phase > sz)
+ break;
+
+ phase++;
+ }
+ } else {
+ while (abs(p1x * newmult + mov->calcSomeXY(point, 0, phase)->x) < abs(x)) {
+ sz = mov->_currMovement ? mov->_currMovement->_dynamicPhases.size() : mov->_dynamicPhases.size();
+
+ if (phase >= sz)
+ break;
+
+ phase++;
+ }
+ }
+
+ *len = phase - 1;
+ } else {
+ *len = -1;
+ }
+
+ int p2x = 0;
+ int p2y = 0;
+
+ if (!oldlen)
+ oldlen = -1;
+
+ if (oldlen > 0) {
+ ++*mult;
+
+ mov->calcSomeXY(point, 0, oldlen);
+ p2x = point.x;
+ p2y = point.y;
+
+ if (abs(p1y) > abs(p1x))
+ p2x = p1x;
+ else
+ p2y = p1y;
+ }
+
+ pRes->x = p2x + p1x * newmult;
+ pRes->y = p2y + p1y * newmult;
+
+ return pRes;
+}
+
+ExCommand2 *MGM::buildExCommand2(Movement *mov, int objId, int x1, int y1, Common::Point *x2, Common::Point *y2, int len) {
+ uint cnt;
+
+ if (mov->_currMovement)
+ cnt = mov->_currMovement->_dynamicPhases.size();
+ else
+ cnt = mov->_dynamicPhases.size();
+
+ if (len > 0 && cnt > (uint)len)
+ cnt = len;
+
+ Common::Point **points = (Common::Point **)malloc(sizeof(Common::Point *) * cnt);
+
+ for (uint i = 0; i < cnt; i++) {
+ int flags = mov->getDynamicPhaseByIndex(i)->getDynFlags();
+
+ points[i] = new Common::Point;
+
+ if (flags & 1) {
+ points[i]->x = x1 + x2->x;
+
+ y2->x -= x2->x;
+
+ if (!y2->x)
+ x2->x = 0;
+ }
+
+ if (flags & 2) {
+ points[i]->y = y1 + x2->y;
+
+ y2->y -= x2->y;
+
+ if (!y2->y)
+ x2->y = 0;
+ }
+ }
+
+ ExCommand2 *ex = new ExCommand2(20, objId, points, cnt);
+ ex->_excFlags = 2;
+ ex->_messageNum = mov->_id;
+ ex->_field_14 = len;
+ ex->_field_24 = 1;
+ ex->_keyCode = -1;
+
+ for (uint i = 0; i < cnt; i++)
+ delete points[i];
+
+ free(points);
+
+ return ex;
+}
+
MovGraphLink::MovGraphLink() {
_distance = 0;
_angle = 0;
@@ -988,6 +3477,14 @@ MovGraphLink::MovGraphLink() {
_objtype = kObjTypeMovGraphLink;
}
+MovGraphLink::~MovGraphLink() {
+ delete _movGraphReact;
+
+ _dwordArray1.clear();
+ _dwordArray2.clear();
+}
+
+
bool MovGraphLink::load(MfcArchive &file) {
debug(5, "MovGraphLink::load()");
@@ -1012,6 +3509,16 @@ bool MovGraphLink::load(MfcArchive &file) {
return true;
}
+void MovGraphLink::calcNodeDistanceAndAngle() {
+ if (_movGraphNode1) {
+ double dx = _movGraphNode2->_x - _movGraphNode1->_x;
+ double dy = _movGraphNode2->_y - _movGraphNode1->_y;
+
+ _distance = sqrt(dy * dy + dx * dx);
+ _angle = atan2(dx, dy);
+ }
+}
+
bool MovGraphNode::load(MfcArchive &file) {
debug(5, "MovGraphNode::load()");
@@ -1053,7 +3560,7 @@ void ReactParallel::createRegion() {
for (int i = 0; i < 4; i++)
_points[i] = new Common::Point;
- double at = atan2((double)(_x1 - _x2), (double)(_y1 - _y2)) + 1.570796;
+ double at = atan2((double)(_x1 - _x2), (double)(_y1 - _y2)) + 1.570796; // pi/2
double sn = sin(at);
double cs = cos(at);
@@ -1073,20 +3580,28 @@ void ReactParallel::createRegion() {
// GdiObject::Attach(_rgn, CreatePolygonRgn(_points, 4, 2);
}
-void ReactParallel::method14() {
- warning("STUB: ReactParallel::method14()");
+void ReactParallel::setCenter(int x1, int y1, int x2, int y2) {
+ _x1 = x1;
+ _y1 = y1;
+ _x2 = x2;
+ _y2 = y2;
}
ReactPolygonal::ReactPolygonal() {
- _field_C = 0;
- _field_10 = 0;
+ _centerX = 0;
+ _centerY = 0;
+ _bbox = 0;
+}
+
+ReactPolygonal::~ReactPolygonal() {
+ delete _bbox;
}
bool ReactPolygonal::load(MfcArchive &file) {
debug(5, "ReactPolygonal::load()");
- _field_C = file.readUint32LE();
- _field_10 = file.readUint32LE();
+ _centerX = file.readUint32LE();
+ _centerY = file.readUint32LE();
_pointCount = file.readUint32LE();
if (_pointCount > 0) {
@@ -1113,10 +3628,54 @@ void ReactPolygonal::createRegion() {
}
}
-void ReactPolygonal::method14() {
- warning("STUB: ReactPolygonal::method14()");
+void ReactPolygonal::setCenter(int x1, int y1, int x2, int y2) {
+ int cX = (x2 + x1) / 2;
+ int cY = (y2 + y1) / 2;
+
+ if (_points) {
+ for (int i = 0; i < _pointCount; i++) {
+ _points[i]->x += cX - _centerX;
+ _points[i]->y += cY - _centerY;
+ }
+ }
+
+ _centerX = cX;
+ _centerY = cY;
+}
+
+void ReactPolygonal::getBBox(Common::Rect *rect) {
+ if (!_pointCount)
+ return;
+
+ if (_bbox) {
+ *rect = *_bbox;
+ return;
+ }
+
+ rect->left = _points[0]->x;
+ rect->top = _points[0]->y;
+ rect->right = _points[0]->x;
+ rect->bottom = _points[0]->y;
+
+ for (int i = 1; i < _pointCount; i++) {
+ if (rect->left > _points[i]->x)
+ rect->left = _points[i]->x;
+
+ if (rect->top < _points[i]->y)
+ rect->top = _points[i]->y;
+
+ if (rect->right < _points[i]->x)
+ rect->right = _points[i]->x;
+
+ if (rect->bottom > _points[i]->y)
+ rect->bottom = _points[i]->y;
+ }
+
+ _bbox = new Common::Rect;
+ *_bbox = *rect;
}
+
bool MovGraphReact::pointInRegion(int x, int y) {
if (_pointCount < 3) {
return false;
@@ -1126,15 +3685,15 @@ bool MovGraphReact::pointInRegion(int x, int y) {
double xinters;
Common::Point p, p1, p2;
- p.x = (double)x;
- p.y = (double)y;
+ p.x = x;
+ p.y = y;
- p1.x = (double)_points[0]->x;
- p1.y = (double)_points[0]->y;
+ p1.x = _points[0]->x;
+ p1.y = _points[0]->y;
for (int i = 1; i <= _pointCount; i++) {
- p2.x = (double)_points[i % _pointCount]->x;
- p2.y = (double)_points[i % _pointCount]->y;
+ p2.x = _points[i % _pointCount]->x;
+ p2.y = _points[i % _pointCount]->y;
if (p.y > MIN(p1.y, p2.y)) {
if (p.y <= MAX(p1.y, p2.y)) {
@@ -1158,22 +3717,26 @@ bool MovGraphReact::pointInRegion(int x, int y) {
}
}
-int startWalkTo(int objId, int objKey, int x, int y, int a5) {
- MctlCompound *mc = getSc2MctlCompoundBySceneId(g_fullpipe->_currentScene->_sceneId);
+int startWalkTo(int objId, int objKey, int x, int y, int fuzzyMatch) {
+ MctlCompound *mc = getCurrSceneSc2MotionController();
if (mc)
- return (mc->method34(g_fullpipe->_currentScene->getStaticANIObject1ById(objId, objKey), x, y, a5, 0) != 0);
+ return (mc->method34(g_fp->_currentScene->getStaticANIObject1ById(objId, objKey), x, y, fuzzyMatch, 0) != 0);
return 0;
}
-int doSomeAnimation(int objId, int objKey, int a3) {
- warning("STUB: doSomeAnimation(%d, %d, %d)", objId, objKey, a3);
+bool doSomeAnimation(int objId, int objKey, int a3) {
+ StaticANIObject *ani = g_fp->_currentScene->getStaticANIObject1ById(objId, objKey);
+ MctlCompound *cmp = getCurrSceneSc2MotionController();
- return 0;
+ if (ani && cmp)
+ return cmp->method3C(ani, a3);
+
+ return false;
}
-int doSomeAnimation2(int objId, int objKey) {
+bool doSomeAnimation2(int objId, int objKey) {
return doSomeAnimation(objId, objKey, 0);
}
diff --git a/engines/fullpipe/motion.h b/engines/fullpipe/motion.h
index 6901a7263a..2cbf999f86 100644
--- a/engines/fullpipe/motion.h
+++ b/engines/fullpipe/motion.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -28,10 +28,15 @@ namespace Fullpipe {
class Statics;
class Movement;
class MctlConnectionPoint;
+class MovGraphLink;
+class MessageQueue;
+class ExCommand2;
+struct MovArr;
+struct MovItem;
int startWalkTo(int objId, int objKey, int x, int y, int a5);
-int doSomeAnimation(int objId, int objKey, int a3);
-int doSomeAnimation2(int objId, int objKey);
+bool doSomeAnimation(int objId, int objKey, int a3);
+bool doSomeAnimation2(int objId, int objKey);
class MotionController : public CObject {
public:
@@ -49,16 +54,19 @@ public:
virtual void addObject(StaticANIObject *obj) {}
virtual int removeObject(StaticANIObject *obj) { return 0; }
virtual void freeItems() {}
- virtual int method28() { return 0; }
- virtual int method2C() { return 0; }
+ virtual Common::Array<MovItem *> *method28(StaticANIObject *ani, int x, int y, int flag1, int *rescount) { return 0; }
+ virtual bool method2C(StaticANIObject *obj, int x, int y) { return false; }
virtual int method30() { return 0; }
virtual MessageQueue *method34(StaticANIObject *subj, int xpos, int ypos, int fuzzyMatch, int staticsId) { return 0; }
- virtual int changeCallback() { return 0; }
- virtual int method3C() { return 0; }
+ virtual void changeCallback(MovArr *(*_callback1)(StaticANIObject *ani, Common::Array<MovItem *> *items, signed int counter)) {}
+ virtual bool method3C(StaticANIObject *ani, int flag) { return 0; }
virtual int method40() { return 0; }
- virtual int method44() { return 0; }
+ virtual bool method44(StaticANIObject *ani, int x, int y) { return false; }
virtual int method48() { return -1; }
virtual MessageQueue *doWalkTo(StaticANIObject *subj, int xpos, int ypos, int fuzzyMatch, int staticsId) { return 0; }
+
+ void enableLinks(const char *linkName, bool enable);
+ MovGraphLink *getLinkByName(const char *name);
};
class MovGraphReact : public CObject {
@@ -70,15 +78,13 @@ public:
MovGraphReact() : _pointCount(0), _points(0) {}
~MovGraphReact() { free(_points); }
- virtual void method14() {}
+ virtual void setCenter(int x1, int y1, int x2, int y2) {}
virtual void createRegion() {}
virtual bool pointInRegion(int x, int y);
};
class MctlCompoundArrayItem : public CObject {
- friend class MctlCompound;
-
- protected:
+public:
MotionController *_motionControllerObj;
MovGraphReact *_movGraphReactObj;
Common::Array<MctlConnectionPoint *> _connectionPoints;
@@ -86,8 +92,9 @@ class MctlCompoundArrayItem : public CObject {
int _field_24;
int _field_28;
- public:
- MctlCompoundArrayItem() : _movGraphReactObj(0) {}
+public:
+ MctlCompoundArrayItem() : _movGraphReactObj(0), _motionControllerObj(0), _field_20(0), _field_24(0), _field_28(0) {}
+ ~MctlCompoundArrayItem();
};
class MctlCompoundArray : public Common::Array<MctlCompoundArrayItem *>, public CObject {
@@ -96,9 +103,9 @@ class MctlCompoundArray : public Common::Array<MctlCompoundArrayItem *>, public
};
class MctlCompound : public MotionController {
+public:
MctlCompoundArray _motionControllers;
- public:
MctlCompound() { _objtype = kObjTypeMctlCompound; }
virtual bool load(MfcArchive &file);
@@ -110,11 +117,15 @@ class MctlCompound : public MotionController {
virtual MessageQueue *doWalkTo(StaticANIObject *subj, int xpos, int ypos, int fuzzyMatch, int staticsId);
void initMovGraph2();
- MctlConnectionPoint *findClosestConnectionPoint(int ox, int oy, int destIndex, int connectionX, int connectionY, int sourceIndex, int *minDistancePtr);
+ MctlConnectionPoint *findClosestConnectionPoint(int ox, int oy, int destIndex, int connectionX, int connectionY, int sourceIndex, double *minDistancePtr);
+ void replaceNodeX(int from, int to);
+
+ uint getMotionControllerCount() { return _motionControllers.size(); }
+ MotionController *getMotionController(int num) { return _motionControllers[num]->_motionControllerObj; }
};
struct MGMSubItem {
- int movement;
+ Movement *movement;
int staticsIndex;
int field_8;
int field_C;
@@ -129,11 +140,26 @@ struct MGMItem {
Common::Array<MGMSubItem *> subItems;
Common::Array<Statics *> statics;
Common::Array<Movement *> movements1;
- Common::Array<Movement *> movements2;
+ Common::Array<int> movements2;
MGMItem();
};
+struct MGMInfo {
+ StaticANIObject *ani;
+ int staticsId1;
+ int staticsId2;
+ int movementId;
+ int field_10;
+ int x1;
+ int y1;
+ int field_1C;
+ int x2;
+ int y2;
+ int flags;
+
+ MGMInfo() { memset(this, 0, sizeof(MGMInfo)); }
+};
class MGM : public CObject {
public:
@@ -144,6 +170,65 @@ public:
void addItem(int objId);
void rebuildTables(int objId);
int getItemIndexById(int objId);
+
+ MessageQueue *genMovement(MGMInfo *mgminfo);
+ void updateAnimStatics(StaticANIObject *ani, int staticsId);
+ Common::Point *getPoint(Common::Point *point, int aniId, int staticsId1, int staticsId2);
+ int getStaticsIndexById(int idx, int16 id);
+ int getStaticsIndex(int idx, Statics *st);
+ void clearMovements2(int idx);
+ int recalcOffsets(int idx, int st1idx, int st2idx, bool flip, bool flop);
+ Common::Point *calcLength(Common::Point *point, Movement *mov, int x, int y, int *mult, int *len, int flag);
+ ExCommand2 *buildExCommand2(Movement *mov, int objId, int x1, int y1, Common::Point *x2, Common::Point *y2, int len);
+ MessageQueue *genMQ(StaticANIObject *ani, int staticsIndex, int staticsId, int *resStatId, Common::Point **pointArr);
+ int countPhases(int idx, int subIdx, int subOffset, int flag);
+ int refreshOffsets(int objectId, int idx1, int idx2);
+};
+
+struct MctlLadderMovementVars {
+ int varUpGo;
+ int varDownGo;
+ int varUpStop;
+ int varDownStop;
+ int varUpStart;
+ int varDownStart;
+};
+
+struct MctlLadderMovement {
+ int objId;
+ int staticIdsSize;
+ MctlLadderMovementVars *movVars;
+ int *staticIds;
+};
+
+class MctlLadder : public MotionController {
+public:
+ int _ladderX;
+ int _ladderY;
+ int _ladder_field_14;
+ int _width;
+ int _height;
+ int _ladder_field_20;
+ int _ladder_field_24;
+ Common::Array<MctlLadderMovement *> _ladmovements;
+ MGM _mgm;
+
+public:
+ MctlLadder();
+ virtual ~MctlLadder();
+ int collisionDetection(StaticANIObject *man);
+
+ virtual void addObject(StaticANIObject *obj);
+ virtual int removeObject(StaticANIObject *obj) { return 1; }
+ virtual void freeItems();
+ virtual MessageQueue *method34(StaticANIObject *subj, int xpos, int ypos, int fuzzyMatch, int staticsId);
+ virtual MessageQueue *doWalkTo(StaticANIObject *subj, int xpos, int ypos, int fuzzyMatch, int staticsId);
+
+ MessageQueue *controllerWalkTo(StaticANIObject *ani, int off);
+
+private:
+ int findObjectPos(StaticANIObject *obj);
+ bool initMovement(StaticANIObject *ani, MctlLadderMovement *movement);
};
class MovGraphNode : public CObject {
@@ -168,25 +253,29 @@ class ReactParallel : public MovGraphReact {
int _dx;
int _dy;
- public:
+public:
ReactParallel();
virtual bool load(MfcArchive &file);
- virtual void method14();
+ virtual void setCenter(int x1, int y1, int x2, int y2);
virtual void createRegion();
};
class ReactPolygonal : public MovGraphReact {
- //CRgn _rgn;
- int _field_C;
- int _field_10;
+ Common::Rect *_bbox;
+ int _centerX;
+ int _centerY;
- public:
+public:
ReactPolygonal();
+ ~ReactPolygonal();
+
virtual bool load(MfcArchive &file);
- virtual void method14();
+ virtual void setCenter(int x1, int y1, int x2, int y2);
virtual void createRegion();
+
+ void getBBox(Common::Rect *rect);
};
class MovGraphLink : public CObject {
@@ -205,21 +294,39 @@ class MovGraphLink : public CObject {
public:
MovGraphLink();
+ virtual ~MovGraphLink();
+
virtual bool load(MfcArchive &file);
+
+ void calcNodeDistanceAndAngle();
+};
+
+struct MovStep {
+ int sfield_0;
+ MovGraphLink *link;
+};
+
+struct MovArr {
+ Common::Array<MovStep *> _movSteps;
+ int _movStepCount;
+ int _afield_8;
+ MovGraphLink *_link;
+ double _dist;
+ Common::Point _point;
+};
+
+struct MovItem {
+ MovArr *movarr;
+ int _mfield_4;
+ int _mfield_8;
+ int _mfield_C;
};
struct MovGraphItem {
StaticANIObject *ani;
int field_4;
- int field_8;
- int field_C;
- int field_10;
- int field_14;
- int field_18;
- int field_1C;
- int field_20;
- int field_24;
- int items;
+ MovArr movarr;
+ Common::Array<MovItem *> *movitems;
int count;
int field_30;
int field_34;
@@ -227,35 +334,49 @@ struct MovGraphItem {
int field_3C;
MovGraphItem();
+ void free();
};
class MovGraph : public MotionController {
- public:
+public:
ObList _nodes;
ObList _links;
int _field_44;
Common::Array<MovGraphItem *> _items;
- int (*_callback1)(int, int, int);
+ MovArr *(*_callback1)(StaticANIObject *ani, Common::Array<MovItem *> *items, signed int counter);
MGM _mgm;
- public:
+public:
MovGraph();
+ virtual ~MovGraph();
+
virtual bool load(MfcArchive &file);
virtual void addObject(StaticANIObject *obj);
virtual int removeObject(StaticANIObject *obj);
virtual void freeItems();
- virtual int method28();
- virtual int method2C();
+ virtual Common::Array<MovItem *> *method28(StaticANIObject *ani, int x, int y, int flag1, int *rescount);
+ virtual bool method2C(StaticANIObject *obj, int x, int y);
virtual MessageQueue *method34(StaticANIObject *subj, int xpos, int ypos, int fuzzyMatch, int staticsId);
- virtual int changeCallback();
- virtual int method3C();
- virtual int method44();
+ virtual void changeCallback(MovArr *(*_callback1)(StaticANIObject *ani, Common::Array<MovItem *> *items, signed int counter));
+ virtual bool method3C(StaticANIObject *ani, int flag);
+ virtual bool method44(StaticANIObject *ani, int x, int y);
virtual MessageQueue *doWalkTo(StaticANIObject *subj, int xpos, int ypos, int fuzzyMatch, int staticsId);
- virtual int method50();
+ virtual MessageQueue *method50(StaticANIObject *ani, MovArr *movarr, int staticsId);
double calcDistance(Common::Point *point, MovGraphLink *link, int fuzzyMatch);
+ void calcNodeDistancesAndAngles();
+ bool findClosestLink(int unusedArg, Common::Point *p, MovArr *movarr);
MovGraphNode *calcOffset(int ox, int oy);
+ int getItemIndexByStaticAni(StaticANIObject *ani);
+ Common::Array<MovArr *> *genMovArr(int x, int y, int *arrSize, int flag1, int flag2);
+ void shuffleTree(MovGraphLink *lnk, MovGraphLink *lnk2, Common::Array<MovGraphLink *> &tempObList1, Common::Array<MovGraphLink *> &tempObList2);
+ Common::Array<MovItem *> *calcMovItems(MovArr *movarr1, MovArr *movarr2, int *listCount);
+ void genMovItem(MovItem *movitem, MovGraphLink *grlink, MovArr *movarr1, MovArr *movarr2);
+ bool calcChunk(int idx, int x, int y, MovArr *arr, int a6);
+ MessageQueue *sub1(StaticANIObject *ani, int x, int y, int a5, int x1, int y1, int a8, int a9);
+ MessageQueue *fillMGMinfo(StaticANIObject *ani, MovArr *movarr, int staticsId);
+ void setEnds(MovStep *step1, MovStep *step2);
};
class Movement;
@@ -280,28 +401,39 @@ struct LinkInfo {
MovGraphNode *node;
};
+struct MovInfo1Sub {
+ int subIndex;
+ int x;
+ int y;
+ int distance;
+};
+
struct MovInfo1 {
- int field_0;
+ int index;
Common::Point pt1;
Common::Point pt2;
int distance1;
int distance2;
int subIndex;
int item1Index;
- int items;
+ Common::Array<MovInfo1Sub *> items;
int itemsCount;
int flags;
+
+ MovInfo1() { clear(); }
+ MovInfo1(MovInfo1 *src);
+ void clear();
};
-struct MovGraph2Item {
+struct MovGraph2Item { // 744
int _objectId;
StaticANIObject *_obj;
- MovGraph2ItemSub _subItems[4];
+ MovGraph2ItemSub _subItems[4]; // 184
};
class MovGraph2 : public MovGraph {
public:
- Common::Array<MovGraph2Item *> _items;
+ Common::Array<MovGraph2Item *> _items2;
public:
virtual void addObject(StaticANIObject *obj);
@@ -316,7 +448,7 @@ public:
int getItemSubIndexByMGM(int idx, StaticANIObject *ani);
int getShortSide(MovGraphLink *lnk, int x, int y);
- int findLink(Common::Array<MovGraphLink *> *linkList, MovGraphLink *lnk, Common::Rect *a3, Common::Point *a4);
+ int findLink(Common::Array<MovGraphLink *> *linkList, int idx, Common::Rect *a3, Common::Point *a4);
bool initDirections(StaticANIObject *obj, MovGraph2Item *item);
void buildMovInfo1SubItems(MovInfo1 *movinfo, Common::Array<MovGraphLink *> *linkList, LinkInfo *lnkSrc, LinkInfo *lnkDst);
@@ -326,6 +458,8 @@ public:
MovGraphLink *findLink1(int x, int y, int idx, int fuzzyMatch);
MovGraphLink *findLink2(int x, int y);
double findMinPath(LinkInfo *linkInfoSource, LinkInfo *linkInfoDest, Common::Array<MovGraphLink *> *listObj);
+
+ MessageQueue *genMovement(MovInfo1 *movinfo);
};
class MctlConnectionPoint : public CObject {
@@ -338,6 +472,9 @@ public:
int16 _field_16;
MessageQueue *_messageQueueObj;
int _motionControllerObj;
+
+ MctlConnectionPoint();
+ ~MctlConnectionPoint();
};
} // End of namespace Fullpipe
diff --git a/engines/fullpipe/ngiarchive.cpp b/engines/fullpipe/ngiarchive.cpp
index 5d895c17a0..132f4758d3 100644
--- a/engines/fullpipe/ngiarchive.cpp
+++ b/engines/fullpipe/ngiarchive.cpp
@@ -91,7 +91,7 @@ NGIArchive::NGIArchive(const Common::String &filename) : _ngiFilename(filename)
free(fat);
- g_fullpipe->_currArchive = this;
+ g_fp->_currArchive = this;
debug(0, "NGIArchive::NGIArchive(%s): Located %d files", filename.c_str(), _headers.size());
}
@@ -103,7 +103,7 @@ NGIArchive::~NGIArchive() {
delete it->_value;
}
- g_fullpipe->_currArchive = 0;
+ g_fp->_currArchive = 0;
}
bool NGIArchive::hasFile(const Common::String &name) const {
diff --git a/engines/fullpipe/objectnames.h b/engines/fullpipe/objectnames.h
index 015df727e9..0baf83b175 100644
--- a/engines/fullpipe/objectnames.h
+++ b/engines/fullpipe/objectnames.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -30,15 +30,16 @@ namespace Fullpipe {
#define sO_Grandma "\xc1\xe0\xe1\xf3\xeb\xff" // "БабулÑ"
#define sO_Jar_4 "\xc1\xe0\xed\xea\xe0_4" // "Банка_4"
#define sO_Pool "\xc1\xe0\xf1\xf1\xe5\xe9\xed" // "БаÑÑейн"
-#define sO_TumyTrampie "\xc1\xe0\xf2\xf3\xf2\xe0" // "Батута"
+#define sO_TummyTrampie "\xc1\xe0\xf2\xf3\xf2\xe0" // "Батута"
#define sO_WithoutBoot "\xc1\xe5\xe7 \xe1\xee\xf2\xe8\xed\xea\xe0" // "Без ботинка"
-#define sO_WithoutJug "\xc1\xe5\xe7 \xe3\xee\xf0\xf8\xea\xee\xe2" // "Без горшков"
+#define sO_WithoutJugs "\xc1\xe5\xe7 \xe3\xee\xf0\xf8\xea\xee\xe2" // "Без горшков"
#define sO_WithoutCarpet "\xc1\xe5\xe7 \xea\xee\xe2\xf0\xe8\xea\xe0" // "Без коврика"
#define sO_WithoutCoin "\xc1\xe5\xe7 \xec\xee\xed\xe5\xf2\xfb" // "Без монеты"
#define sO_WithNothing "\xc1\xe5\xe7 \xed\xe8\xf7\xe5\xe3\xee" // "Без ничего"
#define sO_WithoutHandle "\xc1\xe5\xe7 \xf0\xf3\xf7\xea\xe8" // "Без ручки"
#define sO_WithoutStool "\xc1\xe5\xe7 \xf2\xe0\xe1\xf3\xf0\xe5\xf2\xea\xe8" // "Без табуретки"
#define sO_WithoutDrawer "\xc1\xe5\xe7 \xff\xf9\xe8\xea\xe0" // "Без Ñщика"
+#define sO_Nearby "\xc1\xeb\xe8\xe7\xea\xee" // "Близко"
#define sO_Blocked "\xc1\xeb\xee\xea\xe8\xf0\xee\xe2\xe0\xed" // "Блокирован"
#define sO_BlockedShe "\xc1\xeb\xee\xea\xe8\xf0\xee\xe2\xe0\xed\xe0" // "Блокирована"
#define sO_Awaken "\xc1\xee\xe4\xf0\xf1\xf2\xe2\xf3\xe5\xf2" // "БодрÑтвует"
@@ -48,8 +49,14 @@ namespace Fullpipe {
#define sO_InSock "\xc2 \xed\xee\xf1\xea\xe5" // "Ð’ ноÑке"
#define sO_InGlasses "\xc2 \xee\xf7\xea\xe0\xf5" // "В очках"
#define sO_In_14 "\xc2_14" // "Ð’_14"
+#define sO_In_15 "\xc2_15" // "Ð’_15"
+#define sO_In_15_1 "\xc2_15_1" // "Ð’_15_1"
+#define sO_In_15_2 "\xc2_15_2" // "Ð’_15_2"
+#define sO_In_15_3 "\xc2_15_3" // "Ð’_15_3"
+#define sO_In_16 "\xc2_16" // "Ð’_16"
+#define sO_In_32 "\xc2_32" // "Ð’_32"
#define sO_In_32_Lies "\xc2_32 \xeb\xe5\xe6\xe8\xf2" // "В_32 лежит"
-#define sO_In_32_Stands "\xc2_32 \xf2\xee\xf0\xf7\xe8\xf2" // "В_32 торчит"
+#define sO_In_32_Sticks "\xc2_32 \xf2\xee\xf0\xf7\xe8\xf2" // "В_32 торчит"
#define sO_In_33 "\xc2_33" // "Ð’_33"
#define sO_In_7 "\xc2_7" // "Ð’_7"
#define sO_Together "\xc2\xe4\xe2\xee\xe5\xec" // "Вдвоем"
@@ -73,16 +80,17 @@ namespace Fullpipe {
#define sO_Jug "\xc3\xee\xf0\xf8\xee\xea" // "Горшок"
#define sO_Strolling "\xc3\xf3\xeb\xff\xe5\xf2" // "ГулÑет"
#define sO_Yes "\xc4\xe0" // "Да"
+#define sO_FarAway "\xc4\xe0\xeb\xe5\xea\xee" // "Далеко"
#define sO_Girl "\xc4\xe5\xe2\xee\xf7\xea\xe0" // "Девочка"
#define sO_Elephantine "\xc4\xe5\xe2\xee\xf7\xea\xe0-\xf1\xeb\xee\xed\xe8\xea" // "Девочка-Ñлоник"
#define sO_Grandpa "\xc4\xe5\xe4\xf3\xf8\xea\xe0" // "Дедушка"
-#define sO_Plank_25 "\xc4\xee\xf1\xea\xe0_25" // "ДоÑка_25"
+#define sO_Board_25 "\xc4\xee\xf1\xea\xe0_25" // "ДоÑка_25"
#define sO_Plank_34 "\xc4\xee\xf1\xea\xe0_34" // "ДоÑка_34"
-#define sO_DudeJumped "\xc4\xff\xe4\xff \xef\xf0\xfb\xe3\xe0\xeb" // "ДÑÐ´Ñ Ð¿Ñ€Ñ‹Ð³Ð°Ð»"
+#define sO_DudeHasJumped "\xc4\xff\xe4\xff \xef\xf0\xfb\xe3\xe0\xeb" // "ДÑÐ´Ñ Ð¿Ñ€Ñ‹Ð³Ð°Ð»"
#define sO_Dude "\xc4\xff\xe4\xff" // "ДÑдÑ"
#define sO_GuvTheDrawer "\xc4\xff\xe4\xff-\xff\xf9\xe8\xea" // "ДÑдÑ-Ñщик"
#define sO_DudeSwinged "\xc4\xff\xe4\xff_\xea\xe0\xf2\xe0\xeb\xf1\xff" // "ДÑдÑ_каталÑÑ"
-#define sO_Eats "\xc5\xf1\xf2" // "ЕÑÑ‚"
+#define sO_IsEating "\xc5\xf1\xf2" // "ЕÑÑ‚"
#define sO_Present "\xc5\xf1\xf2\xfc" // "ЕÑть"
#define sO_CloseThing1 "\xc7\xe0\xea\xf0\xfb\xe2\xe0\xe5\xec\xee\xe5 1" // "Закрываемое 1"
#define sO_CloseThing2 "\xc7\xe0\xea\xf0\xfb\xe2\xe0\xe5\xec\xee\xe5 2" // "Закрываемое 2"
@@ -90,15 +98,15 @@ namespace Fullpipe {
#define sO_CloseThing "\xc7\xe0\xea\xf0\xfb\xe2\xe0\xe5\xec\xee\xe5" // "Закрываемое"
#define sO_Closed "\xc7\xe0\xea\xf0\xfb\xf2" // "Закрыт"
#define sO_ClosedWithBoot "\xc7\xe0\xea\xf0\xfb\xf2\xe0 \xf1 \xe1\xee\xf2\xe8\xed\xea\xee\xec" // "Закрыта Ñ Ð±Ð¾Ñ‚Ð¸Ð½ÐºÐ¾Ð¼"
-#define sO_ClosedShe "\xc7\xe0\xea\xf0\xfb\xf2\xe0" // "Закрыта"
+#define sO_IsClosed "\xc7\xe0\xea\xf0\xfb\xf2\xe0" // "Закрыта"
#define sO_HalfFull "\xc7\xe0\xef\xee\xeb\xed\xe5\xed \xed\xe0\xef\xee\xeb\xee\xe2\xe8\xed\xf3" // "Заполнен наполовину"
#define sO_Full "\xc7\xe0\xef\xee\xeb\xed\xe5\xed \xf6\xe5\xeb\xe8\xea\xee\xec" // "Заполнен целиком"
#define sO_MirroredTo "\xc7\xe5\xf0\xea\xe0\xeb\xfc\xed\xe0\xff \xea" // "Ð—ÐµÑ€ÐºÐ°Ð»ÑŒÐ½Ð°Ñ Ðº"
-#define sO_Playing "\xc8\xe3\xf0\xe0\xe5\xf2" // "Играет"
+#define sO_IsPlaying "\xc8\xe3\xf0\xe0\xe5\xf2" // "Играет"
#define sO_Tub "\xca\xe0\xe4\xea\xe0" // "Кадка"
#define sO_Cactus "\xca\xe0\xea\xf2\xf3\xf1" // "КактуÑ"
-#define sO_SwingingWithBoot "\xca\xe0\xf2\xe0\xe5\xf2\xf1\xff \xf1 \xe1\xee\xf2\xe8\xed\xea\xee\xec" // "КатаетÑÑ Ñ Ð±Ð¾Ñ‚Ð¸Ð½ÐºÐ¾Ð¼"
-#define sO_Swinging "\xca\xe0\xf2\xe0\xe5\xf2\xf1\xff" // "КатаетÑÑ"
+#define sO_IsSwingingWithBoot "\xca\xe0\xf2\xe0\xe5\xf2\xf1\xff \xf1 \xe1\xee\xf2\xe8\xed\xea\xee\xec" // "КатаетÑÑ Ñ Ð±Ð¾Ñ‚Ð¸Ð½ÐºÐ¾Ð¼"
+#define sO_IsSwinging "\xca\xe0\xf2\xe0\xe5\xf2\xf1\xff" // "КатаетÑÑ"
#define sO_Swingie "\xca\xe0\xf7\xe5\xeb\xe5\xed\xff" // "КачеленÑ"
#define sO_LiftButtons "\xca\xed\xee\xef\xea\xe8 \xeb\xe8\xf4\xf2\xe0" // "Кнопки лифта"
#define sO_Carpet_35 "\xca\xee\xe2\xf0\xe8\xea_35" // "Коврик_35"
@@ -110,7 +118,7 @@ namespace Fullpipe {
#define sO_LeftPipe_29 "\xcb\xe5\xe2\xe0\xff \xf2\xf0\xf3\xe1\xe0_29" // "Ð›ÐµÐ²Ð°Ñ Ñ‚Ñ€ÑƒÐ±Ð°_29"
#define sO_LeftPipe_30 "\xcb\xe5\xe2\xe0\xff \xf2\xf0\xf3\xe1\xe0_30" // "Ð›ÐµÐ²Ð°Ñ Ñ‚Ñ€ÑƒÐ±Ð°_30"
#define sO_LeftPipe_37 "\xcb\xe5\xe2\xe0\xff \xf2\xf0\xf3\xe1\xe0_37" // "Ð›ÐµÐ²Ð°Ñ Ñ‚Ñ€ÑƒÐ±Ð°_37"
-#define sO_StarsDown_24 "\xcb\xe5\xf1\xf2\xed\xe8\xf6\xe0 \xe2\xed\xe8\xe7_24" // "ЛеÑтница вниз_24"
+#define sO_StairsDown_24 "\xcb\xe5\xf1\xf2\xed\xe8\xf6\xe0 \xe2\xed\xe8\xe7_24" // "ЛеÑтница вниз_24"
#define sO_StairsUp_8 "\xcb\xe5\xf1\xf2\xed\xe8\xf6\xe0 \xf1\xe2\xe5\xf0\xf5\xf3_8" // "ЛеÑтница Ñверху_8"
#define sO_Stairway "\xcb\xe5\xf1\xf2\xed\xe8\xf6\xe0" // "ЛеÑтница"
#define sO_Fliers "\xcb\xe5\xf2\xf3\xed\xfb" // "Летуны"
@@ -135,7 +143,7 @@ namespace Fullpipe {
#define sO_NotGrown "\xcd\xe5 \xe2\xfb\xf0\xee\xf1" // "Ðе выроÑ"
#define sO_DidNotCrackEgg "\xcd\xe5 \xea\xee\xeb\xee\xeb \xff\xe9\xf6\xee" // "Ðе колол Ñйцо"
#define sO_NotFallen "\xcd\xe5 \xef\xe0\xe4\xe0\xeb" // "Ðе падал"
-#define sO_NotAvailable "\xcd\xe5\xe4\xee\xf1\xf2\xf3\xef\xed\xe0" // "ÐедоÑтупна"
+#define sO_IsNotAvailable "\xcd\xe5\xe4\xee\xf1\xf2\xf3\xef\xed\xe0" // "ÐедоÑтупна"
#define sO_CannotTake "\xcd\xe5\xeb\xfc\xe7\xff \xe2\xe7\xff\xf2\xfc" // "ÐÐµÐ»ÑŒÐ·Ñ Ð²Ð·Ñть"
#define sO_No "\xcd\xe5\xf2" // "Ðет"
#define sO_LowerHatch_23 "\xcd\xe8\xe6\xed\xe8\xe9 \xeb\xfe\xea_23" // "Ðижний люк_23"
@@ -148,7 +156,7 @@ namespace Fullpipe {
#define sO_ClockAxis "\xce\xf1\xfc \xf7\xe0\xf1\xee\xe2" // "ОÑÑŒ чаÑов"
#define sO_Opened "\xce\xf2\xea\xf0\xfb\xf2" // "Открыт"
#define sO_OpenedWithBoot "\xce\xf2\xea\xf0\xfb\xf2\xe0 \xf1 \xe1\xee\xf2\xe8\xed\xea\xee\xec" // "Открыта Ñ Ð±Ð¾Ñ‚Ð¸Ð½ÐºÐ¾Ð¼"
-#define sO_OpenedShe "\xce\xf2\xea\xf0\xfb\xf2\xe0" // "Открыта"
+#define sO_IsOpened "\xce\xf2\xea\xf0\xfb\xf2\xe0" // "Открыта"
#define sO_WeirdWacko "\xce\xf2\xec\xee\xf0\xee\xe6\xe5\xed\xed\xfb\xe9" // "Отмороженный"
#define sO_NotPresent "\xce\xf2\xf1\xf3\xf2\xf1\xf2\xe2\xf3\xe5\xf2" // "ОтÑутÑтвует"
#define sO_Error "\xce\xf8\xe8\xe1\xea\xe0" // "Ошибка"
@@ -161,17 +169,17 @@ namespace Fullpipe {
#define sO_FullPipe "\xcf\xee\xeb\xed\xe0\xff \xd2\xf0\xf3\xe1\xe0" // "ÐŸÐ¾Ð»Ð½Ð°Ñ Ð¢Ñ€ÑƒÐ±Ð°"
#define sO_RightStairs_9 "\xcf\xf0\xe0\xe2\xe0\xff \xeb\xe5\xf1\xf2\xed\xe8\xf6\xe0_9" // "ÐŸÑ€Ð°Ð²Ð°Ñ Ð»ÐµÑтница_9"
#define sO_RightPipe_17 "\xcf\xf0\xe0\xe2\xe0\xff \xf2\xf0\xf3\xe1\xe0_17" // "ÐŸÑ€Ð°Ð²Ð°Ñ Ñ‚Ñ€ÑƒÐ±Ð°_17"
-#define sO_Available "\xcf\xf0\xe8\xf1\xf3\xf2\xf1\xf2\xe2\xf3\xe5\xf2" // "ПриÑутÑтвует"
+#define sO_IsPresent "\xcf\xf0\xe8\xf1\xf3\xf2\xf1\xf2\xe2\xf3\xe5\xf2" // "ПриÑутÑтвует"
#define sO_GulpedEgg "\xcf\xf0\xee\xe3\xeb\xee\xf7\xe5\xed\xed\xee\xe5 \xff\xe9\xf6\xee" // "Проглоченное Ñйцо"
#define sO_GulpedEggs "\xcf\xf0\xee\xe3\xeb\xee\xf7\xe5\xed\xed\xfb\xe5 \xff\xe9\xf6\xe0" // "Проглоченные Ñйца"
#define sO_BellyInflater "\xcf\xf3\xe7\xee\xe4\xf3\xe2" // "Пузодув"
#define sO_Empty "\xcf\xf3\xf1\xf2" // "ПуÑÑ‚"
#define sO_EmptyShe "\xcf\xf3\xf1\xf2\xe0\xff" // "ПуÑтаÑ"
#define sO_WayToPipe "\xcf\xf3\xf2\xfc \xea \xf2\xf0\xf3\xe1\xe5" // "Путь к трубе"
-#define sO_Drinking "\xcf\xfc\xe5\xf2" // "Пьет"
-#define sO_BrokenInPieces "\xd0\xe0\xe7\xe1\xe8\xf2\xe0" // "Разбита"
+#define sO_IsDrinking "\xcf\xfc\xe5\xf2" // "Пьет"
+#define sO_Broken "\xd0\xe0\xe7\xe1\xe8\xf2\xe0" // "Разбита"
#define sO_Unblocked "\xd0\xe0\xe7\xe1\xeb\xee\xea\xe8\xf0\xee\xe2\xe0\xed" // "Разблокирован"
-#define sO_Unfolded "\xd0\xe0\xe7\xe2\xe5\xf0\xed\xf3\xf2" // "Развернут"
+#define sO_Unconvoluted "\xd0\xe0\xe7\xe2\xe5\xf0\xed\xf3\xf2" // "Развернут"
#define sO_Jawcrucnher "\xd0\xee\xf2\xee\xf5\xf0\xf3\xf1" // "РотохруÑ"
#define sO_UsherHand "\xd0\xf3\xea\xe0 \xc1\xe8\xeb\xe5\xf2\xe5\xf0\xf8\xe8" // "Рука Билетерши"
#define sO_LeverHandle_23 "\xd0\xf3\xea\xee\xff\xf2\xea\xe0 \xf0\xfb\xf7\xe0\xe3\xe0_23" // "РукоÑтка рычага_23"
@@ -184,8 +192,8 @@ namespace Fullpipe {
#define sO_WithPlunger "\xd1 \xe2\xe0\xed\xf2\xf3\xe7\xee\xec" // "С вантузом"
#define sO_WithJug "\xd1 \xe3\xee\xf0\xf8\xea\xee\xec" // "С горшком"
#define sO_WithGum "\xd1 \xe6\xe2\xe0\xf7\xea\xee\xe9" // "С жвачкой"
-#define sO_WithShovel "\xd1 \xeb\xee\xef\xe0\xf2\xee\xe9" // "С лопатой"
-#define sO_WithTiny "\xd1 \xec\xe0\xeb\xfb\xec" // "С малым"
+#define sO_WithSpade "\xd1 \xeb\xee\xef\xe0\xf2\xee\xe9" // "С лопатой"
+#define sO_WithSmall "\xd1 \xec\xe0\xeb\xfb\xec" // "С малым"
#define sO_WithHammer "\xd1 \xec\xee\xeb\xee\xf2\xea\xee\xec" // "С молотком"
#define sO_WithCoin "\xd1 \xec\xee\xed\xe5\xf2\xee\xe9" // "С монетой"
#define sO_WithSock "\xd1 \xed\xee\xf1\xea\xee\xec" // "С ноÑком"
@@ -197,19 +205,19 @@ namespace Fullpipe {
#define sO_Sugar "\xd1\xe0\xf5\xe0\xf0\xee\xea" // "Сахарок"
#define sO_Convoluted "\xd1\xe2\xe5\xf0\xed\xf3\xf2" // "Свернут"
#define sO_IsFree "\xd1\xe2\xee\xe1\xee\xe4\xed\xe0" // "Свободна"
-#define sO_Sitting "\xd1\xe8\xe4\xe8\xf2" // "Сидит"
-#define sO_Laughing "\xd1\xec\xe5\xe5\xf2\xf1\xff" // "СмеетÑÑ"
-#define sO_WithEveryone "\xd1\xee \xe2\xf1\xe5\xec\xe8" // "Со вÑеми"
-#define sO_WithMop "\xd1\xee \xf8\xe2\xe0\xe1\xf0\xee\xe9" // "Со шваброй"
+#define sO_IsSitting "\xd1\xe8\xe4\xe8\xf2" // "Сидит"
+#define sO_IsLaughing "\xd1\xec\xe5\xe5\xf2\xf1\xff" // "СмеетÑÑ"
+#define sO_WithAll "\xd1\xee \xe2\xf1\xe5\xec\xe8" // "Со вÑеми"
+#define sO_WithSwab "\xd1\xee \xf8\xe2\xe0\xe1\xf0\xee\xe9" // "Со шваброй"
#define sO_WithHose "\xd1\xee \xf8\xeb\xe0\xed\xe3\xee\xec" // "Со шлангом"
-#define sO_WithBrush "\xd1\xee \xf9\xe5\xf2\xea\xee\xe9" // "Со щеткой"
-#define sO_Sleeping "\xd1\xef\xe8\xf2" // "Спит"
+#define sO_WithBroom "\xd1\xee \xf9\xe5\xf2\xea\xee\xe9" // "Со щеткой"
+#define sO_IsSleeping "\xd1\xef\xe8\xf2" // "Спит"
#define sO_OnRight "\xd1\xef\xf0\xe0\xe2\xe0" // "Справа"
-#define sO_StandsInBoots "\xd1\xf2\xee\xe8\xf2 \xe2 \xe1\xee\xf2\xe8\xed\xea\xe0\xf5" // "Стоит в ботинках"
-#define sO_StandsInCorner "\xd1\xf2\xee\xe8\xf2 \xe2 \xf3\xe3\xeb\xf3" // "Стоит в углу"
+#define sO_IsStandingInBoots "\xd1\xf2\xee\xe8\xf2 \xe2 \xe1\xee\xf2\xe8\xed\xea\xe0\xf5" // "Стоит в ботинках"
+#define sO_IsStandingInCorner "\xd1\xf2\xee\xe8\xf2 \xe2 \xf3\xe3\xeb\xf3" // "Стоит в углу"
#define sO_Guardian "\xd1\xf2\xee\xf0\xee\xe6" // "Сторож"
#define sO_Guard_1 "\xd1\xf2\xf0\xe0\xe6 1" // "Страж 1"
-#define sO_Gurad_2 "\xd1\xf2\xf0\xe0\xe6 2" // "Страж 2"
+#define sO_Guard_2 "\xd1\xf2\xf0\xe0\xe6 2" // "Страж 2"
#define sO_Guard_3 "\xd1\xf2\xf0\xe0\xe6 3" // "Страж 3"
#define sO_Stool_34 "\xd2\xe0\xe1\xf3\xf0\xe5\xf2_34" // "Табурет_34"
#define sO_Pipe_9 "\xd2\xf0\xf3\xe1\xe0_9" // "Труба_9"
@@ -217,16 +225,17 @@ namespace Fullpipe {
#define sO_Pedestal_17 "\xd2\xf3\xec\xe1\xe0_17" // "Тумба_17"
#define sO_Pedestal_33 "\xd2\xf3\xec\xe1\xe0_33" // "Тумба_33"
#define sO_NearDudesStairs "\xd3 \xc4\xff\xe4\xe8 \xed\xe0 \xeb\xe5\xf1\xf2\xed\xe8\xf6\xe5" // "У ДÑди на леÑтнице"
-#define sO_NearDude "\xd3 \xc4\xff\xe4\xe8" // "У ДÑди"
+#define sO_DudeHas "\xd3 \xc4\xff\xe4\xe8" // "У ДÑди"
#define sO_NearPipeWithStool "\xd3 \xf2\xf0\xf3\xe1\xfb \xf1 \xf2\xe0\xe1\xf3\xf0\xe5\xf2\xea\xee\xe9" // "У трубы Ñ Ñ‚Ð°Ð±ÑƒÑ€ÐµÑ‚ÐºÐ¾Ð¹"
#define sO_NearPipe "\xd3 \xf2\xf0\xf3\xe1\xfb" // "У трубы"
#define sO_Janitors "\xd3\xe1\xee\xf0\xf9\xe8\xea\xe8" // "Уборщики"
-#define sO_Janitress "\xd3\xe1\xee\xf0\xf9\xe8\xf6\xe0" // "Уборщица"
-#define sO_Gone "\xd3\xe5\xf5\xe0\xeb\xe0" // "Уехала"
+#define sO_Maid "\xd3\xe1\xee\xf0\xf9\xe8\xf6\xe0" // "Уборщица"
+#define sO_IsGone "\xd3\xe5\xf5\xe0\xeb\xe0" // "Уехала"
+#define sO_FallenTwice "\xd3\xef\xe0\xeb \xe4\xe2\xe0" // "Упал два"
#define sO_FallenOnce "\xd3\xef\xe0\xeb \xf0\xe0\xe7" // "Упал раз"
-#define sO_FallenBrush "\xd3\xef\xe0\xeb\xe0 \xf9\xe5\xf2\xea\xe0" // "Упала щетка"
+#define sO_BrushHasFallen "\xd3\xef\xe0\xeb\xe0 \xf9\xe5\xf2\xea\xe0" // "Упала щетка"
#define sO_NotBroken "\xd6\xe5\xeb\xe0" // "Цела"
-#define sO_ScratchingBelly "\xd7\xe5\xf8\xe5\xf2 \xef\xf3\xe7\xee" // "Чешет пузо"
+#define sO_IsScratchingBelly "\xd7\xe5\xf8\xe5\xf2 \xef\xf3\xe7\xee" // "Чешет пузо"
#define sO_Level0 "\xdd\xf2\xe0\xe6 0" // "Этаж 0"
#define sO_Level1 "\xdd\xf2\xe0\xe6 1" // "Этаж 1"
#define sO_Level2 "\xdd\xf2\xe0\xe6 2" // "Этаж 2"
diff --git a/engines/fullpipe/objects.h b/engines/fullpipe/objects.h
index a12851e63b..1849bcb96e 100644
--- a/engines/fullpipe/objects.h
+++ b/engines/fullpipe/objects.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -82,6 +82,8 @@ class GameVar : public CObject {
public:
GameVar();
+ virtual ~GameVar();
+
virtual bool load(MfcArchive &file);
GameVar *getSubVarByName(const char *name);
bool setSubVarAsInt(const char *name, int value);
diff --git a/engines/fullpipe/scene.cpp b/engines/fullpipe/scene.cpp
index cc93363786..1247d9380e 100644
--- a/engines/fullpipe/scene.cpp
+++ b/engines/fullpipe/scene.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -92,6 +92,9 @@ bool SceneTag::load(MfcArchive &file) {
SceneTag::~SceneTag() {
free(_tag);
+
+ delete _scene;
+ delete _field_4;
}
void SceneTag::loadScene() {
@@ -114,7 +117,7 @@ void SceneTag::loadScene() {
delete file;
- g_fullpipe->_currArchive = 0;
+ g_fp->_currArchive = 0;
free(fname);
free(archname);
@@ -129,6 +132,30 @@ Scene::Scene() {
_sceneName = 0;
}
+Scene::~Scene() {
+ delete _soundList;
+ delete _shadows;
+ delete _palette;
+
+ // _faObjlist is not used
+
+ for (uint i = 0; i < _messageQueueList.size(); i++)
+ delete _messageQueueList[i];
+
+ _messageQueueList.clear();
+
+ for (uint i = 0; i < _staticANIObjectList1.size(); i++)
+ delete _staticANIObjectList1[i];
+
+ _staticANIObjectList1.clear();
+
+ delete _libHandle;
+
+ // delete _field_BC;
+
+ free(_sceneName);
+}
+
bool Scene::load(MfcArchive &file) {
debug(5, "Scene::load()");
@@ -146,7 +173,7 @@ bool Scene::load(MfcArchive &file) {
int aniNum = file.readUint16LE();
char *aniname = genFileName(0, aniNum, "ani");
- Common::SeekableReadStream *f = g_fullpipe->_currArchive->createReadStreamForMember(aniname);
+ Common::SeekableReadStream *f = g_fp->_currArchive->createReadStreamForMember(aniname);
StaticANIObject *ani = new StaticANIObject();
@@ -168,7 +195,7 @@ bool Scene::load(MfcArchive &file) {
int qNum = file.readUint16LE();
char *qname = genFileName(0, qNum, "qu");
- Common::SeekableReadStream *f = g_fullpipe->_currArchive->createReadStreamForMember(qname);
+ Common::SeekableReadStream *f = g_fp->_currArchive->createReadStreamForMember(qname);
MfcArchive archive(f);
archive.readUint16LE(); // Skip 2 bytes
@@ -191,7 +218,7 @@ bool Scene::load(MfcArchive &file) {
assert(0);
}
- _libHandle = g_fullpipe->_currArchive;
+ _libHandle = g_fp->_currArchive;
if (_picObjList.size() > 0 && _bgname && strlen(_bgname) > 1) {
char fname[260];
@@ -216,10 +243,10 @@ bool Scene::load(MfcArchive &file) {
char *slsname = genFileName(0, _sceneId, "sls");
- if (g_fullpipe->_soundEnabled) {
+ if (g_fp->_soundEnabled) {
_soundList = new SoundList();
- if (g_fullpipe->_flgSoundList) {
+ if (g_fp->_flgSoundList) {
char *nlname = genFileName(17, _sceneId, "nl");
_soundList->loadFile(slsname, nlname);
@@ -242,26 +269,26 @@ bool Scene::load(MfcArchive &file) {
void Scene::initStaticANIObjects() {
for (uint i = 0; i < _staticANIObjectList1.size(); i++)
- ((StaticANIObject *)_staticANIObjectList1[i])->initMovements();
+ _staticANIObjectList1[i]->initMovements();
}
void Scene::init() {
_x = 0;
_y = 0;
- g_fullpipe->_sceneRect.moveTo(0, 0);
+ g_fp->_sceneRect.moveTo(0, 0);
for (uint i = 0; i < _picObjList.size(); i++)
((PictureObject *)_picObjList[i])->clearFlags();
for (uint i = 0; i < _staticANIObjectList1.size(); i++)
- ((StaticANIObject *)_staticANIObjectList1[i])->clearFlags();
+ _staticANIObjectList1[i]->clearFlags();
if (_staticANIObjectList2.size() != _staticANIObjectList1.size()) {
_staticANIObjectList2.clear();
- for (PtrList::iterator s = _staticANIObjectList1.begin(); s != _staticANIObjectList1.end(); ++s)
- _staticANIObjectList2.push_back(*s);
+ for (uint i = 0; i < _staticANIObjectList1.size(); i++)
+ _staticANIObjectList2.push_back(_staticANIObjectList1[i]);
}
}
@@ -274,35 +301,33 @@ StaticANIObject *Scene::getAniMan() {
}
StaticANIObject *Scene::getStaticANIObject1ById(int obj, int a3) {
- for (PtrList::iterator s = _staticANIObjectList1.begin(); s != _staticANIObjectList1.end(); ++s) {
- StaticANIObject *o = (StaticANIObject *)*s;
- if (o->_id == obj && (a3 == -1 || o->_okeyCode == a3))
- return o;
+ for (uint i = 0; i < _staticANIObjectList1.size(); i++) {
+ if (_staticANIObjectList1[i]->_id == obj && (a3 == -1 || _staticANIObjectList1[i]->_okeyCode == a3))
+ return _staticANIObjectList1[i];
}
return 0;
}
StaticANIObject *Scene::getStaticANIObject1ByName(char *name, int a3) {
- for (uint n = 0; n < _staticANIObjectList1.size(); n++) {
- StaticANIObject *o = (StaticANIObject *)_staticANIObjectList1[n];
- if (!strcmp(o->_objectName, name) && (a3 == -1 || o->_okeyCode == a3))
- return o;
+ for (uint i = 0; i < _staticANIObjectList1.size(); i++) {
+ if (!strcmp(_staticANIObjectList1[i]->_objectName, name) && (a3 == -1 || _staticANIObjectList1[i]->_okeyCode == a3))
+ return _staticANIObjectList1[i];
}
return 0;
}
void Scene::deleteStaticANIObject(StaticANIObject *obj) {
- for (uint n = 0; n < _staticANIObjectList1.size(); n++)
- if ((StaticANIObject *)_staticANIObjectList1[n] == obj) {
- _staticANIObjectList1.remove_at(n);
+ for (uint i = 0; i < _staticANIObjectList1.size(); i++)
+ if (_staticANIObjectList1[i] == obj) {
+ _staticANIObjectList1.remove_at(i);
break;
}
- for (uint n = 0; n < _staticANIObjectList2.size(); n++)
- if ((StaticANIObject *)_staticANIObjectList2[n] == obj) {
- _staticANIObjectList2.remove_at(n);
+ for (uint i = 0; i < _staticANIObjectList2.size(); i++)
+ if (_staticANIObjectList2[i] == obj) {
+ _staticANIObjectList2.remove_at(i);
break;
}
}
@@ -327,6 +352,11 @@ void Scene::setPictureObjectsFlag4() {
}
}
+void Scene::stopAllSounds() {
+ for (int i = 0; i < _soundList->getCount(); i++)
+ _soundList->getSoundByIndex(i)->stop();
+}
+
PictureObject *Scene::getPictureObjectById(int objId, int flags) {
for (uint i = 1; i < _picObjList.size(); i++) {
if (((PictureObject *)_picObjList[i])->_id == objId && ((PictureObject *)_picObjList[i])->_okeyCode == flags)
@@ -358,16 +388,16 @@ void Scene::deletePictureObject(PictureObject *obj) {
MessageQueue *Scene::getMessageQueueById(int messageId) {
for (uint i = 0; i < _messageQueueList.size(); i++)
- if (((MessageQueue *)_messageQueueList[i])->_dataId == messageId)
- return (MessageQueue *)_messageQueueList[i];
+ if (_messageQueueList[i]->_dataId == messageId)
+ return _messageQueueList[i];
return 0;
}
MessageQueue *Scene::getMessageQueueByName(char *name) {
for (uint i = 0; i < _messageQueueList.size(); i++)
- if (!strcmp(((MessageQueue *)_messageQueueList[i])->_queueName, name))
- return (MessageQueue *)_messageQueueList[i];
+ if (!strcmp(_messageQueueList[i]->_queueName, name))
+ return _messageQueueList[i];
return 0;
}
@@ -398,7 +428,7 @@ void Scene::preloadMovements(GameVar *var) {
}
void Scene::initObjectCursors(const char *varname) {
- GameVar *cursorsVar = g_fullpipe->getGameLoaderGameVar()->getSubVarByName(varname)->getSubVarByName("CURSORS");
+ GameVar *cursorsVar = g_fp->getGameLoaderGameVar()->getSubVarByName(varname)->getSubVarByName("CURSORS");
if (!cursorsVar || !cursorsVar->_subVars)
return;
@@ -417,10 +447,10 @@ void Scene::initObjectCursors(const char *varname) {
}
}
- g_fullpipe->_minCursorId = minId;
- g_fullpipe->_maxCursorId = maxId;
+ g_fp->_minCursorId = minId;
+ g_fp->_maxCursorId = maxId;
- g_fullpipe->_objectIdCursors.resize(maxId - minId + 1);
+ g_fp->_objectIdCursors.resize(maxId - minId + 1);
for (GameVar *sub = cursorsVar->_subVars; sub; sub = sub->_nextVarObj) {
GameObject *obj = getPictureObjectByName(sub->_varName, -1);
@@ -431,57 +461,142 @@ void Scene::initObjectCursors(const char *varname) {
PictureObject *pic = getGameLoaderInventory()->getScene()->getPictureObjectByName(sub->_value.stringValue, -1);
if (obj && pic)
- g_fullpipe->_objectIdCursors[obj->_id - minId] = pic->_id;
+ g_fp->_objectIdCursors[obj->_id - minId] = pic->_id;
}
}
bool Scene::compareObjPriority(const void *p1, const void *p2) {
- if (((const StaticANIObject *)p1)->_priority > ((const StaticANIObject *)p2)->_priority)
+ if (((const GameObject *)p1)->_priority > ((const GameObject *)p2)->_priority)
return true;
return false;
}
-void Scene::objectList_sortByPriority(PtrList &list) {
- Common::sort(list.begin(), list.end(), Scene::compareObjPriority);
+void Scene::objectList_sortByPriority(Common::Array<StaticANIObject *> &list, bool skipFirst) {
+ if (skipFirst) {
+ Common::Array<StaticANIObject *>::iterator s = list.begin();
+
+ ++s;
+
+ Common::sort(s, list.end(), Scene::compareObjPriority);
+ } else {
+ Common::sort(list.begin(), list.end(), Scene::compareObjPriority);
+ }
+}
+
+void Scene::objectList_sortByPriority(Common::Array<PictureObject *> &list, bool skipFirst) {
+ if (skipFirst) {
+ Common::Array<PictureObject *>::iterator s = list.begin();
+
+ ++s;
+
+ Common::sort(s, list.end(), Scene::compareObjPriority);
+ } else {
+ Common::sort(list.begin(), list.end(), Scene::compareObjPriority);
+ }
}
void Scene::draw() {
- debug(0, ">>>>> Scene::draw()");
+ debug(6, ">>>>> Scene::draw()");
updateScrolling();
+ // Clean previous stuff
+ g_fp->_backgroundSurface.fillRect(Common::Rect(0, 0, 800, 600), 0);
+
drawContent(60000, 0, true);
objectList_sortByPriority(_staticANIObjectList2);
- for (PtrList::iterator s = _staticANIObjectList2.begin(); s != _staticANIObjectList2.end(); ++s) {
- ((StaticANIObject *)*s)->draw2();
- }
+ for (uint i = 0; i < _staticANIObjectList2.size(); i++)
+ _staticANIObjectList2[i]->draw2();
int priority = -1;
- for (PtrList::iterator s = _staticANIObjectList2.begin(); s != _staticANIObjectList2.end(); ++s) {
- drawContent(((StaticANIObject *)*s)->_priority, priority, false);
- ((StaticANIObject *)*s)->draw();
+ for (uint i = 0; i < _staticANIObjectList2.size(); i++) {
+ drawContent(_staticANIObjectList2[i]->_priority, priority, false);
+ _staticANIObjectList2[i]->draw();
- priority = ((StaticANIObject *)*s)->_priority;
+ priority = _staticANIObjectList2[i]->_priority;
}
drawContent(-1, priority, false);
}
void Scene::updateScrolling() {
- debug(0, "STUB Scene::updateScrolling()");
+ if (_messageQueueId && !_x && !_y) {
+ MessageQueue *mq = g_fp->_globalMessageQueueList->getMessageQueueById(_messageQueueId);
+
+ if (mq)
+ mq->update();
+
+ _messageQueueId = 0;
+ }
+
+ if (_x || _y) {
+ int offsetX = 0;
+ int offsetY = 0;
+
+ if (_x < 0) {
+ if (!g_fp->_sceneRect.left && !(((PictureObject *)_picObjList[0])->_flags & 2))
+ _x = 0;
+
+ if (_x <= -g_fp->_scrollSpeed) {
+ offsetX = -g_fp->_scrollSpeed;
+ _x += g_fp->_scrollSpeed;
+ }
+ } else if (_x >= g_fp->_scrollSpeed) {
+ offsetX = g_fp->_scrollSpeed;
+ _x -= g_fp->_scrollSpeed;
+ } else {
+ _x = 0;
+ }
+
+ if (_y > 0) {
+ offsetY = g_fp->_scrollSpeed;
+ _y -= g_fp->_scrollSpeed;
+ }
+
+ if (_y < 0) {
+ offsetY -= g_fp->_scrollSpeed;
+ _y += g_fp->_scrollSpeed;
+ }
+
+ g_fp->_sceneRect.translate(offsetX, offsetY);
+ }
+
+ updateScrolling2();
}
void Scene::updateScrolling2() {
- warning("STUB Scene::updateScrolling2()");
+ if (_picObjList.size()) {
+ Common::Point point;
+ int offsetY = 0;
+ int offsetX = 0;
+
+ ((PictureObject *)_picObjList[0])->getDimensions(&point);
+
+ int flags = ((PictureObject *)_picObjList[0])->_flags;
+
+ if (g_fp->_sceneRect.left < 0 && !(flags & 2))
+ offsetX = -g_fp->_sceneRect.left;
+
+ if (g_fp->_sceneRect.top < 0 && !(flags & 0x20))
+ offsetY = -g_fp->_sceneRect.top;
+
+ if (g_fp->_sceneRect.right > point.x - 1 && g_fp->_sceneRect.left > 0 && !(flags & 2))
+ offsetX = point.x - g_fp->_sceneRect.right - 1;
+
+ if (g_fp->_sceneRect.bottom > point.y - 1 && g_fp->_sceneRect.top > 0 && !(flags & 0x20))
+ offsetY = point.y - g_fp->_sceneRect.bottom - 1;
+
+ g_fp->_sceneRect.translate(offsetX, offsetY);
+ }
}
StaticANIObject *Scene::getStaticANIObjectAtPos(int x, int y) {
StaticANIObject *res = 0;
for (uint i = 0; i < _staticANIObjectList1.size(); i++) {
- StaticANIObject *p = (StaticANIObject *)_staticANIObjectList1[i];
+ StaticANIObject *p = _staticANIObjectList1[i];
int pixel;
if ((p->_field_8 & 0x100) && (p->_flags & 4) &&
@@ -525,10 +640,10 @@ int Scene::getPictureObjectIdAtPos(int x, int y) {
}
void Scene::update(int counterdiff) {
- debug(0, "Scene::update(%d)", counterdiff);
+ debug(6, "Scene::update(%d)", counterdiff);
- for (PtrList::iterator s = _staticANIObjectList2.begin(); s != _staticANIObjectList2.end(); ++s)
- ((StaticANIObject *)*s)->update(counterdiff);
+ for (uint i = 0; i < _staticANIObjectList2.size(); i++)
+ _staticANIObjectList2[i]->update(counterdiff);
}
void Scene::drawContent(int minPri, int maxPri, bool drawBg) {
@@ -536,13 +651,13 @@ void Scene::drawContent(int minPri, int maxPri, bool drawBg) {
return;
if (_palette) {
- g_fullpipe->_globalPalette = _palette->_data;
+ g_fp->_globalPalette = _palette->_data;
}
debug(8, "Scene::drawContent(>%d, <%d, %d)", minPri, maxPri, drawBg);
if (_picObjList.size() > 2) { // We need to z-sort them
- objectList_sortByPriority(_picObjList);
+ objectList_sortByPriority(_picObjList, true);
}
if (minPri == -1 && _picObjList.size())
@@ -569,7 +684,7 @@ void Scene::drawContent(int minPri, int maxPri, bool drawBg) {
debug(8, "w2: %d h2:%d", point.x, point.y);
- int bgStX = g_fullpipe->_sceneRect.left % point.x;
+ int bgStX = g_fp->_sceneRect.left % point.x;
if (bgStX < 0)
bgStX += point.x;
@@ -577,7 +692,7 @@ void Scene::drawContent(int minPri, int maxPri, bool drawBg) {
int bgNumX = bgStX / width;
int bgOffsetX = bgStX % width;
- int bgStY = g_fullpipe->_sceneRect.top % point.y;
+ int bgStY = g_fp->_sceneRect.top % point.y;
if (bgStY < 0)
bgStY += point.y;
@@ -585,12 +700,12 @@ void Scene::drawContent(int minPri, int maxPri, bool drawBg) {
int bgNumY = bgStY / height;
int bgOffsetY = bgStY % height;
- int bgPosX = g_fullpipe->_sceneRect.left - bgOffsetX;
+ int bgPosX = g_fp->_sceneRect.left - bgOffsetX;
- if (bgPosX < g_fullpipe->_sceneRect.right - 1) {
+ if (bgPosX < g_fp->_sceneRect.right - 1) {
while (1) {
int v25 = bgNumY;
- for (int y = g_fullpipe->_sceneRect.top - bgOffsetY; y < g_fullpipe->_sceneRect.bottom - 1;) {
+ for (int y = g_fp->_sceneRect.top - bgOffsetY; y < g_fp->_sceneRect.bottom - 1;) {
BigPicture *v27 = _bigPictureArray[bgNumX][v25];
v27->draw(bgPosX, y, 0, 0);
y += v27->getDimensions(&point)->y;
@@ -603,7 +718,7 @@ void Scene::drawContent(int minPri, int maxPri, bool drawBg) {
}
}
_bigPictureArray[bgNumX][0]->getDimensions(&point);
- int v32 = point.x + bgPosX;
+ int oldx = point.x + bgPosX;
bgPosX += point.x;
bgNumX++;
@@ -612,7 +727,7 @@ void Scene::drawContent(int minPri, int maxPri, bool drawBg) {
break;
bgNumX = 0;
}
- if (v32 >= g_fullpipe->_sceneRect.right - 1)
+ if (oldx >= g_fp->_sceneRect.right - 1)
break;
}
}
@@ -637,22 +752,22 @@ void Scene::drawContent(int minPri, int maxPri, bool drawBg) {
int height = point.y;
if (obj->_flags & 8) {
- while (objX > g_fullpipe->_sceneRect.right) {
+ while (objX > g_fp->_sceneRect.right) {
objX -= width;
obj->setOXY(objX, objY);
}
- for (int j = width + objX; width + objX < g_fullpipe->_sceneRect.left; j = width + objX) {
+ for (int j = width + objX; width + objX < g_fp->_sceneRect.left; j = width + objX) {
objX = j;
obj->setOXY(j, objY);
}
}
if (obj->_flags & 0x10) {
- while (objY > g_fullpipe->_sceneRect.bottom) {
+ while (objY > g_fp->_sceneRect.bottom) {
objY -= height;
obj->setOXY(objX, objY);
}
- for (int j = objY + height; objY + height < g_fullpipe->_sceneRect.top; j = objY + height) {
+ for (int j = objY + height; objY + height < g_fp->_sceneRect.top; j = objY + height) {
objY = j;
obj->setOXY(objX, j);
}
@@ -661,12 +776,12 @@ void Scene::drawContent(int minPri, int maxPri, bool drawBg) {
obj->draw();
if (obj->_flags & 2) {
- if (objX > g_fullpipe->_sceneRect.left) {
+ if (objX > g_fp->_sceneRect.left) {
obj->setOXY(objX - width, objY);
obj->draw();
obj->setOXY(objX, objY);
}
- if (width + objX < g_fullpipe->_sceneRect.right) {
+ if (width + objX < g_fp->_sceneRect.right) {
obj->setOXY(width + objX, objY);
obj->draw();
obj->setOXY(objX, objY);
@@ -674,12 +789,12 @@ void Scene::drawContent(int minPri, int maxPri, bool drawBg) {
}
if (obj->_flags & 0x20) {
- if (objY > g_fullpipe->_sceneRect.top) {
+ if (objY > g_fp->_sceneRect.top) {
obj->setOXY(objX, objY - height);
obj->draw();
obj->setOXY(objX, objY);
}
- if (height + objY < g_fullpipe->_sceneRect.bottom) {
+ if (height + objY < g_fp->_sceneRect.bottom) {
obj->setOXY(objX, height + objY);
obj->draw();
obj->setOXY(objX, objY);
diff --git a/engines/fullpipe/scene.h b/engines/fullpipe/scene.h
index db0da5db31..1e2dae81fe 100644
--- a/engines/fullpipe/scene.h
+++ b/engines/fullpipe/scene.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -31,10 +31,10 @@ class MessageQueue;
class Scene : public Background {
public:
- PtrList _staticANIObjectList1;
- PtrList _staticANIObjectList2;
- PtrList _messageQueueList;
- PtrList _faObjectList;
+ Common::Array<StaticANIObject *> _staticANIObjectList1;
+ Common::Array<StaticANIObject *> _staticANIObjectList2;
+ Common::Array<MessageQueue *> _messageQueueList;
+ // PtrList _faObjectList; // not used
Shadows *_shadows;
SoundList *_soundList;
int16 _sceneId;
@@ -44,6 +44,7 @@ class Scene : public Background {
public:
Scene();
+ virtual ~Scene();
virtual bool load(MfcArchive &file);
@@ -77,14 +78,17 @@ class Scene : public Background {
void initObjectCursors(const char *name);
+ void stopAllSounds();
+
private:
static bool compareObjPriority(const void *p1, const void *p2);
- void objectList_sortByPriority(PtrList &list);
+ void objectList_sortByPriority(Common::Array<StaticANIObject *> &list, bool skipFirst = false);
+ void objectList_sortByPriority(Common::Array<PictureObject *> &list, bool skipFirst = false);
};
class SceneTag : public CObject {
public:
- int _field_4;
+ CObject *_field_4;
char *_tag;
Scene *_scene;
int16 _sceneId;
diff --git a/engines/fullpipe/scenes.cpp b/engines/fullpipe/scenes.cpp
index 40d9f21afb..13c653ad09 100644
--- a/engines/fullpipe/scenes.cpp
+++ b/engines/fullpipe/scenes.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -23,39 +23,20 @@
#include "fullpipe/fullpipe.h"
#include "fullpipe/utils.h"
-#include "fullpipe/gfx.h"
#include "fullpipe/objects.h"
#include "fullpipe/statics.h"
-#include "fullpipe/scene.h"
#include "fullpipe/gameloader.h"
-#include "fullpipe/sound.h"
#include "fullpipe/motion.h"
#include "fullpipe/input.h"
-#include "fullpipe/messages.h"
#include "fullpipe/behavior.h"
#include "fullpipe/constants.h"
#include "fullpipe/objectnames.h"
#include "fullpipe/scenes.h"
-#include "fullpipe/modal.h"
#include "fullpipe/interaction.h"
namespace Fullpipe {
-int defaultUpdateCursor();
-void setElevatorButton(const char *name, int state);
-
-int sceneIntro_updateCursor();
-void sceneIntro_initScene(Scene *sc);
-int sceneHandlerIntro(ExCommand *cmd);
-
-void scene01_fixEntrance();
-void scene01_initScene(Scene *sc, int entrance);
-int sceneHandler01(ExCommand *cmd);
-
-void sceneDbgMenu_initScene(Scene *sc);
-int sceneHandlerDbgMenu(ExCommand *cmd);
-
Vars::Vars() {
sceneIntro_aniin1man = 0;
sceneIntro_needSleep = true;
@@ -71,6 +52,427 @@ Vars::Vars() {
scene01_picSc01Osk = 0;
scene01_picSc01Osk2 = 0;
+ scene02_guvTheDrawer = 0;
+ scene02_boxDelay = 0;
+ scene02_boxOpen = false;
+
+ scene03_eggeater = 0;
+ scene03_domino = 0;
+
+ scene04_bottle = 0;
+ scene04_hand = 0;
+ scene04_plank = 0;
+ scene04_clock = 0;
+ scene04_hand = 0;
+ scene04_spring = 0;
+ scene04_mamasha = 0;
+ scene04_boot = 0;
+ scene04_speaker = 0;
+
+ scene04_ladder = 0;
+ scene04_coinPut = false;
+ scene04_soundPlaying = false;
+ scene04_dynamicPhaseIndex = 0;
+ scene04_dudeOnLadder = false;
+
+ scene04_sceneClickX = 0;
+ scene04_sceneClickY = 0;
+
+ scene04_dudePosX = 0;
+ scene04_dudePosY = 0;
+
+ scene04_bottleIsTaken = false;
+ scene04_kozyawkaOnLadder = false;
+ scene04_walkingKozyawka = 0;
+ scene04_bottleWeight = 0;
+ scene04_var07 = false;
+ scene04_ladderClickable = false;
+ scene04_handIsDown = false;
+ scene04_dudeInBottle = false;
+ scene04_kozHeadRaised = false;
+ scene04_bottleIsDropped = false;
+ scene04_bigBallIn = false;
+ scene04_bigBallCounter = 0;
+ scene04_bigBallFromLeft = false;
+ scene04_speakerVariant = 0;
+ scene04_speakerPhase = 0;
+ scene04_clockCanGo = false;
+ scene04_objectIsTaken = false;
+ scene04_springOffset = 0;
+ scene04_lastKozyawka = 0;
+ scene04_springDelay = 0;
+ scene04_bottleY = 0;
+ scene04_ladderOffset = 0;
+
+ scene05_handle = 0;
+ scene05_wacko = 0;
+ scene05_bigHatch = 0;
+ scene05_wackoTicker = 0;
+ scene05_handleFlipper = 0;
+ scene05_floatersTicker = 0;
+
+ scene06_manX = 0;
+ scene06_manY = 0;
+ scene06_ballX = 0;
+ scene06_ballY = 0;
+ scene06_mumsy = 0;
+ scene06_someBall = 0;
+ scene06_invHandle = 0;
+ scene06_liftButton = 0;
+ scene06_ballDrop = 0;
+ scene06_arcadeEnabled = false;
+ scene06_aimingBall = false;
+ scene06_currentBall = 0;
+ scene06_ballInHands = 0;
+ scene06_flyingBall = 0;
+ scene06_numBallsGiven = 0;
+ scene06_mumsyNumBalls = 0;
+ scene06_eggieTimeout = 0;
+ scene06_eggieDirection = true;
+ scene06_mumsyGotBall = 0;
+ scene06_ballDeltaX = 0;
+ scene06_ballDeltaY = 0;
+ scene06_sceneClickX = 0;
+ scene06_sceneClickY = 0;
+ scene06_mumsyPos = 0;
+ scene06_mumsyJumpBk = 0;
+ scene06_mumsyJumpFw = 0;
+ scene06_mumsyJumpBkPercent = 0;
+ scene06_mumsyJumpFwPercent = 0;
+
+ scene07_lukeAnim = 0;
+ scene07_lukePercent = 0;
+ scene07_plusMinus = 0;
+
+ scene08_batuta = 0;
+ scene08_vmyats = 0;
+ scene08_clock = 0;
+ scene08_inAir = false;
+ scene08_flyingUp = false;
+ scene08_onBelly = false;
+ scene08_stairsOffset = -37;
+ scene08_snoringCountdown = -1;
+ scene08_inArcade = false;
+ scene08_stairsVisible = true;
+ scene08_manOffsetY = 0;
+
+ scene09_flyingBall = 0;
+ scene09_numSwallenBalls = 0;
+ scene09_gulper = 0;
+ scene09_spitter = 0;
+ scene09_grit = 0;
+ scene09_dudeY = 0;
+ scene09_gulperIsPresent = true;
+ scene09_dudeIsOnLadder = false;
+ scene09_interactingHanger = -1;
+ scene09_intHangerPhase = -1;
+ scene09_intHangerMaxPhase = -1000;
+ scene09_numMovingHangers = 0;
+ scene09_clickY = 0;
+ scene09_hangerOffsets[0].x = 0;
+ scene09_hangerOffsets[0].y = -15;
+ scene09_hangerOffsets[1].x = 15;
+ scene09_hangerOffsets[1].y = 0;
+ scene09_hangerOffsets[2].x = 0;
+ scene09_hangerOffsets[2].y = 0;
+ scene09_hangerOffsets[3].x = 0;
+ scene09_hangerOffsets[3].y = 0;
+
+ scene10_gum = 0;
+ scene10_packet = 0;
+ scene10_packet2 = 0;
+ scene10_inflater = 0;
+ scene10_ladder = 0;
+ scene10_hasGum = 0;
+
+ scene11_swingie = 0;
+ scene11_boots = 0;
+ scene11_dudeOnSwing = 0;
+ scene11_hint = 0;
+ scene11_arcadeIsOn = false;
+ scene11_scrollIsEnabled = false;
+ scene11_scrollIsMaximized = false;
+ scene11_hintCounter = 0;
+ scene11_swingieScreenEdge = 0;
+ scene11_crySound = 0;
+ scene11_swingAngle = 1.0;
+ scene11_swingOldAngle = 1.0;
+ scene11_swingSpeed = 1.0;
+ scene11_swingAngleDiff = 1.0;
+ scene11_swingInertia = 0.0;
+ scene11_swingCounter = 0;
+ scene11_swingCounterPrevTurn = 0;
+ scene11_swingDirection = 0;
+ scene11_swingDirectionPrevTurn = 0;
+ scene11_swingIsSwinging = false;
+ scene11_swingieStands = false;
+ scene11_dudeX = 0;
+ scene11_dudeY = 0;
+ scene11_swingMaxAngle = 45;
+
+ scene12_fly = 0;
+ scene12_flyCountdown = 0;
+
+ scene13_whirlgig = 0;
+ scene13_guard = 0;
+ scene13_handleR = 0;
+ scene13_handleL = 0;
+ scene13_bridge = 0;
+ scene13_guardDirection = false;
+ scene13_dudeX = 0;
+
+ scene14_grandma = 0;
+ scene14_sceneDeltaX = 0;
+ scene14_sceneDeltaY = 0;
+ scene14_arcadeIsOn = false;
+ scene14_dudeIsKicking = false;
+ scene14_ballIsFlying = false;
+ scene14_dudeCanKick = false;
+ scene14_sceneDiffX = 0;
+ scene14_sceneDiffY = 0;
+ scene14_pink = 0;
+ scene14_flyingBall = 0;
+ scene14_balls.clear();
+ scene14_grandmaIsHere = false;
+ scene14_dudeX = 0;
+ scene14_dudeY = 0;
+ scene14_grandmaX = 0;
+ scene14_grandmaY = 0;
+ scene14_dude2X = 0;
+ scene14_ballDeltaX = 0;
+ scene14_ballDeltaY = 0;
+ scene14_ballX = 0;
+ scene14_ballY = 0;
+ scene14_hitsLeft = 0;
+
+ scene15_chantingCountdown = 0;
+ scene15_plusminus = 0;
+ scene15_ladder = 0;
+ scene15_boot = 0;
+
+ scene16_figures.clear();
+ scene16_walkingBoy = 0;
+ scene16_walkingGirl = 0;
+ scene16_walkingCount = 0;
+ scene16_wire = 0;
+ scene16_mug = 0;
+ scene16_jettie = 0;
+ scene16_boot = 0;
+ scene16_girlIsLaughing = false;
+ scene16_sound = 0;
+ scene16_placeIsOccupied = false;
+
+ scene17_flyState = 0;
+ scene17_sugarIsShown = false;
+ scene17_sceneOldEdgeX = 0;
+ scene17_flyCountdown = 0;
+ scene17_hand = 0;
+ scene17_handPhase = false;
+ scene17_sceneEdgeX = 0;
+
+ scene18_inScene18p1 = false;
+ scene18_whirlgig = 0;
+ scene18_wheelCenterX = 0;
+ scene18_wheelCenterY = 0;
+ scene18_bridgeIsConvoluted = false;
+ scene18_whirlgigMovMum = 0;
+ scene18_girlIsSwinging = false;
+ scene18_rotationCounter = 0;
+ scene18_manY = 0;
+ scene18_wheelFlipper = false;
+ scene18_wheelIsTurning = true;
+ scene18_kidIsOnWheel = -1;
+ scene18_boyIsOnWheel = 0;
+ scene18_girlIsOnWheel = 0;
+ scene18_boyJumpedOff = true;
+ scene18_jumpDistance = -1;
+ scene18_jumpAngle = -1;
+ scene18_manIsReady = false;
+ scene18_enteredTrubaRight = false;
+ scene18_manWheelPos = 0;
+ scene18_manWheelPosTo = -1;
+ scene18_kidWheelPos = 0;
+ scene18_kidWheelPosTo = 0;
+ scene18_boy = 0;
+ scene18_girl = 0;
+ scene18_domino = 0;
+ scene18_boyJumpX = 290;
+ scene18_boyJumpY = -363;
+ scene18_girlJumpX = 283;
+ scene18_girlJumpY = -350;
+
+ scene19_enteredTruba3 = false;
+
+ scene20_fliesCountdown = 0;
+ scene20_grandma = 0;
+
+ scene21_giraffeBottom = 0;
+ scene21_giraffeBottomX = 0;
+ scene21_giraffeBottomY = 0;
+ scene21_pipeIsOpen = false;
+ scene21_wigglePos = 0.0;
+ scene21_wiggleTrigger = 0;
+
+ scene22_bag = 0;
+ scene22_giraffeMiddle = 0;
+ scene22_dudeIsOnStool = false;
+ scene22_interactionIsDisabled = false;
+ scene22_craneIsOut = true;
+ scene22_numBagFalls = 1;
+
+ scene23_calend0 = 0;
+ scene23_calend1 = 0;
+ scene23_calend2 = 0;
+ scene23_calend3 = 0;
+ scene23_topReached = false;
+ scene23_isOnStool = false;
+ scene23_someVar = 0;
+ scene23_giraffeTop = 0;
+ scene23_giraffee = 0;
+
+ scene24_jetIsOn = false;
+ scene24_flowIsLow = false;
+ scene24_waterIsOn = false;
+ scene24_water = 0;
+ scene24_jet = 0;
+ scene24_drop = 0;
+
+ scene25_water = 0;
+ scene25_board = 0;
+ scene25_drop = 0;
+ scene25_dudeIsOnBoard = false;
+ scene25_waterIsPresent = false;
+ scene25_boardIsSelectable = false;
+ scene25_beardersAreThere = false;
+ scene25_beardersCounter = 0;
+ scene25_bearders.clear();
+ scene25_sneezeFlipper = false;
+
+ scene26_chhi = 0;
+ scene26_drop = 0;
+ scene26_sockPic = 0;
+ scene26_sock = 0;
+ scene26_activeVent = 0;
+
+ scene27_hitZone = 0;
+ scene27_driver = 0;
+ scene27_maid = 0;
+ scene27_batHandler = 0;
+ scene27_driverHasVent = true;
+ scene27_bat = 0;
+ scene27_dudeIsAiming = false;
+ scene27_maxPhaseReached = false;
+ scene27_wipeIsNeeded = false;
+ scene27_driverPushedButton = false;
+ scene27_numLostBats = 0;
+ scene27_knockCount = 0;
+ scene27_aimStartX = 0;
+ scene27_aimStartY = 0;
+ scene27_launchPhase = 0;
+
+ scene28_fliesArePresent = true;
+ scene28_beardedDirection = true;
+ scene28_darkeningObject = 0;
+ scene28_lighteningObject = 0;
+ scene28_headDirection = false;
+ scene28_headBeardedFlipper = false;
+ scene28_lift6inside = false;
+
+ scene29_porter = 0;
+ scene29_shooter1 = 0;
+ scene29_shooter2 = 0;
+ scene29_ass = 0;
+ scene29_manIsRiding = false;
+ scene29_arcadeIsOn = false;
+ scene29_reachedFarRight = false;
+ scene29_rideBackEnabled = false;
+ scene29_shootCountdown = 0;
+ scene29_shootDistance = 75;
+ scene29_manIsHit = 0;
+ scene29_scrollSpeed = 0;
+ scene29_scrollingDisabled = 0;
+ scene29_hitBall = 0;
+ scene29_manX = 0;
+ scene29_manY = 0;
+
+ scene30_leg = 0;
+ scene30_liftFlag = 1;
+
+ scene31_chantingCountdown = 0;
+ scene31_cactus = 0;
+ scene31_plusMinus = 0;
+
+ scene32_flagIsWaving = false;
+ scene32_flagNeedsStopping = false;
+ scene32_dudeIsSitting = false;
+ scene32_cactusCounter = -1;
+ scene32_dudeOnLadder = false;
+ scene32_cactusIsGrowing = false;
+ scene32_flag = 0;
+ scene32_cactus = 0;
+ scene32_massOrange = 0;
+ scene32_massBlue = 0;
+ scene32_massGreen = 0;
+ scene32_button = 0;
+
+ scene33_mug = 0;
+ scene33_jettie = 0;
+ scene33_cube = 0;
+ scene33_cubeX = -1;
+ scene33_handleIsDown = false;
+
+ for (int i = 0; i < 9; i++) {
+ scene33_ventsX[i] = 0;
+ scene33_ventsState[i] = 0;
+ }
+
+ scene34_cactus = 0;
+ scene34_vent = 0;
+ scene34_hatch = 0;
+ scene34_boot = 0;
+ scene34_dudeClimbed = false;
+ scene34_dudeOnBoard = false;
+ scene34_dudeOnCactus = false;
+ scene34_fliesCountdown = 0;
+
+ scene35_hose = 0;
+ scene35_bellyInflater = 0;
+ scene35_flowCounter = 0;
+ scene35_fliesCounter = 0;
+
+ scene36_rotohrust = 0;
+ scene36_scissors = 0;
+
+ scene37_rings.clear();
+ scene37_lastDudeX = -1;
+ scene37_cursorIsLocked = 0;
+ scene37_plusMinus1 = 0;
+ scene37_plusMinus2 = 0;
+ scene37_plusMinus3 = 0;
+ scene37_soundFlipper = 0;
+ scene37_dudeX = 0;
+
+ scene38_boss = 0;
+ scene38_tally = 0;
+ scene38_shorty = 0;
+ scene38_domino0 = 0;
+ scene38_dominos = 0;
+ scene38_domino1 = 0;
+ scene38_bottle = 0;
+ scene38_bossCounter = 0;
+ scene38_lastBossAnim = 0;
+ scene38_bossAnimCounter = 0;
+ scene38_tallyCounter = 0;
+ scene38_lastTallyAnim = 0;
+ scene38_tallyAnimCounter = 0;
+ scene38_shortyCounter = 0;
+ scene38_lastShortyAnim = 0;
+ scene38_shortyAnimCounter = 0;
+
+ sceneFinal_var01 = 0;
+ sceneFinal_var02 = 0;
+ sceneFinal_var03 = 0;
+
selector = 0;
}
@@ -78,19 +480,43 @@ static int scenes[] = {
SC_1, SC_2, SC_3, SC_4, SC_5, SC_6, SC_7, SC_8, SC_9, SC_10,
SC_11, SC_12, SC_13, SC_14, SC_15, SC_16, SC_17, SC_18, SC_19, SC_20,
SC_21, SC_22, SC_23, SC_24, SC_25, SC_26, SC_27, SC_28, SC_29, SC_30,
- SC_31, SC_32, SC_33, SC_34, SC_35, SC_36, SC_37, SC_38, SC_DBGMENU
+ SC_31, SC_32, SC_33, SC_34, SC_35, SC_36, SC_37, SC_38, SC_FINAL1, SC_DBGMENU
+};
+
+static int scenesD[] = {
+ PIC_SCD_1, PIC_SCD_2, PIC_SCD_3, PIC_SCD_4, PIC_SCD_5, PIC_SCD_6, PIC_SCD_7, PIC_SCD_8, PIC_SCD_9, PIC_SCD_10,
+ PIC_SCD_11, PIC_SCD_12, PIC_SCD_13, PIC_SCD_14, PIC_SCD_15, PIC_SCD_16, PIC_SCD_17, PIC_SCD_18, PIC_SCD_19, PIC_SCD_20,
+ PIC_SCD_21, PIC_SCD_22, PIC_SCD_23, PIC_SCD_24, PIC_SCD_25, PIC_SCD_26, PIC_SCD_27, PIC_SCD_28, PIC_SCD_29, PIC_SCD_30,
+ PIC_SCD_31, PIC_SCD_32, PIC_SCD_33, PIC_SCD_34, PIC_SCD_35, PIC_SCD_36, PIC_SCD_37, PIC_SCD_38, PIC_SCD_FIN, 0
};
int FullpipeEngine::convertScene(int scene) {
if (!scene || scene >= SC_1)
return scene;
- if (scene < 1 || scene > 39)
+ if (scene < 1 || scene > 40)
return SC_1;
return scenes[scene - 1];
}
+int FullpipeEngine::getSceneEntrance(int scene) {
+ for (int i = 0; i < 40; i++)
+ if (scenes[i] == scene)
+ return scenesD[i];
+
+ return 0;
+}
+
+int FullpipeEngine::getSceneFromTag(int tag) {
+ for (int i = 0; i < ARRAYSIZE(scenes); i++) {
+ if (scenes[i] == tag)
+ return i + 1;
+ }
+
+ return 1;
+}
+
bool FullpipeEngine::sceneSwitcher(EntranceInfo *entrance) {
GameVar *sceneVar;
Common::Point sceneDim;
@@ -164,10 +590,8 @@ bool FullpipeEngine::sceneSwitcher(EntranceInfo *entrance) {
scene->setPictureObjectsFlag4();
- for (PtrList::iterator s = scene->_staticANIObjectList1.begin(); s != scene->_staticANIObjectList1.end(); ++s) {
- StaticANIObject *o = (StaticANIObject *)*s;
- o->setFlags(o->_flags & 0xFE7F);
- }
+ for (uint i = 0; i < scene->_staticANIObjectList1.size(); i++)
+ scene->_staticANIObjectList1[i]->_flags &= 0xFE7F;
PictureObject *p = accessScene(SC_INV)->getPictureObjectById(PIC_INV_MENU, 0);
p->setFlags(p->_flags & 0xFFFB);
@@ -199,7 +623,6 @@ bool FullpipeEngine::sceneSwitcher(EntranceInfo *entrance) {
_updateCursorCallback = defaultUpdateCursor;
break;
-#if 0
case SC_2:
sceneVar = _gameLoader->_gameVar->getSubVarByName("SC_2");
scene->preloadMovements(sceneVar);
@@ -219,7 +642,7 @@ bool FullpipeEngine::sceneSwitcher(EntranceInfo *entrance) {
scene->initObjectCursors("SC_3");
setSceneMusicParameters(sceneVar);
addMessageHandler(sceneHandler03, 2);
- j_Scene_sc03_sub_40F160(scene);
+ scene03_setEaterState();
_updateCursorCallback = scene03_updateCursor;
break;
@@ -252,7 +675,7 @@ bool FullpipeEngine::sceneSwitcher(EntranceInfo *entrance) {
_behaviorManager->initBehavior(scene, sceneVar);
scene->initObjectCursors("SC_6");
setSceneMusicParameters(sceneVar);
- sub_415300();
+ scene06_initMumsy();
insertMessageHandler(sceneHandler06, 2, 2);
_updateCursorCallback = scene06_updateCursor;
break;
@@ -275,7 +698,7 @@ bool FullpipeEngine::sceneSwitcher(EntranceInfo *entrance) {
_behaviorManager->initBehavior(scene, sceneVar);
scene->initObjectCursors("SC_8");
setSceneMusicParameters(sceneVar);
- sub_416890();
+ scene08_setupMusic();
addMessageHandler(sceneHandler08, 2);
_updateCursorCallback = scene08_updateCursor;
break;
@@ -310,7 +733,7 @@ bool FullpipeEngine::sceneSwitcher(EntranceInfo *entrance) {
scene->initObjectCursors("SC_11");
setSceneMusicParameters(sceneVar);
insertMessageHandler(sceneHandler11, 2, 2);
- scene11_sub_41A980();
+ scene11_setupMusic();
_updateCursorCallback = scene11_updateCursor;
break;
@@ -344,7 +767,7 @@ bool FullpipeEngine::sceneSwitcher(EntranceInfo *entrance) {
scene->initObjectCursors("SC_14");
setSceneMusicParameters(sceneVar);
insertMessageHandler(sceneHandler14, 2, 2);
- scene14_sub_41D2B0();
+ scene14_setupMusic();
_updateCursorCallback = scene14_updateCursor;
break;
@@ -378,19 +801,21 @@ bool FullpipeEngine::sceneSwitcher(EntranceInfo *entrance) {
scene->initObjectCursors("SC_17");
setSceneMusicParameters(sceneVar);
addMessageHandler(sceneHandler17, 2);
- scene17_sub_41F060();
+ scene17_restoreState();
_updateCursorCallback = scene17_updateCursor;
break;
case SC_18:
- sub_40E1B0();
+ scene18_setupEntrance();
sceneVar = _gameLoader->_gameVar->getSubVarByName("SC_18");
scene->preloadMovements(sceneVar);
- sub_4062D0();
- if (dword_476C38)
+ g_fp->stopAllSounds();
+
+ if (g_vars->scene18_inScene18p1)
scene18_initScene1(scene);
else
scene18_initScene2(scene);
+
_behaviorManager->initBehavior(scene, sceneVar);
scene->initObjectCursors("SC_18");
setSceneMusicParameters(sceneVar);
@@ -399,27 +824,32 @@ bool FullpipeEngine::sceneSwitcher(EntranceInfo *entrance) {
break;
case SC_19:
- if (!g_scene3) {
- g_scene3 = accessScene(SC_18);
- getGameLoader()->loadScene(SC_18);
- scene18_initScene2(g_scene3);
- sub_40C5F0();
- scene19_sub_420B10(g_scene3, entrance->field_4);
- dword_476C38 = 1;
+ if (!g_fp->_scene3) {
+ g_fp->_scene3 = accessScene(SC_18);
+ g_fp->_gameLoader->loadScene(SC_18);
+
+ scene18_initScene2(g_fp->_scene3);
+ scene18_preload();
+ scene19_setMovements(g_fp->_scene3, entrance->_field_4);
+
+ g_vars->scene18_inScene18p1 = true;
}
- sub_40C650();
+
+ scene19_preload();
sceneVar = _gameLoader->_gameVar->getSubVarByName("SC_19");
scene->preloadMovements(sceneVar);
- sub_4062D0();
- if (dword_476C38)
+ g_fp->stopAllSounds();
+
+ if (g_vars->scene18_inScene18p1)
scene18_initScene1(scene);
else
scene19_initScene2();
+
_behaviorManager->initBehavior(scene, sceneVar);
scene->initObjectCursors("SC_19");
setSceneMusicParameters(sceneVar);
addMessageHandler(sceneHandler19, 2);
- scene19_sub_4211D0(scene);
+ scene19_setSugarState(scene);
_updateCursorCallback = scene19_updateCursor;
break;
@@ -452,7 +882,7 @@ bool FullpipeEngine::sceneSwitcher(EntranceInfo *entrance) {
_behaviorManager->initBehavior(scene, sceneVar);
scene->initObjectCursors("SC_22");
setSceneMusicParameters(sceneVar);
- scene22_sub_4228A0();
+ scene22_setBagState();
insertMessageHandler(sceneHandler22, 2, 2);
_updateCursorCallback = scene22_updateCursor;
break;
@@ -465,7 +895,7 @@ bool FullpipeEngine::sceneSwitcher(EntranceInfo *entrance) {
scene->initObjectCursors("SC_23");
setSceneMusicParameters(sceneVar);
insertMessageHandler(sceneHandler23, 2, 2);
- scene23_sub_423B00();
+ scene23_setGiraffeState();
_updateCursorCallback = scene23_updateCursor;
break;
@@ -477,19 +907,19 @@ bool FullpipeEngine::sceneSwitcher(EntranceInfo *entrance) {
scene->initObjectCursors("SC_24");
setSceneMusicParameters(sceneVar);
addMessageHandler(sceneHandler24, 2);
- scene24_sub_423DD0();
+ scene24_setPoolState();
_updateCursorCallback = defaultUpdateCursor;
break;
case SC_25:
sceneVar = _gameLoader->_gameVar->getSubVarByName("SC_25");
scene->preloadMovements(sceneVar);
- scene25_initScene(scene, entrance->field_4);
+ scene25_initScene(scene, entrance->_field_4);
_behaviorManager->initBehavior(scene, sceneVar);
scene->initObjectCursors("SC_25");
setSceneMusicParameters(sceneVar);
addMessageHandler(sceneHandler25, 2);
- scene25_sub_4253B0(scene, entrance->field_4);
+ scene25_setupWater(scene, entrance->_field_4);
_updateCursorCallback = scene25_updateCursor;
break;
@@ -501,7 +931,7 @@ bool FullpipeEngine::sceneSwitcher(EntranceInfo *entrance) {
scene->initObjectCursors("SC_26");
setSceneMusicParameters(sceneVar);
insertMessageHandler(sceneHandler26, 2, 2);
- scene26_sub_426140(scene);
+ scene26_setupDrop(scene);
_updateCursorCallback = scene26_updateCursor;
break;
@@ -541,7 +971,7 @@ bool FullpipeEngine::sceneSwitcher(EntranceInfo *entrance) {
case SC_30:
sceneVar = _gameLoader->_gameVar->getSubVarByName("SC_30");
scene->preloadMovements(sceneVar);
- scene30_initScene(scene, entrance->field_4);
+ scene30_initScene(scene, entrance->_field_4);
_behaviorManager->initBehavior(scene, sceneVar);
scene->initObjectCursors("SC_30");
setSceneMusicParameters(sceneVar);
@@ -568,7 +998,7 @@ bool FullpipeEngine::sceneSwitcher(EntranceInfo *entrance) {
scene->initObjectCursors("SC_32");
setSceneMusicParameters(sceneVar);
insertMessageHandler(sceneHandler32, 2, 2);
- scene32_sub_42C5C0();
+ scene32_setupMusic();
_updateCursorCallback = scene32_updateCursor;
break;
@@ -580,7 +1010,7 @@ bool FullpipeEngine::sceneSwitcher(EntranceInfo *entrance) {
scene->initObjectCursors("SC_33");
setSceneMusicParameters(sceneVar);
insertMessageHandler(sceneHandler33, 2, 2);
- scene33_sub_42CEF0();
+ scene33_setupMusic();
_updateCursorCallback = scene33_updateCursor;
break;
@@ -592,7 +1022,7 @@ bool FullpipeEngine::sceneSwitcher(EntranceInfo *entrance) {
scene->initObjectCursors("SC_34");
setSceneMusicParameters(sceneVar);
insertMessageHandler(sceneHandler34, 2, 2);
- scene34_sub_42DEE0();
+ scene34_initBeh();
_updateCursorCallback = scene34_updateCursor;
break;
@@ -643,14 +1073,13 @@ bool FullpipeEngine::sceneSwitcher(EntranceInfo *entrance) {
case SC_FINAL1:
sceneVar = _gameLoader->_gameVar->getSubVarByName("SC_FINAL1");
scene->preloadMovements(sceneVar);
- sceneFinal1_initScene();
+ sceneFinal_initScene();
_behaviorManager->initBehavior(scene, sceneVar);
scene->initObjectCursors("SC_FINAL1");
setSceneMusicParameters(sceneVar);
- addMessageHandler(sceneHandlerFinal1, 2);
- _updateCursorCallback = sceneFinal1_updateCursor;
+ addMessageHandler(sceneHandlerFinal, 2);
+ _updateCursorCallback = sceneFinal_updateCursor;
break;
-#endif
case SC_DBGMENU:
sceneVar = _gameLoader->_gameVar->getSubVarByName("SC_DBGMENU");
@@ -662,920 +1091,421 @@ bool FullpipeEngine::sceneSwitcher(EntranceInfo *entrance) {
break;
default:
- _behaviorManager->initBehavior(0, 0);
+ error("Unknown scene %d", entrance->_sceneId);
break;
}
return true;
}
-void setElevatorButton(const char *name, int state) {
- GameVar *var = g_fullpipe->getGameLoaderGameVar()->getSubVarByName("OBJSTATES")->getSubVarByName(sO_LiftButtons);
-
- if (var)
- var->setSubVarAsInt(name, state);
-}
-
-void global_messageHandler_KickStucco() {
- warning("STUB: global_messageHandler_KickStucco()");
-}
+int defaultUpdateCursor() {
+ g_fp->updateCursorCommon();
-void global_messageHandler_KickMetal() {
- warning("STUB: global_messageHandler_KickMetal()");
+ return g_fp->_cursorId;
}
-int global_messageHandler1(ExCommand *cmd) {
- debug(0, "global_messageHandler1: %d %d", cmd->_messageKind, cmd->_messageNum);
-
- if (cmd->_excFlags & 0x10000) {
- if (cmd->_messageNum == MV_MAN_TOLADDER)
- cmd->_messageNum = MV_MAN_TOLADDER2;
- if (cmd->_messageNum == MV_MAN_STARTLADDER)
- cmd->_messageNum = MV_MAN_STARTLADDER2;
- if (cmd->_messageNum == MV_MAN_GOLADDER)
- cmd->_messageNum = MV_MAN_GOLADDER2;
- if (cmd->_messageNum == MV_MAN_STOPLADDER)
- cmd->_messageNum = MV_MAN_STOPLADDER2;
- }
+void FullpipeEngine::updateMapPiece(int mapId, int update) {
+ for (int i = 0; i < 200; i++) {
+ int hiWord = (_mapTable[i] >> 16) & 0xffff;
- if (g_fullpipe->_inputDisabled) {
- if (cmd->_messageKind == 17) {
- switch (cmd->_messageNum) {
- case 29:
- case 30:
- case 36:
- case 106:
- cmd->_messageKind = 0;
- break;
- default:
- break;
- }
+ if (hiWord == mapId) {
+ _mapTable[i] |= update;
+ return;
}
- } else if (cmd->_messageKind == 17) {
- switch (cmd->_messageNum) {
- case MSG_MANSHADOWSON:
- g_fullpipe->_aniMan->_shadowsOn = 1;
- break;
- case MSG_HMRKICK_STUCCO:
- global_messageHandler_KickStucco();
- break;
- case MSG_MANSHADOWSOFF:
- g_fullpipe->_aniMan->_shadowsOn = 0;
- break;
- case MSG_DISABLESAVES:
- g_fullpipe->disableSaves(cmd);
- break;
- case MSG_ENABLESAVES:
- g_fullpipe->enableSaves();
- break;
- case MSG_HMRKICK_METAL:
- global_messageHandler_KickMetal();
- break;
- case 29: // left mouse
- if (g_fullpipe->_inventoryScene) {
- if (getGameLoaderInventory()->handleLeftClick(cmd))
- cmd->_messageKind = 0;
- }
- break;
- case 107: // right mouse
- if (getGameLoaderInventory()->getSelectedItemId()) {
- getGameLoaderInventory()->unselectItem(0);
- cmd->_messageKind = 0;
- }
- break;
- case 36: // keydown
- g_fullpipe->defHandleKeyDown(cmd->_keyCode);
-
- switch (cmd->_keyCode) {
- case '\x1B': // ESC
- if (g_fullpipe->_currentScene) {
- getGameLoaderInventory()->unselectItem(0);
- g_fullpipe->openMainMenu();
- cmd->_messageKind = 0;
- }
- break;
- case 't':
- g_fullpipe->stopAllSounds();
- cmd->_messageKind = 0;
- break;
- case 'u':
- g_fullpipe->toggleMute();
- cmd->_messageKind = 0;
- break;
- case ' ':
- if (getGameLoaderInventory()->getIsLocked()) {
- if (getGameLoaderInventory()->getIsInventoryOut()) {
- getGameLoaderInventory()->setIsLocked(0);
- }
- } else {
- getGameLoaderInventory()->slideOut();
- getGameLoaderInventory()->setIsLocked(1);
- }
- break;
- case '\t':
- if (g_fullpipe->_flgCanOpenMap)
- g_fullpipe->openMap();
- cmd->_messageKind = 0;
- break;
- case 'p':
- if (g_fullpipe->_flgCanOpenMap)
- g_fullpipe->openHelp();
- cmd->_messageKind = 0;
- break;
- default:
- break;
- }
- break;
- case 33:
- if (!g_fullpipe->_inventoryScene)
- break;
-
- int invItem;
-
- if (g_fullpipe->_updateFlag && (invItem = g_fullpipe->_inventory->getHoveredItem(&g_fullpipe->_mouseScreenPos))) {
- g_fullpipe->_cursorId = PIC_CSR_ITN;
- if (!g_fullpipe->_currSelectedInventoryItemId && !g_fullpipe->_aniMan->_movement &&
- !(g_fullpipe->_aniMan->_flags & 0x100) && g_fullpipe->_aniMan->isIdle()) {
- int st = g_fullpipe->_aniMan->_statics->_staticsId;
- ExCommand *newex = 0;
-
- if (st == ST_MAN_RIGHT) {
- newex = new ExCommand(g_fullpipe->_aniMan->_id, 1, rMV_MAN_LOOKUP, 0, 0, 0, 1, 0, 0, 0);
- } else if (st == (0x4000 | ST_MAN_RIGHT)) {
- newex = new ExCommand(g_fullpipe->_aniMan->_id, 1, MV_MAN_LOOKUP, 0, 0, 0, 1, 0, 0, 0);
- }
-
- if (newex) {
- newex->_keyCode = g_fullpipe->_aniMan->_okeyCode;
- newex->_excFlags |= 3;
- newex->postMessage();
- }
- }
-
- if (g_fullpipe->_currSelectedInventoryItemId != invItem)
- g_fullpipe->playSound(SND_CMN_070, 0);
-
- g_fullpipe->_currSelectedInventoryItemId = invItem;
- g_fullpipe->setCursor(g_fullpipe->_cursorId);
- break;
- }
- if (g_fullpipe->_updateCursorCallback)
- g_fullpipe->_updateCursorCallback();
-
- g_fullpipe->_currSelectedInventoryItemId = 0;
- g_fullpipe->setCursor(g_fullpipe->_cursorId);
- break;
- case 65: // open map
- if (cmd->_field_2C == 11 && cmd->_field_14 == ANI_INV_MAP && g_fullpipe->_flgCanOpenMap)
- g_fullpipe->openMap();
- break;
- default:
- break;
+ if (!hiWord) {
+ _mapTable[i] = (mapId << 16) | update;
+ return;
}
}
+}
- if (cmd->_messageKind == 56) {
- getGameLoaderInventory()->rebuildItemRects();
-
- ExCommand *newex = new ExCommand(0, 35, SND_CMN_031, 0, 0, 0, 1, 0, 0, 0);
-
- newex->_field_14 = 1;
- newex->_excFlags |= 3;
- newex->postMessage();
-
- return 1;
- } else if (cmd->_messageKind == 57) {
- getGameLoaderInventory()->rebuildItemRects();
-
- return 1;
- }
+void FullpipeEngine::updateMap(PreloadItem *pre) {
+ switch (pre->sceneId) {
+ case SC_1:
+ updateMapPiece(PIC_MAP_S01, 1);
- return 0;
-}
+ if (pre->keyCode == TrubaUp)
+ updateMapPiece(PIC_MAP_P01, 1);
-void staticANIObjectCallback(int *arg) {
- (*arg)--;
-}
+ if (pre->keyCode == TrubaLeft)
+ updateMapPiece(PIC_MAP_A13, 1);
+ break;
-int global_messageHandler2(ExCommand *cmd) {
- if (cmd->_messageKind != 17)
- return 0;
+ case SC_2:
+ updateMapPiece(PIC_MAP_S02, 1);
- int res = 0;
- StaticANIObject *ani;
+ if (pre->keyCode == TrubaLeft)
+ updateMapPiece(PIC_MAP_P01, 1);
- switch (cmd->_messageNum) {
- case 0x44c8:
- error("0x44c8");
- // Unk3_sub_4477A0(&unk3, _parentId, _field_14 != 0);
break;
- case 28:
- ani = g_fullpipe->_currentScene->getStaticANIObject1ById(cmd->_parentId, cmd->_keyCode);
- if (ani)
- ani->_priority = cmd->_field_14;
+ case SC_3:
+ updateMapPiece(PIC_MAP_S03, 1);
break;
- case 25:
- ani = g_fullpipe->_currentScene->getStaticANIObject1ById(cmd->_parentId, cmd->_keyCode);
- if (ani) {
- if (cmd->_field_14) {
- ani->setFlags40(true);
- ani->_callback2 = staticANIObjectCallback;
- } else {
- ani->setFlags40(false);
- ani->_callback2 = 0;
- }
- }
- break;
+ case SC_4:
+ updateMapPiece(PIC_MAP_S04, 1);
+
+ if (pre->keyCode == TrubaRight)
+ updateMapPiece(PIC_MAP_P04, 1);
- case 26:
- ani = g_fullpipe->_currentScene->getStaticANIObject1ById(cmd->_parentId, cmd->_keyCode);
- if (ani) {
- Movement *mov = ani->_movement;
- if (mov)
- mov->_currDynamicPhase->_field_68 = 0;
- }
break;
- default:
-#if 0
- // We never put anything into _defMsgArray
- while (::iterator it = g_fullpipe->_defMsgArray.begin(); it != g_fullpipe->_defMsgArray.end(); ++it)
- if (((ExCommand *)*it)->_field_24 == _messageNum) {
- ((ExCommand *)*it)->firef34(v13);
- res = 1;
- }
-#endif
+ case SC_5:
+ updateMapPiece(PIC_MAP_S05, 1);
- //debug_msg(_messageNum);
+ if (pre->keyCode == TrubaLeft) {
+ updateMapPiece(PIC_MAP_P04, 1);
+ }
- if (!g_fullpipe->_soundEnabled || cmd->_messageNum != 33 || g_fullpipe->_currSoundListCount <= 0)
- return res;
+ if (pre->keyCode == TrubaUp) {
+ updateMapPiece(PIC_MAP_P05, 1);
+ updateMapPiece(PIC_MAP_A11, 1);
+ }
- for (int snd = 0; snd < g_fullpipe->_currSoundListCount; snd++) {
- SoundList *s = g_fullpipe->_currSoundList1[snd];
- int ms = s->getCount();
- for (int i = 0; i < ms; i++) {
- s->getSoundByIndex(i)->setPanAndVolumeByStaticAni();
- }
- }
- }
+ break;
- return res;
-}
+ case SC_6:
+ updateMapPiece(PIC_MAP_S06, 1);
-int global_messageHandler3(ExCommand *cmd) {
- int result = 0;
-
- if (cmd->_messageKind == 17) {
- switch (cmd->_messageNum) {
- case 29:
- case 30:
- case 31:
- case 32:
- case 36:
- if (g_fullpipe->_inputDisabled)
- cmd->_messageKind = 0;
- break;
- default:
- break;
- }
- }
+ if (pre->keyCode == TrubaUp)
+ updateMapPiece(PIC_MAP_A12, 1);
- StaticANIObject *ani, *ani2;
-
- switch (cmd->_messageKind) {
- case 17:
- switch (cmd->_messageNum) {
- case 61:
- return g_fullpipe->_gameLoader->preloadScene(cmd->_parentId, cmd->_keyCode);
- case 62:
- return g_fullpipe->_gameLoader->gotoScene(cmd->_parentId, cmd->_keyCode);
- case 64:
- if (g_fullpipe->_currentScene && g_fullpipe->_msgObjectId2
- && (!(cmd->_keyCode & 4) || g_fullpipe->_msgObjectId2 != cmd->_field_14 || g_fullpipe->_msgId != cmd->_field_20)) {
- ani = g_fullpipe->_currentScene->getStaticANIObject1ById(g_fullpipe->_msgObjectId2, g_fullpipe->_msgId);
- if (ani) {
- ani->_flags &= 0xFF7F;
- ani->_flags &= 0xFEFF;
- ani->deleteFromGlobalMessageQueue();
- }
- }
- g_fullpipe->_msgX = 0;
- g_fullpipe->_msgY = 0;
- g_fullpipe->_msgObjectId2 = 0;
- g_fullpipe->_msgId = 0;
- if ((cmd->_keyCode & 1) || (cmd->_keyCode & 2)) {
- g_fullpipe->_msgX = cmd->_x;
- g_fullpipe->_msgY = cmd->_y;
- }
- if (cmd->_keyCode & 4) {
- g_fullpipe->_msgObjectId2 = cmd->_field_14;
- g_fullpipe->_msgId = cmd->_field_20;
- }
- return result;
- case 29:
- if (!g_fullpipe->_currentScene)
- return result;
-
- if (g_fullpipe->_gameLoader->_interactionController->_flag24) {
- ani = g_fullpipe->_currentScene->getStaticANIObjectAtPos(cmd->_sceneClickX, cmd->_sceneClickY);
- ani2 = g_fullpipe->_currentScene->getStaticANIObject1ById(g_fullpipe->_gameLoader->_field_FA, -1);
- if (ani) {
- if (g_fullpipe->_msgObjectId2 == ani->_id && g_fullpipe->_msgId == ani->_okeyCode) {
- cmd->_messageKind = 0;
- return result;
- }
- if (canInteractAny(ani2, ani, cmd->_keyCode)) {
- handleObjectInteraction(ani2, ani, cmd->_keyCode);
- return 1;
- }
- } else {
- int id = g_fullpipe->_currentScene->getPictureObjectIdAtPos(cmd->_sceneClickX, cmd->_sceneClickY);
- PictureObject *pic = g_fullpipe->_currentScene->getPictureObjectById(id, 0);
- if (pic) {
- if (g_fullpipe->_msgObjectId2 == pic->_id && g_fullpipe->_msgId == pic->_okeyCode) {
- cmd->_messageKind = 0;
- return result;
- }
- if (!ani2 || canInteractAny(ani2, pic, cmd->_keyCode)) {
- if (!ani2 || (ani2->isIdle() && !(ani2->_flags & 0x80) && !(ani2->_flags & 0x100)))
- handleObjectInteraction(ani2, pic, cmd->_keyCode);
- return 1;
- }
- }
- }
- }
- if (getSc2MctlCompoundBySceneId(g_fullpipe->_currentScene->_sceneId)->_isEnabled && cmd->_keyCode <= 0) {
- if (g_fullpipe->_msgX != cmd->_sceneClickX || g_fullpipe->_msgY != cmd->_sceneClickY) {
- ani = g_fullpipe->_currentScene->getStaticANIObject1ById(g_fullpipe->_gameLoader->_field_FA, -1);
- if (!ani || (ani->isIdle() && !(ani->_flags & 0x80) && !(ani->_flags & 0x100))) {
- result = startWalkTo(g_fullpipe->_gameLoader->_field_FA, -1, cmd->_sceneClickX, cmd->_sceneClickY, 0);
- if (result) {
- ExCommand *ex = new ExCommand(g_fullpipe->_gameLoader->_field_FA, 17, 64, 0, 0, 0, 1, 0, 0, 0);
-
- ex->_keyCode = 1;
- ex->_excFlags |= 3;
- ex->_x = cmd->_sceneClickX;
- ex->_y = cmd->_sceneClickY;
- ex->postMessage();
- }
- }
- } else {
- cmd->_messageKind = 0;
- }
- }
- return result;
- default:
- return result;
- }
- case 58:
- g_fullpipe->setCursor(cmd->_keyCode);
- return result;
- case 59:
- setInputDisabled(1);
- return result;
- case 60:
- setInputDisabled(0);
- return result;
- case 56:
- if (cmd->_field_2C) {
- ani = g_fullpipe->_currentScene->getStaticANIObject1ById(cmd->_parentId, cmd->_keyCode);
- if (ani) {
- getGameLoaderInventory()->addItem2(ani);
- result = 1;
- }
- } else {
- result = 1;
- getGameLoaderInventory()->addItem(cmd->_parentId, 1);
- }
- getGameLoaderInventory()->rebuildItemRects();
- return result;
- case 57:
- if (cmd->_field_2C) {
- if (!cmd->_field_20) {
- getGameLoaderInventory()->removeItem2(g_fullpipe->_currentScene, cmd->_parentId, cmd->_x, cmd->_y, cmd->_field_14);
- getGameLoaderInventory()->rebuildItemRects();
- return 1;
- }
- ani = g_fullpipe->_currentScene->getStaticANIObject1ById(g_fullpipe->_gameLoader->_field_FA, -1);
- if (ani) {
- getGameLoaderInventory()->removeItem2(g_fullpipe->_currentScene, cmd->_parentId, ani->_ox + cmd->_x, ani->_oy + cmd->_y, ani->_priority + cmd->_field_14);
- getGameLoaderInventory()->rebuildItemRects();
- return 1;
- }
- } else {
- getGameLoaderInventory()->removeItem(cmd->_parentId, 1);
- }
- getGameLoaderInventory()->rebuildItemRects();
- return 1;
- case 55:
- if (g_fullpipe->_currentScene) {
- GameObject *obj;
- if (cmd->_field_14)
- obj = g_fullpipe->_currentScene->getStaticANIObject1ById(cmd->_x, cmd->_y);
- else
- obj = g_fullpipe->_currentScene->getPictureObjectById(cmd->_x, cmd->_y);
- handleObjectInteraction(g_fullpipe->_currentScene->getStaticANIObject1ById(cmd->_parentId, cmd->_keyCode), obj, cmd->_field_20);
- result = 1;
- }
- return result;
- case 51:
- return startWalkTo(cmd->_parentId, cmd->_keyCode, cmd->_x, cmd->_y, cmd->_field_20);
- case 52:
- return doSomeAnimation(cmd->_parentId, cmd->_keyCode, cmd->_field_20);
- case 53:
- return doSomeAnimation2(cmd->_parentId, cmd->_keyCode);
- case 63:
- if (cmd->_objtype == kObjTypeObjstateCommand) {
- ObjstateCommand *c = (ObjstateCommand *)cmd;
- result = 1;
- g_fullpipe->setObjectState(c->_objCommandName, c->_value);
- }
- return result;
- default:
- return result;
- }
-}
+ break;
-int global_messageHandler4(ExCommand *cmd) {
- StaticANIObject *ani = 0;
+ case SC_7:
+ updateMapPiece(PIC_MAP_S07, 1);
- switch (cmd->_messageKind) {
- case 18: {
- MessageQueue *mq = new MessageQueue(g_fullpipe->_currentScene->getMessageQueueById(cmd->_messageNum), cmd->_parId, 0);
+ if (pre->keyCode == TrubaLeft)
+ updateMapPiece(PIC_MAP_P18, 1);
- if (cmd->_excFlags & 1)
- mq->_flag1 = 1;
- else
- mq->_flag1 = 0;
-
- mq->sendNextCommand();
break;
- }
- case 2:
- if (!g_fullpipe->_currentScene)
- break;
- ani = g_fullpipe->_currentScene->getStaticANIObject1ById(cmd->_parentId, cmd->_keyCode);
- if (!ani)
- break;
+ case SC_8:
+ updateMapPiece(PIC_MAP_S08, 1);
- ani->trySetMessageQueue(cmd->_messageNum, cmd->_parId);
- break;
+ if (pre->keyCode == TrubaUp)
+ updateMapPiece(PIC_MAP_P11, 1);
- case 1: {
- if (!g_fullpipe->_currentScene)
- break;
+ if (pre->keyCode == TrubaRight)
+ updateMapPiece(PIC_MAP_P18, 1);
- ani = g_fullpipe->_currentScene->getStaticANIObject1ById(cmd->_parentId, cmd->_keyCode);
- if (!ani)
- break;
+ return;
- int flags = cmd->_field_14;
- if (flags <= 0)
- flags = -1;
+ case SC_9:
+ updateMapPiece(PIC_MAP_S09, 1);
- if (cmd->_excFlags & 1)
- ani->startAnim(cmd->_messageNum, 0, flags);
- else
- ani->startAnim(cmd->_messageNum, cmd->_parId, flags);
+ if (pre->keyCode == TrubaDown)
+ updateMapPiece(PIC_MAP_P11, 1);
- break;
- }
- case 8:
- if (!g_fullpipe->_currentScene)
- break;
+ return;
- ani = g_fullpipe->_currentScene->getStaticANIObject1ById(cmd->_parentId, cmd->_keyCode);
- if (!ani)
- break;
+ case SC_10:
+ updateMapPiece(PIC_MAP_S10, 1);
- ani->startAnimEx(cmd->_messageNum, cmd->_parId, -1, -1);
- break;
+ if (pre->keyCode == TrubaRight)
+ updateMapPiece(PIC_MAP_P02, 1);
- case 20: {
- if (!g_fullpipe->_currentScene)
- break;
+ break;
- ani = g_fullpipe->_currentScene->getStaticANIObject1ById(cmd->_parentId, cmd->_keyCode);
- if (!ani)
- break;
+ case SC_11:
+ updateMapPiece(PIC_MAP_S11, 1);
- int flags = cmd->_field_14;
- if (flags <= 0)
- flags = -1;
+ if (pre->keyCode == TrubaLeft)
+ updateMapPiece(PIC_MAP_P02, 1);
- ExCommand2 *cmd2 = (ExCommand2 *)cmd;
+ break;
- if (cmd->_excFlags & 1) {
- ani->startAnimSteps(cmd->_messageNum, 0, cmd->_x, cmd->_y, cmd2->_points, cmd2->_pointsSize >> 3, flags);
- } else {
- ani->startAnimSteps(cmd->_messageNum, cmd->_parId, cmd->_x, cmd->_y, cmd2->_points, cmd2->_pointsSize >> 3, flags);
- }
+ case SC_12:
+ updateMapPiece(PIC_MAP_S12, 1);
break;
- }
- case 21:
- if (!g_fullpipe->_currentScene)
- break;
- ani = g_fullpipe->_currentScene->getStaticANIObject1ById(cmd->_parentId, cmd->_keyCode);
- if (!ani)
- break;
+ case SC_13:
+ updateMapPiece(PIC_MAP_S13, 1);
- ani->queueMessageQueue(0);
- ani->playIdle();
- break;
- case 9:
- // Nop in original
- break;
- case 3:
- g_fullpipe->_currentScene->_y = cmd->_messageNum - cmd->_messageNum % g_fullpipe->_scrollSpeed;
+ if (pre->keyCode == TrubaUp) {
+ updateMapPiece(PIC_MAP_P06, 1);
+ updateMapPiece(PIC_MAP_A10, 1);
+ }
break;
- case 4:
- g_fullpipe->_currentScene->_x = cmd->_messageNum - cmd->_messageNum % g_fullpipe->_scrollSpeed;
+ case SC_14:
+ updateMapPiece(PIC_MAP_S14, 1);
break;
- case 19: {
- if (!g_fullpipe->_currentScene)
- break;
- ani = g_fullpipe->_currentScene->getStaticANIObject1ById(cmd->_parentId, cmd->_keyCode);
- if (!ani)
- break;
-
- MessageQueue *mq = ani->getMessageQueue();
- MessageQueue *mq2 = ani->changeStatics1(cmd->_messageNum);
+ case SC_15:
+ updateMapPiece(PIC_MAP_S15, 1);
- if (!mq2 || !mq2->getExCommandByIndex(0) || !mq)
- break;
+ if (pre->keyCode == TrubaUp) {
+ updateMapPiece(PIC_MAP_P08, 1);
+ updateMapPiece(PIC_MAP_A14, 1);
+ }
- mq2->_parId = mq->_id;
- mq2->_flag1 = (cmd->_field_24 == 0);
break;
- }
- case 22:
- if (!g_fullpipe->_currentScene)
- break;
- ani = g_fullpipe->_currentScene->getStaticANIObject1ById(cmd->_parentId, cmd->_keyCode);
- if (!ani)
- break;
+ case SC_16:
+ updateMapPiece(PIC_MAP_S16, 1);
+ break;
- ani->_flags |= 4;
- ani->changeStatics2(cmd->_messageNum);
+ case SC_17:
+ updateMapPiece(PIC_MAP_S17, 1);
break;
- case 6:
- if (!g_fullpipe->_currentScene)
- break;
+ case SC_18:
+ updateMapPiece(PIC_MAP_S1819, 1);
- ani = g_fullpipe->_currentScene->getStaticANIObject1ById(cmd->_parentId, cmd->_keyCode);
- if (!ani)
- break;
+ if (pre->keyCode == PIC_SC18_RTRUBA)
+ updateMapPiece(PIC_MAP_P14, 1);
- ani->hide();
break;
- case 27:
- if (!g_fullpipe->_currentScene || g_fullpipe->_currentScene->getStaticANIObject1ById(cmd->_parentId, cmd->_keyCode) == 0) {
- ani = g_fullpipe->accessScene(cmd->_field_20)->getStaticANIObject1ById(cmd->_parentId, -1);
- if (ani) {
- ani = new StaticANIObject(ani);
- g_fullpipe->_currentScene->addStaticANIObject(ani, 1);
- }
- }
-
- // fall through
- case 5:
- if (g_fullpipe->_currentScene)
- ani = g_fullpipe->_currentScene->getStaticANIObject1ById(cmd->_parentId, cmd->_keyCode);
+ case SC_19:
+ updateMapPiece(PIC_MAP_S1819, 1);
- if (!ani)
- break;
+ if (pre->keyCode == PIC_SC19_RTRUBA3) {
+ updateMapPiece(PIC_MAP_P15, 1);
+ updateMapPiece(PIC_MAP_A09, 1);
+ }
- if (cmd->_field_14 >= 0)
- ani->_priority = cmd->_field_14;
+ break;
- ani->show1(cmd->_x, cmd->_y, cmd->_messageNum, cmd->_parId);
+ case SC_20:
+ updateMapPiece(PIC_MAP_S20, 1);
break;
- case 10:
- if (!g_fullpipe->_currentScene)
- break;
+ case SC_21:
+ updateMapPiece(PIC_MAP_S21, 1);
- ani = g_fullpipe->_currentScene->getStaticANIObject1ById(cmd->_parentId, cmd->_keyCode);
- if (!ani)
- break;
+ if (pre->keyCode == TrubaLeft) {
+ updateMapPiece(PIC_MAP_P15, 1);
+ updateMapPiece(PIC_MAP_A09, 1);
+ }
- if (cmd->_field_14 >= 0)
- ani->_priority = cmd->_field_14;
+ if (pre->keyCode == TrubaDown)
+ updateMapPiece(PIC_MAP_A08, 1);
- ani->show2(cmd->_x, cmd->_y, cmd->_messageNum, cmd->_parId);
break;
- case 7: {
- if (!g_fullpipe->_currentScene->_picObjList.size())
- break;
-
- int offX = g_fullpipe->_scrollSpeed * (cmd->_x / g_fullpipe->_scrollSpeed);
- int offY = g_fullpipe->_scrollSpeed * (cmd->_y / g_fullpipe->_scrollSpeed);
-
- if (cmd->_messageNum) {
- g_fullpipe->_currentScene->_x = offX - g_fullpipe->_sceneRect.left;
- g_fullpipe->_currentScene->_y = offY - g_fullpipe->_sceneRect.top;
+ case SC_22:
+ updateMapPiece(PIC_MAP_S22, 1);
+ break;
- if (cmd->_field_24) {
- g_fullpipe->_currentScene->_messageQueueId = cmd->_parId;
- }
+ case SC_23:
+ if (getObjectState(sO_UpperHatch_23) == getObjectEnumState(sO_UpperHatch_23, sO_Opened)) {
+ updateMapPiece(PIC_MAP_S23_1, 0);
+ updateMapPiece(PIC_MAP_S23_2, 1);
+ updateMapPiece(PIC_MAP_P07, 1);
} else {
- g_fullpipe->_sceneRect.moveTo(offX, offY);
-
- g_fullpipe->_currentScene->_x = 0;
- g_fullpipe->_currentScene->_y = 0;
-
- g_fullpipe->_currentScene->updateScrolling2();
+ updateMapPiece(PIC_MAP_S23_1, 1);
+ updateMapPiece(PIC_MAP_S23_2, 0);
}
break;
- }
- case 34:
- if (!g_fullpipe->_currentScene)
- break;
- ani = g_fullpipe->_currentScene->getStaticANIObject1ById(cmd->_parentId, cmd->_keyCode);
- if (!ani)
- break;
+ case SC_24:
+ updateMapPiece(PIC_MAP_S24, 1);
- ani->_flags = cmd->_messageNum | (ani->_flags & ~cmd->_field_14);
+ if (pre->keyCode == TrubaUp)
+ updateMapPiece(PIC_MAP_A08, 1);
+ if (pre->keyCode == TrubaDown) {
+ updateMapPiece(PIC_MAP_P13, 1);
+ updateMapPiece(PIC_MAP_A07, 1);
+ }
break;
- case 35:
- global_messageHandler_handleSound(cmd);
+ case SC_25:
+ updateMapPiece(PIC_MAP_S25, 1);
break;
- case 11:
- case 12:
- break;
- default:
- return 0;
- break;
- }
+ case SC_26:
+ updateMapPiece(PIC_MAP_S26, 1);
- return 1;
-}
+ if (pre->keyCode == TrubaLeft)
+ updateMapPiece(PIC_MAP_A06, 1);
-int MovGraph_messageHandler(ExCommand *cmd) {
- if (cmd->_messageKind != 17)
- return 0;
+ if (pre->keyCode == TrubaUp) {
+ updateMapPiece(PIC_MAP_P13, 1);
+ updateMapPiece(PIC_MAP_A07, 1);
+ }
- if (cmd->_messageNum != 33)
- return 0;
+ break;
- StaticANIObject *ani = g_fullpipe->_currentScene->getStaticANIObject1ById(g_fullpipe->_gameLoader->_field_FA, -1);
+ case SC_27:
+ updateMapPiece(PIC_MAP_S27, 1);
+ break;
- if (!getSc2MctlCompoundBySceneId(g_fullpipe->_currentScene->_sceneId))
- return 0;
+ case SC_28:
+ updateMapPiece(PIC_MAP_S28, 1);
- if (getSc2MctlCompoundBySceneId(g_fullpipe->_currentScene->_sceneId)->_objtype != kObjTypeMovGraph || !ani)
- return 0;
+ if (pre->keyCode == TrubaRight)
+ updateMapPiece(PIC_MAP_A06, 1);
- MovGraph *gr = (MovGraph *)getSc2MctlCompoundBySceneId(g_fullpipe->_currentScene->_sceneId);
+ break;
- MovGraphLink *link = 0;
- double mindistance = 1.0e10;
- Common::Point point;
+ case SC_29:
+ updateMapPiece(PIC_MAP_S29, 1);
- for (ObList::iterator i = gr->_links.begin(); i != gr->_links.end(); ++i) {
- point.x = ani->_ox;
- point.y = ani->_oy;
+ if (pre->keyCode == TrubaUp)
+ updateMapPiece(PIC_MAP_A05, 1);
- double dst = gr->calcDistance(&point, (MovGraphLink *)(*i), 0);
- if (dst >= 0.0 && dst < mindistance) {
- mindistance = dst;
- link = (MovGraphLink *)(*i);
- }
- }
+ break;
- int top;
+ case SC_30:
+ updateMapPiece(PIC_MAP_S30, 1);
- if (link) {
- MovGraphNode *node = link->_movGraphNode1;
+ if (pre->keyCode == TrubaLeft)
+ updateMapPiece(PIC_MAP_P09, 1);
- double sq = (ani->_oy - node->_y) * (ani->_oy - node->_y) + (ani->_ox - node->_x) * (ani->_ox - node->_x);
- int off = (node->_field_14 >> 16) & 0xFF;
- double off2 = ((link->_movGraphNode2->_field_14 >> 8) & 0xff) - off;
+ if (pre->keyCode == TrubaRight)
+ updateMapPiece(PIC_MAP_A04, 1);
- top = off + (int)(sqrt(sq) * off2 / link->_distance);
- } else {
- top = (gr->calcOffset(ani->_ox, ani->_oy)->_field_14 >> 8) & 0xff;
- }
+ break;
- if (ani->_movement) {
- ani->_movement->_currDynamicPhase->_rect->top = 255 - top;
- return 0;
- }
+ case SC_31:
+ updateMapPiece(PIC_MAP_S31_2, 1);
- if (ani->_statics)
- ani->_statics->_rect->top = 255 - top;
+ if (getObjectState(sO_Cactus) == getObjectEnumState(sO_Cactus, sO_HasGrown))
+ updateMapPiece(PIC_MAP_S31_1, 1);
- return 0;
-}
+ if (pre->keyCode == TrubaRight)
+ updateMapPiece(PIC_MAP_P09, 1);
-int defaultUpdateCursor() {
- g_fullpipe->updateCursorsCommon();
+ break;
- return g_fullpipe->_cursorId;
-}
+ case SC_32:
+ updateMapPiece(PIC_MAP_S32_2, 1);
-int sceneIntro_updateCursor() {
- g_fullpipe->_cursorId = 0;
+ if (getObjectState(sO_Cactus) == getObjectEnumState(sO_Cactus, sO_HasGrown))
+ updateMapPiece(PIC_MAP_S32_1, 1);
- return 0;
-}
+ break;
-void FullpipeEngine::setSwallowedEggsState() {
- GameVar *v = _gameLoader->_gameVar->getSubVarByName("OBJSTATES")->getSubVarByName(sO_GulpedEggs);
+ case SC_33:
+ updateMapPiece(PIC_MAP_S33, 1);
+ break;
- g_vars->swallowedEgg1 = v->getSubVarByName(sO_Egg1);
- g_vars->swallowedEgg2 = v->getSubVarByName(sO_Egg2);
- g_vars->swallowedEgg3 = v->getSubVarByName(sO_Egg3);
+ case SC_34:
+ updateMapPiece(PIC_MAP_S34, 1);
- g_vars->swallowedEgg1->_value.intValue = 0;
- g_vars->swallowedEgg2->_value.intValue = 0;
- g_vars->swallowedEgg3->_value.intValue = 0;
-}
+ if (pre->keyCode == TrubaUp)
+ updateMapPiece(PIC_MAP_A03, 1);
-void sceneIntro_initScene(Scene *sc) {
- g_fullpipe->_gameLoader->loadScene(SC_INTRO2);
+ break;
- g_vars->sceneIntro_aniin1man = sc->getStaticANIObject1ById(ANI_IN1MAN, -1);
- g_vars->sceneIntro_needSleep = true;
- g_vars->sceneIntro_needGetup = false;
- g_vars->sceneIntro_playing = true;
- g_vars->sceneIntro_needBlackout = false;
+ case SC_35:
+ updateMapPiece(PIC_MAP_S35, 1);
- if (g_fullpipe->_recordEvents || g_fullpipe->_inputArFlag)
- g_vars->sceneIntro_skipIntro = false;
+ if (pre->keyCode == TrubaLeft)
+ updateMapPiece(PIC_MAP_A02, 1);
- g_fullpipe->_modalObject = new ModalIntro;
-}
+ if (pre->keyCode == TrubaDown)
+ updateMapPiece(PIC_MAP_A03, 1);
-int sceneHandlerIntro(ExCommand *cmd) {
- warning("STUB: sceneHandlerIntro()");
+ break;
- return 0;
-}
+ case SC_36:
+ updateMapPiece(PIC_MAP_S36, 1);
+ break;
-void scene01_fixEntrance() {
- GameVar *var = g_fullpipe->getGameLoaderGameVar()->getSubVarByName("OBJSTATES")->getSubVarByName("SAVEGAME");
- if (var->getSubVarAsInt("Entrance") == TrubaLeft)
- var->setSubVarAsInt("Entrance", TrubaRight);
-}
+ case SC_37:
+ updateMapPiece(PIC_MAP_S37, 1);
+ updateMapPiece(PIC_MAP_A01, 1);
+ break;
-void scene01_initScene(Scene *sc, int entrance) {
- g_vars->scene01_picSc01Osk = sc->getPictureObjectById(PIC_SC1_OSK, 0);
- g_vars->scene01_picSc01Osk->_flags &= 0xFFFB;
+ case SC_38:
+ updateMapPiece(PIC_MAP_S38, 1);
- g_vars->scene01_picSc01Osk2 = sc->getPictureObjectById(PIC_SC1_OSK2, 0);
- g_vars->scene01_picSc01Osk2->_flags &= 0xFFFB;
+ switch (pre->preloadId1) {
+ case SC_15:
+ updateMapPiece(PIC_MAP_P16, 1);
+ break;
- if (g_fullpipe->getObjectState(sO_EggCracker) == g_fullpipe->getObjectEnumState(sO_EggCracker, sO_DidNotCrackEgg)) {
- PictureObject *pic = sc->getPictureObjectById(PIC_SC1_KUCHKA, 0);
- if (pic)
- pic->_flags &= 0xFFFB;
- }
+ case SC_1:
+ updateMapPiece(PIC_MAP_P10, 1);
+ break;
- if (entrance != TrubaLeft) {
- StaticANIObject *bootAnim = sc->getStaticANIObject1ById(ANI_BOOT_1, -1);
- if (bootAnim)
- bootAnim->_flags &= ~0x04;
- }
+ case SC_10:
+ updateMapPiece(PIC_MAP_P17, 1);
+ break;
- setElevatorButton(sO_Level2, ST_LBN_2N);
+ case SC_19:
+ updateMapPiece(PIC_MAP_P12, 1);
+ break;
+ }
+ break;
+ }
}
-int sceneHandler01(ExCommand *cmd) {
- int res = 0;
-
- if (cmd->_messageKind != 17)
- return 0;
-
- if (cmd->_messageNum > MSG_SC1_SHOWOSK) {
- if (cmd->_messageNum == MSG_SC1_UTRUBACLICK)
- handleObjectInteraction(g_fullpipe->_aniMan, g_fullpipe->_currentScene->getPictureObjectById(PIC_SC1_LADDER, 0), 0);
-
- return 0;
+void BallChain::init(Ball **ball) {
+ *ball = pTail;
+ pTail = (Ball *)ball;
+ numBalls--;
+
+ if (!numBalls) {
+ for (Ball *i = pHead; i; i = i->p0 )
+ ;
+ numBalls = 0;
+ pTail = 0;
+ field_8 = 0;
+ pHead = 0;
+ free(cPlex);
+ cPlex = 0;
}
+}
- if (cmd->_messageNum == MSG_SC1_SHOWOSK) {
- g_vars->scene01_picSc01Osk->_flags |= 4;
+Ball *BallChain::sub04(Ball *ballP, Ball *ballN) {
+ if (!pTail) {
+ if (!cPlexLen)
+ error("BallChain::sub04: cPlexLen is 0");
- g_vars->scene01_picSc01Osk->_priority = 20;
- g_vars->scene01_picSc01Osk2->_priority = 21;
+ cPlex = (byte *)calloc(cPlexLen, sizeof(Ball));
- return 0;
- }
+ Ball *runPtr = (Ball *)&cPlex[(cPlexLen - 1) * sizeof(Ball)];
- if (cmd->_messageNum != 0x21) {
- if (cmd->_messageNum == MSG_SC1_SHOWOSK2) {
- g_vars->scene01_picSc01Osk2->_flags |= 4;
- g_vars->scene01_picSc01Osk2->_priority = 20;
- g_vars->scene01_picSc01Osk->_priority = 21;
+ for (int i = 0; i < cPlexLen; i++) {
+ runPtr->p0 = pTail;
+ pTail = runPtr;
- return 0;
+ runPtr--;
}
-
- return 0;
}
- if (g_fullpipe->_aniMan2) {
- if (g_fullpipe->_aniMan2->_ox < g_fullpipe->_sceneRect.left + 200) {
- g_fullpipe->_currentScene->_x = g_fullpipe->_aniMan2->_ox - g_fullpipe->_sceneRect.left - 300;
- }
+ Ball *res = pTail;
- if (g_fullpipe->_aniMan2->_ox > g_fullpipe->_sceneRect.right - 200)
- g_fullpipe->_currentScene->_x = g_fullpipe->_aniMan2->_ox - g_fullpipe->_sceneRect.right + 300;
-
- res = 1;
- }
- g_fullpipe->_behaviorManager->updateBehaviors();
-
- g_fullpipe->startSceneTrack();
+ pTail = res->p0;
+ res->p1 = ballP;
+ res->p0 = ballN;
+ numBalls++;
+ res->ani = 0;
return res;
}
-void sceneDbgMenu_initScene(Scene *sc) {
- g_vars->selector = sc->getPictureObjectById(PIC_SCD_SEL, 0);
- getGameLoaderInteractionController()->disableFlag24();
- setInputDisabled(0);
-}
-
-GameObject *sceneHandlerDbgMenu_getObjectAtXY(int x, int y) {
- if (g_fullpipe->_currentScene)
- for (uint i = 0; i < g_fullpipe->_currentScene->_picObjList.size(); i++) {
- PictureObject *pic = (PictureObject *)g_fullpipe->_currentScene->_picObjList[i];
-
- if (x >= pic->_ox && y >= pic->_oy) {
- Common::Point point;
-
- pic->getDimensions(&point);
-
- if (x <= pic->_ox + point.x && y <= pic->_oy + point.y && pic != g_vars->selector)
- return pic;
- }
- }
-
- return 0;
-}
-
-int sceneHandlerDbgMenu(ExCommand *ex) {
- if (ex->_messageKind != 17)
- return 0;
-
- int mx = g_fullpipe->_mouseScreenPos.x + g_fullpipe->_sceneRect.left;
- int my = g_fullpipe->_mouseScreenPos.y + g_fullpipe->_sceneRect.top;
-
- if (ex->_messageNum == 29) {
- GameObject *obj = sceneHandlerDbgMenu_getObjectAtXY(mx, my);
- if (obj && canInteractAny(0, obj, -3) ) {
- getGameLoaderInteractionController()->enableFlag24();
- handleObjectInteraction(0, obj, 0);
- }
- return 0;
- }
- if (ex->_messageNum != 33) {
- if (ex->_messageNum == MSG_RESTARTGAME) {
- g_fullpipe->_needRestart = true;
- return 0;
- }
- return 0;
- }
-
- g_fullpipe->_cursorId = PIC_CSR_DEFAULT;
- GameObject *obj = g_fullpipe->_currentScene->getStaticANIObjectAtPos(mx, my);
- if (obj) {
- if (canInteractAny(0, obj, -3)) {
- g_fullpipe->_cursorId = PIC_CSR_DEFAULT;
- g_fullpipe->setCursor(PIC_CSR_DEFAULT);
- return 0;
- }
- } else {
- obj = sceneHandlerDbgMenu_getObjectAtXY(mx, my);
- if (obj && canInteractAny(0, obj, -3) ) {
- g_vars->selector->_flags |= 4;
- g_vars->selector->setOXY(obj->_ox, obj->_oy);
- g_fullpipe->_cursorId = PIC_CSR_DEFAULT;
- g_fullpipe->setCursor(PIC_CSR_DEFAULT);
- return 0;
- }
- g_vars->selector->_flags &= 0xFFFB;
+void BallChain::removeBall(Ball *ball) {
+ if (ball == pHead)
+ pHead = ball->p0;
+ else
+ ball->p1->p0 = ball->p0;
+
+ if (ball == field_8)
+ field_8 = ball->p1;
+ else
+ ball->p0->p1 = ball->p1;
+
+ ball->p0 = pTail;
+ pTail = ball;
+
+ numBalls--;
+
+ if (!numBalls) {
+ numBalls = 0;
+ pTail = 0;
+ field_8 = 0;
+ pHead = 0;
+ free(cPlex);
+ cPlex = 0;
}
- g_fullpipe->setCursor(g_fullpipe->_cursorId);
-
- return 0;
}
+
} // End of namespace Fullpipe
diff --git a/engines/fullpipe/scenes.h b/engines/fullpipe/scenes.h
index 5597612aa6..0b7c4e7c8f 100644
--- a/engines/fullpipe/scenes.h
+++ b/engines/fullpipe/scenes.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -25,10 +25,219 @@
namespace Fullpipe {
+struct Bat;
+struct BehaviorEntryInfo;
+struct Hanger;
+class MGM;
+class MctlLadder;
+struct Ring;
class StaticANIObject;
+struct Swinger;
+struct WalkingBearder;
+
+int defaultUpdateCursor();
+
+int sceneIntro_updateCursor();
+void sceneIntro_initScene(Scene *sc);
+int sceneHandlerIntro(ExCommand *cmd);
+
+void scene01_fixEntrance();
+void scene01_initScene(Scene *sc, int entrance);
+int sceneHandler01(ExCommand *cmd);
+
+void scene02_initScene(Scene *sc);
+int sceneHandler02(ExCommand *ex);
+
+void scene03_setEaterState();
+int scene03_updateCursor();
+void scene03_initScene(Scene *sc);
+int sceneHandler03(ExCommand *cmd);
+
+int scene04_updateCursor();
+void scene04_initScene(Scene *sc);
+int sceneHandler04(ExCommand *cmd);
+
+void scene05_initScene(Scene *sc);
+int sceneHandler05(ExCommand *cmd);
+
+void scene06_initScene(Scene *sc);
+void scene06_initMumsy();
+int sceneHandler06(ExCommand *cmd);
+int scene06_updateCursor();
+
+void scene07_initScene(Scene *sc);
+int sceneHandler07(ExCommand *cmd);
+
+void scene08_initScene(Scene *sc);
+void scene08_setupMusic();
+int sceneHandler08(ExCommand *cmd);
+int scene08_updateCursor();
+
+int scene09_updateCursor();
+void scene09_initScene(Scene *sc);
+int sceneHandler09(ExCommand *cmd);
+
+void scene10_initScene(Scene *sc);
+int sceneHandler10(ExCommand *cmd);
+int scene10_updateCursor();
+
+void scene11_initScene(Scene *sc);
+void scene11_setupMusic();
+int sceneHandler11(ExCommand *cmd);
+int scene11_updateCursor();
+
+void scene12_initScene(Scene *sc);
+int sceneHandler12(ExCommand *ex);
+
+void scene13_initScene(Scene *sc);
+int sceneHandler13(ExCommand *ex);
+
+void scene14_initScene(Scene *sc);
+void scene14_setupMusic();
+int sceneHandler14(ExCommand *cmd);
+int scene14_updateCursor();
+
+int scene15_updateCursor();
+void scene15_initScene(Scene *sc);
+int sceneHandler15(ExCommand *cmd);
+
+void scene16_initScene(Scene *sc);
+int sceneHandler16(ExCommand *cmd);
+int scene16_updateCursor();
+
+void scene17_initScene(Scene *sc);
+void scene17_restoreState();
+int sceneHandler17(ExCommand *cmd);
+int scene17_updateCursor();
+
+void scene18_preload();
+void scene18_setupEntrance();
+void scene18_initScene1(Scene *sc);
+void scene18_initScene2(Scene *sc);
+int sceneHandler18(ExCommand *cmd);
+int scene18_updateCursor();
+
+void scene19_preload();
+void scene19_setMovements(Scene *sc, int entranceId);
+void scene19_initScene2();
+void scene19_setMovements(Scene *sc, int key);
+int sceneHandler19(ExCommand *cmd);
+int scene19_updateCursor();
+void scene19_setSugarState(Scene *sc);
+
+void scene20_initScene(Scene *sc);
+int sceneHandler20(ExCommand *ex);
+
+int scene21_updateCursor();
+void scene21_initScene(Scene *sc);
+int sceneHandler21(ExCommand *cmd);
+
+void scene22_initScene(Scene *sc);
+void scene22_setBagState();
+int sceneHandler22(ExCommand *cmd);
+int scene22_updateCursor();
+
+void scene23_initScene(Scene *sc);
+void scene23_setGiraffeState();
+int sceneHandler23(ExCommand *cmd);
+int scene23_updateCursor();
+
+void scene24_initScene(Scene *sc);
+void scene24_setPoolState();
+int sceneHandler24(ExCommand *cmd);
+
+void scene25_initScene(Scene *sc, int entrance);
+void scene25_setupWater(Scene *sc, int entrance);
+int sceneHandler25(ExCommand *cmd);
+int scene25_updateCursor();
+
+void scene26_initScene(Scene *sc);
+void scene26_setupDrop(Scene *sc);
+int sceneHandler26(ExCommand *cmd);
+int scene26_updateCursor();
+
+void scene27_initScene(Scene *sc);
+int sceneHandler27(ExCommand *ex);
+int scene27_updateCursor();
+
+void scene28_initScene(Scene *sc);
+int sceneHandler28(ExCommand *ex);
+int scene28_updateCursor();
+
+int scene29_updateCursor();
+void scene29_initScene(Scene *sc);
+int sceneHandler29(ExCommand *cmd);
+
+int scene30_updateCursor();
+void scene30_initScene(Scene *sc, int flag);
+int sceneHandler30(ExCommand *cmd);
+
+void scene31_initScene(Scene *sc);
+int sceneHandler31(ExCommand *ex);
+
+void scene32_initScene(Scene *sc);
+void scene32_setupMusic();
+int sceneHandler32(ExCommand *cmd);
+int scene32_updateCursor();
+
+void scene33_initScene(Scene *sc);
+void scene33_setupMusic();
+int sceneHandler33(ExCommand *cmd);
+int scene33_updateCursor();
+
+void scene34_initScene(Scene *sc);
+void scene34_initBeh();
+int sceneHandler34(ExCommand *cmd);
+int scene34_updateCursor();
+
+void scene35_initScene(Scene *sc);
+int sceneHandler35(ExCommand *cmd);
+
+int scene36_updateCursor();
+void scene36_initScene(Scene *sc);
+int sceneHandler36(ExCommand *cmd);
+
+void scene37_initScene(Scene *sc);
+int sceneHandler37(ExCommand *ex);
+int scene37_updateCursor();
+
+void scene38_initScene(Scene *sc);
+int sceneHandler38(ExCommand *ex);
+
+int sceneFinal_updateCursor();
+void sceneFinal_initScene();
+int sceneHandlerFinal(ExCommand *cmd);
+
+void sceneDbgMenu_initScene(Scene *sc);
+int sceneHandlerDbgMenu(ExCommand *cmd);
+
+struct Ball {
+ Ball *p0;
+ Ball *p1;
+ StaticANIObject *ani;
+
+ Ball() : p0(0), p1(0), ani(0) {}
+};
+
+struct BallChain {
+ Ball *pHead;
+ Ball *field_8;
+ int numBalls;
+ Ball *pTail;
+ byte *cPlex;
+ int cPlexLen;
+
+ BallChain() : pHead(0), field_8(0), pTail(0), numBalls(0), cPlex(0), cPlexLen(0) {}
+ ~BallChain() { free(cPlex); }
+
+ void init(Ball **ball);
+ Ball *sub04(Ball *ballP, Ball *ballN);
+ void removeBall(Ball *ball);
+ void reset() { pHead = 0; pTail = 0; field_8 = 0; numBalls = 0; free(cPlex); cPlex = 0; cPlexLen = 0; }
+};
class Vars {
- public:
+public:
Vars();
GameVar *swallowedEgg1;
@@ -45,7 +254,453 @@ class Vars {
PictureObject *scene01_picSc01Osk;
PictureObject *scene01_picSc01Osk2;
- GameObject *selector;
+ StaticANIObject *scene02_guvTheDrawer;
+ int scene02_boxDelay;
+ bool scene02_boxOpen;
+
+ StaticANIObject *scene03_eggeater;
+ StaticANIObject *scene03_domino;
+
+ PictureObject *scene04_bottle;
+ StaticANIObject *scene04_hand;
+ StaticANIObject *scene04_plank;
+ StaticANIObject *scene04_clock;
+ StaticANIObject *scene04_spring;
+ StaticANIObject *scene04_mamasha;
+ StaticANIObject *scene04_boot;
+ StaticANIObject *scene04_speaker;
+
+ Common::Point scene04_jumpingKozyawki[20];
+ Common::Point scene04_jumpRotateKozyawki[20];
+
+ Common::List<StaticANIObject *> scene04_kozyawkiObjList;
+ Common::List<GameObject *> scene04_bottleObjList;
+ Common::List<StaticANIObject *> scene04_kozyawkiAni;
+
+ MctlLadder *scene04_ladder;
+ int scene04_ladderOffset;
+
+ bool scene04_coinPut;
+ bool scene04_soundPlaying;
+ bool scene04_dudeOnLadder;
+
+ int scene04_dynamicPhaseIndex;
+ int scene04_sceneClickX;
+ int scene04_sceneClickY;
+ int scene04_dudePosX;
+ int scene04_dudePosY;
+ int scene04_bottleY;
+
+ StaticANIObject *scene04_walkingKozyawka;
+
+ int scene04_speakerVariant;
+ int scene04_speakerPhase;
+
+ bool scene04_bottleIsTaken;
+ bool scene04_kozyawkaOnLadder;
+ int scene04_bottleWeight;
+ bool scene04_var07;
+ bool scene04_ladderClickable;
+ bool scene04_handIsDown;
+ bool scene04_dudeInBottle;
+ bool scene04_kozHeadRaised;
+ bool scene04_bottleIsDropped;
+ bool scene04_bigBallIn;
+ int scene04_bigBallCounter;
+ bool scene04_bigBallFromLeft;
+ bool scene04_clockCanGo;
+ bool scene04_objectIsTaken;
+ int scene04_springOffset;
+ StaticANIObject *scene04_lastKozyawka;
+ int scene04_springDelay;
+
+ StaticANIObject *scene05_handle;
+ StaticANIObject *scene05_wacko;
+ StaticANIObject *scene05_bigHatch;
+ int scene05_wackoTicker;
+ int scene05_handleFlipper;
+ int scene05_floatersTicker;
+
+ StaticANIObject *scene06_mumsy;
+ int scene06_manX;
+ int scene06_manY;
+ int scene06_ballX;
+ int scene06_ballY;
+ StaticANIObject *scene06_someBall;
+ StaticANIObject *scene06_invHandle;
+ StaticANIObject *scene06_liftButton;
+ StaticANIObject *scene06_ballDrop;
+ bool scene06_arcadeEnabled;
+ bool scene06_aimingBall;
+ StaticANIObject *scene06_currentBall;
+ StaticANIObject *scene06_ballInHands;
+ StaticANIObject *scene06_flyingBall;
+ Common::Array<StaticANIObject *> scene06_balls;
+ int scene06_numBallsGiven;
+ int scene06_mumsyNumBalls;
+ int scene06_eggieTimeout;
+ int scene06_eggieDirection;
+ int scene06_mumsyGotBall;
+ int scene06_ballDeltaX;
+ int scene06_ballDeltaY;
+ int scene06_sceneClickX;
+ int scene06_sceneClickY;
+ int scene06_mumsyPos;
+ BehaviorEntryInfo *scene06_mumsyJumpBk;
+ BehaviorEntryInfo *scene06_mumsyJumpFw;
+ int scene06_mumsyJumpBkPercent;
+ int scene06_mumsyJumpFwPercent;
+
+ BehaviorEntryInfo *scene07_lukeAnim;
+ int scene07_lukePercent;
+ StaticANIObject *scene07_plusMinus;
+
+ StaticANIObject *scene08_batuta;
+ StaticANIObject *scene08_vmyats;
+ StaticANIObject *scene08_clock;
+ bool scene08_inAir;
+ bool scene08_flyingUp;
+ int scene08_onBelly;
+ int scene08_stairsOffset;
+ int scene08_snoringCountdown;
+ bool scene08_inArcade;
+ bool scene08_stairsVisible;
+ int scene08_manOffsetY;
+
+ int scene09_dudeY;
+ StaticANIObject *scene09_flyingBall;
+ int scene09_numSwallenBalls;
+ StaticANIObject *scene09_gulper;
+ StaticANIObject *scene09_spitter;
+ StaticANIObject *scene09_grit;
+ bool scene09_gulperIsPresent;
+ bool scene09_dudeIsOnLadder;
+ int scene09_interactingHanger;
+ int scene09_intHangerPhase;
+ int scene09_intHangerMaxPhase;
+ BallChain scene09_balls;
+ Common::Array<Hanger *> scene09_hangers;
+ BallChain scene09_flyingBalls;
+ int scene09_numMovingHangers;
+ int scene09_clickY;
+ Common::Point scene09_hangerOffsets[4];
+
+ StaticANIObject *scene10_gum;
+ StaticANIObject *scene10_packet;
+ StaticANIObject *scene10_packet2;
+ StaticANIObject *scene10_inflater;
+ PictureObject *scene10_ladder;
+ int scene10_hasGum;
+
+ StaticANIObject *scene11_swingie;
+ StaticANIObject *scene11_boots;
+ StaticANIObject *scene11_dudeOnSwing;
+ PictureObject *scene11_hint;
+ MGM scene11_mgm;
+ bool scene11_arcadeIsOn;
+ bool scene11_scrollIsEnabled;
+ bool scene11_scrollIsMaximized;
+ int scene11_hintCounter;
+ int scene11_swingieScreenEdge;
+ int scene11_crySound;
+ double scene11_swingAngle;
+ double scene11_swingOldAngle;
+ double scene11_swingSpeed;
+ double scene11_swingAngleDiff;
+ double scene11_swingInertia;
+ int scene11_swingCounter;
+ int scene11_swingCounterPrevTurn;
+ int scene11_swingDirection;
+ int scene11_swingDirectionPrevTurn;
+ bool scene11_swingIsSwinging;
+ bool scene11_swingieStands;
+ int scene11_dudeX;
+ int scene11_dudeY;
+ int scene11_swingMaxAngle;
+
+ int scene12_fly;
+ int scene12_flyCountdown;
+
+ StaticANIObject *scene13_whirlgig;
+ StaticANIObject *scene13_guard;
+ StaticANIObject *scene13_handleR;
+ StaticANIObject *scene13_handleL;
+ StaticANIObject *scene13_bridge;
+ bool scene13_guardDirection;
+ int scene13_dudeX;
+
+ StaticANIObject *scene14_grandma;
+ int scene14_sceneDeltaX;
+ int scene14_sceneDeltaY;
+ bool scene14_arcadeIsOn;
+ bool scene14_dudeIsKicking;
+ bool scene14_ballIsFlying;
+ bool scene14_dudeCanKick;
+ int scene14_sceneDiffX;
+ int scene14_sceneDiffY;
+ StaticANIObject *scene14_pink;
+ StaticANIObject *scene14_flyingBall;
+ Common::List<StaticANIObject *> scene14_balls;
+ bool scene14_grandmaIsHere;
+ int scene14_dudeX;
+ int scene14_dudeY;
+ int scene14_grandmaX;
+ int scene14_grandmaY;
+ int scene14_dude2X;
+ int scene14_ballDeltaX;
+ int scene14_ballDeltaY;
+ int scene14_ballX;
+ int scene14_ballY;
+ int scene14_hitsLeft;
+ Common::Point scene14_mouseCursorPos;
+
+ int scene15_chantingCountdown;
+ StaticANIObject *scene15_plusminus;
+ PictureObject *scene15_ladder;
+ StaticANIObject *scene15_boot;
+
+ Common::List<StaticANIObject *> scene16_figures;
+ StaticANIObject *scene16_walkingBoy;
+ StaticANIObject *scene16_walkingGirl;
+ int scene16_walkingCount;
+ StaticANIObject *scene16_wire;
+ StaticANIObject *scene16_mug;
+ StaticANIObject *scene16_jettie;
+ StaticANIObject *scene16_boot;
+ bool scene16_girlIsLaughing;
+ int scene16_sound;
+ bool scene16_placeIsOccupied;
+
+ int scene17_flyState;
+ bool scene17_sugarIsShown;
+ int scene17_sceneOldEdgeX;
+ int scene17_flyCountdown;
+ StaticANIObject *scene17_hand;
+ bool scene17_handPhase;
+ int scene17_sceneEdgeX;
+
+ bool scene18_inScene18p1;
+ StaticANIObject *scene18_whirlgig;
+ Common::Array<Swinger *> scene18_swingers;
+ int scene18_wheelCenterX;
+ int scene18_wheelCenterY;
+ bool scene18_bridgeIsConvoluted;
+ int scene18_whirlgigMovMum;
+ bool scene18_girlIsSwinging;
+ int scene18_rotationCounter;
+ int scene18_manY;
+ bool scene18_wheelFlipper;
+ bool scene18_wheelIsTurning;
+ int scene18_kidIsOnWheel;
+ int scene18_boyIsOnWheel;
+ int scene18_girlIsOnWheel;
+ bool scene18_boyJumpedOff;
+ int scene18_manWheelPos;
+ int scene18_manWheelPosTo;
+ int scene18_kidWheelPos;
+ int scene18_kidWheelPosTo;
+ int scene18_jumpDistance;
+ int scene18_jumpAngle;
+ bool scene18_manIsReady;
+ bool scene18_enteredTrubaRight;
+ StaticANIObject *scene18_boy;
+ StaticANIObject *scene18_girl;
+ StaticANIObject *scene18_domino;
+ int scene18_boyJumpX;
+ int scene18_boyJumpY;
+ int scene18_girlJumpX;
+ int scene18_girlJumpY;
+
+ bool scene19_enteredTruba3;
+
+ int scene20_fliesCountdown;
+ StaticANIObject *scene20_grandma;
+
+ StaticANIObject *scene21_giraffeBottom;
+ int scene21_giraffeBottomX;
+ int scene21_giraffeBottomY;
+ int scene21_pipeIsOpen;
+ double scene21_wigglePos;
+ bool scene21_wiggleTrigger;
+
+ StaticANIObject *scene22_bag;
+ StaticANIObject *scene22_giraffeMiddle;
+ bool scene22_dudeIsOnStool;
+ bool scene22_interactionIsDisabled;
+ bool scene22_craneIsOut;
+ int scene22_numBagFalls;
+
+ StaticANIObject *scene23_calend0;
+ StaticANIObject *scene23_calend1;
+ StaticANIObject *scene23_calend2;
+ StaticANIObject *scene23_calend3;
+ bool scene23_topReached;
+ bool scene23_isOnStool;
+ int scene23_someVar;
+ StaticANIObject *scene23_giraffeTop;
+ StaticANIObject *scene23_giraffee;
+
+ bool scene24_jetIsOn;
+ bool scene24_flowIsLow;
+ bool scene24_waterIsOn;
+ StaticANIObject *scene24_water;
+ StaticANIObject *scene24_jet;
+ StaticANIObject *scene24_drop;
+
+ StaticANIObject *scene25_water;
+ StaticANIObject *scene25_board;
+ StaticANIObject *scene25_drop;
+ bool scene25_dudeIsOnBoard;
+ bool scene25_waterIsPresent;
+ bool scene25_boardIsSelectable;
+ bool scene25_beardersAreThere;
+ int scene25_beardersCounter;
+ Common::Array<StaticANIObject *> scene25_bearders;
+ bool scene25_sneezeFlipper;
+
+ StaticANIObject *scene26_chhi;
+ StaticANIObject *scene26_drop;
+ PictureObject *scene26_sockPic;
+ StaticANIObject *scene26_sock;
+ StaticANIObject *scene26_activeVent;
+
+ PictureObject *scene27_hitZone;
+ StaticANIObject *scene27_driver;
+ StaticANIObject *scene27_maid;
+ StaticANIObject *scene27_batHandler;
+ bool scene27_driverHasVent;
+ StaticANIObject *scene27_bat;
+ bool scene27_dudeIsAiming;
+ bool scene27_maxPhaseReached;
+ bool scene27_wipeIsNeeded;
+ bool scene27_driverPushedButton;
+ int scene27_numLostBats;
+ int scene27_knockCount;
+ int scene27_aimStartX;
+ int scene27_aimStartY;
+ int scene27_launchPhase;
+ BallChain scene27_balls;
+ Common::Array<Bat *> scene27_bats;
+ Common::Array<Bat *> scene27_var07;
+
+ bool scene28_fliesArePresent;
+ bool scene28_beardedDirection;
+ PictureObject *scene28_darkeningObject;
+ PictureObject *scene28_lighteningObject;
+ bool scene28_headDirection;
+ bool scene28_headBeardedFlipper;
+ bool scene28_lift6inside;
+
+ StaticANIObject *scene29_porter;
+ StaticANIObject *scene29_shooter1;
+ StaticANIObject *scene29_shooter2;
+ StaticANIObject *scene29_ass;
+ BallChain scene29_balls;
+ BallChain scene29_redBalls;
+ BallChain scene29_flyingRedBalls;
+ BallChain scene29_greenBalls;
+ bool scene29_manIsRiding;
+ bool scene29_arcadeIsOn;
+ bool scene29_reachedFarRight;
+ bool scene29_rideBackEnabled;
+ int scene29_shootCountdown;
+ int scene29_shootDistance;
+ int scene29_manIsHit;
+ int scene29_scrollSpeed;
+ bool scene29_scrollingDisabled;
+ int scene29_hitBall;
+ Common::Array<WalkingBearder *> scene29_bearders;
+ int scene29_manX;
+ int scene29_manY;
+ MGM scene29_mgm;
+
+ StaticANIObject *scene30_leg;
+ int scene30_liftFlag;
+
+ int scene31_chantingCountdown;
+ StaticANIObject *scene31_cactus;
+ StaticANIObject *scene31_plusMinus;
+
+ bool scene32_flagIsWaving;
+ bool scene32_flagNeedsStopping;
+ bool scene32_dudeIsSitting;
+ int scene32_cactusCounter;
+ bool scene32_dudeOnLadder;
+ bool scene32_cactusIsGrowing;
+ StaticANIObject *scene32_flag;
+ StaticANIObject *scene32_cactus;
+ StaticANIObject *scene32_massOrange;
+ StaticANIObject *scene32_massBlue;
+ StaticANIObject *scene32_massGreen;
+ StaticANIObject *scene32_button;
+
+ StaticANIObject *scene33_mug;
+ StaticANIObject *scene33_jettie;
+ StaticANIObject *scene33_cube;
+ int scene33_cubeX;
+ bool scene33_handleIsDown;
+ int scene33_ventsX[9];
+ int scene33_ventsState[9];
+
+ StaticANIObject *scene34_cactus;
+ StaticANIObject *scene34_vent;
+ StaticANIObject *scene34_hatch;
+ StaticANIObject *scene34_boot;
+ bool scene34_dudeClimbed;
+ bool scene34_dudeOnBoard;
+ bool scene34_dudeOnCactus;
+ int scene34_fliesCountdown;
+
+ StaticANIObject *scene35_hose;
+ StaticANIObject *scene35_bellyInflater;
+ int scene35_flowCounter;
+ int scene35_fliesCounter;
+
+ StaticANIObject *scene36_rotohrust;
+ StaticANIObject *scene36_scissors;
+
+ Common::Array<Ring *> scene37_rings;
+ int scene37_lastDudeX;
+ bool scene37_cursorIsLocked;
+ StaticANIObject *scene37_plusMinus1;
+ StaticANIObject *scene37_plusMinus2;
+ StaticANIObject *scene37_plusMinus3;
+ int scene37_soundFlipper;
+ int scene37_dudeX;
+
+ StaticANIObject *scene38_boss;
+ StaticANIObject *scene38_tally;
+ StaticANIObject *scene38_shorty;
+ StaticANIObject *scene38_domino0;
+ StaticANIObject *scene38_dominos;
+ StaticANIObject *scene38_domino1;
+ StaticANIObject *scene38_bottle;
+ int scene38_bossCounter;
+ int scene38_lastBossAnim;
+ int scene38_bossAnimCounter;
+ int scene38_tallyCounter;
+ int scene38_lastTallyAnim;
+ int scene38_tallyAnimCounter;
+ int scene38_shortyCounter;
+ int scene38_lastShortyAnim;
+ int scene38_shortyAnimCounter;
+
+ int sceneFinal_var01;
+ int sceneFinal_var02;
+ int sceneFinal_var03;
+
+ PictureObject *selector;
+};
+
+struct Ring {
+ StaticANIObject *ani;
+ int x;
+ int y;
+ int numSubRings;
+ int subRings[10];
+ bool state;
+
+ Ring();
};
} // End of namespace Fullpipe
diff --git a/engines/fullpipe/scenes/scene01.cpp b/engines/fullpipe/scenes/scene01.cpp
new file mode 100644
index 0000000000..e24eb1fa45
--- /dev/null
+++ b/engines/fullpipe/scenes/scene01.cpp
@@ -0,0 +1,118 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public 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 "fullpipe/fullpipe.h"
+
+#include "fullpipe/objectnames.h"
+#include "fullpipe/constants.h"
+
+#include "fullpipe/gameloader.h"
+#include "fullpipe/motion.h"
+#include "fullpipe/scenes.h"
+#include "fullpipe/statics.h"
+
+#include "fullpipe/interaction.h"
+#include "fullpipe/behavior.h"
+
+
+namespace Fullpipe {
+
+void scene01_fixEntrance() {
+ GameVar *var = g_fp->getGameLoaderGameVar()->getSubVarByName("OBJSTATES")->getSubVarByName("SAVEGAME");
+ if (var->getSubVarAsInt("Entrance") == TrubaLeft)
+ var->setSubVarAsInt("Entrance", TrubaRight);
+}
+
+void scene01_initScene(Scene *sc, int entrance) {
+ g_vars->scene01_picSc01Osk = sc->getPictureObjectById(PIC_SC1_OSK, 0);
+ g_vars->scene01_picSc01Osk->_flags &= 0xFFFB;
+
+ g_vars->scene01_picSc01Osk2 = sc->getPictureObjectById(PIC_SC1_OSK2, 0);
+ g_vars->scene01_picSc01Osk2->_flags &= 0xFFFB;
+
+ if (g_fp->getObjectState(sO_EggCracker) == g_fp->getObjectEnumState(sO_EggCracker, sO_DidNotCrackEgg)) {
+ PictureObject *pic = sc->getPictureObjectById(PIC_SC1_KUCHKA, 0);
+ if (pic)
+ pic->_flags &= 0xFFFB;
+ }
+
+ if (entrance != TrubaLeft) {
+ StaticANIObject *bootAnim = sc->getStaticANIObject1ById(ANI_BOOT_1, -1);
+ if (bootAnim)
+ bootAnim->_flags &= ~0x04;
+ }
+
+ g_fp->lift_setButton(sO_Level2, ST_LBN_2N);
+}
+
+int sceneHandler01(ExCommand *cmd) {
+ int res = 0;
+
+ if (cmd->_messageKind != 17)
+ return 0;
+
+ if (cmd->_messageNum > MSG_SC1_SHOWOSK) {
+ if (cmd->_messageNum == MSG_SC1_UTRUBACLICK)
+ handleObjectInteraction(g_fp->_aniMan, g_fp->_currentScene->getPictureObjectById(PIC_SC1_LADDER, 0), 0);
+
+ return 0;
+ }
+
+ if (cmd->_messageNum == MSG_SC1_SHOWOSK) {
+ g_vars->scene01_picSc01Osk->_flags |= 4;
+
+ g_vars->scene01_picSc01Osk->_priority = 20;
+ g_vars->scene01_picSc01Osk2->_priority = 21;
+
+ return 0;
+ }
+
+ if (cmd->_messageNum != 0x21) {
+ if (cmd->_messageNum == MSG_SC1_SHOWOSK2) {
+ g_vars->scene01_picSc01Osk2->_flags |= 4;
+ g_vars->scene01_picSc01Osk2->_priority = 20;
+ g_vars->scene01_picSc01Osk->_priority = 21;
+
+ return 0;
+ }
+
+ return 0;
+ }
+
+ if (g_fp->_aniMan2) {
+ if (g_fp->_aniMan2->_ox < g_fp->_sceneRect.left + 200) {
+ g_fp->_currentScene->_x = g_fp->_aniMan2->_ox - g_fp->_sceneRect.left - 300;
+ }
+
+ if (g_fp->_aniMan2->_ox > g_fp->_sceneRect.right - 200)
+ g_fp->_currentScene->_x = g_fp->_aniMan2->_ox - g_fp->_sceneRect.right + 300;
+
+ res = 1;
+ }
+ g_fp->_behaviorManager->updateBehaviors();
+
+ g_fp->startSceneTrack();
+
+ return res;
+}
+
+} // End of namespace Fullpipe
diff --git a/engines/fullpipe/scenes/scene02.cpp b/engines/fullpipe/scenes/scene02.cpp
new file mode 100644
index 0000000000..109a20a07a
--- /dev/null
+++ b/engines/fullpipe/scenes/scene02.cpp
@@ -0,0 +1,138 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public 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 "fullpipe/fullpipe.h"
+
+#include "fullpipe/objectnames.h"
+#include "fullpipe/constants.h"
+
+#include "fullpipe/gameloader.h"
+#include "fullpipe/motion.h"
+#include "fullpipe/scenes.h"
+#include "fullpipe/statics.h"
+
+#include "fullpipe/interaction.h"
+#include "fullpipe/behavior.h"
+#include "fullpipe/floaters.h"
+
+
+namespace Fullpipe {
+
+void scene02_initScene(Scene *sc) {
+ g_vars->scene02_guvTheDrawer = sc->getStaticANIObject1ById(ANI_DADAYASHIK, -1);
+
+ if (g_fp->getObjectState(sO_GuvTheDrawer) == g_fp->getObjectEnumState(sO_GuvTheDrawer, sO_IsSleeping)) {
+ Scene *s = g_fp->_currentScene;
+
+ g_fp->_currentScene = sc;
+ g_vars->scene02_guvTheDrawer->changeStatics2(ST_DYAS_LIES);
+ g_fp->_currentScene = s;
+ }
+
+ g_vars->scene02_boxDelay = 0;
+
+ StaticANIObject *box = sc->getStaticANIObject1ById(ANI_SC2_BOX, -1);
+
+ if (box && box->_flags & 4) {
+ g_vars->scene02_boxOpen = false;
+ } else {
+ g_vars->scene02_boxOpen = true;
+ g_vars->scene02_boxDelay = 100 * g_fp->_rnd->getRandomNumber(32767) + 150;
+ }
+
+ g_fp->_floaters->init(g_fp->_gameLoader->_gameVar->getSubVarByName("SC_2"));
+}
+
+void sceneHandler02_ladderClick() {
+ handleObjectInteraction(g_fp->_aniMan2, g_fp->_currentScene->getPictureObjectById(PIC_SC2_DTRUBA, 0), 0);
+}
+
+void sceneHandler02_showLadder() {
+ g_fp->_currentScene->getPictureObjectById(PIC_SC2_LADDER, 0)->_flags |= 4;
+}
+
+void sceneHandler02_hideLadder() {
+ g_fp->_currentScene->getPictureObjectById(PIC_SC2_LADDER, 0)->_flags &= 0xfffb;
+ g_fp->_aniMan2->_priority = 25;
+}
+
+int sceneHandler02(ExCommand *ex) {
+ int res = 0;
+
+ if (ex->_messageKind != 17)
+ return 0;
+
+ switch(ex->_messageNum) {
+ case MSG_SC2_LADDERCLICK:
+ sceneHandler02_ladderClick();
+ return 0;
+
+ case MSG_SC2_SHOWLADDER:
+ sceneHandler02_showLadder();
+ return 0;
+
+ case MSG_SC2_PUTMANUP:
+ g_fp->_aniMan2->_priority = 0;
+ return 0;
+
+ case MSG_SC2_HIDELADDER:
+ sceneHandler02_hideLadder();
+ return 0;
+
+ case 33:
+ if (g_fp->_aniMan2) {
+ if (g_fp->_aniMan2->_ox < g_fp->_sceneRect.left + 200)
+ g_fp->_currentScene->_x = g_fp->_aniMan2->_ox - g_fp->_sceneRect.left - 300;
+
+ if (g_fp->_aniMan2->_ox > g_fp->_sceneRect.right - 200)
+ g_fp->_currentScene->_x = g_fp->_aniMan2->_ox - g_fp->_sceneRect.right + 300;
+
+ res = 1;
+ }
+
+ if (g_vars->scene02_boxOpen) {
+ if (g_vars->scene02_boxDelay >= 1) {
+ --g_vars->scene02_boxDelay;
+ } else if (g_fp->_floaters->_array2.size() >= 1) {
+ if (g_fp->_floaters->_array2[0]->val5 == -50) {
+ g_fp->_floaters->stopAll();
+ g_vars->scene02_boxOpen = false;
+ g_vars->scene02_boxDelay = 100 * g_fp->_rnd->getRandomNumber(32767) + 150;
+ } else {
+ g_fp->_floaters->_array2[0]->val3 = -50;
+ }
+ } else {
+ g_fp->_floaters->genFlies(g_fp->_currentScene, g_fp->_rnd->getRandomNumber(700) + 100, -50, 0, 0);
+ g_vars->scene02_boxDelay = 500 * g_fp->_rnd->getRandomNumber(32767) + 1000;
+ }
+ }
+
+ g_fp->_floaters->update();
+ g_fp->_behaviorManager->updateBehaviors();
+
+ g_fp->startSceneTrack();
+ }
+
+ return res;
+}
+
+} // End of namespace Fullpipe
diff --git a/engines/fullpipe/scenes/scene03.cpp b/engines/fullpipe/scenes/scene03.cpp
new file mode 100644
index 0000000000..e6c9fa3bbd
--- /dev/null
+++ b/engines/fullpipe/scenes/scene03.cpp
@@ -0,0 +1,295 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public 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 "fullpipe/fullpipe.h"
+
+#include "fullpipe/objectnames.h"
+#include "fullpipe/constants.h"
+
+#include "fullpipe/gameloader.h"
+#include "fullpipe/motion.h"
+#include "fullpipe/scenes.h"
+#include "fullpipe/statics.h"
+
+#include "fullpipe/interaction.h"
+#include "fullpipe/behavior.h"
+
+namespace Fullpipe {
+
+void FullpipeEngine::setSwallowedEggsState() {
+ GameVar *v = _gameLoader->_gameVar->getSubVarByName("OBJSTATES")->getSubVarByName(sO_GulpedEggs);
+
+ g_vars->swallowedEgg1 = v->getSubVarByName(sO_Egg1);
+ g_vars->swallowedEgg2 = v->getSubVarByName(sO_Egg2);
+ g_vars->swallowedEgg3 = v->getSubVarByName(sO_Egg3);
+
+ g_vars->swallowedEgg1->_value.intValue = 0;
+ g_vars->swallowedEgg2->_value.intValue = 0;
+ g_vars->swallowedEgg3->_value.intValue = 0;
+}
+
+void scene03_initScene(Scene *sc) {
+ g_vars->scene03_eggeater = sc->getStaticANIObject1ById(ANI_EGGEATER, -1);
+ g_vars->scene03_domino = sc->getStaticANIObject1ById(ANI_DOMINO_3, -1);
+
+ GameVar *v = g_fp->_gameLoader->_gameVar->getSubVarByName("OBJSTATES")->getSubVarByName(sO_GulpedEggs);
+
+ g_vars->swallowedEgg1 = v->getSubVarByName(sO_Egg1);
+ g_vars->swallowedEgg2 = v->getSubVarByName(sO_Egg2);
+ g_vars->swallowedEgg3 = v->getSubVarByName(sO_Egg3);
+
+ g_fp->lift_setButton(sO_Level2, ST_LBN_2N);
+
+ g_fp->lift_init(sc, QU_SC3_ENTERLIFT, QU_SC3_EXITLIFT);
+}
+
+void scene03_setEaterState() {
+ if (g_fp->getObjectState(sO_EggGulperGaveCoin) == g_fp->getObjectEnumState(sO_EggGulperGaveCoin, sO_Yes)) {
+ g_fp->_behaviorManager->setBehaviorEnabled(g_vars->scene03_eggeater, ST_EGTR_SLIM, QU_EGTR_SLIMSHOW, 0);
+ g_fp->_behaviorManager->setBehaviorEnabled(g_vars->scene03_eggeater, ST_EGTR_MID1, QU_EGTR_MD1_SHOW, 0);
+ g_fp->_behaviorManager->setBehaviorEnabled(g_vars->scene03_eggeater, ST_EGTR_MID2, QU_EGTR_MD2_SHOW, 0);
+ }
+}
+
+int scene03_updateCursor() {
+ g_fp->updateCursorCommon();
+
+ if (g_fp->_cursorId == PIC_CSR_DEFAULT && g_fp->_objectIdAtCursor == PIC_SC3_DOMIN && g_vars->scene03_domino) {
+ if (g_vars->scene03_domino->_flags & 4)
+ g_fp->_cursorId = PIC_CSR_ITN;
+ }
+
+ return g_fp->_cursorId;
+}
+
+void sceneHandler03_eaterFat() {
+ g_vars->scene03_eggeater->_flags &= 0xFF7F;
+
+ g_vars->scene03_eggeater->startAnim(MV_EGTR_FATASK, 0, -1);
+}
+
+void sceneHandler03_swallowEgg(int item) {
+ if (!g_vars->swallowedEgg1->_value.intValue) {
+ g_vars->swallowedEgg1->_value.intValue = item;
+ } else if (!g_vars->swallowedEgg2->_value.intValue) {
+ g_vars->swallowedEgg2->_value.intValue = item;
+ } else if (!g_vars->swallowedEgg3->_value.intValue) {
+ g_vars->swallowedEgg3->_value.intValue = item;
+
+ g_fp->setObjectState(sO_EggGulperGaveCoin, g_fp->getObjectEnumState(sO_EggGulperGaveCoin, sO_Yes));
+
+ scene03_setEaterState();
+ }
+}
+
+void sceneHandler03_giveItem(ExCommand *ex) {
+ if (ex->_parentId == ANI_INV_EGGAPL || ex->_parentId == ANI_INV_EGGDOM ||
+ ex->_parentId == ANI_INV_EGGCOIN || ex->_parentId == ANI_INV_EGGBOOT ||
+ ex->_parentId == ANI_INV_EGGGLS)
+ sceneHandler03_swallowEgg(ex->_parentId);
+}
+
+int sceneHandler03_swallowedEgg1State() {
+ return g_vars->swallowedEgg1->_value.intValue;
+}
+
+void sceneHandler03_giveCoin(ExCommand *ex) {
+ MessageQueue *mq = g_fp->_globalMessageQueueList->getMessageQueueById(ex->_parId);
+
+ if (mq && mq->getCount() > 0) {
+ ExCommand *ex0 = mq->getExCommandByIndex(0);
+ ExCommand *ex1 = mq->getExCommandByIndex(1);
+
+ if (sceneHandler03_swallowedEgg1State()) {
+ ex0->_messageKind = 1;
+ ex1->_messageKind = 1;
+
+ getGameLoaderInventory()->removeItem(ANI_INV_COIN, 1);
+ } else {
+ ex0->_messageKind = 0;
+ ex0->_excFlags |= 1;
+
+ ex1->_messageKind = 0;
+ ex1->_excFlags |= 1;
+
+ g_vars->scene03_eggeater->_flags &= 0xFF7Fu;
+ }
+ }
+}
+
+void sceneHandler03_goLadder() {
+ handleObjectInteraction(g_fp->_aniMan, g_fp->_currentScene->getPictureObjectById(PIC_SC3_LADDER, 0), 0);
+}
+
+void sceneHandler03_pushEggStack() {
+ g_vars->swallowedEgg1->_value.intValue = g_vars->swallowedEgg2->_value.intValue;
+ g_vars->swallowedEgg2->_value.intValue = g_vars->swallowedEgg3->_value.intValue;
+ g_vars->swallowedEgg3->_value.intValue = 0;
+
+ if (g_vars->swallowedEgg2->_value.intValue == ANI_INV_EGGBOOT
+ && g_vars->swallowedEgg1->_value.intValue == ANI_INV_EGGAPL) {
+ g_vars->swallowedEgg1->_value.intValue = ANI_INV_EGGBOOT;
+ g_vars->swallowedEgg2->_value.intValue = ANI_INV_EGGAPL;
+ }
+}
+
+void sceneHandler03_releaseEgg() {
+ g_vars->scene03_eggeater->_flags &= 0xFF7F;
+
+ g_vars->scene03_eggeater->show1(-1, -1, -1, 0);
+}
+
+void sceneHandler03_takeEgg(ExCommand *ex) {
+ MessageQueue *mq = g_fp->_globalMessageQueueList->getMessageQueueById(ex->_parId);
+
+ if (mq && mq->getCount() > 0) {
+ ExCommand *ex0 = mq->getExCommandByIndex(0);
+ ExCommand *ex1 = mq->getExCommandByIndex(1);
+
+ int egg1 = sceneHandler03_swallowedEgg1State();
+
+ if (egg1 && ex0) {
+ ex0->_parentId = egg1;
+ sceneHandler03_pushEggStack();
+ }
+
+ if ( g_vars->swallowedEgg1->_value.intValue == ANI_INV_EGGAPL
+ && !g_vars->swallowedEgg2->_value.intValue
+ && !g_vars->swallowedEgg3->_value.intValue
+ && ex1) {
+
+ if (ex1->_objtype == kObjTypeObjstateCommand) {
+ ObjstateCommand *com = (ObjstateCommand *)ex1;
+
+ com->_value = g_fp->getObjectEnumState(sO_EggGulper, sO_WantsNothing);
+ }
+ }
+ }
+}
+
+int sceneHandler03(ExCommand *ex) {
+ if (ex->_messageKind != 17) {
+ if (ex->_messageKind == 57)
+ sceneHandler03_giveItem(ex);
+ return 0;
+ }
+
+ switch (ex->_messageNum) {
+ case MSG_LIFT_EXITLIFT:
+ g_fp->lift_exitSeq(ex);
+ break;
+
+ case MSG_LIFT_CLOSEDOOR:
+ g_fp->lift_closedoorSeq();
+ break;
+
+ case MSG_SC3_ONTAKECOIN:
+ sceneHandler03_eaterFat();
+ break;
+
+ case MSG_LIFT_STARTEXITQUEUE:
+ g_fp->lift_startExitQueue();
+ break;
+
+ case MSG_SC3_RELEASEEGG:
+ sceneHandler03_releaseEgg();
+ break;
+
+ case MSG_LIFT_CLICKBUTTON:
+ g_fp->lift_clickButton();
+ break;
+
+ case MSG_SC3_HIDEDOMINO:
+ g_vars->scene03_domino->_flags &= 0xFFFB;
+ break;
+
+ case MSG_SC3_TAKEEGG:
+ sceneHandler03_takeEgg(ex);
+ break;
+
+ case MSG_LIFT_GO:
+ g_fp->lift_goAnimation();
+ break;
+
+ case MSG_SC3_UTRUBACLICK:
+ sceneHandler03_goLadder();
+ break;
+
+ case MSG_SC3_TESTFAT:
+ sceneHandler03_giveCoin(ex);
+ break;
+
+ case 64:
+ g_fp->lift_hoverButton(ex);
+ break;
+
+ case 29:
+ {
+ StaticANIObject *ani = g_fp->_currentScene->getStaticANIObjectAtPos(ex->_sceneClickX, ex->_sceneClickY);
+ if (ani && ani->_id == ANI_LIFTBUTTON) {
+ g_fp->lift_animateButton(ani);
+ ex->_messageKind = 0;
+
+ return 0;
+ }
+
+ if (g_fp->_currentScene->getPictureObjectIdAtPos(ex->_sceneClickX, ex->_sceneClickY) == PIC_SC3_DOMIN) {
+ if (g_vars->scene03_domino)
+ if (g_vars->scene03_domino->_flags & 4)
+ if (g_fp->_aniMan->isIdle())
+ if (!(g_fp->_aniMan->_flags & 0x100) && g_fp->_msgObjectId2 != g_vars->scene03_domino->_id) {
+ handleObjectInteraction(g_fp->_aniMan, g_vars->scene03_domino, ex->_keyCode);
+ ex->_messageKind = 0;
+
+ return 0;
+ }
+ }
+
+ break;
+ }
+
+ case 33:
+ {
+ int res = 0;
+
+ if (g_fp->_aniMan2) {
+ if (g_fp->_aniMan2->_ox < g_fp->_sceneRect.left + 200)
+ g_fp->_currentScene->_x = g_fp->_aniMan2->_ox - g_fp->_sceneRect.left - 300;
+
+ if (g_fp->_aniMan2->_ox > g_fp->_sceneRect.right - 200)
+ g_fp->_currentScene->_x = g_fp->_aniMan2->_ox - g_fp->_sceneRect.right + 300;
+
+ res = 1;
+ }
+
+ g_fp->_behaviorManager->updateBehaviors();
+
+ g_fp->startSceneTrack();
+
+ return res;
+ }
+ }
+
+ return 0;
+}
+
+} // End of namespace Fullpipe
diff --git a/engines/fullpipe/scenes/scene04.cpp b/engines/fullpipe/scenes/scene04.cpp
new file mode 100644
index 0000000000..fd1ececdf2
--- /dev/null
+++ b/engines/fullpipe/scenes/scene04.cpp
@@ -0,0 +1,1562 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public 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 "fullpipe/fullpipe.h"
+
+#include "fullpipe/objectnames.h"
+#include "fullpipe/constants.h"
+#include "fullpipe/utils.h"
+#include "fullpipe/gfx.h"
+#include "fullpipe/messages.h"
+#include "fullpipe/motion.h"
+#include "fullpipe/scenes.h"
+#include "fullpipe/statics.h"
+#include "fullpipe/scene.h"
+#include "fullpipe/interaction.h"
+#include "fullpipe/gameloader.h"
+#include "fullpipe/behavior.h"
+
+namespace Fullpipe {
+
+static const int scene04_speakerPhases[] = {
+ 0, 1, 2, 3, -1, -1,
+ 0, 2, 3, -1, -1, -1,
+ 0, 2, -1, -1, -1, -1
+};
+
+void scene04_speakerCallback(int *phase) {
+ if (g_vars->scene04_soundPlaying) {
+ if (g_vars->scene04_speakerPhase >= 0) {
+ *phase = scene04_speakerPhases[g_vars->scene04_speakerPhase + 6 * g_vars->scene04_speakerVariant];
+
+ g_vars->scene04_speakerPhase++;
+
+ if (scene04_speakerPhases[g_vars->scene04_speakerPhase + 6 * g_vars->scene04_speakerVariant] < 0) {
+ g_vars->scene04_speakerPhase = 0;
+ g_vars->scene04_speakerVariant = g_fp->_rnd->getRandomNumber(2);
+ }
+ } else {
+ ++g_vars->scene04_speakerPhase;
+ }
+ }
+}
+
+void scene04_initScene(Scene *sc) {
+ g_vars->scene04_dudeOnLadder = false;
+ g_vars->scene04_bottle = sc->getPictureObjectById(PIC_SC4_BOTTLE, 0);
+ g_vars->scene04_hand = sc->getStaticANIObject1ById(ANI_HAND, -1);
+ g_vars->scene04_plank = sc->getStaticANIObject1ById(ANI_PLANK, -1);
+ g_vars->scene04_clock = sc->getStaticANIObject1ById(ANI_CLOCK, -1);
+ g_vars->scene04_spring = sc->getStaticANIObject1ById(ANI_SPRING, -1);
+ g_vars->scene04_mamasha = sc->getStaticANIObject1ById(ANI_MAMASHA_4, -1);
+ g_vars->scene04_boot = sc->getStaticANIObject1ById(ANI_SC4_BOOT, -1);
+ g_vars->scene04_ladder = 0;
+
+ StaticANIObject *koz = sc->getStaticANIObject1ById(ANI_KOZAWKA, -1);
+
+ if (koz) {
+ Movement *kozmov = koz->getMovementById(MV_KZW_JUMP);
+ if (kozmov) {
+ uint kozsize = kozmov->_currMovement ? kozmov->_currMovement->_dynamicPhases.size() : kozmov->_dynamicPhases.size();
+
+ for (uint i = 0; i < kozsize; i++) {
+ kozmov->setDynamicPhaseIndex(i);
+
+ if (kozmov->_framePosOffsets) {
+ g_vars->scene04_jumpingKozyawki[i] = *kozmov->_framePosOffsets[kozmov->_currDynamicPhaseIndex];
+ } else {
+ kozmov->_somePoint.x = 0;
+ kozmov->_somePoint.y = 0;
+ g_vars->scene04_jumpingKozyawki[i] = kozmov->_somePoint;
+ }
+ }
+ }
+
+ kozmov = koz->getMovementById(MV_KZW_JUMPROTATE);
+ if (kozmov) {
+ uint kozsize = kozmov->_currMovement ? kozmov->_currMovement->_dynamicPhases.size() : kozmov->_dynamicPhases.size();
+
+ for (uint i = 0; i < kozsize; i++) {
+ kozmov->setDynamicPhaseIndex(i);
+
+ if (kozmov->_framePosOffsets) {
+ g_vars->scene04_jumpRotateKozyawki[i] = *kozmov->_framePosOffsets[kozmov->_currDynamicPhaseIndex];
+ } else {
+ kozmov->_somePoint.x = 0;
+ kozmov->_somePoint.y = 0;
+ g_vars->scene04_jumpRotateKozyawki[i] = kozmov->_somePoint;
+ }
+ }
+ }
+ }
+
+ Interaction *plank = getGameLoaderInteractionController()->getInteractionByObjectIds(ANI_PLANK, 0, 0);
+ if (plank)
+ plank->_flags |= 8;
+
+ if (g_fp->getObjectState(sO_Jar_4) == g_fp->getObjectEnumState(sO_Jar_4, sO_UpsideDown)) {
+ g_vars->scene04_bottleObjList.clear();
+ g_vars->scene04_kozyawkiObjList.clear();
+
+ sc->getPictureObjectById(PIC_SC4_BOTTLE, 0)->_flags &= 0xfffb;
+ sc->getPictureObjectById(PIC_SC4_MASK, 0)->_flags &= 0xfffb;
+ sc->getStaticANIObject1ById(ANI_SPRING, 0)->_flags &= 0xfffb;
+
+ g_vars->scene04_clockCanGo = false;
+ g_vars->scene04_objectIsTaken = false;
+ } else {
+ StaticANIObject *spring = sc->getStaticANIObject1ById(ANI_SPRING, -1);
+
+ if (spring)
+ spring->_callback2 = 0;
+
+ g_vars->scene04_bottleObjList.clear();
+ g_vars->scene04_bottleObjList.push_back(sc->getPictureObjectById(PIC_SC4_BOTTLE, 0));
+ g_vars->scene04_bottleObjList.push_back(sc->getPictureObjectById(PIC_SC4_MASK, 0));
+
+ g_vars->scene04_kozyawkiObjList.clear();
+
+ if (koz) {
+ koz->loadMovementsPixelData();
+
+ koz->_statics = koz->getStaticsById(ST_KZW_EMPTY);
+ koz->setOXY(0, 0);
+ koz->hide();
+
+ g_vars->scene04_kozyawkiObjList.push_back(koz);
+
+ for (int i = 0; i < 6; i++) {
+ StaticANIObject *koz1 = new StaticANIObject(koz);
+
+ sc->addStaticANIObject(koz1, 1);
+ koz1->_statics = koz->getStaticsById(ST_KZW_EMPTY);
+ koz1->setOXY(0, 0);
+ koz1->hide();
+ g_vars->scene04_kozyawkiObjList.push_back(koz1);
+ }
+ }
+ sc->getPictureObjectById(PIC_SC4_BOTTLE2, 0)->_flags &= 0xfffb;
+
+ g_vars->scene04_clockCanGo = true;
+ g_vars->scene04_objectIsTaken = true;
+ }
+
+ g_vars->scene04_bottleIsTaken = false;
+ g_vars->scene04_soundPlaying = false;
+ g_vars->scene04_kozyawkaOnLadder = false;
+ g_vars->scene04_walkingKozyawka = 0;
+ g_vars->scene04_bottleWeight = 2;
+ g_vars->scene04_dynamicPhaseIndex = 0;
+
+ g_vars->scene04_kozyawkiAni.clear();
+
+ g_fp->setObjectState(sO_LowerPipe, g_fp->getObjectEnumState(sO_LowerPipe, sO_IsClosed));
+
+ g_vars->scene04_var07 = false;
+ g_vars->scene04_ladderClickable = false;
+ g_vars->scene04_coinPut = false;
+ g_vars->scene04_handIsDown = false;
+ g_vars->scene04_dudeInBottle = false;
+ g_vars->scene04_kozHeadRaised = false;
+ g_vars->scene04_bottleIsDropped = false;
+ g_vars->scene04_bigBallIn = true;
+ g_vars->scene04_bigBallCounter = 0;
+ g_vars->scene04_bigBallFromLeft = true;
+
+ if (g_fp->getObjectState(sO_BigMumsy) != g_fp->getObjectEnumState(sO_BigMumsy, sO_IsGone))
+ g_vars->scene04_mamasha->hide();
+
+ g_vars->scene04_speaker = sc->getStaticANIObject1ById(ANI_SPEAKER_4, -1);
+ g_vars->scene04_speaker->_callback2 = scene04_speakerCallback;
+ g_vars->scene04_speaker->startAnim(MV_SPK4_PLAY, 0, -1);
+
+ g_vars->scene04_speakerVariant = 0;
+ g_vars->scene04_speakerPhase = 0;
+
+ g_fp->initArcadeKeys("SC_4");
+}
+
+bool sceneHandler04_friesAreWalking() {
+ if (g_vars->scene04_dudeOnLadder && g_fp->_aniMan->isIdle() && !(g_fp->_aniMan->_flags & 0x100)) {
+ int col = g_vars->scene04_ladder->collisionDetection(g_fp->_aniMan);
+ if (col >= 3 && col <= 6 ) {
+ Movement *koz;
+
+ if (!g_vars->scene04_walkingKozyawka
+ || (koz = g_vars->scene04_walkingKozyawka->_movement) == 0
+ || koz->_id != MV_KZW_WALKPLANK
+ || koz->_currDynamicPhaseIndex < 10
+ || koz->_currDynamicPhaseIndex > 41)
+ return true;
+ }
+ }
+
+ return false;
+}
+
+int scene04_updateCursor() {
+ g_fp->updateCursorCommon();
+
+ if (g_fp->_objectIdAtCursor == PIC_SC4_LRTRUBA) {
+ if (!g_vars->scene04_objectIsTaken) {
+ g_fp->_cursorId = PIC_CSR_DEFAULT;
+
+ return g_fp->_cursorId;
+ }
+ } else if (g_fp->_objectIdAtCursor == ANI_PLANK || g_fp->_objectIdAtCursor == PIC_SC4_PLANK) {
+ if (g_fp->_objectIdAtCursor == ANI_PLANK && g_fp->_cursorId != PIC_CSR_ITN)
+ return g_fp->_cursorId;
+
+ if (g_fp->_objectIdAtCursor == ANI_PLANK || (g_fp->_objectIdAtCursor == PIC_SC4_PLANK && g_fp->_cursorId == PIC_CSR_DEFAULT)) {
+ if (sceneHandler04_friesAreWalking()) {
+ g_fp->_cursorId = PIC_CSR_ARCADE1;
+ return g_fp->_cursorId;
+ }
+ if (g_vars->scene04_soundPlaying) {
+ g_fp->_cursorId = PIC_CSR_DEFAULT;
+ return g_fp->_cursorId;
+ }
+ }
+ }
+
+ if (g_fp->_objectIdAtCursor == PIC_CSR_ITN && g_fp->_objectIdAtCursor == PIC_SC4_DOWNTRUBA)
+ g_fp->_cursorId = PIC_CSR_GOD;
+
+ return g_fp->_cursorId;
+}
+
+void sceneHandler04_checkBigBallClick() {
+ StaticANIObject *ball = g_fp->_currentScene->getStaticANIObject1ById(ANI_BIGBALL, -1);
+
+ if (ball)
+ for (uint i = 0; i < ball->_movements.size(); i++)
+ ((Movement *)ball->_movements[i])->_counterMax = 73;
+
+ g_vars->scene04_bigBallIn = true;
+}
+
+void sceneHandler04_clickBottle() {
+ if (!g_vars->scene04_bottleIsTaken)
+ g_vars->scene04_springOffset += 5;
+}
+
+void sceneHandler04_clickButton() {
+ StaticANIObject *but = g_fp->_currentScene->getStaticANIObject1ById(ANI_BUTTON, -1);
+
+ if (but) {
+ if (!g_vars->scene04_clock->_movement ||
+ (g_vars->scene04_clock->_movement->_id == MV_CLK_GO && g_vars->scene04_clock->_movement->_currDynamicPhaseIndex > 3 &&
+ g_vars->scene04_clock->_movement->_currDynamicPhaseIndex < 105)) {
+ if (!g_vars->scene04_hand->_movement && !g_vars->scene04_bottleIsTaken) {
+ but->startAnim(MV_BTN_CLICK, 0, -1);
+ g_vars->scene04_hand->startAnim(MV_HND_POINT, 0, -1);
+ }
+ }
+ }
+}
+
+void sceneHandler04_downLadder(int x, int y) {
+ g_vars->scene04_ladder->method34(g_fp->_aniMan, x + g_vars->scene04_ladder->_ladder_field_20, y + g_vars->scene04_ladder->_ladder_field_24, 0, 0);
+}
+
+void sceneHandler04_walkClimbLadder(ExCommand *ex) {
+ MessageQueue *mq = new MessageQueue(g_fp->_globalMessageQueueList->compact());
+
+ ExCommand *ex1 = new ExCommand(ANI_MAN, 1, MV_MAN_TOLADDER, 0, 0, 0, 1, 0, 0, 0);
+
+ ex1->_keyCode = g_fp->_aniMan->_okeyCode;
+ ex1->_excFlags |= 2;
+
+ mq->addExCommandToEnd(ex1);
+
+ ExCommand *ex2 = new ExCommand(ANI_MAN, 1, MV_MAN_STOPLADDER, 0, 0, 0, 1, 0, 0, 0);
+
+ ex2->_keyCode = g_fp->_aniMan->_okeyCode;
+ ex2->_excFlags |= 2;
+
+ mq->addExCommandToEnd(ex2);
+
+ ExCommand *ex3;
+
+ if (ex) {
+ ex3 = ex->createClone();
+ } else {
+ ex3 = new ExCommand(0, 17, MSG_SC4_CLICKLADDER, 0, 0, 0, 1, 0, 0, 0);
+ ex3->_excFlags |= 3;
+ }
+
+ mq->addExCommandToEnd(ex3);
+
+ mq->setFlags(mq->getFlags() | 1);
+
+ mq->chain(0);
+
+ g_vars->scene04_dudeOnLadder = 1;
+
+ g_vars->scene04_ladder = new MctlLadder;
+ g_vars->scene04_ladder->_ladderX = 1089;
+ g_vars->scene04_ladder->_ladderY = 406;
+ g_vars->scene04_ladder->_ladder_field_14 = 12;
+ g_vars->scene04_ladder->_width = 0;
+ g_vars->scene04_ladder->_height = -40;
+ g_vars->scene04_ladder->_ladder_field_20 = 0;
+ g_vars->scene04_ladder->_ladder_field_24 = -60;
+
+ g_vars->scene04_ladder->addObject(g_fp->_aniMan);
+
+ if (g_vars->scene04_soundPlaying) {
+ g_vars->scene04_ladder->_ladmovements.front()->movVars->varUpStart = MV_MAN_STARTLADDER2;
+ g_vars->scene04_ladder->_ladmovements.front()->movVars->varUpGo = MV_MAN_GOLADDER2;
+ g_vars->scene04_ladder->_ladmovements.front()->movVars->varUpStop = MV_MAN_STOPLADDER2;
+ g_vars->scene04_ladder->_ladmovements.front()->staticIds[2] = ST_MAN_GOLADDER2;
+ } else {
+ g_vars->scene04_ladder->_ladmovements.front()->movVars->varUpStart = MV_MAN_STARTLADDER;
+ g_vars->scene04_ladder->_ladmovements.front()->movVars->varUpGo = MV_MAN_GOLADDER;
+ g_vars->scene04_ladder->_ladmovements.front()->movVars->varUpStop = MV_MAN_STOPLADDER;
+ g_vars->scene04_ladder->_ladmovements.front()->staticIds[2] = ST_MAN_GOLADDER;
+ }
+
+ g_fp->_aniMan->_priority = 12;
+
+ getSc2MctlCompoundBySceneId(g_fp->_currentScene->_sceneId)->clearEnabled();
+ getGameLoaderInteractionController()->disableFlag24();
+}
+
+void sceneHandler04_clickLadder() {
+ g_vars->scene04_dudePosX = g_fp->_aniMan->_ox;
+ g_vars->scene04_dudePosY = g_fp->_aniMan->_oy;
+
+ if (g_vars->scene04_dudeOnLadder) {
+ if (!g_fp->_aniMan->isIdle() || (g_fp->_aniMan->_flags & 0x100)) {
+ g_vars->scene04_ladderClickable = true;
+ } else {
+ int h3 = 3 * g_vars->scene04_ladder->_height;
+ int half = abs(g_vars->scene04_ladder->_height) / 2;
+ int start = g_vars->scene04_ladder->_ladderY - g_vars->scene04_ladder->_ladder_field_24;
+ int min = 2 * h3 + start + half + 1;
+ int max = h3 + start - half - 1;
+
+ if (g_vars->scene04_sceneClickY > max)
+ g_vars->scene04_sceneClickY = max;
+
+ if (g_vars->scene04_sceneClickY < min)
+ g_vars->scene04_sceneClickY = min;
+
+ sceneHandler04_downLadder(g_vars->scene04_sceneClickX, g_vars->scene04_sceneClickY);
+
+ g_vars->scene04_ladderClickable = false;
+ }
+ } else {
+ if (g_fp->_aniMan->isIdle() && !(g_fp->_aniMan->_flags & 0x100)) {
+ if (abs(1095 - g_vars->scene04_dudePosX) > 1 || abs(434 - g_vars->scene04_dudePosY) > 1) {
+ MessageQueue *mq = getSc2MctlCompoundBySceneId(g_fp->_currentScene->_sceneId)->method34(g_fp->_aniMan, 1095, 434, 1, ST_MAN_UP);
+ if (mq) {
+ ExCommand *ex = new ExCommand(0, 17, MSG_SC4_CLICKLADDER, 0, 0, 0, 1, 0, 0, 0);
+
+ ex->_excFlags = 3;
+ mq->addExCommandToEnd(ex);
+
+ postExCommand(g_fp->_aniMan->_id, 2, 1095, 434, 0, -1);
+ }
+ } else {
+ sceneHandler04_walkClimbLadder(0);
+ }
+ }
+ }
+}
+
+void sceneHandler04_jumpOnLadder() {
+ if (g_fp->_aniMan->_movement && g_fp->_aniMan->_movement->_id != MV_MAN_LOOKLADDER)
+ return;
+
+ if (g_fp->_aniMan->_statics->_staticsId != ST_MAN_STANDLADDER && g_fp->_aniMan->_statics->_staticsId != ST_MAN_LADDERDOWN)
+ return;
+
+ g_fp->_aniMan->changeStatics2(ST_MAN_LADDERDOWN);
+
+ g_fp->_aniMan->_flags |= 1;
+
+ MGM mgm;
+ MGMInfo mgminfo;
+
+ mgm.addItem(ANI_MAN);
+
+ mgminfo.ani = g_fp->_aniMan;
+ mgminfo.staticsId2 = ST_MAN_ONPLANK;
+ mgminfo.x1 = 938;
+ mgminfo.y1 = 442;
+ mgminfo.field_1C = 10;
+ mgminfo.field_10 = 1;
+ mgminfo.flags = 78;
+ mgminfo.movementId = MV_MAN_JUMPONPLANK;
+
+ MessageQueue *mq = mgm.genMovement(&mgminfo);
+
+ if (mq) {
+ mq->_flags |= 1;
+
+ if (!mq->chain(g_fp->_aniMan))
+ delete mq;
+
+ g_fp->_aniMan->_priority = 10;
+ }
+
+ g_vars->scene04_ladderOffset = g_vars->scene04_ladder->collisionDetection(g_fp->_aniMan);
+}
+
+void sceneHandler04_clickPlank() {
+ if (sceneHandler04_friesAreWalking())
+ sceneHandler04_jumpOnLadder();
+ else if (g_vars->scene04_dudeOnLadder)
+ g_fp->playSound(SND_4_033, 0);
+ else if (!g_vars->scene04_soundPlaying)
+ chainQueue(QU_PNK_CLICK, 0);
+}
+
+void sceneHandler04_dropBottle() {
+ g_vars->scene04_bottleIsDropped = true;
+ g_vars->scene04_bottleY = 10;
+ g_vars->scene04_bottleWeight = 0;
+
+ while (g_vars->scene04_kozyawkiAni.size()) {
+ StaticANIObject *koz = g_vars->scene04_kozyawkiAni.front();
+ g_vars->scene04_kozyawkiAni.pop_front();
+
+ for (Common::List<GameObject *>::iterator it = g_vars->scene04_bottleObjList.begin(); it != g_vars->scene04_bottleObjList.end(); ++it)
+ if (*it == koz) {
+ g_vars->scene04_bottleObjList.erase(it);
+ break;
+ }
+
+ koz->queueMessageQueue(0);
+ koz->hide();
+
+ g_vars->scene04_kozyawkiObjList.push_back(koz);
+ }
+
+ g_vars->scene04_hand->changeStatics2(ST_HND_EMPTY);
+
+ g_vars->scene04_hand->setOXY(429, 21);
+ g_vars->scene04_hand->_priority = 15;
+}
+
+void sceneHandler04_gotoLadder(ExCommand *ex) {
+ MGM mgm;
+ MGMInfo mgminfo;
+
+ mgm.addItem(ANI_MAN);
+
+ mgminfo.ani = g_fp->_aniMan;
+ mgminfo.staticsId2 = ST_MAN_UP;
+ mgminfo.x1 = 1095;
+ mgminfo.y1 = 434;
+ mgminfo.field_1C = 12;
+ mgminfo.field_10 = 1;
+ mgminfo.flags = 78;
+ mgminfo.movementId = MV_MAN_PLANKTOLADDER;
+
+ MessageQueue *mq = mgm.genMovement(&mgminfo);
+
+ if (mq) {
+ mq->deleteExCommandByIndex(mq->getCount() - 1, 1);
+
+ ExCommand *ex1 = new ExCommand(ANI_MAN, 1, MV_MAN_TOLADDER, 0, 0, 0, 1, 0, 0, 0);
+ ex1->_excFlags = 2;
+ ex1->_field_24 = 1;
+ ex1->_keyCode = -1;
+ mq->addExCommandToEnd(ex1);
+
+ ExCommand *ex2 = new ExCommand(ANI_MAN, 1, MV_MAN_STOPLADDER, 0, 0, 0, 1, 0, 0, 0);
+ ex2->_excFlags = 2;
+ ex2->_field_24 = 1;
+ ex2->_keyCode = -1;
+ mq->addExCommandToEnd(ex2);
+
+ ExCommand *ex3 = new ExCommand(g_fp->_aniMan->_id, 34, 256, 0, 0, 0, 1, 0, 0, 0);
+ ex3->_field_14 = 256;
+ ex3->_messageNum = 0;
+ ex3->_excFlags |= 3;
+ mq->addExCommandToEnd(ex3);
+
+ if (ex) {
+ ExCommand *ex4 = ex->createClone();
+
+ mq->addExCommandToEnd(ex4);
+ }
+
+ mq->setFlags(mq->getFlags() | 1);
+
+ if (mq->chain(g_fp->_aniMan)) {
+ g_fp->_aniMan->_priority = 12;
+ g_fp->_aniMan->_flags |= 1;
+ } else {
+ delete mq;
+ }
+ }
+
+ g_vars->scene04_kozyawkaOnLadder = false;
+}
+
+void sceneHandler04_lowerPlank() {
+ g_vars->scene04_plank->startAnim(MV_PNK_WEIGHTRIGHT, 0, -1);
+}
+
+void sceneHandler04_manFromBottle() {
+ for (Common::List<GameObject *>::iterator it = g_vars->scene04_bottleObjList.begin(); it != g_vars->scene04_bottleObjList.end(); ++it)
+ if (*it == g_fp->_aniMan) {
+ g_vars->scene04_bottleObjList.erase(it);
+ g_vars->scene04_bottleWeight -= 9;
+ break;
+ }
+
+ if (g_vars->scene04_ladder)
+ delete g_vars->scene04_ladder;
+
+ g_vars->scene04_ladder = 0;
+
+ getSc2MctlCompoundBySceneId(g_fp->_currentScene->_sceneId)->setEnabled();
+ getGameLoaderInteractionController()->enableFlag24();
+}
+
+void sceneHandler04_manToBottle() {
+ g_vars->scene04_bottleObjList.push_back(g_fp->_aniMan);
+ g_vars->scene04_springOffset = 5;
+ g_vars->scene04_bottleWeight += 9;
+ g_fp->_aniMan2 = g_fp->_aniMan;
+ g_vars->scene04_dudeInBottle = 1;
+}
+
+void sceneHandler04_raisePlank() {
+ g_vars->scene04_plank->startAnim(MV_PNK_WEIGHTLEFT, 0, -1);
+}
+
+MessageQueue *sceneHandler04_kozFly3(StaticANIObject *ani, double phase) {
+ MGM mgm;
+ MGMInfo mgminfo;
+
+ mgm.addItem(ANI_KOZAWKA);
+
+ mgminfo.ani = ani;
+ mgminfo.staticsId2 = ST_KZW_SIT;
+ mgminfo.x1 = (int)(723.0 - phase * 185.0);
+ mgminfo.y1 = 486;
+ mgminfo.field_1C = 10;
+ mgminfo.field_10 = 1;
+ mgminfo.flags = 78;
+ mgminfo.movementId = MV_KZW_JUMP;
+
+ MessageQueue *mq = mgm.genMovement(&mgminfo);
+
+ if (mq) {
+ ExCommand *ex = new ExCommand(ANI_KOZAWKA, 1, MV_KZW_STANDUP, 0, 0, 0, 1, 0, 0, 0);
+ ex->_excFlags |= 2;
+ ex->_keyCode = ani->_okeyCode;
+ mq->addExCommandToEnd(ex);
+
+ ex = new ExCommand(ANI_KOZAWKA, 1, MV_KZW_TURN, 0, 0, 0, 1, 0, 0, 0);
+ ex->_excFlags |= 2;
+ ex->_keyCode = ani->_okeyCode;
+ mq->addExCommandToEnd(ex);
+
+ for (int i = 0; i < 5; i++) {
+ ex = new ExCommand(ANI_KOZAWKA, 1, rMV_KZW_GOR, 0, 0, 0, 1, 0, 0, 0);
+ ex->_excFlags |= 2;
+ ex->_keyCode = ani->_okeyCode;
+ mq->addExCommandToEnd(ex);
+ }
+
+ ex = new ExCommand(ANI_KOZAWKA, 6, 0, 0, 0, 0, 1, 0, 0, 0);
+ ex->_excFlags |= 3;
+ ex->_keyCode = ani->_okeyCode;
+ mq->addExCommandToEnd(ex);
+
+ ex = new ExCommand(ANI_KOZAWKA, 17, MSG_KOZAWRESTART, 0, 0, 0, 1, 0, 0, 0);
+ ex->_excFlags |= 3;
+ ex->_keyCode = ani->_okeyCode;
+ mq->addExCommandToEnd(ex);
+ }
+
+ return mq;
+}
+
+MessageQueue *sceneHandler04_kozFly5(StaticANIObject *ani, double phase) {
+ MGM mgm;
+ MGMInfo mgminfo;
+
+ mgm.addItem(ANI_KOZAWKA);
+
+ mgminfo.ani = ani;
+ mgminfo.staticsId2 = ST_KZW_JUMPOUT;
+ mgminfo.x1 = 525;
+ mgminfo.y1 = (int)(344.0 - (double)(320 - g_vars->scene04_bottle->_oy) * phase);
+ mgminfo.field_1C = 10;
+ mgminfo.field_10 = 1;
+ mgminfo.flags = 78;
+ mgminfo.movementId = MV_KZW_JUMPHIT;
+
+ MessageQueue *mq1 = mgm.genMovement(&mgminfo);
+
+ memset(&mgminfo, 0, sizeof(mgminfo));
+ mgminfo.ani = ani;
+ mgminfo.staticsId1 = ST_KZW_JUMPOUT;
+ mgminfo.staticsId2 = ST_KZW_SIT;
+ mgminfo.x2 = 525;
+ mgminfo.y2 = (int)(344.0 - (double)(320 - g_vars->scene04_bottle->_oy) * phase);
+ mgminfo.y1 = 486;
+ mgminfo.field_1C = 10;
+ mgminfo.field_10 = 1;
+ mgminfo.flags = 117;
+ mgminfo.movementId = MV_KZW_JUMPOUT;
+
+ MessageQueue *mq2 = mgm.genMovement(&mgminfo);
+
+ if (mq1 && mq2) {
+ mq1->addExCommandToEnd(mq2->getExCommandByIndex(0)->createClone());
+
+ delete mq2;
+ mq2 = 0;
+
+ ExCommand *ex = new ExCommand(ANI_KOZAWKA, 1, MV_KZW_STANDUP, 0, 0, 0, 1, 0, 0, 0);
+ ex->_excFlags |= 2;
+ ex->_keyCode = ani->_okeyCode;
+ mq1->addExCommandToEnd(ex);
+
+ ex = new ExCommand(ANI_KOZAWKA, 1, MV_KZW_TURN, 0, 0, 0, 1, 0, 0, 0);
+ ex->_excFlags |= 2;
+ ex->_keyCode = ani->_okeyCode;
+ mq1->addExCommandToEnd(ex);
+
+ for (int i = 0; i < 5; i++) {
+ ex = new ExCommand(ANI_KOZAWKA, 1, rMV_KZW_GOR, 0, 0, 0, 1, 0, 0, 0);
+ ex->_excFlags |= 2;
+ ex->_keyCode = ani->_okeyCode;
+ mq1->addExCommandToEnd(ex);
+ }
+
+ ex = new ExCommand(ANI_KOZAWKA, 6, 0, 0, 0, 0, 1, 0, 0, 0);
+ ex->_excFlags |= 3;
+ ex->_keyCode = ani->_okeyCode;
+ mq1->addExCommandToEnd(ex);
+
+ ex = new ExCommand(ANI_KOZAWKA, 17, MSG_KOZAWRESTART, 0, 0, 0, 1, 0, 0, 0);
+ ex->_excFlags |= 3;
+ ex->_keyCode = ani->_okeyCode;
+ mq1->addExCommandToEnd(ex);
+ }
+
+ if (mq2)
+ delete mq2;
+
+ return mq1;
+}
+
+MessageQueue *sceneHandler04_kozFly6(StaticANIObject *ani) {
+ MGM mgm;
+ MGMInfo mgminfo;
+
+ mgm.addItem(ANI_KOZAWKA);
+
+ mgminfo.ani = ani;
+ mgminfo.staticsId2 = ST_KZW_SIT;
+ mgminfo.x1 = 397 - 4 * g_fp->_rnd->getRandomNumber(1);
+ mgminfo.field_1C = ani->_priority;
+ mgminfo.y1 = g_vars->scene04_bottle->_oy - 4 * g_fp->_rnd->getRandomNumber(1) + 109;
+ mgminfo.field_10 = 1;
+ mgminfo.flags = 78;
+ mgminfo.movementId = MV_KZW_JUMPROTATE;
+
+ MessageQueue *mq = mgm.genMovement(&mgminfo);
+
+ if (mq) {
+ mq->deleteExCommandByIndex(mq->getCount() - 1, 1);
+
+ ExCommand *ex = new ExCommand(ANI_KOZAWKA, 1, MV_KZW_STANDUP, 0, 0, 0, 1, 0, 0, 0);
+ ex->_excFlags |= 2;
+ ex->_keyCode = ani->_okeyCode;
+ mq->addExCommandToEnd(ex);
+
+ ex = new ExCommand(ANI_KOZAWKA, 1, MV_KZW_GOR, 0, 0, 0, 1, 0, 0, 0);
+ ex->_excFlags |= 2;
+ ex->_keyCode = ani->_okeyCode;
+ mq->addExCommandToEnd(ex);
+
+ ex = new ExCommand(ANI_KOZAWKA, 1, MV_KZW_RAISEHEAD, 0, 0, 0, 1, 0, 0, 0);
+ ex->_excFlags |= 2;
+ ex->_keyCode = ani->_okeyCode;
+ mq->addExCommandToEnd(ex);
+
+ g_vars->scene04_kozHeadRaised = true;
+ }
+
+ return mq;
+}
+
+void sceneHandler04_kozMove(Movement *mov, int from, int to, Common::Point *points, double phase) {
+ for (int i = from; i < to; i++) {
+ mov->setDynamicPhaseIndex(i);
+
+ Common::Point *p;
+ if (mov->_framePosOffsets) {
+ p = mov->_framePosOffsets[mov->_currDynamicPhaseIndex];
+ } else {
+ p = &mov->_somePoint;
+ p->x = 0;
+ p->y = 0;
+ }
+
+ p->y = (int)((double)points[i].y * phase);
+ }
+}
+
+MessageQueue *sceneHandler04_kozFly7(StaticANIObject *ani, double phase) {
+ MGM mgm;
+ MGMInfo mgminfo;
+
+ mgm.addItem(ANI_KOZAWKA);
+
+ mgminfo.ani = ani;
+ mgminfo.staticsId2 = 560;
+ mgminfo.x1 = (int)(250.0 - phase * 100.0);
+ mgminfo.y1 = 455;
+ mgminfo.field_1C = 10;
+ mgminfo.field_10 = 1;
+ mgminfo.flags = 78;
+ mgminfo.movementId = MV_KZW_JUMPROTATE;
+
+ MessageQueue *mq = mgm.genMovement(&mgminfo);
+
+ if (mq) {
+ sceneHandler04_kozMove(ani->getMovementById(MV_KZW_JUMPROTATE), 1, 9, g_vars->scene04_jumpRotateKozyawki, phase * 0.5 + 1.5);
+
+ ani->_priority = 10;
+
+ ExCommand *ex = new ExCommand(ANI_KOZAWKA, 1, MV_KZW_STANDUP, 0, 0, 0, 1, 0, 0, 0);
+ ex->_excFlags |= 2;
+ ex->_keyCode = ani->_okeyCode;
+ mq->addExCommandToEnd(ex);
+
+ ex = new ExCommand(ANI_KOZAWKA, 1, MV_KZW_TURN, 0, 0, 0, 1, 0, 0, 0);
+ ex->_excFlags |= 2;
+ ex->_keyCode = ani->_okeyCode;
+ mq->addExCommandToEnd(ex);
+
+ for (int i = 0; i < 2; i++) {
+ ex = new ExCommand(ANI_KOZAWKA, 1, rMV_KZW_GOR, 0, 0, 0, 1, 0, 0, 0);
+ ex->_excFlags |= 2;
+ ex->_keyCode = ani->_okeyCode;
+ mq->addExCommandToEnd(ex);
+ }
+
+ ex = new ExCommand(ANI_KOZAWKA, 6, 0, 0, 0, 0, 1, 0, 0, 0);
+ ex->_excFlags |= 3;
+ ex->_keyCode = ani->_okeyCode;
+ mq->addExCommandToEnd(ex);
+
+ ex = new ExCommand(ANI_KOZAWKA, 17, MSG_KOZAWRESTART, 0, 0, 0, 1, 0, 0, 0);
+ ex->_excFlags |= 3;
+ ex->_keyCode = ani->_okeyCode;
+ mq->addExCommandToEnd(ex);
+ }
+
+ return mq;
+}
+
+static const int kozTrajectory3[] = {
+ 3, 2, 0,
+ 3, 2, 0,
+ 3, 2, 0
+};
+
+static const int kozTrajectory4[] = {
+ 5, 3, 1,
+ 5, 4, 1,
+ 5, 3, 1
+};
+
+static const int kozTrajectory5[] = {
+ 6, 5, 4,
+ 6, 5, 4,
+ 6, 5, 4
+};
+
+static const int kozTrajectory6[] = {
+ 7, 6, 5,
+ 7, 6, 5,
+ 7, 6, 5
+};
+
+void sceneHandler04_shootKozyawka() {
+ g_vars->scene04_plank->changeStatics2(ST_PNK_WEIGHTRIGHT);
+
+ if (!g_vars->scene04_walkingKozyawka)
+ return;
+
+ if (g_vars->scene04_walkingKozyawka->_movement) {
+ if (g_vars->scene04_walkingKozyawka->_movement->_id == MV_KZW_WALKPLANK) {
+ int dphase = g_vars->scene04_walkingKozyawka->_movement->_currDynamicPhaseIndex;
+
+ if (dphase < 41) {
+ int col = 3 * dphase / 15;
+ if (col > 2)
+ col = 2;
+
+ int row = g_vars->scene04_kozyawkiAni.size();
+ if (row > 2)
+ row = 2;
+
+ int idx = 3 * row + col;
+ int phase;
+
+ if (g_vars->scene04_ladderOffset == 3) {
+ phase = kozTrajectory3[idx];
+ } else if (g_vars->scene04_ladderOffset == 4) {
+ phase = kozTrajectory4[idx];
+ } else {
+ if (g_vars->scene04_ladderOffset == 5)
+ phase = kozTrajectory5[idx];
+ else
+ phase = kozTrajectory6[idx];
+ }
+
+ g_vars->scene04_walkingKozyawka->queueMessageQueue(0);
+ g_vars->scene04_walkingKozyawka->_movement = 0;
+ g_vars->scene04_walkingKozyawka->_statics = g_vars->scene04_walkingKozyawka->getStaticsById(ST_KZW_RIGHT);
+
+ MessageQueue *mq;
+
+ if (phase > 2) {
+ if (phase > 5) {
+ if (phase == 6)
+ mq = sceneHandler04_kozFly6(g_vars->scene04_walkingKozyawka);
+ else
+ mq = sceneHandler04_kozFly7(g_vars->scene04_walkingKozyawka, (double)(phase - 6) * 0.3333333333333333);
+ } else {
+ mq = sceneHandler04_kozFly5(g_vars->scene04_walkingKozyawka, (double)(phase - 2) * 0.3333333333333333);
+ }
+ } else {
+ mq = sceneHandler04_kozFly3(g_vars->scene04_walkingKozyawka, (double)phase * 0.5);
+ }
+
+ if (mq) {
+ g_vars->scene04_lastKozyawka = g_vars->scene04_walkingKozyawka;
+
+ if (!mq->chain(g_vars->scene04_walkingKozyawka) )
+ delete mq;
+ }
+ }
+ }
+ }
+
+ if (g_vars->scene04_ladderOffset > 3)
+ g_fp->_aniMan->changeStatics1(ST_MAN_LOOKPLANK);
+
+ g_vars->scene04_kozyawkaOnLadder = true;
+}
+
+void sceneHandler04_showCoin() {
+ StaticANIObject *ani = g_fp->_currentScene->getStaticANIObject1ById(ANI_SC4_COIN, -1);
+
+ if (ani) {
+ ani->show1(MV_BDG_OPEN, MV_MAN_GOU, MV_SC4_COIN_default, 0);
+
+ ani->_priority = 40;
+ }
+}
+
+void sceneHandler04_stopSound() {
+ g_vars->scene04_soundPlaying = false;
+
+ warning("STUB: sceneHandler04_stopSound()");
+}
+
+void sceneHandler04_animOutOfBottle(ExCommand *ex) {
+ g_fp->_aniMan->changeStatics2(ST_MAN_SIT);
+
+ MessageQueue *mq = new MessageQueue(g_fp->_currentScene->getMessageQueueById(QU_SC4_MANFROMBOTTLE), 0, 0);
+
+ if (ex) {
+ ExCommand *newex = ex->createClone();
+
+ mq->addExCommandToEnd(newex);
+ }
+
+ mq->_flags |= 1;
+ mq->chain(0);
+
+ g_vars->scene04_dudeInBottle = false;
+ g_fp->_behaviorManager->setFlagByStaticAniObject(g_fp->_aniMan, 1);
+}
+
+void sceneHandler04_walkKozyawka() {
+ if (g_vars->scene04_kozyawkiObjList.size()) {
+ g_vars->scene04_walkingKozyawka = g_vars->scene04_kozyawkiObjList.front();
+ g_vars->scene04_kozyawkiObjList.pop_front();
+
+ MessageQueue *mq = new MessageQueue(g_fp->_currentScene->getMessageQueueById(QU_KOZAW_WALK), 0, 1);
+ mq->replaceKeyCode(-1, g_vars->scene04_walkingKozyawka->_okeyCode);
+ mq->chain(0);
+ }
+}
+
+void sceneHandler04_bottleUpdateObjects(int off) {
+ for (Common::List<GameObject *>::iterator it = g_vars->scene04_bottleObjList.begin(); it != g_vars->scene04_bottleObjList.end(); ++it) {
+ GameObject *obj = *it;
+
+ obj->setOXY(obj->_ox, off + obj->_oy);
+ }
+}
+
+void sceneHandler04_springWobble() {
+ int oldDynIndex = g_vars->scene04_dynamicPhaseIndex;
+ int newdelta = g_vars->scene04_springOffset + g_vars->scene04_dynamicPhaseIndex;
+
+ g_vars->scene04_dynamicPhaseIndex += g_vars->scene04_springOffset;
+
+ if (newdelta < 0) {
+ newdelta = 0;
+ g_vars->scene04_dynamicPhaseIndex = 0;
+ g_vars->scene04_springOffset = 0;
+ }
+
+ if (newdelta > 14) {
+ newdelta = 14;
+ g_vars->scene04_dynamicPhaseIndex = 14;
+ g_vars->scene04_springOffset = 0;
+ }
+
+ if (g_vars->scene04_bottleWeight > newdelta)
+ g_vars->scene04_springOffset++;
+
+ if (g_vars->scene04_bottleWeight < newdelta)
+ g_vars->scene04_springOffset--;
+
+ if ((oldDynIndex > g_vars->scene04_bottleWeight && newdelta > g_vars->scene04_bottleWeight) || newdelta <= g_vars->scene04_bottleWeight) {
+ g_vars->scene04_springDelay++;
+
+ if (g_vars->scene04_springOffset && g_vars->scene04_springDelay > 1) {
+ g_vars->scene04_springDelay = 0;
+ g_vars->scene04_springOffset = g_vars->scene04_springOffset - g_vars->scene04_springOffset / abs(g_vars->scene04_springOffset);
+ }
+ }
+
+ Common::Point point;
+
+ if (g_vars->scene04_dynamicPhaseIndex) {
+ if (!g_vars->scene04_spring->_movement)
+ g_vars->scene04_spring->startAnim(MV_SPR_LOWER, 0, -1);
+
+ g_vars->scene04_spring->_movement->setDynamicPhaseIndex(g_vars->scene04_dynamicPhaseIndex);
+ } else {
+ g_vars->scene04_spring->changeStatics2(ST_SPR_UP);
+ }
+
+ if (g_vars->scene04_dynamicPhaseIndex != oldDynIndex)
+ sceneHandler04_bottleUpdateObjects(oldDynIndex - g_vars->scene04_dynamicPhaseIndex);
+}
+
+void sceneHandler04_leaveScene() {
+ g_fp->_aniMan2 = 0;
+
+ MessageQueue *mq = new MessageQueue(g_fp->_currentScene->getMessageQueueById(QU_SC4_MANTOBOTTLE), 0, 0);
+ ExCommand *ex = 0;
+
+ for (uint i = 0; i < mq->getCount(); i++) {
+ if (mq->getExCommandByIndex(i)->_messageKind == 27) {
+ ex = mq->getExCommandByIndex(i);
+ break;
+ }
+ }
+
+ if (!ex) {
+ error("sceneHandler04_leaveScene(): Cannot find exit");
+ }
+
+ ex->_y = g_vars->scene04_bottle->_oy - 304;
+
+ mq->chain(0);
+
+ g_vars->scene04_var07 = false;
+ g_vars->scene04_dudeOnLadder = 0;
+
+ g_fp->_behaviorManager->setFlagByStaticAniObject(g_fp->_aniMan, 0);
+
+ g_fp->updateMapPiece(PIC_MAP_P03, 1);
+}
+
+void sceneHandler04_liftBottle() {
+ int newy = g_vars->scene04_bottleY + g_vars->scene04_spring->_oy;
+
+ g_vars->scene04_bottleY += 5;
+
+ sceneHandler04_bottleUpdateObjects(newy - g_vars->scene04_spring->_oy);
+
+ g_vars->scene04_spring->setOXY(g_vars->scene04_spring->_ox, newy);
+
+ if (g_vars->scene04_bottle->_oy >= 226) {
+ sceneHandler04_bottleUpdateObjects(226 - g_vars->scene04_bottle->_oy);
+
+ g_vars->scene04_spring->setOXY(g_vars->scene04_spring->_ox, 437);
+ g_vars->scene04_bottleIsDropped = false;
+ g_vars->scene04_handIsDown = false;
+ g_vars->scene04_objectIsTaken = true;
+ g_vars->scene04_bottleWeight = 2;
+ g_vars->scene04_springOffset = 10;
+ g_vars->scene04_bottleIsTaken = false;
+
+ g_fp->setObjectState(sO_LowerPipe, g_fp->getObjectEnumState(sO_LowerPipe, sO_IsClosed));
+ }
+}
+
+void sceneHandler04_startSounds(const char *snd1, const char *snd2, const char *snd3) {
+ warning("STUB: sceneHandler04_startSounds()");
+
+ // playFile(snd1);
+ // playFile(snd2);
+ // playFile(snd3);
+}
+
+void sceneHandler04_goClock() {
+ sceneHandler04_walkKozyawka();
+ chainQueue(QU_SC4_GOCLOCK, 0);
+ g_vars->scene04_soundPlaying = true;
+ g_vars->scene04_coinPut = false;
+
+ g_fp->stopAllSoundStreams();
+
+ sceneHandler04_startSounds("sc4_start.ogg", "sc4_loop.ogg", "sc4_stop2.ogg");
+
+ g_vars->scene04_bigBallCounter = 0;
+}
+
+void sceneHandler04_bigBallOut() {
+ StaticANIObject *ball = g_fp->_currentScene->getStaticANIObject1ById(ANI_BIGBALL, -1);
+
+ if (ball && ball->_flags & 4)
+ for (uint i = 0; i < ball->_movements.size(); i++)
+ ((Movement *)ball->_movements[i])->_counterMax = 0;
+
+ g_vars->scene04_bigBallIn = false;
+}
+
+void sceneHandler04_leaveLadder(ExCommand *ex) {
+ if (!g_fp->_aniMan->isIdle())
+ return;
+
+ if (!(g_fp->_aniMan->_flags & 0x100)) {
+ if (getSc2MctlCompoundBySceneId(g_fp->_currentScene->_sceneId)->_objtype == kObjTypeMctlCompound) {
+ MctlCompound *mc = (MctlCompound *)getSc2MctlCompoundBySceneId(g_fp->_currentScene->_sceneId);
+
+ if (mc->_motionControllers[0]->_movGraphReactObj->pointInRegion(g_fp->_sceneRect.left + ex->_x, g_fp->_sceneRect.top + ex->_y)) {
+ if (g_vars->scene04_ladder->collisionDetection(g_fp->_aniMan)) {
+ MessageQueue *mq = g_vars->scene04_ladder->controllerWalkTo(g_fp->_aniMan, 0);
+
+ if (mq) {
+ mq->addExCommandToEnd(ex->createClone());
+
+ if (mq->chain(g_fp->_aniMan) )
+ ex->_messageKind = 0;
+ else
+ delete mq;
+
+ if (g_vars->scene04_bigBallIn) {
+ sceneHandler04_bigBallOut();
+ return;
+ }
+ }
+ } else {
+ MessageQueue *mq = new MessageQueue(g_fp->_globalMessageQueueList->compact());
+ ExCommand *ex1;
+
+ if (g_fp->_aniMan->_statics->_staticsId == ST_MAN_LADDERDOWN) {
+ ex1 = new ExCommand(ANI_MAN, 1, MV_MAN_LOOKLADDERRV, 0, 0, 0, 1, 0, 0, 0);
+ ex1->_keyCode = g_fp->_aniMan->_okeyCode;
+ ex1->_excFlags |= 2;
+ mq->addExCommandToEnd(ex1);
+ }
+
+ ex1 = new ExCommand(ANI_MAN, 1, MV_MAN_STARTLADDERD, 0, 0, 0, 1, 0, 0, 0);
+ ex1->_keyCode = g_fp->_aniMan->_okeyCode;
+ ex1->_excFlags |= 2;
+ mq->addExCommandToEnd(ex1);
+
+ ex1 = new ExCommand(ANI_MAN, 1, MV_MAN_FROMLADDER, 0, 0, 0, 1, 0, 0, 0);
+ ex1->_keyCode = g_fp->_aniMan->_okeyCode;
+ ex1->_excFlags |= 2;
+ mq->addExCommandToEnd(ex1);
+
+ ex1 = ex->createClone();
+ mq->addExCommandToEnd(ex1);
+
+ mq->setFlags(mq->getFlags() | 1);
+
+ if (mq->chain(g_fp->_aniMan)) {
+ if (g_vars->scene04_ladder)
+ delete g_vars->scene04_ladder;
+
+ g_vars->scene04_ladder = 0;
+ g_vars->scene04_dudeOnLadder = 0;
+
+ ex->_messageKind = 0;
+
+ mc->setEnabled();
+ getGameLoaderInteractionController()->enableFlag24();
+ } else {
+ delete mq;
+ }
+
+ if (g_vars->scene04_bigBallIn) {
+ sceneHandler04_bigBallOut();
+ return;
+ }
+ }
+ }
+ }
+ }
+}
+
+void sceneHandler04_handTake() {
+ g_vars->scene04_clock->changeStatics2(ST_CLK_CLOSED);
+
+ if (g_vars->scene04_kozyawkiAni.size()) {
+ if (g_vars->scene04_kozyawkiAni.size() == 1) {
+ chainQueue(QU_HND_TAKE1, 0);
+ g_vars->scene04_objectIsTaken = false;
+ } else {
+ chainQueue((g_vars->scene04_kozyawkiAni.size() != 2) ? QU_HND_TAKEBOTTLE : QU_HND_TAKE2, 0);
+ g_vars->scene04_objectIsTaken = false;
+ }
+ } else {
+ chainQueue(QU_HND_TAKE0, 0);
+ g_vars->scene04_objectIsTaken = false;
+ }
+}
+
+void sceneHandler04_putKozyawkaBack(StaticANIObject *ani) {
+ g_vars->scene04_bottleObjList.push_back(ani);
+ g_vars->scene04_kozyawkiAni.push_back(ani);
+
+ g_vars->scene04_bottleWeight += 2;
+ g_vars->scene04_walkingKozyawka = 0;
+ g_vars->scene04_lastKozyawka = 0;
+
+ if (g_vars->scene04_kozyawkiAni.size() > 1 )
+ g_vars->scene04_objectIsTaken = false;
+
+ if (g_vars->scene04_kozyawkiAni.size() <= 2 || g_vars->scene04_hand->_movement) {
+ sceneHandler04_walkKozyawka();
+ } else {
+ sceneHandler04_handTake();
+ sceneHandler04_stopSound();
+ }
+}
+
+void sceneHandler04_bigBallWalkIn() {
+ StaticANIObject *ball = g_fp->_currentScene->getStaticANIObject1ById(ANI_BIGBALL, -1);
+
+ if (g_vars->scene04_dudeOnLadder
+ && (!ball || !(ball->_flags & 4))
+ && g_vars->scene04_ladder->collisionDetection(g_fp->_aniMan) > 3) {
+
+ if (!g_fp->_rnd->getRandomNumber(49)) {
+ if (g_vars->scene04_bigBallFromLeft)
+ chainQueue(QU_BALL_WALKR, 0);
+ else
+ chainQueue(QU_BALL_WALKL, 0);
+
+ g_vars->scene04_bigBallFromLeft = !g_vars->scene04_bigBallFromLeft;
+
+ sceneHandler04_checkBigBallClick();
+
+ g_vars->scene04_bigBallCounter = 0;
+ }
+ }
+}
+
+void sceneHandler04_takeBottle() {
+ g_vars->scene04_bottleIsTaken = true;
+ g_vars->scene04_hand->_priority = 5;
+
+ g_fp->setObjectState(sO_LowerPipe, g_fp->getObjectEnumState(sO_LowerPipe, sO_IsOpened));
+}
+
+void sceneHandler04_takeKozyawka() {
+ if (g_vars->scene04_kozyawkiAni.size() > 0) {
+ if (g_vars->scene04_kozyawkiAni.size() == 1)
+ g_vars->scene04_objectIsTaken = true;
+
+ StaticANIObject *koz = g_vars->scene04_kozyawkiAni.front();
+ g_vars->scene04_kozyawkiAni.pop_front();
+
+ if (koz) {
+ koz->queueMessageQueue(0);
+ koz->hide();
+
+ g_vars->scene04_kozyawkiObjList.push_back(koz);
+
+ for (Common::List<GameObject *>::iterator it = g_vars->scene04_bottleObjList.begin(); it != g_vars->scene04_bottleObjList.end(); ++it)
+ if (*it == koz) {
+ g_vars->scene04_bottleObjList.erase(it);
+ break;
+ }
+
+ g_vars->scene04_bottleWeight -= 2;
+ }
+ }
+}
+
+void sceneHandler04_testPlank(ExCommand *ex) {
+ MessageQueue *mq = g_fp->_globalMessageQueueList->getMessageQueueById(ex->_parId);
+
+ if (!mq)
+ return;
+
+ if (g_vars->scene04_plank->_movement || !g_vars->scene04_plank->_statics || g_vars->scene04_plank->_statics->_staticsId != ST_PNK_WEIGHTLEFT) {
+ mq->getExCommandByIndex(0)->_messageNum = MV_KZW_TOHOLERV;
+ } else {
+ mq->getExCommandByIndex(0)->_messageNum = MV_KZW_WALKPLANK;
+ }
+}
+
+void sceneHandler04_updateBottle() {
+ Common::Point point;
+
+ int yoff;
+
+ if (g_vars->scene04_hand->_movement)
+ yoff = g_vars->scene04_hand->_movement->_oy;
+ else
+ yoff = g_vars->scene04_hand->_oy;
+
+ int newy = g_vars->scene04_hand->getSomeXY(point)->y + yoff + 140;
+
+ sceneHandler04_bottleUpdateObjects(newy - g_vars->scene04_spring->_oy);
+
+ g_vars->scene04_spring->setOXY(g_vars->scene04_spring->_ox, newy);
+}
+
+void sceneHandler04_winArcade() {
+ if (g_fp->getObjectState(sO_LowerPipe) == g_fp->getObjectEnumState(sO_LowerPipe, sO_IsClosed)
+ && g_vars->scene04_soundPlaying) {
+ g_vars->scene04_clock->changeStatics2(ST_CLK_CLOSED);
+ g_vars->scene04_hand->changeStatics2(ST_HND_EMPTY);
+
+ chainQueue(QU_HND_TAKEBOTTLE, 1);
+
+ if (g_vars->scene04_walkingKozyawka) {
+ g_vars->scene04_kozyawkiObjList.push_back(g_vars->scene04_walkingKozyawka);
+
+ g_vars->scene04_walkingKozyawka->changeStatics2(ST_KZW_EMPTY);
+ g_vars->scene04_walkingKozyawka->hide();
+ g_vars->scene04_walkingKozyawka = 0;
+ }
+
+ g_vars->scene04_objectIsTaken = false;
+ g_vars->scene04_soundPlaying = false;
+
+ getSc2MctlCompoundBySceneId(g_fp->_currentScene->_sceneId)->setEnabled();
+
+ getGameLoaderInteractionController()->enableFlag24();
+
+ g_fp->stopSoundStream2();
+ }
+}
+
+int sceneHandler04(ExCommand *ex) {
+ if (ex->_messageKind != 17)
+ return 0;
+
+ switch (ex->_messageNum) {
+ case MSG_UPDATEBOTTLE:
+ sceneHandler04_updateBottle();
+ break;
+
+ case MSG_CLICKBOTTLE:
+ sceneHandler04_clickBottle();
+ break;
+
+ case MSG_SHOOTKOZAW:
+ sceneHandler04_shootKozyawka();
+ break;
+
+ case MSG_SHAKEBOTTLE:
+ if (!g_vars->scene04_bottleIsTaken)
+ ++g_vars->scene04_springOffset;
+ break;
+
+ case MSG_STARTHAND:
+ g_vars->scene04_handIsDown = true;
+ g_vars->scene04_coinPut = false;
+
+ if (g_vars->scene04_dudeInBottle)
+ sceneHandler04_animOutOfBottle(0);
+
+ sceneHandler04_handTake();
+ sceneHandler04_stopSound();
+ break;
+
+ case MSG_TAKEKOZAW:
+ sceneHandler04_takeKozyawka();
+ break;
+
+ case MSG_CLICKBUTTON:
+ sceneHandler04_clickButton();
+ break;
+
+ case MSG_CLICKPLANK:
+ sceneHandler04_clickPlank();
+ break;
+
+ case MSG_RAISEPLANK:
+ sceneHandler04_raisePlank();
+ break;
+
+ case MSG_KOZAWRESTART:
+ if (g_vars->scene04_walkingKozyawka) {
+ g_vars->scene04_kozyawkiObjList.push_back(g_vars->scene04_walkingKozyawka);
+ g_vars->scene04_walkingKozyawka->hide();
+ g_vars->scene04_walkingKozyawka = 0;
+ }
+
+ if (g_vars->scene04_soundPlaying)
+ sceneHandler04_walkKozyawka();
+
+ break;
+
+ case MSG_LOWERPLANK:
+ sceneHandler04_lowerPlank();
+ break;
+
+ case MSG_TESTPLANK:
+ sceneHandler04_testPlank(ex);
+ break;
+
+ case 33:
+ {
+ g_vars->scene04_dudePosX = g_fp->_aniMan->_ox;
+ g_vars->scene04_dudePosY = g_fp->_aniMan->_oy;
+
+ int res = 0;
+
+ if (g_fp->_aniMan2) {
+ if (g_fp->_aniMan->_ox < g_fp->_sceneRect.left + 200) {
+ g_fp->_currentScene->_x = g_fp->_aniMan->_ox - g_fp->_sceneRect.left - 300;
+ g_fp->_aniMan->_ox = g_vars->scene04_dudePosX;
+ }
+ if (g_fp->_aniMan->_ox > g_fp->_sceneRect.right - 200) {
+ g_fp->_currentScene->_x = g_fp->_aniMan->_ox - g_fp->_sceneRect.right + 300;
+ }
+
+ res = 1;
+
+ if (g_vars->scene04_soundPlaying) {
+ if (g_fp->_aniMan->_movement) {
+ if (g_fp->_aniMan->_movement->_id == MV_MAN_TOLADDER) {
+ g_fp->_aniMan2 = 0;
+
+ if (g_fp->_sceneRect.left > 380)
+ g_fp->_currentScene->_x = 380 - g_fp->_sceneRect.left;
+ }
+ }
+ }
+ } else {
+ if (g_fp->_aniMan->_movement && g_fp->_aniMan->_movement->_id == MV_MAN_GOD)
+ g_fp->_aniMan2 = g_fp->_aniMan;
+ }
+
+ sceneHandler04_springWobble();
+
+ if (g_vars->scene04_var07 && !g_vars->scene04_handIsDown)
+ sceneHandler04_leaveScene();
+
+ if (g_vars->scene04_bottleIsDropped)
+ sceneHandler04_liftBottle();
+
+ if (g_vars->scene04_ladderClickable)
+ sceneHandler04_clickLadder();
+
+ if (g_vars->scene04_dudeInBottle && g_vars->scene04_hand->_movement)
+ sceneHandler04_animOutOfBottle(0);
+
+ if (g_vars->scene04_coinPut && g_vars->scene04_clockCanGo && !g_vars->scene04_handIsDown && !g_vars->scene04_soundPlaying)
+ sceneHandler04_goClock();
+
+ if (g_vars->scene04_dudeOnLadder) {
+ if (!g_vars->scene04_soundPlaying) {
+ g_fp->startSceneTrack();
+
+ g_fp->_behaviorManager->updateBehaviors();
+ return res;
+ }
+
+ g_vars->scene04_bigBallCounter++;
+
+ if (g_vars->scene04_bigBallCounter > 600)
+ sceneHandler04_bigBallWalkIn();
+ }
+
+ if (g_vars->scene04_soundPlaying) {
+ g_fp->_behaviorManager->updateBehaviors();
+
+ return res;
+ }
+
+ g_fp->startSceneTrack();
+
+ g_fp->_behaviorManager->updateBehaviors();
+
+ return res;
+ }
+
+ case 29:
+ {
+ int picid = g_fp->_currentScene->getPictureObjectIdAtPos(ex->_sceneClickX, ex->_sceneClickY);
+
+ if (g_vars->scene04_dudeInBottle) {
+ sceneHandler04_animOutOfBottle(ex);
+
+ break;
+ }
+
+ if (picid == PIC_SC4_LADDER) {
+ if (!g_vars->scene04_kozyawkaOnLadder) {
+ g_vars->scene04_sceneClickX = ex->_sceneClickX;
+ g_vars->scene04_sceneClickY = ex->_sceneClickY;
+
+ sceneHandler04_clickLadder();
+
+ ex->_messageKind = 0;
+
+ break;
+ }
+
+ sceneHandler04_gotoLadder(0);
+
+ break;
+ }
+
+ StaticANIObject *ani = g_fp->_currentScene->getStaticANIObjectAtPos(ex->_sceneClickX, ex->_sceneClickY);
+
+ if ((ani && ani->_id == ANI_PLANK) || picid == PIC_SC4_PLANK) {
+ sceneHandler04_clickPlank();
+
+ ex->_messageKind = 0;
+ } else if (g_vars->scene04_dudeOnLadder) {
+ sceneHandler04_leaveLadder(ex);
+ } else if (!ani || !canInteractAny(g_fp->_aniMan, ani, ex->_keyCode)) {
+ PictureObject *pic = g_fp->_currentScene->getPictureObjectById(picid, 0);
+
+ if (!pic || !canInteractAny(g_fp->_aniMan, pic,ex->_keyCode)) {
+ if ((g_fp->_sceneRect.right - ex->_sceneClickX < 47 && g_fp->_sceneRect.right < g_fp->_sceneWidth - 1)
+ || (ex->_sceneClickX - g_fp->_sceneRect.left < 47 && g_fp->_sceneRect.left > 0))
+ g_fp->processArcade(ex);
+ }
+ }
+ }
+
+ break;
+
+ case MSG_SC4_HIDEBOOT:
+ g_vars->scene04_boot->_flags &= 0xfffb;
+ break;
+
+ case MSG_CMN_WINARCADE:
+ sceneHandler04_winArcade();
+ break;
+
+ case MSG_SC4_HANDOVER:
+ g_vars->scene04_handIsDown = false;
+ g_vars->scene04_objectIsTaken = true;
+ break;
+
+ case MSG_SC4_DROPBOTTLE:
+ sceneHandler04_dropBottle();
+ break;
+
+ case MSG_SC4_COINOUT:
+ g_vars->scene04_clock->changeStatics2(ST_CLK_CLOSED);
+ g_vars->scene04_coinPut = false;
+ sceneHandler04_stopSound();
+
+ if (g_vars->scene04_kozyawkiAni.size() && !g_vars->scene04_bottleIsTaken) {
+ g_vars->scene04_handIsDown = true;
+
+ if (g_vars->scene04_dudeInBottle)
+ sceneHandler04_animOutOfBottle(0);
+
+ sceneHandler04_handTake();
+ }
+
+ break;
+
+ case MSG_SC4_KOZAWFALL:
+ {
+ ExCommand *exnew;
+
+ if (g_vars->scene04_kozHeadRaised) {
+ sceneHandler04_putKozyawkaBack(g_vars->scene04_lastKozyawka);
+
+ g_vars->scene04_kozHeadRaised = 0;
+
+ exnew = new ExCommand(0, 35, SND_4_010, 0, 0, 0, 1, 0, 0, 0);
+ } else {
+ exnew = new ExCommand(0, 35, SND_4_012, 0, 0, 0, 1, 0, 0, 0);
+ }
+
+ exnew->_field_14 = 5;
+ exnew->_excFlags |= 2;
+ exnew->postMessage();
+ break;
+ }
+
+ case MSG_SC4_MANFROMBOTTLE:
+ sceneHandler04_manFromBottle();
+ break;
+
+ case MSG_SC4_CLICKLADDER:
+ sceneHandler04_clickLadder();
+ break;
+
+ case MSG_SC4_MANTOBOTTLE:
+ sceneHandler04_manToBottle();
+ break;
+
+ case MSG_SHOWCOIN:
+ sceneHandler04_showCoin();
+ break;
+
+ case MSG_TAKEBOTTLE:
+ sceneHandler04_takeBottle();
+ break;
+
+ case MSG_GOTOLADDER:
+ sceneHandler04_gotoLadder(0);
+ break;
+
+ case MSG_SC4_COINPUT:
+ g_vars->scene04_coinPut = true;
+ break;
+ }
+
+ return 0;
+}
+
+} // End of namespace Fullpipe
diff --git a/engines/fullpipe/scenes/scene05.cpp b/engines/fullpipe/scenes/scene05.cpp
new file mode 100644
index 0000000000..8864794691
--- /dev/null
+++ b/engines/fullpipe/scenes/scene05.cpp
@@ -0,0 +1,386 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public 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 "fullpipe/fullpipe.h"
+
+#include "fullpipe/objects.h"
+#include "fullpipe/objectnames.h"
+#include "fullpipe/constants.h"
+#include "fullpipe/statics.h"
+#include "fullpipe/scene.h"
+#include "fullpipe/motion.h"
+#include "fullpipe/scenes.h"
+#include "fullpipe/messages.h"
+#include "fullpipe/floaters.h"
+#include "fullpipe/behavior.h"
+
+namespace Fullpipe {
+
+void scene05_initScene(Scene *sc) {
+ g_vars->scene05_handle = sc->getStaticANIObject1ById(ANI_HANDLE, -1);
+ g_vars->scene05_wacko = sc->getStaticANIObject1ById(ANI_OTMOROZ, -1);
+ g_vars->scene05_bigHatch = sc->getStaticANIObject1ById(ANI_BIGLUK, -1);
+
+
+ g_vars->scene05_wackoTicker = 0;
+ g_vars->scene05_handleFlipper = 1;
+ g_vars->scene05_floatersTicker = 1000;
+
+ Scene *oldscene = g_fp->_currentScene;
+
+ g_fp->_currentScene = sc;
+
+ if (g_fp->getObjectState(sO_WeirdWacko) == g_fp->getObjectEnumState(sO_WeirdWacko, sO_InGlasses)) {
+ g_vars->scene05_wacko->changeStatics2(ST_OTM_GLS_LEFT);
+ g_vars->scene05_bigHatch->changeStatics2(ST_BLK_CLOSED);
+
+ g_vars->scene05_handle->changeStatics2(ST_HDL_UP);
+ g_vars->scene05_handle->_flags |= 4;
+ } else if (g_fp->getObjectState(sO_WeirdWacko) == g_fp->getObjectEnumState(sO_WeirdWacko, sO_WithDrawer)) {
+ g_vars->scene05_wacko->changeStatics2(ST_OTM_BOX_LEFT);
+ g_vars->scene05_bigHatch->changeStatics2(ST_BLK_CLOSED);
+ g_vars->scene05_handle->changeStatics2(ST_HDL_UP);
+ g_vars->scene05_handle->_flags |= 4;
+ } else {
+ g_vars->scene05_wacko->changeStatics2(ST_OTM_VNT_LEFT);
+
+ if (g_fp->getObjectState(sO_WeirdWacko) != g_fp->getObjectEnumState(sO_WeirdWacko, sO_WithPlunger)) {
+ g_vars->scene05_handle->changeStatics2(ST_HDL_BROKEN);
+ g_vars->scene05_bigHatch->changeStatics2(ST_BLK_CLOSED);
+ }
+ }
+
+ g_fp->_currentScene = oldscene;
+}
+
+void sceneHandler05_makeManFlight() {
+ int qid;
+
+ if (!g_vars->scene05_bigHatch->_statics || g_vars->scene05_bigHatch->_statics->_staticsId != ST_BLK_OPEN)
+ qid = QU_SC5_MANBUMP;
+ else
+ qid = QU_SC5_MANFLY;
+
+ MessageQueue *mq = new MessageQueue(g_fp->_currentScene->getMessageQueueById(qid), 0, 0);
+
+ mq->setFlags(mq->getFlags() | 1);
+
+ mq->chain(0);
+}
+
+void sceneHandler05_makeWackoFeedback() {
+ int staticsId1;
+ int staticsId2;
+
+ if (g_fp->getObjectState(sO_WeirdWacko) == g_fp->getObjectEnumState(sO_WeirdWacko, sO_InGlasses)) {
+ staticsId1 = ST_OTM_GLS_LEFT;
+ staticsId2 = (g_vars->scene05_handle->_statics->_staticsId == ST_HDL_DOWN) ? MV_OTM_HANDLEUP : MV_OTM_HANDLEDOWN;
+ } else if (g_fp->getObjectState(sO_WeirdWacko) != g_fp->getObjectEnumState(sO_WeirdWacko, sO_WithDrawer)) {
+ return;
+ } else {
+ staticsId1 = ST_OTM_BOX_LEFT;
+ staticsId2 = (g_vars->scene05_handle->_statics->_staticsId == ST_HDL_DOWN) ? MV_OTM_BOXHANDLEUP : MV_OTM_BOXHANDLEDOWN;
+ }
+
+ if (g_vars->scene05_wacko->_movement)
+ g_vars->scene05_wacko->changeStatics2(g_vars->scene05_wacko->_movement->_staticsObj2->_staticsId);
+
+ if (staticsId1 == g_vars->scene05_wacko->_statics->_staticsId) {
+ g_vars->scene05_wacko->startAnim(staticsId2, 0, -1);
+ } else {
+ MessageQueue *mq = g_vars->scene05_wacko->changeStatics1(staticsId1);
+
+ if (mq) {
+ mq->setFlags(mq->getFlags() | 1);
+
+ ExCommand *ex = new ExCommand(0, 17, MSG_SC5_MAKEOTMFEEDBACK, 0, 0, 0, 1, 0, 0, 0);
+
+ ex->_excFlags |= 2;
+
+ mq->addExCommandToEnd(ex);
+ mq->_isFinished = 0;
+ }
+ }
+}
+
+void sceneHandler05_resetTicks() {
+ if (g_fp->_aniMan->_movement && (g_fp->_aniMan->_movement->_id == MV_MANHDL_HANDLEUP
+ || g_fp->_aniMan->_movement->_id == MV_MANHDL_HANDLEDOWN))
+ g_vars->scene05_wackoTicker = g_fp->_updateTicks;
+ else
+ g_vars->scene05_wackoTicker = 0;
+}
+
+void sceneHandler05_genFlies() {
+ if (g_vars->scene05_floatersTicker <= 1000)
+ return;
+
+ if (g_fp->_rnd->getRandomNumber(1)) {
+ int numFlies = g_fp->_rnd->getRandomNumber(3) + 1;
+
+ for (int i = 0; i < numFlies; i++) {
+ int x = g_fp->_rnd->getRandomNumber(55) + 538;
+ int y = g_fp->_rnd->getRandomNumber(60) + i * 30 + 520;
+
+ g_fp->_floaters->genFlies(g_fp->_currentScene, x, y, 5, 1);
+ g_fp->_floaters->_array2.back()->val2 = 585;
+ g_fp->_floaters->_array2.back()->val3 = -70;
+ g_fp->_floaters->_array2.back()->val11 = 8.0;
+ }
+ }
+
+ g_vars->scene05_floatersTicker = 0;
+}
+
+void sceneHandler05_showHandle() {
+ g_fp->_currentScene->getStaticANIObject1ById(ANI_HANDLE, -1)->show1(-1, -1, -1, 0);
+}
+
+void sceneHandler05_handleDown() {
+ StaticANIObject *hatch = g_fp->_currentScene->getStaticANIObject1ById(ANI_BIGLUK, -1);
+
+ hatch->changeStatics2(ST_BLK_CLOSED);
+ hatch->startAnim(MV_BLK_OPEN, 0, -1);
+
+ sceneHandler05_resetTicks();
+ sceneHandler05_genFlies();
+}
+
+void sceneHandler05_hideHandle() {
+ g_fp->_currentScene->getStaticANIObject1ById(ANI_HANDLE, -1)->hide();
+}
+
+void sceneHandler05_handleUp() {
+ StaticANIObject *hatch = g_fp->_currentScene->getStaticANIObject1ById(ANI_BIGLUK, -1);
+
+ hatch->changeStatics2(ST_BLK_OPEN);
+ hatch->startAnim(MV_BLK_CLOSE, 0, -1);
+
+ sceneHandler05_resetTicks();
+}
+
+void sceneHandler05_testHatch(ExCommand *inex) {
+ ExCommand *ex;
+
+ if (g_fp->_currentScene->getStaticANIObject1ById(ANI_BIGLUK, -1)->_statics->_staticsId == ST_BLK_CLOSED) {
+ ex = new ExCommand(SC_5, 17, 61, 0, 0, 0, 1, 0, 0, 0);
+ ex->_keyCode = TrubaLeft;
+ ex->_excFlags |= 2;
+ ex->postMessage();
+
+ return;
+ }
+
+ StaticANIObject *wacko = g_fp->_currentScene->getStaticANIObject1ById(ANI_OTMOROZ, -1);
+
+ if (wacko->_movement)
+ wacko->changeStatics2(wacko->_movement->_staticsObj2->_staticsId);
+
+ if (g_fp->getObjectState(sO_WeirdWacko) == g_fp->getObjectEnumState(sO_WeirdWacko, sO_InGlasses)) {
+ MessageQueue *mq = g_fp->_globalMessageQueueList->getMessageQueueById(inex->_parId);
+
+ if (mq)
+ mq->deleteExCommandByIndex(mq->getCount() - 1, 1);
+
+ if (wacko->_statics->_staticsId != ST_OTM_GLS_LEFT) {
+ mq = wacko->changeStatics1(ST_OTM_GLS_LEFT);
+
+ if (!mq) {
+ wacko->changeStatics2(ST_OTM_GLS_LEFT);
+ mq = new MessageQueue(g_fp->_globalMessageQueueList->compact());
+ }
+
+ mq->setFlags(mq->getFlags() | 1);
+
+ ex = new ExCommand(ANI_OTMOROZ, 1, MV_OTM_HANDLEUP, 0, 0, 0, 1, 0, 0, 0);
+ ex->_excFlags |= 2u;
+ mq->addExCommandToEnd(ex);
+
+ ex = new ExCommand(SC_5, 17, 61, 0, 0, 0, 1, 0, 0, 0);
+ ex->_keyCode = TrubaLeft;
+ ex->_excFlags |= 2;
+ mq->addExCommandToEnd(ex);
+
+ mq->_isFinished = 0;
+ return;
+ }
+
+ mq = new MessageQueue(g_fp->_globalMessageQueueList->compact());
+ mq->setFlags(mq->getFlags() | 1);
+
+ ex = new ExCommand(ANI_OTMOROZ, 1, MV_OTM_HANDLEUP, 0, 0, 0, 1, 0, 0, 0);
+ ex->_excFlags |= 2;
+ mq->addExCommandToEnd(ex);
+
+ ex = new ExCommand(SC_5, 17, 61, 0, 0, 0, 1, 0, 0, 0);
+ ex->_keyCode = TrubaLeft;
+ ex->_excFlags |= 2;
+ mq->addExCommandToEnd(ex);
+
+ if (!mq->chain(wacko))
+ delete mq;
+ } else if (g_fp->getObjectState(sO_WeirdWacko) == g_fp->getObjectEnumState(sO_WeirdWacko, sO_WithDrawer)) {
+ MessageQueue *mq = g_fp->_globalMessageQueueList->getMessageQueueById(inex->_parId);
+
+ if (mq)
+ mq->deleteExCommandByIndex(mq->getCount() - 1, 1);
+
+ if (wacko->_statics->_staticsId != ST_OTM_BOX_LEFT) {
+ mq = wacko->changeStatics1(ST_OTM_BOX_LEFT);
+ if (!mq) {
+ wacko->changeStatics2(ST_OTM_BOX_LEFT);
+ mq = new MessageQueue(g_fp->_globalMessageQueueList->compact());
+ }
+
+ mq->setFlags(mq->getFlags() | 1);
+
+ ex = new ExCommand(ANI_OTMOROZ, 1, MV_OTM_BOXHANDLEUP, 0, 0, 0, 1, 0, 0, 0);
+ ex->_excFlags |= 2;
+ mq->addExCommandToEnd(ex);
+
+ ex = new ExCommand(SC_5, 17, 61, 0, 0, 0, 1, 0, 0, 0);
+ ex->_keyCode = TrubaLeft;
+ ex->_excFlags |= 2;
+ mq->addExCommandToEnd(ex);
+
+ mq->_isFinished = 0;
+
+ return;
+ }
+
+ mq = new MessageQueue(g_fp->_globalMessageQueueList->compact());
+ mq->setFlags(mq->getFlags() | 1);
+
+ ex = new ExCommand(ANI_OTMOROZ, 1, MV_OTM_BOXHANDLEUP, 0, 0, 0, 1, 0, 0, 0);
+ ex->_excFlags |= 2;
+ mq->addExCommandToEnd(ex);
+
+ ex = new ExCommand(SC_5, 17, 61, 0, 0, 0, 1, 0, 0, 0);
+ ex->_keyCode = TrubaLeft;
+ ex->_excFlags |= 2;
+ mq->addExCommandToEnd(ex);
+
+ if (!mq->chain(wacko))
+ delete mq;
+
+ return;
+ } else {
+ ex = new ExCommand(SC_5, 17, 61, 0, 0, 0, 1, 0, 0, 0);
+ ex->_keyCode = TrubaLeft;
+ ex->_excFlags |= 2;
+ ex->postMessage();
+
+ return;
+ }
+}
+
+
+int sceneHandler05(ExCommand *ex) {
+ if (ex->_messageKind != 17)
+ return 0;
+
+ switch (ex->_messageNum) {
+ case MSG_SC5_BGRSOUNDOFF:
+ g_fp->stopAllSoundInstances(SND_5_026);
+ break;
+
+ case MSG_SC5_BGRSOUNDON:
+ g_fp->playSound(SND_5_026, 1);
+ break;
+
+ case MSG_SC5_MAKEMANFLIGHT:
+ sceneHandler05_makeManFlight();
+ break;
+
+ case MSG_SC5_MAKEOTMFEEDBACK:
+ if (!g_fp->_aniMan->_movement || (g_fp->_aniMan->_movement->_id != MV_MANHDL_HANDLEUP
+ && g_fp->_aniMan->_movement->_id != MV_MANHDL_HANDLEDOWN)) {
+ sceneHandler05_makeWackoFeedback();
+ g_vars->scene05_wackoTicker = 0;
+ }
+ break;
+
+ case MSG_SC5_SHOWHANDLE:
+ sceneHandler05_showHandle();
+ break;
+
+ case MSG_SC5_HANDLEDOWN:
+ g_vars->scene05_handle->changeStatics2(ST_HDL_DOWN);
+ sceneHandler05_handleDown();
+ break;
+
+ case MSG_SC5_HIDEHANDLE:
+ sceneHandler05_hideHandle();
+ break;
+
+ case MSG_SC5_HANDLEUP:
+ g_vars->scene05_handle->changeStatics2(ST_HDL_UP);
+ sceneHandler05_handleUp();
+ break;
+
+ case MSG_SC5_TESTLUK:
+ sceneHandler05_testHatch(ex);
+ break;
+
+ case 33:
+ {
+ int res = 0;
+ if (g_fp->_aniMan2) {
+ if (g_fp->_aniMan2->_ox < g_fp->_sceneRect.left + 200)
+ g_fp->_currentScene->_x = g_fp->_aniMan2->_ox - g_fp->_sceneRect.left - 300;
+
+ if (g_fp->_aniMan2->_ox > g_fp->_sceneRect.right - 200)
+ g_fp->_currentScene->_x = g_fp->_aniMan2->_ox - g_fp->_sceneRect.right + 300;
+
+ res = 1;
+ }
+
+ if (g_vars->scene05_wackoTicker) {
+ if ((g_fp->_updateTicks - g_vars->scene05_wackoTicker) > 62) {
+ if (!g_fp->_aniMan->_movement || (g_fp->_aniMan->_movement->_id != MV_MANHDL_HANDLEUP
+ && g_fp->_aniMan->_movement->_id != MV_MANHDL_HANDLEDOWN)) {
+ if (g_vars->scene05_handleFlipper % 2)
+ sceneHandler05_makeWackoFeedback();
+
+ g_vars->scene05_wackoTicker = 0;
+
+ ++g_vars->scene05_handleFlipper;
+ }
+ }
+ }
+
+ ++g_vars->scene05_floatersTicker;
+
+ g_fp->_floaters->update();
+
+ g_fp->_behaviorManager->updateBehaviors();
+
+ g_fp->startSceneTrack();
+
+ return res;
+ }
+ }
+
+ return 0;
+}
+
+} // End of namespace Fullpipe
diff --git a/engines/fullpipe/scenes/scene06.cpp b/engines/fullpipe/scenes/scene06.cpp
new file mode 100644
index 0000000000..06ec20dcb5
--- /dev/null
+++ b/engines/fullpipe/scenes/scene06.cpp
@@ -0,0 +1,770 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public 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 "fullpipe/fullpipe.h"
+
+#include "fullpipe/objects.h"
+#include "fullpipe/objectnames.h"
+#include "fullpipe/constants.h"
+#include "fullpipe/gfx.h"
+#include "fullpipe/motion.h"
+#include "fullpipe/scenes.h"
+#include "fullpipe/statics.h"
+#include "fullpipe/scene.h"
+#include "fullpipe/messages.h"
+#include "fullpipe/gameloader.h"
+#include "fullpipe/behavior.h"
+#include "fullpipe/interaction.h"
+
+namespace Fullpipe {
+
+void scene06_initMumsy() {
+ g_vars->scene06_mumsyJumpFw = g_fp->_behaviorManager->getBehaviorEntryInfoByMessageQueueDataId(g_vars->scene06_mumsy, ST_MOM_STANDS, QU_MOM_JUMPFW);
+ g_vars->scene06_mumsyJumpBk = g_fp->_behaviorManager->getBehaviorEntryInfoByMessageQueueDataId(g_vars->scene06_mumsy, ST_MOM_STANDS, QU_MOM_JUMPBK);
+ g_vars->scene06_mumsyJumpFwPercent = g_vars->scene06_mumsyJumpFw->_percent;
+ g_vars->scene06_mumsyJumpBkPercent = g_vars->scene06_mumsyJumpBk->_percent;
+}
+
+int scene06_updateCursor() {
+ g_fp->updateCursorCommon();
+
+ if (g_vars->scene06_arcadeEnabled) {
+ if (g_vars->scene06_aimingBall) {
+ g_fp->_cursorId = PIC_CSR_ARCADE2_D;
+
+ return PIC_CSR_ARCADE2_D;
+ }
+ if (g_fp->_aniMan == (StaticANIObject *)g_fp->_objectAtCursor) {
+ if (g_fp->_aniMan->_statics->_staticsId == ST_MAN6_BALL && g_fp->_cursorId == PIC_CSR_DEFAULT) {
+ g_fp->_cursorId = PIC_CSR_ITN;
+
+ return PIC_CSR_ITN;
+ }
+ } else if (g_fp->_objectAtCursor && (StaticANIObject *)g_fp->_objectAtCursor == g_vars->scene06_currentBall
+ && g_fp->_cursorId == PIC_CSR_DEFAULT) {
+ g_fp->_cursorId = PIC_CSR_ITN;
+ }
+ }
+
+ return g_fp->_cursorId;
+}
+
+void sceneHandler06_setExits(Scene *sc) {
+ MotionController *mc = getSc2MctlCompoundBySceneId(sc->_sceneId);
+
+ mc->enableLinks(sO_CloseThing, (g_fp->getObjectState(sO_BigMumsy) != g_fp->getObjectEnumState(sO_BigMumsy, sO_IsGone)));
+ mc->enableLinks(sO_CloseThing2, g_vars->scene06_arcadeEnabled);
+}
+
+void sceneHandler06_winArcade() {
+ g_fp->setObjectState(sO_BigMumsy, g_fp->getObjectEnumState(sO_BigMumsy, sO_IsGone));
+
+ if (g_fp->getObjectState(sO_ClockAxis) == g_fp->getObjectEnumState(sO_ClockAxis, sO_IsNotAvailable))
+ g_fp->setObjectState(sO_ClockAxis, g_fp->getObjectEnumState(sO_ClockAxis, sO_WithoutHandle));
+
+ if (g_vars->scene06_arcadeEnabled) {
+ g_fp->_aniMan->_callback2 = 0;
+
+ g_fp->_aniMan->changeStatics2(ST_MAN_RIGHT | 0x4000);
+
+ if (g_vars->scene06_someBall) {
+ g_vars->scene06_someBall->_flags &= 0xFFFB;
+
+ g_vars->scene06_balls.push_back(g_vars->scene06_someBall);
+
+ g_vars->scene06_someBall = 0;
+ }
+
+ if (g_vars->scene06_flyingBall) {
+ g_vars->scene06_flyingBall->_flags &= 0xFFFB;
+
+ g_vars->scene06_balls.push_back(g_vars->scene06_flyingBall);
+
+ g_vars->scene06_flyingBall = 0;
+ }
+
+ if (g_vars->scene06_ballInHands) {
+ g_vars->scene06_ballInHands->_flags &= 0xFFFB;
+
+ g_vars->scene06_balls.push_back(g_vars->scene06_ballInHands);
+
+ g_vars->scene06_ballInHands = 0;
+ }
+
+ g_vars->scene06_arcadeEnabled = false;
+ g_vars->scene06_aimingBall = false;
+ }
+
+ g_vars->scene06_mumsy->_flags &= 0xFFFB;
+
+ sceneHandler06_setExits(g_fp->_currentScene);
+
+ getCurrSceneSc2MotionController()->setEnabled();
+ getGameLoaderInteractionController()->enableFlag24();
+}
+
+void sceneHandler06_enableDrops() {
+ chainQueue(QU_SC6_DROPS, 0);
+
+ g_vars->scene06_mumsy->changeStatics2(ST_MOM_SITS);
+ g_fp->setObjectState(sO_BigMumsy, g_fp->getObjectEnumState(sO_BigMumsy, sO_IsPlaying));
+
+ chainQueue(QU_MOM_STANDUP, 1);
+
+ g_vars->scene06_arcadeEnabled = true;
+ g_vars->scene06_numBallsGiven = 0;
+ g_vars->scene06_mumsyPos = 0;
+ g_vars->scene06_mumsyNumBalls = 0;
+ g_vars->scene06_mumsyGotBall = false;
+
+ sceneHandler06_setExits(g_fp->_currentScene);
+}
+
+void sceneHandler06_mumsyBallTake() {
+ int momAni = 0;
+
+ switch (g_vars->scene06_mumsyNumBalls) {
+ case 1:
+ momAni = MV_MOM_TAKE1;
+ break;
+ case 2:
+ momAni = MV_MOM_TAKE2;
+ break;
+ case 3:
+ momAni = MV_MOM_TAKE3;
+ break;
+ case 4:
+ momAni = MV_MOM_TAKE4;
+ break;
+ case 5:
+ momAni = MV_MOM_TAKE5;
+ break;
+ }
+
+ MessageQueue *mq = new MessageQueue(g_fp->_globalMessageQueueList->compact());
+
+ ExCommand *ex = new ExCommand(ANI_MAMASHA, 2, 50, 0, 0, 0, 1, 0, 0, 0);
+
+ ex->_excFlags = 2u;
+ mq->addExCommandToEnd(ex);
+
+ if (g_vars->scene06_mumsyNumBalls >= 5) {
+ g_fp->setObjectState(sO_BigMumsy, g_fp->getObjectEnumState(sO_BigMumsy, sO_IsGone));
+
+ if (g_fp->getObjectState(sO_ClockAxis) == g_fp->getObjectEnumState(sO_ClockAxis, sO_IsNotAvailable))
+ g_fp->setObjectState(sO_ClockAxis, g_fp->getObjectEnumState(sO_ClockAxis, sO_WithoutHandle));
+
+ ex = new ExCommand(ANI_MAMASHA, 1, momAni, 0, 0, 0, 1, 0, 0, 0);
+ ex->_excFlags |= 2;
+ mq->addExCommandToEnd(ex);
+
+ if (g_vars->scene06_mumsyPos + 3 >= 0) {
+ ex = new ExCommand(ANI_MAMASHA, 1, MV_MOM_STARTBK, 0, 0, 0, 1, 0, 0, 0);
+ ex->_excFlags |= 2u;
+ mq->addExCommandToEnd(ex);
+
+ for (int i = 0; i < g_vars->scene06_mumsyPos + 3; i++) {
+ ex = new ExCommand(ANI_MAMASHA, 1, MV_MOM_CYCLEBK, 0, 0, 0, 1, 0, 0, 0);
+ ex->_excFlags |= 2;
+ mq->addExCommandToEnd(ex);
+ }
+
+ ex = new ExCommand(ANI_MAMASHA, 1, MV_MOM_STOPBK, 0, 0, 0, 1, 0, 0, 0);
+ ex->_excFlags |= 2;
+ mq->addExCommandToEnd(ex);
+ }
+
+ ex = new ExCommand(0, 18, QU_MOM_TOLIFT, 0, 0, 0, 1, 0, 0, 0);
+ ex->_excFlags |= 3;
+ mq->addExCommandToEnd(ex);
+ } else {
+ if (momAni) {
+ ex = new ExCommand(ANI_MAMASHA, 1, momAni, 0, 0, 0, 1, 0, 0, 0);
+ ex->_excFlags |= 2;
+ mq->addExCommandToEnd(ex);
+ }
+
+ if (g_vars->scene06_mumsyPos < 0) {
+ for (int i = 0; i > g_vars->scene06_mumsyPos; i--) {
+ ex = new ExCommand(ANI_MAMASHA, 1, MV_MOM_JUMPFW, 0, 0, 0, 1, 0, 0, 0);
+ ex->_excFlags |= 2;
+ mq->addExCommandToEnd(ex);
+ }
+ } else if (g_vars->scene06_mumsyPos > 0) {
+ for (int i = 0; i < g_vars->scene06_mumsyPos; i++) {
+ ex = new ExCommand(ANI_MAMASHA, 1, MV_MOM_JUMPBK, 0, 0, 0, 1, 0, 0, 0);
+ ex->_excFlags |= 2;
+ mq->addExCommandToEnd(ex);
+ }
+ }
+
+ ex = new ExCommand(0, 18, QU_MOM_SITDOWN, 0, 0, 0, 1, 0, 0, 0);
+ ex->_excFlags |= 3u;
+ mq->addExCommandToEnd(ex);
+ }
+
+ mq->setFlags(mq->getFlags() | 1);
+ mq->chain(0);
+
+ g_vars->scene06_mumsyNumBalls = 0;
+ g_vars->scene06_arcadeEnabled = false;
+
+ g_fp->_aniMan2 = 0;
+}
+
+void sceneHandler06_spinHandle() {
+ int tummy = g_fp->getObjectState(sO_TummyTrampie);
+
+ if (tummy == g_fp->getObjectEnumState(sO_TummyTrampie, sO_IsEating))
+ g_fp->setObjectState(sO_TummyTrampie, g_fp->getObjectEnumState(sO_TummyTrampie, sO_IsSleeping));
+ else if (tummy == g_fp->getObjectEnumState(sO_TummyTrampie, sO_IsSleeping))
+ g_fp->setObjectState(sO_TummyTrampie, g_fp->getObjectEnumState(sO_TummyTrampie, sO_IsDrinking));
+ else if (tummy == g_fp->getObjectEnumState(sO_TummyTrampie, sO_IsDrinking))
+ g_fp->setObjectState(sO_TummyTrampie, g_fp->getObjectEnumState(sO_TummyTrampie, sO_IsScratchingBelly));
+ else if (tummy == g_fp->getObjectEnumState(sO_TummyTrampie, sO_IsScratchingBelly))
+ g_fp->setObjectState(sO_TummyTrampie, g_fp->getObjectEnumState(sO_TummyTrampie, sO_IsEating));
+}
+
+void sceneHandler06_uPipeClick() {
+ if (getGameLoaderInteractionController()->_flag24)
+ handleObjectInteraction(g_fp->_aniMan2, g_fp->_currentScene->getPictureObjectById(PIC_SC6_LADDER, 0), 0);
+}
+
+void sceneHandler06_buttonPush() {
+ g_vars->scene06_invHandle = g_fp->_currentScene->getStaticANIObject1ById(ANI_INV_HANDLE, -1);
+
+ if (g_vars->scene06_invHandle)
+ if (g_vars->scene06_invHandle->_flags & 4)
+ if (g_vars->scene06_invHandle->_statics)
+ if (g_vars->scene06_invHandle->_statics->_staticsId == ST_HDL_PLUGGED)
+ chainQueue(QU_SC6_FALLHANDLE, 1);
+}
+
+void sceneHandler06_showNextBall() {
+ if (g_vars->scene06_balls.size()) {
+ g_vars->scene06_currentBall = new StaticANIObject(g_vars->scene06_balls.front());
+ g_vars->scene06_balls.remove_at(0);
+
+ MessageQueue *mq = new MessageQueue(g_fp->_currentScene->getMessageQueueById(QU_SC6_SHOWNEXTBALL), 0, 1);
+
+ mq->replaceKeyCode(-1, g_vars->scene06_currentBall->_okeyCode);
+ mq->chain(0);
+
+ ++g_vars->scene06_numBallsGiven;
+ }
+}
+
+void sceneHandler06_installHandle() {
+ chainQueue(QU_SC6_SHOWHANDLE, 0);
+}
+
+int sceneHandler06_updateScreenCallback() {
+ int res;
+
+ res = g_fp->drawArcadeOverlay(g_vars->scene06_arcadeEnabled);
+
+ if (!res)
+ g_fp->_updateScreenCallback = 0;
+
+ return res;
+}
+
+void sceneHandler06_startAiming() {
+ if (g_vars->scene06_currentBall) {
+ g_vars->scene06_currentBall->hide();
+
+ g_fp->_aniMan->startAnim(MV_MAN6_TAKEBALL, 0, -1);
+
+ g_vars->scene06_ballInHands = g_vars->scene06_currentBall;
+ g_vars->scene06_currentBall = 0;
+
+ if (getCurrSceneSc2MotionController()->_isEnabled)
+ g_fp->_updateScreenCallback = sceneHandler06_updateScreenCallback;
+
+ getCurrSceneSc2MotionController()->clearEnabled();
+ getGameLoaderInteractionController()->disableFlag24();
+
+ g_vars->scene06_ballDrop->queueMessageQueue(0);
+ }
+}
+
+void sceneHandler06_takeBall() {
+ if (g_vars->scene06_currentBall && !g_vars->scene06_currentBall->_movement && g_vars->scene06_currentBall->_statics->_staticsId == ST_NBL_NORM) {
+ if (abs(1158 - g_fp->_aniMan->_ox) > 1
+ || abs(452 - g_fp->_aniMan->_oy) > 1
+ || g_fp->_aniMan->_movement
+ || g_fp->_aniMan->_statics->_staticsId != (0x4000 | ST_MAN_RIGHT)) {
+ MessageQueue *mq = getCurrSceneSc2MotionController()->method34(g_fp->_aniMan, 1158, 452, 1, (0x4000 | ST_MAN_RIGHT));
+
+ if (mq) {
+ ExCommand *ex = new ExCommand(0, 17, MSG_SC6_TAKEBALL, 0, 0, 0, 1, 0, 0, 0);
+ ex->_excFlags |= 3;
+ mq->addExCommandToEnd(ex);
+
+ postExCommand(g_fp->_aniMan->_id, 2, 1158, 452, 0, -1);
+ }
+ } else {
+ sceneHandler06_startAiming();
+ }
+ }
+}
+
+void sceneHandler06_aiming() {
+ if (g_vars->scene06_ballInHands) {
+ g_vars->scene06_ballDeltaX = 4 * g_fp->_aniMan->_movement->_currDynamicPhaseIndex + 16;
+ g_vars->scene06_ballDeltaY = 5 * (g_fp->_aniMan->_movement->_currDynamicPhaseIndex + 4);
+
+ if (g_fp->_aniMan->_movement->_currDynamicPhaseIndex < 4) {
+ g_fp->_aniMan->_movement->setDynamicPhaseIndex(11);
+
+ g_vars->scene06_aimingBall = false;
+
+ return;
+ }
+
+ g_fp->_aniMan->_movement->setDynamicPhaseIndex(9);
+ }
+
+ g_vars->scene06_aimingBall = false;
+}
+
+void sceneHandler06_ballStartFly() {
+ if (g_vars->scene06_ballInHands) {
+ g_vars->scene06_flyingBall = g_vars->scene06_ballInHands;
+ g_vars->scene06_ballInHands = 0;
+ g_vars->scene06_flyingBall->show1(g_fp->_aniMan->_ox - 60, g_fp->_aniMan->_oy - 60, -1, 0);
+
+ g_vars->scene06_flyingBall->_priority = 27;
+ }
+}
+
+void sceneHandler06_throwCallback(int *arg) {
+ if (g_vars->scene06_aimingBall) {
+ int dist = (g_fp->_mouseVirtY - g_vars->scene06_sceneClickY)
+ * (g_fp->_mouseVirtY - g_vars->scene06_sceneClickY)
+ + (g_fp->_mouseVirtX - g_vars->scene06_sceneClickX)
+ * (g_fp->_mouseVirtX - g_vars->scene06_sceneClickX);
+
+ *arg = (int)(sqrt((double)dist) * 0.1);
+
+ if (*arg > 8)
+ *arg = 8;
+ } else {
+ *arg = *arg + 1;
+ if (*arg == 12)
+ sceneHandler06_ballStartFly();
+ }
+}
+
+void sceneHandler06_throwBall() {
+ g_fp->_aniMan->_callback2 = sceneHandler06_throwCallback;
+ g_fp->_aniMan->startAnim(MV_MAN6_THROWBALL, 0, -1);
+
+ g_vars->scene06_aimingBall = true;
+}
+
+void sceneHandler06_eggieWalk() {
+ if (15 - g_vars->scene06_numBallsGiven >= 4 && !g_fp->_rnd->getRandomNumber(9)) {
+ StaticANIObject *ani = g_fp->_currentScene->getStaticANIObject1ById(ANI_EGGIE, -1);
+
+ if (!ani || !(ani->_flags & 4)) {
+ if (g_vars->scene06_eggieDirection)
+ chainQueue(QU_EGG6_GOR, 0);
+ else
+ chainQueue(QU_EGG6_GOL, 0);
+
+ g_vars->scene06_eggieTimeout = 0;
+ g_vars->scene06_eggieDirection = !g_vars->scene06_eggieDirection;
+ }
+ }
+}
+
+void sceneHandler06_dropBall() {
+ if (g_vars->scene06_numBallsGiven >= 15 || g_vars->scene06_mumsyNumBalls >= 5)
+ g_vars->scene06_ballDrop->hide();
+ else
+ chainQueue(QU_SC6_DROPS3, 0);
+}
+
+void sceneHandler06_fallBall() {
+ g_vars->scene06_ballY = 475;
+
+ g_vars->scene06_flyingBall->setOXY(g_vars->scene06_ballX, g_vars->scene06_ballY);
+
+ MessageQueue *mq = new MessageQueue(g_fp->_currentScene->getMessageQueueById(QU_SC6_FALLBALL), 0, 1);
+
+ mq->replaceKeyCode(-1, g_vars->scene06_flyingBall->_okeyCode);
+ mq->chain(0);
+
+ g_vars->scene06_balls.push_back(g_vars->scene06_flyingBall);
+
+ g_vars->scene06_flyingBall = 0;
+
+ sceneHandler06_dropBall();
+ sceneHandler06_eggieWalk();
+}
+
+void sceneHandler06_catchBall() {
+ if (g_vars->scene06_flyingBall) {
+ g_vars->scene06_flyingBall->hide();
+
+ g_vars->scene06_balls.push_back(g_vars->scene06_flyingBall);
+
+ g_vars->scene06_flyingBall = 0;
+
+ g_vars->scene06_mumsyNumBalls++;
+
+ if (g_vars->scene06_mumsy->_movement) {
+ Common::Point point;
+
+ if (g_vars->scene06_mumsy->_movement->_id == MV_MOM_JUMPFW) {
+ if (g_vars->scene06_mumsy->_movement->_currDynamicPhaseIndex <= 5) {
+ g_vars->scene06_mumsy->_movement->calcSomeXY(point, 0, g_vars->scene06_mumsy->_movement->_currDynamicPhaseIndex);
+
+ point.x = -point.x;
+ point.y = -point.y;
+ } else {
+ g_vars->scene06_mumsy->_movement->calcSomeXY(point, 1, -1);
+
+ g_vars->scene06_mumsyPos++;
+ }
+ } else if (g_vars->scene06_mumsy->_movement->_id == MV_MOM_JUMPBK) {
+ if (g_vars->scene06_mumsy->_movement->_currDynamicPhaseIndex <= 4) {
+ g_vars->scene06_mumsy->_movement->calcSomeXY(point, 0, g_vars->scene06_mumsy->_movement->_currDynamicPhaseIndex);
+
+ point.x = -point.x;
+ point.y = -point.y;
+ } else {
+ g_vars->scene06_mumsy->_movement->calcSomeXY(point, 1, -1);
+
+ g_vars->scene06_mumsyPos--;
+ }
+ }
+
+ g_vars->scene06_mumsy->changeStatics2(ST_MOM_STANDS);
+ g_vars->scene06_mumsy->setOXY(point.x + g_vars->scene06_mumsy->_ox,
+ point.y + g_vars->scene06_mumsy->_oy);
+ } else {
+ g_vars->scene06_mumsy->changeStatics2(ST_MOM_STANDS);
+ }
+
+ chainQueue(QU_MOM_PUTBALL, 1);
+ g_vars->scene06_mumsyGotBall = true;
+
+ sceneHandler06_dropBall();
+ }
+}
+
+void sceneHandler06_checkBallTarget(int par) {
+ int pixel;
+
+ if (g_vars->scene06_ballY <= 475) {
+ if (g_vars->scene06_mumsy->getPixelAtPos(g_vars->scene06_ballX, g_vars->scene06_ballY, &pixel)) {
+ if (pixel) {
+ chainObjQueue(g_vars->scene06_mumsy, QU_MOM_JUMPBK, 0);
+
+ sceneHandler06_catchBall();
+ }
+ }
+ } else {
+ sceneHandler06_fallBall();
+ }
+}
+
+void scene06_initScene(Scene *sc) {
+ g_vars->scene06_mumsy = sc->getStaticANIObject1ById(ANI_MAMASHA, -1);
+ g_vars->scene06_someBall = 0;
+ g_vars->scene06_invHandle = sc->getStaticANIObject1ById(ANI_INV_HANDLE, -1);
+ g_vars->scene06_liftButton = sc->getStaticANIObject1ById(ANI_BUTTON_6, -1);
+ g_vars->scene06_ballDrop = sc->getStaticANIObject1ById(ANI_BALLDROP, -1);
+ g_vars->scene06_arcadeEnabled = false;
+ g_vars->scene06_aimingBall = false;
+ g_vars->scene06_currentBall = 0;
+ g_vars->scene06_ballInHands = 0;
+ g_vars->scene06_flyingBall = 0;
+ g_vars->scene06_balls.clear();
+ g_vars->scene06_numBallsGiven = 0;
+ g_vars->scene06_mumsyNumBalls = 0;
+ g_vars->scene06_eggieTimeout = 0;
+ g_vars->scene06_eggieDirection = true;
+
+ StaticANIObject *ball = sc->getStaticANIObject1ById(ANI_NEWBALL, -1);
+
+ ball->hide();
+ ball->_statics = ball->getStaticsById(ST_NBL_NORM);
+ g_vars->scene06_balls.push_back(ball);
+
+ for (int i = 0; i < 3; i++) {
+ StaticANIObject *ball2 = new StaticANIObject(ball);
+
+ ball2->hide();
+ ball2->_statics = ball2->getStaticsById(ST_NBL_NORM);
+
+ sc->addStaticANIObject(ball2, 1);
+
+ g_vars->scene06_balls.push_back(ball2);
+ }
+
+ if (g_fp->getObjectState(sO_BigMumsy) == g_fp->getObjectEnumState(sO_BigMumsy, sO_IsPlaying))
+ g_fp->setObjectState(sO_BigMumsy, g_fp->getObjectEnumState(sO_BigMumsy, sO_IsSleeping));
+
+ if (g_fp->getObjectState(sO_BigMumsy) != g_fp->getObjectEnumState(sO_BigMumsy, sO_IsSleeping))
+ g_vars->scene06_mumsy->hide();
+
+ g_fp->lift_setButton(sO_Level3, ST_LBN_3N);
+ g_fp->lift_init(sc, QU_SC6_ENTERLIFT, QU_SC6_EXITLIFT);
+ g_fp->initArcadeKeys("SC_6");
+
+ sceneHandler06_setExits(sc);
+
+ g_fp->setArcadeOverlay(PIC_CSR_ARCADE2);
+}
+
+int sceneHandler06(ExCommand *ex) {
+ if (ex->_messageKind != 17)
+ return 0;
+
+ switch(ex->_messageNum) {
+ case MSG_LIFT_CLOSEDOOR:
+ g_fp->lift_closedoorSeq();
+ break;
+
+ case MSG_LIFT_EXITLIFT:
+ g_fp->lift_exitSeq(ex);
+ break;
+
+ case MSG_CMN_WINARCADE:
+ sceneHandler06_winArcade();
+ break;
+
+ case MSG_LIFT_STARTEXITQUEUE:
+ g_fp->lift_startExitQueue();
+ break;
+
+ case MSG_SC6_RESTORESCROLL:
+ g_fp->_aniMan2 = g_fp->_aniMan;
+ getCurrSceneSc2MotionController()->setEnabled();
+ getGameLoaderInteractionController()->enableFlag24();
+ sceneHandler06_setExits(g_fp->_currentScene);
+ break;
+
+ case MSG_SC6_STARTDROPS:
+ if (g_fp->getObjectState(sO_BigMumsy) == g_fp->getObjectEnumState(sO_BigMumsy, sO_IsSleeping))
+ sceneHandler06_enableDrops();
+ break;
+
+ case MSG_SC6_TESTNUMBALLS:
+ g_vars->scene06_mumsyGotBall = false;
+
+ if (g_vars->scene06_mumsyNumBalls < 5 || !g_vars->scene06_arcadeEnabled)
+ return 0;
+
+ sceneHandler06_mumsyBallTake();
+ break;
+
+ case MSG_SC6_JUMPFW:
+ ++g_vars->scene06_mumsyPos;
+ break;
+
+ case MSG_SC6_JUMPBK:
+ --g_vars->scene06_mumsyPos;
+ break;
+
+ case MSG_LIFT_CLICKBUTTON:
+ g_fp->lift_clickButton();
+ break;
+
+ case MSG_SPINHANDLE:
+ sceneHandler06_spinHandle();
+ break;
+
+ case MSG_LIFT_GO:
+ g_fp->lift_goAnimation();
+ break;
+
+ case MSG_SC6_UTRUBACLICK:
+ sceneHandler06_uPipeClick();
+ break;
+
+ case MSG_SC6_BTNPUSH:
+ sceneHandler06_buttonPush();
+ break;
+
+ case MSG_SC6_SHOWNEXTBALL:
+ sceneHandler06_showNextBall();
+ break;
+
+ case MSG_SC6_INSTHANDLE:
+ sceneHandler06_installHandle();
+ break;
+
+ case MSG_SC6_ENABLEDROPS:
+ sceneHandler06_enableDrops();
+ break;
+
+ case 64:
+ g_fp->lift_hoverButton(ex);
+ break;
+
+ case MSG_SC6_TAKEBALL:
+ sceneHandler06_takeBall();
+ break;
+
+ case 30:
+ if (g_vars->scene06_aimingBall) {
+ sceneHandler06_aiming();
+ break;
+ }
+
+ if (!g_vars->scene06_arcadeEnabled) {
+ // Do nothing
+ break;
+ }
+ break;
+
+ case 29:
+ {
+ StaticANIObject *st = g_fp->_currentScene->getStaticANIObjectAtPos(ex->_sceneClickX, ex->_sceneClickY);
+
+ if (st) {
+ if (!g_vars->scene06_arcadeEnabled && st->_id == ANI_LIFTBUTTON) {
+ g_fp->lift_animateButton(st);
+ ex->_messageKind = 0;
+ return 0;
+ }
+
+ if (g_vars->scene06_currentBall == st) {
+ if (g_vars->scene06_numBallsGiven == 1)
+ sceneHandler06_takeBall();
+
+ ex->_messageKind = 0;
+ } else if (g_vars->scene06_ballInHands && g_fp->_aniMan == st && !g_fp->_aniMan->_movement && g_fp->_aniMan->_statics->_staticsId == ST_MAN6_BALL) {
+ g_vars->scene06_sceneClickX = ex->_sceneClickX;
+ g_vars->scene06_sceneClickY = ex->_sceneClickY;
+
+ sceneHandler06_throwBall();
+ }
+ }
+
+ if (!st || !canInteractAny(g_fp->_aniMan, st, ex->_keyCode)) {
+ int picId = g_fp->_currentScene->getPictureObjectIdAtPos(ex->_sceneClickX, ex->_sceneClickY);
+ PictureObject *pic = g_fp->_currentScene->getPictureObjectById(picId, 0);
+
+ if (!pic || !canInteractAny(g_fp->_aniMan, pic, ex->_keyCode)) {
+ if ((g_fp->_sceneRect.right - ex->_sceneClickX < 47
+ && g_fp->_sceneRect.right < g_fp->_sceneWidth - 1)
+ || (ex->_sceneClickX - g_fp->_sceneRect.left < 47 && g_fp->_sceneRect.left > 0)) {
+ g_fp->processArcade(ex);
+ return 0;
+ }
+ }
+ }
+ }
+
+ break;
+
+ case 33:
+ {
+ int res = 0;
+
+ if (g_fp->_aniMan2) {
+ int ox = g_fp->_aniMan2->_ox;
+ int oy = g_fp->_aniMan2->_oy;
+
+ g_vars->scene06_manX = ox;
+ g_vars->scene06_manY = oy;
+
+ if (g_vars->scene06_arcadeEnabled && oy <= 470 && ox >= 1088) {
+ if (ox < g_fp->_sceneRect.left + 600) {
+ g_fp->_currentScene->_x = ox - g_fp->_sceneRect.left - 700;
+ ox = g_vars->scene06_manX;
+ }
+
+ if (ox > g_fp->_sceneRect.right - 50)
+ g_fp->_currentScene->_x = ox - g_fp->_sceneRect.right + 70;
+ } else {
+ if (ox < g_fp->_sceneRect.left + 200) {
+ g_fp->_currentScene->_x = ox - g_fp->_sceneRect.left - 300;
+ ox = g_vars->scene06_manX;
+ }
+
+ if (ox > g_fp->_sceneRect.right - 200)
+ g_fp->_currentScene->_x = ox - g_fp->_sceneRect.right + 300;
+ }
+
+ res = 1;
+ }
+ if (g_vars->scene06_arcadeEnabled) {
+ if (g_vars->scene06_mumsyPos > -3)
+ g_vars->scene06_mumsyJumpBk->_percent = g_vars->scene06_mumsyJumpBkPercent;
+ else
+ g_vars->scene06_mumsyJumpBk->_percent = 0;
+
+ if (g_vars->scene06_mumsyPos < 4)
+ g_vars->scene06_mumsyJumpFw->_percent = g_vars->scene06_mumsyJumpFwPercent;
+ else
+ g_vars->scene06_mumsyJumpFw->_percent = 0;
+
+ if (g_vars->scene06_aimingBall) {
+ g_vars->scene06_eggieTimeout++;
+
+ if (g_vars->scene06_eggieTimeout >= 600)
+ sceneHandler06_eggieWalk();
+ }
+ } else {
+ g_vars->scene06_mumsyJumpFw->_percent = 0;
+ g_vars->scene06_mumsyJumpBk->_percent = 0;
+ }
+
+ if (g_vars->scene06_flyingBall) {
+ g_vars->scene06_ballX = g_vars->scene06_flyingBall->_ox - g_vars->scene06_ballDeltaX;
+ g_vars->scene06_ballY = g_vars->scene06_flyingBall->_oy - g_vars->scene06_ballDeltaY;
+
+ g_vars->scene06_flyingBall->setOXY(g_vars->scene06_ballX, g_vars->scene06_ballY);
+
+ if (g_vars->scene06_ballDeltaX >= 2)
+ g_vars->scene06_ballDeltaX -= 2;
+
+ g_vars->scene06_ballDeltaY -= 5;
+
+ sceneHandler06_checkBallTarget(g_vars->scene06_ballDeltaX);
+ }
+ if (g_vars->scene06_arcadeEnabled
+ && !g_vars->scene06_currentBall
+ && !g_vars->scene06_ballInHands
+ && !g_vars->scene06_flyingBall
+ && g_vars->scene06_numBallsGiven >= 15
+ && !g_vars->scene06_ballDrop->_movement
+ && !g_vars->scene06_mumsy->_movement
+ && !g_vars->scene06_mumsyGotBall)
+ sceneHandler06_mumsyBallTake();
+ g_fp->_behaviorManager->updateBehaviors();
+ g_fp->startSceneTrack();
+
+ return res;
+ }
+ }
+
+ return 0;
+}
+
+} // End of namespace Fullpipe
diff --git a/engines/fullpipe/scenes/scene07.cpp b/engines/fullpipe/scenes/scene07.cpp
new file mode 100644
index 0000000000..6db8c30932
--- /dev/null
+++ b/engines/fullpipe/scenes/scene07.cpp
@@ -0,0 +1,175 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public 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 "fullpipe/fullpipe.h"
+
+#include "fullpipe/objects.h"
+#include "fullpipe/objectnames.h"
+#include "fullpipe/constants.h"
+#include "fullpipe/motion.h"
+#include "fullpipe/scenes.h"
+#include "fullpipe/scene.h"
+#include "fullpipe/statics.h"
+#include "fullpipe/messages.h"
+#include "fullpipe/behavior.h"
+
+namespace Fullpipe {
+
+void scene07_initScene(Scene *sc) {
+ g_vars->scene07_lukeAnim = 0;
+ g_vars->scene07_lukePercent = 0;
+ g_vars->scene07_plusMinus = sc->getStaticANIObject1ById(ANI_PLUSMINUS, -1);
+
+ if (g_fp->getObjectState(sO_Guard_1) == g_fp->getObjectEnumState(sO_Guard_1, sO_Off))
+ g_vars->scene07_plusMinus->_statics = g_vars->scene07_plusMinus->getStaticsById(ST_PMS_MINUS);
+ else
+ g_vars->scene07_plusMinus->_statics = g_vars->scene07_plusMinus->getStaticsById(ST_PMS_PLUS);
+
+ if (g_fp->getObjectState(sO_HareTheNooksiter) == g_fp->getObjectEnumState(sO_HareTheNooksiter, sO_WithoutHandle)) {
+ Scene *oldsc = g_fp->_currentScene;
+
+ g_fp->_currentScene = sc;
+
+ sc->getStaticANIObject1ById(ANI_CORNERSITTER, -1)->changeStatics2(ST_CST_HANDLELESS);
+
+ g_fp->_currentScene = oldsc;
+ }
+}
+
+void sceneHandler07_openLuke() {
+ StaticANIObject *luke = g_fp->_currentScene->getStaticANIObject1ById(ANI_LUKE, -1);
+
+ luke->changeStatics2(ST_LUK_OPEN);
+ luke->show1(-1, -1, -1, 0);
+
+ if (g_vars->scene07_lukeAnim) {
+ g_vars->scene07_lukeAnim->_percent = g_vars->scene07_lukePercent;
+ } else {
+ StaticANIObject *ani = g_fp->_currentScene->getStaticANIObject1ById(ANI_CORNERSITTER, -1);
+
+ g_vars->scene07_lukeAnim = g_fp->_behaviorManager->getBehaviorEntryInfoByMessageQueueDataId(ani, ST_CST_HANDLELESS, QU_CST_CLOSELUKE);
+
+ g_vars->scene07_lukeAnim->_percent = g_vars->scene07_lukePercent;
+ }
+}
+
+void sceneHandler07_closeLuke() {
+ g_fp->_currentScene->getStaticANIObject1ById(ANI_LUKE, -1)->changeStatics2(ST_LUK_CLOSED);
+
+ if (!g_vars->scene07_lukeAnim) {
+ StaticANIObject *ani = g_fp->_currentScene->getStaticANIObject1ById(ANI_CORNERSITTER, -1);
+
+ g_vars->scene07_lukeAnim = g_fp->_behaviorManager->getBehaviorEntryInfoByMessageQueueDataId(ani, ST_CST_HANDLELESS, QU_CST_CLOSELUKE);
+ }
+
+ g_vars->scene07_lukePercent = g_vars->scene07_lukeAnim->_percent;
+ g_vars->scene07_lukeAnim->_percent = 0;
+
+ StaticANIObject *ani = g_fp->_currentScene->getStaticANIObject1ById(ANI_HOOLIGAN, -1);
+
+ ani->changeStatics2(ST_HGN_LUKE);
+ ani->show1(-1, -1, -1, 0);
+}
+
+void sceneHandler07_hideLuke() {
+ g_fp->_currentScene->getStaticANIObject1ById(ANI_LUKE, -1)->hide();
+
+ Movement *mov = g_fp->_currentScene->getStaticANIObject1ById(ANI_CORNERSITTER, -1)->_movement;
+
+ if (mov) {
+ if (mov->_id == MV_CST_CLOSELUKE) {
+ StaticANIObject *ani = g_fp->_currentScene->getStaticANIObject1ById(ANI_HOOLIGAN, -1);
+
+ ani->changeStatics2(ST_HGN_LOOK);
+ ani->_flags &= 0xFFFB;
+ }
+ }
+}
+
+void sceneHandler07_showBox() {
+ StaticANIObject *box = g_fp->_currentScene->getStaticANIObject1ById(ANI_SC7_BOX, -1);
+
+ box->show1(492, 474, MV_SC7_BOX_default, 0);
+ box->_priority = 25;
+}
+
+void sceneHandler07_hideBox() {
+ g_fp->_currentScene->getStaticANIObject1ById(ANI_SC7_BOX, -1)->hide();
+}
+
+int sceneHandler07(ExCommand *ex) {
+ if (ex->_messageKind != 17)
+ return 0;
+
+ switch(ex->_messageNum) {
+ case MSG_SC7_OPENLUKE:
+ sceneHandler07_openLuke();
+ break;
+
+ case MSG_SC7_PULL:
+ if (g_vars->scene07_plusMinus->_statics->_staticsId == ST_PMS_MINUS)
+ g_vars->scene07_plusMinus->_statics = g_vars->scene07_plusMinus->getStaticsById(ST_PMS_PLUS);
+ else
+ g_vars->scene07_plusMinus->_statics = g_vars->scene07_plusMinus->getStaticsById(ST_PMS_MINUS);
+
+ break;
+
+ case MSG_SC7_CLOSELUKE:
+ sceneHandler07_closeLuke();
+ break;
+
+ case MSG_SC7_HIDELUKE:
+ sceneHandler07_hideLuke();
+ break;
+
+ case MSG_SC7_SHOWBOX:
+ sceneHandler07_showBox();
+ break;
+
+ case MSG_SC7_HIDEBOX:
+ sceneHandler07_hideBox();
+ break;
+
+ case 33:
+ {
+ int res = 0;
+
+ if (g_fp->_aniMan2) {
+ if (g_fp->_aniMan2->_ox < g_fp->_sceneRect.left + 200)
+ g_fp->_currentScene->_x = g_fp->_aniMan2->_ox - g_fp->_sceneRect.left - 300;
+
+ if (g_fp->_aniMan2->_ox > g_fp->_sceneRect.right - 200)
+ g_fp->_currentScene->_x = g_fp->_aniMan2->_ox - g_fp->_sceneRect.right + 300;
+
+ res = 1;
+ }
+
+ g_fp->_behaviorManager->updateBehaviors();
+
+ return res;
+ }
+ }
+
+ return 0;
+}
+
+} // End of namespace Fullpipe
diff --git a/engines/fullpipe/scenes/scene08.cpp b/engines/fullpipe/scenes/scene08.cpp
new file mode 100644
index 0000000000..a5f5a8b389
--- /dev/null
+++ b/engines/fullpipe/scenes/scene08.cpp
@@ -0,0 +1,546 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public 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 "fullpipe/fullpipe.h"
+
+#include "fullpipe/objects.h"
+#include "fullpipe/objectnames.h"
+#include "fullpipe/constants.h"
+#include "fullpipe/motion.h"
+#include "fullpipe/scenes.h"
+#include "fullpipe/scene.h"
+#include "fullpipe/statics.h"
+#include "fullpipe/floaters.h"
+#include "fullpipe/gameloader.h"
+#include "fullpipe/behavior.h"
+#include "fullpipe/interaction.h"
+
+namespace Fullpipe {
+
+void scene08_initScene(Scene *sc) {
+ g_vars->scene08_inArcade = false;
+ g_vars->scene08_inAir = false;
+ g_vars->scene08_flyingUp = false;
+ g_vars->scene08_onBelly = false;
+ g_vars->scene08_batuta = sc->getStaticANIObject1ById(ANI_BATUTA, -1);
+ g_vars->scene08_vmyats = sc->getStaticANIObject1ById(ANI_VMYATS, -1);
+ g_vars->scene08_clock = sc->getStaticANIObject1ById(ANI_CLOCK_8, -1);
+ g_vars->scene08_stairsOffset = -37;
+ g_vars->scene08_snoringCountdown = -1;
+
+ Scene *oldsc = g_fp->_currentScene;
+ g_fp->_currentScene = sc;
+
+ int batuta = g_fp->getObjectState(sO_TummyTrampie);
+ MovGraphLink *lock = getSc2MctlCompoundBySceneId(sc->_sceneId)->getLinkByName(sO_CloseThing);
+
+ if (lock)
+ lock->_flags &= 0xDFFFFFFF;
+
+ if (batuta == g_fp->getObjectEnumState(sO_TummyTrampie, sO_IsEating)) {
+ g_vars->scene08_batuta->changeStatics2(ST_BTT_SPOON);
+ } else if (batuta == g_fp->getObjectEnumState(sO_TummyTrampie, sO_IsDrinking)) {
+ g_vars->scene08_batuta->changeStatics2(ST_BTT_NOSPOON);
+
+ g_vars->scene08_clock->startAnim(MV_CLK8_GO, 0, -1);
+ g_vars->scene08_clock->_movement->setDynamicPhaseIndex(3);
+ } else if (batuta== g_fp->getObjectEnumState(sO_TummyTrampie, sO_IsScratchingBelly)) {
+ g_vars->scene08_batuta->changeStatics2(ST_BTT_CHESHET);
+
+ g_vars->scene08_clock->startAnim(MV_CLK8_GO, 0, -1);
+ g_vars->scene08_clock->_movement->setDynamicPhaseIndex(8);
+ } else if (batuta == g_fp->getObjectEnumState(sO_TummyTrampie, sO_IsSleeping)) {
+ g_vars->scene08_batuta->changeStatics2(ST_BTT_SLEEPS);
+
+ g_vars->scene08_clock->startAnim(MV_CLK8_GO, 0, -1);
+ g_vars->scene08_clock->_movement->setDynamicPhaseIndex(2);
+
+ if (lock)
+ lock->_flags |= 0x20000000;
+
+ g_vars->scene08_snoringCountdown = 71;
+ }
+
+ g_vars->scene08_clock->_callback2 = 0;
+
+ if (g_fp->getObjectState(sO_StairsUp_8) == g_fp->getObjectEnumState(sO_StairsUp_8, sO_Broken)) {
+ g_vars->scene08_stairsVisible = false;
+
+ sc->getPictureObjectById(PIC_SC8_LADDER, 0)->_flags &= 0xFFFB;
+
+ g_vars->scene08_stairsOffset = -39;
+ } else {
+ g_vars->scene08_stairsVisible = true;
+ }
+
+ sc->getPictureObjectById(PIC_SC8_ARCADENOW, 0)->_flags &= 0xFFFB;
+
+ g_fp->_currentScene = oldsc;
+
+ g_fp->_floaters->init(g_fp->getGameLoaderGameVar()->getSubVarByName("SC_8"));
+ g_fp->_floaters->genFlies(sc, 100, 100, 0, 0);
+
+ g_fp->setArcadeOverlay(PIC_CSR_ARCADE3);
+}
+
+void scene08_setupMusic() {
+ if (g_fp->getObjectState(sO_TummyTrampie) == g_fp->getObjectEnumState(sO_TummyTrampie, sO_IsSleeping))
+ g_fp->playTrack(g_fp->getGameLoaderGameVar()->getSubVarByName("SC_8"), "MUSIC_ARCADE", 1);
+}
+
+int scene08_updateCursor() {
+ g_fp->updateCursorCommon();
+
+ if (g_vars->scene08_inArcade) {
+ if (g_vars->scene08_onBelly) {
+ if (g_fp->_objectIdAtCursor == PIC_SC8_LADDERD && g_fp->_cursorId == PIC_CSR_ITN)
+ g_fp->_cursorId = PIC_CSR_GOU;
+ } else {
+ g_fp->_cursorId = -1;
+ }
+ } else {
+ if (g_fp->_objectIdAtCursor == PIC_SC8_LADDERD && g_fp->_cursorId == PIC_CSR_ITN) {
+ if (g_fp->_aniMan2->_oy >= 520) {
+ if (g_fp->_aniMan2->_oy <= 750)
+ g_fp->_cursorId = PIC_CSR_GOU;
+ } else {
+ g_fp->_cursorId = PIC_CSR_GOD;
+ }
+ }
+ }
+
+ return g_fp->_cursorId;
+}
+
+void sceneHandler08_enterUp() {
+ g_fp->_currentScene->getPictureObjectById(PIC_SC8_LADDER, 0)->_flags &= 0xFFFB;
+
+ g_fp->_aniMan->changeStatics2(ST_MAN8_HANDSUP);
+ g_fp->_aniMan->setOXY(386, 236);
+ g_fp->_aniMan->_priority = 10;
+ g_fp->_aniMan->_flags = 4;
+
+ chainObjQueue(g_fp->_aniMan, QU_SC8_FINISH, 1);
+
+ g_vars->scene08_inAir = false;
+}
+
+void sceneHandler08_winArcade() {
+ if (g_vars->scene08_inArcade) {
+ g_vars->scene08_inArcade = false;
+ g_fp->_sceneRect.top = 0;
+ g_fp->_sceneRect.bottom = 600;
+
+ sceneHandler08_enterUp();
+ }
+}
+
+void sceneHandler08_hideLadder() {
+ g_fp->_currentScene->getPictureObjectById(PIC_SC8_LADDER_D, 0)->_flags &= 0xFFFB;
+}
+
+void sceneHandler08_arcadeNow() {
+ MovGraphLink *lnk = getCurrSceneSc2MotionController()->getLinkByName(sO_Stairway);
+
+ g_fp->setObjectState(sO_TummyTrampie, g_fp->getObjectEnumState(sO_TummyTrampie, sO_IsSleeping));
+
+ g_vars->scene08_batuta->changeStatics2(ST_BTT_SLEEPS);
+
+ if (lnk)
+ lnk->_flags |= 0x20000000;
+}
+
+void sceneHandler08_resumeFlight() {
+ g_vars->scene08_manOffsetY = 3;
+ g_vars->scene08_stairsOffset = -39;
+ g_vars->scene08_inAir = true;
+ g_vars->scene08_stairsVisible = false;
+}
+
+int sceneHandler08_calcOffset(int off, int flag) {
+ if (off > 0) {
+ if (flag)
+ return off * 31 / 10; // off * 3.1
+ else
+ return 5 * off;
+ } else {
+ return 5 * off;
+ }
+}
+
+void sceneHandler08_pushCallback(int *par) {
+ Common::Point point;
+
+ int y = g_fp->_aniMan->_oy + g_fp->_aniMan->getSomeXY(point)->y;
+
+ if (g_fp->_aniMan->_statics && g_fp->_aniMan->_statics->_staticsId == ST_MAN8_FLYDOWN)
+ y -= 25;
+
+ *par = (y - 703) / 10;
+ if (*par > 11) {
+ *par = 11;
+ g_vars->scene08_manOffsetY = 0;
+ }
+ if (*par >= 0)
+ g_vars->scene08_manOffsetY -= sceneHandler08_calcOffset(*par, g_vars->scene08_manOffsetY < 0);
+ else
+ *par = 0;
+}
+
+int sceneHandler08_updateScreenCallback() {
+ int res;
+
+ res = g_fp->drawArcadeOverlay(g_vars->scene08_inArcade);
+
+ if (!res)
+ g_fp->_updateScreenCallback = 0;
+
+ return res;
+}
+
+void sceneHandler08_startArcade() {
+ g_vars->scene08_inArcade = true;
+ g_vars->scene08_inAir = true;
+ g_vars->scene08_flyingUp = false;
+ g_vars->scene08_onBelly = false;
+
+ getGameLoaderInteractionController()->disableFlag24();
+ getCurrSceneSc2MotionController()->clearEnabled();
+
+ g_vars->scene08_batuta->stopAnim_maybe();
+
+ g_vars->scene08_vmyats->_statics = g_vars->scene08_vmyats->getStaticsById(ST_VMT_MIN);
+ g_vars->scene08_vmyats->setOXY(382, 703);
+ g_vars->scene08_vmyats->_priority = 29;
+ g_vars->scene08_vmyats->_callback2 = sceneHandler08_pushCallback;
+
+ g_fp->_aniMan = g_fp->_currentScene->getStaticANIObject1ById(ANI_MAN, -1);
+
+ g_vars->scene08_manOffsetY = 15;
+
+ g_fp->_currentScene->_y = 0;
+
+ g_fp->_updateScreenCallback = sceneHandler08_updateScreenCallback;
+}
+
+void sceneHandler08_airMoves() {
+ if (g_fp->_aniMan->isIdle() && !(g_fp->_aniMan->_flags & 0x100)) {
+ int x = g_fp->_aniMan->_ox;
+ int y = g_fp->_aniMan->_oy;
+ Common::Point point;
+
+ if (703 - g_fp->_aniMan->getSomeXY(point)->y - y < 150) {
+ if (g_fp->_aniMan->_statics) {
+ if (g_fp->_aniMan->_statics->_staticsId == ST_MAN8_FLYDOWN) {
+ y -= 25;
+
+ g_fp->_aniMan->setOXY(x, y);
+ }
+ }
+
+ g_fp->_aniMan->changeStatics2(ST_MAN8_STAND);
+ g_fp->_aniMan->setOXY(380, y);
+ g_fp->_aniMan->startAnim(MV_MAN8_JUMP, 0, -1);
+
+ } else if (g_fp->_aniMan->_statics) {
+ if (g_fp->_aniMan->_statics->_staticsId == ST_MAN8_FLYUP) {
+ g_fp->_aniMan->startAnim(MV_MAN8_DRYGUP, 0, -1);
+
+ } else if (g_fp->_aniMan->_statics->_staticsId == ST_MAN8_FLYDOWN) {
+ g_fp->_aniMan->startAnim(MV_MAN8_DRYGDOWN, 0, -1);
+ }
+ }
+ }
+}
+
+void sceneHandler08_finishArcade() {
+ g_vars->scene08_inArcade = false;
+
+ getGameLoaderInteractionController()->enableFlag24();
+ getCurrSceneSc2MotionController()->setEnabled();
+}
+
+void sceneHandler08_jumpOff(ExCommand *cmd) {
+ MessageQueue *mq = new MessageQueue(g_fp->_globalMessageQueueList->compact());
+
+ mq->addExCommandToEnd(cmd->createClone());
+ mq->setFlags(mq->getFlags() | 1);
+
+ g_fp->_globalMessageQueueList->addMessageQueue(mq);
+
+ g_fp->_aniMan->startAnim(MV_MAN8_JUMPOFF, mq->_id, -1);
+
+ sceneHandler08_finishArcade();
+}
+
+void sceneHandler08_standUp() {
+ chainQueue(QU_SC8_STANDUP, 1);
+ g_vars->scene08_onBelly = false;
+}
+
+void sceneHandler08_jumpLogic(ExCommand *cmd) {
+ if (g_fp->_currentScene->getPictureObjectIdAtPos(cmd->_sceneClickX, cmd->_sceneClickY) == PIC_SC8_LADDERD) {
+ sceneHandler08_jumpOff(cmd);
+
+ cmd->_messageKind = 0;
+ } else {
+ sceneHandler08_standUp();
+ }
+}
+
+void sceneHandler08_badLuck() {
+ g_fp->_currentScene->getPictureObjectById(PIC_SC8_LADDER, 0)->_flags &= 0xFFFB;
+
+ g_fp->_aniMan->changeStatics2(ST_MAN8_HANDSUP);
+ g_fp->_aniMan->setOXY(376, 280);
+ g_fp->_aniMan->_priority = 10;
+
+ MessageQueue *mq = new MessageQueue(g_fp->_globalMessageQueueList->compact());
+
+ ExCommand *ex = new ExCommand(g_fp->_aniMan->_id, 1, MV_MAN8_BADLUCK, 0, 0, 0, 1, 0, 0, 0);
+ ex->_excFlags |= 2;
+ ex->_keyCode = g_fp->_aniMan->_okeyCode;
+ mq->addExCommandToEnd(ex);
+
+ mq->setFlags(mq->getFlags() | 1);
+ mq->chain(0);
+
+ g_fp->setObjectState(sO_StairsUp_8, g_fp->getObjectEnumState(sO_StairsUp_8, sO_NotBroken));
+
+ g_vars->scene08_inAir = false;
+}
+
+void sceneHandler08_sitDown() {
+ g_fp->_aniMan->setOXY(380, g_fp->_aniMan->_oy);
+
+ g_fp->_aniMan->changeStatics2(ST_MAN8_FLYDOWN);
+ g_fp->_aniMan->startAnim(MV_MAN8_SITDOWN, 0, -1);
+
+ g_vars->scene08_vmyats->changeStatics2(ST_VMT_MIN);
+ g_vars->scene08_vmyats->hide();
+
+ g_vars->scene08_inAir = false;
+ g_vars->scene08_onBelly = true;
+}
+
+void sceneHandler08_calcFlight() {
+ Common::Point point;
+ int y = g_vars->scene08_manOffsetY + g_fp->_aniMan->_oy;
+
+ g_fp->_aniMan->setOXY(g_fp->_aniMan->_ox, y);
+
+ g_vars->scene08_manOffsetY += 2;
+
+ if (g_vars->scene08_manOffsetY < g_vars->scene08_stairsOffset)
+ g_vars->scene08_manOffsetY = g_vars->scene08_stairsOffset;
+
+ y = y + g_fp->_aniMan->getSomeXY(point)->y;
+
+ if (g_fp->_aniMan->_statics && g_fp->_aniMan->_statics->_staticsId == ST_MAN8_FLYDOWN)
+ y -= 25;
+
+ if (y <= g_vars->scene08_vmyats->_oy) {
+ g_vars->scene08_vmyats->hide();
+ } else {
+ g_vars->scene08_vmyats->show1(-1, -1, -1, 0);
+
+ if (!g_vars->scene08_vmyats->_movement)
+ g_vars->scene08_vmyats->startAnim(MV_VMT_DEF, 0, -1);
+ }
+
+ if (g_fp->_aniMan->_oy <= 280 && g_vars->scene08_stairsVisible
+ && g_fp->_aniMan->_statics && g_fp->_aniMan->_statics->_staticsId == ST_MAN8_HANDSUP) {
+ sceneHandler08_badLuck();
+ } else if (g_fp->_aniMan->_oy > 236 || g_vars->scene08_stairsVisible
+ || !g_fp->_aniMan->_statics || g_fp->_aniMan->_statics->_staticsId != ST_MAN8_HANDSUP) {
+ if (g_fp->_aniMan->_movement || g_fp->_aniMan->_oy < 660
+ || (g_vars->scene08_vmyats->_movement && g_vars->scene08_vmyats->_movement->_currDynamicPhaseIndex > 0)
+ || abs(g_vars->scene08_manOffsetY) > 2) {
+ if (g_vars->scene08_manOffsetY >= 0 && !g_fp->_aniMan->_movement) {
+ if (g_fp->_aniMan->_statics->_staticsId == ST_MAN8_HANDSUP)
+ g_fp->_aniMan->startAnim(MV_MAN8_HANDSDOWN, 0, -1);
+ else
+ g_fp->_aniMan->changeStatics2(ST_MAN8_FLYDOWN);
+ }
+
+ if (g_fp->_aniMan->_oy < 500 && !g_fp->_aniMan->_movement && g_fp->_aniMan->_statics->_staticsId == ST_MAN8_FLYUP && g_vars->scene08_manOffsetY < 0)
+ g_fp->_aniMan->startAnim(MV_MAN8_HANDSUP, 0, -1);
+ } else {
+ sceneHandler08_sitDown();
+ }
+ } else {
+ sceneHandler08_enterUp();
+ }
+}
+
+void sceneHandler08_checkEndArcade() {
+ if (g_vars->scene08_flyingUp) {
+ int x = g_fp->_aniMan->_ox;
+ int y = g_vars->scene08_manOffsetY + g_fp->_aniMan->_oy;
+
+ if (!((g_vars->scene08_manOffsetY + g_fp->_aniMan->_oy) % 3))
+ g_vars->scene08_manOffsetY--;
+
+ g_fp->_aniMan->setOXY(x, y);
+
+ if (y < 80) {
+ sceneHandler08_finishArcade();
+
+ ExCommand *ex = new ExCommand(SC_8, 17, 0, 0, 0, 0, 1, 0, 0, 0);
+ ex->_messageNum = 61;
+ ex->_excFlags |= 2;
+ ex->_keyCode = TrubaUp;
+
+ ex->postMessage();
+ }
+ }
+}
+
+int sceneHandler08(ExCommand *cmd) {
+ if (cmd->_messageKind != 17)
+ return 0;
+
+ switch (cmd->_messageNum) {
+ case MSG_CMN_WINARCADE:
+ sceneHandler08_winArcade();
+ break;
+
+ case MSG_SC8_ENTERUP:
+ sceneHandler08_enterUp();
+ break;
+
+ case MSG_SC8_HIDELADDER_D:
+ sceneHandler08_hideLadder();
+ break;
+
+ case MSG_SC8_STANDUP:
+ g_vars->scene08_manOffsetY = -10;
+ g_vars->scene08_vmyats->changeStatics2(ST_VMT_MIN);
+ g_vars->scene08_vmyats->setOXY(382, 703);
+ g_vars->scene08_vmyats->_priority = 29;
+ g_vars->scene08_vmyats->_callback2 = sceneHandler08_pushCallback;
+ g_vars->scene08_inAir = true;
+ break;
+
+ case MSG_SC8_ARCADENOW:
+ sceneHandler08_arcadeNow();
+ break;
+
+ case MSG_SC8_RESUMEFLIGHT:
+ sceneHandler08_resumeFlight();
+ break;
+
+ case MSG_SC8_GETHIMUP:
+ g_vars->scene08_manOffsetY = 0;
+ g_vars->scene08_flyingUp = true;
+ break;
+
+ case MSG_STARTARCADE:
+ sceneHandler08_startArcade();
+ break;
+
+ case 29:
+ if (g_vars->scene08_inArcade) {
+ if (g_vars->scene08_inAir) {
+ sceneHandler08_airMoves();
+ break;
+ }
+ if (g_vars->scene08_onBelly) {
+ sceneHandler08_jumpLogic(cmd);
+ break;
+ }
+ }
+ break;
+
+ case 33:
+ {
+ int res = 0;
+
+ if (g_fp->_aniMan2) {
+ if (g_vars->scene08_inArcade) {
+ int scHeight = g_fp->_sceneRect.bottom - g_fp->_sceneRect.top;
+
+ if (g_fp->_aniMan2->_oy < g_fp->_sceneRect.top + 200) {
+ g_fp->_sceneRect.top = g_fp->_aniMan2->_oy - 200;
+
+ if (g_fp->_sceneRect.top < 0)
+ g_fp->_sceneRect.top = 0;
+
+ g_fp->_sceneRect.bottom = scHeight + g_fp->_sceneRect.top;
+ }
+
+ if (g_fp->_aniMan2->_oy > g_fp->_sceneRect.bottom - 350) {
+ g_fp->_sceneRect.bottom = g_fp->_aniMan2->_oy + 350;
+ g_fp->_sceneRect.top = g_fp->_aniMan2->_oy + 350 - scHeight;
+ }
+ } else {
+ if (g_fp->_aniMan2->_ox < g_fp->_sceneRect.left + 200)
+ g_fp->_currentScene->_x = g_fp->_aniMan2->_ox - g_fp->_sceneRect.left - 300;
+
+ if (g_fp->_aniMan2->_ox > g_fp->_sceneRect.right - 200)
+ g_fp->_currentScene->_x = g_fp->_aniMan2->_ox - g_fp->_sceneRect.right + 300;
+
+ res = 1;
+ }
+ }
+
+ g_fp->_floaters->update();
+
+ if (g_vars->scene08_inArcade) {
+ if (g_vars->scene08_inAir)
+ sceneHandler08_calcFlight();
+ } else {
+ Movement *mov = g_fp->_aniMan->_movement;
+
+ if (mov) {
+ if (mov->_id == MV_MAN_TOLADDERD && mov->_currDynamicPhaseIndex == 8)
+ g_fp->_aniMan->_priority = 2;
+
+ if (mov && mov->_id == MV_MAN_FROMLADDERUP && mov->_currDynamicPhaseIndex == 13)
+ g_fp->_aniMan->_priority = 20;
+ }
+
+ g_fp->_behaviorManager->updateBehaviors();
+ g_fp->startSceneTrack();
+ }
+
+ if (g_vars->scene08_flyingUp)
+ sceneHandler08_checkEndArcade();
+
+ if (g_vars->scene08_snoringCountdown > 0) {
+ g_vars->scene08_snoringCountdown--;
+
+ if (!g_vars->scene08_snoringCountdown) {
+ g_fp->playSound(SND_8_014, 0);
+
+ g_vars->scene08_snoringCountdown = 71;
+ }
+ }
+
+ return res;
+ }
+ }
+
+ return 0;
+}
+
+} // End of namespace Fullpipe
diff --git a/engines/fullpipe/scenes/scene09.cpp b/engines/fullpipe/scenes/scene09.cpp
new file mode 100644
index 0000000000..99cf0b20fd
--- /dev/null
+++ b/engines/fullpipe/scenes/scene09.cpp
@@ -0,0 +1,747 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public 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 "fullpipe/fullpipe.h"
+
+#include "fullpipe/objectnames.h"
+#include "fullpipe/constants.h"
+
+#include "fullpipe/gameloader.h"
+#include "fullpipe/motion.h"
+#include "fullpipe/scenes.h"
+#include "fullpipe/statics.h"
+
+#include "fullpipe/interaction.h"
+#include "fullpipe/behavior.h"
+
+
+namespace Fullpipe {
+
+struct Hanger {
+ StaticANIObject *ani;
+ int field_4;
+ int field_8;
+ int phase;
+};
+
+void scene09_setupGrit(Scene *sc) {
+ if (g_vars->scene09_grit->_statics->_staticsId == ST_GRT9_GRIT) {
+ if (!getGameLoaderInventory()->getCountItemsWithId(ANI_INV_COIN)) {
+ if (g_fp->getObjectState(sO_CoinSlot_1) == g_fp->getObjectEnumState(sO_CoinSlot_1, sO_Empty)
+ && (g_vars->swallowedEgg1->_value.intValue == ANI_INV_EGGBOOT || g_vars->swallowedEgg2->_value.intValue == ANI_INV_EGGBOOT || g_vars->swallowedEgg3->_value.intValue == ANI_INV_EGGBOOT)) {
+ Scene *oldsc = g_fp->_currentScene;
+ g_fp->_currentScene = sc;
+ g_vars->scene09_grit->changeStatics2(ST_GRT9_NORM);
+ g_fp->_currentScene = oldsc;
+ }
+ }
+ }
+}
+
+void scene09_initScene(Scene *sc) {
+ g_vars->scene09_flyingBall = 0;
+ g_vars->scene09_numSwallenBalls = 0;
+ g_vars->scene09_gulper = sc->getStaticANIObject1ById(ANI_GLOTATEL, -1);
+ g_vars->scene09_spitter = sc->getStaticANIObject1ById(ANI_PLEVATEL, -1);
+ g_vars->scene09_grit = sc->getStaticANIObject1ById(ANI_GRIT_9, -1);
+ g_vars->scene09_gulperIsPresent = true;
+ g_vars->scene09_dudeIsOnLadder = false;
+ g_vars->scene09_interactingHanger = -1;
+ g_vars->scene09_intHangerPhase = -1;
+ g_vars->scene09_intHangerMaxPhase = -1000;
+
+ g_vars->scene09_balls.cPlexLen = 10;
+ g_vars->scene09_flyingBalls.cPlexLen = 10;
+
+ while (g_vars->scene09_balls.numBalls) {
+ Ball *b = g_vars->scene09_balls.pHead->p0;
+
+ g_vars->scene09_balls.pHead = g_vars->scene09_balls.pHead->p0;
+
+ if (g_vars->scene09_balls.pHead)
+ g_vars->scene09_balls.pHead->p0->p1 = 0;
+ else
+ g_vars->scene09_balls.field_8 = 0;
+
+ g_vars->scene09_balls.init(&b);
+ }
+
+ g_vars->scene09_hangers.clear();
+ g_vars->scene09_numMovingHangers = 4;
+
+ StaticANIObject *hanger = sc->getStaticANIObject1ById(ANI_VISUNCHIK, -1);
+ Hanger *hng = new Hanger;
+
+ hng->ani = hanger;
+ hng->phase = 0;
+ hng->field_4 = 0;
+ hng->field_8 = 0;
+
+ g_vars->scene09_hangers.push_back(hng);
+
+ int x = 75;
+
+ for (int i = 1; x < 300; i++, x += 75) {
+ StaticANIObject *ani = new StaticANIObject(hanger);
+
+ ani->show1(x + hanger->_ox, hanger->_oy, MV_VSN_CYCLE2, 0);
+ sc->addStaticANIObject(hanger, 1);
+
+ hng = new Hanger;
+
+ hng->ani = ani;
+ hng->phase = 0;
+ hng->field_4 = 0;
+ hng->field_8 = 0;
+
+ g_vars->scene09_hangers.push_back(hng);
+ }
+
+ while (g_vars->scene09_flyingBalls.numBalls) {
+ Ball *ohead = g_vars->scene09_flyingBalls.pHead;
+
+ g_vars->scene09_flyingBalls.pHead = g_vars->scene09_flyingBalls.pHead->p0;
+
+ if (g_vars->scene09_flyingBalls.pHead)
+ ohead->p0->p1 = 0;
+ else
+ g_vars->scene09_flyingBalls.field_8 = 0;
+
+ ohead->p0 = g_vars->scene09_flyingBalls.pTail;
+
+ g_vars->scene09_flyingBalls.pTail = ohead;
+
+ g_vars->scene09_flyingBalls.numBalls--;
+ }
+
+ g_vars->scene09_flyingBalls.reset();
+
+ Ball *b9 = g_vars->scene09_flyingBalls.sub04(g_vars->scene09_flyingBalls.field_8, 0);
+
+ b9->ani = sc->getStaticANIObject1ById(ANI_BALL9, -1);
+ b9->ani->setAlpha(0xc8);
+
+ if (g_vars->scene09_flyingBalls.field_8) {
+ g_vars->scene09_flyingBalls.field_8->p0 = b9;
+ g_vars->scene09_flyingBalls.field_8 = b9;
+ } else {
+ g_vars->scene09_flyingBalls.pHead = b9;
+ g_vars->scene09_flyingBalls.field_8 = b9;
+ }
+
+ for (int i = 0; i < 4; i++) {
+ StaticANIObject *newball = new StaticANIObject(b9->ani);
+
+ newball->setAlpha(0xc8);
+
+ Ball *runPtr = g_vars->scene09_flyingBalls.pTail;
+ Ball *lastP = g_vars->scene09_flyingBalls.field_8;
+
+ if (!g_vars->scene09_flyingBalls.pTail) {
+ g_vars->scene09_flyingBalls.cPlex = (byte *)calloc(g_vars->scene09_flyingBalls.cPlexLen, sizeof(Ball));
+
+ byte *p1 = g_vars->scene09_flyingBalls.cPlex + (g_vars->scene09_flyingBalls.cPlexLen - 1) * sizeof(Ball);
+
+ if (g_vars->scene09_flyingBalls.cPlexLen - 1 < 0) {
+ runPtr = g_vars->scene09_flyingBalls.pTail;
+ } else {
+ runPtr = g_vars->scene09_flyingBalls.pTail;
+
+ for (int j = 0; j < g_vars->scene09_flyingBalls.cPlexLen; j++) {
+ ((Ball *)p1)->p1 = runPtr;
+ runPtr = (Ball *)p1;
+
+ p1 -= sizeof(Ball);
+ }
+
+ g_vars->scene09_flyingBalls.pTail = runPtr;
+ }
+ }
+
+ g_vars->scene09_flyingBalls.pTail = runPtr->p0;
+ runPtr->p1 = lastP;
+ runPtr->p0 = 0;
+ runPtr->ani = newball;
+
+ g_vars->scene09_flyingBalls.numBalls++;
+
+ if (g_vars->scene09_flyingBalls.field_8)
+ g_vars->scene09_flyingBalls.field_8->p0 = runPtr;
+ else
+ g_vars->scene09_flyingBalls.pHead = runPtr;
+
+ g_vars->scene09_flyingBalls.field_8 = runPtr;
+
+ sc->addStaticANIObject(newball, 1);
+ }
+
+ g_fp->setObjectState(sO_RightStairs_9, g_fp->getObjectEnumState(sO_RightStairs_9, sO_IsClosed));
+
+ GameVar *eggvar = g_fp->getGameLoaderGameVar()->getSubVarByName("OBJSTATES")->getSubVarByName(sO_GulpedEggs);
+
+ g_vars->swallowedEgg1 = eggvar->getSubVarByName(sO_Egg1);
+ g_vars->swallowedEgg2 = eggvar->getSubVarByName(sO_Egg2);
+ g_vars->swallowedEgg3 = eggvar->getSubVarByName(sO_Egg3);
+
+ scene09_setupGrit(sc);
+
+ g_fp->initArcadeKeys("SC_9");
+
+ g_fp->lift_setButton(sO_Level1, ST_LBN_1N);
+
+ g_fp->setArcadeOverlay(PIC_CSR_ARCADE4);
+}
+
+int sceneHandler09_updateScreenCallback() {
+ int res = g_fp->drawArcadeOverlay(g_fp->_objectIdAtCursor == ANI_VISUNCHIK || g_vars->scene09_interactingHanger >= 0);
+
+ if (!res)
+ g_fp->_updateScreenCallback = 0;
+
+ return res;
+}
+
+int scene09_updateCursor() {
+ g_fp->updateCursorCommon();
+
+ if (g_vars->scene09_interactingHanger < 0) {
+ if (g_fp->_objectIdAtCursor == ANI_VISUNCHIK) {
+ if (g_fp->_cursorId == PIC_CSR_ITN)
+ g_fp->_updateScreenCallback = sceneHandler09_updateScreenCallback;
+ } else {
+ if (g_fp->_objectIdAtCursor == PIC_SC9_LADDER_R && g_fp->_cursorId == PIC_CSR_ITN)
+ g_fp->_cursorId = (g_vars->scene09_dudeY < 350) ? PIC_CSR_GOD : PIC_CSR_GOU;
+ }
+ } else {
+ g_fp->_cursorId = PIC_CSR_ITN;
+ }
+
+ return g_fp->_cursorId;
+}
+
+void sceneHandler09_winArcade() {
+ if (g_vars->scene09_gulper->_flags & 4) {
+ g_vars->scene09_gulper->changeStatics2(ST_GLT_SIT);
+ g_vars->scene09_gulper->startAnim(MV_GLT_FLYAWAY, 0, -1);
+
+ g_fp->setObjectState(sO_Jug, g_fp->getObjectEnumState(sO_Jug, sO_Unblocked));
+ g_fp->setObjectState(sO_RightStairs_9, g_fp->getObjectEnumState(sO_RightStairs_9, sO_IsOpened));
+
+ g_vars->scene09_gulperIsPresent = false;
+ }
+}
+
+void sceneHandler09_startAuntie() {
+ MessageQueue *mq = new MessageQueue(g_fp->_currentScene->getMessageQueueById(QU_TTA9_GOL), 0, 1);
+
+ mq->getExCommandByIndex(0)->_x = g_fp->_sceneRect.right + 30;
+ mq->chain(0);
+}
+
+void sceneHandler09_spitterClick() {
+ if (g_vars->scene09_spitter->_flags & 4) {
+ PicAniInfo info;
+
+ g_vars->scene09_spitter->getPicAniInfo(&info);
+ g_vars->scene09_spitter->_messageQueueId = 0;
+ g_vars->scene09_spitter->changeStatics2(ST_PLV_SIT);
+
+ int x = g_vars->scene09_spitter->_ox - 10;
+ int y = g_vars->scene09_spitter->_oy + 145;
+
+ g_vars->scene09_spitter->setPicAniInfo(&info);
+
+ if (ABS(x - g_fp->_aniMan->_ox) > 1 || ABS(y - g_fp->_aniMan->_oy) > 1) {
+ MessageQueue *mq = getCurrSceneSc2MotionController()->method34(g_fp->_aniMan, x, y, 1, ST_MAN_UP);
+
+ if (mq) {
+ ExCommand *ex = new ExCommand(0, 17, MSG_SC9_PLVCLICK, 0, 0, 0, 1, 0, 0, 0);
+ ex->_excFlags = 2;
+ mq->addExCommandToEnd(ex);
+
+ postExCommand(g_fp->_aniMan->_id, 2, x, y, 0, -1);
+ }
+ } else {
+ if (!g_fp->_aniMan->_movement) {
+ g_vars->scene09_spitter->changeStatics2(ST_PLV_SIT);
+ g_vars->scene09_spitter->hide();
+
+ g_fp->_aniMan->startAnim(MV_MAN9_SHOOT, 0, -1);
+
+ g_fp->stopAllSoundInstances(SND_9_006);
+ }
+
+ g_fp->_aniMan2 = 0;
+
+ if (g_fp->_sceneRect.left < 800)
+ g_fp->_currentScene->_x = 800 - g_fp->_sceneRect.left;
+ }
+ }
+}
+
+void sceneHandler09_eatBall() {
+ if (g_vars->scene09_flyingBall) {
+ g_vars->scene09_flyingBall->hide();
+
+ Ball *ball = g_vars->scene09_balls.pHead;
+
+ if (ball) {
+ while (ball && ball->ani != g_vars->scene09_flyingBall)
+ ball = ball->p0;
+
+ if (ball) {
+ if (ball == g_vars->scene09_balls.pHead)
+ g_vars->scene09_balls.pHead = ball->p0;
+ else
+ ball->p1->p0 = ball->p0;
+
+ if (ball == g_vars->scene09_balls.field_8)
+ g_vars->scene09_balls.field_8 = ball->p1;
+ else
+ ball->p0->p1 = ball->p1;
+
+ ball->p0 = g_vars->scene09_balls.pTail;
+ g_vars->scene09_balls.pTail = ball;
+
+ g_vars->scene09_balls.numBalls--;
+
+ if (!g_vars->scene09_balls.numBalls)
+ g_vars->scene09_balls.reset();
+ }
+ }
+
+ ball = g_vars->scene09_flyingBalls.sub04(g_vars->scene09_flyingBalls.field_8, 0);
+ ball->ani = g_vars->scene09_flyingBall;
+
+ if (g_vars->scene09_flyingBalls.field_8)
+ g_vars->scene09_flyingBalls.field_8->p0 = ball;
+ else
+ g_vars->scene09_flyingBalls.pHead = ball;
+
+ g_vars->scene09_flyingBalls.field_8 = ball;
+
+ g_vars->scene09_flyingBall = 0;
+ g_vars->scene09_numSwallenBalls++;
+
+ if (g_vars->scene09_numSwallenBalls >= 3) {
+ MessageQueue *mq = g_vars->scene09_gulper->getMessageQueue();
+
+ if (mq) {
+ ExCommand *ex = new ExCommand(ANI_GLOTATEL, 1, MV_GLT_FLYAWAY, 0, 0, 0, 1, 0, 0, 0);
+ ex->_excFlags |= 2;
+
+ mq->addExCommandToEnd(ex);
+ }
+
+ g_fp->setObjectState(sO_Jug, g_fp->getObjectEnumState(sO_Jug, sO_Unblocked));
+ g_fp->setObjectState(sO_RightStairs_9, g_fp->getObjectEnumState(sO_RightStairs_9, sO_IsOpened));
+
+ g_vars->scene09_gulperIsPresent = false;
+ }
+ }
+}
+
+void sceneHandler09_showBall() {
+ if (g_vars->scene09_flyingBalls.numBalls) {
+ StaticANIObject *ani = g_vars->scene09_flyingBalls.pHead->ani;
+ Ball *ph = g_vars->scene09_flyingBalls.pHead;
+ g_vars->scene09_flyingBalls.pHead = ph->p0;
+
+ if (g_vars->scene09_flyingBalls.pHead)
+ ph->p0->p1 = 0;
+ else
+ g_vars->scene09_flyingBalls.field_8 = 0;
+
+ ph->p0 = g_vars->scene09_flyingBalls.pTail;
+
+ g_vars->scene09_flyingBalls.pTail = ph;
+ g_vars->scene09_flyingBalls.numBalls--;
+
+ if (!g_vars->scene09_flyingBalls.numBalls) {
+ g_vars->scene09_flyingBalls.numBalls = 0;
+ g_vars->scene09_flyingBalls.pTail = 0;
+ g_vars->scene09_flyingBalls.field_8 = 0;
+ g_vars->scene09_flyingBalls.pHead = 0;
+
+ free(g_vars->scene09_flyingBalls.cPlex);
+ g_vars->scene09_flyingBalls.cPlex = 0;
+ }
+
+ Ball *ball = g_vars->scene09_balls.sub04(g_vars->scene09_balls.field_8, 0);
+ ball->ani = ani;
+
+ if (g_vars->scene09_balls.field_8)
+ g_vars->scene09_balls.field_8->p0 = ball;
+ else
+ g_vars->scene09_balls.pHead = ball;
+
+ g_vars->scene09_balls.field_8 = ball;
+
+ ani->show1(g_fp->_aniMan->_ox + 94, g_fp->_aniMan->_oy - 162, MV_BALL9_EXPLODE, 0);
+ }
+}
+
+void sceneHandler09_cycleHangers() {
+ for (int i = 0; i < g_vars->scene09_numMovingHangers; i++) {
+ Movement *mov = g_vars->scene09_hangers[i]->ani->_movement;
+
+ if (mov && mov->_id == MV_VSN_CYCLE2) {
+ int idx;
+
+ if (g_vars->scene09_hangers[i]->phase >= 0)
+ idx = 18 - g_vars->scene09_hangers[i]->phase / 5;
+ else
+ idx = 18 - g_vars->scene09_hangers[i]->phase * 10 / 43;
+
+ if (idx > 38)
+ idx = 38;
+
+ if (idx < 1)
+ idx = 1;
+
+ mov->setDynamicPhaseIndex(idx);
+ }
+ }
+}
+
+void sceneHandler09_limitHangerPhase() {
+ for (int i = 0; i < g_vars->scene09_numMovingHangers; i++) {
+ if (i != g_vars->scene09_interactingHanger) {
+ g_vars->scene09_hangers[i]->phase += g_vars->scene09_hangers[i]->field_8;
+
+ if (g_vars->scene09_hangers[i]->phase > 85)
+ g_vars->scene09_hangers[i]->phase = 85;
+
+ if (g_vars->scene09_hangers[i]->phase < -85)
+ g_vars->scene09_hangers[i]->phase = -85;
+
+ if (g_vars->scene09_hangers[i]->phase < 0)
+ g_vars->scene09_hangers[i]->field_8++;
+
+ if (g_vars->scene09_hangers[i]->phase > 0)
+ g_vars->scene09_hangers[i]->field_8--;
+ }
+ }
+}
+
+void sceneHandler09_collideBall(Ball *ball) {
+ if (g_vars->scene09_gulperIsPresent) {
+ g_vars->scene09_flyingBall = ball->ani;
+
+ if (g_vars->scene09_gulper) {
+ g_vars->scene09_gulper->changeStatics2(ST_GLT_SIT);
+
+ MessageQueue *mq = new MessageQueue(g_fp->_currentScene->getMessageQueueById(QU_SC9_EATBALL), 0, 0);
+
+ mq->setFlags(mq->getFlags() | 1);
+
+ if (!mq->chain(g_vars->scene09_gulper))
+ delete mq;
+ }
+ }
+}
+
+void sceneHandler09_ballExplode(Ball *ball) {
+ if (ball == g_vars->scene09_balls.pHead)
+ g_vars->scene09_balls.pHead = ball->p0;
+ else
+ ball->p1->p0 = ball->p0;
+
+ if (ball == g_vars->scene09_balls.field_8)
+ g_vars->scene09_balls.field_8 = ball->p1;
+ else
+ ball->p0->p1 = ball->p1;
+
+ ball->p0 = g_vars->scene09_balls.pTail;
+
+ g_vars->scene09_balls.pTail = ball;
+ g_vars->scene09_balls.numBalls--;
+
+ if (!g_vars->scene09_balls.numBalls) {
+ g_vars->scene09_balls.pTail = 0;
+ g_vars->scene09_balls.field_8 = 0;
+ g_vars->scene09_balls.pHead = 0;
+ free(g_vars->scene09_balls.cPlex);
+ g_vars->scene09_balls.cPlex = 0;
+ }
+
+ MessageQueue *mq = new MessageQueue(g_fp->_currentScene->getMessageQueueById(QU_SC9_BALLEXPLODE), 0, 1);
+
+ mq->replaceKeyCode(-1, ball->ani->_okeyCode);
+
+ if (!mq->chain(ball->ani))
+ delete mq;
+
+ Ball *runPtr = g_vars->scene09_flyingBalls.pTail;
+ Ball *lastP = g_vars->scene09_flyingBalls.field_8;
+
+ if (!g_vars->scene09_flyingBalls.pTail) {
+ g_vars->scene09_flyingBalls.cPlex = (byte *)calloc(g_vars->scene09_flyingBalls.cPlexLen, sizeof(Ball));
+
+ byte *p1 = g_vars->scene09_flyingBalls.cPlex + (g_vars->scene09_flyingBalls.cPlexLen - 1) * sizeof(Ball);
+
+ if (g_vars->scene09_flyingBalls.cPlexLen - 1 < 0) {
+ runPtr = g_vars->scene09_flyingBalls.pTail;
+ } else {
+ runPtr = g_vars->scene09_flyingBalls.pTail;
+
+ for (int j = 0; j < g_vars->scene09_flyingBalls.cPlexLen; j++) {
+ ((Ball *)p1)->p1 = runPtr;
+ runPtr = (Ball *)p1;
+
+ p1 -= sizeof(Ball);
+ }
+
+ g_vars->scene09_flyingBalls.pTail = runPtr;
+ }
+ }
+
+ g_vars->scene09_flyingBalls.pTail = runPtr->p0;
+ runPtr->p1 = lastP;
+ runPtr->p0 = 0;
+ runPtr->ani = ball->ani;
+
+ g_vars->scene09_flyingBalls.numBalls++;
+
+ if (g_vars->scene09_flyingBalls.field_8) {
+ g_vars->scene09_flyingBalls.field_8->p0 = runPtr;
+ g_vars->scene09_flyingBalls.field_8 = runPtr;
+ } else {
+ g_vars->scene09_flyingBalls.pHead = runPtr;
+ g_vars->scene09_flyingBalls.field_8 = runPtr;
+ }
+}
+
+void sceneHandler09_checkHangerCollide() {
+ for (Ball *ball = g_vars->scene09_balls.pHead; ball; ball = ball->p0) {
+ int newx = ball->ani->_ox + 5;
+
+ ball->ani->setOXY(newx, ball->ani->_oy);
+
+ if (newx <= 1398 || g_vars->scene09_flyingBall) {
+ if (g_vars->scene09_gulperIsPresent)
+ goto LABEL_11;
+ } else if (g_vars->scene09_gulperIsPresent) {
+ sceneHandler09_collideBall(ball);
+ continue;
+ }
+
+ if (newx > 1600) {
+ sceneHandler09_ballExplode(ball);
+ continue;
+ }
+
+ LABEL_11:
+ int pixel;
+
+ for (int i = 0; i < g_vars->scene09_numMovingHangers; i++) {
+ for (int j = 0; j < 4; j++) {
+ g_vars->scene09_hangers[i]->ani->getPixelAtPos(newx + g_vars->scene09_hangerOffsets[j].x, ball->ani->_oy + g_vars->scene09_hangerOffsets[j].y, &pixel);
+
+ if (pixel) {
+ sceneHandler09_ballExplode(ball);
+ break;
+ }
+ }
+ }
+ }
+}
+
+void sceneHandler09_hangerStartCycle() {
+ StaticANIObject *ani = g_vars->scene09_hangers[g_vars->scene09_interactingHanger]->ani;
+
+ if (ani->_movement) {
+ ani->startAnim(MV_VSN_CYCLE2, 0, -1);
+ g_vars->scene09_hangers[g_vars->scene09_interactingHanger]->field_8 = 0;
+ g_vars->scene09_hangers[g_vars->scene09_interactingHanger]->phase = g_vars->scene09_intHangerPhase + (g_fp->_mouseScreenPos.y - g_vars->scene09_clickY) / 2;
+
+ if (g_vars->scene09_intHangerMaxPhase != -1000 && g_vars->scene09_hangers[g_vars->scene09_interactingHanger]->phase != g_vars->scene09_intHangerMaxPhase) {
+ ExCommand *ex = new ExCommand(0, 35, SND_9_019, 0, 0, 0, 1, 0, 0, 0);
+
+ ex->_field_14 = 1;
+ ex->_excFlags |= 2;
+ ex->postMessage();
+
+ g_vars->scene09_intHangerMaxPhase = -1000;
+ }
+ } else {
+ g_vars->scene09_interactingHanger = -1;
+ }
+}
+
+int sceneHandler09(ExCommand *cmd) {
+ if (cmd->_messageKind != 17)
+ return 0;
+
+ switch (cmd->_messageNum) {
+ case MSG_CMN_WINARCADE:
+ sceneHandler09_winArcade();
+ break;
+
+ case MSG_SC9_STARTTIOTIA:
+ sceneHandler09_startAuntie();
+ break;
+
+ case MSG_SC9_FROMLADDER:
+ getCurrSceneSc2MotionController()->setEnabled();
+ getGameLoaderInteractionController()->enableFlag24();
+
+ g_vars->scene09_dudeIsOnLadder = false;
+ break;
+
+ case MSG_SC9_TOLADDER:
+ getCurrSceneSc2MotionController()->clearEnabled();
+ getGameLoaderInteractionController()->disableFlag24();
+
+ g_vars->scene09_dudeIsOnLadder = true;
+ break;
+
+ case MSG_SC9_PLVCLICK:
+ sceneHandler09_spitterClick();
+ break;
+
+ case MSG_SC9_FLOWN:
+ g_vars->scene09_gulperIsPresent = false;
+ break;
+
+ case MSG_SC9_EATBALL:
+ sceneHandler09_eatBall();
+ break;
+
+ case MSG_SC9_SHOWBALL:
+ sceneHandler09_showBall();
+ break;
+
+ case 33:
+ {
+ int res = 0;
+
+ if (g_fp->_aniMan2) {
+ int x = g_fp->_aniMan2->_ox;
+
+ g_vars->scene09_dudeY = g_fp->_aniMan2->_oy;
+
+ if (x < g_fp->_sceneRect.left + 200)
+ g_fp->_currentScene->_x = x - g_fp->_sceneRect.left - 300;
+
+ if (x > g_fp->_sceneRect.right - 200)
+ g_fp->_currentScene->_x = x - g_fp->_sceneRect.right + 300;
+
+ res = 1;
+ } else {
+ if (g_fp->_aniMan->_movement && g_fp->_aniMan->_movement->_id != MV_MAN9_SHOOT)
+ g_fp->_aniMan2 = g_fp->_aniMan;
+ }
+
+ sceneHandler09_cycleHangers();
+ sceneHandler09_limitHangerPhase();
+ sceneHandler09_checkHangerCollide();
+
+ if (g_vars->scene09_interactingHanger >= 0)
+ sceneHandler09_hangerStartCycle();
+
+ g_fp->_behaviorManager->updateBehaviors();
+
+ g_fp->startSceneTrack();
+
+ return res;
+ }
+
+ case 30:
+ if (g_vars->scene09_interactingHanger >= 0) {
+ if (ABS(g_vars->scene09_hangers[g_vars->scene09_interactingHanger]->phase) < 15) {
+ g_vars->scene09_hangers[g_vars->scene09_interactingHanger]->ani->_callback2 = 0;
+ g_vars->scene09_hangers[g_vars->scene09_interactingHanger]->ani->changeStatics2(ST_VSN_NORMAL);
+ }
+ }
+
+ g_vars->scene09_interactingHanger = -1;
+
+ break;
+
+ case 29:
+ {
+ StaticANIObject *ani = g_fp->_currentScene->getStaticANIObjectAtPos(g_fp->_sceneRect.left + cmd->_x, g_fp->_sceneRect.top + cmd->_y);
+
+ if (ani) {
+ if (ani->_id == ANI_PLEVATEL) {
+ sceneHandler09_spitterClick();
+ break;
+ }
+
+ if (ani->_id == ANI_VISUNCHIK) {
+ if (g_vars->scene09_numMovingHangers > 0) {
+ int hng = 0;
+
+ while (g_vars->scene09_hangers[hng]->ani != ani) {
+ ++hng;
+
+ if (hng >= g_vars->scene09_numMovingHangers)
+ break;
+ }
+
+ g_vars->scene09_interactingHanger = hng;
+ g_vars->scene09_intHangerPhase = g_vars->scene09_hangers[hng]->phase;
+ g_vars->scene09_intHangerMaxPhase = g_vars->scene09_hangers[hng]->phase;
+
+ g_vars->scene09_clickY = cmd->_y;
+
+ if (!g_vars->scene09_hangers[hng]->ani->_movement || g_vars->scene09_hangers[hng]->ani->_movement->_id != MV_VSN_CYCLE2) {
+ g_vars->scene09_hangers[hng]->ani->changeStatics2(ST_VSN_NORMAL);
+ g_vars->scene09_hangers[hng]->ani->startAnim(MV_VSN_CYCLE2, 0, -1);
+ g_vars->scene09_hangers[hng]->ani->_callback2 = 0;
+ }
+
+ ExCommand *ex = new ExCommand(0, 35, SND_9_018, 0, 0, 0, 1, 0, 0, 0);
+
+ ex->_field_14 = 1;
+ ex->_excFlags |= 2;
+ ex->postMessage();
+ }
+
+ break;
+ }
+ }
+
+ if (g_vars->scene09_dudeIsOnLadder && g_fp->_currentScene->getPictureObjectIdAtPos(cmd->_sceneClickX, cmd->_sceneClickY) == PIC_SC9_LADDER_R
+ && !cmd->_keyCode && !g_fp->_aniMan->_movement) {
+ handleObjectInteraction(g_fp->_aniMan, g_fp->_currentScene->getPictureObjectById(PIC_SC9_LADDER_R, 0), 0);
+ }
+
+ if (!ani || !canInteractAny(g_fp->_aniMan, ani, cmd->_keyCode)) {
+ int picId = g_fp->_currentScene->getPictureObjectIdAtPos(cmd->_sceneClickX, cmd->_sceneClickY);
+ PictureObject *pic = g_fp->_currentScene->getPictureObjectById(picId, 0);
+
+ if (!pic || !canInteractAny(g_fp->_aniMan, pic, cmd->_keyCode)) {
+ if ((g_fp->_sceneRect.right - cmd->_sceneClickX < 47 && g_fp->_sceneRect.right < g_fp->_sceneWidth - 1) || (cmd->_sceneClickX - g_fp->_sceneRect.left < 47 && g_fp->_sceneRect.left > 0))
+ g_fp->processArcade(cmd);
+ }
+ }
+
+ break;
+ }
+ }
+
+ return 0;
+}
+
+} // End of namespace Fullpipe
diff --git a/engines/fullpipe/scenes/scene10.cpp b/engines/fullpipe/scenes/scene10.cpp
new file mode 100644
index 0000000000..8c9e0b67d0
--- /dev/null
+++ b/engines/fullpipe/scenes/scene10.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 "fullpipe/fullpipe.h"
+
+#include "fullpipe/objectnames.h"
+#include "fullpipe/constants.h"
+
+#include "fullpipe/gameloader.h"
+#include "fullpipe/motion.h"
+#include "fullpipe/scenes.h"
+#include "fullpipe/statics.h"
+
+#include "fullpipe/behavior.h"
+#include "fullpipe/interaction.h"
+
+namespace Fullpipe {
+
+void scene10_initScene(Scene *sc) {
+ g_vars->scene10_gum = sc->getStaticANIObject1ById(ANI_GUM, -1);
+ g_vars->scene10_packet = sc->getStaticANIObject1ById(ANI_PACHKA, -1);
+ g_vars->scene10_packet2 = sc->getStaticANIObject1ById(ANI_PACHKA2, -1);
+ g_vars->scene10_inflater = sc->getStaticANIObject1ById(ANI_NADUVATEL, -1);
+ g_vars->scene10_ladder = sc->getPictureObjectById(PIC_SC10_LADDER, 0);
+
+ g_fp->lift_setButton(sO_Level1, ST_LBN_1N);
+ g_fp->lift_init(sc, QU_SC10_ENTERLIFT, QU_SC10_EXITLIFT);
+
+ if (g_fp->getObjectState(sO_Inflater) == g_fp->getObjectEnumState(sO_Inflater, sO_WithGum)) {
+ g_vars->scene10_hasGum = 1;
+ } else {
+ g_vars->scene10_hasGum = 0;
+ g_vars->scene10_gum->hide();
+ }
+}
+
+bool sceneHandler10_inflaterIsBlind() {
+ return g_vars->scene10_inflater->_movement
+ && g_vars->scene10_inflater->_movement->_id == MV_NDV_BLOW2
+ && g_vars->scene10_inflater->_movement->_currDynamicPhaseIndex < 42;
+}
+
+int scene10_updateCursor() {
+ g_fp->updateCursorCommon();
+
+ if (g_fp->_objectIdAtCursor == ANI_PACHKA || g_fp->_objectIdAtCursor == ANI_GUM) {
+ if (g_fp->_cursorId == PIC_CSR_ITN) {
+ if (g_vars->scene10_hasGum)
+ g_fp->_cursorId = (sceneHandler10_inflaterIsBlind() != 0) ? PIC_CSR_ITN_RED : PIC_CSR_ITN_GREEN;
+ else
+ g_fp->_cursorId = PIC_CSR_DEFAULT;
+ }
+ }
+
+ return g_fp->_cursorId;
+}
+
+void sceneHandler10_clickGum() {
+ if (g_vars->scene10_hasGum) {
+ if (sceneHandler10_inflaterIsBlind()) {
+ if (g_vars->scene10_hasGum) {
+ int x = g_vars->scene10_gum->_ox - 139;
+ int y = g_vars->scene10_gum->_oy - 48;
+
+ if (abs(x - g_fp->_aniMan->_ox) > 1 || abs(y - g_fp->_aniMan->_oy) > 1) {
+ MessageQueue *mq = getCurrSceneSc2MotionController()->method34(g_fp->_aniMan, x, y, 1, ST_MAN_RIGHT);
+ if (mq) {
+ ExCommand *ex = new ExCommand(0, 17, MSG_SC10_CLICKGUM, 0, 0, 0, 1, 0, 0, 0);
+ ex->_excFlags = 2;
+ mq->addExCommandToEnd(ex);
+
+ postExCommand(g_fp->_aniMan->_id, 2, x, y, 0, -1);
+ }
+ } else {
+ g_vars->scene10_hasGum = 0;
+
+ chainQueue(QU_SC10_TAKEGUM, 1);
+ }
+ }
+ } else {
+ g_vars->scene10_inflater->changeStatics2(ST_NDV_SIT);
+
+ if (g_fp->getObjectState(sO_Inflater) == g_fp->getObjectEnumState(sO_Inflater, sO_WithGum))
+ g_vars->scene10_inflater->startAnim(MV_NDV_DENIES, 0, -1);
+ else
+ g_vars->scene10_inflater->startAnim(MV_NDV_DENY_NOGUM, 0, -1);
+ }
+ }
+}
+
+void sceneHandler10_hideGum() {
+ g_vars->scene10_gum->hide();
+ g_vars->scene10_packet->hide();
+ g_vars->scene10_packet2->hide();
+}
+
+void sceneHandler10_showGum() {
+ if (g_vars->scene10_hasGum)
+ g_vars->scene10_gum->show1(-1, -1, -1, 0);
+
+ g_vars->scene10_packet->show1(-1, -1, -1, 0);
+ g_vars->scene10_packet2->show1(-1, -1, -1, 0);
+}
+
+
+int sceneHandler10(ExCommand *ex) {
+ if (ex->_messageKind != 17)
+ return 0;
+
+ switch(ex->_messageNum) {
+ case MSG_LIFT_CLOSEDOOR:
+ g_fp->lift_closedoorSeq();
+ break;
+
+ case MSG_LIFT_EXITLIFT:
+ g_fp->lift_exitSeq(ex);
+ break;
+
+ case MSG_LIFT_STARTEXITQUEUE:
+ g_fp->lift_startExitQueue();
+ break;
+
+ case MSG_LIFT_CLICKBUTTON:
+ g_fp->lift_clickButton();
+ break;
+
+ case MSG_SC10_LADDERTOBACK:
+ g_vars->scene10_ladder->_priority = 49;
+ break;
+
+ case MSG_SC10_LADDERTOFORE:
+ g_vars->scene10_ladder->_priority = 0;
+ break;
+
+ case MSG_LIFT_GO:
+ g_fp->lift_goAnimation();
+ break;
+
+ case MSG_SC10_CLICKGUM:
+ sceneHandler10_clickGum();
+
+ ex->_messageKind = 0;
+ break;
+
+ case MSG_SC10_HIDEGUM:
+ sceneHandler10_hideGum();
+ break;
+
+ case MSG_SC10_SHOWGUM:
+ sceneHandler10_showGum();
+ break;
+
+ case 64:
+ g_fp->lift_hoverButton(ex);
+ break;
+
+ case 29:
+ {
+ if (g_fp->_currentScene->getPictureObjectIdAtPos(ex->_sceneClickX, ex->_sceneClickY) == PIC_SC10_LADDER) {
+ handleObjectInteraction(g_fp->_aniMan, g_fp->_currentScene->getPictureObjectById(PIC_SC10_DTRUBA, 0), ex->_keyCode);
+ ex->_messageKind = 0;
+
+ return 0;
+ }
+
+ StaticANIObject *ani = g_fp->_currentScene->getStaticANIObjectAtPos(ex->_sceneClickX, ex->_sceneClickY);
+
+ if (ani && ani->_id == ANI_LIFTBUTTON) {
+ g_fp->lift_animateButton(ani);
+ ex->_messageKind = 0;
+
+ return 0;
+ }
+ }
+ break;
+
+ case 33:
+ {
+ int res = 0;
+
+ if (g_fp->_aniMan2) {
+ if (g_fp->_aniMan2->_ox < g_fp->_sceneRect.left + 200)
+ g_fp->_currentScene->_x = g_fp->_aniMan2->_ox - g_fp->_sceneRect.left - 300;
+
+ if (g_fp->_aniMan2->_ox > g_fp->_sceneRect.right - 200)
+ g_fp->_currentScene->_x = g_fp->_aniMan2->_ox - g_fp->_sceneRect.right + 300;
+
+ res = 1;
+ }
+
+ g_fp->_behaviorManager->updateBehaviors();
+ g_fp->startSceneTrack();
+
+ return res;
+ }
+ }
+
+ return 0;
+}
+
+} // End of namespace Fullpipe
diff --git a/engines/fullpipe/scenes/scene11.cpp b/engines/fullpipe/scenes/scene11.cpp
new file mode 100644
index 0000000000..0ce82f5d5f
--- /dev/null
+++ b/engines/fullpipe/scenes/scene11.cpp
@@ -0,0 +1,786 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public 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 "fullpipe/fullpipe.h"
+
+#include "fullpipe/objectnames.h"
+#include "fullpipe/constants.h"
+
+#include "fullpipe/gameloader.h"
+#include "fullpipe/motion.h"
+#include "fullpipe/scenes.h"
+#include "fullpipe/statics.h"
+
+#include "fullpipe/interaction.h"
+#include "fullpipe/behavior.h"
+
+
+namespace Fullpipe {
+
+void scene11_dudeSwingCallback(int *arg) {
+ int oldarg = *arg;
+
+ *arg = 45 - (int)(g_vars->scene11_swingAngle * -29.66666666666666);
+
+ if (*arg < 1)
+ *arg = 1;
+
+ if (*arg > 90)
+ *arg = 90;
+
+ g_vars->scene11_swingAngleDiff = (g_vars->scene11_swingAngle - g_vars->scene11_swingOldAngle) * -490.0000000000001;
+ g_vars->scene11_swingSpeed = g_vars->scene11_swingAngleDiff * 0.0042 + g_vars->scene11_swingSpeed - g_vars->scene11_swingInertia * (g_vars->scene11_swingAngleDiff * 0.0042 + g_vars->scene11_swingSpeed);
+ g_vars->scene11_swingAngle = g_vars->scene11_swingSpeed * 0.0042 + g_vars->scene11_swingAngle;
+
+ if (g_vars->scene11_swingAngle < -1.5) {
+ g_vars->scene11_swingAngle = -1.5; //1.0004882812500000;
+ g_vars->scene11_swingSpeed = 0.0;
+ g_vars->scene11_swingAngleDiff = 0.0;
+ }
+
+ if (g_vars->scene11_swingAngle > 1.5) {
+ g_vars->scene11_swingAngle = 1.5; //1.9990234375;
+ g_vars->scene11_swingSpeed = 0.0;
+ g_vars->scene11_swingAngleDiff = 0.0;
+ }
+
+ if (g_vars->scene11_swingMaxAngle == *arg && 0.0 != g_vars->scene11_swingSpeed && fabs(g_vars->scene11_swingSpeed) < 2.5) {
+ g_vars->scene11_swingSpeed = 0.0;
+ g_vars->scene11_swingAngleDiff = 0.0;
+ g_vars->scene11_swingAngle = g_vars->scene11_swingOldAngle;
+ }
+
+ g_vars->scene11_swingCounter++;
+
+ if (g_vars->scene11_arcadeIsOn) {
+ if (g_vars->scene11_hintCounter <= 720) {
+ g_vars->scene11_hintCounter++;
+
+ if (g_vars->scene11_hintCounter == 720)
+ g_vars->scene11_hint->_flags |= 4;
+ }
+ }
+
+ if ((oldarg >= 45) != (*arg >= 45) && g_vars->scene11_arcadeIsOn) {
+ if (oldarg >= *arg)
+ g_fp->playSound(SND_11_031, 0);
+ else
+ g_fp->playSound(SND_11_020, 0);
+ }
+}
+
+void scene11_setupMusic() {
+ if (g_fp->getObjectState(sO_DudeHasJumped) == g_fp->getObjectEnumState(sO_DudeHasJumped, sO_Yes))
+ g_fp->playTrack(g_fp->getGameLoaderGameVar()->getSubVarByName("SC_11"), "MUSIC2", 1);
+}
+
+void scene11_initScene(Scene *sc) {
+ g_vars->scene11_swingie = sc->getStaticANIObject1ById(ANI_SWINGER, -1);
+ g_vars->scene11_boots = sc->getStaticANIObject1ById(ANI_BOOTS_11, -1);
+ g_vars->scene11_mgm.clear();
+ g_vars->scene11_dudeOnSwing = sc->getStaticANIObject1ById(ANI_MAN11, -1);
+ g_vars->scene11_dudeOnSwing->_callback2 = scene11_dudeSwingCallback;
+ g_vars->scene11_dudeOnSwing = sc->getStaticANIObject1ById(ANI_KACHELI, -1);
+ g_vars->scene11_dudeOnSwing->_callback2 = scene11_dudeSwingCallback;
+ g_vars->scene11_hint = sc->getPictureObjectById(PIC_SC11_HINT, 0);
+ g_vars->scene11_hint->_flags &= 0xFFFB;
+
+ g_vars->scene11_arcadeIsOn = false;
+ g_vars->scene11_scrollIsEnabled = false;
+ g_vars->scene11_scrollIsMaximized = false;
+ g_vars->scene11_hintCounter = 0;
+ g_vars->scene11_swingieScreenEdge = 0;
+ g_vars->scene11_crySound = 0;
+ g_vars->scene11_swingAngle = 0.0;
+ g_vars->scene11_swingOldAngle = 0.0;
+ g_vars->scene11_swingSpeed = 0.0;
+ g_vars->scene11_swingAngleDiff = 0.0;
+ g_vars->scene11_swingInertia = 1.28; //1.9849218750000000;
+ g_vars->scene11_swingCounter = 0;
+ g_vars->scene11_swingCounterPrevTurn = 0;
+ g_vars->scene11_swingDirection = 0;
+ g_vars->scene11_swingDirectionPrevTurn = 0;
+
+ Scene *oldsc = g_fp->_currentScene;
+
+ g_fp->_currentScene = sc;
+
+ int swingie = g_fp->getObjectState(sO_Swingie);
+
+ if (swingie == g_fp->getObjectEnumState(sO_Swingie, sO_IsSwinging)
+ || swingie == g_fp->getObjectEnumState(sO_Swingie, sO_IsSwingingWithBoot)) {
+ g_vars->scene11_swingIsSwinging = true;
+ g_vars->scene11_swingieStands = false;
+
+ getCurrSceneSc2MotionController()->enableLinks(sO_CloseThing1, 1);
+ getCurrSceneSc2MotionController()->enableLinks(sO_CloseThing2, 1);
+ getCurrSceneSc2MotionController()->enableLinks(sO_CloseThing3, 0);
+
+ ((MctlCompound *)getCurrSceneSc2MotionController())->replaceNodeX(805, 905);
+
+ getSc2MctlCompoundBySceneId(sc->_sceneId)->replaceNodeX(303, 353);
+ } else if (swingie == g_fp->getObjectEnumState(sO_Swingie, sO_IsStandingInBoots)
+ || swingie == g_fp->getObjectEnumState(sO_Swingie, sO_IsStandingInCorner)) {
+ g_vars->scene11_swingIsSwinging = false;
+ g_vars->scene11_swingieStands = true;
+
+ g_vars->scene11_swingie->changeStatics2(ST_SWR_STAND3);
+
+ getCurrSceneSc2MotionController()->enableLinks(sO_CloseThing1, 0);
+ getCurrSceneSc2MotionController()->enableLinks(sO_CloseThing2, 1);
+ getCurrSceneSc2MotionController()->enableLinks(sO_CloseThing3, 0);
+
+ ((MctlCompound *)getCurrSceneSc2MotionController())->replaceNodeX(905, 805);
+ } else {
+ g_vars->scene11_swingIsSwinging = false;
+ g_vars->scene11_swingieStands = false;
+
+ if (swingie == g_fp->getObjectEnumState(sO_Swingie, sO_IsSitting)) {
+ g_vars->scene11_swingie->_movement = 0;
+ g_vars->scene11_swingie->_statics = g_vars->scene11_swingie->getStaticsById(ST_SWR_SIT);
+ g_vars->scene11_swingie->setOXY(144, 389);
+
+ getCurrSceneSc2MotionController()->enableLinks(sO_CloseThing1, 0);
+ getCurrSceneSc2MotionController()->enableLinks(sO_CloseThing2, 0);
+ getCurrSceneSc2MotionController()->enableLinks(sO_CloseThing3, 1);
+ } else {
+ g_vars->scene11_swingie->_movement = 0;
+ g_vars->scene11_swingie->_statics = g_vars->scene11_swingie->getStaticsById(ST_SWR_SITBALD);
+ g_vars->scene11_swingie->setOXY(144, 415);
+
+ getCurrSceneSc2MotionController()->enableLinks(sO_CloseThing1, 0);
+ getCurrSceneSc2MotionController()->enableLinks(sO_CloseThing2, 0);
+ getCurrSceneSc2MotionController()->enableLinks(sO_CloseThing3, 1);
+ }
+ }
+
+ if (!g_vars->scene11_swingIsSwinging) {
+ g_vars->scene11_dudeOnSwing->changeStatics2(ST_KCH_STATIC);
+ g_vars->scene11_dudeOnSwing->setOXY(691, 371);
+ g_vars->scene11_dudeOnSwing->_priority = 20;
+
+ g_vars->scene11_dudeOnSwing->_flags |= 4;
+ }
+
+ g_fp->_currentScene = oldsc;
+
+ g_fp->initArcadeKeys("SC_11");
+ g_fp->setArcadeOverlay(PIC_CSR_ARCADE5);
+}
+
+void sceneHandler11_restartMan() {
+ chainObjQueue(0, QU_SC11_RESTARTMAN, 1);
+
+ getGameLoaderInteractionController()->enableFlag24();
+ getCurrSceneSc2MotionController()->setEnabled();
+
+ g_vars->scene11_scrollIsEnabled = false;
+}
+
+void sceneHandler11_hitMan() {
+ if (g_fp->_aniMan->_ox > 345 && g_fp->_aniMan->_ox < 355) {
+ g_fp->_aniMan->changeStatics2(ST_MAN_RIGHT);
+
+ MessageQueue *mq = new MessageQueue(g_fp->_currentScene->getMessageQueueById(QU_SC11_MANFALL), 0, 0);
+
+ mq->setFlags(mq->getFlags() | 1);
+ if (!mq->chain(g_fp->_aniMan))
+ delete mq;
+
+ getCurrSceneSc2MotionController()->replaceNodeX(353, 303);
+ }
+}
+
+int scene11_updateCursor() {
+ g_fp->updateCursorCommon();
+
+ if (g_vars->scene11_arcadeIsOn) {
+ if (g_fp->_cursorId != PIC_CSR_DEFAULT_INV && g_fp->_cursorId != PIC_CSR_ITN_INV)
+ g_fp->_cursorId = -1;
+ } else if (g_vars->scene11_swingie == g_fp->_objectAtCursor && g_fp->_inventory->getSelectedItemId() == ANI_INV_BOOT)
+ g_fp->_cursorId = PIC_CSR_ITN_INV;
+
+ return g_fp->_cursorId;
+}
+
+int sceneHandler11_updateScreenCallback() {
+ int res = g_fp->drawArcadeOverlay(g_vars->scene11_arcadeIsOn);
+
+ if (!res)
+ g_fp->_updateScreenCallback = 0;
+
+ return res;
+}
+
+void sceneHandler11_manToSwing() {
+ g_vars->scene11_arcadeIsOn = true;
+
+ getCurrSceneSc2MotionController()->clearEnabled();
+ getGameLoaderInteractionController()->disableFlag24();
+
+ g_fp->_aniMan2->hide();
+
+ g_vars->scene11_swingCounter = 0;
+ g_vars->scene11_swingInertia = 1.28; //1.9849218;
+
+ g_vars->scene11_dudeOnSwing->_flags &= 0xFFFB;
+ g_vars->scene11_dudeOnSwing = g_fp->_currentScene->getStaticANIObject1ById(ANI_MAN11, -1);
+ g_vars->scene11_dudeOnSwing->_statics = g_vars->scene11_dudeOnSwing->getStaticsById(ST_MAN11_EMPTY);
+ g_vars->scene11_dudeOnSwing->_movement = 0;
+ g_vars->scene11_dudeOnSwing->show1(690, 215, MV_MAN11_SWING_0, 0);
+ g_vars->scene11_dudeOnSwing->_priority = 20;
+ g_vars->scene11_dudeOnSwing->startAnim(MV_MAN11_SWING_0, 0, -1);
+ g_vars->scene11_dudeOnSwing->_movement->setDynamicPhaseIndex(45);
+
+ g_vars->scene11_mgm.addItem(g_fp->_aniMan->_id);
+
+ g_fp->_currentScene->_x = 1400 - g_fp->_sceneRect.right;
+
+ g_vars->scene11_scrollIsEnabled = true;
+ g_fp->_updateScreenCallback = sceneHandler11_updateScreenCallback;
+}
+
+void sceneHandler11_putABoot() {
+ if (g_vars->scene11_boots->_flags & 4) {
+ if (g_vars->scene11_boots->_statics->_staticsId == ST_BTS11_ONE)
+ chainObjQueue(0, QU_SC11_PUTBOOT2, 1);
+ } else {
+ chainObjQueue(0, QU_SC11_PUTBOOT1, 1);
+ }
+}
+
+void sceneHandler11_putBoot() {
+ if (abs(353 - g_fp->_aniMan->_ox) > 1 || abs(498 - g_fp->_aniMan->_oy) > 1
+ || g_fp->_aniMan->_movement || g_fp->_aniMan->_statics->_staticsId != ST_MAN_RIGHT) {
+ MessageQueue *mq = getCurrSceneSc2MotionController()->method34(g_fp->_aniMan, 353, 498, 1, ST_MAN_RIGHT);
+
+ if (mq) {
+ ExCommand *ex = new ExCommand(0, 17, MSG_SC11_PUTBOOT, 0, 0, 0, 1, 0, 0, 0);
+ ex->_excFlags |= 3;
+
+ mq->addExCommandToEnd(ex);
+
+ postExCommand(g_fp->_aniMan->_id, 2, 353, 498, 0, -1);
+ }
+ } else {
+ sceneHandler11_putABoot();
+ }
+}
+
+void sceneHandler11_showSwing() {
+ g_vars->scene11_dudeOnSwing = g_fp->_currentScene->getStaticANIObject1ById(ANI_KACHELI, -1);
+ g_vars->scene11_dudeOnSwing->_statics = g_vars->scene11_dudeOnSwing->getStaticsById(ST_KCH_0);
+ g_vars->scene11_dudeOnSwing->_movement = 0;
+ g_vars->scene11_dudeOnSwing->show1(691, 371, MV_KCH_START, 0);
+ g_vars->scene11_dudeOnSwing->_priority = 20;
+}
+
+void sceneHandler11_jumpFromSwing() {
+ g_vars->scene11_arcadeIsOn = false;
+ g_vars->scene11_hint->_flags &= 0xFFFB;
+ g_vars->scene11_scrollIsEnabled = false;
+
+ getCurrSceneSc2MotionController()->setEnabled();
+ getGameLoaderInteractionController()->enableFlag24();
+
+ g_vars->scene11_swingOldAngle = 0.0;
+ g_vars->scene11_swingAngleDiff = 0.0;
+ g_vars->scene11_swingSpeed = 0.0;
+ g_vars->scene11_swingAngle = 0.0;
+
+ g_vars->scene11_dudeOnSwing = g_fp->_currentScene->getStaticANIObject1ById(ANI_MAN11, -1);
+ g_vars->scene11_dudeOnSwing->_flags &= 0xFFFB;
+ g_vars->scene11_dudeOnSwing = g_fp->_currentScene->getStaticANIObject1ById(ANI_KACHELI, -1);
+ g_vars->scene11_dudeOnSwing->changeStatics2(ST_KCH_STATIC);
+ g_vars->scene11_dudeOnSwing->setOXY(691, 371);
+ g_vars->scene11_dudeOnSwing->_priority = 20;
+ g_vars->scene11_dudeOnSwing->_flags |= 4;
+
+ MessageQueue *mq = new MessageQueue(g_fp->_globalMessageQueueList->compact());
+ ExCommand *ex = new ExCommand(g_fp->_aniMan->_id, 34, 256, 0, 0, 0, 1, 0, 0, 0);
+ ex->_field_14 = 256;
+ ex->_messageNum = 0;
+ ex->_excFlags |= 3;
+ mq->addExCommandToEnd(ex);
+ mq->setFlags(mq->getFlags() | 1);
+
+ g_fp->_globalMessageQueueList->addMessageQueue(mq);
+
+ g_fp->_aniMan->_flags |= 0x104;
+ g_fp->_aniMan->changeStatics2(ST_MAN11_SWING);
+ g_fp->_aniMan->setOXY(685, 373);
+ g_fp->_aniMan->startAnim(MV_MAN11_JUMPFROMSWING, mq->_id, -1);
+
+ g_fp->_aniMan2 = g_fp->_aniMan;
+}
+
+void sceneHandler11_swing0() {
+ g_vars->scene11_dudeOnSwing->_statics = g_vars->scene11_dudeOnSwing->getStaticsById(ST_MAN11_EMPTY);
+ g_vars->scene11_dudeOnSwing->_movement = 0;
+ g_vars->scene11_dudeOnSwing->show1(690, 215, MV_MAN11_SWING_0, 0);
+ g_vars->scene11_dudeOnSwing->startAnim(MV_MAN11_SWING_0, 0, -1);
+ g_vars->scene11_dudeOnSwing->_movement->setDynamicPhaseIndex(g_vars->scene11_dudeOnSwing->_movement->_currDynamicPhaseIndex);
+
+ g_vars->scene11_swingDirection = 0;
+ g_vars->scene11_swingMaxAngle = 45;
+ g_vars->scene11_swingOldAngle = 0.0;
+}
+
+void sceneHandler11_swing1() {
+ g_vars->scene11_dudeOnSwing->_statics = g_vars->scene11_dudeOnSwing->getStaticsById(ST_MAN11_EMPTY);
+ g_vars->scene11_dudeOnSwing->_movement = 0;
+ g_vars->scene11_dudeOnSwing->show1(690, 215, MV_MAN11_SWING_1, 0);
+ g_vars->scene11_dudeOnSwing->startAnim(MV_MAN11_SWING_1, 0, -1);
+ g_vars->scene11_dudeOnSwing->_movement->setDynamicPhaseIndex(g_vars->scene11_dudeOnSwing->_movement->_currDynamicPhaseIndex);
+
+ g_vars->scene11_swingDirection = 1;
+ g_vars->scene11_swingMaxAngle = 42;
+ g_vars->scene11_swingOldAngle = -(fabs(g_vars->scene11_swingAngle) * 0.075 + 0.12);
+}
+
+void sceneHandler11_swing2() {
+ g_vars->scene11_dudeOnSwing->_statics = g_vars->scene11_dudeOnSwing->getStaticsById(ST_MAN11_EMPTY);
+ g_vars->scene11_dudeOnSwing->_movement = 0;
+ g_vars->scene11_dudeOnSwing->show1(690, 215, MV_MAN11_SWING_2, 0);
+ g_vars->scene11_dudeOnSwing->startAnim(MV_MAN11_SWING_2, 0, -1);
+ g_vars->scene11_dudeOnSwing->_movement->setDynamicPhaseIndex(g_vars->scene11_dudeOnSwing->_movement->_currDynamicPhaseIndex);
+
+ g_vars->scene11_swingDirection = 2;
+ g_vars->scene11_swingMaxAngle = 48;
+ g_vars->scene11_swingOldAngle = fabs(g_vars->scene11_swingAngle) * 0.075 + 0.12;
+}
+
+void sceneHandler11_emptySwing() {
+ if (g_vars->scene11_swingDirection)
+ sceneHandler11_swing0();
+
+ g_vars->scene11_dudeOnSwing->stopAnim_maybe();
+ g_vars->scene11_dudeOnSwing->hide();
+ g_vars->scene11_dudeOnSwing = g_fp->_currentScene->getStaticANIObject1ById(ANI_KACHELI, -1);
+ g_vars->scene11_dudeOnSwing->show1(-1, -1, -1, 0);
+ g_vars->scene11_dudeOnSwing->changeStatics2(ST_KCH_EMPTY);
+ g_vars->scene11_dudeOnSwing->startAnim(MV_KCH_MOVE2, 0, -1);
+ g_vars->scene11_dudeOnSwing->_movement->setDynamicPhaseIndex(g_vars->scene11_dudeOnSwing->_movement->_currDynamicPhaseIndex);
+
+ g_vars->scene11_swingInertia = 0.03; //1.9881250;
+}
+
+void sceneHandler11_jumpHitAndWin() {
+ MGMInfo mgminfo;
+
+ sceneHandler11_emptySwing();
+
+ g_fp->_aniMan->show1(690 - (int)(sin(g_vars->scene11_swingAngle) * -267.0), 215 - (int)(cos(g_vars->scene11_swingAngle) * -267.0),
+ MV_MAN11_JUMPHIT, 0);
+ g_fp->_aniMan->_priority = 10;
+
+ mgminfo.field_1C = 10;
+ mgminfo.ani = g_fp->_aniMan;
+ mgminfo.staticsId2 = ST_MAN_1PIX;
+ mgminfo.x1 = 1400;
+ mgminfo.y1 = 0;
+ mgminfo.field_10 = 1;
+ mgminfo.flags = 66;
+ mgminfo.movementId = MV_MAN11_JUMPHIT;
+
+ MessageQueue *mq = g_vars->scene11_mgm.genMovement(&mgminfo);
+
+ if (mq) {
+ g_vars->scene11_crySound = SND_11_024;
+ ExCommand *ex = new ExCommand(ANI_MAN, 2, 36, 0, 0, 0, 1, 0, 0, 0);
+ ex->_keyCode = -1;
+ ex->_excFlags = 2;
+
+ mq->addExCommandToEnd(ex);
+
+ ex = new ExCommand(SC_11, 17, 61, 0, 0, 0, 1, 0, 0, 0);
+ ex->_keyCode = TrubaRight;
+ ex->_excFlags = 3;
+
+ mq->addExCommandToEnd(ex);
+
+ if (!mq->chain(g_fp->_aniMan))
+ delete mq;
+
+
+ if (g_fp->getObjectState(sO_Swingie) == g_fp->getObjectEnumState(sO_Swingie, sO_IsStandingInCorner))
+ g_fp->setObjectState(sO_Swingie, g_fp->getObjectEnumState(sO_Swingie, sO_IsSitting));
+
+ g_fp->setObjectState(sO_DudeHasJumped, g_fp->getObjectEnumState(sO_DudeHasJumped, sO_Yes));
+ }
+}
+
+void sceneHandler11_jumpOver(double angle) {
+ MGMInfo mgminfo;
+
+ sceneHandler11_emptySwing();
+
+ g_fp->_aniMan->show1(690 - (int)(sin(g_vars->scene11_swingAngle) * -267.0), 215 - (int)(cos(g_vars->scene11_swingAngle) * -267.0),
+ MV_MAN11_JUMPOVER, 0);
+ g_fp->_aniMan->_priority = 0;
+
+ mgminfo.staticsId2 = ST_MAN_1PIX;
+ mgminfo.ani = g_fp->_aniMan;
+ mgminfo.x1 = 1163;
+ mgminfo.y1 = 837 - (int)(angle * 153.0);
+ mgminfo.field_1C = 0;
+ mgminfo.field_10 = 1;
+ mgminfo.flags = 78;
+ mgminfo.movementId = MV_MAN11_JUMPOVER;
+
+ MessageQueue *mq = g_vars->scene11_mgm.genMovement(&mgminfo);
+
+ if (mq) {
+ g_vars->scene11_crySound = SND_11_022;
+
+ ExCommand *ex = new ExCommand(0, 17, MSG_SC11_RESTARTMAN, 0, 0, 0, 1, 0, 0, 0);
+ ex->_excFlags = 2;
+
+ mq->addExCommandToEnd(ex);
+
+ if (!mq->chain(g_fp->_aniMan))
+ delete mq;
+ }
+}
+
+void sceneHandler11_jumpHit(double angle) {
+ MGMInfo mgminfo;
+
+ sceneHandler11_emptySwing();
+
+ if (angle >= 0.0) {
+ if (angle > 1.0)
+ angle = 1.0;
+ } else {
+ angle = 0.0;
+ }
+
+ g_fp->_aniMan->show1(690 - (int)(sin(g_vars->scene11_swingAngle) * -267.0), 215 - (int)(cos(g_vars->scene11_swingAngle) * -267.0),
+ MV_MAN11_JUMPOVER, 0);
+ g_fp->_aniMan->_priority = 0;
+
+ mgminfo.staticsId2 = ST_MAN_1PIX;
+ mgminfo.ani = g_fp->_aniMan;
+ mgminfo.x1 = 1017 - (int)(angle * -214.0);
+ mgminfo.y1 = 700;
+ mgminfo.field_1C = 0;
+ mgminfo.field_10 = 1;
+ mgminfo.flags = 78;
+ mgminfo.movementId = MV_MAN11_JUMPHIT;
+
+ MessageQueue *mq = g_vars->scene11_mgm.genMovement(&mgminfo);
+
+ if (mq) {
+ g_vars->scene11_crySound = SND_11_022;
+
+ ExCommand *ex = new ExCommand(0, 17, MSG_SC11_RESTARTMAN, 0, 0, 0, 1, 0, 0, 0);
+ ex->_excFlags = 2;
+
+ mq->addExCommandToEnd(ex);
+
+ if (!mq->chain(g_fp->_aniMan))
+ delete mq;
+
+ }
+}
+
+void sceneHandler11_swingLogic() {
+ if (g_vars->scene11_dudeOnSwing->_movement) {
+ int ph = g_vars->scene11_dudeOnSwing->_movement->_currDynamicPhaseIndex;
+ if (ph > 53 && ph < 90) {
+ if (ph < 70 && g_vars->scene11_swingSpeed >= 22.0) {
+ sceneHandler11_jumpOver((double)ph * 0.01428571428571429); // = 1 / 70
+ } else if (ph <= 80 && g_vars->scene11_swingSpeed >= 22.0) {
+ sceneHandler11_jumpHitAndWin();
+ } else {
+ sceneHandler11_jumpHit((double)ph * g_vars->scene11_swingSpeed * 0.0006493506493506494); // = 1/1540
+ }
+
+ g_vars->scene11_arcadeIsOn = false;
+ g_vars->scene11_hint->_flags &= 0xFFFB;
+ return;
+ }
+
+ if (ph > 38 && ph < 53 && fabs(g_vars->scene11_swingSpeed) <= 5.0)
+ sceneHandler11_jumpFromSwing();
+ }
+}
+
+void sceneHandler11_setSwingDirection() {
+ if (g_vars->scene11_swingDirection == 2)
+ g_vars->scene11_swingDirectionPrevTurn = 1;
+ else if (g_vars->scene11_swingDirection == 1)
+ g_vars->scene11_swingDirectionPrevTurn = 2;
+ else
+ g_vars->scene11_swingDirectionPrevTurn = (g_vars->scene11_dudeOnSwing->_movement->_currDynamicPhaseIndex <= 45) + 1;
+}
+
+void sceneHandler11_swingieSit() {
+ if (g_fp->getObjectState(sO_Swingie) == g_fp->getObjectEnumState(sO_Swingie, sO_IsStandingInBoots)) {
+ g_vars->scene11_swingIsSwinging = false;
+ g_vars->scene11_swingieStands = false;
+
+ g_vars->scene11_swingie->changeStatics2(ST_SWR_SIT);
+ g_vars->scene11_swingie->setOXY(144, 389);
+
+ g_fp->setObjectState(sO_Swingie, g_fp->getObjectEnumState(sO_Swingie, sO_IsSitting));
+
+ getCurrSceneSc2MotionController()->enableLinks(sO_CloseThing1, 0);
+ getCurrSceneSc2MotionController()->enableLinks(sO_CloseThing2, 0);
+ getCurrSceneSc2MotionController()->enableLinks(sO_CloseThing3, 1);
+ }
+}
+
+void sceneHandler11_swingieJumpDown() {
+ MessageQueue *mq = new MessageQueue(g_fp->_currentScene->getMessageQueueById(QU_SWR_JUMPDOWN), 0, 0);
+
+ mq->setFlags(mq->getFlags() | 1);
+
+ if (!mq->chain(g_vars->scene11_swingie))
+ delete mq;
+
+ g_vars->scene11_swingIsSwinging = false;
+ g_vars->scene11_swingieStands = true;
+ g_vars->scene11_swingieScreenEdge = g_fp->_sceneRect.left;
+
+ getCurrSceneSc2MotionController()->enableLinks(sO_CloseThing1, 0);
+ getCurrSceneSc2MotionController()->enableLinks(sO_CloseThing2, 1);
+ getCurrSceneSc2MotionController()->enableLinks(sO_CloseThing3, 0);
+
+ getCurrSceneSc2MotionController()->replaceNodeX(905, 805);
+}
+
+void sceneHandler11_winArcade() {
+ if (g_vars->scene11_arcadeIsOn) {
+ g_vars->scene11_arcadeIsOn = false;
+
+ sceneHandler11_emptySwing();
+
+ g_fp->_gameLoader->preloadScene(SC_11, TrubaRight);
+ }
+}
+
+int sceneHandler11(ExCommand *cmd) {
+ if (cmd->_messageKind != 17)
+ return 0;
+
+ switch (cmd->_messageNum) {
+ case MSG_CMN_WINARCADE:
+ sceneHandler11_winArcade();
+ break;
+
+ case MSG_SC11_SITSWINGER:
+ if (g_fp->getObjectState(sO_Swingie) == g_fp->getObjectEnumState(sO_Swingie, sO_IsStandingInBoots)
+ || g_fp->getObjectState(sO_Swingie) == g_fp->getObjectEnumState(sO_Swingie, sO_IsStandingInCorner)) {
+ g_fp->setObjectState(sO_Swingie, g_fp->getObjectEnumState(sO_Swingie, sO_IsSitting));
+ }
+ break;
+
+ case MSG_SC11_MANCRY:
+ g_fp->playSound(g_vars->scene11_crySound, 0);
+
+ g_vars->scene11_crySound = 0;
+ break;
+
+ case MSG_SC11_RESTARTMAN:
+ sceneHandler11_restartMan();
+ break;
+
+ case MSG_SC11_HITMAN:
+ sceneHandler11_hitMan();
+ break;
+
+ case MSG_SC11_MANTOSWING:
+ sceneHandler11_manToSwing();
+ break;
+
+ case MSG_SC11_PUTBOOT:
+ sceneHandler11_putBoot();
+ break;
+
+ case MSG_SC11_SHOWSWING:
+ sceneHandler11_showSwing();
+ break;
+
+ case 107:
+ if (g_vars->scene11_arcadeIsOn)
+ sceneHandler11_swingLogic();
+ break;
+
+ case 33:
+ {
+ int res = 0;
+ int x, y;
+
+ if (!g_fp->_aniMan2)
+ goto LABEL_27;
+
+ x = g_fp->_aniMan2->_ox;
+ y = g_fp->_aniMan2->_oy;
+
+ g_vars->scene11_dudeX = x;
+ g_vars->scene11_dudeY = y;
+
+ if (g_vars->scene11_scrollIsEnabled) {
+ if (x > g_fp->_sceneRect.right - 200)
+ g_fp->_currentScene->_x = x - g_fp->_sceneRect.right + 300;
+ goto LABEL_26;
+ }
+
+ if (g_vars->scene11_scrollIsMaximized) {
+ g_fp->_currentScene->_x = g_fp->_sceneWidth - x;
+
+ if (g_vars->scene11_dudeX < 910)
+ g_vars->scene11_scrollIsMaximized = false;
+
+ LABEL_26:
+ res = 1;
+ LABEL_27:
+ if (g_vars->scene11_swingieStands) {
+ if (g_fp->_sceneRect.left >= 534 && g_vars->scene11_swingieScreenEdge < 534)
+ sceneHandler11_swingieSit();
+
+ g_vars->scene11_swingieScreenEdge = g_fp->_sceneRect.left;
+ }
+
+ if (!g_vars->scene11_arcadeIsOn)
+ goto LABEL_50;
+
+ if (g_vars->scene11_swingCounterPrevTurn <= 0 || g_vars->scene11_swingCounter - g_vars->scene11_swingCounterPrevTurn <= 72) {
+ } else {
+ sceneHandler11_swing0();
+ g_vars->scene11_swingDirectionPrevTurn = 0;
+ g_vars->scene11_swingCounterPrevTurn = 0;
+ }
+
+ if (!g_vars->scene11_arcadeIsOn)
+ goto LABEL_50;
+
+ if (g_vars->scene11_swingDirection == g_vars->scene11_swingDirectionPrevTurn || g_vars->scene11_swingCounterPrevTurn <= 0 || g_vars->scene11_swingCounter - g_vars->scene11_swingCounterPrevTurn <= 2) {
+ LABEL_49:
+ if (g_vars->scene11_arcadeIsOn) {
+ g_fp->_behaviorManager->updateBehaviors();
+ g_fp->startSceneTrack();
+ return res;
+ }
+ LABEL_50:
+ if (g_vars->scene11_swingIsSwinging
+ || (0.0 == g_vars->scene11_swingSpeed
+ && g_vars->scene11_dudeOnSwing->_movement != 0
+ && g_vars->scene11_dudeOnSwing->_movement->_currDynamicPhaseIndex == 45
+ && (g_vars->scene11_dudeOnSwing->changeStatics2(ST_KCH_STATIC), !g_vars->scene11_arcadeIsOn)
+ && g_vars->scene11_swingIsSwinging)) {
+ if (!g_vars->scene11_swingie->_movement) {
+ if ((g_vars->scene11_boots->_flags & 4) && g_vars->scene11_boots->_statics->_staticsId == ST_BTS11_2) {
+ sceneHandler11_swingieJumpDown();
+
+ g_fp->_behaviorManager->updateBehaviors();
+ g_fp->startSceneTrack();
+ return res;
+ }
+ g_vars->scene11_swingie->startAnim(MV_SWR_SWING, 0, -1);
+ }
+ }
+ g_fp->_behaviorManager->updateBehaviors();
+ g_fp->startSceneTrack();
+ return res;
+ }
+
+ if (g_vars->scene11_swingDirectionPrevTurn == 1) {
+ if (!g_vars->scene11_swingDirection)
+ sceneHandler11_swing1();
+ else
+ sceneHandler11_swing0();
+ } else if (g_vars->scene11_swingDirectionPrevTurn == 2) {
+ if (!g_vars->scene11_swingDirection)
+ sceneHandler11_swing2();
+ else
+ sceneHandler11_swing0();
+ }
+
+ g_vars->scene11_swingCounterPrevTurn = g_vars->scene11_swingCounter;
+ goto LABEL_49;
+ }
+ if (x >= g_fp->_sceneRect.left + 200) {
+ if (x <= g_fp->_sceneRect.right - 200) {
+ LABEL_18:
+ if (y < g_fp->_sceneRect.top + 200) {
+ g_fp->_currentScene->_y = y - g_fp->_sceneRect.top - 300;
+ y = g_vars->scene11_dudeY;
+ x = g_vars->scene11_dudeX;
+ }
+ if (y > g_fp->_sceneRect.bottom - 300) {
+ g_fp->_currentScene->_y = y - g_fp->_sceneRect.bottom + 300;
+ x = g_vars->scene11_dudeX;
+ }
+ if (x >= 940)
+ g_vars->scene11_scrollIsMaximized = true;
+ goto LABEL_26;
+ }
+ g_fp->_currentScene->_x = x - g_fp->_sceneRect.right + 300;
+ } else {
+ g_fp->_currentScene->_x = x - g_fp->_sceneRect.left - 300;
+ }
+ y = g_vars->scene11_dudeY;
+ x = g_vars->scene11_dudeX;
+ goto LABEL_18;
+ }
+
+ break;
+
+ case 29:
+ if (g_vars->scene11_swingIsSwinging) {
+ if (g_fp->_currentScene->getStaticANIObjectAtPos(g_fp->_sceneRect.left + cmd->_x, g_fp->_sceneRect.top + cmd->_y) == g_vars->scene11_swingie
+ && cmd->_keyCode == ANI_INV_BOOT)
+ sceneHandler11_putBoot();
+ } else {
+ if (g_vars->scene11_arcadeIsOn) {
+ sceneHandler11_setSwingDirection();
+
+ g_vars->scene11_swingCounterPrevTurn = g_vars->scene11_swingCounter;
+ }
+ }
+
+ if (!g_vars->scene11_arcadeIsOn) {
+ StaticANIObject *ani = g_fp->_currentScene->getStaticANIObjectAtPos(cmd->_sceneClickX, cmd->_sceneClickY);
+
+ if (!ani || !canInteractAny(g_fp->_aniMan, ani, cmd->_keyCode)) {
+ int picId = g_fp->_currentScene->getPictureObjectIdAtPos(cmd->_sceneClickX, cmd->_sceneClickY);
+ PictureObject *pic = g_fp->_currentScene->getPictureObjectById(picId, 0);
+
+ if (!pic || !canInteractAny(g_fp->_aniMan, pic, cmd->_keyCode)) {
+ if ((g_fp->_sceneRect.right - cmd->_sceneClickX < 47 && g_fp->_sceneRect.right < g_fp->_sceneWidth - 1)
+ || (cmd->_sceneClickX - g_fp->_sceneRect.left < 47 && g_fp->_sceneRect.left > 0)) {
+ g_fp->processArcade(cmd);
+
+ return 0;
+ }
+ }
+ }
+ return 0;
+ }
+ }
+
+ return 0;
+}
+
+} // End of namespace Fullpipe
diff --git a/engines/fullpipe/scenes/scene12.cpp b/engines/fullpipe/scenes/scene12.cpp
new file mode 100644
index 0000000000..f63bb9a9fd
--- /dev/null
+++ b/engines/fullpipe/scenes/scene12.cpp
@@ -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.
+ *
+ */
+
+#include "fullpipe/fullpipe.h"
+
+#include "fullpipe/objects.h"
+#include "fullpipe/objectnames.h"
+#include "fullpipe/constants.h"
+#include "fullpipe/motion.h"
+#include "fullpipe/scenes.h"
+#include "fullpipe/scene.h"
+#include "fullpipe/floaters.h"
+#include "fullpipe/messages.h"
+#include "fullpipe/statics.h"
+#include "fullpipe/behavior.h"
+
+namespace Fullpipe {
+
+void scene12_initScene(Scene *sc) {
+ GameVar *var = g_fp->getGameLoaderGameVar()->getSubVarByName("SC_12");
+ g_fp->_floaters->init(var);
+
+ g_vars->scene12_fly = g_fp->getObjectState(sO_Fly_12);
+
+ if (g_vars->scene12_fly)
+ g_vars->scene12_flyCountdown = g_fp->_rnd->getRandomNumber(600) + 600;
+
+ g_fp->setObjectState(sO_Fly_12, g_fp->_rnd->getRandomNumber(1));
+}
+
+void sceneHandler12_updateFloaters() {
+ g_fp->_floaters->genFlies(g_fp->_currentScene, 397, -50, 100, 6);
+
+ g_fp->_floaters->_array2[0]->countdown = g_fp->_rnd->getRandomNumber(6) + 4;
+ g_fp->_floaters->_array2[0]->val6 = 397;
+ g_fp->_floaters->_array2[0]->val7 = -50;
+}
+
+int sceneHandler12(ExCommand *cmd) {
+ int res = 0;
+
+ if (cmd->_messageKind == 17 && cmd->_messageNum == 33) {
+ if (g_fp->_aniMan2) {
+ if (g_fp->_aniMan2->_ox < g_fp->_sceneRect.left + 200)
+ g_fp->_currentScene->_x = g_fp->_aniMan2->_ox - g_fp->_sceneRect.left - 300;
+
+ if (g_fp->_aniMan2->_ox > g_fp->_sceneRect.right - 200)
+ g_fp->_currentScene->_x = g_fp->_aniMan2->_ox - g_fp->_sceneRect.right + 300;
+
+ res = 1;
+ }
+
+ g_vars->scene12_flyCountdown--;
+
+ if (!g_vars->scene12_flyCountdown)
+ sceneHandler12_updateFloaters();
+
+ g_fp->_floaters->update();
+
+ g_fp->_behaviorManager->updateBehaviors();
+ }
+
+ return res;
+}
+
+} // End of namespace Fullpipe
diff --git a/engines/fullpipe/scenes/scene13.cpp b/engines/fullpipe/scenes/scene13.cpp
new file mode 100644
index 0000000000..c7b3c96b93
--- /dev/null
+++ b/engines/fullpipe/scenes/scene13.cpp
@@ -0,0 +1,380 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public 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 "fullpipe/fullpipe.h"
+
+#include "fullpipe/objectnames.h"
+#include "fullpipe/constants.h"
+
+#include "fullpipe/gameloader.h"
+#include "fullpipe/motion.h"
+#include "fullpipe/scenes.h"
+#include "fullpipe/statics.h"
+
+#include "fullpipe/interaction.h"
+#include "fullpipe/behavior.h"
+
+
+namespace Fullpipe {
+
+void scene13_initScene(Scene *sc) {
+ g_vars->scene13_whirlgig = sc->getStaticANIObject1ById(ANI_WHIRLGIG_13, -1);
+ g_vars->scene13_guard = sc->getStaticANIObject1ById(ANI_STOROZH, -1);
+ g_vars->scene13_handleR = sc->getStaticANIObject1ById(ANI_HANDLE_R, -1);
+ g_vars->scene13_handleL = sc->getStaticANIObject1ById(ANI_HANDLE_L, -1);
+ g_vars->scene13_bridge = sc->getStaticANIObject1ById(ANI_BRIDGE, -1);
+ g_vars->scene13_guardDirection = true;
+
+ MovGraphLink *lnk = getSc2MctlCompoundBySceneId(sc->_sceneId)->getLinkByName(sO_Bridge);
+ Scene *oldsc = g_fp->_currentScene;
+
+ g_fp->_currentScene = sc;
+
+ if (g_fp->getObjectState(sO_Bridge) == g_fp->getObjectEnumState(sO_Bridge, sO_Convoluted)) {
+ g_vars->scene13_bridge->changeStatics2(ST_BDG_CLOSED);
+
+ lnk->_flags |= 0x20000000u;
+
+ g_fp->playSound(SND_13_018, 1);
+
+ g_vars->scene13_whirlgig->_callback2 = 0;
+ } else {
+ g_vars->scene13_bridge->changeStatics2(ST_BDG_OPEN2);
+
+ lnk->_flags &= 0xDFFFFFFF;
+
+ g_vars->scene13_whirlgig->stopAnim_maybe();
+ g_vars->scene13_whirlgig->_callback2 = 0;
+ g_vars->scene13_whirlgig->startAnim(MV_WHR13_SPIN, 0, -1);
+
+ if (g_vars->scene13_whirlgig->_movement)
+ g_vars->scene13_whirlgig->_movement->setDynamicPhaseIndex(30);
+
+ g_fp->playSound(SND_13_037, 1);
+ }
+
+ g_vars->scene13_bridge->_flags &= 0xFFFD;
+
+ g_fp->_currentScene = oldsc;
+
+ g_fp->initArcadeKeys("SC_13");
+}
+
+void sceneHandler13_openBridge() {
+ Movement *mov = g_vars->scene13_bridge->_movement;
+
+ if (mov && mov->_id == MV_BDG_CLOSE) {
+ int sz;
+
+ if (mov->_currMovement)
+ sz = mov->_currMovement->_dynamicPhases.size();
+ else
+ sz = mov->_dynamicPhases.size();
+
+ g_vars->scene13_bridge->changeStatics2(ST_BDG_CLOSED);
+ g_vars->scene13_bridge->startAnim(MV_BDG_OPEN, 0, -1);
+
+ mov->setDynamicPhaseIndex(sz - mov->_currDynamicPhaseIndex);
+ } else {
+ g_vars->scene13_bridge->changeStatics2(ST_BDG_CLOSED);
+ g_vars->scene13_bridge->startAnim(MV_BDG_OPEN, 0, -1);
+ }
+}
+
+void sceneHandler13_testClose() {
+ int id = g_vars->scene13_handleL->_statics->_staticsId;
+
+ if (id == ST_HDLL_UP)
+ chainQueue(QU_SC13_CLOSEFAIL, 1);
+ else if (id == ST_HDLL_FIRECAN || id == ST_HDLL_HAMMER)
+ chainQueue(QU_SC13_CLOSESUCCESS, 1);
+}
+
+void sceneHandler13_testOpen() {
+ switch (g_vars->scene13_handleR->_statics->_staticsId) {
+ case ST_HDLR_DOWN:
+ chainQueue(QU_SC13_OPENFAIL, 1);
+ break;
+
+ case ST_HDLR_DOWN_GUM:
+ chainQueue(QU_SC13_OPENSUCCESS, 1);
+ break;
+
+ case ST_HDLR_GUM:
+ g_vars->scene13_handleR->changeStatics2(ST_HDLR_DOWN_GUM);
+
+ chainQueue(QU_SC13_OPENSUCCESS, 1);
+ break;
+ }
+}
+
+void sceneHandler13_closeBridge() {
+ Movement *mov = g_vars->scene13_bridge->_movement;
+
+ if (mov && mov->_id == MV_BDG_OPEN) {
+ int sz;
+
+ if (mov->_currMovement)
+ sz = mov->_currMovement->_dynamicPhases.size();
+ else
+ sz = mov->_dynamicPhases.size();
+
+ g_vars->scene13_bridge->changeStatics2(ST_BDG_OPEN2);
+ g_vars->scene13_bridge->startAnim(MV_BDG_CLOSE, 0, -1);
+
+ mov->setDynamicPhaseIndex(sz - mov->_currDynamicPhaseIndex);
+ } else {
+ g_vars->scene13_bridge->changeStatics2(ST_BDG_OPEN2);
+ g_vars->scene13_bridge->startAnim(MV_BDG_CLOSE, 0, -1);
+ }
+}
+
+void sceneHandler13_closeFast() {
+ g_vars->scene13_bridge->changeStatics2(ST_BDG_OPEN2);
+ g_vars->scene13_bridge->startAnim(MV_BDG_CLOSE, 0, -1);
+ g_vars->scene13_bridge->_movement->setDynamicPhaseIndex(21);
+}
+
+void sceneHandler13_stopWhirlgig() {
+ g_vars->scene13_whirlgig->_callback2 = 0;
+
+ g_fp->stopAllSoundInstances(SND_13_018);
+ g_fp->playSound(SND_13_033, 0);
+ g_fp->playSound(SND_13_037, 1);
+}
+
+void sceneHandler13_startWhirlgig() {
+ g_vars->scene13_whirlgig->_callback2 = 0;
+
+ g_fp->playSound(SND_13_018, 1);
+ g_fp->playSound(SND_13_034, 0);
+
+ g_fp->stopAllSoundInstances(SND_13_037);
+}
+
+void sceneHandler13_openFast() {
+ g_vars->scene13_bridge->changeStatics2(ST_BDG_CLOSED);
+ g_vars->scene13_bridge->startAnim(MV_BDG_OPEN, 0, -1);
+ g_vars->scene13_bridge->_movement->setDynamicPhaseIndex(15);
+}
+
+void sceneHandler13_uneatGum() {
+ BehaviorEntryInfo *beh = g_fp->_behaviorManager->getBehaviorEntryInfoByMessageQueueDataId(g_vars->scene13_guard, ST_STR_RIGHT, QU_STR_CHEW);
+
+ if (beh) {
+ beh->_percent = 0;
+ beh->_delay = 36;
+ }
+
+ beh = g_fp->_behaviorManager->getBehaviorEntryInfoByMessageQueueDataId(g_vars->scene13_guard, ST_STR_RIGHT, QU_STR_PLUU);
+ if (beh) {
+ beh->_percent = 0;
+ beh->_delay = 36;
+ }
+}
+
+void sceneHandler13_eatGum() {
+ BehaviorEntryInfo *beh = g_fp->_behaviorManager->getBehaviorEntryInfoByMessageQueueDataId(g_vars->scene13_guard, ST_STR_RIGHT, QU_STR_CHEW);
+
+ if (beh) {
+ beh->_percent = 10922;
+ beh->_delay = 0;
+ }
+}
+
+void sceneHandler13_updateBridge() {
+ MovGraphLink *lnk = getCurrSceneSc2MotionController()->getLinkByName(sO_Bridge);
+
+ if (lnk) {
+ if (g_fp->getObjectState(sO_Bridge) == g_fp->getObjectEnumState(sO_Bridge, sO_Convoluted))
+ lnk->_flags |= 0x20000000;
+ else
+ lnk->_flags &= 0xDFFFFFFF;
+ }
+}
+
+void sceneHandler13_showGum() {
+ chainQueue(QU_SC13_SHOWGUM, 0);
+}
+
+void sceneHandler13_setBehFlag(BehaviorEntryInfo *beh, bool flag) {
+ if (!flag) {
+ beh->_percent = 327;
+ beh->_flags |= 1;
+ beh->_delay = 36;
+ } else {
+ beh->_percent = 0x7FFF;
+ beh->_flags &= 0xFFFFFFFE;
+ beh->_delay = 0;
+ }
+}
+
+void sceneHandler13_walkForward(bool flag) {
+ BehaviorEntryInfo *beh = g_fp->_behaviorManager->getBehaviorEntryInfoByMessageQueueDataId(g_vars->scene13_guard, ST_STR_RIGHT, QU_STR_RTOL);
+
+ sceneHandler13_setBehFlag(beh, flag);
+
+ beh = g_fp->_behaviorManager->getBehaviorEntryInfoByMessageQueueDataId(g_vars->scene13_guard, ST_STR_LEFT, QU_STR_TURNR);
+
+ sceneHandler13_setBehFlag(beh, flag);
+
+ beh->_flags &= 0xFE;
+}
+
+void sceneHandler13_walkBackward(bool flag) {
+ BehaviorEntryInfo *beh = g_fp->_behaviorManager->getBehaviorEntryInfoByMessageQueueDataId(g_vars->scene13_guard, ST_STR_RIGHT|0x4000, QU_STR_LTOR);
+
+ sceneHandler13_setBehFlag(beh, flag);
+
+ beh = g_fp->_behaviorManager->getBehaviorEntryInfoByMessageQueueDataId(g_vars->scene13_guard, ST_STR_LEFT|0x4000, QU_STR_TURNR_L);
+
+ sceneHandler13_setBehFlag(beh, flag);
+
+ beh->_flags &= 0xFE;
+}
+
+int sceneHandler13(ExCommand *cmd) {
+ if (cmd->_messageKind != 17)
+ return 0;
+
+ switch(cmd->_messageNum) {
+ case MSG_SC13_OPENBRIDGE:
+ sceneHandler13_openBridge();
+ break;
+
+ case MSG_SC13_TESTCLOSE:
+ sceneHandler13_testClose();
+ break;
+
+ case MSG_SC13_TESTOPEN:
+ sceneHandler13_testOpen();
+ break;
+
+ case MSG_SC13_CLOSEBRIDGE:
+ sceneHandler13_closeBridge();
+ break;
+
+ case MSG_SC13_CLOSEFAST:
+ sceneHandler13_closeFast();
+ break;
+
+ case MSG_SC13_STOPWHIRLGIG:
+ sceneHandler13_stopWhirlgig();
+ break;
+
+ case MSG_SC13_STARTWHIRLGIG:
+ sceneHandler13_startWhirlgig();
+ break;
+
+ case MSG_SC13_OPENFAST:
+ sceneHandler13_openFast();
+ break;
+
+ case MSG_SC13_UNEATGUM:
+ sceneHandler13_uneatGum();
+ break;
+
+ case MSG_SC13_EATGUM:
+ sceneHandler13_eatGum();
+ break;
+
+ case MSG_SC13_CHEW:
+ g_vars->scene13_guard->_flags &= 0xFF7Fu;
+ break;
+
+ case MSG_SC13_UPDATEBRIDGE:
+ sceneHandler13_updateBridge();
+ break;
+
+ case MSG_SC13_SHOWGUM:
+ sceneHandler13_showGum();
+ break;
+
+ case 29:
+ {
+ StaticANIObject *ani = g_fp->_currentScene->getStaticANIObjectAtPos(cmd->_sceneClickX, cmd->_sceneClickY);
+
+ if (!ani || !canInteractAny(g_fp->_aniMan, ani, cmd->_keyCode)) {
+ int picId = g_fp->_currentScene->getPictureObjectIdAtPos(cmd->_sceneClickX, cmd->_sceneClickY);
+ PictureObject *pic = g_fp->_currentScene->getPictureObjectById(picId, 0);
+
+ if (!pic || !canInteractAny(g_fp->_aniMan, pic, cmd->_keyCode)) {
+ if ((g_fp->_sceneRect.right - cmd->_sceneClickX < 47
+ && g_fp->_sceneRect.right < g_fp->_sceneWidth - 1)
+ || (cmd->_sceneClickX - g_fp->_sceneRect.left < 47 && g_fp->_sceneRect.left > 0)) {
+ g_fp->processArcade(cmd);
+ }
+ }
+ }
+ break;
+ }
+
+ case 33:
+ {
+ int res = 0;
+ int x;
+
+ if (g_fp->_aniMan2) {
+ x = g_fp->_aniMan2->_ox;
+ g_vars->scene13_dudeX = x;
+
+ if (x < g_fp->_sceneRect.left + 200)
+ g_fp->_currentScene->_x = x - g_fp->_sceneRect.left - 300;
+
+ if (x > g_fp->_sceneRect.right - 200)
+ g_fp->_currentScene->_x = x - g_fp->_sceneRect.right + 300;
+
+ res = 1;
+ } else {
+ x = g_vars->scene13_dudeX;
+ }
+
+ if (g_vars->scene13_guardDirection) {
+ if (x < 1022) {
+ sceneHandler13_walkForward(1);
+ sceneHandler13_walkBackward(0);
+
+ g_vars->scene13_guardDirection = false;
+
+ g_fp->_behaviorManager->updateBehaviors();
+ g_fp->startSceneTrack();
+
+ return res;
+ }
+ } else if (x > 1022) {
+ sceneHandler13_walkForward(0);
+ sceneHandler13_walkBackward(1);
+
+ g_vars->scene13_guardDirection = true;
+ }
+
+ g_fp->_behaviorManager->updateBehaviors();
+ g_fp->startSceneTrack();
+
+ return res;
+ }
+ }
+
+ return 0;
+}
+
+} // End of namespace Fullpipe
diff --git a/engines/fullpipe/scenes/scene14.cpp b/engines/fullpipe/scenes/scene14.cpp
new file mode 100644
index 0000000000..21dbe8101f
--- /dev/null
+++ b/engines/fullpipe/scenes/scene14.cpp
@@ -0,0 +1,849 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public 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 "fullpipe/fullpipe.h"
+
+#include "fullpipe/objectnames.h"
+#include "fullpipe/constants.h"
+
+#include "fullpipe/gameloader.h"
+#include "fullpipe/motion.h"
+#include "fullpipe/scenes.h"
+#include "fullpipe/statics.h"
+
+#include "fullpipe/interaction.h"
+#include "fullpipe/behavior.h"
+#include "fullpipe/input.h"
+
+namespace Fullpipe {
+
+void scene14_initScene(Scene *sc) {
+ g_vars->scene14_grandma = sc->getStaticANIObject1ById(ANI_GRANDMA, -1);
+ g_vars->scene14_sceneDeltaX = 200;
+ g_vars->scene14_sceneDeltaY = 200;
+ g_vars->scene14_arcadeIsOn = false;
+ g_vars->scene14_dudeIsKicking = false;
+ g_vars->scene14_ballIsFlying = false;
+ g_vars->scene14_dudeCanKick = false;
+ g_vars->scene14_sceneDiffX = 300;
+ g_vars->scene14_sceneDiffY = 300;
+ g_vars->scene14_pink = 0;
+ g_vars->scene14_flyingBall = 0;
+ g_vars->scene14_balls.clear();
+
+ if (g_fp->getObjectState(sO_Grandma) == g_fp->getObjectEnumState(sO_Grandma, sO_In_14)) {
+ g_vars->scene14_grandmaIsHere = true;
+
+ StaticANIObject *ball = sc->getStaticANIObject1ById(ANI_BALL14, -1);
+
+ ball->_flags &= 0xFFFB;
+ g_vars->scene14_balls.push_back(ball);
+
+ for (uint i = 0; i < 3; i++) {
+ ball = new StaticANIObject(ball); // create a copy
+
+ ball->_flags &= 0xFFFB;
+ g_vars->scene14_balls.push_back(ball);
+
+ sc->addStaticANIObject(ball, 1);
+ }
+ } else {
+ g_vars->scene14_grandmaIsHere = false;
+ g_vars->scene14_grandma->hide();
+ }
+
+ g_fp->lift_setButton(sO_Level4, ST_LBN_4N);
+ g_fp->lift_init(sc, QU_SC14_ENTERLIFT, QU_SC14_EXITLIFT);
+
+ g_fp->initArcadeKeys("SC_14");
+ g_fp->setArcadeOverlay(PIC_CSR_ARCADE6);
+}
+
+void scene14_setupMusic() {
+ if (!g_vars->scene14_grandmaIsHere)
+ g_fp->playTrack(g_fp->getGameLoaderGameVar()->getSubVarByName("SC_14"), "MUSIC2", 0);
+}
+
+int scene14_updateCursor() {
+ g_fp->updateCursorCommon();
+
+ if (g_vars->scene14_arcadeIsOn) {
+ if (g_vars->scene14_dudeIsKicking) {
+ g_fp->_cursorId = PIC_CSR_ARCADE2_D;
+ } else {
+ if (g_fp->_aniMan != g_fp->_objectAtCursor || g_fp->_aniMan->_movement || g_fp->_cursorId != PIC_CSR_DEFAULT) {
+ if (g_fp->_cursorId != PIC_CSR_DEFAULT_INV && g_fp->_cursorId != PIC_CSR_ITN_INV) {
+ g_fp->_cursorId = PIC_CSR_DEFAULT;
+ }
+ } else {
+ g_fp->_cursorId = PIC_CSR_ITN;
+ }
+ }
+ }
+
+ return g_fp->_cursorId;
+}
+
+int sceneHandler14_updateScreenCallback() {
+ int res;
+
+ res = g_fp->drawArcadeOverlay(g_vars->scene14_arcadeIsOn);
+ if (!res)
+ g_fp->_updateScreenCallback = 0;
+
+ return res;
+}
+
+void sceneHandler14_showBallGrandmaHit2() {
+ if (g_vars->scene14_flyingBall) {
+ g_vars->scene14_flyingBall->show1(g_vars->scene14_grandmaX + 223, g_vars->scene14_grandmaY + 35, MV_BAL14_SPIN, 0);
+ g_vars->scene14_flyingBall->_priority = 27;
+
+ g_vars->scene14_pink = g_vars->scene14_flyingBall;
+
+ g_vars->scene14_flyingBall = 0;
+ }
+}
+
+void sceneHandler14_showBallGrandmaDive() {
+ if (g_vars->scene14_flyingBall) {
+ g_vars->scene14_flyingBall->show1(g_vars->scene14_grandmaX + 506, g_vars->scene14_grandmaY - 29, -1, 0);
+
+ g_vars->scene14_balls.push_back(g_vars->scene14_flyingBall);
+ g_vars->scene14_flyingBall = 0;
+ }
+
+ g_fp->_aniMan2 = g_fp->_aniMan;
+}
+
+void sceneHandler14_showBallGrandmaHit() {
+ if (g_vars->scene14_flyingBall) {
+ g_vars->scene14_flyingBall->show1(g_vars->scene14_grandmaX + 190, g_vars->scene14_grandmaY + 56, MV_BAL14_TOGMA, 0);
+ g_vars->scene14_flyingBall->_priority = 27;
+
+ MessageQueue *mq = new MessageQueue(g_fp->_globalMessageQueueList->compact());
+ ExCommand *ex = new ExCommand(ANI_BALL14, 1, MV_BAL14_TOGMA, 0, 0, 0, 1, 0, 0, 0);
+
+ ex->_keyCode = g_vars->scene14_flyingBall->_okeyCode;
+ ex->_excFlags |= 2;
+ ex->_field_24 = 1;
+ mq->addExCommandToEnd(ex);
+
+ ex = new ExCommand(ANI_BALL14, 6, 0, 0, 0, 0, 1, 0, 0, 0);
+ ex->_keyCode = g_vars->scene14_flyingBall->_okeyCode;
+ ex->_excFlags |= 3;
+ mq->addExCommandToEnd(ex);
+ mq->chain(0);
+
+ g_vars->scene14_balls.push_back(g_vars->scene14_flyingBall);
+ g_vars->scene14_flyingBall = 0;
+ }
+}
+
+void sceneHandler14_exitScene() {
+ g_vars->scene14_arcadeIsOn = false;
+
+ if (g_fp->_aniMan->_movement)
+ g_fp->_aniMan->_movement->gotoLastFrame();
+
+ g_fp->_aniMan->stopAnim_maybe();
+
+ handleObjectInteraction(g_fp->_aniMan, g_fp->_currentScene->getPictureObjectById(PIC_SC14_RTRUBA, 0), 0);
+
+ g_vars->scene14_grandma->changeStatics2(ST_GMA_SIT);
+
+ chainQueue(QU_SC14_ENDARCADE, 0);
+
+ getGameLoaderInteractionController()->disableFlag24();
+ getCurrSceneSc2MotionController()->clearEnabled();
+}
+
+void sceneHandler14_showBallMan() {
+ if (g_vars->scene14_flyingBall) {
+ g_vars->scene14_flyingBall->show1(g_vars->scene14_dudeX - 166, g_vars->scene14_dudeY + 40, MV_BAL14_TOGMA, 0);
+ g_vars->scene14_flyingBall->_priority = 27;
+
+ MessageQueue *mq = new MessageQueue(g_fp->_globalMessageQueueList->compact());
+ ExCommand *ex = new ExCommand(ANI_BALL14, 1, MV_BAL14_TOGMA, 0, 0, 0, 1, 0, 0, 0);
+
+ ex->_keyCode = g_vars->scene14_flyingBall->_okeyCode;
+ ex->_excFlags |= 2;
+ ex->_field_24 = 1;
+ mq->addExCommandToEnd(ex);
+
+ ex = new ExCommand(ANI_BALL14, 6, 0, 0, 0, 0, 1, 0, 0, 0);
+ ex->_keyCode = g_vars->scene14_flyingBall->_okeyCode;
+ ex->_excFlags |= 3;
+ mq->addExCommandToEnd(ex);
+ mq->chain(0);
+
+ g_vars->scene14_flyingBall->startAnim(MV_BAL14_TOGMA, 0, -1);
+
+ g_vars->scene14_balls.push_back(g_vars->scene14_flyingBall);
+ g_vars->scene14_flyingBall = 0;
+
+ if (g_vars->scene14_dudeX >= 1300)
+ sceneHandler14_exitScene();
+ }
+}
+
+void sceneHandler14_manKickBall() {
+ int val = (g_vars->scene14_grandmaX + 65 - (g_vars->scene14_dudeX - 85)) / -32;
+ int den = val;
+
+ g_vars->scene14_ballX = g_vars->scene14_dudeX - 85;
+ g_vars->scene14_ballY = g_vars->scene14_dudeY - 76;
+ g_vars->scene14_ballDeltaX = -32;
+
+ if (!val)
+ den = 1;
+
+ g_vars->scene14_ballDeltaY = (g_vars->scene14_grandmaY - 102 - val * val / 2 - (g_vars->scene14_dudeY - 76)) / den;
+
+ g_vars->scene14_flyingBall->show1(g_vars->scene14_dudeX - 85, g_vars->scene14_dudeY - 76, -1, 0);
+ g_vars->scene14_flyingBall->startAnim(MV_BAL14_SPIN, 0, -1);
+ g_vars->scene14_flyingBall->_priority = 5;
+
+ g_vars->scene14_ballIsFlying = true;
+}
+
+void sceneHandler14_showBallFly() {
+ if (g_vars->scene14_balls.size()) {
+ g_vars->scene14_flyingBall = g_vars->scene14_balls.front();
+ g_vars->scene14_balls.pop_front();
+ }
+
+ int x, y;
+
+ if (g_vars->scene14_grandma->_movement) {
+ x = g_vars->scene14_grandma->_movement->_ox;
+ g_vars->scene14_ballX = x;
+ y = g_vars->scene14_grandma->_movement->_oy;
+ } else {
+ x = g_vars->scene14_grandmaX;
+ y = g_vars->scene14_grandmaY;
+ }
+
+ x = x + 38;
+ y = y - 77;
+
+ g_vars->scene14_ballDeltaX = 32;
+
+ int dist = (g_vars->scene14_dudeX - 16 - x) / 32;
+ int den = dist;
+
+ if (!dist)
+ den = 1;
+
+ g_vars->scene14_ballX = x + 32;
+ g_vars->scene14_ballDeltaY = (g_vars->scene14_dudeY - 40 - dist * dist / 2 - y) / den;
+ g_vars->scene14_ballY = g_vars->scene14_ballDeltaY + y;
+
+ g_vars->scene14_flyingBall->show1(x + 32, g_vars->scene14_ballDeltaY + y, MV_BAL14_SPIN, 0);
+ g_vars->scene14_flyingBall->_priority = 5;
+ g_vars->scene14_flyingBall->startAnim(MV_BAL14_SPIN, 0, -1);
+
+ g_vars->scene14_ballIsFlying = true;
+}
+
+void sceneHandler14_grandmaJump() {
+ BehaviorEntryInfo *beh1 = g_fp->_behaviorManager->getBehaviorEntryInfoByMessageQueueDataId(g_vars->scene14_grandma, ST_GMA_SIT, QU_GMA_JUMPFW);
+ BehaviorEntryInfo *beh2 = g_fp->_behaviorManager->getBehaviorEntryInfoByMessageQueueDataId(g_vars->scene14_grandma, ST_GMA_SIT, QU_GMA_JUMPBK);
+
+ if (beh1) {
+ if (beh2) {
+ int p = beh1->_percent;
+ beh1->_percent = beh2->_percent;
+ beh2->_percent = p;
+ }
+ }
+}
+
+void sceneHandler14_endArcade() {
+ g_vars->scene14_arcadeIsOn = false;
+
+ setInputDisabled(0);
+
+ getGameLoaderInteractionController()->enableFlag24();
+ getCurrSceneSc2MotionController()->setEnabled();
+
+ BehaviorEntryInfo *beh = g_fp->_behaviorManager->getBehaviorEntryInfoByMessageQueueDataId(g_vars->scene14_grandma, ST_GMA_SIT, QU_GMA_BLINK);
+ if (beh)
+ beh->_percent = 327;
+
+ beh = g_fp->_behaviorManager->getBehaviorEntryInfoByMessageQueueDataId(g_vars->scene14_grandma, ST_GMA_SIT, QU_GMA_THROW);
+ if (beh)
+ beh->_percent = 0;
+
+ g_vars->scene14_sceneDeltaX = 200;
+ g_vars->scene14_sceneDeltaY = 200;
+
+ g_fp->_aniMan2 = g_fp->_aniMan;
+
+ g_vars->scene14_sceneDiffX = 300;
+ g_vars->scene14_sceneDiffY = 300;
+}
+
+void sceneHandler14_winArcade() {
+ if (g_vars->scene14_arcadeIsOn) {
+ if (g_vars->scene14_dudeIsKicking) {
+ g_fp->_aniMan->changeStatics2(ST_MAN_RIGHT|0x4000);
+
+ g_vars->scene14_dudeIsKicking = false;
+ }
+
+ if (g_vars->scene14_flyingBall) {
+ g_vars->scene14_balls.push_back(g_vars->scene14_flyingBall);
+
+ g_vars->scene14_flyingBall->_flags &= 0xFFFB;
+ g_vars->scene14_flyingBall = 0;
+ }
+
+ g_vars->scene14_ballIsFlying = false;
+
+ sceneHandler14_endArcade();
+
+ g_vars->scene14_grandmaIsHere = false;
+
+ if (g_fp->getObjectState(sO_Grandma) == g_fp->getObjectEnumState(sO_Grandma, sO_In_14)) {
+ g_fp->setObjectState(sO_Grandma, g_fp->getObjectEnumState(sO_Grandma, sO_In_15));
+ g_vars->scene14_grandma->changeStatics2(ST_GMA_SIT);
+ g_vars->scene14_grandma->_flags &= 0xFFFB;
+ }
+
+ if (g_fp->_currentScene->_messageQueueId) {
+ MessageQueue *mq = g_fp->_globalMessageQueueList->getMessageQueueById(g_fp->_currentScene->_messageQueueId);
+ if (mq)
+ delete mq;
+
+ g_fp->_currentScene->_messageQueueId = 0;
+ }
+ }
+}
+
+void sceneHandler14_showBallLast() {
+ if (g_vars->scene14_pink) {
+ g_vars->scene14_pink->show1(693, 491, MV_BAL14_SPIN, 0);
+ g_vars->scene14_pink->_priority = 27;
+ }
+}
+
+void sceneHandler14_hideBallLast() {
+ if (g_vars->scene14_pink) {
+ g_vars->scene14_pink->hide();
+ g_vars->scene14_balls.push_back(g_vars->scene14_pink);
+ g_vars->scene14_pink = 0;
+ }
+}
+
+void sceneHandler14_startArcade() {
+ g_vars->scene14_arcadeIsOn = true;
+ g_vars->scene14_dudeCanKick = true;
+
+ if (g_fp->_aniMan->_movement) {
+ g_fp->_aniMan->changeStatics2(ST_MAN_RIGHT | 0x4000);
+ g_fp->_aniMan->setOXY(1237, 451);
+ g_fp->_aniMan->_priority = 25;
+ }
+
+ getCurrSceneSc2MotionController()->clearEnabled();
+ getGameLoaderInteractionController()->disableFlag24();
+
+ g_fp->_aniMan2 = 0;
+ g_vars->scene14_sceneDeltaX = 50;
+ g_vars->scene14_sceneDiffX = 100;
+ g_vars->scene14_hitsLeft = 4;
+ g_vars->scene14_pink = 0;
+
+ chainQueue(QU_SC14_STARTARCADE, 0);
+
+ g_fp->_updateScreenCallback = sceneHandler14_updateScreenCallback;
+}
+
+void sceneHandler14_clearCallback() {
+ g_fp->_aniMan->_callback2 = 0;
+ g_vars->scene14_dudeIsKicking = false;
+}
+
+void sceneHandler14_kickAnimation() {
+ if (g_fp->_aniMan->_movement) {
+ sceneHandler14_clearCallback();
+
+ if (g_vars->scene14_flyingBall && g_vars->scene14_dudeX - g_vars->scene14_flyingBall->_ox < 180) {
+ g_fp->_aniMan->changeStatics2(g_fp->_aniMan->_movement->_staticsObj2->_staticsId);
+ g_fp->_aniMan->startAnim(MV_MAN14_KICK, 0, -1);
+
+ g_vars->scene14_ballIsFlying = false;
+
+ g_vars->scene14_flyingBall->stopAnim_maybe();
+ g_vars->scene14_flyingBall->hide();
+ } else {
+ g_fp->_aniMan->changeStatics2(g_fp->_aniMan->_movement->_staticsObj2->_staticsId);
+ g_fp->_aniMan->startAnim(MV_MAN14_KICKAIR, 0, -1);
+ }
+ }
+}
+
+void sceneHandler14_declineCallback(int *arg) {
+ Common::Point point;
+
+ if (g_vars->scene14_dudeIsKicking) {
+ *arg = (int)(sqrt((double)(g_fp->_mouseVirtY - g_vars->scene14_mouseCursorPos.y)
+ * (g_fp->_mouseVirtY - g_vars->scene14_mouseCursorPos.y)
+ + (g_fp->_mouseVirtX - g_vars->scene14_mouseCursorPos.x)
+ * (g_fp->_mouseVirtX - g_vars->scene14_mouseCursorPos.x)) * 0.1);
+
+ if (*arg > 11)
+ *arg = 11;
+ } else {
+ ++*arg;
+ }
+}
+
+void sceneHandler14_dudeDecline() {
+ g_vars->scene14_mouseCursorPos.x = g_fp->_mouseVirtX;
+ g_vars->scene14_mouseCursorPos.y = g_fp->_mouseVirtY;
+
+ g_fp->_aniMan->_callback2 = sceneHandler14_declineCallback;
+ g_fp->_aniMan->changeStatics2(ST_MAN_RIGHT|0x4000);
+ g_fp->_aniMan->startAnim(MV_MAN14_DECLINE, 0, -1);
+
+ g_vars->scene14_dudeIsKicking = true;
+}
+
+bool sceneHandler14_arcadeProcessClick(ExCommand *cmd) {
+ if (!getCurrSceneSc2MotionController()->_isEnabled)
+ return 0;
+
+ if (!g_vars->scene14_grandmaIsHere) {
+ if (!cmd->_keyCode) {
+ if (g_vars->scene14_pink) {
+ if (g_vars->scene14_pink->_flags & 4) {
+ if (cmd->_sceneClickX < g_vars->scene14_pink->_ox + 40) {
+ handleObjectInteraction(g_fp->_aniMan, g_vars->scene14_pink, 0);
+ cmd->_messageKind = 0;
+ return true;
+ }
+ }
+ }
+ }
+ return false;
+ }
+
+ if (getCurrSceneSc2MotionController()->_objtype != kObjTypeMctlCompound)
+ return false;
+
+ if (!getCurrSceneSc2MotionController()->_motionControllers[0]->_movGraphReactObj->pointInRegion(cmd->_sceneClickX, cmd->_sceneClickY))
+ return false;
+
+ if (cmd->_sceneClickX > 1237)
+ return false;
+
+ MessageQueue *mq = getCurrSceneSc2MotionController()->method34(g_fp->_aniMan, 1237, 451, 1, 0);
+
+ if (!mq)
+ return false;
+
+ ExCommand *ex = new ExCommand(0, 17, MSG_SC14_STARTARCADE, 0, 0, 0, 1, 0, 0, 0);
+
+ ex->_excFlags |= 3;
+ mq->addExCommandToEnd(ex);
+ mq->setFlags(mq->getFlags() | 1);
+
+ postExCommand(g_fp->_aniMan->_id, 2, 1237, 451, 0, -1);
+
+ cmd->_messageKind = 0;
+
+ getCurrSceneSc2MotionController()->clearEnabled();
+ getGameLoaderInteractionController()->disableFlag24();
+ return true;
+}
+
+void sceneHandler14_grandmaThrow() {
+ g_vars->scene14_grandma->changeStatics2(ST_GMA_SIT);
+
+ MessageQueue *mq = new MessageQueue;
+ ExCommand *ex = new ExCommand(ANI_GRANDMA, 2, 30, 0, 0, 0, 1, 0, 0, 0);
+
+ ex->_excFlags |= 2;
+ mq->addExCommandToEnd(ex);
+
+ ex = new ExCommand(ANI_GRANDMA, 1, MV_GMA_THROW, 0, 0, 0, 1, 0, 0, 0);
+ ex->_excFlags |= 2;
+ mq->addExCommandToEnd(ex);
+
+ mq->chain(0);
+}
+
+void sceneHandler14_passToGrandma() {
+ g_vars->scene14_flyingBall->stopAnim_maybe();
+ g_vars->scene14_flyingBall->_priority = 27;
+
+ MessageQueue *mq = new MessageQueue(g_fp->_globalMessageQueueList->compact());
+ ExCommand *ex = new ExCommand(ANI_BALL14, 1, MV_BAL14_FALL, 0, 0, 0, 1, 0, 0, 0);
+
+ ex->_keyCode = g_vars->scene14_flyingBall->_okeyCode;
+ ex->_excFlags |= 2;
+ ex->_field_24 = 1;
+ mq->addExCommandToEnd(ex);
+
+ ex = new ExCommand(ANI_BALL14, 6, 0, 0, 0, 0, 1, 0, 0, 0);
+ ex->_keyCode = g_vars->scene14_flyingBall->_okeyCode;
+ ex->_excFlags |= 3;
+ mq->addExCommandToEnd(ex);
+ mq->chain(0);
+
+ g_vars->scene14_balls.push_back(g_vars->scene14_flyingBall);
+ g_vars->scene14_flyingBall = 0;
+
+ sceneHandler14_grandmaThrow();
+}
+
+void sceneHandler14_grandmaJumpThrow() {
+ g_vars->scene14_grandma->changeStatics2(ST_GMA_SIT);
+
+ MessageQueue *mq = new MessageQueue;
+ ExCommand *ex = new ExCommand(ANI_GRANDMA, 2, 30, 0, 0, 0, 1, 0, 0, 0);
+
+ ex->_excFlags |= 2;
+ mq->addExCommandToEnd(ex);
+
+ ex = new ExCommand(ANI_GRANDMA, 1, MV_GMA_JUMPFW, 0, 0, 0, 1, 0, 0, 0);
+ ex->_excFlags |= 2;
+ mq->addExCommandToEnd(ex);
+
+ ex = new ExCommand(ANI_GRANDMA, 1, MV_GMA_THROW, 0, 0, 0, 1, 0, 0, 0);
+ ex->_excFlags |= 2;
+ mq->addExCommandToEnd(ex);
+
+ mq->chain(0);
+
+ g_vars->scene14_dude2X += 71;
+ g_fp->_currentScene->_x = 71;
+
+ g_fp->_aniMan2 = g_fp->_aniMan;
+}
+
+void sceneHandler14_dudeFall() {
+ if (!g_fp->_aniMan->_movement || g_fp->_aniMan->_movement->_id != MV_MAN14_FALL) {
+ sceneHandler14_clearCallback();
+
+ g_fp->_aniMan->changeStatics2(ST_MAN_RIGHT|0x4000);
+ g_fp->_aniMan->startAnim(MV_MAN14_FALL, 0, -1);
+ g_vars->scene14_flyingBall->stopAnim_maybe();
+ g_vars->scene14_flyingBall->hide();
+
+ sceneHandler14_grandmaJumpThrow();
+ }
+ ++g_vars->scene14_hitsLeft;
+}
+
+void sceneHandler14_grandmaStepForward() {
+ g_fp->_aniMan->changeStatics2(ST_MAN_RIGHT|0x4000);
+ g_fp->_aniMan->startAnim(MV_MAN14_STEPFW, 0, -1);
+
+ g_vars->scene14_dude2X -= 71;
+
+ g_fp->_currentScene->_x = -71;
+ g_fp->_aniMan2 = g_vars->scene14_grandma;
+}
+
+void sceneHandler14_arcadeLogic() {
+ g_vars->scene14_flyingBall->stopAnim_maybe();
+ g_vars->scene14_flyingBall->hide();
+
+ if (g_vars->scene14_dudeIsKicking)
+ sceneHandler14_clearCallback();
+
+ if (g_vars->scene14_hitsLeft <= 1) {
+ setInputDisabled(1);
+
+ sceneHandler14_clearCallback();
+
+ g_vars->scene14_dudeCanKick = false;
+ g_fp->_aniMan2 = 0;
+
+ chainQueue(QU_SC14_WINARCADE, 1);
+
+ --g_vars->scene14_hitsLeft;
+ } else {
+ ExCommand *ex;
+
+ g_vars->scene14_grandma->changeStatics2(ST_GMA_SIT);
+
+ if (g_vars->scene14_hitsLeft != 3 || g_vars->scene14_pink) {
+ MessageQueue *mq = new MessageQueue(g_fp->_globalMessageQueueList->compact());
+
+ ex = new ExCommand(ANI_GRANDMA, 1, MV_GMA_BACKOFF, 0, 0, 0, 1, 0, 0, 0);
+ ex->_excFlags |= 2;
+ mq->addExCommandToEnd(ex);
+
+ ex = new ExCommand(ANI_GRANDMA, 1, MV_GMA_THROW, 0, 0, 0, 1, 0, 0, 0);
+ ex->_excFlags |= 2;
+ mq->addExCommandToEnd(ex);
+
+ mq->chain(0);
+ } else {
+ MessageQueue *mq = new MessageQueue(g_fp->_globalMessageQueueList->compact());
+
+ ex = new ExCommand(ANI_GRANDMA, 1, MV_GMA_BACKOFF2, 0, 0, 0, 1, 0, 0, 0);
+ ex->_excFlags |= 2;
+ mq->addExCommandToEnd(ex);
+
+ ex = new ExCommand(ANI_GRANDMA, 1, MV_GMA_THROW, 0, 0, 0, 1, 0, 0, 0);
+ ex->_excFlags |= 2;
+ mq->addExCommandToEnd(ex);
+
+ mq->chain(0);
+ }
+
+ sceneHandler14_grandmaStepForward();
+ --g_vars->scene14_hitsLeft;
+ }
+}
+
+void sceneHandler14_animateBall() {
+ int x = g_vars->scene14_ballDeltaX + g_vars->scene14_ballX;
+ int y = g_vars->scene14_ballDeltaY + g_vars->scene14_ballY;
+
+ g_vars->scene14_ballX += g_vars->scene14_ballDeltaX;
+ g_vars->scene14_ballY += g_vars->scene14_ballDeltaY;
+
+ g_vars->scene14_ballDeltaY++;
+
+ if (g_vars->scene14_ballDeltaY - 1 + g_vars->scene14_ballY > 517) {
+ if (x <= g_vars->scene14_dudeX - 16 ) {
+ if ( g_vars->scene14_ballDeltaX >= 0 || x >= g_vars->scene14_grandmaX + 65 || x <= g_vars->scene14_grandmaX - 135 || y <= g_vars->scene14_grandmaY - 102 ) {
+ if (g_vars->scene14_flyingBall->_movement)
+ g_vars->scene14_flyingBall->_movement->setOXY(x, y);
+ else
+ g_vars->scene14_flyingBall->setOXY(x, y);
+ } else {
+ sceneHandler14_arcadeLogic();
+ g_vars->scene14_ballIsFlying = false;
+ }
+ } else {
+ sceneHandler14_dudeFall();
+ g_vars->scene14_ballIsFlying = false;
+ }
+ } else {
+ sceneHandler14_passToGrandma();
+ g_vars->scene14_ballIsFlying = false;
+ }
+}
+
+int sceneHandler14(ExCommand *cmd) {
+ if (cmd->_messageKind != 17)
+ return 0;
+
+ switch(cmd->_messageNum) {
+ case MSG_SC14_SHOWBALLGMAHIT2:
+ sceneHandler14_showBallGrandmaHit2();
+ break;
+
+ case MSG_SC14_SHOWBALLGMADIVE:
+ sceneHandler14_showBallGrandmaDive();
+ break;
+
+ case MSG_LIFT_CLICKBUTTON:
+ g_fp->lift_clickButton();
+ break;
+
+ case MSG_SC14_SHOWBALLGMAHIT:
+ sceneHandler14_showBallGrandmaHit();
+ break;
+
+ case MSG_SC14_SHOWBALLMAN:
+ sceneHandler14_showBallMan();
+ break;
+
+ case MSG_SC14_MANKICKBALL:
+ sceneHandler14_manKickBall();
+ break;
+
+ case MSG_SC14_SHOWBALLFLY:
+ sceneHandler14_showBallFly();
+ break;
+
+ case MSG_LIFT_GO:
+ g_fp->lift_goAnimation();
+ break;
+
+ case MSG_SC14_GMAJUMP:
+ sceneHandler14_grandmaJump();
+ break;
+
+ case MSG_LIFT_CLOSEDOOR:
+ g_fp->lift_closedoorSeq();
+ break;
+
+ case MSG_LIFT_EXITLIFT:
+ g_fp->lift_exitSeq(cmd);
+ break;
+
+ case MSG_LIFT_STARTEXITQUEUE:
+ g_fp->lift_startExitQueue();
+ break;
+
+ case MSG_SC14_RESTORESCROLL:
+ g_fp->_aniMan2 = g_fp->_aniMan;
+ g_fp->_scrollSpeed = 8;
+ break;
+
+ case MSG_CMN_WINARCADE:
+ sceneHandler14_winArcade();
+ break;
+
+ case MSG_SC14_SCROLLLEFT:
+ g_fp->_aniMan2 = 0;
+ g_fp->_currentScene->_x = -g_fp->_sceneRect.left;
+ g_fp->_scrollSpeed = 24;
+ break;
+
+ case MSG_SC14_SHOWBALLLAST:
+ sceneHandler14_showBallLast();
+ break;
+
+ case MSG_SC14_HIDEBALLLAST:
+ sceneHandler14_hideBallLast();
+ break;
+
+ case MSG_SC14_HIDEPINK:
+ if (!g_vars->scene14_pink)
+ break;
+
+ g_vars->scene14_pink->hide();
+ break;
+
+ case MSG_SC14_GMATOTRUBA:
+ g_fp->_currentScene->_x = -g_fp->_sceneRect.left;
+ break;
+
+ case MSG_SC14_STARTARCADE:
+ sceneHandler14_startArcade();
+ break;
+
+ case MSG_SC14_ENDARCADE:
+ sceneHandler14_endArcade();
+
+ g_vars->scene14_grandmaIsHere = false;
+ break;
+
+ case 64:
+ g_fp->lift_hoverButton(cmd);
+ break;
+
+ case 33:
+ {
+ Movement *mov = g_fp->_aniMan->_movement;
+
+ if (mov) {
+ g_vars->scene14_dudeX = mov->_ox;
+ g_vars->scene14_dudeY = mov->_oy;
+
+ if (mov->_id == MV_MAN14_KICK)
+ g_vars->scene14_dudeX = mov->_ox + 2 * g_fp->_aniMan->_movement->_currDynamicPhaseIndex;
+ } else {
+ g_vars->scene14_dudeX = g_fp->_aniMan->_ox;
+ g_vars->scene14_dudeY = g_fp->_aniMan->_oy;
+ }
+
+ mov = g_vars->scene14_grandma->_movement;
+ if (mov) {
+ g_vars->scene14_grandmaX = mov->_ox;
+ g_vars->scene14_grandmaY = mov->_oy;
+ } else {
+ g_vars->scene14_grandmaX = g_vars->scene14_grandma->_ox;
+ g_vars->scene14_grandmaY = g_vars->scene14_grandma->_oy;
+ }
+
+ if (g_fp->_aniMan2) {
+ int x = g_fp->_aniMan2->_ox;
+ g_vars->scene14_dude2X = x;
+
+ if (x < g_fp->_sceneRect.left + g_vars->scene14_sceneDeltaX) {
+ g_fp->_currentScene->_x = x - g_vars->scene14_sceneDiffX - g_fp->_sceneRect.left;
+ x = g_vars->scene14_dude2X;
+ }
+
+ if (x > g_fp->_sceneRect.right - g_vars->scene14_sceneDeltaX)
+ g_fp->_currentScene->_x = x + g_vars->scene14_sceneDiffX - g_fp->_sceneRect.right;
+ }
+
+ if (g_vars->scene14_ballIsFlying)
+ sceneHandler14_animateBall();
+
+ g_fp->_behaviorManager->updateBehaviors();
+ g_fp->startSceneTrack();
+ break;
+ }
+
+ case 30:
+ if (g_vars->scene14_dudeIsKicking) {
+ sceneHandler14_kickAnimation();
+ break;
+ }
+
+ if (!g_vars->scene14_arcadeIsOn) {
+ break;
+ }
+ break;
+
+ case 29:
+ if (g_vars->scene14_arcadeIsOn) {
+ int pixel;
+
+ if (g_vars->scene14_dudeCanKick && g_fp->_aniMan->getPixelAtPos(cmd->_sceneClickX, cmd->_sceneClickY, &pixel) && !g_fp->_aniMan->_movement) {
+ sceneHandler14_dudeDecline();
+ break;
+ }
+ } else {
+ StaticANIObject *ani = g_fp->_currentScene->getStaticANIObjectAtPos(cmd->_sceneClickX, cmd->_sceneClickY);
+
+ if (ani && ani->_id == ANI_LIFTBUTTON) {
+ g_fp->lift_animateButton(ani);
+ cmd->_messageKind = 0;
+ break;
+ }
+
+ if (!sceneHandler14_arcadeProcessClick(cmd) && (!ani || !canInteractAny(g_fp->_aniMan, ani, cmd->_keyCode))) {
+ int picId = g_fp->_currentScene->getPictureObjectIdAtPos(cmd->_sceneClickX, cmd->_sceneClickY);
+
+ PictureObject *pic = g_fp->_currentScene->getPictureObjectById(picId, 0);
+
+ if (!pic || !canInteractAny(g_fp->_aniMan, pic, cmd->_keyCode)) {
+ if ((g_fp->_sceneRect.right - cmd->_sceneClickX < 47 && g_fp->_sceneRect.right < g_fp->_sceneWidth - 1)
+ || (cmd->_sceneClickX - g_fp->_sceneRect.left < 47 && g_fp->_sceneRect.left > 0)) {
+ g_fp->processArcade(cmd);
+ sceneHandler14_arcadeProcessClick(cmd);
+ break;
+ }
+ }
+ }
+ }
+ break;
+ }
+
+ return 0;
+}
+
+} // End of namespace Fullpipe
diff --git a/engines/fullpipe/scenes/scene15.cpp b/engines/fullpipe/scenes/scene15.cpp
new file mode 100644
index 0000000000..452f2edeca
--- /dev/null
+++ b/engines/fullpipe/scenes/scene15.cpp
@@ -0,0 +1,209 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ */
+
+#include "fullpipe/fullpipe.h"
+
+#include "fullpipe/objectnames.h"
+#include "fullpipe/constants.h"
+
+#include "fullpipe/gameloader.h"
+#include "fullpipe/motion.h"
+#include "fullpipe/scenes.h"
+#include "fullpipe/statics.h"
+
+#include "fullpipe/interaction.h"
+#include "fullpipe/behavior.h"
+
+
+namespace Fullpipe {
+
+void scene15_initScene(Scene *sc) {
+ g_vars->scene15_chantingCountdown = 0;
+
+ StaticANIObject *grandma = sc->getStaticANIObject1ById(ANI_GRANDMA_ASS, -1);
+
+ Scene *oldsc = g_fp->_currentScene;
+ g_fp->_currentScene = sc;
+
+ int grandmaState = g_fp->getObjectState(sO_Grandma);
+
+ if (grandmaState == g_fp->getObjectEnumState(sO_Grandma, sO_In_15)) {
+ grandma->changeStatics2(ST_GMS_BOOT);
+ grandma->setOXY(97, 399);
+ g_fp->setObjectState(sO_LeftPipe_15, g_fp->getObjectEnumState(sO_LeftPipe_15, sO_IsClosed));
+ } else if (grandmaState == g_fp->getObjectEnumState(sO_Grandma, sO_In_15_1)) {
+ grandma->changeStatics2(ST_GMS_BOOT);
+ grandma->setOXY(86, 399);
+ g_fp->setObjectState(sO_LeftPipe_15, g_fp->getObjectEnumState(sO_LeftPipe_15, sO_IsClosed));
+ } else if (grandmaState == g_fp->getObjectEnumState(sO_Grandma, sO_In_15_2)) {
+ grandma->changeStatics2(ST_GMS_BOOT);
+ grandma->setOXY(71, 399);
+ g_fp->setObjectState(sO_LeftPipe_15, g_fp->getObjectEnumState(sO_LeftPipe_15, sO_IsClosed));
+ } else if (grandmaState == g_fp->getObjectEnumState(sO_Grandma, sO_In_15_3)) {
+ grandma->changeStatics2(ST_GMS_BOOT);
+ grandma->setOXY(49, 399);
+ g_fp->setObjectState(sO_LeftPipe_15, g_fp->getObjectEnumState(sO_LeftPipe_15, sO_IsClosed));
+ } else if (grandmaState == g_fp->getObjectEnumState(sO_Grandma, sO_WithoutBoot)) {
+ grandma->changeStatics2(ST_GMS_BOOT);
+ grandma->setOXY(97, 399);
+ grandma->changeStatics2(ST_GMS_BOOTLESS2);
+ g_fp->setObjectState(sO_LeftPipe_15, g_fp->getObjectEnumState(sO_LeftPipe_15, sO_IsClosed));
+ } else {
+ grandma->hide();
+ g_fp->setObjectState(sO_LeftPipe_15, g_fp->getObjectEnumState(sO_LeftPipe_15, sO_IsOpened));
+ }
+
+ g_vars->scene15_plusminus = sc->getStaticANIObject1ById(ANI_PLUSMINUS, -1);
+
+ if (g_fp->getObjectState(sO_Guard_2) == g_fp->getObjectEnumState(sO_Guard_2, sO_Off))
+ g_vars->scene15_plusminus->_statics = g_vars->scene15_plusminus->getStaticsById(ST_PMS_MINUS);
+ else
+ g_vars->scene15_plusminus->_statics = g_vars->scene15_plusminus->getStaticsById(ST_PMS_PLUS);
+
+ g_vars->scene15_ladder = sc->getPictureObjectById(PIC_SC15_LADDER, 0);
+ g_vars->scene15_boot = sc->getStaticANIObject1ById(ANI_BOOT_15, -1);
+
+ if (g_fp->getObjectState(sO_Boot_15) != g_fp->getObjectEnumState(sO_Boot_15, sO_IsPresent))
+ g_vars->scene15_boot->_flags &= 0xFFFB;
+
+ g_fp->_currentScene = oldsc;
+
+ g_fp->lift_setButton(sO_Level5, ST_LBN_5N);
+ g_fp->lift_init(sc, QU_SC15_ENTERLIFT, QU_SC15_EXITLIFT);
+}
+
+int scene15_updateCursor() {
+ g_fp->updateCursorCommon();
+
+ if (g_fp->_cursorId == PIC_CSR_ITN && g_fp->_objectIdAtCursor == PIC_SC15_LTRUBA)
+ g_fp->_cursorId = PIC_CSR_GOL;
+
+ return g_fp->_cursorId;
+}
+
+int sceneHandler15(ExCommand *cmd) {
+ if (cmd->_messageKind != 17)
+ return 0;
+
+ switch(cmd->_messageNum) {
+ case MSG_LIFT_CLOSEDOOR:
+ g_fp->lift_closedoorSeq();
+ break;
+
+ case MSG_LIFT_EXITLIFT:
+ g_fp->lift_exitSeq(cmd);
+ break;
+
+ case MSG_LIFT_STARTEXITQUEUE:
+ g_fp->lift_startExitQueue();
+ break;
+
+ case MSG_SC4_HIDEBOOT:
+ g_vars->scene15_boot->_flags &= 0xFFFB;
+ break;
+
+ case MSG_SC15_STOPCHANTING:
+ g_fp->stopAllSoundInstances(SND_15_001);
+
+ g_vars->scene15_chantingCountdown = 120;
+ break;
+
+ case MSG_SC15_ASSDRYG:
+ if (g_fp->_rnd->getRandomNumber(1))
+ g_fp->playSound(SND_15_011, 0);
+ else
+ g_fp->playSound(SND_15_006, 0);
+
+ break;
+
+ case MSG_SC15_LADDERTOBACK:
+ g_vars->scene15_ladder->_priority = 60;
+ break;
+
+ case MSG_LIFT_GO:
+ g_fp->lift_goAnimation();
+ break;
+
+ case MSG_LIFT_CLICKBUTTON:
+ g_fp->lift_clickButton();
+ break;
+
+ case MSG_SC15_PULL:
+ if (g_vars->scene15_plusminus->_statics->_staticsId == ST_PMS_MINUS)
+ g_vars->scene15_plusminus->_statics = g_vars->scene15_plusminus->getStaticsById(ST_PMS_PLUS);
+ else
+ g_vars->scene15_plusminus->_statics = g_vars->scene15_plusminus->getStaticsById(ST_PMS_MINUS);
+
+ break;
+
+ case 64:
+ g_fp->lift_hoverButton(cmd);
+ break;
+
+ case 29:
+ {
+ if (g_fp->_currentScene->getPictureObjectIdAtPos(cmd->_sceneClickX, cmd->_sceneClickY) == PIC_SC15_LADDER) {
+ handleObjectInteraction(g_fp->_aniMan, g_fp->_currentScene->getPictureObjectById(PIC_SC15_DTRUBA, 0), cmd->_keyCode);
+ cmd->_messageKind = 0;
+
+ return 0;
+ }
+
+ StaticANIObject *ani = g_fp->_currentScene->getStaticANIObjectAtPos(cmd->_sceneClickX, cmd->_sceneClickY);
+
+ if (ani && ani->_id == ANI_LIFTBUTTON) {
+ g_fp->lift_animateButton(ani);
+
+ cmd->_messageKind = 0;
+ }
+ break;
+ }
+
+ case 30:
+ // nop
+ break;
+
+ case 33:
+ if (g_fp->_aniMan2) {
+ int x = g_fp->_aniMan2->_ox;
+
+ if (x < g_fp->_sceneRect.left + 200)
+ g_fp->_currentScene->_x = x - 300 - g_fp->_sceneRect.left;
+
+ if (x > g_fp->_sceneRect.right - 200)
+ g_fp->_currentScene->_x = x + 300 - g_fp->_sceneRect.right;
+ }
+
+ if (g_vars->scene15_chantingCountdown > 0) {
+ g_vars->scene15_chantingCountdown--;
+
+ if (!g_vars->scene15_chantingCountdown)
+ g_fp->playSound(SND_15_001, 1);
+ }
+
+ g_fp->_behaviorManager->updateBehaviors();
+ }
+
+ return 0;
+}
+
+} // End of namespace Fullpipe
diff --git a/engines/fullpipe/scenes/scene16.cpp b/engines/fullpipe/scenes/scene16.cpp
new file mode 100644
index 0000000000..ed3c51a6c2
--- /dev/null
+++ b/engines/fullpipe/scenes/scene16.cpp
@@ -0,0 +1,484 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public 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 "fullpipe/fullpipe.h"
+
+#include "fullpipe/objectnames.h"
+#include "fullpipe/constants.h"
+
+#include "fullpipe/gameloader.h"
+#include "fullpipe/motion.h"
+#include "fullpipe/scenes.h"
+#include "fullpipe/statics.h"
+
+#include "fullpipe/interaction.h"
+#include "fullpipe/behavior.h"
+
+
+namespace Fullpipe {
+
+void scene16_initScene(Scene *sc) {
+ g_vars->scene16_figures.clear();
+ g_vars->scene16_walkingBoy = 0;
+ g_vars->scene16_walkingGirl = 0;
+ g_vars->scene16_walkingCount = 200;
+ g_vars->scene16_wire = sc->getStaticANIObject1ById(ANI_WIRE16, -1);
+ g_vars->scene16_mug = sc->getStaticANIObject1ById(ANI_MUG, -1);
+ g_vars->scene16_jettie = sc->getStaticANIObject1ById(ANI_JETTIE, -1);
+ g_vars->scene16_boot = sc->getStaticANIObject1ById(ANI_BOOT_16, -1);
+ g_vars->scene16_girlIsLaughing = false;
+ g_vars->scene16_sound = SND_16_034;
+
+ if (g_fp->getObjectState(sO_Bridge) == g_fp->getObjectEnumState(sO_Bridge, sO_Convoluted)) {
+ g_vars->scene16_placeIsOccupied = true;
+
+ StaticANIObject *boy[2];
+ boy[0] = sc->getStaticANIObject1ById(ANI_BOY, -1);
+ boy[0]->loadMovementsPixelData();
+
+ boy[1] = new StaticANIObject(boy[0]);
+ sc->addStaticANIObject(boy[1], 1);
+
+ int idx = 0;
+
+ for (int i = 0; i < 3; i++) {
+ g_vars->scene16_figures.push_back(boy[idx]);
+
+ idx++;
+
+ if (idx >= 2)
+ idx = 0;
+ }
+
+ g_vars->scene16_figures.push_back(sc->getStaticANIObject1ById(ANI_GIRL, -1));
+
+ for (int i = 0; i < 4; i++) {
+ g_vars->scene16_figures.push_back(boy[idx]);
+
+ idx++;
+
+ if (idx >= 2)
+ idx = 0;
+ }
+ } else {
+ g_fp->setObjectState(sO_Girl, g_fp->getObjectEnumState(sO_Girl, sO_IsSwinging));
+
+ g_vars->scene16_placeIsOccupied = false;
+
+ StaticANIObject *ani = new StaticANIObject(g_fp->accessScene(SC_COMMON)->getStaticANIObject1ById(ANI_BEARDED_CMN, -1));
+ ani->_movement = 0;
+ ani->_statics = (Statics *)ani->_staticsList[0];
+ sc->addStaticANIObject(ani, 1);
+ }
+
+ if (g_fp->getObjectState(sO_Girl) == g_fp->getObjectEnumState(sO_Girl, sO_IsLaughing)) {
+ StaticANIObject *girl = sc->getStaticANIObject1ById(ANI_GIRL, -1);
+
+ girl->show1(554, 432, MV_GRL_LAUGH_POPA, 0);
+ girl->_priority = 20;
+ }
+
+ if (g_fp->getObjectState(sO_Cup) == g_fp->getObjectEnumState(sO_Cup, sO_In_16)) {
+ g_vars->scene16_mug->_statics = g_vars->scene16_mug->getStaticsById(ST_MUG_EMPTY);
+ g_vars->scene16_mug->_movement = 0;
+ g_vars->scene16_mug->setOXY(409, 459);
+ g_vars->scene16_mug->_priority = 5;
+ g_vars->scene16_mug->_flags |= 4;
+ }
+}
+
+int scene16_updateCursor() {
+ g_fp->updateCursorCommon();
+
+ if (g_fp->_objectIdAtCursor == PIC_SC16_TUMBA) {
+ if (g_fp->_cursorId == PIC_CSR_DEFAULT)
+ g_fp->_cursorId = PIC_CSR_ITN;
+ } else {
+ if (g_fp->_objectIdAtCursor == ANI_MUG && g_fp->_cursorId == PIC_CSR_ITN && g_vars->scene16_mug->_statics->_staticsId == ST_MUG_FULL)
+ g_fp->_cursorId = PIC_CSR_ITN_GREEN;
+ }
+
+ return g_fp->_cursorId;
+}
+
+void sceneHandler16_laughSound() {
+ int snd = SND_16_035;
+
+ switch (g_vars->scene16_sound) {
+ case SND_16_034:
+ snd = SND_16_035;
+ break;
+
+ case SND_16_035:
+ snd = SND_16_037;
+ break;
+
+ case SND_16_037:
+ snd = SND_16_034;
+ break;
+ }
+
+ g_vars->scene16_sound = snd;
+
+ g_fp->playSound(snd, 0);
+}
+
+void sceneHandler16_showBearded() {
+ if (g_fp->getObjectState(sO_Bridge) == g_fp->getObjectEnumState(sO_Bridge, sO_Unconvoluted)) {
+ StaticANIObject *brd = g_fp->_currentScene->getStaticANIObject1ById(ANI_BEARDED_CMN, -1);
+
+ if (!brd || !(brd->_flags & 4))
+ chainQueue(QU_BRD16_STARTBEARDED, 0);
+ }
+}
+
+void sceneHandler16_showMugFull() {
+ g_vars->scene16_mug->changeStatics2(ST_MUG_FULL);
+}
+
+void sceneHandler16_fillMug() {
+ if (g_vars->scene16_mug->_flags & 4) {
+ g_vars->scene16_jettie->_priority = 2;
+ g_vars->scene16_jettie->startAnim(MV_JTI_FLOWIN, 0, -1);
+
+ if (g_fp->_aniMan->_movement) {
+ if (g_fp->_aniMan->_movement->_id == MV_MAN16_TAKEMUG) {
+ g_fp->_aniMan->changeStatics2(ST_MAN_RIGHT);
+
+ g_vars->scene16_mug->show1(-1, -1, -1, 0);
+
+ g_fp->setObjectState(sO_Cup, g_fp->getObjectEnumState(sO_Cup, sO_DudeHas));
+ }
+ }
+ return;
+ }
+
+ MessageQueue *mq;
+
+ if (!(g_vars->scene16_boot->_flags & 4)) {
+ g_vars->scene16_jettie->_priority = 15;
+ g_vars->scene16_jettie->startAnim(MV_JTI_FLOWBY, 0, -1);
+
+ if (g_vars->scene16_walkingBoy) {
+ mq = new MessageQueue(g_fp->_currentScene->getMessageQueueById(QU_SC16_BOYOUT), 0, 1);
+
+ mq->replaceKeyCode(-1, g_vars->scene16_walkingBoy->_okeyCode);
+ if (!mq || mq->chain(g_vars->scene16_walkingBoy))
+ return;
+ } else {
+ if (!g_vars->scene16_walkingGirl)
+ return;
+
+ mq = new MessageQueue(g_fp->_currentScene->getMessageQueueById(QU_SC16_GIRLOUT), 0, 1);
+
+ mq->replaceKeyCode(-1, g_vars->scene16_walkingGirl->_okeyCode);
+ if (mq->chain(g_vars->scene16_walkingGirl))
+ return;
+ }
+ delete mq;
+
+ return;
+ }
+
+ g_vars->scene16_jettie->_priority = 15;
+
+ g_vars->scene16_boot->startAnim(MV_BT16_FILL, 0, -1);
+
+ StaticANIObject *ani;
+
+ if (g_vars->scene16_walkingBoy) {
+ mq = new MessageQueue(g_fp->_currentScene->getMessageQueueById(QU_SC16_BOYOUT), 0, 1);
+
+ mq->replaceKeyCode(-1, g_vars->scene16_walkingBoy->_okeyCode);
+
+ ani = g_vars->scene16_walkingBoy;
+ } else {
+ if (!g_vars->scene16_walkingGirl)
+ return;
+
+ mq = new MessageQueue(g_fp->_currentScene->getMessageQueueById(QU_SC16_GIRLOUT), 0, 1);
+
+ mq->replaceKeyCode(-1, g_vars->scene16_walkingGirl->_okeyCode);
+ ani = g_vars->scene16_walkingGirl;
+ }
+
+ if (!mq->chain(ani))
+ delete mq;
+}
+
+void sceneHandler16_startLaugh() {
+ StaticANIObject *girl = g_fp->_currentScene->getStaticANIObject1ById(ANI_GIRL, -1);
+
+ girl->changeStatics2(ST_GRL_STAND);
+
+ MessageQueue *mq = new MessageQueue(g_fp->_currentScene->getMessageQueueById(QU_SC16_GIRLLAUGH), 0, 1);
+
+ mq->replaceKeyCode(-1, girl->_okeyCode);
+ mq->setFlags(mq->getFlags() | 1);
+ mq->chain(0);
+
+ g_fp->getGameLoaderGameVar()->getSubVarByName("OBJSTATES")->setSubVarAsInt(sO_DudeSwinged, 0);
+
+ g_vars->scene16_girlIsLaughing = true;
+}
+
+void sceneHandler16_drink() {
+ if (g_vars->scene16_mug->_flags & 4) {
+ if (!g_vars->scene16_jettie->_movement) {
+ if (!g_vars->scene16_walkingBoy || !g_vars->scene16_walkingBoy->_movement || g_vars->scene16_walkingBoy->_movement->_id != MV_BOY_DRINK) {
+ if (!g_vars->scene16_walkingGirl || !g_vars->scene16_walkingGirl->_movement || g_vars->scene16_walkingGirl->_movement->_id != MV_GRL_DRINK) {
+ if (g_vars->scene16_mug->_statics->_staticsId == ST_MUG_FULL) {
+ MessageQueue *mq;
+ ExCommand *ex;
+
+ if (g_vars->scene16_walkingBoy) {
+ g_fp->_aniMan->_flags |= 0x180;
+
+ g_vars->scene16_walkingBoy->changeStatics2(ST_BOY_STAND);
+ g_vars->scene16_walkingBoy->queueMessageQueue(0);
+
+ mq = new MessageQueue(g_fp->_currentScene->getMessageQueueById(QU_SC16_BOYKICK), 0, 1);
+
+ mq->replaceKeyCode(-1, g_vars->scene16_walkingBoy->_okeyCode);
+
+ ex = new ExCommand(ANI_MAN, 34, 384, 0, 0, 0, 1, 0, 0, 0);
+ ex->_excFlags |= 3u;
+ ex->_field_14 = 384;
+ ex->_messageNum = 0;
+
+ mq->insertExCommandAt(2, ex);
+ mq->setFlags(mq->getFlags() | 1);
+ mq->chain(0);
+ } else {
+ g_fp->_aniMan->_flags |= 1;
+
+ mq = new MessageQueue(g_fp->_currentScene->getMessageQueueById(QU_SC16_MANDRINK), 0, 1);
+
+ ex = new ExCommand(ANI_MAN, 34, 256, 0, 0, 0, 1, 0, 0, 0);
+ ex->_excFlags |= 3u;
+ ex->_field_14 = 256;
+ ex->_messageNum = 0;
+
+ mq->addExCommandToEnd(ex);
+ mq->setFlags(mq->getFlags() | 1);
+ mq->chain(0);
+
+ g_fp->_currentScene->getStaticANIObject1ById(ANI_GIRL, -1)->changeStatics2(ST_GRL_STAND);
+ }
+
+ g_fp->_currentScene->getStaticANIObject1ById(ANI_WIRE16, -1)->show1(-1, -1, -1, 0);
+ } else {
+ chainObjQueue(g_fp->_aniMan, QU_SC16_TAKEMUG, 1);
+ }
+ }
+ }
+ }
+ }
+}
+
+void sceneHandler16_mugClick() {
+ if (abs(310 - g_fp->_aniMan->_ox) >= 1 || abs(449 - g_fp->_aniMan->_oy) >= 1
+ || g_fp->_aniMan->_movement || g_fp->_aniMan->_statics->_staticsId != ST_MAN_RIGHT) {
+ MessageQueue *mq = getCurrSceneSc2MotionController()->method34(g_fp->_aniMan, 310, 449, 1, ST_MAN_RIGHT);
+
+ if (mq) {
+ ExCommand *ex = new ExCommand(0, 17, MSG_SC16_MUGCLICK, 0, 0, 0, 1, 0, 0, 0);
+ ex->_excFlags = 2;
+ mq->addExCommandToEnd(ex);
+
+ postExCommand(g_fp->_aniMan->_id, 2, 310, 449, 0, -1);
+ }
+ } else {
+ sceneHandler16_drink();
+ }
+}
+
+void sceneHandler16_showMan() {
+ g_fp->_aniMan->changeStatics2(ST_MAN_RIGHT);
+ g_fp->_aniMan->show1(-1, -1, -1, 0);
+
+ g_vars->scene16_mug->show1(-1, -1, -1, 0);
+}
+
+void sceneHandler16_showMug() {
+ chainQueue(QU_SC16_SHOWMUG, 0);
+}
+
+void sceneHandler16_hideMan() {
+ g_fp->_aniMan->changeStatics2(ST_MAN_RIGHT);
+ g_fp->_aniMan->hide();
+
+ g_vars->scene16_mug->hide();
+}
+
+void sceneHandler16_hideMug() {
+ g_vars->scene16_mug->hide();
+}
+
+void sceneHandler16_hideWire() {
+ g_vars->scene16_wire->hide();
+}
+
+void sceneHandler16_showWire() {
+ g_vars->scene16_wire->show1(-1, -1, -1, 0);
+}
+
+void sceneHandler16_putOnWheel() {
+ StaticANIObject *ani = g_vars->scene16_walkingBoy;
+
+ if (!ani)
+ ani = g_vars->scene16_walkingGirl;
+
+ if (ani)
+ g_vars->scene16_figures.push_back(ani);
+
+ ani = g_vars->scene16_figures.front();
+
+ g_vars->scene16_figures.pop_front();
+
+ if (ani) {
+ MessageQueue *mq;
+
+ if (ani->_id == ANI_BOY) {
+ mq = new MessageQueue(g_fp->_currentScene->getMessageQueueById(QU_SC16_GOBOY), 0, 1);
+
+ mq->replaceKeyCode(-1, ani->_okeyCode);
+ mq->chain(0);
+
+ g_vars->scene16_walkingBoy = ani;
+ g_vars->scene16_walkingGirl = 0;
+ } else if (ani->_id == ANI_GIRL) {
+ if (g_fp->getObjectState(sO_Girl) == g_fp->getObjectEnumState(sO_Girl, sO_IsSwinging)) {
+ mq = new MessageQueue(g_fp->_currentScene->getMessageQueueById(QU_SC16_GOGIRL), 0, 1);
+
+ mq->replaceKeyCode(-1, ani->_okeyCode);
+ mq->chain(0);
+
+ g_vars->scene16_walkingBoy = 0;
+ g_vars->scene16_walkingGirl = ani;
+ }
+ }
+ }
+}
+
+void sceneHandler16_girlROTFL() {
+ StaticANIObject *girl = g_fp->_currentScene->getStaticANIObject1ById(ANI_GIRL, -1);
+
+ girl->changeStatics2(ST_GRL_LAUGH);
+ girl->startAnim(MV_GRL_FALL, 0, -1);
+
+ g_vars->scene16_girlIsLaughing = false;
+}
+
+int sceneHandler16(ExCommand *cmd) {
+ if (cmd->_messageKind != 17)
+ return 0;
+
+ switch(cmd->_messageNum) {
+ case MSG_SC16_LAUGHSOUND:
+ sceneHandler16_laughSound();
+ break;
+
+ case MSG_SC16_SHOWBEARDED:
+ sceneHandler16_showBearded();
+ break;
+
+ case MSG_SC16_SHOWMUGFULL:
+ sceneHandler16_showMugFull();
+ break;
+
+ case MSG_SC16_FILLMUG:
+ sceneHandler16_fillMug();
+ break;
+
+ case MSG_SC16_STARTLAUGH:
+ sceneHandler16_startLaugh();
+ break;
+
+ case MSG_SC16_MUGCLICK:
+ if (!g_fp->_aniMan->isIdle() || g_fp->_aniMan->_flags & 0x100)
+ cmd->_messageKind = 0;
+ else
+ sceneHandler16_mugClick();
+
+ break;
+
+ case MSG_SC16_SHOWMAN:
+ sceneHandler16_showMan();
+ break;
+
+ case MSG_SC16_SHOWMUG:
+ sceneHandler16_showMug();
+ break;
+
+ case MSG_SC16_HIDEMAN:
+ sceneHandler16_hideMan();
+ break;
+
+ case MSG_SC16_HIDEMUG:
+ sceneHandler16_hideMug();
+ break;
+
+ case MSG_SC16_HIDEWIRE:
+ sceneHandler16_hideWire();
+ break;
+
+ case MSG_SC16_SHOWWIRE:
+ sceneHandler16_showWire();
+ break;
+
+ case 33:
+ if (g_fp->_aniMan2) {
+ int x = g_fp->_aniMan2->_ox;
+
+ if (x < g_fp->_sceneRect.left + 200)
+ g_fp->_currentScene->_x = x - 300 - g_fp->_sceneRect.left;
+
+ if (x > g_fp->_sceneRect.right - 200)
+ g_fp->_currentScene->_x = x + 300 - g_fp->_sceneRect.right;
+ }
+
+ if (g_vars->scene16_placeIsOccupied) {
+ g_vars->scene16_walkingCount++;
+
+ if (g_vars->scene16_walkingCount < 280) {
+ sceneHandler16_putOnWheel();
+
+ g_vars->scene16_walkingCount = 0;
+ }
+ }
+
+ if (g_vars->scene16_girlIsLaughing) {
+ if (g_fp->_aniMan->_movement)
+ if (g_fp->_aniMan->_movement->_id == MV_MAN_TURN_RL)
+ sceneHandler16_girlROTFL();
+ }
+
+ g_fp->_behaviorManager->updateBehaviors();
+ g_fp->startSceneTrack();
+
+ }
+
+ return 0;
+}
+
+} // End of namespace Fullpipe
diff --git a/engines/fullpipe/scenes/scene17.cpp b/engines/fullpipe/scenes/scene17.cpp
new file mode 100644
index 0000000000..d40f8cf816
--- /dev/null
+++ b/engines/fullpipe/scenes/scene17.cpp
@@ -0,0 +1,285 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public 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 "fullpipe/fullpipe.h"
+
+#include "fullpipe/objectnames.h"
+#include "fullpipe/constants.h"
+
+#include "fullpipe/gameloader.h"
+#include "fullpipe/motion.h"
+#include "fullpipe/scenes.h"
+#include "fullpipe/statics.h"
+
+#include "fullpipe/interaction.h"
+#include "fullpipe/behavior.h"
+#include "fullpipe/floaters.h"
+
+namespace Fullpipe {
+
+void scene17_initScene(Scene *sc) {
+ g_vars->scene17_flyState = 1;
+ g_vars->scene17_sugarIsShown = false;
+ g_vars->scene17_sceneOldEdgeX = 0;
+ g_vars->scene17_flyCountdown = 0;
+ g_vars->scene17_hand = sc->getStaticANIObject1ById(ANI_HAND17, -1);
+}
+
+void scene17_restoreState() {
+ if (g_fp->getObjectState(sO_UsherHand) == g_fp->getObjectEnumState(sO_UsherHand, sO_WithCoin)) {
+ g_fp->_behaviorManager->setBehaviorEnabled(g_vars->scene17_hand, ST_HND17_EMPTY, QU_HND17_ASK, 0);
+ g_fp->_behaviorManager->setBehaviorEnabled(g_vars->scene17_hand, ST_HND17_EMPTY, QU_HND17_TOCYCLE, 0);
+
+ g_vars->scene17_handPhase = false;
+ } else {
+ g_fp->_behaviorManager->setBehaviorEnabled(g_vars->scene17_hand, ST_HND17_EMPTY, QU_HND17_ASK, 0);
+ g_fp->_behaviorManager->setBehaviorEnabled(g_vars->scene17_hand, ST_HND17_EMPTY, QU_HND17_TOCYCLE, 1);
+
+ g_vars->scene17_handPhase = true;
+ }
+
+ g_fp->_floaters->init(g_fp->getGameLoaderGameVar()->getSubVarByName("SC_17"));
+
+ g_vars->scene17_flyState = g_fp->getObjectState(sO_Fly_17);
+
+ if (g_vars->scene17_flyState <= 0 ) {
+ g_vars->scene17_flyCountdown = g_fp->_rnd->getRandomNumber(600) + 600;
+
+ g_vars->scene17_flyState = g_fp->_rnd->getRandomNumber(4) + 1;
+ }
+
+ g_fp->setObjectState(sO_Fly_17, g_vars->scene17_flyState - 1);
+}
+
+int scene17_updateCursor() {
+ g_fp->updateCursorCommon();
+
+ if (g_fp->_objectIdAtCursor != PIC_SC17_RTRUBA2 && g_fp->_objectIdAtCursor != PIC_SC17_RTRUBA)
+ return g_fp->_cursorId;
+
+ if (!g_vars->scene17_handPhase)
+ return g_fp->_cursorId;
+
+ int item = g_fp->_inventory->getSelectedItemId();
+
+ if ((g_fp->_cursorId != PIC_CSR_DEFAULT_INV || item != ANI_INV_COIN) && item != ANI_INV_BOOT && item != ANI_INV_HAMMER)
+ ; // empty
+ else
+ g_fp->_cursorId = PIC_CSR_ITN_INV;
+
+ return g_fp->_cursorId;
+}
+
+void sceneHandler17_drop() {
+ StaticANIObject *mug = g_fp->_currentScene->getStaticANIObject1ById(ANI_MUG_17, -1);
+ StaticANIObject *jet = g_fp->_currentScene->getStaticANIObject1ById(ANI_JET_17, -1);
+
+ if (mug && mug->_flags & 4) {
+ mug->changeStatics2(ST_MUG17_EMPTY);
+ chainQueue(QU_SC17_FILLMUG_DROP, 0);
+ } else if (jet) {
+ jet->queueMessageQueue(0);
+ chainQueue(QU_JET17_DROP, 0);
+ }
+}
+
+void sceneHandler17_fillBottle() {
+ StaticANIObject *bottle = g_fp->_currentScene->getStaticANIObject1ById(ANI_INV_BOTTLE, -1);
+ StaticANIObject *mug = g_fp->_currentScene->getStaticANIObject1ById(ANI_MUG_17, -1);
+ StaticANIObject *boot = g_fp->_currentScene->getStaticANIObject1ById(ANI_BOOT_17, -1);
+
+ if (bottle && (bottle->_flags & 4))
+ chainQueue(QU_SC17_FILLBOTTLE, 1);
+ else if (mug && (mug->_flags & 4) && mug->_statics->_staticsId == ST_MUG17_EMPTY)
+ chainQueue(QU_SC17_FILLMUG, 1);
+ else if (boot && (boot->_flags & 4))
+ chainQueue(QU_SC17_FILLBOOT, 1);
+ else
+ chainQueue(QU_JET17_FLOW, 1);
+}
+
+void sceneHandler17_testTruba() {
+ if (g_vars->scene17_hand->isIdle()) {
+ if (!g_vars->scene17_hand->_movement || g_vars->scene17_hand->_movement->_id != MV_HND17_FIGA) {
+ g_vars->scene17_hand->changeStatics2(ST_HND17_EMPTY);
+ g_vars->scene17_hand->startAnim(MV_HND17_FIGA, 0, -1);
+ }
+ }
+}
+
+void sceneHandler17_showBottle() {
+ chainQueue(QU_SC17_SHOWBOTTLE, 0);
+}
+
+void sceneHandler17_hideSugar() {
+ StaticANIObject *sugar = g_fp->_currentScene->getStaticANIObject1ById(ANI_INV_SUGAR, -1);
+
+ if (sugar)
+ sugar->hide();
+}
+
+void sceneHandler17_showSugar() {
+ chainQueue(QU_SC17_SHOWSUGAR, 0);
+
+ g_vars->scene17_sugarIsShown = true;
+}
+
+void sceneHandler17_moonshineFill() {
+ StaticANIObject *moonshiner = g_fp->_currentScene->getStaticANIObject1ById(ANI_SAMOGONSHCHIK, -1);
+
+ if (!(moonshiner->_flags & 0x80)) {
+ moonshiner->changeStatics2(ST_SMG_SIT);
+ chainObjQueue(moonshiner, QU_SMG_FILLBOTTLE, 1);
+
+ g_vars->scene17_sugarIsShown = false;
+ }
+}
+
+void sceneHandler17_updateFlies() {
+ g_fp->_floaters->genFlies(g_fp->_currentScene, 239, -50, 20, 4);
+
+ g_fp->_floaters->_array2[0]->countdown = g_fp->_rnd->getRandomNumber(5) + 6;
+ g_fp->_floaters->_array2[0]->val6 = 239;
+ g_fp->_floaters->_array2[0]->val7 = -50;
+}
+
+
+int sceneHandler17(ExCommand *cmd) {
+ if (cmd->_messageKind != 17)
+ return 0;
+
+ switch (cmd->_messageNum) {
+ case MSG_SC17_DROP:
+ sceneHandler17_drop();
+ break;
+
+ case MSG_SC17_UPDATEHAND:
+ if (g_fp->getObjectState(sO_UsherHand) == g_fp->getObjectEnumState(sO_UsherHand, sO_WithCoin)) {
+ g_fp->_behaviorManager->setBehaviorEnabled(g_vars->scene17_hand, ST_HND17_EMPTY, QU_HND17_ASK, 0);
+ g_fp->_behaviorManager->setBehaviorEnabled(g_vars->scene17_hand, ST_HND17_EMPTY, QU_HND17_TOCYCLE, 0);
+
+ g_vars->scene17_handPhase = false;
+ } else {
+ g_fp->_behaviorManager->setBehaviorEnabled(g_vars->scene17_hand, ST_HND17_EMPTY, QU_HND17_ASK, 0);
+ g_fp->_behaviorManager->setBehaviorEnabled(g_vars->scene17_hand, ST_HND17_EMPTY, QU_HND17_TOCYCLE, 1);
+
+ g_vars->scene17_handPhase = true;
+ }
+ break;
+
+ case MSG_SC17_FILLBOTTLE:
+ sceneHandler17_fillBottle();
+ break;
+
+ case MSG_SC17_TESTTRUBA:
+ sceneHandler17_testTruba();
+ break;
+
+ case MSG_SC17_SHOWBOTTLE:
+ sceneHandler17_showBottle();
+ break;
+
+ case MSG_SC17_HIDESUGAR:
+ sceneHandler17_hideSugar();
+ break;
+
+ case MSG_SC17_SHOWSUGAR:
+ sceneHandler17_showSugar();
+ break;
+
+ case 29:
+ {
+ int pic = g_fp->_currentScene->getPictureObjectIdAtPos(cmd->_sceneClickX, cmd->_sceneClickY);
+
+ if (pic == PIC_SC17_RTRUBA2 || pic == PIC_SC17_RTRUBA) {
+ if (cmd->_keyCode == ANI_INV_COIN || cmd->_keyCode == ANI_INV_BOOT || cmd->_keyCode == ANI_INV_HAMMER) {
+ if (g_vars->scene17_handPhase) {
+ if (g_fp->_aniMan->isIdle()) {
+ if (!(g_fp->_aniMan->_flags & 0x100)) {
+ handleObjectInteraction(g_fp->_aniMan, g_vars->scene17_hand, cmd->_keyCode);
+ break;
+ }
+ }
+ }
+ }
+ }
+ }
+ break;
+
+ case 33:
+ {
+ int x = g_vars->scene17_sceneEdgeX;
+ g_vars->scene17_sceneOldEdgeX = g_vars->scene17_sceneEdgeX;
+
+ if (g_fp->_aniMan2) {
+ x = g_fp->_aniMan2->_ox;
+
+ g_vars->scene17_sceneEdgeX = x;
+
+ if (x < g_fp->_sceneRect.left + 200) {
+ g_fp->_currentScene->_x = x - 300 - g_fp->_sceneRect.left;
+
+ x = g_vars->scene17_sceneEdgeX;
+ }
+
+ if (x > g_fp->_sceneRect.right - 200) {
+ g_fp->_currentScene->_x = x + 300 - g_fp->_sceneRect.right;
+ x = g_vars->scene17_sceneEdgeX;
+ }
+ }
+
+ if (g_vars->scene17_sugarIsShown) {
+ sceneHandler17_moonshineFill();
+ x = g_vars->scene17_sceneEdgeX;
+ }
+
+ if (g_vars->scene17_handPhase) {
+ if (g_vars->scene17_sceneOldEdgeX < 410 && x >= 410) {
+ g_fp->_behaviorManager->setBehaviorEnabled(g_vars->scene17_hand, ST_HND17_EMPTY, QU_HND17_TOCYCLE, 0);
+ g_fp->_behaviorManager->setBehaviorEnabled(g_vars->scene17_hand, ST_HND17_ATTRACT, QU_HND17_ATTRACT, 0);
+ g_fp->_behaviorManager->setBehaviorEnabled(g_vars->scene17_hand, ST_HND17_EMPTY, QU_HND17_ASK, 1);
+ } else if (g_vars->scene17_sceneOldEdgeX > 410 && x <= 410) {
+ g_fp->_behaviorManager->setBehaviorEnabled(g_vars->scene17_hand, ST_HND17_EMPTY, QU_HND17_TOCYCLE, 1);
+ g_fp->_behaviorManager->setBehaviorEnabled(g_vars->scene17_hand, ST_HND17_ATTRACT, QU_HND17_ATTRACT, 1);
+ g_fp->_behaviorManager->setBehaviorEnabled(g_vars->scene17_hand, ST_HND17_EMPTY, QU_HND17_ASK, 0);
+ }
+ }
+
+ --g_vars->scene17_flyCountdown;
+
+ if (!g_vars->scene17_flyCountdown)
+ sceneHandler17_updateFlies();
+
+ g_fp->_floaters->update();
+
+ g_fp->_behaviorManager->updateBehaviors();
+
+ g_fp->startSceneTrack();
+
+ break;
+ }
+ }
+
+ return 0;
+}
+
+} // End of namespace Fullpipe
diff --git a/engines/fullpipe/scenes/scene18and19.cpp b/engines/fullpipe/scenes/scene18and19.cpp
new file mode 100644
index 0000000000..4f6677876b
--- /dev/null
+++ b/engines/fullpipe/scenes/scene18and19.cpp
@@ -0,0 +1,932 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public 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 "fullpipe/fullpipe.h"
+
+#include "fullpipe/objectnames.h"
+#include "fullpipe/constants.h"
+
+#include "fullpipe/gameloader.h"
+#include "fullpipe/motion.h"
+#include "fullpipe/scenes.h"
+#include "fullpipe/statics.h"
+
+#include "fullpipe/interaction.h"
+#include "fullpipe/behavior.h"
+
+
+namespace Fullpipe {
+
+struct Swinger {
+ StaticANIObject *ani;
+ int sfield_4;
+ double angle;
+ int sx;
+ int sy;
+ int ix;
+ int iy;
+ int sflags;
+ int sfield_24;
+};
+
+
+#define ANGLE(x) ((x) * M_PI / 180)
+
+void scene18_preload() {
+ g_fp->_scene3 = 0;
+
+ for (SceneTagList::iterator s = g_fp->_gameProject->_sceneTagList->begin(); s != g_fp->_gameProject->_sceneTagList->end(); ++s) {
+ if (s->_sceneId == SC_18) {
+ g_fp->_scene3 = s->_scene;
+ s->_scene = 0;
+
+ g_fp->_scene3->getStaticANIObject1ById(ANI_WHIRLIGIG_18, -1)->freeMovementsPixelData();
+
+ break;
+ }
+ }
+}
+
+void scene18_setupEntrance() {
+ GameVar *var = g_fp->getGameLoaderGameVar()->getSubVarByName("OBJSTATES")->getSubVarByName("SAVEGAME");
+
+ if (var->getSubVarAsInt("Entrance") == TrubaRight)
+ var->setSubVarAsInt("Entrance", TrubaLeft);
+}
+
+void scene19_setSugarState(Scene *sc) {
+ if (g_fp->getObjectState(sO_Sugar) != g_fp->getObjectEnumState(sO_Sugar, sO_Present)) {
+ Scene *oldsc = g_fp->_currentScene;
+
+ g_fp->_currentScene = sc;
+ sc->getStaticANIObject1ById(ANI_CORDIE, -1)->changeStatics2(ST_CDI_EMPTY2);
+ g_fp->_currentScene = oldsc;
+ }
+}
+
+void scene19_setMovements(Scene *sc, int entranceId) {
+ if (entranceId == TrubaRight) {
+ g_vars->scene18_enteredTrubaRight = true;
+ } else {
+ g_vars->scene18_enteredTrubaRight = false;
+ g_vars->scene19_enteredTruba3 = (entranceId == PIC_SC19_RTRUBA3);
+ }
+
+ for (uint i = 0; i < g_vars->scene18_swingers.size(); i++) {
+ if (!g_vars->scene18_enteredTrubaRight && (g_vars->scene18_swingers[i]->sflags & 0x20)) {
+ Scene *oldsc = g_fp->_currentScene;
+
+ g_vars->scene18_swingers[i]->sflags = 1;
+
+ g_fp->_currentScene = sc;
+ g_vars->scene18_swingers[i]->ani->changeStatics2(ST_KSL_NORM);
+ g_vars->scene18_swingers[i]->ani->_priority = 30;
+ g_fp->_currentScene = oldsc;
+ }
+
+ sc->deleteStaticANIObject(g_vars->scene18_swingers[i]->ani);
+ }
+
+ if (g_vars->scene18_whirlgig->_movement) {
+ g_vars->scene18_whirlgigMovMum = g_vars->scene18_whirlgig->_movement->_currDynamicPhaseIndex + 1;
+
+ int mx;
+
+ if (g_vars->scene18_whirlgig->_movement->_currMovement)
+ mx = g_vars->scene18_whirlgig->_movement->_currMovement->_dynamicPhases.size();
+ else
+ mx = g_vars->scene18_whirlgig->_movement->_dynamicPhases.size();
+
+ if (g_vars->scene18_whirlgigMovMum > mx - 1)
+ g_vars->scene18_whirlgigMovMum = -1;
+ } else {
+ g_vars->scene18_whirlgigMovMum = 0;
+ }
+
+ sc->deleteStaticANIObject(g_vars->scene18_boy);
+ sc->deleteStaticANIObject(g_vars->scene18_girl);
+ sc->stopAllSounds();
+}
+
+void scene19_preload() {
+ for (SceneTagList::iterator s = g_fp->_gameProject->_sceneTagList->begin(); s != g_fp->_gameProject->_sceneTagList->end(); ++s) {
+ if (s->_sceneId == SC_18) {
+ s->_scene = g_fp->_scene3;
+
+ break;
+ }
+ }
+}
+
+void scene18_setupSwingers(StaticANIObject *ani, Scene *sc) {
+ Swinger *swinger;
+
+ g_vars->scene18_swingers.clear();
+
+ Scene *oldsc = g_fp->_currentScene;
+ g_fp->_currentScene = sc;
+
+ for (int i = 0; i < 8; i++) {
+ swinger = new Swinger;
+
+ swinger->angle = (double)i * ANGLE(45);
+ swinger->sx = g_vars->scene18_wheelCenterX - (int)(cos(swinger->angle) * -575.0);
+ swinger->sy = g_vars->scene18_wheelCenterY - (int)(sin(swinger->angle) * -575.0) + 87;
+ swinger->ix = swinger->sx;
+ swinger->iy = swinger->sy;
+
+ if (i) {
+ StaticANIObject *newani = new StaticANIObject(ani);
+
+ ani = newani;
+
+ swinger->ani = newani;
+ swinger->sflags = 2;
+
+ sc->addStaticANIObject(newani, 1);
+ } else {
+ swinger->ani = ani;
+ swinger->sflags = g_vars->scene18_girlIsSwinging ? 4 : 1;
+ }
+
+ ani->_statics = ani->getStaticsById(ST_KSL_NORM);
+ //ani->_movement = 0;
+ ani->setOXY(swinger->sx, swinger->sy);
+ ani->_priority = 30;
+ ani->_flags |= 4;
+
+ if (swinger->sflags & 2)
+ ani->startAnim(MV_KSL_SWINGBOY, 0, -1);
+ else if (swinger->sflags & 4)
+ ani->startAnim(MV_KSL_SWINGGIRL, 0, -1);
+ else
+ ani->startAnim(MV_KSL_SWING, 0, -1);
+
+ ani->_movement->setDynamicPhaseIndex(g_fp->_rnd->getRandomNumber(17));
+
+ g_vars->scene18_swingers.push_back(swinger);
+ }
+
+ g_fp->_currentScene = oldsc;
+}
+
+void scene18_initScene1(Scene *sc) {
+ PicAniInfo info;
+
+ int oldx = g_vars->scene18_wheelCenterX;
+ int oldy = g_vars->scene18_wheelCenterY;
+
+ g_vars->scene18_girlIsSwinging = (g_fp->getObjectState(sO_Girl) == g_fp->getObjectEnumState(sO_Girl, sO_IsSwinging));
+
+ if (sc->_sceneId == SC_18) {
+ g_vars->scene18_whirlgig = sc->getStaticANIObject1ById(ANI_WHIRLIGIG_18, -1);
+ g_vars->scene18_wheelCenterX = 1032;
+ g_vars->scene18_wheelCenterY = -318;
+ } else {
+ g_vars->scene18_whirlgig = sc->getStaticANIObject1ById(ANI_WHIRLGIG_19, -1);
+ g_vars->scene18_wheelCenterX = 1024;
+ g_vars->scene18_wheelCenterY = 242;
+ }
+
+ int newx = g_vars->scene18_wheelCenterX - oldx;
+ int newy = g_vars->scene18_wheelCenterY - oldy;
+
+ g_vars->scene18_boyJumpX += newx;
+ g_vars->scene18_boyJumpY += newy;
+ g_vars->scene18_girlJumpX += newx;
+ g_vars->scene18_girlJumpY += newy;
+
+ for (uint i = 0; i < g_vars->scene18_swingers.size(); i++) {
+ g_vars->scene18_swingers[i]->ani->getPicAniInfo(&info);
+ sc->addStaticANIObject(g_vars->scene18_swingers[i]->ani, 1);
+ g_vars->scene18_swingers[i]->ani->setPicAniInfo(&info);
+
+ g_vars->scene18_swingers[i]->sx += newx;
+ g_vars->scene18_swingers[i]->sy += newy;
+ g_vars->scene18_swingers[i]->ix += newx;
+ g_vars->scene18_swingers[i]->iy += newy;
+
+ GameObject *go;
+
+ if (g_vars->scene18_swingers[i]->ani->_movement)
+ go = g_vars->scene18_swingers[i]->ani->_movement;
+ else
+ go = g_vars->scene18_swingers[i]->ani;
+
+ go->setOXY(newx + go->_ox, newy + go->_oy);
+ }
+
+ if (g_vars->scene18_bridgeIsConvoluted && g_vars->scene18_whirlgigMovMum != -1) {
+ g_vars->scene18_whirlgig->startAnim(sc->_sceneId != SC_18 ? MV_WHR19_SPIN : MV_WHR18_SPIN, 0, -1);
+ g_vars->scene18_whirlgig->_movement->setDynamicPhaseIndex(g_vars->scene18_whirlgigMovMum);
+ }
+
+ int sndid;
+
+ if (sc->_sceneId == SC_19) {
+ if (g_vars->scene18_bridgeIsConvoluted)
+ sndid = SND_19_015;
+ else
+ sndid = SND_19_016;
+ } else {
+ if (g_vars->scene18_bridgeIsConvoluted)
+ sndid = SND_18_006;
+ else
+ sndid = SND_18_010;
+ }
+
+ g_fp->playSound(sndid, 1);
+
+ g_vars->scene18_boy->getPicAniInfo(&info);
+ sc->addStaticANIObject(g_vars->scene18_boy, 1);
+ g_vars->scene18_boy->setPicAniInfo(&info);
+
+ int x, y;
+
+ if (g_vars->scene18_boy->_movement) {
+ x = g_vars->scene18_boy->_movement->_ox;
+ y = g_vars->scene18_boy->_movement->_oy;
+ } else {
+ x = g_vars->scene18_boy->_ox;
+ y = g_vars->scene18_boy->_oy;
+ }
+
+ g_vars->scene18_boy->setOXY(newx + x, newy + y);
+
+ g_vars->scene18_girl->getPicAniInfo(&info);
+ sc->addStaticANIObject(g_vars->scene18_girl, 1);
+ g_vars->scene18_girl->setPicAniInfo(&info);
+
+ if (g_vars->scene18_girl->_movement) {
+ x = g_vars->scene18_girl->_movement->_ox;
+ y = g_vars->scene18_girl->_movement->_oy;
+ } else {
+ x = g_vars->scene18_girl->_ox;
+ y = g_vars->scene18_girl->_oy;
+ }
+
+ g_vars->scene18_girl->setOXY(newx + x, newy + y);
+
+ g_vars->scene18_wheelFlipper = false;
+ g_vars->scene18_jumpDistance = -1;
+ g_vars->scene18_jumpAngle = -1;
+
+ if (g_vars->scene18_enteredTrubaRight) {
+ if (sc->_sceneId == SC_19)
+ g_fp->_aniMan2 = 0;
+ else
+ g_fp->_aniMan2 = g_vars->scene18_swingers[g_vars->scene18_manWheelPosTo]->ani;
+ } else {
+ g_fp->_aniMan2 = g_fp->_aniMan;
+ }
+}
+
+void scene18_initScene2(Scene *sc) {
+ g_vars->scene18_whirlgig = sc->getStaticANIObject1ById(ANI_WHIRLIGIG_18, -1);
+ g_vars->scene18_wheelCenterX = 1032;
+ g_vars->scene18_wheelCenterY = -318;
+
+ StaticANIObject *armchair = sc->getStaticANIObject1ById(ANI_KRESLO, -1);
+
+ armchair->loadMovementsPixelData();
+
+ g_vars->scene18_girlIsSwinging = (g_fp->getObjectState(sO_Girl) == g_fp->getObjectEnumState(sO_Girl, sO_IsSwinging));
+
+ if (g_fp->getObjectState(sO_Bridge) == g_fp->getObjectEnumState(sO_Bridge, sO_Convoluted)) {
+ g_vars->scene18_bridgeIsConvoluted = true;
+ g_fp->playSound(SND_18_006, 1);
+ } else {
+ g_vars->scene18_bridgeIsConvoluted = false;
+ g_fp->playSound(SND_18_010, 1);
+ }
+
+ scene18_setupSwingers(armchair, sc);
+
+ g_vars->scene18_rotationCounter = 0;
+ g_vars->scene18_wheelFlipper = false;
+ g_vars->scene18_wheelIsTurning = true;
+ g_vars->scene18_kidIsOnWheel = -1;
+ g_vars->scene18_boyIsOnWheel = 0;
+ g_vars->scene18_girlIsOnWheel = 0;
+ g_vars->scene18_boyJumpedOff = true;
+ g_vars->scene18_manWheelPosTo = -1;
+ g_vars->scene18_jumpDistance = -1;
+ g_vars->scene18_jumpAngle = -1;
+ g_vars->scene18_manIsReady = false;
+ g_vars->scene18_enteredTrubaRight = 0;
+ g_vars->scene18_boy = sc->getStaticANIObject1ById(ANI_BOY18, -1);
+ g_vars->scene18_girl = sc->getStaticANIObject1ById(ANI_GIRL18, -1);
+ g_vars->scene18_domino = sc->getStaticANIObject1ById(ANI_DOMINO_18, -1);
+ g_vars->scene18_boyJumpX = 290;
+ g_vars->scene18_boyJumpY = -363;
+ g_vars->scene18_girlJumpX = 283;
+ g_vars->scene18_girlJumpY = -350;
+
+ g_fp->initArcadeKeys("SC_18");
+}
+
+void scene19_initScene2() {
+ g_fp->_aniMan2 = 0;
+}
+
+int scene18_updateCursor() {
+ if (g_vars->scene18_enteredTrubaRight) {
+ g_fp->_cursorId = PIC_CSR_DEFAULT;
+ } else {
+ g_fp->updateCursorCommon();
+
+ if (g_fp->_cursorId == PIC_CSR_ITN) {
+ if (g_fp->_objectIdAtCursor == PIC_SC18_LADDER1) {
+ g_fp->_cursorId = (g_vars->scene18_manY <= 250) ? PIC_CSR_GOD : PIC_CSR_GOU;
+ } else if (g_fp->_objectIdAtCursor == PIC_SC18_LADDER2 || g_fp->_objectIdAtCursor == PIC_SC18_LADDER3) {
+ g_fp->_cursorId = PIC_CSR_GOU;
+ }
+ } else if (g_fp->_cursorId == PIC_CSR_DEFAULT && g_fp->_objectIdAtCursor == PIC_SC18_DOMIN && g_vars->scene18_domino && (g_vars->scene18_domino->_flags & 4)) {
+ g_fp->_cursorId = PIC_CSR_ITN;
+ }
+ }
+
+ return g_fp->_cursorId;
+}
+
+int scene19_updateCursor() {
+ g_fp->updateCursorCommon();
+
+ if (g_fp->_objectIdAtCursor == PIC_SC19_RTRUBA31)
+ g_fp->_cursorId = g_vars->scene19_enteredTruba3 ? PIC_CSR_GOR : PIC_CSR_DEFAULT;
+
+ return g_fp->_cursorId;
+}
+
+void sceneHandler18_clickBoard() {
+ if (ABS(967 - g_fp->_aniMan->_ox) > 1 || ABS(379 - g_fp->_aniMan->_oy) > 1 || g_fp->_aniMan->_statics->_staticsId != ST_MAN_RIGHT) {
+ MessageQueue *mq = getCurrSceneSc2MotionController()->method34(g_fp->_aniMan, 967, 379, 1, ST_MAN_RIGHT);
+ ExCommand *ex = new ExCommand(0, 17, MSG_SC18_MANREADY, 0, 0, 0, 1, 0, 0, 0);
+
+ ex->_excFlags = 2;
+
+ mq->addExCommandToEnd(ex);
+
+ postExCommand(g_fp->_aniMan->_id, 2, 967, 379, 0, -1);
+ } else {
+ g_vars->scene18_manIsReady = true;
+ }
+}
+
+void sceneHandler18_showManJumpTo() {
+ g_fp->_aniMan->changeStatics2(ST_MAN_RIGHT);
+ g_fp->_aniMan->_flags &= 0xFFFB;
+ g_fp->_aniMan->_flags &= 0xFEFF;
+ g_vars->scene18_swingers[g_vars->scene18_manWheelPosTo]->sflags = 0x20;
+
+ g_vars->scene18_swingers[g_vars->scene18_manWheelPosTo]->ani->changeStatics2(ST_KSL_JUMPMAN);
+ g_vars->scene18_swingers[g_vars->scene18_manWheelPosTo]->ani->startAnim(MV_KSL_INMAN, 0, -1);
+ g_vars->scene18_swingers[g_vars->scene18_manWheelPosTo]->ani->_priority = 20;
+
+ g_vars->scene18_manIsReady = false;
+ g_vars->scene18_enteredTrubaRight = true;
+
+ g_fp->_aniMan2 = g_vars->scene18_swingers[g_vars->scene18_manWheelPosTo]->ani;
+}
+
+void sceneHandler18and19_showManJump() {
+ int x, y;
+
+ if (g_vars->scene18_swingers[g_vars->scene18_manWheelPos]->ani->_movement) {
+ x = g_vars->scene18_swingers[g_vars->scene18_manWheelPos]->ani->_movement->_ox;
+ y = g_vars->scene18_swingers[g_vars->scene18_manWheelPos]->ani->_movement->_oy;
+ } else {
+ x = g_vars->scene18_swingers[g_vars->scene18_manWheelPos]->ani->_ox;
+ y = g_vars->scene18_swingers[g_vars->scene18_manWheelPos]->ani->_oy;
+ }
+
+ g_fp->_aniMan->show1(x + 62, y + 5, MV_MAN18_JUMPTOTRUBA, 0);
+ g_fp->_aniMan->_priority = 35;
+
+ int mqid = 0;
+
+ if (g_vars->scene18_jumpDistance == 1) {
+ mqid = QU_SC19_MANJUMP1;
+ } else if (g_vars->scene18_jumpDistance == 2) {
+ mqid = QU_SC19_MANJUMP2;
+ } else if (g_vars->scene18_jumpDistance == 3) {
+ mqid = QU_SC19_MANJUMP3;
+ }
+
+ if (mqid) {
+ MessageQueue *mq = new MessageQueue(g_fp->_currentScene->getMessageQueueById(mqid), 0, 0);
+
+ g_fp->_aniMan2 = g_fp->_aniMan;
+ g_vars->scene18_enteredTrubaRight = false;
+
+ mq->setFlags(mq->getFlags() | 1);
+ mq->chain(0);
+ }
+
+ g_vars->scene18_swingers[g_vars->scene18_manWheelPos]->sflags = 1;
+
+ g_vars->scene18_swingers[g_vars->scene18_manWheelPos]->ani->changeStatics2(ST_KSL_NORM);
+ g_vars->scene18_swingers[g_vars->scene18_manWheelPos]->ani->_priority = 30;
+}
+
+void sceneHandler18and19_showGirlJumpTo() {
+ g_vars->scene18_girl->stopAnim_maybe();
+ g_vars->scene18_girl->hide();
+
+ g_vars->scene18_swingers[g_vars->scene18_kidWheelPosTo]->sflags = 4;
+
+ g_vars->scene18_swingers[g_vars->scene18_kidWheelPosTo]->ani->changeStatics2(ST_KSL_JUMPGIRL);
+ g_vars->scene18_swingers[g_vars->scene18_kidWheelPosTo]->ani->startAnim(MV_KSL_INGIRL, 0, -1);
+
+ g_vars->scene18_kidIsOnWheel--;
+ g_vars->scene18_girlIsOnWheel--;
+}
+
+void sceneHandler18and19_showGirlJump() {
+ StaticANIObject *ani = g_vars->scene18_swingers[g_vars->scene18_kidWheelPos]->ani;
+ int x, y;
+
+ if (ani->_movement) {
+ x = ani->_movement->_ox;
+ y = ani->_movement->_oy;
+ } else {
+ x = ani->_ox;
+ y = ani->_oy;
+ }
+
+ g_vars->scene18_girl->show1(x - 62, y - 10, MV_GRL18_JUMPFROM, 0);
+ g_vars->scene18_girl->_priority = 50;
+ g_vars->scene18_girl->startAnim(MV_GRL18_JUMPFROM, 0, -1);
+
+ g_vars->scene18_swingers[g_vars->scene18_kidWheelPos]->sflags = 1;
+
+ g_vars->scene18_swingers[g_vars->scene18_kidWheelPos]->ani->changeStatics2(ST_KSL_REACT);
+ g_vars->scene18_swingers[g_vars->scene18_kidWheelPos]->ani->startAnim(MV_KSL_CALMDOWN, 0, -1);
+
+ g_vars->scene18_kidIsOnWheel = 1;
+ g_vars->scene18_girlIsOnWheel++;
+}
+
+void sceneHandler18and19_showBoyJumpTo() {
+ g_vars->scene18_boy->stopAnim_maybe();
+ g_vars->scene18_boy->hide();
+
+ g_vars->scene18_swingers[g_vars->scene18_kidWheelPosTo]->sflags = 2;
+ g_vars->scene18_swingers[g_vars->scene18_kidWheelPosTo]->ani->changeStatics2(ST_KSL_JUMPBOY);
+ g_vars->scene18_swingers[g_vars->scene18_kidWheelPosTo]->ani->startAnim(MV_KSL_INBOY, 0, -1);
+
+ g_vars->scene18_kidIsOnWheel--;
+ g_vars->scene18_boyIsOnWheel--;
+}
+
+void sceneHandler18and19_showBoyJump() {
+ StaticANIObject *ani = g_vars->scene18_swingers[g_vars->scene18_kidWheelPos]->ani;
+ int x, y;
+
+ if (ani->_movement) {
+ x = ani->_movement->_ox;
+ y = ani->_movement->_oy;
+ } else {
+ x = ani->_ox;
+ y = ani->_oy;
+ }
+
+ g_vars->scene18_boy->show1(x - 48, y + 8, MV_BOY18_JUMPFROM, 0);
+ g_vars->scene18_boy->_priority = 50;
+ g_vars->scene18_boy->startAnim(MV_BOY18_JUMPFROM, 0, -1);
+
+ g_vars->scene18_swingers[g_vars->scene18_kidWheelPos]->sflags = 1;
+
+ g_vars->scene18_swingers[g_vars->scene18_kidWheelPos]->ani->changeStatics2(ST_KSL_REACT);
+ g_vars->scene18_swingers[g_vars->scene18_kidWheelPos]->ani->startAnim(MV_KSL_CALMDOWN, 0, -1);
+
+ g_vars->scene18_boyJumpedOff = true;
+}
+
+void sceneHandler18and19_boyJumpTo() {
+ g_vars->scene18_boy->stopAnim_maybe();
+ g_vars->scene18_boy->show1(g_vars->scene18_boyJumpX, g_vars->scene18_boyJumpY, MV_BOY18_JUMPTO, 0);
+ g_vars->scene18_boy->_priority = 50;
+ g_vars->scene18_boy->startAnim(MV_BOY18_JUMPTO, 0, -1);
+}
+
+void sceneHandler18and19_girlJumpTo() {
+ g_vars->scene18_girl->stopAnim_maybe();
+ g_vars->scene18_girl->show1(g_vars->scene18_girlJumpX, g_vars->scene18_girlJumpY, MV_GRL18_JUMPTO, 0);
+ g_vars->scene18_girl->_priority = 50;
+ g_vars->scene18_girl->startAnim(MV_GRL18_JUMPTO, 0, -1);
+}
+
+void sceneHandler18and19_manStandArmchair() {
+ g_fp->_aniMan->changeStatics2(ST_MAN_RIGHT);
+ g_fp->_aniMan->_flags |= 1;
+ g_fp->_aniMan->_priority = 35;
+ g_fp->_aniMan->startAnim(MV_MAN18_STANDKRESLO, 0, -1);
+}
+
+void sceneHandler18and19_drawRiders() {
+ g_vars->scene18_rotationCounter++;
+
+ if (g_vars->scene18_rotationCounter >= 359)
+ g_vars->scene18_rotationCounter = 0;
+
+ for (uint i = 0; i < g_vars->scene18_swingers.size(); i++) {
+ Swinger *swinger = g_vars->scene18_swingers[i];
+
+ double oldangle = swinger->angle;
+
+ swinger->angle += ANGLE(1);
+
+ if (swinger->angle > ANGLE(360)) {
+ swinger->angle -= ANGLE(360);
+ oldangle -= ANGLE(360);
+ }
+
+ int ix = g_vars->scene18_wheelCenterX - (int)(cos(swinger->angle) * -575.0);
+ int iy = g_vars->scene18_wheelCenterY - (int)(sin(swinger->angle) * -575.0) + 87;
+
+ if (!g_vars->scene18_rotationCounter) {
+ ix = swinger->sx;
+ iy = swinger->sy;
+ swinger->angle = (double)i * ANGLE(45);
+ }
+
+ if (swinger->ani->_movement)
+ swinger->ani->setOXY(ix - swinger->ix + swinger->ani->_movement->_ox, iy - swinger->iy + swinger->ani->_movement->_oy);
+ else
+ swinger->ani->setOXY(ix - swinger->ix + swinger->ani->_ox, iy - swinger->iy + swinger->ani->_oy);
+
+ swinger->ix = ix;
+ swinger->iy = iy;
+
+ if (!swinger->ani->_movement) {
+ int mv = 0;
+
+ if (swinger->sflags & 2) {
+ mv = MV_KSL_SWINGBOY;
+ } else if (swinger->sflags & 4) {
+ mv = MV_KSL_SWINGGIRL;
+ } else if (swinger->sflags & 0x20) {
+ mv = MV_KSL_SWINGMAN;
+ } else if (swinger->sflags & 1) {
+ mv = MV_KSL_SWING;
+ }
+
+ if (mv)
+ swinger->ani->startAnim(mv, 0, -1);
+
+ if (swinger->ani->_movement)
+ swinger->ani->_movement->_counter = 0;
+ }
+
+ if (g_vars->scene18_wheelIsTurning) {
+ if ((swinger->sflags & 2) && swinger->angle >= ANGLE(160) && oldangle < ANGLE(160)) {
+ swinger->sflags = 8;
+ swinger->ani->changeStatics2(ST_KSL_BOY);
+ swinger->ani->startAnim(MV_KSL_JUMPBOY, 0, -1);
+ g_vars->scene18_kidWheelPos = i;
+ } else if ((swinger->sflags & 4) && swinger->angle >= ANGLE(162) && oldangle < ANGLE(162)) {
+ swinger->sflags = 16;
+ swinger->ani->changeStatics2(ST_KSL_GIRL);
+ swinger->ani->startAnim(MV_KSL_JUMPGIRL, 0, -1);
+ g_vars->scene18_kidWheelPos = i;
+ } else if (g_vars->scene18_kidIsOnWheel) {
+ if (g_vars->scene18_boyIsOnWheel > 0 && (swinger->sflags & 1) && swinger->angle >= ANGLE(185) && oldangle < ANGLE(185)) {
+ g_vars->scene18_kidWheelPosTo = i;
+ sceneHandler18and19_boyJumpTo();
+ }
+ } else if (g_vars->scene18_girlIsOnWheel > 0 && (swinger->sflags & 1) && swinger->angle >= ANGLE(187) && oldangle < ANGLE(187)) {
+ g_vars->scene18_kidWheelPosTo = i;
+ sceneHandler18and19_girlJumpTo();
+ }
+
+ if (swinger->angle >= ANGLE(200) && oldangle < ANGLE(200)) {
+ if (g_vars->scene18_boyJumpedOff)
+ g_vars->scene18_boyIsOnWheel++;
+
+ g_vars->scene18_boyJumpedOff = false;
+ }
+ }
+
+ if (g_vars->scene18_manIsReady && (swinger->sflags & 1) && swinger->angle >= ANGLE(83) && oldangle < ANGLE(83)) {
+ g_vars->scene18_manWheelPosTo = i;
+ sceneHandler18and19_manStandArmchair();
+ }
+
+ if (!g_vars->scene18_enteredTrubaRight)
+ continue;
+
+ if ((int)i == g_vars->scene18_manWheelPosTo) {
+ if (swinger->angle >= ANGLE(170) && oldangle < ANGLE(170)) {
+ g_fp->_gameLoader->preloadScene(SC_18, TrubaRight);
+ } else if (swinger->angle >= ANGLE(25) && oldangle < ANGLE(25)) {
+ g_fp->_gameLoader->preloadScene(SC_19, TrubaRight);
+ } else if (swinger->angle >= ANGLE(270) && oldangle < ANGLE(270)) {
+ g_fp->_sceneRect.translate(1200, 0);
+ }
+ }
+
+ if (g_vars->scene18_jumpDistance > 0) {
+ if (swinger->sflags & 0x20) {
+ double newa = (double)g_vars->scene18_jumpAngle * ANGLE(1);
+
+ if (newa <= swinger->angle && oldangle < newa) {
+ swinger->ani->changeStatics2(ST_KSL_MAN);
+ swinger->ani->startAnim(MV_KSL_JUMPMAN, 0, -1);
+ swinger->ani->_priority = 35;
+
+ g_vars->scene18_manWheelPos = i;
+ }
+ }
+ }
+ }
+}
+
+void sceneHandler18and19_animateRiders() {
+ for (uint i = 0; i < g_vars->scene18_swingers.size(); i++) {
+ Swinger *swinger = g_vars->scene18_swingers[i];
+
+ if (!swinger->ani->_movement) {
+ int mv = 0;
+
+ if (swinger->sflags & 2)
+ mv = MV_KSL_SWINGBOY;
+ else if (swinger->sflags & 4)
+ mv = MV_KSL_SWINGGIRL;
+ else if (swinger->sflags & 0x20)
+ mv = MV_KSL_SWINGMAN;
+
+ if (mv)
+ swinger->ani->startAnim(mv, 0, -1);
+
+ if (swinger->ani->_movement)
+ swinger->ani->_movement->_counter = 0;
+ }
+ }
+}
+
+int sceneHandler18(ExCommand *cmd) {
+ if (cmd->_messageKind != 17)
+ return 0;
+
+ switch (cmd->_messageNum) {
+ case MSG_SC18_CLICKBOARD:
+ sceneHandler18_clickBoard();
+ break;
+
+ case MSG_SC3_HIDEDOMINO:
+ g_vars->scene18_domino->_flags &= 0xFFFB;
+ break;
+
+ case MSG_SC18_SHOWMANJUMP:
+ sceneHandler18and19_showManJump();
+ break;
+
+ case MSG_SC18_MANREADY:
+ g_vars->scene18_manIsReady = true;
+ break;
+
+ case MSG_SC18_SHOWMANJUMPTO:
+ sceneHandler18_showManJumpTo();
+ break;
+
+ case MSG_SC18_SHOWGIRLJUMPTO:
+ sceneHandler18and19_showGirlJumpTo();
+ break;
+
+ case MSG_SC18_SHOWGIRLJUMP:
+ sceneHandler18and19_showGirlJump();
+ break;
+
+ case MSG_SC18_SHOWBOYJUMPTO:
+ sceneHandler18and19_showBoyJumpTo();
+ break;
+
+ case MSG_SC18_SHOWBOYJUMP:
+ sceneHandler18and19_showBoyJump();
+ break;
+
+ case 29:
+ {
+ if (g_vars->scene18_enteredTrubaRight) {
+ cmd->_messageKind = 0;
+
+ break;
+ }
+
+ StaticANIObject *ani = g_fp->_currentScene->getStaticANIObjectAtPos(cmd->_sceneClickX, cmd->_sceneClickY);
+
+ if (!ani || !canInteractAny(g_fp->_aniMan, ani, cmd->_keyCode)) {
+ int picId = g_fp->_currentScene->getPictureObjectIdAtPos(cmd->_sceneClickX, cmd->_sceneClickY);
+ PictureObject *pic = g_fp->_currentScene->getPictureObjectById(picId, 0);
+
+ if (pic && pic->_id == PIC_SC18_DOMIN && g_vars->scene18_domino
+ && (g_vars->scene18_domino->_flags & 4) && g_fp->_aniMan->isIdle()) {
+ if (!(g_fp->_aniMan->_flags & 0x100) && g_fp->_msgObjectId2 != g_vars->scene18_domino->_id) {
+ handleObjectInteraction(g_fp->_aniMan, g_vars->scene18_domino, cmd->_keyCode);
+ cmd->_messageKind = 0;
+
+ break;
+ }
+ }
+
+ if (!pic || !canInteractAny(g_fp->_aniMan, pic, cmd->_keyCode)) {
+ if ((g_fp->_sceneRect.right - cmd->_sceneClickX < 47 && g_fp->_sceneRect.right < g_fp->_sceneWidth - 1)
+ || (cmd->_sceneClickX - g_fp->_sceneRect.left < 47 && g_fp->_sceneRect.left > 0)) {
+ g_fp->processArcade(cmd);
+
+ g_vars->scene18_manIsReady = false;
+
+ break;
+ }
+ }
+ }
+ break;
+ }
+
+ case 33:
+ if (g_fp->_aniMan2) {
+ int x = g_fp->_aniMan2->_ox;
+
+ g_vars->scene18_manY = g_fp->_aniMan2->_oy;
+
+ if (x < g_fp->_sceneRect.left + 200)
+ g_fp->_currentScene->_x = x - 300 - g_fp->_sceneRect.left;
+
+ if (x > g_fp->_sceneRect.right - 200)
+ g_fp->_currentScene->_x = x + 300 - g_fp->_sceneRect.right;
+ }
+
+ if (g_vars->scene18_manIsReady && g_fp->_aniMan->_movement)
+ g_vars->scene18_manIsReady = false;
+
+ if (g_vars->scene18_bridgeIsConvoluted) {
+ if (!g_vars->scene18_wheelFlipper)
+ sceneHandler18and19_drawRiders();
+
+ g_vars->scene18_wheelFlipper = !g_vars->scene18_wheelFlipper;
+
+ if (!g_vars->scene18_whirlgig->_movement) {
+ g_vars->scene18_whirlgig->startAnim(MV_WHR18_SPIN, 0, -1);
+ g_fp->_behaviorManager->updateBehaviors();
+
+ break;
+ }
+ } else {
+ sceneHandler18and19_animateRiders();
+ }
+
+ g_fp->_behaviorManager->updateBehaviors();
+
+ break;
+ }
+
+ return 0;
+}
+
+void sceneHandler19_updateNumRides() {
+ int numRides = g_fp->getGameLoaderGameVar()->getSubVarByName("OBJSTATES")->getSubVarAsInt(sO_DudeSwinged) + 1;
+
+ if (numRides > 1) {
+ g_fp->setObjectState(sO_Girl, g_fp->getObjectEnumState(sO_Girl, sO_IsSwinging));
+
+ g_vars->scene18_kidIsOnWheel = 1;
+ g_vars->scene18_girlIsOnWheel++;
+
+ numRides = 0;
+ }
+
+ g_fp->getGameLoaderGameVar()->getSubVarByName("OBJSTATES")->setSubVarAsInt(sO_DudeSwinged, numRides);
+}
+
+int sceneHandler19(ExCommand *cmd) {
+ if (cmd->_messageKind != 17)
+ return 0;
+
+ switch (cmd->_messageNum) {
+ case MSG_SC18_SHOWMANJUMP:
+ sceneHandler18and19_showManJump();
+ break;
+
+ case MSG_SC19_UPDATENUMRIDES:
+ sceneHandler19_updateNumRides();
+ break;
+
+ case MSG_SC18_SHOWGIRLJUMPTO:
+ sceneHandler18and19_showGirlJumpTo();
+ break;
+
+ case MSG_SC18_SHOWBOYJUMPTO:
+ sceneHandler18and19_showBoyJumpTo();
+ break;
+
+ case MSG_SC18_SHOWGIRLJUMP:
+ sceneHandler18and19_showGirlJump();
+ break;
+
+ case MSG_SC18_SHOWBOYJUMP:
+ sceneHandler18and19_showBoyJump();
+ break;
+
+ case 29:
+ if (g_vars->scene18_enteredTrubaRight) {
+ switch (g_fp->_currentScene->getPictureObjectIdAtPos(cmd->_sceneClickX, cmd->_sceneClickY)) {
+ case PIC_SC19_RTRUBA1:
+ g_vars->scene18_jumpDistance = 1;
+ g_vars->scene18_jumpAngle = 331;
+ cmd->_messageKind = 0;
+ break;
+
+ case PIC_SC19_RTRUBA2:
+ g_vars->scene18_jumpDistance = 2;
+ g_vars->scene18_jumpAngle = 350;
+ cmd->_messageKind = 0;
+ break;
+
+ case PIC_SC19_RTRUBA3:
+ g_vars->scene18_jumpDistance = 3;
+ g_vars->scene18_jumpAngle = 9;
+ cmd->_messageKind = 0;
+ break;
+
+ default:
+ g_vars->scene18_jumpDistance = -1;
+ g_vars->scene18_jumpAngle = -1;
+ cmd->_messageKind = 0;
+ break;
+ }
+ break;
+ }
+
+ if (g_vars->scene19_enteredTruba3) {
+ if (g_fp->_currentScene->getPictureObjectIdAtPos(cmd->_sceneClickX, cmd->_sceneClickY) == PIC_SC19_RTRUBA3) {
+ if (g_fp->_aniMan->isIdle()) {
+ if (!(g_fp->_aniMan->_flags & 0x100)) {
+ PictureObject *pic = g_fp->_currentScene->getPictureObjectById(PIC_SC19_RTRUBA31, 0);
+
+ handleObjectInteraction(g_fp->_aniMan, pic, cmd->_keyCode);
+ break;
+ }
+ }
+ }
+ }
+ break;
+
+ case 33:
+ if (g_fp->_aniMan2) {
+ int x = g_fp->_aniMan2->_ox;
+
+ g_vars->scene18_manY = g_fp->_aniMan2->_oy;
+
+ if (x < g_fp->_sceneRect.left + 200)
+ g_fp->_currentScene->_x = x - 300 - g_fp->_sceneRect.left;
+
+ if (x > g_fp->_sceneRect.right - 200)
+ g_fp->_currentScene->_x = x + 300 - g_fp->_sceneRect.right;
+ }
+
+ if (g_vars->scene18_bridgeIsConvoluted) {
+ if (!g_vars->scene18_wheelFlipper)
+ sceneHandler18and19_drawRiders();
+
+ g_vars->scene18_wheelFlipper = !g_vars->scene18_wheelFlipper;
+
+ if (!g_vars->scene18_whirlgig->_movement) {
+ g_vars->scene18_whirlgig->startAnim(MV_WHR19_SPIN, 0, -1);
+
+ g_fp->_behaviorManager->updateBehaviors();
+
+ break;
+ }
+ } else {
+ sceneHandler18and19_animateRiders();
+ }
+
+ g_fp->_behaviorManager->updateBehaviors();
+
+ break;
+ }
+
+ return 0;
+}
+
+} // End of namespace Fullpipe
diff --git a/engines/fullpipe/scenes/scene20.cpp b/engines/fullpipe/scenes/scene20.cpp
new file mode 100644
index 0000000000..7f19f175cc
--- /dev/null
+++ b/engines/fullpipe/scenes/scene20.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.
+ *
+ */
+
+#include "fullpipe/fullpipe.h"
+
+#include "fullpipe/objectnames.h"
+#include "fullpipe/constants.h"
+
+#include "fullpipe/gameloader.h"
+#include "fullpipe/motion.h"
+#include "fullpipe/scenes.h"
+#include "fullpipe/statics.h"
+
+#include "fullpipe/interaction.h"
+#include "fullpipe/behavior.h"
+#include "fullpipe/floaters.h"
+
+namespace Fullpipe {
+
+void scene20_setExits(Scene *sc) {
+ int thingpar;
+
+ if (g_fp->getObjectState(sO_Grandma) == g_fp->getObjectEnumState(sO_Grandma, sO_OnStool)
+ || g_fp->getObjectState(sO_Grandma) == g_fp->getObjectEnumState(sO_Grandma, sO_OnTheFloor))
+ thingpar = 1;
+ else if (g_fp->getObjectState(sO_Grandma) == g_fp->getObjectEnumState(sO_Grandma, sO_NearPipe)
+ || g_fp->getObjectState(sO_Grandma) == g_fp->getObjectEnumState(sO_Grandma, sO_NearPipeWithStool)) {
+ getSc2MctlCompoundBySceneId(sc->_sceneId)->enableLinks(sO_CloseThing, 1);
+ getSc2MctlCompoundBySceneId(sc->_sceneId)->enableLinks(sO_CloseThing2, 1);
+ getSc2MctlCompoundBySceneId(sc->_sceneId)->enableLinks(sO_CloseThing3, 0);
+
+ return;
+ } else {
+ thingpar = 0;
+ }
+
+ getSc2MctlCompoundBySceneId(sc->_sceneId)->enableLinks(sO_CloseThing, thingpar);
+ getSc2MctlCompoundBySceneId(sc->_sceneId)->enableLinks(sO_CloseThing2, 0);
+ getSc2MctlCompoundBySceneId(sc->_sceneId)->enableLinks(sO_CloseThing3, 1);
+}
+
+void scene20_initScene(Scene *sc) {
+ Scene *oldsc = g_fp->_currentScene;
+
+ g_vars->scene20_grandma = sc->getStaticANIObject1ById(ANI_GRANDMA_20, -1);
+
+ g_fp->_currentScene = sc;
+
+ if (g_fp->getObjectState(sO_Grandma) == g_fp->getObjectEnumState(sO_Grandma, sO_OnTheFloor))
+ g_fp->setObjectState(sO_Grandma, g_fp->getObjectEnumState(sO_Grandma, sO_NearPipe));
+
+ if (g_fp->getObjectState(sO_Grandma) == g_fp->getObjectEnumState(sO_Grandma, sO_OnStool)) {
+ g_vars->scene20_grandma->changeStatics2(ST_GMA20_STOOL);
+ } else if (g_fp->getObjectState(sO_Grandma) == g_fp->getObjectEnumState(sO_Grandma, sO_OnTheFloor)) {
+ g_vars->scene20_grandma->changeStatics2(ST_GMA20_FLOOR);
+ } else if (g_fp->getObjectState(sO_Grandma) == g_fp->getObjectEnumState(sO_Grandma, sO_NearPipe)
+ || g_fp->getObjectState(sO_Grandma) == g_fp->getObjectEnumState(sO_Grandma, sO_NearPipeWithStool)) {
+ g_vars->scene20_grandma->changeStatics2(ST_GMA20_STAND);
+ } else {
+ g_vars->scene20_grandma->hide();
+ }
+
+ scene20_setExits(sc);
+
+ g_fp->_floaters->init(g_fp->getGameLoaderGameVar()->getSubVarByName("SC_20"));
+
+ for (int i = 0; i < 3; i++) {
+ g_fp->_floaters->genFlies(sc, g_fp->_rnd->getRandomNumber(101) + 70, g_fp->_rnd->getRandomNumber(51) + 175, 100, 0);
+ g_fp->_floaters->_array2[g_fp->_floaters->_array2.size() - 1]->val13 = g_fp->_rnd->getRandomNumber(9);
+ }
+
+ g_fp->_currentScene = oldsc;
+
+ g_vars->scene20_fliesCountdown = g_fp->_rnd->getRandomNumber(200) + 400;
+}
+
+void sceneHandler20_updateFlies() {
+ int sz = g_fp->_floaters->_array2.size();
+
+ if (sz < 3) {
+ g_fp->_floaters->genFlies(g_fp->_currentScene, 253, 650, 200, 0);
+ g_fp->_floaters->_array2[sz - 1]->val2 = 250;
+ g_fp->_floaters->_array2[sz - 1]->val3 = 200;
+ } else {
+ int idx = g_fp->_rnd->getRandomNumber(sz);
+
+ g_fp->_floaters->_array2[idx]->countdown = 0;
+ g_fp->_floaters->_array2[idx]->fflags |= 4u;
+ g_fp->_floaters->_array2[idx]->val2 = 250;
+ g_fp->_floaters->_array2[idx]->val3 = 200;
+ g_fp->_floaters->_array2[idx]->val6 = 253;
+ g_fp->_floaters->_array2[idx]->val7 = 650;
+ g_fp->_floaters->_array2[idx]->ani->_priority = 200;
+ }
+
+ g_vars->scene20_fliesCountdown = g_fp->_rnd->getRandomNumber(200) + 400;
+}
+
+int sceneHandler20(ExCommand *cmd) {
+ if (cmd->_messageKind != 17)
+ return 0;
+
+ switch (cmd->_messageNum) {
+ case MSG_SC20_UPDATELOCKABLE:
+ scene20_setExits(g_fp->_currentScene);
+ break;
+
+ case 33:
+ if (g_fp->_aniMan2) {
+ int x = g_fp->_aniMan2->_ox;
+
+ if (x < g_fp->_sceneRect.left + 200)
+ g_fp->_currentScene->_x = x - 300 - g_fp->_sceneRect.left;
+
+ if (x > g_fp->_sceneRect.right - 200)
+ g_fp->_currentScene->_x = x + 300 - g_fp->_sceneRect.right;
+ }
+
+ --g_vars->scene20_fliesCountdown;
+
+ if (g_vars->scene20_fliesCountdown <= 0)
+ sceneHandler20_updateFlies();
+
+ g_fp->_floaters->update();
+
+ g_fp->_behaviorManager->updateBehaviors();
+
+ g_fp->startSceneTrack();
+
+ break;
+ }
+
+ return 0;
+}
+
+} // End of namespace Fullpipe
diff --git a/engines/fullpipe/scenes/scene21.cpp b/engines/fullpipe/scenes/scene21.cpp
new file mode 100644
index 0000000000..8918515431
--- /dev/null
+++ b/engines/fullpipe/scenes/scene21.cpp
@@ -0,0 +1,148 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public 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 "fullpipe/fullpipe.h"
+
+#include "fullpipe/objectnames.h"
+#include "fullpipe/constants.h"
+
+#include "fullpipe/gameloader.h"
+#include "fullpipe/motion.h"
+#include "fullpipe/scenes.h"
+#include "fullpipe/statics.h"
+
+#include "fullpipe/interaction.h"
+#include "fullpipe/behavior.h"
+
+
+namespace Fullpipe {
+
+void scene21_initScene(Scene *sc) {
+ Scene *oldsc = g_fp->_currentScene;
+
+ g_vars->scene21_giraffeBottom = sc->getStaticANIObject1ById(ANI_GIRAFFE_BOTTOM, -1);
+ g_fp->_currentScene = sc;
+
+ if (g_fp->getObjectState(sO_LowerPipe_21) == g_fp->getObjectEnumState(sO_LowerPipe_21, sO_IsOpened)) {
+ g_vars->scene21_giraffeBottom->changeStatics2(ST_GRFB_HANG);
+ g_vars->scene21_pipeIsOpen = true;
+ g_vars->scene21_wigglePos = 0.0;
+ g_vars->scene21_giraffeBottomX = g_vars->scene21_giraffeBottom->_ox;
+ g_vars->scene21_giraffeBottomY = g_vars->scene21_giraffeBottom->_oy;
+ g_vars->scene21_wiggleTrigger = false;
+ } else {
+ g_vars->scene21_pipeIsOpen = false;
+ }
+ g_fp->_currentScene = oldsc;
+ g_fp->initArcadeKeys("SC_21");
+}
+
+int scene21_updateCursor() {
+ g_fp->updateCursorCommon();
+
+ if (g_fp->_cursorId == PIC_CSR_ITN && g_fp->_objectIdAtCursor == PIC_SC21_DTRUBA)
+
+ g_fp->_cursorId = PIC_CSR_GOD;
+
+ return g_fp->_cursorId;
+}
+
+void sceneHandler21_doWiggle() {
+ g_vars->scene21_giraffeBottom->setOXY((int)(cos(g_vars->scene21_wigglePos) * 4.0) + g_vars->scene21_giraffeBottom->_ox,
+ g_vars->scene21_giraffeBottom->_oy);
+
+ g_vars->scene21_wigglePos += 0.19635;
+
+ if (g_vars->scene21_wigglePos > 6.2831853) {
+ g_vars->scene21_wigglePos = 0;
+
+ if (!g_vars->scene21_giraffeBottom->_movement)
+ g_vars->scene21_giraffeBottom->setOXY(g_vars->scene21_giraffeBottomX, g_vars->scene21_giraffeBottomY);
+ }
+}
+
+int sceneHandler21(ExCommand *cmd) {
+ if (cmd->_messageKind != 17)
+ return 0;
+
+ switch (cmd->_messageNum) {
+ case MSG_SC21_UPDATEASS:
+ if (g_fp->getObjectState(sO_LowerPipe_21) == g_fp->getObjectEnumState(sO_LowerPipe_21, sO_IsOpened)) {
+ g_vars->scene21_giraffeBottom->changeStatics2(ST_GRFB_HANG);
+ g_vars->scene21_giraffeBottom->setOXY(g_vars->scene21_giraffeBottomX, g_vars->scene21_giraffeBottomY);
+ g_vars->scene21_giraffeBottom->changeStatics2(ST_GRFB_SIT);
+
+ g_vars->scene21_pipeIsOpen = false;
+
+ g_fp->setObjectState(sO_LowerPipe_21, g_fp->getObjectEnumState(sO_LowerPipe_21, sO_IsClosed));
+ }
+
+ break;
+
+ case 29:
+ {
+ StaticANIObject *ani = g_fp->_currentScene->getStaticANIObjectAtPos(cmd->_sceneClickX, cmd->_sceneClickY);
+ if (!ani || !canInteractAny(g_fp->_aniMan, ani, cmd->_keyCode)) {
+ int picId = g_fp->_currentScene->getPictureObjectIdAtPos(cmd->_sceneClickX, cmd->_sceneClickY);
+
+ PictureObject *pic = g_fp->_currentScene->getPictureObjectById(picId, 0);
+
+ if (!pic || !canInteractAny(g_fp->_aniMan, pic, cmd->_keyCode) ) {
+ if ((g_fp->_sceneRect.right - cmd->_sceneClickX < 47 && g_fp->_sceneRect.right < g_fp->_sceneWidth - 1)
+ || (cmd->_sceneClickX - g_fp->_sceneRect.left < 47 && g_fp->_sceneRect.left > 0))
+ g_fp->processArcade(cmd);
+ }
+ }
+
+ break;
+ }
+
+ case 33:
+ if (g_fp->_aniMan2) {
+ int x = g_fp->_aniMan2->_ox;
+
+ if (x <= g_fp->_sceneWidth - 460) {
+ if (x < g_fp->_sceneRect.left + 200)
+ g_fp->_currentScene->_x = x - 300 - g_fp->_sceneRect.left;
+ } else {
+ g_fp->_currentScene->_x = g_fp->_sceneWidth - x;
+ }
+
+ if (x > g_fp->_sceneRect.right - 200)
+ g_fp->_currentScene->_x = x + 300 - g_fp->_sceneRect.right;
+ }
+
+ if (g_vars->scene21_pipeIsOpen && !g_vars->scene21_wiggleTrigger)
+ sceneHandler21_doWiggle();
+
+ g_vars->scene21_wiggleTrigger = !g_vars->scene21_wiggleTrigger;
+
+ g_fp->_behaviorManager->updateBehaviors();
+ g_fp->startSceneTrack();
+
+ break;
+ }
+
+ return 0;
+}
+
+} // End of namespace Fullpipe
diff --git a/engines/fullpipe/scenes/scene22.cpp b/engines/fullpipe/scenes/scene22.cpp
new file mode 100644
index 0000000000..542834b51a
--- /dev/null
+++ b/engines/fullpipe/scenes/scene22.cpp
@@ -0,0 +1,395 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public 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 "fullpipe/fullpipe.h"
+
+#include "fullpipe/objectnames.h"
+#include "fullpipe/constants.h"
+
+#include "fullpipe/gameloader.h"
+#include "fullpipe/motion.h"
+#include "fullpipe/scenes.h"
+#include "fullpipe/statics.h"
+
+#include "fullpipe/interaction.h"
+#include "fullpipe/behavior.h"
+
+
+namespace Fullpipe {
+
+void scene22_initScene(Scene *sc) {
+ g_vars->scene22_bag = sc->getStaticANIObject1ById(ANI_MESHOK, -1);
+
+ Scene *oldsc = g_fp->_currentScene;
+ g_fp->_currentScene = sc;
+
+ g_vars->scene22_giraffeMiddle = sc->getStaticANIObject1ById(ANI_GIRAFFE_MIDDLE, -1);
+ g_vars->scene22_dudeIsOnStool = false;
+ g_vars->scene22_interactionIsDisabled = false;
+ g_vars->scene22_craneIsOut = true;
+
+ if (g_fp->getObjectState(sO_Bag_22) == g_fp->getObjectEnumState(sO_Bag_22, sO_NotFallen))
+ g_vars->scene22_numBagFalls = 0;
+ else if (g_fp->getObjectState(sO_Bag_22) == g_fp->getObjectEnumState(sO_Bag_22, sO_FallenOnce))
+ g_vars->scene22_numBagFalls = 1;
+ else if ( g_fp->getObjectState(sO_Bag_22) == g_fp->getObjectEnumState(sO_Bag_22, sO_FallenTwice))
+ g_vars->scene22_numBagFalls = 2;
+ else {
+ g_vars->scene22_numBagFalls = 3;
+ g_vars->scene22_craneIsOut = false;
+ }
+
+
+ if ( g_fp->getObjectState(sO_LowerPipe_21) == g_fp->getObjectEnumState(sO_LowerPipe_21, sO_IsOpened))
+ g_vars->scene22_giraffeMiddle->changeStatics2(ST_GRFM_AFTER);
+ else
+ g_vars->scene22_giraffeMiddle->changeStatics2(ST_GRFM_NORM);
+
+ g_fp->_currentScene = oldsc;
+
+ g_fp->initArcadeKeys("SC_22");
+}
+
+int scene22_updateCursor() {
+ g_fp->updateCursorCommon();
+
+ if (g_fp->_objectIdAtCursor != ANI_HANDLE_L)
+ return g_fp->_cursorId;
+
+ int sel = g_fp->_inventory->getSelectedItemId();
+
+ if (!sel) {
+ g_fp->_cursorId = PIC_CSR_ITN;
+ return g_fp->_cursorId;
+ }
+
+ if (g_vars->scene22_dudeIsOnStool || (sel != ANI_INV_STOOL && sel != ANI_INV_BOX))
+ ; //empty
+ else
+ g_fp->_cursorId = PIC_CSR_ITN_INV;
+
+ return g_fp->_cursorId;
+}
+
+void scene22_setBagState() {
+ if (g_vars->scene22_craneIsOut) {
+ g_fp->_behaviorManager->setBehaviorEnabled(g_vars->scene22_bag, ST_MSH_SIT, QU_MSH_CRANEOUT, 1);
+ g_fp->_behaviorManager->setBehaviorEnabled(g_vars->scene22_bag, ST_MSH_SIT, QU_MSH_MOVE, 0);
+ } else {
+ g_fp->_behaviorManager->setBehaviorEnabled(g_vars->scene22_bag, ST_MSH_SIT, QU_MSH_CRANEOUT, 0);
+ g_fp->_behaviorManager->setBehaviorEnabled(g_vars->scene22_bag, ST_MSH_SIT, QU_MSH_MOVE, 1);
+ }
+}
+
+void sceneHandler22_showStool() {
+ chainQueue(QU_SC22_SHOWSTOOL, 0);
+}
+
+void sceneHandler22_hideStool() {
+ g_fp->_currentScene->getStaticANIObject1ById(ANI_TABURETTE, -1)->hide();
+}
+
+void sceneHandler22_handleDown() {
+ if (g_vars->scene22_bag->_statics->_staticsId == ST_MSH_SIT) {
+ chainQueue(QU_MSH_CRANEOUT, 1);
+ g_vars->scene22_interactionIsDisabled = false;
+ } else {
+ ++g_vars->scene22_numBagFalls;
+
+ int qid;
+
+ if (g_vars->scene22_numBagFalls == 3) {
+ chainQueue(QU_SC22_FALLSACK_GMA, 1);
+ qid = QU_SC22_FALLBROOM;
+ } else {
+ qid = QU_SC22_FALLSACK;
+ }
+
+ chainQueue(qid, 1);
+
+ int state;
+
+ if (g_vars->scene22_numBagFalls) {
+ if (g_vars->scene22_numBagFalls == 1) {
+ state = g_fp->getObjectEnumState(sO_Bag_22, sO_FallenOnce);
+ } else if (g_vars->scene22_numBagFalls == 2) {
+ state = g_fp->getObjectEnumState(sO_Bag_22, sO_FallenTwice);
+ } else {
+ state = g_fp->getObjectEnumState(sO_Bag_22, sO_BrushHasFallen);
+ }
+ } else {
+ state = g_fp->getObjectEnumState(sO_Bag_22, sO_NotFallen);
+ }
+
+ g_fp->setObjectState(sO_Bag_22, state);
+ }
+
+ g_vars->scene22_craneIsOut = true;
+
+ g_fp->_behaviorManager->setBehaviorEnabled(g_vars->scene22_bag, ST_MSH_SIT, QU_MSH_CRANEOUT, 1);
+ g_fp->_behaviorManager->setBehaviorEnabled(g_vars->scene22_bag, ST_MSH_SIT, QU_MSH_MOVE, 0);
+}
+
+void sceneHandler22_fromStool(ExCommand *cmd) {
+ if (g_fp->_aniMan->isIdle() && !(g_fp->_aniMan->_flags & 0x100)) {
+ MessageQueue *mq = new MessageQueue(g_fp->_currentScene->getMessageQueueById(QU_SC22_FROMSTOOL), 0, 0);
+
+ mq->addExCommandToEnd(cmd->createClone());
+ mq->setFlags(mq->getFlags() | 1);
+ mq->chain(0);
+ }
+}
+
+void sceneHandler22_stoolLogic(ExCommand *cmd) {
+ StaticANIObject *ani;
+ MessageQueue *mq;
+ int xpos;
+ int manId;
+
+ if (g_fp->_aniMan->isIdle() && !(g_fp->_aniMan->_flags & 0x100)) {
+ if (cmd->_keyCode == ANI_INV_STOOL) {
+ if (abs(841 - g_fp->_aniMan->_ox) <= 1) {
+ if (abs(449 - g_fp->_aniMan->_oy) <= 1) {
+ chainQueue(QU_SC22_PUTSTOOL, 1);
+ g_vars->scene22_interactionIsDisabled = true;
+
+ return;
+ }
+ }
+ goto LABEL_13;
+ }
+
+ if (cmd->_keyCode == ANI_INV_BOX) {
+ ani = g_fp->_currentScene->getStaticANIObject1ById(ANI_TABURETTE, -1);
+ if (!ani || !(ani->_flags & 4)) {
+ if (abs(841 - g_fp->_aniMan->_ox) <= 1) {
+ if (abs(449 - g_fp->_aniMan->_oy) <= 1) {
+ chainObjQueue(g_fp->_aniMan, QU_SC22_TRYBOX, 1);
+ return;
+ }
+ }
+ LABEL_13:
+ xpos = 841;
+ manId = ST_MAN_RIGHT;
+ LABEL_31:
+ mq = getCurrSceneSc2MotionController()->method34(g_fp->_aniMan, xpos, 449, 1, manId);
+
+ if (!mq)
+ return;
+
+ mq->addExCommandToEnd(cmd->createClone());
+
+ postExCommand(g_fp->_aniMan->_id, 2, 841, 449, 0, -1);
+ return;
+ }
+ } else {
+ if (cmd->_keyCode)
+ return;
+
+ if (g_vars->scene22_dudeIsOnStool) {
+ if (g_fp->_aniMan->_movement)
+ return;
+
+ chainQueue(QU_SC22_HANDLEDOWN, 1);
+
+ g_vars->scene22_interactionIsDisabled = true;
+ return;
+ }
+
+ ani = g_fp->_currentScene->getStaticANIObject1ById(ANI_TABURETTE, -1);
+ if (ani && (ani->_flags & 4)) {
+ int x = g_fp->_aniMan->_ox;
+ int y = g_fp->_aniMan->_ox;
+
+ if (sqrt((double)((841 - x) * (841 - x) + (449 - y) * (449 - y)))
+ < sqrt((double)((1075 - x) * (1075 - x) + (449 - y) * (449 - y)))) {
+ if (abs(841 - x) <= 1) {
+ if (abs(449 - y) <= 1) {
+ chainQueue(QU_SC22_TOSTOOL, 1);
+
+ g_vars->scene22_interactionIsDisabled = true;
+ return;
+ }
+ }
+ goto LABEL_13;
+ }
+
+ if (abs(1075 - x) > 1 || abs(449 - y) > 1) {
+ xpos = 1075;
+ manId = ST_MAN_RIGHT | 0x4000;
+ goto LABEL_31;
+ }
+
+ MGM mgm;
+ MGMInfo mgminfo;
+
+ mgm.addItem(ANI_MAN);
+ mgminfo.ani = g_fp->_aniMan;
+ mgminfo.staticsId2 = ST_MAN_RIGHT;
+ mgminfo.x1 = 934;
+ mgminfo.y1 = 391;
+ mgminfo.field_1C = 10;
+ mgminfo.staticsId1 = 0x4145;
+ mgminfo.x2 = 981;
+ mgminfo.y2 = 390;
+ mgminfo.field_10 = 1;
+ mgminfo.flags = 127;
+ mgminfo.movementId = rMV_MAN_TURN_SRL;
+
+ mq = mgm.genMovement(&mgminfo);
+
+ ExCommand *ex = mq->getExCommandByIndex(0);
+
+ mq->deleteExCommandByIndex(0, 0);
+
+ delete mq;
+
+ mq = new MessageQueue(g_fp->_currentScene->getMessageQueueById(QU_SC22_TOSTOOL_R), 0, 0);
+
+ mq->insertExCommandAt(2, ex);
+ mq->setFlags(mq->getFlags() | 1);
+ mq->chain(0);
+
+ g_vars->scene22_interactionIsDisabled = true;
+ } else {
+ if (abs(1010 - g_fp->_aniMan->_ox) <= 1) {
+ if (abs(443 - g_fp->_aniMan->_oy) <= 1) {
+ chainQueue(QU_SC22_TRYHANDLE, 1);
+ return;
+ }
+ }
+
+ mq = getCurrSceneSc2MotionController()->method34(g_fp->_aniMan, 1010, 443, 1, ST_MAN_UP);
+
+ if (mq) {
+ mq->addExCommandToEnd(cmd->createClone());
+
+ postExCommand(g_fp->_aniMan->_id, 2, 1010, 443, 0, -1);
+ return;
+ }
+ }
+ }
+ }
+}
+
+int sceneHandler22(ExCommand *cmd) {
+ if (cmd->_messageKind != 17)
+ return 0;
+
+ switch (cmd->_messageNum) {
+ case MSG_SC22_CRANEOUT_GMA:
+ chainQueue(QU_MSH_CRANEOUT_GMA, 1);
+ break;
+
+ case MSG_SC22_CHECKGMABOOT:
+ if (g_fp->getObjectState(sO_Grandma) == g_fp->getObjectEnumState(sO_Grandma, sO_In_15))
+ g_fp->setObjectState(sO_Boot_15, g_fp->getObjectEnumState(sO_Boot_15, sO_IsPresent));
+
+ break;
+
+ case MSG_SC22_SHOWSTOOL:
+ sceneHandler22_showStool();
+ break;
+
+ case MSG_SC22_HIDESTOOL:
+ sceneHandler22_hideStool();
+ break;
+
+ case MSG_SC22_FROMSTOOL:
+ g_vars->scene22_dudeIsOnStool = false;
+ g_vars->scene22_interactionIsDisabled = false;
+
+ getCurrSceneSc2MotionController()->setEnabled();
+ g_fp->_behaviorManager->setFlagByStaticAniObject(g_fp->_aniMan, 1);
+ break;
+
+ case MSG_SC22_ONSTOOL:
+ g_vars->scene22_dudeIsOnStool = true;
+ getCurrSceneSc2MotionController()->clearEnabled();
+ g_fp->_behaviorManager->setFlagByStaticAniObject(g_fp->_aniMan, 0);
+ break;
+
+ case MSG_SC22_HANDLEDOWN:
+ sceneHandler22_handleDown();
+ break;
+
+ case 29:
+ if (!g_vars->scene22_interactionIsDisabled) {
+ StaticANIObject *ani = g_fp->_currentScene->getStaticANIObjectAtPos(cmd->_sceneClickX, cmd->_sceneClickY);
+
+ if (ani && ani->_id == ANI_HANDLE_L) {
+ sceneHandler22_stoolLogic(cmd);
+ return 0;
+ }
+
+ if (!g_vars->scene22_dudeIsOnStool) {
+ if (!ani || !canInteractAny(g_fp->_aniMan, ani, cmd->_keyCode)) {
+ int picId = g_fp->_currentScene->getPictureObjectIdAtPos(cmd->_sceneClickX, cmd->_sceneClickY);
+ PictureObject *pic = g_fp->_currentScene->getPictureObjectById(picId, 0);
+
+ if (!pic || !canInteractAny(g_fp->_aniMan, pic, cmd->_keyCode)) {
+ if ((g_fp->_sceneRect.right - cmd->_sceneClickX < 47 && g_fp->_sceneRect.right < g_fp->_sceneWidth - 1)
+ || (cmd->_sceneClickX - g_fp->_sceneRect.left < 47 && g_fp->_sceneRect.left > 0)) {
+ g_fp->processArcade(cmd);
+ return 0;
+ }
+ }
+ }
+ return 0;
+ }
+
+ if (g_fp->_aniMan->_statics->_staticsId == ST_MAN_RIGHT && !g_fp->_aniMan->_movement) {
+ sceneHandler22_fromStool(cmd);
+
+ return 0;
+ }
+ }
+
+ cmd->_messageKind = 0;
+ break;
+
+ case 33:
+ if (g_fp->_aniMan2) {
+ int x = g_fp->_aniMan2->_ox;
+
+ if (x <= g_fp->_sceneWidth - 460) {
+ if (x < g_fp->_sceneRect.left + 200)
+ g_fp->_currentScene->_x = x - 300 - g_fp->_sceneRect.left;
+ } else {
+ g_fp->_currentScene->_x = g_fp->_sceneWidth - x;
+ }
+
+ if (x > g_fp->_sceneRect.right - 200)
+ g_fp->_currentScene->_x = x + 300 - g_fp->_sceneRect.right;
+
+ g_fp->_behaviorManager->updateBehaviors();
+
+ g_fp->startSceneTrack();
+ }
+
+ break;
+ }
+
+ return 0;
+}
+
+} // End of namespace Fullpipe
diff --git a/engines/fullpipe/scenes/scene23.cpp b/engines/fullpipe/scenes/scene23.cpp
new file mode 100644
index 0000000000..ccfbac9223
--- /dev/null
+++ b/engines/fullpipe/scenes/scene23.cpp
@@ -0,0 +1,555 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ */
+
+#include "fullpipe/fullpipe.h"
+
+#include "fullpipe/objectnames.h"
+#include "fullpipe/constants.h"
+
+#include "fullpipe/gameloader.h"
+#include "fullpipe/motion.h"
+#include "fullpipe/scenes.h"
+#include "fullpipe/statics.h"
+
+#include "fullpipe/interaction.h"
+#include "fullpipe/behavior.h"
+#include "fullpipe/floaters.h"
+
+namespace Fullpipe {
+
+bool sceneHandler23_testCalendar() {
+ int cal0, cal1, cal2, cal3;
+
+ if (g_vars->scene23_calend0->_movement)
+ cal0 = g_vars->scene23_calend0->_movement->_staticsObj2->_staticsId;
+ else
+ cal0 = g_vars->scene23_calend0->_statics->_staticsId;
+
+ if (g_vars->scene23_calend1->_movement)
+ cal1 = g_vars->scene23_calend1->_movement->_staticsObj2->_staticsId;
+ else
+ cal1 = g_vars->scene23_calend1->_statics->_staticsId;
+
+ if (g_vars->scene23_calend2->_movement)
+ cal2 = g_vars->scene23_calend2->_movement->_staticsObj2->_staticsId;
+ else
+ cal2 = g_vars->scene23_calend2->_statics->_staticsId;
+
+ if (g_vars->scene23_calend3->_movement)
+ cal3 = g_vars->scene23_calend3->_movement->_staticsObj2->_staticsId;
+ else
+ cal3 = g_vars->scene23_calend3->_statics->_staticsId;
+
+ return (cal0 == ST_CND_1 && cal1 == ST_CND_4 && cal2 == ST_CND_0 && cal3 == ST_CND_2 && (g_vars->scene23_giraffee->_flags & 4));
+}
+
+void scene23_initScene(Scene *sc) {
+ g_vars->scene23_calend0 = sc->getStaticANIObject1ById(ANI_CALENDWHEEL, 0);
+ g_vars->scene23_calend1 = sc->getStaticANIObject1ById(ANI_CALENDWHEEL, 1);
+ g_vars->scene23_calend2 = sc->getStaticANIObject1ById(ANI_CALENDWHEEL, 2);
+ g_vars->scene23_calend3 = sc->getStaticANIObject1ById(ANI_CALENDWHEEL, 3);
+ g_vars->scene23_topReached = false;
+ g_vars->scene23_isOnStool = false;
+ g_vars->scene23_someVar = 0;
+ g_vars->scene23_giraffeTop = sc->getStaticANIObject1ById(ANI_GIRAFFE_TOP, -1);
+ g_vars->scene23_giraffee = sc->getStaticANIObject1ById(ANI_GIRAFFEE, -1);
+
+ g_fp->_floaters->init(g_fp->getGameLoaderGameVar()->getSubVarByName("SC_23"));
+
+ Scene *oldsc = g_fp->_currentScene;
+ g_fp->_currentScene = sc;
+
+ if (g_fp->getObjectState(sO_UpperHatch_23) == g_fp->getObjectEnumState(sO_UpperHatch_23, sO_Opened)) {
+ sc->getPictureObjectById(PIC_SC23_BOXOPEN, 0)->_flags |= 4;
+ sc->getPictureObjectById(PIC_SC23_BOXCLOSED, 0)->_flags &= 0xFFFB;
+ sc->getPictureObjectById(PIC_SC23_BTN1, 0)->_flags |= 4;
+ sc->getPictureObjectById(PIC_SC23_BTN2, 0)->_flags |= 4;
+ sc->getPictureObjectById(PIC_SC23_BTN3, 0)->_flags |= 4;
+ sc->getPictureObjectById(PIC_SC23_BTN4, 0)->_flags |= 4;
+
+ if (g_vars->scene23_giraffee->_statics->_staticsId == ST_GRFG_EMPTY || !(g_vars->scene23_giraffee->_flags & 4)) {
+ g_vars->scene23_giraffee->changeStatics2(ST_GRFG_BALD);
+ g_vars->scene23_giraffee->_flags |= 4;
+ }
+ g_vars->scene23_calend0->show1(-1, -1, -1, 0);
+ g_vars->scene23_calend1->show1(-1, -1, -1, 0);
+ g_vars->scene23_calend2->show1(-1, -1, -1, 0);
+ g_vars->scene23_calend3->show1(-1, -1, -1, 0);
+
+ sc->getStaticANIObject1ById(ANI_LUK23_U, -1)->changeStatics2(ST_LUK23U_OPEN);
+ } else {
+ sc->getPictureObjectById(PIC_SC23_BOXOPEN, 0)->_flags &= 0xFFFB;
+ sc->getPictureObjectById(PIC_SC23_BOXCLOSED, 0)->_flags |= 4;
+ sc->getPictureObjectById(PIC_SC23_BTN1, 0)->_flags &= 0xFFFB;
+ sc->getPictureObjectById(PIC_SC23_BTN2, 0)->_flags &= 0xFFFB;
+ sc->getPictureObjectById(PIC_SC23_BTN3, 0)->_flags &= 0xFFFB;
+ sc->getPictureObjectById(PIC_SC23_BTN4, 0)->_flags &= 0xFFFB;
+
+ g_vars->scene23_giraffee->hide();
+ g_vars->scene23_calend0->hide();
+ g_vars->scene23_calend1->hide();
+ g_vars->scene23_calend2->hide();
+ g_vars->scene23_calend3->hide();
+
+ sc->getStaticANIObject1ById(ANI_LUK23_U, -1)->changeStatics2(ST_LUK23U_CLOSED);
+
+ g_fp->_floaters->genFlies(sc, 600, 90, 0, 0);
+ }
+
+ if (g_fp->getObjectState(sO_LowerHatch_23) == g_fp->getObjectEnumState(sO_LowerHatch_23, sO_Opened)) {
+ g_vars->scene23_giraffeTop->show1(-1, -1, -1, 0);
+ g_vars->scene23_giraffeTop->changeStatics2(ST_GRFU_UP);
+
+ if (g_fp->getObjectState(sO_LowerPipe_21) == g_fp->getObjectEnumState(sO_LowerPipe_21, sO_IsOpened)) {
+ g_vars->scene23_giraffeTop->changeStatics2(ST_GRFU_KISS);
+ g_vars->scene23_giraffee->hide();
+ } else {
+ if (g_fp->getObjectState(sO_UpperHatch_23) == g_fp->getObjectEnumState(sO_UpperHatch_23, sO_Opened)
+ && (g_vars->scene23_giraffee->_flags & 4))
+ g_vars->scene23_giraffeTop->setOXY(614, 362);
+ else
+ g_vars->scene23_giraffeTop->setOXY(618, 350);
+
+ if (sceneHandler23_testCalendar())
+ g_vars->scene23_calend1->_statics = g_vars->scene23_calend1->getStaticsById(ST_CND_5);
+ }
+
+ sc->getStaticANIObject1ById(ANI_LUK23_D, -1)->changeStatics2(ST_LUK23_OPEN);
+
+ if (g_fp->getObjectState(sO_Lever_23) == g_fp->getObjectEnumState(sO_Lever_23, sO_Taken))
+ sc->getStaticANIObject1ById(ANI_INV_LEVERHANDLE, -1)->hide();
+
+ sc->getStaticANIObject1ById(ANI_HANDLE23, -1)->hide();
+ } else {
+ g_vars->scene23_giraffeTop->hide();
+
+ sc->getStaticANIObject1ById(ANI_LUK23_D, -1)->changeStatics2(ST_LUK23_WHANDLE2);
+
+ sc->getStaticANIObject1ById(ANI_INV_LEVERHANDLE, -1)->hide();
+ }
+
+ g_fp->_currentScene = oldsc;
+}
+
+void scene23_setGiraffeState() {
+ if (g_fp->getObjectState(sO_UpperHatch_23) == g_fp->getObjectEnumState(sO_UpperHatch_23, sO_Opened)) {
+ g_fp->_behaviorManager->setBehaviorEnabled(g_vars->scene23_giraffeTop, ST_GRFU_UP, QU_GRFU_TURN_UL, 0);
+ g_fp->_behaviorManager->setBehaviorEnabled(g_vars->scene23_giraffeTop, ST_GRFU_UP, QU_GRFU_TURN_UD, 0);
+ }
+}
+
+int scene23_updateCursor() {
+ g_fp->updateCursorCommon();
+
+ if (g_fp->_objectIdAtCursor == PIC_SC23_LADDERU) {
+ if (g_vars->scene23_topReached)
+ return g_fp->_cursorId;
+
+ g_fp->_cursorId = getGameLoaderInventory()->getSelectedItemId() ? PIC_CSR_GOU : PIC_CSR_ITN; // FIXME check
+ }
+
+ if (g_fp->_objectIdAtCursor == PIC_SC23_BTN1 || g_fp->_objectIdAtCursor == PIC_SC23_BTN2
+ || g_fp->_objectIdAtCursor == PIC_SC23_BTN3 || g_fp->_objectIdAtCursor == PIC_SC23_BTN4
+ || g_fp->_objectIdAtCursor == ANI_CALENDWHEEL)
+ g_fp->_cursorId = PIC_CSR_LIFT;
+
+ return g_fp->_cursorId;
+}
+
+void sceneHandler23_showStool() {
+ chainQueue(QU_SC23_SHOWSTOOL, 0);
+}
+
+void sceneHandler23_hideStool() {
+ g_fp->_currentScene->getStaticANIObject1ById(ANI_TABURETTE, -1)->hide();
+}
+
+void sceneHandler23_startKiss() {
+ g_vars->scene23_giraffeTop->changeStatics2(ST_GRFU_UP);
+ g_vars->scene23_giraffeTop->startMQIfIdle(QU_SC23_STARTKISS, 0);
+}
+
+void sceneHandler23_spinWheel1() {
+ int mv = 0;
+
+ switch (g_vars->scene23_calend0->_statics->_staticsId) {
+ case ST_CND_0:
+ mv = MV_CND_0_1;
+ break;
+
+ case ST_CND_1:
+ mv = MV_CND_1_2;
+ break;
+
+ case ST_CND_2:
+ mv = MV_CND_2_3;
+ break;
+
+ case ST_CND_3:
+ g_vars->scene23_calend0->changeStatics2(ST_CND_9);
+ mv = MV_CND_9_0;
+ break;
+
+ default:
+ break;
+ }
+
+ if (mv)
+ g_vars->scene23_calend0->startAnim(mv, 0, -1);
+
+ if (sceneHandler23_testCalendar())
+ sceneHandler23_startKiss();
+}
+
+void sceneHandler23_spinWheel2and4(StaticANIObject *ani) {
+ int mv = 0;
+
+ switch (ani->_statics->_staticsId) {
+ case ST_CND_0:
+ mv = MV_CND_0_1;
+ break;
+
+ case ST_CND_1:
+ mv = MV_CND_1_2;
+ break;
+
+ case ST_CND_2:
+ mv = MV_CND_2_3;
+ break;
+
+ case ST_CND_3:
+ mv = MV_CND_3_4;
+ break;
+
+ case ST_CND_4:
+ mv = MV_CND_4_5;
+ break;
+
+ case ST_CND_5:
+ mv = MV_CND_5_6;
+ break;
+
+ case ST_CND_6:
+ mv = MV_CND_6_7;
+ break;
+
+ case ST_CND_7:
+ mv = MV_CND_7_8;
+ break;
+
+ case ST_CND_8:
+ mv = MV_CND_8_9;
+ break;
+
+ case ST_CND_9:
+ mv = MV_CND_9_0;
+ break;
+
+ default:
+ break;
+ }
+
+ if (mv)
+ ani->startAnim(mv, 0, -1);
+
+ if (sceneHandler23_testCalendar())
+ sceneHandler23_startKiss();
+}
+
+void sceneHandler23_spinWheel3() {
+ if (g_vars->scene23_calend2->_statics->_staticsId == ST_CND_0) {
+ g_vars->scene23_calend2->startAnim(MV_CND_0_1, 0, -1);
+ } else if (g_vars->scene23_calend2->_statics->_staticsId == ST_CND_1) {
+ g_vars->scene23_calend2->changeStatics2(ST_CND_9);
+ g_vars->scene23_calend2->startAnim(MV_CND_9_0, 0, -1);
+ }
+
+ if (sceneHandler23_testCalendar())
+ sceneHandler23_startKiss();
+}
+
+void sceneHandler23_pushButton(ExCommand *cmd) {
+ if (g_fp->_aniMan->isIdle() || !(g_fp->_aniMan->_flags & 0x100)) {
+ if (!g_vars->scene23_topReached) {
+ if (g_fp->_aniMan->_ox != 405 || g_fp->_aniMan->_oy != 220) {
+ if (g_fp->_aniMan->_ox != 276 || g_fp->_aniMan->_oy != 438
+ || g_fp->_aniMan->_movement || g_fp->_aniMan->_statics->_staticsId != ST_MAN_RIGHT) {
+ if (g_fp->_msgX == 276 && g_fp->_msgY == 438 )
+ return;
+
+ MessageQueue *mq = getCurrSceneSc2MotionController()->method34(g_fp->_aniMan, 276, 438, 1, ST_MAN_RIGHT);
+
+ if (mq) {
+ mq->addExCommandToEnd(cmd->createClone());;
+
+ postExCommand(g_fp->_aniMan->_id, 2, 276, 438, 0, -1);
+ }
+ } else {
+ MessageQueue *mq = new MessageQueue(g_fp->_currentScene->getMessageQueueById(QU_SC23_TOCALENDAR), 0, 0);
+
+ mq->addExCommandToEnd(cmd->createClone());;
+ mq->setFlags(mq->getFlags() | 1);
+ mq->chain(0);
+ }
+
+ if (!g_vars->scene23_topReached)
+ return;
+ } else {
+ g_vars->scene23_topReached = true;
+ }
+ }
+
+ if (!g_fp->_aniMan->_movement && g_fp->_aniMan->_statics->_staticsId == ST_MAN_STANDLADDER) {
+ int mv = 0;
+
+ switch (cmd->_messageNum) {
+ case MSG_SC23_CLICKBTN1:
+ mv = MV_MAN23_PUSH1;
+ break;
+
+ case MSG_SC23_CLICKBTN2:
+ mv = MV_MAN23_PUSH2;
+ break;
+
+ case MSG_SC23_CLICKBTN3:
+ mv = MV_MAN23_PUSH3;
+ break;
+
+ case MSG_SC23_CLICKBTN4:
+ mv = MV_MAN23_PUSH4;
+ break;
+
+ default:
+ return;
+ }
+
+ if (mv)
+ g_fp->_aniMan->startAnim(mv, 0, -1);
+
+ }
+ }
+}
+
+void sceneHandler23_sendClick(StaticANIObject *ani) {
+ int msg = 0;
+ switch (ani->_okeyCode) {
+ case 0:
+ msg = MSG_SC23_CLICKBTN1;
+ break;
+ case 1:
+ msg = MSG_SC23_CLICKBTN2;
+ break;
+ case 2:
+ msg = MSG_SC23_CLICKBTN3;
+ break;
+ case 3:
+ msg = MSG_SC23_CLICKBTN4;
+ break;
+ default:
+ break;
+ }
+
+ ExCommand *ex = new ExCommand(0, 17, msg, 0, 0, 0, 1, 0, 0, 0);
+ ex->_excFlags |= 3;
+
+ ex->postMessage();
+}
+
+void sceneHandler23_checkReachingTop() {
+ if (g_fp->_aniMan->_movement || g_fp->_aniMan->_statics->_staticsId != ST_MAN_STANDLADDER
+ || g_fp->_aniMan->_ox != 405 || g_fp->_aniMan->_oy != 220)
+ g_vars->scene23_topReached = false;
+ else
+ g_vars->scene23_topReached = true;
+}
+
+void sceneHandler23_exitCalendar() {
+ if (!g_fp->_aniMan->_movement && g_fp->_aniMan->_statics->_staticsId == ST_MAN_STANDLADDER
+ && !g_fp->_aniMan->getMessageQueue() && !(g_fp->_aniMan->_flags & 0x100)) {
+ chainQueue(QU_SC23_FROMCALENDAREXIT, 1);
+ g_vars->scene23_someVar = 2;
+ }
+}
+
+void sceneHandler23_fromCalendar(ExCommand *cmd) {
+ if (!g_fp->_aniMan->_movement && g_fp->_aniMan->_statics->_staticsId == ST_MAN_STANDLADDER
+ && !g_fp->_aniMan->getMessageQueue() && !(g_fp->_aniMan->_flags & 0x100)) {
+ MessageQueue *mq = new MessageQueue(g_fp->_currentScene->getMessageQueueById(QU_SC23_FROMCALENDAR), 0, 0);
+
+ mq->addExCommandToEnd(cmd->createClone());
+ mq->setFlags(mq->getFlags() | 1);
+ mq->chain(0);
+
+ g_vars->scene23_topReached = false;
+ g_vars->scene23_someVar = 0;
+ }
+}
+
+void sceneHandler23_fromStool(ExCommand *cmd) {
+ if (!g_fp->_aniMan->getMessageQueue() && !(g_fp->_aniMan->_flags & 0x100)) {
+ MessageQueue *mq = new MessageQueue(g_fp->_currentScene->getMessageQueueById(QU_SC23_FROMSTOOL), 0, 0);
+
+ mq->addExCommandToEnd(cmd->createClone());
+ mq->setFlags(mq->getFlags() | 1);
+ mq->chain(0);
+
+ cmd->_messageKind = 0;
+ }
+}
+
+int sceneHandler23(ExCommand *cmd) {
+ if (cmd->_messageKind != 17)
+ return 0;
+
+ switch (cmd->_messageNum) {
+ case MSG_SC23_FROMSTOOL:
+ g_vars->scene23_isOnStool = false;
+
+ getCurrSceneSc2MotionController()->setEnabled();
+ getGameLoaderInteractionController()->enableFlag24();
+
+ g_fp->_behaviorManager->setFlagByStaticAniObject(g_fp->_aniMan, 1);
+ break;
+
+ case MSG_SC23_HIDEGIRAFFEE:
+ g_vars->scene23_giraffee->queueMessageQueue(0);
+ g_vars->scene23_giraffee->_flags &= 0xFFFB;
+ break;
+
+ case MSG_SC23_ONSTOOL:
+ g_vars->scene23_isOnStool = true;
+
+ getCurrSceneSc2MotionController()->clearEnabled();
+ getGameLoaderInteractionController()->disableFlag24();
+
+ g_fp->_behaviorManager->setFlagByStaticAniObject(g_fp->_aniMan, 0);
+ break;
+
+ case MSG_SC22_SHOWSTOOL:
+ sceneHandler23_showStool();
+ break;
+
+ case MSG_SC22_HIDESTOOL:
+ sceneHandler23_hideStool();
+ break;
+
+ case MSG_SC23_SPINWHEEL1:
+ sceneHandler23_spinWheel1();
+ break;
+
+ case MSG_SC23_SPINWHEEL2:
+ sceneHandler23_spinWheel2and4(g_vars->scene23_calend1);
+ break;
+
+ case MSG_SC23_SPINWHEEL3:
+ sceneHandler23_spinWheel3();
+ break;
+
+ case MSG_SC23_SPINWHEEL4:
+ sceneHandler23_spinWheel2and4(g_vars->scene23_calend3);
+ break;
+
+ case MSG_SC23_CLICKBTN1:
+ case MSG_SC23_CLICKBTN2:
+ case MSG_SC23_CLICKBTN3:
+ case MSG_SC23_CLICKBTN4:
+ sceneHandler23_pushButton(cmd);
+ break;
+
+ case 33:
+ if (g_fp->_aniMan2) {
+ int x = g_fp->_aniMan2->_ox;
+
+ if (x < g_fp->_sceneRect.left + 200)
+ g_fp->_currentScene->_x = x - 300 - g_fp->_sceneRect.left;
+
+ if (x > g_fp->_sceneRect.right - 200)
+ g_fp->_currentScene->_x = x + 300 - g_fp->_sceneRect.right;
+ }
+
+ g_fp->_floaters->update();
+ g_fp->_behaviorManager->updateBehaviors();
+
+ g_fp->startSceneTrack();
+
+ break;
+
+ case 29:
+ {
+ StaticANIObject *ani = g_fp->_currentScene->getStaticANIObjectAtPos(cmd->_sceneClickX, cmd->_sceneClickY);
+ int picId;
+
+ if (ani && ani->_id == ANI_CALENDWHEEL) {
+ sceneHandler23_sendClick(ani);
+ cmd->_messageKind = 0;
+ }
+
+ sceneHandler23_checkReachingTop();
+
+ if (g_vars->scene23_topReached) {
+ picId = g_fp->_currentScene->getPictureObjectIdAtPos(cmd->_sceneClickX, cmd->_sceneClickY);
+
+ if (picId == PIC_SC23_LADDER) {
+ sceneHandler23_exitCalendar();
+
+ cmd->_messageKind = 0;
+ break;
+ }
+
+ if (cmd->_sceneClickY > 450) {
+ sceneHandler23_fromCalendar(cmd);
+
+ cmd->_messageKind = 0;
+ break;
+ }
+ break;
+ }
+
+ if (!g_vars->scene23_isOnStool) {
+ picId = g_fp->_currentScene->getPictureObjectIdAtPos(cmd->_sceneClickX, cmd->_sceneClickY);
+
+ if (picId == PIC_SC23_LADDERU && !g_vars->scene23_topReached) {
+ sceneHandler23_pushButton(cmd);
+
+ cmd->_messageKind = 0;
+ break;
+ }
+ break;
+ }
+
+ if (ani && ani->_id == ANI_HANDLE23) {
+ handleObjectInteraction(g_fp->_aniMan, ani, cmd->_keyCode);
+ cmd->_messageKind = 0;
+ } else {
+ sceneHandler23_fromStool(cmd);
+
+ cmd->_messageKind = 0;
+ }
+
+ break;
+ }
+ }
+
+ return 0;
+}
+
+} // End of namespace Fullpipe
diff --git a/engines/fullpipe/scenes/scene24.cpp b/engines/fullpipe/scenes/scene24.cpp
new file mode 100644
index 0000000000..2eb536df3f
--- /dev/null
+++ b/engines/fullpipe/scenes/scene24.cpp
@@ -0,0 +1,129 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public 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 "fullpipe/fullpipe.h"
+
+#include "fullpipe/objectnames.h"
+#include "fullpipe/constants.h"
+
+#include "fullpipe/gameloader.h"
+#include "fullpipe/motion.h"
+#include "fullpipe/scenes.h"
+#include "fullpipe/statics.h"
+
+#include "fullpipe/interaction.h"
+#include "fullpipe/behavior.h"
+
+
+namespace Fullpipe {
+
+void scene24_initScene(Scene *sc) {
+ g_vars->scene24_water = sc->getStaticANIObject1ById(ANI_WATER24, -1);
+ g_vars->scene24_jet = sc->getStaticANIObject1ById(ANI_JET24, -1);
+ g_vars->scene24_drop = sc->getStaticANIObject1ById(ANI_DROP_24, -1);
+
+ g_vars->scene24_water->setAlpha(0xa0);
+ g_vars->scene24_jet->setAlpha(0xa0);
+ g_vars->scene24_drop->setAlpha(0xa0);
+
+ Scene *oldsc = g_fp->_currentScene;
+ g_fp->_currentScene = sc;
+
+ if (g_fp->getObjectState(sO_Pool) == g_fp->getObjectEnumState(sO_Pool, sO_Overfull)) {
+ g_vars->scene24_jetIsOn = true;
+ g_vars->scene24_flowIsLow = false;
+ } else {
+ g_vars->scene24_jet->hide();
+
+ g_vars->scene24_jetIsOn = false;
+
+ g_vars->scene24_water->changeStatics2(ST_WTR24_FLOWLOWER);
+
+ g_vars->scene24_flowIsLow = true;
+ }
+
+ if (g_fp->getObjectState(sO_Pool) < g_fp->getObjectEnumState(sO_Pool, sO_Full)) {
+ g_vars->scene24_waterIsOn = false;
+
+ g_vars->scene24_water->hide();
+
+ g_fp->setObjectState(sO_StairsDown_24, g_fp->getObjectEnumState(sO_StairsDown_24, sO_IsOpened));
+ } else {
+ g_vars->scene24_waterIsOn = true;
+
+ g_fp->setObjectState(sO_StairsDown_24, g_fp->getObjectEnumState(sO_StairsDown_24, sO_IsClosed));
+ }
+
+ g_fp->_currentScene = oldsc;
+}
+
+void scene24_setPoolState() {
+ if (g_fp->getObjectState(sO_Pool) == g_fp->getObjectEnumState(sO_Pool, sO_Overfull)) {
+ g_fp->_behaviorManager->setFlagByStaticAniObject(g_vars->scene24_drop, 0);
+
+ g_fp->playSound(SND_24_007, 1);
+ } else if (g_fp->getObjectState(sO_Pool) == g_fp->getObjectEnumState(sO_Pool, sO_Full)) {
+ g_fp->_behaviorManager->setBehaviorEnabled(g_vars->scene24_drop, ST_DRP24_EMPTY, QU_DRP24_TOFLOOR, 0);
+ g_fp->_behaviorManager->setBehaviorEnabled(g_vars->scene24_drop, ST_DRP24_EMPTY, QU_DRP24_TOWATER, 1);
+ g_fp->_behaviorManager->setBehaviorEnabled(g_vars->scene24_drop, ST_DRP24_EMPTY, QU_DRP24_TOWATER2, 0);
+
+ g_fp->playSound(SND_24_006, 1);
+ } else if (g_fp->getObjectState(sO_Pool) == g_fp->getObjectEnumState(sO_Pool, sO_HalfFull)) {
+ g_fp->_behaviorManager->setBehaviorEnabled(g_vars->scene24_drop, ST_DRP24_EMPTY, QU_DRP24_TOFLOOR, 0);
+ g_fp->_behaviorManager->setBehaviorEnabled(g_vars->scene24_drop, ST_DRP24_EMPTY, QU_DRP24_TOWATER, 0);
+ g_fp->_behaviorManager->setBehaviorEnabled(g_vars->scene24_drop, ST_DRP24_EMPTY, QU_DRP24_TOWATER2, 1);
+ } else {
+ g_fp->_behaviorManager->setBehaviorEnabled(g_vars->scene24_drop, ST_DRP24_EMPTY, QU_DRP24_TOFLOOR, 1);
+ g_fp->_behaviorManager->setBehaviorEnabled(g_vars->scene24_drop, ST_DRP24_EMPTY, QU_DRP24_TOWATER, 0);
+ g_fp->_behaviorManager->setBehaviorEnabled(g_vars->scene24_drop, ST_DRP24_EMPTY, QU_DRP24_TOWATER2, 0);
+ }
+}
+
+int sceneHandler24(ExCommand *cmd) {
+ if (cmd->_messageKind == 17 && cmd->_messageNum == 33) {
+ if (g_fp->_aniMan2) {
+ int x = g_fp->_aniMan2->_ox;
+
+ if (x < g_fp->_sceneRect.left + 200) {
+ g_fp->_currentScene->_x = x - 300 - g_fp->_sceneRect.left;
+ }
+ if (x > g_fp->_sceneRect.right - 200)
+ g_fp->_currentScene->_x = x + 300 - g_fp->_sceneRect.right;
+ }
+
+ if (g_vars->scene24_waterIsOn && !g_vars->scene24_water->_movement) {
+ if (g_vars->scene24_flowIsLow)
+ g_vars->scene24_water->startAnim(MV_WTR24_FLOWLOWER, 0, -1);
+ else
+ g_vars->scene24_water->startAnim(MV_WTR24_FLOW, 0, -1);
+ }
+
+ if (g_vars->scene24_jetIsOn && !g_vars->scene24_jet->_movement)
+ g_vars->scene24_jet->startAnim(MV_JET24_FLOW, 0, -1);
+
+ g_fp->_behaviorManager->updateBehaviors();
+ }
+
+ return 0;
+}
+
+} // End of namespace Fullpipe
diff --git a/engines/fullpipe/scenes/scene25.cpp b/engines/fullpipe/scenes/scene25.cpp
new file mode 100644
index 0000000000..a07330f057
--- /dev/null
+++ b/engines/fullpipe/scenes/scene25.cpp
@@ -0,0 +1,723 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public 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 "fullpipe/fullpipe.h"
+
+#include "fullpipe/objectnames.h"
+#include "fullpipe/constants.h"
+
+#include "fullpipe/gameloader.h"
+#include "fullpipe/motion.h"
+#include "fullpipe/scenes.h"
+#include "fullpipe/statics.h"
+
+#include "fullpipe/interaction.h"
+#include "fullpipe/behavior.h"
+
+
+namespace Fullpipe {
+
+void scene25_showBoardOnRightFar() {
+ g_vars->scene25_board->show1(453, 557, MV_BRD25_RIGHT, 0);
+ g_vars->scene25_board->_priority = 28;
+}
+
+void scene25_showBoardOnRightClose() {
+ g_vars->scene25_board->show1(632, 557, rMV_BRD25_RIGHT, 0);
+ g_vars->scene25_board->_priority = 28;
+}
+
+void scene25_initScene(Scene *sc, int entranceId) {
+ g_vars->scene25_water = sc->getStaticANIObject1ById(ANI_WATER25, -1);
+ g_vars->scene25_board = sc->getStaticANIObject1ById(ANI_BOARD25, -1);
+ g_vars->scene25_drop = sc->getStaticANIObject1ById(ANI_DROP_25, -1);
+ g_vars->scene25_water->setAlpha(0xa0);
+ g_vars->scene25_drop->setAlpha(0xa0);
+ g_vars->scene25_dudeIsOnBoard = false;
+
+ if (g_fp->getObjectState(sO_Pool) < g_fp->getObjectEnumState(sO_Pool, sO_HalfFull)) {
+ g_vars->scene25_waterIsPresent = false;
+
+ g_vars->scene25_water->hide();
+ } else {
+ g_vars->scene25_waterIsPresent = true;
+
+ g_fp->playSound(SND_25_006, 1);
+ }
+
+ int boardState = g_fp->getObjectState(sO_Board_25);
+
+ if (entranceId == TrubaRight) {
+ if (boardState == g_fp->getObjectEnumState(sO_Board_25, sO_FarAway)) {
+ scene25_showBoardOnRightFar();
+
+ g_fp->playSound(SND_25_029, 0);
+
+ g_vars->scene25_boardIsSelectable = false;
+ } else {
+ if (boardState == g_fp->getObjectEnumState(sO_Board_25, sO_Nearby)
+ || boardState == g_fp->getObjectEnumState(sO_Board_25, sO_WithDudeOnRight))
+ scene25_showBoardOnRightClose();
+ g_vars->scene25_boardIsSelectable = false;
+ }
+ } else {
+ if (boardState == g_fp->getObjectEnumState(sO_Board_25, sO_WithDudeOnLeft)) {
+ if (!getGameLoaderInventory()->getCountItemsWithId(ANI_INV_BOARD)) {
+ getGameLoaderInventory()->addItem(ANI_INV_BOARD, 1);
+ getGameLoaderInventory()->rebuildItemRects();
+ }
+ } else {
+ g_vars->scene25_boardIsSelectable = true;
+ }
+ }
+
+ g_vars->scene25_beardersAreThere = false;
+ g_vars->scene25_beardersCounter = 0;
+}
+
+int scene25_updateCursor() {
+ g_fp->updateCursorCommon();
+
+ if (g_vars->scene25_waterIsPresent) {
+ int inv = getGameLoaderInventory()->getSelectedItemId();
+
+ if (g_fp->_objectIdAtCursor == ANI_WATER25) {
+ if ((g_vars->scene25_boardIsSelectable && (!inv || inv == ANI_INV_BOARD)) || (g_vars->scene25_dudeIsOnBoard && (inv == ANI_INV_LOPAT || !inv)))
+ g_fp->_cursorId = (g_fp->_cursorId != PIC_CSR_DEFAULT) ? PIC_CSR_ITN : PIC_CSR_ITN_INV; // FIXME check
+ } else if (g_fp->_objectIdAtCursor == ANI_BOARD25 && (!inv || inv == ANI_INV_SWAB || inv == ANI_INV_BROOM || inv == ANI_INV_LOPAT)) {
+ g_fp->_cursorId = (g_fp->_cursorId != PIC_CSR_DEFAULT) ? PIC_CSR_ITN : PIC_CSR_ITN_INV;
+ }
+ }
+
+ return g_fp->_cursorId;
+}
+
+void scene25_setupWater(Scene *a1, int entranceId) {
+ if (g_vars->scene25_waterIsPresent) {
+ g_fp->_behaviorManager->setBehaviorEnabled(g_vars->scene25_drop, ST_DRP25_EMPTY, QU_DRP25_TOFLOOR, 0);
+ g_fp->_behaviorManager->setBehaviorEnabled(g_vars->scene25_drop, ST_DRP25_EMPTY, QU_DRP25_TOWATER, 1);
+
+ if (entranceId != TrubaRight)
+ g_fp->playTrack(g_fp->getGameLoaderGameVar()->getSubVarByName("SC_25"), "MUSIC2", 0);
+ } else {
+ g_fp->_behaviorManager->setBehaviorEnabled(g_vars->scene25_drop, ST_DRP25_EMPTY, QU_DRP25_TOFLOOR, 1);
+ g_fp->_behaviorManager->setBehaviorEnabled(g_vars->scene25_drop, ST_DRP25_EMPTY, QU_DRP25_TOWATER, 0);
+ }
+}
+
+void sceneHandler25_stopBearders() {
+ g_vars->scene25_beardersAreThere = false;
+
+ g_vars->scene25_bearders.clear();
+}
+
+void sceneHandler25_startBearders() {
+ g_vars->scene25_bearders.clear();
+ g_vars->scene25_beardersCounter = 0;
+
+ StaticANIObject *bearded = g_fp->accessScene(SC_COMMON)->getStaticANIObject1ById(ANI_BEARDED_CMN, -1);
+
+ for (int i = 0; i < 3; i++) {
+ StaticANIObject *ani = new StaticANIObject(bearded);
+
+ g_vars->scene25_bearders.push_back(ani);
+
+ ani->_statics = ani->getStaticsById(ST_BRDCMN_EMPTY);
+
+ g_fp->_currentScene->addStaticANIObject(ani, 1);
+ }
+
+ g_vars->scene25_beardersAreThere = true;
+}
+
+void sceneHandler25_enterMan() {
+ if (g_vars->scene25_waterIsPresent) {
+ chainQueue(QU_SC25_ENTERUP_WATER, 1);
+
+ getCurrSceneSc2MotionController()->clearEnabled();
+ } else {
+ chainQueue(QU_SC25_ENTERUP_FLOOR, 1);
+ }
+}
+
+void sceneHandler25_enterTruba() {
+ PicAniInfo info;
+
+ g_fp->_aniMan->getPicAniInfo(&info);
+ g_fp->_aniMan->_messageQueueId = 0;
+ g_fp->_aniMan->changeStatics2(g_fp->_aniMan->_statics->_staticsId);
+
+ int x = g_fp->_aniMan->_ox;
+ int y = g_fp->_aniMan->_oy;
+
+ g_fp->_aniMan->setPicAniInfo(&info);
+
+ int id = g_fp->_aniMan->_statics->_staticsId;
+ int qid = 0;
+
+ if (id == ST_MAN25_ONBOARD && x == 634 && y == 502) {
+ g_fp->_aniMan->changeStatics2(ST_MAN25_ONBOARD);
+
+ qid = QU_SC25_MANTOTRUBA;
+ } else if (id == (ST_MAN25_ONBOARD|0x4000) && x == 632 && y == 502) {
+ g_fp->_aniMan->changeStatics2(ST_MAN25_ONBOARD|0x4000);
+
+ qid = QU_SC25_MANTOTRUBA_R;
+ }
+
+ if (qid) {
+ chainQueue(qid, 1);
+ g_vars->scene25_sneezeFlipper = false;
+ }
+}
+
+void sceneHandler25_saveEntrance(int value) {
+ g_fp->getGameLoaderGameVar()->getSubVarByName("OBJSTATES")->getSubVarByName("SAVEGAME")->setSubVarAsInt("Entrance", value);
+}
+
+void sceneHandler25_toLadder() {
+ PicAniInfo info;
+
+ g_fp->_aniMan->getPicAniInfo(&info);
+ g_fp->_aniMan->_messageQueueId = 0;
+ g_fp->_aniMan->changeStatics2(g_fp->_aniMan->_statics->_staticsId);
+
+ int x = g_fp->_aniMan->_ox;
+ int y = g_fp->_aniMan->_oy;
+
+ g_fp->_aniMan->setPicAniInfo(&info);
+
+ int id = g_fp->_aniMan->_statics->_staticsId;
+ int qid = 0;
+
+ if (id == ST_MAN25_ONBOARD && x == 307 && y == 502) {
+ g_fp->_aniMan->changeStatics2(ST_MAN25_ONBOARD);
+
+ qid = QU_SC25_BACKTOLADDER;
+ } else if (id == (ST_MAN25_ONBOARD|0x4000) && x == 192 && y == 502) {
+ g_fp->_aniMan->changeStatics2(ST_MAN25_ONBOARD|0x4000);
+
+ qid = QU_SC25_BOARDTOLADDER;
+ }
+
+ if (qid) {
+ chainQueue(qid, 1);
+ g_vars->scene25_dudeIsOnBoard = false;
+ g_vars->scene25_boardIsSelectable = true;
+ g_vars->scene25_sneezeFlipper = false;
+
+ sceneHandler25_saveEntrance(TrubaUp);
+ }
+}
+
+void sceneHandler25_animateBearders() {
+ if (g_fp->_rnd->getRandomNumber(32767) < 218) {
+ MessageQueue *mq;
+
+ mq = new MessageQueue(g_fp->_currentScene->getMessageQueueById(QU_SC25_BEARDED), 0, 1);
+
+ mq->replaceKeyCode(-1, g_vars->scene25_bearders[0]->_okeyCode);
+ mq->getExCommandByIndex(0)->_x = g_fp->_rnd->getRandomNumber(650) + 100;
+ mq->chain(0);
+
+ g_vars->scene25_beardersCounter = 0;
+
+ if (g_fp->_rnd->getRandomNumber(32767) < 0x1FFF) {
+ mq = new MessageQueue(g_fp->_currentScene->getMessageQueueById(QU_SC25_BEARDED2), 0, 1);
+
+ mq->replaceKeyCode(-1, g_vars->scene25_bearders[1]->_okeyCode);
+ mq->getExCommandByIndex(0)->_x = g_fp->_rnd->getRandomNumber(650) + 100;
+ mq->chain(0);
+
+ if (g_fp->_rnd->getRandomNumber(32767) < 8191) {
+ mq = new MessageQueue(g_fp->_currentScene->getMessageQueueById(QU_SC25_BEARDED3), 0, 1);
+
+ mq->replaceKeyCode(-1, g_vars->scene25_bearders[2]->_okeyCode);
+ mq->getExCommandByIndex(0)->_x = g_fp->_rnd->getRandomNumber(650) + 100;
+ mq->chain(0);
+ }
+ }
+ }
+}
+
+void sceneHandler25_sneeze() {
+ if (g_fp->_rnd->getRandomNumber(32767) % 10) {
+ if (g_fp->_aniMan->_statics->_staticsId == ST_MAN25_ONBOARD) {
+ g_fp->_aniMan->startAnim(MV_MAN25_ONBOARD, 0, -1);
+ } else if (g_fp->_aniMan->_statics->_staticsId == (ST_MAN25_ONBOARD|0x4000)) {
+ g_fp->_aniMan->startAnim(rMV_MAN25_ONBOARD, 0, -1);
+ }
+ } else if (g_fp->_aniMan->_statics->_staticsId == ST_MAN25_ONBOARD) {
+ g_fp->_aniMan->startAnim(MV_MAN25_CHIH, 0, -1);
+ } else if (g_fp->_aniMan->_statics->_staticsId == (ST_MAN25_ONBOARD|0x4000)) {
+ g_fp->_aniMan->startAnim(rMV_MAN25_CHIH, 0, -1);
+ }
+}
+
+void sceneHandler25_rowShovel() {
+ PicAniInfo info;
+
+ g_fp->_aniMan->getPicAniInfo(&info);
+ g_fp->_aniMan->_messageQueueId = 0;
+ g_fp->_aniMan->changeStatics2(g_fp->_aniMan->_statics->_staticsId);
+
+ int x = g_fp->_aniMan->_ox;
+ int y = g_fp->_aniMan->_oy;
+
+ g_fp->_aniMan->setPicAniInfo(&info);
+
+ int id = g_fp->_aniMan->_statics->_staticsId;
+ int qid = 0;
+
+ if (id == ST_MAN25_ONBOARD && x == 370 && y == 502) {
+ g_fp->_aniMan->changeStatics2(ST_MAN25_ONBOARD);
+
+ qid = QU_SC25_ROWTOTRUBA;
+ } else if (id == (ST_MAN25_ONBOARD|0x4000) && x == 632 && y == 502) {
+ g_fp->_aniMan->changeStatics2(ST_MAN25_ONBOARD|0x4000);
+
+ qid = QU_SC25_ROWTOLADDER;
+
+ g_fp->playSound(SND_25_030, 0);
+ }
+
+ if (qid) {
+ chainQueue(qid, 1);
+
+ g_vars->scene25_sneezeFlipper = false;
+ }
+}
+
+void sceneHandler25_rowHand() {
+ PicAniInfo info;
+
+ g_fp->_aniMan->getPicAniInfo(&info);
+ g_fp->_aniMan->_messageQueueId = 0;
+ g_fp->_aniMan->changeStatics2(g_fp->_aniMan->_statics->_staticsId);
+
+ int x = g_fp->_aniMan->_ox;
+ int y = g_fp->_aniMan->_oy;
+
+ g_fp->_aniMan->setPicAniInfo(&info);
+
+ int id = g_fp->_aniMan->_statics->_staticsId;
+ int qid = 0;
+
+ if (id == ST_MAN25_ONBOARD && x == 370 && y == 502) {
+ g_fp->_aniMan->changeStatics2(ST_MAN25_ONBOARD);
+
+ qid = QU_SC25_TRYROWHAND;
+ } else if (id == (ST_MAN25_ONBOARD|0x4000) && x == 632 && y == 502) {
+ g_fp->_aniMan->changeStatics2(ST_MAN25_ONBOARD|0x4000);
+
+ qid = QU_SC25_TRYROWHAND_R;
+ }
+
+ if (qid) {
+ chainObjQueue(g_fp->_aniMan, qid, 1);
+ g_vars->scene25_sneezeFlipper = false;
+ }
+}
+
+void sceneHandler25_putBoard() {
+ if (g_fp->_aniMan->_statics->_staticsId == ST_MAN_STANDLADDER
+ || g_fp->_aniMan->_statics->_staticsId == ST_MAN_LADDERDOWN_R) {
+ g_fp->_aniMan->changeStatics2(ST_MAN_STANDLADDER);
+ g_fp->_aniMan->setOXY(281, 481);
+
+ chainQueue(QU_SC25_PUTBOARD, 1);
+
+ g_vars->scene25_dudeIsOnBoard = true;
+ g_vars->scene25_sneezeFlipper = false;
+ g_vars->scene25_boardIsSelectable = false;
+ }
+}
+
+void sceneHandler25_tryWater() {
+ if (g_fp->_aniMan->_statics->_staticsId == ST_MAN_STANDLADDER
+ || g_fp->_aniMan->_statics->_staticsId == ST_MAN_LADDERDOWN_R) {
+ g_fp->_aniMan->changeStatics2(ST_MAN_STANDLADDER);
+
+ chainQueue(QU_SC25_TRYWATER, 1);
+ }
+}
+
+void sceneHandler25_tryRow(int obj) {
+ PicAniInfo info;
+
+ g_fp->_aniMan->getPicAniInfo(&info);
+ g_fp->_aniMan->_messageQueueId = 0;
+ g_fp->_aniMan->changeStatics2(ST_MAN_RIGHT|0x4000);
+
+ int x = g_fp->_aniMan->_ox;
+ int y = g_fp->_aniMan->_oy;
+
+ g_fp->_aniMan->setPicAniInfo(&info);
+
+ int qid = 0;
+
+ if (x == 788 && y == 468) {
+ if (g_vars->scene25_board->_statics->_staticsId == ST_BRD25_RIGHT2) {
+ if (obj == ANI_INV_BROOM) {
+ g_fp->_aniMan->changeStatics2(ST_MAN_RIGHT|0x4000);
+
+ qid = QU_SC25_TRYBROOM;
+ }
+ if (obj == ANI_INV_LOPAT) {
+ g_fp->_aniMan->changeStatics2(ST_MAN_RIGHT|0x4000);
+
+ qid = QU_SC25_TRYSPADE;
+ }
+
+ if (qid) {
+ chainQueue(qid, 1);
+
+ g_fp->playSound(SND_25_028, 0);
+
+ return;
+ }
+
+ if (obj == ANI_INV_SWAB) {
+ g_fp->_aniMan->changeStatics2(ST_MAN_RIGHT|0x4000);
+
+ chainQueue(QU_SC25_TRYSWAB, 1);
+ } else if (!obj) {
+ g_fp->_aniMan->changeStatics2(ST_MAN_RIGHT|0x4000);
+
+ chainObjQueue(g_fp->_aniMan, QU_SC25_TRYHAND, 1);
+
+ g_fp->playSound(SND_25_028, 0);
+ }
+ } else if (g_vars->scene25_board->_statics->_staticsId == (ST_MAN_RIGHT|0x4000) && !obj) {
+ g_fp->_aniMan->changeStatics2(ST_MAN_RIGHT|0x4000);
+
+ chainQueue(QU_SC25_TRUBATOBOARD, 1);
+
+ g_vars->scene25_dudeIsOnBoard = true;
+ }
+ }
+}
+
+void sceneHandler25_ladderUp() {
+ if (g_fp->_aniMan->_statics->_staticsId == ST_MAN_STANDLADDER
+ || g_fp->_aniMan->_statics->_staticsId == ST_MAN_LADDERDOWN_R) {
+ g_fp->_aniMan->changeStatics2(ST_MAN_STANDLADDER);
+
+ chainQueue(QU_SC25_LADDERUP, 1);
+ }
+}
+
+void sceneHandler25_backToPipe() {
+ if (!g_fp->_aniMan->_movement && g_fp->_aniMan->_statics->_staticsId == (ST_MAN_RIGHT|0x4000)) {
+ g_fp->_aniMan->changeStatics2(ST_MAN_RIGHT|0x4000);
+
+ chainQueue(QU_SC25_BACKTOTRUBA, 1);
+ }
+}
+
+void sceneHandler25_walkOnLadder(StaticANIObject *ani, Common::Point *pnt, MessageQueue *mq, int flag) {
+ int aniY = ani->_oy;
+ int newx = 0, newy = 0;
+ Common::Point point;
+ ExCommand *ex;
+
+ if (flag) {
+ if (ani->_movement) {
+ ani->_movement->calcSomeXY(point, 0, ani->_movement->_currDynamicPhaseIndex);
+ newx = point.x;
+ aniY = ani->_oy - point.y;
+ }
+ }
+
+ int pntx = pnt->x;
+ int pnty = pnt->y;
+ int numObsolete = -1;
+ int minDistance = 20000;
+ ExCommand *lastEx = 0;
+
+ for (uint i = 0; i < mq->getCount(); i++) {
+ int curDistance = abs(pnty - aniY);
+
+ ex = mq->getExCommandByIndex(i);
+
+ if (ex->_messageKind == 1 && ani->_id == ex->_parentId) {
+ if (ex->_excFlags & 0x10000) {
+ if (ex->_messageNum == MV_MAN_TOLADDER)
+ ex->_messageNum = MV_MAN_TOLADDER2;
+ if (ex->_messageNum == MV_MAN_STARTLADDER)
+ ex->_messageNum = MV_MAN_STARTLADDER2;
+ if (ex->_messageNum == MV_MAN_GOLADDER)
+ ex->_messageNum = MV_MAN_GOLADDER2;
+ if (ex->_messageNum == MV_MAN_STOPLADDER)
+ ex->_messageNum = MV_MAN_STOPLADDER2;
+ }
+
+ if (curDistance < minDistance || numObsolete < 0) {
+ numObsolete = i;
+ minDistance = curDistance;
+ lastEx = ex;
+ newx = pntx;
+ newy = pnty;
+ }
+
+ ani->getMovementById(ex->_messageNum)->calcSomeXY(point, 0, -1);
+ pntx += point.x;
+ pnty += point.y;
+ }
+ }
+
+ for (int i = 0; i < numObsolete; i++)
+ mq->deleteExCommandByIndex(0, 1);
+
+ ex = new ExCommand(ani->_id, 34, 256, 0, 0, 0, 1, 0, 0, 0);
+
+ ex->_field_14 = 256;
+ ex->_messageNum = 0;
+ ex->_excFlags |= 3;
+
+ mq->addExCommandToEnd(ex);
+
+ if (flag && ani->_movement && ani->_movement->_id == mq->getExCommandByIndex(0)->_messageNum) {
+ mq->deleteExCommandByIndex(0, 1);
+
+ int movId = ani->_movement->_id;
+ int idx = ani->_movement->_currDynamicPhaseIndex;
+
+ ani->changeStatics2(ani->_movement->_staticsObj1->_staticsId);
+ ani->setOXY(newx, newy);
+
+ ani->startAnim(movId, mq->_id, -1);
+
+ ani->_movement->setDynamicPhaseIndex(idx);
+ } else {
+ if (!lastEx)
+ error("sceneHandler25_walkOnLadder(): Incorrect state. Please report this to sev");
+
+ ani->changeStatics2(ani->getMovementById(lastEx->_messageNum)->_staticsObj1->_staticsId);
+ ani->setOXY(newx, newy);
+ ani->restartMessageQueue(mq);
+ }
+
+ ani->_flags |= 1;
+}
+
+bool sceneHandler25_isOnLadder(ExCommand *cmd) {
+ if ((g_fp->_aniMan->_movement && g_fp->_aniMan->_movement->_id == MV_MAN_GOLADDERDOWN)
+ || g_fp->_aniMan->_statics->_staticsId == ST_MAN_GOLADDERD) {
+ Interaction *inter = getGameLoaderInteractionController()->getInteractionByObjectIds(PIC_SC25_LADDERDOWN, ANI_MAN, cmd->_keyCode);
+
+ if (!inter)
+ return 0;
+
+ MessageQueue *mq = new MessageQueue(inter->_messageQueue, 0, 1);
+ PictureObject *pic = g_fp->_currentScene->getPictureObjectById(PIC_SC25_LADDERDOWN, 0);
+ Common::Point point;
+
+ point.x = inter->_xOffs + pic->_ox;
+ point.y = inter->_yOffs + pic->_oy;
+
+ mq->setFlags(mq->getFlags() | 1);
+
+ sceneHandler25_walkOnLadder(g_fp->_aniMan, &point, mq, 0);
+
+ return true;
+ } else {
+ return false;
+ }
+}
+
+void sceneHandler25_sub03() {
+ warning("STUB: sceneHandler25_sub03()");
+}
+
+int sceneHandler25(ExCommand *cmd) {
+ if (cmd->_messageKind != 17)
+ return 0;
+
+ switch (cmd->_messageNum) {
+ case MSG_SC25_STOPBEARDEDS:
+ sceneHandler25_stopBearders();
+ break;
+
+ case MSG_SC25_STARTBEARDEDS:
+ sceneHandler25_startBearders();
+ break;
+
+ case MSG_SC25_ENTERMAN:
+ sceneHandler25_enterMan();
+ break;
+
+ case MSG_SC25_ENTERTRUBA:
+ sceneHandler25_enterTruba();
+ break;
+
+ case MSG_SC25_TOLADDER:
+ sceneHandler25_toLadder();
+ break;
+
+ case MSG_BRD_TURN:
+ switch (g_fp->_rnd->getRandomNumber(3)) {
+ case 0:
+ g_fp->playSound(SND_25_025, 0);
+ break;
+
+ case 1:
+ g_fp->playSound(SND_25_026, 0);
+ break;
+
+ default:
+ g_fp->playSound(SND_25_027, 0);
+ break;
+ }
+ break;
+
+ case 33:
+ if (g_fp->_aniMan2) {
+ int x = g_fp->_aniMan2->_ox;
+ int y = g_fp->_aniMan2->_oy;
+
+ if (x < g_fp->_sceneRect.left + 200)
+ g_fp->_currentScene->_x = x - 300 - g_fp->_sceneRect.left;
+
+ if (x > g_fp->_sceneRect.right - 200)
+ g_fp->_currentScene->_x = x + 300 - g_fp->_sceneRect.right;
+
+ if (!g_vars->scene25_waterIsPresent) {
+ if (y < g_fp->_sceneRect.top + 200)
+ g_fp->_currentScene->_y = y - 300 - g_fp->_sceneRect.top;
+
+ if (y > g_fp->_sceneRect.bottom - 200)
+ g_fp->_currentScene->_y = y + 300 - g_fp->_sceneRect.bottom;
+ }
+ }
+
+ if (g_vars->scene25_beardersAreThere) {
+ g_vars->scene25_beardersCounter++;
+
+ if (g_vars->scene25_beardersCounter >= 120)
+ sceneHandler25_animateBearders();
+ }
+
+ g_fp->_behaviorManager->updateBehaviors();
+ g_fp->startSceneTrack();
+
+ if (g_vars->scene25_waterIsPresent && !g_vars->scene25_water->_movement)
+ g_vars->scene25_water->startAnim(MV_WTR25_FLOW, 0, -1);
+
+ if (g_vars->scene25_dudeIsOnBoard && !g_fp->_aniMan->_movement && g_vars->scene25_sneezeFlipper)
+ sceneHandler25_sneeze();
+
+ g_vars->scene25_sneezeFlipper = true;
+
+ if (g_vars->scene25_board->_flags & 4) {
+ if (!g_vars->scene25_board->_movement) {
+ if (g_vars->scene25_board->_statics->_staticsId & 0x4000)
+ g_vars->scene25_board->startAnim(rMV_BRD25_RIGHT, 0, -1);
+ else
+ g_vars->scene25_board->startAnim(MV_BRD25_RIGHT, 0, -1);
+ }
+ }
+ break;
+
+ case 29:
+ {
+ int picId = g_fp->_currentScene->getPictureObjectIdAtPos(cmd->_sceneClickX, cmd->_sceneClickY);
+
+ if (!g_vars->scene25_waterIsPresent) {
+ if ((picId == PIC_SC25_LADDERUP || picId == PIC_SC25_LADDERDOWN) && sceneHandler25_isOnLadder(cmd))
+ cmd->_messageKind = 0;
+
+ break;
+ }
+
+ StaticANIObject *ani = g_fp->_currentScene->getStaticANIObjectAtPos(cmd->_sceneClickX, cmd->_sceneClickY);
+
+ if (ani) {
+ if (g_fp->_aniMan != ani) {
+ if (g_fp->_aniMan->isIdle()) {
+ if (!(g_fp->_aniMan->_flags & 0x100)) {
+ if (ani->_id == ANI_WATER25) {
+ if (g_vars->scene25_dudeIsOnBoard) {
+ if (cmd->_keyCode == ANI_INV_LOPAT)
+ sceneHandler25_rowShovel();
+
+ if (!cmd->_keyCode)
+ sceneHandler25_rowHand();
+ } else {
+ if (cmd->_keyCode == ANI_INV_BOARD)
+ sceneHandler25_putBoard();
+
+ if (!cmd->_keyCode)
+ sceneHandler25_tryWater();
+ }
+ } else if (ani->_id == ANI_BOARD25) {
+ sceneHandler25_tryRow(cmd->_keyCode);
+ break;
+ }
+ break;
+ }
+ }
+ }
+ }
+
+ if (picId == PIC_SC25_LADDERUP && sceneHandler25_isOnLadder(cmd))
+ cmd->_messageKind = 0;
+
+ if (!g_fp->_aniMan->isIdle() || (g_fp->_aniMan->_flags & 0x100))
+ break;
+
+ if (g_vars->scene25_dudeIsOnBoard) {
+ if (picId == PIC_SC25_RTRUBA && !cmd->_keyCode) {
+ sceneHandler25_enterTruba();
+ break;
+ }
+ } else {
+ if (picId != PIC_SC25_RTRUBA) {
+ if (picId == PIC_SC25_LADDERUP && !cmd->_keyCode)
+ sceneHandler25_ladderUp();
+ break;
+ }
+
+ if (!cmd->_keyCode) {
+ sceneHandler25_backToPipe();
+ break;
+ }
+ }
+ if (g_vars->scene25_dudeIsOnBoard) {
+ if (picId != PIC_SC25_LADDERUP || cmd->_keyCode)
+ break;
+
+ sceneHandler25_toLadder();
+ break;
+ }
+
+ if (picId == PIC_SC25_LADDERUP && !cmd->_keyCode)
+ sceneHandler25_ladderUp();
+
+ break;
+ }
+ }
+
+ return 0;
+}
+
+} // End of namespace Fullpipe
diff --git a/engines/fullpipe/scenes/scene26.cpp b/engines/fullpipe/scenes/scene26.cpp
new file mode 100644
index 0000000000..b9d9161e7d
--- /dev/null
+++ b/engines/fullpipe/scenes/scene26.cpp
@@ -0,0 +1,355 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public 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 "fullpipe/fullpipe.h"
+
+#include "fullpipe/objectnames.h"
+#include "fullpipe/constants.h"
+
+#include "fullpipe/gameloader.h"
+#include "fullpipe/motion.h"
+#include "fullpipe/scenes.h"
+#include "fullpipe/statics.h"
+
+#include "fullpipe/interaction.h"
+#include "fullpipe/behavior.h"
+
+
+namespace Fullpipe {
+
+void scene26_initScene(Scene *sc) {
+ g_vars->scene26_chhi = sc->getStaticANIObject1ById(ANI_CHHI, -1);
+ g_vars->scene26_drop = sc->getStaticANIObject1ById(ANI_DROP_26, -1);
+ g_vars->scene26_sockPic = sc->getPictureObjectById(PIC_SC26_SOCK, 0);
+ g_vars->scene26_sock = sc->getStaticANIObject1ById(ANI_SOCK_26, -1);
+
+ if (g_fp->getObjectState(sO_Hatch_26) == g_fp->getObjectEnumState(sO_Hatch_26, sO_WithSock)) {
+ g_fp->setObjectState(sO_Hatch_26, g_fp->getObjectEnumState(sO_Hatch_26, sO_Closed));
+ g_fp->setObjectState(sO_Sock_26, g_fp->getObjectEnumState(sO_Sock_26, sO_HangsOnPipe));
+ }
+
+ Interaction *inter = getGameLoaderInteractionController()->getInteractionByObjectIds(ANI_LUK26, ANI_MAN, ANI_INV_SOCK);
+
+ if (getGameLoaderInventory()->getCountItemsWithId(ANI_INV_VENT) == 0)
+ inter->_flags &= 0xFFFDFFFF;
+ else
+ inter->_flags |= 0x20000;
+
+ if (g_fp->getObjectState(sO_Sock_26) == g_fp->getObjectEnumState(sO_Sock_26, sO_HangsOnPipe))
+ g_vars->scene26_sockPic->_flags |= 4;
+ else
+ g_vars->scene26_sockPic->_flags &= 0xFFFB;
+
+ if (g_fp->getObjectState(sO_Valve1_26) == g_fp->getObjectEnumState(sO_Valve1_26, sO_Opened))
+ g_fp->playSound(SND_26_018, 1);
+}
+
+int scene26_updateCursor() {
+ g_fp->updateCursorCommon();
+
+ if (g_fp->_objectIdAtCursor != ANI_VENT || g_fp->_cursorId != PIC_CSR_DEFAULT) {
+ if (g_fp->_cursorId == PIC_CSR_ITN && g_fp->_objectIdAtCursor == PIC_SC26_LTRUBA)
+ g_fp->_cursorId = PIC_CSR_GOL;
+ } else {
+ g_fp->_cursorId = PIC_CSR_ITN;
+ }
+
+ return g_fp->_cursorId;
+}
+
+void sceneHandler26_updateDrop() {
+ if (g_fp->getObjectState(sO_Valve5_26) == g_fp->getObjectEnumState(sO_Valve5_26, sO_Closed))
+ g_fp->_behaviorManager->setFlagByStaticAniObject(g_vars->scene26_drop, 0);
+ else
+ g_fp->_behaviorManager->setFlagByStaticAniObject(g_vars->scene26_drop, 1);
+}
+
+void scene26_setupDrop(Scene *sc) {
+ sceneHandler26_updateDrop();
+}
+
+void sceneHandler26_showChi() {
+ g_vars->scene26_chhi->changeStatics2(ST_CHI_EMPTY);
+
+ chainQueue(QU_CHI_SHOW, 1);
+}
+
+void sceneHandler26_updatePool() {
+ if (g_fp->getObjectState(sO_Valve1_26) == g_fp->getObjectEnumState(sO_Valve1_26, sO_Valve1_26))
+ g_fp->setObjectState(sO_Pool, g_fp->getObjectEnumState(sO_Pool, sO_Overfull));
+ else if (g_fp->getObjectState(sO_Pool) == g_fp->getObjectEnumState(sO_Pool, sO_Overfull))
+ g_fp->setObjectState(sO_Pool, g_fp->getObjectEnumState(sO_Pool, sO_Full));
+
+ if (g_fp->getObjectState(sO_Valve2_26) == g_fp->getObjectEnumState(sO_Valve2_26, sO_Valve1_26)) {
+ if (g_fp->getObjectState(sO_Pool) >= g_fp->getObjectEnumState(sO_Pool, sO_Full))
+ g_fp->setObjectState(sO_Pool, g_fp->getObjectEnumState(sO_Pool, sO_HalfFull));
+ }
+
+ if (g_fp->getObjectState(sO_Valve3_26) == g_fp->getObjectEnumState(sO_Valve3_26, sO_Valve1_26)) {
+ if (g_fp->getObjectState(sO_Pool) >= g_fp->getObjectEnumState(sO_Pool, sO_HalfFull))
+ g_fp->setObjectState(sO_Pool, g_fp->getObjectEnumState(sO_Pool, sO_Empty));
+ }
+}
+
+void sceneHandler26_hideChi() {
+ g_vars->scene26_chhi->changeStatics2(ST_CHI_NORM);
+
+ chainQueue(QU_CHI_HIDE, 1);
+}
+
+void sceneHandler26_testVent() {
+ if (!g_vars->scene26_activeVent)
+ return;
+
+ if (g_vars->scene26_activeVent->_okeyCode == 0) {
+ if (g_fp->getObjectState(sO_Valve1_26) == g_fp->getObjectEnumState(sO_Valve1_26, sO_Opened))
+ g_fp->stopAllSoundInstances(SND_26_018);
+ else
+ g_fp->playSound(SND_26_018, 1);
+
+ if (g_fp->getObjectState(sO_Valve2_26) == g_fp->getObjectEnumState(sO_Valve2_26, sO_Opened)) {
+ chainQueue(QU_SC26_AUTOCLOSE2, 0);
+
+ g_fp->playSound(SND_26_020, 0);
+ }
+
+ if (g_fp->getObjectState(sO_Valve3_26) == g_fp->getObjectEnumState(sO_Valve3_26, sO_Opened)) {
+ chainQueue(QU_SC26_AUTOCLOSE3, 0);
+
+ g_fp->playSound(SND_26_020, 0);
+ }
+ } else if (g_vars->scene26_activeVent->_okeyCode == 1) {
+ if (g_fp->getObjectState(sO_Valve2_26) == g_fp->getObjectEnumState(sO_Valve2_26, sO_Opened))
+ g_fp->playSound(SND_26_020, 0);
+ else
+ g_fp->playSound(SND_26_019, 0);
+
+ if (g_fp->getObjectState(sO_Pool) == g_fp->getObjectEnumState(sO_Pool, sO_Overfull)
+ || g_fp->getObjectState(sO_Pool) == g_fp->getObjectEnumState(sO_Pool, sO_Full))
+ g_fp->playSound(SND_26_003, 0);
+
+ if (g_fp->getObjectState(sO_Valve1_26) == g_fp->getObjectEnumState(sO_Valve1_26, sO_Opened)) {
+ g_fp->stopAllSoundInstances(SND_26_018);
+
+ chainQueue(QU_SC26_AUTOCLOSE1, 0);
+ }
+ } else if (g_vars->scene26_activeVent->_okeyCode == 2) {
+ if (g_fp->getObjectState(sO_Valve3_26) == g_fp->getObjectEnumState(sO_Valve3_26, sO_Opened))
+ g_fp->playSound(SND_26_020, 0);
+ else
+ g_fp->playSound(SND_26_019, 0);
+
+ if (g_fp->getObjectState(sO_Pool) == g_fp->getObjectEnumState(sO_Pool, sO_Overfull)
+ || g_fp->getObjectState(sO_Pool) == g_fp->getObjectEnumState(sO_Pool, sO_Full)
+ || g_fp->getObjectState(sO_Pool) == g_fp->getObjectEnumState(sO_Pool, sO_HalfFull))
+ g_fp->playSound(SND_26_003, 0);
+
+ if (g_fp->getObjectState(sO_Valve1_26) == g_fp->getObjectEnumState(sO_Valve1_26, sO_Opened)) {
+ g_fp->stopAllSoundInstances(SND_26_018);
+
+ chainQueue(QU_SC26_AUTOCLOSE1, 0);
+ }
+ }
+}
+
+void sceneHandler26_showVent() {
+ if (g_vars->scene26_activeVent) {
+ int id = g_vars->scene26_activeVent->_statics->_staticsId;
+
+ if (id == ST_VNT26_UP2) {
+ g_vars->scene26_activeVent->changeStatics2(ST_VNT26_RIGHT2);
+ } else {
+ if (id != ST_VNT26_RIGHT2)
+ return;
+
+ g_vars->scene26_activeVent->changeStatics2(ST_VNT26_UP2);
+ }
+ g_vars->scene26_activeVent->show1(-1, -1, -1, 0);
+ }
+}
+
+void sceneHandler26_hideVent() {
+ if (g_vars->scene26_activeVent)
+ g_vars->scene26_activeVent->hide();
+}
+
+void sceneHandler26_animateVents(StaticANIObject *ani) {
+ int qId = 0;
+
+ switch (ani->_okeyCode) {
+ case 0:
+ if (g_fp->getObjectState(sO_Valve1_26) == g_fp->getObjectEnumState(sO_Valve1_26, sO_Closed))
+ qId = QU_SC26_OPEN1;
+ else
+ qId = QU_SC26_CLOSE1;
+
+ break;
+
+ case 1:
+ if (g_fp->getObjectState(sO_Valve2_26) == g_fp->getObjectEnumState(sO_Valve2_26, sO_Closed))
+ qId = QU_SC26_OPEN2;
+ else
+ qId = QU_SC26_CLOSE2;
+
+ break;
+
+ case 2:
+ if (g_fp->getObjectState(sO_Valve3_26) == g_fp->getObjectEnumState(sO_Valve3_26, sO_Closed))
+ qId = QU_SC26_OPEN3;
+ else
+ qId = QU_SC26_CLOSE3;
+
+ break;
+
+ case 3:
+ if (g_fp->getObjectState(sO_Valve4_26) == g_fp->getObjectEnumState(sO_Valve4_26, sO_Closed))
+ qId = QU_SC26_OPEN4;
+ else
+ qId = QU_SC26_CLOSE4;
+
+ break;
+
+ case 4:
+ if (g_fp->getObjectState(sO_Valve5_26) == g_fp->getObjectEnumState(sO_Valve5_26, sO_Closed))
+ qId = QU_SC26_OPEN5;
+ else
+ qId = QU_SC26_CLOSE5;
+
+ break;
+
+ default:
+ return;
+ }
+
+ if (qId) {
+ MessageQueue *mq = g_fp->_currentScene->getMessageQueueById(qId);
+
+ mq->setFlags(mq->getFlags() | 1);
+ mq->chain(0);
+ }
+}
+
+void sceneHandler26_clickVent(StaticANIObject *ani, ExCommand *cmd) {
+ if (ani->_okeyCode || g_fp->getObjectState(sO_Hatch_26) == g_fp->getObjectEnumState(sO_Hatch_26, sO_Opened)) {
+ if (g_fp->_aniMan->isIdle() && !(g_fp->_aniMan->_flags & 0x100)) {
+ g_vars->scene26_activeVent = ani;
+
+ int x = ani->_ox - 20;
+ int y = ani->_oy + 61;
+
+ if (abs(x - g_fp->_aniMan->_ox) > 1 || abs(y - g_fp->_aniMan->_oy) > 1 || g_fp->_aniMan->_movement || g_fp->_aniMan->_statics->_staticsId != ST_MAN_UP) {
+ MessageQueue *mq = getCurrSceneSc2MotionController()->method34(g_fp->_aniMan, x, y, 1, ST_MAN_UP);
+
+ if (mq) {
+ ExCommand *ex = new ExCommand(0, 17, MSG_SC26_CLICKVENT, 0, 0, 0, 1, 0, 0, 0);
+
+ ex->_excFlags |= 3;
+ ex->_keyCode = ani->_okeyCode;
+
+ mq->addExCommandToEnd(ex);
+
+ postExCommand(g_fp->_aniMan->_id, 2, x, y, 0, -1);
+ }
+ } else {
+ sceneHandler26_animateVents(ani);
+ }
+ }
+ }
+
+ cmd->_messageKind = 0;
+}
+
+int sceneHandler26(ExCommand *cmd) {
+ if (cmd->_messageKind != 17)
+ return 0;
+
+ switch (cmd->_messageNum) {
+ case MSG_SC26_UPDATEDROP:
+ sceneHandler26_updateDrop();
+ break;
+
+ case MSG_SC26_SHOWCHI:
+ sceneHandler26_showChi();
+ break;
+
+ case MSG_SC26_UPDATEPOOL:
+ sceneHandler26_updatePool();
+ break;
+
+ case MSG_SC26_HIDECHI:
+ sceneHandler26_hideChi();
+ break;
+
+ case MSG_SC26_TESTVENT:
+ sceneHandler26_testVent();
+ break;
+
+ case MSG_SC26_SHOWVENT:
+ sceneHandler26_showVent();
+ break;
+
+ case MSG_SC26_CLICKVENT:
+ {
+ StaticANIObject *ani = g_fp->_currentScene->getStaticANIObject1ById(ANI_VENT, cmd->_keyCode);
+
+ if (ani && ani->_id == ANI_VENT)
+ sceneHandler26_clickVent(ani, cmd);
+
+ break;
+ }
+
+ case MSG_SC26_HIDEVENT:
+ sceneHandler26_hideVent();
+ break;
+
+ case 29:
+ {
+ StaticANIObject *ani = g_fp->_currentScene->getStaticANIObjectAtPos(cmd->_sceneClickX, cmd->_sceneClickY);
+
+ if (ani && ani->_id == ANI_VENT)
+ sceneHandler26_clickVent(ani, cmd);
+
+ break;
+ }
+
+ case 33:
+ if (g_fp->_aniMan2) {
+ int x = g_fp->_aniMan2->_ox;
+
+ if (x < g_fp->_sceneRect.left + 200)
+ g_fp->_currentScene->_x = x - 300 - g_fp->_sceneRect.left;
+
+ if (x > g_fp->_sceneRect.right - 200)
+ g_fp->_currentScene->_x = x + 300 - g_fp->_sceneRect.right;
+ }
+
+ g_fp->_behaviorManager->updateBehaviors();
+
+ g_fp->startSceneTrack();
+
+ break;
+ }
+
+ return 0;
+}
+
+} // End of namespace Fullpipe
diff --git a/engines/fullpipe/scenes/scene27.cpp b/engines/fullpipe/scenes/scene27.cpp
new file mode 100644
index 0000000000..1431ceffba
--- /dev/null
+++ b/engines/fullpipe/scenes/scene27.cpp
@@ -0,0 +1,759 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public 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 "fullpipe/fullpipe.h"
+
+#include "fullpipe/objectnames.h"
+#include "fullpipe/constants.h"
+
+#include "fullpipe/gameloader.h"
+#include "fullpipe/motion.h"
+#include "fullpipe/scenes.h"
+#include "fullpipe/statics.h"
+
+#include "fullpipe/interaction.h"
+#include "fullpipe/behavior.h"
+
+#define DBG 0
+
+namespace Fullpipe {
+
+struct Bat {
+ StaticANIObject *ani;
+ int field_4;
+ double power;
+ double field_10;
+ double currX;
+ double currY;
+ double powerCos;
+ double powerSin;
+};
+
+void scene27_initScene(Scene *sc) {
+ g_vars->scene27_hitZone = sc->getPictureObjectById(PIC_SC27_HITZONE2, 0);
+ g_vars->scene27_driver = sc->getStaticANIObject1ById(ANI_VODILLA, -1);
+ g_vars->scene27_maid = sc->getStaticANIObject1ById(ANI_MAID, -1);
+ g_vars->scene27_batHandler = sc->getStaticANIObject1ById(ANI_BITAHANDLER, -1);
+
+ g_vars->scene27_balls.numBalls = 0;
+ g_vars->scene27_balls.pTail = 0;
+ g_vars->scene27_balls.field_8 = 0;
+ g_vars->scene27_balls.pHead = 0;
+ g_vars->scene27_balls.cPlexLen = 10;
+
+ free(g_vars->scene27_balls.cPlex);
+ g_vars->scene27_balls.cPlex = 0;
+
+ g_vars->scene27_bats.clear();
+ g_vars->scene27_var07.clear();
+
+ g_vars->scene27_driverHasVent = true;
+ g_vars->scene27_bat = sc->getStaticANIObject1ById(ANI_BITA, -1);
+
+ for (int i = 0; i < 4; i++) {
+ StaticANIObject *newbat = new StaticANIObject(g_vars->scene27_bat);
+
+ Ball *runPtr = g_vars->scene27_balls.pTail;
+ Ball *lastP = g_vars->scene27_balls.field_8;
+
+ if (!g_vars->scene27_balls.pTail) {
+ g_vars->scene27_balls.cPlex = (byte *)calloc(g_vars->scene27_balls.cPlexLen, sizeof(Ball));
+
+ byte *p1 = g_vars->scene27_balls.cPlex + (g_vars->scene27_balls.cPlexLen - 1) * sizeof(Ball);
+
+ if (g_vars->scene27_balls.cPlexLen - 1 < 0) {
+ runPtr = g_vars->scene27_balls.pTail;
+ } else {
+ runPtr = g_vars->scene27_balls.pTail;
+
+ for (int j = 0; j < g_vars->scene27_balls.cPlexLen; j++) {
+ ((Ball *)p1)->p1 = runPtr;
+ runPtr = (Ball *)p1;
+
+ p1 -= sizeof(Ball);
+ }
+
+ g_vars->scene27_balls.pTail = runPtr;
+ }
+ }
+
+ g_vars->scene27_balls.pTail = runPtr->p0;
+ runPtr->p1 = lastP;
+ runPtr->p0 = 0;
+ runPtr->ani = newbat;
+
+ g_vars->scene27_balls.numBalls++;
+
+ if (g_vars->scene27_balls.field_8)
+ g_vars->scene27_balls.field_8->p0 = runPtr;
+ else
+ g_vars->scene27_balls.pHead = runPtr;
+
+ g_vars->scene27_balls.field_8 = runPtr;
+
+ sc->addStaticANIObject(newbat, 1);
+ }
+
+ g_vars->scene27_dudeIsAiming = false;
+ g_vars->scene27_maxPhaseReached = false;
+ g_vars->scene27_wipeIsNeeded = false;
+ g_vars->scene27_driverPushedButton = false;
+ g_vars->scene27_numLostBats = 0;
+ g_vars->scene27_knockCount = 0;
+ g_vars->scene27_launchPhase = 0;
+
+ Scene *oldsc = g_fp->_currentScene;
+ g_fp->_currentScene = sc;
+
+ if (g_fp->getObjectState(sO_Maid) == g_fp->getObjectEnumState(sO_Maid, sO_WithSwab)) {
+ g_vars->scene27_maid->changeStatics2(ST_MID_SWAB2);
+ } else if (g_fp->getObjectState(sO_Maid) == g_fp->getObjectEnumState(sO_Maid, sO_WithBroom)) {
+ g_vars->scene27_maid->changeStatics2(ST_MID_BROOM);
+ } else if (g_fp->getObjectState(sO_Maid) == g_fp->getObjectEnumState(sO_Maid, sO_WithSpade)) {
+ g_vars->scene27_maid->changeStatics2(ST_MID_SPADE);
+ }
+
+ g_fp->_currentScene = oldsc;
+
+ g_fp->setArcadeOverlay(PIC_CSR_ARCADE7);
+}
+
+int scene27_updateCursor() {
+ g_fp->updateCursorCommon();
+
+ if (g_vars->scene27_dudeIsAiming) {
+ if (g_fp->_cursorId != PIC_CSR_DEFAULT_INV && g_fp->_cursorId != PIC_CSR_ITN_INV)
+ g_fp->_cursorId = PIC_CSR_ARCADE7_D;
+
+ } else if (g_fp->_objectIdAtCursor == ANI_MAN) {
+ if (g_vars->scene27_maxPhaseReached)
+ if (g_fp->_cursorId == PIC_CSR_DEFAULT)
+ g_fp->_cursorId = PIC_CSR_ITN;
+ }
+
+ return g_fp->_cursorId;
+}
+
+void sceneHandler27_driverGiveVent() {
+ g_vars->scene27_driver->changeStatics2(ST_DRV_VENT);
+ g_vars->scene27_driver->startMQIfIdle(QU_DRV_GIVEVENT, 1);
+
+ g_vars->scene27_driverHasVent = false;
+
+ getCurrSceneSc2MotionController()->setEnabled();
+ getGameLoaderInteractionController()->enableFlag24();
+
+ g_fp->_behaviorManager->setFlagByStaticAniObject(g_fp->_aniMan, 1);
+}
+
+void sceneHandler27_winArcade() {
+ if (g_fp->getObjectState(sO_Driver) == g_fp->getObjectEnumState(sO_Driver, sO_WithSteering)) {
+ g_vars->scene27_dudeIsAiming = false;
+
+ g_fp->_aniMan->_callback2 = 0;
+ g_fp->_aniMan->changeStatics2(ST_MAN_RIGHT);
+
+ sceneHandler27_driverGiveVent();
+ }
+}
+
+void sceneHandler27_takeVent() {
+ if (g_fp->getObjectState(sO_Maid) == g_fp->getObjectEnumState(sO_Maid, sO_WithSwab)) {
+ if (g_vars->scene27_maid->isIdle()) {
+ if (g_vars->scene27_maid->_flags & 4) {
+ g_vars->scene27_maid->changeStatics2(ST_MID_SWAB2);
+ g_vars->scene27_maid->startMQIfIdle(QU_MID_CLEANVENT, 1);
+ }
+ }
+ }
+}
+
+void sceneHandler27_showNextBat() {
+ if (g_vars->scene27_bat) {
+ MessageQueue *mq = new MessageQueue(g_fp->_currentScene->getMessageQueueById(QU_SC27_SHOWBET), 0, 1);
+
+ mq->replaceKeyCode(-1, g_vars->scene27_bat->_okeyCode);
+ mq->chain(0);
+ }
+
+ g_vars->scene27_batHandler->_priority = 1045;
+}
+
+int sceneHandler27_updateScreenCallback() {
+ int res;
+
+ res = g_fp->drawArcadeOverlay(getGameLoaderInteractionController()->_flag24 == 0);
+
+ if (!res)
+ g_fp->_updateScreenCallback = 0;
+
+ return res;
+}
+
+void sceneHandler27_aniManCallback(int *phase) {
+ if (!g_vars->scene27_maxPhaseReached) {
+ if (*phase >= 5)
+ g_vars->scene27_maxPhaseReached = true;
+ else
+ ++*phase;
+ }
+}
+
+void sceneHandler27_throwBat() {
+ if (getGameLoaderInteractionController()->_flag24)
+ g_fp->_updateScreenCallback = sceneHandler27_updateScreenCallback;
+
+ g_fp->_aniMan->_callback2 = sceneHandler27_aniManCallback;
+
+ g_fp->_aniMan->startAnim(MV_MAN27_THROWBET, 0, -1);
+
+ getCurrSceneSc2MotionController()->clearEnabled();
+ getGameLoaderInteractionController()->disableFlag24();
+
+ g_fp->_behaviorManager->setFlagByStaticAniObject(g_fp->_aniMan, 0);
+
+ g_vars->scene27_maxPhaseReached = false;
+
+ g_vars->scene27_bat->hide();
+}
+
+void sceneHandler27_clickBat(ExCommand *cmd) {
+ int bx = g_vars->scene27_bat->_ox - 5;
+ int by = g_vars->scene27_bat->_oy - 71;
+
+#if DBG
+ sceneHandler27_throwBat();
+ return;
+#endif
+
+ if (ABS(bx - g_fp->_aniMan->_ox) > 1 || ABS(by - g_fp->_aniMan->_oy) > 1
+ || g_fp->_aniMan->_movement || g_fp->_aniMan->_statics->_staticsId != ST_MAN_RIGHT) {
+ MessageQueue *mq = getCurrSceneSc2MotionController()->method34(g_fp->_aniMan, bx, by, 1, ST_MAN_RIGHT);
+
+ if (mq) {
+ mq->addExCommandToEnd(cmd->createClone());
+
+ postExCommand(g_fp->_aniMan->_id, 2, bx, by, 0, -1);
+ }
+ } else {
+ sceneHandler27_throwBat();
+ }
+}
+
+void sceneHandler27_maidSwab() {
+#if DBG
+ return;
+#endif
+ if (g_fp->getObjectState(sO_Maid) == g_fp->getObjectEnumState(sO_Maid, sO_WithSwab))
+ g_vars->scene27_maid->changeStatics2(ST_MID_SWAB);
+}
+
+void sceneHandler27_startBat(StaticANIObject *bat) {
+ Bat *newbat = new Bat;
+
+ newbat->power = g_vars->scene27_launchPhase * 2.5 + 8.0;
+ newbat->field_10 = 0;
+ newbat->ani = bat;
+ newbat->powerCos = newbat->power * cos(0.0);
+ newbat->powerSin = newbat->power * sin(0.0);
+ newbat->currX = newbat->powerCos + (double)g_fp->_aniMan->_ox + 42.0;
+ newbat->currY = newbat->powerSin + (double)g_fp->_aniMan->_oy + 58.0;
+
+ bat->_statics = (Statics *)bat->_staticsList[0];
+ bat->setOXY((int)newbat->currX, (int)newbat->currY);
+ bat->_flags |= 4;
+
+ g_vars->scene27_bats.push_back(newbat);
+
+ sceneHandler27_maidSwab();
+}
+
+void sceneHandler27_startAiming() {
+ g_vars->scene27_dudeIsAiming = false;
+ g_vars->scene27_maxPhaseReached = false;
+
+ g_fp->_aniMan->_callback2 = 0;
+
+ g_vars->scene27_launchPhase = g_fp->_aniMan->_movement->_currDynamicPhaseIndex - 6;
+
+ int phase = 21 - g_vars->scene27_launchPhase;
+
+ if (phase < 14)
+ phase = 14;
+
+ if (phase > 20)
+ phase = 20;
+
+ g_fp->playSound(SND_27_044, 0);
+
+ g_fp->_aniMan->_movement->setDynamicPhaseIndex(phase);
+}
+
+void sceneHandler27_initAiming(ExCommand *cmd) {
+ g_vars->scene27_aimStartX = cmd->_x;
+ g_vars->scene27_aimStartY = cmd->_y;
+ g_vars->scene27_dudeIsAiming = true;
+ g_vars->scene27_maxPhaseReached = false;
+}
+
+void sceneHandler27_aimDude() {
+ int phase = (g_vars->scene27_aimStartX - g_fp->_mouseScreenPos.x) / 20 + 6;
+
+ if (phase < 6)
+ phase = 6;
+
+ if (phase > 11)
+ phase = 11;
+
+ if (g_fp->_aniMan->_movement)
+ g_fp->_aniMan->_movement->setDynamicPhaseIndex(phase);
+}
+
+void sceneHandler27_wipeDo() {
+ for (uint i = 0; i < g_vars->scene27_bats.size(); i++) {
+ if (g_vars->scene27_bats[i]->currX < 800.0) {
+ g_vars->scene27_bats[i]->field_10 = atan2(800.0 - g_vars->scene27_bats[i]->currX, 520.0 - g_vars->scene27_bats[i]->currY);
+ g_vars->scene27_bats[i]->power += 1.0;
+ }
+ }
+}
+
+bool sceneHandler27_batFallLogic(uint batn) {
+ Bat *bat = g_vars->scene27_bats[batn];
+
+ int y = (bat->currY - 458.0) * 0.4848484848484849 + 734.0;
+
+ if (y >= bat->currX)
+ return false;
+
+ if (bat->currX - y > 15.0 || bat->ani->_statics->_staticsId == ST_BTA_FALL) {
+ bat->ani->_priority = 2020;
+
+ g_vars->scene27_var07.push_back(bat);
+
+ if (batn != g_vars->scene27_var07.size() - 1)
+ g_vars->scene27_var07.remove_at(batn);
+ } else if (!bat->ani->_movement) {
+ bat->ani->startAnim(MV_BTA_FALL, 0, -1);
+ }
+
+ return true;
+}
+
+bool sceneHandler27_batCalcDistance(int bat1, int bat2) {
+ double at = atan2(g_vars->scene27_bats[bat1]->currX - g_vars->scene27_bats[bat2]->currX, g_vars->scene27_bats[bat1]->currY - g_vars->scene27_bats[bat2]->currY);
+ double dy = g_vars->scene27_bats[bat1]->currY - g_vars->scene27_bats[bat2]->currY;
+ double dx = g_vars->scene27_bats[bat1]->currX - g_vars->scene27_bats[bat2]->currX;
+ double ay = cos(at);
+ double ax = sin(at);
+
+ return sqrt(ax * ax * 0.25 + ay * ay) * 54.0 > sqrt(dx * dx + dy * dy);
+}
+
+void sceneHandler27_knockBats(int bat1n, int bat2n) {
+ Bat *bat1 = g_vars->scene27_bats[bat1n];
+ Bat *bat2 = g_vars->scene27_bats[bat2n];
+
+ if (0.0 != bat1->power) {
+ double rndF = (double)g_fp->_rnd->getRandomNumber(32767) * 0.0000009155552842799158 - 0.015
+ + atan2(bat2->currX - bat1->currX, bat2->currY - bat1->currY);
+ double rndCos = cos(rndF);
+ double rndSin = sin(rndF);
+
+ double pow1x = cos(bat1->field_10 - rndF) * (double)((int)(bat2->currX - bat1->currX) >= 0 ? 1 : -1) * bat1->power;
+ double pow1y = sin(bat1->field_10 - rndF) * (double)((int)(bat2->currY - bat1->currY) >= 0 ? 1 : -1) * bat1->power;
+
+ bat1->powerCos -= pow1x * 1.1;
+ bat1->powerSin -= pow1y * 1.1;
+
+ rndF = ((double)g_fp->_rnd->getRandomNumber(32767) * 0.0000009155552842799158 - 0.015
+ + atan2(bat1->currX - bat2->currX, bat1->currY - bat2->currY));
+ double pow2x = cos(bat2->field_10 - rndF) * (double)((int)(bat1->currX - bat2->currX) >= 0 ? 1 : -1) * bat2->power;
+ double pow2y = sin(bat2->field_10 - rndF) * (double)((int)(bat1->currY - bat2->currY) >= 0 ? 1 : -1) * bat2->power;
+
+ bat2->powerCos -= pow2x * 1.1;
+ bat2->powerSin -= pow2y * 1.1;
+
+ double dy = bat1->currY - bat2->currY;
+ double dx = bat1->currX - bat2->currX;
+ double dist = (sqrt(rndSin * rndSin * 0.25 + rndCos * rndCos) * 54.0 - sqrt(dx * dx + dy * dy)) / cos(rndF - bat1->field_10);
+ bat1->currX -= cos(bat1->field_10) * (dist + 1.0);
+ bat1->currY -= sin(bat1->field_10) * (dist + 1.0);
+ bat1->powerCos += pow2x * 0.64;
+
+ if (bat1->currX <= 500.0)
+ bat1->powerSin = 0.0;
+ else
+ bat1->powerSin += pow2y * 0.64;
+
+ bat1->field_10 = atan2(bat1->powerCos, bat1->powerSin);
+ bat1->power = sqrt(bat1->powerCos * bat1->powerCos + bat1->powerSin * bat1->powerSin);
+ bat2->powerCos += pow1x * 0.64;
+
+ if (bat2->currX <= 500.0)
+ bat2->powerSin = 0;
+ else
+ bat2->powerSin += pow1y * 0.64;
+
+ bat2->field_10 = atan2(bat2->powerCos, bat2->powerSin);
+ bat2->power = sqrt(bat2->powerCos * bat2->powerCos + bat2->powerSin * bat2->powerSin);
+
+ g_fp->playSound(SND_27_026, 0);
+ }
+}
+
+void sceneHandler27_batSetColors(int batn) {
+ Bat *bat = g_vars->scene27_bats[batn];
+
+ if (g_vars->scene27_hitZone->isPixelHitAtPos((int)bat->currX, (int)bat->currY) ) {
+ if (bat->ani->_statics->_staticsId == ST_BTA_NORM) {
+ if (!bat->ani->_movement)
+ bat->ani->_statics = bat->ani->getStaticsById(ST_BTA_HILITE);
+ }
+ } else {
+ if (bat->ani->_statics->_staticsId == ST_BTA_HILITE) {
+ if (!bat->ani->_movement)
+ bat->ani->_statics = bat->ani->getStaticsById(ST_BTA_NORM);
+ }
+ }
+}
+
+void sceneHandler27_driverPushButton() {
+ if (g_fp->getObjectState(sO_Driver) == g_fp->getObjectEnumState(sO_Driver, sO_WithSteering)) {
+ g_vars->scene27_driver->changeStatics2(ST_DRV_VENT);
+ chainQueue(QU_DRV_PUSHBUTTON, 1);
+
+ g_vars->scene27_driverPushedButton = true;
+ } else {
+ g_vars->scene27_driver->changeStatics2(ST_DRV_SITNOVENT);
+
+
+ chainQueue(QU_DRV_PUSHBUTTON_NOVENT, 1);
+
+ g_vars->scene27_driverPushedButton = true;
+ }
+}
+
+void sceneHandler27_maidSwitchback() {
+#ifndef DBG
+ if (g_fp->getObjectState(sO_Maid) == g_fp->getObjectEnumState(sO_Maid, sO_WithSwab)) {
+ g_vars->scene27_maid->changeStatics2(ST_MID_SWAB);
+ g_vars->scene27_maid->startMQIfIdle(QU_MID_SWITCHBACK, 1);
+ }
+#endif
+}
+
+void sceneHandler27_batLogic() {
+ if (g_vars->scene27_balls.numBalls) {
+ g_vars->scene27_bat = g_vars->scene27_balls.pHead->ani;
+
+ g_vars->scene27_balls.pHead = g_vars->scene27_balls.pHead->p0;
+
+ if (g_vars->scene27_balls.pHead)
+ g_vars->scene27_balls.pHead->p0->p1 = 0;
+ else
+ g_vars->scene27_balls.field_8 = 0;
+
+ g_vars->scene27_balls.init(&g_vars->scene27_balls.pHead->p0);
+
+ int mv;
+
+ switch (g_vars->scene27_batHandler->_statics->_staticsId) {
+ case ST_BTH_5:
+ mv = MV_BTH_5_4;
+ break;
+
+ case ST_BTH_4:
+ mv = MV_BTH_4_3;
+ break;
+
+ case ST_BTH_3:
+ mv = MV_BTH_3_2;
+ break;
+
+ case ST_BTH_2:
+ mv = MV_BTH_2_1;
+ break;
+
+ case ST_BTH_1:
+ mv = MV_BTH_1_0;
+ break;
+
+ default:
+ chainQueue(QU_SC27_RESTARTBETS, 1);
+
+ getCurrSceneSc2MotionController()->setEnabled();
+ getGameLoaderInteractionController()->enableFlag24();
+
+ g_fp->_behaviorManager->setFlagByStaticAniObject(g_fp->_aniMan, 1);
+
+ return;
+ }
+
+ MessageQueue *mq = new MessageQueue(g_fp->_globalMessageQueueList->compact());
+
+ mq->setFlags(mq->getFlags() | 1);
+
+ ExCommand *ex = new ExCommand(g_vars->scene27_batHandler->_id, 1, mv, 0, 0, 0, 1, 0, 0, 0);
+ ex->_excFlags |= 2;
+ mq->addExCommandToEnd(ex);
+
+ ex = new ExCommand(0, 17, MSG_SC27_CLICKBET, 0, 0, 0, 1, 0, 0, 0);
+ ex->_excFlags |= 3;
+ mq->addExCommandToEnd(ex);
+
+ mq->chain(0);
+ } else {
+ g_vars->scene27_bat = 0;
+ }
+}
+
+void sceneHandler27_calcWinArcade() {
+ if (!g_vars->scene27_wipeIsNeeded && !g_vars->scene27_driverPushedButton) {
+ int numHilite = 0;
+
+ for (uint i = 0; i < g_vars->scene27_bats.size(); i++) {
+ if (g_vars->scene27_bats[i]->ani->_statics->_staticsId == ST_BTA_HILITE)
+ numHilite++;
+ }
+
+ if (numHilite >= 3) {
+ if (g_fp->getObjectState(sO_Driver) == g_fp->getObjectEnumState(sO_Driver, sO_WithSteering)) {
+ sceneHandler27_driverGiveVent();
+ sceneHandler27_maidSwitchback();
+
+ return;
+ }
+ }
+
+ if (!g_vars->scene27_balls.numBalls) {
+ sceneHandler27_driverPushButton();
+ sceneHandler27_maidSwitchback();
+ return;
+ }
+
+ sceneHandler27_batLogic();
+ }
+
+ sceneHandler27_maidSwitchback();
+}
+
+void sceneHandler27_regenBats() {
+ g_vars->scene27_wipeIsNeeded = false;
+
+ for (uint i = 0; i < g_vars->scene27_var07.size(); i++) {
+ g_vars->scene27_var07[i]->ani->hide();
+
+ Ball *runPtr = g_vars->scene27_balls.pTail;
+ Ball *lastP = g_vars->scene27_balls.field_8;
+ StaticANIObject *newbat = g_vars->scene27_var07[i]->ani;
+
+ if (!g_vars->scene27_balls.pTail) {
+ g_vars->scene27_balls.cPlex = (byte *)calloc(g_vars->scene27_balls.cPlexLen, sizeof(Ball));
+
+ byte *p1 = g_vars->scene27_balls.cPlex + (g_vars->scene27_balls.cPlexLen - 1) * sizeof(Ball);
+
+ if (g_vars->scene27_balls.cPlexLen - 1 < 0) {
+ runPtr = g_vars->scene27_balls.pTail;
+ } else {
+ runPtr = g_vars->scene27_balls.pTail;
+
+ for (int j = 0; j < g_vars->scene27_balls.cPlexLen; j++) {
+ ((Ball *)p1)->p1 = runPtr;
+ runPtr = (Ball *)p1;
+
+ p1 -= sizeof(Ball);
+ }
+
+ g_vars->scene27_balls.pTail = runPtr;
+ }
+ }
+
+ g_vars->scene27_balls.pTail = runPtr->p0;
+ runPtr->p1 = lastP;
+ runPtr->p0 = 0;
+ runPtr->ani = newbat;
+
+ g_vars->scene27_balls.numBalls++;
+
+ if (g_vars->scene27_balls.field_8)
+ g_vars->scene27_balls.field_8->p0 = runPtr;
+ else
+ g_vars->scene27_balls.pHead = runPtr;
+
+ g_vars->scene27_balls.field_8 = runPtr;
+ }
+
+ g_vars->scene27_var07.clear();
+
+ sceneHandler27_batLogic();
+
+ g_vars->scene27_driverPushedButton = false;
+}
+
+void sceneHandler27_animateBats() {
+ int oldCount = g_vars->scene27_knockCount;
+
+ g_vars->scene27_numLostBats = 0;
+ g_vars->scene27_knockCount = 0;
+
+ for (uint i = 0; i < g_vars->scene27_bats.size(); i++) {
+ Bat *bat = g_vars->scene27_bats[i];
+
+ bat->currX = cos(bat->field_10) * bat->power + bat->currX;
+ bat->currY = sin(bat->field_10) * bat->power + bat->currY;
+
+ bat->ani->setOXY((int)bat->currX, (int)bat->currY);
+ bat->ani->_priority = (int)(600.0 - bat->currY);
+
+ double powerDelta;
+
+ if (cos(bat->field_10) >= 0.0 || bat->currX >= 362.0)
+ powerDelta = bat->power * 0.035;
+ else
+ powerDelta = bat->power * 0.4;
+
+ bat->power -= powerDelta;
+ bat->powerCos = cos(bat->field_10) * bat->power;
+ bat->powerSin = sin(bat->field_10) * bat->power;
+
+ if (bat->power >= 0.5)
+ g_vars->scene27_knockCount++;
+ else
+ bat->power = 0;
+
+ sceneHandler27_batSetColors(i);
+
+ if (!sceneHandler27_batFallLogic(i) && !g_vars->scene27_wipeIsNeeded) {
+ for (uint j = 0; j < g_vars->scene27_bats.size(); j++) {
+ if (i != j && sceneHandler27_batCalcDistance(i, j))
+ sceneHandler27_knockBats(i, j);
+ }
+ }
+ }
+
+ for (uint i = 0; i < g_vars->scene27_var07.size(); i++) {
+ Bat *bat = g_vars->scene27_var07[i];
+
+ if (bat->currY >= 700.0) {
+ g_vars->scene27_numLostBats++;
+ } else {
+ bat->currX = bat->powerCos + bat->currX;
+ bat->currY = bat->powerSin + bat->currY;
+ bat->ani->setOXY((int)bat->currX, (int)bat->currY);
+ bat->powerSin = bat->powerSin + 1.0;
+ }
+ }
+
+ if (oldCount != g_vars->scene27_knockCount && !g_vars->scene27_knockCount)
+ sceneHandler27_calcWinArcade();
+
+ if (g_vars->scene27_wipeIsNeeded) {
+ if (g_vars->scene27_numLostBats == 5)
+ sceneHandler27_regenBats();
+ }
+}
+
+int sceneHandler27(ExCommand *cmd) {
+ if (cmd->_messageKind != 17)
+ return 0;
+
+ switch (cmd->_messageNum) {
+ case MSG_CMN_WINARCADE:
+ sceneHandler27_winArcade();
+ break;
+
+ case MSG_SC27_TAKEVENT:
+ sceneHandler27_takeVent();
+ break;
+
+ case MSG_SC27_SHOWNEXTBET:
+ sceneHandler27_showNextBat();
+ break;
+
+ case MSG_SC27_HANDLERTOFRONT:
+ g_vars->scene27_batHandler->_priority = 1005;
+ break;
+
+ case MSG_SC27_STARTWIPE:
+ g_vars->scene27_wipeIsNeeded = true;
+
+ g_fp->playSound(SND_27_027, 0);
+
+ break;
+
+ case MSG_SC27_CLICKBET:
+ sceneHandler27_clickBat(cmd);
+ break;
+
+ case MSG_SC27_STARTBET:
+ if (g_vars->scene27_bat)
+ sceneHandler27_startBat(g_vars->scene27_bat);
+
+ break;
+
+ case 30:
+ if (g_vars->scene27_dudeIsAiming)
+ sceneHandler27_startAiming();
+
+ break;
+
+ case 29:
+ if (g_fp->_aniMan == g_fp->_currentScene->getStaticANIObjectAtPos(g_fp->_sceneRect.left + cmd->_x, g_fp->_sceneRect.top + cmd->_y)
+ && g_vars->scene27_maxPhaseReached)
+ sceneHandler27_initAiming(cmd);
+
+ break;
+
+ case 33:
+ if (g_fp->_aniMan2) {
+ int x = g_fp->_aniMan2->_ox;
+
+ if (x < g_fp->_sceneRect.left + 200)
+ g_fp->_currentScene->_x = x - 300 - g_fp->_sceneRect.left;
+
+ if (x > g_fp->_sceneRect.right - 200)
+ g_fp->_currentScene->_x = x + 300 - g_fp->_sceneRect.right;
+ }
+
+ if (g_vars->scene27_dudeIsAiming)
+ sceneHandler27_aimDude();
+
+ if (g_vars->scene27_wipeIsNeeded) {
+ sceneHandler27_wipeDo();
+
+ if (!g_fp->_aniMan->_movement && g_fp->_aniMan->_statics->_staticsId == ST_MAN_RIGHT)
+ g_fp->_aniMan->startAnim(MV_MAN27_FLOW, 0, -1);
+ }
+
+ sceneHandler27_animateBats();
+
+ g_fp->_behaviorManager->updateBehaviors();
+ g_fp->startSceneTrack();
+
+ break;
+ }
+
+ return 0;
+}
+
+} // End of namespace Fullpipe
diff --git a/engines/fullpipe/scenes/scene28.cpp b/engines/fullpipe/scenes/scene28.cpp
new file mode 100644
index 0000000000..c21ce05502
--- /dev/null
+++ b/engines/fullpipe/scenes/scene28.cpp
@@ -0,0 +1,474 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public 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 "fullpipe/fullpipe.h"
+
+#include "fullpipe/objectnames.h"
+#include "fullpipe/constants.h"
+
+#include "fullpipe/gameloader.h"
+#include "fullpipe/motion.h"
+#include "fullpipe/scenes.h"
+#include "fullpipe/statics.h"
+
+#include "fullpipe/interaction.h"
+#include "fullpipe/behavior.h"
+#include "fullpipe/floaters.h"
+
+namespace Fullpipe {
+
+void scene28_initScene(Scene *sc) {
+ g_vars->scene28_fliesArePresent = true;
+ g_vars->scene28_beardedDirection = true;
+ g_vars->scene28_darkeningObject = 0;
+ g_vars->scene28_lighteningObject = 0;
+ g_vars->scene28_headDirection = false;
+ g_vars->scene28_headBeardedFlipper = false;
+ g_vars->scene28_lift6inside = false;
+
+ g_fp->_floaters->init(g_fp->getGameLoaderGameVar()->getSubVarByName("SC_28"));
+
+ g_fp->initArcadeKeys("SC_28");
+}
+
+int scene28_updateCursor() {
+ g_fp->updateCursorCommon();
+ if (g_fp->_objectIdAtCursor == ANI_LIFT || g_fp->_objectIdAtCursor == ANI_LIFT_28)
+ if (g_fp->_cursorId == PIC_CSR_DEFAULT)
+ g_fp->_cursorId = PIC_CSR_ITN;
+
+ return g_fp->_cursorId;
+}
+
+void sceneHandler28_lift1ShowAfter() {
+ StaticANIObject *ani = g_fp->_currentScene->getStaticANIObject1ById(ANI_MAN_28, -1);
+
+ g_fp->_aniMan->_statics = g_fp->_aniMan->getStaticsById(ST_MAN_SIT|0x4000);
+ g_fp->_aniMan->setOXY(ani->_ox + 7, ani->_oy);
+ g_fp->_aniMan->_priority = ani->_priority;
+ g_fp->_aniMan->show1(-1, -1, -1, 0);
+}
+
+void sceneHandler28_makeFaces(ExCommand *cmd) {
+ g_fp->_currentScene->getPictureObjectById(PIC_SC28_DARK4, 0)->_flags &= 0xFFFB;
+
+ g_vars->scene28_lighteningObject = 0;
+
+ MessageQueue *mq = g_fp->_globalMessageQueueList->getMessageQueueById(cmd->_parId);
+ if (mq) {
+ int frames[5];
+
+ frames[0] = MV_WMN28_IN_1;
+ frames[1] = MV_WMN28_IN_2;
+ frames[2] = MV_WMN28_IN_3;
+ frames[3] = MV_WMN28_IN_4;
+ frames[4] = MV_WMN28_IN_5;
+
+ for (int i = 0; i < 5; i++) {
+ int pos;
+
+ while (frames[pos = g_fp->_rnd->getRandomNumber(4)] == 0)
+ ;
+
+ mq->getExCommandByIndex(i)->_messageNum = frames[pos];
+
+ frames[pos] = 0;
+ }
+ }
+}
+
+void sceneHandler28_trySecondaryPers() {
+ MessageQueue *mq;
+ int x;
+
+ if (g_vars->scene28_headBeardedFlipper) {
+ if (g_vars->scene28_beardedDirection) {
+ mq = new MessageQueue(g_fp->_currentScene->getMessageQueueById(QU_BRD28_GOR), 0, 1);
+
+ mq->getExCommandByIndex(0)->_x = g_fp->_sceneRect.left - 20;
+ mq->getExCommandByIndex(0)->_keyCode = 1;
+ mq->replaceKeyCode(-1, 1);
+ mq->chain(0);
+
+ mq = new MessageQueue(g_fp->_currentScene->getMessageQueueById(QU_BRD28_GOR), 0, 1);
+
+ mq->getExCommandByIndex(0)->_x = g_fp->_sceneRect.left - 40;
+ mq->getExCommandByIndex(0)->_y += 20;
+ mq->getExCommandByIndex(0)->_keyCode = 2;
+ mq->replaceKeyCode(-1, 2);
+ mq->chain(0);
+
+ mq = new MessageQueue(g_fp->_currentScene->getMessageQueueById(QU_BRD28_GOR), 0, 1);
+
+ x = g_fp->_sceneRect.left - 60;
+ } else {
+ mq = new MessageQueue(g_fp->_currentScene->getMessageQueueById(QU_BRD28_GOL), 0, 1);
+
+ mq->getExCommandByIndex(0)->_x = g_fp->_sceneRect.right + 20;
+ mq->getExCommandByIndex(0)->_keyCode = 1;
+ mq->replaceKeyCode(-1, 1);
+ mq->chain(0);
+
+ mq = new MessageQueue(g_fp->_currentScene->getMessageQueueById(QU_BRD28_GOL), 0, 1);
+
+ mq->getExCommandByIndex(0)->_x = g_fp->_sceneRect.right + 40;
+ mq->getExCommandByIndex(0)->_y += 20;
+ mq->getExCommandByIndex(0)->_keyCode = 2;
+ mq->replaceKeyCode(-1, 2);
+ mq->chain(0);
+
+ mq = new MessageQueue(g_fp->_currentScene->getMessageQueueById(QU_BRD28_GOL), 0, 1);
+
+ x = g_fp->_sceneRect.right + 60;
+ }
+
+ mq->getExCommandByIndex(0)->_x = x;
+ mq->getExCommandByIndex(0)->_y += 40;
+ mq->getExCommandByIndex(0)->_keyCode = 3;
+ mq->replaceKeyCode(-1, 3);
+ mq->chain( 0);
+
+ g_vars->scene28_beardedDirection = !g_vars->scene28_beardedDirection;
+ } else {
+ if (g_vars->scene28_headDirection) {
+ mq = new MessageQueue(g_fp->_currentScene->getMessageQueueById(QU_GLV28_GOR), 0, 1);
+
+ x = g_fp->_sceneRect.left - 40;
+ } else {
+ mq = new MessageQueue(g_fp->_currentScene->getMessageQueueById(QU_GLV28_GOL), 0, 1);
+
+ x = g_fp->_sceneRect.right + 40;
+ }
+
+ mq->getExCommandByIndex(0)->_x = x;
+ mq->chain(0);
+
+ g_vars->scene28_headDirection = !g_vars->scene28_headDirection;
+ }
+
+ g_vars->scene28_headBeardedFlipper = !g_vars->scene28_headBeardedFlipper;
+}
+
+void sceneHandler28_turnOn2() {
+ if (g_vars->scene28_fliesArePresent) {
+ g_fp->_floaters->genFlies(g_fp->_currentScene, 1013, 329, 60, 4);
+
+ g_fp->_floaters->_array2[g_fp->_floaters->_array2.size() - 1]->val15 = 30;
+ g_fp->_floaters->_array2[g_fp->_floaters->_array2.size() - 1]->countdown = g_fp->_rnd->getRandomNumber(12) + 12;
+
+ g_fp->_floaters->genFlies(g_fp->_currentScene, 1074, 311, 60, 4);
+
+ g_fp->_floaters->_array2[g_fp->_floaters->_array2.size() - 1]->val15 = 30;
+ g_fp->_floaters->_array2[g_fp->_floaters->_array2.size() - 1]->countdown = g_fp->_rnd->getRandomNumber(12) + 12;
+ }
+
+ g_vars->scene28_fliesArePresent = false;
+}
+
+void sceneHandler28_startWork1() {
+ g_fp->_aniMan->hide();
+
+ StaticANIObject *man = g_fp->_currentScene->getStaticANIObject1ById(ANI_MAN_28, -1);
+
+ man->_statics = man->getStaticsById(ST_MAN28_RIGHT);
+ man->setOXY(g_fp->_aniMan->_ox, g_fp->_aniMan->_oy);
+ man->_priority = g_fp->_aniMan->_priority;
+ man->show1(-1, -1, -1, 0);
+
+ chainQueue(QU_SC28_LIFT1_WORK, 1);
+}
+
+void sceneHandler28_lift0Start() {
+ chainQueue(QU_SC28_LIFT0_START, 1);
+}
+
+void sceneHandler28_lift1Start() {
+ g_fp->_aniMan->_flags |= 1;
+
+ g_fp->_behaviorManager->setFlagByStaticAniObject(g_fp->_aniMan, 0);
+
+ chainQueue(QU_SC28_LIFT1_START, 1);
+}
+
+void sceneHandler28_lift2Start() {
+ chainQueue(QU_SC28_LIFT2_START, 1);
+}
+
+void sceneHandler28_lift3Start() {
+ chainQueue(QU_SC28_LIFT3_START, 1);
+}
+
+void sceneHandler28_lift4Start() {
+ g_fp->_aniMan->_flags |= 1;
+
+ g_fp->_behaviorManager->setFlagByStaticAniObject(g_fp->_aniMan, 0);
+
+ chainQueue(QU_SC28_WMN_START, 1);
+}
+
+void sceneHandler28_lift5Start() {
+ chainQueue(QU_SC28_LIFT5_START, 1);
+}
+
+void sceneHandler28_lift6Start() {
+ g_fp->_aniMan->_flags |= 1;
+
+ g_fp->_behaviorManager->setFlagByStaticAniObject(g_fp->_aniMan, 0);
+
+ StaticANIObject *woman = g_fp->_currentScene->getStaticANIObject1ById(ANI_TIOTIA, -1);
+
+ if (woman && (woman->_flags & 4))
+ chainQueue(QU_SC28_LIFT6_START2, 1);
+ else
+ chainQueue(QU_SC28_LIFT6_START, 1);
+}
+
+void sceneHandler28_clickLift(int keycode) {
+ int x = 0;
+
+ switch (keycode) {
+ case 0: x = 600; break;
+ case 1: x = 824; break;
+ case 2: x = 1055; break;
+ case 3: x = 1286; break;
+ case 4: x = 1517; break;
+ case 5: x = 1748; break;
+ case 6: x = 1979; break;
+ }
+
+ if (abs(x - g_fp->_aniMan->_ox) > 1 || abs(472 - g_fp->_aniMan->_oy) > 1
+ || g_fp->_aniMan->_movement
+ || g_fp->_aniMan->_statics->_staticsId != ST_MAN_UP) {
+ MessageQueue *mq = getCurrSceneSc2MotionController()->method34(g_fp->_aniMan, x, 472, 1, ST_MAN_UP);
+ if (mq) {
+ ExCommand *ex = new ExCommand(0, 17, MSG_SC28_CLICKLIFT, 0, 0, 0, 1, 0, 0, 0);
+ ex->_excFlags |= 3;
+
+ mq->addExCommandToEnd(ex);
+
+ postExCommand(g_fp->_aniMan->_id, 2, x, 472, 0, -1);
+ }
+ } else {
+ switch (keycode) {
+ case 0:
+ sceneHandler28_lift0Start();
+ break;
+ case 1:
+ sceneHandler28_lift1Start();
+ break;
+ case 2:
+ sceneHandler28_lift2Start();
+ break;
+ case 3:
+ sceneHandler28_lift3Start();
+ break;
+ case 4:
+ sceneHandler28_lift4Start();
+ break;
+ case 5:
+ sceneHandler28_lift5Start();
+ break;
+ case 6:
+ sceneHandler28_lift6Start();
+ break;
+ default:
+ return;
+ }
+ }
+}
+
+int sceneHandler28(ExCommand *cmd) {
+ if (cmd->_messageKind != 17)
+ return 0;
+
+ switch (cmd->_messageNum) {
+ case MSG_SC28_LIFT6MUSIC:
+ g_fp->playTrack(g_fp->getGameLoaderGameVar()->getSubVarByName("SC_28"), "MUSIC_TIOTIA", 1);
+ break;
+
+ case MSG_SC28_LIFT6INSIDE:
+ g_vars->scene28_lift6inside = true;
+ break;
+
+ case MSG_SC28_LIFT1_SHOWAFTER:
+ sceneHandler28_lift1ShowAfter();
+ break;
+
+ case MSG_SC28_MAKEFACES:
+ sceneHandler28_makeFaces(cmd);
+ break;
+
+ case MSG_SC28_TRYVTORPERS:
+ sceneHandler28_trySecondaryPers();
+ break;
+
+ case MSG_SC28_TURNOFF_0:
+ g_vars->scene28_lighteningObject = g_fp->_currentScene->getPictureObjectById(PIC_SC28_DARK0, 0);
+ g_vars->scene28_lighteningObject->_flags |= 4;
+ break;
+
+ case MSG_SC28_TURNON_0:
+ g_vars->scene28_darkeningObject = g_fp->_currentScene->getPictureObjectById(PIC_SC28_DARK0, 0);
+ break;
+
+ case MSG_SC28_TURNON_1:
+ g_vars->scene28_darkeningObject = g_fp->_currentScene->getPictureObjectById(PIC_SC28_DARK1, 0);
+ break;
+
+ case MSG_SC28_TURNOFF_1:
+ g_vars->scene28_lighteningObject = g_fp->_currentScene->getPictureObjectById(PIC_SC28_DARK1, 0);
+ g_vars->scene28_lighteningObject->_flags |= 4;
+ break;
+
+ case MSG_SC28_TURNON_2:
+ g_vars->scene28_darkeningObject = g_fp->_currentScene->getPictureObjectById(PIC_SC28_DARK2, 0);
+ sceneHandler28_turnOn2();
+ break;
+
+ case MSG_SC28_TURNOFF_2:
+ g_vars->scene28_lighteningObject = g_fp->_currentScene->getPictureObjectById(PIC_SC28_DARK2, 0);
+ g_vars->scene28_lighteningObject->_flags |= 4;
+ break;
+
+ case MSG_SC28_TURNON_3:
+ g_vars->scene28_darkeningObject = g_fp->_currentScene->getPictureObjectById(PIC_SC28_DARK3, 0);
+ break;
+
+ case MSG_SC28_TURNOFF_3:
+ g_vars->scene28_lighteningObject = g_fp->_currentScene->getPictureObjectById(PIC_SC28_DARK3, 0);
+ g_vars->scene28_lighteningObject->_flags |= 4;
+ break;
+
+ case MSG_SC28_TURNON_4:
+ g_vars->scene28_darkeningObject = g_fp->_currentScene->getPictureObjectById(PIC_SC28_DARK4, 0);
+ break;
+
+ case MSG_SC28_TURNOFF_4:
+ g_vars->scene28_lighteningObject = g_fp->_currentScene->getPictureObjectById(PIC_SC28_DARK4, 0);
+ g_vars->scene28_lighteningObject->_flags |= 4;
+ break;
+
+ case MSG_SC28_TURNON_6:
+ g_vars->scene28_darkeningObject = g_fp->_currentScene->getPictureObjectById(PIC_SC28_DARK6, 0);
+ break;
+
+ case MSG_SC28_TURNOFF_6:
+ g_vars->scene28_lighteningObject = g_fp->_currentScene->getPictureObjectById(PIC_SC28_DARK6, 0);
+ g_vars->scene28_lighteningObject->_flags |= 4;
+ break;
+
+ case MSG_SC28_STARTWORK1:
+ sceneHandler28_startWork1();
+ break;
+
+ case MSG_SC28_CLICKLIFT:
+ sceneHandler28_clickLift(cmd->_keyCode);
+ break;
+
+ case MSG_SC28_ENDLIFT1:
+ case MSG_SC28_ENDLIFT6:
+ case MSG_SC28_ENDCABIN:
+ g_fp->_behaviorManager->setFlagByStaticAniObject(g_fp->_aniMan, 1);
+ g_fp->_aniMan->_flags &= 0xFEFF;
+ break;
+
+ case 29:
+ {
+ if (g_vars->scene28_lift6inside) {
+ chainObjQueue(g_fp->_aniMan, QU_SC28_LIFT6_END, 1);
+
+ g_fp->playTrack(g_fp->getGameLoaderGameVar()->getSubVarByName("SC_28"), "MUSIC", 1);
+
+ g_vars->scene28_lift6inside = false;
+ }
+
+ StaticANIObject *ani = g_fp->_currentScene->getStaticANIObjectAtPos(cmd->_sceneClickX, cmd->_sceneClickY);
+
+ if (ani)
+ if (ani->_id == ANI_LIFT || ani->_id == ANI_LIFT_28 ) {
+ sceneHandler28_clickLift(ani->_okeyCode);
+
+ cmd->_messageKind = 0;
+ break;
+ }
+
+ if (!ani || !canInteractAny(g_fp->_aniMan, ani, cmd->_keyCode)) {
+ int picId = g_fp->_currentScene->getPictureObjectIdAtPos(cmd->_sceneClickX, cmd->_sceneClickY);
+ PictureObject *pic = g_fp->_currentScene->getPictureObjectById(picId, 0);
+
+ if (!pic || !canInteractAny(g_fp->_aniMan, pic, cmd->_keyCode)) {
+ if ((g_fp->_sceneRect.right - cmd->_sceneClickX < 47 && g_fp->_sceneRect.right < g_fp->_sceneWidth - 1)
+ || (cmd->_sceneClickX - g_fp->_sceneRect.left < 47 && g_fp->_sceneRect.left > 0))
+ g_fp->processArcade(cmd);
+ }
+ }
+ break;
+ }
+
+ case 33:
+ if (g_fp->_aniMan2) {
+ int x = g_fp->_aniMan2->_ox;
+
+ if (x < g_fp->_sceneRect.left + 200)
+ g_fp->_currentScene->_x = x - 300 - g_fp->_sceneRect.left;
+
+ if (x > g_fp->_sceneRect.right - 200)
+ g_fp->_currentScene->_x = x + 300 - g_fp->_sceneRect.right;
+ }
+
+ if (g_vars->scene28_darkeningObject) {
+ if (g_vars->scene28_darkeningObject->_picture->getAlpha() > 10) {
+ g_vars->scene28_darkeningObject->_picture->setAlpha(g_vars->scene28_darkeningObject->_picture->getAlpha() - 10);
+ } else {
+ g_vars->scene28_darkeningObject->_flags &= 0xFFFB;
+
+ g_vars->scene28_darkeningObject = 0;
+ }
+ }
+
+ if (g_vars->scene28_lighteningObject) {
+ if (g_vars->scene28_lighteningObject->_picture->getAlpha() < 0xF9u) {
+ g_vars->scene28_lighteningObject->_picture->setAlpha(g_vars->scene28_lighteningObject->_picture->getAlpha() + 6);
+ } else {
+ g_vars->scene28_lighteningObject->_picture->setAlpha(0xff);
+
+ g_vars->scene28_lighteningObject = 0;
+ }
+ }
+
+ g_fp->_floaters->update();
+
+ for (uint i = 0; i < g_fp->_floaters->_array2.size(); i++)
+ if (g_fp->_floaters->_array2[i]->val13 == 1)
+ g_fp->_floaters->_array2[i]->ani->_priority = 15;
+
+ g_fp->_behaviorManager->updateBehaviors();
+
+ g_fp->startSceneTrack();
+
+ break;
+ }
+
+ return 0;
+}
+
+} // End of namespace Fullpipe
diff --git a/engines/fullpipe/scenes/scene29.cpp b/engines/fullpipe/scenes/scene29.cpp
new file mode 100644
index 0000000000..8f82e99ad1
--- /dev/null
+++ b/engines/fullpipe/scenes/scene29.cpp
@@ -0,0 +1,1125 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public 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 "fullpipe/fullpipe.h"
+
+#include "fullpipe/objectnames.h"
+#include "fullpipe/constants.h"
+
+#include "fullpipe/gameloader.h"
+#include "fullpipe/motion.h"
+#include "fullpipe/scenes.h"
+#include "fullpipe/statics.h"
+
+#include "fullpipe/interaction.h"
+#include "fullpipe/behavior.h"
+
+
+namespace Fullpipe {
+
+struct WalkingBearder {
+ StaticANIObject *ani;
+ int wbflag;
+ int wbcounter;
+};
+
+void scene29_initScene(Scene *sc) {
+ g_vars->scene29_porter = sc->getStaticANIObject1ById(ANI_PORTER, -1);
+ g_vars->scene29_shooter1 = sc->getStaticANIObject1ById(ANI_SHOOTER1, -1);
+ g_vars->scene29_shooter2 = sc->getStaticANIObject1ById(ANI_SHOOTER2, -1);
+ g_vars->scene29_ass = sc->getStaticANIObject1ById(ANI_ASS, -1);
+
+ g_vars->scene29_balls.numBalls = 0;
+ g_vars->scene29_balls.pTail = 0;
+ g_vars->scene29_balls.field_8 = 0;
+ g_vars->scene29_balls.pHead = 0;
+
+ free(g_vars->scene29_balls.cPlex);
+ g_vars->scene29_balls.cPlex = 0;
+
+ StaticANIObject *ani;
+
+ g_vars->scene29_greenBalls.numBalls = 0;
+ g_vars->scene29_greenBalls.pTail = 0;
+ g_vars->scene29_greenBalls.field_8 = 0;
+ g_vars->scene29_greenBalls.pHead = 0;
+
+ free(g_vars->scene29_greenBalls.cPlex);
+ g_vars->scene29_greenBalls.cPlex = 0;
+
+ ani = sc->getStaticANIObject1ById(ANI_SHELL_GREEN, -1);
+ Ball *b = g_vars->scene29_balls.sub04(g_vars->scene29_balls.field_8, 0);
+ b->ani = ani;
+
+ if (g_vars->scene29_balls.field_8)
+ g_vars->scene29_balls.field_8->p0 = b;
+ else
+ g_vars->scene29_balls.pHead = b;
+
+ g_vars->scene29_balls.field_8 = b;
+
+ for (int i = 0; i < 2; i++) {
+ StaticANIObject *newani = new StaticANIObject(ani);
+
+ sc->addStaticANIObject(newani, 1);
+
+ b = g_vars->scene29_balls.sub04(g_vars->scene29_balls.field_8, 0);
+ b->ani = ani;
+
+ if (g_vars->scene29_balls.field_8)
+ g_vars->scene29_balls.field_8->p0 = b;
+ else
+ g_vars->scene29_balls.pHead = b;
+
+ g_vars->scene29_balls.field_8 = b;
+ }
+
+ g_vars->scene29_redBalls.numBalls = 0;
+ g_vars->scene29_redBalls.pTail = 0;
+ g_vars->scene29_redBalls.field_8 = 0;
+ g_vars->scene29_redBalls.pHead = 0;
+
+ free(g_vars->scene29_redBalls.cPlex);
+ g_vars->scene29_redBalls.cPlex = 0;
+
+ g_vars->scene29_flyingRedBalls.numBalls = 0;
+ g_vars->scene29_flyingRedBalls.pTail = 0;
+ g_vars->scene29_flyingRedBalls.field_8 = 0;
+ g_vars->scene29_flyingRedBalls.pHead = 0;
+
+ free(g_vars->scene29_flyingRedBalls.cPlex);
+ g_vars->scene29_flyingRedBalls.cPlex = 0;
+
+ ani = sc->getStaticANIObject1ById(ANI_SHELL_RED, -1);
+
+ b = g_vars->scene29_redBalls.sub04(g_vars->scene29_redBalls.field_8, 0);
+ b->ani = ani;
+
+ if (g_vars->scene29_redBalls.field_8)
+ g_vars->scene29_redBalls.field_8->p0 = b;
+ else
+ g_vars->scene29_redBalls.pHead = b;
+
+ g_vars->scene29_redBalls.field_8 = b;
+
+ for (int i = 0; i < 2; i++) {
+ StaticANIObject *newani = new StaticANIObject(ani);
+
+ sc->addStaticANIObject(newani, 1);
+
+ b = g_vars->scene29_redBalls.sub04(g_vars->scene29_redBalls.field_8, 0);
+ b->ani = ani;
+
+ if (g_vars->scene29_redBalls.field_8)
+ g_vars->scene29_redBalls.field_8->p0 = b;
+ else
+ g_vars->scene29_redBalls.pHead = b;
+
+ g_vars->scene29_redBalls.field_8 = b;
+ }
+
+ g_vars->scene29_bearders.clear();
+
+ ani = new StaticANIObject(g_fp->accessScene(SC_COMMON)->getStaticANIObject1ById(ANI_BEARDED_CMN, -1));
+
+ ani->_statics = ani->getStaticsById(ST_BRDCMN_EMPTY);
+
+ sc->addStaticANIObject(ani, 1);
+
+ WalkingBearder *wb = new WalkingBearder;
+
+ wb->ani = ani;
+ wb->wbflag = 0;
+ wb->wbcounter = 0;
+
+ g_vars->scene29_bearders.push_back(wb);
+
+ g_vars->scene29_manIsRiding = false;
+ g_vars->scene29_arcadeIsOn = false;
+ g_vars->scene29_reachedFarRight = false;
+ g_vars->scene29_rideBackEnabled = false;
+ g_vars->scene29_shootCountdown = 0;
+ g_vars->scene29_shootDistance = 75;
+ g_vars->scene29_manIsHit = false;
+ g_vars->scene29_scrollSpeed = 0;
+ g_vars->scene29_scrollingDisabled = false;
+ g_vars->scene29_hitBall = 0;
+
+ g_fp->setArcadeOverlay(PIC_CSR_ARCADE8);
+}
+
+void sceneHandler29_winArcade() {
+ if (g_vars->scene29_shooter2->_flags & 4) {
+ g_vars->scene29_shootCountdown = 0;
+
+ g_vars->scene29_shooter1->changeStatics2(ST_STR1_STAND);
+ g_vars->scene29_shooter2->changeStatics2(ST_STR2_STAND);
+
+ g_vars->scene29_shooter2->_flags &= 0xFFFB;
+
+ StaticANIObject *ani;
+ Ball *newball, *ball, *oldp0;
+
+ while (g_vars->scene29_greenBalls.numBalls) {
+ ball = g_vars->scene29_greenBalls.pHead;
+ ani = g_vars->scene29_greenBalls.pHead->ani;
+ oldp0 = g_vars->scene29_greenBalls.pHead->p0;
+ g_vars->scene29_greenBalls.pHead = g_vars->scene29_greenBalls.pHead->p0;
+
+ if (g_vars->scene29_greenBalls.pHead)
+ oldp0->p1 = 0;
+ else
+ g_vars->scene29_greenBalls.field_8 = 0;
+
+ ball->p0 = g_vars->scene29_greenBalls.pTail;
+ g_vars->scene29_greenBalls.pTail = ball;
+ g_vars->scene29_greenBalls.numBalls--;
+
+ if (!g_vars->scene29_greenBalls.numBalls)
+ g_vars->scene29_greenBalls.reset();
+
+ ani->hide();
+
+ newball = g_vars->scene29_balls.sub04(g_vars->scene29_balls.field_8, 0);
+ newball->ani = ani;
+
+ if (g_vars->scene29_balls.field_8)
+ g_vars->scene29_balls.field_8->p0 = newball;
+ else
+ g_vars->scene29_balls.pHead = newball;
+
+ g_vars->scene29_balls.field_8 = newball;
+ }
+
+ while (g_vars->scene29_flyingRedBalls.numBalls) {
+ ball = g_vars->scene29_flyingRedBalls.pHead;
+ ani = g_vars->scene29_flyingRedBalls.pHead->ani;
+ oldp0 = g_vars->scene29_flyingRedBalls.pHead->p0;
+ g_vars->scene29_flyingRedBalls.pHead = g_vars->scene29_flyingRedBalls.pHead->p0;
+
+ if (g_vars->scene29_flyingRedBalls.pHead)
+ oldp0->p1 = 0;
+ else
+ g_vars->scene29_flyingRedBalls.field_8 = 0;
+
+ ball->p0 = g_vars->scene29_flyingRedBalls.pTail;
+ g_vars->scene29_flyingRedBalls.pTail = ball;
+ g_vars->scene29_flyingRedBalls.numBalls--;
+
+ if (!g_vars->scene29_flyingRedBalls.numBalls) {
+ g_vars->scene29_flyingRedBalls.numBalls = 0;
+ g_vars->scene29_flyingRedBalls.pTail = 0;
+ g_vars->scene29_flyingRedBalls.field_8 = 0;
+ g_vars->scene29_flyingRedBalls.pHead = 0;
+
+ free(g_vars->scene29_flyingRedBalls.cPlex);
+
+ g_vars->scene29_flyingRedBalls.cPlex = 0;
+ }
+
+ ani->hide();
+
+ newball = g_vars->scene29_redBalls.sub04(g_vars->scene29_redBalls.field_8, 0);
+ newball->ani = ani;
+
+ if (g_vars->scene29_redBalls.field_8)
+ g_vars->scene29_redBalls.field_8->p0 = newball;
+ else
+ g_vars->scene29_redBalls.pHead = newball;
+
+ g_vars->scene29_redBalls.field_8 = newball;
+ }
+
+ g_vars->scene29_ass->queueMessageQueue(0);
+ g_vars->scene29_ass->_flags &= 0xFFFB;
+
+ chainQueue(QU_SC29_ESCAPE, 1);
+ }
+
+ g_fp->setObjectState(sO_LeftPipe_29, g_fp->getObjectEnumState(sO_LeftPipe_29, sO_IsOpened));
+}
+
+void sceneHandler29_shootGreen() {
+ if (g_vars->scene29_balls.numBalls) {
+ int x = g_vars->scene29_shooter1->_ox - 113;
+ int y = g_vars->scene29_shooter1->_oy - 48;
+ StaticANIObject *ani = g_vars->scene29_balls.pHead->ani;
+ Ball *oldhead = g_vars->scene29_balls.pHead;
+ Ball *oldp0 = g_vars->scene29_balls.pHead->p0;
+
+ g_vars->scene29_balls.pHead = g_vars->scene29_balls.pHead->p0;
+
+ if (g_vars->scene29_balls.pHead)
+ oldp0->p1 = 0;
+ else
+ g_vars->scene29_balls.field_8 = 0;
+
+ oldhead->p0 = g_vars->scene29_balls.pTail;
+
+ g_vars->scene29_balls.pTail = oldhead;
+ g_vars->scene29_balls.numBalls--;
+
+ if (!g_vars->scene29_balls.numBalls) {
+ g_vars->scene29_balls.numBalls = 0;
+ g_vars->scene29_balls.pTail = 0;
+ g_vars->scene29_balls.field_8 = 0;
+ g_vars->scene29_balls.pHead = 0;
+
+ free(g_vars->scene29_balls.cPlex);
+ g_vars->scene29_balls.cPlex = 0;
+ }
+
+ ani->show1(x, y, MV_SHG_NORM, 0);
+ ani->_priority = 5;
+
+ Ball *runPtr = g_vars->scene29_greenBalls.pTail;
+ Ball *lastP = g_vars->scene29_greenBalls.field_8;
+
+ if (!g_vars->scene29_greenBalls.pTail) {
+ g_vars->scene29_greenBalls.cPlex = (byte *)calloc(g_vars->scene29_greenBalls.cPlexLen, sizeof(Ball));
+
+ byte *p1 = g_vars->scene29_greenBalls.cPlex + (g_vars->scene29_greenBalls.cPlexLen - 1) * sizeof(Ball);
+
+ if (g_vars->scene29_greenBalls.cPlexLen - 1 < 0) {
+ runPtr = g_vars->scene29_greenBalls.pTail;
+ } else {
+ runPtr = g_vars->scene29_greenBalls.pTail;
+
+ for (int j = 0; j < g_vars->scene29_greenBalls.cPlexLen; j++) {
+ ((Ball *)p1)->p1 = runPtr;
+ runPtr = (Ball *)p1;
+
+ p1 -= sizeof(Ball);
+ }
+
+ g_vars->scene29_greenBalls.pTail = runPtr;
+ }
+ }
+ g_vars->scene29_greenBalls.pTail = runPtr->p0;
+ runPtr->p1 = lastP;
+ runPtr->p0 = 0;
+ runPtr->ani = ani;
+
+ g_vars->scene29_greenBalls.numBalls++;
+
+ if (g_vars->scene29_greenBalls.field_8) {
+ g_vars->scene29_greenBalls.field_8->p0 = runPtr;
+ g_vars->scene29_greenBalls.field_8 = runPtr;
+ } else {
+ g_vars->scene29_greenBalls.pHead = runPtr;
+ g_vars->scene29_greenBalls.field_8 = runPtr;
+ }
+ }
+}
+
+void sceneHandler29_shootRed() {
+ if (g_vars->scene29_balls.numBalls) {
+ int x = g_vars->scene29_shooter1->_ox - 101;
+ int y = g_vars->scene29_shooter1->_oy - 14;
+ StaticANIObject *ani = g_vars->scene29_balls.pHead->ani;
+ Ball *oldhead = g_vars->scene29_balls.pHead;
+ Ball *oldp0 = g_vars->scene29_balls.pHead->p0;
+
+ g_vars->scene29_balls.pHead = g_vars->scene29_balls.pHead->p0;
+
+ if (g_vars->scene29_balls.pHead)
+ oldp0->p1 = 0;
+ else
+ g_vars->scene29_balls.field_8 = 0;
+
+ oldhead->p0 = g_vars->scene29_balls.pTail;
+
+ g_vars->scene29_balls.pTail = oldhead;
+ g_vars->scene29_balls.numBalls--;
+
+ if (!g_vars->scene29_balls.numBalls) {
+ g_vars->scene29_balls.numBalls = 0;
+ g_vars->scene29_balls.pTail = 0;
+ g_vars->scene29_balls.field_8 = 0;
+ g_vars->scene29_balls.pHead = 0;
+
+ free(g_vars->scene29_balls.cPlex);
+ g_vars->scene29_balls.cPlex = 0;
+ }
+
+ ani->show1(x, y, MV_SHR_NORM, 0);
+ ani->_priority = 5;
+
+ Ball *runPtr = g_vars->scene29_flyingRedBalls.pTail;
+ Ball *lastP = g_vars->scene29_flyingRedBalls.field_8;
+
+ if (!g_vars->scene29_flyingRedBalls.pTail) {
+ g_vars->scene29_flyingRedBalls.cPlex = (byte *)calloc(g_vars->scene29_flyingRedBalls.cPlexLen, sizeof(Ball));
+
+ byte *p1 = g_vars->scene29_flyingRedBalls.cPlex + (g_vars->scene29_flyingRedBalls.cPlexLen - 1) * sizeof(Ball);
+
+ if (g_vars->scene29_flyingRedBalls.cPlexLen - 1 < 0) {
+ runPtr = g_vars->scene29_flyingRedBalls.pTail;
+ } else {
+ runPtr = g_vars->scene29_flyingRedBalls.pTail;
+
+ for (int j = 0; j < g_vars->scene29_flyingRedBalls.cPlexLen; j++) {
+ ((Ball *)p1)->p1 = runPtr;
+ runPtr = (Ball *)p1;
+
+ p1 -= sizeof(Ball);
+ }
+
+ g_vars->scene29_flyingRedBalls.pTail = runPtr;
+ }
+ }
+ g_vars->scene29_flyingRedBalls.pTail = runPtr->p0;
+ runPtr->p1 = lastP;
+ runPtr->p0 = 0;
+ runPtr->ani = ani;
+
+ g_vars->scene29_flyingRedBalls.numBalls++;
+
+ if (g_vars->scene29_flyingRedBalls.field_8) {
+ g_vars->scene29_flyingRedBalls.field_8->p0 = runPtr;
+ g_vars->scene29_flyingRedBalls.field_8 = runPtr;
+ } else {
+ g_vars->scene29_flyingRedBalls.pHead = runPtr;
+ g_vars->scene29_flyingRedBalls.field_8 = runPtr;
+ }
+ }
+}
+
+void sceneHandler29_manJump() {
+ if (!g_fp->_aniMan->_movement || g_fp->_aniMan->_movement->_id == MV_MAN29_RUN || g_fp->_aniMan->_movement->_id == MV_MAN29_STANDUP) {
+ g_vars->scene29_rideBackEnabled = false;
+ g_vars->scene29_manIsHit = false;
+ g_vars->scene29_reachedFarRight = true;
+
+ g_fp->_aniMan->changeStatics2(ST_MAN29_RUNR);
+ g_fp->_aniMan->startAnim(MV_MAN29_JUMP, 0, -1);
+ }
+
+ g_vars->scene29_manX = g_fp->_aniMan->_ox;
+ g_vars->scene29_manY = g_fp->_aniMan->_oy;
+}
+
+void sceneHandler29_manBend() {
+ if (!g_fp->_aniMan->_movement || g_fp->_aniMan->_movement->_id == MV_MAN29_RUN || g_fp->_aniMan->_movement->_id == MV_MAN29_STANDUP) {
+ g_vars->scene29_rideBackEnabled = false;
+ g_vars->scene29_manIsHit = false;
+ g_vars->scene29_reachedFarRight = true;
+
+ g_fp->_aniMan->changeStatics2(ST_MAN29_RUNR);
+ g_fp->_aniMan->startAnim(MV_MAN29_BEND, 0, -1);
+ }
+
+ g_vars->scene29_manX = g_fp->_aniMan->_ox;
+ g_vars->scene29_manY = g_fp->_aniMan->_oy;
+}
+
+bool sceneHandler29_checkRedBallHit(StaticANIObject *ani, int maxx) {
+ if (!g_vars->scene29_arcadeIsOn || g_vars->scene29_manIsHit)
+ return false;
+
+ if ((ani->_ox >= g_vars->scene29_manX + 42 || ani->_ox <= g_vars->scene29_manX + 8)
+ && (ani->_ox < g_vars->scene29_manX + 8 || maxx > g_vars->scene29_manX + 27))
+ return false;
+
+ if (!g_fp->_aniMan->_movement)
+ return true;
+
+ int phase = g_fp->_aniMan->_movement->_currDynamicPhaseIndex;
+
+ if (g_fp->_aniMan->_movement->_id != MV_MAN29_BEND && g_fp->_aniMan->_movement->_id != MV_MAN29_RUN
+ && (g_fp->_aniMan->_movement->_id != MV_MAN29_JUMP || (phase >= 3 && phase <= 6)))
+ return false;
+ else
+ return true;
+}
+
+bool sceneHandler29_checkGreenBallHit(StaticANIObject *ani, int maxx) {
+ if (!g_vars->scene29_arcadeIsOn || g_vars->scene29_manIsHit)
+ return false;
+
+ if (ani->_ox >= g_vars->scene29_manX + 40) {
+ if (maxx > g_vars->scene29_manX + 27)
+ return false;
+ } else {
+ if (ani->_ox <= g_vars->scene29_manX + 10) {
+ if (ani->_ox < g_vars->scene29_manX + 40)
+ return false;
+
+ if (maxx > g_vars->scene29_manX + 27)
+ return false;
+ }
+ }
+
+ if (!g_fp->_aniMan->_movement)
+ return true;
+
+ if (g_fp->_aniMan->_movement->_id == MV_MAN29_JUMP)
+ return true;
+
+ if (g_fp->_aniMan->_movement->_id == MV_MAN29_RUN)
+ return true;
+
+ if (g_fp->_aniMan->_movement->_id == MV_MAN29_BEND) {
+ if (g_fp->_aniMan->_movement->_currDynamicPhaseIndex < 1 || g_fp->_aniMan->_movement->_currDynamicPhaseIndex > 5)
+ return true;
+ }
+
+ return false;
+}
+
+void sceneHandler29_manHit() {
+ MGMInfo mgminfo;
+
+ g_vars->scene29_manIsHit = true;
+
+ g_fp->_aniMan->changeStatics2(ST_MAN29_RUNR);
+ g_fp->_aniMan->setOXY(g_vars->scene29_manX, g_vars->scene29_manY);
+
+ mgminfo.ani = g_fp->_aniMan;
+ mgminfo.staticsId2 = ST_MAN29_SITR;
+ mgminfo.y1 = 463;
+ mgminfo.x1 = g_vars->scene29_manX <= 638 ? 351 : 0;
+ mgminfo.field_1C = 10;
+ mgminfo.field_10 = 1;
+ mgminfo.flags = (g_vars->scene29_manX <= 638 ? 2 : 0) | 0x44;
+ mgminfo.movementId = MV_MAN29_HIT;
+
+ MessageQueue *mq = g_vars->scene29_mgm.genMovement(&mgminfo);
+ ExCommand *ex;
+
+ if (mq) {
+ if (g_vars->scene29_manX <= 638) {
+ ex = new ExCommand(ANI_MAN, 1, MV_MAN29_STANDUP_NORM, 0, 0, 0, 1, 0, 0, 0);
+ ex->_excFlags = 2;
+ ex->_keyCode = g_fp->_aniMan->_okeyCode;
+ mq->addExCommandToEnd(ex);
+
+ ex = new ExCommand(0, 17, MSG_SC29_STOPRIDE, 0, 0, 0, 1, 0, 0, 0);
+ ex->_excFlags = 2;
+ mq->addExCommandToEnd(ex);
+
+ g_vars->scene29_manIsRiding = false;
+ g_vars->scene29_arcadeIsOn = false;
+ g_vars->scene29_reachedFarRight = false;
+ g_vars->scene29_rideBackEnabled = false;
+ } else {
+ ex = new ExCommand(ANI_MAN, 1, MV_MAN29_STANDUP, 0, 0, 0, 1, 0, 0, 0);
+ ex->_excFlags = 2;
+ ex->_keyCode = g_fp->_aniMan->_okeyCode;
+ mq->addExCommandToEnd(ex);
+ }
+
+ mq->setFlags(mq->getFlags() | 1);
+
+ if (!mq->chain(g_fp->_aniMan))
+ delete mq;
+ }
+}
+
+void sceneHandler29_assHitRed() {
+ if (g_vars->scene29_ass->_statics->_staticsId == ST_ASS_NORM) {
+ g_vars->scene29_ass->changeStatics2(ST_ASS_NORM);
+ g_vars->scene29_ass->startAnim(MV_ASS_HITRED, 0, -1);
+ }
+}
+
+void sceneHandler29_assHitGreen() {
+ if (g_vars->scene29_ass->_statics->_staticsId == ST_ASS_NORM) {
+ g_vars->scene29_ass->changeStatics2(ST_ASS_NORM);
+ g_vars->scene29_ass->startAnim(MV_ASS_HITGREEN, 0, -1);
+ }
+}
+
+void sceneHandler29_ballHitCheck() {
+ Ball *ball = g_vars->scene29_greenBalls.pHead;
+ Ball *newball;
+ int x, y;
+
+ while (ball) {
+ x = ball->ani->_ox - 30;
+ y = ball->ani->_oy;
+
+ if (x >= 186) {
+ if (sceneHandler29_checkGreenBallHit(ball->ani, x)) {
+ newball = g_vars->scene29_balls.sub04(g_vars->scene29_balls.field_8, 0);
+ newball->ani = ball->ani;
+
+ if (g_vars->scene29_balls.field_8)
+ g_vars->scene29_balls.field_8->p0 = newball;
+ else
+ g_vars->scene29_balls.pHead = newball;
+
+ g_vars->scene29_balls.field_8 = newball;
+
+ if (ball == g_vars->scene29_greenBalls.pHead)
+ g_vars->scene29_greenBalls.pHead = ball->p0;
+ else
+ ball->p1->p0 = ball->p0;
+
+ if (ball == g_vars->scene29_greenBalls.field_8)
+ g_vars->scene29_greenBalls.field_8 = ball->p1;
+ else
+ ball->p0->p1 = ball->p1;
+
+ g_vars->scene29_greenBalls.init(&ball);
+
+ sceneHandler29_manHit();
+
+ g_fp->playSound(SND_29_014, 0);
+
+ ball->ani->startAnim(MV_SHG_HITMAN, 0, -1);
+
+ g_vars->scene29_hitBall = ball->ani->_id;
+ } else {
+ ball->ani->setOXY(x, y);
+ }
+ } else {
+ newball = g_vars->scene29_balls.sub04(g_vars->scene29_balls.field_8, 0);
+ newball->ani = ball->ani;
+
+ if (g_vars->scene29_balls.field_8)
+ g_vars->scene29_balls.field_8->p0 = newball;
+ else
+ g_vars->scene29_balls.pHead = newball;
+
+ g_vars->scene29_balls.field_8 = newball;
+
+ ball->ani->hide();
+
+ if (ball == g_vars->scene29_greenBalls.pHead)
+ g_vars->scene29_greenBalls.pHead = ball->p0;
+ else
+ ball->p1->p0 = ball->p0;
+
+ if (ball == g_vars->scene29_greenBalls.field_8)
+ g_vars->scene29_greenBalls.field_8 = ball->p1;
+ else
+ ball->p0->p1 = ball->p1;
+
+ g_vars->scene29_greenBalls.init(&ball);
+
+ sceneHandler29_assHitGreen();
+ }
+
+ ball = ball->p0;
+ }
+
+ ball = g_vars->scene29_flyingRedBalls.pHead;
+
+ while (ball) {
+ x = ball->ani->_ox - 30;
+ y = ball->ani->_oy;
+
+ if (x >= 147) {
+ if (sceneHandler29_checkRedBallHit(ball->ani, x)) {
+ newball = g_vars->scene29_redBalls.sub04(g_vars->scene29_redBalls.field_8, 0);
+ newball->ani = ball->ani;
+
+ if (g_vars->scene29_redBalls.field_8)
+ g_vars->scene29_redBalls.field_8->p0 = newball;
+ else
+ g_vars->scene29_redBalls.pHead = newball;
+
+ g_vars->scene29_redBalls.field_8 = newball;
+
+ g_vars->scene29_flyingRedBalls.removeBall(ball);
+
+ sceneHandler29_manHit();
+
+ g_fp->playSound(SND_29_027, 0);
+
+ ball->ani->startAnim(MV_SHR_HITMAN, 0, -1);
+
+ g_vars->scene29_hitBall = ball->ani->_id;
+ } else {
+ ball->ani->setOXY(x, y);
+ }
+ } else {
+ newball = g_vars->scene29_redBalls.sub04(g_vars->scene29_redBalls.field_8, 0);
+ newball->ani = ball->ani;
+
+ if (g_vars->scene29_redBalls.field_8)
+ g_vars->scene29_redBalls.field_8->p0 = newball;
+ else
+ g_vars->scene29_redBalls.pHead = newball;
+
+ g_vars->scene29_redBalls.field_8 = newball;
+
+ ball->ani->hide();
+
+ if (ball == g_vars->scene29_flyingRedBalls.pHead)
+ g_vars->scene29_flyingRedBalls.pHead = ball->p0;
+ else
+ ball->p1->p0 = ball->p0;
+
+ if (ball == g_vars->scene29_flyingRedBalls.field_8)
+ g_vars->scene29_flyingRedBalls.field_8 = ball->p1;
+ else
+ ball->p0->p1 = ball->p1;
+
+ g_vars->scene29_flyingRedBalls.init(&ball);
+
+ sceneHandler29_assHitRed();
+ }
+
+ ball = ball->p0;
+ }
+}
+
+void sceneHandler29_manFromL() {
+ if (g_vars->scene29_manX < 497 && !g_vars->scene29_scrollingDisabled) {
+ getCurrSceneSc2MotionController()->setEnabled();
+ getGameLoaderInteractionController()->enableFlag24();
+
+ g_fp->_aniMan->changeStatics2(ST_MAN_RIGHT | 0x4000);
+ chainQueue(QU_SC29_MANFROM_L, 1);
+
+ g_vars->scene29_scrollingDisabled = true;
+
+ g_fp->_scrollSpeed = g_vars->scene29_scrollSpeed;
+ }
+}
+
+void sceneHandler29_manFromR() {
+ getCurrSceneSc2MotionController()->setEnabled();
+ getGameLoaderInteractionController()->enableFlag24();
+
+ chainQueue(QU_SC29_MANFROM_R, 1);
+
+ g_vars->scene29_arcadeIsOn = false;
+ g_vars->scene29_rideBackEnabled = false;
+}
+
+int sceneHandler29_updateScreenCallback() {
+ int res;
+
+ res = g_fp->drawArcadeOverlay(g_vars->scene29_arcadeIsOn);
+
+ if (!res)
+ g_fp->_updateScreenCallback = 0;
+
+ return res;
+}
+
+void sceneHandler29_manToL() {
+ getCurrSceneSc2MotionController()->clearEnabled();
+ getGameLoaderInteractionController()->disableFlag24();
+
+ chainQueue(QU_SC29_MANTO_L, 1);
+
+ g_vars->scene29_arcadeIsOn = true;
+
+ g_vars->scene29_mgm.addItem(g_fp->_aniMan->_id);
+
+ g_fp->_updateScreenCallback = sceneHandler29_updateScreenCallback;
+
+ g_fp->_msgY = -1;
+ g_fp->_msgX = -1;
+}
+
+void sceneHandler29_manToR() {
+ getCurrSceneSc2MotionController()->clearEnabled();
+ getGameLoaderInteractionController()->disableFlag24();
+
+ chainQueue(QU_SC29_MANTO_R, 1);
+
+ g_vars->scene29_manIsRiding = true;
+ g_fp->_msgY = -1;
+ g_fp->_msgX = -1;
+
+ g_vars->scene29_scrollingDisabled = false;
+
+ g_vars->scene29_scrollSpeed = g_fp->_scrollSpeed;
+ g_fp->_scrollSpeed = 4;
+}
+
+void sceneHandler29_clickPorter(ExCommand *cmd) {
+ if (!g_fp->_aniMan->isIdle() || g_fp->_aniMan->_flags & 0x100) {
+ cmd->_messageKind = 0;
+
+ return;
+ }
+
+ if (g_vars->scene29_manX <= g_vars->scene29_porter->_ox) {
+ if (ABS(351 - g_vars->scene29_manX) > 1 || ABS(443 - g_vars->scene29_manY) > 1
+ || g_fp->_aniMan->_movement || g_fp->_aniMan->_statics->_staticsId != ST_MAN_RIGHT) {
+ if (g_fp->_msgX != 351 || g_fp->_msgY != 443) {
+ MessageQueue *mq = getCurrSceneSc2MotionController()->method34(g_fp->_aniMan, 351, 443, 1, ST_MAN_RIGHT);
+
+ if (mq) {
+ mq->addExCommandToEnd(cmd->createClone());
+
+ postExCommand(g_fp->_aniMan->_id, 2, 351, 443, 0, -1);
+ }
+ }
+ } else {
+ sceneHandler29_manToL();
+ }
+ } else {
+ g_vars->scene29_manX = g_fp->_aniMan->_ox;
+ g_vars->scene29_manY = g_fp->_aniMan->_oy;
+
+ if (ABS(1582 - g_vars->scene29_manX) > 1 || ABS(445 - g_fp->_aniMan->_oy) > 1
+ || g_fp->_aniMan->_movement || g_fp->_aniMan->_statics->_staticsId != (0x4000 | ST_MAN_RIGHT)) {
+ if (g_fp->_msgX != 1582 || g_fp->_msgY != 445) {
+ MessageQueue *mq = getCurrSceneSc2MotionController()->method34(g_fp->_aniMan, 1582, 445, 1, (0x4000 | ST_MAN_RIGHT));
+
+ if (mq) {
+ mq->addExCommandToEnd(cmd->createClone());
+
+ postExCommand(g_fp->_aniMan->_id, 2, 1582, 445, 0, -1);
+ }
+ }
+ } else {
+ sceneHandler29_manToR();
+ }
+ }
+}
+
+void sceneHandler29_shootersProcess() {
+ if (g_fp->_aniMan->_statics->_staticsId == ST_MAN29_RUNR) {
+ if (g_vars->scene29_manX > 1436) {
+ sceneHandler29_manFromR();
+ } else {
+ g_vars->scene29_shootDistance = (1310 - g_vars->scene29_manX) * 5213 / 100000 + 25;
+
+ if (!g_vars->scene29_manIsHit)
+ g_fp->_aniMan->startAnim(MV_MAN29_RUN, 0, -1);
+ }
+ }
+
+ g_vars->scene29_manX = g_fp->_aniMan->_ox;
+ g_vars->scene29_manY = g_fp->_aniMan->_oy;
+}
+
+void sceneHandler29_shootersEscape() {
+ if (g_vars->scene29_arcadeIsOn) {
+ g_vars->scene29_manX += 2;
+
+ g_fp->_aniMan->setOXY(g_vars->scene29_manX, g_vars->scene29_manY);
+
+ if (g_vars->scene29_manX > 1310 && !g_vars->scene29_shooter1->_movement && !g_vars->scene29_shooter2->_movement
+ && g_vars->scene29_shooter1->_statics->_staticsId == ST_STR1_RIGHT) {
+ g_vars->scene29_shootCountdown = 0;
+
+ g_vars->scene29_shooter1->changeStatics2(ST_STR1_STAND);
+ g_vars->scene29_shooter2->changeStatics2(ST_STR2_STAND);
+
+ chainQueue(QU_SC29_ESCAPE, 1);
+
+ g_vars->scene29_ass->queueMessageQueue(0);
+ g_vars->scene29_ass->hide();
+
+ g_fp->setObjectState(sO_LeftPipe_29, g_fp->getObjectEnumState(sO_LeftPipe_29, sO_IsOpened));
+ }
+ } else if (g_vars->scene29_manIsRiding) {
+ g_vars->scene29_manX -= 4;
+
+ g_fp->_aniMan->setOXY(g_vars->scene29_manX, g_vars->scene29_manY);
+ }
+}
+
+void sceneHandler29_manRideBack() {
+ g_vars->scene29_manX -= 2;
+
+ g_fp->_aniMan->setOXY(g_vars->scene29_manX, g_vars->scene29_manY);
+}
+
+void sceneHandler29_shoot() {
+ if (g_vars->scene29_arcadeIsOn && g_vars->scene29_manX < 1310) {
+ if (g_fp->_rnd->getRandomNumber(1) || g_vars->scene29_shooter1->_movement || g_vars->scene29_shooter1->_statics->_staticsId != ST_STR1_RIGHT) {
+ if (!g_vars->scene29_shooter2->_movement && g_vars->scene29_shooter2->_statics->_staticsId == ST_STR2_RIGHT) {
+ if (g_vars->scene29_shooter2->_flags & 4) {
+ g_vars->scene29_shooter2->startAnim(MV_STR2_SHOOT, 0, -1);
+
+ g_vars->scene29_shootCountdown = 0;
+ }
+ }
+ } else {
+ g_vars->scene29_shooter1->startAnim(MV_STR1_SHOOT, 0, -1);
+
+ g_vars->scene29_shootCountdown = 0;
+ }
+ }
+}
+
+void sceneHandler29_animBearded() {
+ MessageQueue *mq;
+
+ for (uint i = 0; i < g_vars->scene29_bearders.size(); i++) {
+ StaticANIObject *ani = g_vars->scene29_bearders[i]->ani;
+
+ if (g_vars->scene29_bearders[i]->wbflag) {
+ int x = ani->_ox;
+ int y = ani->_oy;
+
+ if (!ani->_movement && ani->_statics->_staticsId == (ST_BRDCMN_RIGHT | 0x4000)) {
+ x -= 4;
+
+ if (x - g_vars->scene29_manX < 100 || !g_vars->scene29_arcadeIsOn) {
+ mq = new MessageQueue(g_fp->_currentScene->getMessageQueueById(QU_SC29_BRDOUT1), 0, 1);
+
+ mq->replaceKeyCode(-1, ani->_okeyCode);
+ mq->chain(0);
+
+ g_vars->scene29_bearders[i]->wbflag = 0;
+ g_vars->scene29_bearders[i]->wbcounter = 0;
+ }
+ }
+
+ if (!ani->_movement && ani->_statics->_staticsId == ST_BRDCMN_GOR)
+ ani->startAnim(MV_BRDCMN_GOR, 0, -1);
+
+ if (ani->_movement) {
+ if (ani->_movement->_id == MV_BRDCMN_GOR) {
+ x -= 4;
+
+ if (g_vars->scene29_manX - x < 60 || x - g_vars->scene29_manX < -260 || !g_vars->scene29_arcadeIsOn) {
+ ani->changeStatics2(ST_BRDCMN_RIGHT);
+
+ mq = new MessageQueue(g_fp->_currentScene->getMessageQueueById(QU_SC29_BRDOUT2), 0, 1);
+
+ mq->replaceKeyCode(-1, ani->_okeyCode);
+ mq->chain(0);
+
+ g_vars->scene29_bearders[i]->wbflag = 0;
+ g_vars->scene29_bearders[i]->wbcounter = 0;
+ }
+ }
+ }
+
+ ani->setOXY(x, y);
+ continue;
+ }
+
+ if (g_vars->scene29_arcadeIsOn && g_vars->scene29_bearders[i]->wbcounter > 30) {
+ int newx;
+
+ if (g_fp->_rnd->getRandomNumber(1))
+ goto dostuff;
+
+ if (g_vars->scene29_manX <= 700) {
+ g_vars->scene29_bearders[i]->wbcounter++;
+ continue;
+ }
+
+ if (g_vars->scene29_manX >= 1100) {
+ dostuff:
+ if (g_vars->scene29_manX <= 700 || g_vars->scene29_manX >= 1350) {
+ g_vars->scene29_bearders[i]->wbcounter++;
+ continue;
+ }
+
+ mq = new MessageQueue(g_fp->_currentScene->getMessageQueueById(QU_SC29_BRD2), 0, 1);
+
+ newx = g_vars->scene29_manX - 200;
+ } else {
+ mq = new MessageQueue(g_fp->_currentScene->getMessageQueueById(QU_SC29_BRD1), 0, 1);
+
+ newx = g_vars->scene29_manX + 350;
+ }
+
+ mq->getExCommandByIndex(0)->_x = newx;
+ mq->replaceKeyCode(-1, ani->_okeyCode);
+ mq->chain(0);
+
+ g_vars->scene29_bearders[i]->wbflag = 1;
+ g_vars->scene29_bearders[i]->wbcounter = 0;
+ }
+
+ g_vars->scene29_bearders[i]->wbcounter++;
+ }
+}
+
+
+
+int sceneHandler29(ExCommand *cmd) {
+ if (cmd->_messageKind != 17)
+ return 0;
+
+ switch (cmd->_messageNum) {
+ case MSG_CMN_WINARCADE:
+ sceneHandler29_winArcade();
+ break;
+
+ case MSG_SC29_LAUGH:
+ if (g_vars->scene29_hitBall == ANI_SHELL_GREEN) {
+ g_fp->playSound(SND_29_028, 0);
+ break;
+ }
+
+ g_fp->playSound(SND_29_029, 0);
+
+ break;
+
+ case MSG_SC29_SHOWLASTRED:
+ if (g_vars->scene29_redBalls.numBalls) { // original uses scene29_balls which looks like a copy/paste error
+ g_vars->scene29_redBalls.field_8->ani->show1(-1, -1, -1, 0);
+ g_vars->scene29_redBalls.field_8->ani->startAnim(MV_SHR_HITASS, 0, -1);
+ }
+
+ break;
+
+ case MSG_SC29_SHOOTGREEN:
+ sceneHandler29_shootGreen();
+ break;
+
+ case MSG_SC29_SHOOTRED:
+ sceneHandler29_shootRed();
+ break;
+
+ case MSG_SC29_SHOWLASTGREEN:
+ if (g_vars->scene29_balls.numBalls) {
+ g_vars->scene29_balls.field_8->ani->show1(-1, -1, -1, 0);
+ g_vars->scene29_balls.field_8->ani->startAnim(MV_SHG_HITASS, 0, -1);
+ }
+
+ break;
+
+ case MSG_SC29_STOPRIDE:
+ g_vars->scene29_manIsRiding = false;
+ g_vars->scene29_arcadeIsOn = false;
+ g_vars->scene29_reachedFarRight = false;
+ g_vars->scene29_rideBackEnabled = false;
+
+ getCurrSceneSc2MotionController()->setEnabled();
+ getGameLoaderInteractionController()->enableFlag24();
+ break;
+
+ case MSG_SC29_DISABLERIDEBACK:
+ g_vars->scene29_rideBackEnabled = false;
+ break;
+
+ case MSG_SC29_ENABLERIDEBACK:
+ g_vars->scene29_rideBackEnabled = true;
+ g_vars->scene29_reachedFarRight = false;
+ break;
+
+ case MSG_SC29_DISABLEPORTER:
+ g_vars->scene29_reachedFarRight = false;
+ break;
+
+ case MSG_SC29_ENABLEPORTER:
+ g_vars->scene29_reachedFarRight = true;
+ g_vars->scene29_rideBackEnabled = false;
+ g_vars->scene29_manIsHit = false;
+ break;
+
+ case 29:
+ if (!g_vars->scene29_manIsRiding || g_vars->scene29_arcadeIsOn) {
+ if (!g_vars->scene29_arcadeIsOn) {
+ StaticANIObject *ani = g_fp->_currentScene->getStaticANIObjectAtPos(g_fp->_sceneRect.left + cmd->_x, g_fp->_sceneRect.top + cmd->_y);
+
+ if (ani && ani == g_vars->scene29_porter) {
+ sceneHandler29_clickPorter(cmd);
+
+ cmd->_messageKind = 0;
+ break;
+ }
+ break;
+ }
+
+ sceneHandler29_manJump();
+
+ cmd->_messageKind = 0;
+ break;
+ }
+ break;
+
+ case 107:
+ if (g_vars->scene29_arcadeIsOn)
+ sceneHandler29_manBend();
+
+ break;
+
+ case 33:
+ if (g_vars->scene29_arcadeIsOn) {
+ if (g_vars->scene29_manX > g_fp->_sceneRect.right - 500)
+ g_fp->_currentScene->_x = g_fp->_sceneRect.right - g_vars->scene29_manX - 350;
+
+ if (g_vars->scene29_manX < g_fp->_sceneRect.left + 100)
+ g_fp->_currentScene->_x = g_vars->scene29_manX - g_fp->_sceneRect.left - 100;
+
+ } else if (g_fp->_aniMan2) {
+ int x = g_fp->_aniMan2->_ox;
+
+ if (x < g_fp->_sceneRect.left + 300)
+ g_fp->_currentScene->_x = x - 400 - g_fp->_sceneRect.left;
+
+ if (x > g_fp->_sceneRect.right - 300)
+ g_fp->_currentScene->_x = x + 400 - g_fp->_sceneRect.right;
+ }
+
+ g_vars->scene29_manX = g_fp->_aniMan->_ox;
+ g_vars->scene29_manY = g_fp->_aniMan->_oy;
+
+ sceneHandler29_ballHitCheck();
+
+ if (!g_vars->scene29_porter->_movement)
+ g_vars->scene29_porter->startAnim(MV_PTR_MOVEFAST, 0, -1);
+
+ if (g_vars->scene29_manIsRiding)
+ sceneHandler29_manFromL();
+ else if (g_vars->scene29_arcadeIsOn && !g_fp->_aniMan->_movement)
+ sceneHandler29_shootersProcess();
+
+ if (g_vars->scene29_reachedFarRight)
+ sceneHandler29_shootersEscape();
+ else if (g_vars->scene29_rideBackEnabled)
+ sceneHandler29_manRideBack();
+
+ g_vars->scene29_shootCountdown++;
+
+ if (g_vars->scene29_shootCountdown > g_vars->scene29_shootDistance)
+ sceneHandler29_shoot();
+
+ sceneHandler29_animBearded();
+
+ g_fp->_behaviorManager->updateBehaviors();
+ g_fp->startSceneTrack();
+
+ break;
+ }
+
+ return 0;
+}
+
+int scene29_updateCursor() {
+ g_fp->updateCursorCommon();
+
+ if (g_vars->scene29_arcadeIsOn) {
+ if (g_fp->_cursorId != PIC_CSR_DEFAULT_INV && g_fp->_cursorId != PIC_CSR_ITN_INV)
+ g_fp->_cursorId = -1;
+ } else if (g_vars->scene29_manIsRiding) {
+ if (g_fp->_cursorId != PIC_CSR_DEFAULT_INV && g_fp->_cursorId != PIC_CSR_ITN_INV)
+ g_fp->_cursorId = PIC_CSR_DEFAULT;
+ } else if (g_fp->_objectIdAtCursor == ANI_PORTER) {
+ if (g_fp->_cursorId == PIC_CSR_DEFAULT)
+ g_fp->_cursorId = PIC_CSR_ITN;
+ } else {
+ if (g_fp->_objectIdAtCursor == PIC_SC29_LTRUBA && g_fp->_cursorId == PIC_CSR_ITN)
+ g_fp->_cursorId = PIC_CSR_GOL;
+ }
+ return g_fp->_cursorId;
+}
+
+} // End of namespace Fullpipe
diff --git a/engines/fullpipe/scenes/scene30.cpp b/engines/fullpipe/scenes/scene30.cpp
new file mode 100644
index 0000000000..ca2324e647
--- /dev/null
+++ b/engines/fullpipe/scenes/scene30.cpp
@@ -0,0 +1,152 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public 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 "fullpipe/fullpipe.h"
+
+#include "fullpipe/objectnames.h"
+#include "fullpipe/constants.h"
+
+#include "fullpipe/gameloader.h"
+#include "fullpipe/motion.h"
+#include "fullpipe/scenes.h"
+#include "fullpipe/statics.h"
+
+#include "fullpipe/interaction.h"
+#include "fullpipe/behavior.h"
+
+
+namespace Fullpipe {
+
+void scene30_enablePass(Scene *sc) {
+ MovGraphLink *lnk = getSc2MctlCompoundBySceneId(sc->_sceneId)->getLinkByName(sO_WayToPipe);
+
+ if (g_fp->getObjectState(sO_Leg) == g_fp->getObjectEnumState(sO_Leg, sO_WithAll))
+ lnk->_flags &= 0xDFFFFFFF;
+ else
+ lnk->_flags |= 0x20000000;
+}
+
+void scene30_initScene(Scene *sc, int flag) {
+ Scene *oldsc = g_fp->_currentScene;
+
+ g_vars->scene30_leg = sc->getStaticANIObject1ById(ANI_LEG, -1);
+ g_fp->_currentScene = sc;
+
+ if (g_fp->getObjectState(sO_Leg) == g_fp->getObjectEnumState(sO_Leg, sO_ShowingHeel))
+ g_vars->scene30_leg->changeStatics2(ST_LEG_UP);
+ else if (g_fp->getObjectState(sO_Leg) == g_fp->getObjectEnumState(sO_Leg, sO_WithoutJugs))
+ g_vars->scene30_leg->changeStatics2(ST_LEG_DOWN);
+ else if (g_fp->getObjectState(sO_Leg) == g_fp->getObjectEnumState(sO_Leg, sO_WithBig))
+ g_vars->scene30_leg->changeStatics2(ST_LEG_DOWN1);
+ else if (g_fp->getObjectState(sO_Leg) == g_fp->getObjectEnumState(sO_Leg, sO_WithSmall))
+ g_vars->scene30_leg->changeStatics2(ST_LEG_DOWN2);
+ else if (g_fp->getObjectState(sO_Leg) == g_fp->getObjectEnumState(sO_Leg, sO_WithAll))
+ g_vars->scene30_leg->changeStatics2(ST_LEG_EMPTY);
+
+ g_fp->_currentScene = oldsc;
+
+ scene30_enablePass(sc);
+
+ if (flag == LiftUp || flag == LiftDown)
+ g_vars->scene30_liftFlag = 0;
+ else
+ g_vars->scene30_liftFlag = 1;
+
+ g_fp->lift_setButton(sO_Level8, ST_LBN_8N);
+
+ g_fp->lift_init(sc, QU_SC30_ENTERLIFT, QU_SC30_EXITLIFT);
+}
+
+int scene30_updateCursor() {
+ g_fp->updateCursorCommon();
+
+ if (g_fp->_cursorId == PIC_CSR_ITN && g_fp->_objectIdAtCursor == PIC_SC30_LTRUBA) {
+ g_fp->_cursorId = PIC_CSR_GOL;
+ }
+ return g_fp->_cursorId;
+}
+
+int sceneHandler30(ExCommand *cmd) {
+ if (cmd->_messageKind != 17)
+ return 0;
+
+ switch(cmd->_messageNum) {
+ case MSG_LIFT_CLOSEDOOR:
+ g_fp->lift_closedoorSeq();
+ break;
+
+ case MSG_LIFT_EXITLIFT:
+ g_fp->lift_exitSeq(cmd);
+ break;
+
+ case MSG_LIFT_STARTEXITQUEUE:
+ g_fp->lift_startExitQueue();
+ break;
+
+ case MSG_LIFT_CLICKBUTTON:
+ g_fp->lift_clickButton();
+ break;
+
+ case MSG_SC30_UPDATEPATH:
+ scene30_enablePass(g_fp->_currentScene);
+ break;
+
+ case 64:
+ g_fp->lift_hoverButton(cmd);
+ break;
+
+ case MSG_LIFT_GO:
+ g_fp->lift_goAnimation();
+ break;
+
+ case 29:
+ {
+ StaticANIObject *ani = g_fp->_currentScene->getStaticANIObjectAtPos(g_fp->_sceneRect.left + cmd->_x, g_fp->_sceneRect.top + cmd->_y);
+
+ if (ani && ani->_id == ANI_LIFTBUTTON) {
+ g_fp->lift_animateButton(ani);
+
+ cmd->_messageKind = 0;
+ }
+ break;
+ }
+
+ case 33:
+ if (g_fp->_aniMan2) {
+ int x = g_fp->_aniMan2->_ox;
+
+ if (x < g_fp->_sceneRect.left + 200)
+ g_fp->_currentScene->_x = x - 300 - g_fp->_sceneRect.left;
+
+ if (x > g_fp->_sceneRect.right - 200)
+ g_fp->_currentScene->_x = x + 300 - g_fp->_sceneRect.right;
+ }
+
+ g_fp->_behaviorManager->updateBehaviors();
+
+ break;
+ }
+
+ return 0;
+}
+
+} // End of namespace Fullpipe
diff --git a/engines/fullpipe/scenes/scene31.cpp b/engines/fullpipe/scenes/scene31.cpp
new file mode 100644
index 0000000000..3f507e62b7
--- /dev/null
+++ b/engines/fullpipe/scenes/scene31.cpp
@@ -0,0 +1,126 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public 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 "fullpipe/fullpipe.h"
+
+#include "fullpipe/objectnames.h"
+#include "fullpipe/constants.h"
+
+#include "fullpipe/gameloader.h"
+#include "fullpipe/motion.h"
+#include "fullpipe/scenes.h"
+#include "fullpipe/statics.h"
+
+#include "fullpipe/interaction.h"
+#include "fullpipe/behavior.h"
+
+
+namespace Fullpipe {
+
+void scene31_initScene(Scene *sc) {
+ g_vars->scene31_chantingCountdown = 0;
+ g_vars->scene31_cactus = sc->getStaticANIObject1ById(ANI_CACTUS_31, -1);
+
+ if (g_fp->getObjectState(sO_Cactus) == g_fp->getObjectEnumState(sO_Cactus, sO_HasGrown)) {
+ Scene *oldsc = g_fp->_currentScene;
+ g_fp->_currentScene = sc;
+
+ g_vars->scene31_cactus->changeStatics2(ST_CTS31_GROWN2);
+ g_vars->scene31_cactus->_priority = 22;
+
+ g_fp->_currentScene = oldsc;
+ } else {
+ g_vars->scene31_cactus->hide();
+ }
+
+ g_vars->scene31_plusMinus = sc->getStaticANIObject1ById(ANI_PLUSMINUS, -1);
+
+ if (g_fp->getObjectState(sO_Guard_3) == g_fp->getObjectEnumState(sO_Guard_3, sO_Off))
+ g_vars->scene31_plusMinus->_statics = g_vars->scene31_plusMinus->getStaticsById(ST_PMS_MINUS);
+ else
+ g_vars->scene31_plusMinus->_statics = g_vars->scene31_plusMinus->getStaticsById(ST_PMS_PLUS);
+}
+
+void sceneHandler31_testCactus(ExCommand *cmd) {
+ if ((g_vars->scene31_cactus->_flags & 4) && g_vars->scene31_cactus->_statics->_staticsId == ST_CTS31_GROWN2) {
+ MessageQueue *mq = g_fp->_globalMessageQueueList->getMessageQueueById(cmd->_parId);
+
+ if (mq) {
+ mq->getExCommandByIndex(0)->_messageKind = 0;
+ mq->getExCommandByIndex(0)->_excFlags |= 1;
+
+ mq->getExCommandByIndex(1)->_messageKind = 0;
+ mq->getExCommandByIndex(1)->_excFlags |= 1;
+ }
+ }
+}
+
+int sceneHandler31(ExCommand *cmd) {
+ if (cmd->_messageKind != 17)
+ return 0;
+
+ switch (cmd->_messageNum) {
+ case MSG_SC31_TESTCACTUS:
+ sceneHandler31_testCactus(cmd);
+ break;
+
+ case MSG_SC15_STOPCHANTING:
+ g_fp->stopAllSoundInstances(SND_31_001);
+
+ g_vars->scene31_chantingCountdown = 120;
+ break;
+
+ case MSG_SC31_PULL:
+ if ( g_vars->scene31_plusMinus->_statics->_staticsId == ST_PMS_MINUS)
+ g_vars->scene31_plusMinus->_statics = g_vars->scene31_plusMinus->getStaticsById(ST_PMS_PLUS);
+ else
+ g_vars->scene31_plusMinus->_statics = g_vars->scene31_plusMinus->getStaticsById(ST_PMS_MINUS);
+
+ break;
+
+ case 33:
+ if (g_fp->_aniMan2) {
+ int x = g_fp->_aniMan2->_ox;
+
+ if (x < g_fp->_sceneRect.left + 200)
+ g_fp->_currentScene->_x = x - 300 - g_fp->_sceneRect.left;
+
+ if (x > g_fp->_sceneRect.right - 200)
+ g_fp->_currentScene->_x = x + 300 - g_fp->_sceneRect.right;
+ }
+
+ if (g_vars->scene31_chantingCountdown > 0) {
+ --g_vars->scene31_chantingCountdown;
+
+ if (!g_vars->scene31_chantingCountdown)
+ g_fp->playSound(SND_31_001, 1);
+ }
+
+ g_fp->_behaviorManager->updateBehaviors();
+
+ break;
+ }
+
+ return 0;
+}
+
+} // End of namespace Fullpipe
diff --git a/engines/fullpipe/scenes/scene32.cpp b/engines/fullpipe/scenes/scene32.cpp
new file mode 100644
index 0000000000..9279db7513
--- /dev/null
+++ b/engines/fullpipe/scenes/scene32.cpp
@@ -0,0 +1,431 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public 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 "fullpipe/fullpipe.h"
+
+#include "fullpipe/objectnames.h"
+#include "fullpipe/constants.h"
+
+#include "fullpipe/gameloader.h"
+#include "fullpipe/motion.h"
+#include "fullpipe/scenes.h"
+#include "fullpipe/statics.h"
+
+#include "fullpipe/interaction.h"
+#include "fullpipe/behavior.h"
+
+
+namespace Fullpipe {
+
+void scene32_initScene(Scene *sc) {
+ g_vars->scene32_flagIsWaving = false;
+ g_vars->scene32_flagNeedsStopping = false;
+ g_vars->scene32_dudeIsSitting = false;
+ g_vars->scene32_cactusCounter = -1;
+ g_vars->scene32_dudeOnLadder = false;
+ g_vars->scene32_cactusIsGrowing = false;
+ g_vars->scene32_flag = sc->getStaticANIObject1ById(ANI_FLAG, -1);
+ g_vars->scene32_cactus = sc->getStaticANIObject1ById(ANI_CACTUS, -1);
+ g_vars->scene32_massOrange = sc->getStaticANIObject1ById(ANI_TESTO_ORANGE, -1);
+ g_vars->scene32_massBlue = sc->getStaticANIObject1ById(ANI_TESTO_BLUE, -1);
+ g_vars->scene32_massGreen = sc->getStaticANIObject1ById(ANI_TESTO_GREEN, -1);
+ g_vars->scene32_button = sc->getStaticANIObject1ById(ANI_BUTTON_32, -1);
+
+ g_vars->scene32_massOrange->startAnim(MV_TSTO_FLOW, 0, -1);
+ g_vars->scene32_massOrange->_movement->setDynamicPhaseIndex(15);
+
+ g_vars->scene32_massGreen->startAnim(MV_TSTG_FLOW, 0, -1);
+ g_vars->scene32_massGreen->_movement->setDynamicPhaseIndex(26);
+
+ Scene *oldsc = g_fp->_currentScene;
+ StaticANIObject *ani;
+
+ if (g_fp->getObjectState(sO_ClockHandle) == g_fp->getObjectEnumState(sO_ClockHandle, sO_In_32_Lies)) {
+ ani = sc->getStaticANIObject1ById(ANI_INV_HANDLE, -1);
+ if (ani) {
+ g_fp->_currentScene = sc;
+
+ ani->changeStatics2(ST_HDL_LAID);
+ }
+ } else {
+ if (g_fp->getObjectState(sO_ClockHandle) == g_fp->getObjectEnumState(sO_ClockHandle, sO_In_32_Sticks)) {
+ ani = sc->getStaticANIObject1ById(ANI_INV_HANDLE, -1);
+
+ g_fp->_currentScene = sc;
+
+ if (ani)
+ ani->changeStatics2(ST_HDL_PLUGGED);
+
+ g_vars->scene32_button->changeStatics2(ST_BTN32_ON);
+ }
+ }
+
+ g_fp->_currentScene = oldsc;
+
+ if (g_fp->getObjectState(sO_Cube) == g_fp->getObjectEnumState(sO_Cube, sO_In_32)) {
+ MessageQueue *mq = new MessageQueue(sc->getMessageQueueById(QU_KBK32_START), 0, 0);
+
+ mq->sendNextCommand();
+ }
+
+ g_fp->lift_setButton(sO_Level9, ST_LBN_9N);
+ g_fp->lift_init(sc, QU_SC32_ENTERLIFT, QU_SC32_EXITLIFT);
+
+ g_fp->initArcadeKeys("SC_32");
+}
+
+void scene32_setupMusic() {
+ if (g_fp->lift_checkButton(sO_Level6))
+ g_fp->playTrack(g_fp->getGameLoaderGameVar()->getSubVarByName("SC_32"), "MUSIC2", 1);
+}
+
+int scene32_updateCursor() {
+ g_fp->updateCursorCommon();
+
+ if (g_fp->_objectIdAtCursor == PIC_SC32_LADDER && g_fp->_cursorId == PIC_CSR_ITN)
+ g_fp->_cursorId = g_vars->scene32_dudeOnLadder ? PIC_CSR_GOD : PIC_CSR_GOU; // TODO FIXME doublecheck
+
+ return g_fp->_cursorId;
+}
+
+void sceneHandler32_tryCube() {
+ if (g_fp->getObjectState(sO_Cube) == g_fp->getObjectEnumState(sO_Cube, sO_In_33))
+ chainQueue(QU_KBK32_GO, 0);
+}
+
+void sceneHandler32_startCactus() {
+ g_vars->scene32_cactusCounter = 48;
+ g_vars->scene32_cactusIsGrowing = false;
+}
+
+void sceneHandler32_spin(ExCommand *cmd) {
+ MessageQueue *mq = g_fp->_globalMessageQueueList->getMessageQueueById(cmd->_parId);
+
+ if (!mq || mq->getCount() == 0)
+ return;
+
+ ExCommand *ex = mq->getExCommandByIndex(0);
+ ExCommand *newex;
+
+ if ((g_vars->scene32_cactus->_movement && g_vars->scene32_cactus->_movement->_id == MV_CTS_DEFAULT)
+ || g_vars->scene32_cactus->_statics->_staticsId == ST_CTS_GROWUP) {
+ for (int i = 0; i < 12; i++) {
+ newex = ex->createClone();
+ newex->_excFlags |= 2;
+ mq->insertExCommandAt(1, newex);
+ }
+
+ g_vars->scene32_cactus->changeStatics2(ST_CTS_GROWUP);
+
+ chainQueue(QU_CTS_BACK, 1);
+
+ g_vars->scene32_cactusIsGrowing = false;
+
+ return;
+ }
+
+ if (g_vars->scene32_cactus->_statics->_staticsId == ST_CTS_EMPTY && g_vars->scene32_cactusCounter < 0) {
+ for (int i = 0; i < 2; i++) {
+ newex = ex->createClone();
+ newex->_excFlags |= 2;
+ mq->insertExCommandAt(1, newex);
+ }
+
+ chainQueue(QU_KDK_DRIZZLE, 0);
+ }
+}
+
+void sceneHandler32_startFlagLeft() {
+ g_vars->scene32_flag->changeStatics2(ST_FLG_NORM);
+ g_vars->scene32_flag->startAnim(MV_FLG_STARTL, 0, -1);
+
+ g_vars->scene32_flagIsWaving = true;
+}
+
+void sceneHandler32_startFlagRight() {
+ g_vars->scene32_flag->changeStatics2(ST_FLG_NORM);
+ g_vars->scene32_flag->startAnim(MV_FLG_STARTR, 0, -1);
+
+ g_vars->scene32_flagIsWaving = true;
+}
+
+void sceneHandler32_trySit(ExCommand *cmd) {
+ MessageQueue *mq = g_fp->_globalMessageQueueList->getMessageQueueById(cmd->_parId);
+
+ if (!mq || mq->getCount() == 0)
+ return;
+
+ ExCommand *ex = mq->getExCommandByIndex(0);
+
+ if (g_vars->scene32_cactusIsGrowing || g_vars->scene32_cactus->_movement
+ || g_vars->scene32_cactus->_statics->_staticsId != ST_CTS_EMPTY
+ || (g_vars->scene32_cactusCounter >= 0 && g_vars->scene32_cactusCounter <= 20)) {
+ ex->_messageKind = 0;
+ ex->_excFlags |= 1;
+ } else {
+ ex->_parentId = ANI_MAN;
+ ex->_messageKind = 1;
+ ex->_messageNum = MV_MAN32_SITDOWN;
+ ex->_keyCode = g_fp->_aniMan->_okeyCode;
+
+ g_vars->scene32_dudeIsSitting = true;
+
+ getCurrSceneSc2MotionController()->clearEnabled();
+ getGameLoaderInteractionController()->disableFlag24();
+ }
+}
+
+void sceneHandler32_buttonPush() {
+ if (g_fp->getObjectState(sO_ClockHandle) == g_fp->getObjectEnumState(sO_ClockHandle, sO_In_32_Sticks)) {
+ StaticANIObject *ani = g_fp->_currentScene->getStaticANIObject1ById(ANI_INV_HANDLE, -1);
+ if (ani)
+ ani->changeStatics2(ST_HDL_PLUGGED);
+
+ chainQueue(QU_SC32_FALLHANDLE, 1);
+
+ g_vars->scene32_button->changeStatics2(ST_BTN32_OFF);
+ }
+}
+
+void sceneHandler32_installHandle() {
+ chainQueue(QU_SC32_SHOWHANDLE, 0);
+
+ g_vars->scene32_button->changeStatics2(ST_BTN32_ON);
+}
+
+void sceneHandler32_animateCactus() {
+ if (g_fp->_aniMan->_statics->_staticsId != ST_MAN32_SIT)
+ chainQueue(QU_CTS_GROW, 1);
+ else
+ chainQueue(QU_CTS_GROWMAN, 1);
+
+ g_vars->scene32_cactusCounter = -1;
+ g_vars->scene32_cactusIsGrowing = true;
+}
+
+void sceneHandler32_ladderLogic(ExCommand *cmd) {
+ MessageQueue *mq = new MessageQueue(g_fp->_currentScene->getMessageQueueById(QU_SC32_FROMLADDER), 0, 0);
+
+ if (g_fp->_currentScene->getPictureObjectIdAtPos(cmd->_sceneClickX, cmd->_sceneClickY) != PIC_SC32_LADDER)
+ mq->addExCommandToEnd(cmd->createClone());
+
+ mq->setFlags(mq->getFlags() | 1);
+
+ g_fp->_aniMan->changeStatics2(ST_MAN_STANDLADDER);
+ if (!mq->chain(g_fp->_aniMan))
+ delete mq;
+
+ g_vars->scene32_dudeOnLadder = false;
+
+ getCurrSceneSc2MotionController()->setEnabled();
+ getGameLoaderInteractionController()->enableFlag24();
+}
+
+void sceneHandler32_potLogic(ExCommand *cmd) {
+ if (g_vars->scene32_cactusCounter < 0 || g_vars->scene32_cactusCounter > 20) {
+ MessageQueue *mq = new MessageQueue(g_fp->_globalMessageQueueList->compact());
+
+ ExCommand *ex = new ExCommand(ANI_MAN, 1, MV_MAN32_STANDUP, 0, 0, 0, 1, 0, 0, 0);
+
+ ex->_excFlags |= 2;
+
+ mq->addExCommandToEnd(ex);
+
+ StaticANIObject *ani = g_fp->_currentScene->getStaticANIObjectAtPos(cmd->_sceneClickX, cmd->_sceneClickY);
+
+ if (!ani || ani->_id != ANI_KADKA)
+ mq->addExCommandToEnd(cmd->createClone());
+
+ mq->setFlags(mq->getFlags() | 1);
+ mq->chain(0);
+
+ getCurrSceneSc2MotionController()->setEnabled();
+ getGameLoaderInteractionController()->enableFlag24();
+
+ g_vars->scene32_dudeIsSitting = false;
+ }
+}
+
+int sceneHandler32(ExCommand *cmd) {
+ if (cmd->_messageKind != 17)
+ return 0;
+
+ switch (cmd->_messageNum) {
+ case MSG_LIFT_CLOSEDOOR:
+ g_fp->lift_closedoorSeq();
+ break;
+
+ case MSG_LIFT_EXITLIFT:
+ g_fp->lift_exitSeq(cmd);
+ break;
+
+ case MSG_LIFT_STARTEXITQUEUE:
+ g_fp->lift_startExitQueue();
+ break;
+
+ case MSG_SC32_TRUBATOBACK:
+ g_fp->_currentScene->getPictureObjectById(PIC_SC32_RTRUBA, 0)->_priority = 20;
+ break;
+
+ case MSG_SC32_TRUBATOFRONT:
+ g_fp->_currentScene->getPictureObjectById(PIC_SC32_RTRUBA, 0)->_priority = 0;
+ break;
+
+ case MSG_LIFT_CLICKBUTTON:
+ g_fp->lift_clickButton();
+ break;
+
+ case MSG_SC33_TRYKUBIK:
+ sceneHandler32_tryCube();
+ break;
+
+ case MSG_SC32_STARTCACTUS:
+ sceneHandler32_startCactus();
+ break;
+
+ case MSG_SC32_STOPFLAG:
+ g_vars->scene32_flagIsWaving = false;
+ g_vars->scene32_flagNeedsStopping = true;
+ break;
+
+ case MSG_SC32_SPIN:
+ sceneHandler32_spin(cmd);
+ break;
+
+ case MSG_SC32_STARTFLAGLEFT :
+ sceneHandler32_startFlagLeft();
+ break;
+
+ case MSG_SC32_STARTFLAGRIGHT:
+ sceneHandler32_startFlagRight();
+ break;
+
+ case MSG_SC32_TRYSIT:
+ sceneHandler32_trySit(cmd);
+ break;
+
+ case MSG_LIFT_GO:
+ g_fp->lift_goAnimation();
+ break;
+
+ case MSG_SC32_ONLADDER:
+ g_vars->scene32_dudeOnLadder = true;
+
+ getCurrSceneSc2MotionController()->clearEnabled();
+ getGameLoaderInteractionController()->disableFlag24();
+ break;
+
+ case MSG_SC6_BTNPUSH:
+ sceneHandler32_buttonPush();
+ break;
+
+ case 64:
+ g_fp->lift_hoverButton(cmd);
+ break;
+
+ case MSG_SC6_INSTHANDLE:
+ sceneHandler32_installHandle();
+ break;
+
+ case 33:
+ if (g_fp->_aniMan2) {
+ int x = g_fp->_aniMan2->_ox;
+
+ if (x < g_fp->_sceneRect.left + 200)
+ g_fp->_currentScene->_x = x - 300 - g_fp->_sceneRect.left;
+
+ if (x > g_fp->_sceneRect.right - 200)
+ g_fp->_currentScene->_x = x + 300 - g_fp->_sceneRect.right;
+ }
+
+ if (!g_vars->scene32_flag->_movement) {
+ if (g_vars->scene32_flagIsWaving) {
+ if (g_vars->scene32_flag->_statics->_staticsId == ST_FLG_RIGHT)
+ g_vars->scene32_flag->startAnim(MV_FLG_CYCLER, 0, -1);
+ else if (g_vars->scene32_flag->_statics->_staticsId == ST_FLG_LEFT)
+ g_vars->scene32_flag->startAnim(MV_FLG_CYCLEL, 0, -1);
+ }
+
+ if (g_vars->scene32_flagNeedsStopping && !g_vars->scene32_flagIsWaving) {
+ if (g_vars->scene32_flag->_statics->_staticsId == ST_FLG_RIGHT)
+ g_vars->scene32_flag->startAnim(MV_FLG_STOPR, 0, -1);
+ else if (g_vars->scene32_flag->_statics->_staticsId == ST_FLG_LEFT)
+ g_vars->scene32_flag->startAnim(MV_FLG_STOPL, 0, -1);
+
+ g_vars->scene32_flagNeedsStopping = false;
+ }
+ }
+
+ if (g_vars->scene32_cactusCounter) {
+ if (g_vars->scene32_cactusCounter > 0)
+ --g_vars->scene32_cactusCounter;
+
+ g_fp->_behaviorManager->updateBehaviors();
+
+ g_fp->startSceneTrack();
+ } else {
+ sceneHandler32_animateCactus();
+
+ g_fp->_behaviorManager->updateBehaviors();
+
+ g_fp->startSceneTrack();
+
+ }
+ break;
+
+ case 29:
+ if (g_vars->scene32_dudeOnLadder) {
+ sceneHandler32_ladderLogic(cmd);
+ cmd->_messageKind = 0;
+ break;
+ }
+
+ if (!g_vars->scene32_dudeIsSitting || g_fp->_aniMan->_movement) {
+ StaticANIObject *ani = g_fp->_currentScene->getStaticANIObjectAtPos(cmd->_sceneClickX, cmd->_sceneClickY);
+
+ if (ani && ani->_id == ANI_LIFTBUTTON) {
+ g_fp->lift_animateButton(ani);
+
+ cmd->_messageKind = 0;
+ break;
+ }
+
+ if (g_fp->_cursorId == PIC_CSR_GOFAR_R || g_fp->_cursorId == PIC_CSR_GOFAR_L) {
+ if ((g_fp->_sceneRect.right - cmd->_sceneClickX < 47 && g_fp->_sceneRect.right < g_fp->_sceneWidth - 1)
+ || (cmd->_sceneClickX - g_fp->_sceneRect.left < 47 && g_fp->_sceneRect.left > 0))
+ g_fp->processArcade(cmd);
+ }
+ break;
+ }
+
+ if (!g_vars->scene32_cactusIsGrowing)
+ sceneHandler32_potLogic(cmd);
+
+ cmd->_messageKind = 0;
+
+ break;
+ }
+
+ return 0;
+}
+
+} // End of namespace Fullpipe
diff --git a/engines/fullpipe/scenes/scene33.cpp b/engines/fullpipe/scenes/scene33.cpp
new file mode 100644
index 0000000000..90ea0a4f3f
--- /dev/null
+++ b/engines/fullpipe/scenes/scene33.cpp
@@ -0,0 +1,314 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public 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 "fullpipe/fullpipe.h"
+
+#include "fullpipe/objectnames.h"
+#include "fullpipe/constants.h"
+
+#include "fullpipe/gameloader.h"
+#include "fullpipe/motion.h"
+#include "fullpipe/scenes.h"
+#include "fullpipe/statics.h"
+
+#include "fullpipe/interaction.h"
+#include "fullpipe/behavior.h"
+
+
+namespace Fullpipe {
+
+const int ventsInit[9] = { 0, 0, 1, 0, 0, 1, 0, 0, 1 };
+
+void scene33_initScene(Scene *sc) {
+ g_vars->scene33_mug = sc->getStaticANIObject1ById(ANI_MUG_33, -1);
+ g_vars->scene33_jettie = sc->getStaticANIObject1ById(ANI_JETTIE_FLOW, -1);
+ g_vars->scene33_cube = 0;
+ g_vars->scene33_cubeX = -1;
+ g_vars->scene33_handleIsDown = false;
+
+ if (g_fp->getObjectState(sO_Cube) == g_fp->getObjectEnumState(sO_Cube, sO_In_33)) {
+ MessageQueue *mq = new MessageQueue(sc->getMessageQueueById(QU_KBK33_START), 0, 0);
+
+ mq->sendNextCommand();
+ }
+
+
+ for (int i = 0; i < 9; i++) {
+ g_vars->scene33_ventsX[i] = sc->getStaticANIObject1ById(ANI_VENT_33, i)->_ox;
+
+ g_vars->scene33_ventsState[i] = ventsInit[i];
+ }
+
+ g_fp->initArcadeKeys("SC_33");
+}
+
+void scene33_setupMusic() {
+ if (g_fp->lift_checkButton(sO_Level6))
+ g_fp->playTrack(g_fp->getGameLoaderGameVar()->getSubVarByName("SC_33"), "MUSIC2", 1);
+}
+
+int scene33_updateCursor() {
+ g_fp->updateCursorCommon();
+
+ if (g_fp->_objectIdAtCursor == PIC_SC33_ZONES && g_fp->_cursorId == PIC_CSR_DEFAULT)
+ g_fp->_cursorId = PIC_CSR_ITN;
+
+ return g_fp->_cursorId;
+}
+
+void sceneHandler33_processJettie(ExCommand *cmd) {
+ MessageQueue *mq = g_fp->_globalMessageQueueList->getMessageQueueById(cmd->_parId);
+
+ if (mq && g_vars->scene33_jettie->_movement) {
+ ExCommand *ex = mq->getExCommandByIndex(0);
+
+ if (ex) {
+ ex->_messageKind = 0;
+ ex->_excFlags |= 1;
+ }
+
+ ex = mq->getExCommandByIndex(1);
+
+ if (ex) {
+ ex->_messageKind = 0;
+ ex->_excFlags |= 1;
+ }
+ }
+}
+
+void sceneHandler33_switchVent(StaticANIObject *ani) {
+ int mv = 0;
+
+ if (ani->_statics->_staticsId == ST_VNT33_DOWN)
+ mv = MV_VNT33_TURNR;
+
+ if (ani->_statics->_staticsId == ST_VNT33_RIGHT)
+ mv = MV_VNT33_TURND;
+
+ if (mv)
+ ani->startAnim(mv, 0, -1);
+
+ g_vars->scene33_ventsState[ani->_okeyCode] = !g_vars->scene33_ventsState[ani->_okeyCode];
+}
+
+void sceneHandler33_processVents() {
+ for (int i = 0; i < 9; i++)
+ if (((g_vars->scene33_cubeX < g_vars->scene33_ventsX[i]) != (g_vars->scene33_cube->_ox < g_vars->scene33_ventsX[i]))
+ && g_vars->scene33_ventsState[i] != ventsInit[i])
+ sceneHandler33_switchVent(g_fp->_currentScene->getStaticANIObject1ById(ANI_VENT_33, i));
+
+ g_vars->scene33_cubeX = g_vars->scene33_cube->_ox;
+}
+
+void sceneHandler33_tryCube() {
+ if (g_fp->getObjectState(sO_Cube) == g_fp->getObjectEnumState(sO_Cube, sO_In_32))
+ chainQueue(QU_KBK33_GO, 0);
+}
+
+void sceneHandler33_pour() {
+ bool solved = true;
+
+ for (int i = 0; i < 9; i++)
+ if (g_vars->scene33_ventsState[i] != ventsInit[i])
+ solved = false;
+
+ if (solved) {
+ if ((g_vars->scene33_mug->_flags & 4) && g_vars->scene33_mug->_statics->_staticsId == ST_MUG33_EMPTY) {
+ g_vars->scene33_jettie->startAnim(MV_JTI33_POUR, 0, -1);
+
+ g_vars->scene33_handleIsDown = false;
+
+ return;
+ }
+
+ if ((g_vars->scene33_mug->_flags & 4) && g_vars->scene33_mug->_statics->_staticsId == ST_MUG33_FULL) {
+ g_vars->scene33_jettie->startAnim(MV_JTI33_POURFULL, 0, -1);
+
+ g_vars->scene33_handleIsDown = false;
+
+ return;
+ }
+
+ g_vars->scene33_jettie->startAnim(MV_JTI33_FLOW, 0, -1);
+ }
+
+ g_vars->scene33_handleIsDown = false;
+}
+
+void sceneHandler33_handleDown() {
+ if (!g_vars->scene33_handleIsDown && !g_vars->scene33_jettie->_movement && !g_vars->scene33_jettie->getMessageQueue() ) {
+ chainQueue(QU_SC33_STARTWATER, 0);
+
+ g_vars->scene33_handleIsDown = true;
+ }
+}
+
+void sceneHandler33_zoneClickProcess(StaticANIObject *ani) {
+ if (!ani->_movement) {
+ sceneHandler33_switchVent(ani);
+
+ StaticANIObject *vent1 = 0;
+ StaticANIObject *vent2 = 0;
+
+ switch (ani->_okeyCode) {
+ case 0:
+ vent1 = g_fp->_currentScene->getStaticANIObject1ById(ANI_VENT_33, 2);
+ vent2 = g_fp->_currentScene->getStaticANIObject1ById(ANI_VENT_33, 3);
+ break;
+
+ case 1:
+ vent1 = g_fp->_currentScene->getStaticANIObject1ById(ANI_VENT_33, 3);
+ vent2 = g_fp->_currentScene->getStaticANIObject1ById(ANI_VENT_33, 4);
+ break;
+
+ case 2:
+ vent1 = g_fp->_currentScene->getStaticANIObject1ById(ANI_VENT_33, 4);
+ vent2 = g_fp->_currentScene->getStaticANIObject1ById(ANI_VENT_33, 0);
+ break;
+
+ case 3:
+ vent1 = g_fp->_currentScene->getStaticANIObject1ById(ANI_VENT_33, 0);
+ vent2 = g_fp->_currentScene->getStaticANIObject1ById(ANI_VENT_33, 1);
+ break;
+
+ case 4:
+ vent1 = g_fp->_currentScene->getStaticANIObject1ById(ANI_VENT_33, 1);
+ vent2 = g_fp->_currentScene->getStaticANIObject1ById(ANI_VENT_33, 2);
+ break;
+
+ default:
+ return;
+ }
+
+ if (vent1) {
+ sceneHandler33_switchVent(vent1);
+ sceneHandler33_switchVent(vent2);
+ }
+ }
+}
+
+void sceneHandler33_clickZones(ExCommand *cmd) {
+ StaticANIObject *closest = 0;
+ double mindist = 1e10;
+
+ for (uint i = 0; i < g_fp->_currentScene->_staticANIObjectList1.size(); i++) {
+ StaticANIObject *ani = (StaticANIObject *)g_fp->_currentScene->_staticANIObjectList1[i];
+
+ if (ani->_id == ANI_VENT_33) {
+ int dx = ani->_ox - cmd->_sceneClickX;
+ int dy = ani->_oy - cmd->_sceneClickY;
+ double dist = sqrt((double)(dx * dx + dy * dy));
+
+ if (dist < mindist) {
+ mindist = dist;
+ closest = ani;
+ }
+ }
+ }
+
+ if (closest)
+ sceneHandler33_zoneClickProcess(closest);
+}
+
+int sceneHandler33(ExCommand *cmd) {
+ if (cmd->_messageKind != 17)
+ return 0;
+
+ switch (cmd->_messageNum) {
+ case MSG_SC32_TRUBATOFRONT:
+ g_fp->_currentScene->getPictureObjectById(PIC_SC33_LTRUBA, 0)->_priority = 0;
+ break;
+
+ case MSG_SC32_TRUBATOBACK:
+ g_fp->_currentScene->getPictureObjectById(PIC_SC33_LTRUBA, 0)->_priority = 20;
+ break;
+
+ case MSG_SC33_TESTMUG:
+ sceneHandler33_processJettie(cmd);
+ break;
+
+ case MSG_SC33_UPDATEKUBIK:
+ g_vars->scene33_cube = g_fp->_currentScene->getStaticANIObject1ById(ANI_KUBIK, -1);
+
+ if (g_vars->scene33_cube)
+ g_vars->scene33_cubeX = g_vars->scene33_cube->_ox;
+
+ break;
+
+ case MSG_SC33_TRYKUBIK:
+ sceneHandler33_tryCube();
+ break;
+
+ case MSG_SC33_POUR:
+ sceneHandler33_pour();
+ break;
+
+ case MSG_SC33_HANDLEDOWN:
+ sceneHandler33_handleDown();
+ break;
+
+ case 29:
+ {
+ StaticANIObject *ani = g_fp->_currentScene->getStaticANIObjectAtPos(g_fp->_sceneRect.left + cmd->_x, g_fp->_sceneRect.top + cmd->_y);
+
+ if (!ani || !canInteractAny(g_fp->_aniMan, ani, cmd->_keyCode)) {
+ int picId = g_fp->_currentScene->getPictureObjectIdAtPos(cmd->_sceneClickX, cmd->_sceneClickY);
+ PictureObject *pic = g_fp->_currentScene->getPictureObjectById(picId, 0);
+
+ if (pic && pic->_id == PIC_SC33_ZONES) {
+ sceneHandler33_clickZones(cmd);
+ break;
+ }
+
+ if (!pic || !canInteractAny(g_fp->_aniMan, pic, cmd->_keyCode)) {
+ if ((g_fp->_sceneRect.right - cmd->_sceneClickX < 47 && g_fp->_sceneRect.right < g_fp->_sceneWidth - 1) || (cmd->_sceneClickX - g_fp->_sceneRect.left < 47 && g_fp->_sceneRect.left > 0))
+ g_fp->processArcade(cmd);
+ }
+ }
+ break;
+ }
+
+ case 33:
+ if (g_fp->_aniMan2) {
+ int x = g_fp->_aniMan2->_ox;
+
+ if (x < g_fp->_sceneRect.left + 200)
+ g_fp->_currentScene->_x = x - 300 - g_fp->_sceneRect.left;
+
+ if (x > g_fp->_sceneRect.right - 200)
+ g_fp->_currentScene->_x = x + 300 - g_fp->_sceneRect.right;
+ }
+
+ if (g_vars->scene33_cube)
+ sceneHandler33_processVents();
+
+ g_fp->_behaviorManager->updateBehaviors();
+
+ g_fp->startSceneTrack();
+
+ break;
+ }
+
+ return 0;
+}
+
+} // End of namespace Fullpipe
diff --git a/engines/fullpipe/scenes/scene34.cpp b/engines/fullpipe/scenes/scene34.cpp
new file mode 100644
index 0000000000..1c8c8b4855
--- /dev/null
+++ b/engines/fullpipe/scenes/scene34.cpp
@@ -0,0 +1,479 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public 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 "fullpipe/fullpipe.h"
+
+#include "fullpipe/objectnames.h"
+#include "fullpipe/constants.h"
+
+#include "fullpipe/gameloader.h"
+#include "fullpipe/motion.h"
+#include "fullpipe/scenes.h"
+#include "fullpipe/statics.h"
+
+#include "fullpipe/interaction.h"
+#include "fullpipe/behavior.h"
+#include "fullpipe/floaters.h"
+
+namespace Fullpipe {
+
+void sceneHandler34_setExits() {
+ int state;
+
+ if (g_fp->getObjectState(sO_Grandma) == g_fp->getObjectEnumState(sO_Grandma, sO_NearPipeWithStool)) {
+ if (g_fp->getObjectState(sO_Hatch_34) == g_fp->getObjectEnumState(sO_Hatch_34, sO_Closed))
+ state = g_fp->getObjectEnumState(sO_Plank_34, sO_ClosedWithBoot);
+ else
+ state = g_fp->getObjectEnumState(sO_Plank_34, sO_OpenedWithBoot);
+ } else {
+ if (g_fp->getObjectState(sO_Grandma) == g_fp->getObjectEnumState(sO_Grandma, sO_OnStool)) {
+ if (g_fp->getObjectState(sO_Hatch_34) == g_fp->getObjectEnumState(sO_Hatch_34, sO_Closed))
+ state = g_fp->getObjectEnumState(sO_Plank_34, sO_IsClosed);
+ else
+ state = g_fp->getObjectEnumState(sO_Plank_34, sO_IsOpened);
+ } else {
+ state = g_fp->getObjectEnumState(sO_Plank_34, sO_Passive);
+ }
+ }
+
+ g_fp->setObjectState(sO_Plank_34, state);
+}
+
+void scene34_initScene(Scene *sc) {
+ g_vars->scene34_cactus = sc->getStaticANIObject1ById(ANI_CACTUS_34, -1);
+ g_vars->scene34_vent = sc->getStaticANIObject1ById(ANI_VENT_34, -1);
+ g_vars->scene34_hatch = sc->getStaticANIObject1ById(ANI_LUK_34, -1);
+ g_vars->scene34_boot = sc->getStaticANIObject1ById(ANI_BOOT_34, -1);
+
+ if (g_fp->getObjectState(sO_Cactus) == g_fp->getObjectEnumState(sO_Cactus, sO_HasGrown)) {
+ Scene *oldsc = g_fp->_currentScene;
+
+ g_fp->_currentScene = sc;
+
+ g_vars->scene34_cactus->changeStatics2(ST_CTS34_EMPTY);
+ g_vars->scene34_cactus->setOXY(506, 674);
+ g_vars->scene34_cactus->_priority = 30;
+
+ g_vars->scene34_cactus->changeStatics2(ST_CTS34_GROWNEMPTY2);
+ g_vars->scene34_cactus->_flags |= 4;
+
+ g_fp->_currentScene = oldsc;
+ }
+
+ if (g_fp->getObjectState(sO_Grandma) == g_fp->getObjectEnumState(sO_Grandma, sO_Strolling))
+ g_fp->setObjectState(sO_Grandma, g_fp->getObjectEnumState(sO_Grandma, sO_OnStool));
+
+ sceneHandler34_setExits();
+
+ g_vars->scene34_dudeClimbed = false;
+ g_vars->scene34_dudeOnBoard = false;
+ g_vars->scene34_dudeOnCactus = false;
+ g_vars->scene34_fliesCountdown = g_fp->_rnd->getRandomNumber(500) + 500;
+
+ g_fp->_floaters->init(g_fp->getGameLoaderGameVar()->getSubVarByName("SC_34"));
+
+ g_fp->lift_setButton(sO_Level7, ST_LBN_7N);
+ g_fp->lift_init(sc, QU_SC34_ENTERLIFT, QU_SC34_EXITLIFT);
+
+ g_fp->initArcadeKeys("SC_34");
+}
+
+void scene34_initBeh() {
+ g_fp->_behaviorManager->setBehaviorEnabled(g_vars->scene34_cactus, ST_CTS34_GROWNEMPTY2, QU_CTS34_FALLEFT, 0);
+ g_fp->_behaviorManager->setBehaviorEnabled(g_vars->scene34_cactus, ST_CTS34_GROWNEMPTY2, QU_CTS34_FALLRIGHT, 0);
+}
+
+int scene34_updateCursor() {
+ g_fp->updateCursorCommon();
+
+ if ((g_fp->_objectIdAtCursor != ANI_STOOL_34 || getGameLoaderInventory()->getSelectedItemId() != ANI_INV_BOX)
+ && (g_fp->_objectIdAtCursor != ANI_BOX_34 || getGameLoaderInventory()->getSelectedItemId() != ANI_INV_STOOL))
+ ; // emtpy
+ else
+ g_fp->_cursorId = PIC_CSR_ITN_INV;
+
+ return g_fp->_cursorId;
+}
+
+void sceneHandler34_leaveBoard() {
+ getCurrSceneSc2MotionController()->setEnabled();
+ getGameLoaderInteractionController()->enableFlag24();
+
+ g_fp->_behaviorManager->setFlagByStaticAniObject(g_fp->_aniMan, 1);
+
+ g_vars->scene34_dudeOnBoard = false;
+}
+
+void sceneHandler34_onBoard() {
+ getCurrSceneSc2MotionController()->clearEnabled();
+ getGameLoaderInteractionController()->disableFlag24();
+
+ g_fp->_behaviorManager->setFlagByStaticAniObject(g_fp->_aniMan, 0);
+
+ g_vars->scene34_dudeOnBoard = true;
+}
+
+void sceneHandler34_testVent() {
+ if (g_fp->_aniMan->_movement->_id == MV_MAN34_TURNVENT_R) {
+ g_vars->scene34_hatch->changeStatics2(ST_LUK34_CLOSED);
+
+ chainQueue(QU_LUK34_OPEN, 0);
+ } else if (g_fp->_aniMan->_movement->_id == MV_MAN34_TURNVENT_L) {
+ g_vars->scene34_hatch->changeStatics2(ST_LUK34_OPEN);
+
+ chainQueue(QU_LUK34_CLOSE, 0);
+ }
+}
+
+void sceneHandler34_hideStool() {
+ g_fp->_currentScene->getStaticANIObject1ById(ANI_STOOL_34, -1)->hide();
+}
+
+void sceneHandler34_climb() {
+ getCurrSceneSc2MotionController()->clearEnabled();
+ getGameLoaderInteractionController()->disableFlag24();
+
+ g_fp->_behaviorManager->setFlagByStaticAniObject(g_fp->_aniMan, 0);
+
+ g_vars->scene34_dudeClimbed = true;
+}
+
+void sceneHandler34_genFlies() {
+ g_fp->_floaters->genFlies(g_fp->_currentScene, 1072, -50, 100, 4);
+
+ g_fp->_floaters->_array2[g_fp->_floaters->_array2.size() - 1]->countdown = 1;
+ g_fp->_floaters->_array2[g_fp->_floaters->_array2.size() - 1]->val6 = 1072;
+ g_fp->_floaters->_array2[g_fp->_floaters->_array2.size() - 1]->val7 = -50;
+
+ g_vars->scene34_fliesCountdown = g_fp->_rnd->getRandomNumber(500) + 500;
+}
+
+void sceneHandler34_fromCactus(ExCommand *cmd) {
+ if (g_fp->_aniMan->_movement || g_vars->scene34_cactus->_movement || (g_fp->_aniMan->_flags & 0x100)) {
+ cmd->_messageKind = 0;
+
+ return;
+ }
+
+ MessageQueue *mq = new MessageQueue(g_fp->_currentScene->getMessageQueueById(QU_SC34_FROMCACTUS), 0, 0);
+
+ ExCommand *ex = new ExCommand(ANI_MAN, 34, 256, 0, 0, 0, 1, 0, 0, 0);
+
+ ex->_messageNum = 0;
+ ex->_excFlags |= 3;
+ ex->_field_14 = 256;
+ mq->addExCommandToEnd(ex);
+
+ ex = cmd->createClone();
+ mq->addExCommandToEnd(ex);
+
+ mq->setFlags(mq->getFlags() | 1);
+ mq->chain(0);
+
+ g_fp->_aniMan->_flags |= 1;
+}
+
+void sceneHandler34_animateLeaveBoard(ExCommand *cmd) {
+ if (!g_fp->_aniMan->_movement) {
+ MessageQueue *mq = new MessageQueue(g_fp->_currentScene->getMessageQueueById(QU_SC34_LEAVEBOARD), 0, 0);
+
+ mq->addExCommandToEnd(cmd->createClone());
+ mq->setFlags(mq->getFlags() | 1);
+ mq->chain(0);
+ }
+
+ cmd->_messageKind = 0;
+}
+
+void sceneHandler34_animateAction(ExCommand *cmd) {
+ if (g_fp->_aniMan->_movement)
+ return;
+
+ int ox = g_fp->_aniMan->_ox;
+ int oy = g_fp->_aniMan->_oy;
+ StaticANIObject *ani = g_fp->_currentScene->getStaticANIObjectAtPos(g_fp->_sceneRect.left + cmd->_x, g_fp->_sceneRect.top + cmd->_y);
+
+ if (!ani || ani->_id != ANI_VENT_34) {
+ int qId = 0;
+
+ if (ox == 887) {
+ if (oy != 370)
+ return;
+
+ qId = QU_SC34_FROMSTOOL;
+ } else {
+ if (ox != 916)
+ return;
+
+ if (oy == 286) {
+ MessageQueue *mq = new MessageQueue(g_fp->_currentScene->getMessageQueueById(QU_SC34_FROMBOX), 0, 0);
+
+ mq->addExCommandToEnd(cmd->createClone());
+ mq->chain(0);
+
+ sceneHandler34_setExits();
+
+ return;
+ }
+
+ if (oy != 345)
+ return;
+
+ qId = QU_SC34_FROMBOX_FLOOR;
+ }
+
+ if (qId) {
+ MessageQueue *mq = new MessageQueue(g_fp->_currentScene->getMessageQueueById(qId), 0, 0);
+
+ mq->addExCommandToEnd(cmd->createClone());
+ mq->chain(0);
+ }
+
+ return;
+ }
+
+ if (ox == 887) {
+ if (oy == 370)
+ g_fp->_aniMan->startAnim(MV_MAN34_TRYTABUR, 0, -1);
+
+ } else if (ox == 916) {
+ if (oy == 286) {
+ int id = g_vars->scene34_vent->_statics->_staticsId;
+ if (id == ST_VNT34_UP2) {
+ g_fp->_aniMan->startAnim(MV_MAN34_TURNVENT_R, 0, -1);
+ } else if (id == ST_VNT34_RIGHT3) {
+ g_fp->_aniMan->startAnim(MV_MAN34_TURNVENT_L, 0, -1);
+ }
+ } else if (oy == 345) {
+ g_fp->_aniMan->startAnim(MV_MAN34_TRY, 0, -1);
+ }
+ }
+}
+
+void sceneHandler34_showVent() {
+ if (g_vars->scene34_vent->_statics->_staticsId == ST_VNT34_UP2)
+ g_vars->scene34_vent->changeStatics2(ST_VNT34_RIGHT3);
+ else if (g_vars->scene34_vent->_statics->_staticsId == ST_VNT34_RIGHT3)
+ g_vars->scene34_vent->changeStatics2(ST_VNT34_UP2);
+
+ g_vars->scene34_vent->show1(-1, -1, -1, 0);
+}
+
+void sceneHandler34_showBox() {
+ g_fp->_currentScene->getStaticANIObject1ById(ANI_STOOL_34, -1)->changeStatics2(ST_STL34_BOX2);
+}
+
+void sceneHandler34_showStool() {
+ chainQueue(QU_SC34_SHOWSTOOL, 0);
+}
+
+void sceneHandler34_unclimb() {
+ getCurrSceneSc2MotionController()->setEnabled();
+ getGameLoaderInteractionController()->enableFlag24();
+
+ g_fp->_behaviorManager->setFlagByStaticAniObject(g_fp->_aniMan, 1);
+
+ g_vars->scene34_dudeClimbed = false;
+}
+
+int sceneHandler34(ExCommand *cmd) {
+ if (cmd->_messageKind != 17)
+ return 0;
+
+ switch (cmd->_messageNum) {
+ case MSG_SC4_HIDEBOOT:
+ g_vars->scene34_boot->_flags &= 0xFFFB;
+ break;
+
+ case MSG_SC34_LEAVEBOARD:
+ sceneHandler34_leaveBoard();
+ break;
+
+ case MSG_SC34_ONBOARD:
+ sceneHandler34_onBoard();
+ break;
+
+ case MSG_SC34_TESTVENT:
+ sceneHandler34_testVent();
+ break;
+
+ case MSG_LIFT_CLICKBUTTON:
+ g_fp->lift_clickButton();
+ break;
+
+ case MSG_SC34_FROMCACTUS:
+ g_vars->scene34_dudeOnCactus = false;
+
+ getCurrSceneSc2MotionController()->setEnabled();
+ getGameLoaderInteractionController()->enableFlag24();
+
+ g_fp->_behaviorManager->setFlagByStaticAniObject(g_fp->_aniMan, 1);
+
+ break;
+
+ case MSG_SC34_RETRYVENT:
+ if (!g_fp->_aniMan->isIdle())
+ break;
+
+ g_fp->_aniMan->changeStatics2(ST_MAN_RIGHT);
+ g_fp->_aniMan->_flags &= 0xFEFF;
+
+ getGameLoaderInteractionController()->handleInteraction(g_fp->_aniMan, g_vars->scene34_vent, cmd->_keyCode);
+
+ break;
+
+ case MSG_SC34_ONBUMP:
+ g_fp->_behaviorManager->setBehaviorEnabled(g_vars->scene34_cactus, ST_CTS34_GROWNEMPTY2, QU_CTS34_FALLEFT, 1);
+ g_fp->_behaviorManager->setBehaviorEnabled(g_vars->scene34_cactus, ST_CTS34_GROWNEMPTY2, QU_CTS34_FALLRIGHT, 1);
+ break;
+
+ case MSG_LIFT_CLOSEDOOR:
+ g_fp->lift_closedoorSeq();
+ break;
+
+ case MSG_LIFT_EXITLIFT:
+ g_fp->lift_exitSeq(cmd);
+ break;
+
+ case MSG_LIFT_STARTEXITQUEUE:
+ g_fp->lift_startExitQueue();
+ break;
+
+ case MSG_SC22_HIDESTOOL:
+ sceneHandler34_hideStool();
+ break;
+
+ case MSG_SC34_CLIMB:
+ sceneHandler34_climb();
+ break;
+
+ case MSG_SC34_UNCLIMB:
+ sceneHandler34_unclimb();
+ break;
+
+ case MSG_SC22_SHOWSTOOL:
+ sceneHandler34_showStool();
+ break;
+
+ case MSG_SC34_SHOWBOX:
+ sceneHandler34_showBox();
+ break;
+
+ case MSG_SC34_ONCACTUS:
+ g_vars->scene34_dudeOnCactus = true;
+
+ getCurrSceneSc2MotionController()->clearEnabled();
+ getGameLoaderInteractionController()->disableFlag24();
+
+ g_fp->_behaviorManager->setFlagByStaticAniObject(g_fp->_aniMan, 0);
+ break;
+
+ case MSG_SC34_SHOWVENT:
+ sceneHandler34_showVent();
+ break;
+
+ case 64:
+ g_fp->lift_hoverButton(cmd);
+ break;
+
+ case MSG_LIFT_GO:
+ g_fp->lift_goAnimation();
+ break;
+
+ case 29:
+ {
+ if (g_vars->scene34_dudeClimbed) {
+ sceneHandler34_animateAction(cmd);
+ break;
+ }
+
+ if (g_vars->scene34_dudeOnBoard) {
+ sceneHandler34_animateLeaveBoard(cmd);
+ break;
+ }
+
+ if (g_vars->scene34_dudeOnCactus) {
+ sceneHandler34_fromCactus(cmd);
+ break;
+ }
+
+ StaticANIObject *ani = g_fp->_currentScene->getStaticANIObjectAtPos(g_fp->_sceneRect.left + cmd->_x, g_fp->_sceneRect.top + cmd->_y);
+
+ if (ani) {
+ if ((ani->_id == ANI_STOOL_34 && cmd->_keyCode == ANI_INV_BOX) || (ani->_id == ANI_BOX_34 && cmd->_keyCode == ANI_INV_STOOL)) {
+ getGameLoaderInteractionController()->handleInteraction(g_fp->_aniMan, g_vars->scene34_vent, cmd->_keyCode);
+
+ cmd->_messageKind = 0;
+ }
+
+ if (ani->_id == ANI_LIFTBUTTON) {
+ g_fp->lift_animateButton(ani);
+
+ cmd->_messageKind = 0;
+
+ break;
+ }
+ }
+
+ if (!ani || !canInteractAny(g_fp->_aniMan, ani, cmd->_keyCode)) {
+ int picId = g_fp->_currentScene->getPictureObjectIdAtPos(cmd->_sceneClickX, cmd->_sceneClickY);
+ PictureObject *pic = g_fp->_currentScene->getPictureObjectById(picId, 0);
+
+ if (!pic || !canInteractAny(g_fp->_aniMan, pic, cmd->_keyCode)) {
+ if ((g_fp->_sceneRect.right - cmd->_sceneClickX < 47 && g_fp->_sceneRect.right < g_fp->_sceneWidth - 1) || (cmd->_sceneClickX - g_fp->_sceneRect.left < 47 && g_fp->_sceneRect.left > 0)) {
+ g_fp->processArcade(cmd);
+ break;
+ }
+ }
+ }
+ break;
+ }
+
+ case 33:
+ if (g_fp->_aniMan2) {
+ int x = g_fp->_aniMan2->_ox;
+
+ if (x < g_fp->_sceneRect.left + 200)
+ g_fp->_currentScene->_x = x - 300 - g_fp->_sceneRect.left;
+
+ if (x > g_fp->_sceneRect.right - 200)
+ g_fp->_currentScene->_x = x + 300 - g_fp->_sceneRect.right;
+ }
+
+ --g_vars->scene34_fliesCountdown;
+
+ if (!g_vars->scene34_fliesCountdown)
+ sceneHandler34_genFlies();
+
+ g_fp->_floaters->update();
+
+ g_fp->_behaviorManager->updateBehaviors();
+
+ g_fp->startSceneTrack();
+
+ break;
+ }
+
+ return 0;
+}
+
+} // End of namespace Fullpipe
diff --git a/engines/fullpipe/scenes/scene35.cpp b/engines/fullpipe/scenes/scene35.cpp
new file mode 100644
index 0000000000..53381fd555
--- /dev/null
+++ b/engines/fullpipe/scenes/scene35.cpp
@@ -0,0 +1,264 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public 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 "fullpipe/fullpipe.h"
+
+#include "fullpipe/objectnames.h"
+#include "fullpipe/constants.h"
+
+#include "fullpipe/gameloader.h"
+#include "fullpipe/motion.h"
+#include "fullpipe/scenes.h"
+#include "fullpipe/statics.h"
+
+#include "fullpipe/interaction.h"
+#include "fullpipe/behavior.h"
+
+#include "fullpipe/floaters.h"
+
+namespace Fullpipe {
+
+void scene35_initScene(Scene *sc) {
+ g_vars->scene35_hose = sc->getStaticANIObject1ById(ANI_HOSE, -1);
+ g_vars->scene35_bellyInflater = sc->getStaticANIObject1ById(ANI_PUZODUV, -1);
+ g_vars->scene35_flowCounter = 0;
+ g_vars->scene35_fliesCounter = 0;
+
+ MovGraphLink *lnk = getSc2MctlCompoundBySceneId(sc->_sceneId)->getLinkByName(sO_CloseThing);
+
+ if (g_vars->scene35_bellyInflater->_statics->_staticsId == ST_PDV_LARGE)
+ lnk->_flags |= 0x20000000;
+ else
+ lnk->_flags &= 0xDFFFFFFF;
+
+ int sndId = 0;
+
+ if (g_fp->getObjectState(sO_Valve_35) == g_fp->getObjectEnumState(sO_Valve_35, sO_TurnedOn)) {
+ if ((g_vars->scene35_hose->_flags & 4) && g_vars->scene35_hose->_statics->_staticsId == ST_HZE_NORM) {
+ sndId = SND_35_012;
+ } else if (g_vars->scene35_bellyInflater->_statics->_staticsId == ST_PDV_SMALL) {
+ sndId = SND_35_011;
+ }
+ }
+
+ if (sndId)
+ g_fp->playSound(sndId, 1);
+
+ g_fp->lift_setButton(sO_Level6, ST_LBN_6N);
+ g_fp->lift_init(sc, QU_SC35_ENTERLIFT, QU_SC35_EXITLIFT);
+
+ g_fp->initArcadeKeys("SC_35");
+
+ g_fp->_floaters->init(g_fp->getGameLoaderGameVar()->getSubVarByName("SC_35"));
+}
+
+void sceneHandler35_stopFlow() {
+ g_fp->setObjectState(sO_Valve_35, g_fp->getObjectEnumState(sO_Valve_35, sO_TurnedOff));
+ g_fp->stopAllSoundInstances(SND_35_011);
+ g_fp->playSound(SND_35_026, 0);
+}
+
+void sceneHandler35_shrink() {
+ getCurrSceneSc2MotionController()->enableLinks(sO_CloseThing, 0);
+}
+
+void sceneHandler35_startFlow() {
+ if (g_fp->getObjectState(sO_Valve_35) == g_fp->getObjectEnumState(sO_Valve_35, sO_TurnedOn)) {
+ if ((g_vars->scene35_hose->_flags & 4) && g_vars->scene35_hose->_statics->_staticsId == ST_HZE_NORM) {
+ g_fp->_behaviorManager->setBehaviorEnabled(g_vars->scene35_bellyInflater, ST_PDV_SMALL, QU_PDV_SML_BLINK, 0);
+ g_fp->_behaviorManager->setBehaviorEnabled(g_vars->scene35_bellyInflater, ST_PDV_SMALL, QU_PDV_SML_TRY, 0);
+
+ g_vars->scene35_bellyInflater->changeStatics2(ST_PDV_SMALL);
+ g_vars->scene35_bellyInflater->_flags &= 0xFEFF;
+
+ MessageQueue *mq = new MessageQueue(g_fp->_currentScene->getMessageQueueById(QU_SC35_EATHOZE), 0, 0);
+
+ mq->setFlags(mq->getFlags() | 1);
+
+ ExCommand *cmd = new ExCommand(g_vars->scene35_bellyInflater->_id, 34, 256, 0, 0, 0, 1, 0, 0, 0);
+
+ cmd->_excFlags |= 3;
+ cmd->_field_14 = 256;
+ cmd->_messageNum = 0;
+
+ mq->addExCommandToEnd(cmd);
+
+ if (!mq->chain(g_vars->scene35_bellyInflater))
+ delete mq;
+
+ g_vars->scene35_bellyInflater->_flags |= 1;
+
+ getCurrSceneSc2MotionController()->enableLinks(sO_CloseThing, 1);
+
+ g_fp->playSound(SND_35_012, 1);
+ } else {
+ if (!g_vars->scene35_flowCounter)
+ g_vars->scene35_flowCounter = 98;
+
+ g_fp->playSound(SND_35_011, 1);
+ }
+ }
+}
+
+void sceneHandler35_genFlies() {
+ StaticANIObject *fly = g_fp->_currentScene->getStaticANIObject1ById(ANI_FLY, -1);
+
+ int xoff = 0;
+ if ((!fly || !(fly->_flags & 4)) && !(g_fp->_rnd->getRandomNumber(32767) % 30)) {
+ int x, y;
+
+ if (g_fp->_rnd->getRandomNumber(1)) {
+ x = 600;
+ y = 0;
+ } else {
+ x = 0;
+ y = 600;
+ }
+
+ int numFlies = g_fp->_rnd->getRandomNumber(3) + 1;
+
+ while (numFlies--) {
+ g_fp->_floaters->genFlies(g_fp->_currentScene, g_fp->_rnd->getRandomNumber(55) + 1057, g_fp->_rnd->getRandomNumber(60) + x + xoff, 4, 1);
+
+ xoff += 40;
+
+ g_fp->_floaters->_array2[g_fp->_floaters->_array2.size() - 1]->val2 = 1084;
+ g_fp->_floaters->_array2[g_fp->_floaters->_array2.size() - 1]->val3 = y;
+ g_fp->_floaters->_array2[g_fp->_floaters->_array2.size() - 1]->val11 = 8.0;
+ }
+
+ g_vars->scene35_fliesCounter = 0;
+ }
+}
+
+int sceneHandler35(ExCommand *cmd) {
+ if (cmd->_messageKind != 17)
+ return 0;
+
+ switch (cmd->_messageNum) {
+ case MSG_LIFT_CLOSEDOOR:
+ g_fp->lift_closedoorSeq();
+ break;
+
+ case MSG_LIFT_EXITLIFT:
+ g_fp->lift_exitSeq(cmd);
+ break;
+
+ case MSG_LIFT_STARTEXITQUEUE:
+ g_fp->lift_startExitQueue();
+ break;
+
+ case MSG_LIFT_CLICKBUTTON:
+ g_fp->lift_clickButton();
+ break;
+
+ case MSG_SC35_STOPFLOW:
+ sceneHandler35_stopFlow();
+ break;
+
+ case MSG_SC35_CHECKPIPESOUND:
+ if (g_fp->getObjectState(sO_Valve_35) == g_fp->getObjectEnumState(sO_Valve_35, sO_TurnedOn)) {
+ g_fp->stopAllSoundInstances(SND_35_011);
+ g_fp->playSound(SND_35_012, 1);
+
+ g_vars->scene35_flowCounter = 0;
+ break;
+ }
+ break;
+
+ case MSG_SC35_SHRINK:
+ sceneHandler35_shrink();
+ break;
+
+ case MSG_LIFT_GO:
+ g_fp->lift_goAnimation();
+ break;
+
+ case MSG_SC35_STARTFLOW:
+ case MSG_SC35_PLUGHOSE:
+ sceneHandler35_startFlow();
+ break;
+
+ case 64:
+ g_fp->lift_hoverButton(cmd);
+ break;
+
+ case 29:
+ {
+ StaticANIObject *ani = g_fp->_currentScene->getStaticANIObjectAtPos(g_fp->_sceneRect.left + cmd->_x, g_fp->_sceneRect.top + cmd->_y);
+
+ if (ani)
+ if (ani->_id == ANI_LIFTBUTTON) {
+ g_fp->lift_animateButton(ani);
+ cmd->_messageKind = 0;
+ break;
+ }
+
+ if (!ani || !canInteractAny(g_fp->_aniMan, ani, cmd->_keyCode)) {
+ int picId = g_fp->_currentScene->getPictureObjectIdAtPos(cmd->_sceneClickX, cmd->_sceneClickY);
+ PictureObject *pic = g_fp->_currentScene->getPictureObjectById(picId, 0);
+
+ if (!pic || !canInteractAny(g_fp->_aniMan, pic, cmd->_keyCode)) {
+ if ((g_fp->_sceneRect.right - cmd->_sceneClickX < 47 && g_fp->_sceneRect.right < g_fp->_sceneWidth - 1) || (cmd->_sceneClickX - g_fp->_sceneRect.left < 47 && g_fp->_sceneRect.left > 0)) {
+ g_fp->processArcade(cmd);
+ break;
+ }
+ }
+ }
+ break;
+ }
+
+ case 33:
+ if (g_fp->_aniMan2) {
+ int x = g_fp->_aniMan2->_ox;
+
+ if (x < g_fp->_sceneRect.left + 200)
+ g_fp->_currentScene->_x = x - 300 - g_fp->_sceneRect.left;
+
+ if (x > g_fp->_sceneRect.right - 200)
+ g_fp->_currentScene->_x = x + 300 - g_fp->_sceneRect.right;
+ }
+
+ if (g_vars->scene35_flowCounter > 0) {
+ --g_vars->scene35_flowCounter;
+
+ if (!g_vars->scene35_flowCounter)
+ sceneHandler35_stopFlow();
+ }
+
+ g_vars->scene35_fliesCounter++;
+
+ if (g_vars->scene35_fliesCounter >= 160)
+ sceneHandler35_genFlies();
+
+ g_fp->_floaters->update();
+
+ g_fp->_behaviorManager->updateBehaviors();
+ g_fp->startSceneTrack();
+
+ break;
+ }
+
+ return 0;
+}
+
+} // End of namespace Fullpipe
diff --git a/engines/fullpipe/scenes/scene36.cpp b/engines/fullpipe/scenes/scene36.cpp
new file mode 100644
index 0000000000..44099faba0
--- /dev/null
+++ b/engines/fullpipe/scenes/scene36.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.
+ *
+ */
+
+#include "fullpipe/fullpipe.h"
+
+#include "fullpipe/objectnames.h"
+#include "fullpipe/constants.h"
+
+#include "fullpipe/gameloader.h"
+#include "fullpipe/motion.h"
+#include "fullpipe/scenes.h"
+#include "fullpipe/statics.h"
+
+#include "fullpipe/interaction.h"
+#include "fullpipe/behavior.h"
+
+
+namespace Fullpipe {
+
+void scene36_initScene(Scene *sc) {
+ g_vars->scene36_rotohrust = sc->getStaticANIObject1ById(ANI_ROTOHRUST, -1);
+ g_vars->scene36_scissors = sc->getStaticANIObject1ById(ANI_SCISSORS_36, -1);
+}
+
+int scene36_updateCursor() {
+ g_fp->updateCursorCommon();
+
+ if (g_fp->_cursorId != PIC_CSR_ITN || g_fp->_objectIdAtCursor != ANI_ROTOHRUST) {
+ if (g_fp->_objectIdAtCursor == PIC_SC36_MASK && g_fp->_cursorId == PIC_CSR_DEFAULT && (g_vars->scene36_scissors->_flags & 4))
+ g_fp->_cursorId = PIC_CSR_ITN;
+ } else if (g_vars->scene36_rotohrust->_statics->_staticsId == ST_RHT_OPEN)
+ g_fp->_cursorId = PIC_CSR_GOL;
+
+ return g_fp->_cursorId;
+}
+
+int sceneHandler36(ExCommand *cmd) {
+ if (cmd->_messageKind != 17)
+ return 0;
+
+ switch (cmd->_messageNum) {
+ case 29:
+ if (g_fp->_currentScene->getPictureObjectIdAtPos(cmd->_sceneClickX, cmd->_sceneClickY) == PIC_SC36_MASK)
+ if (g_vars->scene36_scissors)
+ if (g_vars->scene36_scissors->_flags & 4)
+ if (g_fp->_aniMan->isIdle())
+ if (!(g_fp->_aniMan->_flags & 0x100) && g_fp->_msgObjectId2 != g_vars->scene36_scissors->_id ) {
+ handleObjectInteraction(g_fp->_aniMan, g_vars->scene36_scissors, cmd->_keyCode);
+
+ cmd->_messageKind = 0;
+ }
+
+ break;
+
+ case 33:
+ if (g_fp->_aniMan2) {
+ int x = g_fp->_aniMan2->_ox;
+
+ if (x < g_fp->_sceneRect.left + 200)
+ g_fp->_currentScene->_x = x - 300 - g_fp->_sceneRect.left;
+
+ if (x > g_fp->_sceneRect.right - 200)
+ g_fp->_currentScene->_x = x + 300 - g_fp->_sceneRect.right;
+ }
+
+ g_fp->_behaviorManager->updateBehaviors();
+ g_fp->startSceneTrack();
+
+ break;
+ }
+
+ return 0;
+}
+
+} // End of namespace Fullpipe
diff --git a/engines/fullpipe/scenes/scene37.cpp b/engines/fullpipe/scenes/scene37.cpp
new file mode 100644
index 0000000000..09da01f138
--- /dev/null
+++ b/engines/fullpipe/scenes/scene37.cpp
@@ -0,0 +1,316 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public 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 "fullpipe/fullpipe.h"
+
+#include "fullpipe/objectnames.h"
+#include "fullpipe/constants.h"
+
+#include "fullpipe/gameloader.h"
+#include "fullpipe/motion.h"
+#include "fullpipe/scenes.h"
+#include "fullpipe/statics.h"
+
+#include "fullpipe/interaction.h"
+#include "fullpipe/behavior.h"
+
+
+namespace Fullpipe {
+
+Ring::Ring() {
+ ani = 0;
+ x = 0;
+ y = 0;
+ numSubRings = 0;
+
+ for (int i = 0; i < 10; i++)
+ subRings[i] = 0;
+
+ state = false;
+}
+
+void scene37_initScene(Scene *sc) {
+ Ring *ring;
+ StaticANIObject *ani;
+
+ g_vars->scene37_lastDudeX = -1;
+
+ ring = new Ring();
+ ani = sc->getStaticANIObject1ById(ANI_GUARD_37, 0);
+ ring->ani = ani;
+ ring->x = ani->_ox - 40;
+ ring->y = ani->_ox + 40;
+ ring->numSubRings = 3;
+ ring->subRings[0] = 1;
+ ring->subRings[1] = 4;
+ ring->subRings[2] = 8;
+ ring->state = false;
+ g_vars->scene37_rings.push_back(ring);
+
+ ring = new Ring();
+ ani = sc->getStaticANIObject1ById(ANI_GUARD_37, 1);
+ ring->ani = ani;
+ ring->x = ani->_ox - 40;
+ ring->y = ani->_ox + 40;
+ ring->numSubRings = 3;
+ ring->subRings[0] = 2;
+ ring->subRings[1] = 5;
+ ring->subRings[2] = 9;
+ ring->state = false;
+ g_vars->scene37_rings.push_back(ring);
+
+ ring = new Ring();
+ ani = sc->getStaticANIObject1ById(ANI_GUARD_37, 2);
+ ring->ani = ani;
+ ring->x = ani->_ox - 40;
+ ring->y = ani->_ox + 40;
+ ring->numSubRings = 3;
+ ring->subRings[0] = 3;
+ ring->subRings[1] = 7;
+ ring->subRings[2] = 11;
+ ring->state = false;
+ g_vars->scene37_rings.push_back(ring);
+
+ g_fp->setObjectState(sO_LeftPipe_37, g_fp->getObjectEnumState(sO_LeftPipe_37, sO_IsClosed));
+
+ Scene *oldsc = g_fp->_currentScene;
+
+ g_fp->_currentScene = sc;
+
+ g_vars->scene37_cursorIsLocked = false;
+
+ g_vars->scene37_plusMinus1 = sc->getStaticANIObject1ById(ANI_PLUSMINUS, 1);
+
+ for (int i = 0; i < g_vars->scene37_rings[0]->numSubRings; i++) {
+ ani = g_fp->_currentScene->getStaticANIObject1ById(ANI_RING, g_vars->scene37_rings[0]->subRings[i]);
+
+ if (g_fp->getObjectState(sO_Guard_1) == g_fp->getObjectEnumState(sO_Guard_1, sO_On)) {
+ g_vars->scene37_plusMinus1->_statics = g_vars->scene37_plusMinus1->getStaticsById(ST_PMS_PLUS);
+ ani->changeStatics2(ST_RNG_OPEN);
+ } else {
+ g_vars->scene37_plusMinus1->_statics = g_vars->scene37_plusMinus1->getStaticsById(ST_PMS_MINUS);
+ ani->changeStatics2(ST_RNG_CLOSED2);
+ }
+ }
+
+ g_vars->scene37_plusMinus2 = sc->getStaticANIObject1ById(ANI_PLUSMINUS, 2);
+
+ for (int i = 0; i < g_vars->scene37_rings[1]->numSubRings; i++) {
+ ani = g_fp->_currentScene->getStaticANIObject1ById(ANI_RING, g_vars->scene37_rings[1]->subRings[i]);
+
+ if (g_fp->getObjectState(sO_Guard_2) == g_fp->getObjectEnumState(sO_Guard_2, sO_On)) {
+ g_vars->scene37_plusMinus2->_statics = g_vars->scene37_plusMinus2->getStaticsById(ST_PMS_PLUS);
+ ani->changeStatics2(ST_RNG_OPEN);
+ } else {
+ g_vars->scene37_plusMinus2->_statics = g_vars->scene37_plusMinus2->getStaticsById(ST_PMS_MINUS);
+ ani->changeStatics2(ST_RNG_CLOSED2);
+ }
+ }
+
+ g_vars->scene37_plusMinus3 = sc->getStaticANIObject1ById(ANI_PLUSMINUS, 3);
+
+ for (int i = 0; i < g_vars->scene37_rings[2]->numSubRings; i++) {
+ ani = g_fp->_currentScene->getStaticANIObject1ById(ANI_RING, g_vars->scene37_rings[2]->subRings[i]);
+
+ if (g_fp->getObjectState(sO_Guard_3) == g_fp->getObjectEnumState(sO_Guard_3, sO_On)) {
+ g_vars->scene37_plusMinus3->_statics = g_vars->scene37_plusMinus3->getStaticsById(ST_PMS_PLUS);
+ ani->changeStatics2(ST_RNG_OPEN);
+ } else {
+ g_vars->scene37_plusMinus3->_statics = g_vars->scene37_plusMinus3->getStaticsById(ST_PMS_MINUS);
+ ani->changeStatics2(ST_RNG_CLOSED2);
+ }
+ }
+
+ g_fp->_currentScene = oldsc;
+
+ g_fp->initArcadeKeys("SC_37");
+}
+
+int scene37_updateCursor() {
+ g_fp->updateCursorCommon();
+
+ if (g_fp->_cursorId == PIC_CSR_ITN && g_fp->_objectIdAtCursor == PIC_SC37_MASK) {
+ if (g_vars->scene37_cursorIsLocked)
+ g_fp->_cursorId = PIC_CSR_GOL;
+ }
+
+ return g_fp->_cursorId;
+}
+
+void sceneHandler37_updateRing(int ringNum) {
+ g_vars->scene37_rings[ringNum]->ani->changeStatics2(ST_GRD37_STAND);
+ g_vars->scene37_rings[ringNum]->ani->startAnim(MV_GRD37_PULL, 0, -1);
+ g_vars->scene37_rings[ringNum]->state = !g_vars->scene37_rings[ringNum]->state;
+
+ StaticANIObject *ani;
+
+ for (int i = 0; i < g_vars->scene37_rings[ringNum]->numSubRings; i++) {
+ ani = g_fp->_currentScene->getStaticANIObject1ById(ANI_RING, g_vars->scene37_rings[ringNum]->subRings[i]);
+
+ if ((ani->_movement && ani->_movement->_id != MV_RNG_CLOSE) || ani->_statics->_staticsId != ST_RNG_CLOSED2) {
+ ani->changeStatics2(ST_RNG_OPEN);
+ ani->startAnim(MV_RNG_CLOSE, 0, -1);
+ } else {
+ ani->changeStatics2(ST_RNG_CLOSED2);
+ ani->startAnim(MV_RNG_OPEN, 0, -1);
+ }
+ }
+
+ g_vars->scene37_cursorIsLocked = true;
+
+ for (uint j = 0; j < g_vars->scene37_rings.size(); j++) {
+ for (int i = 0; i < g_vars->scene37_rings[ringNum]->numSubRings; i++) {
+ ani = g_fp->_currentScene->getStaticANIObject1ById(ANI_RING, g_vars->scene37_rings[j]->subRings[i]);
+
+ if ((ani->_movement && ani->_movement->_id != MV_RNG_CLOSE) || ani->_statics->_staticsId != ST_RNG_CLOSED2)
+ g_vars->scene37_cursorIsLocked = false;
+ }
+ }
+
+ int state;
+
+ if (g_vars->scene37_cursorIsLocked)
+ state = g_fp->getObjectEnumState(sO_LeftPipe_37, sO_IsOpened);
+ else
+ state = g_fp->getObjectEnumState(sO_LeftPipe_37, sO_IsClosed);
+
+ g_fp->setObjectState(sO_LeftPipe_37, state);
+}
+
+void sceneHandler37_setRingsState() {
+ if (g_vars->scene37_lastDudeX == -1) {
+ g_vars->scene37_lastDudeX = g_vars->scene37_dudeX;
+ } else {
+ for (uint i = 0; i < g_vars->scene37_rings.size(); i++) {
+ int x = g_vars->scene37_rings[i]->x;
+
+ if (g_vars->scene37_lastDudeX > x && g_vars->scene37_dudeX <= x && !g_vars->scene37_rings[i]->state)
+ sceneHandler37_updateRing(i);
+
+ x = g_vars->scene37_rings[i]->y;
+
+ if (g_vars->scene37_lastDudeX < x && g_vars->scene37_dudeX >= x) {
+ if (g_vars->scene37_rings[i]->state)
+ sceneHandler37_updateRing(i);
+ }
+ }
+
+ g_vars->scene37_lastDudeX = g_vars->scene37_dudeX;
+ }
+}
+
+int sceneHandler37(ExCommand *cmd) {
+ if (cmd->_messageKind != 17)
+ return 0;
+
+ switch(cmd->_messageNum) {
+ case MSG_SC37_EXITLEFT:
+ sceneHandler37_updateRing(0);
+ sceneHandler37_updateRing(1);
+ sceneHandler37_updateRing(2);
+
+ break;
+
+ case 29:
+ {
+ StaticANIObject *ani = g_fp->_currentScene->getStaticANIObjectAtPos(cmd->_sceneClickX, cmd->_sceneClickY);
+
+ if (!ani || !canInteractAny(g_fp->_aniMan, ani, cmd->_keyCode)) {
+ int picId = g_fp->_currentScene->getPictureObjectIdAtPos(cmd->_sceneClickX, cmd->_sceneClickY);
+ PictureObject *pic = g_fp->_currentScene->getPictureObjectById(picId, 0);
+
+ if (!pic || !canInteractAny(g_fp->_aniMan, pic, cmd->_keyCode)) {
+ if ((g_fp->_sceneRect.right - cmd->_sceneClickX < 47 && g_fp->_sceneRect.right < g_fp->_sceneWidth - 1)
+ || (cmd->_sceneClickX - g_fp->_sceneRect.left < 47 && g_fp->_sceneRect.left > 0)) {
+ g_fp->processArcade(cmd);
+ break;
+ }
+ }
+ }
+ }
+
+ break;
+
+ case 33:
+ if (g_fp->_aniMan2) {
+ int x = g_fp->_aniMan2->_ox;
+
+ g_vars->scene37_dudeX = x;
+
+ if (x >= 500) {
+ if (x < g_fp->_sceneRect.left + 200)
+ g_fp->_currentScene->_x = x - 300 - g_fp->_sceneRect.left;
+ } else {
+ g_fp->_currentScene->_x = -g_fp->_sceneRect.left;
+ }
+ x = g_vars->scene37_dudeX;
+
+ if (x > g_fp->_sceneRect.right - 200)
+ g_fp->_currentScene->_x = x + 300 - g_fp->_sceneRect.right;
+ }
+
+ sceneHandler37_setRingsState();
+
+ g_fp->_behaviorManager->updateBehaviors();
+ g_fp->startSceneTrack();
+
+ ++g_vars->scene37_soundFlipper;
+
+ break;
+
+ case MSG_SC37_PULL:
+ if (g_vars->scene37_rings[0]->ani->_movement && g_vars->scene37_rings[0]->ani->_movement->_id == MV_GRD37_PULL) {
+ if ((g_fp->getObjectState(sO_Guard_1) == g_fp->getObjectEnumState(sO_Guard_1, sO_On) && !g_vars->scene37_rings[0]->state)
+ || (g_fp->getObjectState(sO_Guard_1) == g_fp->getObjectEnumState(sO_Guard_1, sO_Off) && g_vars->scene37_rings[0]->state)) {
+ g_vars->scene37_plusMinus1->_statics = g_vars->scene37_plusMinus1->getStaticsById(ST_PMS_PLUS);
+ } else {
+ g_vars->scene37_plusMinus1->_statics = g_vars->scene37_plusMinus1->getStaticsById(ST_PMS_MINUS);
+ }
+ } else if (g_vars->scene37_rings[1]->ani->_movement && g_vars->scene37_rings[1]->ani->_movement->_id == MV_GRD37_PULL) {
+ if ((g_fp->getObjectState(sO_Guard_2) == g_fp->getObjectEnumState(sO_Guard_2, sO_On) && !g_vars->scene37_rings[1]->state)
+ || (g_fp->getObjectState(sO_Guard_2) == g_fp->getObjectEnumState(sO_Guard_2, sO_Off) && g_vars->scene37_rings[1]->state)) {
+ g_vars->scene37_plusMinus2->_statics = g_vars->scene37_plusMinus2->getStaticsById(ST_PMS_PLUS);
+ } else {
+ g_vars->scene37_plusMinus2->_statics = g_vars->scene37_plusMinus2->getStaticsById(ST_PMS_MINUS);
+ }
+ } else if (g_vars->scene37_rings[2]->ani->_movement && g_vars->scene37_rings[2]->ani->_movement->_id == MV_GRD37_PULL) {
+ if ((g_fp->getObjectState(sO_Guard_3) == g_fp->getObjectEnumState(sO_Guard_3, sO_On) && !g_vars->scene37_rings[2]->state)
+ || (g_fp->getObjectState(sO_Guard_3) == g_fp->getObjectEnumState(sO_Guard_3, sO_Off) && g_vars->scene37_rings[2]->state)) {
+ g_vars->scene37_plusMinus3->_statics = g_vars->scene37_plusMinus3->getStaticsById(ST_PMS_PLUS);
+ } else {
+ g_vars->scene37_plusMinus3->_statics = g_vars->scene37_plusMinus3->getStaticsById(ST_PMS_MINUS);
+ }
+ }
+
+ if (g_vars->scene37_soundFlipper) {
+ g_fp->playSound(SND_37_007, 0);
+
+ g_vars->scene37_soundFlipper = 0;
+ }
+
+ break;
+ }
+
+ return 0;
+}
+
+} // End of namespace Fullpipe
diff --git a/engines/fullpipe/scenes/scene38.cpp b/engines/fullpipe/scenes/scene38.cpp
new file mode 100644
index 0000000000..2bdae1ce66
--- /dev/null
+++ b/engines/fullpipe/scenes/scene38.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 "fullpipe/fullpipe.h"
+
+#include "fullpipe/objectnames.h"
+#include "fullpipe/constants.h"
+
+#include "fullpipe/gameloader.h"
+#include "fullpipe/motion.h"
+#include "fullpipe/scenes.h"
+#include "fullpipe/statics.h"
+
+#include "fullpipe/interaction.h"
+#include "fullpipe/behavior.h"
+
+
+namespace Fullpipe {
+
+void scene38_setBottleState(Scene *sc) {
+ ExCommand *ex = sc->getMessageQueueById(QU_SC38_SHOWBOTTLE_ONTABLE)->getExCommandByIndex(0);
+
+ if (g_vars->scene38_bottle->_ox == ex->_x && g_vars->scene38_bottle->_oy == ex->_y) {
+ if (g_fp->lift_checkButton(sO_Level5) ) {
+ ex = sc->getMessageQueueById(QU_SC38_SHOWBOTTLE)->getExCommandByIndex(0);
+
+ g_vars->scene38_bottle->setOXY(ex->_x, ex->_y);
+ g_vars->scene38_bottle->_priority = ex->_field_14;
+
+ g_fp->setObjectState(sO_Bottle_38, g_fp->getObjectEnumState(sO_Bottle_38, sO_Blocked));
+ }
+ }
+}
+
+void scene38_initScene(Scene *sc) {
+ g_vars->scene38_boss = sc->getStaticANIObject1ById(ANI_GLAVAR, -1);
+ g_vars->scene38_tally = sc->getStaticANIObject1ById(ANI_DYLDA, -1);
+ g_vars->scene38_shorty = sc->getStaticANIObject1ById(ANI_MALYSH, -1);
+ g_vars->scene38_domino0 = sc->getStaticANIObject1ById(ANI_DOMINO38, 0);
+ g_vars->scene38_dominos = sc->getStaticANIObject1ById(ANI_DOMINOS, 0);
+ g_vars->scene38_domino1 = sc->getStaticANIObject1ById(ANI_DOMINO38, 1);
+ g_vars->scene38_bottle = sc->getStaticANIObject1ById(ANI_BOTTLE38, 0);
+ g_vars->scene38_bossCounter = 0;
+ g_vars->scene38_lastBossAnim = 0;
+ g_vars->scene38_bossAnimCounter = 0;
+ g_vars->scene38_tallyCounter = 15;
+ g_vars->scene38_lastTallyAnim = 0;
+ g_vars->scene38_tallyAnimCounter = 0;
+ g_vars->scene38_shortyCounter = 30;
+ g_vars->scene38_lastShortyAnim = 0;
+ g_vars->scene38_shortyAnimCounter = 0;
+
+ scene38_setBottleState(sc);
+
+ if (g_fp->getObjectState(sO_Boss) == g_fp->getObjectEnumState(sO_Boss, sO_IsSleeping)) {
+ g_vars->scene38_shorty->_flags &= 0xFFFB;
+
+ g_vars->scene38_tally->stopAnim_maybe();
+ g_vars->scene38_tally->_flags &= 0xFFFB;
+
+ g_vars->scene38_domino0->_flags &= 0xFFFB;
+ g_vars->scene38_dominos->_flags &= 0xFFFB;
+ g_vars->scene38_domino1->_flags &= 0xFFFB;
+ }
+
+ g_fp->lift_init(sc, QU_SC38_ENTERLIFT, QU_SC38_EXITLIFT);
+ g_fp->lift_setButtonStatics(sc, ST_LBN_0N);
+}
+
+void sceneHandler38_tryTakeBottle() {
+ g_vars->scene38_boss->changeStatics2(ST_GLV_NOHAMMER);
+ g_vars->scene38_boss->startAnim(MV_GLV_LOOKMAN, 0, -1);
+
+ g_vars->scene38_bossCounter = 0;
+}
+
+void sceneHandler38_postHammerKick() {
+ g_vars->scene38_domino1->setOXY(g_vars->scene38_domino1->_ox, g_vars->scene38_domino1->_oy + 2);
+}
+
+void sceneHandler38_propose() {
+ if (!g_vars->scene38_tally->_movement) {
+ if (g_vars->scene38_tally->_flags & 4) {
+ if (!(g_vars->scene38_tally->_flags & 2) && g_vars->scene38_tallyCounter > 0
+ && g_fp->_rnd->getRandomNumber(32767) < 32767) {
+ chainQueue(QU_DLD_DENY, 0);
+ g_vars->scene38_tallyCounter = 0;
+ }
+ }
+ }
+}
+
+void sceneHandler38_point() {
+ if ((!g_vars->scene38_boss->_movement && ((g_vars->scene38_boss->_flags & 4) || !(g_vars->scene38_boss->_flags & 2)))
+ && g_vars->scene38_bossCounter > 0
+ && g_fp->_rnd->getRandomNumber(32767) < 32767) {
+ if (g_vars->scene38_boss->_statics->_staticsId == ST_GLV_HAMMER) {
+ chainQueue(QU_GLV_TOSMALL, 0);
+ g_vars->scene38_bossCounter = 0;
+ } else {
+ if (g_vars->scene38_boss->_statics->_staticsId == ST_GLV_NOHAMMER)
+ chainQueue(QU_GLV_TOSMALL_NOHMR, 0);
+
+ g_vars->scene38_bossCounter = 0;
+ }
+ }
+}
+
+void sceneHandler38_hammerKick() {
+ if (!g_vars->scene38_shorty->_movement) {
+ if (g_vars->scene38_shorty->_flags & 4) {
+ if (!(g_vars->scene38_shorty->_flags & 2) && g_vars->scene38_shortyCounter > 1
+ && g_vars->scene38_shorty->_statics->_staticsId == ST_MLS_LEFT2
+ && g_fp->_rnd->getRandomNumber(32767) < 3276) {
+ chainQueue(QU_MLS_TURNR, 0);
+ g_vars->scene38_shortyCounter = 0;
+ }
+ }
+ }
+
+ g_vars->scene38_domino1->setOXY(g_vars->scene38_domino1->_ox, g_vars->scene38_domino1->_oy - 2);
+
+ if (g_vars->scene38_dominos->_statics->_staticsId == ST_DMS_3)
+ g_vars->scene38_dominos->startAnim(MV_DMS_THREE, 0, -1);
+ else if (g_vars->scene38_dominos->_statics->_staticsId == ST_DMS_4)
+ g_vars->scene38_dominos->startAnim(MV_DMS_FOUR, 0, -1);
+}
+
+void sceneHandler38_drink() {
+ if (!g_vars->scene38_shorty->_movement) {
+ if (g_vars->scene38_shorty->_flags & 4) {
+ if (!(g_vars->scene38_shorty->_flags & 2) && g_vars->scene38_shortyCounter > 0
+ && g_vars->scene38_shorty->_statics->_staticsId == ST_MLS_LEFT2
+ && g_fp->_rnd->getRandomNumber(32767) < 3276) {
+ chainQueue(QU_MLS_TURNR, 0);
+ g_vars->scene38_shortyCounter = 0;
+ }
+ }
+ }
+}
+
+void sceneHandler38_animateAlcoholics() {
+ MessageQueue *mq;
+
+ if (g_vars->scene38_boss->_movement || !(g_vars->scene38_boss->_flags & 4) || (g_vars->scene38_boss->_flags & 2)) {
+ g_vars->scene38_bossCounter = 0;
+ } else {
+ g_vars->scene38_bossCounter++;
+ }
+
+ if (g_vars->scene38_bossCounter >= 50) {
+ int bossSt = g_vars->scene38_boss->_statics->_staticsId;
+
+ if (bossSt == ST_GLV_SLEEP2) {
+ g_vars->scene38_bossCounter = 0;
+ } else if ((g_vars->scene38_domino0->_flags & 4) && g_vars->scene38_domino0->_statics->_staticsId == ST_DMN38_6) {
+ if (bossSt == ST_GLV_HAMMER) {
+ chainQueue(QU_GLV_TAKEDOMINO, 1);
+ g_vars->scene38_bossCounter = 0;
+ }
+
+ if (bossSt == ST_GLV_NOHAMMER) {
+ chainQueue(QU_GLV_TAKEDOMINO_NOHMR, 1);
+ g_vars->scene38_bossCounter = 0;
+ }
+ } else {
+ if ((g_vars->scene38_bottle->_flags & 4) && g_vars->scene38_bottle->_statics->_staticsId == ST_BTL38_FULL && bossSt == ST_GLV_NOHAMMER) {
+ chainQueue(QU_GLV_DRINKBOTTLE, 1);
+ g_vars->scene38_bossCounter = 0;
+ } else {
+ int bossAnim = 0;
+
+ if (g_fp->_rnd->getRandomNumber(32767) >= 1310 || g_vars->scene38_boss->_statics->_staticsId != ST_GLV_HAMMER) {
+ if (g_fp->_rnd->getRandomNumber(32767) >= 1310) {
+ if (g_fp->_rnd->getRandomNumber(32767) < 1310) {
+ if (bossSt == ST_GLV_HAMMER)
+ bossAnim = QU_GLV_DRINK;
+ else if (bossSt == ST_GLV_NOHAMMER)
+ bossAnim = QU_GLV_DRINK_NOHMR;
+ }
+ } else {
+ if (bossSt == ST_GLV_HAMMER)
+ bossAnim = QU_GLV_PROPOSE;
+ else if (bossSt == ST_GLV_NOHAMMER)
+ bossAnim = QU_GLV_PROPOSE_NOHMR;
+ }
+ } else {
+ bossAnim = QU_GLV_HMRKICK;
+ }
+
+ if (g_vars->scene38_lastBossAnim == bossAnim) {
+ g_vars->scene38_bossAnimCounter++;
+
+ if (g_vars->scene38_bossAnimCounter > 2)
+ bossAnim = 0;
+ } else {
+ g_vars->scene38_lastBossAnim = bossAnim;
+ g_vars->scene38_bossAnimCounter = 1;
+ }
+
+ if (bossAnim > 0) {
+ mq = new MessageQueue(g_fp->_currentScene->getMessageQueueById(bossAnim), 0, 0);
+
+ mq->chain(0);
+
+ g_vars->scene38_bossCounter = 0;
+ }
+ }
+ }
+ }
+
+ if (g_vars->scene38_tally->_movement || !(g_vars->scene38_tally->_flags & 4) || (g_vars->scene38_tally->_flags & 2)) {
+ g_vars->scene38_tallyCounter = 0;
+ } else {
+ g_vars->scene38_tallyCounter++;
+ }
+
+ if (g_vars->scene38_tallyCounter >= 50) {
+ int tallyAnim = 0;
+
+ if (g_fp->_rnd->getRandomNumber(32767) >= 1310) {
+ if (g_fp->_rnd->getRandomNumber(32767) >= 1310) {
+ if (g_fp->_rnd->getRandomNumber(32767) >= 1310) {
+ if (g_fp->_rnd->getRandomNumber(32767) < 1310)
+ tallyAnim = QU_DLD_ICK;
+ } else {
+ tallyAnim = QU_DLD_GLOT;
+ }
+ } else {
+ tallyAnim = QU_DLD_BLINK;
+ }
+ } else {
+ if (g_vars->scene38_domino1->_statics->_staticsId == ST_DMN38_NORM3) {
+ tallyAnim = QU_DLD_TAKE1;
+ } else if (g_vars->scene38_domino1->_statics->_staticsId == ST_DMN38_NORM4) {
+ tallyAnim = QU_DLD_TAKE2;
+ }
+ }
+
+ if (g_vars->scene38_lastTallyAnim == tallyAnim) {
+ g_vars->scene38_tallyAnimCounter++;
+
+ if (g_vars->scene38_tallyAnimCounter++ > 2)
+ tallyAnim = 0;
+ } else {
+ g_vars->scene38_lastTallyAnim = tallyAnim;
+ g_vars->scene38_tallyAnimCounter = 1;
+ }
+ if (tallyAnim > 0) {
+ mq = new MessageQueue(g_fp->_currentScene->getMessageQueueById(tallyAnim), 0, 0);
+
+ mq->chain(0);
+ g_vars->scene38_tallyCounter = 0;
+ }
+ }
+
+ if (g_vars->scene38_shorty->_movement || !(g_vars->scene38_shorty->_flags & 4) || (g_vars->scene38_shorty->_flags & 2)) {
+ g_vars->scene38_shortyCounter = 0;
+ return;
+ }
+
+ g_vars->scene38_shortyCounter++;
+
+ if (g_vars->scene38_shortyCounter < 50)
+ return;
+
+ int shortyAnim = 0;
+
+ if (g_fp->_rnd->getRandomNumber(32767) >= 1310) {
+ if (g_fp->_rnd->getRandomNumber(32767) >= 1310 || g_vars->scene38_shorty->_statics->_staticsId != ST_MLS_LEFT2) {
+ if (g_vars->scene38_boss->_statics->_staticsId != ST_GLV_SLEEP2 && g_vars->scene38_bossCounter > 30 && g_fp->_rnd->getRandomNumber(32767) < 0x3FFF && g_vars->scene38_shorty->_statics->_staticsId == ST_MLS_LEFT2)
+ shortyAnim = QU_MLS_HAND;
+ } else {
+ shortyAnim = QU_MLS_BLINK;
+ }
+ } else {
+ if (g_vars->scene38_shorty->_statics->_staticsId == ST_MLS_RIGHT2) {
+ shortyAnim = QU_MLS_TURNL;
+ } else if (g_vars->scene38_shorty->_statics->_staticsId == ST_MLS_LEFT2) {
+ shortyAnim = QU_MLS_TURNR;
+ }
+ }
+
+ if (g_vars->scene38_lastShortyAnim == shortyAnim) {
+ g_vars->scene38_shortyAnimCounter++;
+ if (g_vars->scene38_shortyAnimCounter > 2)
+ return;
+ } else {
+ g_vars->scene38_lastShortyAnim = shortyAnim;
+ g_vars->scene38_shortyAnimCounter = 1;
+ }
+
+ if (shortyAnim > 0) {
+ mq = new MessageQueue(g_fp->_currentScene->getMessageQueueById(shortyAnim), 0, 0);
+
+ mq->chain(0);
+
+ g_vars->scene38_shortyCounter = 0;
+ }
+}
+
+int sceneHandler38(ExCommand *cmd) {
+ if (cmd->_messageKind != 17)
+ return 0;
+
+ switch (cmd->_messageNum) {
+ case MSG_LIFT_EXITLIFT:
+ g_fp->lift_exitSeq(cmd);
+ break;
+
+ case MSG_LIFT_CLOSEDOOR:
+ g_fp->lift_closedoorSeq();
+ break;
+
+ case MSG_LIFT_STARTEXITQUEUE:
+ g_fp->lift_startExitQueue();
+ break;
+
+ case MSG_SC38_TRYTAKEBOTTLE:
+ sceneHandler38_tryTakeBottle();
+ break;
+
+ case MSG_SC38_POSTHMRKICK:
+ sceneHandler38_postHammerKick();
+ break;
+
+ case MSG_SC38_PROPOSE:
+ sceneHandler38_propose();
+ break;
+
+ case MSG_LIFT_CLICKBUTTON:
+ g_fp->lift_clickButton();
+ break;
+
+ case MSG_SC38_POINT:
+ sceneHandler38_point();
+ break;
+
+ case MSG_LIFT_GO:
+ g_fp->lift_goAnimation();
+ break;
+
+ case MSG_SC38_HMRKICK:
+ sceneHandler38_hammerKick();
+ break;
+
+ case MSG_SC38_DRINK:
+ sceneHandler38_drink();
+ break;
+
+ case 64:
+ g_fp->lift_hoverButton(cmd);
+ break;
+
+ case 29:
+ {
+ StaticANIObject *ani = g_fp->_currentScene->getStaticANIObjectAtPos(g_fp->_sceneRect.left + cmd->_x, g_fp->_sceneRect.top + cmd->_y);
+
+ if (ani && ani->_id == ANI_LIFTBUTTON) {
+ g_fp->lift_animateButton(ani);
+
+ cmd->_messageKind = 0;
+ }
+ break;
+ }
+
+ case 33:
+ if (g_fp->_aniMan2) {
+ int x = g_fp->_aniMan2->_ox;
+
+ if (x < g_fp->_sceneRect.left + 200)
+ g_fp->_currentScene->_x = x - 300 - g_fp->_sceneRect.left;
+
+ if (x > g_fp->_sceneRect.right - 200)
+ g_fp->_currentScene->_x = x + 300 - g_fp->_sceneRect.right;
+ }
+
+ sceneHandler38_animateAlcoholics();
+
+ g_fp->_behaviorManager->updateBehaviors();
+
+ g_fp->startSceneTrack();
+
+ break;
+ }
+
+ return 0;
+}
+
+} // End of namespace Fullpipe
diff --git a/engines/fullpipe/scenes/sceneDbg.cpp b/engines/fullpipe/scenes/sceneDbg.cpp
new file mode 100644
index 0000000000..bd53f5749f
--- /dev/null
+++ b/engines/fullpipe/scenes/sceneDbg.cpp
@@ -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.
+ *
+ */
+
+#include "fullpipe/fullpipe.h"
+
+#include "fullpipe/constants.h"
+
+#include "fullpipe/gameloader.h"
+#include "fullpipe/motion.h"
+#include "fullpipe/scenes.h"
+#include "fullpipe/statics.h"
+#include "fullpipe/input.h"
+
+#include "fullpipe/interaction.h"
+
+namespace Fullpipe {
+
+void sceneDbgMenu_initScene(Scene *sc) {
+ g_vars->selector = sc->getPictureObjectById(PIC_SCD_SEL, 0);
+ getGameLoaderInteractionController()->disableFlag24();
+ setInputDisabled(0);
+}
+
+GameObject *sceneHandlerDbgMenu_getObjectAtXY(int x, int y) {
+ if (g_fp->_currentScene)
+ for (uint i = 0; i < g_fp->_currentScene->_picObjList.size(); i++) {
+ PictureObject *pic = (PictureObject *)g_fp->_currentScene->_picObjList[i];
+
+ if (x >= pic->_ox && y >= pic->_oy) {
+ Common::Point point;
+
+ pic->getDimensions(&point);
+
+ if (x <= pic->_ox + point.x && y <= pic->_oy + point.y && pic != g_vars->selector)
+ return pic;
+ }
+ }
+
+ return 0;
+}
+
+int sceneHandlerDbgMenu(ExCommand *ex) {
+ if (ex->_messageKind != 17)
+ return 0;
+
+ int mx = g_fp->_mouseScreenPos.x + g_fp->_sceneRect.left;
+ int my = g_fp->_mouseScreenPos.y + g_fp->_sceneRect.top;
+
+ if (ex->_messageNum == 29) {
+ GameObject *obj = sceneHandlerDbgMenu_getObjectAtXY(mx, my);
+ if (obj && canInteractAny(0, obj, -3) ) {
+ getGameLoaderInteractionController()->enableFlag24();
+ handleObjectInteraction(0, obj, 0);
+ }
+ return 0;
+ }
+ if (ex->_messageNum != 33) {
+ if (ex->_messageNum == MSG_RESTARTGAME) {
+ g_fp->_needRestart = true;
+ return 0;
+ }
+ return 0;
+ }
+
+ g_fp->_cursorId = PIC_CSR_DEFAULT;
+ GameObject *obj = g_fp->_currentScene->getStaticANIObjectAtPos(mx, my);
+ if (obj) {
+ if (canInteractAny(0, obj, -3)) {
+ g_fp->_cursorId = PIC_CSR_DEFAULT;
+ g_fp->setCursor(PIC_CSR_DEFAULT);
+ return 0;
+ }
+ } else {
+ obj = sceneHandlerDbgMenu_getObjectAtXY(mx, my);
+ if (obj && canInteractAny(0, obj, -3) ) {
+ g_vars->selector->_flags |= 4;
+ g_vars->selector->setOXY(obj->_ox, obj->_oy);
+ g_fp->_cursorId = PIC_CSR_DEFAULT;
+ g_fp->setCursor(PIC_CSR_DEFAULT);
+ return 0;
+ }
+ g_vars->selector->_flags &= 0xFFFB;
+ }
+ g_fp->setCursor(g_fp->_cursorId);
+
+ return 0;
+}
+
+} // End of namespace Fullpipe
diff --git a/engines/fullpipe/scenes/sceneFinal.cpp b/engines/fullpipe/scenes/sceneFinal.cpp
new file mode 100644
index 0000000000..d0040463ef
--- /dev/null
+++ b/engines/fullpipe/scenes/sceneFinal.cpp
@@ -0,0 +1,174 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public 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 "fullpipe/fullpipe.h"
+
+#include "fullpipe/objectnames.h"
+#include "fullpipe/constants.h"
+
+#include "fullpipe/gameloader.h"
+#include "fullpipe/motion.h"
+#include "fullpipe/scenes.h"
+#include "fullpipe/statics.h"
+
+#include "fullpipe/interaction.h"
+#include "fullpipe/behavior.h"
+
+#include "fullpipe/modal.h"
+
+
+namespace Fullpipe {
+
+void sceneFinal_initScene() {
+ g_fp->_gameLoader->loadScene(SC_FINAL2);
+ g_fp->accessScene(SC_FINAL2)->setPictureObjectsFlag4();
+ g_fp->_gameLoader->loadScene(SC_FINAL3);
+ g_fp->accessScene(SC_FINAL3)->setPictureObjectsFlag4();
+ g_fp->_gameLoader->loadScene(SC_FINAL4);
+ g_fp->accessScene(SC_FINAL4)->setPictureObjectsFlag4();
+
+ getGameLoaderInventory()->setIsLocked(0);
+ getGameLoaderInventory()->slideIn();
+
+ g_fp->_updateFlag = 0;
+ g_fp->_flgCanOpenMap = 0;
+
+ g_vars->sceneFinal_var01 = 0;
+ g_vars->sceneFinal_var02 = 0;
+ g_vars->sceneFinal_var03 = 0;
+}
+
+int sceneFinal_updateCursor() {
+ if (g_vars->sceneFinal_var01)
+ g_fp->_cursorId = 0;
+ else
+ g_fp->updateCursorCommon();
+
+ return g_fp->_cursorId;
+}
+
+void sceneHandlerFinal_endFinal() {
+ g_vars->sceneFinal_var01 = 0;
+}
+
+void sceneHandlerFinal_startMusic(const char *track) {
+ warning("STUB: sceneHandlerFinal_startMusic()");
+}
+
+void sceneHandlerFinal_goto4() {
+ g_fp->_currentScene = g_fp->accessScene(SC_FINAL4);
+
+ g_fp->_gameLoader->loadScene(SC_FINAL4);
+
+ chainQueue(QU_FN4_DOFINAL, 1);
+}
+
+void sceneHandlerFinal_goto3() {
+ g_fp->_currentScene = g_fp->accessScene(SC_FINAL3);
+
+ chainQueue(QU_FN3_DOFINAL, 1);
+}
+
+void sceneHandlerFinal_goto2() {
+ g_fp->_currentScene = g_fp->accessScene(SC_FINAL2);
+
+ chainQueue(QU_FN2_DOFINAL, 1);
+}
+
+void sceneHandlerFinal_startFinal() {
+ g_vars->sceneFinal_var01 = 1;
+
+ getCurrSceneSc2MotionController()->clearEnabled();
+ getGameLoaderInteractionController()->disableFlag24();
+
+ g_fp->_aniMan2 = 0;
+
+ g_fp->_aniMan->_flags &= 0xFFFB;
+
+ chainQueue(QU_FIN1_TAKECOIN, 1);
+
+ g_fp->playTrack(g_fp->getGameLoaderGameVar()->getSubVarByName("SC_FINAL1"), "MUSIC2", 1);
+
+ g_fp->_modalObject = new ModalFinal;
+}
+
+void sceneHandlerFinal_fallCoin() {
+ StaticANIObject *coin = g_fp->_currentScene->getStaticANIObject1ById(ANI_FIN_COIN, -1);
+
+ if (!coin->_movement) {
+ if (!coin->_statics || coin->_statics->_staticsId != ST_FCN_NORM)
+ chainQueue(QU_FIN1_FALLCOIN, 1);
+ }
+}
+
+int sceneHandlerFinal(ExCommand *cmd) {
+ if (cmd->_messageKind != 17)
+ return 0;
+
+ switch (cmd->_messageNum) {
+ case MSG_FIN_ENDFINAL:
+ sceneHandlerFinal_endFinal();
+ break;
+
+ case MSG_FN4_STARTMUSIC:
+ sceneHandlerFinal_startMusic("track16.ogg");
+ break;
+
+ case MSG_FIN_GOTO4:
+ sceneHandlerFinal_goto4();
+
+ g_fp->playTrack(g_fp->getGameLoaderGameVar()->getSubVarByName("SC_FINAL1"), "MUSIC3", 1);
+ break;
+
+ case MSG_FIN_GOTO3:
+ sceneHandlerFinal_goto3();
+ break;
+
+ case MSG_FIN_GOTO2:
+ sceneHandlerFinal_goto2();
+ break;
+
+ case MSG_FIN_STARTFINAL:
+ sceneHandlerFinal_startFinal();
+ break;
+
+ case 33:
+ if (g_fp->_aniMan2) {
+ g_vars->sceneFinal_var03 = g_fp->_aniMan2->_ox;
+
+ if (g_vars->sceneFinal_var03 < 450 && g_vars->sceneFinal_var02 >= 450 )
+ sceneHandlerFinal_fallCoin();
+
+ g_vars->sceneFinal_var02 = g_vars->sceneFinal_var03;
+ }
+
+ g_fp->_behaviorManager->updateBehaviors();
+
+ g_fp->startSceneTrack();
+
+ break;
+ }
+
+ return 0;
+}
+
+} // End of namespace Fullpipe
diff --git a/engines/fullpipe/scenes/sceneIntro.cpp b/engines/fullpipe/scenes/sceneIntro.cpp
new file mode 100644
index 0000000000..5e69cf1d7a
--- /dev/null
+++ b/engines/fullpipe/scenes/sceneIntro.cpp
@@ -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.
+ *
+ */
+
+#include "fullpipe/fullpipe.h"
+
+#include "fullpipe/constants.h"
+#include "fullpipe/gameloader.h"
+#include "fullpipe/motion.h"
+#include "fullpipe/scenes.h"
+#include "fullpipe/modal.h"
+#include "fullpipe/statics.h"
+
+namespace Fullpipe {
+
+int sceneIntro_updateCursor() {
+ g_fp->_cursorId = 0;
+
+ return 0;
+}
+
+void sceneIntro_initScene(Scene *sc) {
+ g_fp->_gameLoader->loadScene(SC_INTRO2);
+
+ g_vars->sceneIntro_aniin1man = sc->getStaticANIObject1ById(ANI_IN1MAN, -1);
+ g_vars->sceneIntro_needSleep = true;
+ g_vars->sceneIntro_needGetup = false;
+ g_vars->sceneIntro_playing = true;
+ g_vars->sceneIntro_needBlackout = false;
+
+ if (g_fp->_recordEvents || g_fp->_inputArFlag)
+ g_vars->sceneIntro_skipIntro = false;
+
+ g_fp->_modalObject = new ModalIntro;
+}
+
+void sceneHandlerIntro_part1() {
+ g_fp->_currentScene = g_fp->accessScene(SC_INTRO1);
+ chainQueue(QU_INTR_FINISH, 0);
+}
+
+void sceneHandlerIntro_part2() {
+ g_fp->_currentScene = g_fp->accessScene(SC_INTRO2);
+ chainQueue(QU_IN2_DO, 0);
+}
+
+int sceneHandlerIntro(ExCommand *ex) {
+ if (ex->_messageKind != 17)
+ return 0;
+
+ switch (ex->_messageNum) {
+ case MSG_INTR_ENDINTRO:
+ g_vars->sceneIntro_playing = 0;
+ return 0;
+
+ case MSG_INTR_SWITCHTO1:
+ sceneHandlerIntro_part1();
+ return 0;
+
+ case MSG_INTR_GETUPMAN:
+ g_vars->sceneIntro_needSleep = 0;
+ g_vars->sceneIntro_needGetup = 1;
+ return 0;
+
+ case MSG_INTR_SWITCHTO2:
+ sceneHandlerIntro_part2();
+ return 0;
+
+ case 33:
+ // fall through
+ break;
+
+ default:
+ return 0;
+ }
+
+ if (g_vars->sceneIntro_needSleep) {
+ if (!g_vars->sceneIntro_aniin1man->_movement && g_vars->sceneIntro_aniin1man->_statics->_staticsId == ST_IN1MAN_SLEEP)
+ g_vars->sceneIntro_aniin1man->startAnim(MV_IN1MAN_SLEEP, 0, -1);
+ } else if (g_vars->sceneIntro_needGetup && !g_vars->sceneIntro_aniin1man->_movement &&
+ g_vars->sceneIntro_aniin1man->_statics->_staticsId == ST_IN1MAN_SLEEP) {
+ g_vars->sceneIntro_needGetup = 0;
+
+ chainQueue(QU_INTR_GETUPMAN, 0);
+ }
+
+ g_fp->startSceneTrack();
+
+ return 0;
+}
+
+} // End of namespace Fullpipe
diff --git a/engines/fullpipe/sound.cpp b/engines/fullpipe/sound.cpp
index 6da848a621..a4ca06f489 100644
--- a/engines/fullpipe/sound.cpp
+++ b/engines/fullpipe/sound.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -23,8 +23,16 @@
#include "fullpipe/fullpipe.h"
#include "fullpipe/objects.h"
+#include "fullpipe/scene.h"
#include "fullpipe/sound.h"
#include "fullpipe/ngiarchive.h"
+#include "fullpipe/messages.h"
+#include "fullpipe/statics.h"
+
+#include "common/memstream.h"
+#include "audio/audiostream.h"
+#include "audio/decoders/vorbis.h"
+#include "audio/decoders/wave.h"
namespace Fullpipe {
@@ -68,6 +76,18 @@ bool SoundList::loadFile(const char *fname, char *libname) {
return load(archive, libname);
}
+Sound *SoundList::getSoundItemById(int id) {
+ if (_soundItemsCount == 0) {
+ return _soundItems[0]->getId() != id ? 0 : _soundItems[0];
+ }
+
+ for (int i = 0; i < _soundItemsCount; i++) {
+ if (_soundItems[i]->getId() == id)
+ return _soundItems[i];
+ }
+ return NULL;
+}
+
Sound::Sound() {
_id = 0;
_directSoundBuffer = 0;
@@ -75,8 +95,14 @@ Sound::Sound() {
_objectId = 0;
memset(_directSoundBuffers, 0, sizeof(_directSoundBuffers));
_description = 0;
+ _volume = 100;
}
+Sound::~Sound() {
+ freeSound();
+
+ free(_description);
+}
bool Sound::load(MfcArchive &file, NGIArchive *archive) {
debug(5, "Sound::load()");
@@ -86,7 +112,7 @@ bool Sound::load(MfcArchive &file, NGIArchive *archive) {
_id = file.readUint32LE();
_description = file.readPascalString();
- assert(g_fullpipe->_gameProjectVersion >= 6);
+ assert(g_fp->_gameProjectVersion >= 6);
_objectId = file.readUint16LE();
@@ -108,33 +134,394 @@ void Sound::updateVolume() {
}
void Sound::setPanAndVolumeByStaticAni() {
- debug(3, "STUB Sound::setPanAndVolumeByStaticAni()");
+ if (!_objectId)
+ return;
+
+ StaticANIObject *ani = g_fp->_currentScene->getStaticANIObject1ById(_objectId, -1);
+ if (!ani)
+ return;
+
+ int a, b;
+
+ if (ani->_ox >= g_fp->_sceneRect.left) {
+ int par, pan;
+
+ if (ani->_ox <= g_fp->_sceneRect.right) {
+ int dx;
+
+ if (ani->_oy <= g_fp->_sceneRect.bottom) {
+ if (ani->_oy >= g_fp->_sceneRect.top) {
+ setPanAndVolume(g_fp->_sfxVolume, 0);
+
+ return;
+ }
+ dx = g_fp->_sceneRect.top - ani->_oy;
+ } else {
+ dx = ani->_oy - g_fp->_sceneRect.bottom;
+ }
+
+ par = 0;
+
+ if (dx > 800) {
+ setPanAndVolume(-3500, 0);
+ return;
+ }
+
+ pan = -3500;
+ a = g_fp->_sfxVolume - (-3500);
+ b = 800 - dx;
+ } else {
+ int dx = ani->_ox - g_fp->_sceneRect.right;
+
+ if (dx > 800) {
+ setPanAndVolume(-3500, 0);
+ return;
+ }
+
+ pan = -3500;
+ par = dx * (-3500) / -800;
+ a = g_fp->_sfxVolume - (-3500);
+ b = 800 - dx;
+ }
+
+ int32 pp = b * a;
+
+ setPanAndVolume(pan + pp / 800, par);
+
+ return;
+ }
+
+ int dx = g_fp->_sceneRect.left - ani->_ox;
+ if (dx <= 800) {
+ int32 s = (800 - dx) * (g_fp->_sfxVolume - (-3500));
+ int32 p = -3500 + s / 800;
+
+ if (p > g_fp->_sfxVolume)
+ p = g_fp->_sfxVolume;
+
+ setPanAndVolume(p, dx * (-3500) / 800);
+ } else {
+ setPanAndVolume(-3500, 0);
+ }
+}
+
+void Sound::setPanAndVolume(int vol, int pan) {
+ g_fp->_mixer->setChannelVolume(_handle, vol / 39); // 0..10000
+ g_fp->_mixer->setChannelBalance(_handle, pan / 78); // -10000..10000
}
-void FullpipeEngine::setSceneMusicParameters(GameVar *var) {
+void Sound::play(int flag) {
+ Audio::SoundHandle handle = getHandle();
+
+ if (g_fp->_mixer->isSoundHandleActive(handle))
+ return;
+
+ byte *soundData = loadData();
+ Common::MemoryReadStream *dataStream = new Common::MemoryReadStream(soundData, getDataSize());
+ Audio::RewindableAudioStream *wav = Audio::makeWAVStream(dataStream, DisposeAfterUse::YES);
+ Audio::AudioStream *audioStream = new Audio::LoopingAudioStream(wav, (flag == 1) ? 0 : 1);
+
+ g_fp->_mixer->playStream(Audio::Mixer::kSFXSoundType, &handle, audioStream);
+}
+
+void Sound::freeSound() {
+ stop();
+
+ free(_soundData);
+}
+
+int Sound::getVolume() {
+ return g_fp->_mixer->getChannelVolume(_handle) * 39; // 0..10000
+}
+
+void Sound::stop() {
+ g_fp->_mixer->stopHandle(_handle);
+}
+
+void FullpipeEngine::setSceneMusicParameters(GameVar *gvar) {
warning("STUB: FullpipeEngine::setSceneMusicParameters()");
+#if 0
+ stopSoundStream2();
+
+ if (soundStream3)
+ FSOUND_Stream_Stop(soundStream4);
+#endif
+
+ if (_musicLocal)
+ stopAllSoundStreams();
+
+ GameVar *var = gvar->getSubVarByName("MUSIC");
+
+ memset(_sceneTracks, 0, sizeof(_sceneTracks));
+
+ _numSceneTracks = 0;
+ _sceneTrackHasSequence = false;
+
+ if (!var)
+ return;
+
+ _musicGameVar = var;
+
+ GameVar *tr = var->getSubVarByName("TRACKS");
+ if (tr) {
+ GameVar *sub = tr->_subVars;
+
+ while (sub) {
+ if (_musicAllowed & sub->_value.intValue) {
+ Common::strlcpy(_sceneTracks[_numSceneTracks], sub->_varName, 260);
+
+ _numSceneTracks++;
+ }
+
+ sub = sub->_nextVarObj;
+ }
+ }
+
+ _musicMinDelay = var->getSubVarAsInt("MINDELAY");
+ _musicMaxDelay = var->getSubVarAsInt("MAXDELAY");
+ _musicLocal = var->getSubVarAsInt("LOCAL");
+
+ GameVar *seq = var->getSubVarByName("SEQUENCE");
+
+ if (seq) {
+ _sceneTrackHasSequence = true;
+
+ Common::strlcpy(_trackName, seq->_value.stringValue, 2600);
+ }
+
+ if (_musicLocal)
+ stopAllSoundStreams();
+
+ if (!_sceneTrackIsPlaying || _musicLocal)
+ _trackStartDelay = var->getSubVarAsInt("STARTDELAY");
}
void FullpipeEngine::startSceneTrack() {
- debug(3, "STUB: FullpipeEngine::startSceneTrack()");
+ if (!_sceneTrackIsPlaying && _numSceneTracks > 0) {
+ if (_trackStartDelay > 0) {
+ _trackStartDelay--;
+ } else {
+ int trackNum = getSceneTrack();
+
+ if (trackNum == -1) {
+ strcpy(_sceneTracksCurrentTrack, "silence");
+
+ _trackStartDelay = 2880;
+ _sceneTrackIsPlaying = 0;
+ } else {
+ strcpy(_sceneTracksCurrentTrack, _sceneTracks[trackNum]);
+
+ startSoundStream1(_sceneTracksCurrentTrack);
+
+ _sceneTrackIsPlaying = true;
+ }
+ }
+ }
+}
+
+int FullpipeEngine::getSceneTrack() {
+ int res;
+
+ if (_sceneTrackHasSequence) {
+ int num = _musicGameVar->getSubVarAsInt("TRACKS");
+
+ if (_trackName[num + 1] == 's') { // 'silence'
+ res = -1;
+ } else {
+ res = _trackName[num + 1] - '0';
+
+ if (res < 0 || res >= _numSceneTracks)
+ res = 0;
+ }
+
+ int track = num + 1;
+
+ if (!_trackName[num + 2])
+ track = 0;
+
+ _musicGameVar->setSubVarAsInt("TRACKS", track);
+ } else {
+ res = _numSceneTracks * (_updateTicks % 10) / 10;
+ }
+
+ return res;
+}
+
+void FullpipeEngine::startSoundStream1(char *trackName) {
+ warning("STUB: FullpipeEngine::startSoundStream1(%s)", trackName);
+
+ stopAllSoundStreams();
+
+#ifdef USE_VORBIS
+ if (_mixer->isSoundHandleActive(_sceneTrackHandle))
+ return;
+
+ Common::File *track = new Common::File();
+ if (!track->open(trackName)) {
+ warning("Could not open %s", trackName);
+ delete track;
+ return;
+ }
+ Audio::RewindableAudioStream *ogg = Audio::makeVorbisStream(track, DisposeAfterUse::YES);
+ _mixer->playStream(Audio::Mixer::kMusicSoundType, &_sceneTrackHandle, ogg);
+#endif
}
void FullpipeEngine::stopAllSounds() {
- warning("STUB: FullpipeEngine::stopAllSounds()");
+ // _mixer->stopAll();
+
+ for (int i = 0; i < _currSoundListCount; i++)
+ for (int j = 0; j < _currSoundList1[i]->getCount(); j++) {
+ _currSoundList1[i]->getSoundByIndex(j)->stop();
+ }
}
void FullpipeEngine::toggleMute() {
- warning("STUB: FullpipeEngine::toggleMute()");
+ if (_soundEnabled) {
+ _sfxVolume = _sfxVolume != -10000 ? -10000 : 0;
+
+ updateSoundVolume();
+ }
}
void FullpipeEngine::playSound(int id, int flag) {
- warning("STUB: FullpipeEngine::playSounds(%d, %d)", id, flag);
+ Sound *sound = 0;
+
+ for (int i = 0; i < _currSoundListCount; i++) {
+ sound = _currSoundList1[i]->getSoundItemById(id);
+
+ if (sound)
+ break;
+ }
+
+ if (!sound) {
+ warning("playSound: Can't find sound with ID %d", id);
+ return;
+ }
+
+ sound->play(flag);
+}
+
+void FullpipeEngine::playTrack(GameVar *sceneVar, const char *name, bool delayed) {
+ warning("STUB: FullpipeEngine::playTrack(var, %s, %d)", name, delayed);
+#if 0
+ stopSoundStream2();
+
+ if (soundStream3)
+ FSOUND_Stream_Stop(soundStream4);
+#endif
+
+ if (_musicLocal)
+ stopAllSoundStreams();
+
+ GameVar *var = sceneVar->getSubVarByName(name);
+
+ memset(_sceneTracks, 0, sizeof(_sceneTracks));
+
+ _numSceneTracks = 0;
+ _sceneTrackHasSequence = false;
+
+ if (!var)
+ return;
+
+ _musicGameVar = var;
+
+ GameVar *tr = var->getSubVarByName("TRACKS");
+ if (tr) {
+ GameVar *sub = tr->_subVars;
+
+ while (sub) {
+ if (_musicAllowed & sub->_value.intValue) {
+ Common::strlcpy(_sceneTracks[_numSceneTracks], sub->_varName, 260);
+
+ _numSceneTracks++;
+ }
+
+ sub = sub->_nextVarObj;
+ }
+ }
+
+ _musicMinDelay = var->getSubVarAsInt("MINDELAY");
+ _musicMaxDelay = var->getSubVarAsInt("MAXDELAY");
+ _musicLocal = var->getSubVarAsInt("LOCAL");
+
+ GameVar *seq = var->getSubVarByName("SEQUENCE");
+
+ if (seq) {
+ _sceneTrackHasSequence = true;
+
+ Common::strlcpy(_trackName, seq->_value.stringValue, 2600);
+ }
+
+ if (delayed) {
+ if (_sceneTrackIsPlaying && _numSceneTracks == 1) {
+ if (strcmp(_sceneTracksCurrentTrack, _sceneTracks[0]))
+ stopAllSoundStreams();
+ }
+
+ _trackStartDelay = var->getSubVarAsInt("STARTDELAY");
+ }
}
void global_messageHandler_handleSound(ExCommand *cmd) {
- debug(0, "STUB: global_messageHandler_handleSound()");
+ if (!g_fp->_soundEnabled)
+ return;
+
+ Sound *snd = 0;
+
+ for (int i = 0; i < g_fp->_currSoundListCount; i++)
+ snd = g_fp->_currSoundList1[i]->getSoundItemById(cmd->_messageNum);
+
+ if (!snd)
+ return;
+
+ if (cmd->_field_14 & 1) {
+ if (!g_fp->_flgSoundList && (cmd->_field_14 & 4))
+ snd->freeSound();
+
+ snd->updateVolume();
+
+ if (snd->_objectId && g_fp->_currentScene->getStaticANIObject1ById(snd->_objectId, -1))
+ snd->setPanAndVolumeByStaticAni();
+ else
+ snd->setPanAndVolume(g_fp->_sfxVolume, 0);
+
+ if (snd->getVolume() > -3500)
+ snd->play(cmd->_keyCode);
+ } else if (cmd->_field_14 & 2) {
+ snd->stop();
+ }
+}
+
+void FullpipeEngine::stopSoundStream2() {
+ warning("STUB: FullpipeEngine::stopSoundStream2()");
}
+void FullpipeEngine::stopAllSoundStreams() {
+ // TODO: Differences from stopAllSounds()
+ _mixer->stopAll();
+}
+void FullpipeEngine::stopAllSoundInstances(int id) {
+ for (int i = 0; i < _currSoundListCount; i++) {
+ Sound *sound = _currSoundList1[i]->getSoundItemById(id);
+
+ if (sound)
+ sound->stop();
+ }
+}
+
+void FullpipeEngine::updateSoundVolume() {
+ for (int i = 0; i < _currSoundListCount; i++)
+ for (int j = 0; i < _currSoundList1[i]->getCount(); j++) {
+ _currSoundList1[i]->getSoundByIndex(j)->setPanAndVolume(_sfxVolume, 0);
+ }
+}
+
+void FullpipeEngine::setMusicVolume(int vol) {
+ _musicVolume = vol;
+
+ g_fp->_mixer->setVolumeForSoundType(Audio::Mixer::kMusicSoundType, vol);
+}
} // End of namespace Fullpipe
diff --git a/engines/fullpipe/sound.h b/engines/fullpipe/sound.h
index e2b271fe2c..14e766f5bb 100644
--- a/engines/fullpipe/sound.h
+++ b/engines/fullpipe/sound.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -28,18 +28,32 @@ namespace Fullpipe {
class Sound : public MemoryObject {
int _id;
char *_description;
- int16 _objectId;
int _directSoundBuffer;
int _directSoundBuffers[7];
byte *_soundData;
+ Audio::SoundHandle _handle;
+ int _volume;
- public:
+public:
+ int16 _objectId;
+
+public:
Sound();
+ virtual ~Sound();
+
virtual bool load(MfcArchive &file, NGIArchive *archive);
virtual bool load(MfcArchive &file) { assert(0); return false; } // Disable base class
void updateVolume();
+ int getId() const { return _id; }
+ Audio::SoundHandle getHandle() const { return _handle; }
+
+ void play(int flag);
+ void freeSound();
+ int getVolume();
+ void stop();
void setPanAndVolumeByStaticAni();
+ void setPanAndVolume(int vol, int pan);
};
class SoundList : public CObject {
@@ -55,6 +69,7 @@ class SoundList : public CObject {
int getCount() { return _soundItemsCount; }
Sound *getSoundByIndex(int idx) { return _soundItems[idx]; }
+ Sound *getSoundItemById(int id);
};
} // End of namespace Fullpipe
diff --git a/engines/fullpipe/stateloader.cpp b/engines/fullpipe/stateloader.cpp
index 747015e9a1..141196c7d7 100644
--- a/engines/fullpipe/stateloader.cpp
+++ b/engines/fullpipe/stateloader.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -31,6 +31,7 @@
#include "fullpipe/scene.h"
#include "fullpipe/statics.h"
#include "fullpipe/interaction.h"
+#include "fullpipe/gameloader.h"
#include "fullpipe/constants.h"
@@ -54,9 +55,8 @@ bool FullpipeEngine::loadGam(const char *fname, int scene) {
_inventory->rebuildItemRects();
- for (PtrList::iterator p = _inventory->getScene()->_picObjList.begin(); p != _inventory->getScene()->_picObjList.end(); ++p) {
- ((MemoryObject *)((PictureObject *)*p)->_picture)->load();
- }
+ for (uint i = 0; i < _inventory->getScene()->_picObjList.size(); i++)
+ ((MemoryObject *)_inventory->getScene()->_picObjList[i]->_picture)->load();
// _sceneSwitcher = sceneSwitcher; // substituted with direct call
_gameLoader->_preloadCallback = preloadCallback;
@@ -82,8 +82,11 @@ bool FullpipeEngine::loadGam(const char *fname, int scene) {
setMusicAllowed(_gameLoader->_gameVar->getSubVarAsInt("MUSIC_ALLOWED"));
if (scene) {
- _gameLoader->loadScene(scene);
- _gameLoader->gotoScene(scene, TrubaLeft);
+ _gameLoader->loadScene(726);
+ _gameLoader->gotoScene(726, TrubaLeft);
+
+ if (scene != 726)
+ _gameLoader->preloadScene(726, getSceneEntrance(scene));
} else {
if (_flgPlayIntro) {
_gameLoader->loadScene(SC_INTRO1);
@@ -115,25 +118,25 @@ bool GameProject::load(MfcArchive &file) {
_headerFilename = 0;
_field_10 = 12;
- g_fullpipe->_gameProjectVersion = file.readUint32LE();
- g_fullpipe->_pictureScale = file.readUint16LE();
- g_fullpipe->_scrollSpeed = file.readUint32LE();
+ g_fp->_gameProjectVersion = file.readUint32LE();
+ g_fp->_pictureScale = file.readUint16LE();
+ g_fp->_scrollSpeed = file.readUint32LE();
_headerFilename = file.readPascalString();
- debug(1, "_gameProjectVersion = %d", g_fullpipe->_gameProjectVersion);
- debug(1, "_pictureScale = %d", g_fullpipe->_pictureScale);
- debug(1, "_scrollSpeed = %d", g_fullpipe->_scrollSpeed);
+ debug(1, "_gameProjectVersion = %d", g_fp->_gameProjectVersion);
+ debug(1, "_pictureScale = %d", g_fp->_pictureScale);
+ debug(1, "_scrollSpeed = %d", g_fp->_scrollSpeed);
debug(1, "_headerFilename = %s", _headerFilename);
_sceneTagList = new SceneTagList();
_sceneTagList->load(file);
- if (g_fullpipe->_gameProjectVersion >= 3)
+ if (g_fp->_gameProjectVersion >= 3)
_field_4 = file.readUint32LE();
- if (g_fullpipe->_gameProjectVersion >= 5) {
+ if (g_fp->_gameProjectVersion >= 5) {
file.readUint32LE();
file.readUint32LE();
}
@@ -143,6 +146,8 @@ bool GameProject::load(MfcArchive &file) {
GameProject::~GameProject() {
free(_headerFilename);
+
+ delete _sceneTagList;
}
GameVar::GameVar() {
@@ -156,6 +161,46 @@ GameVar::GameVar() {
_varName = 0;
}
+GameVar::~GameVar() {
+ if (_varType == 2)
+ free(_value.stringValue);
+
+ if (_parentVarObj && !_prevVarObj ) {
+ if (_parentVarObj->_subVars == this) {
+ _parentVarObj->_subVars = _nextVarObj;
+ } else if (_parentVarObj->_field_14 == this) {
+ _parentVarObj->_field_14 = _nextVarObj;
+ } else {
+ _parentVarObj = 0;
+ }
+ }
+
+ if (_prevVarObj)
+ _prevVarObj->_nextVarObj = _nextVarObj;
+
+ if (_nextVarObj)
+ _nextVarObj->_prevVarObj = _prevVarObj;
+
+ _prevVarObj = 0;
+ _nextVarObj = 0;
+
+ GameVar *s = _subVars;
+
+ while (s) {
+ delete s;
+ s = _subVars;
+ }
+
+ s = _field_14;
+
+ while (s) {
+ delete s;
+ s = _field_14;
+ }
+
+ free(_varName);
+}
+
bool GameVar::load(MfcArchive &file) {
_varName = file.readPascalString();
_varType = file.readUint32LE();
diff --git a/engines/fullpipe/statics.cpp b/engines/fullpipe/statics.cpp
index 0e9daadd45..292ef08914 100644
--- a/engines/fullpipe/statics.cpp
+++ b/engines/fullpipe/statics.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -27,6 +27,7 @@
#include "fullpipe/statics.h"
#include "fullpipe/messages.h"
#include "fullpipe/interaction.h"
+#include "fullpipe/motion.h"
#include "fullpipe/constants.h"
#include "fullpipe/objectnames.h"
@@ -73,6 +74,27 @@ Common::Point *StepArray::getCurrPoint(Common::Point *point) {
return point;
}
+Common::Point *StepArray::getPoint(Common::Point *point, int index, int offset) {
+ if (index == -1)
+ index = _currPointIndex;
+
+ if (index + offset > _maxPointIndex - 1)
+ offset = _maxPointIndex - index;
+
+ point->x = 0;
+ point->y = 0;
+
+ while (offset >= 1) {
+ point->x += _points[index]->x;
+ point->y += _points[index]->y;
+
+ index++;
+ offset--;
+ }
+
+ return point;
+}
+
bool StepArray::gotoNextPoint() {
if (_currPointIndex < _maxPointIndex) {
_currPointIndex++;
@@ -83,6 +105,19 @@ bool StepArray::gotoNextPoint() {
}
}
+void StepArray::insertPoints(Common::Point **points, int pointsCount) {
+ if (_currPointIndex + pointsCount >= _pointsCount)
+ _points = (Common::Point **)realloc(_points, sizeof(Common::Point *) * (_currPointIndex + pointsCount));
+
+ _maxPointIndex = _currPointIndex + pointsCount;
+
+ for (int i = 0; i < pointsCount; i++) {
+ _points[_currPointIndex + i] = new Common::Point;
+
+ *_points[_currPointIndex + i] = *points[i];
+ }
+}
+
StaticANIObject::StaticANIObject() {
_shadowsOn = 1;
_field_30 = 0;
@@ -105,6 +140,20 @@ StaticANIObject::StaticANIObject() {
_objtype = kObjTypeStaticANIObject;
}
+StaticANIObject::~StaticANIObject() {
+ for (uint i = 0; i < _staticsList.size(); i++)
+ delete _staticsList[i];
+
+ _staticsList.clear();
+
+ for (uint i = 0; i < _movements.size(); i++)
+ delete _movements[i];
+
+ _movements.clear();
+
+ g_fp->_mgm->clear();
+}
+
StaticANIObject::StaticANIObject(StaticANIObject *src) : GameObject(src) {
_shadowsOn = src->_shadowsOn;
_field_30 = src->_field_30;
@@ -125,21 +174,24 @@ StaticANIObject::StaticANIObject(StaticANIObject *src) : GameObject(src) {
_objtype = kObjTypeStaticANIObject;
for (uint i = 0; i < src->_staticsList.size(); i++)
- _staticsList.push_back(new Statics((Statics *)src->_staticsList[i], 0));
+ _staticsList.push_back(new Statics(src->_staticsList[i], 0));
_movement = 0;
_statics = 0;
for (uint i = 0; i < src->_movements.size(); i++) {
- Movement *mov;
- if (((Movement *)src->_movements[i])->_currMovement) {
- mov = new Movement(getMovementById(src->getMovementIdById(((Movement *)src->_movements[i])->_id)), this);
- mov->_id = ((Movement *)src->_movements[i])->_id;
+ Movement *newmov;
+
+ if (src->_movements[i]->_currMovement) {
+ // WORKAROUND: Original uses weird construction here:
+ // new Movement(getMovementById(src->getMovementIdById(mov->_id)), this);
+ newmov = new Movement(src->getMovementById(src->getMovementIdById(src->_movements[i]->_id)), this);
+ newmov->_id = src->_movements[i]->_id;
} else {
- mov = new Movement(((Movement *)src->_movements[i]), 0, -1, this);
+ newmov = new Movement(src->_movements[i], 0, -1, this);
}
- _movements.push_back(mov);
+ _movements.push_back(newmov);
}
}
@@ -165,7 +217,7 @@ bool StaticANIObject::load(MfcArchive &file) {
char *movname = genFileName(_id, movNum, "mov");
- Common::SeekableReadStream *f = g_fullpipe->_currArchive->createReadStreamForMember(movname);
+ Common::SeekableReadStream *f = g_fp->_currArchive->createReadStreamForMember(movname);
Movement *mov = new Movement();
@@ -181,7 +233,7 @@ bool StaticANIObject::load(MfcArchive &file) {
Common::Point pt;
if (count) { // We have movements
- ((Movement *)_movements[0])->getCurrDynamicPhaseXY(pt);
+ _movements[0]->getCurrDynamicPhaseXY(pt);
} else {
pt.x = pt.y = 100;
}
@@ -223,19 +275,22 @@ void StaticANIObject::setFlags40(bool state) {
void StaticANIObject::deleteFromGlobalMessageQueue() {
while (_messageQueueId) {
- if (g_fullpipe->_globalMessageQueueList->getMessageQueueById(_messageQueueId)) {
+ if (g_fp->_globalMessageQueueList->getMessageQueueById(_messageQueueId)) {
if (!isIdle())
return;
- g_fullpipe->_globalMessageQueueList->deleteQueueById(_messageQueueId);
+ g_fp->_globalMessageQueueList->deleteQueueById(_messageQueueId);
} else {
_messageQueueId = 0;
}
}
}
-void StaticANIObject::queueMessageQueue(MessageQueue *mq) {
- if (isIdle() && !(_flags & 0x80)) {
+bool StaticANIObject::queueMessageQueue(MessageQueue *mq) {
+ if (_flags & 0x80)
+ return false;
+
+ if (isIdle()) {
deleteFromGlobalMessageQueue();
_messageQueueId = 0;
_messageNum = 0;
@@ -253,13 +308,38 @@ void StaticANIObject::queueMessageQueue(MessageQueue *mq) {
_messageQueueId = 0;
}
}
+
+ return true;
+}
+
+void StaticANIObject::restartMessageQueue(MessageQueue *mq) {
+ ExCommand *ex = mq->getExCommandByIndex(0);
+ if (ex) {
+ while (ex->_messageKind != 1 || ex->_parentId != _id) {
+ ex->_parId = 0;
+ ex->_excFlags |= 2;
+ ex->handleMessage();
+
+ mq->deleteExCommandByIndex(0, 0);
+
+ ex = mq->getExCommandByIndex(0);
+
+ if (!ex)
+ return;
+ }
+
+ if (ex) {
+ startAnim(ex->_messageNum, mq->_id, -1);
+ mq->deleteExCommandByIndex(0, 1);
+ }
+ }
}
MessageQueue *StaticANIObject::getMessageQueue() {
if (this->_messageQueueId <= 0)
return 0;
- return g_fullpipe->_globalMessageQueueList->getMessageQueueById(_messageQueueId);
+ return g_fp->_globalMessageQueueList->getMessageQueueById(_messageQueueId);
}
bool StaticANIObject::trySetMessageQueue(int msgNum, int qId) {
@@ -276,9 +356,41 @@ bool StaticANIObject::trySetMessageQueue(int msgNum, int qId) {
return true;
}
+void StaticANIObject::startMQIfIdle(int qId, int flag) {
+ MessageQueue *msg = g_fp->_currentScene->getMessageQueueById(qId);
+
+ if (msg && isIdle() && !(_flags & 0x100)) {
+ MessageQueue *mq = new MessageQueue(msg, 0, 0);
+
+ mq->setFlags(mq->getFlags() | flag);
+
+ ExCommand *ex = mq->getExCommandByIndex(0);
+
+ if (ex) {
+ while (ex->_messageKind != 1 || ex->_parentId != _id) {
+ ex->_parId = 0;
+ ex->_excFlags |= 2;
+ ex->handleMessage();
+
+ mq->deleteExCommandByIndex(0, 0);
+
+ ex = mq->getExCommandByIndex(0);
+
+ if (!ex)
+ return;
+ }
+
+ if (ex) {
+ startAnim(ex->_messageNum, mq->_id, -1);
+ mq->deleteExCommandByIndex(0, 1);
+ }
+ }
+ }
+}
+
bool StaticANIObject::isIdle() {
if (_messageQueueId) {
- MessageQueue *m = g_fullpipe->_globalMessageQueueList->getMessageQueueById(_messageQueueId);
+ MessageQueue *m = g_fp->_globalMessageQueueList->getMessageQueueById(_messageQueueId);
if (m && m->getFlags() & 1)
return false;
@@ -289,34 +401,36 @@ bool StaticANIObject::isIdle() {
Statics *StaticANIObject::getStaticsById(int itemId) {
for (uint i = 0; i < _staticsList.size(); i++)
- if (((Statics *)_staticsList[i])->_staticsId == itemId)
- return (Statics *)_staticsList[i];
+ if (_staticsList[i]->_staticsId == itemId)
+ return _staticsList[i];
return 0;
}
Statics *StaticANIObject::getStaticsByName(char *name) {
for (uint i = 0; i < _staticsList.size(); i++)
- if (!strcmp(((Statics *)_staticsList[i])->_staticsName, name))
- return (Statics *)_staticsList[i];
+ if (!strcmp(_staticsList[i]->_staticsName, name))
+ return _staticsList[i];
return 0;
}
Movement *StaticANIObject::getMovementById(int itemId) {
for (uint i = 0; i < _movements.size(); i++)
- if (((Movement *)_movements[i])->_id == itemId)
- return (Movement *)_movements[i];
+ if (_movements[i]->_id == itemId)
+ return _movements[i];
return 0;
}
int StaticANIObject::getMovementIdById(int itemId) {
for (uint i = 0; i < _movements.size(); i++) {
- Movement *mov = (Movement *)_movements[i];
+ Movement *mov = _movements[i];
+
if (mov->_currMovement) {
if (mov->_id == itemId)
return mov->_id;
+
if (mov->_currMovement->_id == itemId)
return mov->_id;
}
@@ -327,8 +441,8 @@ int StaticANIObject::getMovementIdById(int itemId) {
Movement *StaticANIObject::getMovementByName(char *name) {
for (uint i = 0; i < _movements.size(); i++)
- if (!strcmp(((Movement *)_movements[i])->_objectName, name))
- return (Movement *)_movements[i];
+ if (!strcmp(_movements[i]->_objectName, name))
+ return _movements[i];
return 0;
}
@@ -403,7 +517,7 @@ void Movement::draw(bool flipFlag, int angle) {
int y = _oy - point.y;
if (_currDynamicPhase->getPaletteData())
- g_fullpipe->_globalPalette = _currDynamicPhase->getPaletteData();
+ g_fp->_globalPalette = _currDynamicPhase->getPaletteData();
if (_currDynamicPhase->getAlpha() < 0xFF) {
warning("Movement::draw: alpha < 0xff: %d", _currDynamicPhase->getAlpha());
@@ -446,10 +560,14 @@ void Movement::draw(bool flipFlag, int angle) {
}
}
-
void StaticANIObject::loadMovementsPixelData() {
for (uint i = 0; i < _movements.size(); i++)
- ((Movement *)_movements[i])->loadPixelData();
+ _movements[i]->loadPixelData();
+}
+
+void StaticANIObject::freeMovementsPixelData() {
+ for (uint i = 0; i < _movements.size(); i++)
+ _movements[i]->freePixelData();
}
Statics *StaticANIObject::addReverseStatics(Statics *st) {
@@ -471,9 +589,9 @@ void StaticANIObject::draw() {
Common::Point point;
Common::Rect rect;
- debug(0, "StaticANIObject::draw() (%s) [%d] [%d, %d]", transCyrillic((byte *)_objectName), _id, _ox, _oy);
+ debug(6, "StaticANIObject::draw() (%s) [%d] [%d, %d]", transCyrillic((byte *)_objectName), _id, _ox, _oy);
- if (_shadowsOn && g_fullpipe->_currentScene && g_fullpipe->_currentScene->_shadows
+ if (_shadowsOn && g_fp->_currentScene && g_fp->_currentScene->_shadows
&& (getCurrDimensions(point)->x != 1 || getCurrDimensions(point)->y != 1)) {
DynamicPhase *dyn;
@@ -491,7 +609,7 @@ void StaticANIObject::draw() {
if (dyn->getDynFlags() & 4) {
rect = *dyn->_rect;
- DynamicPhase *shd = g_fullpipe->_currentScene->_shadows->findSize(rect.width(), rect.height());
+ DynamicPhase *shd = g_fp->_currentScene->_shadows->findSize(rect.width(), rect.height());
if (shd) {
shd->getDimensions(&point);
int midx = _ox - point.x / 2 - dyn->_someX;
@@ -531,7 +649,7 @@ void StaticANIObject::draw() {
}
void StaticANIObject::draw2() {
- debug(0, "StatciANIObject::draw2(): id: (%s) %d [%d, %d]", transCyrillic((byte *)_objectName), _id, _ox, _oy);
+ debug(6, "StatciANIObject::draw2(): id: (%s) %d [%d, %d]", transCyrillic((byte *)_objectName), _id, _ox, _oy);
if ((_flags & 4) && (_flags & 0x10)) {
if (_movement) {
@@ -547,7 +665,7 @@ void StaticANIObject::draw2() {
}
MovTable *StaticANIObject::countMovements() {
- GameVar *preloadSubVar = g_fullpipe->getGameLoaderGameVar()->getSubVarByName(getName())->getSubVarByName("PRELOAD");
+ GameVar *preloadSubVar = g_fp->getGameLoaderGameVar()->getSubVarByName(getName())->getSubVarByName("PRELOAD");
if (!preloadSubVar || preloadSubVar->getSubVarsCount() == 0)
return 0;
@@ -558,11 +676,10 @@ MovTable *StaticANIObject::countMovements() {
movTable->movs = (int16 *)calloc(_movements.size(), sizeof(int16));
for (uint i = 0; i < _movements.size(); i++) {
- GameObject *obj = (GameObject *)_movements[i];
movTable->movs[i] = 2;
for (GameVar *sub = preloadSubVar->_subVars; sub; sub = sub->_nextVarObj) {
- if (scumm_stricmp(obj->getName(), sub->_varName) == 0) {
+ if (scumm_stricmp(_movements[i]->getName(), sub->_varName) == 0) {
movTable->movs[i] = 1;
break;
}
@@ -573,7 +690,7 @@ MovTable *StaticANIObject::countMovements() {
}
void StaticANIObject::setSpeed(int speed) {
- GameVar *var = g_fullpipe->getGameLoaderGameVar()->getSubVarByName(getName())->getSubVarByName("SpeedUp");
+ GameVar *var = g_fp->getGameLoaderGameVar()->getSubVarByName(getName())->getSubVarByName("SpeedUp");
if (!var)
return;
@@ -595,15 +712,28 @@ void StaticANIObject::setSpeed(int speed) {
void StaticANIObject::setAlpha(int alpha) {
for (uint i = 0; i < _movements.size(); i++)
- ((Movement *)_movements[i])->setAlpha(alpha);
+ _movements[i]->setAlpha(alpha);
for (uint i = 0; i < _staticsList.size(); i++)
- ((Statics *)_staticsList[i])->setAlpha(alpha);
+ _staticsList[i]->setAlpha(alpha);
}
void StaticANIObject::initMovements() {
for (uint i = 0; i < _movements.size(); i++)
- ((Movement *)_movements[i])->removeFirstPhase();
+ _movements[i]->removeFirstPhase();
+}
+
+void StaticANIObject::preloadMovements(MovTable *mt) {
+ if (mt) {
+ for (uint i = 0; i < _movements.size(); i++) {
+ Movement *mov = _movements[i];
+
+ if (mt->movs[i] == 1)
+ mov->loadPixelData();
+ else if (mt->movs[i] == 2)
+ mov->freePixelData();
+ }
+ }
}
Common::Point *StaticANIObject::getCurrDimensions(Common::Point &p) {
@@ -628,6 +758,19 @@ Common::Point *StaticANIObject::getCurrDimensions(Common::Point &p) {
return &p;
}
+Common::Point *StaticANIObject::getSomeXY(Common::Point &p) {
+ if (_movement) {
+ _movement->getCurrDynamicPhaseXY(p);
+
+ return &p;
+ }
+
+ if (_statics)
+ _statics->getSomeXY(p);
+
+ return &p;
+}
+
void StaticANIObject::update(int counterdiff) {
int mqid;
@@ -669,7 +812,7 @@ void StaticANIObject::update(int counterdiff) {
ex = dyn->getExCommand();
if (ex && ex->_messageKind != 35) {
- newex = new ExCommand(ex);
+ newex = ex->createClone();
newex->_excFlags |= 2;
if (newex->_messageKind == 17) {
newex->_parentId = _id;
@@ -702,7 +845,7 @@ void StaticANIObject::update(int counterdiff) {
ex = dyn->getExCommand();
if (ex) {
if (ex->_messageKind == 35) {
- newex = new ExCommand(ex);
+ newex = ex->createClone();
newex->_excFlags |= 2;
newex->sendMessage();
}
@@ -744,6 +887,64 @@ void StaticANIObject::update(int counterdiff) {
}
}
+void StaticANIObject::updateStepPos() {
+ Common::Point point;
+
+ int ox = _movement->_ox;
+ int oy = _movement->_oy;
+
+ _movement->calcSomeXY(point, 1, _someDynamicPhaseIndex);
+ int x = point.x;
+ int y = point.y;
+
+ _stepArray.getPoint(&point, -1, _stepArray.getPointsCount());
+ x += point.x;
+ y += point.y;
+
+ _statics = _movement->_staticsObj2;
+ _movement = 0;
+
+ setOXY(ox + x, oy + y);
+}
+
+Common::Point *StaticANIObject::calcNextStep(Common::Point *pRes) {
+ if (!_movement) {
+ pRes->x = 0;
+ pRes->y = 0;
+
+ return pRes;
+ }
+
+ Common::Point point;
+
+ _movement->calcSomeXY(point, 1, _someDynamicPhaseIndex);
+
+ int resX = point.x;
+ int resY = point.y;
+
+ int pointN, offset;
+
+ if (_someDynamicPhaseIndex <= 0) {
+ pointN = _stepArray.getCurrPointIndex();
+ offset = _stepArray.getPointsCount() - _stepArray.getCurrPointIndex();
+ } else {
+ pointN = _stepArray.getCurrPointIndex();
+ offset = 1 - _movement->_currDynamicPhaseIndex + _someDynamicPhaseIndex;
+ }
+
+ if (pointN >= 0) {
+ _stepArray.getPoint(&point, pointN, offset);
+
+ resX += point.x;
+ resY += point.y;
+ }
+
+ pRes->x = resX;
+ pRes->y = resY;
+
+ return pRes;
+}
+
void StaticANIObject::stopAnim_maybe() {
debug(6, "StaticANIObject::stopAnim_maybe()");
@@ -778,11 +979,12 @@ void StaticANIObject::stopAnim_maybe() {
_ox += point.x;
_oy += point.y;
}
+ } else {
+ _statics = _movement->_staticsObj2;
}
- }
-
- if (_movement->_currDynamicPhaseIndex || !(_flags & 0x40))
+ } else {
_statics = _movement->_staticsObj2;
+ }
_statics->getSomeXY(point);
@@ -812,17 +1014,67 @@ void StaticANIObject::stopAnim_maybe() {
}
void StaticANIObject::adjustSomeXY() {
- warning("STUB: StaticANIObject::adjustSomeXY()");
+ if (_movement) {
+ Common::Point point;
+
+ _movement->calcSomeXY(point, 0, -1);
+
+ int diff = abs(point.y) - abs(point.x);
+
+ _movement->calcSomeXY(point, 1, -1);
+
+ if (diff > 0)
+ _ox += point.x;
+ else
+ _oy += point.y;
+
+ _statics = _movement->_staticsObj2;
+ _movement = 0;
+ _someDynamicPhaseIndex = -1;
+ }
}
MessageQueue *StaticANIObject::changeStatics1(int msgNum) {
- warning("STUB: StaticANIObject::changeStatics1(%d)", msgNum);
+ g_fp->_mgm->addItem(_id);
- return 0;
+ MessageQueue *mq = g_fp->_mgm->genMQ(this, msgNum, 0, 0, 0);
+
+ if (!mq)
+ return 0;
+
+ if (mq->getCount() <= 0) {
+ g_fp->_globalMessageQueueList->addMessageQueue(mq);
+
+ if (_flags & 1)
+ _messageQueueId = mq->_id;
+ } else {
+ if (!queueMessageQueue(mq))
+ return 0;
+
+ g_fp->_globalMessageQueueList->addMessageQueue(mq);
+ }
+
+ return mq;
}
void StaticANIObject::changeStatics2(int objId) {
- warning("STUB: StaticANIObject::changeStatics2(%d)", objId);
+ _animExFlag = 0;
+
+ deleteFromGlobalMessageQueue();
+
+ if (_movement || _statics) {
+ g_fp->_mgm->addItem(_id);
+ g_fp->_mgm->updateAnimStatics(this, objId);
+ } else {
+ _statics = getStaticsById(objId);
+ }
+
+ if (_messageQueueId) {
+ if (g_fp->_globalMessageQueueList->getMessageQueueById(_messageQueueId))
+ g_fp->_globalMessageQueueList->deleteQueueById(_messageQueueId);
+
+ _messageQueueId = 0;
+ }
}
void StaticANIObject::hide() {
@@ -833,7 +1085,7 @@ void StaticANIObject::hide() {
}
void StaticANIObject::show1(int x, int y, int movId, int mqId) {
- debug(0, "StaticANIObject::show1(%d, %d, %d, %d)", x, y, movId, mqId);
+ debug(6, "StaticANIObject::show1(%d, %d, %d, %d)", x, y, movId, mqId);
if (_messageQueueId)
return;
@@ -882,7 +1134,47 @@ void StaticANIObject::show1(int x, int y, int movId, int mqId) {
}
void StaticANIObject::show2(int x, int y, int movementId, int mqId) {
- warning("STUB: StaticANIObject::show2(%d, %d, %d, %d)", x, y, movementId, mqId);
+ if (movementId == -1) {
+ _flags |= 4u;
+ return;
+ }
+
+ if (!_messageQueueId) {
+ _messageQueueId = mqId;
+
+ Movement *mov = getMovementById(movementId);
+
+ if (mov) {
+ _statics = mov->_staticsObj1;
+ _movement = mov;
+ mov->gotoLastFrame();
+ mov->setOXY(x, y);
+ mov->gotoFirstFrame();
+
+ Common::Point point;
+
+ mov->getCurrDynamicPhaseXY(point);
+ _statics->_x = mov->_ox - point.x - mov->_mx;
+ _statics->_y = mov->_oy - point.y - mov->_my;
+
+ _statics->getSomeXY(point);
+ _flags |= 4;
+ _ox = _statics->_x + point.x;
+ _oy = _statics->_y + point.y;
+
+ if (mov->_currMovement) {
+ _flags |= 8;
+ } else {
+ if (_flags & 8)
+ _flags ^= 8;
+ }
+
+ if (_flags & 1)
+ _flags ^= 1;
+
+ _flags |= 0x20;
+ }
+ }
}
void StaticANIObject::playIdle() {
@@ -891,7 +1183,85 @@ void StaticANIObject::playIdle() {
}
void StaticANIObject::startAnimSteps(int movementId, int messageQueueId, int x, int y, Common::Point **points, int pointsCount, int someDynamicPhaseIndex) {
- warning("STUB: StaticANIObject::startAnimSteps()");
+ Movement *mov = 0;
+
+ if (!(_flags & 0x80)) {
+ if (!_messageQueueId)
+ for (uint i = 0; i < _movements.size(); i++) {
+ if (_movements[i]->_id == movementId) {
+ mov = _movements[i];
+ break;
+ }
+ }
+ }
+
+ if (!mov) {
+ updateGlobalMessageQueue(messageQueueId, _id);
+
+ return;
+ }
+
+
+ if (_movement || !_statics)
+ return;
+
+ Common::Point point;
+
+ _statics->getSomeXY(point);
+
+ int newx = _ox - point.x;
+ int newy = _oy - point.y;
+
+ _movement = mov;
+
+ if (_flags & 0x40)
+ _movement->gotoLastFrame();
+ else
+ _movement->gotoFirstFrame();
+
+ _stepArray.clear();
+ _stepArray.insertPoints(points, pointsCount);
+
+ if (!(_flags & 0x40)) {
+ if (!_movement->_currDynamicPhaseIndex) {
+ _stepArray.getCurrPoint(&point);
+ newx += point.x + _movement->_mx;
+ newy += point.y + _movement->_my;
+ _stepArray.gotoNextPoint();
+
+ ExCommand *ex = _movement->_currDynamicPhase->getExCommand();
+
+ if (ex) {
+ if (ex->_messageKind == 35) {
+ ExCommand *newEx = ex->createClone();
+
+ newEx->_excFlags |= 2u;
+ newEx->sendMessage();
+ }
+ }
+ }
+ }
+
+ _movement->getCurrDynamicPhaseXY(point);
+ setOXY(point.x + newx, point.y + newy);
+
+ if ((_movement->_staticsObj2->_staticsId >> 8) & 0x40)
+ _flags |= 8;
+ else
+ _flags &= 0xFFF7;
+
+ _flags |= 1;
+ _messageQueueId = messageQueueId;
+ _movement->_currDynamicPhase->_countdown = _movement->_currDynamicPhase->_initialCountdown;
+ _movement->_counter = 0;
+ _counter = _initialCounter;
+ _someDynamicPhaseIndex = someDynamicPhaseIndex;
+
+ ExCommand *ex = new ExCommand(_id, 17, 23, 0, 0, movementId, 1, 0, 0, 0);
+
+ ex->_keyCode = _okeyCode;
+ ex->_excFlags = 2;
+ ex->postMessage();
}
bool StaticANIObject::startAnimEx(int movid, int parId, int flag1, int flag2) {
@@ -907,7 +1277,7 @@ bool StaticANIObject::startAnim(int movementId, int messageQueueId, int dynPhase
if (_flags & 0x80)
return false;
- debug(0, "StaticANIObject::startAnim(%d, %d, %d) (%s [%d]) [%d, %d]", movementId, messageQueueId, dynPhaseIdx, transCyrillic((byte *)_objectName), _id, _ox, _oy);
+ debug(4, "StaticANIObject::startAnim(%d, %d, %d) (%s [%d]) [%d, %d]", movementId, messageQueueId, dynPhaseIdx, transCyrillic((byte *)_objectName), _id, _ox, _oy);
if (_messageQueueId) {
updateGlobalMessageQueue(messageQueueId, _id);
@@ -917,9 +1287,8 @@ bool StaticANIObject::startAnim(int movementId, int messageQueueId, int dynPhase
Movement *mov = 0;
for (uint i = 0; i < _movements.size(); i++) {
-
- if (((Movement *)_movements[i])->_id == movementId) {
- mov = (Movement *)_movements[i];
+ if (_movements[i]->_id == movementId) {
+ mov = _movements[i];
break;
}
}
@@ -940,20 +1309,17 @@ bool StaticANIObject::startAnim(int movementId, int messageQueueId, int dynPhase
int newy = _oy;
Common::Point point;
- debug(0, "0 %d %d", newx, newy);
if (_movement) {
_movement->getCurrDynamicPhaseXY(point);
newx -= point.x;
newy -= point.y;
- debug(0, "1 %d %d", newx, newy);
} else if (_statics) {
_statics->getSomeXY(point);
newx -= point.x;
newy -= point.y;
- debug(0, "2 %d %d - %d %d assa", newx, newy, point.x, point.y);
}
_movement = mov;
@@ -971,13 +1337,12 @@ bool StaticANIObject::startAnim(int movementId, int messageQueueId, int dynPhase
newx += point.x + _movement->_mx;
newy += point.y + _movement->_my;
- debug(0, "3 %d %d", newx, newy);
_stepArray.gotoNextPoint();
ExCommand *ex = _movement->_currDynamicPhase->getExCommand();
if (ex) {
if (ex->_messageKind == 35) {
- ExCommand *newex = new ExCommand(ex);
+ ExCommand *newex = ex->createClone();
newex->_excFlags |= 2;
newex->sendMessage();
}
@@ -1014,6 +1379,31 @@ bool StaticANIObject::startAnim(int movementId, int messageQueueId, int dynPhase
return true;
}
+Common::Point *StaticANIObject::calcStepLen(Common::Point *p) {
+ if (_movement) {
+ Common::Point point;
+
+ _movement->calcSomeXY(point, 0, _movement->_currDynamicPhaseIndex);
+
+ p->x = point.x;
+ p->y = point.y;
+
+ int idx = _stepArray.getCurrPointIndex() - _movement->_currDynamicPhaseIndex - 1;
+
+ if (idx >= 0) {
+ _stepArray.getPoint(&point, idx, _movement->_currDynamicPhaseIndex + 2);
+
+ p->x += point.x;
+ p->y += point.y;
+ }
+ } else {
+ p->x = 0;
+ p->y = 0;
+ }
+
+ return p;
+}
+
Statics::Statics() {
_staticsId = 0;
_picture = 0;
@@ -1061,6 +1451,19 @@ bool Statics::load(MfcArchive &file) {
return true;
}
+void Statics::init() {
+ Picture::init();
+
+ if (_staticsId & 0x4000) {
+ Bitmap *bmp = _bitmap->reverseImage();
+
+ freePixelData();
+
+ _bitmap = bmp;
+ _data = bmp->_pixels;
+ }
+}
+
Common::Point *Statics::getSomeXY(Common::Point &p) {
p.x = _someX;
p.y = _someY;
@@ -1108,8 +1511,22 @@ Movement::Movement() {
_counter = 0;
_counterMax = 83;
- _field_24 = 0;
- _field_28 = 0;
+ _somePoint.x = 0;
+ _somePoint.y = 0;
+}
+
+Movement::~Movement() {
+ for (uint i = 0; i < _dynamicPhases.size(); i++)
+ delete _framePosOffsets[i];
+
+ if (!_currMovement ) {
+ if (_updateFlag1)
+ _dynamicPhases.remove_at(0);
+
+ _dynamicPhases.clear();
+ }
+
+ free(_framePosOffsets);
}
Movement::Movement(Movement *src, StaticANIObject *ani) {
@@ -1131,8 +1548,8 @@ Movement::Movement(Movement *src, StaticANIObject *ani) {
_currDynamicPhaseIndex = src->_currDynamicPhaseIndex;
_field_94 = 0;
- _field_24 = 0;
- _field_28 = 0;
+ _somePoint.x = 0;
+ _somePoint.y = 0;
_currMovement = src;
_ox = src->_ox;
@@ -1147,8 +1564,89 @@ Movement::Movement(Movement *src, StaticANIObject *ani) {
updateCurrDynamicPhase();
}
-Movement::Movement(Movement *src, int *flag1, int flag2, StaticANIObject *ani) {
- warning("STUB: Movement(src, %p, %d, ani)", (void *)flag1, flag2);
+Movement::Movement(Movement *src, int *oldIdxs, int newSize, StaticANIObject *ani) : GameObject(src) {
+ _lastFrameSpecialFlag = 0;
+ _updateFlag1 = 1;
+ _staticsObj1 = 0;
+ _staticsObj2 = 0;
+ _mx = 0;
+ _my = 0;
+ _m2x = 0;
+ _m2y = 0;
+
+ _field_78 = 0;
+ _framePosOffsets = 0;
+ _field_84 = 0;
+ _currDynamicPhase = 0;
+ _field_8C = 0;
+ _currDynamicPhaseIndex = 0;
+ _field_94 = 0;
+
+ _somePoint.x = 0;
+ _somePoint.y = 0;
+
+ _field_50 = src->_field_50;
+ _flipFlag = src->_flipFlag;
+ _currMovement = 0;
+ _mx = src->_mx;
+ _my = src->_my;
+ _m2x = src->_m2x;
+ _m2y = src->_m2y;
+
+ if (newSize != -1) {
+ if (newSize >= (int)src->_dynamicPhases.size() + 1)
+ newSize = src->_dynamicPhases.size() + 1;
+ } else {
+ newSize = src->_dynamicPhases.size();
+ }
+
+ _framePosOffsets = (Common::Point **)calloc(newSize, sizeof(Common::Point *));
+
+ for (int i = 0; i < newSize; i++)
+ _framePosOffsets[i] = new Common::Point();
+
+ if (oldIdxs) {
+ for (int i = 0; i < newSize - 1; i++, oldIdxs++) {
+ if (oldIdxs[i] == -1) {
+ _dynamicPhases.push_back(src->_staticsObj1);
+
+ _framePosOffsets[i]->x = 0;
+ _framePosOffsets[i]->y = 0;
+ } else {
+ src->setDynamicPhaseIndex(oldIdxs[i]);
+
+ _dynamicPhases.push_back(src->_currDynamicPhase);
+
+ _framePosOffsets[i]->x = src->_framePosOffsets[oldIdxs[i]]->x;
+ _framePosOffsets[i]->y = src->_framePosOffsets[oldIdxs[i]]->y;
+ }
+ }
+ _staticsObj1 = (Statics *)_dynamicPhases.front();
+ _staticsObj2 = (Statics *)_dynamicPhases.back();
+ } else {
+ for (int i = 0; i < newSize; i++) {
+ src->setDynamicPhaseIndex(i);
+
+ if (i < newSize - 1)
+ _dynamicPhases.push_back(new DynamicPhase(src->_currDynamicPhase, 0));
+
+ _framePosOffsets[i]->x = src->_framePosOffsets[i]->x;
+ _framePosOffsets[i]->y = src->_framePosOffsets[i]->y;
+ }
+
+ _staticsObj1 = ani->getStaticsById(src->_staticsObj1->_staticsId);
+ _staticsObj2 = ani->getStaticsById(src->_staticsObj2->_staticsId);
+
+ _dynamicPhases.push_back(_staticsObj2);
+
+ this->_updateFlag1 = src->_updateFlag1;
+ }
+
+ updateCurrDynamicPhase();
+ removeFirstPhase();
+
+ _counterMax = src->_counterMax;
+ _counter = src->_counter;
}
bool Movement::load(MfcArchive &file) {
@@ -1224,10 +1722,10 @@ bool Movement::load(MfcArchive &file, StaticANIObject *ani) {
_flipFlag = 1;
}
- if (g_fullpipe->_gameProjectVersion >= 8)
+ if (g_fp->_gameProjectVersion >= 8)
_field_50 = file.readUint32LE();
- if (g_fullpipe->_gameProjectVersion < 12)
+ if (g_fp->_gameProjectVersion < 12)
_counterMax = 83;
else
_counterMax = file.readUint32LE();
@@ -1245,7 +1743,7 @@ Common::Point *Movement::getCurrDynamicPhaseXY(Common::Point &p) {
return &p;
}
-Common::Point *Movement::calcSomeXY(Common::Point &p, int idx) {
+Common::Point *Movement::calcSomeXY(Common::Point &p, int idx, int dynidx) {
int oldox = _ox;
int oldoy = _oy;
int oldidx = _currDynamicPhaseIndex;
@@ -1268,8 +1766,8 @@ Common::Point *Movement::calcSomeXY(Common::Point &p, int idx) {
setOXY(x, y);
- while (_currDynamicPhaseIndex != idx)
- gotoNextFrame(0, 0);
+ while (_currDynamicPhaseIndex != dynidx && gotoNextFrame(0, 0))
+ ;
p.x = _ox;
p.y = _oy;
@@ -1283,11 +1781,11 @@ Common::Point *Movement::calcSomeXY(Common::Point &p, int idx) {
void Movement::setAlpha(int alpha) {
if (_currMovement)
for (uint i = 0; i < _currMovement->_dynamicPhases.size(); i++) {
- ((DynamicPhase *)_currMovement->_dynamicPhases[i])->setAlpha(alpha);
+ _currMovement->_dynamicPhases[i]->setAlpha(alpha);
}
else
for (uint i = 0; i < _dynamicPhases.size(); i++) {
- ((DynamicPhase *)_dynamicPhases[i])->setAlpha(alpha);
+ _dynamicPhases[i]->setAlpha(alpha);
}
}
@@ -1300,9 +1798,9 @@ Common::Point *Movement::getDimensionsOfPhase(Common::Point *p, int phaseIndex)
DynamicPhase *dyn;
if (_currMovement)
- dyn = (DynamicPhase *)_currMovement->_dynamicPhases[idx];
+ dyn = _currMovement->_dynamicPhases[idx];
else
- dyn = (DynamicPhase *)_dynamicPhases[idx];
+ dyn = _dynamicPhases[idx];
Common::Point point;
@@ -1351,13 +1849,13 @@ void Movement::updateCurrDynamicPhase() {
return;
if (_currMovement->_dynamicPhases[_currDynamicPhaseIndex])
- _currDynamicPhase = (DynamicPhase *)_currMovement->_dynamicPhases[_currDynamicPhaseIndex];
+ _currDynamicPhase = _currMovement->_dynamicPhases[_currDynamicPhaseIndex];
} else {
if (_dynamicPhases.size() == 0 || (uint)_currDynamicPhaseIndex >= _dynamicPhases.size())
return;
if (_dynamicPhases[_currDynamicPhaseIndex])
- _currDynamicPhase = (DynamicPhase *)_dynamicPhases[_currDynamicPhaseIndex];
+ _currDynamicPhase = _dynamicPhases[_currDynamicPhaseIndex];
}
}
@@ -1366,16 +1864,35 @@ int Movement::calcDuration() {
if (_currMovement)
for (uint i = 0; i < _currMovement->_dynamicPhases.size(); i++) {
- res += ((DynamicPhase *)_currMovement->_dynamicPhases[i])->_initialCountdown;
+ res += _currMovement->_dynamicPhases[i]->_initialCountdown;
}
else
for (uint i = 0; i < _dynamicPhases.size(); i++) {
- res += ((DynamicPhase *)_dynamicPhases[i])->_initialCountdown;
+ res += _dynamicPhases[i]->_initialCountdown;
}
return res;
}
+int Movement::countPhasesWithFlag(int maxidx, int flag) {
+ int res = 0;
+ int sz;
+
+ if (_currMovement)
+ sz = _currMovement->_dynamicPhases.size();
+ else
+ sz = _dynamicPhases.size();
+
+ if (maxidx < 0)
+ maxidx = sz;
+
+ for (int i = 0; i < maxidx && i < sz; i++)
+ if (getDynamicPhaseByIndex(i)->_dynFlags & flag)
+ res++;
+
+ return res;
+}
+
void Movement::setDynamicPhaseIndex(int index) {
debug(7, "Movement::setDynamicPhaseIndex(%d)", index);
while (_currDynamicPhaseIndex < index)
@@ -1392,12 +1909,12 @@ DynamicPhase *Movement::getDynamicPhaseByIndex(int idx) {
if (_currMovement->_dynamicPhases.size() == 0 || (uint)idx >= _currMovement->_dynamicPhases.size())
return 0;
- return (DynamicPhase *)_currMovement->_dynamicPhases[idx];
+ return _currMovement->_dynamicPhases[idx];
} else {
if (_dynamicPhases.size() == 0 || (uint)idx >= _dynamicPhases.size())
return 0;
- return (DynamicPhase *)_dynamicPhases[idx];
+ return _dynamicPhases[idx];
}
}
@@ -1408,13 +1925,22 @@ void Movement::loadPixelData() {
for (uint i = 0; i < _dynamicPhases.size(); i++) {
if ((Statics *)_dynamicPhases[i] != mov->_staticsObj2 || !(mov->_staticsObj2->_staticsId & 0x4000))
- ((Statics *)_dynamicPhases[i])->getPixelData();
+ _dynamicPhases[i]->getPixelData();
}
if (!(mov->_staticsObj1->_staticsId & 0x4000))
mov->_staticsObj1->getPixelData();
}
+void Movement::freePixelData() {
+ if (!_currMovement)
+ for (uint i = 0; i < _dynamicPhases.size(); i++)
+ _dynamicPhases[i]->freePixelData();
+
+ if (_staticsObj1)
+ _staticsObj1->freePixelData();
+}
+
void Movement::removeFirstPhase() {
if (_updateFlag1) {
if (!_currDynamicPhaseIndex)
@@ -1435,17 +1961,17 @@ void Movement::removeFirstPhase() {
_updateFlag1 = 0;
}
-bool Movement::gotoNextFrame(int callback1, void (*callback2)(int *)) {
+bool Movement::gotoNextFrame(void (*callback1)(int, Common::Point *point, int, int), void (*callback2)(int *)) {
debug(8, "Movement::gotoNextFrame()");
if (!callback2) {
if (_currMovement) {
if ((uint)_currDynamicPhaseIndex == _currMovement->_dynamicPhases.size() - 1
- && !(((DynamicPhase *)(_currMovement->_dynamicPhases.back()))->_countdown)) {
+ && !(_currMovement->_dynamicPhases.back()->_countdown)) {
return false;
}
} else if ((uint)_currDynamicPhaseIndex == _dynamicPhases.size() - 1
- && !(((DynamicPhase *)(_dynamicPhases.back()))->_countdown)) {
+ && !(_dynamicPhases.back()->_countdown)) {
return false;
}
}
@@ -1487,7 +2013,7 @@ bool Movement::gotoNextFrame(int callback1, void (*callback2)(int *)) {
if (_currMovement->_framePosOffsets) {
if (callback1) {
point = *_currMovement->_framePosOffsets[_currDynamicPhaseIndex];
- //callback1(_currDynamicPhaseIndex, &point, _ox, _oy);
+ callback1(_currDynamicPhaseIndex, &point, _ox, _oy);
_ox += deltax - point.x;
_oy += point.y;
@@ -1529,7 +2055,7 @@ bool Movement::gotoNextFrame(int callback1, void (*callback2)(int *)) {
point.x = _framePosOffsets[_currDynamicPhaseIndex]->x;
point.y = _framePosOffsets[_currDynamicPhaseIndex]->y;
- //callback1(_currDynamicPhaseIndex, &point, _ox, _oy);
+ callback1(_currDynamicPhaseIndex, &point, _ox, _oy);
_ox += point.x;
_oy += point.y;
} else if (oldDynIndex >= _currDynamicPhaseIndex) {
@@ -1655,7 +2181,7 @@ DynamicPhase::DynamicPhase(DynamicPhase *src, bool reverse) {
_field_7E = 0;
_rect = new Common::Rect();
- debug(0, "DynamicPhase::DynamicPhase(src, %d)", reverse);
+ debug(1, "DynamicPhase::DynamicPhase(src, %d)", reverse);
if (reverse) {
if (!src->_bitmap)
@@ -1665,9 +2191,9 @@ DynamicPhase::DynamicPhase(DynamicPhase *src, bool reverse) {
_data = _bitmap->_pixels;
_dataSize = src->_dataSize;
- if (g_fullpipe->_currArchive) {
+ if (g_fp->_currArchive) {
_mfield_14 = 0;
- _libHandle = g_fullpipe->_currArchive;
+ _libHandle = g_fp->_currArchive;
}
_mflags |= 1;
@@ -1700,7 +2226,7 @@ DynamicPhase::DynamicPhase(DynamicPhase *src, bool reverse) {
_field_7C = src->_field_7C;
if (src->getExCommand())
- _exCommand = new ExCommand(src->getExCommand());
+ _exCommand = src->getExCommand()->createClone();
else
_exCommand = 0;
@@ -1725,12 +2251,12 @@ bool DynamicPhase::load(MfcArchive &file) {
_rect->right = file.readUint32LE();
_rect->bottom = file.readUint32LE();
- assert (g_fullpipe->_gameProjectVersion >= 1);
+ assert (g_fp->_gameProjectVersion >= 1);
_someX = file.readUint32LE();
_someY = file.readUint32LE();
- assert (g_fullpipe->_gameProjectVersion >= 12);
+ assert (g_fp->_gameProjectVersion >= 12);
_dynFlags = file.readUint32LE();
@@ -1757,13 +2283,15 @@ bool StaticPhase::load(MfcArchive &file) {
_initialCountdown = file.readUint16LE();
_field_6A = file.readUint16LE();
- if (g_fullpipe->_gameProjectVersion >= 12) {
+ if (g_fp->_gameProjectVersion >= 12) {
_exCommand = (ExCommand *)file.readClass();
return true;
}
- assert (g_fullpipe->_gameProjectVersion >= 12);
+ assert (g_fp->_gameProjectVersion >= 12);
+
+ warning("StaticPhase::load(): Code continues here");
return true;
}
diff --git a/engines/fullpipe/statics.h b/engines/fullpipe/statics.h
index 2879edd8e1..c7baac7502 100644
--- a/engines/fullpipe/statics.h
+++ b/engines/fullpipe/statics.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -42,8 +42,12 @@ class StepArray : public CObject {
void clear();
int getCurrPointIndex() { return _currPointIndex; }
+ int getPointsCount() { return _maxPointIndex; }
+
Common::Point *getCurrPoint(Common::Point *point);
+ Common::Point *getPoint(Common::Point *point, int index, int offset);
bool gotoNextPoint();
+ void insertPoints(Common::Point **points, int pointsCount);
};
class StaticPhase : public Picture {
@@ -94,6 +98,7 @@ class Statics : public DynamicPhase {
virtual ~Statics();
virtual bool load(MfcArchive &file);
+ virtual void init();
Statics *getStaticsById(int itemId);
Common::Point *getSomeXY(Common::Point &p);
@@ -104,8 +109,7 @@ class StaticANIObject;
class Movement : public GameObject {
public:
- int _field_24;
- int _field_28;
+ Common::Point _somePoint;
int _lastFrameSpecialFlag;
int _flipFlag;
int _updateFlag1;
@@ -118,7 +122,7 @@ class Movement : public GameObject {
int _field_50;
int _counterMax;
int _counter;
- PtrList _dynamicPhases;
+ Common::Array<DynamicPhase *> _dynamicPhases;
int _field_78;
Common::Point **_framePosOffsets;
Movement *_currMovement;
@@ -130,6 +134,8 @@ class Movement : public GameObject {
public:
Movement();
+ virtual ~Movement();
+
Movement(Movement *src, StaticANIObject *ani);
Movement(Movement *src, int *flag1, int flag2, StaticANIObject *ani);
@@ -140,7 +146,7 @@ class Movement : public GameObject {
Common::Point *getCenter(Common::Point *p);
Common::Point *getDimensionsOfPhase(Common::Point *p, int phaseIndex);
- Common::Point *calcSomeXY(Common::Point &p, int idx);
+ Common::Point *calcSomeXY(Common::Point &p, int idx, int dynidx);
void initStatics(StaticANIObject *ani);
void updateCurrDynamicPhase();
@@ -151,14 +157,16 @@ class Movement : public GameObject {
DynamicPhase *getDynamicPhaseByIndex(int idx);
int calcDuration();
+ int countPhasesWithFlag(int maxidx, int flag);
void removeFirstPhase();
- bool gotoNextFrame(int callback1, void (*callback2)(int *));
+ bool gotoNextFrame(void (*_callback1)(int, Common::Point *point, int, int), void (*callback2)(int *));
bool gotoPrevFrame();
void gotoFirstFrame();
void gotoLastFrame();
void loadPixelData();
+ void freePixelData();
void draw(bool flipFlag, int angle);
};
@@ -172,10 +180,10 @@ class StaticANIObject : public GameObject {
int16 _field_32;
int _field_34;
int _initialCounter;
- int _callback1;
+ void (*_callback1)(int, Common::Point *point, int, int);
void (*_callback2)(int *);
- PtrList _movements;
- PtrList _staticsList;
+ Common::Array<Movement *> _movements;
+ Common::Array<Statics *> _staticsList;
StepArray _stepArray;
int16 _field_96;
int _messageQueueId;
@@ -184,11 +192,12 @@ class StaticANIObject : public GameObject {
int _counter;
int _someDynamicPhaseIndex;
- public:
+public:
int16 _sceneId;
- public:
+public:
StaticANIObject();
+ virtual ~StaticANIObject();
StaticANIObject(StaticANIObject *src);
virtual bool load(MfcArchive &file);
@@ -201,18 +210,24 @@ class StaticANIObject : public GameObject {
Movement *getMovementByName(char *name);
Common::Point *getCurrDimensions(Common::Point &p);
+ Common::Point *getSomeXY(Common::Point &p);
+
void clearFlags();
void setFlags40(bool state);
bool isIdle();
void setAlpha(int alpha);
void deleteFromGlobalMessageQueue();
- void queueMessageQueue(MessageQueue *msg);
+ bool queueMessageQueue(MessageQueue *msg);
+ void restartMessageQueue(MessageQueue *msg);
MessageQueue *getMessageQueue();
bool trySetMessageQueue(int msgNum, int qId);
+ void startMQIfIdle(int qId, int flag);
void initMovements();
void loadMovementsPixelData();
+ void freeMovementsPixelData();
+ void preloadMovements(MovTable *mt);
void setSomeDynamicPhaseIndex(int val) { _someDynamicPhaseIndex = val; }
void adjustSomeXY();
@@ -232,9 +247,12 @@ class StaticANIObject : public GameObject {
void draw2();
MovTable *countMovements();
+ Common::Point *calcStepLen(Common::Point *p);
void setSpeed(int speed);
+ void updateStepPos();
void stopAnim_maybe();
+ Common::Point *calcNextStep(Common::Point *point);
MessageQueue *changeStatics1(int msgNum);
void changeStatics2(int objId);
@@ -245,6 +263,9 @@ class StaticANIObject : public GameObject {
struct MovTable {
int count;
int16 *movs;
+
+ MovTable() { count = 0; movs = 0; }
+ ~MovTable() { free(movs); }
};
} // End of namespace Fullpipe
diff --git a/engines/fullpipe/utils.cpp b/engines/fullpipe/utils.cpp
index 3304a93667..0cc8bd83f4 100644
--- a/engines/fullpipe/utils.cpp
+++ b/engines/fullpipe/utils.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -138,9 +138,9 @@ bool MemoryObject::load(MfcArchive &file) {
}
}
- if (g_fullpipe->_currArchive) {
+ if (g_fp->_currArchive) {
_mfield_14 = 0;
- _libHandle = g_fullpipe->_currArchive;
+ _libHandle = g_fp->_currArchive;
}
return true;
@@ -148,8 +148,17 @@ bool MemoryObject::load(MfcArchive &file) {
void MemoryObject::loadFile(char *filename) {
debug(5, "MemoryObject::loadFile(<%s>)", filename);
+
+ if (!*filename)
+ return;
+
if (!_data) {
- Common::SeekableReadStream *s = g_fullpipe->_currArchive->createReadStreamForMember(filename);
+ NGIArchive *arr = g_fp->_currArchive;
+
+ if (g_fp->_currArchive != _libHandle && _libHandle)
+ g_fp->_currArchive = _libHandle;
+
+ Common::SeekableReadStream *s = g_fp->_currArchive->createReadStreamForMember(filename);
if (s) {
assert(s->size() > 0);
@@ -161,7 +170,11 @@ void MemoryObject::loadFile(char *filename) {
s->read(_data, _dataSize);
delete s;
+ } else {
+ warning("MemoryObject::loadFile(): reading failure");
}
+
+ g_fp->_currArchive = arr;
}
}
@@ -181,6 +194,8 @@ byte *MemoryObject::loadData() {
}
void MemoryObject::freeData() {
+ debug(8, "MemoryObject::freeData(): file: %s", _memfilename);
+
if (_data)
free(_data);
diff --git a/engines/fullpipe/utils.h b/engines/fullpipe/utils.h
index 64f56ced0a..da3ab7ee4f 100644
--- a/engines/fullpipe/utils.h
+++ b/engines/fullpipe/utils.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -66,6 +66,9 @@ class MfcArchive : public Common::SeekableReadStream {
enum ObjType {
kObjTypeDefault,
+ kObjTypeExCommand,
+ kObjTypeExCommand2,
+ kObjTypeModalSaveGame,
kObjTypeMovGraph,
kObjTypeMovGraphLink,
kObjTypeMovGraphNode,
@@ -115,6 +118,7 @@ class MemoryObject : CObject {
void load() { loadFile(_memfilename); }
byte *getData();
byte *loadData();
+ int getDataSize() const { return _dataSize; }
bool testFlags();
@@ -145,8 +149,6 @@ class DWordArray : public Common::Array<int32>, public CObject {
virtual bool load(MfcArchive &file);
};
-typedef Common::Array<void *> PtrList;
-
char *genFileName(int superId, int sceneId, const char *ext);
byte *transCyrillic(byte *s);
diff --git a/engines/game.cpp b/engines/game.cpp
index 4bfd8f3bf2..85ad6fe2e8 100644
--- a/engines/game.cpp
+++ b/engines/game.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/game.h b/engines/game.h
index 3417203ea7..a9bec8f9e0 100644
--- a/engines/game.h
+++ b/engines/game.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/gob/anifile.cpp b/engines/gob/anifile.cpp
index 3b6a7f61ed..8d4afdf94a 100644
--- a/engines/gob/anifile.cpp
+++ b/engines/gob/anifile.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/gob/anifile.h b/engines/gob/anifile.h
index c930aafc6b..e9ca9da43e 100644
--- a/engines/gob/anifile.h
+++ b/engines/gob/anifile.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/gob/aniobject.cpp b/engines/gob/aniobject.cpp
index 7e3668a0ce..905997f160 100644
--- a/engines/gob/aniobject.cpp
+++ b/engines/gob/aniobject.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/gob/aniobject.h b/engines/gob/aniobject.h
index d8c8edc2b8..8120d2e0d5 100644
--- a/engines/gob/aniobject.h
+++ b/engines/gob/aniobject.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/gob/backbuffer.cpp b/engines/gob/backbuffer.cpp
index 752042d46e..cee5db5a41 100644
--- a/engines/gob/backbuffer.cpp
+++ b/engines/gob/backbuffer.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/gob/backbuffer.h b/engines/gob/backbuffer.h
index c978689e9f..c724cd86c8 100644
--- a/engines/gob/backbuffer.h
+++ b/engines/gob/backbuffer.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/gob/cheater.cpp b/engines/gob/cheater.cpp
index 5c1f555389..63c84e1cd7 100644
--- a/engines/gob/cheater.cpp
+++ b/engines/gob/cheater.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/gob/cheater.h b/engines/gob/cheater.h
index bf6c1372fb..a4cd621b58 100644
--- a/engines/gob/cheater.h
+++ b/engines/gob/cheater.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/gob/cheater_geisha.cpp b/engines/gob/cheater_geisha.cpp
index 567333c12f..ec6fe09d59 100644
--- a/engines/gob/cheater_geisha.cpp
+++ b/engines/gob/cheater_geisha.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -61,7 +61,7 @@ bool Cheater_Geisha::cheat(GUI::Debugger &console) {
uint32 digit5 = READ_VARO_UINT32(0x778);
if (digit1 && digit2 && digit3 && digit4 && digit5)
- console.DebugPrintf("Mastermind solution: %d %d %d %d %d\n",
+ console.debugPrintf("Mastermind solution: %d %d %d %d %d\n",
digit1, digit2, digit3, digit4, digit5);
return true;
diff --git a/engines/gob/cmpfile.cpp b/engines/gob/cmpfile.cpp
index 0c650a917e..67b378475d 100644
--- a/engines/gob/cmpfile.cpp
+++ b/engines/gob/cmpfile.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/gob/cmpfile.h b/engines/gob/cmpfile.h
index 9c858238af..055de1b6b6 100644
--- a/engines/gob/cmpfile.h
+++ b/engines/gob/cmpfile.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/gob/configure.engine b/engines/gob/configure.engine
new file mode 100644
index 0000000000..8e012f5815
--- /dev/null
+++ b/engines/gob/configure.engine
@@ -0,0 +1,3 @@
+# This file is included from the main "configure" script
+# add_engine [name] [desc] [build-by-default] [subengines] [base games] [deps]
+add_engine gob "Gobli*ns" yes
diff --git a/engines/gob/console.cpp b/engines/gob/console.cpp
index 76ccb70dca..2252606243 100644
--- a/engines/gob/console.cpp
+++ b/engines/gob/console.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -29,14 +29,14 @@
namespace Gob {
GobConsole::GobConsole(GobEngine *vm) : GUI::Debugger(), _vm(vm), _cheater(0) {
- 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));
- DCmd_Register("varString", WRAP_METHOD(GobConsole, cmd_varString));
- DCmd_Register("cheat", WRAP_METHOD(GobConsole, cmd_cheat));
- DCmd_Register("listArchives", WRAP_METHOD(GobConsole, cmd_listArchives));
+ registerCmd("varSize", WRAP_METHOD(GobConsole, cmd_varSize));
+ registerCmd("dumpVars", WRAP_METHOD(GobConsole, cmd_dumpVars));
+ registerCmd("var8", WRAP_METHOD(GobConsole, cmd_var8));
+ registerCmd("var16", WRAP_METHOD(GobConsole, cmd_var16));
+ registerCmd("var32", WRAP_METHOD(GobConsole, cmd_var32));
+ registerCmd("varString", WRAP_METHOD(GobConsole, cmd_varString));
+ registerCmd("cheat", WRAP_METHOD(GobConsole, cmd_cheat));
+ registerCmd("listArchives", WRAP_METHOD(GobConsole, cmd_listArchives));
}
GobConsole::~GobConsole() {
@@ -51,7 +51,7 @@ void GobConsole::unregisterCheater() {
}
bool GobConsole::cmd_varSize(int argc, const char **argv) {
- DebugPrintf("Size of the variable space: %d bytes\n", _vm->_inter->_variables->getSize());
+ debugPrintf("Size of the variable space: %d bytes\n", _vm->_inter->_variables->getSize());
return true;
}
@@ -74,14 +74,14 @@ bool GobConsole::cmd_dumpVars(int argc, const char **argv) {
bool GobConsole::cmd_var8(int argc, const char **argv) {
if (argc == 1) {
- DebugPrintf("Usage: var8 <var offset> (<value>)\n");
+ debugPrintf("Usage: var8 <var offset> (<value>)\n");
return true;
}
uint32 varNum = atoi(argv[1]);
if (varNum >= _vm->_inter->_variables->getSize()) {
- DebugPrintf("Variable offset out of range\n");
+ debugPrintf("Variable offset out of range\n");
return true;
}
@@ -90,21 +90,21 @@ bool GobConsole::cmd_var8(int argc, const char **argv) {
_vm->_inter->_variables->writeOff8(varNum, varVal);
}
- DebugPrintf("var8_%d = %d\n", varNum, _vm->_inter->_variables->readOff8(varNum));
+ debugPrintf("var8_%d = %d\n", varNum, _vm->_inter->_variables->readOff8(varNum));
return true;
}
bool GobConsole::cmd_var16(int argc, const char **argv) {
if (argc == 1) {
- DebugPrintf("Usage: var16 <var offset> (<value>)\n");
+ debugPrintf("Usage: var16 <var offset> (<value>)\n");
return true;
}
uint32 varNum = atoi(argv[1]);
if ((varNum + 1) >= _vm->_inter->_variables->getSize()) {
- DebugPrintf("Variable offset out of range\n");
+ debugPrintf("Variable offset out of range\n");
return true;
}
@@ -113,21 +113,21 @@ bool GobConsole::cmd_var16(int argc, const char **argv) {
_vm->_inter->_variables->writeOff16(varNum, varVal);
}
- DebugPrintf("var16_%d = %d\n", varNum, _vm->_inter->_variables->readOff16(varNum));
+ debugPrintf("var16_%d = %d\n", varNum, _vm->_inter->_variables->readOff16(varNum));
return true;
}
bool GobConsole::cmd_var32(int argc, const char **argv) {
if (argc == 1) {
- DebugPrintf("Usage: var32 <var offset> (<value>)\n");
+ debugPrintf("Usage: var32 <var offset> (<value>)\n");
return true;
}
uint32 varNum = atoi(argv[1]);
if ((varNum + 3) >= _vm->_inter->_variables->getSize()) {
- DebugPrintf("Variable offset out of range\n");
+ debugPrintf("Variable offset out of range\n");
return true;
}
@@ -136,21 +136,21 @@ bool GobConsole::cmd_var32(int argc, const char **argv) {
_vm->_inter->_variables->writeOff32(varNum, varVal);
}
- DebugPrintf("var8_%d = %d\n", varNum, _vm->_inter->_variables->readOff32(varNum));
+ debugPrintf("var8_%d = %d\n", varNum, _vm->_inter->_variables->readOff32(varNum));
return true;
}
bool GobConsole::cmd_varString(int argc, const char **argv) {
if (argc == 1) {
- DebugPrintf("Usage: varString <var offset> (<value>)\n");
+ debugPrintf("Usage: varString <var offset> (<value>)\n");
return true;
}
uint32 varNum = atoi(argv[1]);
if (varNum >= _vm->_inter->_variables->getSize()) {
- DebugPrintf("Variable offset out of range\n");
+ debugPrintf("Variable offset out of range\n");
return true;
}
@@ -160,7 +160,7 @@ bool GobConsole::cmd_varString(int argc, const char **argv) {
Common::strlcpy(_vm->_inter->_variables->getAddressOffString(varNum), argv[2], maxLength);
}
- DebugPrintf("varString_%d = \"%s\"\n", varNum, _vm->_inter->_variables->getAddressOffString(varNum));
+ debugPrintf("varString_%d = \"%s\"\n", varNum, _vm->_inter->_variables->getAddressOffString(varNum));
return true;
}
@@ -177,11 +177,11 @@ bool GobConsole::cmd_listArchives(int argc, const char **argv) {
_vm->_dataIO->getArchiveInfo(info);
- DebugPrintf(" Archive | Base | FileCount\n");
- DebugPrintf("--------------------------------\n");
+ debugPrintf(" Archive | Base | FileCount\n");
+ debugPrintf("--------------------------------\n");
for (Common::Array<ArchiveInfo>::const_iterator it = info.begin(); it != info.end(); ++it)
if (!it->name.empty())
- DebugPrintf("%13s | %d | %d\n", it->name.c_str(), it->base, it->fileCount);
+ debugPrintf("%13s | %d | %d\n", it->name.c_str(), it->base, it->fileCount);
return true;
}
diff --git a/engines/gob/console.h b/engines/gob/console.h
index 5b6f0255dd..26a9cb69dd 100644
--- a/engines/gob/console.h
+++ b/engines/gob/console.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/gob/databases.cpp b/engines/gob/databases.cpp
index 497de489ce..d8d1875371 100644
--- a/engines/gob/databases.cpp
+++ b/engines/gob/databases.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/gob/databases.h b/engines/gob/databases.h
index cde123e6a8..8ef48b480f 100644
--- a/engines/gob/databases.h
+++ b/engines/gob/databases.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/gob/dataio.cpp b/engines/gob/dataio.cpp
index 2071c0f1be..6deaef417e 100644
--- a/engines/gob/dataio.cpp
+++ b/engines/gob/dataio.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/gob/dataio.h b/engines/gob/dataio.h
index adf0786389..00fe00e3f5 100644
--- a/engines/gob/dataio.h
+++ b/engines/gob/dataio.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/gob/dbase.cpp b/engines/gob/dbase.cpp
index 41bd5308ec..5e44ec133e 100644
--- a/engines/gob/dbase.cpp
+++ b/engines/gob/dbase.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/gob/dbase.h b/engines/gob/dbase.h
index 3da1ef7270..387f5029b3 100644
--- a/engines/gob/dbase.h
+++ b/engines/gob/dbase.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/gob/decfile.cpp b/engines/gob/decfile.cpp
index 85b4c09ca3..3ea3773ec6 100644
--- a/engines/gob/decfile.cpp
+++ b/engines/gob/decfile.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/gob/decfile.h b/engines/gob/decfile.h
index 48af740d41..f6946b9b79 100644
--- a/engines/gob/decfile.h
+++ b/engines/gob/decfile.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/gob/demos/batplayer.cpp b/engines/gob/demos/batplayer.cpp
index 9c073f0e77..6aa62e3db0 100644
--- a/engines/gob/demos/batplayer.cpp
+++ b/engines/gob/demos/batplayer.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/gob/demos/batplayer.h b/engines/gob/demos/batplayer.h
index f406ea1bf8..a0a9f17c01 100644
--- a/engines/gob/demos/batplayer.h
+++ b/engines/gob/demos/batplayer.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/gob/demos/demoplayer.cpp b/engines/gob/demos/demoplayer.cpp
index 9aa7a4123d..4812301a6b 100644
--- a/engines/gob/demos/demoplayer.cpp
+++ b/engines/gob/demos/demoplayer.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/gob/demos/demoplayer.h b/engines/gob/demos/demoplayer.h
index 9ffdb71de1..63ef538b97 100644
--- a/engines/gob/demos/demoplayer.h
+++ b/engines/gob/demos/demoplayer.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/gob/demos/scnplayer.cpp b/engines/gob/demos/scnplayer.cpp
index 434c49c4bd..7b820d168a 100644
--- a/engines/gob/demos/scnplayer.cpp
+++ b/engines/gob/demos/scnplayer.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/gob/demos/scnplayer.h b/engines/gob/demos/scnplayer.h
index 8627f8ceeb..aef1b3eb2f 100644
--- a/engines/gob/demos/scnplayer.h
+++ b/engines/gob/demos/scnplayer.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/gob/detection/detection.cpp b/engines/gob/detection/detection.cpp
index 8fb0052a5b..3b26f63c39 100644
--- a/engines/gob/detection/detection.cpp
+++ b/engines/gob/detection/detection.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/gob/detection/tables.h b/engines/gob/detection/tables.h
index 271f75af79..9b24203aa8 100644
--- a/engines/gob/detection/tables.h
+++ b/engines/gob/detection/tables.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -55,6 +55,7 @@ static const PlainGameDescriptor gobGames[] = {
{"ajworld", "A.J.'s World of Discovery"},
{"gob3", "Goblins Quest 3"},
{"gob3cd", "Goblins Quest 3 CD"},
+ {"crousti", "Croustibat"},
{"lit1", "Lost in Time Part 1"},
{"lit2", "Lost in Time Part 2"},
{"lit", "Lost in Time"},
@@ -110,6 +111,7 @@ static const GOBGameDescription gameDescriptions[] = {
#include "gob/detection/tables_adi4.h" // The ADI / Addy 4 series
#include "gob/detection/tables_adibou.h" // The Adibou / Addy Junior series
#include "gob/detection/tables_ajworld.h" // A.J.'s World of Discovery / ADI Jr.
+ #include "gob/detection/tables_crousti.h" // Croustibat
{ AD_TABLE_END_MARKER, kGameTypeNone, kFeaturesNone, 0, 0, 0}
};
diff --git a/engines/gob/detection/tables_adi2.h b/engines/gob/detection/tables_adi2.h
index e59552a554..0ca90e7d31 100644
--- a/engines/gob/detection/tables_adi2.h
+++ b/engines/gob/detection/tables_adi2.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/gob/detection/tables_adi4.h b/engines/gob/detection/tables_adi4.h
index 7147a84d7a..9921b9c974 100644
--- a/engines/gob/detection/tables_adi4.h
+++ b/engines/gob/detection/tables_adi4.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/gob/detection/tables_adibou.h b/engines/gob/detection/tables_adibou.h
index e257ffdf8f..a995e8d1b3 100644
--- a/engines/gob/detection/tables_adibou.h
+++ b/engines/gob/detection/tables_adibou.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/gob/detection/tables_ajworld.h b/engines/gob/detection/tables_ajworld.h
index 99d61c882e..5e2023333c 100644
--- a/engines/gob/detection/tables_ajworld.h
+++ b/engines/gob/detection/tables_ajworld.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/gob/detection/tables_bargon.h b/engines/gob/detection/tables_bargon.h
index 5f7fa2ab6f..d8e2c53410 100644
--- a/engines/gob/detection/tables_bargon.h
+++ b/engines/gob/detection/tables_bargon.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/gob/detection/tables_crousti.h b/engines/gob/detection/tables_crousti.h
new file mode 100644
index 0000000000..2e04bdeba8
--- /dev/null
+++ b/engines/gob/detection/tables_crousti.h
@@ -0,0 +1,45 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ */
+
+/* Detection tables for Croustibat. */
+
+#ifndef GOB_DETECTION_TABLES_CROUSTI_H
+#define GOB_DETECTION_TABLES_CROUSTI_H
+
+// -- DOS VGA Floppy --
+
+{
+ {
+ "crousti",
+ "",
+ AD_ENTRY1s("intro.stk", "63fd795818fa72c32b903bbd99e18ea1", 851926),
+ PT_BRA,
+ kPlatformDOS,
+ ADGF_NO_FLAGS,
+ GUIO2(GUIO_NOSUBTITLES, GUIO_NOSPEECH)
+ },
+ kGameTypeCrousti,
+ kFeaturesAdLib,
+ 0, 0, 0
+},
+
+#endif // GOB_DETECTION_TABLES_CROUSTI_H
diff --git a/engines/gob/detection/tables_dynasty.h b/engines/gob/detection/tables_dynasty.h
index 21e4ecc89f..80a3b7d543 100644
--- a/engines/gob/detection/tables_dynasty.h
+++ b/engines/gob/detection/tables_dynasty.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/gob/detection/tables_fallback.h b/engines/gob/detection/tables_fallback.h
index 69a9e4fd6b..27b4d1bf75 100644
--- a/engines/gob/detection/tables_fallback.h
+++ b/engines/gob/detection/tables_fallback.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/gob/detection/tables_fascin.h b/engines/gob/detection/tables_fascin.h
index b74a057db9..7c7c9a7a2f 100644
--- a/engines/gob/detection/tables_fascin.h
+++ b/engines/gob/detection/tables_fascin.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/gob/detection/tables_geisha.h b/engines/gob/detection/tables_geisha.h
index e9a5cfb77f..01e2ec9ad0 100644
--- a/engines/gob/detection/tables_geisha.h
+++ b/engines/gob/detection/tables_geisha.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/gob/detection/tables_gob1.h b/engines/gob/detection/tables_gob1.h
index 8ae72abf33..289e32e121 100644
--- a/engines/gob/detection/tables_gob1.h
+++ b/engines/gob/detection/tables_gob1.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/gob/detection/tables_gob2.h b/engines/gob/detection/tables_gob2.h
index f2449d086d..7c167593ca 100644
--- a/engines/gob/detection/tables_gob2.h
+++ b/engines/gob/detection/tables_gob2.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/gob/detection/tables_gob3.h b/engines/gob/detection/tables_gob3.h
index 29a76d2491..55c840f44e 100644
--- a/engines/gob/detection/tables_gob3.h
+++ b/engines/gob/detection/tables_gob3.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/gob/detection/tables_inca2.h b/engines/gob/detection/tables_inca2.h
index 8ca9463277..30ed73eafa 100644
--- a/engines/gob/detection/tables_inca2.h
+++ b/engines/gob/detection/tables_inca2.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/gob/detection/tables_lit.h b/engines/gob/detection/tables_lit.h
index c4453312ec..f6df3162db 100644
--- a/engines/gob/detection/tables_lit.h
+++ b/engines/gob/detection/tables_lit.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/gob/detection/tables_littlered.h b/engines/gob/detection/tables_littlered.h
index 55279f72b6..21aa9d4a04 100644
--- a/engines/gob/detection/tables_littlered.h
+++ b/engines/gob/detection/tables_littlered.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/gob/detection/tables_onceupon.h b/engines/gob/detection/tables_onceupon.h
index c516719c55..f89a842176 100644
--- a/engines/gob/detection/tables_onceupon.h
+++ b/engines/gob/detection/tables_onceupon.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/gob/detection/tables_playtoons.h b/engines/gob/detection/tables_playtoons.h
index 5bdc337eba..f249e3ffa6 100644
--- a/engines/gob/detection/tables_playtoons.h
+++ b/engines/gob/detection/tables_playtoons.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/gob/detection/tables_urban.h b/engines/gob/detection/tables_urban.h
index 71c34c9d89..78fc0893ae 100644
--- a/engines/gob/detection/tables_urban.h
+++ b/engines/gob/detection/tables_urban.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/gob/detection/tables_ween.h b/engines/gob/detection/tables_ween.h
index 89da5ba794..66a83aff0f 100644
--- a/engines/gob/detection/tables_ween.h
+++ b/engines/gob/detection/tables_ween.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/gob/detection/tables_woodruff.h b/engines/gob/detection/tables_woodruff.h
index f6675a0981..b96065b14f 100644
--- a/engines/gob/detection/tables_woodruff.h
+++ b/engines/gob/detection/tables_woodruff.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/gob/draw.cpp b/engines/gob/draw.cpp
index e1322c2831..3ee6d64bec 100644
--- a/engines/gob/draw.cpp
+++ b/engines/gob/draw.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -88,11 +88,6 @@ Draw::Draw(GobEngine *vm) : _vm(vm) {
_vgaPalette[i].blue = 0;
_vgaPalette[i].green = 0;
}
- for (int i = 0; i < 16; i++) {
- _vgaSmallPalette[i].red = 0;
- _vgaSmallPalette[i].blue = 0;
- _vgaSmallPalette[i].green = 0;
- }
_showCursor = 0;
_cursorIndex = 0;
diff --git a/engines/gob/draw.h b/engines/gob/draw.h
index b51c6466e0..eb12e85468 100644
--- a/engines/gob/draw.h
+++ b/engines/gob/draw.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -115,7 +115,6 @@ public:
int16 _unusedPalette1[18];
int16 _unusedPalette2[16];
Video::Color _vgaPalette[256];
- Video::Color _vgaSmallPalette[16];
// 0 (00b): No cursor
// 1 (01b): Cursor would be on _backSurface
diff --git a/engines/gob/draw_bargon.cpp b/engines/gob/draw_bargon.cpp
index a2a70927f6..34f8b06dbb 100644
--- a/engines/gob/draw_bargon.cpp
+++ b/engines/gob/draw_bargon.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/gob/draw_fascin.cpp b/engines/gob/draw_fascin.cpp
index 12009d7ee5..60b173de6c 100644
--- a/engines/gob/draw_fascin.cpp
+++ b/engines/gob/draw_fascin.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -882,8 +882,6 @@ bool Draw_Fascination::overlapWin(int16 idWin1, int16 idWin2) {
void Draw_Fascination::activeWin(int16 id) {
bool found = false;
int16 t[10], t2[10];
- int nextId = -1;
- int oldId = -1;
SurfacePtr tempSrf;
SurfacePtr oldSrf[10];
@@ -906,6 +904,8 @@ void Draw_Fascination::activeWin(int16 id) {
}
if (found) {
+ int nextId = -1;
+ int oldId = -1;
for (int i = 9; i >= 0; i--) {
if (t[i] != -1) {
if (nextId != -1)
diff --git a/engines/gob/draw_playtoons.cpp b/engines/gob/draw_playtoons.cpp
index 76e2ae591c..5fe5657270 100644
--- a/engines/gob/draw_playtoons.cpp
+++ b/engines/gob/draw_playtoons.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/gob/draw_v1.cpp b/engines/gob/draw_v1.cpp
index 878c1dc265..d17aad5cad 100644
--- a/engines/gob/draw_v1.cpp
+++ b/engines/gob/draw_v1.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/gob/draw_v2.cpp b/engines/gob/draw_v2.cpp
index f5475278c4..9855b1ebd7 100644
--- a/engines/gob/draw_v2.cpp
+++ b/engines/gob/draw_v2.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/gob/expression.cpp b/engines/gob/expression.cpp
index 5cea8c0485..1a99412530 100644
--- a/engines/gob/expression.cpp
+++ b/engines/gob/expression.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/gob/expression.h b/engines/gob/expression.h
index ecce7c869d..7d4466509b 100644
--- a/engines/gob/expression.h
+++ b/engines/gob/expression.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/gob/game.cpp b/engines/gob/game.cpp
index de0c3f2d5c..d8e39e6c38 100644
--- a/engines/gob/game.cpp
+++ b/engines/gob/game.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/gob/game.h b/engines/gob/game.h
index 995baa5629..1bcf0b1e2a 100644
--- a/engines/gob/game.h
+++ b/engines/gob/game.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/gob/global.cpp b/engines/gob/global.cpp
index 87656a5fad..e943e1f023 100644
--- a/engines/gob/global.cpp
+++ b/engines/gob/global.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/gob/global.h b/engines/gob/global.h
index 175331dd83..742771733c 100644
--- a/engines/gob/global.h
+++ b/engines/gob/global.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/gob/gob.cpp b/engines/gob/gob.cpp
index fcf98f0355..5ab3271a8f 100644
--- a/engines/gob/gob.cpp
+++ b/engines/gob/gob.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -457,6 +457,7 @@ Common::Error GobEngine::initGameParts() {
case kGameTypeWeen:
case kGameTypeGob2:
+ case kGameTypeCrousti:
_init = new Init_v2(this);
_video = new Video_v2(this);
_inter = new Inter_v2(this);
diff --git a/engines/gob/gob.h b/engines/gob/gob.h
index df73404596..aefc63c707 100644
--- a/engines/gob/gob.h
+++ b/engines/gob/gob.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -55,6 +55,7 @@ class StaticTextWidget;
* - Bambou le sauveur de la jungle
* - Geisha
* - Once Upon A Time: Little Red Riding Hood
+ * - Croustibat
*/
namespace Gob {
@@ -134,7 +135,8 @@ enum GameType {
kGameTypeBabaYaga,
kGameTypeLittleRed,
kGameTypeOnceUponATime, // Need more inspection to see if Baba Yaga or Abracadabra
- kGameTypeAJWorld
+ kGameTypeAJWorld,
+ kGameTypeCrousti
};
enum Features {
diff --git a/engines/gob/goblin.cpp b/engines/gob/goblin.cpp
index a032588a1f..5f697d21fb 100644
--- a/engines/gob/goblin.cpp
+++ b/engines/gob/goblin.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/gob/goblin.h b/engines/gob/goblin.h
index 3d45da599d..ad41df8270 100644
--- a/engines/gob/goblin.h
+++ b/engines/gob/goblin.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/gob/goblin_v1.cpp b/engines/gob/goblin_v1.cpp
index ea46b4b9a1..760e5e65a9 100644
--- a/engines/gob/goblin_v1.cpp
+++ b/engines/gob/goblin_v1.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/gob/goblin_v2.cpp b/engines/gob/goblin_v2.cpp
index 2dbdf39d7d..4dadf33883 100644
--- a/engines/gob/goblin_v2.cpp
+++ b/engines/gob/goblin_v2.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/gob/goblin_v3.cpp b/engines/gob/goblin_v3.cpp
index 38880bfdb6..7a64ba7671 100644
--- a/engines/gob/goblin_v3.cpp
+++ b/engines/gob/goblin_v3.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/gob/goblin_v4.cpp b/engines/gob/goblin_v4.cpp
index 0d6a995af9..908b4ef616 100644
--- a/engines/gob/goblin_v4.cpp
+++ b/engines/gob/goblin_v4.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope 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.
diff --git a/engines/gob/hotspots.cpp b/engines/gob/hotspots.cpp
index cd00cd13d7..7aad47b314 100644
--- a/engines/gob/hotspots.cpp
+++ b/engines/gob/hotspots.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/gob/hotspots.h b/engines/gob/hotspots.h
index bd7b281c10..912ac8a20e 100644
--- a/engines/gob/hotspots.h
+++ b/engines/gob/hotspots.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/gob/iniconfig.cpp b/engines/gob/iniconfig.cpp
index 032231bd4d..885495d640 100644
--- a/engines/gob/iniconfig.cpp
+++ b/engines/gob/iniconfig.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/gob/iniconfig.h b/engines/gob/iniconfig.h
index c1890170dc..3d4021f250 100644
--- a/engines/gob/iniconfig.h
+++ b/engines/gob/iniconfig.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/gob/init.cpp b/engines/gob/init.cpp
index 814d4d1821..a986d696f2 100644
--- a/engines/gob/init.cpp
+++ b/engines/gob/init.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/gob/init.h b/engines/gob/init.h
index ac460fd654..6b7ce74950 100644
--- a/engines/gob/init.h
+++ b/engines/gob/init.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/gob/init_fascin.cpp b/engines/gob/init_fascin.cpp
index e6d82faa68..d3d0394b2e 100644
--- a/engines/gob/init_fascin.cpp
+++ b/engines/gob/init_fascin.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/gob/init_geisha.cpp b/engines/gob/init_geisha.cpp
index 01081a5af6..9de4ddb42b 100644
--- a/engines/gob/init_geisha.cpp
+++ b/engines/gob/init_geisha.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/gob/init_v1.cpp b/engines/gob/init_v1.cpp
index a8e8cbe2c3..a48e096562 100644
--- a/engines/gob/init_v1.cpp
+++ b/engines/gob/init_v1.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/gob/init_v2.cpp b/engines/gob/init_v2.cpp
index 1540ff6601..6040a1a21d 100644
--- a/engines/gob/init_v2.cpp
+++ b/engines/gob/init_v2.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/gob/init_v3.cpp b/engines/gob/init_v3.cpp
index bfbe00849f..d47967557f 100644
--- a/engines/gob/init_v3.cpp
+++ b/engines/gob/init_v3.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/gob/init_v4.cpp b/engines/gob/init_v4.cpp
index ba92c2fc04..5f3061b096 100644
--- a/engines/gob/init_v4.cpp
+++ b/engines/gob/init_v4.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/gob/init_v6.cpp b/engines/gob/init_v6.cpp
index 6059ec89ed..4b09286619 100644
--- a/engines/gob/init_v6.cpp
+++ b/engines/gob/init_v6.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/gob/init_v7.cpp b/engines/gob/init_v7.cpp
index b5b51aad2a..69fbf8ae74 100644
--- a/engines/gob/init_v7.cpp
+++ b/engines/gob/init_v7.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/gob/inter.cpp b/engines/gob/inter.cpp
index 4460274561..2a8539846c 100644
--- a/engines/gob/inter.cpp
+++ b/engines/gob/inter.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/gob/inter.h b/engines/gob/inter.h
index 2aa837e777..a5fa03c2a1 100644
--- a/engines/gob/inter.h
+++ b/engines/gob/inter.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -439,6 +439,7 @@ protected:
void o2_animPalInit(OpFuncParams &params);
void o2_addHotspot(OpFuncParams &params);
void o2_removeHotspot(OpFuncParams &params);
+ void o2_getTotTextItemPart(OpFuncParams &params);
void o2_goblinFunc(OpFuncParams &params);
void o2_stopSound(OpFuncParams &params);
void o2_loadSound(OpFuncParams &params);
@@ -540,7 +541,6 @@ protected:
virtual void setupOpcodesFunc();
virtual void setupOpcodesGob();
- void o3_getTotTextItemPart(OpFuncParams &params);
void o3_speakerOn(OpFuncParams &params);
void o3_speakerOff(OpFuncParams &params);
void o3_copySprite(OpFuncParams &params);
diff --git a/engines/gob/inter_bargon.cpp b/engines/gob/inter_bargon.cpp
index 029f7c697b..f4a62a6a25 100644
--- a/engines/gob/inter_bargon.cpp
+++ b/engines/gob/inter_bargon.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/gob/inter_fascin.cpp b/engines/gob/inter_fascin.cpp
index c3b5d98a58..c67143346b 100644
--- a/engines/gob/inter_fascin.cpp
+++ b/engines/gob/inter_fascin.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/gob/inter_geisha.cpp b/engines/gob/inter_geisha.cpp
index 8d05cefa66..8102dbfa9b 100644
--- a/engines/gob/inter_geisha.cpp
+++ b/engines/gob/inter_geisha.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/gob/inter_inca2.cpp b/engines/gob/inter_inca2.cpp
index f868f18242..555fdfaf27 100644
--- a/engines/gob/inter_inca2.cpp
+++ b/engines/gob/inter_inca2.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/gob/inter_littlered.cpp b/engines/gob/inter_littlered.cpp
index 01aa4c2158..c817ce648f 100644
--- a/engines/gob/inter_littlered.cpp
+++ b/engines/gob/inter_littlered.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/gob/inter_playtoons.cpp b/engines/gob/inter_playtoons.cpp
index b0bdde07ac..45f573efcd 100644
--- a/engines/gob/inter_playtoons.cpp
+++ b/engines/gob/inter_playtoons.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/gob/inter_v1.cpp b/engines/gob/inter_v1.cpp
index dc533a210a..40134bbf17 100644
--- a/engines/gob/inter_v1.cpp
+++ b/engines/gob/inter_v1.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -1125,7 +1125,7 @@ void Inter_v1::o1_palLoad(OpFuncParams &params) {
_vm->_draw->_vgaPalette[i].blue = _vm->_game->_script->readByte();
}
- memcpy(_vm->_draw->_vgaSmallPalette, _vm->_draw->_vgaPalette, 16 * 3);
+ memcpy(_vm->_draw->_vgaPalette, _vm->_draw->_vgaPalette, 16 * 3);
break;
case 53:
@@ -1183,7 +1183,7 @@ void Inter_v1::o1_palLoad(OpFuncParams &params) {
_vm->_palAnim->fade(_vm->_global->_pPaletteDesc, 0, 0);
return;
}
- _vm->_global->_pPaletteDesc->vgaPal = _vm->_draw->_vgaSmallPalette;
+ _vm->_global->_pPaletteDesc->vgaPal = _vm->_draw->_vgaPalette;
_vm->_palAnim->fade(_vm->_global->_pPaletteDesc, 0, 0);
}
}
@@ -2489,21 +2489,21 @@ void Inter_v1::animPalette() {
_vm->_video->waitRetrace();
if (_animPalDir[0] == -1) {
- col = _vm->_draw->_vgaSmallPalette[_animPalLowIndex[0]];
+ col = _vm->_draw->_vgaPalette[_animPalLowIndex[0]];
for (i = _animPalLowIndex[0]; i < _animPalHighIndex[0]; i++)
- _vm->_draw->_vgaSmallPalette[i] = _vm->_draw->_vgaSmallPalette[i + 1];
+ _vm->_draw->_vgaPalette[i] = _vm->_draw->_vgaPalette[i + 1];
- _vm->_draw->_vgaSmallPalette[_animPalHighIndex[0]] = col;
+ _vm->_draw->_vgaPalette[_animPalHighIndex[0]] = col;
} else {
- col = _vm->_draw->_vgaSmallPalette[_animPalHighIndex[0]];
+ col = _vm->_draw->_vgaPalette[_animPalHighIndex[0]];
for (i = _animPalHighIndex[0]; i > _animPalLowIndex[0]; i--)
- _vm->_draw->_vgaSmallPalette[i] = _vm->_draw->_vgaSmallPalette[i - 1];
+ _vm->_draw->_vgaPalette[i] = _vm->_draw->_vgaPalette[i - 1];
- _vm->_draw->_vgaSmallPalette[_animPalLowIndex[0]] = col;
+ _vm->_draw->_vgaPalette[_animPalLowIndex[0]] = col;
}
- _vm->_global->_pPaletteDesc->vgaPal = _vm->_draw->_vgaSmallPalette;
+ _vm->_global->_pPaletteDesc->vgaPal = _vm->_draw->_vgaPalette;
_vm->_video->setFullPalette(_vm->_global->_pPaletteDesc);
}
diff --git a/engines/gob/inter_v2.cpp b/engines/gob/inter_v2.cpp
index 6b7a4f03bd..3aa7ad1664 100644
--- a/engines/gob/inter_v2.cpp
+++ b/engines/gob/inter_v2.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -124,6 +124,7 @@ void Inter_v2::setupOpcodesFunc() {
OPCODEFUNC(0x18, o2_addHotspot);
OPCODEFUNC(0x19, o2_removeHotspot);
+ OPCODEFUNC(0x1A, o2_getTotTextItemPart);
OPCODEFUNC(0x25, o2_goblinFunc);
@@ -1195,6 +1196,188 @@ void Inter_v2::o2_removeHotspot(OpFuncParams &params) {
_vm->_game->_hotspots->remove((stateType2 << 12) + id);
}
+void Inter_v2::o2_getTotTextItemPart(OpFuncParams &params) {
+ byte *totData;
+ int16 totTextItem;
+ int16 part, curPart = 0;
+ int16 offX = 0, offY = 0;
+ int16 collId = 0, collCmd;
+ uint32 stringStartVar, stringVar;
+ bool end;
+
+ totTextItem = _vm->_game->_script->readInt16();
+ stringStartVar = _vm->_game->_script->readVarIndex();
+ part = _vm->_game->_script->readValExpr();
+
+ stringVar = stringStartVar;
+ if (part == -1) {
+ warning("o2_getTotTextItemPart, part == -1");
+ _vm->_draw->_hotspotText = GET_VARO_STR(stringVar);
+ }
+
+ WRITE_VARO_UINT8(stringVar, 0);
+
+ TextItem *textItem = _vm->_game->_resources->getTextItem(totTextItem);
+ if (!textItem)
+ return;
+
+ totData = textItem->getData();
+
+ // Skip background rectangles
+ while (((int16) READ_LE_UINT16(totData)) != -1)
+ totData += 9;
+ totData += 2;
+
+ while (*totData != 1) {
+ switch (*totData) {
+ case 2:
+ case 5:
+ totData++;
+ offX = READ_LE_UINT16(totData);
+ offY = READ_LE_UINT16(totData + 2);
+ totData += 4;
+ break;
+
+ case 3:
+ case 4:
+ totData += 2;
+ break;
+
+ case 6:
+ totData++;
+
+ collCmd = *totData++;
+ if (collCmd & 0x80) {
+ collId = READ_LE_UINT16(totData);
+ totData += 2;
+ }
+
+ // Skip collision coordinates
+ if (collCmd & 0x40)
+ totData += 8;
+
+ if ((collCmd & 0x8F) && ((-collId - 1) == part)) {
+ int n = 0;
+
+ while (1) {
+ if ((*totData < 1) || (*totData > 7)) {
+ if (*totData >= 32) {
+ WRITE_VARO_UINT8(stringVar++, *totData++);
+ n++;
+ } else
+ totData++;
+ continue;
+ }
+
+ if ((n != 0) || (*totData == 1) ||
+ (*totData == 6) || (*totData == 7)) {
+ WRITE_VARO_UINT8(stringVar, 0);
+ delete textItem;
+ return;
+ }
+
+ switch (*totData) {
+ case 2:
+ case 5:
+ totData += 5;
+ break;
+
+ case 3:
+ case 4:
+ totData += 2;
+ break;
+ }
+ }
+
+ }
+ break;
+
+ case 7:
+ case 8:
+ case 9:
+ totData++;
+ break;
+
+ case 10:
+ if (curPart == part) {
+ WRITE_VARO_UINT8(stringVar++, 0xFF);
+ WRITE_VARO_UINT16(stringVar, offX);
+ WRITE_VARO_UINT16(stringVar + 2, offY);
+ WRITE_VARO_UINT16(stringVar + 4,
+ totData - _vm->_game->_resources->getTexts());
+ WRITE_VARO_UINT8(stringVar + 6, 0);
+ delete textItem;
+ return;
+ }
+
+ end = false;
+ while (!end) {
+ switch (*totData) {
+ case 2:
+ case 5:
+ if (ABS(offY - READ_LE_UINT16(totData + 3)) > 1)
+ end = true;
+ else
+ totData += 5;
+ break;
+
+ case 3:
+ totData += 2;
+ break;
+
+ case 10:
+ totData += totData[1] * 2 + 2;
+ break;
+
+ default:
+ if (*totData < 32)
+ end = true;
+ while (*totData >= 32)
+ totData++;
+ break;
+ }
+ }
+
+ if (part >= 0)
+ curPart++;
+ break;
+
+ default:
+ while (1) {
+
+ while (*totData >= 32)
+ WRITE_VARO_UINT8(stringVar++, *totData++);
+ WRITE_VARO_UINT8(stringVar, 0);
+
+ if (((*totData != 2) && (*totData != 5)) ||
+ (ABS(offY - READ_LE_UINT16(totData + 3)) > 1)) {
+
+ if (curPart == part) {
+ delete textItem;
+ return;
+ }
+
+ stringVar = stringStartVar;
+ WRITE_VARO_UINT8(stringVar, 0);
+
+ while (*totData >= 32)
+ totData++;
+
+ if (part >= 0)
+ curPart++;
+ break;
+
+ } else
+ totData += 5;
+
+ }
+ break;
+ }
+ }
+
+ delete textItem;
+}
+
void Inter_v2::o2_goblinFunc(OpFuncParams &params) {
OpGobParams gobParams;
int16 cmd;
diff --git a/engines/gob/inter_v3.cpp b/engines/gob/inter_v3.cpp
index edf56012d9..fd729b85be 100644
--- a/engines/gob/inter_v3.cpp
+++ b/engines/gob/inter_v3.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -50,7 +50,6 @@ void Inter_v3::setupOpcodesDraw() {
void Inter_v3::setupOpcodesFunc() {
Inter_v2::setupOpcodesFunc();
- OPCODEFUNC(0x1A, o3_getTotTextItemPart);
OPCODEFUNC(0x22, o3_speakerOn);
OPCODEFUNC(0x23, o3_speakerOff);
OPCODEFUNC(0x32, o3_copySprite);
@@ -66,188 +65,6 @@ void Inter_v3::setupOpcodesGob() {
OPCODEGOB(100, o3_wobble);
}
-void Inter_v3::o3_getTotTextItemPart(OpFuncParams &params) {
- byte *totData;
- int16 totTextItem;
- int16 part, curPart = 0;
- int16 offX = 0, offY = 0;
- int16 collId = 0, collCmd;
- uint32 stringStartVar, stringVar;
- bool end;
-
- totTextItem = _vm->_game->_script->readInt16();
- stringStartVar = _vm->_game->_script->readVarIndex();
- part = _vm->_game->_script->readValExpr();
-
- stringVar = stringStartVar;
- if (part == -1) {
- warning("o3_getTotTextItemPart, part == -1");
- _vm->_draw->_hotspotText = GET_VARO_STR(stringVar);
- }
-
- WRITE_VARO_UINT8(stringVar, 0);
-
- TextItem *textItem = _vm->_game->_resources->getTextItem(totTextItem);
- if (!textItem)
- return;
-
- totData = textItem->getData();
-
- // Skip background rectangles
- while (((int16) READ_LE_UINT16(totData)) != -1)
- totData += 9;
- totData += 2;
-
- while (*totData != 1) {
- switch (*totData) {
- case 2:
- case 5:
- totData++;
- offX = READ_LE_UINT16(totData);
- offY = READ_LE_UINT16(totData + 2);
- totData += 4;
- break;
-
- case 3:
- case 4:
- totData += 2;
- break;
-
- case 6:
- totData++;
-
- collCmd = *totData++;
- if (collCmd & 0x80) {
- collId = READ_LE_UINT16(totData);
- totData += 2;
- }
-
- // Skip collision coordinates
- if (collCmd & 0x40)
- totData += 8;
-
- if ((collCmd & 0x8F) && ((-collId - 1) == part)) {
- int n = 0;
-
- while (1) {
- if ((*totData < 1) || (*totData > 7)) {
- if (*totData >= 32) {
- WRITE_VARO_UINT8(stringVar++, *totData++);
- n++;
- } else
- totData++;
- continue;
- }
-
- if ((n != 0) || (*totData == 1) ||
- (*totData == 6) || (*totData == 7)) {
- WRITE_VARO_UINT8(stringVar, 0);
- delete textItem;
- return;
- }
-
- switch (*totData) {
- case 2:
- case 5:
- totData += 5;
- break;
-
- case 3:
- case 4:
- totData += 2;
- break;
- }
- }
-
- }
- break;
-
- case 7:
- case 8:
- case 9:
- totData++;
- break;
-
- case 10:
- if (curPart == part) {
- WRITE_VARO_UINT8(stringVar++, 0xFF);
- WRITE_VARO_UINT16(stringVar, offX);
- WRITE_VARO_UINT16(stringVar + 2, offY);
- WRITE_VARO_UINT16(stringVar + 4,
- totData - _vm->_game->_resources->getTexts());
- WRITE_VARO_UINT8(stringVar + 6, 0);
- delete textItem;
- return;
- }
-
- end = false;
- while (!end) {
- switch (*totData) {
- case 2:
- case 5:
- if (ABS(offY - READ_LE_UINT16(totData + 3)) > 1)
- end = true;
- else
- totData += 5;
- break;
-
- case 3:
- totData += 2;
- break;
-
- case 10:
- totData += totData[1] * 2 + 2;
- break;
-
- default:
- if (*totData < 32)
- end = true;
- while (*totData >= 32)
- totData++;
- break;
- }
- }
-
- if (part >= 0)
- curPart++;
- break;
-
- default:
- while (1) {
-
- while (*totData >= 32)
- WRITE_VARO_UINT8(stringVar++, *totData++);
- WRITE_VARO_UINT8(stringVar, 0);
-
- if (((*totData != 2) && (*totData != 5)) ||
- (ABS(offY - READ_LE_UINT16(totData + 3)) > 1)) {
-
- if (curPart == part) {
- delete textItem;
- return;
- }
-
- stringVar = stringStartVar;
- WRITE_VARO_UINT8(stringVar, 0);
-
- while (*totData >= 32)
- totData++;
-
- if (part >= 0)
- curPart++;
- break;
-
- } else
- totData += 5;
-
- }
- break;
- }
- }
-
- delete textItem;
-}
-
void Inter_v3::o3_speakerOn(OpFuncParams &params) {
int16 frequency = _vm->_game->_script->readValExpr();
int32 length = -1;
diff --git a/engines/gob/inter_v4.cpp b/engines/gob/inter_v4.cpp
index f89af0e45a..656ca6f5c3 100644
--- a/engines/gob/inter_v4.cpp
+++ b/engines/gob/inter_v4.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/gob/inter_v5.cpp b/engines/gob/inter_v5.cpp
index 24905b08d1..50176e0a27 100644
--- a/engines/gob/inter_v5.cpp
+++ b/engines/gob/inter_v5.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/gob/inter_v6.cpp b/engines/gob/inter_v6.cpp
index 505993ee4d..66eade60f7 100644
--- a/engines/gob/inter_v6.cpp
+++ b/engines/gob/inter_v6.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/gob/inter_v7.cpp b/engines/gob/inter_v7.cpp
index 1238c23e3b..fd9406054c 100644
--- a/engines/gob/inter_v7.cpp
+++ b/engines/gob/inter_v7.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -27,7 +27,8 @@
#include "graphics/cursorman.h"
#include "graphics/wincursor.h"
-#include "graphics/decoders/iff.h"
+
+#include "image/iff.h"
#include "gob/gob.h"
#include "gob/global.h"
@@ -547,7 +548,7 @@ void Inter_v7::o7_loadIFFPalette() {
return;
}
- Graphics::IFFDecoder decoder;
+ Image::IFFDecoder decoder;
decoder.loadStream(*iffFile);
if (!decoder.getPalette() || decoder.getPaletteColorCount() != 256) {
warning("o7_loadIFFPalette(): Failed reading palette from IFF \"%s\"", file.c_str());
diff --git a/engines/gob/map.cpp b/engines/gob/map.cpp
index e58cd3c9a3..1015a779b2 100644
--- a/engines/gob/map.cpp
+++ b/engines/gob/map.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/gob/map.h b/engines/gob/map.h
index 856cf356da..785b7342cd 100644
--- a/engines/gob/map.h
+++ b/engines/gob/map.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/gob/map_v1.cpp b/engines/gob/map_v1.cpp
index ce3d584e7f..72e37bd5fc 100644
--- a/engines/gob/map_v1.cpp
+++ b/engines/gob/map_v1.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/gob/map_v2.cpp b/engines/gob/map_v2.cpp
index 1db461370f..cb5abe9644 100644
--- a/engines/gob/map_v2.cpp
+++ b/engines/gob/map_v2.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/gob/minigames/geisha/diving.cpp b/engines/gob/minigames/geisha/diving.cpp
index 56c7b5213c..37ef291a93 100644
--- a/engines/gob/minigames/geisha/diving.cpp
+++ b/engines/gob/minigames/geisha/diving.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -389,8 +389,7 @@ void Diving::initScreen() {
_vm->_util->setFrameRate(15);
// Set palette
- memcpy(_vm->_draw->_vgaPalette , kPalette, sizeof(kPalette));
- memcpy(_vm->_draw->_vgaSmallPalette, kPalette, sizeof(kPalette));
+ memcpy(_vm->_draw->_vgaPalette, kPalette, sizeof(kPalette));
// Draw background decal
_vm->_draw->_backSurface->clear();
diff --git a/engines/gob/minigames/geisha/diving.h b/engines/gob/minigames/geisha/diving.h
index 089d60b260..7f28fa7330 100644
--- a/engines/gob/minigames/geisha/diving.h
+++ b/engines/gob/minigames/geisha/diving.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/gob/minigames/geisha/evilfish.cpp b/engines/gob/minigames/geisha/evilfish.cpp
index 05ae9d0ad4..cd47e689b1 100644
--- a/engines/gob/minigames/geisha/evilfish.cpp
+++ b/engines/gob/minigames/geisha/evilfish.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/gob/minigames/geisha/evilfish.h b/engines/gob/minigames/geisha/evilfish.h
index 4c82629461..9013c722c9 100644
--- a/engines/gob/minigames/geisha/evilfish.h
+++ b/engines/gob/minigames/geisha/evilfish.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/gob/minigames/geisha/meter.cpp b/engines/gob/minigames/geisha/meter.cpp
index 7ec3119866..29a5a20e9a 100644
--- a/engines/gob/minigames/geisha/meter.cpp
+++ b/engines/gob/minigames/geisha/meter.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/gob/minigames/geisha/meter.h b/engines/gob/minigames/geisha/meter.h
index 30dc826de0..4127353173 100644
--- a/engines/gob/minigames/geisha/meter.h
+++ b/engines/gob/minigames/geisha/meter.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/gob/minigames/geisha/mouth.cpp b/engines/gob/minigames/geisha/mouth.cpp
index 7ba9f86f8c..2a1fea13a5 100644
--- a/engines/gob/minigames/geisha/mouth.cpp
+++ b/engines/gob/minigames/geisha/mouth.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/gob/minigames/geisha/mouth.h b/engines/gob/minigames/geisha/mouth.h
index 2e0cfcd5d0..ea3373162b 100644
--- a/engines/gob/minigames/geisha/mouth.h
+++ b/engines/gob/minigames/geisha/mouth.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/gob/minigames/geisha/oko.cpp b/engines/gob/minigames/geisha/oko.cpp
index 7ad8be6fa2..29bdd50f47 100644
--- a/engines/gob/minigames/geisha/oko.cpp
+++ b/engines/gob/minigames/geisha/oko.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/gob/minigames/geisha/oko.h b/engines/gob/minigames/geisha/oko.h
index 82c6f59be4..90ce25b5b6 100644
--- a/engines/gob/minigames/geisha/oko.h
+++ b/engines/gob/minigames/geisha/oko.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/gob/minigames/geisha/penetration.cpp b/engines/gob/minigames/geisha/penetration.cpp
index c8c4f2bba7..0ebcd2c55b 100644
--- a/engines/gob/minigames/geisha/penetration.cpp
+++ b/engines/gob/minigames/geisha/penetration.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -840,8 +840,7 @@ void Penetration::setPalette() {
_vm->_palAnim->fade(0, 0, 0);
// Set palette
- memcpy(_vm->_draw->_vgaPalette , kPalettes[_floor], 3 * kPaletteSize);
- memcpy(_vm->_draw->_vgaSmallPalette, kPalettes[_floor], 3 * kPaletteSize);
+ memcpy(_vm->_draw->_vgaPalette, kPalettes[_floor], 3 * kPaletteSize);
_needFadeIn = true;
}
diff --git a/engines/gob/minigames/geisha/penetration.h b/engines/gob/minigames/geisha/penetration.h
index 50004eba8e..332ff00502 100644
--- a/engines/gob/minigames/geisha/penetration.h
+++ b/engines/gob/minigames/geisha/penetration.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/gob/minigames/geisha/submarine.cpp b/engines/gob/minigames/geisha/submarine.cpp
index bf15306e5a..9f7d2c696c 100644
--- a/engines/gob/minigames/geisha/submarine.cpp
+++ b/engines/gob/minigames/geisha/submarine.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/gob/minigames/geisha/submarine.h b/engines/gob/minigames/geisha/submarine.h
index a6eae57095..a82338667b 100644
--- a/engines/gob/minigames/geisha/submarine.h
+++ b/engines/gob/minigames/geisha/submarine.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/gob/mult.cpp b/engines/gob/mult.cpp
index b3d7ea6263..d4e3067c4e 100644
--- a/engines/gob/mult.cpp
+++ b/engines/gob/mult.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/gob/mult.h b/engines/gob/mult.h
index 860e5a12e1..bef5f1728f 100644
--- a/engines/gob/mult.h
+++ b/engines/gob/mult.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/gob/mult_v2.cpp b/engines/gob/mult_v2.cpp
index f6dddec71e..51471b55bb 100644
--- a/engines/gob/mult_v2.cpp
+++ b/engines/gob/mult_v2.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/gob/palanim.cpp b/engines/gob/palanim.cpp
index f90b141725..eed97ecaa6 100644
--- a/engines/gob/palanim.cpp
+++ b/engines/gob/palanim.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/gob/palanim.h b/engines/gob/palanim.h
index 8d8a1e4388..658b22d319 100644
--- a/engines/gob/palanim.h
+++ b/engines/gob/palanim.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/gob/pregob/gctfile.cpp b/engines/gob/pregob/gctfile.cpp
index 08c32cda76..ca842707d6 100644
--- a/engines/gob/pregob/gctfile.cpp
+++ b/engines/gob/pregob/gctfile.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/gob/pregob/gctfile.h b/engines/gob/pregob/gctfile.h
index ed6351b7a8..504634c0fd 100644
--- a/engines/gob/pregob/gctfile.h
+++ b/engines/gob/pregob/gctfile.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/gob/pregob/onceupon/abracadabra.cpp b/engines/gob/pregob/onceupon/abracadabra.cpp
index 2cf6855ef8..8c72931996 100644
--- a/engines/gob/pregob/onceupon/abracadabra.cpp
+++ b/engines/gob/pregob/onceupon/abracadabra.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/gob/pregob/onceupon/abracadabra.h b/engines/gob/pregob/onceupon/abracadabra.h
index 8048213f5f..f50a2a306f 100644
--- a/engines/gob/pregob/onceupon/abracadabra.h
+++ b/engines/gob/pregob/onceupon/abracadabra.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/gob/pregob/onceupon/babayaga.cpp b/engines/gob/pregob/onceupon/babayaga.cpp
index ef56b9dd0b..b556b8e4fb 100644
--- a/engines/gob/pregob/onceupon/babayaga.cpp
+++ b/engines/gob/pregob/onceupon/babayaga.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/gob/pregob/onceupon/babayaga.h b/engines/gob/pregob/onceupon/babayaga.h
index 0241f78f4e..5663751725 100644
--- a/engines/gob/pregob/onceupon/babayaga.h
+++ b/engines/gob/pregob/onceupon/babayaga.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/gob/pregob/onceupon/brokenstrings.h b/engines/gob/pregob/onceupon/brokenstrings.h
index 89acb1c6bd..4029b7572b 100644
--- a/engines/gob/pregob/onceupon/brokenstrings.h
+++ b/engines/gob/pregob/onceupon/brokenstrings.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/gob/pregob/onceupon/chargenchild.cpp b/engines/gob/pregob/onceupon/chargenchild.cpp
index ba099e4937..c04fa732ac 100644
--- a/engines/gob/pregob/onceupon/chargenchild.cpp
+++ b/engines/gob/pregob/onceupon/chargenchild.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/gob/pregob/onceupon/chargenchild.h b/engines/gob/pregob/onceupon/chargenchild.h
index 3b09ef112a..580d313e83 100644
--- a/engines/gob/pregob/onceupon/chargenchild.h
+++ b/engines/gob/pregob/onceupon/chargenchild.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/gob/pregob/onceupon/onceupon.cpp b/engines/gob/pregob/onceupon/onceupon.cpp
index e4c2df34c0..a6e4da75e7 100644
--- a/engines/gob/pregob/onceupon/onceupon.cpp
+++ b/engines/gob/pregob/onceupon/onceupon.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/gob/pregob/onceupon/onceupon.h b/engines/gob/pregob/onceupon/onceupon.h
index 66ef877618..17bc20667e 100644
--- a/engines/gob/pregob/onceupon/onceupon.h
+++ b/engines/gob/pregob/onceupon/onceupon.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/gob/pregob/onceupon/palettes.h b/engines/gob/pregob/onceupon/palettes.h
index 952581041c..0234f85718 100644
--- a/engines/gob/pregob/onceupon/palettes.h
+++ b/engines/gob/pregob/onceupon/palettes.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/gob/pregob/onceupon/parents.cpp b/engines/gob/pregob/onceupon/parents.cpp
index cdaee6a38d..a773d4c869 100644
--- a/engines/gob/pregob/onceupon/parents.cpp
+++ b/engines/gob/pregob/onceupon/parents.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/gob/pregob/onceupon/parents.h b/engines/gob/pregob/onceupon/parents.h
index f5c8307b73..4b3895e267 100644
--- a/engines/gob/pregob/onceupon/parents.h
+++ b/engines/gob/pregob/onceupon/parents.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/gob/pregob/onceupon/stork.cpp b/engines/gob/pregob/onceupon/stork.cpp
index 3c38037d08..b3ce261ee0 100644
--- a/engines/gob/pregob/onceupon/stork.cpp
+++ b/engines/gob/pregob/onceupon/stork.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/gob/pregob/onceupon/stork.h b/engines/gob/pregob/onceupon/stork.h
index ae57983000..dc7e986fd0 100644
--- a/engines/gob/pregob/onceupon/stork.h
+++ b/engines/gob/pregob/onceupon/stork.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/gob/pregob/onceupon/title.cpp b/engines/gob/pregob/onceupon/title.cpp
index a3905541a0..2e8fed80b3 100644
--- a/engines/gob/pregob/onceupon/title.cpp
+++ b/engines/gob/pregob/onceupon/title.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/gob/pregob/onceupon/title.h b/engines/gob/pregob/onceupon/title.h
index 5e7ef76d40..a19d061fc0 100644
--- a/engines/gob/pregob/onceupon/title.h
+++ b/engines/gob/pregob/onceupon/title.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/gob/pregob/pregob.cpp b/engines/gob/pregob/pregob.cpp
index 54eb3c6795..118bbbde83 100644
--- a/engines/gob/pregob/pregob.cpp
+++ b/engines/gob/pregob/pregob.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/gob/pregob/pregob.h b/engines/gob/pregob/pregob.h
index 632f85b88e..021cf2b3d6 100644
--- a/engines/gob/pregob/pregob.h
+++ b/engines/gob/pregob/pregob.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/gob/pregob/seqfile.cpp b/engines/gob/pregob/seqfile.cpp
index 91973bbb85..7cf5b16724 100644
--- a/engines/gob/pregob/seqfile.cpp
+++ b/engines/gob/pregob/seqfile.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/gob/pregob/seqfile.h b/engines/gob/pregob/seqfile.h
index 5e12962ef9..1b627aacdc 100644
--- a/engines/gob/pregob/seqfile.h
+++ b/engines/gob/pregob/seqfile.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/gob/pregob/txtfile.cpp b/engines/gob/pregob/txtfile.cpp
index 3ff0d4b039..861a34855b 100644
--- a/engines/gob/pregob/txtfile.cpp
+++ b/engines/gob/pregob/txtfile.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/gob/pregob/txtfile.h b/engines/gob/pregob/txtfile.h
index c623b58859..edb750acc6 100644
--- a/engines/gob/pregob/txtfile.h
+++ b/engines/gob/pregob/txtfile.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/gob/resources.cpp b/engines/gob/resources.cpp
index a84f4ac4b8..dbed825977 100644
--- a/engines/gob/resources.cpp
+++ b/engines/gob/resources.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -209,6 +209,7 @@ void Resources::unload(bool del) {
_totResourceTable = 0;
_extResourceTable = 0;
_totTextTable = 0;
+ _totResStart = 0;
_totData = 0;
_totSize = 0;
_imData = 0;
@@ -233,6 +234,8 @@ bool Resources::loadTOTResourceTable() {
if (!stream)
return false;
+ _totResStart = totProps.scriptEnd;
+
if ((totProps.resourcesOffset == 0xFFFFFFFF) ||
(totProps.resourcesOffset == 0))
// No resources here
@@ -271,7 +274,6 @@ bool Resources::loadTOTResourceTable() {
item.type = kResourceTOT;
}
- _totResStart = totProps.scriptEnd;
_totSize = stream->size() - _totResStart;
if (_totSize <= 0)
diff --git a/engines/gob/resources.h b/engines/gob/resources.h
index 04b3b9d31e..8d4d8b15ee 100644
--- a/engines/gob/resources.h
+++ b/engines/gob/resources.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/gob/rxyfile.cpp b/engines/gob/rxyfile.cpp
index 2ff8c121cd..5c8cc71b34 100644
--- a/engines/gob/rxyfile.cpp
+++ b/engines/gob/rxyfile.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/gob/rxyfile.h b/engines/gob/rxyfile.h
index 4fd46c5e40..1bbb91438c 100644
--- a/engines/gob/rxyfile.h
+++ b/engines/gob/rxyfile.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/gob/save/saveconverter.cpp b/engines/gob/save/saveconverter.cpp
index 2db3379aa7..1709e05e3a 100644
--- a/engines/gob/save/saveconverter.cpp
+++ b/engines/gob/save/saveconverter.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/gob/save/saveconverter.h b/engines/gob/save/saveconverter.h
index d8cf723fd3..c03de147c7 100644
--- a/engines/gob/save/saveconverter.h
+++ b/engines/gob/save/saveconverter.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/gob/save/saveconverter_v2.cpp b/engines/gob/save/saveconverter_v2.cpp
index 7661c47836..762f6e906a 100644
--- a/engines/gob/save/saveconverter_v2.cpp
+++ b/engines/gob/save/saveconverter_v2.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/gob/save/saveconverter_v3.cpp b/engines/gob/save/saveconverter_v3.cpp
index 2256575c4b..0e045178ad 100644
--- a/engines/gob/save/saveconverter_v3.cpp
+++ b/engines/gob/save/saveconverter_v3.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/gob/save/saveconverter_v4.cpp b/engines/gob/save/saveconverter_v4.cpp
index 2618a25f37..24e70c7fdb 100644
--- a/engines/gob/save/saveconverter_v4.cpp
+++ b/engines/gob/save/saveconverter_v4.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/gob/save/savefile.cpp b/engines/gob/save/savefile.cpp
index 0713c38684..2a32b7edcf 100644
--- a/engines/gob/save/savefile.cpp
+++ b/engines/gob/save/savefile.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/gob/save/savefile.h b/engines/gob/save/savefile.h
index 01825207e0..7d111f3c10 100644
--- a/engines/gob/save/savefile.h
+++ b/engines/gob/save/savefile.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/gob/save/savehandler.cpp b/engines/gob/save/savehandler.cpp
index 71de629f93..7a64582201 100644
--- a/engines/gob/save/savehandler.cpp
+++ b/engines/gob/save/savehandler.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/gob/save/savehandler.h b/engines/gob/save/savehandler.h
index afc31f54f1..452cc8e815 100644
--- a/engines/gob/save/savehandler.h
+++ b/engines/gob/save/savehandler.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/gob/save/saveload.cpp b/engines/gob/save/saveload.cpp
index 6b2f710159..f6967a79ad 100644
--- a/engines/gob/save/saveload.cpp
+++ b/engines/gob/save/saveload.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/gob/save/saveload.h b/engines/gob/save/saveload.h
index f20532dffa..cb6f0ed514 100644
--- a/engines/gob/save/saveload.h
+++ b/engines/gob/save/saveload.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/gob/save/saveload_ajworld.cpp b/engines/gob/save/saveload_ajworld.cpp
index 727d071b3e..307a1783a3 100644
--- a/engines/gob/save/saveload_ajworld.cpp
+++ b/engines/gob/save/saveload_ajworld.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/gob/save/saveload_fascin.cpp b/engines/gob/save/saveload_fascin.cpp
index cf1e7f0c0c..26a7f978ad 100644
--- a/engines/gob/save/saveload_fascin.cpp
+++ b/engines/gob/save/saveload_fascin.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/gob/save/saveload_geisha.cpp b/engines/gob/save/saveload_geisha.cpp
index 3414c12dda..5ad9424e89 100644
--- a/engines/gob/save/saveload_geisha.cpp
+++ b/engines/gob/save/saveload_geisha.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/gob/save/saveload_inca2.cpp b/engines/gob/save/saveload_inca2.cpp
index 4c3aaf5a0e..533875e44c 100644
--- a/engines/gob/save/saveload_inca2.cpp
+++ b/engines/gob/save/saveload_inca2.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/gob/save/saveload_playtoons.cpp b/engines/gob/save/saveload_playtoons.cpp
index 93c1b68b0c..406e5eb705 100644
--- a/engines/gob/save/saveload_playtoons.cpp
+++ b/engines/gob/save/saveload_playtoons.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/gob/save/saveload_v2.cpp b/engines/gob/save/saveload_v2.cpp
index b25d4788f7..6f05d15803 100644
--- a/engines/gob/save/saveload_v2.cpp
+++ b/engines/gob/save/saveload_v2.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/gob/save/saveload_v3.cpp b/engines/gob/save/saveload_v3.cpp
index 3e7a3b9e48..1eb0730a3b 100644
--- a/engines/gob/save/saveload_v3.cpp
+++ b/engines/gob/save/saveload_v3.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/gob/save/saveload_v4.cpp b/engines/gob/save/saveload_v4.cpp
index 95283db336..516a22c310 100644
--- a/engines/gob/save/saveload_v4.cpp
+++ b/engines/gob/save/saveload_v4.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/gob/save/saveload_v6.cpp b/engines/gob/save/saveload_v6.cpp
index c524cad352..b6376df022 100644
--- a/engines/gob/save/saveload_v6.cpp
+++ b/engines/gob/save/saveload_v6.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/gob/save/saveload_v7.cpp b/engines/gob/save/saveload_v7.cpp
index 3753b4019f..aced4f50ba 100644
--- a/engines/gob/save/saveload_v7.cpp
+++ b/engines/gob/save/saveload_v7.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/gob/scenery.cpp b/engines/gob/scenery.cpp
index 33fdfcaa2a..2d9021805a 100644
--- a/engines/gob/scenery.cpp
+++ b/engines/gob/scenery.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/gob/scenery.h b/engines/gob/scenery.h
index d8312b1128..3aae8d5d6f 100644
--- a/engines/gob/scenery.h
+++ b/engines/gob/scenery.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/gob/scenery_v1.cpp b/engines/gob/scenery_v1.cpp
index 46ceb35457..7c2adcdef1 100644
--- a/engines/gob/scenery_v1.cpp
+++ b/engines/gob/scenery_v1.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/gob/scenery_v2.cpp b/engines/gob/scenery_v2.cpp
index 16ce077169..85c7d36ae4 100644
--- a/engines/gob/scenery_v2.cpp
+++ b/engines/gob/scenery_v2.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/gob/script.cpp b/engines/gob/script.cpp
index c7e39f94af..d6e9841e0a 100644
--- a/engines/gob/script.cpp
+++ b/engines/gob/script.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/gob/script.h b/engines/gob/script.h
index 0095ad0cb6..f4be190aa5 100644
--- a/engines/gob/script.h
+++ b/engines/gob/script.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/gob/sound/adlib.cpp b/engines/gob/sound/adlib.cpp
index 2bf7f266a1..65b43cae7a 100644
--- a/engines/gob/sound/adlib.cpp
+++ b/engines/gob/sound/adlib.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/gob/sound/adlib.h b/engines/gob/sound/adlib.h
index bd1778d2ed..8071249374 100644
--- a/engines/gob/sound/adlib.h
+++ b/engines/gob/sound/adlib.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/gob/sound/adlplayer.cpp b/engines/gob/sound/adlplayer.cpp
index ee23191c0d..384a928360 100644
--- a/engines/gob/sound/adlplayer.cpp
+++ b/engines/gob/sound/adlplayer.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/gob/sound/adlplayer.h b/engines/gob/sound/adlplayer.h
index 9596447bbc..3edd238343 100644
--- a/engines/gob/sound/adlplayer.h
+++ b/engines/gob/sound/adlplayer.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/gob/sound/bgatmosphere.cpp b/engines/gob/sound/bgatmosphere.cpp
index daba72b2d5..21fb70278a 100644
--- a/engines/gob/sound/bgatmosphere.cpp
+++ b/engines/gob/sound/bgatmosphere.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/gob/sound/bgatmosphere.h b/engines/gob/sound/bgatmosphere.h
index 23fcc8a71a..1cfc63c79a 100644
--- a/engines/gob/sound/bgatmosphere.h
+++ b/engines/gob/sound/bgatmosphere.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/gob/sound/cdrom.cpp b/engines/gob/sound/cdrom.cpp
index 4ce3372562..eca6ca4c9e 100644
--- a/engines/gob/sound/cdrom.cpp
+++ b/engines/gob/sound/cdrom.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/gob/sound/cdrom.h b/engines/gob/sound/cdrom.h
index 09d4c94865..123e306e41 100644
--- a/engines/gob/sound/cdrom.h
+++ b/engines/gob/sound/cdrom.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/gob/sound/infogrames.cpp b/engines/gob/sound/infogrames.cpp
index febf91719b..016bbfb1ff 100644
--- a/engines/gob/sound/infogrames.cpp
+++ b/engines/gob/sound/infogrames.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/gob/sound/infogrames.h b/engines/gob/sound/infogrames.h
index ee5ffd1cff..c946357633 100644
--- a/engines/gob/sound/infogrames.h
+++ b/engines/gob/sound/infogrames.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/gob/sound/musplayer.cpp b/engines/gob/sound/musplayer.cpp
index 3e41dc6ed1..7001a5724b 100644
--- a/engines/gob/sound/musplayer.cpp
+++ b/engines/gob/sound/musplayer.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/gob/sound/musplayer.h b/engines/gob/sound/musplayer.h
index 6cc2a2d2ca..c76c5aab38 100644
--- a/engines/gob/sound/musplayer.h
+++ b/engines/gob/sound/musplayer.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/gob/sound/pcspeaker.cpp b/engines/gob/sound/pcspeaker.cpp
index bc031e279f..d0dcb9a871 100644
--- a/engines/gob/sound/pcspeaker.cpp
+++ b/engines/gob/sound/pcspeaker.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/gob/sound/pcspeaker.h b/engines/gob/sound/pcspeaker.h
index fe0ec872e3..ba2e00ce3e 100644
--- a/engines/gob/sound/pcspeaker.h
+++ b/engines/gob/sound/pcspeaker.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/gob/sound/protracker.cpp b/engines/gob/sound/protracker.cpp
index fbc03256bb..ce29100b85 100644
--- a/engines/gob/sound/protracker.cpp
+++ b/engines/gob/sound/protracker.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/gob/sound/protracker.h b/engines/gob/sound/protracker.h
index b4c3be1f61..ccd0d51552 100644
--- a/engines/gob/sound/protracker.h
+++ b/engines/gob/sound/protracker.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/gob/sound/sound.cpp b/engines/gob/sound/sound.cpp
index a4c74642dd..d2b2d3d6e8 100644
--- a/engines/gob/sound/sound.cpp
+++ b/engines/gob/sound/sound.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/gob/sound/sound.h b/engines/gob/sound/sound.h
index bbc182d172..c959959755 100644
--- a/engines/gob/sound/sound.h
+++ b/engines/gob/sound/sound.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/gob/sound/soundblaster.cpp b/engines/gob/sound/soundblaster.cpp
index 4d6f6f0bf7..9514e93210 100644
--- a/engines/gob/sound/soundblaster.cpp
+++ b/engines/gob/sound/soundblaster.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/gob/sound/soundblaster.h b/engines/gob/sound/soundblaster.h
index 3c4968d611..6a732dbec9 100644
--- a/engines/gob/sound/soundblaster.h
+++ b/engines/gob/sound/soundblaster.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/gob/sound/sounddesc.cpp b/engines/gob/sound/sounddesc.cpp
index 7d876ec484..f981d0b385 100644
--- a/engines/gob/sound/sounddesc.cpp
+++ b/engines/gob/sound/sounddesc.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/gob/sound/sounddesc.h b/engines/gob/sound/sounddesc.h
index f9223de964..a2d39108c9 100644
--- a/engines/gob/sound/sounddesc.h
+++ b/engines/gob/sound/sounddesc.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/gob/sound/soundmixer.cpp b/engines/gob/sound/soundmixer.cpp
index a9303bc927..b5c26898ba 100644
--- a/engines/gob/sound/soundmixer.cpp
+++ b/engines/gob/sound/soundmixer.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/gob/sound/soundmixer.h b/engines/gob/sound/soundmixer.h
index 2847c3de12..791f97eb74 100644
--- a/engines/gob/sound/soundmixer.h
+++ b/engines/gob/sound/soundmixer.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/gob/surface.cpp b/engines/gob/surface.cpp
index 870b0f15b3..42ac2b0d74 100644
--- a/engines/gob/surface.cpp
+++ b/engines/gob/surface.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -31,7 +31,8 @@
#include "graphics/primitives.h"
#include "graphics/pixelformat.h"
#include "graphics/surface.h"
-#include "graphics/decoders/iff.h"
+
+#include "image/iff.h"
namespace Gob {
@@ -814,7 +815,7 @@ bool Surface::loadTGA(Common::SeekableReadStream &stream) {
}
bool Surface::loadIFF(Common::SeekableReadStream &stream) {
- Graphics::IFFDecoder decoder;
+ Image::IFFDecoder decoder;
decoder.loadStream(stream);
if (!decoder.getSurface())
diff --git a/engines/gob/surface.h b/engines/gob/surface.h
index 8a1b502a95..c931731908 100644
--- a/engines/gob/surface.h
+++ b/engines/gob/surface.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/gob/totfile.cpp b/engines/gob/totfile.cpp
index 4efe374793..04c744d965 100644
--- a/engines/gob/totfile.cpp
+++ b/engines/gob/totfile.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/gob/totfile.h b/engines/gob/totfile.h
index 5a23912dbe..753e7b4a57 100644
--- a/engines/gob/totfile.h
+++ b/engines/gob/totfile.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/gob/util.cpp b/engines/gob/util.cpp
index 5ac4ef024e..19e6e35e0b 100644
--- a/engines/gob/util.cpp
+++ b/engines/gob/util.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/gob/util.h b/engines/gob/util.h
index a4984c6207..2865fd5708 100644
--- a/engines/gob/util.h
+++ b/engines/gob/util.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/gob/variables.cpp b/engines/gob/variables.cpp
index efbf10af69..2ef7be2f90 100644
--- a/engines/gob/variables.cpp
+++ b/engines/gob/variables.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/gob/variables.h b/engines/gob/variables.h
index 04775ff86c..a836e82557 100644
--- a/engines/gob/variables.h
+++ b/engines/gob/variables.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/gob/video.cpp b/engines/gob/video.cpp
index 64af34cf62..1dc51d994c 100644
--- a/engines/gob/video.cpp
+++ b/engines/gob/video.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/gob/video.h b/engines/gob/video.h
index 122c1e47d5..2c547baca0 100644
--- a/engines/gob/video.h
+++ b/engines/gob/video.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/gob/video_v1.cpp b/engines/gob/video_v1.cpp
index 397e2bef22..1e5d613294 100644
--- a/engines/gob/video_v1.cpp
+++ b/engines/gob/video_v1.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/gob/video_v2.cpp b/engines/gob/video_v2.cpp
index bf4823ec90..a6900b11bc 100644
--- a/engines/gob/video_v2.cpp
+++ b/engines/gob/video_v2.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/gob/video_v6.cpp b/engines/gob/video_v6.cpp
index 7fb3104162..bbc2f457c2 100644
--- a/engines/gob/video_v6.cpp
+++ b/engines/gob/video_v6.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/gob/videoplayer.cpp b/engines/gob/videoplayer.cpp
index 155989ccee..e97848d27e 100644
--- a/engines/gob/videoplayer.cpp
+++ b/engines/gob/videoplayer.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/gob/videoplayer.h b/engines/gob/videoplayer.h
index 129ccef67a..02ed510ec5 100644
--- a/engines/gob/videoplayer.h
+++ b/engines/gob/videoplayer.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/groovie/cell.cpp b/engines/groovie/cell.cpp
index 8241579156..24fac17e44 100644
--- a/engines/groovie/cell.cpp
+++ b/engines/groovie/cell.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/groovie/cell.h b/engines/groovie/cell.h
index 32c7b46547..d6f1ac97dc 100644
--- a/engines/groovie/cell.h
+++ b/engines/groovie/cell.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/groovie/configure.engine b/engines/groovie/configure.engine
new file mode 100644
index 0000000000..212a49bec8
--- /dev/null
+++ b/engines/groovie/configure.engine
@@ -0,0 +1,4 @@
+# This file is included from the main "configure" script
+# add_engine [name] [desc] [build-by-default] [subengines] [base games] [deps]
+add_engine groovie "Groovie" yes "groovie2" "7th Guest"
+add_engine groovie2 "Groovie 2 games" no "" "" "jpeg 16bit"
diff --git a/engines/groovie/cursor.cpp b/engines/groovie/cursor.cpp
index cac78a95a3..442f0bfada 100644
--- a/engines/groovie/cursor.cpp
+++ b/engines/groovie/cursor.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -107,8 +107,8 @@ Cursor_t7g::Cursor_t7g(uint8 *img, uint8 *pal) :
_img = img + 5;
- debugC(1, kGroovieDebugCursor | kGroovieDebugAll, "Groovie::Cursor: width: %d, height: %d, frames:%d", _width, _height, _numFrames);
- debugC(1, kGroovieDebugCursor | kGroovieDebugUnknown | kGroovieDebugAll, "Groovie::Cursor: elinor: 0x%02X (%d), 0x%02X (%d)", elinor1, elinor1, elinor2, elinor2);
+ debugC(1, kDebugCursor, "Groovie::Cursor: width: %d, height: %d, frames:%d", _width, _height, _numFrames);
+ debugC(1, kDebugCursor | kDebugUnknown, "Groovie::Cursor: elinor: 0x%02X (%d), 0x%02X (%d)", elinor1, elinor1, elinor2, elinor2);
}
void Cursor_t7g::enable() {
@@ -260,32 +260,32 @@ Cursor_v2::Cursor_v2(Common::File &file) {
_width = file.readUint16LE();
_height = file.readUint16LE();
- _img = new byte[_width * _height * _numFrames * 2];
+ _img = new byte[_width * _height * _numFrames * 4];
- debugC(1, kGroovieDebugCursor | kGroovieDebugAll, "Groovie::Cursor: width: %d, height: %d, frames:%d", _width, _height, _numFrames);
+ debugC(1, kDebugCursor, "Groovie::Cursor: width: %d, height: %d, frames:%d", _width, _height, _numFrames);
uint16 tmp16 = file.readUint16LE();
- debugC(5, kGroovieDebugCursor | kGroovieDebugAll, "hotspot x?: %d\n", tmp16);
+ debugC(5, kDebugCursor, "hotspot x?: %d\n", tmp16);
tmp16 = file.readUint16LE();
- debugC(5, kGroovieDebugCursor | kGroovieDebugAll, "hotspot y?: %d\n", tmp16);
+ debugC(5, kDebugCursor, "hotspot y?: %d\n", tmp16);
int loop2count = file.readUint16LE();
- debugC(5, kGroovieDebugCursor | kGroovieDebugAll, "loop2count?: %d\n", loop2count);
+ debugC(5, kDebugCursor, "loop2count?: %d\n", loop2count);
for (int l = 0; l < loop2count; l++) {
tmp16 = file.readUint16LE();
- debugC(5, kGroovieDebugCursor | kGroovieDebugAll, "loop2a: %d\n", tmp16); // Index frame can merge to/from?
+ debugC(5, kDebugCursor, "loop2a: %d\n", tmp16); // Index frame can merge to/from?
tmp16 = file.readUint16LE();
- debugC(5, kGroovieDebugCursor | kGroovieDebugAll, "loop2b: %d\n", tmp16); // Number of frames?
+ debugC(5, kDebugCursor, "loop2b: %d\n", tmp16); // Number of frames?
}
file.read(pal, 0x20 * 3);
for (int f = 0; f < _numFrames; f++) {
uint32 tmp32 = file.readUint32LE();
- debugC(5, kGroovieDebugCursor | kGroovieDebugAll, "loop3: %d\n", tmp32);
+ debugC(5, kDebugCursor, "loop3: %d\n", tmp32);
byte *data = new byte[tmp32];
file.read(data, tmp32);
- decodeFrame(pal, data, _img + (f * _width * _height * 2));
+ decodeFrame(pal, data, _img + (f * _width * _height * 4));
delete[] data;
}
@@ -364,16 +364,16 @@ void Cursor_v2::decodeFrame(byte *pal, byte *data, byte *dest) {
}
// Convert to screen format
- // NOTE: Currently locked to 16bit
+ // NOTE: Currently locked to 32bpp
ptr = tmp;
for (int y = 0; y < _height; y++) {
for (int x = 0; x < _width; x++) {
if (*ptr == 1) {
- *(uint16 *)dest = (uint16)_format.RGBToColor(*(ptr + 1), *(ptr + 2), *(ptr + 3));
+ *(uint32 *)dest = _format.RGBToColor(*(ptr + 1), *(ptr + 2), *(ptr + 3));
} else {
- *(uint16 *)dest = 0;
+ *(uint32 *)dest = 0;
}
- dest += 2;
+ dest += 4;
ptr += 4;
}
}
@@ -385,7 +385,7 @@ void Cursor_v2::enable() {
}
void Cursor_v2::showFrame(uint16 frame) {
- int offset = _width * _height * frame * 2;
+ int offset = _width * _height * frame * 4;
CursorMan.replaceCursor((const byte *)(_img + offset), _width, _height, _width >> 1, _height >> 1, 0, false, &_format);
}
diff --git a/engines/groovie/cursor.h b/engines/groovie/cursor.h
index 87d994b077..bf91112ea4 100644
--- a/engines/groovie/cursor.h
+++ b/engines/groovie/cursor.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/groovie/debug.cpp b/engines/groovie/debug.cpp
index 74fe22922c..16db20413f 100644
--- a/engines/groovie/debug.cpp
+++ b/engines/groovie/debug.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -36,16 +36,16 @@ Debugger::Debugger(GroovieEngine *vm) :
_vm(vm), _script(_vm->_script) {
// Register the debugger comands
- DCmd_Register("step", WRAP_METHOD(Debugger, cmd_step));
- DCmd_Register("go", WRAP_METHOD(Debugger, cmd_go));
- DCmd_Register("pc", WRAP_METHOD(Debugger, cmd_pc));
- DCmd_Register("fg", WRAP_METHOD(Debugger, cmd_fg));
- DCmd_Register("bg", WRAP_METHOD(Debugger, cmd_bg));
- DCmd_Register("mem", WRAP_METHOD(Debugger, cmd_mem));
- DCmd_Register("load", WRAP_METHOD(Debugger, cmd_loadgame));
- DCmd_Register("save", WRAP_METHOD(Debugger, cmd_savegame));
- DCmd_Register("playref", WRAP_METHOD(Debugger, cmd_playref));
- DCmd_Register("dumppal", WRAP_METHOD(Debugger, cmd_dumppal));
+ registerCmd("step", WRAP_METHOD(Debugger, cmd_step));
+ registerCmd("go", WRAP_METHOD(Debugger, cmd_go));
+ registerCmd("pc", WRAP_METHOD(Debugger, cmd_pc));
+ registerCmd("fg", WRAP_METHOD(Debugger, cmd_fg));
+ registerCmd("bg", WRAP_METHOD(Debugger, cmd_bg));
+ registerCmd("mem", WRAP_METHOD(Debugger, cmd_mem));
+ registerCmd("load", WRAP_METHOD(Debugger, cmd_loadgame));
+ registerCmd("save", WRAP_METHOD(Debugger, cmd_savegame));
+ registerCmd("playref", WRAP_METHOD(Debugger, cmd_playref));
+ registerCmd("dumppal", WRAP_METHOD(Debugger, cmd_dumppal));
}
Debugger::~Debugger() {
@@ -81,7 +81,7 @@ bool Debugger::cmd_pc(int argc, const char **argv) {
int val = getNumber(argv[1]);
_script->_currentInstruction = val;
}
- DebugPrintf("pc = 0x%04X (%d)\n", _script->_currentInstruction, _script->_currentInstruction);
+ debugPrintf("pc = 0x%04X (%d)\n", _script->_currentInstruction, _script->_currentInstruction);
return true;
}
@@ -97,9 +97,9 @@ bool Debugger::cmd_mem(int argc, const char **argv) {
// Get
val = _script->_variables[pos];
}
- DebugPrintf("mem[0x%04X] = 0x%02X\n", pos, val);
+ debugPrintf("mem[0x%04X] = 0x%02X\n", pos, val);
} else {
- DebugPrintf("Syntax: mem <addr> [<val>]\n");
+ debugPrintf("Syntax: mem <addr> [<val>]\n");
}
return true;
}
@@ -109,7 +109,7 @@ bool Debugger::cmd_loadgame(int argc, const char **argv) {
int slot = getNumber(argv[1]);
_script->loadgame(slot);
} else {
- DebugPrintf("Syntax: load <slot>\n");
+ debugPrintf("Syntax: load <slot>\n");
}
return true;
}
@@ -119,7 +119,7 @@ bool Debugger::cmd_savegame(int argc, const char **argv) {
int slot = getNumber(argv[1]);
_script->savegame(slot);
} else {
- DebugPrintf("Syntax: save <slot>\n");
+ debugPrintf("Syntax: save <slot>\n");
}
return true;
}
@@ -129,7 +129,7 @@ bool Debugger::cmd_playref(int argc, const char **argv) {
int ref = getNumber(argv[1]);
_script->playvideofromref(ref);
} else {
- DebugPrintf("Syntax: playref <videorefnum>\n");
+ debugPrintf("Syntax: playref <videorefnum>\n");
}
return true;
}
@@ -140,7 +140,7 @@ bool Debugger::cmd_dumppal(int argc, const char **argv) {
_vm->_system->getPaletteManager()->grabPalette(palettedump, 0, 256);
for (i = 0; i < 256; i++) {
- DebugPrintf("%3d: %3d,%3d,%3d\n", i, palettedump[(i * 3)], palettedump[(i * 3) + 1], palettedump[(i * 3) + 2]);
+ debugPrintf("%3d: %3d,%3d,%3d\n", i, palettedump[(i * 3)], palettedump[(i * 3) + 1], palettedump[(i * 3) + 2]);
}
return true;
}
diff --git a/engines/groovie/debug.h b/engines/groovie/debug.h
index 76f6d16c65..b99d6c6e1b 100644
--- a/engines/groovie/debug.h
+++ b/engines/groovie/debug.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/groovie/detection.cpp b/engines/groovie/detection.cpp
index 7c89114e83..a249b66858 100644
--- a/engines/groovie/detection.cpp
+++ b/engines/groovie/detection.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/groovie/detection.h b/engines/groovie/detection.h
index aa900cc54d..e49474474b 100644
--- a/engines/groovie/detection.h
+++ b/engines/groovie/detection.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/groovie/font.cpp b/engines/groovie/font.cpp
index d29c22dd02..21a3bd07ae 100644
--- a/engines/groovie/font.cpp
+++ b/engines/groovie/font.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -112,7 +112,7 @@ bool T7GFont::load(Common::SeekableReadStream &stream) {
return true;
}
-void T7GFont::drawChar(Graphics::Surface *dst, byte chr, int x, int y, uint32 color) const {
+void T7GFont::drawChar(Graphics::Surface *dst, uint32 chr, int x, int y, uint32 color) const {
// We ignore the color, as the font is already colored
const Glyph *glyph = getGlyph(chr);
const byte *src = glyph->pixels;
@@ -125,7 +125,7 @@ void T7GFont::drawChar(Graphics::Surface *dst, byte chr, int x, int y, uint32 co
}
}
-const T7GFont::Glyph *T7GFont::getGlyph(byte chr) const {
+const T7GFont::Glyph *T7GFont::getGlyph(uint32 chr) const {
assert (chr < 128);
byte numGlyph = _mapChar2Glyph[chr];
diff --git a/engines/groovie/font.h b/engines/groovie/font.h
index 20aaa4cf23..23e060faf3 100644
--- a/engines/groovie/font.h
+++ b/engines/groovie/font.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -37,8 +37,8 @@ public:
int getFontHeight() const { return _maxHeight; }
int getMaxCharWidth() const { return _maxWidth; }
- int getCharWidth(byte chr) const { return getGlyph(chr)->width; }
- void drawChar(Graphics::Surface *dst, byte chr, int x, int y, uint32 color) const;
+ int getCharWidth(uint32 chr) const { return getGlyph(chr)->width; }
+ void drawChar(Graphics::Surface *dst, uint32 chr, int x, int y, uint32 color) const;
private:
int _maxHeight, _maxWidth;
@@ -55,7 +55,7 @@ private:
byte _mapChar2Glyph[128];
Glyph *_glyphs;
- const Glyph *getGlyph(byte chr) const;
+ const Glyph *getGlyph(uint32 chr) const;
};
} // End of Groovie namespace
diff --git a/engines/groovie/graphics.cpp b/engines/groovie/graphics.cpp
index a4d8a4330c..b85277fac7 100644
--- a/engines/groovie/graphics.cpp
+++ b/engines/groovie/graphics.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/groovie/graphics.h b/engines/groovie/graphics.h
index c91d895c25..72ab01deb6 100644
--- a/engines/groovie/graphics.h
+++ b/engines/groovie/graphics.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/groovie/groovie.cpp b/engines/groovie/groovie.cpp
index 5ade442742..b42cf09245 100644
--- a/engines/groovie/groovie.cpp
+++ b/engines/groovie/groovie.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -29,10 +29,13 @@
#include "groovie/graphics.h"
#include "groovie/music.h"
#include "groovie/resource.h"
-#include "groovie/roq.h"
#include "groovie/stuffit.h"
#include "groovie/vdx.h"
+#ifdef ENABLE_GROOVIE2
+#include "groovie/roq.h"
+#endif
+
#include "common/config-manager.h"
#include "common/debug-channels.h"
#include "common/events.h"
@@ -50,7 +53,8 @@ namespace Groovie {
GroovieEngine::GroovieEngine(OSystem *syst, const GroovieGameDescription *gd) :
Engine(syst), _gameDescription(gd), _debugger(NULL), _script(NULL),
_resMan(NULL), _grvCursorMan(NULL), _videoPlayer(NULL), _musicPlayer(NULL),
- _graphicsMan(NULL), _macResFork(NULL), _waitingForInput(false), _font(NULL) {
+ _graphicsMan(NULL), _macResFork(NULL), _waitingForInput(false), _font(NULL),
+ _spookyMode(false) {
// Adding the default directories
const Common::FSNode gameDataDir(ConfMan.get("path"));
@@ -64,17 +68,16 @@ GroovieEngine::GroovieEngine(OSystem *syst, const GroovieGameDescription *gd) :
_modeSpeed = kGroovieSpeedFast;
// Initialize the custom debug levels
- DebugMan.addDebugChannel(kGroovieDebugAll, "All", "Debug everything");
- DebugMan.addDebugChannel(kGroovieDebugVideo, "Video", "Debug video and audio playback");
- DebugMan.addDebugChannel(kGroovieDebugResource, "Resource", "Debug resouce management");
- DebugMan.addDebugChannel(kGroovieDebugScript, "Script", "Debug the scripts");
- DebugMan.addDebugChannel(kGroovieDebugUnknown, "Unknown", "Report values of unknown data in files");
- DebugMan.addDebugChannel(kGroovieDebugHotspots, "Hotspots", "Show the hotspots");
- DebugMan.addDebugChannel(kGroovieDebugCursor, "Cursor", "Debug cursor decompression / switching");
- DebugMan.addDebugChannel(kGroovieDebugMIDI, "MIDI", "Debug MIDI / XMIDI files");
- DebugMan.addDebugChannel(kGroovieDebugScriptvars, "Scriptvars", "Print out any change to script variables");
- DebugMan.addDebugChannel(kGroovieDebugCell, "Cell", "Debug the cell game (in the microscope)");
- DebugMan.addDebugChannel(kGroovieDebugFast, "Fast", "Play videos quickly, with no sound (unstable)");
+ DebugMan.addDebugChannel(kDebugVideo, "Video", "Debug video and audio playback");
+ DebugMan.addDebugChannel(kDebugResource, "Resource", "Debug resouce management");
+ DebugMan.addDebugChannel(kDebugScript, "Script", "Debug the scripts");
+ DebugMan.addDebugChannel(kDebugUnknown, "Unknown", "Report values of unknown data in files");
+ DebugMan.addDebugChannel(kDebugHotspots, "Hotspots", "Show the hotspots");
+ DebugMan.addDebugChannel(kDebugCursor, "Cursor", "Debug cursor decompression / switching");
+ DebugMan.addDebugChannel(kDebugMIDI, "MIDI", "Debug MIDI / XMIDI files");
+ DebugMan.addDebugChannel(kDebugScriptvars, "Scriptvars", "Print out any change to script variables");
+ DebugMan.addDebugChannel(kDebugCell, "Cell", "Debug the cell game (in the microscope)");
+ DebugMan.addDebugChannel(kDebugFast, "Fast", "Play videos quickly, with no sound (unstable)");
}
GroovieEngine::~GroovieEngine() {
@@ -103,14 +106,18 @@ Common::Error GroovieEngine::run() {
// Initialize the graphics
switch (_gameDescription->version) {
- case kGroovieV2:
+ case kGroovieV2: {
// Request the mode with the highest precision available
- initGraphics(640, 480, true, NULL);
+ Graphics::PixelFormat format(4, 8, 8, 8, 8, 24, 16, 8, 0);
+ initGraphics(640, 480, true, &format);
- // Save the enabled mode as it can be both an RGB mode or CLUT8
- _pixelFormat = _system->getScreenFormat();
- _mode8bit = (_pixelFormat == Graphics::PixelFormat::createFormatCLUT8());
+ if (_system->getScreenFormat() != format)
+ return Common::kUnsupportedColorMode;
+
+ // Save the enabled mode
+ _pixelFormat = format;
break;
+ }
case kGroovieT7G:
initGraphics(640, 480, true);
_pixelFormat = Graphics::PixelFormat::createFormatCLUT8();
@@ -154,7 +161,9 @@ Common::Error GroovieEngine::run() {
case kGroovieV2:
_resMan = new ResMan_v2();
_grvCursorMan = new GrvCursorMan_v2(_system);
+#ifdef ENABLE_GROOVIE2
_videoPlayer = new ROQPlayer(this);
+#endif
break;
}
diff --git a/engines/groovie/groovie.h b/engines/groovie/groovie.h
index 79abc13b1c..d442d39cb2 100644
--- a/engines/groovie/groovie.h
+++ b/engines/groovie/groovie.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -58,18 +58,18 @@ class Script;
class VideoPlayer;
enum DebugLevels {
- kGroovieDebugAll = 1 << 0,
- kGroovieDebugVideo = 1 << 1,
- kGroovieDebugResource = 1 << 2,
- kGroovieDebugScript = 1 << 3,
- kGroovieDebugUnknown = 1 << 4,
- kGroovieDebugHotspots = 1 << 5,
- kGroovieDebugCursor = 1 << 6,
- kGroovieDebugMIDI = 1 << 7,
- kGroovieDebugScriptvars = 1 << 8,
- kGroovieDebugCell = 1 << 9,
- kGroovieDebugFast = 1 << 10
- // the current limitation is 32 debug levels (1 << 31 is the last one)
+ kDebugVideo = 1 << 0,
+ kDebugResource = 1 << 1,
+ kDebugScript = 1 << 2,
+ kDebugUnknown = 1 << 3,
+ kDebugHotspots = 1 << 4,
+ kDebugCursor = 1 << 5,
+ kDebugMIDI = 1 << 6,
+ kDebugScriptvars = 1 << 7,
+ kDebugCell = 1 << 8,
+ kDebugFast = 1 << 9
+ // the current limitation is 32 debug levels (1 << 31 is the last one)
+ // but some are used by system, so avoid high values.
};
/**
@@ -110,7 +110,7 @@ public:
void waitForInput();
Graphics::PixelFormat _pixelFormat;
- bool _mode8bit;
+ bool _spookyMode;
Script *_script;
ResMan *_resMan;
GrvCursorMan *_grvCursorMan;
diff --git a/engines/groovie/lzss.cpp b/engines/groovie/lzss.cpp
index a09f6e2311..2a185aeeab 100644
--- a/engines/groovie/lzss.cpp
+++ b/engines/groovie/lzss.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/groovie/lzss.h b/engines/groovie/lzss.h
index f60ea14815..06b07a946a 100644
--- a/engines/groovie/lzss.h
+++ b/engines/groovie/lzss.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/groovie/module.mk b/engines/groovie/module.mk
index b47eed912b..84d6222c59 100644
--- a/engines/groovie/module.mk
+++ b/engines/groovie/module.mk
@@ -12,12 +12,16 @@ MODULE_OBJS := \
music.o \
player.o \
resource.o \
- roq.o \
saveload.o \
script.o \
stuffit.o \
vdx.o
+ifdef ENABLE_GROOVIE2
+MODULE_OBJS += \
+ roq.o
+endif
+
# This module can be built as a plugin
ifeq ($(ENABLE_GROOVIE), DYNAMIC_PLUGIN)
PLUGIN := 1
diff --git a/engines/groovie/music.cpp b/engines/groovie/music.cpp
index 95637fc407..2c164e020c 100644
--- a/engines/groovie/music.cpp
+++ b/engines/groovie/music.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -64,7 +64,7 @@ void MusicPlayer::playSong(uint32 fileref) {
void MusicPlayer::setBackgroundSong(uint32 fileref) {
Common::StackLock lock(_mutex);
- debugC(1, kGroovieDebugMIDI | kGroovieDebugAll, "Groovie::Music: Changing the background song: %04X", fileref);
+ debugC(1, kDebugMIDI, "Groovie::Music: Changing the background song: %04X", fileref);
_backgroundFileRef = fileref;
}
@@ -86,7 +86,7 @@ void MusicPlayer::playCD(uint8 track) {
// Stop the MIDI playback
unload();
- debugC(1, kGroovieDebugMIDI | kGroovieDebugAll, "Groovie::Music: Playing CD track %d", track);
+ debugC(1, kDebugMIDI, "Groovie::Music: Playing CD track %d", track);
if (track == 3) {
// This is the credits song, start at 23:20
@@ -136,9 +136,9 @@ void MusicPlayer::playCD(uint8 track) {
}
void MusicPlayer::startBackground() {
- debugC(3, kGroovieDebugMIDI | kGroovieDebugAll, "Groovie::Music: startBackground()");
+ debugC(3, kDebugMIDI, "Groovie::Music: startBackground()");
if (!_isPlaying && _backgroundFileRef) {
- debugC(3, kGroovieDebugMIDI | kGroovieDebugAll, "Groovie::Music: Starting the background song (0x%4X)", _backgroundFileRef);
+ debugC(3, kDebugMIDI, "Groovie::Music: Starting the background song (0x%4X)", _backgroundFileRef);
play(_backgroundFileRef, true);
}
}
@@ -158,7 +158,7 @@ void MusicPlayer::setUserVolume(uint16 volume) {
void MusicPlayer::setGameVolume(uint16 volume, uint16 time) {
Common::StackLock lock(_mutex);
- debugC(1, kGroovieDebugMIDI | kGroovieDebugAll, "Groovie::Music: Setting game volume from %d to %d in %dms", _gameVolume, volume, time);
+ debugC(1, kDebugMIDI, "Groovie::Music: Setting game volume from %d to %d in %dms", _gameVolume, volume, time);
// Save the start parameters of the fade
_fadingStartTime = _vm->_system->getMillis();
@@ -183,12 +183,12 @@ bool MusicPlayer::play(uint32 fileref, bool loop) {
}
void MusicPlayer::applyFading() {
- debugC(6, kGroovieDebugMIDI | kGroovieDebugAll, "Groovie::Music: applyFading() _fadingStartTime = %d, _fadingDuration = %d, _fadingStartVolume = %d, _fadingEndVolume = %d", _fadingStartTime, _fadingDuration, _fadingStartVolume, _fadingEndVolume);
+ debugC(6, kDebugMIDI, "Groovie::Music: applyFading() _fadingStartTime = %d, _fadingDuration = %d, _fadingStartVolume = %d, _fadingEndVolume = %d", _fadingStartTime, _fadingDuration, _fadingStartVolume, _fadingEndVolume);
Common::StackLock lock(_mutex);
// Calculate the passed time
uint32 time = _vm->_system->getMillis() - _fadingStartTime;
- debugC(6, kGroovieDebugMIDI | kGroovieDebugAll, "Groovie::Music: time = %d, _gameVolume = %d", time, _gameVolume);
+ debugC(6, kDebugMIDI, "Groovie::Music: time = %d, _gameVolume = %d", time, _gameVolume);
if (time >= _fadingDuration) {
// Set the end volume
_gameVolume = _fadingEndVolume;
@@ -200,7 +200,7 @@ void MusicPlayer::applyFading() {
if (_gameVolume == _fadingEndVolume) {
// If we were fading to 0, stop the playback and restore the volume
if (_fadingEndVolume == 0) {
- debugC(1, kGroovieDebugMIDI | kGroovieDebugAll, "Groovie::Music: Faded to zero: end of song. _fadingEndVolume set to 100");
+ debugC(1, kDebugMIDI, "Groovie::Music: Faded to zero: end of song. _fadingEndVolume set to 100");
unload();
}
}
@@ -210,7 +210,7 @@ void MusicPlayer::applyFading() {
}
void MusicPlayer::onTimer(void *refCon) {
- debugC(9, kGroovieDebugMIDI | kGroovieDebugAll, "Groovie::Music: onTimer()");
+ debugC(9, kDebugMIDI, "Groovie::Music: onTimer()");
MusicPlayer *music = (MusicPlayer *)refCon;
Common::StackLock lock(music->_mutex);
@@ -225,7 +225,7 @@ void MusicPlayer::onTimer(void *refCon) {
}
void MusicPlayer::unload() {
- debugC(1, kGroovieDebugMIDI | kGroovieDebugAll, "Groovie::Music: Stopping the playback");
+ debugC(1, kDebugMIDI, "Groovie::Music: Stopping the playback");
// Set the new state
_isPlaying = false;
@@ -319,7 +319,7 @@ void MusicPlayerMidi::updateChanVolume(byte channel) {
}
void MusicPlayerMidi::endTrack() {
- debugC(3, kGroovieDebugMIDI | kGroovieDebugAll, "Groovie::Music: endTrack()");
+ debugC(3, kDebugMIDI, "Groovie::Music: endTrack()");
unload();
}
@@ -439,7 +439,7 @@ void MusicPlayerXMI::send(uint32 b) {
byte chan = b & 0xF;
byte bank = (b >> 16) & 0xFF;
- debugC(5, kGroovieDebugMIDI | kGroovieDebugAll, "Groovie::Music: Selecting bank %X for channel %X", bank, chan);
+ debugC(5, kDebugMIDI, "Groovie::Music: Selecting bank %X for channel %X", bank, chan);
_chanBanks[chan] = bank;
return;
} else if ((b & 0xF0) == 0xC0) { // Program change
@@ -450,7 +450,7 @@ void MusicPlayerXMI::send(uint32 b) {
byte chan = b & 0xF;
byte patch = (b >> 8) & 0xFF;
- debugC(5, kGroovieDebugMIDI | kGroovieDebugAll, "Groovie::Music: Setting custom patch %X from bank %X to channel %X", patch, _chanBanks[chan], chan);
+ debugC(5, kDebugMIDI, "Groovie::Music: Setting custom patch %X from bank %X to channel %X", patch, _chanBanks[chan], chan);
// Try to find the requested patch from the previously
// specified bank
@@ -475,7 +475,7 @@ void MusicPlayerXMI::send(uint32 b) {
}
bool MusicPlayerXMI::load(uint32 fileref, bool loop) {
- debugC(1, kGroovieDebugMIDI | kGroovieDebugAll, "Groovie::Music: Starting the playback of song: %04X", fileref);
+ debugC(1, kDebugMIDI, "Groovie::Music: Starting the playback of song: %04X", fileref);
// Open the song resource
Common::SeekableReadStream *file = _vm->_resMan->open(fileref);
@@ -489,7 +489,7 @@ bool MusicPlayerXMI::load(uint32 fileref, bool loop) {
void MusicPlayerXMI::loadTimbres(const Common::String &filename) {
// Load the Global Timbre Library format as documented in AIL2
- debugC(1, kGroovieDebugMIDI | kGroovieDebugAll, "Groovie::Music: Loading the GTL file %s", filename.c_str());
+ debugC(1, kDebugMIDI, "Groovie::Music: Loading the GTL file %s", filename.c_str());
// Does it exist?
if (!Common::File::exists(filename)) {
@@ -537,7 +537,7 @@ void MusicPlayerXMI::loadTimbres(const Common::String &filename) {
// Read the timbre data
gtl->read(_timbres[i].data, _timbres[i].size);
- debugC(5, kGroovieDebugMIDI | kGroovieDebugAll, "Groovie::Music: Loaded patch %x in bank %x with size %d",
+ debugC(5, kDebugMIDI, "Groovie::Music: Loaded patch %x in bank %x with size %d",
_timbres[i].patch, _timbres[i].bank, _timbres[i].size);
}
@@ -636,7 +636,7 @@ void setRolandInstrument(MidiDriver *drv, byte channel, byte *instrument) {
// Show the timbre name as extra debug information
Common::String name((char *)instrument, 10);
- debugC(5, kGroovieDebugMIDI | kGroovieDebugAll, "Groovie::Music: Setting MT32 timbre '%s' to channel %d", name.c_str(), channel);
+ debugC(5, kDebugMIDI, "Groovie::Music: Setting MT32 timbre '%s' to channel %d", name.c_str(), channel);
sysex.roland_id = 0x41;
sysex.device_id = channel; // Unit#
@@ -702,7 +702,7 @@ MusicPlayerMac_t7g::MusicPlayerMac_t7g(GroovieEngine *vm) : MusicPlayerMidi(vm)
}
bool MusicPlayerMac_t7g::load(uint32 fileref, bool loop) {
- debugC(1, kGroovieDebugMIDI | kGroovieDebugAll, "Groovie::Music: Starting the playback of song: %04X", fileref);
+ debugC(1, kDebugMIDI, "Groovie::Music: Starting the playback of song: %04X", fileref);
// First try for compressed MIDI
Common::SeekableReadStream *file = _vm->_macResFork->getResource(MKTAG('c','m','i','d'), fileref & 0x3FF);
@@ -789,7 +789,7 @@ MusicPlayerMac_v2::MusicPlayerMac_v2(GroovieEngine *vm) : MusicPlayerMidi(vm) {
}
bool MusicPlayerMac_v2::load(uint32 fileref, bool loop) {
- debugC(1, kGroovieDebugMIDI | kGroovieDebugAll, "Groovie::Music: Starting the playback of song: %04X", fileref);
+ debugC(1, kDebugMIDI, "Groovie::Music: Starting the playback of song: %04X", fileref);
// Find correct filename
ResInfo info;
diff --git a/engines/groovie/music.h b/engines/groovie/music.h
index 92e9c8b487..4853840673 100644
--- a/engines/groovie/music.h
+++ b/engines/groovie/music.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/groovie/player.cpp b/engines/groovie/player.cpp
index e2a1ff3d56..c1b90fbd2c 100644
--- a/engines/groovie/player.cpp
+++ b/engines/groovie/player.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -94,13 +94,13 @@ void VideoPlayer::waitFrame() {
} else {
uint32 millisDiff = currTime - _lastFrameTime;
if (millisDiff < _millisBetweenFrames) {
- debugC(7, kGroovieDebugVideo | kGroovieDebugAll, "Groovie::Player: Delaying %d (currTime=%d, _lastFrameTime=%d, millisDiff=%d, _millisBetweenFrame=%d)",
+ debugC(7, kDebugVideo, "Groovie::Player: Delaying %d (currTime=%d, _lastFrameTime=%d, millisDiff=%d, _millisBetweenFrame=%d)",
_millisBetweenFrames - millisDiff, currTime, _lastFrameTime, millisDiff, _millisBetweenFrames);
_syst->delayMillis(_millisBetweenFrames - millisDiff);
currTime = _syst->getMillis();
- debugC(7, kGroovieDebugVideo | kGroovieDebugAll, "Groovie::Player: Finished delay at %d", currTime);
+ debugC(7, kDebugVideo, "Groovie::Player: Finished delay at %d", currTime);
}
- debugC(6, kGroovieDebugVideo | kGroovieDebugAll, "Groovie::Player: Frame displayed at %d (%f FPS)", currTime, 1000.0 / (currTime - _lastFrameTime));
+ debugC(6, kDebugVideo, "Groovie::Player: Frame displayed at %d (%f FPS)", currTime, 1000.0 / (currTime - _lastFrameTime));
_lastFrameTime = currTime;
}
}
diff --git a/engines/groovie/player.h b/engines/groovie/player.h
index c9258ffdbd..b1aac963f2 100644
--- a/engines/groovie/player.h
+++ b/engines/groovie/player.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/groovie/resource.cpp b/engines/groovie/resource.cpp
index 42d76cabfa..75eba95240 100644
--- a/engines/groovie/resource.cpp
+++ b/engines/groovie/resource.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -47,7 +47,7 @@ Common::SeekableReadStream *ResMan::open(uint32 fileRef) {
return NULL;
}
- debugC(1, kGroovieDebugResource | kGroovieDebugAll, "Groovie::Resource: Opening resource 0x%04X (%s, %d, %d)", fileRef, _gjds[resInfo.gjd].c_str(), resInfo.offset, resInfo.size);
+ debugC(1, kDebugResource, "Groovie::Resource: Opening resource 0x%04X (%s, %d, %d)", fileRef, _gjds[resInfo.gjd].c_str(), resInfo.offset, resInfo.size);
// Does it exist?
if (!Common::File::exists(_gjds[resInfo.gjd])) {
@@ -120,7 +120,7 @@ uint32 ResMan_t7g::getRef(Common::String name, Common::String scriptname) {
// Test whether it's the resource we're searching
Common::String resname(readname, 12);
if (resname.hasPrefix(name.c_str())) {
- debugC(2, kGroovieDebugResource | kGroovieDebugAll, "Groovie::Resource: Resource %12s matches %s", readname, name.c_str());
+ debugC(2, kDebugResource, "Groovie::Resource: Resource %12s matches %s", readname, name.c_str());
found = true;
}
@@ -173,7 +173,7 @@ bool ResMan_t7g::getResInfo(uint32 fileRef, ResInfo &resInfo) {
char resname[13];
rlFile->read(resname, 12);
resname[12] = 0;
- debugC(2, kGroovieDebugResource | kGroovieDebugAll, "Groovie::Resource: Resource name: %12s", resname);
+ debugC(2, kDebugResource, "Groovie::Resource: Resource name: %12s", resname);
resInfo.filename = resname;
// Read the resource information
@@ -240,7 +240,7 @@ uint32 ResMan_v2::getRef(Common::String name, Common::String scriptname) {
// Test whether it's the resource we're searching
Common::String resname(readname, 18);
if (resname.hasPrefix(name.c_str())) {
- debugC(2, kGroovieDebugResource | kGroovieDebugAll, "Groovie::Resource: Resource %18s matches %s", readname, name.c_str());
+ debugC(2, kDebugResource, "Groovie::Resource: Resource %18s matches %s", readname, name.c_str());
found = true;
break;
}
@@ -284,7 +284,7 @@ bool ResMan_v2::getResInfo(uint32 fileRef, ResInfo &resInfo) {
char resname[19];
resname[18] = 0;
rlFile.read(resname, 18);
- debugC(2, kGroovieDebugResource | kGroovieDebugAll, "Groovie::Resource: Resource name: %18s", resname);
+ debugC(2, kDebugResource, "Groovie::Resource: Resource name: %18s", resname);
resInfo.filename = resname;
// 6 padding bytes? (it looks like they're always 0)
diff --git a/engines/groovie/resource.h b/engines/groovie/resource.h
index 33e15e6b98..11a861dd5c 100644
--- a/engines/groovie/resource.h
+++ b/engines/groovie/resource.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/groovie/roq.cpp b/engines/groovie/roq.cpp
index e1ca7fb945..379fcabc07 100644
--- a/engines/groovie/roq.cpp
+++ b/engines/groovie/roq.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -28,11 +28,12 @@
#include "groovie/groovie.h"
#include "common/debug.h"
+#include "common/rect.h"
#include "common/substream.h"
#include "common/textconsole.h"
#include "graphics/palette.h"
-#include "graphics/decoders/jpeg.h"
+#include "image/jpeg.h"
#ifdef USE_RGB_COLOR
// Required for the YUV to RGB conversion
@@ -45,24 +46,12 @@ namespace Groovie {
ROQPlayer::ROQPlayer(GroovieEngine *vm) :
VideoPlayer(vm), _codingTypeCount(0),
- _fg(&_vm->_graphicsMan->_foreground), _bg(&_vm->_graphicsMan->_background) {
+ _bg(&_vm->_graphicsMan->_background),
+ _firstFrame(true) {
// Create the work surfaces
_currBuf = new Graphics::Surface();
_prevBuf = new Graphics::Surface();
-
- if (_vm->_mode8bit) {
- byte pal[256 * 3];
-
- // 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;
- }
-
- _syst->getPaletteManager()->setPalette(pal, 0, 256);
- }
}
ROQPlayer::~ROQPlayer() {
@@ -75,7 +64,7 @@ ROQPlayer::~ROQPlayer() {
uint16 ROQPlayer::loadInternal() {
// Begin reading the file
- debugC(1, kGroovieDebugVideo | kGroovieDebugAll, "Groovie::ROQ: Loading video");
+ debugC(1, kDebugVideo, "Groovie::ROQ: Loading video");
// Read the file header
ROQBlockHeader blockHeader;
@@ -95,6 +84,9 @@ uint16 ROQPlayer::loadInternal() {
_num2blocks = 0;
_num4blocks = 0;
+ // Reset the first frame flag
+ _firstFrame = true;
+
if ((blockHeader.size == 0) && (blockHeader.param == 0)) {
// Set the offset scaling to 2
_offScale = 2;
@@ -115,35 +107,31 @@ uint16 ROQPlayer::loadInternal() {
void ROQPlayer::buildShowBuf() {
for (int line = 0; line < _bg->h; line++) {
- byte *out = (byte *)_bg->getBasePtr(0, line);
- byte *in = (byte *)_currBuf->getBasePtr(0, line / _scaleY);
+ uint32 *out = (uint32 *)_bg->getBasePtr(0, line);
+ uint32 *in = (uint32 *)_currBuf->getBasePtr(0, line / _scaleY);
+
for (int x = 0; x < _bg->w; x++) {
- if (_vm->_mode8bit) {
- // Just use the luminancy component
- *out = *in;
-#ifdef USE_RGB_COLOR
- } else {
- // Do the format conversion (YUV -> RGB -> Screen format)
- byte r, g, b;
- Graphics::YUV2RGB(*in, *(in + 1), *(in + 2), r, g, b);
- // FIXME: this is fixed to 16bit
- *(uint16 *)out = (uint16)_vm->_pixelFormat.RGBToColor(r, g, b);
-#endif // USE_RGB_COLOR
- }
+ // Copy a pixel
+ *out++ = *in;
// Skip to the next pixel
- out += _vm->_pixelFormat.bytesPerPixel;
if (!(x % _scaleX))
- in += _currBuf->format.bytesPerPixel;
+ in++;
}
}
+ // On the first frame, copy from the current buffer to the prev buffer
+ if (_firstFrame) {
+ _prevBuf->copyFrom(*_currBuf);
+ _firstFrame = false;
+ }
+
// Swap buffers
SWAP(_prevBuf, _currBuf);
}
bool ROQPlayer::playFrameInternal() {
- debugC(5, kGroovieDebugVideo | kGroovieDebugAll, "Groovie::ROQ: Playing frame");
+ debugC(5, kDebugVideo, "Groovie::ROQ: Playing frame");
// Process the needed blocks until the next video frame
bool endframe = false;
@@ -180,9 +168,9 @@ bool ROQPlayer::readBlockHeader(ROQBlockHeader &blockHeader) {
blockHeader.size = _file->readUint32LE();
blockHeader.param = _file->readUint16LE();
- debugC(10, kGroovieDebugVideo | kGroovieDebugAll, "Groovie::ROQ: Block type = 0x%02X", blockHeader.type);
- debugC(10, kGroovieDebugVideo | kGroovieDebugAll, "Groovie::ROQ: Block size = 0x%08X", blockHeader.size);
- debugC(10, kGroovieDebugVideo | kGroovieDebugAll, "Groovie::ROQ: Block param = 0x%04X", blockHeader.param);
+ debugC(10, kDebugVideo, "Groovie::ROQ: Block type = 0x%02X", blockHeader.type);
+ debugC(10, kDebugVideo, "Groovie::ROQ: Block size = 0x%08X", blockHeader.size);
+ debugC(10, kDebugVideo, "Groovie::ROQ: Block param = 0x%04X", blockHeader.param);
return true;
}
@@ -250,7 +238,7 @@ bool ROQPlayer::processBlock() {
}
bool ROQPlayer::processBlockInfo(ROQBlockHeader &blockHeader) {
- debugC(5, kGroovieDebugVideo | kGroovieDebugAll, "Groovie::ROQ: Processing info block");
+ debugC(5, kDebugVideo, "Groovie::ROQ: Processing info block");
// Verify the block header
if (blockHeader.type != 0x1001 || blockHeader.size != 8 || (blockHeader.param != 0 && blockHeader.param != 1)) {
@@ -258,6 +246,9 @@ bool ROQPlayer::processBlockInfo(ROQBlockHeader &blockHeader) {
return false;
}
+ // Reset the first frame flag
+ _firstFrame = true;
+
// Save the alpha channel size
_alpha = blockHeader.param;
@@ -282,32 +273,19 @@ bool ROQPlayer::processBlockInfo(ROQBlockHeader &blockHeader) {
_prevBuf->free();
// Allocate new buffers
- // These buffers use YUV data, since we can not describe it with a
- // PixelFormat struct we just add some dummy PixelFormat with the
- // correct bytes per pixel value. Since the surfaces are only used
- // internally and no code assuming RGB data is present is used on
- // them it should be just fine.
- _currBuf->create(width, height, Graphics::PixelFormat(3, 0, 0, 0, 0, 0, 0, 0, 0));
- _prevBuf->create(width, height, Graphics::PixelFormat(3, 0, 0, 0, 0, 0, 0, 0, 0));
- }
-
- // Clear the buffers with black YUV values
- byte *ptr1 = (byte *)_currBuf->getPixels();
- byte *ptr2 = (byte *)_prevBuf->getPixels();
- for (int i = 0; i < width * height; i++) {
- *ptr1++ = 0;
- *ptr1++ = 128;
- *ptr1++ = 128;
- *ptr2++ = 0;
- *ptr2++ = 128;
- *ptr2++ = 128;
+ _currBuf->create(width, height, _vm->_pixelFormat);
+ _prevBuf->create(width, height, _vm->_pixelFormat);
}
+ // Clear the buffers with black
+ _currBuf->fillRect(Common::Rect(width, height), _vm->_pixelFormat.RGBToColor(0, 0, 0));
+ _prevBuf->fillRect(Common::Rect(width, height), _vm->_pixelFormat.RGBToColor(0, 0, 0));
+
return true;
}
bool ROQPlayer::processBlockQuadCodebook(ROQBlockHeader &blockHeader) {
- debugC(5, kGroovieDebugVideo | kGroovieDebugAll, "Groovie::ROQ: Processing quad codebook block");
+ debugC(5, kDebugVideo, "Groovie::ROQ: Processing quad codebook block");
// Get the number of 2x2 pixel blocks to read
int newNum2blocks = blockHeader.param >> 8;
@@ -324,15 +302,28 @@ bool ROQPlayer::processBlockQuadCodebook(ROQBlockHeader &blockHeader) {
}
// Read the 2x2 codebook
+ uint32 *codebook = _codebook2;
+
for (int i = 0; i < newNum2blocks; i++) {
// Read the 4 Y components and their alpha channel
+ byte y[4];
+ byte a[4];
+
for (int j = 0; j < 4; j++) {
- _codebook2[i * 10 + j * 2] = _file->readByte();
- _codebook2[i * 10 + j * 2 + 1] = _alpha ? _file->readByte() : 255;
+ y[j] = _file->readByte();
+ a[j] = _alpha ? _file->readByte() : 255;
}
// Read the subsampled Cb and Cr
- _file->read(&_codebook2[i * 10 + 8], 2);
+ byte u = _file->readByte();
+ byte v = _file->readByte();
+
+ // Convert the codebook to RGB right here
+ for (int j = 0; j < 4; j++) {
+ byte r, g, b;
+ Graphics::YUV2RGB(y[j], u, v, r, g, b);
+ *codebook++ = _vm->_pixelFormat.ARGBToColor(a[j], r, g, b);
+ }
}
// Read the 4x4 codebook
@@ -342,7 +333,7 @@ bool ROQPlayer::processBlockQuadCodebook(ROQBlockHeader &blockHeader) {
}
bool ROQPlayer::processBlockQuadVector(ROQBlockHeader &blockHeader) {
- debugC(5, kGroovieDebugVideo | kGroovieDebugAll, "Groovie::ROQ: Processing quad vector block");
+ debugC(5, kDebugVideo, "Groovie::ROQ: Processing quad vector block");
// Get the mean motion vectors
int8 Mx = blockHeader.param >> 8;
@@ -405,7 +396,7 @@ void ROQPlayer::processBlockQuadVectorBlock(int baseX, int baseY, int8 Mx, int8
}
void ROQPlayer::processBlockQuadVectorBlockSub(int baseX, int baseY, int8 Mx, int8 My) {
- debugC(6, kGroovieDebugVideo | kGroovieDebugAll, "Groovie::ROQ: Processing quad vector sub block");
+ debugC(6, kDebugVideo, "Groovie::ROQ: Processing quad vector sub block");
uint16 codingType = getCodingType();
switch (codingType) {
@@ -431,30 +422,25 @@ void ROQPlayer::processBlockQuadVectorBlockSub(int baseX, int baseY, int8 Mx, in
}
bool ROQPlayer::processBlockStill(ROQBlockHeader &blockHeader) {
- debugC(5, kGroovieDebugVideo | kGroovieDebugAll, "Groovie::ROQ: Processing still (JPEG) block");
-
- warning("Groovie::ROQ: JPEG frame (unfinished)");
+ debugC(5, kDebugVideo, "Groovie::ROQ: Processing still (JPEG) block");
- Graphics::JPEGDecoder *jpg = new Graphics::JPEGDecoder();
- jpg->setOutputColorSpace(Graphics::JPEGDecoder::kColorSpaceYUV);
+ Image::JPEGDecoder jpg;
uint32 startPos = _file->pos();
Common::SeekableSubReadStream subStream(_file, startPos, startPos + blockHeader.size, DisposeAfterUse::NO);
- jpg->loadStream(subStream);
+ jpg.loadStream(subStream);
- const Graphics::Surface *srcSurf = jpg->getSurface();
- const byte *src = (const byte *)srcSurf->getPixels();
- byte *ptr = (byte *)_currBuf->getPixels();
- memcpy(ptr, src, _currBuf->w * _currBuf->h * srcSurf->format.bytesPerPixel);
-
- delete jpg;
+ const Graphics::Surface *srcSurf = jpg.getSurface();
+ _currBuf->free();
+ delete _currBuf;
+ _currBuf = srcSurf->convertTo(_vm->_pixelFormat);
_file->seek(startPos + blockHeader.size);
return true;
}
bool ROQPlayer::processBlockSoundMono(ROQBlockHeader &blockHeader) {
- debugC(5, kGroovieDebugVideo | kGroovieDebugAll, "Groovie::ROQ: Processing mono sound block");
+ debugC(5, kDebugVideo, "Groovie::ROQ: Processing mono sound block");
// Verify the block header
if (blockHeader.type != 0x1020) {
@@ -497,7 +483,7 @@ bool ROQPlayer::processBlockSoundMono(ROQBlockHeader &blockHeader) {
}
bool ROQPlayer::processBlockSoundStereo(ROQBlockHeader &blockHeader) {
- debugC(5, kGroovieDebugVideo | kGroovieDebugAll, "Groovie::ROQ: Processing stereo sound block");
+ debugC(5, kDebugVideo, "Groovie::ROQ: Processing stereo sound block");
// Verify the block header
if (blockHeader.type != 0x1021) {
@@ -553,7 +539,7 @@ bool ROQPlayer::processBlockSoundStereo(ROQBlockHeader &blockHeader) {
}
bool ROQPlayer::processBlockAudioContainer(ROQBlockHeader &blockHeader) {
- debugC(5, kGroovieDebugVideo | kGroovieDebugAll, "Groovie::ROQ: Processing audio container block: 0x%04X", blockHeader.param);
+ debugC(5, kDebugVideo, "Groovie::ROQ: Processing audio container block: 0x%04X", blockHeader.param);
return true;
}
@@ -573,25 +559,14 @@ void ROQPlayer::paint2(byte i, int destx, int desty) {
error("Groovie::ROQ: Invalid 2x2 block %d (%d available)", i, _num2blocks);
}
- byte *block = &_codebook2[i * 10];
- byte u = block[8];
- byte v = block[9];
+ uint32 *block = _codebook2 + i * 4;
+ uint32 *ptr = (uint32 *)_currBuf->getBasePtr(destx, desty);
+ uint32 pitch = _currBuf->pitch / 4;
- byte *ptr = (byte *)_currBuf->getBasePtr(destx, desty);
- for (int y = 0; y < 2; y++) {
- for (int x = 0; x < 2; x++) {
- // Basic alpha test
- // TODO: Blending
- if (*(block + 1) > 128) {
- *ptr = *block;
- *(ptr + 1) = u;
- *(ptr + 2) = v;
- }
- ptr += 3;
- block += 2;
- }
- ptr += _currBuf->pitch - 6;
- }
+ ptr[0] = block[0];
+ ptr[1] = block[1];
+ ptr[pitch] = block[2];
+ ptr[pitch + 1] = block[3];
}
void ROQPlayer::paint4(byte i, int destx, int desty) {
@@ -616,25 +591,14 @@ void ROQPlayer::paint8(byte i, int destx, int desty) {
byte *block4 = &_codebook4[i * 4];
for (int y4 = 0; y4 < 2; y4++) {
for (int x4 = 0; x4 < 2; x4++) {
- byte *block2 = &_codebook2[(*block4) * 10];
- byte u = block2[8];
- byte v = block2[9];
- block4++;
+ uint32 *block2 = _codebook2 + *block4++ * 4;
+
for (int y2 = 0; y2 < 2; y2++) {
for (int x2 = 0; x2 < 2; x2++) {
- for (int repy = 0; repy < 2; repy++) {
- for (int repx = 0; repx < 2; repx++) {
- // Basic alpha test
- // TODO: Blending
- if (*(block2 + 1) > 128) {
- byte *ptr = (byte *)_currBuf->getBasePtr(destx + x4*4 + x2*2 + repx, desty + y4*4 + y2*2 + repy);
- *ptr = *block2;
- *(ptr + 1) = u;
- *(ptr + 2) = v;
- }
- }
- }
- block2 += 2;
+ uint32 *ptr = (uint32 *)_currBuf->getBasePtr(destx + x4 * 4 + x2 * 2, desty + y4 * 4 + y2 * 2);
+ uint32 pitch = _currBuf->pitch / 4;
+ uint32 color = *block2++;
+ ptr[0] = ptr[1] = ptr[pitch] = ptr[pitch + 1] = color;
}
}
}
@@ -655,7 +619,7 @@ void ROQPlayer::copy(byte size, int destx, int desty, int offx, int offy) {
// Move to the beginning of the next line
dst += _currBuf->pitch;
- src += _currBuf->pitch;
+ src += _prevBuf->pitch;
}
}
diff --git a/engines/groovie/roq.h b/engines/groovie/roq.h
index c5d3f255d3..7e7d38580e 100644
--- a/engines/groovie/roq.h
+++ b/engines/groovie/roq.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -71,18 +71,18 @@ private:
// Codebooks
uint16 _num2blocks;
uint16 _num4blocks;
- byte _codebook2[256 * 10];
+ uint32 _codebook2[256 * 4];
byte _codebook4[256 * 4];
// Buffers
- Graphics::Surface *_fg, *_bg, *_thirdBuf;
+ Graphics::Surface *_bg;
Graphics::Surface *_currBuf, *_prevBuf;
void buildShowBuf();
byte _scaleX, _scaleY;
byte _offScale;
bool _dirty;
byte _alpha;
-
+ bool _firstFrame;
};
} // End of Groovie namespace
diff --git a/engines/groovie/saveload.cpp b/engines/groovie/saveload.cpp
index 1a92c02e0e..78b79cfa26 100644
--- a/engines/groovie/saveload.cpp
+++ b/engines/groovie/saveload.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/groovie/saveload.h b/engines/groovie/saveload.h
index 15ce108c7d..6f20250e0a 100644
--- a/engines/groovie/saveload.h
+++ b/engines/groovie/saveload.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/groovie/script.cpp b/engines/groovie/script.cpp
index 8e3bef9945..7625151082 100644
--- a/engines/groovie/script.cpp
+++ b/engines/groovie/script.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -47,26 +47,6 @@
namespace Groovie {
-static void debugScript(int level, bool nl, const char *s, ...) GCC_PRINTF(3, 4);
-
-static void debugScript(int level, bool nl, const char *s, ...) {
- char buf[STRINGBUFLEN];
- va_list va;
-
- if (!DebugMan.isDebugChannelEnabled(kGroovieDebugScript) &&
- !DebugMan.isDebugChannelEnabled(kGroovieDebugAll))
- return;
-
- va_start(va, s);
- vsnprintf(buf, STRINGBUFLEN, s, va);
- va_end(va);
-
- if (nl)
- debug(level, "%s", buf);
- else
- debugN(level, "%s", buf);
-}
-
Script::Script(GroovieEngine *vm, EngineVersion version) :
_code(NULL), _savedCode(NULL), _stacktop(0), _debugger(NULL), _vm(vm),
_videoFile(NULL), _videoRef(0), _staufsMove(NULL), _lastCursor(0xff),
@@ -120,7 +100,7 @@ Script::~Script() {
void Script::setVariable(uint16 variablenum, byte value) {
_variables[variablenum] = value;
- debugC(1, kGroovieDebugScriptvars | kGroovieDebugAll, "script variable[0x%03X] = %d (0x%04X)", variablenum, value, value);
+ debugC(1, kDebugScriptvars, "script variable[0x%03X] = %d (0x%04X)", variablenum, value, value);
}
void Script::setDebugger(Debugger *debugger) {
@@ -229,7 +209,7 @@ void Script::step() {
// Only output if we're not re-doing the previous instruction
if (_currentInstruction != _oldInstruction) {
- debugScript(1, false, "%s", _debugString.c_str());
+ debugCN(1, kDebugScript, "%s", _debugString.c_str());
_oldInstruction = _currentInstruction;
}
@@ -354,7 +334,7 @@ uint32 Script::getVideoRefString() {
// Add a trailing dot
str += 0x2E;
- debugScript(0, false, "%s", str.c_str());
+ debugCN(0, kDebugScript, "%s", str.c_str());
// Extract the script name.
Common::String scriptname(_scriptFile.c_str(), _scriptFile.size() - 4);
@@ -369,8 +349,7 @@ bool Script::hotspot(Common::Rect rect, uint16 address, uint8 cursor) {
bool contained = rect.contains(mousepos);
// Show hotspots when debugging
- if (DebugMan.isDebugChannelEnabled(kGroovieDebugHotspots) ||
- DebugMan.isDebugChannelEnabled(kGroovieDebugAll)) {
+ if (DebugMan.isDebugChannelEnabled(kDebugHotspots)) {
rect.translate(0, -80);
_vm->_graphicsMan->_foreground.frameRect(rect, 250);
_vm->_system->copyRectToScreen(_vm->_graphicsMan->_foreground.getPixels(), _vm->_graphicsMan->_foreground.pitch, 0, 80, 640, 320);
@@ -416,7 +395,7 @@ void Script::savegame(uint slot) {
Common::OutSaveFile *file = SaveLoad::openForSaving(ConfMan.getActiveDomainName(), slot);
if (!file) {
- debugC(9, kGroovieDebugScript, "Save file pointer is null");
+ debugC(9, kDebugScript, "Save file pointer is null");
GUI::MessageDialog dialog(_("Failed to save game"), _("OK"));
dialog.runModal();
return;
@@ -462,32 +441,32 @@ void Script::o_invalid() {
}
void Script::o_nop() {
- debugScript(1, true, "NOP");
+ debugC(1, kDebugScript, "NOP");
}
void Script::o_nop8() {
uint8 tmp = readScript8bits();
- debugScript(1, true, "NOP8: 0x%02X", tmp);
+ debugC(1, kDebugScript, "NOP8: 0x%02X", tmp);
}
void Script::o_nop16() {
uint16 tmp = readScript16bits();
- debugScript(1, true, "NOP16: 0x%04X", tmp);
+ debugC(1, kDebugScript, "NOP16: 0x%04X", tmp);
}
void Script::o_nop32() {
uint32 tmp = readScript32bits();
- debugScript(1, true, "NOP32: 0x%08X", tmp);
+ debugC(1, kDebugScript, "NOP32: 0x%08X", tmp);
}
void Script::o_nop8or16() {
uint16 tmp = readScript8or16bits();
- debugScript(1, true, "NOP8OR16: 0x%04X", tmp);
+ debugC(1, kDebugScript, "NOP8OR16: 0x%04X", tmp);
}
void Script::o_playsong() { // 0x02
uint16 fileref = readScript16bits();
- debugScript(1, true, "PlaySong(0x%04X): Play xmidi file", fileref);
+ debugC(1, kDebugScript, "PlaySong(0x%04X): Play xmidi file", fileref);
if (fileref == 0x4C17) {
warning("this song is special somehow");
// don't save the reference?
@@ -496,33 +475,33 @@ void Script::o_playsong() { // 0x02
}
void Script::o_bf9on() { // 0x03
- debugScript(1, true, "BF9ON: bitflag 9 turned on");
+ debugC(1, kDebugScript, "BF9ON: bitflag 9 turned on");
_bitflags |= 1 << 9;
}
void Script::o_palfadeout() {
- debugScript(1, true, "PALFADEOUT");
+ debugC(1, kDebugScript, "PALFADEOUT");
_vm->_graphicsMan->fadeOut();
}
void Script::o_bf8on() { // 0x05
- debugScript(1, true, "BF8ON: bitflag 8 turned on");
+ debugC(1, kDebugScript, "BF8ON: bitflag 8 turned on");
_bitflags |= 1 << 8;
}
void Script::o_bf6on() { // 0x06
- debugScript(1, true, "BF6ON: bitflag 6 turned on");
+ debugC(1, kDebugScript, "BF6ON: bitflag 6 turned on");
_bitflags |= 1 << 6;
}
void Script::o_bf7on() { // 0x07
- debugScript(1, true, "BF7ON: bitflag 7 turned on");
+ debugC(1, kDebugScript, "BF7ON: bitflag 7 turned on");
_bitflags |= 1 << 7;
}
void Script::o_setbackgroundsong() { // 0x08
uint16 fileref = readScript16bits();
- debugScript(1, true, "SetBackgroundSong(0x%04X)", fileref);
+ debugC(1, kDebugScript, "SetBackgroundSong(0x%04X)", fileref);
_vm->_musicPlayer->setBackgroundSong(fileref);
}
@@ -531,15 +510,15 @@ void Script::o_videofromref() { // 0x09
// Show the debug information just when starting the playback
if (fileref != _videoRef) {
- debugScript(1, false, "VIDEOFROMREF(0x%04X) (Not fully imp): Play video file from ref", fileref);
- debugC(5, kGroovieDebugVideo | kGroovieDebugAll, "Playing video 0x%04X via 0x09", fileref);
+ debugC(1, kDebugScript, "VIDEOFROMREF(0x%04X) (Not fully imp): Play video file from ref", fileref);
+ debugC(5, kDebugVideo, "Playing video 0x%04X via 0x09", fileref);
}
switch (fileref) {
case 0x1C03: // Trilobyte logo
case 0x1C04: // Virgin logo
case 0x1C05: // Credits
if (fileref != _videoRef) {
- debugScript(1, true, "Use external file if available");
+ debugC(1, kDebugScript, "Use external file if available");
}
break;
@@ -551,12 +530,12 @@ void Script::o_videofromref() { // 0x09
case 0x206D: // Cards on table puzzle (bedroom)
case 0x2001: // Coins on table puzzle (bedroom)
if (fileref != _videoRef) {
- debugScript(1, false, " (This video is special somehow!)");
+ debugCN(1, kDebugScript, " (This video is special somehow!)");
warning("(This video (0x%04X) is special somehow!)", fileref);
}
}
if (fileref != _videoRef) {
- debugScript(1, false, "\n");
+ debugCN(1, kDebugScript, "\n");
}
// Play the video
if (!playvideofromref(fileref)) {
@@ -570,14 +549,14 @@ bool Script::playvideofromref(uint32 fileref) {
if (fileref != _videoRef) {
// Debug bitflags
- debugScript(1, false, "Play video 0x%04X (bitflags:", fileref);
+ debugCN(1, kDebugScript, "Play video 0x%04X (bitflags:", fileref);
for (int i = 15; i >= 0; i--) {
- debugScript(1, false, "%d", _bitflags & (1 << i)? 1 : 0);
+ debugCN(1, kDebugScript, "%d", _bitflags & (1 << i)? 1 : 0);
if (i % 4 == 0) {
- debugScript(1, false, " ");
+ debugCN(1, kDebugScript, " ");
}
}
- debugScript(1, true, " <- 0)");
+ debugC(1, kDebugScript, " <- 0)");
// Close the previous video file
if (_videoFile) {
@@ -634,7 +613,7 @@ bool Script::playvideofromref(uint32 fileref) {
_eventKbdChar = 0;
// Newline
- debugScript(1, false, "\n");
+ debugCN(1, kDebugScript, "\n");
}
// Let the caller know if the video has ended
@@ -646,12 +625,12 @@ bool Script::playvideofromref(uint32 fileref) {
}
void Script::o_bf5on() { // 0x0A
- debugScript(1, true, "BF5ON: bitflag 5 turned on");
+ debugC(1, kDebugScript, "BF5ON: bitflag 5 turned on");
_bitflags |= 1 << 5;
}
void Script::o_inputloopstart() { //0x0B
- debugScript(5, true, "Input loop start");
+ debugC(5, kDebugScript, "Input loop start");
// Reset the input action and the mouse cursor
_inputAction = -1;
@@ -675,7 +654,7 @@ void Script::o_keyboardaction() {
uint8 val = readScript8bits();
uint16 address = readScript16bits();
- debugScript(5, true, "Test key == 0x%02X @0x%04X", val, address);
+ debugC(5, kDebugScript, "Test key == 0x%02X @0x%04X", val, address);
// If there's an already planned action, do nothing
if (_inputAction != -1) {
@@ -700,7 +679,7 @@ void Script::o_hotspot_rect() {
uint16 address = readScript16bits();
uint8 cursor = readScript8bits();
- debugScript(5, true, "HOTSPOT-RECT(%d,%d,%d,%d) @0x%04X cursor=%d", left, top, right, bottom, address, cursor);
+ debugC(5, kDebugScript, "HOTSPOT-RECT(%d,%d,%d,%d) @0x%04X cursor=%d", left, top, right, bottom, address, cursor);
// Mark the specified rectangle
Common::Rect rect(left, top, right, bottom);
@@ -710,7 +689,7 @@ void Script::o_hotspot_rect() {
void Script::o_hotspot_left() {
uint16 address = readScript16bits();
- debugScript(5, true, "HOTSPOT-LEFT @0x%04X", address);
+ debugC(5, kDebugScript, "HOTSPOT-LEFT @0x%04X", address);
// Mark the leftmost 100 pixels of the game area
Common::Rect rect(0, 80, 100, 400);
@@ -720,7 +699,7 @@ void Script::o_hotspot_left() {
void Script::o_hotspot_right() {
uint16 address = readScript16bits();
- debugScript(5, true, "HOTSPOT-RIGHT @0x%04X", address);
+ debugC(5, kDebugScript, "HOTSPOT-RIGHT @0x%04X", address);
// Mark the rightmost 100 pixels of the game area
Common::Rect rect(540, 80, 640, 400);
@@ -730,7 +709,7 @@ void Script::o_hotspot_right() {
void Script::o_hotspot_center() {
uint16 address = readScript16bits();
- debugScript(5, true, "HOTSPOT-CENTER @0x%04X", address);
+ debugC(5, kDebugScript, "HOTSPOT-CENTER @0x%04X", address);
// Mark the centermost 240 pixels of the game area
Common::Rect rect(200, 80, 440, 400);
@@ -740,7 +719,7 @@ void Script::o_hotspot_center() {
void Script::o_hotspot_current() {
uint16 address = readScript16bits();
- debugScript(5, true, "HOTSPOT-CURRENT @0x%04X", address);
+ debugC(5, kDebugScript, "HOTSPOT-CURRENT @0x%04X", address);
// The original interpreter doesn't check the position, so accept the
// whole screen
@@ -749,7 +728,7 @@ void Script::o_hotspot_current() {
}
void Script::o_inputloopend() {
- debugScript(5, true, "Input loop end");
+ debugC(5, kDebugScript, "Input loop end");
// Handle the predefined hotspots
if (_hotspotTopAction) {
@@ -802,7 +781,7 @@ void Script::o_random() {
uint16 varnum = readScript8or16bits();
uint8 maxnum = readScript8bits();
- debugScript(1, true, "RANDOM: var[0x%04X] = rand(%d)", varnum, maxnum);
+ debugC(1, kDebugScript, "RANDOM: var[0x%04X] = rand(%d)", varnum, maxnum);
setVariable(varnum, _random.getRandomNumber(maxnum));
}
@@ -810,7 +789,7 @@ void Script::o_random() {
void Script::o_jmp() {
uint16 address = readScript16bits();
- debugScript(1, true, "JMP @0x%04X", address);
+ debugC(1, kDebugScript, "JMP @0x%04X", address);
// Set the current address
_currentInstruction = address;
@@ -819,18 +798,18 @@ void Script::o_jmp() {
void Script::o_loadstring() {
uint16 varnum = readScript8or16bits();
- debugScript(1, false, "LOADSTRING var[0x%04X..] =", varnum);
+ debugCN(1, kDebugScript, "LOADSTRING var[0x%04X..] =", varnum);
do {
setVariable(varnum++, readScriptChar(true, true, true));
- debugScript(1, false, " 0x%02X", _variables[varnum - 1]);
+ debugCN(1, kDebugScript, " 0x%02X", _variables[varnum - 1]);
} while (!(getCodeByte(_currentInstruction - 1) & 0x80));
- debugScript(1, false, "\n");
+ debugCN(1, kDebugScript, "\n");
}
void Script::o_ret() {
uint8 val = readScript8bits();
- debugScript(1, true, "RET %d", val);
+ debugC(1, kDebugScript, "RET %d", val);
// Set the return value
setVariable(0x102, val);
@@ -847,7 +826,7 @@ void Script::o_ret() {
void Script::o_call() {
uint16 address = readScript16bits();
- debugScript(1, true, "CALL @0x%04X", address);
+ debugC(1, kDebugScript, "CALL @0x%04X", address);
// Save return address in the call stack
_stack[_stacktop] = _currentInstruction;
@@ -860,7 +839,7 @@ void Script::o_call() {
void Script::o_sleep() {
uint16 time = readScript16bits();
- debugScript(1, true, "SLEEP 0x%04X", time);
+ debugC(1, kDebugScript, "SLEEP 0x%04X", time);
_vm->_system->delayMillis(time * 3);
}
@@ -869,7 +848,7 @@ void Script::o_strcmpnejmp() { // 0x1A
uint16 varnum = readScript8or16bits();
uint8 result = 1;
- debugScript(1, false, "STRCMP-NEJMP: var[0x%04X..],", varnum);
+ debugCN(1, kDebugScript, "STRCMP-NEJMP: var[0x%04X..],", varnum);
do {
uint8 val = readScriptChar(true, true, true);
@@ -878,33 +857,33 @@ void Script::o_strcmpnejmp() { // 0x1A
result = 0;
}
varnum++;
- debugScript(1, false, " 0x%02X", val);
+ debugCN(1, kDebugScript, " 0x%02X", val);
} while (!(getCodeByte(_currentInstruction - 1) & 0x80));
uint16 address = readScript16bits();
if (!result) {
- debugScript(1, true, " jumping to @0x%04X", address);
+ debugC(1, kDebugScript, " jumping to @0x%04X", address);
_currentInstruction = address;
} else {
- debugScript(1, true, " not jumping");
+ debugC(1, kDebugScript, " not jumping");
}
}
void Script::o_xor_obfuscate() {
uint16 varnum = readScript8or16bits();
- debugScript(1, false, "XOR OBFUSCATE: var[0x%04X..] = ", varnum);
+ debugCN(1, kDebugScript, "XOR OBFUSCATE: var[0x%04X..] = ", varnum);
do {
uint8 val = readScript8bits();
_firstbit = ((val & 0x80) != 0);
val &= 0x4F;
setVariable(varnum, _variables[varnum] ^ val);
- debugScript(1, false, "%c", _variables[varnum]);
+ debugCN(1, kDebugScript, "%c", _variables[varnum]);
varnum++;
} while (!_firstbit);
- debugScript(1, false, "\n");
+ debugCN(1, kDebugScript, "\n");
}
void Script::o_vdxtransition() { // 0x1C
@@ -912,8 +891,8 @@ void Script::o_vdxtransition() { // 0x1C
// Show the debug information just when starting the playback
if (fileref != _videoRef) {
- debugScript(1, true, "VDX transition fileref = 0x%04X", fileref);
- debugC(1, kGroovieDebugVideo | kGroovieDebugAll, "Playing video 0x%04X with transition", fileref);
+ debugC(1, kDebugScript, "VDX transition fileref = 0x%04X", fileref);
+ debugC(1, kDebugVideo, "Playing video 0x%04X with transition", fileref);
}
// Set bit 1
@@ -938,7 +917,7 @@ void Script::o_swap() {
uint16 varnum1 = readScript8or16bits();
uint16 varnum2 = readScript16bits();
- debugScript(1, true, "SWAP var[0x%04X] <-> var[0x%04X]", varnum1, varnum2);
+ debugC(1, kDebugScript, "SWAP var[0x%04X] <-> var[0x%04X]", varnum1, varnum2);
uint8 tmp = _variables[varnum1];
setVariable(varnum1, _variables[varnum2]);
@@ -948,7 +927,7 @@ void Script::o_swap() {
void Script::o_inc() {
uint16 varnum = readScript8or16bits();
- debugScript(1, true, "INC var[0x%04X]", varnum);
+ debugC(1, kDebugScript, "INC var[0x%04X]", varnum);
setVariable(varnum, _variables[varnum] + 1);
}
@@ -956,7 +935,7 @@ void Script::o_inc() {
void Script::o_dec() {
uint16 varnum = readScript8or16bits();
- debugScript(1, true, "DEC var[0x%04X]", varnum);
+ debugC(1, kDebugScript, "DEC var[0x%04X]", varnum);
setVariable(varnum, _variables[varnum] - 1);
}
@@ -982,7 +961,7 @@ void Script::o_strcmpnejmp_var() { // 0x21
}
void Script::o_copybgtofg() { // 0x22
- debugScript(1, true, "COPY_BG_TO_FG");
+ debugC(1, kDebugScript, "COPY_BG_TO_FG");
memcpy(_vm->_graphicsMan->_foreground.getPixels(), _vm->_graphicsMan->_background.getPixels(), 640 * 320);
}
@@ -990,7 +969,7 @@ void Script::o_strcmpeqjmp() { // 0x23
uint16 varnum = readScript8or16bits();
uint8 result = 1;
- debugScript(1, false, "STRCMP-EQJMP: var[0x%04X..],", varnum);
+ debugCN(1, kDebugScript, "STRCMP-EQJMP: var[0x%04X..],", varnum);
do {
uint8 val = readScriptChar(true, true, true);
@@ -998,15 +977,15 @@ void Script::o_strcmpeqjmp() { // 0x23
result = 0;
}
varnum++;
- debugScript(1, false, " 0x%02X", val);
+ debugCN(1, kDebugScript, " 0x%02X", val);
} while (!(getCodeByte(_currentInstruction - 1) & 0x80));
uint16 address = readScript16bits();
if (result) {
- debugScript(1, true, " jumping to @0x%04X", address);
+ debugC(1, kDebugScript, " jumping to @0x%04X", address);
_currentInstruction = address;
} else {
- debugScript(1, true, " not jumping");
+ debugC(1, kDebugScript, " not jumping");
}
}
@@ -1014,7 +993,7 @@ void Script::o_mov() {
uint16 varnum1 = readScript8or16bits();
uint16 varnum2 = readScript16bits();
- debugScript(1, true, "MOV var[0x%04X] = var[0x%04X]", varnum1, varnum2);
+ debugC(1, kDebugScript, "MOV var[0x%04X] = var[0x%04X]", varnum1, varnum2);
setVariable(varnum1, _variables[varnum2]);
}
@@ -1023,7 +1002,7 @@ void Script::o_add() {
uint16 varnum1 = readScript8or16bits();
uint16 varnum2 = readScript16bits();
- debugScript(1, true, "ADD var[0x%04X] += var[0x%04X]", varnum1, varnum2);
+ debugC(1, kDebugScript, "ADD var[0x%04X] += var[0x%04X]", varnum1, varnum2);
setVariable(varnum1, _variables[varnum1] + _variables[varnum2]);
}
@@ -1034,7 +1013,7 @@ void Script::o_videofromstring1() {
// Show the debug information just when starting the playback
if (fileref != _videoRef) {
- debugScript(0, true, "VIDEOFROMSTRING1 0x%04X", fileref);
+ debugC(0, kDebugScript, "VIDEOFROMSTRING1 0x%04X", fileref);
}
// Play the video
@@ -1050,7 +1029,7 @@ void Script::o_videofromstring2() {
// Show the debug information just when starting the playback
if (fileref != _videoRef) {
- debugScript(0, true, "VIDEOFROMSTRING2 0x%04X", fileref);
+ debugC(0, kDebugScript, "VIDEOFROMSTRING2 0x%04X", fileref);
}
// Set bit 1
@@ -1069,11 +1048,11 @@ void Script::o_videofromstring2() {
}
void Script::o_stopmidi() {
- debugScript(1, true, "STOPMIDI (TODO)");
+ debugC(1, kDebugScript, "STOPMIDI (TODO)");
}
void Script::o_endscript() {
- debugScript(1, true, "END OF SCRIPT");
+ debugC(1, kDebugScript, "END OF SCRIPT");
_vm->quitGame();
}
@@ -1081,7 +1060,7 @@ void Script::o_sethotspottop() {
uint16 address = readScript16bits();
uint8 cursor = readScript8bits();
- debugScript(5, true, "SETHOTSPOTTOP @0x%04X cursor=%d", address, cursor);
+ debugC(5, kDebugScript, "SETHOTSPOTTOP @0x%04X cursor=%d", address, cursor);
_hotspotTopAction = address;
_hotspotTopCursor = cursor;
@@ -1091,7 +1070,7 @@ void Script::o_sethotspotbottom() {
uint16 address = readScript16bits();
uint8 cursor = readScript8bits();
- debugScript(5, true, "SETHOTSPOTBOTTOM @0x%04X cursor=%d", address, cursor);
+ debugC(5, kDebugScript, "SETHOTSPOTBOTTOM @0x%04X cursor=%d", address, cursor);
_hotspotBottomAction = address;
_hotspotBottomCursor = cursor;
@@ -1101,7 +1080,7 @@ void Script::o_loadgame() {
uint16 varnum = readScript8or16bits();
uint8 slot = _variables[varnum];
- debugScript(1, true, "LOADGAME var[0x%04X] -> slot=%d (TODO)", varnum, slot);
+ debugC(1, kDebugScript, "LOADGAME var[0x%04X] -> slot=%d (TODO)", varnum, slot);
loadgame(slot);
_vm->_system->fillScreen(0);
@@ -1111,7 +1090,7 @@ void Script::o_savegame() {
uint16 varnum = readScript8or16bits();
uint8 slot = _variables[varnum];
- debugScript(1, true, "SAVEGAME var[0x%04X] -> slot=%d (TODO)", varnum, slot);
+ debugC(1, kDebugScript, "SAVEGAME var[0x%04X] -> slot=%d (TODO)", varnum, slot);
savegame(slot);
}
@@ -1119,7 +1098,7 @@ void Script::o_savegame() {
void Script::o_hotspotbottom_4() { //0x30
uint16 address = readScript16bits();
- debugScript(5, true, "HOTSPOT-BOTTOM @0x%04X", address);
+ debugC(5, kDebugScript, "HOTSPOT-BOTTOM @0x%04X", address);
// Mark the 80 pixels under the game area
Common::Rect rect(0, 400, 640, 480);
@@ -1130,7 +1109,7 @@ void Script::o_midivolume() {
uint16 arg1 = readScript16bits();
uint16 arg2 = readScript16bits();
- debugScript(1, true, "MIDI volume: %d %d", arg1, arg2);
+ debugC(1, kDebugScript, "MIDI volume: %d %d", arg1, arg2);
_vm->_musicPlayer->setGameVolume(arg1, arg2);
}
@@ -1139,13 +1118,13 @@ void Script::o_jne() {
uint16 varnum2 = readScript16bits();
uint16 address = readScript16bits();
- debugScript(1, false, "JNE: var[var[0x%04X] - 0x31] != var[0x%04X] @0x%04X", varnum1, varnum2, address);
+ debugCN(1, kDebugScript, "JNE: var[var[0x%04X] - 0x31] != var[0x%04X] @0x%04X", varnum1, varnum2, address);
if (_variables[_variables[varnum1] - 0x31] != _variables[varnum2]) {
_currentInstruction = address;
- debugScript(1, true, " jumping to @0x%04X", address);
+ debugC(1, kDebugScript, " jumping to @0x%04X", address);
} else {
- debugScript(1, true, " not jumping");
+ debugC(1, kDebugScript, " not jumping");
}
}
@@ -1153,19 +1132,19 @@ void Script::o_loadstringvar() {
uint16 varnum = readScript8or16bits();
varnum = _variables[varnum] - 0x31;
- debugScript(1, false, "LOADSTRINGVAR var[0x%04X..] =", varnum);
+ debugCN(1, kDebugScript, "LOADSTRINGVAR var[0x%04X..] =", varnum);
do {
setVariable(varnum++, readScriptChar(true, true, true));
- debugScript(1, false, " 0x%02X", _variables[varnum - 1]);
+ debugCN(1, kDebugScript, " 0x%02X", _variables[varnum - 1]);
} while (!(getCodeByte(_currentInstruction - 1) & 0x80));
- debugScript(1, false, "\n");
+ debugCN(1, kDebugScript, "\n");
}
void Script::o_chargreatjmp() {
uint16 varnum = readScript8or16bits();
uint8 result = 0;
- debugScript(1, false, "CHARGREAT-JMP: var[0x%04X..],", varnum);
+ debugCN(1, kDebugScript, "CHARGREAT-JMP: var[0x%04X..],", varnum);
do {
uint8 val = readScriptChar(true, true, true);
@@ -1173,20 +1152,20 @@ void Script::o_chargreatjmp() {
result = 1;
}
varnum++;
- debugScript(1, false, " 0x%02X", val);
+ debugCN(1, kDebugScript, " 0x%02X", val);
} while (!(getCodeByte(_currentInstruction - 1) & 0x80));
uint16 address = readScript16bits();
if (result) {
- debugScript(1, true, " jumping to @0x%04X", address);
+ debugC(1, kDebugScript, " jumping to @0x%04X", address);
_currentInstruction = address;
} else {
- debugScript(1, true, " not jumping");
+ debugC(1, kDebugScript, " not jumping");
}
}
void Script::o_bf7off() {
- debugScript(1, true, "BF7OFF: bitflag 7 turned off");
+ debugC(1, kDebugScript, "BF7OFF: bitflag 7 turned off");
_bitflags &= ~(1 << 7);
}
@@ -1194,7 +1173,7 @@ void Script::o_charlessjmp() {
uint16 varnum = readScript8or16bits();
uint8 result = 0;
- debugScript(1, false, "CHARLESS-JMP: var[0x%04X..],", varnum);
+ debugCN(1, kDebugScript, "CHARLESS-JMP: var[0x%04X..],", varnum);
do {
uint8 val = readScriptChar(true, true, true);
@@ -1202,15 +1181,15 @@ void Script::o_charlessjmp() {
result = 1;
}
varnum++;
- debugScript(1, false, " 0x%02X", val);
+ debugCN(1, kDebugScript, " 0x%02X", val);
} while (!(getCodeByte(_currentInstruction - 1) & 0x80));
uint16 address = readScript16bits();
if (result) {
- debugScript(1, true, " jumping to @0x%04X", address);
+ debugC(1, kDebugScript, " jumping to @0x%04X", address);
_currentInstruction = address;
} else {
- debugScript(1, true, " not jumping");
+ debugC(1, kDebugScript, " not jumping");
}
}
@@ -1219,11 +1198,50 @@ void Script::o_copyrecttobg() { // 0x37
uint16 top = readScript16bits();
uint16 right = readScript16bits();
uint16 bottom = readScript16bits();
+
+ // Sanity checks to prevent bad pointer access crashes
+ if (left > right) {
+ warning("COPYRECT left:%d > right:%d", left, right);
+ // swap over left and right parameters
+ uint16 j;
+ j = right;
+ right = left;
+ left = j;
+ }
+ if (top > bottom) {
+ warning("COPYRECT top:%d > bottom:%d", top, bottom);
+ // swap over top and bottom parameters
+ uint16 j;
+ j = bottom;
+ bottom = top;
+ top = j;
+ }
+ if (top < 80) {
+ warning("COPYRECT top < 80... clamping");
+ top = 80;
+ }
+ if (top >= 480) {
+ warning("COPYRECT top >= 480... clamping");
+ top = 480 - 1;
+ }
+ if (bottom >= 480) {
+ warning("COPYRECT bottom >= 480... clamping");
+ bottom = 480 - 1;
+ }
+ if (left >= 640) {
+ warning("COPYRECT left >= 640... clamping");
+ left = 640 - 1;
+ }
+ if (right >= 640) {
+ warning("COPYRECT right >= 640... clamping");
+ right = 640 - 1;
+ }
+
uint16 i, width = right - left, height = bottom - top;
uint32 offset = 0;
byte *fg, *bg;
- debugScript(1, true, "COPYRECT((%d,%d)->(%d,%d))", left, top, right, bottom);
+ debugC(1, kDebugScript, "COPYRECT((%d,%d)->(%d,%d))", left, top, right, bottom);
fg = (byte *)_vm->_graphicsMan->_foreground.getBasePtr(left, top - 80);
bg = (byte *)_vm->_graphicsMan->_background.getBasePtr(left, top - 80);
@@ -1236,13 +1254,13 @@ void Script::o_copyrecttobg() { // 0x37
}
void Script::o_restorestkpnt() {
- debugScript(1, true, "Restore stack pointer from saved (TODO)");
+ debugC(1, kDebugScript, "Restore stack pointer from saved (TODO)");
}
void Script::o_obscureswap() {
uint16 var1, var2, tmp;
- debugScript(1, true, "OBSCSWAP");
+ debugC(1, kDebugScript, "OBSCSWAP");
// Read the first variable
var1 = readScriptChar(false, true, true) * 10;
@@ -1262,7 +1280,7 @@ void Script::o_printstring() {
char stringstorage[15];
uint8 counter = 0;
- debugScript(1, true, "PRINTSTRING");
+ debugC(1, kDebugScript, "PRINTSTRING");
memset(stringstorage, 0, 15);
do {
@@ -1300,7 +1318,7 @@ void Script::o_hotspot_slot() {
uint16 address = readScript16bits();
uint16 cursor = readScript8bits();
- debugScript(1, true, "HOTSPOT-SLOT %d (%d,%d,%d,%d) @0x%04X cursor=%d (TODO)", slot, left, top, right, bottom, address, cursor);
+ debugC(1, kDebugScript, "HOTSPOT-SLOT %d (%d,%d,%d,%d) @0x%04X cursor=%d (TODO)", slot, left, top, right, bottom, address, cursor);
Common::Rect rect(left, top, right, bottom);
if (hotspot(rect, address, cursor)) {
@@ -1338,7 +1356,7 @@ void Script::o_hotspot_slot() {
}
void Script::o_checkvalidsaves() {
- debugScript(1, true, "CHECKVALIDSAVES");
+ debugC(1, kDebugScript, "CHECKVALIDSAVES");
// Reset the array of valid saves and the savegame names cache
for (int i = 0; i < 10; i++) {
@@ -1355,7 +1373,7 @@ void Script::o_checkvalidsaves() {
while (it != list.end()) {
int8 slot = it->getSaveSlot();
if (SaveLoad::isSlotValid(slot)) {
- debugScript(2, true, " Found valid savegame: %s", it->getDescription().c_str());
+ debugC(2, kDebugScript, " Found valid savegame: %s", it->getDescription().c_str());
// Mark this slot as used
setVariable(slot, 1);
@@ -1369,11 +1387,11 @@ void Script::o_checkvalidsaves() {
// Save the number of valid saves
setVariable(0x104, count);
- debugScript(1, true, " Found %d valid savegames", count);
+ debugC(1, kDebugScript, " Found %d valid savegames", count);
}
void Script::o_resetvars() {
- debugScript(1, true, "RESETVARS");
+ debugC(1, kDebugScript, "RESETVARS");
for (int i = 0; i < 0x100; i++) {
setVariable(i, 0);
}
@@ -1383,7 +1401,7 @@ void Script::o_mod() {
uint16 varnum = readScript8or16bits();
uint8 val = readScript8bits();
- debugScript(1, true, "MOD var[0x%04X] %%= %d", varnum, val);
+ debugC(1, kDebugScript, "MOD var[0x%04X] %%= %d", varnum, val);
setVariable(varnum, _variables[varnum] % val);
}
@@ -1395,7 +1413,7 @@ void Script::o_loadscript() {
while ((c = readScript8bits())) {
filename += c;
}
- debugScript(1, true, "LOADSCRIPT %s", filename.c_str());
+ debugC(1, kDebugScript, "LOADSCRIPT %s", filename.c_str());
// Just 1 level of sub-scripts are allowed
if (_savedCode) {
@@ -1430,7 +1448,7 @@ void Script::o_setvideoorigin() {
// Set bitflag 7
_bitflags |= 1 << 7;
- debugScript(1, true, "SetVideoOrigin(0x%04X,0x%04X) (%d, %d)", origX, origY, origX, origY);
+ debugC(1, kDebugScript, "SetVideoOrigin(0x%04X,0x%04X) (%d, %d)", origX, origY, origX, origY);
_vm->_videoPlayer->setOrigin(origX, origY);
}
@@ -1438,7 +1456,7 @@ void Script::o_sub() {
uint16 varnum1 = readScript8or16bits();
uint16 varnum2 = readScript16bits();
- debugScript(1, true, "SUB var[0x%04X] -= var[0x%04X]", varnum1, varnum2);
+ debugC(1, kDebugScript, "SUB var[0x%04X] -= var[0x%04X]", varnum1, varnum2);
setVariable(varnum1, _variables[varnum1] - _variables[varnum2]);
}
@@ -1448,7 +1466,7 @@ void Script::o_cellmove() {
byte *scriptBoard = &_variables[0x19];
byte startX, startY, endX, endY;
- debugScript(1, true, "CELL MOVE var[0x%02X]", depth);
+ debugC(1, kDebugScript, "CELL MOVE var[0x%02X]", depth);
if (!_staufsMove)
_staufsMove = new CellGame;
@@ -1471,7 +1489,7 @@ void Script::o_cellmove() {
void Script::o_returnscript() {
uint8 val = readScript8bits();
- debugScript(1, true, "RETURNSCRIPT @0x%02X", val);
+ debugC(1, kDebugScript, "RETURNSCRIPT @0x%02X", val);
// Are we returning from a sub-script?
if (!_savedCode) {
@@ -1504,7 +1522,7 @@ void Script::o_returnscript() {
void Script::o_sethotspotright() {
uint16 address = readScript16bits();
- debugScript(1, true, "SETHOTSPOTRIGHT @0x%04X", address);
+ debugC(1, kDebugScript, "SETHOTSPOTRIGHT @0x%04X", address);
_hotspotRightAction = address;
}
@@ -1512,13 +1530,13 @@ void Script::o_sethotspotright() {
void Script::o_sethotspotleft() {
uint16 address = readScript16bits();
- debugScript(1, true, "SETHOTSPOTLEFT @0x%04X", address);
+ debugC(1, kDebugScript, "SETHOTSPOTLEFT @0x%04X", address);
_hotspotLeftAction = address;
}
void Script::o_getcd() {
- debugScript(1, true, "GETCD");
+ debugC(1, kDebugScript, "GETCD");
// By default set it to no CD available
int8 cd = -1;
@@ -1545,7 +1563,7 @@ void Script::o_getcd() {
void Script::o_playcd() {
uint8 val = readScript8bits();
- debugScript(1, true, "PLAYCD %d", val);
+ debugC(1, kDebugScript, "PLAYCD %d", val);
if (val == 2) {
// TODO: Play the alternative logo
@@ -1557,7 +1575,7 @@ void Script::o_playcd() {
void Script::o_musicdelay() {
uint16 delay = readScript16bits();
- debugScript(1, true, "MUSICDELAY %d", delay);
+ debugC(1, kDebugScript, "MUSICDELAY %d", delay);
_vm->_musicPlayer->setBackgroundDelay(delay);
}
@@ -1569,7 +1587,7 @@ void Script::o_hotspot_outrect() {
uint16 bottom = readScript16bits();
uint16 address = readScript16bits();
- debugScript(1, true, "HOTSPOT-OUTRECT(%d,%d,%d,%d) @0x%04X (TODO)", left, top, right, bottom, address);
+ debugC(1, kDebugScript, "HOTSPOT-OUTRECT(%d,%d,%d,%d) @0x%04X (TODO)", left, top, right, bottom, address);
// Test if the current mouse position is outside the specified rectangle
Common::Rect rect(left, top, right, bottom);
@@ -1587,25 +1605,25 @@ void Script::o_stub56() {
uint8 val2 = readScript8bits();
uint8 val3 = readScript8bits();
- debugScript(1, true, "STUB56: 0x%08X 0x%02X 0x%02X", val1, val2, val3);
+ debugC(1, kDebugScript, "STUB56: 0x%08X 0x%02X 0x%02X", val1, val2, val3);
}
void Script::o_stub59() {
uint16 val1 = readScript8or16bits();
uint8 val2 = readScript8bits();
- debugScript(1, true, "STUB59: 0x%04X 0x%02X", val1, val2);
+ debugC(1, kDebugScript, "STUB59: 0x%04X 0x%02X", val1, val2);
}
void Script::o2_playsong() {
uint32 fileref = readScript32bits();
- debugScript(1, true, "PlaySong(0x%08X): Play xmidi file", fileref);
+ debugC(1, kDebugScript, "PlaySong(0x%08X): Play xmidi file", fileref);
_vm->_musicPlayer->playSong(fileref);
}
void Script::o2_setbackgroundsong() {
uint32 fileref = readScript32bits();
- debugScript(1, true, "SetBackgroundSong(0x%08X)", fileref);
+ debugC(1, kDebugScript, "SetBackgroundSong(0x%08X)", fileref);
_vm->_musicPlayer->setBackgroundSong(fileref);
}
@@ -1614,8 +1632,8 @@ void Script::o2_videofromref() {
// Show the debug information just when starting the playback
if (fileref != _videoRef) {
- debugScript(1, true, "VIDEOFROMREF(0x%08X) (Not fully imp): Play video file from ref", fileref);
- debugC(5, kGroovieDebugVideo | kGroovieDebugAll, "Playing video 0x%08X via 0x09", fileref);
+ debugC(1, kDebugScript, "VIDEOFROMREF(0x%08X) (Not fully imp): Play video file from ref", fileref);
+ debugC(5, kDebugVideo, "Playing video 0x%08X via 0x09", fileref);
}
// Play the video
@@ -1630,8 +1648,8 @@ void Script::o2_vdxtransition() {
// Show the debug information just when starting the playback
if (fileref != _videoRef) {
- debugScript(1, true, "VDX transition fileref = 0x%08X", fileref);
- debugC(1, kGroovieDebugVideo | kGroovieDebugAll, "Playing video 0x%08X with transition", fileref);
+ debugC(1, kDebugScript, "VDX transition fileref = 0x%08X", fileref);
+ debugC(1, kDebugVideo, "Playing video 0x%08X with transition", fileref);
}
// Set bit 1
@@ -1652,30 +1670,30 @@ void Script::o2_vdxtransition() {
void Script::o2_copyscreentobg() {
uint16 val = readScript16bits();
- debugScript(1, true, "CopyScreenToBG3: 0x%04X", val);
+ debugC(1, kDebugScript, "CopyScreenToBG3: 0x%04X", val);
error("Unimplemented Opcode 0x4F");
}
void Script::o2_copybgtoscreen() {
uint16 val = readScript16bits();
- debugScript(1, true, "CopyBG3ToScreen: 0x%04X", val);
+ debugC(1, kDebugScript, "CopyBG3ToScreen: 0x%04X", val);
error("Unimplemented Opcode 0x50");
}
void Script::o2_setvideoskip() {
_videoSkipAddress = readScript16bits();
- debugScript(1, true, "SetVideoSkip (0x%04X)", _videoSkipAddress);
+ debugC(1, kDebugScript, "SetVideoSkip (0x%04X)", _videoSkipAddress);
}
void Script::o2_stub52() {
uint8 arg = readScript8bits();
- debugScript(1, true, "STUB52 (0x%02X)", arg);
+ debugC(1, kDebugScript, "STUB52 (0x%02X)", arg);
}
void Script::o2_setscriptend() {
uint16 arg = readScript16bits();
- debugScript(1, true, "SetScriptEnd (0x%04X)", arg);
+ debugC(1, kDebugScript, "SetScriptEnd (0x%04X)", arg);
}
Script::OpcodeFunc Script::_opcodesT7G[NUM_OPCODES] = {
diff --git a/engines/groovie/script.h b/engines/groovie/script.h
index 8cd790af5e..35e52593de 100644
--- a/engines/groovie/script.h
+++ b/engines/groovie/script.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/groovie/stuffit.cpp b/engines/groovie/stuffit.cpp
index 60a57a0129..bbfcd3da82 100644
--- a/engines/groovie/stuffit.cpp
+++ b/engines/groovie/stuffit.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/groovie/stuffit.h b/engines/groovie/stuffit.h
index 44f593dbea..9b2bbd3543 100644
--- a/engines/groovie/stuffit.h
+++ b/engines/groovie/stuffit.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/groovie/vdx.cpp b/engines/groovie/vdx.cpp
index 59d966a22f..09c2e0d3ea 100644
--- a/engines/groovie/vdx.cpp
+++ b/engines/groovie/vdx.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -56,8 +56,7 @@ void VDXPlayer::setOrigin(int16 x, int16 y) {
}
uint16 VDXPlayer::loadInternal() {
- if (DebugMan.isDebugChannelEnabled(kGroovieDebugVideo) ||
- DebugMan.isDebugChannelEnabled(kGroovieDebugAll)) {
+ if (DebugMan.isDebugChannelEnabled(kDebugVideo)) {
int8 i;
debugN(1, "Groovie::VDX: New VDX: bitflags are ");
for (i = 15; i >= 0; i--) {
@@ -106,24 +105,24 @@ uint16 VDXPlayer::loadInternal() {
//_flagUpdateStill = _flagNine || _flagSix;
// Begin reading the file
- debugC(1, kGroovieDebugVideo | kGroovieDebugAll, "Groovie::VDX: Playing video");
+ debugC(1, kDebugVideo, "Groovie::VDX: Playing video");
if (_file->readUint16LE() != VDX_IDENT) {
error("Groovie::VDX: This does not appear to be a 7th guest VDX file");
return 0;
} else {
- debugC(5, kGroovieDebugVideo | kGroovieDebugAll, "Groovie::VDX: VDX file identified correctly");
+ debugC(5, kDebugVideo, "Groovie::VDX: VDX file identified correctly");
}
uint16 tmp;
// Skip unknown data: 6 bytes, ref Martine
tmp = _file->readUint16LE();
- debugC(2, kGroovieDebugVideo | kGroovieDebugUnknown | kGroovieDebugAll, "Groovie::VDX: Martine1 = 0x%04X", tmp);
+ debugC(2, kDebugVideo | kDebugUnknown, "Groovie::VDX: Martine1 = 0x%04X", tmp);
tmp = _file->readUint16LE();
- debugC(2, kGroovieDebugVideo | kGroovieDebugUnknown | kGroovieDebugAll, "Groovie::VDX: Martine2 = 0x%04X", tmp);
+ debugC(2, kDebugVideo | kDebugUnknown, "Groovie::VDX: Martine2 = 0x%04X", tmp);
tmp = _file->readUint16LE();
- debugC(2, kGroovieDebugVideo | kGroovieDebugUnknown | kGroovieDebugAll, "Groovie::VDX: Martine3 (FPS?) = %d", tmp);
+ debugC(2, kDebugVideo | kDebugUnknown, "Groovie::VDX: Martine3 (FPS?) = %d", tmp);
return tmp;
}
@@ -144,7 +143,7 @@ bool VDXPlayer::playFrameInternal() {
if (_file->eos())
break;
- debugC(5, kGroovieDebugVideo | kGroovieDebugUnknown | kGroovieDebugAll, "Groovie::VDX: Edward = 0x%04X", tmp);
+ debugC(5, kDebugVideo | kDebugUnknown, "Groovie::VDX: Edward = 0x%04X", tmp);
// Read the chunk data and decompress if needed
if (compSize)
@@ -159,18 +158,18 @@ bool VDXPlayer::playFrameInternal() {
// Use the current chunk
switch (currRes) {
case 0x00:
- debugC(6, kGroovieDebugVideo | kGroovieDebugAll, "Groovie::VDX: Replay frame");
+ debugC(6, kDebugVideo, "Groovie::VDX: Replay frame");
break;
case 0x20:
- debugC(5, kGroovieDebugVideo | kGroovieDebugAll, "Groovie::VDX: Still frame");
+ debugC(5, kDebugVideo, "Groovie::VDX: Still frame");
getStill(vdxData);
break;
case 0x25:
- debugC(5, kGroovieDebugVideo | kGroovieDebugAll, "Groovie::VDX: Animation frame");
+ debugC(5, kDebugVideo, "Groovie::VDX: Animation frame");
getDelta(vdxData);
break;
case 0x80:
- debugC(5, kGroovieDebugVideo | kGroovieDebugAll, "Groovie::VDX: Sound resource");
+ debugC(5, kDebugVideo, "Groovie::VDX: Sound resource");
chunkSound(vdxData);
break;
default:
@@ -182,7 +181,7 @@ bool VDXPlayer::playFrameInternal() {
// Wait until the current frame can be shown
- if (!DebugMan.isDebugChannelEnabled(kGroovieDebugFast)) {
+ if (!DebugMan.isDebugChannelEnabled(kDebugFast)) {
waitFrame();
}
// TODO: Move it to a better place
@@ -344,13 +343,13 @@ void VDXPlayer::getDelta(Common::ReadStream *in) {
void VDXPlayer::getStill(Common::ReadStream *in) {
uint16 numXTiles = in->readUint16LE();
- debugC(5, kGroovieDebugVideo | kGroovieDebugAll, "Groovie::VDX: numXTiles=%d", numXTiles);
+ debugC(5, kDebugVideo, "Groovie::VDX: numXTiles=%d", numXTiles);
uint16 numYTiles = in->readUint16LE();
- debugC(5, kGroovieDebugVideo | kGroovieDebugAll, "Groovie::VDX: numYTiles=%d", numYTiles);
+ debugC(5, kDebugVideo, "Groovie::VDX: numYTiles=%d", numYTiles);
// It's skipped in the original:
uint16 colorDepth = in->readUint16LE();
- debugC(5, kGroovieDebugVideo | kGroovieDebugAll, "Groovie::VDX: colorDepth=%d", colorDepth);
+ debugC(5, kDebugVideo, "Groovie::VDX: colorDepth=%d", colorDepth);
uint16 imageWidth = TILE_SIZE * numXTiles;
@@ -423,7 +422,7 @@ void VDXPlayer::getStill(Common::ReadStream *in) {
*/
} else {
// Skip the remaining data
- debugC(10, kGroovieDebugVideo | kGroovieDebugAll, "Groovie::VDX: Skipping still frame");
+ debugC(10, kDebugVideo, "Groovie::VDX: Skipping still frame");
while (!in->eos()) {
in->readByte();
}
@@ -538,7 +537,7 @@ void VDXPlayer::chunkSound(Common::ReadStream *in) {
byte *data = (byte *)malloc(60000);
int chunksize = in->read(data, 60000);
- if (!DebugMan.isDebugChannelEnabled(kGroovieDebugFast)) {
+ if (!DebugMan.isDebugChannelEnabled(kDebugFast)) {
_audioStream->queueBuffer(data, chunksize, DisposeAfterUse::YES, Audio::FLAG_UNSIGNED);
}
}
@@ -563,7 +562,7 @@ void VDXPlayer::setPalette(uint8 *palette) {
if (_flagSkipPalette)
return;
- debugC(7, kGroovieDebugVideo | kGroovieDebugAll, "Groovie::VDX: Setting palette");
+ debugC(7, kDebugVideo, "Groovie::VDX: Setting palette");
_syst->getPaletteManager()->setPalette(palette, 0, 256);
}
diff --git a/engines/groovie/vdx.h b/engines/groovie/vdx.h
index a9bfaa1eb4..328e6e4da5 100644
--- a/engines/groovie/vdx.h
+++ b/engines/groovie/vdx.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/hopkins/anim.cpp b/engines/hopkins/anim.cpp
index 2ec9cec009..8f2a18f741 100644
--- a/engines/hopkins/anim.cpp
+++ b/engines/hopkins/anim.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -668,7 +668,6 @@ void AnimationManager::playSequence(const Common::String &file, uint32 rate1, ui
*/
void AnimationManager::playSequence2(const Common::String &file, uint32 rate1, uint32 rate2, uint32 rate3, bool skipSeqFl) {
byte *screenP;
- int frameNumber;
Common::File f;
if (_vm->shouldQuit())
@@ -708,7 +707,7 @@ void AnimationManager::playSequence2(const Common::String &file, uint32 rate1, u
if (!_vm->_events->_escKeyFl) {
_vm->_events->_rateCounter = 0;
- frameNumber = 0;
+ int frameNumber = 0;
while (!_vm->shouldQuit()) {
_vm->_soundMan->playAnimSound(frameNumber++);
diff --git a/engines/hopkins/anim.h b/engines/hopkins/anim.h
index bf9b55aaae..a273245097 100644
--- a/engines/hopkins/anim.h
+++ b/engines/hopkins/anim.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/hopkins/computer.cpp b/engines/hopkins/computer.cpp
index c09d748b97..84d5c631c7 100644
--- a/engines/hopkins/computer.cpp
+++ b/engines/hopkins/computer.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -38,10 +38,9 @@ namespace Hopkins {
ComputerManager::ComputerManager(HopkinsEngine *vm) {
_vm = vm;
- for (int i = 0; i < 50; i++) {
- _menuText[i]._actvFl = false;
+ for (int i = 0; i < ARRAYSIZE(_menuText); i++) {
_menuText[i]._lineSize = 0;
- memset(_menuText[i]._line, 0, 90);
+ memset(_menuText[i]._line, 0, ARRAYSIZE(_menuText[0]._line));
}
Common::fill(&_inputBuf[0], &_inputBuf[200], '\0');
_breakoutSpr = NULL;
@@ -346,47 +345,60 @@ static const char _spanishText[] =
* Load Menu data
*/
void ComputerManager::loadMenu() {
+ debug(9, "ComputerManager::loadMenu()");
char *ptr;
if (_vm->_fileIO->fileExists("COMPUTAN.TXT")) {
ptr = (char *)_vm->_fileIO->loadFile("COMPUTAN.TXT");
- } else if (_vm->_globals->_language == LANG_FR) {
- ptr = (char *)_vm->_globals->allocMemory(sizeof(_frenchText));
- strcpy(ptr, _frenchText);
- } else if (_vm->_globals->_language == LANG_SP) {
- ptr = (char *)_vm->_globals->allocMemory(sizeof(_spanishText));
- strcpy(ptr, _spanishText);
} else {
- ptr = (char *)_vm->_globals->allocMemory(sizeof(_englishText));
- strcpy(ptr, _englishText);
+ switch (_vm->_globals->_language) {
+ case LANG_FR:
+ ptr = (char *)_vm->_globals->allocMemory(sizeof(_frenchText));
+ Common::strlcpy(ptr, _frenchText, sizeof(_frenchText));
+ break;
+ case LANG_SP:
+ ptr = (char *)_vm->_globals->allocMemory(sizeof(_spanishText));
+ Common::strlcpy(ptr, _spanishText, sizeof(_spanishText));
+ break;
+ default:
+ ptr = (char *)_vm->_globals->allocMemory(sizeof(_englishText));
+ Common::strlcpy(ptr, _englishText, sizeof(_englishText));
+ break;
+ }
}
char *tmpPtr = ptr;
int lineNum = 0;
- int strPos;
- bool loopCond = false;
- do {
- if (tmpPtr[0] == '%') {
- if (tmpPtr[1] == '%') {
- loopCond = true;
- break;
- }
- _menuText[lineNum]._actvFl = 1;
- strPos = 0;
- while (strPos <= 89) {
+ const char lineSep = tmpPtr[0];
+
+ while (tmpPtr[0] != '\0' && lineNum < ARRAYSIZE(_menuText)) {
+ if (tmpPtr[0] == '%' && tmpPtr[1] == '%') {
+ // End of file marker found - Break out of parse loop
+ break;
+ }
+
+ if (tmpPtr[0] == lineSep) {
+ int strPos = 0;
+ while (strPos < ARRAYSIZE(_menuText[0]._line)) {
char curChar = tmpPtr[strPos + 2];
- if (curChar == '%' || curChar == 10)
+ if (curChar == '\0' || curChar == lineSep || curChar == 0x0a) // Line Feed
break;
_menuText[lineNum]._line[strPos++] = curChar;
}
- if (strPos <= 89) {
+
+ if (strPos < ARRAYSIZE(_menuText[0]._line)) {
_menuText[lineNum]._line[strPos] = 0;
_menuText[lineNum]._lineSize = strPos - 1;
}
- ++lineNum;
+
+ if (strPos != 0) {
+ debug(9, "_menuText[%d]._line (size: %d): \"%s\"", lineNum, _menuText[lineNum]._lineSize, _menuText[lineNum]._line);
+ ++lineNum;
+ }
}
++tmpPtr;
- } while (!loopCond);
+ }
+
_vm->_globals->freeMemory((byte *)ptr);
}
@@ -479,12 +491,17 @@ void ComputerManager::readText(int idx) {
_vm->_events->_escKeyFl = false;
Common::String filename;
- if (_vm->_globals->_language == LANG_EN)
+ switch (_vm->_globals->_language) {
+ case LANG_EN:
filename = "THOPKAN.TXT";
- else if (_vm->_globals->_language == LANG_FR)
+ break;
+ case LANG_FR:
filename = "THOPK.TXT";
- else if (_vm->_globals->_language == LANG_SP)
+ break;
+ case LANG_SP:
filename = "THOPKES.TXT";
+ break;
+ }
byte *ptr = _vm->_fileIO->loadFile(filename);
uint16 fileSize = _vm->_fileIO->fileSize(filename);
@@ -664,15 +681,12 @@ void ComputerManager::displayBricks() {
_breakoutSpeed = 1;
int16 *level = _breakoutLevel;
- int cellLeft;
- int cellTop;
- int cellType;
for (int levelIdx = 0; ; levelIdx += 6) {
- cellLeft = (int16)FROM_LE_16(level[levelIdx]);
+ int cellLeft = (int16)FROM_LE_16(level[levelIdx]);
if (cellLeft == -1)
break;
- cellTop = FROM_LE_16(level[levelIdx + 1]);
- cellType = FROM_LE_16(level[levelIdx + 4]);
+ int cellTop = FROM_LE_16(level[levelIdx + 1]);
+ int cellType = FROM_LE_16(level[levelIdx + 4]);
if (cellType <= 6)
++_breakoutBrickNbr;
@@ -822,7 +836,6 @@ int ComputerManager::displayHiscores() {
_vm->_graphicsMan->setColorPercentage(254, 0, 0, 0);
int yp;
- int xp;
// Loop for displaying the scores
for (int scoreIndex = 0; scoreIndex <= 5; scoreIndex++) {
yp = 19 * scoreIndex;
@@ -842,7 +855,7 @@ int ComputerManager::displayHiscores() {
int buttonIndex = 0;
do {
_vm->_events->refreshEvents();
- xp = _vm->_events->getMouseX();
+ int xp = _vm->_events->getMouseX();
yp = _vm->_events->getMouseY();
if (_vm->_events->getMouseButton() == 1 && ABS(xp - 79) <= 33 && ABS(yp - 396) <= 13)
diff --git a/engines/hopkins/computer.h b/engines/hopkins/computer.h
index 1771bba7d6..ba50dca4cf 100644
--- a/engines/hopkins/computer.h
+++ b/engines/hopkins/computer.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -31,22 +31,22 @@ namespace Hopkins {
class HopkinsEngine;
-struct MenuItem {
- bool _actvFl;
- int _lineSize;
- char _line[90];
-};
-
-struct ScoreItem {
- Common::String _name;
- Common::String _score;
-};
-
enum ComputerEnum { COMPUTER_HOPKINS = 1, COMPUTER_SAMANTHA = 2, COMPUTER_PUBLIC = 3 };
class ComputerManager {
private:
HopkinsEngine *_vm;
+
+ struct MenuItem {
+ int _lineSize;
+ char _line[90];
+ };
+
+ struct ScoreItem {
+ Common::String _name;
+ Common::String _score;
+ };
+
MenuItem _menuText[50];
char _inputBuf[200];
ScoreItem _score[6];
@@ -84,14 +84,14 @@ private:
void displayLives();
void displayBricks();
void displayGamesSubMenu();
- int displayHiscores();
+ int displayHiscores();
void displayHiscoreLine(const byte *objectData, int x, int y, int curChar);
void displayMessage(int xp, int yp, int textIdx);
void displayScore();
void displayScoreChar(int charPos, int charDisp);
void getScoreName();
void playBreakout();
- int moveBall();
+ int moveBall();
void saveScore();
void checkBallCollisions();
diff --git a/engines/hopkins/configure.engine b/engines/hopkins/configure.engine
new file mode 100644
index 0000000000..c38ecd4cd2
--- /dev/null
+++ b/engines/hopkins/configure.engine
@@ -0,0 +1,3 @@
+# This file is included from the main "configure" script
+# add_engine [name] [desc] [build-by-default] [subengines] [base games] [deps]
+add_engine hopkins "Hopkins FBI" yes "" "" "16bit"
diff --git a/engines/hopkins/debugger.cpp b/engines/hopkins/debugger.cpp
index f111eb50d3..3dcfdfea7b 100644
--- a/engines/hopkins/debugger.cpp
+++ b/engines/hopkins/debugger.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope 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.
@@ -30,18 +30,18 @@ namespace Hopkins {
Debugger::Debugger(HopkinsEngine *vm) : GUI::Debugger() {
_vm = vm;
- DCmd_Register("continue", WRAP_METHOD(Debugger, Cmd_Exit));
- DCmd_Register("rects", WRAP_METHOD(Debugger, cmd_DirtyRects));
- DCmd_Register("teleport", WRAP_METHOD(Debugger, cmd_Teleport));
- DCmd_Register("show_room", WRAP_METHOD(Debugger, cmd_ShowCurrentRoom));
- DCmd_Register("zones", WRAP_METHOD(Debugger, cmd_Zones));
- DCmd_Register("lines", WRAP_METHOD(Debugger, cmd_Lines));
+ registerCmd("continue", WRAP_METHOD(Debugger, cmdExit));
+ registerCmd("rects", WRAP_METHOD(Debugger, cmd_DirtyRects));
+ registerCmd("teleport", WRAP_METHOD(Debugger, cmd_Teleport));
+ registerCmd("show_room", WRAP_METHOD(Debugger, cmd_ShowCurrentRoom));
+ registerCmd("zones", WRAP_METHOD(Debugger, cmd_Zones));
+ registerCmd("lines", WRAP_METHOD(Debugger, cmd_Lines));
}
// Turns dirty rects on or off
bool Debugger::cmd_DirtyRects(int argc, const char **argv) {
if (argc != 2) {
- DebugPrintf("%s: [on | off]\n", argv[0]);
+ debugPrintf("%s: [on | off]\n", argv[0]);
return true;
} else {
_vm->_graphicsMan->_showDirtyRects = !strcmp(argv[1], "on");
@@ -52,7 +52,7 @@ bool Debugger::cmd_DirtyRects(int argc, const char **argv) {
// Change room number
bool Debugger::cmd_Teleport(int argc, const char **argv) {
if (argc != 2) {
- DebugPrintf("%s: [Room number]\n", argv[0]);
+ debugPrintf("%s: [Room number]\n", argv[0]);
return true;
} else {
_vm->_globals->_exitId = atoi(argv[1]);
@@ -62,13 +62,13 @@ bool Debugger::cmd_Teleport(int argc, const char **argv) {
// Display room number
bool Debugger::cmd_ShowCurrentRoom(int argc, const char **argv) {
- DebugPrintf("Current room: %d\n", _vm->_globals->_curRoomNum);
+ debugPrintf("Current room: %d\n", _vm->_globals->_curRoomNum);
return true;
}
bool Debugger::cmd_Zones(int argc, const char **argv) {
if (argc != 2) {
- DebugPrintf("%s: [on | off]\n", argv[0]);
+ debugPrintf("%s: [on | off]\n", argv[0]);
return true;
} else {
_vm->_graphicsMan->_showZones = !strcmp(argv[1], "on");
@@ -78,7 +78,7 @@ if (argc != 2) {
bool Debugger::cmd_Lines(int argc, const char **argv) {
if (argc != 2) {
- DebugPrintf("%s: [on | off]\n", argv[0]);
+ debugPrintf("%s: [on | off]\n", argv[0]);
return true;
} else {
_vm->_graphicsMan->_showLines = !strcmp(argv[1], "on");
diff --git a/engines/hopkins/debugger.h b/engines/hopkins/debugger.h
index 746c54a675..94a66af15b 100644
--- a/engines/hopkins/debugger.h
+++ b/engines/hopkins/debugger.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope 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.
diff --git a/engines/hopkins/detection.cpp b/engines/hopkins/detection.cpp
index c617a5aacf..a25b19e496 100644
--- a/engines/hopkins/detection.cpp
+++ b/engines/hopkins/detection.cpp
@@ -8,17 +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.
*
- *
*/
#include "hopkins/hopkins.h"
@@ -29,6 +28,7 @@
#include "common/memstream.h"
#include "engines/advancedDetector.h"
#include "common/system.h"
+#include "common/translation.h"
#include "graphics/colormasks.h"
#include "graphics/surface.h"
@@ -69,6 +69,30 @@ static const PlainGameDescriptor hopkinsGames[] = {
#include "hopkins/detection_tables.h"
+static const ADExtraGuiOptionsMap optionsList[] = {
+ {
+ GAMEOPTION_GORE_DEFAULT_OFF,
+ {
+ _s("Gore Mode"),
+ _s("Enable Gore Mode when available"),
+ "enable_gore",
+ false
+ }
+ },
+
+ {
+ GAMEOPTION_GORE_DEFAULT_ON,
+ {
+ _s("Gore Mode"),
+ _s("Enable Gore Mode when available"),
+ "enable_gore",
+ true
+ }
+ },
+
+ AD_EXTRA_GUI_OPTIONS_TERMINATOR
+};
+
const static char *directoryGlobs[] = {
"voice",
"link",
@@ -77,7 +101,7 @@ const static char *directoryGlobs[] = {
class HopkinsMetaEngine : public AdvancedMetaEngine {
public:
- HopkinsMetaEngine() : AdvancedMetaEngine(Hopkins::gameDescriptions, sizeof(Hopkins::HopkinsGameDescription), hopkinsGames) {
+ HopkinsMetaEngine() : AdvancedMetaEngine(Hopkins::gameDescriptions, sizeof(Hopkins::HopkinsGameDescription), hopkinsGames, optionsList) {
_maxScanDepth = 3;
_directoryGlobs = directoryGlobs;
}
@@ -190,7 +214,7 @@ SaveStateDescriptor HopkinsMetaEngine::querySaveMetaInfos(const char *target, in
#if PLUGIN_ENABLED_DYNAMIC(HOPKINS)
-REGISTER_PLUGIN_DYNAMIC(HOPKINS, PLUGIN_TYPE_ENGINE, HopkinsMetaEngine);
+ REGISTER_PLUGIN_DYNAMIC(HOPKINS, PLUGIN_TYPE_ENGINE, HopkinsMetaEngine);
#else
-REGISTER_PLUGIN_STATIC(HOPKINS, PLUGIN_TYPE_ENGINE, HopkinsMetaEngine);
+ REGISTER_PLUGIN_STATIC(HOPKINS, PLUGIN_TYPE_ENGINE, HopkinsMetaEngine);
#endif
diff --git a/engines/hopkins/detection_tables.h b/engines/hopkins/detection_tables.h
index c3ff563f6f..aeb92d7411 100644
--- a/engines/hopkins/detection_tables.h
+++ b/engines/hopkins/detection_tables.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -22,6 +22,9 @@
namespace Hopkins {
+#define GAMEOPTION_GORE_DEFAULT_ON GUIO_GAMEOPTIONS1
+#define GAMEOPTION_GORE_DEFAULT_OFF GUIO_GAMEOPTIONS2
+
static const HopkinsGameDescription gameDescriptions[] = {
{
// Hopkins FBI Linux Demo UK 1.00 and 1.02
@@ -35,7 +38,7 @@ static const HopkinsGameDescription gameDescriptions[] = {
Common::EN_ANY,
Common::kPlatformLinux,
ADGF_DEMO,
- GUIO1(GUIO_NONE)
+ GUIO1(GAMEOPTION_GORE_DEFAULT_ON)
},
},
{
@@ -51,7 +54,7 @@ static const HopkinsGameDescription gameDescriptions[] = {
Common::EN_ANY,
Common::kPlatformOS2,
ADGF_NO_FLAGS,
- GUIO1(GUIO_NONE)
+ GUIO1(GAMEOPTION_GORE_DEFAULT_ON)
},
},
{
@@ -66,7 +69,7 @@ static const HopkinsGameDescription gameDescriptions[] = {
Common::EN_ANY,
Common::kPlatformBeOS,
ADGF_NO_FLAGS,
- GUIO1(GUIO_NONE)
+ GUIO1(GAMEOPTION_GORE_DEFAULT_ON)
},
},
{
@@ -81,7 +84,7 @@ static const HopkinsGameDescription gameDescriptions[] = {
Common::ES_ESP,
Common::kPlatformWindows,
ADGF_NO_FLAGS,
- GUIO1(GUIO_NONE)
+ GUIO1(GAMEOPTION_GORE_DEFAULT_ON)
},
},
{
@@ -96,7 +99,7 @@ static const HopkinsGameDescription gameDescriptions[] = {
Common::EN_ANY,
Common::kPlatformWindows,
ADGF_NO_FLAGS,
- GUIO1(GUIO_NONE)
+ GUIO1(GAMEOPTION_GORE_DEFAULT_OFF)
},
},
{
@@ -111,7 +114,7 @@ static const HopkinsGameDescription gameDescriptions[] = {
Common::RU_RUS,
Common::kPlatformWindows,
ADGF_NO_FLAGS,
- GUIO1(GUIO_NONE)
+ GUIO1(GAMEOPTION_GORE_DEFAULT_ON)
},
},
{
@@ -126,7 +129,7 @@ static const HopkinsGameDescription gameDescriptions[] = {
Common::FR_FRA,
Common::kPlatformLinux,
ADGF_NO_FLAGS,
- GUIO1(GUIO_NONE)
+ GUIO1(GAMEOPTION_GORE_DEFAULT_ON)
},
},
{
@@ -141,7 +144,7 @@ static const HopkinsGameDescription gameDescriptions[] = {
Common::EN_ANY,
Common::kPlatformLinux,
ADGF_NO_FLAGS,
- GUIO1(GUIO_NONE)
+ GUIO1(GAMEOPTION_GORE_DEFAULT_ON)
},
},
{
@@ -156,11 +159,27 @@ static const HopkinsGameDescription gameDescriptions[] = {
Common::FR_FRA,
Common::kPlatformWindows,
ADGF_NO_FLAGS,
- GUIO1(GUIO_NONE)
+ GUIO1(GAMEOPTION_GORE_DEFAULT_ON)
},
},
{
+ // Hopkins FBI Win95 Polish, provided by Paput in bug #6511
+ {
+ "hopkins",
+ 0,
+ {
+ {"RES_VAN.RES", 0, "f2fec5172e4a7a9d35cb2a5f948ef6a9", 39400865},
+ AD_LISTEND
+ },
+ Common::PL_POL,
+ Common::kPlatformWindows,
+ ADGF_NO_FLAGS,
+ GUIO1(GAMEOPTION_GORE_DEFAULT_OFF)
+ },
+ },
+
+ {
// Hopkins FBI Win95 Demo, provided by Strangerke
// CHECKME: No voice! a second file is required though... Also, it has multi-language support
{
@@ -173,7 +192,7 @@ static const HopkinsGameDescription gameDescriptions[] = {
Common::EN_ANY,
Common::kPlatformWindows,
ADGF_DEMO,
- GUIO1(GUIO_NONE)
+ GUIO1(GAMEOPTION_GORE_DEFAULT_ON)
},
},
{
@@ -188,7 +207,7 @@ static const HopkinsGameDescription gameDescriptions[] = {
Common::PL_POL,
Common::kPlatformWindows,
ADGF_DEMO,
- GUIO1(GUIO_NONE)
+ GUIO1(GAMEOPTION_GORE_DEFAULT_OFF)
},
},
{ AD_TABLE_END_MARKER }
diff --git a/engines/hopkins/dialogs.cpp b/engines/hopkins/dialogs.cpp
index 3b8fedf0ee..fc613f892d 100644
--- a/engines/hopkins/dialogs.cpp
+++ b/engines/hopkins/dialogs.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -84,12 +84,17 @@ void DialogsManager::showOptionsDialog() {
if (_vm->getPlatform() == Common::kPlatformOS2 || _vm->getPlatform() == Common::kPlatformBeOS)
filename = "OPTION.SPR";
else {
- if (_vm->_globals->_language == LANG_FR)
+ switch (_vm->_globals->_language) {
+ case LANG_FR:
filename = "OPTIFR.SPR";
- else if (_vm->_globals->_language == LANG_EN)
+ break;
+ case LANG_EN:
filename = "OPTIAN.SPR";
- else if (_vm->_globals->_language == LANG_SP)
+ break;
+ case LANG_SP:
filename = "OPTIES.SPR";
+ break;
+ }
}
_vm->_globals->_optionDialogSpr = _vm->_fileIO->loadFile(filename);
diff --git a/engines/hopkins/dialogs.h b/engines/hopkins/dialogs.h
index 246b80cd3e..822cf376dd 100644
--- a/engines/hopkins/dialogs.h
+++ b/engines/hopkins/dialogs.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/hopkins/events.cpp b/engines/hopkins/events.cpp
index 51c66c4f92..1ee495a111 100644
--- a/engines/hopkins/events.cpp
+++ b/engines/hopkins/events.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -271,7 +271,7 @@ void EventsManager::pollEvents() {
_mouseButton = 0;
return;
default:
- break;
+ break;
}
}
diff --git a/engines/hopkins/events.h b/engines/hopkins/events.h
index f4dedce1c5..fde0106689 100644
--- a/engines/hopkins/events.h
+++ b/engines/hopkins/events.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/hopkins/files.cpp b/engines/hopkins/files.cpp
index 2390ebbdf8..6620f2878c 100644
--- a/engines/hopkins/files.cpp
+++ b/engines/hopkins/files.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -25,6 +25,7 @@
#include "hopkins/hopkins.h"
#include "hopkins/globals.h"
+#include "common/config-manager.h"
#include "common/system.h"
#include "common/debug.h"
#include "common/file.h"
@@ -50,12 +51,13 @@ byte *FileManager::loadFile(const Common::String &file) {
// Allocate space for the file contents
size_t filesize = f.size();
- byte *data = _vm->_globals->allocMemory(filesize);
+ byte *data = _vm->_globals->allocMemory(filesize+1);
if (!data)
error("Error allocating space for file being loaded - %s", file.c_str());
readStream(f, data, filesize);
f.close();
+ data[filesize] = '\0';
return data;
}
@@ -68,20 +70,11 @@ int FileManager::readStream(Common::ReadStream &stream, void *buf, size_t nbytes
}
/**
- * Initialize censorship based on blood.dat file
+ * The original censorship was based on blood.dat file.
+ * It's now using the config manager and a per-engine GUI option.
*/
void FileManager::initCensorship() {
- _vm->_globals->_censorshipFl = false;
-
- // If file doesn't exist, fallback to uncensored
- if (fileExists("BLOOD.DAT")) {
- char *data = (char *)loadFile("BLOOD.DAT");
-
- if ((data[6] == 'u' && data[7] == 'k') || (data[6] == 'U' && data[7] == 'K'))
- _vm->_globals->_censorshipFl = true;
-
- _vm->_globals->freeMemory((byte *)data);
- }
+ _vm->_globals->_censorshipFl = ConfMan.getBool("enable_gore");
}
/**
diff --git a/engines/hopkins/files.h b/engines/hopkins/files.h
index 5e5eaa755c..0c117ccc10 100644
--- a/engines/hopkins/files.h
+++ b/engines/hopkins/files.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/hopkins/font.cpp b/engines/hopkins/font.cpp
index ac0eee2866..7d57f564a9 100644
--- a/engines/hopkins/font.cpp
+++ b/engines/hopkins/font.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/hopkins/font.h b/engines/hopkins/font.h
index 93e807ea4b..fe423edfe7 100644
--- a/engines/hopkins/font.h
+++ b/engines/hopkins/font.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/hopkins/globals.cpp b/engines/hopkins/globals.cpp
index a9a0a81f08..1f192748cd 100644
--- a/engines/hopkins/globals.cpp
+++ b/engines/hopkins/globals.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -148,7 +148,7 @@ void Globals::setConfig() {
_language = LANG_SP;
break;
default:
- warning("Unknown language in internal language mapping");
+ error("Hopkins - SetConfig(): Unknown language in internal language mapping");
break;
}
// End of CHECKME
diff --git a/engines/hopkins/globals.h b/engines/hopkins/globals.h
index 94512c3d26..2e17389a45 100644
--- a/engines/hopkins/globals.h
+++ b/engines/hopkins/globals.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/hopkins/graphics.cpp b/engines/hopkins/graphics.cpp
index de9f043763..7227c3e833 100644
--- a/engines/hopkins/graphics.cpp
+++ b/engines/hopkins/graphics.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -28,7 +28,7 @@
#include "common/system.h"
#include "graphics/palette.h"
-#include "graphics/decoders/pcx.h"
+#include "image/pcx.h"
#include "common/file.h"
#include "common/rect.h"
#include "engines/util.h"
@@ -301,7 +301,7 @@ void GraphicsManager::fillSurface(byte *surface, byte *col, int size) {
void GraphicsManager::loadPCX640(byte *surface, const Common::String &file, byte *palette, bool typeFlag) {
Common::File f;
- Graphics::PCXDecoder pcxDecoder;
+ Image::PCXDecoder pcxDecoder;
// Clear the passed surface
memset(surface, 0, SCREEN_WIDTH * 2 * SCREEN_HEIGHT);
@@ -439,9 +439,7 @@ void GraphicsManager::display8BitRect(const byte *surface, int xs, int ys, int w
}
void GraphicsManager::displayScaled8BitRect(const byte *surface, int xp, int yp, int width, int height, int destX, int destY) {
- int xCtr;
const byte *palette;
- int savedXCount;
byte *loopDestP;
const byte *loopSrcP;
int yCtr;
@@ -454,10 +452,10 @@ void GraphicsManager::displayScaled8BitRect(const byte *surface, int xp, int yp,
do {
yCtr = yCount;
- xCtr = xCount;
+ int xCtr = xCount;
loopSrcP = srcP;
loopDestP = destP;
- savedXCount = xCount;
+ int savedXCount = xCount;
palette = _palettePixels;
do {
@@ -1359,7 +1357,7 @@ void GraphicsManager::drawCompressedSprite(byte *surface, const byte *srcData, i
_posYClipped = 0;
_clipX1 = 0;
_clipY1 = 0;
- if ((xp300 <= _minX) || (yp300 <= _minY) || (xp300 >= _maxX + 300) || (yp300 >= _maxY + 300))
+ if ((xp300 <= _minX) || (yp300 <= _minY) || (xp300 >= _maxX + 300) || (yp300 >= _maxY + 300))
return;
// Clipped values are greater or equal to zero, thanks to the previous test
@@ -1781,7 +1779,7 @@ void GraphicsManager::initScreen(const Common::String &file, int mode, bool init
do {
int dataVal1 = _vm->_script->handleOpcode(ptr + 20 * dataOffset);
- if (_vm->shouldQuit())
+ if (dataVal1 == -1 || _vm->shouldQuit())
return;
if (dataVal1 == 2)
diff --git a/engines/hopkins/graphics.h b/engines/hopkins/graphics.h
index 8767f5ec4d..1ea6b89f2a 100644
--- a/engines/hopkins/graphics.h
+++ b/engines/hopkins/graphics.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/hopkins/hopkins.cpp b/engines/hopkins/hopkins.cpp
index 96131f2968..9940391f64 100644
--- a/engines/hopkins/hopkins.cpp
+++ b/engines/hopkins/hopkins.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -166,7 +166,7 @@ bool HopkinsEngine::runWin95Demo() {
_globals->_characterType = CHARACTER_HOPKINS;
_objectsMan->_mapCarPosX = _objectsMan->_mapCarPosY = 0;
- memset(_globals->_saveData, 0, 2000);
+ memset(_globals->_saveData, 0, sizeof(Savegame));
_globals->_exitId = 0;
if (getLanguage() != Common::PL_POL)
@@ -210,12 +210,17 @@ bool HopkinsEngine::runWin95Demo() {
if (getPlatform() == Common::kPlatformOS2 || getPlatform() == Common::kPlatformBeOS)
_graphicsMan->loadImage("fond");
else {
- if (_globals->_language == LANG_FR)
+ switch (_globals->_language) {
+ case LANG_FR:
_graphicsMan->loadImage("fondfr");
- else if (_globals->_language == LANG_EN)
+ break;
+ case LANG_EN:
_graphicsMan->loadImage("fondan");
- else if (_globals->_language == LANG_SP)
+ break;
+ case LANG_SP:
_graphicsMan->loadImage("fondes");
+ break;
+ }
}
_graphicsMan->fadeInLong();
_events->delay(500);
@@ -227,7 +232,7 @@ bool HopkinsEngine::runWin95Demo() {
if (!_globals->_censorshipFl)
_animMan->playAnim("BANQUE.ANM", "BANKUK.ANM", 200, 28, 200);
else
- _animMan->playAnim("BANQUE.ANM", "BANKUK.ANM", 200, 28, 200);
+ _animMan->playAnim("BANKUK.ANM", "BANQUE.ANM", 200, 28, 200);
_soundMan->_specialSoundNum = 0;
_soundMan->removeSample(1);
_soundMan->removeSample(2);
@@ -465,7 +470,7 @@ bool HopkinsEngine::runLinuxDemo() {
_globals->_characterSpriteBuf = _fileIO->loadFile("PERSO.SPR");
_globals->_characterType = CHARACTER_HOPKINS;
_objectsMan->_mapCarPosX = _objectsMan->_mapCarPosY = 0;
- memset(_globals->_saveData, 0, 2000);
+ memset(_globals->_saveData, 0, sizeof(Savegame));
_globals->_exitId = 0;
if (_startGameSlot != -1)
@@ -521,12 +526,17 @@ bool HopkinsEngine::runLinuxDemo() {
if (getPlatform() == Common::kPlatformOS2 || getPlatform() == Common::kPlatformBeOS)
_graphicsMan->loadImage("fond");
else {
- if (_globals->_language == LANG_FR)
+ switch (_globals->_language) {
+ case LANG_FR:
_graphicsMan->loadImage("fondfr");
- else if (_globals->_language == LANG_EN)
+ break;
+ case LANG_EN:
_graphicsMan->loadImage("fondan");
- else if (_globals->_language == LANG_SP)
+ break;
+ case LANG_SP:
_graphicsMan->loadImage("fondes");
+ break;
+ }
}
_graphicsMan->fadeInLong();
_events->delay(500);
@@ -826,7 +836,7 @@ bool HopkinsEngine::runFull() {
_globals->_characterSpriteBuf = _fileIO->loadFile("PERSO.SPR");
_globals->_characterType = CHARACTER_HOPKINS;
_objectsMan->_mapCarPosX = _objectsMan->_mapCarPosY = 0;
- memset(_globals->_saveData, 0, 2000);
+ memset(_globals->_saveData, 0, sizeof(Savegame));
_globals->_exitId = 0;
@@ -867,12 +877,17 @@ bool HopkinsEngine::runFull() {
if (getPlatform() == Common::kPlatformOS2 || getPlatform() == Common::kPlatformBeOS)
_graphicsMan->loadImage("fond");
else {
- if (_globals->_language == LANG_FR)
+ switch (_globals->_language) {
+ case LANG_FR:
_graphicsMan->loadImage("fondfr");
- else if (_globals->_language == LANG_EN)
+ break;
+ case LANG_EN:
_graphicsMan->loadImage("fondan");
- else if (_globals->_language == LANG_SP)
+ break;
+ case LANG_SP:
_graphicsMan->loadImage("fondes");
+ break;
+ }
}
_graphicsMan->fadeInLong();
_events->delay(500);
@@ -1908,7 +1923,6 @@ void HopkinsEngine::bombExplosion() {
}
void HopkinsEngine::restoreSystem() {
- quitGame();
_events->refreshEvents();
}
@@ -2846,7 +2860,6 @@ void HopkinsEngine::syncSoundSettings() {
}
bool HopkinsEngine::displayAdultDisclaimer() {
- int xp, yp;
int buttonIndex;
_graphicsMan->_minX = 0;
@@ -2866,8 +2879,8 @@ bool HopkinsEngine::displayAdultDisclaimer() {
_events->_mouseSpriteId = 0;
do {
- xp = _events->getMouseX();
- yp = _events->getMouseY();
+ int xp = _events->getMouseX();
+ int yp = _events->getMouseY();
buttonIndex = 0;
if (xp >= 37 && xp <= 169 && yp >= 406 && yp <= 445)
diff --git a/engines/hopkins/hopkins.h b/engines/hopkins/hopkins.h
index d8c30e5004..b782d103a8 100644
--- a/engines/hopkins/hopkins.h
+++ b/engines/hopkins/hopkins.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -48,6 +48,7 @@
#include "common/util.h"
#include "engines/engine.h"
#include "graphics/surface.h"
+#include "gui/debugger.h"
/**
* This is the namespace of the Hopkins engine.
@@ -59,10 +60,6 @@
*/
namespace Hopkins {
-#define DEBUG_BASIC 1
-#define DEBUG_INTERMEDIATE 2
-#define DEBUG_DETAILED 3
-
#define SCREEN_WIDTH 640
#define SCREEN_HEIGHT 480
@@ -136,6 +133,8 @@ protected:
virtual Common::Error run();
virtual bool hasFeature(EngineFeature f) const;
+ GUI::Debugger *getDebugger() { return _debug; }
+
public:
AnimationManager *_animMan;
ComputerManager *_computer;
diff --git a/engines/hopkins/lines.cpp b/engines/hopkins/lines.cpp
index aa708fdfb2..709f17a8b2 100644
--- a/engines/hopkins/lines.cpp
+++ b/engines/hopkins/lines.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -548,8 +548,6 @@ int LinesManager::avoidObstacleOnSegment(int lineIdx, int lineDataIdx, int route
bool LinesManager::MIRACLE(int fromX, int fromY, int lineIdx, int destLineIdx, int routeIdx) {
debugC(5, kDebugPath, "MIRACLE(%d, %d, %d, %d, %d)", fromX, fromY, lineIdx, destLineIdx, routeIdx);
- int newLinesDataIdx = 0;
- int newLinesIdx = 0;
int lineIdxLeft = 0;
int lineDataIdxLeft = 0;
int lineIdxRight = 0;
@@ -700,6 +698,8 @@ bool LinesManager::MIRACLE(int fromX, int fromY, int lineIdx, int destLineIdx, i
newDir = DIR_LEFT;
}
+ int newLinesDataIdx = 0;
+ int newLinesIdx = 0;
switch(newDir) {
case DIR_UP:
newLinesIdx = linesIdxUp;
@@ -1552,7 +1552,6 @@ void LinesManager::useRoute2(int idx, int curRouteIdx) {
int LinesManager::characterRoute(int fromX, int fromY, int destX, int destY, int startLineIdx, int endLineIdx, int routeIdx) {
debugC(5, kDebugPath, "characterRoute(%d, %d, %d, %d, %d, %d, %d)", fromX, fromY, destX, destY, startLineIdx, endLineIdx, routeIdx);
int collDataIdxRoute2 = 0;
- bool colResult = false;
int curX = fromX;
int curY = fromY;
@@ -1603,7 +1602,6 @@ int LinesManager::characterRoute(int fromX, int fromY, int destX, int destY, int
int collLineIdxRoute1 = -1;
int collLineIdxRoute2 = -1;
- int distX, distY;
int repeatFlag = 0;
int collDataIdxRoute0 = 0;
int collDataIdxRoute1 = 0;
@@ -1615,8 +1613,8 @@ int LinesManager::characterRoute(int fromX, int fromY, int destX, int destY, int
useRoute0(idxRoute0, curRouteIdx);
return 1;
}
- distX = abs(curX - destX) + 1;
- distY = abs(curY - destY) + 1;
+ int distX = abs(curX - destX) + 1;
+ int distY = abs(curY - destY) + 1;
int maxDist;
if (distX > distY)
maxDist = distX;
@@ -1912,7 +1910,7 @@ int LinesManager::characterRoute(int fromX, int fromY, int destX, int destY, int
posXRoute2 = _newPosX;
posYRoute2 = _newPosY;
- colResult = checkCollisionLine(_newPosX, _newPosY, &collDataIdxRoute2, &collLineIdxRoute2, 0, _lastLine);
+ bool colResult = checkCollisionLine(_newPosX, _newPosY, &collDataIdxRoute2, &collLineIdxRoute2, 0, _lastLine);
if (colResult && collLineIdxRoute2 <= _lastLine)
break;
}
@@ -2456,13 +2454,12 @@ bool LinesManager::PLAN_TEST(int paramX, int paramY, int superRouteIdx, int para
int LinesManager::testLine(int paramX, int paramY, int *testValue, int *foundLineIdx, int *foundDataIdx) {
debugC(5, kDebugPath, "testLine(%d, %d, testValue, foundLineIdx, foundDataIdx)", paramX, paramY);
int16 *lineData;
- int lineDataEndIdx;
int collLineIdx;
int collDataIdx;
for (int idx = _lastLine + 1; idx < _linesNumb + 1; idx++) {
lineData = _lineItem[idx]._lineData;
- lineDataEndIdx = _lineItem[idx]._lineDataEndIdx;
+ int lineDataEndIdx = _lineItem[idx]._lineDataEndIdx;
if (!lineData)
continue;
diff --git a/engines/hopkins/lines.h b/engines/hopkins/lines.h
index b32dc6e2a5..5e9ef8a7b0 100644
--- a/engines/hopkins/lines.h
+++ b/engines/hopkins/lines.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/hopkins/menu.cpp b/engines/hopkins/menu.cpp
index 455f4ad8d4..169b29a560 100644
--- a/engines/hopkins/menu.cpp
+++ b/engines/hopkins/menu.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -69,23 +69,37 @@ int MenuManager::menu() {
if (_vm->getPlatform() == Common::kPlatformOS2 || _vm->getPlatform() == Common::kPlatformBeOS)
_vm->_graphicsMan->loadImage("MENU");
- else if (_vm->_globals->_language == LANG_EN)
- _vm->_graphicsMan->loadImage("MENUAN");
- else if (_vm->_globals->_language == LANG_FR)
- _vm->_graphicsMan->loadImage("MENUFR");
- else if (_vm->_globals->_language == LANG_SP)
- _vm->_graphicsMan->loadImage("MENUES");
+ else {
+ switch (_vm->_globals->_language) {
+ case LANG_EN:
+ _vm->_graphicsMan->loadImage("MENUAN");
+ break;
+ case LANG_FR:
+ _vm->_graphicsMan->loadImage("MENUFR");
+ break;
+ case LANG_SP:
+ _vm->_graphicsMan->loadImage("MENUES");
+ break;
+ }
+ }
_vm->_graphicsMan->fadeInLong();
if (_vm->getPlatform() == Common::kPlatformOS2 || _vm->getPlatform() == Common::kPlatformBeOS)
spriteData = _vm->_objectsMan->loadSprite("MENU.SPR");
- else if (_vm->_globals->_language == LANG_EN)
- spriteData = _vm->_objectsMan->loadSprite("MENUAN.SPR");
- else if (_vm->_globals->_language == LANG_FR)
- spriteData = _vm->_objectsMan->loadSprite("MENUFR.SPR");
- else if (_vm->_globals->_language == LANG_SP)
- spriteData = _vm->_objectsMan->loadSprite("MENUES.SPR");
+ else {
+ switch (_vm->_globals->_language) {
+ case LANG_EN:
+ spriteData = _vm->_objectsMan->loadSprite("MENUAN.SPR");
+ break;
+ case LANG_FR:
+ spriteData = _vm->_objectsMan->loadSprite("MENUFR.SPR");
+ break;
+ case LANG_SP:
+ spriteData = _vm->_objectsMan->loadSprite("MENUES.SPR");
+ break;
+ }
+ }
_vm->_events->mouseOn();
_vm->_events->changeMouseCursor(0);
diff --git a/engines/hopkins/menu.h b/engines/hopkins/menu.h
index e926c29dbd..4f78e73685 100644
--- a/engines/hopkins/menu.h
+++ b/engines/hopkins/menu.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/hopkins/objects.cpp b/engines/hopkins/objects.cpp
index f2f547557f..b54b21bbc9 100644
--- a/engines/hopkins/objects.cpp
+++ b/engines/hopkins/objects.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -376,7 +376,6 @@ void ObjectsManager::addObject(int objIndex) {
void ObjectsManager::displaySprite() {
int clipX;
int clipY;
- bool loopCondFl;
uint16 arr[50];
// Handle copying any background areas that text are going to be drawn on
@@ -441,6 +440,7 @@ void ObjectsManager::displaySprite() {
for (int i = 1; i <= 48; i++)
arr[i] = i;
+ bool loopCondFl;
do {
loopCondFl = false;
for (int sortIdx = 1; sortIdx < _sortedDisplayCount; sortIdx++) {
@@ -2629,7 +2629,7 @@ void ObjectsManager::loadObjectIniFile() {
for (;;) {
int opcodeType = _vm->_script->handleOpcode(data + 20 * lastOpcodeResult);
- if (_vm->shouldQuit())
+ if (opcodeType == -1 || _vm->shouldQuit())
return;
if (opcodeType == 2)
@@ -3613,12 +3613,10 @@ void ObjectsManager::showSpecialActionAnimation(const byte *spriteData, const Co
realSpeed = speed / 3;
int spriteIndex = 0;
- bool completeTokenFl;
- char nextChar;
for (int idx = 0; ; idx++) {
- completeTokenFl = false;
- nextChar = animString[idx];
+ bool completeTokenFl = false;
+ char nextChar = animString[idx];
if (nextChar == ',') {
spriteIndex = atoi(tmpStr.c_str());
tmpStr = "";
diff --git a/engines/hopkins/objects.h b/engines/hopkins/objects.h
index 5f1f5b1f59..dc56765431 100644
--- a/engines/hopkins/objects.h
+++ b/engines/hopkins/objects.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/hopkins/saveload.cpp b/engines/hopkins/saveload.cpp
index b0dea7e6d1..05c7fb8119 100644
--- a/engines/hopkins/saveload.cpp
+++ b/engines/hopkins/saveload.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/hopkins/saveload.h b/engines/hopkins/saveload.h
index 5b77c11f12..7b4ec307f5 100644
--- a/engines/hopkins/saveload.h
+++ b/engines/hopkins/saveload.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/hopkins/script.cpp b/engines/hopkins/script.cpp
index 7e150624b8..b0d8749c7f 100644
--- a/engines/hopkins/script.cpp
+++ b/engines/hopkins/script.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -148,12 +148,18 @@ int ScriptManager::handleOpcode(const byte *dataP) {
_vm->_soundMan->mixVoice(635, 4, displayedTxtFl);
} else {
int textPosX = READ_LE_INT16(dataP + 9);
- if (_vm->_globals->_language == LANG_FR && !_vm->_soundMan->_textOffFl)
- _vm->_fontMan->initTextBuffers(9, mesgId, "OBJET1.TXT", 2 * textPosX, 60, 6, dataP[7], 253);
- else if (_vm->_globals->_language == LANG_EN && !_vm->_soundMan->_textOffFl)
- _vm->_fontMan->initTextBuffers(9, mesgId, "OBJETAN.TXT", 2 * textPosX, 60, 6, dataP[7], 253);
- else if (_vm->_globals->_language == LANG_SP && !_vm->_soundMan->_textOffFl) {
- _vm->_fontMan->initTextBuffers(9, mesgId, "OBJETES.TXT", 2 * textPosX, 60, 6, dataP[7], 253);
+ if (!_vm->_soundMan->_textOffFl) {
+ switch (_vm->_globals->_language) {
+ case LANG_FR:
+ _vm->_fontMan->initTextBuffers(9, mesgId, "OBJET1.TXT", 2 * textPosX, 60, 6, dataP[7], 253);
+ break;
+ case LANG_EN:
+ _vm->_fontMan->initTextBuffers(9, mesgId, "OBJETAN.TXT", 2 * textPosX, 60, 6, dataP[7], 253);
+ break;
+ case LANG_SP:
+ _vm->_fontMan->initTextBuffers(9, mesgId, "OBJETES.TXT", 2 * textPosX, 60, 6, dataP[7], 253);
+ break;
+ }
}
bool displayedTxtFl = false;
diff --git a/engines/hopkins/script.h b/engines/hopkins/script.h
index 2a22e18ccb..1f8e45dc9a 100644
--- a/engines/hopkins/script.h
+++ b/engines/hopkins/script.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/hopkins/sound.cpp b/engines/hopkins/sound.cpp
index bf816c08a4..773c714899 100644
--- a/engines/hopkins/sound.cpp
+++ b/engines/hopkins/sound.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -200,14 +200,6 @@ SoundManager::SoundManager(HopkinsEngine *vm) {
_currentSoundIndex = 0;
_oldSoundNumber = 0;
_modPlayingFl = false;
-
- for (int i = 0; i < VOICE_COUNT; ++i)
- Common::fill((byte *)&_voice[i], (byte *)&_voice[i] + sizeof(VoiceItem), 0);
- for (int i = 0; i < SWAV_COUNT; ++i)
- Common::fill((byte *)&_sWav[i], (byte *)&_sWav[i] + sizeof(SwavItem), 0);
- for (int i = 0; i < SOUND_COUNT; ++i)
- Common::fill((byte *)&_sound[i], (byte *)&_sound[i] + sizeof(SoundItem), 0);
- Common::fill((byte *)&_music, (byte *)&_music + sizeof(MusicItem), 0);
}
SoundManager::~SoundManager() {
@@ -520,12 +512,19 @@ bool SoundManager::mixVoice(int voiceId, int voiceMode, bool dispTxtFl) {
if (_vm->getPlatform() == Common::kPlatformOS2 || _vm->getPlatform() == Common::kPlatformBeOS)
filename = "ENG_VOI.RES";
// Win95 and Linux versions uses another set of names
- else if (_vm->_globals->_language == LANG_FR)
- filename = "RES_VFR.RES";
- else if (_vm->_globals->_language == LANG_EN)
- filename = "RES_VAN.RES";
- else if (_vm->_globals->_language == LANG_SP)
- filename = "RES_VES.RES";
+ else {
+ switch (_vm->_globals->_language) {
+ case LANG_FR:
+ filename = "RES_VFR.RES";
+ break;
+ case LANG_EN:
+ filename = "RES_VAN.RES";
+ break;
+ case LANG_SP:
+ filename = "RES_VES.RES";
+ break;
+ }
+ }
catPos = _vm->_fileIO->_catalogPos;
catLen = _vm->_fileIO->_catalogSize;
@@ -535,12 +534,19 @@ bool SoundManager::mixVoice(int voiceId, int voiceMode, bool dispTxtFl) {
if (_vm->getPlatform() == Common::kPlatformOS2 || _vm->getPlatform() == Common::kPlatformBeOS)
filename = "ENG_VOI.RES";
// Win95 and Linux versions uses another set of names
- else if (_vm->_globals->_language == LANG_FR)
- filename = "RES_VFR.RES";
- else if (_vm->_globals->_language == LANG_EN)
- filename = "RES_VAN.RES";
- else if (_vm->_globals->_language == LANG_SP)
- filename = "RES_VES.RES";
+ else {
+ switch (_vm->_globals->_language) {
+ case LANG_FR:
+ filename = "RES_VFR.RES";
+ break;
+ case LANG_EN:
+ filename = "RES_VAN.RES";
+ break;
+ case LANG_SP:
+ filename = "RES_VES.RES";
+ break;
+ }
+ }
catPos = _vm->_fileIO->_catalogPos;
catLen = _vm->_fileIO->_catalogSize;
@@ -550,12 +556,19 @@ bool SoundManager::mixVoice(int voiceId, int voiceMode, bool dispTxtFl) {
if (_vm->getPlatform() == Common::kPlatformOS2 || _vm->getPlatform() == Common::kPlatformBeOS)
filename = "ENG_VOI.RES";
// Win95 and Linux versions uses another set of names
- else if (_vm->_globals->_language == LANG_FR)
- filename = "RES_VFR.RES";
- else if (_vm->_globals->_language == LANG_EN)
- filename = "RES_VAN.RES";
- else if (_vm->_globals->_language == LANG_SP)
- filename = "RES_VES.RES";
+ else {
+ switch (_vm->_globals->_language) {
+ case LANG_FR:
+ filename = "RES_VFR.RES";
+ break;
+ case LANG_EN:
+ filename = "RES_VAN.RES";
+ break;
+ case LANG_SP:
+ filename = "RES_VES.RES";
+ break;
+ }
+ }
catPos = _vm->_fileIO->_catalogPos;
catLen = _vm->_fileIO->_catalogSize;
diff --git a/engines/hopkins/sound.h b/engines/hopkins/sound.h
index f1d047ae8b..97cdcdc1dd 100644
--- a/engines/hopkins/sound.h
+++ b/engines/hopkins/sound.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -33,12 +33,16 @@ namespace Hopkins {
class VoiceItem {
public:
+ VoiceItem() : _status(false), _wavIndex(0) {}
+
bool _status;
int _wavIndex;
};
class SwavItem {
public:
+ SwavItem() : _active(false), _audioStream(NULL), _freeSampleFl(false) {}
+
bool _active;
Audio::RewindableAudioStream *_audioStream;
Audio::SoundHandle _soundHandle;
@@ -47,11 +51,15 @@ public:
class MusicItem {
public:
+ MusicItem() : _active(false) {}
+
bool _active;
};
class SoundItem {
public:
+ SoundItem() : _active(false) {}
+
bool _active;
};
diff --git a/engines/hopkins/talk.cpp b/engines/hopkins/talk.cpp
index 736ec9865c..df7b26c82c 100644
--- a/engines/hopkins/talk.cpp
+++ b/engines/hopkins/talk.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -68,12 +68,17 @@ void TalkManager::startAnimatedCharacterDialogue(const Common::String &filename)
getStringFromBuffer(40, spriteFilename, (const char *)_characterBuffer);
getStringFromBuffer(0, _questionsFilename, (const char *)_characterBuffer);
getStringFromBuffer(20, _answersFilename, (const char *)_characterBuffer);
- if (_vm->_globals->_language == LANG_FR) {
+
+ switch (_vm->_globals->_language) {
+ case LANG_FR:
_answersFilename = _questionsFilename = "RUE.TXT";
- } else if (_vm->_globals->_language == LANG_EN) {
+ break;
+ case LANG_EN:
_answersFilename = _questionsFilename = "RUEAN.TXT";
- } else if (_vm->_globals->_language == LANG_SP) {
+ break;
+ case LANG_SP:
_answersFilename = _questionsFilename = "RUEES.TXT";
+ break;
}
_dialogueMesgId1 = READ_LE_INT16((uint16 *)_characterBuffer + 40);
_paletteBufferIdx = 20 * READ_LE_INT16((uint16 *)_characterBuffer + 42) + 110;
@@ -261,7 +266,7 @@ int TalkManager::dialogQuestion(bool animatedFl) {
int retVal = -1;
bool loopCond = false;
- do {
+ do {
int mousePosY = _vm->_events->getMouseY();
if (sentence1PosY < mousePosY && mousePosY < (sentence2PosY - 1)) {
_vm->_fontMan->setOptimalColor(6, 7, 8, 5);
@@ -608,7 +613,6 @@ void TalkManager::displayBobDialogAnim(int idx) {
_vm->_objectsMan->_bob[idx]._flipFl = false;
_vm->_objectsMan->_bob[idx]._animData = _vm->_animMan->_animBqe[idx]._data;
_vm->_objectsMan->_bob[idx]._bobMode = 10;
- bqeData = _characterSprite;
_vm->_objectsMan->_bob[idx]._spriteData = _characterSprite;
_vm->_objectsMan->_bob[idx]._bobModeChange = newMode;
_vm->_objectsMan->_bob[idx]._modeChangeCtr = -1;
@@ -820,7 +824,7 @@ void TalkManager::handleAnswer(int zone, int verb) {
int lastOpcodeResult = 1;
do {
int opcodeType = _vm->_script->handleOpcode(ptr + 20 * lastOpcodeResult);
- if (_vm->shouldQuit())
+ if (opcodeType == -1 || _vm->shouldQuit())
return;
if (opcodeType == 2)
diff --git a/engines/hopkins/talk.h b/engines/hopkins/talk.h
index 678f52090a..49ee92d3b9 100644
--- a/engines/hopkins/talk.h
+++ b/engines/hopkins/talk.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/hugo/configure.engine b/engines/hugo/configure.engine
new file mode 100644
index 0000000000..9ab5c54e1e
--- /dev/null
+++ b/engines/hugo/configure.engine
@@ -0,0 +1,3 @@
+# This file is included from the main "configure" script
+# add_engine [name] [desc] [build-by-default] [subengines] [base games] [deps]
+add_engine hugo "Hugo Trilogy" yes
diff --git a/engines/hugo/console.cpp b/engines/hugo/console.cpp
index 414c86e1d4..d02c42658f 100644
--- a/engines/hugo/console.cpp
+++ b/engines/hugo/console.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -30,12 +30,12 @@
namespace Hugo {
HugoConsole::HugoConsole(HugoEngine *vm) : GUI::Debugger(), _vm(vm) {
- DCmd_Register("listscreens", WRAP_METHOD(HugoConsole, Cmd_listScreens));
- DCmd_Register("listobjects", WRAP_METHOD(HugoConsole, Cmd_listObjects));
- DCmd_Register("getobject", WRAP_METHOD(HugoConsole, Cmd_getObject));
- DCmd_Register("getallobjects", WRAP_METHOD(HugoConsole, Cmd_getAllObjects));
- DCmd_Register("gotoscreen", WRAP_METHOD(HugoConsole, Cmd_gotoScreen));
- DCmd_Register("Boundaries", WRAP_METHOD(HugoConsole, Cmd_boundaries));
+ registerCmd("listscreens", WRAP_METHOD(HugoConsole, Cmd_listScreens));
+ registerCmd("listobjects", WRAP_METHOD(HugoConsole, Cmd_listObjects));
+ registerCmd("getobject", WRAP_METHOD(HugoConsole, Cmd_getObject));
+ registerCmd("getallobjects", WRAP_METHOD(HugoConsole, Cmd_getAllObjects));
+ registerCmd("gotoscreen", WRAP_METHOD(HugoConsole, Cmd_gotoScreen));
+ registerCmd("Boundaries", WRAP_METHOD(HugoConsole, Cmd_boundaries));
}
HugoConsole::~HugoConsole() {
@@ -62,7 +62,7 @@ static int strToInt(const char *s) {
*/
bool HugoConsole::Cmd_gotoScreen(int argc, const char **argv) {
if ((argc != 2) || (strToInt(argv[1]) > _vm->_numScreens)){
- DebugPrintf("Usage: %s <screen number>\n", argv[0]);
+ debugPrintf("Usage: %s <screen number>\n", argv[0]);
return true;
}
@@ -75,13 +75,13 @@ bool HugoConsole::Cmd_gotoScreen(int argc, const char **argv) {
*/
bool HugoConsole::Cmd_listScreens(int argc, const char **argv) {
if (argc != 1) {
- DebugPrintf("Usage: %s\n", argv[0]);
+ debugPrintf("Usage: %s\n", argv[0]);
return true;
}
- DebugPrintf("Available screens for this game are:\n");
+ debugPrintf("Available screens for this game are:\n");
for (int i = 0; i < _vm->_numScreens; i++)
- DebugPrintf("%2d - %s\n", i, _vm->_text->getScreenNames(i));
+ debugPrintf("%2d - %s\n", i, _vm->_text->getScreenNames(i));
return true;
}
@@ -90,14 +90,14 @@ bool HugoConsole::Cmd_listScreens(int argc, const char **argv) {
*/
bool HugoConsole::Cmd_listObjects(int argc, const char **argv) {
if (argc != 1) {
- DebugPrintf("Usage: %s\n", argv[0]);
+ debugPrintf("Usage: %s\n", argv[0]);
return true;
}
- DebugPrintf("Available objects for this game are:\n");
+ debugPrintf("Available objects for this game are:\n");
for (int i = 0; i < _vm->_object->_numObj; i++) {
if (_vm->_object->_objects[i]._genericCmd & TAKE)
- DebugPrintf("%2d - %s\n", i, _vm->_text->getNoun(_vm->_object->_objects[i]._nounIndex, 2));
+ debugPrintf("%2d - %s\n", i, _vm->_text->getNoun(_vm->_object->_objects[i]._nounIndex, 2));
}
return true;
}
@@ -107,14 +107,14 @@ bool HugoConsole::Cmd_listObjects(int argc, const char **argv) {
*/
bool HugoConsole::Cmd_getObject(int argc, const char **argv) {
if ((argc != 2) || (strToInt(argv[1]) > _vm->_object->_numObj)) {
- DebugPrintf("Usage: %s <object number>\n", argv[0]);
+ debugPrintf("Usage: %s <object number>\n", argv[0]);
return true;
}
if (_vm->_object->_objects[strToInt(argv[1])]._genericCmd & TAKE)
_vm->_parser->takeObject(&_vm->_object->_objects[strToInt(argv[1])]);
else
- DebugPrintf("Object not available\n");
+ debugPrintf("Object not available\n");
return true;
}
@@ -124,7 +124,7 @@ bool HugoConsole::Cmd_getObject(int argc, const char **argv) {
*/
bool HugoConsole::Cmd_getAllObjects(int argc, const char **argv) {
if (argc != 1) {
- DebugPrintf("Usage: %s\n", argv[0]);
+ debugPrintf("Usage: %s\n", argv[0]);
return true;
}
@@ -141,7 +141,7 @@ bool HugoConsole::Cmd_getAllObjects(int argc, const char **argv) {
*/
bool HugoConsole::Cmd_boundaries(int argc, const char **argv) {
if (argc != 1) {
- DebugPrintf("Usage: %s\n", argv[0]);
+ debugPrintf("Usage: %s\n", argv[0]);
return true;
}
diff --git a/engines/hugo/console.h b/engines/hugo/console.h
index 16317e83d5..a35f2e3c0a 100644
--- a/engines/hugo/console.h
+++ b/engines/hugo/console.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/hugo/detection.cpp b/engines/hugo/detection.cpp
index ede4ab2279..3907215746 100644
--- a/engines/hugo/detection.cpp
+++ b/engines/hugo/detection.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -184,13 +184,12 @@ SaveStateList HugoMetaEngine::listSaves(const char *target) const {
SaveStateList saveList;
char slot[3];
- int slotNum = 0;
for (Common::StringArray::const_iterator filename = filenames.begin(); filename != filenames.end(); ++filename) {
slot[0] = filename->c_str()[filename->size() - 6];
slot[1] = filename->c_str()[filename->size() - 5];
slot[2] = '\0';
// Obtain the last 2 digits of the filename (without extension), since they correspond to the save slot
- slotNum = atoi(slot);
+ int slotNum = atoi(slot);
if (slotNum >= 0 && slotNum <= getMaximumSaveSlot()) {
Common::InSaveFile *file = saveFileMan->openForLoading(*filename);
if (file) {
@@ -276,9 +275,9 @@ void HugoMetaEngine::removeSaveState(const char *target, int slot) const {
} // End of namespace Hugo
#if PLUGIN_ENABLED_DYNAMIC(HUGO)
-REGISTER_PLUGIN_DYNAMIC(HUGO, PLUGIN_TYPE_ENGINE, Hugo::HugoMetaEngine);
+ REGISTER_PLUGIN_DYNAMIC(HUGO, PLUGIN_TYPE_ENGINE, Hugo::HugoMetaEngine);
#else
-REGISTER_PLUGIN_STATIC(HUGO, PLUGIN_TYPE_ENGINE, Hugo::HugoMetaEngine);
+ REGISTER_PLUGIN_STATIC(HUGO, PLUGIN_TYPE_ENGINE, Hugo::HugoMetaEngine);
#endif
namespace Hugo {
diff --git a/engines/hugo/dialogs.cpp b/engines/hugo/dialogs.cpp
index 5dcee3ae94..8b145b78d8 100644
--- a/engines/hugo/dialogs.cpp
+++ b/engines/hugo/dialogs.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -21,9 +21,9 @@
*/
#include "common/substream.h"
-#include "graphics/decoders/bmp.h"
#include "gui/gui-manager.h"
#include "gui/ThemeEval.h"
+#include "image/bmp.h"
#include "hugo/hugo.h"
#include "hugo/display.h"
@@ -34,8 +34,10 @@
namespace Hugo {
-TopMenu::TopMenu(HugoEngine *vm) : Dialog(0, 0, kMenuWidth, kMenuHeight), _arrayBmp(0), _arraySize(0),
- _vm(vm) {
+TopMenu::TopMenu(HugoEngine *vm) : Dialog(0, 0, kMenuWidth, kMenuHeight), _vm(vm) {
+ _arrayBmp = nullptr;
+ _arraySize = 0;
+
init();
}
@@ -105,7 +107,6 @@ void TopMenu::reflowLayout() {
x += kButtonWidth + kButtonPad;
_inventButton->resize(x * scale, y * scale, kButtonWidth * scale, kButtonHeight * scale);
- x += kButtonWidth + kButtonPad;
// Set the graphics to the 'on' buttons, except for the variable ones
_whatButton->setGfx(_arrayBmp[4 * kMenuWhat + scale - 1]);
@@ -129,7 +130,7 @@ void TopMenu::loadBmpArr(Common::SeekableReadStream &in) {
uint32 filPos = in.pos();
Common::SeekableSubReadStream stream(&in, filPos, filPos + bmpSize);
- Graphics::BitmapDecoder bitmapDecoder;
+ Image::BitmapDecoder bitmapDecoder;
if (!bitmapDecoder.loadStream(stream))
error("TopMenu::loadBmpArr(): Could not load bitmap");
@@ -140,12 +141,10 @@ void TopMenu::loadBmpArr(Common::SeekableReadStream &in) {
_arrayBmp[i * 2] = bitmapSrc->convertTo(g_system->getOverlayFormat());
_arrayBmp[i * 2 + 1] = new Graphics::Surface();
_arrayBmp[i * 2 + 1]->create(_arrayBmp[i * 2]->w * 2, _arrayBmp[i * 2]->h * 2, g_system->getOverlayFormat());
- byte *src = (byte *)_arrayBmp[i * 2]->getPixels();
- byte *dst = (byte *)_arrayBmp[i * 2 + 1]->getPixels();
for (int j = 0; j < _arrayBmp[i * 2]->h; j++) {
- src = (byte *)_arrayBmp[i * 2]->getBasePtr(0, j);
- dst = (byte *)_arrayBmp[i * 2 + 1]->getBasePtr(0, j * 2);
+ byte *src = (byte *)_arrayBmp[i * 2]->getBasePtr(0, j);
+ byte *dst = (byte *)_arrayBmp[i * 2 + 1]->getBasePtr(0, j * 2);
for (int k = _arrayBmp[i * 2]->w; k > 0; k--) {
for (int m = _arrayBmp[i * 2]->format.bytesPerPixel; m > 0; m--) {
*dst++ = *src++;
diff --git a/engines/hugo/dialogs.h b/engines/hugo/dialogs.h
index 114bcf56a9..55bb8f9fd0 100644
--- a/engines/hugo/dialogs.h
+++ b/engines/hugo/dialogs.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/hugo/display.cpp b/engines/hugo/display.cpp
index fbe39b3a0c..a8a22fb4b9 100644
--- a/engines/hugo/display.cpp
+++ b/engines/hugo/display.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -75,13 +75,13 @@ static const byte stdMouseCursor[] = {
Screen::Screen(HugoEngine *vm) : _vm(vm) {
- _mainPalette = 0;
- _curPalette = 0;
+ _mainPalette = nullptr;
+ _curPalette = nullptr;
_dlAddIndex = 0;
_dlRestoreIndex = 0;
for (int i = 0; i < kNumFonts; i++) {
- _arrayFont[i] = 0;
+ _arrayFont[i] = nullptr;
fontLoadedFl[i] = false;
}
for (int i = 0; i < kBlitListSize; i++) {
@@ -100,6 +100,8 @@ Screen::Screen(HugoEngine *vm) : _vm(vm) {
_dlRestoreList[i]._dx = 0;
_dlRestoreList[i]._dy = 0;
}
+ _fnt = 0;
+ _paletteSize = 0;
}
Screen::~Screen() {
diff --git a/engines/hugo/display.h b/engines/hugo/display.h
index 00dc1b743c..e152a7f868 100644
--- a/engines/hugo/display.h
+++ b/engines/hugo/display.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/hugo/file.cpp b/engines/hugo/file.cpp
index e58c2e57d6..e2633977a8 100644
--- a/engines/hugo/file.cpp
+++ b/engines/hugo/file.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -34,11 +34,12 @@
#include "common/config-manager.h"
#include "graphics/surface.h"
-#include "graphics/decoders/pcx.h"
#include "graphics/thumbnail.h"
#include "gui/saveload.h"
+#include "image/pcx.h"
+
#include "hugo/hugo.h"
#include "hugo/file.h"
#include "hugo/schedule.h"
@@ -110,7 +111,7 @@ Seq *FileManager::readPCX(Common::SeekableReadStream &f, Seq *seqPtr, byte *imag
error("Insufficient memory to run game.");
}
- Graphics::PCXDecoder pcx;
+ Image::PCXDecoder pcx;
if (!pcx.loadStream(f))
error("Error while reading PCX image");
@@ -246,13 +247,13 @@ SoundPtr FileManager::getSound(const int16 sound, uint16 *size) {
// No more to do if SILENCE (called for cleanup purposes)
if (sound == _vm->_soundSilence)
- return 0;
+ return nullptr;
// Open sounds file
Common::File fp; // Handle to SOUND_FILE
if (!fp.open(getSoundFilename())) {
warning("Hugo Error: File not found %s", getSoundFilename());
- return 0;
+ return nullptr;
}
if (!_hasReadHeader) {
@@ -519,6 +520,7 @@ void FileManager::readBootFile() {
ofp.read(_vm->_boot._pbswitch, sizeof(_vm->_boot._pbswitch));
ofp.read(_vm->_boot._distrib, sizeof(_vm->_boot._distrib));
_vm->_boot._exitLen = ofp.readUint16LE();
+ ofp.close();
byte *p = (byte *)&_vm->_boot;
@@ -527,7 +529,6 @@ void FileManager::readBootFile() {
checksum ^= p[i];
p[i] ^= s_bootCypher[i % s_bootCypherLen];
}
- ofp.close();
if (checksum) {
Utils::notifyBox(Common::String::format("Corrupted startup file '%s'", getBootFilename()));
diff --git a/engines/hugo/file.h b/engines/hugo/file.h
index 44f257a2af..d43528f0f8 100644
--- a/engines/hugo/file.h
+++ b/engines/hugo/file.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/hugo/file_v1d.cpp b/engines/hugo/file_v1d.cpp
index e42223fb13..b6b51eaa7b 100644
--- a/engines/hugo/file_v1d.cpp
+++ b/engines/hugo/file_v1d.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/hugo/file_v1w.cpp b/engines/hugo/file_v1w.cpp
index 002a1dc103..27db328ecf 100644
--- a/engines/hugo/file_v1w.cpp
+++ b/engines/hugo/file_v1w.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/hugo/file_v2d.cpp b/engines/hugo/file_v2d.cpp
index 19c90980b0..5f748133ea 100644
--- a/engines/hugo/file_v2d.cpp
+++ b/engines/hugo/file_v2d.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/hugo/file_v2w.cpp b/engines/hugo/file_v2w.cpp
index 98a15526fa..4866ba9418 100644
--- a/engines/hugo/file_v2w.cpp
+++ b/engines/hugo/file_v2w.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/hugo/file_v3d.cpp b/engines/hugo/file_v3d.cpp
index 5eb0cfc2c8..0cfb1dc162 100644
--- a/engines/hugo/file_v3d.cpp
+++ b/engines/hugo/file_v3d.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/hugo/game.h b/engines/hugo/game.h
index ed49ee8cbe..0ca6dcb111 100644
--- a/engines/hugo/game.h
+++ b/engines/hugo/game.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/hugo/hugo.cpp b/engines/hugo/hugo.cpp
index b140cfdba2..8f89832f6b 100644
--- a/engines/hugo/hugo.cpp
+++ b/engines/hugo/hugo.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -46,11 +46,11 @@
namespace Hugo {
-HugoEngine *HugoEngine::s_Engine = 0;
+HugoEngine *HugoEngine::s_Engine = nullptr;
HugoEngine::HugoEngine(OSystem *syst, const HugoGameDescription *gd) : Engine(syst), _gameDescription(gd),
- _hero(0), _heroImage(0), _defltTunes(0), _numScreens(0), _tunesNbr(0), _soundSilence(0), _soundTest(0),
- _screenStates(0), _numStates(0), _score(0), _maxscore(0), _lastTime(0), _curTime(0), _episode(0)
+ _hero(nullptr), _heroImage(0), _defltTunes(nullptr), _numScreens(0), _tunesNbr(0), _soundSilence(0), _soundTest(0),
+ _screenStates(nullptr), _numStates(0), _score(0), _maxscore(0), _lastTime(0), _curTime(0), _episode(nullptr)
{
_system = syst;
DebugMan.addDebugChannel(kDebugSchedule, "Schedule", "Script Schedule debug level");
@@ -67,16 +67,16 @@ HugoEngine::HugoEngine(OSystem *syst, const HugoGameDescription *gd) : Engine(sy
_console = new HugoConsole(this);
_rnd = 0;
- _screen = NULL;
- _mouse = NULL;
- _inventory = NULL;
- _parser = NULL;
- _route = NULL;
- _sound = NULL;
- _intro = NULL;
- _object = NULL;
- _text = NULL;
- _topMenu = NULL;
+ _screen = nullptr;
+ _mouse = nullptr;
+ _inventory = nullptr;
+ _parser = nullptr;
+ _route = nullptr;
+ _sound = nullptr;
+ _intro = nullptr;
+ _object = nullptr;
+ _text = nullptr;
+ _topMenu = nullptr;
_status._storyModeFl = false;
_status._gameOverFl = false;
_status._lookFl = false;
@@ -93,6 +93,26 @@ HugoEngine::HugoEngine(OSystem *syst, const HugoGameDescription *gd) : Engine(sy
_gameType = kGameTypeNone;
_platform = Common::kPlatformUnknown;
_packedFl = false;
+
+ _numVariant = 0;
+ _gameVariant = kGameVariantNone;
+ _normalTPS = 0;
+ _screenPtr = nullptr;
+ _config._musicFl = true;
+ _config._soundFl = true;
+ _config._turboFl = false;
+ _look = 0;
+ _take = 0;
+ _drop = 0;
+ _maze._enabledFl = false;
+ _maze._size = 0;
+ _maze._x1 = _maze._y1 = _maze._x2 = _maze._y2 = _maze._x3 = _maze._x4 = 0;
+ _maze._firstScreenIndex = 0;
+ _boot._checksum = 0;
+ _boot._registered = kRegShareware;
+ _boot._exitLen = 0;
+ _file = nullptr;
+ _scheduler = nullptr;
}
HugoEngine::~HugoEngine() {
diff --git a/engines/hugo/hugo.h b/engines/hugo/hugo.h
index 9f495a9037..cc0fcc6ec2 100644
--- a/engines/hugo/hugo.h
+++ b/engines/hugo/hugo.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -106,7 +106,8 @@ enum GameVariant {
kGameVariantH3Win,
kGameVariantH1Dos,
kGameVariantH2Dos,
- kGameVariantH3Dos
+ kGameVariantH3Dos,
+ kGameVariantNone
};
enum HugoDebugChannels {
@@ -259,7 +260,7 @@ public:
// Used by the qsort function
static HugoEngine &get() {
- assert(s_Engine != 0);
+ assert(s_Engine != nullptr);
return *s_Engine;
}
diff --git a/engines/hugo/intro.cpp b/engines/hugo/intro.cpp
index 6f314c8774..26ef65edf8 100644
--- a/engines/hugo/intro.cpp
+++ b/engines/hugo/intro.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -39,9 +39,10 @@
namespace Hugo {
-IntroHandler::IntroHandler(HugoEngine *vm) : _vm(vm), _introX(0), _introY(0) {
+IntroHandler::IntroHandler(HugoEngine *vm) : _vm(vm) {
_introXSize = 0;
_introTicks = 0;
+ _introX = _introY = nullptr;
}
IntroHandler::~IntroHandler() {
@@ -74,6 +75,7 @@ void IntroHandler::loadIntroData(Common::SeekableReadStream &in) {
void IntroHandler::freeIntroData() {
free(_introX);
free(_introY);
+ _introX = _introY = nullptr;
}
intro_v1d::intro_v1d(HugoEngine *vm) : IntroHandler(vm) {
diff --git a/engines/hugo/intro.h b/engines/hugo/intro.h
index d5a5a4e4b4..7af53c8922 100644
--- a/engines/hugo/intro.h
+++ b/engines/hugo/intro.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/hugo/inventory.cpp b/engines/hugo/inventory.cpp
index c2495beadb..64609e6327 100644
--- a/engines/hugo/inventory.cpp
+++ b/engines/hugo/inventory.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -44,7 +44,8 @@ namespace Hugo {
static const int kMaxDisp = (kXPix / kInvDx); // Max icons displayable
-InventoryHandler::InventoryHandler(HugoEngine *vm) : _vm(vm), _invent(0) {
+InventoryHandler::InventoryHandler(HugoEngine *vm) : _vm(vm) {
+ _invent = nullptr;
_firstIconId = 0;
_inventoryState = kInventoryOff; // Inventory icon bar state
_inventoryHeight = 0; // Inventory icon bar pos
@@ -62,6 +63,7 @@ void InventoryHandler::setInventoryState(Istate state) {
void InventoryHandler::freeInvent() {
free(_invent);
+ _invent = nullptr;
}
int16 InventoryHandler::getInventoryObjId() const {
diff --git a/engines/hugo/inventory.h b/engines/hugo/inventory.h
index 5b55c3ec94..a57bff4b58 100644
--- a/engines/hugo/inventory.h
+++ b/engines/hugo/inventory.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/hugo/mouse.cpp b/engines/hugo/mouse.cpp
index ae286c8afb..558a596b35 100644
--- a/engines/hugo/mouse.cpp
+++ b/engines/hugo/mouse.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -45,7 +45,8 @@
namespace Hugo {
-MouseHandler::MouseHandler(HugoEngine *vm) : _vm(vm), _hotspots(0) {
+MouseHandler::MouseHandler(HugoEngine *vm) : _vm(vm) {
+ _hotspots = nullptr;
_leftButtonFl = false;
_rightButtonFl = false;
_jumpExitFl = false; // Can't jump to a screen exit
@@ -83,6 +84,7 @@ void MouseHandler::setMouseY(int y) {
void MouseHandler::freeHotspots() {
free(_hotspots);
+ _hotspots = nullptr;
}
bool MouseHandler::getJumpExitFl() const {
@@ -158,7 +160,6 @@ void MouseHandler::processRightClick(const int16 objId, const int16 cx, const in
return;
int16 inventObjId = _vm->_inventory->getInventoryObjId();
- bool foundFl = false; // TRUE if route found to object
// Check if this was over iconbar
if ((_vm->_inventory->getInventoryState() == kInventoryActive) && (cy < kInvDy + kDibOffY)) { // Clicked over iconbar object
if (inventObjId == -1)
@@ -169,13 +170,15 @@ void MouseHandler::processRightClick(const int16 objId, const int16 cx, const in
_vm->_object->useObject(objId); // Use status.objid on object
} else { // Clicked over viewport object
Object *obj = &_vm->_object->_objects[objId];
- int16 x = 0, y = 0;
- switch (obj->_viewx) { // Where to walk to
- case -1: // Walk to object position
+ int16 x, y;
+ switch (obj->_viewx) { // Where to walk to
+ case -1: { // Walk to object position
+ bool foundFl = false;
if (_vm->_object->findObjectSpace(obj, &x, &y))
- foundFl = _vm->_route->startRoute(kRouteGet, objId, x, y);
+ foundFl = _vm->_route->startRoute(kRouteGet, objId, x, y); // TRUE if route found to object
if (!foundFl) // Can't get there, try to use from here
_vm->_object->useObject(objId);
+ }
break;
case 0: // Immediate use
_vm->_object->useObject(objId); // Pick up or use object
diff --git a/engines/hugo/mouse.h b/engines/hugo/mouse.h
index e20716f72c..f9d547ec86 100644
--- a/engines/hugo/mouse.h
+++ b/engines/hugo/mouse.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/hugo/object.cpp b/engines/hugo/object.cpp
index 7b4783e4d8..bbd2b93adc 100644
--- a/engines/hugo/object.cpp
+++ b/engines/hugo/object.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -44,7 +44,9 @@
namespace Hugo {
-ObjectHandler::ObjectHandler(HugoEngine *vm) : _vm(vm), _objects(0), _uses(0) {
+ObjectHandler::ObjectHandler(HugoEngine *vm) : _vm(vm) {
+ _uses = nullptr;
+ _objects = nullptr;
_numObj = 0;
_objCount = 0;
_usesSize = 0;
@@ -132,19 +134,19 @@ void ObjectHandler::restoreSeq(Object *obj) {
void ObjectHandler::useObject(int16 objId) {
debugC(1, kDebugObject, "useObject(%d)", objId);
- const char *verb; // Background verb to use directly
int16 inventObjId = _vm->_inventory->getInventoryObjId();
- Object *obj = &_objects[objId]; // Ptr to object
+ Object *obj = &_objects[objId]; // Ptr to object
if (inventObjId == -1) {
+ const char *verb; // Background verb to use directly
// Get or use objid directly
if ((obj->_genericCmd & TAKE) || obj->_objValue) // Get collectible item
sprintf(_vm->_line, "%s %s", _vm->_text->getVerb(_vm->_take, 0), _vm->_text->getNoun(obj->_nounIndex, 0));
- else if (obj->_cmdIndex != 0) // Use non-collectible item if able
+ else if (obj->_cmdIndex != 0) // Use non-collectible item if able
sprintf(_vm->_line, "%s %s", _vm->_text->getVerb(_vm->_parser->getCmdDefaultVerbIdx(obj->_cmdIndex), 0), _vm->_text->getNoun(obj->_nounIndex, 0));
else if ((verb = _vm->_parser->useBG(_vm->_text->getNoun(obj->_nounIndex, 0))) != 0)
sprintf(_vm->_line, "%s %s", verb, _vm->_text->getNoun(obj->_nounIndex, 0));
else
- return; // Can't use object directly
+ return; // Can't use object directly
} else {
// Use status.objid on objid
// Default to first cmd verb
@@ -249,47 +251,49 @@ void ObjectHandler::lookObject(Object *obj) {
void ObjectHandler::freeObjects() {
debugC(1, kDebugObject, "freeObjects");
- if (_vm->_hero != 0 && _vm->_hero->_seqList[0]._seqPtr != 0) {
+ if (_vm->_hero != nullptr && _vm->_hero->_seqList[0]._seqPtr != nullptr) {
// Free all sequence lists and image data
for (int16 i = 0; i < _numObj; i++) {
Object *obj = &_objects[i];
for (int16 j = 0; j < obj->_seqNumb; j++) {
Seq *seq = obj->_seqList[j]._seqPtr;
Seq *next;
- if (seq == 0) // Failure during database load
+ if (seq == nullptr) // Failure during database load
break;
- if (seq->_imagePtr != 0) {
+ if (seq->_imagePtr != nullptr) {
free(seq->_imagePtr);
- seq->_imagePtr = 0;
+ seq->_imagePtr = nullptr;
}
seq = seq->_nextSeqPtr;
while (seq != obj->_seqList[j]._seqPtr) {
- if (seq->_imagePtr != 0) {
+ if (seq->_imagePtr != nullptr) {
free(seq->_imagePtr);
- seq->_imagePtr = 0;
+ seq->_imagePtr = nullptr;
}
next = seq->_nextSeqPtr;
free(seq);
seq = next;
}
free(seq);
+ seq = nullptr;
}
}
}
- if (_uses) {
+ if (_uses != nullptr) {
for (int16 i = 0; i < _usesSize; i++)
free(_uses[i]._targets);
free(_uses);
+ _uses = nullptr;
}
for (int16 i = 0; i < _objCount; i++) {
free(_objects[i]._stateDataIndex);
- _objects[i]._stateDataIndex = 0;
+ _objects[i]._stateDataIndex = nullptr;
}
free(_objects);
- _objects = 0;
+ _objects = nullptr;
}
/**
@@ -358,7 +362,7 @@ void ObjectHandler::showTakeables() {
* Find a clear space around supplied object that hero can walk to
*/
bool ObjectHandler::findObjectSpace(Object *obj, int16 *destx, int16 *desty) {
- debugC(1, kDebugObject, "findObjectSpace(obj, %d, %d)", *destx, *desty);
+ debugC(1, kDebugObject, "findObjectSpace(...)");
Seq *curImage = obj->_currImagePtr;
int16 y = obj->_y + curImage->_y2 - 1;
@@ -414,7 +418,7 @@ void ObjectHandler::readUse(Common::ReadStream &in, Uses &curUse) {
*/
void ObjectHandler::loadObjectUses(Common::ReadStream &in) {
Uses tmpUse;
- tmpUse._targets = 0;
+ tmpUse._targets = nullptr;
//Read _uses
for (int varnt = 0; varnt < _vm->_numVariant; varnt++) {
@@ -430,7 +434,7 @@ void ObjectHandler::loadObjectUses(Common::ReadStream &in) {
else {
readUse(in, tmpUse);
free(tmpUse._targets);
- tmpUse._targets = 0;
+ tmpUse._targets = nullptr;
}
}
}
@@ -442,7 +446,7 @@ void ObjectHandler::readObject(Common::ReadStream &in, Object &curObject) {
uint16 numSubElem = in.readUint16BE();
if (numSubElem == 0)
- curObject._stateDataIndex = 0;
+ curObject._stateDataIndex = nullptr;
else
curObject._stateDataIndex = (uint16 *)malloc(sizeof(uint16) * numSubElem);
for (int j = 0; j < numSubElem; j++)
@@ -453,16 +457,16 @@ void ObjectHandler::readObject(Common::ReadStream &in, Object &curObject) {
curObject._vyPath = in.readSint16BE();
curObject._actIndex = in.readUint16BE();
curObject._seqNumb = in.readByte();
- curObject._currImagePtr = 0;
+ curObject._currImagePtr = nullptr;
if (curObject._seqNumb == 0) {
curObject._seqList[0]._imageNbr = 0;
- curObject._seqList[0]._seqPtr = 0;
+ curObject._seqList[0]._seqPtr = nullptr;
}
for (int j = 0; j < curObject._seqNumb; j++) {
curObject._seqList[j]._imageNbr = in.readUint16BE();
- curObject._seqList[j]._seqPtr = 0;
+ curObject._seqList[j]._seqPtr = nullptr;
}
curObject._cycling = (Cycle)in.readByte();
@@ -498,7 +502,7 @@ void ObjectHandler::readObject(Common::ReadStream &in, Object &curObject) {
void ObjectHandler::loadObjectArr(Common::ReadStream &in) {
debugC(6, kDebugObject, "loadObject(&in)");
Object tmpObject;
- tmpObject._stateDataIndex = 0;
+ tmpObject._stateDataIndex = nullptr;
for (int varnt = 0; varnt < _vm->_numVariant; varnt++) {
uint16 numElem = in.readUint16BE();
@@ -515,7 +519,7 @@ void ObjectHandler::loadObjectArr(Common::ReadStream &in) {
// Skip over uneeded objects.
readObject(in, tmpObject);
free(tmpObject._stateDataIndex);
- tmpObject._stateDataIndex = 0;
+ tmpObject._stateDataIndex = nullptr;
}
}
}
@@ -536,10 +540,8 @@ void ObjectHandler::setCarriedScreen(int screenNum) {
* Load _numObj from Hugo.dat
*/
void ObjectHandler::loadNumObj(Common::ReadStream &in) {
- int numElem;
-
for (int varnt = 0; varnt < _vm->_numVariant; varnt++) {
- numElem = in.readUint16BE();
+ int numElem = in.readUint16BE();
if (varnt == _vm->_gameVariant)
_numObj = numElem;
}
diff --git a/engines/hugo/object.h b/engines/hugo/object.h
index fd0d731a98..59294e70ae 100644
--- a/engines/hugo/object.h
+++ b/engines/hugo/object.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/hugo/object_v1d.cpp b/engines/hugo/object_v1d.cpp
index 7f88e9e5b8..bfbdfd215b 100644
--- a/engines/hugo/object_v1d.cpp
+++ b/engines/hugo/object_v1d.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/hugo/object_v1w.cpp b/engines/hugo/object_v1w.cpp
index 61b0f2e48a..736128b006 100644
--- a/engines/hugo/object_v1w.cpp
+++ b/engines/hugo/object_v1w.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/hugo/object_v2d.cpp b/engines/hugo/object_v2d.cpp
index 7cb6c20dd0..7acd05fe61 100644
--- a/engines/hugo/object_v2d.cpp
+++ b/engines/hugo/object_v2d.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/hugo/object_v3d.cpp b/engines/hugo/object_v3d.cpp
index 7bb4b95b4a..4805fde460 100644
--- a/engines/hugo/object_v3d.cpp
+++ b/engines/hugo/object_v3d.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/hugo/parser.cpp b/engines/hugo/parser.cpp
index 2585c64fd8..998dd5df58 100644
--- a/engines/hugo/parser.cpp
+++ b/engines/hugo/parser.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -44,14 +44,20 @@
namespace Hugo {
-Parser::Parser(HugoEngine *vm) : _vm(vm), _putIndex(0), _getIndex(0), _arrayReqs(0), _catchallList(0), _backgroundObjects(0), _cmdList(0) {
+Parser::Parser(HugoEngine *vm) : _vm(vm), _putIndex(0), _getIndex(0) {
+ _catchallList = nullptr;
+ _arrayReqs = nullptr;
+
+ _backgroundObjects = nullptr;
+ _backgroundObjectsSize = 0;
+ _cmdList = nullptr;
+ _cmdListSize = 0;
+
_cmdLineIndex = 0;
_cmdLineTick = 0;
_cmdLineCursor = '_';
_cmdLine[0] = '\0';
- _cmdListSize = 0;
_checkDoubleF1Fl = false;
- _backgroundObjectsSize = 0;
}
Parser::~Parser() {
@@ -172,7 +178,7 @@ const char *Parser::useBG(const char *name) {
return _vm->_text->getVerb(p[i]._verbIndex, 0);
}
- return 0;
+ return nullptr;
}
void Parser::freeParser() {
@@ -180,20 +186,24 @@ void Parser::freeParser() {
for (int i = 0; _arrayReqs[i] != 0; i++)
free(_arrayReqs[i]);
free(_arrayReqs);
+ _arrayReqs = nullptr;
}
free(_catchallList);
+ _catchallList = nullptr;
if (_backgroundObjects) {
for (int i = 0; i < _backgroundObjectsSize; i++)
free(_backgroundObjects[i]);
free(_backgroundObjects);
+ _backgroundObjects = nullptr;
}
if (_cmdList) {
for (int i = 0; i < _cmdListSize; i++)
free(_cmdList[i]);
free(_cmdList);
+ _cmdList = nullptr;
}
}
@@ -398,9 +408,9 @@ void Parser::command(const char *format, ...) {
* Locate any member of object name list appearing in command line
*/
bool Parser::isWordPresent(char **wordArr) const {
- debugC(1, kDebugParser, "isWordPresent(%s)", wordArr[0]);
-
if (wordArr != 0) {
+ debugC(1, kDebugParser, "isWordPresent(%s)", wordArr[0]);
+
for (int i = 0; strlen(wordArr[i]); i++) {
if (strstr(_vm->_line, wordArr[i]))
return true;
@@ -421,7 +431,7 @@ const char *Parser::findNoun() const {
return _vm->_text->getNoun(i, 0);
}
}
- return 0;
+ return nullptr;
}
/**
@@ -436,7 +446,7 @@ const char *Parser::findVerb() const {
return _vm->_text->getVerb(i, 0);
}
}
- return 0;
+ return nullptr;
}
/**
diff --git a/engines/hugo/parser.h b/engines/hugo/parser.h
index e72c46f591..5a2ac7d375 100644
--- a/engines/hugo/parser.h
+++ b/engines/hugo/parser.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/hugo/parser_v1d.cpp b/engines/hugo/parser_v1d.cpp
index f29b0161f5..404a7bae80 100644
--- a/engines/hugo/parser_v1d.cpp
+++ b/engines/hugo/parser_v1d.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/hugo/parser_v1w.cpp b/engines/hugo/parser_v1w.cpp
index 3722ccc0e1..10f691866b 100644
--- a/engines/hugo/parser_v1w.cpp
+++ b/engines/hugo/parser_v1w.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/hugo/parser_v2d.cpp b/engines/hugo/parser_v2d.cpp
index 6d71186f49..d8e91adec2 100644
--- a/engines/hugo/parser_v2d.cpp
+++ b/engines/hugo/parser_v2d.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/hugo/parser_v3d.cpp b/engines/hugo/parser_v3d.cpp
index a7e5896833..9bcc13e54e 100644
--- a/engines/hugo/parser_v3d.cpp
+++ b/engines/hugo/parser_v3d.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/hugo/route.cpp b/engines/hugo/route.cpp
index 54dae88c28..17c23ea785 100644
--- a/engines/hugo/route.cpp
+++ b/engines/hugo/route.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -45,6 +45,17 @@ Route::Route(HugoEngine *vm) : _vm(vm) {
_routeIndex = -1; // Hero not following a route
_routeType = kRouteSpace; // Hero walking to space
_routeObjId = -1; // Hero not walking to anything
+
+ for (int i = 0; i < kMaxSeg; i++)
+ _segment[i]._y = _segment[i]._x1 = _segment[i]._x2 = 0;
+
+ _segmentNumb = 0;
+ _routeListIndex = 0;
+ _destX = _destY = 0;
+ _heroWidth = 0;
+ _routeFoundFl = false;
+ _fullStackFl = false;
+ _fullSegmentFl = false;
}
void Route::resetRoute() {
@@ -303,7 +314,7 @@ Common::Point *Route::newNode() {
_routeListIndex++;
if (_routeListIndex >= kMaxNodes) // Too many nodes
- return 0; // Incomplete route - failure
+ return nullptr; // Incomplete route - failure
_route[_routeListIndex] = _route[_routeListIndex - 1]; // Initialize with previous node
return &_route[_routeListIndex];
@@ -373,9 +384,9 @@ bool Route::findRoute(const int16 cx, const int16 cy) {
_segment[_segmentNumb]._x2 = herox2;
_segmentNumb++;
- Common::Point *routeNode; // Ptr to route node
// Look in segments[] for straight lines from destination to hero
for (i = 0, _routeListIndex = 0; i < _segmentNumb - 1; i++) {
+ Common::Point *routeNode; // Ptr to route node
if ((routeNode = newNode()) == 0) // New node for new segment
return false; // Too many nodes
routeNode->y = _segment[i]._y;
@@ -427,7 +438,7 @@ bool Route::findRoute(const int16 cx, const int16 cy) {
void Route::processRoute() {
debugC(1, kDebugRoute, "processRoute");
- static bool turnedFl = false; // Used to get extra cylce for turning
+ static bool turnedFl = false; // Used to get extra cycle for turning
if (_routeIndex < 0)
return;
diff --git a/engines/hugo/route.h b/engines/hugo/route.h
index 716829a201..6d312ec1db 100644
--- a/engines/hugo/route.h
+++ b/engines/hugo/route.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -79,9 +79,11 @@ private:
int16 _destY;
int16 _heroWidth; // Hero width
bool _routeFoundFl; // TRUE when path found
- bool _fullStackFl; // TRUE if stack exhausted
bool _fullSegmentFl; // Segments exhausted
+ // CHECKME: Never set to true, could be removed
+ bool _fullStackFl; // TRUE if stack exhausted
+
void segment(int16 x, int16 y);
bool findRoute(const int16 cx, const int16 cy);
Common::Point *newNode();
diff --git a/engines/hugo/schedule.cpp b/engines/hugo/schedule.cpp
index 32b8a47df7..36501d4a7d 100644
--- a/engines/hugo/schedule.cpp
+++ b/engines/hugo/schedule.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -47,10 +47,23 @@
namespace Hugo {
-Scheduler::Scheduler(HugoEngine *vm) : _vm(vm), _actListArr(0), _curTick(0), _oldTime(0), _refreshTimeout(0), _points(0), _screenActs(0) {
+Scheduler::Scheduler(HugoEngine *vm) : _vm(vm) {
+ _actListArr = nullptr;
+ _curTick = 0;
+ _oldTime = 0;
+ _refreshTimeout = 0;
+ _points = nullptr;
+ _screenActs = nullptr;
+
memset(_events, 0, sizeof(_events));
_numBonuses = 0;
_screenActsSize = 0;
+
+ _actListArrSize = 0;
+ _alNewscrIndex = 0;
+ _freeEvent = nullptr;
+ _headEvent = nullptr;
+ _tailEvent = nullptr;
}
Scheduler::~Scheduler() {
@@ -69,14 +82,14 @@ void Scheduler::initEventQueue() {
// Chain nextEvent from first to last
for (int i = kMaxEvents; --i;)
_events[i - 1]._nextEvent = &_events[i];
- _events[kMaxEvents - 1]._nextEvent = 0;
+ _events[kMaxEvents - 1]._nextEvent = nullptr;
// Chain prevEvent from last to first
for (int i = 1; i < kMaxEvents; i++)
_events[i]._prevEvent = &_events[i - 1];
- _events[0]._prevEvent = 0;
+ _events[0]._prevEvent = nullptr;
- _headEvent = _tailEvent = 0; // Event list is empty
+ _headEvent = _tailEvent = nullptr; // Event list is empty
_freeEvent = _events; // Free list is full
}
@@ -90,7 +103,7 @@ Event *Scheduler::getQueue() {
error("An error has occurred: %s", "getQueue");
Event *resEvent = _freeEvent;
_freeEvent = _freeEvent->_nextEvent;
- resEvent->_nextEvent = 0;
+ resEvent->_nextEvent = nullptr;
return resEvent;
}
@@ -241,9 +254,8 @@ void Scheduler::waitForRefresh() {
void Scheduler::loadAlNewscrIndex(Common::ReadStream &in) {
debugC(6, kDebugSchedule, "loadAlNewscrIndex(&in)");
- int numElem;
for (int varnt = 0; varnt < _vm->_numVariant; varnt++) {
- numElem = in.readUint16BE();
+ int numElem = in.readUint16BE();
if (varnt == _vm->_gameVariant)
_alNewscrIndex = numElem;
}
@@ -555,9 +567,9 @@ void Scheduler::loadActListArr(Common::ReadStream &in) {
Act tmpAct;
- int numElem, numSubElem;
+ int numSubElem;
for (int varnt = 0; varnt < _vm->_numVariant; varnt++) {
- numElem = in.readUint16BE();
+ int numElem = in.readUint16BE();
if (varnt == _vm->_gameVariant) {
_actListArrSize = numElem;
_actListArr = (Act **)malloc(sizeof(Act *) * _actListArrSize);
@@ -597,7 +609,7 @@ void Scheduler::loadScreenAct(Common::SeekableReadStream &in) {
for (int i = 0; i < numElem; i++) {
uint16 numSubElem = in.readUint16BE();
if (numSubElem == 0) {
- _screenActs[i] = 0;
+ _screenActs[i] = nullptr;
} else {
_screenActs[i] = (uint16 *)malloc(sizeof(uint16) * numSubElem);
for (int j = 0; j < numSubElem; j++)
@@ -617,11 +629,14 @@ void Scheduler::freeScheduler() {
debugC(6, kDebugSchedule, "freeActListArr()");
free(_points);
+ _points = nullptr;
if (_screenActs) {
for (int i = 0; i < _screenActsSize; i++)
free(_screenActs[i]);
free(_screenActs);
+ _screenActs = nullptr;
+ _screenActsSize = 0;
}
if (_actListArr) {
@@ -633,6 +648,8 @@ void Scheduler::freeScheduler() {
free(_actListArr[i]);
}
free(_actListArr);
+ _actListArr = nullptr;
+ _actListArrSize = 0;
}
}
@@ -698,9 +715,9 @@ void Scheduler::saveEvents(Common::WriteStream *f) {
f->writeUint32BE(getTicks());
- int16 freeIndex = (_freeEvent == 0) ? -1 : _freeEvent - _events;
- int16 headIndex = (_headEvent == 0) ? -1 : _headEvent - _events;
- int16 tailIndex = (_tailEvent == 0) ? -1 : _tailEvent - _events;
+ int16 freeIndex = (_freeEvent == nullptr) ? -1 : _freeEvent - _events;
+ int16 headIndex = (_headEvent == nullptr) ? -1 : _headEvent - _events;
+ int16 tailIndex = (_tailEvent == nullptr) ? -1 : _tailEvent - _events;
f->writeSint16BE(freeIndex);
f->writeSint16BE(headIndex);
@@ -717,8 +734,8 @@ void Scheduler::saveEvents(Common::WriteStream *f) {
f->writeSint16BE(subElem);
f->writeByte((wrkEvent->_localActionFl) ? 1 : 0);
f->writeUint32BE(wrkEvent->_time);
- f->writeSint16BE((wrkEvent->_prevEvent == 0) ? -1 : (wrkEvent->_prevEvent - _events));
- f->writeSint16BE((wrkEvent->_nextEvent == 0) ? -1 : (wrkEvent->_nextEvent - _events));
+ f->writeSint16BE((wrkEvent->_prevEvent == nullptr) ? -1 : (wrkEvent->_prevEvent - _events));
+ f->writeSint16BE((wrkEvent->_nextEvent == nullptr) ? -1 : (wrkEvent->_nextEvent - _events));
}
}
@@ -1102,7 +1119,7 @@ void Scheduler::restoreEvents(Common::ReadStream *f) {
// fix up action pointer (to do better)
if ((index == -1) && (subElem == -1))
- _events[i]._action = 0;
+ _events[i]._action = nullptr;
else
_events[i]._action = (Act *)&_actListArr[index][subElem];
@@ -1112,12 +1129,12 @@ void Scheduler::restoreEvents(Common::ReadStream *f) {
int16 prevIndex = f->readSint16BE();
int16 nextIndex = f->readSint16BE();
- _events[i]._prevEvent = (prevIndex == -1) ? (Event *)0 : &_events[prevIndex];
- _events[i]._nextEvent = (nextIndex == -1) ? (Event *)0 : &_events[nextIndex];
+ _events[i]._prevEvent = (prevIndex == -1) ? nullptr : &_events[prevIndex];
+ _events[i]._nextEvent = (nextIndex == -1) ? nullptr : &_events[nextIndex];
}
- _freeEvent = (freeIndex == -1) ? 0 : &_events[freeIndex];
- _headEvent = (headIndex == -1) ? 0 : &_events[headIndex];
- _tailEvent = (tailIndex == -1) ? 0 : &_events[tailIndex];
+ _freeEvent = (freeIndex == -1) ? nullptr : &_events[freeIndex];
+ _headEvent = (headIndex == -1) ? nullptr : &_events[headIndex];
+ _tailEvent = (tailIndex == -1) ? nullptr : &_events[tailIndex];
// Adjust times to fit our time
uint32 curTime = getTicks();
@@ -1156,7 +1173,7 @@ void Scheduler::insertAction(Act *action) {
// Now find the place to insert the event
if (!_tailEvent) { // Empty queue
_tailEvent = _headEvent = curEvent;
- curEvent->_nextEvent = curEvent->_prevEvent = 0;
+ curEvent->_nextEvent = curEvent->_prevEvent = nullptr;
} else {
Event *wrkEvent = _tailEvent; // Search from latest time back
bool found = false;
@@ -1178,7 +1195,7 @@ void Scheduler::insertAction(Act *action) {
if (!found) { // Must be earliest in list
_headEvent->_prevEvent = curEvent; // So insert as new head
curEvent->_nextEvent = _headEvent;
- curEvent->_prevEvent = 0;
+ curEvent->_prevEvent = nullptr;
_headEvent = curEvent;
}
}
@@ -1196,8 +1213,6 @@ Event *Scheduler::doAction(Event *curEvent) {
Act *action = curEvent->_action;
Object *obj1;
int dx, dy;
- Event *wrkEvent; // Save ev_p->nextEvent for return
-
switch (action->_a0._actType) {
case ANULL: // Big NOP from DEL_EVENTS
break;
@@ -1424,9 +1439,9 @@ Event *Scheduler::doAction(Event *curEvent) {
}
if (action->_a0._actType == NEW_SCREEN) { // New_screen() deletes entire list
- return 0; // nextEvent = 0 since list now empty
+ return nullptr; // nextEvent = nullptr since list now empty
} else {
- wrkEvent = curEvent->_nextEvent;
+ Event *wrkEvent = curEvent->_nextEvent;
delQueue(curEvent); // Return event to free list
return wrkEvent; // Return next event ptr
}
@@ -1455,9 +1470,9 @@ void Scheduler::delQueue(Event *curEvent) {
}
if (_headEvent)
- _headEvent->_prevEvent = 0; // Mark end of list
+ _headEvent->_prevEvent = nullptr; // Mark end of list
else
- _tailEvent = 0; // Empty queue
+ _tailEvent = nullptr; // Empty queue
curEvent->_nextEvent = _freeEvent; // Return p to free list
if (_freeEvent) // Special case, if free list was empty
@@ -1583,10 +1598,9 @@ void Scheduler_v2d::promptAction(Act *action) {
debug(1, "doAction(act3), expecting answer %s", _vm->_file->fetchString(action->_a3._responsePtr[0]));
bool found = false;
- const char *tmpStr; // General purpose string ptr
for (int dx = 0; !found && (action->_a3._responsePtr[dx] != -1); dx++) {
- tmpStr = _vm->_file->fetchString(action->_a3._responsePtr[dx]);
+ const char *tmpStr = _vm->_file->fetchString(action->_a3._responsePtr[dx]);
if (response.contains(tmpStr))
found = true;
}
diff --git a/engines/hugo/schedule.h b/engines/hugo/schedule.h
index 37851f1ebc..7f09904258 100644
--- a/engines/hugo/schedule.h
+++ b/engines/hugo/schedule.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/hugo/sound.cpp b/engines/hugo/sound.cpp
index aefa03cd5e..8591709dc3 100644
--- a/engines/hugo/sound.cpp
+++ b/engines/hugo/sound.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -123,11 +123,12 @@ 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;
+ _DOSSongPtr = nullptr;
_curPriority = 0;
_pcspkrTimer = 0;
_pcspkrOctave = 3;
_pcspkrNoteDuration = 2;
+ _DOSIntroSong = nullptr;
}
SoundHandler::~SoundHandler() {
@@ -210,7 +211,7 @@ void SoundHandler::playSound(int16 sound, const byte priority) {
_curPriority = priority;
// Get sound data
- if ((soundPtr = _vm->_file->getSound(sound, &size)) == 0)
+ if ((soundPtr = _vm->_file->getSound(sound, &size)) == nullptr)
return;
Audio::AudioStream *stream = Audio::makeRawStream(soundPtr, size, 11025, Audio::FLAG_UNSIGNED);
diff --git a/engines/hugo/sound.h b/engines/hugo/sound.h
index b00d93eeb1..6c3420918d 100644
--- a/engines/hugo/sound.h
+++ b/engines/hugo/sound.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/hugo/text.cpp b/engines/hugo/text.cpp
index f8b02bdf68..50b2b64260 100644
--- a/engines/hugo/text.cpp
+++ b/engines/hugo/text.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -26,9 +26,17 @@
namespace Hugo {
-TextHandler::TextHandler(HugoEngine *vm) : _vm(vm), _textData(0), _stringtData(0),
- _textEngine(0), _textIntro(0), _textMouse(0), _textParser(0), _textUtil(0),
- _screenNames(0), _arrayNouns(0), _arrayVerbs(0) {
+TextHandler::TextHandler(HugoEngine *vm) : _vm(vm) {
+ _textData = nullptr;
+ _stringtData = nullptr;
+ _textEngine = nullptr;
+ _textIntro = nullptr;
+ _textMouse = nullptr;
+ _textParser = nullptr;
+ _textUtil = nullptr;
+ _screenNames = nullptr;
+ _arrayNouns = nullptr;
+ _arrayVerbs = nullptr;
}
TextHandler::~TextHandler() {
@@ -83,16 +91,14 @@ char **TextHandler::getVerbArray(int idx1) const {
}
char **TextHandler::loadTextsVariante(Common::ReadStream &in, uint16 *arraySize) {
- int numTexts;
- int entryLen;
int len;
- char **res = 0;
- char *pos = 0;
- char *posBck = 0;
+ char **res = nullptr;
+ char *pos = nullptr;
+ char *posBck = nullptr;
for (int varnt = 0; varnt < _vm->_numVariant; varnt++) {
- numTexts = in.readUint16BE();
- entryLen = in.readUint16BE();
+ int numTexts = in.readUint16BE();
+ int entryLen = in.readUint16BE();
pos = (char *)malloc(entryLen);
if (varnt == _vm->_gameVariant) {
if (arraySize)
@@ -126,21 +132,21 @@ char **TextHandler::loadTextsVariante(Common::ReadStream &in, uint16 *arraySize)
}
char ***TextHandler::loadTextsArray(Common::ReadStream &in) {
- char ***resArray = 0;
+ char ***resArray = nullptr;
uint16 arraySize;
for (int varnt = 0; varnt < _vm->_numVariant; varnt++) {
arraySize = in.readUint16BE();
if (varnt == _vm->_gameVariant) {
resArray = (char ***)malloc(sizeof(char **) * (arraySize + 1));
- resArray[arraySize] = 0;
+ resArray[arraySize] = nullptr;
}
for (int i = 0; i < arraySize; i++) {
int numTexts = in.readUint16BE();
int entryLen = in.readUint16BE();
char *pos = (char *)malloc(entryLen);
- char *posBck = 0;
- char **res = 0;
+ char *posBck = nullptr;
+ char **res = nullptr;
if (varnt == _vm->_gameVariant) {
res = (char **)malloc(sizeof(char *) * numTexts);
res[0] = pos;
@@ -232,6 +238,7 @@ void TextHandler::freeTexts(char **ptr) {
free(*ptr - DATAALIGNMENT);
free(ptr);
+ ptr = nullptr;
}
void TextHandler::freeAllTexts() {
@@ -242,12 +249,14 @@ void TextHandler::freeAllTexts() {
for (int i = 0; _arrayNouns[i]; i++)
freeTexts(_arrayNouns[i]);
free(_arrayNouns);
+ _arrayNouns = nullptr;
}
if (_arrayVerbs) {
for (int i = 0; _arrayVerbs[i]; i++)
freeTexts(_arrayVerbs[i]);
free(_arrayVerbs);
+ _arrayVerbs = nullptr;
}
freeTexts(_screenNames);
diff --git a/engines/hugo/text.h b/engines/hugo/text.h
index 0ba8de9cdf..aa35f0a53f 100644
--- a/engines/hugo/text.h
+++ b/engines/hugo/text.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/hugo/util.cpp b/engines/hugo/util.cpp
index fdc676e6a7..7b75bf2bc5 100644
--- a/engines/hugo/util.cpp
+++ b/engines/hugo/util.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/hugo/util.h b/engines/hugo/util.h
index d8634c88e0..3a76e3c6f4 100644
--- a/engines/hugo/util.h
+++ b/engines/hugo/util.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/kyra/animator_hof.cpp b/engines/kyra/animator_hof.cpp
index 59112504d6..7ce79cb7a0 100644
--- a/engines/kyra/animator_hof.cpp
+++ b/engines/kyra/animator_hof.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/kyra/animator_lok.cpp b/engines/kyra/animator_lok.cpp
index c246eebd46..ba6dc91e1f 100644
--- a/engines/kyra/animator_lok.cpp
+++ b/engines/kyra/animator_lok.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -491,7 +491,7 @@ Animator_LoK::AnimObject *Animator_LoK::objectAddHead(AnimObject *queue, AnimObj
}
Animator_LoK::AnimObject *Animator_LoK::objectQueue(AnimObject *queue, AnimObject *add) {
- if (add->drawY <= queue->drawY || !queue) {
+ if (!queue || add->drawY <= queue->drawY) {
add->nextAnimObject = queue;
return add;
}
diff --git a/engines/kyra/animator_lok.h b/engines/kyra/animator_lok.h
index 74b8305468..55c4d571fd 100644
--- a/engines/kyra/animator_lok.h
+++ b/engines/kyra/animator_lok.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/kyra/animator_mr.cpp b/engines/kyra/animator_mr.cpp
index 83e774e2fc..3b9454ce56 100644
--- a/engines/kyra/animator_mr.cpp
+++ b/engines/kyra/animator_mr.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/kyra/animator_tim.cpp b/engines/kyra/animator_tim.cpp
index 90f4ad89ad..1d65ba7b1a 100644
--- a/engines/kyra/animator_tim.cpp
+++ b/engines/kyra/animator_tim.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/kyra/animator_v2.cpp b/engines/kyra/animator_v2.cpp
index f7ae6749cf..5ac154bdce 100644
--- a/engines/kyra/animator_v2.cpp
+++ b/engines/kyra/animator_v2.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/kyra/chargen.cpp b/engines/kyra/chargen.cpp
index 80a95da047..2454909440 100644
--- a/engines/kyra/chargen.cpp
+++ b/engines/kyra/chargen.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -155,8 +155,10 @@ CharacterGenerator::~CharacterGenerator() {
}
bool CharacterGenerator::start(EoBCharacter *characters, uint8 ***faceShapes) {
- if (!characters && !faceShapes)
+ if (!characters || !faceShapes) {
+ warning("CharacterGenerator::start: Called without character data");
return true;
+ }
_characters = characters;
_faceShapes = *faceShapes;
diff --git a/engines/kyra/configure.engine b/engines/kyra/configure.engine
new file mode 100644
index 0000000000..b7d6334fcc
--- /dev/null
+++ b/engines/kyra/configure.engine
@@ -0,0 +1,5 @@
+# This file is included from the main "configure" script
+# add_engine [name] [desc] [build-by-default] [subengines] [base games] [deps]
+add_engine kyra "Kyra" yes "lol eob" "Legend of Kyrandia 1-3"
+add_engine lol "Lands of Lore" yes
+add_engine eob "Eye of the Beholder" yes
diff --git a/engines/kyra/darkmoon.cpp b/engines/kyra/darkmoon.cpp
index a694a4aba5..71ae98e4db 100644
--- a/engines/kyra/darkmoon.cpp
+++ b/engines/kyra/darkmoon.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/kyra/darkmoon.h b/engines/kyra/darkmoon.h
index f0057ddd66..57eb46eb1c 100644
--- a/engines/kyra/darkmoon.h
+++ b/engines/kyra/darkmoon.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/kyra/debugger.cpp b/engines/kyra/debugger.cpp
index 99d73d19c7..4a90722a35 100644
--- a/engines/kyra/debugger.cpp
+++ b/engines/kyra/debugger.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -40,45 +40,45 @@ Debugger::Debugger(KyraEngine_v1 *vm)
}
void Debugger::initialize() {
- DCmd_Register("continue", WRAP_METHOD(Debugger, Cmd_Exit));
- DCmd_Register("screen_debug_mode", WRAP_METHOD(Debugger, cmd_setScreenDebug));
- DCmd_Register("load_palette", WRAP_METHOD(Debugger, cmd_loadPalette));
- DCmd_Register("facings", WRAP_METHOD(Debugger, cmd_showFacings));
- DCmd_Register("gamespeed", WRAP_METHOD(Debugger, cmd_gameSpeed));
- DCmd_Register("flags", WRAP_METHOD(Debugger, cmd_listFlags));
- DCmd_Register("toggleflag", WRAP_METHOD(Debugger, cmd_toggleFlag));
- DCmd_Register("queryflag", WRAP_METHOD(Debugger, cmd_queryFlag));
- DCmd_Register("timers", WRAP_METHOD(Debugger, cmd_listTimers));
- DCmd_Register("settimercountdown", WRAP_METHOD(Debugger, cmd_setTimerCountdown));
-}
-
-bool Debugger::cmd_setScreenDebug(int argc, const char **argv) {
+ registerCmd("continue", WRAP_METHOD(Debugger, cmdExit));
+ registerCmd("screen_debug_mode", WRAP_METHOD(Debugger, cmdSetScreenDebug));
+ registerCmd("load_palette", WRAP_METHOD(Debugger, cmdLoadPalette));
+ registerCmd("facings", WRAP_METHOD(Debugger, cmdShowFacings));
+ registerCmd("gamespeed", WRAP_METHOD(Debugger, cmdGameSpeed));
+ registerCmd("flags", WRAP_METHOD(Debugger, cmdListFlags));
+ registerCmd("toggleflag", WRAP_METHOD(Debugger, cmdToggleFlag));
+ registerCmd("queryflag", WRAP_METHOD(Debugger, cmdQueryFlag));
+ registerCmd("timers", WRAP_METHOD(Debugger, cmdListTimers));
+ registerCmd("settimercountdown", WRAP_METHOD(Debugger, cmdSetTimerCountdown));
+}
+
+bool Debugger::cmdSetScreenDebug(int argc, const char **argv) {
if (argc > 1) {
if (scumm_stricmp(argv[1], "enable") == 0)
_vm->screen()->enableScreenDebug(true);
else if (scumm_stricmp(argv[1], "disable") == 0)
_vm->screen()->enableScreenDebug(false);
else
- DebugPrintf("Use screen_debug_mode <enable/disable> to enable or disable it.\n");
+ debugPrintf("Use screen_debug_mode <enable/disable> to enable or disable it.\n");
} else {
- DebugPrintf("Screen debug mode is %s.\n", (_vm->screen()->queryScreenDebug() ? "enabled" : "disabled"));
- DebugPrintf("Use screen_debug_mode <enable/disable> to enable or disable it.\n");
+ debugPrintf("Screen debug mode is %s.\n", (_vm->screen()->queryScreenDebug() ? "enabled" : "disabled"));
+ debugPrintf("Use screen_debug_mode <enable/disable> to enable or disable it.\n");
}
return true;
}
-bool Debugger::cmd_loadPalette(int argc, const char **argv) {
+bool Debugger::cmdLoadPalette(int argc, const char **argv) {
Palette palette(_vm->screen()->getPalette(0).getNumColors());
if (argc <= 1) {
- DebugPrintf("Use load_palette <file> [start_col] [end_col]\n");
+ debugPrintf("Use load_palette <file> [start_col] [end_col]\n");
return true;
}
if (_vm->game() != GI_KYRA1 && _vm->resource()->getFileSize(argv[1]) != 768) {
uint8 *buffer = new uint8[320 * 200 * sizeof(uint8)];
if (!buffer) {
- DebugPrintf("ERROR: Cannot allocate buffer for screen region!\n");
+ debugPrintf("ERROR: Cannot allocate buffer for screen region!\n");
return true;
}
@@ -89,7 +89,7 @@ bool Debugger::cmd_loadPalette(int argc, const char **argv) {
delete[] buffer;
} else if (!_vm->screen()->loadPalette(argv[1], palette)) {
- DebugPrintf("ERROR: Palette '%s' not found!\n", argv[1]);
+ debugPrintf("ERROR: Palette '%s' not found!\n", argv[1]);
return true;
}
@@ -111,87 +111,87 @@ bool Debugger::cmd_loadPalette(int argc, const char **argv) {
return true;
}
-bool Debugger::cmd_showFacings(int argc, const char **argv) {
- DebugPrintf("Facing directions:\n");
- DebugPrintf("7 0 1\n");
- DebugPrintf(" \\ | / \n");
- DebugPrintf("6--*--2\n");
- DebugPrintf(" / | \\\n");
- DebugPrintf("5 4 3\n");
+bool Debugger::cmdShowFacings(int argc, const char **argv) {
+ debugPrintf("Facing directions:\n");
+ debugPrintf("7 0 1\n");
+ debugPrintf(" \\ | / \n");
+ debugPrintf("6--*--2\n");
+ debugPrintf(" / | \\\n");
+ debugPrintf("5 4 3\n");
return true;
}
-bool Debugger::cmd_gameSpeed(int argc, const char **argv) {
+bool Debugger::cmdGameSpeed(int argc, const char **argv) {
if (argc == 2) {
int val = atoi(argv[1]);
if (val < 1 || val > 1000) {
- DebugPrintf("speed must lie between 1 and 1000 (default: 60)\n");
+ debugPrintf("speed must lie between 1 and 1000 (default: 60)\n");
return true;
}
_vm->_tickLength = (uint8)(1000.0 / val);
} else {
- DebugPrintf("Syntax: gamespeed <value>\n");
+ debugPrintf("Syntax: gamespeed <value>\n");
}
return true;
}
-bool Debugger::cmd_listFlags(int argc, const char **argv) {
+bool Debugger::cmdListFlags(int argc, const char **argv) {
for (int i = 0, p = 0; i < (int)sizeof(_vm->_flagsTable) * 8; i++, ++p) {
- DebugPrintf("(%-3i): %-2i", i, _vm->queryGameFlag(i));
+ debugPrintf("(%-3i): %-2i", i, _vm->queryGameFlag(i));
if (p == 5) {
- DebugPrintf("\n");
+ debugPrintf("\n");
p -= 6;
}
}
- DebugPrintf("\n");
+ debugPrintf("\n");
return true;
}
-bool Debugger::cmd_toggleFlag(int argc, const char **argv) {
+bool Debugger::cmdToggleFlag(int argc, const char **argv) {
if (argc > 1) {
uint flag = atoi(argv[1]);
if (_vm->queryGameFlag(flag))
_vm->resetGameFlag(flag);
else
_vm->setGameFlag(flag);
- DebugPrintf("Flag %i is now %i\n", flag, _vm->queryGameFlag(flag));
+ debugPrintf("Flag %i is now %i\n", flag, _vm->queryGameFlag(flag));
} else {
- DebugPrintf("Syntax: toggleflag <flag>\n");
+ debugPrintf("Syntax: toggleflag <flag>\n");
}
return true;
}
-bool Debugger::cmd_queryFlag(int argc, const char **argv) {
+bool Debugger::cmdQueryFlag(int argc, const char **argv) {
if (argc > 1) {
uint flag = atoi(argv[1]);
- DebugPrintf("Flag %i is %i\n", flag, _vm->queryGameFlag(flag));
+ debugPrintf("Flag %i is %i\n", flag, _vm->queryGameFlag(flag));
} else {
- DebugPrintf("Syntax: queryflag <flag>\n");
+ debugPrintf("Syntax: queryflag <flag>\n");
}
return true;
}
-bool Debugger::cmd_listTimers(int argc, const char **argv) {
- DebugPrintf("Current time: %-8u\n", g_system->getMillis());
+bool Debugger::cmdListTimers(int argc, const char **argv) {
+ debugPrintf("Current time: %-8u\n", g_system->getMillis());
for (int i = 0; i < _vm->timer()->count(); i++)
- DebugPrintf("Timer %-2i: Active: %-3s Countdown: %-6i %-8u\n", i, _vm->timer()->isEnabled(i) ? "Yes" : "No", _vm->timer()->getDelay(i), _vm->timer()->getNextRun(i));
+ debugPrintf("Timer %-2i: Active: %-3s Countdown: %-6i %-8u\n", i, _vm->timer()->isEnabled(i) ? "Yes" : "No", _vm->timer()->getDelay(i), _vm->timer()->getNextRun(i));
return true;
}
-bool Debugger::cmd_setTimerCountdown(int argc, const char **argv) {
+bool Debugger::cmdSetTimerCountdown(int argc, const char **argv) {
if (argc > 2) {
uint timer = atoi(argv[1]);
uint countdown = atoi(argv[2]);
_vm->timer()->setCountdown(timer, countdown);
- DebugPrintf("Timer %i now has countdown %i\n", timer, _vm->timer()->getDelay(timer));
+ debugPrintf("Timer %i now has countdown %i\n", timer, _vm->timer()->getDelay(timer));
} else {
- DebugPrintf("Syntax: settimercountdown <timer> <countdown>\n");
+ debugPrintf("Syntax: settimercountdown <timer> <countdown>\n");
}
return true;
@@ -204,21 +204,21 @@ Debugger_LoK::Debugger_LoK(KyraEngine_LoK *vm)
}
void Debugger_LoK::initialize() {
- DCmd_Register("enter", WRAP_METHOD(Debugger_LoK, cmd_enterRoom));
- DCmd_Register("scenes", WRAP_METHOD(Debugger_LoK, cmd_listScenes));
- DCmd_Register("give", WRAP_METHOD(Debugger_LoK, cmd_giveItem));
- DCmd_Register("birthstones", WRAP_METHOD(Debugger_LoK, cmd_listBirthstones));
+ registerCmd("enter", WRAP_METHOD(Debugger_LoK, cmdEnterRoom));
+ registerCmd("scenes", WRAP_METHOD(Debugger_LoK, cmdListScenes));
+ registerCmd("give", WRAP_METHOD(Debugger_LoK, cmdGiveItem));
+ registerCmd("birthstones", WRAP_METHOD(Debugger_LoK, cmdListBirthstones));
Debugger::initialize();
}
-bool Debugger_LoK::cmd_enterRoom(int argc, const char **argv) {
+bool Debugger_LoK::cmdEnterRoom(int argc, const char **argv) {
uint direction = 0;
if (argc > 1) {
int room = atoi(argv[1]);
// game will crash if entering a non-existent room
if (room >= _vm->_roomTableSize) {
- DebugPrintf("room number must be any value between (including) 0 and %d\n", _vm->_roomTableSize - 1);
+ debugPrintf("room number must be any value between (including) 0 and %d\n", _vm->_roomTableSize - 1);
return true;
}
@@ -246,44 +246,44 @@ bool Debugger_LoK::cmd_enterRoom(int argc, const char **argv) {
return false;
}
- DebugPrintf("Syntax: room <roomnum> <direction>\n");
+ debugPrintf("Syntax: room <roomnum> <direction>\n");
return true;
}
-bool Debugger_LoK::cmd_listScenes(int argc, const char **argv) {
+bool Debugger_LoK::cmdListScenes(int argc, const char **argv) {
for (int i = 0; i < _vm->_roomTableSize; i++) {
- DebugPrintf("%-3i: %-10s", i, _vm->_roomFilenameTable[_vm->_roomTable[i].nameIndex]);
+ debugPrintf("%-3i: %-10s", i, _vm->_roomFilenameTable[_vm->_roomTable[i].nameIndex]);
if (!(i % 8))
- DebugPrintf("\n");
+ debugPrintf("\n");
}
- DebugPrintf("\n");
- DebugPrintf("Current room: %i\n", _vm->_currentRoom);
+ debugPrintf("\n");
+ debugPrintf("Current room: %i\n", _vm->_currentRoom);
return true;
}
-bool Debugger_LoK::cmd_giveItem(int argc, const char **argv) {
+bool Debugger_LoK::cmdGiveItem(int argc, const char **argv) {
if (argc == 2) {
int item = atoi(argv[1]);
// Kyrandia 1 has only 108 items (-1 to 106), otherwise it will crash
if (item < -1 || item > 106) {
- DebugPrintf("'itemid' must be any value between (including) -1 and 106\n");
+ debugPrintf("'itemid' must be any value between (including) -1 and 106\n");
return true;
}
_vm->setMouseItem(item);
_vm->_itemInHand = item;
} else {
- DebugPrintf("Syntax: give <itemid>\n");
+ debugPrintf("Syntax: give <itemid>\n");
}
return true;
}
-bool Debugger_LoK::cmd_listBirthstones(int argc, const char **argv) {
- DebugPrintf("Needed birthstone gems:\n");
+bool Debugger_LoK::cmdListBirthstones(int argc, const char **argv) {
+ debugPrintf("Needed birthstone gems:\n");
for (int i = 0; i < ARRAYSIZE(_vm->_birthstoneGemTable); ++i)
- DebugPrintf("%-3d '%s'\n", _vm->_birthstoneGemTable[i], _vm->_itemList[_vm->_birthstoneGemTable[i]]);
+ debugPrintf("%-3d '%s'\n", _vm->_birthstoneGemTable[i], _vm->_itemList[_vm->_birthstoneGemTable[i]]);
return true;
}
@@ -293,23 +293,23 @@ Debugger_v2::Debugger_v2(KyraEngine_v2 *vm) : Debugger(vm), _vm(vm) {
}
void Debugger_v2::initialize() {
- DCmd_Register("character_info", WRAP_METHOD(Debugger_v2, cmd_characterInfo));
- DCmd_Register("enter", WRAP_METHOD(Debugger_v2, cmd_enterScene));
- DCmd_Register("scenes", WRAP_METHOD(Debugger_v2, cmd_listScenes));
- DCmd_Register("scene_info", WRAP_METHOD(Debugger_v2, cmd_sceneInfo));
- DCmd_Register("scene_to_facing", WRAP_METHOD(Debugger_v2, cmd_sceneToFacing));
- DCmd_Register("give", WRAP_METHOD(Debugger_v2, cmd_giveItem));
+ registerCmd("character_info", WRAP_METHOD(Debugger_v2, cmdCharacterInfo));
+ registerCmd("enter", WRAP_METHOD(Debugger_v2, cmdEnterScene));
+ registerCmd("scenes", WRAP_METHOD(Debugger_v2, cmdListScenes));
+ registerCmd("scene_info", WRAP_METHOD(Debugger_v2, cmdSceneInfo));
+ registerCmd("scene_to_facing", WRAP_METHOD(Debugger_v2, cmdSceneToFacing));
+ registerCmd("give", WRAP_METHOD(Debugger_v2, cmdGiveItem));
Debugger::initialize();
}
-bool Debugger_v2::cmd_enterScene(int argc, const char **argv) {
+bool Debugger_v2::cmdEnterScene(int argc, const char **argv) {
uint direction = 0;
if (argc > 1) {
int scene = atoi(argv[1]);
// game will crash if entering a non-existent scene
if (scene >= _vm->_sceneListSize) {
- DebugPrintf("scene number must be any value between (including) 0 and %d\n", _vm->_sceneListSize - 1);
+ debugPrintf("scene number must be any value between (including) 0 and %d\n", _vm->_sceneListSize - 1);
return true;
}
@@ -337,40 +337,40 @@ bool Debugger_v2::cmd_enterScene(int argc, const char **argv) {
return false;
}
- DebugPrintf("Syntax: %s <scenenum> <direction>\n", argv[0]);
+ debugPrintf("Syntax: %s <scenenum> <direction>\n", argv[0]);
return true;
}
-bool Debugger_v2::cmd_listScenes(int argc, const char **argv) {
+bool Debugger_v2::cmdListScenes(int argc, const char **argv) {
int shown = 1;
for (int i = 0; i < _vm->_sceneListSize; ++i) {
if (_vm->_sceneList[i].filename1[0]) {
- DebugPrintf("%-2i: %-10s", i, _vm->_sceneList[i].filename1);
+ debugPrintf("%-2i: %-10s", i, _vm->_sceneList[i].filename1);
if (!(shown % 5))
- DebugPrintf("\n");
+ debugPrintf("\n");
++shown;
}
}
- DebugPrintf("\n");
- DebugPrintf("Current scene: %i\n", _vm->_currentScene);
+ debugPrintf("\n");
+ debugPrintf("Current scene: %i\n", _vm->_currentScene);
return true;
}
-bool Debugger_v2::cmd_sceneInfo(int argc, const char **argv) {
- DebugPrintf("Current scene: %d '%s'\n", _vm->_currentScene, _vm->_sceneList[_vm->_currentScene].filename1);
- DebugPrintf("\n");
- DebugPrintf("Exit information:\n");
- DebugPrintf("Exit1: leads to %d, position %dx%d\n", int16(_vm->_sceneExit1), _vm->_sceneEnterX1, _vm->_sceneEnterY1);
- DebugPrintf("Exit2: leads to %d, position %dx%d\n", int16(_vm->_sceneExit2), _vm->_sceneEnterX2, _vm->_sceneEnterY2);
- DebugPrintf("Exit3: leads to %d, position %dx%d\n", int16(_vm->_sceneExit3), _vm->_sceneEnterX3, _vm->_sceneEnterY3);
- DebugPrintf("Exit4: leads to %d, position %dx%d\n", int16(_vm->_sceneExit4), _vm->_sceneEnterX4, _vm->_sceneEnterY4);
- DebugPrintf("Special exit information:\n");
+bool Debugger_v2::cmdSceneInfo(int argc, const char **argv) {
+ debugPrintf("Current scene: %d '%s'\n", _vm->_currentScene, _vm->_sceneList[_vm->_currentScene].filename1);
+ debugPrintf("\n");
+ debugPrintf("Exit information:\n");
+ debugPrintf("Exit1: leads to %d, position %dx%d\n", int16(_vm->_sceneExit1), _vm->_sceneEnterX1, _vm->_sceneEnterY1);
+ debugPrintf("Exit2: leads to %d, position %dx%d\n", int16(_vm->_sceneExit2), _vm->_sceneEnterX2, _vm->_sceneEnterY2);
+ debugPrintf("Exit3: leads to %d, position %dx%d\n", int16(_vm->_sceneExit3), _vm->_sceneEnterX3, _vm->_sceneEnterY3);
+ debugPrintf("Exit4: leads to %d, position %dx%d\n", int16(_vm->_sceneExit4), _vm->_sceneEnterX4, _vm->_sceneEnterY4);
+ debugPrintf("Special exit information:\n");
if (!_vm->_specialExitCount) {
- DebugPrintf("No special exits.\n");
+ debugPrintf("No special exits.\n");
} else {
- DebugPrintf("This scene has %d special exits.\n", _vm->_specialExitCount);
+ debugPrintf("This scene has %d special exits.\n", _vm->_specialExitCount);
for (int i = 0; i < _vm->_specialExitCount; ++i) {
- DebugPrintf("SpecialExit%d: facing %d, position (x1/y1/x2/y2): %d/%d/%d/%d\n", i,
+ debugPrintf("SpecialExit%d: facing %d, position (x1/y1/x2/y2): %d/%d/%d/%d\n", i,
_vm->_specialExitTable[20 + i], _vm->_specialExitTable[0 + i], _vm->_specialExitTable[5 + i],
_vm->_specialExitTable[10 + i], _vm->_specialExitTable[15 + i]);
}
@@ -379,20 +379,20 @@ bool Debugger_v2::cmd_sceneInfo(int argc, const char **argv) {
return true;
}
-bool Debugger_v2::cmd_characterInfo(int argc, const char **argv) {
- DebugPrintf("Main character is in scene: %d '%s'\n", _vm->_mainCharacter.sceneId, _vm->_sceneList[_vm->_mainCharacter.sceneId].filename1);
- DebugPrintf("Position: %dx%d\n", _vm->_mainCharacter.x1, _vm->_mainCharacter.y1);
- DebugPrintf("Facing: %d\n", _vm->_mainCharacter.facing);
- DebugPrintf("Inventory:\n");
+bool Debugger_v2::cmdCharacterInfo(int argc, const char **argv) {
+ debugPrintf("Main character is in scene: %d '%s'\n", _vm->_mainCharacter.sceneId, _vm->_sceneList[_vm->_mainCharacter.sceneId].filename1);
+ debugPrintf("Position: %dx%d\n", _vm->_mainCharacter.x1, _vm->_mainCharacter.y1);
+ debugPrintf("Facing: %d\n", _vm->_mainCharacter.facing);
+ debugPrintf("Inventory:\n");
for (int i = 0; i < 20; ++i) {
- DebugPrintf("%-2d ", int8(_vm->_mainCharacter.inventory[i]));
+ debugPrintf("%-2d ", int8(_vm->_mainCharacter.inventory[i]));
if (i == 9 || i == 19)
- DebugPrintf("\n");
+ debugPrintf("\n");
}
return true;
}
-bool Debugger_v2::cmd_sceneToFacing(int argc, const char **argv) {
+bool Debugger_v2::cmdSceneToFacing(int argc, const char **argv) {
if (argc == 2) {
int facing = atoi(argv[1]);
int16 exit = -1;
@@ -418,26 +418,26 @@ bool Debugger_v2::cmd_sceneToFacing(int argc, const char **argv) {
break;
}
- DebugPrintf("Exit to facing %d leads to room %d.\n", facing, exit);
+ debugPrintf("Exit to facing %d leads to room %d.\n", facing, exit);
} else {
- DebugPrintf("Usage: %s <facing>\n", argv[0]);
+ debugPrintf("Usage: %s <facing>\n", argv[0]);
}
return true;
}
-bool Debugger_v2::cmd_giveItem(int argc, const char **argv) {
+bool Debugger_v2::cmdGiveItem(int argc, const char **argv) {
if (argc == 2) {
int item = atoi(argv[1]);
if (item < -1 || item > _vm->engineDesc().maxItemId) {
- DebugPrintf("itemid must be any value between (including) -1 and %d\n", _vm->engineDesc().maxItemId);
+ debugPrintf("itemid must be any value between (including) -1 and %d\n", _vm->engineDesc().maxItemId);
return true;
}
_vm->setHandItem(item);
} else {
- DebugPrintf("Syntax: give <itemid>\n");
+ debugPrintf("Syntax: give <itemid>\n");
}
return true;
@@ -449,22 +449,22 @@ Debugger_HoF::Debugger_HoF(KyraEngine_HoF *vm) : Debugger_v2(vm), _vm(vm) {
}
void Debugger_HoF::initialize() {
- DCmd_Register("pass_codes", WRAP_METHOD(Debugger_HoF, cmd_passcodes));
+ registerCmd("pass_codes", WRAP_METHOD(Debugger_HoF, cmdPasscodes));
Debugger_v2::initialize();
}
-bool Debugger_HoF::cmd_passcodes(int argc, const char **argv) {
+bool Debugger_HoF::cmdPasscodes(int argc, const char **argv) {
if (argc == 2) {
int val = atoi(argv[1]);
if (val < 0 || val > 1) {
- DebugPrintf("value must be either 1 (on) or 0 (off)\n");
+ debugPrintf("value must be either 1 (on) or 0 (off)\n");
return true;
}
_vm->_dbgPass = val;
} else {
- DebugPrintf("Syntax: pass_codes <0/1>\n");
+ debugPrintf("Syntax: pass_codes <0/1>\n");
}
return true;
@@ -482,43 +482,43 @@ Debugger_EoB::Debugger_EoB(EoBCoreEngine *vm) : Debugger(vm), _vm(vm) {
}
void Debugger_EoB::initialize() {
- DCmd_Register("import_savefile", WRAP_METHOD(Debugger_EoB, cmd_importSaveFile));
- DCmd_Register("save_original", WRAP_METHOD(Debugger_EoB, cmd_saveOriginal));
- DCmd_Register("list_monsters", WRAP_METHOD(Debugger_EoB, cmd_listMonsters));
- DCmd_Register("show_position", WRAP_METHOD(Debugger_EoB, cmd_showPosition));
- DCmd_Register("set_position", WRAP_METHOD(Debugger_EoB, cmd_setPosition));
- DCmd_Register("open_door", WRAP_METHOD(Debugger_EoB, cmd_openDoor));
- DCmd_Register("close_door", WRAP_METHOD(Debugger_EoB, cmd_closeDoor));
- DCmd_Register("list_flags", WRAP_METHOD(Debugger_EoB, cmd_listFlags));
- DCmd_Register("set_flag", WRAP_METHOD(Debugger_EoB, cmd_setFlag));
- DCmd_Register("clear_flag", WRAP_METHOD(Debugger_EoB, cmd_clearFlag));
-}
-
-bool Debugger_EoB::cmd_importSaveFile(int argc, const char **argv) {
+ registerCmd("import_savefile", WRAP_METHOD(Debugger_EoB, cmdImportSaveFile));
+ registerCmd("save_original", WRAP_METHOD(Debugger_EoB, cmdSaveOriginal));
+ registerCmd("list_monsters", WRAP_METHOD(Debugger_EoB, cmdListMonsters));
+ registerCmd("show_position", WRAP_METHOD(Debugger_EoB, cmdShowPosition));
+ registerCmd("set_position", WRAP_METHOD(Debugger_EoB, cmdSetPosition));
+ registerCmd("open_door", WRAP_METHOD(Debugger_EoB, cmdOpenDoor));
+ registerCmd("close_door", WRAP_METHOD(Debugger_EoB, cmdCloseDoor));
+ registerCmd("list_flags", WRAP_METHOD(Debugger_EoB, cmdListFlags));
+ registerCmd("set_flag", WRAP_METHOD(Debugger_EoB, cmdSetFlag));
+ registerCmd("clear_flag", WRAP_METHOD(Debugger_EoB, cmdClearFlag));
+}
+
+bool Debugger_EoB::cmdImportSaveFile(int argc, const char **argv) {
if (!_vm->_allowImport) {
- DebugPrintf("This command only works from the main menu.\n");
+ debugPrintf("This command only works from the main menu.\n");
return true;
}
if (argc == 3) {
int slot = atoi(argv[1]);
if (slot < -1 || slot > 989) {
- DebugPrintf("slot must be between (including) -1 and 989 \n");
+ debugPrintf("slot must be between (including) -1 and 989 \n");
return true;
}
- DebugPrintf(_vm->importOriginalSaveFile(slot, argv[2]) ? "Success.\n" : "Failure.\n");
+ debugPrintf(_vm->importOriginalSaveFile(slot, argv[2]) ? "Success.\n" : "Failure.\n");
_vm->loadItemDefs();
} else {
- DebugPrintf("Syntax: import_savefile <dest slot> <source file>\n (Imports source save game file to dest slot.)\n import_savefile -1\n (Imports all original save game files found and puts them into the first available slots.)\n\n");
+ debugPrintf("Syntax: import_savefile <dest slot> <source file>\n (Imports source save game file to dest slot.)\n import_savefile -1\n (Imports all original save game files found and puts them into the first available slots.)\n\n");
}
return true;
}
-bool Debugger_EoB::cmd_saveOriginal(int argc, const char **argv) {
+bool Debugger_EoB::cmdSaveOriginal(int argc, const char **argv) {
if (!_vm->_runFlag) {
- DebugPrintf("This command doesn't work during intro or outro sequences,\nfrom the main menu or from the character generation.\n");
+ debugPrintf("This command doesn't work during intro or outro sequences,\nfrom the main menu or from the character generation.\n");
return true;
}
@@ -535,57 +535,57 @@ bool Debugger_EoB::cmd_saveOriginal(int argc, const char **argv) {
if (_vm->saveAsOriginalSaveFile()) {
Common::FSNode nf = nd.getChild(Common::String::format("EOBDATA.SAV"));
if (nf.isReadable())
- DebugPrintf("Saved to file: %s\n\n", nf.getPath().c_str());
+ debugPrintf("Saved to file: %s\n\n", nf.getPath().c_str());
else
- DebugPrintf("Failure.\n");
+ debugPrintf("Failure.\n");
} else {
- DebugPrintf("Failure.\n");
+ debugPrintf("Failure.\n");
}
} else {
- DebugPrintf("Syntax: save_original\n (Saves game in original file format to a file which can be used with the orginal game executable.)\n\n");
+ debugPrintf("Syntax: save_original\n (Saves game in original file format to a file which can be used with the orginal game executable.)\n\n");
}
return true;
} else if (argc == 2) {
int slot = atoi(argv[1]);
if (slot < 0 || slot > 5) {
- DebugPrintf("Slot must be between (including) 0 and 5.\n");
+ debugPrintf("Slot must be between (including) 0 and 5.\n");
} else if (_vm->saveAsOriginalSaveFile(slot)) {
Common::FSNode nf = nd.getChild(Common::String::format("EOBDATA%d.SAV", slot));
if (nf.isReadable())
- DebugPrintf("Saved to file: %s\n\n", nf.getPath().c_str());
+ debugPrintf("Saved to file: %s\n\n", nf.getPath().c_str());
else
- DebugPrintf("Failure.\n");
+ debugPrintf("Failure.\n");
} else {
- DebugPrintf("Failure.\n");
+ debugPrintf("Failure.\n");
}
return true;
}
- DebugPrintf("Syntax: save_original <slot>\n (Saves game in original file format to a file which can be used with the orginal game executable.\n A save slot between 0 and 5 must be specified.)\n\n");
+ debugPrintf("Syntax: save_original <slot>\n (Saves game in original file format to a file which can be used with the orginal game executable.\n A save slot between 0 and 5 must be specified.)\n\n");
return true;
}
-bool Debugger_EoB::cmd_listMonsters(int, const char **) {
- DebugPrintf("\nCurrent level: %d\n----------------------\n\n", _vm->_currentLevel);
- DebugPrintf("Id Type Unit Block Position Direction Sub Level Mode Dst.block HP Flags\n--------------------------------------------------------------------------------------------------------------\n");
+bool Debugger_EoB::cmdListMonsters(int, const char **) {
+ debugPrintf("\nCurrent level: %d\n----------------------\n\n", _vm->_currentLevel);
+ debugPrintf("Id Type Unit Block Position Direction Sub Level Mode Dst.block HP Flags\n--------------------------------------------------------------------------------------------------------------\n");
for (int i = 0; i < 30; i++) {
EoBMonsterInPlay *m = &_vm->_monsters[i];
- DebugPrintf("%.02d %.02d %.02d 0x%.04x %d %d %d %.02d 0x%.04x %.03d/%.03d 0x%.02x\n", i, m->type, m->unit, m->block, m->pos, m->dir, m->sub, m->mode, m->dest, m->hitPointsCur, m->hitPointsMax, m->flags);
+ debugPrintf("%.02d %.02d %.02d 0x%.04x %d %d %d %.02d 0x%.04x %.03d/%.03d 0x%.02x\n", i, m->type, m->unit, m->block, m->pos, m->dir, m->sub, m->mode, m->dest, m->hitPointsCur, m->hitPointsMax, m->flags);
}
- DebugPrintf("\n");
+ debugPrintf("\n");
return true;
}
-bool Debugger_EoB::cmd_showPosition(int, const char **) {
- DebugPrintf("\nCurrent level: %d\nCurrent Sub Level: %d\nCurrent block: %d (0x%.04x)\nNext block: %d (0x%.04x)\nCurrent direction: %d\n\n", _vm->_currentLevel, _vm->_currentSub, _vm->_currentBlock, _vm->_currentBlock, _vm->calcNewBlockPosition(_vm->_currentBlock, _vm->_currentDirection), _vm->calcNewBlockPosition(_vm->_currentBlock, _vm->_currentDirection), _vm->_currentDirection);
+bool Debugger_EoB::cmdShowPosition(int, const char **) {
+ debugPrintf("\nCurrent level: %d\nCurrent Sub Level: %d\nCurrent block: %d (0x%.04x)\nNext block: %d (0x%.04x)\nCurrent direction: %d\n\n", _vm->_currentLevel, _vm->_currentSub, _vm->_currentBlock, _vm->_currentBlock, _vm->calcNewBlockPosition(_vm->_currentBlock, _vm->_currentDirection), _vm->calcNewBlockPosition(_vm->_currentBlock, _vm->_currentDirection), _vm->_currentDirection);
return true;
}
-bool Debugger_EoB::cmd_setPosition(int argc, const char **argv) {
+bool Debugger_EoB::cmdSetPosition(int argc, const char **argv) {
if (argc == 4) {
_vm->_currentBlock = atoi(argv[3]);
int sub = atoi(argv[2]);
@@ -593,7 +593,7 @@ bool Debugger_EoB::cmd_setPosition(int argc, const char **argv) {
int maxLevel = (_vm->game() == GI_EOB1) ? 12 : 16;
if (level < 1 || level > maxLevel) {
- DebugPrintf("<level> must be a value from 1 to %d.\n\n", maxLevel);
+ debugPrintf("<level> must be a value from 1 to %d.\n\n", maxLevel);
return true;
}
@@ -613,83 +613,83 @@ bool Debugger_EoB::cmd_setPosition(int argc, const char **argv) {
_vm->_sceneUpdateRequired = true;
_vm->gui_drawAllCharPortraitsWithStats();
- DebugPrintf("Success.\n\n");
+ debugPrintf("Success.\n\n");
} else {
- DebugPrintf("Syntax: set_position <level>, <sub level>, <block>\n");
- DebugPrintf(" (Warning: The sub level and block position parameters will not be checked. Invalid parameters may cause problems.)\n\n");
+ debugPrintf("Syntax: set_position <level>, <sub level>, <block>\n");
+ debugPrintf(" (Warning: The sub level and block position parameters will not be checked. Invalid parameters may cause problems.)\n\n");
}
return true;
}
-bool Debugger_EoB::cmd_openDoor(int, const char **) {
- DebugPrintf("Warning: Using this command may cause glitches.\n");
+bool Debugger_EoB::cmdOpenDoor(int, const char **) {
+ debugPrintf("Warning: Using this command may cause glitches.\n");
uint16 block = _vm->calcNewBlockPosition(_vm->_currentBlock, _vm->_currentDirection);
int c = (_vm->_wllWallFlags[_vm->_levelBlockProperties[block].walls[0]] & 8) ? 0 : 1;
int v = _vm->_levelBlockProperties[block].walls[c];
int flg = (_vm->_flags.gameID == GI_EOB1) ? 1 : 0x10;
if (_vm->_wllWallFlags[v] & flg) {
- DebugPrintf("Couldn't open any door. Make sure you're facing the door you wish to open and standing right in front of it.\n\n");
+ debugPrintf("Couldn't open any door. Make sure you're facing the door you wish to open and standing right in front of it.\n\n");
} else {
_vm->openDoor(block);
- DebugPrintf("Trying to open door at block %d.\n\n", block);
+ debugPrintf("Trying to open door at block %d.\n\n", block);
}
return true;
}
-bool Debugger_EoB::cmd_closeDoor(int, const char **) {
- DebugPrintf("Warning: Using this command may cause glitches.\n");
+bool Debugger_EoB::cmdCloseDoor(int, const char **) {
+ debugPrintf("Warning: Using this command may cause glitches.\n");
uint16 block = _vm->calcNewBlockPosition(_vm->_currentBlock, _vm->_currentDirection);
int c = (_vm->_wllWallFlags[_vm->_levelBlockProperties[block].walls[0]] & 8) ? 0 : 1;
int v = _vm->_levelBlockProperties[block].walls[c];
if ((_vm->_flags.gameID == GI_EOB1 && !(_vm->_wllWallFlags[v] & 1)) || (_vm->_flags.gameID == GI_EOB2 && (_vm->_wllWallFlags[v] & 0x20))) {
- DebugPrintf("Couldn't close any door. Make sure you're facing the door you wish to close and standing right in front of it.\n\n");
+ debugPrintf("Couldn't close any door. Make sure you're facing the door you wish to close and standing right in front of it.\n\n");
} else {
_vm->closeDoor(block);
- DebugPrintf("Trying to close door at block %d.\n\n", block);
+ debugPrintf("Trying to close door at block %d.\n\n", block);
}
return true;
}
-bool Debugger_EoB::cmd_listFlags(int, const char **) {
- DebugPrintf("Flag Status\n----------------------\n\n");
+bool Debugger_EoB::cmdListFlags(int, const char **) {
+ debugPrintf("Flag Status\n----------------------\n\n");
for (int i = 0; i < 32; i++) {
uint32 flag = 1 << i;
- DebugPrintf("%.2d %s\n", i, _vm->checkScriptFlags(flag) ? "TRUE" : "FALSE");
+ debugPrintf("%.2d %s\n", i, _vm->checkScriptFlags(flag) ? "TRUE" : "FALSE");
}
- DebugPrintf("\n");
+ debugPrintf("\n");
return true;
}
-bool Debugger_EoB::cmd_setFlag(int argc, const char **argv) {
+bool Debugger_EoB::cmdSetFlag(int argc, const char **argv) {
if (argc != 2) {
- DebugPrintf("Syntax: set_flag <flag>\n\n");
+ debugPrintf("Syntax: set_flag <flag>\n\n");
return true;
}
int flag = atoi(argv[1]);
if (flag < 0 || flag > 31) {
- DebugPrintf("<flag> must be a value from 0 to 31.\n\n");
+ debugPrintf("<flag> must be a value from 0 to 31.\n\n");
} else {
_vm->setScriptFlags(1 << flag);
- DebugPrintf("Flag '%.2d' has been set.\n\n", flag);
+ debugPrintf("Flag '%.2d' has been set.\n\n", flag);
}
return true;
}
-bool Debugger_EoB::cmd_clearFlag(int argc, const char **argv) {
+bool Debugger_EoB::cmdClearFlag(int argc, const char **argv) {
if (argc != 2) {
- DebugPrintf("Syntax: clear_flag <flag>\n\n");
+ debugPrintf("Syntax: clear_flag <flag>\n\n");
return true;
}
int flag = atoi(argv[1]);
if (flag < 0 || flag > 31) {
- DebugPrintf("<flag> must be a value from 0 to 31.\n\n");
+ debugPrintf("<flag> must be a value from 0 to 31.\n\n");
} else {
_vm->clearScriptFlags(1 << flag);
- DebugPrintf("Flag '%.2d' has been cleared.\n\n", flag);
+ debugPrintf("Flag '%.2d' has been cleared.\n\n", flag);
}
return true;
diff --git a/engines/kyra/debugger.h b/engines/kyra/debugger.h
index c1056a6cf3..15cee2d592 100644
--- a/engines/kyra/debugger.h
+++ b/engines/kyra/debugger.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -42,15 +42,15 @@ public:
protected:
KyraEngine_v1 *_vm;
- bool cmd_setScreenDebug(int argc, const char **argv);
- bool cmd_loadPalette(int argc, const char **argv);
- bool cmd_showFacings(int argc, const char **argv);
- bool cmd_gameSpeed(int argc, const char **argv);
- bool cmd_listFlags(int argc, const char **argv);
- bool cmd_toggleFlag(int argc, const char **argv);
- bool cmd_queryFlag(int argc, const char **argv);
- bool cmd_listTimers(int argc, const char **argv);
- bool cmd_setTimerCountdown(int argc, const char **argv);
+ bool cmdSetScreenDebug(int argc, const char **argv);
+ bool cmdLoadPalette(int argc, const char **argv);
+ bool cmdShowFacings(int argc, const char **argv);
+ bool cmdGameSpeed(int argc, const char **argv);
+ bool cmdListFlags(int argc, const char **argv);
+ bool cmdToggleFlag(int argc, const char **argv);
+ bool cmdQueryFlag(int argc, const char **argv);
+ bool cmdListTimers(int argc, const char **argv);
+ bool cmdSetTimerCountdown(int argc, const char **argv);
};
class Debugger_LoK : public Debugger {
@@ -62,10 +62,10 @@ public:
protected:
KyraEngine_LoK *_vm;
- bool cmd_enterRoom(int argc, const char **argv);
- bool cmd_listScenes(int argc, const char **argv);
- bool cmd_giveItem(int argc, const char **argv);
- bool cmd_listBirthstones(int argc, const char **argv);
+ bool cmdEnterRoom(int argc, const char **argv);
+ bool cmdListScenes(int argc, const char **argv);
+ bool cmdGiveItem(int argc, const char **argv);
+ bool cmdListBirthstones(int argc, const char **argv);
};
class Debugger_v2 : public Debugger {
@@ -77,12 +77,12 @@ public:
protected:
KyraEngine_v2 *_vm;
- bool cmd_enterScene(int argc, const char **argv);
- bool cmd_listScenes(int argc, const char **argv);
- bool cmd_sceneInfo(int argc, const char **argv);
- bool cmd_characterInfo(int argc, const char **argv);
- bool cmd_sceneToFacing(int argc, const char **argv);
- bool cmd_giveItem(int argc, const char **argv);
+ bool cmdEnterScene(int argc, const char **argv);
+ bool cmdListScenes(int argc, const char **argv);
+ bool cmdSceneInfo(int argc, const char **argv);
+ bool cmdCharacterInfo(int argc, const char **argv);
+ bool cmdSceneToFacing(int argc, const char **argv);
+ bool cmdGiveItem(int argc, const char **argv);
};
class Debugger_HoF : public Debugger_v2 {
@@ -93,7 +93,7 @@ public:
protected:
KyraEngine_HoF *_vm;
- bool cmd_passcodes(int argc, const char **argv);
+ bool cmdPasscodes(int argc, const char **argv);
};
#ifdef ENABLE_LOL
@@ -119,16 +119,16 @@ public:
protected:
EoBCoreEngine *_vm;
- bool cmd_importSaveFile(int argc, const char **argv);
- bool cmd_saveOriginal(int argc, const char **argv);
- bool cmd_listMonsters(int argc, const char **argv);
- bool cmd_showPosition(int argc, const char **argv);
- bool cmd_setPosition(int argc, const char **argv);
- bool cmd_openDoor(int argc, const char **argv);
- bool cmd_closeDoor(int argc, const char **argv);
- bool cmd_listFlags(int argc, const char **argv);
- bool cmd_setFlag(int argc, const char **argv);
- bool cmd_clearFlag(int argc, const char **argv);
+ bool cmdImportSaveFile(int argc, const char **argv);
+ bool cmdSaveOriginal(int argc, const char **argv);
+ bool cmdListMonsters(int argc, const char **argv);
+ bool cmdShowPosition(int argc, const char **argv);
+ bool cmdSetPosition(int argc, const char **argv);
+ bool cmdOpenDoor(int argc, const char **argv);
+ bool cmdCloseDoor(int argc, const char **argv);
+ bool cmdListFlags(int argc, const char **argv);
+ bool cmdSetFlag(int argc, const char **argv);
+ bool cmdClearFlag(int argc, const char **argv);
};
#endif // ENABLE_EOB
diff --git a/engines/kyra/detection_tables.h b/engines/kyra/detection_tables.h
index f59d173fe6..1ada9a87ba 100644
--- a/engines/kyra/detection_tables.h
+++ b/engines/kyra/detection_tables.h
@@ -17,6 +17,7 @@
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
*/
namespace {
diff --git a/engines/kyra/eob.cpp b/engines/kyra/eob.cpp
index 405ea2129a..6a6b20baac 100644
--- a/engines/kyra/eob.cpp
+++ b/engines/kyra/eob.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/kyra/eob.h b/engines/kyra/eob.h
index b423b0da9d..09b6380c91 100644
--- a/engines/kyra/eob.h
+++ b/engines/kyra/eob.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/kyra/eobcommon.cpp b/engines/kyra/eobcommon.cpp
index d477209e5b..38a5ab8440 100644
--- a/engines/kyra/eobcommon.cpp
+++ b/engines/kyra/eobcommon.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/kyra/eobcommon.h b/engines/kyra/eobcommon.h
index 6421159dbe..1401d59dae 100644
--- a/engines/kyra/eobcommon.h
+++ b/engines/kyra/eobcommon.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/kyra/gui.cpp b/engines/kyra/gui.cpp
index 1156b17957..e95d78c54d 100644
--- a/engines/kyra/gui.cpp
+++ b/engines/kyra/gui.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/kyra/gui.h b/engines/kyra/gui.h
index 854f10e85d..3e2bdc04cd 100644
--- a/engines/kyra/gui.h
+++ b/engines/kyra/gui.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/kyra/gui_eob.cpp b/engines/kyra/gui_eob.cpp
index 9b4c09d7f4..9456e575db 100644
--- a/engines/kyra/gui_eob.cpp
+++ b/engines/kyra/gui_eob.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/kyra/gui_eob.h b/engines/kyra/gui_eob.h
index 1b7bdf3482..e4daff6ada 100644
--- a/engines/kyra/gui_eob.h
+++ b/engines/kyra/gui_eob.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/kyra/gui_hof.cpp b/engines/kyra/gui_hof.cpp
index 3a2c07beff..8515cf51e0 100644
--- a/engines/kyra/gui_hof.cpp
+++ b/engines/kyra/gui_hof.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope 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.
diff --git a/engines/kyra/gui_hof.h b/engines/kyra/gui_hof.h
index c228c35551..9f6aaae2ca 100644
--- a/engines/kyra/gui_hof.h
+++ b/engines/kyra/gui_hof.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/kyra/gui_lok.cpp b/engines/kyra/gui_lok.cpp
index 8e18ff910d..03b77bf677 100644
--- a/engines/kyra/gui_lok.cpp
+++ b/engines/kyra/gui_lok.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/kyra/gui_lok.h b/engines/kyra/gui_lok.h
index d3e0beaa9e..76a5dc586b 100644
--- a/engines/kyra/gui_lok.h
+++ b/engines/kyra/gui_lok.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/kyra/gui_lol.cpp b/engines/kyra/gui_lol.cpp
index 8808c313fc..cfdf762bba 100644
--- a/engines/kyra/gui_lol.cpp
+++ b/engines/kyra/gui_lol.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/kyra/gui_lol.h b/engines/kyra/gui_lol.h
index 79d4b6b4c9..6fa6571016 100644
--- a/engines/kyra/gui_lol.h
+++ b/engines/kyra/gui_lol.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/kyra/gui_mr.cpp b/engines/kyra/gui_mr.cpp
index ee0303c8c3..7984dde662 100644
--- a/engines/kyra/gui_mr.cpp
+++ b/engines/kyra/gui_mr.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/kyra/gui_mr.h b/engines/kyra/gui_mr.h
index 6303dff83f..62872a5355 100644
--- a/engines/kyra/gui_mr.h
+++ b/engines/kyra/gui_mr.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/kyra/gui_rpg.cpp b/engines/kyra/gui_rpg.cpp
index ab25f95df8..8e77a6e141 100644
--- a/engines/kyra/gui_rpg.cpp
+++ b/engines/kyra/gui_rpg.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/kyra/gui_v1.cpp b/engines/kyra/gui_v1.cpp
index cec6562dd9..a75c14b071 100644
--- a/engines/kyra/gui_v1.cpp
+++ b/engines/kyra/gui_v1.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/kyra/gui_v1.h b/engines/kyra/gui_v1.h
index 260edae8e5..94be09037c 100644
--- a/engines/kyra/gui_v1.h
+++ b/engines/kyra/gui_v1.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/kyra/gui_v2.cpp b/engines/kyra/gui_v2.cpp
index 1df4149d2e..afda573c61 100644
--- a/engines/kyra/gui_v2.cpp
+++ b/engines/kyra/gui_v2.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/kyra/gui_v2.h b/engines/kyra/gui_v2.h
index bdbcce1c4f..34651e4c22 100644
--- a/engines/kyra/gui_v2.h
+++ b/engines/kyra/gui_v2.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/kyra/item.h b/engines/kyra/item.h
index 4b236372a2..cf06aad8ba 100644
--- a/engines/kyra/item.h
+++ b/engines/kyra/item.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/kyra/items_eob.cpp b/engines/kyra/items_eob.cpp
index 6c7ccf14dc..c9c632f60b 100644
--- a/engines/kyra/items_eob.cpp
+++ b/engines/kyra/items_eob.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/kyra/items_hof.cpp b/engines/kyra/items_hof.cpp
index e1d3c659de..2640af5188 100644
--- a/engines/kyra/items_hof.cpp
+++ b/engines/kyra/items_hof.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/kyra/items_lok.cpp b/engines/kyra/items_lok.cpp
index 8ee07e8271..55a23b2a1a 100644
--- a/engines/kyra/items_lok.cpp
+++ b/engines/kyra/items_lok.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/kyra/items_lol.cpp b/engines/kyra/items_lol.cpp
index f4024471d2..f2a9637dfe 100644
--- a/engines/kyra/items_lol.cpp
+++ b/engines/kyra/items_lol.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/kyra/items_mr.cpp b/engines/kyra/items_mr.cpp
index 029f676538..397fab8d8f 100644
--- a/engines/kyra/items_mr.cpp
+++ b/engines/kyra/items_mr.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/kyra/items_v2.cpp b/engines/kyra/items_v2.cpp
index 2145a2c2f0..732fa7c8dd 100644
--- a/engines/kyra/items_v2.cpp
+++ b/engines/kyra/items_v2.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/kyra/kyra_hof.cpp b/engines/kyra/kyra_hof.cpp
index ce9b530dbe..9988899da8 100644
--- a/engines/kyra/kyra_hof.cpp
+++ b/engines/kyra/kyra_hof.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/kyra/kyra_hof.h b/engines/kyra/kyra_hof.h
index 1b84e5b56f..1e500d4286 100644
--- a/engines/kyra/kyra_hof.h
+++ b/engines/kyra/kyra_hof.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/kyra/kyra_lok.cpp b/engines/kyra/kyra_lok.cpp
index 7d4e35092f..80511c674d 100644
--- a/engines/kyra/kyra_lok.cpp
+++ b/engines/kyra/kyra_lok.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/kyra/kyra_lok.h b/engines/kyra/kyra_lok.h
index def5cbcf6f..a10b208389 100644
--- a/engines/kyra/kyra_lok.h
+++ b/engines/kyra/kyra_lok.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/kyra/kyra_mr.cpp b/engines/kyra/kyra_mr.cpp
index 48ba96ec8b..834bda9454 100644
--- a/engines/kyra/kyra_mr.cpp
+++ b/engines/kyra/kyra_mr.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -378,7 +378,6 @@ void KyraEngine_MR::playVQA(const char *name) {
_screen->fadeToBlack(60);
_screen->clearPage(0);
- vqa.setDrawPage(0);
vqa.play();
vqa.close();
diff --git a/engines/kyra/kyra_mr.h b/engines/kyra/kyra_mr.h
index d194fedd4d..787dd4c936 100644
--- a/engines/kyra/kyra_mr.h
+++ b/engines/kyra/kyra_mr.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/kyra/kyra_rpg.cpp b/engines/kyra/kyra_rpg.cpp
index 4f7adcc6e5..635559dcfd 100644
--- a/engines/kyra/kyra_rpg.cpp
+++ b/engines/kyra/kyra_rpg.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/kyra/kyra_rpg.h b/engines/kyra/kyra_rpg.h
index cd36d2a5cd..69fc705ff2 100644
--- a/engines/kyra/kyra_rpg.h
+++ b/engines/kyra/kyra_rpg.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/kyra/kyra_v1.cpp b/engines/kyra/kyra_v1.cpp
index 9194b64155..c8993fea47 100644
--- a/engines/kyra/kyra_v1.cpp
+++ b/engines/kyra/kyra_v1.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/kyra/kyra_v1.h b/engines/kyra/kyra_v1.h
index cd048563ca..c801829855 100644
--- a/engines/kyra/kyra_v1.h
+++ b/engines/kyra/kyra_v1.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/kyra/kyra_v2.cpp b/engines/kyra/kyra_v2.cpp
index 848fb18b6a..925dcf7bfe 100644
--- a/engines/kyra/kyra_v2.cpp
+++ b/engines/kyra/kyra_v2.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/kyra/kyra_v2.h b/engines/kyra/kyra_v2.h
index 563416bf1e..f00c4635b5 100644
--- a/engines/kyra/kyra_v2.h
+++ b/engines/kyra/kyra_v2.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/kyra/lol.cpp b/engines/kyra/lol.cpp
index 3695041b83..5500e8b95f 100644
--- a/engines/kyra/lol.cpp
+++ b/engines/kyra/lol.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/kyra/lol.h b/engines/kyra/lol.h
index 4002346d31..e060b307af 100644
--- a/engines/kyra/lol.h
+++ b/engines/kyra/lol.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/kyra/magic_eob.cpp b/engines/kyra/magic_eob.cpp
index 2180c5359d..a435850e54 100644
--- a/engines/kyra/magic_eob.cpp
+++ b/engines/kyra/magic_eob.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/kyra/resource.cpp b/engines/kyra/resource.cpp
index c350c81742..3c801ee923 100644
--- a/engines/kyra/resource.cpp
+++ b/engines/kyra/resource.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -74,10 +74,14 @@ bool Resource::reset() {
loadProtectedFiles(list);
} else {
+ // We only search in the game path to avoid any invalid PAK or
+ // APK files from being picked up. This might happen, for example,
+ // when the user has an Android package file in the CWD.
+ Common::FSDirectory gameDir(dir);
Common::ArchiveMemberList files;
- _files.listMatchingMembers(files, "*.PAK");
- _files.listMatchingMembers(files, "*.APK");
+ gameDir.listMatchingMembers(files, "*.PAK");
+ gameDir.listMatchingMembers(files, "*.APK");
for (Common::ArchiveMemberList::const_iterator i = files.begin(); i != files.end(); ++i) {
Common::String name = (*i)->getName();
diff --git a/engines/kyra/resource.h b/engines/kyra/resource.h
index 5c179a7864..3ab08a4c7c 100644
--- a/engines/kyra/resource.h
+++ b/engines/kyra/resource.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -566,50 +566,50 @@ enum KyraResources {
kEoB2IntroStrings,
kEoB2IntroCPSFiles,
- kEob2IntroAnimData00,
- kEob2IntroAnimData01,
- kEob2IntroAnimData02,
- kEob2IntroAnimData03,
- kEob2IntroAnimData04,
- kEob2IntroAnimData05,
- kEob2IntroAnimData06,
- kEob2IntroAnimData07,
- kEob2IntroAnimData08,
- kEob2IntroAnimData09,
- kEob2IntroAnimData10,
- kEob2IntroAnimData11,
- kEob2IntroAnimData12,
- kEob2IntroAnimData13,
- kEob2IntroAnimData14,
- kEob2IntroAnimData15,
- kEob2IntroAnimData16,
- kEob2IntroAnimData17,
- kEob2IntroAnimData18,
- kEob2IntroAnimData19,
- kEob2IntroAnimData20,
- kEob2IntroAnimData21,
- kEob2IntroAnimData22,
- kEob2IntroAnimData23,
- kEob2IntroAnimData24,
- kEob2IntroAnimData25,
- kEob2IntroAnimData26,
- kEob2IntroAnimData27,
- kEob2IntroAnimData28,
- kEob2IntroAnimData29,
- kEob2IntroAnimData30,
- kEob2IntroAnimData31,
- kEob2IntroAnimData32,
- kEob2IntroAnimData33,
- kEob2IntroAnimData34,
- kEob2IntroAnimData35,
- kEob2IntroAnimData36,
- kEob2IntroAnimData37,
- kEob2IntroAnimData38,
- kEob2IntroAnimData39,
- kEob2IntroAnimData40,
- kEob2IntroAnimData41,
- kEob2IntroAnimData42,
- kEob2IntroAnimData43,
+ kEoB2IntroAnimData00,
+ kEoB2IntroAnimData01,
+ kEoB2IntroAnimData02,
+ kEoB2IntroAnimData03,
+ kEoB2IntroAnimData04,
+ kEoB2IntroAnimData05,
+ kEoB2IntroAnimData06,
+ kEoB2IntroAnimData07,
+ kEoB2IntroAnimData08,
+ kEoB2IntroAnimData09,
+ kEoB2IntroAnimData10,
+ kEoB2IntroAnimData11,
+ kEoB2IntroAnimData12,
+ kEoB2IntroAnimData13,
+ kEoB2IntroAnimData14,
+ kEoB2IntroAnimData15,
+ kEoB2IntroAnimData16,
+ kEoB2IntroAnimData17,
+ kEoB2IntroAnimData18,
+ kEoB2IntroAnimData19,
+ kEoB2IntroAnimData20,
+ kEoB2IntroAnimData21,
+ kEoB2IntroAnimData22,
+ kEoB2IntroAnimData23,
+ kEoB2IntroAnimData24,
+ kEoB2IntroAnimData25,
+ kEoB2IntroAnimData26,
+ kEoB2IntroAnimData27,
+ kEoB2IntroAnimData28,
+ kEoB2IntroAnimData29,
+ kEoB2IntroAnimData30,
+ kEoB2IntroAnimData31,
+ kEoB2IntroAnimData32,
+ kEoB2IntroAnimData33,
+ kEoB2IntroAnimData34,
+ kEoB2IntroAnimData35,
+ kEoB2IntroAnimData36,
+ kEoB2IntroAnimData37,
+ kEoB2IntroAnimData38,
+ kEoB2IntroAnimData39,
+ kEoB2IntroAnimData40,
+ kEoB2IntroAnimData41,
+ kEoB2IntroAnimData42,
+ kEoB2IntroAnimData43,
kEoB2IntroShapes00,
kEoB2IntroShapes01,
kEoB2IntroShapes04,
@@ -618,27 +618,27 @@ enum KyraResources {
kEoB2FinaleStrings,
kEoB2CreditsData,
kEoB2FinaleCPSFiles,
- kEob2FinaleAnimData00,
- kEob2FinaleAnimData01,
- kEob2FinaleAnimData02,
- kEob2FinaleAnimData03,
- kEob2FinaleAnimData04,
- kEob2FinaleAnimData05,
- kEob2FinaleAnimData06,
- kEob2FinaleAnimData07,
- kEob2FinaleAnimData08,
- kEob2FinaleAnimData09,
- kEob2FinaleAnimData10,
- kEob2FinaleAnimData11,
- kEob2FinaleAnimData12,
- kEob2FinaleAnimData13,
- kEob2FinaleAnimData14,
- kEob2FinaleAnimData15,
- kEob2FinaleAnimData16,
- kEob2FinaleAnimData17,
- kEob2FinaleAnimData18,
- kEob2FinaleAnimData19,
- kEob2FinaleAnimData20,
+ kEoB2FinaleAnimData00,
+ kEoB2FinaleAnimData01,
+ kEoB2FinaleAnimData02,
+ kEoB2FinaleAnimData03,
+ kEoB2FinaleAnimData04,
+ kEoB2FinaleAnimData05,
+ kEoB2FinaleAnimData06,
+ kEoB2FinaleAnimData07,
+ kEoB2FinaleAnimData08,
+ kEoB2FinaleAnimData09,
+ kEoB2FinaleAnimData10,
+ kEoB2FinaleAnimData11,
+ kEoB2FinaleAnimData12,
+ kEoB2FinaleAnimData13,
+ kEoB2FinaleAnimData14,
+ kEoB2FinaleAnimData15,
+ kEoB2FinaleAnimData16,
+ kEoB2FinaleAnimData17,
+ kEoB2FinaleAnimData18,
+ kEoB2FinaleAnimData19,
+ kEoB2FinaleAnimData20,
kEoB2FinaleShapes00,
kEoB2FinaleShapes03,
kEoB2FinaleShapes07,
diff --git a/engines/kyra/resource_intern.cpp b/engines/kyra/resource_intern.cpp
index 4c413487ff..9ec955477f 100644
--- a/engines/kyra/resource_intern.cpp
+++ b/engines/kyra/resource_intern.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/kyra/resource_intern.h b/engines/kyra/resource_intern.h
index e63eab7d6a..530df51f35 100644
--- a/engines/kyra/resource_intern.h
+++ b/engines/kyra/resource_intern.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/kyra/saveload.cpp b/engines/kyra/saveload.cpp
index bacfb62c16..2ae6420bd7 100644
--- a/engines/kyra/saveload.cpp
+++ b/engines/kyra/saveload.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/kyra/saveload_eob.cpp b/engines/kyra/saveload_eob.cpp
index aa223414bc..cca8f3a0a4 100644
--- a/engines/kyra/saveload_eob.cpp
+++ b/engines/kyra/saveload_eob.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/kyra/saveload_hof.cpp b/engines/kyra/saveload_hof.cpp
index 1d28b6bc13..e8e76143bd 100644
--- a/engines/kyra/saveload_hof.cpp
+++ b/engines/kyra/saveload_hof.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/kyra/saveload_lok.cpp b/engines/kyra/saveload_lok.cpp
index f8cca1ab7b..1d729d0103 100644
--- a/engines/kyra/saveload_lok.cpp
+++ b/engines/kyra/saveload_lok.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/kyra/saveload_lol.cpp b/engines/kyra/saveload_lol.cpp
index 6c83ebd51b..e02b8fb22c 100644
--- a/engines/kyra/saveload_lol.cpp
+++ b/engines/kyra/saveload_lol.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/kyra/saveload_mr.cpp b/engines/kyra/saveload_mr.cpp
index c49a528d02..a938003a07 100644
--- a/engines/kyra/saveload_mr.cpp
+++ b/engines/kyra/saveload_mr.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/kyra/saveload_rpg.cpp b/engines/kyra/saveload_rpg.cpp
index d22c50dbeb..8f44960753 100644
--- a/engines/kyra/saveload_rpg.cpp
+++ b/engines/kyra/saveload_rpg.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/kyra/scene_eob.cpp b/engines/kyra/scene_eob.cpp
index cfac5db8b3..84822c3fd2 100644
--- a/engines/kyra/scene_eob.cpp
+++ b/engines/kyra/scene_eob.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/kyra/scene_hof.cpp b/engines/kyra/scene_hof.cpp
index 62690c4766..8ec14e4ac7 100644
--- a/engines/kyra/scene_hof.cpp
+++ b/engines/kyra/scene_hof.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/kyra/scene_lok.cpp b/engines/kyra/scene_lok.cpp
index ea09091af7..df9b11d5a2 100644
--- a/engines/kyra/scene_lok.cpp
+++ b/engines/kyra/scene_lok.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/kyra/scene_lol.cpp b/engines/kyra/scene_lol.cpp
index 154606d46f..391de5e49c 100644
--- a/engines/kyra/scene_lol.cpp
+++ b/engines/kyra/scene_lol.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -620,14 +620,14 @@ void LoLEngine::updateCompass() {
if (_compassStep)
_compassStep -= (((ABS(_compassStep) >> 4) + 2) * dir);
- int16 d = _compassBroken ? (int8(_rnd.getRandomNumber(255)) - _compassDirection) : (_currentDirection << 6) - _compassDirection;
- if (d <= -128)
- d += 256;
- if (d >= 128)
- d -= 256;
+ int16 diff = _compassBroken ? (int8(_rnd.getRandomNumber(255)) - _compassDirection) : (_currentDirection << 6) - _compassDirection;
+ if (diff <= -128)
+ diff += 256;
+ if (diff >= 128)
+ diff -= 256;
- d >>= 2;
- _compassStep += d;
+ diff >>= 2;
+ _compassStep += diff;
_compassStep = CLIP(_compassStep, -24, 24);
_compassDirection += _compassStep;
@@ -636,14 +636,9 @@ void LoLEngine::updateCompass() {
if (_compassDirection > 255)
_compassDirection -= 256;
- if ((_compassDirection >> 6) == _currentDirection && _compassStep < 2) {
- int16 d2 = d >> 16;
- d ^= d2;
- d -= d2;
- if (d < 4) {
- _compassDirection = _currentDirection << 6;
- _compassStep = 0;
- }
+ if (((((_compassDirection + 3) & 0xFD) >> 6) == _currentDirection) && (_compassStep < 2) && (ABS(diff) < 4)) {
+ _compassDirection = _currentDirection << 6;
+ _compassStep = 0;
}
gui_drawCompass();
diff --git a/engines/kyra/scene_mr.cpp b/engines/kyra/scene_mr.cpp
index d2b4907b6a..38ee25f54a 100644
--- a/engines/kyra/scene_mr.cpp
+++ b/engines/kyra/scene_mr.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/kyra/scene_rpg.cpp b/engines/kyra/scene_rpg.cpp
index 927d891a5f..dabc368a27 100644
--- a/engines/kyra/scene_rpg.cpp
+++ b/engines/kyra/scene_rpg.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/kyra/scene_v1.cpp b/engines/kyra/scene_v1.cpp
index 36798970e3..48958e5b90 100644
--- a/engines/kyra/scene_v1.cpp
+++ b/engines/kyra/scene_v1.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/kyra/scene_v2.cpp b/engines/kyra/scene_v2.cpp
index 9b6897f2ab..e4258836bc 100644
--- a/engines/kyra/scene_v2.cpp
+++ b/engines/kyra/scene_v2.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/kyra/screen.cpp b/engines/kyra/screen.cpp
index 8c97e46a8f..eaa074ff0a 100644
--- a/engines/kyra/screen.cpp
+++ b/engines/kyra/screen.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/kyra/screen.h b/engines/kyra/screen.h
index 156b5b9a7c..31b77b4179 100644
--- a/engines/kyra/screen.h
+++ b/engines/kyra/screen.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/kyra/screen_eob.cpp b/engines/kyra/screen_eob.cpp
index ae62e522e7..6c1bd572e1 100644
--- a/engines/kyra/screen_eob.cpp
+++ b/engines/kyra/screen_eob.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/kyra/screen_eob.h b/engines/kyra/screen_eob.h
index 934483d146..3634ae1a39 100644
--- a/engines/kyra/screen_eob.h
+++ b/engines/kyra/screen_eob.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/kyra/screen_hof.cpp b/engines/kyra/screen_hof.cpp
index b7de7988b8..a80d91381c 100644
--- a/engines/kyra/screen_hof.cpp
+++ b/engines/kyra/screen_hof.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope 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.
diff --git a/engines/kyra/screen_hof.h b/engines/kyra/screen_hof.h
index 95f461677d..1ad2b3c93d 100644
--- a/engines/kyra/screen_hof.h
+++ b/engines/kyra/screen_hof.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope 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.
diff --git a/engines/kyra/screen_lok.cpp b/engines/kyra/screen_lok.cpp
index f028f93294..57601104ad 100644
--- a/engines/kyra/screen_lok.cpp
+++ b/engines/kyra/screen_lok.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/kyra/screen_lok.h b/engines/kyra/screen_lok.h
index 3cb92543e5..8f36ce7fb0 100644
--- a/engines/kyra/screen_lok.h
+++ b/engines/kyra/screen_lok.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/kyra/screen_lol.cpp b/engines/kyra/screen_lol.cpp
index 16a77c8fcb..6dd6080923 100644
--- a/engines/kyra/screen_lol.cpp
+++ b/engines/kyra/screen_lol.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/kyra/screen_lol.h b/engines/kyra/screen_lol.h
index 8ceb8431bc..91d663d34f 100644
--- a/engines/kyra/screen_lol.h
+++ b/engines/kyra/screen_lol.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/kyra/screen_mr.cpp b/engines/kyra/screen_mr.cpp
index 337860db30..fa820a79eb 100644
--- a/engines/kyra/screen_mr.cpp
+++ b/engines/kyra/screen_mr.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope 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.
diff --git a/engines/kyra/screen_mr.h b/engines/kyra/screen_mr.h
index e10afcc5d2..ef982d4bcd 100644
--- a/engines/kyra/screen_mr.h
+++ b/engines/kyra/screen_mr.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope 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.
diff --git a/engines/kyra/screen_v2.cpp b/engines/kyra/screen_v2.cpp
index cc7d526ffe..eabcdb2393 100644
--- a/engines/kyra/screen_v2.cpp
+++ b/engines/kyra/screen_v2.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -280,7 +280,7 @@ void Screen_v2::setTextColorMap(const uint8 *cmap) {
void Screen_v2::wsaFrameAnimationStep(int x1, int y1, int x2, int y2,
int w1, int h1, int w2, int h2, int srcPage, int dstPage, int dim) {
- if (!(w1 || h1 || w2 || h2))
+ if (!w1 || !h1 || !w2 || !h2)
return;
ScreenDim cdm = *getScreenDim(dim);
diff --git a/engines/kyra/screen_v2.h b/engines/kyra/screen_v2.h
index 6f4d67136a..06f7aa2d4a 100644
--- a/engines/kyra/screen_v2.h
+++ b/engines/kyra/screen_v2.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/kyra/script.cpp b/engines/kyra/script.cpp
index 303cbb45aa..2452d7f41c 100644
--- a/engines/kyra/script.cpp
+++ b/engines/kyra/script.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/kyra/script.h b/engines/kyra/script.h
index ccbe733e4d..12a44b0a03 100644
--- a/engines/kyra/script.h
+++ b/engines/kyra/script.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/kyra/script_eob.cpp b/engines/kyra/script_eob.cpp
index 4a6a498173..455180b5e1 100644
--- a/engines/kyra/script_eob.cpp
+++ b/engines/kyra/script_eob.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/kyra/script_eob.h b/engines/kyra/script_eob.h
index 8e2dbd8423..b996e314d5 100644
--- a/engines/kyra/script_eob.h
+++ b/engines/kyra/script_eob.h
@@ -8,17 +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.
*
- *
*/
#ifdef ENABLE_EOB
diff --git a/engines/kyra/script_hof.cpp b/engines/kyra/script_hof.cpp
index f6fde65109..f86d0e96bc 100644
--- a/engines/kyra/script_hof.cpp
+++ b/engines/kyra/script_hof.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/kyra/script_lok.cpp b/engines/kyra/script_lok.cpp
index 22d5e9fd7c..380d7d551f 100644
--- a/engines/kyra/script_lok.cpp
+++ b/engines/kyra/script_lok.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/kyra/script_lol.cpp b/engines/kyra/script_lol.cpp
index 0bbe66f530..1a36527cdb 100644
--- a/engines/kyra/script_lol.cpp
+++ b/engines/kyra/script_lol.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/kyra/script_mr.cpp b/engines/kyra/script_mr.cpp
index f656b162fd..5ba645f1be 100644
--- a/engines/kyra/script_mr.cpp
+++ b/engines/kyra/script_mr.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/kyra/script_tim.cpp b/engines/kyra/script_tim.cpp
index ba0f62a2b4..e3b339cba6 100644
--- a/engines/kyra/script_tim.cpp
+++ b/engines/kyra/script_tim.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/kyra/script_tim.h b/engines/kyra/script_tim.h
index aa512daae8..bd9c2645e5 100644
--- a/engines/kyra/script_tim.h
+++ b/engines/kyra/script_tim.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/kyra/script_v1.cpp b/engines/kyra/script_v1.cpp
index aaa07e6d61..3ac174a5b9 100644
--- a/engines/kyra/script_v1.cpp
+++ b/engines/kyra/script_v1.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/kyra/script_v2.cpp b/engines/kyra/script_v2.cpp
index c38a144537..179d388109 100644
--- a/engines/kyra/script_v2.cpp
+++ b/engines/kyra/script_v2.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/kyra/seqplayer.cpp b/engines/kyra/seqplayer.cpp
index 1f9097d09d..e1794b2416 100644
--- a/engines/kyra/seqplayer.cpp
+++ b/engines/kyra/seqplayer.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/kyra/seqplayer.h b/engines/kyra/seqplayer.h
index 12d94e3f6d..155ed82a4e 100644
--- a/engines/kyra/seqplayer.h
+++ b/engines/kyra/seqplayer.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/kyra/sequences_darkmoon.cpp b/engines/kyra/sequences_darkmoon.cpp
index 03b15d6950..53a30d0079 100644
--- a/engines/kyra/sequences_darkmoon.cpp
+++ b/engines/kyra/sequences_darkmoon.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/kyra/sequences_eob.cpp b/engines/kyra/sequences_eob.cpp
index 0fec386485..187295bd2c 100644
--- a/engines/kyra/sequences_eob.cpp
+++ b/engines/kyra/sequences_eob.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/kyra/sequences_hof.cpp b/engines/kyra/sequences_hof.cpp
index 9fcce4eb55..942cf16502 100644
--- a/engines/kyra/sequences_hof.cpp
+++ b/engines/kyra/sequences_hof.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -1651,7 +1651,7 @@ void SeqPlayer_HOF::displayHoFTalkieScrollText(uint8 *data, const ScreenDim *d,
textData[1].text += strlen((char *)textData[1].text);
textData[1].text[0] = textData[1].unk1;
cnt--;
- memcpy(&textData[1], &textData[2], cnt * sizeof(ScrollTextData));
+ memmove(&textData[1], &textData[2], cnt * sizeof(ScrollTextData));
}
if (palCycle) {
diff --git a/engines/kyra/sequences_hof.h b/engines/kyra/sequences_hof.h
index 2558a68a6a..12fa4ffbc2 100644
--- a/engines/kyra/sequences_hof.h
+++ b/engines/kyra/sequences_hof.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/kyra/sequences_lok.cpp b/engines/kyra/sequences_lok.cpp
index 51f1ea51cf..8a41ee9a21 100644
--- a/engines/kyra/sequences_lok.cpp
+++ b/engines/kyra/sequences_lok.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/kyra/sequences_lol.cpp b/engines/kyra/sequences_lol.cpp
index c8f97eb770..4c87ff1dd8 100644
--- a/engines/kyra/sequences_lol.cpp
+++ b/engines/kyra/sequences_lol.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/kyra/sequences_mr.cpp b/engines/kyra/sequences_mr.cpp
index 76badb63f5..0ac6b636b8 100644
--- a/engines/kyra/sequences_mr.cpp
+++ b/engines/kyra/sequences_mr.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/kyra/sequences_v2.cpp b/engines/kyra/sequences_v2.cpp
index e431e45f10..1bcbb7d874 100644
--- a/engines/kyra/sequences_v2.cpp
+++ b/engines/kyra/sequences_v2.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/kyra/sound.cpp b/engines/kyra/sound.cpp
index cb6faf2580..3c3aff6ea9 100644
--- a/engines/kyra/sound.cpp
+++ b/engines/kyra/sound.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/kyra/sound_adlib.cpp b/engines/kyra/sound_adlib.cpp
index 1d665709e5..f950f9d5aa 100644
--- a/engines/kyra/sound_adlib.cpp
+++ b/engines/kyra/sound_adlib.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -24,12 +24,12 @@
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
-
+ *
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
-
+ *
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
diff --git a/engines/kyra/sound_amiga.cpp b/engines/kyra/sound_amiga.cpp
index 7292541594..598b5080a9 100644
--- a/engines/kyra/sound_amiga.cpp
+++ b/engines/kyra/sound_amiga.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/kyra/sound_digital.cpp b/engines/kyra/sound_digital.cpp
index 518805c43e..a1600f6464 100644
--- a/engines/kyra/sound_digital.cpp
+++ b/engines/kyra/sound_digital.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/kyra/sound_lok.cpp b/engines/kyra/sound_lok.cpp
index b2a9c2fd93..c356f2fb67 100644
--- a/engines/kyra/sound_lok.cpp
+++ b/engines/kyra/sound_lok.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/kyra/sound_lol.cpp b/engines/kyra/sound_lol.cpp
index 7ac33967dd..8be0cb6ab9 100644
--- a/engines/kyra/sound_lol.cpp
+++ b/engines/kyra/sound_lol.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/kyra/sound_midi.cpp b/engines/kyra/sound_midi.cpp
index fc6e92abd9..cd8bc2377c 100644
--- a/engines/kyra/sound_midi.cpp
+++ b/engines/kyra/sound_midi.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/kyra/sound_pcspk.cpp b/engines/kyra/sound_pcspk.cpp
index 8664e2a22e..255d6b451a 100644
--- a/engines/kyra/sound_pcspk.cpp
+++ b/engines/kyra/sound_pcspk.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/kyra/sound_towns.cpp b/engines/kyra/sound_towns.cpp
index af741a1ebe..725dedae3f 100644
--- a/engines/kyra/sound_towns.cpp
+++ b/engines/kyra/sound_towns.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -225,6 +225,7 @@ void SoundTowns::playSoundEffect(uint8 track, uint8) {
_driver->chanPanPos(_sfxChannel, 0x40);
_driver->chanPitch(_sfxChannel, 0);
_driver->playSoundEffect(_sfxChannel, note, 127, sfxPlaybackBuffer);
+ delete[] sfxPlaybackBuffer;
}
void SoundTowns::updateVolumeSettings() {
@@ -537,7 +538,8 @@ bool SoundTownsPC98_v2::init() {
// check if we have access to CD audio.
Resource *r = _vm->resource();
if (_musicEnabled &&
- (r->exists("track1.mp3") || r->exists("track1.ogg") || r->exists("track1.flac") || r->exists("track1.fla")))
+ (r->exists("track1.mp3") || r->exists("track1.ogg") || r->exists("track1.flac") || r->exists("track1.fla")
+ || r->exists("track01.mp3") || r->exists("track01.ogg") || r->exists("track01.flac") || r->exists("track01.fla")))
_musicEnabled = 2;
else
_musicEnabled = 1;
diff --git a/engines/kyra/sprites.cpp b/engines/kyra/sprites.cpp
index f4cebf6470..540191e678 100644
--- a/engines/kyra/sprites.cpp
+++ b/engines/kyra/sprites.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/kyra/sprites.h b/engines/kyra/sprites.h
index 93cdcdbbcb..3319948707 100644
--- a/engines/kyra/sprites.h
+++ b/engines/kyra/sprites.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/kyra/sprites_eob.cpp b/engines/kyra/sprites_eob.cpp
index b96f2eca08..5a82cf604c 100644
--- a/engines/kyra/sprites_eob.cpp
+++ b/engines/kyra/sprites_eob.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/kyra/sprites_lol.cpp b/engines/kyra/sprites_lol.cpp
index 4d4d596bac..b9ffe6cbdb 100644
--- a/engines/kyra/sprites_lol.cpp
+++ b/engines/kyra/sprites_lol.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/kyra/sprites_rpg.cpp b/engines/kyra/sprites_rpg.cpp
index 9c08bc8dd6..b190ad8f07 100644
--- a/engines/kyra/sprites_rpg.cpp
+++ b/engines/kyra/sprites_rpg.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/kyra/staticres.cpp b/engines/kyra/staticres.cpp
index c52b0a04ad..9b3b92b9c7 100644
--- a/engines/kyra/staticres.cpp
+++ b/engines/kyra/staticres.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -39,7 +39,7 @@
namespace Kyra {
-#define RESFILE_VERSION 84
+#define RESFILE_VERSION 85
namespace {
bool checkKyraDat(Common::SeekableReadStream *file) {
@@ -1172,7 +1172,7 @@ void GUI_LoK::initStaticResource() {
GUI_V1_MENU_ITEM(_menu[5].item[2], 1, 0, 0, 0, 0xA5, 0, 0x40, 0x80, 0x0F, 252, 253, 5, 0, 248, 249, 250, -1, 0, 0x10, 0x42, 0, 0);
GUI_V1_MENU_ITEM(_menu[5].item[3], 1, 0, 0, 0, 0xA5, 0, 0x51, 0x80, 0x0F, 252, 253, 5, 0, 248, 249, 250, -1, 0, 0x10, 0x53, 0, 0);
GUI_V1_MENU_ITEM(_menu[5].item[4], 1, 0, 0, 0, 0xA5, 0, 0x62, 0x80, 0x0F, 252, 253, 5, 0, 248, 249, 250, -1, 0, 0x10, 0x65, 0, 0);
- GUI_V1_MENU_ITEM(_menu[5].item[5], 1, 0, 0, 0, -1, 0, 0x7F, 0x6C, 0x0F, 252, 253, -1, 255, 248, 249, 250, -1, -0, 0, 0, 0, 0);
+ GUI_V1_MENU_ITEM(_menu[5].item[5], 1, 0, 0, 0, -1, 0, 0x7F, 0x6C, 0x0F, 252, 253, -1, 255, 248, 249, 250, -1, 0, 0, 0, 0, 0);
_menu[5].item[0].callback = BUTTON_FUNCTOR(GUI_LoK, this, &GUI_LoK::controlsChangeMusic);
_menu[5].item[1].callback = BUTTON_FUNCTOR(GUI_LoK, this, &GUI_LoK::controlsChangeSounds);
_menu[5].item[2].callback = BUTTON_FUNCTOR(GUI_LoK, this, &GUI_LoK::controlsChangeWalk);
diff --git a/engines/kyra/staticres_eob.cpp b/engines/kyra/staticres_eob.cpp
index e0a2862dea..54cc3066ec 100644
--- a/engines/kyra/staticres_eob.cpp
+++ b/engines/kyra/staticres_eob.cpp
@@ -8,17 +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.
*
- *
*/
#include "kyra/eob.h"
@@ -1207,7 +1206,7 @@ void DarkMoonEngine::initStaticResource() {
_animIntro = new const DarkMoonAnimCommand*[44];
for (int i = 0; i < 44; i++)
- _animIntro[i] = _staticres->loadEoB2SeqData(kEob2IntroAnimData00 + i, temp);
+ _animIntro[i] = _staticres->loadEoB2SeqData(kEoB2IntroAnimData00 + i, temp);
_shapesIntro = new const DarkMoonShapeDef*[13];
memset(_shapesIntro, 0, sizeof(DarkMoonShapeDef *) * 13);
@@ -1222,7 +1221,7 @@ void DarkMoonEngine::initStaticResource() {
_animFinale = new const DarkMoonAnimCommand*[21];
for (int i = 0; i < 21; i++)
- _animFinale[i] = _staticres->loadEoB2SeqData(kEob2FinaleAnimData00 + i, temp);
+ _animFinale[i] = _staticres->loadEoB2SeqData(kEoB2FinaleAnimData00 + i, temp);
_shapesFinale = new const DarkMoonShapeDef*[13];
memset(_shapesFinale, 0, sizeof(DarkMoonShapeDef *) * 13);
diff --git a/engines/kyra/staticres_lol.cpp b/engines/kyra/staticres_lol.cpp
index c2cdcf9f51..9a4fc281d5 100644
--- a/engines/kyra/staticres_lol.cpp
+++ b/engines/kyra/staticres_lol.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/kyra/staticres_rpg.cpp b/engines/kyra/staticres_rpg.cpp
index a30cbf7d05..671d3dfd1d 100644
--- a/engines/kyra/staticres_rpg.cpp
+++ b/engines/kyra/staticres_rpg.cpp
@@ -8,17 +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.
*
- *
*/
#include "kyra/resource.h"
diff --git a/engines/kyra/text.cpp b/engines/kyra/text.cpp
index 2e3acffeb9..f88ba183ba 100644
--- a/engines/kyra/text.cpp
+++ b/engines/kyra/text.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/kyra/text.h b/engines/kyra/text.h
index 199029469e..d5f423105e 100644
--- a/engines/kyra/text.h
+++ b/engines/kyra/text.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/kyra/text_hof.cpp b/engines/kyra/text_hof.cpp
index f1933e9623..354eff03b9 100644
--- a/engines/kyra/text_hof.cpp
+++ b/engines/kyra/text_hof.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/kyra/text_hof.h b/engines/kyra/text_hof.h
index 414d02fe4b..aacdc97d76 100644
--- a/engines/kyra/text_hof.h
+++ b/engines/kyra/text_hof.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/kyra/text_lok.cpp b/engines/kyra/text_lok.cpp
index a557940868..1ca5644b9d 100644
--- a/engines/kyra/text_lok.cpp
+++ b/engines/kyra/text_lok.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/kyra/text_lol.cpp b/engines/kyra/text_lol.cpp
index 6e77db1f8a..d8a36b954f 100644
--- a/engines/kyra/text_lol.cpp
+++ b/engines/kyra/text_lol.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/kyra/text_lol.h b/engines/kyra/text_lol.h
index e2b10e8d4d..ad3efadcaf 100644
--- a/engines/kyra/text_lol.h
+++ b/engines/kyra/text_lol.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/kyra/text_mr.cpp b/engines/kyra/text_mr.cpp
index 10b0880f29..685d5447cd 100644
--- a/engines/kyra/text_mr.cpp
+++ b/engines/kyra/text_mr.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/kyra/text_mr.h b/engines/kyra/text_mr.h
index 957415490f..5b6a7cd192 100644
--- a/engines/kyra/text_mr.h
+++ b/engines/kyra/text_mr.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/kyra/text_rpg.cpp b/engines/kyra/text_rpg.cpp
index 24c523c856..03acde8497 100644
--- a/engines/kyra/text_rpg.cpp
+++ b/engines/kyra/text_rpg.cpp
@@ -8,17 +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.
*
- *
*/
#if defined(ENABLE_EOB) || defined(ENABLE_LOL)
diff --git a/engines/kyra/text_rpg.h b/engines/kyra/text_rpg.h
index eb8617a371..30d3463726 100644
--- a/engines/kyra/text_rpg.h
+++ b/engines/kyra/text_rpg.h
@@ -1,19 +1,19 @@
/* ScummVM - Graphic Adventure Engine
*
* ScummVM is the legal property of its developers, whose names
- * are to numerous to list here. Please refer to the COPYRIGHT
+ * are too numerous to list here. Please refer to the COPYRIGHT
* file distributed with this source distribution.
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/kyra/timer.cpp b/engines/kyra/timer.cpp
index 95c283f063..edca3ef5bf 100644
--- a/engines/kyra/timer.cpp
+++ b/engines/kyra/timer.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope 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.
diff --git a/engines/kyra/timer.h b/engines/kyra/timer.h
index 205be5957d..a753707b8a 100644
--- a/engines/kyra/timer.h
+++ b/engines/kyra/timer.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope 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.
diff --git a/engines/kyra/timer_eob.cpp b/engines/kyra/timer_eob.cpp
index f7a4e23006..c5290790e7 100644
--- a/engines/kyra/timer_eob.cpp
+++ b/engines/kyra/timer_eob.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -347,7 +347,7 @@ void EoBCoreEngine::timerUpdateFoodStatus(int timerNum) {
}
void EoBCoreEngine::timerUpdateMonsterIdleAnim(int timerNum) {
- for (int i = 0; i < 18; i++) {
+ for (int i = 0; i < 30; i++) {
EoBMonsterInPlay *m = &_monsters[i];
if (m->mode == 7 || m->mode == 10 || (m->flags & 0x20) || (rollDice(1, 2, 0) != 1))
continue;
diff --git a/engines/kyra/timer_hof.cpp b/engines/kyra/timer_hof.cpp
index 96b14c28f5..bdfb93eebb 100644
--- a/engines/kyra/timer_hof.cpp
+++ b/engines/kyra/timer_hof.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope 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.
diff --git a/engines/kyra/timer_lok.cpp b/engines/kyra/timer_lok.cpp
index 13f5403618..b046e92988 100644
--- a/engines/kyra/timer_lok.cpp
+++ b/engines/kyra/timer_lok.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope 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.
diff --git a/engines/kyra/timer_lol.cpp b/engines/kyra/timer_lol.cpp
index 9d0cc0dd72..1326eea754 100644
--- a/engines/kyra/timer_lol.cpp
+++ b/engines/kyra/timer_lol.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope 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.
diff --git a/engines/kyra/timer_mr.cpp b/engines/kyra/timer_mr.cpp
index 7d8325cd05..58c75ac980 100644
--- a/engines/kyra/timer_mr.cpp
+++ b/engines/kyra/timer_mr.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope 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.
diff --git a/engines/kyra/timer_rpg.cpp b/engines/kyra/timer_rpg.cpp
index 02c2669436..b31c406480 100644
--- a/engines/kyra/timer_rpg.cpp
+++ b/engines/kyra/timer_rpg.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/kyra/util.cpp b/engines/kyra/util.cpp
index f71978d03e..325f29ebd7 100644
--- a/engines/kyra/util.cpp
+++ b/engines/kyra/util.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/kyra/util.h b/engines/kyra/util.h
index b91f84ad36..130768f89d 100644
--- a/engines/kyra/util.h
+++ b/engines/kyra/util.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/kyra/vqa.cpp b/engines/kyra/vqa.cpp
index 081d94a050..fb51c05e51 100644
--- a/engines/kyra/vqa.cpp
+++ b/engines/kyra/vqa.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -28,644 +28,606 @@
//
// The jung2.vqa movie does work, but only thanks to a grotesque hack.
-
+#include "kyra/kyra_v1.h"
#include "kyra/vqa.h"
-#include "kyra/resource.h"
-
-#include "common/system.h"
+#include "kyra/screen.h"
#include "audio/audiostream.h"
-#include "audio/mixer.h"
#include "audio/decoders/raw.h"
-namespace Kyra {
-
-VQAMovie::VQAMovie(KyraEngine_v1 *vm, OSystem *system) {
- _system = system;
- _vm = vm;
- _screen = _vm->screen();
- _opened = false;
- _x = _y = _drawPage = -1;
- _frame = 0;
- _vectorPointers = 0;
- _numPartialCodeBooks = 0;
- _partialCodeBookSize = 0;
- _compressedCodeBook = 0;
- _partialCodeBook = 0;
- _codeBook = 0;
- _frameInfo = 0;
- memset(_buffers, 0, sizeof(_buffers));
-}
-
-VQAMovie::~VQAMovie() {
- close();
-}
-
-void VQAMovie::initBuffers() {
- for (int i = 0; i < ARRAYSIZE(_buffers); i++) {
- _buffers[i].data = 0;
- _buffers[i].size = 0;
- }
-}
-
-void *VQAMovie::allocBuffer(int num, uint32 size) {
- assert(num >= 0 && num < ARRAYSIZE(_buffers));
- assert(size > 0);
-
- if (size > _buffers[num].size) {
- /*
- * We could use realloc() here, but we don't actually need the
- * old contents of the buffer.
- */
- delete[] _buffers[num].data;
- _buffers[num].data = new uint8[size];
- _buffers[num].size = size;
- }
-
- assert(_buffers[num].data);
+#include "common/system.h"
+#include "common/events.h"
- return _buffers[num].data;
-}
+#include "graphics/palette.h"
+#include "graphics/surface.h"
-void VQAMovie::freeBuffers() {
- for (int i = 0; i < ARRAYSIZE(_buffers); i++) {
- delete[] _buffers[i].data;
- _buffers[i].data = NULL;
- _buffers[i].size = 0;
- }
-}
+namespace Kyra {
-uint32 VQAMovie::readTag() {
+static uint32 readTag(Common::SeekableReadStream *stream) {
// Some tags have to be on an even offset, so they are padded with a
// zero byte. Skip that.
- uint32 tag = _file->readUint32BE();
+ uint32 tag = stream->readUint32BE();
- if (_file->eos())
+ if (stream->eos())
return 0;
if (!(tag & 0xFF000000)) {
- tag = (tag << 8) | _file->readByte();
+ tag = (tag << 8) | stream->readByte();
}
return tag;
}
-void VQAMovie::decodeSND1(byte *inbuf, uint32 insize, byte *outbuf, uint32 outsize) {
- const int8 WSTable2Bit[] = { -2, -1, 0, 1 };
- const int8 WSTable4Bit[] = {
- -9, -8, -6, -5, -4, -3, -2, -1,
- 0, 1, 2, 3, 4, 5, 6, 8
- };
-
- byte code;
- int8 count;
- uint16 input;
-
- int16 curSample = 0x80;
-
- while (outsize > 0) {
- input = *inbuf++ << 2;
- code = (input >> 8) & 0xFF;
- count = (input & 0xFF) >> 2;
-
- switch (code) {
- case 2:
- if (count & 0x20) {
- /* NOTE: count is signed! */
- count <<= 3;
- curSample += (count >> 3);
- *outbuf++ = curSample;
- outsize--;
- } else {
- for (; count >= 0; count--) {
- *outbuf++ = *inbuf++;
- outsize--;
- }
- curSample = *(outbuf - 1);
- }
- break;
- case 1:
- for (; count >= 0; count--) {
- code = *inbuf++;
-
- curSample += WSTable4Bit[code & 0x0F];
- curSample = CLIP<int16>(curSample, 0, 255);
- *outbuf++ = curSample;
-
- curSample += WSTable4Bit[code >> 4];
- curSample = CLIP<int16>(curSample, 0, 255);
- *outbuf++ = curSample;
-
- outsize -= 2;
- }
- break;
- case 0:
- for (; count >= 0; count--) {
- code = *inbuf++;
-
- curSample += WSTable2Bit[code & 0x03];
- curSample = CLIP<int16>(curSample, 0, 255);
- *outbuf++ = curSample;
-
- curSample += WSTable2Bit[(code >> 2) & 0x03];
- curSample = CLIP<int16>(curSample, 0, 255);
- *outbuf++ = curSample;
-
- curSample += WSTable2Bit[(code >> 4) & 0x03];
- curSample = CLIP<int16>(curSample, 0, 255);
- *outbuf++ = curSample;
-
- curSample += WSTable2Bit[(code >> 6) & 0x03];
- curSample = CLIP<int16>(curSample, 0, 255);
- *outbuf++ = curSample;
-
- outsize -= 4;
- }
- break;
- default:
- for (; count >= 0; count--) {
- *outbuf++ = curSample;
- outsize--;
- }
- }
- }
+VQADecoder::VQADecoder() {
+ memset(&_header, 0, sizeof(_header));
}
-bool VQAMovie::open(const char *filename) {
+VQADecoder::~VQADecoder() {
close();
+ delete[] _frameInfo;
+}
- _file = _vm->resource()->createReadStream(filename);
- if (!_file)
- return false;
+bool VQADecoder::loadStream(Common::SeekableReadStream *stream) {
+ close();
+ _fileStream = stream;
- if (_file->readUint32BE() != MKTAG('F','O','R','M')) {
- warning("VQAMovie::open: Cannot find `FORM' tag");
+ if (_fileStream->readUint32BE() != MKTAG('F','O','R','M')) {
+ warning("VQADecoder::loadStream(): Cannot find `FORM' tag");
return false;
}
- // For now, we ignore the size of the FORM chunk.
- _file->readUint32BE();
+ // Ignore the size of the FORM chunk. We're only interested in its
+ // children.
+ _fileStream->readUint32BE();
- if (_file->readUint32BE() != MKTAG('W','V','Q','A')) {
- warning("WQAMovie::open: Cannot find `WVQA' tag");
+ if (_fileStream->readUint32BE() != MKTAG('W','V','Q','A')) {
+ warning("VQADecoder::loadStream(): Cannot find `WVQA' tag");
return false;
}
- bool foundHeader = false;
- bool foundFrameInfo = false;
+ // We want to find both a VQHD chunk containing the header, and a FINF
+ // chunk containing the frame offsets.
+
+ bool foundVQHD = false;
+ bool foundFINF = false;
+
+ VQAAudioTrack *audioTrack = NULL;
// The information we need is stored in two chunks: VQHD and FINF. We
// need both of them before we can begin decoding the movie.
- while (!foundHeader || !foundFrameInfo) {
- uint32 tag = readTag();
- uint32 size = _file->readUint32BE();
+ while (!foundVQHD || !foundFINF) {
+ uint32 tag = readTag(stream);
+ uint32 size = _fileStream->readUint32BE();
switch (tag) {
- case MKTAG('V','Q','H','D'): // VQA header
- _header.version = _file->readUint16LE();
- _header.flags = _file->readUint16LE();
- _header.numFrames = _file->readUint16LE();
- _header.width = _file->readUint16LE();
- _header.height = _file->readUint16LE();
- _header.blockW = _file->readByte();
- _header.blockH = _file->readByte();
- _header.frameRate = _file->readByte();
- _header.cbParts = _file->readByte();
- _header.colors = _file->readUint16LE();
- _header.maxBlocks = _file->readUint16LE();
- _header.unk1 = _file->readUint32LE();
- _header.unk2 = _file->readUint16LE();
- _header.freq = _file->readUint16LE();
- _header.channels = _file->readByte();
- _header.bits = _file->readByte();
- _header.unk3 = _file->readUint32LE();
- _header.unk4 = _file->readUint16LE();
- _header.maxCBFZSize = _file->readUint32LE();
- _header.unk5 = _file->readUint32LE();
-
- // Kyrandia 3 uses version 1 VQA files, and is the only
- // known game to do so. This version of the format has
- // some implicit default values.
-
- if (_header.version == 1) {
- if (_header.freq == 0)
- _header.freq = 22050;
- if (_header.channels == 0)
- _header.channels = 1;
- if (_header.bits == 0)
- _header.bits = 8;
- }
-
- _x = (Screen::SCREEN_W - _header.width) / 2;
- _y = (Screen::SCREEN_H - _header.height) / 2;
-
- _frameInfo = new uint32[_header.numFrames];
- _frame = new byte[_header.width * _header.height];
-
- _codeBookSize = 0xF00 * _header.blockW * _header.blockH;
- _codeBook = new byte[_codeBookSize];
- _partialCodeBook = new byte[_codeBookSize];
- memset(_codeBook, 0, _codeBookSize);
- memset(_partialCodeBook, 0, _codeBookSize);
-
- _numVectorPointers = (_header.width / _header.blockW) * (_header.height * _header.blockH);
- _vectorPointers = new uint16[_numVectorPointers];
- memset(_vectorPointers, 0, _numVectorPointers * sizeof(uint16));
-
- _partialCodeBookSize = 0;
- _numPartialCodeBooks = 0;
-
+ case MKTAG('V','Q','H','D'):
+ handleVQHD(_fileStream);
if (_header.flags & 1) {
- // This VQA movie has sound. Kyrandia 3 uses
- // 8-bit sound, and so far testing indicates
- // that it's all mono.
- //
- // This is good, because it means we won't have
- // to worry about the confusing parts of the
- // VQA spec, where 8- and 16-bit data have
- // different signedness and stereo sample
- // layout varies between different games.
-
- assert(_header.bits == 8);
- assert(_header.channels == 1);
-
- _stream = Audio::makeQueuingAudioStream(_header.freq, false);
- } else {
- _stream = NULL;
+ audioTrack = new VQAAudioTrack(&_header);
+ addTrack(audioTrack);
}
-
- foundHeader = true;
+ foundVQHD = true;
break;
-
- case MKTAG('F','I','N','F'): // Frame info
- if (!foundHeader) {
- warning("VQAMovie::open: Found `FINF' before `VQHD'");
+ case MKTAG('F','I','N','F'):
+ if (!foundVQHD) {
+ warning("VQADecoder::loadStream(): Found `FINF' before `VQHD'");
return false;
}
-
- if (size != 4 * (uint32)_header.numFrames) {
- warning("VQAMovie::open: Expected size %d for `FINF' chunk, but got %u", 4 * _header.numFrames, size);
+ if (size != 4 * getFrameCount()) {
+ warning("VQADecoder::loadStream(): Expected size %d for `FINF' chunk, but got %u", 4 * getFrameCount(), size);
return false;
}
+ handleFINF(_fileStream);
+ foundFINF = true;
+ break;
+ default:
+ warning("VQADecoder::loadStream(): Unknown tag `%s'", tag2str(tag));
+ _fileStream->seek(size, SEEK_CUR);
+ break;
+ }
+ }
- foundFrameInfo = true;
+ return true;
+}
- for (int i = 0; i < _header.numFrames; i++) {
- _frameInfo[i] = 2 * _file->readUint32LE();
- }
+void VQADecoder::handleVQHD(Common::SeekableReadStream *stream) {
+ _header.version = stream->readUint16LE();
+ _header.flags = stream->readUint16LE();
+ _header.numFrames = stream->readUint16LE();
+ _header.width = stream->readUint16LE();
+ _header.height = stream->readUint16LE();
+ _header.blockW = stream->readByte();
+ _header.blockH = stream->readByte();
+ _header.frameRate = stream->readByte();
+ _header.cbParts = stream->readByte();
+ _header.colors = stream->readUint16LE();
+ _header.maxBlocks = stream->readUint16LE();
+ _header.unk1 = stream->readUint32LE();
+ _header.unk2 = stream->readUint16LE();
+ _header.freq = stream->readUint16LE();
+ _header.channels = stream->readByte();
+ _header.bits = stream->readByte();
+ _header.unk3 = stream->readUint32LE();
+ _header.unk4 = stream->readUint16LE();
+ _header.maxCBFZSize = stream->readUint32LE();
+ _header.unk5 = stream->readUint32LE();
+
+ _frameInfo = new uint32[_header.numFrames + 1];
+
+ VQAVideoTrack *videoTrack = new VQAVideoTrack(&_header);
+ addTrack(videoTrack);
+
+ // Kyrandia 3 uses version 1 VQA files, and is the only known game to
+ // do so. This version of the format has some implicit default values.
+
+ if (_header.version == 1) {
+ if (_header.freq == 0)
+ _header.freq = 22050;
+ if (_header.channels == 0)
+ _header.channels = 1;
+ if (_header.bits == 0)
+ _header.bits = 8;
+ }
- // HACK: This flag is set in jung2.vqa, and its
- // purpose, if it has one, is unknown. It can't be a
- // general purpose flag, because in large movies the
- // frame offsets can be large enough to set this flag,
- // though of course never for the first frame.
- //
- // At least in my copy of Kyrandia 3, _frameInfo[0] is
- // 0x81000098, and the desired index is 0x4716. So the
- // value should be 0x80004716, but I don't want to
- // hard-code it. Instead, scan the file for the offset
- // to the first VQFR chunk.
-
- if (_frameInfo[0] & 0x01000000) {
- uint32 oldPos = _file->pos();
-
- while (1) {
- uint32 scanTag = readTag();
- uint32 scanSize = _file->readUint32BE();
-
- if (_file->eos())
- break;
-
- if (scanTag == MKTAG('V','Q','F','R')) {
- _frameInfo[0] = (_file->pos() - 8) | 0x80000000;
- break;
- }
+ if (_header.flags & 1) {
+ // Kyrandia 3 uses 8-bit sound, and so far testing indicates
+ // that it's all mono.
+ //
+ // This is good, because it means we won't have to worry about
+ // the confusing parts of the VQA spec, where 8- and 16-bit
+ // data have different signedness and stereo sample layout
+ // varies between different games.
+
+ assert(_header.bits == 8);
+ assert(_header.channels == 1);
+ }
+}
- _file->seek(scanSize, SEEK_CUR);
- }
+void VQADecoder::handleFINF(Common::SeekableReadStream *stream) {
+ for (int i = 0; i < _header.numFrames; i++) {
+ _frameInfo[i] = 2 * stream->readUint32LE();
+ }
- _file->seek(oldPos);
- }
+ // HACK: This flag is set in jung2.vqa, and its purpose - if it has
+ // one - is currently unknown. It can't be a general purpose flag,
+ // because in large movies the frame offset can be large enough to
+ // set this flag, though of course never for the first frame.
+ //
+ // At least in my copy of Kyrandia 3, _frameInfo[0] is 0x81000098, and
+ // the desired index is 0x4716. So the value should be 0x80004716, but
+ // I don't want to hard-code it. Instead, scan the file for the offset
+ // to the first VQFR chunk.
- break;
+ if (_frameInfo[0] & 0x01000000) {
+ uint32 oldPos = stream->pos();
- default:
- warning("VQAMovie::open: Unknown tag `%c%c%c%c'", char((tag >> 24) & 0xFF), char((tag >> 16) & 0xFF), char((tag >> 8) & 0xFF), char(tag & 0xFF));
- _file->seek(size, SEEK_CUR);
- }
- }
+ while (1) {
+ uint32 scanTag = readTag(stream);
+ uint32 scanSize = stream->readUint32BE();
+
+ if (stream->eos())
+ break;
- initBuffers();
+ if (scanTag == MKTAG('V','Q','F','R')) {
+ _frameInfo[0] = (stream->pos() - 8) | 0x80000000;
+ break;
+ }
- _opened = true;
- return true;
-}
+ stream->seek(scanSize, SEEK_CUR);
+ }
-void VQAMovie::close() {
- if (_opened) {
- delete[] _frameInfo;
- delete[] _frame;
- delete[] _codeBook;
- delete[] _partialCodeBook;
- delete[] _vectorPointers;
-
- if (_vm->_mixer->isSoundHandleActive(_sound))
- _vm->_mixer->stopHandle(_sound);
-
- _frameInfo = NULL;
- _frame = NULL;
- _codeBookSize = 0;
- _codeBook = NULL;
- _partialCodeBook = NULL;
- _vectorPointers = NULL;
- _stream = NULL;
-
- delete _file;
- _file = 0;
-
- freeBuffers();
-
- _opened = false;
+ stream->seek(oldPos);
}
+
+ _frameInfo[_header.numFrames] = 0x7FFFFFFF;
}
-void VQAMovie::displayFrame(uint frameNum) {
- if (frameNum >= _header.numFrames || !_opened)
- return;
+void VQADecoder::readNextPacket() {
+ VQAVideoTrack *videoTrack = (VQAVideoTrack *)getTrack(0);
+ VQAAudioTrack *audioTrack = (VQAAudioTrack *)getTrack(1);
- bool foundSound = !_stream;
- bool foundFrame = false;
- uint i;
+ assert(videoTrack);
- _file->seek(_frameInfo[frameNum] & 0x7FFFFFFF);
+ int curFrame = videoTrack->getCurFrame();
- while (!foundSound || !foundFrame) {
- uint32 tag = readTag();
- uint32 size = _file->readUint32BE();
+ // Stop if reading the tag is enough to put us ahead of the next frame
+ int32 end = (_frameInfo[curFrame + 1] & 0x7FFFFFFF) - 7;
- if (_file->eos()) {
- // This happens at the last frame. Apparently it has
- // no sound?
- break;
+ // At this point, we probably only need to adjust for the offset in the
+ // stream to be even. But we may as well do this to really make sure
+ // we have the correct offset.
+ if (curFrame >= 0) {
+ _fileStream->seek(_frameInfo[curFrame] & 0x7FFFFFFF);
+ if (_frameInfo[curFrame] & 0x80000000) {
+ videoTrack->setHasDirtyPalette();
}
+ }
- byte *inbuf, *outbuf;
- uint32 insize, outsize;
- int32 end;
+ while (!_fileStream->eos() && _fileStream->pos() < end) {
+ uint32 tag = readTag(_fileStream);
+ uint32 size;
switch (tag) {
case MKTAG('S','N','D','0'): // Uncompressed sound
- foundSound = true;
- inbuf = (byte *)malloc(size);
- _file->read(inbuf, size);
- assert(_stream);
- _stream->queueBuffer(inbuf, size, DisposeAfterUse::YES, Audio::FLAG_UNSIGNED);
+ assert(audioTrack);
+ audioTrack->handleSND0(_fileStream);
break;
-
case MKTAG('S','N','D','1'): // Compressed sound, almost like AUD
- foundSound = true;
- outsize = _file->readUint16LE();
- insize = _file->readUint16LE();
-
- inbuf = (byte *)malloc(insize);
- _file->read(inbuf, insize);
-
- if (insize == outsize) {
- assert(_stream);
- _stream->queueBuffer(inbuf, insize, DisposeAfterUse::YES, Audio::FLAG_UNSIGNED);
- } else {
- outbuf = (byte *)malloc(outsize);
- decodeSND1(inbuf, insize, outbuf, outsize);
- assert(_stream);
- _stream->queueBuffer(outbuf, outsize, DisposeAfterUse::YES, Audio::FLAG_UNSIGNED);
- free(inbuf);
- }
+ assert(audioTrack);
+ audioTrack->handleSND1(_fileStream);
break;
-
case MKTAG('S','N','D','2'): // Compressed sound
- foundSound = true;
- warning("VQAMovie::displayFrame: `SND2' is not implemented");
- _file->seek(size, SEEK_CUR);
+ assert(audioTrack);
+ audioTrack->handleSND2(_fileStream);
break;
-
case MKTAG('V','Q','F','R'):
- foundFrame = true;
- end = _file->pos() + size - 8;
-
- while (_file->pos() < end) {
- tag = readTag();
- size = _file->readUint32BE();
-
- switch (tag) {
- case MKTAG('C','B','F','0'): // Full codebook
- _file->read(_codeBook, size);
- break;
+ videoTrack->handleVQFR(_fileStream);
+ break;
+ case MKTAG('C','M','D','S'):
+ // The purpose of this is unknown, but it's known to
+ // exist so don't warn about it.
+ size = _fileStream->readUint32BE();
+ _fileStream->seek(size, SEEK_CUR);
+ break;
+ default:
+ warning("VQADecoder::readNextPacket(): Unknown tag `%s'", tag2str(tag));
+ size = _fileStream->readUint32BE();
+ _fileStream->seek(size, SEEK_CUR);
+ break;
+ }
+ }
+}
- case MKTAG('C','B','F','Z'): // Full codebook
- inbuf = (byte *)allocBuffer(0, size);
- _file->read(inbuf, size);
- Screen::decodeFrame4(inbuf, _codeBook, _codeBookSize);
- break;
+// -----------------------------------------------------------------------
- case MKTAG('C','B','P','0'): // Partial codebook
- _compressedCodeBook = false;
- _file->read(_partialCodeBook + _partialCodeBookSize, size);
- _partialCodeBookSize += size;
- _numPartialCodeBooks++;
- break;
+VQADecoder::VQAAudioTrack::VQAAudioTrack(const VQAHeader *header) {
+ _audioStream = Audio::makeQueuingAudioStream(header->freq, false);
+}
- case MKTAG('C','B','P','Z'): // Partial codebook
- _compressedCodeBook = true;
- _file->read(_partialCodeBook + _partialCodeBookSize, size);
- _partialCodeBookSize += size;
- _numPartialCodeBooks++;
- break;
+VQADecoder::VQAAudioTrack::~VQAAudioTrack() {
+ delete _audioStream;
+}
- case MKTAG('C','P','L','0'): // Palette
- assert(size <= 3 * 256);
- _file->read(_screen->getPalette(0).getData(), size);
- break;
+Audio::AudioStream *VQADecoder::VQAAudioTrack::getAudioStream() const {
+ return _audioStream;
+}
- case MKTAG('C','P','L','Z'): // Palette
- inbuf = (byte *)allocBuffer(0, size);
- _file->read(inbuf, size);
- Screen::decodeFrame4(inbuf, _screen->getPalette(0).getData(), 768);
- break;
+void VQADecoder::VQAAudioTrack::handleSND0(Common::SeekableReadStream *stream) {
+ uint32 size = stream->readUint32BE();
+ byte *buf = (byte *)malloc(size);
+ stream->read(buf, size);
+ _audioStream->queueBuffer(buf, size, DisposeAfterUse::YES, Audio::FLAG_UNSIGNED);
+}
- case MKTAG('V','P','T','0'): // Frame data
- assert(size / 2 <= _numVectorPointers);
+void VQADecoder::VQAAudioTrack::handleSND1(Common::SeekableReadStream *stream) {
+ stream->readUint32BE();
+ uint16 outsize = stream->readUint16LE();
+ uint16 insize = stream->readUint16LE();
+ byte *inbuf = (byte *)malloc(insize);
+
+ stream->read(inbuf, insize);
+
+ if (insize == outsize) {
+ _audioStream->queueBuffer(inbuf, insize, DisposeAfterUse::YES, Audio::FLAG_UNSIGNED);
+ } else {
+ const int8 WSTable2Bit[] = { -2, -1, 0, 1 };
+ const int8 WSTable4Bit[] = {
+ -9, -8, -6, -5, -4, -3, -2, -1,
+ 0, 1, 2, 3, 4, 5, 6, 8
+ };
+
+ byte *outbuf = (byte *)malloc(outsize);
+ byte *in = inbuf;
+ byte *out = outbuf;
+ int16 curSample = 0x80;
+ uint16 bytesLeft = outsize;
+
+ while (bytesLeft > 0) {
+ uint16 input = *in++ << 2;
+ byte code = (input >> 8) & 0xFF;
+ int8 count = (input & 0xFF) >> 2;
+ int i;
+
+ switch (code) {
+ case 2:
+ if (count & 0x20) {
+ /* NOTE: count is signed! */
+ count <<= 3;
+ curSample += (count >> 3);
+ *out++ = curSample;
+ bytesLeft--;
+ } else {
+ for (; count >= 0; count--) {
+ *out++ = *in++;
+ bytesLeft--;
+ }
+ curSample = *(out - 1);
+ }
+ break;
+ case 1:
+ for (; count >= 0; count--) {
+ code = *in++;
- for (i = 0; i < size / 2; i++)
- _vectorPointers[i] = _file->readUint16LE();
- break;
+ for (i = 0; i < 2; i++) {
+ curSample += WSTable4Bit[code & 0x0F];
+ curSample = CLIP<int16>(curSample, 0, 255);
+ code >>= 4;
+ *out++ = curSample;
+ }
- case MKTAG('V','P','T','Z'): // Frame data
- inbuf = (byte *)allocBuffer(0, size);
- outbuf = (byte *)allocBuffer(1, 2 * _numVectorPointers);
+ bytesLeft -= 2;
+ }
+ break;
+ case 0:
+ for (; count >= 0; count--) {
+ code = *in++;
- _file->read(inbuf, size);
- size = Screen::decodeFrame4(inbuf, outbuf, 2 * _numVectorPointers);
+ for (i = 0; i < 4; i++) {
+ curSample += WSTable2Bit[code & 0x03];
+ curSample = CLIP<int16>(curSample, 0, 255);
+ code >>= 2;
+ *out++ = curSample;
+ }
- assert(size / 2 <= _numVectorPointers);
+ bytesLeft -= 4;
+ }
+ break;
+ default:
+ for (; count >= 0; count--) {
+ *out++ = curSample;
+ bytesLeft--;
+ }
+ break;
+ }
+ }
+ _audioStream->queueBuffer(outbuf, outsize, DisposeAfterUse::YES, Audio::FLAG_UNSIGNED);
+ free(inbuf);
+ }
+}
- for (i = 0; i < size / 2; i++)
- _vectorPointers[i] = READ_LE_UINT16(outbuf + 2 * i);
- break;
+void VQADecoder::VQAAudioTrack::handleSND2(Common::SeekableReadStream *stream) {
+ uint32 size = stream->readUint32BE();
+ warning("VQADecoder::VQAAudioTrack::handleSND2(): `SND2' is not implemented");
+ stream->seek(size, SEEK_CUR);
+}
- default:
- warning("VQAMovie::displayFrame: Unknown `VQFR' sub-tag `%c%c%c%c'", char((tag >> 24) & 0xFF), char((tag >> 16) & 0xFF), char((tag >> 8) & 0xFF), char(tag & 0xFF));
- _file->seek(size, SEEK_CUR);
- }
+// -----------------------------------------------------------------------
- }
+VQADecoder::VQAVideoTrack::VQAVideoTrack(const VQAHeader *header) {
+ memset(_palette, 0, sizeof(_palette));
+ _dirtyPalette = false;
- break;
+ _width = header->width;
+ _height = header->height;
+ _blockW = header->blockW;
+ _blockH = header->blockH;
+ _cbParts = header->cbParts;
- default:
- warning("VQAMovie::displayFrame: Unknown tag `%c%c%c%c'", char((tag >> 24) & 0xFF), char((tag >> 16) & 0xFF), char((tag >> 8) & 0xFF), char(tag & 0xFF));
- _file->seek(size, SEEK_CUR);
- }
- }
+ _newFrame = false;
- // The frame has been decoded
+ _curFrame = -1;
+ _frameCount = header->numFrames;
+ _frameRate = header->frameRate;
- if (_frameInfo[frameNum] & 0x80000000)
- _screen->setScreenPalette(_screen->getPalette(0));
+ _codeBookSize = 0xF00 * header->blockW * header->blockH;
+ _compressedCodeBook = false;
+ _codeBook = new byte[_codeBookSize];
+ _partialCodeBookSize = 0;
+ _numPartialCodeBooks = 0;
+ _partialCodeBook = new byte[_codeBookSize];
+ _numVectorPointers = (header->width / header->blockW) * (header->height * header->blockH);
+ _vectorPointers = new uint16[_numVectorPointers];
- int blockPitch = _header.width / _header.blockW;
+ memset(_codeBook, 0, _codeBookSize);
+ memset(_partialCodeBook, 0, _codeBookSize);
+ memset(_vectorPointers, 0, _numVectorPointers);
- for (int by = 0; by < _header.height / _header.blockH; by++) {
- for (int bx = 0; bx < blockPitch; bx++) {
- byte *dst = _frame + by * _header.width * _header.blockH + bx * _header.blockW;
- int val = _vectorPointers[by * blockPitch + bx];
+ _surface = new Graphics::Surface();
+ _surface->create(header->width, header->height, Graphics::PixelFormat::createFormatCLUT8());
+}
- if ((val & 0xFF00) == 0xFF00) {
- // Solid color
- for (i = 0; i < _header.blockH; i++) {
- memset(dst, 255 - (val & 0xFF), _header.blockW);
- dst += _header.width;
- }
- } else {
- // Copy data from _vectorPointers. I'm not sure
- // why we don't use the three least significant
- // bits of 'val'.
- byte *src = &_codeBook[(val >> 3) * _header.blockW * _header.blockH];
-
- for (i = 0; i < _header.blockH; i++) {
- memcpy(dst, src, _header.blockW);
- src += _header.blockW;
- dst += _header.width;
- }
- }
- }
- }
+VQADecoder::VQAVideoTrack::~VQAVideoTrack() {
+ _surface->free();
+ delete _surface;
+ delete[] _codeBook;
+ delete[] _partialCodeBook;
+ delete[] _vectorPointers;
+}
- if (_numPartialCodeBooks == _header.cbParts) {
- if (_compressedCodeBook) {
- Screen::decodeFrame4(_partialCodeBook, _codeBook, _codeBookSize);
- } else {
- memcpy(_codeBook, _partialCodeBook, _partialCodeBookSize);
- }
- _numPartialCodeBooks = 0;
- _partialCodeBookSize = 0;
- }
+uint16 VQADecoder::VQAVideoTrack::getWidth() const {
+ return _width;
+}
- _screen->copyBlockToPage(_drawPage, _x, _y, _header.width, _header.height, _frame);
+uint16 VQADecoder::VQAVideoTrack::getHeight() const {
+ return _height;
}
-void VQAMovie::play() {
- uint32 startTick;
+Graphics::PixelFormat VQADecoder::VQAVideoTrack::getPixelFormat() const {
+ return _surface->format;
+}
- if (!_opened)
- return;
+int VQADecoder::VQAVideoTrack::getCurFrame() const {
+ return _curFrame;
+}
- startTick = _system->getMillis();
+int VQADecoder::VQAVideoTrack::getFrameCount() const {
+ return _frameCount;
+}
- // First, handle any sound chunk that appears before the first frame.
- // At least in some versions, it will contain half a second of audio,
- // presumably to lessen the risk of audio underflow.
- //
- // In most movies, we will find a CMDS tag. The purpose of this is
- // currently unknown.
- //
- // In cow1_0.vqa, cow1_1.vqa, jung0.vqa, and jung1.vqa we will find a
- // VQFR tag. A frame before the first frame? Weird. It doesn't seem to
- // be needed, though.
+Common::Rational VQADecoder::VQAVideoTrack::getFrameRate() const {
+ return _frameRate;
+}
- byte *inbuf, *outbuf;
- uint32 insize, outsize;
+void VQADecoder::VQAVideoTrack::setHasDirtyPalette() {
+ _dirtyPalette = true;
+}
- if (_stream) {
- while ((uint)_file->pos() < (_frameInfo[0] & 0x7FFFFFFF)) {
- uint32 tag = readTag();
- uint32 size = _file->readUint32BE();
+bool VQADecoder::VQAVideoTrack::hasDirtyPalette() const {
+ return _dirtyPalette;
+}
- if (_file->eos()) {
- warning("VQAMovie::play: Unexpected EOF");
- break;
- }
+const byte *VQADecoder::VQAVideoTrack::getPalette() const {
+ _dirtyPalette = false;
+ return _palette;
+}
- switch (tag) {
- case MKTAG('S','N','D','0'): // Uncompressed sound
- inbuf = (byte *)malloc(size);
- _file->read(inbuf, size);
- _stream->queueBuffer(inbuf, size, DisposeAfterUse::YES, Audio::FLAG_UNSIGNED);
- break;
+const Graphics::Surface *VQADecoder::VQAVideoTrack::decodeNextFrame() {
+ if (_newFrame) {
+ _newFrame = false;
- case MKTAG('S','N','D','1'): // Compressed sound
- outsize = _file->readUint16LE();
- insize = _file->readUint16LE();
+ int blockPitch = _width / _blockW;
- inbuf = (byte *)malloc(insize);
- _file->read(inbuf, insize);
+ for (int by = 0; by < _height / _blockH; by++) {
+ for (int bx = 0; bx < blockPitch; bx++) {
+ byte *dst = (byte *)_surface->getBasePtr(bx * _blockW, by * _blockH);
+ int val = _vectorPointers[by * blockPitch + bx];
+ int i;
- if (insize == outsize) {
- _stream->queueBuffer(inbuf, insize, DisposeAfterUse::YES, Audio::FLAG_UNSIGNED);
+ if ((val & 0xFF00) == 0xFF00) {
+ // Solid color
+ for (i = 0; i < _blockH; i++) {
+ memset(dst, 255 - (val & 0xFF), _blockW);
+ dst += _width;
+ }
} else {
- outbuf = (byte *)malloc(outsize);
- decodeSND1(inbuf, insize, outbuf, outsize);
- _stream->queueBuffer(outbuf, outsize, DisposeAfterUse::YES, Audio::FLAG_UNSIGNED);
- free(inbuf);
+ // Copy data from _vectorPointers. I'm not sure
+ // why we don't use the three least significant
+ // bits of 'val'.
+ byte *src = &_codeBook[(val >> 3) * _blockW * _blockH];
+
+ for (i = 0; i < _blockH; i++) {
+ memcpy(dst, src, _blockW);
+ src += _blockW;
+ dst += _width;
+ }
}
- break;
+ }
+ }
- case MKTAG('S','N','D','2'): // Compressed sound
- warning("VQAMovie::play: `SND2' is not implemented");
- _file->seek(size, SEEK_CUR);
- break;
+ if (_numPartialCodeBooks == _cbParts) {
+ if (_compressedCodeBook) {
+ Screen::decodeFrame4(_partialCodeBook, _codeBook, _codeBookSize);
+ } else {
+ memcpy(_codeBook, _partialCodeBook, _partialCodeBookSize);
+ }
+ _numPartialCodeBooks = 0;
+ _partialCodeBookSize = 0;
+ }
+ }
- case MKTAG('C','M','D','S'): // Unused tag, always empty in kyra3
- _file->seek(size, SEEK_CUR);
- break;
+ _curFrame++;
+ return _surface;
+}
- default:
- warning("VQAMovie::play: Unknown tag `%c%c%c%c'", char((tag >> 24) & 0xFF), char((tag >> 16) & 0xFF), char((tag >> 8) & 0xFF), char(tag & 0xFF));
- _file->seek(size, SEEK_CUR);
- }
+void VQADecoder::VQAVideoTrack::handleVQFR(Common::SeekableReadStream *stream) {
+ uint32 size = stream->readUint32BE();
+ int32 end = stream->pos() + size - 8;
+ byte *inbuf;
+
+ _newFrame = true;
+
+ while (stream->pos() < end) {
+ uint32 tag = readTag(stream);
+ uint32 i;
+ size = stream->readUint32BE();
+
+ switch (tag) {
+ case MKTAG('C','B','F','0'): // Full codebook
+ stream->read(_codeBook, size);
+ break;
+ case MKTAG('C','B','F','Z'): // Full codebook
+ inbuf = (byte *)malloc(size);
+ stream->read(inbuf, size);
+ Screen::decodeFrame4(inbuf, _codeBook, _codeBookSize);
+ free(inbuf);
+ break;
+ case MKTAG('C','B','P','0'): // Partial codebook
+ _compressedCodeBook = false;
+ stream->read(_partialCodeBook + _partialCodeBookSize, size);
+ _partialCodeBookSize += size;
+ _numPartialCodeBooks++;
+ break;
+ case MKTAG('C','B','P','Z'): // Partial codebook
+ _compressedCodeBook = true;
+ stream->read(_partialCodeBook + _partialCodeBookSize, size);
+ _partialCodeBookSize += size;
+ _numPartialCodeBooks++;
+ break;
+ case MKTAG('C','P','L','0'): // Palette
+ assert(size <= 3 * 256);
+ stream->read(_palette, size);
+ break;
+ case MKTAG('C','P','L','Z'): // Palette
+ inbuf = (byte *)malloc(size);
+ stream->read(inbuf, size);
+ Screen::decodeFrame4(inbuf, _palette, 3 * 256);
+ free(inbuf);
+ break;
+ case MKTAG('V','P','T','0'): // Frame data
+ assert(size / 2 <= _numVectorPointers);
+ for (i = 0; i < size / 2; i++)
+ _vectorPointers[i] = stream->readUint16LE();
+ break;
+ case MKTAG('V','P','T','Z'): // Frame data
+ inbuf = (byte *)malloc(size);
+ stream->read(inbuf, size);
+ size = Screen::decodeFrame4(inbuf, (uint8 *)_vectorPointers, 2 * _numVectorPointers);
+ for (i = 0; i < size / 2; i++)
+ _vectorPointers[i] = TO_LE_16(_vectorPointers[i]);
+ free(inbuf);
+ break;
+ default:
+ warning("VQADecoder::VQAVideoTrack::handleVQFR(): Unknown `VQFR' sub-tag `%s'", tag2str(tag));
+ stream->seek(size, SEEK_CUR);
+ break;
}
}
+}
- _vm->_mixer->playStream(Audio::Mixer::kSFXSoundType, &_sound, _stream);
- Common::EventManager *eventMan = _vm->getEventManager();
+// -----------------------------------------------------------------------
- for (uint i = 0; i < _header.numFrames; i++) {
- displayFrame(i);
+VQAMovie::VQAMovie(KyraEngine_v1 *vm, OSystem *system) {
+ _system = system;
+ _vm = vm;
+ _screen = _vm->screen();
+ _decoder = new VQADecoder();
+}
- // TODO: Implement frame skipping?
+VQAMovie::~VQAMovie() {
+ close();
+ delete _decoder;
+}
- while (1) {
- uint32 elapsedTime;
+bool VQAMovie::open(const char *filename) {
+ if (_file.open(filename)) {
+ return true;
+ }
+ return false;
+}
+
+void VQAMovie::close() {
+ if (_file.isOpen()) {
+ _file.close();
+ }
+}
+
+void VQAMovie::play() {
+ if (_decoder->loadStream(&_file)) {
+ Common::EventManager *eventMan = _vm->getEventManager();
+ int width = _decoder->getWidth();
+ int height = _decoder->getHeight();
+ int x = (Screen::SCREEN_W - width) / 2;
+ int y = (Screen::SCREEN_H - height) / 2;
- if (_vm->_mixer->isSoundHandleActive(_sound))
- elapsedTime = _vm->_mixer->getSoundElapsedTime(_sound);
- else
- elapsedTime = _system->getMillis() - startTick;
+ _decoder->start();
- if (elapsedTime >= (i * 1000) / _header.frameRate)
- break;
+ // Note that decoding starts at frame -1. That's because there
+ // is usually sound data before the first frame, probably to
+ // avoid sound underflow.
+ while (!_decoder->endOfVideo()) {
Common::Event event;
while (eventMan->pollEvent(event)) {
switch (event.type) {
@@ -673,23 +635,32 @@ void VQAMovie::play() {
if (event.kbd.keycode == Common::KEYCODE_ESCAPE)
return;
break;
-
case Common::EVENT_RTL:
case Common::EVENT_QUIT:
return;
-
default:
break;
}
}
+ if (_decoder->needsUpdate()) {
+ const Graphics::Surface *surface = _decoder->decodeNextFrame();
+ if (_decoder->hasDirtyPalette()) {
+ const byte *decoderPalette = _decoder->getPalette();
+ byte systemPalette[256 * 3];
+ for (int i = 0; i < ARRAYSIZE(systemPalette); i++) {
+ systemPalette[i] = (decoderPalette[i] * 0xFF) / 0x3F;
+ }
+ _system->getPaletteManager()->setPalette(systemPalette, 0, 256);
+ }
+
+ _system->copyRectToScreen((const byte *)surface->getBasePtr(0, 0), surface->pitch, x, y, width, height);
+ }
+
+ _system->updateScreen();
_system->delayMillis(10);
}
-
- _screen->updateScreen();
}
-
- // TODO: Wait for the sound to finish?
}
} // End of namespace Kyra
diff --git a/engines/kyra/vqa.h b/engines/kyra/vqa.h
index 839bf5ac48..d23704a9ea 100644
--- a/engines/kyra/vqa.h
+++ b/engines/kyra/vqa.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -23,9 +23,9 @@
#ifndef KYRA_VQA_H
#define KYRA_VQA_H
-#include "common/scummsys.h"
-
-#include "audio/mixer.h"
+#include "video/video_decoder.h"
+#include "common/file.h"
+#include "common/rational.h"
class OSystem;
@@ -33,40 +33,24 @@ namespace Audio {
class QueuingAudioStream;
} // End of namespace Audio
-namespace Common {
-class SeekableReadStream;
-} // End of namespace Common
-
namespace Kyra {
class KyraEngine_v1;
class Screen;
-class VQAMovie {
+class VQADecoder : public Video::VideoDecoder {
public:
- VQAMovie(KyraEngine_v1 *vm, OSystem *system);
- ~VQAMovie();
+ VQADecoder();
+ virtual ~VQADecoder();
- bool opened() { return _opened; }
- int frames() { return _opened ? _header.numFrames : -1; }
+ bool loadStream(Common::SeekableReadStream *stream);
+ void readNextPacket();
- // It's unlikely that we ever want to change the movie position from
- // its default.
+private:
+ Common::SeekableReadStream *_fileStream;
- void setDrawPage(int page) { _drawPage = page; }
-
- bool open(const char *filename);
- void close();
- void play();
-
-protected:
- OSystem *_system;
- KyraEngine_v1 *_vm;
- Screen *_screen;
-
- bool _opened;
- int _x, _y;
- int _drawPage;
+ void handleVQHD(Common::SeekableReadStream *stream);
+ void handleFINF(Common::SeekableReadStream *stream);
struct VQAHeader {
uint16 version;
@@ -91,40 +75,85 @@ protected:
uint32 unk5;
};
- struct Buffer {
- uint8 *data;
- uint32 size;
- };
-
- Buffer _buffers[2];
-
- void initBuffers();
- void *allocBuffer(int num, uint32 size);
- void freeBuffers();
+ VQAHeader _header;
+ uint32 *_frameInfo;
- void decodeSND1(byte *inbuf, uint32 insize, byte *outbuf, uint32 outsize);
+ class VQAAudioTrack : public AudioTrack {
+ public:
+ VQAAudioTrack(const VQAHeader *header);
+ ~VQAAudioTrack();
- void displayFrame(uint frameNum);
+ void handleSND0(Common::SeekableReadStream *stream);
+ void handleSND1(Common::SeekableReadStream *stream);
+ void handleSND2(Common::SeekableReadStream *stream);
- Common::SeekableReadStream *_file;
+ protected:
+ Audio::AudioStream *getAudioStream() const;
- VQAHeader _header;
- uint32 *_frameInfo;
- uint32 _codeBookSize;
- byte *_codeBook;
- byte *_partialCodeBook;
- bool _compressedCodeBook;
- int _partialCodeBookSize;
- int _numPartialCodeBooks;
- uint32 _numVectorPointers;
- uint16 *_vectorPointers;
+ private:
+ Audio::QueuingAudioStream *_audioStream;
+ };
- byte *_frame;
+ class VQAVideoTrack : public FixedRateVideoTrack {
+ public:
+ VQAVideoTrack(const VQAHeader *header);
+ ~VQAVideoTrack();
+
+ uint16 getWidth() const;
+ uint16 getHeight() const;
+ Graphics::PixelFormat getPixelFormat() const;
+ int getCurFrame() const;
+ int getFrameCount() const;
+ const Graphics::Surface *decodeNextFrame();
+
+ void setHasDirtyPalette();
+ bool hasDirtyPalette() const;
+ const byte *getPalette() const;
+
+ void handleVQFR(Common::SeekableReadStream *stream);
+
+ protected:
+ Common::Rational getFrameRate() const;
+
+ private:
+ Graphics::Surface *_surface;
+ byte _palette[3 * 256];
+ mutable bool _dirtyPalette;
+
+ bool _newFrame;
+
+ uint16 _width, _height;
+ uint8 _blockW, _blockH;
+ uint8 _cbParts;
+ int _frameCount;
+ int _curFrame;
+ byte _frameRate;
+
+ uint32 _codeBookSize;
+ bool _compressedCodeBook;
+ byte *_codeBook;
+ int _partialCodeBookSize;
+ int _numPartialCodeBooks;
+ byte *_partialCodeBook;
+ uint32 _numVectorPointers;
+ uint16 *_vectorPointers;
+ };
+};
- Audio::QueuingAudioStream *_stream;
- Audio::SoundHandle _sound;
+class VQAMovie {
+public:
+ VQAMovie(KyraEngine_v1 *vm, OSystem *system);
+ ~VQAMovie();
- uint32 readTag();
+ bool open(const char *filename);
+ void close();
+ void play();
+private:
+ OSystem *_system;
+ KyraEngine_v1 *_vm;
+ Screen *_screen;
+ VQADecoder *_decoder;
+ Common::File _file;
};
} // End of namespace Kyra
diff --git a/engines/kyra/wsamovie.cpp b/engines/kyra/wsamovie.cpp
index f6aca2bb82..560ac8c332 100644
--- a/engines/kyra/wsamovie.cpp
+++ b/engines/kyra/wsamovie.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/kyra/wsamovie.h b/engines/kyra/wsamovie.h
index 7dadc9319b..d00aa89af1 100644
--- a/engines/kyra/wsamovie.h
+++ b/engines/kyra/wsamovie.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/lastexpress/configure.engine b/engines/lastexpress/configure.engine
new file mode 100644
index 0000000000..807b1a088b
--- /dev/null
+++ b/engines/lastexpress/configure.engine
@@ -0,0 +1,3 @@
+# This file is included from the main "configure" script
+# add_engine [name] [desc] [build-by-default] [subengines] [base games] [deps]
+add_engine lastexpress "The Last Express" no "" "" "16bit"
diff --git a/engines/lastexpress/data/animation.cpp b/engines/lastexpress/data/animation.cpp
index 832bcc2e26..148854e04d 100644
--- a/engines/lastexpress/data/animation.cpp
+++ b/engines/lastexpress/data/animation.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -39,7 +39,7 @@
namespace LastExpress {
-Animation::Animation() : _stream(NULL), _currentChunk(NULL), _overlay(NULL), _background1(NULL), _background2(NULL), _backgroundCurrent(0), _audio(NULL), _startTime(0), _changed(false), _flag(0) {
+Animation::Animation() : _stream(NULL), _currentChunk(NULL), _overlay(NULL), _background1(NULL), _background2(NULL), _backgroundCurrent(0), _audio(NULL), _startTime(0), _changed(false) {
}
Animation::~Animation() {
diff --git a/engines/lastexpress/data/animation.h b/engines/lastexpress/data/animation.h
index 293511b266..9523cddb78 100644
--- a/engines/lastexpress/data/animation.h
+++ b/engines/lastexpress/data/animation.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -113,7 +113,6 @@ private:
uint32 _startTime;
bool _changed;
- int _flag;
};
} // End of namespace LastExpress
diff --git a/engines/lastexpress/data/archive.cpp b/engines/lastexpress/data/archive.cpp
index 908d58254a..f667da9e1c 100644
--- a/engines/lastexpress/data/archive.cpp
+++ b/engines/lastexpress/data/archive.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/lastexpress/data/archive.h b/engines/lastexpress/data/archive.h
index 011c830668..421220e6c7 100644
--- a/engines/lastexpress/data/archive.h
+++ b/engines/lastexpress/data/archive.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/lastexpress/data/background.cpp b/engines/lastexpress/data/background.cpp
index 60379251a3..e1626213e0 100644
--- a/engines/lastexpress/data/background.cpp
+++ b/engines/lastexpress/data/background.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/lastexpress/data/background.h b/engines/lastexpress/data/background.h
index 74dad541aa..c4a3216171 100644
--- a/engines/lastexpress/data/background.h
+++ b/engines/lastexpress/data/background.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/lastexpress/data/cursor.cpp b/engines/lastexpress/data/cursor.cpp
index d176d963d1..fe1092a7ef 100644
--- a/engines/lastexpress/data/cursor.cpp
+++ b/engines/lastexpress/data/cursor.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/lastexpress/data/cursor.h b/engines/lastexpress/data/cursor.h
index 0e11ec04b8..63932b3d7e 100644
--- a/engines/lastexpress/data/cursor.h
+++ b/engines/lastexpress/data/cursor.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/lastexpress/data/font.cpp b/engines/lastexpress/data/font.cpp
index 8ac1afce9a..fb1b26582e 100644
--- a/engines/lastexpress/data/font.cpp
+++ b/engines/lastexpress/data/font.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/lastexpress/data/font.h b/engines/lastexpress/data/font.h
index 7696829b3b..cc6f8e03e0 100644
--- a/engines/lastexpress/data/font.h
+++ b/engines/lastexpress/data/font.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/lastexpress/data/scene.cpp b/engines/lastexpress/data/scene.cpp
index fdb1ac6d46..4e20e219d5 100644
--- a/engines/lastexpress/data/scene.cpp
+++ b/engines/lastexpress/data/scene.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/lastexpress/data/scene.h b/engines/lastexpress/data/scene.h
index b99e56a74c..b9aff4da6b 100644
--- a/engines/lastexpress/data/scene.h
+++ b/engines/lastexpress/data/scene.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/lastexpress/data/sequence.cpp b/engines/lastexpress/data/sequence.cpp
index c7073b560c..f43e2afdef 100644
--- a/engines/lastexpress/data/sequence.cpp
+++ b/engines/lastexpress/data/sequence.cpp
@@ -76,7 +76,7 @@ void FrameInfo::read(Common::SeekableReadStream *in, bool isSequence) {
// AnimFrame
-AnimFrame::AnimFrame(Common::SeekableReadStream *in, const FrameInfo &f, bool ignoreSubtype) : _palette(NULL), _ignoreSubtype(ignoreSubtype) {
+AnimFrame::AnimFrame(Common::SeekableReadStream *in, const FrameInfo &f, bool /* ignoreSubtype */) : _palette(NULL) {
_palSize = 1;
// TODO: use just the needed rectangle
_image.create(640, 480, Graphics::PixelFormat::createFormatCLUT8());
diff --git a/engines/lastexpress/data/sequence.h b/engines/lastexpress/data/sequence.h
index 610a55cebf..fd8b3cd27b 100644
--- a/engines/lastexpress/data/sequence.h
+++ b/engines/lastexpress/data/sequence.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -147,7 +147,6 @@ private:
uint16 _palSize;
uint16 *_palette;
Common::Rect _rect;
- bool _ignoreSubtype;
};
class Sequence {
diff --git a/engines/lastexpress/data/snd.cpp b/engines/lastexpress/data/snd.cpp
index a77e4a06c6..2a221afadc 100644
--- a/engines/lastexpress/data/snd.cpp
+++ b/engines/lastexpress/data/snd.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/lastexpress/data/snd.h b/engines/lastexpress/data/snd.h
index 7111d939e7..f489304ff3 100644
--- a/engines/lastexpress/data/snd.h
+++ b/engines/lastexpress/data/snd.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/lastexpress/data/subtitle.cpp b/engines/lastexpress/data/subtitle.cpp
index 4d19c02aa7..3e0da8cb55 100644
--- a/engines/lastexpress/data/subtitle.cpp
+++ b/engines/lastexpress/data/subtitle.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/lastexpress/data/subtitle.h b/engines/lastexpress/data/subtitle.h
index 435408e4bd..40f6c11634 100644
--- a/engines/lastexpress/data/subtitle.h
+++ b/engines/lastexpress/data/subtitle.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/lastexpress/debug.cpp b/engines/lastexpress/debug.cpp
index 7c83aff93d..57943f9a8d 100644
--- a/engines/lastexpress/debug.cpp
+++ b/engines/lastexpress/debug.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -60,33 +60,33 @@ Debugger::Debugger(LastExpressEngine *engine) : _engine(engine), _command(NULL),
// Register the debugger commands
// General
- DCmd_Register("help", WRAP_METHOD(Debugger, cmdHelp));
+ registerCmd("help", WRAP_METHOD(Debugger, cmdHelp));
// Data
- DCmd_Register("ls", WRAP_METHOD(Debugger, cmdListFiles));
- DCmd_Register("dump", WRAP_METHOD(Debugger, cmdDumpFiles));
+ registerCmd("ls", WRAP_METHOD(Debugger, cmdListFiles));
+ registerCmd("dump", WRAP_METHOD(Debugger, cmdDumpFiles));
- DCmd_Register("showframe", WRAP_METHOD(Debugger, cmdShowFrame));
- DCmd_Register("showbg", WRAP_METHOD(Debugger, cmdShowBg));
- DCmd_Register("playseq", WRAP_METHOD(Debugger, cmdPlaySeq));
- DCmd_Register("playsnd", WRAP_METHOD(Debugger, cmdPlaySnd));
- DCmd_Register("playsbe", WRAP_METHOD(Debugger, cmdPlaySbe));
- DCmd_Register("playnis", WRAP_METHOD(Debugger, cmdPlayNis));
+ registerCmd("showframe", WRAP_METHOD(Debugger, cmdShowFrame));
+ registerCmd("showbg", WRAP_METHOD(Debugger, cmdShowBg));
+ registerCmd("playseq", WRAP_METHOD(Debugger, cmdPlaySeq));
+ registerCmd("playsnd", WRAP_METHOD(Debugger, cmdPlaySnd));
+ registerCmd("playsbe", WRAP_METHOD(Debugger, cmdPlaySbe));
+ registerCmd("playnis", WRAP_METHOD(Debugger, cmdPlayNis));
// Scene & interaction
- DCmd_Register("loadscene", WRAP_METHOD(Debugger, cmdLoadScene));
- DCmd_Register("fight", WRAP_METHOD(Debugger, cmdFight));
- DCmd_Register("beetle", WRAP_METHOD(Debugger, cmdBeetle));
+ registerCmd("loadscene", WRAP_METHOD(Debugger, cmdLoadScene));
+ registerCmd("fight", WRAP_METHOD(Debugger, cmdFight));
+ registerCmd("beetle", WRAP_METHOD(Debugger, cmdBeetle));
// Game
- DCmd_Register("delta", WRAP_METHOD(Debugger, cmdTimeDelta));
- DCmd_Register("time", WRAP_METHOD(Debugger, cmdTime));
- DCmd_Register("show", WRAP_METHOD(Debugger, cmdShow));
- DCmd_Register("entity", WRAP_METHOD(Debugger, cmdEntity));
+ registerCmd("delta", WRAP_METHOD(Debugger, cmdTimeDelta));
+ registerCmd("time", WRAP_METHOD(Debugger, cmdTime));
+ registerCmd("show", WRAP_METHOD(Debugger, cmdShow));
+ registerCmd("entity", WRAP_METHOD(Debugger, cmdEntity));
// Misc
- DCmd_Register("chapter", WRAP_METHOD(Debugger, cmdSwitchChapter));
- DCmd_Register("clear", WRAP_METHOD(Debugger, cmdClear));
+ registerCmd("chapter", WRAP_METHOD(Debugger, cmdSwitchChapter));
+ registerCmd("clear", WRAP_METHOD(Debugger, cmdClear));
resetCommand();
@@ -146,7 +146,7 @@ void Debugger::copyCommand(int argc, const char **argv) {
}
// Exit the debugger!
- Cmd_Exit(0, 0);
+ cmdExit(0, 0);
}
void Debugger::callCommand() {
@@ -156,7 +156,7 @@ void Debugger::callCommand() {
bool Debugger::loadArchive(int index) {
if (index < 1 || index > 3) {
- DebugPrintf("Invalid cd number (was: %d, valid: [1-3])\n", index);
+ debugPrintf("Invalid cd number (was: %d, valid: [1-3])\n", index);
return false;
}
@@ -198,36 +198,36 @@ void Debugger::restoreArchive() const {
// Debugger commands
//////////////////////////////////////////////////////////////////////////
bool Debugger::cmdHelp(int, const char **) {
- DebugPrintf("Debug flags\n");
- DebugPrintf("-----------\n");
- DebugPrintf(" debugflag_list - Lists the available debug flags and their status\n");
- DebugPrintf(" debugflag_enable - Enables a debug flag\n");
- DebugPrintf(" debugflag_disable - Disables a debug flag\n");
- DebugPrintf("\n");
- DebugPrintf("Commands\n");
- DebugPrintf("--------\n");
- DebugPrintf(" ls - list files in the archive\n");
- DebugPrintf(" dump - dump a list of files in all archives\n");
- DebugPrintf("\n");
- DebugPrintf(" showframe - show a frame from a sequence\n");
- DebugPrintf(" showbg - show a background\n");
- DebugPrintf(" playseq - play a sequence\n");
- DebugPrintf(" playsnd - play a sound\n");
- DebugPrintf(" playsbe - play a subtitle\n");
- DebugPrintf(" playnis - play an animation\n");
- DebugPrintf("\n");
- DebugPrintf(" loadscene - load a scene\n");
- DebugPrintf(" fight - start a fight\n");
- DebugPrintf(" beetle - start the beetle game\n");
- DebugPrintf("\n");
- DebugPrintf(" delta - Adjust the time delta\n");
- DebugPrintf(" show - show game data\n");
- DebugPrintf(" entity - show entity data\n");
- DebugPrintf("\n");
- DebugPrintf(" loadgame - load a saved game\n");
- DebugPrintf(" chapter - switch to a specific chapter\n");
- DebugPrintf(" clear - clear the screen\n");
- DebugPrintf("\n");
+ debugPrintf("Debug flags\n");
+ debugPrintf("-----------\n");
+ debugPrintf(" debugflag_list - Lists the available debug flags and their status\n");
+ debugPrintf(" debugflag_enable - Enables a debug flag\n");
+ debugPrintf(" debugflag_disable - Disables a debug flag\n");
+ debugPrintf("\n");
+ debugPrintf("Commands\n");
+ debugPrintf("--------\n");
+ debugPrintf(" ls - list files in the archive\n");
+ debugPrintf(" dump - dump a list of files in all archives\n");
+ debugPrintf("\n");
+ debugPrintf(" showframe - show a frame from a sequence\n");
+ debugPrintf(" showbg - show a background\n");
+ debugPrintf(" playseq - play a sequence\n");
+ debugPrintf(" playsnd - play a sound\n");
+ debugPrintf(" playsbe - play a subtitle\n");
+ debugPrintf(" playnis - play an animation\n");
+ debugPrintf("\n");
+ debugPrintf(" loadscene - load a scene\n");
+ debugPrintf(" fight - start a fight\n");
+ debugPrintf(" beetle - start the beetle game\n");
+ debugPrintf("\n");
+ debugPrintf(" delta - Adjust the time delta\n");
+ debugPrintf(" show - show game data\n");
+ debugPrintf(" entity - show entity data\n");
+ debugPrintf("\n");
+ debugPrintf(" loadgame - load a saved game\n");
+ debugPrintf(" chapter - switch to a specific chapter\n");
+ debugPrintf(" clear - clear the screen\n");
+ debugPrintf("\n");
return true;
}
@@ -252,15 +252,15 @@ bool Debugger::cmdListFiles(int argc, const char **argv) {
Common::ArchiveMemberList list;
int count = _engine->getResourceManager()->listMatchingMembers(list, filter);
- DebugPrintf("Number of matches: %d\n", count);
+ debugPrintf("Number of matches: %d\n", count);
for (Common::ArchiveMemberList::iterator it = list.begin(); it != list.end(); ++it)
- DebugPrintf(" %s\n", (*it)->getName().c_str());
+ debugPrintf(" %s\n", (*it)->getName().c_str());
// Restore archive
if (argc == 3)
restoreArchive();
} else {
- DebugPrintf("Syntax: ls <filter> (use * for all) (<cd number>)\n");
+ debugPrintf("Syntax: ls <filter> (use * for all) (<cd number>)\n");
}
return true;
@@ -287,7 +287,7 @@ bool Debugger::cmdDumpFiles(int argc, const char **) {
for (Common::ArchiveMemberList::iterator it = list.begin(); it != list.end(); ++it) { \
Common::SeekableReadStream *stream = getArchive((*it)->getName()); \
if (!stream) { \
- DebugPrintf("ERROR: Cannot create stream for file: %s\n", (*it)->getName().c_str()); \
+ debugPrintf("ERROR: Cannot create stream for file: %s\n", (*it)->getName().c_str()); \
restoreArchive(); \
return true; \
} \
@@ -311,7 +311,7 @@ bool Debugger::cmdDumpFiles(int argc, const char **) {
// Restore current loaded archive
restoreArchive();
} else {
- DebugPrintf("Syntax: dump");
+ debugPrintf("Syntax: dump");
}
return true;
@@ -336,7 +336,7 @@ bool Debugger::cmdShowFrame(int argc, const char **argv) {
}
if (!_engine->getResourceManager()->hasFile(filename)) {
- DebugPrintf("Cannot find file: %s\n", filename.c_str());
+ debugPrintf("Cannot find file: %s\n", filename.c_str());
return true;
}
@@ -345,7 +345,7 @@ bool Debugger::cmdShowFrame(int argc, const char **argv) {
_command = WRAP_METHOD(Debugger, cmdShowFrame);
copyCommand(argc, argv);
- return Cmd_Exit(0, 0);
+ return cmdExit(0, 0);
} else {
Sequence sequence(filename);
if (sequence.load(getArchive(filename))) {
@@ -354,7 +354,7 @@ bool Debugger::cmdShowFrame(int argc, const char **argv) {
AnimFrame *frame = sequence.getFrame((uint16)getNumber(argv[2]));
if (!frame) {
- DebugPrintf("Invalid frame index '%s'\n", argv[2]);
+ debugPrintf("Invalid frame index '%s'\n", argv[2]);
resetCommand();
return true;
}
@@ -375,7 +375,7 @@ bool Debugger::cmdShowFrame(int argc, const char **argv) {
restoreArchive();
}
} else {
- DebugPrintf("Syntax: cmd_showframe <seqname> <index> (<cd number>)\n");
+ debugPrintf("Syntax: cmd_showframe <seqname> <index> (<cd number>)\n");
}
return true;
}
@@ -398,7 +398,7 @@ bool Debugger::cmdShowBg(int argc, const char **argv) {
}
if (!_engine->getResourceManager()->hasFile(filename + ".BG")) {
- DebugPrintf("Cannot find file: %s\n", (filename + ".BG").c_str());
+ debugPrintf("Cannot find file: %s\n", (filename + ".BG").c_str());
return true;
}
@@ -407,7 +407,7 @@ bool Debugger::cmdShowBg(int argc, const char **argv) {
_command = WRAP_METHOD(Debugger, cmdShowBg);
copyCommand(argc, argv);
- return Cmd_Exit(0, 0);
+ return cmdExit(0, 0);
} else {
clearBg(GraphicsManager::kBackgroundC);
@@ -429,7 +429,7 @@ bool Debugger::cmdShowBg(int argc, const char **argv) {
resetCommand();
}
} else {
- DebugPrintf("Syntax: showbg <bgname> (<cd number>)\n");
+ debugPrintf("Syntax: showbg <bgname> (<cd number>)\n");
}
return true;
}
@@ -453,7 +453,7 @@ bool Debugger::cmdPlaySeq(int argc, const char **argv) {
}
if (!_engine->getResourceManager()->hasFile(filename)) {
- DebugPrintf("Cannot find file: %s\n", filename.c_str());
+ debugPrintf("Cannot find file: %s\n", filename.c_str());
return true;
}
@@ -462,7 +462,7 @@ bool Debugger::cmdPlaySeq(int argc, const char **argv) {
_command = WRAP_METHOD(Debugger, cmdPlaySeq);
copyCommand(argc, argv);
- return Cmd_Exit(0, 0);
+ return cmdExit(0, 0);
} else {
Sequence *sequence = new Sequence(filename);
if (sequence->load(getArchive(filename))) {
@@ -510,7 +510,7 @@ bool Debugger::cmdPlaySeq(int argc, const char **argv) {
restoreArchive();
}
} else {
- DebugPrintf("Syntax: playseq <seqname> (<cd number>)\n");
+ debugPrintf("Syntax: playseq <seqname> (<cd number>)\n");
}
return true;
}
@@ -537,7 +537,7 @@ bool Debugger::cmdPlaySnd(int argc, const char **argv) {
name += ".SND";
if (!_engine->getResourceManager()->hasFile(name)) {
- DebugPrintf("Cannot find file: %s\n", name.c_str());
+ debugPrintf("Cannot find file: %s\n", name.c_str());
return true;
}
@@ -548,7 +548,7 @@ bool Debugger::cmdPlaySnd(int argc, const char **argv) {
if (argc == 3)
restoreArchive();
} else {
- DebugPrintf("Syntax: playsnd <sndname> (<cd number>)\n");
+ debugPrintf("Syntax: playsnd <sndname> (<cd number>)\n");
}
return true;
}
@@ -573,7 +573,7 @@ bool Debugger::cmdPlaySbe(int argc, const char **argv) {
filename += ".sbe";
if (!_engine->getResourceManager()->hasFile(filename)) {
- DebugPrintf("Cannot find file: %s\n", filename.c_str());
+ debugPrintf("Cannot find file: %s\n", filename.c_str());
return true;
}
@@ -582,7 +582,7 @@ bool Debugger::cmdPlaySbe(int argc, const char **argv) {
_command = WRAP_METHOD(Debugger, cmdPlaySbe);
copyCommand(argc, argv);
- return Cmd_Exit(0, 0);
+ return cmdExit(0, 0);
} else {
SubtitleManager subtitle(_engine->getFont());
if (subtitle.load(getArchive(filename))) {
@@ -615,7 +615,7 @@ bool Debugger::cmdPlaySbe(int argc, const char **argv) {
resetCommand();
}
} else {
- DebugPrintf("Syntax: playsbe <sbename> (<cd number>)\n");
+ debugPrintf("Syntax: playsbe <sbename> (<cd number>)\n");
}
return true;
}
@@ -639,7 +639,7 @@ bool Debugger::cmdPlayNis(int argc, const char **argv) {
// If we got a nis filename, check that the file exists
if (name.contains('.') && !_engine->getResourceManager()->hasFile(name)) {
- DebugPrintf("Cannot find file: %s\n", name.c_str());
+ debugPrintf("Cannot find file: %s\n", name.c_str());
return true;
}
@@ -648,7 +648,7 @@ bool Debugger::cmdPlayNis(int argc, const char **argv) {
_command = WRAP_METHOD(Debugger, cmdPlayNis);
copyCommand(argc, argv);
- return Cmd_Exit(0, 0);
+ return cmdExit(0, 0);
} else {
// Make sure we are not called in a loop
_numParams = 0;
@@ -672,7 +672,7 @@ bool Debugger::cmdPlayNis(int argc, const char **argv) {
resetCommand();
}
} else {
- DebugPrintf("Syntax: playnis <nisname.nis or animation index> (<cd number>)\n");
+ debugPrintf("Syntax: playnis <nisname.nis or animation index> (<cd number>)\n");
}
return true;
}
@@ -697,7 +697,7 @@ bool Debugger::cmdLoadScene(int argc, const char **argv) {
}
if (index > 2500) {
- DebugPrintf("Error: invalid index value (0-2500)");
+ debugPrintf("Error: invalid index value (0-2500)");
return true;
}
@@ -706,7 +706,7 @@ bool Debugger::cmdLoadScene(int argc, const char **argv) {
_command = WRAP_METHOD(Debugger, cmdLoadScene);
copyCommand(argc, argv);
- return Cmd_Exit(0, 0);
+ return cmdExit(0, 0);
} else {
clearBg(GraphicsManager::kBackgroundAll);
@@ -718,7 +718,7 @@ bool Debugger::cmdLoadScene(int argc, const char **argv) {
// loadSceneObject(scene, i);
// if (scene.getHeader() && scene.getHeader()->car == 5 && scene.getHeader()->position == 81) {
- // DebugPrintf("Found scene: %d", i);
+ // debugPrintf("Found scene: %d", i);
// // Draw scene found
// _engine->getGraphicsManager()->draw(&scene, GraphicsManager::kBackgroundC);
@@ -738,7 +738,7 @@ bool Debugger::cmdLoadScene(int argc, const char **argv) {
/*********************************************/
Scene *scene = getScenes()->get(index);
if (!scene) {
- DebugPrintf("Cannot load scene %i from CD %i", index, cd);
+ debugPrintf("Cannot load scene %i from CD %i", index, cd);
resetCommand();
return true;
@@ -758,7 +758,7 @@ bool Debugger::cmdLoadScene(int argc, const char **argv) {
resetCommand();
}
} else {
- DebugPrintf("Syntax: loadscene <scene index> (<cd number>)\n");
+ debugPrintf("Syntax: loadscene <scene index> (<cd number>)\n");
}
return true;
}
@@ -814,7 +814,7 @@ bool Debugger::cmdFight(int argc, const char **argv) {
SceneIndex lastScene = getState()->scene;
- getFight()->setup(type) ? DebugPrintf("Lost fight!\n") : DebugPrintf("Won fight!\n");
+ getFight()->setup(type) ? debugPrintf("Lost fight!\n") : debugPrintf("Won fight!\n");
// Pause for a second to be able to see the final scene
_engine->_system->delayMillis(1000);
@@ -837,7 +837,7 @@ bool Debugger::cmdFight(int argc, const char **argv) {
}
} else {
error:
- DebugPrintf("Syntax: fight <id> (id=2001-2005)\n");
+ debugPrintf("Syntax: fight <id> (id=2001-2005)\n");
}
return true;
@@ -968,7 +968,7 @@ bool Debugger::cmdBeetle(int argc, const char **argv) {
resetCommand();
}
} else {
- DebugPrintf("Syntax: beetle\n");
+ debugPrintf("Syntax: beetle\n");
}
return true;
@@ -992,7 +992,7 @@ bool Debugger::cmdTimeDelta(int argc, const char **argv) {
getState()->timeDelta = (uint)delta;
} else {
label_error:
- DebugPrintf("Syntax: delta <time delta> (delta=1-500)\n");
+ debugPrintf("Syntax: delta <time delta> (delta=1-500)\n");
}
return true;
@@ -1018,10 +1018,10 @@ bool Debugger::cmdTime(int argc, const char **argv) {
uint8 minutes = 0;
State::getHourMinutes((uint32)time, &hours, &minutes);
- DebugPrintf("%02d:%02d\n", hours, minutes);
+ debugPrintf("%02d:%02d\n", hours, minutes);
} else {
label_error:
- DebugPrintf("Syntax: time <time to convert> (time=0-INT_MAX)\n");
+ debugPrintf("Syntax: time <time to convert> (time=0-INT_MAX)\n");
}
return true;
@@ -1037,10 +1037,10 @@ label_error:
*/
bool Debugger::cmdShow(int argc, const char **argv) {
#define OUTPUT_DUMP(name, text) \
- DebugPrintf(#name "\n"); \
- DebugPrintf("--------------------------------------------------------------------\n\n"); \
- DebugPrintf("%s", text); \
- DebugPrintf("\n");
+ debugPrintf(#name "\n"); \
+ debugPrintf("--------------------------------------------------------------------\n\n"); \
+ debugPrintf("%s", text); \
+ debugPrintf("\n");
if (argc == 2) {
@@ -1066,14 +1066,14 @@ bool Debugger::cmdShow(int argc, const char **argv) {
} else {
label_error:
- DebugPrintf("Syntax: state <option>\n");
- DebugPrintf(" state / st\n");
- DebugPrintf(" progress / pr\n");
- DebugPrintf(" flags / fl\n");
- DebugPrintf(" inventory / inv\n");
- DebugPrintf(" objects / obj\n");
- DebugPrintf(" savepoints / pt\n");
- DebugPrintf(" scene / sc\n");
+ debugPrintf("Syntax: state <option>\n");
+ debugPrintf(" state / st\n");
+ debugPrintf(" progress / pr\n");
+ debugPrintf(" flags / fl\n");
+ debugPrintf(" inventory / inv\n");
+ debugPrintf(" objects / obj\n");
+ debugPrintf(" savepoints / pt\n");
+ debugPrintf(" scene / sc\n");
}
return true;
@@ -1096,26 +1096,26 @@ bool Debugger::cmdEntity(int argc, const char **argv) {
if (index > 39)
goto label_error;
- DebugPrintf("Entity %s\n", ENTITY_NAME(index));
- DebugPrintf("--------------------------------------------------------------------\n\n");
- DebugPrintf("%s", getEntities()->getData(index)->toString().c_str());
+ debugPrintf("Entity %s\n", ENTITY_NAME(index));
+ debugPrintf("--------------------------------------------------------------------\n\n");
+ debugPrintf("%s", getEntities()->getData(index)->toString().c_str());
// The Player entity does not have any callback data
if (index != kEntityPlayer) {
EntityData *data = getEntities()->get(index)->getParamData();
for (uint callback = 0; callback < 9; callback++) {
- DebugPrintf("Call parameters %d:\n", callback);
+ debugPrintf("Call parameters %d:\n", callback);
for (byte ix = 0; ix < 4; ix++)
- DebugPrintf(" %s", data->getParameters(callback, ix)->toString().c_str());
+ debugPrintf(" %s", data->getParameters(callback, ix)->toString().c_str());
}
}
- DebugPrintf("\n");
+ debugPrintf("\n");
} else {
label_error:
- DebugPrintf("Syntax: entity <index>\n");
+ debugPrintf("Syntax: entity <index>\n");
for (int i = 0; i < 40; i += 4)
- DebugPrintf(" %s - %d %s - %d %s - %d %s - %d\n", ENTITY_NAME(i), i, ENTITY_NAME(i+1), i+1, ENTITY_NAME(i+2), i+2, ENTITY_NAME(i+3), i+3);
+ debugPrintf(" %s - %d %s - %d %s - %d %s - %d\n", ENTITY_NAME(i), i, ENTITY_NAME(i+1), i+1, ENTITY_NAME(i+2), i+2, ENTITY_NAME(i+3), i+3);
}
return true;
@@ -1152,7 +1152,7 @@ bool Debugger::cmdSwitchChapter(int argc, const char **argv) {
}
} else {
error:
- DebugPrintf("Syntax: chapter <id> (id=2-6)\n");
+ debugPrintf("Syntax: chapter <id> (id=2-6)\n");
}
return true;
@@ -1172,7 +1172,7 @@ bool Debugger::cmdClear(int argc, const char **) {
askForRedraw();
redrawScreen();
} else {
- DebugPrintf("Syntax: clear - clear the screen\n");
+ debugPrintf("Syntax: clear - clear the screen\n");
}
return true;
diff --git a/engines/lastexpress/debug.h b/engines/lastexpress/debug.h
index 532cb83717..7a1e2648fb 100644
--- a/engines/lastexpress/debug.h
+++ b/engines/lastexpress/debug.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/lastexpress/detection.cpp b/engines/lastexpress/detection.cpp
index 2fdeef910a..d790582104 100644
--- a/engines/lastexpress/detection.cpp
+++ b/engines/lastexpress/detection.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/lastexpress/drawable.h b/engines/lastexpress/drawable.h
index 5e77b0343a..8e844124f9 100644
--- a/engines/lastexpress/drawable.h
+++ b/engines/lastexpress/drawable.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/lastexpress/entities/abbot.cpp b/engines/lastexpress/entities/abbot.cpp
index 406b017d3a..5393410add 100644
--- a/engines/lastexpress/entities/abbot.cpp
+++ b/engines/lastexpress/entities/abbot.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -57,42 +57,42 @@ Abbot::Abbot(LastExpressEngine *engine) : Entity(engine, kEntityAbbot) {
ADD_CALLBACK_FUNCTION(Abbot, chapter1);
ADD_CALLBACK_FUNCTION(Abbot, chapter2);
ADD_CALLBACK_FUNCTION(Abbot, chapter3);
- ADD_CALLBACK_FUNCTION(Abbot, chapter3Handler);
- ADD_CALLBACK_FUNCTION(Abbot, conversationWithBoutarel);
+ ADD_CALLBACK_FUNCTION(Abbot, inKitchen);
+ ADD_CALLBACK_FUNCTION(Abbot, openCompartment);
ADD_CALLBACK_FUNCTION(Abbot, readPaper);
ADD_CALLBACK_FUNCTION(Abbot, goToLunch);
ADD_CALLBACK_FUNCTION(Abbot, haveLunch);
- ADD_CALLBACK_FUNCTION(Abbot, function23);
- ADD_CALLBACK_FUNCTION(Abbot, function24);
- ADD_CALLBACK_FUNCTION(Abbot, function25);
- ADD_CALLBACK_FUNCTION(Abbot, function26);
- ADD_CALLBACK_FUNCTION(Abbot, function27);
- ADD_CALLBACK_FUNCTION(Abbot, function28);
- ADD_CALLBACK_FUNCTION(Abbot, function29);
- ADD_CALLBACK_FUNCTION(Abbot, function30);
- ADD_CALLBACK_FUNCTION(Abbot, function31);
- ADD_CALLBACK_FUNCTION(Abbot, function32);
- ADD_CALLBACK_FUNCTION(Abbot, function33);
- ADD_CALLBACK_FUNCTION(Abbot, function34);
- ADD_CALLBACK_FUNCTION(Abbot, function35);
- ADD_CALLBACK_FUNCTION(Abbot, function36);
- ADD_CALLBACK_FUNCTION(Abbot, function37);
- ADD_CALLBACK_FUNCTION(Abbot, function38);
+ ADD_CALLBACK_FUNCTION(Abbot, leaveLunch);
+ ADD_CALLBACK_FUNCTION(Abbot, closedCompartment);
+ ADD_CALLBACK_FUNCTION(Abbot, goSalon1);
+ ADD_CALLBACK_FUNCTION(Abbot, inSalon1);
+ ADD_CALLBACK_FUNCTION(Abbot, goCompartment);
+ ADD_CALLBACK_FUNCTION(Abbot, openCompartment2);
+ ADD_CALLBACK_FUNCTION(Abbot, goWander);
+ ADD_CALLBACK_FUNCTION(Abbot, goSalon2);
+ ADD_CALLBACK_FUNCTION(Abbot, inSalon2);
+ ADD_CALLBACK_FUNCTION(Abbot, goCompartment3);
+ ADD_CALLBACK_FUNCTION(Abbot, openCompartment3);
+ ADD_CALLBACK_FUNCTION(Abbot, goSalon3);
+ ADD_CALLBACK_FUNCTION(Abbot, inSalon3);
+ ADD_CALLBACK_FUNCTION(Abbot, withAugust);
+ ADD_CALLBACK_FUNCTION(Abbot, goCompartment4);
+ ADD_CALLBACK_FUNCTION(Abbot, inCompartment4);
ADD_CALLBACK_FUNCTION(Abbot, chapter4);
- ADD_CALLBACK_FUNCTION(Abbot, function40);
+ ADD_CALLBACK_FUNCTION(Abbot, doWalkSearchingForCath);
ADD_CALLBACK_FUNCTION(Abbot, chapter4Handler);
- ADD_CALLBACK_FUNCTION(Abbot, function42);
- ADD_CALLBACK_FUNCTION(Abbot, function43);
+ ADD_CALLBACK_FUNCTION(Abbot, leaveDinner);
+ ADD_CALLBACK_FUNCTION(Abbot, inCompartment);
ADD_CALLBACK_FUNCTION(Abbot, function44);
- ADD_CALLBACK_FUNCTION(Abbot, function45);
- ADD_CALLBACK_FUNCTION(Abbot, function46);
- ADD_CALLBACK_FUNCTION(Abbot, drinkAfterDefuse);
- ADD_CALLBACK_FUNCTION(Abbot, function48);
- ADD_CALLBACK_FUNCTION(Abbot, pickBomb);
+ ADD_CALLBACK_FUNCTION(Abbot, conferring);
+ ADD_CALLBACK_FUNCTION(Abbot, goSalon4);
+ ADD_CALLBACK_FUNCTION(Abbot, beforeBomb);
+ ADD_CALLBACK_FUNCTION(Abbot, afterBomb);
+ ADD_CALLBACK_FUNCTION(Abbot, catchCath);
ADD_CALLBACK_FUNCTION(Abbot, chapter5);
ADD_CALLBACK_FUNCTION(Abbot, chapter5Handler);
ADD_CALLBACK_FUNCTION(Abbot, function52);
- ADD_CALLBACK_FUNCTION(Abbot, function53);
+ ADD_CALLBACK_FUNCTION(Abbot, runningTrain);
}
//////////////////////////////////////////////////////////////////////////
@@ -196,7 +196,7 @@ IMPLEMENT_FUNCTION(17, Abbot, chapter3)
break;
case kActionNone:
- setup_chapter3Handler();
+ setup_inKitchen();
break;
case kActionDefault:
@@ -213,7 +213,7 @@ IMPLEMENT_FUNCTION(17, Abbot, chapter3)
IMPLEMENT_FUNCTION_END
//////////////////////////////////////////////////////////////////////////
-IMPLEMENT_FUNCTION(18, Abbot, chapter3Handler)
+IMPLEMENT_FUNCTION(18, Abbot, inKitchen)
switch (savepoint.action) {
default:
break;
@@ -259,7 +259,7 @@ IMPLEMENT_FUNCTION(18, Abbot, chapter3Handler)
getData()->entityPosition = kPosition_6470;
getData()->location = kLocationInsideCompartment;
- setup_conversationWithBoutarel();
+ setup_openCompartment();
break;
}
break;
@@ -272,7 +272,7 @@ IMPLEMENT_FUNCTION(18, Abbot, chapter3Handler)
IMPLEMENT_FUNCTION_END
//////////////////////////////////////////////////////////////////////////
-IMPLEMENT_FUNCTION(19, Abbot, conversationWithBoutarel)
+IMPLEMENT_FUNCTION(19, Abbot, openCompartment)
switch (savepoint.action) {
default:
break;
@@ -419,7 +419,7 @@ IMPLEMENT_FUNCTION(22, Abbot, haveLunch)
if (getState()->time > kTime1989000 && getEntities()->isSomebodyInsideRestaurantOrSalon()) {
getData()->inventoryItem = kItemNone;
- setup_function23();
+ setup_leaveLunch();
}
break;
@@ -456,7 +456,7 @@ IMPLEMENT_FUNCTION(22, Abbot, haveLunch)
IMPLEMENT_FUNCTION_END
//////////////////////////////////////////////////////////////////////////
-IMPLEMENT_FUNCTION(23, Abbot, function23)
+IMPLEMENT_FUNCTION(23, Abbot, leaveLunch)
switch (savepoint.action) {
default:
break;
@@ -500,7 +500,7 @@ IMPLEMENT_FUNCTION(23, Abbot, function23)
case 4:
getData()->location = kLocationInsideCompartment;
- setup_function24();
+ setup_closedCompartment();
break;
}
break;
@@ -508,7 +508,7 @@ IMPLEMENT_FUNCTION(23, Abbot, function23)
IMPLEMENT_FUNCTION_END
//////////////////////////////////////////////////////////////////////////
-IMPLEMENT_FUNCTION(24, Abbot, function24)
+IMPLEMENT_FUNCTION(24, Abbot, closedCompartment)
switch (savepoint.action) {
default:
break;
@@ -517,7 +517,7 @@ IMPLEMENT_FUNCTION(24, Abbot, function24)
if (!Entity::updateParameter(params->param1, getState()->time, 900))
break;
- setup_function25();
+ setup_goSalon1();
break;
case kActionKnock:
@@ -561,7 +561,7 @@ IMPLEMENT_FUNCTION(24, Abbot, function24)
IMPLEMENT_FUNCTION_END
//////////////////////////////////////////////////////////////////////////
-IMPLEMENT_FUNCTION(25, Abbot, function25)
+IMPLEMENT_FUNCTION(25, Abbot, goSalon1)
switch (savepoint.action) {
default:
break;
@@ -602,7 +602,7 @@ IMPLEMENT_FUNCTION(25, Abbot, function25)
getData()->location = kLocationInsideCompartment;
getScenes()->loadSceneFromItemPosition(kItem3);
- setup_function26();
+ setup_inSalon1();
break;
}
break;
@@ -610,7 +610,7 @@ IMPLEMENT_FUNCTION(25, Abbot, function25)
IMPLEMENT_FUNCTION_END
//////////////////////////////////////////////////////////////////////////
-IMPLEMENT_FUNCTION(26, Abbot, function26)
+IMPLEMENT_FUNCTION(26, Abbot, inSalon1)
switch (savepoint.action) {
default:
break;
@@ -620,7 +620,7 @@ IMPLEMENT_FUNCTION(26, Abbot, function26)
break;
if (getEntities()->isSomebodyInsideRestaurantOrSalon())
- setup_function27();
+ setup_goCompartment();
break;
case kActionDefault:
@@ -636,7 +636,7 @@ IMPLEMENT_FUNCTION(26, Abbot, function26)
IMPLEMENT_FUNCTION_END
//////////////////////////////////////////////////////////////////////////
-IMPLEMENT_FUNCTION(27, Abbot, function27)
+IMPLEMENT_FUNCTION(27, Abbot, goCompartment)
switch (savepoint.action) {
default:
break;
@@ -677,7 +677,7 @@ IMPLEMENT_FUNCTION(27, Abbot, function27)
getData()->entityPosition = kPosition_6470;
getData()->location = kLocationInsideCompartment;
- setup_function28();
+ setup_openCompartment2();
break;
}
break;
@@ -685,13 +685,13 @@ IMPLEMENT_FUNCTION(27, Abbot, function27)
IMPLEMENT_FUNCTION_END
//////////////////////////////////////////////////////////////////////////
-IMPLEMENT_FUNCTION(28, Abbot, function28)
+IMPLEMENT_FUNCTION(28, Abbot, openCompartment2)
switch (savepoint.action) {
default:
break;
case kActionNone:
- Entity::timeCheckCallback(kTime2052000, params->param1, 1, WRAP_SETUP_FUNCTION(Abbot, setup_function29));
+ Entity::timeCheckCallback(kTime2052000, params->param1, 1, WRAP_SETUP_FUNCTION(Abbot, setup_goWander));
break;
case kActionDefault:
@@ -708,12 +708,12 @@ IMPLEMENT_FUNCTION(28, Abbot, function28)
break;
case kAction222609266:
- setup_function30();
+ setup_goSalon2();
}
IMPLEMENT_FUNCTION_END
//////////////////////////////////////////////////////////////////////////
-IMPLEMENT_FUNCTION(29, Abbot, function29)
+IMPLEMENT_FUNCTION(29, Abbot, goWander)
switch (savepoint.action) {
default:
break;
@@ -778,7 +778,7 @@ IMPLEMENT_FUNCTION(29, Abbot, function29)
IMPLEMENT_FUNCTION_END
//////////////////////////////////////////////////////////////////////////
-IMPLEMENT_FUNCTION(30, Abbot, function30)
+IMPLEMENT_FUNCTION(30, Abbot, goSalon2)
switch (savepoint.action) {
default:
break;
@@ -826,7 +826,7 @@ switch (savepoint.action) {
getScenes()->loadSceneFromItemPosition(kItem3);
getData()->location = kLocationInsideCompartment;
- setup_function31();
+ setup_inSalon2();
break;
}
break;
@@ -834,7 +834,7 @@ switch (savepoint.action) {
IMPLEMENT_FUNCTION_END
//////////////////////////////////////////////////////////////////////////
-IMPLEMENT_FUNCTION(31, Abbot, function31)
+IMPLEMENT_FUNCTION(31, Abbot, inSalon2)
switch (savepoint.action) {
default:
break;
@@ -936,7 +936,7 @@ IMPLEMENT_FUNCTION(31, Abbot, function31)
break;
case 7:
- setup_function32();
+ setup_goCompartment3();
break;
}
break;
@@ -944,7 +944,7 @@ IMPLEMENT_FUNCTION(31, Abbot, function31)
IMPLEMENT_FUNCTION_END
//////////////////////////////////////////////////////////////////////////
-IMPLEMENT_FUNCTION(32, Abbot, function32)
+IMPLEMENT_FUNCTION(32, Abbot, goCompartment3)
switch (savepoint.action) {
default:
break;
@@ -972,7 +972,7 @@ IMPLEMENT_FUNCTION(32, Abbot, function32)
getData()->location = kLocationInsideCompartment;
getSavePoints()->push(kEntityAbbot, kEntityBoutarel, kAction122358304);
- setup_function33();
+ setup_openCompartment3();
break;
}
break;
@@ -980,7 +980,7 @@ IMPLEMENT_FUNCTION(32, Abbot, function32)
IMPLEMENT_FUNCTION_END
//////////////////////////////////////////////////////////////////////////
-IMPLEMENT_FUNCTION(33, Abbot, function33)
+IMPLEMENT_FUNCTION(33, Abbot, openCompartment3)
switch (savepoint.action) {
default:
break;
@@ -1012,13 +1012,13 @@ IMPLEMENT_FUNCTION(33, Abbot, function33)
break;
case kAction123712592:
- setup_function34();
+ setup_goSalon3();
break;
}
IMPLEMENT_FUNCTION_END
//////////////////////////////////////////////////////////////////////////
-IMPLEMENT_FUNCTION(34, Abbot, function34)
+IMPLEMENT_FUNCTION(34, Abbot, goSalon3)
switch (savepoint.action) {
default:
break;
@@ -1066,7 +1066,7 @@ IMPLEMENT_FUNCTION(34, Abbot, function34)
getScenes()->loadSceneFromItemPosition(kItem3);
getData()->location = kLocationInsideCompartment;
- setup_function35();
+ setup_inSalon3();
break;
}
break;
@@ -1074,7 +1074,7 @@ IMPLEMENT_FUNCTION(34, Abbot, function34)
IMPLEMENT_FUNCTION_END
//////////////////////////////////////////////////////////////////////////
-IMPLEMENT_FUNCTION(35, Abbot, function35)
+IMPLEMENT_FUNCTION(35, Abbot, inSalon3)
switch (savepoint.action) {
default:
break;
@@ -1128,7 +1128,7 @@ IMPLEMENT_FUNCTION(35, Abbot, function35)
getInventory()->setLocationAndProcess(kItem3, kObjectLocation1);
getData()->location = kLocationInsideCompartment;
- setup_function36();
+ setup_withAugust();
break;
}
break;
@@ -1136,7 +1136,7 @@ IMPLEMENT_FUNCTION(35, Abbot, function35)
IMPLEMENT_FUNCTION_END
//////////////////////////////////////////////////////////////////////////
-IMPLEMENT_FUNCTION(36, Abbot, function36)
+IMPLEMENT_FUNCTION(36, Abbot, withAugust)
switch (savepoint.action) {
default:
break;
@@ -1198,14 +1198,14 @@ IMPLEMENT_FUNCTION(36, Abbot, function36)
case kActionCallback:
if (getCallback() == 1) {
getEntities()->updatePositionExit(kEntityAbbot, kCarRestaurant, 57);
- setup_function37();
+ setup_goCompartment4();
}
break;
}
IMPLEMENT_FUNCTION_END
//////////////////////////////////////////////////////////////////////////
-IMPLEMENT_FUNCTION(37, Abbot, function37)
+IMPLEMENT_FUNCTION(37, Abbot, goCompartment4)
switch (savepoint.action) {
default:
break;
@@ -1233,7 +1233,7 @@ IMPLEMENT_FUNCTION(37, Abbot, function37)
getData()->location = kLocationInsideCompartment;
getSavePoints()->push(kEntityAbbot, kEntityBoutarel, kAction122358304);
- setup_function38();
+ setup_inCompartment4();
break;
}
break;
@@ -1241,7 +1241,7 @@ IMPLEMENT_FUNCTION(37, Abbot, function37)
IMPLEMENT_FUNCTION_END
//////////////////////////////////////////////////////////////////////////
-IMPLEMENT_FUNCTION(38, Abbot, function38)
+IMPLEMENT_FUNCTION(38, Abbot, inCompartment4)
switch (savepoint.action) {
default:
break;
@@ -1283,7 +1283,7 @@ IMPLEMENT_FUNCTION(39, Abbot, chapter4)
IMPLEMENT_FUNCTION_END
//////////////////////////////////////////////////////////////////////////
-IMPLEMENT_FUNCTION_II(40, Abbot, function40, CarIndex, EntityPosition)
+IMPLEMENT_FUNCTION_II(40, Abbot, doWalkSearchingForCath, CarIndex, EntityPosition)
switch (savepoint.action) {
default:
break;
@@ -1327,7 +1327,7 @@ IMPLEMENT_FUNCTION(41, Abbot, chapter4Handler)
Entity::timeCheckSavepoint(kTime2358000, params->param1, kEntityAbbot, kEntityServers0, kAction218128129);
if (getState()->time > kTime2389500 && getEntities()->isSomebodyInsideRestaurantOrSalon())
- setup_function42();
+ setup_leaveDinner();
break;
@@ -1348,7 +1348,7 @@ IMPLEMENT_FUNCTION(41, Abbot, chapter4Handler)
IMPLEMENT_FUNCTION_END
//////////////////////////////////////////////////////////////////////////
-IMPLEMENT_FUNCTION(42, Abbot, function42)
+IMPLEMENT_FUNCTION(42, Abbot, leaveDinner)
switch (savepoint.action) {
default:
break;
@@ -1392,7 +1392,7 @@ IMPLEMENT_FUNCTION(42, Abbot, function42)
getData()->location = kLocationInsideCompartment;
getEntities()->clearSequences(kEntityAbbot);
- setup_function43();
+ setup_inCompartment();
break;
}
break;
@@ -1400,7 +1400,7 @@ IMPLEMENT_FUNCTION(42, Abbot, function42)
IMPLEMENT_FUNCTION_END
//////////////////////////////////////////////////////////////////////////
-IMPLEMENT_FUNCTION(43, Abbot, function43)
+IMPLEMENT_FUNCTION(43, Abbot, inCompartment)
switch (savepoint.action) {
default:
break;
@@ -1531,13 +1531,13 @@ IMPLEMENT_FUNCTION(44, Abbot, function44)
break;
case kAction104060776:
- setup_function45();
+ setup_conferring();
break;
}
IMPLEMENT_FUNCTION_END
//////////////////////////////////////////////////////////////////////////
-IMPLEMENT_FUNCTION(45, Abbot, function45)
+IMPLEMENT_FUNCTION(45, Abbot, conferring)
switch (savepoint.action) {
default:
break;
@@ -1570,7 +1570,7 @@ IMPLEMENT_FUNCTION(45, Abbot, function45)
getEntities()->exitCompartment(kEntityAbbot, kObjectCompartmentC, true);
getSavePoints()->push(kEntityAbbot, kEntityVerges, kAction125233040);
- setup_function46();
+ setup_goSalon4();
break;
}
break;
@@ -1578,7 +1578,7 @@ IMPLEMENT_FUNCTION(45, Abbot, function45)
IMPLEMENT_FUNCTION_END
//////////////////////////////////////////////////////////////////////////
-IMPLEMENT_FUNCTION(46, Abbot, function46)
+IMPLEMENT_FUNCTION(46, Abbot, goSalon4)
switch (savepoint.action) {
default:
break;
@@ -1587,18 +1587,18 @@ IMPLEMENT_FUNCTION(46, Abbot, function46)
getData()->entityPosition = kPosition_6471;
setCallback(1);
- setup_function40(kCarRestaurant, kPosition_850);
+ setup_doWalkSearchingForCath(kCarRestaurant, kPosition_850);
break;
case kActionCallback:
if (getCallback() == 1)
- setup_drinkAfterDefuse();
+ setup_beforeBomb();
break;
}
IMPLEMENT_FUNCTION_END
//////////////////////////////////////////////////////////////////////////
-IMPLEMENT_FUNCTION(47, Abbot, drinkAfterDefuse)
+IMPLEMENT_FUNCTION(47, Abbot, beforeBomb)
switch (savepoint.action) {
default:
break;
@@ -1642,7 +1642,7 @@ IMPLEMENT_FUNCTION(47, Abbot, drinkAfterDefuse)
IMPLEMENT_FUNCTION_END
//////////////////////////////////////////////////////////////////////////
-IMPLEMENT_FUNCTION(48, Abbot, function48)
+IMPLEMENT_FUNCTION(48, Abbot, afterBomb)
switch (savepoint.action) {
default:
break;
@@ -1749,7 +1749,7 @@ IMPLEMENT_FUNCTION(48, Abbot, function48)
IMPLEMENT_FUNCTION_END
//////////////////////////////////////////////////////////////////////////
-IMPLEMENT_FUNCTION(49, Abbot, pickBomb)
+IMPLEMENT_FUNCTION(49, Abbot, catchCath)
switch (savepoint.action) {
default:
break;
@@ -1791,7 +1791,7 @@ IMPLEMENT_FUNCTION(49, Abbot, pickBomb)
break;
case 1:
- getAction()->playAnimation(getObjects()->get(kObjectCompartment2).location2 < kObjectLocation2 ? kEventAbbotWrongCompartmentBed : kEventAbbotWrongCompartment);
+ getAction()->playAnimation(getObjects()->get(kObjectCompartment2).model < kObjectModel2 ? kEventAbbotWrongCompartmentBed : kEventAbbotWrongCompartment);
getEntities()->updateEntity(kEntityAbbot, kCarRedSleeping, kPosition_6470);
getSound()->playSound(kEntityPlayer, "LIB015");
getScenes()->loadSceneFromObject(kObjectCompartment2, true);
@@ -1810,7 +1810,7 @@ IMPLEMENT_FUNCTION(49, Abbot, pickBomb)
getEntities()->clearSequences(kEntityAbbot);
getObjects()->update(kObjectCompartmentC, kEntityAbbot, kObjectLocation1, kCursorHandKnock, kCursorHand);
- setup_function43();
+ setup_inCompartment();
break;
}
break;
@@ -1860,13 +1860,13 @@ IMPLEMENT_FUNCTION(52, Abbot, function52)
break;
case kAction135600432:
- setup_function53();
+ setup_runningTrain();
break;
}
IMPLEMENT_FUNCTION_END
//////////////////////////////////////////////////////////////////////////
-IMPLEMENT_FUNCTION(53, Abbot, function53)
+IMPLEMENT_FUNCTION(53, Abbot, runningTrain)
switch (savepoint.action) {
default:
break;
diff --git a/engines/lastexpress/entities/abbot.h b/engines/lastexpress/entities/abbot.h
index dc3e86db54..c4a68f6ecb 100644
--- a/engines/lastexpress/entities/abbot.h
+++ b/engines/lastexpress/entities/abbot.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -155,27 +155,27 @@ public:
/**
* Handle Chapter 3 events
*/
- DECLARE_FUNCTION(chapter3Handler)
- DECLARE_FUNCTION(conversationWithBoutarel)
+ DECLARE_FUNCTION(inKitchen)
+ DECLARE_FUNCTION(openCompartment)
DECLARE_FUNCTION(readPaper)
DECLARE_FUNCTION(goToLunch)
DECLARE_FUNCTION(haveLunch)
- DECLARE_FUNCTION(function23)
- DECLARE_FUNCTION(function24)
- DECLARE_FUNCTION(function25)
- DECLARE_FUNCTION(function26)
- DECLARE_FUNCTION(function27)
- DECLARE_FUNCTION(function28)
- DECLARE_FUNCTION(function29)
- DECLARE_FUNCTION(function30)
- DECLARE_FUNCTION(function31)
- DECLARE_FUNCTION(function32)
- DECLARE_FUNCTION(function33)
- DECLARE_FUNCTION(function34)
- DECLARE_FUNCTION(function35)
- DECLARE_FUNCTION(function36)
- DECLARE_FUNCTION(function37)
- DECLARE_FUNCTION(function38)
+ DECLARE_FUNCTION(leaveLunch)
+ DECLARE_FUNCTION(closedCompartment)
+ DECLARE_FUNCTION(goSalon1)
+ DECLARE_FUNCTION(inSalon1)
+ DECLARE_FUNCTION(goCompartment)
+ DECLARE_FUNCTION(openCompartment2)
+ DECLARE_FUNCTION(goWander)
+ DECLARE_FUNCTION(goSalon2)
+ DECLARE_FUNCTION(inSalon2)
+ DECLARE_FUNCTION(goCompartment3)
+ DECLARE_FUNCTION(openCompartment3)
+ DECLARE_FUNCTION(goSalon3)
+ DECLARE_FUNCTION(inSalon3)
+ DECLARE_FUNCTION(withAugust)
+ DECLARE_FUNCTION(goCompartment4)
+ DECLARE_FUNCTION(inCompartment4)
/**
* Setup Chapter 4
@@ -183,25 +183,25 @@ public:
DECLARE_FUNCTION(chapter4)
/**
- * ???
+ * Search Cath by walking around
*
* @param car The car
* @param entityPosition The entity position
*/
- DECLARE_FUNCTION_2(function40, CarIndex car, EntityPosition position)
+ DECLARE_FUNCTION_2(doWalkSearchingForCath, CarIndex car, EntityPosition position)
/**
* Handle Chapter 4 events
*/
DECLARE_FUNCTION(chapter4Handler)
- DECLARE_FUNCTION(function42)
- DECLARE_FUNCTION(function43)
+ DECLARE_FUNCTION(leaveDinner)
+ DECLARE_FUNCTION(inCompartment)
DECLARE_FUNCTION(function44)
- DECLARE_FUNCTION(function45)
- DECLARE_FUNCTION(function46)
- DECLARE_FUNCTION(drinkAfterDefuse)
- DECLARE_FUNCTION(function48)
- DECLARE_FUNCTION(pickBomb)
+ DECLARE_FUNCTION(conferring)
+ DECLARE_FUNCTION(goSalon4)
+ DECLARE_FUNCTION(beforeBomb)
+ DECLARE_FUNCTION(afterBomb)
+ DECLARE_FUNCTION(catchCath)
/**
* Setup Chapter 5
@@ -213,7 +213,7 @@ public:
*/
DECLARE_FUNCTION(chapter5Handler)
DECLARE_FUNCTION(function52)
- DECLARE_FUNCTION(function53)
+ DECLARE_FUNCTION(runningTrain)
};
} // End of namespace LastExpress
diff --git a/engines/lastexpress/entities/alexei.cpp b/engines/lastexpress/entities/alexei.cpp
index 115c890f6f..9b56fca39f 100644
--- a/engines/lastexpress/entities/alexei.cpp
+++ b/engines/lastexpress/entities/alexei.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -48,40 +48,40 @@ Alexei::Alexei(LastExpressEngine *engine) : Entity(engine, kEntityAlexei) {
ADD_CALLBACK_FUNCTION(Alexei, updateEntity);
ADD_CALLBACK_FUNCTION(Alexei, draw2);
ADD_CALLBACK_FUNCTION(Alexei, callbackActionRestaurantOrSalon);
- ADD_CALLBACK_FUNCTION(Alexei, function13);
- ADD_CALLBACK_FUNCTION(Alexei, function14);
- ADD_CALLBACK_FUNCTION(Alexei, function15);
- ADD_CALLBACK_FUNCTION(Alexei, function16);
+ ADD_CALLBACK_FUNCTION(Alexei, enterComparment);
+ ADD_CALLBACK_FUNCTION(Alexei, exitCompartment);
+ ADD_CALLBACK_FUNCTION(Alexei, pacingAtWindow);
+ ADD_CALLBACK_FUNCTION(Alexei, compartmentLogic);
ADD_CALLBACK_FUNCTION(Alexei, chapter1);
- ADD_CALLBACK_FUNCTION(Alexei, chapter1Handler);
- ADD_CALLBACK_FUNCTION(Alexei, function19);
- ADD_CALLBACK_FUNCTION(Alexei, function20);
- ADD_CALLBACK_FUNCTION(Alexei, function21);
- ADD_CALLBACK_FUNCTION(Alexei, function22);
- ADD_CALLBACK_FUNCTION(Alexei, function23);
- ADD_CALLBACK_FUNCTION(Alexei, function24);
- ADD_CALLBACK_FUNCTION(Alexei, function25);
+ ADD_CALLBACK_FUNCTION(Alexei, atDinner);
+ ADD_CALLBACK_FUNCTION(Alexei, returnCompartment);
+ ADD_CALLBACK_FUNCTION(Alexei, goSalon);
+ ADD_CALLBACK_FUNCTION(Alexei, sitting);
+ ADD_CALLBACK_FUNCTION(Alexei, standingAtWindow);
+ ADD_CALLBACK_FUNCTION(Alexei, waitingForTatiana);
+ ADD_CALLBACK_FUNCTION(Alexei, upset);
+ ADD_CALLBACK_FUNCTION(Alexei, returnCompartmentNight);
ADD_CALLBACK_FUNCTION(Alexei, function26);
ADD_CALLBACK_FUNCTION(Alexei, function27);
ADD_CALLBACK_FUNCTION(Alexei, chapter2);
- ADD_CALLBACK_FUNCTION(Alexei, chapter2Handler);
- ADD_CALLBACK_FUNCTION(Alexei, function30);
- ADD_CALLBACK_FUNCTION(Alexei, function31);
+ ADD_CALLBACK_FUNCTION(Alexei, inCompartment2);
+ ADD_CALLBACK_FUNCTION(Alexei, atBreakfast);
+ ADD_CALLBACK_FUNCTION(Alexei, returnCompartment2);
ADD_CALLBACK_FUNCTION(Alexei, chapter3);
- ADD_CALLBACK_FUNCTION(Alexei, chapter3Handler);
- ADD_CALLBACK_FUNCTION(Alexei, function34);
- ADD_CALLBACK_FUNCTION(Alexei, function35);
- ADD_CALLBACK_FUNCTION(Alexei, function36);
+ ADD_CALLBACK_FUNCTION(Alexei, playingChess);
+ ADD_CALLBACK_FUNCTION(Alexei, inPart3);
+ ADD_CALLBACK_FUNCTION(Alexei, pacing3);
+ ADD_CALLBACK_FUNCTION(Alexei, goSalon3);
ADD_CALLBACK_FUNCTION(Alexei, chapter4);
- ADD_CALLBACK_FUNCTION(Alexei, chapter4Handler);
- ADD_CALLBACK_FUNCTION(Alexei, function39);
- ADD_CALLBACK_FUNCTION(Alexei, function40);
- ADD_CALLBACK_FUNCTION(Alexei, function41);
- ADD_CALLBACK_FUNCTION(Alexei, function42);
- ADD_CALLBACK_FUNCTION(Alexei, function43);
- ADD_CALLBACK_FUNCTION(Alexei, function44);
- ADD_CALLBACK_FUNCTION(Alexei, function45);
- ADD_CALLBACK_FUNCTION(Alexei, function46);
+ ADD_CALLBACK_FUNCTION(Alexei, inCompartment4);
+ ADD_CALLBACK_FUNCTION(Alexei, meetTatiana);
+ ADD_CALLBACK_FUNCTION(Alexei, leavePlatform);
+ ADD_CALLBACK_FUNCTION(Alexei, inCompartmentAgain);
+ ADD_CALLBACK_FUNCTION(Alexei, goSalon4);
+ ADD_CALLBACK_FUNCTION(Alexei, pacing);
+ ADD_CALLBACK_FUNCTION(Alexei, goToPlatform);
+ ADD_CALLBACK_FUNCTION(Alexei, returnCompartment4);
+ ADD_CALLBACK_FUNCTION(Alexei, bombPlanB);
ADD_CALLBACK_FUNCTION(Alexei, function47);
ADD_CALLBACK_FUNCTION(Alexei, chapter5);
}
@@ -169,7 +169,7 @@ IMPLEMENT_FUNCTION(12, Alexei, callbackActionRestaurantOrSalon)
IMPLEMENT_FUNCTION_END
//////////////////////////////////////////////////////////////////////////
-IMPLEMENT_FUNCTION(13, Alexei, function13)
+IMPLEMENT_FUNCTION(13, Alexei, enterComparment)
switch (savepoint.action) {
default:
break;
@@ -216,7 +216,7 @@ IMPLEMENT_FUNCTION(13, Alexei, function13)
IMPLEMENT_FUNCTION_END
//////////////////////////////////////////////////////////////////////////
-IMPLEMENT_FUNCTION(14, Alexei, function14)
+IMPLEMENT_FUNCTION(14, Alexei, exitCompartment)
switch (savepoint.action) {
default:
break;
@@ -245,7 +245,7 @@ IMPLEMENT_FUNCTION(14, Alexei, function14)
IMPLEMENT_FUNCTION_END
//////////////////////////////////////////////////////////////////////////
-IMPLEMENT_FUNCTION(15, Alexei, function15)
+IMPLEMENT_FUNCTION(15, Alexei, pacingAtWindow)
switch (savepoint.action) {
default:
break;
@@ -297,7 +297,7 @@ IMPLEMENT_FUNCTION(15, Alexei, function15)
IMPLEMENT_FUNCTION_END
//////////////////////////////////////////////////////////////////////////
-IMPLEMENT_FUNCTION_IS(16, Alexei, function16, TimeValue)
+IMPLEMENT_FUNCTION_IS(16, Alexei, compartmentLogic, TimeValue)
switch (savepoint.action) {
default:
break;
@@ -446,7 +446,7 @@ IMPLEMENT_FUNCTION(17, Alexei, chapter1)
break;
case kActionNone:
- Entity::timeCheck(kTimeChapter1, params->param1, WRAP_SETUP_FUNCTION(Alexei, setup_chapter1Handler));
+ Entity::timeCheck(kTimeChapter1, params->param1, WRAP_SETUP_FUNCTION(Alexei, setup_atDinner));
break;
case kActionDefault:
@@ -462,7 +462,7 @@ IMPLEMENT_FUNCTION(17, Alexei, chapter1)
IMPLEMENT_FUNCTION_END
//////////////////////////////////////////////////////////////////////////
-IMPLEMENT_FUNCTION(18, Alexei, chapter1Handler)
+IMPLEMENT_FUNCTION(18, Alexei, atDinner)
switch (savepoint.action) {
default:
break;
@@ -519,7 +519,7 @@ IMPLEMENT_FUNCTION(18, Alexei, chapter1Handler)
case 1:
getEntities()->updatePositionExit(kEntityAlexei, kCarRestaurant, 63);
- setup_function19();
+ setup_returnCompartment();
break;
case 2:
@@ -533,7 +533,7 @@ IMPLEMENT_FUNCTION(18, Alexei, chapter1Handler)
getInventory()->get(kItem17)->location = kObjectLocation1;
getScenes()->loadSceneFromPosition(kCarRestaurant, 63);
- setup_function19();
+ setup_returnCompartment();
break;
}
break;
@@ -553,7 +553,7 @@ IMPLEMENT_FUNCTION(18, Alexei, chapter1Handler)
IMPLEMENT_FUNCTION_END
//////////////////////////////////////////////////////////////////////////
-IMPLEMENT_FUNCTION(19, Alexei, function19)
+IMPLEMENT_FUNCTION(19, Alexei, returnCompartment)
switch (savepoint.action) {
default:
break;
@@ -620,7 +620,7 @@ IMPLEMENT_FUNCTION(19, Alexei, function19)
case 9:
setCallback(10);
- setup_function13();
+ setup_enterComparment();
break;
case 10:
@@ -628,11 +628,11 @@ IMPLEMENT_FUNCTION(19, Alexei, function19)
getScenes()->loadSceneFromPosition(kCarGreenSleeping, 49);
setCallback(11);
- setup_function16(kTime1098000, "411");
+ setup_compartmentLogic(kTime1098000, "411");
break;
case 11:
- setup_function20();
+ setup_goSalon();
break;
}
break;
@@ -640,14 +640,14 @@ IMPLEMENT_FUNCTION(19, Alexei, function19)
IMPLEMENT_FUNCTION_END
//////////////////////////////////////////////////////////////////////////
-IMPLEMENT_FUNCTION(20, Alexei, function20)
+IMPLEMENT_FUNCTION(20, Alexei, goSalon)
switch (savepoint.action) {
default:
break;
case kActionDefault:
setCallback(1);
- setup_function14();
+ setup_exitCompartment();
break;
case kActionCallback:
@@ -683,7 +683,7 @@ IMPLEMENT_FUNCTION(20, Alexei, function20)
IMPLEMENT_FUNCTION_END
//////////////////////////////////////////////////////////////////////////
-IMPLEMENT_FUNCTION(21, Alexei, function21)
+IMPLEMENT_FUNCTION(21, Alexei, sitting)
switch (savepoint.action) {
default:
break;
@@ -720,7 +720,7 @@ IMPLEMENT_FUNCTION(21, Alexei, function21)
case 1:
getData()->location = kLocationInsideCompartment;
- setup_function22();
+ setup_standingAtWindow();
break;
case 2:
@@ -745,7 +745,7 @@ IMPLEMENT_FUNCTION(21, Alexei, function21)
IMPLEMENT_FUNCTION_END
//////////////////////////////////////////////////////////////////////////
-IMPLEMENT_FUNCTION(22, Alexei, function22)
+IMPLEMENT_FUNCTION(22, Alexei, standingAtWindow)
switch (savepoint.action) {
default:
break;
@@ -779,7 +779,7 @@ IMPLEMENT_FUNCTION(22, Alexei, function22)
getData()->inventoryItem = kItemNone;
- setup_function23();
+ setup_waitingForTatiana();
break;
case kAction1:
@@ -801,7 +801,7 @@ IMPLEMENT_FUNCTION(22, Alexei, function22)
case 1:
getData()->location = kLocationInsideCompartment;
- setup_function21();
+ setup_sitting();
break;
case 2:
@@ -821,7 +821,7 @@ IMPLEMENT_FUNCTION(22, Alexei, function22)
getEntities()->updatePositionExit(kEntityAlexei, kCarRestaurant, 52);
getData()->location = kLocationInsideCompartment;
- setup_function21();
+ setup_standingAtWindow();
break;
}
break;
@@ -829,7 +829,7 @@ IMPLEMENT_FUNCTION(22, Alexei, function22)
IMPLEMENT_FUNCTION_END
//////////////////////////////////////////////////////////////////////////
-IMPLEMENT_FUNCTION(23, Alexei, function23)
+IMPLEMENT_FUNCTION(23, Alexei, waitingForTatiana)
switch (savepoint.action) {
default:
break;
@@ -861,7 +861,7 @@ IMPLEMENT_FUNCTION(23, Alexei, function23)
getEntities()->drawSequenceLeft(kEntityAlexei, "103F");
getScenes()->processScene();
- setup_function24();
+ setup_upset();
break;
case 2:
@@ -879,18 +879,18 @@ IMPLEMENT_FUNCTION(23, Alexei, function23)
setCallback(1);
setup_savegame(kSavegameTypeEvent, kEventAlexeiSalonVassili);
} else {
- setup_function24();
+ setup_upset();
}
break;
case kAction188784532:
- setup_function24();
+ setup_upset();
break;
}
IMPLEMENT_FUNCTION_END
//////////////////////////////////////////////////////////////////////////
-IMPLEMENT_FUNCTION(24, Alexei, function24)
+IMPLEMENT_FUNCTION(24, Alexei, upset)
switch (savepoint.action) {
default:
break;
@@ -917,11 +917,11 @@ IMPLEMENT_FUNCTION(24, Alexei, function24)
getData()->entityPosition = kPosition_9460;
getEntities()->clearSequences(kEntityAlexei);
getScenes()->loadSceneFromPosition(kCarRestaurant, 55);
- setup_function25();
+ setup_returnCompartmentNight();
break;
case 2:
- setup_function25();
+ setup_returnCompartmentNight();
break;
}
break;
@@ -935,14 +935,14 @@ IMPLEMENT_FUNCTION(24, Alexei, function24)
IMPLEMENT_FUNCTION_END
//////////////////////////////////////////////////////////////////////////
-IMPLEMENT_FUNCTION(25, Alexei, function25)
+IMPLEMENT_FUNCTION(25, Alexei, returnCompartmentNight)
switch (savepoint.action) {
default:
break;
case kActionDefault:
setCallback(1);
- setup_function13();
+ setup_enterComparment();
break;
case kActionCallback:
@@ -955,12 +955,12 @@ IMPLEMENT_FUNCTION(25, Alexei, function25)
getScenes()->loadSceneFromPosition(kCarGreenSleeping, 49);
setCallback(2);
- setup_function16(kTime1179000, "411");
+ setup_compartmentLogic(kTime1179000, "411");
break;
case 2:
setCallback(3);
- setup_function16(kTime1323000, "412");
+ setup_compartmentLogic(kTime1323000, "412");
break;
case 3:
@@ -1017,7 +1017,7 @@ IMPLEMENT_FUNCTION(28, Alexei, chapter2)
break;
case kActionNone:
- setup_chapter2Handler();
+ setup_inCompartment2();
break;
case kActionDefault:
@@ -1037,14 +1037,14 @@ IMPLEMENT_FUNCTION(28, Alexei, chapter2)
IMPLEMENT_FUNCTION_END
//////////////////////////////////////////////////////////////////////////
-IMPLEMENT_FUNCTION(29, Alexei, chapter2Handler)
+IMPLEMENT_FUNCTION(29, Alexei, inCompartment2)
switch (savepoint.action) {
default:
break;
case kActionDefault:
setCallback(1);
- setup_function16(kTime1791000, "411");
+ setup_compartmentLogic(kTime1791000, "411");
break;
case kActionCallback:
@@ -1054,7 +1054,7 @@ IMPLEMENT_FUNCTION(29, Alexei, chapter2Handler)
case 1:
setCallback(2);
- setup_function14();
+ setup_exitCompartment();
break;
case 2:
@@ -1085,7 +1085,7 @@ IMPLEMENT_FUNCTION(29, Alexei, chapter2Handler)
case 6:
getEntities()->updatePositionExit(kEntityAlexei, kCarRestaurant, 63);
getSavePoints()->push(kEntityAlexei, kEntityTatiana, kAction290869168);
- setup_function30();
+ setup_atBreakfast();
break;
}
break;
@@ -1093,7 +1093,7 @@ IMPLEMENT_FUNCTION(29, Alexei, chapter2Handler)
IMPLEMENT_FUNCTION_END
//////////////////////////////////////////////////////////////////////////
-IMPLEMENT_FUNCTION(30, Alexei, function30)
+IMPLEMENT_FUNCTION(30, Alexei, atBreakfast)
switch (savepoint.action) {
default:
break;
@@ -1134,7 +1134,7 @@ IMPLEMENT_FUNCTION(30, Alexei, function30)
case 3:
getEntities()->updatePositionExit(kEntityAlexei, kCarRestaurant, 63);
- setup_function31();
+ setup_returnCompartment2();
break;
}
break;
@@ -1154,7 +1154,7 @@ IMPLEMENT_FUNCTION(30, Alexei, function30)
IMPLEMENT_FUNCTION_END
//////////////////////////////////////////////////////////////////////////
-IMPLEMENT_FUNCTION(31, Alexei, function31)
+IMPLEMENT_FUNCTION(31, Alexei, returnCompartment2)
switch (savepoint.action) {
default:
break;
@@ -1175,7 +1175,7 @@ IMPLEMENT_FUNCTION(31, Alexei, function31)
case 1:
setCallback(2);
- setup_function13();
+ setup_enterComparment();
break;
case 2:
@@ -1183,7 +1183,7 @@ IMPLEMENT_FUNCTION(31, Alexei, function31)
getScenes()->loadSceneFromPosition(kCarGreenSleeping, 49);
setCallback(3);
- setup_function16(kTimeEnd, "411");
+ setup_compartmentLogic(kTimeEnd, "411");
break;
}
break;
@@ -1197,7 +1197,7 @@ IMPLEMENT_FUNCTION(32, Alexei, chapter3)
break;
case kActionNone:
- setup_chapter3Handler();
+ setup_playingChess();
break;
case kActionDefault:
@@ -1216,14 +1216,14 @@ IMPLEMENT_FUNCTION(32, Alexei, chapter3)
IMPLEMENT_FUNCTION_END
//////////////////////////////////////////////////////////////////////////
-IMPLEMENT_FUNCTION(33, Alexei, chapter3Handler)
+IMPLEMENT_FUNCTION(33, Alexei, playingChess)
switch (savepoint.action) {
default:
break;
case kActionCallback:
if (getCallback() == 1)
- setup_function34();
+ setup_inPart3();
break;
case kAction122288808:
@@ -1232,7 +1232,7 @@ IMPLEMENT_FUNCTION(33, Alexei, chapter3Handler)
getData()->car = kCarRedSleeping;
setCallback(1);
- setup_function13();
+ setup_enterComparment();
break;
case kAction122358304:
@@ -1242,7 +1242,7 @@ IMPLEMENT_FUNCTION(33, Alexei, chapter3Handler)
IMPLEMENT_FUNCTION_END
//////////////////////////////////////////////////////////////////////////
-IMPLEMENT_FUNCTION(34, Alexei, function34)
+IMPLEMENT_FUNCTION(34, Alexei, inPart3)
switch (savepoint.action) {
default:
break;
@@ -1252,7 +1252,7 @@ IMPLEMENT_FUNCTION(34, Alexei, function34)
getScenes()->loadSceneFromPosition(kCarGreenSleeping, 49);
setCallback(1);
- setup_function16(kTime2083500, "411");
+ setup_compartmentLogic(kTime2083500, "411");
break;
case kActionCallback:
@@ -1262,7 +1262,7 @@ IMPLEMENT_FUNCTION(34, Alexei, function34)
case 1:
setCallback(2);
- setup_function14();
+ setup_exitCompartment();
break;
case 2:
@@ -1285,12 +1285,12 @@ IMPLEMENT_FUNCTION(34, Alexei, function34)
case 5:
setCallback(6);
- setup_function35();
+ setup_pacing3();
break;
case 6:
setCallback(7);
- setup_function13();
+ setup_enterComparment();
break;
case 7:
@@ -1299,17 +1299,17 @@ IMPLEMENT_FUNCTION(34, Alexei, function34)
getScenes()->loadSceneFromPosition(kCarGreenSleeping, 66);
setCallback(8);
- setup_function16(kTime2124000, "NONE");
+ setup_compartmentLogic(kTime2124000, "NONE");
break;
case 8:
setCallback(9);
- setup_function14();
+ setup_exitCompartment();
break;
case 9:
setCallback(10);
- setup_function36();
+ setup_goSalon3();
break;
case 10:
@@ -1318,7 +1318,7 @@ IMPLEMENT_FUNCTION(34, Alexei, function34)
getScenes()->loadSceneFromPosition(kCarGreenSleeping, 49);
setCallback(11);
- setup_function16(kTime16451100, "411");
+ setup_compartmentLogic(kTime16451100, "411");
break;
}
break;
@@ -1326,7 +1326,7 @@ IMPLEMENT_FUNCTION(34, Alexei, function34)
IMPLEMENT_FUNCTION_END
//////////////////////////////////////////////////////////////////////////
-IMPLEMENT_FUNCTION(35, Alexei, function35)
+IMPLEMENT_FUNCTION(35, Alexei, pacing3)
switch (savepoint.action) {
default:
break;
@@ -1345,7 +1345,7 @@ IMPLEMENT_FUNCTION(35, Alexei, function35)
if (Entity::updateParameter(params->param3, getState()->time, params->param1)) {
if (getEntities()->isSomebodyInsideRestaurantOrSalon()) {
setCallback(3);
- setup_function15();
+ setup_pacingAtWindow();
break;
}
}
@@ -1392,7 +1392,7 @@ label_callback_3:
IMPLEMENT_FUNCTION_END
//////////////////////////////////////////////////////////////////////////
-IMPLEMENT_FUNCTION(36, Alexei, function36)
+IMPLEMENT_FUNCTION(36, Alexei, goSalon3)
switch (savepoint.action) {
default:
break;
@@ -1457,7 +1457,7 @@ IMPLEMENT_FUNCTION(36, Alexei, function36)
case kAction122288808:
setCallback(4);
- setup_function13();
+ setup_enterComparment();
break;
case kAction122358304:
@@ -1474,7 +1474,7 @@ IMPLEMENT_FUNCTION(37, Alexei, chapter4)
break;
case kActionNone:
- setup_chapter4Handler();
+ setup_inCompartment4();
break;
case kActionDefault:
@@ -1493,25 +1493,25 @@ IMPLEMENT_FUNCTION(37, Alexei, chapter4)
IMPLEMENT_FUNCTION_END
//////////////////////////////////////////////////////////////////////////
-IMPLEMENT_FUNCTION(38, Alexei, chapter4Handler)
+IMPLEMENT_FUNCTION(38, Alexei, inCompartment4)
switch (savepoint.action) {
default:
break;
case kActionDefault:
setCallback(1);
- setup_function16(kTime2354400, "411");
+ setup_compartmentLogic(kTime2354400, "411");
break;
case kActionCallback:
if (getCallback() == 1)
- setup_function39();
+ setup_meetTatiana();
break;
}
IMPLEMENT_FUNCTION_END
//////////////////////////////////////////////////////////////////////////
-IMPLEMENT_FUNCTION(39, Alexei, function39)
+IMPLEMENT_FUNCTION(39, Alexei, meetTatiana)
switch (savepoint.action) {
default:
break;
@@ -1547,7 +1547,7 @@ IMPLEMENT_FUNCTION(39, Alexei, function39)
getScenes()->loadSceneFromPosition(kCarGreenSleeping, 72);
}
- setup_function40();
+ setup_leavePlatform();
}
break;
@@ -1571,7 +1571,7 @@ IMPLEMENT_FUNCTION(39, Alexei, function39)
break;
}
- setup_function40();
+ setup_leavePlatform();
}
break;
@@ -1616,7 +1616,7 @@ IMPLEMENT_FUNCTION(39, Alexei, function39)
IMPLEMENT_FUNCTION_END
//////////////////////////////////////////////////////////////////////////
-IMPLEMENT_FUNCTION(40, Alexei, function40)
+IMPLEMENT_FUNCTION(40, Alexei, leavePlatform)
switch (savepoint.action) {
default:
break;
@@ -1653,7 +1653,7 @@ IMPLEMENT_FUNCTION(40, Alexei, function40)
getData()->location = kLocationInsideCompartment;
getEntities()->clearSequences(kEntityAlexei);
- setup_function41();
+ setup_inCompartmentAgain();
break;
}
break;
@@ -1661,7 +1661,7 @@ IMPLEMENT_FUNCTION(40, Alexei, function40)
IMPLEMENT_FUNCTION_END
//////////////////////////////////////////////////////////////////////////
-IMPLEMENT_FUNCTION(41, Alexei, function41)
+IMPLEMENT_FUNCTION(41, Alexei, inCompartmentAgain)
switch (savepoint.action) {
default:
break;
@@ -1671,25 +1671,25 @@ IMPLEMENT_FUNCTION(41, Alexei, function41)
getScenes()->loadSceneFromPosition(kCarGreenSleeping, 49);
setCallback(1);
- setup_function16(kTime2403000, "411");
+ setup_compartmentLogic(kTime2403000, "411");
break;
case kActionCallback:
if (getCallback() == 1)
- setup_function42();
+ setup_goSalon4();
break;
}
IMPLEMENT_FUNCTION_END
//////////////////////////////////////////////////////////////////////////
-IMPLEMENT_FUNCTION(42, Alexei, function42)
+IMPLEMENT_FUNCTION(42, Alexei, goSalon4)
switch (savepoint.action) {
default:
break;
case kActionDefault:
setCallback(1);
- setup_function14();
+ setup_exitCompartment();
break;
case kActionCallback:
@@ -1711,7 +1711,7 @@ IMPLEMENT_FUNCTION(42, Alexei, function42)
case 3:
getData()->location = kLocationInsideCompartment;
- setup_function43();
+ setup_pacing();
break;
}
break;
@@ -1719,7 +1719,7 @@ IMPLEMENT_FUNCTION(42, Alexei, function42)
IMPLEMENT_FUNCTION_END
//////////////////////////////////////////////////////////////////////////
-IMPLEMENT_FUNCTION(43, Alexei, function43)
+IMPLEMENT_FUNCTION(43, Alexei, pacing)
switch (savepoint.action) {
default:
break;
@@ -1731,7 +1731,7 @@ IMPLEMENT_FUNCTION(43, Alexei, function43)
if (getEntities()->isSomebodyInsideRestaurantOrSalon()) {
setCallback(1);
- setup_function15();
+ setup_pacingAtWindow();
break;
}
}
@@ -1768,7 +1768,7 @@ label_callback_1:
break;
case 3:
- setup_function44();
+ setup_goToPlatform();
break;
}
break;
@@ -1776,7 +1776,7 @@ label_callback_1:
IMPLEMENT_FUNCTION_END
//////////////////////////////////////////////////////////////////////////
-IMPLEMENT_FUNCTION(44, Alexei, function44)
+IMPLEMENT_FUNCTION(44, Alexei, goToPlatform)
switch (savepoint.action) {
default:
break;
@@ -1794,7 +1794,7 @@ IMPLEMENT_FUNCTION(44, Alexei, function44)
if (getEntities()->isPlayerPosition(kCarGreenSleeping, 62))
getScenes()->loadSceneFromPosition(kCarGreenSleeping, 72);
- setup_function45();
+ setup_returnCompartment4();
}
}
break;
@@ -1843,14 +1843,14 @@ IMPLEMENT_FUNCTION(44, Alexei, function44)
IMPLEMENT_FUNCTION_END
//////////////////////////////////////////////////////////////////////////
-IMPLEMENT_FUNCTION(45, Alexei, function45)
+IMPLEMENT_FUNCTION(45, Alexei, returnCompartment4)
switch (savepoint.action) {
default:
break;
case kActionDefault:
setCallback(1);
- setup_function13();
+ setup_enterComparment();
break;
case kActionCallback:
@@ -1859,10 +1859,10 @@ IMPLEMENT_FUNCTION(45, Alexei, function45)
getScenes()->loadSceneFromPosition(kCarGreenSleeping, 49);
if (getInventory()->hasItem(kItemBomb)) {
- setup_function46();
+ setup_bombPlanB();
} else {
setCallback(2);
- setup_function16(kTimeEnd, "412");
+ setup_compartmentLogic(kTimeEnd, "412");
}
}
break;
@@ -1870,7 +1870,7 @@ IMPLEMENT_FUNCTION(45, Alexei, function45)
IMPLEMENT_FUNCTION_END
//////////////////////////////////////////////////////////////////////////
-IMPLEMENT_FUNCTION(46, Alexei, function46)
+IMPLEMENT_FUNCTION(46, Alexei, bombPlanB)
switch (savepoint.action) {
default:
break;
@@ -1899,12 +1899,12 @@ IMPLEMENT_FUNCTION(46, Alexei, function46)
}
setCallback(4);
- setup_function13();
+ setup_enterComparment();
break;
case kActionDefault:
setCallback(1);
- setup_function16(kTime2488500, "411");
+ setup_compartmentLogic(kTime2488500, "411");
break;
case kActionCallback:
@@ -1914,7 +1914,7 @@ IMPLEMENT_FUNCTION(46, Alexei, function46)
case 1:
setCallback(2);
- setup_function14();
+ setup_exitCompartment();
break;
case 2:
@@ -1927,7 +1927,7 @@ IMPLEMENT_FUNCTION(46, Alexei, function46)
getScenes()->loadSceneFromPosition(kCarGreenSleeping, 49);
setCallback(5);
- setup_function16(kTime2507400, "412");
+ setup_compartmentLogic(kTime2507400, "412");
break;
case 5:
diff --git a/engines/lastexpress/entities/alexei.h b/engines/lastexpress/entities/alexei.h
index 9792385863..5e14039a35 100644
--- a/engines/lastexpress/entities/alexei.h
+++ b/engines/lastexpress/entities/alexei.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -123,9 +123,9 @@ public:
*/
DECLARE_FUNCTION(callbackActionRestaurantOrSalon)
- DECLARE_FUNCTION(function13)
- DECLARE_FUNCTION(function14)
- DECLARE_FUNCTION(function15)
+ DECLARE_FUNCTION(enterComparment)
+ DECLARE_FUNCTION(exitCompartment)
+ DECLARE_FUNCTION(pacingAtWindow)
/**
* ???
@@ -133,7 +133,7 @@ public:
* @param timeValue The time value
* @param sequence The sequence to draw
*/
- DECLARE_FUNCTION_2(function16, TimeValue timeValue, const char *sequence)
+ DECLARE_FUNCTION_2(compartmentLogic, TimeValue timeValue, const char *sequence)
/**
* Setup Chapter 1
@@ -143,14 +143,14 @@ public:
/**
* Handle Chapter 1 events
*/
- DECLARE_FUNCTION(chapter1Handler)
- DECLARE_FUNCTION(function19)
- DECLARE_FUNCTION(function20)
- DECLARE_FUNCTION(function21)
- DECLARE_FUNCTION(function22)
- DECLARE_FUNCTION(function23)
- DECLARE_FUNCTION(function24)
- DECLARE_FUNCTION(function25)
+ DECLARE_FUNCTION(atDinner)
+ DECLARE_FUNCTION(returnCompartment)
+ DECLARE_FUNCTION(goSalon)
+ DECLARE_FUNCTION(sitting)
+ DECLARE_FUNCTION(standingAtWindow)
+ DECLARE_FUNCTION(waitingForTatiana)
+ DECLARE_FUNCTION(upset)
+ DECLARE_FUNCTION(returnCompartmentNight)
DECLARE_FUNCTION(function26)
DECLARE_FUNCTION(function27)
@@ -162,9 +162,9 @@ public:
/**
* Handle Chapter 2 events
*/
- DECLARE_FUNCTION(chapter2Handler)
- DECLARE_FUNCTION(function30)
- DECLARE_FUNCTION(function31)
+ DECLARE_FUNCTION(inCompartment2)
+ DECLARE_FUNCTION(atBreakfast)
+ DECLARE_FUNCTION(returnCompartment2)
/**
* Setup Chapter 3
@@ -174,10 +174,10 @@ public:
/**
* Handle Chapter 3 events
*/
- DECLARE_FUNCTION(chapter3Handler)
- DECLARE_FUNCTION(function34)
- DECLARE_FUNCTION(function35)
- DECLARE_FUNCTION(function36)
+ DECLARE_FUNCTION(playingChess)
+ DECLARE_FUNCTION(inPart3)
+ DECLARE_FUNCTION(pacing3)
+ DECLARE_FUNCTION(goSalon3)
/**
* Setup Chapter 4
@@ -187,15 +187,15 @@ public:
/**
* Handle Chapter 4 events
*/
- DECLARE_FUNCTION(chapter4Handler)
- DECLARE_FUNCTION(function39)
- DECLARE_FUNCTION(function40)
- DECLARE_FUNCTION(function41)
- DECLARE_FUNCTION(function42)
- DECLARE_FUNCTION(function43)
- DECLARE_FUNCTION(function44)
- DECLARE_FUNCTION(function45)
- DECLARE_FUNCTION(function46)
+ DECLARE_FUNCTION(inCompartment4)
+ DECLARE_FUNCTION(meetTatiana)
+ DECLARE_FUNCTION(leavePlatform)
+ DECLARE_FUNCTION(inCompartmentAgain)
+ DECLARE_FUNCTION(goSalon4)
+ DECLARE_FUNCTION(pacing)
+ DECLARE_FUNCTION(goToPlatform)
+ DECLARE_FUNCTION(returnCompartment4)
+ DECLARE_FUNCTION(bombPlanB)
DECLARE_FUNCTION(function47)
/**
diff --git a/engines/lastexpress/entities/alouan.cpp b/engines/lastexpress/entities/alouan.cpp
index e834e1f7cb..0667d11697 100644
--- a/engines/lastexpress/entities/alouan.cpp
+++ b/engines/lastexpress/entities/alouan.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -38,10 +38,10 @@ Alouan::Alouan(LastExpressEngine *engine) : Entity(engine, kEntityAlouan) {
ADD_CALLBACK_FUNCTION(Alouan, playSound);
ADD_CALLBACK_FUNCTION(Alouan, updateFromTime);
ADD_CALLBACK_FUNCTION(Alouan, updateEntity);
- ADD_CALLBACK_FUNCTION(Alouan, compartment6);
- ADD_CALLBACK_FUNCTION(Alouan, compartment8);
- ADD_CALLBACK_FUNCTION(Alouan, compartment6to8);
- ADD_CALLBACK_FUNCTION(Alouan, compartment8to6);
+ ADD_CALLBACK_FUNCTION(Alouan, peekF);
+ ADD_CALLBACK_FUNCTION(Alouan, peekH);
+ ADD_CALLBACK_FUNCTION(Alouan, goFtoH);
+ ADD_CALLBACK_FUNCTION(Alouan, goHtoF);
ADD_CALLBACK_FUNCTION(Alouan, chapter1);
ADD_CALLBACK_FUNCTION(Alouan, chapter1Handler);
ADD_CALLBACK_FUNCTION(Alouan, function12);
@@ -55,7 +55,7 @@ Alouan::Alouan(LastExpressEngine *engine) : Entity(engine, kEntityAlouan) {
ADD_CALLBACK_FUNCTION(Alouan, chapter5);
ADD_CALLBACK_FUNCTION(Alouan, chapter5Handler);
ADD_CALLBACK_FUNCTION(Alouan, function22);
- ADD_CALLBACK_FUNCTION(Alouan, function23);
+ ADD_CALLBACK_FUNCTION(Alouan, hiding);
ADD_NULL_FUNCTION();
}
@@ -85,22 +85,22 @@ IMPLEMENT_FUNCTION_II(5, Alouan, updateEntity, CarIndex, EntityPosition)
IMPLEMENT_FUNCTION_END
//////////////////////////////////////////////////////////////////////////
-IMPLEMENT_FUNCTION(6, Alouan, compartment6)
+IMPLEMENT_FUNCTION(6, Alouan, peekF)
Entity::goToCompartment(savepoint, kObjectCompartment6, kPosition_4070, "621Cf", "621Df");
IMPLEMENT_FUNCTION_END
//////////////////////////////////////////////////////////////////////////
-IMPLEMENT_FUNCTION(7, Alouan, compartment8)
+IMPLEMENT_FUNCTION(7, Alouan, peekH)
Entity::goToCompartment(savepoint, kObjectCompartment8, kPosition_2740, "621Ch", "621Dh");
IMPLEMENT_FUNCTION_END
//////////////////////////////////////////////////////////////////////////
-IMPLEMENT_FUNCTION(8, Alouan, compartment6to8)
+IMPLEMENT_FUNCTION(8, Alouan, goFtoH)
Entity::goToCompartmentFromCompartment(savepoint, kObjectCompartment6, kPosition_4070, "621Bf", kObjectCompartment8, kPosition_2740, "621Ah");
IMPLEMENT_FUNCTION_END
//////////////////////////////////////////////////////////////////////////
-IMPLEMENT_FUNCTION(9, Alouan, compartment8to6)
+IMPLEMENT_FUNCTION(9, Alouan, goHtoF)
Entity::goToCompartmentFromCompartment(savepoint, kObjectCompartment8, kPosition_2740, "621Bh", kObjectCompartment6, kPosition_4070, "621Af");
IMPLEMENT_FUNCTION_END
@@ -131,7 +131,7 @@ IMPLEMENT_FUNCTION(11, Alouan, chapter1Handler)
case kActionNone:
- if (Entity::timeCheckCallback(kTime1096200, params->param1, 1, WRAP_SETUP_FUNCTION(Alouan, setup_compartment8to6)))
+ if (Entity::timeCheckCallback(kTime1096200, params->param1, 1, WRAP_SETUP_FUNCTION(Alouan, setup_goHtoF)))
break;
label_callback1:
@@ -146,7 +146,7 @@ label_callback1:
getSavePoints()->push(kEntityAlouan, kEntityTrain, kAction191070912, kPosition_4840);
setCallback(2);
- setup_compartment6to8();
+ setup_goFtoH();
}
break;
@@ -215,9 +215,9 @@ IMPLEMENT_FUNCTION(14, Alouan, chapter2Handler)
setCallback(params->param1 ? 1 : 2);
if (params->param1)
- setup_compartment8();
+ setup_peekH();
else
- setup_compartment6();
+ setup_peekF();
break;
case kActionDefault:
@@ -249,7 +249,7 @@ IMPLEMENT_FUNCTION(14, Alouan, chapter2Handler)
case kAction189489753:
setCallback(3);
- setup_compartment8to6();
+ setup_goHtoF();
break;
}
IMPLEMENT_FUNCTION_END
@@ -282,12 +282,12 @@ IMPLEMENT_FUNCTION(16, Alouan, chapter3Handler)
break;
case kActionNone:
- if (Entity::timeCheckCallback(kTimeCitySalzbourg, params->param1, 1, WRAP_SETUP_FUNCTION(Alouan, setup_compartment8to6)))
+ if (Entity::timeCheckCallback(kTimeCitySalzbourg, params->param1, 1, WRAP_SETUP_FUNCTION(Alouan, setup_goHtoF)))
break;
label_callback1:
if (params->param2 != kTimeInvalid && getState()->time > kTime1989000) {
- if (Entity::timeCheckCar(kTime2119500, params->param5, 5, WRAP_SETUP_FUNCTION(Alouan, setup_compartment8)))
+ if (Entity::timeCheckCar(kTime2119500, params->param5, 5, WRAP_SETUP_FUNCTION(Alouan, setup_peekH)))
break;
}
@@ -296,12 +296,12 @@ label_callback2:
break;
label_callback3:
- if (Entity::timeCheckCallback(kTime2133000, params->param4, 4, WRAP_SETUP_FUNCTION(Alouan, setup_compartment6to8)))
+ if (Entity::timeCheckCallback(kTime2133000, params->param4, 4, WRAP_SETUP_FUNCTION(Alouan, setup_goFtoH)))
break;
label_callback4:
if (params->param5 != kTimeInvalid && getState()->time > kTime2151000) {
- if (Entity::timeCheckCar(kTime2241000, params->param5, 5, WRAP_SETUP_FUNCTION(Alouan, setup_compartment8)))
+ if (Entity::timeCheckCar(kTime2241000, params->param5, 5, WRAP_SETUP_FUNCTION(Alouan, setup_peekH)))
break;
}
break;
@@ -361,12 +361,12 @@ IMPLEMENT_FUNCTION(18, Alouan, chapter4Handler)
case kActionNone:
if (params->param1 != kTimeInvalid) {
- if (Entity::timeCheckCar(kTime2443500, params->param1, 1, WRAP_SETUP_FUNCTION(Alouan, setup_compartment8)))
+ if (Entity::timeCheckCar(kTime2443500, params->param1, 1, WRAP_SETUP_FUNCTION(Alouan, setup_peekH)))
break;
}
label_callback1:
- if (Entity::timeCheckCallback(kTime2455200, params->param2, 2, WRAP_SETUP_FUNCTION(Alouan, setup_compartment8to6)))
+ if (Entity::timeCheckCallback(kTime2455200, params->param2, 2, WRAP_SETUP_FUNCTION(Alouan, setup_goHtoF)))
break;
label_callback2:
@@ -375,7 +375,7 @@ label_callback2:
getSavePoints()->push(kEntityAlouan, kEntityTrain, kAction191070912, kPosition_4840);
setCallback(3);
- setup_compartment6to8();
+ setup_goFtoH();
}
break;
@@ -452,7 +452,7 @@ IMPLEMENT_FUNCTION(22, Alouan, function22)
if (!Entity::updateParameter(params->param1, getState()->time, 2700))
break;
- setup_function23();
+ setup_hiding();
break;
case kActionDefault:
@@ -463,13 +463,13 @@ IMPLEMENT_FUNCTION(22, Alouan, function22)
case kActionDrawScene:
if (getEntities()->isInsideTrainCar(kEntityPlayer, kCarGreenSleeping))
- setup_function23();
+ setup_hiding();
break;
}
IMPLEMENT_FUNCTION_END
//////////////////////////////////////////////////////////////////////////
-IMPLEMENT_FUNCTION(23, Alouan, function23)
+IMPLEMENT_FUNCTION(23, Alouan, hiding)
switch (savepoint.action) {
default:
break;
diff --git a/engines/lastexpress/entities/alouan.h b/engines/lastexpress/entities/alouan.h
index 91254a449a..c84cf1a745 100644
--- a/engines/lastexpress/entities/alouan.h
+++ b/engines/lastexpress/entities/alouan.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -69,10 +69,10 @@ public:
*/
DECLARE_FUNCTION_2(updateEntity, CarIndex car, EntityPosition entityPosition)
- DECLARE_FUNCTION(compartment6)
- DECLARE_FUNCTION(compartment8)
- DECLARE_FUNCTION(compartment6to8)
- DECLARE_FUNCTION(compartment8to6)
+ DECLARE_FUNCTION(peekF)
+ DECLARE_FUNCTION(peekH)
+ DECLARE_FUNCTION(goFtoH)
+ DECLARE_FUNCTION(goHtoF)
/**
* Setup Chapter 1
@@ -126,7 +126,7 @@ public:
*/
DECLARE_FUNCTION(chapter5Handler)
DECLARE_FUNCTION(function22)
- DECLARE_FUNCTION(function23)
+ DECLARE_FUNCTION(hiding)
DECLARE_NULL_FUNCTION()
};
diff --git a/engines/lastexpress/entities/anna.cpp b/engines/lastexpress/entities/anna.cpp
index f8768032b5..ff65be9772 100644
--- a/engines/lastexpress/entities/anna.cpp
+++ b/engines/lastexpress/entities/anna.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope 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.
@@ -51,76 +51,76 @@ Anna::Anna(LastExpressEngine *engine) : Entity(engine, kEntityAnna) {
ADD_CALLBACK_FUNCTION(Anna, savegame);
ADD_CALLBACK_FUNCTION(Anna, updateEntity);
ADD_CALLBACK_FUNCTION(Anna, updateFromTime);
- ADD_CALLBACK_FUNCTION(Anna, function12);
+ ADD_CALLBACK_FUNCTION(Anna, practiceMusic);
ADD_CALLBACK_FUNCTION(Anna, draw2);
ADD_CALLBACK_FUNCTION(Anna, updateFromTicks);
- ADD_CALLBACK_FUNCTION(Anna, function15);
+ ADD_CALLBACK_FUNCTION(Anna, compartmentLogic);
ADD_CALLBACK_FUNCTION(Anna, chapter1);
- ADD_CALLBACK_FUNCTION(Anna, function17);
- ADD_CALLBACK_FUNCTION(Anna, function18);
- ADD_CALLBACK_FUNCTION(Anna, chapter1Handler);
- ADD_CALLBACK_FUNCTION(Anna, function20);
- ADD_CALLBACK_FUNCTION(Anna, function21);
+ ADD_CALLBACK_FUNCTION(Anna, doWalkP1);
+ ADD_CALLBACK_FUNCTION(Anna, diningLogic);
+ ADD_CALLBACK_FUNCTION(Anna, fleeTyler);
+ ADD_CALLBACK_FUNCTION(Anna, waitDinner);
+ ADD_CALLBACK_FUNCTION(Anna, goDinner);
ADD_CALLBACK_FUNCTION(Anna, function22);
- ADD_CALLBACK_FUNCTION(Anna, function23);
- ADD_CALLBACK_FUNCTION(Anna, function24);
- ADD_CALLBACK_FUNCTION(Anna, function25);
- ADD_CALLBACK_FUNCTION(Anna, function26);
- ADD_CALLBACK_FUNCTION(Anna, function27);
- ADD_CALLBACK_FUNCTION(Anna, function28);
- ADD_CALLBACK_FUNCTION(Anna, function29);
+ ADD_CALLBACK_FUNCTION(Anna, waitingDinner);
+ ADD_CALLBACK_FUNCTION(Anna, waitingDinner2);
+ ADD_CALLBACK_FUNCTION(Anna, eatingDinner);
+ ADD_CALLBACK_FUNCTION(Anna, leaveDinner);
+ ADD_CALLBACK_FUNCTION(Anna, freshenUp);
+ ADD_CALLBACK_FUNCTION(Anna, goSalon);
+ ADD_CALLBACK_FUNCTION(Anna, waitAugust);
ADD_CALLBACK_FUNCTION(Anna, function30);
- ADD_CALLBACK_FUNCTION(Anna, function31);
- ADD_CALLBACK_FUNCTION(Anna, function32);
- ADD_CALLBACK_FUNCTION(Anna, function33);
- ADD_CALLBACK_FUNCTION(Anna, function34);
- ADD_CALLBACK_FUNCTION(Anna, function35);
- ADD_CALLBACK_FUNCTION(Anna, function36);
+ ADD_CALLBACK_FUNCTION(Anna, leaveAugust);
+ ADD_CALLBACK_FUNCTION(Anna, returnCompartment);
+ ADD_CALLBACK_FUNCTION(Anna, readyForBed);
+ ADD_CALLBACK_FUNCTION(Anna, asleep);
+ ADD_CALLBACK_FUNCTION(Anna, wakeNight);
+ ADD_CALLBACK_FUNCTION(Anna, goVassili);
ADD_CALLBACK_FUNCTION(Anna, function37);
- ADD_CALLBACK_FUNCTION(Anna, function38);
- ADD_CALLBACK_FUNCTION(Anna, function39);
- ADD_CALLBACK_FUNCTION(Anna, function40);
- ADD_CALLBACK_FUNCTION(Anna, function41);
+ ADD_CALLBACK_FUNCTION(Anna, speakTatiana);
+ ADD_CALLBACK_FUNCTION(Anna, doWalk1019);
+ ADD_CALLBACK_FUNCTION(Anna, leaveTatiana);
+ ADD_CALLBACK_FUNCTION(Anna, goBackToSleep);
ADD_CALLBACK_FUNCTION(Anna, chapter2);
- ADD_CALLBACK_FUNCTION(Anna, chapter2Handler);
+ ADD_CALLBACK_FUNCTION(Anna, inPart2);
ADD_CALLBACK_FUNCTION(Anna, chapter3);
- ADD_CALLBACK_FUNCTION(Anna, function45);
- ADD_CALLBACK_FUNCTION(Anna, chapter3Handler);
- ADD_CALLBACK_FUNCTION(Anna, function47);
- ADD_CALLBACK_FUNCTION(Anna, function48);
+ ADD_CALLBACK_FUNCTION(Anna, exitCompartment);
+ ADD_CALLBACK_FUNCTION(Anna, practicing);
+ ADD_CALLBACK_FUNCTION(Anna, goLunch);
+ ADD_CALLBACK_FUNCTION(Anna, lunch);
ADD_CALLBACK_FUNCTION(Anna, leaveTableWithAugust);
- ADD_CALLBACK_FUNCTION(Anna, function50);
- ADD_CALLBACK_FUNCTION(Anna, function51);
- ADD_CALLBACK_FUNCTION(Anna, function52);
- ADD_CALLBACK_FUNCTION(Anna, function53);
- ADD_CALLBACK_FUNCTION(Anna, function54);
- ADD_CALLBACK_FUNCTION(Anna, function55);
- ADD_CALLBACK_FUNCTION(Anna, function56);
- ADD_CALLBACK_FUNCTION(Anna, function57);
- ADD_CALLBACK_FUNCTION(Anna, function58);
- ADD_CALLBACK_FUNCTION(Anna, function59);
- ADD_CALLBACK_FUNCTION(Anna, function60);
- ADD_CALLBACK_FUNCTION(Anna, function61);
+ ADD_CALLBACK_FUNCTION(Anna, leaveLunch);
+ ADD_CALLBACK_FUNCTION(Anna, afterLunch);
+ ADD_CALLBACK_FUNCTION(Anna, returnCompartment3);
+ ADD_CALLBACK_FUNCTION(Anna, dressing);
+ ADD_CALLBACK_FUNCTION(Anna, giveMaxToConductor2);
+ ADD_CALLBACK_FUNCTION(Anna, goConcert);
+ ADD_CALLBACK_FUNCTION(Anna, concert);
+ ADD_CALLBACK_FUNCTION(Anna, leaveConcert);
+ ADD_CALLBACK_FUNCTION(Anna, leaveConcertCathInCompartment);
+ ADD_CALLBACK_FUNCTION(Anna, afterConcert);
+ ADD_CALLBACK_FUNCTION(Anna, giveMaxBack);
+ ADD_CALLBACK_FUNCTION(Anna, goBaggageCompartment);
ADD_CALLBACK_FUNCTION(Anna, function62);
- ADD_CALLBACK_FUNCTION(Anna, function63);
- ADD_CALLBACK_FUNCTION(Anna, baggage);
- ADD_CALLBACK_FUNCTION(Anna, function65);
+ ADD_CALLBACK_FUNCTION(Anna, deadBaggageCompartment);
+ ADD_CALLBACK_FUNCTION(Anna, baggageFight);
+ ADD_CALLBACK_FUNCTION(Anna, prepareVienna);
ADD_CALLBACK_FUNCTION(Anna, chapter4);
- ADD_CALLBACK_FUNCTION(Anna, chapter4Handler);
- ADD_CALLBACK_FUNCTION(Anna, function68);
- ADD_CALLBACK_FUNCTION(Anna, function69);
- ADD_CALLBACK_FUNCTION(Anna, function70);
- ADD_CALLBACK_FUNCTION(Anna, function71);
- ADD_CALLBACK_FUNCTION(Anna, function72);
- ADD_CALLBACK_FUNCTION(Anna, function73);
+ ADD_CALLBACK_FUNCTION(Anna, reading);
+ ADD_CALLBACK_FUNCTION(Anna, sulking);
+ ADD_CALLBACK_FUNCTION(Anna, goSalon4);
+ ADD_CALLBACK_FUNCTION(Anna, returnCompartment4);
+ ADD_CALLBACK_FUNCTION(Anna, enterCompartmentCathFollowsAnna);
+ ADD_CALLBACK_FUNCTION(Anna, doWalkCathFollowsAnna);
+ ADD_CALLBACK_FUNCTION(Anna, letDownHair);
ADD_CALLBACK_FUNCTION(Anna, chapter5);
- ADD_CALLBACK_FUNCTION(Anna, chapter5Handler);
+ ADD_CALLBACK_FUNCTION(Anna, tiedUp);
ADD_CALLBACK_FUNCTION(Anna, function76);
- ADD_CALLBACK_FUNCTION(Anna, function77);
- ADD_CALLBACK_FUNCTION(Anna, function78);
- ADD_CALLBACK_FUNCTION(Anna, function79);
- ADD_CALLBACK_FUNCTION(Anna, function80);
+ ADD_CALLBACK_FUNCTION(Anna, readyToScore);
+ ADD_CALLBACK_FUNCTION(Anna, kidnapped);
+ ADD_CALLBACK_FUNCTION(Anna, waiting);
ADD_CALLBACK_FUNCTION(Anna, finalSequence);
+ ADD_CALLBACK_FUNCTION(Anna, openFirebird);
}
//////////////////////////////////////////////////////////////////////////
@@ -188,7 +188,7 @@ IMPLEMENT_FUNCTION_I(11, Anna, updateFromTime, uint32)
IMPLEMENT_FUNCTION_END
//////////////////////////////////////////////////////////////////////////
-IMPLEMENT_FUNCTION(12, Anna, function12)
+IMPLEMENT_FUNCTION(12, Anna, practiceMusic)
switch (savepoint.action) {
default:
break;
@@ -411,7 +411,7 @@ IMPLEMENT_FUNCTION_I(14, Anna, updateFromTicks, uint32)
IMPLEMENT_FUNCTION_END
//////////////////////////////////////////////////////////////////////////
-IMPLEMENT_FUNCTION_IS(15, Anna, function15, TimeValue)
+IMPLEMENT_FUNCTION_IS(15, Anna, compartmentLogic, TimeValue)
switch (savepoint.action) {
default:
break;
@@ -547,7 +547,7 @@ IMPLEMENT_FUNCTION(16, Anna, chapter1)
break;
case kActionNone:
- Entity::timeCheck(kTimeChapter1, params->param1, WRAP_SETUP_FUNCTION(Anna, setup_chapter1Handler));
+ Entity::timeCheck(kTimeChapter1, params->param1, WRAP_SETUP_FUNCTION(Anna, setup_fleeTyler));
break;
case kActionDefault:
@@ -567,7 +567,7 @@ IMPLEMENT_FUNCTION(16, Anna, chapter1)
IMPLEMENT_FUNCTION_END
//////////////////////////////////////////////////////////////////////////
-IMPLEMENT_FUNCTION_II(17, Anna, function17, uint32, uint32)
+IMPLEMENT_FUNCTION_II(17, Anna, doWalkP1, uint32, uint32)
switch (savepoint.action) {
default:
break;
@@ -656,7 +656,7 @@ IMPLEMENT_FUNCTION_II(17, Anna, function17, uint32, uint32)
IMPLEMENT_FUNCTION_END
//////////////////////////////////////////////////////////////////////////
-IMPLEMENT_FUNCTION_I(18, Anna, function18, TimeValue)
+IMPLEMENT_FUNCTION_I(18, Anna, diningLogic, TimeValue)
switch (savepoint.action) {
default:
break;
@@ -764,7 +764,7 @@ IMPLEMENT_FUNCTION_I(18, Anna, function18, TimeValue)
IMPLEMENT_FUNCTION_END
//////////////////////////////////////////////////////////////////////////
-IMPLEMENT_FUNCTION(19, Anna, chapter1Handler)
+IMPLEMENT_FUNCTION(19, Anna, fleeTyler)
switch (savepoint.action) {
default:
break;
@@ -797,7 +797,7 @@ IMPLEMENT_FUNCTION(19, Anna, chapter1Handler)
getData()->entityPosition = kPosition_4070;
getData()->location = kLocationInsideCompartment;
- setup_function20();
+ setup_waitDinner();
break;
}
break;
@@ -805,14 +805,14 @@ IMPLEMENT_FUNCTION(19, Anna, chapter1Handler)
IMPLEMENT_FUNCTION_END
//////////////////////////////////////////////////////////////////////////
-IMPLEMENT_FUNCTION(20, Anna, function20)
+IMPLEMENT_FUNCTION(20, Anna, waitDinner)
switch (savepoint.action) {
default:
break;
case kActionDefault:
setCallback(1);
- setup_function15(kTime1093500, "NONE");
+ setup_compartmentLogic(kTime1093500, "NONE");
break;
case kActionCallback:
@@ -828,7 +828,7 @@ IMPLEMENT_FUNCTION(20, Anna, function20)
case 2:
getData()->location = kLocationOutsideCompartment;
getSavePoints()->push(kEntityAnna, kEntityMax, kAction71277948);
- setup_function21();
+ setup_goDinner();
break;
}
break;
@@ -836,14 +836,14 @@ IMPLEMENT_FUNCTION(20, Anna, function20)
IMPLEMENT_FUNCTION_END
//////////////////////////////////////////////////////////////////////////
-IMPLEMENT_FUNCTION(21, Anna, function21)
+IMPLEMENT_FUNCTION(21, Anna, goDinner)
switch (savepoint.action) {
default:
break;
case kActionDefault:
setCallback(1);
- setup_function17(kCarRestaurant, kPosition_850);
+ setup_doWalkP1(kCarRestaurant, kPosition_850);
break;
case kActionCallback:
@@ -894,13 +894,13 @@ IMPLEMENT_FUNCTION(22, Anna, function22)
case kAction157370960:
getData()->location = kLocationInsideCompartment;
- setup_function23();
+ setup_waitingDinner();
break;
}
IMPLEMENT_FUNCTION_END
//////////////////////////////////////////////////////////////////////////
-IMPLEMENT_FUNCTION(23, Anna, function23)
+IMPLEMENT_FUNCTION(23, Anna, waitingDinner)
switch (savepoint.action) {
default:
break;
@@ -911,7 +911,7 @@ IMPLEMENT_FUNCTION(23, Anna, function23)
getSavePoints()->push(kEntityAnna, kEntityTables0, kAction136455232);
setCallback(1);
- setup_function18(kTimeNone);
+ setup_diningLogic(kTimeNone);
break;
case kActionCallback:
@@ -932,7 +932,7 @@ IMPLEMENT_FUNCTION(23, Anna, function23)
case 3:
getSavePoints()->push(kEntityAnna, kEntityServers0, kAction203859488);
- setup_function24();
+ setup_waitingDinner2();
break;
}
break;
@@ -940,7 +940,7 @@ IMPLEMENT_FUNCTION(23, Anna, function23)
IMPLEMENT_FUNCTION_END
//////////////////////////////////////////////////////////////////////////
-IMPLEMENT_FUNCTION(24, Anna, function24)
+IMPLEMENT_FUNCTION(24, Anna, waitingDinner2)
switch (savepoint.action) {
default:
break;
@@ -949,7 +949,7 @@ IMPLEMENT_FUNCTION(24, Anna, function24)
getEntities()->drawSequenceLeft(kEntityAnna, "001G");
setCallback(1);
- setup_function18(kTimeNone);
+ setup_diningLogic(kTimeNone);
break;
case kActionCallback:
@@ -965,7 +965,7 @@ IMPLEMENT_FUNCTION(24, Anna, function24)
case 2:
getSavePoints()->push(kEntityAnna, kEntityServers0, kAction136702400);
- setup_function25();
+ setup_eatingDinner();
break;
}
break;
@@ -973,7 +973,7 @@ IMPLEMENT_FUNCTION(24, Anna, function24)
IMPLEMENT_FUNCTION_END
//////////////////////////////////////////////////////////////////////////
-IMPLEMENT_FUNCTION(25, Anna, function25)
+IMPLEMENT_FUNCTION(25, Anna, eatingDinner)
switch (savepoint.action) {
default:
break;
@@ -983,7 +983,7 @@ IMPLEMENT_FUNCTION(25, Anna, function25)
getProgress().field_28 = 1;
setCallback(1);
- setup_function18(kTimeNone);
+ setup_diningLogic(kTimeNone);
break;
case kActionCallback:
@@ -996,7 +996,7 @@ IMPLEMENT_FUNCTION(25, Anna, function25)
break;
case 3:
- setup_function26();
+ setup_leaveDinner();
break;
}
break;
@@ -1008,13 +1008,13 @@ IMPLEMENT_FUNCTION(25, Anna, function25)
case kAction201437056:
getEntities()->drawSequenceLeft(kEntityAnna, "001J");
setCallback(2);
- setup_function18(kTime1138500);
+ setup_diningLogic(kTime1138500);
break;
}
IMPLEMENT_FUNCTION_END
//////////////////////////////////////////////////////////////////////////
-IMPLEMENT_FUNCTION(26, Anna, function26)
+IMPLEMENT_FUNCTION(26, Anna, leaveDinner)
switch (savepoint.action) {
default:
break;
@@ -1046,7 +1046,7 @@ IMPLEMENT_FUNCTION(26, Anna, function26)
case 2:
setCallback(3);
- setup_function17(kCarRedSleeping, kPosition_4070);
+ setup_doWalkP1(kCarRedSleeping, kPosition_4070);
break;
case 3:
@@ -1059,7 +1059,7 @@ IMPLEMENT_FUNCTION(26, Anna, function26)
getData()->entityPosition = kPosition_4070;
getData()->location = kLocationInsideCompartment;
- setup_function27();
+ setup_freshenUp();
break;
}
break;
@@ -1067,7 +1067,7 @@ IMPLEMENT_FUNCTION(26, Anna, function26)
IMPLEMENT_FUNCTION_END
//////////////////////////////////////////////////////////////////////////
-IMPLEMENT_FUNCTION(27, Anna, function27)
+IMPLEMENT_FUNCTION(27, Anna, freshenUp)
switch (savepoint.action) {
default:
break;
@@ -1075,7 +1075,7 @@ IMPLEMENT_FUNCTION(27, Anna, function27)
case kActionDefault:
getSavePoints()->push(kEntityAnna, kEntityMax, kAction101687594);
setCallback(1);
- setup_function15(kTime1156500, "NONE");
+ setup_compartmentLogic(kTime1156500, "NONE");
break;
case kActionCallback:
@@ -1088,7 +1088,7 @@ IMPLEMENT_FUNCTION(27, Anna, function27)
if (getProgress().field_14 == 29) {
params->param1 = (uint)(getState()->time + 900);
setCallback(2);
- setup_function15((TimeValue)params->param1, "NONE");
+ setup_compartmentLogic((TimeValue)params->param1, "NONE");
} else {
setCallback(3);
setup_enterExitCompartment("618Bf", kObjectCompartmentF);
@@ -1098,7 +1098,7 @@ IMPLEMENT_FUNCTION(27, Anna, function27)
case 3:
getData()->location = kLocationOutsideCompartment;
getSavePoints()->push(kEntityAnna, kEntityMax, kAction71277948);
- setup_function28();
+ setup_goSalon();
break;
}
break;
@@ -1106,14 +1106,14 @@ IMPLEMENT_FUNCTION(27, Anna, function27)
IMPLEMENT_FUNCTION_END
//////////////////////////////////////////////////////////////////////////
-IMPLEMENT_FUNCTION(28, Anna, function28)
+IMPLEMENT_FUNCTION(28, Anna, goSalon)
switch (savepoint.action) {
default:
break;
case kActionDefault:
setCallback(1);
- setup_function17(kCarRestaurant, kPosition_850);
+ setup_doWalkP1(kCarRestaurant, kPosition_850);
break;
case kActionCallback:
@@ -1137,7 +1137,7 @@ IMPLEMENT_FUNCTION(28, Anna, function28)
case 3:
getData()->location = kLocationInsideCompartment;
- setup_function29();
+ setup_waitAugust();
break;
}
break;
@@ -1145,7 +1145,7 @@ IMPLEMENT_FUNCTION(28, Anna, function28)
IMPLEMENT_FUNCTION_END
//////////////////////////////////////////////////////////////////////////
-IMPLEMENT_FUNCTION(29, Anna, function29)
+IMPLEMENT_FUNCTION(29, Anna, waitAugust)
switch (savepoint.action) {
default:
break;
@@ -1268,7 +1268,7 @@ IMPLEMENT_FUNCTION(30, Anna, function30)
if (getState()->time > kTime1192500) {
params->param4 = kTimeInvalid;
- setup_function30();
+ setup_leaveAugust();
break;
}
@@ -1277,7 +1277,7 @@ IMPLEMENT_FUNCTION(30, Anna, function30)
if (params->param4 < getState()->time) {
params->param4 = kTimeInvalid;
- setup_function30();
+ setup_leaveAugust();
break;
}
}
@@ -1308,7 +1308,7 @@ IMPLEMENT_FUNCTION(30, Anna, function30)
IMPLEMENT_FUNCTION_END
//////////////////////////////////////////////////////////////////////////
-IMPLEMENT_FUNCTION(31, Anna, function31)
+IMPLEMENT_FUNCTION(31, Anna, leaveAugust)
switch (savepoint.action) {
default:
break;
@@ -1343,7 +1343,7 @@ IMPLEMENT_FUNCTION(31, Anna, function31)
getInventory()->setLocationAndProcess(kItem3, kObjectLocation1);
getSavePoints()->push(kEntityAnna, kEntityAugust, kAction159332865);
- setup_function32();
+ setup_returnCompartment();
break;
}
break;
@@ -1351,14 +1351,14 @@ IMPLEMENT_FUNCTION(31, Anna, function31)
IMPLEMENT_FUNCTION_END
//////////////////////////////////////////////////////////////////////////
-IMPLEMENT_FUNCTION(32, Anna, function32)
+IMPLEMENT_FUNCTION(32, Anna, returnCompartment)
switch (savepoint.action) {
default:
break;
case kActionDefault:
setCallback(1);
- setup_function17(kCarRedSleeping, kPosition_4070);
+ setup_doWalkP1(kCarRedSleeping, kPosition_4070);
break;
case kActionCallback:
@@ -1377,7 +1377,7 @@ IMPLEMENT_FUNCTION(32, Anna, function32)
getData()->entityPosition = kPosition_4070;
getData()->location = kLocationInsideCompartment;
- setup_function33();
+ setup_readyForBed();
break;
}
break;
@@ -1385,7 +1385,7 @@ IMPLEMENT_FUNCTION(32, Anna, function32)
IMPLEMENT_FUNCTION_END
//////////////////////////////////////////////////////////////////////////
-IMPLEMENT_FUNCTION(33, Anna, function33)
+IMPLEMENT_FUNCTION(33, Anna, readyForBed)
switch (savepoint.action) {
default:
break;
@@ -1395,20 +1395,20 @@ IMPLEMENT_FUNCTION(33, Anna, function33)
params->param1 = (uint)(getState()->time + 4500);
setCallback(1);
- setup_function15((TimeValue)params->param1, "NONE");
+ setup_compartmentLogic((TimeValue)params->param1, "NONE");
break;
case kActionCallback:
if (getCallback() == 1) {
- getObjects()->updateLocation2(kObjectCompartmentF, kObjectLocation1);
- setup_function34();
+ getObjects()->updateModel(kObjectCompartmentF, kObjectModel1);
+ setup_asleep();
}
break;
}
IMPLEMENT_FUNCTION_END
//////////////////////////////////////////////////////////////////////////
-IMPLEMENT_FUNCTION(34, Anna, function34)
+IMPLEMENT_FUNCTION(34, Anna, asleep)
switch (savepoint.action) {
default:
break;
@@ -1423,7 +1423,7 @@ IMPLEMENT_FUNCTION(34, Anna, function34)
}
label_callback_1:
- Entity::timeCheck(kTime1489500, params->param3, WRAP_SETUP_FUNCTION(Anna, setup_function35));
+ Entity::timeCheck(kTime1489500, params->param3, WRAP_SETUP_FUNCTION(Anna, setup_wakeNight));
break;
case kActionKnock:
@@ -1480,7 +1480,7 @@ label_callback_1:
IMPLEMENT_FUNCTION_END
//////////////////////////////////////////////////////////////////////////
-IMPLEMENT_FUNCTION(35, Anna, function35)
+IMPLEMENT_FUNCTION(35, Anna, wakeNight)
switch (savepoint.action) {
default:
break;
@@ -1561,11 +1561,11 @@ IMPLEMENT_FUNCTION(35, Anna, function35)
getSavePoints()->push(kEntityAnna, kEntityCoudert, kAction339669520);
getSavePoints()->push(kEntityAnna, kEntityMax, kAction71277948);
- setup_function36();
+ setup_goVassili();
break;
case 2:
- setup_function36();
+ setup_goVassili();
break;
}
break;
@@ -1585,7 +1585,7 @@ IMPLEMENT_FUNCTION(35, Anna, function35)
IMPLEMENT_FUNCTION_END
//////////////////////////////////////////////////////////////////////////
-IMPLEMENT_FUNCTION(36, Anna, function36)
+IMPLEMENT_FUNCTION(36, Anna, goVassili)
switch (savepoint.action) {
default:
break;
@@ -1634,13 +1634,13 @@ IMPLEMENT_FUNCTION(37, Anna, function37)
break;
case kAction191477936:
- setup_function38();
+ setup_speakTatiana();
break;
}
IMPLEMENT_FUNCTION_END
//////////////////////////////////////////////////////////////////////////
-IMPLEMENT_FUNCTION(38, Anna, function38)
+IMPLEMENT_FUNCTION(38, Anna, speakTatiana)
switch (savepoint.action) {
default:
break;
@@ -1655,14 +1655,14 @@ IMPLEMENT_FUNCTION(38, Anna, function38)
case kActionCallback:
if (getCallback() == 1) {
getSound()->playSound(kEntityPlayer, "MUS043");
- setup_function40();
+ setup_leaveTatiana();
}
break;
}
IMPLEMENT_FUNCTION_END
//////////////////////////////////////////////////////////////////////////
-IMPLEMENT_FUNCTION_II(39, Anna, function39, CarIndex, EntityPosition)
+IMPLEMENT_FUNCTION_II(39, Anna, doWalk1019, CarIndex, EntityPosition)
switch (savepoint.action) {
default:
break;
@@ -1708,7 +1708,7 @@ IMPLEMENT_FUNCTION_II(39, Anna, function39, CarIndex, EntityPosition)
IMPLEMENT_FUNCTION_END
//////////////////////////////////////////////////////////////////////////
-IMPLEMENT_FUNCTION(40, Anna, function40)
+IMPLEMENT_FUNCTION(40, Anna, leaveTatiana)
switch (savepoint.action) {
default:
break;
@@ -1727,7 +1727,7 @@ IMPLEMENT_FUNCTION(40, Anna, function40)
getData()->location = kLocationOutsideCompartment;
setCallback(2);
- setup_function39(kCarRedSleeping, kPosition_4070);
+ setup_doWalk1019(kCarRedSleeping, kPosition_4070);
break;
case 2:
@@ -1752,7 +1752,7 @@ IMPLEMENT_FUNCTION(40, Anna, function40)
getData()->location = kLocationOutsideCompartment;
setCallback(6);
- setup_function39(kCarRedSleeping, kPosition_7500);
+ setup_doWalk1019(kCarRedSleeping, kPosition_7500);
break;
case 6:
@@ -1777,7 +1777,7 @@ IMPLEMENT_FUNCTION(40, Anna, function40)
getData()->location = kLocationOutsideCompartment;
setCallback(10);
- setup_function39(kCarRedSleeping, kPosition_4070);
+ setup_doWalk1019(kCarRedSleeping, kPosition_4070);
break;
case 10:
@@ -1790,7 +1790,7 @@ IMPLEMENT_FUNCTION(40, Anna, function40)
getData()->location = kLocationInsideCompartment;
getData()->entityPosition = kPosition_4070;
- setup_function41();
+ setup_goBackToSleep();
break;
}
break;
@@ -1798,7 +1798,7 @@ IMPLEMENT_FUNCTION(40, Anna, function40)
IMPLEMENT_FUNCTION_END
//////////////////////////////////////////////////////////////////////////
-IMPLEMENT_FUNCTION(41, Anna, function41)
+IMPLEMENT_FUNCTION(41, Anna, goBackToSleep)
switch (savepoint.action) {
default:
break;
@@ -1875,7 +1875,7 @@ IMPLEMENT_FUNCTION(42, Anna, chapter2)
break;
case kActionNone:
- setup_chapter2Handler();
+ setup_inPart2();
break;
case kActionDefault:
@@ -1892,7 +1892,7 @@ IMPLEMENT_FUNCTION(42, Anna, chapter2)
IMPLEMENT_FUNCTION_END
//////////////////////////////////////////////////////////////////////////
-IMPLEMENT_FUNCTION(43, Anna, chapter2Handler)
+IMPLEMENT_FUNCTION(43, Anna, inPart2)
switch (savepoint.action) {
default:
break;
@@ -1901,7 +1901,7 @@ IMPLEMENT_FUNCTION(43, Anna, chapter2Handler)
getObjects()->update(kObjectOutsideAnnaCompartment, kEntityPlayer, kObjectLocationNone, kCursorKeepValue, kCursorKeepValue);
setCallback(1);
- setup_function12();
+ setup_practiceMusic();
break;
case kActionCallback:
@@ -1911,27 +1911,27 @@ IMPLEMENT_FUNCTION(43, Anna, chapter2Handler)
case 1:
setCallback(2);
- setup_function15(kTime1786500, "418C");
+ setup_compartmentLogic(kTime1786500, "418C");
break;
case 2:
setCallback(3);
- setup_function12();
+ setup_practiceMusic();
break;
case 3:
setCallback(4);
- setup_function15(kTime1818000, "418C");
+ setup_compartmentLogic(kTime1818000, "418C");
break;
case 4:
setCallback(5);
- setup_function12();
+ setup_practiceMusic();
break;
case 5:
setCallback(6);
- setup_function15(kTimeEnd, "418C");
+ setup_compartmentLogic(kTimeEnd, "418C");
break;
}
break;
@@ -1945,7 +1945,7 @@ IMPLEMENT_FUNCTION(44, Anna, chapter3)
break;
case kActionNone:
- setup_chapter3Handler();
+ setup_practicing();
break;
case kActionDefault:
@@ -1965,7 +1965,7 @@ IMPLEMENT_FUNCTION(44, Anna, chapter3)
IMPLEMENT_FUNCTION_END
//////////////////////////////////////////////////////////////////////////
-IMPLEMENT_FUNCTION_I(45, Anna, function45, bool)
+IMPLEMENT_FUNCTION_I(45, Anna, exitCompartment, bool)
switch (savepoint.action) {
default:
break;
@@ -2004,7 +2004,7 @@ IMPLEMENT_FUNCTION_I(45, Anna, function45, bool)
IMPLEMENT_FUNCTION_END
//////////////////////////////////////////////////////////////////////////
-IMPLEMENT_FUNCTION(46, Anna, chapter3Handler)
+IMPLEMENT_FUNCTION(46, Anna, practicing)
switch (savepoint.action) {
default:
break;
@@ -2014,16 +2014,16 @@ IMPLEMENT_FUNCTION(46, Anna, chapter3Handler)
getScenes()->loadSceneFromPosition(kCarRedSleeping, 49);
setCallback(1);
- setup_function12();
+ setup_practiceMusic();
break;
case kActionCallback:
if (getCallback() == 1 || getCallback() == 2) {
if (ENTITY_PARAM(0, 1)) {
- setup_function47();
+ setup_goLunch();
} else {
setCallback(2);
- setup_function15((TimeValue)(getState()->time + 4500), "418C");
+ setup_compartmentLogic((TimeValue) (getState()->time + 4500), "418C");
}
}
break;
@@ -2031,7 +2031,7 @@ IMPLEMENT_FUNCTION(46, Anna, chapter3Handler)
IMPLEMENT_FUNCTION_END
//////////////////////////////////////////////////////////////////////////
-IMPLEMENT_FUNCTION(47, Anna, function47)
+IMPLEMENT_FUNCTION(47, Anna, goLunch)
switch (savepoint.action) {
default:
break;
@@ -2080,7 +2080,7 @@ IMPLEMENT_FUNCTION(47, Anna, function47)
case 5:
getEntities()->drawSequenceLeft(kEntityAugust, "BLANK");
- setup_function48();
+ setup_lunch();
break;
}
break;
@@ -2088,7 +2088,7 @@ IMPLEMENT_FUNCTION(47, Anna, function47)
IMPLEMENT_FUNCTION_END
//////////////////////////////////////////////////////////////////////////
-IMPLEMENT_FUNCTION(48, Anna, function48)
+IMPLEMENT_FUNCTION(48, Anna, lunch)
switch (savepoint.action) {
default:
break;
@@ -2121,7 +2121,7 @@ label_callback_4:
params->param4 = kTimeInvalid;
- setup_function50();
+ setup_leaveLunch();
}
}
break;
@@ -2213,7 +2213,7 @@ IMPLEMENT_FUNCTION(49, Anna, leaveTableWithAugust)
IMPLEMENT_FUNCTION_END
//////////////////////////////////////////////////////////////////////////
-IMPLEMENT_FUNCTION(50, Anna, function50)
+IMPLEMENT_FUNCTION(50, Anna, leaveLunch)
switch (savepoint.action) {
default:
break;
@@ -2240,7 +2240,7 @@ IMPLEMENT_FUNCTION(50, Anna, function50)
break;
case 3:
- setup_function51();
+ setup_afterLunch();
break;
}
break;
@@ -2248,7 +2248,7 @@ IMPLEMENT_FUNCTION(50, Anna, function50)
IMPLEMENT_FUNCTION_END
//////////////////////////////////////////////////////////////////////////
-IMPLEMENT_FUNCTION(51, Anna, function51)
+IMPLEMENT_FUNCTION(51, Anna, afterLunch)
switch (savepoint.action) {
default:
break;
@@ -2291,7 +2291,7 @@ IMPLEMENT_FUNCTION(51, Anna, function51)
case 2:
getSavePoints()->push(kEntityAnna, kEntityAugust, kAction122288808);
- setup_function52();
+ setup_returnCompartment3();
break;
case 3:
@@ -2348,7 +2348,7 @@ IMPLEMENT_FUNCTION(51, Anna, function51)
IMPLEMENT_FUNCTION_END
//////////////////////////////////////////////////////////////////////////
-IMPLEMENT_FUNCTION(52, Anna, function52)
+IMPLEMENT_FUNCTION(52, Anna, returnCompartment3)
switch (savepoint.action) {
default:
break;
@@ -2360,7 +2360,7 @@ IMPLEMENT_FUNCTION(52, Anna, function52)
getEntities()->clearSequences(kEntityAnna);
- setup_function53();
+ setup_dressing();
break;
case kActionDefault:
@@ -2385,7 +2385,7 @@ IMPLEMENT_FUNCTION(52, Anna, function52)
IMPLEMENT_FUNCTION_END
//////////////////////////////////////////////////////////////////////////
-IMPLEMENT_FUNCTION(53, Anna, function53)
+IMPLEMENT_FUNCTION(53, Anna, dressing)
switch (savepoint.action) {
default:
break;
@@ -2393,7 +2393,7 @@ IMPLEMENT_FUNCTION(53, Anna, function53)
case kActionNone:
if (getProgress().field_48 && params->param5 != kTimeInvalid) {
if (Entity::updateParameterTime(kTime2065500, !getEntities()->isPlayerInCar(kCarRedSleeping), params->param5, 150)) {
- setup_function54();
+ setup_giveMaxToConductor2();
break;
}
}
@@ -2537,14 +2537,14 @@ IMPLEMENT_FUNCTION(53, Anna, function53)
IMPLEMENT_FUNCTION_END
//////////////////////////////////////////////////////////////////////////
-IMPLEMENT_FUNCTION(54, Anna, function54)
+IMPLEMENT_FUNCTION(54, Anna, giveMaxToConductor2)
switch (savepoint.action) {
default:
break;
case kActionNone:
if (params->param3) {
- if (Entity::timeCheck(kTime2079000, params->param5, WRAP_SETUP_FUNCTION(Anna, setup_function55)))
+ if (Entity::timeCheck(kTime2079000, params->param5, WRAP_SETUP_FUNCTION(Anna, setup_goConcert)))
break;
if (Entity::updateParameter(params->param6, getState()->time, 9000)) {
@@ -2702,7 +2702,7 @@ IMPLEMENT_FUNCTION(54, Anna, function54)
IMPLEMENT_FUNCTION_END
//////////////////////////////////////////////////////////////////////////
-IMPLEMENT_FUNCTION(55, Anna, function55)
+IMPLEMENT_FUNCTION(55, Anna, goConcert)
switch (savepoint.action) {
default:
break;
@@ -2718,7 +2718,7 @@ IMPLEMENT_FUNCTION(55, Anna, function55)
getInventory()->setLocationAndProcess(kItemKey, kObjectLocation1);
setCallback(1);
- setup_function45(true);
+ setup_exitCompartment(true);
break;
case kActionCallback:
@@ -2733,7 +2733,7 @@ IMPLEMENT_FUNCTION(55, Anna, function55)
break;
case 2:
- setup_function56();
+ setup_concert();
break;
}
break;
@@ -2741,7 +2741,7 @@ IMPLEMENT_FUNCTION(55, Anna, function55)
IMPLEMENT_FUNCTION_END
//////////////////////////////////////////////////////////////////////////
-IMPLEMENT_FUNCTION(56, Anna, function56)
+IMPLEMENT_FUNCTION(56, Anna, concert)
switch (savepoint.action) {
default:
break;
@@ -2754,13 +2754,13 @@ IMPLEMENT_FUNCTION(56, Anna, function56)
break;
case kAction191668032:
- setup_function57();
+ setup_leaveConcert();
break;
}
IMPLEMENT_FUNCTION_END
//////////////////////////////////////////////////////////////////////////
-IMPLEMENT_FUNCTION(57, Anna, function57)
+IMPLEMENT_FUNCTION(57, Anna, leaveConcert)
switch (savepoint.action) {
default:
break;
@@ -2820,7 +2820,7 @@ IMPLEMENT_FUNCTION(57, Anna, function57)
getEntities()->exitCompartment(kEntityAnna, kObjectCompartmentF, true);
getSavePoints()->push(kEntityAnna, kEntityAugust, kAction122288808);
- setup_function59();
+ setup_afterConcert();
break;
}
break;
@@ -2841,7 +2841,7 @@ IMPLEMENT_FUNCTION(57, Anna, function57)
if (getEntities()->isInsideCompartment(kEntityPlayer, kCarRedSleeping, kPosition_4070)
|| getEntities()->isInsideCompartment(kEntityPlayer, kCarRedSleeping, kPosition_4455)) {
getEntities()->exitCompartment(kEntityAnna, kObjectCompartmentF, true);
- setup_function58();
+ setup_leaveConcertCathInCompartment();
} else {
setCallback(3);
setup_enterExitCompartment("625Ff", kObjectCompartmentF);
@@ -2851,7 +2851,7 @@ IMPLEMENT_FUNCTION(57, Anna, function57)
IMPLEMENT_FUNCTION_END
//////////////////////////////////////////////////////////////////////////
-IMPLEMENT_FUNCTION(58, Anna, function58)
+IMPLEMENT_FUNCTION(58, Anna, leaveConcertCathInCompartment)
switch (savepoint.action) {
default:
break;
@@ -2868,14 +2868,14 @@ IMPLEMENT_FUNCTION(58, Anna, function58)
getScenes()->loadSceneFromPosition(kCarRedSleeping, 8);
getSound()->playSound(kEntityAnna, "lib015");
getSavePoints()->push(kEntityAnna, kEntityAugust, kAction122288808);
- setup_function59();
+ setup_afterConcert();
}
break;
}
IMPLEMENT_FUNCTION_END
//////////////////////////////////////////////////////////////////////////
-IMPLEMENT_FUNCTION(59, Anna, function59)
+IMPLEMENT_FUNCTION(59, Anna, afterConcert)
switch (savepoint.action) {
default:
break;
@@ -2884,7 +2884,7 @@ IMPLEMENT_FUNCTION(59, Anna, function59)
if (getInventory()->hasItem(kItemKey) && params->param4 != kTimeInvalid && getState()->time > kTime2218500) {
if (getState()->time > kTime2248200) {
params->param4 = kTimeInvalid;
- setup_function61();
+ setup_goBaggageCompartment();
break;
}
@@ -2897,7 +2897,7 @@ IMPLEMENT_FUNCTION(59, Anna, function59)
if (params->param4 < getState()->time) {
params->param4 = kTimeInvalid;
- setup_function61();
+ setup_goBaggageCompartment();
break;
}
}
@@ -2996,7 +2996,7 @@ IMPLEMENT_FUNCTION(59, Anna, function59)
case kAction156622016:
if (params->param3) {
setCallback(8);
- setup_function60();
+ setup_giveMaxBack();
}
break;
@@ -3017,7 +3017,7 @@ IMPLEMENT_FUNCTION(59, Anna, function59)
IMPLEMENT_FUNCTION_END
//////////////////////////////////////////////////////////////////////////
-IMPLEMENT_FUNCTION(60, Anna, function60)
+IMPLEMENT_FUNCTION(60, Anna, giveMaxBack)
switch (savepoint.action) {
default:
break;
@@ -3063,7 +3063,7 @@ IMPLEMENT_FUNCTION(60, Anna, function60)
IMPLEMENT_FUNCTION_END
//////////////////////////////////////////////////////////////////////////
-IMPLEMENT_FUNCTION(61, Anna, function61)
+IMPLEMENT_FUNCTION(61, Anna, goBaggageCompartment)
switch (savepoint.action) {
default:
break;
@@ -3084,7 +3084,7 @@ IMPLEMENT_FUNCTION(61, Anna, function61)
getObjects()->update(kObject53, kEntityPlayer, kObjectLocation1, kCursorHandKnock, kCursorHand);
setCallback(2);
- setup_function45(false);
+ setup_exitCompartment(false);
break;
case 2:
@@ -3135,7 +3135,7 @@ IMPLEMENT_FUNCTION(62, Anna, function62)
if (getState()->time > kTime2259000 && !params->param2) {
params->param2 = 1;
getSavePoints()->push(kEntityAnna, kEntityVesna, kAction189299008);
- setup_function63();
+ setup_deadBaggageCompartment();
}
break;
@@ -3151,7 +3151,7 @@ IMPLEMENT_FUNCTION(62, Anna, function62)
IMPLEMENT_FUNCTION_END
//////////////////////////////////////////////////////////////////////////
-IMPLEMENT_FUNCTION(63, Anna, function63)
+IMPLEMENT_FUNCTION(63, Anna, deadBaggageCompartment)
switch (savepoint.action) {
default:
break;
@@ -3180,7 +3180,7 @@ IMPLEMENT_FUNCTION(63, Anna, function63)
IMPLEMENT_FUNCTION_END
//////////////////////////////////////////////////////////////////////////
-IMPLEMENT_FUNCTION(64, Anna, baggage)
+IMPLEMENT_FUNCTION(64, Anna, baggageFight)
switch (savepoint.action) {
default:
break;
@@ -3224,7 +3224,7 @@ IMPLEMENT_FUNCTION(64, Anna, baggage)
getProgress().field_54 = 0;
getState()->time = kTime2266200;
- setup_function65();
+ setup_prepareVienna();
break;
}
break;
@@ -3232,7 +3232,7 @@ IMPLEMENT_FUNCTION(64, Anna, baggage)
IMPLEMENT_FUNCTION_END
//////////////////////////////////////////////////////////////////////////
-IMPLEMENT_FUNCTION(65, Anna, function65)
+IMPLEMENT_FUNCTION(65, Anna, prepareVienna)
if (savepoint.action == kActionDefault) {
getData()->entityPosition = kPosition_4070;
getData()->location = kLocationInsideCompartment;
@@ -3243,7 +3243,7 @@ IMPLEMENT_FUNCTION(65, Anna, function65)
getObjects()->update(kObjectOutsideAnnaCompartment, kEntityPlayer, kObjectLocation1, kCursorKeepValue, kCursorKeepValue);
setCallback(1);
- setup_function15(kTimeEnd, "NONE");
+ setup_compartmentLogic(kTimeEnd, "NONE");
}
IMPLEMENT_FUNCTION_END
@@ -3254,7 +3254,7 @@ IMPLEMENT_FUNCTION(66, Anna, chapter4)
break;
case kActionNone:
- setup_chapter4Handler();
+ setup_reading();
break;
case kActionDefault:
@@ -3271,7 +3271,7 @@ IMPLEMENT_FUNCTION(66, Anna, chapter4)
IMPLEMENT_FUNCTION_END
//////////////////////////////////////////////////////////////////////////
-IMPLEMENT_FUNCTION(67, Anna, chapter4Handler)
+IMPLEMENT_FUNCTION(67, Anna, reading)
switch (savepoint.action) {
default:
break;
@@ -3344,7 +3344,7 @@ label_next:
getSound()->playSound(kEntityPlayer, "LIB015");
getScenes()->loadSceneFromPosition(kCarRedSleeping, 8);
- setup_function68();
+ setup_sulking();
break;
case 2:
@@ -3369,7 +3369,7 @@ label_next:
getObjects()->update(kObjectCompartmentF, kEntityPlayer, kObjectLocationNone, kCursorHandKnock, kCursorHand);
getData()->inventoryItem = kItemNone;
- setup_function69();
+ setup_goSalon4();
break;
case kAction219971920:
@@ -3379,7 +3379,7 @@ label_next:
IMPLEMENT_FUNCTION_END
//////////////////////////////////////////////////////////////////////////
-IMPLEMENT_FUNCTION(68, Anna, function68)
+IMPLEMENT_FUNCTION(68, Anna, sulking)
switch (savepoint.action) {
default:
break;
@@ -3387,7 +3387,7 @@ IMPLEMENT_FUNCTION(68, Anna, function68)
case kActionNone:
if (!params->param1) {
setCallback(1);
- setup_function15(kTime2511900, "NONE");
+ setup_compartmentLogic(kTime2511900, "NONE");
}
break;
@@ -3402,7 +3402,7 @@ IMPLEMENT_FUNCTION(68, Anna, function68)
case kAction191001984:
getObjects()->update(kObjectCompartmentF, kEntityPlayer, kObjectLocationNone, kCursorHandKnock, kCursorHand);
- setup_function69();
+ setup_goSalon4();
break;
case kAction201431954:
@@ -3412,7 +3412,7 @@ IMPLEMENT_FUNCTION(68, Anna, function68)
IMPLEMENT_FUNCTION_END
//////////////////////////////////////////////////////////////////////////
-IMPLEMENT_FUNCTION(69, Anna, function69)
+IMPLEMENT_FUNCTION(69, Anna, goSalon4)
switch (savepoint.action) {
default:
break;
@@ -3426,7 +3426,7 @@ IMPLEMENT_FUNCTION(69, Anna, function69)
getData()->entityPosition = kPosition_9270;
getData()->location = kLocationOutsideCompartment;
- setup_function70();
+ setup_returnCompartment4();
break;
}
@@ -3448,7 +3448,7 @@ IMPLEMENT_FUNCTION(69, Anna, function69)
getData()->entityPosition = kPosition_8200;
getData()->location = kLocationOutsideCompartment;
- setup_function70();
+ setup_returnCompartment4();
}
break;
@@ -3484,7 +3484,7 @@ IMPLEMENT_FUNCTION(69, Anna, function69)
break;
case 5:
- setup_function70();
+ setup_returnCompartment4();
break;
}
break;
@@ -3506,14 +3506,14 @@ IMPLEMENT_FUNCTION(69, Anna, function69)
IMPLEMENT_FUNCTION_END
//////////////////////////////////////////////////////////////////////////
-IMPLEMENT_FUNCTION(70, Anna, function70)
+IMPLEMENT_FUNCTION(70, Anna, returnCompartment4)
switch (savepoint.action) {
default:
break;
case kActionDefault:
setCallback(1);
- setup_function72(kCarRedSleeping, kPosition_4070);
+ setup_doWalkCathFollowsAnna(kCarRedSleeping, kPosition_4070);
break;
case kActionCallback:
@@ -3523,13 +3523,13 @@ IMPLEMENT_FUNCTION(70, Anna, function70)
case 1:
setCallback(2);
- setup_function71();
+ setup_enterCompartmentCathFollowsAnna();
break;
case 2:
getData()->location = kLocationOutsideCompartment;
getEntities()->clearSequences(kEntityAnna);
- setup_function73();
+ setup_letDownHair();
break;
}
break;
@@ -3537,7 +3537,7 @@ IMPLEMENT_FUNCTION(70, Anna, function70)
IMPLEMENT_FUNCTION_END
//////////////////////////////////////////////////////////////////////////
-IMPLEMENT_FUNCTION(71, Anna, function71)
+IMPLEMENT_FUNCTION(71, Anna, enterCompartmentCathFollowsAnna)
switch (savepoint.action) {
default:
break;
@@ -3589,7 +3589,7 @@ IMPLEMENT_FUNCTION(71, Anna, function71)
IMPLEMENT_FUNCTION_END
//////////////////////////////////////////////////////////////////////////
-IMPLEMENT_FUNCTION_II(72, Anna, function72, CarIndex, EntityPosition)
+IMPLEMENT_FUNCTION_II(72, Anna, doWalkCathFollowsAnna, CarIndex, EntityPosition)
switch (savepoint.action) {
default:
break;
@@ -3631,7 +3631,7 @@ IMPLEMENT_FUNCTION_II(72, Anna, function72, CarIndex, EntityPosition)
IMPLEMENT_FUNCTION_END
//////////////////////////////////////////////////////////////////////////
-IMPLEMENT_FUNCTION(73, Anna, function73)
+IMPLEMENT_FUNCTION(73, Anna, letDownHair)
switch (savepoint.action) {
default:
break;
@@ -3712,7 +3712,7 @@ IMPLEMENT_FUNCTION(74, Anna, chapter5)
break;
case kActionNone:
- setup_chapter5Handler();
+ setup_tiedUp();
break;
case kActionDefault:
@@ -3731,7 +3731,7 @@ IMPLEMENT_FUNCTION(74, Anna, chapter5)
IMPLEMENT_FUNCTION_END
//////////////////////////////////////////////////////////////////////////
-IMPLEMENT_FUNCTION(75, Anna, chapter5Handler)
+IMPLEMENT_FUNCTION(75, Anna, tiedUp)
switch (savepoint.action) {
default:
break;
@@ -3758,11 +3758,11 @@ IMPLEMENT_FUNCTION_END
//////////////////////////////////////////////////////////////////////////
IMPLEMENT_FUNCTION(76, Anna, function76)
if (savepoint.action == kAction158480160)
- setup_function77();
+ setup_readyToScore();
IMPLEMENT_FUNCTION_END
//////////////////////////////////////////////////////////////////////////
-IMPLEMENT_FUNCTION(77, Anna, function77)
+IMPLEMENT_FUNCTION(77, Anna, readyToScore)
switch (savepoint.action) {
default:
break;
@@ -3818,7 +3818,7 @@ IMPLEMENT_FUNCTION(77, Anna, function77)
break;
case 3:
- setup_function78();
+ setup_kidnapped();
break;
}
break;
@@ -3826,14 +3826,14 @@ IMPLEMENT_FUNCTION(77, Anna, function77)
IMPLEMENT_FUNCTION_END
//////////////////////////////////////////////////////////////////////////
-IMPLEMENT_FUNCTION(78, Anna, function78)
+IMPLEMENT_FUNCTION(78, Anna, kidnapped)
switch (savepoint.action) {
default:
break;
case kActionDrawScene:
if ((getEntities()->isInRestaurant(kEntityPlayer) || getEntities()->isInSalon(kEntityPlayer)) && getInventory()->hasItem(kItemFirebird)) {
- setup_function80();
+ setup_finalSequence();
break;
}
@@ -3857,7 +3857,7 @@ IMPLEMENT_FUNCTION(78, Anna, function78)
getAction()->playAnimation(kEventKronosHostageAnna);
getScenes()->loadSceneFromPosition(kCarRestaurant, 61);
getSound()->playSound(kEntityAnna, "Mus024", kFlagDefault);
- setup_function79();
+ setup_waiting();
break;
}
break;
@@ -3865,7 +3865,7 @@ IMPLEMENT_FUNCTION(78, Anna, function78)
IMPLEMENT_FUNCTION_END
//////////////////////////////////////////////////////////////////////////
-IMPLEMENT_FUNCTION(79, Anna, function79)
+IMPLEMENT_FUNCTION(79, Anna, waiting)
switch (savepoint.action) {
default:
break;
@@ -3878,7 +3878,7 @@ IMPLEMENT_FUNCTION(79, Anna, function79)
case kActionDrawScene:
if (getEntities()->isInRestaurant(kEntityPlayer) && getInventory()->hasItem(kItemFirebird)) {
- setup_function80();
+ setup_finalSequence();
break;
}
@@ -3918,7 +3918,7 @@ IMPLEMENT_FUNCTION(79, Anna, function79)
IMPLEMENT_FUNCTION_END
//////////////////////////////////////////////////////////////////////////
-IMPLEMENT_FUNCTION(80, Anna, function80)
+IMPLEMENT_FUNCTION(80, Anna, finalSequence)
switch (savepoint.action) {
default:
break;
@@ -3973,7 +3973,7 @@ IMPLEMENT_FUNCTION(80, Anna, function80)
getAction()->playAnimation(kEventKronosOpenFirebird);
getScenes()->loadSceneFromPosition(kCarRestaurant, 3);
- setup_finalSequence();
+ setup_openFirebird();
break;
}
break;
@@ -3988,7 +3988,7 @@ IMPLEMENT_FUNCTION(80, Anna, function80)
IMPLEMENT_FUNCTION_END
//////////////////////////////////////////////////////////////////////////
-IMPLEMENT_FUNCTION(81, Anna, finalSequence)
+IMPLEMENT_FUNCTION(81, Anna, openFirebird)
switch (savepoint.action) {
default:
break;
diff --git a/engines/lastexpress/entities/anna.h b/engines/lastexpress/entities/anna.h
index 205ff9d42c..89a397a6d0 100644
--- a/engines/lastexpress/entities/anna.h
+++ b/engines/lastexpress/entities/anna.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -113,7 +113,7 @@ public:
*/
DECLARE_FUNCTION_1(updateFromTime, uint32 time)
- DECLARE_FUNCTION(function12)
+ DECLARE_FUNCTION(practiceMusic)
/**
* Draws the entity along with another one
@@ -131,43 +131,43 @@ public:
*/
DECLARE_FUNCTION_1(updateFromTicks, uint32 ticks)
- DECLARE_FUNCTION_2(function15, TimeValue timeValue, const char *sequence)
+ DECLARE_FUNCTION_2(compartmentLogic, TimeValue timeValue, const char *sequence)
/**
* Setup Chapter 1
*/
DECLARE_FUNCTION(chapter1)
- DECLARE_FUNCTION_2(function17, uint32, uint32)
+ DECLARE_FUNCTION_2(doWalkP1, uint32, uint32)
- DECLARE_FUNCTION_1(function18, TimeValue timeValue)
+ DECLARE_FUNCTION_1(diningLogic, TimeValue timeValue)
/**
* Handle Chapter 1 events
*/
- DECLARE_FUNCTION(chapter1Handler)
- DECLARE_FUNCTION(function20)
- DECLARE_FUNCTION(function21)
+ DECLARE_FUNCTION(fleeTyler)
+ DECLARE_FUNCTION(waitDinner)
+ DECLARE_FUNCTION(goDinner)
DECLARE_FUNCTION(function22)
- DECLARE_FUNCTION(function23)
- DECLARE_FUNCTION(function24)
- DECLARE_FUNCTION(function25)
- DECLARE_FUNCTION(function26)
- DECLARE_FUNCTION(function27)
- DECLARE_FUNCTION(function28)
- DECLARE_FUNCTION(function29)
+ DECLARE_FUNCTION(waitingDinner)
+ DECLARE_FUNCTION(waitingDinner2)
+ DECLARE_FUNCTION(eatingDinner)
+ DECLARE_FUNCTION(leaveDinner)
+ DECLARE_FUNCTION(freshenUp)
+ DECLARE_FUNCTION(goSalon)
+ DECLARE_FUNCTION(waitAugust)
DECLARE_FUNCTION(function30)
- DECLARE_FUNCTION(function31)
- DECLARE_FUNCTION(function32)
- DECLARE_FUNCTION(function33)
- DECLARE_FUNCTION(function34)
- DECLARE_FUNCTION(function35)
- DECLARE_FUNCTION(function36)
+ DECLARE_FUNCTION(leaveAugust)
+ DECLARE_FUNCTION(returnCompartment)
+ DECLARE_FUNCTION(readyForBed)
+ DECLARE_FUNCTION(asleep)
+ DECLARE_FUNCTION(wakeNight)
+ DECLARE_FUNCTION(goVassili)
DECLARE_FUNCTION(function37)
- DECLARE_FUNCTION(function38)
- DECLARE_FUNCTION_2(function39, CarIndex car, EntityPosition entityPosition)
- DECLARE_FUNCTION(function40)
- DECLARE_FUNCTION(function41)
+ DECLARE_FUNCTION(speakTatiana)
+ DECLARE_FUNCTION_2(doWalk1019, CarIndex car, EntityPosition entityPosition)
+ DECLARE_FUNCTION(leaveTatiana)
+ DECLARE_FUNCTION(goBackToSleep)
/**
* Setup Chapter 2
@@ -177,37 +177,37 @@ public:
/**
* Handle Chapter 2 events
*/
- DECLARE_FUNCTION(chapter2Handler)
+ DECLARE_FUNCTION(inPart2)
/**
* Setup Chapter 3
*/
DECLARE_FUNCTION(chapter3)
- DECLARE_FUNCTION_1(function45, bool useAction1)
/**
* Handle Chapter 3 events
*/
- DECLARE_FUNCTION(chapter3Handler)
- DECLARE_FUNCTION(function47)
- DECLARE_FUNCTION(function48)
+ DECLARE_FUNCTION_1(exitCompartment, bool useAction1)
+ DECLARE_FUNCTION(practicing)
+ DECLARE_FUNCTION(goLunch)
+ DECLARE_FUNCTION(lunch)
DECLARE_FUNCTION(leaveTableWithAugust)
- DECLARE_FUNCTION(function50)
- DECLARE_FUNCTION(function51)
- DECLARE_FUNCTION(function52)
- DECLARE_FUNCTION(function53)
- DECLARE_FUNCTION(function54)
- DECLARE_FUNCTION(function55)
- DECLARE_FUNCTION(function56)
- DECLARE_FUNCTION(function57)
- DECLARE_FUNCTION(function58)
- DECLARE_FUNCTION(function59)
- DECLARE_FUNCTION(function60)
- DECLARE_FUNCTION(function61)
+ DECLARE_FUNCTION(leaveLunch)
+ DECLARE_FUNCTION(afterLunch)
+ DECLARE_FUNCTION(returnCompartment3)
+ DECLARE_FUNCTION(dressing)
+ DECLARE_FUNCTION(giveMaxToConductor2)
+ DECLARE_FUNCTION(goConcert)
+ DECLARE_FUNCTION(concert)
+ DECLARE_FUNCTION(leaveConcert)
+ DECLARE_FUNCTION(leaveConcertCathInCompartment)
+ DECLARE_FUNCTION(afterConcert)
+ DECLARE_FUNCTION(giveMaxBack)
+ DECLARE_FUNCTION(goBaggageCompartment)
DECLARE_FUNCTION(function62)
- DECLARE_FUNCTION(function63)
- DECLARE_FUNCTION(baggage)
- DECLARE_FUNCTION(function65)
+ DECLARE_FUNCTION(deadBaggageCompartment)
+ DECLARE_FUNCTION(baggageFight)
+ DECLARE_FUNCTION(prepareVienna)
/**
* Setup Chapter 4
@@ -217,14 +217,13 @@ public:
/**
* Handle Chapter 4 events
*/
- DECLARE_FUNCTION(chapter4Handler)
-
- DECLARE_FUNCTION(function68)
- DECLARE_FUNCTION(function69)
- DECLARE_FUNCTION(function70)
- DECLARE_FUNCTION(function71)
- DECLARE_FUNCTION_2(function72, CarIndex car, EntityPosition entityPosition)
- DECLARE_FUNCTION(function73)
+ DECLARE_FUNCTION(reading)
+ DECLARE_FUNCTION(sulking)
+ DECLARE_FUNCTION(goSalon4)
+ DECLARE_FUNCTION(returnCompartment4)
+ DECLARE_FUNCTION(enterCompartmentCathFollowsAnna)
+ DECLARE_FUNCTION_2(doWalkCathFollowsAnna, CarIndex car, EntityPosition entityPosition)
+ DECLARE_FUNCTION(letDownHair)
/**
* Setup Chapter 5
@@ -234,13 +233,13 @@ public:
/**
* Handle Chapter 5 events
*/
- DECLARE_FUNCTION(chapter5Handler)
+ DECLARE_FUNCTION(tiedUp)
DECLARE_FUNCTION(function76)
- DECLARE_FUNCTION(function77)
- DECLARE_FUNCTION(function78)
- DECLARE_FUNCTION(function79)
- DECLARE_FUNCTION(function80)
+ DECLARE_FUNCTION(readyToScore)
+ DECLARE_FUNCTION(kidnapped)
+ DECLARE_FUNCTION(waiting)
DECLARE_FUNCTION(finalSequence)
+ DECLARE_FUNCTION(openFirebird)
};
} // End of namespace LastExpress
diff --git a/engines/lastexpress/entities/august.cpp b/engines/lastexpress/entities/august.cpp
index b0bc0732d4..c5029537ad 100644
--- a/engines/lastexpress/entities/august.cpp
+++ b/engines/lastexpress/entities/august.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -640,7 +640,7 @@ label_continue:
break;
case 6:
- getAction()->playAnimation(getObjects()->get(kObjectCompartment3).location2 == kObjectLocation1 ? kEventMeetAugustHisCompartmentBed : kEventMeetAugustHisCompartment);
+ getAction()->playAnimation(getObjects()->get(kObjectCompartment3).model == kObjectModel1 ? kEventMeetAugustHisCompartmentBed : kEventMeetAugustHisCompartment);
getProgress().eventMetAugust = true;
getObjects()->update(kObjectCompartment3, kEntityAugust, kObjectLocation1, kCursorNormal, kCursorNormal);
@@ -840,11 +840,11 @@ label_callback_9:
if (CURRENT_PARAM(1, 1) >= getState()->timeTicks)
break;
- if (getObjects()->get(kObjectCompartment1).location == kObjectLocation1) {
+ if (getObjects()->get(kObjectCompartment1).status == kObjectLocation1) {
if (!Entity::updateParameter(CURRENT_PARAM(1, 2), getState()->timeTicks, 75))
break;
- getObjects()->update(kObjectCompartment1, kEntityAugust, getObjects()->get(kObjectCompartment1).location, kCursorNormal, kCursorNormal);
+ getObjects()->update(kObjectCompartment1, kEntityAugust, getObjects()->get(kObjectCompartment1).status, kCursorNormal, kCursorNormal);
params->param6++;
@@ -866,7 +866,7 @@ label_callback_9:
params->param8++;
if (params->param8 >= 3) {
- getObjects()->update(kObjectCompartment1, kEntityPlayer, getObjects()->get(kObjectCompartment1).location, kCursorHandKnock, kCursorHand);
+ getObjects()->update(kObjectCompartment1, kEntityPlayer, getObjects()->get(kObjectCompartment1).status, kCursorHandKnock, kCursorHand);
callbackAction();
break;
}
@@ -874,12 +874,12 @@ label_callback_9:
params->param6 = 0;
}
- getObjects()->update(kObjectCompartment1, kEntityAugust, getObjects()->get(kObjectCompartment1).location, params->param4 ? kCursorNormal : kCursorTalk, kCursorHand);
+ getObjects()->update(kObjectCompartment1, kEntityAugust, getObjects()->get(kObjectCompartment1).status, params->param4 ? kCursorNormal : kCursorTalk, kCursorHand);
CURRENT_PARAM(1, 2) = 0;
} else {
if (getProgress().eventCorpseMovedFromFloor && getProgress().jacket != kJacketBlood) {
- params->param7 = (getObjects()->get(kObjectCompartment1).location2 == kObjectLocation1) ? 8 : 7;
+ params->param7 = (getObjects()->get(kObjectCompartment1).model == kObjectModel1) ? 8 : 7;
getObjects()->update(kObjectOutsideTylerCompartment, kEntityPlayer, kObjectLocationNone, kCursorKeepValue, kCursorKeepValue);
setCallback(4);
@@ -900,7 +900,7 @@ label_callback_9:
setCallback(15);
setup_playSound("LIB012");
} else if (!params->param4) {
- getObjects()->update(kObjectCompartment1, kEntityAugust, getObjects()->get(kObjectCompartment1).location, kCursorNormal, kCursorNormal);
+ getObjects()->update(kObjectCompartment1, kEntityAugust, getObjects()->get(kObjectCompartment1).status, kCursorNormal, kCursorNormal);
setCallback(17);
setup_playSound("AUG1002A");
@@ -912,9 +912,9 @@ label_callback_9:
if (params->param3) {
getData()->location = kLocationInsideCompartment;
- params->param7 = (getObjects()->get(kObjectCompartment1).location2 == kObjectLocation1) ? kEventMeetAugustHisCompartmentBed : kEventMeetAugustHisCompartment;
+ params->param7 = (getObjects()->get(kObjectCompartment1).model == kObjectModel1) ? kEventMeetAugustHisCompartmentBed : kEventMeetAugustHisCompartment;
} else {
- params->param7 = (getObjects()->get(kObjectCompartment1).location2 == kObjectLocation1) ? kEventMeetAugustTylerCompartmentBed : kEventMeetAugustTylerCompartment;
+ params->param7 = (getObjects()->get(kObjectCompartment1).model == kObjectModel1) ? kEventMeetAugustTylerCompartmentBed : kEventMeetAugustTylerCompartment;
}
setCallback(14);
@@ -931,14 +931,14 @@ label_callback_9:
if (getEntities()->isInsideCompartment(kEntityPlayer, kCarGreenSleeping, kPosition_8200)
|| getEntities()->isInsideCompartment(kEntityPlayer, kCarGreenSleeping, kPosition_7850)
|| getEntities()->isOutsideAlexeiWindow()) {
- getObjects()->update(kObjectCompartment1, kEntityAugust, getObjects()->get(kObjectCompartment1).location, kCursorNormal, kCursorNormal);
+ getObjects()->update(kObjectCompartment1, kEntityAugust, getObjects()->get(kObjectCompartment1).status, kCursorNormal, kCursorNormal);
if (getEntities()->isOutsideAlexeiWindow())
getScenes()->loadSceneFromPosition(kCarGreenSleeping, 49);
getSound()->playSound(kEntityPlayer, "LIB012");
- getObjects()->update(kObjectCompartment1, kEntityAugust, getObjects()->get(kObjectCompartment1).location, kCursorTalk, kCursorHand);
+ getObjects()->update(kObjectCompartment1, kEntityAugust, getObjects()->get(kObjectCompartment1).status, kCursorTalk, kCursorHand);
params->param2 = 1;
} else {
@@ -996,7 +996,7 @@ label_callback_9:
case 6:
case 7:
- getObjects()->update(kObjectCompartment1, kEntityAugust, getObjects()->get(kObjectCompartment1).location, params->param4 ? kCursorNormal : kCursorTalk, kCursorHand);
+ getObjects()->update(kObjectCompartment1, kEntityAugust, getObjects()->get(kObjectCompartment1).status, params->param4 ? kCursorNormal : kCursorTalk, kCursorHand);
ENTITY_PARAM(1, 2) = 0;
break;
@@ -1032,7 +1032,7 @@ label_callback_9:
break;
case 13:
- getSound()->playSound(kEntityPlayer, getObjects()->get(kObjectCompartment1).location == kObjectLocation1 ? "LIB032" : "LIB014");
+ getSound()->playSound(kEntityPlayer, getObjects()->get(kObjectCompartment1).status == kObjectLocation1 ? "LIB032" : "LIB014");
getAction()->playAnimation(kEventAugustFindCorpse);
if (getEvent(kEventDinerAugustOriginalJacket))
@@ -1045,7 +1045,7 @@ label_callback_9:
case 14:
if (!params->param2)
- getSound()->playSound(kEntityPlayer, getObjects()->get(kObjectCompartment1).location == kObjectLocation1 ? "LIB032" : "LIB014");
+ getSound()->playSound(kEntityPlayer, getObjects()->get(kObjectCompartment1).status == kObjectLocation1 ? "LIB032" : "LIB014");
getObjects()->update(kObjectCompartment1, kEntityPlayer, kObjectLocationNone, kCursorHandKnock, kCursorHand);
getObjects()->update(kObjectOutsideTylerCompartment, kEntityPlayer, kObjectLocationNone, kCursorKeepValue, kCursorKeepValue);
@@ -1070,7 +1070,7 @@ label_callback_9:
case 17:
params->param4 = 1;
- getObjects()->update(kObjectCompartment1, kEntityAugust, getObjects()->get(kObjectCompartment1).location, kCursorNormal, kCursorHand);
+ getObjects()->update(kObjectCompartment1, kEntityAugust, getObjects()->get(kObjectCompartment1).status, kCursorNormal, kCursorHand);
break;
}
break;
@@ -3249,7 +3249,7 @@ IMPLEMENT_FUNCTION(63, August, function63)
case kAction1:
if (getEntities()->isInSalon(kEntityAlexei)) {
- RESET_ENTITY_STATE(kEntityAlexei, Alexei, setup_function44);
+ RESET_ENTITY_STATE(kEntityAlexei, Alexei, setup_goToPlatform);
}
getData()->inventoryItem = kItemNone;
diff --git a/engines/lastexpress/entities/august.h b/engines/lastexpress/entities/august.h
index 606321955b..f8eee1036b 100644
--- a/engines/lastexpress/entities/august.h
+++ b/engines/lastexpress/entities/august.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/lastexpress/entities/boutarel.cpp b/engines/lastexpress/entities/boutarel.cpp
index 219ddf901b..979381afb0 100644
--- a/engines/lastexpress/entities/boutarel.cpp
+++ b/engines/lastexpress/entities/boutarel.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/lastexpress/entities/boutarel.h b/engines/lastexpress/entities/boutarel.h
index 04838f6527..8612566dc4 100644
--- a/engines/lastexpress/entities/boutarel.h
+++ b/engines/lastexpress/entities/boutarel.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/lastexpress/entities/chapters.cpp b/engines/lastexpress/entities/chapters.cpp
index d373432710..fe977a577f 100644
--- a/engines/lastexpress/entities/chapters.cpp
+++ b/engines/lastexpress/entities/chapters.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -221,7 +221,7 @@ IMPLEMENT_FUNCTION(6, Chapters, chapter1End)
RESET_ENTITY_STATE(kEntityKronos, Kronos, setup_function10);
RESET_ENTITY_STATE(kEntityKahina, Kahina, setup_function13);
- RESET_ENTITY_STATE(kEntityAnna, Anna, setup_function34);
+ RESET_ENTITY_STATE(kEntityAnna, Anna, setup_asleep);
RESET_ENTITY_STATE(kEntityAugust, August, setup_function34);
RESET_ENTITY_STATE(kEntityTatiana, Tatiana, setup_function24);
RESET_ENTITY_STATE(kEntityVassili, Vassili, setup_function7);
@@ -349,19 +349,19 @@ IMPLEMENT_FUNCTION(7, Chapters, chapter1Init)
getObjects()->update(kObjectOutsideTylerCompartment, kEntityPlayer, kObjectLocationNone, kCursorKeepValue, kCursorKeepValue);
for (uint i = kObjectCompartment1; i <= kObjectCompartment8; i++) {
- getObjects()->updateLocation2((ObjectIndex)i, kObjectLocation2);
+ getObjects()->updateModel((ObjectIndex) i, kObjectModel2);
}
for (uint i = kObjectCompartmentA; i <= kObjectCompartmentH; i++) {
- getObjects()->updateLocation2((ObjectIndex)i, kObjectLocation2);
+ getObjects()->updateModel((ObjectIndex) i, kObjectModel2);
}
params->param1 = 40;
- getObjects()->updateLocation2(kObject25, kObjectLocation1);
- getObjects()->updateLocation2(kObjectTrainTimeTable, kObjectLocation1);
- getObjects()->updateLocation2(kObject98, kObjectLocation1);
- getObjects()->updateLocation2(kObjectRestaurantCar, kObjectLocation1);
+ getObjects()->updateModel(kObject25, kObjectModel1);
+ getObjects()->updateModel(kObjectTrainTimeTable, kObjectModel1);
+ getObjects()->updateModel(kObject98, kObjectModel1);
+ getObjects()->updateModel(kObjectRestaurantCar, kObjectModel1);
getObjects()->update(kObject25, kEntityPlayer, kObjectLocationNone, kCursorNormal, kCursorForward);
getObjects()->update(kObjectTrainTimeTable, kEntityPlayer, kObjectLocationNone, kCursorNormal, kCursorForward);
@@ -792,11 +792,11 @@ IMPLEMENT_FUNCTION(11, Chapters, chapter2Init)
getInventory()->setLocationAndProcess(kItem3, kObjectLocation1);
for (uint i = 1; i < 9; i++) {
- getObjects()->updateLocation2((ObjectIndex)i, kObjectLocation2);
+ getObjects()->updateModel((ObjectIndex) i, kObjectModel2);
}
for (uint i = 33; i < 40; i++) {
- getObjects()->updateLocation2((ObjectIndex)i, kObjectLocation2);
+ getObjects()->updateModel((ObjectIndex) i, kObjectModel2);
}
params->param1 = 40;
@@ -893,7 +893,7 @@ IMPLEMENT_FUNCTION(14, Chapters, chapter3Init)
getObjects()->update(kObjectHandleOutsideRight, kEntityPlayer, kObjectLocation1, kCursorNormal, kCursorHand);
getInventory()->setLocationAndProcess(kItemBriefcase, kObjectLocation1);
getInventory()->setLocationAndProcess(kItem3, kObjectLocation1);
- getObjects()->updateLocation2(kObjectCompartment1, kObjectLocation2);
+ getObjects()->updateModel(kObjectCompartment1, kObjectModel2);
getObjects()->update(kObject107, kEntityPlayer, kObjectLocation3, kCursorKeepValue, kCursorKeepValue);
if (ENTITY_PARAM(0, 2) || ENTITY_PARAM(0, 3)) {
@@ -1204,7 +1204,7 @@ IMPLEMENT_FUNCTION(18, Chapters, chapter4Init)
if (getInventory()->get(kItemBeetle)->location == kObjectLocation3)
getScenes()->loadSceneFromItemPosition(kItemBeetle);
- getObjects()->updateLocation2(kObject25, kObjectLocation2);
+ getObjects()->updateModel(kObject25, kObjectModel2);
getObjects()->update(kObject107, kEntityPlayer, kObjectLocation3, kCursorKeepValue, kCursorKeepValue);
if (ENTITY_PARAM(0, 2) || ENTITY_PARAM(0, 3)) {
@@ -1265,7 +1265,7 @@ label_exitPozsony:
break;
label_enterGalanta:
- if (getObjects()->get(kObjectCompartment1).location2 == kObjectLocation1) {
+ if (getObjects()->get(kObjectCompartment1).model == kObjectModel1) {
if (getState()->time > kTime2403000 && !CURRENT_PARAM(1, 2)) {
CURRENT_PARAM(1, 2) = 1;
getProgress().field_18 = 2;
@@ -1440,7 +1440,7 @@ label_callback_4:
case 10:
getAction()->playAnimation(kEventDefuseBomb);
- RESET_ENTITY_STATE(kEntityAbbot, Abbot, setup_function48);
+ RESET_ENTITY_STATE(kEntityAbbot, Abbot, setup_afterBomb);
getSavePoints()->push(kEntityChapters, kEntityAnna, kAction191001984);
getSavePoints()->push(kEntityChapters, kEntityCoudert, kAction191001984);
getScenes()->loadSceneFromItemPosition(kItem2);
@@ -1514,7 +1514,7 @@ label_callback_4:
if (getInventory()->hasItem(kItemBomb)) {
RESET_ENTITY_STATE(kEntityAlexei, Alexei, setup_function47);
- RESET_ENTITY_STATE(kEntityAnna, Anna, setup_function68);
+ RESET_ENTITY_STATE(kEntityAnna, Anna, setup_sulking);
RESET_ENTITY_STATE(kEntityAugust, August, setup_function65);
RESET_ENTITY_STATE(kEntityMertens, Mertens, setup_function48);
RESET_ENTITY_STATE(kEntityCoudert, Coudert, setup_function53);
@@ -1675,8 +1675,8 @@ IMPLEMENT_FUNCTION(21, Chapters, chapter5Init)
getObjects()->update(kObject94, kEntityPlayer, kObjectLocationNone, kCursorKeepValue, kCursorKeepValue);
getObjects()->update(kObject101, kEntityPlayer, kObjectLocationNone, kCursorHandKnock, kCursorHand);
- getObjects()->updateLocation2(kObject98, kObjectLocation2);
- getObjects()->updateLocation2(kObjectRestaurantCar, kObjectLocation2);
+ getObjects()->updateModel(kObject98, kObjectModel2);
+ getObjects()->updateModel(kObjectRestaurantCar, kObjectModel2);
if (ENTITY_PARAM(0, 2) || ENTITY_PARAM(0, 3)) {
getSoundQueue()->removeFromQueue(kEntityChapters);
diff --git a/engines/lastexpress/entities/chapters.h b/engines/lastexpress/entities/chapters.h
index fb52ea3ee4..39739aa92e 100644
--- a/engines/lastexpress/entities/chapters.h
+++ b/engines/lastexpress/entities/chapters.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/lastexpress/entities/cooks.cpp b/engines/lastexpress/entities/cooks.cpp
index 5e8a2df8cb..e24180e58d 100644
--- a/engines/lastexpress/entities/cooks.cpp
+++ b/engines/lastexpress/entities/cooks.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/lastexpress/entities/cooks.h b/engines/lastexpress/entities/cooks.h
index f01d0b2ca0..79addb0a02 100644
--- a/engines/lastexpress/entities/cooks.h
+++ b/engines/lastexpress/entities/cooks.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/lastexpress/entities/coudert.cpp b/engines/lastexpress/entities/coudert.cpp
index b604277903..80d93d8a87 100644
--- a/engines/lastexpress/entities/coudert.cpp
+++ b/engines/lastexpress/entities/coudert.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -915,7 +915,7 @@ IMPLEMENT_FUNCTION_II(20, Coudert, function20, ObjectIndex, ObjectIndex)
if (!Entity::updateParameter(CURRENT_PARAM(1, 4), getState()->time, 900))
break;
- getObjects()->updateLocation2((ObjectIndex)params->param1, kObjectLocation1);
+ getObjects()->updateModel((ObjectIndex) params->param1, kObjectModel1);
if (params->param4 != kObjectLocation2)
getObjects()->update((ObjectIndex)params->param1, (EntityIndex)params->param3, (ObjectLocation)params->param4, (CursorStyle)params->param5, (CursorStyle)params->param6);
@@ -938,15 +938,15 @@ IMPLEMENT_FUNCTION_II(20, Coudert, function20, ObjectIndex, ObjectIndex)
case kActionDefault:
params->param3 = getObjects()->get((ObjectIndex)params->param1).entity;
- params->param4 = getObjects()->get((ObjectIndex)params->param1).location;
- params->param5 = getObjects()->get((ObjectIndex)params->param1).cursor;
- params->param6 = getObjects()->get((ObjectIndex)params->param1).cursor2;
+ params->param4 = getObjects()->get((ObjectIndex)params->param1).status;
+ params->param5 = getObjects()->get((ObjectIndex)params->param1).windowCursor;
+ params->param6 = getObjects()->get((ObjectIndex)params->param1).handleCursor;
if (params->param2) {
params->param7 = getObjects()->get((ObjectIndex)params->param2).entity;
- params->param8 = getObjects()->get((ObjectIndex)params->param2).location;
- CURRENT_PARAM(1, 1) = getObjects()->get((ObjectIndex)params->param2).cursor;
- CURRENT_PARAM(1, 2) = getObjects()->get((ObjectIndex)params->param2).cursor2;
+ params->param8 = getObjects()->get((ObjectIndex)params->param2).status;
+ CURRENT_PARAM(1, 1) = getObjects()->get((ObjectIndex)params->param2).windowCursor;
+ CURRENT_PARAM(1, 2) = getObjects()->get((ObjectIndex)params->param2).handleCursor;
getObjects()->update((ObjectIndex)params->param2, kEntityCoudert, kObjectLocation1, kCursorHandKnock, kCursorHand);
}
@@ -1580,7 +1580,7 @@ IMPLEMENT_FUNCTION_I(30, Coudert, function30, ObjectIndex)
case 2:
if (getEntities()->checkFields19(kEntityPlayer, kCarRedSleeping, (EntityPosition)parameters->param3)
|| ((parameters->param1 == kObjectCompartmentE || parameters->param1 == kObjectCompartmentF) && getEntities()->isOutsideAnnaWindow())) {
- getObjects()->update((ObjectIndex)parameters->param1, kEntityPlayer, getObjects()->get((ObjectIndex)parameters->param1).location, kCursorNormal, kCursorNormal);
+ getObjects()->update((ObjectIndex)parameters->param1, kEntityPlayer, getObjects()->get((ObjectIndex)parameters->param1).status, kCursorNormal, kCursorNormal);
parameters->param5 = true;
}
@@ -1598,7 +1598,7 @@ IMPLEMENT_FUNCTION_I(30, Coudert, function30, ObjectIndex)
case 4:
if (parameters->param5)
- getObjects()->update((ObjectIndex)parameters->param1, kEntityPlayer, getObjects()->get((ObjectIndex)parameters->param1).location, kCursorHandKnock, kCursorHand);
+ getObjects()->update((ObjectIndex)parameters->param1, kEntityPlayer, getObjects()->get((ObjectIndex)parameters->param1).status, kCursorHandKnock, kCursorHand);
getEntities()->exitCompartment(kEntityCoudert, (ObjectIndex)parameters->param1, true);
@@ -1991,7 +1991,7 @@ IMPLEMENT_FUNCTION(36, Coudert, chapter1)
getData()->location = kLocationOutsideCompartment;
getData()->car = kCarRedSleeping;
- getObjects()->updateLocation2(kObject111, kObjectLocation1);
+ getObjects()->updateModel(kObject111, kObjectModel1);
break;
case kActionCallback:
@@ -2294,9 +2294,9 @@ label_callback_10:
if (!ENTITY_PARAM(0, 2))
break;
- timeCheckObject(kTime1107000, params->param4, kObject111, kObjectLocation2);
- timeCheckObject(kTime1161000, params->param5, kObject111, kObjectLocation3);
- timeCheckObject(kTime1206000, params->param6, kObject111, kObjectLocation4);
+ timeCheckObject(kTime1107000, params->param4, kObject111, kObjectModel2);
+ timeCheckObject(kTime1161000, params->param5, kObject111, kObjectModel3);
+ timeCheckObject(kTime1206000, params->param6, kObject111, kObjectModel4);
break;
case kAction1:
@@ -2577,7 +2577,7 @@ IMPLEMENT_FUNCTION(42, Coudert, chapter2)
ENTITY_PARAM(2, 4) = 0;
- getObjects()->updateLocation2(kObject111, kObjectLocation5);
+ getObjects()->updateModel(kObject111, kObjectModel5);
break;
case kActionCallback:
@@ -2716,7 +2716,7 @@ IMPLEMENT_FUNCTION(44, Coudert, chapter3)
ENTITY_PARAM(2, 4) = 0;
ENTITY_PARAM(2, 5) = 0;
- getObjects()->updateLocation2(kObject111, kObjectLocation6);
+ getObjects()->updateModel(kObject111, kObjectModel6);
break;
case kActionCallback:
@@ -2850,9 +2850,9 @@ label_callback_18:
label_callback_19:
if (ENTITY_PARAM(0, 2)) {
- timeCheckObject(kTime2025000, params->param7, kObject111, kObjectLocation7);
- timeCheckObject(kTime2133000, params->param8, kObject111, kObjectLocation8);
- timeCheckObject(kTime2173500, CURRENT_PARAM(1, 1), kObject111, kObjectLocation9);
+ timeCheckObject(kTime2025000, params->param7, kObject111, kObjectModel7);
+ timeCheckObject(kTime2133000, params->param8, kObject111, kObjectModel8);
+ timeCheckObject(kTime2173500, CURRENT_PARAM(1, 1), kObject111, kObjectModel9);
}
break;
@@ -3498,7 +3498,7 @@ IMPLEMENT_FUNCTION(52, Coudert, chapter4)
ENTITY_PARAM(2, 3) = 0;
ENTITY_PARAM(2, 4) = 0;
- getObjects()->updateLocation2(kObject111, kObjectLocation10);
+ getObjects()->updateModel(kObject111, kObjectModel10);
break;
case kActionCallback:
@@ -3523,14 +3523,14 @@ IMPLEMENT_FUNCTION(53, Coudert, function53)
params->param1 = 1;
- getObjects()->updateLocation2(kObjectCompartmentA, kObjectLocation1);
- getObjects()->updateLocation2(kObjectCompartmentB, kObjectLocation1);
- getObjects()->updateLocation2(kObjectCompartmentC, kObjectLocation1);
- getObjects()->updateLocation2(kObjectCompartmentD, kObjectLocation1);
- getObjects()->updateLocation2(kObjectCompartmentE, kObjectLocation1);
- getObjects()->updateLocation2(kObjectCompartmentF, kObjectLocation1);
- getObjects()->updateLocation2(kObjectCompartmentG, kObjectLocation1);
- getObjects()->updateLocation2(kObjectCompartmentH, kObjectLocation1);
+ getObjects()->updateModel(kObjectCompartmentA, kObjectModel1);
+ getObjects()->updateModel(kObjectCompartmentB, kObjectModel1);
+ getObjects()->updateModel(kObjectCompartmentC, kObjectModel1);
+ getObjects()->updateModel(kObjectCompartmentD, kObjectModel1);
+ getObjects()->updateModel(kObjectCompartmentE, kObjectModel1);
+ getObjects()->updateModel(kObjectCompartmentF, kObjectModel1);
+ getObjects()->updateModel(kObjectCompartmentG, kObjectModel1);
+ getObjects()->updateModel(kObjectCompartmentH, kObjectModel1);
ENTITY_PARAM(2, 3) = 0;
diff --git a/engines/lastexpress/entities/coudert.h b/engines/lastexpress/entities/coudert.h
index 8303c80a32..a40f31e510 100644
--- a/engines/lastexpress/entities/coudert.h
+++ b/engines/lastexpress/entities/coudert.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/lastexpress/entities/entity.cpp b/engines/lastexpress/entities/entity.cpp
index dad5e67392..07e82d296e 100644
--- a/engines/lastexpress/entities/entity.cpp
+++ b/engines/lastexpress/entities/entity.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -943,10 +943,10 @@ void Entity::timeCheckSavepoint(TimeValue timeValue, uint &parameter, EntityInde
}
}
-void Entity::timeCheckObject(TimeValue timeValue, uint &parameter, ObjectIndex object, ObjectLocation location) const {
+void Entity::timeCheckObject(TimeValue timeValue, uint &parameter, ObjectIndex object, ObjectModel model) const {
if (getState()->time > timeValue && !parameter) {
parameter = 1;
- getObjects()->updateLocation2(object, location);
+ getObjects()->updateModel(object, model);
}
}
diff --git a/engines/lastexpress/entities/entity.h b/engines/lastexpress/entities/entity.h
index 5aa7c1be5a..25c481c5cf 100644
--- a/engines/lastexpress/entities/entity.h
+++ b/engines/lastexpress/entities/entity.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -818,9 +818,9 @@ public:
/**
* Synchronizes a string.
*
- * @param s The Common::Serializer to use.
- * @param string The string.
- * @param length Length of the string.
+ * @param s The Common::Serializer to use.
+ * @param string The string.
+ * @param length Length of the string.
*/
void syncString(Common::Serializer &s, Common::String &string, uint length) const;
@@ -921,7 +921,7 @@ protected:
/**
* Play sound
*
- * @param savepoint The savepoint
+ * @param savepoint The savepoint
* - Sound filename
* @param resetItem true to reset item.
* @param flag sound flag
@@ -931,9 +931,9 @@ protected:
/**
* Draws the entity
*
- * @param savepoint The savepoint
- * - Sequence
- * - ExcuseMe flag
+ * @param savepoint The savepoint
+ * - Sequence
+ * - ExcuseMe flag
* @param handleExcuseMe true to handle excuseMeCath action
*/
void draw(const SavePoint &savepoint, bool handleExcuseMe = false);
@@ -941,7 +941,7 @@ protected:
/**
* Draws the entity along with another one
*
- * @param savepoint The savepoint.
+ * @param savepoint The savepoint.
* - Sequence 1
* - Sequence 2
* - EntityIndex
@@ -976,23 +976,23 @@ protected:
/**
* Process callback action when the entity direction is not kDirectionRight
*
- * @param savepoint The savepoint.
+ * @param savepoint The savepoint.
*/
void callbackActionOnDirection(const SavePoint &savepoint);
/**
* Process callback action when somebody is standing in the restaurant or salon.
*
- * @param savepoint The savepoint.
+ * @param savepoint The savepoint.
*/
void callbackActionRestaurantOrSalon(const SavePoint &savepoint);
/**
* Updates the entity
*
- * @param savepoint The savepoint.
- * - CarIndex
- * - EntityPosition
+ * @param savepoint The savepoint.
+ * - CarIndex
+ * - EntityPosition
* @param handleExcuseMe true to handle the kActionExcuseMe/kActionExcuseMeCath actions.
*/
void updateEntity(const SavePoint &savepoint, bool handleExcuseMe = false);
@@ -1000,11 +1000,11 @@ protected:
/**
* Call a specific savepoint (or draw sequence in default case)
*
- * @param savepoint The savepoint.
- * - Sequence to draw in default case
- * - EntityIndex
- * - ActionIndex
- * - Sequence for the savepoint
+ * @param savepoint The savepoint.
+ * - Sequence to draw in default case
+ * - EntityIndex
+ * - ActionIndex
+ * - Sequence for the savepoint
* @param handleExcuseMe true to handle excuse me.
*/
void callSavepoint(const SavePoint &savepoint, bool handleExcuseMe = false);
@@ -1012,36 +1012,36 @@ protected:
/**
* Handles entering/exiting a compartment.
*
- * @param savepoint The savepoint.
- * @param position1 The first position.
- * @param position2 The second position.
- * @param car The car.
- * @param compartment The compartment.
- * @param alternate true to use the alternate version of SceneManager::loadSceneFromObject()
+ * @param savepoint The savepoint.
+ * @param position1 The first position.
+ * @param position2 The second position.
+ * @param car The car.
+ * @param compartment The compartment.
+ * @param alternate true to use the alternate version of SceneManager::loadSceneFromObject()
*/
void enterExitCompartment(const SavePoint &savepoint, EntityPosition position1 = kPositionNone, EntityPosition position2 = kPositionNone, CarIndex car = kCarNone, ObjectIndex compartment = kObjectNone, bool alternate = false, bool updateLocation = false);
/**
* Go to compartment.
*
- * @param savepoint The savepoint.
- * @param compartmentFrom The compartment from.
- * @param positionFrom The position from.
- * @param sequenceFrom The sequence from.
- * @param sequenceTo The sequence to.
+ * @param savepoint The savepoint.
+ * @param compartmentFrom The compartment from.
+ * @param positionFrom The position from.
+ * @param sequenceFrom The sequence from.
+ * @param sequenceTo The sequence to.
*/
void goToCompartment(const SavePoint &savepoint, ObjectIndex compartmentFrom, EntityPosition positionFrom, Common::String sequenceFrom, Common::String sequenceTo);
/**
* Go to compartment from compartment.
*
- * @param savepoint The savepoint.
- * @param compartmentFrom The compartment from.
- * @param positionFrom The position from.
- * @param sequenceFrom The sequence from.
- * @param compartmentTo The compartment to.
- * @param positionTo The position to.
- * @param sequenceTo The sequence to.
+ * @param savepoint The savepoint.
+ * @param compartmentFrom The compartment from.
+ * @param positionFrom The position from.
+ * @param sequenceFrom The sequence from.
+ * @param compartmentTo The compartment to.
+ * @param positionTo The position to.
+ * @param sequenceTo The sequence to.
*/
void goToCompartmentFromCompartment(const SavePoint &savepoint, ObjectIndex compartmentFrom, EntityPosition positionFrom, Common::String sequenceFrom, ObjectIndex compartmentTo, EntityPosition positionTo, Common::String sequenceTo);
@@ -1095,7 +1095,7 @@ protected:
bool timeCheckCallbackInventory(TimeValue timeValue, uint &parameter, byte callback, Common::Functor0<void> *function);
bool timeCheckCar(TimeValue timeValue, uint &parameter, byte callback, Common::Functor0<void> *function);
void timeCheckSavepoint(TimeValue timeValue, uint &parameter, EntityIndex entity1, EntityIndex entity2, ActionIndex action) const;
- void timeCheckObject(TimeValue timeValue, uint &parameter, ObjectIndex index, ObjectLocation location) const;
+ void timeCheckObject(TimeValue timeValue, uint &parameter, ObjectIndex index, ObjectModel model) const;
bool timeCheckCallbackAction(TimeValue timeValue, uint &parameter);
bool timeCheckPlaySoundUpdatePosition(TimeValue timeValue, uint &parameter, byte callback, const char* sound, EntityPosition position);
diff --git a/engines/lastexpress/entities/entity39.cpp b/engines/lastexpress/entities/entity39.cpp
index 1786cd2201..d1f20d6114 100644
--- a/engines/lastexpress/entities/entity39.cpp
+++ b/engines/lastexpress/entities/entity39.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/lastexpress/entities/entity39.h b/engines/lastexpress/entities/entity39.h
index 54b65408c7..b6abcc2cc8 100644
--- a/engines/lastexpress/entities/entity39.h
+++ b/engines/lastexpress/entities/entity39.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/lastexpress/entities/entity_intern.h b/engines/lastexpress/entities/entity_intern.h
index fd803676a9..2c2d132b07 100644
--- a/engines/lastexpress/entities/entity_intern.h
+++ b/engines/lastexpress/entities/entity_intern.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/lastexpress/entities/francois.cpp b/engines/lastexpress/entities/francois.cpp
index d2bbc9854c..8ef27cbe92 100644
--- a/engines/lastexpress/entities/francois.cpp
+++ b/engines/lastexpress/entities/francois.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -44,22 +44,22 @@ Francois::Francois(LastExpressEngine *engine) : Entity(engine, kEntityFrancois)
ADD_CALLBACK_FUNCTION(Francois, enterExitCompartment2);
ADD_CALLBACK_FUNCTION(Francois, playSound);
ADD_CALLBACK_FUNCTION(Francois, savegame);
- ADD_CALLBACK_FUNCTION(Francois, updateEntity);
- ADD_CALLBACK_FUNCTION(Francois, function9);
- ADD_CALLBACK_FUNCTION(Francois, function10);
- ADD_CALLBACK_FUNCTION(Francois, function11);
- ADD_CALLBACK_FUNCTION(Francois, function12);
- ADD_CALLBACK_FUNCTION(Francois, function13);
- ADD_CALLBACK_FUNCTION(Francois, function14);
- ADD_CALLBACK_FUNCTION(Francois, function15);
- ADD_CALLBACK_FUNCTION(Francois, function16);
+ ADD_CALLBACK_FUNCTION(Francois, doWalk);
+ ADD_CALLBACK_FUNCTION(Francois, exitCompartment);
+ ADD_CALLBACK_FUNCTION(Francois, enterCompartment);
+ ADD_CALLBACK_FUNCTION(Francois, rampage);
+ ADD_CALLBACK_FUNCTION(Francois, takeWalk);
+ ADD_CALLBACK_FUNCTION(Francois, haremVisit);
+ ADD_CALLBACK_FUNCTION(Francois, chaseBeetle);
+ ADD_CALLBACK_FUNCTION(Francois, findCath);
+ ADD_CALLBACK_FUNCTION(Francois, letsGo);
ADD_CALLBACK_FUNCTION(Francois, chapter1);
ADD_CALLBACK_FUNCTION(Francois, chapter1Handler);
- ADD_CALLBACK_FUNCTION(Francois, function19);
+ ADD_CALLBACK_FUNCTION(Francois, inCompartment);
ADD_CALLBACK_FUNCTION(Francois, function20);
ADD_CALLBACK_FUNCTION(Francois, chapter2);
- ADD_CALLBACK_FUNCTION(Francois, chapter2Handler);
- ADD_CALLBACK_FUNCTION(Francois, function23);
+ ADD_CALLBACK_FUNCTION(Francois, atBreakfast);
+ ADD_CALLBACK_FUNCTION(Francois, withMama);
ADD_CALLBACK_FUNCTION(Francois, chapter3);
ADD_CALLBACK_FUNCTION(Francois, chapter3Handler);
ADD_CALLBACK_FUNCTION(Francois, chapter4);
@@ -106,7 +106,7 @@ IMPLEMENT_FUNCTION_II(7, Francois, savegame, SavegameType, uint32)
IMPLEMENT_FUNCTION_END
//////////////////////////////////////////////////////////////////////////
-IMPLEMENT_FUNCTION_II(8, Francois, updateEntity, CarIndex, EntityPosition)
+IMPLEMENT_FUNCTION_II(8, Francois, doWalk, CarIndex, EntityPosition)
switch (savepoint.action) {
default:
break;
@@ -196,13 +196,13 @@ IMPLEMENT_FUNCTION_II(8, Francois, updateEntity, CarIndex, EntityPosition)
IMPLEMENT_FUNCTION_END
//////////////////////////////////////////////////////////////////////////
-IMPLEMENT_FUNCTION(9, Francois, function9)
+IMPLEMENT_FUNCTION(9, Francois, exitCompartment)
switch (savepoint.action) {
default:
break;
case kActionDefault:
- if (getObjects()->get(kObjectCompartmentD).location == kObjectLocation2) {
+ if (getObjects()->get(kObjectCompartmentD).status == kObjectLocation2) {
getObjects()->update(kObjectCompartmentD, kEntityPlayer, kObjectLocationNone, kCursorKeepValue, kCursorKeepValue);
getSavePoints()->push(kEntityFrancois, kEntityMmeBoutarel, kAction134289824);
setCallback(1);
@@ -232,13 +232,13 @@ IMPLEMENT_FUNCTION(9, Francois, function9)
IMPLEMENT_FUNCTION_END
//////////////////////////////////////////////////////////////////////////
-IMPLEMENT_FUNCTION(10, Francois, function10)
+IMPLEMENT_FUNCTION(10, Francois, enterCompartment)
switch (savepoint.action) {
default:
break;
case kActionDefault:
- if (getObjects()->get(kObjectCompartmentD).location == kObjectLocation2) {
+ if (getObjects()->get(kObjectCompartmentD).status == kObjectLocation2) {
getObjects()->update(kObjectCompartmentD, kEntityPlayer, kObjectLocationNone, kCursorKeepValue, kCursorKeepValue);
setCallback(1);
setup_enterExitCompartment2("605Bd", kObjectCompartmentD);
@@ -270,7 +270,7 @@ IMPLEMENT_FUNCTION(10, Francois, function10)
IMPLEMENT_FUNCTION_END
//////////////////////////////////////////////////////////////////////////
-IMPLEMENT_FUNCTION_I(11, Francois, function11, TimeValue)
+IMPLEMENT_FUNCTION_I(11, Francois, rampage, TimeValue)
switch (savepoint.action) {
default:
break;
@@ -375,7 +375,7 @@ label_callback:
getSoundQueue()->processEntry(kEntityFrancois);
setCallback(4);
- setup_updateEntity(kCarRedSleeping, kPosition_5790);
+ setup_doWalk(kCarRedSleeping, kPosition_5790);
}
break;
@@ -400,7 +400,7 @@ label_callback:
case kActionDefault:
setCallback(1);
- setup_function9();
+ setup_exitCompartment();
break;
case kActionCallback:
@@ -437,7 +437,7 @@ label_callback:
case 4:
setCallback(5);
- setup_function10();
+ setup_enterCompartment();
break;
case 5:
@@ -477,14 +477,14 @@ label_callback:
IMPLEMENT_FUNCTION_END
//////////////////////////////////////////////////////////////////////////
-IMPLEMENT_FUNCTION(12, Francois, function12)
+IMPLEMENT_FUNCTION(12, Francois, takeWalk)
switch (savepoint.action) {
default:
break;
case kActionDefault:
setCallback(1);
- setup_function9();
+ setup_exitCompartment();
break;
case kActionCallback:
@@ -494,7 +494,7 @@ IMPLEMENT_FUNCTION(12, Francois, function12)
case 1:
setCallback(2);
- setup_updateEntity(kCarRedSleeping, kPosition_9460);
+ setup_doWalk(kCarRedSleeping, kPosition_9460);
break;
case 2:
@@ -504,7 +504,7 @@ IMPLEMENT_FUNCTION(12, Francois, function12)
case 3:
setCallback(4);
- setup_updateEntity(kCarRedSleeping, kPosition_540);
+ setup_doWalk(kCarRedSleeping, kPosition_540);
break;
case 4:
@@ -514,12 +514,12 @@ IMPLEMENT_FUNCTION(12, Francois, function12)
case 5:
setCallback(6);
- setup_updateEntity(kCarRedSleeping, kPosition_5790);
+ setup_doWalk(kCarRedSleeping, kPosition_5790);
break;
case 6:
setCallback(7);
- setup_function10();
+ setup_enterCompartment();
break;
case 7:
@@ -531,14 +531,14 @@ IMPLEMENT_FUNCTION(12, Francois, function12)
IMPLEMENT_FUNCTION_END
//////////////////////////////////////////////////////////////////////////
-IMPLEMENT_FUNCTION(13, Francois, function13)
+IMPLEMENT_FUNCTION(13, Francois, haremVisit)
switch (savepoint.action) {
default:
break;
case kActionDefault:
setCallback(1);
- setup_function9();
+ setup_exitCompartment();
break;
case kActionCallback:
@@ -548,12 +548,12 @@ IMPLEMENT_FUNCTION(13, Francois, function13)
case 1:
setCallback(2);
- setup_updateEntity(kCarRedSleeping, kPosition_540);
+ setup_doWalk(kCarRedSleeping, kPosition_540);
break;
case 2:
setCallback(3);
- setup_updateEntity(kCarGreenSleeping, kPosition_4070);
+ setup_doWalk(kCarGreenSleeping, kPosition_4070);
break;
case 3:
@@ -577,13 +577,13 @@ IMPLEMENT_FUNCTION(13, Francois, function13)
getData()->location = kLocationOutsideCompartment;
setCallback(7);
- setup_updateEntity(kCarGreenSleeping, kPosition_4840);
+ setup_doWalk(kCarGreenSleeping, kPosition_4840);
break;
case 7:
if (getInventory()->hasItem(kItemWhistle) || getInventory()->get(kItemWhistle)->location == kObjectLocation3) {
setCallback(10);
- setup_updateEntity(kCarGreenSleeping, kPosition_5790);
+ setup_doWalk(kCarGreenSleeping, kPosition_5790);
break;
}
@@ -599,12 +599,12 @@ IMPLEMENT_FUNCTION(13, Francois, function13)
getEntities()->exitCompartment(kEntityFrancois, kObjectCompartmentE, true);
setCallback(10);
- setup_updateEntity(kCarGreenSleeping, kPosition_5790);
+ setup_doWalk(kCarGreenSleeping, kPosition_5790);
break;
case 10:
setCallback(11);
- setup_function10();
+ setup_enterCompartment();
break;
case 11:
@@ -621,7 +621,7 @@ IMPLEMENT_FUNCTION(13, Francois, function13)
IMPLEMENT_FUNCTION_END
//////////////////////////////////////////////////////////////////////////
-IMPLEMENT_FUNCTION_IIS(14, Francois, function14, ObjectIndex, EntityPosition)
+IMPLEMENT_FUNCTION_IIS(14, Francois, chaseBeetle, ObjectIndex, EntityPosition)
// Expose parameters as IISS and ignore the default exposed parameters
EntityData::EntityParametersIISS *parameters = (EntityData::EntityParametersIISS*)_data->getCurrentParameters();
@@ -634,7 +634,7 @@ IMPLEMENT_FUNCTION_IIS(14, Francois, function14, ObjectIndex, EntityPosition)
strcat((char *)&parameters->seq2, (char *)&parameters->seq1);
setCallback(1);
- setup_function9();
+ setup_exitCompartment();
break;
case kActionCallback:
@@ -644,7 +644,7 @@ IMPLEMENT_FUNCTION_IIS(14, Francois, function14, ObjectIndex, EntityPosition)
case 1:
setCallback(2);
- setup_updateEntity(kCarRedSleeping, (EntityPosition)parameters->param2);
+ setup_doWalk(kCarRedSleeping, (EntityPosition)parameters->param2);
break;
case 2:
@@ -657,10 +657,10 @@ IMPLEMENT_FUNCTION_IIS(14, Francois, function14, ObjectIndex, EntityPosition)
} else {
if (parameters->param2 >= kPosition_5790) {
setCallback(10);
- setup_updateEntity(kCarRedSleeping, kPosition_9460);
+ setup_doWalk(kCarRedSleeping, kPosition_9460);
} else {
setCallback(9);
- setup_updateEntity(kCarRedSleeping, kPosition_540);
+ setup_doWalk(kCarRedSleeping, kPosition_540);
}
}
break;
@@ -688,7 +688,7 @@ IMPLEMENT_FUNCTION_IIS(14, Francois, function14, ObjectIndex, EntityPosition)
case 9:
setCallback(10);
- setup_updateEntity(kCarRedSleeping, kPosition_9460);
+ setup_doWalk(kCarRedSleeping, kPosition_9460);
break;
case 10:
@@ -698,12 +698,12 @@ IMPLEMENT_FUNCTION_IIS(14, Francois, function14, ObjectIndex, EntityPosition)
case 11:
setCallback(12);
- setup_updateEntity(kCarRedSleeping, kPosition_5790);
+ setup_doWalk(kCarRedSleeping, kPosition_5790);
break;
case 12:
setCallback(13);
- setup_function10();
+ setup_enterCompartment();
break;
case 13:
@@ -715,14 +715,14 @@ IMPLEMENT_FUNCTION_IIS(14, Francois, function14, ObjectIndex, EntityPosition)
IMPLEMENT_FUNCTION_END
//////////////////////////////////////////////////////////////////////////
-IMPLEMENT_FUNCTION(15, Francois, function15)
+IMPLEMENT_FUNCTION(15, Francois, findCath)
switch (savepoint.action) {
default:
break;
case kActionDefault:
setCallback(1);
- setup_function9();
+ setup_exitCompartment();
break;
case kActionCallback:
@@ -733,10 +733,10 @@ IMPLEMENT_FUNCTION(15, Francois, function15)
case 1:
if (getData()->entityPosition >= getEntityData(kEntityPlayer)->entityPosition) {
setCallback(3);
- setup_updateEntity(kCarRedSleeping, kPosition_540);
+ setup_doWalk(kCarRedSleeping, kPosition_540);
} else {
setCallback(2);
- setup_updateEntity(kCarRedSleeping, kPosition_9460);
+ setup_doWalk(kCarRedSleeping, kPosition_9460);
}
break;
@@ -748,12 +748,12 @@ IMPLEMENT_FUNCTION(15, Francois, function15)
case 4:
setCallback(5);
- setup_updateEntity(kCarRedSleeping, kPosition_5790);
+ setup_doWalk(kCarRedSleeping, kPosition_5790);
break;
case 5:
setCallback(6);
- setup_function10();
+ setup_enterCompartment();
break;
case 6:
@@ -780,7 +780,7 @@ IMPLEMENT_FUNCTION(15, Francois, function15)
IMPLEMENT_FUNCTION_END
//////////////////////////////////////////////////////////////////////////
-IMPLEMENT_FUNCTION(16, Francois, function16)
+IMPLEMENT_FUNCTION(16, Francois, letsGo)
switch (savepoint.action) {
default:
break;
@@ -809,7 +809,7 @@ IMPLEMENT_FUNCTION(16, Francois, function16)
getSavePoints()->push(kEntityFrancois, kEntityMmeBoutarel, kAction101107728);
setCallback(2);
- setup_updateEntity(kCarRestaurant, kPosition_850);
+ setup_doWalk(kCarRestaurant, kPosition_850);
break;
case 2:
@@ -836,7 +836,7 @@ IMPLEMENT_FUNCTION(16, Francois, function16)
case kAction100901266:
setCallback(3);
- setup_updateEntity(kCarRedSleeping, kPosition_5790);
+ setup_doWalk(kCarRedSleeping, kPosition_5790);
break;
}
IMPLEMENT_FUNCTION_END
@@ -871,24 +871,24 @@ IMPLEMENT_FUNCTION(18, Francois, chapter1Handler)
case kActionCallback:
if (getCallback() == 1)
- setup_function19();
+ setup_inCompartment();
break;
}
IMPLEMENT_FUNCTION_END
//////////////////////////////////////////////////////////////////////////
-IMPLEMENT_FUNCTION(19, Francois, function19)
+IMPLEMENT_FUNCTION(19, Francois, inCompartment)
switch (savepoint.action) {
default:
break;
case kActionNone:
- Entity::timeCheckCallback(kTime1161000, params->param1, 2, WRAP_SETUP_FUNCTION(Francois, setup_function12));
+ Entity::timeCheckCallback(kTime1161000, params->param1, 2, WRAP_SETUP_FUNCTION(Francois, setup_takeWalk));
break;
case kAction101107728:
setCallback(1);
- setup_function16();
+ setup_letsGo();
break;
}
IMPLEMENT_FUNCTION_END
@@ -911,7 +911,7 @@ IMPLEMENT_FUNCTION(21, Francois, chapter2)
break;
case kActionNone:
- setup_chapter2Handler();
+ setup_atBreakfast();
break;
case kActionDefault:
@@ -927,7 +927,7 @@ IMPLEMENT_FUNCTION(21, Francois, chapter2)
IMPLEMENT_FUNCTION_END
//////////////////////////////////////////////////////////////////////////
-IMPLEMENT_FUNCTION(22, Francois, chapter2Handler)
+IMPLEMENT_FUNCTION(22, Francois, atBreakfast)
switch (savepoint.action) {
default:
break;
@@ -948,20 +948,20 @@ IMPLEMENT_FUNCTION(22, Francois, chapter2Handler)
getData()->entityPosition = kPosition_5790;
getData()->location = kLocationInsideCompartment;
getEntities()->clearSequences(kEntityFrancois);
- setup_function23();
+ setup_withMama();
break;
}
break;
case kAction100901266:
setCallback(1);
- setup_updateEntity(kCarRedSleeping, kPosition_5790);
+ setup_doWalk(kCarRedSleeping, kPosition_5790);
break;
}
IMPLEMENT_FUNCTION_END
//////////////////////////////////////////////////////////////////////////
-IMPLEMENT_FUNCTION(23, Francois, function23)
+IMPLEMENT_FUNCTION(23, Francois, withMama)
switch (savepoint.action) {
default:
break;
@@ -973,7 +973,7 @@ IMPLEMENT_FUNCTION(23, Francois, function23)
if (ENTITY_PARAM(0, 1) && getEntities()->isPlayerInCar(kCarRedSleeping)) {
setCallback(1);
- setup_function15();
+ setup_findCath();
break;
}
@@ -982,7 +982,7 @@ label_callback_1:
break;
label_callback_2:
- if (Entity::timeCheckCallback(kTime1800000, params->param2, 3, WRAP_SETUP_FUNCTION(Francois, setup_function13)))
+ if (Entity::timeCheckCallback(kTime1800000, params->param2, 3, WRAP_SETUP_FUNCTION(Francois, setup_haremVisit)))
break;
label_callback_3:
@@ -1085,36 +1085,36 @@ IMPLEMENT_FUNCTION(25, Francois, chapter3Handler)
if (ENTITY_PARAM(0, 1) && getEntities()->isPlayerInCar(kCarRedSleeping)) {
setCallback(2);
- setup_function15();
+ setup_findCath();
break;
}
label_callback_2:
- if (Entity::timeCheckCallback(kTime2025000, params->param3, 3, WRAP_SETUP_FUNCTION(Francois, setup_function12)))
+ if (Entity::timeCheckCallback(kTime2025000, params->param3, 3, WRAP_SETUP_FUNCTION(Francois, setup_takeWalk)))
break;
label_callback_3:
- if (Entity::timeCheckCallback(kTime2052000, params->param4, 4, WRAP_SETUP_FUNCTION(Francois, setup_function12)))
+ if (Entity::timeCheckCallback(kTime2052000, params->param4, 4, WRAP_SETUP_FUNCTION(Francois, setup_takeWalk)))
break;
label_callback_4:
- if (Entity::timeCheckCallback(kTime2079000, params->param5, 5, WRAP_SETUP_FUNCTION(Francois, setup_function12)))
+ if (Entity::timeCheckCallback(kTime2079000, params->param5, 5, WRAP_SETUP_FUNCTION(Francois, setup_takeWalk)))
break;
label_callback_5:
- if (Entity::timeCheckCallback(kTime2092500, params->param6, 6, WRAP_SETUP_FUNCTION(Francois, setup_function12)))
+ if (Entity::timeCheckCallback(kTime2092500, params->param6, 6, WRAP_SETUP_FUNCTION(Francois, setup_takeWalk)))
break;
label_callback_6:
- if (Entity::timeCheckCallback(kTime2173500, params->param7, 7, WRAP_SETUP_FUNCTION(Francois, setup_function12)))
+ if (Entity::timeCheckCallback(kTime2173500, params->param7, 7, WRAP_SETUP_FUNCTION(Francois, setup_takeWalk)))
break;
label_callback_7:
- if (Entity::timeCheckCallback(kTime2182500, params->param8, 8, WRAP_SETUP_FUNCTION(Francois, setup_function12)))
+ if (Entity::timeCheckCallback(kTime2182500, params->param8, 8, WRAP_SETUP_FUNCTION(Francois, setup_takeWalk)))
break;
label_callback_8:
- if (Entity::timeCheckCallback(kTime2241000, CURRENT_PARAM(1, 1), 9, WRAP_SETUP_FUNCTION(Francois, setup_function12)))
+ if (Entity::timeCheckCallback(kTime2241000, CURRENT_PARAM(1, 1), 9, WRAP_SETUP_FUNCTION(Francois, setup_takeWalk)))
break;
label_callback_9:
@@ -1208,7 +1208,7 @@ label_callback_14:
case kAction101107728:
setCallback(1);
- setup_function16();
+ setup_letsGo();
break;
case kAction189872836:
@@ -1246,7 +1246,7 @@ IMPLEMENT_FUNCTION_END
IMPLEMENT_FUNCTION(27, Francois, chapter4Handler)
if (savepoint.action == kAction101107728) {
setCallback(1);
- setup_function16();
+ setup_letsGo();
}
IMPLEMENT_FUNCTION_END
@@ -1314,7 +1314,7 @@ bool Francois::timeCheckCallbackCompartment(TimeValue timeValue, uint &parameter
if (getState()->time > timeValue && !parameter) {
parameter = 1;
setCallback(callback);
- setup_function14(compartment, position, sequenceSuffix);
+ setup_chaseBeetle(compartment, position, sequenceSuffix);
return true;
}
@@ -1326,7 +1326,7 @@ bool Francois::timeCheckCallback(TimeValue timeValue, uint &parameter, byte call
if (getState()->time > timeValue && !parameter) {
parameter = 1;
setCallback(callback);
- setup_function11(timeValue2);
+ setup_rampage(timeValue2);
return true;
}
diff --git a/engines/lastexpress/entities/francois.h b/engines/lastexpress/entities/francois.h
index 51270fa4b6..a2ecee3e60 100644
--- a/engines/lastexpress/entities/francois.h
+++ b/engines/lastexpress/entities/francois.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -85,21 +85,21 @@ public:
DECLARE_FUNCTION_2(savegame, SavegameType savegameType, uint32 param)
/**
- * Updates the entity
+ * Walk
*
* @param car The car
* @param entityPosition The entity position
*/
- DECLARE_FUNCTION_2(updateEntity, CarIndex car, EntityPosition entityPosition)
+ DECLARE_FUNCTION_2(doWalk, CarIndex car, EntityPosition entityPosition)
- DECLARE_FUNCTION(function9)
- DECLARE_FUNCTION(function10)
- DECLARE_FUNCTION_1(function11, TimeValue timeValue)
- DECLARE_FUNCTION(function12)
- DECLARE_FUNCTION(function13)
- DECLARE_FUNCTION_3(function14, ObjectIndex compartment, EntityPosition entityPosition, const char *str)
- DECLARE_FUNCTION(function15)
- DECLARE_FUNCTION(function16)
+ DECLARE_FUNCTION(exitCompartment)
+ DECLARE_FUNCTION(enterCompartment)
+ DECLARE_FUNCTION_1(rampage, TimeValue timeValue)
+ DECLARE_FUNCTION(takeWalk)
+ DECLARE_FUNCTION(haremVisit)
+ DECLARE_FUNCTION_3(chaseBeetle, ObjectIndex compartment, EntityPosition entityPosition, const char *str)
+ DECLARE_FUNCTION(findCath)
+ DECLARE_FUNCTION(letsGo)
/**
* Setup Chapter 1
@@ -110,8 +110,7 @@ public:
* Handle Chapter 1 events
*/
DECLARE_FUNCTION(chapter1Handler)
-
- DECLARE_FUNCTION(function19)
+ DECLARE_FUNCTION(inCompartment)
DECLARE_FUNCTION(function20)
/**
@@ -122,9 +121,8 @@ public:
/**
* Handle Chapter 2 events
*/
- DECLARE_FUNCTION(chapter2Handler)
-
- DECLARE_FUNCTION(function23)
+ DECLARE_FUNCTION(atBreakfast)
+ DECLARE_FUNCTION(withMama)
/**
* Setup Chapter 3
@@ -155,7 +153,6 @@ public:
* Handle Chapter 5 events
*/
DECLARE_FUNCTION(chapter5Handler)
-
DECLARE_FUNCTION(function30)
DECLARE_NULL_FUNCTION()
diff --git a/engines/lastexpress/entities/gendarmes.cpp b/engines/lastexpress/entities/gendarmes.cpp
index a912fa4ecb..7b31c592cd 100644
--- a/engines/lastexpress/entities/gendarmes.cpp
+++ b/engines/lastexpress/entities/gendarmes.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -250,7 +250,7 @@ IMPLEMENT_FUNCTION_III(10, Gendarmes, function10, CarIndex, EntityPosition, Obje
if (!params->param5)
params->param5 = getState()->timeTicks + 75;
- if (!getEntities()->isOutsideAlexeiWindow() && getObjects()->get((ObjectIndex)params->param3).location != kObjectLocation1) {
+ if (!getEntities()->isOutsideAlexeiWindow() && getObjects()->get((ObjectIndex)params->param3).status != kObjectLocation1) {
setCallback(2);
setup_savegame(kSavegameTypeEvent, kEventGendarmesArrestation);
break;
@@ -284,7 +284,7 @@ IMPLEMENT_FUNCTION_III(10, Gendarmes, function10, CarIndex, EntityPosition, Obje
break;
case kActionKnock:
- getObjects()->update((ObjectIndex)params->param3, kEntityGendarmes, getObjects()->get((ObjectIndex)params->param3).location, kCursorNormal, kCursorNormal);
+ getObjects()->update((ObjectIndex)params->param3, kEntityGendarmes, getObjects()->get((ObjectIndex)params->param3).status, kCursorNormal, kCursorNormal);
setCallback(5);
setup_arrestPlaysound16("POL1046B");
@@ -296,7 +296,7 @@ IMPLEMENT_FUNCTION_III(10, Gendarmes, function10, CarIndex, EntityPosition, Obje
break;
case kActionDefault:
- getObjects()->update((ObjectIndex)params->param3, kEntityGendarmes, getObjects()->get((ObjectIndex)params->param3).location, kCursorNormal, kCursorNormal);
+ getObjects()->update((ObjectIndex)params->param3, kEntityGendarmes, getObjects()->get((ObjectIndex)params->param3).status, kCursorNormal, kCursorNormal);
setCallback(1);
setup_arrestPlaysound16("POL1046");
@@ -308,7 +308,7 @@ IMPLEMENT_FUNCTION_III(10, Gendarmes, function10, CarIndex, EntityPosition, Obje
break;
case 1:
- getObjects()->update((ObjectIndex)params->param3, kEntityGendarmes, getObjects()->get((ObjectIndex)params->param3).location, kCursorTalk, kCursorNormal);
+ getObjects()->update((ObjectIndex)params->param3, kEntityGendarmes, getObjects()->get((ObjectIndex)params->param3).status, kCursorTalk, kCursorNormal);
break;
case 2:
@@ -334,7 +334,7 @@ IMPLEMENT_FUNCTION_III(10, Gendarmes, function10, CarIndex, EntityPosition, Obje
break;
case 5:
- getObjects()->update((ObjectIndex)params->param3, kEntityGendarmes, getObjects()->get((ObjectIndex)params->param3).location, kCursorNormal, kCursorHand);
+ getObjects()->update((ObjectIndex)params->param3, kEntityGendarmes, getObjects()->get((ObjectIndex)params->param3).status, kCursorNormal, kCursorHand);
break;
case 6:
diff --git a/engines/lastexpress/entities/gendarmes.h b/engines/lastexpress/entities/gendarmes.h
index a761643531..8475c50799 100644
--- a/engines/lastexpress/entities/gendarmes.h
+++ b/engines/lastexpress/entities/gendarmes.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/lastexpress/entities/hadija.cpp b/engines/lastexpress/entities/hadija.cpp
index e9abcd888a..14d5b714ca 100644
--- a/engines/lastexpress/entities/hadija.cpp
+++ b/engines/lastexpress/entities/hadija.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/lastexpress/entities/hadija.h b/engines/lastexpress/entities/hadija.h
index 545f21ee03..8e92dc6891 100644
--- a/engines/lastexpress/entities/hadija.h
+++ b/engines/lastexpress/entities/hadija.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/lastexpress/entities/ivo.cpp b/engines/lastexpress/entities/ivo.cpp
index c53f4689fb..b7697d0c52 100644
--- a/engines/lastexpress/entities/ivo.cpp
+++ b/engines/lastexpress/entities/ivo.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/lastexpress/entities/ivo.h b/engines/lastexpress/entities/ivo.h
index 75814336e0..a23d06cd3f 100644
--- a/engines/lastexpress/entities/ivo.h
+++ b/engines/lastexpress/entities/ivo.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/lastexpress/entities/kahina.cpp b/engines/lastexpress/entities/kahina.cpp
index 467c8d8b3c..b7af87751f 100644
--- a/engines/lastexpress/entities/kahina.cpp
+++ b/engines/lastexpress/entities/kahina.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -503,16 +503,16 @@ IMPLEMENT_FUNCTION(15, Kahina, function15)
getData()->location = kLocationInsideCompartment;
getEntities()->clearSequences(kEntityKahina);
- getObjects()->update(kObjectCompartmentC, kEntityPlayer, getObjects()->get(kObjectCompartmentC).location, kCursorNormal, kCursorNormal);
- getObjects()->update(kObject50, kEntityPlayer, getObjects()->get(kObject50).location, kCursorNormal, kCursorNormal);
+ getObjects()->update(kObjectCompartmentC, kEntityPlayer, getObjects()->get(kObjectCompartmentC).status, kCursorNormal, kCursorNormal);
+ getObjects()->update(kObject50, kEntityPlayer, getObjects()->get(kObject50).status, kCursorNormal, kCursorNormal);
setCallback(13);
setup_updateFromTime(900);
break;
case 13:
- getObjects()->update(kObjectCompartmentC, kEntityPlayer, getObjects()->get(kObjectCompartmentC).location, kCursorHandKnock, kCursorHand);
- getObjects()->update(kObject50, kEntityPlayer, getObjects()->get(kObject50).location, kCursorHandKnock, kCursorHand);
+ getObjects()->update(kObjectCompartmentC, kEntityPlayer, getObjects()->get(kObjectCompartmentC).status, kCursorHandKnock, kCursorHand);
+ getObjects()->update(kObject50, kEntityPlayer, getObjects()->get(kObject50).status, kCursorHandKnock, kCursorHand);
setCallback(14);
setup_enterExitCompartment("616Bc", kObjectCompartmentC);
@@ -1088,16 +1088,16 @@ IMPLEMENT_FUNCTION(23, Kahina, function23)
getData()->location = kLocationInsideCompartment;
getEntities()->clearSequences(kEntityKahina);
- getObjects()->update(kObjectCompartmentF, kEntityPlayer, getObjects()->get(kObjectCompartmentF).location, kCursorNormal, kCursorNormal);
- getObjects()->update(kObject53, kEntityPlayer, getObjects()->get(kObject53).location, kCursorNormal, kCursorNormal);
+ getObjects()->update(kObjectCompartmentF, kEntityPlayer, getObjects()->get(kObjectCompartmentF).status, kCursorNormal, kCursorNormal);
+ getObjects()->update(kObject53, kEntityPlayer, getObjects()->get(kObject53).status, kCursorNormal, kCursorNormal);
setCallback(3);
setup_updateFromTime(900);
break;
case 3:
- getObjects()->update(kObjectCompartmentF, kEntityPlayer, getObjects()->get(kObjectCompartmentF).location, kCursorHandKnock, kCursorHand);
- getObjects()->update(kObject53, kEntityPlayer, getObjects()->get(kObject53).location, kCursorHandKnock, kCursorHand);
+ getObjects()->update(kObjectCompartmentF, kEntityPlayer, getObjects()->get(kObjectCompartmentF).status, kCursorHandKnock, kCursorHand);
+ getObjects()->update(kObject53, kEntityPlayer, getObjects()->get(kObject53).status, kCursorHandKnock, kCursorHand);
setCallback(4);
setup_enterExitCompartment("616Df", kObjectCompartmentF);
@@ -1436,16 +1436,16 @@ IMPLEMENT_FUNCTION(26, Kahina, function26)
getData()->location = kLocationInsideCompartment;
getEntities()->clearSequences(kEntityKahina);
- getObjects()->update(kObjectCompartmentA, kEntityPlayer, getObjects()->get(kObjectCompartmentA).location, kCursorNormal, kCursorNormal);
- getObjects()->update(kObject48, kEntityPlayer, getObjects()->get(kObject48).location, kCursorNormal, kCursorNormal);
+ getObjects()->update(kObjectCompartmentA, kEntityPlayer, getObjects()->get(kObjectCompartmentA).status, kCursorNormal, kCursorNormal);
+ getObjects()->update(kObject48, kEntityPlayer, getObjects()->get(kObject48).status, kCursorNormal, kCursorNormal);
setCallback(7);
setup_updateFromTime(900);
break;
case 7:
- getObjects()->update(kObjectCompartmentA, kEntityPlayer, getObjects()->get(kObjectCompartmentA).location, kCursorHandKnock, kCursorHand);
- getObjects()->update(kObject48, kEntityPlayer, getObjects()->get(kObject48).location, kCursorHandKnock, kCursorHand);
+ getObjects()->update(kObjectCompartmentA, kEntityPlayer, getObjects()->get(kObjectCompartmentA).status, kCursorHandKnock, kCursorHand);
+ getObjects()->update(kObject48, kEntityPlayer, getObjects()->get(kObject48).status, kCursorHandKnock, kCursorHand);
if (getInventory()->get(kItemFirebird)->location == kObjectLocation1 || getInventory()->get(kItemFirebird)->location == kObjectLocation2) {
getScenes()->loadSceneFromItemPosition(kItemFirebird);
diff --git a/engines/lastexpress/entities/kahina.h b/engines/lastexpress/entities/kahina.h
index 7479cf76f9..ee9ccf5c81 100644
--- a/engines/lastexpress/entities/kahina.h
+++ b/engines/lastexpress/entities/kahina.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/lastexpress/entities/kronos.cpp b/engines/lastexpress/entities/kronos.cpp
index 26ce3ca424..8bf158943b 100644
--- a/engines/lastexpress/entities/kronos.cpp
+++ b/engines/lastexpress/entities/kronos.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -399,7 +399,7 @@ IMPLEMENT_FUNCTION(18, Kronos, function18)
case kActionNone:
if (getState()->time > kTime2079000 && !params->param2) {
- getObjects()->updateLocation2(kObjectCompartmentKronos, kObjectLocation3);
+ getObjects()->updateModel(kObjectCompartmentKronos, kObjectModel3);
getObjects()->update(kObjectCompartmentKronos, kEntityPlayer, kObjectLocation3, kCursorHandKnock, kCursorHand);
params->param1 = 1;
params->param2 = 1;
@@ -462,7 +462,7 @@ IMPLEMENT_FUNCTION(19, Kronos, function19)
RESET_ENTITY_STATE(kEntityRebecca, Rebecca, setup_function39);
RESET_ENTITY_STATE(kEntitySophie, Sophie, setup_chaptersHandler);
RESET_ENTITY_STATE(kEntityAugust, August, setup_function50);
- RESET_ENTITY_STATE(kEntityAnna, Anna, setup_function56);
+ RESET_ENTITY_STATE(kEntityAnna, Anna, setup_concert);
RESET_ENTITY_STATE(kEntityTatiana, Tatiana, setup_function35);
setup_function20();
diff --git a/engines/lastexpress/entities/kronos.h b/engines/lastexpress/entities/kronos.h
index a7693fcd46..48da419a6e 100644
--- a/engines/lastexpress/entities/kronos.h
+++ b/engines/lastexpress/entities/kronos.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/lastexpress/entities/mahmud.cpp b/engines/lastexpress/entities/mahmud.cpp
index af86ef8cdd..08edda5276 100644
--- a/engines/lastexpress/entities/mahmud.cpp
+++ b/engines/lastexpress/entities/mahmud.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/lastexpress/entities/mahmud.h b/engines/lastexpress/entities/mahmud.h
index 685100f078..229e6d49d3 100644
--- a/engines/lastexpress/entities/mahmud.h
+++ b/engines/lastexpress/entities/mahmud.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/lastexpress/entities/max.cpp b/engines/lastexpress/entities/max.cpp
index abd2aae9e4..1056e7fd7a 100644
--- a/engines/lastexpress/entities/max.cpp
+++ b/engines/lastexpress/entities/max.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/lastexpress/entities/max.h b/engines/lastexpress/entities/max.h
index acd8235e89..7b7780742b 100644
--- a/engines/lastexpress/entities/max.h
+++ b/engines/lastexpress/entities/max.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/lastexpress/entities/mertens.cpp b/engines/lastexpress/entities/mertens.cpp
index 97dd293793..4bd276b7eb 100644
--- a/engines/lastexpress/entities/mertens.cpp
+++ b/engines/lastexpress/entities/mertens.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -1067,7 +1067,7 @@ IMPLEMENT_FUNCTION_II(21, Mertens, function21, ObjectIndex, ObjectIndex)
break;
// Update objects
- getObjects()->updateLocation2((ObjectIndex)params->param1, kObjectLocation1);
+ getObjects()->updateModel((ObjectIndex)params->param1, kObjectModel1);
if (params->param5 != kObjectLocation2)
getObjects()->update((ObjectIndex)params->param1, (EntityIndex)params->param4, (ObjectLocation)params->param5, (CursorStyle)params->param6, (CursorStyle)params->param7);
@@ -1090,15 +1090,15 @@ IMPLEMENT_FUNCTION_II(21, Mertens, function21, ObjectIndex, ObjectIndex)
case kActionDefault:
params->param3 = 1;
params->param4 = getObjects()->get((ObjectIndex)params->param1).entity;
- params->param5 = getObjects()->get((ObjectIndex)params->param1).location;
- params->param6 = getObjects()->get((ObjectIndex)params->param1).cursor;
- params->param7 = getObjects()->get((ObjectIndex)params->param1).cursor2;
+ params->param5 = getObjects()->get((ObjectIndex)params->param1).status;
+ params->param6 = getObjects()->get((ObjectIndex)params->param1).windowCursor;
+ params->param7 = getObjects()->get((ObjectIndex)params->param1).handleCursor;
if (params->param2) {
- params->param8 = getObjects()->get((ObjectIndex)params->param2).entity;
- CURRENT_PARAM(1, 1) = getObjects()->get((ObjectIndex)params->param2).location;
- CURRENT_PARAM(1, 2) = getObjects()->get((ObjectIndex)params->param2).cursor;
- CURRENT_PARAM(1, 3) = getObjects()->get((ObjectIndex)params->param2).cursor2;
+ params->param8 = getObjects()->get((ObjectIndex)params->param2).entity;
+ CURRENT_PARAM(1, 1) = getObjects()->get((ObjectIndex)params->param2).status;
+ CURRENT_PARAM(1, 2) = getObjects()->get((ObjectIndex)params->param2).windowCursor;
+ CURRENT_PARAM(1, 3) = getObjects()->get((ObjectIndex)params->param2).handleCursor;
getObjects()->update((ObjectIndex)params->param2, kEntityMertens, kObjectLocation1, kCursorHandKnock, kCursorHand);
}
@@ -1506,7 +1506,7 @@ IMPLEMENT_FUNCTION_I(26, Mertens, function26, bool)
getData()->location = kLocationInsideCompartment;
getEntities()->clearSequences(kEntityMertens);
- getObjects()->update(kObjectCompartment1, kEntityPlayer, getObjects()->get(kObjectCompartment1).location, kCursorNormal, kCursorNormal);
+ getObjects()->update(kObjectCompartment1, kEntityPlayer, getObjects()->get(kObjectCompartment1).status, kCursorNormal, kCursorNormal);
setCallback(3);
setup_playSound16("ZNU1001");
@@ -1522,14 +1522,14 @@ IMPLEMENT_FUNCTION_I(26, Mertens, function26, bool)
break;
case 1:
- getObjects()->update(kObjectCompartment1, kEntityPlayer, getObjects()->get(kObjectCompartment1).location, kCursorNormal, kCursorNormal);
+ getObjects()->update(kObjectCompartment1, kEntityPlayer, getObjects()->get(kObjectCompartment1).status, kCursorNormal, kCursorNormal);
setCallback(2);
setup_playSound16("CON1062");
break;
case 2:
- getObjects()->update(kObjectCompartment1, kEntityPlayer, getObjects()->get(kObjectCompartment1).location, kCursorHandKnock, kCursorHand);
+ getObjects()->update(kObjectCompartment1, kEntityPlayer, getObjects()->get(kObjectCompartment1).status, kCursorHandKnock, kCursorHand);
callbackAction();
break;
@@ -1617,7 +1617,7 @@ IMPLEMENT_FUNCTION_I(27, Mertens, tylerCompartment, MertensActionType)
}
if (Entity::updateParameter(params->param2, getState()->timeTicks, 150)) {
- getObjects()->update(kObjectCompartment1, kEntityPlayer, getObjects()->get(kObjectCompartment1).location, kCursorNormal, kCursorNormal);
+ getObjects()->update(kObjectCompartment1, kEntityPlayer, getObjects()->get(kObjectCompartment1).status, kCursorNormal, kCursorNormal);
setCallback(10);
setup_playSound16("CON1018A");
@@ -1683,7 +1683,7 @@ label_callback11:
} else {
params->param3 = kTimeInvalid;
- if (getObjects()->get(kObjectCompartment1).location == kObjectLocation1) {
+ if (getObjects()->get(kObjectCompartment1).status == kObjectLocation1) {
getObjects()->update(kObjectCompartment1, kEntityPlayer, kObjectLocation1, kCursorNormal, kCursorNormal);
setCallback(11);
@@ -1742,11 +1742,11 @@ label_callback11:
case kActionKnock:
if (params->param1) {
- getObjects()->update(kObjectCompartment1, kEntityMertens, getObjects()->get(kObjectCompartment1).location, kCursorNormal, kCursorNormal);
+ getObjects()->update(kObjectCompartment1, kEntityMertens, getObjects()->get(kObjectCompartment1).status, kCursorNormal, kCursorNormal);
switch (params->param1) {
default:
- getObjects()->update(kObjectCompartment1, kEntityPlayer, getObjects()->get(kObjectCompartment1).location, kCursorHandKnock, kCursorHand);
+ getObjects()->update(kObjectCompartment1, kEntityPlayer, getObjects()->get(kObjectCompartment1).status, kCursorHandKnock, kCursorHand);
callbackAction();
break;
@@ -1774,7 +1774,7 @@ label_callback11:
break;
case kActionOpenDoor:
- getSound()->playSound(kEntityPlayer, getObjects()->get(kObjectCompartment1).location == kObjectLocation1 ? "LIB012" : "LIB014");
+ getSound()->playSound(kEntityPlayer, getObjects()->get(kObjectCompartment1).status == kObjectLocation1 ? "LIB012" : "LIB014");
if (getProgress().eventCorpseMovedFromFloor) {
@@ -1828,7 +1828,7 @@ label_callback11:
if (getEntities()->isInsideCompartment(kEntityPlayer, kCarGreenSleeping, kPosition_8200)
|| getEntities()->isInsideCompartment(kEntityPlayer, kCarGreenSleeping, kPosition_7850)
|| getEntities()->isOutsideAlexeiWindow()) {
- getObjects()->update(kObjectCompartment1, kEntityPlayer, getObjects()->get(kObjectCompartment1).location, kCursorNormal, kCursorNormal);
+ getObjects()->update(kObjectCompartment1, kEntityPlayer, getObjects()->get(kObjectCompartment1).status, kCursorNormal, kCursorNormal);
if (getEntities()->isOutsideAlexeiWindow())
getScenes()->loadSceneFromPosition(kCarGreenSleeping, 49);
@@ -1920,15 +1920,15 @@ label_callback11:
case 8:
case 9:
- getObjects()->update(kObjectCompartment1, kEntityMertens, getObjects()->get(kObjectCompartment1).location, kCursorTalk, kCursorHand);
+ getObjects()->update(kObjectCompartment1, kEntityMertens, getObjects()->get(kObjectCompartment1).status, kCursorTalk, kCursorHand);
break;
case 10:
- getObjects()->update(kObjectCompartment1, kEntityMertens, getObjects()->get(kObjectCompartment1).location, kCursorTalk, kCursorHand);
+ getObjects()->update(kObjectCompartment1, kEntityMertens, getObjects()->get(kObjectCompartment1).status, kCursorTalk, kCursorHand);
goto label_callback10;
case 11:
- getObjects()->update(kObjectCompartment1, kEntityMertens, getObjects()->get(kObjectCompartment1).location, kCursorTalk, kCursorHand);
+ getObjects()->update(kObjectCompartment1, kEntityMertens, getObjects()->get(kObjectCompartment1).status, kCursorTalk, kCursorHand);
goto label_callback11;
case 13:
@@ -1971,20 +1971,20 @@ label_callback11:
case 23:
getProgress().eventMertensAugustWaiting = true;
- getObjects()->update(kObjectCompartment1, kEntityPlayer, getObjects()->get(kObjectCompartment1).location, kCursorHandKnock, kCursorHand);
+ getObjects()->update(kObjectCompartment1, kEntityPlayer, getObjects()->get(kObjectCompartment1).status, kCursorHandKnock, kCursorHand);
callbackAction();
break;
case 24:
getProgress().eventMertensKronosInvitation = true;
- getObjects()->update(kObjectCompartment1, kEntityPlayer, getObjects()->get(kObjectCompartment1).location, kCursorHandKnock, kCursorHand);
+ getObjects()->update(kObjectCompartment1, kEntityPlayer, getObjects()->get(kObjectCompartment1).status, kCursorHandKnock, kCursorHand);
callbackAction();
break;
case 25:
- getObjects()->update(kObjectCompartment1, kEntityPlayer, getObjects()->get(kObjectCompartment1).location, kCursorHandKnock, kCursorHand);
+ getObjects()->update(kObjectCompartment1, kEntityPlayer, getObjects()->get(kObjectCompartment1).status, kCursorHandKnock, kCursorHand);
callbackAction();
break;
@@ -2182,7 +2182,7 @@ IMPLEMENT_FUNCTION_I(30, Mertens, function30, MertensActionType)
case 2:
if (getEntities()->isInsideCompartment(kEntityPlayer, kCarGreenSleeping, kPosition_7500)) {
- getObjects()->update(kObjectCompartment2, kEntityPlayer, getObjects()->get(kObjectCompartment2).location, kCursorNormal, kCursorNormal);
+ getObjects()->update(kObjectCompartment2, kEntityPlayer, getObjects()->get(kObjectCompartment2).status, kCursorNormal, kCursorNormal);
params->param3 = 1;
}
@@ -2192,7 +2192,7 @@ IMPLEMENT_FUNCTION_I(30, Mertens, function30, MertensActionType)
case 3:
if (getEntities()->isInsideCompartment(kEntityPlayer, kCarGreenSleeping, kPosition_6470)) {
- getObjects()->update(kObjectCompartment3, kEntityPlayer, getObjects()->get(kObjectCompartment3).location, kCursorNormal, kCursorNormal);
+ getObjects()->update(kObjectCompartment3, kEntityPlayer, getObjects()->get(kObjectCompartment3).status, kCursorNormal, kCursorNormal);
params->param3 = 1;
}
@@ -2220,7 +2220,7 @@ IMPLEMENT_FUNCTION_I(30, Mertens, function30, MertensActionType)
case 5:
if (params->param3)
- getObjects()->update(kObjectCompartment2, kEntityPlayer, getObjects()->get(kObjectCompartment2).location, kCursorHandKnock, kCursorHand);
+ getObjects()->update(kObjectCompartment2, kEntityPlayer, getObjects()->get(kObjectCompartment2).status, kCursorHandKnock, kCursorHand);
getEntities()->exitCompartment(kEntityMertens, kObjectCompartment2);
@@ -2241,7 +2241,7 @@ IMPLEMENT_FUNCTION_I(30, Mertens, function30, MertensActionType)
case 7:
if (params->param3)
- getObjects()->update(kObjectCompartment3, kEntityPlayer, getObjects()->get(kObjectCompartment3).location, kCursorHandKnock, kCursorHand);
+ getObjects()->update(kObjectCompartment3, kEntityPlayer, getObjects()->get(kObjectCompartment3).status, kCursorHandKnock, kCursorHand);
getEntities()->exitCompartment(kEntityMertens, kObjectCompartment3);
@@ -3688,9 +3688,9 @@ IMPLEMENT_FUNCTION(48, Mertens, function48)
if (ENTITY_PARAM(2, 3)) {
params->param1 = 1;
- getObjects()->updateLocation2(kObjectCompartment2, kObjectLocation1);
- getObjects()->updateLocation2(kObjectCompartment3, kObjectLocation1);
- getObjects()->updateLocation2(kObjectCompartment4, kObjectLocation1);
+ getObjects()->updateModel(kObjectCompartment2, kObjectModel1);
+ getObjects()->updateModel(kObjectCompartment3, kObjectModel1);
+ getObjects()->updateModel(kObjectCompartment4, kObjectModel1);
ENTITY_PARAM(1, 4) = 0;
ENTITY_PARAM(1, 5) = 0;
diff --git a/engines/lastexpress/entities/mertens.h b/engines/lastexpress/entities/mertens.h
index 4cc58fd4ba..1b6d1d2f31 100644
--- a/engines/lastexpress/entities/mertens.h
+++ b/engines/lastexpress/entities/mertens.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/lastexpress/entities/milos.cpp b/engines/lastexpress/entities/milos.cpp
index 519a613497..601187b672 100644
--- a/engines/lastexpress/entities/milos.cpp
+++ b/engines/lastexpress/entities/milos.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -433,16 +433,16 @@ IMPLEMENT_FUNCTION(14, Milos, function14)
if (CURRENT_PARAM(1, 1) < getState()->timeTicks) {
- if (getObjects()->get(kObjectCompartment1).location == kObjectLocation1) {
+ if (getObjects()->get(kObjectCompartment1).status == kObjectLocation1) {
if (!Entity::updateParameter(CURRENT_PARAM(1, 2), getState()->timeTicks, 75))
break;
- getObjects()->update(kObjectCompartment1, kEntityMilos, getObjects()->get(kObjectCompartment1).location, kCursorNormal, kCursorNormal);
+ getObjects()->update(kObjectCompartment1, kEntityMilos, getObjects()->get(kObjectCompartment1).status, kCursorNormal, kCursorNormal);
++params->param5;
switch (params->param5) {
default:
- getObjects()->update(kObjectCompartment1, kEntityMilos, getObjects()->get(kObjectCompartment1).location, params->param3 < 1 ? kCursorTalk : kCursorNormal, kCursorHand);
+ getObjects()->update(kObjectCompartment1, kEntityMilos, getObjects()->get(kObjectCompartment1).status, params->param3 < 1 ? kCursorTalk : kCursorNormal, kCursorHand);
CURRENT_PARAM(1, 2) = 0;
break;
@@ -466,19 +466,19 @@ IMPLEMENT_FUNCTION(14, Milos, function14)
if (params->param7 < 3) {
params->param5 = 1;
- getObjects()->update(kObjectCompartment1, kEntityMilos, getObjects()->get(kObjectCompartment1).location, params->param3 < 1 ? kCursorTalk : kCursorNormal, kCursorHand);
+ getObjects()->update(kObjectCompartment1, kEntityMilos, getObjects()->get(kObjectCompartment1).status, params->param3 < 1 ? kCursorTalk : kCursorNormal, kCursorHand);
CURRENT_PARAM(1, 2) = 0;
break;
}
- getObjects()->update(kObjectCompartment1, kEntityPlayer, getObjects()->get(kObjectCompartment1).location, kCursorHandKnock, kCursorHand);
+ getObjects()->update(kObjectCompartment1, kEntityPlayer, getObjects()->get(kObjectCompartment1).status, kCursorHandKnock, kCursorHand);
callbackAction();
break;
}
} else {
if (getProgress().eventCorpseMovedFromFloor && getProgress().jacket != kJacketBlood) {
- params->param6 = (getObjects()->get(kObjectCompartment1).location2 == kObjectLocation1) ? kEventMilosTylerCompartmentBedVisit : kEventMilosTylerCompartmentVisit;
+ params->param6 = (getObjects()->get(kObjectCompartment1).model == kObjectModel1) ? kEventMilosTylerCompartmentBedVisit : kEventMilosTylerCompartmentVisit;
setCallback(3);
setup_savegame(kSavegameTypeEvent, kEventMilosTylerCompartmentVisit);
@@ -538,7 +538,7 @@ label_callback_12:
setCallback(20);
setup_playSound("LIB012");
} else if (!params->param3) {
- getObjects()->update(kObjectCompartment1, kEntityMilos, getObjects()->get(kObjectCompartment1).location, kCursorNormal, kCursorNormal);
+ getObjects()->update(kObjectCompartment1, kEntityMilos, getObjects()->get(kObjectCompartment1).status, kCursorNormal, kCursorNormal);
setCallback(22);
setup_playSound16("MIL1032");
@@ -549,9 +549,9 @@ label_callback_12:
if (getProgress().eventCorpseMovedFromFloor && getProgress().jacket != kJacketBlood) {
if (params->param2) {
getEntityData(kEntityPlayer)->location = kLocationInsideCompartment;
- params->param6 = (getObjects()->get(kObjectCompartment1).location2 == kObjectLocation1) ? kEventMilosTylerCompartmentBed : kEventMilosTylerCompartment;
+ params->param6 = (getObjects()->get(kObjectCompartment1).model == kObjectModel1) ? kEventMilosTylerCompartmentBed : kEventMilosTylerCompartment;
} else {
- params->param6 = (getObjects()->get(kObjectCompartment1).location2 == kObjectLocation1) ? kEventMilosTylerCompartmentBedVisit : kEventMilosTylerCompartmentVisit;
+ params->param6 = (getObjects()->get(kObjectCompartment1).model == kObjectModel1) ? kEventMilosTylerCompartmentBedVisit : kEventMilosTylerCompartmentVisit;
}
setCallback(17);
@@ -568,14 +568,14 @@ label_callback_12:
if (getEntities()->isInsideCompartment(kEntityPlayer, kCarGreenSleeping, kPosition_8200)
|| getEntities()->isInsideCompartment(kEntityPlayer, kCarGreenSleeping, kPosition_7850)
|| getEntities()->isOutsideAlexeiWindow()) {
- getObjects()->update(kObjectCompartment1, kEntityMilos, getObjects()->get(kObjectCompartment1).location, kCursorNormal, kCursorNormal);
+ getObjects()->update(kObjectCompartment1, kEntityMilos, getObjects()->get(kObjectCompartment1).status, kCursorNormal, kCursorNormal);
if (getEntities()->isOutsideAlexeiWindow())
getScenes()->loadSceneFromPosition(kCarGreenSleeping, 49);
getSound()->playSound(kEntityPlayer, "LIB012");
- getObjects()->update(kObjectCompartment1, kEntityMilos, getObjects()->get(kObjectCompartment1).location, kCursorTalk, kCursorHand);
+ getObjects()->update(kObjectCompartment1, kEntityMilos, getObjects()->get(kObjectCompartment1).status, kCursorTalk, kCursorHand);
params->param1 = 1;
} else {
@@ -644,7 +644,7 @@ label_callback_12:
case 7:
case 9:
case 11:
- getObjects()->update(kObjectCompartment1, kEntityMilos, getObjects()->get(kObjectCompartment1).location, params->param3 < 1 ? kCursorTalk : kCursorNormal, kCursorHand);
+ getObjects()->update(kObjectCompartment1, kEntityMilos, getObjects()->get(kObjectCompartment1).status, params->param3 < 1 ? kCursorTalk : kCursorNormal, kCursorHand);
CURRENT_PARAM(1, 2) = 0;
break;
@@ -682,13 +682,13 @@ label_callback_12:
break;
case 16:
- getSound()->playSound(kEntityPlayer, getObjects()->get(kObjectCompartment1).location == kObjectLocation1 ? "LIB032" : "LIB014");
+ getSound()->playSound(kEntityPlayer, getObjects()->get(kObjectCompartment1).status == kObjectLocation1 ? "LIB032" : "LIB014");
getAction()->playAnimation(kEventMilosCorpseFloor);
getLogic()->gameOver(kSavegameTypeIndex, 1, getProgress().eventCorpseMovedFromFloor ? kSceneGameOverBloodJacket : kSceneGameOverPolice1, true);
break;
case 17:
- getSound()->playSound(kEntityPlayer, getObjects()->get(kObjectCompartment1).location == kObjectLocation1 ? "LIB032" : "LIB014");
+ getSound()->playSound(kEntityPlayer, getObjects()->get(kObjectCompartment1).status == kObjectLocation1 ? "LIB032" : "LIB014");
getObjects()->update(kObjectCompartment1, kEntityPlayer, kObjectLocationNone, kCursorHandKnock, kCursorHand);
getObjects()->update(kObjectOutsideTylerCompartment, kEntityPlayer, kObjectLocationNone, kCursorKeepValue, kCursorKeepValue);
getAction()->playAnimation((EventIndex)params->param6);
@@ -708,7 +708,7 @@ label_callback_12:
case 22:
params->param3 = 1;
- getObjects()->update(kObjectCompartment1, kEntityMilos, getObjects()->get(kObjectCompartment1).location, kCursorNormal, kCursorHand);
+ getObjects()->update(kObjectCompartment1, kEntityMilos, getObjects()->get(kObjectCompartment1).status, kCursorNormal, kCursorHand);
break;
}
break;
diff --git a/engines/lastexpress/entities/milos.h b/engines/lastexpress/entities/milos.h
index e8f95dc5ff..b7b716c4e7 100644
--- a/engines/lastexpress/entities/milos.h
+++ b/engines/lastexpress/entities/milos.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/lastexpress/entities/mmeboutarel.cpp b/engines/lastexpress/entities/mmeboutarel.cpp
index 950644cb8f..f00fb7a9cb 100644
--- a/engines/lastexpress/entities/mmeboutarel.cpp
+++ b/engines/lastexpress/entities/mmeboutarel.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/lastexpress/entities/mmeboutarel.h b/engines/lastexpress/entities/mmeboutarel.h
index 0f6e6349fe..11d74b00f9 100644
--- a/engines/lastexpress/entities/mmeboutarel.h
+++ b/engines/lastexpress/entities/mmeboutarel.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/lastexpress/entities/pascale.cpp b/engines/lastexpress/entities/pascale.cpp
index 6e9f992390..b6356a0acb 100644
--- a/engines/lastexpress/entities/pascale.cpp
+++ b/engines/lastexpress/entities/pascale.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/lastexpress/entities/pascale.h b/engines/lastexpress/entities/pascale.h
index eaf0f3ba0c..1b7777dec9 100644
--- a/engines/lastexpress/entities/pascale.h
+++ b/engines/lastexpress/entities/pascale.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/lastexpress/entities/rebecca.cpp b/engines/lastexpress/entities/rebecca.cpp
index 5bcb6aef85..05211663bd 100644
--- a/engines/lastexpress/entities/rebecca.cpp
+++ b/engines/lastexpress/entities/rebecca.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -665,7 +665,7 @@ IMPLEMENT_FUNCTION(21, Rebecca, chapter1)
getObjects()->update(kObject52, kEntityPlayer, kObjectLocationNone, kCursorHandKnock, kCursorHand);
getObjects()->update(kObjectOutsideBetweenCompartments, kEntityPlayer, kObjectLocationNone, kCursorKeepValue, kCursorKeepValue);
- getObjects()->updateLocation2(kObject110, kObjectLocation1);
+ getObjects()->updateModel(kObject110, kObjectModel1);
getData()->entityPosition = kPosition_2830;
getData()->location = kLocationInsideCompartment;
@@ -1051,7 +1051,7 @@ IMPLEMENT_FUNCTION(28, Rebecca, chapter2)
getObjects()->update(kObjectCompartmentE, kEntityPlayer, kObjectLocation1, kCursorHandKnock, kCursorHand);
getObjects()->update(kObject52, kEntityPlayer, kObjectLocation1, kCursorHandKnock, kCursorHand);
- getObjects()->updateLocation2(kObject110, kObjectLocation2);
+ getObjects()->updateModel(kObject110, kObjectModel2);
ENTITY_PARAM(0, 2) = 1;
break;
@@ -1574,7 +1574,7 @@ IMPLEMENT_FUNCTION(42, Rebecca, chapter4)
getData()->clothes = kClothesDefault;
getData()->inventoryItem = kItemNone;
- getObjects()->updateLocation2(kObject110, kObjectLocation3);
+ getObjects()->updateModel(kObject110, kObjectModel3);
ENTITY_PARAM(0, 1) = 0;
ENTITY_PARAM(0, 2) = 1;
@@ -1750,7 +1750,7 @@ IMPLEMENT_FUNCTION(46, Rebecca, chapter5)
getData()->car = kCarRestaurant;
getData()->inventoryItem = kItemNone;
- getObjects()->updateLocation2(kObject110, kObjectLocation4);
+ getObjects()->updateModel(kObject110, kObjectModel4);
break;
}
IMPLEMENT_FUNCTION_END
diff --git a/engines/lastexpress/entities/rebecca.h b/engines/lastexpress/entities/rebecca.h
index 885632f884..88a14e65d2 100644
--- a/engines/lastexpress/entities/rebecca.h
+++ b/engines/lastexpress/entities/rebecca.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/lastexpress/entities/salko.cpp b/engines/lastexpress/entities/salko.cpp
index e8b4b4247b..26f512b900 100644
--- a/engines/lastexpress/entities/salko.cpp
+++ b/engines/lastexpress/entities/salko.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/lastexpress/entities/salko.h b/engines/lastexpress/entities/salko.h
index 6ca73e39f6..0b672b9dba 100644
--- a/engines/lastexpress/entities/salko.h
+++ b/engines/lastexpress/entities/salko.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/lastexpress/entities/servers0.cpp b/engines/lastexpress/entities/servers0.cpp
index 73e0d34722..590efa7157 100644
--- a/engines/lastexpress/entities/servers0.cpp
+++ b/engines/lastexpress/entities/servers0.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -115,7 +115,7 @@ IMPLEMENT_FUNCTION_NOSETUP(5, Servers0, callbackActionOnDirection)
case kActionExitCompartment:
callbackAction();
- break;
+ break;
case kActionExcuseMeCath:
if (!params->param1) {
@@ -445,7 +445,7 @@ IMPLEMENT_FUNCTION(24, Servers0, chapter2Handler)
HANDLE_TABLE(1, 3, 1, setup_function25);
HANDLE_TABLE(1, 4, 2, setup_function26);
- break;
+ break;
case kActionCallback:
if (getCallback() == 1)
diff --git a/engines/lastexpress/entities/servers0.h b/engines/lastexpress/entities/servers0.h
index 4c35637d65..70f06596b0 100644
--- a/engines/lastexpress/entities/servers0.h
+++ b/engines/lastexpress/entities/servers0.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/lastexpress/entities/servers1.cpp b/engines/lastexpress/entities/servers1.cpp
index a8f4c0233c..153c2b66da 100644
--- a/engines/lastexpress/entities/servers1.cpp
+++ b/engines/lastexpress/entities/servers1.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/lastexpress/entities/servers1.h b/engines/lastexpress/entities/servers1.h
index c8f667ec5c..58566cd4d3 100644
--- a/engines/lastexpress/entities/servers1.h
+++ b/engines/lastexpress/entities/servers1.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/lastexpress/entities/sophie.cpp b/engines/lastexpress/entities/sophie.cpp
index 170090005f..ac4732556d 100644
--- a/engines/lastexpress/entities/sophie.cpp
+++ b/engines/lastexpress/entities/sophie.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/lastexpress/entities/sophie.h b/engines/lastexpress/entities/sophie.h
index 188788bb9b..5589caf0f3 100644
--- a/engines/lastexpress/entities/sophie.h
+++ b/engines/lastexpress/entities/sophie.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/lastexpress/entities/tables.cpp b/engines/lastexpress/entities/tables.cpp
index 4f8d2b954d..8701c012e4 100644
--- a/engines/lastexpress/entities/tables.cpp
+++ b/engines/lastexpress/entities/tables.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/lastexpress/entities/tables.h b/engines/lastexpress/entities/tables.h
index c213aac978..2e93eb7ca5 100644
--- a/engines/lastexpress/entities/tables.h
+++ b/engines/lastexpress/entities/tables.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/lastexpress/entities/tatiana.cpp b/engines/lastexpress/entities/tatiana.cpp
index 432def6253..c6788fd4b2 100644
--- a/engines/lastexpress/entities/tatiana.cpp
+++ b/engines/lastexpress/entities/tatiana.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -835,7 +835,7 @@ IMPLEMENT_FUNCTION(27, Tatiana, function27)
break;
case 1:
- RESET_ENTITY_STATE(kEntityAlexei, Alexei, setup_function30);
+ RESET_ENTITY_STATE(kEntityAlexei, Alexei, setup_atBreakfast);
getAction()->playAnimation(kEventTatianaBreakfastAlexei);
getInventory()->addItem(kItemParchemin);
getInventory()->setLocationAndProcess(kItem11, kObjectLocation1);
@@ -843,7 +843,7 @@ IMPLEMENT_FUNCTION(27, Tatiana, function27)
break;
case 2:
- RESET_ENTITY_STATE(kEntityAlexei, Alexei, setup_function30);
+ RESET_ENTITY_STATE(kEntityAlexei, Alexei, setup_atBreakfast);
getAction()->playAnimation(kEventTatianaBreakfast);
if (getInventory()->hasItem(kItemParchemin)) {
getAction()->playAnimation(kEventTatianaBreakfastGivePoem);
@@ -1917,7 +1917,7 @@ IMPLEMENT_FUNCTION(47, Tatiana, function47)
case 3:
case 4:
- if (ENTITY_PARAM(0, 1) && getObjects()->get(kObjectCompartment1).location2 == kObjectLocation1) {
+ if (ENTITY_PARAM(0, 1) && getObjects()->get(kObjectCompartment1).model == kObjectModel1) {
setup_function48();
} else {
setCallback(4);
@@ -1940,7 +1940,7 @@ IMPLEMENT_FUNCTION(48, Tatiana, function48)
if (!getEvent(kEventTatianaTylerCompartment) && getEntities()->isInsideCompartment(kEntityPlayer, kCarGreenSleeping, kPosition_8200)) {
params->param1 = 1;
getProgress().field_E4 = 1;
- getObjects()->update(kObjectCompartment1, kEntityTatiana, getObjects()->get(kObjectCompartment1).location, kCursorNormal, kCursorHand);
+ getObjects()->update(kObjectCompartment1, kEntityTatiana, getObjects()->get(kObjectCompartment1).status, kCursorNormal, kCursorHand);
}
if (!params->param1)
@@ -1948,7 +1948,7 @@ IMPLEMENT_FUNCTION(48, Tatiana, function48)
}
if (!getEntities()->checkFields19(kEntityPlayer, kCarGreenSleeping, kPosition_7850)) {
- getObjects()->update(kObjectCompartment1, kEntityPlayer, getObjects()->get(kObjectCompartment1).location, kCursorHandKnock, kCursorHand);
+ getObjects()->update(kObjectCompartment1, kEntityPlayer, getObjects()->get(kObjectCompartment1).status, kCursorHandKnock, kCursorHand);
params->param1 = 0;
}
@@ -1964,7 +1964,7 @@ IMPLEMENT_FUNCTION(48, Tatiana, function48)
label_end:
if (getEvent(kEventTatianaTylerCompartment) || getState()->time > kTime2475000) {
if (params->param1)
- getObjects()->update(kObjectCompartment1, kEntityPlayer, getObjects()->get(kObjectCompartment1).location, kCursorHandKnock, kCursorHand);
+ getObjects()->update(kObjectCompartment1, kEntityPlayer, getObjects()->get(kObjectCompartment1).status, kCursorHandKnock, kCursorHand);
getProgress().field_E4 = 0;
getEntities()->exitCompartment(kEntityTatiana, kObjectCompartment2, true);
@@ -2040,7 +2040,7 @@ label_end:
case kAction238790488:
params->param1 = 0;
- getObjects()->update(kObjectCompartment1, kEntityPlayer, getObjects()->get(kObjectCompartment1).location, kCursorHandKnock, kCursorHand);
+ getObjects()->update(kObjectCompartment1, kEntityPlayer, getObjects()->get(kObjectCompartment1).status, kCursorHandKnock, kCursorHand);
getEntities()->exitCompartment(kEntityTatiana, kObjectCompartment2, true);
getEntities()->clearSequences(kEntityTatiana);
diff --git a/engines/lastexpress/entities/tatiana.h b/engines/lastexpress/entities/tatiana.h
index 8ec69db5e9..ca2b800110 100644
--- a/engines/lastexpress/entities/tatiana.h
+++ b/engines/lastexpress/entities/tatiana.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/lastexpress/entities/train.cpp b/engines/lastexpress/entities/train.cpp
index e3f530ef25..f707b02ccf 100644
--- a/engines/lastexpress/entities/train.cpp
+++ b/engines/lastexpress/entities/train.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/lastexpress/entities/train.h b/engines/lastexpress/entities/train.h
index 4b8bc10c1a..1d94cba8f9 100644
--- a/engines/lastexpress/entities/train.h
+++ b/engines/lastexpress/entities/train.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/lastexpress/entities/vassili.cpp b/engines/lastexpress/entities/vassili.cpp
index 4695f8831f..2faaa30b6f 100644
--- a/engines/lastexpress/entities/vassili.cpp
+++ b/engines/lastexpress/entities/vassili.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -112,7 +112,7 @@ IMPLEMENT_FUNCTION(5, Vassili, chapter1Handler)
break;
}
- if (!params->param2 && getObjects()->get(kObjectCompartmentA).location == kObjectLocation1) {
+ if (!params->param2 && getObjects()->get(kObjectCompartmentA).status == kObjectLocation1) {
params->param2 = 1;
getEntities()->drawSequenceLeft(kEntityVassili, "303A");
getObjects()->update(kObjectCompartmentA, kEntityPlayer, kObjectLocationNone, kCursorHandKnock, kCursorHand);
@@ -289,7 +289,7 @@ IMPLEMENT_FUNCTION(9, Vassili, function9)
case kActionDefault:
case kActionDrawScene:
- if ((getObjects()->get(kObjectCompartmentA).location == kObjectLocation2 && getEntities()->isPlayerPosition(kCarRedSleeping, 17))
+ if ((getObjects()->get(kObjectCompartmentA).status == kObjectLocation2 && getEntities()->isPlayerPosition(kCarRedSleeping, 17))
|| getEntities()->isPlayerPosition(kCarRedSleeping, 18)
|| getEntities()->isPlayerPosition(kCarRedSleeping, 37)
|| getEntities()->isPlayerPosition(kCarRedSleeping, 38)
@@ -388,7 +388,7 @@ IMPLEMENT_FUNCTION(12, Vassili, chapter2)
getData()->inventoryItem = kItemNone;
getObjects()->update(kObjectCompartmentA, kEntityPlayer, kObjectLocationNone, kCursorHandKnock, kCursorHand);
- getObjects()->updateLocation2(kObjectCompartmentA, kObjectLocation1);
+ getObjects()->updateModel(kObjectCompartmentA, kObjectModel1);
break;
}
IMPLEMENT_FUNCTION_END
@@ -532,7 +532,7 @@ IMPLEMENT_FUNCTION(16, Vassili, chapter4)
getData()->inventoryItem = kItemNone;
getObjects()->update(kObjectCompartmentA, kEntityPlayer, kObjectLocationNone, kCursorHandKnock, kCursorHand);
- getObjects()->updateLocation2(kObjectCompartmentA, kObjectLocation1);
+ getObjects()->updateModel(kObjectCompartmentA, kObjectModel1);
break;
}
IMPLEMENT_FUNCTION_END
diff --git a/engines/lastexpress/entities/vassili.h b/engines/lastexpress/entities/vassili.h
index d006770f7b..dfdacf7920 100644
--- a/engines/lastexpress/entities/vassili.h
+++ b/engines/lastexpress/entities/vassili.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/lastexpress/entities/verges.cpp b/engines/lastexpress/entities/verges.cpp
index d9ddb0a4d1..31b6e19c63 100644
--- a/engines/lastexpress/entities/verges.cpp
+++ b/engines/lastexpress/entities/verges.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -105,7 +105,7 @@ IMPLEMENT_FUNCTION(3, Verges, callbackActionOnDirection)
case kActionExitCompartment:
callbackAction();
- break;
+ break;
case kActionExcuseMeCath:
if (!params->param1) {
@@ -1816,7 +1816,7 @@ IMPLEMENT_FUNCTION(41, Verges, askPassengersToStayInCompartments)
break;
case kActionDefault:
- getObjects()->updateLocation2(kObjectRestaurantCar, kObjectLocation3);
+ getObjects()->updateModel(kObjectRestaurantCar, kObjectModel3);
getData()->car = kCarRedSleeping;
getData()->entityPosition = kPosition_9460;
getData()->location = kLocationInsideCompartment;
diff --git a/engines/lastexpress/entities/verges.h b/engines/lastexpress/entities/verges.h
index 93cc190d1e..dc902b376d 100644
--- a/engines/lastexpress/entities/verges.h
+++ b/engines/lastexpress/entities/verges.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/lastexpress/entities/vesna.cpp b/engines/lastexpress/entities/vesna.cpp
index f29bce8b2b..6e9fb4f204 100644
--- a/engines/lastexpress/entities/vesna.cpp
+++ b/engines/lastexpress/entities/vesna.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/lastexpress/entities/vesna.h b/engines/lastexpress/entities/vesna.h
index 025d45882e..8d255500be 100644
--- a/engines/lastexpress/entities/vesna.h
+++ b/engines/lastexpress/entities/vesna.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/lastexpress/entities/yasmin.cpp b/engines/lastexpress/entities/yasmin.cpp
index 1d280f51e0..e9c1c53a11 100644
--- a/engines/lastexpress/entities/yasmin.cpp
+++ b/engines/lastexpress/entities/yasmin.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -39,22 +39,22 @@ Yasmin::Yasmin(LastExpressEngine *engine) : Entity(engine, kEntityYasmin) {
ADD_CALLBACK_FUNCTION(Yasmin, playSound);
ADD_CALLBACK_FUNCTION(Yasmin, updateFromTime);
ADD_CALLBACK_FUNCTION(Yasmin, updateEntity);
- ADD_CALLBACK_FUNCTION(Yasmin, function6);
- ADD_CALLBACK_FUNCTION(Yasmin, function7);
+ ADD_CALLBACK_FUNCTION(Yasmin, goEtoG);
+ ADD_CALLBACK_FUNCTION(Yasmin, goGtoE);
ADD_CALLBACK_FUNCTION(Yasmin, chapter1);
- ADD_CALLBACK_FUNCTION(Yasmin, chapter1Handler);
+ ADD_CALLBACK_FUNCTION(Yasmin, part1);
ADD_CALLBACK_FUNCTION(Yasmin, function10);
ADD_CALLBACK_FUNCTION(Yasmin, chapter2);
- ADD_CALLBACK_FUNCTION(Yasmin, chapter2Handler);
+ ADD_CALLBACK_FUNCTION(Yasmin, part2);
ADD_CALLBACK_FUNCTION(Yasmin, chapter3);
- ADD_CALLBACK_FUNCTION(Yasmin, chapter3Handler);
+ ADD_CALLBACK_FUNCTION(Yasmin, part3);
ADD_CALLBACK_FUNCTION(Yasmin, chapter4);
- ADD_CALLBACK_FUNCTION(Yasmin, chapter4Handler);
+ ADD_CALLBACK_FUNCTION(Yasmin, part4);
ADD_CALLBACK_FUNCTION(Yasmin, function17);
ADD_CALLBACK_FUNCTION(Yasmin, chapter5);
- ADD_CALLBACK_FUNCTION(Yasmin, chapter5Handler);
+ ADD_CALLBACK_FUNCTION(Yasmin, part5);
ADD_CALLBACK_FUNCTION(Yasmin, function20);
- ADD_CALLBACK_FUNCTION(Yasmin, function21);
+ ADD_CALLBACK_FUNCTION(Yasmin, hiding);
ADD_NULL_FUNCTION();
}
@@ -98,7 +98,7 @@ IMPLEMENT_FUNCTION_II(5, Yasmin, updateEntity, CarIndex, EntityPosition)
IMPLEMENT_FUNCTION_END
//////////////////////////////////////////////////////////////////////////
-IMPLEMENT_FUNCTION(6, Yasmin, function6)
+IMPLEMENT_FUNCTION(6, Yasmin, goEtoG)
switch (savepoint.action) {
default:
break;
@@ -138,7 +138,7 @@ IMPLEMENT_FUNCTION(6, Yasmin, function6)
IMPLEMENT_FUNCTION_END
//////////////////////////////////////////////////////////////////////////
-IMPLEMENT_FUNCTION(7, Yasmin, function7)
+IMPLEMENT_FUNCTION(7, Yasmin, goGtoE)
switch (savepoint.action) {
default:
break;
@@ -184,7 +184,7 @@ IMPLEMENT_FUNCTION(8, Yasmin, chapter1)
break;
case kActionNone:
- Entity::timeCheck(kTimeChapter1, params->param1, WRAP_SETUP_FUNCTION(Yasmin, setup_chapter1Handler));
+ Entity::timeCheck(kTimeChapter1, params->param1, WRAP_SETUP_FUNCTION(Yasmin, setup_part1));
break;
case kActionDefault:
@@ -196,16 +196,16 @@ IMPLEMENT_FUNCTION(8, Yasmin, chapter1)
IMPLEMENT_FUNCTION_END
//////////////////////////////////////////////////////////////////////////
-IMPLEMENT_FUNCTION(9, Yasmin, chapter1Handler)
+IMPLEMENT_FUNCTION(9, Yasmin, part1)
switch (savepoint.action) {
default:
break;
case kActionNone:
- if (Entity::timeCheckCallback(kTime1093500, params->param1, 1, WRAP_SETUP_FUNCTION(Yasmin, setup_function6)))
+ if (Entity::timeCheckCallback(kTime1093500, params->param1, 1, WRAP_SETUP_FUNCTION(Yasmin, setup_goEtoG)))
break;
- if (Entity::timeCheckCallback(kTime1161000, params->param2, 3, WRAP_SETUP_FUNCTION(Yasmin, setup_function7)))
+ if (Entity::timeCheckCallback(kTime1161000, params->param2, 3, WRAP_SETUP_FUNCTION(Yasmin, setup_goGtoE)))
break;
if (Entity::timeCheckPlaySoundUpdatePosition(kTime1162800, params->param3, 4, "Har1102", kPosition_4070))
@@ -217,7 +217,7 @@ IMPLEMENT_FUNCTION(9, Yasmin, chapter1Handler)
if (Entity::timeCheckCallback(kTime1174500, params->param5, 6, "Har1106", WRAP_SETUP_FUNCTION_S(Yasmin, setup_playSound)))
break;
- Entity::timeCheckCallback(kTime1183500, params->param6, 7, WRAP_SETUP_FUNCTION(Yasmin, setup_function6));
+ Entity::timeCheckCallback(kTime1183500, params->param6, 7, WRAP_SETUP_FUNCTION(Yasmin, setup_goEtoG));
break;
case kActionCallback:
@@ -232,7 +232,7 @@ IMPLEMENT_FUNCTION(9, Yasmin, chapter1Handler)
break;
case 2:
- if (Entity::timeCheckCallback(kTime1161000, params->param2, 3, WRAP_SETUP_FUNCTION(Yasmin, setup_function7)))
+ if (Entity::timeCheckCallback(kTime1161000, params->param2, 3, WRAP_SETUP_FUNCTION(Yasmin, setup_goGtoE)))
break;
// Fallback to case 3
@@ -252,7 +252,7 @@ IMPLEMENT_FUNCTION(9, Yasmin, chapter1Handler)
// Fallback to case 6
case 6:
- Entity::timeCheckCallback(kTime1183500, params->param6, 7, WRAP_SETUP_FUNCTION(Yasmin, setup_function6));
+ Entity::timeCheckCallback(kTime1183500, params->param6, 7, WRAP_SETUP_FUNCTION(Yasmin, setup_goEtoG));
break;
}
break;
@@ -282,18 +282,18 @@ IMPLEMENT_FUNCTION(11, Yasmin, chapter2)
getData()->clothes = kClothesDefault;
getData()->inventoryItem = kItemNone;
- setup_chapter2Handler();
+ setup_part2();
}
IMPLEMENT_FUNCTION_END
//////////////////////////////////////////////////////////////////////////
-IMPLEMENT_FUNCTION(12, Yasmin, chapter2Handler)
+IMPLEMENT_FUNCTION(12, Yasmin, part2)
switch (savepoint.action) {
default:
break;
case kActionNone:
- if (Entity::timeCheckCallback(kTime1759500, params->param1, 1, WRAP_SETUP_FUNCTION(Yasmin, setup_function7)))
+ if (Entity::timeCheckCallback(kTime1759500, params->param1, 1, WRAP_SETUP_FUNCTION(Yasmin, setup_goGtoE)))
break;
if (getState()->time > kTime1800000 && !params->param2) {
@@ -327,7 +327,7 @@ IMPLEMENT_FUNCTION(13, Yasmin, chapter3)
break;
case kActionNone:
- setup_chapter3Handler();
+ setup_part3();
break;
case kActionDefault:
@@ -341,19 +341,19 @@ IMPLEMENT_FUNCTION(13, Yasmin, chapter3)
IMPLEMENT_FUNCTION_END
//////////////////////////////////////////////////////////////////////////
-IMPLEMENT_FUNCTION(14, Yasmin, chapter3Handler)
+IMPLEMENT_FUNCTION(14, Yasmin, part3)
switch (savepoint.action) {
default:
break;
case kActionNone:
- if (Entity::timeCheckCallback(kTime2062800, params->param1, 1, WRAP_SETUP_FUNCTION(Yasmin, setup_function6)))
+ if (Entity::timeCheckCallback(kTime2062800, params->param1, 1, WRAP_SETUP_FUNCTION(Yasmin, setup_goEtoG)))
break;
- if (Entity::timeCheckCallback(kTime2106000, params->param2, 2, WRAP_SETUP_FUNCTION(Yasmin, setup_function7)))
+ if (Entity::timeCheckCallback(kTime2106000, params->param2, 2, WRAP_SETUP_FUNCTION(Yasmin, setup_goGtoE)))
break;
- Entity::timeCheckCallback(kTime2160000, params->param3, 3, WRAP_SETUP_FUNCTION(Yasmin, setup_function6));
+ Entity::timeCheckCallback(kTime2160000, params->param3, 3, WRAP_SETUP_FUNCTION(Yasmin, setup_goEtoG));
break;
case kActionCallback:
@@ -362,12 +362,12 @@ IMPLEMENT_FUNCTION(14, Yasmin, chapter3Handler)
break;
case 1:
- if (Entity::timeCheckCallback(kTime2106000, params->param2, 2, WRAP_SETUP_FUNCTION(Yasmin, setup_function7)))
+ if (Entity::timeCheckCallback(kTime2106000, params->param2, 2, WRAP_SETUP_FUNCTION(Yasmin, setup_goGtoE)))
break;
// Fallback to case 2
case 2:
- Entity::timeCheckCallback(kTime2160000, params->param3, 3, WRAP_SETUP_FUNCTION(Yasmin, setup_function6));
+ Entity::timeCheckCallback(kTime2160000, params->param3, 3, WRAP_SETUP_FUNCTION(Yasmin, setup_goEtoG));
break;
}
break;
@@ -381,7 +381,7 @@ IMPLEMENT_FUNCTION(15, Yasmin, chapter4)
break;
case kActionNone:
- setup_chapter4Handler();
+ setup_part4();
break;
case kActionDefault:
@@ -393,16 +393,16 @@ IMPLEMENT_FUNCTION(15, Yasmin, chapter4)
IMPLEMENT_FUNCTION_END
//////////////////////////////////////////////////////////////////////////
-IMPLEMENT_FUNCTION(16, Yasmin, chapter4Handler)
+IMPLEMENT_FUNCTION(16, Yasmin, part4)
switch (savepoint.action) {
default:
break;
case kActionNone:
- if (Entity::timeCheckCallback(kTime2457000, params->param1, 1, WRAP_SETUP_FUNCTION(Yasmin, setup_function7)))
+ if (Entity::timeCheckCallback(kTime2457000, params->param1, 1, WRAP_SETUP_FUNCTION(Yasmin, setup_goGtoE)))
break;
- Entity::timeCheckCallback(kTime2479500, params->param2, 3, WRAP_SETUP_FUNCTION(Yasmin, setup_function6));
+ Entity::timeCheckCallback(kTime2479500, params->param2, 3, WRAP_SETUP_FUNCTION(Yasmin, setup_goEtoG));
break;
case kActionCallback:
@@ -417,7 +417,7 @@ IMPLEMENT_FUNCTION(16, Yasmin, chapter4Handler)
break;
case 2:
- Entity::timeCheckCallback(kTime2479500, params->param2, 3, WRAP_SETUP_FUNCTION(Yasmin, setup_function6));
+ Entity::timeCheckCallback(kTime2479500, params->param2, 3, WRAP_SETUP_FUNCTION(Yasmin, setup_goEtoG));
break;
}
break;
@@ -437,7 +437,7 @@ IMPLEMENT_FUNCTION(18, Yasmin, chapter5)
break;
case kActionNone:
- setup_chapter5Handler();
+ setup_part5();
break;
case kActionDefault:
@@ -453,7 +453,7 @@ IMPLEMENT_FUNCTION(18, Yasmin, chapter5)
IMPLEMENT_FUNCTION_END
//////////////////////////////////////////////////////////////////////////
-IMPLEMENT_FUNCTION(19, Yasmin, chapter5Handler)
+IMPLEMENT_FUNCTION(19, Yasmin, part5)
if (savepoint.action == kActionProceedChapter5)
setup_function20();
IMPLEMENT_FUNCTION_END
@@ -468,7 +468,7 @@ IMPLEMENT_FUNCTION(20, Yasmin, function20)
if (!Entity::updateParameter(params->param1, getState()->time, 2700))
break;
- setup_function21();
+ setup_hiding();
break;
case kActionDefault:
@@ -479,14 +479,14 @@ IMPLEMENT_FUNCTION(20, Yasmin, function20)
case kActionDrawScene:
if (getEntities()->isInsideTrainCar(kEntityPlayer, kCarGreenSleeping)) {
- setup_function21();
+ setup_hiding();
}
break;
}
IMPLEMENT_FUNCTION_END
//////////////////////////////////////////////////////////////////////////
-IMPLEMENT_FUNCTION(21, Yasmin, function21)
+IMPLEMENT_FUNCTION(21, Yasmin, hiding)
switch (savepoint.action) {
default:
break;
diff --git a/engines/lastexpress/entities/yasmin.h b/engines/lastexpress/entities/yasmin.h
index b1413f5c2f..5ed735c9ac 100644
--- a/engines/lastexpress/entities/yasmin.h
+++ b/engines/lastexpress/entities/yasmin.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -70,8 +70,8 @@ public:
*/
DECLARE_FUNCTION_2(updateEntity, CarIndex car, EntityPosition entityPosition)
- DECLARE_FUNCTION(function6)
- DECLARE_FUNCTION(function7)
+ DECLARE_FUNCTION(goEtoG)
+ DECLARE_FUNCTION(goGtoE)
/**
* Setup Chapter 1
@@ -81,7 +81,7 @@ public:
/**
* Handle Chapter 1 events
*/
- DECLARE_FUNCTION(chapter1Handler)
+ DECLARE_FUNCTION(part1)
DECLARE_FUNCTION(function10)
@@ -93,7 +93,7 @@ public:
/**
* Handle Chapter 2 events
*/
- DECLARE_FUNCTION(chapter2Handler)
+ DECLARE_FUNCTION(part2)
/**
* Setup Chapter 3
@@ -103,7 +103,7 @@ public:
/**
* Handle Chapter 3 events
*/
- DECLARE_FUNCTION(chapter3Handler)
+ DECLARE_FUNCTION(part3)
/**
* Setup Chapter 4
@@ -113,7 +113,7 @@ public:
/**
* Handle Chapter 4 events
*/
- DECLARE_FUNCTION(chapter4Handler)
+ DECLARE_FUNCTION(part4)
DECLARE_FUNCTION(function17)
@@ -125,10 +125,10 @@ public:
/**
* Handle Chapter 5 events
*/
- DECLARE_FUNCTION(chapter5Handler)
+ DECLARE_FUNCTION(part5)
DECLARE_FUNCTION(function20)
- DECLARE_FUNCTION(function21)
+ DECLARE_FUNCTION(hiding)
DECLARE_NULL_FUNCTION()
};
diff --git a/engines/lastexpress/eventhandler.h b/engines/lastexpress/eventhandler.h
index c561d57541..75263a8ec6 100644
--- a/engines/lastexpress/eventhandler.h
+++ b/engines/lastexpress/eventhandler.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/lastexpress/fight/fight.cpp b/engines/lastexpress/fight/fight.cpp
index 49a9b85657..47694dda3e 100644
--- a/engines/lastexpress/fight/fight.cpp
+++ b/engines/lastexpress/fight/fight.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -222,7 +222,7 @@ Fight::FightEndType Fight::setup(FightType type) {
break;
case kFightMilos:
- sceneIndex = (getObjects()->get(kObjectCompartment1).location2 < kObjectLocation3) ? kSceneFightMilos : kSceneFightMilosBedOpened;
+ sceneIndex = (getObjects()->get(kObjectCompartment1).model < kObjectModel3) ? kSceneFightMilos : kSceneFightMilosBedOpened;
break;
case kFightAnna:
diff --git a/engines/lastexpress/fight/fight.h b/engines/lastexpress/fight/fight.h
index fffb520789..5c6eff507a 100644
--- a/engines/lastexpress/fight/fight.h
+++ b/engines/lastexpress/fight/fight.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/lastexpress/fight/fighter.cpp b/engines/lastexpress/fight/fighter.cpp
index 4b1cddabd4..6fd2a6421c 100644
--- a/engines/lastexpress/fight/fighter.cpp
+++ b/engines/lastexpress/fight/fighter.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/lastexpress/fight/fighter.h b/engines/lastexpress/fight/fighter.h
index dad95af186..326610af1e 100644
--- a/engines/lastexpress/fight/fighter.h
+++ b/engines/lastexpress/fight/fighter.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/lastexpress/fight/fighter_anna.cpp b/engines/lastexpress/fight/fighter_anna.cpp
index c7660cab1a..723bd38cf0 100644
--- a/engines/lastexpress/fight/fighter_anna.cpp
+++ b/engines/lastexpress/fight/fighter_anna.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/lastexpress/fight/fighter_anna.h b/engines/lastexpress/fight/fighter_anna.h
index abb6f9dc64..667552b8dc 100644
--- a/engines/lastexpress/fight/fighter_anna.h
+++ b/engines/lastexpress/fight/fighter_anna.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/lastexpress/fight/fighter_ivo.cpp b/engines/lastexpress/fight/fighter_ivo.cpp
index 87a52c6be4..7bd9968da2 100644
--- a/engines/lastexpress/fight/fighter_ivo.cpp
+++ b/engines/lastexpress/fight/fighter_ivo.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/lastexpress/fight/fighter_ivo.h b/engines/lastexpress/fight/fighter_ivo.h
index ca54fea904..1988b4b8c4 100644
--- a/engines/lastexpress/fight/fighter_ivo.h
+++ b/engines/lastexpress/fight/fighter_ivo.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/lastexpress/fight/fighter_milos.cpp b/engines/lastexpress/fight/fighter_milos.cpp
index 9f8e726165..5b98b87304 100644
--- a/engines/lastexpress/fight/fighter_milos.cpp
+++ b/engines/lastexpress/fight/fighter_milos.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/lastexpress/fight/fighter_milos.h b/engines/lastexpress/fight/fighter_milos.h
index 2126dd1838..734177f3dc 100644
--- a/engines/lastexpress/fight/fighter_milos.h
+++ b/engines/lastexpress/fight/fighter_milos.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/lastexpress/fight/fighter_salko.cpp b/engines/lastexpress/fight/fighter_salko.cpp
index 1082674235..c0d15ec183 100644
--- a/engines/lastexpress/fight/fighter_salko.cpp
+++ b/engines/lastexpress/fight/fighter_salko.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/lastexpress/fight/fighter_salko.h b/engines/lastexpress/fight/fighter_salko.h
index 0a2a615867..365f28a808 100644
--- a/engines/lastexpress/fight/fighter_salko.h
+++ b/engines/lastexpress/fight/fighter_salko.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/lastexpress/fight/fighter_vesna.cpp b/engines/lastexpress/fight/fighter_vesna.cpp
index 02aaa1c16c..eeb00b821b 100644
--- a/engines/lastexpress/fight/fighter_vesna.cpp
+++ b/engines/lastexpress/fight/fighter_vesna.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/lastexpress/fight/fighter_vesna.h b/engines/lastexpress/fight/fighter_vesna.h
index 5c8ec855ae..a706922555 100644
--- a/engines/lastexpress/fight/fighter_vesna.h
+++ b/engines/lastexpress/fight/fighter_vesna.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/lastexpress/game/action.cpp b/engines/lastexpress/game/action.cpp
index 796abf2ce7..986c56cb1b 100644
--- a/engines/lastexpress/game/action.cpp
+++ b/engines/lastexpress/game/action.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -351,42 +351,42 @@ Action::Action(LastExpressEngine *engine) : _engine(engine) {
ADD_ACTION(savePoint);
ADD_ACTION(playSound);
ADD_ACTION(playMusic);
- ADD_ACTION(knock);
+ ADD_ACTION(knock); // 5
ADD_ACTION(compartment);
ADD_ACTION(playSounds);
ADD_ACTION(playAnimation);
ADD_ACTION(openCloseObject);
- ADD_ACTION(updateObjetLocation2);
- ADD_ACTION(setItemLocation);
- ADD_ACTION(knockNoSound);
+ ADD_ACTION(setModel); // 10
+ ADD_ACTION(setItem);
+ ADD_ACTION(knockInside);
ADD_ACTION(pickItem);
ADD_ACTION(dropItem);
- ADD_ACTION(dummy);
+ ADD_ACTION(dummy); // 15
ADD_ACTION(enterCompartment);
ADD_ACTION(dummy);
- ADD_ACTION(getOutsideTrain);
- ADD_ACTION(slip);
- ADD_ACTION(getInsideTrain);
- ADD_ACTION(climbUpTrain);
+ ADD_ACTION(leanOutWindow);
+ ADD_ACTION(almostFall);
+ ADD_ACTION(climbInWindow); // 20
+ ADD_ACTION(climbLadder);
ADD_ACTION(climbDownTrain);
- ADD_ACTION(jumpUpDownTrain);
- ADD_ACTION(unbound);
- ADD_ACTION(25);
- ADD_ACTION(26);
+ ADD_ACTION(kronosSanctum);
+ ADD_ACTION(escapeBaggage);
+ ADD_ACTION(enterBaggage); // 25
+ ADD_ACTION(bombPuzzle);
ADD_ACTION(27);
- ADD_ACTION(concertSitCough);
+ ADD_ACTION(kronosConcert);
ADD_ACTION(29);
- ADD_ACTION(catchBeetle);
+ ADD_ACTION(catchBeetle); // 30
ADD_ACTION(exitCompartment);
- ADD_ACTION(32);
- ADD_ACTION(useWhistle);
+ ADD_ACTION(outsideTrain);
+ ADD_ACTION(firebirdPuzzle);
ADD_ACTION(openMatchBox);
- ADD_ACTION(openBed);
+ ADD_ACTION(openBed); // 35
ADD_ACTION(dummy);
ADD_ACTION(dialog);
ADD_ACTION(eggBox);
ADD_ACTION(39);
- ADD_ACTION(bed);
+ ADD_ACTION(bed); // 40
ADD_ACTION(playMusicChapter);
ADD_ACTION(playMusicChapterSetupTrain);
ADD_ACTION(switchChapter);
@@ -521,7 +521,7 @@ IMPLEMENT_ACTION(compartment)
return kSceneNone;
}
- ObjectLocation location = getObjects()->get(compartment).location;
+ ObjectLocation location = getObjects()->get(compartment).status;
if (location == kObjectLocation1 || location == kObjectLocation3 || getEntities()->checkFields2(compartment)) {
if (location != kObjectLocation1 || getEntities()->checkFields2(compartment)
@@ -625,14 +625,14 @@ IMPLEMENT_ACTION(openCloseObject)
//////////////////////////////////////////////////////////////////////////
// Action 10
-IMPLEMENT_ACTION(updateObjetLocation2)
+IMPLEMENT_ACTION(setModel)
ObjectIndex object = (ObjectIndex)hotspot.param1;
- ObjectLocation location = (ObjectLocation)hotspot.param2;
+ ObjectModel model = (ObjectModel)hotspot.param2;
if (object >= kObjectMax)
return kSceneInvalid;
- getObjects()->updateLocation2(object, location);
+ getObjects()->updateModel(object, model);
if (object != kObject112 || getSoundQueue()->isBuffered("LIB096")) {
if (object == 1)
@@ -646,13 +646,13 @@ IMPLEMENT_ACTION(updateObjetLocation2)
//////////////////////////////////////////////////////////////////////////
// Action 11
-IMPLEMENT_ACTION(setItemLocation)
+IMPLEMENT_ACTION(setItem)
InventoryItem item = (InventoryItem)hotspot.param1;
if (item >= kPortraitOriginal)
return kSceneInvalid;
Inventory::InventoryEntry *entry = getInventory()->get(item);
- if (entry->isPresent)
+ if (entry->inPocket)
return kSceneInvalid;
entry->location = (ObjectLocation)hotspot.param2;
@@ -667,7 +667,7 @@ IMPLEMENT_ACTION(setItemLocation)
//////////////////////////////////////////////////////////////////////////
// Action 12
-IMPLEMENT_ACTION(knockNoSound)
+IMPLEMENT_ACTION(knockInside)
ObjectIndex object = (ObjectIndex)hotspot.param1;
if (object >= kObjectMax)
return kSceneInvalid;
@@ -726,7 +726,7 @@ IMPLEMENT_ACTION(pickItem)
break;
case kItemBomb:
- RESET_ENTITY_STATE(kEntityAbbot, Abbot, setup_pickBomb);
+ RESET_ENTITY_STATE(kEntityAbbot, Abbot, setup_catchCath);
break;
case kItemBriefcase:
@@ -808,7 +808,7 @@ IMPLEMENT_ACTION(dropItem)
//////////////////////////////////////////////////////////////////////////
// Action 16
IMPLEMENT_ACTION(enterCompartment)
- if (getObjects()->get(kObjectCompartment1).location == kObjectLocation1 || getObjects()->get(kObjectCompartment1).location == kObjectLocation3 || getInventory()->getSelectedItem() == kItemKey)
+ if (getObjects()->get(kObjectCompartment1).status == kObjectLocation1 || getObjects()->get(kObjectCompartment1).status == kObjectLocation3 || getInventory()->getSelectedItem() == kItemKey)
return action_compartment(hotspot);
if (getProgress().eventCorpseFound) {
@@ -842,12 +842,12 @@ IMPLEMENT_ACTION(enterCompartment)
//////////////////////////////////////////////////////////////////////////
// Action 18
-IMPLEMENT_ACTION(getOutsideTrain)
+IMPLEMENT_ACTION(leanOutWindow)
ObjectIndex object = (ObjectIndex)hotspot.param1;
- if ((getEvent(kEventCathLookOutsideWindowDay) || getEvent(kEventCathLookOutsideWindowNight) || getObjects()->get(kObjectCompartment1).location2 == kObjectLocation1)
+ if ((getEvent(kEventCathLookOutsideWindowDay) || getEvent(kEventCathLookOutsideWindowNight) || getObjects()->get(kObjectCompartment1).model == kObjectModel1)
&& getProgress().isTrainRunning
- && (object != kObjectOutsideAnnaCompartment || (!getEntities()->isInsideCompartment(kEntityRebecca, kCarRedSleeping, kPosition_4840) && getObjects()->get(kObjectOutsideBetweenCompartments).location == kObjectLocation2))
+ && (object != kObjectOutsideAnnaCompartment || (!getEntities()->isInsideCompartment(kEntityRebecca, kCarRedSleeping, kPosition_4840) && getObjects()->get(kObjectOutsideBetweenCompartments).status == kObjectLocation2))
&& getInventory()->getSelectedItem() != kItemFirebird
&& getInventory()->getSelectedItem() != kItemBriefcase) {
@@ -887,7 +887,7 @@ IMPLEMENT_ACTION(getOutsideTrain)
//////////////////////////////////////////////////////////////////////////
// Action 19
-IMPLEMENT_ACTION(slip)
+IMPLEMENT_ACTION(almostFall)
switch((ObjectIndex)hotspot.param1) {
default:
return kSceneInvalid;
@@ -911,7 +911,7 @@ IMPLEMENT_ACTION(slip)
//////////////////////////////////////////////////////////////////////////
// Action 20
-IMPLEMENT_ACTION(getInsideTrain)
+IMPLEMENT_ACTION(climbInWindow)
switch ((ObjectIndex)hotspot.param1) {
default:
return kSceneInvalid;
@@ -937,7 +937,7 @@ IMPLEMENT_ACTION(getInsideTrain)
//////////////////////////////////////////////////////////////////////////
// Action 21
-IMPLEMENT_ACTION(climbUpTrain)
+IMPLEMENT_ACTION(climbLadder)
byte action = hotspot.param1;
if (action != 1 && action != 2)
@@ -999,7 +999,7 @@ IMPLEMENT_ACTION(climbDownTrain)
//////////////////////////////////////////////////////////////////////////
// Action 23
-IMPLEMENT_ACTION(jumpUpDownTrain)
+IMPLEMENT_ACTION(kronosSanctum)
switch (hotspot.param1) {
default:
break;
@@ -1038,7 +1038,7 @@ IMPLEMENT_ACTION(jumpUpDownTrain)
//////////////////////////////////////////////////////////////////////////
// Action 24
-IMPLEMENT_ACTION(unbound)
+IMPLEMENT_ACTION(escapeBaggage)
byte action = hotspot.param1;
switch (action) {
@@ -1086,7 +1086,7 @@ IMPLEMENT_ACTION(unbound)
//////////////////////////////////////////////////////////////////////////
// Action 25
-IMPLEMENT_ACTION(25)
+IMPLEMENT_ACTION(enterBaggage)
switch(hotspot.param1) {
default:
break;
@@ -1103,7 +1103,7 @@ IMPLEMENT_ACTION(25)
case 3:
getSound()->playSoundEvent(kEntityPlayer, 43);
if (!getInventory()->hasItem(kItemKey) && !getEvent(kEventAnnaBaggageArgument)) {
- RESET_ENTITY_STATE(kEntityAnna, Anna, setup_baggage);
+ RESET_ENTITY_STATE(kEntityAnna, Anna, setup_baggageFight);
return kSceneNone;
}
break;
@@ -1114,7 +1114,7 @@ IMPLEMENT_ACTION(25)
//////////////////////////////////////////////////////////////////////////
// Action 26
-IMPLEMENT_ACTION(26)
+IMPLEMENT_ACTION(bombPuzzle)
switch(hotspot.param1) {
default:
return kSceneInvalid;
@@ -1168,7 +1168,7 @@ IMPLEMENT_ACTION(27)
//////////////////////////////////////////////////////////////////////////
// Action 28
-IMPLEMENT_ACTION(concertSitCough)
+IMPLEMENT_ACTION(kronosConcert)
switch(hotspot.param1) {
default:
return kSceneInvalid;
@@ -1224,7 +1224,7 @@ IMPLEMENT_ACTION(exitCompartment)
getProgress().field_30 = 1;
}
- getObjects()->updateLocation2(kObjectCompartment1, (ObjectLocation)hotspot.param2);
+ getObjects()->updateModel(kObjectCompartment1, (ObjectModel)hotspot.param2);
// fall to case enterCompartment action
return action_enterCompartment(hotspot);
@@ -1232,7 +1232,7 @@ IMPLEMENT_ACTION(exitCompartment)
//////////////////////////////////////////////////////////////////////////
// Action 32
-IMPLEMENT_ACTION(32)
+IMPLEMENT_ACTION(outsideTrain)
switch(hotspot.param1) {
default:
break;
@@ -1273,7 +1273,7 @@ IMPLEMENT_ACTION(32)
//////////////////////////////////////////////////////////////////////////
// Action 33
-IMPLEMENT_ACTION(useWhistle)
+IMPLEMENT_ACTION(firebirdPuzzle)
EventIndex evt = kEventNone;
SceneIndex sceneIndex = kSceneInvalid;
@@ -1335,7 +1335,7 @@ IMPLEMENT_ACTION(useWhistle)
IMPLEMENT_ACTION(openMatchBox)
// If the match is already in the inventory, do nothing
if (!getInventory()->get(kItemMatch)->location
- || getInventory()->get(kItemMatch)->isPresent)
+ || getInventory()->get(kItemMatch)->inPocket)
return kSceneInvalid;
getInventory()->addItem(kItemMatch);
@@ -1392,7 +1392,7 @@ IMPLEMENT_ACTION(39)
IMPLEMENT_ACTION(bed)
getSound()->playSoundEvent(kEntityPlayer, 85);
// falls to case knockNoSound
- return action_knockNoSound(hotspot);
+ return action_knockInside(hotspot);
}
//////////////////////////////////////////////////////////////////////////
@@ -1724,7 +1724,7 @@ bool Action::handleOtherCompartment(ObjectIndex object, bool doPlaySound, bool d
}
void Action::playCompartmentSoundEvents(ObjectIndex object) const {
- if (getObjects()->get(object).location == kObjectLocation1 || getObjects()->get(object).location == kObjectLocation3 || getEntities()->checkFields2(object)) {
+ if (getObjects()->get(object).status == kObjectLocation1 || getObjects()->get(object).status == kObjectLocation3 || getEntities()->checkFields2(object)) {
getSound()->playSoundEvent(kEntityPlayer, 13);
} else {
getSound()->playSoundEvent(kEntityPlayer, 14);
@@ -1757,7 +1757,7 @@ CursorStyle Action::getCursor(const SceneHotspot &hotspot) const {
if (object >= kObjectMax)
return kCursorNormal;
else
- return (CursorStyle)getObjects()->get(object).cursor;
+ return (CursorStyle)getObjects()->get(object).windowCursor;
case SceneHotspot::kAction12:
debugC(2, kLastExpressDebugScenes, "================================= OBJECT %03d =================================", object);
@@ -1765,7 +1765,7 @@ CursorStyle Action::getCursor(const SceneHotspot &hotspot) const {
return kCursorNormal;
if (getObjects()->get(object).entity)
- return (CursorStyle)getObjects()->get(object).cursor;
+ return (CursorStyle)getObjects()->get(object).windowCursor;
else
return kCursorNormal;
@@ -1774,7 +1774,7 @@ CursorStyle Action::getCursor(const SceneHotspot &hotspot) const {
if (object >= kObjectCompartmentA)
return kCursorNormal;
- if ((!getInventory()->getSelectedItem() || getInventory()->getSelectedEntry()->manualSelect)
+ if ((!getInventory()->getSelectedItem() || getInventory()->getSelectedEntry()->floating)
&& (object != kObject21 || getProgress().eventCorpseMovedFromFloor))
return kCursorHand;
else
@@ -1806,8 +1806,8 @@ CursorStyle Action::getCursor(const SceneHotspot &hotspot) const {
return kCursorNormal;
case SceneHotspot::kActionEnterCompartment:
- if ((getInventory()->getSelectedItem() != kItemKey || getObjects()->get(kObjectCompartment1).location)
- && (getObjects()->get(kObjectCompartment1).location != 1 || !getInventory()->hasItem(kItemKey)
+ if ((getInventory()->getSelectedItem() != kItemKey || getObjects()->get(kObjectCompartment1).status)
+ && (getObjects()->get(kObjectCompartment1).status != 1 || !getInventory()->hasItem(kItemKey)
|| (getInventory()->getSelectedItem() != kItemFirebird && getInventory()->getSelectedItem() != kItemBriefcase)))
goto LABEL_KEY;
@@ -1817,13 +1817,13 @@ CursorStyle Action::getCursor(const SceneHotspot &hotspot) const {
if (getProgress().jacket != kJacketGreen)
return kCursorNormal;
- if ((getEvent(kEventCathLookOutsideWindowDay) || getEvent(kEventCathLookOutsideWindowNight) || getObjects()->get(kObjectCompartment1).location2 == kObjectLocation1)
+ if ((getEvent(kEventCathLookOutsideWindowDay) || getEvent(kEventCathLookOutsideWindowNight) || getObjects()->get(kObjectCompartment1).model == kObjectModel1)
&& getProgress().isTrainRunning
- && (object != kObjectOutsideAnnaCompartment || (getEntities()->isInsideCompartment(kEntityRebecca, kCarRedSleeping, kPosition_4840) && getObjects()->get(kObjectOutsideBetweenCompartments).location == 2))
+ && (object != kObjectOutsideAnnaCompartment || (getEntities()->isInsideCompartment(kEntityRebecca, kCarRedSleeping, kPosition_4840) && getObjects()->get(kObjectOutsideBetweenCompartments).status == 2))
&& getInventory()->getSelectedItem() != kItemBriefcase && getInventory()->getSelectedItem() != kItemFirebird)
return kCursorForward;
- return (getObjects()->get(kObjectCompartment1).location2 < kObjectLocation2) ? kCursorNormal : kCursorMagnifier;
+ return (getObjects()->get(kObjectCompartment1).model < kObjectModel2) ? kCursorNormal : kCursorMagnifier;
case SceneHotspot::kActionSlip:
return (getProgress().field_C8 < 1) ? kCursorNormal : kCursorLeft;
@@ -1841,7 +1841,7 @@ CursorStyle Action::getCursor(const SceneHotspot &hotspot) const {
if (object != kObjectCompartment1)
return kCursorNormal;
- return (getObjects()->get(kObjectCeiling).location < kObjectLocation1) ? kCursorHand : kCursorNormal;
+ return (getObjects()->get(kObjectCeiling).status < kObjectLocation1) ? kCursorHand : kCursorNormal;
case SceneHotspot::kActionUnbound:
if (hotspot.param2 != 2)
@@ -1904,11 +1904,11 @@ LABEL_KEY:
if (getInventory()->getSelectedItem() != kItemKey
|| getObjects()->get(object).entity
- || getObjects()->get(object).location != 1
- || !getObjects()->get(object).cursor2
+ || getObjects()->get(object).status != 1
+ || !getObjects()->get(object).handleCursor
|| getEntities()->isInsideCompartments(kEntityPlayer)
|| getEntities()->checkFields2(object))
- return (CursorStyle)getObjects()->get(object).cursor2;
+ return (CursorStyle)getObjects()->get(object).handleCursor;
else
return (CursorStyle)getInventory()->get(kItemKey)->cursor;
}
diff --git a/engines/lastexpress/game/action.h b/engines/lastexpress/game/action.h
index e1a4a53224..80de60511d 100644
--- a/engines/lastexpress/game/action.h
+++ b/engines/lastexpress/game/action.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -82,28 +82,28 @@ private:
DECLARE_ACTION(playSounds);
DECLARE_ACTION(playAnimation);
DECLARE_ACTION(openCloseObject);
- DECLARE_ACTION(updateObjetLocation2);
- DECLARE_ACTION(setItemLocation);
- DECLARE_ACTION(knockNoSound);
+ DECLARE_ACTION(setModel);
+ DECLARE_ACTION(setItem);
+ DECLARE_ACTION(knockInside);
DECLARE_ACTION(pickItem);
DECLARE_ACTION(dropItem);
DECLARE_ACTION(enterCompartment);
- DECLARE_ACTION(getOutsideTrain);
- DECLARE_ACTION(slip);
- DECLARE_ACTION(getInsideTrain);
- DECLARE_ACTION(climbUpTrain);
+ DECLARE_ACTION(leanOutWindow);
+ DECLARE_ACTION(almostFall);
+ DECLARE_ACTION(climbInWindow);
+ DECLARE_ACTION(climbLadder);
DECLARE_ACTION(climbDownTrain);
- DECLARE_ACTION(jumpUpDownTrain);
- DECLARE_ACTION(unbound);
- DECLARE_ACTION(25);
- DECLARE_ACTION(26);
+ DECLARE_ACTION(kronosSanctum);
+ DECLARE_ACTION(escapeBaggage);
+ DECLARE_ACTION(enterBaggage);
+ DECLARE_ACTION(bombPuzzle);
DECLARE_ACTION(27);
- DECLARE_ACTION(concertSitCough);
+ DECLARE_ACTION(kronosConcert);
DECLARE_ACTION(29);
DECLARE_ACTION(catchBeetle);
DECLARE_ACTION(exitCompartment);
- DECLARE_ACTION(32);
- DECLARE_ACTION(useWhistle);
+ DECLARE_ACTION(outsideTrain);
+ DECLARE_ACTION(firebirdPuzzle);
DECLARE_ACTION(openMatchBox);
DECLARE_ACTION(openBed);
DECLARE_ACTION(dialog);
diff --git a/engines/lastexpress/game/beetle.cpp b/engines/lastexpress/game/beetle.cpp
index d7a369ba40..a92d252f0a 100644
--- a/engines/lastexpress/game/beetle.cpp
+++ b/engines/lastexpress/game/beetle.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/lastexpress/game/beetle.h b/engines/lastexpress/game/beetle.h
index 034ebbd557..0a9a836065 100644
--- a/engines/lastexpress/game/beetle.h
+++ b/engines/lastexpress/game/beetle.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/lastexpress/game/entities.cpp b/engines/lastexpress/game/entities.cpp
index fafbd7cb64..b4b5527f8d 100644
--- a/engines/lastexpress/game/entities.cpp
+++ b/engines/lastexpress/game/entities.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/lastexpress/game/entities.h b/engines/lastexpress/game/entities.h
index 81aed627aa..089edbf87f 100644
--- a/engines/lastexpress/game/entities.h
+++ b/engines/lastexpress/game/entities.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -110,7 +110,7 @@ public:
* Query if 'entity' is inside a compartment
*
* @param entity The entity.
- * @param car The car.
+ * @param car The car.
* @param position The position.
*
* @return true if inside the compartment, false if not.
@@ -247,7 +247,7 @@ public:
/**
* Query if nobody is in a compartment at that position.
*
- * @param car The car.
+ * @param car The car.
* @param position The position.
*
* @return true if nobody is in a compartment, false if not.
@@ -334,8 +334,8 @@ private:
static const int _compartmentsCount = 16;
static const int _positionsCount = 100 * 10; // 100 positions per train car
- LastExpressEngine *_engine;
- EntityData *_header;
+ LastExpressEngine *_engine;
+ EntityData *_header;
Common::Array<Entity *> _entities;
// Compartments & positions
diff --git a/engines/lastexpress/game/inventory.cpp b/engines/lastexpress/game/inventory.cpp
index 2f1b0a8e76..9e02b3bc1d 100644
--- a/engines/lastexpress/game/inventory.cpp
+++ b/engines/lastexpress/game/inventory.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -97,19 +97,19 @@ void Inventory::init() {
_entries[kItemPassengerList].isSelectable = true;
// Auto selection
- _entries[kItem2].manualSelect = false;
- _entries[kItem3].manualSelect = false;
- _entries[kItem5].manualSelect = false;
- _entries[kItem7].manualSelect = false;
- _entries[kItem9].manualSelect = false;
- _entries[kItem11].manualSelect = false;
- _entries[kItemBeetle].manualSelect = false;
- _entries[kItem17].manualSelect = false;
- _entries[kItemFirebird].manualSelect = false;
- _entries[kItemBriefcase].manualSelect = false;
- _entries[kItemCorpse].manualSelect = false;
- _entries[kItemGreenJacket].manualSelect = false;
- _entries[kItem22].manualSelect = false;
+ _entries[kItem2].floating = false;
+ _entries[kItem3].floating = false;
+ _entries[kItem5].floating = false;
+ _entries[kItem7].floating = false;
+ _entries[kItem9].floating = false;
+ _entries[kItem11].floating = false;
+ _entries[kItemBeetle].floating = false;
+ _entries[kItem17].floating = false;
+ _entries[kItemFirebird].floating = false;
+ _entries[kItemBriefcase].floating = false;
+ _entries[kItemCorpse].floating = false;
+ _entries[kItemGreenJacket].floating = false;
+ _entries[kItem22].floating = false;
// Scene
_entries[kItemMatchBox].scene = kSceneMatchbox;
@@ -123,8 +123,8 @@ void Inventory::init() {
_entries[kItemBriefcase].scene = kSceneBriefcase;
// Has item
- _entries[kItemTelegram].isPresent = true;
- _entries[kItemArticle].isPresent = true;
+ _entries[kItemTelegram].inPocket = true;
+ _entries[kItemArticle].inPocket = true;
_selectedItem = kItemNone;
}
@@ -298,7 +298,7 @@ void Inventory::handleMouseEvent(const Common::Event &ev) {
getScenes()->loadScene(entry.scene);
}
- if (entry.field_2)
+ if (entry.usable)
selectItem((InventoryItem)index);
else
drawSelectedItem();
@@ -346,7 +346,7 @@ void Inventory::handleMouseEvent(const Common::Event &ev) {
if (!getProgress().field_84
&& getEntityData(kEntityPlayer)->location != kLocationOutsideTrain
&& getProgress().field_18 != 4
- && (_selectedItem == kItemNone || get(_selectedItem)->manualSelect || getState()->sceneUseBackup)) {
+ && (_selectedItem == kItemNone || get(_selectedItem)->floating || getState()->sceneUseBackup)) {
// Draw inventory contents when clicking on portrait
if (ev.type == Common::EVENT_LBUTTONDOWN) {
@@ -363,7 +363,7 @@ void Inventory::handleMouseEvent(const Common::Event &ev) {
close();
// Select item
- if (_selectedItem == kItemNone || get(_selectedItem)->manualSelect) {
+ if (_selectedItem == kItemNone || get(_selectedItem)->floating) {
_selectedItem = getFirstExaminableItem();
if (_selectedItem != kItemNone)
@@ -447,11 +447,11 @@ void Inventory::addItem(InventoryItem item) {
if (item >= kPortraitOriginal)
return;
- get(item)->isPresent = true;
+ get(item)->inPocket = true;
get(item)->location = kObjectLocationNone;
// Auto-select item if necessary
- if (get(item)->cursor && !get(item)->manualSelect) {
+ if (get(item)->cursor && !get(item)->floating) {
_selectedItem = item;
drawItem(get(_selectedItem)->cursor, 44, 0);
askForRedraw();
@@ -462,7 +462,7 @@ void Inventory::removeItem(InventoryItem item, ObjectLocation newLocation) {
if (item >= kPortraitOriginal)
return;
- get(item)->isPresent = false;
+ get(item)->inPocket = false;
get(item)->location = newLocation;
if (get(item)->cursor == get(_selectedItem)->cursor) {
@@ -473,7 +473,7 @@ void Inventory::removeItem(InventoryItem item, ObjectLocation newLocation) {
}
bool Inventory::hasItem(InventoryItem item) {
- if (get(item)->isPresent && item < kPortraitOriginal)
+ if (get(item)->inPocket && item < kPortraitOriginal)
return true;
return false;
@@ -537,7 +537,7 @@ InventoryItem Inventory::getFirstExaminableItem() const {
int index = 0;
InventoryEntry entry = _entries[index];
- while (!entry.isPresent || !entry.cursor || entry.manualSelect) {
+ while (!entry.inPocket || !entry.cursor || entry.floating) {
index++;
entry = _entries[index];
@@ -676,7 +676,7 @@ void Inventory::drawItem(CursorStyle id, uint16 x, uint16 y, int16 brightnessInd
void Inventory::drawSelectedItem() {
// Draw the selected item if any
- if (!_selectedItem || get(_selectedItem)->manualSelect) {
+ if (!_selectedItem || get(_selectedItem)->floating) {
_selectedItem = getFirstExaminableItem();
if (_selectedItem) {
@@ -703,10 +703,10 @@ void Inventory::open() {
// Draw at most 11 items in the inventory
_itemsShown = 0;
for (int i = 1; i < ARRAYSIZE(_entries); i++) {
- if (!_entries[i].isPresent)
+ if (!_entries[i].inPocket)
continue;
- if (!_entries[i].manualSelect)
+ if (!_entries[i].floating)
continue;
if (_itemsShown < 11) {
@@ -747,10 +747,10 @@ uint32 Inventory::getItemIndex(uint32 currentIndex) const {
uint32 count = 0;
for (uint32 i = 1; i < ARRAYSIZE(_entries); i++) {
- if (!_entries[i].isPresent)
+ if (!_entries[i].inPocket)
continue;
- if (!_entries[i].manualSelect)
+ if (!_entries[i].floating)
continue;
if (count < 11) {
diff --git a/engines/lastexpress/game/inventory.h b/engines/lastexpress/game/inventory.h
index b1019a43c6..f3ab94ccab 100644
--- a/engines/lastexpress/game/inventory.h
+++ b/engines/lastexpress/game/inventory.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -56,33 +56,33 @@ public:
struct InventoryEntry : Common::Serializable {
CursorStyle cursor;
SceneIndex scene;
- byte field_2;
+ byte usable;
bool isSelectable;
- bool isPresent;
- bool manualSelect;
+ bool inPocket;
+ bool floating;
ObjectLocation location;
InventoryEntry() {
cursor = kCursorNormal;
scene = kSceneNone;
- field_2 = 0;
+ usable = 0;
isSelectable = false;
- isPresent = false;
- manualSelect = true;
+ inPocket = false;
+ floating = true;
location = kObjectLocationNone;
}
Common::String toString() {
- return Common::String::format("{ %d - %d - %d - %d - %d - %d - %d }", cursor, scene, field_2, isSelectable, isPresent, manualSelect, location);
+ return Common::String::format("{ %d - %d - %d - %d - %d - %d - %d }", cursor, scene, usable, isSelectable, inPocket, floating, location);
}
void saveLoadWithSerializer(Common::Serializer &s) {
s.syncAsByte(cursor);
s.syncAsByte(scene);
- s.syncAsByte(field_2);
+ s.syncAsByte(usable);
s.syncAsByte(isSelectable);
- s.syncAsByte(isPresent);
- s.syncAsByte(manualSelect);
+ s.syncAsByte(inPocket);
+ s.syncAsByte(floating);
s.syncAsByte(location);
}
};
diff --git a/engines/lastexpress/game/logic.cpp b/engines/lastexpress/game/logic.cpp
index 09104d1bf9..7ba2b0ff85 100644
--- a/engines/lastexpress/game/logic.cpp
+++ b/engines/lastexpress/game/logic.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -413,8 +413,8 @@ void Logic::resetState() {
/**
* Handle game over
*
- * @param type The savegame type.
- * @param value The value (event, time, index, ...)
+ * @param type The savegame type.
+ * @param value The value (event, time, index, ...)
* @param sceneIndex Index of the scene to show.
* @param showScene true to show a scene, false to return to menu directly
*/
@@ -468,7 +468,7 @@ void Logic::switchChapter() const {
case kChapter3:
getInventory()->get(kItemFirebird)->location = kObjectLocation4;
- getInventory()->get(kItemFirebird)->isPresent = false;
+ getInventory()->get(kItemFirebird)->inPocket = false;
getInventory()->get(kItem11)->location = kObjectLocation1;
getInventory()->addItem(kItemWhistle);
getInventory()->addItem(kItemKey);
diff --git a/engines/lastexpress/game/logic.h b/engines/lastexpress/game/logic.h
index efb8f1e1a3..33180dfdd1 100644
--- a/engines/lastexpress/game/logic.h
+++ b/engines/lastexpress/game/logic.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -54,7 +54,7 @@ public:
void playFinalSequence() const;
void updateCursor(bool redraw = true) const;
- Action *getGameAction() { return _action; }
+ Action *getGameAction() { return _action; }
Beetle *getGameBeetle() { return _beetle; }
Entities *getGameEntities() { return _entities; }
Fight *getGameFight() { return _fight; }
diff --git a/engines/lastexpress/game/object.cpp b/engines/lastexpress/game/object.cpp
index 48df91ea6d..31da650b9a 100644
--- a/engines/lastexpress/game/object.cpp
+++ b/engines/lastexpress/game/object.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -32,7 +32,7 @@
namespace LastExpress {
Common::String Objects::Object::toString() {
- return Common::String::format("{ %s - %d - %d - %d - %d }", ENTITY_NAME(entity), location, cursor, cursor2, location2);
+ return Common::String::format("{ %s - %d - %d - %d - %d }", ENTITY_NAME(entity), status, windowCursor, handleCursor, model);
}
Objects::Objects(LastExpressEngine *engine) : _engine(engine) {}
@@ -44,24 +44,24 @@ const Objects::Object Objects::get(ObjectIndex index) const {
return _objects[index];
}
-void Objects::update(ObjectIndex index, EntityIndex entity, ObjectLocation location, CursorStyle cursor, CursorStyle cursor2) {
+void Objects::update(ObjectIndex index, EntityIndex entity, ObjectLocation status, CursorStyle windowCursor, CursorStyle handleCursor) {
if (index >= kObjectMax)
return;
Object *object = &_objects[index];
// Store original location
- ObjectLocation original_location = object->location;
+ ObjectLocation original_status = object->status;
// Update entity
object->entity = entity;
- object->location = location;
+ object->status = status;
- if (cursor != kCursorKeepValue || cursor2 != kCursorKeepValue) {
- if (cursor != kCursorKeepValue)
- object->cursor = cursor;
- if (cursor2 != kCursorKeepValue)
- object->cursor2 = cursor2;
+ if (windowCursor != kCursorKeepValue || handleCursor != kCursorKeepValue) {
+ if (windowCursor != kCursorKeepValue)
+ object->windowCursor = windowCursor;
+ if (handleCursor != kCursorKeepValue)
+ object->handleCursor = handleCursor;
getLogic()->updateCursor();
}
@@ -69,18 +69,19 @@ void Objects::update(ObjectIndex index, EntityIndex entity, ObjectLocation locat
getFlags()->flag_3 = true;
// Compartments
- if (original_location != location && (original_location == kObjectLocation2 || location == kObjectLocation2))
+ if (original_status != status && (original_status == kObjectLocation2 || status == kObjectLocation2)) {
if ((index >= kObjectCompartment1 && index <= kObjectCompartment8)
- || (index >= kObjectCompartmentA && index <= kObjectCompartmentF)) {
- getScenes()->updateDoorsAndClock();
+ || (index >= kObjectCompartmentA && index <= kObjectCompartmentF)) {
+ getScenes()->updateDoorsAndClock();
}
+ }
}
-void Objects::updateLocation2(ObjectIndex index, ObjectLocation location2) {
+void Objects::updateModel(ObjectIndex index, ObjectModel model) {
if (index >= kObjectMax)
return;
- _objects[index].location2 = location2;
+ _objects[index].model = model;
}
//////////////////////////////////////////////////////////////////////////
diff --git a/engines/lastexpress/game/object.h b/engines/lastexpress/game/object.h
index 87c9d7d407..78e8a84df3 100644
--- a/engines/lastexpress/game/object.h
+++ b/engines/lastexpress/game/object.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -37,17 +37,17 @@ public:
struct Object : Common::Serializable { // All fields should be saved as bytes
EntityIndex entity;
- ObjectLocation location;
- CursorStyle cursor;
- CursorStyle cursor2;
- ObjectLocation location2;
+ ObjectLocation status;
+ CursorStyle windowCursor;
+ CursorStyle handleCursor;
+ ObjectModel model;
Object() {
entity = kEntityPlayer;
- location = kObjectLocationNone;
- cursor = kCursorHandKnock;
- cursor2 = kCursorHandKnock;
- location2 = kObjectLocationNone;
+ status = kObjectLocationNone;
+ windowCursor = kCursorHandKnock;
+ handleCursor = kCursorHandKnock;
+ model = kObjectModelNone;
}
Common::String toString();
@@ -55,18 +55,18 @@ public:
// Serializable
void saveLoadWithSerializer(Common::Serializer &s) {
s.syncAsByte(entity);
- s.syncAsByte(location);
- s.syncAsByte(cursor);
- s.syncAsByte(cursor2);
- s.syncAsByte(location2);
+ s.syncAsByte(status);
+ s.syncAsByte(windowCursor);
+ s.syncAsByte(handleCursor);
+ s.syncAsByte(model);
}
};
Objects(LastExpressEngine *engine);
const Object get(ObjectIndex index) const;
- void update(ObjectIndex index, EntityIndex entity, ObjectLocation location, CursorStyle cursor, CursorStyle cursor2);
- void updateLocation2(ObjectIndex index, ObjectLocation location2);
+ void update(ObjectIndex index, EntityIndex entity, ObjectLocation status, CursorStyle cursor, CursorStyle cursor2);
+ void updateModel(ObjectIndex index, ObjectModel model);
// Serializable
void saveLoadWithSerializer(Common::Serializer &s);
diff --git a/engines/lastexpress/game/savegame.cpp b/engines/lastexpress/game/savegame.cpp
index 021dc40bb9..d9f2993c17 100644
--- a/engines/lastexpress/game/savegame.cpp
+++ b/engines/lastexpress/game/savegame.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/lastexpress/game/savegame.h b/engines/lastexpress/game/savegame.h
index 361957227e..f374e18a44 100644
--- a/engines/lastexpress/game/savegame.h
+++ b/engines/lastexpress/game/savegame.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -40,32 +40,32 @@
Game data Format
-----------------
- uint32 {4} - entity
- uint32 {4} - current time
- uint32 {4} - time delta (how much a tick is in "real" time)
- uint32 {4} - time ticks
- uint32 {4} - scene Index max: 2500
- byte {1} - use backup scene
- uint32 {4} - backup Scene Index 1 max: 2500
- uint32 {4} - backup Scene Index 2 max: 2500
- uint32 {4} - selected inventory item max: 32
- uint32 {4*100*10} - positions (by car)
- uint32 {4*16} - compartments
- uint32 {4*16} - compartments ??
- uint32 {4*128} - game progress
- byte {512} - game events
- byte {7*32} - inventory
- byte {5*128} - objects
- byte {1262*40} - entities (characters and train entities)
-
- uint32 {4} - sound queue state
- uint32 {4} - ??
- uint32 {4} - number of sound entries
- byte {count*68} - sound entries
-
- byte {16*128} - save point data
- uint32 {4} - number of save points (max: 128)
- byte {count*16} - save points
+ uint32 {4} - entity
+ uint32 {4} - current time
+ uint32 {4} - time delta (how much a tick is in "real" time)
+ uint32 {4} - time ticks
+ uint32 {4} - scene Index max: 2500
+ byte {1} - use backup scene
+ uint32 {4} - backup Scene Index 1 max: 2500
+ uint32 {4} - backup Scene Index 2 max: 2500
+ uint32 {4} - selected inventory item max: 32
+ uint32 {4*100*10} - positions by car(BlockedView)
+ uint32 {4*16} - compartments (BlockedX)
+ uint32 {4*16} - compartments? (SoftBlockedX)
+ uint32 {4*128} - game progress
+ byte {512} - game events
+ byte {7*32} - inventory
+ byte {5*128} - objects
+ byte {1262*40} - entities (characters and train entities)
+
+ uint32 {4} - sound queue state
+ uint32 {4} - ??
+ uint32 {4} - number of sound entries
+ byte {count*68} - sound entries
+
+ byte {16*128} - save point data
+ uint32 {4} - number of save points (max: 128)
+ byte {count*16} - save points
... more unknown stuff
@@ -167,7 +167,7 @@ public:
bool isGameFinished(uint32 menuIndex, uint32 savegameIndex);
// Accessors
- uint32 getTime(uint32 index) { return getEntry(index)->time; }
+ uint32 getTime(uint32 index) { return getEntry(index)->time; }
ChapterIndex getChapter(uint32 index) { return getEntry(index)->chapter; }
uint32 getValue(uint32 index) { return getEntry(index)->value; }
uint32 getLastSavegameTicks() const { return _gameTicksLastSavegame; }
diff --git a/engines/lastexpress/game/savepoint.cpp b/engines/lastexpress/game/savepoint.cpp
index 8d14ec386b..b0186a4ccc 100644
--- a/engines/lastexpress/game/savepoint.cpp
+++ b/engines/lastexpress/game/savepoint.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/lastexpress/game/savepoint.h b/engines/lastexpress/game/savepoint.h
index 005133891a..068c54eb0f 100644
--- a/engines/lastexpress/game/savepoint.h
+++ b/engines/lastexpress/game/savepoint.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/lastexpress/game/scenes.cpp b/engines/lastexpress/game/scenes.cpp
index 82688fff2e..0d8f51af6e 100644
--- a/engines/lastexpress/game/scenes.cpp
+++ b/engines/lastexpress/game/scenes.cpp
@@ -579,7 +579,7 @@ void SceneManager::updateDoorsAndClock() {
for (ObjectIndex index = firstIndex; index < (ObjectIndex)(firstIndex + 8); index = (ObjectIndex)(index + 1)) {
// Doors is not open, nothing to do
- if (getObjects()->get(index).location != kObjectLocation2)
+ if (getObjects()->get(index).status != kObjectLocation2)
continue;
// Load door sequence
@@ -842,11 +842,11 @@ void SceneManager::preProcessScene(SceneIndex *index) {
if (object >= kObjectMax)
break;
- if (getObjects()->get(object).location == kObjectLocationNone)
+ if (getObjects()->get(object).status == kObjectLocationNone)
break;
for (Common::Array<SceneHotspot *>::iterator it = scene->getHotspots()->begin(); it != scene->getHotspots()->end(); ++it) {
- if (getObjects()->get(object).location != (*it)->location)
+ if (getObjects()->get(object).status != (*it)->location)
continue;
PROCESS_HOTSPOT_SCENE(*it, index);
@@ -920,7 +920,7 @@ void SceneManager::preProcessScene(SceneIndex *index) {
int location = kObjectLocationNone;
- if (getObjects()->get(object).location == kObjectLocation2)
+ if (getObjects()->get(object).status == kObjectLocation2)
location = kObjectLocation1;
if (getInventory()->get(item)->location != kObjectLocationNone)
@@ -933,7 +933,7 @@ void SceneManager::preProcessScene(SceneIndex *index) {
if (location != (*it)->location)
continue;
- if (getObjects()->get(object).location != (*it)->param1)
+ if (getObjects()->get(object).status != (*it)->param1)
continue;
if (getInventory()->get(item)->location != (*it)->param2)
@@ -994,7 +994,7 @@ void SceneManager::preProcessScene(SceneIndex *index) {
bool found = false;
for (Common::Array<SceneHotspot *>::iterator it = scene->getHotspots()->begin(); it != scene->getHotspots()->end(); ++it) {
- if (getObjects()->get(object).location2 != (*it)->location)
+ if (getObjects()->get(object).model != (*it)->location)
continue;
PROCESS_HOTSPOT_SCENE(*it, index);
diff --git a/engines/lastexpress/game/state.cpp b/engines/lastexpress/game/state.cpp
index 02ede25595..e47eda5ebd 100644
--- a/engines/lastexpress/game/state.cpp
+++ b/engines/lastexpress/game/state.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/lastexpress/game/state.h b/engines/lastexpress/game/state.h
index 944f6d47b1..38cd851aaa 100644
--- a/engines/lastexpress/game/state.h
+++ b/engines/lastexpress/game/state.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -657,12 +657,12 @@ private:
// Timer
int _timer;
- Flags *_flags; ///< Flags
- Inventory *_inventory; ///< Inventory
- Objects *_objects; ///< Objects
- SavePoints *_savepoints; ///< SavePoints
- GameState *_state; ///< State
- Common::Point _coords; ///< Current coordinates
+ Flags *_flags; ///< Flags
+ Inventory *_inventory; ///< Inventory
+ Objects *_objects; ///< Objects
+ SavePoints *_savepoints; ///< SavePoints
+ GameState *_state; ///< State
+ Common::Point _coords; ///< Current coordinates
};
} // End of namespace LastExpress
diff --git a/engines/lastexpress/graphics.cpp b/engines/lastexpress/graphics.cpp
index 9ced38a2e1..74e1efaa8b 100644
--- a/engines/lastexpress/graphics.cpp
+++ b/engines/lastexpress/graphics.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/lastexpress/graphics.h b/engines/lastexpress/graphics.h
index 7db7e88989..843bfd6e22 100644
--- a/engines/lastexpress/graphics.h
+++ b/engines/lastexpress/graphics.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/lastexpress/helpers.h b/engines/lastexpress/helpers.h
index 02454be13d..6f94cf2a14 100644
--- a/engines/lastexpress/helpers.h
+++ b/engines/lastexpress/helpers.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/lastexpress/lastexpress.cpp b/engines/lastexpress/lastexpress.cpp
index bc1624d171..293c3ab725 100644
--- a/engines/lastexpress/lastexpress.cpp
+++ b/engines/lastexpress/lastexpress.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/lastexpress/lastexpress.h b/engines/lastexpress/lastexpress.h
index 1431b79b9f..b4098f3860 100644
--- a/engines/lastexpress/lastexpress.h
+++ b/engines/lastexpress/lastexpress.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/lastexpress/menu/clock.cpp b/engines/lastexpress/menu/clock.cpp
index dedf045940..fadb578de6 100644
--- a/engines/lastexpress/menu/clock.cpp
+++ b/engines/lastexpress/menu/clock.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/lastexpress/menu/clock.h b/engines/lastexpress/menu/clock.h
index 339a18604f..248f2439af 100644
--- a/engines/lastexpress/menu/clock.h
+++ b/engines/lastexpress/menu/clock.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/lastexpress/menu/menu.cpp b/engines/lastexpress/menu/menu.cpp
index c48e55bb55..cbd2a4a819 100644
--- a/engines/lastexpress/menu/menu.cpp
+++ b/engines/lastexpress/menu/menu.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/lastexpress/menu/menu.h b/engines/lastexpress/menu/menu.h
index 4b84c065cb..5943c940ca 100644
--- a/engines/lastexpress/menu/menu.h
+++ b/engines/lastexpress/menu/menu.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/lastexpress/menu/trainline.cpp b/engines/lastexpress/menu/trainline.cpp
index f819776163..fe6c7ca979 100644
--- a/engines/lastexpress/menu/trainline.cpp
+++ b/engines/lastexpress/menu/trainline.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/lastexpress/menu/trainline.h b/engines/lastexpress/menu/trainline.h
index af6a121e9c..bad01610e9 100644
--- a/engines/lastexpress/menu/trainline.h
+++ b/engines/lastexpress/menu/trainline.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/lastexpress/resource.cpp b/engines/lastexpress/resource.cpp
index 1d010355ac..2a48778c18 100644
--- a/engines/lastexpress/resource.cpp
+++ b/engines/lastexpress/resource.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/lastexpress/resource.h b/engines/lastexpress/resource.h
index 90ac9b87ad..ddda4d6eb7 100644
--- a/engines/lastexpress/resource.h
+++ b/engines/lastexpress/resource.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/lastexpress/shared.h b/engines/lastexpress/shared.h
index 56cf730e24..c0099db7ac 100644
--- a/engines/lastexpress/shared.h
+++ b/engines/lastexpress/shared.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -755,7 +755,7 @@ enum ClothesIndex {
};
//////////////////////////////////////////////////////////////////////////
-// Location of objects
+// Objects (doors)
//////////////////////////////////////////////////////////////////////////
enum ObjectLocation {
kObjectLocationNone = 0,
@@ -763,13 +763,27 @@ enum ObjectLocation {
kObjectLocation2 = 2, // Bed ?
kObjectLocation3 = 3,
kObjectLocation4 = 4, // Window ?
- kObjectLocation5 = 5,
- kObjectLocation6 = 6,
- kObjectLocation7 = 7,
- kObjectLocation8 = 8,
- kObjectLocation9 = 9,
- kObjectLocation10 = 10,
- kObjectLocation18 = 18
+ kObjectLocation5 = 5,
+ kObjectLocation6 = 6,
+ kObjectLocation7 = 7,
+ kObjectLocation8 = 8,
+ kObjectLocation9 = 9,
+ kObjectLocation10 = 10,
+ kObjectLocation18 = 18
+};
+
+enum ObjectModel {
+ kObjectModelNone = 0,
+ kObjectModel1 = 1,
+ kObjectModel2 = 2,
+ kObjectModel3 = 3,
+ kObjectModel4 = 4,
+ kObjectModel5 = 5,
+ kObjectModel6 = 6,
+ kObjectModel7 = 7,
+ kObjectModel8 = 8,
+ kObjectModel9 = 9,
+ kObjectModel10 = 10
};
//////////////////////////////////////////////////////////////////////////
diff --git a/engines/lastexpress/sound/entry.cpp b/engines/lastexpress/sound/entry.cpp
index 3d22657124..6bf1ebc9de 100644
--- a/engines/lastexpress/sound/entry.cpp
+++ b/engines/lastexpress/sound/entry.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/lastexpress/sound/entry.h b/engines/lastexpress/sound/entry.h
index a88b0b7210..d92b16a5dd 100644
--- a/engines/lastexpress/sound/entry.h
+++ b/engines/lastexpress/sound/entry.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/lastexpress/sound/queue.cpp b/engines/lastexpress/sound/queue.cpp
index 8904b48930..fe6d6f2251 100644
--- a/engines/lastexpress/sound/queue.cpp
+++ b/engines/lastexpress/sound/queue.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/lastexpress/sound/queue.h b/engines/lastexpress/sound/queue.h
index e1f9be1cf7..60c447596d 100644
--- a/engines/lastexpress/sound/queue.h
+++ b/engines/lastexpress/sound/queue.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/lastexpress/sound/sound.cpp b/engines/lastexpress/sound/sound.cpp
index 319f7cd4f4..5f55f4e74e 100644
--- a/engines/lastexpress/sound/sound.cpp
+++ b/engines/lastexpress/sound/sound.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -1323,7 +1323,7 @@ void SoundManager::playLoopingSound(int param) {
break;
if (getEntities()->isInsideCompartment(kEntityPlayer, getEntityData(kEntityPlayer)->car, positions[pos])) {
numLoops[0] = 1;
- partNumber = (getObjects()->get((ObjectIndex)objNum).location - 2) < 1 ? 6 : 1;
+ partNumber = (getObjects()->get((ObjectIndex)objNum).status - 2) < 1 ? 6 : 1;
}
objNum++;
}
diff --git a/engines/lastexpress/sound/sound.h b/engines/lastexpress/sound/sound.h
index 517543f470..81f1529286 100644
--- a/engines/lastexpress/sound/sound.h
+++ b/engines/lastexpress/sound/sound.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/lure/animseq.cpp b/engines/lure/animseq.cpp
index 8037563677..840b349fec 100644
--- a/engines/lure/animseq.cpp
+++ b/engines/lure/animseq.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/lure/animseq.h b/engines/lure/animseq.h
index fde1fab921..a220356f92 100644
--- a/engines/lure/animseq.h
+++ b/engines/lure/animseq.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/lure/configure.engine b/engines/lure/configure.engine
new file mode 100644
index 0000000000..e9f92893e3
--- /dev/null
+++ b/engines/lure/configure.engine
@@ -0,0 +1,3 @@
+# This file is included from the main "configure" script
+# add_engine [name] [desc] [build-by-default] [subengines] [base games] [deps]
+add_engine lure "Lure of the Temptress" yes
diff --git a/engines/lure/debugger.cpp b/engines/lure/debugger.cpp
index 92f07a566e..032186717d 100644
--- a/engines/lure/debugger.cpp
+++ b/engines/lure/debugger.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -35,20 +35,20 @@
namespace Lure {
Debugger::Debugger(): GUI::Debugger() {
- DCmd_Register("continue", WRAP_METHOD(Debugger, Cmd_Exit));
- DCmd_Register("enter", WRAP_METHOD(Debugger, cmd_enterRoom));
- DCmd_Register("rooms", WRAP_METHOD(Debugger, cmd_listRooms));
- DCmd_Register("fields", WRAP_METHOD(Debugger, cmd_listFields));
- DCmd_Register("setfield", WRAP_METHOD(Debugger, cmd_setField));
- DCmd_Register("queryfield", WRAP_METHOD(Debugger, cmd_queryField));
- DCmd_Register("give", WRAP_METHOD(Debugger, cmd_giveItem));
- DCmd_Register("hotspots", WRAP_METHOD(Debugger, cmd_hotspots));
- DCmd_Register("hotspot", WRAP_METHOD(Debugger, cmd_hotspot));
- DCmd_Register("room", WRAP_METHOD(Debugger, cmd_room));
- DCmd_Register("showanim", WRAP_METHOD(Debugger, cmd_showAnim));
- DCmd_Register("strings", WRAP_METHOD(Debugger, cmd_saveStrings));
- DCmd_Register("debug", WRAP_METHOD(Debugger, cmd_debug));
- DCmd_Register("script", WRAP_METHOD(Debugger, cmd_script));
+ registerCmd("continue", WRAP_METHOD(Debugger, cmdExit));
+ registerCmd("enter", WRAP_METHOD(Debugger, cmd_enterRoom));
+ registerCmd("rooms", WRAP_METHOD(Debugger, cmd_listRooms));
+ registerCmd("fields", WRAP_METHOD(Debugger, cmd_listFields));
+ registerCmd("setfield", WRAP_METHOD(Debugger, cmd_setField));
+ registerCmd("queryfield", WRAP_METHOD(Debugger, cmd_queryField));
+ registerCmd("give", WRAP_METHOD(Debugger, cmd_giveItem));
+ registerCmd("hotspots", WRAP_METHOD(Debugger, cmd_hotspots));
+ registerCmd("hotspot", WRAP_METHOD(Debugger, cmd_hotspot));
+ registerCmd("room", WRAP_METHOD(Debugger, cmd_room));
+ registerCmd("showanim", WRAP_METHOD(Debugger, cmd_showAnim));
+ registerCmd("strings", WRAP_METHOD(Debugger, cmd_saveStrings));
+ registerCmd("debug", WRAP_METHOD(Debugger, cmd_debug));
+ registerCmd("script", WRAP_METHOD(Debugger, cmd_script));
}
static int strToInt(const char *s) {
@@ -88,7 +88,7 @@ bool Debugger::cmd_enterRoom(int argc, const char **argv) {
// Validate that it's an existing room
if (res.getRoom(roomNumber) == NULL) {
- DebugPrintf("specified number was not a valid room\n");
+ debugPrintf("specified number was not a valid room\n");
return true;
}
@@ -105,9 +105,9 @@ bool Debugger::cmd_enterRoom(int argc, const char **argv) {
return false;
}
- DebugPrintf("Syntax: room <roomnum> [<remoteview>]\n");
- DebugPrintf("A non-zero value for reomteview will change the room without ");
- DebugPrintf("moving the player.\n");
+ debugPrintf("Syntax: room <roomnum> [<remoteview>]\n");
+ debugPrintf("A non-zero value for reomteview will change the room without ");
+ debugPrintf("moving the player.\n");
return true;
}
@@ -117,7 +117,7 @@ bool Debugger::cmd_listRooms(int argc, const char **argv) {
char buffer[MAX_DESC_SIZE];
int ctr = 0;
- DebugPrintf("Available rooms are:\n");
+ debugPrintf("Available rooms are:\n");
for (RoomDataList::iterator i = rooms.begin(); i != rooms.end(); ++i) {
RoomData const &room = **i;
// Explictly note the second drawbridge room as "Alt"
@@ -128,20 +128,20 @@ bool Debugger::cmd_listRooms(int argc, const char **argv) {
strings.getString(room.roomNumber, buffer);
}
- DebugPrintf("#%d - %s", room.roomNumber, buffer);
+ debugPrintf("#%d - %s", room.roomNumber, buffer);
- if (++ctr % 3 == 0) DebugPrintf("\n");
+ if (++ctr % 3 == 0) debugPrintf("\n");
else {
// Write out spaces between columns
int numSpaces = 25 - strlen(buffer) - (room.roomNumber >= 10 ? 2 : 1);
char *s = buffer;
while (numSpaces-- > 0) *s++ = ' ';
*s = '\0';
- DebugPrintf("%s", buffer);
+ debugPrintf("%s", buffer);
}
}
- DebugPrintf("\n");
- DebugPrintf("Current room: %d\n", Room::getReference().roomNumber());
+ debugPrintf("\n");
+ debugPrintf("Current room: %d\n", Room::getReference().roomNumber());
return true;
}
@@ -150,11 +150,11 @@ bool Debugger::cmd_listFields(int argc, const char **argv) {
ValueTableData &fields = Resources::getReference().fieldList();
for (int ctr = 0; ctr < fields.size(); ++ctr) {
- DebugPrintf("(%-2d): %-5d", ctr, fields.getField(ctr));
+ debugPrintf("(%-2d): %-5d", ctr, fields.getField(ctr));
if (!((ctr + 1) % 7))
- DebugPrintf("\n");
+ debugPrintf("\n");
}
- DebugPrintf("\n");
+ debugPrintf("\n");
return true;
}
@@ -167,13 +167,13 @@ bool Debugger::cmd_setField(int argc, const char **argv) {
if ((fieldNum < 0) || (fieldNum >= fields.size())) {
// Invalid field number
- DebugPrintf("Invalid field number specified\n");
+ debugPrintf("Invalid field number specified\n");
} else {
// Set the field value
fields.setField(fieldNum, value);
}
} else {
- DebugPrintf("Syntax: setfield <field_number> <value>\n");
+ debugPrintf("Syntax: setfield <field_number> <value>\n");
}
return true;
@@ -186,14 +186,14 @@ bool Debugger::cmd_queryField(int argc, const char **argv) {
int fieldNum = strToInt(argv[1]);
if ((fieldNum < 0) || (fieldNum >= fields.size())) {
// Invalid field number
- DebugPrintf("Invalid field number specified\n");
+ debugPrintf("Invalid field number specified\n");
} else {
// Get the field value
- DebugPrintf("Field %d is %d (%xh)\n", fieldNum,
+ debugPrintf("Field %d is %d (%xh)\n", fieldNum,
fields.getField(fieldNum), fields.getField(fieldNum));
}
} else {
- DebugPrintf("Syntax: queryfield <field_num>\n");
+ debugPrintf("Syntax: queryfield <field_num>\n");
}
return true;
@@ -215,18 +215,18 @@ bool Debugger::cmd_giveItem(int argc, const char **argv) {
charHotspot = res.getHotspot(charNum);
if (itemHotspot == NULL) {
- DebugPrintf("The specified item does not exist\n");
+ debugPrintf("The specified item does not exist\n");
} else if (itemNum < 0x408) {
- DebugPrintf("The specified item number is not an object\n");
+ debugPrintf("The specified item number is not an object\n");
} else if ((charNum < PLAYER_ID) || (charNum >= 0x408) ||
(charHotspot == NULL)) {
- DebugPrintf("The specified character does not exist");
+ debugPrintf("The specified character does not exist");
} else {
// Set the item's room number to be the destination character
itemHotspot->roomNumber = charNum;
}
} else {
- DebugPrintf("Syntax: give <item_id> [<character_id>]\n");
+ debugPrintf("Syntax: give <item_id> [<character_id>]\n");
}
return true;
@@ -248,7 +248,7 @@ bool Debugger::cmd_hotspots(int argc, const char **argv) {
if (hotspot.nameId() == 0) strcpy(buffer, "none");
else strings.getString(hotspot.nameId(), buffer);
- DebugPrintf("%4xh - %s pos=(%d,%d,%d)\n", hotspot.hotspotId(), buffer,
+ debugPrintf("%4xh - %s pos=(%d,%d,%d)\n", hotspot.hotspotId(), buffer,
hotspot.x(), hotspot.y(), hotspot.roomNumber());
}
} else {
@@ -263,16 +263,16 @@ bool Debugger::cmd_hotspots(int argc, const char **argv) {
if (hotspot.nameId == 0) strcpy(buffer, "none");
else strings.getString(hotspot.nameId, buffer);
- DebugPrintf("%4xh - %s pos=(%d,%d,%d)\n", hotspot.hotspotId, buffer,
+ debugPrintf("%4xh - %s pos=(%d,%d,%d)\n", hotspot.hotspotId, buffer,
hotspot.startX, hotspot.startY, hotspot.roomNumber);
}
}
}
} else {
- DebugPrintf("Syntax: hotspots ['active' | ['room' | 'room' '<room_number>']]\n");
- DebugPrintf("Gives a list of all the currently active hotspots, or the hotspots\n");
- DebugPrintf("present in either the current room or a designated one\n");
+ debugPrintf("Syntax: hotspots ['active' | ['room' | 'room' '<room_number>']]\n");
+ debugPrintf("Gives a list of all the currently active hotspots, or the hotspots\n");
+ debugPrintf("present in either the current room or a designated one\n");
}
return true;
@@ -287,12 +287,12 @@ bool Debugger::cmd_hotspot(int argc, const char **argv) {
Hotspot *h;
if (argc < 2) {
- DebugPrintf("hotspot <hotspot_id> ['paths' | 'schedule' | 'actions' | 'activate' | 'deactivate' | 'setpos']\n");
+ debugPrintf("hotspot <hotspot_id> ['paths' | 'schedule' | 'actions' | 'activate' | 'deactivate' | 'setpos']\n");
return true;
}
hs = res.getHotspot(strToInt(argv[1]));
if (!hs) {
- DebugPrintf("Unknown hotspot specified\n");
+ debugPrintf("Unknown hotspot specified\n");
return true;
}
@@ -300,26 +300,26 @@ bool Debugger::cmd_hotspot(int argc, const char **argv) {
if (argc == 2) {
// Show the hotspot properties
strings.getString(hs->nameId, buffer);
- DebugPrintf("name = %d - %s, descs = (%d,%d)\n", hs->nameId, buffer,
+ debugPrintf("name = %d - %s, descs = (%d,%d)\n", hs->nameId, buffer,
hs->descId, hs->descId2);
- DebugPrintf("actions = %xh, offset = %xh\n", hs->actions, hs->actionsOffset);
- DebugPrintf("flags = %xh, layer = %d\n", hs->flags, hs->layer);
- DebugPrintf("position = %d,%d,%d\n", hs->startX, hs->startY, hs->roomNumber);
- DebugPrintf("size = %d,%d, alt = %d,%d, yCorrection = %d\n",
+ debugPrintf("actions = %xh, offset = %xh\n", hs->actions, hs->actionsOffset);
+ debugPrintf("flags = %xh, layer = %d\n", hs->flags, hs->layer);
+ debugPrintf("position = %d,%d,%d\n", hs->startX, hs->startY, hs->roomNumber);
+ debugPrintf("size = %d,%d, alt = %d,%d, yCorrection = %d\n",
hs->width, hs->height, hs->widthCopy, hs->heightCopy, hs->yCorrection);
- DebugPrintf("Talk bubble offset = %d,%d\n", hs->talkX, hs->talkY);
- DebugPrintf("load offset = %xh, script load = %d\n", hs->loadOffset, hs->scriptLoadFlag);
- DebugPrintf("Animation Id = %xh, Color offset = %d\n", hs->animRecordId, hs->colorOffset);
- DebugPrintf("Talk Script offset = %xh, Tick Script offset = %xh\n",
+ debugPrintf("Talk bubble offset = %d,%d\n", hs->talkX, hs->talkY);
+ debugPrintf("load offset = %xh, script load = %d\n", hs->loadOffset, hs->scriptLoadFlag);
+ debugPrintf("Animation Id = %xh, Color offset = %d\n", hs->animRecordId, hs->colorOffset);
+ debugPrintf("Talk Script offset = %xh, Tick Script offset = %xh\n",
hs->talkScriptOffset, hs->tickScriptOffset);
- DebugPrintf("Tick Proc offset = %xh\n", hs->tickProcId);
- DebugPrintf("Tick timeout = %d\n", hs->tickTimeout);
- DebugPrintf("Character mode = %d, delay ctr = %d, pause ctr = %d\n",
+ debugPrintf("Tick Proc offset = %xh\n", hs->tickProcId);
+ debugPrintf("Tick timeout = %d\n", hs->tickTimeout);
+ debugPrintf("Character mode = %d, delay ctr = %d, pause ctr = %d\n",
hs->characterMode, hs->delayCtr, hs->pauseCtr);
if (h != NULL) {
- DebugPrintf("Frame Number = %d of %d\n", h->frameNumber(), h->numFrames());
- DebugPrintf("Persistent = %s\n", h->persistant() ? "true" : "false");
+ debugPrintf("Frame Number = %d of %d\n", h->frameNumber(), h->numFrames());
+ debugPrintf("Persistent = %s\n", h->persistant() ? "true" : "false");
}
} else if (strcmp(argv[2], "actions") == 0) {
@@ -329,42 +329,42 @@ bool Debugger::cmd_hotspot(int argc, const char **argv) {
const char *actionStr = stringList.getString(action);
if (offset >= 0x8000) {
- DebugPrintf("%s - Message %xh\n", actionStr, offset & 0x7ff);
+ debugPrintf("%s - Message %xh\n", actionStr, offset & 0x7ff);
} else if (offset != 0) {
- DebugPrintf("%s - Script %xh\n", actionStr, offset);
+ debugPrintf("%s - Script %xh\n", actionStr, offset);
}
}
} else if (strcmp(argv[2], "activate") == 0) {
// Activate the hotspot
res.activateHotspot(hs->hotspotId);
hs->flags &= ~HOTSPOTFLAG_MENU_EXCLUSION;
- DebugPrintf("Activated\n");
+ debugPrintf("Activated\n");
} else if (strcmp(argv[2], "deactivate") == 0) {
// Deactivate the hotspot
res.deactivateHotspot(hs->hotspotId);
hs->flags |= HOTSPOTFLAG_MENU_EXCLUSION;
- DebugPrintf("Deactivated\n");
+ debugPrintf("Deactivated\n");
} else {
if (strcmp(argv[2], "schedule") == 0) {
// List any current schedule for the character
- DebugPrintf("%s", hs->npcSchedule.getDebugInfo().c_str());
+ debugPrintf("%s", hs->npcSchedule.getDebugInfo().c_str());
}
if (!h)
- DebugPrintf("The specified hotspot is not currently active\n");
+ debugPrintf("The specified hotspot is not currently active\n");
else if (strcmp(argv[2], "paths") == 0) {
// List any paths for a charcter
- DebugPrintf("%s", h->pathFinder().getDebugInfo().c_str());
+ debugPrintf("%s", h->pathFinder().getDebugInfo().c_str());
}
else if (strcmp(argv[2], "pixels") == 0) {
// List the pixel data for the hotspot
HotspotAnimData &pData = h->anim();
- DebugPrintf("Record Id = %xh\n", pData.animRecordId);
- DebugPrintf("Flags = %d\n", pData.flags);
- DebugPrintf("Frames: up=%d down=%d left=%d right=%d\n",
+ debugPrintf("Record Id = %xh\n", pData.animRecordId);
+ debugPrintf("Flags = %d\n", pData.flags);
+ debugPrintf("Frames: up=%d down=%d left=%d right=%d\n",
pData.upFrame, pData.downFrame, pData.leftFrame, pData.rightFrame);
- DebugPrintf("Current frame = %d of %d\n", h->frameNumber(), h->numFrames());
+ debugPrintf("Current frame = %d of %d\n", h->frameNumber(), h->numFrames());
}
else if (strcmp(argv[2], "setpos") == 0) {
// Set the hotspot position
@@ -372,11 +372,11 @@ bool Debugger::cmd_hotspot(int argc, const char **argv) {
h->setPosition(strToInt(argv[3]), strToInt(argv[4]));
if (argc >= 6)
h->setRoomNumber(strToInt(argv[5]));
- DebugPrintf("Done.\n");
+ debugPrintf("Done.\n");
}
}
- DebugPrintf("\n");
+ debugPrintf("\n");
return true;
}
@@ -388,56 +388,56 @@ bool Debugger::cmd_room(int argc, const char **argv) {
char buffer[MAX_DESC_SIZE];
if (argc < 2) {
- DebugPrintf("room <room_number>\n");
+ debugPrintf("room <room_number>\n");
return true;
}
int roomNumber = strToInt(argv[1]);
RoomData *room = res.getRoom(roomNumber);
if (!room) {
- DebugPrintf("Unknown room specified\n");
+ debugPrintf("Unknown room specified\n");
return true;
}
// Show the room details
strings.getString(roomNumber, buffer);
- DebugPrintf("room #%d - %s\n", roomNumber, buffer);
+ debugPrintf("room #%d - %s\n", roomNumber, buffer);
strings.getString(room->descId, buffer);
- DebugPrintf("%s\n", buffer);
- DebugPrintf("Horizontal clipping = %d->%d walk area=(%d,%d)-(%d,%d)\n",
+ debugPrintf("%s\n", buffer);
+ debugPrintf("Horizontal clipping = %d->%d walk area=(%d,%d)-(%d,%d)\n",
room->clippingXStart, room->clippingXEnd,
room->walkBounds.left, room->walkBounds.top,
room->walkBounds.right, room->walkBounds.bottom);
- DebugPrintf("Exit hotspots:");
+ debugPrintf("Exit hotspots:");
RoomExitHotspotList &exits = room->exitHotspots;
if (exits.empty())
- DebugPrintf(" none\n");
+ debugPrintf(" none\n");
else {
RoomExitHotspotList::iterator i;
for (i = exits.begin(); i != exits.end(); ++i) {
RoomExitHotspotData const &rec = **i;
- DebugPrintf("\nArea - (%d,%d)-(%d,%d) Room=%d Cursor=%d Hotspot=%xh",
+ debugPrintf("\nArea - (%d,%d)-(%d,%d) Room=%d Cursor=%d Hotspot=%xh",
rec.xs, rec.ys, rec.xe, rec.ye, rec.destRoomNumber, rec.cursorNum, rec.hotspotId);
}
- DebugPrintf("\n");
+ debugPrintf("\n");
}
- DebugPrintf("Room exits:");
+ debugPrintf("Room exits:");
if (room->exits.empty())
- DebugPrintf(" none\n");
+ debugPrintf(" none\n");
else {
RoomExitList::iterator i2;
for (i2 = room->exits.begin(); i2 != room->exits.end(); ++i2) {
RoomExitData const &rec2 = **i2;
- DebugPrintf("\nExit - (%d,%d)-(%d,%d) Dest=%d,(%d,%d) Dir=%s Sequence=%xh",
+ debugPrintf("\nExit - (%d,%d)-(%d,%d) Dest=%d,(%d,%d) Dir=%s Sequence=%xh",
rec2.xs, rec2.ys, rec2.xe, rec2.ye, rec2.roomNumber,
rec2.x, rec2.y, directionList[rec2.direction], rec2.sequenceOffset);
}
- DebugPrintf("\n");
+ debugPrintf("\n");
}
return true;
@@ -446,7 +446,7 @@ bool Debugger::cmd_room(int argc, const char **argv) {
bool Debugger::cmd_showAnim(int argc, const char **argv) {
Resources &res = Resources::getReference();
if (argc < 2) {
- DebugPrintf("showAnim animId [[frame_width frame_height] | list]\n");
+ debugPrintf("showAnim animId [[frame_width frame_height] | list]\n");
return true;
}
@@ -454,7 +454,7 @@ bool Debugger::cmd_showAnim(int argc, const char **argv) {
int animId = strToInt(argv[1]);
HotspotAnimData *data = res.getAnimation(animId);
if (data == NULL) {
- DebugPrintf("No such animation Id exists\n");
+ debugPrintf("No such animation Id exists\n");
return true;
}
@@ -500,7 +500,7 @@ bool Debugger::cmd_showAnim(int argc, const char **argv) {
height = strToInt(argv[3]);
if ((width * height) != (frameSize * 2)) {
- DebugPrintf("Warning: Total size = %d, Frame size (%d,%d) * %d frames = %d bytes\n",
+ debugPrintf("Warning: Total size = %d, Frame size (%d,%d) * %d frames = %d bytes\n",
destSize, width, height, numFrames, width * height * numFrames / 2);
}
} else {
@@ -511,25 +511,25 @@ bool Debugger::cmd_showAnim(int argc, const char **argv) {
width = frameSize * 3 / 4;
bool descFlag = (argc == 3);
- if (descFlag) DebugPrintf("Target size = %d\n", frameSize * 2);
+ if (descFlag) debugPrintf("Target size = %d\n", frameSize * 2);
while ((width > 0) && (descFlag || (((frameSize * 2) % width) != 0))) {
if (((frameSize * 2) % width) == 0)
- DebugPrintf("Frame size (%d,%d) found\n", width, frameSize * 2 / width);
+ debugPrintf("Frame size (%d,%d) found\n", width, frameSize * 2 / width);
--width;
}
if (argc == 3) {
- DebugPrintf("Done\n");
+ debugPrintf("Done\n");
return true;
} else if (width == 0) {
- DebugPrintf("Total size = %d, # frames = %d, frame Size = %d - No valid frame dimensions\n",
+ debugPrintf("Total size = %d, # frames = %d, frame Size = %d - No valid frame dimensions\n",
destSize, numFrames, frameSize);
return true;
}
height = (frameSize * 2) / width;
- DebugPrintf("# frames = %d, guestimated frame size = (%d,%d)\n",
+ debugPrintf("# frames = %d, guestimated frame size = (%d,%d)\n",
numFrames, width, height);
}
@@ -544,13 +544,13 @@ bool Debugger::cmd_showAnim(int argc, const char **argv) {
hotspot->setAnimation(animId);
- DebugPrintf("Done\n");
+ debugPrintf("Done\n");
return true;
}
bool Debugger::cmd_saveStrings(int argc, const char **argv) {
if (argc != 2) {
- DebugPrintf("strings <stringId>\n");
+ debugPrintf("strings <stringId>\n");
return true;
}
@@ -558,13 +558,13 @@ bool Debugger::cmd_saveStrings(int argc, const char **argv) {
char *buffer = (char *)malloc(32768);
if (!buffer) {
- DebugPrintf("Cannot allocate strings buffer\n");
+ debugPrintf("Cannot allocate strings buffer\n");
return true;
}
uint16 id = strToInt(argv[1]);
- strings.getString(id, buffer, NULL, NULL);
- DebugPrintf("%s\n", buffer);
+ strings.getString(id, buffer);
+ debugPrintf("%s\n", buffer);
/* Commented out code for saving all text strings - note that 0x1000 is chosen
* arbitrarily, so there'll be a bunch of garbage at the end, or the game will crash
@@ -580,7 +580,7 @@ bool Debugger::cmd_saveStrings(int argc, const char **argv) {
fclose(f);
- DebugPrintf("Done\n");
+ debugPrintf("Done\n");
*/
free(buffer);
@@ -593,16 +593,16 @@ bool Debugger::cmd_debug(int argc, const char **argv) {
Room &room = Room::getReference();
if ((argc == 2) && (strcmp(argv[1], "on") == 0)) {
- DebugPrintf("debug keys are on\n");
+ debugPrintf("debug keys are on\n");
game.debugFlag() = true;
} else if ((argc == 2) && (strcmp(argv[1], "off") == 0)) {
- DebugPrintf("debug keys are off\n");
+ debugPrintf("debug keys are off\n");
game.debugFlag() = false;
room.setShowInfo(false);
} else {
- DebugPrintf("debug [on | off]]\n");
+ debugPrintf("debug [on | off]]\n");
}
return true;
@@ -610,13 +610,13 @@ bool Debugger::cmd_debug(int argc, const char **argv) {
bool Debugger::cmd_script(int argc, const char **argv) {
if (argc < 2) {
- DebugPrintf("script <script number> [param 1] [param 2] [param 3] [exit flag]\n");
+ debugPrintf("script <script number> [param 1] [param 2] [param 3] [exit flag]\n");
return true;
}
int scriptNumber = strToInt(argv[1]);
if ((scriptNumber < 0) || (scriptNumber > 66)) {
- DebugPrintf("An invalid script number was specified\n");
+ debugPrintf("An invalid script number was specified\n");
return true;
}
@@ -629,7 +629,7 @@ bool Debugger::cmd_script(int argc, const char **argv) {
param3 = strToInt(argv[4]);
Script::executeMethod(scriptNumber, param1, param2, param3);
- DebugPrintf("Script executed\n");
+ debugPrintf("Script executed\n");
return true;
}
diff --git a/engines/lure/debugger.h b/engines/lure/debugger.h
index a4d4d689c4..a5360f2ed8 100644
--- a/engines/lure/debugger.h
+++ b/engines/lure/debugger.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/lure/decode.cpp b/engines/lure/decode.cpp
index 484126c43f..6ad723a8e6 100644
--- a/engines/lure/decode.cpp
+++ b/engines/lure/decode.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/lure/decode.h b/engines/lure/decode.h
index 93f617af7e..6b5e49fa22 100644
--- a/engines/lure/decode.h
+++ b/engines/lure/decode.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/lure/detection.cpp b/engines/lure/detection.cpp
index 64d26c4c04..a87fcf6945 100644
--- a/engines/lure/detection.cpp
+++ b/engines/lure/detection.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/lure/disk.cpp b/engines/lure/disk.cpp
index 552da73f18..eebf299497 100644
--- a/engines/lure/disk.cpp
+++ b/engines/lure/disk.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/lure/disk.h b/engines/lure/disk.h
index 1872fbd055..859e338c18 100644
--- a/engines/lure/disk.h
+++ b/engines/lure/disk.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/lure/events.cpp b/engines/lure/events.cpp
index fe60b56658..9b7e501d55 100644
--- a/engines/lure/events.cpp
+++ b/engines/lure/events.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/lure/events.h b/engines/lure/events.h
index dd3f82fe19..2a392c816d 100644
--- a/engines/lure/events.h
+++ b/engines/lure/events.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/lure/fights.cpp b/engines/lure/fights.cpp
index ab5d992bdb..ed3e2d7ef0 100644
--- a/engines/lure/fights.cpp
+++ b/engines/lure/fights.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/lure/fights.h b/engines/lure/fights.h
index 89f49d8c6d..32a99d7b74 100644
--- a/engines/lure/fights.h
+++ b/engines/lure/fights.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/lure/game.cpp b/engines/lure/game.cpp
index eaed7ebbe7..efd33b6176 100644
--- a/engines/lure/game.cpp
+++ b/engines/lure/game.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/lure/game.h b/engines/lure/game.h
index 42818e404b..ddf9fac24b 100644
--- a/engines/lure/game.h
+++ b/engines/lure/game.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/lure/hotspots.cpp b/engines/lure/hotspots.cpp
index d0b439677d..fbf93e1e14 100644
--- a/engines/lure/hotspots.cpp
+++ b/engines/lure/hotspots.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/lure/hotspots.h b/engines/lure/hotspots.h
index 85d36dc138..5411a83832 100644
--- a/engines/lure/hotspots.h
+++ b/engines/lure/hotspots.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/lure/intro.cpp b/engines/lure/intro.cpp
index ce330be7c4..fc02e10667 100644
--- a/engines/lure/intro.cpp
+++ b/engines/lure/intro.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/lure/intro.h b/engines/lure/intro.h
index ad442f1564..bde073e43c 100644
--- a/engines/lure/intro.h
+++ b/engines/lure/intro.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/lure/lure.cpp b/engines/lure/lure.cpp
index 3217cf039d..45fe0af025 100644
--- a/engines/lure/lure.cpp
+++ b/engines/lure/lure.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/lure/lure.h b/engines/lure/lure.h
index 34bb9f1639..8a8299381e 100644
--- a/engines/lure/lure.h
+++ b/engines/lure/lure.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/lure/luredefs.h b/engines/lure/luredefs.h
index 91fb650af3..7b39710798 100644
--- a/engines/lure/luredefs.h
+++ b/engines/lure/luredefs.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/lure/memory.cpp b/engines/lure/memory.cpp
index 137a8f6bee..1d838b65d0 100644
--- a/engines/lure/memory.cpp
+++ b/engines/lure/memory.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/lure/memory.h b/engines/lure/memory.h
index 05bf23a9ab..3594260901 100644
--- a/engines/lure/memory.h
+++ b/engines/lure/memory.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/lure/menu.cpp b/engines/lure/menu.cpp
index 7564ce91a0..8867e8a626 100644
--- a/engines/lure/menu.cpp
+++ b/engines/lure/menu.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -31,7 +31,7 @@
#include "lure/events.h"
#include "lure/lure.h"
-#if defined(_WIN32_WCE) || defined(__SYMBIAN32__) || defined(WEBOS) || defined(__ANDROID__)
+#if defined(_WIN32_WCE) || defined(__SYMBIAN32__) || defined(WEBOS) || defined(__ANDROID__) || defined(__WII__)
#define LURE_CLICKABLE_MENUS
#endif
diff --git a/engines/lure/menu.h b/engines/lure/menu.h
index b3016f0560..a6113f009b 100644
--- a/engines/lure/menu.h
+++ b/engines/lure/menu.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/lure/palette.cpp b/engines/lure/palette.cpp
index 3975561749..30a5752366 100644
--- a/engines/lure/palette.cpp
+++ b/engines/lure/palette.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/lure/palette.h b/engines/lure/palette.h
index 2af1f55973..8e1e92ac8d 100644
--- a/engines/lure/palette.h
+++ b/engines/lure/palette.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/lure/res.cpp b/engines/lure/res.cpp
index 9ec641140b..6b2705463d 100644
--- a/engines/lure/res.cpp
+++ b/engines/lure/res.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/lure/res.h b/engines/lure/res.h
index a0a908f53d..9002ca3056 100644
--- a/engines/lure/res.h
+++ b/engines/lure/res.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/lure/res_struct.cpp b/engines/lure/res_struct.cpp
index 15e7c1302d..5a4761c87b 100644
--- a/engines/lure/res_struct.cpp
+++ b/engines/lure/res_struct.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/lure/res_struct.h b/engines/lure/res_struct.h
index a4d2f76cec..9190912f5b 100644
--- a/engines/lure/res_struct.h
+++ b/engines/lure/res_struct.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/lure/room.cpp b/engines/lure/room.cpp
index 26d15dd025..1be95ba3d4 100644
--- a/engines/lure/room.cpp
+++ b/engines/lure/room.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/lure/room.h b/engines/lure/room.h
index deafa28a66..c5eba7185e 100644
--- a/engines/lure/room.h
+++ b/engines/lure/room.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/lure/screen.cpp b/engines/lure/screen.cpp
index 4eb6fd46a3..e867459f8b 100644
--- a/engines/lure/screen.cpp
+++ b/engines/lure/screen.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/lure/screen.h b/engines/lure/screen.h
index 2a2fa6b2f2..2e3b0d4e49 100644
--- a/engines/lure/screen.h
+++ b/engines/lure/screen.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/lure/scripts.cpp b/engines/lure/scripts.cpp
index 8afdaa5ad1..3df119a9da 100644
--- a/engines/lure/scripts.cpp
+++ b/engines/lure/scripts.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/lure/scripts.h b/engines/lure/scripts.h
index 7bc8f8c950..2a400cc8d1 100644
--- a/engines/lure/scripts.h
+++ b/engines/lure/scripts.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/lure/sound.cpp b/engines/lure/sound.cpp
index 298483bed8..bea0dbf9f4 100644
--- a/engines/lure/sound.cpp
+++ b/engines/lure/sound.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/lure/sound.h b/engines/lure/sound.h
index 365a7ccdb6..74b28c33b4 100644
--- a/engines/lure/sound.h
+++ b/engines/lure/sound.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/lure/strings.cpp b/engines/lure/strings.cpp
index 0c9f4b5352..dbe2f786b4 100644
--- a/engines/lure/strings.cpp
+++ b/engines/lure/strings.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/lure/strings.h b/engines/lure/strings.h
index e32921ddb6..d2c2a03ae1 100644
--- a/engines/lure/strings.h
+++ b/engines/lure/strings.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/lure/surface.cpp b/engines/lure/surface.cpp
index 0f13d87fbc..17ac17814f 100644
--- a/engines/lure/surface.cpp
+++ b/engines/lure/surface.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/lure/surface.h b/engines/lure/surface.h
index d56e37632b..3cda09bf56 100644
--- a/engines/lure/surface.h
+++ b/engines/lure/surface.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/made/configure.engine b/engines/made/configure.engine
new file mode 100644
index 0000000000..2266712338
--- /dev/null
+++ b/engines/made/configure.engine
@@ -0,0 +1,3 @@
+# This file is included from the main "configure" script
+# add_engine [name] [desc] [build-by-default] [subengines] [base games] [deps]
+add_engine made "MADE" yes
diff --git a/engines/made/console.cpp b/engines/made/console.cpp
index 0076b6a4f9..f3d6b3d274 100644
--- a/engines/made/console.cpp
+++ b/engines/made/console.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/made/console.h b/engines/made/console.h
index 8b8484cb5c..9a1e0b247b 100644
--- a/engines/made/console.h
+++ b/engines/made/console.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/made/database.cpp b/engines/made/database.cpp
index 7c8f9bdd0c..85a8a5ca4a 100644
--- a/engines/made/database.cpp
+++ b/engines/made/database.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/made/database.h b/engines/made/database.h
index 89b4b45357..57e9fecdd5 100644
--- a/engines/made/database.h
+++ b/engines/made/database.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/made/detection.cpp b/engines/made/detection.cpp
index e8b755cb40..7adc3e1f98 100644
--- a/engines/made/detection.cpp
+++ b/engines/made/detection.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -211,77 +211,77 @@ static const MadeGameDescription gameDescriptions[] = {
3,
},
- {
- // Return to Zork - Italian CD version 1.2 3/31/95 (installed)
+ {
+ // Return to Zork - Italian CD version 1.2 3/31/95 (installed)
// Patch #2685032 submitted by goodoldgeorg
- {
- "rtz",
- "V1.2, 3/31/95, installed, CD",
- AD_ENTRY1s("rtzcd.dat", "5b86035aed0277f96e3d173542b5364a", 523776),
- Common::IT_ITA,
- Common::kPlatformDOS,
+ {
+ "rtz",
+ "V1.2, 3/31/95, installed, CD",
+ AD_ENTRY1s("rtzcd.dat", "5b86035aed0277f96e3d173542b5364a", 523776),
+ Common::IT_ITA,
+ Common::kPlatformDOS,
ADGF_CD,
GUIO0()
- },
- GID_RTZ,
- 0,
- GF_CD,
- 3,
- },
+ },
+ GID_RTZ,
+ 0,
+ GF_CD,
+ 3,
+ },
{
- // Return to Zork - Italian CD version 1.2 3/31/95
+ // Return to Zork - Italian CD version 1.2 3/31/95
// Patch #2685032 submitted by goodoldgeorg
- {
- "rtz",
- "V1.2, 3/31/95, CD",
- AD_ENTRY1s("rtzcd.red", "946997d8b0aa6cb4e848bad02a1fc3d2", 354971),
- Common::IT_ITA,
- Common::kPlatformDOS,
+ {
+ "rtz",
+ "V1.2, 3/31/95, CD",
+ AD_ENTRY1s("rtzcd.red", "946997d8b0aa6cb4e848bad02a1fc3d2", 354971),
+ Common::IT_ITA,
+ Common::kPlatformDOS,
ADGF_CD,
GUIO0()
- },
- GID_RTZ,
- 0,
- GF_CD_COMPRESSED,
- 3,
- },
-
- {
- // Return to Zork - French CD version 1.2 5/13/95 (installed)
+ },
+ GID_RTZ,
+ 0,
+ GF_CD_COMPRESSED,
+ 3,
+ },
+
+ {
+ // Return to Zork - French CD version 1.2 5/13/95 (installed)
// Patch #2685032 submitted by goodoldgeorg
- {
- "rtz",
- "V1.2, 5/13/95, installed, CD",
- AD_ENTRY1s("rtzcd.dat", "bde8251a8e34e87c54e3f93147d56c9e", 523776),
- Common::FR_FRA,
- Common::kPlatformDOS,
+ {
+ "rtz",
+ "V1.2, 5/13/95, installed, CD",
+ AD_ENTRY1s("rtzcd.dat", "bde8251a8e34e87c54e3f93147d56c9e", 523776),
+ Common::FR_FRA,
+ Common::kPlatformDOS,
ADGF_CD,
GUIO0()
- },
- GID_RTZ,
- 0,
- GF_CD,
- 3,
- },
-
- {
- // Return to Zork - French CD version 1.2 5/13/95
+ },
+ GID_RTZ,
+ 0,
+ GF_CD,
+ 3,
+ },
+
+ {
+ // Return to Zork - French CD version 1.2 5/13/95
// Patch #2685032 submitted by goodoldgeorg
- {
- "rtz",
- "V1.2, 3/31/95, CD",
- AD_ENTRY1s("rtzcd.red", "946997d8b0aa6cb4e848bad02a1fc3d2", 354614),
- Common::FR_FRA,
- Common::kPlatformDOS,
+ {
+ "rtz",
+ "V1.2, 3/31/95, CD",
+ AD_ENTRY1s("rtzcd.red", "946997d8b0aa6cb4e848bad02a1fc3d2", 354614),
+ Common::FR_FRA,
+ Common::kPlatformDOS,
ADGF_CD,
GUIO0()
- },
- GID_RTZ,
- 0,
- GF_CD_COMPRESSED,
- 3,
- },
+ },
+ GID_RTZ,
+ 0,
+ GF_CD_COMPRESSED,
+ 3,
+ },
{
// Return to Zork - English floppy version
diff --git a/engines/made/graphics.cpp b/engines/made/graphics.cpp
index a8e33774f6..100f7b5c46 100644
--- a/engines/made/graphics.cpp
+++ b/engines/made/graphics.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/made/graphics.h b/engines/made/graphics.h
index 15704c7792..7f079891a2 100644
--- a/engines/made/graphics.h
+++ b/engines/made/graphics.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/made/made.cpp b/engines/made/made.cpp
index 3843040961..af8156fc3e 100644
--- a/engines/made/made.cpp
+++ b/engines/made/made.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -85,7 +85,7 @@ MadeEngine::MadeEngine(OSystem *syst, const MadeGameDescription *gameDesc) : Eng
_script = new ScriptInterpreter(this);
- _music = new MusicPlayer();
+ _music = nullptr;
// Set default sound frequency
switch (getGameID()) {
@@ -102,8 +102,6 @@ MadeEngine::MadeEngine(OSystem *syst, const MadeGameDescription *gameDesc) : Eng
// Return to Zork sets it itself via a script funtion
break;
}
-
- syncSoundSettings();
}
MadeEngine::~MadeEngine() {
@@ -277,6 +275,8 @@ void MadeEngine::handleEvents() {
}
Common::Error MadeEngine::run() {
+ _music = new MusicPlayer();
+ syncSoundSettings();
// Initialize backend
initGraphics(320, 200, false);
diff --git a/engines/made/made.h b/engines/made/made.h
index c0b86bb0a8..da251c6242 100644
--- a/engines/made/made.h
+++ b/engines/made/made.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/made/music.cpp b/engines/made/music.cpp
index 04ac13eeda..b2917b58ed 100644
--- a/engines/made/music.cpp
+++ b/engines/made/music.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/made/music.h b/engines/made/music.h
index 3cfbd50ce7..95d1bd35c1 100644
--- a/engines/made/music.h
+++ b/engines/made/music.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/made/pmvplayer.cpp b/engines/made/pmvplayer.cpp
index 573ff7faf1..3cac017e10 100644
--- a/engines/made/pmvplayer.cpp
+++ b/engines/made/pmvplayer.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/made/pmvplayer.h b/engines/made/pmvplayer.h
index 3821ca8de1..cf06d67391 100644
--- a/engines/made/pmvplayer.h
+++ b/engines/made/pmvplayer.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/made/redreader.cpp b/engines/made/redreader.cpp
index 7e92cfe71b..f5e6ca85b3 100644
--- a/engines/made/redreader.cpp
+++ b/engines/made/redreader.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/made/redreader.h b/engines/made/redreader.h
index 3025d31ce1..28505d09c0 100644
--- a/engines/made/redreader.h
+++ b/engines/made/redreader.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/made/resource.cpp b/engines/made/resource.cpp
index 28fee8ce57..1bb328c7a2 100644
--- a/engines/made/resource.cpp
+++ b/engines/made/resource.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/made/resource.h b/engines/made/resource.h
index a789069272..c573ec75d7 100644
--- a/engines/made/resource.h
+++ b/engines/made/resource.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/made/screen.cpp b/engines/made/screen.cpp
index 30848e8ec1..c27b781dda 100644
--- a/engines/made/screen.cpp
+++ b/engines/made/screen.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/made/screen.h b/engines/made/screen.h
index 266ac3811d..35d80663c6 100644
--- a/engines/made/screen.h
+++ b/engines/made/screen.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/made/screenfx.cpp b/engines/made/screenfx.cpp
index d069308a4b..2a155d67ac 100644
--- a/engines/made/screenfx.cpp
+++ b/engines/made/screenfx.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -165,7 +165,7 @@ void ScreenEffects::flash(int flashCount, byte *palette, int colorCount) {
_screen->setRGBPalette(_fxPalette, 0, colorCount);
_screen->updateScreenAndWait(20);
_screen->setRGBPalette(palette, 0, colorCount);
- _screen->updateScreenAndWait(20);
+ _screen->updateScreenAndWait(20);
}
}
diff --git a/engines/made/screenfx.h b/engines/made/screenfx.h
index 1fcdd5f0d4..fd216bfd63 100644
--- a/engines/made/screenfx.h
+++ b/engines/made/screenfx.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/made/script.cpp b/engines/made/script.cpp
index 7658d20eb5..20fa026a40 100644
--- a/engines/made/script.cpp
+++ b/engines/made/script.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/made/script.h b/engines/made/script.h
index f3db43485f..bf75bc0875 100644
--- a/engines/made/script.h
+++ b/engines/made/script.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/made/scriptfuncs.cpp b/engines/made/scriptfuncs.cpp
index 0e3b50aa98..efa765c7eb 100644
--- a/engines/made/scriptfuncs.cpp
+++ b/engines/made/scriptfuncs.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/made/scriptfuncs.h b/engines/made/scriptfuncs.h
index 03d29c4592..9db5586adf 100644
--- a/engines/made/scriptfuncs.h
+++ b/engines/made/scriptfuncs.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/made/sound.cpp b/engines/made/sound.cpp
index f73c580560..91e855cbf5 100644
--- a/engines/made/sound.cpp
+++ b/engines/made/sound.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -228,7 +228,7 @@ void decompressSound(byte *source, byte *dest, uint16 chunkSize, uint16 chunkCou
break;
default:
- return;
+ return;
}
diff --git a/engines/made/sound.h b/engines/made/sound.h
index b8399fd90a..6ffca13aaa 100644
--- a/engines/made/sound.h
+++ b/engines/made/sound.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/mads/action.cpp b/engines/mads/action.cpp
new file mode 100644
index 0000000000..199ae39000
--- /dev/null
+++ b/engines/mads/action.cpp
@@ -0,0 +1,708 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+
+ * You should have received a copy of the GNU General Public 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 "mads/mads.h"
+#include "mads/action.h"
+#include "mads/inventory.h"
+#include "mads/resources.h"
+#include "mads/scene.h"
+#include "mads/staticres.h"
+
+namespace MADS {
+
+void ActionDetails::synchronize(Common::Serializer &s) {
+ s.syncAsUint16LE(_verbId);
+ s.syncAsUint16LE(_objectNameId);
+ s.syncAsUint16LE(_indirectObjectId);
+}
+
+void ActionSavedFields::synchronize(Common::Serializer &s) {
+ s.syncAsByte(_commandError);
+ s.syncAsSint16LE(_commandSource);
+ s.syncAsSint16LE(_command);
+ s.syncAsSint16LE(_mainObject);
+ s.syncAsSint16LE(_secondObject);
+ s.syncAsSint16LE(_mainObjectSource);
+ s.syncAsSint16LE(_secondObjectSource);
+ s.syncAsSint16LE(_articleNumber);
+ s.syncAsSint16LE(_lookFlag);
+}
+
+/*------------------------------------------------------------------------*/
+
+MADSAction::MADSAction(MADSEngine *vm) : _vm(vm) {
+ clear();
+ _statusTextIndex = -1;
+ _selectedAction = 0;
+ _inProgress = false;
+ _pickedWord = -1;
+
+ _savedFields._commandSource = CAT_NONE;
+ _savedFields._mainObjectSource = CAT_NONE;
+ _savedFields._command = -1;
+ _savedFields._mainObject = 0;
+ _savedFields._secondObject = 0;
+ _savedFields._secondObjectSource = CAT_NONE;
+ _savedFields._articleNumber = PREP_NONE;
+ _savedFields._lookFlag = false;
+
+ _activeAction._verbId = VERB_NONE;
+ _activeAction._objectNameId = -1;
+ _activeAction._indirectObjectId = -1;
+ _savedFields._commandError = false;
+ _verbType = VERB_INIT;
+ _prepType = PREP_NONE;
+}
+
+void MADSAction::clear() {
+ _interAwaiting = AWAITING_COMMAND;
+ _commandSource = CAT_NONE;
+ _mainObjectSource = CAT_NONE;
+ _secondObjectSource = CAT_NONE;
+ _recentCommandSource = CAT_NONE;
+ _articleNumber = 0;
+ _lookFlag = false;
+ _pointEstablished = 0;
+ _statusText.clear();
+ _selectedRow = -1;
+ _hotspotId = -1;
+ _secondObject = -1;
+ _recentCommand = -1;
+ _action._verbId = VERB_NONE;
+ _action._objectNameId = -1;
+ _action._indirectObjectId = -1;
+ _textChanged = true;
+}
+
+void MADSAction::appendVocab(int vocabId, bool capitalize) {
+ Common::String vocabStr = _vm->_game->_scene.getVocab(vocabId);
+ if (capitalize)
+ vocabStr.setChar(toupper(vocabStr[0]), 0);
+
+ _statusText += vocabStr;
+ _statusText += " ";
+}
+
+void MADSAction::startWalkingDirectly(int walkType) {
+ Scene &scene = _vm->_game->_scene;
+ Player &player = _vm->_game->_player;
+
+ if (_pointEstablished && (walkType == -3 || _savedFields._command < 0)) {
+ player._needToWalk = true;
+ player._prepareWalkPos = scene._customDest;
+ }
+}
+
+void MADSAction::set() {
+ Scene &scene = _vm->_game->_scene;
+ UserInterface &userInterface = scene._userInterface;
+ _statusText = "";
+
+ _action._verbId = VERB_NONE;
+ _action._objectNameId = -1;
+ _action._indirectObjectId = -1;
+
+ if (_commandSource == CAT_TALK_ENTRY) {
+ // Handle showing the conversation selection. Rex at least doesn't actually seem to use this
+ if (_selectedRow >= 0) {
+ _action._verbId = userInterface._talkIds[_selectedRow];
+ Common::String desc = userInterface._talkStrings[_selectedRow];
+ if (!desc.empty())
+ _statusText = desc;
+ }
+ } else if (_lookFlag && (_selectedRow == 0)) {
+ // Two 'look' actions in succession, so the action becomes 'Look around'
+ _statusText = kLookAroundStr;
+ } else {
+ bool flag = false;
+ if ((_commandSource == CAT_INV_VOCAB) && (_selectedRow >= 0)
+ && (_verbType == VERB_THAT) && (_prepType == PREP_NONE)) {
+ // Use/to action
+ int invIndex = userInterface._selectedInvIndex;
+ InventoryObject &objEntry = _vm->_game->_objects.getItem(invIndex);
+
+ _action._objectNameId = objEntry._descId;
+ _action._verbId = objEntry._vocabList[_selectedRow]._vocabId;
+
+ // Set up the status text string
+ _statusText = kUseStr;
+ appendVocab(_action._objectNameId);
+ _statusText += kToStr;
+ appendVocab(_action._verbId);
+ } else {
+ // Handling for if an action has been selected
+ if (_selectedRow >= 0) {
+ if (_commandSource == CAT_COMMAND) {
+ // Standard verb action
+ _action._verbId = scene._verbList[_selectedRow]._id;
+ } else {
+ // Selected action on an inventory object
+ int invIndex = userInterface._selectedInvIndex;
+ InventoryObject &objEntry = _vm->_game->_objects.getItem(invIndex);
+
+ _action._verbId = objEntry._vocabList[_selectedRow]._vocabId;
+ }
+
+ appendVocab(_action._verbId, true);
+
+ if (_action._verbId == VERB_LOOK) {
+ // Add in the word 'add'
+ _statusText += kArticleList[PREP_AT];
+ _statusText += " ";
+ }
+ }
+
+ // Add in any necessary article if necessary
+ if ((_hotspotId >= 0) && (_selectedRow >= 0) && (_articleNumber > 0) && (_verbType == VERB_THAT)) {
+ flag = true;
+
+ _statusText += kArticleList[_articleNumber];
+ _statusText += " ";
+ }
+
+ // Handling for hotspot
+ if (_hotspotId >= 0) {
+ if (_selectedRow < 0) {
+ int verbId;
+
+ if (_hotspotId < (int)scene._hotspots.size()) {
+ // Get the verb Id from the hotspot
+ verbId = scene._hotspots[_hotspotId]._verbId;
+ } else {
+ // Get the verb Id from the scene object
+ verbId = scene._dynamicHotspots.get(_hotspotId - scene._hotspots.size())._verbId;
+ }
+
+ if (verbId > 0) {
+ // Set the specified action
+ _action._verbId = verbId;
+ appendVocab(_action._verbId, true);
+ } else {
+ // Default to a standard 'walk to'
+ _action._verbId = VERB_WALKTO;
+ _statusText += kWalkToStr;
+ }
+ }
+
+ if ((_mainObjectSource == CAT_INV_LIST) || (_mainObjectSource == CAT_INV_ANIM)) {
+ // Get name from given inventory object
+ InventoryObject &invObject = _vm->_game->_objects.getItem(_hotspotId);
+ _action._objectNameId = invObject._descId;
+ } else if (_hotspotId < (int)scene._hotspots.size()) {
+ // Get name from scene hotspot
+ _action._objectNameId = scene._hotspots[_hotspotId]._vocabId;
+ } else {
+ // Get name from temporary scene hotspot
+ _action._objectNameId = scene._dynamicHotspots.get(_hotspotId - scene._hotspots.size())._descId;
+ }
+ appendVocab(_action._objectNameId);
+ }
+ }
+
+ if (_secondObject >= 0) {
+ if (_secondObjectSource == CAT_INV_LIST || _secondObjectSource == CAT_INV_ANIM) {
+ InventoryObject &invObject = _vm->_game->_objects.getItem(_secondObject);
+ _action._indirectObjectId = invObject._descId;
+ } else if (_secondObject < (int)scene._hotspots.size()) {
+ _action._indirectObjectId = scene._hotspots[_secondObject]._vocabId;
+ } else {
+ _action._indirectObjectId = scene._dynamicHotspots.get(_secondObject - scene._hotspots.size())._descId;
+ }
+ }
+
+ if ((_hotspotId >= 0) && (_articleNumber > 0) && !flag) {
+ if (_articleNumber == PREP_RELATIONAL) {
+ if (_secondObject >= 0) {
+ int articleNum = 0;
+
+ if ((_secondObjectSource == 2) || (_secondObjectSource == 5)) {
+ InventoryObject &invObject = _vm->_game->_objects.getItem(_secondObject);
+ articleNum = invObject._article;
+ } else if (_secondObject < (int)scene._hotspots.size()) {
+ articleNum = scene._hotspots[_secondObject]._articleNumber;
+ } else {
+ articleNum = scene._dynamicHotspots.get(_secondObject - scene._hotspots.size())._articleNumber;
+ }
+
+ _statusText += kArticleList[articleNum];
+ }
+ } else if ((_articleNumber != VERB_LOOK) || (_vm->getGameID() != GType_RexNebular) ||
+ (_action._indirectObjectId >= 0 && scene.getVocab(_action._indirectObjectId) != kFenceStr)) {
+ // Write out the article
+ _statusText += kArticleList[_articleNumber];
+ } else {
+ // Special case for a 'fence' entry in Rex Nebular
+ _statusText += kOverStr;
+ }
+
+ _statusText += " ";
+ }
+
+ // Append object description if necessary
+ if (_secondObject >= 0)
+ appendVocab(_action._indirectObjectId);
+
+ // Remove any trailing space character
+ if (_statusText.hasSuffix(" "))
+ _statusText.deleteLastChar();
+ }
+
+ _textChanged = true;
+}
+
+void MADSAction::refresh() {
+ Scene &scene = _vm->_game->_scene;
+
+ // Exit immediately if nothing has changed
+ if (!_textChanged)
+ return;
+
+ // Remove any old copy of the status text
+ if (_statusTextIndex >= 0) {
+ scene._textDisplay.expire(_statusTextIndex);
+ _statusTextIndex = -1;
+ }
+
+ if (!_statusText.empty()) {
+ if ((_vm->_game->_screenObjects._inputMode == kInputBuildingSentences) ||
+ (_vm->_game->_screenObjects._inputMode == kInputLimitedSentences)) {
+ Font *font = _vm->_font->getFont(FONT_MAIN);
+ int textSpacing = -1;
+
+ int strWidth = font->getWidth(_statusText);
+ if (strWidth > MADS_SCREEN_WIDTH) {
+ // Too large to fit, so fall back on interface font
+ font = _vm->_font->getFont(FONT_INTERFACE);
+ strWidth = font->getWidth(_statusText, 0);
+ textSpacing = 0;
+ }
+
+ // Add a new text display entry to display the status text at the bottom of the screen area
+ _statusTextIndex = scene._textDisplay.add(160 - (strWidth / 2),
+ MADS_SCENE_HEIGHT + scene._posAdjust.y - 13, 3, textSpacing, _statusText, font);
+ }
+ }
+
+ _textChanged = false;
+}
+
+void MADSAction::startAction() {
+ Game &game = *_vm->_game;
+ Player &player = game._player;
+ Scene &scene = _vm->_game->_scene;
+ DynamicHotspots &dynHotspots = scene._dynamicHotspots;
+ Hotspots &hotspots = scene._hotspots;
+
+ player.cancelCommand();
+
+ _inProgress = true;
+ _savedFields._commandError = false;
+ _savedFields._command = _selectedRow;
+ _savedFields._mainObject = _hotspotId;
+ _savedFields._secondObject = _secondObject;
+ _savedFields._articleNumber = _articleNumber;
+ _savedFields._commandSource = _commandSource;
+ _savedFields._mainObjectSource = _mainObjectSource;
+ _savedFields._secondObjectSource = _secondObjectSource;
+ _savedFields._lookFlag = _lookFlag;
+ _activeAction = _action;
+
+ // Copy the action to be active
+ _activeAction = _action;
+ _sentence = _statusText;
+
+ if ((_mainObjectSource == CAT_HOTSPOT) && (_secondObjectSource == 4))
+ _savedFields._commandError = true;
+
+ player._needToWalk = false;
+ int hotspotId = -1;
+
+ if (!_savedFields._lookFlag && (_vm->_game->_screenObjects._inputMode != kInputConversation)) {
+ if (_savedFields._mainObjectSource == CAT_HOTSPOT)
+ hotspotId = _savedFields._mainObject;
+ else if (_secondObjectSource == 4)
+ hotspotId = _savedFields._secondObject;
+
+ if (hotspotId >= (int)hotspots.size()) {
+ DynamicHotspot &hs = dynHotspots.get(hotspotId - hotspots.size());
+ if ((hs._feetPos.x == -1) || (hs._feetPos.x == -3)) {
+ startWalkingDirectly(hs._feetPos.x);
+ } else if (hs._feetPos.x < 0) {
+ player._prepareWalkFacing = hs._facing;
+ } else if (_savedFields._commandSource == CAT_NONE || hs._cursor < CURSOR_WAIT) {
+ player._needToWalk = true;
+ player._prepareWalkPos = hs._feetPos;
+ }
+
+ player._prepareWalkFacing = hs._facing;
+ hotspotId = -1;
+ }
+ }
+
+ if (hotspotId >= 0) {
+ Hotspot &hs = hotspots[hotspotId];
+
+ if (hs._feetPos.x == -1 || hs._feetPos.x == -3) {
+ startWalkingDirectly(hs._feetPos.x);
+ } else if (hs._feetPos.x >= 0) {
+ if (_savedFields._commandSource == CAT_NONE || hs._cursor < CURSOR_WAIT) {
+ player._needToWalk = true;
+ player._prepareWalkPos = hs._feetPos;
+ }
+ }
+
+ player._prepareWalkFacing = hs._facing;
+ }
+
+ player._readyToWalk = player._needToWalk;
+}
+
+void MADSAction::checkAction() {
+ if (isAction(VERB_LOOK) || isAction(VERB_THROW))
+ _vm->_game->_player._needToWalk = false;
+}
+
+bool MADSAction::isAction(int verbId, int objectNameId, int indirectObjectId) {
+ if (_activeAction._verbId != verbId)
+ return false;
+ if ((objectNameId != 0) && (_activeAction._objectNameId != objectNameId))
+ return false;
+ if ((indirectObjectId != 0) && (_activeAction._indirectObjectId != indirectObjectId))
+ return false;
+
+ return true;
+}
+
+bool MADSAction::isObject(int objectNameId) {
+ return _activeAction._objectNameId == objectNameId;
+}
+
+bool MADSAction::isTarget(int objectNameId) {
+ return _activeAction._indirectObjectId == objectNameId;
+}
+
+void MADSAction::checkActionAtMousePos() {
+ Scene &scene = _vm->_game->_scene;
+ UserInterface &userInterface = scene._userInterface;
+
+ if ((userInterface._category == CAT_COMMAND || userInterface._category == CAT_INV_VOCAB) &&
+ _interAwaiting != AWAITING_COMMAND && _pickedWord >= 0) {
+ if (_recentCommandSource == userInterface._category || _recentCommand != _pickedWord ||
+ (_interAwaiting != AWAITING_THIS && _interAwaiting != 3))
+ clear();
+ else if (_selectedRow != 0 || userInterface._category != CAT_COMMAND)
+ scene._lookFlag = false;
+ else
+ scene._lookFlag = true;
+ }
+
+ if (_vm->_events->_rightMousePressed && _vm->_events->_mouseButtons) {
+ switch (userInterface._category) {
+ case CAT_COMMAND:
+ case CAT_INV_VOCAB:
+ return;
+
+ case CAT_INV_LIST:
+ case CAT_HOTSPOT:
+ case CAT_INV_ANIM:
+ if (_interAwaiting != AWAITING_THAT) {
+ if (userInterface._selectedActionIndex >= 0) {
+ _commandSource = CAT_COMMAND;
+ _selectedRow = userInterface._selectedActionIndex;
+ _verbType = scene._verbList[_selectedRow]._verbType;
+ _prepType = scene._verbList[_selectedRow]._prepType;
+ _interAwaiting = AWAITING_THIS;
+ } else if (userInterface._selectedItemVocabIdx >= 0) {
+ _commandSource = CAT_INV_VOCAB;
+ _selectedRow = userInterface._selectedItemVocabIdx;
+ int objectId = _vm->_game->_objects._inventoryList[_selectedRow];
+ InventoryObject &invObject = _vm->_game->_objects[objectId];
+
+ _verbType = invObject._vocabList[_selectedRow - 1]._verbType;
+ _prepType = invObject._vocabList[_selectedRow - 1]._prepType;
+ _mainObjectSource = CAT_INV_LIST;
+ _hotspotId = userInterface._selectedInvIndex;
+ _articleNumber = _prepType;
+
+ if ((_verbType == VERB_THIS && _prepType == PREP_NONE) ||
+ (_verbType == VERB_THAT && _prepType != PREP_NONE))
+ _interAwaiting = AWAITING_RIGHT_MOUSE;
+ else
+ _interAwaiting = AWAITING_THAT;
+ }
+ }
+ break;
+
+ default:
+ break;
+ }
+ }
+
+ switch (_interAwaiting) {
+ case AWAITING_COMMAND:
+ _articleNumber = 0;
+ switch (userInterface._category) {
+ case CAT_COMMAND:
+ _commandSource = CAT_COMMAND;
+ _selectedRow = _pickedWord;
+ if (_selectedRow >= 0) {
+ _verbType = scene._verbList[_selectedRow]._verbType;
+ _prepType = scene._verbList[_selectedRow]._prepType;
+ }
+ break;
+
+ case CAT_INV_VOCAB:
+ _commandSource = CAT_INV_VOCAB;
+ _selectedRow = _pickedWord;
+ if (_selectedRow < 0) {
+ _hotspotId = -1;
+ _mainObjectSource = CAT_NONE;
+ } else {
+ InventoryObject &invObject = _vm->_game->_objects.getItem(userInterface._selectedInvIndex);
+ _verbType = invObject._vocabList[_selectedRow]._verbType;
+ _prepType = invObject._vocabList[_selectedRow]._prepType;
+ _hotspotId = userInterface._selectedInvIndex;
+ _mainObjectSource = CAT_INV_LIST;
+
+ if (_verbType == VERB_THAT)
+ _articleNumber = _prepType;
+ }
+ break;
+
+ case CAT_HOTSPOT:
+ _selectedRow = -1;
+ _commandSource = CAT_NONE;
+ _mainObjectSource = CAT_HOTSPOT;
+ _hotspotId = _pickedWord;
+ break;
+
+ case CAT_TALK_ENTRY:
+ _commandSource = CAT_TALK_ENTRY;
+ _selectedRow = _pickedWord;
+ break;
+
+ default:
+ break;
+ }
+ break;
+
+ case AWAITING_THIS:
+ _articleNumber = 0;
+ switch (userInterface._category) {
+ case CAT_INV_LIST:
+ case CAT_HOTSPOT:
+ case CAT_INV_ANIM:
+ _mainObjectSource = userInterface._category;
+ _hotspotId = _pickedWord;
+ break;
+ default:
+ break;
+ }
+ break;
+
+ case AWAITING_THAT:
+ switch (userInterface._category) {
+ case CAT_INV_LIST:
+ case CAT_HOTSPOT:
+ case CAT_INV_ANIM:
+ _secondObjectSource = userInterface._category;
+ _secondObject = _pickedWord;
+ break;
+ default:
+ break;
+ }
+ break;
+
+ default:
+ break;
+ }
+}
+
+void MADSAction::leftClick() {
+ Scene &scene = _vm->_game->_scene;
+ UserInterface &userInterface = scene._userInterface;
+ bool abortFlag = false;
+
+ if ((userInterface._category == CAT_COMMAND || userInterface._category == CAT_INV_VOCAB) &&
+ _interAwaiting != 1 && _pickedWord >= 0 &&
+ _recentCommandSource == userInterface._category && _recentCommand == _pickedWord &&
+ (_interAwaiting == 2 || userInterface._category == CAT_INV_VOCAB)) {
+ abortFlag = true;
+ if (_selectedRow == 0 && userInterface._category == CAT_COMMAND) {
+ _selectedAction = CAT_COMMAND;
+ scene._lookFlag = true;
+ } else {
+ _selectedAction = CAT_NONE;
+ scene._lookFlag = false;
+ clear();
+ }
+ }
+
+ if (abortFlag || (_vm->_events->_rightMousePressed && (userInterface._category == CAT_COMMAND ||
+ userInterface._category == CAT_INV_VOCAB)))
+ return;
+
+ switch (_interAwaiting) {
+ case AWAITING_COMMAND:
+ switch (userInterface._category) {
+ case CAT_COMMAND:
+ if (_selectedRow >= 0) {
+ if (_verbType == VERB_ONLY) {
+ _selectedAction = -1;
+ }
+ else {
+ _recentCommand = _selectedRow;
+ _recentCommandSource = _commandSource;
+ _interAwaiting = AWAITING_THIS;
+ }
+ }
+ break;
+
+ case CAT_INV_LIST:
+ if (_pickedWord >= 0) {
+ userInterface.selectObject(_pickedWord);
+ }
+ break;
+
+ case CAT_INV_VOCAB:
+ if (_selectedRow >= 0) {
+ if (_verbType != VERB_THIS || _prepType != PREP_NONE) {
+ if (_verbType != VERB_THAT || _prepType == PREP_NONE) {
+ _interAwaiting = AWAITING_THAT;
+ _articleNumber = _prepType;
+ } else {
+ _articleNumber = _prepType;
+ _selectedAction = -1;
+ }
+ } else {
+ _selectedAction = -1;
+ }
+
+ _recentCommand = _selectedRow;
+ _recentCommandSource = _commandSource;
+ }
+ break;
+
+ case CAT_HOTSPOT:
+ _recentCommand = -1;
+ _recentCommandSource = CAT_NONE;
+
+ if (_vm->_events->currentPos().y < MADS_SCENE_HEIGHT) {
+ scene._customDest = _vm->_events->currentPos() + scene._posAdjust;
+ _selectedAction = -1;
+ _pointEstablished = true;
+ }
+ break;
+
+ case CAT_TALK_ENTRY:
+ if (_selectedRow >= 0)
+ _selectedAction = -1;
+ break;
+
+ default:
+ break;
+ }
+ break;
+
+ case AWAITING_THIS:
+ switch (userInterface._category) {
+ case CAT_INV_LIST:
+ case CAT_HOTSPOT:
+ case CAT_INV_ANIM:
+ if (_hotspotId >= 0) {
+ if (_prepType) {
+ _articleNumber = _prepType;
+ _interAwaiting = AWAITING_THAT;
+ } else {
+ _selectedAction = -1;
+ }
+
+ if (userInterface._category == CAT_HOTSPOT) {
+ scene._customDest = _vm->_events->mousePos() + scene._posAdjust;
+ _pointEstablished = true;
+ }
+ }
+ break;
+ default:
+ break;
+ }
+ break;
+
+ case AWAITING_THAT:
+ switch (userInterface._category) {
+ case CAT_INV_LIST:
+ case CAT_HOTSPOT:
+ case CAT_INV_ANIM:
+ if (_secondObject >= 0) {
+ _selectedAction = -1;
+
+ if (userInterface._category == CAT_HOTSPOT) {
+ if (!_pointEstablished) {
+ scene._customDest = _vm->_events->mousePos() + scene._posAdjust;
+ _pointEstablished = true;
+ }
+ }
+ }
+ break;
+ default:
+ break;
+ }
+ break;
+
+ default:
+ break;
+ }
+}
+
+void MADSAction::synchronize(Common::Serializer &s) {
+ _action.synchronize(s);
+ _activeAction.synchronize(s);
+ s.syncAsSint16LE(_articleNumber);
+ s.syncAsByte(_lookFlag);
+ s.syncAsByte(_textChanged);
+ s.syncAsSint16LE(_selectedRow);
+ s.syncAsSint16LE(_selectedAction);
+ s.syncAsSint16LE(_statusTextIndex);
+ s.syncAsSint16LE(_hotspotId);
+ _savedFields.synchronize(s);
+
+ // TODO: When saving in Rex Village Hut, _senetence size() doesn't match
+ // string length. Find out why not
+ _sentence = Common::String(_sentence.c_str());
+ s.syncString(_sentence);
+
+ s.syncAsSint16LE(_verbType);
+ s.syncAsSint16LE(_prepType);
+ s.syncAsSint16LE(_commandSource);
+ s.syncAsSint16LE(_mainObjectSource);
+ s.syncAsSint16LE(_secondObject);
+ s.syncAsSint16LE(_secondObjectSource);
+ s.syncAsSint16LE(_recentCommandSource);
+ s.syncAsSint16LE(_recentCommand);
+ s.syncAsSint16LE(_interAwaiting);
+ s.syncAsSint16LE(_pickedWord);
+ s.syncAsByte(_pointEstablished);
+ s.syncAsByte(_inProgress);
+}
+
+} // End of namespace MADS
diff --git a/engines/mads/action.h b/engines/mads/action.h
new file mode 100644
index 0000000000..cfd5a3be3f
--- /dev/null
+++ b/engines/mads/action.h
@@ -0,0 +1,176 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+
+ * You should have received a copy of the GNU General Public 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 MADS_ACTION_H
+#define MADS_ACTION_H
+
+#include "common/scummsys.h"
+#include "common/serializer.h"
+#include "common/str.h"
+
+namespace MADS {
+
+enum TriggerMode {
+ SEQUENCE_TRIGGER_PARSER = 0, // Triggers parser
+ SEQUENCE_TRIGGER_DAEMON = 1, // Triggers step/daemon code
+ SEQUENCE_TRIGGER_PREPARE = 2 // Triggers preparser
+};
+
+enum InterAwaiting {
+ AWAITING_NONE = 0,
+ AWAITING_COMMAND = 1, // Initial state: waiting for a command verb
+ AWAITING_THIS = 2, // Waiting for object
+ AWAITING_THAT = 3, // Waiting for a second object
+ AWAITING_RIGHT_MOUSE = 4 // Waiting for mouse button release
+};
+
+enum {
+ VERB_NONE = 0,
+ VERB_LOOK = 3,
+ VERB_TAKE = 4,
+ VERB_PUSH = 5,
+ VERB_OPEN = 6,
+ VERB_PUT = 7,
+ VERB_TALKTO = 8,
+ VERB_GIVE = 9,
+ VERB_PULL = 10,
+ VERB_CLOSE = 11,
+ VERB_THROW = 12,
+ VERB_WALKTO = 13
+};
+
+enum VerbType { VERB_ONLY, VERB_THIS, VERB_THAT, VERB_INIT };
+
+enum PrepType {
+ PREP_NONE, PREP_WITH, PREP_TO, PREP_AT, PREP_FROM, PREP_ON, PREP_IN,
+ PREP_UNDER, PREP_BEHIND, PREP_RELATIONAL = 0xff
+};
+
+enum ScrCategory {
+ CAT_NONE = 0, CAT_COMMAND = 1, CAT_INV_LIST = 2, CAT_INV_VOCAB = 3,
+ CAT_HOTSPOT = 4, CAT_INV_ANIM = 5, CAT_TALK_ENTRY = 6, CAT_INV_SCROLLER = 7,
+ CAT_12 = 12
+};
+
+class MADSEngine;
+
+struct ActionDetails {
+ int _verbId;
+ int _objectNameId;
+ int _indirectObjectId;
+
+ /**
+ * Synchronize the action details
+ */
+ void synchronize(Common::Serializer &s);
+};
+
+struct ActionSavedFields {
+ bool _commandError;
+ int _commandSource;
+ int _command;
+ int _mainObject;
+ int _secondObject;
+ int _mainObjectSource;
+ int _secondObjectSource;
+ int _articleNumber;
+ int _lookFlag;
+
+ /**
+ * Synchronize the saved action details
+ */
+ void synchronize(Common::Serializer &s);
+};
+
+class MADSAction {
+private:
+ MADSEngine *_vm;
+ Common::String _statusText;
+
+ void appendVocab(int vocabId, bool capitalize = false);
+
+ void startWalkingDirectly(int walkType);
+public:
+ ActionDetails _action, _activeAction;
+ int _articleNumber;
+ bool _lookFlag;
+ int _selectedRow;
+ bool _textChanged;
+ int _selectedAction;
+ int _statusTextIndex;
+ int _hotspotId;
+ ActionSavedFields _savedFields;
+ Common::String _sentence;
+
+ VerbType _verbType;
+ PrepType _prepType;
+ ScrCategory _commandSource;
+ ScrCategory _mainObjectSource;
+ int _secondObject;
+ ScrCategory _secondObjectSource;
+ ScrCategory _recentCommandSource;
+ bool _pointEstablished;
+ int _recentCommand;
+ InterAwaiting _interAwaiting;
+ bool _inProgress;
+ int _pickedWord;
+
+public:
+ MADSAction(MADSEngine *vm);
+
+ void clear();
+ void set();
+ const Common::String &statusText() const { return _statusText; }
+ void refresh();
+
+ /**
+ * Accepts the currently defined sentence from the ScreenObjects parser.
+ * Copies the data, and checks to see if the action requires the player
+ * to walk to the given hotspot.
+ */
+ void startAction();
+
+ void checkAction();
+ bool isAction(int verbId, int objectNameId = 0, int indirectObjectId = 0);
+ bool isObject(int objectNameId);
+ bool isTarget(int objectNameId);
+
+ /**
+ * Check the result of the current action on the sentence
+ * with the provision that the action is not yet complete.
+ */
+ void checkActionAtMousePos();
+
+ /**
+ * Execute a click within the scene
+ */
+ void leftClick();
+
+ /**
+ * Synchronize the saved action details
+ */
+ void synchronize(Common::Serializer &s);
+};
+
+} // End of namespace MADS
+
+#endif /* MADS_ACTION_H */
diff --git a/engines/mads/animation.cpp b/engines/mads/animation.cpp
new file mode 100644
index 0000000000..512a3979f9
--- /dev/null
+++ b/engines/mads/animation.cpp
@@ -0,0 +1,593 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+
+ * You should have received a copy of the GNU General Public 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 "mads/animation.h"
+#include "mads/compression.h"
+
+#define FILENAME_SIZE 13
+
+namespace MADS {
+
+void AAHeader::load(Common::SeekableReadStream *f) {
+ _spriteSetsCount = f->readUint16LE();
+ _miscEntriesCount = f->readUint16LE();
+ _frameEntriesCount = f->readUint16LE();
+ _messagesCount = f->readUint16LE();
+ f->skip(1);
+ _flags = f->readByte();
+
+ f->skip(2);
+ _bgType = (AnimBgType)f->readUint16LE();
+ _roomNumber = f->readUint16LE();
+ f->skip(2);
+ _manualFlag = f->readUint16LE() != 0;
+ _spritesIndex = f->readUint16LE();
+ _scrollPosition.x = f->readSint16LE();
+ _scrollPosition.y = f->readSint16LE();
+ _scrollTicks = f->readUint32LE();
+ f->skip(6);
+
+ char buffer[FILENAME_SIZE];
+ f->read(buffer, FILENAME_SIZE);
+ buffer[FILENAME_SIZE - 1] = '\0';
+ _interfaceFile = Common::String(buffer);
+
+ for (int i = 0; i < 50; ++i) {
+ f->read(buffer, FILENAME_SIZE);
+ buffer[FILENAME_SIZE - 1] = '\0';
+ if (i < _spriteSetsCount)
+ _spriteSetNames.push_back(Common::String(buffer));
+ }
+
+ f->read(buffer, FILENAME_SIZE);
+ buffer[FILENAME_SIZE - 1] = '\0';
+ _soundName = Common::String(buffer);
+
+ f->skip(13);
+ f->read(buffer, FILENAME_SIZE);
+ buffer[FILENAME_SIZE - 1] = '\0';
+ _dsrName = Common::String(buffer);
+
+ f->read(buffer, FILENAME_SIZE);
+ buffer[FILENAME_SIZE - 1] = '\0';
+ _fontResource = Common::String(buffer);
+}
+
+/*------------------------------------------------------------------------*/
+
+void AnimMessage::load(Common::SeekableReadStream *f) {
+ _soundId = f->readSint16LE();
+
+ char buffer[64];
+ f->read(&buffer[0], 64);
+ _msg = Common::String(buffer);
+ f->skip(4);
+ _pos.x = f->readSint16LE();
+ _pos.y = f->readSint16LE();
+ _flags = f->readUint16LE();
+ _rgb1[0] = f->readByte() << 2;
+ _rgb1[1] = f->readByte() << 2;
+ _rgb1[2] = f->readByte() << 2;
+ _rgb2[0] = f->readByte() << 2;
+ _rgb2[1] = f->readByte() << 2;
+ _rgb2[2] = f->readByte() << 2;
+ f->skip(2); // Space for kernelMsgIndex
+ _kernelMsgIndex = -1;
+ f->skip(6);
+ _startFrame = f->readUint16LE();
+ _endFrame = f->readUint16LE();
+ f->skip(2);
+}
+
+void AnimFrameEntry::load(Common::SeekableReadStream *f, bool uiFlag) {
+ if (uiFlag) {
+ f->skip(2);
+ _frameNumber = -1; // Unused
+ _seqIndex = f->readByte();
+ _spriteSlot._spritesIndex = f->readByte();
+ _spriteSlot._frameNumber = (int8)f->readByte();
+ f->skip(1);
+ _spriteSlot._position.x = f->readSint16LE();
+ _spriteSlot._position.y = f->readSint16LE();
+ } else {
+ _frameNumber = f->readUint16LE();
+ if (_frameNumber & 0x8000)
+ _frameNumber = -(_frameNumber & 0x7fff);
+
+ _seqIndex = f->readByte();
+ _spriteSlot._spritesIndex = f->readByte();
+ _spriteSlot._frameNumber = f->readUint16LE();
+ if (_spriteSlot._frameNumber & 0x8000)
+ _spriteSlot._frameNumber = -(_spriteSlot._frameNumber & 0x7fff);
+
+ _spriteSlot._position.x = f->readSint16LE();
+ _spriteSlot._position.y = f->readSint16LE();
+ _spriteSlot._depth = f->readSByte();
+ _spriteSlot._scale = (int8)f->readByte();
+ }
+}
+
+/*------------------------------------------------------------------------*/
+
+void AnimMiscEntry::load(Common::SeekableReadStream *f) {
+ _soundId = f->readByte();
+ _msgIndex = f->readSByte();
+ _numTicks = f->readUint16LE();
+ _posAdjust.x = f->readSint16LE();
+ _posAdjust.y = f->readSint16LE();
+ _field8 = f->readUint16LE();
+}
+
+/*------------------------------------------------------------------------*/
+
+void AnimUIEntry::load(Common::SeekableReadStream *f) {
+ _probability = f->readUint16LE();
+ _imageCount = f->readUint16LE();
+ _firstImage = f->readUint16LE();
+ _lastImage = f->readUint16LE();
+ _counter = f->readSint16LE();
+ for (int i = 0; i < ANIM_SPAWN_COUNT; ++i)
+ _spawn[i] = f->readByte();
+ for (int i = 0; i < ANIM_SPAWN_COUNT; ++i)
+ _spawnFrame[i] = f->readUint16LE();
+ _sound = f->readUint16LE() & 0xFF;
+ _soundFrame = f->readUint16LE();
+}
+
+/*------------------------------------------------------------------------*/
+
+Animation *Animation::init(MADSEngine *vm, Scene *scene) {
+ return new Animation(vm, scene);
+}
+
+Animation::Animation(MADSEngine *vm, Scene *scene) : _vm(vm), _scene(scene) {
+ _font = nullptr;
+ _resetFlag = false;
+ _messageCtr = 0;
+ _skipLoad = false;
+ _freeFlag = false;
+ _unkIndex = -1;
+ _nextFrameTimer = 0;
+ _nextScrollTimer = 0;
+ _trigger = 0;
+ _triggerMode = SEQUENCE_TRIGGER_PREPARE;
+ _actionDetails._verbId = VERB_NONE;
+ _actionDetails._objectNameId = -1;
+ _actionDetails._indirectObjectId = -1;
+ _currentFrame = 0;
+ _oldFrameEntry = 0;
+}
+
+Animation::~Animation() {
+ Scene &scene = _vm->_game->_scene;
+
+ if (_header._manualFlag)
+ scene._sprites.remove(_spriteListIndexes[_header._spritesIndex]);
+
+ for (int idx = 0; idx < _header._spriteSetsCount; ++idx) {
+ if (!_header._manualFlag || _header._spritesIndex != idx)
+ scene._sprites.remove(_spriteListIndexes[idx]);
+ }
+}
+
+void Animation::load(UserInterface &interfaceSurface, DepthSurface &depthSurface,
+ const Common::String &resName, int flags, Common::Array<PaletteCycle> *palCycles,
+ SceneInfo *sceneInfo) {
+ Common::String resourceName = resName;
+ if (!resourceName.contains("."))
+ resourceName += ".AA";
+
+ File f(resourceName);
+ MadsPack madsPack(&f);
+
+ Common::SeekableReadStream *stream = madsPack.getItemStream(0);
+ _header.load(stream);
+ delete stream;
+
+ if (_header._bgType == ANIMBG_INTERFACE)
+ flags |= PALFLAG_RESERVED;
+
+ if (flags & ANIMFLAG_LOAD_BACKGROUND) {
+ loadInterface(interfaceSurface, depthSurface, _header, flags, palCycles, sceneInfo);
+ }
+ if (flags & ANIMFLAG_LOAD_BACKGROUND_ONLY) {
+ // No data
+ _header._messagesCount = 0;
+ _header._frameEntriesCount = 0;
+ _header._miscEntriesCount = 0;
+ }
+
+ // Initialize the reference list
+ _spriteListIndexes.clear();
+ for (int i = 0; i < _header._spriteSetsCount; ++i)
+ _spriteListIndexes.push_back(-1);
+
+ int streamIndex = 1;
+ _messages.clear();
+ if (_header._messagesCount > 0) {
+ // Chunk 2: Following is a list of any messages for the animation
+ Common::SeekableReadStream *msgStream = madsPack.getItemStream(streamIndex++);
+
+ for (int i = 0; i < _header._messagesCount; ++i) {
+ AnimMessage rec;
+ rec.load(msgStream);
+ _messages.push_back(rec);
+ }
+
+ delete msgStream;
+ }
+
+ _frameEntries.clear();
+ if (_header._frameEntriesCount > 0) {
+ // Chunk 3: animation frame info
+ Common::SeekableReadStream *frameStream = madsPack.getItemStream(streamIndex++);
+
+ for (int i = 0; i < _header._frameEntriesCount; i++) {
+ AnimFrameEntry rec;
+ rec.load(frameStream, flags & ANIMFLAG_LOAD_BACKGROUND);
+ _frameEntries.push_back(rec);
+ }
+
+ delete frameStream;
+ }
+
+ _miscEntries.clear();
+ _uiEntries.clear();
+ if (_header._miscEntriesCount > 0) {
+ // Chunk 4: Misc Data
+ Common::SeekableReadStream *miscStream = madsPack.getItemStream(streamIndex++);
+
+ if (flags & ANIMFLAG_LOAD_BACKGROUND) {
+ for (int i = 0; i < _header._miscEntriesCount; ++i) {
+ AnimUIEntry rec;
+ rec.load(miscStream);
+ _uiEntries.push_back(rec);
+ }
+ } else {
+ for (int i = 0; i < _header._miscEntriesCount; ++i) {
+ AnimMiscEntry rec;
+ rec.load(miscStream);
+ _miscEntries.push_back(rec);
+ }
+ }
+
+ delete miscStream;
+ }
+
+ // If the animation specifies a font, then load it for access
+ delete _font;
+ if (_header._flags & ANIMFLAG_CUSTOM_FONT) {
+ Common::String fontName = "*" + _header._fontResource;
+ _font = _vm->_font->getFont(fontName.c_str());
+ } else {
+ _font = nullptr;
+ }
+
+ // Load all the sprite sets for the animation
+ for (uint i = 0; i < _spriteSets.size(); ++i)
+ delete _spriteSets[i];
+ _spriteSets.clear();
+ _spriteSets.resize(_header._spriteSetsCount);
+
+ for (int i = 0; i < _header._spriteSetsCount; ++i) {
+ if (_header._manualFlag && (i == _header._spritesIndex)) {
+ // Skip over field, since it's manually loaded
+ _spriteSets[i] = nullptr;
+ } else {
+ _spriteSets[i] = new SpriteAsset(_vm, _header._spriteSetNames[i], flags);
+ _spriteListIndexes[i] = _vm->_game->_scene._sprites.add(_spriteSets[i]);
+ }
+ }
+
+ if (_header._manualFlag) {
+ Common::String assetResName = "*" + _header._spriteSetNames[_header._spritesIndex];
+ SpriteAsset *sprites = new SpriteAsset(_vm, assetResName, flags);
+ _spriteSets[_header._spritesIndex] = sprites;
+
+ _spriteListIndexes[_header._spritesIndex] = _scene->_sprites.add(sprites);
+ }
+
+ Common::Array<int> usageList;
+ for (int idx = 0; idx < _header._spriteSetsCount; ++idx)
+ usageList.push_back(_spriteSets[idx]->_usageIndex);
+
+ if (usageList.size() > 0) {
+ int spritesUsageIndex = _spriteSets[0]->_usageIndex;
+ _vm->_palette->_paletteUsage.updateUsage(usageList, spritesUsageIndex);
+ }
+
+ // Remaps the sprite list indexes for frames to the loaded sprite list indexes
+ for (uint i = 0; i < _frameEntries.size(); ++i) {
+ int spriteListIndex = _frameEntries[i]._spriteSlot._spritesIndex;
+ _frameEntries[i]._spriteSlot._spritesIndex = _spriteListIndexes[spriteListIndex];
+ }
+
+ f.close();
+}
+
+void Animation::preLoad(const Common::String &resName, int level) {
+ // No implementation in ScummVM, since access is fast enough that data
+ // doesn't need to be preloaded
+}
+
+void Animation::startAnimation(int endTrigger) {
+ _messageCtr = 0;
+ _skipLoad = true;
+
+ if (_header._manualFlag) {
+ _unkIndex = -1;
+ //SpriteAsset *asset = _scene->_sprites[_spriteListIndexes[_header._spritesIndex]];
+
+ // TODO: Weird stuff with _unkList. Seems like it's treated as pointers
+ // here, but in processText, it's used as POINTs?
+
+ loadFrame(1);
+ }
+
+ if (_vm->_game->_kernelMode == KERNEL_ACTIVE_CODE)
+ _vm->_palette->refreshSceneColors();
+
+ _currentFrame = 0;
+ _oldFrameEntry = 0;
+ _nextFrameTimer = _vm->_game->_scene._frameStartTime;
+ _trigger = endTrigger;
+ _triggerMode = _vm->_game->_triggerSetupMode;
+ _actionDetails = _vm->_game->_scene._action._activeAction;
+
+ for (int idx = 0; idx < _header._messagesCount; ++idx) {
+ _messages[idx]._kernelMsgIndex = -1;
+ }
+}
+
+void Animation::loadFrame(int frameNumber) {
+ Scene &scene = _vm->_game->_scene;
+ if (_skipLoad)
+ return;
+
+ Common::Point pt;
+ int spriteListIndex = _spriteListIndexes[_header._spritesIndex];
+ SpriteAsset &spriteSet = *scene._sprites[spriteListIndex];
+
+ if (_unkIndex < 0) {
+ MSurface *frame = spriteSet.getFrame(0);
+ pt.x = frame->getBounds().left;
+ pt.y = frame->getBounds().top;
+ } else {
+ pt.x = _unkList[_unkIndex].x;
+ pt.y = _unkList[_unkIndex].y;
+ _unkIndex = 1 - _unkIndex;
+ }
+
+ if (drawFrame(spriteSet, pt, frameNumber))
+ error("drawFrame failure");
+}
+
+bool Animation::drawFrame(SpriteAsset &spriteSet, const Common::Point &pt, int frameNumber) {
+ return 0;
+}
+
+void Animation::loadInterface(UserInterface &interfaceSurface, DepthSurface &depthSurface,
+ AAHeader &header, int flags, Common::Array<PaletteCycle> *palCycles, SceneInfo *sceneInfo) {
+ _scene->_depthStyle = 0;
+ if (header._bgType <= ANIMBG_FULL_SIZE) {
+ _vm->_palette->_paletteUsage.setEmpty();
+ sceneInfo->load(header._roomNumber, flags, header._interfaceFile, 0, depthSurface, interfaceSurface);
+ _scene->_depthStyle = sceneInfo->_depthStyle == 2 ? 1 : 0;
+ if (palCycles) {
+ palCycles->clear();
+ for (uint i = 0; i < sceneInfo->_paletteCycles.size(); ++i)
+ palCycles->push_back(sceneInfo->_paletteCycles[i]);
+ }
+ } else if (header._bgType == ANIMBG_INTERFACE) {
+ // Load a scene interface
+ Common::String resourceName = "*" + header._interfaceFile;
+ interfaceSurface.load(resourceName);
+
+ if (palCycles)
+ palCycles->clear();
+ } else {
+ // Original has useless code here
+ }
+}
+
+bool Animation::hasScroll() const {
+ return (_header._scrollPosition.x != 0) || (_header._scrollPosition.y != 0);
+}
+
+void Animation::update() {
+ Scene &scene = _vm->_game->_scene;
+
+ if (_header._manualFlag) {
+ int spriteListIndex = _spriteListIndexes[_header._spritesIndex];
+ int newIndex = -1;
+
+ for (uint idx = _oldFrameEntry; idx < _frameEntries.size(); ++idx) {
+ if (_frameEntries[idx]._frameNumber > _currentFrame)
+ break;
+ if (_frameEntries[idx]._spriteSlot._spritesIndex == spriteListIndex)
+ newIndex = _frameEntries[idx]._spriteSlot._frameNumber;
+ }
+
+ if (newIndex >= 0)
+ loadFrame(newIndex);
+ }
+
+ // If it's not time for the next frame, then exit
+ if (_vm->_game->_scene._frameStartTime < _nextFrameTimer)
+ return;
+
+ for (uint idx = 0; idx < scene._spriteSlots.size(); ++idx) {
+ if (scene._spriteSlots[idx]._seqIndex >= 0x80)
+ scene._spriteSlots[idx]._flags = IMG_ERASE;
+ }
+
+ // Validate the current frame
+ if (_currentFrame >= (int)_miscEntries.size()) {
+ // Is the animation allowed to be repeated?
+ if (_resetFlag) {
+ _currentFrame = 0;
+ _oldFrameEntry = 0;
+ } else {
+ _freeFlag = true;
+ return;
+ }
+ }
+
+ // Handle executing any sound command for this frame
+ AnimMiscEntry &misc = _miscEntries[_currentFrame];
+ if (misc._soundId)
+ _vm->_sound->command(misc._soundId);
+
+ // Handle any screen scrolling
+ if (hasScroll()) {
+ scene._backgroundSurface.scrollX(_header._scrollPosition.x);
+ scene._backgroundSurface.scrollY(_header._scrollPosition.y);
+ scene._spriteSlots.fullRefresh();
+ }
+
+ // Handle any offset adjustment for sprites as of this frame
+ bool paChanged = false;
+ if (scene._posAdjust.x != misc._posAdjust.x) {
+ scene._posAdjust.x = misc._posAdjust.x;
+ paChanged = true;
+ }
+ if (scene._posAdjust.y != misc._posAdjust.y) {
+ scene._posAdjust.y = misc._posAdjust.y;
+ paChanged = true;
+ }
+
+ if (paChanged) {
+ int newIndex = scene._spriteSlots.add();
+ scene._spriteSlots[newIndex]._seqIndex = -1;
+ scene._spriteSlots[newIndex]._flags = IMG_REFRESH;
+ }
+
+ // Main frame animation loop - frames get animated by being placed, as necessary, into the
+ // main sprite slot array
+ while ((uint)_oldFrameEntry < _frameEntries.size()) {
+ if (_frameEntries[_oldFrameEntry]._frameNumber > _currentFrame)
+ break;
+ else if (_frameEntries[_oldFrameEntry]._frameNumber == _currentFrame) {
+ // Found the correct frame
+ int spriteSlotIndex = 0;
+ int index = 0;
+
+ for (;;) {
+ if ((spriteSlotIndex == 0) && (index < (int)scene._spriteSlots.size())) {
+ int seqIndex = _frameEntries[_oldFrameEntry]._seqIndex - scene._spriteSlots[index]._seqIndex;
+ if (seqIndex == 0x80) {
+ if (scene._spriteSlots[index] == _frameEntries[_oldFrameEntry]._spriteSlot) {
+ scene._spriteSlots[index]._flags = IMG_STATIC;
+ spriteSlotIndex = -1;
+ }
+ }
+ ++index;
+ continue;
+ }
+
+ if (spriteSlotIndex == 0) {
+ int slotIndex = scene._spriteSlots.add();
+ SpriteSlot &slot = scene._spriteSlots[slotIndex];
+ slot.copy(_frameEntries[_oldFrameEntry]._spriteSlot);
+ slot._seqIndex = _frameEntries[_oldFrameEntry]._seqIndex + 0x80;
+
+ SpriteAsset &spriteSet = *scene._sprites[
+ scene._spriteSlots[slotIndex]._spritesIndex];
+ slot._flags = spriteSet.isBackground() ? IMG_DELTA : IMG_UPDATE;
+ }
+ break;
+ }
+ }
+
+ ++_oldFrameEntry;
+ }
+
+ // Handle the display of any messages
+ for (uint idx = 0; idx < _messages.size(); ++idx) {
+ if (_messages[idx]._kernelMsgIndex >= 0) {
+ // Handle currently active message
+ if ((_currentFrame < _messages[idx]._startFrame) || (_currentFrame > _messages[idx]._endFrame)) {
+ scene._kernelMessages.remove(_messages[idx]._kernelMsgIndex);
+ _messages[idx]._kernelMsgIndex = -1;
+ --_messageCtr;
+ }
+ } else if ((_currentFrame >= _messages[idx]._startFrame) && (_currentFrame <= _messages[idx]._endFrame)) {
+ // Start displaying the message
+ AnimMessage &me = _messages[idx];
+
+ // The color index to use is dependant on how many messages are currently on-screen
+ uint8 colIndex;
+ switch (_messageCtr) {
+ case 1:
+ colIndex = 252;
+ break;
+ case 2:
+ colIndex = 16;
+ break;
+ default:
+ colIndex = 250;
+ break;
+ }
+
+ _vm->_palette->setEntry(colIndex, me._rgb1[0], me._rgb1[1], me._rgb1[2]);
+ _vm->_palette->setEntry(colIndex + 1, me._rgb2[0], me._rgb2[1], me._rgb2[2]);
+
+ // Add a kernel message to display the given text
+ me._kernelMsgIndex = scene._kernelMessages.add(me._pos, colIndex * 0x101 + 0x100,
+ 0, 0, INDEFINITE_TIMEOUT, me._msg);
+ assert(me._kernelMsgIndex >= 0);
+ ++_messageCtr;
+ }
+ }
+
+ // Move to the next frame
+ _currentFrame++;
+ if (_currentFrame >= (int)_miscEntries.size()) {
+ // Animation is complete
+ if (_trigger != 0) {
+ _vm->_game->_trigger = _trigger;
+ _vm->_game->_triggerMode = _triggerMode;
+
+ if (_triggerMode != SEQUENCE_TRIGGER_DAEMON) {
+ // Copy the noun list
+ scene._action._activeAction = _actionDetails;
+ }
+ }
+ }
+
+ int frameNum = MIN(_currentFrame, (int)_miscEntries.size() - 1);
+ _nextFrameTimer = _vm->_game->_scene._frameStartTime + _miscEntries[frameNum]._numTicks;
+}
+
+void Animation::setCurrentFrame(int frameNumber) {
+ _currentFrame = frameNumber;
+ _oldFrameEntry = 0;
+ _freeFlag = false;
+
+ _nextScrollTimer = _nextFrameTimer = _vm->_game->_scene._frameStartTime;
+}
+
+void Animation::setNextFrameTimer(int frameNumber) {
+ _nextFrameTimer = frameNumber;
+}
+
+} // End of namespace MADS
diff --git a/engines/mads/animation.h b/engines/mads/animation.h
new file mode 100644
index 0000000000..15086d3e41
--- /dev/null
+++ b/engines/mads/animation.h
@@ -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.
+ *
+ */
+
+#ifndef MADS_ANIMATION_H
+#define MADS_ANIMATION_H
+
+#include "common/scummsys.h"
+#include "common/array.h"
+#include "common/rect.h"
+#include "mads/msurface.h"
+#include "mads/scene_data.h"
+#include "mads/font.h"
+#include "mads/user_interface.h"
+
+namespace MADS {
+
+enum AnimFlag {
+ ANIMFLAG_DITHER = 0x0001, // Dither to 16 colors
+ ANIMFLAG_CUSTOM_FONT = 0x0020, // Load ccustom font
+ ANIMFLAG_LOAD_BACKGROUND = 0x0100, // Load background
+ ANIMFLAG_LOAD_BACKGROUND_ONLY = 0x0200 // Load background only
+};
+
+enum AnimBgType {
+ ANIMBG_ROOM = 1, ANIMBG_FULL_SIZE = 2, ANIMBG_BLACK_SCREEN = 3,
+ ANIMBG_INTERFACE = 4
+};
+
+class MADSEngine;
+class Scene;
+
+class AnimMessage {
+public:
+ int16 _soundId;
+ Common::String _msg;
+ Common::Point _pos;
+ byte _rgb1[3], _rgb2[3];
+ int _flags;
+ int _startFrame, _endFrame;
+ int _kernelMsgIndex;
+
+ /**
+ * Loads data for the message from a stream
+ */
+ void load(Common::SeekableReadStream *f);
+};
+
+class AnimFrameEntry {
+public:
+ int _frameNumber;
+ int _seqIndex;
+ SpriteSlotSubset _spriteSlot;
+
+ /**
+ * Loads data for the record
+ */
+ void load(Common::SeekableReadStream *f, bool uiFlag);
+};
+
+class AnimMiscEntry {
+public:
+ int _soundId;
+ int _msgIndex;
+ int _numTicks;
+ Common::Point _posAdjust;
+ int _field8;
+
+ /**
+ * Loads data for the record
+ */
+ void load(Common::SeekableReadStream *f);
+};
+
+#define ANIM_SPAWN_COUNT 2
+
+class AnimUIEntry {
+public:
+ int _probability;
+ int _imageCount;
+ int _firstImage;
+ int _lastImage;
+ int _counter;
+ int _spawn[ANIM_SPAWN_COUNT];
+ int _spawnFrame[ANIM_SPAWN_COUNT];
+ int _sound;
+ int _soundFrame;
+
+ /**
+ * Loads the data for the record
+ */
+ void load(Common::SeekableReadStream *f);
+};
+
+class AAHeader {
+public:
+ int _spriteSetsCount;
+ int _miscEntriesCount;
+ int _frameEntriesCount;
+ int _messagesCount;
+ byte _flags;
+ AnimBgType _bgType;
+ int _roomNumber;
+ bool _manualFlag;
+ int _spritesIndex;
+ Common::Point _scrollPosition;
+ uint32 _scrollTicks;
+ Common::String _interfaceFile;
+ Common::StringArray _spriteSetNames;
+ Common::String _lbmFilename;
+ Common::String _spritesFilename;
+ Common::String _soundName;
+ Common::String _dsrName;
+ Common::String _fontResource;
+
+ /**
+ * Loads the data for a animation file header
+ */
+ void load(Common::SeekableReadStream *f);
+};
+
+class Animation {
+private:
+ MADSEngine *_vm;
+ Scene *_scene;
+
+ Common::Array<AnimMiscEntry> _miscEntries;
+ Common::Array<SpriteAsset *> _spriteSets;
+ Font *_font;
+
+ bool _freeFlag;
+ bool _skipLoad;
+ int _unkIndex;
+ Common::Point _unkList[2];
+ uint32 _nextFrameTimer;
+ uint32 _nextScrollTimer;
+ int _messageCtr;
+ int _trigger;
+ TriggerMode _triggerMode;
+ ActionDetails _actionDetails;
+
+ /**
+ * Load data for a given frame
+ * @param frameNumber Frame number
+ */
+ void loadFrame(int frameNumber);
+
+ bool drawFrame(SpriteAsset &spriteSet, const Common::Point &pt, int frameNumber);
+
+ /**
+ * Load the user interface display for an animation
+ */
+ void loadInterface(UserInterface &interfaceSurface, DepthSurface &depthSurface,
+ AAHeader &header, int flags, Common::Array<PaletteCycle> *palCycles, SceneInfo *sceneInfo);
+
+ /**
+ * Returns true if there is a scroll required
+ */
+ bool hasScroll() const;
+protected:
+ Animation(MADSEngine *vm, Scene *scene);
+public:
+ AAHeader _header;
+ Common::Array<int> _spriteListIndexes;
+ Common::Array<AnimFrameEntry> _frameEntries;
+ Common::Array<AnimUIEntry> _uiEntries;
+ Common::Array<AnimMessage> _messages;
+ bool _resetFlag;
+ int _currentFrame;
+ int _oldFrameEntry;
+
+ static Animation *init(MADSEngine *vm, Scene *scene);
+ /*
+ * Destructor
+ */
+ ~Animation();
+
+ /**
+ * Loads animation data
+ */
+ void load(UserInterface &interfaceSurface, DepthSurface &depthSurface, const Common::String &resName,
+ int flags, Common::Array<PaletteCycle> *palCycles, SceneInfo *sceneInfo);
+
+ /**
+ * Preload animation data for the scene
+ */
+ void preLoad(const Common::String &resName, int level);
+
+ /**
+ * Setups up a loaded animation for playback
+ */
+ void startAnimation(int endTrigger);
+
+ /**
+ * Update the animation
+ */
+ void update();
+
+ void setNextFrameTimer(int frameNumber);
+ int getNextFrameTimer() const { return _nextFrameTimer; }
+ void setCurrentFrame(int frameNumber);
+ int getCurrentFrame() const { return _currentFrame; }
+
+ bool freeFlag() const { return _freeFlag; }
+ int roomNumber() const { return _header._roomNumber; }
+
+ void resetSpriteSetsCount() { _header._spriteSetsCount = 0; } // CHECKME: See if it doesn't leak the memory when the destructor is called
+};
+
+} // End of namespace MADS
+
+#endif /* MADS_ANIMATION_H */
diff --git a/engines/mads/assets.cpp b/engines/mads/assets.cpp
new file mode 100644
index 0000000000..a2d495f311
--- /dev/null
+++ b/engines/mads/assets.cpp
@@ -0,0 +1,228 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+
+ * You should have received a copy of the GNU General Public 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 "mads/mads.h"
+#include "mads/assets.h"
+#include "mads/compression.h"
+#include "mads/events.h"
+#include "mads/palette.h"
+
+namespace MADS {
+
+SpriteAsset::SpriteAsset(MADSEngine *vm, const Common::String &resourceName, int flags) : _vm(vm) {
+ Common::String resName = resourceName;
+ if (!resName.hasSuffix(".SS") && !resName.hasSuffix(".ss"))
+ resName += ".SS";
+ _srcSize = 0;
+
+ File file(resName);
+ load(&file, flags);
+
+ file.close();
+}
+
+SpriteAsset::SpriteAsset(MADSEngine *vm, Common::SeekableReadStream *stream, int flags) : _vm(vm) {
+ _srcSize = 0;
+
+ load(stream, flags);
+}
+
+SpriteAsset::~SpriteAsset() {
+ if (_usageIndex)
+ _vm->_palette->_paletteUsage.resetPalFlags(_usageIndex);
+
+ for (uint i = 0; i < _frames.size(); ++i)
+ delete _frames[i]._frame;
+
+ delete _charInfo;
+}
+
+void SpriteAsset::load(Common::SeekableReadStream *stream, int flags) {
+ int curFrame = 0;
+ uint32 frameOffset = 0;
+ MadsPack sprite(stream);
+ _frameRate = 0;
+ _pixelSpeed = 0;
+ _maxWidth = 0;
+ _maxHeight = 0;
+ _usageIndex = -1;
+
+ Common::SeekableReadStream *spriteStream = sprite.getItemStream(0);
+ _mode = spriteStream->readByte();
+ spriteStream->skip(1);
+ int type1 = spriteStream->readUint16LE();
+ int type2 = spriteStream->readUint16LE();
+ _isBackground = (type1 != 0) && (type2 < 4);
+ spriteStream->skip(32);
+ _frameCount = spriteStream->readUint16LE();
+
+ if ((flags & ASSET_CHAR_INFO) == 0)
+ _charInfo = nullptr;
+ else
+ _charInfo = new SpriteSetCharInfo(spriteStream);
+
+ delete spriteStream;
+
+ // Get the palette data
+ Common::SeekableReadStream *palStream = sprite.getItemStream(2);
+ Common::Array<RGB6> palette;
+
+ int numColors = palStream->readUint16LE();
+ assert(numColors <= 252);
+ _colorCount = numColors;
+
+ // Load in the palette
+ palette.resize(numColors);
+ for (int i = 0; i < numColors; ++i)
+ palette[i].load(palStream);
+ delete palStream;
+
+ // Process the palette data
+ if (flags & (ASSET_TRANSLATE | ASSET_SPINNING_OBJECT)) {
+ _usageIndex = 0;
+
+ if (flags & ASSET_SPINNING_OBJECT) {
+ int newPalCtr = 0;
+
+ for (uint i = 0; i < palette.size(); ++i) {
+ RGB6 &rgb = palette[i];
+
+ // Scan for existing rgb at beginning of the main palette
+ bool found = false;
+ for (int pIndex = 0; pIndex < 4 && !found; ++pIndex) {
+ byte *palP = &_vm->_palette->_mainPalette[pIndex * 3];
+ if (palP[0] == rgb.r && palP[1] == rgb.g && palP[2] == rgb.b) {
+ rgb._palIndex = pIndex;
+ found = true;
+ }
+ }
+
+ if (!found) {
+ // Existing palette entry not found, so need to add it in
+ int palIndex = (0xF7F607 >> (8 * newPalCtr)) & 0xff;
+ byte *palP = &_vm->_palette->_mainPalette[palIndex * 3];
+ palP[0] = rgb.r;
+ palP[1] = rgb.g;
+ palP[2] = rgb.b;
+ rgb._palIndex = palIndex;
+
+ newPalCtr = MIN(newPalCtr + 1, 2);
+ }
+ }
+ }
+ } else {
+ _usageIndex = _vm->_palette->_paletteUsage.process(palette, flags & 0xF800);
+ assert(_usageIndex >= 0);
+ }
+
+ spriteStream = sprite.getItemStream(1);
+ Common::SeekableReadStream *spriteDataStream = sprite.getItemStream(3);
+ SpriteAssetFrame frame;
+ Common::Array<int> frameSizes;
+ for (curFrame = 0; curFrame < _frameCount; curFrame++) {
+ frame._stream = 0;
+ frame._comp = 0;
+ frameOffset = spriteStream->readUint32LE();
+ _frameOffsets.push_back(frameOffset);
+ uint32 frameSize = spriteStream->readUint32LE();
+ frameSizes.push_back(frameSize);
+
+ frame._bounds.left = spriteStream->readSint16LE();
+ frame._bounds.top = spriteStream->readSint16LE();
+ frame._bounds.setWidth(spriteStream->readUint16LE());
+ frame._bounds.setHeight(spriteStream->readUint16LE());
+
+ if (curFrame == 0)
+ debugC(1, kDebugGraphics, "%i frames, x = %i, y = %i, w = %i, h = %i\n",
+ _frameCount, frame._bounds.left, frame._bounds.top,
+ frame._bounds.width(), frame._bounds.height());
+
+ if (_mode == 0) {
+ // Create a frame and decompress the raw pixel data
+ uint32 currPos = (uint32)spriteDataStream->pos();
+ frame._frame = new MSprite(spriteDataStream, palette, frame._bounds);
+ assert((uint32)spriteDataStream->pos() == (currPos + frameSize));
+ }
+
+ _frames.push_back(frame);
+ }
+
+ if (_mode != 0) {
+ // Handle decompressing Fab encoded data
+ for (curFrame = 0; curFrame < _frameCount; curFrame++) {
+ FabDecompressor fab;
+
+ int srcSize = (curFrame == (_frameCount - 1)) ? spriteDataStream->size() - _frameOffsets[curFrame] :
+ _frameOffsets[curFrame + 1] - _frameOffsets[curFrame];
+ byte *srcData = new byte[srcSize];
+ assert(srcData);
+ spriteDataStream->read(srcData, srcSize);
+
+ byte *destData = new byte[frameSizes[curFrame]];
+ assert(destData);
+
+ fab.decompress(srcData, srcSize, destData, frameSizes[curFrame]);
+
+ // Load the frames
+ Common::MemoryReadStream *rs = new Common::MemoryReadStream(destData, frameSizes[curFrame]);
+ _frames[curFrame]._frame = new MSprite(rs, palette, _frames[curFrame]._bounds);
+ delete rs;
+
+ delete[] srcData;
+ delete[] destData;
+ }
+ }
+
+ delete spriteStream;
+ delete spriteDataStream;
+}
+
+MSprite *SpriteAsset::getFrame(int frameIndex) {
+ if ((uint)frameIndex < _frames.size()) {
+ return _frames[frameIndex]._frame;
+ } else {
+ debugC(kDebugGraphics, "SpriteAsset::getFrame: Invalid frame %d, out of %d", frameIndex, _frames.size());
+ return _frames[_frames.size() - 1]._frame;
+ }
+}
+
+/*------------------------------------------------------------------------*/
+
+SpriteSetCharInfo::SpriteSetCharInfo(Common::SeekableReadStream *s) {
+ _totalFrames = s->readByte();
+ s->skip(1);
+ _numEntries = s->readUint16LE();
+
+ for (int i = 0; i < 16; ++i)
+ _startFrames[i] = s->readUint16LE();
+ for (int i = 0; i < 16; ++i)
+ _stopFrames[i] = s->readUint16LE();
+ for (int i = 0; i < 16; ++i)
+ _ticksList[i] = s->readUint16LE();
+
+ _velocity = s->readUint16LE();
+ _ticksAmount = s->readByte();
+ _centerOfGravity = s->readByte();
+}
+
+} // End of namespace MADS
diff --git a/engines/mads/assets.h b/engines/mads/assets.h
new file mode 100644
index 0000000000..155590f9bd
--- /dev/null
+++ b/engines/mads/assets.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.
+ *
+ */
+
+#ifndef MADS_ASSETS_H
+#define MADS_ASSETS_H
+
+#include "common/scummsys.h"
+#include "common/array.h"
+#include "mads/palette.h"
+
+namespace MADS {
+
+enum AssetFlags {
+ ASSET_TRANSLATE = 1, ASSET_HEADER_ONLY = 2, ASSET_CHAR_INFO = 4,
+ ASSET_SPINNING_OBJECT = 8
+};
+
+class MADSEngine;
+class MSprite;
+class MSurface;
+
+struct SpriteAssetFrame {
+ uint32 _stream;
+ Common::Rect _bounds;
+ uint32 _comp;
+ MSprite *_frame;
+};
+
+class SpriteSetCharInfo {
+public:
+ SpriteSetCharInfo(Common::SeekableReadStream *s);
+
+ int _totalFrames;
+ int _numEntries;
+ int _startFrames[16];
+ int _stopFrames[16];
+ int _ticksList[16];
+ int _velocity;
+ int _ticksAmount;
+ int _centerOfGravity;
+};
+
+class SpriteAsset {
+private:
+ MADSEngine *_vm;
+ byte _palette[PALETTE_SIZE];
+ int _colorCount;
+ uint32 _srcSize;
+ int _frameRate, _pixelSpeed;
+ int _maxWidth, _maxHeight;
+ int _frameCount;
+ Common::Array<uint32> _frameOffsets;
+ Common::Array<SpriteAssetFrame> _frames;
+ uint8 _mode;
+ bool _isBackground;
+
+ /**
+ * Load the data for the asset
+ */
+ void load(Common::SeekableReadStream *stream, int flags);
+public:
+ SpriteSetCharInfo *_charInfo;
+ int _usageIndex;
+public:
+ /**
+ * Constructor
+ */
+ SpriteAsset(MADSEngine *vm, const Common::String &resourceName, int flags);
+
+ /**
+ * Constructor
+ */
+ SpriteAsset(MADSEngine *vm, Common::SeekableReadStream *stream, int flags);
+
+ /**
+ * Destructor
+ */
+ ~SpriteAsset();
+
+ int getCount() { return _frameCount; }
+ int getFrameRate() const { return _frameRate; }
+ int getPixelSpeed() const { return _pixelSpeed; }
+ int getFrameWidth(int index);
+ int getFrameHeight(int index);
+ int getMaxFrameWidth() const { return _maxWidth; }
+ int getMaxFrameHeight() const { return _maxHeight; }
+ MSprite *getFrame(int frameIndex);
+ byte *getPalette() { return _palette; }
+ int getColorCount() { return _colorCount; }
+ bool isBackground() const { return _isBackground; }
+};
+
+} // End of namespace MADS
+
+#endif /* MADS_ASSETS_H */
diff --git a/engines/mads/audio.cpp b/engines/mads/audio.cpp
new file mode 100644
index 0000000000..1c61e13957
--- /dev/null
+++ b/engines/mads/audio.cpp
@@ -0,0 +1,129 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+
+ * You should have received a copy of the GNU General Public 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 "mads/audio.h"
+#include "mads/compression.h"
+
+#include "common/stream.h"
+#include "audio/audiostream.h"
+#include "audio/mixer.h"
+#include "audio/decoders/raw.h"
+
+namespace MADS {
+
+AudioPlayer::AudioPlayer(Audio::Mixer *mixer, uint32 gameID) : _mixer(mixer), _gameID(gameID) {
+ setVolume(Audio::Mixer::kMaxChannelVolume);
+ setDefaultSoundGroup();
+}
+
+AudioPlayer::~AudioPlayer() {
+ _dsrEntries.clear();
+}
+
+bool AudioPlayer::isPlaying() const {
+ return _mixer->isSoundHandleActive(_handle);
+}
+
+void AudioPlayer::setVolume(int volume) {
+ _mixer->setVolumeForSoundType(Audio::Mixer::kSFXSoundType, volume);
+ _mixer->setVolumeForSoundType(Audio::Mixer::kSpeechSoundType, volume);
+}
+
+void AudioPlayer::setDefaultSoundGroup() {
+ switch (_gameID) {
+ case GType_RexNebular:
+ setSoundGroup("rex009.dsr");
+ break;
+ case GType_Dragonsphere:
+ setSoundGroup("drag009.dsr");
+ break;
+ case GType_Phantom:
+ setSoundGroup("phan009.dsr");
+ break;
+ default:
+ error("setDefaultSoundGroup: Unknown game");
+ }
+}
+
+void AudioPlayer::setSoundGroup(const Common::String &filename) {
+ _dsrEntries.clear();
+
+ _filename = filename;
+ _dsrFile.open(filename);
+
+ // Read header
+ uint16 entryCount = _dsrFile.readUint16LE();
+
+ for (uint16 i = 0; i < entryCount; i++) {
+ DSREntry newEntry;
+ newEntry.frequency = _dsrFile.readUint16LE();
+ newEntry.channels = _dsrFile.readUint32LE();
+ newEntry.compSize = _dsrFile.readUint32LE();
+ newEntry.uncompSize = _dsrFile.readUint32LE();
+ newEntry.offset = _dsrFile.readUint32LE();
+ _dsrEntries.push_back(newEntry);
+ }
+
+ _dsrFile.close();
+}
+
+void AudioPlayer::playSound(int soundIndex, bool loop) {
+ if (_dsrEntries.empty()) {
+ warning("DSR file not loaded, not playing sound");
+ return;
+ }
+
+ if (soundIndex < 0 || soundIndex > (int)_dsrEntries.size() - 1) {
+ warning("Invalid sound index: %i (max %i), not playing sound", soundIndex, _dsrEntries.size() - 1);
+ return;
+ }
+
+ // Get sound data
+ FabDecompressor fab;
+ int32 compSize = _dsrEntries[soundIndex].compSize;
+ int32 uncompSize = _dsrEntries[soundIndex].uncompSize;
+ int32 offset = _dsrEntries[soundIndex].offset;
+ int16 frequency = _dsrEntries[soundIndex].frequency;
+ byte *compData = new byte[compSize];
+ byte *buffer = new byte[uncompSize];
+ _dsrFile.open(_filename);
+ _dsrFile.seek(offset, SEEK_SET);
+ _dsrFile.read(compData, compSize);
+ _dsrFile.close();
+
+ fab.decompress(compData, compSize, buffer, uncompSize);
+
+ // Play sound
+ Audio::AudioStream *stream = Audio::makeLoopingAudioStream(
+ Audio::makeRawStream(buffer, uncompSize, frequency, Audio::FLAG_UNSIGNED),
+ loop ? 0 : 1);
+ _mixer->playStream(Audio::Mixer::kSFXSoundType, &_handle, stream, -1, Audio::Mixer::kMaxChannelVolume);
+
+ /*
+ // Dump the sound file
+ FILE *destFile = fopen("sound.raw", "wb");
+ fwrite(_dsrFile.dsrEntries[soundIndex]->data, _dsrFile.dsrEntries[soundIndex].uncompSize, 1, destFile);
+ fclose(destFile);
+ */
+}
+
+} // End of namespace M4
diff --git a/engines/mads/audio.h b/engines/mads/audio.h
new file mode 100644
index 0000000000..21f4bed59a
--- /dev/null
+++ b/engines/mads/audio.h
@@ -0,0 +1,64 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+
+ * You should have received a copy of the GNU General Public 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 MADS_AUDIO_H
+#define MADS_AUDIO_H
+
+#include "mads/resources.h"
+
+#include "common/array.h"
+#include "audio/mixer.h"
+
+namespace MADS {
+
+struct DSREntry {
+ int16 frequency;
+ int channels;
+ int32 compSize;
+ int32 uncompSize;
+ int32 offset;
+};
+
+class AudioPlayer {
+public:
+ AudioPlayer(Audio::Mixer *mixer, uint32 gameID);
+ ~AudioPlayer();
+
+ void setSoundGroup(const Common::String &filename);
+ void setDefaultSoundGroup();
+ void playSound(int soundIndex, bool loop = false);
+ void setVolume(int volume);
+ bool isPlaying() const;
+
+ private:
+ Audio::Mixer *_mixer;
+ Audio::SoundHandle _handle;
+ uint32 _gameID;
+
+ File _dsrFile;
+ Common::String _filename;
+ Common::Array<DSREntry> _dsrEntries;
+};
+
+} // End of namespace MADS
+
+#endif
diff --git a/engines/mads/compression.cpp b/engines/mads/compression.cpp
new file mode 100644
index 0000000000..79cd1786de
--- /dev/null
+++ b/engines/mads/compression.cpp
@@ -0,0 +1,194 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+
+ * You should have received a copy of the GNU General Public 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 "mads/compression.h"
+
+namespace MADS {
+
+const char *const madsPackString = "MADSPACK";
+const char *const FabInputExceededError = "FabDecompressor - Passed end of input buffer during decompression";
+const char *const FabOutputExceededError = "FabDecompressor - Decompressed data exceeded specified size";
+
+bool MadsPack::isCompressed(Common::SeekableReadStream *stream) {
+ // Check whether the passed stream is packed
+
+ char tempBuffer[8];
+ stream->seek(0);
+ if (stream->read(tempBuffer, 8) == 8) {
+ if (!strncmp(tempBuffer, madsPackString, 8))
+ return true;
+ }
+
+ return false;
+}
+
+MadsPack::MadsPack(Common::SeekableReadStream *stream) {
+ initialize(stream);
+}
+
+MadsPack::MadsPack(const Common::String &resourceName, MADSEngine *vm) {
+ File file(resourceName);
+ initialize(&file);
+ file.close();
+}
+
+void MadsPack::initialize(Common::SeekableReadStream *stream) {
+ if (!MadsPack::isCompressed(stream))
+ error("Attempted to decompress a resource that was not MadsPacked");
+
+ stream->seek(14);
+ _count = stream->readUint16LE();
+ _items = new MadsPackEntry[_count];
+
+ byte *headerData = new byte[0xA0];
+ byte *header = headerData;
+ stream->read(headerData, 0xA0);
+
+ for (int i = 0; i < _count; ++i, header += 10) {
+ // Get header data
+ _items[i]._type = (CompressionType)*header;
+ _items[i]._priority = *(header + 1);
+ _items[i]._size = READ_LE_UINT32(header + 2);
+ _items[i]._compressedSize = READ_LE_UINT32(header + 6);
+
+ byte *sourceData = new byte[_items[i]._compressedSize];
+ stream->read(sourceData, _items[i]._compressedSize);
+
+ switch (_items[i]._type) {
+ case COMPRESS_NONE:
+ // Entry isn't compressed
+ _items[i]._data = sourceData;
+ break;
+
+ case COMPRESS_FAB: {
+ // Decompress the entry
+ _items[i]._data = new byte[_items[i]._size];
+
+ FabDecompressor fab;
+ fab.decompress(sourceData, _items[i]._compressedSize, _items[i]._data, _items[i]._size);
+ delete[] sourceData;
+ break;
+ }
+
+ default:
+ error("Unknown compression type encountered");
+ }
+ }
+
+ delete[] headerData;
+ _dataOffset = stream->pos();
+}
+
+MadsPack::~MadsPack() {
+ for (int i = 0; i < _count; ++i)
+ delete[] _items[i]._data;
+ delete[] _items;
+}
+
+//--------------------------------------------------------------------------
+
+void FabDecompressor::decompress(const byte *srcData, int srcSize, byte *destData, int destSize) {
+ byte copyLen, copyOfsShift, copyOfsMask, copyLenMask;
+ unsigned long copyOfs;
+ byte *destP;
+
+ // Validate that the data starts with the FAB header
+ if (strncmp((const char *)srcData, "FAB", 3) != 0)
+ error("FabDecompressor - Invalid compressed data");
+
+ int shiftVal = srcData[3];
+ if ((shiftVal < 10) || (shiftVal > 13))
+ error("FabDecompressor - Invalid shift start");
+
+ copyOfsShift = 16 - shiftVal;
+ copyOfsMask = 0xFF << (shiftVal - 8);
+ copyLenMask = (1 << copyOfsShift) - 1;
+ copyOfs = 0xFFFF0000;
+ destP = destData;
+
+ // Initialize data fields
+ _srcData = srcData;
+ _srcP = _srcData + 6;
+ _srcSize = srcSize;
+ _bitsLeft = 16;
+ _bitBuffer = READ_LE_UINT16(srcData + 4);
+
+ for (;;) {
+ if (getBit() == 0) {
+ if (getBit() == 0) {
+ copyLen = ((getBit() << 1) | getBit()) + 2;
+ copyOfs = *_srcP++ | 0xFFFFFF00;
+ } else {
+ copyOfs = (((_srcP[1] >> copyOfsShift) | copyOfsMask) << 8) | _srcP[0];
+ copyLen = _srcP[1] & copyLenMask;
+ _srcP += 2;
+ if (copyLen == 0) {
+ copyLen = *_srcP++;
+ if (copyLen == 0)
+ break;
+ else if (copyLen == 1)
+ continue;
+ else
+ copyLen++;
+ } else {
+ copyLen += 2;
+ }
+ copyOfs |= 0xFFFF0000;
+ }
+ while (copyLen-- > 0) {
+ if (destP - destData == destSize)
+ error(FabOutputExceededError);
+
+ *destP = destP[(signed int)copyOfs];
+ destP++;
+ }
+ } else {
+ if (_srcP - srcData == srcSize)
+ error(FabInputExceededError);
+ if (destP - destData == destSize)
+ error(FabOutputExceededError);
+
+ *destP++ = *_srcP++;
+ }
+ }
+
+ if (destP - destData != destSize)
+ error("FabDecompressor - Decompressed data does not match header decompressed size");
+}
+
+int FabDecompressor::getBit() {
+ _bitsLeft--;
+ if (_bitsLeft == 0) {
+ if (_srcP - _srcData == _srcSize)
+ error(FabInputExceededError);
+
+ _bitBuffer = (READ_LE_UINT16(_srcP) << 1) | (_bitBuffer & 1);
+ _srcP += 2;
+ _bitsLeft = 16;
+ }
+
+ int bit = _bitBuffer & 1;
+ _bitBuffer >>= 1;
+ return bit;
+}
+
+} // End of namespace MADS
diff --git a/engines/mads/compression.h b/engines/mads/compression.h
new file mode 100644
index 0000000000..f7381e4af3
--- /dev/null
+++ b/engines/mads/compression.h
@@ -0,0 +1,89 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+
+ * You should have received a copy of the GNU General Public 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 MADS_COMPRESSION_H
+#define MADS_COMPRESSION_H
+
+#include "common/scummsys.h"
+#include "common/endian.h"
+#include "common/memstream.h"
+#include "common/stream.h"
+
+#include "mads/mads.h"
+
+namespace MADS {
+
+enum CompressionType { COMPRESS_NONE = 0, COMPRESS_FAB = 1 };
+
+struct MadsPackEntry {
+public:
+ CompressionType _type;
+ byte _priority;
+ uint32 _size;
+ uint32 _compressedSize;
+ byte *_data;
+};
+
+class MadsPack {
+private:
+ MadsPackEntry *_items;
+ int _count;
+ int _dataOffset;
+
+ void initialize(Common::SeekableReadStream *stream);
+public:
+ static bool isCompressed(Common::SeekableReadStream *stream);
+ MadsPack(Common::SeekableReadStream *stream);
+ MadsPack(const Common::String &resourceName, MADSEngine *_vm);
+ ~MadsPack();
+
+ int getCount() const { return _count; }
+ MadsPackEntry &getItem(int index) const {
+ assert(index < _count);
+ return _items[index]; }
+ MadsPackEntry &operator[](int index) const {
+ assert(index < _count);
+ return _items[index];
+ }
+ Common::MemoryReadStream *getItemStream(int index) {
+ assert(index < _count);
+ return new Common::MemoryReadStream(_items[index]._data, _items[index]._size,
+ DisposeAfterUse::NO);
+ }
+ int getDataOffset() const { return _dataOffset; }
+};
+
+class FabDecompressor {
+private:
+ int _bitsLeft;
+ uint32 _bitBuffer;
+ const byte *_srcData, *_srcP;
+ int _srcSize;
+
+ int getBit();
+public:
+ void decompress(const byte *srcData, int srcSize, byte *destData, int destSize);
+};
+
+} // End of namespace MADS
+
+#endif
diff --git a/engines/mads/configure.engine b/engines/mads/configure.engine
new file mode 100644
index 0000000000..60d833e9e8
--- /dev/null
+++ b/engines/mads/configure.engine
@@ -0,0 +1,3 @@
+# This file is included from the main "configure" script
+# add_engine [name] [desc] [build-by-default] [subengines] [base games] [deps]
+add_engine mads "Rex Nebular and the Cosmic Gender Bender" no
diff --git a/engines/mads/debugger.cpp b/engines/mads/debugger.cpp
new file mode 100644
index 0000000000..1ff42c5e2b
--- /dev/null
+++ b/engines/mads/debugger.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/file.h"
+#include "mads/mads.h"
+#include "mads/debugger.h"
+
+namespace MADS {
+
+Debugger::Debugger(MADSEngine *vm) : GUI::Debugger(), _vm(vm) {
+ _showMousePos = false;
+
+ registerCmd("continue", WRAP_METHOD(Debugger, cmdExit));
+ registerCmd("mouse", WRAP_METHOD(Debugger, Cmd_Mouse));
+ registerCmd("scene", WRAP_METHOD(Debugger, Cmd_LoadScene));
+ registerCmd("show_hotspots", WRAP_METHOD(Debugger, Cmd_ShowHotSpots));
+ registerCmd("list_hotspots", WRAP_METHOD(Debugger, Cmd_ListHotSpots));
+ registerCmd("play_sound", WRAP_METHOD(Debugger, Cmd_PlaySound));
+ registerCmd("play_audio", WRAP_METHOD(Debugger, Cmd_PlayAudio));
+ registerCmd("show_codes", WRAP_METHOD(Debugger, Cmd_ShowCodes));
+ registerCmd("dump_file", WRAP_METHOD(Debugger, Cmd_DumpFile));
+ registerCmd("show_quote", WRAP_METHOD(Debugger, Cmd_ShowQuote));
+ registerCmd("show_vocab", WRAP_METHOD(Debugger, Cmd_ShowVocab));
+ registerCmd("dump_vocab", WRAP_METHOD(Debugger, Cmd_DumpVocab));
+ registerCmd("show_message", WRAP_METHOD(Debugger, Cmd_ShowMessage));
+ registerCmd("show_item", WRAP_METHOD(Debugger, Cmd_ShowItem));
+ registerCmd("dump_items", WRAP_METHOD(Debugger, Cmd_DumpItems));
+ registerCmd("item", WRAP_METHOD(Debugger, Cmd_Item));
+}
+
+static int strToInt(const char *s) {
+ if (!*s)
+ // No string at all
+ return 0;
+ else if (toupper(s[strlen(s) - 1]) != 'H')
+ // Standard decimal string
+ return atoi(s);
+
+ // Hexadecimal string
+ uint tmp = 0;
+ int read = sscanf(s, "%xh", &tmp);
+ if (read < 1)
+ error("strToInt failed on string \"%s\"", s);
+ return (int)tmp;
+}
+
+bool Debugger::Cmd_Mouse(int argc, const char **argv) {
+ if (argc < 2) {
+ debugPrintf("Usage: %s [ on | off ]\n", argv[0]);
+ } else {
+ _showMousePos = strcmp(argv[1], "on") == 0;
+ }
+
+ return true;
+}
+
+bool Debugger::Cmd_LoadScene(int argc, const char **argv) {
+ if (argc != 2) {
+ debugPrintf("Current scene is: %d\n", _vm->_game->_scene._currentSceneId);
+ debugPrintf("Usage: %s <scene number>\n", argv[0]);
+ return true;
+ } else {
+ _vm->_game->_scene._nextSceneId = strToInt(argv[1]);
+ return false;
+ }
+}
+
+bool Debugger::Cmd_ShowHotSpots(int argc, const char **argv) {
+ Scene &scene = _vm->_game->_scene;
+
+ // hotspots
+ byte hotspotCol = _vm->getRandomNumber(255);
+ for (uint i = 0; i < scene._hotspots.size(); i++) {
+ scene._backgroundSurface.frameRect(scene._hotspots[i]._bounds, hotspotCol);
+ }
+
+ // Dynamic hotspots (red)
+ hotspotCol = _vm->getRandomNumber(255);
+ for (uint i = 0; i < scene._dynamicHotspots.size(); i++) {
+ scene._backgroundSurface.frameRect(scene._dynamicHotspots[i]._bounds, hotspotCol);
+ }
+
+ scene._spriteSlots.fullRefresh();
+ return false;
+}
+
+bool Debugger::Cmd_ListHotSpots(int argc, const char **argv) {
+ Hotspots &hotspots = _vm->_game->_scene._hotspots;
+
+ debugPrintf("%d hotspots present\n", hotspots.size());
+
+ for (uint index = 0; index < hotspots.size(); ++index) {
+ debugPrintf("(%d): %p x1 = %d; y1 = %d; x2 = %d; y2 = %d\n",
+ index, (void *)&hotspots[index],
+ hotspots[index]._bounds.left, hotspots[index]._bounds.top,
+ hotspots[index]._bounds.right, hotspots[index]._bounds.bottom);
+ }
+
+ return true;
+}
+
+bool Debugger::Cmd_PlaySound(int argc, const char **argv) {
+ if (argc < 2) {
+ debugPrintf("Usage: %s <sound file>\n", argv[0]);
+ } else {
+ int commandId = strToInt(argv[1]);
+ int param = (argc >= 3) ? strToInt(argv[2]) : 0;
+
+ _vm->_sound->command(commandId, param);
+ }
+
+ return false;
+}
+
+bool Debugger::Cmd_PlayAudio(int argc, const char **argv) {
+ if (argc < 2) {
+ debugPrintf("Usage: %s <sound index> <sound group>\n", argv[0]);
+ debugPrintf("If the sound group isn't defined, the default one will be used\n");
+ } else {
+ int index = strToInt(argv[1]);
+ Common::String soundGroup = (argc >= 3) ? argv[2] : "";
+ if (argc >= 3)
+ _vm->_audio->setSoundGroup(argv[2]);
+ else
+ _vm->_audio->setDefaultSoundGroup();
+
+ _vm->_audio->playSound(index);
+ }
+
+ return true;
+}
+
+bool Debugger::Cmd_ShowCodes(int argc, const char **argv) {
+ Scene &scene = _vm->_game->_scene;
+
+ // Copy the depth/walk surface to the background and flag for screen refresh
+ scene._depthSurface.copyTo(&scene._backgroundSurface);
+ scene._spriteSlots.fullRefresh();
+
+ // Draw the locations of scene nodes onto the background
+ int color = _vm->getRandomNumber(255);
+ for (int i = 0; i < (int)scene._sceneInfo->_nodes.size(); ++i) {
+ Common::Point &pt = scene._sceneInfo->_nodes[i]._walkPos;
+
+ scene._backgroundSurface.hLine(pt.x - 2, pt.y, pt.x + 2, color);
+ scene._backgroundSurface.vLine(pt.x, pt.y - 2, pt.y + 2, color);
+ }
+
+ return false;
+}
+
+bool Debugger::Cmd_DumpFile(int argc, const char **argv) {
+ if (argc != 2) {
+ debugPrintf("Usage: %s <resource>\n", argv[0]);
+ } else {
+ Common::DumpFile outFile;
+ Common::File inFile;
+
+ if (!inFile.open(argv[1])) {
+ debugPrintf("Specified resource does not exist\n");
+ } else {
+ outFile.open(argv[1]);
+ byte *data = new byte[inFile.size()];
+
+ inFile.read(data, inFile.size());
+ outFile.write(data, inFile.size());
+ outFile.flush();
+
+ delete[] data;
+ inFile.close();
+ outFile.close();
+
+ debugPrintf("File written successfully.\n");
+ }
+ }
+
+ return true;
+}
+
+bool Debugger::Cmd_ShowQuote(int argc, const char **argv) {
+ if (argc != 2)
+ debugPrintf("Usage: %s <quote number>\n", argv[0]);
+ else
+ debugPrintf("%s", _vm->_game->getQuote(strToInt(argv[1])).c_str());
+
+ return true;
+}
+
+bool Debugger::Cmd_ShowVocab(int argc, const char **argv) {
+ if (argc != 2) {
+ for (uint32 i = 0; i < _vm->_game->_scene.getVocabStringsCount(); i++) {
+ debugPrintf("%03d: '%s'\n", i, _vm->_game->_scene.getVocab(i + 1).c_str());
+ }
+ } else {
+ int vocabId = strToInt(argv[1]);
+ debugPrintf("%03d: '%s'\n", vocabId, _vm->_game->_scene.getVocab(vocabId + 1).c_str());
+ }
+
+ return true;
+}
+
+bool Debugger::Cmd_DumpVocab(int argc, const char **argv) {
+ Common::DumpFile outFile;
+ outFile.open("vocab.txt");
+
+ for (uint32 i = 0; i < _vm->_game->_scene.getVocabStringsCount(); i++) {
+ Common::String curId = Common::String::format("%x", i + 1);
+ Common::String curVocab = _vm->_game->_scene.getVocab(i + 1);
+ curVocab.toUppercase();
+
+ for (uint j = 0; j < curVocab.size(); j++) {
+ if (curVocab[j] == ' ' || curVocab[j] == '-')
+ curVocab.setChar('_', j);
+ }
+
+ Common::String cur = "\tNOUN_" + curVocab + " = 0x" + curId + ",\n";
+
+ outFile.writeString(cur.c_str());
+ }
+
+ outFile.flush();
+ outFile.close();
+
+ debugPrintf("Game vocab dumped\n");
+
+ return true;
+}
+
+bool Debugger::Cmd_ShowMessage(int argc, const char **argv) {
+ if (argc != 2) {
+ debugPrintf("Usage: %s <message number>\n", argv[0]);
+ } else {
+ int messageId = strToInt(argv[1]);
+ Common::StringArray msg = _vm->_game->getMessage(messageId);
+ for (uint idx = 0; idx < msg.size(); ++idx) {
+ Common::String srcLine = msg[idx];
+ debugPrintf("%s\n", srcLine.c_str());
+ }
+ }
+
+ return true;
+}
+
+bool Debugger::Cmd_ShowItem(int argc, const char **argv) {
+ InventoryObjects &objects = _vm->_game->_objects;
+
+ if (argc != 2) {
+ for (uint32 i = 0; i < objects.size(); i++) {
+ Common::String desc = _vm->_game->_scene.getVocab(objects[i]._descId);
+ debugPrintf("%03d: '%s'\n", i, desc.c_str());
+ }
+ } else {
+ int vocabId = strToInt(argv[1]);
+ Common::String desc = _vm->_game->_scene.getVocab(objects[vocabId]._descId);
+ debugPrintf("%03d: '%s'\n", vocabId, desc.c_str());
+ }
+
+ return true;
+}
+
+bool Debugger::Cmd_DumpItems(int argc, const char **argv) {
+ InventoryObjects &objects = _vm->_game->_objects;
+
+ Common::DumpFile outFile;
+ outFile.open("items.txt");
+
+ for (uint32 i = 0; i < objects.size(); i++) {
+ Common::String curId = Common::String::format("%d", i);
+ Common::String desc = _vm->_game->_scene.getVocab(objects[i]._descId);
+ desc.toUppercase();
+
+ for (uint j = 0; j < desc.size(); j++) {
+ if (desc[j] == ' ' || desc[j] == '-')
+ desc.setChar('_', j);
+ }
+
+ Common::String cur = "\tOBJ_" + desc + " = " + curId + ",\n";
+
+ outFile.writeString(cur.c_str());
+ }
+
+ outFile.flush();
+ outFile.close();
+
+ debugPrintf("Game items dumped\n");
+
+ return true;
+}
+
+bool Debugger::Cmd_Item(int argc, const char **argv) {
+ InventoryObjects &objects = _vm->_game->_objects;
+
+ if (argc != 2) {
+ debugPrintf("Usage: %s <item number>\n", argv[0]);
+ return true;
+ } else {
+ int objectId = strToInt(argv[1]);
+
+ if (!objects.isInInventory(objectId))
+ objects.addToInventory(objectId);
+
+ debugPrintf("Item added.\n");
+ return false;
+ }
+}
+
+} // End of namespace MADS
diff --git a/engines/mads/debugger.h b/engines/mads/debugger.h
new file mode 100644
index 0000000000..351eb13615
--- /dev/null
+++ b/engines/mads/debugger.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 MADS_DEBUGGER_H
+#define MADS_DEBUGGER_H
+
+#include "common/scummsys.h"
+#include "gui/debugger.h"
+
+namespace MADS {
+
+class MADSEngine;
+
+class Debugger : public GUI::Debugger {
+private:
+ MADSEngine *_vm;
+protected:
+ bool Cmd_Mouse(int argc, const char **argv);
+ bool Cmd_LoadScene(int argc, const char **argv);
+ bool Cmd_ShowHotSpots(int argc, const char **argv);
+ bool Cmd_ListHotSpots(int argc, const char **argv);
+ bool Cmd_PlaySound(int argc, const char **argv);
+ bool Cmd_PlayAudio(int argc, const char **argv);
+ bool Cmd_ShowCodes(int argc, const char **argv);
+ bool Cmd_DumpFile(int argc, const char **argv);
+ bool Cmd_ShowQuote(int argc, const char **argv);
+ bool Cmd_ShowVocab(int argc, const char **argv);
+ bool Cmd_DumpVocab(int argc, const char **argv);
+ bool Cmd_ShowMessage(int argc, const char **argv);
+ bool Cmd_ShowItem(int argc, const char **argv);
+ bool Cmd_DumpItems(int argc, const char **argv);
+ bool Cmd_Item(int argc, const char **argv);
+public:
+ bool _showMousePos;
+public:
+ Debugger(MADSEngine *vm);
+ virtual ~Debugger() {}
+};
+
+} // End of namespace MADS
+
+#endif /* MADS_DEBUGGER_H */
diff --git a/engines/mads/detection.cpp b/engines/mads/detection.cpp
new file mode 100644
index 0000000000..971acde024
--- /dev/null
+++ b/engines/mads/detection.cpp
@@ -0,0 +1,194 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+
+ * You should have received a copy of the GNU General Public 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 "mads/mads.h"
+
+#include "base/plugins.h"
+#include "common/savefile.h"
+#include "common/str-array.h"
+#include "common/memstream.h"
+#include "engines/advancedDetector.h"
+#include "common/system.h"
+#include "graphics/colormasks.h"
+#include "graphics/surface.h"
+#include "mads/events.h"
+#include "mads/game.h"
+
+#define MAX_SAVES 99
+
+namespace MADS {
+
+struct MADSGameDescription {
+ ADGameDescription desc;
+
+ int gameID;
+ uint32 features;
+};
+
+uint32 MADSEngine::getGameID() const {
+ return _gameDescription->gameID;
+}
+
+uint32 MADSEngine::getGameFeatures() const {
+ return _gameDescription->features;
+}
+
+uint32 MADSEngine::getFeatures() const {
+ return _gameDescription->desc.flags;
+}
+
+Common::Language MADSEngine::getLanguage() const {
+ return _gameDescription->desc.language;
+}
+
+Common::Platform MADSEngine::getPlatform() const {
+ return _gameDescription->desc.platform;
+}
+
+} // End of namespace MADS
+
+static const PlainGameDescriptor MADSGames[] = {
+ {"MADS", "MADS"},
+ {"dragonsphere", "Dragonsphere"},
+ {"nebular", "Rex Nebular and the Cosmic Gender Bender"},
+ {"phantom", "Return of the Phantom"},
+ {0, 0}
+};
+
+#include "mads/detection_tables.h"
+
+class MADSMetaEngine : public AdvancedMetaEngine {
+public:
+ MADSMetaEngine() : AdvancedMetaEngine(MADS::gameDescriptions, sizeof(MADS::MADSGameDescription), MADSGames) {
+ _maxScanDepth = 3;
+ }
+
+ virtual const char *getName() const {
+ return "MADS Engine";
+ }
+
+ virtual const char *getOriginalCopyright() const {
+ return "MADS (c)";
+ }
+
+ virtual bool hasFeature(MetaEngineFeature f) const;
+ virtual bool createInstance(OSystem *syst, Engine **engine, const ADGameDescription *desc) const;
+ virtual SaveStateList listSaves(const char *target) const;
+ virtual int getMaximumSaveSlot() const;
+ virtual void removeSaveState(const char *target, int slot) const;
+ SaveStateDescriptor querySaveMetaInfos(const char *target, int slot) const;
+};
+
+bool MADSMetaEngine::hasFeature(MetaEngineFeature f) const {
+ return
+ (f == kSupportsListSaves) ||
+ (f == kSupportsLoadingDuringStartup) ||
+ (f == kSupportsDeleteSave) ||
+ (f == kSavesSupportMetaInfo) ||
+ (f == kSavesSupportThumbnail);
+}
+
+bool MADS::MADSEngine::hasFeature(EngineFeature f) const {
+ return
+ (f == kSupportsRTL) ||
+ (f == kSupportsLoadingDuringRuntime) ||
+ (f == kSupportsSavingDuringRuntime);
+}
+
+bool MADSMetaEngine::createInstance(OSystem *syst, Engine **engine, const ADGameDescription *desc) const {
+ const MADS::MADSGameDescription *gd = (const MADS::MADSGameDescription *)desc;
+ if (gd) {
+ *engine = new MADS::MADSEngine(syst, gd);
+ }
+ return gd != 0;
+}
+
+SaveStateList MADSMetaEngine::listSaves(const char *target) const {
+ Common::SaveFileManager *saveFileMan = g_system->getSavefileManager();
+ Common::StringArray filenames;
+ Common::String saveDesc;
+ Common::String pattern = Common::String::format("%s.0??", target);
+ MADS::MADSSavegameHeader header;
+
+ filenames = saveFileMan->listSavefiles(pattern);
+ sort(filenames.begin(), filenames.end()); // Sort to get the files in numerical order
+
+ SaveStateList saveList;
+ for (Common::StringArray::const_iterator file = filenames.begin(); file != filenames.end(); ++file) {
+ const char *ext = strrchr(file->c_str(), '.');
+ int slot = ext ? atoi(ext + 1) : -1;
+
+ if (slot >= 0 && slot < MAX_SAVES) {
+ Common::InSaveFile *in = g_system->getSavefileManager()->openForLoading(*file);
+
+ if (in) {
+ MADS::Game::readSavegameHeader(in, header);
+ saveList.push_back(SaveStateDescriptor(slot, header._saveName));
+
+ header._thumbnail->free();
+ delete header._thumbnail;
+ delete in;
+ }
+ }
+ }
+
+ return saveList;
+}
+
+int MADSMetaEngine::getMaximumSaveSlot() const {
+ return MAX_SAVES;
+}
+
+void MADSMetaEngine::removeSaveState(const char *target, int slot) const {
+ Common::String filename = Common::String::format("%s.%03d", target, slot);
+ g_system->getSavefileManager()->removeSavefile(filename);
+}
+
+SaveStateDescriptor MADSMetaEngine::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) {
+ MADS::MADSSavegameHeader header;
+ MADS::Game::readSavegameHeader(f, header);
+ delete f;
+
+ // Create the return descriptor
+ SaveStateDescriptor desc(slot, header._saveName);
+ desc.setThumbnail(header._thumbnail);
+ desc.setSaveDate(header._year, header._month, header._day);
+ desc.setSaveTime(header._hour, header._minute);
+ desc.setPlayTime(header._totalFrames * GAME_FRAME_TIME);
+
+ return desc;
+ }
+
+ return SaveStateDescriptor();
+}
+
+
+#if PLUGIN_ENABLED_DYNAMIC(MADS)
+ REGISTER_PLUGIN_DYNAMIC(MADS, PLUGIN_TYPE_ENGINE, MADSMetaEngine);
+#else
+ REGISTER_PLUGIN_STATIC(MADS, PLUGIN_TYPE_ENGINE, MADSMetaEngine);
+#endif
diff --git a/engines/mads/detection_tables.h b/engines/mads/detection_tables.h
new file mode 100644
index 0000000000..e68ae380d0
--- /dev/null
+++ b/engines/mads/detection_tables.h
@@ -0,0 +1,122 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ */
+
+namespace MADS {
+
+static const MADSGameDescription gameDescriptions[] = {
+#if 0
+ {
+ // Rex Nebular and the Cosmic Gender Bender DOS English (compressed)
+ // Removed for now, until the original floppy compression is supported
+ {
+ "nebular",
+ 0,
+ {
+ {"mpslabs.001", 0, "4df5c557b52abb5b661cf4befe5ae301", 1315354},
+ AD_LISTEND
+ },
+ Common::EN_ANY,
+ Common::kPlatformDOS,
+ ADGF_NO_FLAGS,
+ GUIO1(GUIO_NONE)
+ },
+ GType_RexNebular,
+ 0
+ },
+#endif
+
+ {
+ // Rex Nebular and the Cosmic Gender Bender DOS English
+ {
+ "nebular",
+ 0,
+ {
+ {"section1.hag", 0, "6f725eb38660de8af31ec7cdd628d615", 927222},
+ AD_LISTEND
+ },
+ Common::EN_ANY,
+ Common::kPlatformDOS,
+ ADGF_NO_FLAGS,
+ GUIO1(GUIO_NONE)
+ },
+ GType_RexNebular,
+ 0
+ },
+
+ {
+ // Rex Nebular and the Cosmic Gender Bender DOS English 8.49 Alternate
+ {
+ "nebular",
+ 0,
+ {
+ { "section1.hag", 0, "d583576923e3437937fb7f46f4b6274f", 927222 },
+ AD_LISTEND
+ },
+ Common::EN_ANY,
+ Common::kPlatformDOS,
+ ADGF_NO_FLAGS,
+ GUIO1(GUIO_NONE)
+ },
+ GType_RexNebular,
+ 0
+ },
+
+ {
+ // Return of the Phantom DOS English
+ {
+ "phantom",
+ 0,
+ {
+ {"section1.hag", 0, "76e2d47a7aebafe48edc9884b3d91782", 1130939},
+ AD_LISTEND
+ },
+ Common::EN_ANY,
+ Common::kPlatformDOS,
+ ADGF_NO_FLAGS,
+ GUIO1(GUIO_NONE)
+ },
+ GType_Phantom,
+ 0
+ },
+
+ {
+ // Dragonsphere DOS English
+ {
+ "dragonsphere",
+ 0,
+ {
+ {"section1.hag", 0, "2770e441d296be5e806194693eebd95a", 2061199},
+ AD_LISTEND
+ },
+ Common::EN_ANY,
+ Common::kPlatformDOS,
+ ADGF_NO_FLAGS,
+ GUIO1(GUIO_NONE)
+ },
+ GType_Dragonsphere,
+ 0
+ },
+
+ { AD_TABLE_END_MARKER, 0, 0 }
+};
+
+} // End of namespace MADS
diff --git a/engines/mads/dialogs.cpp b/engines/mads/dialogs.cpp
new file mode 100644
index 0000000000..7e6909d113
--- /dev/null
+++ b/engines/mads/dialogs.cpp
@@ -0,0 +1,398 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+
+ * You should have received a copy of the GNU General Public 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 "mads/mads.h"
+#include "mads/screen.h"
+#include "mads/msurface.h"
+#include "mads/nebular/dialogs_nebular.h"
+
+namespace MADS {
+
+Dialog::Dialog(MADSEngine *vm)
+ : _vm(vm), _savedSurface(nullptr), _position(Common::Point(-1, -1)),
+ _width(0), _height(0) {
+ TEXTDIALOG_CONTENT1 = 0XF8;
+ TEXTDIALOG_CONTENT2 = 0XF9;
+ TEXTDIALOG_EDGE = 0XFA;
+ TEXTDIALOG_BACKGROUND = 0XFB;
+ TEXTDIALOG_FC = 0XFC;
+ TEXTDIALOG_FD = 0XFD;
+ TEXTDIALOG_FE = 0XFE;
+ TEXTDIALOG_BLACK = 0;
+}
+
+Dialog::~Dialog() {
+}
+
+void Dialog::save() {
+ _savedSurface = new MSurface(_width, _height);
+ _vm->_screen.copyTo(_savedSurface,
+ Common::Rect(_position.x, _position.y, _position.x + _width, _position.y + _height),
+ Common::Point());
+
+ _vm->_screen.copyRectToScreen(getBounds());
+}
+
+void Dialog::restore() {
+ if (_savedSurface) {
+ _savedSurface->copyTo(&_vm->_screen, _position);
+ delete _savedSurface;
+ _savedSurface = nullptr;
+
+ _vm->_screen.copyRectToScreen(getBounds());
+
+ Common::copy(&_dialogPalette[0], &_dialogPalette[8 * 3],
+ &_vm->_palette->_mainPalette[248 * 3]);
+ _vm->_palette->setPalette(&_vm->_palette->_mainPalette[248 * 3], 248, 8);
+ }
+}
+
+void Dialog::draw() {
+ // Calculate the dialog positioning
+ calculateBounds();
+
+ // Save the screen portion the dialog will overlap
+ save();
+
+ setDialogPalette();
+
+ // Draw the dialog
+ // Fill entire content of dialog
+ Common::Rect bounds = getBounds();
+ _vm->_screen.fillRect(bounds, TEXTDIALOG_BACKGROUND);
+
+ // Draw the outer edge lines
+ _vm->_screen.hLine(_position.x + 1, _position.y + _height - 2,
+ _position.x + _width - 2, TEXTDIALOG_EDGE);
+ _vm->_screen.hLine(_position.x, _position.y + _height - 1,
+ _position.x + _width - 1, TEXTDIALOG_EDGE);
+ _vm->_screen.vLine(_position.x + _width - 2, _position.y + 2,
+ _position.y + _height - 2, TEXTDIALOG_EDGE);
+ _vm->_screen.vLine(_position.x + _width - 1, _position.y + 1,
+ _position.y + _height - 1, TEXTDIALOG_EDGE);
+
+ // Draw the gravelly dialog content
+ drawContent(Common::Rect(_position.x + 2, _position.y + 2,
+ _position.x + _width - 2, _position.y + _height - 2), 0,
+ TEXTDIALOG_CONTENT1, TEXTDIALOG_CONTENT2);
+}
+
+void Dialog::setDialogPalette() {
+ // Save the high end of the palette, and set up the entries for dialog display
+ Common::copy(&_vm->_palette->_mainPalette[TEXTDIALOG_CONTENT1 * 3],
+ &_vm->_palette->_mainPalette[TEXTDIALOG_CONTENT1 * 3 + 8 * 3],
+ &_dialogPalette[0]);
+ Palette::setGradient(_vm->_palette->_mainPalette, TEXTDIALOG_CONTENT1, 2, 0x90, 0x80);
+ Palette::setGradient(_vm->_palette->_mainPalette, TEXTDIALOG_EDGE, 2, 0x9C, 0x70);
+ Palette::setGradient(_vm->_palette->_mainPalette, TEXTDIALOG_FC, 2, 0x90, 0x80);
+ Palette::setGradient(_vm->_palette->_mainPalette, TEXTDIALOG_FE, 1, 0xDC, 0xDC);
+
+ _vm->_palette->setPalette(_vm->_palette->_mainPalette + (TEXTDIALOG_CONTENT1 * 3),
+ TEXTDIALOG_CONTENT1, 8);
+}
+
+void Dialog::calculateBounds() {
+}
+
+void Dialog::drawContent(const Common::Rect &r, int seed, byte color1, byte color2) {
+ uint16 currSeed = seed ? seed : 0xB78E;
+
+ for (int yp = 0; yp < r.height(); ++yp) {
+ byte *destP = _vm->_screen.getBasePtr(r.left, r.top + yp);
+
+ for (int xp = 0; xp < r.width(); ++xp) {
+ uint16 seedAdjust = currSeed;
+ currSeed += 0x181D;
+ seedAdjust = (seedAdjust >> 9) | ((seedAdjust & 0x1ff) << 7);
+ currSeed ^= seedAdjust;
+ seedAdjust = (seedAdjust >> 3) | ((seedAdjust & 7) << 13);
+ currSeed += seedAdjust;
+
+ *destP++ = (currSeed & 0x10) ? color2 : color1;
+ }
+ }
+}
+
+/*------------------------------------------------------------------------*/
+
+TextDialog::TextDialog(MADSEngine *vm, const Common::String &fontName,
+ const Common::Point &pos, int maxChars)
+ : Dialog(vm) {
+ _vm = vm;
+ _font = _vm->_font->getFont(fontName);
+ _position = pos;
+
+ _vm->_font->setColors(TEXTDIALOG_BLACK, TEXTDIALOG_BLACK, TEXTDIALOG_BLACK, TEXTDIALOG_BLACK);
+
+ _innerWidth = (_font->maxWidth() + 1) * maxChars;
+ _width = _innerWidth + 10;
+ _lineSize = maxChars * 2;
+ _lineWidth = 0;
+ _currentX = 0;
+ _numLines = 0;
+ Common::fill(&_lineXp[0], &_lineXp[TEXT_DIALOG_MAX_LINES], 0);
+ _askLineNum = -1;
+ _askXp = 0;
+}
+
+TextDialog::~TextDialog() {
+}
+
+void TextDialog::addLine(const Common::String &line, bool underline) {
+ if (_lineWidth > 0 || _currentX > 0)
+ incNumLines();
+
+ int stringWidth = _font->getWidth(line, 1);
+ if (stringWidth >= _innerWidth || (int)line.size() >= _lineSize) {
+ wordWrap(line);
+ } else {
+ _lineXp[_numLines] = (_innerWidth / 2) - (stringWidth / 2);
+ _lines[_numLines] = line;
+
+ if (underline)
+ underlineLine();
+ }
+
+ incNumLines();
+}
+
+void TextDialog::underlineLine() {
+ _lineXp[_numLines] |= 0x80;
+}
+
+void TextDialog::downPixelLine() {
+ _lineXp[_numLines] |= 0x40;
+}
+
+void TextDialog::incNumLines() {
+ _lineWidth = 0;
+ _currentX = 0;
+ if (++_numLines == TEXT_DIALOG_MAX_LINES)
+ error("Exceeded text dialog line max");
+}
+
+void TextDialog::wordWrap(const Common::String &line) {
+ Common::String tempLine;
+
+ if (!line.empty()) {
+ const char *srcP = line.c_str();
+
+ do {
+ tempLine = "";
+ bool endWord = false;
+ bool newLine = false;
+ bool continueFlag = true;
+
+ do {
+ if (!*srcP) {
+ continueFlag = false;
+ } else {
+ tempLine += *srcP;
+
+ if (*srcP == 10) {
+ continueFlag = false;
+ newLine = true;
+ ++srcP;
+ tempLine.deleteLastChar();
+ } else if (*srcP == ' ') {
+ ++srcP;
+ endWord = true;
+ } else if (!endWord) {
+ ++srcP;
+ } else {
+ tempLine.deleteLastChar();
+ continueFlag = false;
+ }
+ }
+ } while (continueFlag);
+
+ if (tempLine.hasSuffix(" "))
+ tempLine.deleteLastChar();
+
+ Common::String tempLine2;
+ if (_currentX > 0)
+ tempLine2 += ' ';
+ tempLine2 += tempLine;
+
+ int lineWidth = _font->getWidth(tempLine2, 1);
+ if (((_currentX + (int)tempLine2.size()) > _lineSize) ||
+ ((_lineWidth + lineWidth) > _innerWidth)) {
+ incNumLines();
+ appendLine(tempLine);
+ } else {
+ appendLine(tempLine2);
+ }
+
+ if (newLine)
+ incNumLines();
+ } while (*srcP);
+ }
+}
+
+void TextDialog::appendLine(const Common::String &line) {
+ _currentX += line.size();
+ _lineWidth += _font->getWidth(line, 1) + 1;
+ _lines[_numLines] += line;
+}
+
+void TextDialog::addInput() {
+ _askXp = _currentX + 1;
+ _askLineNum = _numLines;
+ incNumLines();
+}
+
+void TextDialog::addBarLine() {
+ if (_lineWidth > 0 || _currentX > 0)
+ incNumLines();
+
+ _lineXp[_numLines] = 0xFF;
+ incNumLines();
+}
+
+void TextDialog::setLineXp(int xp) {
+ _lineXp[_numLines] = xp;
+}
+
+void TextDialog::draw() {
+ if (!_lineWidth)
+ --_numLines;
+
+ // Figure out the size and position for the dialog
+ calculateBounds();
+
+ // Draw the underlying dialog
+ Dialog::draw();
+
+ // Draw the text lines
+ int lineYp = _position.y + 5;
+ for (int lineNum = 0; lineNum <= _numLines; ++lineNum) {
+ if (_lineXp[lineNum] == -1) {
+ // Draw a line across the entire dialog
+ _vm->_screen.hLine(_position.x + 2,
+ lineYp + (_font->getHeight() + 1) / 2,
+ _position.x + _width - 4, TEXTDIALOG_BLACK);
+ } else {
+ // Draw a text line
+ int xp = (_lineXp[lineNum] & 0x7F) + _position.x + 5;
+ int yp = lineYp;
+ if (_lineXp[lineNum] & 0x40)
+ ++yp;
+
+ _font->writeString(&_vm->_screen, _lines[lineNum],
+ Common::Point(xp, yp), 1);
+
+ if (_lineXp[lineNum] & 0x80) {
+ // Draw an underline under the text
+ int lineWidth = _font->getWidth(_lines[lineNum], 1);
+ _vm->_screen.hLine(xp, yp + _font->getHeight(), xp + lineWidth,
+ TEXTDIALOG_BLACK);
+ }
+ }
+
+ lineYp += _font->getHeight() + 1;
+ }
+
+ _vm->_screen.copyRectToScreen(getBounds());
+}
+
+void TextDialog::calculateBounds() {
+ _height = (_font->getHeight() + 1) * (_numLines + 1) + 10;
+ if (_position.x == -1)
+ _position.x = 160 - (_width / 2);
+ if (_position.y == -1)
+ _position.y = 100 - (_height / 2);
+
+ if ((_position.x + _width) > _vm->_screen.getWidth())
+ _position.x = _vm->_screen.getWidth() - (_position.x + _width);
+ if ((_position.y + _height) > _vm->_screen.getHeight())
+ _position.y = _vm->_screen.getHeight() - (_position.y + _height);
+}
+
+void TextDialog::drawWithInput() {
+ //int innerWidth = _innerWidth;
+ //int lineHeight = _font->getHeight() + 1;
+ //int xp = _position.x + 5;
+
+ // Draw the content of the dialog
+ drawContent(Common::Rect(_position.x + 2, _position.y + 2,
+ _position.x + _width - 2, _position.y + _height - 2), 0,
+ TEXTDIALOG_CONTENT1, TEXTDIALOG_CONTENT2);
+
+ error("TODO: drawWithInput");
+}
+
+void TextDialog::show() {
+ // Draw the dialog
+ draw();
+ _vm->_events->showCursor();
+
+ // Wait for mouse click
+ do {
+ _vm->_events->waitForNextFrame();
+ } while (!_vm->shouldQuit() && !_vm->_events->isKeyPressed() && !_vm->_events->_mouseReleased);
+
+ // Allow the mouse release or keypress to be gobbled up
+ if (!_vm->shouldQuit()) {
+ _vm->_events->waitForNextFrame();
+ _vm->_events->_pendingKeys.clear();
+ }
+
+ // Restore the background
+ restore();
+}
+
+/*------------------------------------------------------------------------*/
+
+MessageDialog::MessageDialog(MADSEngine *vm, int maxChars, ...)
+ : TextDialog(vm, FONT_INTERFACE, Common::Point(-1, -1), maxChars) {
+ // Add in passed line list
+ va_list va;
+ va_start(va, maxChars);
+
+ const char *line = va_arg(va, const char *);
+ while (line) {
+ addLine(line);
+ line = va_arg(va, const char *);
+ }
+ va_end(va);
+}
+
+/*------------------------------------------------------------------------*/
+
+Dialogs *Dialogs::init(MADSEngine *vm) {
+ if (vm->getGameID() == GType_RexNebular)
+ return new Nebular::DialogsNebular(vm);
+
+ // Throw a warning for now, since the associated Dialogs class isn't implemented yet
+ warning("Dialogs: Unknown game");
+ // HACK: Reuse the implemented Nebular dialogs for now, to avoid crashing later on
+ return new Nebular::DialogsNebular(vm);
+}
+
+Dialogs::Dialogs(MADSEngine *vm)
+ : _vm(vm) {
+ _pendingDialog = DIALOG_NONE;
+}
+
+} // End of namespace MADS
diff --git a/engines/mads/dialogs.h b/engines/mads/dialogs.h
new file mode 100644
index 0000000000..aad29f6551
--- /dev/null
+++ b/engines/mads/dialogs.h
@@ -0,0 +1,229 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+
+ * You should have received a copy of the GNU General Public 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 MADS_DIALOGS_H
+#define MADS_DIALOGS_H
+
+#include "common/scummsys.h"
+#include "mads/game.h"
+#include "mads/font.h"
+#include "mads/msurface.h"
+
+namespace MADS {
+
+class Dialog {
+private:
+ void setDialogPalette();
+protected:
+ MADSEngine *_vm;
+ MSurface *_savedSurface;
+ Common::Point _position;
+ int _width;
+ int _height;
+ byte _dialogPalette[8 * 3];
+
+ int TEXTDIALOG_CONTENT1;
+ int TEXTDIALOG_CONTENT2;
+ int TEXTDIALOG_EDGE;
+ int TEXTDIALOG_BACKGROUND;
+ int TEXTDIALOG_FC;
+ int TEXTDIALOG_FD;
+ int TEXTDIALOG_FE;
+ int TEXTDIALOG_BLACK;
+protected:
+ /**
+ * Draw the dialog
+ */
+ virtual void draw();
+
+ /**
+ * Calculate bounds for the dialog
+ */
+ virtual void calculateBounds();
+
+ /**
+ * Save the section of the passed surface the dialog will cover.
+ */
+ virtual void save();
+
+ /**
+ * Restore saved dialog surface
+ */
+ virtual void restore();
+
+ /**
+ * Draws the content of a dialog with a gravelly alternating color.
+ */
+ void drawContent(const Common::Rect &r, int seed, byte color1, byte color2);
+public:
+ /**
+ * Constructor
+ */
+ Dialog(MADSEngine *vm);
+
+ /**
+ * Destructor
+ */
+ virtual ~Dialog();
+
+ /**
+ * Return the bounds of the dialog.
+ */
+ Common::Rect getBounds() const {
+ return Common::Rect(_position.x, _position.y,
+ _position.x + _width, _position.y + _height);
+ }
+};
+
+#define TEXT_DIALOG_MAX_LINES 20
+
+class TextDialog : protected Dialog {
+private:
+ /**
+ * Append text to the currently end line.
+ */
+ void appendLine(const Common::String &line);
+
+ /**
+ * Clean up after finishing displaying the dialog
+ */
+ void restorePalette();
+protected:
+ Font *_font;
+ int _innerWidth;
+ int _lineWidth;
+ int _currentX;
+ int _numLines;
+ int _lineSize;
+ int _askXp;
+ int _askLineNum;
+ Common::String _lines[TEXT_DIALOG_MAX_LINES];
+ int _lineXp[TEXT_DIALOG_MAX_LINES];
+
+ /**
+ * Calculate the bounds for the dialog
+ */
+ virtual void calculateBounds();
+public:
+ /**
+ * Constructor
+ * @param vm Engine reference
+ * @param fontName Font to use for display
+ * @param pos Position for window top-left
+ * @param maxChars Horizontal width of window in characters
+ */
+ TextDialog(MADSEngine *vm, const Common::String &fontName, const Common::Point &pos,
+ int maxChars);
+
+ /**
+ * Destructor
+ */
+ virtual ~TextDialog();
+
+ /**
+ * Draw the dialog
+ */
+ virtual void draw();
+
+ /**
+ * Draw the dialog along with any input box
+ */
+ void drawWithInput();
+
+ /**
+ * Add a new line to the dialog
+ */
+ void addLine(const Common::String &line, bool underline = false);
+
+ /**
+ * Adds one or more lines, word wrapping the passed text
+ */
+ void wordWrap(const Common::String &line);
+
+ /**
+ * Increments the number of text lines the text dialog uses
+ */
+ void incNumLines();
+
+ /**
+ * Adds an input area following previously added text
+ */
+ void addInput();
+
+ /**
+ * Adds a bar line to separate sections of text
+ */
+ void addBarLine();
+
+ /**
+ * Flags the previously added line to be underlined
+ */
+ void underlineLine();
+
+ void downPixelLine();
+
+ /**
+ * Set the x position for the given line
+ */
+ void setLineXp(int xp);
+
+ /**
+ * Show the dialog, and wait until a key or mouse press.
+ */
+ virtual void show();
+};
+
+class MessageDialog : public TextDialog {
+public:
+ MessageDialog(MADSEngine *vm, int lines, ...);
+
+ virtual ~MessageDialog() {}
+};
+
+enum DialogId {
+ DIALOG_NONE = 0, DIALOG_GAME_MENU = 1, DIALOG_SAVE = 2, DIALOG_RESTORE = 3,
+ DIALOG_OPTIONS = 4, DIALOG_DIFFICULTY = 5, DIALOG_ERROR = 6
+};
+
+class Dialogs {
+protected:
+ MADSEngine *_vm;
+
+ Dialogs(MADSEngine *vm);
+public:
+ static Dialogs *init(MADSEngine *vm);
+public:
+ Common::Point _defaultPosition;
+ DialogId _pendingDialog;
+ int _indexList[10];
+
+ virtual ~Dialogs() {}
+
+ virtual void showDialog() = 0;
+ virtual void showItem(int objectId, int messageId, int speech = 0) = 0;
+ virtual Common::String getVocab(int vocabId) = 0;
+ virtual bool show(int messageId, int objectId = -1) = 0;
+};
+
+} // End of namespace MADS
+
+#endif /* MADS_DIALOGS_H */
diff --git a/engines/mads/dragonsphere/dragonsphere_scenes.cpp b/engines/mads/dragonsphere/dragonsphere_scenes.cpp
new file mode 100644
index 0000000000..59d7914378
--- /dev/null
+++ b/engines/mads/dragonsphere/dragonsphere_scenes.cpp
@@ -0,0 +1,236 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+
+ * You should have received a copy of the GNU General Public 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 "mads/mads.h"
+#include "mads/compression.h"
+#include "mads/resources.h"
+#include "mads/scene.h"
+#include "mads/dragonsphere/game_dragonsphere.h"
+#include "mads/dragonsphere/dragonsphere_scenes.h"
+
+namespace MADS {
+
+namespace Dragonsphere {
+
+SceneLogic *SceneFactory::createScene(MADSEngine *vm) {
+ Scene &scene = vm->_game->_scene;
+
+ // TODO
+ //scene.addActiveVocab(NOUN_DROP);
+
+ switch (scene._nextSceneId) {
+ // Scene group #1 (Castle, river and caves)
+ case 101: // king's bedroom
+ return new DummyScene(vm); // TODO
+ case 102: // queen's bedroom
+ return new DummyScene(vm); // TODO
+ case 103: // outside king's bedroom
+ return new DummyScene(vm); // TODO
+ case 104: // fireplace / bookshelf
+ return new DummyScene(vm); // TODO
+ case 105: // dining room
+ return new DummyScene(vm); // TODO
+ case 106: // throne room
+ return new DummyScene(vm); // TODO
+ case 107: // council chamber
+ return new DummyScene(vm); // TODO
+ case 108: // dungeon, cell entrance
+ return new DummyScene(vm); // TODO
+ case 109: // cell
+ return new DummyScene(vm); // TODO
+ case 110: // outside castle, merchants and well
+ return new DummyScene(vm); // TODO
+ case 111: // Dragonsphere closeup
+ return new DummyScene(vm); // TODO
+ case 112: // well descend
+ return new DummyScene(vm); // TODO
+ case 113: // bottom of well, river and trap door
+ return new DummyScene(vm); // TODO
+ case 114: // cave
+ return new DummyScene(vm); // TODO
+ case 115: // cave with passageway to west
+ return new DummyScene(vm); // TODO
+ case 116: // cave with pedestral
+ return new DummyScene(vm); // TODO
+ case 117: // river
+ return new DummyScene(vm); // TODO
+ case 118: // castle courtyard and gate
+ return new DummyScene(vm); // TODO
+ case 119: // castle stairs
+ return new DummyScene(vm); // TODO
+ case 120: // map
+ return new DummyScene(vm); // TODO
+
+ // Scene group #2 (Slathan ni Patan, land of shapeshifters)
+ case 201: // guardhouse, entrance to Slathan ni Patan
+ return new DummyScene(vm); // TODO
+ case 203: // forest
+ return new DummyScene(vm); // TODO
+ case 204: // cave
+ return new DummyScene(vm); // TODO
+ case 205: // outside village
+ return new DummyScene(vm); // TODO
+ case 206: // village
+ return new DummyScene(vm); // TODO
+
+ // Scene group #3 (Brynn-Fann, Land of faeries)
+ case 301: // maze entrance
+ return new DummyScene(vm); // TODO
+ case 302: // maze
+ return new DummyScene(vm); // TODO
+ case 303: // toads
+ return new DummyScene(vm); // TODO
+
+ // Scene group #4 (The Desert)
+ case 401: // desert
+ return new DummyScene(vm); // TODO
+ case 402: // desert
+ return new DummyScene(vm); // TODO
+ case 403: // desert
+ return new DummyScene(vm); // TODO
+ case 404: // desert with dunes
+ return new DummyScene(vm); // TODO
+ case 405: // oasis
+ return new DummyScene(vm); // TODO
+ case 406: // inside tent
+ return new DummyScene(vm); // TODO
+ case 407: // gem sack closeup
+ return new DummyScene(vm); // TODO
+ case 408: // spirit plane
+ return new DummyScene(vm); // TODO
+ case 409: // spirit plane top down view, disks
+ return new DummyScene(vm); // TODO
+ case 410: // snake pit and spirit tree
+ return new DummyScene(vm); // TODO
+ case 411: // nest
+ return new DummyScene(vm); // TODO
+ case 412: // desert
+ return new DummyScene(vm); // TODO
+ case 454: // cutscene
+ return new DummyScene(vm); // TODO
+
+ // Scene group #5 (The Mountain)
+ case 501: // base of mountain / wall
+ return new DummyScene(vm); // TODO
+ case 502: // base of mountain
+ return new DummyScene(vm); // TODO
+ case 503: // waterfall
+ return new DummyScene(vm); // TODO
+ case 504: // hermit's cave
+ return new DummyScene(vm); // TODO
+ case 505: // rock trees
+ return new DummyScene(vm); // TODO
+ case 506: // nest
+ return new DummyScene(vm); // TODO
+ case 507: // above nest
+ return new DummyScene(vm); // TODO
+ case 508: // ledge, right
+ return new DummyScene(vm); // TODO
+ case 509: // ledge, left
+ return new DummyScene(vm); // TODO
+ case 510: // nest top down view and pillars
+ return new DummyScene(vm); // TODO
+ case 511: // pillars
+ return new DummyScene(vm); // TODO
+ case 512: // nest
+ return new DummyScene(vm); // TODO
+ case 557: // cutscene
+ return new DummyScene(vm); // TODO
+
+ // Scene group #6 (The Tower)
+ case 601: // ??? (tile count mismatch)
+ return new DummyScene(vm); // TODO
+ case 603: // eye chamber
+ return new DummyScene(vm); // TODO
+ case 604: // room of magic
+ return new DummyScene(vm); // TODO
+ case 605: // science room
+ return new DummyScene(vm); // TODO
+ case 606: // doorway
+ return new DummyScene(vm); // TODO
+ case 607: // prison
+ return new DummyScene(vm); // TODO
+ case 609: // stone pedestral chamber
+ return new DummyScene(vm); // TODO
+ case 612: // infernal machine room
+ return new DummyScene(vm); // TODO
+ case 613: // room with lava floor
+ return new DummyScene(vm); // TODO
+ case 614: // sorcerer's room
+ return new DummyScene(vm); // TODO
+
+ default:
+ error("Invalid scene %d called", scene._nextSceneId);
+ }
+}
+
+/*------------------------------------------------------------------------*/
+
+DragonsphereScene::DragonsphereScene(MADSEngine *vm) : SceneLogic(vm),
+ _globals(static_cast<GameDragonsphere *>(vm->_game)->_globals),
+ _game(*static_cast<GameDragonsphere *>(vm->_game)),
+ _action(vm->_game->_scene._action) {
+}
+
+Common::String DragonsphereScene::formAnimName(char sepChar, int suffixNum) {
+ return Resources::formatName(_scene->_currentSceneId, sepChar, suffixNum,
+ EXT_NONE, "");
+}
+
+/*------------------------------------------------------------------------*/
+
+void SceneInfoDragonsphere::loadCodes(MSurface &depthSurface, int variant) {
+ File f(Resources::formatName(RESPREFIX_RM, _sceneId, ".DAT"));
+ MadsPack codesPack(&f);
+ Common::SeekableReadStream *stream = codesPack.getItemStream(variant + 1);
+
+ loadCodes(depthSurface, stream);
+
+ delete stream;
+ f.close();
+}
+
+void SceneInfoDragonsphere::loadCodes(MSurface &depthSurface, Common::SeekableReadStream *stream) {
+ byte *destP = depthSurface.getData();
+ byte *endP = depthSurface.getBasePtr(0, depthSurface.h);
+
+ byte runLength = stream->readByte();
+ while (destP < endP && runLength > 0) {
+ byte runValue = stream->readByte();
+
+ // Write out the run length
+ Common::fill(destP, destP + runLength, runValue);
+ destP += runLength;
+
+ // Get the next run length
+ runLength = stream->readByte();
+ }
+
+ if (destP < endP)
+ Common::fill(destP, endP, 0);
+}
+
+} // End of namespace Dragonsphere
+
+} // End of namespace MADS
diff --git a/engines/mads/dragonsphere/dragonsphere_scenes.h b/engines/mads/dragonsphere/dragonsphere_scenes.h
new file mode 100644
index 0000000000..a6c778eca7
--- /dev/null
+++ b/engines/mads/dragonsphere/dragonsphere_scenes.h
@@ -0,0 +1,695 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+
+ * You should have received a copy of the GNU General Public 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 MADS_DRAGONSPHERE_SCENES_H
+#define MADS_DRAGONSPHERE_SCENES_H
+
+#include "common/scummsys.h"
+#include "mads/game.h"
+#include "mads/scene.h"
+#include "mads/dragonsphere/game_dragonsphere.h"
+//#include "mads/dragonsphere/globals_dragonsphere.h"
+
+
+namespace MADS {
+
+namespace Dragonsphere {
+
+enum Noun {
+ NOUN_GAME = 0x1,
+ NOUN_QSAVE = 0x2,
+ NOUN_LOOK = 0x3,
+ NOUN_TAKE = 0x4,
+ NOUN_PUSH = 0x5,
+ NOUN_OPEN = 0x6,
+ NOUN_PUT = 0x7,
+ NOUN_TALK_TO = 0x8,
+ NOUN_GIVE = 0x9,
+ NOUN_PULL = 0xA,
+ NOUN_CLOSE = 0xB,
+ NOUN_THROW = 0xC,
+ NOUN_WALK_TO = 0xD,
+ NOUN_NOTHING = 0xE,
+ NOUN_ = 0xF,
+ NOUN_FLOOR = 0x10,
+ NOUN_WALK_ACROSS = 0x11,
+ NOUN_RUG = 0x12,
+ NOUN_CARPET = 0x13,
+ NOUN_WALL = 0x14,
+ NOUN_BED = 0x15,
+ NOUN_PILLOW = 0x16,
+ NOUN_CHEST = 0x17,
+ NOUN_WINDOW = 0x18,
+ NOUN_NIGHTSTAND = 0x19,
+ NOUN_TAPESTRY = 0x1A,
+ NOUN_DRESSING_SCREEN = 0x1B,
+ NOUN_WALK_BEHIND = 0x1C,
+ NOUN_ROYAL_CREST = 0x1D,
+ NOUN_LOOK_AT = 0x1E,
+ NOUN_WASHBASIN = 0x1F,
+ NOUN_WASH_AT = 0x20,
+ NOUN_BOOK = 0x21,
+ NOUN_FIREPLACE = 0x22,
+ NOUN_FIREPLACE_SCREEN = 0x23,
+ NOUN_DOOR_TO_QUEENS_ROOM = 0x24,
+ NOUN_WALK_THROUGH = 0x25,
+ NOUN_HALL_TO_SOUTH = 0x26,
+ NOUN_WALK_INTO = 0x27,
+ NOUN_WALL_PLAQUE = 0x28,
+ NOUN_DECORATION = 0x29,
+ NOUN_SWORDS = 0x2A,
+ NOUN_WALL_SCONCE = 0x2B,
+ NOUN_BUST_ON_WALL = 0x2C,
+ NOUN_WALL_ARCH = 0x2D,
+ NOUN_SIGNET_RING = 0x2E,
+ NOUN_INVOKE = 0x2F,
+ NOUN_POLISH = 0x30,
+ NOUN_GANGBANG = 0x31,
+ NOUN_BIRD_FIGURINE = 0x32,
+ NOUN_RUB = 0x33,
+ NOUN_BIRDCALL = 0x34,
+ NOUN_USE = 0x35,
+ NOUN_MAKE_NOISE = 0x36,
+ NOUN_SHIELDSTONE = 0x37,
+ NOUN_SWORD = 0x38,
+ NOUN_ATTACK = 0x39,
+ NOUN_CARVE_UP = 0x3A,
+ NOUN_GOBLET = 0x3B,
+ NOUN_FILL = 0x3C,
+ NOUN_DRINK_FROM = 0x3D,
+ NOUN_BONE = 0x3E,
+ NOUN_GNAW = 0x3F,
+ NOUN_FRUIT = 0x40,
+ NOUN_EAT = 0x41,
+ NOUN_DOLL = 0x42,
+ NOUN_PLAY_WITH = 0x43,
+ NOUN_HEAL = 0x44,
+ NOUN_HEAL_THYSELF = 0x45,
+ NOUN_HEAL_SELF = 0x46,
+ NOUN_POLYSTONE = 0x47,
+ NOUN_MIMIC = 0x48,
+ NOUN_RED_POWERSTONE = 0x49,
+ NOUN_YELLOW_POWERSTONE = 0x4A,
+ NOUN_BLUE_POWERSTONE = 0x4B,
+ NOUN_KEY_CROWN = 0x4C,
+ NOUN_WEAR = 0x4D,
+ NOUN_DATES = 0x4E,
+ NOUN_STATUE = 0x4F,
+ NOUN_BOTTLE_OF_FLIES = 0x50,
+ NOUN_LISTEN_TO = 0x51,
+ NOUN_SOUL_EGG = 0x52,
+ NOUN_BREAK = 0x53,
+ NOUN_MAGIC_BELT = 0x54,
+ NOUN_ADJUST = 0x55,
+ NOUN_AMULET = 0x56,
+ NOUN_THRUST = 0x57,
+ NOUN_MUD = 0x58,
+ NOUN_FEEL = 0x59,
+ NOUN_TASTE = 0x5A,
+ NOUN_FEATHERS = 0x5B,
+ NOUN_TICKLE = 0x5C,
+ NOUN_TORCH = 0x5D,
+ NOUN_WAVE = 0x5E,
+ NOUN_FLASK = 0x5F,
+ NOUN_FLASK_FULL_OF_ACID = 0x60,
+ NOUN_POUR_CONTENTS = 0x61,
+ NOUN_POUR = 0x62,
+ NOUN_POUR_CONTENTS_OF = 0x63,
+ NOUN_DRINK = 0x64,
+ NOUN_ROPE = 0x65,
+ NOUN_TIE = 0x66,
+ NOUN_POWER_VACUUM_STONE = 0x67,
+ NOUN_TAKE_MAGIC_FROM = 0x68,
+ NOUN_DEAD_RAT = 0x69,
+ NOUN_PET = 0x6A,
+ NOUN_MAP = 0x6B,
+ NOUN_FOLD = 0x6C,
+ NOUN_CRYSTAL_BALL = 0x6D,
+ NOUN_GAZE_INTO = 0x6E,
+ NOUN_INVOKE_POWER_OF = 0x6F,
+ NOUN_BLACK_SPHERE = 0x70,
+ NOUN_SOPTUS_SOPORIFIC = 0x71,
+ NOUN_SHIFTER_RING = 0x72,
+ NOUN_SHIFT_SELF = 0x73,
+ NOUN_SHIFT_INTO_BEAR = 0x74,
+ NOUN_SHIFT_INTO_SEAL = 0x75,
+ NOUN_SHIFT_INTO_SNAKE = 0x76,
+ NOUN_REVERT = 0x77,
+ NOUN_MEDICINE_BUNDLE = 0x78,
+ NOUN_SHAKE = 0x79,
+ NOUN_PARTLY_BUILT_BUNDLE = 0x7A,
+ NOUN_RATSICLE = 0x7B,
+ NOUN_LICK = 0x7C,
+ NOUN_TENTACLE_PARTS = 0x7D,
+ NOUN_CHEW = 0x7E,
+ NOUN_TELEPORT_DOOR = 0x7F,
+ NOUN_UNROLL = 0x80,
+ NOUN_RARE_COIN = 0x81,
+ NOUN_ADMIRE = 0x82,
+ NOUN_CRYSTAL_FLOWER = 0x83,
+ NOUN_DIAMOND_DUST = 0x84,
+ NOUN_RUBY_RING = 0x85,
+ NOUN_GOLD_NUGGET = 0x86,
+ NOUN_MAGIC_MUSIC_BOX = 0x87,
+ NOUN_EMERALD = 0x88,
+ NOUN_PIECE_OF_PAPER = 0x89,
+ NOUN_SPEAK_WORDS_ON = 0x8A,
+ NOUN_VORTEX_STONE = 0x8B,
+ NOUN_RUG2 = 0x8C,
+ NOUN_FIREPLACE_SCREEN2 = 0x8D,
+ NOUN_BUST_ON_WALL2 = 0x8E,
+ NOUN_LOOK_AT2 = 0x8F,
+ NOUN_DRAGON = 0x90,
+ NOUN_DRAGONSPHERE = 0x91,
+ NOUN_TOUCH = 0x92,
+ NOUN_THRONE_ROOM = 0x93,
+ NOUN_RETURN_TO = 0x94,
+ NOUN_CAVE = 0x95,
+ NOUN_PASSAGEWAY_TO_WEST = 0x96,
+ NOUN_PASSAGEWAY_TO_EAST = 0x97,
+ NOUN_CAVE_FLOOR = 0x98,
+ NOUN_STONE_COLUMN = 0x99,
+ NOUN_ABYSS = 0x9A,
+ NOUN_LOOK_INTO = 0x9B,
+ NOUN_CASTLE = 0x9C,
+ NOUN_CASTLE_GATE = 0x9D,
+ NOUN_GROUND = 0x9E,
+ NOUN_BARREL = 0x9F,
+ NOUN_BARRELS = 0xA0,
+ NOUN_HAYSTACK = 0xA1,
+ NOUN_ROOT_THROUGH = 0xA2,
+ NOUN_BATTLEMENTS = 0xA3,
+ NOUN_GATE_TO_THRONE_ROOM = 0xA4,
+ NOUN_CASTLE_WALL = 0xA5,
+ NOUN_DOOR = 0xA6,
+ NOUN_WALL_SWITCH = 0xA7,
+ NOUN_STAIRS = 0xA8,
+ NOUN_WALK_DOWN = 0xA9,
+ NOUN_EDGE_OF_ABYSS = 0xAA,
+ NOUN_COURTYARD = 0xAB,
+ NOUN_ROCK = 0xAC,
+ NOUN_CAVE_CEILING = 0xAD,
+ NOUN_CAVE_WALL = 0xAE,
+ NOUN_BRAZIER = 0xAF,
+ NOUN_DOOR_TO_THRONE_ROOM = 0xB0,
+ NOUN_GO_THROUGH = 0xB1,
+ NOUN_DINING_TABLE = 0xB2,
+ NOUN_ACTIVATE = 0xB3,
+ NOUN_BATTLEMENT = 0xB4,
+ NOUN_DOOR_TO_GAURDROOM = 0xB5,
+ NOUN_DUNGEON_FLOOR = 0xB6,
+ NOUN_DUNGEON_WALLS = 0xB7,
+ NOUN_DUNGEON_CEILING = 0xB8,
+ NOUN_BEDDING = 0xB9,
+ NOUN_FLOOR_GRATE = 0xBA,
+ NOUN_MANACLES = 0xBB,
+ NOUN_CALENDAR = 0xBC,
+ NOUN_DOOR_TO_GUARDROOM = 0xBD,
+ NOUN_DOOR_TO_COUNCIL_ROOM = 0xBE,
+ NOUN_GUARD_STATION = 0xBF,
+ NOUN_DOOR_TO_DUNGEON_CELL = 0xC0,
+ NOUN_DOORWAY_TO_CELL = 0xC1,
+ NOUN_DUNGEON_DOOR = 0xC2,
+ NOUN_DUNGEON_WALL = 0xC3,
+ NOUN_CEILING = 0xC4,
+ NOUN_DOOR_TO_HALLWAY = 0xC5,
+ NOUN_TABLE = 0xC6,
+ NOUN_BOOKSHELF = 0xC7,
+ NOUN_TROPHY = 0xC8,
+ NOUN_READING_BENCH = 0xC9,
+ NOUN_CHAIR = 0xCA,
+ NOUN_LOVESEAT = 0xCB,
+ NOUN_WOOD_BASKET = 0xCC,
+ NOUN_STOOL = 0xCD,
+ NOUN_GUARD_STOOL = 0xCE,
+ NOUN_ROCKS = 0xCF,
+ NOUN_DIVIDING_WALL = 0xD0,
+ NOUN_ARCHWAY = 0xD1,
+ NOUN_MARKET_GROUNDS = 0xD2,
+ NOUN_HEDGE = 0xD3,
+ NOUN_SKY = 0xD4,
+ NOUN_PLAINS = 0xD5,
+ NOUN_FIELDS = 0xD6,
+ NOUN_GATE_TO_COURTYARD = 0xD7,
+ NOUN_ROAD_TO_EAST = 0xD8,
+ NOUN_TREES = 0xD9,
+ NOUN_CLOUDS = 0xDA,
+ NOUN_MERCHANTS_STALL = 0xDB,
+ NOUN_WELL = 0xDC,
+ NOUN_DOWN_WELL = 0xDD,
+ NOUN_GO = 0xDE,
+ NOUN_GO_DOWN = 0xDF,
+ NOUN_CRANK = 0xE0,
+ NOUN_BUCKET = 0xE1,
+ NOUN_JUMP_DOWN = 0xE2,
+ NOUN_WALLS = 0xE3,
+ NOUN_DOORWAY_TO_SOUTH = 0xE4,
+ NOUN_PEDESTAL = 0xE5,
+ NOUN_DOOR_TO_NORTH = 0xE6,
+ NOUN_PAINTING = 0xE7,
+ NOUN_DOCUMENT = 0xE8,
+ NOUN_INK_BOTTLE = 0xE9,
+ NOUN_QUILL_PEN = 0xEA,
+ NOUN_CHANDELIER = 0xEB,
+ NOUN_COUNCIL_TABLE = 0xEC,
+ NOUN_CANDLESTICK = 0xED,
+ NOUN_DESK = 0xEE,
+ NOUN_TURN = 0xEF,
+ NOUN_POLE = 0xF0,
+ NOUN_THE_SCENE = 0xF1,
+ NOUN_LEAVE = 0xF2,
+ NOUN_END_TABLE = 0xF3,
+ NOUN_BATTLE_AXES = 0xF4,
+ NOUN_DOOR_TO_KINGS_ROOM = 0xF5,
+ NOUN_COAT_OF_ARMS = 0xF6,
+ NOUN_LARGE_WINDOW = 0xF7,
+ NOUN_SMALL_WINDOW = 0xF8,
+ NOUN_DOOR_TO_MEETING_ROOM = 0xF9,
+ NOUN_DOOR_TO_BALLROOM = 0xFA,
+ NOUN_FLOWERS = 0xFB,
+ NOUN_SHUTTERS = 0xFC,
+ NOUN_BOOKCASE = 0xFD,
+ NOUN_DOOR_TO_COURTYARD = 0xFE,
+ NOUN_PLATFORM = 0xFF,
+ NOUN_STEP = 0x100,
+ NOUN_RED_CARPET = 0x101,
+ NOUN_KINGS_THRONE = 0x102,
+ NOUN_SIT_IN = 0x103,
+ NOUN_QUEENS_THRONE = 0x104,
+ NOUN_TRAPDOOR = 0x105,
+ NOUN_GRATE = 0x106,
+ NOUN_RIVER = 0x107,
+ NOUN_DIARIES = 0x108,
+ NOUN_SWIM_DOWN = 0x109,
+ NOUN_SCULLERY_MAID = 0x10A,
+ NOUN_DOORWAY_TO_DUNGEON = 0x10B,
+ NOUN_WARD = 0x10C,
+ NOUN_DARKNESS_BEAST = 0x10D,
+ NOUN_BEAST = 0x10E,
+ NOUN_PUT_MAGIC_INTO = 0x10F,
+ NOUN_GUARD = 0x110,
+ NOUN_CROWN = 0x111,
+ NOUN_BOOKS = 0x112,
+ NOUN_SECRET_DOOR = 0x113,
+ NOUN_WALL_PANEL = 0x114,
+ NOUN_DOORWAY = 0x115,
+ NOUN_FAERIE = 0x116,
+ NOUN_SOPTUS_ECLIPTUS = 0x117,
+ NOUN_GUARD_CAPTAIN = 0x118,
+ NOUN_MERCHANT = 0x119,
+ NOUN_SHAPECHANGER = 0x11A,
+ NOUN_RED_STONE = 0x11B,
+ NOUN_YELLOW_STONE = 0x11C,
+ NOUN_BLUE_STONE = 0x11D,
+ NOUN_FLIES = 0x11E,
+ NOUN_FLASK_OF_ACID = 0x11F,
+ NOUN_PARTIAL_BUNDLE = 0x120,
+ NOUN_SOPORIFIC = 0x121,
+ NOUN_PARCHMENT = 0x122,
+ NOUN_KING = 0x123,
+ NOUN_MACMORN = 0x124,
+ NOUN_MOUNTAINSIDE = 0x125,
+ NOUN_PATH_TO_SOUTH = 0x126,
+ NOUN_ROUGH_STONE = 0x127,
+ NOUN_CLIMB_UP = 0x128,
+ NOUN_LARGE_ROCK = 0x129,
+ NOUN_SMALL_ROCK = 0x12A,
+ NOUN_PATH_TO_WEST = 0x12B,
+ NOUN_CAVE_ENTRANCE = 0x12C,
+ NOUN_PALLET = 0x12D,
+ NOUN_BLANKET = 0x12E,
+ NOUN_FIREPIT = 0x12F,
+ NOUN_FLAT_STONE = 0x130,
+ NOUN_MOVE = 0x131,
+ NOUN_SPIRIT_BUNDLE = 0x132,
+ NOUN_TRAIL_LEADING_UP = 0x133,
+ NOUN_FOLLOW = 0x134,
+ NOUN_TRAIL_LEADING_DOWN = 0x135,
+ NOUN_NEST = 0x136,
+ NOUN_REACH_IN = 0x137,
+ NOUN_TRAIL_LEADING_WEST = 0x138,
+ NOUN_PATH_TO_EAST = 0x139,
+ NOUN_WATERFALL = 0x13A,
+ NOUN_PUDDLE = 0x13B,
+ NOUN_EDGE_OF_CLIFF = 0x13C,
+ NOUN_LEDGE = 0x13D,
+ NOUN_CLIMB_DOWN = 0x13E,
+ NOUN_LANDING = 0x13F,
+ NOUN_BOULDERS = 0x140,
+ NOUN_ROCK_TUMBLE = 0x141,
+ NOUN_ROCK_TREE = 0x142,
+ NOUN_PILLAR = 0x143,
+ NOUN_JUMP_TO = 0x144,
+ NOUN_CLIFF = 0x145,
+ NOUN_PILLARS = 0x146,
+ NOUN_SPECIAL_ROCK = 0x147,
+ NOUN_GAZE_UPON = 0x148,
+ NOUN_SCONCE = 0x149,
+ NOUN_LADDER = 0x14A,
+ NOUN_STAIRWAY = 0x14B,
+ NOUN_MECHANISM = 0x14C,
+ NOUN_SPEARHEADS = 0x14D,
+ NOUN_TRAP_DOOR = 0x14E,
+ NOUN_SWIM = 0x14F,
+ NOUN_DOWN_RIVER = 0x150,
+ NOUN_SWIM_UP = 0x151,
+ NOUN_UP_RIVER = 0x152,
+ NOUN_SHORE = 0x153,
+ NOUN_SWIM_TO = 0x154,
+ NOUN_SWIM_TOWARDS = 0x155,
+ NOUN_KING_CALLASH = 0x156,
+ NOUN_KINGS_THRONE2 = 0x157,
+ NOUN_KING2 = 0x158,
+ NOUN_GROTTO = 0x159,
+ NOUN_CLIMB_THROUGH = 0x15A,
+ NOUN_QUEEN_MOTHER = 0x15B,
+ NOUN_MACMORN2 = 0x15C,
+ NOUN_SMALL_LEDGE = 0x15D,
+ NOUN_MACMORN3 = 0x15E,
+ NOUN_TO_110 = 0x15F,
+ NOUN_TO_KITTY_HEAVEN = 0x160,
+ NOUN_KITTY_HEAVEN = 0x161,
+ NOUN_ROOM_110 = 0x162,
+ NOUN_LLANIE = 0x163,
+ NOUN_CW = 0x164,
+ NOUN_HERMIT = 0x165,
+ NOUN_TROU = 0x166,
+ NOUN_SHAK = 0x167,
+ NOUN_ROOM_501 = 0x168,
+ NOUN_MOON = 0x169,
+ NOUN_UFO = 0x16A,
+ NOUN_SIT_ON = 0x16B,
+ NOUN_STRANGER = 0x16C,
+ NOUN_TOWER_DOOR = 0x16D,
+ NOUN_DOOR_TO_EAST = 0x16E,
+ NOUN_DOOR_TO_WEST = 0x16F,
+ NOUN_EYE = 0x170,
+ NOUN_DOORWAY_TO_EAST = 0x171,
+ NOUN_DOORWAY_TO_WEST = 0x172,
+ NOUN_SKULL = 0x173,
+ NOUN_DOOR_TO_MAGIC_ROOM = 0x174,
+ NOUN_ANCIENT_BARREL = 0x175,
+ NOUN_COBWEBS = 0x176,
+ NOUN_SHELF = 0x177,
+ NOUN_MUSTY_CHART = 0x178,
+ NOUN_LAB_TABLE = 0x179,
+ NOUN_PETCOCK = 0x17A,
+ NOUN_NOZZLE = 0x17B,
+ NOUN_TUBING = 0x17C,
+ NOUN_BEAKER = 0x17D,
+ NOUN_FLAME = 0x17E,
+ NOUN_METAL_PLATE = 0x17F,
+ NOUN_SHAFT_OF_LIGHT = 0x180,
+ NOUN_CABINET = 0x181,
+ NOUN_BALANCE = 0x182,
+ NOUN_CAGE = 0x183,
+ NOUN_FREEZER = 0x184,
+ NOUN_CONTENTS_OF_FREEZER = 0x185,
+ NOUN_CAGE_WITH_RATS = 0x186,
+ NOUN_DOOR_TO_SOUTH = 0x187,
+ NOUN_TRAIL_OF_GREEN_SLIME = 0x188,
+ NOUN_NECK_LOCK = 0x189,
+ NOUN_BENCH = 0x18A,
+ NOUN_SKELETON = 0x18B,
+ NOUN_LEG_CLAMPS = 0x18C,
+ NOUN_LEG_LOCK = 0x18D,
+ NOUN_WAIST_LOCK = 0x18E,
+ NOUN_NER_TOM = 0x18F,
+ NOUN_BELT = 0x190,
+ NOUN_JUMP_INTO = 0x191,
+ NOUN_CLOSET = 0x192,
+ NOUN_DOOR_TO_EYE_CHAMBER = 0x193,
+ NOUN_DRESSER = 0x194,
+ NOUN_SCROLL = 0x195,
+ NOUN_WITCH_PARAPHERNALIA = 0x196,
+ NOUN_SHELVES = 0x197,
+ NOUN_MAGIC_TOMES = 0x198,
+ NOUN_MAGIC_PARAPHERNALIA = 0x199,
+ NOUN_BOOK_OF_MAGIC = 0x19A,
+ NOUN_HOURGLASS = 0x19B,
+ NOUN_STONE_SPHERE = 0x19C,
+ NOUN_SHADOW_OF_WINDOW = 0x19D,
+ NOUN_MUSIC_BOX = 0x19E,
+ NOUN_LARGE_SPIDER_WEB = 0x19F,
+ NOUN_INFERNAL_MACHINE = 0x1A0,
+ NOUN_WATER_SOURCE = 0x1A1,
+ NOUN_FLOW_OF_WATER = 0x1A2,
+ NOUN_RETORT = 0x1A3,
+ NOUN_DOORWAY_TO_CORRIDOR = 0x1A4,
+ NOUN_TELESCOPE = 0x1A5,
+ NOUN_STRANGE_MAP = 0x1A6,
+ NOUN_CIRCLE_OF_SPHERES = 0x1A7,
+ NOUN_STONE_BED = 0x1A8,
+ NOUN_DRAGON_SCULPTURE = 0x1A9,
+ NOUN_RAT = 0x1AA,
+ NOUN_RAT_CAGE = 0x1AB,
+ NOUN_DOWN_BUTTON = 0x1AC,
+ NOUN_DOOR_TO_MACHINE_ROOM = 0x1AD,
+ NOUN_STRANGE_PORTAL = 0x1AE,
+ NOUN_DOOR_FRAME = 0x1AF,
+ NOUN_ELEVATOR_HOLE = 0x1B0,
+ NOUN_UP_BUTTON = 0x1B1,
+ NOUN_DOORWAY_TO_DARK_ROOM = 0x1B2,
+ NOUN_BIG_SKULL = 0x1B3,
+ NOUN_ELEVATOR_PLATFORM = 0x1B4,
+ NOUN_BUTTON = 0x1B5,
+ NOUN_TOP_BUTTON = 0x1B6,
+ NOUN_BOTTOM_BUTTON = 0x1B7,
+ NOUN_TELEPORTAL = 0x1B8,
+ NOUN_EYE_CHAMBER_DOORWAY = 0x1B9,
+ NOUN_MACHINE_ROOM_DOORWAY = 0x1BA,
+ NOUN_GLOWING_FLOOR = 0x1BB,
+ NOUN_BRYNN_FANN = 0x1BC,
+ NOUN_GRAN_CALLAHACH = 0x1BD,
+ NOUN_SLATHAN_NI_PATAN = 0x1BE,
+ NOUN_HIGHTOWER = 0x1BF,
+ NOUN_SOPTUS_ECLIPTUS2 = 0x1C0,
+ NOUN_TOWER = 0x1C1,
+ NOUN_MOUNTAIN_PATH = 0x1C2,
+ NOUN_PATH_BEHIND_TOWER = 0x1C3,
+ NOUN_VINES = 0x1C4,
+ NOUN_SLATHAN_NI_PATAN2 = 0x1C5,
+ NOUN_SICK = 0x1C6,
+ NOUN_PATH_AROUND_TOWER = 0x1C7,
+ NOUN_PATH_TO_HIGHTOWER = 0x1C8,
+ NOUN_SPIRIT_PLANE = 0x1C9,
+ NOUN_SPIRIT_TREE = 0x1CA,
+ NOUN_WALK = 0x1CB,
+ NOUN_REMAINS = 0x1CC,
+ NOUN_DOORWAY_TO_ELEVATOR = 0x1CD,
+ NOUN_DRAGON_DOOR = 0x1CE,
+ NOUN_DRAGON_BONES = 0x1CF,
+ NOUN_IRON_FLOOR = 0x1D0,
+ NOUN_HOLE = 0x1D1,
+ NOUN_STONE = 0x1D2,
+ NOUN_HOMEMADE_BUNDLE = 0x1D3,
+ NOUN_LEFT = 0x1D4,
+ NOUN_RIGHT = 0x1D5,
+ NOUN_UP = 0x1D6,
+ NOUN_DOWN = 0x1D7,
+ NOUN_WEST = 0x1D8,
+ NOUN_DESERT_TO_WEST = 0x1D9,
+ NOUN_CROSS = 0x1DA,
+ NOUN_DESERT_TO_EAST = 0x1DB,
+ NOUN_DESERT_TO_SOUTH = 0x1DC,
+ NOUN_DESERT_TO_NORTH = 0x1DD,
+ NOUN_DESERT = 0x1DE,
+ NOUN_POWERSTONE = 0x1DF,
+ NOUN_BONES = 0x1E0,
+ NOUN_TENT = 0x1E1,
+ NOUN_BUSH = 0x1E2,
+ NOUN_SANWE = 0x1E3,
+ NOUN_TANGLE = 0x1E4,
+ NOUN_SAND = 0x1E5,
+ NOUN_MAGIC_GRAPES = 0x1E6,
+ NOUN_ROCS_NEST = 0x1E7,
+ NOUN_GRAPE_VINE = 0x1E8,
+ NOUN_STRANGE_SQUARE = 0x1E9,
+ NOUN_WATER_SPHERE = 0x1EA,
+ NOUN_EAST_END_OF_ISLAND = 0x1EB,
+ NOUN_ISLAND = 0x1EC,
+ NOUN_SECRET_MESSAGE = 0x1ED,
+ NOUN_FIND = 0x1EE,
+ NOUN_SAND_NEAR_STONES = 0x1EF,
+ NOUN_DESERT_SKY = 0x1F0,
+ NOUN_POOL = 0x1F1,
+ NOUN_PALM_TREE = 0x1F2,
+ NOUN_OASIS = 0x1F3,
+ NOUN_LEAN_TO = 0x1F4,
+ NOUN_TRADER = 0x1F5,
+ NOUN_SIGN = 0x1F6,
+ NOUN_WATER_FLOW = 0x1F7,
+ NOUN_FLOATING_DISK = 0x1F8,
+ NOUN_GNARLED_ROOT = 0x1F9,
+ NOUN_SNAKE_PIT = 0x1FA,
+ NOUN_MARKER = 0x1FB,
+ NOUN_SHAMAN = 0x1FC,
+ NOUN_GUARDHOUSE = 0x1FD,
+ NOUN_BONE_TREE = 0x1FE,
+ NOUN_EAR_ROCK = 0x1FF,
+ NOUN_MOUTH_ROCK = 0x200,
+ NOUN_NOSE_ROCK = 0x201,
+ NOUN_NEW_BUNDLE = 0x202,
+ NOUN_LIZARD = 0x203,
+ NOUN_ROC = 0x204,
+ NOUN_ROCS_NEST2 = 0x205,
+ NOUN_SELECT = 0x206,
+ NOUN_PURPLE_GEM = 0x207,
+ NOUN_PURPLE_STONE = 0x208,
+ NOUN_GREEN_STONE = 0x209,
+ NOUN_PATH = 0x20A,
+ NOUN_GUARDS = 0x20B,
+ NOUN_LAMP = 0x20C,
+ NOUN_SCIMITAR = 0x20D,
+ NOUN_SITTING_PILLOW = 0x20E,
+ NOUN_WATER_GOURD = 0x20F,
+ NOUN_JAR = 0x210,
+ NOUN_TENT_POLE = 0x211,
+ NOUN_EXIT = 0x212,
+ NOUN_PARAPHERNALIA = 0x213,
+ NOUN_SLATHAN_NI_PATAN3 = 0x214,
+ NOUN_EYE_ROCK = 0x215,
+ NOUN_BODY_TREE = 0x216,
+ NOUN_CLEARING = 0x217,
+ NOUN_TENTACLES = 0x218,
+ NOUN_SPELL_SHIELD = 0x219,
+ NOUN_POOL_MONSTER = 0x21A,
+ NOUN_SHIFTER_BOULDER = 0x21B,
+ NOUN_DEAD_TREE = 0x21C,
+ NOUN_PIT = 0x21D,
+ NOUN_SHIFTER_VILLAGE = 0x21E,
+ NOUN_SLATHAN_SKY = 0x21F,
+ NOUN_SHIFTER = 0x220,
+ NOUN_WALK_AROUND = 0x221,
+ NOUN_WRECKED_BRIDGE = 0x222,
+ NOUN_SHACK = 0x223,
+ NOUN_WRECKED_SHACK = 0x224,
+ NOUN_WISE_SHIFTER = 0x225,
+ NOUN_GRASS = 0x226,
+ NOUN_ENTRANCE_TO_MAZE = 0x227,
+ NOUN_TOPIARY_TOAD = 0x228,
+ NOUN_BOULDER = 0x229,
+ NOUN_MUSHROOM = 0x22A,
+ NOUN_SLATHAN_SKY2 = 0x22B,
+ NOUN_GRETA = 0x22C,
+ NOUN_TREE_STUMP = 0x22D,
+ NOUN_SANCTUARY_WOODS = 0x22E,
+ NOUN_TOADS = 0x22F,
+ NOUN_DOOFUS = 0x230,
+ NOUN_SHIFTING_MONSTER = 0x231,
+ NOUN_SPRITE = 0x232,
+ NOUN_MAZE = 0x233,
+ NOUN_TOPIARY_TOADSTOOL = 0x234,
+ NOUN_TOPIARY_GARGOYLE = 0x235,
+ NOUN_TOPIARY_DRAGON = 0x236,
+ NOUN_GUARDIAN = 0x237,
+ NOUN_BUTTERFLY_KING = 0x238,
+ NOUN_ROBE = 0x239,
+ NOUN_CEDAR_CHEST = 0x23A,
+ NOUN_DRAGONSPHERE2 = 0x23B,
+ NOUN_PATH_TO_HIGHTOWER2 = 0x23C,
+ NOUN_CALIPH = 0x23D
+};
+
+class SceneFactory {
+public:
+ static SceneLogic *createScene(MADSEngine *vm);
+};
+
+/**
+ * Specialized base class for Dragonsphere game scenes
+ */
+class DragonsphereScene : public SceneLogic {
+protected:
+ DragonsphereGlobals &_globals;
+ GameDragonsphere &_game;
+ MADSAction &_action;
+
+ /**
+ * Forms an animation resource name
+ */
+ Common::String formAnimName(char sepChar, int suffixNum);
+
+ /**
+ * Plays appropriate sound for entering varous rooms
+ */
+ void lowRoomsEntrySound();
+public:
+ /**
+ * Constructor
+ */
+ DragonsphereScene(MADSEngine *vm);
+
+ void sub7178C();
+};
+
+class SceneInfoDragonsphere : public SceneInfo {
+ friend class SceneInfo;
+protected:
+ virtual void loadCodes(MSurface &depthSurface, int variant);
+
+ virtual void loadCodes(MSurface &depthSurface, Common::SeekableReadStream *stream);
+
+ /**
+ * Constructor
+ */
+ SceneInfoDragonsphere(MADSEngine *vm) : SceneInfo(vm) {}
+};
+
+// TODO: Temporary, remove once implemented properly
+class Scene1xx : public DragonsphereScene {
+protected:
+ /**
+ * Plays an appropriate sound when entering a scene
+ */
+ void sceneEntrySound() {}
+
+ /**
+ *Sets the AA file to use for the scene
+ */
+ void setAAName() {}
+
+ /**
+ * Updates the prefix used for getting player sprites for the scene
+ */
+ void setPlayerSpritesPrefix() {}
+public:
+ Scene1xx(MADSEngine *vm) : DragonsphereScene(vm) {}
+};
+
+// TODO: Temporary, remove once implemented properly
+class DummyScene : public DragonsphereScene {
+public:
+ DummyScene(MADSEngine *vm) : DragonsphereScene(vm) {
+ warning("Unimplemented scene");
+ }
+
+ virtual void setup() {}
+ virtual void enter() {}
+ virtual void actions() {}
+};
+
+} // End of namespace Dragonsphere
+
+} // End of namespace MADS
+
+#endif /* MADS_DRAGONSPHERE_SCENES_H */
diff --git a/engines/mads/dragonsphere/game_dragonsphere.cpp b/engines/mads/dragonsphere/game_dragonsphere.cpp
new file mode 100644
index 0000000000..9d9b48dd66
--- /dev/null
+++ b/engines/mads/dragonsphere/game_dragonsphere.cpp
@@ -0,0 +1,159 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+
+ * You should have received a copy of the GNU General Public 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 "mads/mads.h"
+#include "mads/game.h"
+#include "mads/screen.h"
+#include "mads/msurface.h"
+#include "mads/dragonsphere/game_dragonsphere.h"
+//#include "mads/nebular/dialogs_nebular.h"
+//#include "mads/nebular/globals_nebular.h"
+#include "mads/dragonsphere/dragonsphere_scenes.h"
+
+namespace MADS {
+
+namespace Dragonsphere {
+
+GameDragonsphere::GameDragonsphere(MADSEngine *vm)
+ : Game(vm) {
+ _surface = new MSurface(MADS_SCREEN_WIDTH, MADS_SCENE_HEIGHT);
+ _storyMode = STORYMODE_NAUGHTY;
+}
+
+void GameDragonsphere::startGame() {
+ initializeGlobals();
+}
+
+void GameDragonsphere::initializeGlobals() {
+ //int count, count2;
+ //int bad;
+
+ _globals.reset();
+ //_globals[kTalkInanimateCount] = 8;
+
+ /* Section #1 variables */
+ // TODO
+
+ /* Section #2 variables */
+ // TODO
+
+ /* Section #3 variables */
+ // TODO
+
+ /* Section #4 variables */
+ // TODO
+
+ /* Section #5 variables */
+ // TODO
+
+ /* Section #6 variables */
+ // TODO
+
+ /* Section #9 variables */
+ // TODO
+
+ _player._facing = FACING_NORTH;
+ _player._turnToFacing = FACING_NORTH;
+
+ //Player::preloadSequences("RXM", 1);
+ //Player::preloadSequences("ROX", 1);
+}
+
+void GameDragonsphere::setSectionHandler() {
+ delete _sectionHandler;
+
+ switch (_sectionNumber) {
+ case 1:
+ _sectionHandler = new Section1Handler(_vm);
+ break;
+ case 2:
+ _sectionHandler = new Section2Handler(_vm);
+ break;
+ case 3:
+ _sectionHandler = new Section3Handler(_vm);
+ break;
+ case 4:
+ _sectionHandler = new Section4Handler(_vm);
+ break;
+ case 5:
+ _sectionHandler = new Section5Handler(_vm);
+ break;
+ case 6:
+ _sectionHandler = new Section6Handler(_vm);
+ break;
+ case 7:
+ _sectionHandler = new Section7Handler(_vm);
+ break;
+ case 8:
+ _sectionHandler = new Section8Handler(_vm);
+ break;
+ default:
+ break;
+ }
+}
+
+void GameDragonsphere::checkShowDialog() {
+ // TODO: Copied from Nebular
+ if (_vm->_dialogs->_pendingDialog && _player._stepEnabled && !_globals[5]) {
+ _player.releasePlayerSprites();
+ _vm->_dialogs->showDialog();
+ _vm->_dialogs->_pendingDialog = DIALOG_NONE;
+ }
+}
+
+void GameDragonsphere::doObjectAction() {
+ // TODO: Copied from Nebular
+ //Scene &scene = _scene;
+ MADSAction &action = _scene._action;
+ //Dialogs &dialogs = *_vm->_dialogs;
+ //int id;
+
+ action._inProgress = false;
+}
+
+void GameDragonsphere::unhandledAction() {
+ // TODO
+}
+
+void GameDragonsphere::step() {
+ if (_player._visible && _player._stepEnabled && !_player._moving &&
+ (_player._facing == _player._turnToFacing)) {
+
+ // TODO
+ }
+
+}
+
+void GameDragonsphere::synchronize(Common::Serializer &s, bool phase1) {
+ Game::synchronize(s, phase1);
+
+ // TODO: Copied from Nebular
+ if (!phase1) {
+ _globals.synchronize(s);
+ }
+}
+
+} // End of namespace Dragonsphere
+
+} // End of namespace MADS
diff --git a/engines/mads/dragonsphere/game_dragonsphere.h b/engines/mads/dragonsphere/game_dragonsphere.h
new file mode 100644
index 0000000000..7869dc87b4
--- /dev/null
+++ b/engines/mads/dragonsphere/game_dragonsphere.h
@@ -0,0 +1,151 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+
+ * You should have received a copy of the GNU General Public 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 MADS_GAME_DRAGONSPHERE_H
+#define MADS_GAME_DRAGONSPHERE_H
+
+#include "common/scummsys.h"
+#include "mads/game.h"
+#include "mads/globals.h"
+//#include "mads/nebular/globals_nebular.h"
+
+namespace MADS {
+
+namespace Dragonsphere {
+
+// TODO: Adapt for Dragonsphere's difficulty setting
+enum StoryMode { STORYMODE_NAUGHTY = 1, STORYMODE_NICE = 2 };
+
+enum InventoryObject {
+ OBJ_NONE = -1,
+ OBJ_SIGNET_RING = 0,
+ OBJ_BIRD_FIGURINE = 1,
+ OBJ_BIRDCALL = 2,
+ OBJ_SHIELDSTONE = 3,
+ OBJ_SWORD = 4,
+ OBJ_GOBLET = 5,
+ OBJ_BONE = 6,
+ OBJ_FRUIT = 7,
+ OBJ_DOLL = 8,
+ OBJ_POLYSTONE = 9,
+ OBJ_RED_STONE = 10,
+ OBJ_YELLOW_STONE = 11,
+ OBJ_BLUE_STONE = 12,
+ OBJ_KEY_CROWN = 13,
+ OBJ_DATES = 14,
+ OBJ_STATUE = 15,
+ OBJ_FLIES = 16,
+ OBJ_SOUL_EGG = 17,
+ OBJ_MAGIC_BELT = 18,
+ OBJ_AMULET = 19,
+ OBJ_MUD = 20,
+ OBJ_FEATHERS = 21,
+ OBJ_TORCH = 22,
+ OBJ_FLASK = 23,
+ OBJ_FLASK_OF_ACID = 24,
+ OBJ_ROPE = 25,
+ OBJ_VORTEX_STONE = 26,
+ OBJ_DEAD_RAT = 27,
+ OBJ_MAP = 28,
+ OBJ_CRYSTAL_BALL = 29,
+ OBJ_BLACK_SPHERE = 30,
+ OBJ_SOPORIFIC = 31,
+ OBJ_SHIFTER_RING = 32,
+ OBJ_SPIRIT_BUNDLE = 33,
+ OBJ_PARTIAL_BUNDLE = 34,
+ OBJ_RATSICLE = 35,
+ OBJ_TENTACLE_PARTS = 36,
+ OBJ_TELEPORT_DOOR = 37,
+ OBJ_RARE_COIN = 38,
+ OBJ_CRYSTAL_FLOWER = 39,
+ OBJ_DIAMOND_DUST = 40,
+ OBJ_RUBY_RING = 41,
+ OBJ_GOLD_NUGGET = 42,
+ OBJ_MUSIC_BOX = 43,
+ OBJ_EMERALD = 44,
+ OBJ_PARCHMENT = 45,
+ OBJ_GAME = 46,
+ OBJ_GAME2 = 47,
+ OBJ_NEW_BUNDLE = 48
+};
+
+// HACK: A stub for now, remove from here once it's implemented properly
+class DragonsphereGlobals : public Globals {
+public:
+ DragonsphereGlobals() {
+ resize(210); // Rex has 210 globals
+ }
+ virtual ~DragonsphereGlobals() {}
+};
+
+class GameDragonsphere : public Game {
+ friend class Game;
+protected:
+ GameDragonsphere(MADSEngine *vm);
+
+ virtual void startGame();
+
+ virtual void initializeGlobals();
+
+ virtual void setSectionHandler();
+
+ virtual void checkShowDialog();
+public:
+ DragonsphereGlobals _globals;
+ StoryMode _storyMode;
+
+ virtual Globals &globals() { return _globals; }
+
+ virtual void doObjectAction();
+
+ virtual void unhandledAction();
+
+ virtual void step();
+
+ virtual void synchronize(Common::Serializer &s, bool phase1);
+};
+
+
+class Section1Handler : public SectionHandler {
+public:
+ Section1Handler(MADSEngine *vm) : SectionHandler(vm) {}
+
+ // TODO: Properly implement handler methods
+ virtual void preLoadSection() {}
+ virtual void sectionPtr2() {}
+ virtual void postLoadSection() {}
+};
+
+// TODO: Properly implement handler classes
+typedef Section1Handler Section2Handler;
+typedef Section1Handler Section3Handler;
+typedef Section1Handler Section4Handler;
+typedef Section1Handler Section5Handler;
+typedef Section1Handler Section6Handler;
+typedef Section1Handler Section7Handler;
+typedef Section1Handler Section8Handler;
+
+} // End of namespace Nebular
+
+} // End of namespace MADS
+
+#endif /* MADS_GAME_DRAGONSPHERE_H */
diff --git a/engines/mads/events.cpp b/engines/mads/events.cpp
new file mode 100644
index 0000000000..c3e6d5c122
--- /dev/null
+++ b/engines/mads/events.cpp
@@ -0,0 +1,256 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+
+ * You should have received a copy of the GNU General Public 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/cursorman.h"
+#include "common/events.h"
+#include "engines/util.h"
+#include "mads/mads.h"
+#include "mads/events.h"
+#include "mads/scene.h"
+
+namespace MADS {
+
+EventsManager::EventsManager(MADSEngine *vm) {
+ _vm = vm;
+ _cursorSprites = nullptr;
+ _cursorId = CURSOR_NONE;
+ _newCursorId = CURSOR_NONE;
+ _frameCounter = 10;
+ _priorFrameTime = 0;
+ _mouseClicked = false;
+ _mouseReleased = false;
+ _mouseButtons = 0;
+ _mouseStatus = 0;
+ _vD2 = 0;
+ _mouseStatusCopy = 0;
+ _mouseMoved = false;
+ _vD8 = 0;
+ _rightMousePressed = false;
+}
+
+EventsManager::~EventsManager() {
+ freeCursors();
+}
+
+void EventsManager::loadCursors(const Common::String &spritesName) {
+ delete _cursorSprites;
+ _cursorSprites = new SpriteAsset(_vm, spritesName, 0x4000);
+}
+
+void EventsManager::setCursor(CursorType cursorId) {
+ _cursorId = cursorId;
+ changeCursor();
+}
+
+void EventsManager::setCursor2(CursorType cursorId) {
+ _cursorId = cursorId;
+ _newCursorId = cursorId;
+ changeCursor();
+}
+
+void EventsManager::showCursor() {
+ CursorMan.showMouse(true);
+}
+
+void EventsManager::hideCursor() {
+ CursorMan.showMouse(false);
+}
+
+bool EventsManager::isCursorVisible() {
+ return CursorMan.isVisible();
+}
+
+void EventsManager::waitCursor() {
+ CursorType cursorId = (CursorType)MIN(_cursorSprites->getCount(), (int)CURSOR_WAIT);
+ _newCursorId = cursorId;
+ if (_cursorId != _newCursorId) {
+ changeCursor();
+ _cursorId = _newCursorId;
+ }
+}
+
+void EventsManager::changeCursor() {
+ if (_cursorSprites) {
+ MSprite *cursor = _cursorSprites->getFrame(_cursorId - 1);
+ assert(cursor->w == cursor->h);
+ byte transIndex = cursor->getTransparencyIndex();
+
+ // Check for hotspot indication pixels along the right-hand and bottom
+ // row. Put together, these give the cursor's hotspot x,y
+ int hotspotX = 0, hotspotY = 0;
+ byte *cursorData = cursor->getData();
+ for (int idx = 0; idx < cursor->w; ++idx) {
+ if (cursorData[(cursor->h - 1) * cursor->w + idx] != transIndex)
+ hotspotX = idx;
+
+ if (cursorData[(idx + 1) * cursor->w - 1] != transIndex)
+ hotspotY = idx;
+ }
+
+ // Reduce the cursor data to remove the last column from each row, since
+ // the cursor routines don't have a pitch option
+ byte *destCursor = new byte[(cursor->w - 1) * (cursor->h - 1)];
+ byte *srcP = cursorData;
+ byte *destP = destCursor;
+
+ for (int idx = 0; idx < (cursor->h - 1); ++idx) {
+ Common::copy(srcP, srcP + cursor->w - 1, destP);
+ srcP += cursor->w;
+ destP += cursor->w - 1;
+ }
+
+ // Set the raw cursor data to use
+ CursorMan.replaceCursor(destCursor, cursor->w - 1, cursor->h - 1,
+ hotspotX, hotspotY, transIndex);
+ showCursor();
+ delete[] destCursor;
+ }
+}
+
+void EventsManager::freeCursors() {
+ delete _cursorSprites;
+ _cursorSprites = nullptr;
+}
+
+void EventsManager::pollEvents() {
+ checkForNextFrameCounter();
+ _mouseMoved = false;
+
+ Common::Event event;
+ while (g_system->getEventManager()->pollEvent(event)) {
+ // Handle keypress
+ switch (event.type) {
+ case Common::EVENT_QUIT:
+ case Common::EVENT_RTL:
+ return;
+
+ case Common::EVENT_KEYDOWN:
+ // Check for debugger
+ if (event.kbd.keycode == Common::KEYCODE_d && (event.kbd.flags & Common::KBD_CTRL)) {
+ // Attach to the debugger
+ _vm->_debugger->attach();
+ _vm->_debugger->onFrame();
+ } else {
+ _pendingKeys.push(event);
+ }
+ return;
+ case Common::EVENT_KEYUP:
+ return;
+ case Common::EVENT_LBUTTONDOWN:
+ case Common::EVENT_RBUTTONDOWN:
+ _mouseClicked = true;
+ _mouseButtons = 1;
+ _mouseMoved = true;
+ if (event.type == Common::EVENT_RBUTTONDOWN) {
+ _rightMousePressed = true;
+ _mouseStatus |= 2;
+ } else {
+ _mouseStatus |= 1;
+ }
+ return;
+ case Common::EVENT_LBUTTONUP:
+ case Common::EVENT_RBUTTONUP:
+ _mouseClicked = false;
+ _mouseReleased = true;
+ _mouseMoved = true;
+ _rightMousePressed = false;
+ if (event.type == Common::EVENT_RBUTTONUP) {
+ _mouseStatus &= ~2;
+ } else {
+ _mouseStatus &= ~1;
+ }
+ return;
+ case Common::EVENT_MOUSEMOVE:
+ _mousePos = event.mouse;
+ _currentPos = event.mouse;
+ _mouseMoved = true;
+ break;
+ default:
+ break;
+ }
+ }
+}
+
+void EventsManager::checkForNextFrameCounter() {
+ // Check for next game frame
+ uint32 milli = g_system->getMillis();
+ if ((milli - _priorFrameTime) >= GAME_FRAME_TIME) {
+ ++_frameCounter;
+ _priorFrameTime = milli;
+
+ // Do any palette cycling
+ _vm->_game->_scene.animatePalette();
+
+ // Give time to the debugger
+ _vm->_debugger->onFrame();
+
+ // Display the frame
+ _vm->_screen.updateScreen();
+
+ // Signal the ScummVM debugger
+ _vm->_debugger->onFrame();
+ }
+}
+
+void EventsManager::delay(int cycles) {
+ uint32 totalMilli = cycles * 1000 / GAME_FRAME_RATE;
+ uint32 delayEnd = g_system->getMillis() + totalMilli;
+
+ while (!_vm->shouldQuit() && g_system->getMillis() < delayEnd) {
+ g_system->delayMillis(10);
+
+ pollEvents();
+ }
+}
+
+void EventsManager::waitForNextFrame() {
+ _mouseClicked = false;
+ _mouseReleased = false;
+ _mouseButtons = 0;
+
+ bool mouseClicked = false;
+ bool mouseReleased = false;
+ int mouseButtons = 0;
+
+ uint32 frameCtr = getFrameCounter();
+ while (!_vm->shouldQuit() && frameCtr == _frameCounter) {
+ delay(1);
+
+ mouseClicked |= _mouseClicked;
+ mouseReleased |= _mouseReleased;
+ mouseButtons |= _mouseButtons;
+ }
+
+ _mouseClicked = mouseClicked;
+ _mouseReleased = mouseReleased;
+ _mouseButtons = mouseButtons;
+ _mouseMoved |= _mouseClicked || _mouseReleased;
+}
+
+void EventsManager::initVars() {
+ _mousePos = Common::Point(-1, -1);
+ _mouseStatusCopy = _mouseStatus;
+ _vD2 = _vD8 = 0;
+}
+
+} // End of namespace MADS
diff --git a/engines/mads/events.h b/engines/mads/events.h
new file mode 100644
index 0000000000..3d7504c0bd
--- /dev/null
+++ b/engines/mads/events.h
@@ -0,0 +1,164 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+
+ * You should have received a copy of the GNU General Public 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 MADS_EVENTS_H
+#define MADS_EVENTS_H
+
+#include "common/scummsys.h"
+#include "common/events.h"
+#include "common/stack.h"
+#include "mads/assets.h"
+#include "mads/sprites.h"
+
+namespace MADS {
+
+enum CursorType { CURSOR_NONE = 0, CURSOR_ARROW = 1, CURSOR_WAIT = 2, CURSOR_GO_DOWN = 3,
+ CURSOR_GO_UP = 4, CURSOR_GO_LEFT = 5, CURSOR_GO_RIGHT = 6 };
+
+#define GAME_FRAME_RATE 50
+#define GAME_FRAME_TIME (1000 / GAME_FRAME_RATE)
+
+class MADSEngine;
+
+class EventsManager {
+private:
+ MADSEngine *_vm;
+ uint32 _frameCounter;
+ uint32 _priorFrameTime;
+ Common::Point _mousePos;
+ Common::Point _currentPos;
+
+ /**
+ * Updates the cursor image when the current cursor changes
+ */
+ void changeCursor();
+
+ /**
+ * Checks for whether the next game frame number has been reached.
+ */
+ void checkForNextFrameCounter();
+public:
+ SpriteAsset *_cursorSprites;
+ CursorType _cursorId;
+ CursorType _newCursorId;
+ bool _mouseClicked;
+ bool _mouseReleased;
+ byte _mouseButtons;
+ bool _rightMousePressed;
+ int _mouseStatus;
+ int _vD2;
+ int _mouseStatusCopy;
+ bool _mouseMoved;
+ int _vD8;
+ Common::Stack<Common::Event> _pendingKeys;
+public:
+ /**
+ * Constructor
+ */
+ EventsManager(MADSEngine *vm);
+
+ /**
+ * Destructor
+ */
+ ~EventsManager();
+
+ /**
+ * Loads the sprite set containing the cursors
+ */
+ void loadCursors(const Common::String &spritesName);
+
+ /**
+ * Sets the cursor
+ */
+ void setCursor(CursorType cursorId);
+
+ /**
+ * Sets the cursor
+ */
+ void setCursor2(CursorType cursorId);
+
+ /**
+ * Show the mouse cursor
+ */
+ void showCursor();
+
+ /**
+ * Hide the mouse cursor
+ */
+ void hideCursor();
+
+ /**
+ * Returns if the mouse cursor is visible
+ */
+ bool isCursorVisible();
+
+ /**
+ * Shows the wait cursor
+ */
+ void waitCursor();
+
+ /**
+ * Free currently loaded cursors
+ */
+ void freeCursors();
+
+ /**
+ * Poll any pending events
+ */
+ void pollEvents();
+
+ /**
+ * Return the current mouse position
+ */
+ Common::Point mousePos() const { return _mousePos; }
+
+ /**
+ * Return the current mouse position
+ */
+ Common::Point currentPos() const { return _currentPos; }
+
+ /**
+ * Delay for a given number of frames
+ */
+ void delay(int amount);
+
+ /**
+ * Wait for the next frame
+ */
+ void waitForNextFrame();
+
+ /**
+ * Gets the current frame counter
+ */
+ uint32 getFrameCounter() const { return _frameCounter; }
+
+ void initVars();
+
+ /**
+ * Returns true if there's any pending keys to be processed
+ */
+ bool isKeyPressed() const { return !_pendingKeys.empty(); }
+};
+
+} // End of namespace MADS
+
+#endif /* MADS_EVENTS_H */
diff --git a/engines/mads/font.cpp b/engines/mads/font.cpp
new file mode 100644
index 0000000000..f7c1c52703
--- /dev/null
+++ b/engines/mads/font.cpp
@@ -0,0 +1,256 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+
+ * You should have received a copy of the GNU General Public 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 "mads/mads.h"
+#include "mads/compression.h"
+#include "mads/font.h"
+#include "mads/msurface.h"
+
+namespace MADS {
+
+MADSEngine *Font::_vm;
+
+Common::HashMap<Common::String, Font *> *Font::_fonts;
+
+uint8 Font::_fontColors[4];
+
+void Font::init(MADSEngine *vm) {
+ _vm = vm;
+ _fontColors[0] = 0xFF;
+ _fontColors[1] = 0xF;
+ _fontColors[2] = 7;
+ _fontColors[3] = 8;
+
+ _fonts = new Common::HashMap<Common::String, Font *>();
+}
+
+void Font::deinit() {
+ Common::HashMap<Common::String, Font *>::iterator i;
+ for (i = _fonts->begin(); i != _fonts->end(); ++i)
+ delete (*i)._value;
+
+ delete _fonts;
+}
+
+Font *Font::getFont(const Common::String &fontName) {
+ if (_fonts->contains(fontName)) {
+ return _fonts->getVal(fontName);
+ } else {
+ Font *font = new Font(fontName);
+ _fonts->setVal(fontName, font);
+ return font;
+ }
+}
+
+Font::Font() {
+ _charWidths = nullptr;
+ _charOffs = nullptr;
+ _charData = nullptr;
+ setFont(FONT_INTERFACE);
+}
+
+Font::Font(const Common::String &filename) {
+ _charWidths = nullptr;
+ _charOffs = nullptr;
+ _charData = nullptr;
+ setFont(filename);
+}
+
+Font::~Font() {
+ delete[] _charWidths;
+ delete[] _charOffs;
+ delete[] _charData;
+}
+
+void Font::setFont(const Common::String &filename) {
+ if (!_filename.empty() && (filename == _filename))
+ // Already using specified font, so don't bother reloading
+ return;
+
+ _filename = filename;
+
+ Common::String resName = filename;
+ if (!resName.hasSuffix(".FF"))
+ resName += ".FF";
+
+ MadsPack fontData(resName, _vm);
+ Common::SeekableReadStream *fontFile = fontData.getItemStream(0);
+
+ _maxHeight = fontFile->readByte();
+ _maxWidth = fontFile->readByte();
+
+ _charWidths = new uint8[128];
+ // Char data is shifted by 1
+ _charWidths[0] = 0;
+ fontFile->read(_charWidths + 1, 127);
+ fontFile->readByte(); // remainder
+
+ _charOffs = new uint16[128];
+
+ uint startOffs = 2 + 128 + 256;
+ uint fontSize = fontFile->size() - startOffs;
+
+ // Char data is shifted by 1
+ _charOffs[0] = 0;
+ for (int i = 1; i < 128; i++)
+ _charOffs[i] = fontFile->readUint16LE() - startOffs;
+ fontFile->readUint16LE(); // remainder
+
+ _charData = new uint8[fontSize];
+ fontFile->read(_charData, fontSize);
+
+ delete fontFile;
+}
+
+void Font::setColors(uint8 v1, uint8 v2, uint8 v3, uint8 v4) {
+ _fontColors[0] = v1;
+ _fontColors[1] = v2;
+ _fontColors[2] = v3;
+ _fontColors[3] = v4;
+}
+
+void Font::setColorMode(SelectionMode mode) {
+ switch (mode) {
+ case SELMODE_UNSELECTED:
+ setColors(0xFF, 4, 4, 0);
+ break;
+ case SELMODE_HIGHLIGHTED:
+ setColors(0xFF, 5, 5, 0);
+ break;
+ case SELMODE_SELECTED:
+ setColors(0xFF, 6, 6, 0);
+ break;
+ default:
+ break;
+ }
+}
+
+int Font::writeString(MSurface *surface, const Common::String &msg, const Common::Point &pt,
+ int spaceWidth, int width) {
+ int xEnd;
+ if (width > 0)
+ xEnd = MIN((int)surface->w, pt.x + width);
+ else
+ xEnd = surface->w;
+
+ int x = pt.x;
+ int y = pt.y;
+
+ int skipY = 0;
+ if (y < 0) {
+ skipY = -y;
+ y = 0;
+ }
+
+ int height = MAX(0, _maxHeight - skipY);
+ if (height == 0)
+ return x;
+
+ int bottom = y + height - 1;
+ if (bottom > surface->getHeight() - 1) {
+ height -= MIN(height, bottom - (surface->getHeight() - 1));
+ }
+
+ if (height <= 0)
+ return x;
+
+ byte *destPtr = surface->getBasePtr(x, y);
+ uint8 *oldDestPtr = destPtr;
+
+ int xPos = x;
+
+ const char *text = msg.c_str();
+ while (*text) {
+ char theChar = (*text++) & 0x7F;
+ int charWidth = _charWidths[(byte)theChar];
+
+ if (charWidth > 0) {
+
+ if (xPos + charWidth > xEnd)
+ return xPos;
+
+ uint8 *charData = &_charData[_charOffs[(byte)theChar]];
+ int bpp = getBpp(charWidth);
+
+ if (skipY != 0)
+ charData += bpp * skipY;
+
+ for (int i = 0; i < height; i++) {
+ for (int j = 0; j < bpp; j++) {
+ if (*charData & 0xc0)
+ *destPtr = _fontColors[(*charData & 0xc0) >> 6];
+ destPtr++;
+ if (*charData & 0x30)
+ *destPtr = _fontColors[(*charData & 0x30) >> 4];
+ destPtr++;
+ if (*charData & 0x0C)
+ *destPtr = _fontColors[(*charData & 0x0C) >> 2];
+ destPtr++;
+ if (*charData & 0x03)
+ *destPtr = _fontColors[*charData & 0x03];
+ destPtr++;
+ charData++;
+ }
+
+ destPtr += surface->getWidth() - bpp * 4;
+
+ }
+
+ destPtr = oldDestPtr + charWidth + spaceWidth;
+ oldDestPtr = destPtr;
+
+ }
+
+ xPos += charWidth + spaceWidth;
+
+ }
+
+ return xPos;
+
+}
+
+int Font::getWidth(const Common::String &msg, int spaceWidth) {
+ int width = 0;
+ const char *text = msg.c_str();
+
+ if (msg.size() > 0) {
+ while (*text)
+ width += _charWidths[*text++ & 0x7F] + spaceWidth;
+ width -= spaceWidth;
+ }
+
+ return width;
+}
+
+int Font::getBpp(int charWidth) {
+ if (charWidth > 12)
+ return 4;
+ else if (charWidth > 8)
+ return 3;
+ else if (charWidth > 4)
+ return 2;
+ else
+ return 1;
+}
+
+} // End of namespace MADS
diff --git a/engines/mads/font.h b/engines/mads/font.h
new file mode 100644
index 0000000000..47df647637
--- /dev/null
+++ b/engines/mads/font.h
@@ -0,0 +1,95 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+
+ * You should have received a copy of the GNU General Public 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 MADS_FONT_H
+#define MADS_FONT_H
+
+#include "common/scummsys.h"
+#include "common/hashmap.h"
+#include "common/endian.h"
+#include "common/util.h"
+#include "mads/msurface.h"
+
+namespace MADS {
+
+#define FONT_CONVERSATION "*FONTCONV.FF"
+#define FONT_INTERFACE "*FONTINTR.FF"
+#define FONT_MAIN "*FONTMAIN.FF"
+#define FONT_MENU "*FONTMENU.FF" // Not in Rex (uses bitmap files for menu strings)
+#define FONT_MISC "*FONTMISC.FF"
+#define FONT_TELE "*FONTTELE.FF" // Not in Phantom
+#define FONT_PHAN "*FONTPHAN.FF" // Phantom only
+
+enum SelectionMode {
+ SELMODE_UNSELECTED = 0, SELMODE_HIGHLIGHTED = 1, SELMODE_SELECTED = 2
+};
+
+class MADSEngine;
+
+class Font {
+private:
+ static uint8 _fontColors[4];
+ static MADSEngine *_vm;
+ static Common::HashMap<Common::String, Font *> *_fonts;
+public:
+ /**
+ * Initialize the font system
+ */
+ static void init(MADSEngine *vm);
+
+ /**
+ * Free up the resources used by the font
+ */
+ static void deinit();
+
+ /**
+ * Returns a new Font instance using the specified font name
+ */
+ static Font *getFont(const Common::String &fontName);
+private:
+ uint8 _maxWidth, _maxHeight;
+ uint8 *_charWidths;
+ uint16 *_charOffs;
+ uint8 *_charData;
+ Common::String _filename;
+
+ int getBpp(int charWidth);
+
+ void setFont(const Common::String &filename);
+public:
+ Font();
+ Font(const Common::String &filename);
+ virtual ~Font();
+
+ void setColors(uint8 v1, uint8 v2, uint8 v3, uint8 v4);
+ void setColorMode(SelectionMode mode);
+
+ int maxWidth() const { return _maxWidth; }
+ int getWidth(const Common::String &msg, int spaceWidth = -1);
+ int getHeight() const { return _maxHeight; }
+ int writeString(MSurface *surface, const Common::String &msg, const Common::Point &pt,
+ int spaceWidth = 0, int width = 0);
+};
+
+} // End of namespace MADS
+
+#endif /* MADS_FONT_H */
diff --git a/engines/mads/game.cpp b/engines/mads/game.cpp
new file mode 100644
index 0000000000..8639f59418
--- /dev/null
+++ b/engines/mads/game.cpp
@@ -0,0 +1,573 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+
+ * You should have received a copy of the GNU General Public 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/memstream.h"
+#include "common/serializer.h"
+#include "graphics/palette.h"
+#include "graphics/scaler.h"
+#include "graphics/thumbnail.h"
+#include "mads/mads.h"
+#include "mads/compression.h"
+#include "mads/game.h"
+#include "mads/game_data.h"
+#include "mads/events.h"
+#include "mads/screen.h"
+#include "mads/msurface.h"
+#include "mads/resources.h"
+#include "mads/dragonsphere/game_dragonsphere.h"
+#include "mads/nebular/game_nebular.h"
+#include "mads/phantom/game_phantom.h"
+
+namespace MADS {
+
+Game *Game::init(MADSEngine *vm) {
+ switch (vm->getGameID()) {
+ case GType_RexNebular:
+ return new Nebular::GameNebular(vm);
+ case GType_Dragonsphere:
+ return new Dragonsphere::GameDragonsphere(vm);
+ case GType_Phantom:
+ return new Phantom::GamePhantom(vm);
+ default:
+ error("Game: Unknown game");
+ }
+
+ return nullptr;
+}
+
+Game::Game(MADSEngine *vm)
+ : _vm(vm), _surface(nullptr), _objects(vm), _scene(vm),
+ _screenObjects(vm), _player(vm) {
+ _sectionNumber = 1;
+ _priorSectionNumber = 0;
+ _loadGameSlot = -1;
+ _lastSave = -1;
+ _saveFile = nullptr;
+ _statusFlag = 0;
+ _sectionHandler = nullptr;
+ _sectionNumber = 1;
+ _priorSectionNumber = 0;
+ _currentSectionNumber = -1;
+ _kernelMode = KERNEL_GAME_LOAD;
+ _quoteEmergency = false;
+ _vocabEmergency = false;
+ _aaName = "*I0.AA";
+ _priorFrameTimer = 0;
+ _anyEmergency = false;
+ _triggerMode = SEQUENCE_TRIGGER_PARSER;
+ _triggerSetupMode = SEQUENCE_TRIGGER_DAEMON;
+ _trigger = 0;
+ _winStatus = 0;
+ _widepipeCtr = 0;
+ _fx = kTransitionNone;
+
+ // Load the inventory object list
+ _objects.load();
+ if (_objects._inventoryList.size() > 0)
+ // At least one item in default inventory, so select first item for display
+ _scene._userInterface._selectedInvIndex = 0;
+
+ // Load the quotes
+ loadQuotes();
+}
+
+Game::~Game() {
+ delete _saveFile;
+ delete _surface;
+ delete _sectionHandler;
+}
+
+void Game::run() {
+ initializeGlobals();
+
+ // If requested, load a savegame instead of showing the intro
+ if (ConfMan.hasKey("save_slot")) {
+ int saveSlot = ConfMan.getInt("save_slot");
+ if (saveSlot >= 0 && saveSlot <= 999)
+ _loadGameSlot = saveSlot;
+ }
+
+ _statusFlag = true;
+
+ if (_loadGameSlot == -1) {
+ startGame();
+ }
+
+ // Get the initial starting time for the first scene
+ _scene._frameStartTime = _vm->_events->getFrameCounter();
+
+ if (!_vm->shouldQuit())
+ gameLoop();
+}
+
+void Game::splitQuote(const Common::String &source, Common::String &line1, Common::String &line2) {
+ // Make the first line up the end of the word at the half-way point
+ const char *strP = source.c_str() + source.size() / 2;
+ while (*strP != ' ') ++strP;
+
+ line1 = Common::String(source.c_str(), strP);
+
+ // The rest of the string goes in the second line
+ while (*strP == ' ') ++strP;
+ line2 = Common::String(strP);
+}
+
+void Game::gameLoop() {
+ while (!_vm->shouldQuit() && _statusFlag) {
+ if (_loadGameSlot != -1) {
+ loadGame(_loadGameSlot);
+ _loadGameSlot = -1;
+ }
+
+ setSectionHandler();
+ _sectionHandler->preLoadSection();
+ initSection(_sectionNumber);
+ _vm->_sound->init(_sectionNumber);
+ _sectionHandler->postLoadSection();
+
+ _scene._spriteSlots.reset();
+
+ if (_sectionNumber == _currentSectionNumber)
+ sectionLoop();
+
+ _player.releasePlayerSprites();
+ assert(_scene._sprites._assetCount == 0);
+
+ _vm->_palette->unlock();
+ _vm->_events->waitCursor();
+ _vm->_events->freeCursors();
+ _vm->_sound->closeDriver();
+ }
+}
+
+void Game::sectionLoop() {
+ while (!_vm->shouldQuit() && _statusFlag && (_sectionNumber == _currentSectionNumber)) {
+ _kernelMode = KERNEL_ROOM_PRELOAD;
+ _player._spritesChanged = true;
+ _quoteEmergency = false;
+ _vocabEmergency = false;
+ _vm->_events->waitCursor();
+
+ _scene.clearVocab();
+ _scene._dynamicHotspots.clear();
+ _scene.loadSceneLogic();
+
+ _player._walkAnywhere = false;
+ _player._stepEnabled = true;
+ _player._visible = true;
+ _vm->_dialogs->_defaultPosition = Common::Point(-1, -1);
+ _visitedScenes.add(_scene._nextSceneId);
+
+ // Reset the user interface
+ _screenObjects._forceRescan = true;
+ _screenObjects._inputMode = kInputBuildingSentences;
+ _scene._userInterface._scrollbarActive = SCROLLBAR_NONE;
+
+ _player._loadsFirst = true;
+
+ _scene._sceneLogic->setup();
+ if (_player._spritesChanged || _player._loadsFirst) {
+ if (_player._spritesLoaded)
+ _player.releasePlayerSprites();
+ _vm->_palette->resetGamePalette(18, 10);
+ _scene._spriteSlots.reset();
+ } else {
+ _vm->_palette->initPalette();
+ }
+
+ // Set up scene palette usage
+ _scene._scenePaletteUsage.clear();
+ _scene._scenePaletteUsage.push_back(PaletteUsage::UsageEntry(0xF0));
+ _scene._scenePaletteUsage.push_back(PaletteUsage::UsageEntry(0xF1));
+ _scene._scenePaletteUsage.push_back(PaletteUsage::UsageEntry(0xF2));
+ _vm->_palette->_paletteUsage.load(&_scene._scenePaletteUsage);
+
+ if (!_player._spritesLoaded && _player._loadsFirst) {
+ if (_player.loadSprites(""))
+ _vm->quitGame();
+ _player._loadedFirst = true;
+ }
+
+ _scene.loadScene(_scene._nextSceneId, _aaName, 0);
+ _vm->_sound->pauseNewCommands();
+
+ if (!_player._spritesLoaded) {
+ if (_player.loadSprites(""))
+ _vm->quitGame();
+ _player._loadedFirst = false;
+ }
+
+ _vm->_events->initVars();
+ _scene._userInterface._highlightedCommandIndex = -1;
+ _scene._userInterface._highlightedInvIndex = -1;
+ _scene._userInterface._highlightedItemVocabIndex = -1;
+
+ _scene._action.clear();
+ _player.setFinalFacing();
+ _player._facing = _player._turnToFacing;
+ _player.cancelCommand();
+ _kernelMode = KERNEL_ROOM_INIT;
+
+ switch (_vm->_screenFade) {
+ case SCREEN_FADE_SMOOTH:
+ _fx = kTransitionFadeOutIn;
+ break;
+ case SCREEN_FADE_FAST:
+ _fx = kCenterVertTransition;
+ break;
+ default:
+ _fx = kTransitionNone;
+ break;
+ }
+
+ _trigger = 0;
+ _priorFrameTimer = _scene._frameStartTime;
+
+ // If in the middle of restoring a game, handle the rest of the loading
+ if (_saveFile != nullptr) {
+ Common::Serializer s(_saveFile, nullptr);
+ synchronize(s, false);
+ delete _saveFile;
+ _saveFile = nullptr;
+ }
+
+ // Call the scene logic for entering the given scene
+ _triggerSetupMode = SEQUENCE_TRIGGER_DAEMON;
+ _scene._sceneLogic->enter();
+
+ // Set player data
+ _player._targetPos = _player._playerPos;
+ _player._turnToFacing = _player._facing;
+ _player._targetFacing = _player._facing;
+ _player.selectSeries();
+ _player.updateFrame();
+
+ _player._beenVisible = _player._visible;
+ _player._special = _scene.getDepthHighBits(_player._playerPos);
+ _player._priorTimer = _scene._frameStartTime - _player._ticksAmount;
+ _player.idle();
+
+ if (_scene._userInterface._selectedInvIndex >= 0) {
+ _scene._userInterface.loadInventoryAnim(
+ _objects._inventoryList[_scene._userInterface._selectedInvIndex]);
+ } else {
+ _scene._userInterface.noInventoryAnim();
+ }
+
+ _kernelMode = KERNEL_ACTIVE_CODE;
+ _scene._roomChanged = false;
+
+ if ((_quoteEmergency || _vocabEmergency) && !_anyEmergency) {
+ _scene._currentSceneId = _scene._priorSceneId;
+ _anyEmergency = true;
+ } else {
+ _anyEmergency = false;
+ _scene.loop();
+ }
+
+ _vm->_events->waitCursor();
+ _kernelMode = KERNEL_ROOM_PRELOAD;
+
+ delete _scene._activeAnimation;
+ _scene._activeAnimation = nullptr;
+
+ _scene._reloadSceneFlag = false;
+
+ _scene._userInterface.noInventoryAnim();
+ _scene.removeSprites();
+
+ if (!_player._loadedFirst) {
+ _player._spritesLoaded = false;
+ _player._spritesChanged = true;
+ }
+
+ // Clear the scene
+ _scene.freeCurrentScene();
+ _sectionNumber = _scene._nextSceneId / 100;
+
+ // Check whether to show a dialog
+ checkShowDialog();
+ }
+}
+
+void Game::initSection(int sectionNumber) {
+ _priorSectionNumber = _currentSectionNumber;
+ _currentSectionNumber = sectionNumber;
+
+ _vm->_palette->resetGamePalette(18, 10);
+ _vm->_palette->setLowRange();
+
+ if (_scene._layer == LAYER_GUI)
+ _vm->_palette->setPalette(_vm->_palette->_mainPalette, 0, 4);
+
+ _vm->_events->loadCursors("*CURSOR.SS");
+
+ assert(_vm->_events->_cursorSprites);
+ _vm->_events->setCursor2((_vm->_events->_cursorSprites->getCount() <= 1) ?
+ CURSOR_ARROW : CURSOR_WAIT);
+}
+
+void Game::loadQuotes() {
+ File f("*QUOTES.DAT");
+
+ Common::String msg;
+ while (true) {
+ uint8 b = f.readByte();
+
+ msg += b;
+ if (f.eos() || b == '\0') {
+ // end of string, add it to the strings list
+ _quotes.push_back(msg);
+ msg = "";
+ }
+
+ if (f.eos()) break;
+ }
+
+ f.close();
+}
+
+Common::StringArray Game::getMessage(uint32 id) {
+ File f("*MESSAGES.DAT");
+ int count = f.readUint16LE();
+
+ for (int idx = 0; idx < count; ++idx) {
+ uint32 itemId = f.readUint32LE();
+ uint32 offset = f.readUint32LE();
+ uint16 size = f.readUint16LE();
+
+ if (itemId == id) {
+ // Get the source buffer size
+ uint16 sizeIn;
+ if (idx == (count - 1)) {
+ sizeIn = f.size() - offset;
+ } else {
+ f.skip(4);
+ uint32 nextOffset = f.readUint32LE();
+ sizeIn = nextOffset - offset;
+ }
+
+ // Get the compressed data
+ f.seek(offset);
+ byte *bufferIn = new byte[sizeIn];
+ f.read(bufferIn, sizeIn);
+
+ // Decompress it
+ char *bufferOut = new char[size];
+ FabDecompressor fab;
+ fab.decompress(bufferIn, sizeIn, (byte *)bufferOut, size);
+
+ // Form the output string list
+ Common::StringArray result;
+ const char *p = bufferOut;
+ while (p < (bufferOut + size)) {
+ result.push_back(p);
+ p += strlen(p) + 1;
+ }
+
+ delete[] bufferIn;
+ delete[] bufferOut;
+ return result;
+ }
+ }
+
+ error("Invalid message Id specified");
+}
+
+static const char *const DEBUG_STRING = "WIDEPIPE";
+
+void Game::handleKeypress(const Common::Event &event) {
+ if (event.kbd.flags & Common::KBD_CTRL) {
+ if (_widepipeCtr == 8) {
+ // Implement original game cheating keys here someday
+ } else {
+ if (event.kbd.keycode == (Common::KEYCODE_a +
+ (DEBUG_STRING[_widepipeCtr] - 'a'))) {
+ if (++_widepipeCtr == 8) {
+ MessageDialog *dlg = new MessageDialog(_vm, 2,
+ "CHEATING ENABLED", "(for your convenience).");
+ dlg->show();
+ delete dlg;
+ }
+ }
+ }
+ }
+
+ switch (event.kbd.keycode) {
+ case Common::KEYCODE_F1:
+ _vm->_dialogs->_pendingDialog = DIALOG_GAME_MENU;
+ break;
+ case Common::KEYCODE_F5:
+ _vm->_dialogs->_pendingDialog = DIALOG_SAVE;
+ break;
+ case Common::KEYCODE_F7:
+ _vm->_dialogs->_pendingDialog = DIALOG_RESTORE;
+ break;
+ default:
+ break;
+ }
+
+ warning("TODO: handleKeypress - %d", (int)event.kbd.keycode);
+}
+
+void Game::synchronize(Common::Serializer &s, bool phase1) {
+ if (phase1) {
+ s.syncAsSint16LE(_fx);
+ s.syncAsSint16LE(_trigger);
+ s.syncAsUint16LE(_triggerSetupMode);
+ s.syncAsUint16LE(_triggerMode);
+ s.syncString(_aaName);
+ s.syncAsSint16LE(_lastSave);
+
+ _scene.synchronize(s);
+ _objects.synchronize(s);
+ _visitedScenes.synchronize(s, _scene._nextSceneId);
+ _player.synchronize(s);
+ _screenObjects.synchronize(s);
+ } else {
+ // Load scene specific data for the loaded scene
+ _scene._sceneLogic->synchronize(s);
+ }
+}
+
+void Game::loadGame(int slotNumber) {
+ _saveFile = g_system->getSavefileManager()->openForLoading(
+ _vm->generateSaveName(slotNumber));
+
+ Common::Serializer s(_saveFile, nullptr);
+
+ // Load the savaegame header
+ MADSSavegameHeader header;
+ if (!readSavegameHeader(_saveFile, header))
+ error("Invalid savegame");
+
+ if (header._thumbnail) {
+ header._thumbnail->free();
+ delete header._thumbnail;
+ }
+
+ // Load most of the savegame data with the exception of scene specific info
+ synchronize(s, true);
+
+ // Set up section/scene and other initial states for post-load
+ _currentSectionNumber = -2;
+ _scene._currentSceneId = -2;
+ _sectionNumber = _scene._nextSceneId / 100;
+ _scene._frameStartTime = _vm->_events->getFrameCounter();
+ _vm->_screen._shakeCountdown = -1;
+
+ // Default the selected inventory item to the first one, if the player has any
+ _scene._userInterface._selectedInvIndex = _objects._inventoryList.size() > 0 ? 0 : -1;
+
+ // Set player sprites sets flags
+ _player._spritesLoaded = false;
+ _player._spritesChanged = true;
+}
+
+void Game::saveGame(int slotNumber, const Common::String &saveName) {
+ Common::OutSaveFile *out = g_system->getSavefileManager()->openForSaving(
+ _vm->generateSaveName(slotNumber));
+
+ MADSSavegameHeader header;
+ header._saveName = saveName;
+ writeSavegameHeader(out, header);
+
+ Common::Serializer s(nullptr, out);
+ synchronize(s, true);
+ synchronize(s, false);
+
+ out->finalize();
+ delete out;
+}
+
+const char *const SAVEGAME_STR = "MADS";
+#define SAVEGAME_STR_SIZE 4
+
+bool Game::readSavegameHeader(Common::InSaveFile *in, MADSSavegameHeader &header) {
+ char saveIdentBuffer[SAVEGAME_STR_SIZE + 1];
+ header._thumbnail = nullptr;
+
+ // Validate the header Id
+ in->read(saveIdentBuffer, SAVEGAME_STR_SIZE + 1);
+ if (strncmp(saveIdentBuffer, SAVEGAME_STR, SAVEGAME_STR_SIZE))
+ return false;
+
+ header._version = in->readByte();
+ if (header._version > MADS_SAVEGAME_VERSION)
+ 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)
+ return false;
+
+ // Read in save date/time
+ header._year = in->readSint16LE();
+ header._month = in->readSint16LE();
+ header._day = in->readSint16LE();
+ header._hour = in->readSint16LE();
+ header._minute = in->readSint16LE();
+ header._totalFrames = in->readUint32LE();
+
+ return true;
+}
+
+void Game::writeSavegameHeader(Common::OutSaveFile *out, MADSSavegameHeader &header) {
+ // Write out a savegame header
+ out->write(SAVEGAME_STR, SAVEGAME_STR_SIZE + 1);
+
+ out->writeByte(MADS_SAVEGAME_VERSION);
+
+ // Write savegame name
+ out->write(header._saveName.c_str(), header._saveName.size());
+ out->writeByte('\0');
+
+ // 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();
+ ::createThumbnail(thumb, _vm->_screen.getData(), MADS_SCREEN_WIDTH, MADS_SCREEN_HEIGHT, 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);
+ out->writeUint32LE(_vm->_events->getFrameCounter());
+}
+
+} // End of namespace MADS
diff --git a/engines/mads/game.h b/engines/mads/game.h
new file mode 100644
index 0000000000..08cd7e7843
--- /dev/null
+++ b/engines/mads/game.h
@@ -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.
+ *
+ */
+
+#ifndef MADS_GAME_H
+#define MADS_GAME_H
+
+#include "common/scummsys.h"
+#include "common/savefile.h"
+#include "common/str-array.h"
+#include "common/serializer.h"
+#include "mads/audio.h"
+#include "mads/scene.h"
+#include "mads/game_data.h"
+#include "mads/globals.h"
+#include "mads/inventory.h"
+#include "mads/player.h"
+#include "mads/screen.h"
+
+namespace MADS {
+
+class MADSEngine;
+
+enum KernelMode {
+ KERNEL_GAME_LOAD = 0, KERNEL_SECTION_PRELOAD = 1, KERNEL_SECTION_INIT = 2,
+ KERNEL_ROOM_PRELOAD = 3, KERNEL_ROOM_INIT = 4, KERNEL_ACTIVE_CODE = 5
+};
+
+#define MADS_SAVEGAME_VERSION 1
+
+struct MADSSavegameHeader {
+ uint8 _version;
+ Common::String _saveName;
+ Graphics::Surface *_thumbnail;
+ int _year, _month, _day;
+ int _hour, _minute;
+ int _totalFrames;
+};
+
+class Game {
+private:
+ /**
+ * Main game loop
+ */
+ void gameLoop();
+
+ /**
+ * Inner game loop for executing gameplay within a game section
+ */
+ void sectionLoop();
+
+ /**
+ * Load quotes data
+ */
+ void loadQuotes();
+protected:
+ MADSEngine *_vm;
+ MSurface *_surface;
+ int _statusFlag;
+ Common::StringArray _quotes;
+ bool _quoteEmergency;
+ bool _vocabEmergency;
+ bool _anyEmergency;
+ int _lastSave;
+ Common::String _saveName;
+ Common::InSaveFile *_saveFile;
+
+ /**
+ * Constructor
+ */
+ Game(MADSEngine *vm);
+
+ /**
+ * Initializes the current section number of the game
+ */
+ void initSection(int sectionNumber);
+
+ //@{
+ /** @name Virtual Method list */
+
+ /**
+ * Perform any game-specifcic startup
+ */
+ virtual void startGame() = 0;
+
+ /**
+ * Initializes global variables for a new game
+ */
+ virtual void initializeGlobals() = 0;
+
+ /**
+ * Set up the section handler specific to each section
+ */
+ virtual void setSectionHandler() = 0;
+
+ /**
+ * Checks for whether to show a dialog
+ */
+ virtual void checkShowDialog() = 0;
+
+ //@}
+
+public:
+ static Game *init(MADSEngine *vm);
+
+public:
+ Player _player;
+ ScreenObjects _screenObjects;
+ int _sectionNumber;
+ int _priorSectionNumber;
+ int _currentSectionNumber;
+ InventoryObjects _objects;
+ SectionHandler *_sectionHandler;
+ VisitedScenes _visitedScenes;
+ Scene _scene;
+ KernelMode _kernelMode;
+ int _trigger;
+ ScreenTransition _fx;
+ TriggerMode _triggerMode;
+ TriggerMode _triggerSetupMode;
+ uint32 _priorFrameTimer;
+ Common::String _aaName;
+ int _winStatus;
+ int _widepipeCtr;
+ int _loadGameSlot;
+
+public:
+ virtual ~Game();
+
+ /**
+ * Main outer loop for the game
+ */
+ void run();
+
+ /**
+ * Return the number of quotes
+ */
+ uint32 getQuotesSize() { return _quotes.size(); }
+
+ /**
+ * Get a specific quote string
+ */
+ const Common::String &getQuote(uint32 index) { return _quotes[index - 1]; }
+
+ /**
+ * Split a quote into two lines for display on-screen
+ */
+ void splitQuote(const Common::String &source, Common::String &line1, Common::String &line2);
+
+ Common::StringArray getMessage(uint32 id);
+
+ /**
+ * Returns the globals for the game
+ */
+ virtual Globals &globals() = 0;
+
+ /**
+ * Standard object handling across the game
+ */
+ virtual void doObjectAction() = 0;
+
+ /**
+ * Fallback handler for any action that isn't explicitly handled
+ */
+ virtual void unhandledAction() = 0;
+
+ /**
+ * Global game step
+ */
+ virtual void step() = 0;
+
+ /**
+ * Synchronize the game data
+ * @param s Serializer
+ * @param phase1 If true, it's synchronizing the basic scene information
+ */
+ virtual void synchronize(Common::Serializer &s, bool phase1);
+
+ // DEPRECATED: ScummVM re-implementation keeps all the quotes loaded, so the methods below are stubs
+ void clearQuotes() {}
+ void loadQuoteRange(int startNum, int endNum) {}
+ void loadQuoteSet(...) {}
+ void loadQuote(int quoteNum) {}
+
+ /**
+ * Handle a keyboard event
+ */
+ void handleKeypress(const Common::Event &event);
+
+ /**
+ * Starts a savegame loading.
+ * @remarks Due to the way the engine is implemented, loading is done in two
+ * parts, the second part after the specific scene has been loaded
+ */
+ void loadGame(int slotNumber);
+
+ /**
+ * Save the current game
+ */
+ void saveGame(int slotNumber, const Common::String &saveName);
+
+ /**
+ * Write out a savegame header
+ */
+ void writeSavegameHeader(Common::OutSaveFile *out, MADSSavegameHeader &header);
+
+ /**
+ * Read in a savegame header
+ */
+ static bool readSavegameHeader(Common::InSaveFile *in, MADSSavegameHeader &header);
+};
+
+} // End of namespace MADS
+
+#endif /* MADS_GAME_H */
diff --git a/engines/mads/game_data.cpp b/engines/mads/game_data.cpp
new file mode 100644
index 0000000000..70e9e6c30b
--- /dev/null
+++ b/engines/mads/game_data.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/scummsys.h"
+#include "mads/mads.h"
+#include "mads/game.h"
+#include "mads/nebular/game_nebular.h"
+#include "mads/screen.h"
+#include "mads/msurface.h"
+#include "mads/resources.h"
+
+namespace MADS {
+
+void VisitedScenes::add(int sceneId) {
+ _sceneRevisited = exists(sceneId);
+
+ if (!_sceneRevisited)
+ push_back(sceneId);
+}
+
+bool VisitedScenes::exists(int sceneId) {
+ for (uint i = 0; i < size(); ++i) {
+ if ((*this)[i] == sceneId)
+ return true;
+ }
+
+ return false;
+}
+
+void VisitedScenes::synchronize(Common::Serializer &s, int sceneId) {
+ SynchronizedList::synchronize(s);
+ s.syncAsByte(_sceneRevisited);
+
+ // If the scene hasn't been visited yet, remove it from the visited
+ // scenes list. It'll be readded to the list in add() above, from
+ // Game::sectionLoop()
+ if (s.isLoading() && !_sceneRevisited) {
+ for (uint i = 0; i < size(); ++i) {
+ if ((*this)[i] == sceneId) {
+ remove_at(i);
+ return;
+ }
+ }
+ }
+}
+
+} // End of namespace MADS
diff --git a/engines/mads/game_data.h b/engines/mads/game_data.h
new file mode 100644
index 0000000000..65a9ae1553
--- /dev/null
+++ b/engines/mads/game_data.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 MADS_GAME_DATA_H
+#define MADS_GAME_DATA_H
+
+#include "common/scummsys.h"
+#include "common/array.h"
+#include "mads/resources.h"
+
+namespace MADS {
+
+class MADSEngine;
+class Game;
+
+class VisitedScenes : public SynchronizedList {
+public:
+ /**
+ * Stores true when a previously visited scene is revisited
+ */
+ bool _sceneRevisited;
+
+ /**
+ * Returns true if a given Scene Id exists in the listed of previously visited scenes.
+ */
+ bool exists(int sceneId);
+
+ /**
+ * Adds a scene Id to the list of previously visited scenes, if it doesn't already exist
+ */
+ void add(int sceneId);
+
+ /**
+ * Synchronizes the list
+ */
+ void synchronize(Common::Serializer &s, int sceneId);
+};
+
+class SectionHandler {
+protected:
+ MADSEngine *_vm;
+public:
+ SectionHandler(MADSEngine *vm) : _vm(vm) {}
+ virtual ~SectionHandler() {}
+
+ virtual void preLoadSection() = 0;
+ virtual void sectionPtr2() = 0;
+ virtual void postLoadSection() = 0;
+ virtual void step() {}
+};
+
+} // End of namespace MADS
+
+#endif /* MADS_GAME_DATA_H */
diff --git a/backends/graphics/opengl/glerrorcheck.h b/engines/mads/globals.cpp
index 2d5491bdfd..1d088992ea 100644
--- a/backends/graphics/opengl/glerrorcheck.h
+++ b/engines/mads/globals.cpp
@@ -11,7 +11,7 @@
* This program is distributed in the hope 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
@@ -20,16 +20,14 @@
*
*/
-#if !defined(DEBUG)
+#include "common/scummsys.h"
+#include "mads/globals.h"
-// If not in debug, do nothing
-#define CHECK_GL_ERROR() do {} while (false)
+namespace MADS {
-#else
+void Globals::reset() {
+ for (uint i = 0; i < size(); ++i)
+ (*this)[i] = 0;
+}
-// If in debug, check for an error after a GL call
-#define CHECK_GL_ERROR() checkGlError(__FILE__, __LINE__)
-
-void checkGlError(const char *file, int line);
-
-#endif
+} // End of namespace MADS
diff --git a/engines/mads/globals.h b/engines/mads/globals.h
new file mode 100644
index 0000000000..a6c9b628dd
--- /dev/null
+++ b/engines/mads/globals.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 MADS_GLOBALS_H
+#define MADS_GLOBALS_H
+
+#include "common/scummsys.h"
+#include "common/array.h"
+#include "common/serializer.h"
+#include "mads/resources.h"
+
+namespace MADS {
+
+class Globals : public SynchronizedList {
+public:
+ Globals() {}
+
+ virtual ~Globals() {}
+
+ /*
+ * Resets all the globals to empty
+ */
+ void reset();
+};
+
+} // End of namespace MADS
+
+#endif /* MADS_GLOBALS_H */
diff --git a/engines/mads/hotspots.cpp b/engines/mads/hotspots.cpp
new file mode 100644
index 0000000000..d75d7ae13e
--- /dev/null
+++ b/engines/mads/hotspots.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 "mads/mads.h"
+#include "mads/hotspots.h"
+
+namespace MADS {
+
+DynamicHotspot::DynamicHotspot() {
+ _seqIndex = 0;
+ _facing = FACING_NONE;
+ _descId = 0;
+ _verbId = 0;
+ _articleNumber = 0;
+ _cursor = CURSOR_NONE;
+ _active = false;
+}
+
+void DynamicHotspot::synchronize(Common::Serializer &s) {
+
+}
+
+/*------------------------------------------------------------------------*/
+
+DynamicHotspots::DynamicHotspots(MADSEngine *vm) : _vm(vm) {
+ for (int i = 0; i < DYNAMIC_HOTSPOTS_SIZE; ++i) {
+ DynamicHotspot rec;
+ rec._active = false;
+ _entries.push_back(rec);
+ }
+
+ _changed = true;
+ _count = 0;
+}
+
+int DynamicHotspots::add(int descId, int verbId, int seqIndex, const Common::Rect &bounds) {
+ // Find a free slot
+ uint idx = 0;
+ while ((idx < _entries.size()) && _entries[idx]._active)
+ ++idx;
+ if (idx == _entries.size())
+ error("DynamicHotspots overflow");
+
+ _entries[idx]._active = true;
+ _entries[idx]._descId = descId;
+ _entries[idx]._seqIndex = seqIndex;
+ _entries[idx]._bounds = bounds;
+ _entries[idx]._feetPos = Common::Point(-3, 0);
+ _entries[idx]._facing = FACING_NONE;
+ _entries[idx]._verbId = verbId;
+ _entries[idx]._articleNumber = PREP_IN;
+ _entries[idx]._cursor = CURSOR_NONE;
+
+ ++_count;
+ _changed = true;
+
+ if (seqIndex >= 0)
+ _vm->_game->_scene._sequences[seqIndex]._dynamicHotspotIndex = idx;
+
+ return idx;
+}
+
+int DynamicHotspots::setPosition(int index, const Common::Point &pos, Facing facing) {
+ if (index >= 0) {
+ _entries[index]._feetPos = pos;
+ _entries[index]._facing = facing;
+ }
+
+ return index;
+}
+
+int DynamicHotspots::setCursor(int index, CursorType cursor) {
+ if (index >= 0)
+ _entries[index]._cursor = cursor;
+
+ return index;
+}
+
+void DynamicHotspots::remove(int index) {
+ Scene &scene = _vm->_game->_scene;
+
+ if (index >= 0 && _entries[index]._active) {
+ if (_entries[index]._seqIndex >= 0)
+ scene._sequences[_entries[index]._seqIndex]._dynamicHotspotIndex = -1;
+ _entries[index]._active = false;
+
+ --_count;
+ _changed = true;
+ }
+}
+
+void DynamicHotspots::clear() {
+ for (uint i = 0; i < _entries.size(); ++i)
+ _entries[i]._active = false;
+
+ _changed = false;
+ _count = 0;
+}
+
+void DynamicHotspots::reset() {
+ for (uint i = 0; i < _entries.size(); ++i)
+ remove(i);
+
+ _count = 0;
+ _changed = false;
+}
+
+void DynamicHotspots::refresh() {
+ // Reset the screen objects back to only contain UI elements
+ ScreenObjects &scrObjects = _vm->_game->_screenObjects;
+ scrObjects.resize(scrObjects._uiCount);
+
+ // Loop through adding hotspots
+ for (uint i = 0; i < _entries.size(); ++i) {
+ DynamicHotspot &dh = (*this)[i];
+
+ if ((*this)[i]._active) {
+ switch (scrObjects._inputMode) {
+ case kInputBuildingSentences:
+ case kInputLimitedSentences:
+ scrObjects.add(dh._bounds, _vm->_game->_scene._layer, CAT_12, dh._descId);
+ scrObjects._forceRescan = true;
+ break;
+ default:
+ break;
+ }
+ }
+ }
+
+ // Reset the list's changed flag
+ _changed = false;
+}
+
+DynamicHotspot &DynamicHotspots::get(int index) {
+ for (uint i = 0; i < _entries.size(); ++i) {
+ if (_entries[i]._active && index-- == 0)
+ return _entries[i];
+ }
+
+ error("Could not find dynamic hotspot");
+}
+
+void DynamicHotspots::synchronize(Common::Serializer &s) {
+ int count = _entries.size();
+ s.syncAsSint16LE(count);
+
+ // The MIN in the below loop is a workaround to fix earlier savegame
+ // loading accidentally adding new dynamic hotspots to the fixed list
+ for (int i = 0; i < count; ++i) {
+ _entries[MIN(i, (int)_entries.size() - 1)].synchronize(s);
+ }
+}
+
+/*------------------------------------------------------------------------*/
+
+Hotspot::Hotspot() {
+ _facing = FACING_NONE;
+ _articleNumber = 0;
+ _cursor = CURSOR_NONE;
+ _vocabId = 0;
+ _verbId = 0;
+ _active = false;
+}
+
+Hotspot::Hotspot(Common::SeekableReadStream &f, bool isV2) {
+ _bounds.left = f.readSint16LE();
+ _bounds.top = f.readSint16LE();
+ _bounds.right = f.readSint16LE();
+ _bounds.bottom = f.readSint16LE();
+ _feetPos.x = f.readSint16LE();
+ _feetPos.y = f.readSint16LE();
+ _facing = (Facing)f.readByte();
+ _articleNumber = f.readByte();
+ _active = f.readByte() != 0;
+ _cursor = (CursorType)f.readByte();
+ if (isV2) {
+ // This looks to be some sort of bitmask. Perhaps it signifies
+ // the valid verbs for this hotspot
+ f.skip(2); // unknown
+ }
+ _vocabId = f.readUint16LE();
+ _verbId = f.readUint16LE();
+}
+
+/*------------------------------------------------------------------------*/
+
+void Hotspots::activate(int vocabId, bool active) {
+ for (uint idx = 0; idx < size(); ++idx) {
+ Hotspot &hotspot = (*this)[idx];
+ if (hotspot._vocabId == vocabId) {
+ hotspot._active = active;
+ _vm->_game->_screenObjects.setActive(CAT_HOTSPOT, idx, active);
+ }
+ }
+}
+
+} // End of namespace MADS
diff --git a/engines/mads/hotspots.h b/engines/mads/hotspots.h
new file mode 100644
index 0000000000..f9334eace8
--- /dev/null
+++ b/engines/mads/hotspots.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.
+ *
+ */
+
+#ifndef MADS_HOTSPOTS_H
+#define MADS_HOTSPOTS_H
+
+#include "common/scummsys.h"
+#include "mads/events.h"
+#include "mads/player.h"
+
+namespace MADS {
+
+class MADSEngine;
+
+class DynamicHotspot {
+public:
+ bool _active;
+ int _seqIndex;
+ Common::Rect _bounds;
+ Common::Point _feetPos;
+ Facing _facing;
+ int _descId;
+ int _verbId;
+ int _articleNumber;
+ CursorType _cursor;
+
+ /**
+ * Constructor
+ */
+ DynamicHotspot();
+
+ /**
+ * Synchronize the data
+ */
+ void synchronize(Common::Serializer &s);
+};
+
+#define DYNAMIC_HOTSPOTS_SIZE 8
+
+class DynamicHotspots {
+private:
+ MADSEngine *_vm;
+ Common::Array<DynamicHotspot> _entries;
+ int _count;
+public:
+ bool _changed;
+public:
+ DynamicHotspots(MADSEngine *vm);
+
+ Common::Array<MADS::DynamicHotspot>::size_type size() const { return _entries.size(); }
+ DynamicHotspot &operator[](uint idx) { return _entries[idx]; }
+ int add(int descId, int verbId, int seqIndex, const Common::Rect &bounds);
+ int setPosition(int index, const Common::Point &pos, Facing facing);
+ int setCursor(int index, CursorType cursor);
+ void remove(int index);
+ void clear();
+ void reset();
+ void refresh();
+
+ /**
+ * Get an active dynamic hotspot
+ * @param index Active index
+ */
+ DynamicHotspot &get(int index);
+
+ /**
+ * Synchronize the data
+ */
+ void synchronize(Common::Serializer &s);
+};
+
+class Hotspot {
+public:
+ Common::Rect _bounds;
+ Common::Point _feetPos;
+ Facing _facing;
+ int _articleNumber;
+ bool _active;
+ CursorType _cursor;
+ int _vocabId;
+ int _verbId;
+
+ Hotspot();
+ Hotspot(Common::SeekableReadStream &f, bool isV2);
+};
+
+class Hotspots : public Common::Array<Hotspot> {
+private:
+ MADSEngine *_vm;
+public:
+ Hotspots(MADSEngine *vm) : _vm(vm) {}
+
+ /**
+ * Sets the active state of a given hotspot
+ */
+ void activate(int vocabId, bool active);
+};
+
+} // End of namespace MADS
+
+#endif /* MADS_HOTSPOTS_H */
diff --git a/engines/mads/inventory.cpp b/engines/mads/inventory.cpp
new file mode 100644
index 0000000000..ca05575ec5
--- /dev/null
+++ b/engines/mads/inventory.cpp
@@ -0,0 +1,225 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+
+ * You should have received a copy of the GNU General Public 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 "mads/mads.h"
+#include "mads/inventory.h"
+
+namespace MADS {
+
+void InventoryObject::synchronize(Common::Serializer &s) {
+ s.syncAsUint16LE(_descId);
+ s.syncAsUint16LE(_roomNumber);
+ s.syncAsByte(_article);
+ s.syncAsByte(_vocabCount);
+ s.syncAsByte(_qualitiesCount);
+ s.skip(1);
+
+ for (int i = 0; i < MAX_VOCAB; ++i) {
+ s.syncAsUint16LE(_vocabList[i]._vocabId);
+ s.syncAsByte(_vocabList[i]._verbType);
+ s.syncAsByte(_vocabList[i]._prepType);
+ }
+
+ for (int i = 0; i < MAX_QUALITIES; ++i)
+ s.syncAsByte(_qualityId[i]);
+ for (int i = 0; i < MAX_QUALITIES; ++i)
+ s.syncAsSint32LE(_qualityValue[i]);
+}
+
+bool InventoryObject::hasQuality(int qualityId) const {
+ for (int i = 0; i < _qualitiesCount; ++i) {
+ if (_qualityId[i] == qualityId)
+ return true;
+ }
+
+ return false;
+}
+
+void InventoryObject::setQuality(int qualityId, int qualityValue) {
+ for (int i = 0; i < _qualitiesCount; ++i) {
+ if (_qualityId[i] == qualityId) {
+ _qualityValue[i] = qualityValue;
+ }
+ }
+}
+
+int InventoryObject::getQuality(int qualityId) const {
+ for (int i = 0; i < _qualitiesCount; ++i) {
+ if (_qualityId[i] == qualityId) {
+ return _qualityValue[i];
+ }
+ }
+
+ return 0;
+}
+
+/*------------------------------------------------------------------------*/
+
+void InventoryObjects::load() {
+ File f("*OBJECTS.DAT");
+ int count = f.readUint16LE();
+ Common::Serializer s(&f, nullptr);
+
+ // Load the objects data
+ reserve(count);
+ for (int i = 0; i < count; ++i) {
+ InventoryObject obj;
+ obj.synchronize(s);
+ push_back(obj);
+
+ // If it's for the player's inventory, add the index to the inventory list
+ if (obj._roomNumber == PLAYER_INVENTORY) {
+ _inventoryList.push_back(i);
+ assert(_inventoryList.size() <= 32);
+ }
+ }
+}
+
+void InventoryObjects::synchronize(Common::Serializer &s) {
+ int count = size();
+ s.syncAsUint16LE(count);
+
+ if (s.isSaving()) {
+ // Store the data for each object in the inventory lsit
+ for (int idx = 0; idx < count; ++idx)
+ (*this)[idx].synchronize(s);
+
+ // Synchronize the player's inventory
+ _inventoryList.synchronize(s);
+ } else {
+ clear();
+
+ // Read in each object
+ reserve(count);
+ for (int i = 0; i < count; ++i) {
+ InventoryObject obj;
+ obj.synchronize(s);
+ push_back(obj);
+ }
+
+ // Synchronize the player's inventory
+ _inventoryList.synchronize(s);
+ }
+}
+
+void InventoryObjects::setRoom(int objectId, int sceneNumber) {
+ InventoryObject &obj = (*this)[objectId];
+
+ if (obj._roomNumber == PLAYER_INVENTORY)
+ removeFromInventory(objectId, 1);
+
+ if (sceneNumber == PLAYER_INVENTORY)
+ addToInventory(objectId);
+ else
+ obj._roomNumber = sceneNumber;
+}
+
+bool InventoryObjects::isInRoom(int objectId) const {
+ return objectId >= 0 && (*this)[objectId]._roomNumber == _vm->_game->_scene._currentSceneId;
+}
+
+bool InventoryObjects::isInInventory(int objectId) const {
+ return objectId >= 0 && (*this)[objectId]._roomNumber == PLAYER_INVENTORY;
+}
+
+void InventoryObjects::addToInventory(int objectId) {
+ assert(_inventoryList.size() < 32);
+ UserInterface &userInterface = _vm->_game->_scene._userInterface;
+
+ if (!isInInventory(objectId)) {
+ _inventoryList.push_back(objectId);
+ userInterface._selectedInvIndex = _inventoryList.size() - 1;
+ userInterface._inventoryTopIndex = CLIP(userInterface._inventoryTopIndex,
+ 0, userInterface._selectedInvIndex);
+
+ if ((userInterface._inventoryTopIndex + 5) <= (int)_inventoryList.size())
+ userInterface._inventoryTopIndex = _inventoryList.size() - 5;
+ userInterface._inventoryChanged = true;
+
+ (*this)[objectId]._roomNumber = PLAYER_INVENTORY;
+
+ if (_vm->_game->_kernelMode == KERNEL_ACTIVE_CODE &&
+ _vm->_game->_screenObjects._inputMode == kInputBuildingSentences) {
+ userInterface.categoryChanged();
+ userInterface.selectObject(userInterface._selectedInvIndex);
+ }
+ }
+}
+
+void InventoryObjects::removeFromInventory(int objectId, int newScene) {
+ Scene &scene = _vm->_game->_scene;
+ UserInterface &userInterface = scene._userInterface;
+
+ // Scan the inventory list for the object
+ int invIndex = -1;
+ for (int idx = 0; idx < (int)_inventoryList.size() && invIndex == -1; ++idx) {
+ if (_inventoryList[idx] == objectId)
+ invIndex = idx;
+ }
+
+ // If the object isn't in the player's inventory, stop here
+ if (invIndex < 0)
+ return;
+
+ int selectedIndex = userInterface._selectedInvIndex;
+ bool noSelection = selectedIndex < 0;
+
+ if (_vm->_game->_kernelMode == KERNEL_ACTIVE_CODE &&
+ _vm->_game->_screenObjects._inputMode == kInputBuildingSentences)
+ userInterface.selectObject(-1);
+
+ // Remove the item from the inventory list
+ _inventoryList.remove_at(invIndex);
+
+ if (!noSelection) {
+ if (selectedIndex >= invIndex)
+ --selectedIndex;
+ if (selectedIndex < 0 && _inventoryList.size() > 0)
+ selectedIndex = 0;
+ }
+
+ if (invIndex <= userInterface._inventoryTopIndex) {
+ userInterface._inventoryTopIndex = MAX(userInterface._inventoryTopIndex, 0);
+ }
+
+ userInterface._inventoryChanged = true;
+ (*this)[objectId]._roomNumber = newScene;
+
+ if (_vm->_game->_kernelMode == KERNEL_ACTIVE_CODE &&
+ _vm->_game->_screenObjects._inputMode == kInputBuildingSentences) {
+ userInterface.categoryChanged();
+ userInterface.selectObject(selectedIndex);
+ }
+}
+
+int InventoryObjects::getIdFromDesc(int descId) {
+ for (int i = 0; i < (int)size(); ++i) {
+ InventoryObject &obj = (*this)[i];
+ if (obj._descId == descId)
+ return i;
+ }
+
+ return -1;
+}
+
+} // End of namespace MADS
diff --git a/engines/mads/inventory.h b/engines/mads/inventory.h
new file mode 100644
index 0000000000..cf82de59f1
--- /dev/null
+++ b/engines/mads/inventory.h
@@ -0,0 +1,141 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+
+ * You should have received a copy of the GNU General Public 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 MADS_INVENTORY_H
+#define MADS_INVENTORY_H
+
+#include "common/scummsys.h"
+#include "common/array.h"
+#include "common/serializer.h"
+
+namespace MADS {
+
+enum {
+ PLAYER_INVENTORY = 2, NOWHERE = 1
+};
+
+class MADSEngine;
+
+#define MAX_VOCAB 5
+#define MAX_QUALITIES 4
+
+class InventoryObject {
+public:
+ int _descId;
+ int _roomNumber;
+ int _article;
+ int _vocabCount;
+ int _qualitiesCount;
+ int syntax;
+
+ struct {
+ int _vocabId;
+ VerbType _verbType;
+ PrepType _prepType;
+ } _vocabList[MAX_VOCAB];
+
+ int _qualityId[MAX_QUALITIES];
+ int _qualityValue[MAX_QUALITIES];
+
+ /**
+ * Synchronizes the data for a given object
+ */
+ void synchronize(Common::Serializer &s);
+
+ /**
+ * Returns true if the given object has the specified quality
+ */
+ bool hasQuality(int qualityId) const;
+
+ /**
+ * Sets the quality value for a given quality Id
+ */
+ void setQuality(int qualityId, int qualityValue);
+
+ /**
+ * Gets the quality value for a given quality Id
+ */
+ int getQuality(int qualityId) const;
+};
+
+class InventoryObjects : public Common::Array<InventoryObject> {
+private:
+ MADSEngine *_vm;
+
+public:
+ SynchronizedList _inventoryList;
+
+ /**
+ * Constructor
+ */
+ InventoryObjects(MADSEngine *vm) : _vm(vm) {}
+
+ /**
+ * Loads the game's object list
+ */
+ void load();
+
+ /**
+ * Synchronize the objects list in a savegame
+ */
+ void synchronize(Common::Serializer &s);
+
+ /**
+ * Returns the inventory item from the player's inventory
+ */
+ InventoryObject &getItem(int itemIndex) {
+ return (*this)[_inventoryList[itemIndex]];
+ }
+
+ /**
+ * Sets an item's scene number
+ */
+ void setRoom(int objectId, int sceneNumber);
+
+ /**
+ * Returns true if a given object is in the player's current scene
+ */
+ bool isInRoom(int objectId) const;
+
+ /**
+ * Returns true if a given object is in the player's inventory
+ */
+ bool isInInventory(int objectId) const;
+
+ /**
+ * Removes the specified object from the player's inventory
+ */
+ void addToInventory(int objectId);
+
+ /**
+ * Removes the specified object to the player's inventory
+ * @param objectId Object to remove
+ * @param newScene Specifies the new scene to set the item to
+ */
+ void removeFromInventory(int objectId, int newScene);
+
+ int getIdFromDesc(int objectId);
+};
+
+} // End of namespace MADS
+
+#endif /* MADS_INVENTORY_H */
diff --git a/engines/mads/mads.cpp b/engines/mads/mads.cpp
new file mode 100644
index 0000000000..59eec40bcc
--- /dev/null
+++ b/engines/mads/mads.cpp
@@ -0,0 +1,158 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+
+ * You should have received a copy of the GNU General Public 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-channels.h"
+#include "common/events.h"
+#include "engines/util.h"
+#include "mads/mads.h"
+#include "mads/game.h"
+#include "mads/screen.h"
+#include "mads/msurface.h"
+#include "mads/resources.h"
+#include "mads/sound.h"
+#include "mads/sprites.h"
+
+namespace MADS {
+
+MADSEngine::MADSEngine(OSystem *syst, const MADSGameDescription *gameDesc) :
+ _gameDescription(gameDesc), Engine(syst), _randomSource("MADS") {
+
+ // Initialize fields
+ _easyMouse = true;
+ _invObjectsAnimated = true;
+ _textWindowStill = false;
+ _screenFade = SCREEN_FADE_SMOOTH;
+ _musicFlag = true;
+ _dithering = false;
+
+ _debugger = nullptr;
+ _dialogs = nullptr;
+ _events = nullptr;
+ _font = nullptr;
+ _game = nullptr;
+ _palette = nullptr;
+ _resources = nullptr;
+ _sound = nullptr;
+ _audio = nullptr;
+}
+
+MADSEngine::~MADSEngine() {
+ delete _debugger;
+ delete _dialogs;
+ delete _events;
+ delete _font;
+ Font::deinit();
+ delete _game;
+ delete _palette;
+ delete _resources;
+ delete _sound;
+ delete _audio;
+}
+
+void MADSEngine::initialize() {
+ // Set up debug channels
+ DebugMan.addDebugChannel(kDebugPath, "Path", "Pathfinding debug level");
+ DebugMan.addDebugChannel(kDebugScripts, "scripts", "Game scripts");
+ DebugMan.addDebugChannel(kDebugGraphics, "graphics", "Graphics handling");
+
+ // Initial sub-system engine references
+ MSurface::setVm(this);
+ MSprite::setVm(this);
+
+ Resources::init(this);
+ Conversation::init(this);
+ _debugger = new Debugger(this);
+ _dialogs = Dialogs::init(this);
+ _events = new EventsManager(this);
+ _palette = new Palette(this);
+ Font::init(this);
+ _font = new Font();
+ _screen.init();
+ _sound = new SoundManager(this, _mixer);
+ _audio = new AudioPlayer(_mixer, getGameID());
+ _game = Game::init(this);
+
+ _screen.empty();
+}
+
+Common::Error MADSEngine::run() {
+ initGraphics(MADS_SCREEN_WIDTH, MADS_SCREEN_HEIGHT, false);
+ initialize();
+
+ // Run the game
+ _game->run();
+
+ // Dummy loop to keep application active
+ _events->delay(9999);
+
+ return Common::kNoError;
+}
+
+int MADSEngine::getRandomNumber(int maxNumber) {
+ return _randomSource.getRandomNumber(maxNumber);
+}
+
+int MADSEngine::getRandomNumber(int minNumber, int maxNumber) {
+ int range = maxNumber - minNumber;
+
+ return minNumber + _randomSource.getRandomNumber(range);
+}
+
+int MADSEngine::hypotenuse(int xv, int yv) {
+ return (int)sqrt((double)(xv * xv + yv * yv));
+}
+
+bool MADSEngine::canLoadGameStateCurrently() {
+ return !_game->_winStatus && !_game->globals()[5]
+ && _dialogs->_pendingDialog == DIALOG_NONE
+ && _events->_cursorId != CURSOR_WAIT;
+}
+
+bool MADSEngine::canSaveGameStateCurrently() {
+ return !_game->_winStatus && !_game->globals()[5]
+ && _dialogs->_pendingDialog == DIALOG_NONE
+ && _events->_cursorId != CURSOR_WAIT;
+}
+
+/**
+* Support method that generates a savegame name
+* @param slot Slot number
+*/
+Common::String MADSEngine::generateSaveName(int slot) {
+ return Common::String::format("%s.%03d", _targetName.c_str(), slot);
+}
+
+Common::Error MADSEngine::loadGameState(int slot) {
+ _game->_loadGameSlot = slot;
+ _game->_scene._currentSceneId = -1;
+ _game->_currentSectionNumber = -1;
+ return Common::kNoError;
+}
+
+Common::Error MADSEngine::saveGameState(int slot, const Common::String &desc) {
+ _game->saveGame(slot, desc);
+ return Common::kNoError;
+}
+
+} // End of namespace MADS
diff --git a/engines/mads/mads.h b/engines/mads/mads.h
new file mode 100644
index 0000000000..9a8f2152a1
--- /dev/null
+++ b/engines/mads/mads.h
@@ -0,0 +1,152 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+
+ * You should have received a copy of the GNU General Public 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 MADS_MADS_H
+#define MADS_MADS_H
+
+#include "common/scummsys.h"
+#include "common/system.h"
+#include "common/error.h"
+#include "common/random.h"
+#include "common/util.h"
+#include "engines/engine.h"
+#include "graphics/surface.h"
+#include "mads/debugger.h"
+#include "mads/dialogs.h"
+#include "mads/events.h"
+#include "mads/font.h"
+#include "mads/game.h"
+#include "mads/screen.h"
+#include "mads/msurface.h"
+#include "mads/resources.h"
+#include "mads/sound.h"
+
+/**
+ * This is the namespace of the MADS engine.
+ *
+ * Status of this engine: In Development
+ *
+ * Games using this engine:
+ * - Rex Nebular and the Cosmic Gender Bender
+ */
+namespace MADS {
+
+#define DEBUG_BASIC 1
+#define DEBUG_INTERMEDIATE 2
+#define DEBUG_DETAILED 3
+
+enum MADSDebugChannels {
+ kDebugPath = 1 << 0,
+ kDebugScripts = 1 << 1,
+ kDebugGraphics = 1 << 2
+};
+
+enum {
+ GType_RexNebular = 0,
+ GType_Dragonsphere = 1,
+ GType_Phantom = 2
+};
+
+enum ScreenFade {
+ SCREEN_FADE_SMOOTH = 0,
+ SCREEN_FADE_MEDIUM = 1,
+ SCREEN_FADE_FAST = 2
+};
+
+struct MADSGameDescription;
+
+
+class MADSEngine : public Engine {
+private:
+ const MADSGameDescription *_gameDescription;
+ Common::RandomSource _randomSource;
+
+ /**
+ * Handles basic initialisation
+ */
+ void initialize();
+protected:
+ // Engine APIs
+ virtual Common::Error run();
+ virtual bool hasFeature(EngineFeature f) const;
+public:
+ Debugger *_debugger;
+ Dialogs *_dialogs;
+ EventsManager *_events;
+ Font *_font;
+ Game *_game;
+ Palette *_palette;
+ Resources *_resources;
+ ScreenSurface _screen;
+ SoundManager *_sound;
+ AudioPlayer *_audio;
+ bool _easyMouse;
+ bool _invObjectsAnimated;
+ bool _textWindowStill;
+ ScreenFade _screenFade;
+ bool _musicFlag;
+ bool _dithering;
+public:
+ MADSEngine(OSystem *syst, const MADSGameDescription *gameDesc);
+ virtual ~MADSEngine();
+
+ uint32 getFeatures() const;
+ Common::Language getLanguage() const;
+ Common::Platform getPlatform() const;
+ uint16 getVersion() const;
+ uint32 getGameID() const;
+ uint32 getGameFeatures() const;
+
+ int getRandomNumber(int maxNumber);
+ int getRandomNumber(int minNumber, int maxNumber);
+ int hypotenuse(int xv, int yv);
+
+ /**
+ * Returns true if it is currently okay to restore a game
+ */
+ bool canLoadGameStateCurrently();
+
+ /**
+ * Returns true if it is currently okay to save the game
+ */
+ bool canSaveGameStateCurrently();
+
+ /**
+ * Support method that generates a savegame name
+ * @param slot Slot number
+ */
+ Common::String generateSaveName(int slot);
+
+ /**
+ * Handles loading a game via the GMM
+ */
+ virtual Common::Error loadGameState(int slot);
+
+ /**
+ * Handles saving the game via the GMM
+ */
+ virtual Common::Error saveGameState(int slot, const Common::String &desc);
+};
+
+} // End of namespace MADS
+
+#endif /* MADS_MADS_H */
diff --git a/engines/mads/messages.cpp b/engines/mads/messages.cpp
new file mode 100644
index 0000000000..9b2d6f3114
--- /dev/null
+++ b/engines/mads/messages.cpp
@@ -0,0 +1,570 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+
+ * You should have received a copy of the GNU General Public 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 "mads/mads.h"
+#include "mads/font.h"
+#include "mads/screen.h"
+#include "mads/messages.h"
+#include "mads/scene_data.h"
+
+namespace MADS {
+
+RandomMessages::RandomMessages() {
+ reserve(RANDOM_MESSAGE_SIZE);
+ _randomSpacing = 0;
+ _color = -1;
+ _duration = 0;
+ _scrollRate = -1;
+}
+
+void RandomMessages::reset() {
+ for (uint i = 0; i < size(); ++i) {
+ (*this)[i]._handle = -1;
+ (*this)[i]._quoteId = -1;
+ }
+}
+
+
+KernelMessages::KernelMessages(MADSEngine *vm)
+ : _vm(vm) {
+ for (int i = 0; i < KERNEL_MESSAGES_SIZE; ++i) {
+ KernelMessage rec;
+ _entries.push_back(rec);
+ }
+
+ _talkFont = _vm->_font->getFont(FONT_CONVERSATION);
+}
+
+KernelMessages::~KernelMessages() {
+}
+
+void KernelMessages::clear() {
+ Scene &scene = _vm->_game->_scene;
+
+ for (uint i = 0; i < _entries.size(); ++i)
+ _entries[i]._flags = 0;
+
+ _talkFont = _vm->_font->getFont(FONT_CONVERSATION);
+ scene._textSpacing = -1;
+}
+
+int KernelMessages::add(const Common::Point &pt, uint fontColor, uint8 flags,
+ uint8 abortTimers, uint32 timeout, const Common::String &msg) {
+ Scene &scene = _vm->_game->_scene;
+
+ // Find a free slot
+ uint idx = 0;
+ while ((idx < _entries.size()) && ((_entries[idx]._flags & KMSG_ACTIVE) != 0))
+ ++idx;
+ if (idx == _entries.size()) {
+ if (abortTimers == 0)
+ return -1;
+
+ error("KernelMessages overflow");
+ }
+
+ KernelMessage &rec = _entries[idx];
+ rec._msg = msg;
+ rec._flags = flags | KMSG_ACTIVE;
+ rec._color1 = fontColor & 0xff;
+ rec._color2 = fontColor >> 8;
+ rec._position = pt;
+ rec._textDisplayIndex = -1;
+ rec._timeout = timeout;
+ rec._frameTimer = _vm->_game->_priorFrameTimer;
+ rec._trigger = abortTimers;
+ rec._abortMode = _vm->_game->_triggerSetupMode;
+
+ rec._actionDetails = scene._action._activeAction;
+
+ if (flags & KMSG_PLAYER_TIMEOUT)
+ rec._frameTimer = _vm->_game->_player._ticksAmount +
+ _vm->_game->_player._priorTimer;
+
+ return idx;
+}
+
+int KernelMessages::addQuote(int quoteId, int abortTimers, uint32 timeout) {
+ Common::String quoteStr = _vm->_game->getQuote(quoteId);
+ return add(Common::Point(), 0x1110, KMSG_PLAYER_TIMEOUT | KMSG_CENTER_ALIGN,
+ abortTimers, timeout, quoteStr);
+}
+
+void KernelMessages::scrollMessage(int msgIndex, int numTicks, bool quoted) {
+ if (msgIndex < 0)
+ return;
+
+ _entries[msgIndex]._flags |= quoted ? (KMSG_SCROLL | KMSG_QUOTED) : KMSG_SCROLL;
+ _entries[msgIndex]._msgOffset = 0;
+ _entries[msgIndex]._numTicks = numTicks;
+ _entries[msgIndex]._frameTimer2 = _vm->_game->_priorFrameTimer;
+
+ Common::String msg = _entries[msgIndex]._msg;
+
+ if (_entries[msgIndex]._flags & KMSG_PLAYER_TIMEOUT)
+ _entries[msgIndex]._frameTimer2 = _vm->_game->_player._ticksAmount +
+ _vm->_game->_player._priorTimer;
+
+ _entries[msgIndex]._frameTimer = _entries[msgIndex]._frameTimer2;
+}
+
+void KernelMessages::setSeqIndex(int msgIndex, int seqIndex) {
+ if (msgIndex >= 0) {
+ _entries[msgIndex]._flags |= KMSG_SEQ_ENTRY;
+ _entries[msgIndex]._sequenceIndex = seqIndex;
+ }
+}
+
+void KernelMessages::remove(int msgIndex) {
+ KernelMessage &rec = _entries[msgIndex];
+ Scene &scene = _vm->_game->_scene;
+
+ if (rec._flags & KMSG_ACTIVE) {
+ if (rec._flags & KMSG_SCROLL) {
+ // WORKAROUND: Code here no longer needed in ScummVM
+ }
+
+ if (rec._textDisplayIndex >= 0)
+ scene._textDisplay.expire(rec._textDisplayIndex);
+
+ rec._flags &= ~KMSG_ACTIVE;
+ }
+}
+
+void KernelMessages::reset() {
+ for (uint i = 0; i < _entries.size(); ++i)
+ remove(i);
+
+ _randomMessages.clear();
+}
+
+void KernelMessages::update() {
+ uint32 currentTimer = _vm->_game->_scene._frameStartTime;
+
+ for (uint i = 0; i < _entries.size() && !_vm->_game->_trigger; ++i) {
+ KernelMessage &msg = _entries[i];
+
+ if (((msg._flags & KMSG_ACTIVE) != 0) && (currentTimer >= msg._frameTimer))
+ processText(i);
+ }
+}
+
+void KernelMessages::processText(int msgIndex) {
+ Scene &scene = _vm->_game->_scene;
+ KernelMessage &msg = _entries[msgIndex];
+ uint32 currentTimer = _vm->_game->_priorFrameTimer;
+ bool flag = false;
+
+ if ((msg._flags & KMSG_EXPIRE) != 0) {
+ scene._textDisplay.expire(msg._textDisplayIndex);
+ msg._flags &= ~KMSG_ACTIVE;
+ return;
+ }
+
+ if ((msg._flags & KMSG_SCROLL) == 0) {
+ msg._timeout -= 3;
+ }
+
+ if (msg._flags & KMSG_SEQ_ENTRY) {
+ SequenceEntry &seqEntry = scene._sequences[msg._sequenceIndex];
+ if (seqEntry._doneFlag || !seqEntry._active)
+ msg._timeout = 0;
+ }
+
+ if ((msg._timeout <= 0) && (_vm->_game->_trigger == 0)) {
+ msg._flags |= KMSG_EXPIRE;
+ if (msg._trigger != 0) {
+ _vm->_game->_trigger = msg._trigger;
+ _vm->_game->_triggerMode = msg._abortMode;
+
+ if (_vm->_game->_triggerMode != SEQUENCE_TRIGGER_DAEMON) {
+ scene._action._activeAction = msg._actionDetails;
+ }
+ }
+ }
+
+ msg._frameTimer = currentTimer + 3;
+ int x1 = 0, y1 = 0;
+
+ if (msg._flags & KMSG_SEQ_ENTRY) {
+ SequenceEntry &seqEntry = scene._sequences[msg._sequenceIndex];
+ if (!seqEntry._nonFixed) {
+ SpriteAsset &spriteSet = *scene._sprites[seqEntry._spritesIndex];
+ MSprite *frame = spriteSet.getFrame(seqEntry._frameIndex - 1);
+ x1 = frame->getBounds().left;
+ y1 = frame->getBounds().top;
+ } else {
+ x1 = seqEntry._position.x;
+ y1 = seqEntry._position.y;
+ }
+ }
+
+ Player &player = _vm->_game->_player;
+ if (msg._flags & KMSG_PLAYER_TIMEOUT) {
+ if (player._beenVisible) {
+ SpriteAsset &asset = *_vm->_game->_scene._sprites[player._spritesStart + player._spritesIdx];
+ MSprite *frame = asset.getFrame(player._frameNumber - 1);
+
+ int yAmount = player._currentScale * player._centerOfGravity / 100;
+ x1 = player._playerPos.x;
+ y1 = (frame->h * player._currentScale / -100) + yAmount +
+ player._playerPos.y - 15;
+ } else {
+ x1 = 160;
+ y1 = 78;
+ }
+ }
+
+ x1 += msg._position.x;
+ y1 += msg._position.y;
+
+ Common::String displayMsg = msg._msg;
+
+ if ((msg._flags & KMSG_SCROLL) && (msg._frameTimer >= currentTimer)) {
+ ++msg._msgOffset;
+
+ if (msg._msgOffset >= msg._msg.size()) {
+ // End of message
+ msg._flags &= ~KMSG_SCROLL;
+ } else {
+ displayMsg = Common::String(msg._msg.c_str(), msg._msg.c_str() + msg._msgOffset);
+ }
+
+ msg._frameTimer = msg._frameTimer2 = currentTimer + msg._numTicks;
+ flag = true;
+ }
+
+ int strWidth = _talkFont->getWidth(displayMsg, scene._textSpacing);
+
+ if (msg._flags & (KMSG_RIGHT_ALIGN | KMSG_CENTER_ALIGN)) {
+ x1 -= (msg._flags & KMSG_CENTER_ALIGN) ? strWidth / 2 : strWidth;
+ }
+
+ // Make sure text appears entirely on-screen
+ int x2 = x1 + strWidth;
+ if (x2 > MADS_SCREEN_WIDTH)
+ x1 -= x2 - MADS_SCREEN_WIDTH;
+ if (x1 > (MADS_SCREEN_WIDTH - 1))
+ x1 = MADS_SCREEN_WIDTH - 1;
+ if (x1 < 0)
+ x1 = 0;
+
+ if (y1 >(MADS_SCENE_HEIGHT - 1))
+ y1 = MADS_SCENE_HEIGHT - 1;
+ if (y1 < 0)
+ y1 = 0;
+
+ if (msg._textDisplayIndex >= 0) {
+ TextDisplay &textEntry = scene._textDisplay[msg._textDisplayIndex];
+
+ if (flag || (textEntry._bounds.left != x1) || (textEntry._bounds.top != y1)) {
+ // Mark the associated text entry as deleted, so it can be re-created
+ scene._textDisplay.expire(msg._textDisplayIndex);
+ msg._textDisplayIndex = -1;
+ }
+ }
+
+ if (msg._textDisplayIndex < 0) {
+ // Need to create a new text display entry for this message
+ int idx = scene._textDisplay.add(x1, y1, msg._color1 | (msg._color2 << 8),
+ scene._textSpacing, displayMsg, _talkFont);
+ if (idx >= 0)
+ msg._textDisplayIndex = idx;
+ }
+}
+
+void KernelMessages::delay(uint32 priorFrameTime, uint32 currentTime) {
+ for (uint i = 0; i < _entries.size(); ++i) {
+ _entries[i]._timeout += currentTime - priorFrameTime;
+ }
+}
+
+void KernelMessages::setQuoted(int msgIndex, int numTicks, bool quoted) {
+ if (msgIndex >= 0) {
+ KernelMessage &msg = _entries[msgIndex];
+
+ msg._flags |= KMSG_SCROLL;
+ if (quoted)
+ msg._flags |= KMSG_QUOTED;
+
+ msg._msgOffset = 0;
+ msg._numTicks = numTicks;
+ msg._frameTimer2 = _vm->_game->_scene._frameStartTime;
+
+ if (msg._flags & KMSG_PLAYER_TIMEOUT) {
+ msg._frameTimer2 = _vm->_game->_player._priorTimer +
+ _vm->_game->_player._ticksAmount;
+ }
+
+ msg._frameTimer = msg._frameTimer2;
+ }
+}
+
+#define RANDOM_MESSAGE_TRIGGER 240
+
+void KernelMessages::randomServer() {
+ if ((_vm->_game->_trigger >= RANDOM_MESSAGE_TRIGGER) &&
+ (_vm->_game->_trigger < (RANDOM_MESSAGE_TRIGGER + (int)_randomMessages.size()))) {
+ _randomMessages[_vm->_game->_trigger - RANDOM_MESSAGE_TRIGGER]._handle = -1;
+ _randomMessages[_vm->_game->_trigger - RANDOM_MESSAGE_TRIGGER]._quoteId = -1;
+ }
+}
+
+int KernelMessages::checkRandom() {
+ int total = 0;
+
+ for (uint i = 0; i < _randomMessages.size(); ++i) {
+ if (_randomMessages[i]._handle >= 0)
+ ++total;
+ }
+
+ return total;
+}
+
+bool KernelMessages::generateRandom(int major, int minor) {
+ bool generatedMessage = false;
+
+ // Scan through the random messages array
+ for (uint msgCtr = 0; msgCtr < _randomMessages.size(); msgCtr++) {
+ // Find currently active random messages
+ if (_randomMessages[msgCtr]._handle < 0) {
+ // Check whether there's any existing 'scrolling in' message
+ bool bad = false;
+ for (uint scanCtr = 0; scanCtr < _randomMessages.size(); ++scanCtr) {
+ if (_randomMessages[scanCtr]._handle >= 0) {
+ if (_entries[_randomMessages[scanCtr]._handle]._flags & KMSG_SCROLL) {
+ bad = true;
+ break;
+ }
+ }
+ }
+
+ // Do a random check for a new message to appear
+ if (_vm->getRandomNumber(major) <= minor && !bad) {
+ int quoteId;
+
+ // Pick a random quote to display from the available list
+ do {
+ int quoteIdx = _vm->getRandomNumber(_randomQuotes.size() - 1);
+ quoteId = _randomQuotes[quoteIdx];
+
+ // Ensure the quote isn't already in use
+ bad = false;
+ for (uint scanCtr = 0; scanCtr < _randomMessages.size(); ++scanCtr) {
+ if (quoteId == _randomMessages[scanCtr]._quoteId) {
+ bad = true;
+ break;
+ }
+ }
+ } while (bad);
+
+ // Store the quote Id to be used
+ _randomMessages[msgCtr]._quoteId = quoteId;
+
+ // Position the message at a random position
+ Common::Point textPos;
+ textPos.x = _vm->getRandomNumber(_randomMessages._bounds.left,
+ _randomMessages._bounds.right);
+
+ // Figure out Y position, making sure not to be overlapping with
+ // any other on-screen message
+ int abortCounter = 0;
+
+ do {
+ // Ensure we don't get stuck in an infinite loop if too many messages
+ // are alrady on-screen
+ if (abortCounter++ > 100) goto done;
+ bad = false;
+
+ // Set potential new Y position
+ textPos.y = _vm->getRandomNumber(_randomMessages._bounds.top,
+ _randomMessages._bounds.bottom);
+
+ // Ensure it doesn't overlap an existing on-screen message
+ for (uint msgCtr2 = 0; msgCtr2 < _randomMessages.size(); ++msgCtr2) {
+ if (_randomMessages[msgCtr2]._handle >= 0) {
+ int lastY = _entries[_randomMessages[msgCtr2]._handle]._position.y;
+
+ if ((textPos.y >= (lastY - _randomMessages._randomSpacing)) &&
+ (textPos.y <= (lastY + _randomMessages._randomSpacing))) {
+ bad = true;
+ }
+ }
+ }
+ } while (bad);
+
+ // Add the message
+ _randomMessages[msgCtr]._handle = add(textPos, _randomMessages._color, 0,
+ RANDOM_MESSAGE_TRIGGER + msgCtr, _randomMessages._duration,
+ _vm->_game->getQuote(_randomMessages[msgCtr]._quoteId));
+
+ if (_randomMessages._scrollRate > 0) {
+ if (_randomMessages[msgCtr]._handle >= 0) {
+ setQuoted(_randomMessages[msgCtr]._handle,
+ _randomMessages._scrollRate, true);
+ }
+ }
+
+ generatedMessage = true;
+ break;
+ }
+ }
+ }
+
+done:
+ return generatedMessage;
+}
+
+void KernelMessages::initRandomMessages(int maxSimultaneousMessages,
+ const Common::Rect &bounds, int minYSpacing, int scrollRate,
+ int color, int duration, int quoteId, ...) {
+ // Reset the random messages list
+ _randomMessages.clear();
+ _randomMessages.resize(maxSimultaneousMessages);
+
+ // Store passed parameters
+ _randomMessages._bounds = bounds;
+ _randomMessages._randomSpacing = minYSpacing;
+ _randomMessages._scrollRate = scrollRate;
+ _randomMessages._color = color;
+ _randomMessages._duration = duration;
+
+ // Store the variable length random quote list
+ va_list va;
+ va_start(va, quoteId);
+ _randomQuotes.clear();
+
+ while (quoteId > 0) {
+ _randomQuotes.push_back(quoteId);
+ assert(_randomQuotes.size() < 100);
+ quoteId = va_arg(va, int);
+ }
+
+ va_end(va);
+}
+
+
+/*------------------------------------------------------------------------*/
+
+TextDisplay::TextDisplay() {
+ _active = false;
+ _expire = 0;
+ _spacing = 0;
+ _color1 = 0;
+ _color2 = 0;
+ _font = nullptr;
+}
+
+/*------------------------------------------------------------------------*/
+
+TextDisplayList::TextDisplayList(MADSEngine *vm) : _vm(vm) {
+ for (int i = 0; i < TEXT_DISPLAY_SIZE; ++i) {
+ TextDisplay rec;
+ rec._active = false;
+ rec._expire = 0;
+ push_back(rec);
+ }
+}
+
+void TextDisplayList::reset() {
+ for (int i = 0; i < TEXT_DISPLAY_SIZE; ++i)
+ (*this)[i]._active = false;
+}
+
+int TextDisplayList::add(int xp, int yp, uint fontColor, int charSpacing,
+ const Common::String &msg, Font *font) {
+ int usedSlot = -1;
+
+ for (int idx = 0; idx < TEXT_DISPLAY_SIZE; ++idx) {
+ TextDisplay &td = (*this)[idx];
+ if (!td._active) {
+ usedSlot = idx;
+
+ td._bounds.left = xp;
+ td._bounds.top = yp;
+ td._font = font;
+ td._msg = msg;
+ td._bounds.setWidth(font->getWidth(msg, charSpacing));
+ td._bounds.setHeight(font->getHeight());
+ td._color1 = fontColor & 0xff;
+ td._color2 = fontColor >> 8;
+ td._spacing = charSpacing;
+ td._expire = 1;
+ td._active = true;
+ break;
+ }
+ }
+
+ return usedSlot;
+}
+
+void TextDisplayList::setDirtyAreas() {
+ Scene &scene = _vm->_game->_scene;
+
+ for (uint idx = 0, dirtyIdx = SPRITE_SLOTS_MAX_SIZE; dirtyIdx < size(); ++idx, ++dirtyIdx) {
+ if (((*this)[idx]._expire >= 0) || !(*this)[idx]._active) {
+ scene._dirtyAreas[dirtyIdx]._active = false;
+ } else {
+ scene._dirtyAreas[dirtyIdx]._textActive = true;
+ scene._dirtyAreas[dirtyIdx].setTextDisplay(&(*this)[idx]);
+ }
+ }
+}
+
+void TextDisplayList::setDirtyAreas2() {
+ Scene &scene = _vm->_game->_scene;
+
+ for (uint idx = 0, dirtyIdx = SPRITE_SLOTS_MAX_SIZE; idx < size(); ++idx, ++dirtyIdx) {
+ if ((*this)[idx]._active && ((*this)[idx]._expire >= 0)) {
+ scene._dirtyAreas[dirtyIdx].setTextDisplay(&(*this)[idx]);
+ scene._dirtyAreas[dirtyIdx]._textActive = ((*this)[idx]._expire <= 0) ? 0 : 1;
+ }
+ }
+}
+
+void TextDisplayList::draw(MSurface *s) {
+ for (uint idx = 0; idx < size(); ++idx) {
+ TextDisplay &td = (*this)[idx];
+ if (td._active && (td._expire >= 0)) {
+ td._font->setColors(0xFF, td._color1, td._color2, 0);
+ td._font->writeString(s, td._msg,
+ Common::Point(td._bounds.left, td._bounds.top),
+ td._spacing, td._bounds.width());
+ }
+ }
+}
+
+void TextDisplayList::cleanUp() {
+ for (uint idx = 0; idx < size(); ++idx) {
+ if ((*this)[idx]._expire < 0) {
+ (*this)[idx]._active = false;
+ (*this)[idx]._expire = 0;
+ }
+ }
+}
+
+void TextDisplayList::expire(int idx) {
+ (*this)[idx]._expire = -1;
+}
+
+} // End of namespace MADS
diff --git a/engines/mads/messages.h b/engines/mads/messages.h
new file mode 100644
index 0000000000..a7411d98d1
--- /dev/null
+++ b/engines/mads/messages.h
@@ -0,0 +1,192 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+
+ * You should have received a copy of the GNU General Public 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 MADS_MESSAGES_H
+#define MADS_MESSAGES_H
+
+#include "common/scummsys.h"
+#include "common/array.h"
+#include "mads/action.h"
+#include "mads/font.h"
+#include "mads/msurface.h"
+
+namespace MADS {
+
+#define KERNEL_MESSAGES_SIZE 10
+#define INDEFINITE_TIMEOUT 9999999
+#define TEXT_DISPLAY_SIZE 40
+#define RANDOM_MESSAGE_SIZE 4
+
+enum KernelMessageFlags {
+ KMSG_QUOTED = 1, KMSG_PLAYER_TIMEOUT = 2, KMSG_SEQ_ENTRY = 4, KMSG_SCROLL = 8,
+ KMSG_RIGHT_ALIGN = 0x10, KMSG_CENTER_ALIGN = 0x20, KMSG_EXPIRE = 0x40,
+ KMSG_ACTIVE = 0x80
+};
+
+class MADSEngine;
+
+class KernelMessage {
+public:
+ uint8 _flags;
+ int _sequenceIndex;
+ int _color1;
+ int _color2;
+ Common::Point _position;
+ int _textDisplayIndex;
+ uint32 _msgOffset;
+ int _numTicks;
+ uint32 _frameTimer2;
+ uint32 _frameTimer;
+ int32 _timeout;
+ int _trigger;
+ TriggerMode _abortMode;
+ ActionDetails _actionDetails;
+ Common::String _msg;
+
+ KernelMessage();
+};
+
+struct RandomEntry {
+ int _handle;
+ int _quoteId;
+
+ RandomEntry() { _handle = _quoteId = -1; }
+};
+
+class RandomMessages : public Common::Array<RandomEntry> {
+public:
+ Common::Rect _bounds;
+ int _randomSpacing;
+ int _color;
+ int _duration;
+ int _scrollRate;
+public:
+ RandomMessages();
+
+ void reset();
+};
+
+class KernelMessages {
+private:
+ MADSEngine *_vm;
+
+ Common::Array<int> _randomQuotes;
+ RandomMessages _randomMessages;
+public:
+ Common::Array<KernelMessage> _entries;
+ Font *_talkFont;
+public:
+ KernelMessages(MADSEngine *vm);
+ ~KernelMessages();
+
+ void clear();
+ int add(const Common::Point &pt, uint fontColor, uint8 flags, uint8 abortTimers,
+ uint32 timeout, const Common::String &msg);
+ int addQuote(int quoteId, int abortTimers, uint32 timeout);
+ void scrollMessage(int msgIndex, int numTicks, bool quoted);
+ void setSeqIndex(int msgIndex, int seqIndex);
+ void remove(int msgIndex);
+ void reset();
+ void update();
+ void processText(int msgIndex);
+ void delay(uint32 priorFrameTime, uint32 currentTime);
+ void setQuoted(int msgIndex, int numTicks, bool quoted);
+
+ void initRandomMessages(int maxSimultaneousMessages,
+ const Common::Rect &bounds, int minYSpacing, int scrollRate,
+ int color, int duration, int quoteId, ...);
+
+ /**
+ * Handles expiring any active random messages as necessary
+ */
+ void randomServer();
+
+ /**
+ * Return the number of currently active random messages
+ */
+ int checkRandom();
+
+ /**
+ * Handles generating new random messages
+ */
+ bool generateRandom(int major, int minor);
+};
+
+class TextDisplay {
+public:
+ bool _active;
+ int _expire;
+ int _spacing;
+ Common::Rect _bounds;
+ uint8 _color1;
+ uint8 _color2;
+ Font *_font;
+ Common::String _msg;
+
+ TextDisplay();
+};
+
+#define TEXT_DISPLAY_SIZE 40
+
+class TextDisplayList : public Common::Array<TextDisplay> {
+private:
+ MADSEngine *_vm;
+public:
+ TextDisplayList(MADSEngine *vm);
+
+ /**
+ * Expire a given text display entry
+ */
+ void expire(int idx);
+
+ int add(int xp, int yp, uint fontColor, int charSpacing, const Common::String &, Font *font);
+
+ /**
+ * Reset all of the text display entries in the list to inactive
+ */
+ void reset();
+
+ /**
+ * Draw any text in the list to the specified surface
+ * @param surface Surface
+ */
+ void draw(MSurface *s);
+
+ /**
+ * Determine dirty areas for active text areas
+ */
+ void setDirtyAreas();
+
+ /**
+ * Secondary setup dirty areas for the text areas
+ */
+ void setDirtyAreas2();
+
+ /**
+ * Deactivates any text display entries that are finished
+ */
+ void cleanUp();
+};
+
+} // End of namespace MADS
+
+#endif /* MADS_MESSAGES_H */
diff --git a/engines/mads/module.mk b/engines/mads/module.mk
new file mode 100644
index 0000000000..61e810e215
--- /dev/null
+++ b/engines/mads/module.mk
@@ -0,0 +1,58 @@
+MODULE := engines/mads
+
+MODULE_OBJS := \
+ dragonsphere/game_dragonsphere.o \
+ dragonsphere/dragonsphere_scenes.o \
+ phantom/game_phantom.o \
+ phantom/phantom_scenes.o \
+ nebular/dialogs_nebular.o \
+ nebular/game_nebular.o \
+ nebular/globals_nebular.o \
+ nebular/sound_nebular.o \
+ nebular/nebular_scenes.o \
+ nebular/nebular_scenes1.o \
+ nebular/nebular_scenes2.o \
+ nebular/nebular_scenes3.o \
+ nebular/nebular_scenes4.o \
+ nebular/nebular_scenes5.o \
+ nebular/nebular_scenes6.o \
+ nebular/nebular_scenes7.o \
+ nebular/nebular_scenes8.o \
+ action.o \
+ animation.o \
+ assets.o \
+ audio.o \
+ compression.o \
+ debugger.o \
+ detection.o \
+ dialogs.o \
+ events.o \
+ font.o \
+ game.o \
+ game_data.o \
+ globals.o \
+ hotspots.o \
+ inventory.o \
+ mads.o \
+ messages.o \
+ msurface.o \
+ palette.o \
+ player.o \
+ rails.o \
+ resources.o \
+ scene.o \
+ scene_data.o \
+ screen.o \
+ sequence.o \
+ sound.o \
+ sprites.o \
+ staticres.o \
+ user_interface.o
+
+# This module can be built as a plugin
+ifeq ($(ENABLE_MADS), DYNAMIC_PLUGIN)
+PLUGIN := 1
+endif
+
+# Include common rules
+include $(srcdir)/rules.mk
diff --git a/engines/mads/msurface.cpp b/engines/mads/msurface.cpp
new file mode 100644
index 0000000000..18a9a4f547
--- /dev/null
+++ b/engines/mads/msurface.cpp
@@ -0,0 +1,556 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ */
+
+#include "engines/util.h"
+#include "mads/compression.h"
+#include "mads/screen.h"
+#include "mads/mads.h"
+#include "mads/msurface.h"
+#include "mads/resources.h"
+#include "mads/sprites.h"
+
+namespace MADS {
+
+MADSEngine *MSurface::_vm = nullptr;
+
+MSurface::MSurface() {
+ pixels = nullptr;
+ _freeFlag = false;
+}
+
+MSurface::MSurface(int width, int height) {
+ pixels = nullptr;
+ _freeFlag = false;
+ setSize(width, height);
+}
+
+MSurface::~MSurface() {
+ if (_freeFlag)
+ Graphics::Surface::free();
+}
+
+void MSurface::setSize(int width, int height) {
+ if (_freeFlag)
+ Graphics::Surface::free();
+ Graphics::Surface::create(width, height, Graphics::PixelFormat::createFormatCLUT8());
+ _freeFlag = true;
+}
+
+void MSurface::setPixels(byte *pData, int horizSize, int vertSize) {
+ _freeFlag = false;
+ pixels = pData;
+ w = pitch = horizSize;
+ h = vertSize;
+ format.bytesPerPixel = 1;
+}
+
+int MSurface::scaleValue(int value, int scale, int err) {
+ int scaled = 0;
+ while (value--) {
+ err -= scale;
+ while (err < 0) {
+ scaled++;
+ err += 100;
+ }
+ }
+ return scaled;
+}
+
+void MSurface::drawSprite(const Common::Point &pt, SpriteInfo &info, const Common::Rect &clipRect) {
+
+ enum {
+ kStatusSkip,
+ kStatusScale,
+ kStatusDraw
+ };
+
+ // NOTE: The current clipping code assumes that the top left corner of the clip
+ // rectangle is always 0, 0
+ assert(clipRect.top == 0 && clipRect.left == 0);
+
+ // TODO: Put err* and scaled* into SpriteInfo
+ int errX = info.hotX * info.scaleX % 100;
+ int errY = info.hotY * info.scaleY % 100;
+ int scaledWidth = scaleValue(info.width, info.scaleX, errX);
+ int scaledHeight = scaleValue(info.height, info.scaleY, errY);
+
+ int x = pt.x, y = pt.y;
+ int clipX = 0, clipY = 0;
+ // Clip the sprite's width and height according to the clip rectangle's dimensions
+ // This clips the sprite to the bottom and right
+ if (x >= 0) {
+ scaledWidth = MIN<int>(x + scaledWidth, clipRect.right) - x;
+ } else {
+ clipX = x;
+ scaledWidth = x + scaledWidth;
+ }
+ if (y >= 0) {
+ scaledHeight = MIN<int>(y + scaledHeight, clipRect.bottom) - y;
+ } else {
+ clipY = y;
+ scaledHeight = y + scaledHeight;
+ }
+
+ // Check if sprite is inside the screen. If it's not, there's no need to draw it
+ if (scaledWidth + x <= 0 || scaledHeight + y <= 0) // check left and top (in case x,y are negative)
+ return;
+ if (scaledWidth <= 0 || scaledHeight <= 0) // check right and bottom
+ return;
+ int heightAmt = scaledHeight;
+
+ byte *src = info.sprite->getData();
+ byte *dst = getBasePtr(x - info.hotX - clipX, y - info.hotY - clipY);
+
+ int status = kStatusSkip;
+ byte *scaledLineBuf = new byte[scaledWidth];
+
+ while (heightAmt > 0) {
+
+ if (status == kStatusSkip) {
+ // Skip line
+ errY -= info.scaleY;
+ if (errY < 0)
+ status = kStatusScale;
+ else
+ src += info.width;
+ } else {
+
+ if (status == kStatusScale) {
+ // Scale current line
+ byte *lineDst = scaledLineBuf;
+ int curErrX = errX;
+ int width = scaledWidth;
+ byte *tempSrc = src;
+ int startX = clipX;
+ while (width > 0) {
+ byte pixel = *tempSrc++;
+ curErrX -= info.scaleX;
+ while (curErrX < 0) {
+ if (startX == 0) {
+ *lineDst++ = pixel;
+ width--;
+ } else {
+ startX++;
+ }
+ curErrX += 100;
+ }
+ }
+ src += info.width;
+ status = kStatusDraw;
+ }
+
+ if (status == kStatusDraw && clipY == 0) {
+ // Draw previously scaled line
+ // TODO Implement different drawing types (depth, shadow etc.)
+ byte *tempDst = dst;
+ for (int lineX = 0; lineX < scaledWidth; lineX++) {
+ byte pixel = scaledLineBuf[lineX];
+
+ if (info.encoding & 0x80) {
+
+ if (pixel == 0x80) {
+ pixel = 0;
+ } else {
+ byte destPixel = *tempDst;
+ byte r, g, b;
+ r = CLIP((info.palette[destPixel * 3] * pixel) >> 10, 0, 31);
+ g = CLIP((info.palette[destPixel * 3 + 1] * pixel) >> 10, 0, 31);
+ b = CLIP((info.palette[destPixel * 3 + 2] * pixel) >> 10, 0, 31);
+ pixel = info.inverseColorTable[(b << 10) | (g << 5) | r];
+ }
+ }
+
+ if (pixel)
+ *tempDst = pixel;
+
+ tempDst++;
+ }
+ dst += pitch;
+ heightAmt--;
+ // TODO depth etc.
+ //depthAddress += Destination -> Width;
+
+ errY += 100;
+ if (errY >= 0)
+ status = kStatusSkip;
+ } else if (status == kStatusDraw && clipY < 0) {
+ clipY++;
+
+ errY += 100;
+ if (errY >= 0)
+ status = kStatusSkip;
+ }
+
+ }
+
+ }
+
+ delete[] scaledLineBuf;
+
+}
+
+void MSurface::empty() {
+ Common::fill(getBasePtr(0, 0), getBasePtr(0, h), 0);
+}
+
+void MSurface::copyFrom(MSurface *src, const Common::Rect &srcBounds,
+ const Common::Point &destPos, int transparentColor) {
+ // Validation of the rectangle and position
+ int destX = destPos.x, destY = destPos.y;
+ if ((destX >= w) || (destY >= h))
+ return;
+
+ Common::Rect copyRect = srcBounds;
+ if (destX < 0) {
+ copyRect.left += -destX;
+ destX = 0;
+ } else if (destX + copyRect.width() > w) {
+ copyRect.right -= destX + copyRect.width() - w;
+ }
+ if (destY < 0) {
+ copyRect.top += -destY;
+ destY = 0;
+ } else if (destY + copyRect.height() > h) {
+ copyRect.bottom -= destY + copyRect.height() - h;
+ }
+
+ if (!copyRect.isValidRect())
+ return;
+
+ // Copy the specified area
+
+ byte *data = src->getData();
+ byte *srcPtr = data + (src->getWidth() * copyRect.top + copyRect.left);
+ byte *destPtr = (byte *)pixels + (destY * getWidth()) + destX;
+
+ for (int rowCtr = 0; rowCtr < copyRect.height(); ++rowCtr) {
+ if (transparentColor == -1) {
+ // No transparency, so copy line over
+ Common::copy(srcPtr, srcPtr + copyRect.width(), destPtr);
+ } else {
+ // Copy each byte one at a time checking for the transparency color
+ for (int xCtr = 0; xCtr < copyRect.width(); ++xCtr)
+ if (srcPtr[xCtr] != transparentColor) destPtr[xCtr] = srcPtr[xCtr];
+ }
+
+ srcPtr += src->getWidth();
+ destPtr += getWidth();
+ }
+}
+
+void MSurface::copyFrom(MSurface *src, const Common::Point &destPos, int depth,
+ DepthSurface *depthSurface, int scale, bool flipped, int transparentColor) {
+ int destX = destPos.x, destY = destPos.y;
+ int frameWidth = src->getWidth();
+ int frameHeight = src->getHeight();
+ int direction = flipped ? -1 : 1;
+
+ int highestDim = MAX(frameWidth, frameHeight);
+ bool lineDist[MADS_SCREEN_WIDTH];
+ int distIndex = 0;
+ int distXCount = 0, distYCount = 0;
+
+ if (scale != -1) {
+ int distCtr = 0;
+ do {
+ distCtr += scale;
+ if (distCtr < 100) {
+ lineDist[distIndex] = false;
+ } else {
+ lineDist[distIndex] = true;
+ distCtr -= 100;
+
+ if (distIndex < frameWidth)
+ ++distXCount;
+
+ if (distIndex < frameHeight)
+ ++distYCount;
+ }
+ } while (++distIndex < highestDim);
+
+ destX -= distXCount / 2;
+ destY -= distYCount - 1;
+ }
+
+ // Special case for quicker drawing of non-scaled images
+ if (scale == 100 || scale == -1) {
+ // Copy the specified area
+ Common::Rect copyRect(0, 0, src->getWidth(), src->getHeight());
+
+ if (destX < 0) {
+ copyRect.left += -destX;
+ destX = 0;
+ } else if (destX + copyRect.width() > w) {
+ copyRect.right -= destX + copyRect.width() - w;
+ }
+ if (destY < 0) {
+ copyRect.top += -destY;
+ destY = 0;
+ } else if (destY + copyRect.height() > h) {
+ copyRect.bottom -= destY + copyRect.height() - h;
+ }
+
+ if (!copyRect.isValidRect())
+ return;
+
+ byte *data = src->getData();
+ byte *srcPtr = data + (src->getWidth() * copyRect.top + copyRect.left);
+ byte *destPtr = (byte *)pixels + (destY * pitch) + destX;
+ if (flipped)
+ srcPtr += copyRect.width() - 1;
+
+ // 100% scaling variation
+ for (int rowCtr = 0; rowCtr < copyRect.height(); ++rowCtr) {
+ // Copy each byte one at a time checking against the depth
+ for (int xCtr = 0; xCtr < copyRect.width(); ++xCtr) {
+ byte *srcP = srcPtr + xCtr * direction;
+ int pixelDepth = depthSurface == nullptr ? 15 :
+ depthSurface->getDepth(Common::Point(destX + xCtr, destY + rowCtr));
+
+ if ((depth <= pixelDepth) && (*srcP != transparentColor))
+ destPtr[xCtr] = *srcP;
+ }
+
+ srcPtr += src->getWidth();
+ destPtr += getWidth();
+ }
+
+ return;
+ }
+
+ // Start of draw logic for scaled sprites
+ const byte *srcPixelsP = src->getData();
+
+ int destRight = this->getWidth() - 1;
+ int destBottom = this->getHeight() - 1;
+
+ // Check x bounding area
+ int spriteLeft = 0;
+ int spriteWidth = distXCount;
+ int widthAmount = destX + distXCount - 1;
+
+ if (destX < 0) {
+ spriteWidth += destX;
+ spriteLeft -= destX;
+ }
+ widthAmount -= destRight;
+ if (widthAmount > 0)
+ spriteWidth -= widthAmount;
+
+ int spriteRight = spriteLeft + spriteWidth;
+ if (spriteWidth <= 0)
+ return;
+ if (flipped) {
+ destX += distXCount - 1;
+ spriteLeft = -(distXCount - spriteRight);
+ spriteRight = (-spriteLeft + spriteWidth);
+ }
+
+ // Check y bounding area
+ int spriteTop = 0;
+ int spriteHeight = distYCount;
+ int heightAmount = destY + distYCount - 1;
+
+ if (destY < 0) {
+ spriteHeight += destY;
+ spriteTop -= destY;
+ }
+ heightAmount -= destBottom;
+ if (heightAmount > 0)
+ spriteHeight -= heightAmount;
+ int spriteBottom = spriteTop + spriteHeight;
+
+ if (spriteHeight <= 0)
+ return;
+
+ byte *destPixelsP = this->getBasePtr(destX + spriteLeft, destY + spriteTop);
+
+ spriteLeft = spriteLeft * direction;
+
+ // Loop through the lines of the sprite
+ for (int yp = 0, sprY = -1; yp < frameHeight; ++yp, srcPixelsP += src->pitch) {
+ if (!lineDist[yp])
+ // Not a display line, so skip it
+ continue;
+ // Check whether the sprite line is in the display range
+ ++sprY;
+ if ((sprY >= spriteBottom) || (sprY < spriteTop))
+ continue;
+
+ // Found a line to display. Loop through the pixels
+ const byte *srcP = srcPixelsP;
+ byte *destP = destPixelsP;
+
+ for (int xp = 0, sprX = 0; xp < frameWidth; ++xp, ++srcP) {
+ if (xp < spriteLeft)
+ // Not yet reached start of display area
+ continue;
+ if (!lineDist[sprX++])
+ // Not a display pixel
+ continue;
+
+ // Get depth of current output pixel in depth surface
+ Common::Point pt((destP - (byte *)this->pixels) % this->pitch,
+ (destP - (byte *)this->pixels) / this->pitch);
+ int pixelDepth = (depthSurface == nullptr) ? 15 : depthSurface->getDepth(pt);
+
+ if ((*srcP != transparentColor) && (depth <= pixelDepth))
+ *destP = *srcP;
+
+ destP += direction;
+ }
+
+ // Move to the next destination line
+ destPixelsP += this->pitch;
+ }
+}
+
+void MSurface::scrollX(int xAmount) {
+ if (xAmount == 0)
+ return;
+
+ byte buffer[80];
+ int direction = (xAmount > 0) ? -1 : 1;
+ int xSize = ABS(xAmount);
+ assert(xSize <= 80);
+
+ byte *srcP = getBasePtr(0, 0);
+
+ for (int y = 0; y < this->h; ++y, srcP += pitch) {
+ if (direction < 0) {
+ // Copy area to be overwritten
+ Common::copy(srcP, srcP + xSize, &buffer[0]);
+ // Shift the remainder of the line over the given area
+ Common::copy(srcP + xSize, srcP + this->w, srcP);
+ // Move buffered area to the end of the line
+ Common::copy(&buffer[0], &buffer[xSize], srcP + this->w - xSize);
+ } else {
+ // Copy area to be overwritten
+ Common::copy_backward(srcP + this->w - xSize, srcP + this->w, &buffer[80]);
+ // Shift the remainder of the line over the given area
+ Common::copy_backward(srcP, srcP + this->w - xSize, srcP + this->w);
+ // Move buffered area to the start of the line
+ Common::copy_backward(&buffer[80 - xSize], &buffer[80], srcP + xSize);
+ }
+ }
+}
+
+void MSurface::scrollY(int yAmount) {
+ if (yAmount == 0)
+ return;
+
+ int direction = (yAmount > 0) ? 1 : -1;
+ int ySize = ABS(yAmount);
+ assert(ySize < (this->h / 2));
+ assert(this->w == pitch);
+
+ int blockSize = ySize * this->w;
+ byte *tempData = new byte[blockSize];
+ byte *pixelsP = getBasePtr(0, 0);
+
+ if (direction > 0) {
+ // Buffer the lines to be overwritten
+ byte *srcP = (byte *)getBasePtr(0, this->h - ySize);
+ Common::copy(srcP, srcP + (pitch * ySize), tempData);
+ // Vertically shift all the lines
+ Common::copy_backward(pixelsP, pixelsP + (pitch * (this->h - ySize)),
+ pixelsP + (pitch * this->h));
+ // Transfer the buffered lines top the top of the screen
+ Common::copy(tempData, tempData + blockSize, pixelsP);
+ } else {
+ // Buffer the lines to be overwritten
+ Common::copy(pixelsP, pixelsP + (pitch * ySize), tempData);
+ // Vertically shift all the lines
+ Common::copy(pixelsP + (pitch * ySize), pixelsP + (pitch * this->h), pixelsP);
+ // Transfer the buffered lines to the bottom of the screen
+ Common::copy(tempData, tempData + blockSize, pixelsP + (pitch * (this->h - ySize)));
+ }
+
+ delete[] tempData;
+}
+
+
+void MSurface::translate(Common::Array<RGB6> &palette) {
+ for (int y = 0; y < this->h; ++y) {
+ byte *pDest = getBasePtr(0, y);
+
+ for (int x = 0; x < this->w; ++x, ++pDest) {
+ if (*pDest < 255) // scene 752 has some palette indices of 255
+ *pDest = palette[*pDest]._palIndex;
+ }
+ }
+}
+
+void MSurface::translate(byte map[PALETTE_COUNT]) {
+ for (int y = 0; y < this->h; ++y) {
+ byte *pDest = getBasePtr(0, y);
+
+ for (int x = 0; x < this->w; ++x, ++pDest) {
+ *pDest = map[*pDest];
+ }
+ }
+}
+
+MSurface *MSurface::flipHorizontal() const {
+ MSurface *dest = new MSurface(this->w, this->h);
+
+ for (int y = 0; y < this->h; ++y) {
+ const byte *srcP = getBasePtr(this->w - 1, y);
+ byte *destP = dest->getBasePtr(0, y);
+
+ for (int x = 0; x < this->w; ++x)
+ *destP++ = *srcP--;
+ }
+
+ return dest;
+}
+
+/*------------------------------------------------------------------------*/
+
+int DepthSurface::getDepth(const Common::Point &pt) {
+ if (_vm->_game->_scene._sceneInfo->_depthStyle == 2) {
+ int bits = (3 - (pt.x % 4)) * 2;
+ byte v = *getBasePtr(pt.x >> 2, pt.y);
+ return v >> bits;
+ } else {
+ if (pt.x < 0 || pt.y < 0 || pt.x >= this->w || pt.y >= this->h)
+ return 0;
+
+ return *getBasePtr(pt.x, pt.y) & 0xF;
+ }
+}
+
+int DepthSurface::getDepthHighBit(const Common::Point &pt) {
+ if (_vm->_game->_scene._sceneInfo->_depthStyle == 2) {
+ int bits = (3 - (pt.x % 4)) * 2;
+ byte v = *getBasePtr(pt.x >> 2, pt.y);
+ return (v >> bits) & 2;
+ } else {
+ if (pt.x < 0 || pt.y < 0 || pt.x >= this->w || pt.y >= this->h)
+ return 0;
+
+ return *getBasePtr(pt.x, pt.y) & 0x80;
+ }
+}
+
+
+} // End of namespace MADS
diff --git a/engines/mads/msurface.h b/engines/mads/msurface.h
new file mode 100644
index 0000000000..ef2bbd6784
--- /dev/null
+++ b/engines/mads/msurface.h
@@ -0,0 +1,242 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+
+ * You should have received a copy of the GNU General Public 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 MADS_MSURFACE_H
+#define MADS_MSURFACE_H
+
+#include "common/scummsys.h"
+#include "common/rect.h"
+#include "graphics/surface.h"
+#include "mads/palette.h"
+
+namespace MADS {
+
+class MADSEngine;
+class MSprite;
+class DepthSurface;
+
+/**
+ * Basic sprite information
+ */
+struct SpriteInfo {
+ MSprite *sprite;
+ int hotX, hotY;
+ int width, height;
+ int scaleX, scaleY;
+ uint8 encoding;
+ byte *inverseColorTable;
+ byte *palette;
+};
+
+/*
+ * MADS graphics surface
+ */
+class MSurface : public Graphics::Surface {
+private:
+ bool _freeFlag;
+protected:
+ static MADSEngine *_vm;
+public:
+ /**
+ * Sets the engine refrence used all surfaces
+ */
+ static void setVm(MADSEngine *vm) { _vm = vm; }
+
+ /**
+ * Helper method for calculating new dimensions when scaling a sprite
+ */
+ static int scaleValue(int value, int scale, int err);
+public:
+ /**
+ * Basic constructor
+ */
+ MSurface();
+
+ /**
+ * Constructor for a surface with fixed dimensions
+ */
+ MSurface(int width, int height);
+
+ /**
+ * Destructor
+ */
+ virtual ~MSurface();
+
+ /**
+ * Reinitializes a surface to have a given set of dimensions
+ */
+ void setSize(int width, int height);
+
+ /**
+ * Sets the pixels the surface is associated with
+ * @remarks The surface will not free the data block
+ */
+ void setPixels(byte *pData, int horizSize, int vertSize);
+
+ /**
+ * Draws an arbitrary line on the screen using a specified color
+ * @param startPos Starting position
+ * @param endPos Ending position
+ * @param color Color to use
+ */
+ void line(const Common::Point &startPos, const Common::Point &endPos, byte color);
+
+ /**
+ * Draws a sprite
+ * @param pt Position to draw sprite at
+ * @param info General sprite details
+ * @param clipRect Clipping rectangle to constrain sprite drawing within
+ */
+ void drawSprite(const Common::Point &pt, SpriteInfo &info, const Common::Rect &clipRect);
+
+ /**
+ * Returns the width of the surface
+ */
+ int getWidth() const { return w; }
+
+ /**
+ * Returns the height of the surface
+ */
+ int getHeight() const { return h; }
+
+ /**
+ * Returns the size of the surface as a Rect
+ */
+ Common::Rect getBounds() const {
+ return Common::Rect(0, 0, w, h);
+ }
+
+ /**
+ * Returns a pointer to the surface data
+ */
+ byte *getData() { return (byte *)Graphics::Surface::getPixels(); }
+
+ /**
+ * Returns a pointer to a given position within the surface
+ */
+ byte *getBasePtr(int x, int y) { return (byte *)Graphics::Surface::getBasePtr(x, y); }
+
+ /**
+ * Returns a pointer to a given position within the surface
+ */
+ const byte *getBasePtr(int x, int y) const { return (const byte *)Graphics::Surface::getBasePtr(x, y); }
+
+ /**
+ * Clears the surface
+ */
+ void empty();
+
+ /**
+ * Copys a sub-section of another surface into the current one.
+ * @param src Source surface
+ * @param srcBounds Area of source surface to copy
+ * @param destPos Destination position to draw in current surface
+ * @param transparentColor Transparency palette index
+ */
+ void copyFrom(MSurface *src, const Common::Rect &srcBounds, const Common::Point &destPos,
+ int transparentColor = -1);
+
+ /**
+ * Copys a sub-section of another surface into the current one.
+ * @param src Source surface
+ * @param destPos Destination position to draw in current surface
+ * @param depth Depth of sprite
+ * @param depthSurface Depth surface to use with sprite depth
+ * @param scale Scale for image
+ * @param flipped Flag for whether image is to be flipped
+ * @param transparentColor Transparency palette index
+ */
+ void copyFrom(MSurface *src, const Common::Point &destPos, int depth, DepthSurface *depthSurface,
+ int scale, bool flipped, int transparentColor = -1);
+
+ /**
+ * Copies the surface to a given destination surface
+ */
+ void copyTo(MSurface *dest, int transparentColor = -1) {
+ dest->copyFrom(this, Common::Rect(w, h), Common::Point(), transparentColor);
+ }
+
+ /**
+ * Copies the surface to a given destination surface
+ */
+ void copyTo(MSurface *dest, const Common::Point &pt, int transparentColor = -1) {
+ dest->copyFrom(this, Common::Rect(w, h), pt, transparentColor);
+ }
+
+ /**
+ * Copies the surface to a given destination surface
+ */
+ void copyTo(MSurface *dest, const Common::Rect &srcBounds, const Common::Point &destPos,
+ int transparentColor = -1) {
+ dest->copyFrom(this, srcBounds, destPos, transparentColor);
+ }
+
+ /**
+ * Scroll the screen horizontally by a given amount
+ * @param xAmount Horizontal amount
+ */
+ void scrollX(int xAmount);
+
+ /**
+ * Scroll the screen vertically by a given amount
+ * @param yAmount Vertical amount
+ */
+ void scrollY(int yAmount);
+
+ /**
+ * Translates the pixels of an image used the passed palette with RGB mapping
+ */
+ void translate(Common::Array<RGB6> &palette);
+
+ /**
+ * Translates the pixels of an image used the passed palette with RGB mapping
+ */
+ void translate(byte map[PALETTE_COUNT]);
+
+ /**
+ * Create a new surface which is a flipped horizontal copy of the current one
+ */
+ MSurface *flipHorizontal() const;
+};
+
+class DepthSurface : public MSurface {
+private:
+ MADSEngine *_vm;
+public:
+ /**
+ * Constructor
+ */
+ DepthSurface(MADSEngine *vm) : _vm(vm) {}
+
+ /**
+ * Returns the depth at a given position
+ */
+ int getDepth(const Common::Point &pt);
+
+ /**
+ */
+ int getDepthHighBit(const Common::Point &pt);
+};
+
+} // End of namespace MADS
+
+#endif /* MADS_MSURFACE_H */
diff --git a/engines/mads/nebular/dialogs_nebular.cpp b/engines/mads/nebular/dialogs_nebular.cpp
new file mode 100644
index 0000000000..36858a4940
--- /dev/null
+++ b/engines/mads/nebular/dialogs_nebular.cpp
@@ -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.
+ *
+ */
+
+#include "common/scummsys.h"
+#include "common/config-manager.h"
+#include "common/util.h"
+#include "mads/mads.h"
+#include "mads/screen.h"
+#include "mads/msurface.h"
+#include "mads/staticres.h"
+#include "mads/nebular/dialogs_nebular.h"
+#include "mads/nebular/game_nebular.h"
+
+namespace MADS {
+
+namespace Nebular {
+
+bool DialogsNebular::show(int messageId, int objectId) {
+ MADSAction &action = _vm->_game->_scene._action;
+ Common::StringArray msg = _vm->_game->getMessage(messageId);
+ Common::String title;
+ Common::String commandText;
+ Common::String valStr;
+ Common::String dialogText;
+ bool result = true;
+ bool centerFlag = false;
+ bool underlineFlag = false;
+ bool commandFlag = false;
+ bool crFlag = false;
+ TextDialog *dialog = nullptr;
+ _dialogWidth = 17;
+ _capitalizationMode = kUppercase;
+
+ // Loop through the lines of the returned text
+ for (uint idx = 0; idx < msg.size(); ++idx) {
+ Common::String srcLine = msg[idx];
+ const char *srcP = srcLine.c_str();
+
+ // Loop through the text of the line
+ while (srcP < srcLine.c_str() + srcLine.size()) {
+ if (*srcP == '[') {
+ // Starting a command
+ commandText = "";
+ commandFlag = true;
+ } else if (*srcP == ']') {
+ // Ending a command
+ if (commandFlag) {
+ if (commandCheck("CENTER", valStr, commandText)) {
+ centerFlag = true;
+ } else if (commandCheck("TITLE", valStr, commandText)) {
+ centerFlag = true;
+ underlineFlag = true;
+ crFlag = true;
+ int v = atoi(valStr.c_str());
+ if (v != 0)
+ _dialogWidth = v;
+ } else if (commandCheck("CR", valStr, commandText)) {
+ if (centerFlag) {
+ crFlag = true;
+ } else {
+ if (objectId == -1) {
+ dialog = new TextDialog(_vm, FONT_INTERFACE, _defaultPosition, _dialogWidth);
+ } else {
+ dialog = new PictureDialog(_vm, _defaultPosition, _dialogWidth, objectId);
+ }
+ dialog->wordWrap(dialogText);
+ dialog->incNumLines();
+ }
+ } else if (commandCheck("ASK", valStr, commandText)) {
+ dialog->addInput();
+ } else if (commandCheck("VERB", valStr, commandText)) {
+ dialogText += getVocab(action._activeAction._verbId);
+ } else if (commandCheck("INDEX", valStr, commandText)) {
+ int idxLocal = atoi(valStr.c_str());
+ if (_indexList[idxLocal])
+ dialogText += getVocab(_indexList[idxLocal]);
+ } else if (commandCheck("NUMBER", valStr, commandText)) {
+ int idxLocal = atoi(valStr.c_str());
+ dialogText += Common::String::format("%.4d", _indexList[idxLocal]);
+ } else if (commandCheck("NOUN1", valStr, commandText)) {
+ if (!textNoun(dialogText, 1, valStr))
+ dialogText += getVocab(action._activeAction._objectNameId);
+ } else if (commandCheck("NOUN2", valStr, commandText)) {
+ if (!textNoun(dialogText, 2, valStr))
+ dialogText += getVocab(action._activeAction._indirectObjectId);
+ } else if (commandCheck("PREP", valStr, commandText)) {
+ dialogText += kArticleList[action._savedFields._articleNumber];
+ } else if (commandCheck("SENTENCE", valStr, commandText)) {
+ dialogText += action._sentence;
+ } else if (commandCheck("WIDTH", valStr, commandText)) {
+ _dialogWidth = atoi(valStr.c_str());
+ } else if (commandCheck("BAR", valStr, commandText)) {
+ dialog->addBarLine();
+ } else if (commandCheck("UNDER", valStr, commandText)) {
+ underlineFlag = true;
+ } else if (commandCheck("DOWN", valStr, commandText)) {
+ dialog->downPixelLine();
+ } else if (commandCheck("TAB", valStr, commandText)) {
+ int xp = atoi(valStr.c_str());
+ dialog->setLineXp(xp);
+ }
+ }
+
+ commandFlag = false;
+ } else if (commandFlag) {
+ // Add the next character to the command
+ commandText += *srcP;
+ } else {
+ // Add to the text to be displayed in the dialog
+ dialogText += *srcP;
+ }
+
+ ++srcP;
+ }
+
+ if (!dialog) {
+ if (objectId == -1) {
+ dialog = new TextDialog(_vm, FONT_INTERFACE, _defaultPosition, _dialogWidth);
+ } else {
+ dialog = new PictureDialog(_vm, _defaultPosition, _dialogWidth, objectId);
+ }
+ }
+
+ if (centerFlag) {
+ dialog->addLine(dialogText, underlineFlag);
+ if (crFlag)
+ dialog->incNumLines();
+ } else {
+ dialog->wordWrap(dialogText);
+ }
+
+ // Reset line processing flags in preparation for next line
+ dialogText = "";
+ commandFlag = false;
+ underlineFlag = false;
+ centerFlag = false;
+ crFlag = false;
+ }
+
+ if (!centerFlag)
+ dialog->incNumLines();
+
+ // Show the dialog
+ _vm->_events->setCursor(CURSOR_ARROW);
+ dialog->show();
+
+ delete dialog;
+ return result;
+}
+
+void DialogsNebular::showItem(int objectId, int messageId, int speech) {
+ // MADS engine doesn't currently support speech
+ assert(!speech);
+
+ show(messageId, objectId);
+}
+
+Common::String DialogsNebular::getVocab(int vocabId) {
+ assert(vocabId > 0);
+
+ Common::String vocab = _vm->_game->_scene.getVocab(vocabId);
+
+ switch (_capitalizationMode) {
+ case kUppercase:
+ vocab.toUppercase();
+ break;
+ case kLowercase:
+ vocab.toLowercase();
+ break;
+ case kUpperAndLower:
+ vocab.toLowercase();
+ vocab.setChar(toupper(vocab[0]), 0);
+ default:
+ break;
+ }
+
+ return vocab;
+}
+
+bool DialogsNebular::textNoun(Common::String &dest, int nounId, const Common::String &source) {
+ // Ensure the destination has parameter specifications
+ if (!source.hasPrefix(":"))
+ return false;
+
+ // Extract the first (singular) result value
+ Common::String param1 = Common::String(source.c_str() + 1);
+ Common::String param2;
+ const char *sepChar = strchr(source.c_str() + 1, ':');
+ if (sepChar) {
+ param1 = Common::String(source.c_str() + 1, sepChar);
+
+ // Get the second, plural form
+ param2 = Common::String(sepChar + 1);
+ }
+
+ // Get the vocab to use
+ MADSAction &action = _vm->_game->_scene._action;
+ Common::String vocab = _vm->_dialogs->getVocab(action._activeAction._verbId);
+ Common::String *str;
+
+ if (vocab.hasSuffix("s") || vocab.hasSuffix("S")) {
+ str = &param2;
+ } else {
+ str = &param1;
+
+ if (param1 == "a ") {
+ switch (toupper(vocab[0])) {
+ case 'A':
+ case 'E':
+ case 'I':
+ case 'O':
+ case 'U':
+ param1 = "an ";
+ break;
+ default:
+ break;
+ }
+ }
+ }
+
+ dest += *str;
+ return true;
+}
+
+bool DialogsNebular::commandCheck(const char *idStr, Common::String &valStr,
+ const Common::String &command) {
+ uint idLen = strlen(idStr);
+
+ valStr = (command.size() <= idLen) ? "" : Common::String(command.c_str() + idLen);
+
+ // Check whether the command starts with the given Id
+ int result = scumm_strnicmp(idStr, command.c_str(), idLen) == 0;
+ if (!result)
+ return false;
+
+ // It does, so set the command case mode
+ if (Common::isUpper(command[0]) && Common::isUpper(command[1])) {
+ _capitalizationMode = kUppercase;
+ } else if (Common::isUpper(command[0])) {
+ _capitalizationMode = kUpperAndLower;
+ } else {
+ _capitalizationMode = kLowercase;
+ }
+
+ return true;
+}
+
+void DialogsNebular::showDialog() {
+ switch (_pendingDialog) {
+ case DIALOG_GAME_MENU:
+ //GameMenuDialog::show();
+ break;
+ case DIALOG_DIFFICULTY: {
+/*
+ DifficultyDialog *dlg = new DifficultyDialog(_vm);
+ dlg->show();
+ delete dlg;
+*/
+ break;
+ }
+ default:
+ break;
+ }
+}
+
+/*------------------------------------------------------------------------*/
+
+CopyProtectionDialog::CopyProtectionDialog(MADSEngine *vm, bool priorAnswerWrong) :
+TextDialog(vm, FONT_INTERFACE, Common::Point(-1, -1), 32) {
+ getHogAnusEntry(_hogEntry);
+
+ if (priorAnswerWrong) {
+ addLine("ANSWER INCORRECT!", true);
+ wordWrap("\n");
+ addLine("(But we'll give you another chance!)");
+ }
+ else {
+ addLine("REX NEBULAR version 8.43", true);
+ wordWrap("\n");
+ addLine("(Copy Protection, for your convenience)");
+ }
+ wordWrap("\n");
+
+ wordWrap("Now comes the part that everybody hates. But if we don't");
+ wordWrap("do this, nasty rodent-like people will pirate this game");
+ wordWrap("and a whole generation of talented designers, programmers,");
+ wordWrap("artists, and playtesters will go hungry, and will wander");
+ wordWrap("aimlessly through the land at night searching for peace.");
+ wordWrap("So let's grit our teeth and get it over with. Just get");
+
+ Common::String line = "out your copy of ";
+ line += _hogEntry._bookId == 103 ? "the GAME MANUAL" : "REX'S LOGBOOK";
+ line += ". See! That was easy. ";
+ wordWrap(line);
+
+ line = Common::String::format("Next, just turn to page %d. On line %d, find word number %d, ",
+ _hogEntry._pageNum, _hogEntry._lineNum, _hogEntry._wordNum);
+ wordWrap(line);
+
+ wordWrap("and type it on the line below (we',27h,'ve even given you");
+ wordWrap("first letter as a hint). As soon as you do that, we can get");
+ wordWrap("right into this really COOL adventure game!\n");
+ wordWrap("\n");
+ wordWrap(" ");
+ addInput();
+ wordWrap("\n");
+}
+
+void CopyProtectionDialog::show() {
+ draw();
+ _vm->_events->showCursor();
+
+ // TODO: Replace with text input
+ while (!_vm->shouldQuit() && !_vm->_events->isKeyPressed() &&
+ !_vm->_events->_mouseClicked) {
+ _vm->_events->delay(1);
+ }
+
+ _vm->_events->_pendingKeys.clear();
+}
+
+bool CopyProtectionDialog::getHogAnusEntry(HOGANUS &entry) {
+ File f;
+ f.open("*HOGANUS.DAT");
+
+ // Read in the total number of entries, and randomly pick an entry to use
+ int numEntries = f.readUint16LE();
+ int entryIndex = _vm->getRandomNumber(1, numEntries);
+
+ // Read in the encrypted entry
+ f.seek(28 * entryIndex + 2);
+ byte entryData[28];
+ f.read(entryData, 28);
+
+ // Decrypt it
+ for (int i = 0; i < 28; ++i)
+ entryData[i] = ~entryData[i];
+
+ // Fill out the fields
+ entry._bookId = entryData[0];
+ entry._pageNum = READ_LE_UINT16(&entryData[2]);
+ entry._lineNum = READ_LE_UINT16(&entryData[4]);
+ entry._wordNum = READ_LE_UINT16(&entryData[6]);
+ entry._word = Common::String((char *)&entryData[8]);
+
+ f.close();
+ return true;
+}
+
+/*------------------------------------------------------------------------*/
+
+PictureDialog::PictureDialog(MADSEngine *vm, const Common::Point &pos,
+ int maxChars, int objectId) :
+ TextDialog(vm, FONT_INTERFACE, pos, maxChars), _objectId(objectId) {
+ // Turn off cycling if active
+ Scene &scene = _vm->_game->_scene;
+ _cyclingActive = scene._cyclingActive;
+ scene._cyclingActive = false;
+}
+
+PictureDialog::~PictureDialog() {
+ // Restore cycling flag
+ Scene &scene = _vm->_game->_scene;
+ scene._cyclingActive = _cyclingActive;
+}
+
+void PictureDialog::save() {
+ Palette &palette = *_vm->_palette;
+ byte map[PALETTE_COUNT];
+
+ // Save the entire screen
+ _savedSurface = new MSurface(MADS_SCREEN_WIDTH, MADS_SCREEN_HEIGHT);
+ _vm->_screen.copyTo(_savedSurface);
+
+ // Save palette information
+ Common::copy(&palette._mainPalette[0], &palette._mainPalette[PALETTE_SIZE], &_palette[0]);
+ Common::copy(&palette._palFlags[0], &palette._palFlags[PALETTE_COUNT], &_palFlags[0]);
+ _rgbList.copy(palette._rgbList);
+
+ // Set up palette allocation
+ Common::fill(&palette._colorFlags[0], &palette._colorFlags[3], true);
+
+ uint32 *palFlagP = &palette._palFlags[0];
+ for (int idx = 0; idx < PALETTE_COUNT; ++idx, ++palFlagP) {
+ if (idx < PALETTE_RESERVED_LOW_COUNT ||
+ idx >= (PALETTE_COUNT - PALETTE_RESERVED_HIGH_COUNT - 10)) {
+ *palFlagP = 1;
+ map[idx] = idx;
+ } else {
+ *palFlagP = 0;
+ }
+ }
+
+ // Reset the flag list
+ palette._rgbList.reset();
+
+ // Fade the screen to grey
+ int numColors = PALETTE_COUNT - PALETTE_RESERVED_LOW_COUNT - PALETTE_RESERVED_HIGH_COUNT;
+ palette.fadeOut(palette._mainPalette, &map[PALETTE_RESERVED_LOW_COUNT],
+ PALETTE_RESERVED_LOW_COUNT, numColors, 248, 8, 1, 16);
+
+ // Remap the greyed out screen to use the small greyscale range
+ // at the top end of the palette
+ _vm->_screen.translate(map);
+
+ // Load the inventory picture
+ Common::String setName = Common::String::format("*OB%.3d.SS", _objectId);
+ SpriteAsset *asset = new SpriteAsset(_vm, setName, 0x8000);
+ palette.setFullPalette(palette._mainPalette);
+
+ // Get the inventory frame, and adjust the dialog position to allow for it
+ MSprite *frame = asset->getFrame(0);
+ _position.y = frame->h + 12;
+ if ((_position.y + _height) > _vm->_screen.getHeight())
+ _position.y -= (_position.y + _height) - _vm->_screen.getHeight();
+
+ // Draw the inventory picture
+ frame->copyTo(&_vm->_screen, Common::Point(160 - frame->w / 2, 6),
+ frame->getTransparencyIndex());
+ _vm->_screen.copyRectToScreen(_vm->_screen.getBounds());
+
+ // Adjust the dialog colors to use
+ TEXTDIALOG_CONTENT1 -= 10;
+ TEXTDIALOG_CONTENT2 -= 10;
+ TEXTDIALOG_EDGE -= 10;
+ TEXTDIALOG_BACKGROUND -= 10;
+ TEXTDIALOG_FC -= 10;
+ TEXTDIALOG_FD -= 10;
+ TEXTDIALOG_FE -= 10;
+}
+
+void PictureDialog::restore() {
+ if (_savedSurface) {
+ _savedSurface->copyTo(&_vm->_screen);
+ delete _savedSurface;
+ _savedSurface = nullptr;
+
+ _vm->_screen.copyRectToScreen(_vm->_screen.getBounds());
+
+ // Restore palette information
+ Palette &palette = *_vm->_palette;
+ Common::copy(&_palette[0], &_palette[PALETTE_SIZE], &palette._mainPalette[0]);
+ _vm->_palette->setFullPalette(palette._mainPalette);
+ Common::copy(&_palFlags[0], &_palFlags[PALETTE_COUNT], &palette._palFlags[0]);
+ palette._rgbList.copy(_rgbList);
+
+ _vm->_dialogs->_defaultPosition.y = -1;
+ }
+}
+
+/*------------------------------------------------------------------------*/
+
+ScreenDialog::DialogLine::DialogLine() {
+ _active = true;
+ _state = DLGSTATE_UNSELECTED;
+ _textDisplayIndex = -1;
+ _font = nullptr;
+ _widthAdjust = 0;
+ _msg = "";
+}
+
+ScreenDialog::DialogLine::DialogLine(const Common::String &s) {
+ _active = true;
+ _state = DLGSTATE_UNSELECTED;
+ _textDisplayIndex = -1;
+ _font = nullptr;
+ _widthAdjust = -1;
+ _msg = s;
+}
+
+/*------------------------------------------------------------------------*/
+
+ScreenDialog::ScreenDialog(MADSEngine *vm) : _vm(vm) {
+ Game &game = *_vm->_game;
+ Scene &scene = game._scene;
+
+ _v1 = 0;
+ _v2 = 0;
+ _v3 = false;
+ _selectedLine = 0;
+ _dirFlag = false;
+ _textLineCount = 0;
+ _screenId = 920;
+
+ chooseBackground();
+ game.loadQuoteSet(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16,
+ 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33,
+ 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 0);
+ game._kernelMode = KERNEL_ROOM_PRELOAD;
+ _vm->_events->waitCursor();
+ scene.clearVocab();
+ scene._dynamicHotspots.clear();
+ _vm->_dialogs->_defaultPosition = Common::Point(-1, -1);
+
+ bool palFlag = false;
+ int nextSceneId = scene._nextSceneId;
+ int currentSceneId = scene._currentSceneId;
+ int priorSceneId = scene._priorSceneId;
+
+ if (_vm->_dialogs->_pendingDialog == DIALOG_DIFFICULTY) {
+ palFlag = true;
+ } else {
+ _vm->_palette->initPalette();
+ }
+ scene.loadScene(_screenId, game._aaName, palFlag);
+
+ scene._priorSceneId = priorSceneId;
+ scene._currentSceneId = currentSceneId;
+ scene._nextSceneId = nextSceneId;
+ scene._posAdjust.y = 22;
+ _vm->_sound->pauseNewCommands();
+ _vm->_events->initVars();
+ game._kernelMode = KERNEL_ROOM_INIT;
+
+ SpriteAsset *menuSprites = new SpriteAsset(_vm, "*MENU", 0);
+ _menuSpritesIndex = scene._sprites.add(menuSprites);
+
+ byte pal[768];
+ if (_vm->_screenFade) {
+ Common::fill(&pal[0], &pal[PALETTE_SIZE], 0);
+ _vm->_palette->setFullPalette(pal);
+ } else {
+ _vm->_palette->getFullPalette(pal);
+ _vm->_palette->fadeOut(pal, nullptr, 0, PALETTE_COUNT, 0, 1, 1, 16);
+ }
+
+ _vm->_screen.empty();
+ _vm->_screen.hLine(0, 0, MADS_SCREEN_WIDTH, 2);
+
+ game._fx = _vm->_screenFade == SCREEN_FADE_SMOOTH ? kTransitionFadeIn : kCenterVertTransition;
+ game._trigger = 0;
+ _vm->_events->setCursor(CURSOR_ARROW);
+
+ _vm->_palette->setEntry(10, 0, 63, 0);
+ _vm->_palette->setEntry(11, 0, 45, 0);
+ _vm->_palette->setEntry(12, 63, 63, 0);
+ _vm->_palette->setEntry(13, 45, 45, 0);
+ _vm->_palette->setEntry(14, 63, 63, 63);
+ _vm->_palette->setEntry(15, 45, 45, 45);
+
+ _lineIndex = -1;
+}
+
+void ScreenDialog::clearLines() {
+ Scene &scene = _vm->_game->_scene;
+ _v2 = 0;
+ _lines.clear();
+ scene._spriteSlots.fullRefresh(true);
+}
+
+void ScreenDialog::setClickableLines() {
+ ScreenObjects &screenObjects = _vm->_game->_screenObjects;
+
+ for (uint idx = 0; idx < _lines.size(); ++idx) {
+ if (_lines[idx]._active) {
+ const Common::Point &pt = _lines[idx]._pos;
+ int strWidth = _lines[idx]._font->getWidth(_lines[idx]._msg);
+ int maxHeight = _lines[idx]._font->getHeight();
+
+ screenObjects.add(Common::Rect(pt.x, pt.y, pt.x + strWidth, pt.y + maxHeight - 1),
+ LAYER_GUI, CAT_COMMAND, idx);
+ }
+ }
+
+ if (_vm->_dialogs->_pendingDialog == DIALOG_SAVE ||
+ _vm->_dialogs->_pendingDialog == DIALOG_RESTORE) {
+ screenObjects.add(Common::Rect(293, 26, 312, 75), LAYER_GUI, CAT_INV_LIST, 50);
+ screenObjects.add(Common::Rect(293, 78, 312, 127), LAYER_GUI, CAT_INV_LIST, 51);
+ }
+}
+
+void ScreenDialog::addQuote(int id1, int id2, DialogTextAlign align,
+ const Common::Point &pt, Font *font) {
+ Common::String msg = _vm->_game->getQuote(id1);
+
+ if (id2 > 0) {
+ msg += " ";
+ msg += _vm->_game->getQuote(id2);
+ }
+
+ addLine(msg, align, pt, font);
+}
+
+void ScreenDialog::addLine(const Common::String &msg, DialogTextAlign align,
+ const Common::Point &pt, Font *font) {
+ Scene &scene = _vm->_game->_scene;
+ DialogLine *line;
+
+ if (font == nullptr)
+ font = _vm->_font->getFont(FONT_CONVERSATION);
+
+ if (_lineIndex < (int)_lines.size()) {
+ if (_lines.size() >= 20) {
+ ++_lineIndex;
+ return;
+ }
+
+ _lines.push_back(msg);
+ line = &_lines[_lines.size() - 1];
+ } else {
+ line = &_lines[_lineIndex];
+ if (msg.compareToIgnoreCase(msg)) {
+ ++_lineIndex;
+ return;
+ }
+
+ if (line->_textDisplayIndex >= 0) {
+ TextDisplay &textDisplay = scene._textDisplay[line->_textDisplayIndex];
+ if (textDisplay._active) {
+ textDisplay._expire = -1;
+ if (_textLineCount < 20) {
+ textDisplay._msg = msg;
+ ++_textLineCount;
+ }
+ }
+ }
+ }
+
+ line->_font = font;
+ line->_state = DLGSTATE_UNSELECTED;
+ line->_pos = pt;
+ line->_widthAdjust = -1;
+ line->_textDisplayIndex = -1;
+
+ int xOffset;
+ switch (align) {
+ case ALIGN_CENTER:
+ xOffset = (MADS_SCREEN_WIDTH / 2) - font->getWidth(msg, -1) / 2;
+ line->_pos.x += xOffset;
+ break;
+
+ case ALIGN_AT_CENTER: {
+ const char *msgP = msg.c_str();
+ const char *ch = strchr(msgP, '@');
+ if (ch) {
+ xOffset = (MADS_SCREEN_WIDTH / 2) - font->getWidth(
+ Common::String(msgP, ch), line->_widthAdjust);
+ line->_pos.x += xOffset;
+ }
+ break;
+ }
+
+ case ALIGN_RIGHT:
+ xOffset = font->getWidth(msg, -1);
+ line->_pos.x -= xOffset;
+ break;
+
+ default:
+ break;
+ }
+
+ ++_lineIndex;
+}
+
+void ScreenDialog::initVars() {
+ _v1 = -1;
+ _selectedLine = -1;
+ _lineIndex = 0;
+ _textLineCount = 0;
+}
+
+void ScreenDialog::chooseBackground() {
+ switch (_vm->_game->_currentSectionNumber) {
+ case 1:
+ case 2:
+ _screenId = 921;
+ break;
+ case 3:
+ case 4:
+ _screenId = 922;
+ break;
+ case 5:
+ case 6:
+ case 7:
+ _screenId = 923;
+ break;
+ case 8:
+ _screenId = 924;
+ break;
+ default:
+ _screenId = 920;
+ break;
+ }
+}
+
+void ScreenDialog::setFrame(int frameNumber, int depth) {
+ Scene &scene = _vm->_game->_scene;
+ SpriteSlot &spriteSlot = scene._spriteSlots[scene._spriteSlots.add()];
+ spriteSlot._flags = IMG_UPDATE;
+ spriteSlot._seqIndex = 1;
+ spriteSlot._spritesIndex = _menuSpritesIndex;
+ spriteSlot._frameNumber = frameNumber;
+}
+
+void ScreenDialog::show() {
+ Scene &scene = _vm->_game->_scene;
+
+ while (_selectedLine < 1 && !_vm->shouldQuit()) {
+ handleEvents();
+ if (_v3) {
+ if (!_v1)
+ _v1 = -1;
+
+ refreshText();
+ scene.drawElements(_vm->_game->_fx, _vm->_game->_fx);
+ _v3 = false;
+ }
+
+ _vm->_events->waitForNextFrame();
+ _vm->_game->_fx = kTransitionNone;
+ }
+}
+
+void ScreenDialog::handleEvents() {
+ ScreenObjects &screenObjects = _vm->_game->_screenObjects;
+ EventsManager &events = *_vm->_events;
+ Nebular::DialogsNebular &dialogs = *(Nebular::DialogsNebular *)_vm->_dialogs;
+ int v1 = _v1;
+
+ // Mark all the lines as initially unselected
+ for (uint i = 0; i < _lines.size(); ++i)
+ _lines[i]._state = DLGSTATE_UNSELECTED;
+
+ // Process pending events
+ _vm->_events->pollEvents();
+
+ // Scan for objects in the dialog
+ int objIndex = screenObjects.scan(events.currentPos() - _vm->_screen._offset, LAYER_GUI);
+
+ if (_v2) {
+ int yp = events.currentPos().y - _vm->_screen._offset.y;
+ if (yp < screenObjects[1]._bounds.top) {
+ if (!events._mouseReleased)
+ _lines[1]._state = DLGSTATE_SELECTED;
+ objIndex = 19;
+ }
+
+ if (yp < screenObjects[7]._bounds.bottom) {
+ if (!events._mouseReleased)
+ _lines[1]._state = DLGSTATE_SELECTED;
+ objIndex = 20;
+ }
+ }
+
+ int line = -1;
+ if (objIndex > 0 || events._mouseButtons) {
+ line = screenObjects[objIndex]._descId;
+ if (dialogs._pendingDialog == DIALOG_SAVE || dialogs._pendingDialog == DIALOG_RESTORE) {
+ if (line > 7 && line <= 14) {
+ _lines[line]._state = DLGSTATE_UNSELECTED;
+ line -= 7;
+ }
+
+ int v2 = (line > 0 && line < 8) ? 1 : 0;
+ if (events._mouseMoved)
+ _v2 = v2;
+ }
+
+ if (screenObjects[objIndex]._category == CAT_COMMAND) {
+ _lines[line]._state = DLGSTATE_SELECTED;
+ }
+ }
+ if (!line)
+ line = -1;
+
+ if (dialogs._pendingDialog == DIALOG_ERROR && line == 1)
+ line = -1;
+
+ if (events._mouseReleased) {
+ if (!_v2 || line <= 18)
+ _selectedLine = line;
+ _v3 = true;
+ }
+
+ _v1 = line;
+ if (v1 == line || _selectedLine >= 0)
+ _v3 = true;
+}
+
+void ScreenDialog::refreshText() {
+ Scene &scene = _vm->_game->_scene;
+
+ for (uint i = 0; i < _lines.size(); ++i) {
+ if (_lines[i]._active) {
+ int fontColor;
+ switch (_lines[i]._state) {
+ case DLGSTATE_UNSELECTED:
+ fontColor = 0xB0A;
+ break;
+ case DLGSTATE_SELECTED:
+ fontColor = 0xD0C;
+ break;
+ default:
+ fontColor = 0xF0E;
+ break;
+ }
+
+ bool skipFlag = false;
+ if (_lines[i]._textDisplayIndex >= 0) {
+ TextDisplay &textDisplay = scene._textDisplay[_lines[i]._textDisplayIndex];
+ int currCol = textDisplay._color1;
+ if (currCol != fontColor) {
+ scene._textDisplay.expire(_lines[i]._textDisplayIndex);
+ _lines[i]._textDisplayIndex = -1;
+ } else {
+ skipFlag = true;
+ }
+ }
+
+ if (!skipFlag) {
+ _lines[i]._textDisplayIndex = scene._textDisplay.add(_lines[i]._pos.x, _lines[i]._pos.y,
+ fontColor, _lines[i]._widthAdjust, _lines[i]._msg, _lines[i]._font);
+ }
+ }
+ }
+}
+
+/*------------------------------------------------------------------------*/
+
+DifficultyDialog::DifficultyDialog(MADSEngine *vm) : ScreenDialog(vm) {
+ setFrame(8, 2);
+ setLines();
+ setClickableLines();
+}
+
+void DifficultyDialog::setLines() {
+ Font *font = _vm->_font->getFont(FONT_CONVERSATION);
+ int yp = 78 - ((font->getHeight() + 1) * 4 + 6) / 2;
+
+ addQuote(41, 0, ALIGN_CENTER, Common::Point(0, yp), font);
+ yp += 6;
+
+ for (int id = 42; id <= 44; ++id) {
+ yp += font->getHeight();
+ addQuote(id, 0, ALIGN_CENTER, Common::Point(0, yp));
+ }
+}
+
+void DifficultyDialog::show() {
+ ScreenDialog::show();
+ Nebular::GameNebular &game = *(Nebular::GameNebular *)_vm->_game;
+
+ switch (_selectedLine) {
+ case 1:
+ game._difficulty = Nebular::DIFFICULTY_HARD;
+ break;
+ case 2:
+ game._difficulty = Nebular::DIFFICULTY_MEDIUM;
+ break;
+ case 3:
+ game._difficulty = Nebular::DIFFICULTY_EASY;
+ break;
+ default:
+ _vm->quitGame();
+ }
+}
+
+/*------------------------------------------------------------------------*/
+
+GameMenuDialog::GameMenuDialog(MADSEngine *vm) : ScreenDialog(vm) {
+ setFrame(1, 2);
+}
+
+void GameMenuDialog::addLines() {
+ initVars();
+ Font *font = _vm->_font->getFont(FONT_CONVERSATION);
+ int top = 78 - (font->getHeight() + 2) * 12;
+ addQuote(10, 0, ALIGN_CENTER, Common::Point(0, top), font);
+ // TODO
+}
+
+} // End of namespace Nebular
+
+} // End of namespace MADS
diff --git a/engines/mads/nebular/dialogs_nebular.h b/engines/mads/nebular/dialogs_nebular.h
new file mode 100644
index 0000000000..a144ee9d83
--- /dev/null
+++ b/engines/mads/nebular/dialogs_nebular.h
@@ -0,0 +1,223 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+
+ * You should have received a copy of the GNU General Public 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 MADS_DIALOGS_NEBULAR_H
+#define MADS_DIALOGS_NEBULAR_H
+
+#include "common/scummsys.h"
+#include "mads/game.h"
+#include "mads/dialogs.h"
+
+namespace MADS {
+
+namespace Nebular {
+
+enum CapitalizationMode { kUppercase = 0, kLowercase = 1, kUpperAndLower = 2 };
+
+class DialogsNebular : public Dialogs {
+ friend class Dialogs;
+private:
+ int _dialogWidth;
+ CapitalizationMode _capitalizationMode;
+
+ DialogsNebular(MADSEngine *vm): Dialogs(vm), _capitalizationMode(kUppercase), _dialogWidth(0) {}
+
+ virtual Common::String getVocab(int vocabId);
+
+ bool textNoun(Common::String &dest, int nounId, const Common::String &source);
+
+ bool commandCheck(const char *idStr, Common::String &valStr, const Common::String &command);
+public:
+ virtual void showDialog();
+
+ virtual void showItem(int objectId, int messageId, int speech = -1);
+
+ virtual bool show(int messageId, int objectId = -1);
+};
+
+struct HOGANUS {
+ int _bookId;
+ int _pageNum;
+ int _lineNum;
+ int _wordNum;
+ Common::String _word;
+};
+
+class CopyProtectionDialog : public TextDialog {
+private:
+ HOGANUS _hogEntry;
+
+ /**
+ * Get a random copy protection entry from the HOGANUS resource
+ */
+ bool getHogAnusEntry(HOGANUS &entry);
+public:
+ /**
+ * Constructor
+ */
+ CopyProtectionDialog(MADSEngine *vm, bool priorAnswerWrong);
+
+ /**
+ * Show the dialog
+ */
+ virtual void show();
+};
+
+class PictureDialog : public TextDialog {
+private:
+ int _objectId;
+ bool _cyclingActive;
+ byte _palette[PALETTE_SIZE];
+ uint32 _palFlags[PALETTE_COUNT];
+ RGBList _rgbList;
+protected:
+ virtual void save();
+
+ virtual void restore();
+public:
+ PictureDialog(MADSEngine *vm, const Common::Point &pos, int maxChars, int objectId);
+
+ virtual ~PictureDialog();
+};
+
+enum DialogTextAlign { ALIGN_CENTER = -1, ALIGN_AT_CENTER = -2, ALIGN_RIGHT = -3 };
+
+enum DialogState { DLGSTATE_UNSELECTED = 0, DLGSTATE_SELECTED = 1, DLGSTATE_FOCUSED = 2 };
+
+class ScreenDialog {
+ struct DialogLine {
+ bool _active;
+ DialogState _state;
+ Common::Point _pos;
+ int _textDisplayIndex;
+ Common::String _msg;
+ Font *_font;
+ int _widthAdjust;
+
+ DialogLine();
+ DialogLine(const Common::String &s);
+ };
+protected:
+ MADSEngine *_vm;
+ Common::Array<DialogLine> _lines;
+ int _v1;
+ int _v2;
+ bool _v3;
+ int _selectedLine;
+ bool _dirFlag;
+ int _screenId;
+ int _menuSpritesIndex;
+ int _lineIndex;
+ int _textLineCount;
+
+ /**
+ * Reset the lines list for the dialog
+ */
+ void clearLines();
+
+ /**
+ * Setup lines to be clickable
+ */
+ void setClickableLines();
+
+ /**
+ * Add a quote to the lines list
+ */
+ void addQuote(int id1, int id2, DialogTextAlign align, const Common::Point &pt, Font *font = nullptr);
+
+ /**
+ * Adds a line to the lines list
+ */
+ void addLine(const Common::String &msg, DialogTextAlign align, const Common::Point &pt, Font *font = nullptr);
+
+ /**
+ * Initializes variables
+ */
+ void initVars();
+
+ /**
+ * Sets the display for the screen background behind the dialog
+ */
+ void setFrame(int frameNumber, int depth);
+
+ /**
+ * Choose the background to display for the dialog
+ */
+ void chooseBackground();
+
+ /**
+ * Handle events whilst the dialog is active
+ */
+ void handleEvents();
+
+ /**
+ * Refresh the display of the dialog's text
+ */
+ void refreshText();
+public:
+ /**
+ * Constructor
+ */
+ ScreenDialog(MADSEngine *vm);
+
+ /**
+ * Destructor
+ */
+ virtual ~ScreenDialog() {}
+
+ /**
+ * Show the dialog
+ */
+ virtual void show();
+};
+
+class DifficultyDialog : public ScreenDialog {
+private:
+ /**
+ * Set the lines for the dialog
+ */
+ void setLines();
+public:
+ DifficultyDialog(MADSEngine *vm);
+
+ /**
+ * Show the dialog
+ */
+ virtual void show();
+};
+
+class GameMenuDialog : public ScreenDialog {
+private:
+ /**
+ * Add the lines for the Game Menu dialog
+ */
+ void addLines();
+public:
+ GameMenuDialog(MADSEngine *vm);
+
+};
+
+} // End of namespace Nebular
+
+} // End of namespace MADS
+
+#endif /* MADS_DIALOGS_NEBULAR_H */
diff --git a/engines/mads/nebular/game_nebular.cpp b/engines/mads/nebular/game_nebular.cpp
new file mode 100644
index 0000000000..d6d7a07e52
--- /dev/null
+++ b/engines/mads/nebular/game_nebular.cpp
@@ -0,0 +1,856 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+
+ * You should have received a copy of the GNU General Public 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 "mads/mads.h"
+#include "mads/game.h"
+#include "mads/screen.h"
+#include "mads/msurface.h"
+#include "mads/nebular/game_nebular.h"
+#include "mads/nebular/dialogs_nebular.h"
+#include "mads/nebular/globals_nebular.h"
+#include "mads/nebular/nebular_scenes.h"
+
+namespace MADS {
+
+namespace Nebular {
+
+GameNebular::GameNebular(MADSEngine *vm)
+ : Game(vm) {
+ _surface = new MSurface(MADS_SCREEN_WIDTH, MADS_SCENE_HEIGHT);
+ _storyMode = STORYMODE_NAUGHTY;
+ _difficulty = DIFFICULTY_HARD;
+}
+
+ProtectionResult GameNebular::checkCopyProtection() {
+ /*
+ // DEBUG: Flag copy protection failure
+ _globals[kCopyProtectFailed] = -1;
+
+ if (!ConfMan.getBool("copy_protection"))
+ return true;
+
+ * DEBUG: Disabled for now
+ CopyProtectionDialog *dlg = new CopyProtectionDialog(_vm, false);
+ dlg->show();
+ delete dlg;
+ */
+ return PROTECTION_SUCCEED;
+}
+
+void GameNebular::startGame() {
+ // Show the main menu
+ // TODO: Show the main menu here
+
+ // Check copy protection
+ ProtectionResult protectionResult = checkCopyProtection();
+ switch (protectionResult) {
+ case PROTECTION_FAIL:
+ // Copy protection failed
+ _scene._nextSceneId = 804;
+ initializeGlobals();
+ _globals[kCopyProtectFailed] = true;
+ return;
+ case PROTECTION_ESCAPE:
+ // User escaped out of copy protection dialog
+ _vm->quitGame();
+ return;
+ default:
+ // Copy protection check succeeded
+ break;
+ }
+
+ initSection(_sectionNumber);
+ _statusFlag = true;
+
+ _vm->_dialogs->_pendingDialog = DIALOG_DIFFICULTY;
+ _vm->_dialogs->showDialog();
+ _vm->_dialogs->_pendingDialog = DIALOG_NONE;
+
+ _priorSectionNumber = 0;
+ _priorSectionNumber = -1;
+ _scene._priorSceneId = 0;
+ _scene._currentSceneId = -1;
+ _scene._nextSceneId = 101;
+
+ initializeGlobals();
+}
+
+void GameNebular::initializeGlobals() {
+ int count, count2;
+ int bad;
+
+ _globals.reset();
+ _globals[kTalkInanimateCount] = 8;
+
+ /* Section #1 variables */
+ _globals[kNeedToStandUp] = true;
+ _globals[kTurkeyExploded] = false;
+ _globals[kMedicineCabinetOpen] = false;
+ _globals[kMedicineCabinetVirgin] = true;
+ _globals[kWatchedViewScreen] = false;
+ _globals[kHoovicAlive] = true;
+ _globals[kWaterInAPuddle] = false;
+
+ _globals[kFishIn105] = true;
+ _globals[kFishIn107] = true;
+ _globals[kFishIn108] = true;
+
+ /* Section #2 variables */
+ _globals[kLadderBroken] = false;
+ _globals[kBone202Status] = 0;
+ _globals[kRhotundaStatus] = RHOTUNDA_HUNGRY;
+ _globals[kMonkeyStatus] = MONKEY_AMBUSH_READY;
+ _globals[kMeteorologistStatus] = METEOROLOGIST_PRESENT;
+ _globals[kMeteorologistEverSeen] = false;
+ _globals[kMeteorologistWatch] = METEOROLOGIST_NORMAL;
+ _globals[kTeleporterCommand] = TELEPORTER_NONE;
+ _globals[kTeleporterUnderstood] = false;
+ _globals[kTwinklesStatus] = TWINKLES_AT_HOME;
+ _globals[kTwinklesApproached] = 0;
+
+ /* Section #3 variables */
+ _globals[kAfterHavoc] = false;
+ _globals[kKickedIn391Grate] = false;
+
+ /* Section #4 variables */
+ _globals[kBadFirstIngredient] = -1;
+ _objects[OBJ_CHARGE_CASES].setQuality(EXPLOSIVES_INSIDE, 0);
+ _globals[kHasPurchased] = false;
+ _globals[kBeenThruHelgaScene] = false;
+ _globals[kNextIngredient] = 0;
+ _globals[kHasSaidTimer] = false;
+ _globals[kHasSaidBinocs] = false;
+ _globals[kBottleDisplayed] = false;
+ _globals[kHasBeenScanned] = false;
+ _globals[kSomeoneHasExploded] = false;
+
+ // Generate a random ingredient list
+ for (count = 0; count < 4; ++count) {
+ do {
+ _globals[kIngredientList + count] = _vm->getRandomNumber(3);
+ bad = false;
+ for (count2 = 0; count2 < count; ++count2) {
+ if (_globals[kIngredientList + count] == _globals[kIngredientList + count2]) {
+ bad = true;
+ }
+ }
+ } while (bad);
+ }
+
+ // Generate random ingredient quantities
+ for (count = 0; count < 4; ++count) {
+ do {
+ _globals[kIngredientQuantity + count] = _vm->getRandomNumber(3);
+ bad = false;
+ for (count2 = 0; count2 < count; ++count2) {
+ if (_globals[kIngredientQuantity + count] == _globals[kIngredientQuantity + count2]) {
+ bad = true;
+ }
+ }
+ } while (bad);
+ }
+
+
+ /* Section #5 variables */
+ _globals[kHoverCarLocation] = 501;
+ _globals[kHoverCarDestination] = -1;
+ _globals[kCityFlooded] = false;
+ _globals[kBoatRaised] = true;
+ _globals[kLaserHoleIsThere] = false;
+ _globals[kLineStatus] = LINE_NOT_DROPPED;
+
+
+ /* Section #6 variables */
+ _globals[kHasTalkedToHermit] = false;
+ _globals[kHandsetCellStatus] = FIRST_TIME_PHONE_CELLS;
+ _globals[kTimebombStatus] = TIMEBOMB_DEACTIVATED;
+ _globals[kWarnedFloodCity] = false;
+ _globals._timebombClock = 0;
+ _globals._timebombTimer = 0;
+
+
+ /* Section #7 variables */
+ _globals[kBottleStatus] = BOTTLE_EMPTY;
+ _globals[kBoatStatus] = BOAT_UNFLOODED;
+
+
+ /* Section #8 variables */
+ _globals[kWindowFixed] = false;
+ _globals[kInSpace] = false;
+ _globals[kReturnFromCut] = false;
+ _globals[kBeamIsUp] = false;
+ _globals[kForceBeamDown] = false;
+ _globals[kCameFromCut] = false;
+ _globals[kDontRepeat] = false;
+ _globals[kHoppyDead] = false;
+ _globals[kHasWatchedAntigrav] = false;
+ _globals[kRemoteSequenceRan] = false;
+ _globals[kRemoteOnGround] = false;
+ _globals[kFromCockpit] = false;
+ _globals[kExitShip] = false;
+ _globals[kBetweenRooms] = false;
+ _globals[kTopButtonPushed] = false;
+ _globals[kShieldModInstalled] = false;
+ _globals[kTargetModInstalled] = false;
+ _globals[kUpBecauseOfRemote] = false;
+
+
+ /* Set up the game's teleporters */
+ _globals[kTeleporterRoom] = 201;
+ _globals[kTeleporterRoom + 1] = 301;
+ _globals[kTeleporterRoom + 2] = 413;
+ _globals[kTeleporterRoom + 3] = 706;
+ _globals[kTeleporterRoom + 4] = 801;
+ _globals[kTeleporterRoom + 5] = 551;
+ _globals[kTeleporterRoom + 6] = 752;
+ _globals[kTeleporterRoom + 7] = 0;
+ _globals[kTeleporterRoom + 8] = 0;
+ _globals[kTeleporterRoom + 9] = 0;
+
+ for (count = 0; count < TELEPORTER_COUNT; ++count) {
+ do {
+ _globals[kTeleporterCode + count] = _vm->getRandomNumber(9999);
+ bad = false;
+ for (count2 = 0; count2 < count; ++count2) {
+ if (_globals[kTeleporterCode + count] == _globals[kTeleporterCode + count2]) {
+ bad = true;
+ }
+ }
+ } while (bad);
+ }
+
+ // Final setup based on selected difficulty level
+ switch (_difficulty) {
+ case DIFFICULTY_HARD:
+ _objects.setRoom(OBJ_PLANT_STALK, NOWHERE);
+ _objects.setRoom(OBJ_PENLIGHT, NOWHERE);
+
+ _globals[kLeavesStatus] = LEAVES_ON_TRAP;
+ break;
+
+ case DIFFICULTY_MEDIUM:
+ _objects.setRoom(OBJ_PLANT_STALK, NOWHERE);
+
+ _globals[kLeavesStatus] = LEAVES_ON_GROUND;
+ _globals[kDurafailRecharged] = 1;
+ _globals[kPenlightCellStatus] = FIRST_TIME_CHARGED_DURAFAIL;
+ break;
+
+ case DIFFICULTY_EASY:
+ _objects.setRoom(OBJ_BLOWGUN, NOWHERE);
+ _objects.setRoom(OBJ_NOTE, NOWHERE);
+
+ _globals[kLeavesStatus] = LEAVES_ON_GROUND;
+ _globals[kPenlightCellStatus] = FIRST_TIME_UNCHARGED_DURAFAIL;
+ _globals[kDurafailRecharged] = 0;
+ break;
+ }
+
+ _player._facing = FACING_NORTH;
+ _player._turnToFacing = FACING_NORTH;
+
+ Player::preloadSequences("RXM", 1);
+ Player::preloadSequences("ROX", 1);
+}
+
+void GameNebular::setSectionHandler() {
+ delete _sectionHandler;
+
+ switch (_sectionNumber) {
+ case 1:
+ _sectionHandler = new Section1Handler(_vm);
+ break;
+ case 2:
+ _sectionHandler = new Section2Handler(_vm);
+ break;
+ case 3:
+ _sectionHandler = new Section3Handler(_vm);
+ break;
+ case 4:
+ _sectionHandler = new Section4Handler(_vm);
+ break;
+ case 5:
+ _sectionHandler = new Section5Handler(_vm);
+ break;
+ case 6:
+ _sectionHandler = new Section6Handler(_vm);
+ break;
+ case 7:
+ _sectionHandler = new Section7Handler(_vm);
+ break;
+ case 8:
+ _sectionHandler = new Section8Handler(_vm);
+ break;
+ default:
+ break;
+ }
+}
+
+void GameNebular::checkShowDialog() {
+ if (_vm->_dialogs->_pendingDialog && _player._stepEnabled && !_globals[kCopyProtectFailed]) {
+ _player.releasePlayerSprites();
+ _vm->_dialogs->showDialog();
+ _vm->_dialogs->_pendingDialog = DIALOG_NONE;
+ }
+}
+
+void GameNebular::showRecipe() {
+ Dialogs &dialogs = *_vm->_dialogs;
+ int count;
+
+ for (count = 0; count < 4; count++) {
+ switch(_globals[kIngredientQuantity + count]) {
+ case 0:
+ dialogs._indexList[count] = NOUN_DROP;
+ break;
+ case 1:
+ dialogs._indexList[count] = NOUN_DOLLOP;
+ break;
+ case 2:
+ dialogs._indexList[count] = NOUN_DASH;
+ break;
+ case 3:
+ dialogs._indexList[count] = NOUN_SPLASH;
+ break;
+ default:
+ break;
+ }
+ }
+
+ for (count = 0; count < 4; count++) {
+ switch(_globals[kIngredientList + count]) {
+ case 0:
+ dialogs._indexList[count + 4] = NOUN_ALCOHOL;
+ break;
+ case 1:
+ dialogs._indexList[count + 4] = NOUN_LECITHIN;
+ break;
+ case 2:
+ dialogs._indexList[count + 4] = NOUN_PETROX;
+ break;
+ case 3:
+ dialogs._indexList[count + 4] = NOUN_FORMALDEHYDE;
+ break;
+ default:
+ break;
+ }
+ }
+
+ _vm->_dialogs->show(401);
+}
+
+void GameNebular::doObjectAction() {
+ Scene &scene = _scene;
+ MADSAction &action = _scene._action;
+ Dialogs &dialogs = *_vm->_dialogs;
+ int id;
+
+ if (action.isAction(VERB_SMELL) && scene._currentSceneId > 103 && scene._currentSceneId < 111) {
+ dialogs.show(440);
+ } else if (action.isAction(VERB_EAT) && scene._currentSceneId > 103 && scene._currentSceneId < 111) {
+ dialogs.show(441);
+ } else if (action.isAction(VERB_SMELL, NOUN_BURGER)) {
+ dialogs.show(442);
+ } else if (action.isAction(VERB_EAT, NOUN_BURGER)) {
+ dialogs.show(443);
+ } else if (action.isAction(VERB_SMELL, NOUN_STUFFED_FISH)) {
+ dialogs.show(444);
+ } else if (action.isAction(VERB_EAT, NOUN_STUFFED_FISH)) {
+ dialogs.show(445);
+ } else if (action.isAction(VERB_WEAR, NOUN_REBREATHER)) {
+ dialogs.show(scene._currentSceneId > 103 && scene._currentSceneId < 111 ? 446 : 447);
+ } else if (action.isAction(VERB_SET, NOUN_TIMER_MODULE)) {
+ dialogs.show(448);
+ } else if (action.isAction(VERB_NIBBLE_ON, NOUN_BIG_LEAVES)) {
+ dialogs.show(449);
+ } else if (action.isAction(VERB_LICK, NOUN_POISON_DARTS)) {
+ dialogs.show(450);
+ } else if (action.isAction(VERB_EAT, NOUN_TWINKIFRUIT)) {
+ _objects.setRoom(OBJ_TWINKIFRUIT, NOWHERE);
+ dialogs.show(451);
+ } else if (action.isAction(VERB_GORGE_ON, NOUN_TWINKIFRUIT)) {
+ _objects.setRoom(OBJ_TWINKIFRUIT, NOWHERE);
+ dialogs.show(452);
+ } else if (action.isAction(VERB_GNAW_ON)) {
+ dialogs.show(453);
+ } else if (action.isAction(VERB_MASSAGE, NOUN_AUDIO_TAPE)) {
+ dialogs.show(454);
+ } else if (action.isAction(VERB_MANGLE, NOUN_CREDIT_CHIP)) {
+ dialogs.show(455);
+ } else if (action.isAction(VERB_FONDLE, NOUN_CHARGE_CASES)) {
+ dialogs.show(456);
+ } else if (action.isAction(VERB_RUB, NOUN_BOMB)) {
+ dialogs.show(457);
+ } else if (action.isAction(VERB_SET, NOUN_TIMEBOMB)) {
+ dialogs.show(458);
+ } else if (action.isAction(VERB_GUZZLE, NOUN_ALIEN_LIQUOR)) {
+ dialogs.show(459);
+ } else if (action.isAction(VERB_SMASH, NOUN_TARGET_MODULE)) {
+ dialogs.show(460);
+ } else if (action.isAction(VERB_JUGGLE)) {
+ dialogs.show(461);
+ } else if (action.isAction(VERB_APPLY, NOUN_POLYCEMENT)) {
+ dialogs.show(462);
+ } else if (action.isAction(VERB_SNIFF, NOUN_POLYCEMENT)) {
+ dialogs.show(465);
+ } else if (action.isAction(VERB_TIE, NOUN_FISHING_LINE)) {
+ dialogs.show(463);
+ } else if (action.isAction(VERB_ATTACH, NOUN_FISHING_LINE)) {
+ dialogs.show(463);
+ } else if (action.isAction(VERB_UNLOCK)) {
+ dialogs.show(464);
+ } else if (action.isAction(VERB_REFLECT)) {
+ dialogs.show(466);
+ } else if (action.isAction(VERB_GAZE_INTO, NOUN_REARVIEW_MIRROR)) {
+ dialogs.show(467);
+ } else if (action.isAction(VERB_EAT, NOUN_CHICKEN_BOMB)) {
+ dialogs.show(469);
+ } else if (action.isAction(VERB_BREAK, NOUN_VASE)) {
+ dialogs.show(471);
+ } else if (action.isAction(VERB_SHAKE_HANDS, NOUN_GUARDS_ARM2)) {
+ dialogs.show(472);
+ } else if (action.isAction(VERB_READ, NOUN_LOG)) {
+ dialogs.show(473);
+ } else if (action.isAction(VERB_RUB, NOUN_BOMBS)) {
+ dialogs.show(474);
+ } else if (action.isAction(VERB_DRINK, NOUN_FORMALDEHYDE)) {
+ dialogs.show(475);
+ } else if (action.isAction(VERB_DRINK, NOUN_PETROX)) {
+ dialogs.show(476);
+ } else if (action.isAction(VERB_DRINK, NOUN_LECITHIN)) {
+ dialogs.show(477);
+ } else if (action.isAction(VERB_PUT, NOUN_POISON_DARTS, NOUN_PLANT_STALK) && _objects.isInInventory(OBJ_POISON_DARTS)
+ && _objects.isInInventory(OBJ_PLANT_STALK)) {
+ _objects.addToInventory(OBJ_BLOWGUN);
+ _objects.setRoom(OBJ_PLANT_STALK, NOWHERE);
+ _globals[kBlowgunStatus] = 0;
+ dialogs.showItem(OBJ_BLOWGUN, 809);
+ } else if (action.isAction(VERB_PUT, NOUN_POISON_DARTS, NOUN_BLOWGUN) && _objects.isInInventory(OBJ_POISON_DARTS)
+ && _objects.isInInventory(OBJ_BLOWGUN)) {
+ dialogs.show(433);
+ } else if (action.isAction(VERB_DEFACE) && action.isAction(VERB_FOLD) && action.isAction(VERB_MUTILATE)) {
+ dialogs.show(434);
+ } else if (action.isAction(VERB_SPINDLE)) {
+ dialogs.show(479);
+ } else if ((action.isAction(VERB_READ) || action.isAction(VERB_LOOK_AT) || action.isAction(VERB_LOOK)) &&
+ action.isObject(NOUN_NOTE) && _objects.isInInventory(OBJ_NOTE)) {
+ _objects.setRoom(OBJ_NOTE, NOWHERE);
+ _objects.addToInventory(OBJ_COMBINATION);
+ dialogs.showItem(OBJ_COMBINATION, 851);
+ } else if ((action.isAction(VERB_LOOK) || action.isAction(VERB_READ)) &&
+ ((id = _objects.getIdFromDesc(action._activeAction._objectNameId)) > 0 ||
+ (action._activeAction._indirectObjectId > 0 &&
+ (id = _objects.getIdFromDesc(action._activeAction._indirectObjectId)))) &&
+ _objects.isInInventory(id)) {
+ if (id == OBJ_REPAIR_LIST) {
+ dialogs._indexList[0] = _globals[kTeleporterCode + 7];
+ dialogs._indexList[1] = _globals[kTeleporterCode + 8];
+ dialogs._indexList[2] = _globals[kTeleporterCode + 6];
+ dialogs._indexList[3] = _globals[kTeleporterCode + 9];
+ dialogs._indexList[4] = _globals[kTeleporterCode + 0];
+ dialogs._indexList[5] = _globals[kTeleporterCode + 1];
+ dialogs._indexList[6] = _globals[kTeleporterCode + 4];
+ dialogs._indexList[7] = _globals[kTeleporterCode + 5];
+ dialogs._indexList[8] = _globals[kTeleporterCode + 2];
+
+ dialogs.showItem(id, 402);
+ } else {
+ int messageId = 800 + id;
+ if ((id == OBJ_CHARGE_CASES) && _objects[OBJ_CHARGE_CASES].getQuality(3) != 0) {
+ messageId = 860;
+ }
+
+ if (id == OBJ_TAPE_PLAYER && _objects[OBJ_AUDIO_TAPE]._roomNumber == OBJ_TAPE_PLAYER)
+ messageId = 867;
+
+ if (id == 32 && _objects[OBJ_FISHING_LINE]._roomNumber == 3)
+ messageId = 862;
+
+ if (id == OBJ_BOTTLE && _globals[kBottleStatus] != 0)
+ messageId = 862 + _globals[kBottleStatus];
+
+ if (id == OBJ_PHONE_HANDSET && _globals[kHandsetCellStatus])
+ messageId = 861;
+
+ dialogs.showItem(id, messageId);
+ }
+ } else if (action.isAction(VERB_PUT, NOUN_BURGER, NOUN_DEAD_FISH)) {
+ if (_objects.isInInventory(OBJ_BURGER) || _objects.isInInventory(OBJ_DEAD_FISH)) {
+ _objects.removeFromInventory(OBJ_DEAD_FISH, PLAYER_INVENTORY);
+ _objects.removeFromInventory(OBJ_BURGER, PLAYER_INVENTORY);
+ _objects.addToInventory(OBJ_STUFFED_FISH);
+ dialogs.showItem(OBJ_STUFFED_FISH, 803);
+ }
+ } else if (action.isAction(VERB_PUT, NOUN_AUDIO_TAPE, NOUN_TAPE_PLAYER) && _objects.isInInventory(OBJ_AUDIO_TAPE) &&
+ _objects.isInInventory(OBJ_TAPE_PLAYER)) {
+ _objects.setRoom(OBJ_AUDIO_TAPE, OBJ_TAPE_PLAYER);
+ } else if (action.isAction(VERB_ACTIVATE, NOUN_TAPE_PLAYER) && _objects.isInInventory(OBJ_TAPE_PLAYER)) {
+ if (_objects[OBJ_AUDIO_TAPE]._roomNumber == OBJ_TAPE_PLAYER) {
+ showRecipe();
+ } else {
+ dialogs.show(406);
+ }
+ } else if (action.isAction(VERB_EJECT, NOUN_TAPE_PLAYER) && _objects.isInInventory(OBJ_TAPE_PLAYER)) {
+ if (_objects[OBJ_AUDIO_TAPE]._roomNumber == OBJ_TAPE_PLAYER) {
+ _objects.addToInventory(OBJ_AUDIO_TAPE);
+ } else {
+ dialogs.show(407);
+ }
+ } else if (action.isAction(VERB_DISASSEMBLE, NOUN_TAPE_PLAYER)) {
+ dialogs.show(408);
+ } else if (action.isAction(VERB_ACTIVATE, NOUN_REMOTE)) {
+ dialogs.show(_globals[kTopButtonPushed] ? 502 : 501);
+ } else if ((action.isAction(VERB_ATTACH, NOUN_DETONATORS, NOUN_CHARGE_CASES) || action.isAction(VERB_PUT, NOUN_DETONATORS, NOUN_CHARGE_CASES)) &&
+ _objects.isInInventory(OBJ_DETONATORS) && _objects.isInInventory(OBJ_CHARGE_CASES)) {
+ if (_objects[OBJ_CHARGE_CASES].getQuality(3)) {
+ _objects.setRoom(OBJ_CHARGE_CASES, NOWHERE);
+ _objects.setRoom(OBJ_DETONATORS, NOWHERE);
+ _objects.addToInventory(OBJ_BOMBS);
+ dialogs.showItem(OBJ_BOMBS, 403);
+ } else {
+ dialogs.show(405);
+ }
+ } else if (action.isAction(VERB_ATTACH, NOUN_DETONATORS)) {
+ dialogs.show(470);
+ } else if ((action.isAction(VERB_ATTACH, NOUN_TIMER_MODULE, NOUN_BOMBS) || action.isAction(VERB_PUT, NOUN_TIMER_MODULE, NOUN_BOMBS) || action.isAction(VERB_ATTACH, NOUN_TIMER_MODULE, NOUN_BOMB)
+ || action.isAction(VERB_PUT, NOUN_TIMER_MODULE, NOUN_BOMB)) && _objects.isInInventory(OBJ_TIMER_MODULE) && (
+ _objects.isInInventory(OBJ_BOMBS) || _objects.isInInventory(OBJ_BOMB))) {
+ if (_objects.isInInventory(OBJ_BOMBS)) {
+ _objects.setRoom(OBJ_BOMBS, NOWHERE);
+ _objects.addToInventory(OBJ_BOMB);
+ } else {
+ _objects.setRoom(OBJ_BOMB, NOWHERE);
+ }
+
+ _objects.setRoom(OBJ_TIMER_MODULE, NOWHERE);
+ _objects.addToInventory(OBJ_TIMEBOMB);
+ dialogs.showItem(OBJ_TIMEBOMB, 404);
+ } else if (action.isAction(VERB_FONDLE, NOUN_PLANT_STALK)) {
+ dialogs.show(410);
+ } else if (action.isAction(VERB_EMPTY, NOUN_BOTTLE)) {
+ _globals[kBottleStatus] = 0;
+ dialogs.show(432);
+ } else if (action.isAction(VERB_DISASSEMBLE, NOUN_FISHING_ROD)) {
+ if (_objects[OBJ_FISHING_LINE]._roomNumber == 3) {
+ _objects.addToInventory(OBJ_FISHING_LINE);
+ dialogs.showItem(OBJ_FISHING_LINE, 409);
+ } else {
+ dialogs.show(428);
+ }
+ } else if (action.isAction(VERB_DISASSEMBLE, NOUN_PENLIGHT)) {
+ switch (_globals[kPenlightCellStatus]) {
+ case 1:
+ case 2:
+ _objects.addToInventory(OBJ_DURAFAIL_CELLS);
+ dialogs.showItem(OBJ_DURAFAIL_CELLS, 412);
+ break;
+ case 3:
+ _objects.addToInventory(OBJ_PHONE_CELLS);
+ dialogs.showItem(OBJ_DURAFAIL_CELLS, 413);
+ break;
+ case 5:
+ _objects.addToInventory(OBJ_DURAFAIL_CELLS);
+ dialogs.showItem(OBJ_DURAFAIL_CELLS, 411);
+ break;
+ case 6:
+ _objects.addToInventory(OBJ_DURAFAIL_CELLS);
+ dialogs.showItem(OBJ_DURAFAIL_CELLS, 429);
+ break;
+ default:
+ dialogs.show(478);
+ break;
+ }
+ } else if (action.isAction(VERB_DISASSEMBLE, NOUN_PHONE_HANDSET)) {
+ switch (_globals[kHandsetCellStatus]) {
+ case 1:
+ _objects.addToInventory(OBJ_DURAFAIL_CELLS);
+ dialogs.showItem(OBJ_DURAFAIL_CELLS,
+ _difficulty != DIFFICULTY_HARD || _globals[kDurafailRecharged] ? 415 : 414);
+ _globals[kDurafailRecharged] = true;
+ break;
+ case 2:
+ _objects.addToInventory(OBJ_DURAFAIL_CELLS);
+ if (_difficulty == DIFFICULTY_HARD) {
+ dialogs.showItem(OBJ_DURAFAIL_CELLS, 416);
+ }
+ _globals[kHandsetCellStatus] = 0;
+ break;
+ case 3:
+ _objects.addToInventory(OBJ_PHONE_CELLS);
+ dialogs.showItem(OBJ_PHONE_CELLS, 418);
+ break;
+ case 4:
+ _objects.addToInventory(OBJ_PHONE_CELLS);
+ dialogs.showItem(OBJ_PHONE_CELLS, 417);
+ _globals[kHandsetCellStatus] = 0;
+ break;
+ default:
+ dialogs.show(478);
+ break;
+ }
+ } else if (action.isAction(VERB_PUT, NOUN_PHONE_CELLS, NOUN_PENLIGHT)) {
+ if (_globals[kPenlightCellStatus] == 0) {
+ _globals[kPenlightCellStatus] = 3;
+ _objects.setRoom(OBJ_PHONE_CELLS, NOWHERE);
+ dialogs.show(419);
+ } else {
+ dialogs.show(420);
+ }
+ } else if (action.isAction(VERB_PUT, NOUN_PHONE_CELLS, NOUN_PHONE_HANDSET)) {
+ if (_globals[kHandsetCellStatus] == 0) {
+ _globals[kHandsetCellStatus] = 3;
+ _objects.setRoom(OBJ_PHONE_CELLS, NOWHERE);
+ dialogs.show(421);
+ } else {
+ dialogs.show(422);
+ }
+ } else if (action.isAction(VERB_PUT, NOUN_DURAFAIL_CELLS, NOUN_PENLIGHT)) {
+ if (_globals[kPenlightCellStatus]) {
+ dialogs.show(424);
+ } else {
+ _objects.setRoom(OBJ_DURAFAIL_CELLS, NOWHERE);
+ _globals[kPenlightCellStatus] = _difficulty != DIFFICULTY_HARD || _globals[kDurafailRecharged] ? 1 : 2;
+ dialogs.show(423);
+ }
+ } else if (action.isAction(VERB_PUT, NOUN_DURAFAIL_CELLS, NOUN_PHONE_HANDSET)) {
+ if (_globals[kHandsetCellStatus]) {
+ dialogs.show(426);
+ } else {
+ _objects.setRoom(OBJ_DURAFAIL_CELLS, NOWHERE);
+ _globals[kHandsetCellStatus] = _difficulty != DIFFICULTY_HARD || _globals[kHandsetCellStatus] ? 1 : 2;
+ dialogs.show(425);
+ }
+ } else if (action.isAction(VERB_SET, NOUN_TIMEBOMB)) {
+ dialogs.show(427);
+ } else if (action.isAction(VERB_PUT, NOUN_BOMB, NOUN_CHICKEN) || action.isAction(VERB_PUT, NOUN_BOMBS, NOUN_CHICKEN)) {
+ _objects.setRoom(OBJ_CHICKEN, NOWHERE);
+ if (_objects.isInInventory(OBJ_BOMBS)) {
+ _objects.setRoom(OBJ_BOMBS, NOWHERE);
+ _objects.addToInventory(OBJ_BOMB);
+ } else {
+ _objects.setRoom(OBJ_BOMB, NOWHERE);
+ }
+
+ _objects.addToInventory(OBJ_CHICKEN_BOMB);
+ dialogs.showItem(OBJ_CHICKEN_BOMB, 430);
+ } else {
+ return;
+ }
+
+ action._inProgress = false;
+}
+
+void GameNebular::unhandledAction() {
+ int randVal = _vm->getRandomNumber(1, 1000);
+ MADSAction &action = _scene._action;
+
+ if (action.isAction(VERB_THROW, NOUN_BOMB) || action.isAction(VERB_THROW, NOUN_BOMBS)
+ || action.isAction(VERB_THROW, NOUN_TIMEBOMB) || action.isAction(VERB_THROW, NOUN_CHICKEN_BOMB))
+ _vm->_dialogs->show(42);
+ else if (action.isAction(VERB_DISASSEMBLE))
+ _vm->_dialogs->show(435);
+ else if ((action.isAction(VERB_EAT, NOUN_DEAD_FISH) || action.isAction(VERB_EAT, NOUN_STUFFED_FISH)) && _vm->_game->_objects.isInInventory(_vm->_game->_objects.getIdFromDesc(action._activeAction._objectNameId)))
+ _vm->_dialogs->show(12);
+ else if ((action.isAction(VERB_SMELL, NOUN_DEAD_FISH) || action.isAction(VERB_SMELL, NOUN_STUFFED_FISH)) && _vm->_game->_objects.isInInventory(_vm->_game->_objects.getIdFromDesc(action._activeAction._objectNameId)))
+ _vm->_dialogs->show(13);
+ else if (action.isAction(VERB_EAT, NOUN_CHICKEN) && _vm->_game->_objects.isInInventory(OBJ_CHICKEN))
+ _vm->_dialogs->show(912);
+ else if ((action.isAction(VERB_SHOOT) || action.isAction(VERB_HOSE_DOWN)) && action.isObject(NOUN_BLOWGUN)) {
+ if ((_scene._currentSceneId >= 104) && (_scene._currentSceneId <= 111))
+ _vm->_dialogs->show(38);
+ else if (action.isObject(NOUN_PIRANHA))
+ _vm->_dialogs->show(41);
+ else if (action.isObject(NOUN_CHICKEN) || action.isObject(NOUN_VULTURE) || action.isObject(NOUN_SPIDER)
+ || action.isObject(NOUN_YELLOW_BIRD) || action.isObject(NOUN_SWOOPING_CREATURE) || action.isObject(NOUN_CAPTIVE_CREATURE)) {
+ _vm->_dialogs->show(40);
+ } else
+ _vm->_dialogs->show(39);
+ } else if (action.isAction(VERB_TALKTO)) {
+ _globals[kTalkInanimateCount] = (_globals[kTalkInanimateCount] + 1) % 16;
+ if (!_globals[kTalkInanimateCount]) {
+ _vm->_dialogs->show(2);
+ } else {
+ Common::String tmpMsg = "\"Greetings, ";
+ tmpMsg += _vm->_game->_scene.getVocab(action._activeAction._objectNameId);
+ tmpMsg += "!\"";
+ _scene._kernelMessages.reset();
+ _scene._kernelMessages.add(Common::Point(0, 0), 0x1110, 34, 0, 120, tmpMsg);
+ }
+ } else if (action.isAction(VERB_GIVE, NOUN_DOOR, NOUN_CEILING) || action.isAction(VERB_CLOSE, NOUN_CHAIR))
+ _vm->_dialogs->show(3);
+ else if (action.isAction(VERB_THROW)) {
+ int objId = _vm->_game->_objects.getIdFromDesc(action._activeAction._objectNameId);
+ if (objId < 0)
+ _vm->_dialogs->show(4);
+ else if (_vm->_game->_objects[objId]._roomNumber != 2)
+ _vm->_dialogs->show(5);
+ else
+ _vm->_dialogs->show(6);
+ } else if (action.isAction(VERB_LOOK)) {
+ if (action.isObject(NOUN_BINOCULARS) && (action._activeAction._indirectObjectId > 0))
+ _vm->_dialogs->show(10);
+ else if (randVal < 600)
+ _vm->_dialogs->show(7);
+ else
+ _vm->_dialogs->show(21);
+ } else if (action.isAction(VERB_TAKE)) {
+ int objId = _vm->_game->_objects.getIdFromDesc(action._activeAction._objectNameId);
+ if (_vm->_game->_objects.isInInventory(objId))
+ _vm->_dialogs->show(16);
+ else if (randVal <= 333)
+ _vm->_dialogs->show(8);
+ else if (randVal <= 666)
+ _vm->_dialogs->show(22);
+ else
+ _vm->_dialogs->show(23);
+ } else if (action.isAction(VERB_CLOSE)) {
+ if (randVal <= 333)
+ _vm->_dialogs->show(9);
+ else
+ _vm->_dialogs->show(33);
+ } else if (action.isAction(VERB_OPEN)) {
+ if (randVal <= 500)
+ _vm->_dialogs->show(30);
+ else if (randVal <= 750)
+ _vm->_dialogs->show(31);
+ else
+ _vm->_dialogs->show(32);
+ } else if (action.isAction(VERB_PULL))
+ _vm->_dialogs->show(18);
+ else if (action.isAction(VERB_PUSH)) {
+ if (randVal < 750)
+ _vm->_dialogs->show(19);
+ else
+ _vm->_dialogs->show(20);
+ } else if (action.isAction(VERB_PUT)) {
+ int objId = _vm->_game->_objects.getIdFromDesc(action._activeAction._objectNameId);
+ if (_vm->_game->_objects.isInInventory(objId))
+ _vm->_dialogs->show(25);
+ else
+ _vm->_dialogs->show(24);
+ } else if (action.isAction(VERB_GIVE)) {
+ int objId = _vm->_game->_objects.getIdFromDesc(action._activeAction._objectNameId);
+ if (!_vm->_game->_objects.isInInventory(objId))
+ _vm->_dialogs->show(26);
+ else if (randVal <= 500)
+ _vm->_dialogs->show(28);
+ else
+ _vm->_dialogs->show(29);
+ } else if (!action.isAction(VERB_WALKTO) && !action.isAction(VERB_WALK_ACROSS) && !action.isAction(VERB_WALK_TOWARDS) && !action.isAction(VERB_WALK_DOWN)
+ && !action.isAction(VERB_SWIM_TO) && !action.isAction(VERB_SWIM_ACROSS) && !action.isAction(VERB_SWIM_INTO) && !action.isAction(VERB_SWIM_THROUGH)
+ && !action.isAction(VERB_SWIM_UNDER)) {
+ if (randVal <= 100)
+ _vm->_dialogs->show(36);
+ else if (randVal <= 200)
+ _vm->_dialogs->show(1);
+ else if (randVal <= 475)
+ _vm->_dialogs->show(34);
+ else if (randVal <= 750)
+ _vm->_dialogs->show(35);
+ else
+ _vm->_dialogs->show(37);
+ }
+}
+
+void GameNebular::step() {
+ if (_player._visible && _player._stepEnabled && !_player._moving &&
+ (_player._facing == _player._turnToFacing)) {
+ if (_scene._frameStartTime >= *((uint32 *)&_globals[kWalkerTiming])) {
+ if (!_player._stopWalkerIndex) {
+ int randomVal = _vm->getRandomNumber(29999);;
+ if (_globals[kSexOfRex] == REX_MALE) {
+ switch (_player._facing) {
+ case FACING_SOUTHWEST:
+ case FACING_SOUTHEAST:
+ case FACING_NORTHWEST:
+ case FACING_NORTHEAST:
+ if (randomVal < 200) {
+ _player.addWalker(-1, 0);
+ _player.addWalker(1, 0);
+ }
+ break;
+
+ case FACING_WEST:
+ case FACING_EAST:
+ if (randomVal < 500) {
+ for (int count = 0; count < 10; ++count) {
+ _player.addWalker(1, 0);
+ }
+ }
+ break;
+
+ case FACING_SOUTH:
+ if (randomVal < 500) {
+ for (int count = 0; count < 10; ++count) {
+ _player.addWalker((randomVal < 250) ? 1 : 2, 0);
+ }
+ } else if (randomVal < 750) {
+ for (int count = 0; count < 5; ++count) {
+ _player.addWalker(1, 0);
+ }
+
+ _player.addWalker(0, 0);
+ _player.addWalker(0, 0);
+
+ for (int count = 0; count < 5; ++count) {
+ _player.addWalker(2, 0);
+ }
+ }
+ break;
+
+ default:
+ break;
+ }
+ }
+ }
+
+ *((uint32 *)&_globals[kWalkerTiming]) += 6;
+ }
+ }
+
+ // Below is countdown to set the timebomb off in room 604
+ if (_globals[kTimebombStatus] == TIMEBOMB_ACTIVATED) {
+ int diff = _scene._frameStartTime - *((uint32 *)&_globals[kTimebombClock]);
+ if ((diff >= 0) && (diff <= 60)) {
+ *((uint32 *)&_globals[kTimebombTimer]) += diff;
+ } else {
+ ++*((uint32 *)&_globals[kTimebombTimer]);
+ }
+ *((uint32 *)&_globals[kTimebombClock]) = _scene._frameStartTime;
+ }
+}
+
+void GameNebular::synchronize(Common::Serializer &s, bool phase1) {
+ Game::synchronize(s, phase1);
+
+ if (phase1) {
+ _globals.synchronize(s);
+ s.syncAsByte(_storyMode);
+ s.syncAsByte(_difficulty);
+ }
+}
+
+} // End of namespace Nebular
+
+} // End of namespace MADS
diff --git a/engines/mads/nebular/game_nebular.h b/engines/mads/nebular/game_nebular.h
new file mode 100644
index 0000000000..da607d47ee
--- /dev/null
+++ b/engines/mads/nebular/game_nebular.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 MADS_GAME_NEBULAR_H
+#define MADS_GAME_NEBULAR_H
+
+#include "common/scummsys.h"
+#include "mads/game.h"
+#include "mads/globals.h"
+#include "mads/nebular/globals_nebular.h"
+
+namespace MADS {
+
+namespace Nebular {
+
+enum StoryMode { STORYMODE_NAUGHTY = 1, STORYMODE_NICE = 2 };
+
+enum Difficulty {
+ DIFFICULTY_HARD = 1, DIFFICULTY_MEDIUM = 2, DIFFICULTY_EASY = 3
+};
+
+
+enum ProtectionResult {
+ PROTECTION_SUCCEED = 0, PROTECTION_FAIL = 1, PROTECTION_ESCAPE = 2
+};
+
+enum InventoryObject {
+ OBJ_NONE = -1,
+ OBJ_BINOCULARS = 0,
+ OBJ_BURGER = 1,
+ OBJ_DEAD_FISH = 2,
+ OBJ_STUFFED_FISH = 3,
+ OBJ_REBREATHER = 4,
+ OBJ_TIMER_MODULE = 5,
+ OBJ_BIG_LEAVES = 6,
+ OBJ_POISON_DARTS = 7,
+ OBJ_PLANT_STALK = 8,
+ OBJ_BLOWGUN = 9,
+ OBJ_TWINKIFRUIT = 10,
+ OBJ_BONE = 11,
+ OBJ_CHICKEN = 12,
+ OBJ_SCALPEL = 13,
+ OBJ_AUDIO_TAPE = 14,
+ OBJ_CREDIT_CHIP = 15,
+ OBJ_SECURITY_CARD = 16,
+ OBJ_CHARGE_CASES = 17,
+ OBJ_ESTROTOXIN = 18,
+ OBJ_BOMB = 19,
+ OBJ_TIMEBOMB = 20,
+ OBJ_REPAIR_LIST = 21,
+ OBJ_ALIEN_LIQUOR = 22,
+ OBJ_TARGET_MODULE = 23,
+ OBJ_SHIELD_MODULATOR = 24,
+ OBJ_TAPE_PLAYER = 25,
+ OBJ_PHONE_CELLS = 26,
+ OBJ_PENLIGHT = 27,
+ OBJ_DURAFAIL_CELLS = 28,
+ OBJ_FAKE_ID = 29,
+ OBJ_ID_CARD = 30,
+ OBJ_POLYCEMENT = 31,
+ OBJ_FISHING_ROD = 32,
+ OBJ_FISHING_LINE = 33,
+ OBJ_PADLOCK_KEY = 34,
+ OBJ_DOOR_KEY = 35,
+ OBJ_REARVIEW_MIRROR = 36,
+ OBJ_COMPACT_CASE = 37,
+ OBJ_DETONATORS = 39,
+ OBJ_BOTTLE = 40,
+ OBJ_CHICKEN_BOMB = 41,
+ OBJ_VASE = 42,
+ OBJ_REMOTE = 43,
+ OBJ_COMPUTER_GAME = 44,
+ OBJ_PHONE_HANDSET = 45,
+ OBJ_BONES = 46,
+ OBJ_GUARDS_ARM = 47,
+ OBJ_LOG = 48,
+ OBJ_BOMBS = 49,
+ OBJ_NOTE = 50,
+ OBJ_COMBINATION = 51,
+ OBJ_FORMALDEHYDE = 52,
+ OBJ_PETROX = 53,
+ OBJ_LECITHIN = 54
+};
+
+class GameNebular : public Game {
+ friend class Game;
+private:
+ ProtectionResult checkCopyProtection();
+protected:
+ GameNebular(MADSEngine *vm);
+
+ virtual void startGame();
+
+ virtual void initializeGlobals();
+
+ virtual void setSectionHandler();
+
+ virtual void checkShowDialog();
+public:
+ NebularGlobals _globals;
+ StoryMode _storyMode;
+ Difficulty _difficulty;
+
+ virtual Globals &globals() { return _globals; }
+
+ virtual void doObjectAction();
+
+ void showRecipe();
+
+ virtual void unhandledAction();
+
+ virtual void step();
+
+ virtual void synchronize(Common::Serializer &s, bool phase1);
+};
+
+
+class Section1Handler : public SectionHandler {
+public:
+ Section1Handler(MADSEngine *vm) : SectionHandler(vm) {}
+
+ // TODO: Properly implement handler methods
+ virtual void preLoadSection() {}
+ virtual void sectionPtr2() {}
+ virtual void postLoadSection() {}
+};
+
+// TODO: Properly implement handler classes
+typedef Section1Handler Section2Handler;
+typedef Section1Handler Section3Handler;
+typedef Section1Handler Section4Handler;
+typedef Section1Handler Section5Handler;
+typedef Section1Handler Section6Handler;
+typedef Section1Handler Section7Handler;
+typedef Section1Handler Section8Handler;
+
+} // End of namespace Nebular
+
+} // End of namespace MADS
+
+#endif /* MADS_GAME_NEBULAR_H */
diff --git a/engines/mads/nebular/globals_nebular.cpp b/engines/mads/nebular/globals_nebular.cpp
new file mode 100644
index 0000000000..9f8b8a7888
--- /dev/null
+++ b/engines/mads/nebular/globals_nebular.cpp
@@ -0,0 +1,55 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ */
+
+#include "common/scummsys.h"
+#include "common/config-manager.h"
+#include "mads/nebular/globals_nebular.h"
+
+namespace MADS {
+
+namespace Nebular {
+
+NebularGlobals::NebularGlobals()
+ : Globals() {
+ // Initialize lists
+ resize(210);
+ _spriteIndexes.resize(30);
+ _sequenceIndexes.resize(30);
+
+ // Initialize game flags
+ _timebombClock = 0;
+ _timebombTimer = 0;
+}
+
+void NebularGlobals::synchronize(Common::Serializer &s) {
+ Globals::synchronize(s);
+
+ s.syncAsUint32LE(_timebombClock);
+ s.syncAsUint32LE(_timebombTimer);
+ _spriteIndexes.synchronize(s);
+ _sequenceIndexes.synchronize(s);
+}
+
+
+} // End of namespace Nebular
+
+} // End of namespace MADS
diff --git a/engines/mads/nebular/globals_nebular.h b/engines/mads/nebular/globals_nebular.h
new file mode 100644
index 0000000000..bd1c6d84b0
--- /dev/null
+++ b/engines/mads/nebular/globals_nebular.h
@@ -0,0 +1,315 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+
+ * You should have received a copy of the GNU General Public 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 MADS_GLOBALS_NEBULAR_H
+#define MADS_GLOBALS_NEBULAR_H
+
+#include "common/scummsys.h"
+#include "common/array.h"
+#include "mads/game.h"
+#include "mads/resources.h"
+
+namespace MADS {
+
+namespace Nebular {
+
+enum GlobalId {
+ kSexOfRex = 0,
+ kOldSexOfRex = 1,
+ kWalkerTiming = 2,
+// kWalkerTiming0 = 3,
+ kTalkInanimateCount = 4,
+ kCopyProtectFailed = 5,
+
+ /* Section #1 variables */
+ kNeedToStandUp = 10,
+ kTurkeyExploded = 11,
+ kMedicineCabinetOpen = 12,
+ kMedicineCabinetVirgin = 13,
+ kWatchedViewScreen = 14,
+ kHoovicAlive = 15,
+ kHoovicSated = 16,
+ kHoovicFishEaten = 17,
+ kWaterInAPuddle = 18,
+ kFishIn105 = 19,
+ kFishIn107 = 20,
+ kFishIn108 = 21,
+ kRandomNumber = 29,
+
+ /* Section #2 variables */
+ kCurtainOpen = 30,
+ kLadderBroken = 31,
+ kBone202Status = 32,
+ kMeteorologistStatus = 33,
+ kRhotundaStatus = 34,
+ kLeavesStatus = 35,
+ kMonkeyStatus = 36,
+ kMeteorologistEverSeen = 37,
+ kMeteorologistWatch = 38,
+ kTeleporterCommand = 39,
+
+ kTeleporterDestination = 40,
+ kTeleporterUnderstood = 41,
+ kConv205 = 42,
+ kChickenPermitted = 43,
+ kTwinklesStatus = 44,
+ kTwinklesApproached = 45,
+ kConvTwinkles1 = 46,
+ kConvTwinkles2 = 47,
+ kConvTwinkles3 = 48,
+ kConvTwinkles5 = 49,
+
+ kConvTwinkles6 = 50,
+ kConvTwinkles7 = 51,
+ kConvTwinkles8 = 52,
+ kBlowgunStatus = 53,
+
+ /* Section #3 Variables */
+ kAfterHavoc = 60,
+ kHaveYourStuff = 61,
+ kRightView320 = 62,
+ kConvBuddy1 = 63,
+ kConvBuddy2 = 64,
+ kMetBuddyBeast = 65,
+ kKnowsBuddyBeast = 66,
+ kConvSlache1 = 67,
+ kConvSlache2 = 68,
+ kConvSlache3 = 69,
+
+ kRexHasMetSlache = 70,
+ kConvIntern = 71,
+ kHasSeenProfPyro = 72,
+ kKickedIn391Grate = 73,
+
+ /* Section #4 Variables */
+ kArmoryDoorOpen = 80,
+ kStorageDoorOpen = 81,
+ kNextIngredient = 82,
+ kIngredientList = 83,
+ kIngredientList1 = 84,
+ kIngredientList2 = 85,
+ kIngredientList3 = 86,
+ kIngredientQuantity = 87,
+ kIngredientQuantity1 = 88,
+ kIngredientQuantity2 = 89,
+
+ kIngredientQuantity3 = 90,
+ kconvPyro_1 = 91,
+ kconvPyro_2 = 92,
+ kconvPyro_3 = 93,
+ kconvPyro_4 = 94,
+ kBadFirstIngredient = 95,
+ kConvBartender1 = 96,
+ kConvBartender2 = 97,
+ kConvBartender3 = 98,
+ kConvBartender4 = 99,
+
+ kHasPurchased = 100,
+ kBeenThruHelgaScene = 101,
+ kHasSaidBinocs = 102,
+ kHasSaidTimer = 103,
+ kBottleDisplayed = 104,
+ kHasBeenScanned = 105,
+ kSomeoneHasExploded = 106,
+
+ /* Section #5 Variables */
+ kBoatRaised = 110,
+ kCarStatus = 111,
+ kCityFlooded = 112,
+ kLaserOn = 113,
+ kLaserHoleIsThere = 114,
+ kCarIsGone = 115,
+ kRegisterOpen = 116,
+ kSafeStatus = 117,
+ kDogStatus = 118,
+ kLineStatus = 119,
+
+ kHoverCarLocation = 120,
+ kHoverCarDestination = 121,
+
+ /* Section #6 Variables */
+ kConvHermit1 = 130,
+ kconvHermit2 = 131,
+ kHasTalkedToHermit = 132,
+ kExecuted_1_11 = 133,
+ kHandsetCellStatus = 134,
+ kBeenInVideoStore = 135,
+ kDurafailRecharged = 136,
+ kPenlightCellStatus = 137,
+ kTimebombStatus = 138,
+ kCheckDaemonTimebomb = 140,
+
+ kResurrectRoom = 141,
+
+ /* Section #6 Time-Bomb Variables */
+ kTimebombClock = 142,
+// kTimebombClock0 = 143,
+ kTimebombTimer = 144,
+// kTimebombTimer0 = 145,
+ kWarnedFloodCity = 146,
+
+ /* Section #7 Variables */
+ kBottleStatus = 150,
+ kMonsterAlive = 151,
+ kConvBottleFillNode = 152,
+ kBoatStatus = 153,
+
+ /* Section #8 Variables */
+ kAntigravClock = 160,
+// kAntigravClock0 = 161,
+ kAntigravTiming = 162,
+// kAntigravTiming0 = 163,
+ kWindowFixed = 164,
+ kInSpace = 165,
+ kReturnFromCut = 166,
+ kBeamIsUp = 167,
+ kForceBeamDown = 168,
+ kCameFromCut = 169,
+
+ kCutX = 170,
+ kCutY = 171,
+ kCutFacing = 172,
+ kDontRepeat = 173,
+ kHoppyDead = 174,
+ kHasWatchedAntigrav = 175,
+ kRemoteSequenceRan = 176,
+ kRemoteOnGround = 177,
+ kFromCockpit = 178,
+ kExitShip = 179,
+
+ kBetweenRooms = 180,
+ kTopButtonPushed = 181,
+ kTargetModInstalled = 182,
+ kShieldModInstalled = 183,
+ kUpBecauseOfRemote = 184,
+
+ kTeleporterRoom = 190,
+ kTeleporterCode = 200
+};
+
+// Enums used for specific individual globals
+// Section #1
+// Rex's sex/swimming state
+enum { REX_MALE = 0, REX_MALE_SWIMMER = 1, REX_FEMALE = 2 };
+
+// Section #2
+// State of Meteorologist in the outpost
+enum { METEOROLOGIST_ABSENT = 0, METEOROLOGIST_PRESENT = 1, METEOROLOGIST_GONE = 2 };
+
+// State of watching the Meteorologist
+enum { METEOROLOGIST_NORMAL = 0, METEOROLOGIST_GROUND = 1, METEOROLOGIST_TOWER = 2 };
+
+// The fat bouncy lady that can squish you on the plains
+enum { RHOTUNDA_HUNGRY = 0, RHOTUNDA_STUCK = 1, RHOTUNDA_GONE = 2 };
+
+// Flags for the bones you can take
+enum { BONE_202_LEFT_GONE = 1, BONE_202_RIGHT_GONE = 2 };
+
+// Leaves used to cover the trap
+enum { LEAVES_ON_GROUND = 0, LEAVES_WITH_PLAYER = 1, LEAVES_ON_TRAP = 2 };
+
+// Monkey ambush state
+enum { MONKEY_AMBUSH_READY = 0, MONKEY_HAS_BINOCULARS = 1, MONKEY_IS_GONE = 2 };
+
+// Teleporter status flags
+enum {
+ TELEPORTER_NONE = 0, TELEPORTER_BEAM_IN = 1, TELEPORTER_BEAM_OUT = 2,
+ TELEPORTER_STEP_OUT = 3, TELEPORTER_WRONG = 4
+};
+
+// Twinkles status
+enum { TWINKLES_AT_HOME = 0, TWINKLES_GONE = 1 };
+
+// Section #4
+// Status of the explosives
+enum { EXPLOSIVES_INSIDE = 3 };
+
+// Section #5
+// Dog status (room 602, outside Abdul's garage)
+enum { DOG_PRESENT = 1, DOG_LEFT = 2, DOG_GONE = 3, DOG_DEAD = 4 };
+
+// Dog status (room 608, inside Abdul's garage)
+enum { CAR_UP = 0, CAR_SQUASHES_DOG = 1, CAR_SQUASHES_DOG_AGAIN = 2, CAR_DOWN = 3, CAR_DOWN_ON_SQUASHED_DOG = 4 };
+
+enum { SAFE_CLOSED = 0, SAFE_OPENED = 1, SAFE_CLOSED_WITH_HOLE = 2, SAFE_OPENED_WITH_HOLE = 3 };
+
+enum { LINE_NOT_DROPPED = 1, LINE_DROPPED = 2, LINE_TIED = 3, LINE_NOW_UNTIED = 4 };
+
+// Section #6
+enum {
+ NO_CELLS = 0, // Handset doesn't contain any cells
+ CHARGED_DURAFAIL = 1, // Handset has charged durafail cells
+ UNCHARGED_DURAFAIL = 2, // Handset has uncharged durafail cells */
+ PHONE_CELLS = 3, // Handset has already charged phone cells
+ FIRST_TIME_PHONE_CELLS = 4, // First time phone cells are in the handset
+ FIRST_TIME_UNCHARGED_DURAFAIL = 5, // First time uncharged cells are in penlight
+ FIRST_TIME_CHARGED_DURAFAIL = 6 // First time charged cells are in penlight
+};
+
+// Time bomb status
+enum {
+ TIMEBOMB_DEACTIVATED = 0, TIMEBOMB_ACTIVATED = 1,
+ TIMEBOMB_BLOW_UP = 2, TIMEBOMB_DEAD = 3
+};
+
+/* Section #7 */
+// Status of the the bottle
+enum {
+ BOTTLE_EMPTY = 0, BOTTLE_ONE_QUARTER_FULL = 1, BOTTLE_HALF_FULL = 2,
+ BOTTLE_THREE_QUARTERS_FULL = 3, BOTTLE_FULL = 4
+};
+
+// Status of the boat
+enum {
+ BOAT_UNFLOODED = 0, BOAT_ADRIFT = 1, BOAT_TIED_FLOATING = 2,
+ BOAT_TIED = 3, BOAT_GONE = 4
+};
+
+
+/* Miscellaneous defines */
+#define TELEPORTER_COUNT 10 // Total number of teleporters
+#define TELEPORTER_WORK_COUNT 6 // Total number that actually work
+
+
+class NebularGlobals : public Globals {
+public:
+ SynchronizedList _spriteIndexes;
+ SynchronizedList _sequenceIndexes;
+
+ int _timebombClock, _timebombTimer;
+public:
+ /**
+ * Constructor
+ */
+ NebularGlobals();
+
+ /**
+ * Synchronize the globals data
+ */
+ virtual void synchronize(Common::Serializer &s);
+};
+
+} // End of namespace Nebular
+
+} // End of namespace MADS
+
+#endif /* MADS_GLOBALS_NEBULAR_H */
diff --git a/engines/mads/nebular/nebular_scenes.cpp b/engines/mads/nebular/nebular_scenes.cpp
new file mode 100644
index 0000000000..c71512ed4c
--- /dev/null
+++ b/engines/mads/nebular/nebular_scenes.cpp
@@ -0,0 +1,628 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+
+ * You should have received a copy of the GNU General Public 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 "mads/mads.h"
+#include "mads/compression.h"
+#include "mads/resources.h"
+#include "mads/scene.h"
+#include "mads/nebular/game_nebular.h"
+#include "mads/nebular/nebular_scenes.h"
+#include "mads/nebular/nebular_scenes1.h"
+#include "mads/nebular/nebular_scenes2.h"
+#include "mads/nebular/nebular_scenes3.h"
+#include "mads/nebular/nebular_scenes4.h"
+#include "mads/nebular/nebular_scenes5.h"
+#include "mads/nebular/nebular_scenes6.h"
+#include "mads/nebular/nebular_scenes7.h"
+#include "mads/nebular/nebular_scenes8.h"
+
+namespace MADS {
+
+namespace Nebular {
+
+SceneLogic *SceneFactory::createScene(MADSEngine *vm) {
+ Scene &scene = vm->_game->_scene;
+
+ scene.addActiveVocab(NOUN_DROP);
+ scene.addActiveVocab(NOUN_DOLLOP);
+ scene.addActiveVocab(NOUN_DASH);
+ scene.addActiveVocab(NOUN_SPLASH);
+ scene.addActiveVocab(NOUN_ALCOHOL);
+
+ switch (scene._nextSceneId) {
+ // Scene group #1 (ship, ocean, cave)
+ case 101: // Ship, cockpit
+ return new Scene101(vm);
+ case 102: // Ship, dining room
+ return new Scene102(vm);
+ case 103: // Ship, engine room
+ return new Scene103(vm);
+ case 104: // Ocean, northwest cliff
+ return new Scene104(vm);
+ case 105: // Ocean, northeast cliff with mine
+ return new Scene105(vm);
+ case 106: // Ocean, outside ship
+ return new Scene106(vm);
+ case 107: // Ocean, bushes
+ return new Scene107(vm);
+ case 108: // Ocean, southwest cliff
+ return new Scene108(vm);
+ case 109: // Ocean, tunnel
+ return new Scene109(vm);
+ case 110: // Ocean, cave with tunnel
+ return new Scene110(vm);
+ case 111: // Cave with pool and opening
+ return new Scene111(vm);
+ case 112: // cutscene, looking at view screen
+ return new Scene112(vm);
+
+ // Scene group #2 (island)
+ case 201: // outside teleporter
+ return new Scene201(vm);
+ case 202: // village
+ return new Scene202(vm);
+ case 203: // tree with Rhotunda (fat woman)
+ return new Scene203(vm);
+ case 205: // village
+ return new Scene205(vm);
+ case 207: // outside witch doctor's hut
+ return new Scene207(vm);
+ case 208: // pit with leaves (trap)
+ return new Scene208(vm);
+ case 209: // palm tree and bamboo plant
+ return new Scene209(vm);
+ case 210: // outside native woman's hut
+ return new Scene210(vm);
+ case 211: // palm tree with monkey
+ return new Scene211(vm);
+ case 212: // outside cave
+ return new Scene212(vm);
+ case 213: // inside teleporter
+ return new Scene213(vm);
+ case 214: // inside witch doctor's hut
+ return new Scene214(vm);
+ case 215: // inside native woman's hut
+ return new Scene215(vm);
+ case 216: // cutscene, monitor showing Rex and native woman
+ return new Scene216(vm);
+
+ // Scene group #3 (women's base, cell block)
+ case 301: // outside teleporter (before chaos)
+ return new Scene301(vm);
+ case 302: // room with statue (before chaos)
+ return new Scene302(vm);
+ case 303: // western corridor (before chaos)
+ return new Scene303(vm);
+ case 304: // crossing with traffic light (before chaos)
+ return new Scene304(vm);
+ case 307: // Rex's cell (before chaos)
+ return new Scene307(vm);
+ case 308: // sauropod's cell (before chaos)
+ return new Scene308(vm);
+ case 309: // multihand monster's cell (before chaos)
+ return new Scene309(vm);
+ case 310: // empty cell (before chaos)
+ return new Scene310(vm);
+ case 311: // warden's desk (before chaos)
+ return new Scene311(vm);
+ case 313: // air shaft overview
+ return new Scene313(vm);
+ case 316: // Gender Bender
+ return new Scene316(vm);
+ case 318: // doctor's gurney
+ return new Scene318(vm);
+ case 319: // doctor Slache closeup (lying on the gurney)
+ return new Scene319(vm);
+ case 320: // warden's desk closeup / monitors
+ return new Scene320(vm);
+ case 321: // gender bender sex change sequence
+ return new Scene321(vm);
+ case 322: // inside teleporter
+ return new Scene322(vm);
+ case 351: // outside teleporter (after chaos)
+ return new Scene351(vm);
+ case 352: // room with statue (after chaos)
+ return new Scene352(vm);
+ case 353: // western corridor (after chaos)
+ return new Scene353(vm);
+ case 354: // crossing with traffic light (after chaos)
+ return new Scene354(vm);
+ case 357: // Rex's cell (after chaos)
+ return new Scene357(vm);
+ case 358: // sauropod's cell (after chaos)
+ return new Scene358(vm);
+ case 359: // multihand monster's cell (after chaos)
+ return new Scene359(vm);
+ case 360: // empty cell (after chaos)
+ return new Scene360(vm);
+ case 361: // warden's desk (after chaos)
+ return new Scene361(vm);
+ case 366: // air shaft ending at Gender Bender
+ return new Scene366(vm);
+ case 387: // air shaft ending at cell
+ return new Scene387(vm);
+ case 388: // air shaft ending at sauropod's cell
+ return new Scene388(vm);
+ case 389: // air shaft ending at multihand monster's cell (before chaos)
+ return new Scene389(vm);
+ case 390: // air shaft ending at cell
+ return new Scene390(vm);
+ case 391: // air shaft ending at warden's desk
+ return new Scene391(vm);
+ case 399: // air shaft ending at multihand monster's cell (after chaos)
+ return new Scene399(vm);
+
+ // Scene group #4 (women's base)
+ case 401: // outside bar
+ return new Scene401(vm);
+ case 402: // inside bar
+ return new Scene402(vm);
+ case 405: // outside armory
+ return new Scene405(vm);
+ case 406: // outside storage room
+ return new Scene406(vm);
+ case 407: // eastern corridor
+ return new Scene407(vm);
+ case 408: // inside armory
+ return new Scene408(vm);
+ case 409: // inside female only teleporter
+ return new Scene409(vm);
+ case 410: // inside storage room
+ return new Scene410(vm);
+ case 411: // lab
+ return new Scene411(vm);
+ case 413: // outside female only teleporter
+ return new Scene413(vm);
+
+ // Scene group #5 (men's city, lower floor)
+ case 501: // outside car
+ return new Scene501(vm);
+ case 502: // inside male only teleporter
+ return new Scene502(vm);
+ case 503: // guard tower
+ return new Scene503(vm);
+ case 504: // inside car
+ return new Scene504(vm);
+ case 505: // car view screen
+ return new Scene505(vm);
+ case 506: // shopping street
+ return new Scene506(vm);
+ case 507: // inside software house
+ return new Scene507(vm);
+ case 508: // laser cannon
+ return new Scene508(vm);
+ case 511: // outside pleasure dome
+ return new Scene511(vm);
+ case 512: // inside pleasure dome
+ return new Scene512(vm);
+ case 513: // outside mall
+ return new Scene513(vm);
+ case 515: // overview
+ return new Scene515(vm);
+ case 551: // outside teleporter (with skeleton)
+ return new Scene551(vm);
+
+ // Scene group #6 (men's city, upper floor)
+ case 601: // outside Bruce's house
+ return new Scene601(vm);
+ case 602: // Bruce's house, living room
+ return new Scene602(vm);
+ case 603: // Bruce's house, bedroom
+ return new Scene603(vm);
+ case 604: // viewport
+ return new Scene604(vm);
+ case 605: // viewport closeup
+ return new Scene605(vm);
+ case 607: // outside Abdul's garage
+ return new Scene607(vm);
+ case 608: // inside Abdul's garage
+ return new Scene608(vm);
+ case 609: // outside Buckluster video store
+ return new Scene609(vm);
+ case 610: // inside Buckluster video store
+ return new Scene610(vm);
+ case 611: // back alley
+ return new Scene611(vm);
+ case 612: // expressway / maintenance building
+ return new Scene612(vm);
+ case 620: // cutscene, viewport glass breaking
+ return new Scene620(vm);
+
+ // Scene group #7 (submerged men's city / upper floor)
+ case 701: // outside elevator (after city is submerged)
+ return new Scene701(vm);
+ case 702: // outside teleporter (after city is submerged)
+ return new Scene702(vm);
+ case 703: // water
+ return new Scene703(vm);
+ case 704: // water, building in the distance
+ return new Scene704(vm);
+ case 705: // water, outside building
+ return new Scene705(vm);
+ case 706: // inside building, pedestral room, outside teleporter
+ return new Scene706(vm);
+ case 707: // teleporter
+ return new Scene707(vm);
+ case 710: // looking at pedestral room through binoculars
+ return new Scene710(vm);
+ case 711: // inside teleporter
+ return new Scene711(vm);
+ case 751: // outside elevator (before city is submerged)
+ return new Scene751(vm);
+ case 752: // outside teleporter (before city is submerged)
+ return new Scene752(vm);
+
+ // Scene group #8
+ case 801: // control room, outside teleporter
+ return new Scene801(vm);
+ case 802: // launch pad with destroyed ship
+ return new Scene802(vm);
+ case 803: // empty launch pad
+ return new Scene803(vm);
+ case 804: // inside Rex's ship - cockpit
+ return new Scene804(vm);
+ case 805: // service panel
+ return new Scene805(vm);
+ case 807: // teleporter
+ return new Scene807(vm);
+ case 808: // antigrav control
+ return new Scene808(vm);
+ case 810: // cutscene: Rex's ship leaving the planet
+ return new Scene810(vm);
+
+ default:
+ error("Invalid scene %d called", scene._nextSceneId);
+ }
+}
+
+/*------------------------------------------------------------------------*/
+
+NebularScene::NebularScene(MADSEngine *vm) : SceneLogic(vm),
+ _globals(static_cast<GameNebular *>(vm->_game)->_globals),
+ _game(*static_cast<GameNebular *>(vm->_game)),
+ _action(vm->_game->_scene._action) {
+}
+
+Common::String NebularScene::formAnimName(char sepChar, int suffixNum) {
+ return Resources::formatName(_scene->_currentSceneId, sepChar, suffixNum,
+ EXT_NONE, "");
+}
+
+/*------------------------------------------------------------------------*/
+
+void SceneInfoNebular::loadCodes(MSurface &depthSurface, int variant) {
+ File f(Resources::formatName(RESPREFIX_RM, _sceneId, ".DAT"));
+ MadsPack codesPack(&f);
+ Common::SeekableReadStream *stream = codesPack.getItemStream(variant + 1);
+
+ loadCodes(depthSurface, stream);
+
+ delete stream;
+ f.close();
+}
+
+void SceneInfoNebular::loadCodes(MSurface &depthSurface, Common::SeekableReadStream *stream) {
+ byte *destP = depthSurface.getData();
+ byte *endP = depthSurface.getBasePtr(0, depthSurface.h);
+
+ byte runLength = stream->readByte();
+ while (destP < endP && runLength > 0) {
+ byte runValue = stream->readByte();
+
+ // Write out the run length
+ Common::fill(destP, destP + runLength, runValue);
+ destP += runLength;
+
+ // Get the next run length
+ runLength = stream->readByte();
+ }
+
+ if (destP < endP)
+ Common::fill(destP, endP, 0);
+}
+
+/*------------------------------------------------------------------------*/
+
+SceneTeleporter::SceneTeleporter(MADSEngine *vm) : NebularScene(vm) {
+ _buttonTyped = -1;
+ _curCode = -1;
+ _digitCount = -1;
+ _curMessageId = -1;
+ _handSpriteId = -1;
+ _handSequenceId = -1;
+ _finishedCodeCounter = -1;
+ _meteorologistNextPlace = -1;
+ _meteorologistCurPlace = -1;
+ _teleporterSceneId = -1;
+}
+
+int SceneTeleporter::teleporterAddress(int code, bool working) {
+ int limit = working ? 6 : 10;
+
+ for (int i = 0; i < limit; i++) {
+ if (code == _globals[kTeleporterCode + i])
+ return _globals[kTeleporterRoom + i];
+ }
+
+ return -1;
+}
+
+Common::Point SceneTeleporter::teleporterComputeLocation() {
+ Common::Point result;
+
+ switch (_buttonTyped) {
+ case 0:
+ result = Common::Point(179, 200);
+ break;
+
+ case 1:
+ result = Common::Point(166, 170);
+ break;
+
+ case 2:
+ result = Common::Point(179, 170);
+ break;
+
+ case 3:
+ result = Common::Point(192, 170);
+ break;
+
+ case 4:
+ result = Common::Point(166, 180);
+ break;
+
+ case 5:
+ result = Common::Point(179, 180);
+ break;
+
+ case 6:
+ result = Common::Point(192, 180);
+ break;
+
+ case 7:
+ result = Common::Point(166, 190);
+ break;
+
+ case 8:
+ result = Common::Point(179, 190);
+ break;
+
+ case 9:
+ result = Common::Point(192, 190);
+ break;
+
+ case 10:
+ result = Common::Point(194, 200);
+ break;
+
+ case 11:
+ result = Common::Point(164, 200);
+ break;
+
+ default:
+ error("teleporterComputeLocation() - Unexpected button pressed");
+ }
+
+ return result;
+}
+
+void SceneTeleporter::teleporterHandleKey() {
+ switch (_game._trigger) {
+ case 0: {
+ _game._player._stepEnabled = false;
+ Common::Point msgPos = teleporterComputeLocation();
+ _handSequenceId = _scene->_sequences.startReverseCycle(_handSpriteId, false, 4, 2, 0, 0);
+ _scene->_sequences.setPosition(_handSequenceId, msgPos);
+ _scene->_sequences.setDepth(_handSequenceId, 2);
+ _scene->_sequences.addSubEntry(_handSequenceId, SEQUENCE_TRIGGER_LOOP, 0, 1);
+ _scene->_sequences.addSubEntry(_handSequenceId, SEQUENCE_TRIGGER_EXPIRE, 0, 2);
+
+ if (_globals[kMeteorologistWatch] == METEOROLOGIST_NORMAL)
+ _vm->_events->hideCursor();
+
+ }
+ break;
+
+ case 1:
+ _scene->_sequences.addSubEntry(_handSequenceId, SEQUENCE_TRIGGER_SPRITE, 3, 3);
+ if (_buttonTyped <= 9) {
+ if (_digitCount < 4) {
+ _curCode *= 10;
+ _curCode += _buttonTyped;
+ _digitCount++;
+ _msgText = Common::String::format("%d", _curCode);
+ if (_digitCount < 4)
+ _msgText += "_";
+
+ if (_scene->_currentSceneId != 711)
+ _vm->_sound->command(32);
+ }
+ } else if (_buttonTyped == 11) {
+ _digitCount = 0;
+ _curCode = 0;
+ _msgText = "_";
+ if (_scene->_currentSceneId != 711)
+ _vm->_sound->command(33);
+ } else if (_digitCount == 4) {
+ if (_scene->_currentSceneId != 711)
+ _finishedCodeCounter = 1;
+
+ if (teleporterAddress(_curCode, true) > 0) {
+ _vm->_palette->setEntry(252, 0, 63, 0);
+ if (_scene->_currentSceneId != 711)
+ _vm->_sound->command(34);
+ } else {
+ _vm->_palette->setEntry(252, 63, 0, 0);
+ if (_scene->_currentSceneId != 711)
+ _vm->_sound->command(35);
+ }
+ }
+
+ if (_scene->_currentSceneId != 711) {
+ if (_curMessageId >= 0)
+ _scene->_kernelMessages.remove(_curMessageId);
+ _curMessageId = _scene->_kernelMessages.add(Common::Point(143, 61), 0xFDFC, 16, 0, 9999999, _msgText);
+ }
+ break;
+
+ case 2:
+ if (_finishedCodeCounter == 1) {
+ _finishedCodeCounter++;
+
+ if (_globals[kMeteorologistWatch] != METEOROLOGIST_NORMAL)
+ _scene->_nextSceneId = 202;
+ else {
+ _vm->_events->showCursor();
+ int destination = teleporterAddress(_curCode, true);
+
+ if (destination > 0) {
+ _globals[kTeleporterCommand] = 2;
+ _scene->_nextSceneId = _teleporterSceneId;
+ _globals[kTeleporterDestination] = destination;
+ } else {
+ _globals[kTeleporterCommand] = 4;
+ _scene->_nextSceneId = _teleporterSceneId;
+ }
+ }
+ } else if (_globals[kMeteorologistWatch] != METEOROLOGIST_NORMAL)
+ _scene->_sequences.addTimer(30, 230 + _meteorologistCurPlace);
+
+ break;
+
+ case 3:
+ if (!_finishedCodeCounter) {
+ if (_globals[kMeteorologistWatch] == METEOROLOGIST_NORMAL) {
+ _game._player._stepEnabled = true;
+ _vm->_events->showCursor();
+ }
+ }
+ break;
+
+ default:
+ break;
+ }
+}
+
+void SceneTeleporter::teleporterEnter() {
+ _game._player._visible = false;
+ _game._player._stepEnabled = (_globals[kMeteorologistWatch] == METEOROLOGIST_NORMAL);
+ _scene->_kernelMessages._talkFont = _vm->_font->getFont(FONT_TELE);
+ _scene->_textSpacing = 0;
+ _curCode = 0;
+ _digitCount = 0;
+ _finishedCodeCounter = 0;
+ _curMessageId = -1;
+ _msgText = "_";
+
+ if (_scene->_priorSceneId == -2)
+ _scene->_priorSceneId = _globals[kTeleporterDestination];
+
+ if (_scene->_priorSceneId < 101)
+ _scene->_priorSceneId = 201;
+
+ _globals[kTeleporterDestination] = _scene->_priorSceneId;
+ _vm->_palette->setEntry(252, 63, 63, 0);
+ _vm->_palette->setEntry(253, 0, 0, 0);
+ _teleporterSceneId = _scene->_priorSceneId;
+ if (_teleporterSceneId == 202)
+ _teleporterSceneId = 201;
+
+ int codeVal = 0;
+ for (int i = 0; i < 10; i++) {
+ if (_teleporterSceneId == _globals[kTeleporterRoom + i])
+ codeVal = _globals[kTeleporterCode + i];
+
+ if (_globals[kTeleporterRoom + i] == 301)
+ _meteorologistNextPlace = _globals[kTeleporterCode + i];
+ }
+
+ Common::String msgText2 = Common::String::format("#%.4d", codeVal);
+
+ if (_scene->_currentSceneId != 711) {
+ _scene->_kernelMessages.add(Common::Point(133, 34), 0, 32, 0, 9999999, msgText2);
+ _scene->_kernelMessages.add(Common::Point(143, 61), 0xFDFC, 16, 0, 9999999, _msgText);
+ }
+
+ _meteorologistCurPlace = 0;
+
+ if (_globals[kMeteorologistWatch] != METEOROLOGIST_NORMAL)
+ _scene->_sequences.addTimer(30, 230);
+
+ _vm->_sound->command(36);
+}
+
+bool SceneTeleporter::teleporterActions() {
+ bool retVal = false;
+ static int _buttonList[12] = { NOUN_0_KEY, NOUN_1_KEY, NOUN_2_KEY, NOUN_3_KEY, NOUN_4_KEY, NOUN_5_KEY, NOUN_6_KEY, NOUN_7_KEY, NOUN_8_KEY, NOUN_9_KEY, NOUN_SMILE_KEY, NOUN_FROWN_KEY };
+
+ if (_action.isAction(VERB_PRESS) || _action.isAction(VERB_PUSH)) {
+ for (int i = 0; i < 12; i++) {
+ if (_action._activeAction._objectNameId == _buttonList[i])
+ _buttonTyped = i;
+ }
+ teleporterHandleKey();
+ retVal = true;
+ }
+
+ if (_action.isAction(VERB_EXIT_FROM, NOUN_DEVICE)) {
+ _globals[kTeleporterCommand] = 3;
+ _scene->_nextSceneId = _teleporterSceneId;
+ retVal = true;
+ }
+
+ return (retVal);
+}
+
+void SceneTeleporter::teleporterStep() {
+ if (_globals[kMeteorologistWatch] == METEOROLOGIST_NORMAL)
+ return;
+
+ if (_game._trigger >= 230) {
+ int place = _game._trigger - 230;
+ int digit;
+
+ if (place < 4) {
+ digit = _meteorologistNextPlace;
+ for (int i = 0; i < (3 - place); i++)
+ digit = digit / 10;
+
+ digit = digit % 10;
+ } else {
+ digit = 10;
+ }
+ _buttonTyped = digit;
+ _meteorologistCurPlace = place + 1;
+ _game._trigger = -1;
+ }
+
+ if (_game._trigger) {
+ if (_game._trigger == -1)
+ _game._trigger = 0;
+ teleporterHandleKey();
+ }
+}
+
+} // End of namespace Nebular
+
+} // End of namespace MADS
diff --git a/engines/mads/nebular/nebular_scenes.h b/engines/mads/nebular/nebular_scenes.h
new file mode 100644
index 0000000000..cf33b21aad
--- /dev/null
+++ b/engines/mads/nebular/nebular_scenes.h
@@ -0,0 +1,1418 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+
+ * You should have received a copy of the GNU General Public 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 MADS_NEBULAR_SCENES_H
+#define MADS_NEBULAR_SCENES_H
+
+#include "common/scummsys.h"
+#include "mads/game.h"
+#include "mads/scene.h"
+#include "mads/nebular/game_nebular.h"
+#include "mads/nebular/globals_nebular.h"
+
+
+namespace MADS {
+
+namespace Nebular {
+
+enum {
+ SEX_MALE = 0, SEX_UNKNOWN = 1, SEX_FEMALE = 2
+};
+
+enum Verb {
+ VERB_ACTIVATE = 0x00E,
+ VERB_ATTACH = 0x019,
+ VERB_BREAK = 0x032,
+ VERB_BREATHE_AIR = 0x033,
+ VERB_CAST = 0x03D,
+ VERB_CLIMB_DOWN = 0x04E,
+ VERB_CLIMB_THROUGH = 0x04F,
+ VERB_CLIMB_UP = 0x050,
+ VERB_CUT = 0x061,
+ VERB_DAMPEN = 0x064,
+ VERB_DISASSEMBLE = 0x06C,
+ VERB_DIVE_INTO = 0x06D,
+ VERB_DRINK = 0x072,
+ VERB_EAT = 0x075,
+ VERB_EJECT = 0x076,
+ VERB_EMPTY = 0x077,
+ VERB_EXAMINE = 0x07D,
+ VERB_FILL = 0x085,
+ VERB_FONDLE = 0x08C,
+ VERB_HOSE_DOWN = 0x0A6,
+ VERB_IGNITE = 0x0B4,
+ VERB_INFLATE = 0x0B5,
+ VERB_INSERT = 0x0B6,
+ VERB_INSPECT = 0x0B7,
+ VERB_GNAW_ON = 0x098,
+ VERB_GORGE_ON = 0x099,
+ VERB_HURL = 0x0A9,
+ VERB_LICK = 0x0CB,
+ VERB_LOOK_AT = 0x0D1,
+ VERB_LOOK_IN = 0x0D2,
+ VERB_LOOK_THROUGH = 0x0D3,
+ VERB_PEER_THROUGH = 0x103,
+ VERB_PLAY = 0x112,
+ VERB_PRESS = 0x11A,
+ VERB_PRY = 0x11C,
+ VERB_READ = 0x11F,
+ VERB_SET = 0x132,
+ VERB_SHAKE_HANDS = 0x133,
+ VERB_SHARPEN = 0x134,
+ VERB_SHOOT = 0x13A,
+ VERB_SIT_IN = 0x13F,
+ VERB_SMELL = 0x147,
+ VERB_SNIFF = 0x149,
+ VERB_STARE_AT = 0x155,
+ VERB_SWIM_ACROSS = 0x159,
+ VERB_SWIM_INTO = 0x15A,
+ VERB_SWIM_THROUGH = 0x15B,
+ VERB_SWIM_TO = 0x15C,
+ VERB_SWIM_TOWARDS = 0x15D,
+ VERB_SWIM_UNDER = 0x15E,
+ VERB_TIE = 0x170,
+ VERB_UNLOCK = 0x17B,
+ VERB_WALK_ACROSS = 0x187,
+ VERB_WALK_INSIDE = 0x188,
+ VERB_WALK_OUTSIDE = 0x18A,
+ VERB_WALK_THROUGH = 0x18B,
+ VERB_WALK_TOWARDS = 0x18C,
+ VERB_WEAR = 0x191,
+ VERB_WALK_DOWN = 0x1AD,
+ VERB_LEAVE = 0x1CD,
+ VERB_EXIT_FROM = 0x1CE,
+ VERB_USE = 0x20C,
+ VERB_GAZE_INTO = 0x212,
+ VERB_SIT_AT = 0x21F,
+ VERB_WALK_UP = 0x227,
+ VERB_WALK_INTO = 0x242,
+ VERB_EXIT = 0x298,
+ VERB_WALK_ONTO = 0x2B5,
+ VERB_RETURN_TO = 0x2D5,
+ VERB_CLIMB_INTO = 0x2F7,
+ VERB_STEP_INTO = 0x2F9,
+ VERB_CRAWL_TO = 0x2FB,
+ VERB_CRAWL_DOWN = 0x301,
+ VERB_SIT_ON = 0x30B,
+ VERB_WALK_ALONG = 0x312,
+ VERB_GET_INSIDE = 0x325,
+ VERB_WALK = 0x32F,
+ VERB_REFLECT = 0x365,
+ VERB_GET_INTO = 0x36A,
+ VERB_LOOK_OUT = 0x397,
+ VERB_APPLY = 0x3A6,
+ VERB_STEER_TOWARDS = 0x3B1,
+ VERB_NIBBLE_ON = 0x3B7,
+ VERB_ENTER = 0x3B8,
+ VERB_PUT_DOWN = 0x46F,
+ VERB_INSTALL = 0x474,
+ VERB_REMOVE = 0x476,
+ VERB_DEFACE = 0x489,
+ VERB_MASSAGE = 0x4A3,
+ VERB_MANGLE = 0x4A4,
+ VERB_RUB = 0x4A5,
+ VERB_JUGGLE = 0x4A6,
+ VERB_SMASH = 0x4A7,
+ VERB_GUZZLE = 0x4A8,
+ VERB_FOLD = 0x4AB,
+ VERB_SPINDLE = 0x4AC,
+ VERB_MUTILATE = 0x4AD
+};
+
+enum Noun {
+ //NOUN_GAME = 0x1,
+ //NOUN_QSAVE = 0x2,
+ //NOUN_LOOK = 0x3,
+ //NOUN_TAKE = 0x4,
+ //NOUN_PUSH = 0x5,
+ //NOUN_OPEN = 0x6,
+ //NOUN_PUT = 0x7,
+ //NOUN_TALK_TO = 0x8,
+ //NOUN_GIVE = 0x9,
+ //NOUN_PULL = 0xA,
+ //NOUN_CLOSE = 0xB,
+ //NOUN_THROW = 0xC,
+ //NOUN_WALK_TO = 0xD,
+ //NOUN_ACTIVATE = 0xE,
+ //NOUN_ADMIRE = 0xF,
+ NOUN_ADSM = 0x10,
+ NOUN_AIR_VENT = 0x11,
+ NOUN_ALOE_PLANT = 0x12,
+ NOUN_ANEMONE = 0x13,
+ NOUN_ANOMOMETER = 0x14,
+ NOUN_AREA_AROUND_HUT = 0x15,
+ NOUN_AREA_TO_SOUTH = 0x16,
+ NOUN_AREA_TO_WEST = 0x17,
+ NOUN_AROMATIC_MEAT = 0x18,
+ //NOUN_ATTACH = 0x19,
+ NOUN_AUDIO_TAPE = 0x1A,
+ NOUN_AUXILIARY_POWER = 0x1B,
+ NOUN_BADMITTON_BRAT = 0x1C,
+ NOUN_BAG = 0x1D,
+ NOUN_BAMBOO_TREE = 0x1E,
+ NOUN_BATS = 0x1F,
+ NOUN_BAWLEMER_ORIOLE_HUN = 0x20,
+ NOUN_BEAR_RUG = 0x21,
+ NOUN_BEASTLY_TROPHY = 0x22,
+ NOUN_BIG_LEAVES = 0x23,
+ NOUN_BIG_PIPES = 0x24,
+ NOUN_BIG_SKY = 0x25,
+ NOUN_BIG_STONE = 0x26,
+ NOUN_BINOCULARS = 0x27,
+ NOUN_BIRDIES = 0x28,
+ NOUN_BLOWGUN = 0x29,
+ NOUN_BOMB = 0x2A,
+ NOUN_BOMBS = 0x2B,
+ NOUN_BONE = 0x2C,
+ NOUN_BONES = 0x2D,
+ NOUN_BOTTLE = 0x2E,
+ NOUN_BOULDER = 0x2F,
+ NOUN_BOULDERS = 0x30,
+ NOUN_BRA = 0x31,
+ //NOUN_BREAK = 0x32,
+ //NOUN_BREATHE_AIR = 0x33,
+ NOUN_BULKHEAD = 0x34,
+ NOUN_BURGER = 0x35,
+ NOUN_BURN = 0x36,
+ NOUN_BURNT_OUT_WARP_COIL = 0x37,
+ NOUN_BUSH_LIKE_FORMATION = 0x38,
+ NOUN_BUSHES = 0x39,
+ NOUN_BUSHY_FERN = 0x3A,
+ NOUN_CACTUS = 0x3B,
+ NOUN_CARD = 0x3C,
+ //NOUN_CAST = 0x3D,
+ NOUN_CAULDRON = 0x3E,
+ NOUN_CAVE = 0x3F,
+ NOUN_CAVE_CEILING = 0x40,
+ NOUN_CAVE_ENTRANCE = 0x41,
+ NOUN_CAVE_EXIT = 0x42,
+ NOUN_CAVE_FLOOR = 0x43,
+ NOUN_CAVE_TO_EAST = 0x44,
+ NOUN_CAVE_WALL = 0x45,
+ NOUN_CEILING = 0x46,
+ NOUN_CHAIR = 0x47,
+ NOUN_CHARGE_CASES = 0x48,
+ NOUN_CHICKEN = 0x49,
+ NOUN_CHICKEN_BOMB = 0x4A,
+ NOUN_CLEARING_TO_EAST = 0x4B,
+ NOUN_CLEARING_TO_SOUTH = 0x4C,
+ NOUN_CLIFF_FACE = 0x4D,
+ NOUN_CLIMB_DOWN = 0x4E,
+ NOUN_CLIMB_THROUGH = 0x4F,
+ NOUN_CLIMB_UP = 0x50,
+ NOUN_CLOCK = 0x51,
+ NOUN_CLOSET = 0x52,
+ NOUN_CLOTHESLINE = 0x53,
+ NOUN_CLUMP_OF_TREES = 0x54,
+ NOUN_COAL = 0x55,
+ NOUN_COCOANUT = 0x56,
+ NOUN_COMPACT_CASE = 0x57,
+ NOUN_COMPUTER_GAME = 0x58,
+ NOUN_CONTROL_PANEL = 0x59,
+ NOUN_CORAL = 0x5A,
+ NOUN_CRAB = 0x5B,
+ NOUN_CREDIT_CHIP = 0x5C,
+ NOUN_CUMULOUS_CLOUD = 0x5D,
+ NOUN_CURIOUS_WEED_PATCH = 0x5E,
+ NOUN_CURTAIN = 0x5F,
+ NOUN_CURTAINS = 0x60,
+ //NOUN_CUT = 0x61,
+ NOUN_DAMAGE_CONTROL = 0x62,
+ NOUN_DAMAGE_CONTROL_PANEL = 0x63,
+ //NOUN_DAMPEN = 0x64,
+ NOUN_DEAD_FISH = 0x65,
+ NOUN_DEAD_PURPLE_MONSTER = 0x66,
+ NOUN_DECLIVITOUS_CHASM = 0x67,
+ NOUN_DEEP_DARK_FOREST = 0x68,
+ NOUN_DENSE_FOREST = 0x69,
+ NOUN_DETONATORS = 0x6A,
+ NOUN_DINO_MITE = 0x6B,
+ //NOUN_DISASSEMBLE = 0x6C,
+ //NOUN_DIVE_INTO = 0x6D,
+ NOUN_DOOR = 0x6E,
+ NOUN_DOOR_KEY = 0x6F,
+ NOUN_DOORWAY = 0x70,
+ NOUN_DRAWER = 0x71,
+ //NOUN_DRINK = 0x72,
+ NOUN_DURAFAIL_CELLS = 0x73,
+ NOUN_EASTERN_CLIFF_FACE = 0x74,
+ //NOUN_EAT = 0x75,
+ //NOUN_EJECT = 0x76,
+ //NOUN_EMPTY = 0x77,
+ NOUN_ENGINEERING_CONTROLS = 0x78,
+ NOUN_ENGINEERING_SECTION = 0x79,
+ NOUN_ENTER_KEY = 0x7A,
+ NOUN_ESCAPE_HATCH = 0x7B,
+ NOUN_ESTROTOXIN = 0x7C,
+ //NOUN_EXAMINE = 0x7D,
+ NOUN_EXPERIMENT_CAGE = 0x7E,
+ NOUN_EXTINGUISH = 0x7F,
+ NOUN_FACE_ID = 0x80,
+ NOUN_FERN = 0x81,
+ NOUN_FIELD_TO_NORTH = 0x82,
+ NOUN_FIELD_TO_SOUTH = 0x83,
+ NOUN_FIELD_TO_WEST = 0x84,
+ //NOUN_FILL = 0x85,
+ NOUN_FIRE_PIT = 0x86,
+ NOUN_FISHING_LINE = 0x87,
+ NOUN_FISHING_ROD = 0x88,
+ NOUN_FLOOR = 0x89,
+ NOUN_FLOOR_OF_HUT = 0x8A,
+ NOUN_FLOOR_TILE = 0x8B,
+ //NOUN_FONDLE = 0x8C,
+ NOUN_FOREST_TO_EAST = 0x8D,
+ NOUN_FRONT_WINDOW = 0x8E,
+ NOUN_FUNGOIDS = 0x8F,
+ NOUN_FURNACE = 0x90,
+ NOUN_FUZZY_DICE = 0x91,
+ //NOUN_GAZE = 0x92,
+ //NOUN_GAZE_AT = 0x93,
+ //NOUN_GAZE_IN = 0x94,
+ //NOUN_GLANCE_AT = 0x95,
+ NOUN_GLOVE = 0x96,
+ NOUN_GNARLY_SHRUB = 0x97,
+ //NOUN_GNAW_ON = 0x98,
+ //NOUN_GORGE_ON = 0x99,
+ NOUN_GRAIN_ALCHOHOL = 0x9A,
+ NOUN_GRASSLAND_TO_EAST = 0x9B,
+ NOUN_GRASSLAND_TO_SOUTH = 0x9C,
+ NOUN_GRASSY_AREA = 0x9D,
+ NOUN_GRASSY_AREA_TO_NORTH = 0x9E,
+ NOUN_GRASSY_KNOLL = 0x9F,
+ //NOUN_GRIND = 0xA0,
+ NOUN_GROOVILACTIC_TREE = 0xA1,
+ NOUN_GUARDS_ARM = 0xA2,
+ NOUN_HATCHWAY = 0xA3,
+ //NOUN_HOOK_UP = 0xA4,
+ NOUN_HORIZON = 0xA5,
+ //NOUN_HOSE_DOWN = 0xA6,
+ NOUN_HOTPANTS = 0xA7,
+ NOUN_HULL = 0xA8,
+ //NOUN_HURL = 0xA9,
+ NOUN_HUT = 0xAA,
+ NOUN_HUT_AREA = 0xAB,
+ NOUN_HUT_TO_EAST = 0xAC,
+ NOUN_HUT_TO_SOUTH = 0xAD,
+ NOUN_HUT_TO_THE_SOUTH = 0xAE,
+ NOUN_HUT_TO_WEST = 0xAF,
+ NOUN_HUTS_TO_NORTH = 0xB0,
+ NOUN_HYDROSPANNER = 0xB1,
+ NOUN_HYPERDRIVE_JUMP_UNIT = 0xB2,
+ NOUN_ID_CARD = 0xB3,
+ //NOUN_IGNITE = 0xB4,
+ //NOUN_INFLATE = 0xB5,
+ //NOUN_INSERT = 0xB6,
+ //NOUN_INSPECT = 0xB7,
+ NOUN_JUNGLE = 0xB8,
+ NOUN_JUNGLE_TO_EAST = 0xB9,
+ NOUN_JUNGLE_TO_WEST = 0xBA,
+ NOUN_KEY_1 = 0xBB,
+ NOUN_KEY_2 = 0xBC,
+ NOUN_KEY_3 = 0xBD,
+ NOUN_KEY_4 = 0xBE,
+ NOUN_KEY_5 = 0xBF,
+ NOUN_KEY_6 = 0xC0,
+ NOUN_KEY_7 = 0xC1,
+ NOUN_KEY_8 = 0xC2,
+ NOUN_KEY_9 = 0xC3,
+ NOUN_KEYPAD = 0xC4,
+ NOUN_KNEELING_WOMAN = 0xC5,
+ NOUN_KNIFE = 0xC6,
+ NOUN_LADDER = 0xC7,
+ NOUN_LARGE_STALAGMITE = 0xC8,
+ //NOUN_LEER_AT = 0xC9,
+ NOUN_LIBRARY_COMPUTER = 0xCA,
+ //NOUN_LICK = 0xCB,
+ NOUN_LIFE_SUPPORT_SECTION = 0xCC,
+ NOUN_LIGHT = 0xCD,
+ //NOUN_LOAD = 0xCE,
+ //NOUN_LOCK = 0xCF,
+ NOUN_LOG = 0xD0,
+ //NOUN_LOOK_AT = 0xD1,
+ //NOUN_LOOK_IN = 0xD2,
+ //NOUN_LOOK_THROUGH = 0xD3,
+ NOUN_LOUNGE_AREA = 0xD4,
+ NOUN_LOVE_ALTAR = 0xD5,
+ NOUN_LOWLANDS = 0xD6,
+ NOUN_MACHINE = 0xD7,
+ NOUN_MAGNET = 0xD8,
+ NOUN_MAIN_AIRLOCK = 0xD9,
+ NOUN_MANTA_RAY = 0xDA,
+ NOUN_MARSHY_WETLANDS = 0xDB,
+ NOUN_MATCH = 0xDC,
+ NOUN_MEDICAL_WASTE = 0xDD,
+ NOUN_MEDICINE_CABINET = 0xDE,
+ NOUN_MEN_WHO_CAME_BEFORE = 0xDF,
+ NOUN_MINE = 0xE0,
+ NOUN_MIRROR = 0xE1,
+ NOUN_MONITOR = 0xE2,
+ NOUN_MONKEY = 0xE3,
+ NOUN_MONKEY_LIVER_JUICE = 0xE4,
+ NOUN_MONSTER_SLUDGE = 0xE5,
+ NOUN_MOUNTAIN = 0xE6,
+ NOUN_MOUNTAIN_RANGE = 0xE7,
+ NOUN_MOUNTAINS = 0xE8,
+ NOUN_MTAM = 0xE9,
+ NOUN_MUSHROOMS = 0xEA,
+ NOUN_NAVIGATION_CONTROLS = 0xEB,
+ NOUN_NORTH_PATH = 0xEC,
+ NOUN_NORTHERN_EXPOSURE = 0xED,
+ NOUN_NORTHERN_SEA_CLIFF = 0xEE,
+ NOUN_OBSTACLE = 0xEF,
+ NOUN_OCEAN_FLOOR = 0xF0,
+ NOUN_ODD_ROCK_FORMATION = 0xF1,
+ NOUN_OOGLY_BOOGLY_JUICE = 0xF2,
+ NOUN_OPEN_AREA_TO_EAST = 0xF3,
+ NOUN_OPEN_AREA_TO_NORTH = 0xF4,
+ NOUN_OPEN_AREA_TO_SOUTH = 0xF5,
+ NOUN_OPEN_AREA_TO_WEST = 0xF6,
+ NOUN_OPEN_FIELD = 0xF7,
+ NOUN_OUTER_HULL = 0xF8,
+ NOUN_OUTSIDE = 0xF9,
+ NOUN_OVEN = 0xFA,
+ NOUN_OVERHANG_TO_EAST = 0xFB,
+ NOUN_OVERHANG_TO_WEST = 0xFC,
+ NOUN_OVERHEAD_LAMP = 0xFD,
+ NOUN_PAD_OF_PAPER = 0xFE,
+ NOUN_PADLOCK_KEY = 0xFF,
+ NOUN_PALM_TREE = 0x100,
+ NOUN_PASSAGE_WAY_TO_SOUTH = 0x101,
+ NOUN_PASSION_PUSS = 0x102,
+ NOUN_PEER_THROUGH = 0x103,
+ NOUN_PENCIL = 0x104,
+ NOUN_PENDULOUS_CRAG = 0x105,
+ NOUN_PENLIGHT = 0x106,
+ NOUN_PHONE_CELLS = 0x107,
+ NOUN_PHONE_HANDSET = 0x108,
+ NOUN_PILE_OF_ROCKS = 0x109,
+ NOUN_PILLOW = 0x10A,
+ NOUN_PILOTS_CHAIR = 0x10B,
+ NOUN_PIPE = 0x10C,
+ NOUN_PIRANHA = 0x10D,
+ NOUN_PLANT = 0x10E,
+ NOUN_PLANT_STALK = 0x10F,
+ NOUN_PLANTS = 0x110,
+ NOUN_PLASTIC_JESUS = 0x111,
+ //NOUN_PLAY = 0x112,
+ NOUN_PLUNGER = 0x113,
+ NOUN_POISON_DARTS = 0x114,
+ NOUN_POLYCEMENT = 0x115,
+ NOUN_POOL = 0x116,
+ NOUN_POSTER = 0x117,
+ NOUN_POWER_STATUS_PANEL = 0x118,
+ NOUN_PRECIPICE = 0x119,
+ //NOUN_PRESS = 0x11A,
+ NOUN_PRESSURE_GAUGE = 0x11B,
+ //NOUN_PRY = 0x11C,
+ NOUN_RAGING_RIVER = 0x11D,
+ NOUN_RAMOLYAN_RUGBY_RATS = 0x11E,
+ //NOUN_READ = 0x11F,
+ NOUN_REARVIEW_MIRROR = 0x120,
+ NOUN_REBREATHER = 0x121,
+ NOUN_REFRIGERATOR = 0x122,
+ NOUN_REMOTE = 0x123,
+ NOUN_REPAIR_LIST = 0x124,
+ NOUN_RIVER = 0x125,
+ NOUN_RIVER_TO_WEST = 0x126,
+ NOUN_ROBO_KITCHEN = 0x127,
+ NOUN_ROCK = 0x128,
+ NOUN_ROCKS = 0x129,
+ NOUN_ROCKY_AREA = 0x12A,
+ NOUN_ROLLING_HILL = 0x12B,
+ NOUN_SCALPEL = 0x12C,
+ NOUN_SCENIC_MOUNTAINS = 0x12D,
+ NOUN_SEA_CLIFF = 0x12E,
+ NOUN_SEAWEED = 0x12F,
+ NOUN_SEAWEED_BANK = 0x130,
+ NOUN_SECURITY_CARD = 0x131,
+ //NOUN_SET = 0x132,
+ //NOUN_SHAKE_HANDS = 0x133,
+ //NOUN_SHARPEN = 0x134,
+ NOUN_SHIELD_ACCESS_PANEL = 0x135,
+ NOUN_SHIELD_GENERATOR = 0x136,
+ NOUN_SHIELD_MODULATOR = 0x137,
+ NOUN_SHIELD_STATUS_PANEL = 0x138,
+ NOUN_SHIP = 0x139,
+ //NOUN_SHOOT = 0x13A,
+ NOUN_SHOVEL = 0x13B,
+ //NOUN_SHRED = 0x13C,
+ NOUN_SHRUNKEN_HEADS = 0x13D,
+ NOUN_SINGED_MEAT = 0x13E,
+ //NOUN_SIT_IN = 0x13F,
+ NOUN_SKULL = 0x140,
+ NOUN_SKULL_AND_CROSSBONES = 0x141,
+ NOUN_SKY = 0x142,
+ //NOUN_SLEEP_ON = 0x143,
+ NOUN_SLITHERING_SNAKE = 0x144,
+ NOUN_SLUG_SECRETION = 0x145,
+ NOUN_SMALL_HOLE = 0x146,
+ //NOUN_SMELL = 0x147,
+ NOUN_SNAKE = 0x148,
+ //NOUN_SNIFF = 0x149,
+ //NOUN_SOAK = 0x14A,
+ NOUN_SPECIAL_KEY_1 = 0x14B,
+ NOUN_SPECIAL_KEY_2 = 0x14C,
+ NOUN_SPIDER = 0x14D,
+ NOUN_SPILT_MILK = 0x14E,
+ NOUN_SPIT_FIRE = 0x14F,
+ //NOUN_SPRAY = 0x150,
+ //NOUN_STAB = 0x151,
+ NOUN_STAIRS = 0x152,
+ NOUN_STALAGMITES = 0x153,
+ //NOUN_STAND_INSIDE = 0x154,
+ //NOUN_STARE_AT = 0x155,
+ NOUN_STEPS = 0x156,
+ NOUN_STUFFED_FISH = 0x157,
+ NOUN_SURFACE = 0x158,
+ //NOUN_SWIM_ACROSS = 0x159,
+ //NOUN_SWIM_INTO = 0x15A,
+ //NOUN_SWIM_THROUGH = 0x15B,
+ //NOUN_SWIM_TO = 0x15C,
+ //NOUN_SWIM_TOWARDS = 0x15D,
+ //NOUN_SWIM_UNDER = 0x15E,
+ NOUN_SWOOPING_CREATURE = 0x15F,
+ NOUN_TABLE = 0x160,
+ //NOUN_TAKE_LIVER = 0x161,
+ //NOUN_TAKE_OFF = 0x162,
+ //NOUN_TAKE_PAGE = 0x163,
+ NOUN_TALL_GRASS = 0x164,
+ NOUN_TAPE_PLAYER = 0x165,
+ NOUN_TARGET_COMPUTER = 0x166,
+ NOUN_TARGET_MODULE = 0x167,
+ NOUN_TARGETTING_COMPUTER = 0x168,
+ NOUN_TASMANIAN_DEVIL = 0x169,
+ NOUN_TASTY_TURKEY = 0x16A,
+ NOUN_TELEPORT_DEVICE = 0x16B,
+ NOUN_TELEPORTER = 0x16C,
+ NOUN_THATCHED_ROOF = 0x16D,
+ NOUN_THORNS = 0x16E,
+ NOUN_THORNY_BUSH = 0x16F,
+ //NOUN_TIE = 0x170,
+ NOUN_TIMEBOMB = 0x171,
+ NOUN_TIMER = 0x172,
+ NOUN_TIMER_MODULE = 0x173,
+ NOUN_TREE = 0x174,
+ NOUN_TREES = 0x175,
+ NOUN_TRODDEN_PATH = 0x176,
+ NOUN_TUBE = 0x177,
+ NOUN_TUNNEL = 0x178,
+ NOUN_TWINKIE_BUSH = 0x179,
+ NOUN_TWINKIFRUIT = 0x17A,
+ //NOUN_UNLOCK = 0x17B,
+ NOUN_UZI = 0x17C,
+ NOUN_VASE = 0x17D,
+ NOUN_VIDEO_GAME = 0x17E,
+ //NOUN_VIEW = 0x17F,
+ NOUN_VIEW_SCREEN = 0x180,
+ NOUN_VIEWPORT = 0x181,
+ NOUN_VILLAGE_AREA = 0x182,
+ NOUN_VILLAGE_TO_WEST = 0x183,
+ NOUN_VOLCANO = 0x184,
+ NOUN_VULTURE = 0x185,
+ NOUN_WAD_OF_CATTLE_PARTS = 0x186,
+ //NOUN_WALK_ACROSS = 0x187,
+ //NOUN_WALK_INSIDE = 0x188,
+ //NOUN_WALK_ON = 0x189,
+ //NOUN_WALK_OUTSIDE = 0x18A,
+ //NOUN_WALK_THROUGH = 0x18B,
+ //NOUN_WALK_TOWARDS = 0x18C,
+ NOUN_WALL = 0x18D,
+ NOUN_WATCH_TOWER = 0x18E,
+ NOUN_WATER = 0x18F,
+ NOUN_WEAPONS_DISPLAY = 0x190,
+ //NOUN_WEAR = 0x191,
+ NOUN_WEATHER_STATION = 0x192,
+ NOUN_WEATHER_VANE = 0x193,
+ NOUN_WEIGHT_MACHINE = 0x194,
+ NOUN_WESTERN_CLIFF_FACE = 0x195,
+ NOUN_WHEEL = 0x196,
+ NOUN_WINDOW = 0x197,
+ NOUN_WITCHDOCTOR_HUT = 0x198,
+ NOUN_WORKBENCH = 0x199,
+ //NOUN_WRITE_ON = 0x19A,
+ NOUN_YELLOW_BIRDY = 0x19B,
+ NOUN_GRASS = 0x19C,
+ NOUN_BOUNCING_REPTILE = 0x19D,
+ NOUN_DEEP_PIT = 0x19E,
+ NOUN_LOWLANDS_TO_NORTH = 0x19F,
+ NOUN_SMALL_BUSH = 0x1A0,
+ NOUN_SMALL_CACTUS = 0x1A1,
+ NOUN_ROCKY_AREA_TO_NORTH = 0x1A2,
+ NOUN_BAMBOO_LIKE_PLANT = 0x1A3,
+ NOUN_MOUNTAINSIDE = 0x1A4,
+ NOUN_FIELD = 0x1A5,
+ NOUN_GRASSY_FIELD = 0x1A6,
+ NOUN_CRAG = 0x1A7,
+ NOUN_HUGE_LEGS = 0x1A8,
+ NOUN_LEAF_COVERED_PIT = 0x1A9,
+ NOUN_PILE_OF_LEAVES = 0x1AA,
+ NOUN_OPEN_FIELD_TO_EAST = 0x1AB,
+ NOUN_LAWN = 0x1AC,
+ //NOUN_WALK_DOWN = 0x1AD,
+ NOUN_PATH_TO_WEST = 0x1AE,
+ NOUN_HEDGE = 0x1AF,
+ NOUN_VILLAGE_PATH = 0x1B0,
+ NOUN_PATH_TO_NORTHEAST = 0x1B1,
+ NOUN_JUNGLE_PATH = 0x1B2,
+ NOUN_THICK_UNDERGROWTH = 0x1B3,
+ NOUN_OCEAN = 0x1B4,
+ NOUN_OCEAN_IN_DISTANCE = 0x1B5,
+ NOUN_STRANGE_DEVICE = 0x1B6,
+ NOUN_BUSH = 0x1B7,
+ NOUN_ANEMOMETER = 0x1B8,
+ NOUN_ISLAND_IN_DISTANCE = 0x1B9,
+ NOUN_PATH = 0x1BA,
+ NOUN_TROPHY = 0x1BB,
+ NOUN_SPECIMEN_JARS = 0x1BC,
+ NOUN_BOWL = 0x1BD,
+ NOUN_LARGE_BOWL = 0x1BE,
+ NOUN_PATH_TO_NORTH = 0x1BF,
+ NOUN_HUT_TO_NORTH = 0x1C0,
+ NOUN_PATH_TO_EAST = 0x1C1,
+ NOUN_CHICKEN_ON_SPIT = 0x1C2,
+ NOUN_CAPTIVE_CREATURE = 0x1C3,
+ NOUN_TWINKIFRUIT_BUSH = 0x1C4,
+ NOUN_STREAM = 0x1C5,
+ NOUN_OPPOSITE_SHORE = 0x1C6,
+ NOUN_PATH_TO_SOUTH = 0x1C7,
+ NOUN_OPPOSITE_BANK = 0x1C8,
+ NOUN_BROKEN_LADDER = 0x1C9,
+ NOUN_BAG_OF_TWINKIFRUITS = 0x1CA,
+ NOUN_BED = 0x1CB,
+ NOUN_DISPLAY = 0x1CC,
+ //NOUN_LEAVE = 0x1CD,
+ //NOUN_EXIT_FROM = 0x1CE,
+ NOUN_DEVICE = 0x1CF,
+ NOUN_0_KEY = 0x1D0,
+ NOUN_1_KEY = 0x1D1,
+ NOUN_2_KEY = 0x1D2,
+ NOUN_3_KEY = 0x1D3,
+ NOUN_4_KEY = 0x1D4,
+ NOUN_5_KEY = 0x1D5,
+ NOUN_6_KEY = 0x1D6,
+ NOUN_7_KEY = 0x1D7,
+ NOUN_8_KEY = 0x1D8,
+ NOUN_9_KEY = 0x1D9,
+ NOUN_FROWN_KEY = 0x1DA,
+ NOUN_SMILE_KEY = 0x1DB,
+ NOUN_NATIVE_WOMAN = 0x1DC,
+ NOUN_YELLOW_BIRD = 0x1DD,
+ NOUN_BLEEPER = 0x1DE,
+ NOUN_SIZEMOMETER = 0x1DF,
+ NOUN_PANEL = 0x1E0,
+ NOUN_PRINTER = 0x1E1,
+ NOUN_HARD_DRIVE = 0x1E2,
+ NOUN_BATHROOM = 0x1E3,
+ NOUN_DESK = 0x1E4,
+ NOUN_PASSAGEWAY = 0x1E5,
+ NOUN_FIRE_HYDRANT = 0x1E6,
+ NOUN_FREEZER = 0x1E7,
+ NOUN_EQUIDIGITIZER = 0x1E8,
+ NOUN_VISION_VIEW = 0x1E9,
+ NOUN_TELEDETECTOR = 0x1EA,
+ NOUN_POLE = 0x1EB,
+ NOUN_TRANSPOSITION_DEVICE = 0x1EC,
+ NOUN_STATUESQUE = 0x1ED,
+ NOUN_TEMPERATURE_GAUGE = 0x1EE,
+ NOUN_CHECK = 0x1EF,
+ NOUN_WATCH = 0x1F0,
+ NOUN_ELECTRO_SCANNER = 0x1F1,
+ NOUN_HALL = 0x1F2,
+ NOUN_SCANNER = 0x1F3,
+ //NOUN_PLACE_HAND_ON = 0x1F4,
+ NOUN_SECURITY_MONITOR = 0x1F5,
+ NOUN_DIGITORAMA = 0x1F6,
+ NOUN_RAIL_BEAM = 0x1F7,
+ NOUN_VAULT = 0x1F8,
+ NOUN_HALLWAY = 0x1F9,
+ NOUN_PIPES = 0x1FA,
+ NOUN_AIR_VENT_GRATE = 0x1FB,
+ NOUN_SECURITY_OFFICE = 0x1FC,
+ NOUN_SIGNAL = 0x1FD,
+ NOUN_BLEEP = 0x1FE,
+ NOUN_BLIP = 0x1FF,
+ NOUN_LOFT = 0x200,
+ NOUN_ELECTRONIC_ANT_FARM = 0x201,
+ NOUN_ELECTRIC_WIRING = 0x202,
+ NOUN_SECURITY_PANEL = 0x203,
+ NOUN_CORRIDOR = 0x204,
+ NOUN_CIRCUIT_CONTROLS = 0x205,
+ NOUN_AIR_DUCT = 0x206,
+ NOUN_CELL_WALL = 0x207,
+ NOUN_LIGHTS = 0x208,
+ //NOUN_STARE_INTO = 0x209,
+ NOUN_CELL_CONTROLS = 0x20A,
+ NOUN_COMMODE = 0x20B,
+ //NOUN_USE = 0x20C,
+ NOUN_BASIN = 0x20D,
+ //NOUN_JUMP_INSIDE = 0x20E,
+ NOUN_PREVIOUS_CELL = 0x20F,
+ NOUN_NEXT_ROOM = 0x210,
+ NOUN_ZINK = 0x211,
+ //NOUN_GAZE_INTO = 0x212,
+ NOUN_THRONE = 0x213,
+ NOUN_SACK = 0x214,
+ NOUN_LIMB = 0x215,
+ NOUN_SINK = 0x216,
+ NOUN_JOHNNY_ON_THE_SPOT = 0x217,
+ NOUN_DEBRIS = 0x218,
+ NOUN_BUNK = 0x219,
+ NOUN_NEXT_CELL = 0x21A,
+ NOUN_TOILET = 0x21B,
+ NOUN_MONITOR_AREA = 0x21C,
+ NOUN_SIDEWALL = 0x21D,
+ NOUN_COFFEE_MUG = 0x21E,
+ //NOUN_SIT_AT = 0x21F,
+ NOUN_LIGHTING_FIXTURE = 0x220,
+ NOUN_MONITORS = 0x221,
+ NOUN_GENDER_CONTROLS = 0x222,
+ NOUN_NEURO_ANALYZER = 0x223,
+ NOUN_MOLECULAR_RECORDER = 0x224,
+ NOUN_MAINTENANCE_PANEL = 0x225,
+ NOUN_RAMP = 0x226,
+ //NOUN_WALK_UP = 0x227,
+ NOUN_SUBSONIC_ATOMIZER = 0x228,
+ NOUN_EIGHT_BALL = 0x229,
+ NOUN_DNA_INVERTER = 0x22A,
+ NOUN_DNA_CONVERTER = 0x22B,
+ NOUN_PLATFORM = 0x22C,
+ NOUN_GUINEA_PIG_TEST_BOX = 0x22D,
+ NOUN_GASEOUS_PROBE_WARPER = 0x22E,
+ NOUN_TOOL_CABINET = 0x22F,
+ NOUN_SURGICAL_BOXES = 0x230,
+ NOUN_FETAL_HEART_MONITOR = 0x231,
+ NOUN_XRAY_CABINET = 0x232,
+ NOUN_STERILIZATION_SINK = 0x233,
+ NOUN_DRIPOLATOR = 0x234,
+ NOUN_SHOCK_MACHINE = 0x235,
+ NOUN_INTERROGATION_TABLE = 0x236,
+ NOUN_LIE_DOWN_ON = 0x237,
+ //NOUN_DECIPHER = 0x238,
+ NOUN_GUARD = 0x239,
+ NOUN_RIP_IN_FLOOR = 0x23A,
+ NOUN_TELEPORT_AREA = 0x23B,
+ NOUN_BROKEN_BEAM = 0x23C,
+ NOUN_ROCK_CHUNK = 0x23D,
+ NOUN_BLOODY_CELL_WALL = 0x23E,
+ NOUN_WALL_BOARD = 0x23F,
+ NOUN_GENDER_SCANNER = 0x240,
+ NOUN_BAR = 0x241,
+ //NOUN_WALK_INTO = 0x242,
+ NOUN_HALLWAY_TO_SOUTH = 0x243,
+ NOUN_SIGN = 0x244,
+ NOUN_HALLWAY_TO_NORTH = 0x245,
+ NOUN_BOTTLES = 0x246,
+ NOUN_UPPER_DANCE_FLOOR = 0x247,
+ NOUN_DANCE_FLOOR = 0x248,
+ NOUN_RAILING = 0x249,
+ NOUN_BAR_STOOL = 0x24A,
+ NOUN_LADY = 0x24B,
+ NOUN_UPPER_LEVEL = 0x24C,
+ NOUN_ALCOVE = 0x24D,
+ NOUN_DISCO_BALL = 0x24E,
+ NOUN_LADIES = 0x24F,
+ NOUN_COACH_LAMP = 0x250,
+ NOUN_CARD_SLOT = 0x251,
+ NOUN_HOOP = 0x252,
+ NOUN_CANNONBALLS = 0x253,
+ NOUN_WATER_FOUNTAIN = 0x254,
+ NOUN_HALLWAY_TO_EAST = 0x255,
+ NOUN_HALLWAY_TO_WEST = 0x256,
+ NOUN_SUPPORT = 0x257,
+ NOUN_BACKBOARD = 0x258,
+ NOUN_WIDE_DOOR = 0x259,
+ NOUN_SIGN_POST = 0x25A,
+ NOUN_FIRE_EXTINGUISHER = 0x25B,
+ NOUN_TRASH = 0x25C,
+ NOUN_MISSILES = 0x25D,
+ NOUN_TANK = 0x25E,
+ NOUN_TWO_TON_WEIGHT = 0x25F,
+ NOUN_ONE_TON_TOMATO = 0x260,
+ NOUN_ANVIL = 0x261,
+ NOUN_MINUTEMAN_IV_ICBM = 0x262,
+ NOUN_CHEST = 0x263,
+ NOUN_ARMOR = 0x264,
+ NOUN_CARTON = 0x265,
+ NOUN_POWDER = 0x266,
+ NOUN_RAFT = 0x267,
+ NOUN_WHATZIT = 0x268,
+ NOUN_CATAPULT = 0x269,
+ NOUN_HAND_GRENADE = 0x26A,
+ NOUN_BARRELS = 0x26B,
+ NOUN_LOADING_RAMP = 0x26C,
+ NOUN_BLIMP = 0x26D,
+ NOUN_FLOUR = 0x26E,
+ NOUN_FLY_PAPER = 0x26F,
+ NOUN_RUG = 0x270,
+ NOUN_CARPET = 0x271,
+ NOUN_CAN = 0x272,
+ NOUN_RUBBER_DUCKIE = 0x273,
+ NOUN_GOLF_CLUBS = 0x274,
+ NOUN_RAT = 0x275,
+ NOUN_BARREL = 0x276,
+ NOUN_BUCKET_OF_TAR = 0x277,
+ NOUN_SACKS = 0x278,
+ NOUN_STORAGE = 0x279,
+ NOUN_120V_3_PHASE_400HZ = 0x27A,
+ NOUN_LAB_EQUIPMENT = 0x27B,
+ NOUN_AIR_HORN = 0x27C,
+ NOUN_JAR = 0x27D,
+ NOUN_SEVERED_CABLE = 0x27E,
+ NOUN_PROBE_ASSEMBLY = 0x27F,
+ NOUN_KNIFE_SWITCH = 0x280,
+ NOUN_WORK_BENCH = 0x281,
+ NOUN_HEATER = 0x282,
+ NOUN_TOXIC_WASTE = 0x283,
+ NOUN_EXPERIMENT = 0x284,
+ NOUN_DRAWING_BOARD = 0x285,
+ NOUN_MISHAP = 0x286,
+ NOUN_AIR_PURIFIER = 0x287,
+ NOUN_DUMMY = 0x288,
+ NOUN_PICTURE = 0x289,
+ NOUN_BAGGAGE_CHECK = 0x28A,
+ NOUN_DEPARTURE_SCHEDULE = 0x28B,
+ NOUN_SHADE_OF_PALE = 0x28C,
+ NOUN_ITINERARY = 0x28D,
+ NOUN_BARGAIN_VAT = 0x28E,
+ NOUN_PENCILS = 0x28F,
+ NOUN_PAD_IF_PAPER = 0x290,
+ NOUN_DEEPEST_DEPTHS = 0x291,
+ NOUN_ROLODEX = 0x292,
+ NOUN_MONA_TISA = 0x293,
+ NOUN_ABSTRACT_ART = 0x294,
+ NOUN_SPACE_QUESTING_VIII = 0x295,
+ NOUN_THEATRICAL_ART = 0x296,
+ NOUN_METAL_POLE = 0x297,
+ NOUN_EXIT = 0x298,
+ NOUN_SWIRLING_LIGHT = 0x299,
+ NOUN_REGISTER = 0x29A,
+ NOUN_PEACHY_BUNS = 0x29B,
+ NOUN_OUR_TOWN = 0x29C,
+ NOUN_EMBROIDERED_ART = 0x29D,
+ NOUN_GEORGE_BUSH_ALIKE = 0x29E,
+ NOUN_COUNTER = 0x29F,
+ NOUN_SENSOR = 0x2A0,
+ NOUN_SOFTWARE_INFORMATION = 0x2A1,
+ NOUN_WALK_BEHIND = 0x2A2,
+ NOUN_BARGAINS = 0x2A3,
+ NOUN_SCAN_LIGHT = 0x2A4,
+ NOUN_OLD_SOFTWARE_STAND = 0x2A5,
+ NOUN_SOFTWARE_SHELF = 0x2A6,
+ NOUN_HOTTEST_SOFTWARE = 0x2A7,
+ NOUN_GREAT_PAINTBALL_ART = 0x2A8,
+ NOUN_SCENIC_VISTA = 0x2A9,
+ NOUN_LASER = 0x2AA,
+ NOUN_LASER_JET = 0x2AB,
+ NOUN_LEVER = 0x2AC,
+ NOUN_BULLSEYE = 0x2AD,
+ NOUN_STAND = 0x2AE,
+ NOUN_CONTROL_STATION = 0x2AF,
+ NOUN_STRANGE_MONSTER = 0x2B0,
+ NOUN_GHASTLY_BEAST = 0x2B1,
+ //NOUN_GAWK_AT = 0x2B2,
+ NOUN_CORRIDOR_TO_SOUTH = 0x2B3,
+ NOUN_CORRIDOR_TO_NORTH = 0x2B4,
+ NOUN_WALK_ONTO = 0x2B5,
+ NOUN_ROCK_WALL = 0x2B6,
+ NOUN_WOMAN = 0x2B7,
+ NOUN_WOMEN = 0x2B8,
+ NOUN_CORRIDOR_TO_EAST = 0x2B9,
+ NOUN_CORRIDOR_TO_WEST = 0x2BA,
+ NOUN_AMMUNITION = 0x2BB,
+ NOUN_ARMORED_VEHICLE = 0x2BC,
+ NOUN_TOMATO = 0x2BD,
+ NOUN_MISSILE = 0x2BE,
+ NOUN_SUIT_OF_ARMOR = 0x2BF,
+ NOUN_POWDER_CONTAINER = 0x2C0,
+ NOUN_INFLATABLE_RAFT = 0x2C1,
+ NOUN_GRENADE = 0x2C2,
+ NOUN_FENCE = 0x2C3,
+ NOUN_WOODEN_STATUE = 0x2C4,
+ NOUN_CONVEYER_BELT = 0x2C5,
+ NOUN_CONTROLS = 0x2C6,
+ NOUN_EQUIPMENT = 0x2C7,
+ NOUN_SHELF = 0x2C8,
+ NOUN_CABINETS = 0x2C9,
+ NOUN_CONTROL_CONSOLE = 0x2CA,
+ NOUN_FAUCET = 0x2CB,
+ NOUN_PANEL_BOX = 0x2CC,
+ NOUN_STATUE = 0x2CD,
+ NOUN_GAUGE = 0x2CE,
+ NOUN_CIRCUIT_PANEL = 0x2CF,
+ NOUN_CATWALK = 0x2D0,
+ NOUN_CIRCUITS = 0x2D1,
+ NOUN_BLOOD_STAIN = 0x2D2,
+ NOUN_GRATE = 0x2D3,
+ NOUN_AIR_SHAFT = 0x2D4,
+ //NOUN_RETURN_TO = 0x2D5,
+ NOUN_FORMALDEHYDE = 0x2D6,
+ NOUN_PETROX = 0x2D7,
+ NOUN_SODIUM_BENZOATE = 0x2D8,
+ NOUN_GURNEY = 0x2D9,
+ NOUN_IRONING_BOARD = 0x2DA,
+ NOUN_LEFT_MONITOR = 0x2DB,
+ NOUN_RIGHT_MONITOR = 0x2DC,
+ NOUN_RED_BUTTON = 0x2DD,
+ NOUN_GREEN_BUTTON = 0x2DE,
+ NOUN_RIGHT_ONE_KEY = 0x2DF,
+ NOUN_RIGHT_1_KEY = 0x2E0,
+ NOUN_RIGHT_2_KEY = 0x2E1,
+ NOUN_RIGHT_3_KEY = 0x2E2,
+ NOUN_RIGHT_4_KEY = 0x2E3,
+ NOUN_RIGHT_5_KEY = 0x2E4,
+ NOUN_RIGHT_6_KEY = 0x2E5,
+ NOUN_RIGHT_7_KEY = 0x2E6,
+ NOUN_RIGHT_8_KEY = 0x2E7,
+ NOUN_LEFT_1_KEY = 0x2E8,
+ NOUN_LEFT_2_KEY = 0x2E9,
+ NOUN_LEFT_3_KEY = 0x2EA,
+ NOUN_LEFT_4_KEY = 0x2EB,
+ NOUN_CORRIDOR_WALL = 0x2EC,
+ NOUN_MUG = 0x2ED,
+ NOUN_DOUGHNUT = 0x2EE,
+ NOUN_SECURITY_STATION = 0x2EF,
+ NOUN_NEWSPAPER = 0x2F0,
+ NOUN_MAGAZINE = 0x2F1,
+ NOUN_CLIPBOARD = 0x2F2,
+ NOUN_PAPER_FOOTBALL = 0x2F3,
+ NOUN_YOUR_STUFF = 0x2F4,
+ NOUN_OTHER_STUFF = 0x2F5,
+ NOUN_LAMP = 0x2F6,
+ NOUN_CLIMB_INTO = 0x2F7,
+ NOUN_LIGHT_BULB = 0x2F8,
+ //NOUN_STEP_INTO = 0x2F9,
+ NOUN_ROOM = 0x2FA,
+ //NOUN_CRAWL_TO = 0x2FB,
+ NOUN_FOURTH_CELL = 0x2FC,
+ NOUN_THIRD_CELL = 0x2FD,
+ NOUN_SECOND_CELL = 0x2FE,
+ NOUN_FIRST_CELL = 0x2FF,
+ NOUN_EQUIPMENT_ROOM = 0x300,
+ //NOUN_CRAWL_DOWN = 0x301,
+ NOUN_DESCENDING_SHAFT = 0x302,
+ NOUN_SAUROPOD = 0x303,
+ NOUN_MONSTER = 0x304,
+ NOUN_FAKE_ID = 0x305,
+ NOUN_ALIEN_LIQUOR = 0x306,
+ NOUN_INTERN = 0x307,
+ NOUN_INSTRUMENT_TABLE = 0x308,
+ NOUN_WOMAN_ON_BALCONY = 0x309,
+ NOUN_WOMAN_IN_CHAIR = 0x30A,
+ //NOUN_SIT_ON = 0x30B,
+ NOUN_WOMAN_IN_ALCOVE = 0x30C,
+ NOUN_KETTLE = 0x30D,
+ NOUN_BARTENDER = 0x30E,
+ NOUN_WHISKEY = 0x30F,
+ NOUN_ALCOHOL = 0x310,
+ NOUN_RIM = 0x311,
+ //NOUN_WALK_ALONG = 0x312,
+ NOUN_SUBMERGED_CITY = 0x313,
+ NOUN_GOVERNORS_HOUSE = 0x314,
+ NOUN_RIM_TOWARDS_EAST = 0x315,
+ NOUN_CEMENT_PYLON = 0x316,
+ NOUN_ELEVATOR = 0x317,
+ NOUN_ELEVATOR_SHAFT = 0x318,
+ NOUN_CONVEYOR_BELT = 0x319,
+ NOUN_CANNON_BALLS = 0x31A,
+ NOUN_ELECTRICAL_OVERHANG = 0x31B,
+ NOUN_GUTTER_PIPE = 0x31C,
+ NOUN_SIDEWALK = 0x31D,
+ NOUN_STREET = 0x31E,
+ NOUN_BARRICADE = 0x31F,
+ NOUN_DOOR_CONTROL_SLOT = 0x320,
+ NOUN_STREET_TO_EAST = 0x321,
+ NOUN_SIDEWALK_TO_EAST = 0x322,
+ NOUN_BUILDING = 0x323,
+ NOUN_CAR = 0x324,
+ //NOUN_GET_INSIDE = 0x325,
+ NOUN_MARQUEE = 0x326,
+ NOUN_BUILDING_ENTRANCE = 0x327,
+ NOUN_GUARD_STATION = 0x328,
+ NOUN_TECHNICAL_EQUIPMENT = 0x329,
+ NOUN_GUARD_TURRET = 0x32A,
+ NOUN_PILLAR = 0x32B,
+ NOUN_PAPERS = 0x32C,
+ NOUN_FILE_CABINET = 0x32D,
+ NOUN_WINDOWS = 0x32E,
+ //NOUN_WALK = 0x32F,
+ NOUN_STORAGE_BOX = 0x330,
+ NOUN_WATER_COOLER = 0x331,
+ NOUN_BOX = 0x332,
+ NOUN_RIFLES = 0x333,
+ NOUN_SLINGSHOT = 0x334,
+ NOUN_MAUSOLEUM = 0x335,
+ NOUN_SOFTWARE_STORE = 0x336,
+ NOUN_CONCRETE_BUILDING = 0x337,
+ NOUN_HUMONGOUS_MONITOR = 0x338,
+ NOUN_SPACE_BIKE = 0x339,
+ NOUN_BILLBOARD = 0x33A,
+ NOUN_LACK_OF_NOOKIE_MOTEL = 0x33B,
+ NOUN_BIDETS_XCREETZA_HUT = 0x33C,
+ NOUN_BUILDINGS = 0x33D,
+ NOUN_SKYSCRAPER = 0x33E,
+ NOUN_SOFTWARE_LOGO = 0x33F,
+ NOUN_GIANT_TELESCOPE = 0x340,
+ NOUN_HANDLE = 0x341,
+ NOUN_HOLE = 0x342,
+ NOUN_LASER_BEAM = 0x343,
+ NOUN_PEDESTAL = 0x344,
+ NOUN_BOAT = 0x345,
+ NOUN_GIANT_MONUMENT = 0x346,
+ NOUN_ROPE = 0x347,
+ NOUN_SAND_BAR_RESTAURANT = 0x348,
+ NOUN_PORTHOLE = 0x349,
+ NOUN_TICKET_BOOTH = 0x34A,
+ NOUN_POLLYS_ENTRANCE = 0x34B,
+ NOUN_RESTAURANT_ENTRANCE = 0x34C,
+ NOUN_THE_PLEASURE_DOME = 0x34D,
+ NOUN_STARFISH = 0x34E,
+ NOUN_FLIPPER = 0x34F,
+ NOUN_SAND_DOLLAR = 0x350,
+ NOUN_SHELL = 0x351,
+ NOUN_GUEST_LIST = 0x352,
+ NOUN_WEIRD_ANIMAL_HEAD = 0x353,
+ NOUN_SHIPS_WHEEL = 0x354,
+ NOUN_HANDICAP_SIGN = 0x355,
+ NOUN_ELEVATOR_CONTROLS = 0x356,
+ NOUN_BRICK_WALL = 0x357,
+ NOUN_BIKE_RACK = 0x358,
+ NOUN_ODONALDS_SIGN = 0x359,
+ NOUN_ELEVATOR_ENTRANCE = 0x35A,
+ NOUN_SPECIAL_SALE_SIGN = 0x35B,
+ NOUN_ATTORNEYS_AT_LAW = 0x35C,
+ NOUN_SLEDGE_MALL = 0x35D,
+ NOUN_SKELETON = 0x35E,
+ NOUN_STRANGE_EQUIPMENT = 0x35F,
+ NOUN_STREET_TO_WEST = 0x360,
+ NOUN_SIDEWALK_TO_WEST = 0x361,
+ NOUN_TELEPORTER_ENTRANCE = 0x362,
+ NOUN_SOFTWARE_DOOR = 0x363,
+ NOUN_SPINACH_PATCH_DOLL = 0x364,
+ //NOUN_REFLECT = 0x365,
+ NOUN_REGISTER_DRAWER = 0x366,
+ NOUN_ELEVATOR_DOOR = 0x367,
+ NOUN_HYDRAULIC_SUPPORT = 0x368,
+ NOUN_EQUIPMENT_OVERHEAD = 0x369,
+ //NOUN_GET_INTO = 0x36A,
+ NOUN_WARNING_LABEL = 0x36B,
+ NOUN_NUCLEAR_SLINGSHOT = 0x36C,
+ NOUN_DISPLAY_CASE = 0x36D,
+ NOUN_PHOTON_RIFLES = 0x36E,
+ NOUN_MONITORING_EQUIPMENT = 0x36F,
+ NOUN_TELESCOPE = 0x370,
+ NOUN_MOTEL = 0x371,
+ NOUN_RESTAURANT = 0x372,
+ NOUN_SOFTWARE_STORE_SIGN = 0x373,
+ NOUN_ADVERTISING_POSTER = 0x374,
+ NOUN_ADVERTISEMENT = 0x375,
+ NOUN_OLD_SOFTWARE = 0x376,
+ NOUN_CASH_REGISTER = 0x377,
+ NOUN_ENTRANCE = 0x378,
+ NOUN_LASER_CANNON = 0x379,
+ NOUN_SAND_BAGS = 0x37A,
+ NOUN_PLEASURE_DOME = 0x37B,
+ NOUN_DOME_ENTRANCE = 0x37C,
+ NOUN_LABORATORY = 0x37D,
+ NOUN_STREET_TO_SOUTH = 0x37E,
+ NOUN_ELEVATOR_ACCESS_SLOT = 0x37F,
+ NOUN_CAR_CONTROLS = 0x380,
+ NOUN_SCENT_PACKET = 0x381,
+ NOUN_KITTY = 0x382,
+ NOUN_GLOVE_COMPARTMENT = 0x383,
+ NOUN_MOLDY_SOCK = 0x384,
+ NOUN_SODA_CANS = 0x385,
+ NOUN_WINDSHIELD = 0x386,
+ NOUN_DASHBOARD = 0x387,
+ NOUN_INTERIOR_OF_CAR = 0x388,
+ NOUN_VIEW_RIGHT_BUTTON = 0x389,
+ NOUN_BLACK_BUTTON = 0x38A,
+ NOUN_WHITE_BUTTON = 0x38B,
+ NOUN_INSIDE_OF_CAR = 0x38C,
+ NOUN_RIM_TOWARDS_WEST = 0x38D,
+ NOUN_CEMENT_BLOCK = 0x38E,
+ NOUN_CITY = 0x38F,
+ NOUN_SPEAKER = 0x390,
+ NOUN_EYE_CHART = 0x391,
+ NOUN_LAUNCH_PAD = 0x392,
+ NOUN_BUILDING_TO_WEST = 0x393,
+ NOUN_PAD_TO_EAST = 0x394,
+ NOUN_PAD_TO_WEST = 0x395,
+ NOUN_TOWER = 0x396,
+ NOUN_LOOK_OUT = 0x397,
+ NOUN_SERVICE_PANEL = 0x398,
+ NOUN_CRACK = 0x399,
+ NOUN_THROTTLE = 0x39A,
+ NOUN_GRAB = 0x39B,
+ NOUN_INSTRUMENTATION = 0x39C,
+ NOUN_TP = 0x39D,
+ NOUN_SEAT = 0x39E,
+ NOUN_STATUS_PANEL = 0x39F,
+ NOUN_SHIPS_CONTROLS = 0x3A0,
+ NOUN_PROFESSOR = 0x3A1,
+ NOUN_PROFESSORS_GURNEY = 0x3A2,
+ NOUN_WELCOME_MAT = 0x3A3,
+ NOUN_MELON_MUSH = 0x3A4,
+ NOUN_BADMINTON_BRAT = 0x3A5,
+ //NOUN_APPLY = 0x3A6,
+ NOUN_COMBINATION = 0x3A7,
+ NOUN_NOTE = 0x3A8,
+ NOUN_LECITHIN = 0x3A9,
+ NOUN_REPAIR_WOMAN = 0x3AA,
+ NOUN_EXPLOSIVES = 0x3AB,
+ NOUN_DOLLOP = 0x3AC,
+ NOUN_DROP = 0x3AD,
+ NOUN_DASH = 0x3AE,
+ NOUN_SPLASH = 0x3AF,
+ NOUN_DOCK_TO_SOUTH = 0x3B0,
+ //NOUN_STEER_TOWARDS = 0x3B1,
+ NOUN_BUILDING_TO_NORTH = 0x3B2,
+ NOUN_VOLCANO_RIM = 0x3B3,
+ NOUN_OPEN_WATER_TO_SOUTH = 0x3B4,
+ NOUN_PROJECTOR = 0x3B5,
+ NOUN_GUARDS_ARM2 = 0x3B6,
+ //NOUN_NIBBLE_ON = 0x3B7,
+ //NOUN_ENTER = 0x3B8,
+ NOUN_ = 0x3B9,
+ NOUN_TIMER_BUTTON_1 = 0x3BA,
+ NOUN_REMOTE_BUTTON_1 = 0x3BB,
+ NOUN_START_BUTTON_2 = 0x3BC,
+ NOUN_REMOTE_BUTTON_2 = 0x3BD,
+ NOUN_TIMER_BUTTON_2 = 0x3BE,
+ NOUN_START_BUTTON_1 = 0x3BF,
+ NOUN_ANTIGRAV_CONTROLS = 0x3C0,
+ NOUN_BRUCES_TREE = 0x3C1,
+ NOUN_COLISEUM = 0x3C2,
+ NOUN_BRUCES_GARDEN_ROOM = 0x3C3,
+ NOUN_FOUNTAIN = 0x3C4,
+ NOUN_HOUSE_OF_BRUCE = 0x3C5,
+ NOUN_CITY_BACKDROP = 0x3C6,
+ NOUN_BRUCES_BALCONY = 0x3C7,
+ NOUN_BRUCES_ENTRANCE = 0x3C8,
+ NOUN_BRUCES_LOGO = 0x3C9,
+ NOUN_LOUNGE_CHAIR = 0x3CA,
+ NOUN_LIVING_ROOM_FLOOR = 0x3CB,
+ NOUN_LIVINGROOM_FLOOR = 0x3CC,
+ NOUN_PERFUME_BOTTLE = 0x3CD,
+ NOUN_COOL_NEON_LIGHT = 0x3CE,
+ NOUN_FLOWER_POT = 0x3CF,
+ NOUN_COFFEE_TABLE = 0x3D0,
+ NOUN_FLOWERS = 0x3D1,
+ NOUN_ART_DECO_CHAIR = 0x3D2,
+ NOUN_SAFE = 0x3D3,
+ NOUN_SPLASHY_DECOR = 0x3D4,
+ NOUN_THEATRICAL_FACES = 0x3D5,
+ NOUN_ART_DECO_PIECE = 0x3D6,
+ NOUN_END_OF_ROOM = 0x3D7,
+ NOUN_FIREPLACE = 0x3D8,
+ NOUN_ARTWORK = 0x3D9,
+ NOUN_COOL_NEON_LIGHTS = 0x3DA,
+ NOUN_GLASS_PLATED_WINDOW = 0x3DB,
+ NOUN_BEDROOM_FLOOR = 0x3DC,
+ NOUN_BAUBLE = 0x3DD,
+ NOUN_SNAPSHOT = 0x3DE,
+ NOUN_PERFUME = 0x3DF,
+ NOUN_CLAPBOARD = 0x3E0,
+ NOUN_BERET = 0x3E1,
+ NOUN_HORSE_WHIP = 0x3E2,
+ NOUN_CORNER_TABLE = 0x3E3,
+ NOUN_BOA = 0x3E4,
+ NOUN_WIG_STAND = 0x3E5,
+ NOUN_PARTITION = 0x3E6,
+ NOUN_MEGAPHONE = 0x3E7,
+ NOUN_SLIP = 0x3E8,
+ NOUN_SCONCE = 0x3E9,
+ NOUN_VANITY = 0x3EA,
+ NOUN_BEDBOARD = 0x3EB,
+ NOUN_LOVE_SEAT = 0x3EC,
+ NOUN_SOUVENIR_TICKETS = 0x3ED,
+ NOUN_REVIEW = 0x3EE,
+ NOUN_BRUCE_AT_THE_GALA = 0x3EF,
+ NOUN_ART_DECO_RUG = 0x3F0,
+ NOUN_LIVINGROOM = 0x3F1,
+ NOUN_SCULPTURE = 0x3F2,
+ NOUN_SPECIMEN_EPITHET = 0x3F3,
+ NOUN_VENT = 0x3F4,
+ NOUN_FLOWER_BOX = 0x3F5,
+ NOUN_LEDGE = 0x3F6,
+ NOUN_BOLT = 0x3F7,
+ NOUN_OBSERVATION_WINDOW = 0x3F8,
+ NOUN_AIR_HOSE = 0x3F9,
+ NOUN_AUTO_SHOP = 0x3FA,
+ NOUN_MANHOLE = 0x3FB,
+ NOUN_AUTO_SHOP_ENTRANCE = 0x3FC,
+ NOUN_BROKEN_WINDOW = 0x3FD,
+ NOUN_WOMANHOLE = 0x3FE,
+ NOUN_GARAGE_DOOR = 0x3FF,
+ NOUN_SCRATCH_PAD = 0x400,
+ NOUN_GAS_PRICES = 0x401,
+ NOUN_UP_BUTTON = 0x402,
+ NOUN_DOWN_BUTTON = 0x403,
+ NOUN_SPARE_PARTS_LIST = 0x404,
+ NOUN_SKYLIGHT = 0x405,
+ NOUN_TOOL_BOX = 0x406,
+ NOUN_CAR_LIFT = 0x407,
+ NOUN_CAR_SEAT = 0x408,
+ NOUN_GARAGE_FLOOR = 0x409,
+ NOUN_GARAGE_DOOR_CONTROLS = 0x40A,
+ NOUN_AMISH_HAT = 0x40B,
+ NOUN_JACK = 0x40C,
+ NOUN_COILS = 0x40D,
+ NOUN_OIL_CAN = 0x40E,
+ NOUN_FAN_BELTS = 0x40F,
+ NOUN_REAR_OF_GARAGE = 0x410,
+ NOUN_FRONT_OF_GARAGE = 0x411,
+ NOUN_MUFFLER = 0x412,
+ NOUN_SPARE_PART = 0x413,
+ NOUN_HUBCAP = 0x414,
+ NOUN_CANDLE = 0x415,
+ NOUN_RATES = 0x416,
+ NOUN_GREASE_CAN = 0x417,
+ NOUN_CALENDAR = 0x418,
+ NOUN_FORK_LIFT = 0x419,
+ NOUN_TRASH_CAN = 0x41A,
+ NOUN_SHAKER_CHAIR = 0x41B,
+ NOUN_QUARTER_PANEL = 0x41C,
+ NOUN_AREA_BEHIND_CAR = 0x41D,
+ NOUN_DANGER_ZONE = 0x41E,
+ NOUN_NEWSSTAND = 0x41F,
+ NOUN_LADY_GODIVA_MONUMENT = 0x420,
+ NOUN_SPOT_A_POT = 0x421,
+ NOUN_GUARD_RAIL = 0x422,
+ NOUN_ALLEY = 0x423,
+ NOUN_DITCH = 0x424,
+ NOUN_VIDEO_STORE_DOOR = 0x425,
+ NOUN_BUCKLUSTER_MARQUEE = 0x426,
+ NOUN_VIDEO_STORE = 0x427,
+ NOUN_HORMONE_BILLBOARD = 0x428,
+ NOUN_PHONE_ANTENNA = 0x429,
+ NOUN_RETURN_SLOT = 0x42A,
+ NOUN_NOOSE = 0x42B,
+ NOUN_COMEDY_VIDEOS = 0x42C,
+ NOUN_SMELLY_SNEAKER = 0x42D,
+ NOUN_PIPPYS_STOCKING = 0x42E,
+ NOUN_PHONE_CRADLE = 0x42F,
+ NOUN_DRAMA_VIDEOS = 0x430,
+ NOUN_SPOTLIGHT = 0x431,
+ NOUN_STOREROOM_FLOOR = 0x432,
+ NOUN_ALL_SALES_FINAL = 0x433,
+ NOUN_MACHOPROSE_TEE_SHIRT = 0x434,
+ NOUN_UNKNOWN_COMIC_HANDS = 0x435,
+ NOUN_WET_CEMENT = 0x436,
+ NOUN_PIPPYS_TINY_IMPRINT = 0x437,
+ NOUN_OBNOXIOUS_DOG_PAWS = 0x438,
+ NOUN_LEG_AND_A_LEG_JEANS = 0x439,
+ NOUN_VIDEO_STORE_EXIT = 0x43A,
+ NOUN_AISLE = 0x43B,
+ NOUN_VIDEO_MONITOR = 0x43C,
+ NOUN_POLLY_PIGS_IMPRINT = 0x43D,
+ NOUN_JOHN_WYNNS_IMPRINT = 0x43E,
+ NOUN_MR_NEDS_IMPRINT = 0x43F,
+ NOUN_PEG_LEG_PETE_IMPRINT = 0x440,
+ NOUN_MARX_BROS_POSTER = 0x441,
+ NOUN_PIPPY_BILLBOARD = 0x442,
+ NOUN_VIDEOS_NOONE_WANTS = 0x443,
+ NOUN_MORE_CLASSIC_VIDEOS = 0x444,
+ NOUN_JOIN_OUR_PRICE_CLUB = 0x445,
+ NOUN_EDUCATIONAL_VIDEOS = 0x446,
+ NOUN_DEEP_DISCOUNT_TITLES = 0x447,
+ NOUN_WORLD_CHAMPS_POSTER = 0x448,
+ NOUN_WORKOUT_VIDEOS = 0x449,
+ NOUN_20_PERCENT_OFF_SIGN = 0x44A,
+ NOUN_CIVILIZATION_AD = 0x44B,
+ NOUN_NEW_RELEASE_VIDEOS = 0x44C,
+ NOUN_PORNO_VIDEOS = 0x44D,
+ NOUN_FOREIGN_VIDEOS = 0x44E,
+ NOUN_CLASSIC_VIDEOS = 0x44F,
+ NOUN_ADVENTURE_VIDEOS = 0x450,
+ NOUN_BUCKLUSTER_LOGO = 0x451,
+ NOUN_WINE_BOTTLE = 0x452,
+ NOUN_DIRT_PILE = 0x453,
+ NOUN_MAMMOTH_PENCIL_HEAD = 0x454,
+ NOUN_WREAKY_PUMPKIN = 0x455,
+ NOUN_MILK_CARTON = 0x456,
+ NOUN_BUCKET = 0x457,
+ NOUN_EMPTY_BOX = 0x458,
+ NOUN_DIAPER_BOX = 0x459,
+ NOUN_HERMIT = 0x45A,
+ NOUN_METAL_PIPE = 0x45B,
+ NOUN_CONCRETE_SUPPORT = 0x45C,
+ NOUN_VARIOUS_TRASH = 0x45D,
+ NOUN_ARMATURE = 0x45E,
+ NOUN_CONTROL_BOX = 0x45F,
+ NOUN_TOP_OF_DOME = 0x460,
+ NOUN_EXPRESSWAY_TO_EAST = 0x461,
+ NOUN_GO_TOWARDS = 0x462,
+ NOUN_EXPRESSWAY_TO_WEST = 0x463,
+ NOUN_DOME = 0x464,
+ NOUN_VIEW_OF_CITY = 0x465,
+ NOUN_EXPRESSWAY = 0x466,
+ NOUN_HOOK = 0x467,
+ NOUN_SEA_MONSTER = 0x468,
+ NOUN_EDGE_OF_VOLCANO = 0x469,
+ NOUN_JUMP_THROUGH = 0x46A,
+ NOUN_OLD_TEA_CUP = 0x46B,
+ NOUN_NAME_PLATE = 0x46C,
+ NOUN_OLD_VASE = 0x46D,
+ NOUN_PORTRAIT = 0x46E,
+ //NOUN_PUT_DOWN = 0x46F,
+ NOUN_TALL_BUILDING = 0x470,
+ NOUN_OBNOXIOUS_DOG = 0x471,
+ NOUN_GUTS = 0x472,
+ NOUN_BIG_HEADS = 0x473,
+ NOUN_INSTALL = 0x474,
+ NOUN_LIFE_SUPPORT_MODULE = 0x475,
+ //NOUN_REMOVE = 0x476,
+ NOUN_LARGE_BLADE = 0x477,
+ NOUN_SIDE_ENTRANCE = 0x478,
+ NOUN_INDICATOR = 0x479,
+ NOUN_SIGNPOST = 0x47A,
+ NOUN_PIN = 0x47B,
+ NOUN_POWDER_PUFF = 0x47C,
+ NOUN_SHELVES = 0x47D,
+ NOUN_ELECTRODES = 0x47E,
+ NOUN_MISHAP2 = 0x47F,
+ NOUN_ISLD_SUPERSTRUCTURE = 0x480,
+ NOUN_FILE_CABINETS = 0x481,
+ NOUN_CYCLE_SHOP = 0x482,
+ NOUN_AIR_BIKE = 0x483,
+ NOUN_EMERGENCY_LIGHT = 0x484,
+ NOUN_TARGET_AREA = 0x485,
+ NOUN_ICE_CHESTS = 0x486,
+ NOUN_BIRDS = 0x487,
+ NOUN_DOCTORS_OFFICE = 0x488,
+ //NOUN_DEFACE = 0x489,
+ NOUN_LARGE_HEADS = 0x48A,
+ NOUN_SMALL_TABLE = 0x48B,
+ NOUN_COLLOSSEUM = 0x48C,
+ NOUN_HOUSE = 0x48D,
+ NOUN_BALCONY = 0x48E,
+ NOUN_GARDEN_ROOM = 0x48F,
+ NOUN_COVE_LIGHTS = 0x490,
+ NOUN_MASKS = 0x491,
+ NOUN_NEON_LIGHTS = 0x492,
+ NOUN_GLASS_BLOCK_WALL = 0x493,
+ NOUN_SCREEN = 0x494,
+ NOUN_SPARE_RIBS = 0x495,
+ NOUN_BANNER = 0x496,
+ NOUN_INSTRUCTIONAL_VIDEOS = 0x497,
+ NOUN_CEMENT = 0x498,
+ NOUN_STORE = 0x499,
+ NOUN_CARDBOARD_BOX = 0x49A,
+ NOUN_GRAFFITTI = 0x49B,
+ NOUN_GRAFFITI = 0x49C,
+ NOUN_PHOTOGRAPH = 0x49D,
+ NOUN_DIRECTORS_SLATE = 0x49E,
+ NOUN_CROP = 0x49F,
+ NOUN_HAT = 0x4A0,
+ NOUN_LOGO = 0x4A1,
+ NOUN_MAINTENANCE_BUILDING = 0x4A2,
+ //NOUN_MASSAGE = 0x4A3,
+ //NOUN_MANGLE = 0x4A4,
+ //NOUN_RUB = 0x4A5,
+ //NOUN_JUGGLE = 0x4A6,
+ //NOUN_SMASH = 0x4A7,
+ //NOUN_GUZZLE = 0x4A8,
+ NOUN_WEST_END_OF_PLATFORM = 0x4A9,
+ NOUN_EAST_END_OF_PLATFORM = 0x4AA
+ //NOUN_FOLD = 0x4AB,
+ //NOUN_SPINDLE = 0x4AC,
+ //NOUN_MUTILATE = 0x4AD
+};
+
+class SceneFactory {
+public:
+ static SceneLogic *createScene(MADSEngine *vm);
+};
+
+/**
+ * Specialized base class for Rex Nebular game scenes
+ */
+class NebularScene : public SceneLogic {
+protected:
+ NebularGlobals &_globals;
+ GameNebular &_game;
+ MADSAction &_action;
+
+ /**
+ * Forms an animation resource name
+ */
+ Common::String formAnimName(char sepChar, int suffixNum);
+
+ /**
+ * Plays appropriate sound for entering various rooms
+ */
+ void lowRoomsEntrySound();
+public:
+ /**
+ * Constructor
+ */
+ NebularScene(MADSEngine *vm);
+
+ void sub7178C();
+};
+
+class SceneInfoNebular : public SceneInfo {
+ friend class SceneInfo;
+protected:
+ virtual void loadCodes(MSurface &depthSurface, int variant);
+
+ virtual void loadCodes(MSurface &depthSurface, Common::SeekableReadStream *stream);
+
+ /**
+ * Constructor
+ */
+ SceneInfoNebular(MADSEngine *vm) : SceneInfo(vm) {}
+};
+
+class SceneTeleporter : public NebularScene {
+protected:
+ int _buttonTyped;
+ int _curCode;
+ int _digitCount;
+ int _curMessageId;
+ int _handSpriteId;
+ int _handSequenceId;
+ int _finishedCodeCounter;
+ int _meteorologistNextPlace;
+ int _meteorologistCurPlace;
+ int _teleporterSceneId;
+ Common::String _msgText;
+
+ int teleporterAddress(int code, bool working);
+
+ void teleporterHandleKey();
+ Common::Point teleporterComputeLocation();
+ void teleporterEnter();
+ bool teleporterActions();
+ void teleporterStep();
+
+protected:
+ /**
+ * Constructor
+ */
+ SceneTeleporter(MADSEngine *vm);
+};
+
+} // End of namespace Nebular
+} // End of namespace MADS
+
+#endif /* MADS_NEBULAR_SCENES_H */
diff --git a/engines/mads/nebular/nebular_scenes1.cpp b/engines/mads/nebular/nebular_scenes1.cpp
new file mode 100644
index 0000000000..a81f11b8a5
--- /dev/null
+++ b/engines/mads/nebular/nebular_scenes1.cpp
@@ -0,0 +1,3164 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+
+ * You should have received a copy of the GNU General Public 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 "mads/mads.h"
+#include "mads/scene.h"
+#include "mads/nebular/nebular_scenes.h"
+#include "mads/nebular/nebular_scenes1.h"
+
+namespace MADS {
+
+namespace Nebular {
+
+void Scene1xx::setAAName() {
+ int idx = (_scene->_nextSceneId > 103 && _scene->_nextSceneId < 112) ? 1 : 0;
+ _game._aaName = Resources::formatAAName(idx);
+}
+
+void Scene1xx::sceneEntrySound() {
+ if (_vm->_musicFlag) {
+ switch (_scene->_nextSceneId) {
+ case 101:
+ _vm->_sound->command(11);
+ break;
+ case 102:
+ _vm->_sound->command(12);
+ break;
+ case 103:
+ _vm->_sound->command(3);
+ _vm->_sound->command(25);
+ break;
+ case 109:
+ _vm->_sound->command(13);
+ break;
+ case 110:
+ _vm->_sound->command(10);
+ break;
+ case 111:
+ _vm->_sound->command(3);
+ break;
+ case 112:
+ _vm->_sound->command(15);
+ break;
+ default:
+ if (_scene->_priorSceneId < 104 || _scene->_priorSceneId > 108)
+ _vm->_sound->command(10);
+ break;
+ }
+ }
+}
+
+void Scene1xx::setPlayerSpritesPrefix() {
+ _vm->_sound->command(5);
+ Common::String oldName = _game._player._spritesPrefix;
+ if (_scene->_nextSceneId <= 103 || _scene->_nextSceneId == 111) {
+ if (_globals[kSexOfRex] == SEX_FEMALE)
+ _game._player._spritesPrefix = "ROX";
+ else {
+ _game._player._spritesPrefix = "RXM";
+ _globals[kSexOfRex] = SEX_MALE;
+ }
+ } else if (_scene->_nextSceneId <= 110) {
+ _game._player._spritesPrefix = "RXSW";
+ _globals[kSexOfRex] = SEX_UNKNOWN;
+ } else if (_scene->_nextSceneId == 112)
+ _game._player._spritesPrefix = "";
+
+ if (oldName == _game._player._spritesPrefix)
+ _game._player._spritesChanged = true;
+
+ if (_scene->_nextSceneId == 105 || (_scene->_nextSceneId == 109 && _globals[kHoovicAlive])) {
+ _game._player._spritesChanged = true;
+ _game._player._loadsFirst = false;
+ }
+
+ _game._player._trigger = 0;
+ _vm->_palette->setEntry(16, 10, 63, 63);
+ _vm->_palette->setEntry(17, 10, 45, 45);
+}
+
+/*------------------------------------------------------------------------*/
+
+Scene101::Scene101(MADSEngine *vm) : Scene1xx(vm) {
+ _sittingFl = false;
+ _panelOpened = false;
+ _messageNum = 0;
+ _posY = 0;
+ _shieldSpriteIdx = 0;
+ _chairHotspotId = 0;
+ _oldSpecial = 0;
+}
+
+void Scene101::synchronize(Common::Serializer &s) {
+ Scene1xx::synchronize(s);
+
+ s.syncAsByte(_sittingFl);
+ s.syncAsByte(_panelOpened);
+ s.syncAsSint16LE(_messageNum);
+ s.syncAsSint16LE(_posY);
+ s.syncAsSint16LE(_shieldSpriteIdx);
+ s.syncAsSint16LE(_chairHotspotId);
+ s.syncAsSint16LE(_oldSpecial);
+}
+
+void Scene101::setup() {
+ _scene->_animationData->preLoad(formAnimName('A', -1), 3);
+ setPlayerSpritesPrefix();
+ setAAName();
+}
+
+void Scene101::sayDang() {
+ _game._triggerSetupMode = SEQUENCE_TRIGGER_DAEMON;
+ _game._player._stepEnabled = false;
+
+ switch (_game._trigger) {
+ case 0:
+ _scene->_sequences.remove(_globals._sequenceIndexes[11]);
+ _globals._sequenceIndexes[11] = _scene->_sequences.startReverseCycle(_globals._spriteIndexes[11], false, 3, 6, 0, 0);
+ _scene->_sequences.setAnimRange(_globals._sequenceIndexes[11], 17, 21);
+ _scene->_sequences.addSubEntry(_globals._sequenceIndexes[11], SEQUENCE_TRIGGER_EXPIRE, 0, 72);
+ _vm->_sound->command(17);
+ _globals._sequenceIndexes[8] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[8], false, 3, 2, 0, 0);
+ break;
+
+ case 72:
+ _globals._sequenceIndexes[11] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[11], false, 6, 0, 0, 0);
+ _scene->_sequences.setAnimRange(_globals._sequenceIndexes[11], 17, 17);
+ _scene->_kernelMessages.add(Common::Point(143, 61), 0x1110, 0, 0, 60, _game.getQuote(57));
+ _scene->_sequences.addTimer(120, 73);
+ break;
+
+ case 73:
+ _vm->_dialogs->show(10117);
+ _game._player._stepEnabled = true;
+ break;
+
+ default:
+ break;
+ }
+}
+
+void Scene101::enter() {
+ _globals._spriteIndexes[1] = _scene->_sprites.addSprites(formAnimName('x', 1));
+ _globals._spriteIndexes[2] = _scene->_sprites.addSprites(formAnimName('x', 2));
+ _globals._spriteIndexes[3] = _scene->_sprites.addSprites(formAnimName('x', 3));
+ _globals._spriteIndexes[4] = _scene->_sprites.addSprites(formAnimName('x', 4));
+ _globals._spriteIndexes[5] = _scene->_sprites.addSprites(formAnimName('x', 5));
+ _globals._spriteIndexes[6] = _scene->_sprites.addSprites(formAnimName('x', 6));
+ _globals._spriteIndexes[7] = _scene->_sprites.addSprites(formAnimName('x', 7));
+ _globals._spriteIndexes[8] = _scene->_sprites.addSprites(formAnimName('m', -1));
+ _globals._spriteIndexes[9] = _scene->_sprites.addSprites(formAnimName('b', 1));
+ _globals._spriteIndexes[10] = _scene->_sprites.addSprites(formAnimName('b', 2));
+ _globals._spriteIndexes[11] = _scene->_sprites.addSprites(formAnimName('a', 0));
+ _globals._spriteIndexes[12] = _scene->_sprites.addSprites(formAnimName('a', 1));
+ _globals._spriteIndexes[13] = _scene->_sprites.addSprites(formAnimName('x', 8));
+ _globals._spriteIndexes[14] = _scene->_sprites.addSprites(formAnimName('x', 0));
+
+ _globals._sequenceIndexes[1] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[1], false, 5, 0, 0, 25);
+ _globals._sequenceIndexes[2] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[2], false, 4, 0, 1, 0);
+ _globals._sequenceIndexes[3] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[3], false, 6, 0, 2, 0);
+ _scene->_sequences.addSubEntry(_globals._sequenceIndexes[3], SEQUENCE_TRIGGER_SPRITE, 7, 70);
+ _globals._sequenceIndexes[4] = _scene->_sequences.addReverseSpriteCycle(_globals._spriteIndexes[4], false, 10, 0, 0, 60);
+ _globals._sequenceIndexes[5] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[5], false, 5, 0, 1, 0);
+ _globals._sequenceIndexes[6] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[6], false, 10, 0, 2, 0);
+ _globals._sequenceIndexes[7] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[7], false, 6, 0, 0, 0);
+ _globals._sequenceIndexes[9] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[9], false, 6, 0, 10, 4);
+ _globals._sequenceIndexes[10] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[10], false, 6, 0, 32, 47);
+
+ _scene->_hotspots.activate(NOUN_SHIELD_MODULATOR, false);
+ _panelOpened = false;
+
+ if (_scene->_priorSceneId != -1)
+ _globals[kNeedToStandUp] = false;
+
+ if (_scene->_priorSceneId != -2)
+ _game._player._playerPos = Common::Point(100, 152);
+
+ if ((_scene->_priorSceneId == 112) || ((_scene->_priorSceneId == -2) && _sittingFl )) {
+ _game._player._visible = false;
+ _sittingFl = true;
+ _game._player._playerPos = Common::Point(161, 123);
+ _game._player._facing = FACING_NORTHEAST;
+ _globals._sequenceIndexes[11] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[11], false, 3, 0, 0, 0);
+ _scene->_sequences.setAnimRange(_globals._sequenceIndexes[11], 17, 17);
+ _scene->_hotspots.activate(NOUN_CHAIR, false);
+ _chairHotspotId = _scene->_dynamicHotspots.add(NOUN_CHAIR, VERB_SIT_IN, -1, Common::Rect(159, 84, 159 + 33, 84 + 36));
+ if (_scene->_priorSceneId == 112)
+ sayDang();
+ } else {
+ _globals._sequenceIndexes[12] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[12], false, 6, 0, 0, 0);
+ _scene->_sequences.setDepth(_globals._sequenceIndexes[12], 4);
+ }
+
+ _game.loadQuoteSet(0x31, 0x32, 0x39, 0x36, 0x37, 0x38, 0);
+
+ if (_globals[kNeedToStandUp]) {
+ _scene->loadAnimation(Resources::formatName(101, 'S', -1, EXT_AA, ""), 71);
+ _game._player._visible = false;
+ _game._player._stepEnabled = false;
+ _game._player._playerPos = Common::Point(68, 140);
+ _game._player._facing = FACING_WEST;
+
+ _messageNum = 0;
+ _posY = 30;
+ }
+
+ _oldSpecial = false;
+
+ sceneEntrySound();
+}
+
+void Scene101::step() {
+ if (_oldSpecial != _game._player._special) {
+ _oldSpecial = _game._player._special;
+ if (_oldSpecial)
+ _vm->_sound->command(39);
+ else
+ _vm->_sound->command(11);
+ }
+
+ switch (_game._trigger) {
+ case 70:
+ _vm->_sound->command(9);
+ break;
+
+ case 71:
+ _globals[kNeedToStandUp] = false;
+ _game._player._visible = true;
+ _game._player._stepEnabled = true;
+ _game._player._priorTimer = _scene->_frameStartTime - _game._player._ticksAmount;
+ break;
+
+ case 72:
+ case 73:
+ sayDang();
+ break;
+
+ default:
+ break;
+ }
+
+ if (_scene->_activeAnimation != nullptr) {
+ if ((_scene->_activeAnimation->getCurrentFrame() >= 6) && (_messageNum == 0)) {
+ _messageNum++;
+ _scene->_kernelMessages.add(Common::Point(63, _posY), 0x1110, 0, 0, 240, _game.getQuote(49));
+ _posY += 14;
+ }
+
+ if ((_scene->_activeAnimation->getCurrentFrame() >= 7) && (_messageNum == 1)) {
+ _messageNum++;
+ _scene->_kernelMessages.add(Common::Point(63, _posY), 0x1110, 0, 0, 240, _game.getQuote(54));
+ _posY += 14;
+ }
+
+ if ((_scene->_activeAnimation->getCurrentFrame() >= 10) && (_messageNum == 2)) {
+ _messageNum++;
+ _scene->_kernelMessages.add(Common::Point(63, _posY), 0x1110, 0, 0, 240, _game.getQuote(55));
+ _posY += 14;
+ }
+
+ if ((_scene->_activeAnimation->getCurrentFrame() >= 17) && (_messageNum == 3)) {
+ _messageNum++;
+ _scene->_kernelMessages.add(Common::Point(63, _posY), 0x1110, 0, 0, 240, _game.getQuote(56));
+ _posY += 14;
+ }
+
+ if ((_scene->_activeAnimation->getCurrentFrame() >= 20) && (_messageNum == 4)) {
+ _messageNum++;
+ _scene->_kernelMessages.add(Common::Point(63, _posY), 0x1110, 0, 0, 240, _game.getQuote(50));
+ _posY += 14;
+ }
+ }
+}
+
+void Scene101::preActions() {
+ if (_action.isAction(VERB_LOOK, NOUN_VIEW_SCREEN))
+ _game._player._needToWalk = true;
+
+ if (_sittingFl) {
+ if (_action.isAction(VERB_LOOK) || _action.isObject(NOUN_CHAIR) || _action.isAction(VERB_TALKTO) || _action.isAction(VERB_PEER_THROUGH) || _action.isAction(VERB_EXAMINE))
+ _game._player._needToWalk = false;
+
+ if (_game._player._needToWalk) {
+ switch (_game._trigger) {
+ case 0:
+ _game._player._readyToWalk = false;
+ _game._player._stepEnabled = false;
+ _scene->_sequences.remove(_globals._sequenceIndexes[11]);
+ _globals._sequenceIndexes[11] = _scene->_sequences.addReverseSpriteCycle(_globals._spriteIndexes[11], false, 3, 1, 0, 0);
+ _scene->_sequences.addSubEntry(_globals._sequenceIndexes[11], SEQUENCE_TRIGGER_EXPIRE, 0, 1);
+ _scene->_sequences.setAnimRange(_globals._sequenceIndexes[11], 1, 17);
+ _vm->_sound->command(16);
+ break;
+
+ case 1:
+ _sittingFl = false;
+ _game._player._visible = true;
+ _game._player._stepEnabled = true;
+ _game._player._readyToWalk = true;
+ _scene->_hotspots.activate(71, true);
+ _scene->_dynamicHotspots.remove(_chairHotspotId);
+ _globals._sequenceIndexes[12] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[12], false, 6, 0, 0, 0);
+ _scene->_sequences.setDepth(_globals._sequenceIndexes[12], 4);
+ break;
+
+ default:
+ break;
+ }
+ }
+ }
+
+ if (_panelOpened && !(_action.isObject(NOUN_SHIELD_ACCESS_PANEL) || _action.isObject(NOUN_SHIELD_MODULATOR))) {
+ switch (_game._trigger) {
+ case 0:
+ if (_game._player._needToWalk) {
+ _scene->_sequences.remove(_globals._sequenceIndexes[13]);
+ _shieldSpriteIdx = _game._objects.isInRoom(OBJ_SHIELD_MODULATOR) ? 13 : 14;
+ _globals._sequenceIndexes[13] = _scene->_sequences.addReverseSpriteCycle(_globals._spriteIndexes[_shieldSpriteIdx], false, 6, 1, 0, 0);
+ _scene->_sequences.addSubEntry(_globals._sequenceIndexes[13], SEQUENCE_TRIGGER_EXPIRE, 0, 1);
+ _game._player._stepEnabled = false;
+ _vm->_sound->command(20);
+ }
+ break;
+
+ case 1:
+ _game._player._stepEnabled = true;
+ _panelOpened = false;
+ _scene->_hotspots.activate(NOUN_SHIELD_MODULATOR, false);
+ break;
+
+ default:
+ break;
+ }
+ }
+}
+
+void Scene101::actions() {
+ if (_action._lookFlag) {
+ _vm->_dialogs->show(10125);
+ _action._inProgress = false;
+ return;
+ }
+
+ if (_action.isAction(VERB_WALKTO, NOUN_LIFE_SUPPORT_SECTION)) {
+ _scene->_nextSceneId = 102;
+ _action._inProgress = false;
+ return;
+ }
+
+ if (_action.isAction(VERB_SIT_IN, NOUN_CHAIR) || (_action.isAction(VERB_LOOK, NOUN_VIEW_SCREEN) && !_sittingFl)) {
+ if (!_sittingFl) {
+ switch (_game._trigger) {
+ case 0:
+ _scene->_sequences.remove(_globals._sequenceIndexes[12]);
+ _globals._sequenceIndexes[11] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[11], false, 3, 1);
+ _scene->_sequences.setAnimRange(_globals._sequenceIndexes[11], 1, 17);
+ _scene->_sequences.addSubEntry(_globals._sequenceIndexes[11], SEQUENCE_TRIGGER_SPRITE, 10, 1);
+ _scene->_sequences.addSubEntry(_globals._sequenceIndexes[11], SEQUENCE_TRIGGER_EXPIRE, 0, 2);
+ _game._player._stepEnabled = false;
+ _game._player._visible = false;
+ _action._inProgress = false;
+ return;
+
+ case 1:
+ _vm->_sound->command(16);
+ break;
+
+ case 2:
+ _globals._sequenceIndexes[11] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[11], false, 3, 0, 0, 0);
+ _scene->_sequences.setAnimRange(_globals._sequenceIndexes[11], 17, 17);
+ _game._player._stepEnabled = true;
+ _sittingFl = true;
+ _scene->_hotspots.activate(71, false);
+ _chairHotspotId = _scene->_dynamicHotspots.add(NOUN_CHAIR, VERB_SIT_IN, -1, Common::Rect(159, 84, 159 + 33, 84 + 36));
+ if (!_action.isAction(VERB_LOOK, NOUN_VIEW_SCREEN)) {
+ _action._inProgress = false;
+ return;
+ }
+ _game._trigger = 0;
+ break;
+
+ default:
+ break;
+ }
+ } else {
+ _vm->_dialogs->show(10131);
+ _action._inProgress = false;
+ return;
+ }
+ }
+
+ if ((_action.isAction(VERB_WALKTO, NOUN_SHIELD_ACCESS_PANEL) || _action.isAction(VERB_OPEN, NOUN_SHIELD_ACCESS_PANEL)) && !_panelOpened) {
+ switch (_game._trigger) {
+ case 0:
+ _shieldSpriteIdx = _game._objects.isInRoom(OBJ_SHIELD_MODULATOR) ? 13 : 14;
+ _globals._sequenceIndexes[13] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[_shieldSpriteIdx], false, 6, 1, 0, 0);
+ _scene->_sequences.addSubEntry(_globals._sequenceIndexes[13], SEQUENCE_TRIGGER_EXPIRE, 0, 1);
+ _game._player._stepEnabled = false;
+ _vm->_sound->command(20);
+ break;
+
+ case 1:
+ _scene->_sequences.remove(_globals._sequenceIndexes[13]);
+ _globals._sequenceIndexes[13] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[_shieldSpriteIdx], false, 6, 0, 0, 0);
+ _scene->_sequences.setAnimRange(_globals._sequenceIndexes[13], -2, -2);
+ _game._player._stepEnabled = true;
+ _panelOpened = true;
+ if (_game._objects.isInRoom(OBJ_SHIELD_MODULATOR))
+ _scene->_hotspots.activate(NOUN_SHIELD_MODULATOR, true);
+ break;
+
+ default:
+ break;
+ }
+ _action._inProgress = false;
+ return;
+ }
+
+ if ((_action.isAction(VERB_TAKE, NOUN_SHIELD_MODULATOR) || _action.isAction(VERB_PULL, NOUN_SHIELD_MODULATOR)) && _game._objects.isInRoom(OBJ_SHIELD_MODULATOR)) {
+ _game._objects.addToInventory(OBJ_SHIELD_MODULATOR);
+ _scene->_sequences.remove(_globals._sequenceIndexes[13]);
+ _globals._sequenceIndexes[13] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[14], false, 6, 0, 0, 0);
+ _scene->_sequences.setAnimRange(_globals._sequenceIndexes[13], -2, -2);
+ _scene->_hotspots.activate(NOUN_SHIELD_MODULATOR, false);
+ _vm->_dialogs->showItem(OBJ_SHIELD_MODULATOR, 10120);
+ _vm->_sound->command(22);
+ _action._inProgress = false;
+ return;
+ }
+
+ if (_action.isAction(VERB_LOOK, NOUN_SHIELD_ACCESS_PANEL) || (_action.isAction(VERB_LOOK, NOUN_SHIELD_MODULATOR) && !_game._objects.isInInventory(OBJ_SHIELD_MODULATOR)) ) {
+ if (_panelOpened) {
+ if (_game._objects.isInRoom(OBJ_SHIELD_MODULATOR))
+ _vm->_dialogs->show(10128);
+ else
+ _vm->_dialogs->show(10129);
+ } else
+ _vm->_dialogs->show(10127);
+
+ _action._inProgress = false;
+ return;
+ }
+
+ if (_action.isAction(VERB_OPEN, NOUN_SHIELD_ACCESS_PANEL) && _panelOpened) {
+ _vm->_dialogs->show(10130);
+ _action._inProgress = false;
+ return;
+ }
+
+ if (_action.isAction(VERB_LOOK, NOUN_VIEW_SCREEN) && _sittingFl) {
+ if (_globals[kWatchedViewScreen])
+ sayDang();
+ else {
+ switch (_game._trigger) {
+ case 0:
+ _game._player._stepEnabled = false;
+ _scene->_sequences.remove(_globals._sequenceIndexes[11]);
+ _globals._sequenceIndexes[11] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[11], false, 3, 1, 0, 0);
+ _scene->_sequences.setAnimRange(_globals._sequenceIndexes[11], 17, 21);
+ _scene->_sequences.addSubEntry(_globals._sequenceIndexes[11], SEQUENCE_TRIGGER_EXPIRE, 0, 1);
+ _vm->_sound->command(17);
+ break;
+
+ case 1:
+ _globals._sequenceIndexes[11] = _scene->_sequences.addReverseSpriteCycle(_globals._spriteIndexes[11], false, 3, 1, 0, 0);
+ _scene->_sequences.addSubEntry(_globals._sequenceIndexes[11], SEQUENCE_TRIGGER_EXPIRE, 0, 2);
+ _scene->_sequences.setAnimRange(_globals._sequenceIndexes[11], 17, 21);
+ break;
+
+ case 2:
+ _globals._sequenceIndexes[11] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[11], false, 3, 0, 0, 0);
+ _scene->_sequences.setAnimRange(_globals._sequenceIndexes[11], 17, 17);
+ _globals._sequenceIndexes[8] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[8], false, 3, 1, 0, 0);
+ _scene->_sequences.addSubEntry(_globals._sequenceIndexes[8], SEQUENCE_TRIGGER_EXPIRE, 0, 3);
+ break;
+
+ case 3:
+ _game._player._stepEnabled = true;
+ _globals[kWatchedViewScreen] = true;
+ _sittingFl = true;
+ _scene->_nextSceneId = 112;
+ break;
+
+ default:
+ break;
+ }
+ }
+ _action._inProgress = false;
+ return;
+ }
+
+ if (_action.isAction(VERB_LOOK, NOUN_CHAIR)) {
+ _vm->_dialogs->show(10101);
+ _action._inProgress = false;
+ return;
+ }
+
+ if ((_action.isAction(VERB_LOOK) || _action.isAction(VERB_PEER_THROUGH)) && (_action.isObject(NOUN_FRONT_WINDOW) || _action.isObject(NOUN_OUTSIDE))) {
+ _vm->_dialogs->show(10102);
+ _action._inProgress = false;
+ return;
+ }
+
+ if (_action.isAction(VERB_LOOK, NOUN_HULL) || _action.isAction(VERB_LOOK, NOUN_OUTER_HULL) || _action.isAction(VERB_EXAMINE, NOUN_HULL) || _action.isAction(VERB_EXAMINE, NOUN_OUTER_HULL)) {
+ _vm->_dialogs->show(10103);
+ _action._inProgress = false;
+ return;
+ }
+
+ if (_action.isAction(VERB_LOOK, NOUN_FUZZY_DICE)) {
+ _vm->_dialogs->show(10104);
+ _action._inProgress = false;
+ return;
+ }
+
+ if (_action.isAction(VERB_LOOK, NOUN_MIRROR) || _action.isAction(VERB_LOOK_IN, NOUN_MIRROR)) {
+ _vm->_dialogs->show(10105);
+ _action._inProgress = false;
+ return;
+ }
+
+ if (_action.isAction(VERB_LOOK, NOUN_CURTAINS)) {
+ _vm->_dialogs->show(10106);
+ _action._inProgress = false;
+ return;
+ }
+
+ if (_action.isAction(VERB_LOOK, NOUN_PLASTIC_JESUS)) {
+ _vm->_dialogs->show(10107);
+ _action._inProgress = false;
+ return;
+ }
+
+ if (_action.isAction(VERB_LOOK, NOUN_ESCAPE_HATCH) || (_action.isAction(VERB_OPEN, NOUN_ESCAPE_HATCH) && !_game._objects.isInInventory(OBJ_REBREATHER))) {
+ _vm->_dialogs->show(10109);
+ _action._inProgress = false;
+ return;
+ }
+
+ if (_action.isAction(VERB_OPEN, NOUN_ESCAPE_HATCH)) {
+ _vm->_dialogs->show(10110);
+ _action._inProgress = false;
+ return;
+ }
+
+ if (_action.isAction(VERB_LOOK, NOUN_TARGET_COMPUTER)) {
+ _vm->_dialogs->show(10111);
+ _action._inProgress = false;
+ return;
+ }
+
+ if (_action.isAction(VERB_LOOK, NOUN_LIBRARY_COMPUTER)) {
+ _vm->_dialogs->show(10126);
+ _action._inProgress = false;
+ return;
+ }
+
+ if (_action.isAction(VERB_LOOK, NOUN_DAMAGE_CONTROL_PANEL)) {
+ _vm->_dialogs->show(10112);
+ _action._inProgress = false;
+ return;
+ }
+
+ if (_action.isAction(VERB_LOOK, NOUN_NAVIGATION_CONTROLS)) {
+ _vm->_dialogs->show(10113);
+ _action._inProgress = false;
+ return;
+ }
+
+ if (_action.isAction(VERB_LOOK, NOUN_ENGINEERING_CONTROLS)) {
+ _vm->_dialogs->show(10114);
+ _action._inProgress = false;
+ return;
+ }
+
+ if (_action.isAction(VERB_LOOK, NOUN_WEAPONS_DISPLAY)) {
+ _vm->_dialogs->show(10115);
+ _action._inProgress = false;
+ return;
+ }
+
+ if (_action.isAction(VERB_LOOK, NOUN_SHIELD_STATUS_PANEL)) {
+ _vm->_dialogs->show(10116);
+ _action._inProgress = false;
+ return;
+ }
+
+ if (_action.isAction(VERB_TAKE, NOUN_PLASTIC_JESUS)) {
+ _vm->_dialogs->show(10118);
+ _action._inProgress = false;
+ return;
+ }
+
+ if (_action.isAction(VERB_TAKE, NOUN_FUZZY_DICE)) {
+ _vm->_dialogs->show(10119);
+ _action._inProgress = false;
+ return;
+ }
+
+ if (_action.isAction(VERB_OPEN, NOUN_DAMAGE_CONTROL_PANEL)) {
+ _vm->_dialogs->show(10121);
+ _action._inProgress = false;
+ return;
+ }
+
+ if (_action.isAction(VERB_OPEN, NOUN_CURTAINS)) {
+ _vm->_dialogs->show(10122);
+ _action._inProgress = false;
+ return;
+ }
+
+ if (_action.isAction(VERB_CLOSE, NOUN_CURTAINS)) {
+ _vm->_dialogs->show(10123);
+ _action._inProgress = false;
+ return;
+ }
+
+ if ((_action.isAction(VERB_LOOK) || _action.isAction(VERB_PLAY)) && _action.isObject(NOUN_VIDEO_GAME)) {
+ _vm->_dialogs->show(10124);
+ _action._inProgress = false;
+ return;
+ }
+}
+
+/*------------------------------------------------------------------------*/
+
+Scene102::Scene102(MADSEngine *vm) : Scene1xx(vm) {
+ _fridgeOpenedFl = false;
+ _fridgeOpenedDescr = false;
+ _fridgeFirstOpenFl = false;
+ _chairDescrFl = false;
+ _drawerDescrFl = false;
+ _activeMsgFl = false;
+ _fridgeCommentCount = 0;
+}
+
+void Scene102::synchronize(Common::Serializer &s) {
+ Scene1xx::synchronize(s);
+
+ s.syncAsByte(_fridgeOpenedFl);
+ s.syncAsByte(_fridgeOpenedDescr);
+ s.syncAsByte(_fridgeFirstOpenFl);
+ s.syncAsByte(_chairDescrFl);
+ s.syncAsByte(_drawerDescrFl);
+ s.syncAsByte(_activeMsgFl);
+
+ s.syncAsSint16LE(_fridgeCommentCount);
+}
+
+void Scene102::setup() {
+ _scene->_animationData->preLoad(formAnimName('A', -1), 3);
+ setPlayerSpritesPrefix();
+ setAAName();
+}
+
+void Scene102::addRandomMessage() {
+ _scene->_kernelMessages.reset();
+ _game._triggerSetupMode = SEQUENCE_TRIGGER_DAEMON;
+ int quoteId = _vm->getRandomNumber(65, 69);
+ _scene->_kernelMessages.add(Common::Point(0, 0), 0x1110, 34, 73, 120, _game.getQuote(quoteId));
+ _activeMsgFl = true;
+}
+
+void Scene102::enter() {
+ sceneEntrySound();
+
+ _globals._spriteIndexes[1] = _scene->_sprites.addSprites(formAnimName('x', 1));
+ _globals._spriteIndexes[2] = _scene->_sprites.addSprites(formAnimName('x', 2));
+ _globals._spriteIndexes[3] = _scene->_sprites.addSprites(formAnimName('x', 3));
+ _globals._spriteIndexes[4] = _scene->_sprites.addSprites(formAnimName('x', 4));
+ _globals._spriteIndexes[5] = _scene->_sprites.addSprites(formAnimName('x', 5));
+ _globals._spriteIndexes[6] = _scene->_sprites.addSprites(formAnimName('b', -1));
+ _globals._spriteIndexes[7] = _scene->_sprites.addSprites(formAnimName('c', -1));
+ _globals._spriteIndexes[8] = _scene->_sprites.addSprites(formAnimName('e', -1));
+ _globals._spriteIndexes[9] = _scene->_sprites.addSprites(formAnimName('n', -1));
+ _globals._spriteIndexes[10] = _scene->_sprites.addSprites(formAnimName('g', -1));
+ _globals._spriteIndexes[11] = _scene->_sprites.addSprites("*RXMRC_8");
+ _globals._spriteIndexes[13] = _scene->_sprites.addSprites(formAnimName('x', 0));
+
+ _globals._sequenceIndexes[1] = _scene->_sequences.startReverseCycle(_globals._spriteIndexes[1], false, 8, 0, 0, 0);
+ _globals._sequenceIndexes[2] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[2], false, 170, 0, 1, 6);
+ _globals._sequenceIndexes[3] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[3], false, 11, 0, 2, 3);
+ _globals._sequenceIndexes[4] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[4], false, 4, 0, 1, 0);
+ _globals._sequenceIndexes[5] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[5], false, 3, 0, 0, 5);
+
+ if (_game._objects.isInRoom(OBJ_BINOCULARS))
+ _globals._sequenceIndexes[9] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[9], false, 24, 0, 0, 24);
+ else
+ _scene->_hotspots.activate(NOUN_BINOCULARS, false);
+
+ _scene->_hotspots.activate(NOUN_BURGER, false);
+
+ if (_globals[kMedicineCabinetOpen]) {
+ _globals._sequenceIndexes[8] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[8], false, 6, 0, 0);
+ _scene->_sequences.setAnimRange(_globals._sequenceIndexes[8], -2, -2);
+ }
+
+ if (_scene->_priorSceneId == 101) {
+ _game._player._playerPos = Common::Point(229, 109);
+ _game._player._stepEnabled = false;
+ _globals._sequenceIndexes[6] = _scene->_sequences.addReverseSpriteCycle(_globals._spriteIndexes[6], false, 6, 1, 0, 0);
+ _scene->_sequences.addSubEntry(_globals._sequenceIndexes[6], SEQUENCE_TRIGGER_EXPIRE, 0, 70);
+ } else if (_scene->_priorSceneId == 103)
+ _game._player._playerPos = Common::Point(47, 152);
+ else if (_scene->_priorSceneId != -2) {
+ _game._player._facing = FACING_NORTHWEST;
+ _game._player._playerPos = Common::Point(32, 129);
+ }
+
+ if (_scene->_priorSceneId != 106) {
+ if (_globals[kWaterInAPuddle]) {
+ _globals._sequenceIndexes[13] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[13], false, 6, 0, 0, 0);
+ _scene->_sequences.setAnimRange(_globals._sequenceIndexes[13], -2, -2);
+ _scene->_sequences.setDepth(_globals._sequenceIndexes[13], 5);
+ }
+ } else {
+ _game._player._stepEnabled = false;
+ _game._player._visible = false;
+ _globals._sequenceIndexes[13] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[13], false, 6, 1, 0, 0);
+ _scene->_sequences.addSubEntry(_globals._sequenceIndexes[13], SEQUENCE_TRIGGER_EXPIRE, 0, 72);
+ _scene->_sequences.setDepth(_globals._sequenceIndexes[13], 5);
+ _vm->_sound->command(24);
+ _vm->_sound->command(28);
+ }
+
+ _fridgeOpenedFl = false;
+ _fridgeOpenedDescr = false;
+ _fridgeCommentCount = 0;
+ _fridgeFirstOpenFl = true;
+ _chairDescrFl = false;
+ _activeMsgFl = false;
+
+ _game.loadQuoteSet(0x3B, 0x3C, 0x3D, 0x3E, 0x3F, 0x40, 0x41, 0x42, 0x45, 0x43, 0);
+
+ if (_scene->_priorSceneId == 101)
+ _vm->_sound->command(20);
+}
+
+void Scene102::step() {
+ if (_game._trigger == 70)
+ _game._player._stepEnabled = true;
+
+ if (_game._trigger == 72) {
+ _globals._sequenceIndexes[13] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[13], false, 6, 0, 0, 0);
+ _scene->_sequences.setAnimRange(_globals._sequenceIndexes[13], -2, -2);
+ _scene->_sequences.setDepth(_globals._sequenceIndexes[13], 5);
+ _scene->_sequences.addTimer(48, 90);
+ }
+
+ if (_game._trigger >= 90) {
+ if (_game._trigger >= 94) {
+ _scene->loadAnimation(formAnimName('B', -1), 71);
+ _game._player._stepEnabled = false;
+ _game._player._visible = false;
+
+ _globals[kWaterInAPuddle] = true;
+ _vm->_sound->command(24);
+ } else {
+ _vm->_sound->command(23);
+ _scene->_sequences.addTimer(48, _game._trigger + 1);
+ }
+ }
+
+ if (_game._trigger == 71) {
+ _game._player._stepEnabled = true;
+ _game._player._visible = true;
+ _game._player._priorTimer = _scene->_frameStartTime - _game._player._ticksAmount;
+ }
+
+ if (_fridgeOpenedFl && !_fridgeOpenedDescr) {
+ _fridgeCommentCount++;
+ if (_fridgeCommentCount > 16384) {
+ _fridgeOpenedDescr = true;
+ _vm->_dialogs->show(10213);
+ }
+ }
+
+ if (!_activeMsgFl && (_game._player._playerPos == Common::Point(177, 114)) && (_game._player._facing == FACING_NORTH)
+ && (_vm->getRandomNumber(1, 5000) == 1)) {
+ _scene->_kernelMessages.reset();
+ _activeMsgFl = false;
+ addRandomMessage();
+ }
+
+ if (_game._trigger == 73)
+ _activeMsgFl = false;
+}
+
+void Scene102::preActions() {
+ if (_action.isObject(NOUN_REFRIGERATOR) || _action.isObject(NOUN_POSTER))
+ _game._player._needToWalk = _game._player._readyToWalk;
+
+ if (_fridgeOpenedFl && !_action.isObject(NOUN_REFRIGERATOR)) {
+ switch (_game._trigger) {
+ case 0:
+ if (_game._player._needToWalk) {
+ _scene->_sequences.remove(_globals._sequenceIndexes[7]);
+ _globals._sequenceIndexes[7] = _scene->_sequences.addReverseSpriteCycle(_globals._spriteIndexes[7], false, 6, 1, 0, 0);
+ _scene->_sequences.addSubEntry(_globals._sequenceIndexes[7], SEQUENCE_TRIGGER_EXPIRE, 0, 1);
+ _scene->_sequences.setDepth(_globals._sequenceIndexes[7], 15);
+ _game._player._stepEnabled = false;
+ _vm->_sound->command(20);
+ }
+ break;
+
+ case 1:
+ if (_game._objects.isInRoom(OBJ_BURGER)) {
+ _scene->_sequences.remove(_globals._sequenceIndexes[10]);
+ _scene->_hotspots.activate(NOUN_BURGER, false);
+ }
+ _fridgeOpenedFl = false;
+ _game._player._stepEnabled = true;
+ break;
+
+ default:
+ break;
+ }
+ }
+
+ if (_game._player._needToWalk)
+ _scene->_kernelMessages.reset();
+}
+
+void Scene102::actions() {
+ if (_action._lookFlag) {
+ _vm->_dialogs->show(10234);
+ _action._inProgress = false;
+ return;
+ }
+
+ bool justOpenedFl = false;
+ if (_action.isObject(NOUN_REFRIGERATOR) && !_fridgeOpenedFl) {
+ switch (_game._trigger) {
+ case 0:
+ _globals._sequenceIndexes[7] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[7], false, 6, 1, 0, 0);
+ _scene->_sequences.setDepth(_globals._sequenceIndexes[7], 15);
+ _scene->_sequences.addSubEntry(_globals._sequenceIndexes[7], SEQUENCE_TRIGGER_EXPIRE, 0, 1);
+ if (_game._objects.isInRoom(OBJ_BURGER)) {
+ _globals._sequenceIndexes[10] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[10], false, 7, 0, 0, 0);
+ _scene->_sequences.setDepth(_globals._sequenceIndexes[10], 14);
+ }
+ _game._player._stepEnabled = false;
+ _vm->_sound->command(20);
+ _action._inProgress = false;
+ return;
+
+ case 1:
+ _globals._sequenceIndexes[7] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[7], false, 6, 0, 0, 0);
+ _scene->_sequences.setAnimRange(_globals._sequenceIndexes[7], -2, -2);
+ _scene->_sequences.setDepth(_globals._sequenceIndexes[7], 15);
+ int delay;
+ if (_action.isAction(VERB_WALKTO) && !_fridgeFirstOpenFl)
+ delay = 0;
+ else
+ delay = 48;
+ _scene->_sequences.addTimer(delay, 2);
+ _action._inProgress = false;
+ return;
+
+ case 2:
+ _fridgeOpenedFl = true;
+ _fridgeOpenedDescr = false;
+ _fridgeCommentCount = 0;
+ _game._player._stepEnabled = true;
+ justOpenedFl = true;
+ if (_game._objects.isInRoom(OBJ_BURGER))
+ _scene->_hotspots.activate(NOUN_BURGER, true);
+ break;
+
+ default:
+ break;
+ }
+ }
+
+ if (_action.isAction(VERB_LOOK, NOUN_REFRIGERATOR) || _action.isAction(VERB_OPEN, NOUN_REFRIGERATOR)) {
+ if (_game._objects.isInRoom(OBJ_BURGER))
+ _vm->_dialogs->show(10230);
+ else
+ _vm->_dialogs->show(10229);
+
+ _fridgeFirstOpenFl = false;
+ _action._inProgress = false;
+ return;
+ }
+
+ if (_action.isAction(VERB_WALKTO, NOUN_REFRIGERATOR) && justOpenedFl) {
+ _fridgeFirstOpenFl = false;
+ int quoteId = _vm->getRandomNumber(59, 63);
+ Common::String curQuote = _game.getQuote(quoteId);
+ int width = _vm->_font->getWidth(curQuote, -1);
+ _scene->_kernelMessages.reset();
+ _game._triggerSetupMode = SEQUENCE_TRIGGER_DAEMON;
+ _scene->_kernelMessages.add(Common::Point(210, 60), 0x1110, 0, 73, 120, curQuote);
+ _scene->_kernelMessages.add(Common::Point(214 + width, 60), 0x1110, 0, 73, 120, _game.getQuote(64));
+ _activeMsgFl = true;
+ _action._inProgress = false;
+ return;
+ }
+
+ if (_action.isAction(VERB_CLOSE, NOUN_REFRIGERATOR)) {
+ _vm->_dialogs->show(10213);
+ _action._inProgress = false;
+ return;
+ }
+
+ if (_action.isAction(VERB_TAKE, NOUN_REFRIGERATOR)) {
+ _vm->_dialogs->show(8);
+ _action._inProgress = false;
+ return;
+ }
+
+ if (_action.isAction(VERB_WALK_THROUGH, NOUN_DOOR)) {
+ switch (_game._trigger) {
+ case 0:
+ _globals._sequenceIndexes[6] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[6], false, 6, 1, 0, 0);
+ _scene->_sequences.addSubEntry(_globals._sequenceIndexes[6], SEQUENCE_TRIGGER_EXPIRE, 0, 1);
+ _game._player._stepEnabled = false;
+ _vm->_sound->command(20);
+ break;
+
+ case 1:
+ _scene->_nextSceneId = 101;
+ break;
+
+ default:
+ break;
+ }
+ _action._inProgress = false;
+ return;
+ }
+
+ if (_action.isAction(VERB_WALKTO, NOUN_ENGINEERING_SECTION)) {
+ _scene->_nextSceneId = 103;
+ _action._inProgress = false;
+ return;
+ }
+
+ if (_action.isAction(VERB_WALKTO, NOUN_POSTER) || _action.isAction(VERB_LOOK, NOUN_POSTER) || _action.isAction(VERB_WALKTO, NOUN_BINOCULARS)) {
+ addRandomMessage();
+ _action._inProgress = false;
+ return;
+ }
+
+ if (_action.isAction(VERB_LOOK, NOUN_WEIGHT_MACHINE)) {
+ _vm->_dialogs->show(10212);
+ _action._inProgress = false;
+ return;
+ }
+
+ if (_action.isAction(VERB_LOOK, NOUN_ENGINEERING_SECTION)) {
+ _vm->_dialogs->show(10205);
+ _action._inProgress = false;
+ return;
+ }
+
+ if (_action.isAction(VERB_LOOK, NOUN_DOOR)) {
+ _vm->_dialogs->show(10204);
+ _action._inProgress = false;
+ return;
+ }
+
+ if (_action.isAction(VERB_STARE_AT, NOUN_CEILING) || _action.isAction(VERB_LOOK, NOUN_CEILING)) {
+ _vm->_dialogs->show(10203);
+ _action._inProgress = false;
+ return;
+ }
+
+ if (_action.isAction(VERB_STARE_AT, NOUN_OVERHEAD_LAMP) || _action.isAction(VERB_LOOK, NOUN_OVERHEAD_LAMP)) {
+ _vm->_dialogs->show(10202);
+ _action._inProgress = false;
+ return;
+ }
+
+ if (_action.isAction(VERB_LOOK, NOUN_ROBO_KITCHEN)) {
+ _vm->_dialogs->show(10215);
+ _action._inProgress = false;
+ return;
+ }
+
+ if (_action.isAction(VERB_PUT, NOUN_BURGER, NOUN_ROBO_KITCHEN) && _game._objects.isInInventory(OBJ_BURGER)) {
+ _vm->_dialogs->show(10216);
+ _action._inProgress = false;
+ return;
+ }
+
+ if (_action.isAction(VERB_PUT, NOUN_REFRIGERATOR) && _game._objects.isInInventory(_game._objects.getIdFromDesc(_action._activeAction._objectNameId))) {
+ _vm->_dialogs->show(10217);
+ _action._inProgress = false;
+ return;
+ }
+
+ if (_action.isAction(VERB_PUT, NOUN_DEAD_FISH, NOUN_ROBO_KITCHEN) || _action.isAction(VERB_PUT, NOUN_STUFFED_FISH, NOUN_ROBO_KITCHEN)) {
+ _vm->_dialogs->show(10230);
+ _action._inProgress = false;
+ return;
+ }
+
+ if (_action.isAction(VERB_OPEN, NOUN_ROBO_KITCHEN)) {
+ _vm->_dialogs->show(10218);
+ _action._inProgress = false;
+ return;
+ }
+
+ if (_action.isAction(VERB_LOOK, NOUN_CLOSET)) {
+ _vm->_dialogs->show(10219);
+ _action._inProgress = false;
+ return;
+ }
+
+ if ((_action.isObject(NOUN_LADDER) || _action.isObject(NOUN_HATCHWAY)) && (_action.isAction(VERB_LOOK) || _action.isAction(VERB_CLIMB_UP) || _action.isAction(VERB_CLIMB_THROUGH))) {
+ if (_game._objects.isInInventory(OBJ_REBREATHER)) {
+ if (!_action.isAction(VERB_CLIMB_UP) && !_action.isAction(VERB_CLIMB_THROUGH)) {
+ _vm->_dialogs->show(10231);
+ _action._inProgress = false;
+ return;
+ }
+ } else if (_action.isAction(VERB_LOOK) || (_game._difficulty != DIFFICULTY_EASY)) {
+ _vm->_dialogs->show(10222);
+ _action._inProgress = false;
+ return;
+ }
+ }
+
+ if ((_action.isObject(NOUN_LADDER) || _action.isObject(NOUN_HATCHWAY)) && (_action.isAction(VERB_CLIMB_UP) || _action.isAction(VERB_CLIMB_THROUGH)) ) {
+ switch (_game._trigger) {
+ case 0:
+ _scene->loadAnimation(formAnimName('A', -1), 1);
+ _game._player._stepEnabled = false;
+ _game._player._visible = false;
+ break;
+
+ case 1:
+ _vm->_sound->command(24);
+ _scene->_sequences.addTimer(48, 2);
+ break;
+
+ case 2:
+ case 3:
+ case 4:
+ _vm->_sound->command(23);
+ _scene->_sequences.addTimer(48, _game._trigger + 1);
+ break;
+
+ case 5:
+ _vm->_sound->command(24);
+ _scene->_sequences.addTimer(48, _game._trigger + 1);
+ break;
+
+ case 6:
+ if (_game._objects.isInInventory(OBJ_REBREATHER) && !_game._visitedScenes.exists(106))
+ _vm->_dialogs->show(10237);
+ _scene->_nextSceneId = 106;
+ break;
+
+ default:
+ break;
+ }
+ _action._inProgress = false;
+ return;
+ }
+
+ if (_action.isAction(VERB_LOOK, NOUN_POWER_STATUS_PANEL)) {
+ _vm->_dialogs->show(10226);
+ _action._inProgress = false;
+ return;
+ }
+
+ if (_action.isAction(VERB_LOOK, NOUN_WINDOW) || _action.isAction(VERB_LOOK_THROUGH, NOUN_WINDOW)) {
+ _vm->_dialogs->show(10227);
+ _action._inProgress = false;
+ return;
+ }
+
+ if (_action.isAction(VERB_LOOK, NOUN_DOORWAY) || _action.isAction(VERB_WALKTO, NOUN_DOORWAY)) {
+ _vm->_dialogs->show(10228);
+ _action._inProgress = false;
+ return;
+ }
+
+ if (_action.isAction(VERB_LOOK, NOUN_DRAWER) || ((_action.isAction(VERB_CLOSE, NOUN_DRAWER) || _action.isAction(VERB_PUSH, NOUN_DRAWER)) && !_drawerDescrFl)) {
+ _vm->_dialogs->show(10220);
+ _drawerDescrFl = true;
+ _action._inProgress = false;
+ return;
+ }
+
+ if (_action.isAction(VERB_CLOSE, NOUN_DRAWER) || _action.isAction(VERB_PUSH, NOUN_DRAWER)) {
+ _vm->_dialogs->show(10221);
+ _action._inProgress = false;
+ return;
+ }
+
+ if (_action.isAction(VERB_OPEN, NOUN_DRAWER)) {
+ _vm->_dialogs->show(10236);
+ _action._inProgress = false;
+ return;
+ }
+
+ if (_action.isAction(VERB_LOOK, NOUN_CHAIR) || (_action.isAction(VERB_SIT_IN, NOUN_CHAIR) && !_chairDescrFl)) {
+ _chairDescrFl = true;
+ _vm->_dialogs->show(10210);
+ _action._inProgress = false;
+ return;
+ }
+
+ if (_action.isAction(VERB_SIT_IN, NOUN_CHAIR)) {
+ _vm->_dialogs->show(10211);
+ _action._inProgress = false;
+ return;
+ }
+
+ if (_action.isAction(VERB_LOOK, NOUN_MEDICINE_CABINET)) {
+ if (_globals[kMedicineCabinetOpen])
+ _vm->_dialogs->show(10207);
+ else
+ _vm->_dialogs->show(10206);
+
+ _action._inProgress = false;
+ return;
+ }
+
+ if (_action.isAction(VERB_CLOSE, NOUN_MEDICINE_CABINET) && _globals[kMedicineCabinetOpen]) {
+ switch (_game._trigger) {
+ case 0:
+ _scene->_sequences.remove(_globals._sequenceIndexes[8]);
+ _globals._sequenceIndexes[8] = _scene->_sequences.addReverseSpriteCycle(_globals._spriteIndexes[8], false, 6, 1, 0, 0);
+ _scene->_sequences.addSubEntry(_globals._sequenceIndexes[8], SEQUENCE_TRIGGER_EXPIRE, 0, 1);
+ _game._player._stepEnabled = false;
+ _vm->_sound->command(21);
+ break;
+
+ case 1:
+ _scene->_sequences.addTimer(48, 2);
+ break;
+
+ case 2:
+ _game._player._stepEnabled = true;
+ _globals[kMedicineCabinetOpen] = false;
+ _vm->_dialogs->show(10209);
+ break;
+
+ default:
+ break;
+ }
+ _action._inProgress = false;
+ return;
+ }
+
+ if (_action.isAction(VERB_OPEN, NOUN_MEDICINE_CABINET) && !_globals[kMedicineCabinetOpen]) {
+ switch (_game._trigger) {
+ case 0:
+ _globals._sequenceIndexes[8] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[8], false, 6, 1, 0, 0);
+ _scene->_sequences.addSubEntry(_globals._sequenceIndexes[8], SEQUENCE_TRIGGER_EXPIRE, 0, 1);
+ _game._player._stepEnabled = false;
+ _vm->_sound->command(21);
+ break;
+
+ case 1:
+ _globals._sequenceIndexes[8] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[8], false, 6, 0, 0, 0);
+ _scene->_sequences.setAnimRange(_globals._sequenceIndexes[8], -2, -2);
+ _scene->_sequences.addTimer(48, 2);
+ break;
+
+ case 2:
+ _game._player._stepEnabled = true;
+ _globals[kMedicineCabinetOpen] = true;
+ if (_globals[kMedicineCabinetVirgin]) {
+ _vm->_dialogs->show(10208);
+ } else {
+ _vm->_dialogs->show(10207);
+ }
+ _globals[kMedicineCabinetVirgin] = false;
+ break;
+
+ default:
+ break;
+ }
+ _action._inProgress = false;
+ return;
+ }
+
+ if (_action.isAction(VERB_TAKE, NOUN_BINOCULARS) && _game._objects.isInRoom(OBJ_BINOCULARS)) {
+ switch (_game._trigger) {
+ case 0:
+ _globals._sequenceIndexes[11] = _scene->_sequences.startReverseCycle(_globals._spriteIndexes[11], false, 3, 1, 0, 0);
+ _scene->_sequences.setMsgLayout(_globals._sequenceIndexes[11]);
+ _scene->_sequences.addSubEntry(_globals._sequenceIndexes[11], SEQUENCE_TRIGGER_EXPIRE, 0, 1);
+ _game._player._visible = false;
+ _game._player._stepEnabled = false;
+ break;
+
+ case 1:
+ _game._objects.addToInventory(OBJ_BINOCULARS);
+ _scene->_sequences.remove(_globals._sequenceIndexes[9]);
+ _scene->_hotspots.activate(NOUN_BINOCULARS, false);
+ _game._player._visible = true;
+ _game._player._stepEnabled = true;
+ _vm->_sound->command(22);
+ _vm->_dialogs->showItem(OBJ_BINOCULARS, 10201);
+ break;
+
+ default:
+ break;
+ }
+ _action._inProgress = false;
+ return;
+ }
+
+ if (_action.isAction(VERB_TAKE, NOUN_BURGER) && _game._objects.isInRoom(OBJ_BURGER)) {
+ if (_game._trigger == 0) {
+ _vm->_dialogs->showItem(OBJ_BURGER, 10235);
+ _scene->_sequences.remove(_globals._sequenceIndexes[10]);
+ _game._objects.addToInventory(OBJ_BURGER);
+ _scene->_hotspots.activate(NOUN_BURGER, false);
+ _vm->_sound->command(22);
+ _game._player._visible = true;
+ _game._player._stepEnabled = true;
+ }
+ _action._inProgress = false;
+ return;
+ }
+
+ if (_action.isAction(VERB_TAKE, NOUN_POSTER)) {
+ _vm->_dialogs->show(10224);
+ _action._inProgress = false;
+ return;
+ }
+
+ if ((_action.isAction(VERB_PUSH) || _action.isAction(VERB_PULL)) && _action.isObject(NOUN_WEIGHT_MACHINE)) {
+ _vm->_dialogs->show(10225);
+ _action._inProgress = false;
+ return;
+ }
+
+ if (_action.isAction(VERB_LOOK, NOUN_FLOOR)) {
+ _vm->_dialogs->show(10232);
+ _action._inProgress = false;
+ return;
+ }
+
+ if (_action.isAction(VERB_LOOK, NOUN_BINOCULARS) && !_game._objects.isInInventory(OBJ_BINOCULARS)) {
+ _vm->_dialogs->show(10233);
+ _action._inProgress = false;
+ return;
+ }
+
+ if (_action.isAction(VERB_LOOK, NOUN_BURGER) && (_action._mainObjectSource == 4)) {
+ _vm->_dialogs->show(801);
+ _action._inProgress = false;
+ }
+}
+
+void Scene102::postActions() {
+ if (_action.isAction(VERB_PUT, NOUN_ROBO_KITCHEN) && _game._objects.isInInventory(_game._objects.getIdFromDesc(_action._activeAction._objectNameId))) {
+ _vm->_dialogs->show(10217);
+ _action._inProgress = false;
+ }
+}
+
+/*------------------------------------------------------------------------*/
+
+Scene103::Scene103(MADSEngine *vm) : Scene1xx(vm) {
+ _updateClock = 0;
+}
+
+void Scene103::synchronize(Common::Serializer &s) {
+ Scene1xx::synchronize(s);
+
+ byte dummy = 0;
+ s.syncAsByte(dummy); // In order to avoid to break savegame compatibility
+ s.syncAsUint32LE(_updateClock);
+}
+
+void Scene103::setup() {
+ setPlayerSpritesPrefix();
+ setAAName();
+}
+
+void Scene103::enter() {
+ _globals._spriteIndexes[0] = _scene->_sprites.addSprites(formAnimName('x', 0));
+ _globals._spriteIndexes[1] = _scene->_sprites.addSprites(formAnimName('x', 1));
+ _globals._spriteIndexes[2] = _scene->_sprites.addSprites(formAnimName('x', 2));
+ _globals._spriteIndexes[3] = _scene->_sprites.addSprites(formAnimName('x', 3));
+ _globals._spriteIndexes[4] = _scene->_sprites.addSprites(formAnimName('x', 4));
+ _globals._spriteIndexes[5] = _scene->_sprites.addSprites(formAnimName('x', 5));
+ _globals._spriteIndexes[6] = _scene->_sprites.addSprites(formAnimName('b', -1));
+ _globals._spriteIndexes[7] = _scene->_sprites.addSprites(formAnimName('h', -1));
+ _globals._spriteIndexes[8] = _scene->_sprites.addSprites(formAnimName('m', -1));
+ _globals._spriteIndexes[9] = _scene->_sprites.addSprites(formAnimName('t', -1));
+ _globals._spriteIndexes[10] = _scene->_sprites.addSprites(formAnimName('r', -1));
+ _globals._spriteIndexes[11] = _scene->_sprites.addSprites(formAnimName('c', -1));
+ _globals._spriteIndexes[12] = _scene->_sprites.addSprites("*RXMBD_2");
+ _globals._spriteIndexes[13] = _scene->_sprites.addSprites("*RXMRD_3");
+ _globals._spriteIndexes[15] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[0], false, 7, 0, 1, 0);
+
+ _globals._sequenceIndexes[1] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[1], false, 6, 0, 2, 0);
+ _scene->_sequences.setDepth(_globals._sequenceIndexes[1], 0);
+
+ _globals._sequenceIndexes[2] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[2], false, 6, 0, 0, 25);
+ _scene->_sequences.addSubEntry(_globals._sequenceIndexes[2], SEQUENCE_TRIGGER_SPRITE, 2, 72);
+
+ _globals._sequenceIndexes[3] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[3], false, 6, 0, 1, 37);
+ _scene->_sequences.addSubEntry(_globals._sequenceIndexes[3], SEQUENCE_TRIGGER_SPRITE, 2, 73);
+
+ _globals._sequenceIndexes[8] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[8], false, 8);
+ _globals._sequenceIndexes[7] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[7], false, 6);
+ _globals._sequenceIndexes[4] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[4], false, 6);
+ _globals._sequenceIndexes[5] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[5], false, 6);
+
+ if (_game._objects.isInRoom(OBJ_TIMER_MODULE))
+ _globals._sequenceIndexes[11] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[11], false, 6);
+ else
+ _vm->_game->_scene._hotspots.activate(371, false);
+
+ if (_game._objects.isInRoom(OBJ_REBREATHER))
+ _globals._sequenceIndexes[10] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[10], false, 6);
+ else
+ _vm->_game->_scene._hotspots.activate(289, false);
+
+ if (_globals[kTurkeyExploded]) {
+ _globals._sequenceIndexes[9] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[9], false, 6);
+ _scene->_sequences.setAnimRange(_globals._sequenceIndexes[9], -2, -2);
+ _scene->_hotspots.activate(362, false);
+ }
+
+ if (_scene->_priorSceneId != -2)
+ _game._player._playerPos = Common::Point(237, 74);
+
+ if (_scene->_priorSceneId == 102) {
+ _game._player._stepEnabled = false;
+ _globals._sequenceIndexes[6] = _scene->_sequences.addReverseSpriteCycle(_globals._spriteIndexes[6], false, 6, 1, 0, 0);
+ _scene->_sequences.addSubEntry(_globals._sequenceIndexes[6], SEQUENCE_TRIGGER_EXPIRE, 0, 70);
+ }
+
+ sceneEntrySound();
+ _vm->_game->loadQuoteSet(70, 51, 71, 7, 73, 0);
+
+ if (!_game._visitedScenes._sceneRevisited) {
+ int msgIndex = _scene->_kernelMessages.add(Common::Point(0, 0), 0x1110, 34, 0, 120, _game.getQuote(70));
+ _scene->_kernelMessages.setQuoted(msgIndex, 4, true);
+ }
+
+ if (_scene->_priorSceneId == 102)
+ _vm->_sound->command(20);
+
+ _vm->_palette->setEntry(252, 63, 63, 10);
+ _vm->_palette->setEntry(253, 45, 45, 10);
+ _updateClock = _scene->_frameStartTime;
+}
+
+void Scene103::step() {
+ switch (_vm->_game->_trigger) {
+ case 70:
+ _vm->_game->_player._stepEnabled = true;
+ break;
+
+ case 72: {
+ Common::Point pt = _vm->_game->_player._playerPos;
+ int dist = _vm->hypotenuse(pt.x - 58, pt.y - 93);
+ _vm->_sound->command(27, (dist * -128 / 378) + 127);
+ }
+ break;
+
+ case 73: {
+ Common::Point pt = _vm->_game->_player._playerPos;
+ int dist = _vm->hypotenuse(pt.x - 266, pt.y - 81);
+ _vm->_sound->command(27, (dist * -127 / 378) + 127);
+ }
+ break;
+
+ default:
+ break;
+ }
+
+ if (_scene->_frameStartTime >= _updateClock) {
+ Common::Point pt = _vm->_game->_player._playerPos;
+ int dist = _vm->hypotenuse(pt.x - 79, pt.y - 137);
+ _vm->_sound->command(29, (dist * -127 / 378) + 127);
+
+ pt = _vm->_game->_player._playerPos;
+ dist = _vm->hypotenuse(pt.x - 69, pt.y - 80);
+ _vm->_sound->command(30, (dist * -127 / 378) + 127);
+
+ pt = _vm->_game->_player._playerPos;
+ dist = _vm->hypotenuse(pt.x - 266, pt.y - 138);
+ _vm->_sound->command(32, (dist * -127 / 378) + 127);
+
+ _updateClock = _scene->_frameStartTime + _vm->_game->_player._ticksAmount;
+ }
+}
+
+void Scene103::actions() {
+ if (_action._savedFields._lookFlag)
+ _vm->_dialogs->show(10322);
+ else if (_action.isAction(VERB_WALK_THROUGH, NOUN_DOOR)) {
+ switch (_vm->_game->_trigger) {
+ case 0:
+ _globals._sequenceIndexes[6] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[6], false, 6, 1);
+ _scene->_sequences.addSubEntry(_globals._sequenceIndexes[6], SEQUENCE_TRIGGER_EXPIRE, 0, 1);
+ _game._player._stepEnabled = false;
+ _vm->_sound->command(20);
+ break;
+
+ case 1:
+ _vm->_sound->command(1);
+ _scene->_nextSceneId = 102;
+ _game._player._stepEnabled = true;
+ break;
+
+ default:
+ break;
+ }
+ } else if (_action.isAction(VERB_TAKE, NOUN_TIMER_MODULE) && _game._objects.isInRoom(OBJ_TIMER_MODULE)) {
+ switch (_vm->_game->_trigger) {
+ case 0:
+ _scene->changeVariant(1);
+ _globals._sequenceIndexes[13] = _scene->_sequences.startReverseCycle(_globals._spriteIndexes[13], false, 3, 2);
+ _scene->_sequences.setMsgLayout(_globals._sequenceIndexes[13]);
+ _scene->_sequences.addSubEntry(_globals._sequenceIndexes[13], SEQUENCE_TRIGGER_SPRITE, 7, 1);
+ _scene->_sequences.addSubEntry(_globals._sequenceIndexes[13], SEQUENCE_TRIGGER_EXPIRE, 0, 2);
+ _vm->_game->_player._visible = false;
+ _vm->_game->_player._stepEnabled = false;
+ break;
+
+ case 1:
+ _scene->_sequences.remove(_globals._sequenceIndexes[11]);
+ break;
+
+ case 2:
+ _vm->_sound->command(22);
+ _game._objects.addToInventory(OBJ_TIMER_MODULE);
+ _scene->changeVariant(0);
+ _scene->drawElements(kTransitionNone, false);
+ _scene->_hotspots.activate(371, false);
+ _vm->_game->_player._visible = true;
+ _vm->_game->_player._stepEnabled = true;
+ _vm->_dialogs->showItem(OBJ_REBREATHER, 805);
+ break;
+
+ default:
+ break;
+ }
+ } else if (_action.isAction(VERB_TAKE, 289, 0) && _game._objects.isInRoom(OBJ_REBREATHER)) {
+ switch (_vm->_game->_trigger) {
+ case 0:
+ _scene->changeVariant(1);
+ _globals._sequenceIndexes[12] = _scene->_sequences.startReverseCycle(_globals._spriteIndexes[12], false, 3, 2);
+ _scene->_sequences.setMsgLayout(_globals._sequenceIndexes[12]);
+ _scene->_sequences.addSubEntry(_globals._sequenceIndexes[12], SEQUENCE_TRIGGER_SPRITE, 6, 1);
+ _scene->_sequences.addSubEntry(_globals._sequenceIndexes[12], SEQUENCE_TRIGGER_EXPIRE, 0, 2);
+ _vm->_game->_player._visible = false;
+ _vm->_game->_player._stepEnabled = false;
+ break;
+
+ case 1:
+ _scene->_sequences.remove(_globals._sequenceIndexes[10]);
+ break;
+
+ case 2:
+ _vm->_sound->command(22);
+ _game._objects.addToInventory(OBJ_REBREATHER);
+ _scene->_hotspots.activate(289, false);
+ _vm->_game->_player._visible = true;
+ _vm->_game->_player._stepEnabled = true;
+ _vm->_dialogs->showItem(OBJ_REBREATHER, 804);
+ break;
+
+ default:
+ break;
+ }
+ } else if (_action.isAction(VERB_LOOK, 362))
+ _vm->_dialogs->show(10301);
+ else if (_action.isAction(VERB_TAKE, 362)) {
+ // Take Turkey
+ if (!_vm->_game->_trigger)
+ _vm->_sound->command(31);
+
+ if (_vm->_game->_trigger < 2) {
+ _globals._sequenceIndexes[9] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[9], false, 6, _vm->_game->_trigger < 1 ? 1 : 0);
+ if (_vm->_game->_trigger) {
+ // Lock the turkey into a permanent "exploded" frame
+ _scene->_sequences.setAnimRange(_globals._sequenceIndexes[9], -2, -2);
+
+ // Rex says "Gads.."
+ Common::String msg = _game.getQuote(51);
+ _scene->_kernelMessages.add(Common::Point(0, 0), 0x1110, 18, 0, 60, msg);
+ _scene->_sequences.addTimer(120, _vm->_game->_trigger + 1);
+ } else {
+ // Initial turky explosion
+ _scene->_sequences.addSubEntry(_globals._sequenceIndexes[9], SEQUENCE_TRIGGER_EXPIRE, 0, 1);
+ }
+ }
+
+ // Re-enable player if sequence is ended, and set global flag
+ _game._player._stepEnabled = _game._trigger == 2;
+ _globals[kTurkeyExploded] = -1;
+
+ if (_game._trigger == 2) {
+ // Show exposition dialog at end of sequence
+ _vm->_dialogs->show(10302);
+ _scene->_hotspots.activate(362, false);
+ }
+ } else if (_action.isAction(VERB_LOOK, 250))
+ _vm->_dialogs->show(!_globals[kTurkeyExploded] ? 10323 : 10303);
+ else if (_action.isAction(VERB_TALKTO, 27)) {
+ switch (_vm->_game->_trigger) {
+ case 0: {
+ _game._player._stepEnabled = false;
+ Common::String msg = _game.getQuote(71);
+ _scene->_kernelMessages.add(Common::Point(), 0x1110, 18, 1, 120, msg);
+ break;
+ }
+
+ case 1: {
+ Common::String msg = _game.getQuote(72);
+ _scene->_kernelMessages.add(Common::Point(310, 132), 0xFDFC, 16, 2, 120, msg);
+ break;
+ }
+
+ case 2:
+ _scene->_kernelMessages.reset();
+ _scene->_sequences.addTimer(1, 3);
+ break;
+
+ case 3:
+ _game._player._stepEnabled = true;
+ _vm->_dialogs->show(10306);
+ break;
+
+ default:
+ break;
+ }
+ } else if (_action.isAction(VERB_LOOK, 27))
+ _vm->_dialogs->show(10304);
+ else if (_action.isAction(VERB_LOOK, 36))
+ _vm->_dialogs->show(10307);
+ else if (_action.isAction(VERB_LOOK, 55))
+ _vm->_dialogs->show(10308);
+ else if (_action.isAction(VERB_TAKE, 315))
+ _vm->_dialogs->show(10309);
+ else if (_action.isAction(VERB_TAKE, 85))
+ _vm->_dialogs->show(10310);
+ else if (_action.isAction(VERB_LOOK, 144))
+ _vm->_dialogs->show(10312);
+ else if (_action.isAction(VERB_OPEN, 144))
+ _vm->_dialogs->show(10313);
+ else if (_action.isAction(VERB_CLOSE, 27))
+ _vm->_dialogs->show(10314);
+ else if (_action.isAction(VERB_LOOK, 310))
+ _vm->_dialogs->show(10315);
+ else if (_action.isAction(VERB_LOOK, 178))
+ _vm->_dialogs->show(10316);
+ else if (_action.isAction(VERB_LOOK, 283))
+ _vm->_dialogs->show(10317);
+ else if (_action.isAction(VERB_LOOK, 120))
+ _vm->_dialogs->show(10318);
+ else if (_action.isAction(VERB_LOOK, 289) && _game._objects.isInInventory(OBJ_REBREATHER))
+ _vm->_dialogs->show(10319);
+ else if (_action.isAction(VERB_LOOK, 371) && _game._objects.isInInventory(OBJ_TIMER_MODULE))
+ _vm->_dialogs->show(10320);
+ else if (_action.isAction(VERB_LOOK, 137))
+ _vm->_dialogs->show(10321);
+ else if (_action.isAction(VERB_LOOK, 409))
+ _vm->_dialogs->show(_game._objects.isInInventory(OBJ_TIMER_MODULE) ? 10324 : 10325);
+ else
+ return;
+
+ _action._inProgress = false;
+}
+
+void Scene103::postActions() {
+ if (_action.isObject(NOUN_AUXILIARY_POWER) && !_action.isAction(VERB_WALKTO)) {
+ _vm->_dialogs->show(10305);
+ _action._inProgress = false;
+ } else if (_action.isAction(VERB_PUT, NOUN_COAL, NOUN_FURNACE)) {
+ Common::String msg = _game.getQuote(73);
+ _scene->_kernelMessages.add(Common::Point(0, 0), 0x1110, 34, 0, 120, msg);
+ _action._inProgress = false;
+ }
+}
+
+/*------------------------------------------------------------------------*/
+
+Scene104::Scene104(MADSEngine *vm) : Scene1xx(vm) {
+ _kargShootingFl = false;
+ _loseFl = false;
+}
+
+void Scene104::synchronize(Common::Serializer &s) {
+ Scene1xx::synchronize(s);
+
+ s.syncAsByte(_kargShootingFl);
+ s.syncAsByte(_loseFl);
+}
+
+void Scene104::setup() {
+ // Preloading has been skipped
+ setPlayerSpritesPrefix();
+ setAAName();
+}
+
+void Scene104::enter() {
+ _globals._spriteIndexes[1] = _scene->_sprites.addSprites(formAnimName('h', -1));
+ _globals._sequenceIndexes[1] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[1], false, 14, 0, 0, 1);
+
+ if (_scene->_priorSceneId == 105)
+ _game._player._playerPos = Common::Point(302, 107);
+ else if (_scene->_priorSceneId != -2)
+ _game._player._playerPos = Common::Point(160, 134);
+
+ _loseFl = false;
+ _game.loadQuoteSet(0x35, 0x34, 0);
+ _kargShootingFl = false;
+
+ if (_vm->getRandomNumber(1, 3) == 1) {
+ _scene->loadAnimation(Resources::formatName(104, 'B', -1, EXT_AA, ""), 0);
+ _kargShootingFl = true;
+ }
+
+ sceneEntrySound();
+}
+
+void Scene104::step() {
+ if ((_game._player._playerPos == Common::Point(189, 70)) && (_game._trigger || !_loseFl)) {
+ if (_game._player._facing == FACING_SOUTHWEST || _game._player._facing == FACING_SOUTHEAST)
+ _game._player._facing = FACING_SOUTH;
+
+ if (_game._player._facing == FACING_NORTHWEST || _game._player._facing == FACING_NORTHEAST)
+ _game._player._facing = FACING_NORTH;
+
+ bool mirrorFl = false;
+ if (_game._player._facing == FACING_WEST) {
+ _game._player._facing = FACING_EAST;
+ mirrorFl = true;
+ }
+
+ _loseFl = true;
+
+ switch (_game._player._facing) {
+ case FACING_EAST:
+ switch (_game._trigger) {
+ case 0:
+ _scene->_kernelMessages.reset();
+ _scene->freeAnimation();
+ _scene->resetScene();
+ _game._player._stepEnabled = false;
+ _game._player._visible = false;
+ _globals._spriteIndexes[2] = _scene->_sprites.addSprites(formAnimName('a', 0));
+ _vm->_palette->refreshSceneColors();
+ _globals._sequenceIndexes[2] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[2], mirrorFl, 7, 1, 0, 0);
+ _scene->_sequences.setPosition(_globals._sequenceIndexes[2], Common::Point(198, 143));
+ _scene->_sequences.setDepth(_globals._sequenceIndexes[2], 4);
+ _scene->_sequences.addSubEntry(_globals._sequenceIndexes[2], SEQUENCE_TRIGGER_EXPIRE, 0, 1);
+ break;
+
+ case 1:
+ _globals._sequenceIndexes[2] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[2], mirrorFl, 7, 0, 0, 0);
+ _scene->_sequences.setPosition(_globals._sequenceIndexes[2], Common::Point(198, 143));
+ _scene->_sequences.setAnimRange(_globals._sequenceIndexes[2], -2, -2);
+ _scene->_sequences.addTimer(90, 2);
+ break;
+
+ case 2:
+ _vm->_dialogs->show(10406);
+ _scene->_reloadSceneFlag = true;
+ break;
+
+ default:
+ break;
+ }
+ break;
+
+ case FACING_SOUTH:
+ switch (_game._trigger) {
+ case 0:
+ _scene->_kernelMessages.reset();
+ _scene->freeAnimation();
+ _scene->resetScene();
+ _game._player._stepEnabled = false;
+ _game._player._visible = false;
+ _globals._spriteIndexes[3] = _scene->_sprites.addSprites(formAnimName('a', 1));
+ _vm->_palette->refreshSceneColors();
+ _globals._sequenceIndexes[3] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[3], false, 6, 1, 0, 0);
+ _scene->_sequences.setPosition(_globals._sequenceIndexes[3], Common::Point(198, 143));
+ _scene->_sequences.setDepth(_globals._sequenceIndexes[3], 4);
+ _scene->_sequences.setAnimRange(_globals._sequenceIndexes[3], 1, 14);
+ _scene->_sequences.addSubEntry(_globals._sequenceIndexes[3], SEQUENCE_TRIGGER_EXPIRE, 0, 1);
+ break;
+
+ case 1:
+ _globals._sequenceIndexes[3] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[3], false, 5, 1, 0, 0);
+ _scene->_sequences.setPosition(_globals._sequenceIndexes[3], Common::Point(198, 143));
+ _scene->_sequences.setDepth(_globals._sequenceIndexes[3], 4);
+ _scene->_sequences.setAnimRange(_globals._sequenceIndexes[3], 15, 32);
+ _scene->_sequences.addSubEntry(_globals._sequenceIndexes[3], SEQUENCE_TRIGGER_EXPIRE, 0, 2);
+ break;
+
+ case 2:
+ _globals._sequenceIndexes[3] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[3], false, 3, 0, 0, 0);
+ _scene->_sequences.setPosition(_globals._sequenceIndexes[3], Common::Point(198, 143));
+ _scene->_sequences.setAnimRange(_globals._sequenceIndexes[3], -2, -2);
+ _scene->_sequences.addTimer(90, 3);
+ break;
+
+ case 3:
+ _vm->_dialogs->show(10406);
+ _scene->_reloadSceneFlag = true;
+ break;
+
+ default:
+ break;
+ }
+ break;
+
+ case FACING_NORTH:
+ switch (_game._trigger) {
+ case 0:
+ _scene->_kernelMessages.reset();
+ _scene->freeAnimation();
+ _scene->resetScene();
+ _game._player._stepEnabled = false;
+ _game._player._visible = false;
+ _globals._spriteIndexes[4] = _scene->_sprites.addSprites(formAnimName('a', 2));
+ _vm->_palette->refreshSceneColors();
+ _globals._sequenceIndexes[4] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[4], false, 8, 1, 0, 0);
+ _scene->_sequences.setPosition(_globals._sequenceIndexes[4], Common::Point(198, 143));
+ _scene->_sequences.setDepth(_globals._sequenceIndexes[4], 4);
+ _scene->_sequences.addSubEntry(_globals._sequenceIndexes[4], SEQUENCE_TRIGGER_EXPIRE, 0, 1);
+ if (_game._storyMode >= STORYMODE_NICE)
+ _scene->_sequences.addSubEntry(_globals._sequenceIndexes[4], SEQUENCE_TRIGGER_SPRITE, 15, 2);
+ break;
+
+ case 1:
+ _globals._sequenceIndexes[4] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[4], false, 8, 0, 0, 0);
+ _scene->_sequences.setPosition(_globals._sequenceIndexes[4], Common::Point(198, 143));
+ _scene->_sequences.setAnimRange(_globals._sequenceIndexes[4], -2, -2);
+ _scene->_sequences.addTimer(90, 2);
+ break;
+
+ case 2:
+ _vm->_dialogs->show(10406);
+ _scene->_reloadSceneFlag = true;
+ break;
+
+ default:
+ break;
+ }
+ break;
+ default:
+ break;
+ }
+
+ if (!_game._trigger)
+ _vm->_sound->command(34);
+ }
+
+ if (_game._player._moving && (_scene->_rails.getNext() > 0)) {
+ _game._player.cancelCommand();
+ _game._player.startWalking(Common::Point(189, 70), FACING_NONE);
+ _scene->_rails.resetNext();
+ }
+
+ if ((_game._player._special > 0) && _game._player._stepEnabled)
+ _game._player._stepEnabled = false;
+
+ if (_kargShootingFl && (_scene->_activeAnimation->getCurrentFrame() >= 19)) {
+ _scene->_kernelMessages.add(Common::Point(0, 0), 0x1110, 34, 0, 120, _game.getQuote(52));
+ _kargShootingFl = false;
+ }
+}
+
+void Scene104::preActions() {
+ if (_action.isAction(VERB_SWIM_TOWARDS, NOUN_EASTERN_CLIFF_FACE))
+ _game._player._walkOffScreenSceneId = 105;
+
+ if (_action.isAction(VERB_SWIM_TOWARDS, NOUN_OPEN_AREA_TO_SOUTH))
+ _game._player._walkOffScreenSceneId = 106;
+}
+
+void Scene104::actions() {
+ if (_action._lookFlag)
+ _vm->_dialogs->show(10405);
+ else if (_action.isAction(VERB_LOOK, NOUN_CURIOUS_WEED_PATCH))
+ _vm->_dialogs->show(10404);
+ else if (_action.isAction(VERB_LOOK, NOUN_SURFACE))
+ _vm->_dialogs->show(10403);
+ else if (_action.isAction(VERB_LOOK, NOUN_CLIFF_FACE))
+ _vm->_dialogs->show(10401);
+ else if (_action.isAction(VERB_LOOK, NOUN_OCEAN_FLOOR))
+ _vm->_dialogs->show(10402);
+ else
+ return;
+
+ _action._inProgress = false;
+}
+
+/*------------------------------------------------------------------------*/
+
+Scene105::Scene105(MADSEngine *vm) : Scene1xx(vm) {
+ _explosionFl = false;
+}
+
+void Scene105::synchronize(Common::Serializer &s) {
+ Scene1xx::synchronize(s);
+
+ s.syncAsByte(_explosionFl);
+}
+
+void Scene105::setup() {
+ // Preloading has been skipped
+ setPlayerSpritesPrefix();
+ setAAName();
+}
+
+void Scene105::enter() {
+ _globals._spriteIndexes[1] = _scene->_sprites.addSprites(formAnimName('m', 1));
+ _globals._spriteIndexes[4] = _scene->_sprites.addSprites(formAnimName('f', 4));
+ _globals._sequenceIndexes[1] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[1], false, 8, 0, 0, 0);
+
+ if (_globals[kFishIn105]) {
+ _globals._sequenceIndexes[4] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[4], false, 6, 0, 0, 0);
+ _scene->_sequences.setPosition(_globals._sequenceIndexes[4], Common::Point(48, 144));
+
+ int idx = _scene->_dynamicHotspots.add(101, 348, _globals._sequenceIndexes[4], Common::Rect(0, 0, 0, 0));
+ _scene->_dynamicHotspots.setPosition(idx, Common::Point(56, 141), FACING_NORTHWEST);
+ }
+
+ if (_scene->_priorSceneId == 104)
+ _game._player._playerPos = Common::Point(13, 97);
+ else if (_scene->_priorSceneId != -2)
+ _game._player._playerPos = Common::Point(116, 147);
+
+ _game.loadQuoteSet(0x4A, 0x4B, 0x4C, 0x35, 0x34, 0);
+ _explosionFl = false;
+
+ sceneEntrySound();
+}
+
+void Scene105::step() {
+ if ((_game._player._playerPos == Common::Point(170, 87)) && (_game._trigger || !_explosionFl)) {
+ _explosionFl = true;
+ switch (_game._trigger) {
+ case 0:
+ _scene->_kernelMessages.reset();
+ _scene->resetScene();
+ _game._player._stepEnabled = false;
+ _game._player._visible = false;
+
+ _globals._spriteIndexes[0] = _scene->_sprites.addSprites(formAnimName('m', 0));
+ _globals._spriteIndexes[2] = _scene->_sprites.addSprites(formAnimName('m', 2));
+ _globals._spriteIndexes[3] = _scene->_sprites.addSprites(formAnimName('m', 3));
+ _vm->_sound->command(33);
+ _scene->clearSequenceList();
+ _vm->_palette->refreshSceneColors();
+
+ _globals._sequenceIndexes[0] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[0], false, 6, 1, 0, 0);
+ _scene->_sequences.setDepth(_globals._sequenceIndexes[0], 8);
+ _scene->_sequences.addSubEntry(_globals._sequenceIndexes[0], SEQUENCE_TRIGGER_EXPIRE, 0, 1);
+
+ if (_game._storyMode >= STORYMODE_NICE)
+ _scene->_sequences.addSubEntry(_globals._sequenceIndexes[0], SEQUENCE_TRIGGER_SPRITE, 8, 3);
+ break;
+
+ case 1:
+ _globals._sequenceIndexes[3] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[3], false, 6, 0, 0, 0);
+ _scene->_sequences.setDepth(_globals._sequenceIndexes[3], 8);
+ _scene->_sequences.setAnimRange(_globals._sequenceIndexes[3], -2, -2);
+ _globals._sequenceIndexes[2] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[2], false, 9, 1, 0, 0);
+ _scene->_sequences.updateTimeout(_globals._sequenceIndexes[2], _globals._sequenceIndexes[0]);
+ _scene->_sequences.setDepth(_globals._sequenceIndexes[2], 8);
+ _scene->_sequences.setAnimRange(_globals._sequenceIndexes[2], 5, 7);
+ _scene->_sequences.addSubEntry(_globals._sequenceIndexes[2], SEQUENCE_TRIGGER_EXPIRE, 0, 2);
+ break;
+
+ case 2: {
+ int oldIdx = _globals._sequenceIndexes[2];
+ _globals._sequenceIndexes[2] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[2], false, 9, 0, 0, 0);
+ _scene->_sequences.updateTimeout(_globals._sequenceIndexes[2], oldIdx);
+ _scene->_sequences.setDepth(_globals._sequenceIndexes[2], 8);
+ _scene->_sequences.addTimer(90, 3);
+ }
+ break;
+
+ case 3:
+ _vm->_dialogs->show(10507);
+ _scene->_reloadSceneFlag = true;
+ _scene->_sequences.addTimer(90, 4);
+ break;
+
+ default:
+ break;
+ }
+ }
+
+ if (_game._player._moving && (_scene->_rails.getNext() > 0)) {
+ _game._player.cancelCommand();
+ _game._player.startWalking(Common::Point(170, 87), FACING_NONE);
+ _scene->_rails.resetNext();
+ }
+
+ if ((_game._player._special > 0) && _game._player._stepEnabled)
+ _game._player._stepEnabled = false;
+}
+
+void Scene105::preActions() {
+ if (_action.isAction(VERB_SWIM_TOWARDS, NOUN_WESTERN_CLIFF_FACE))
+ _game._player._walkOffScreenSceneId = 104;
+
+ if (_action.isAction(VERB_SWIM_TOWARDS, NOUN_OPEN_AREA_TO_SOUTH))
+ _game._player._walkOffScreenSceneId = 107;
+
+ if (_action.isObject(NOUN_MINE) && (_action.isAction(VERB_TALKTO) || _action.isAction(VERB_LOOK)))
+ _game._player._needToWalk = false;
+}
+
+void Scene105::actions() {
+ if (_action._lookFlag)
+ _vm->_dialogs->show(10512);
+ else if (_action.isAction(VERB_TAKE, NOUN_DEAD_FISH) && _globals[kFishIn105]) {
+ if (_game._objects.isInInventory(OBJ_DEAD_FISH)) {
+ int randVal = _vm->getRandomNumber(74, 76);
+ _scene->_kernelMessages.reset();
+ _scene->_kernelMessages.add(Common::Point(0, 0), 0x1110, 34, 0, 120, _game.getQuote(randVal));
+ } else {
+ _scene->_sequences.remove(_globals._sequenceIndexes[4]);
+ _game._objects.addToInventory(OBJ_DEAD_FISH);
+ _globals[kFishIn105] = false;
+ _vm->_dialogs->showItem(OBJ_DEAD_FISH, 802, 0);
+ }
+ } else if (_action.isAction(VERB_LOOK, NOUN_WESTERN_CLIFF_FACE))
+ _vm->_dialogs->show(10501);
+ else if (_action.isAction(VERB_LOOK, NOUN_CLIFF_FACE))
+ _vm->_dialogs->show(10502);
+ else if (_action.isAction(VERB_LOOK, NOUN_OCEAN_FLOOR))
+ _vm->_dialogs->show(10503);
+ else if (_action.isAction(VERB_LOOK, NOUN_MEDICAL_WASTE))
+ _vm->_dialogs->show(10504);
+ else if (_action.isAction(VERB_TAKE, NOUN_MEDICAL_WASTE))
+ _vm->_dialogs->show(10505);
+ else if (_action.isAction(VERB_LOOK, NOUN_MINE))
+ _vm->_dialogs->show(10506);
+ else if (_action.isAction(VERB_LOOK, NOUN_DEAD_FISH))
+ _vm->_dialogs->show(10508);
+ else if (_action.isAction(VERB_LOOK, NOUN_SURFACE))
+ _vm->_dialogs->show(10509);
+ else if (_action.isAction(VERB_LOOK, NOUN_OPEN_AREA_TO_SOUTH))
+ _vm->_dialogs->show(10510);
+ else if (_action.isAction(VERB_LOOK, NOUN_ROCKS))
+ _vm->_dialogs->show(10511);
+ else
+ return;
+
+ _action._inProgress = false;
+}
+
+/*------------------------------------------------------------------------*/
+
+Scene106::Scene106(MADSEngine *vm) : Scene1xx(vm) {
+ _backToShipFl = false;
+ _shadowFl = false;
+ _firstEmergingFl = false;
+ _positionY = 0;
+}
+
+void Scene106::synchronize(Common::Serializer &s) {
+ Scene1xx::synchronize(s);
+
+ s.syncAsByte(_backToShipFl);
+ s.syncAsByte(_shadowFl);
+ s.syncAsByte(_firstEmergingFl);
+ s.syncAsSint32LE(_positionY);
+}
+
+void Scene106::setup() {
+ setPlayerSpritesPrefix();
+ setAAName();
+
+ if ((_scene->_priorSceneId == 102) && !_game._objects.isInInventory(OBJ_REBREATHER) && !_scene->_roomChanged)
+ _game._player._spritesPrefix = "";
+
+ _vm->_dialogs->_defaultPosition.y = 100;
+}
+
+void Scene106::enter() {
+ _globals._spriteIndexes[0] = _scene->_sprites.addSprites(formAnimName('H', -1));
+
+ if (_game._objects.isInInventory(OBJ_REBREATHER) || (_scene->_priorSceneId != 102) || _scene->_roomChanged) {
+ _globals._spriteIndexes[1] = _scene->_sprites.addSprites(formAnimName('A', 0));
+ _globals._spriteIndexes[3] = _scene->_sprites.addSprites(formAnimName('A', 1));
+ }
+
+ _globals._spriteIndexes[2] = _scene->_sprites.addSprites(formAnimName('G', -1));
+ _globals._sequenceIndexes[2] = _scene->_sequences.startReverseCycle(_globals._spriteIndexes[2], false, 21, 0, 0, 0);
+ _globals._spriteIndexes[4] = _scene->_sprites.addSprites(formAnimName('I', -1));
+ _globals._sequenceIndexes[4] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[4], false, 6, 0, 32, 47);
+
+ if (_scene->_priorSceneId == 102) {
+ _globals._sequenceIndexes[0] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[0], false, 6, 1, 4, 0);
+ _scene->_sequences.addSubEntry(_globals._sequenceIndexes[0], SEQUENCE_TRIGGER_EXPIRE, 0, 70);
+ _game._player._visible = false;
+ _game._player._stepEnabled = false;
+ _game._player._facing = FACING_EAST;
+ _game._player._playerPos = Common::Point(106, 69);
+ } else if (_scene->_priorSceneId != -2) {
+ if (_scene->_priorSceneId == 107) {
+ _game._player._playerPos = Common::Point(319, 84);
+ _game._player._facing = _game._player._prepareWalkFacing = FACING_WEST;
+ } else {
+ _game._player._playerPos = Common::Point(319, 44);
+ _game._player._facing = _game._player._prepareWalkFacing = FACING_SOUTHWEST;
+ _scene->_sprites[_game._player._spritesStart + 3]->_charInfo->_velocity = 24;
+ }
+
+ _game._player._prepareWalkPos = Common::Point(246, 69);
+ _game._player._needToWalk = true;
+ _game._player._readyToWalk = true;
+ }
+
+ if (_scene->_priorSceneId != 102) {
+ _globals._sequenceIndexes[0] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[0], false, 6, 0, 0, 0);
+ _scene->_sequences.setAnimRange(_globals._sequenceIndexes[0], -2, -2);
+ _scene->_sequences.setDepth(_globals._sequenceIndexes[0], 14);
+ }
+
+ _backToShipFl = false;
+ _shadowFl = false;
+ _firstEmergingFl = false;
+
+ _game.loadQuoteSet(0x31, 0x32, 0x34, 0x4D, 0x4E, 0x4F, 0x50, 0x51, 0);
+ sceneEntrySound();
+}
+
+void Scene106::step() {
+ if (_game._trigger == 70) {
+ _globals._sequenceIndexes[0] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[0], false, 6, 0, 0, 0);
+ _scene->_sequences.setAnimRange(_globals._sequenceIndexes[0], -2, -2);
+ _scene->_sequences.setDepth(_globals._sequenceIndexes[0], 14);
+
+ if (!_game._objects.isInInventory(OBJ_REBREATHER) && !_scene->_roomChanged) {
+ _scene->loadAnimation(Resources::formatName(106, 'A', -1, EXT_AA, ""), 75);
+ } else {
+ _globals._sequenceIndexes[1] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[1], false, 4, 1, 0, 0);
+ _scene->_sequences.addSubEntry(_globals._sequenceIndexes[1], SEQUENCE_TRIGGER_SPRITE, 28, 71);
+ }
+ }
+
+ if (_game._trigger == 71) {
+ _game._player._prepareWalkPos = Common::Point(246, 69);
+ _game._player._prepareWalkFacing = FACING_EAST;
+ _game._player._needToWalk = true;
+ _game._player._readyToWalk = true;
+ _game._player._visible = true;
+
+ if (_game._visitedScenes._sceneRevisited) {
+ _game._player._stepEnabled = true;
+ } else {
+ _game._player._prepareWalkFacing = FACING_SOUTHWEST;
+ _firstEmergingFl = true;
+ _scene->loadAnimation(Resources::formatName(106, 'B', -1, EXT_AA, ""), 80);
+ }
+ }
+
+ if (_firstEmergingFl && (_scene->_activeAnimation->getCurrentFrame() >= 19)) {
+ _firstEmergingFl = false;
+ _scene->_kernelMessages.add(Common::Point(0, 0), 0x1110, 34, 0, 120, _game.getQuote(52));
+ }
+
+ if ((_game._trigger >= 80) && (_game._trigger <= 87)) {
+ int tmpVal = _game._trigger - 80;
+ int msgId = -1;
+ switch (tmpVal) {
+ case 0:
+ _positionY = 26;
+ msgId = 49;
+ break;
+
+ case 1:
+ case 2:
+ case 3:
+ case 4:
+ case 5:
+ msgId = 76 + tmpVal;
+ break;
+
+ case 6:
+ msgId = 50;
+ break;
+
+ default:
+ msgId = -1;
+ _game._player._stepEnabled = true;
+ break;
+ }
+
+ if (msgId >= 0) {
+ int nextAbortVal = _game._trigger + 1;
+ _scene->_kernelMessages.add(Common::Point(15, _positionY), 0x1110, 0, 0, 360, _game.getQuote(msgId));
+ _scene->_sequences.addTimer(150, nextAbortVal);
+ _positionY += 14;
+ }
+ }
+
+ if (_backToShipFl) {
+ if (!_shadowFl) {
+ if (_game._player._playerPos.x < 204) {
+ _shadowFl = true;
+ _globals._sequenceIndexes[3] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[3], false, 4, 1, 0, 0);
+ _scene->_sequences.addSubEntry(_globals._sequenceIndexes[3], SEQUENCE_TRIGGER_EXPIRE, 0, 72);
+ _scene->_sequences.addSubEntry(_globals._sequenceIndexes[3], SEQUENCE_TRIGGER_SPRITE, 44, 73);
+ }
+ } else if (_game._trigger == 73)
+ _game._player._visible = false;
+ else if (_game._trigger == 72)
+ _scene->_sequences.addTimer(24, 74);
+ else if (_game._trigger == 74)
+ _scene->_nextSceneId = 102;
+ }
+
+ if (_game._trigger == 75) {
+ _game._visitedScenes.pop_back();
+ _scene->_nextSceneId = 102;
+ }
+}
+
+void Scene106::preActions() {
+ if (_action.isAction(VERB_SWIM_TOWARDS, NOUN_SEA_CLIFF) || _action.isAction(VERB_SWIM_TOWARDS, NOUN_SEAWEED_BANK)) {
+ _game._player._stepEnabled = false;
+ _scene->_sprites[_game._player._spritesStart + 1]->_charInfo->_velocity = 24;
+ _game._player._walkOffScreenSceneId = 104;
+ }
+
+ if (_action.isAction(VERB_SWIM_TOWARDS, NOUN_OPEN_AREA_TO_EAST))
+ _game._player._walkOffScreenSceneId = 107;
+}
+
+void Scene106::actions() {
+ if (_action._lookFlag)
+ _vm->_dialogs->show(10614);
+ else if (_action.isAction(VERB_SWIM_TO, NOUN_MAIN_AIRLOCK)) {
+ _game._player._stepEnabled = false;
+ _game._player._prepareWalkPos = Common::Point(95, 72);
+ _game._player._prepareWalkFacing = FACING_WEST;
+ _game._player._needToWalk = true;
+ _game._player._readyToWalk = true;
+ _game._player._frameNumber = 9;
+ _backToShipFl = true;
+ } else if (_action.isAction(VERB_LOOK, NOUN_ANEMONE) || _action.isAction(VERB_LOOK_AT, NOUN_ANEMONE))
+ _vm->_dialogs->show(10601);
+ else if (_action.isAction(VERB_TAKE, NOUN_ANEMONE))
+ _vm->_dialogs->show(10602);
+ else if (_action.isAction(VERB_LOOK, NOUN_SEAWEED) || _action.isAction(VERB_LOOK, NOUN_SEAWEED_BANK))
+ _vm->_dialogs->show(10603);
+ else if (_action.isAction(VERB_TAKE, NOUN_SEAWEED) || _action.isAction(VERB_TAKE, NOUN_SEAWEED_BANK))
+ _vm->_dialogs->show(10604);
+ else if (_action.isAction(VERB_LOOK, NOUN_OPEN_AREA_TO_EAST))
+ _vm->_dialogs->show(10605);
+ else if (_action.isAction(VERB_LOOK, NOUN_PILE_OF_ROCKS) || _action.isAction(VERB_LOOK_AT, NOUN_PILE_OF_ROCKS))
+ _vm->_dialogs->show(10606);
+ else if (_action.isObject(NOUN_PILE_OF_ROCKS) && (_action.isAction(VERB_PUSH) || _action.isAction(VERB_PULL) || _action.isAction(VERB_TAKE)))
+ _vm->_dialogs->show(10607);
+ else if (_action.isAction(VERB_LOOK, NOUN_SHIP) || _action.isAction(VERB_LOOK_AT, NOUN_SHIP))
+ _vm->_dialogs->show(10608);
+ else if (_action.isAction(VERB_LOOK, NOUN_MAIN_AIRLOCK))
+ _vm->_dialogs->show(10609);
+ else if (_action.isAction(VERB_OPEN, NOUN_MAIN_AIRLOCK))
+ _vm->_dialogs->show(10610);
+ else if (_action.isAction(VERB_CLOSE, NOUN_MAIN_AIRLOCK))
+ _vm->_dialogs->show(10611);
+ else if (_action.isAction(VERB_LOOK, NOUN_SEA_CLIFF))
+ _vm->_dialogs->show(10612);
+ else if (_action.isAction(VERB_LOOK, NOUN_OCEAN_FLOOR))
+ _vm->_dialogs->show(10613);
+ else
+ return;
+
+ _action._inProgress = false;
+}
+
+/*------------------------------------------------------------------------*/
+
+Scene107::Scene107(MADSEngine *vm) : Scene1xx(vm) {
+ _shootingFl = false;
+}
+
+void Scene107::synchronize(Common::Serializer &s) {
+ Scene1xx::synchronize(s);
+
+ s.syncAsByte(_shootingFl);
+}
+
+void Scene107::setup() {
+ setPlayerSpritesPrefix();
+ setAAName();
+
+ _scene->addActiveVocab(NOUN_MANTA_RAY);
+}
+
+void Scene107::enter() {
+ for (int i = 0; i < 3; i++)
+ _globals._spriteIndexes[i + 1] = _scene->_sprites.addSprites(formAnimName('G', i));
+
+ _globals._spriteIndexes[4] = _scene->_sprites.addSprites(Resources::formatName(105, 'f', 4, EXT_SS, ""));
+
+ _globals._sequenceIndexes[1] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[1], false, 14, 0, 0, 7);
+ _globals._sequenceIndexes[2] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[2], false, 17, 0, 0, 13);
+ _globals._sequenceIndexes[3] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[3], false, 19, 0, 0, 9);
+
+ for (int i = 1; i < 4; i++)
+ _scene->_sequences.setDepth(_globals._sequenceIndexes[i], 0);
+
+ if (_globals[kFishIn107]) {
+ _globals._sequenceIndexes[4] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[4], false, 6, 0, 0, 0);
+ _scene->_sequences.setPosition(_globals._sequenceIndexes[4], Common::Point(68, 151));
+ _scene->_sequences.setDepth(_globals._sequenceIndexes[4], 1);
+ int idx = _scene->_dynamicHotspots.add(101, 348, _globals._sequenceIndexes[4], Common::Rect(0, 0, 0, 0));
+ _scene->_dynamicHotspots.setPosition(idx, Common::Point(78, 135), FACING_SOUTHWEST);
+ }
+
+ if (_scene->_priorSceneId == 105)
+ _game._player._playerPos = Common::Point(132, 47);
+ else if (_scene->_priorSceneId == 106)
+ _game._player._playerPos = Common::Point(20, 91);
+ else if (_scene->_priorSceneId != -2)
+ _game._player._playerPos = Common::Point(223, 151);
+
+ if (((_scene->_priorSceneId == 105) || (_scene->_priorSceneId == 106)) && (_vm->getRandomNumber(1, 3) == 1)) {
+ _globals._spriteIndexes[0] = _scene->_sprites.addSprites(Resources::formatName(105, 'R', 1, EXT_SS, ""));
+ _globals._sequenceIndexes[0] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[0], true, 4, 0, 0, 0);
+ _scene->_sequences.setPosition(_globals._sequenceIndexes[0], Common::Point(270, 150));
+ _scene->_sequences.setMotion(_globals._sequenceIndexes[0], SEQUENCE_TRIGGER_SPRITE, -200, 0);
+ _scene->_sequences.setDepth(_globals._sequenceIndexes[0], 2);
+ _scene->_dynamicHotspots.add(218, 348, _globals._sequenceIndexes[0], Common::Rect(0, 0, 0, 0));
+ }
+
+ _game.loadQuoteSet(0x4A, 0x4B, 0x4C, 0x35, 0x34, 0);
+ _shootingFl = false;
+
+ if (_vm->getRandomNumber(1, 3) == 1) {
+ _scene->loadAnimation(Resources::formatName(107, 'B', -1, EXT_AA, ""), 0);
+ _shootingFl = true;
+ }
+
+ sceneEntrySound();
+}
+
+void Scene107::step() {
+ if (_shootingFl && (_scene->_activeAnimation->getCurrentFrame() >= 19)) {
+ _scene->_kernelMessages.add(Common::Point(0, 0), 0x1110, 34, 0, 120, _game.getQuote(52));
+ _shootingFl = false;
+ }
+}
+
+void Scene107::preActions() {
+ if (_action.isAction(VERB_SWIM_TOWARDS, NOUN_OPEN_AREA_TO_WEST))
+ _game._player._walkOffScreenSceneId = 106;
+
+ if (_action.isAction(VERB_SWIM_TOWARDS, NOUN_OPEN_AREA_TO_SOUTH))
+ _game._player._walkOffScreenSceneId = 108;
+}
+
+void Scene107::actions() {
+ if (_action._lookFlag)
+ _vm->_dialogs->show(10708);
+ else if (_action.isAction(VERB_TAKE, NOUN_DEAD_FISH) && _globals[kFishIn107]) {
+ if (_game._objects.isInInventory(OBJ_DEAD_FISH)) {
+ int randVal = _vm->getRandomNumber(74, 76);
+ _scene->_kernelMessages.reset();
+ _scene->_kernelMessages.add(Common::Point(0, 0), 0x1110, 34, 0, 120, _game.getQuote(randVal));
+ } else {
+ _scene->_sequences.remove(_globals._sequenceIndexes[4]);
+ _game._objects.addToInventory(OBJ_DEAD_FISH);
+ _globals[kFishIn107] = false;
+ _vm->_dialogs->showItem(OBJ_DEAD_FISH, 802);
+ }
+ } else if (_action.isAction(VERB_SWIM_TOWARDS, NOUN_NORTHERN_SEA_CLIFF))
+ _scene->_nextSceneId = 105;
+ else if (_action.isAction(VERB_LOOK, NOUN_NORTHERN_SEA_CLIFF))
+ _vm->_dialogs->show(10701);
+ else if (_action.isAction(VERB_LOOK, NOUN_DEAD_FISH) && (_action._mainObjectSource == 4))
+ _vm->_dialogs->show(10702);
+ else if (_action.isAction(VERB_LOOK, NOUN_BUSH_LIKE_FORMATION))
+ _vm->_dialogs->show(10703);
+ else if (_action.isAction(VERB_LOOK, NOUN_ROCK))
+ _vm->_dialogs->show(10704);
+ else if (_action.isAction(VERB_LOOK, NOUN_SEAWEED))
+ _vm->_dialogs->show(10705);
+ else if (_action.isAction(VERB_LOOK, NOUN_OPEN_AREA_TO_SOUTH))
+ _vm->_dialogs->show(10706);
+ else if (_action.isAction(VERB_LOOK, NOUN_CLIFF_FACE))
+ _vm->_dialogs->show(10707);
+ else if (_action.isAction(VERB_LOOK, NOUN_MANTA_RAY))
+ _vm->_dialogs->show(10709);
+ else if (_action.isAction(VERB_TAKE, NOUN_MANTA_RAY))
+ _vm->_dialogs->show(10710);
+ else
+ return;
+
+ _action._inProgress = false;
+}
+
+/*------------------------------------------------------------------------*/
+
+void Scene108::setup() {
+ setPlayerSpritesPrefix();
+ setAAName();
+}
+
+void Scene108::enter() {
+ if (_globals[kHoovicSated] == 2)
+ _globals[kHoovicSated] = 0;
+
+ _globals._spriteIndexes[0] = _scene->_sprites.addSprites(formAnimName('X', 0));
+ _globals._spriteIndexes[1] = _scene->_sprites.addSprites(formAnimName('X', 1));
+ _globals._spriteIndexes[2] = _scene->_sprites.addSprites(formAnimName('X', 2));
+ _globals._spriteIndexes[3] = _scene->_sprites.addSprites(formAnimName('X', 3));
+ _globals._spriteIndexes[4] = _scene->_sprites.addSprites(Resources::formatName(105, 'f', 4, EXT_SS, ""));
+
+ _globals._sequenceIndexes[0] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[0], false, 13, 0, 0, 7);
+ _globals._sequenceIndexes[1] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[1], false, 16, 0, 0, 9);
+ _globals._sequenceIndexes[2] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[2], false, 17, 0, 0, 3);
+ _globals._sequenceIndexes[3] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[3], false, 14, 0, 0, 13);
+
+ for (int i = 0; i <= 3; i++)
+ _scene->_sequences.setDepth(_globals._sequenceIndexes[i], 0);
+
+ if (_globals[kFishIn108]) {
+ _globals._sequenceIndexes[4] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[4], false, 6, 0, 0, 0);
+ _scene->_sequences.setPosition(_globals._sequenceIndexes[4], Common::Point(41, 109));
+ int idx = _scene->_dynamicHotspots.add(101, 348, _globals._sequenceIndexes[4], Common::Rect(0, 0, 0, 0));
+ _scene->_dynamicHotspots.setPosition(idx, Common::Point(41, 109), FACING_NORTHWEST);
+ }
+
+ if (_scene->_priorSceneId == 107)
+ _game._player._playerPos = Common::Point(138, 58);
+ else if (_scene->_priorSceneId != -2)
+ _game._player._playerPos = Common::Point(305, 98);
+
+ _game.loadQuoteSet(0x4A, 0x4B, 0x4C, 0x35, 0x34, 0);
+ sceneEntrySound();
+}
+
+void Scene108::preActions() {
+ if (_action.isAction(VERB_SWIM_UNDER, NOUN_OVERHANG_TO_EAST))
+ _game._player._walkOffScreenSceneId = 109;
+}
+
+void Scene108::actions() {
+ if (_action._lookFlag)
+ _vm->_dialogs->show(10812);
+ else if (_action.isAction(VERB_TAKE, NOUN_DEAD_FISH) && _globals[kFishIn108]) {
+ if (_game._objects.isInInventory(OBJ_DEAD_FISH)) {
+ int randVal = _vm->getRandomNumber(74, 76);
+ _scene->_kernelMessages.reset();
+ _scene->_kernelMessages.add(Common::Point(0, 0), 0x1110, 34, 0, 120, _game.getQuote(randVal));
+ } else {
+ _scene->_sequences.remove(_globals._sequenceIndexes[4]);
+ _game._objects.addToInventory(OBJ_DEAD_FISH);
+ _globals[kFishIn108] = false;
+ _vm->_dialogs->showItem(OBJ_DEAD_FISH, 10808);
+ }
+ } else if (_action.isAction(VERB_SWIM_TOWARDS, NOUN_OPEN_AREA_TO_NORTH))
+ _scene->_nextSceneId = 107;
+ else if (_action.isAction(VERB_LOOK, NOUN_CLIFF_FACE))
+ _vm->_dialogs->show(10801);
+ else if (_action.isAction(VERB_LOOK, NOUN_OCEAN_FLOOR))
+ _vm->_dialogs->show(10802);
+ else if (_action.isAction(VERB_LOOK, NOUN_ODD_ROCK_FORMATION))
+ _vm->_dialogs->show(10803);
+ else if (_action.isAction(VERB_TAKE, NOUN_ODD_ROCK_FORMATION))
+ _vm->_dialogs->show(10804);
+ else if (_action.isAction(VERB_LOOK, NOUN_ROCKS))
+ _vm->_dialogs->show(10805);
+ else if (_action.isAction(VERB_TAKE, NOUN_ROCKS))
+ _vm->_dialogs->show(10806);
+ else if (_action.isAction(VERB_LOOK, NOUN_DEAD_FISH))
+ _vm->_dialogs->show(10807);
+ else if (_action.isAction(VERB_LOOK, NOUN_OVERHANG_TO_EAST))
+ _vm->_dialogs->show(10809);
+ else if (_action.isAction(VERB_LOOK, NOUN_OPEN_AREA_TO_NORTH))
+ _vm->_dialogs->show(10810);
+ else if (_action.isAction(VERB_LOOK, NOUN_SURFACE))
+ _vm->_dialogs->show(10811);
+ else
+ return;
+
+ _action._inProgress = false;
+}
+
+/*------------------------------------------------------------------------*/
+
+Scene109::Scene109(MADSEngine *vm) : Scene1xx(vm) {
+ _rexThrowingObject = false;
+ _hoovicDifficultFl = false;
+ _beforeEatingRex = false;
+ _eatingRex = false;
+ _hungryFl = false;
+ _eatingFirstFish = false;
+
+ _throwingObjectId = -1;
+ _hoovicTrigger = 0;
+}
+
+void Scene109::synchronize(Common::Serializer &s) {
+ Scene1xx::synchronize(s);
+
+ s.syncAsByte(_rexThrowingObject);
+ s.syncAsByte(_hoovicDifficultFl);
+ s.syncAsByte(_beforeEatingRex);
+ s.syncAsByte(_eatingRex);
+ s.syncAsByte(_hungryFl);
+ s.syncAsByte(_eatingFirstFish);
+ s.syncAsSint32LE(_throwingObjectId);
+ s.syncAsSint32LE(_hoovicTrigger);
+}
+
+void Scene109::setup() {
+ _scene->addActiveVocab(NOUN_DEAD_PURPLE_MONSTER);
+ _scene->addActiveVocab(NOUN_MONSTER_SLUDGE);
+
+ setPlayerSpritesPrefix();
+ setAAName();
+}
+
+void Scene109::enter() {
+ _globals[kFishIn105] = true;
+
+ _globals._spriteIndexes[0] = _scene->_sprites.addSprites("*RXSWRC_6");
+ _globals._spriteIndexes[1] = _scene->_sprites.addSprites(formAnimName('O', 1));
+ _globals._spriteIndexes[2] = _scene->_sprites.addSprites(formAnimName('O', 2));
+ _globals._spriteIndexes[3] = _scene->_sprites.addSprites(formAnimName('O', 0));
+ _globals._spriteIndexes[6] = _scene->_sprites.addSprites(formAnimName('H', 4));
+
+ _rexThrowingObject = false;
+ _throwingObjectId = 0;
+ _beforeEatingRex = false;
+ _eatingRex = false;
+ _hungryFl = false;
+
+ if (_scene->_priorSceneId == 110) {
+ _game._player._playerPos = Common::Point(248, 38);
+ _globals[kHoovicSated] = 2;
+ } else if (_scene->_priorSceneId != -2) {
+ _game._player._playerPos = Common::Point(20, 68);
+ _game._player._facing = FACING_EAST;
+ }
+
+ if (!_globals[kHoovicAlive]) {
+ _globals._sequenceIndexes[6] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[6], false, 6, 1, 0, 0);
+ _scene->_sequences.setDepth(_globals._sequenceIndexes[6], 4);
+ _scene->_sequences.setAnimRange(_globals._sequenceIndexes[6], -2, -2);
+
+ int idx = _scene->_dynamicHotspots.add(102, 348, -1, Common::Rect(256, 57, 267, 87));
+ _scene->_dynamicHotspots.setPosition(idx, Common::Point(241, 91), FACING_NORTHEAST);
+ idx = _scene->_dynamicHotspots.add(102, 348, -1, Common::Rect(242, 79, 265, 90));
+ _scene->_dynamicHotspots.setPosition(idx, Common::Point(241, 91), FACING_NORTHEAST);
+ idx = _scene->_dynamicHotspots.add(229, 348, -1, Common::Rect(231, 88, 253, 94));
+ _scene->_dynamicHotspots.setPosition(idx, Common::Point(241, 91), FACING_NORTHEAST);
+ }
+
+ if (!_globals[kHoovicAlive] || _globals[kHoovicSated])
+ _scene->changeVariant(1);
+
+ if (_game._objects.isInRoom(OBJ_BURGER)) {
+ _globals._sequenceIndexes[3] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[3], false, 6, 0, 0, 0);
+ _scene->_sequences.setAnimRange(_globals._sequenceIndexes[3], -2, -2);
+ int idx = _scene->_dynamicHotspots.add(53, 348, _globals._sequenceIndexes[3], Common::Rect(0, 0, 0, 0));
+ _scene->_dynamicHotspots.setPosition(idx, Common::Point(-3, 0), FACING_NORTHEAST);
+ } else if (_scene->_roomChanged)
+ _game._objects.addToInventory(OBJ_BURGER);
+
+ if (_scene->_roomChanged) {
+ _game._objects.addToInventory(OBJ_DEAD_FISH);
+ _game._objects.addToInventory(OBJ_STUFFED_FISH);
+ }
+
+ _vm->_palette->setEntry(252, 50, 50, 63);
+ _vm->_palette->setEntry(253, 30, 30, 50);
+
+ _game.loadQuoteSet(0x53, 0x52, 0x54, 0x55, 0x56, 0x57, 0x58, 0);
+ _eatingFirstFish = (!_game._visitedScenes._sceneRevisited) && (_scene->_priorSceneId < 110);
+
+ if (_eatingFirstFish) {
+ _globals._spriteIndexes[10] = _scene->_sprites.addSprites(Resources::formatName(105, 'F', 1, EXT_SS, ""));
+ _globals._spriteIndexes[9] = _scene->_sprites.addSprites(formAnimName('H', 1));
+
+ _globals._sequenceIndexes[10] = _scene->_sequences.startReverseCycle(_globals._spriteIndexes[10], true, 4, 0, 0, 0);
+ _scene->_sequences.setDepth(_globals._sequenceIndexes[10], 5);
+ _scene->_sequences.setPosition(_globals._sequenceIndexes[10], Common::Point(126, 39));
+ _scene->_sequences.setMotion(_globals._sequenceIndexes[10], 0, 200, 0);
+ _scene->_sequences.setScale(_globals._sequenceIndexes[10], 80);
+ _game._player._stepEnabled = false;
+ }
+
+ sceneEntrySound();
+}
+
+void Scene109::step() {
+ if (_beforeEatingRex) {
+ if (!_eatingRex) {
+ if (_game._player._playerPos.x > 205) {
+ _globals._sequenceIndexes[4] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[4], false, 6, 1, 0, 0);
+ _scene->_sequences.setDepth(_globals._sequenceIndexes[4], 4);
+ _scene->_sequences.addSubEntry(_globals._sequenceIndexes[4], SEQUENCE_TRIGGER_SPRITE, 6, 70);
+ _scene->_sequences.addSubEntry(_globals._sequenceIndexes[4], SEQUENCE_TRIGGER_EXPIRE, 0, 71);
+
+ _eatingRex = true;
+ _vm->_sound->command(34);
+ }
+ } else {
+ switch (_game._trigger) {
+ case 70:
+ _game._player._visible = false;
+ break;
+
+ case 71:
+ _scene->_reloadSceneFlag = true;
+ break;
+ }
+ }
+ }
+
+ if (_hungryFl && (_game._player._playerPos == Common::Point(160, 32)) && (_game._player._facing == FACING_EAST)) {
+ _game._player.walk(Common::Point(226, 24), FACING_EAST);
+ _game._player._stepEnabled = false;
+ _hungryFl = false;
+ _beforeEatingRex = true;
+ _scene->_sprites.remove(_globals._spriteIndexes[6]);
+ _globals._spriteIndexes[4] = _scene->_sprites.addSprites(formAnimName('H', 0));
+ _vm->_palette->refreshSceneColors();
+ }
+
+ if (_game._player._moving && (_scene->_rails.getNext() > 0) && _globals[kHoovicAlive] && !_globals[kHoovicSated] && !_hungryFl && !_beforeEatingRex) {
+ _game._player.cancelCommand();
+ _game._player.startWalking(Common::Point(160, 32), FACING_EAST);
+ _scene->_rails.resetNext();
+ _hungryFl = true;
+ }
+
+ if (_eatingFirstFish && (_scene->_sequences[_globals._sequenceIndexes[10]]._position.x >= 178)) {
+ _globals._sequenceIndexes[9] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[9], false, 4, 1, 0, 0);
+ _scene->_sequences.setDepth(_globals._sequenceIndexes[9], 4);
+ _scene->_sequences.addSubEntry(_globals._sequenceIndexes[9], SEQUENCE_TRIGGER_SPRITE, 29, 72);
+ _scene->_sequences.addSubEntry(_globals._sequenceIndexes[9], SEQUENCE_TRIGGER_EXPIRE, 29, 73);
+ _scene->_sequences.updateTimeout(_globals._sequenceIndexes[10], _globals._sequenceIndexes[9]);
+ _eatingFirstFish = false;
+ _game._player._stepEnabled = true;
+ _vm->_sound->command(34);
+ }
+
+ if (_game._trigger == 72)
+ _scene->_sequences.remove(_globals._sequenceIndexes[10]);
+
+ if (_game._trigger == 73) {
+ _scene->_sequences.remove(_globals._sequenceIndexes[9]);
+ _scene->_sprites.remove(_globals._spriteIndexes[9]);
+ _scene->_sprites.remove(_globals._spriteIndexes[10]);
+
+ _scene->_spriteSlots.clear();
+ _scene->_spriteSlots.fullRefresh();
+
+ int randVal = _vm->getRandomNumber(85, 88);
+ int idx = _scene->_kernelMessages.add(Common::Point(0, 0), 0x1110, 34, 0, 120, _game.getQuote(randVal));
+ _scene->_kernelMessages.setQuoted(idx, 4, true);
+ _scene->_kernelMessages._entries[idx]._frameTimer = _scene->_frameStartTime + 4;
+ }
+}
+
+void Scene109::preActions() {
+ if (_action.isAction(VERB_SWIM_UNDER, NOUN_OVERHANG_TO_WEST))
+ _game._player._walkOffScreenSceneId = 108;
+
+ if ((_action.isAction(VERB_THROW) || _action.isAction(VERB_GIVE) || _action.isAction(VERB_PUT))
+ && (_action.isObject(NOUN_SMALL_HOLE) || _action.isObject(NOUN_TUNNEL))
+ && (_action.isObject(NOUN_DEAD_FISH) || _action.isObject(NOUN_STUFFED_FISH) || _action.isObject(NOUN_BURGER))) {
+ int idx = _game._objects.getIdFromDesc(_action._activeAction._objectNameId);
+ if ((idx >= 0) && _game._objects.isInInventory(idx)) {
+ _game._player._prepareWalkPos = Common::Point(106, 38);
+ _game._player._prepareWalkFacing = FACING_EAST;
+ _game._player._needToWalk = true;
+ _game._player._readyToWalk = true;
+ }
+ }
+
+ if ((_action.isAction(VERB_SWIM_INTO, NOUN_TUNNEL) || _action.isAction(VERB_SWIM_TO, NOUN_SMALL_HOLE))
+ && (!_globals[kHoovicAlive] || _globals[kHoovicSated]) && (_action.isObject(NOUN_TUNNEL)))
+ _game._player._walkOffScreenSceneId = 110;
+
+ _hungryFl = false;
+}
+
+void Scene109::actions() {
+ if (_action._lookFlag) {
+ _vm->_dialogs->show(10912);
+ _action._inProgress = false;
+ return;
+ }
+
+ if ((_action.isAction(VERB_THROW) || _action.isAction(VERB_GIVE)) && (_action.isTarget(NOUN_SMALL_HOLE) || _action.isTarget(NOUN_TUNNEL))) {
+ if (_action.isObject(NOUN_DEAD_FISH) || _action.isObject(NOUN_STUFFED_FISH) || _action.isObject(NOUN_BURGER)) {
+ _throwingObjectId = _game._objects.getIdFromDesc(_action._activeAction._objectNameId);
+ if (_throwingObjectId >= 0) {
+ if ((_game._objects.isInInventory(_throwingObjectId) && _globals[kHoovicAlive]) || _rexThrowingObject) {
+ switch (_game._trigger) {
+ case 0:
+ _rexThrowingObject = true;
+ _hoovicDifficultFl = false;
+ _game._objects.setRoom(_throwingObjectId, NOWHERE);
+ _globals._sequenceIndexes[0] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[0], false, 4, 1, 0, 0);
+ _scene->_sequences.setMsgLayout(_globals._sequenceIndexes[0]);
+ _scene->_sequences.addSubEntry(_globals._sequenceIndexes[0], SEQUENCE_TRIGGER_EXPIRE, 0, 1);
+ _game._player._visible = false;
+ _game._player._stepEnabled = false;
+
+ switch (_throwingObjectId) {
+ case OBJ_DEAD_FISH:
+ case OBJ_STUFFED_FISH:
+ _globals._spriteIndexes[8] = _scene->_sprites.addSprites(formAnimName('H', 1));
+ break;
+
+ case OBJ_BURGER:
+ _hoovicDifficultFl = (_game._difficulty == DIFFICULTY_EASY);
+ _globals._spriteIndexes[8] = _scene->_sprites.addSprites(formAnimName('H', (_hoovicDifficultFl ? 3 : 1)));
+ break;
+ }
+
+ _vm->_palette->refreshSceneColors();
+ break;
+
+ case 1:
+ _game._player._visible = true;
+ _hoovicTrigger = 4;
+ switch (_throwingObjectId) {
+ case OBJ_BURGER:
+ _globals._sequenceIndexes[3] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[3], false, (_hoovicDifficultFl ? 4 : 6), 1, 0, 0);
+ _scene->_sequences.addSubEntry(_globals._sequenceIndexes[3], SEQUENCE_TRIGGER_SPRITE, 2, 2);
+ if (_hoovicDifficultFl) {
+ _scene->_sequences.setAnimRange(_globals._sequenceIndexes[3], 1, 30);
+ _scene->_sequences.addSubEntry(_globals._sequenceIndexes[3], SEQUENCE_TRIGGER_EXPIRE, 0, 5);
+ } else {
+ _scene->_sequences.setAnimRange(_globals._sequenceIndexes[3], 1, 4);
+ _scene->_sequences.addSubEntry(_globals._sequenceIndexes[3], SEQUENCE_TRIGGER_EXPIRE, 0, 8);
+ _hoovicTrigger = 3;
+ }
+ break;
+ case OBJ_DEAD_FISH:
+ _globals._sequenceIndexes[1] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[1], false, 4, 1, 0, 0);
+ _scene->_sequences.addSubEntry(_globals._sequenceIndexes[1], SEQUENCE_TRIGGER_SPRITE, 2, 2);
+ break;
+ case OBJ_STUFFED_FISH:
+ _globals._sequenceIndexes[2] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[2], false, 4, 1, 0, 0);
+ _scene->_sequences.addSubEntry(_globals._sequenceIndexes[2], SEQUENCE_TRIGGER_SPRITE, 2, 2);
+ _hoovicTrigger = 3;
+ break;
+ }
+ break;
+
+ case 2:
+ if (_hoovicDifficultFl)
+ _globals._sequenceIndexes[8] = _scene->_sequences.startReverseCycle(_globals._spriteIndexes[8], false, 4, 2, 0, 0);
+ else
+ _globals._sequenceIndexes[8] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[8], false, 4, 1, 0, 0);
+
+ _scene->_sequences.setDepth(_globals._sequenceIndexes[8], 4);
+ _scene->_sequences.addSubEntry(_globals._sequenceIndexes[8], SEQUENCE_TRIGGER_EXPIRE, 0, _hoovicTrigger);
+ _vm->_sound->command(34);
+ break;
+
+ case 3:
+ _scene->loadAnimation(Resources::formatName(109, 'H', 2, EXT_AA, ""), 4);
+ _vm->_sound->command(35);
+ _globals[kHoovicAlive] = false;
+ break;
+
+ case 4:
+ if (!_globals[kHoovicAlive]) {
+ _globals._sequenceIndexes[6] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[6], false, 6, 1, 0, 0);
+ _scene->_sequences.setDepth(_globals._sequenceIndexes[6], 4);
+ _scene->_sequences.setAnimRange(_globals._sequenceIndexes[6], -2, -2);
+ int idx = _scene->_dynamicHotspots.add(102, 348, -1, Common::Rect(256, 57, 256 + 12, 57 + 31));
+ _scene->_dynamicHotspots.setPosition(idx, Common::Point(241, 91), FACING_NORTHEAST);
+ idx = _scene->_dynamicHotspots.add(102, 348, -1, Common::Rect(242, 79, 242 + 24, 79 + 12));
+ _scene->_dynamicHotspots.setPosition(idx, Common::Point(241, 91), FACING_NORTHEAST);
+ idx = _scene->_dynamicHotspots.add(229, 348, -1, Common::Rect(231, 88, 231 + 23, 88 + 7));
+ _scene->_dynamicHotspots.setPosition(idx, Common::Point(241, 91), FACING_NORTHEAST);
+ _scene->changeVariant(1);
+ } else {
+ if (_throwingObjectId == OBJ_DEAD_FISH) {
+ ++_globals[kHoovicFishEaten];
+ int threshold;
+ switch (_game._difficulty) {
+ case DIFFICULTY_HARD:
+ threshold = 1;
+ break;
+ case DIFFICULTY_MEDIUM:
+ threshold = 3;
+ break;
+ default:
+ threshold = 50;
+ break;
+ }
+
+ if (_globals[kHoovicFishEaten] >= threshold) {
+ int randVal = _vm->getRandomNumber(83, 84);
+ _scene->_kernelMessages.add(Common::Point(230, 24), 0xFDFC, 0, 0, 120, _game.getQuote(randVal));
+ _globals[kHoovicFishEaten] = 0;
+ _globals[kHoovicSated] = 1;
+ _scene->changeVariant(1);
+ }
+ }
+ }
+ _scene->freeAnimation();
+ _scene->_sequences.remove(_globals._sequenceIndexes[8]);
+ _scene->_sprites.remove(_globals._spriteIndexes[8]);
+ _scene->_spriteSlots.clear();
+ _scene->_spriteSlots.fullRefresh();
+ _scene->_sequences.scan();
+ if (_game._player._visible) {
+ _game._player._forceRefresh = true;
+ _game._player.update();
+ }
+
+ _game._player._stepEnabled = true;
+ _rexThrowingObject = false;
+ break;
+
+ case 5: {
+ _game._objects.setRoom(OBJ_BURGER, _scene->_currentSceneId);
+ _globals._sequenceIndexes[3] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[3], false, 6, 0, 0, 0);
+ _scene->_sequences.setAnimRange(_globals._sequenceIndexes[3], 30, 30);
+ int idx = _scene->_dynamicHotspots.add(53, 348, _globals._sequenceIndexes[3], Common::Rect(0, 0, 0, 0));
+ _scene->_dynamicHotspots.setPosition(idx, Common::Point(-3, 0), FACING_NORTHEAST);
+ _scene->_sequences.addTimer(65, 6);
+ }
+ break;
+
+ case 6: {
+ _scene->_sequences.remove(_globals._sequenceIndexes[3]);
+ _globals._sequenceIndexes[3] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[3], false, 6, 1, 0, 0);
+ _scene->_sequences.setAnimRange(_globals._sequenceIndexes[3], 31, 46);
+ int idx = _scene->_dynamicHotspots.add(53, 348, _globals._sequenceIndexes[3], Common::Rect(0, 0, 0, 0));
+ _scene->_dynamicHotspots.setPosition(idx, Common::Point(-3, 0), FACING_NORTHEAST);
+ _scene->_sequences.addSubEntry(_globals._sequenceIndexes[3], SEQUENCE_TRIGGER_EXPIRE, 0, 7);
+ }
+ break;
+
+ case 7: {
+ _scene->_sequences.remove(_globals._sequenceIndexes[3]);
+ _globals._sequenceIndexes[3] = _scene->_sequences.startCycle(_globals._spriteIndexes[3], false, -2);
+ int idx = _scene->_dynamicHotspots.add(53, 348, _globals._sequenceIndexes[3], Common::Rect(0, 0, 0, 0));
+ _scene->_dynamicHotspots.setPosition(idx, Common::Point(-3, 0), FACING_NORTHEAST);
+ _vm->_dialogs->show(10915);
+ }
+ break;
+
+ case 8:
+ _globals._sequenceIndexes[3] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[3], false, 7, 1, 0, 0);
+ _scene->_sequences.setAnimRange(_globals._sequenceIndexes[3], 5, 16);
+ break;
+ }
+ _action._inProgress = false;
+ return;
+ } else if (_game._objects.isInInventory(_throwingObjectId)) {
+ // Nothing.
+ }
+ }
+ }
+ }
+
+ if (_action.isAction(VERB_TAKE, NOUN_BURGER) && _game._objects.isInRoom(OBJ_BURGER)) {
+ _scene->_sequences.remove(_globals._sequenceIndexes[3]);
+ _game._objects.addToInventory(OBJ_BURGER);
+ } else if (_action.isAction(VERB_LOOK, NOUN_OCEAN_FLOOR))
+ _vm->_dialogs->show(10901);
+ else if (_action.isAction(VERB_LOOK, NOUN_CORAL))
+ _vm->_dialogs->show(10902);
+ else if ((_action.isAction(VERB_TAKE) || _action.isAction(VERB_PULL)) && _action.isObject(NOUN_CORAL))
+ _vm->_dialogs->show(10903);
+ else if (_action.isAction(VERB_LOOK, NOUN_ROCKS))
+ _vm->_dialogs->show(10904);
+ else if (_action.isAction(VERB_TAKE, NOUN_ROCKS))
+ _vm->_dialogs->show(10905);
+ else if (_action.isAction(VERB_LOOK, NOUN_CAVE_WALL))
+ _vm->_dialogs->show(10906);
+ else if (_action.isAction(VERB_LOOK, NOUN_TUNNEL)) {
+ if (_globals[kHoovicAlive])
+ _vm->_dialogs->show(10907);
+ else
+ _vm->_dialogs->show(10913);
+ } else if (_action.isAction(VERB_LOOK, NOUN_SMALL_HOLE))
+ _vm->_dialogs->show(10908);
+ else if (_action.isAction(VERB_LOOK, NOUN_OVERHANG_TO_WEST))
+ _vm->_dialogs->show(10911);
+ else if (_action.isAction(VERB_PUT, NOUN_SMALL_HOLE))
+ _vm->_dialogs->show(10910);
+ else if (_action.isAction(VERB_LOOK, NOUN_DEAD_PURPLE_MONSTER))
+ _vm->_dialogs->show(10914);
+ else
+ return;
+
+ _action._inProgress = false;
+}
+
+/*------------------------------------------------------------------------*/
+
+Scene110::Scene110(MADSEngine *vm) : Scene1xx(vm) {
+ _crabsFl = false;
+}
+
+void Scene110::synchronize(Common::Serializer &s) {
+ Scene1xx::synchronize(s);
+
+ s.syncAsByte(_crabsFl);
+}
+
+void Scene110::setup() {
+ setPlayerSpritesPrefix();
+ setAAName();
+
+ _scene->addActiveVocab(NOUN_CRAB);
+}
+
+void Scene110::enter() {
+ _globals._spriteIndexes[0] = _scene->_sprites.addSprites(formAnimName('X', 0));
+ _globals._spriteIndexes[1] = _scene->_sprites.addSprites(formAnimName('X', 1));
+ _globals._spriteIndexes[2] = _scene->_sprites.addSprites(formAnimName('X', 2));
+ _globals._spriteIndexes[3] = _scene->_sprites.addSprites(formAnimName('X', 3));
+
+ _crabsFl = false;
+
+ if (_scene->_priorSceneId == 109) {
+ _game._player._playerPos = Common::Point(59, 71);
+
+ _globals._sequenceIndexes[0] = _scene->_sequences.startCycle(_globals._spriteIndexes[0], false, 1);
+ _globals._sequenceIndexes[1] = _scene->_sequences.startCycle(_globals._spriteIndexes[1], false, 1);
+ _globals._sequenceIndexes[2] = _scene->_sequences.startCycle(_globals._spriteIndexes[2], false, 1);
+ _globals._sequenceIndexes[3] = _scene->_sequences.startCycle(_globals._spriteIndexes[3], false, 1);
+
+ _crabsFl = true;
+
+ int idx = _scene->_dynamicHotspots.add(91, 348, _globals._sequenceIndexes[0], Common::Rect(0, 0, 0, 0));
+ _scene->_dynamicHotspots.setPosition(idx, Common::Point(-1, 0), FACING_NONE);
+ idx = _scene->_dynamicHotspots.add(91, 348, _globals._sequenceIndexes[1], Common::Rect(0, 0, 0, 0));
+ _scene->_dynamicHotspots.setPosition(idx, Common::Point(-1, 0), FACING_NONE);
+ idx = _scene->_dynamicHotspots.add(91, 348, _globals._sequenceIndexes[2], Common::Rect(0, 0, 0, 0));
+ _scene->_dynamicHotspots.setPosition(idx, Common::Point(-1, 0), FACING_NONE);
+ idx = _scene->_dynamicHotspots.add(91, 348, _globals._sequenceIndexes[3], Common::Rect(0, 0, 0, 0));
+ _scene->_dynamicHotspots.setPosition(idx, Common::Point(-1, 0), FACING_NONE);
+ } else if (_scene->_priorSceneId != -2) {
+ _game._player._playerPos = Common::Point(194, 23);
+ _game._player._facing = FACING_SOUTH;
+ _game._player._visible = false;
+ _game._player._stepEnabled = false;
+ _scene->loadAnimation(Resources::formatName(110, 'T', 1,EXT_AA, ""), 70);
+ }
+
+ sceneEntrySound();
+ _game.loadQuoteSet(0x59, 0);
+
+ if (!_game._visitedScenes._sceneRevisited && (_scene->_priorSceneId == 109))
+ _scene->_kernelMessages.add(Common::Point(0, 0), 0x1110, 34, 0, 120, _game.getQuote(109));
+}
+
+void Scene110::step() {
+ if (_game._trigger == 70) {
+ _game._player._visible = true;
+ _game._player._stepEnabled = true;
+ }
+}
+
+void Scene110::preActions() {
+ if (_action.isAction(VERB_SWIM_THROUGH, NOUN_CAVE_ENTRANCE))
+ _game._player._walkOffScreenSceneId = 109;
+
+ if (_crabsFl) {
+ _crabsFl = false;
+
+ _scene->_sequences.remove(_globals._sequenceIndexes[0]);
+ _scene->_sequences.remove(_globals._sequenceIndexes[1]);
+ _scene->_sequences.remove(_globals._sequenceIndexes[2]);
+ _scene->_sequences.remove(_globals._sequenceIndexes[3]);
+
+ _globals._sequenceIndexes[0] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[0], false, 16, 1, 0, 0);
+ _globals._sequenceIndexes[1] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[1], false, 16, 1, 0, 0);
+ _globals._sequenceIndexes[2] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[2], false, 16, 1, 0, 0);
+ _globals._sequenceIndexes[3] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[3], false, 16, 1, 0, 0);
+
+ int idx = _scene->_dynamicHotspots.add(91, 348, _globals._sequenceIndexes[0], Common::Rect(0, 0, 0, 0));
+ _scene->_dynamicHotspots.setPosition(idx, Common::Point(-1, 0), FACING_NONE);
+ idx = _scene->_dynamicHotspots.add(91, 348, _globals._sequenceIndexes[1], Common::Rect(0, 0, 0, 0));
+ _scene->_dynamicHotspots.setPosition(idx, Common::Point(-1, 0), FACING_NONE);
+ idx = _scene->_dynamicHotspots.add(91, 348, _globals._sequenceIndexes[2], Common::Rect(0, 0, 0, 0));
+ _scene->_dynamicHotspots.setPosition(idx, Common::Point(-1, 0), FACING_NONE);
+ idx = _scene->_dynamicHotspots.add(91, 348, _globals._sequenceIndexes[3], Common::Rect(0, 0, 0, 0));
+ _scene->_dynamicHotspots.setPosition(idx, Common::Point(-1, 0), FACING_NONE);
+ }
+}
+
+void Scene110::actions() {
+ if (_action.isAction(VERB_SWIM_THROUGH, NOUN_TUNNEL)) {
+ switch (_game._trigger) {
+ case 0:
+ _scene->loadAnimation(Resources::formatName(110, 'T', 0, EXT_AA, ""), 1);
+ _scene->_activeAnimation->setNextFrameTimer(_game._player._ticksAmount + _game._player._priorTimer);
+ _game._player._stepEnabled = false;
+ _game._player._visible = false;
+ break;
+ case 1:
+ _game._player._visible = true;
+ _game._player._stepEnabled = true;
+ _scene->_nextSceneId = 111;
+ break;
+ }
+ } else if ((_action._lookFlag) || _action.isAction(VERB_LOOK, NOUN_CAVE))
+ _vm->_dialogs->show(11001);
+ else if (_action.isAction(VERB_LOOK, NOUN_CAVE_CEILING) || _action.isAction(VERB_LOOK_AT, NOUN_CAVE_CEILING))
+ _vm->_dialogs->show(11002);
+ else if (_action.isAction(VERB_LOOK, NOUN_ROCKS))
+ _vm->_dialogs->show(11003);
+ else if (_action.isAction(VERB_TAKE, NOUN_ROCKS))
+ _vm->_dialogs->show(11004);
+ else if (_action.isAction(VERB_LOOK, NOUN_TUNNEL))
+ _vm->_dialogs->show(11005);
+ else if (_action.isAction(VERB_LOOK, NOUN_CAVE_ENTRANCE))
+ _vm->_dialogs->show(11006);
+ else if (_action.isAction(VERB_LOOK, NOUN_FUNGOIDS))
+ _vm->_dialogs->show(11007);
+ else if (_action.isAction(VERB_TAKE, NOUN_FUNGOIDS))
+ _vm->_dialogs->show(11008);
+ else
+ return;
+
+ _action._inProgress = false;
+}
+
+/*------------------------------------------------------------------------*/
+
+Scene111::Scene111(MADSEngine *vm) : Scene1xx(vm) {
+ _stampedFl = false;
+ _launch1Fl = false;
+ _launched2Fl = false;
+ _rexDivingFl = false;
+}
+
+void Scene111::synchronize(Common::Serializer &s) {
+ Scene1xx::synchronize(s);
+
+ s.syncAsByte(_stampedFl);
+ s.syncAsByte(_launch1Fl);
+ s.syncAsByte(_launched2Fl);
+ s.syncAsByte(_rexDivingFl);
+}
+
+void Scene111::setup() {
+ _scene->addActiveVocab(NOUN_BATS);
+
+ setPlayerSpritesPrefix();
+ setAAName();
+}
+
+void Scene111::enter() {
+ _globals._spriteIndexes[0] = _scene->_sprites.addSprites(formAnimName('X', 0));
+ _globals._spriteIndexes[1] = _scene->_sprites.addSprites(formAnimName('X', 1));
+ _globals._spriteIndexes[2] = _scene->_sprites.addSprites(formAnimName('X', 2));
+
+ _globals._spriteIndexes[3] = _scene->_sprites.addSprites(formAnimName('B', 0));
+ _globals._spriteIndexes[4] = _scene->_sprites.addSprites(formAnimName('B', 1));
+ _globals._spriteIndexes[5] = _scene->_sprites.addSprites(formAnimName('B', 2));
+
+ _globals._sequenceIndexes[0] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[0], false, 8, 0, 0, 0);
+ _scene->_sequences.addSubEntry(_globals._sequenceIndexes[0], SEQUENCE_TRIGGER_SPRITE, 9, 73);
+ _scene->_sequences.addSubEntry(_globals._sequenceIndexes[0], SEQUENCE_TRIGGER_SPRITE, 13, 73);
+
+ _globals._sequenceIndexes[1] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[1], false, 5, 0, 0, 0);
+ _scene->_sequences.addSubEntry(_globals._sequenceIndexes[1], SEQUENCE_TRIGGER_SPRITE, 71, 71);
+
+ _globals._sequenceIndexes[3] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[3], false, 12, 0, 0, 0);
+ _globals._sequenceIndexes[4] = _scene->_sequences.startCycle(_globals._spriteIndexes[4], false, 1);
+ _globals._sequenceIndexes[5] = _scene->_sequences.startCycle(_globals._spriteIndexes[5], false, 1);
+
+ int idx = _scene->_dynamicHotspots.add(NOUN_BATS, VERB_LOOK_AT, _globals._sequenceIndexes[3], Common::Rect(0, 0, 0, 0));
+ _scene->_dynamicHotspots.setPosition(idx, Common::Point(-2, 0), FACING_NONE);
+ idx = _scene->_dynamicHotspots.add(NOUN_BATS, VERB_LOOK_AT, _globals._sequenceIndexes[4], Common::Rect(0, 0, 0, 0));
+ _scene->_dynamicHotspots.setPosition(idx, Common::Point(-2, 0), FACING_NONE);
+ idx = _scene->_dynamicHotspots.add(NOUN_BATS, VERB_LOOK_AT, _globals._sequenceIndexes[5], Common::Rect(0, 0, 0, 0));
+ _scene->_dynamicHotspots.setPosition(idx, Common::Point(-2, 0), FACING_NONE);
+
+ _launch1Fl = false;
+ _launched2Fl = false;
+ _stampedFl = false;
+
+ if ((_scene->_priorSceneId < 201) && (_scene->_priorSceneId != -2)) {
+ _game._player._stepEnabled = false;
+ _game._player._visible = false;
+ _scene->loadAnimation(Resources::formatName(111, 'A', 0, EXT_AA, ""), 70);
+ _game._player._playerPos = Common::Point(234, 116);
+ _game._player._facing = FACING_EAST;
+
+ _launch1Fl = true;
+ _launched2Fl = true;
+
+ _vm->_sound->command(36);
+ } else if (_scene->_priorSceneId != -2) {
+ _game._player._playerPos = Common::Point(300, 130);
+ _game._player._facing = FACING_WEST;
+ }
+
+ _rexDivingFl = false;
+
+ sceneEntrySound();
+}
+
+void Scene111::step() {
+ if (_game._trigger == 70) {
+ _game._player._stepEnabled = true;
+ _game._player._visible = true;
+ _launch1Fl = false;
+ _launched2Fl = false;
+ }
+
+ if ((_game._trigger == 71) && !_stampedFl) {
+ _stampedFl = true;
+ _globals._sequenceIndexes[2] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[2], false, 18, 1, 0, 0);
+ _scene->_sequences.addSubEntry(_globals._sequenceIndexes[2], SEQUENCE_TRIGGER_EXPIRE, 0, 72);
+ }
+
+ if (_game._trigger == 72) {
+ _scene->_sequences.remove(_globals._sequenceIndexes[2]);
+ _globals._sequenceIndexes[2] = _scene->_sequences.startCycle(_globals._spriteIndexes[2], false, 20);
+ }
+
+ if (!_launch1Fl && (_vm->getRandomNumber(1, 5000) == 1)) {
+ _scene->_sequences.remove(_globals._sequenceIndexes[4]);
+ _globals._sequenceIndexes[4] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[4], false, 5, 1, 0, 0);
+ _launch1Fl = true;
+ int idx = _scene->_dynamicHotspots.add(NOUN_BATS, VERB_LOOK_AT, _globals._sequenceIndexes[4], Common::Rect(0, 0, 0, 0));
+ _scene->_dynamicHotspots.setPosition(idx, Common::Point(-2, 0), FACING_NONE);
+ }
+
+ if (!_launched2Fl && (_vm->getRandomNumber(1, 30000) == 1)) {
+ _scene->_sequences.remove(_globals._sequenceIndexes[5]);
+ _globals._sequenceIndexes[5] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[5], false, 5, 1, 0, 0);
+ int idx = _scene->_dynamicHotspots.add(NOUN_BATS, VERB_LOOK_AT, _globals._sequenceIndexes[5], Common::Rect(0, 0, 0, 0));
+ _scene->_dynamicHotspots.setPosition(idx, Common::Point(-2, 0), FACING_NONE);
+ _launched2Fl = true;
+ }
+
+ if (_game._trigger == 73)
+ _vm->_sound->command(37);
+
+ if (_rexDivingFl && (_scene->_activeAnimation->getCurrentFrame() >= 9)) {
+ _vm->_sound->command(36);
+ _rexDivingFl = false;
+ }
+}
+
+void Scene111::preActions() {
+ if (_action.isAction(VERB_WALK_THROUGH, NOUN_CAVE_ENTRANCE))
+ _game._player._walkOffScreenSceneId = 212;
+}
+
+void Scene111::actions() {
+ if (_action.isAction(VERB_DIVE_INTO, NOUN_POOL) && _game._objects.isInInventory(OBJ_REBREATHER)) {
+ switch (_game._trigger) {
+ case 0:
+ _scene->loadAnimation(Resources::formatName(111, 'A', 1, EXT_AA, ""), 1);
+ _rexDivingFl = true;
+ _game._player._stepEnabled = false;
+ _game._player._visible = false;
+ break;
+
+ case 1:
+ _scene->_nextSceneId = 110;
+ break;
+ }
+ } else if (_action.isAction(VERB_LOOK, NOUN_CAVE_FLOOR))
+ _vm->_dialogs->show(11101);
+ else if (_action.isAction(VERB_LOOK, NOUN_POOL))
+ _vm->_dialogs->show(11102);
+ else if (_action.isAction(VERB_LOOK, NOUN_CAVE_ENTRANCE))
+ _vm->_dialogs->show(11103);
+ else if (_action.isAction(VERB_LOOK, NOUN_STALAGMITES))
+ _vm->_dialogs->show(11104);
+ else if (_action.isAction(VERB_LOOK, NOUN_LARGE_STALAGMITE))
+ _vm->_dialogs->show(11105);
+ else if ((_action.isAction(VERB_PULL) || _action.isAction(VERB_TAKE)) && (_action.isObject(NOUN_STALAGMITES) || _action.isObject(NOUN_LARGE_STALAGMITE)))
+ _vm->_dialogs->show(11106);
+ else
+ return;
+
+ _action._inProgress = false;
+}
+
+/*------------------------------------------------------------------------*/
+
+void Scene112::setup() {
+ setPlayerSpritesPrefix();
+ setAAName();
+}
+
+void Scene112::enter() {
+ sceneEntrySound();
+
+ _globals._spriteIndexes[0] = _scene->_sprites.addSprites(formAnimName('X', 0));
+ _globals._spriteIndexes[1] = _scene->_sprites.addSprites(formAnimName('X', 1));
+ _globals._spriteIndexes[2] = _scene->_sprites.addSprites(formAnimName('X', 2));
+ _globals._spriteIndexes[3] = _scene->_sprites.addSprites(formAnimName('X', 5));
+
+ _globals._sequenceIndexes[0] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[0], false, 10, 0, 17, 20);
+ _globals._sequenceIndexes[1] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[1], false, 4, 0, 0, 0);
+ _globals._sequenceIndexes[2] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[2], false, 6, 0, 3, 0);
+
+ _game._player._stepEnabled = false;
+ _game._player._visible = false;
+
+ _scene->_userInterface.emptyConversationList();
+ _scene->_userInterface.setup(kInputConversation);
+
+ _scene->loadAnimation(Resources::formatName(112, 'X', -1, EXT_AA, ""), 70);
+}
+
+void Scene112::step() {
+ if ((_scene->_activeAnimation != nullptr) && (_game._storyMode == STORYMODE_NICE)) {
+ if (_scene->_activeAnimation->getCurrentFrame() >= 54) {
+ _scene->freeAnimation();
+ _game._trigger = 70;
+ }
+ }
+
+ if (_game._trigger == 70) {
+ _globals._sequenceIndexes[3] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[3], false, 7, 3, 0, 11);
+ _scene->_sequences.setDepth(_globals._sequenceIndexes[3], 1);
+ _scene->_sequences.addSubEntry(_globals._sequenceIndexes[3], SEQUENCE_TRIGGER_EXPIRE, 0, 71);
+ }
+
+ if (_game._trigger == 71) {
+ _scene->_nextSceneId = 101;
+ _game._player._stepEnabled = true;
+ _game._player._visible = true;
+ }
+}
+
+/*------------------------------------------------------------------------*/
+
+} // End of namespace Nebular
+} // End of namespace MADS
diff --git a/engines/mads/nebular/nebular_scenes1.h b/engines/mads/nebular/nebular_scenes1.h
new file mode 100644
index 0000000000..1afa7fccc1
--- /dev/null
+++ b/engines/mads/nebular/nebular_scenes1.h
@@ -0,0 +1,264 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+
+ * You should have received a copy of the GNU General Public 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 MADS_NEBULAR_SCENES1_H
+#define MADS_NEBULAR_SCENES1_H
+
+#include "common/scummsys.h"
+#include "common/serializer.h"
+#include "mads/game.h"
+#include "mads/scene.h"
+#include "mads/nebular/nebular_scenes.h"
+
+namespace MADS {
+
+namespace Nebular {
+
+class Scene1xx : public NebularScene {
+protected:
+ /**
+ * Plays an appropriate sound when entering a scene
+ */
+ void sceneEntrySound();
+
+ /**
+ *Sets the AA file to use for the scene
+ */
+ void setAAName();
+
+ /**
+ * Updates the prefix used for getting player sprites for the scene
+ */
+ void setPlayerSpritesPrefix();
+public:
+ Scene1xx(MADSEngine *vm) : NebularScene(vm) {}
+};
+
+class Scene101 : public Scene1xx {
+private:
+ bool _sittingFl;
+ bool _panelOpened;
+
+ int _messageNum;
+ int _posY;
+ int _shieldSpriteIdx;
+ int _chairHotspotId;
+ int _oldSpecial;
+
+ void sayDang();
+
+public:
+ Scene101(MADSEngine *vm);
+ virtual void synchronize(Common::Serializer &s);
+
+ virtual void setup();
+ virtual void enter();
+ virtual void step();
+ virtual void preActions();
+ virtual void actions();
+};
+
+class Scene102 : public Scene1xx {
+private:
+ bool _fridgeOpenedFl;
+ bool _fridgeOpenedDescr;
+ bool _fridgeFirstOpenFl;
+ bool _chairDescrFl;
+ bool _drawerDescrFl;
+ bool _activeMsgFl;
+
+ int _fridgeCommentCount;
+
+ void addRandomMessage();
+
+public:
+ Scene102(MADSEngine *vm);
+ virtual void synchronize(Common::Serializer &s);
+
+ virtual void setup();
+ virtual void enter();
+ virtual void step();
+ virtual void preActions();
+ virtual void actions();
+ virtual void postActions();
+};
+
+class Scene103 : public Scene1xx {
+private:
+ uint32 _updateClock;
+
+public:
+ Scene103(MADSEngine *vm);
+ virtual void synchronize(Common::Serializer &s);
+
+ virtual void setup();
+ virtual void enter();
+ virtual void step();
+ virtual void actions();
+ virtual void postActions();
+};
+
+class Scene104 : public Scene1xx {
+private:
+ bool _kargShootingFl;
+ bool _loseFl;
+
+public:
+ Scene104(MADSEngine *vm);
+ virtual void synchronize(Common::Serializer &s);
+
+ virtual void setup();
+ virtual void enter();
+ virtual void step();
+ virtual void preActions();
+ virtual void actions();
+};
+
+class Scene105 : public Scene1xx {
+private:
+ bool _explosionFl;
+
+public:
+ Scene105(MADSEngine *vm);
+ virtual void synchronize(Common::Serializer &s);
+
+ virtual void setup();
+ virtual void enter();
+ virtual void step();
+ virtual void preActions();
+ virtual void actions();
+};
+
+class Scene106 : public Scene1xx {
+private:
+ bool _backToShipFl;
+ bool _shadowFl;
+ bool _firstEmergingFl;
+
+ int _positionY;
+
+public:
+ Scene106(MADSEngine *vm);
+ virtual void synchronize(Common::Serializer &s);
+
+ virtual void setup();
+ virtual void enter();
+ virtual void step();
+ virtual void preActions();
+ virtual void actions();
+};
+
+class Scene107 : public Scene1xx {
+private:
+ bool _shootingFl;
+
+public:
+ Scene107(MADSEngine *vm);
+ virtual void synchronize(Common::Serializer &s);
+
+ virtual void setup();
+ virtual void enter();
+ virtual void step();
+ virtual void preActions();
+ virtual void actions();
+};
+
+class Scene108 : public Scene1xx {
+public:
+ Scene108(MADSEngine *vm) : Scene1xx(vm) {}
+
+ virtual void setup();
+ virtual void enter();
+ virtual void preActions();
+ virtual void actions();
+};
+
+class Scene109 : public Scene1xx {
+private:
+ bool _rexThrowingObject;
+ bool _hoovicDifficultFl;
+ bool _beforeEatingRex;
+ bool _eatingRex;
+ bool _hungryFl;
+ bool _eatingFirstFish;
+
+ int _throwingObjectId;
+ int _hoovicTrigger;
+
+public:
+ Scene109(MADSEngine *vm);
+ virtual void synchronize(Common::Serializer &s);
+
+ virtual void setup();
+ virtual void enter();
+ virtual void step();
+ virtual void preActions();
+ virtual void actions();
+};
+
+class Scene110 : public Scene1xx {
+private:
+ bool _crabsFl;
+
+public:
+ Scene110(MADSEngine *vm);
+ virtual void synchronize(Common::Serializer &s);
+
+ virtual void setup();
+ virtual void enter();
+ virtual void step();
+ virtual void preActions();
+ virtual void actions();
+};
+
+class Scene111 : public Scene1xx {
+private:
+ bool _stampedFl;
+ bool _launch1Fl;
+ bool _launched2Fl;
+ bool _rexDivingFl;
+
+public:
+ Scene111(MADSEngine *vm);
+ virtual void synchronize(Common::Serializer &s);
+
+ virtual void setup();
+ virtual void enter();
+ virtual void step();
+ virtual void preActions();
+ virtual void actions();
+};
+
+class Scene112 : public Scene1xx {
+public:
+ Scene112(MADSEngine *vm) : Scene1xx(vm) {}
+
+ virtual void setup();
+ virtual void enter();
+ virtual void step();
+ virtual void actions() {};
+};
+
+} // End of namespace Nebular
+} // End of namespace MADS
+
+#endif /* MADS_NEBULAR_SCENES1_H */
diff --git a/engines/mads/nebular/nebular_scenes2.cpp b/engines/mads/nebular/nebular_scenes2.cpp
new file mode 100644
index 0000000000..94e30aa4f2
--- /dev/null
+++ b/engines/mads/nebular/nebular_scenes2.cpp
@@ -0,0 +1,5380 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+
+ * You should have received a copy of the GNU General Public 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 "mads/mads.h"
+#include "mads/scene.h"
+#include "mads/nebular/nebular_scenes.h"
+#include "mads/nebular/nebular_scenes2.h"
+
+namespace MADS {
+
+namespace Nebular {
+
+void Scene2xx::setAAName() {
+ int idx = (_scene->_nextSceneId == 216) ? 4 : 2;
+ _game._aaName = Resources::formatAAName(idx);
+}
+
+void Scene2xx::setPlayerSpritesPrefix() {
+ _vm->_sound->command(5);
+ Common::String oldName = _game._player._spritesPrefix;
+
+ switch(_scene->_nextSceneId) {
+ case 213:
+ case 216:
+ _game._player._spritesPrefix = "";
+ break;
+ default:
+ if (_globals[kSexOfRex] != SEX_MALE) {
+ _game._player._spritesPrefix = "ROX";
+ } else {
+ _game._player._spritesPrefix = "RXM";
+ }
+ break;
+ }
+
+ _game._player._scalingVelocity = (_scene->_nextSceneId <= 212);
+
+ if (oldName != _game._player._spritesPrefix)
+ _game._player._spritesChanged = true;
+
+ if ((_scene->_nextSceneId == 203 || _scene->_nextSceneId == 204) && _globals[kRhotundaStatus])
+ _game._player._loadsFirst = false;
+
+ _vm->_palette->setEntry(16, 10, 63, 63);
+ _vm->_palette->setEntry(17, 10, 45, 45);
+}
+
+void Scene2xx::sceneEntrySound() {
+ if (_vm->_musicFlag) {
+ switch (_scene->_nextSceneId) {
+ case 201:
+ if ((_globals[kTeleporterCommand] == 2) || (_globals[kTeleporterCommand] == 4) || (_globals[kMeteorologistStatus] != 1))
+ _vm->_sound->command(9);
+ else
+ _vm->_sound->command(17);
+ break;
+ case 202:
+ case 203:
+ case 204:
+ case 205:
+ case 208:
+ case 209:
+ case 212:
+ _vm->_sound->command(9);
+ break;
+ case 206:
+ case 211:
+ case 215:
+ _vm->_sound->command(10);
+ break;
+ case 207:
+ case 214:
+ _vm->_sound->command(11);
+ break;
+ case 210:
+ if (_globals[kTwinklesStatus] == 0)
+ _vm->_sound->command(15);
+ else
+ _vm->_sound->command(10);
+ break;
+ case 213:
+ if (_globals[kMeteorologistWatch] == METEOROLOGIST_NORMAL)
+ _vm->_sound->command(1);
+ else
+ _vm->_sound->command(9);
+ break;
+ case 216:
+ _vm->_sound->command(16);
+ break;
+ default:
+ _vm->_sound->command(10);
+ break;
+ }
+ } else
+ _vm->_sound->command(2);
+}
+
+/*------------------------------------------------------------------------*/
+
+Scene201::Scene201(MADSEngine *vm) : Scene2xx(vm) {
+ _pterodactylFlag = false;
+}
+
+void Scene201::synchronize(Common::Serializer &s) {
+ Scene2xx::synchronize(s);
+
+ s.syncAsByte(_pterodactylFlag);
+}
+
+void Scene201::setup() {
+ setPlayerSpritesPrefix();
+ setAAName();
+
+ _scene->addActiveVocab(NOUN_SWOOPING_CREATURE);
+ _scene->addActiveVocab(NOUN_BIRDS);
+ _scene->addActiveVocab(VERB_WALKTO);
+}
+
+void Scene201::enter() {
+ _globals._spriteIndexes[1] = _scene->_sprites.addSprites(formAnimName('x', 0));
+ _globals._spriteIndexes[2] = _scene->_sprites.addSprites(formAnimName('x', 1));
+ _globals._spriteIndexes[3] = _scene->_sprites.addSprites(formAnimName('m', -1));
+ _globals._spriteIndexes[4] = _scene->_sprites.addSprites(formAnimName('b', -1));
+ _globals._spriteIndexes[5] = _scene->_sprites.addSprites("*SC002Z1");
+ _globals._sequenceIndexes[1] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[1], false, 6, 0, 1, 0);
+ _globals._sequenceIndexes[2] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[2], false, 15, 0, 0, 50);
+ _globals._sequenceIndexes[3] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[3], false, 4, 0, 0, 0);
+ _globals._sequenceIndexes[4] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[4], false, 6, 0, 0, 0);
+ _scene->_sequences.setDepth(_globals._sequenceIndexes[4], 8);
+ _scene->_sequences.setPosition(_globals._sequenceIndexes[4], Common::Point(185, 46));
+
+ int idx = _scene->_dynamicHotspots.add(NOUN_BIRDS, 209, _globals._sequenceIndexes[4], Common::Rect(0, 0, 0, 0));
+ _scene->_dynamicHotspots.setPosition(idx, Common::Point(186, 81), FACING_NORTH);
+
+ if ((_scene->_priorSceneId == 202) || (_scene->_priorSceneId == -1)) {
+ _game._player._playerPos = Common::Point(165, 152);
+ } else {
+ _game._player._playerPos = Common::Point(223, 149);
+ _game._player._facing = FACING_SOUTH;
+ }
+
+ if (_globals[kTeleporterCommand]) {
+ _game._player._visible = false;
+ _game._player._stepEnabled = false;
+ int sepChar = (_globals[kSexOfRex] == SEX_MALE) ? 't' : 'u';
+ // Guess values. What is the default value used by the compiler?
+ int suffixNum = -1;
+ int abortTimers = -1;
+ switch(_globals[kTeleporterCommand]) {
+ case 1:
+ suffixNum = 3;
+ abortTimers = 76;
+ _globals[kTeleporterUnderstood] = true;
+ break;
+ case 2:
+ suffixNum = 1;
+ abortTimers = 77;
+ break;
+ case 3:
+ _game._player._visible = true;
+ _game._player._stepEnabled = true;
+ suffixNum = -1;
+ break;
+ case 4:
+ suffixNum = 2;
+ abortTimers = 78;
+ break;
+ }
+ _globals[kTeleporterCommand] = 0;
+ if (suffixNum >= 0)
+ _scene->loadAnimation(formAnimName(sepChar, suffixNum), abortTimers);
+ }
+
+ if ((_scene->_priorSceneId == 202) && (_globals[kMeteorologistStatus] == METEOROLOGIST_PRESENT) && !_scene->_roomChanged) {
+ _globals._spriteIndexes[6] = _scene->_sprites.addSprites(formAnimName('a', 0));
+ _globals._spriteIndexes[7] = _scene->_sprites.addSprites(formAnimName('a', 1));
+ _game.loadQuoteSet(90, 91, 0);
+ _game._player._stepEnabled = false;
+ _globals._sequenceIndexes[6] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[6], false, 7, 1, 0, 0);
+ _scene->_sequences.setAnimRange(_globals._sequenceIndexes[6], -1, 12);
+ _scene->_sequences.addSubEntry(_globals._sequenceIndexes[6], SEQUENCE_TRIGGER_SPRITE, 12, 70);
+ _scene->_sequences.setDepth(_globals._sequenceIndexes[6], 1);
+ _pterodactylFlag = false;
+ _game._player.walk(Common::Point(157, 143), FACING_NORTH);
+ _vm->_palette->setEntry(252, 45, 63, 45);
+ _vm->_palette->setEntry(253, 20, 45, 20);
+ _scene->_kernelMessages.add(Common::Point(0, 0), 0x1110, 2, 0, 120, _game.getQuote(90));
+ } else
+ _pterodactylFlag = true;
+
+ if (_globals[kTeleporterUnderstood])
+ _scene->_hotspots.activate(NOUN_STRANGE_DEVICE, false);
+
+ sceneEntrySound();
+}
+
+void Scene201::step() {
+ if (_pterodactylFlag && (_vm->getRandomNumber(5000) == 9)) {
+ _globals._sequenceIndexes[5] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[5], false, 5, 1, 6, 0);
+ int idx = _scene->_dynamicHotspots.add(351, 13, _globals._sequenceIndexes[5], Common::Rect(0, 0, 0, 0));
+ _scene->_dynamicHotspots.setPosition(idx, Common::Point(270, 80), FACING_EAST);
+ _scene->_sequences.setDepth(_globals._sequenceIndexes[5], 8);
+ _vm->_sound->command(14);
+ _pterodactylFlag = false;
+ }
+
+ if (_game._trigger == 70) {
+ _globals._sequenceIndexes[6] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[6], false, 9, 1, 0, 0);
+ _game._player._visible = false;
+ _scene->_sequences.setAnimRange(_globals._sequenceIndexes[6], 12, 16);
+ _globals._sequenceIndexes[7] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[7], false, 9, 1, 0, 0);
+ _vm->_sound->command(42);
+ _scene->_sequences.setDepth(_globals._sequenceIndexes[6], 1);
+ _scene->_sequences.setDepth(_globals._sequenceIndexes[7], 1);
+ _scene->_sequences.addSubEntry(_globals._sequenceIndexes[7], SEQUENCE_TRIGGER_SPRITE, 3, 81);
+ _scene->_sequences.addSubEntry(_globals._sequenceIndexes[7], SEQUENCE_TRIGGER_EXPIRE, 0, 71);
+ _scene->_sequences.addSubEntry(_globals._sequenceIndexes[6], SEQUENCE_TRIGGER_EXPIRE, 0, 73);
+ }
+
+ if (_game._trigger == 81) {
+ _scene->_kernelMessages.reset();
+ }
+
+ if (_game._trigger == 71) {
+ _globals._sequenceIndexes[7] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[7], false, 9, 0, 0, 0);
+ _scene->_sequences.setAnimRange(_globals._sequenceIndexes[7], -2, -2);
+ _scene->_sequences.setDepth(_globals._sequenceIndexes[7], 1);
+ }
+
+ if (_game._trigger == 73) {
+ _globals._sequenceIndexes[6] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[6], false, 9, 1, 0, 0);
+ _scene->_sequences.setAnimRange(_globals._sequenceIndexes[6], 17, -2);
+ _scene->_sequences.addSubEntry(_globals._sequenceIndexes[6], SEQUENCE_TRIGGER_EXPIRE, 0, 74);
+ _scene->_sequences.setDepth(_globals._sequenceIndexes[6], 1);
+ }
+
+ if (_game._trigger == 74) {
+ _vm->_sound->command(40);
+
+ _scene->_kernelMessages.add(Common::Point(125, 56), 0xFDFC, 32, 82, 180, _game.getQuote(91));
+ _globals._sequenceIndexes[6] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[6], false, 9, 0, 0, 0);
+ _scene->_sequences.setDepth(_globals._sequenceIndexes[6], 1);
+ _scene->_sequences.setAnimRange(_globals._sequenceIndexes[6], -2, -2);
+ _scene->_sequences.addTimer(180, 75);
+ }
+
+ if (_game._trigger == 75) {
+ _globals[kMeteorologistEverSeen] = 0;
+ _scene->_nextSceneId = 202;
+ }
+
+ if (_game._trigger == 76) {
+ _game._player._stepEnabled = true;
+ _game._player._visible = true;
+ _game._player._priorTimer = _scene->_frameStartTime - _game._player._ticksAmount;
+ }
+
+ if (_game._trigger == 77) {
+ _globals[kTeleporterCommand] = 1;
+ _scene->_nextSceneId = _globals[kTeleporterDestination];
+ _scene->_reloadSceneFlag = true;
+ }
+
+ if (_game._trigger == 78) {
+ _vm->_sound->command(40);
+ _vm->_dialogs->show(20114);
+ _scene->_reloadSceneFlag = true;
+ }
+}
+
+void Scene201::actions() {
+ if (_action._lookFlag == false) {
+ if (_action.isAction(VERB_WALK_TOWARDS, NOUN_FIELD_TO_SOUTH))
+ _scene->_nextSceneId = 202;
+ else if (_action.isAction(VERB_CLIMB_UP, NOUN_STEPS) || (_action.isAction(VERB_WALK_INSIDE, NOUN_TELEPORTER)) || (_action.isAction(VERB_WALK_INSIDE, NOUN_STRANGE_DEVICE))) {
+ if (_game._trigger == 0) {
+ _game._player._stepEnabled = false;
+ _game._player._visible = false;
+ int sepChar = (_globals[kSexOfRex] == SEX_MALE) ? 't' : 'u';
+ _scene->loadAnimation(formAnimName(sepChar, 0), 1);
+ } else if (_game._trigger == 1) {
+ _scene->_nextSceneId = 213;
+ }
+ } else if (_action.isAction(VERB_LOOK, NOUN_GRASSY_FIELD)) {
+ _vm->_dialogs->show(20101);
+ } else if (_action.isAction(VERB_LOOK, NOUN_ROCKS)) {
+ _vm->_dialogs->show(20102);
+ } else if (_action.isAction(VERB_LOOK, NOUN_THORNY_BUSH)) {
+ _vm->_dialogs->show(20103);
+ } else if (_action.isAction(VERB_LOOK, NOUN_SKY)) {
+ _vm->_dialogs->show(20104);
+ } else if (_action.isAction(VERB_LOOK, NOUN_WATER)) {
+ _vm->_dialogs->show(20105);
+ } else if (_action.isAction(VERB_LOOK, NOUN_ISLAND_IN_DISTANCE)) {
+ _vm->_dialogs->show(20106);
+ } else if (_action.isAction(VERB_LOOK, NOUN_WEATHER_STATION)) {
+ _vm->_dialogs->show(20107);
+ } else if (_action.isAction(VERB_LOOK, NOUN_PATH)) {
+ _vm->_dialogs->show(20108);
+ } else if (_action.isAction(VERB_LOOK, NOUN_FIELD_TO_SOUTH)) {
+ _vm->_dialogs->show(20110);
+ } else if (_action.isAction(VERB_LOOK, NOUN_STRANGE_DEVICE)) {
+ if (_globals[kMeteorologistEverSeen])
+ _vm->_dialogs->show(20112);
+ else
+ _vm->_dialogs->show(20109);
+ } else if (_action.isAction(VERB_LOOK, NOUN_TELEPORTER)) {
+ _vm->_dialogs->show(20113);
+ } else
+ return;
+ } else {
+ _vm->_dialogs->show(20111);
+ }
+ _action._inProgress = false;
+}
+
+/*------------------------------------------------------------------------*/
+
+Scene202::Scene202(MADSEngine *vm) : Scene2xx(vm) {
+ _activeMsgFl = false;
+ _ladderTopFl = false;
+ _waitingMeteoFl = false;
+ _ladderHotspotId = -1;
+ _meteoClock1 = 0;
+ _meteoClock2 = 0;
+ _toStationFl = false;
+ _toTeleportFl = false;
+ _lastRoute = 0;
+ _stationCounter = 0;
+ _meteoFrame = 0;
+ _startTime = 0;
+ _meteorologistSpecial = false;
+}
+
+void Scene202::synchronize(Common::Serializer &s) {
+ Scene2xx::synchronize(s);
+
+ s.syncAsByte(_activeMsgFl);
+ s.syncAsByte(_ladderTopFl);
+ s.syncAsByte(_waitingMeteoFl);
+ s.syncAsByte(_toStationFl);
+ s.syncAsByte(_toTeleportFl);
+
+ s.syncAsSint32LE(_ladderHotspotId);
+ s.syncAsSint32LE(_lastRoute);
+ s.syncAsSint32LE(_stationCounter);
+ s.syncAsSint32LE(_meteoFrame);
+
+ s.syncAsUint32LE(_meteoClock1);
+ s.syncAsUint32LE(_meteoClock2);
+ s.syncAsUint32LE(_startTime);
+
+ s.syncAsByte(_meteorologistSpecial);
+}
+
+void Scene202::setup() {
+ setPlayerSpritesPrefix();
+ setAAName();
+
+ _scene->addActiveVocab(NOUN_LADDER);
+ _scene->addActiveVocab(VERB_CLIMB_DOWN);
+ _scene->addActiveVocab(VERB_WALKTO);
+ _scene->addActiveVocab(NOUN_BONE);
+ _scene->addActiveVocab(NOUN_SKULL);
+ _scene->addActiveVocab(NOUN_BROKEN_LADDER);
+}
+
+void Scene202::enter() {
+ _game._player._beenVisible = true;
+ _globals._spriteIndexes[1] = _scene->_sprites.addSprites(formAnimName('b', 0));
+ _globals._spriteIndexes[2] = _scene->_sprites.addSprites(formAnimName('b', 1));
+ _globals._spriteIndexes[6] = _scene->_sprites.addSprites(formAnimName('b', 2));
+ _globals._spriteIndexes[3] = _scene->_sprites.addSprites(formAnimName('x', 0));
+ _globals._spriteIndexes[5] = _scene->_sprites.addSprites(formAnimName('l', -1));
+ if (_globals[kSexOfRex] != SEX_MALE) {
+ _globals._spriteIndexes[7] = _scene->_sprites.addSprites("*ROXBD_2");
+ } else {
+ _globals._spriteIndexes[7] = _scene->_sprites.addSprites("*RXMBD_2");
+ }
+ _globals._spriteIndexes[8] = _scene->_sprites.addSprites(formAnimName('a', 0));
+ _globals._spriteIndexes[9] = _scene->_sprites.addSprites(formAnimName('a', 1));
+ _globals._spriteIndexes[11] = _scene->_sprites.addSprites(formAnimName('a', 2));
+
+ _globals._sequenceIndexes[3] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[3], false, 6, 0, 0, 0);
+ _globals._sequenceIndexes[2] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[2], false, 6, 0, 0, 0);
+ _scene->_sequences.setPosition(_globals._sequenceIndexes[2], Common::Point(149, 113));
+ _scene->_sequences.setDepth(_globals._sequenceIndexes[2], 10);
+ int idx = _scene->_dynamicHotspots.add(NOUN_SKULL, VERB_WALKTO, _globals._sequenceIndexes[2], Common::Rect(0, 0, 0, 0));
+ _scene->_dynamicHotspots.setPosition(idx, Common::Point(153, 97), FACING_SOUTH);
+
+ if (!(_globals[kBone202Status] & 1)) {
+ _globals._sequenceIndexes[1] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[1], false, 6, 0, 0, 0);
+ _scene->_sequences.setPosition(_globals._sequenceIndexes[1], Common::Point(130, 108));
+ _scene->_sequences.setDepth(_globals._sequenceIndexes[1], 10);
+ idx = _scene->_dynamicHotspots.add(NOUN_BONE, VERB_WALKTO, _globals._sequenceIndexes[1], Common::Rect(0, 0, 0, 0));
+ _scene->_dynamicHotspots.setPosition(idx, Common::Point(132, 97), FACING_SOUTH);
+ }
+
+ if (!(_globals[kBone202Status] & 2)) {
+ _globals._sequenceIndexes[6] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[6], false, 6, 0, 0, 0);
+ _scene->_sequences.setPosition(_globals._sequenceIndexes[6], Common::Point(166, 110));
+ _scene->_sequences.setDepth(_globals._sequenceIndexes[6], 10);
+ idx = _scene->_dynamicHotspots.add(NOUN_BONE, VERB_WALKTO, _globals._sequenceIndexes[6], Common::Rect(0, 0, 0, 0));
+ _scene->_dynamicHotspots.setPosition(idx, Common::Point(165, 99), FACING_SOUTH);
+ }
+
+ if (_globals[kBone202Status])
+ _scene->changeVariant(_globals[kBone202Status]);
+
+ if (_scene->_priorSceneId == 201) {
+ _game._player._playerPos = Common::Point(190, 91);
+ _game._player._facing = FACING_SOUTH;
+ } else if (_scene->_priorSceneId != -2) {
+ _game._player._playerPos = Common::Point(178, 152);
+ _game._player._facing = FACING_NORTH;
+ }
+
+ if (_globals[kLadderBroken]) {
+ _globals._sequenceIndexes[5] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[5], false, 6, 0, 0, 0);
+ _scene->_sequences.setDepth(_globals._sequenceIndexes[5], 6);
+ _scene->_hotspots.activate(NOUN_LADDER, false);
+ idx = _scene->_dynamicHotspots.add(NOUN_BROKEN_LADDER, VERB_WALKTO, _globals._sequenceIndexes[5], Common::Rect(0, 0, 0, 0));
+ _scene->_dynamicHotspots.setPosition(idx, Common::Point(246, 124), FACING_NORTH);
+ }
+
+ _game.loadQuoteSet(0x5C, 0x5D, 0x5E, 0x5F, 0x60, 0x62, 0x63, 0x64, 0x65, 0x66, 0x61, 0);
+ _activeMsgFl = false;
+
+ if (_scene->_priorSceneId == -2) {
+ if (_waitingMeteoFl) {
+ _globals._sequenceIndexes[9] = _scene->_sequences.startCycle(_globals._spriteIndexes[9], false, 1);
+ _game._player._visible = false;
+ }
+ } else {
+ _waitingMeteoFl = false;
+ _ladderTopFl = false;
+ }
+
+ _meteoClock1 = _meteoClock2 = _scene->_frameStartTime;
+
+ if (_scene->_roomChanged)
+ _game._objects.addToInventory(OBJ_BINOCULARS);
+
+ if (_globals[kMeteorologistWatch] != METEOROLOGIST_NORMAL) {
+ _game._player._visible = false;
+ _game._player._stepEnabled = false;
+ _ladderTopFl = (_globals[kMeteorologistWatch] == METEOROLOGIST_TOWER);
+
+ if (_ladderTopFl) {
+ _globals._sequenceIndexes[10] = _scene->_sequences.startCycle(_globals._spriteIndexes[9], true, 8);
+ _scene->_sequences.setDepth(_globals._sequenceIndexes[10], 1);
+
+ _scene->_sequences.setPosition(_globals._sequenceIndexes[10], Common::Point(247, 82));
+ _game._player._playerPos = Common::Point(246, 124);
+ _game._player._facing = FACING_NORTH;
+ _globals[kTeleporterUnderstood] = true;
+ } else {
+ _globals._sequenceIndexes[10] = _scene->_sequences.startCycle(_globals._spriteIndexes[9], false, 6);
+ _scene->_sequences.setDepth(_globals._sequenceIndexes[10], 1);
+
+ _scene->_sequences.setPosition(_globals._sequenceIndexes[10], Common::Point(172, 123));
+ _game._player._playerPos = Common::Point(171, 122);
+ _game._player._facing = FACING_NORTH;
+ }
+
+ _scene->loadAnimation(formAnimName('M', -1), 71);
+ _scene->_activeAnimation->setCurrentFrame(200);
+ } else {
+ if (_ladderTopFl) {
+ _game._player._visible = false;
+ _scene->_sequences.startCycle(_globals._sequenceIndexes[9], true, 1);
+ _scene->_sequences.setDepth(_globals._sequenceIndexes[9], 1);
+ _scene->_sequences.setPosition(_globals._sequenceIndexes[9], Common::Point(247, 82));
+ _game._player._playerPos = Common::Point(246, 124);
+ _game._player._facing = FACING_NORTH;
+ }
+ }
+
+ _meteorologistSpecial = false;
+}
+
+void Scene202::setRandomKernelMessage() {
+ int vocabId = _vm->getRandomNumber(92, 96);
+ _scene->_kernelMessages.reset();
+ _game._triggerSetupMode = SEQUENCE_TRIGGER_DAEMON;
+ _scene->_kernelMessages.add(Common::Point(0, 0), 0x1110, 34, 70, 120, _game.getQuote(vocabId));
+ _activeMsgFl = true;
+}
+
+void Scene202::step() {
+ if (!_activeMsgFl && (_game._player._playerPos == Common::Point(77, 105)) && (_game._player._facing == FACING_NORTH) && (_vm->getRandomNumber(999) == 0)) {
+ _scene->_kernelMessages.reset();
+ _activeMsgFl = false;
+ if (_vm->getRandomNumber(4) == 0)
+ setRandomKernelMessage();
+ }
+
+ if (_game._trigger == 70)
+ _activeMsgFl = false;
+
+ if (_game._trigger == 71) {
+ _vm->_sound->command(3);
+ _vm->_sound->command(9);
+
+ _meteoClock1 = _scene->_frameStartTime + 15 * 60;
+
+ if (_globals[kMeteorologistWatch] != METEOROLOGIST_NORMAL) {
+ Common::Point msgPos;
+ int msgFlag;
+ if (!_ladderTopFl) {
+ msgPos = Common::Point(0, 0);
+ msgFlag = 2;
+ } else {
+ msgPos = Common::Point(248, 15);
+ msgFlag = 0;
+ }
+ int msgIndex = _scene->_kernelMessages.add(msgPos, 0x1110, msgFlag | 32, 0, 120, _game.getQuote(102));
+ _scene->_kernelMessages.setQuoted(msgIndex, 4, true);
+
+ if (_globals[kMeteorologistWatch] == METEOROLOGIST_GROUND) {
+ _action._activeAction._verbId = VERB_LOOK;
+ _action._activeAction._objectNameId = NOUN_BINOCULARS;
+ _action._activeAction._indirectObjectId = NOUN_STRANGE_DEVICE;
+ _game._triggerSetupMode = SEQUENCE_TRIGGER_PARSER;
+ _scene->_sequences.addTimer(2 * 60, 2);
+ _meteorologistSpecial = true;
+ } else if (_globals[kMeteorologistWatch] == METEOROLOGIST_TOWER) {
+ _scene->_sequences.addTimer(2 * 60, 90);
+ }
+ }
+
+ _globals[kMeteorologistWatch] = METEOROLOGIST_NORMAL;
+ }
+
+ switch (_game._trigger) {
+ case 90:
+ _vm->_sound->command(41);
+ _scene->_sequences.remove(_globals._sequenceIndexes[10]);
+ _globals._sequenceIndexes[9] = _scene->_sequences.startReverseCycle(_globals._spriteIndexes[9], true, 6, 1, 0, 0);
+ _scene->_sequences.setPosition(_globals._sequenceIndexes[9], Common::Point(247, 82));
+ _scene->_sequences.setDepth(_globals._sequenceIndexes[9], 1);
+ _scene->_sequences.addSubEntry(_globals._sequenceIndexes[9], SEQUENCE_TRIGGER_EXPIRE, 0, 91);
+ break;
+ case 91:
+ _globals._sequenceIndexes[9] = _scene->_sequences.startCycle(_globals._spriteIndexes[9], true, 1);
+ _scene->_sequences.setPosition(_globals._sequenceIndexes[9], Common::Point(247, 82));
+ _scene->_sequences.setDepth(_globals._sequenceIndexes[9], 1);
+ _scene->_sequences.addTimer(60, 92);
+ break;
+ case 92: {
+ _scene->_sequences.remove(_globals._sequenceIndexes[9]);
+ _globals._sequenceIndexes[11] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[11], false, 6, 1, 0, 0);
+ _scene->_sequences.setDepth(_globals._sequenceIndexes[11], 1);
+ _scene->_sequences.addSubEntry(_globals._sequenceIndexes[11], SEQUENCE_TRIGGER_EXPIRE, 0, 93);
+ _scene->_kernelMessages.reset();
+ int msgIndex = _scene->_kernelMessages.add(Common::Point(0, -65), 0x1110, 32, 0, 60, _game.getQuote(98));
+ _scene->_kernelMessages.setSeqIndex(msgIndex, _globals._sequenceIndexes[11]);
+ }
+ break;
+ case 93: {
+ _globals[kLadderBroken] = false;
+ _globals._sequenceIndexes[5] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[5], false, 6, 0, 0, 0);
+ _scene->_hotspots.activate(NOUN_LADDER, false);
+ int idx = _scene->_dynamicHotspots.add(NOUN_BROKEN_LADDER, VERB_WALKTO, _globals._sequenceIndexes[5], Common::Rect(0, 0, 0, 0));
+ _scene->_dynamicHotspots.setPosition(idx, Common::Point(246, 124), FACING_NORTH);
+ _scene->_sequences.updateTimeout(_globals._sequenceIndexes[11], _globals._sequenceIndexes[5]);
+ _scene->_sequences.updateTimeout(-1, _globals._sequenceIndexes[11]);
+ _game._player._stepEnabled = true;
+ _game._player._visible = true;
+ _ladderTopFl = false;
+ _scene->_kernelMessages.reset();
+ _scene->_kernelMessages.add(Common::Point(0, 0), 0x1110, 34, 0, 120, _game.getQuote(99));
+ }
+ break;
+ default:
+ break;
+ }
+
+ if (!_scene->_activeAnimation && (_globals[kMeteorologistStatus] != METEOROLOGIST_GONE) && (_meteoClock2 <= _scene->_frameStartTime) && (_meteoClock1 <= _scene->_frameStartTime)) {
+ int randVal = _vm->getRandomNumber(1, 500);
+ int threshold = 1;
+ if (_ladderTopFl)
+ threshold += 25;
+ if (!_globals[kMeteorologistEverSeen])
+ threshold += 25;
+ if (threshold >= randVal) {
+ _vm->_sound->command(17);
+ _scene->loadAnimation(formAnimName('M', -1), 71);
+ _toStationFl = true;
+ _toTeleportFl = false;
+ _globals[kMeteorologistEverSeen] = true;
+ _lastRoute = 0;
+ _stationCounter = 0;
+ _meteoClock2 = _scene->_frameStartTime + 2;
+ }
+ }
+
+ if (!_scene->_activeAnimation)
+ return;
+
+ if (_waitingMeteoFl) {
+ if (_scene->_activeAnimation->getCurrentFrame() >= 200) {
+ if ((_globals[kMeteorologistWatch] == METEOROLOGIST_TOWER) || _globals[kLadderBroken]) {
+ _scene->_nextSceneId = 213;
+ } else {
+ _vm->_dialogs->show(20201);
+ _scene->_reloadSceneFlag = true;
+ }
+ }
+
+ if ((_scene->_activeAnimation->getCurrentFrame() == 160) && (_meteoFrame != _scene->_activeAnimation->getCurrentFrame())) {
+ Common::Point msgPos;
+ int msgFlag;
+ if (!_ladderTopFl) {
+ msgPos = Common::Point(0, 0);
+ msgFlag = 2;
+ } else {
+ msgPos = Common::Point(248, 15);
+ msgFlag = 0;
+ }
+ int msgIndex = _scene->_kernelMessages.add(msgPos, 0x1110, msgFlag | 32, 0, 120, _game.getQuote(101));
+ _scene->_kernelMessages.setQuoted(msgIndex, 4, true);
+ }
+ }
+
+ if (_meteoClock2 + 120 * 60 <= _scene->_frameStartTime) {
+ _toTeleportFl = true;
+ }
+
+ if (_scene->_activeAnimation->getCurrentFrame() == _meteoFrame) {
+ return;
+ }
+
+ _meteoFrame = _scene->_activeAnimation->getCurrentFrame();
+ int randVal = _vm->getRandomNumber(1, 1000);
+ int frameStep = -1;
+
+ switch (_scene->_activeAnimation->getCurrentFrame()) {
+ case 42:
+ case 77:
+ case 96:
+ _stationCounter = 0;
+ frameStep = subStep1(randVal);
+ break;
+ case 51:
+ case 74:
+ _toStationFl = false;
+ frameStep = subStep2(randVal);
+ break;
+ case 27:
+ case 119:
+ case 159:
+ frameStep = subStep3(randVal);
+ break;
+ case 176:
+ frameStep = subStep4(randVal);
+ break;
+ case 59:
+ _lastRoute = 3;
+ ++_stationCounter;
+ if (randVal <= 800)
+ frameStep = 55;
+ break;
+ case 89:
+ _lastRoute = 1;
+ if (randVal <= 700)
+ frameStep = 83;
+ break;
+ case 137:
+ _lastRoute = 2;
+ if (randVal <= 700)
+ frameStep = 126;
+ break;
+ }
+
+ if (frameStep >= 0 && frameStep != _scene->_activeAnimation->getCurrentFrame() + 1) {
+ _scene->_activeAnimation->setCurrentFrame(frameStep);
+ _meteoFrame = frameStep;
+ }
+}
+
+int Scene202::subStep1(int randVal) {
+ if ((randVal <= 100) || _toStationFl)
+ return 42;
+
+ if ((randVal <= 200) || _toTeleportFl)
+ return 96;
+
+ if ((randVal <= 300) && (_lastRoute != 1))
+ return 77;
+
+ return 76;
+}
+
+int Scene202::subStep2(int randVal) {
+ if ((randVal <= 150) && (_stationCounter < 5))
+ return 51;
+
+ if ((randVal <= 300) || _toTeleportFl)
+ return 74;
+
+ if (randVal <= 400)
+ return 64;
+
+ return 44;
+}
+
+int Scene202::subStep3(int randVal) {
+ if ((randVal <= 100) || _toStationFl)
+ return 27;
+
+ if ((randVal <= 200) || _toTeleportFl)
+ return 159;
+
+ if ((randVal <= 300) && (_lastRoute != 2))
+ return 119;
+
+ return 110;
+}
+
+int Scene202::subStep4(int randVal) {
+ if ((randVal <= 100) || _toTeleportFl)
+ return 176;
+
+ if (randVal <= 200)
+ return 19;
+
+ return 166;
+}
+
+void Scene202::preActions() {
+ Player &player = _vm->_game->_player;
+
+ if (player._needToWalk)
+ _scene->_kernelMessages.reset();
+
+ if (_ladderTopFl && (_action.isAction(VERB_CLIMB_DOWN, NOUN_LADDER) || player._needToWalk)) {
+ if (_game._trigger == 0) {
+ _vm->_sound->command(29);
+ player._readyToWalk = false;
+ player._stepEnabled = false;
+ _scene->_sequences.remove(_globals._sequenceIndexes[9]);
+ _globals._sequenceIndexes[8] = _scene->_sequences.addReverseSpriteCycle(_globals._spriteIndexes[8], false, 6, 1, 0, 0);
+ _scene->_sequences.setDepth(_globals._sequenceIndexes[8], 1);
+ _scene->_sequences.addSubEntry(_globals._sequenceIndexes[8], SEQUENCE_TRIGGER_EXPIRE, 0, 1);
+ } else if (_game._trigger == 1) {
+ _scene->_sequences.updateTimeout(-1, _globals._sequenceIndexes[8]);
+ _scene->_dynamicHotspots.remove(_ladderHotspotId);
+ player._visible = true;
+ player._readyToWalk = true;
+ player._stepEnabled = true;
+ _ladderTopFl = false;
+ }
+ }
+
+ if (_action.isAction(VERB_LOOK, NOUN_BINOCULARS) && (_action._activeAction._indirectObjectId > 0)) {
+ if (!player._readyToWalk || _ladderTopFl)
+ player._needToWalk = false;
+ else
+ player._needToWalk = true;
+
+ if (!_ladderTopFl)
+ player.walk(Common::Point(171, 122), FACING_NORTH);
+ }
+}
+
+void Scene202::actions() {
+ if (_action._lookFlag) {
+ _vm->_dialogs->show(20219);
+ return;
+ }
+
+ if (_action.isAction(VERB_CLIMB_DOWN, NOUN_LADDER)) {
+ _action._inProgress = false;
+ return;
+ } else if (_action.isAction(VERB_WALK_TOWARDS, NOUN_FIELD_TO_SOUTH)) {
+ _scene->_nextSceneId = 203;
+ } else if (_action.isAction(VERB_WALK_TOWARDS, NOUN_FIELD_TO_NORTH)) {
+ if (_globals[kMeteorologistStatus] != METEOROLOGIST_GONE) {
+ if (_scene->_activeAnimation)
+ _globals[kMeteorologistStatus] = METEOROLOGIST_PRESENT;
+ else
+ _globals[kMeteorologistStatus] = METEOROLOGIST_ABSENT;
+ }
+ _scene->_nextSceneId = 201;
+ } else if (_action.isAction(VERB_TAKE, NOUN_BONE) && (_action._savedFields._mainObjectSource == 4)) {
+ switch (_game._trigger) {
+ case 0:
+ if (_game._objects.isInInventory(OBJ_BONES)) {
+ _vm->_dialogs->show(20221);
+ } else {
+ _game._player._stepEnabled = false;
+ _game._player._visible = false;
+ _globals._sequenceIndexes[7] = _scene->_sequences.startReverseCycle(_globals._spriteIndexes[7], false, 3, 2, 0, 0);
+ _scene->_sequences.setMsgLayout(_globals._sequenceIndexes[7]);
+ _scene->_sequences.addSubEntry(_globals._sequenceIndexes[7], SEQUENCE_TRIGGER_SPRITE, 6, 1);
+ _scene->_sequences.addSubEntry(_globals._sequenceIndexes[7], SEQUENCE_TRIGGER_EXPIRE, 0, 2);
+ }
+ break;
+ case 1:
+ if (_game._player._playerPos == Common::Point(132, 97)) {
+ _scene->_sequences.remove(_globals._sequenceIndexes[1]);
+ _globals[kBone202Status] |= BONE_202_LEFT_GONE;
+ } else {
+ _scene->_sequences.remove(_globals._sequenceIndexes[6]);
+ _globals[kBone202Status] |= BONE_202_RIGHT_GONE;
+ }
+ break;
+ case 2:
+ if (_game._objects.isInInventory(OBJ_BONE)) {
+ _game._objects.removeFromInventory(OBJ_BONE, NOWHERE);
+ _game._objects.addToInventory(OBJ_BONES);
+ _vm->_dialogs->showItem(OBJ_BONES, 20218);
+ } else {
+ _game._objects.addToInventory(OBJ_BONE);
+ _vm->_dialogs->showItem(OBJ_BONE, 20218);
+ }
+ _scene->changeVariant(_globals[kBone202Status]);
+ _game._player._stepEnabled = true;
+ _game._player._visible = true;
+ break;
+ default:
+ break;
+ }
+
+ _action._inProgress = false;
+ } else if (_action.isAction(VERB_CLIMB_UP, NOUN_LADDER) && !_globals[kLadderBroken]) {
+ switch (_game._trigger) {
+ case 0:
+ _vm->_sound->command(29);
+ _meteoClock1 = _scene->_frameStartTime;
+ _game._player._visible = false;
+ _game._player._stepEnabled = false;
+
+ _ladderHotspotId = _scene->_dynamicHotspots.add(NOUN_LADDER, 78, -1, Common::Rect(241, 68, 241 + 12, 68 + 54));
+ _scene->_dynamicHotspots.setPosition(_ladderHotspotId, Common::Point(246, 124), FACING_NORTH);
+ _globals._sequenceIndexes[8] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[8], false, 6, 1, 0, 0);
+ _scene->_sequences.setDepth(_globals._sequenceIndexes[8], 1);
+ _scene->_sequences.addSubEntry(_globals._sequenceIndexes[8], SEQUENCE_TRIGGER_EXPIRE, 0, 1);
+ break;
+ case 1: {
+ _globals._sequenceIndexes[9] = _scene->_sequences.startCycle(_globals._spriteIndexes[9], true, 1);
+ _scene->_sequences.setPosition(_globals._sequenceIndexes[9], Common::Point(247, 82));
+ _scene->_sequences.setDepth(_globals._sequenceIndexes[9], 1);
+ _scene->_sequences.updateTimeout(_globals._sequenceIndexes[8], _globals._sequenceIndexes[9]);
+ _ladderTopFl = true;
+ _game._player._stepEnabled = true;
+ int msgIndex = _scene->_kernelMessages.add(Common::Point(248, 15), 0x1110, 32, 0, 60, _game.getQuote(97));
+ _scene->_kernelMessages.setQuoted(msgIndex, 4, true);
+ }
+ break;
+ default:
+ _action._inProgress = false;
+ return;
+ }
+ } else if ((_action.isAction(VERB_LOOK, NOUN_BINOCULARS, NOUN_FIELD_TO_NORTH) || (_action.isAction(VERB_LOOK, NOUN_BINOCULARS, NOUN_STRANGE_DEVICE))) && (_globals[kSexOfRex] == SEX_MALE)) {
+ if (!_ladderTopFl) {
+ switch (_game._trigger) {
+ case 0:
+ _game._player._stepEnabled = false;
+ _game._player._visible= false;
+ _globals._sequenceIndexes[10] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[9], false, 6, 1, 0, 0);
+ _scene->_sequences.setAnimRange(_globals._sequenceIndexes[10], 1, 6);
+ _scene->_sequences.setPosition(_globals._sequenceIndexes[10], Common::Point(172, 123));
+ _scene->_sequences.setDepth(_globals._sequenceIndexes[10], 1);
+ _scene->_sequences.updateTimeout(-1, _globals._sequenceIndexes[10]);
+ _scene->_sequences.addSubEntry(_globals._sequenceIndexes[10], SEQUENCE_TRIGGER_EXPIRE, 0, 1);
+ break;
+ case 1:
+ _globals._sequenceIndexes[10] = _scene->_sequences.startCycle(_globals._spriteIndexes[9], false, 6);
+ _scene->_sequences.setDepth(_globals._sequenceIndexes[10], 1);
+ _scene->_sequences.setPosition(_globals._sequenceIndexes[10], Common::Point(172, 123));
+ if (_scene->_activeAnimation) {
+ _waitingMeteoFl = true;
+ _globals[kMeteorologistWatch] = METEOROLOGIST_GROUND;
+ } else {
+ _scene->_sequences.addTimer(120, 2);
+ }
+ break;
+ case 2:
+ if (!_scene->_activeAnimation && !_meteorologistSpecial) {
+ _vm->_dialogs->show(20222);
+ }
+ _scene->_sequences.remove(_globals._sequenceIndexes[10]);
+ _globals._sequenceIndexes[10] = _scene->_sequences.addReverseSpriteCycle(_globals._spriteIndexes[9], false, 6, 1, 0, 0);
+ _scene->_sequences.setDepth(_globals._sequenceIndexes[10], 1);
+ _scene->_sequences.setAnimRange(_globals._sequenceIndexes[10], 1, 6);
+ _scene->_sequences.setPosition(_globals._sequenceIndexes[10], Common::Point(172, 123));
+ _scene->_sequences.addSubEntry(_globals._sequenceIndexes[10], SEQUENCE_TRIGGER_EXPIRE, 0, 3);
+ break;
+ case 3:
+ _scene->_sequences.updateTimeout(-1, _globals._sequenceIndexes[10]);
+ _game._player._stepEnabled = true;
+ _game._player._visible = true;
+ break;
+ default:
+ _action._inProgress = false;
+ return;
+ }
+ } else {
+ switch (_game._trigger) {
+ case 0:
+ _toTeleportFl = true;
+ _game._player._stepEnabled = false;
+ _scene->_sequences.remove(_globals._sequenceIndexes[9]);
+ _globals._sequenceIndexes[9] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[9], true, 6, 1, 0, 0);
+ _scene->_sequences.setPosition(_globals._sequenceIndexes[9], Common::Point(247, 82));
+ _scene->_sequences.setDepth(_globals._sequenceIndexes[9], 1);
+ _scene->_sequences.addSubEntry(_globals._sequenceIndexes[9], SEQUENCE_TRIGGER_EXPIRE, 0, 1);
+ break;
+ case 1:
+ _globals._sequenceIndexes[10] = _scene->_sequences.startCycle(_globals._spriteIndexes[9], true, -2);
+ _scene->_sequences.setPosition(_globals._sequenceIndexes[10], Common::Point(247, 82));
+ _scene->_sequences.setDepth(_globals._sequenceIndexes[10], 1);
+ if (_scene->_activeAnimation) {
+ if (_scene->_activeAnimation->getCurrentFrame() > 200) {
+ _scene->_sequences.addTimer(120, 2);
+ } else {
+ _waitingMeteoFl = true;
+ _globals[kMeteorologistWatch] = METEOROLOGIST_GONE;
+ if ((_scene->_activeAnimation->getCurrentFrame() >= 44) && (_scene->_activeAnimation->getCurrentFrame() <= 75)) {
+ _scene->_kernelMessages.reset();
+ int msgIndex = _scene->_kernelMessages.add(Common::Point(248, 15), 0x1110, 32, 0, 60, _game.getQuote(100));
+ _scene->_kernelMessages.setQuoted(msgIndex, 4, false);
+ } else {
+ _action._inProgress = false;
+ return;
+ }
+ }
+ } else {
+ _scene->_sequences.addTimer(120, 2);
+ }
+ break;
+ case 2:
+ if (!_scene->_activeAnimation)
+ _vm->_dialogs->show(20222);
+ _meteorologistSpecial = false;
+ _scene->_sequences.remove(_globals._sequenceIndexes[10]);
+ _globals._sequenceIndexes[9] = _scene->_sequences.addReverseSpriteCycle(_globals._spriteIndexes[9], false, 6, 1, 0, 0);
+ _scene->_sequences.setPosition(_globals._sequenceIndexes[9], Common::Point(247, 82));
+ _scene->_sequences.setDepth(_globals._sequenceIndexes[9], 1);
+ _scene->_sequences.addSubEntry(_globals._sequenceIndexes[9], SEQUENCE_TRIGGER_EXPIRE, 0, 3);
+ break;
+ case 3:
+ _globals._sequenceIndexes[9] = _scene->_sequences.startCycle(_globals._spriteIndexes[9], true, 1);
+ _scene->_sequences.setPosition(_globals._sequenceIndexes[9], Common::Point(247, 82));
+ _scene->_sequences.setDepth(_globals._sequenceIndexes[9], 1);
+ _game._player._stepEnabled = true;
+ break;
+ default:
+ _action._inProgress = false;
+ return;
+ }
+ }
+ } else if (_action.isAction(VERB_WALK_INSIDE, NOUN_HUT)) {
+ setRandomKernelMessage();
+ } else if (_action.isAction(VERB_LOOK, NOUN_ROCKS)) {
+ _vm->_dialogs->show(20202);
+ } else if (_action.isAction(VERB_LOOK, NOUN_FIRE_PIT)) {
+ _vm->_dialogs->show(20203);
+ } else if (_action.isAction(VERB_LOOK, NOUN_GRASS)) {
+ _vm->_dialogs->show(20204);
+ } else if (_action.isAction(VERB_LOOK, NOUN_FIELD_TO_NORTH)) {
+ if ((_globals[kMeteorologistStatus] == METEOROLOGIST_ABSENT) || (_globals[kMeteorologistStatus] == METEOROLOGIST_GONE))
+ _vm->_dialogs->show(20205);
+ else if (_globals[kMeteorologistStatus] == METEOROLOGIST_PRESENT)
+ _vm->_dialogs->show(20220);
+ } else if (_action.isAction(VERB_LOOK, NOUN_WATCH_TOWER)) {
+ _vm->_dialogs->show(20206);
+ } else if (_action.isAction(VERB_LOOK, NOUN_TALL_GRASS)) {
+ _vm->_dialogs->show(20207);
+ } else if (_action.isAction(VERB_LOOK, NOUN_TREES)) {
+ _vm->_dialogs->show(20208);
+ } else if (_action.isAction(VERB_LOOK, NOUN_TREE)) {
+ _vm->_dialogs->show(20209);
+ } else if (_action.isAction(VERB_LOOK, NOUN_SKY)) {
+ _vm->_dialogs->show(20210);
+ } else if (_action.isAction(VERB_LOOK, NOUN_HUT)) {
+ if ((_game._player._playerPos == Common::Point(77, 105)) && (_game._player._facing == FACING_NORTH))
+ _vm->_dialogs->show(20212);
+ else
+ _vm->_dialogs->show(20211);
+ } else if (_action.isAction(VERB_LOOK, NOUN_STRANGE_DEVICE)) {
+ _vm->_dialogs->show(20213);
+ } else if (_action.isAction(VERB_LOOK, NOUN_OCEAN_IN_DISTANCE)) {
+ _vm->_dialogs->show(20214);
+ } else if (_action.isAction(VERB_LOOK, NOUN_SKULL)) {
+ _vm->_dialogs->show(20215);
+ } else if (_action.isAction(VERB_TAKE, NOUN_SKULL)) {
+ _vm->_dialogs->show(20216);
+ } else if (_action.isAction(VERB_LOOK, NOUN_BONES) && _action._commandSource == 4) {
+ _vm->_dialogs->show(20217);
+ } else {
+ return;
+ }
+
+ _action._inProgress = false;
+}
+
+/*****************************************************************************/
+
+Scene203::Scene203(MADSEngine *vm) : Scene2xx(vm) {
+ _rhotundaEat2Fl = false;
+ _rhotundaEatFl = false;
+}
+
+void Scene203::synchronize(Common::Serializer &s) {
+ Scene2xx::synchronize(s);
+
+ s.syncAsByte(_rhotundaEat2Fl);
+ s.syncAsByte(_rhotundaEatFl);
+}
+
+void Scene203::setup() {
+ setPlayerSpritesPrefix();
+ setAAName();
+ _scene->addActiveVocab(477);
+}
+
+void Scene203::enter() {
+ if (_scene->_priorSceneId == 202) {
+ _game._player._playerPos = Common::Point(187, 99);
+ _game._player._facing = FACING_SOUTH;
+ } else if (_scene->_priorSceneId == 209) {
+ _game._player._playerPos = Common::Point(308, 117);
+ _game._player._facing = FACING_WEST;
+ } else if (_scene->_priorSceneId != -2) {
+ _game._player._playerPos = Common::Point(155, 152);
+ _game._player._facing = FACING_NORTH;
+ }
+
+ _rhotundaEatFl = false;
+ _rhotundaEat2Fl = false;
+
+ if ((_globals[kRhotundaStatus] == 0) && (!_scene->_roomChanged)) {
+ _rhotundaEatFl = true;
+ _game._player.walk(Common::Point(158, 135), FACING_SOUTH);
+ int idx = _scene->_dynamicHotspots.add(131, 396, 0, Common::Rect(0, 0, 320, 156));
+ _scene->_dynamicHotspots.setPosition(idx, Common::Point(155, 152), FACING_SOUTH);
+ _scene->_dynamicHotspots.setCursor(idx, CURSOR_GO_DOWN);
+ }
+
+ if (!_rhotundaEatFl) {
+ _globals._spriteIndexes[0] = _scene->_sprites.addSprites(formAnimName('b', -1));
+ if (_vm->getRandomNumber(1, 3) == 2) {
+ _globals._spriteIndexes[15] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[0], false, 9, 1, 0, 0);
+ int idx = _scene->_dynamicHotspots.add(477, 209, _globals._spriteIndexes[15], Common::Rect(0, 0, 0, 0));
+ _scene->_dynamicHotspots.setPosition(idx, Common::Point(-2, 0), FACING_NONE);
+ _vm->_sound->command(14);
+ }
+ }
+
+ _game.loadQuoteSet(0x67, 0x68, 0x69, 0x6A, 0x5A, 0);
+
+ if (_rhotundaEatFl) {
+ _scene->_kernelMessages.add(Common::Point(0, 0), 0x1110, 34, 0, 120, _game.getQuote(_vm->getRandomNumber(103, 106)));
+ }
+
+ sceneEntrySound();
+}
+
+void Scene203::step() {
+ if (!_rhotundaEatFl)
+ return;
+
+ if ((_game._trigger == 0) && _rhotundaEat2Fl)
+ return;
+
+ if ((_game._player._playerPos != Common::Point(158, 136)) || (_game._player._facing != FACING_SOUTH))
+ return;
+
+ _rhotundaEat2Fl = true;
+
+ if (_game._trigger == 0) {
+ _game._player._visible = false;
+ _game._player._stepEnabled = false;
+ _vm->_palette->lock();
+ _scene->_kernelMessages.reset();
+ _scene->resetScene();
+ _vm->_events->setCursor2(CURSOR_WAIT);
+ _scene->loadAnimation(Resources::formatName(203, 'a', -1, EXT_AA, ""), 81);
+ } else if (_game._trigger == 81) {
+ _scene->_nextSceneId = 208;
+ _scene->_reloadSceneFlag = true;
+ }
+}
+
+void Scene203::preActions() {
+ if (_rhotundaEatFl && !_action.isAction(VERB_WALK_TOWARDS, NOUN_FIELD_TO_SOUTH)) {
+ _game._player.walk(Common::Point(158, 136), FACING_SOUTH);
+ _action._inProgress = false;
+ return;
+ }
+
+ if (_action.isAction(VERB_WALKTO, NOUN_OPEN_AREA_TO_EAST))
+ _game._player._walkOffScreenSceneId = 209;
+}
+
+void Scene203::actions() {
+ if (_action._savedFields._lookFlag) {
+ _vm->_dialogs->show(20307);
+ } else if (_action.isAction(VERB_WALK_TOWARDS, NOUN_FIELD_TO_SOUTH)) {
+ _scene->_nextSceneId = 208;
+ } else if (_action.isAction(VERB_WALK_TOWARDS, NOUN_FIELD_TO_NORTH)) {
+ _scene->_nextSceneId = 202;
+ } else if (_action.isAction(VERB_LOOK, NOUN_SKY)) {
+ _vm->_dialogs->show(20301);
+ } else if (_action.isAction(VERB_LOOK, NOUN_CLIFF_FACE)) {
+ _vm->_dialogs->show(20302);
+ } else if (_action.isAction(VERB_LOOK, NOUN_PALM_TREE)) {
+ _vm->_dialogs->show(20303);
+ } else if (_action.isAction(VERB_LOOK, NOUN_FIELD_TO_NORTH)) {
+ _vm->_dialogs->show(20304);
+ } else if (_action.isAction(VERB_LOOK, NOUN_GRASSY_FIELD)) {
+ _vm->_dialogs->show(20305);
+ } else if (_action.isAction(VERB_LOOK, NOUN_BOULDERS)) {
+ _vm->_dialogs->show(20305);
+ } else
+ return;
+
+ _action._inProgress = false;
+}
+
+/*****************************************************************************/
+
+void Scene205::setup() {
+ setPlayerSpritesPrefix();
+ setAAName();
+ _scene->addActiveVocab(VERB_WALKTO);
+ _scene->addActiveVocab(NOUN_CHICKEN);
+ _scene->addActiveVocab(NOUN_PIRANHA);
+}
+
+Scene205::Scene205(MADSEngine *vm) : Scene2xx(vm) {
+ _lastFishTime = 0;
+ _chickenTime = 0;
+ _beingKicked = false;
+ _kernelMessage = -1;
+}
+
+void Scene205::synchronize(Common::Serializer &s) {
+ Scene2xx::synchronize(s);
+
+ s.syncAsUint32LE(_lastFishTime);
+ s.syncAsUint32LE(_chickenTime);
+ s.syncAsByte(_beingKicked);
+ s.syncAsSint16LE(_kernelMessage);
+}
+
+void Scene205::enter() {
+ _globals._spriteIndexes[1] = _scene->_sprites.addSprites(formAnimName('x', 0));
+ _globals._spriteIndexes[2] = _scene->_sprites.addSprites(formAnimName('x', 1));
+ _globals._spriteIndexes[3] = _scene->_sprites.addSprites(formAnimName('x', 2));
+ _globals._spriteIndexes[5] = _scene->_sprites.addSprites(formAnimName('f', -1));
+ _globals._spriteIndexes[4] = _scene->_sprites.addSprites(formAnimName('c', -1));
+ _globals._spriteIndexes[6] = _scene->_sprites.addSprites(formAnimName('p', -1));
+
+ if (_globals[kSexOfRex] == SEX_MALE)
+ _globals._spriteIndexes[8] = _scene->_sprites.addSprites(formAnimName('a', 1));
+
+ _globals._sequenceIndexes[1] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[1], false, 10, 0, 0, 3);
+ int idx = _scene->_dynamicHotspots.add(73, 13, _globals._sequenceIndexes[1], Common::Rect(0, 0, 0, 0));
+ _scene->_dynamicHotspots.setPosition(idx, Common::Point(162, 120), FACING_NORTHEAST);
+
+ _globals._sequenceIndexes[2] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[2], false, 15, 0, 0, 0);
+ idx = _scene->_dynamicHotspots.add(73, 13, _globals._sequenceIndexes[1], Common::Rect(0, 0, 0, 0));
+ _scene->_dynamicHotspots.setPosition(idx, Common::Point(162, 120), FACING_NORTHEAST);
+
+ _globals._sequenceIndexes[3] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[3], false, 9, 0, 0, 0);
+ _globals._sequenceIndexes[5] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[5], false, 6, 0, 0, 0);
+ _scene->_sequences.setDepth(_globals._sequenceIndexes[5], 11);
+
+ if (!_game._visitedScenes._sceneRevisited) {
+ _lastFishTime = _scene->_frameStartTime;
+ _globals._sequenceIndexes[6] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[6], false, 7, 1, 0, 0);
+ idx = _scene->_dynamicHotspots.add(269, 13, _globals._sequenceIndexes[6], Common::Rect(0, 0, 0, 0));
+ _scene->_dynamicHotspots.setPosition(idx, Common::Point(49, 86), FACING_NORTH);
+ }
+
+ if (_game._objects[12]._roomNumber == 205) {
+ _globals._sequenceIndexes[4] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[4], false, 7, 0, 0, 0);
+ _scene->_sequences.setDepth(_globals._sequenceIndexes[4], 11);
+ } else {
+ _scene->_hotspots.activate(450, false);
+ }
+
+ _beingKicked = false;
+ _game.loadQuoteSet(0x6B, 0x70, 0x71, 0x72, 0x5A, 0x74, 0x75, 0x76, 0x77, 0x78, 0x73, 0x79, 0x7A, 0x7B, 0x7C,
+ 0x7D, 0x7E, 0x7F, 0x80, 0xAC, 0xAD, 0xAE, 0x6C, 0x6D, 0x6E, 0x6F, 0x2, 0);
+ _dialog1.setup(0x2A, 0x5A, 0x78, 0x74, 0x75, 0x76, 0x77, 0);
+
+ if (!_game._visitedScenes._sceneRevisited)
+ _dialog1.set(0x5A, 0x74, 0x75, 0x77, 0);
+
+ _vm->_palette->setEntry(250, 63, 50, 20);
+ _vm->_palette->setEntry(251, 50, 40, 15);
+ _vm->_palette->setEntry(252, 63, 63, 40);
+ _vm->_palette->setEntry(253, 50, 50, 30);
+
+ _chickenTime = _vm->_game->_scene._frameStartTime;
+
+ if (_globals[kSexOfRex] == SEX_FEMALE)
+ _scene->_kernelMessages.initRandomMessages(3,
+ Common::Rect(195, 99, 264, 134), 13, 2, 0xFDFC, 60,
+ 108, 108, 109, 109, 110, 110, 111, 108, 0);
+
+ if (_scene->_priorSceneId != -2)
+ _game._player._playerPos = Common::Point(99, 152);
+
+ if (_globals[kSexOfRex] != SEX_MALE) {
+ _scene->loadAnimation(formAnimName('a', -1));
+ _scene->_activeAnimation->_resetFlag = true;
+ } else {
+ _beingKicked = true;
+ _globals._sequenceIndexes[8] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[8], false, 8, 1, 0, 0);
+ _game._player._visible = false;
+ _game._player._stepEnabled = false;
+ _scene->_sequences.setDepth(_globals._sequenceIndexes[8], 2);
+ _scene->_sequences.addSubEntry(_globals._sequenceIndexes[8], SEQUENCE_TRIGGER_SPRITE, 6, 73);
+ _scene->_sequences.addSubEntry(_globals._sequenceIndexes[8], SEQUENCE_TRIGGER_SPRITE, 11, 74);
+ _scene->_sequences.addSubEntry(_globals._sequenceIndexes[8], SEQUENCE_TRIGGER_EXPIRE, 0, 71);
+ }
+ sceneEntrySound();
+}
+
+void Scene205::step() {
+ if (_globals[kSexOfRex] == SEX_FEMALE) {
+ _scene->_kernelMessages.randomServer();
+
+ if (_vm->_game->_scene._frameStartTime >= _chickenTime) {
+ int chanceMinor = _scene->_kernelMessages.checkRandom() + 1;
+ if (_scene->_kernelMessages.generateRandom(100, chanceMinor))
+ _vm->_sound->command(28);
+
+ _chickenTime = _vm->_game->_scene._frameStartTime + 2;
+ }
+ }
+
+ if (_vm->_game->_scene._frameStartTime - _lastFishTime > 1300) {
+ _globals._sequenceIndexes[6] = _scene->_sequences.addSpriteCycle(
+ _globals._spriteIndexes[6], false, 5, 1, 0, 0);
+ int idx = _scene->_dynamicHotspots.add(269, 13, _globals._sequenceIndexes[6],
+ Common::Rect(0, 0, 0, 0));
+ _scene->_dynamicHotspots.setPosition(idx, Common::Point(49, 86), FACING_NORTH);
+ _lastFishTime = _vm->_game->_scene._frameStartTime;
+ }
+
+ if (_game._trigger == 73)
+ _scene->_kernelMessages.add(Common::Point(160, 68), 0xFBFA, 32, 0, 60, _game.getQuote(112));
+
+ if (_game._trigger == 74) {
+ _vm->_sound->command(26);
+ _scene->_kernelMessages.add(Common::Point(106, 90), 0x1110, 32, 0, 60, _game.getQuote(113));
+ }
+
+ if (_game._trigger == 71) {
+ _globals._sequenceIndexes[8] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[8], false, 6, 0, 0, 0);
+ _scene->_sequences.setDepth(_globals._sequenceIndexes[8], 2);
+ _scene->_sequences.setAnimRange(_globals._sequenceIndexes[8], -2, -2);
+ _scene->_kernelMessages.reset();
+ _scene->_kernelMessages.add(Common::Point(160, 68), 0xFBFA, 32, 72, 180, _game.getQuote(114));
+ }
+
+ if (_game._trigger == 72)
+ _scene->_nextSceneId = 211;
+}
+
+void Scene205::handleWomanSpeech(int quote) {
+ _kernelMessage = _scene->_kernelMessages.add(Common::Point(186, 27), 0xFBFA, 0, 0, 9999999, _game.getQuote(quote));
+}
+
+void Scene205::actions() {
+ if (_game._screenObjects._inputMode == kInputConversation) {
+ if (_kernelMessage >= 0)
+ _scene->_kernelMessages.remove(_kernelMessage);
+ _kernelMessage = -1;
+
+ if (_game._trigger == 0) {
+ _game._player._stepEnabled = false;
+ _scene->_kernelMessages.add(Common::Point(0, 0), 0x1110, 18, 1, 120, _game.getQuote(_action._activeAction._verbId));
+ } else {
+ if ((_game._trigger > 1) || (_action._activeAction._verbId != 0x76))
+ _game._player._stepEnabled = true;
+
+ switch (_action._activeAction._verbId) {
+ case 0x5A:
+ handleWomanSpeech(0x7A);
+ _dialog1.write(0x78, true);
+ _dialog1.write(0x5A, false);
+ break;
+
+ case 0x74:
+ handleWomanSpeech(0x7C);
+ _dialog1.write(0x74, false);
+ _dialog1.write(0x76, true);
+ break;
+
+ case 0x75:
+ case 0x78:
+ handleWomanSpeech(0x7B);
+ _dialog1.write(_action._activeAction._verbId, false);
+ _vm->_dialogs->show(20501);
+ break;
+
+ case 0x76:
+ if (_game._trigger == 1) {
+ handleWomanSpeech(0x7D);
+ _scene->_sequences.addTimer(120, 2);
+ } else if (_game._trigger == 2) {
+ handleWomanSpeech(0x7E);
+ _dialog1.write(0x76, false);
+ _globals[kChickenPermitted] = true;
+ }
+ break;
+
+ case 0x77:
+ _scene->_kernelMessages.add(Common::Point(186, 27), 0xFBFA, 0, 0, 120, _game.getQuote(0x7F));
+ _scene->_userInterface.setup(kInputBuildingSentences);
+ break;
+
+ default:
+ break;
+ }
+
+ if (_action._activeAction._verbId != 0x77)
+ _dialog1.start();
+ }
+ } else if (_action._lookFlag)
+ _vm->_dialogs->show(20502);
+ else if (_action.isAction(VERB_LOOK, NOUN_BINOCULARS, NOUN_OPPOSITE_BANK))
+ _vm->_dialogs->show(20518);
+ else if (_action.isAction(VERB_TALKTO, NOUN_NATIVE_WOMAN)) {
+ if (_game._trigger == 0) {
+ _game._player._stepEnabled = false;
+ _scene->_kernelMessages.add(Common::Point(0, 0), 0x1110, 18, 1, 120, _game.getQuote(0x73));
+ } else if (_game._trigger == 1) {
+ _game._player._stepEnabled = true;
+ handleWomanSpeech (0x79);
+ _dialog1.write(0x5A, true);
+ _dialog1.write(0x75, true);
+ _dialog1.start();
+ }
+ } else if (_action.isAction(VERB_GIVE, NOUN_NATIVE_WOMAN) && _game._objects.isInInventory(_game._objects.getIdFromDesc(_action._activeAction._objectNameId))) {
+ if (_game._trigger == 0) {
+ _game._player._stepEnabled = false;
+ int rndVal = _vm->getRandomNumber(0xAC, 0xAE);
+ _scene->_kernelMessages.add(Common::Point(186, 27), 0xFBFA, 32, 1, 120, _game.getQuote(rndVal));
+ } else if (_game._trigger == 1)
+ _game._player._stepEnabled = true;
+ } else if (_action.isAction(VERB_WALKTO, NOUN_OPPOSITE_BANK)) {
+ if (_game._trigger == 0) {
+ _game._player._visible = false;
+ _game._player._stepEnabled = false;
+ _vm->_palette->lock();
+ _scene->_kernelMessages.reset();
+ _game._player.removePlayerSprites();
+ _globals._spriteIndexes[9] = _scene->_sprites.addSprites(formAnimName('a', 0));
+ _vm->_palette->refreshSceneColors();
+ _globals._sequenceIndexes[9] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[9], false, 6, 1, 0, 0);
+ _scene->_sequences.addSubEntry(_globals._sequenceIndexes[9], SEQUENCE_TRIGGER_EXPIRE, 0, 1);
+ _scene->_sequences.updateTimeout(_globals._sequenceIndexes[9], -1);
+ _vm->_sound->command(27);
+ } else if (_game._trigger == 1) {
+ if (_scene->_activeAnimation != nullptr)
+ _scene->_activeAnimation->resetSpriteSetsCount();
+
+ _vm->_dialogs->show(20516);
+ _scene->_reloadSceneFlag = true;
+ }
+ } else {
+ if (_action.isAction(VERB_WALK_DOWN, NOUN_PATH_TO_SOUTH))
+ _scene->_nextSceneId = 210;
+
+ if (_action.isAction(VERB_WALKTO, NOUN_FIRE_PIT) || _action.isAction(VERB_WALKTO, NOUN_CHICKEN_ON_SPIT)) {
+ if (_game._objects.isInRoom(OBJ_CHICKEN)) {
+ _scene->_kernelMessages.reset();
+ _scene->_kernelMessages.add(Common::Point(0, 0), 0x1110, 34, 0, 120, _game.getQuote(0x6B));
+ }
+ } else if (_action.isAction(VERB_TAKE, NOUN_CHICKEN_ON_SPIT) && _globals[kChickenPermitted] && _game._objects.isInRoom(OBJ_CHICKEN)) {
+ _game._objects.addToInventory(OBJ_CHICKEN);
+ _scene->_sequences.remove(_globals._sequenceIndexes[4]);
+ _scene->_hotspots.activate(NOUN_CHICKEN_ON_SPIT, false);
+ _vm->_dialogs->showItem(OBJ_CHICKEN, 812);
+ } else if (_action.isAction(VERB_TAKE, NOUN_CHICKEN_ON_SPIT) && (!_globals[kChickenPermitted]))
+ _scene->_kernelMessages.add(Common::Point(186, 27), 0xFBFA, 32, 0, 120, _game.getQuote(0x80));
+ else if (_action.isAction(VERB_LOOK, NOUN_NATIVE_WOMAN))
+ _vm->_dialogs->show(20503);
+ else if (_action.isAction(VERB_LOOK, NOUN_HUT))
+ _vm->_dialogs->show(20504);
+ else if (_action.isAction(VERB_LOOK, NOUN_CHICKEN) && (_action._mainObjectSource == 4))
+ _vm->_dialogs->show(20505);
+ else if (_action.isAction(VERB_TAKE, NOUN_CHICKEN) && (_action._mainObjectSource == 4))
+ _vm->_dialogs->show(20506);
+ else if (_action.isAction(VERB_LOOK, NOUN_CHICKEN_ON_SPIT))
+ _vm->_dialogs->show(20507);
+ else if (_action.isAction(VERB_LOOK, NOUN_FIRE_PIT))
+ _vm->_dialogs->show(20508);
+ else if (_action.isAction(VERB_TAKE, NOUN_FIRE_PIT))
+ _vm->_dialogs->show(20509);
+ else if (_action.isAction(VERB_LOOK, NOUN_STREAM))
+ _vm->_dialogs->show(20510);
+ else if (_action.isAction(VERB_LOOK, NOUN_OPPOSITE_BANK))
+ _vm->_dialogs->show(20511);
+ else if (_game._objects.isInInventory(_game._objects.getIdFromDesc(_action._activeAction._objectNameId))
+ && ( _action.isAction(VERB_GIVE, NOUN_STREAM) || _action.isAction(VERB_THROW, NOUN_STREAM)
+ || _action.isAction(VERB_GIVE, NOUN_PIRANHA) || _action.isAction(VERB_THROW, NOUN_PIRANHA)))
+ _vm->_dialogs->show(20512);
+ else if (_action.isAction(VERB_LOOK, NOUN_PIRANHA))
+ _vm->_dialogs->show(20513);
+ else if (_action.isAction(VERB_LOOK, NOUN_TWINKIFRUIT_BUSH))
+ _vm->_dialogs->show(20514);
+ else if (_action.isAction(VERB_TAKE, NOUN_TWINKIFRUIT_BUSH))
+ _vm->_dialogs->show(20515);
+ else if (_action.isAction(VERB_TAKE, NOUN_NATIVE_WOMAN))
+ _vm->_dialogs->show(20517);
+ else
+ return;
+ }
+
+ _action._inProgress = false;
+}
+
+/*****************************************************************************/
+
+Scene207::Scene207(MADSEngine *vm) : Scene2xx(vm) {
+ _vultureFl = false;
+ _spiderFl = false;
+ _eyeFl = false;
+ _spiderHotspotId = -1;
+ _vultureHotspotId = -1;
+ _spiderTime = 0;
+ _vultureTime = 0;
+}
+
+void Scene207::synchronize(Common::Serializer &s) {
+ Scene2xx::synchronize(s);
+
+ s.syncAsByte(_vultureFl);
+ s.syncAsByte(_spiderFl);
+ s.syncAsByte(_eyeFl);
+
+ s.syncAsSint32LE(_spiderHotspotId);
+ s.syncAsSint32LE(_vultureHotspotId);
+ s.syncAsSint32LE(_spiderTime);
+ s.syncAsSint32LE(_vultureTime);
+}
+
+void Scene207::setup() {
+ setPlayerSpritesPrefix();
+ setAAName();
+ _scene->addActiveVocab(NOUN_VULTURE);
+ _scene->addActiveVocab(VERB_WALKTO);
+ _scene->addActiveVocab(NOUN_SPIDER);
+ _scene->addActiveVocab(VERB_WALKTO);
+}
+
+void Scene207::enter() {
+ _globals._spriteIndexes[1] = _scene->_sprites.addSprites(formAnimName('h', 0));
+ _globals._spriteIndexes[2] = _scene->_sprites.addSprites(formAnimName('h', 1));
+ _globals._spriteIndexes[4] = _scene->_sprites.addSprites(formAnimName('c', -1));
+ _globals._spriteIndexes[5] = _scene->_sprites.addSprites(formAnimName('e', 0));
+ _globals._spriteIndexes[6] = _scene->_sprites.addSprites(formAnimName('e', 1));
+ _globals._spriteIndexes[7] = _scene->_sprites.addSprites(formAnimName('g', 1));
+ _globals._spriteIndexes[8] = _scene->_sprites.addSprites(formAnimName('g', 0));
+ _globals._sequenceIndexes[5] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[5], false, 7, 0, 0, 0);
+ _scene->_sequences.setDepth(_globals._sequenceIndexes[5], 7);
+
+ int var2;
+ if (!_game._visitedScenes._sceneRevisited) {
+ var2 = 1;
+ } else {
+ var2 = _vm->getRandomNumber(4) + 1;
+ }
+
+ if (var2 > 2)
+ _vultureFl = false;
+ else
+ _vultureFl = true;
+
+ _spiderFl = (var2 & 1);
+
+ if (_vultureFl) {
+ _globals._sequenceIndexes[1] = _scene->_sequences.startReverseCycle(_globals._spriteIndexes[1], false, 30, 0, 0, 400);
+ _vultureTime = _game._player._priorTimer;
+ _vultureHotspotId = _scene->_dynamicHotspots.add(389, 13, _globals._sequenceIndexes[1], Common::Rect(0, 0, 0, 0));
+ _scene->_dynamicHotspots.setPosition(_vultureHotspotId, Common::Point(254, 94), FACING_WEST);
+ }
+
+ if (_spiderFl) {
+ _globals._sequenceIndexes[4] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[4], false, 7, 1, 0, 0);
+ _scene->_sequences.setAnimRange(_globals._sequenceIndexes[4], -1, -1);
+ _spiderTime = _game._player._priorTimer;
+ _spiderHotspotId = _scene->_dynamicHotspots.add(333, 13, _globals._sequenceIndexes[4], Common::Rect(0, 0, 0, 0));
+ _scene->_dynamicHotspots.setPosition(_spiderHotspotId, Common::Point(59, 132), FACING_SOUTH);
+ }
+
+ _eyeFl = false;
+ if (_scene->_priorSceneId == 211) {
+ _game._player._playerPos = Common::Point(13, 105);
+ _game._player._facing = FACING_EAST;
+ } else if (_scene->_priorSceneId == 214) {
+ _game._player._playerPos = Common::Point(164, 117);
+ _game._player._facing = FACING_SOUTH;
+ } else if (_scene->_priorSceneId != -2) {
+ _game._player._playerPos = Common::Point(305, 131);
+ }
+
+ _globals._sequenceIndexes[6] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[6], false, 10, 1, 0, 0);
+ _scene->_sequences.setAnimRange(_globals._sequenceIndexes[6], 1, 22);
+ _scene->_sequences.setDepth(_globals._sequenceIndexes[6], 6);
+ _scene->_sequences.addSubEntry(_globals._sequenceIndexes[6], SEQUENCE_TRIGGER_EXPIRE, 0, 70);
+}
+
+void Scene207::moveVulture() {
+ _scene->_sequences.remove(_globals._sequenceIndexes[1]);
+ _globals._sequenceIndexes[2] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[2], false, 7, 1, 0, 0);
+ _vm->_sound->command(43);
+ _vultureFl = false;
+ _vultureTime = _game._player._priorTimer;
+ _scene->_dynamicHotspots.remove(_vultureHotspotId);
+}
+
+void Scene207::moveSpider() {
+ _scene->_sequences.remove(_globals._sequenceIndexes[4]);
+ _globals._sequenceIndexes[4] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[4], false, 5, 1, 0, 0);
+ _spiderFl = false;
+ _spiderTime = _game._player._priorTimer;
+ _scene->_dynamicHotspots.remove(_spiderHotspotId);
+}
+
+void Scene207::step() {
+ if (!_vultureFl)
+ moveVulture();
+
+ if (_spiderFl)
+ moveSpider();
+
+ if (_game._trigger == 70) {
+ _globals._sequenceIndexes[6] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[6], false, 10, 0, 0, 0);
+ _scene->_sequences.setAnimRange(_globals._sequenceIndexes[6], 23, 34);
+ _scene->_sequences.setDepth(_globals._sequenceIndexes[6], 6);
+ }
+
+ if (_game._trigger == 71)
+ _eyeFl = false;
+
+ if (_eyeFl)
+ return;
+
+ if ((_game._player._playerPos.x >= 124) && (_game._player._playerPos.x <= 201)) {
+ _globals._sequenceIndexes[7] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[7], false, 10, 1, 0, 0);
+ _globals._sequenceIndexes[8] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[8], false, 8, 1, 0, 0);
+ _scene->_sequences.setDepth(_globals._sequenceIndexes[7], 6);
+ _scene->_sequences.setDepth(_globals._sequenceIndexes[8], 6);
+ _scene->_sequences.addSubEntry(_globals._sequenceIndexes[7], SEQUENCE_TRIGGER_EXPIRE, 0, 71);
+ _eyeFl = true;
+ }
+}
+
+void Scene207::preActions() {
+ if (_action.isAction(VERB_WALK_DOWN, NOUN_PATH_TO_WEST))
+ _game._player._walkOffScreenSceneId = 211;
+
+ if (_action.isAction(VERB_WALK_TOWARDS, NOUN_OPEN_FIELD_TO_EAST))
+ _game._player._walkOffScreenSceneId = 208;
+
+ if (_action.isAction(VERB_WALKTO) || _action.isAction(VERB_LOOK)) {
+ if (_action.isObject(NOUN_VULTURE)) {
+ _vultureTime = -9999;
+ } else if (_action.isObject(NOUN_SPIDER)) {
+ _spiderTime = -9999;
+ }
+ }
+}
+
+void Scene207::actions() {
+ if (_action._savedFields._lookFlag)
+ _vm->_dialogs->show(20711);
+ else if (_action.isAction(VERB_WALK_THROUGH, NOUN_DOORWAY))
+ _scene->_nextSceneId = 214;
+ else {
+ if ((_game._player._playerPos.x > 150) && (_game._player._playerPos.x < 189) &&
+ (_game._player._playerPos.y > 111) && (_game._player._playerPos.y < 130)) {
+ if ((_game._player._playerPos.x <= 162) || (_game._player._playerPos.x >= 181) ||
+ (_game._player._playerPos.y <= 115) || (_game._player._playerPos.y >= 126)) {
+ _globals._sequenceIndexes[7] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[7], false, 10, 2, 0, 0);
+ _globals._sequenceIndexes[8] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[8], false, 8, 2, 0, 0);
+ _scene->_sequences.setDepth(_globals._sequenceIndexes[7], 6);
+ _scene->_sequences.setDepth(_globals._sequenceIndexes[8], 6);
+ }
+ } else if (_eyeFl) {
+ _scene->_sequences.remove(_globals._sequenceIndexes[7]);
+ _scene->_sequences.remove(_globals._sequenceIndexes[8]);
+ _eyeFl = false;
+ }
+
+ if (_action.isAction(VERB_LOOK, NOUN_DENSE_FOREST))
+ _vm->_dialogs->show(20701);
+ else if (_action.isAction(VERB_LOOK, NOUN_HEDGE))
+ _vm->_dialogs->show(20702);
+ else if (_action.isAction(VERB_LOOK, NOUN_SKULL_AND_CROSSBONES))
+ _vm->_dialogs->show(20703);
+ else if (_action.isAction(VERB_LOOK, NOUN_CAULDRON))
+ _vm->_dialogs->show(20704);
+ else if (_action.isAction(VERB_LOOK, NOUN_WITCHDOCTOR_HUT))
+ _vm->_dialogs->show(20705);
+ else if (_action.isAction(VERB_LOOK, NOUN_PATH_TO_WEST))
+ _vm->_dialogs->show(20706);
+ else if (_action.isAction(VERB_LOOK, NOUN_MOUNTAINS))
+ _vm->_dialogs->show(20707);
+ else if (_action.isAction(VERB_LOOK, NOUN_ALOE_PLANT))
+ _vm->_dialogs->show(20708);
+ else if (_action.isAction(VERB_LOOK, NOUN_LAWN))
+ _vm->_dialogs->show(20709);
+ else if (_action.isAction(VERB_LOOK, NOUN_VULTURE))
+ _vm->_dialogs->show(20710);
+ else if (_action.isAction(VERB_TAKE, NOUN_SKULL_AND_CROSSBONES))
+ _vm->_dialogs->show(20712);
+ else if (_action.isAction(VERB_TAKE, NOUN_ALOE_PLANT))
+ _vm->_dialogs->show(20713);
+ else if (_action.isAction(VERB_LOOK, NOUN_SPIDER))
+ _vm->_dialogs->show(20714);
+ else if (_action.isAction(VERB_TAKE, NOUN_SPIDER))
+ _vm->_dialogs->show(20715);
+ else
+ return;
+ }
+
+ _action._inProgress = false;
+}
+
+/*****************************************************************************/
+
+Scene208::Scene208(MADSEngine *vm) : Scene2xx(vm) {
+ _rhotundaTurnFl = false;
+ _boundingFl = false;
+ _rhotundaTime = 0;
+}
+
+void Scene208::synchronize(Common::Serializer &s) {
+ Scene2xx::synchronize(s);
+
+ s.syncAsByte(_rhotundaTurnFl);
+ s.syncAsByte(_boundingFl);
+ s.syncAsSint32LE(_rhotundaTime);
+}
+
+void Scene208::setup() {
+ setPlayerSpritesPrefix();
+ setAAName();
+ _scene->addActiveVocab(NOUN_HUGE_LEGS);
+ _scene->addActiveVocab(NOUN_LEAF_COVERED_PIT);
+ _scene->addActiveVocab(NOUN_PILE_OF_LEAVES);
+ _scene->addActiveVocab(VERB_WALKTO);
+}
+
+void Scene208::updateTrap() {
+ if (_globals[kRhotundaStatus] == 1) {
+ _globals._sequenceIndexes[1] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[1], false, 8, 0, 0, 24);
+ _scene->_sequences.setDepth(_globals._sequenceIndexes[1], 5);
+ int idx = _scene->_dynamicHotspots.add(NOUN_HUGE_LEGS, VERB_WALKTO, _globals._sequenceIndexes[1], Common::Rect(0, 0, 0, 0));
+ _scene->_dynamicHotspots.setPosition(idx, Common::Point(100, 146), FACING_NORTH);
+ _scene->_hotspots.activate(414, false);
+ return;
+ }
+
+ switch (_globals[kLeavesStatus]) {
+ case 0: {
+ _globals._sequenceIndexes[2] = _scene->_sequences.startCycle(_globals._spriteIndexes[2], false, 1);
+ _scene->_sequences.setDepth(_globals._sequenceIndexes[2], 15);
+ int idx = _scene->_dynamicHotspots.add(NOUN_PILE_OF_LEAVES, VERB_WALKTO, _globals._sequenceIndexes[2], Common::Rect(0, 0, 0, 0));
+ _scene->_dynamicHotspots.setPosition(idx, Common::Point(60, 152), FACING_NORTH);
+ }
+ break;
+ case 2: {
+ _scene->_sequences.setDepth(_globals._sequenceIndexes[3], 15);
+ _globals._sequenceIndexes[3] = _scene->_sequences.startCycle(_globals._spriteIndexes[3], false, 1);
+ _scene->_hotspots.activate(NOUN_DEEP_PIT, false);
+ int idx = _scene->_dynamicHotspots.add(NOUN_LEAF_COVERED_PIT, VERB_WALKTO, _globals._sequenceIndexes[2], Common::Rect(0, 0, 0, 0));
+ _scene->_dynamicHotspots.setPosition(idx, Common::Point(100, 146), FACING_NORTH);
+ _scene->_dynamicHotspots[idx]._articleNumber = PREP_ON;
+ }
+ break;
+ }
+}
+
+void Scene208::enter() {
+ _globals._spriteIndexes[1] = _scene->_sprites.addSprites(formAnimName('a', 1));
+ _globals._spriteIndexes[2] = _scene->_sprites.addSprites(formAnimName('x', 0));
+ _globals._spriteIndexes[3] = _scene->_sprites.addSprites(formAnimName('x', 1));
+ _globals._spriteIndexes[4] = _scene->_sprites.addSprites(formAnimName('x', 2));
+ _globals._spriteIndexes[5] = _scene->_sprites.addSprites("*RXMBD_8");
+
+ updateTrap();
+
+ _rhotundaTurnFl = false;
+ _boundingFl = false;
+ _scene->_kernelMessages._talkFont = _vm->_font->getFont(FONT_INTERFACE);
+ _scene->_textSpacing = 0;
+
+ if (_scene->_priorSceneId == 207) {
+ _game._player._playerPos = Common::Point(8, 122);
+ _game._player._facing = FACING_EAST;
+ } else if (_scene->_priorSceneId == 203) {
+ _game._player._playerPos = Common::Point(142, 108);
+ _game._player._facing = FACING_SOUTH;
+ } else if (_scene->_priorSceneId == 209) {
+ _game._player._playerPos = Common::Point(307, 123);
+ _game._player._facing = FACING_WEST;
+ } else if (_scene->_priorSceneId != -2) {
+ _game._player._playerPos = Common::Point(162, 149);
+ _game._player._facing = FACING_NORTH;
+ }
+
+ _game.loadQuoteSet(0x81, 0x46, 0);
+
+ if ((_scene->_priorSceneId == 207) && (_globals[kMonkeyStatus] == MONKEY_HAS_BINOCULARS)) {
+ int msgIndex = _scene->_kernelMessages.add(Common::Point(0, 0), 0x1110, 34, 0, 120, _game.getQuote(129));
+ _scene->_kernelMessages.setQuoted(msgIndex, 4, true);
+ }
+
+ _vm->_palette->setEntry(16, 0, 0, 63);
+ _vm->_palette->setEntry(17, 0, 0, 45);
+ sceneEntrySound();
+}
+
+void Scene208::step() {
+ if (_boundingFl && (_rhotundaTime <= _scene->_activeAnimation->getCurrentFrame())) {
+ _rhotundaTime = _scene->_activeAnimation->getCurrentFrame();
+
+ if (_rhotundaTime == 125)
+ _scene->_sequences.remove(_globals._sequenceIndexes[4]);
+ }
+
+ if (!_rhotundaTurnFl)
+ return;
+
+ if ((_game._player._playerPos != Common::Point(20, 148)) || (_game._player._facing != FACING_EAST))
+ return;
+
+ if ((_game._trigger == 0) && _boundingFl)
+ return;
+
+ _boundingFl = true;
+
+ switch (_game._trigger) {
+ case 0:
+ _scene->loadAnimation(formAnimName('A', -1), 81);
+ _rhotundaTime = 0;
+ break;
+ case 81:
+ _scene->_sequences.remove(_globals._spriteIndexes[15]);
+ _globals[kRhotundaStatus] = 1;
+ updateTrap();
+ _scene->_sequences.addTimer(90, 82);
+ break;
+ case 82:
+ _game._player._stepEnabled = true;
+ break;
+ }
+}
+
+void Scene208::preActions() {
+ Player &player = _vm->_game->_player;
+
+ if (_action.isAction(VERB_LOOK) && player._readyToWalk)
+ player._needToWalk = true;
+
+ if (_action.isAction(VERB_WALK_TOWARDS, NOUN_GRASSLAND_TO_EAST))
+ player._walkOffScreenSceneId = 209;
+
+ if (_action.isAction(VERB_WALK_TOWARDS, NOUN_OPEN_AREA_TO_WEST))
+ player._walkOffScreenSceneId = 207;
+}
+
+void Scene208::subAction(int mode) {
+
+ switch (_game._trigger) {
+ case 0: {
+ _game._player._stepEnabled = false;
+ _game._player._visible = false;
+ _globals._sequenceIndexes[5] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[5], false, 6, 1, 0, 0);
+ _scene->_sequences.setMsgLayout(_globals._sequenceIndexes[5]);
+
+ int abortVal;
+ if ((mode == 1) || (mode == 2))
+ abortVal = 1;
+ else
+ abortVal = 2;
+
+ _scene->_sequences.addSubEntry(_globals._sequenceIndexes[5], SEQUENCE_TRIGGER_EXPIRE, 0, abortVal);
+ }
+ break;
+ case 1: {
+ int oldVal = _globals._sequenceIndexes[5];
+ _globals._sequenceIndexes[5] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[6], false, 12, 3, 0, 0);
+ _scene->_sequences.setAnimRange(_globals._sequenceIndexes[5], 3, 4);
+ _scene->_sequences.setMsgLayout(_globals._sequenceIndexes[5]);
+ _scene->_sequences.updateTimeout(_globals._sequenceIndexes[5], oldVal);
+ _scene->_sequences.addSubEntry(_globals._sequenceIndexes[5], SEQUENCE_TRIGGER_EXPIRE, 0, 2);
+ _vm->_sound->command(20);
+ }
+ break;
+
+ case 2: {
+ switch (mode) {
+ case 1:
+ _game._objects.addToInventory(OBJ_BIG_LEAVES);
+ _scene->_sequences.remove(_globals._sequenceIndexes[2]);
+ _globals[kLeavesStatus] = 1;
+ break;
+
+ case 2:
+ _game._objects.setRoom(OBJ_BIG_LEAVES, 1);
+ _globals[kLeavesStatus] = 2;
+ updateTrap();
+ break;
+
+ case 3:
+ _scene->_sequences.remove(_globals._sequenceIndexes[3]);
+ _globals._sequenceIndexes[4] = _scene->_sequences.startCycle(_globals._spriteIndexes[4], false, 1);
+ _game._objects.removeFromInventory(OBJ_TWINKIFRUIT, 1);
+ _vm->_sound->command(34);
+ break;
+
+ case 4:
+ _game._objects.removeFromInventory(OBJ_BURGER, 1);
+ _vm->_sound->command(33);
+ break;
+
+ case 5:
+ _game._objects.removeFromInventory(OBJ_DEAD_FISH, 1);
+ _vm->_sound->command(33);
+ break;
+
+ default:
+ break;
+ }
+
+ int oldVal = _globals._sequenceIndexes[5];
+ _globals._sequenceIndexes[5] = _scene->_sequences.addReverseSpriteCycle(_globals._spriteIndexes[5], false, 6, 1, 0, 0);
+ _scene->_sequences.setAnimRange(_globals._sequenceIndexes[5], 1, 3);
+ _scene->_sequences.setMsgLayout(_globals._sequenceIndexes[5]);
+ _scene->_sequences.updateTimeout(_globals._sequenceIndexes[5], oldVal);
+ _scene->_sequences.addSubEntry(_globals._sequenceIndexes[5], SEQUENCE_TRIGGER_EXPIRE, 0, 3);
+ }
+ break;
+
+ case 3:
+ _game._player._visible = true;
+ _game._player._stepEnabled = true;
+ break;
+
+ default:
+ break;
+ }
+}
+
+void Scene208::actions() {
+ if (_action.isAction(VERB_WALK_TOWARDS, NOUN_LOWLANDS_TO_NORTH)) {
+ if (_globals[kRhotundaStatus])
+ _scene->_nextSceneId = 203;
+ else if (_game._trigger == 0) {
+ _game._player._stepEnabled = false;
+ int msgIndex = _scene->_kernelMessages.add(Common::Point(0, 0), 0x1110, 34, 1, 120, _game.getQuote(70));
+ _scene->_kernelMessages.setQuoted(msgIndex, 4, true);
+ } else if (_game._trigger == 1)
+ _scene->_nextSceneId = 203;
+ } else if (_action.isAction(VERB_WALK_TOWARDS, NOUN_FIELD_TO_SOUTH))
+ _scene->_nextSceneId = 212;
+ else if (_action.isAction(VERB_TAKE, NOUN_PILE_OF_LEAVES) && (!_globals[kLeavesStatus] || _game._trigger)) {
+ subAction(1);
+ if (_game._player._stepEnabled)
+ _vm->_dialogs->showItem(OBJ_BIG_LEAVES, 0x326, 0);
+ } else if (_action.isAction(VERB_PUT, NOUN_BIG_LEAVES, NOUN_DEEP_PIT) && (_globals[kLeavesStatus] == 1 || _game._trigger))
+ subAction(2);
+ else if (_action.isAction(VERB_PUT, NOUN_TWINKIFRUIT, NOUN_LEAF_COVERED_PIT)) {
+ subAction(3);
+ if (_game._player._stepEnabled) {
+ _game._player._stepEnabled = false;
+ _rhotundaTurnFl = true;
+ _game._player.walk(Common::Point(20, 148), FACING_EAST);
+ }
+ } else if (_action.isAction(VERB_PUT, NOUN_BURGER, NOUN_LEAF_COVERED_PIT)) {
+ subAction(4);
+ if (_game._player._stepEnabled)
+ _vm->_dialogs->show(20812);
+ } else if (_action.isAction(VERB_PUT, NOUN_DEAD_FISH, NOUN_LEAF_COVERED_PIT)) {
+ subAction(5);
+ if (_game._player._stepEnabled)
+ _vm->_dialogs->show(20812);
+ } else if (_action.isAction(VERB_LOOK, NOUN_CUMULOUS_CLOUD))
+ _vm->_dialogs->show(20801);
+ else if (_action.isAction(VERB_LOOK, NOUN_OPEN_AREA_TO_WEST))
+ _vm->_dialogs->show(20802);
+ else if (_action.isAction(VERB_LOOK, NOUN_THORNY_BUSH))
+ _vm->_dialogs->show(20803);
+ else if (_action.isAction(VERB_LOOK, NOUN_ROCKS))
+ _vm->_dialogs->show(20804);
+ else if (_action.isAction(VERB_LOOK, NOUN_SMALL_CACTUS))
+ _vm->_dialogs->show(20805);
+ else if (_action.isAction(VERB_TAKE, NOUN_SMALL_CACTUS))
+ _vm->_dialogs->show(20806);
+ else if (_action.isAction(VERB_LOOK, NOUN_GRASSLAND_TO_EAST))
+ _vm->_dialogs->show(20807);
+ else if (_action.isAction(VERB_LOOK, NOUN_DEEP_PIT))
+ _vm->_dialogs->show(20808);
+ else if (_action.isAction(VERB_LOOK, NOUN_PILE_OF_LEAVES))
+ _vm->_dialogs->show(20809);
+ else if (_action.isAction(VERB_LOOK, NOUN_LEAF_COVERED_PIT)) {
+ if (_game._difficulty == DIFFICULTY_EASY)
+ _vm->_dialogs->show(20810);
+ else
+ _vm->_dialogs->show(20811);
+ } else if (_action.isAction(VERB_LOOK, NOUN_TREE) || _action.isAction(VERB_LOOK, NOUN_TREES))
+ _vm->_dialogs->show(20813);
+ else if (_action.isAction(VERB_TAKE, NOUN_LEAF_COVERED_PIT))
+ _vm->_dialogs->show(20814);
+ else if (_action.isAction(VERB_LOOK, NOUN_HUGE_LEGS))
+ _vm->_dialogs->show(20815);
+ else if (_action.isAction(VERB_TAKE, NOUN_HUGE_LEGS) || _action.isAction(VERB_PULL, NOUN_HUGE_LEGS))
+ _vm->_dialogs->show(20816);
+ else if (_action._savedFields._lookFlag && (_globals[kRhotundaStatus] == 1))
+ _vm->_dialogs->show(20819);
+ else if (_action._savedFields._lookFlag && (_globals[kLeavesStatus] == 2))
+ _vm->_dialogs->show(20818);
+ else if (_action._savedFields._lookFlag)
+ _vm->_dialogs->show(20817);
+ else
+ return;
+
+ _action._inProgress = false;
+}
+
+/*****************************************************************************/
+
+Scene209::Scene209(MADSEngine *vm) : Scene2xx(vm) {
+ _dodgeFl = false;
+ _forceDodgeFl = false;
+ _pitchFl = false;
+ _fallFl = false;
+ _forceFallFl = false;
+ _playingAnimFl = false;
+ _shouldFallFl = false;
+ _shouldDodgeFl = false;
+ _monkeyPosition = 0;
+ _counter = 0;
+ _pauseMode = 0;
+ _binocularsDroppedFl = false;
+ _startShootingInTimerFl = false;
+ _dialogAbortVal = 0;
+ _playingDialogFl = false;
+ _shootMissedLastFl = false;
+ _removeMonkeyFl = false;
+ _shootReadyFl = false;
+ _pauseCounterThreshold = 0;
+ _pauseCounter = 0;
+}
+
+void Scene209::synchronize(Common::Serializer &s) {
+ Scene2xx::synchronize(s);
+
+ s.syncAsByte(_dodgeFl);
+ s.syncAsByte(_forceDodgeFl);
+ s.syncAsByte(_shouldDodgeFl);
+ s.syncAsByte(_pitchFl);
+ s.syncAsByte(_fallFl);
+ s.syncAsByte(_forceFallFl);
+ s.syncAsByte(_shouldFallFl);
+ s.syncAsByte(_playingAnimFl);
+ s.syncAsByte(_playingDialogFl);
+
+ s.syncAsSint32LE(_pauseMode);
+ s.syncAsSint32LE(_pauseCounterThreshold);
+ s.syncAsSint32LE(_pauseCounter);
+
+ s.syncAsByte(_removeMonkeyFl);
+
+ s.syncAsSint32LE(_monkeyPosition);
+
+ s.syncAsByte(_shootReadyFl);
+ s.syncAsByte(_startShootingInTimerFl);
+ s.syncAsByte(_shootMissedLastFl);
+ s.syncAsByte(_binocularsDroppedFl);
+
+ s.syncAsSint32LE(_dialogAbortVal);
+ s.syncAsSint32LE(_counter);
+}
+
+void Scene209::setup() {
+ setPlayerSpritesPrefix();
+ setAAName();
+ _scene->addActiveVocab(NOUN_PLANT_STALK);
+}
+
+void Scene209::handlePause() {
+ switch (_game._trigger) {
+ case 124:
+ if (++_pauseCounter <= _pauseCounterThreshold)
+ _scene->_sequences.addTimer(60, 124);
+ else
+ _pauseMode = 0;
+ break;
+ }
+}
+
+void Scene209::initPauseCounterThreshold() {
+ switch (_game._trigger) {
+ case 226:
+ _scene->_sequences.addTimer(1, 124);
+ _pauseCounterThreshold = _vm->getRandomNumber(7,12);
+ _pauseMode = 2;
+ _pauseCounter = 0;
+ break;
+ }
+}
+
+void Scene209::handlePeek() {
+ switch (_game._trigger) {
+ case 133:
+ _vm->_sound->command(18);
+ _globals._sequenceIndexes[3] = _scene->_sequences.addReverseSpriteCycle(_globals._spriteIndexes[3], false, 8, 1, 0, 0);
+ _scene->_sequences.setAnimRange(_globals._sequenceIndexes[3], 51, 52);
+ _scene->_sequences.addSubEntry(_globals._sequenceIndexes[3], SEQUENCE_TRIGGER_EXPIRE, 0, 134);
+ break;
+
+ case 134: {
+ int oldIdx = _globals._sequenceIndexes[3];
+ _globals._sequenceIndexes[3] = _scene->_sequences.startCycle(_globals._spriteIndexes[3], false, 6);
+ _scene->_sequences.updateTimeout(_globals._sequenceIndexes[3], oldIdx);
+ _scene->_sequences.addTimer(60, 135);
+ }
+ break;
+
+ case 135:
+ _scene->_sequences.remove(_globals._sequenceIndexes[3]);
+ _globals._sequenceIndexes[3] = _scene->_sequences.startCycle(_globals._spriteIndexes[3], false, 7);
+ _scene->_sequences.addTimer(10, 136);
+ break;
+
+ case 136:
+ _scene->_sequences.remove(_globals._sequenceIndexes[3]);
+ _globals._sequenceIndexes[3] = _scene->_sequences.startCycle(_globals._spriteIndexes[3], false, 6);
+ _scene->_sequences.addTimer(50, 137);
+ break;
+
+ case 137:
+ _scene->_sequences.remove(_globals._sequenceIndexes[3]);
+ _globals._sequenceIndexes[3] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[3], false, 8, 1, 0, 0);
+ _scene->_sequences.setAnimRange(_globals._sequenceIndexes[3], 51, 52);
+ _scene->_sequences.addSubEntry(_globals._sequenceIndexes[3], SEQUENCE_TRIGGER_EXPIRE, 0, 138);
+ break;
+
+ case 138:
+ _pauseMode = 1;
+ _scene->_hotspots.activate(227, false);
+ _playingAnimFl = false;
+ break;
+ }
+}
+
+void Scene209::handleVerticalMove() {
+ switch (_game._trigger) {
+ case 140:
+ _globals._sequenceIndexes[3] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[3], false, 8, 8, 0, 1);
+ _scene->_sequences.setAnimRange(_globals._sequenceIndexes[3], 1, 5);
+ _scene->_sequences.addSubEntry(_globals._sequenceIndexes[3], SEQUENCE_TRIGGER_EXPIRE, 0, 141);
+ break;
+
+ case 141: {
+ _vm->_sound->command(18);
+ int oldIdx = _globals._sequenceIndexes[3];
+ _globals._sequenceIndexes[3] = _scene->_sequences.startCycle(_globals._spriteIndexes[3], false, 5);
+ _scene->_sequences.updateTimeout(_globals._sequenceIndexes[3], oldIdx);
+ _scene->_sequences.addTimer(60, 142);
+ }
+ break;
+
+ case 142:
+ _scene->_sequences.remove(_globals._sequenceIndexes[3]);
+ _globals._sequenceIndexes[3] = _scene->_sequences.addReverseSpriteCycle(_globals._spriteIndexes[3], false, 8, 1, 0, 0);
+ _scene->_sequences.setAnimRange(_globals._sequenceIndexes[3], 1, 5);
+ _scene->_sequences.addSubEntry(_globals._sequenceIndexes[3], SEQUENCE_TRIGGER_EXPIRE, 0, 143);
+ break;
+
+ case 143:
+ _pauseMode = 1;
+ _playingAnimFl = false;
+ _scene->_hotspots.activate(227, false);
+ break;
+ }
+}
+
+void Scene209::handleLookStay() {
+ switch (_game._trigger) {
+ case 145:
+ _vm->_sound->command(18);
+ _monkeyPosition = 2;
+ _globals._sequenceIndexes[3] = _scene->_sequences.addReverseSpriteCycle(_globals._spriteIndexes[3], false, 8, 1, 0, 0);
+ _scene->_sequences.setAnimRange(_globals._sequenceIndexes[3], 51, 52);
+ _scene->_sequences.addSubEntry(_globals._sequenceIndexes[3], SEQUENCE_TRIGGER_EXPIRE, 0, 146);
+ break;
+
+ case 146: {
+ int oldIdx = _globals._sequenceIndexes[3];
+ _globals._sequenceIndexes[3] = _scene->_sequences.startCycle(_globals._spriteIndexes[3], false, 6);
+ _scene->_sequences.updateTimeout(_globals._sequenceIndexes[3], oldIdx);
+ _scene->_sequences.addTimer(15, 147);
+ }
+ break;
+
+ case 147:
+ _scene->_sequences.remove(_globals._sequenceIndexes[3]);
+ _globals._sequenceIndexes[3] = _scene->_sequences.startCycle(_globals._spriteIndexes[3], false, 7);
+ _scene->_sequences.addTimer(8, 148);
+ break;
+
+ case 148:
+ _scene->_sequences.remove(_globals._sequenceIndexes[3]);
+ _globals._sequenceIndexes[3] = _scene->_sequences.startCycle(_globals._spriteIndexes[3], false, 6);
+
+ if (!_dodgeFl) {
+ _scene->_sequences.addTimer(90, 149);
+ } else {
+ _scene->_sequences.addTimer(1, 149);
+ _shouldDodgeFl = true;
+ }
+ break;
+
+ case 149:
+ _playingAnimFl = false;
+ break;
+ }
+}
+
+void Scene209::handleLookRight() {
+ switch (_game._trigger) {
+ case 151:
+ _scene->_sequences.remove(_globals._sequenceIndexes[3]);
+ _globals._sequenceIndexes[3] = _scene->_sequences.startReverseCycle(_globals._spriteIndexes[3], false, 8, 2, 0, 0);
+ _scene->_sequences.setAnimRange(_globals._sequenceIndexes[3], 8, 14);
+ _scene->_sequences.addSubEntry(_globals._sequenceIndexes[3], SEQUENCE_TRIGGER_EXPIRE, 0, 152);
+ break;
+
+ case 152: {
+ int oldIdx = _globals._sequenceIndexes[3];
+ _globals._sequenceIndexes[3] = _scene->_sequences.startCycle(_globals._spriteIndexes[3], false, 6);
+ _scene->_sequences.updateTimeout(_globals._sequenceIndexes[3], oldIdx);
+ _scene->_sequences.addTimer(60, 153);
+ }
+ break;
+
+ case 153:
+ _playingAnimFl = false;
+ if (_dodgeFl)
+ _shouldDodgeFl = true;
+ break;
+ }
+}
+
+void Scene209::handleBlink() {
+ switch (_game._trigger) {
+ case 155:
+ _scene->_sequences.remove(_globals._sequenceIndexes[3]);
+ _globals._sequenceIndexes[3] = _scene->_sequences.startCycle(_globals._spriteIndexes[3], false, 6);
+ _scene->_sequences.addTimer(50, 156);
+ break;
+
+ case 156:
+ _scene->_sequences.remove(_globals._sequenceIndexes[3]);
+ _globals._sequenceIndexes[3] = _scene->_sequences.startCycle(_globals._spriteIndexes[3], false, 7);
+ _scene->_sequences.addTimer(10, 157);
+ break;
+
+ case 157:
+ _scene->_sequences.remove(_globals._sequenceIndexes[3]);
+ _globals._sequenceIndexes[3] = _scene->_sequences.startCycle(_globals._spriteIndexes[3], false, 6);
+ _scene->_sequences.addTimer(50, 158);
+ break;
+
+ case 158:
+ _playingAnimFl = false;
+ if (_dodgeFl)
+ _shouldDodgeFl = true;
+ break;
+ }
+}
+
+void Scene209::handleGetBinoculars() {
+ switch (_game._trigger) {
+ case 161:
+ _vm->_sound->command(18);
+ _monkeyPosition = 3;
+ _scene->_sequences.remove(_globals._sequenceIndexes[3]);
+ _globals._sequenceIndexes[3] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[3], false, 8, 1, 0, 0);
+ _scene->_sequences.setAnimRange(_globals._sequenceIndexes[3], 8, 24);
+ _scene->_sequences.addSubEntry(_globals._sequenceIndexes[3], SEQUENCE_TRIGGER_SPRITE, 20, 165);
+ if (!_fallFl && !_dodgeFl) {
+ _scene->_sequences.addSubEntry(_globals._sequenceIndexes[3], SEQUENCE_TRIGGER_EXPIRE, 0, 162);
+ } else {
+ _scene->_sequences.addSubEntry(_globals._sequenceIndexes[3], SEQUENCE_TRIGGER_EXPIRE, 0, 163);
+ }
+ break;
+
+ case 162: {
+ int oldIdx = _globals._sequenceIndexes[3];
+ _globals._sequenceIndexes[3] = _scene->_sequences.startReverseCycle(_globals._spriteIndexes[3], false, 8, 6, 0, 0);
+ _scene->_sequences.setAnimRange(_globals._sequenceIndexes[3], 23, 25);
+ _scene->_sequences.updateTimeout(_globals._sequenceIndexes[3], oldIdx);
+ _scene->_sequences.addSubEntry(_globals._sequenceIndexes[3], SEQUENCE_TRIGGER_EXPIRE, 0, 163);
+ }
+ break;
+
+ case 163: {
+ int oldIdx = _globals._sequenceIndexes[3];
+ _globals._sequenceIndexes[3] = _scene->_sequences.startReverseCycle(_globals._spriteIndexes[3], false, 8, 0, 0, 0);
+ _scene->_sequences.setAnimRange(_globals._sequenceIndexes[3], 23, 24);
+ _scene->_sequences.updateTimeout(_globals._sequenceIndexes[3], oldIdx);
+ _scene->_sequences.addTimer(8, 164);
+ }
+ break;
+
+ case 164:
+ _playingAnimFl = false;
+ if (_fallFl)
+ _shouldFallFl = true;
+ break;
+
+ case 165:
+ _vm->_sound->command(18);
+ break;
+ }
+}
+
+void Scene209::handleBinocularBlink() {
+ switch (_game._trigger) {
+ case 167: {
+ int oldIdx = _globals._sequenceIndexes[3];
+ _scene->_sequences.remove(_globals._sequenceIndexes[3]);
+ _globals._sequenceIndexes[3] = _scene->_sequences.startReverseCycle(_globals._spriteIndexes[3], false, 8, 2, 0, 0);
+ _scene->_sequences.setAnimRange(_globals._sequenceIndexes[3], 23, 25);
+ _scene->_sequences.updateTimeout(_globals._sequenceIndexes[3], oldIdx);
+ _scene->_sequences.addSubEntry(_globals._sequenceIndexes[3], SEQUENCE_TRIGGER_EXPIRE, 0, 168);
+ }
+ break;
+
+ case 168: {
+ int oldIdx = _globals._sequenceIndexes[3];
+ _globals._sequenceIndexes[3] = _scene->_sequences.startReverseCycle(_globals._spriteIndexes[3], false, 8, 0, 0, 0);
+ _scene->_sequences.setAnimRange(_globals._sequenceIndexes[3], 23, 24);
+ _scene->_sequences.updateTimeout(_globals._sequenceIndexes[3], oldIdx);
+ _scene->_sequences.addTimer(30, 169);
+ }
+ break;
+
+ case 169:
+ _playingAnimFl = false;
+ if (_fallFl)
+ _shouldFallFl = true;
+ break;
+ }
+}
+
+void Scene209::handleBinocularScan() {
+ switch (_game._trigger) {
+ case 171: {
+ int oldIdx = _globals._sequenceIndexes[3];
+ _scene->_sequences.remove(_globals._sequenceIndexes[3]);
+ _globals._sequenceIndexes[3] = _scene->_sequences.startReverseCycle(_globals._spriteIndexes[3], false, 12, 2, 0, 0);
+ _scene->_sequences.setAnimRange(_globals._sequenceIndexes[3], 43, 45);
+ _scene->_sequences.updateTimeout(_globals._sequenceIndexes[3], oldIdx);
+ _scene->_sequences.addSubEntry(_globals._sequenceIndexes[3], SEQUENCE_TRIGGER_EXPIRE, 0, 172);
+ }
+ break;
+
+ case 172: {
+ int oldIdx = _globals._sequenceIndexes[3];
+ int randAction = _vm->getRandomNumber(1,2);
+ switch (randAction) {
+ case 1:
+ _globals._sequenceIndexes[3] = _scene->_sequences.startReverseCycle(_globals._spriteIndexes[3], false, 12, 2, 0, 0);
+ break;
+ case 2:
+ _globals._sequenceIndexes[3] = _scene->_sequences.startReverseCycle(_globals._spriteIndexes[3], false, 12, 4, 0, 0);
+ break;
+ }
+ _scene->_sequences.setAnimRange(_globals._sequenceIndexes[3], 23, 25);
+ _scene->_sequences.updateTimeout(_globals._sequenceIndexes[3], oldIdx);
+ _scene->_sequences.addSubEntry(_globals._sequenceIndexes[3], SEQUENCE_TRIGGER_EXPIRE, 0, 173);
+ }
+ break;
+
+ case 173: {
+ int oldIdx = _globals._sequenceIndexes[3];
+ _globals._sequenceIndexes[3] = _scene->_sequences.startReverseCycle(_globals._spriteIndexes[3], false, 12, 2, 0, 0);
+ _scene->_sequences.setAnimRange(_globals._sequenceIndexes[3], 26, 30);
+ _scene->_sequences.updateTimeout(_globals._sequenceIndexes[3], oldIdx);
+ _scene->_sequences.addSubEntry(_globals._sequenceIndexes[3], SEQUENCE_TRIGGER_EXPIRE, 0, 174);
+ }
+ break;
+
+ case 174: {
+ int oldIdx = _globals._sequenceIndexes[3];
+ _globals._sequenceIndexes[3] = _scene->_sequences.startReverseCycle(_globals._spriteIndexes[3], false, 12, 0, 0, 0);
+ _scene->_sequences.setAnimRange(_globals._sequenceIndexes[3], 23, 24);
+ _scene->_sequences.updateTimeout(_globals._sequenceIndexes[3], oldIdx);
+ _scene->_sequences.addTimer(60, 175);
+ }
+ break;
+
+ case 175:
+ _playingAnimFl = false;
+ if (_fallFl)
+ _shouldFallFl = true;
+ break;
+ }
+}
+
+void Scene209::handleJumpInTree() {
+ switch (_game._trigger) {
+ case 178: {
+ int oldIdx = 0;
+ _monkeyPosition = 1;
+ if (_removeMonkeyFl)
+ _scene->_sequences.remove(_globals._sequenceIndexes[3]);
+ else
+ oldIdx = _globals._sequenceIndexes[3];
+
+ _globals._sequenceIndexes[3] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[3], false, 8, 1, 0, 0);
+ _scene->_sequences.setAnimRange(_globals._sequenceIndexes[3], 46, 49);
+ if (!_removeMonkeyFl)
+ _scene->_sequences.updateTimeout(_globals._sequenceIndexes[3], oldIdx);
+
+ _scene->_sequences.addSubEntry(_globals._sequenceIndexes[3], SEQUENCE_TRIGGER_EXPIRE, 0, 179);
+ }
+ break;
+
+ case 179: {
+ _vm->_sound->command(18);
+ int oldIdx = _globals._sequenceIndexes[3];
+ _globals._sequenceIndexes[3] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[3], false, 8, 1, 0, 0);
+ _scene->_sequences.setAnimRange(_globals._sequenceIndexes[3], 53, 61);
+ _scene->_sequences.updateTimeout(_globals._sequenceIndexes[3], oldIdx);
+ _scene->_sequences.addSubEntry(_globals._sequenceIndexes[3], SEQUENCE_TRIGGER_EXPIRE, 0, 180);
+ }
+ break;
+
+ case 180:
+ _removeMonkeyFl = true;
+ _pauseMode = 1;
+ _playingAnimFl = false;
+ _scene->_hotspots.activate(227, false);
+ break;
+ }
+}
+
+void Scene209::handleTongue() {
+ switch (_game._trigger) {
+ case 182: {
+ int oldIdx = _globals._sequenceIndexes[3];
+ _scene->_sequences.remove(_globals._sequenceIndexes[3]);
+ _globals._sequenceIndexes[3] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[3], false, 12, 1, 0, 0);
+ _scene->_sequences.setAnimRange(_globals._sequenceIndexes[3], 26, 30);
+ _scene->_sequences.updateTimeout(_globals._sequenceIndexes[3], oldIdx);
+ _scene->_sequences.addSubEntry(_globals._sequenceIndexes[3], SEQUENCE_TRIGGER_EXPIRE, 0, 183);
+ }
+ break;
+
+ case 183: {
+ int oldIdx = _globals._sequenceIndexes[3];
+ _globals._sequenceIndexes[3] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[3], false, 12, 1, 0, 0);
+ _scene->_sequences.setAnimRange(_globals._sequenceIndexes[3], 31, 33);
+ _scene->_sequences.updateTimeout(_globals._sequenceIndexes[3], oldIdx);
+ _scene->_sequences.addSubEntry(_globals._sequenceIndexes[3], SEQUENCE_TRIGGER_EXPIRE, 0, 184);
+ }
+ break;
+
+ case 184: {
+ int oldIdx = _globals._sequenceIndexes[3];
+ _globals._sequenceIndexes[3] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[3], false, 12, 1, 0, 0);
+ _scene->_sequences.setAnimRange(_globals._sequenceIndexes[3], 36, 37);
+ _scene->_sequences.updateTimeout(_globals._sequenceIndexes[3], oldIdx);
+ _scene->_sequences.addSubEntry(_globals._sequenceIndexes[3], SEQUENCE_TRIGGER_EXPIRE, 0, 185);
+ }
+ break;
+
+ case 185: {
+ _vm->_sound->command(18);
+ int oldIdx = _globals._sequenceIndexes[3];
+ _globals._sequenceIndexes[3] = _scene->_sequences.startReverseCycle(_globals._spriteIndexes[3], false, 6, 20, 0, 0);
+ _scene->_sequences.setAnimRange(_globals._sequenceIndexes[3], 38, 39);
+ _scene->_sequences.updateTimeout(_globals._sequenceIndexes[3], oldIdx);
+ _scene->_sequences.addSubEntry(_globals._sequenceIndexes[3], SEQUENCE_TRIGGER_EXPIRE, 0, 186);
+ }
+ break;
+
+ case 186: {
+ int oldIdx = _globals._sequenceIndexes[3];
+ _globals._sequenceIndexes[3] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[3], false, 12, 1, 0, 0);
+ _scene->_sequences.setAnimRange(_globals._sequenceIndexes[3], 40, 41);
+ _scene->_sequences.updateTimeout(_globals._sequenceIndexes[3], oldIdx);
+ _scene->_sequences.addSubEntry(_globals._sequenceIndexes[3], SEQUENCE_TRIGGER_EXPIRE, 0, 178);
+ _removeMonkeyFl = false;
+ }
+ break;
+ }
+}
+
+void Scene209::handleStandFromPeek() {
+ switch (_game._trigger) {
+ case 189:
+ _monkeyPosition = 4;
+ _scene->_sequences.remove(_globals._sequenceIndexes[3]);
+ _globals._sequenceIndexes[3] = _scene->_sequences.startCycle(_globals._spriteIndexes[3], false, 50);
+ _scene->_sequences.addTimer(8, 190);
+ break;
+
+ case 190:
+ _scene->_sequences.remove(_globals._sequenceIndexes[3]);
+ _globals._sequenceIndexes[3] = _scene->_sequences.startCycle(_globals._spriteIndexes[3], false, 6);
+ _scene->_sequences.addTimer(8, 191);
+ break;
+
+ case 191:
+ _scene->_sequences.remove(_globals._sequenceIndexes[3]);
+ _globals._sequenceIndexes[6] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[6], false, 8, 1, 0, 0);
+ _scene->_sequences.setAnimRange(_globals._sequenceIndexes[6], 1, 5);
+ _scene->_sequences.addSubEntry(_globals._sequenceIndexes[6], SEQUENCE_TRIGGER_EXPIRE, 0, 192);
+ break;
+
+ case 192: {
+ _vm->_sound->command(18);
+ int oldIdx = _globals._sequenceIndexes[6];
+ _globals._sequenceIndexes[5] = _scene->_sequences.startCycle(_globals._spriteIndexes[5], false, 1);
+ _scene->_sequences.updateTimeout(_globals._sequenceIndexes[5], oldIdx);
+ _scene->_sequences.addTimer(8, 193);
+ }
+ break;
+
+ case 193:
+ _scene->_sequences.remove(_globals._sequenceIndexes[5]);
+ _globals._sequenceIndexes[4] = _scene->_sequences.startCycle(_globals._spriteIndexes[4], false, 22);
+ _scene->_sequences.addTimer(5, 194);
+ break;
+
+ case 194:
+ _playingAnimFl = false;
+ _counter = 0;
+ break;
+ }
+}
+
+void Scene209::handleStandBlink() {
+ switch (_game._trigger) {
+ case 246:
+ _scene->_sequences.remove(_globals._sequenceIndexes[4]);
+ _globals._sequenceIndexes[4] = _scene->_sequences.startCycle(_globals._spriteIndexes[4], false, 22);
+ _scene->_sequences.addTimer(10, 247);
+ break;
+
+ case 247:
+ _scene->_sequences.remove(_globals._sequenceIndexes[4]);
+ _globals._sequenceIndexes[4] = _scene->_sequences.startCycle(_globals._spriteIndexes[4], false, 23);
+ _scene->_sequences.addTimer(8, 248);
+ break;
+
+ case 248:
+ _scene->_sequences.remove(_globals._sequenceIndexes[4]);
+ _globals._sequenceIndexes[4] = _scene->_sequences.startCycle(_globals._spriteIndexes[4], false, 22);
+ _scene->_sequences.addTimer(10, 249);
+ break;
+
+ case 249:
+ _playingAnimFl = false;
+ break;
+ }
+}
+
+void Scene209::handleJumpAndHide() {
+ switch (_game._trigger) {
+ case 196:
+ _vm->_sound->command(18);
+ _monkeyPosition = 1;
+ _scene->_sequences.remove(_globals._sequenceIndexes[4]);
+ _globals._sequenceIndexes[5] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[5], false, 8, 1, 0, 0);
+ _scene->_sequences.setAnimRange(_globals._sequenceIndexes[5], 1, 16);
+ _scene->_sequences.addSubEntry(_globals._sequenceIndexes[5], SEQUENCE_TRIGGER_EXPIRE, 0, 197);
+ break;
+
+ case 197:
+ _pauseMode = 1;
+ _scene->_hotspots.activate(227, false);
+ _playingAnimFl = false;
+ break;
+ }
+}
+
+void Scene209::handleMonkeyEating() {
+ switch (_game._trigger) {
+ case 199:
+ _vm->_sound->command(18);
+ _scene->_sequences.remove(_globals._sequenceIndexes[4]);
+ _globals._sequenceIndexes[4] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[4], false, 10, 1, 0, 0);
+ _scene->_sequences.setAnimRange(_globals._sequenceIndexes[4], 1, 14);
+ _scene->_sequences.addSubEntry(_globals._sequenceIndexes[4], SEQUENCE_TRIGGER_EXPIRE, 0, 200);
+ break;
+
+ case 200: {
+ int oldIdx = _globals._sequenceIndexes[4];
+ _globals._sequenceIndexes[4] = _scene->_sequences.startReverseCycle(_globals._spriteIndexes[4], false, 10, 10, 0, 0);
+ _scene->_sequences.setAnimRange(_globals._sequenceIndexes[4], 15, 16);
+ _scene->_sequences.updateTimeout(_globals._sequenceIndexes[4], oldIdx);
+ _scene->_sequences.addSubEntry(_globals._sequenceIndexes[4], SEQUENCE_TRIGGER_EXPIRE, 0, 201);
+ }
+ break;
+
+ case 201: {
+ int oldIdx = _globals._sequenceIndexes[4];
+ _globals._sequenceIndexes[4] = _scene->_sequences.startCycle(_globals._spriteIndexes[4], false, 12);
+ _scene->_sequences.updateTimeout(_globals._sequenceIndexes[4], oldIdx);
+ _scene->_sequences.addTimer(20, 202);
+ }
+ break;
+
+ case 202:
+ _scene->_sequences.remove(_globals._sequenceIndexes[4]);
+ _globals._sequenceIndexes[4] = _scene->_sequences.startCycle(_globals._spriteIndexes[4], false, 19);
+ _scene->_sequences.addTimer(20, 203);
+ break;
+
+ case 203:
+ _scene->_sequences.remove(_globals._sequenceIndexes[4]);
+ _globals._sequenceIndexes[4] = _scene->_sequences.startCycle(_globals._spriteIndexes[4], false, 17);
+ _scene->_sequences.addTimer(20, 204);
+ break;
+
+ case 204:
+ _scene->_sequences.remove(_globals._sequenceIndexes[4]);
+ _globals._sequenceIndexes[4] = _scene->_sequences.startReverseCycle(_globals._spriteIndexes[4], false, 10, 8, 0, 0);
+ _scene->_sequences.setAnimRange(_globals._sequenceIndexes[4], 18, 19);
+ _scene->_sequences.addSubEntry(_globals._sequenceIndexes[4], SEQUENCE_TRIGGER_EXPIRE, 0, 205);
+ break;
+
+ case 205: {
+ int oldIdx = _globals._sequenceIndexes[4];
+ _globals._sequenceIndexes[4] = _scene->_sequences.startReverseCycle(_globals._spriteIndexes[4], false, 10, 8, 0, 0);
+ _scene->_sequences.setAnimRange(_globals._sequenceIndexes[4], 20, 21);
+ _scene->_sequences.updateTimeout(_globals._sequenceIndexes[4], oldIdx);
+ _scene->_sequences.addSubEntry(_globals._sequenceIndexes[4], SEQUENCE_TRIGGER_EXPIRE, 0, 206);
+ }
+ break;
+
+ case 206: {
+ int oldIdx = _globals._sequenceIndexes[4];
+ _globals._sequenceIndexes[4] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[4], false, 10, 1, 0, 0);
+ _scene->_sequences.setAnimRange(_globals._sequenceIndexes[4], 22, 25);
+ _scene->_sequences.updateTimeout(_globals._sequenceIndexes[4], oldIdx);
+ if (!_dodgeFl && !_fallFl)
+ _scene->_sequences.addSubEntry(_globals._sequenceIndexes[4], SEQUENCE_TRIGGER_EXPIRE, 0, 207);
+ else
+ _scene->_sequences.addSubEntry(_globals._sequenceIndexes[4], SEQUENCE_TRIGGER_EXPIRE, 0, 209);
+ }
+ break;
+
+ case 207: {
+ _vm->_sound->command(18);
+ int msgIndex = _scene->_kernelMessages.add(Common::Point(180, 25), 0xFDFC, 0, 0, 90, _game.getQuote(130));
+ _scene->_kernelMessages.setQuoted(msgIndex, 4, true);
+
+ int oldIdx = _globals._sequenceIndexes[4];
+ _globals._sequenceIndexes[4] = _scene->_sequences.startReverseCycle(_globals._spriteIndexes[4], false, 15, 4, 0, 0);
+ _scene->_sequences.setAnimRange(_globals._sequenceIndexes[4], 26, 27);
+ _scene->_sequences.updateTimeout(_globals._sequenceIndexes[4], oldIdx);
+ _scene->_sequences.addSubEntry(_globals._sequenceIndexes[4], SEQUENCE_TRIGGER_EXPIRE, 0, 208);
+ }
+ break;
+
+ case 208: {
+ _scene->_kernelMessages.add(Common::Point(180, 39), 0xFDFC, 0, 0, 90, _game.getQuote(131));
+ int oldIdx = _globals._sequenceIndexes[4];
+ _globals._sequenceIndexes[4] = _scene->_sequences.startReverseCycle(_globals._spriteIndexes[4], false, 10, 4, 0, 0);
+ _scene->_sequences.setAnimRange(_globals._sequenceIndexes[4], 28, 29);
+ _scene->_sequences.updateTimeout(_globals._sequenceIndexes[4], oldIdx);
+ _scene->_sequences.addSubEntry(_globals._sequenceIndexes[4], SEQUENCE_TRIGGER_EXPIRE, 0, 209);
+ }
+ break;
+
+ case 209: {
+ int oldIdx = _globals._sequenceIndexes[4];
+ _globals._sequenceIndexes[4] = _scene->_sequences.startCycle(_globals._spriteIndexes[4], false, 22);
+ _scene->_sequences.updateTimeout(_globals._sequenceIndexes[4], oldIdx);
+ _scene->_sequences.addTimer(1, 210);
+ }
+ break;
+
+ case 210:
+ _playingAnimFl = false;
+ break;
+ }
+}
+
+void Scene209::handleMonkeyFall() {
+ switch (_game._trigger) {
+ case 219: {
+ _vm->_sound->command(25);
+ _scene->_sprites.remove(_globals._spriteIndexes[7]);
+ _scene->_sprites.remove(_globals._spriteIndexes[6]);
+ _scene->_sprites.remove(_globals._spriteIndexes[5]);
+ _scene->_sprites.remove(_globals._spriteIndexes[4]);
+
+ _globals._spriteIndexes[8] = _scene->_sprites.addSprites(formAnimName('m', 4));
+ _scene->_kernelMessages.add(Common::Point(180, 26), 0xFDFC, 0, 0, 90, _game.getQuote(151));
+ _scene->_sequences.addTimer(40, 100);
+ _scene->_hotspots.activate(227, false);
+ int oldIdx = _globals._sequenceIndexes[3];
+ _monkeyPosition = 1;
+ _scene->_sequences.remove(_globals._sequenceIndexes[3]);
+ _globals._sequenceIndexes[8] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[8], false, 8, 1, 0, 0);
+ _scene->_sequences.setAnimRange(_globals._sequenceIndexes[8], 1, 35);
+ _scene->_sequences.setDepth(_globals._sequenceIndexes[8], 6);
+ _scene->_sequences.updateTimeout(_globals._sequenceIndexes[3], oldIdx);
+ _scene->_sequences.addSubEntry(_globals._sequenceIndexes[8], SEQUENCE_TRIGGER_EXPIRE, 0, 220);
+ }
+ break;
+
+ case 220: {
+ _vm->_sound->command(18);
+ _scene->_kernelMessages.add(Common::Point(182, 109), 0xFDFC, 0, 0, 90, _game.getQuote(159));
+ _scene->_hotspots.activate(227, false);
+ int oldIdx = _globals._sequenceIndexes[3];
+ _monkeyPosition = 1;
+ _scene->_sequences.remove(_globals._sequenceIndexes[3]);
+ _globals._sequenceIndexes[8] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[8], false, 8, 1, 0, 0);
+ _scene->_sequences.setAnimRange(_globals._sequenceIndexes[8], 36, 42);
+ _scene->_sequences.setDepth(_globals._sequenceIndexes[8], 6);
+ _scene->_sequences.updateTimeout(_globals._sequenceIndexes[3], oldIdx);
+ _scene->_sequences.addSubEntry(_globals._sequenceIndexes[8], SEQUENCE_TRIGGER_EXPIRE, 0, 221);
+ }
+ break;
+
+ case 221: {
+ _game._objects.setRoom(OBJ_BINOCULARS, 209);
+ _binocularsDroppedFl = true;
+ int oldIdx = _globals._sequenceIndexes[8];
+ _globals._sequenceIndexes[8] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[8], false, 8, 1, 0, 0);
+ _globals._sequenceIndexes[9] = _scene->_sequences.startCycle(_globals._spriteIndexes[9], false, 1);
+ _scene->_sequences.updateTimeout(_globals._sequenceIndexes[9], oldIdx);
+ _scene->_sequences.setPosition(_globals._sequenceIndexes[9], Common::Point(201, 131));
+ _scene->_sequences.setDepth(_globals._sequenceIndexes[9], 8);
+ _scene->_sequences.updateTimeout(_globals._sequenceIndexes[8], oldIdx);
+ _scene->_sequences.setAnimRange(_globals._sequenceIndexes[8], 43, 72);
+ _scene->_sequences.addSubEntry(_globals._sequenceIndexes[8], SEQUENCE_TRIGGER_EXPIRE, 0, 222);
+ int idx = _scene->_dynamicHotspots.add(39, 13, _globals._sequenceIndexes[9], Common::Rect(0, 0, 0, 0));
+ _scene->_dynamicHotspots.setPosition(idx, Common::Point(200, 133), FACING_NORTH);
+ }
+ break;
+
+ case 222: {
+ _scene->_kernelMessages.add(Common::Point(182, 109), 0xFDFC, 0, 0, 70, _game.getQuote(160));
+ int oldIdx = _globals._sequenceIndexes[8];
+ _globals._sequenceIndexes[8] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[8], false, 8, 1, 0, 0);
+ _scene->_sequences.setAnimRange(_globals._sequenceIndexes[8], 73, 78);
+ _scene->_sequences.updateTimeout(_globals._sequenceIndexes[8], oldIdx);
+ _scene->_sequences.addSubEntry(_globals._sequenceIndexes[8], SEQUENCE_TRIGGER_EXPIRE, 0, 223);
+ }
+ break;
+
+ case 223:
+ _scene->loadAnimation(Resources::formatName(209, 'e', -1, EXT_AA, ""), 224);
+ _vm->_sound->command(38);
+ break;
+
+ case 224:
+ _playingAnimFl = false;
+ _fallFl = false;
+ _counter = 0;
+ _pauseMode = 0;
+ _vm->_dialogs->show(20910);
+ _game._player._stepEnabled = true;
+ break;
+ }
+}
+
+void Scene209::handleMonkey1() {
+ switch (_game._trigger) {
+ case 212:
+ _scene->_sequences.remove(_globals._sequenceIndexes[4]);
+ _globals._sequenceIndexes[4] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[4], false, 9, 1, 0, 0);
+ _scene->_sequences.setAnimRange(_globals._sequenceIndexes[4], 1, 13);
+ _scene->_sequences.addSubEntry(_globals._sequenceIndexes[4], SEQUENCE_TRIGGER_EXPIRE, 0, 213);
+ break;
+
+ case 213: {
+ int oldIdx = _globals._sequenceIndexes[4];
+ _globals._sequenceIndexes[7] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[7], false, 7, 1, 0, 0);
+ _scene->_sequences.setAnimRange(_globals._sequenceIndexes[7], 1, 22);
+ _scene->_sequences.updateTimeout(_globals._sequenceIndexes[7], oldIdx);
+ _scene->_sequences.addSubEntry(_globals._sequenceIndexes[7], SEQUENCE_TRIGGER_EXPIRE, 0, 214);
+ }
+ break;
+
+ case 214: {
+ int oldIdx = _globals._sequenceIndexes[7];
+ _globals._sequenceIndexes[7] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[7], false, 7, 1, 0, 0);
+ _scene->_sequences.setAnimRange(_globals._sequenceIndexes[7], 23, 26);
+ _scene->_sequences.updateTimeout(_globals._sequenceIndexes[7], oldIdx);
+ _scene->_sequences.addSubEntry(_globals._sequenceIndexes[7], SEQUENCE_TRIGGER_EXPIRE, 0, 215);
+ int msgIndex = _scene->_kernelMessages.add(Common::Point(170, 21), 0xFDFC, 0, 0, 90, _game.getQuote(156));
+ _scene->_kernelMessages.setQuoted(msgIndex, 3, true);
+ }
+ break;
+
+ case 215: {
+ _vm->_sound->command(18);
+ _scene->loadAnimation(Resources::formatName(209, 'a', -1, EXT_AA, ""), 251);
+ int oldIdx = _globals._sequenceIndexes[7];
+ _globals._sequenceIndexes[7] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[7], false, 7, 1, 0, 0);
+ _scene->_sequences.setAnimRange(_globals._sequenceIndexes[7], 27, 35);
+ _scene->_sequences.updateTimeout(_globals._sequenceIndexes[7], oldIdx);
+ _scene->_sequences.addSubEntry(_globals._sequenceIndexes[7], SEQUENCE_TRIGGER_EXPIRE, 0, 216);
+ }
+ break;
+
+ case 216: {
+ int oldIdx = _globals._sequenceIndexes[7];
+ _globals._sequenceIndexes[4] = _scene->_sequences.startCycle(_globals._spriteIndexes[4], false, 22);
+ _scene->_sequences.updateTimeout(_globals._sequenceIndexes[4], oldIdx);
+ _scene->_sequences.addTimer(25, 217);
+ }
+ break;
+
+ case 217:
+ _pitchFl = false;
+ _counter = 0;
+ _pauseMode = 0;
+ _scene->_sequences.addTimer(1, 196);
+ break;
+ }
+}
+
+void Scene209::handleMonkey2() {
+ switch (_game._trigger) {
+ case 251:
+ _scene->_kernelMessages.add(Common::Point(0, 0), 0x1110, 34, 0, 60, _game.getQuote(137));
+ _vm->_sound->command(22);
+ _globals._sequenceIndexes[12] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[12], false, 11, 1, 0, 0);
+ _scene->_sequences.setPosition(_globals._sequenceIndexes[12], Common::Point(111, 133));
+ _scene->_sequences.setScale(_globals._sequenceIndexes[12], 79);
+ _scene->_sequences.setAnimRange(_globals._sequenceIndexes[12], 1, 6);
+ _scene->_sequences.addSubEntry(_globals._sequenceIndexes[12], SEQUENCE_TRIGGER_EXPIRE, 0, 252);
+ _game._player._priorTimer = _scene->_frameStartTime - _game._player._ticksAmount;
+ _game._player._visible = false;
+ break;
+
+ case 252: {
+ _scene->_kernelMessages.reset();
+ _scene->_kernelMessages.add(Common::Point(0, 0), 0x1110, 34, 0, 120, _game.getQuote(132));
+ int oldIdx = _globals._sequenceIndexes[12];
+ _globals._sequenceIndexes[12] = _scene->_sequences.startCycle(_globals._spriteIndexes[12], false, 7);
+ _scene->_sequences.setPosition(_globals._sequenceIndexes[12], Common::Point(111, 133));
+ _scene->_sequences.setScale(_globals._sequenceIndexes[12], 79);
+ _scene->_sequences.updateTimeout(_globals._sequenceIndexes[12], oldIdx);
+ _scene->_sequences.addTimer(120, 253);
+ }
+ break;
+
+ case 253:
+ _scene->_sequences.remove(_globals._sequenceIndexes[12]);
+ _game._player._priorTimer = _scene->_frameStartTime - _game._player._ticksAmount;
+ _game._player._visible = true;
+ _game._player._stepEnabled = true;
+ break;
+ }
+}
+
+void Scene209::handleDodge() {
+ switch (_game._trigger) {
+ case 241:
+ _scene->_hotspots.activate(227, true);
+ _scene->_sequences.remove(_globals._sequenceIndexes[3]);
+ _globals._sequenceIndexes[3] = _scene->_sequences.startCycle(_globals._spriteIndexes[3], false, 7);
+ _scene->_sequences.addTimer(6, 242);
+ break;
+
+ case 242:
+ _scene->_sequences.remove(_globals._sequenceIndexes[3]);
+ _globals._sequenceIndexes[3] = _scene->_sequences.startCycle(_globals._spriteIndexes[3], false, 5);
+ _scene->_sequences.addTimer(25, 243);
+ _vm->_sound->command(24);
+ break;
+
+ case 243:
+ _vm->_sound->command(18);
+ _scene->_sequences.remove(_globals._sequenceIndexes[3]);
+ _globals._sequenceIndexes[3] = _scene->_sequences.startCycle(_globals._spriteIndexes[3], false, 6);
+ _playingAnimFl = false;
+ _pauseMode = 0;
+ _scene->_kernelMessages.reset();
+ _scene->_kernelMessages.add(Common::Point(180, 21), 0xFDFC, 0, 0, 90, _game.getQuote(155));
+ if (!_shootMissedLastFl) {
+ _scene->_kernelMessages.add(Common::Point(0, 0), 0x1110, 34, 0, 120, _game.getQuote(135));
+ _shootMissedLastFl = true;
+ } else {
+ _scene->_kernelMessages.add(Common::Point(0, 0), 0x1110, 34, 0, 120, _game.getQuote(136));
+ }
+ break;
+ }
+}
+
+void Scene209::enter() {
+ _globals._spriteIndexes[12] = _scene->_sprites.addSprites(formAnimName('a', 1));
+ _globals._spriteIndexes[1] = _scene->_sprites.addSprites(formAnimName('e', -1));
+ _globals._spriteIndexes[2] = _scene->_sprites.addSprites(formAnimName('a', 0));
+ _globals._spriteIndexes[9] = _scene->_sprites.addSprites(formAnimName('b', 1));
+ _globals._spriteIndexes[3] = _scene->_sprites.addSprites(formAnimName('m', 0));
+ _globals._spriteIndexes[4] = _scene->_sprites.addSprites(formAnimName('m', 1));
+ _globals._spriteIndexes[5] = _scene->_sprites.addSprites(formAnimName('m', 3));
+ _globals._spriteIndexes[6] = _scene->_sprites.addSprites(formAnimName('m', 6));
+ _globals._spriteIndexes[7] = _scene->_sprites.addSprites(formAnimName('m', 8));
+
+ _game.loadQuoteSet(0x82, 0x83, 0x84, 0x9C, 0x97, 0x95, 0x99, 0x9E, 0x98, 0x9B, 0xA0, 0x96, 0x9F,
+ 0x8B, 0x8C, 0x8D, 0x8E, 0x8F, 0x91, 0x92, 0x93, 0x94, 0x89, 0x85, 0x8A, 0x86, 0x87, 0x88, 0);
+
+ _vm->_palette->setEntry(252, 63, 44, 30);
+ _vm->_palette->setEntry(253, 63, 20, 22);
+
+ if (_game._objects.isInRoom(OBJ_PLANT_STALK)) {
+ _globals._sequenceIndexes[1] = _scene->_sequences.startCycle(_globals._spriteIndexes[1], false, 1);
+ int idx = _scene->_dynamicHotspots.add(271, 13, _globals._sequenceIndexes[1], Common::Rect(0, 0, 0, 0));
+ _scene->_dynamicHotspots.setPosition(idx, Common::Point(263, 129), FACING_SOUTH);
+ _scene->_sequences.setDepth(_globals._sequenceIndexes[1], 13);
+ }
+
+ if (_scene->_priorSceneId == 208) {
+ _game._player._playerPos = Common::Point(11, 121);
+ _game._player._facing = FACING_EAST;
+ } else if (_scene->_priorSceneId != -2) {
+ _game._player._playerPos = Common::Point(28, 121);
+ _game._player._facing = FACING_SOUTH;
+ }
+
+ if (_game._objects.isInRoom(OBJ_BINOCULARS)) {
+ _globals._sequenceIndexes[9] = _scene->_sequences.startCycle(_globals._spriteIndexes[9], false, 1);
+ _scene->_sequences.setPosition(_globals._sequenceIndexes[9], Common::Point(201, 131));
+ _scene->_sequences.setDepth(_globals._sequenceIndexes[9], 8);
+ int idx = _scene->_dynamicHotspots.add(39, 13, _globals._sequenceIndexes[9], Common::Rect(0, 0, 0, 0));
+ _scene->_dynamicHotspots.setPosition(idx, Common::Point(200, 133), FACING_NORTH);
+ }
+
+ if (_scene->_roomChanged) {
+ _game._objects.addToInventory(OBJ_POISON_DARTS);
+ _game._objects.addToInventory(OBJ_BLOWGUN);
+ _globals[kMonkeyStatus] = MONKEY_HAS_BINOCULARS;
+ }
+
+ _pitchFl = false;
+ _fallFl = false;
+ _dodgeFl = false;
+ _playingAnimFl = false;
+ _monkeyPosition = 1;
+ _counter = 0;
+ _pauseMode = 0;
+ _forceFallFl = false;
+ _shouldFallFl = false;
+ _forceDodgeFl = false;
+ _binocularsDroppedFl = false;
+ _shouldDodgeFl = false;
+ _startShootingInTimerFl = false;
+ _dialogAbortVal = 5;
+ _playingDialogFl = false;
+ _shootMissedLastFl = false;
+ _removeMonkeyFl = true;
+ _shootReadyFl = false;
+
+ _scene->_hotspots.activate(227, false);
+
+ sceneEntrySound();
+}
+
+void Scene209::step() {
+ if (!_playingAnimFl && !_pitchFl && !_fallFl && !_dodgeFl && (_pauseMode == 0) && (_globals[kMonkeyStatus] == MONKEY_HAS_BINOCULARS)) {
+ int randAction = _vm->getRandomNumber(1,50);
+ switch (randAction) {
+ case 1:
+ if ((_monkeyPosition == 1) && (_counter < 2)) {
+ _scene->_sequences.addTimer(1, 133);
+ _playingAnimFl = true;
+ _scene->_hotspots.activate(227, true);
+ ++_counter;
+ }
+ break;
+
+ case 2:
+ if ((_monkeyPosition == 1) && (_counter < 2)) {
+ _scene->_sequences.addTimer(1, 140);
+ _scene->_hotspots.activate(227, true);
+ _playingAnimFl = true;
+ ++_counter;
+ }
+ break;
+
+ case 3:
+ if (_monkeyPosition == 1) {
+ _scene->_sequences.addTimer(1, 145);
+ _scene->_hotspots.activate(227, true);
+ _playingAnimFl = true;
+ _counter = 0;
+ }
+ break;
+
+ case 4:
+ if ((_monkeyPosition == 2) && (_counter < 2)) {
+ _scene->_sequences.addTimer(1, 151);
+ _scene->_hotspots.activate(227, true);
+ ++_counter;
+ _playingAnimFl = true;
+ }
+ break;
+
+ case 5:
+ if (_monkeyPosition == 2) {
+ _scene->_sequences.addTimer(1, 161);
+ _scene->_hotspots.activate(227, true);
+ _counter = 0;
+ _playingAnimFl = true;
+ }
+ break;
+
+ case 6:
+ if (_monkeyPosition == 2) {
+ _scene->_sequences.addTimer(1, 189);
+ _scene->_hotspots.activate(227, true);
+ _counter = 0;
+ _playingAnimFl = true;
+ }
+ break;
+ case 7:
+ if (_monkeyPosition == 3) {
+ _scene->_hotspots.activate(227, true);
+ _scene->_sequences.addTimer(1, 167);
+ _playingAnimFl = true;
+ }
+ break;
+
+ case 8:
+ if (_monkeyPosition == 3) {
+ _scene->_sequences.addTimer(1, 178);
+ _playingAnimFl = true;
+ _scene->_hotspots.activate(227, true);
+ _counter = 0;
+ }
+ break;
+
+ case 9:
+ if ((_monkeyPosition == 3) && (_game._player._playerPos.x<120)) {
+ _scene->_sequences.addTimer(1, 182);
+ _scene->_hotspots.activate(227, true);
+ _counter = 0;
+ _playingAnimFl = true;
+ }
+ break;
+
+ case 10:
+ if (_monkeyPosition == 4) {
+ _scene->_sequences.addTimer(1, 196);
+ _scene->_hotspots.activate(227, true);
+ _playingAnimFl = true;
+ _counter = 0;
+ }
+ break;
+
+ case 11:
+ if ((_monkeyPosition == 4) && (_counter < 3)) {
+ _scene->_sequences.addTimer(1, 199);
+ _scene->_hotspots.activate(227, true);
+ ++_counter;
+ _playingAnimFl = true;
+ }
+ break;
+
+ case 30:
+ if (_monkeyPosition == 4) {
+ _scene->_sequences.addTimer(1, 246);
+ _scene->_hotspots.activate(227, true);
+ _counter = 0;
+ _playingAnimFl = true;
+ }
+ break;
+
+ default:
+ if ((randAction >= 12) && (randAction <= 20) && (_monkeyPosition == 2) && (_counter < 5)) {
+ _scene->_sequences.addTimer(1, 155);
+ ++_counter;
+ _playingAnimFl = true;
+ }
+
+ if ((randAction >= 21) && (randAction <= 29) && (_monkeyPosition == 3) && (_counter < 3)) {
+ _scene->_sequences.addTimer(1, 171);
+ _playingAnimFl = true;
+ ++_counter;
+ }
+ break;
+ }
+ }
+
+ if (!_dodgeFl && !_pitchFl && !_fallFl && (_pauseMode == 1))
+ _scene->_sequences.addTimer(1, 226);
+
+ if (!_dodgeFl && !_pitchFl && !_fallFl && (_pauseMode == 2))
+ handlePause();
+
+ if (!_dodgeFl && !_pitchFl && !_fallFl && (_pauseMode == 1))
+ initPauseCounterThreshold();
+
+ handlePeek();
+ handleVerticalMove();
+ handleLookStay();
+ handleLookRight();
+ handleBlink();
+ handleGetBinoculars();
+ handleStandFromPeek();
+ handleDodge();
+ handleBinocularBlink();
+ handleBinocularScan();
+ handleJumpInTree();
+ handleTongue();
+ handleMonkeyFall();
+ handleJumpAndHide();
+ handleMonkeyEating();
+ handleMonkey1();
+ handleStandBlink();
+ handleMonkey2();
+
+ if ((_monkeyPosition == 1) && !_playingAnimFl && _fallFl) {
+ _scene->_sequences.addTimer(1, 145);
+ _playingAnimFl = true;
+ }
+
+ if ((_monkeyPosition == 2) && !_playingAnimFl && _fallFl) {
+ _scene->_sequences.addTimer(1, 161);
+ _playingAnimFl = true;
+ }
+
+ if ((_monkeyPosition == 4) && !_playingAnimFl && _fallFl) {
+ _scene->_sequences.addTimer(1, 196);
+ _playingAnimFl = true;
+ }
+
+ if ((_monkeyPosition == 3) && !_playingAnimFl && _fallFl && _forceFallFl) {
+ _scene->_sequences.addTimer(1, 219);
+ _playingAnimFl = true;
+ }
+
+ if ((_monkeyPosition == 1) && !_playingAnimFl && _pitchFl) {
+ _scene->_sequences.addTimer(1, 145);
+ _playingAnimFl = true;
+ }
+
+ if ((_monkeyPosition == 2) && !_playingAnimFl && _pitchFl) {
+ _scene->_sequences.addTimer(1, 189);
+ _playingAnimFl = true;
+ }
+
+ if ((_monkeyPosition == 4) && !_playingAnimFl && _pitchFl) {
+ _scene->_sequences.addTimer(1, 212);
+ _playingAnimFl = true;
+ }
+
+ if ((_monkeyPosition == 3) && !_playingAnimFl && _pitchFl) {
+ _scene->_sequences.addTimer(1, 178);
+ _playingAnimFl = true;
+ }
+
+ if ((_monkeyPosition == 1) && !_playingAnimFl && _dodgeFl) {
+ _scene->_sequences.addTimer(1, 145);
+ _playingAnimFl = true;
+ }
+
+ if ((_monkeyPosition == 4) && !_playingAnimFl && _dodgeFl) {
+ _scene->_sequences.addTimer(1, 196);
+ _playingAnimFl = true;
+ }
+
+ if ((_monkeyPosition == 3) && !_playingAnimFl && _dodgeFl) {
+ _scene->_sequences.addTimer(1, 178);
+ _playingAnimFl = true;
+ }
+
+ if ((_monkeyPosition == 2) && !_playingAnimFl && _dodgeFl && _forceDodgeFl) {
+ _scene->_sequences.addTimer(1, 241);
+ _playingAnimFl = true;
+ }
+
+ if (_dodgeFl || _fallFl) { /* if want to dodge or fall */
+ if (!_playingAnimFl && (_monkeyPosition == 2))
+ _shouldDodgeFl = true;
+
+ if (!_playingAnimFl && (_monkeyPosition == 3))
+ _shouldFallFl = true;
+
+ switch (_game._trigger) {
+ case 228:
+ _game._player._visible = false;
+ _globals._sequenceIndexes[2] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[2], false, 8, 1, 0, 0);
+ _scene->_sequences.setAnimRange(_globals._sequenceIndexes[2], 1, 7);
+ _scene->_sequences.setPosition(_globals._sequenceIndexes[2], Common::Point(116, 131));
+ _scene->_sequences.setDepth(_globals._sequenceIndexes[2], 4);
+ _scene->_sequences.addSubEntry(_globals._sequenceIndexes[2], SEQUENCE_TRIGGER_EXPIRE, 0, 229);
+ break;
+
+ case 229: {
+ int oldIdx = _globals._sequenceIndexes[2];
+ _globals._sequenceIndexes[2] = _scene->_sequences.startCycle(_globals._spriteIndexes[2], false, 7);
+ _scene->_sequences.setPosition(_globals._sequenceIndexes[2], Common::Point(116, 131));
+ _scene->_sequences.setDepth(_globals._sequenceIndexes[2], 4);
+ _scene->_sequences.updateTimeout(_globals._sequenceIndexes[2], oldIdx);
+ _scene->_sequences.addTimer(35, 230);
+ }
+ break;
+
+ case 230:
+ _scene->_sequences.remove(_globals._sequenceIndexes[2]);
+ _globals._sequenceIndexes[2] = _scene->_sequences.addReverseSpriteCycle(_globals._spriteIndexes[2], false, 8, 1, 0, 0);
+ _scene->_sequences.setAnimRange(_globals._sequenceIndexes[2], 1, 7);
+ _scene->_sequences.setPosition(_globals._sequenceIndexes[2], Common::Point(116, 131));
+ _scene->_sequences.setDepth(_globals._sequenceIndexes[2], 4);
+ _scene->_sequences.addSubEntry(_globals._sequenceIndexes[2], SEQUENCE_TRIGGER_EXPIRE, 0, 231);
+ break;
+
+ case 231: {
+ int oldIdx = _globals._sequenceIndexes[2];
+ _globals._sequenceIndexes[2] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[2], false, 8, 1, 0, 0);
+ _scene->_sequences.setAnimRange(_globals._sequenceIndexes[2], 8, 10);
+ _scene->_sequences.setPosition(_globals._sequenceIndexes[2], Common::Point(116, 131));
+ _scene->_sequences.setDepth(_globals._sequenceIndexes[2], 4);
+ _scene->_sequences.updateTimeout(_globals._sequenceIndexes[2], oldIdx);
+ _scene->_sequences.addSubEntry(_globals._sequenceIndexes[2], SEQUENCE_TRIGGER_EXPIRE, 0, 232);
+ _game._player._priorTimer = _scene->_frameStartTime - _game._player._ticksAmount;
+ _scene->_sequences.updateTimeout(_globals._sequenceIndexes[2], -1);
+ _game._player._visible = false;
+ }
+ break;
+
+ case 232: {
+ int oldIdx = _globals._sequenceIndexes[2];
+ _globals._sequenceIndexes[2] = _scene->_sequences.startCycle(_globals._spriteIndexes[2], false, 10);
+ _scene->_sequences.setPosition(_globals._sequenceIndexes[2], Common::Point(116, 131));
+ _scene->_sequences.setDepth(_globals._sequenceIndexes[2], 4);
+ _scene->_sequences.updateTimeout(_globals._sequenceIndexes[2], oldIdx);
+ _scene->_sequences.addTimer(2, 233);
+ _scene->_kernelMessages.reset();
+ if (_dodgeFl && (_monkeyPosition != 1) && (_monkeyPosition != 2))
+ _scene->_kernelMessages.add(Common::Point(0, 0), 0x1110, 34, 0, 34463, _game.getQuote(138));
+ if (_fallFl && (_monkeyPosition != 3))
+ _scene->_kernelMessages.add(Common::Point(0, 0), 0x1110, 34, 0, 34463, _game.getQuote(138));
+ }
+ break;
+
+ case 233:
+ _shootReadyFl = true;
+ break;
+
+ case 234:
+ _scene->_sequences.remove(_globals._sequenceIndexes[2]);
+ _scene->_kernelMessages.reset();
+ if (_action.isAction(VERB_HOSE_DOWN, NOUN_BLOWGUN, NOUN_MONKEY)) {
+ _globals._sequenceIndexes[2] = _scene->_sequences.addReverseSpriteCycle(_globals._spriteIndexes[2], false, 7, 16, 0, 0);
+ _scene->_sequences.setAnimRange(_globals._sequenceIndexes[2], 11, 12);
+ _scene->_sequences.setPosition(_globals._sequenceIndexes[2], Common::Point(116, 131));
+ _scene->_sequences.setDepth(_globals._sequenceIndexes[2], 4);
+ _scene->_sequences.addSubEntry(_globals._sequenceIndexes[2], SEQUENCE_TRIGGER_SPRITE, 12, 239);
+ _scene->_sequences.addSubEntry(_globals._sequenceIndexes[2], SEQUENCE_TRIGGER_EXPIRE, 0, 235);
+ } else if (_action.isAction(VERB_SHOOT, NOUN_BLOWGUN, NOUN_MONKEY)) {
+ _globals._sequenceIndexes[2] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[2], false, 8, 1, 0, 0);
+ _scene->_sequences.setAnimRange(_globals._sequenceIndexes[2], 11, 12);
+ _scene->_sequences.setPosition(_globals._sequenceIndexes[2], Common::Point(116, 131));
+ _scene->_sequences.setDepth(_globals._sequenceIndexes[2], 4);
+ _scene->_sequences.addSubEntry(_globals._sequenceIndexes[2], SEQUENCE_TRIGGER_EXPIRE, 0, 235);
+ _vm->_sound->command(23);
+ }
+ break;
+
+ case 235: {
+ int oldIdx = _globals._sequenceIndexes[2];
+ _globals._sequenceIndexes[2] = _scene->_sequences.startCycle(_globals._spriteIndexes[2], false, 13);
+ _scene->_sequences.setPosition(_globals._sequenceIndexes[2], Common::Point(116, 131));
+ _scene->_sequences.setDepth(_globals._sequenceIndexes[2], 4);
+ _scene->_sequences.updateTimeout(_globals._sequenceIndexes[2], oldIdx);
+ _scene->_sequences.addTimer(12, 236);
+ _forceFallFl = true;
+ _forceDodgeFl = true;
+ }
+ break;
+
+ case 236:
+ _scene->_sequences.remove(_globals._sequenceIndexes[2]);
+ _globals._sequenceIndexes[2] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[2], false, 8, 1, 0, 0);
+ _scene->_sequences.setAnimRange(_globals._sequenceIndexes[2], 14, 16);
+ _scene->_sequences.setPosition(_globals._sequenceIndexes[2], Common::Point(116, 131));
+ _scene->_sequences.setDepth(_globals._sequenceIndexes[2], 4);
+ _scene->_sequences.addSubEntry(_globals._sequenceIndexes[2], SEQUENCE_TRIGGER_EXPIRE, 0, 237);
+ break;
+
+ case 237:
+ _game._player._visible = true;
+ _game._player._priorTimer = _scene->_frameStartTime - _game._player._ticksAmount;
+ _scene->_sequences.addTimer(1, 238);
+ break;
+
+ case 238:
+ _scene->_sequences.remove(_globals._sequenceIndexes[2]);
+ if (_dodgeFl)
+ _game._player._stepEnabled = true;
+
+ _startShootingInTimerFl = false;
+
+ if (_fallFl) {
+ _globals[kMonkeyStatus] = MONKEY_IS_GONE;
+ _game._objects.setRoom(OBJ_POISON_DARTS, NOWHERE);
+ }
+ _dodgeFl = false;
+ _fallFl = false;
+ _forceFallFl = false;
+ _forceDodgeFl = false;
+ _shouldFallFl = false;
+ _shouldDodgeFl = false;
+ break;
+
+ case 239:
+ _vm->_sound->command(23);
+ break;
+ }
+ }
+
+ if (_game._trigger == 100)
+ _scene->_kernelMessages.add(Common::Point(0, 0), 0x1110, 34, 0, 120, _game.getQuote(134));
+
+ if (_shootReadyFl && (_shouldFallFl || _shouldDodgeFl)) {
+ _scene->_sequences.addTimer(4, 234);
+ _shootReadyFl = false;
+ }
+}
+
+void Scene209::preActions() {
+ if (_action.isAction(VERB_WALK_TOWARDS, NOUN_FIELD_TO_WEST))
+ _game._player._walkOffScreenSceneId = 208;
+
+ if (_globals[kMonkeyStatus] == MONKEY_HAS_BINOCULARS) {
+ if ((_action.isAction(VERB_SHOOT) || _action.isAction(VERB_HOSE_DOWN)) && _action.isTarget(NOUN_MONKEY)
+ && _action.isObject(NOUN_BLOWGUN) && _game._objects.isInInventory(OBJ_BLOWGUN) && _game._objects.isInInventory(OBJ_POISON_DARTS)) {
+ _game._player._prepareWalkPos = Common::Point(111, 129);
+ _game._player._prepareWalkFacing = FACING_NORTHEAST;
+ _game._player._needToWalk = true;
+ _game._player._readyToWalk = true;
+ }
+
+ if (_action.isAction(VERB_LOOK, NOUN_MONKEY) || _action.isAction(VERB_TALKTO, NOUN_MONKEY)) {
+ _game._player._prepareWalkPos = Common::Point(111, 129);
+ _game._player._prepareWalkFacing = FACING_NORTHEAST;
+ _game._player._needToWalk = true;
+ _game._player._readyToWalk = true;
+ }
+ }
+}
+
+void Scene209::actions() {
+ if (_action._lookFlag) {
+ _vm->_dialogs->show(20912);
+ _action._inProgress = false;
+ return;
+ }
+
+ if (_action.isAction(VERB_WALK_TOWARDS, NOUN_ROCKY_AREA_TO_NORTH)) {
+ _scene->_nextSceneId = 203;
+ _action._inProgress = false;
+ return;
+ }
+
+ if (_action.isAction(VERB_TALKTO, NOUN_MONKEY) && !_pitchFl && !_playingDialogFl) {
+ _scene->_sequences.addTimer(1, _dialogAbortVal);
+ _playingDialogFl = true;
+ _game._player._stepEnabled = false;
+ _action._inProgress = false;
+ return;
+ }
+
+ switch (_game._trigger) {
+ case 130:
+ _game._player._stepEnabled = true;
+ _playingDialogFl = false;
+ _action._inProgress = false;
+ return;
+
+ case 5:
+ _scene->_kernelMessages.reset();
+ _scene->_kernelMessages.add(Common::Point(0, 0), 0x1110, 34, 6, 180, _game.getQuote(139));
+ _action._inProgress = false;
+ return;
+
+ case 6:
+ _scene->_kernelMessages.add(Common::Point(180, 21), 0xFDFC, 0, 0, 60, _game.getQuote(151));
+ _scene->_sequences.addTimer(60, 130);
+ _dialogAbortVal = 7;
+ _action._inProgress = false;
+ return;
+
+ case 7:
+ _scene->_kernelMessages.reset();
+ _scene->_kernelMessages.add(Common::Point(0, 0), 0x1110, 34, 8, 180, _game.getQuote(140));
+ _action._inProgress = false;
+ return;
+
+ case 8:
+ _scene->_kernelMessages.add(Common::Point(180, 21), 0xFDFC, 0, 0, 60, _game.getQuote(149));
+ _scene->_sequences.addTimer(60, 130);
+ _dialogAbortVal = 9;
+ _action._inProgress = false;
+ return;
+
+ case 9:
+ _scene->_kernelMessages.reset();
+ _scene->_kernelMessages.add(Common::Point(0, 0), 0x1110, 34, 0, 180, _game.getQuote(141));
+ _scene->_sequences.addTimer(200, 10);
+ _action._inProgress = false;
+ return;
+
+ case 10:
+ _scene->_kernelMessages.add(Common::Point(0, 0), 0x1110, 34, 11, 180, _game.getQuote(142));
+ _action._inProgress = false;
+ return;
+
+ case 11:
+ _scene->_kernelMessages.add(Common::Point(180, 21), 0xFDFC, 0, 0, 60, _game.getQuote(152));
+ _scene->_sequences.addTimer(60, 130);
+ _dialogAbortVal = 12;
+ _action._inProgress = false;
+ return;
+
+ case 12:
+ _scene->_kernelMessages.reset();
+ _scene->_kernelMessages.add(Common::Point(0, 0), 0x1110, 34, 0, 130, _game.getQuote(143));
+ _scene->_sequences.addTimer(150, 13);
+ _action._inProgress = false;
+ return;
+
+ case 13:
+ _scene->_kernelMessages.add(Common::Point(0, 0), 0x1110, 34, 14, 180, _game.getQuote(145));
+ _action._inProgress = false;
+ return;
+
+ case 14:
+ _scene->_kernelMessages.add(Common::Point(180, 21), 0xFDFC, 0, 0, 60, _game.getQuote(151));
+ _scene->_sequences.addTimer(60, 130);
+ _dialogAbortVal = 15;
+ _action._inProgress = false;
+ return;
+
+ case 15:
+ _scene->_kernelMessages.reset();
+ _scene->_kernelMessages.add(Common::Point(0, 0), 0x1110, 34, 16, 180, _game.getQuote(146));
+ _action._inProgress = false;
+ return;
+
+ case 16:
+ _scene->_kernelMessages.add(Common::Point(180, 21), 0xFDFC, 0, 17, 60, _game.getQuote(154));
+ _action._inProgress = false;
+ return;
+
+ case 17:
+ _scene->_kernelMessages.add(Common::Point(0, 0), 0x1110, 34, 130, 60, _game.getQuote(147));
+ _dialogAbortVal = 18;
+ _action._inProgress = false;
+ return;
+
+ case 18:
+ _scene->_kernelMessages.reset();
+ _scene->_kernelMessages.add(Common::Point(0, 0), 0x1110, 34, 0, 180, _game.getQuote(148));
+ _pitchFl = true;
+ _playingDialogFl = false;
+ _dialogAbortVal = 5;
+ _action._inProgress = false;
+ return;
+ }
+
+ if (_globals[kMonkeyStatus] == MONKEY_HAS_BINOCULARS) {
+ if ((_action.isAction(VERB_SHOOT) || _action.isAction(VERB_HOSE_DOWN)) && _action.isTarget(NOUN_MONKEY)
+ && _action.isObject(NOUN_BLOWGUN) && _game._objects.isInInventory(OBJ_BLOWGUN) && _game._objects.isInInventory(OBJ_POISON_DARTS)) {
+ if (_action.isAction(VERB_SHOOT, NOUN_BLOWGUN, NOUN_MONKEY) && !_startShootingInTimerFl) {
+ _game._triggerSetupMode = SEQUENCE_TRIGGER_DAEMON;
+ _scene->_sequences.addTimer(1, 231);
+ _startShootingInTimerFl = true;
+ _game._player._stepEnabled = false;
+ _dodgeFl = true;
+ _action._inProgress = false;
+ return;
+ }
+
+ if (_action.isAction(VERB_HOSE_DOWN, NOUN_BLOWGUN, NOUN_MONKEY) && !_startShootingInTimerFl) {
+ _game._triggerSetupMode = SEQUENCE_TRIGGER_DAEMON;
+ _scene->_sequences.addTimer(1, 228);
+ _game._player._stepEnabled = false;
+ _fallFl = true;
+ _startShootingInTimerFl = true;
+ _action._inProgress = false;
+ return;
+ }
+ }
+
+ if (_action.isAction(VERB_LOOK, NOUN_MONKEY)) {
+ _pitchFl = true;
+ _game._player._stepEnabled = false;
+ _vm->_dialogs->show(20914);
+ _action._inProgress = false;
+ return;
+ }
+ }
+
+ if (_action.isAction(VERB_TAKE, NOUN_PLANT_STALK) && (_game._trigger || _game._objects.isInRoom(OBJ_PLANT_STALK))) {
+ switch (_game._trigger) {
+ case 0:
+ _globals._spriteIndexes[11] = _scene->_sprites.addSprites("*RXMBD_2");
+ _game._player._stepEnabled = false;
+ _game._player._visible = false;
+ _globals._sequenceIndexes[11] = _scene->_sequences.startReverseCycle(_globals._spriteIndexes[11], false, 3, 2, 0, 0);
+ _scene->_sequences.setMsgLayout(_globals._sequenceIndexes[11]);
+ _scene->_sequences.addSubEntry(_globals._sequenceIndexes[11], SEQUENCE_TRIGGER_SPRITE, 4, 1);
+ _scene->_sequences.addSubEntry(_globals._sequenceIndexes[11], SEQUENCE_TRIGGER_EXPIRE, 0, 2);
+ break;
+
+ case 1:
+ _scene->_sequences.remove(_globals._sequenceIndexes[1]);
+ _game._objects.addToInventory(OBJ_PLANT_STALK);
+ break;
+
+ case 2:
+ _game._player._visible = true;
+ _game._player._stepEnabled = true;
+ _scene->_sequences.addTimer(4, 3);
+ _vm->_dialogs->showItem(OBJ_PLANT_STALK, 0x328);
+ break;
+
+ case 3:
+ _scene->_sprites.remove(_globals._spriteIndexes[11]);
+ break;
+ }
+ _action._inProgress = false;
+ return;
+ }
+
+ if (_action.isAction(VERB_TAKE, NOUN_BINOCULARS) && (_game._trigger || _game._objects.isInRoom(OBJ_BINOCULARS))) {
+ switch (_game._trigger) {
+ case 0:
+ _globals._spriteIndexes[10] = _scene->_sprites.addSprites("*RXMBD_8");
+ _game._player._stepEnabled = false;
+ _game._player._visible = false;
+ _globals._sequenceIndexes[10] = _scene->_sequences.startReverseCycle(_globals._spriteIndexes[10], false, 3, 2, 0, 0);
+ _scene->_sequences.setMsgLayout(_globals._sequenceIndexes[10]);
+ _scene->_sequences.addSubEntry(_globals._sequenceIndexes[10], SEQUENCE_TRIGGER_SPRITE, 4, 1);
+ _scene->_sequences.addSubEntry(_globals._sequenceIndexes[10], SEQUENCE_TRIGGER_EXPIRE, 0, 2);
+ break;
+
+ case 1:
+ _scene->_sequences.remove(_globals._sequenceIndexes[9]);
+ _game._objects.addToInventory(OBJ_BINOCULARS);
+ break;
+
+ case 2:
+ _game._player._visible = true;
+ _game._player._stepEnabled = true;
+ _binocularsDroppedFl = false;
+ _scene->_sequences.addTimer(4, 3);
+ break;
+
+ case 3:
+ _vm->_dialogs->showItem (OBJ_BINOCULARS, 0x51AF);
+ _scene->_sprites.remove(_globals._spriteIndexes[10]);
+ break;
+ }
+ _action._inProgress = false;
+ return;
+ }
+
+ if (_action.isAction(VERB_LOOK, NOUN_SKY)) {
+ _vm->_dialogs->show(20901);
+ _action._inProgress = false;
+ return;
+ }
+
+ if (_action.isAction(VERB_LOOK, NOUN_BAMBOO_LIKE_PLANT)) {
+ _vm->_dialogs->show(20902);
+ _action._inProgress = false;
+ return;
+ }
+
+ if (_action.isAction(VERB_LOOK, NOUN_MOUNTAINSIDE)) {
+ _vm->_dialogs->show(20903);
+ _action._inProgress = false;
+ return;
+ }
+
+ if (_action.isAction(VERB_LOOK, NOUN_GRASSY_FIELD)) {
+ _vm->_dialogs->show(20904);
+ _action._inProgress = false;
+ return;
+ }
+
+ if (_action.isAction(VERB_LOOK, NOUN_FIELD_TO_WEST)) {
+ _vm->_dialogs->show(20905);
+ _action._inProgress = false;
+ return;
+ }
+
+ if (_action.isAction(VERB_LOOK, NOUN_ROCKY_AREA_TO_NORTH)) {
+ _vm->_dialogs->show(20906);
+ _action._inProgress = false;
+ return;
+ }
+
+ if (_action.isAction(VERB_LOOK, NOUN_PLANT_STALK) && (_action._savedFields._mainObjectSource == 4)) {
+ _vm->_dialogs->show(20907);
+ _action._inProgress = false;
+ return;
+ }
+
+ if (_action.isAction(VERB_GIVE, NOUN_TWINKIFRUIT, NOUN_MONKEY) || _action.isAction(VERB_THROW, NOUN_TWINKIFRUIT, NOUN_MONKEY)) {
+ _vm->_dialogs->show(20909);
+ _action._inProgress = false;
+ return;
+ }
+
+ if (_action.isAction(VERB_LOOK, NOUN_TREES)) {
+ _vm->_dialogs->show(20913);
+ _action._inProgress = false;
+ return;
+ }
+
+ if (_action.isAction(VERB_THROW, NOUN_MONKEY) && _game._objects.isInInventory(_game._objects.getIdFromDesc(_action._activeAction._objectNameId))) {
+ if (!_action.isObject(NOUN_POISON_DARTS)) {
+ _vm->_dialogs->show(20915);
+ }
+ _action._inProgress = false;
+ return;
+ }
+
+ if (_action.isAction(VERB_THROW, NOUN_POISON_DARTS, NOUN_MONKEY)) {
+ _vm->_dialogs->show(20916);
+ _action._inProgress = false;
+ return;
+ }
+
+ if (_action.isAction(VERB_LOOK, NOUN_PALM_TREE)) {
+ if (_globals[kMonkeyStatus] == MONKEY_HAS_BINOCULARS) {
+ if (_monkeyPosition == 1)
+ _vm->_dialogs->show(20917);
+ else
+ _vm->_dialogs->show(20918);
+ } else {
+ if (_globals[kMonkeyStatus] == MONKEY_AMBUSH_READY)
+ _vm->_dialogs->show(20917);
+ else
+ _vm->_dialogs->show(20919);
+ }
+ _action._inProgress = false;
+ return;
+ }
+
+ if (_action.isAction(VERB_LOOK, NOUN_MELON_MUSH)) {
+ _vm->_dialogs->show(20920);
+ _action._inProgress = false;
+ return;
+ }
+
+ if (_action.isAction(VERB_TAKE, NOUN_MELON_MUSH)) {
+ _vm->_dialogs->show(20921);
+ _action._inProgress = false;
+ return;
+ }
+}
+
+/*****************************************************************************/
+
+Scene210::Scene210(MADSEngine *vm) : Scene2xx(vm) {
+ _curDialogNode = -1;
+ _nextHandsPlace = 0;
+ _twinkleAnimationType = 0;
+ _twinklesCurrentFrame = 0;
+ _shouldTalk = false;
+ _shouldFaceRex = false;
+ _shouldMoveHead = false;
+ _stopWalking = false;
+ _twinklesTalking = false;
+ _twinklesTalk2 = false;
+ _doorway = 0;
+ _subQuote2 = "";
+}
+
+void Scene210::synchronize(Common::Serializer &s) {
+ Scene2xx::synchronize(s);
+
+ s.syncAsSint32LE(_curDialogNode);
+ s.syncAsSint32LE(_nextHandsPlace);
+ s.syncAsSint32LE(_twinkleAnimationType);
+ s.syncAsSint32LE(_twinklesCurrentFrame);
+
+ s.syncAsByte(_shouldTalk);
+ s.syncAsByte(_shouldFaceRex);
+ s.syncAsByte(_shouldMoveHead);
+ s.syncAsByte(_stopWalking);
+ s.syncAsByte(_twinklesTalking);
+ s.syncAsByte(_twinklesTalk2);
+
+ s.syncAsSint32LE(_doorway);
+
+ s.syncString(_subQuote2);
+}
+
+void Scene210::setup() {
+ setPlayerSpritesPrefix();
+ setAAName();
+ _scene->addActiveVocab(NOUN_DOORWAY);
+ _scene->addActiveVocab(VERB_WALK_THROUGH);
+}
+
+void Scene210::handleConversations() {
+ if (_game._trigger == 0) {
+ _scene->_kernelMessages.reset();
+ _game._player._stepEnabled = false;
+ Common::String curQuote = _game.getQuote(_action._activeAction._verbId);
+ if (_scene->_kernelMessages._talkFont->getWidth(curQuote, _scene->_textSpacing) > 200) {
+ Common::String subQuote1;
+ _game.splitQuote(curQuote, subQuote1, _subQuote2);
+ _scene->_kernelMessages.add(Common::Point(0, -14), 0x1110, 34, 0, 240, subQuote1);
+ _scene->_sequences.addTimer(60, 50);
+ } else {
+ _scene->_kernelMessages.add(Common::Point(0, 0), 0x1110, 34, 1, 120, curQuote);
+ }
+ } else if (_game._trigger == 50) {
+ _scene->_kernelMessages.add(Common::Point(0, 0), 0x1110, 34, 0, 240, _subQuote2);
+ _scene->_sequences.addTimer(180, 1);
+ } else {
+ if (_game._trigger == 1)
+ _scene->_kernelMessages.reset();
+
+ switch (_curDialogNode) {
+ case 1:
+ handleConversation1();
+ break;
+
+ case 2:
+ handleConversation2();
+ break;
+
+ case 3:
+ handleConversation3();
+ break;
+
+ case 5:
+ handleConversation5();
+ break;
+
+ case 6:
+ handleConversation6();
+ break;
+
+ case 7:
+ handleConversation7();
+ break;
+
+ case 8:
+ handleConversation8();
+ break;
+ }
+ }
+}
+
+void Scene210::handleConversation1() {
+ switch (_action._activeAction._verbId) {
+ case 180:
+ setDialogNode(2);
+ break;
+
+ case 181:
+ setDialogNode(6);
+ break;
+
+ case 182:
+ setDialogNode(4);
+ break;
+
+ case 183:
+ setDialogNode(9);
+ break;
+
+ case 184:
+ setDialogNode(0);
+ break;
+ }
+}
+
+void Scene210::handleConversation2() {
+ switch (_action._activeAction._verbId) {
+ case 187:
+ setDialogNode(3);
+ break;
+
+ case 188:
+ setDialogNode(4);
+ break;
+
+ case 189:
+ setDialogNode(0);
+ break;
+ }
+}
+
+void Scene210::handleConversation3() {
+ switch (_action._activeAction._verbId) {
+ case 193:
+ setDialogNode(6);
+ break;
+
+ case 194:
+ setDialogNode(5);
+ break;
+
+ case 195:
+ setDialogNode(4);
+ break;
+
+ case 196:
+ setDialogNode(0);
+ break;
+ }
+}
+
+void Scene210::handleConversation5() {
+ switch (_action._activeAction._verbId) {
+ case 204:
+ setDialogNode(6);
+ break;
+
+ case 205:
+ case 206:
+ setDialogNode(4);
+ break;
+
+ case 207:
+ setDialogNode(0);
+ break;
+ }
+}
+
+void Scene210::handleConversation6() {
+ switch (_action._activeAction._verbId) {
+ case 211:
+ setDialogNode(7);
+ break;
+
+ case 212:
+ setDialogNode(4);
+ break;
+
+ case 213:
+ setDialogNode(0);
+ break;
+ }
+}
+
+void Scene210::handleConversation7() {
+ switch (_action._activeAction._verbId) {
+ case 216:
+ case 217:
+ case 219:
+ setDialogNode(4);
+ break;
+
+ case 218:
+ setDialogNode(8);
+ break;
+
+ case 220:
+ setDialogNode(0);
+ break;
+ }
+}
+
+void Scene210::handleConversation8() {
+ switch (_action._activeAction._verbId) {
+ case 223:
+ case 224:
+ setDialogNode(4);
+ break;
+
+ case 225:
+ case 226:
+ setDialogNode(9);
+ break;
+
+ case 227:
+ setDialogNode(0);
+ break;
+ }
+}
+
+void Scene210::setDialogNode(int node) {
+ switch (node) {
+ case 0:
+ _scene->_userInterface.setup(kInputBuildingSentences);
+ _shouldFaceRex = false;
+ _shouldTalk = false;
+ _game._player._stepEnabled = true;
+ _curDialogNode = 0;
+ break;
+
+ case 2:
+ switch (_game._trigger) {
+ case 1:
+ _nextHandsPlace = 1;
+ _shouldTalk = true;
+ _game._player._stepEnabled = false;
+ if (_twinklesTalking) {
+ handleTwinklesSpeech(0xB9, -1, 0);
+ _scene->_sequences.addTimer(180, 2);
+ } else {
+ _scene->_sequences.addTimer(6, 1);
+ }
+ break;
+
+ case 2:
+ _nextHandsPlace = 0;
+ handleTwinklesSpeech(186, 0, 0);
+ _scene->_sequences.addTimer(180, 3);
+ break;
+
+ default:
+ _nextHandsPlace = 0;
+ _shouldTalk = false;
+ _game._player._stepEnabled = true;
+ newNode(2);
+ break;
+ }
+ break;
+
+ case 3:
+ switch (_game._trigger) {
+ case 1:
+ _nextHandsPlace = 0;
+ _shouldTalk = true;
+ _game._player._stepEnabled = false;
+ if (_twinklesTalking) {
+ handleTwinklesSpeech(0xBE, -2, 0);
+ _scene->_sequences.addTimer(180, 2);
+ } else {
+ _scene->_sequences.addTimer(6, 1);
+ }
+ break;
+ case 2:
+ _nextHandsPlace = 2;
+ handleTwinklesSpeech(191, -1, 0);
+ _scene->_sequences.addTimer(180, 3);
+ break;
+ case 3:
+ _nextHandsPlace = 0;
+ handleTwinklesSpeech(192, 0, 0);
+ _scene->_sequences.addTimer(180, 4);
+ break;
+ default:
+ _shouldTalk = false;
+ _game._player._stepEnabled = true;
+ newNode(3);
+ break;
+ }
+ break;
+
+ case 4:
+ if (_game._trigger == 1) {
+ _nextHandsPlace = 1;
+ _shouldTalk = true;
+ _game._player._stepEnabled = false;
+
+ int quote;
+ if (_game._storyMode == STORYMODE_NAUGHTY)
+ quote = _vm->getRandomNumber(199, 201);
+ else
+ quote = _vm->getRandomNumber(197, 198);
+
+ if (_twinklesTalking) {
+ handleTwinklesSpeech(quote, 0, 360);
+ _scene->_sequences.addTimer(120, 2);
+ } else {
+ _scene->_sequences.addTimer(6, 1);
+ }
+ } else {
+ _scene->_userInterface.setup(kInputBuildingSentences);
+ _shouldFaceRex = false;
+ _shouldTalk = false;
+ _game._player._stepEnabled = true;
+ }
+ break;
+
+ case 5:
+ switch (_game._trigger) {
+ case 1:
+ _nextHandsPlace = 2;
+ _shouldTalk = true;
+ _game._player._stepEnabled = false;
+ if (_twinklesTalking) {
+ handleTwinklesSpeech(0xCA, -1, 0);
+ _scene->_sequences.addTimer(180, 2);
+ } else {
+ _scene->_sequences.addTimer(6, 1);
+ }
+ break;
+
+ case 2:
+ _nextHandsPlace = 1;
+ handleTwinklesSpeech(0xCB, 0, 0);
+ _scene->_sequences.addTimer(180, 3);
+ break;
+
+ default:
+ _nextHandsPlace = 2;
+ _shouldTalk = false;
+ _game._player._stepEnabled = true;
+ newNode(5);
+ break;
+ }
+ break;
+
+ case 6:
+ switch (_game._trigger) {
+ case 1:
+ _nextHandsPlace = 1;
+ _shouldTalk = true;
+ _game._player._stepEnabled = false;
+ if (_twinklesTalking) {
+ handleTwinklesSpeech(0xD0, -2, 0);
+ _scene->_sequences.addTimer(180, 2);
+ } else {
+ _scene->_sequences.addTimer(6, 1);
+ }
+ break;
+
+ case 2:
+ handleTwinklesSpeech(0xD1, -1, 0);
+ _scene->_sequences.addTimer(180, 3);
+ break;
+
+ case 3:
+ _nextHandsPlace = 1;
+ handleTwinklesSpeech(0xD2, 0, 0);
+ _scene->_sequences.addTimer(180, 4);
+ break;
+
+ default:
+ _nextHandsPlace = 0;
+ _shouldTalk = false;
+ _game._player._stepEnabled = true;
+ newNode(6);
+ break;
+ }
+ break;
+
+ case 7:
+ switch (_game._trigger) {
+ case 1:
+ _nextHandsPlace = 2;
+ _shouldTalk = true;
+ _game._player._stepEnabled = false;
+ if (_twinklesTalking) {
+ handleTwinklesSpeech(0xD6, -1, 0);
+ _scene->_sequences.addTimer(180, 2);
+ } else {
+ _scene->_sequences.addTimer(6, 1);
+ }
+ break;
+
+ case 2:
+ handleTwinklesSpeech(0xD7, 0, 0);
+ _scene->_sequences.addTimer(180, 3);
+ break;
+
+ default:
+ _shouldTalk = false;
+ _game._player._stepEnabled = true;
+ newNode(7);
+ break;
+ }
+ break;
+
+ case 8:
+ switch (_game._trigger) {
+ case 1:
+ _nextHandsPlace = 2;
+ _shouldTalk = true;
+ _game._player._stepEnabled = false;
+ if (_twinklesTalking) {
+ handleTwinklesSpeech(0xDD, -1, 0);
+ _scene->_sequences.addTimer(180, 2);
+ } else {
+ _scene->_sequences.addTimer(6, 1);
+ }
+ break;
+
+ case 2:
+ handleTwinklesSpeech(0xDE, 0, 0);
+ _scene->_sequences.addTimer(180, 3);
+ break;
+
+ default:
+ _shouldTalk = false;
+ _game._player._stepEnabled = true;
+ newNode(8);
+ break;
+ }
+ break;
+
+
+ case 9:
+ switch (_game._trigger) {
+ case 1:
+ _nextHandsPlace = 0;
+ _shouldTalk = true;
+ _game._player._stepEnabled = false;
+ if (_twinklesTalking) {
+ _scene->_userInterface.emptyConversationList();
+ _scene->_userInterface.setup(kInputConversation);
+ handleTwinklesSpeech(0xE4, -1, 0);
+ _scene->_sequences.addTimer(180, 2);
+ } else {
+ _scene->_sequences.addTimer(6, 1);
+ }
+ break;
+
+ case 2:
+ handleTwinklesSpeech(0xE5, 0, 0);
+ _scene->_sequences.addTimer(180, 3);
+ break;
+
+ case 3:
+ _twinkleAnimationType = 2;
+ _globals[kCurtainOpen] = true;
+ _game._player._visible = false;
+ _vm->_palette->lock();
+ _scene->_kernelMessages.reset();
+ _scene->freeAnimation();
+ _scene->_activeAnimation = nullptr;
+ _scene->resetScene();
+
+ _globals._spriteIndexes[1] = _scene->_sprites.addSprites(formAnimName('c', -1));
+ _game.loadQuoteSet(0xE6, 0xE9, 0xEA, 0xE7, 0xE8, 0);
+ _scene->loadAnimation(formAnimName('B', -1), 4);
+ break;
+
+ case 4: {
+ _globals._spriteIndexes[8] = _scene->_sequences.startCycle(_globals._spriteIndexes[1], false, 5);
+ _scene->_sequences.setDepth(_globals._spriteIndexes[8], 1);
+
+ int msgIndex = _scene->_kernelMessages.add(Common::Point(160, 20), 0x1110, 32, 5, 180, _game.getQuote(231));
+ _scene->_kernelMessages.setQuoted(msgIndex, 4, true);
+ }
+ break;
+
+ case 5: {
+ int msgIndex = _scene->_kernelMessages.add(Common::Point(160, 40), 0xFDFC, 32, 6, 180, _game.getQuote(233));
+ _scene->_kernelMessages.setQuoted(msgIndex, 4, true);
+ }
+ break;
+
+ case 6: {
+ int msgIndex = _scene->_kernelMessages.add(Common::Point(160, 60), 0x1110, 32, 7, 180, _game.getQuote(232));
+ _scene->_kernelMessages.setQuoted(msgIndex, 4, true);
+ }
+ break;
+
+ case 7: {
+ int msgIndex = _scene->_kernelMessages.add(Common::Point(160, 80), 0xFDFC, 32, 8, 180, _game.getQuote(234));
+ _scene->_kernelMessages.setQuoted(msgIndex, 4, true);
+ }
+ break;
+
+ case 8:
+ _globals[kTwinklesStatus] = TWINKLES_GONE;
+ _scene->_nextSceneId = 216;
+ break;
+ }
+ break;
+ }
+}
+
+void Scene210::handleTwinklesSpeech(int quoteId, int shiftX, uint32 delay) {
+ _scene->_kernelMessages.add(Common::Point(10, 70 + (shiftX * 14)), 0xFDFC, 0, 0, (delay == 0) ? 9999999 : delay, _game.getQuote(quoteId));
+}
+
+void Scene210::newNode(int node) {
+ _curDialogNode = node;
+
+ switch (_curDialogNode) {
+ case 1:
+ _conv1.start();
+ break;
+
+ case 2:
+ _conv2.start();
+ break;
+
+ case 3:
+ _conv3.start();
+ break;
+
+ case 5:
+ _conv5.start();
+ break;
+
+ case 6:
+ _conv6.start();
+ break;
+
+ case 7:
+ _conv7.start();
+ break;
+
+ case 8:
+ _conv8.start();
+ break;
+
+ default:
+ break;
+ }
+}
+
+void Scene210::restoreDialogNode(int node, int msgId, int posY) {
+ int curQuoteId = msgId;
+ int curY = 1 - posY;
+ for (int count = 0; count < posY; count++) {
+ handleTwinklesSpeech(curQuoteId, curY, 0);
+ curY++;
+ curQuoteId++;
+ }
+
+ newNode(node);
+}
+
+void Scene210::enter() {
+ _globals._spriteIndexes[1] = _scene->_sprites.addSprites(formAnimName('c', -1));
+
+ if (!_game._visitedScenes._sceneRevisited)
+ _globals[kCurtainOpen] = 0;
+
+ if (_scene->_priorSceneId == 205)
+ _game._player._playerPos = Common::Point(277, 56);
+ else if (_scene->_priorSceneId == 215) {
+ _game._player._playerPos = Common::Point(168, 128);
+ _game._player._facing = FACING_SOUTH;
+ _globals[kCurtainOpen] = true;
+ } else if (_scene->_priorSceneId != -2)
+ _game._player._playerPos = Common::Point(308, 132);
+
+ if (!_globals[kCurtainOpen]) {
+ _globals._sequenceIndexes[1] = _scene->_sequences.startCycle(_globals._spriteIndexes[1], false, 5);
+ _scene->_sequences.setDepth(_globals._sequenceIndexes[1], 5);
+ } else {
+ int idx = _scene->_dynamicHotspots.add(112, 395, -1, Common::Rect(163, 87, 163 + 19, 87 + 36));
+ _doorway = _scene->_dynamicHotspots.setPosition(idx, Common::Point(168, 127), FACING_NORTH);
+ _scene->_dynamicHotspots.setCursor(_doorway, CURSOR_GO_UP);
+ }
+
+ _game.loadQuoteSet(0x5A, 0x73, 0xAB, 0xAC, 0xAD, 0xAE, 0xAF, 0xB0, 0xB1, 0xB2, 0xB3, 0xB4, 0xB5, 0xB6, 0xB8, 0xB7,
+ 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, 0);
+
+ _conv1.setup(0x2E, 0xB4, 0xB5, 0xB6, 0xB7, 0xB8, 0);
+
+ if (!_game._visitedScenes._sceneRevisited) {
+ _conv1.set(0x2E, 0xB4, 0xB5, 0xB6, 0xB8, 0);
+
+ if (_game._widepipeCtr >= 2)
+ _conv1.write(0xB7, true);
+ }
+
+ bool sceneRevisited = _game._visitedScenes._sceneRevisited;
+ _conv2.setup(0x2F, 0xBC, 0xBB, 0xBD, sceneRevisited ? 0 : -1);
+ _conv3.setup(0x30, 0xC3, 0xC2, 0xC1, 0xC4, sceneRevisited ? 0 : -1);
+ _conv5.setup(0x31, 0xCD, 0xCC, 0xCE, 0xCF, sceneRevisited ? 0 : -1);
+ _conv6.setup(0x32, 0xD3, 0xD4, 0xD5, sceneRevisited ? 0 : -1);
+ _conv7.setup(0x33, 0xD8, 0xDA, 0xD9, 0xDB, 0xDC, sceneRevisited ? 0 : -1);
+ _conv8.setup(0x34, 0xDF, 0xE0, 0xE1, 0xE2, 0xE3, sceneRevisited ? 0 : -1);
+
+ _twinkleAnimationType = 0;
+ _twinklesCurrentFrame = 0;
+
+ if (_scene->_priorSceneId != -2) {
+ _shouldMoveHead = false;
+ _shouldFaceRex = false;
+ _shouldTalk = false;
+ _nextHandsPlace = 0;
+ _twinklesTalking = false;
+ _curDialogNode = 0;
+ _stopWalking = false;
+ _twinklesTalk2 = (_globals[kTwinklesApproached] > 0);
+ }
+
+ if (_globals[kTwinklesStatus] == 0) {
+ _scene->loadAnimation(formAnimName('A', -1));
+ _twinkleAnimationType = 1;
+ } else
+ _scene->_hotspots.activate(476, false);
+
+ if (_curDialogNode) {
+ int quote = 0;
+ int number = 0;
+
+ switch (_curDialogNode) {
+ case 1:
+ quote = 0xB3;
+ number = 1;
+ break;
+ case 2:
+ quote = 0xB9;
+ number = 2;
+ break;
+ case 3:
+ quote = 0xBE;
+ number = 3;
+ break;
+ case 5:
+ quote = 0xCA;
+ number = 2;
+ break;
+ case 6:
+ quote = 0xD0;
+ number = 3;
+ break;
+ case 7:
+ quote = 0xD6;
+ number = 2;
+ break;
+ case 8:
+ quote = 0xDD;
+ number = 2;
+ break;
+ }
+
+ restoreDialogNode(_curDialogNode, quote, number);
+ if (_scene->_activeAnimation)
+ _scene->_activeAnimation->setCurrentFrame(131);
+ }
+
+ _vm->_palette->setEntry(252, 63, 63, 10);
+ _vm->_palette->setEntry(253, 45, 45, 5);
+
+ sceneEntrySound();
+}
+
+void Scene210::step() {
+ if ((_twinkleAnimationType == 1) && _scene->_activeAnimation) {
+ if (_twinklesCurrentFrame != _scene->_activeAnimation->getCurrentFrame()) {
+ _twinklesCurrentFrame = _scene->_activeAnimation->getCurrentFrame();
+ int reset_frame = -1;
+ int random = _vm->getRandomNumber(1, 1000);
+
+ switch (_twinklesCurrentFrame) {
+ case 31:
+ case 58:
+ case 74:
+ case 108:
+ case 190:
+ if (_shouldFaceRex)
+ reset_frame = 108;
+ else if ((random <= 100) || _shouldMoveHead)
+ reset_frame = 74;
+ else if (random <= 300)
+ reset_frame = 58;
+ else if (random <= 500)
+ reset_frame = 31;
+ else
+ reset_frame = 0;
+ break;
+
+ case 80:
+ case 90:
+ _twinklesTalking = false;
+ if (_shouldMoveHead) {
+ reset_frame = 90;
+ } else if (_twinklesCurrentFrame == 90) {
+ if ((random <= 400) || _shouldFaceRex)
+ reset_frame = 99;
+ else
+ reset_frame = 79;
+ }
+ break;
+
+ case 98:
+ if (_shouldMoveHead)
+ reset_frame = 91;
+ break;
+
+ case 99:
+ if ((random <= 400) && !_shouldFaceRex)
+ reset_frame = 79;
+ break;
+
+ case 124:
+ case 136:
+ case 174:
+ case 143:
+ case 152:
+ if (_nextHandsPlace == 3)
+ reset_frame = 174;
+ else if (!_shouldFaceRex)
+ reset_frame = 174;
+ else if (_nextHandsPlace == 1)
+ reset_frame = 136;
+ else if (_nextHandsPlace == 2)
+ reset_frame = 152;
+ else if (_shouldTalk)
+ reset_frame = 124;
+ else
+ reset_frame = (random <= 200) ? 131 : 143;
+ break;
+
+ case 131:
+ if (_shouldTalk) {
+ switch (_nextHandsPlace) {
+ case 1:
+ reset_frame = 136;
+ break;
+ case 2:
+ reset_frame = 152;
+ break;
+ default:
+ reset_frame = 124;
+ break;
+ }
+ }
+ break;
+
+ case 138:
+ case 141:
+ if ((_nextHandsPlace == 0) || !_shouldFaceRex)
+ reset_frame = 141;
+ else if (_nextHandsPlace == 2)
+ reset_frame = 152;
+ else if (!_shouldTalk || (_twinklesCurrentFrame == 141))
+ reset_frame = 137;
+ break;
+
+ case 153:
+ case 169:
+ if ((_nextHandsPlace == 0) || !_shouldFaceRex)
+ reset_frame = 169;
+ else if (_nextHandsPlace == 1)
+ reset_frame = 136;
+ else if (_shouldTalk)
+ reset_frame = 153;
+ else
+ reset_frame = 162;
+ break;
+
+ case 162:
+ if (_shouldTalk) {
+ switch (_nextHandsPlace) {
+ case 0:
+ reset_frame = 124;
+ break;
+ case 1:
+ reset_frame = 136;
+ break;
+ default:
+ reset_frame = 153;
+ break;
+ }
+ }
+ break;
+ }
+
+ if (reset_frame >= 0) {
+ if (reset_frame != _scene->_activeAnimation->getCurrentFrame()) {
+ _scene->_activeAnimation->setCurrentFrame(reset_frame);
+ _twinklesCurrentFrame = reset_frame;
+ }
+
+ if ((reset_frame == 90) || (reset_frame == 91) || (reset_frame == 124) || (reset_frame == 153)
+ || ((reset_frame == 137) && _shouldTalk)) {
+ _twinklesTalking = true;
+ } else {
+ _twinklesTalking = false;
+ }
+ }
+ }
+ }
+
+ if ((_twinkleAnimationType == 2) && _scene->_activeAnimation) {
+ if (_twinklesCurrentFrame != _scene->_activeAnimation->getCurrentFrame()) {
+ _twinklesCurrentFrame = _scene->_activeAnimation->getCurrentFrame();
+ int reset_frame = -1;
+
+ if (_twinklesCurrentFrame == 53) {
+ _scene->_kernelMessages.add(Common::Point(151, 61), 0xFDFC, 32, 70, 180, _game.getQuote(230));
+ _shouldTalk = true;
+ } else if ((_twinklesCurrentFrame == 75) && _shouldTalk)
+ reset_frame = 60;
+
+ if ((reset_frame >= 0) && (reset_frame != _scene->_activeAnimation->getCurrentFrame())) {
+ _scene->_activeAnimation->setCurrentFrame(reset_frame);
+ _twinklesCurrentFrame = reset_frame;
+ }
+ }
+
+ if (_game._trigger == 70)
+ _shouldTalk = false;
+ }
+
+ if ((_twinkleAnimationType == 1) && (_scene->_rails.getNext() > 0)) {
+ _game._player.walk(Common::Point(214, 150), FACING_NORTHWEST);
+ _scene->_rails.resetNext();
+ _stopWalking = true;
+ }
+}
+
+void Scene210::preActions() {
+ _stopWalking = false;
+
+ if (_action.isAction(VERB_WALK_DOWN, NOUN_PATH_TO_EAST))
+ _game._player._walkOffScreenSceneId = 211;
+}
+
+void Scene210::actions() {
+ if (_action.isAction(VERB_LOOK, NOUN_BINOCULARS, NOUN_HUT_TO_NORTH)) {
+ _vm->_dialogs->show(21017);
+ } else if (_game._screenObjects._inputMode == kInputConversation) {
+ handleConversations();
+ } else if (_action.isAction(VERB_TALKTO, NOUN_NATIVE_WOMAN) ||
+ ((_game._player._playerPos == Common::Point(214, 150)) && (_game._player._facing == FACING_NORTHWEST) && (_twinkleAnimationType == 1) && _stopWalking)) {
+ switch (_game._trigger) {
+ case 0: {
+ _game._player._stepEnabled = false;
+ int quote;
+ if (_globals[kTwinklesApproached] == 0)
+ quote = 90;
+ else if (_globals[kTwinklesApproached] == 1)
+ quote = 115;
+ else
+ quote = 171;
+
+ _shouldFaceRex = true;
+ _nextHandsPlace = 0;
+ _scene->_kernelMessages.reset();
+ _scene->_kernelMessages.addQuote(quote, 1, 120);
+ }
+ break;
+
+ case 1:
+ _shouldTalk = true;
+ if (!_twinklesTalking) {
+ _scene->_sequences.addTimer(6, 1);
+ } else {
+ if (_globals[kTwinklesApproached] == 0) {
+ handleTwinklesSpeech(0xAF, -1, 0);
+ handleTwinklesSpeech(0xB0, 0, 0);
+ } else if (_globals[kTwinklesApproached] == 1) {
+ handleTwinklesSpeech(0xB1, 0, 0);
+ } else {
+ int quote = _twinklesTalk2 ? 0xB3 : 0xB2;
+ _twinklesTalk2 = true;
+ handleTwinklesSpeech(quote, 0, 0);
+ }
+ _scene->_sequences.addTimer(60, 3);
+ }
+ break;
+
+ case 3:
+ _game._player._stepEnabled = true;
+ _shouldMoveHead = false;
+ _shouldTalk = false;
+
+ if (_globals[kTwinklesApproached] < 2)
+ _globals[kTwinklesApproached]++;
+
+ _conv1.start();
+ _curDialogNode = 1;
+ break;
+ }
+ } else if (_action.isAction(VERB_GIVE, NOUN_NATIVE_WOMAN) && _game._objects.isInInventory(_game._objects.getIdFromDesc(_action._activeAction._objectNameId))) {
+ switch (_game._trigger) {
+ case 0: {
+ int quote = _vm->getRandomNumber(172, 174);
+ _shouldMoveHead = true;
+ _game._player._stepEnabled = false;
+ handleTwinklesSpeech(quote, 0, 120);
+ _scene->_sequences.addTimer(120, 1);
+ }
+ break;
+
+ case 1:
+ _game._player._stepEnabled = true;
+ _shouldMoveHead = false;
+ break;
+ }
+ } else if (_action.isAction(VERB_WALK_DOWN, NOUN_PATH_TO_NORTH) || _action.isAction(VERB_WALK_TOWARDS, NOUN_HUT_TO_NORTH)) {
+ _scene->_nextSceneId = 205;
+ } else if (_action.isAction(VERB_WALK_THROUGH, NOUN_DOORWAY)) {
+ _scene->_nextSceneId = 215;
+ } else if ((_action.isAction(VERB_PULL, NOUN_CURTAIN) || _action.isAction(VERB_OPEN, NOUN_CURTAIN)) && !_globals[kCurtainOpen]) {
+ switch (_game._trigger) {
+ case 0:
+ _game._player._stepEnabled = false;
+ _scene->_sequences.remove(_globals._sequenceIndexes[1]);
+ _globals._sequenceIndexes[1] = _scene->_sequences.addReverseSpriteCycle(_globals._spriteIndexes[1], false, 12, 1, 0, 0);
+ _scene->_sequences.setDepth(_globals._sequenceIndexes[1], 5);
+ _scene->_sequences.addSubEntry(_globals._sequenceIndexes[1], SEQUENCE_TRIGGER_EXPIRE, 0, 1);
+ break;
+
+ case 1:
+ _game._player._stepEnabled = true;
+ _globals[kCurtainOpen] = true;
+ _doorway = _scene->_dynamicHotspots.add(112, 395, -1, Common::Rect(163, 87, 163 + 19, 87 + 36));
+ _scene->_dynamicHotspots.setPosition(_doorway, Common::Point(168, 127), FACING_NORTH);
+ _scene->_dynamicHotspots.setCursor(_doorway, CURSOR_GO_UP);
+ break;
+ }
+ } else if ((_action.isAction(VERB_PULL, NOUN_CURTAIN) || _action.isAction(VERB_CLOSE, NOUN_CURTAIN)) && _globals[kCurtainOpen]) {
+ switch (_game._trigger) {
+ case 0:
+ _scene->_sequences.remove(_globals._sequenceIndexes[1]);
+ _game._player._stepEnabled = false;
+ _game._player._facing = FACING_NORTH;
+ _globals._sequenceIndexes[1] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[1], false, 12, 0, 0, 1);
+ _scene->_sequences.setDepth(_globals._sequenceIndexes[1], 5);
+ _scene->_sequences.addSubEntry(_globals._sequenceIndexes[1], SEQUENCE_TRIGGER_EXPIRE, 0, 1);
+ _game._player._stepEnabled = false;
+ break;
+ case 1:
+ _globals._sequenceIndexes[1] = _scene->_sequences.startCycle(_globals._spriteIndexes[1], false, 5);
+ _scene->_sequences.setDepth(_globals._sequenceIndexes[1], 5);
+ _scene->_sequences.addTimer(48, 2);
+ break;
+ case 2:
+ _scene->_dynamicHotspots.remove(_doorway);
+ _game._player._stepEnabled = true;
+ _globals[kCurtainOpen] = false;
+ break;
+ }
+ } else if (_action.isAction(VERB_LOOK, NOUN_HUT)) {
+ if (_globals[kTwinklesStatus] == TWINKLES_GONE) {
+ if (_game._storyMode == STORYMODE_NAUGHTY)
+ _vm->_dialogs->show(21003);
+ else
+ _vm->_dialogs->show(21002);
+ } else {
+ _vm->_dialogs->show(21001);
+ }
+ } else if (_action.isAction(VERB_LOOK, NOUN_BRA)) {
+ _vm->_dialogs->show(21004);
+ } else if (_action.isAction(VERB_LOOK, NOUN_HOTPANTS)) {
+ _vm->_dialogs->show(21005);
+ } else if (_action.isAction(VERB_TAKE, NOUN_HOTPANTS) || _action.isAction(VERB_TAKE, NOUN_BRA)) {
+ _vm->_dialogs->show(21006);
+ } else if (_action.isAction(VERB_LOOK, NOUN_STREAM)) {
+ _vm->_dialogs->show(21007);
+ } else if (_action.isAction(VERB_LOOK, NOUN_BUSHY_FERN)) {
+ _vm->_dialogs->show(21008);
+ } else if (_action.isAction(VERB_LOOK, NOUN_VILLAGE_PATH)) {
+ _vm->_dialogs->show(21009);
+ } else if (_action.isAction(VERB_LOOK, NOUN_NATIVE_WOMAN)) {
+ _vm->_dialogs->show(21010);
+ } else if (_action.isAction(VERB_SHOOT, NOUN_NATIVE_WOMAN) || _action.isAction(VERB_HOSE_DOWN, NOUN_NATIVE_WOMAN)) {
+ _vm->_dialogs->show(21011);
+ } else if (_action.isAction(VERB_LOOK, NOUN_PATH_TO_NORTH)) {
+ _vm->_dialogs->show(21012);
+ } else if (_action.isAction(VERB_LOOK, NOUN_CURTAIN)) {
+ _vm->_dialogs->show(21013);
+ } else if (_action.isAction(VERB_LOOK, NOUN_CLOTHESLINE)) {
+ _vm->_dialogs->show(21014);
+ } else if (_action.isAction(VERB_TAKE, NOUN_CLOTHESLINE)) {
+ _vm->_dialogs->show(21015);
+ } else if (_action.isAction(VERB_LOOK, NOUN_HUT_TO_NORTH)) {
+ _vm->_dialogs->show(21016);
+ } else {
+ // Not handled
+ return;
+ }
+
+ _action._inProgress = false;
+}
+
+/*------------------------------------------------------------------------*/
+
+Scene211::Scene211(MADSEngine *vm) : Scene2xx(vm) {
+ _ambushFl = false;
+ _wakeFl = false;
+ _monkeyFrame = 0;
+ _scrollY = 0;
+ _monkeyTime = 0;
+}
+
+void Scene211::synchronize(Common::Serializer &s) {
+ Scene2xx::synchronize(s);
+
+ s.syncAsByte(_ambushFl);
+ s.syncAsByte(_wakeFl);
+
+ s.syncAsSint32LE(_monkeyFrame);
+ s.syncAsSint32LE(_scrollY);
+ s.syncAsUint32LE(_monkeyTime);
+}
+
+void Scene211::setup() {
+ setPlayerSpritesPrefix();
+ setAAName();
+
+ _scene->addActiveVocab(NOUN_SLITHERING_SNAKE);
+}
+
+void Scene211::enter() {
+ _globals._spriteIndexes[1] = _scene->_sprites.addSprites("*SC002Z2");
+ _wakeFl = false;
+
+ if (_scene->_priorSceneId == 210)
+ _game._player._playerPos = Common::Point(25, 148);
+ else if (_scene->_priorSceneId == 205) {
+ _game._player._playerPos = Common::Point(49, 133);
+ _game._player._facing = FACING_WEST;
+ _wakeFl = true;
+ _game._player._stepEnabled = false;
+ _game._player._visible = false;
+ _scene->loadAnimation(formAnimName('A', -1), 100);
+ _scene->_activeAnimation->setCurrentFrame(169);
+ } else if (_scene->_priorSceneId != -2) {
+ _game._player._playerPos = Common::Point(310, 31);
+ _game._player._facing = FACING_SOUTHWEST;
+ }
+
+ if (_vm->getRandomNumber(1, 8) == 1) {
+ _globals._sequenceIndexes[2] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[1], false, 6, 0, 0, 0);
+ _scene->_sequences.setPosition(_globals._sequenceIndexes[2], Common::Point(202, 126));
+ _scene->_sequences.setDepth(_globals._sequenceIndexes[2], 8);
+ _scene->_sequences.setMotion(_globals._sequenceIndexes[2], SEQUENCE_TRIGGER_SPRITE, -200, 0);
+ _scene->_dynamicHotspots.add(324, 13, _globals._sequenceIndexes[2], Common::Rect(1, 1, 1 + 41, 1 + 10));
+ }
+
+ if (_scene->_roomChanged)
+ _game._objects.addToInventory(OBJ_BINOCULARS);
+
+ _vm->_palette->setEntry(252, 63, 44, 30);
+ _vm->_palette->setEntry(253, 63, 20, 22);
+ _game.loadQuoteSet(0xA1, 0xA2, 0xA3, 0xA4, 0xA5, 0xA6, 0xA7, 0xA8, 0x97, 0x98, 0x99, 0x9A, 0x9B, 0x9C, 0x9D, 0x9E, 1, 0);
+
+ if (_globals[kMonkeyStatus] == MONKEY_AMBUSH_READY)
+ _scene->_kernelMessages.initRandomMessages(2,
+ Common::Rect(0, 0, 54, 30), 13, 2, 0xFDFC, 60,
+ 151, 152, 153, 154, 0);
+
+ _monkeyTime = _vm->_game->_scene._frameStartTime;
+ _scrollY = 30;
+
+ _ambushFl = false;
+ _monkeyFrame = 0;
+
+ sceneEntrySound();
+}
+
+void Scene211::step() {
+ if (_globals[kMonkeyStatus] == MONKEY_AMBUSH_READY) {
+ _scene->_kernelMessages.randomServer();
+
+ if (!_ambushFl && !_wakeFl && (_vm->_game->_scene._frameStartTime >= _monkeyTime)) {
+ int chanceMinor = _scene->_kernelMessages.checkRandom() * 4 + 1;
+ if (_scene->_kernelMessages.generateRandom(80, chanceMinor))
+ _vm->_sound->command(18);
+
+ _monkeyTime = _vm->_game->_scene._frameStartTime + 2;
+ }
+
+ if ((_game._player._playerPos == Common::Point(52, 132)) && (_game._player._facing == FACING_WEST) && !_game._player._moving &&
+ (_game._trigger || !_ambushFl)) {
+ switch (_game._trigger) {
+ case 0:
+ if (_game._objects.isInInventory(OBJ_BINOCULARS)) {
+ _ambushFl = true;
+ _monkeyFrame = 0;
+ _game._player._stepEnabled = false;
+ _game._player._visible = false;
+ _scene->_kernelMessages.reset();
+ _scene->loadAnimation(formAnimName('A', -1), 90);
+ _vm->_sound->command(19);
+ int count = (int)_game._objects._inventoryList.size();
+ for (int idx = 0; idx < count; idx++) {
+ if ((_game._objects._inventoryList[idx] == OBJ_BINOCULARS) && (_scene->_userInterface._selectedInvIndex != idx))
+ _scene->_userInterface.selectObject(idx);
+ }
+ }
+ break;
+
+ case 90:
+ _vm->_sound->command(10);
+ _game._player._stepEnabled = true;
+ _game._player._visible = true;
+ _game._player._playerPos = Common::Point(49, 133);
+ _ambushFl = false;
+ _globals[kMonkeyStatus] = MONKEY_HAS_BINOCULARS;
+ break;
+ }
+ }
+ }
+
+ if (_ambushFl && (_scene->_activeAnimation->getCurrentFrame() > _monkeyFrame)) {
+ _monkeyFrame = _scene->_activeAnimation->getCurrentFrame();
+ switch (_monkeyFrame) {
+ case 2: {
+ int msgIndex = _scene->_kernelMessages.add(Common::Point(12, 4), 0xFDFC, 0, 0, 60, _game.getQuote(157));
+ _scene->_kernelMessages.setQuoted(msgIndex, 2, true);
+ }
+ break;
+
+ case 12: {
+ int msgIndex = _scene->_kernelMessages.add(Common::Point(35, 20), 0xFDFC, 0, 0, 60, _game.getQuote(155));
+ _scene->_kernelMessages.setQuoted(msgIndex, 4, true);
+ }
+ break;
+
+ case 42: {
+ int msgIndex = _scene->_kernelMessages.add(Common::Point(60, 45), 0xFDFC, 0, 0, 60, _game.getQuote(156));
+ _scene->_kernelMessages.setQuoted(msgIndex, 6, true);
+ }
+ break;
+
+ case 73:
+ _scene->_kernelMessages.add(Common::Point(102, 95), 0xFDFC, 32, 0, 75, _game.getQuote(157));
+ break;
+
+ case 90: {
+ int msgIndex = _scene->_kernelMessages.add(Common::Point(102, 95), 0xFDFC, 32, 0, 60, _game.getQuote(158));
+ _scene->_kernelMessages.setQuoted(msgIndex, 6, true);
+ }
+ break;
+
+ case 97:
+ _scene->_userInterface.selectObject(-1);
+ _game._objects.removeFromInventory(OBJ_BINOCULARS, 1);
+ break;
+
+ case 177: {
+ int msgIndex = _scene->_kernelMessages.add(Common::Point(63, _scrollY), 0x1110, 0, 0, 180, _game.getQuote(161));
+ _scene->_kernelMessages.setQuoted(msgIndex, 4, true);
+ _scrollY += 14;
+ }
+ break;
+
+ case 181: {
+ int msgIndex = _scene->_kernelMessages.add(Common::Point(63, _scrollY), 0x1110, 0, 0, 180, _game.getQuote(162));
+ _scene->_kernelMessages.setQuoted(msgIndex, 4, true);
+ _scrollY += 14;
+ }
+ break;
+
+ case 188: {
+ int msgIndex = _scene->_kernelMessages.add(Common::Point(63, _scrollY), 0x1110, 0, 0, 180, _game.getQuote(163));
+ _scene->_kernelMessages.setQuoted(msgIndex, 4, true);
+ _scrollY += 14;
+ }
+ break;
+
+ case 200: {
+ int msgIndex = _scene->_kernelMessages.add(Common::Point(63, _scrollY), 0x1110, 0, 0, 180, _game.getQuote(164));
+ _scene->_kernelMessages.setQuoted(msgIndex, 4, true);
+ _scrollY += 14;
+ }
+ break;
+ }
+ }
+
+ if (_wakeFl) {
+ if (_game._trigger == 100) {
+ _game._player._visible = true;
+ _game._player._stepEnabled = true;
+ _wakeFl = false;
+ }
+
+ if (_scene->_activeAnimation->getCurrentFrame() > _monkeyFrame) {
+ _monkeyFrame = _scene->_activeAnimation->getCurrentFrame();
+ switch (_scene->_activeAnimation->getCurrentFrame()) {
+ case 177: {
+ int msgIndex = _scene->_kernelMessages.add(Common::Point(63, _scrollY), 0x1110, 0, 0, 180, _game.getQuote(165));
+ _scene->_kernelMessages.setQuoted(msgIndex, 4, true);
+ _scrollY += 14;
+ }
+ break;
+
+ case 181: {
+ int msgIndex = _scene->_kernelMessages.add(Common::Point(63, _scrollY), 0x1110, 0, 0, 180, _game.getQuote(166));
+ _scene->_kernelMessages.setQuoted(msgIndex, 4, true);
+ _scrollY += 14;
+ }
+ break;
+
+ case 188: {
+ int msgIndex = _scene->_kernelMessages.add(Common::Point(63, _scrollY), 0x1110, 0, 0, 180, _game.getQuote(167));
+ _scene->_kernelMessages.setQuoted(msgIndex, 4, true);
+ _scrollY += 14;
+ }
+ break;
+
+ case 200: {
+ int msgIndex = _scene->_kernelMessages.add(Common::Point(63, _scrollY), 0x1110, 0, 0, 180, _game.getQuote(168));
+ _scene->_kernelMessages.setQuoted(msgIndex, 4, true);
+ _scrollY += 14;
+ }
+ break;
+ }
+ }
+ }
+}
+
+void Scene211::preActions() {
+ if (_action.isAction(VERB_WALK_DOWN, NOUN_JUNGLE_PATH) && _game._objects.isInInventory(OBJ_BINOCULARS) && (_globals[kMonkeyStatus] == MONKEY_AMBUSH_READY)
+ && (_scene->_customDest.x <= 52) && (_scene->_customDest.y >= 132))
+ _game._player.walk(Common::Point(52, 132), FACING_WEST);
+
+ if (_action.isAction(VERB_WALK_DOWN, NOUN_PATH_TO_WEST)) {
+ if (_game._objects.isInInventory(OBJ_BINOCULARS) && (_globals[kMonkeyStatus] == MONKEY_AMBUSH_READY))
+ _game._player.walk(Common::Point(52, 132), FACING_WEST);
+ else
+ _game._player._walkOffScreenSceneId = 210;
+ }
+
+ if (_action.isAction(VERB_WALK_DOWN, NOUN_PATH_TO_NORTHEAST))
+ _game._player._walkOffScreenSceneId = 207;
+}
+
+void Scene211::actions() {
+ if (_action._lookFlag && (_globals[kMonkeyStatus] == MONKEY_AMBUSH_READY))
+ _vm->_dialogs->show(21111);
+ else if (_action.isAction(VERB_LOOK, NOUN_BINOCULARS, NOUN_PALM_TREE))
+ _vm->_dialogs->show(21116);
+ else if (_action.isAction(VERB_LOOK, NOUN_BUSHY_FERN))
+ _vm->_dialogs->show(21101);
+ else if (_action.isAction(VERB_LOOK, NOUN_JUNGLE_PATH))
+ _vm->_dialogs->show(21102);
+ else if (_action.isAction(VERB_LOOK, NOUN_PALM_TREE)) {
+ if (_globals[kMonkeyStatus] == MONKEY_AMBUSH_READY) {
+ if (_game._storyMode == STORYMODE_NAUGHTY)
+ _vm->_dialogs->show(21103);
+ else
+ _vm->_dialogs->show(21104);
+ } else {
+ _vm->_dialogs->show(21105);
+ }
+ } else if (_action.isAction(VERB_LOOK, NOUN_THICK_UNDERGROWTH)) {
+ if (_game._storyMode == STORYMODE_NAUGHTY)
+ _vm->_dialogs->show(21106);
+ else
+ _vm->_dialogs->show(21107);
+ } else if (_action.isAction(VERB_LOOK, NOUN_JUNGLE))
+ _vm->_dialogs->show(21108);
+ else if (_action.isAction(VERB_LOOK, NOUN_PATH_TO_NORTHEAST))
+ _vm->_dialogs->show(21109);
+ else if (_action.isAction(VERB_LOOK, NOUN_PATH_TO_WEST))
+ _vm->_dialogs->show(21110);
+ else if (_action.isAction(VERB_LOOK, NOUN_SLITHERING_SNAKE))
+ _vm->_dialogs->show(21113);
+ else if (_action.isAction(VERB_TAKE, NOUN_SLITHERING_SNAKE))
+ _vm->_dialogs->show(21114);
+ else if (_action.isAction(VERB_LOOK, NOUN_ROCKS))
+ _vm->_dialogs->show(21115);
+ else
+ return;
+
+ _action._inProgress = false;
+}
+
+/*------------------------------------------------------------------------*/
+
+void Scene212::setup() {
+ setPlayerSpritesPrefix();
+ setAAName();
+
+ _scene->addActiveVocab(NOUN_BOUNCING_REPTILE);
+}
+
+void Scene212::enter() {
+ // CHECKME: Some useless variables have been remove here
+
+ if (_scene->_priorSceneId == 208) {
+ _game._player._playerPos = Common::Point(195, 85);
+ _game._player._facing = FACING_SOUTH;
+ } else if (_scene->_priorSceneId != -2) {
+ _game._player._playerPos = Common::Point(67, 117);
+ _game._player._facing = FACING_NORTHEAST;
+ }
+
+ sceneEntrySound();
+}
+
+void Scene212::step() {
+// CHECKME: Could we move the dino?
+}
+
+void Scene212::preActions() {
+ if (_action.isAction(VERB_WALK_THROUGH, NOUN_CAVE_ENTRANCE))
+ _game._player._walkOffScreenSceneId = 111;
+}
+
+void Scene212::actions() {
+ if (_action._lookFlag)
+ _vm->_dialogs->show(21209);
+ else if (_action.isAction(VERB_WALK_TOWARDS) && (_action.isObject(NOUN_FIELD_TO_NORTH) || _action.isObject(NOUN_MOUNTAINS)))
+ _scene->_nextSceneId = 208;
+ else if (_action.isAction(VERB_WALK_TOWARDS, NOUN_CAVE))
+ _scene->_nextSceneId = 111;
+ else if (_action.isAction(VERB_LOOK, NOUN_GRASS))
+ _vm->_dialogs->show(21201);
+ else if (_action.isAction(VERB_LOOK, NOUN_ROCKS))
+ _vm->_dialogs->show(21202);
+ else if (_action.isAction(VERB_LOOK, NOUN_CAVE_ENTRANCE))
+ _vm->_dialogs->show(21203);
+ else if (_action.isAction(VERB_LOOK, NOUN_SKY))
+ _vm->_dialogs->show(21204);
+ else if (_action.isAction(VERB_LOOK, NOUN_FIELD_TO_NORTH))
+ _vm->_dialogs->show(21205);
+ else if (_action.isAction(VERB_LOOK, NOUN_TREES))
+ _vm->_dialogs->show(21206);
+ else if (_action.isAction(VERB_LOOK, NOUN_PLANTS))
+ _vm->_dialogs->show(21207);
+ else if (_action.isAction(VERB_LOOK, NOUN_MOUNTAINS))
+ _vm->_dialogs->show(21208);
+ else
+ return;
+
+ _action._inProgress = false;
+}
+
+/*------------------------------------------------------------------------*/
+
+void Scene213::setup() {
+ _game._player._spritesPrefix = "";
+
+ // The original is calling Scene2xx::setAAName()
+ _game._aaName = Resources::formatAAName(2);
+}
+
+void Scene213::enter() {
+ if (_globals[kMeteorologistWatch] != METEOROLOGIST_NORMAL)
+ _handSpriteId = _scene->_sprites.addSprites("*METHAND");
+ else if (_globals[kSexOfRex] == REX_MALE)
+ _handSpriteId = _scene->_sprites.addSprites("*REXHAND");
+ else
+ _handSpriteId = _scene->_sprites.addSprites("*ROXHAND");
+
+ teleporterEnter();
+
+ // The original is calling Scene2xx::sceneEntrySound()
+ if (_vm->_musicFlag) {
+ if (_globals[kMeteorologistWatch] == METEOROLOGIST_NORMAL)
+ _vm->_sound->command(1);
+ else
+ _vm->_sound->command(9);
+ } else {
+ _vm->_sound->command(2);
+ }
+}
+
+void Scene213::step() {
+ teleporterStep();
+}
+
+void Scene213::actions() {
+ if (teleporterActions()) {
+ _action._inProgress = false;
+ return;
+ }
+
+ if (_action.isAction(VERB_LOOK, NOUN_CONTROL_PANEL))
+ _vm->_dialogs->show(21301);
+ else if (_action.isAction(VERB_LOOK, NOUN_KEYPAD) || _action.isAction (VERB_INSPECT, NOUN_KEYPAD))
+ _vm->_dialogs->show(21302);
+ else if (_action.isAction(VERB_LOOK, NOUN_DISPLAY))
+ _vm->_dialogs->show(21303);
+ else if (_action.isAction(VERB_LOOK, NOUN_VIEWPORT) || _action.isAction(VERB_PEER_THROUGH, NOUN_VIEWPORT))
+ _vm->_dialogs->show(21304);
+ else if (_action.isAction(VERB_LOOK, NOUN_DEVICE))
+ _vm->_dialogs->show(21305);
+ else if (_action.isAction(VERB_LOOK, NOUN_0_KEY) || _action.isAction(VERB_LOOK, NOUN_1_KEY)
+ || _action.isAction(VERB_LOOK, NOUN_2_KEY) || _action.isAction(VERB_LOOK, NOUN_3_KEY)
+ || _action.isAction(VERB_LOOK, NOUN_4_KEY) || _action.isAction(VERB_LOOK, NOUN_5_KEY)
+ || _action.isAction(VERB_LOOK, NOUN_6_KEY) || _action.isAction(VERB_LOOK, NOUN_7_KEY)
+ || _action.isAction(VERB_LOOK, NOUN_8_KEY) || _action.isAction(VERB_LOOK, NOUN_9_KEY)
+ || _action.isAction(VERB_LOOK, NOUN_SMILE_KEY) || _action.isAction(VERB_LOOK, NOUN_FROWN_KEY)
+ || _action.isAction(VERB_LOOK, NOUN_ENTER_KEY))
+ _vm->_dialogs->show(21306);
+ else
+ return;
+
+ _action._inProgress = false;
+}
+
+/*------------------------------------------------------------------------*/
+
+Scene214::Scene214(MADSEngine *vm) : Scene2xx(vm) {
+ _devilTime = 0;
+ _devilRunningFl = false;
+}
+
+void Scene214::synchronize(Common::Serializer &s) {
+ Scene2xx::synchronize(s);
+
+ s.syncAsUint32LE(_devilTime);
+ s.syncAsByte(_devilRunningFl);
+}
+
+void Scene214::setup() {
+ setPlayerSpritesPrefix();
+ setAAName();
+ _scene->addActiveVocab(NOUN_CAPTIVE_CREATURE);
+ _scene->addActiveVocab(VERB_WALKTO);
+}
+
+void Scene214::enter() {
+ _globals._spriteIndexes[1] = _scene->_sprites.addSprites(formAnimName('e', 0));
+ _globals._spriteIndexes[2] = _scene->_sprites.addSprites(formAnimName('e', 1));
+ _globals._spriteIndexes[3] = _scene->_sprites.addSprites(formAnimName('t', -1));
+ _globals._spriteIndexes[4] = _scene->_sprites.addSprites("*RXMRD_7");
+
+ _devilTime = _game._player._priorTimer;
+ _devilRunningFl = false;
+
+ if (_game._objects.isInRoom(OBJ_POISON_DARTS)) {
+ _globals._sequenceIndexes[1] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[1], false, 6, 0, 0, 0);
+ _scene->_sequences.setPosition(_globals._sequenceIndexes[1], Common::Point(103, 86));
+ _scene->_sequences.setDepth(_globals._sequenceIndexes[1], 11);
+ } else {
+ _scene->_hotspots.activate(NOUN_POISON_DARTS, false);
+ }
+
+ if (_game._objects.isInRoom(OBJ_BLOWGUN)) {
+ _globals._sequenceIndexes[2] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[2], false, 6, 0, 0, 0);
+ _scene->_sequences.setPosition(_globals._sequenceIndexes[2], Common::Point(90, 87));
+ _scene->_sequences.setDepth(_globals._sequenceIndexes[2], 13);
+ } else {
+ _scene->_hotspots.activate(NOUN_BLOWGUN, false);
+ }
+
+ if (_scene->_priorSceneId != -2)
+ _game._player._playerPos = Common::Point(191, 152);
+
+ sceneEntrySound();
+}
+
+void Scene214::step() {
+ if ((_game._player._priorTimer - _devilTime > 800) && !_devilRunningFl) {
+ _devilRunningFl = true;
+ _globals._sequenceIndexes[3] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[3], false, 9, 1, 6, 0);
+ _scene->_sequences.setAnimRange(_globals._sequenceIndexes[3], 1, 4);
+ _scene->_sequences.setDepth(_globals._sequenceIndexes[3], 2);
+ _scene->_dynamicHotspots.add(451, 13, _globals._sequenceIndexes[3], Common::Rect(0, 0, 0, 0));
+ _scene->_sequences.addSubEntry(_globals._sequenceIndexes[3], SEQUENCE_TRIGGER_EXPIRE, 0, 71);
+ }
+
+ if (_devilRunningFl) {
+ switch (_game._trigger) {
+ case 71: {
+ int oldIdx = _globals._sequenceIndexes[3];
+ _globals._sequenceIndexes[3] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[3], false, 9, 5, 0, 0);
+ _scene->_sequences.updateTimeout(oldIdx, _globals._sequenceIndexes[3]);
+ _scene->_dynamicHotspots.add(451, VERB_WALKTO, _globals._sequenceIndexes[3], Common::Rect(0, 0, 0, 0));
+ _scene->_sequences.setAnimRange(_globals._sequenceIndexes[3], 5, 8);
+ _scene->_sequences.setDepth(_globals._sequenceIndexes[3], 2);
+ _scene->_sequences.addSubEntry(_globals._sequenceIndexes[3], SEQUENCE_TRIGGER_EXPIRE, 0, 72);
+ }
+ break;
+
+ case 72: {
+ int oldIdx = _globals._sequenceIndexes[3];
+ _globals._sequenceIndexes[3] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[3], false, 9, 1, 0, 0);
+ _scene->_sequences.updateTimeout(oldIdx, _globals._sequenceIndexes[3]);
+ _scene->_dynamicHotspots.add(451, VERB_WALKTO, _globals._sequenceIndexes[3], Common::Rect(0, 0, 0, 0));
+ _scene->_sequences.setAnimRange(_globals._sequenceIndexes[3], 9, -2);
+ _scene->_sequences.setDepth(_globals._sequenceIndexes[3], 2);
+ _devilTime = _game._player._priorTimer;
+ _devilRunningFl = false;
+ }
+ break;
+ }
+ }
+}
+
+void Scene214::actions() {
+ if (_action._lookFlag)
+ _vm->_dialogs->show(21427);
+ else if (_action.isAction(VERB_WALK_OUTSIDE, NOUN_HUT))
+ _scene->_nextSceneId = 207;
+ else if (_action.isAction(VERB_TAKE, NOUN_POISON_DARTS) && (_game._trigger || _game._objects.isInRoom(OBJ_POISON_DARTS))) {
+ switch (_game._trigger) {
+ case 0:
+ _game._player._stepEnabled = false;
+ _game._player._visible = false;
+ _globals._sequenceIndexes[4] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[4], true, 6, 1, 0, 0);
+ _scene->_sequences.setMsgLayout(_globals._sequenceIndexes[4]);
+ _scene->_sequences.addSubEntry(_globals._sequenceIndexes[4], SEQUENCE_TRIGGER_EXPIRE, 0, 1);
+ break;
+
+ case 1:
+ _globals._sequenceIndexes[4] = _scene->_sequences.addReverseSpriteCycle(_globals._spriteIndexes[4], true, 6, 1, 0, 0);
+ _scene->_sequences.setMsgLayout(_globals._sequenceIndexes[4]);
+ _scene->_sequences.addSubEntry(_globals._sequenceIndexes[4], SEQUENCE_TRIGGER_EXPIRE, 0, 2);
+ _scene->_sequences.remove(_globals._sequenceIndexes[1]);
+ _game._objects.addToInventory(OBJ_POISON_DARTS);
+ _scene->_hotspots.activate(NOUN_POISON_DARTS, false);
+ break;
+
+ case 2:
+ _game._player._visible = true;
+ _scene->_sequences.addTimer(48, 3);
+ break;
+
+ case 3:
+ _game._player._stepEnabled = true;
+ _vm->_dialogs->showItem(OBJ_POISON_DARTS, 0x53A5);
+ break;
+ }
+ } else if (_action.isAction(VERB_TAKE, NOUN_BLOWGUN) && (_game._trigger || _game._objects.isInRoom(OBJ_BLOWGUN))) {
+ switch (_game._trigger) {
+ case 0:
+ _game._player._stepEnabled = false;
+ _game._player._visible = false;
+ _globals._sequenceIndexes[4] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[4], false, 6, 1, 0, 0);
+ _scene->_sequences.setMsgLayout(_globals._sequenceIndexes[4]);
+ _scene->_sequences.addSubEntry(_globals._sequenceIndexes[4], SEQUENCE_TRIGGER_EXPIRE, 0, 1);
+ break;
+
+ case 1:
+ _globals._sequenceIndexes[4] = _scene->_sequences.addReverseSpriteCycle(_globals._spriteIndexes[4], false, 6, 1, 0, 0);
+ _scene->_sequences.setMsgLayout(_globals._sequenceIndexes[4]);
+ _scene->_sequences.addSubEntry(_globals._sequenceIndexes[4], SEQUENCE_TRIGGER_EXPIRE, 0, 2);
+ _scene->_sequences.remove(_globals._sequenceIndexes[2]);
+ _game._objects.addToInventory(OBJ_BLOWGUN);
+ _scene->_hotspots.activate(NOUN_BLOWGUN, false);
+ break;
+
+ case 2:
+ _game._player._visible = true;
+ _scene->_sequences.addTimer(48, 3);
+ break;
+
+ case 3:
+ _game._player._stepEnabled = true;
+ _vm->_dialogs->showItem(OBJ_BLOWGUN, 0x329);
+ break;
+ }
+ } else if (_action.isAction(VERB_LOOK, NOUN_WINDOW))
+ _vm->_dialogs->show(21401);
+ else if (_action.isAction(VERB_LOOK, NOUN_EXPERIMENT_CAGE))
+ _vm->_dialogs->show(21402);
+ else if (_action.isAction(VERB_LOOK, NOUN_CAPTIVE_CREATURE))
+ _vm->_dialogs->show(21403);
+ else if (_action.isAction(VERB_LOOK, NOUN_BEAR_RUG))
+ _vm->_dialogs->show(21404);
+ else if (_action.isAction(VERB_LOOK, NOUN_TROPHY))
+ _vm->_dialogs->show(21405);
+ else if (_action.isAction(VERB_LOOK, NOUN_LARGE_BOWL)) {
+ if (_game._storyMode == STORYMODE_NAUGHTY) {
+ _vm->_dialogs->show(21406);
+ } else {
+ _vm->_dialogs->show(21407);
+ }
+ } else if (_action.isAction(VERB_LOOK, NOUN_SPECIMEN_JARS))
+ _vm->_dialogs->show(21408);
+ else if (_action.isAction(VERB_TAKE, NOUN_LARGE_BOWL) || _action.isAction(VERB_TAKE, NOUN_SPECIMEN_JARS))
+ _vm->_dialogs->show(21409);
+ else if (_action.isAction(VERB_LOOK, NOUN_SHRUNKEN_HEADS))
+ _vm->_dialogs->show(21410);
+ else if (_action.isAction(VERB_TAKE, NOUN_SHRUNKEN_HEADS) || _action.isAction(VERB_TAKE, NOUN_LARGE_HEADS))
+ _vm->_dialogs->show(21411);
+ else if (_action.isAction(VERB_LOOK, NOUN_LARGE_HEADS))
+ _vm->_dialogs->show(21428);
+ else if (_action.isAction(VERB_LOOK, NOUN_POISON_DARTS) && (_action._savedFields._mainObjectSource == 4))
+ _vm->_dialogs->show(21412);
+ else if (_action.isAction(VERB_OPEN, NOUN_EXPERIMENT_CAGE))
+ _vm->_dialogs->show(21414);
+ else if (_action.isAction(VERB_TALKTO, NOUN_CAPTIVE_CREATURE))
+ _vm->_dialogs->show(21415);
+ else if (_action.isAction(VERB_GIVE, NOUN_TWINKIFRUIT, NOUN_CAPTIVE_CREATURE))
+ _vm->_dialogs->show(21416);
+ else if (_action.isAction(VERB_SHOOT, NOUN_BLOWGUN, NOUN_CAPTIVE_CREATURE) || _action.isAction(VERB_HOSE_DOWN, NOUN_BLOWGUN, NOUN_CAPTIVE_CREATURE))
+ _vm->_dialogs->show(21417);
+ else if (_action.isAction(VERB_LOOK, NOUN_BIG_HEADS))
+ _vm->_dialogs->show(21418);
+ else if (_action.isAction(VERB_TAKE, NOUN_BIG_HEADS))
+ _vm->_dialogs->show(21419);
+ else if (_action.isAction(VERB_TAKE, NOUN_BEAR_RUG))
+ _vm->_dialogs->show(21420);
+ else if (_action.isAction(VERB_LOOK, NOUN_FLOOR_OF_HUT))
+ _vm->_dialogs->show(21421);
+ else if (_action.isAction(VERB_LOOK, NOUN_BLOWGUN))
+ _vm->_dialogs->show(21422);
+ else if (_action.isAction(VERB_LOOK, NOUN_TABLE)) {
+ if (_game._objects.isInRoom(OBJ_POISON_DARTS) && _game._objects.isInRoom(OBJ_BLOWGUN)) {
+ _vm->_dialogs->show(21423);
+ } else if (_game._objects.isInRoom(OBJ_POISON_DARTS) && !_game._objects.isInRoom(OBJ_BLOWGUN)) {
+ _vm->_dialogs->show(21424);
+ } else if (!_game._objects.isInRoom(OBJ_POISON_DARTS) && _game._objects.isInRoom(OBJ_BLOWGUN)) {
+ _vm->_dialogs->show(21425);
+ } else {
+ _vm->_dialogs->show(21426);
+ }
+ } else
+ return;
+
+ _action._inProgress = false;
+}
+
+/*------------------------------------------------------------------------*/
+
+void Scene215::setup() {
+ setPlayerSpritesPrefix();
+ setAAName();
+}
+
+void Scene215::enter() {
+ _globals._spriteIndexes[1] = _scene->_sprites.addSprites(formAnimName('e', 0));
+ _globals._spriteIndexes[3] = _scene->_sprites.addSprites(formAnimName('a', 0));
+
+ _globals._sequenceIndexes[1] = _scene->_sequences.addSpriteCycle (_globals._spriteIndexes[1], false, 7, 0, 0, 0);
+ _scene->_sequences.setPosition(_globals._sequenceIndexes[1], Common::Point(235, 83));
+ _scene->_sequences.setDepth(_globals._sequenceIndexes[1], 15);
+
+ if (_globals[kSexOfRex] == REX_MALE)
+ _globals._spriteIndexes[2] = _scene->_sprites.addSprites("*RXMRC_9");
+ else
+ _globals._spriteIndexes[2] = _scene->_sprites.addSprites("*ROXRC_9");
+
+ if (_scene->_priorSceneId == 216) {
+ _game._player._playerPos = Common::Point(140, 119);
+ _game._player._facing = FACING_SOUTHWEST;
+ _game._player._visible = false;
+ _game._player._stepEnabled = false;
+ _globals._sequenceIndexes[3] = _scene->_sequences.startCycle(_globals._spriteIndexes[3], false, 1);
+ _scene->_sequences.addTimer(120, 70);
+ } else if (_scene->_priorSceneId != -2) {
+ _game._player._playerPos = Common::Point(204, 152);
+ _game._player._facing = FACING_NORTH;
+ }
+
+ _game.loadQuoteSet(0xA9, 0xAA, 0);
+ sceneEntrySound();
+}
+
+void Scene215::step() {
+ if (_game._trigger == 70) {
+ _scene->_sequences.remove (_globals._sequenceIndexes[3]);
+ _globals._sequenceIndexes[3] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[3], false, 6, 1, 0, 0);
+ _scene->_sequences.addSubEntry(_globals._sequenceIndexes[3], SEQUENCE_TRIGGER_EXPIRE, 0, 71);
+ }
+
+ if (_game._trigger == 71) {
+ _scene->_sequences.updateTimeout(-1, _globals._sequenceIndexes[3]);
+ _game._player._visible = true;
+ _game._player._stepEnabled = true;
+ }
+}
+
+void Scene215::actions() {
+ if (_action._lookFlag)
+ _vm->_dialogs->show(21509);
+ else if (_action.isAction(VERB_TAKE, NOUN_TWINKIFRUIT)) {
+ if (!_game._objects.isInInventory(OBJ_TWINKIFRUIT) || _game._trigger) {
+ switch (_game._trigger) {
+ case 0:
+ if (_globals[kSexOfRex] == REX_MALE) {
+ _game._player._visible = false;
+ _game._player._stepEnabled = false;
+ _globals._sequenceIndexes[2] = _scene->_sequences.startReverseCycle(_globals._spriteIndexes[2], false, 6, 2, 0, 0);
+ _scene->_sequences.setAnimRange(_globals._sequenceIndexes[2], 1, 4);
+ _scene->_sequences.setMsgLayout(_globals._sequenceIndexes[2]);
+ _scene->_sequences.addSubEntry(_globals._sequenceIndexes[2], SEQUENCE_TRIGGER_LOOP, 0, 1);
+ _scene->_sequences.addSubEntry(_globals._sequenceIndexes[2], SEQUENCE_TRIGGER_EXPIRE, 0, 2);
+ } else {
+ _game._objects.addToInventory(OBJ_TWINKIFRUIT);
+ _vm->_dialogs->showItem(OBJ_TWINKIFRUIT, 0x5404);
+ }
+ break;
+
+ case 1:
+ if (!_game._objects.isInInventory(OBJ_TWINKIFRUIT)) {
+ _game._objects.addToInventory(OBJ_TWINKIFRUIT);
+ _vm->_dialogs->showItem(OBJ_TWINKIFRUIT, 0x5404);
+ }
+ break;
+
+ case 2:
+ _game._player._visible = true;
+ _game._player._stepEnabled = true;
+ _scene->_sequences.updateTimeout(-1, _globals._sequenceIndexes[2]);
+ break;
+ }
+ } else {
+ int idx = _vm->getRandomNumber(169, 170);
+ _scene->_kernelMessages.reset();
+ _scene->_kernelMessages.add(Common::Point(0, 0), 0x1110, 34, 0, 120, _game.getQuote(idx));
+ }
+ } else if (_action.isAction(VERB_WALK_OUTSIDE, NOUN_HUT))
+ _scene->_nextSceneId = 210;
+ else if (_action.isAction(VERB_LOOK, NOUN_BEAR_RUG))
+ _vm->_dialogs->show(21501);
+ else if (_action.isAction(VERB_LOOK, NOUN_BED))
+ _vm->_dialogs->show(21502);
+ else if (_action.isAction(VERB_LOOK, NOUN_WELCOME_MAT))
+ _vm->_dialogs->show(21503);
+ else if (_action.isAction(VERB_LOOK, NOUN_LOVE_ALTAR))
+ _vm->_dialogs->show(21504);
+ else if (_action.isAction(VERB_LOOK, NOUN_WINDOW))
+ _vm->_dialogs->show(21505);
+ else if (_action.isAction(VERB_LOOK, NOUN_PICTURE))
+ _vm->_dialogs->show(21506);
+ else if (_action.isAction(VERB_LOOK, NOUN_TWINKIFRUIT) && (_action._savedFields._mainObjectSource == 4))
+ _vm->_dialogs->show(21507);
+ else if (_action.isAction(VERB_TAKE, NOUN_BEAR_RUG))
+ _vm->_dialogs->show(21510);
+ else if (_action.isAction(VERB_TAKE, NOUN_LOVE_ALTAR))
+ _vm->_dialogs->show(21511);
+ else if (_action.isAction(VERB_LOOK, NOUN_BAG_OF_TWINKIFRUITS))
+ _vm->_dialogs->show(21512);
+ else if (_action.isAction(VERB_TAKE, NOUN_BAG_OF_TWINKIFRUITS))
+ _vm->_dialogs->show(21513);
+ else if (_action.isAction(VERB_TAKE, NOUN_WELCOME_MAT))
+ _vm->_dialogs->show(21514);
+ else
+ return;
+
+ _action._inProgress = false;
+}
+
+/*------------------------------------------------------------------------*/
+
+void Scene216::setup() {
+ setPlayerSpritesPrefix();
+ setAAName();
+}
+
+void Scene216::enter() {
+ _game._player._stepEnabled = false;
+ _game._player._visible = false;
+
+ _scene->_userInterface.emptyConversationList();
+ _scene->_userInterface.setup(kInputConversation);
+ _scene->loadAnimation(formAnimName('A', -1), 60);
+
+ sceneEntrySound();
+}
+
+void Scene216::step() {
+ if (_game._trigger == 60)
+ _scene->_nextSceneId = 215;
+}
+
+/*------------------------------------------------------------------------*/
+
+} // End of namespace Nebular
+} // End of namespace MADS
diff --git a/engines/mads/nebular/nebular_scenes2.h b/engines/mads/nebular/nebular_scenes2.h
new file mode 100644
index 0000000000..c860db9470
--- /dev/null
+++ b/engines/mads/nebular/nebular_scenes2.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.
+ *
+ */
+
+#ifndef MADS_NEBULAR_SCENES2_H
+#define MADS_NEBULAR_SCENES2_H
+
+#include "common/scummsys.h"
+#include "mads/game.h"
+#include "mads/scene.h"
+#include "mads/nebular/nebular_scenes.h"
+
+namespace MADS {
+
+namespace Nebular {
+
+class Scene2xx : public NebularScene {
+protected:
+ /**
+ * Plays an appropriate sound when entering a scene
+ */
+ void setAAName();
+
+ /**
+ * Updates the prefix used for getting player sprites for the scene
+ */
+ void setPlayerSpritesPrefix();
+
+ void sceneEntrySound();
+public:
+ Scene2xx(MADSEngine *vm) : NebularScene(vm) {}
+};
+
+class Scene201 : public Scene2xx {
+private:
+ bool _pterodactylFlag;
+
+public:
+ Scene201(MADSEngine *vm);
+ virtual void synchronize(Common::Serializer &s);
+
+ virtual void setup();
+ virtual void enter();
+ virtual void step();
+ virtual void actions();
+};
+
+class Scene202 : public Scene2xx {
+private:
+ bool _activeMsgFl, _ladderTopFl, _waitingMeteoFl, _toStationFl, _toTeleportFl;
+ int _ladderHotspotId, _lastRoute, _stationCounter, _meteoFrame;
+ uint32 _meteoClock1, _meteoClock2, _startTime;
+ bool _meteorologistSpecial;
+
+ int subStep1(int randVal);
+ int subStep2(int randVal);
+ int subStep3(int randVal);
+ int subStep4(int randVal);
+
+public:
+ Scene202(MADSEngine *vm);
+ virtual void synchronize(Common::Serializer &s);
+
+ virtual void setup();
+ virtual void enter();
+ virtual void step();
+ virtual void preActions();
+ virtual void actions();
+
+ void setRandomKernelMessage();
+};
+
+class Scene203 : public Scene2xx {
+private:
+ bool _rhotundaEat2Fl, _rhotundaEatFl;
+
+public:
+ Scene203(MADSEngine *vm);
+ virtual void synchronize(Common::Serializer &s);
+
+ virtual void setup();
+ virtual void enter();
+ virtual void step();
+ virtual void preActions();
+ virtual void actions();
+};
+
+class Scene205 : public Scene2xx {
+private:
+ uint32 _lastFishTime, _chickenTime;
+ bool _beingKicked;
+ int _kernelMessage;
+ Conversation _dialog1;
+
+ void handleWomanSpeech(int quoteId);
+
+public:
+ Scene205(MADSEngine *vm);
+ virtual void synchronize(Common::Serializer &s);
+
+ virtual void setup();
+ virtual void enter();
+ virtual void step();
+ virtual void actions();
+};
+
+class Scene207 : public Scene2xx {
+private:
+ bool _vultureFl, _spiderFl, _eyeFl;
+ int _spiderHotspotId, _vultureHotspotId;
+ int32 _spiderTime, _vultureTime;
+
+ void moveVulture();
+ void moveSpider();
+
+public:
+ Scene207(MADSEngine *vm);
+ virtual void synchronize(Common::Serializer &s);
+
+ virtual void setup();
+ virtual void enter();
+ virtual void step();
+ virtual void preActions();
+ virtual void actions();
+};
+
+class Scene208 : public Scene2xx {
+private:
+ bool _rhotundaTurnFl, _boundingFl;
+ int32 _rhotundaTime;
+
+ void updateTrap();
+ void subAction(int mode);
+
+public:
+ Scene208(MADSEngine *vm);
+ virtual void synchronize(Common::Serializer &s);
+
+ virtual void setup();
+ virtual void enter();
+ virtual void step();
+ virtual void preActions();
+ virtual void actions();
+};
+
+class Scene209 : public Scene2xx {
+private:
+ bool _dodgeFl, _forceDodgeFl, _shouldDodgeFl;
+ bool _pitchFl;
+ bool _fallFl, _forceFallFl, _shouldFallFl;
+ bool _playingAnimFl, _playingDialogFl;
+ int _pauseMode, _pauseCounterThreshold, _pauseCounter;
+ bool _removeMonkeyFl;
+ int _monkeyPosition;
+ bool _shootReadyFl, _startShootingInTimerFl, _shootMissedLastFl;
+ bool _binocularsDroppedFl;
+ int _dialogAbortVal;
+ int _counter;
+
+ void handlePause();
+ void initPauseCounterThreshold();
+ void handlePeek();
+ void handleVerticalMove();
+ void handleLookStay();
+ void handleLookRight();
+ void handleBlink();
+ void handleGetBinoculars();
+ void handleStandFromPeek();
+ void handleDodge();
+ void handleBinocularBlink();
+ void handleBinocularScan();
+ void handleJumpInTree();
+ void handleTongue();
+ void handleMonkeyFall();
+ void handleJumpAndHide();
+ void handleMonkeyEating();
+ void handleMonkey1();
+ void handleStandBlink();
+ void handleMonkey2();
+
+public:
+ Scene209(MADSEngine *vm);
+ virtual void synchronize(Common::Serializer &s);
+
+ virtual void setup();
+ virtual void enter();
+ virtual void step();
+ virtual void preActions();
+ virtual void actions();
+};
+
+class Scene210 : public Scene2xx {
+private:
+ int _curDialogNode;
+ int _nextHandsPlace;
+ int _twinkleAnimationType;
+ int _twinklesCurrentFrame;
+ bool _shouldTalk, _shouldFaceRex, _shouldMoveHead;
+ bool _stopWalking;
+ bool _twinklesTalking;
+ bool _twinklesTalk2;
+ int _doorway;
+ Common::String _subQuote2;
+ Conversation _conv1, _conv2, _conv3;
+ Conversation _conv5, _conv6, _conv7, _conv8;
+
+ void handleConversations();
+ void handleConversation1();
+ void handleConversation2();
+ void handleConversation3();
+ void handleConversation5();
+ void handleConversation6();
+ void handleConversation7();
+ void handleConversation8();
+ void setDialogNode(int node);
+ void handleTwinklesSpeech(int quoteId, int shiftX, uint32 delay);
+ void newNode(int node);
+ void restoreDialogNode(int node, int msgId, int posY);
+
+public:
+ Scene210(MADSEngine *vm);
+ virtual void synchronize(Common::Serializer &s);
+
+ virtual void setup();
+ virtual void enter();
+ virtual void step();
+ virtual void preActions();
+ virtual void actions();
+};
+
+class Scene211 : public Scene2xx {
+private:
+ bool _ambushFl, _wakeFl;
+ int _monkeyFrame, _scrollY;
+ uint32 _monkeyTime;
+
+public:
+ Scene211(MADSEngine *vm);
+ virtual void synchronize(Common::Serializer &s);
+
+ virtual void setup();
+ virtual void enter();
+ virtual void step();
+ virtual void preActions();
+ virtual void actions();
+};
+
+class Scene212 : public Scene2xx {
+public:
+ Scene212(MADSEngine *vm) : Scene2xx(vm) {}
+ virtual void setup();
+ virtual void enter();
+ virtual void step();
+ virtual void preActions();
+ virtual void actions();
+};
+
+class Scene213 : public SceneTeleporter {
+public:
+ Scene213(MADSEngine *vm) : SceneTeleporter(vm) {}
+
+ virtual void setup();
+ virtual void enter();
+ virtual void step();
+ virtual void actions();
+};
+
+class Scene214 : public Scene2xx {
+private:
+ uint32 _devilTime;
+ bool _devilRunningFl;
+
+public:
+ Scene214(MADSEngine *vm);
+ virtual void synchronize(Common::Serializer &s);
+
+ virtual void setup();
+ virtual void enter();
+ virtual void step();
+ virtual void actions();
+};
+
+class Scene215 : public Scene2xx {
+public:
+ Scene215(MADSEngine *vm) : Scene2xx(vm) {}
+
+ virtual void setup();
+ virtual void enter();
+ virtual void step();
+ virtual void actions();
+};
+
+class Scene216 : public Scene2xx {
+public:
+ Scene216(MADSEngine *vm) : Scene2xx(vm) {}
+
+ virtual void setup();
+ virtual void enter();
+ virtual void step();
+ virtual void actions() {};
+};
+
+} // End of namespace Nebular
+
+} // End of namespace MADS
+
+#endif /* MADS_NEBULAR_SCENES2_H */
diff --git a/engines/mads/nebular/nebular_scenes3.cpp b/engines/mads/nebular/nebular_scenes3.cpp
new file mode 100644
index 0000000000..bcedf95a27
--- /dev/null
+++ b/engines/mads/nebular/nebular_scenes3.cpp
@@ -0,0 +1,5820 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+
+ * You should have received a copy of the GNU General Public 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 "mads/mads.h"
+#include "mads/scene.h"
+#include "mads/nebular/nebular_scenes.h"
+#include "mads/nebular/nebular_scenes3.h"
+
+namespace MADS {
+
+namespace Nebular {
+
+void Scene3xx::setAAName() {
+ _game._aaName = Resources::formatAAName(4);
+}
+
+void Scene3xx::setPlayerSpritesPrefix() {
+ _vm->_sound->command(5);
+
+ Common::String oldName = _game._player._spritesPrefix;
+
+ if (_globals[kSexOfRex] == REX_MALE)
+ _game._player._spritesPrefix = "RXM";
+ else
+ _game._player._spritesPrefix = "ROX";
+
+ if ((_scene->_nextSceneId == 313) || (_scene->_nextSceneId == 366)
+ || ((_scene->_nextSceneId >= 301) && (_scene->_nextSceneId <= 303))
+ || ((_scene->_nextSceneId == 304) && (_scene->_currentSceneId == 303))
+ || ((_scene->_nextSceneId == 311) && (_scene->_currentSceneId == 304))
+ || ((_scene->_nextSceneId >= 308) && (_scene->_nextSceneId <= 310))
+ || ((_scene->_nextSceneId >= 319) && (_scene->_nextSceneId <= 322))
+ || ((_scene->_nextSceneId >= 387) && (_scene->_nextSceneId <= 391))) {
+ _game._player._spritesPrefix = "";
+ _game._player._spritesChanged = true;
+ }
+
+ _game._player._scalingVelocity = true;
+ if (oldName != _game._player._spritesPrefix)
+ _game._player._spritesChanged = true;
+
+ _vm->_palette->setEntry(16, 10, 63, 63);
+ _vm->_palette->setEntry(17, 10, 45, 45);
+}
+
+void Scene3xx::sceneEntrySound() {
+ if (!_vm->_musicFlag) {
+ _vm->_sound->command(2);
+ return;
+ }
+
+ switch (_scene->_nextSceneId) {
+ case 301:
+ case 302:
+ case 303:
+ case 304:
+ case 308:
+ case 309:
+ case 310:
+ _vm->_sound->command(11);
+ break;
+
+ case 311:
+ if (_scene->_priorSceneId == 304)
+ _vm->_sound->command(11);
+ else
+ _vm->_sound->command(10);
+ break;
+
+ case 313:
+ case 316:
+ case 320:
+ case 322:
+ case 357:
+ case 358:
+ case 359:
+ case 360:
+ case 361:
+ case 387:
+ case 388:
+ case 389:
+ case 390:
+ case 391:
+ case 399:
+ _vm->_sound->command(10);
+ break;
+
+ case 318:
+ if ((_scene->_priorSceneId == 357) || (_scene->_priorSceneId == 407))
+ _vm->_sound->command(10);
+ else if (_scene->_priorSceneId == 319)
+ _vm->_sound->command(16);
+ else
+ _vm->_sound->command(3);
+
+ _vm->_sound->command(50);
+ break;
+
+ case 319:
+ _vm->_sound->command(16);
+ break;
+
+ case 321:
+ _vm->_sound->command(18);
+ break;
+
+ default:
+ break;
+ }
+}
+
+void Scene3xx::initForceField(ForceField *force, bool flag) {
+ force->_flag = flag;
+ force->_vertical = 0;
+ force->_horizontal = 0;
+ force->_timer = 0;
+
+ for (int count = 0; count < 40; count++)
+ force->_seqId[count] = -1;
+
+ if (force->_flag)
+ _vm->_sound->command(24);
+}
+
+int Scene3xx::computeScale(int low, int high, int id) {
+ int diff = high - (low + 2);
+ int quotient = diff / 20;
+ int remainder = diff % 20;
+ int value = low + 2 + (quotient * id) + (remainder / (id + 1));
+
+ return (value);
+}
+
+void Scene3xx::handleForceField(ForceField *force, int *sprites) {
+ if (_game._trigger >= 150) {
+ int id = _game._trigger - 150;
+ if (id < 40) {
+ if (id < 20)
+ force->_vertical--;
+ else
+ force->_horizontal--;
+
+ force->_seqId[id] = -1;
+ }
+ return;
+ }
+
+ if (!force->_flag || (_scene->_frameStartTime < force->_timer) || (force->_vertical + force->_horizontal >= 5))
+ return;
+
+ if (_vm->getRandomNumber(1, 1000) <= (200 + ((40 - (force->_vertical + force->_horizontal)) << 5))) {
+ int id = -1;
+ for (int i = 0; i < 100; i++) {
+ int randIdx = _vm->getRandomNumber(0, 39);
+ if (force->_seqId[randIdx] < 0) {
+ id = randIdx;
+ break;
+ }
+ }
+
+ if (id < 0) {
+ for (int i = 0; i < 40; i++) {
+ if (force->_seqId[i] < 0) {
+ id = i;
+ break;
+ }
+ }
+ }
+
+ int speedX, speedY;
+ int posX, posY;
+ int randVal = _vm->getRandomNumber(1, 100);
+ int spriteId;
+ bool mirror;
+
+ if (id >= 20) {
+ spriteId = 2;
+ mirror = (randVal <= 50);
+ posX = mirror ? 315 : 5;
+ posY = computeScale(15, 119, id - 20);
+ speedX = 1000 * (mirror ? -1 : 1);
+ speedY = 0;
+ } else if (randVal <= 50) {
+ spriteId = 1;
+ mirror = false;
+ posX = computeScale(21, 258, id);
+ posY = 0;
+ speedX = 0;
+ speedY = 600;
+ } else {
+ spriteId = 0;
+ mirror = false;
+ posX = computeScale(21, 258, id);
+ posY = 155;
+ speedX = 0;
+ speedY = -600;
+ }
+
+ if (id >= 0) {
+ force->_seqId[id] = _scene->_sequences.addSpriteCycle(sprites[spriteId], mirror, 2, 0, 0, 0);
+ _scene->_sequences.setDepth(force->_seqId[id], 8);
+ _scene->_sequences.setPosition(force->_seqId[id], Common::Point(posX, posY));
+ _scene->_sequences.setMotion(force->_seqId[id], 2, speedX, speedY);
+ _scene->_sequences.addSubEntry(force->_seqId[id], SEQUENCE_TRIGGER_EXPIRE, 0, 150 + id);
+ if (spriteId == 2)
+ force->_horizontal++;
+ else
+ force->_vertical++;
+ }
+ }
+
+ force->_timer = _scene->_frameStartTime + 4;
+}
+
+/*------------------------------------------------------------------------*/
+
+void Scene300s::preActions() {
+ _game._player._needToWalk = false;
+}
+
+/*------------------------------------------------------------------------*/
+
+void Scene301::setup() {
+ setPlayerSpritesPrefix();
+ setAAName();
+}
+
+void Scene301::enter() {
+ _globals._spriteIndexes[1] = _scene->_sprites.addSprites(formAnimName('x', 0));
+ _globals._sequenceIndexes[1] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[1], false, 9, 0, 0, 0);
+
+ _globals[kMeteorologistStatus] = METEOROLOGIST_GONE;
+ _globals[kTeleporterCommand] = TELEPORTER_NONE;
+
+ _game._player._stepEnabled = false;
+ _game._player._visible = false;
+ _scene->loadAnimation(formAnimName('a', -1), 60);
+
+ sceneEntrySound();
+}
+
+void Scene301::step() {
+ if (_game._trigger == 60)
+ _scene->_nextSceneId = 302;
+}
+
+/*------------------------------------------------------------------------*/
+
+Scene302::Scene302(MADSEngine *vm) : Scene3xx(vm) {
+ _oldFrame = 0;
+}
+
+void Scene302::synchronize(Common::Serializer &s) {
+ Scene3xx::synchronize(s);
+
+ s.syncAsSint32LE(_oldFrame);
+}
+
+void Scene302::setup() {
+ setPlayerSpritesPrefix();
+ setAAName();
+}
+
+void Scene302::enter() {
+ _game._player._stepEnabled = false;
+ _game._player._visible = false;
+
+ _scene->loadAnimation(formAnimName('a', -1), 71);
+ sceneEntrySound();
+}
+
+void Scene302::step() {
+ if (_game._trigger == 71)
+ _scene->_nextSceneId = 303;
+
+ if ((_scene->_activeAnimation != nullptr) && (_scene->_activeAnimation->getCurrentFrame() != _oldFrame)) {
+ _oldFrame = _scene->_activeAnimation->getCurrentFrame();
+ if (_oldFrame == 147) {
+ _game._objects.setRoom(OBJ_POISON_DARTS, 1);
+ _game._objects.setRoom(OBJ_BLOWGUN, 1);
+ _game._objects.setRoom(OBJ_REBREATHER, 1);
+ _game._objects.setRoom(OBJ_STUFFED_FISH, 1);
+ _game._objects.setRoom(OBJ_DEAD_FISH, 1);
+ _game._objects.setRoom(OBJ_BURGER, 1);
+
+ int count = (int)_game._objects.size();
+ for (int idx = 0; idx < count; idx++) {
+ if (_game._objects.isInInventory(idx))
+ _game._objects.setRoom(idx, 50);
+ }
+ }
+ }
+}
+
+/*------------------------------------------------------------------------*/
+
+void Scene303::setup() {
+ setPlayerSpritesPrefix();
+ setAAName();
+}
+
+void Scene303::enter() {
+ _globals._spriteIndexes[1] = _scene->_sprites.addSprites(formAnimName('b', 0));
+ _globals._spriteIndexes[2] = _scene->_sprites.addSprites(formAnimName('b', 1));
+
+ _globals._sequenceIndexes[1] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[1], false, 10, 0, 50, 120);
+ _scene->_sequences.setDepth(_globals._sequenceIndexes[1], 1);
+ _globals._sequenceIndexes[2] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[2], false, 10, 0, 0, 0);
+
+ _game._player._visible = false;
+ _game._player._stepEnabled = false;
+ _scene->loadAnimation(formAnimName('a', -1), 60);
+
+ sceneEntrySound();
+}
+
+void Scene303::step() {
+ if (_game._trigger == 60)
+ _scene->_nextSceneId = 304;
+}
+
+/*------------------------------------------------------------------------*/
+
+Scene304::Scene304(MADSEngine *vm) : Scene3xx(vm) {
+ _explosionSpriteId = -1;
+}
+
+void Scene304::synchronize(Common::Serializer &s) {
+ Scene3xx::synchronize(s);
+
+ s.syncAsSint32LE(_explosionSpriteId);
+}
+
+void Scene304::setup() {
+ setPlayerSpritesPrefix();
+ setAAName();
+}
+
+void Scene304::enter() {
+ if (_scene->_priorSceneId == 303) {
+ _game._player._visible = false;
+ _game._player._stepEnabled = false;
+ _scene->loadAnimation(formAnimName('a', -1), 60);
+ } else {
+ if (_globals[kSexOfRex] == REX_MALE)
+ _globals._spriteIndexes[1] = _scene->_sprites.addSprites(formAnimName('a', 0));
+ else
+ _globals._spriteIndexes[4] = _scene->_sprites.addSprites(formAnimName('a', 2));
+
+ _globals._spriteIndexes[2] = _scene->_sprites.addSprites(formAnimName('a', 1));
+ _globals._spriteIndexes[3] = _scene->_sprites.addSprites(formAnimName('b', 0));
+
+ _globals._sequenceIndexes[3] = _scene->_sequences.startReverseCycle(_globals._spriteIndexes[3], false, 150, 0, 3, 0);
+ _scene->_sequences.setDepth(_globals._sequenceIndexes[3], 2);
+ _vm->_palette->setEntry(252, 45, 63, 45);
+ _vm->_palette->setEntry(253, 20, 45, 20);
+
+ if (_globals[kSexOfRex] == REX_MALE)
+ _game._player._playerPos = Common::Point(111, 117);
+ else
+ _game._player._playerPos = Common::Point(113, 116);
+
+ _globals._sequenceIndexes[2] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[2], false, 11, 0, 0, 0);
+ _scene->_sequences.setAnimRange(_globals._sequenceIndexes[2], -1, -1);
+ _scene->_sequences.addTimer(48, 70);
+ }
+
+ sceneEntrySound();
+ _game.loadQuoteSet(0xEB, 0xEC, 0);
+}
+
+void Scene304::step() {
+ if (_game._trigger == 60)
+ _scene->_nextSceneId = 311;
+
+ if (_game._trigger >= 70) {
+ switch (_game._trigger) {
+ case 70: {
+ _game._player._visible = false;
+ _scene->_sequences.remove(_globals._sequenceIndexes[2]);
+ _globals._sequenceIndexes[2] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[2], false, 8, 1, 0, 0);
+ _scene->_sequences.setAnimRange(_globals._sequenceIndexes[2], 2, 4);
+ _scene->_sequences.setDepth(_globals._sequenceIndexes[2], 1);
+ if (_globals[kSexOfRex] == REX_MALE)
+ _explosionSpriteId = _globals._spriteIndexes[1];
+ else
+ _explosionSpriteId = _globals._spriteIndexes[4];
+
+ int sprIdx = _scene->_sequences.addSpriteCycle(_explosionSpriteId, false, 8, 1, 0, 0);
+ _scene->_sequences.setAnimRange(sprIdx, -1, 4);
+ _scene->_sequences.setDepth(sprIdx, 1);
+ _scene->_sequences.addSubEntry(sprIdx, SEQUENCE_TRIGGER_EXPIRE, 0, 71);
+ _scene->_sequences.addSubEntry(_globals._sequenceIndexes[2], SEQUENCE_TRIGGER_EXPIRE, 0, 74);
+ }
+ break;
+
+ case 71:
+ _scene->_kernelMessages.reset();
+ _scene->_kernelMessages.add(Common::Point(0, 0), 0x1110, 34, 0, 60, _game.getQuote(0xEB));
+ _scene->_sequences.addTimer(1, 72);
+ break;
+
+ case 72: {
+ _vm->_sound->command(43);
+ int sprIdx = _scene->_sequences.addSpriteCycle(_explosionSpriteId, false, 8, 1, 0, 0);
+ _scene->_sequences.setAnimRange(sprIdx, 5, -2);
+ _scene->_sequences.setDepth(sprIdx, 1);
+ _scene->_sequences.addSubEntry(sprIdx, SEQUENCE_TRIGGER_EXPIRE, 0, 73);
+ if (_game._storyMode == STORYMODE_NICE)
+ _scene->_sequences.addSubEntry(sprIdx, SEQUENCE_TRIGGER_SPRITE, 8, 78);
+ }
+ break;
+
+ case 73: {
+ int sprIdx = _scene->_sequences.addSpriteCycle(_explosionSpriteId, false, 8, 0, 0, 0);
+ _scene->_sequences.setAnimRange(sprIdx, -2, -2);
+ _scene->_sequences.setDepth(sprIdx, 1);
+ }
+ break;
+
+ case 74:
+ _globals._sequenceIndexes[2] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[2], false, 8, 1, 0, 0);
+ _scene->_sequences.setAnimRange(_globals._sequenceIndexes[2], 5, -2);
+ _scene->_sequences.setDepth(_globals._sequenceIndexes[2], 1);
+ _scene->_sequences.addSubEntry(_globals._sequenceIndexes[2], SEQUENCE_TRIGGER_EXPIRE, 0, 75);
+ break;
+
+ case 75:
+ _globals._sequenceIndexes[2] = _scene->_sequences.addReverseSpriteCycle(_globals._spriteIndexes[2], false, 8, 1, 0, 0);
+ _scene->_sequences.setAnimRange(_globals._sequenceIndexes[2], 2, -2);
+ _scene->_sequences.setDepth(_globals._sequenceIndexes[2], 1);
+ _scene->_sequences.addSubEntry(_globals._sequenceIndexes[2], SEQUENCE_TRIGGER_EXPIRE, 0, 76);
+ break;
+
+ case 76:
+ _globals._sequenceIndexes[2] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[2], false, 8, 0, 0, 0);
+ _scene->_sequences.setDepth(_globals._sequenceIndexes[2], 1);
+ _scene->_sequences.setAnimRange(_globals._sequenceIndexes[2], 2, 2);
+ _scene->_sequences.addTimer(48, 77);
+ break;
+
+ case 77:
+ _scene->_kernelMessages.reset();
+ _scene->_kernelMessages.add(Common::Point(211, 45), 0xFDFC, 32, 0, 180, _game.getQuote(0xEC));
+ _scene->_sequences.addTimer(120, 78);
+ break;
+
+ case 78:
+ _scene->_nextSceneId = 316;
+ break;
+
+ default:
+ break;
+ }
+ }
+}
+
+/*------------------------------------------------------------------------*/
+
+Scene307::Scene307(MADSEngine *vm) : Scene3xx(vm) {
+ _afterPeeingFl = false;
+ _duringPeeingFl = false;
+ _grateOpenedFl = false;
+ _activePrisonerFl = false;
+
+ _animationMode = -1;
+ _prisonerMessageId = -1;
+ _fieldCollisionCounter = -1;
+
+ _lastFrameTime = 0;
+ _guardTime = 0;
+ _prisonerTimer = 0;
+
+ _subQuote2 = "";
+
+ _forceField.init();
+}
+
+void Scene307::synchronize(Common::Serializer &s) {
+ Scene3xx::synchronize(s);
+
+ _forceField.synchronize(s);
+
+ s.syncAsByte(_afterPeeingFl);
+ s.syncAsByte(_duringPeeingFl);
+ s.syncAsByte(_grateOpenedFl);
+ s.syncAsByte(_activePrisonerFl);
+
+ s.syncAsSint32LE(_animationMode);
+ s.syncAsSint32LE(_prisonerMessageId);
+ s.syncAsSint32LE(_fieldCollisionCounter);
+
+ s.syncAsUint32LE(_lastFrameTime);
+ s.syncAsUint32LE(_guardTime);
+ s.syncAsUint32LE(_prisonerTimer);
+
+ s.syncString(_subQuote2);
+}
+
+void Scene307::setup() {
+ setPlayerSpritesPrefix();
+ setAAName();
+ _scene->addActiveVocab(NOUN_AIR_VENT);
+ _scene->addActiveVocab(NOUN_CLIMB_INTO);
+}
+
+void Scene307::handleRexDialog(int quote) {
+ Common::String curQuote = _game.getQuote(_action._activeAction._verbId);
+ if (_vm->_font->getWidth(curQuote, _scene->_textSpacing) > 200) {
+ Common::String subQuote1;
+ _game.splitQuote(curQuote, subQuote1, _subQuote2);
+ _scene->_kernelMessages.add(Common::Point(0, -14), 0x1110, 34, 0, 240, subQuote1);
+ _scene->_kernelMessages.add(Common::Point(0, 0), 0x1110, 34, 1, 180, _subQuote2);
+ } else
+ _scene->_kernelMessages.add(Common::Point(0, 0), 0x1110, 34, 1, 120, curQuote);
+}
+
+void Scene307::handlePrisonerEncounter() {
+ switch (_action._activeAction._verbId) {
+ case 275:
+ setDialogNode(5);
+ break;
+
+ case 277:
+ setDialogNode(4);
+ break;
+
+ case 276:
+ setDialogNode(6);
+ break;
+ }
+}
+
+void Scene307::handlePrisonerSpeech(int firstQuoteId, int number, long timeout) {
+ int height = number * 14;
+ int posY;
+
+ if (height < 60)
+ posY = 65 - height;
+ else
+ posY = 78 - (height / 2);
+
+ _scene->_kernelMessages.reset();
+ _activePrisonerFl = true;
+
+ int quoteId = firstQuoteId;
+ for (int count = 0; count < number; count++) {
+ _game._triggerSetupMode = SEQUENCE_TRIGGER_DAEMON;
+ _scene->_kernelMessages.add(Common::Point(5, posY), 0xFDFC, 0, 81, timeout, _game.getQuote(quoteId));
+ posY += 14;
+ quoteId++;
+ }
+}
+
+void Scene307::setDialogNode(int node) {
+ switch (node) {
+ case 0:
+ handlePrisonerSpeech(0x153, 2, 120);
+ _scene->_userInterface.setup(kInputBuildingSentences);
+ break;
+
+ case 1:
+ _globals[kMetBuddyBeast] = true;
+ handlePrisonerSpeech(0x10F, 2, 9999999);
+ _dialog1.start();
+ break;
+
+ case 2:
+ _globals[kMetBuddyBeast] = true;
+ handlePrisonerSpeech(0x111, 2, 9999999);
+ _dialog1.start();
+ break;
+
+ case 4:
+ handlePrisonerSpeech(0x116, 1, 120);
+ _scene->_userInterface.setup(kInputBuildingSentences);
+ break;
+
+ case 5:
+ _globals[kKnowsBuddyBeast] = true;
+ handlePrisonerSpeech(0x117, 2, 9999999);
+ _dialog2.start();
+ break;
+
+ case 6:
+ handlePrisonerSpeech(0x123, 1, 120);
+ _scene->_userInterface.setup(kInputBuildingSentences);
+ break;
+
+ case 7:
+ _globals[kKnowsBuddyBeast] = true;
+ handlePrisonerSpeech(0x124, 10, 9999999);
+ _dialog2.write(0x11A, false);
+ _dialog2.write(0x11B, true);
+ _dialog2.write(0x120, true);
+ _dialog2.start();
+ break;
+
+ case 8:
+ handlePrisonerSpeech(0x12E, 6, 9999999);
+ _dialog2.write(0x11A, false);
+ _dialog2.write(0x11B, false);
+ _dialog2.write(0x11C, true);
+ _dialog2.write(0x11D, true);
+ _dialog2.write(0x11F, true);
+ _dialog2.start();
+ break;
+
+ case 9:
+ handlePrisonerSpeech(0x134, 4, 9999999);
+ _dialog2.write(0x11D, false);
+ _dialog2.start();
+ break;
+
+ case 10:
+ handlePrisonerSpeech(0x138, 6, 9999999);
+ _dialog2.write(0x11E, false);
+ _dialog2.start();
+ break;
+
+ case 11:
+ handlePrisonerSpeech(0x13E, 6, 9999999);
+ _dialog2.write(0x11F, false);
+ _dialog2.write(0x121, true);
+ _dialog2.start();
+ break;
+
+ case 12:
+ handlePrisonerSpeech(0x144, 4, 9999999);
+ _dialog2.write(0x11C, false);
+ _dialog2.start();
+ break;
+
+ case 13:
+ handlePrisonerSpeech(0x148, 7, 9999999);
+ _dialog2.write(0x120, false);
+ _dialog2.start();
+ break;
+
+ case 14:
+ handlePrisonerSpeech(0x14F, 3, 9999999);
+ _dialog2.write(0x121, false);
+ _dialog2.start();
+ break;
+
+ case 15:
+ handlePrisonerSpeech(0x152, 1, 120);
+ _scene->_userInterface.setup(kInputBuildingSentences);
+ break;
+
+ case 16:
+ _globals[kKnowsBuddyBeast] = true;
+ handlePrisonerSpeech(0x10C, 1, 9999999);
+ _dialog2.start();
+ break;
+
+ default:
+ break;
+ }
+}
+
+void Scene307::handlePrisonerDialog() {
+ switch (_action._activeAction._verbId) {
+ case 0x11A:
+ setDialogNode(7);
+ break;
+
+ case 0x11B:
+ setDialogNode(8);
+ break;
+
+ case 0x11C:
+ setDialogNode(12);
+ break;
+
+ case 0x11D:
+ setDialogNode(9);
+ break;
+
+ case 0x11E:
+ setDialogNode(10);
+ break;
+
+ case 0x11F:
+ setDialogNode(11);
+ break;
+
+ case 0x120:
+ setDialogNode(13);
+ break;
+
+ case 0x121:
+ setDialogNode(14);
+ break;
+
+ case 0x122:
+ setDialogNode(15);
+ break;
+ }
+}
+
+void Scene307::handleDialog() {
+ if (_game._trigger == 0) {
+ _scene->_kernelMessages.reset();
+ _game._player._stepEnabled = false;
+ handleRexDialog(_action._activeAction._verbId);
+ } else {
+ _game._player._stepEnabled = true;
+
+ if (!_globals[kKnowsBuddyBeast]) {
+ handlePrisonerEncounter();
+ } else {
+ handlePrisonerDialog();
+ }
+ }
+}
+
+void Scene307::enter() {
+ _globals._spriteIndexes[1] = _scene->_sprites.addSprites("*SC003x0");
+ _globals._spriteIndexes[0] = _scene->_sprites.addSprites("*SC003x1");
+ _globals._spriteIndexes[2] = _scene->_sprites.addSprites("*SC003x2");
+ _globals._spriteIndexes[4] = _scene->_sprites.addSprites(formAnimName('x', 0));
+
+ initForceField(&_forceField, true);
+
+ _globals._sequenceIndexes[4] = _scene->_sequences.startCycle(_globals._spriteIndexes[4], false, 1);
+ _scene->_sequences.setPosition(_globals._sequenceIndexes[4], Common::Point(127, 78));
+ _scene->_sequences.setDepth(_globals._sequenceIndexes[4], 15);
+
+ _animationMode = 0;
+ _fieldCollisionCounter = 0;
+
+ _scene->changeVariant(1);
+
+ _game.loadQuoteSet(0xED, 0xEE, 0xEF, 0xF0, 0xF1, 0xF2, 0xF3, 0x10C, 0x104, 0x106, 0x107, 0x108, 0x105,
+ 0x109, 0x10A, 0x10B, 0x10D, 0x10E, 0x10F, 0x110, 0x111, 0x112, 0x113, 0x114, 0x115, 0x116, 0x117,
+ 0x118, 0x119, 0x11A, 0x11B, 0x11C, 0x11D, 0x11E, 0x11F, 0x120, 0x121, 0x122, 0x123, 0x124, 0x125,
+ 0x126, 0x127, 0x128, 0x129, 0x12A, 0x12B, 0x12C, 0x12D, 0x12E, 0x12F, 0x130, 0x131, 0x132, 0x133,
+ 0x134, 0x135, 0x136, 0x137, 0x138, 0x139, 0x13A, 0x13B, 0x13C, 0x13D, 0x13E, 0x13F, 0x140, 0x141,
+ 0x142, 0x143, 0x144, 0x145, 0x146, 0x147, 0x148, 0x149, 0x14A, 0x14B, 0x14C, 0x14D, 0x14E, 0x14F,
+ 0x150, 0x151, 0x152, 0x153, 0);
+
+ _dialog1.setup(0x3F, 0x113, 0x114, 0x115, -1);
+ _dialog2.setup(0x40, 0x11A, 0x11B, 0x11C, 0x11D, 0x11E, 0x11F, 0x120, 0x121, 0x122, 0);
+
+ if (!_game._visitedScenes._sceneRevisited)
+ _dialog2.set(0x11A, 0x122, 0);
+ else if (_scene->_priorSceneId == 318)
+ _dialog2.write(0x11E, true);
+
+
+ if (_scene->_priorSceneId == -2) {
+ if (_grateOpenedFl)
+ _vm->_sound->command(10);
+ else
+ _vm->_sound->command(3);
+ } else {
+ _afterPeeingFl = false;
+ _duringPeeingFl = false;
+ _guardTime = 0;
+ _grateOpenedFl = false;
+ _activePrisonerFl = false;
+ _prisonerTimer = 0;
+ _prisonerMessageId = 0x104;
+
+ if (_scene->_priorSceneId == 308) {
+ _game._player._visible = false;
+ _game._player._stepEnabled = false;
+ _game._player._playerPos = Common::Point(156, 113);
+ _game._player._facing = FACING_NORTH;
+ _animationMode = 1;
+ _vm->_sound->command(11);
+ _scene->loadAnimation(formAnimName('a', -1), 60);
+ } else if (_scene->_priorSceneId == 387) {
+ _game._player._playerPos = Common::Point(129, 108);
+ _game._player._facing = FACING_NORTH;
+ _vm->_sound->command(3);
+ _grateOpenedFl = true;
+ } else {
+ _game._player._playerPos = Common::Point(159, 109);
+ _game._player._facing = FACING_SOUTH;
+ _vm->_sound->command(3);
+ }
+ }
+
+ if (_grateOpenedFl) {
+ _scene->_hotspots.activate(17, false);
+
+ int idx = _scene->_dynamicHotspots.add(17, VERB_CLIMB_INTO, -1, Common::Rect(117, 67, 117 + 19, 67 + 13));
+ int hotspotId = _scene->_dynamicHotspots.setPosition(idx, Common::Point(129, 104), FACING_NORTH);
+ _scene->_dynamicHotspots.setCursor(hotspotId, CURSOR_GO_UP);
+
+ _scene->_sequences.remove(_globals._sequenceIndexes[4]);
+ _globals._sequenceIndexes[4] = _scene->_sequences.startCycle(_globals._spriteIndexes[4], false, 2);
+ _scene->_sequences.setPosition(_globals._sequenceIndexes[4], Common::Point(127, 78));
+ _scene->_sequences.setDepth(_globals._sequenceIndexes[4], 15);
+ }
+
+ _vm->_palette->setEntry(252, 63, 30, 20);
+ _vm->_palette->setEntry(253, 45, 15, 12);
+
+ sceneEntrySound();
+
+ if ((_scene->_priorSceneId == 318) || (_scene->_priorSceneId == 387))
+ _scene->_kernelMessages.addQuote(0xF3, 0, 120);
+}
+
+void Scene307::step() {
+ handleForceField(&_forceField, &_globals._spriteIndexes[0]);
+
+ if ((_animationMode == 1) && (_scene->_activeAnimation != nullptr)) {
+ if (_scene->_activeAnimation->getCurrentFrame() == 126) {
+ _forceField._flag = false;
+ _vm->_sound->command(5);
+ }
+
+ if (_scene->_activeAnimation->getCurrentFrame() == 194) {
+ _forceField._flag = true;
+ _vm->_sound->command(24);
+ }
+ }
+
+ if ((_animationMode == 2) && (_scene->_activeAnimation != nullptr)) {
+ if (_scene->_activeAnimation->getCurrentFrame() == 54)
+ _forceField._flag = false;
+
+ if (_scene->_activeAnimation->getCurrentFrame() == 150) {
+ _game._player._visible = false;
+ _game._player._priorTimer = _scene->_frameStartTime - _game._player._ticksAmount;
+ }
+ }
+
+ if (_game._trigger == 60) {
+ _game._player._visible = true;
+ _game._player._stepEnabled = true;
+ _game._player._priorTimer = _scene->_frameStartTime - _game._player._ticksAmount;
+ _animationMode = 0;
+ _vm->_sound->command(9);
+ }
+
+ if ((_lastFrameTime != _scene->_frameStartTime) && !_duringPeeingFl) {
+ int32 elapsedTime = _lastFrameTime - _scene->_frameStartTime;
+ if ((elapsedTime > 0) && (elapsedTime <= 4)) {
+ _guardTime += elapsedTime;
+ _prisonerTimer += elapsedTime;
+ } else {
+ _guardTime++;
+ _prisonerTimer++;
+ }
+ _lastFrameTime = _scene->_frameStartTime;
+
+ if ((_guardTime > 3000) && !_duringPeeingFl && (_scene->_activeAnimation == nullptr)
+ && (_game._screenObjects._inputMode != kInputConversation) && _globals[kMetBuddyBeast] && !_activePrisonerFl) {
+ if (!_game._objects.isInInventory(OBJ_SCALPEL) && !_grateOpenedFl) {
+ _game._player._stepEnabled = false;
+ _game._player.walk(Common::Point(151, 119), FACING_SOUTHEAST);
+ _animationMode = 2;
+ _vm->_sound->command(11);
+ _scene->loadAnimation(formAnimName('b', -1), 70);
+ }
+ _guardTime = 0;
+ } else if ((_prisonerTimer > 300) && (_game._screenObjects._inputMode != kInputConversation) && (_scene->_activeAnimation == nullptr) && !_activePrisonerFl) {
+ if (!_globals[kMetBuddyBeast]) {
+ int idx = _scene->_kernelMessages.add(Common::Point(5, 51), 0xFDFC, 0, 81, 120, _game.getQuote(_prisonerMessageId));
+ _scene->_kernelMessages.setQuoted(idx, 4, true);
+ _prisonerMessageId++;
+ if (_prisonerMessageId > 0x10A)
+ _prisonerMessageId = 0x104;
+ } else if (_globals[kKnowsBuddyBeast] && (_dialog2.read(0) > 1) && (_vm->getRandomNumber(1, 3) == 1)) {
+ int idx = _scene->_kernelMessages.add(Common::Point(5, 51), 0xFDFC, 0, 81, 120, _game.getQuote(267));
+ _scene->_kernelMessages.setQuoted(idx, 4, true);
+ }
+ _prisonerTimer = 0;
+ }
+ }
+
+ if (_game._trigger == 70)
+ _scene->_nextSceneId = 318;
+
+ if (_game._trigger == 81) {
+ _prisonerTimer = 0;
+ if (_activePrisonerFl && (_guardTime > 2600))
+ _guardTime = 3000 - _vm->getRandomNumber(1, 800);
+
+ _activePrisonerFl = false;
+ }
+}
+
+void Scene307::actions() {
+ if (_action._lookFlag)
+ _vm->_dialogs->show(30715);
+ else if (_game._screenObjects._inputMode == kInputConversation)
+ handleDialog();
+ else if (_action.isAction(VERB_TALKTO, NOUN_CELL_WALL) || _action.isAction(VERB_TALKTO, NOUN_WALL) || _action.isAction(VERB_TALKTO, NOUN_TOILET)) {
+ int node, say;
+ if (_globals[kKnowsBuddyBeast]) {
+ say = 0x10E;
+ node = 16;
+ } else if (_globals[kMetBuddyBeast]) {
+ say = 0x10E;
+ node = 2;
+ } else {
+ say = 0x10D;
+ node = 1;
+ }
+
+ switch (_game._trigger) {
+ case 0:
+ handleRexDialog(say);
+ break;
+
+ case 1:
+ setDialogNode(node);
+ break;
+ }
+ } else if (_action.isAction(VERB_PRY, NOUN_SCALPEL, NOUN_AIR_VENT)) {
+ switch (_game._trigger) {
+ case 0:
+ _game._player._stepEnabled = false;
+ _scene->_kernelMessages.reset();
+ _scene->_kernelMessages.add(Common::Point(0, 0), 0x1110, 34, 0, 120, _game.getQuote(239));
+ _scene->_sequences.addTimer(120, 1);
+ break;
+
+ case 1:
+ _globals._spriteIndexes[5] = _scene->_sprites.addSprites("*RXCL_8");
+ _game._player._visible = false;
+ _globals._sequenceIndexes[5] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[5], false, 12, 1, 0, 0);
+ _scene->_sequences.setAnimRange(_globals._sequenceIndexes[5], -1, 3);
+ _scene->_sequences.setMsgLayout(_globals._sequenceIndexes[5]);
+ _scene->_sequences.addSubEntry(_globals._sequenceIndexes[5], SEQUENCE_TRIGGER_EXPIRE, 0, 2);
+ break;
+
+ case 2: {
+ int oldIdx = _globals._sequenceIndexes[5];
+ _globals._sequenceIndexes[5] = _scene->_sequences.startReverseCycle(_globals._spriteIndexes[5], false, 12, 6, 0, 0);
+ _scene->_sequences.setMsgLayout(_globals._sequenceIndexes[5]);
+ _scene->_sequences.setAnimRange(_globals._sequenceIndexes[5], 2, 3);
+ _scene->_sequences.updateTimeout(_globals._sequenceIndexes[5], oldIdx);
+ _scene->_sequences.addSubEntry(_globals._sequenceIndexes[5], SEQUENCE_TRIGGER_EXPIRE, 0, 3);
+ }
+ break;
+
+ case 3: {
+ int oldIdx = _globals._sequenceIndexes[5];
+ _globals._sequenceIndexes[5] = _scene->_sequences.startCycle(_globals._spriteIndexes[5], false, 1);
+ _scene->_sequences.setMsgLayout(_globals._sequenceIndexes[5]);
+ _scene->_sequences.updateTimeout(_globals._sequenceIndexes[5], oldIdx);
+ _scene->_sequences.addTimer(48, 4);
+ }
+ break;
+
+ case 4:
+ _vm->_sound->command(26);
+ _scene->_sequences.remove(_globals._sequenceIndexes[4]);
+ _globals._sequenceIndexes[4] = _scene->_sequences.startCycle(_globals._spriteIndexes[4], false, 2);
+ _scene->_sequences.setPosition(_globals._sequenceIndexes[4], Common::Point(127, 78));
+ _scene->_sequences.setDepth(_globals._sequenceIndexes[4], 15);
+ _scene->_sequences.addTimer(90, 5);
+ break;
+
+ case 5:
+ _vm->_sound->command(10);
+ _scene->_kernelMessages.reset();
+ _scene->_kernelMessages.add(Common::Point(0, 0), 0x1110, 34, 0, 120, _game.getQuote(241));
+ _scene->_sequences.addTimer(120, 6);
+ break;
+
+ case 6: {
+ _game._player._visible = true;
+ _game._player._priorTimer = _scene->_frameStartTime - _game._player._ticksAmount;
+ _scene->_sequences.remove(_globals._sequenceIndexes[5]);
+ _grateOpenedFl = true;
+ _scene->_hotspots.activate(17, false);
+ int idx = _scene->_dynamicHotspots.add(17, NOUN_CLIMB_INTO, -1, Common::Rect(117, 67, 117 + 19, 67 + 13));
+ int hotspotId = _scene->_dynamicHotspots.setPosition(idx, Common::Point(129, 104), FACING_NORTH);
+ _scene->_dynamicHotspots.setCursor(hotspotId, CURSOR_GO_UP);
+ _game._objects.removeFromInventory(OBJ_SCALPEL, NOWHERE);
+ _scene->_kernelMessages.addQuote(0xF2, 7, 120);
+ }
+ break;
+
+ case 7:
+ _scene->_sprites.remove(_globals._spriteIndexes[5]);
+ _game._player._stepEnabled = true;
+ break;
+
+ default:
+ break;
+ }
+ }else if (_action.isAction(VERB_CLIMB_INTO, NOUN_AIR_VENT)) {
+ if (_grateOpenedFl) {
+ switch (_game._trigger) {
+ case 0:
+ _globals._spriteIndexes[5] = _scene->_sprites.addSprites("*RXCL_8");
+ _game._player._stepEnabled = false;
+ _game._player._visible = false;
+ _scene->_sequences.remove(_globals._sequenceIndexes[4]);
+ _globals._sequenceIndexes[4] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[4], false, 60, 1, 0, 0);
+ _scene->_sequences.setAnimRange(_globals._sequenceIndexes[4], 3, -2);
+ _scene->_sequences.setPosition(_globals._sequenceIndexes[4], Common::Point(127, 78));
+ _scene->_sequences.setDepth(_globals._sequenceIndexes[4], 15);
+ _globals._sequenceIndexes[5] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[5], false, 18, 1, 0, 0);
+ _scene->_sequences.setAnimRange(_globals._sequenceIndexes[5], -1, 4);
+ _scene->_sequences.setMsgLayout(_globals._sequenceIndexes[5]);
+ _scene->_sequences.addSubEntry(_globals._sequenceIndexes[4], SEQUENCE_TRIGGER_EXPIRE, 0, 1);
+ _scene->_sequences.addSubEntry(_globals._sequenceIndexes[5], SEQUENCE_TRIGGER_EXPIRE, 0, 2);
+ break;
+
+ case 1:
+ _globals._sequenceIndexes[4] = _scene->_sequences.startCycle(_globals._spriteIndexes[4], false, -2);
+ _scene->_sequences.setPosition(_globals._sequenceIndexes[4], Common::Point(127, 78));
+ _scene->_sequences.setDepth(_globals._sequenceIndexes[4], 15);
+ break;
+
+ case 2: {
+ int oldIdx = _globals._sequenceIndexes[5];
+ _globals._sequenceIndexes[5] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[5], false, 12, 1, 0, 0);
+ _scene->_sequences.setAnimRange(_globals._sequenceIndexes[5], 4, 10);
+ _scene->_sequences.setMsgLayout(_globals._sequenceIndexes[5]);
+ _scene->_sequences.updateTimeout(_globals._sequenceIndexes[5], oldIdx);
+ _scene->_sequences.addSubEntry(_globals._sequenceIndexes[5], SEQUENCE_TRIGGER_EXPIRE, 0, 3);
+ }
+ break;
+
+ case 3:
+ _scene->_sequences.remove(_globals._sequenceIndexes[4]);
+ _globals._sequenceIndexes[4] = _scene->_sequences.startCycle(_globals._spriteIndexes[4], false, 3);
+ _scene->_sequences.setPosition(_globals._sequenceIndexes[4], Common::Point(127, 78));
+ _scene->_sequences.setDepth(_globals._sequenceIndexes[4], 1);
+ _globals._sequenceIndexes[5] = _scene->_sequences.startCycle(_globals._spriteIndexes[5], false, 11);
+ _scene->_sequences.setMsgLayout(_globals._sequenceIndexes[5]);
+ _scene->_sequences.setPosition(_globals._sequenceIndexes[5], Common::Point(129, 102));
+ _scene->_sequences.addTimer(48, 4);
+ break;
+
+ case 4:
+ _scene->_sequences.remove(_globals._sequenceIndexes[4]);
+ _globals._sequenceIndexes[4] = _scene->_sequences.startCycle(_globals._spriteIndexes[4], false, 2);
+ _scene->_sequences.setPosition(_globals._sequenceIndexes[4], Common::Point(127, 78));
+ _scene->_sequences.setDepth(_globals._sequenceIndexes[4], 1);
+ _scene->_sequences.remove(_globals._sequenceIndexes[5]);
+ _globals._sequenceIndexes[5] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[5], false, 12, 1, 0, 0);
+ _scene->_sequences.setAnimRange(_globals._sequenceIndexes[5], 12, 14);
+ _scene->_sequences.setMsgLayout(_globals._sequenceIndexes[5]);
+ _scene->_sequences.setPosition(_globals._sequenceIndexes[5], Common::Point(129, 102));
+ _scene->_sequences.addSubEntry(_globals._sequenceIndexes[5], SEQUENCE_TRIGGER_EXPIRE, 0, 5);
+ break;
+
+ case 5:
+ _globals._sequenceIndexes[5] = _scene->_sequences.startCycle(_globals._spriteIndexes[5], false, 15);
+ _scene->_sequences.setMsgLayout(_globals._sequenceIndexes[5]);
+ _scene->_sequences.setPosition(_globals._sequenceIndexes[5], Common::Point(129, 102));
+ _scene->_sequences.addTimer(48, 6);
+ break;
+
+ case 6:
+ _scene->_sequences.remove(_globals._sequenceIndexes[5]);
+ _scene->_sequences.remove(_globals._sequenceIndexes[4]);
+ _globals._sequenceIndexes[4] = _scene->_sequences.startCycle(_globals._spriteIndexes[4], false, 1);
+ _scene->_sequences.setPosition(_globals._sequenceIndexes[4], Common::Point(127, 78));
+ _scene->_sequences.setDepth(_globals._sequenceIndexes[4], 1);
+ _scene->_sequences.addTimer(48, 7);
+ break;
+
+ case 7:
+ _scene->_nextSceneId = 313;
+ break;
+
+ default:
+ break;
+ }
+ }
+ } else if (_action.isAction(VERB_USE, NOUN_TOILET) && (_game._storyMode != STORYMODE_NAUGHTY))
+ _vm->_dialogs->show(30723);
+ else if (_action.isAction(VERB_USE, NOUN_TOILET)) {
+ if (!_afterPeeingFl) {
+ switch (_game._trigger) {
+ case 0:
+ _vm->_sound->command(25);
+ _globals._spriteIndexes[3] = _scene->_sprites.addSprites(formAnimName('a', 0));
+ _duringPeeingFl = true;
+ _game._player._stepEnabled = false;
+ _game._player._visible = false;
+ _globals._sequenceIndexes[3] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[3], false, 9, 1, 0, 0);
+ _scene->_sequences.setAnimRange(_globals._sequenceIndexes[3], -1, 2);
+ _scene->_sequences.setDepth(_globals._sequenceIndexes[3], 9);
+ _scene->_sequences.addSubEntry(_globals._sequenceIndexes[3], SEQUENCE_TRIGGER_EXPIRE, 0, 1);
+ break;
+
+ case 1:
+ _globals._sequenceIndexes[3] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[3], false, 9, 5, 0, 0);
+ _scene->_sequences.setAnimRange(_globals._sequenceIndexes[3], 3, -2);
+ _scene->_sequences.setDepth(_globals._sequenceIndexes[3], 9);
+ _scene->_sequences.addSubEntry(_globals._sequenceIndexes[3], SEQUENCE_TRIGGER_EXPIRE, 0, 2);
+ break;
+
+ case 2:
+ _scene->_sequences.updateTimeout(-1, _globals._sequenceIndexes[3]);
+ _game._player._visible = true;
+ _scene->_sequences.addTimer(48, 3);
+ break;
+
+ case 3: {
+ _scene->_sprites.remove(_globals._spriteIndexes[3]);
+ _scene->_kernelMessages.reset();
+ int idx = _scene->_kernelMessages.add(Common::Point(0, 0), 0x1110, 34, 4, 120, _game.getQuote(237));
+ _scene->_kernelMessages.setQuoted(idx, 4, true);
+ }
+ break;
+
+ case 4:
+ _game._player._stepEnabled = true;
+ _duringPeeingFl = false;
+ _afterPeeingFl = true;
+ break;
+
+ default:
+ break;
+ }
+ } else {
+ _scene->_kernelMessages.reset();
+ int idx = _scene->_kernelMessages.add(Common::Point(85, 39), 0x1110, 0, 0, 180, _game.getQuote(238));
+ _scene->_kernelMessages.setQuoted(idx, 4, true);
+ }
+ } else if (_action.isAction(VERB_LOOK, NOUN_AIR_VENT)) {
+ if (!_grateOpenedFl)
+ _vm->_dialogs->show(30710);
+ else
+ _vm->_dialogs->show(30711);
+ } else if (_action.isAction(VERB_LOOK, NOUN_BED))
+ _vm->_dialogs->show(30712);
+ else if (_action.isAction(VERB_LOOK, NOUN_SINK))
+ _vm->_dialogs->show(30713);
+ else if (_action.isAction(VERB_LOOK, NOUN_TOILET))
+ _vm->_dialogs->show(30714);
+ else if (_action.isAction(VERB_SHARPEN, NOUN_SCALPEL))
+ _vm->_dialogs->show(30716);
+ else if (_action.isAction(VERB_LOOK, NOUN_CELL_WALL))
+ _vm->_dialogs->show(30717);
+ else if (_action.isAction(VERB_LOOK, NOUN_LIGHT))
+ _vm->_dialogs->show(30718);
+ else if (_action.isAction(VERB_WALK_INTO, NOUN_CORRIDOR)) {
+ switch (_fieldCollisionCounter) {
+ case 0:
+ _vm->_dialogs->show(30719);
+ _fieldCollisionCounter = 1;
+ break;
+
+ case 1:
+ _vm->_dialogs->show(30720);
+ _fieldCollisionCounter = 2;
+ break;
+
+ case 2:
+ _vm->_dialogs->show(30721);
+ _fieldCollisionCounter = 3;
+ break;
+
+ case 3:
+ _vm->_dialogs->show(30722);
+ break;
+ }
+ } else
+ return;
+
+ _action._inProgress = false;
+}
+
+/*------------------------------------------------------------------------*/
+
+Scene308::Scene308(MADSEngine *vm) : Scene3xx(vm) {
+ _forceField.init();
+}
+
+void Scene308::synchronize(Common::Serializer &s) {
+ Scene3xx::synchronize(s);
+
+ _forceField.synchronize(s);
+}
+
+
+void Scene308::setup() {
+ setPlayerSpritesPrefix();
+ setAAName();
+}
+
+void Scene308::enter() {
+ _globals._spriteIndexes[1] = _scene->_sprites.addSprites("*SC003x0");
+ _globals._spriteIndexes[0] = _scene->_sprites.addSprites("*SC003x1");
+ _globals._spriteIndexes[2] = _scene->_sprites.addSprites("*SC003x2");
+
+ initForceField(&_forceField, true);
+
+ _globals._spriteIndexes[3] = _scene->_sprites.addSprites(formAnimName('b', 0));
+ _globals._spriteIndexes[4] = _scene->_sprites.addSprites(Resources::formatName(307, 'X', 0, EXT_SS, ""));
+
+ _vm->_palette->setEntry(252, 63, 30, 20);
+ _vm->_palette->setEntry(253, 45, 15, 12);
+
+ _globals._sequenceIndexes[4] = _scene->_sequences.startCycle(_globals._spriteIndexes[4], false, 1);
+ _scene->_sequences.setPosition(_globals._sequenceIndexes[4], Common::Point(127, 78));
+ _scene->_sequences.setDepth(_globals._sequenceIndexes[4], 15);
+ _globals._sequenceIndexes[3] = _scene->_sequences.startCycle(_globals._spriteIndexes[3], false, 1);
+ _scene->_sequences.setDepth(_globals._sequenceIndexes[3], 9);
+ _scene->_sequences.addTimer(48, 70);
+
+ _game._player._visible = false;
+ _game._player._stepEnabled = false;
+ _scene->loadAnimation(formAnimName('a', -1), 60);
+
+ sceneEntrySound();
+ _game.loadQuoteSet(0xF4, 0xF5, 0xF6, 0);
+}
+
+void Scene308::step() {
+ handleForceField(&_forceField, &_globals._spriteIndexes[0]);
+
+ if (_game._trigger == 60)
+ _scene->_nextSceneId = 307;
+
+ if (_game._trigger < 70)
+ return;
+
+ switch (_game._trigger) {
+ case 70: {
+ _scene->_sequences.remove(_globals._sequenceIndexes[3]);
+ _globals._sequenceIndexes[3] = _scene->_sequences.startReverseCycle(_globals._spriteIndexes[3], false, 18, 9, 0, 0);
+ _scene->_sequences.setAnimRange(_globals._sequenceIndexes[3], 2, 3);
+ _scene->_sequences.setDepth(_globals._sequenceIndexes[3], 9);
+ _scene->_kernelMessages.reset();
+ int idx = _scene->_kernelMessages.add(Common::Point(171, 21), 0xFDFC, 0, 0, 120, _game.getQuote(244));
+ _scene->_kernelMessages.setQuoted(idx, 2, true);
+ _scene->_sequences.addSubEntry(_globals._sequenceIndexes[3], SEQUENCE_TRIGGER_EXPIRE, 0, 71);
+ }
+ break;
+
+ case 71: {
+ int seqIdx = _globals._sequenceIndexes[3];
+ _globals._sequenceIndexes[3] = _scene->_sequences.startCycle(_globals._spriteIndexes[3], false, 4);
+ _scene->_sequences.setDepth(_globals._sequenceIndexes[3], 9);
+ _scene->_sequences.updateTimeout(_globals._sequenceIndexes[3], seqIdx);
+ _scene->_sequences.addTimer(48, 72);
+ }
+ break;
+
+ case 72:
+ _scene->_sequences.remove(_globals._sequenceIndexes[3]);
+ _globals._sequenceIndexes[3] = _scene->_sequences.startReverseCycle(_globals._spriteIndexes[3], false, 20, 5, 0, 0);
+ _scene->_sequences.setAnimRange(_globals._sequenceIndexes[3], 3, 4);
+ _scene->_sequences.setDepth(_globals._sequenceIndexes[3], 9);
+ _scene->_kernelMessages.reset();
+ _scene->_sequences.addSubEntry(_globals._sequenceIndexes[3], SEQUENCE_TRIGGER_EXPIRE, 0, 73);
+ break;
+
+ case 73: {
+ int seqIdx = _globals._sequenceIndexes[3];
+ _globals._sequenceIndexes[3] = _scene->_sequences.startCycle(_globals._spriteIndexes[3], false, 5);
+ _scene->_sequences.setDepth(_globals._sequenceIndexes[3], 9);
+ _scene->_sequences.updateTimeout(_globals._sequenceIndexes[3], seqIdx);
+ _scene->_sequences.addTimer(48, 74);
+ }
+ break;
+
+ case 74: {
+ _scene->_sequences.remove(_globals._sequenceIndexes[3]);
+ _globals._sequenceIndexes[3] = _scene->_sequences.startReverseCycle(_globals._spriteIndexes[3], false, 20, 8, 0, 0);
+ _scene->_sequences.setAnimRange(_globals._sequenceIndexes[3], 6, 7);
+ _scene->_sequences.setDepth(_globals._sequenceIndexes[3], 9);
+ _scene->_kernelMessages.reset();
+ int idx = _scene->_kernelMessages.add(Common::Point(171, 21), 0xFDFC, 0, 0, 120, _game.getQuote(245));
+ _scene->_kernelMessages.setQuoted(idx, 2, true);
+ _scene->_sequences.addSubEntry(_globals._sequenceIndexes[3], SEQUENCE_TRIGGER_EXPIRE, 0, 75);
+ }
+ break;
+
+ case 75: {
+ int seqIdx = _globals._sequenceIndexes[3];
+ _globals._sequenceIndexes[3] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[3], false, 23, 5, 0, 0);
+ _scene->_sequences.setAnimRange(_globals._sequenceIndexes[3], 8, 10);
+ _scene->_sequences.setDepth(_globals._sequenceIndexes[3], 9);
+ _scene->_sequences.updateTimeout(_globals._sequenceIndexes[3], seqIdx);
+ _scene->_sequences.addSubEntry(_globals._sequenceIndexes[3], SEQUENCE_TRIGGER_EXPIRE, 0, 76);
+ }
+ break;
+
+ case 76: {
+ int seqIdx = _globals._sequenceIndexes[3];
+ _globals._sequenceIndexes[3] = _scene->_sequences.startReverseCycle(_globals._spriteIndexes[3], false, 26, 0, 0, 0);
+ _scene->_sequences.setAnimRange(_globals._sequenceIndexes[3], 2, 3);
+ _scene->_sequences.setDepth(_globals._sequenceIndexes[3], 9);
+ _scene->_kernelMessages.reset();
+ int idx = _scene->_kernelMessages.add(Common::Point(171, 21), 0xFDFC, 0, 0, 120, _game.getQuote(246));
+ _scene->_kernelMessages.setQuoted(idx, 2, true);
+ _scene->_sequences.updateTimeout(_globals._sequenceIndexes[3], seqIdx);
+ }
+ break;
+
+ default:
+ break;
+ }
+}
+
+/*------------------------------------------------------------------------*/
+
+Scene309::Scene309(MADSEngine *vm) : Scene3xx(vm) {
+ for (int i = 0; i < 3; i++) {
+ _characterSpriteIndexes[i] = -1;
+ _messagesIndexes[i] = -1;
+ }
+
+ _lastFrame = -1;
+ _forceField.init();
+}
+
+void Scene309::synchronize(Common::Serializer &s) {
+ Scene3xx::synchronize(s);
+
+ _forceField.synchronize(s);
+
+ for (int i = 0; i < 3; ++i)
+ s.syncAsSint32LE(_characterSpriteIndexes[i]);
+ for (int i = 0; i < 3; ++i)
+ s.syncAsSint32LE(_messagesIndexes[i]);
+ s.syncAsSint32LE(_lastFrame);
+}
+
+void Scene309::setup() {
+ setPlayerSpritesPrefix();
+ setAAName();
+}
+
+void Scene309::enter() {
+ _globals._spriteIndexes[1] = _scene->_sprites.addSprites("*SC003x0");
+ _globals._spriteIndexes[0] = _scene->_sprites.addSprites("*SC003x1");
+ _globals._spriteIndexes[2] = _scene->_sprites.addSprites("*SC003x2");
+
+ initForceField(&_forceField, true);
+
+ _globals._spriteIndexes[3] = _scene->_sprites.addSprites(formAnimName('x', 0));
+ _globals._spriteIndexes[4] = _scene->_sprites.addSprites(Resources::formatName(307, 'X', 0, EXT_SS, ""));
+
+ _globals._sequenceIndexes[4] = _scene->_sequences.startCycle(_globals._spriteIndexes[4], false, 1);
+ _scene->_sequences.setPosition(_globals._sequenceIndexes[4], Common::Point(127, 78));
+ _scene->_sequences.setDepth(_globals._sequenceIndexes[4], 15);
+
+ _globals._sequenceIndexes[3] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[3], false, 7, 1, 0, 0);
+ _scene->_sequences.setAnimRange(_globals._sequenceIndexes[3], -1, 3);
+ _scene->_sequences.setDepth(_globals._sequenceIndexes[3], 11);
+ _scene->_sequences.addSubEntry(_globals._sequenceIndexes[3], SEQUENCE_TRIGGER_SPRITE, 3, 70);
+
+ _vm->_palette->setEntry(252, 63, 37, 26);
+ _vm->_palette->setEntry(253, 45, 24, 17);
+ _vm->_palette->setEntry(16, 63, 63, 63);
+ _vm->_palette->setEntry(17, 45, 45, 45);
+ _vm->_palette->setEntry(250, 63, 20, 20);
+ _vm->_palette->setEntry(251, 45, 10, 10);
+
+ _game._player._visible = false;
+ _game._player._stepEnabled = false;
+ _scene->loadAnimation(formAnimName('a', -1), 60);
+
+ _characterSpriteIndexes[0] = _scene->_activeAnimation->_spriteListIndexes[2];
+ _characterSpriteIndexes[1] = _scene->_activeAnimation->_spriteListIndexes[2];
+ _characterSpriteIndexes[2] = _scene->_activeAnimation->_spriteListIndexes[1];
+
+ _messagesIndexes[0] = -1;
+ _messagesIndexes[1] = -1;
+ _messagesIndexes[2] = -1;
+
+ sceneEntrySound();
+
+ _game.loadQuoteSet(0xF7, 0xF8, 0xF9, 0x15C, 0x15D, 0x15E, 0);
+}
+
+void Scene309::step() {
+ handleForceField(&_forceField, &_globals._spriteIndexes[0]);
+
+ if (_game._trigger == 61) {
+ _messagesIndexes[0] = -1;
+ _messagesIndexes[1] = -1;
+ }
+
+ if (_game._trigger == 62)
+ _messagesIndexes[2] = -1;
+
+ if (_scene->_activeAnimation != nullptr) {
+ if (_lastFrame != _scene->_activeAnimation->getCurrentFrame()) {
+ _lastFrame = _scene->_activeAnimation->getCurrentFrame();
+ if (_lastFrame == 39) {
+ _messagesIndexes[0] = _scene->_kernelMessages.add(Common::Point(0, 0), 0x1110, 32, 61, 210, _game.getQuote(348));
+ _messagesIndexes[1] = _scene->_kernelMessages.add(Common::Point(0, 0), 0x1110, 32, 0, 210, _game.getQuote(349));
+ }
+
+ if (_lastFrame == 97)
+ _messagesIndexes[2] = _scene->_kernelMessages.add(Common::Point(0, 0), 0xFBFA, 32, 62, 180, _game.getQuote(350));
+
+ for (int charIdx = 0; charIdx < 3; charIdx++) {
+ if (_messagesIndexes[charIdx] >= 0) {
+ bool match = false;
+ int j = -1;
+ for (j = _scene->_activeAnimation->_oldFrameEntry; j < _scene->_activeAnimation->_header._frameEntriesCount; j++) {
+ if (_scene->_activeAnimation->_frameEntries[j]._spriteSlot._spritesIndex == _characterSpriteIndexes[charIdx]) {
+ match = true;
+ break;
+ }
+ }
+
+ if (match) {
+ SpriteSlotSubset *curSpriteSlot = &_scene->_activeAnimation->_frameEntries[j]._spriteSlot;
+ _scene->_kernelMessages._entries[_messagesIndexes[charIdx]]._position.x = curSpriteSlot->_position.x;
+ _scene->_kernelMessages._entries[_messagesIndexes[charIdx]]._position.y = curSpriteSlot->_position.y - (50 + (14 * ((charIdx == 0) ? 2 : 1)));
+ }
+ }
+ }
+ }
+ }
+
+ if (_game._trigger >= 70) {
+ switch (_game._trigger) {
+ case 70: {
+ int idx = _scene->_dynamicHotspots.add(689, 690, _globals._sequenceIndexes[3], Common::Rect(0, 0, 0, 0));
+ _scene->_dynamicHotspots.setPosition(idx, Common::Point(142, 146), FACING_NORTHEAST);
+ _globals._sequenceIndexes[3] = _scene->_sequences.startReverseCycle(_globals._spriteIndexes[3], false, 7, 4, 0, 0);
+ _scene->_sequences.setAnimRange(_globals._sequenceIndexes[3], 2, 3);
+ _scene->_sequences.setDepth(_globals._sequenceIndexes[3], 11);
+ _scene->_sequences.addSubEntry(_globals._sequenceIndexes[3], SEQUENCE_TRIGGER_EXPIRE, 0, 71);
+ }
+ break;
+
+ case 71: {
+ int _oldIdx = _globals._sequenceIndexes[3];
+ _globals._sequenceIndexes[3] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[3], false, 7, 1, 0, 0);
+ _scene->_sequences.setAnimRange(_globals._sequenceIndexes[3], 4, 7);
+ _scene->_sequences.setDepth(_globals._sequenceIndexes[3], 11);
+ _scene->_sequences.updateTimeout(_globals._sequenceIndexes[3], _oldIdx);
+ int idx = _scene->_kernelMessages.add(Common::Point(85, 37), 0xFDFC, 0, 0, 120, _game.getQuote(248));
+ _scene->_kernelMessages.setQuoted(idx, 2, true);
+ _scene->_sequences.addSubEntry(_globals._sequenceIndexes[3], SEQUENCE_TRIGGER_EXPIRE, 0, 72);
+ }
+ break;
+
+ case 72: {
+ int _oldIdx = _globals._sequenceIndexes[3];
+ _globals._sequenceIndexes[3] = _scene->_sequences.startReverseCycle(_globals._spriteIndexes[3], false, 7, 8, 0, 0);
+ _scene->_sequences.setAnimRange(_globals._sequenceIndexes[3], 8, 11);
+ _scene->_sequences.setDepth(_globals._sequenceIndexes[3], 11);
+ _scene->_sequences.updateTimeout(_globals._sequenceIndexes[3], _oldIdx);
+ _scene->_sequences.addSubEntry(_globals._sequenceIndexes[3], SEQUENCE_TRIGGER_EXPIRE, 0, 73);
+ }
+ break;
+
+ case 73: {
+ int _oldIdx = _globals._sequenceIndexes[3];
+ _globals._sequenceIndexes[3] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[3], false, 7, 1, 0, 0);
+ _scene->_sequences.setAnimRange(_globals._sequenceIndexes[3], 12, 20);
+ _scene->_sequences.setDepth(_globals._sequenceIndexes[3], 11);
+ _scene->_sequences.updateTimeout(_globals._sequenceIndexes[3], _oldIdx);
+ int idx = _scene->_kernelMessages.add(Common::Point(170, 49), 0xFDFC, 0, 0, 120, _game.getQuote(249));
+ _scene->_kernelMessages.setQuoted(idx, 2, true);
+ _scene->_sequences.addSubEntry(_globals._sequenceIndexes[3], SEQUENCE_TRIGGER_EXPIRE, 0, 74);
+ }
+ break;
+
+ case 74: {
+ int _oldIdx = _globals._sequenceIndexes[3];
+ _globals._sequenceIndexes[3] = _scene->_sequences.startReverseCycle(_globals._spriteIndexes[3], false, 7, 6, 0, 0);
+ _scene->_sequences.setAnimRange(_globals._sequenceIndexes[3], 21, 23);
+ _scene->_sequences.setDepth(_globals._sequenceIndexes[3], 11);
+ _scene->_sequences.updateTimeout(_globals._sequenceIndexes[3], _oldIdx);
+ _scene->_sequences.addSubEntry(_globals._sequenceIndexes[3], SEQUENCE_TRIGGER_EXPIRE, 0, 75);
+ }
+ break;
+
+ case 75: {
+ int _oldIdx = _globals._sequenceIndexes[3];
+ _globals._sequenceIndexes[3] = _scene->_sequences.startReverseCycle(_globals._spriteIndexes[3], false, 12, 6, 0, 0);
+ _scene->_sequences.setAnimRange(_globals._sequenceIndexes[3], 24, 25);
+ _scene->_sequences.updateTimeout(_globals._sequenceIndexes[3], _oldIdx);
+ _scene->_sequences.setDepth(_globals._sequenceIndexes[3], 11);
+ _scene->_sequences.addSubEntry(_globals._sequenceIndexes[3], SEQUENCE_TRIGGER_EXPIRE, 0, 76);
+ }
+ break;
+
+ case 76: {
+ int _oldIdx = _globals._sequenceIndexes[3];
+ _globals._sequenceIndexes[3] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[3], false, 12, 1, 0, 0);
+ _scene->_sequences.setAnimRange(_globals._sequenceIndexes[3], 26, 28);
+ _scene->_sequences.updateTimeout(_globals._sequenceIndexes[3], _oldIdx);
+ _scene->_sequences.setDepth(_globals._sequenceIndexes[3], 11);
+ _scene->_sequences.addSubEntry(_globals._sequenceIndexes[3], SEQUENCE_TRIGGER_EXPIRE, 0, 77);
+ }
+ break;
+
+ case 77: {
+ _globals._sequenceIndexes[3] = _scene->_sequences.startReverseCycle(_globals._spriteIndexes[3], false, 90, 0, 0, 0);
+ _scene->_sequences.setAnimRange(_globals._sequenceIndexes[3], 29, 30);
+ _scene->_sequences.setDepth(_globals._sequenceIndexes[3], 11);
+ int idx = _scene->_kernelMessages.add(Common::Point(15, 46), 0xFDFC, 0, 0, 120, _game.getQuote(247));
+ _scene->_kernelMessages.setQuoted(idx, 2, true);
+ _scene->_sequences.addTimer(120, 78);
+ }
+ break;
+ }
+ }
+
+ if (_game._trigger == 60)
+ _scene->_nextSceneId = 308;
+}
+
+/*------------------------------------------------------------------------*/
+
+Scene310::Scene310(MADSEngine *vm) : Scene3xx(vm) {
+ _forceField.init();
+}
+
+void Scene310::synchronize(Common::Serializer &s) {
+ Scene3xx::synchronize(s);
+
+ _forceField.synchronize(s);
+}
+
+void Scene310::setup() {
+ setPlayerSpritesPrefix();
+ setAAName();
+}
+
+void Scene310::enter() {
+ _globals._spriteIndexes[1] = _scene->_sprites.addSprites("*SC003x0");
+ _globals._spriteIndexes[0] = _scene->_sprites.addSprites("*SC003x1");
+ _globals._spriteIndexes[2] = _scene->_sprites.addSprites("*SC003x2");
+
+ initForceField(&_forceField, true);
+
+ _globals._spriteIndexes[3] = _scene->_sprites.addSprites(Resources::formatName(307, 'X', 0, EXT_SS, ""));
+ _globals._sequenceIndexes[3] = _scene->_sequences.startCycle(_globals._spriteIndexes[3], false, 1);
+ _scene->_sequences.setPosition(_globals._sequenceIndexes[3], Common::Point(127, 78));
+ _scene->_sequences.setDepth(_globals._sequenceIndexes[3], 15);
+
+ _game._player._visible = false;
+ _game._player._stepEnabled = false;
+ _scene->loadAnimation(formAnimName('a', -1), 70);
+
+ sceneEntrySound();
+}
+
+void Scene310::step() {
+ handleForceField(&_forceField, &_globals._spriteIndexes[0]);
+
+ if (_game._trigger == 70)
+ _scene->_nextSceneId = 309;
+}
+
+/*------------------------------------------------------------------------*/
+
+Scene311::Scene311(MADSEngine *vm) : Scene3xx(vm) {
+ _checkGuardFl = false;
+}
+
+void Scene311::synchronize(Common::Serializer &s) {
+ Scene3xx::synchronize(s);
+
+ s.syncAsByte(_checkGuardFl);
+}
+
+void Scene311::setup() {
+ if (_scene->_currentSceneId == 391)
+ _globals[kSexOfRex] = REX_MALE;
+
+ setPlayerSpritesPrefix();
+ setAAName();
+
+ if (_scene->_currentSceneId == 304)
+ _game._player._spritesPrefix = "";
+}
+
+void Scene311::enter() {
+ _globals._spriteIndexes[1] = _scene->_sprites.addSprites(Resources::formatName(307, 'X', 0, EXT_SS, ""));
+ _globals._spriteIndexes[2] = _scene->_sprites.addSprites("*RXCL_8");
+ _globals._spriteIndexes[3] = _scene->_sprites.addSprites("*RXCL_2");
+
+ _globals._sequenceIndexes[1] = _scene->_sequences.startCycle(_globals._spriteIndexes[1], false, 1);
+ _scene->_sequences.setPosition(_globals._sequenceIndexes[1], Common::Point(165, 76));
+ _scene->_sequences.setDepth(_globals._sequenceIndexes[1], 15);
+
+ _checkGuardFl = false;
+ _game.loadQuoteSet(0xFA, 0);
+
+ if (_scene->_priorSceneId == 391) {
+ _globals[kSexOfRex] = REX_MALE;
+ _game._player._stepEnabled = false;
+ _game._player._visible = false;
+ _game._player._facing = FACING_SOUTH;
+ _game._player._playerPos = Common::Point(166, 101);
+ _scene->_sequences.addTimer(120, 71);
+ } else if (_scene->_priorSceneId == 310)
+ _game._player._playerPos = Common::Point(302, 145);
+ else if (_scene->_priorSceneId == 320) {
+ _game._player._playerPos = Common::Point(129, 113);
+ _game._player._facing = FACING_SOUTH;
+ } else if (_scene->_priorSceneId != -2) {
+ _game._player._visible = false;
+ _game._player._stepEnabled = false;
+ _scene->loadAnimation(formAnimName('a', -1), 70);
+ }
+
+ sceneEntrySound();
+}
+
+void Scene311::step() {
+ if (_game._trigger == 70)
+ _scene->_nextSceneId = 310;
+
+ if (_game._trigger >= 71) {
+ switch (_game._trigger) {
+ case 71:
+ _scene->_sequences.remove(_globals._sequenceIndexes[1]);
+ _globals._sequenceIndexes[1] = _scene->_sequences.startCycle(_globals._spriteIndexes[1], false, 2);
+ _scene->_sequences.setPosition(_globals._sequenceIndexes[1], Common::Point(165, 76));
+ _scene->_sequences.setDepth(_globals._sequenceIndexes[1], 1);
+
+ _globals._sequenceIndexes[3] = _scene->_sequences.startCycle(_globals._spriteIndexes[3], false, 1);
+ _scene->_sequences.setMsgLayout(_globals._sequenceIndexes[3]);
+ _scene->_sequences.addTimer(15, 72);
+ break;
+
+ case 72:
+ _scene->_sequences.setDone(_globals._sequenceIndexes[3]);
+ _globals._sequenceIndexes[3] = _scene->_sequences.startCycle(_globals._spriteIndexes[3], false, 2);
+ _scene->_sequences.setMsgLayout(_globals._sequenceIndexes[3]);
+ _scene->_sequences.addTimer(15, 73);
+ break;
+
+ case 73:
+ _scene->_sequences.remove(_globals._sequenceIndexes[1]);
+ _globals._sequenceIndexes[1] = _scene->_sequences.startCycle(_globals._spriteIndexes[1], false, 3);
+ _scene->_sequences.setPosition(_globals._sequenceIndexes[1], Common::Point(165, 76));
+ _scene->_sequences.setDepth(_globals._sequenceIndexes[1], 1);
+
+ _scene->_sequences.setDone(_globals._sequenceIndexes[3]);
+ _globals._sequenceIndexes[3] = _scene->_sequences.startCycle(_globals._spriteIndexes[3], false, 3);
+ _scene->_sequences.setMsgLayout(_globals._sequenceIndexes[3]);
+ _scene->_sequences.addTimer(15, 74);
+ break;
+
+ case 74:
+ _scene->_sequences.setDone(_globals._sequenceIndexes[3]);
+ _globals._sequenceIndexes[3] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[3], false, 12, 1, 0, 0);
+ _scene->_sequences.setAnimRange(_globals._sequenceIndexes[3], 4, 5);
+ _scene->_sequences.setMsgLayout(_globals._sequenceIndexes[3]);
+ _scene->_sequences.addSubEntry(_globals._sequenceIndexes[3], SEQUENCE_TRIGGER_EXPIRE, 0, 75);
+ break;
+
+ case 75: {
+ int oldIdx = _globals._sequenceIndexes[3];
+ _globals._sequenceIndexes[3] = _scene->_sequences.startCycle(_globals._spriteIndexes[3], false, 6);
+ _scene->_sequences.setMsgLayout(_globals._sequenceIndexes[3]);
+ _scene->_sequences.updateTimeout(_globals._sequenceIndexes[3], oldIdx);
+ _scene->_sequences.addTimer(15, 76);
+ }
+ break;
+
+ case 76:
+ _scene->_sequences.setDone(_globals._sequenceIndexes[3]);
+ _globals._sequenceIndexes[3] = _scene->_sequences.startCycle(_globals._spriteIndexes[3], false, 7);
+ _scene->_sequences.setMsgLayout(_globals._sequenceIndexes[3]);
+ _scene->_sequences.addTimer(15, 77);
+ break;
+
+ case 77:
+ _scene->_sequences.remove(_globals._sequenceIndexes[1]);
+ _globals._sequenceIndexes[1] = _scene->_sequences.startCycle(_globals._spriteIndexes[1], false, 2);
+ _scene->_sequences.setPosition(_globals._sequenceIndexes[1], Common::Point(165, 76));
+ _scene->_sequences.setDepth(_globals._sequenceIndexes[1], 1);
+
+ _scene->_sequences.setDone(_globals._sequenceIndexes[3]);
+ _globals._sequenceIndexes[3] = _scene->_sequences.startCycle(_globals._spriteIndexes[3], false, 8);
+ _scene->_sequences.setMsgLayout(_globals._sequenceIndexes[3]);
+ _scene->_sequences.addTimer(15, 78);
+ break;
+
+ case 78:
+ _scene->_sequences.remove(_globals._sequenceIndexes[1]);
+ _globals._sequenceIndexes[1] = _scene->_sequences.startCycle(_globals._spriteIndexes[1], false, 1);
+ _scene->_sequences.setPosition(_globals._sequenceIndexes[1], Common::Point(165, 76));
+ _scene->_sequences.setDepth(_globals._sequenceIndexes[1], 15);
+
+ _scene->_sequences.setDone(_globals._sequenceIndexes[3]);
+ _globals._sequenceIndexes[3] = _scene->_sequences.startCycle(_globals._spriteIndexes[3], false, 9);
+ _scene->_sequences.setMsgLayout(_globals._sequenceIndexes[3]);
+ _scene->_sequences.addTimer(15, 79);
+ break;
+
+ case 79:
+ _scene->_sequences.setDone(_globals._sequenceIndexes[3]);
+ _globals._sequenceIndexes[3] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[3], false, 12, 1, 0, 0);
+ _scene->_sequences.setAnimRange(_globals._sequenceIndexes[3], 10, -2);
+ _scene->_sequences.setMsgLayout(_globals._sequenceIndexes[3]);
+ _scene->_sequences.addSubEntry(_globals._sequenceIndexes[3], SEQUENCE_TRIGGER_EXPIRE, 0, 80);
+ break;
+
+ case 80:
+ _scene->_sequences.updateTimeout(-1, _globals._sequenceIndexes[3]);
+ _game._player._stepEnabled = true;
+ _game._player._visible = true;
+ break;
+
+ default:
+ break;
+ }
+ }
+
+ if (_game._player._moving && (_scene->_rails.getNext() > 0)) {
+ int x = _game._player._prepareWalkPos.x;
+ if (x < 75)
+ x = 75;
+ if (x > 207)
+ x = 207;
+
+ _checkGuardFl = true;
+ _game._player.startWalking(Common::Point(x, 122), FACING_SOUTH);
+ _scene->_rails.resetNext();
+ }
+}
+
+void Scene311::actions() {
+ if (_action._lookFlag)
+ _vm->_dialogs->show(31119);
+ else if (_checkGuardFl) {
+ _checkGuardFl = false;
+ _scene->_kernelMessages.reset();
+ _scene->_kernelMessages.addQuote(0xFA, 120, 0);
+ } else if (_action.isAction(VERB_SIT_AT, NOUN_DESK))
+ _scene->_nextSceneId = 320;
+ else if (_action.isAction(VERB_CLIMB_INTO, NOUN_AIR_VENT)) {
+ switch (_game._trigger) {
+ case 0:
+ _game._player._stepEnabled = false;
+ _game._player._visible = false;
+ _scene->_sequences.remove(_globals._sequenceIndexes[1]);
+ _globals._sequenceIndexes[1] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[1], false, 50, 1, 0, 0);
+ _scene->_sequences.setAnimRange(_globals._sequenceIndexes[1], 3, -2);
+ _scene->_sequences.setPosition(_globals._sequenceIndexes[1], Common::Point(165, 76));
+ _scene->_sequences.setDepth(_globals._sequenceIndexes[1], 15);
+
+ _globals._sequenceIndexes[2] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[2], false, 15, 1, 0, 0);
+ _scene->_sequences.setAnimRange(_globals._sequenceIndexes[2], -1, 4);
+ _scene->_sequences.setMsgLayout(_globals._sequenceIndexes[2]);
+ _scene->_sequences.addSubEntry(_globals._sequenceIndexes[1], SEQUENCE_TRIGGER_EXPIRE, 0, 1);
+ _scene->_sequences.addSubEntry(_globals._sequenceIndexes[2], SEQUENCE_TRIGGER_EXPIRE, 0, 2);
+ break;
+
+ case 1: {
+ int oldIdx = _globals._sequenceIndexes[1];
+ _globals._sequenceIndexes[1] = _scene->_sequences.startCycle(_globals._spriteIndexes[1], false, -2);
+ _scene->_sequences.setPosition(_globals._sequenceIndexes[1], Common::Point(165, 76));
+ _scene->_sequences.setDepth(_globals._sequenceIndexes[1], 15);
+ _scene->_sequences.updateTimeout(_globals._sequenceIndexes[1], oldIdx);
+ }
+ break;
+
+ case 2: {
+ int oldIdx = _globals._sequenceIndexes[2];
+ _globals._sequenceIndexes[2] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[2], false, 12, 1, 0, 0);
+ _scene->_sequences.setAnimRange(_globals._sequenceIndexes[2], 4, 10);
+ _scene->_sequences.setMsgLayout(_globals._sequenceIndexes[2]);
+ _scene->_sequences.updateTimeout(_globals._sequenceIndexes[2], oldIdx);
+ _scene->_sequences.addSubEntry(_globals._sequenceIndexes[2], SEQUENCE_TRIGGER_EXPIRE, 0, 3);
+ }
+ break;
+
+ case 3: {
+ _scene->_sequences.remove(_globals._sequenceIndexes[1]);
+ _globals._sequenceIndexes[1] = _scene->_sequences.startCycle(_globals._spriteIndexes[1], false, 3);
+ _scene->_sequences.setPosition(_globals._sequenceIndexes[1], Common::Point(165, 76));
+ _scene->_sequences.setDepth(_globals._sequenceIndexes[1], 1);
+
+ int oldIdx = _globals._sequenceIndexes[2];
+ _globals._sequenceIndexes[2] = _scene->_sequences.startCycle(_globals._spriteIndexes[2], false, 11);
+ _scene->_sequences.setMsgLayout(_globals._sequenceIndexes[2]);
+ _scene->_sequences.setPosition(_globals._sequenceIndexes[2], Common::Point(167, 100));
+ _scene->_sequences.updateTimeout(_globals._sequenceIndexes[2], oldIdx);
+ _scene->_sequences.addTimer(15, 4);
+ }
+ break;
+
+ case 4:
+ _scene->_sequences.remove(_globals._sequenceIndexes[1]);
+ _globals._sequenceIndexes[1] = _scene->_sequences.startCycle(_globals._spriteIndexes[1], false, 2);
+ _scene->_sequences.setPosition(_globals._sequenceIndexes[1], Common::Point(165, 76));
+ _scene->_sequences.setDepth(_globals._sequenceIndexes[1], 1);
+
+ _scene->_sequences.remove(_globals._sequenceIndexes[2]);
+ _globals._sequenceIndexes[2] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[2], false, 12, 1, 0, 0);
+ _scene->_sequences.setAnimRange(_globals._sequenceIndexes[2], 12, 14);
+ _scene->_sequences.setMsgLayout(_globals._sequenceIndexes[2]);
+ _scene->_sequences.setPosition(_globals._sequenceIndexes[2], Common::Point(167, 100));
+ _scene->_sequences.addSubEntry(_globals._sequenceIndexes[2], SEQUENCE_TRIGGER_EXPIRE, 0, 5);
+ break;
+
+ case 5: {
+ int oldIdx = _globals._sequenceIndexes[2];
+ _globals._sequenceIndexes[2] = _scene->_sequences.startCycle(_globals._spriteIndexes[2], false, 15);
+ _scene->_sequences.setMsgLayout(_globals._sequenceIndexes[2]);
+ _scene->_sequences.setPosition(_globals._sequenceIndexes[2], Common::Point(167, 100));
+ _scene->_sequences.updateTimeout(_globals._sequenceIndexes[2], oldIdx);
+ _scene->_sequences.addTimer(15, 6);
+ }
+ break;
+
+ case 6:
+ _scene->_sequences.remove(_globals._sequenceIndexes[2]);
+ _scene->_sequences.remove(_globals._sequenceIndexes[1]);
+ _globals._sequenceIndexes[1] = _scene->_sequences.startCycle(_globals._spriteIndexes[1], false, 1);
+ _scene->_sequences.setPosition(_globals._sequenceIndexes[1], Common::Point(165, 76));
+ _scene->_sequences.setDepth(_globals._sequenceIndexes[1], 1);
+ _scene->_sequences.addTimer(15, 7);
+ break;
+
+ case 7:
+ _scene->_nextSceneId = 313;
+ break;
+
+ default:
+ break;
+ }
+ } else if (_action.isAction(VERB_LOOK, NOUN_DESK))
+ _vm->_dialogs->show(31110);
+ else if (_action.isAction(VERB_LOOK, NOUN_WALL))
+ _vm->_dialogs->show(31111);
+ else if (_action.isAction(VERB_LOOK, NOUN_LIGHTING_FIXTURE) || _action.isAction(VERB_STARE_AT, NOUN_LIGHTING_FIXTURE))
+ _vm->_dialogs->show(31112);
+ else if (_action.isAction(VERB_LOOK, NOUN_LIGHTS) || _action.isAction(VERB_STARE_AT, NOUN_LIGHTS))
+ _vm->_dialogs->show(31113);
+ else if (_action.isAction(VERB_TAKE, NOUN_LIGHTS))
+ _vm->_dialogs->show(31114);
+ else if (_action.isAction(VERB_LOOK, NOUN_LIGHT) || _action.isAction(VERB_STARE_AT, NOUN_LIGHT))
+ _vm->_dialogs->show(31115);
+ else if (_action.isAction(VERB_TAKE, NOUN_LIGHT))
+ _vm->_dialogs->show(31116);
+ else if (_action.isAction(VERB_LOOK, NOUN_CORRIDOR_TO_WEST))
+ _vm->_dialogs->show(31117);
+ else if (_action.isAction(VERB_LOOK, NOUN_CORRIDOR_TO_EAST))
+ _vm->_dialogs->show(31118);
+ else if (_action.isAction(VERB_LOOK, NOUN_AIR_VENT))
+ _vm->_dialogs->show(31120);
+ else
+ return;
+
+ _action._inProgress = false;
+}
+
+/*------------------------------------------------------------------------*/
+
+void Scene313::setup() {
+ setPlayerSpritesPrefix();
+ _game._player._spritesPrefix = "RM313A";
+ setAAName();
+}
+
+void Scene313::enter() {
+ _scene->_userInterface.setup(kInputLimitedSentences);
+
+ if ((_scene->_priorSceneId == 366) || (_scene->_priorSceneId == 316)) {
+ _game._player._playerPos = Common::Point(30, 80);
+ _game._player._facing = FACING_NORTH;
+ } else if ((_scene->_priorSceneId == 311) || (_scene->_priorSceneId == 361) || (_scene->_priorSceneId == 391)) {
+ _game._player._playerPos = Common::Point(90, 70);
+ _game._player._facing = FACING_EAST;
+ } else if (_scene->_priorSceneId == 390) {
+ _game._player._playerPos = Common::Point(126, 70);
+ _game._player._facing = FACING_EAST;
+ } else if ((_scene->_priorSceneId == 389) || (_scene->_priorSceneId == 399)) {
+ _game._player._playerPos = Common::Point(163, 70);
+ _game._player._facing = FACING_WEST;
+ } else if (_scene->_priorSceneId == 388) {
+ _game._player._playerPos = Common::Point(199, 70);
+ _game._player._facing = FACING_WEST;
+ } else if (_scene->_priorSceneId != -2) {
+ _game._player._playerPos = Common::Point(234, 70);
+ _game._player._facing = FACING_WEST;
+ }
+
+ if (_globals[kAfterHavoc]) {
+ for (uint16 i = 0; i < _scene->_paletteCycles.size(); i++) {
+ int palIdx = _scene->_paletteCycles[i]._firstColorIndex;
+ int size = _scene->_paletteCycles[i]._colorCount * 3;
+ memset(&_vm->_palette->_cyclingPalette[palIdx], 0, size);
+ memset(&_vm->_palette->_mainPalette[palIdx], 0, size);
+ }
+ }
+
+ sceneEntrySound();
+}
+
+void Scene313::actions() {
+ if (_action.isAction(VERB_CRAWL_TO, NOUN_FOURTH_CELL))
+ _scene->_nextSceneId = 387;
+ else if (_action.isAction(VERB_CRAWL_TO, NOUN_THIRD_CELL))
+ _scene->_nextSceneId = 388;
+ else if (_action.isAction(VERB_CRAWL_TO, NOUN_SECOND_CELL)) {
+ if (_globals[kAfterHavoc])
+ _scene->_nextSceneId = 399;
+ else
+ _scene->_nextSceneId = 389;
+ } else if (_action.isAction(VERB_CRAWL_TO, NOUN_FIRST_CELL))
+ _scene->_nextSceneId = 390;
+ else if (_action.isAction(VERB_CRAWL_TO, NOUN_SECURITY_STATION)) {
+ if (_globals[kSexOfRex] == REX_FEMALE) {
+ _globals[kSexOfRex] = REX_MALE;
+ _vm->_dialogs->show(31301);
+ }
+ _scene->_nextSceneId = 391;
+ } else if (_action.isAction(VERB_CRAWL_TO, NOUN_EQUIPMENT_ROOM)) {
+ if (_globals[kSexOfRex] == REX_FEMALE) {
+ _globals[kSexOfRex] = REX_MALE;
+ _vm->_dialogs->show(31301);
+ }
+ _scene->_nextSceneId = 366;
+ } else if (!_action.isAction(VERB_CRAWL_DOWN, NOUN_AIR_SHAFT))
+ return;
+
+ _action._inProgress = false;
+}
+
+/*------------------------------------------------------------------------*/
+
+void Scene316::setup() {
+ if (_scene->_currentSceneId == 366)
+ _globals[kSexOfRex] = REX_MALE;
+
+ setPlayerSpritesPrefix();
+ setAAName();
+}
+
+void Scene316::handleRexInGrate() {
+ switch (_game._trigger) {
+ case 0:
+ _game._player._stepEnabled = false;
+ _game._player._visible = false;
+ _globals._sequenceIndexes[4] = _scene->_sequences.startCycle(_globals._spriteIndexes[4], false, 1);
+ _scene->_sequences.setMsgLayout(_globals._sequenceIndexes[4]);
+ _scene->_sequences.addTimer(15, 1);
+ break;
+
+ case 1:
+ _scene->_sequences.setDone(_globals._sequenceIndexes[4]);
+ _globals._sequenceIndexes[4] = _scene->_sequences.startReverseCycle(_globals._spriteIndexes[4], false, 12, 3, 0, 0);
+ _scene->_sequences.setAnimRange(_globals._sequenceIndexes[4], 2, 3);
+ _scene->_sequences.setMsgLayout(_globals._sequenceIndexes[4]);
+ _scene->_sequences.addSubEntry(_globals._sequenceIndexes[4], SEQUENCE_TRIGGER_EXPIRE, 0, 2);
+ break;
+
+ case 2: {
+ int oldIdx = _globals._sequenceIndexes[4];
+ _globals._sequenceIndexes[4] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[4], false, 12, 1, 0, 0);
+ _scene->_sequences.setAnimRange(_globals._sequenceIndexes[4], 4, 8);
+ _scene->_sequences.setMsgLayout(_globals._sequenceIndexes[4]);
+ _scene->_sequences.updateTimeout(_globals._sequenceIndexes[4], oldIdx);
+
+ _scene->_sequences.remove(_globals._sequenceIndexes[3]);
+ _globals._sequenceIndexes[3] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[3], false, 12, 1, 0, 0);
+ _scene->_sequences.setAnimRange(_globals._sequenceIndexes[3], 2, -2);
+ _scene->_sequences.setDepth(_globals._sequenceIndexes[3], 12);
+ _scene->_sequences.addSubEntry(_globals._sequenceIndexes[3], SEQUENCE_TRIGGER_EXPIRE, 0, 3);
+ _scene->_sequences.addSubEntry(_globals._sequenceIndexes[4], SEQUENCE_TRIGGER_EXPIRE, 0, 4);
+ }
+ break;
+
+ case 3: {
+ int oldIdx = _globals._sequenceIndexes[3];
+ _globals._sequenceIndexes[3] = _scene->_sequences.startCycle(_globals._spriteIndexes[3], false, -2);
+ _scene->_sequences.setDepth(_globals._sequenceIndexes[3], 12);
+ _scene->_sequences.updateTimeout(_globals._sequenceIndexes[3], oldIdx);
+ }
+ break;
+
+ case 4: {
+ int oldIdx = _globals._sequenceIndexes[4];
+ _globals._sequenceIndexes[4] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[4], false, 12, 1, 0, 0);
+ _scene->_sequences.setAnimRange(_globals._sequenceIndexes[4], 10, 11);
+ _scene->_sequences.setMsgLayout(_globals._sequenceIndexes[4]);
+ _scene->_sequences.updateTimeout(_globals._sequenceIndexes[4], oldIdx);
+
+ _scene->_sequences.remove(_globals._sequenceIndexes[3]);
+ _globals._sequenceIndexes[3] = _scene->_sequences.addReverseSpriteCycle(_globals._spriteIndexes[3], false, 12, 1, 0, 0);
+ _scene->_sequences.setAnimRange(_globals._sequenceIndexes[3], 5, -2);
+ _scene->_sequences.setDepth(_globals._sequenceIndexes[3], 3);
+ _scene->_sequences.addSubEntry(_globals._sequenceIndexes[4], SEQUENCE_TRIGGER_EXPIRE, 0, 5);
+ }
+ break;
+
+ case 5: {
+ int oldIdx = _globals._sequenceIndexes[3];
+ _globals._sequenceIndexes[3] = _scene->_sequences.startCycle(_globals._spriteIndexes[3], false, 3);
+ _scene->_sequences.setDepth(_globals._sequenceIndexes[3], 3);
+ _scene->_sequences.updateTimeout(_globals._sequenceIndexes[3], oldIdx);
+
+ oldIdx = _globals._sequenceIndexes[4];
+ _globals._sequenceIndexes[4] = _scene->_sequences.startCycle(_globals._spriteIndexes[4], false, 12);
+ _scene->_sequences.setMsgLayout(_globals._sequenceIndexes[4]);
+ _scene->_sequences.updateTimeout(_globals._sequenceIndexes[4], oldIdx);
+ _scene->_sequences.addTimer(15, 6);
+ }
+ break;
+
+ case 6:
+ _scene->_sequences.setDone(_globals._sequenceIndexes[4]);
+ _globals._sequenceIndexes[4] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[4], false, 12, 1, 0, 0);
+ _scene->_sequences.setAnimRange(_globals._sequenceIndexes[4], 13, 14);
+ _scene->_sequences.setMsgLayout(_globals._sequenceIndexes[4]);
+
+ _scene->_sequences.remove(_globals._sequenceIndexes[3]);
+ _globals._sequenceIndexes[3] = _scene->_sequences.addReverseSpriteCycle(_globals._spriteIndexes[3], false, 12, 1, 0, 0);
+ _scene->_sequences.setAnimRange(_globals._sequenceIndexes[3], 2, 3);
+ _scene->_sequences.setDepth(_globals._sequenceIndexes[3], 3);
+ _scene->_sequences.addSubEntry(_globals._sequenceIndexes[4], SEQUENCE_TRIGGER_EXPIRE, 0, 7);
+ _scene->_sequences.addSubEntry(_globals._sequenceIndexes[3], SEQUENCE_TRIGGER_EXPIRE, 0, 8);
+ break;
+
+ case 7:
+ _scene->_sequences.setDone(_globals._sequenceIndexes[4]);
+ _globals._sequenceIndexes[4] = _scene->_sequences.startCycle(_globals._spriteIndexes[4], false, 15);
+ _scene->_sequences.setMsgLayout(_globals._sequenceIndexes[4]);
+ _scene->_sequences.updateTimeout(_globals._sequenceIndexes[4], -1);
+ break;
+
+ case 8: {
+ int oldIdx = _globals._sequenceIndexes[3];
+ _globals._sequenceIndexes[3] = _scene->_sequences.startCycle(_globals._spriteIndexes[3], false, 2);
+ _scene->_sequences.setDepth(_globals._sequenceIndexes[3], 3);
+ _scene->_sequences.updateTimeout(_globals._sequenceIndexes[3], oldIdx);
+ _scene->_sequences.addTimer(15, 9);
+ }
+ break;
+
+ case 9:
+ _scene->_sequences.setDone(_globals._sequenceIndexes[4]);
+ _globals._sequenceIndexes[3] = _scene->_sequences.startCycle(_globals._spriteIndexes[3], false, 1);
+ _scene->_sequences.setDepth(_globals._sequenceIndexes[3], 3);
+ _scene->_sequences.addTimer(48, 10);
+ break;
+
+ case 10:
+ _scene->_nextSceneId = 313;
+ break;
+
+ default:
+ break;
+ }
+}
+
+void Scene316::handleRoxInGrate() {
+ int temp;
+ int temp1;
+
+ switch (_game._trigger) {
+ case 0:
+ _game._player._stepEnabled = false;
+ _game._player._visible = false;
+ _globals._sequenceIndexes[5] = _scene->_sequences.startCycle(_globals._spriteIndexes[5], false, 1);
+ _scene->_sequences.setMsgLayout(_globals._sequenceIndexes[5]);
+ _scene->_sequences.addTimer(15, 1);
+ break;
+
+ case 1:
+ _scene->_sequences.setDone(_globals._sequenceIndexes[5]);
+ _globals._sequenceIndexes[5] = _scene->_sequences.startReverseCycle(_globals._spriteIndexes[5], false, 17, 3, 0, 0);
+ _scene->_sequences.setAnimRange(_globals._sequenceIndexes[5], 2, 3);
+ _scene->_sequences.setMsgLayout(_globals._sequenceIndexes[5]);
+ _scene->_sequences.addSubEntry(_globals._sequenceIndexes[5], SEQUENCE_TRIGGER_EXPIRE, 0, 2);
+ break;
+
+ case 2:
+ _scene->_sequences.remove(_globals._sequenceIndexes[3]);
+ _globals._sequenceIndexes[3] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[3], false, 17, 1, 0, 0);
+ _scene->_sequences.setAnimRange(_globals._sequenceIndexes[3], 2, -2);
+ _scene->_sequences.setDepth(_globals._sequenceIndexes[3], 12);
+
+ temp = _globals._sequenceIndexes[5];
+ _globals._sequenceIndexes[5] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[5], false, 17, 1, 0, 0);
+ _scene->_sequences.setAnimRange(_globals._sequenceIndexes[5], 4, 8);
+ _scene->_sequences.setMsgLayout(_globals._sequenceIndexes[5]);
+ _scene->_sequences.updateTimeout(_globals._sequenceIndexes[5], temp);
+ _scene->_sequences.addSubEntry(_globals._sequenceIndexes[3], SEQUENCE_TRIGGER_EXPIRE, 0, 3);
+ _scene->_sequences.addSubEntry(_globals._sequenceIndexes[5], SEQUENCE_TRIGGER_EXPIRE, 0, 4);
+ break;
+
+ case 3:
+ temp1 = _globals._sequenceIndexes[3];
+ _globals._sequenceIndexes[3] = _scene->_sequences.startCycle(_globals._spriteIndexes[3], false, -2);
+ _scene->_sequences.setDepth(_globals._sequenceIndexes[3], 12);
+ _scene->_sequences.updateTimeout(_globals._sequenceIndexes[3], temp1);
+ break;
+
+ case 4:
+ temp = _globals._sequenceIndexes[5];
+ _globals._sequenceIndexes[5] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[5], false, 17, 1, 0, 0);
+ _scene->_sequences.setAnimRange(_globals._sequenceIndexes[5], 10, 11);
+ _scene->_sequences.setMsgLayout(_globals._sequenceIndexes[5]);
+ _scene->_sequences.updateTimeout(_globals._sequenceIndexes[5], temp);
+
+ _scene->_sequences.remove(_globals._sequenceIndexes[3]);
+ _globals._sequenceIndexes[3] = _scene->_sequences.addReverseSpriteCycle(_globals._spriteIndexes[3], false, 17, 1, 0, 0);
+ _scene->_sequences.setAnimRange(_globals._sequenceIndexes[3], 5, -2);
+ _scene->_sequences.setDepth(_globals._sequenceIndexes[3], 3);
+ _scene->_sequences.addSubEntry(_globals._sequenceIndexes[5], SEQUENCE_TRIGGER_EXPIRE, 0, 5);
+ break;
+
+ case 5:
+ temp = _globals._sequenceIndexes[3];
+ _globals._sequenceIndexes[3] = _scene->_sequences.startCycle(_globals._spriteIndexes[3], false, 3);
+ _scene->_sequences.setDepth(_globals._sequenceIndexes[3], 3);
+ _scene->_sequences.updateTimeout(_globals._sequenceIndexes[3], temp);
+
+ temp = _globals._sequenceIndexes[5];
+ _globals._sequenceIndexes[5] = _scene->_sequences.startCycle(_globals._spriteIndexes[5], false, 12);
+ _scene->_sequences.setMsgLayout(_globals._sequenceIndexes[5]);
+ _scene->_sequences.updateTimeout(_globals._sequenceIndexes[5], temp);
+ _scene->_sequences.addTimer(20, 6);
+ break;
+
+ case 6:
+ _scene->_sequences.setDone(_globals._sequenceIndexes[5]);
+ _globals._sequenceIndexes[5] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[5], false, 17, 1, 0, 0);
+ _scene->_sequences.setAnimRange(_globals._sequenceIndexes[5], 13, 15);
+ _scene->_sequences.setMsgLayout(_globals._sequenceIndexes[5]);
+
+ _scene->_sequences.remove(_globals._sequenceIndexes[3]);
+ _globals._sequenceIndexes[3] = _scene->_sequences.addReverseSpriteCycle(_globals._spriteIndexes[3], false, 17, 1, 0, 0);
+ _scene->_sequences.setAnimRange(_globals._sequenceIndexes[3], 2, 3);
+ _scene->_sequences.setDepth(_globals._sequenceIndexes[3], 3);
+ _scene->_sequences.addSubEntry(_globals._sequenceIndexes[5], SEQUENCE_TRIGGER_EXPIRE, 0, 7);
+ _scene->_sequences.addSubEntry(_globals._sequenceIndexes[3], SEQUENCE_TRIGGER_EXPIRE, 0, 8);
+ break;
+
+ case 7:
+ _scene->_sequences.setDone(_globals._sequenceIndexes[5]);
+ _globals._sequenceIndexes[5] = _scene->_sequences.startCycle(_globals._spriteIndexes[5], false, 16);
+ _scene->_sequences.setMsgLayout(_globals._sequenceIndexes[5]);
+ _scene->_sequences.updateTimeout(_globals._sequenceIndexes[5], -1);
+ break;
+
+ case 8:
+ temp = _globals._sequenceIndexes[3];
+ _globals._sequenceIndexes[3] = _scene->_sequences.startCycle(_globals._spriteIndexes[3], false, 2);
+ _scene->_sequences.setDepth(_globals._sequenceIndexes[3], 3);
+ _scene->_sequences.updateTimeout(_globals._sequenceIndexes[3], temp);
+ _scene->_sequences.addTimer(20, 9);
+ break;
+
+ case 9:
+ _scene->_sequences.setDone(_globals._sequenceIndexes[5]);
+ _globals._sequenceIndexes[3] = _scene->_sequences.startCycle(_globals._spriteIndexes[3], false, 1);
+ _scene->_sequences.setDepth(_globals._sequenceIndexes[3], 3);
+ _scene->_sequences.addTimer(48, 10);
+ break;
+
+ case 10:
+ _scene->_nextSceneId = 313;
+ break;
+
+ default:
+ break;
+ }
+}
+
+void Scene316::enter() {
+ if (_globals[kSexOfRex] == REX_MALE) {
+ _globals._spriteIndexes[1] = _scene->_sprites.addSprites(formAnimName('g', -1));
+ _globals._spriteIndexes[4] = _scene->_sprites.addSprites("*RXCL_8");
+ _globals._spriteIndexes[6] = _scene->_sprites.addSprites("*RXCL_2");
+ } else {
+ _globals._spriteIndexes[2] = _scene->_sprites.addSprites(formAnimName('g', 0));
+ _globals._spriteIndexes[5] = _scene->_sprites.addSprites("*ROXCL_8");
+ }
+
+ _globals._spriteIndexes[3] = _scene->_sprites.addSprites(formAnimName('v', 0));
+ _globals._sequenceIndexes[3] = _scene->_sequences.startCycle(_globals._spriteIndexes[3], false, 1);
+ _scene->_sequences.setDepth(_globals._sequenceIndexes[3], 12);
+
+ if (_scene->_priorSceneId == 366) {
+ _game._player._stepEnabled = false;
+ _game._player._visible = false;
+ _game._player._playerPos = Common::Point(78, 87);
+ _game._player._facing = FACING_SOUTH;
+ _scene->_sequences.addTimer(48, 70);
+ } else if (_scene->_priorSceneId == 321) {
+ _game._player._playerPos = Common::Point(153, 102);
+ _game._player._facing = FACING_SOUTH;
+ _game._player._stepEnabled = false;
+ _game._player._visible = false;
+ _vm->_sound->command(44);
+ int spriteIdx = (_globals[kSexOfRex] == REX_MALE) ? 1 : 2;
+ _globals._sequenceIndexes[1] = _scene->_sequences.addReverseSpriteCycle(_globals._spriteIndexes[spriteIdx], false, 6, 1, 0, 0);
+ _scene->_sequences.setDepth(_globals._sequenceIndexes[1], 2);
+ _scene->_sequences.addSubEntry(_globals._sequenceIndexes[1], SEQUENCE_TRIGGER_EXPIRE, 0, 60);
+ } else if (_scene->_priorSceneId != -2)
+ _game._player._playerPos = Common::Point(291, 126);
+
+ sceneEntrySound();
+ _game.loadQuoteSet(0xFD, 0);
+}
+
+void Scene316::step() {
+ if (_game._trigger == 60) {
+ _scene->_sequences.updateTimeout(-1, _globals._sequenceIndexes[1]);
+ _game._player._visible = true;
+ _game._player._stepEnabled = true;
+ }
+
+ if (_game._trigger >= 70) {
+ switch (_game._trigger) {
+ case 70:
+ _scene->_sequences.remove(_globals._sequenceIndexes[3]);
+ _globals._sequenceIndexes[3] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[3], false, 12, 1, 0, 0);
+ _scene->_sequences.setAnimRange(_globals._sequenceIndexes[3], 2, 6);
+ _scene->_sequences.setDepth(_globals._sequenceIndexes[3], 3);
+
+ _globals._sequenceIndexes[6] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[6], false, 12, 1, 0, 0);
+ _scene->_sequences.setAnimRange(_globals._sequenceIndexes[6], 1, 5);
+ _scene->_sequences.setMsgLayout(_globals._sequenceIndexes[6]);
+ _scene->_sequences.addSubEntry(_globals._sequenceIndexes[3], SEQUENCE_TRIGGER_EXPIRE, 0, 71);
+ _scene->_sequences.addSubEntry(_globals._sequenceIndexes[6], SEQUENCE_TRIGGER_EXPIRE, 0, 72);
+ break;
+
+ case 71: {
+ int synxIdx = _globals._sequenceIndexes[3];
+ _globals._sequenceIndexes[3] = _scene->_sequences.startCycle(_globals._spriteIndexes[3], false, -2);
+ _scene->_sequences.setDepth(_globals._sequenceIndexes[3], 3);
+ _scene->_sequences.updateTimeout(_globals._sequenceIndexes[3], synxIdx);
+ }
+ break;
+
+ case 72: {
+ int synxIdx = _globals._sequenceIndexes[6];
+ _globals._sequenceIndexes[6] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[6], false, 12, 1, 0, 0);
+ _scene->_sequences.setAnimRange(_globals._sequenceIndexes[6], 6, 9);
+ _scene->_sequences.setMsgLayout(_globals._sequenceIndexes[6]);
+ _scene->_sequences.updateTimeout(_globals._sequenceIndexes[6], synxIdx);
+ _scene->_sequences.addSubEntry(_globals._sequenceIndexes[6], SEQUENCE_TRIGGER_EXPIRE, 0, 73);
+ }
+ break;
+
+ case 73:
+ _scene->_sequences.remove(_globals._sequenceIndexes[3]);
+ _globals._sequenceIndexes[3] = _scene->_sequences.addReverseSpriteCycle(_globals._spriteIndexes[3], false, 12, 1, 0, 0);
+ _scene->_sequences.setAnimRange(_globals._sequenceIndexes[3], 1, 5);
+ _scene->_sequences.setDepth(_globals._sequenceIndexes[3], 12);
+ _scene->_sequences.setMsgLayout(_globals._sequenceIndexes[6]);
+
+ _globals._sequenceIndexes[6] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[6], false, 12, 1, 0, 0);
+ _scene->_sequences.setAnimRange(_globals._sequenceIndexes[6], 10, -2);
+ _scene->_sequences.setMsgLayout(_globals._sequenceIndexes[6]);
+ _scene->_sequences.addSubEntry(_globals._sequenceIndexes[3], SEQUENCE_TRIGGER_EXPIRE, 0, 74);
+ _scene->_sequences.addSubEntry(_globals._sequenceIndexes[6], SEQUENCE_TRIGGER_EXPIRE, 0, 75);
+ break;
+
+ case 74: {
+ int synxIdx = _globals._sequenceIndexes[3];
+ _globals._sequenceIndexes[3] = _scene->_sequences.startCycle(_globals._spriteIndexes[3], false, 1);
+ _scene->_sequences.setDepth(_globals._sequenceIndexes[3], 12);
+ _scene->_sequences.updateTimeout(_globals._sequenceIndexes[3], synxIdx);
+ }
+ break;
+
+ case 75:
+ _scene->_sequences.updateTimeout(-1, _globals._sequenceIndexes[6]);
+ _game._player._stepEnabled = true;
+ _game._player._visible = true;
+ break;
+
+ default:
+ break;
+ }
+ }
+}
+
+void Scene316::preActions() {
+ if (_action.isAction(VERB_WALK_DOWN, NOUN_CORRIDOR_TO_EAST)) {
+ if (_globals[kAfterHavoc])
+ _game._player._walkOffScreenSceneId = 354;
+ else
+ _game._player._walkOffScreenSceneId = 304;
+ }
+}
+
+void Scene316::actions() {
+ if (_action.isAction(VERB_CLIMB_INTO, NOUN_AIR_VENT)) {
+ if (_globals[kSexOfRex] == REX_FEMALE)
+ handleRoxInGrate();
+ else
+ handleRexInGrate();
+ } else if (_action.isAction(VERB_WALK_UP, NOUN_RAMP) || _action.isAction(VERB_WALK_ONTO, NOUN_PLATFORM)) {
+ switch (_game._trigger) {
+ case 0:
+ if (_globals[kCityFlooded]) {
+ _vm->_dialogs->show(31623);
+ } else {
+ _vm->_sound->command(45);
+ _game._player._stepEnabled = false;
+ _game._player._visible = false;
+ if (_globals[kSexOfRex] == REX_MALE) {
+ _globals._sequenceIndexes[1] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[1], false, 7, 1, 0, 0);
+ _scene->_sequences.setAnimRange(_globals._sequenceIndexes[1], -1, 7);
+ _scene->_sequences.setDepth(_globals._sequenceIndexes[1], 2);
+ _scene->_sequences.addSubEntry(_globals._sequenceIndexes[1], SEQUENCE_TRIGGER_EXPIRE, 0, 1);
+ } else {
+ _globals._sequenceIndexes[2] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[2], false, 7, 1, 0, 0);
+ _scene->_sequences.setDepth(_globals._sequenceIndexes[2], 2);
+ _scene->_sequences.addSubEntry(_globals._sequenceIndexes[2], SEQUENCE_TRIGGER_EXPIRE, 0, 3);
+ }
+ }
+ break;
+
+ case 1:
+ _globals._sequenceIndexes[1] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[1], false, 7, 1, 0, 0);
+ _scene->_sequences.setAnimRange(_globals._sequenceIndexes[1], 8, -2);
+ _scene->_sequences.setDepth(_globals._sequenceIndexes[1], 2);
+ _scene->_kernelMessages.reset();
+ if (!_game._visitedScenes.exists(321))
+ _scene->_kernelMessages.add(Common::Point(0, 0), 0x1110, 34, 0, 120, _game.getQuote(253));
+
+ _scene->_sequences.addSubEntry(_globals._sequenceIndexes[1], SEQUENCE_TRIGGER_EXPIRE, 0, 2);
+ break;
+
+ case 2:
+ _globals._sequenceIndexes[1] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[1], false, 7, 0, 0, 0);
+ _scene->_sequences.setAnimRange(_globals._sequenceIndexes[1], -2, -2);
+ _scene->_sequences.setDepth(_globals._sequenceIndexes[1], 2);
+ _scene->_sequences.addTimer(48, 4);
+ break;
+
+ case 3:
+ _globals._sequenceIndexes[2] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[2], false, 7, 0, 0, 0);
+ _scene->_sequences.setAnimRange(_globals._sequenceIndexes[2], -2, -2);
+ _scene->_sequences.setDepth(_globals._sequenceIndexes[2], 2);
+ _scene->_sequences.addTimer(48, 4);
+ break;
+
+ case 4:
+ _scene->_nextSceneId = 321;
+ break;
+ }
+ } else if (_action.isAction(VERB_LOOK, NOUN_PLATFORM))
+ _vm->_dialogs->show(31610);
+ else if (_action.isAction(VERB_LOOK, NOUN_STRANGE_DEVICE)) {
+ if (_game._visitedScenes.exists(321))
+ _vm->_dialogs->show(31612);
+ else
+ _vm->_dialogs->show(31611);
+ } else if (_action.isAction(VERB_LOOK, NOUN_CONTROLS))
+ _vm->_dialogs->show(31613);
+ else if (_action.isAction(VERB_LOOK, NOUN_EQUIPMENT))
+ _vm->_dialogs->show(31614);
+ else if (_action.isAction(VERB_LOOK, NOUN_PANEL))
+ _vm->_dialogs->show(31615);
+ else if (_action.isAction(VERB_LOOK, NOUN_MONITOR))
+ _vm->_dialogs->show(31616);
+ else if (_action.isAction(VERB_LOOK, NOUN_RAMP))
+ _vm->_dialogs->show(31617);
+ else if (_action.isAction(VERB_LOOK, NOUN_AIR_VENT))
+ _vm->_dialogs->show(31618);
+ else if (_action.isAction(VERB_LOOK, NOUN_CORRIDOR_TO_EAST)) {
+ if (!_globals[kAfterHavoc]) {
+ if (_game._difficulty != DIFFICULTY_EASY)
+ _vm->_dialogs->show(31620);
+ else
+ _vm->_dialogs->show(31619);
+ }
+ } else if (_action.isAction(VERB_LOOK, NOUN_FLOOR))
+ _vm->_dialogs->show(31621);
+ else if (_action.isAction(VERB_LOOK, NOUN_SUPPORT))
+ _vm->_dialogs->show(31622);
+ else
+ return;
+
+ _action._inProgress = false;
+}
+
+
+/*------------------------------------------------------------------------*/
+
+Scene318::Scene318(MADSEngine *vm) : Scene3xx(vm) {
+ _dropTimer = 0;
+
+ _lastFrame = -1;
+ _animMode = -1;
+ _internCounter = -1;
+ _counter = -1;
+
+ _dialogFl = false;
+ _internTalkingFl = false;
+ _internWalkingFl = false;
+ _internVisibleFl = false;
+ _explosionFl = false;
+
+ _lastFrameCounter = 0;
+
+ _subQuote2 = "";
+}
+
+void Scene318::synchronize(Common::Serializer &s) {
+ Scene3xx::synchronize(s);
+
+ s.syncAsUint32LE(_dropTimer);
+
+ s.syncAsSint32LE(_lastFrame);
+ s.syncAsSint32LE(_animMode);
+ s.syncAsSint32LE(_internCounter);
+ s.syncAsSint32LE(_counter);
+
+ s.syncAsByte(_dialogFl);
+ s.syncAsByte(_internTalkingFl);
+ s.syncAsByte(_internWalkingFl);
+ s.syncAsByte(_internVisibleFl);
+ s.syncAsByte(_explosionFl);
+
+ s.syncAsUint32LE(_lastFrameCounter);
+
+ s.syncString(_subQuote2);
+}
+
+void Scene318::setup() {
+ setPlayerSpritesPrefix();
+ setAAName();
+}
+
+void Scene318::handleDialog() {
+ if (!_game._trigger) {
+ _game._player._stepEnabled = false;
+ handleRexDialogs(_action._activeAction._verbId);
+ } else if (_game._trigger == 2) {
+ int synxIdx = _globals._sequenceIndexes[2];
+ _globals._sequenceIndexes[2] = _scene->_sequences.startCycle(_globals._spriteIndexes[2], false, 1);
+ _scene->_sequences.setDepth(_globals._sequenceIndexes[2], 1);
+ _scene->_sequences.setPosition(_globals._sequenceIndexes[2], Common::Point(142, 121));
+ _scene->_sequences.updateTimeout(_globals._sequenceIndexes[2], synxIdx);
+ _vm->_sound->command(3);
+ _scene->_userInterface.setup(kInputBuildingSentences);
+ _game._player._stepEnabled = true;
+ } else {
+ if (_action._activeAction._verbId < 0x19C)
+ _dialog1.write(_action._activeAction._verbId, false);
+
+ switch (_action._activeAction._verbId) {
+ case 0x191:
+ handleInternDialog(0x19E, 2, 9999999);
+ _dialog1.write(0x192, true);
+ break;
+
+ case 0x192:
+ handleInternDialog(0x1A0, 5, 9999999);
+ _dialog1.write(0x193, true);
+ break;
+
+ case 0x193:
+ handleInternDialog(0x1A5, 4, 9999999);
+ _dialog1.write(0x194, true);
+ break;
+
+ case 0x194:
+ handleInternDialog(0x1A9, 6, 9999999);
+ _dialog1.write(0x195, true);
+ _dialog1.write(0x196, true);
+ _dialog1.write(0x19D, false);
+ break;
+
+ case 0x195:
+ handleInternDialog(0x1AF, 7, 9999999);
+ if (!_dialog1.read(0x196))
+ _dialog1.write(0x197, true);
+ break;
+
+ case 0x196:
+ handleInternDialog(0x1B6, 5, 9999999);
+ if (!_dialog1.read(0x195))
+ _dialog1.write(0x197, true);
+ break;
+
+ case 0x197:
+ handleInternDialog(0x1BB, 5, 9999999);
+ break;
+
+ case 0x198:
+ handleInternDialog(0x1C0, 5, 9999999);
+ _dialog1.write(0x19A, true);
+ break;
+
+ case 0x199:
+ handleInternDialog(0x1C5, 3, 9999999);
+ break;
+
+ case 0x19A:
+ handleInternDialog(0x1C8, 5, 9999999);
+ _dialog1.write(0x19B, true);
+ break;
+
+ case 0x19B:
+ handleInternDialog(0x1CD, 3, 9999999);
+ break;
+
+ case 0x19C:
+ case 0x19D:
+ _scene->_sequences.remove(_globals._sequenceIndexes[2]);
+ _globals._sequenceIndexes[2] = _scene->_sequences.startReverseCycle(_globals._spriteIndexes[2], false, 8, 1, 0, 0);
+ _scene->_sequences.setDepth(_globals._sequenceIndexes[2], 1);
+ _scene->_sequences.setPosition(_globals._sequenceIndexes[2], Common::Point(142, 121));
+ _scene->_sequences.setAnimRange(_globals._sequenceIndexes[2], 6, 8);
+ _scene->_sequences.addSubEntry(_globals._sequenceIndexes[2], SEQUENCE_TRIGGER_EXPIRE, 0, 2);
+
+ _dialogFl = false;
+ handleInternDialog(0x1D0, 1, 120);
+ if (_dialog1.read(0) || (_action._activeAction._verbId == 0x19D)) {
+ _explosionFl = true;
+ _internCounter = 3420;
+ }
+ break;
+ }
+
+ if (_action._activeAction._verbId < 0x19C) {
+ _dialog1.start();
+ _game._player._stepEnabled = true;
+ }
+
+ }
+}
+
+void Scene318::handleRexDialogs(int quote) {
+ _scene->_kernelMessages.reset();
+
+ Common::String curQuote = _game.getQuote(quote);
+ if (_vm->_font->getWidth(curQuote, _scene->_textSpacing) > 200) {
+ Common::String subQuote1;
+ _game.splitQuote(curQuote, subQuote1, _subQuote2);
+ _scene->_kernelMessages.add(Common::Point(138, 59), 0x1110, 32, 0, 240, subQuote1);
+ _scene->_kernelMessages.add(Common::Point(138, 73), 0x1110, 32, 1, 180, _subQuote2);
+ } else
+ _scene->_kernelMessages.add(Common::Point(138, 73), 0x1110, 32, 1, 120, curQuote);
+}
+
+void Scene318::handleInternDialog(int quoteId, int quoteNum, uint32 timeout) {
+ int height = quoteNum * 14;
+ int posY;
+ if (height < 85)
+ posY = 87 - height;
+ else
+ posY = 2;
+
+ int curQuoteId= quoteId;
+
+ int maxWidth = 0;
+ for (int i = 0; i < quoteNum; i++) {
+ maxWidth = MAX(maxWidth, _vm->_font->getWidth(_game.getQuote(curQuoteId), -1));
+ curQuoteId++;
+ }
+
+ int posX = MIN(319 - maxWidth, 178 - (maxWidth >> 1));
+ curQuoteId = quoteId;
+
+ _scene->_kernelMessages.reset();
+ _internTalkingFl = true;
+
+ for (int i = 0; i < quoteNum; i++) {
+ _game._triggerSetupMode = SEQUENCE_TRIGGER_DAEMON;
+ _scene->_sequences.addTimer(180, 63);
+ _scene->_kernelMessages.add(Common::Point(posX, posY), 0xFDFC, 0, 0, timeout, _game.getQuote(curQuoteId));
+ posY += 14;
+ curQuoteId++;
+ }
+}
+
+void Scene318::enter() {
+ _globals._spriteIndexes[1] = _scene->_sprites.addSprites(formAnimName('x', 0));
+ _globals._spriteIndexes[3] = _scene->_sprites.addSprites(formAnimName('k', -1));
+
+ if (_globals[kAfterHavoc]) {
+ _scene->loadAnimation(formAnimName('f', -1));
+ _scene->_activeAnimation->_resetFlag = true;
+ } else if (!_globals[kHasSeenProfPyro]) {
+ _scene->_hotspots.activate(NOUN_PROFESSORS_GURNEY, false);
+ _scene->_hotspots.activate(NOUN_PROFESSOR, false);
+ _scene->_hotspots.activate(NOUN_TAPE_PLAYER, false);
+ }
+
+ if (_game._objects.isInRoom(OBJ_SCALPEL)) {
+ _globals._sequenceIndexes[3] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[3], false, 6, 0, 0, 120);
+ _scene->_sequences.setDepth(_globals._sequenceIndexes[3], 4);
+ _scene->_dynamicHotspots.add(NOUN_SCALPEL, VERB_TAKE, _globals._sequenceIndexes[3], Common::Rect(0, 0, 0, 0));
+ }
+
+ if (_scene->_priorSceneId == 357)
+ _game._player._playerPos = Common::Point(15, 110);
+ else if (_scene->_priorSceneId != -2)
+ _game._player._playerPos = Common::Point(214, 152);
+
+ _dialog1.setup(0x47, 0x191, 0x192, 0x193, 0x194, 0x195, 0x196, 0x197, 0x198, 0x199, 0x19A, 0x19B, 0x19C, 0x19D, 0);
+
+ if (!_game._visitedScenes._sceneRevisited) {
+ _dialog1.set(0x191, 0x198, 0x199, 0x19C, 0);
+ if (_game._widepipeCtr >= 2)
+ _dialog1.write(0x19D, true);
+ }
+
+ if (_scene->_priorSceneId == 307) {
+ _game._player._visible = false;
+ _game._player._stepEnabled = false;
+ _scene->loadAnimation(formAnimName('a', -1), 60);
+ _animMode = 1;
+ }
+
+ _lastFrame = 0;
+ _scene->_hotspots.activate(NOUN_INTERN, false);
+
+ if (_scene->_priorSceneId != -2) {
+ _dialogFl = false;
+ _internWalkingFl = false;
+ _counter= 0;
+ _internCounter= 0;
+ _internVisibleFl = true;
+ _explosionFl = false;
+ }
+
+ _game.loadQuoteSet(0x18C, 0x18D, 0x18E, 0x18F, 0x191, 0x192, 0x193, 0x194, 0x195, 0x196,
+ 0x197, 0x198, 0x199, 0x19A, 0x19B, 0x19C, 0x19E, 0x19E, 0x1A0, 0x1A1, 0x1A2, 0x1A3,
+ 0x1A4, 0x1A5, 0x1A6, 0x1A7, 0x1A8, 0x1A9, 0x1AA, 0x1AB, 0x1AC, 0x1AD, 0x1AE, 0x1AF,
+ 0x1B0, 0x1B1, 0x1B2, 0x1B3, 0x1B4, 0x1B5, 0x1B6, 0x1B7, 0x1B8, 0x1B9, 0x1BA, 0x1BB,
+ 0x1BC, 0x1BD, 0x1BE, 0x1BF, 0x1C0, 0x1C1, 0x1C2, 0x1C3, 0x1C4, 0x1C5, 0x1C6, 0x1C7,
+ 0x1C8, 0x1C9, 0x1CA, 0x1CB, 0x1CC, 0x1CD, 0x1CE, 0x1CF, 0x1D0, 0x1D1, 0x1D2, 0x1D3,
+ 0x190, 0x19D, 0);
+
+ if ((_scene->_priorSceneId== -2) || (((_scene->_priorSceneId == 318) || (_scene->_priorSceneId == -1)) && (!_globals[kAfterHavoc]))) {
+ if (!_globals[kAfterHavoc]) {
+ _game._player._visible = false;
+ _globals._spriteIndexes[2] = _scene->_sprites.addSprites(formAnimName('g', -1));
+ _animMode = 2;
+
+ if (_game._visitedScenes.exists(319) || !_internVisibleFl) {
+ _internVisibleFl = false;
+ _dialogFl = false;
+ } else {
+ _scene->loadAnimation(formAnimName('b', -1), 61);
+ _scene->_hotspots.activate(NOUN_INTERN, true);
+ }
+
+ if (_dialogFl) {
+ _dialog1.start();
+ _globals._sequenceIndexes[2] = _scene->_sequences.startCycle(_globals._spriteIndexes[2], false, 8);
+ } else
+ _globals._sequenceIndexes[2] = _scene->_sequences.startCycle(_globals._spriteIndexes[2], false, 1);
+
+ _scene->_sequences.setPosition(_globals._sequenceIndexes[2], Common::Point(142, 121));
+ _scene->_sequences.setDepth(_globals._sequenceIndexes[2], 1);
+ }
+ }
+
+ if (_scene->_priorSceneId == 319) {
+ _game._player._stepEnabled = false;
+ _game._player._visible = false;
+ _animMode = 4;
+ if (!_globals[kHasSeenProfPyro]) {
+ _scene->loadAnimation(formAnimName('d', -1), 64);
+ _globals[kHasSeenProfPyro] = true;
+ } else {
+ _scene->loadAnimation(formAnimName('e', -1), 64);
+ }
+ }
+
+ _internTalkingFl = false;
+ _vm->_palette->setEntry(252, 63, 63, 10);
+ _vm->_palette->setEntry(253, 45, 45, 05);
+
+ _dropTimer = _vm->_game->_scene._frameStartTime;
+ sceneEntrySound();
+
+ if (_dialogFl)
+ _vm->_sound->command(15);
+}
+
+void Scene318::step() {
+ if ((_scene->_activeAnimation != nullptr) && (_animMode == 2)) {
+ if (_lastFrame != _scene->_activeAnimation->getCurrentFrame()) {
+ _lastFrame = _scene->_activeAnimation->getCurrentFrame();
+ int nextFrame = -1;
+
+ switch (_lastFrame) {
+ case 20:
+ case 30:
+ case 40:
+ case 50:
+ case 60:
+ case 70:
+ case 80:
+ case 90:
+ case 100:
+ case 110:
+ case 120:
+ case 130:
+ case 140:
+ case 149:
+ if (_internWalkingFl) {
+ nextFrame = 149;
+ } else if (_internTalkingFl) {
+ nextFrame = 149;
+ } else if (_lastFrame == 149) {
+ nextFrame = 4;
+ }
+ break;
+
+ case 151:
+ if (_internWalkingFl)
+ nextFrame = 183;
+ break;
+
+ case 167:
+ case 184:
+ if (_internWalkingFl) {
+ nextFrame = 184;
+ } else if (!_internTalkingFl) {
+ nextFrame = 0;
+ } else if (_vm->getRandomNumber(1, 100) <= 50) {
+ nextFrame = 151;
+ } else {
+ nextFrame = 167;
+ }
+
+ if (nextFrame == 184) {
+ handleInternDialog(0x1D1, 3, 240);
+ _scene->_hotspots.activate(NOUN_INTERN, false);
+ _internVisibleFl = false;
+ }
+ break;
+ }
+
+ if ((nextFrame >= 0) && (nextFrame != _scene->_activeAnimation->getCurrentFrame())) {
+ _scene->_activeAnimation->setCurrentFrame(nextFrame);
+ _lastFrame = nextFrame;
+ }
+ }
+ }
+
+ switch (_game._trigger) {
+ case 60:
+ _vm->_sound->command(3);
+ _animMode = 2;
+ _scene->_reloadSceneFlag = true;
+ break;
+
+ case 61:
+ _counter = 0;
+ break;
+
+ case 62:
+ _scene->_nextSceneId = 319;
+ break;
+
+ case 63:
+ _internTalkingFl = false;
+ break;
+
+ case 64:
+ _vm->_sound->command(3);
+ _scene->_nextSceneId = 307;
+ break;
+ }
+
+ uint32 tmpFrame = _vm->_events->getFrameCounter();
+ long diffFrame = tmpFrame - _lastFrameCounter;
+ _lastFrameCounter = tmpFrame;
+
+ if ((_animMode == 2) && !_internVisibleFl && _game._player._stepEnabled) {
+ if ((diffFrame >= 0) && (diffFrame <= 4))
+ _counter += diffFrame;
+ else
+ _counter++;
+
+ int extraCounter = _game._objects.isInInventory(OBJ_SCALPEL) ? 900 : 0;
+
+ if (_counter + extraCounter >= 1800) {
+ _scene->freeAnimation();
+ _game._player._stepEnabled = false;
+ _scene->loadAnimation(formAnimName('c', -1), 62);
+ _animMode = 3;
+ }
+ } else if ((_animMode == 2) && _explosionFl && _internVisibleFl && !_dialogFl
+ && !_internWalkingFl && (_game._screenObjects._inputMode != kInputConversation)) {
+ if ((diffFrame >= 0) && (diffFrame <= 4))
+ _internCounter += diffFrame;
+ else
+ _internCounter++;
+
+ if (_internCounter >= 3600) {
+ _vm->_sound->command(59);
+ _vm->_screen._shakeCountdown = 20;
+ _internWalkingFl = true;
+ }
+ }
+
+ if ((_vm->_game->_scene._frameStartTime - _dropTimer) > 600) {
+ _vm->_sound->command(51);
+ _globals._sequenceIndexes[1] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[1], false, 14, 1, 0, 0);
+ _scene->_sequences.setDepth(_globals._sequenceIndexes[1], 10);
+ _dropTimer = _vm->_game->_scene._frameStartTime;
+ }
+}
+
+void Scene318::preActions() {
+ if (_game._player._needToWalk)
+ _game._player._needToWalk = _game._player._visible;
+
+ if (_action.isAction(VERB_WALK_DOWN, NOUN_CORRIDOR_TO_WEST))
+ _game._player._walkOffScreenSceneId = 357;
+}
+
+void Scene318::actions() {
+ if (_game._screenObjects._inputMode == kInputConversation) {
+ handleDialog();
+ _action._inProgress = false;
+ return;
+ }
+
+ if (_action.isAction(VERB_TALKTO, NOUN_INTERN)) {
+ switch (_game._trigger) {
+ case 0: {
+ _dialogFl = true;
+ _vm->_sound->command(15);
+ _game._player._stepEnabled = false;
+ handleRexDialogs(_vm->getRandomNumber(0x18C, 0x18E));
+
+ _scene->_sequences.remove(_globals._sequenceIndexes[2]);
+ _globals._sequenceIndexes[2] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[2], false, 8, 1, 0, 80);
+ _scene->_sequences.setDepth(_globals._sequenceIndexes[2], 1);
+ _scene->_sequences.setPosition(_globals._sequenceIndexes[2], Common::Point(142, 121));
+ _scene->_sequences.setAnimRange(_globals._sequenceIndexes[2], 6, 8);
+ _scene->_sequences.addSubEntry(_globals._sequenceIndexes[2], SEQUENCE_TRIGGER_EXPIRE, 0, 2);
+ }
+ break;
+
+ case 1:
+ _game._player._stepEnabled = true;
+ handleInternDialog(0x18F, 1, 9999999);
+ _dialog1.start();
+ break;
+
+ case 2: {
+ int oldIdx = _globals._sequenceIndexes[2];
+ _globals._sequenceIndexes[2] = _scene->_sequences.startCycle(_globals._spriteIndexes[2], false, 8);
+ _scene->_sequences.setDepth(_globals._sequenceIndexes[2], 1);
+ _scene->_sequences.setPosition(_globals._sequenceIndexes[2], Common::Point(142, 121));
+ _scene->_sequences.updateTimeout(_globals._sequenceIndexes[2], oldIdx);
+ }
+ break;
+
+ default:
+ break;
+ }
+ _action._inProgress = false;
+ return;
+ }
+
+ if (_action.isAction(VERB_TAKE, NOUN_SCALPEL) && (_game._objects.isInRoom(OBJ_SCALPEL) || _game._trigger)) {
+ switch (_game._trigger) {
+ case 0:
+ _game._player._stepEnabled = false;
+ _scene->_sequences.remove(_globals._sequenceIndexes[2]);
+ _globals._sequenceIndexes[2] = _scene->_sequences.startReverseCycle(_globals._spriteIndexes[2], false, 8, 2, 0, 80);
+ _scene->_sequences.setDepth(_globals._sequenceIndexes[2], 1);
+ _scene->_sequences.setPosition(_globals._sequenceIndexes[2], Common::Point(142, 121));
+ _scene->_sequences.setAnimRange(_globals._sequenceIndexes[2], 2, 5);
+ _scene->_sequences.addSubEntry(_globals._sequenceIndexes[2], SEQUENCE_TRIGGER_SPRITE, 5, 1);
+ _scene->_sequences.addSubEntry(_globals._sequenceIndexes[2], SEQUENCE_TRIGGER_EXPIRE, 0, 2);
+ break;
+
+ case 1:
+ if (_internVisibleFl)
+ handleInternDialog(0x190, 1, 120);
+ else {
+ _game._objects.addToInventory(OBJ_SCALPEL);
+ _vm->_dialogs->showItem(OBJ_SCALPEL, 0x7C5D);
+ _scene->_sequences.remove(_globals._sequenceIndexes[3]);
+ }
+ break;
+
+ case 2: {
+ int oldIdx = _globals._sequenceIndexes[2];
+ _globals._sequenceIndexes[2] = _scene->_sequences.startCycle(_globals._spriteIndexes[2], false, 1);
+ _scene->_sequences.setDepth(_globals._sequenceIndexes[2], 1);
+ _scene->_sequences.setPosition(_globals._sequenceIndexes[2], Common::Point(142, 121));
+ _scene->_sequences.updateTimeout(_globals._sequenceIndexes[2], oldIdx);
+ _scene->_sequences.addTimer(60, 3);
+ }
+ break;
+
+ case 3:
+ _game._player._stepEnabled = true;
+ break;
+ }
+ _action._inProgress = false;
+ return;
+ }
+
+ if (_game._player._visible) {
+ if (_action.isAction(VERB_WALK_DOWN, NOUN_CORRIDOR_TO_SOUTH)) {
+ _scene->_nextSceneId = 407;
+ _action._inProgress = false;
+ return;
+ }
+
+ if (_action.isAction(VERB_TAKE, NOUN_TAPE_PLAYER)) {
+ if (_game._objects.isInRoom(OBJ_AUDIO_TAPE)) {
+ _vm->_dialogs->showItem(OBJ_AUDIO_TAPE, 0x7C5B);
+ _game._objects.addToInventory(OBJ_AUDIO_TAPE);
+ } else
+ _vm->_dialogs->show(31834);
+
+ _action._inProgress = false;
+ return;
+ }
+
+ if (_action.isAction(VERB_LOOK, NOUN_TAPE_PLAYER)) {
+ if (_game._objects.isInRoom(OBJ_AUDIO_TAPE))
+ _vm->_dialogs->show(31833);
+ else
+ _vm->_dialogs->show(31834);
+
+ _action._inProgress = false;
+ return;
+ }
+
+ if (_action.isAction(VERB_WALK_INTO, NOUN_DOCTORS_OFFICE)) {
+ _vm->_dialogs->show(31831);
+ _action._inProgress = false;
+ return;
+ }
+
+ if (_action.isAction(VERB_LOOK, NOUN_GURNEY)) {
+ _vm->_dialogs->show(31823);
+ _action._inProgress = false;
+ return;
+ }
+
+ if (_action.isAction(VERB_LOOK, NOUN_INSTRUMENT_TABLE)) {
+ _vm->_dialogs->show(31825);
+ _action._inProgress = false;
+ return;
+ }
+ } else { // Not visible
+ if (_action.isAction(VERB_LOOK, NOUN_GURNEY)) {
+ _vm->_dialogs->show(31822);
+ _action._inProgress = false;
+ return;
+ }
+
+ if (_action.isAction(VERB_LOOK, NOUN_INSTRUMENT_TABLE)) {
+ _vm->_dialogs->show(31824);
+ _action._inProgress = false;
+ return;
+ }
+ }
+
+ if (_action.isAction(VERB_LOOK, NOUN_WALL))
+ _vm->_dialogs->show(31810);
+ else if (_action.isAction(VERB_LOOK, NOUN_FLOOR))
+ _vm->_dialogs->show(31811);
+ else if (_action.isAction(VERB_LOOK, NOUN_CORRIDOR_TO_WEST))
+ _vm->_dialogs->show(31812);
+ else if (_action.isAction(VERB_LOOK, NOUN_CORRIDOR_TO_SOUTH))
+ _vm->_dialogs->show(31813);
+ else if (_action.isAction(VERB_LOOK, NOUN_FAUCET))
+ _vm->_dialogs->show(31814);
+ else if (_action.isAction(VERB_LOOK, NOUN_SINK))
+ _vm->_dialogs->show(31815);
+ else if (_action.isAction(VERB_LOOK, NOUN_CONVEYOR_BELT))
+ _vm->_dialogs->show(31816);
+ else if (_action.isAction(VERB_LOOK, NOUN_LARGE_BLADE))
+ _vm->_dialogs->show(31817);
+ else if (_action.isAction(VERB_LOOK, NOUN_MONITOR))
+ _vm->_dialogs->show(31818);
+ else if (_action.isAction(VERB_LOOK, NOUN_CABINETS))
+ _vm->_dialogs->show(31819);
+ else if (_action.isAction(VERB_LOOK, NOUN_EQUIPMENT))
+ _vm->_dialogs->show(31820);
+ else if (_action.isAction(VERB_LOOK, NOUN_SHELF))
+ _vm->_dialogs->show(31821);
+ else if (_action.isAction(VERB_OPEN, NOUN_CABINETS))
+ _vm->_dialogs->show(31829);
+ else if (_action.isAction(VERB_LOOK, NOUN_INTERN))
+ _vm->_dialogs->show(31830);
+ else if (_action.isAction(VERB_LOOK, NOUN_PROFESSOR))
+ _vm->_dialogs->show(31832);
+ else if (_action.isAction(VERB_LOOK, NOUN_PROFESSORS_GURNEY))
+ _vm->_dialogs->show(31836);
+ else if (_action._lookFlag) {
+ if (_game._player._visible || _game._objects.isInInventory(OBJ_SCALPEL))
+ _vm->_dialogs->show(31828);
+ else if (_internVisibleFl)
+ _vm->_dialogs->show(31826);
+ else
+ _vm->_dialogs->show(31827);
+ } else
+ return;
+
+ _action._inProgress = false;
+}
+
+/*------------------------------------------------------------------------*/
+
+Scene319::Scene319(MADSEngine *vm) : Scene3xx(vm) {
+ _animMode = -1;
+ _animFrame = -1;
+ _nextAction1 = -1;
+ _nextAction2 = -1;
+ _slacheMode = -1;
+ _slacheTopic = -1;
+ _slachePosY = -1;
+
+ _slacheTalkingFl = false;
+ _slacheReady = false;
+ _slacheInitFl = false;
+
+ _subQuote2 = "";
+}
+
+void Scene319::synchronize(Common::Serializer &s) {
+ Scene3xx::synchronize(s);
+
+ s.syncAsUint32LE(_animMode);
+ s.syncAsUint32LE(_animFrame);
+ s.syncAsUint32LE(_nextAction1);
+ s.syncAsUint32LE(_nextAction2);
+ s.syncAsUint32LE(_slacheMode);
+ s.syncAsUint32LE(_slacheTopic);
+ s.syncAsUint32LE(_slachePosY);
+
+ s.syncAsByte(_slacheTalkingFl);
+ s.syncAsByte(_slacheReady);
+ s.syncAsByte(_slacheInitFl);
+
+ s.syncString(_subQuote2);
+}
+
+void Scene319::setup() {
+ setPlayerSpritesPrefix();
+ setAAName();
+}
+
+void Scene319::handleRexDialogues(int quote) {
+ _scene->_kernelMessages.reset();
+
+ Common::String curQuote = _game.getQuote(quote);
+ if (_vm->_font->getWidth(curQuote, _scene->_textSpacing) > 200) {
+ Common::String subQuote1;
+ _game.splitQuote(curQuote, subQuote1, _subQuote2);
+ _scene->_kernelMessages.add(Common::Point(160, 106), 0x1110, 32, 0, 120, subQuote1);
+ _scene->_kernelMessages.add(Common::Point(160, 120), 0x1110, 32, 1, 120, _subQuote2);
+ } else
+ _scene->_kernelMessages.add(Common::Point(160, 120), 0x1110, 32, 1, 120, curQuote);
+}
+
+void Scene319::handleSlacheDialogs(int quoteId, int counter, uint32 timer) {
+ int curQuote = quoteId;
+ int posY = 5 + (_slachePosY * 14);
+
+ for (int count = 0; count < counter; count++, curQuote++) {
+ _scene->_kernelMessages.add(Common::Point(8, posY), 0xFDFC, 0, 0, timer, _game.getQuote(curQuote));
+ posY += 14;
+ }
+}
+
+void Scene319::enter() {
+ _globals._spriteIndexes[5] = _scene->_sprites.addSprites(formAnimName('e', 0));
+ _globals._spriteIndexes[0] = _scene->_sprites.addSprites(formAnimName('a', 0));
+ _globals._spriteIndexes[1] = _scene->_sprites.addSprites(formAnimName('a', 1));
+ _globals._spriteIndexes[2] = _scene->_sprites.addSprites(formAnimName('a', 2));
+ _globals._spriteIndexes[3] = _scene->_sprites.addSprites(formAnimName('a', 3));
+ _globals._spriteIndexes[4] = _scene->_sprites.addSprites(formAnimName('k', -1));
+
+ if (!_game._objects.isInInventory(OBJ_SCALPEL)) {
+ _globals._sequenceIndexes[4] = _scene->_sequences.startCycle(_globals._spriteIndexes[4], false, 1);
+ _scene->_sequences.setDepth(_globals._sequenceIndexes[4], 1);
+ }
+
+ _globals._sequenceIndexes[5] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[5], false, 18, 0, 0, 300);
+ _globals._sequenceIndexes[2] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[2], false, 67, 0, 0, 377);
+ _globals._sequenceIndexes[3] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[3], false, 173, 0, 0, 233);
+ _scene->_sequences.setDepth(_globals._sequenceIndexes[2], 14);
+ _scene->_sequences.setDepth(_globals._sequenceIndexes[3], 14);
+
+ _globals._sequenceIndexes[0] = _scene->_sequences.startCycle(_globals._spriteIndexes[0], false, 1);
+ _globals._sequenceIndexes[1] = _scene->_sequences.startCycle(_globals._spriteIndexes[1], false, 1);
+
+ _dialog1.setup(0x43, 0x165, 0x166, 0x167, 0x168, 0x169, 0x16A, 0);
+ _dialog2.setup(0x44, 0x171, 0x172, 0x173, 0x174, 0x175, 0x176, 0);
+ _dialog3.setup(0x45, 0x17D, 0x17E, 0x17F, 0x180, 0x181, 0x182, 0x183, 0);
+
+ if (_scene->_priorSceneId != -2) {
+ _dialog1.set(0x165, 0x166, 0x167, 0x168, 0);
+ _dialog2.set(0x171, 0x172, 0x173, 0x174, 0);
+ _dialog3.set(0x17D, 0x17E, 0x17F, 0x180, 0);
+ }
+
+ _game.loadQuoteSet(0x15F, 0x160, 0x161, 0x162, 0x163, 0x164, 0x16B, 0x16C, 0x16D,
+ 0x16E, 0x16F, 0x170, 0x177, 0x178, 0x178, 0x17A, 0x17B, 0x17C, 0x165, 0x166,
+ 0x167, 0x168, 0x169, 0x16A, 0x171, 0x172, 0x173, 0x174, 0x175, 0x176, 0x17D,
+ 0x17E, 0x17F, 0x180, 0x181, 0x182, 0x183, 0x184, 0x185, 0x186, 0x187, 0x188,
+ 0x189, 0x18A, 0x18B, 0);
+
+ _vm->_palette->setEntry(252, 63, 30, 2);
+ _vm->_palette->setEntry(253, 45, 15, 1);
+
+ _slachePosY = 0;
+ _slacheInitFl = false;
+ _slacheTalkingFl = false;
+ _slacheReady = false;
+ _animFrame = 0;
+
+ _scene->loadAnimation(formAnimName('b', 0));
+
+ if (_scene->_priorSceneId != -2) {
+ _animMode = 1;
+ _nextAction1 = 2;
+ _nextAction2 = 2;
+ _slacheMode = 1;
+ _slacheTopic = 1;
+ _slacheInitFl = true;
+
+ if (_globals[kRexHasMetSlache]) {
+ handleSlacheDialogs(VERB_WALK_OUTSIDE, 2, 9999999);
+ _slachePosY = 3;
+ } else {
+ handleSlacheDialogs(0x186, 4, 9999999);
+ _slachePosY = 5;
+ }
+ }
+
+ switch (_slacheTopic) {
+ case 1:
+ handleSlacheDialogs(0x15F, 2, 9999999);
+ _dialog1.start();
+ break;
+
+ case 2:
+ handleSlacheDialogs(0x16B, 2, 9999999);
+ _dialog2.start();
+ break;
+
+ case 3:
+ handleSlacheDialogs(0x177, 2, 9999999);
+ _dialog3.start();
+ break;
+
+ default:
+ break;
+ }
+
+ _slachePosY = 0;
+ sceneEntrySound();
+}
+
+void Scene319::step() {
+ if (_scene->_activeAnimation == nullptr)
+ return;
+
+ if (_animFrame != _scene->_activeAnimation->getCurrentFrame()) {
+ _animFrame = _scene->_activeAnimation->getCurrentFrame();
+ int nextFrame = -1;
+ if (_animMode == 1) {
+ switch (_animFrame) {
+ case 6:
+ _slacheTalkingFl = true;
+ break;
+
+ case 29:
+ _slacheReady = true;
+ break;
+
+ case 39:
+ if (_slacheInitFl) {
+ _slacheInitFl = false;
+ if (_nextAction1 == 2)
+ nextFrame = 0;
+ } else if (_nextAction1 == 2)
+ _nextAction1 = 1;
+ break;
+
+ case 50:
+ case 60:
+ case 70:
+ case 85:
+ if (_nextAction1 == 2)
+ nextFrame = 0;
+ else if (_nextAction1 == 3) {
+ nextFrame = 85;
+ _slacheTalkingFl = true;
+ } else if (_animFrame == 85) {
+ if (!_game._player._stepEnabled)
+ _slacheTalkingFl = true;
+ nextFrame = 40;
+ }
+ break;
+
+ case 115:
+ _slacheReady = true;
+ break;
+
+ case 129:
+ if (_nextAction1 == 3) {
+ nextFrame = 115;
+ if (!_game._player._stepEnabled)
+ _slacheTalkingFl = true;
+ }
+ break;
+
+ case 145:
+ nextFrame = 40;
+ break;
+
+ default:
+ break;
+ }
+
+ if ((_animFrame > 40) && (_animFrame < 85) && (nextFrame < 0)) {
+ switch (_nextAction1) {
+ case 4:
+ _animFrame = 0;
+ _scene->freeAnimation();
+ _animMode = 2;
+ _scene->loadAnimation(formAnimName('b', 3), 70);
+ break;
+
+ case 5:
+ _animFrame = 0;
+ _scene->freeAnimation();
+ _animMode = 3;
+ _scene->loadAnimation(formAnimName('b', 4), 71);
+ break;
+
+ case 6:
+ _animFrame = 0;
+ _scene->freeAnimation();
+ _animMode = 4;
+ _scene->loadAnimation(formAnimName('b', 5), 72);
+ break;
+
+ default:
+ break;
+ }
+
+ if (!_animFrame) {
+ _scene->_sequences.remove(_globals._sequenceIndexes[0]);
+ _scene->_sequences.remove(_globals._sequenceIndexes[1]);
+
+ for (int i = 0; i <= 1; i++) {
+ _globals._sequenceIndexes[i] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[i], false, 8, 1, 0, 0);
+ _scene->_sequences.setAnimRange(_globals._sequenceIndexes[i], 1, 7);
+ }
+ _scene->_sequences.addSubEntry(_globals._sequenceIndexes[0], SEQUENCE_TRIGGER_EXPIRE, 0, 73);
+ }
+ }
+ }
+
+ if (_animMode == 2) {
+ if (_animFrame == 13)
+ _vm->_screen._shakeCountdown = 40;
+
+ if (_animFrame == 16)
+ _vm->_screen._shakeCountdown = 1;
+ }
+
+ if (_animMode == 3) {
+ if (_animFrame == 11)
+ _vm->_screen._shakeCountdown = 60;
+
+ if (_animFrame == 18)
+ _vm->_screen._shakeCountdown = 1;
+ }
+
+ if ((_animMode == 4) && (_animFrame == 16))
+ _vm->_screen._shakeCountdown = 80;
+
+ if ((nextFrame >= 0) && (nextFrame != _scene->_activeAnimation->getCurrentFrame())) {
+ _scene->_activeAnimation->setCurrentFrame(nextFrame);
+ _animFrame = nextFrame;
+ }
+ }
+
+ switch (_game._trigger) {
+ case 70:
+ case 71:
+ _animMode = 1;
+ _nextAction1 = _nextAction2;
+ _animFrame = 0;
+ _scene->freeAnimation();
+ _scene->loadAnimation(formAnimName('b', 0));
+ if (_nextAction1 == 3)
+ _scene->_activeAnimation->setCurrentFrame(85);
+ else if (_nextAction1 == 1)
+ _scene->_activeAnimation->setCurrentFrame(40);
+
+ _animFrame = _scene->_activeAnimation->getCurrentFrame();
+ _slacheTalkingFl = true;
+ _vm->_screen._shakeCountdown = 1;
+
+ for (int i = 0; i <= 1; i++) {
+ int oldIdx = _globals._sequenceIndexes[i];
+ _scene->_sequences.remove(_globals._sequenceIndexes[i]);
+ _globals._sequenceIndexes[i] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[i], false, 8, 1, 0, 0);
+ _scene->_sequences.setAnimRange(_globals._sequenceIndexes[i], 8, 13);
+ _scene->_sequences.updateTimeout(_globals._sequenceIndexes[i], oldIdx);
+ }
+ _scene->_sequences.addSubEntry(_globals._sequenceIndexes[0], SEQUENCE_TRIGGER_EXPIRE, 0, 74);
+ break;
+
+ case 72:
+ _vm->_palette->setColorFlags(0xFF, 0, 0);
+ _vm->_palette->setColorValues(0, 0, 0);
+ _vm->_palette->fadeOut(_vm->_palette->_mainPalette, nullptr, 18, 228,
+ 248, 0, 1, 16);
+ _vm->_screen._shakeCountdown = 1;
+ _scene->_reloadSceneFlag = true;
+ break;
+
+ case 73:
+ for (int i = 0; i <= 1; i++) {
+ int oldIdx = _globals._sequenceIndexes[i];
+ _scene->_sequences.remove(_globals._sequenceIndexes[i]);
+ _globals._sequenceIndexes[i] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[i], false, 8, 0, 0, 0);
+ _scene->_sequences.setAnimRange(_globals._sequenceIndexes[i], 6, 7);
+ _scene->_sequences.updateTimeout(_globals._sequenceIndexes[i], oldIdx);
+ }
+ break;
+
+ case 74:
+ for (int i = 0; i <= 1; i++) {
+ int oldIdx = _globals._sequenceIndexes[i];
+ _scene->_sequences.remove(_globals._sequenceIndexes[i]);
+ _globals._sequenceIndexes[i] = _scene->_sequences.startCycle(_globals._spriteIndexes[i], false, 1);
+ _scene->_sequences.updateTimeout(_globals._sequenceIndexes[i], oldIdx);
+ }
+ break;
+
+ default:
+ break;
+ }
+}
+
+void Scene319::actions() {
+ if (_game._trigger == 0) {
+ _game._player._stepEnabled = false;
+ handleRexDialogues(_action._activeAction._verbId);
+ } else {
+ if ((_action._activeAction._verbId == 0x165) || (_action._activeAction._verbId == 0x166)) {
+ if (_game._trigger == 1) {
+ _nextAction1 = 3;
+ _slacheTalkingFl = false;
+ _slacheMode = 1;
+ _slacheTopic = 2;
+ }
+
+ if (!_slacheTalkingFl) {
+ _scene->_sequences.addTimer(4, 2);
+ } else {
+ handleSlacheDialogs(0x16B, 2, 9999999);
+ _dialog2.start();
+ _game._player._stepEnabled = true;
+ }
+ }
+
+ if ((_action._activeAction._verbId == 0x171) || (_action._activeAction._verbId == 0x172)) {
+ if (_game._trigger == 1) {
+ _nextAction1 = 2;
+ _slacheTalkingFl = false;
+ _slacheMode = 1;
+ _slacheTopic = 3;
+ }
+
+ if (!_slacheTalkingFl) {
+ _scene->_sequences.addTimer(4, 2);
+ } else {
+ handleSlacheDialogs(0x177, 2, 9999999);
+ _dialog3.start();
+ _game._player._stepEnabled = true;
+ }
+ }
+
+ if ((_action._activeAction._verbId == 0x17D) || (_action._activeAction._verbId == 0x17E)) {
+ if (_game._trigger == 1) {
+ _nextAction1 = 3;
+ _slacheTalkingFl = false;
+ _slacheReady = false;
+ _slacheMode = 1;
+ _slacheTopic = 1;
+ }
+
+ if (!_slacheTalkingFl) {
+ _scene->_sequences.addTimer(4, 2);
+ } else {
+ if (_game._trigger == 2)
+ handleSlacheDialogs(0x184, 2, 180);
+
+ if (!_slacheReady) {
+ _scene->_sequences.addTimer(120, 3);
+ } else {
+ _globals[kRexHasMetSlache] = true;
+ _scene->_nextSceneId = 318;
+ }
+ }
+ }
+
+ if ((_action._activeAction._verbId == 0x168) || (_action._activeAction._verbId == 0x174) ||
+ (_action._activeAction._verbId == 0x180) || (_action._activeAction._verbId == 0x169) ||
+ (_action._activeAction._verbId == 0x175) || (_action._activeAction._verbId == 0x181) ||
+ (_action._activeAction._verbId == 0x16A) || (_action._activeAction._verbId == 0x176) ||
+ (_action._activeAction._verbId == 0x182) || (_action._activeAction._verbId == 0x183) ||
+ (_action._activeAction._verbId == 0x167) || (_action._activeAction._verbId == 0x173) ||
+ (_action._activeAction._verbId == 0x17F)) {
+
+ bool addDialogLine = !((_action._activeAction._verbId == 0x167) || (_action._activeAction._verbId == 0x173) ||
+ (_action._activeAction._verbId == 0x17F) || (_action._activeAction._verbId == 0x16A) ||
+ (_action._activeAction._verbId == 0x176) || (_action._activeAction._verbId == 0x182) ||
+ (_action._activeAction._verbId == 0x183));
+
+ int addVerbId = _action._activeAction._verbId + 1;
+ if ((addVerbId == 0x182) && (_game._storyMode != STORYMODE_NAUGHTY))
+ addVerbId = 0x183;
+
+ if (_slacheMode == 1) {
+ if (_game._trigger == 1) {
+ _nextAction2 = _nextAction1;
+ _nextAction1 = 4;
+ }
+
+ if (_nextAction1 != _nextAction2) {
+ _scene->_sequences.addTimer(4, 2);
+ } else {
+ Conversation *curDialog;
+ int nextDocQuote;
+ if ((_action._activeAction._verbId == 0x168) || (_action._activeAction._verbId == 0x167)) {
+ curDialog = &_dialog1;
+ nextDocQuote = 0x161;
+ } else if ((_action._activeAction._verbId == 0x174) || (_action._activeAction._verbId == 0x1753)) {
+ nextDocQuote = 0x16D;
+ curDialog = &_dialog2;
+ } else {
+ nextDocQuote = 0x179;
+ curDialog = &_dialog3;
+ }
+
+ handleSlacheDialogs(nextDocQuote, 2, 9999999);
+ if (addDialogLine) {
+ curDialog->write(_action._activeAction._verbId, false);
+ curDialog->write(addVerbId, true);
+ }
+
+ curDialog->start();
+ _game._player._stepEnabled = true;
+ _slacheMode = 2;
+ }
+ } else if (_slacheMode == 2) {
+ if (_game._trigger == 1) {
+ _nextAction2 = _nextAction1;
+ _nextAction1 = 5;
+ }
+
+ if (_nextAction1 != _nextAction2) {
+ _scene->_sequences.addTimer(4, 2);
+ } else {
+ Conversation *curDialog;
+ int nextDocQuote;
+ if ((_action._activeAction._verbId == 0x168) || (_action._activeAction._verbId == 0x169) || (_action._activeAction._verbId == 0x167)) {
+ curDialog = &_dialog1;
+ nextDocQuote = 0x163;
+ } else if ((_action._activeAction._verbId == 0x174) || (_action._activeAction._verbId == 0x175) || (_action._activeAction._verbId == 0x173)) {
+ nextDocQuote = 0x16F;
+ curDialog = &_dialog2;
+ } else {
+ nextDocQuote = 0x17B;
+ curDialog = &_dialog3;
+ }
+
+ handleSlacheDialogs(nextDocQuote, 2, 9999999);
+ if (addDialogLine) {
+ curDialog->write(_action._activeAction._verbId, false);
+ curDialog->write(addVerbId, true);
+ }
+
+ curDialog->start();
+ _game._player._stepEnabled = true;
+ _slacheMode = 3;
+ }
+ } else {
+ _nextAction2 = _nextAction1;
+ _nextAction1 = 6;
+ }
+ }
+ }
+
+ _action._inProgress = false;
+}
+
+/*------------------------------------------------------------------------*/
+
+Scene320::Scene320(MADSEngine *vm) : Scene300s(vm) {
+ _blinkFl = false;
+ _flippedFl = false;
+
+ _buttonId = -1;
+ _lastFrame = -1;
+ _leftItemId = -1;
+ _posX = -1;
+ _rightItemId = -1;
+}
+
+void Scene320::synchronize(Common::Serializer &s) {
+ Scene3xx::synchronize(s);
+
+ s.syncAsByte(_blinkFl);
+ s.syncAsByte(_flippedFl);
+
+ s.syncAsSint32LE(_buttonId);
+ s.syncAsSint32LE(_lastFrame);
+ s.syncAsSint32LE(_leftItemId);
+ s.syncAsSint32LE(_posX);
+ s.syncAsSint32LE(_rightItemId);
+}
+
+void Scene320::setup() {
+ setPlayerSpritesPrefix();
+ setAAName();
+}
+
+void Scene320::setRightView(int view) {
+ if (_rightItemId < 8) _scene->_sequences.remove(_globals._sequenceIndexes[10]);
+
+ int spriteNum;
+ switch (view) {
+ case 0:
+ spriteNum = 16;
+ break;
+
+ case 1:
+ spriteNum = 14;
+ break;
+
+ case 2:
+ spriteNum = 17;
+ break;
+
+ case 3:
+ spriteNum = 15;
+ break;
+
+ default:
+ spriteNum = view + 6;
+ break;
+ }
+
+ if (view != 8) {
+ _globals._sequenceIndexes[10] = _scene->_sequences.startCycle(_globals._spriteIndexes[spriteNum], false, 1);
+ _scene->_sequences.setDepth(_globals._sequenceIndexes[10], 0);
+ }
+
+ _globals[kRightView320] = _rightItemId = view;
+}
+
+void Scene320::setLeftView(int view) {
+ if (_leftItemId < 10)
+ _scene->_sequences.remove(_globals._sequenceIndexes[0]);
+
+ if (view != 10) {
+ _globals._sequenceIndexes[0] = _scene->_sequences.startReverseCycle(_globals._spriteIndexes[view], false, 6, 0, 0, 18);
+ _scene->_sequences.setDepth(_globals._sequenceIndexes[0], 0);
+ if (!_blinkFl)
+ _scene->_sequences.setAnimRange(_globals._sequenceIndexes[0], 2, 2);
+ }
+
+ _leftItemId = view;
+}
+
+void Scene320::handleButtons() {
+ switch(_action._activeAction._objectNameId) {
+ case 0x2DD:
+ _buttonId = 5;
+ break;
+
+ case 0x2DE:
+ _buttonId = 4;
+ break;
+
+ case 0x2E0:
+ _buttonId = 6;
+ break;
+
+ case 0x2E1:
+ _buttonId = 7;
+ break;
+
+ case 0x2E2:
+ _buttonId = 8;
+ break;
+
+ case 0x2E3:
+ _buttonId = 9;
+ break;
+
+ case 0x2E4:
+ _buttonId = 10;
+ break;
+
+ case 0x2E5:
+ _buttonId = 11;
+ break;
+
+ case 0x2E6:
+ _buttonId = 12;
+ break;
+
+ case 0x2E7:
+ _buttonId = 13;
+ break;
+
+ case 0x2E8:
+ _buttonId = 0;
+ break;
+
+ case 0x2E9:
+ _buttonId = 1;
+ break;
+
+ case 0x2EA:
+ _buttonId = 2;
+ break;
+
+ case 0x2EB:
+ _buttonId = 3;
+ break;
+
+ default:
+ break;
+ }
+
+ if (_buttonId <= 3) {
+ _posX = (8 * _buttonId) - 2;
+ _flippedFl = true;
+ } else if (_buttonId <= 5) {
+ _posX = (13 * _buttonId) - 14;
+ _flippedFl = true;
+ } else {
+ _posX = (8 * _buttonId) + 98;
+ _flippedFl = false;
+ }
+}
+
+void Scene320::enter() {
+ _blinkFl = true;
+ _rightItemId = 8;
+ _leftItemId = 10;
+ _lastFrame = 0;
+
+ for (int i = 0; i < 10; i++)
+ _globals._spriteIndexes[i] = _scene->_sprites.addSprites(formAnimName('M', i));
+
+ for (int i = 0; i < 8; i++)
+ _globals._spriteIndexes[10 + i] = _scene->_sprites.addSprites(formAnimName('N', i));
+
+ _globals._spriteIndexes[18] = _scene->_sprites.addSprites("*REXHAND");
+ _game._player._visible = false;
+
+ setRightView(_globals[kRightView320]);
+ setLeftView(0);
+
+ _vm->_palette->setEntry(252, 63, 30, 20);
+ _vm->_palette->setEntry(253, 45, 15, 10);
+
+ sceneEntrySound();
+}
+
+void Scene320::step() {
+ if (_scene->_activeAnimation != nullptr) {
+ if (_lastFrame != _scene->_activeAnimation->getCurrentFrame()) {
+ _lastFrame = _scene->_activeAnimation->getCurrentFrame();
+ switch (_lastFrame) {
+ case 95:
+ _blinkFl = true;
+ setLeftView(9);
+ _vm->_sound->command(41);
+ break;
+
+ case 139:
+ _blinkFl = false;
+ setLeftView(9);
+ break;
+
+ case 191:
+ _scene->_kernelMessages.add(Common::Point(1, 1), 0xFDFC, 0, 0, 60, _game.getQuote(0xFE));
+ break;
+
+ case 417:
+ case 457:
+ _vm->_screen._shakeCountdown = 40;
+ _vm->_sound->command(59);
+ break;
+
+ case 430:
+ _blinkFl = true;
+ setLeftView(4);
+ break;
+
+ default:
+ break;
+ }
+ }
+ }
+
+ if (_game._trigger == 70) {
+ _globals[kAfterHavoc] = true;
+ _globals[kTeleporterRoom + 1] = 351;
+ _scene->_nextSceneId = 361;
+ }
+}
+
+void Scene320::actions() {
+ if (_action._lookFlag)
+ _vm->_dialogs->show(32011);
+ else if ((_action.isAction(VERB_PRESS) || _action.isAction(VERB_PUSH)) &&
+ (_action.isObject(NOUN_LEFT_1_KEY) || _action.isObject(NOUN_LEFT_2_KEY) || _action.isObject(NOUN_LEFT_3_KEY) || _action.isObject(NOUN_LEFT_4_KEY) ||
+ _action.isObject(NOUN_GREEN_BUTTON) || _action.isObject(NOUN_RED_BUTTON) || _action.isObject(NOUN_RIGHT_1_KEY) || _action.isObject(NOUN_RIGHT_2_KEY) ||
+ _action.isObject(NOUN_RIGHT_3_KEY) || _action.isObject(NOUN_RIGHT_4_KEY) || _action.isObject(NOUN_RIGHT_5_KEY) || _action.isObject(NOUN_RIGHT_6_KEY) ||
+ _action.isObject(NOUN_RIGHT_7_KEY) || _action.isObject(NOUN_RIGHT_8_KEY)
+ )) {
+ switch (_game._trigger) {
+ case 0:
+ _game._player._stepEnabled = false;
+ handleButtons();
+ _globals._sequenceIndexes[18] = _scene->_sequences.startReverseCycle(_globals._spriteIndexes[18], _flippedFl, 4, 2, 0, 0);
+ _scene->_sequences.setScale(_globals._sequenceIndexes[18], 60);
+ _scene->_sequences.setPosition(_globals._sequenceIndexes[18], Common::Point(_posX, 170));
+ _scene->_sequences.setDepth(_globals._sequenceIndexes[18], 0);
+ _scene->_sequences.addSubEntry(_globals._sequenceIndexes[18], SEQUENCE_TRIGGER_LOOP, 0, 1);
+ _scene->_sequences.addSubEntry(_globals._sequenceIndexes[18], SEQUENCE_TRIGGER_EXPIRE, 0, 2);
+ break;
+
+ case 1:
+ if (_buttonId >= 6) {
+ _vm->_sound->command(60);
+ setRightView(_buttonId - 6);
+ }
+ if (_buttonId == 4) {
+ _vm->_sound->command(38);
+ if (_leftItemId == 3)
+ setLeftView(0);
+ else
+ setLeftView(3);
+ }
+ if (_buttonId == 5) {
+ _vm->_sound->command(38);
+ if (_leftItemId == 1)
+ setLeftView(2);
+ else
+ setLeftView(1);
+ }
+ if (_buttonId <= 3) {
+ _vm->_sound->command(60);
+ setLeftView(_buttonId + 5);
+ }
+ break;
+
+ case 2:
+ _game._player._stepEnabled = true;
+ if (_buttonId == 5) {
+ if (_leftItemId == 2) {
+ _game._player._stepEnabled = false;
+ setRightView(8);
+ setLeftView(10);
+ _scene->_kernelMessages.reset();
+ _scene->resetScene();
+ _globals._spriteIndexes[2] = _scene->_sprites.addSprites(formAnimName('m', 2));
+ _globals._spriteIndexes[4] = _scene->_sprites.addSprites(formAnimName('m', 4));
+ _globals._spriteIndexes[9] = _scene->_sprites.addSprites(formAnimName('m', 9));
+ _blinkFl = false;
+ setLeftView(2);
+ _game.loadQuoteSet(0xFE, 0);
+ _game._triggerSetupMode = SEQUENCE_TRIGGER_DAEMON;
+ _scene->loadAnimation(formAnimName('a', -1), 70);
+ _vm->_sound->command(17);
+ }
+ }
+ break;
+
+ default:
+ break;
+ }
+ } else if (_action.isAction(VERB_LEAVE, NOUN_SECURITY_STATION))
+ _scene->_nextSceneId = 311;
+ else if (_action.isAction(VERB_LOOK, NOUN_RIGHT_MONITOR))
+ _vm->_dialogs->show(32001);
+ else if (_action.isAction(VERB_LOOK, NOUN_LEFT_MONITOR))
+ _vm->_dialogs->show(32002);
+ else if (_action.isAction(VERB_LOOK, NOUN_DESK))
+ _vm->_dialogs->show(32003);
+ else if (_action.isAction(VERB_LOOK, NOUN_SECURITY_STATION))
+ _vm->_dialogs->show(32004);
+ else if (_action.isAction(VERB_LOOK, NOUN_MUG))
+ _vm->_dialogs->show(32005);
+ else if (_action.isAction(VERB_LOOK, NOUN_DOUGHNUT))
+ _vm->_dialogs->show(32006);
+ else if (_action.isAction(VERB_LOOK, NOUN_MAGAZINE))
+ _vm->_dialogs->show(32006);
+ else if (_action.isAction(VERB_LOOK, NOUN_PAPER_FOOTBALL))
+ _vm->_dialogs->show(32008);
+ else if (_action.isAction(VERB_LOOK, NOUN_NEWSPAPER))
+ _vm->_dialogs->show(32009);
+ else if (_action.isAction(VERB_LOOK, NOUN_CLIPBOARD))
+ _vm->_dialogs->show(32010);
+ else if (_action.isAction(VERB_TAKE, NOUN_MUG))
+ _vm->_dialogs->show(32012);
+ else if (_action.isAction(VERB_TAKE, NOUN_CLIPBOARD))
+ _vm->_dialogs->show(32013);
+ else if (_action.isAction(VERB_TAKE, NOUN_DOUGHNUT) || _action.isAction(VERB_EAT, NOUN_DOUGHNUT))
+ _vm->_dialogs->show(32014);
+ else if (_action.isAction(VERB_TAKE, NOUN_PAPER_FOOTBALL))
+ _vm->_dialogs->show(32015);
+ else if (_action.isAction(VERB_TAKE, NOUN_MAGAZINE))
+ _vm->_dialogs->show(32016);
+ else if (_action.isAction(VERB_TAKE, NOUN_NEWSPAPER))
+ _vm->_dialogs->show(32017);
+ else
+ return;
+
+ _action._inProgress = false;
+}
+
+/*------------------------------------------------------------------------*/
+
+void Scene321::setup() {
+ setPlayerSpritesPrefix();
+ setAAName();
+}
+
+void Scene321::enter() {
+ _game._player._visible = false;
+ _game._player._stepEnabled = false;
+
+ _scene->_userInterface.emptyConversationList();
+ _scene->_userInterface.setup(kInputConversation);
+
+ int suffixNum;
+ if (_globals[kSexOfRex] == REX_FEMALE) {
+ _globals[kSexOfRex] = REX_MALE;
+ suffixNum = 1;
+ } else {
+ _globals[kSexOfRex] = REX_FEMALE;
+ suffixNum = _game._visitedScenes._sceneRevisited ? 2 : 0;
+ }
+
+ _scene->loadAnimation(formAnimName('g', suffixNum), 60);
+ sceneEntrySound();
+}
+
+void Scene321::step() {
+ if (_scene->_activeAnimation != nullptr) {
+ if ((_scene->_activeAnimation->getCurrentFrame() >= 260) && (_globals[kSexOfRex] == REX_MALE) && (_game._storyMode >= STORYMODE_NICE))
+ _scene->_nextSceneId = 316;
+ }
+
+ if (_game._trigger == 60)
+ _scene->_nextSceneId = 316;
+}
+
+/*------------------------------------------------------------------------*/
+
+void Scene322::setup() {
+ _game._player._spritesPrefix = "";
+ // The original is calling scene3xx_setAAName()
+ _game._aaName = Resources::formatAAName(4);
+}
+
+void Scene322::enter() {
+ if (_globals[kSexOfRex] == REX_MALE)
+ _handSpriteId = _scene->_sprites.addSprites("*REXHAND");
+ else
+ _handSpriteId = _scene->_sprites.addSprites("*ROXHAND");
+
+ teleporterEnter();
+
+ // The original is using scene3xx_sceneEntrySound()
+ if (!_vm->_musicFlag)
+ _vm->_sound->command(2);
+ else
+ _vm->_sound->command(10);
+}
+
+void Scene322::step() {
+ teleporterStep();
+}
+
+void Scene322::actions() {
+ if (_action._lookFlag) {
+ _vm->_dialogs->show(32214);
+ _action._inProgress = false;
+ return;
+ }
+
+ if (teleporterActions()) {
+ _action._inProgress = false;
+ return;
+ }
+
+ if (_action.isAction(VERB_LOOK, NOUN_VIEWPORT) || _action.isAction(VERB_PEER_THROUGH, NOUN_VIEWPORT))
+ _vm->_dialogs->show(32210);
+ else if (_action.isAction(VERB_LOOK, NOUN_KEYPAD))
+ _vm->_dialogs->show(32211);
+ else if (_action.isAction(VERB_LOOK, NOUN_DISPLAY))
+ _vm->_dialogs->show(32212);
+ else if (_action.isAction(VERB_LOOK, NOUN_0_KEY) || _action.isAction(VERB_LOOK, NOUN_1_KEY)
+ || _action.isAction(VERB_LOOK, NOUN_2_KEY) || _action.isAction(VERB_LOOK, NOUN_3_KEY)
+ || _action.isAction(VERB_LOOK, NOUN_4_KEY) || _action.isAction(VERB_LOOK, NOUN_5_KEY)
+ || _action.isAction(VERB_LOOK, NOUN_6_KEY) || _action.isAction(VERB_LOOK, NOUN_7_KEY)
+ || _action.isAction(VERB_LOOK, NOUN_8_KEY) || _action.isAction(VERB_LOOK, NOUN_9_KEY)
+ || _action.isAction(VERB_LOOK, NOUN_SMILE_KEY) || _action.isAction(VERB_LOOK, NOUN_ENTER_KEY)
+ || _action.isAction(VERB_LOOK, NOUN_FROWN_KEY))
+ _vm->_dialogs->show(32213);
+ else if (_action.isAction(VERB_LOOK, NOUN_DEVICE))
+ _vm->_dialogs->show(32214);
+ else
+ return;
+
+ _action._inProgress = false;
+}
+
+/*------------------------------------------------------------------------*/
+
+void Scene351::setup() {
+ if (_scene->_currentSceneId == 391)
+ _globals[kSexOfRex] = REX_MALE;
+
+ setPlayerSpritesPrefix();
+ setAAName();
+ _scene->addActiveVocab(VERB_WALKTO);
+}
+
+void Scene351::enter() {
+ _globals[kAfterHavoc] = -1;
+ _globals[kTeleporterRoom + 1] = 351;
+
+ _globals._spriteIndexes[1] = _scene->_sprites.addSprites(formAnimName('c', -1));
+ _globals._spriteIndexes[2] = _scene->_sprites.addSprites("*ROXRC_7");
+ _globals._spriteIndexes[3] = _scene->_sprites.addSprites("*RXRD_7");
+
+ if (_game._objects.isInRoom(OBJ_CREDIT_CHIP)) {
+ _globals._sequenceIndexes[1] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[1], false, 6, 0, 0, 0);
+ _scene->_sequences.setDepth(_globals._sequenceIndexes[1], 4);
+ } else
+ _scene->_hotspots.activate(NOUN_CREDIT_CHIP, false);
+
+ if (_scene->_priorSceneId == 352)
+ _game._player._playerPos = Common::Point(148, 152);
+ else if (_scene->_priorSceneId != -2) {
+ _game._player._playerPos = Common::Point(207, 81);
+ _game._player._facing = FACING_NORTH;
+ }
+
+ if (_globals[kTeleporterCommand]) {
+ _game._player._visible = false;
+ _game._player._stepEnabled = false;
+
+ char sepChar = 'a';
+ if (_globals[kSexOfRex] != REX_MALE)
+ sepChar = 'b';
+
+ int suffixNum = -1;
+ int trigger = 0;
+
+ switch (_globals[kTeleporterCommand]) {
+ case 1:
+ suffixNum = 0;
+ trigger = 60;
+ _globals[kTeleporterCommand] = true;
+ break;
+
+ case 2:
+ suffixNum = 1;
+ trigger = 61;
+ break;
+
+ case 3:
+ case 4:
+ _game._player._visible = true;
+ _game._player._stepEnabled = true;
+ _game._player._turnToFacing = FACING_SOUTH;
+ suffixNum = -1;
+ break;
+
+ default:
+ break;
+ }
+
+ _globals[kTeleporterCommand] = 0;
+
+ if (suffixNum >= 0)
+ _scene->loadAnimation(formAnimName(sepChar, suffixNum), trigger);
+ }
+
+ sceneEntrySound();
+}
+
+void Scene351::step() {
+ if (_game._trigger == 60) {
+ _game._player._stepEnabled = true;
+ _game._player._visible = true;
+ _game._player._priorTimer = _scene->_frameStartTime - _game._player._ticksAmount;
+ _game._player._turnToFacing = FACING_SOUTH;
+ }
+
+ if (_game._trigger == 61) {
+ _globals[kTeleporterCommand] = 1;
+ _scene->_nextSceneId = _globals[kTeleporterDestination];
+ _scene->_reloadSceneFlag = true;
+ }
+}
+
+void Scene351::actions() {
+ if (_action._lookFlag)
+ _vm->_dialogs->show(35121);
+ else if (_action.isAction(VERB_STEP_INTO, NOUN_TELEPORTER))
+ _scene->_nextSceneId = 322;
+ else if (_action.isAction(VERB_WALK_DOWN, NOUN_CORRIDOR_TO_SOUTH))
+ _scene->_nextSceneId = 352;
+ else if (_action.isAction(VERB_TAKE, NOUN_CREDIT_CHIP)) {
+ if (_game._trigger || !_game._objects.isInInventory(OBJ_CREDIT_CHIP)) {
+ switch (_game._trigger) {
+ case 0:
+ _game._player._stepEnabled = false;
+ _game._player._visible = false;
+ if (_globals[kSexOfRex] == REX_FEMALE) {
+ _globals._sequenceIndexes[2] = _scene->_sequences.startReverseCycle(_globals._spriteIndexes[2], false, 5, 2, 0, 0);
+ _scene->_sequences.setMsgLayout(_globals._sequenceIndexes[2]);
+ _scene->_sequences.addSubEntry(_globals._sequenceIndexes[2], SEQUENCE_TRIGGER_SPRITE, 5, 1);
+ _scene->_sequences.addSubEntry(_globals._sequenceIndexes[2], SEQUENCE_TRIGGER_EXPIRE, 0, 2);
+ } else {
+ _globals._sequenceIndexes[3] = _scene->_sequences.startReverseCycle(_globals._spriteIndexes[3], false, 5, 2, 0, 0);
+ _scene->_sequences.setMsgLayout(_globals._sequenceIndexes[3]);
+ _scene->_sequences.addSubEntry(_globals._sequenceIndexes[3], SEQUENCE_TRIGGER_SPRITE, 6, 1);
+ _scene->_sequences.addSubEntry(_globals._sequenceIndexes[3], SEQUENCE_TRIGGER_EXPIRE, 0, 2);
+ }
+ break;
+
+ case 1:
+ _scene->_hotspots.activate(NOUN_CREDIT_CHIP, false);
+ _scene->_sequences.remove(_globals._sequenceIndexes[1]);
+ _game._objects.addToInventory(OBJ_CREDIT_CHIP);
+ break;
+
+ case 2:
+ _game._player._visible = true;
+ _game._player._stepEnabled = true;
+ _vm->_dialogs->showItem(OBJ_CREDIT_CHIP, 0x32F);
+ break;
+ }
+ }
+ } else if (_action.isAction(VERB_LOOK, NOUN_VIEW_SCREEN))
+ _vm->_dialogs->show(35110);
+ else if (_action.isAction(VERB_LOOK, NOUN_RIP_IN_FLOOR))
+ _vm->_dialogs->show(35111);
+ else if (_action.isAction(VERB_LOOK, NOUN_FIRE_HYDRANT))
+ _vm->_dialogs->show(35112);
+ else if (_action.isAction(VERB_LOOK, NOUN_GUARD)) {
+ if (_game._objects[0xF]._roomNumber == 351)
+ _vm->_dialogs->show(35114);
+ else
+ _vm->_dialogs->show(35113);
+ } else if (_action.isAction(VERB_LOOK, NOUN_EQUIPMENT))
+ _vm->_dialogs->show(35115);
+ else if (_action.isAction(VERB_LOOK, NOUN_DESK))
+ _vm->_dialogs->show(35116);
+ else if (_action.isAction(VERB_LOOK, NOUN_MACHINE))
+ _vm->_dialogs->show(35117);
+ else if (_action.isAction(VERB_LOOK, NOUN_TELEPORTER))
+ _vm->_dialogs->show(35118);
+ else if (_action.isAction(VERB_LOOK, NOUN_CONTROL_PANEL))
+ _vm->_dialogs->show(35119);
+ else if (_action.isAction(VERB_LOOK, NOUN_CORRIDOR_TO_SOUTH))
+ _vm->_dialogs->show(35120);
+ else if (_action.isAction(VERB_LOOK, NOUN_POLE))
+ _vm->_dialogs->show(35122);
+ else
+ return;
+
+ _action._inProgress = false;
+}
+
+/*------------------------------------------------------------------------*/
+
+Scene352::Scene352(MADSEngine *vm) : Scene3xx(vm) {
+ _vaultOpenFl = false;
+ _mustPutArmDownFl = false;
+ _leaveRoomFl = false;
+
+ _tapePlayerHotspotIdx = -1;
+ _hotspot1Idx = -1;
+ _hotspot2Idx = -1;
+ _lampHostpotIdx = -1;
+ _commonSequenceIdx = -1;
+ _commonSpriteIndex = -1;
+}
+
+void Scene352::synchronize(Common::Serializer &s) {
+ Scene3xx::synchronize(s);
+
+ s.syncAsByte(_vaultOpenFl);
+ s.syncAsByte(_mustPutArmDownFl);
+ s.syncAsByte(_leaveRoomFl);
+
+ s.syncAsSint32LE(_tapePlayerHotspotIdx);
+ s.syncAsSint32LE(_hotspot1Idx);
+ s.syncAsSint32LE(_hotspot2Idx);
+ s.syncAsSint32LE(_lampHostpotIdx);
+ s.syncAsSint32LE(_commonSequenceIdx);
+ s.syncAsSint32LE(_commonSpriteIndex);
+}
+
+void Scene352::setup() {
+ setPlayerSpritesPrefix();
+ setAAName();
+
+ _scene->addActiveVocab(VERB_WALKTO);
+ _scene->addActiveVocab(NOUN_YOUR_STUFF);
+ _scene->addActiveVocab(NOUN_OTHER_STUFF);
+ _scene->addActiveVocab(NOUN_LAMP);
+}
+
+void Scene352::putArmDown(bool corridorExit, bool doorwayExit) {
+ switch (_game._trigger) {
+ case 0:
+ _scene->_kernelMessages.add(Common::Point(0, 0), 0x1110, 34, 0, 60, _game.getQuote(0xFF));
+ _scene->_sequences.addTimer(48, 1);
+ break;
+
+ case 1:
+ _game._player._stepEnabled = false;
+ _game._player._visible = false;
+ if (_globals[kSexOfRex] == REX_FEMALE) {
+ _globals._sequenceIndexes[3] = _scene->_sequences.startReverseCycle(_globals._spriteIndexes[3], false, 5, 2, 0, 0);
+ _scene->_sequences.setMsgLayout(_globals._sequenceIndexes[3]);
+ _scene->_sequences.addSubEntry(_globals._sequenceIndexes[3], SEQUENCE_TRIGGER_SPRITE, 5, 2);
+ _scene->_sequences.addSubEntry(_globals._sequenceIndexes[3], SEQUENCE_TRIGGER_EXPIRE, 0, 3);
+ } else {
+ _globals._sequenceIndexes[4] = _scene->_sequences.startReverseCycle(_globals._spriteIndexes[4], false, 5, 2, 0, 0);
+ _scene->_sequences.setMsgLayout(_globals._sequenceIndexes[4]);
+ _scene->_sequences.addSubEntry(_globals._sequenceIndexes[4], SEQUENCE_TRIGGER_SPRITE, 6, 2);
+ _scene->_sequences.addSubEntry(_globals._sequenceIndexes[4], SEQUENCE_TRIGGER_EXPIRE, 0, 3);
+ }
+ break;
+
+ case 2: {
+ _globals._sequenceIndexes[2] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[2], false, 6, 0, 0, 0);
+ int idx = _scene->_dynamicHotspots.add(NOUN_GUARDS_ARM2, VERB_WALKTO, _globals._sequenceIndexes[2], Common::Rect(0, 0, 0, 0));
+ _scene->_dynamicHotspots.setPosition(idx, Common::Point(230, 117), FACING_NORTHWEST);
+ _scene->changeVariant(0);
+ }
+ break;
+
+ case 3:
+ _scene->_kernelMessages.reset();
+ _scene->_kernelMessages.add(Common::Point(0, 0), 0x1110, 34, 0, 120, _game.getQuote(0x100));
+ _game._objects.setRoom(OBJ_GUARDS_ARM, _scene->_currentSceneId);
+ _game._player._visible = true;
+ if (corridorExit)
+ _scene->_sequences.addTimer(48, 6);
+ else if (doorwayExit)
+ _scene->_sequences.addTimer(48, 4);
+ else {
+ _mustPutArmDownFl = false;
+ _game._player._stepEnabled = true;
+ }
+ break;
+
+ case 4:
+ _game._player.walk(Common::Point(116, 107), FACING_NORTH);
+ _game._player._stepEnabled = true;
+ _mustPutArmDownFl = false;
+ _scene->_sequences.addTimer(180, 5);
+ _leaveRoomFl = true;
+ break;
+
+ case 5:
+ if (_leaveRoomFl)
+ _scene->_nextSceneId = 351;
+
+ break;
+
+ case 6:
+ _game._player.walk(Common::Point(171, 152), FACING_SOUTH);
+ _game._player._stepEnabled = true;
+ _mustPutArmDownFl = false;
+ _scene->_sequences.addTimer(180, 7);
+ _leaveRoomFl = true;
+ break;
+
+ case 7:
+ if (_leaveRoomFl)
+ _scene->_nextSceneId = 353;
+
+ break;
+
+ default:
+ break;
+ }
+}
+
+void Scene352::enter() {
+ _globals._spriteIndexes[1] = _scene->_sprites.addSprites("*RM302x0");
+ _globals._spriteIndexes[13] = _scene->_sprites.addSprites("*RM302x2");
+ _globals._spriteIndexes[12] = _scene->_sprites.addSprites("*RM302x3");
+ _globals._spriteIndexes[2] = _scene->_sprites.addSprites(formAnimName('g', -1));
+ _globals._spriteIndexes[5] = _scene->_sprites.addSprites(formAnimName('b', -1));
+
+
+ if (_globals[kSexOfRex] == REX_FEMALE) {
+ _globals._spriteIndexes[3] = _scene->_sprites.addSprites("*ROXRC_7");
+ _globals._spriteIndexes[7] = _scene->_sprites.addSprites("*ROXRC_6");
+ _globals._spriteIndexes[15] = _scene->_sprites.addSprites("*ROXRC_9");
+ _globals._spriteIndexes[11] = _scene->_sprites.addSprites(formAnimName('a', 3));
+ _globals._spriteIndexes[9] = _scene->_sprites.addSprites(formAnimName('a', 2));
+ } else {
+ _globals._spriteIndexes[4] = _scene->_sprites.addSprites("*RXRD_7");
+ _globals._spriteIndexes[6] = _scene->_sprites.addSprites("*RXRC_6");
+ _globals._spriteIndexes[14] = _scene->_sprites.addSprites("*RXMRC_9");
+ _globals._spriteIndexes[10] = _scene->_sprites.addSprites(formAnimName('a', 1));
+ _globals._spriteIndexes[8] = _scene->_sprites.addSprites(formAnimName('a', 0));
+ }
+
+ _leaveRoomFl = false;
+
+ if (_game._objects.isInRoom(OBJ_TAPE_PLAYER)) {
+ _globals._sequenceIndexes[5] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[5], false, 12, 0, 0, 0);
+ _scene->_sequences.setDepth(_globals._sequenceIndexes[5], 5);
+ int idx = _scene->_dynamicHotspots.add(NOUN_TAPE_PLAYER, VERB_WALKTO, _globals._sequenceIndexes[5], Common::Rect(0, 0, 0, 0));
+ _tapePlayerHotspotIdx = _scene->_dynamicHotspots.setPosition(idx, Common::Point(84, 145), FACING_WEST);
+ }
+
+ _vaultOpenFl = false;
+
+ if (_scene->_priorSceneId != -2) {
+ _mustPutArmDownFl = false;
+ if (!_game._visitedScenes._sceneRevisited)
+ _globals[kHaveYourStuff] = false;
+ }
+
+ if (_game._objects.isInRoom(OBJ_GUARDS_ARM)) {
+ _globals._sequenceIndexes[2] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[2], false, 6, 0, 0, 0);
+ int idx = _scene->_dynamicHotspots.add(NOUN_GUARDS_ARM2, VERB_WALKTO, _globals._sequenceIndexes[2], Common::Rect(0, 0, 0, 0));
+ _scene->_dynamicHotspots.setPosition(idx, Common::Point(230, 117), FACING_NORTHWEST);
+ } else
+ _mustPutArmDownFl = true;
+
+ if (_scene->_priorSceneId == 353)
+ _game._player._playerPos = Common::Point(171, 155);
+ else if (_scene->_priorSceneId != -2)
+ _game._player._playerPos = Common::Point(116, 107);
+
+ sceneEntrySound();
+
+ _game.loadQuoteSet(0xFF, 0x100, 0x101, 0x102, 0x103, 0);
+}
+
+void Scene352::preActions() {
+ _leaveRoomFl = false;
+
+ if (_action.isAction(VERB_OPEN, NOUN_VAULT))
+ _game._player.walk(Common::Point(266, 111), FACING_NORTHEAST);
+
+ if (_vaultOpenFl && !_action.isObject(NOUN_VAULT) && !_action.isObject(NOUN_LAMP) && !_action.isObject(NOUN_OTHER_STUFF) && !_action.isObject(NOUN_YOUR_STUFF)) {
+ if (_globals[kHaveYourStuff]) {
+ _commonSpriteIndex = _globals._spriteIndexes[13];
+ _commonSequenceIdx = _globals._sequenceIndexes[13];
+ } else {
+ _commonSpriteIndex = _globals._spriteIndexes[1];
+ _commonSequenceIdx = _globals._sequenceIndexes[1];
+ }
+
+ switch (_game._trigger) {
+ case 0:
+ if (_game._player._needToWalk) {
+ _game._player._stepEnabled = false;
+ _scene->_sequences.remove(_commonSequenceIdx);
+ _vm->_sound->command(20);
+ _commonSequenceIdx = _scene->_sequences.startReverseCycle(_commonSpriteIndex, false, 6, 1, 0, 0);
+ _scene->_sequences.addSubEntry(_commonSequenceIdx, SEQUENCE_TRIGGER_EXPIRE, 0, 1);
+ _scene->_sequences.setDepth(_commonSequenceIdx, 15);
+ }
+ break;
+
+ case 1:
+ if (!_globals[kHaveYourStuff])
+ _scene->_dynamicHotspots.remove(_hotspot2Idx);
+
+ _scene->_dynamicHotspots.remove(_hotspot1Idx);
+ _scene->_dynamicHotspots.remove(_lampHostpotIdx);
+ _vaultOpenFl = false;
+ _game._player._stepEnabled = true;
+ break;
+
+ default:
+ break;
+ }
+ }
+
+ if (_action.isAction(VERB_PUT, NOUN_GUARDS_ARM2, NOUN_SCANNER)) {
+ if (_globals[kSexOfRex] == REX_MALE)
+ _game._player.walk(Common::Point(269, 111), FACING_NORTHEAST);
+ else
+ _game._player.walk(Common::Point(271, 111), FACING_NORTHEAST);
+ }
+
+ if (_action.isAction(VERB_WALK_THROUGH, NOUN_DOORWAY) || _action.isAction(VERB_WALK_DOWN, NOUN_CORRIDOR_TO_SOUTH) || _action.isAction(VERB_PUT, NOUN_GUARDS_ARM2, NOUN_FLOOR)) {
+ if (_game._objects.isInInventory(OBJ_GUARDS_ARM))
+ _game._player.walk(Common::Point(230, 117), FACING_NORTHWEST);
+ }
+}
+
+void Scene352::actions() {
+ if (_action._lookFlag) {
+ _vm->_dialogs->show(35225);
+ _action._inProgress = false;
+ return;
+ }
+
+ if (_action.isAction(VERB_OPEN, NOUN_VAULT)) {
+ if (!_vaultOpenFl) {
+ switch (_game._trigger) {
+ case 0:
+ _game._player._stepEnabled = false;
+ _game._player._visible = false;
+ if (_globals[kSexOfRex] == REX_FEMALE)
+ _commonSpriteIndex = _globals._spriteIndexes[9];
+ else
+ _commonSpriteIndex = _globals._spriteIndexes[8];
+
+ _commonSequenceIdx = _scene->_sequences.addSpriteCycle(_commonSpriteIndex, false, 8, 1, 0, 0);
+ _scene->_sequences.updateTimeout(_commonSequenceIdx, -1);
+ _scene->_sequences.addSubEntry(_commonSequenceIdx, SEQUENCE_TRIGGER_EXPIRE, 0, 1);
+ break;
+
+ case 1: {
+ _vm->_sound->command(21);
+ _globals._sequenceIndexes[12] = _scene->_sequences.startReverseCycle(_globals._spriteIndexes[12], false, 7, 2, 20, 0);
+ _scene->_sequences.setDepth(_globals._sequenceIndexes[12], FACING_NORTH);
+ int oldIdx = _commonSequenceIdx;
+ _commonSequenceIdx = _scene->_sequences.startCycle(_commonSpriteIndex, false, -2);
+ _scene->_sequences.updateTimeout(_commonSequenceIdx, oldIdx);
+ _scene->_sequences.addSubEntry(_globals._sequenceIndexes[12], SEQUENCE_TRIGGER_EXPIRE, 0, 2);
+ }
+ break;
+
+ case 2:
+ _vm->_sound->command(22);
+ _scene->_sequences.remove(_commonSequenceIdx);
+ _commonSequenceIdx = _scene->_sequences.startReverseCycle(_commonSpriteIndex, false, 8, 1, 0, 0);
+ _scene->_sequences.setAnimRange(_commonSequenceIdx, 1, 3);
+ _scene->_sequences.addSubEntry(_commonSequenceIdx, SEQUENCE_TRIGGER_EXPIRE, 0, 3);
+ break;
+
+ case 3:
+ _scene->_sequences.updateTimeout(-1, _commonSequenceIdx);
+ _game._player._visible = true;
+ _scene->_sequences.addTimer(60, 4);
+ break;
+
+ case 4:
+ _scene->_kernelMessages.add(Common::Point(0, 0), 0x1110, 34, 0, 120, _game.getQuote(0x101));
+ _game._player._stepEnabled = true;
+ break;
+ }
+ }
+ _action._inProgress = false;
+ return;
+ }
+
+ if (_game._objects.isInInventory(OBJ_GUARDS_ARM)) {
+ _mustPutArmDownFl = true;
+ }
+
+ bool exit_corridor = false;
+ bool exit_doorway = false;
+
+ if (_action.isAction(VERB_WALK_DOWN, NOUN_CORRIDOR_TO_SOUTH)) {
+ exit_corridor = true;
+ }
+
+ if (_action.isAction(VERB_WALK_THROUGH, NOUN_DOORWAY)) {
+ exit_doorway = true;
+ }
+
+ if (_action.isAction(VERB_WALK_DOWN, NOUN_CORRIDOR_TO_SOUTH) || _action.isAction(VERB_WALK_THROUGH, NOUN_DOORWAY) || _action.isAction(VERB_PUT, NOUN_GUARDS_ARM2, NOUN_FLOOR)) {
+ if (_mustPutArmDownFl)
+ putArmDown(exit_corridor, exit_doorway);
+ else if (exit_corridor)
+ _scene->_nextSceneId = 353;
+ else
+ _scene->_nextSceneId = 351;
+
+ _action._inProgress = false;
+ return;
+ }
+
+ if (_action.isAction(VERB_TAKE, NOUN_GUARDS_ARM2)) {
+ if (_game._trigger || !_game._objects.isInInventory(OBJ_GUARDS_ARM)) {
+ switch (_game._trigger) {
+ case 0:
+ _game._player._stepEnabled = false;
+ _game._player._visible = false;
+ if (_globals[kSexOfRex] == REX_FEMALE) {
+ _globals._sequenceIndexes[3] = _scene->_sequences.startReverseCycle(_globals._spriteIndexes[3], false, 5, 2, 0, 0);
+ _scene->_sequences.setMsgLayout(_globals._sequenceIndexes[3]);
+ _scene->_sequences.addSubEntry(_globals._sequenceIndexes[3], SEQUENCE_TRIGGER_SPRITE, 5, 1);
+ _scene->_sequences.addSubEntry(_globals._sequenceIndexes[3], SEQUENCE_TRIGGER_EXPIRE, 0, 2);
+ } else {
+ _globals._sequenceIndexes[4] = _scene->_sequences.startReverseCycle(_globals._spriteIndexes[4], false, 5, 2, 0, 0);
+ _scene->_sequences.setMsgLayout(_globals._sequenceIndexes[4]);
+ _scene->_sequences.addSubEntry(_globals._sequenceIndexes[4], SEQUENCE_TRIGGER_SPRITE, 6, 1);
+ _scene->_sequences.addSubEntry(_globals._sequenceIndexes[4], SEQUENCE_TRIGGER_EXPIRE, 0, 2);
+ }
+ break;
+
+ case 1:
+ _scene->_sequences.remove(_globals._sequenceIndexes[2]);
+ _game._objects.addToInventory(OBJ_GUARDS_ARM);
+ _scene->changeVariant(1);
+ break;
+
+ case 2:
+ _game._player._visible = true;
+ _game._player._stepEnabled = true;
+ _vm->_dialogs->showItem(OBJ_GUARDS_ARM, 0x899C);
+ break;
+ }
+ _action._inProgress = false;
+ return;
+ }
+ }
+
+ if (_action.isAction(VERB_PUT, NOUN_GUARDS_ARM2, NOUN_SCANNER)) {
+ if (!_vaultOpenFl) {
+ switch (_game._trigger) {
+ case 0:
+ _game._player._stepEnabled = false;
+ _game._player._visible = false;
+ if (_globals[kSexOfRex] == REX_FEMALE)
+ _commonSpriteIndex = _globals._spriteIndexes[11];
+ else
+ _commonSpriteIndex = _globals._spriteIndexes[10];
+
+ _commonSequenceIdx = _scene->_sequences.addSpriteCycle(_commonSpriteIndex, false, 8, 1, 0, 0);
+ _scene->_sequences.updateTimeout(_commonSequenceIdx, -1);
+ _scene->_sequences.addSubEntry(_commonSequenceIdx, SEQUENCE_TRIGGER_EXPIRE, 0, 1);
+ break;
+
+ case 1: {
+ _vm->_sound->command(21);
+ _globals._sequenceIndexes[12] = _scene->_sequences.startReverseCycle(_globals._spriteIndexes[12], false, 7, 2, 20, 0);
+ _scene->_sequences.setDepth(_globals._sequenceIndexes[12], 8);
+ int oldIdx = _commonSequenceIdx;
+ _commonSequenceIdx = _scene->_sequences.startCycle(_commonSpriteIndex, false, -2);
+ _scene->_sequences.updateTimeout(_commonSequenceIdx, oldIdx);
+ _scene->_sequences.addSubEntry(_globals._sequenceIndexes[12], SEQUENCE_TRIGGER_EXPIRE, 0, 2);
+ }
+ break;
+
+ case 2:
+ _vm->_sound->command(23);
+ _scene->_sequences.remove(_commonSequenceIdx);
+ _commonSequenceIdx = _scene->_sequences.startReverseCycle(_commonSpriteIndex, false, 8, 1, 0, 0);
+ _scene->_sequences.setAnimRange(_commonSequenceIdx, 1, 4);
+ _scene->_sequences.addSubEntry(_commonSequenceIdx, SEQUENCE_TRIGGER_EXPIRE, 0, 3);
+ break;
+
+
+ case 3:
+ _scene->_sequences.updateTimeout(-1, _commonSequenceIdx);
+ _game._player._visible = true;
+ if (_globals[kHaveYourStuff])
+ _commonSpriteIndex = _globals._spriteIndexes[13];
+ else
+ _commonSpriteIndex = _globals._spriteIndexes[1];
+
+ _vm->_sound->command(20);
+ _commonSequenceIdx = _scene->_sequences.addSpriteCycle(_commonSpriteIndex, false, 6, 1, 0, 0);
+ _scene->_sequences.setDepth(_commonSequenceIdx, 15);
+ _scene->_sequences.addSubEntry(_commonSequenceIdx, SEQUENCE_TRIGGER_EXPIRE, 0, 4);
+ break;
+
+ case 4:
+ _commonSequenceIdx = _scene->_sequences.addSpriteCycle(_commonSpriteIndex, false, 6, 0, 0, 0);
+ _scene->_sequences.setAnimRange(_commonSequenceIdx, -2, -2);
+ _scene->_sequences.setDepth(_commonSequenceIdx, 15);
+ _scene->_sequences.addTimer(60, 5);
+ break;
+
+ case 5: {
+ _vaultOpenFl = true;
+ int idx;
+ if (!_globals[kHaveYourStuff]) {
+ idx = _scene->_dynamicHotspots.add(NOUN_YOUR_STUFF, VERB_WALKTO, -1, Common::Rect(282, 87, 282 + 13, 87 + 7));
+ _hotspot2Idx = _scene->_dynamicHotspots.setPosition(idx, Common::Point(280, 111), FACING_NORTHEAST);
+ _globals._sequenceIndexes[1] = _commonSequenceIdx;
+ _scene->_kernelMessages.add(Common::Point(0, 0), 0x1110, 34, 0, 120, _game.getQuote(0x102));
+ } else {
+ _globals._sequenceIndexes[13] = _commonSequenceIdx;
+ _scene->_kernelMessages.add(Common::Point(0, 0), 0x1110, 34, 0, 120, _game.getQuote(0x103));
+ }
+
+ idx = _scene->_dynamicHotspots.add(NOUN_OTHER_STUFF, VERB_WALKTO, -1, Common::Rect(282, 48, 282 + 36, 48 + 27));
+ _hotspot1Idx = _scene->_dynamicHotspots.setPosition(idx, Common::Point(287, 115), FACING_NORTHEAST);
+ idx = _scene->_dynamicHotspots.add(NOUN_LAMP, VERB_WALKTO, -1, Common::Rect(296, 76, 296 + 11, 76 + 17));
+ _lampHostpotIdx = _scene->_dynamicHotspots.setPosition(idx, Common::Point(287, 115), FACING_NORTHEAST);
+ _game._player._stepEnabled = true;
+ }
+ break;
+ }
+ }
+ } else if (_action.isAction(VERB_TAKE, NOUN_YOUR_STUFF)) {
+ switch (_game._trigger) {
+ case 0:
+ _game._player._stepEnabled = false;
+ _game._player._visible = false;
+ if (_globals[kSexOfRex] == REX_MALE) {
+ _globals._sequenceIndexes[14] = _scene->_sequences.startReverseCycle(_globals._spriteIndexes[14], false, 8, 1, 0, 0);
+ _scene->_sequences.setAnimRange(_globals._sequenceIndexes[14], 1, 2);
+ _scene->_sequences.setMsgLayout(_globals._sequenceIndexes[14]);
+ _scene->_sequences.addSubEntry(_globals._sequenceIndexes[14], SEQUENCE_TRIGGER_SPRITE, 2, 1);
+ _scene->_sequences.addSubEntry(_globals._sequenceIndexes[14], SEQUENCE_TRIGGER_EXPIRE, 0, 2);
+ } else {
+ _globals._sequenceIndexes[15] = _scene->_sequences.startReverseCycle(_globals._spriteIndexes[15], false, 8, 1, 0, 0);
+ _scene->_sequences.setAnimRange(_globals._sequenceIndexes[15], 1, 2);
+ _scene->_sequences.setMsgLayout(_globals._sequenceIndexes[15]);
+ _scene->_sequences.addSubEntry(_globals._sequenceIndexes[15], SEQUENCE_TRIGGER_SPRITE, 2, 1);
+ _scene->_sequences.addSubEntry(_globals._sequenceIndexes[15], SEQUENCE_TRIGGER_EXPIRE, 0, 2);
+ }
+ break;
+
+ case 1:
+ _scene->_dynamicHotspots.remove(_hotspot2Idx);
+ _globals[kHaveYourStuff] = true;
+
+ for (uint16 i = 0; i < _game._objects.size(); i++) {
+ if (_game._objects[i]._roomNumber == 50)
+ _game._objects.addToInventory(i);
+ }
+
+ _scene->_sequences.remove(_globals._sequenceIndexes[1]);
+ _globals._sequenceIndexes[13] = _scene->_sequences.startCycle(_globals._spriteIndexes[13], false, -2);
+ _scene->_sequences.setDepth(_globals._sequenceIndexes[13], 15);
+ break;
+
+ case 2:
+ if (_globals[kSexOfRex] == REX_MALE)
+ _scene->_sequences.updateTimeout(-1, _globals._sequenceIndexes[14]);
+ else
+ _scene->_sequences.updateTimeout(-1, _globals._sequenceIndexes[15]);
+
+ _game._player._visible = true;
+ _game._player._stepEnabled = true;
+ break;
+
+ default:
+ break;
+ }
+ } else if (_action.isAction(VERB_TAKE, NOUN_TAPE_PLAYER) && !_game._objects.isInInventory(OBJ_TAPE_PLAYER)) {
+ switch (_game._trigger) {
+ case 0:
+ _game._player._stepEnabled = false;
+ _game._player._visible = false;
+ if (_globals[kSexOfRex] == REX_MALE) {
+ _globals._sequenceIndexes[6] = _scene->_sequences.startReverseCycle(_globals._spriteIndexes[6], true, 6, 2, 0, 0);
+ _scene->_sequences.setMsgLayout(_globals._sequenceIndexes[6]);
+ _scene->_sequences.addSubEntry(_globals._sequenceIndexes[6], SEQUENCE_TRIGGER_SPRITE, 6, 1);
+ _scene->_sequences.addSubEntry(_globals._sequenceIndexes[6], SEQUENCE_TRIGGER_EXPIRE, 0, 2);
+ } else {
+ _globals._sequenceIndexes[7] = _scene->_sequences.startReverseCycle(_globals._spriteIndexes[7], true, 6, 2, 0, 0);
+ _scene->_sequences.setMsgLayout(_globals._sequenceIndexes[7]);
+ _scene->_sequences.addSubEntry(_globals._sequenceIndexes[7], SEQUENCE_TRIGGER_SPRITE, 6, 1);
+ _scene->_sequences.addSubEntry(_globals._sequenceIndexes[7], SEQUENCE_TRIGGER_EXPIRE, 0, 2);
+ }
+ break;
+
+ case 1:
+ _scene->_sequences.remove(_globals._sequenceIndexes[5]);
+ _scene->_dynamicHotspots.remove(_tapePlayerHotspotIdx);
+ break;
+
+ case 2:
+ _game._objects.addToInventory(OBJ_TAPE_PLAYER);
+ if (_globals[kSexOfRex] == REX_MALE)
+ _scene->_sequences.updateTimeout(-1, _globals._sequenceIndexes[6]);
+ else
+ _scene->_sequences.updateTimeout(-1, _globals._sequenceIndexes[7]);
+
+ _game._player._visible = true;
+ _game._player._stepEnabled = true;
+ _vm->_dialogs->showItem(OBJ_TAPE_PLAYER, 35227);
+ break;
+
+ default:
+ break;
+ }
+ } else if (_action.isAction(VERB_LOOK, NOUN_SCANNER))
+ _vm->_dialogs->show(35210);
+ else if (_action.isAction(VERB_LOOK, NOUN_MONITOR)) {
+ if (_game._storyMode == STORYMODE_NAUGHTY)
+ _vm->_dialogs->show(35211);
+ else
+ _vm->_dialogs->show(35212);
+ } else if (_action.isAction(VERB_LOOK, NOUN_DISPLAY))
+ _vm->_dialogs->show(35213);
+ else if (_action.isAction(VERB_LOOK, NOUN_STATUE))
+ _vm->_dialogs->show(35214);
+ else if (_action.isAction(VERB_LOOK, NOUN_TAPE_PLAYER) && (_action._savedFields._mainObjectSource == 4))
+ _vm->_dialogs->show(35215);
+ else if (_action.isAction(VERB_LOOK, NOUN_AIR_VENT))
+ _vm->_dialogs->show(35216);
+ else if (_action.isAction(VERB_LOOK, NOUN_GUARDS_ARM2) && (_action._savedFields._mainObjectSource == 4))
+ _vm->_dialogs->show(35217);
+ else if (_action.isAction(VERB_LOOK, NOUN_IRONING_BOARD))
+ _vm->_dialogs->show(35218);
+ else if (_action.isAction(VERB_LOOK, NOUN_CLOCK))
+ _vm->_dialogs->show(35219);
+ else if (_action.isAction(VERB_LOOK, NOUN_GAUGE))
+ _vm->_dialogs->show(35220);
+ else if (_action.isAction(VERB_LOOK, NOUN_VAULT)) {
+ if (!_vaultOpenFl)
+ _vm->_dialogs->show(35221);
+ } else if (_action.isAction(VERB_LOOK, NOUN_YOUR_STUFF))
+ _vm->_dialogs->show(35222);
+ else if (_action.isAction(VERB_LOOK, NOUN_OTHER_STUFF))
+ _vm->_dialogs->show(35223);
+ else if (_action.isAction(VERB_LOOK, NOUN_CORRIDOR_TO_SOUTH))
+ _vm->_dialogs->show(35224);
+ else if (_action.isAction(VERB_TAKE, NOUN_OTHER_STUFF))
+ _vm->_dialogs->show(35226);
+ else if (_action.isAction(VERB_LOOK, NOUN_DESK))
+ _vm->_dialogs->show(35229);
+ else if (_action.isAction(VERB_LOOK, NOUN_GUARD))
+ _vm->_dialogs->show(35230);
+ else if (_action.isAction(VERB_LOOK, NOUN_DOORWAY))
+ _vm->_dialogs->show(35231);
+ else if (_action.isAction(VERB_LOOK, NOUN_TABLE))
+ _vm->_dialogs->show(35232);
+ else if (_action.isAction(VERB_LOOK, NOUN_PROJECTOR))
+ _vm->_dialogs->show(35233);
+ else if (_action.isAction(VERB_LOOK, NOUN_SUPPORT))
+ _vm->_dialogs->show(35234);
+ else if (_action.isAction(VERB_LOOK, NOUN_SECURITY_MONITOR))
+ _vm->_dialogs->show(35235);
+ else
+ return;
+
+ _action._inProgress = false;
+}
+
+/*------------------------------------------------------------------------*/
+
+void Scene353::setup() {
+ setPlayerSpritesPrefix();
+ setAAName();
+}
+
+void Scene353::enter() {
+ _globals._spriteIndexes[1] = _scene->_sprites.addSprites(Resources::formatName(303, 'B', 0, EXT_SS, ""));
+ _globals._sequenceIndexes[1] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[1], false, 5, 0, 5, 0);
+ _scene->_sequences.setDepth(_globals._sequenceIndexes[1], 1);
+
+ if (_scene->_priorSceneId == 352)
+ _game._player._playerPos = Common::Point(144, 95);
+ else
+ _game._player._playerPos = Common::Point(139, 155);
+
+ sceneEntrySound();
+}
+
+void Scene353::actions() {
+ if (_action._lookFlag)
+ _vm->_dialogs->show(35315);
+ else if (_action.isAction(VERB_WALK_THROUGH, NOUN_DOORWAY))
+ _scene->_nextSceneId = 352;
+ else if (_action.isAction(VERB_WALK_DOWN, NOUN_CORRIDOR_TO_SOUTH))
+ _scene->_nextSceneId = 354;
+ else if (_action.isAction(VERB_LOOK, NOUN_ROCK_CHUNK))
+ _vm->_dialogs->show(35310);
+ else if (_action.isAction(VERB_LOOK, NOUN_PIPES) || _action.isAction(VERB_LOOK, NOUN_PIPE))
+ _vm->_dialogs->show(35311);
+ else if (_action.isAction(VERB_LOOK, NOUN_BROKEN_BEAM))
+ _vm->_dialogs->show(35312);
+ else if (_action.isAction(VERB_LOOK, NOUN_DOORWAY))
+ _vm->_dialogs->show(35313);
+ else if (_action.isAction(VERB_LOOK, NOUN_CORRIDOR_TO_SOUTH))
+ _vm->_dialogs->show(35314);
+ else if (_action.isAction(VERB_LOOK, NOUN_FLOOR))
+ _vm->_dialogs->show(35316);
+ else if (_action.isAction(VERB_LOOK, NOUN_CEILING))
+ _vm->_dialogs->show(35317);
+ else if (_action.isAction(VERB_LOOK, NOUN_WALL))
+ _vm->_dialogs->show(35318);
+ else
+ return;
+
+ _action._inProgress = false;
+}
+
+/*------------------------------------------------------------------------*/
+
+void Scene354::setup() {
+ setPlayerSpritesPrefix();
+ setAAName();
+}
+
+void Scene354::enter() {
+ _globals[kAfterHavoc] = true;
+ _globals[kTeleporterRoom + 1] = 351;
+
+ if (_scene->_priorSceneId == 361)
+ _game._player._playerPos = Common::Point(231, 110);
+ else if (_scene->_priorSceneId == 401) {
+ _game._player._playerPos = Common::Point(106, 152);
+ _game._player._facing = FACING_NORTH;
+ } else if (_scene->_priorSceneId == 316)
+ _game._player._playerPos = Common::Point(71, 107);
+ else if (_scene->_priorSceneId != -2)
+ _game._player._playerPos = Common::Point(167, 57);
+
+ sceneEntrySound();
+}
+
+void Scene354::preActions() {
+ if (_action.isAction(VERB_WALK_DOWN, NOUN_CORRIDOR_TO_SOUTH))
+ _game._player._walkOffScreenSceneId = 401;
+}
+
+void Scene354::actions() {
+ if (_action._lookFlag)
+ _vm->_dialogs->show(35414);
+ else if (_action.isAction(VERB_WALK_DOWN, NOUN_CORRIDOR_TO_NORTH)) {
+ _game._player.startWalking(Common::Point(208, 0), FACING_NORTHEAST);
+ _game._player._walkOffScreenSceneId = 353;
+ } else if (_action.isAction(VERB_WALK_DOWN, NOUN_CORRIDOR_TO_EAST))
+ _scene->_nextSceneId = 361;
+ else if (_action.isAction(VERB_WALK_DOWN, NOUN_CORRIDOR_TO_WEST))
+ _scene->_nextSceneId = 316;
+ else if (_action.isAction(VERB_WALK_DOWN, NOUN_CORRIDOR_TO_SOUTH))
+ _scene->_nextSceneId = 401;
+ else if (_action.isAction(VERB_LOOK, NOUN_CONTROLS))
+ _vm->_dialogs->show(35410);
+ else if (_action.isAction(VERB_LOOK, NOUN_SIGNAL))
+ _vm->_dialogs->show(35411);
+ else if (_action.isAction(VERB_LOOK, NOUN_CATWALK))
+ _vm->_dialogs->show(35412);
+ else if (_action.isAction(VERB_LOOK, NOUN_AIR_DUCT))
+ _vm->_dialogs->show(35413);
+ else if (_action.isAction(VERB_LOOK, NOUN_CORRIDOR_TO_NORTH))
+ _vm->_dialogs->show(35415);
+ else if (_action.isAction(VERB_LOOK, NOUN_CORRIDOR_TO_SOUTH))
+ _vm->_dialogs->show(35416);
+ else if (_action.isAction(VERB_LOOK, NOUN_CORRIDOR_TO_EAST))
+ _vm->_dialogs->show(35417);
+ else if (_action.isAction(VERB_LOOK, NOUN_CORRIDOR_TO_WEST))
+ _vm->_dialogs->show(35418);
+ else if (_action.isAction(VERB_LOOK, NOUN_DEBRIS))
+ _vm->_dialogs->show(35419);
+ else if (_action.isAction(VERB_LOOK, NOUN_GUARD))
+ _vm->_dialogs->show(35420);
+ else
+ return;
+
+ _action._inProgress = false;
+}
+
+/*------------------------------------------------------------------------*/
+
+void Scene357::setup() {
+ setPlayerSpritesPrefix();
+ setAAName();
+}
+
+void Scene357::enter() {
+ _globals[kAfterHavoc] = true;
+ _globals._spriteIndexes[1] = _scene->_sprites.addSprites(Resources::formatName(307, 'X', 0, EXT_SS, ""));
+ _globals._sequenceIndexes[1] = _scene->_sequences.startCycle(_globals._spriteIndexes[1], false, 1);
+ _scene->_sequences.setPosition(_globals._sequenceIndexes[1], Common::Point(127, 78));
+ _scene->_sequences.setDepth(_globals._sequenceIndexes[1], 15);
+
+ if (_scene->_priorSceneId == 318)
+ _game._player._playerPos = Common::Point(298, 142);
+ else if (_scene->_priorSceneId == 313)
+ _game._player._playerPos = Common::Point(127, 101);
+ else if (_scene->_priorSceneId != -2)
+ _game._player._playerPos = Common::Point(15, 148);
+
+ sceneEntrySound();
+}
+
+void Scene357::preActions() {
+ if (_action.isAction(VERB_WALK_DOWN, NOUN_CORRIDOR_TO_EAST))
+ _game._player._walkOffScreenSceneId = 318;
+
+ if (_action.isAction(VERB_WALK_DOWN, NOUN_CORRIDOR_TO_WEST))
+ _game._player._walkOffScreenSceneId = 358;
+}
+
+void Scene357::actions() {
+ if (_action._lookFlag)
+ _vm->_dialogs->show(35715);
+ else if (_action.isAction(VERB_LOOK, NOUN_AIR_VENT))
+ _vm->_dialogs->show(35710);
+ else if (_action.isAction(VERB_CLIMB_INTO, NOUN_AIR_VENT))
+ _vm->_dialogs->show(35711);
+ else if (_action.isAction(VERB_LOOK, NOUN_BED))
+ _vm->_dialogs->show(35712);
+ else if (_action.isAction(VERB_LOOK, NOUN_SINK))
+ _vm->_dialogs->show(35713);
+ else if (_action.isAction(VERB_LOOK, NOUN_TOILET))
+ _vm->_dialogs->show(35714);
+ else if (_action.isAction(VERB_LOOK, NOUN_CELL_WALL))
+ _vm->_dialogs->show(35716);
+ else if (_action.isAction(VERB_LOOK, NOUN_LIGHT))
+ _vm->_dialogs->show(35717);
+ else if (_action.isAction(VERB_LOOK, NOUN_RIP_IN_FLOOR))
+ _vm->_dialogs->show(35718);
+ else if (_action.isAction(VERB_LOOK, NOUN_DEBRIS))
+ _vm->_dialogs->show(35719);
+ else if (_action.isAction(VERB_TAKE, NOUN_DEBRIS))
+ _vm->_dialogs->show(35720);
+ else if (_action.isAction(VERB_LOOK, NOUN_WALL))
+ _vm->_dialogs->show(35721);
+ else if (_action.isAction(VERB_LOOK, NOUN_CORRIDOR_TO_EAST))
+ _vm->_dialogs->show(35722);
+ else if (_action.isAction(VERB_LOOK, NOUN_CORRIDOR_TO_WEST))
+ _vm->_dialogs->show(35723);
+ else
+ return;
+
+ _action._inProgress = false;
+}
+
+/*------------------------------------------------------------------------*/
+
+void Scene358::setup() {
+ setPlayerSpritesPrefix();
+ setAAName();
+}
+
+void Scene358::enter() {
+ _globals._spriteIndexes[1] = _scene->_sprites.addSprites(Resources::formatName(307, 'X', 0, EXT_SS, ""));
+ _globals._sequenceIndexes[1] = _scene->_sequences.startCycle(_globals._spriteIndexes[1], false, 1);
+ _scene->_sequences.setPosition(_globals._sequenceIndexes[1], Common::Point(127, 78));
+ _scene->_sequences.setDepth(_globals._sequenceIndexes[1], 15);
+
+ if (_scene->_priorSceneId == 357)
+ _game._player._playerPos = Common::Point(305, 142);
+ else if (_scene->_priorSceneId != -2)
+ _game._player._playerPos = Common::Point(12, 141);
+
+ sceneEntrySound();
+}
+
+void Scene358::preActions() {
+ if (_action.isAction(VERB_WALK_DOWN, NOUN_CORRIDOR_TO_EAST))
+ _game._player._walkOffScreenSceneId = 357;
+
+ if (_action.isAction(VERB_WALK_DOWN, NOUN_CORRIDOR_TO_WEST))
+ _game._player._walkOffScreenSceneId = 359;
+}
+
+void Scene358::actions() {
+ if (_action._lookFlag)
+ _vm->_dialogs->show(35815);
+ else if (_action.isAction(VERB_LOOK, NOUN_CORRIDOR_TO_WEST))
+ _vm->_dialogs->show(35810);
+ else if (_action.isAction(VERB_LOOK, NOUN_CORRIDOR_TO_EAST))
+ _vm->_dialogs->show(35811);
+ else if (_action.isAction(VERB_LOOK, NOUN_BED))
+ _vm->_dialogs->show(35812);
+ else if (_action.isAction(VERB_LOOK, NOUN_SINK))
+ _vm->_dialogs->show(35813);
+ else if (_action.isAction(VERB_LOOK, NOUN_TOILET))
+ _vm->_dialogs->show(35814);
+ else if (_action.isAction(VERB_LOOK, NOUN_CORRIDOR) || _action.isAction(VERB_LOOK, NOUN_WALL))
+ _vm->_dialogs->show(35816);
+ else if (_action.isAction(VERB_LOOK, NOUN_AIR_VENT))
+ _vm->_dialogs->show(35817);
+ else
+ return;
+
+ _action._inProgress = false;
+}
+
+/*------------------------------------------------------------------------*/
+
+Scene359::Scene359(MADSEngine *vm) : Scene3xx(vm) {
+ _cardHotspotId = -1;
+}
+
+void Scene359::synchronize(Common::Serializer &s) {
+ Scene3xx::synchronize(s);
+
+ s.syncAsSint32LE(_cardHotspotId);
+}
+
+void Scene359::setup() {
+ setPlayerSpritesPrefix();
+ setAAName();
+ _scene->addActiveVocab(VERB_WALKTO);
+}
+
+void Scene359::enter() {
+ _globals._spriteIndexes[1] = _scene->_sprites.addSprites(formAnimName('b', -1));
+ _globals._spriteIndexes[3] = _scene->_sprites.addSprites(Resources::formatName(307, 'X', 0, EXT_SS, ""));
+
+ if (_globals[kSexOfRex] == REX_MALE)
+ _globals._spriteIndexes[2] = _scene->_sprites.addSprites("*RXMBD_2");
+ else
+ _globals._spriteIndexes[4] = _scene->_sprites.addSprites("*ROXBD_2");
+
+ _globals._sequenceIndexes[3] = _scene->_sequences.startCycle(_globals._spriteIndexes[3], false, 1);
+ _scene->_sequences.setPosition(_globals._sequenceIndexes[3], Common::Point(127, 78));
+ _scene->_sequences.setDepth(_globals._sequenceIndexes[3], 15);
+
+ if (_game._objects.isInRoom(OBJ_SECURITY_CARD)) {
+ _globals._sequenceIndexes[1] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[1], false, 9, 0, 0, 0);
+ _cardHotspotId = _scene->_dynamicHotspots.add(NOUN_SECURITY_CARD, VERB_WALKTO, _globals._sequenceIndexes[1], Common::Rect(0, 0, 0, 0));
+ _scene->_dynamicHotspots.setPosition(_cardHotspotId, Common::Point(107, 107), FACING_SOUTH);
+ }
+
+ if (_scene->_priorSceneId == 358)
+ _game._player._playerPos = Common::Point(301, 141);
+ else if (_scene->_priorSceneId != -2)
+ _game._player._playerPos = Common::Point(15, 148);
+
+ sceneEntrySound();
+}
+
+void Scene359::preActions() {
+ if (_action.isAction(VERB_WALK_DOWN, NOUN_CORRIDOR_TO_EAST))
+ _game._player._walkOffScreenSceneId = 358;
+
+ if (_action.isAction(VERB_WALK_DOWN, NOUN_CORRIDOR_TO_WEST))
+ _game._player._walkOffScreenSceneId = 360;
+}
+
+void Scene359::actions() {
+ if (_action._lookFlag) {
+ if ((_game._difficulty != DIFFICULTY_HARD) && (_game._objects[OBJ_SECURITY_CARD]._roomNumber == 359))
+ _vm->_dialogs->show(35914);
+ else
+ _vm->_dialogs->show(35915);
+ } else if (_action.isAction(VERB_TAKE, NOUN_SECURITY_CARD)) {
+ if (_game._trigger || !_game._objects.isInInventory(OBJ_SECURITY_CARD)) {
+ switch (_game._trigger) {
+ case 0:
+ _game._player._stepEnabled = false;
+ _game._player._visible = false;
+ _vm->_dialogs->show(35920);
+ if (_globals[kSexOfRex] == REX_MALE) {
+ _globals._sequenceIndexes[2] = _scene->_sequences.startReverseCycle(_globals._spriteIndexes[2], false, 4, 2, 0, 0);
+ _scene->_sequences.setMsgLayout(_globals._sequenceIndexes[2]);
+ _scene->_sequences.addSubEntry(_globals._sequenceIndexes[2], SEQUENCE_TRIGGER_SPRITE, 6, 1);
+ _scene->_sequences.addSubEntry(_globals._sequenceIndexes[2], SEQUENCE_TRIGGER_EXPIRE, 0, 2);
+ } else {
+ _globals._sequenceIndexes[4] = _scene->_sequences.startReverseCycle(_globals._spriteIndexes[4], true, 7, 2, 0, 0);
+ _scene->_sequences.setMsgLayout(_globals._sequenceIndexes[4]);
+ _scene->_sequences.setPosition(_globals._sequenceIndexes[4], Common::Point(106, 110));
+ _scene->_sequences.addSubEntry(_globals._sequenceIndexes[4], SEQUENCE_TRIGGER_SPRITE, 6, 1);
+ _scene->_sequences.addSubEntry(_globals._sequenceIndexes[4], SEQUENCE_TRIGGER_EXPIRE, 0, 2);
+ }
+ break;
+
+ case 1:
+ _scene->_sequences.remove(_globals._sequenceIndexes[1]);
+ _scene->_dynamicHotspots.remove(_cardHotspotId);
+ _vm->_sound->command(57);
+ _game._objects.addToInventory(OBJ_SECURITY_CARD);
+ _vm->_dialogs->showItem(OBJ_SECURITY_CARD, 0x330);
+ _scene->changeVariant(1);
+ break;
+
+ case 2:
+ if (_globals[kSexOfRex] == REX_MALE)
+ _scene->_sequences.updateTimeout(-1, _globals._sequenceIndexes[2]);
+ else
+ _scene->_sequences.updateTimeout(-1, _globals._sequenceIndexes[4]);
+
+ _game._player._visible = true;
+ _game._player._stepEnabled = true;
+ break;
+
+ default:
+ break;
+ }
+ }
+ } else if (_action.isAction(VERB_LOOK, NOUN_BLOODY_CELL_WALL))
+ _vm->_dialogs->show(35910);
+ else if (_action.isAction(VERB_LOOK, NOUN_BED))
+ _vm->_dialogs->show(35911);
+ else if (_action.isAction(VERB_LOOK, NOUN_SINK))
+ _vm->_dialogs->show(35912);
+ else if (_action.isAction(VERB_LOOK, NOUN_TOILET))
+ _vm->_dialogs->show(35913);
+ else if (_action.isAction(VERB_LOOK, NOUN_CORRIDOR_TO_EAST))
+ _vm->_dialogs->show(35916);
+ else if (_action.isAction(VERB_LOOK, NOUN_CORRIDOR_TO_WEST))
+ _vm->_dialogs->show(35917);
+ else if (_action.isAction(VERB_LOOK, NOUN_LIMB))
+ _vm->_dialogs->show(35918);
+ else if (_action.isAction(VERB_TAKE, NOUN_LIMB))
+ _vm->_dialogs->show(35919);
+ else if (_action.isAction(VERB_LOOK, NOUN_SECURITY_CARD) && (_action._mainObjectSource == 4))
+ _vm->_dialogs->show(35921);
+ else if (_action.isAction(VERB_LOOK, NOUN_BLOOD_STAIN)) {
+ if ((_game._difficulty != DIFFICULTY_HARD) && (_game._objects[OBJ_SECURITY_CARD]._roomNumber == 359))
+ _vm->_dialogs->show(35922);
+ else
+ _vm->_dialogs->show(35923);
+ } else if (_action.isAction(VERB_LOOK, NOUN_WALL_BOARD))
+ _vm->_dialogs->show(35924);
+ else if (_action.isAction(VERB_TAKE, NOUN_WALL_BOARD))
+ _vm->_dialogs->show(35925);
+ else if (_action.isAction(VERB_LOOK, NOUN_RIP_IN_FLOOR))
+ _vm->_dialogs->show(35926);
+ else if (_action.isAction(VERB_LOOK, NOUN_CORRIDOR))
+ _vm->_dialogs->show(35927);
+ else if (_action.isAction(VERB_LOOK, NOUN_FLOOR)) {
+ if ((_game._difficulty != DIFFICULTY_HARD) && (_game._objects[OBJ_SECURITY_CARD]._roomNumber == 359))
+ _vm->_dialogs->show(35928);
+ else
+ _vm->_dialogs->show(35929);
+ } else if (_action.isAction(VERB_OPEN, NOUN_AIR_VENT) || _action.isAction(VERB_LOOK, NOUN_AIR_VENT))
+ _vm->_dialogs->show(36016);
+ else
+ return;
+
+ _action._inProgress = false;
+}
+
+/*------------------------------------------------------------------------*/
+
+void Scene360::setup() {
+ setPlayerSpritesPrefix();
+ setAAName();
+}
+
+void Scene360::enter() {
+ _globals._spriteIndexes[1] = _scene->_sprites.addSprites(Resources::formatName(307, 'X', 0, EXT_SS, ""));
+ _globals._sequenceIndexes[1] = _scene->_sequences.startCycle(_globals._spriteIndexes[1], false, 1);
+ _scene->_sequences.setPosition(_globals._sequenceIndexes[1], Common::Point(127, 78));
+ _scene->_sequences.setDepth(_globals._sequenceIndexes[1], 15);
+
+ if (_scene->_priorSceneId == 359)
+ _game._player._playerPos = Common::Point(304, 143);
+ else if (_scene->_priorSceneId != -2)
+ _game._player._playerPos = Common::Point(13, 141);
+
+ sceneEntrySound();
+}
+
+void Scene360::preActions() {
+ if (_action.isAction(VERB_WALK_DOWN, NOUN_CORRIDOR_TO_EAST))
+ _game._player._walkOffScreenSceneId = 359;
+
+ if (_action.isAction(VERB_WALK_DOWN, NOUN_CORRIDOR_TO_WEST))
+ _game._player._walkOffScreenSceneId = 361;
+}
+
+void Scene360::actions() {
+ if (_action._lookFlag)
+ _vm->_dialogs->show(36015);
+ else if (_action.isAction(VERB_LOOK, NOUN_CORRIDOR_TO_WEST))
+ _vm->_dialogs->show(36010);
+ else if (_action.isAction(VERB_LOOK, NOUN_CORRIDOR_TO_EAST))
+ _vm->_dialogs->show(36011);
+ else if (_action.isAction(VERB_LOOK, NOUN_BED))
+ _vm->_dialogs->show(36012);
+ else if (_action.isAction(VERB_LOOK, NOUN_SINK))
+ _vm->_dialogs->show(36013);
+ else if (_action.isAction(VERB_LOOK, NOUN_TOILET))
+ _vm->_dialogs->show(36014);
+ else if (_action.isAction(VERB_LOOK, NOUN_AIR_VENT))
+ _vm->_dialogs->show(36016);
+ else if (_action.isAction(VERB_LOOK, NOUN_CORRIDOR))
+ _vm->_dialogs->show(36017);
+ else if (_action.isAction(VERB_LOOK, NOUN_WALL))
+ _vm->_dialogs->show(36018);
+ else
+ return;
+
+ _action._inProgress = false;
+}
+
+/*------------------------------------------------------------------------*/
+
+void Scene361::setup() {
+ if (_scene->_currentSceneId == 391)
+ _globals[kSexOfRex] = REX_MALE;
+
+ setPlayerSpritesPrefix();
+ setAAName();
+}
+
+void Scene361::handleRexAction() {
+ switch (_game._trigger) {
+ case 0:
+ _game._player._stepEnabled = false;
+ _game._player._visible = false;
+ _scene->_sequences.remove(_globals._sequenceIndexes[1]);
+ _globals._sequenceIndexes[1] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[1], false, 50, 1, 0, 0);
+ _scene->_sequences.setAnimRange(_globals._sequenceIndexes[1], 3, -2);
+ _scene->_sequences.setPosition(_globals._sequenceIndexes[1], Common::Point(165, 76));
+ _scene->_sequences.setDepth(_globals._sequenceIndexes[1], 15);
+
+ _globals._sequenceIndexes[2] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[2], false, 15, 1, 0, 0);
+ _scene->_sequences.setAnimRange(_globals._sequenceIndexes[2], -1, 4);
+ _scene->_sequences.setMsgLayout(_globals._sequenceIndexes[2]);
+ _scene->_sequences.addSubEntry(_globals._sequenceIndexes[1], SEQUENCE_TRIGGER_EXPIRE, 0, 1);
+ _scene->_sequences.addSubEntry(_globals._sequenceIndexes[2], SEQUENCE_TRIGGER_EXPIRE, 0, 2);
+ break;
+
+ case 1: {
+ int seqIdx = _globals._sequenceIndexes[1];
+ _globals._sequenceIndexes[1] = _scene->_sequences.startCycle(_globals._spriteIndexes[1], false, 4);
+ _scene->_sequences.setPosition(_globals._sequenceIndexes[1], Common::Point(165, 76));
+ _scene->_sequences.setDepth(_globals._sequenceIndexes[1], 15);
+ _scene->_sequences.updateTimeout(_globals._sequenceIndexes[1], seqIdx);
+ }
+ break;
+
+ case 2: {
+ int seqIdx = _globals._sequenceIndexes[2];
+ _globals._sequenceIndexes[2] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[2], false, 12, 1, 0, 0);
+ _scene->_sequences.setAnimRange(_globals._sequenceIndexes[2], 4, 10);
+ _scene->_sequences.setMsgLayout(_globals._sequenceIndexes[2]);
+ _scene->_sequences.updateTimeout(_globals._sequenceIndexes[2], seqIdx);
+ _scene->_sequences.addSubEntry(_globals._sequenceIndexes[2], SEQUENCE_TRIGGER_EXPIRE, 0, 3);
+ }
+ break;
+
+ case 3: {
+ _scene->_sequences.remove(_globals._sequenceIndexes[1]);
+ _globals._sequenceIndexes[1] = _scene->_sequences.startCycle(_globals._spriteIndexes[1], false, 3);
+ _scene->_sequences.setPosition(_globals._sequenceIndexes[1], Common::Point(165, 76));
+ _scene->_sequences.setDepth(_globals._sequenceIndexes[1], 1);
+
+ int seqIdx = _globals._sequenceIndexes[2];
+ _globals._sequenceIndexes[2] = _scene->_sequences.startCycle(_globals._spriteIndexes[2], false, 11);
+ _scene->_sequences.setMsgLayout(_globals._sequenceIndexes[2]);
+ _scene->_sequences.setPosition(_globals._sequenceIndexes[2], Common::Point(167, 100));
+ _scene->_sequences.updateTimeout(_globals._sequenceIndexes[2], seqIdx);
+ _scene->_sequences.addTimer(15, 4);
+ }
+ break;
+
+ case 4:
+ _scene->_sequences.remove(_globals._sequenceIndexes[1]);
+ _globals._sequenceIndexes[1] = _scene->_sequences.startCycle(_globals._spriteIndexes[1], false, 2);
+ _scene->_sequences.setPosition(_globals._sequenceIndexes[1], Common::Point(165, 76));
+ _scene->_sequences.setDepth(_globals._sequenceIndexes[1], 1);
+
+ _scene->_sequences.setDone(_globals._sequenceIndexes[2]);
+ _globals._sequenceIndexes[2] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[2], false, 12, 1, 0, 0);
+ _scene->_sequences.setAnimRange(_globals._sequenceIndexes[2], 12, 14);
+ _scene->_sequences.setMsgLayout(_globals._sequenceIndexes[2]);
+ _scene->_sequences.setPosition(_globals._sequenceIndexes[2], Common::Point(167, 100));
+ _scene->_sequences.addSubEntry(_globals._sequenceIndexes[2], SEQUENCE_TRIGGER_EXPIRE, 0, 5);
+ break;
+
+ case 5: {
+ int seqIdx = _globals._sequenceIndexes[2];
+ _globals._sequenceIndexes[2] = _scene->_sequences.startCycle(_globals._spriteIndexes[2], false, 15);
+ _scene->_sequences.setMsgLayout(_globals._sequenceIndexes[2]);
+ _scene->_sequences.setPosition(_globals._sequenceIndexes[2], Common::Point(167, 100));
+ _scene->_sequences.updateTimeout(_globals._sequenceIndexes[2], seqIdx);
+ _scene->_sequences.addTimer(15, 6);
+ }
+ break;
+
+ case 6:
+ _scene->_sequences.setDone(_globals._sequenceIndexes[2]);
+ _scene->_sequences.remove(_globals._sequenceIndexes[1]);
+ _globals._sequenceIndexes[1] = _scene->_sequences.startCycle(_globals._spriteIndexes[1], false, 1);
+ _scene->_sequences.setPosition(_globals._sequenceIndexes[1], Common::Point(165, 76));
+ _scene->_sequences.setDepth(_globals._sequenceIndexes[1], 1);
+ _scene->_sequences.addTimer(48, 7);
+ break;
+
+ case 7:
+ _scene->_nextSceneId = 313;
+ break;
+
+ default:
+ break;
+ }
+}
+
+void Scene361::handleRoxAction() {
+ switch (_game._trigger) {
+ case 0:
+ _game._player._stepEnabled = false;
+ _game._player._visible = false;
+ _scene->_sequences.remove(_globals._sequenceIndexes[1]);
+ _globals._sequenceIndexes[1] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[1], false, 18, 1, 0, 0);
+ _scene->_sequences.setAnimRange(_globals._sequenceIndexes[1], 2, 4);
+ _scene->_sequences.setPosition(_globals._sequenceIndexes[1], Common::Point(165, 76));
+ _scene->_sequences.setDepth(_globals._sequenceIndexes[1], 15);
+
+ _globals._sequenceIndexes[4] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[4], false, 18, 1, 0, 0);
+ _scene->_sequences.setAnimRange(_globals._sequenceIndexes[4], -1, 3);
+ _scene->_sequences.setMsgLayout(_globals._sequenceIndexes[4]);
+ _scene->_sequences.addSubEntry(_globals._sequenceIndexes[1], SEQUENCE_TRIGGER_EXPIRE, 0, 1);
+ _scene->_sequences.addSubEntry(_globals._sequenceIndexes[4], SEQUENCE_TRIGGER_EXPIRE, 0, 2);
+ break;
+
+ case 1: {
+ int tmpIdx = _globals._sequenceIndexes[1];
+ _globals._sequenceIndexes[1] = _scene->_sequences.startCycle(_globals._spriteIndexes[1], false, 4);
+ _scene->_sequences.setPosition(_globals._sequenceIndexes[1], Common::Point(165, 76));
+ _scene->_sequences.setDepth(_globals._sequenceIndexes[1], 15);
+ _scene->_sequences.updateTimeout(_globals._sequenceIndexes[1], tmpIdx);
+ }
+ break;
+
+ case 2: {
+ int tmpIdx = _globals._sequenceIndexes[4];
+ _globals._sequenceIndexes[4] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[4], false, 12, 1, 0, 0);
+ _scene->_sequences.setAnimRange(_globals._sequenceIndexes[4], 4, 8);
+ _scene->_sequences.setMsgLayout(_globals._sequenceIndexes[4]);
+ _scene->_sequences.updateTimeout(_globals._sequenceIndexes[4], tmpIdx);
+ _scene->_sequences.addSubEntry(_globals._sequenceIndexes[4], SEQUENCE_TRIGGER_EXPIRE, 0, 3);
+ }
+ break;
+
+ case 3: {
+ _scene->_sequences.remove(_globals._sequenceIndexes[1]);
+ _globals._sequenceIndexes[1] = _scene->_sequences.startCycle(_globals._spriteIndexes[1], false, 3);
+ _scene->_sequences.setPosition(_globals._sequenceIndexes[1], Common::Point(165, 76));
+ _scene->_sequences.setDepth(_globals._sequenceIndexes[1], 1);
+
+ int tmpIdx = _globals._sequenceIndexes[4];
+ _globals._sequenceIndexes[4] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[4], false, 12, 1, 0, 0);
+ _scene->_sequences.setAnimRange(_globals._sequenceIndexes[4], 9, 10);
+ _scene->_sequences.setMsgLayout(_globals._sequenceIndexes[4]);
+ _scene->_sequences.setPosition(_globals._sequenceIndexes[4], Common::Point(167, 100));
+ _scene->_sequences.updateTimeout(_globals._sequenceIndexes[4], tmpIdx);
+ _scene->_sequences.addSubEntry(_globals._sequenceIndexes[4], SEQUENCE_TRIGGER_EXPIRE, 0, 4);
+ }
+ break;
+
+ case 4: {
+ _scene->_sequences.remove(_globals._sequenceIndexes[1]);
+ _globals._sequenceIndexes[1] = _scene->_sequences.startCycle(_globals._spriteIndexes[1], false, 2);
+ _scene->_sequences.setPosition(_globals._sequenceIndexes[1], Common::Point(165, 76));
+ _scene->_sequences.setDepth(_globals._sequenceIndexes[1], 1);
+
+ int tmpIdx = _globals._sequenceIndexes[4];
+ _globals._sequenceIndexes[4] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[4], false, 12, 1, 0, 0);
+ _scene->_sequences.setAnimRange(_globals._sequenceIndexes[4], 11, 15);
+ _scene->_sequences.setMsgLayout(_globals._sequenceIndexes[4]);
+ _scene->_sequences.setPosition(_globals._sequenceIndexes[4], Common::Point(167, 100));
+ _scene->_sequences.updateTimeout(_globals._sequenceIndexes[4], tmpIdx);
+ _scene->_sequences.addSubEntry(_globals._sequenceIndexes[4], SEQUENCE_TRIGGER_EXPIRE, 0, 5);
+ }
+ break;
+
+ case 5: {
+ int tmpIdx = _globals._sequenceIndexes[4];
+ _globals._sequenceIndexes[4] = _scene->_sequences.startCycle(_globals._spriteIndexes[4], false, 16);
+ _scene->_sequences.setMsgLayout(_globals._sequenceIndexes[4]);
+ _scene->_sequences.setPosition(_globals._sequenceIndexes[4], Common::Point(167, 100));
+ _scene->_sequences.updateTimeout(_globals._sequenceIndexes[4], tmpIdx);
+ _scene->_sequences.addTimer(48, 6);
+ }
+ break;
+
+ case 6:
+ _scene->_sequences.setDone(_globals._sequenceIndexes[4]);
+
+ _scene->_sequences.remove(_globals._sequenceIndexes[1]);
+ _globals._sequenceIndexes[1] = _scene->_sequences.startCycle(_globals._spriteIndexes[1], false, 1);
+ _scene->_sequences.setPosition(_globals._sequenceIndexes[1], Common::Point(165, 76));
+ _scene->_sequences.setDepth(_globals._sequenceIndexes[1], 1);
+ _scene->_sequences.addTimer(48, 7);
+ break;
+
+ case 7:
+ _scene->_nextSceneId = 313;
+ break;
+
+ default:
+ break;
+ }
+}
+
+void Scene361::enter() {
+ _globals._spriteIndexes[1] = _scene->_sprites.addSprites(Resources::formatName(307, 'X', 0, EXT_SS, ""));
+
+ if (_globals[kSexOfRex] == REX_MALE) {
+ _globals._spriteIndexes[2] = _scene->_sprites.addSprites("*RXCL_8");
+ _globals._spriteIndexes[3] = _scene->_sprites.addSprites("*RXCL_2");
+ } else
+ _globals._spriteIndexes[4] = _scene->_sprites.addSprites("*ROXCL_8");
+
+ _globals._sequenceIndexes[1] = _scene->_sequences.startCycle(_globals._spriteIndexes[1], false, 1);
+ _scene->_sequences.setPosition(_globals._sequenceIndexes[1], Common::Point(165, 76));
+ _scene->_sequences.setDepth(_globals._sequenceIndexes[1], 15);
+
+ if (_scene->_priorSceneId == 391) {
+ _globals[kSexOfRex] = REX_MALE;
+ _game._player._stepEnabled = false;
+ _game._player._visible = false;
+ _game._player._facing = FACING_SOUTH;
+ _game._player._playerPos = Common::Point(166, 101);
+ _scene->_sequences.addTimer(120, 70);
+ } else if (_scene->_priorSceneId == 360)
+ _game._player._playerPos = Common::Point(302, 145);
+ else if (_scene->_priorSceneId == 320) {
+ _game._player._playerPos = Common::Point(129, 113);
+ _game._player._facing = FACING_SOUTH;
+ } else if (_scene->_priorSceneId != -2)
+ _game._player._playerPos = Common::Point(13, 145);
+
+ _game.loadQuoteSet(0xFB, 0xFC, 0);
+
+ if (_scene->_priorSceneId == 320)
+ _scene->_kernelMessages.setQuoted(_scene->_kernelMessages.addQuote(0xFB, 0, 0x78), 4, true);
+
+ sceneEntrySound();
+}
+
+void Scene361::step() {
+ if (_game._trigger >= 70) {
+ switch (_game._trigger) {
+ case 70:
+ _scene->_sequences.remove(_globals._sequenceIndexes[1]);
+ _globals._sequenceIndexes[1] = _scene->_sequences.startCycle(_globals._spriteIndexes[1], false, 2);
+ _scene->_sequences.setPosition(_globals._sequenceIndexes[1], Common::Point(165, 76));
+ _scene->_sequences.setDepth(_globals._sequenceIndexes[1], 1);
+
+ _globals._sequenceIndexes[3] = _scene->_sequences.startCycle(_globals._spriteIndexes[3], false, 1);
+ _scene->_sequences.setMsgLayout(_globals._sequenceIndexes[3]);
+ _scene->_sequences.addTimer(15, 71);
+ break;
+
+ case 71:
+ _scene->_sequences.setDone(_globals._sequenceIndexes[3]);
+ _globals._sequenceIndexes[3] = _scene->_sequences.startCycle(_globals._spriteIndexes[3], false, 2);
+ _scene->_sequences.setMsgLayout(_globals._sequenceIndexes[3]);
+ _scene->_sequences.addTimer(15, 72);
+ break;
+
+ case 72:
+ _scene->_sequences.remove(_globals._sequenceIndexes[1]);
+ _globals._sequenceIndexes[1] = _scene->_sequences.startCycle(_globals._spriteIndexes[1], false, 3);
+ _scene->_sequences.setPosition(_globals._sequenceIndexes[1], Common::Point(165, 76));
+ _scene->_sequences.setDepth(_globals._sequenceIndexes[1], 1);
+
+ _scene->_sequences.setDone(_globals._sequenceIndexes[3]);
+ _globals._sequenceIndexes[3] = _scene->_sequences.startCycle(_globals._spriteIndexes[3], false, 3);
+ _scene->_sequences.setMsgLayout(_globals._sequenceIndexes[3]);
+ _scene->_sequences.addTimer(15, 73);
+ break;
+
+ case 73:
+ _scene->_sequences.setDone(_globals._sequenceIndexes[3]);
+ _globals._sequenceIndexes[3] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[3], false, 12, 1, 0, 0);
+ _scene->_sequences.setAnimRange(_globals._sequenceIndexes[3], 4, 5);
+ _scene->_sequences.setMsgLayout(_globals._sequenceIndexes[3]);
+ _scene->_sequences.addSubEntry(_globals._sequenceIndexes[3], SEQUENCE_TRIGGER_EXPIRE, 0, 74);
+ break;
+
+ case 74: {
+ int seqIdx = _globals._sequenceIndexes[3];
+ _globals._sequenceIndexes[3] = _scene->_sequences.startCycle(_globals._spriteIndexes[3], false, 6);
+ _scene->_sequences.setMsgLayout(_globals._sequenceIndexes[3]);
+ _scene->_sequences.updateTimeout(_globals._sequenceIndexes[3], seqIdx);
+ _scene->_sequences.addTimer(15, 75);
+ }
+ break;
+
+ case 75:
+ _scene->_sequences.setDone(_globals._sequenceIndexes[3]);
+ _globals._sequenceIndexes[3] = _scene->_sequences.startCycle(_globals._spriteIndexes[3], false, 7);
+ _scene->_sequences.setMsgLayout(_globals._sequenceIndexes[3]);
+ _scene->_sequences.addTimer(15, 76);
+ break;
+
+ case 76:
+ _scene->_sequences.remove(_globals._sequenceIndexes[1]);
+ _globals._sequenceIndexes[1] = _scene->_sequences.startCycle(_globals._spriteIndexes[1], false, 2);
+ _scene->_sequences.setPosition(_globals._sequenceIndexes[1], Common::Point(165, 76));
+ _scene->_sequences.setDepth(_globals._sequenceIndexes[1], 1);
+
+ _scene->_sequences.setDone(_globals._sequenceIndexes[3]);
+ _globals._sequenceIndexes[3] = _scene->_sequences.startCycle(_globals._spriteIndexes[3], false, 8);
+ _scene->_sequences.setMsgLayout(_globals._sequenceIndexes[3]);
+ _scene->_sequences.addTimer(15, 77);
+ break;
+
+ case 77:
+ _scene->_sequences.remove(_globals._sequenceIndexes[1]);
+ _globals._sequenceIndexes[1] = _scene->_sequences.startCycle(_globals._spriteIndexes[1], false, 1);
+ _scene->_sequences.setPosition(_globals._sequenceIndexes[1], Common::Point(165, 76));
+ _scene->_sequences.setDepth(_globals._sequenceIndexes[1], 15);
+
+ _scene->_sequences.setDone(_globals._sequenceIndexes[3]);
+ _globals._sequenceIndexes[3] = _scene->_sequences.startCycle(_globals._spriteIndexes[3], false, 9);
+ _scene->_sequences.setMsgLayout(_globals._sequenceIndexes[3]);
+ _scene->_sequences.addTimer(15, 78);
+ break;
+
+ case 78:
+ _scene->_sequences.setDone(_globals._sequenceIndexes[3]);
+ _globals._sequenceIndexes[3] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[3], false, 12, 1, 0, 0);
+ _scene->_sequences.setAnimRange(_globals._sequenceIndexes[3], 10, -2);
+ _scene->_sequences.setMsgLayout(_globals._sequenceIndexes[3]);
+ _scene->_sequences.addSubEntry(_globals._sequenceIndexes[3], SEQUENCE_TRIGGER_EXPIRE, 0, 79);
+ break;
+
+ case 79:
+ _scene->_sequences.updateTimeout(-1, _globals._sequenceIndexes[3]);
+ _game._player._stepEnabled = true;
+ _game._player._visible = true;
+ break;
+
+ default:
+ break;
+ }
+ }
+}
+
+void Scene361::preActions() {
+ if (_action.isAction(VERB_WALK_DOWN, NOUN_CORRIDOR_TO_EAST))
+ _game._player._walkOffScreenSceneId = 360;
+
+ if (_action.isAction(VERB_WALK_DOWN, NOUN_CORRIDOR_TO_WEST))
+ _game._player._walkOffScreenSceneId = 354;
+}
+
+void Scene361::actions() {
+ if (_action._lookFlag)
+ _vm->_dialogs->show(36119);
+ else if (_action.isAction(VERB_SIT_AT, NOUN_DESK)) {
+ _scene->_kernelMessages.reset();
+ _scene->_kernelMessages.addQuote(0xFC, 120, 0);
+ } else if (_action.isAction(VERB_CLIMB_INTO, NOUN_AIR_VENT)) {
+ if (_globals[kSexOfRex] == REX_FEMALE)
+ handleRoxAction();
+ else
+ handleRexAction();
+ } else if (_action.isAction(VERB_LOOK, NOUN_DESK))
+ _vm->_dialogs->show(36110);
+ else if (_action.isAction(VERB_LOOK, NOUN_WALL))
+ _vm->_dialogs->show(36111);
+ else if (_action.isAction(VERB_LOOK, NOUN_LIGHTING_FIXTURE) || _action.isAction(VERB_STARE_AT, NOUN_LIGHTING_FIXTURE))
+ _vm->_dialogs->show(36112);
+ else if (_action.isAction(VERB_LOOK, NOUN_LIGHTS) || _action.isAction(VERB_STARE_AT, NOUN_LIGHTS))
+ _vm->_dialogs->show(36113);
+ else if (_action.isAction(VERB_TAKE, NOUN_LIGHTS))
+ _vm->_dialogs->show(36114);
+ else if (_action.isAction(VERB_LOOK, NOUN_LIGHT_BULB) || _action.isAction(VERB_STARE_AT, NOUN_LIGHT_BULB))
+ _vm->_dialogs->show(36115);
+ else if (_action.isAction(VERB_TAKE, NOUN_LIGHT_BULB))
+ _vm->_dialogs->show(36116);
+ else if (_action.isAction(VERB_LOOK, NOUN_CORRIDOR_TO_WEST))
+ _vm->_dialogs->show(36117);
+ else if (_action.isAction(VERB_LOOK, NOUN_CORRIDOR_TO_EAST))
+ _vm->_dialogs->show(36118);
+ else if (_action.isAction(VERB_LOOK, NOUN_AIR_VENT))
+ _vm->_dialogs->show(36120);
+ else
+ return;
+
+ _action._inProgress = false;
+}
+
+/*------------------------------------------------------------------------*/
+
+void Scene366::setup() {
+ setPlayerSpritesPrefix();
+ setAAName();
+}
+
+void Scene366::enter() {
+ _scene->_userInterface.setup(kInputLimitedSentences);
+ _game._player._visible = false;
+ sceneEntrySound();
+}
+
+void Scene366::actions() {
+ if (_action.isAction(VERB_RETURN_TO, NOUN_AIR_SHAFT))
+ _scene->_nextSceneId = 302;
+ else if (_action.isAction(VERB_OPEN, NOUN_GRATE)) {
+ if (_game._visitedScenes.exists(316))
+ _vm->_dialogs->show(36612);
+ else
+ _vm->_dialogs->show(36613);
+ _scene->_nextSceneId = 316;
+ } else if (_action.isAction(VERB_LOOK_THROUGH, NOUN_GRATE)) {
+ if (_game._visitedScenes.exists(321))
+ _vm->_dialogs->show(36611);
+ else
+ _vm->_dialogs->show(36610);
+ } else {
+ return;
+ }
+
+ _action._inProgress = false;
+}
+
+/*------------------------------------------------------------------------*/
+
+void Scene387::setup() {
+ setPlayerSpritesPrefix();
+ setAAName();
+}
+
+void Scene387::enter() {
+ _scene->_userInterface.setup(kInputLimitedSentences);
+ _game._player._visible = false;
+
+ sceneEntrySound();
+}
+
+void Scene387::actions() {
+ if (_action.isAction(VERB_RETURN_TO, NOUN_AIR_SHAFT))
+ _scene->_nextSceneId = 313;
+ else if (_action.isAction(VERB_LOOK_THROUGH, NOUN_GRATE))
+ _vm->_dialogs->show(38710);
+ else if (_action.isAction(VERB_OPEN, NOUN_GRATE))
+ _vm->_dialogs->show(38711);
+ else
+ return;
+
+ _action._inProgress = false;
+}
+
+/*------------------------------------------------------------------------*/
+
+void Scene388::setup() {
+ setPlayerSpritesPrefix();
+ setAAName();
+}
+
+void Scene388::enter() {
+ _scene->_userInterface.setup(kInputLimitedSentences);
+
+ if (_globals[kAfterHavoc])
+ _scene->_hotspots.activate(NOUN_SAUROPOD, false);
+ else {
+ _globals._spriteIndexes[0] = _scene->_sprites.addSprites(formAnimName('b', 0));
+ _globals._sequenceIndexes[0] = _scene->_sequences.startCycle(_globals._spriteIndexes[0], false, 1);
+ }
+
+ _game._player._visible = false;
+ _vm->_palette->setEntry(252, 63, 30, 20);
+ _vm->_palette->setEntry(253, 45, 15, 12);
+ _game.loadQuoteSet(0x154, 0x155, 0x156, 0x157, 0x158, 0);
+
+ sceneEntrySound();
+}
+
+void Scene388::actions() {
+ if (_action.isAction(VERB_RETURN_TO, NOUN_AIR_SHAFT))
+ _scene->_nextSceneId = 313;
+ else if (_action.isAction(VERB_TALKTO, NOUN_SAUROPOD)) {
+ switch (_game._trigger) {
+ case 0:
+ _game._player._stepEnabled = false;
+ _scene->_kernelMessages.reset();
+ _scene->_kernelMessages.add(Common::Point(160, 136), 0x1110, 32, 1, 120, _game.getQuote(0x154));
+ break;
+
+ case 1:
+ _scene->_kernelMessages.add(Common::Point(82, 38), 0xFDFC, 0, 0, 300, _game.getQuote(0x156));
+ _scene->_kernelMessages.add(Common::Point(82, 52), 0xFDFC, 0, 0, 300, _game.getQuote(0x157));
+ _scene->_kernelMessages.add(Common::Point(82, 66), 0xFDFC, 0, 2, 300, _game.getQuote(0x158));
+ break;
+
+ case 2:
+ _game._player._stepEnabled = true;
+ _scene->_kernelMessages.add(Common::Point(160, 136), 0x1110, 32, 0, 120, _game.getQuote(0x155));
+ break;
+
+ default:
+ break;
+ }
+ } else if (_action.isAction(VERB_LOOK_THROUGH, NOUN_GRATE)) {
+ if (_globals[kAfterHavoc])
+ _vm->_dialogs->show(38811);
+ else
+ _vm->_dialogs->show(38810);
+ } else if (_action.isAction(VERB_OPEN, NOUN_GRATE))
+ _vm->_dialogs->show(38812);
+ else
+ return;
+
+ _action._inProgress = false;
+}
+
+/*------------------------------------------------------------------------*/
+
+Scene389::Scene389(MADSEngine *vm) : Scene300s(vm) {
+ _monsterTime = 0;
+ _circularQuoteId = -1;
+}
+
+void Scene389::synchronize(Common::Serializer &s) {
+ Scene3xx::synchronize(s);
+
+ s.syncAsUint32LE(_monsterTime);
+ s.syncAsSint32LE(_circularQuoteId);
+}
+
+void Scene389::setup() {
+ setPlayerSpritesPrefix();
+ setAAName();
+}
+
+void Scene389::enter() {
+ _scene->_userInterface.setup(kInputLimitedSentences);
+ _monsterTime = 0;
+ _circularQuoteId = 0x159;
+
+ if (_globals[kAfterHavoc])
+ _scene->_hotspots.activate(NOUN_MONSTER, false);
+ else {
+ _globals._spriteIndexes[0] = _scene->_sprites.addSprites(formAnimName('m', -1));
+ _globals._sequenceIndexes[0] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[0], false, 6, 0, 0, 0);
+ _scene->_kernelMessages.initRandomMessages(1,
+ Common::Rect(88, 19, 177, 77), 13, 2, 0xFDFC, 60,
+ 247, 248, 249, 0);
+ }
+
+ _vm->_palette->setEntry(252, 63, 37, 26);
+ _vm->_palette->setEntry(253, 45, 24, 17);
+ _game._player._visible = false;
+ _game.loadQuoteSet(0xF7, 0xF8, 0xF9, 0x159, 0x15A, 0x15B, 0);
+
+ sceneEntrySound();
+}
+
+void Scene389::step() {
+ _scene->_kernelMessages.randomServer();
+ if (_scene->_frameStartTime >= _monsterTime) {
+ int chanceMinor = _scene->_kernelMessages.checkRandom() * 4 + 1;
+ _scene->_kernelMessages.generateRandom(20, chanceMinor);
+ _monsterTime = _scene->_frameStartTime + 2;
+ }
+}
+
+void Scene389::actions() {
+ if (_action.isAction(VERB_RETURN_TO, NOUN_AIR_SHAFT))
+ _scene->_nextSceneId = 313;
+ else if (_action.isAction(VERB_TALKTO, NOUN_MONSTER)) {
+ switch (_game._trigger) {
+ case 0:
+ _game._player._stepEnabled = false;
+ _scene->_kernelMessages.add(Common::Point(160, 136), 0x1110, 32, 1, 120, _game.getQuote(_circularQuoteId));
+ _circularQuoteId++;
+ if (_circularQuoteId > 0x15B)
+ _circularQuoteId = 0x159;
+
+ break;
+
+ case 1:
+ _game._player._stepEnabled = true;
+ break;
+
+ default:
+ break;
+ }
+ } else if (_action.isAction(VERB_LOOK_THROUGH, NOUN_GRATE)) {
+ if (_globals[kAfterHavoc]) {
+ if ((_game._difficulty != DIFFICULTY_HARD) && (_game._objects[OBJ_SECURITY_CARD]._roomNumber == 359))
+ _vm->_dialogs->show(38911);
+ else
+ _vm->_dialogs->show(38912);
+ } else
+ _vm->_dialogs->show(38910);
+ } else if (_action.isAction(VERB_OPEN, NOUN_GRATE)) {
+ if (_globals[kAfterHavoc])
+ _vm->_dialogs->show(38914);
+ else
+ _vm->_dialogs->show(38913);
+ } else
+ return;
+
+ _action._inProgress = false;
+}
+
+/*------------------------------------------------------------------------*/
+
+void Scene390::setup() {
+ setPlayerSpritesPrefix();
+ setAAName();
+}
+
+void Scene390::enter() {
+ _scene->_userInterface.setup(kInputLimitedSentences);
+ _game._player._visible = false;
+
+ sceneEntrySound();
+}
+
+void Scene390::actions() {
+ if (_action.isAction(VERB_RETURN_TO, NOUN_AIR_SHAFT))
+ _scene->_nextSceneId = 313;
+ else if (_action.isAction(VERB_LOOK_THROUGH, NOUN_GRATE))
+ _vm->_dialogs->show(39010);
+ else if (_action.isAction(VERB_OPEN, NOUN_GRATE))
+ _vm->_dialogs->show(39011);
+ else
+ return;
+
+ _action._inProgress = false;
+}
+
+/*------------------------------------------------------------------------*/
+
+void Scene391::setup() {
+ setPlayerSpritesPrefix();
+ setAAName();
+}
+
+void Scene391::enter() {
+ _scene->_userInterface.setup(kInputLimitedSentences);
+ _game._player._visible = false;
+ sceneEntrySound();
+}
+
+void Scene391::actions() {
+ if (_action.isAction(VERB_RETURN_TO, NOUN_AIR_SHAFT))
+ _scene->_nextSceneId = 313;
+ else if (_action.isAction(VERB_OPEN, NOUN_GRATE)) {
+ if (_globals[kKickedIn391Grate])
+ _vm->_dialogs->show(39113);
+ else {
+ _vm->_dialogs->show(39112);
+ _globals[kKickedIn391Grate] = true;
+ }
+
+ if (_globals[kAfterHavoc])
+ _scene->_nextSceneId = 361;
+ else
+ _scene->_nextSceneId = 311;
+ } else if (_action.isAction(VERB_LOOK_THROUGH, NOUN_GRATE)) {
+ if (_globals[kAfterHavoc])
+ _vm->_dialogs->show(39111);
+ else
+ _vm->_dialogs->show(39110);
+ } else
+ return;
+
+ _action._inProgress = false;
+}
+
+/*------------------------------------------------------------------------*/
+
+void Scene399::setup() {
+ setPlayerSpritesPrefix();
+ setAAName();
+}
+
+void Scene399::enter() {
+ _scene->_userInterface.setup(kInputLimitedSentences);
+ _game._player._visible = false;
+ sceneEntrySound();
+}
+
+void Scene399::actions() {
+ if (_action.isAction(VERB_RETURN_TO, NOUN_AIR_SHAFT))
+ _scene->_nextSceneId = 313;
+ else if (_action.isAction(VERB_LOOK_THROUGH, NOUN_GRATE)) {
+ if (_globals[kAfterHavoc]) {
+ if ((_game._difficulty != DIFFICULTY_HARD) && (_game._objects[OBJ_SECURITY_CARD]._roomNumber == 359))
+ _vm->_dialogs->show(38911);
+ else
+ _vm->_dialogs->show(38912);
+ } else
+ _vm->_dialogs->show(38910);
+ } else if (_action.isAction(VERB_OPEN, NOUN_GRATE)) {
+ if (_globals[kAfterHavoc])
+ _vm->_dialogs->show(38914);
+ else
+ _vm->_dialogs->show(38913);
+ } else
+ return;
+
+ _action._inProgress = false;
+}
+
+/*------------------------------------------------------------------------*/
+
+} // End of namespace Nebular
+} // End of namespace MADS
diff --git a/engines/mads/nebular/nebular_scenes3.h b/engines/mads/nebular/nebular_scenes3.h
new file mode 100644
index 0000000000..9efd38e9a4
--- /dev/null
+++ b/engines/mads/nebular/nebular_scenes3.h
@@ -0,0 +1,548 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+
+ * You should have received a copy of the GNU General Public 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 MADS_NEBULAR_SCENES3_H
+#define MADS_NEBULAR_SCENES3_H
+
+#include "common/scummsys.h"
+#include "mads/game.h"
+#include "mads/scene.h"
+#include "mads/nebular/nebular_scenes.h"
+
+namespace MADS {
+
+namespace Nebular {
+
+typedef struct {
+ bool _flag;
+ int _vertical;
+ int _horizontal;
+ int _seqId[40];
+ uint32 _timer;
+
+ void init() {
+ _flag = false;
+ _vertical = _horizontal = -1;
+ _timer = 0;
+ for (int i = 0; i < 40; ++i)
+ _seqId[i] = -1;
+ }
+
+ void synchronize(Common::Serializer &s) {
+ s.syncAsByte(_flag);
+ s.syncAsSint32LE(_vertical);
+ s.syncAsSint32LE(_horizontal);
+ for (int i = 0; i < 40; ++i)
+ s.syncAsSint32LE(_seqId[i]);
+ s.syncAsUint32LE(_timer);
+ };
+} ForceField;
+
+class Scene3xx : public NebularScene {
+protected:
+ /**
+ * Plays an appropriate sound when entering a scene
+ */
+ void setAAName();
+
+ /**
+ * Updates the prefix used for getting player sprites for the scene
+ */
+ void setPlayerSpritesPrefix();
+
+ void sceneEntrySound();
+
+ void initForceField(ForceField *force, bool flag);
+ void handleForceField(ForceField *force, int *sprites);
+ int computeScale(int low, int high, int id);
+
+public:
+ Scene3xx(MADSEngine *vm) : NebularScene(vm) {}
+
+ virtual void actions() {}
+};
+
+class Scene300s : public Scene3xx {
+public:
+ Scene300s(MADSEngine *vm) : Scene3xx(vm) {}
+
+ virtual void preActions();
+};
+
+class Scene301 : public Scene3xx {
+public:
+ Scene301(MADSEngine *vm) : Scene3xx(vm) {}
+
+ virtual void setup();
+ virtual void enter();
+ virtual void step();
+};
+
+class Scene302 : public Scene3xx {
+private:
+ int _oldFrame;
+
+public:
+ Scene302(MADSEngine *vm);
+ virtual void synchronize(Common::Serializer &s);
+
+ virtual void setup();
+ virtual void enter();
+ virtual void step();
+};
+
+class Scene303 : public Scene3xx {
+public:
+ Scene303(MADSEngine *vm) : Scene3xx(vm) {}
+
+ virtual void setup();
+ virtual void enter();
+ virtual void step();
+};
+
+class Scene304 : public Scene3xx {
+private:
+ int _explosionSpriteId;
+
+public:
+ Scene304(MADSEngine *vm);
+ virtual void synchronize(Common::Serializer &s);
+
+ virtual void setup();
+ virtual void enter();
+ virtual void step();
+};
+
+class Scene307 : public Scene3xx {
+private:
+ ForceField _forceField;
+
+ bool _afterPeeingFl;
+ bool _duringPeeingFl;
+ bool _grateOpenedFl;
+ bool _activePrisonerFl;
+
+ int _animationMode;
+ int _prisonerMessageId;
+ int _fieldCollisionCounter;
+
+ uint32 _lastFrameTime;
+ uint32 _guardTime;
+ uint32 _prisonerTimer;
+
+ Common::String _subQuote2;
+
+ Conversation _dialog1, _dialog2;
+
+ void handleDialog();
+ void handleRexDialog(int quote);
+ void handlePrisonerDialog();
+ void handlePrisonerEncounter();
+ void setDialogNode(int node);
+ void handlePrisonerSpeech(int firstQuoteId, int number, long timeout);
+
+public:
+ Scene307(MADSEngine *vm);
+ virtual void synchronize(Common::Serializer &s);
+
+ virtual void setup();
+ virtual void enter();
+ virtual void step();
+ virtual void actions();
+};
+
+class Scene308 : public Scene3xx {
+private:
+ ForceField _forceField;
+
+public:
+ Scene308(MADSEngine *vm);
+ virtual void synchronize(Common::Serializer &s);
+
+ virtual void setup();
+ virtual void enter();
+ virtual void step();
+};
+
+class Scene309 : public Scene3xx {
+private:
+ ForceField _forceField;
+ int _characterSpriteIndexes[3];
+ int _messagesIndexes[3];
+ int _lastFrame;
+
+public:
+ Scene309(MADSEngine *vm);
+ virtual void synchronize(Common::Serializer &s);
+
+ virtual void setup();
+ virtual void enter();
+ virtual void step();
+};
+
+class Scene310 : public Scene3xx {
+private:
+ ForceField _forceField;
+
+public:
+ Scene310(MADSEngine *vm);
+ virtual void synchronize(Common::Serializer &s);
+
+ virtual void setup();
+ virtual void enter();
+ virtual void step();
+};
+
+class Scene311 : public Scene3xx {
+private:
+ bool _checkGuardFl;
+
+public:
+ Scene311(MADSEngine *vm);
+ virtual void synchronize(Common::Serializer &s);
+
+ virtual void setup();
+ virtual void enter();
+ virtual void step();
+ virtual void actions();
+};
+
+class Scene313 : public Scene3xx {
+public:
+ Scene313(MADSEngine *vm) : Scene3xx(vm) {}
+
+ virtual void setup();
+ virtual void enter();
+ virtual void actions();
+};
+
+class Scene316 : public Scene3xx {
+private:
+ void handleRexInGrate();
+ void handleRoxInGrate();
+
+public:
+ Scene316(MADSEngine *vm) : Scene3xx(vm) {}
+
+ virtual void setup();
+ virtual void enter();
+ virtual void step();
+ virtual void preActions();
+ virtual void actions();
+};
+
+class Scene318 : public Scene3xx {
+private:
+ uint32 _dropTimer;
+
+ int _lastFrame;
+ int _animMode;
+ int _internCounter;
+ int _counter;
+
+ bool _dialogFl;
+ bool _internTalkingFl;
+ bool _internWalkingFl;
+ bool _internVisibleFl;
+ bool _explosionFl;
+
+ uint32 _lastFrameCounter;
+
+ Common::String _subQuote2;
+
+ Conversation _dialog1;
+
+ void handleDialog();
+ void handleRexDialogs(int quote);
+ void handleInternDialog(int quoteId, int quoteNum, uint32 timeout);
+
+public:
+ Scene318(MADSEngine *vm);
+ virtual void synchronize(Common::Serializer &s);
+
+ virtual void setup();
+ virtual void enter();
+ virtual void step();
+ virtual void preActions();
+ virtual void actions();
+};
+
+class Scene319 : public Scene3xx {
+private:
+ Conversation _dialog1, _dialog2, _dialog3;
+
+ int _animMode, _animFrame;
+ int _nextAction1, _nextAction2;
+ int _slacheMode;
+ int _slacheTopic;
+ int _slachePosY;
+
+ bool _slacheTalkingFl;
+ bool _slacheReady;
+ bool _slacheInitFl;
+
+ Common::String _subQuote2;
+
+ void handleRexDialogues(int quote);
+ void handleSlacheDialogs(int quoteId, int counter, uint32 timer);
+public:
+ Scene319(MADSEngine *vm);
+ virtual void synchronize(Common::Serializer &s);
+
+ virtual void setup();
+ virtual void enter();
+ virtual void step();
+ virtual void actions();
+};
+
+class Scene320 : public Scene300s {
+private:
+ void setRightView(int view);
+ void setLeftView(int view);
+ void handleButtons();
+
+ bool _blinkFl;
+ bool _flippedFl;
+
+ int _buttonId;
+ int _lastFrame;
+ int _leftItemId;
+ int _posX;
+ int _rightItemId;
+
+public:
+ Scene320(MADSEngine *vm);
+ virtual void synchronize(Common::Serializer &s);
+
+ virtual void setup();
+ virtual void enter();
+ virtual void step();
+ virtual void actions();
+};
+
+class Scene321 : public Scene3xx {
+public:
+ Scene321(MADSEngine *vm) : Scene3xx(vm) {}
+
+ virtual void setup();
+ virtual void enter();
+ virtual void step();
+};
+
+class Scene322 : public SceneTeleporter {
+public:
+ Scene322(MADSEngine *vm) : SceneTeleporter(vm) {}
+
+ virtual void setup();
+ virtual void enter();
+ virtual void step();
+ virtual void actions();
+};
+
+class Scene351 : public Scene3xx {
+public:
+ Scene351(MADSEngine *vm) : Scene3xx(vm) {}
+
+ virtual void setup();
+ virtual void enter();
+ virtual void step();
+ virtual void actions();
+};
+
+class Scene352 : public Scene3xx {
+private:
+ bool _vaultOpenFl;
+ bool _mustPutArmDownFl;
+ bool _leaveRoomFl;
+
+ int _tapePlayerHotspotIdx;
+ int _hotspot1Idx;
+ int _hotspot2Idx;
+ int _lampHostpotIdx;
+ int _commonSequenceIdx;
+ int _commonSpriteIndex;
+
+ void putArmDown(bool corridorExit, bool doorwayExit);
+
+public:
+ Scene352(MADSEngine *vm);
+ virtual void synchronize(Common::Serializer &s);
+
+ virtual void setup();
+ virtual void enter();
+ virtual void preActions();
+ virtual void actions();
+};
+
+class Scene353 : public Scene3xx {
+public:
+ Scene353(MADSEngine *vm) : Scene3xx(vm) {}
+
+ virtual void setup();
+ virtual void enter();
+ virtual void actions();
+};
+
+class Scene354 : public Scene3xx {
+public:
+ Scene354(MADSEngine *vm) : Scene3xx(vm) {}
+
+ virtual void setup();
+ virtual void enter();
+ virtual void preActions();
+ virtual void actions();
+};
+
+class Scene357 : public Scene3xx {
+public:
+ Scene357(MADSEngine *vm) : Scene3xx(vm) {}
+
+ virtual void setup();
+ virtual void enter();
+ virtual void preActions();
+ virtual void actions();
+};
+
+class Scene358 : public Scene3xx {
+public:
+ Scene358(MADSEngine *vm) : Scene3xx(vm) {}
+
+ virtual void setup();
+ virtual void enter();
+ virtual void preActions();
+ virtual void actions();
+};
+
+class Scene359 : public Scene3xx {
+private:
+ int _cardHotspotId;
+
+public:
+ Scene359(MADSEngine *vm);
+ virtual void synchronize(Common::Serializer &s);
+
+ virtual void setup();
+ virtual void enter();
+ virtual void preActions();
+ virtual void actions();
+};
+
+class Scene360 : public Scene3xx {
+public:
+ Scene360(MADSEngine *vm) : Scene3xx(vm) {}
+
+ virtual void setup();
+ virtual void enter();
+ virtual void preActions();
+ virtual void actions();
+};
+
+class Scene361 : public Scene3xx {
+private:
+ void handleRexAction();
+ void handleRoxAction();
+
+public:
+ Scene361(MADSEngine *vm) : Scene3xx(vm) {}
+
+ virtual void setup();
+ virtual void enter();
+ virtual void step();
+ virtual void preActions();
+ virtual void actions();
+};
+
+class Scene366 : public Scene300s {
+public:
+ Scene366(MADSEngine *vm) : Scene300s(vm) {}
+
+ virtual void setup();
+ virtual void enter();
+ virtual void actions();
+};
+
+class Scene387 : public Scene300s {
+public:
+ Scene387(MADSEngine *vm) : Scene300s(vm) {}
+
+ virtual void setup();
+ virtual void enter();
+ virtual void actions();
+};
+
+class Scene388 : public Scene300s {
+public:
+ Scene388(MADSEngine *vm) : Scene300s(vm) {}
+
+ virtual void setup();
+ virtual void enter();
+ virtual void actions();
+};
+
+class Scene389 : public Scene300s {
+private:
+ uint32 _monsterTime;
+
+ int _circularQuoteId;
+
+public:
+ Scene389(MADSEngine *vm);
+ virtual void synchronize(Common::Serializer &s);
+
+ virtual void setup();
+ virtual void enter();
+ virtual void step();
+ virtual void actions();
+};
+
+class Scene390 : public Scene300s {
+public:
+ Scene390(MADSEngine *vm) : Scene300s(vm) {}
+
+ virtual void setup();
+ virtual void enter();
+ virtual void actions();
+};
+
+class Scene391 : public Scene300s {
+public:
+ Scene391(MADSEngine *vm) : Scene300s(vm) {}
+
+ virtual void setup();
+ virtual void enter();
+ virtual void actions();
+};
+
+class Scene399 : public Scene300s {
+public:
+ Scene399(MADSEngine *vm) : Scene300s(vm) {}
+
+ virtual void setup();
+ virtual void enter();
+ virtual void actions();
+};
+
+} // End of namespace Nebular
+
+} // End of namespace MADS
+
+#endif /* MADS_NEBULAR_SCENES3_H */
diff --git a/engines/mads/nebular/nebular_scenes4.cpp b/engines/mads/nebular/nebular_scenes4.cpp
new file mode 100644
index 0000000000..56f6fb4466
--- /dev/null
+++ b/engines/mads/nebular/nebular_scenes4.cpp
@@ -0,0 +1,4194 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+
+ * You should have received a copy of the GNU General Public 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 "mads/mads.h"
+#include "mads/scene.h"
+#include "mads/nebular/nebular_scenes.h"
+#include "mads/nebular/nebular_scenes4.h"
+
+namespace MADS {
+
+namespace Nebular {
+
+void Scene4xx::setAAName() {
+ _game._aaName = Resources::formatAAName(4);
+}
+
+void Scene4xx::setPlayerSpritesPrefix() {
+ _vm->_sound->command(5);
+ Common::String oldName = _game._player._spritesPrefix;
+
+ if ((_scene->_nextSceneId == 403) || (_scene->_nextSceneId == 409))
+ _game._player._spritesPrefix = "";
+ else if (_globals[kSexOfRex] == REX_FEMALE)
+ _game._player._spritesPrefix = "ROX";
+ else
+ _game._player._spritesPrefix = "RXM";
+
+ _game._player._scalingVelocity = true;
+
+ if (oldName != _game._player._spritesPrefix)
+ _game._player._spritesChanged = true;
+
+ _vm->_palette->setEntry(16, 10, 63, 63);
+ _vm->_palette->setEntry(17, 10, 45, 45);
+}
+
+void Scene4xx::sceneEntrySound() {
+ if (!_vm->_musicFlag) {
+ _vm->_sound->command(2);
+ return;
+ }
+
+ switch (_scene->_nextSceneId) {
+ case 401:
+ _vm->_sound->startQueuedCommands();
+ if (_scene->_priorSceneId == 402)
+ _vm->_sound->command(12, 64);
+ else
+ _vm->_sound->command(12, 1);
+ break;
+
+ case 402:
+ _vm->_sound->startQueuedCommands();
+ _vm->_sound->command(12, 127);
+ break;
+
+ case 405:
+ case 407:
+ case 409:
+ case 410:
+ case 413:
+ _vm->_sound->command(10);
+ break;
+
+ case 408:
+ _vm->_sound->command(52);
+ break;
+
+ default:
+ break;
+ }
+}
+
+/*------------------------------------------------------------------------*/
+
+Scene401::Scene401(MADSEngine *vm) : Scene4xx(vm), _destPos(0, 0) {
+ _northFl = false;
+ _timer = 0;
+}
+
+void Scene401::synchronize(Common::Serializer &s) {
+ Scene4xx::synchronize(s);
+
+ s.syncAsByte(_northFl);
+ s.syncAsSint16LE(_destPos.x);
+ s.syncAsSint16LE(_destPos.y);
+ s.syncAsUint32LE(_timer);
+}
+
+void Scene401::setup() {
+ setPlayerSpritesPrefix();
+ setAAName();
+}
+
+void Scene401::enter() {
+ if (_scene->_priorSceneId != -2)
+ _northFl = false;
+
+ _timer = 0;
+
+ if (_scene->_priorSceneId == 402) {
+ _game._player._playerPos = Common::Point(203, 115);
+ _game._player._facing = FACING_WEST;
+ } else if (_scene->_priorSceneId == 354) {
+ _game._player._playerPos = Common::Point(149, 90);
+ _game._player._facing = FACING_SOUTH;
+ _northFl = true;
+ } else if (_scene->_priorSceneId != -2) {
+ _game._player._playerPos = Common::Point(142, 131);
+ _game._player._facing = FACING_NORTH;
+ }
+
+ _game.loadQuoteSet(0x1D4, 0);
+ sceneEntrySound();
+}
+
+void Scene401::step() {
+ if (_game._trigger == 70) {
+ _scene->_nextSceneId = 354;
+ _scene->_reloadSceneFlag = true;
+ }
+
+ if (_game._trigger == 80) {
+ _game._player._priorTimer = _scene->_frameStartTime - _game._player._ticksAmount;
+ _game._player._stepEnabled = true;
+ _game._player._visible = true;
+ _northFl = false;
+ _game._player.walk(Common::Point(149, 110), FACING_SOUTH);
+ }
+
+ if (_scene->_frameStartTime >= _timer) {
+ int dist = 64 - ((_vm->hypotenuse(_game._player._playerPos.x - 219, _game._player._playerPos.y - 115) * 64) / 120);
+
+ if (dist > 64)
+ dist = 64;
+ else if (dist < 1)
+ dist = 1;
+
+ _vm->_sound->command(12, dist);
+ _timer = _scene->_frameStartTime + _game._player._ticksAmount;
+ }
+
+}
+
+void Scene401::preActions() {
+ if (_action.isAction(VERB_WALK_DOWN, NOUN_CORRIDOR_TO_NORTH)) {
+ _game._player.walk(Common::Point(149, 89), FACING_NORTH);
+ _northFl = false;
+ }
+
+ if (_action.isAction(VERB_WALK_DOWN, NOUN_CORRIDOR_TO_SOUTH) && !_northFl)
+ _game._player._walkOffScreenSceneId = 405;
+
+ if (_action.isAction(VERB_TAKE))
+ _game._player._needToWalk = false;
+
+ if (_game._player._needToWalk && _northFl) {
+ if (_globals[kSexOfRex] == REX_MALE)
+ _destPos = Common::Point(148, 94);
+ else
+ _destPos = Common::Point(149, 99);
+
+ _game._player.walk(_destPos, FACING_SOUTH);
+ }
+}
+
+void Scene401::actions() {
+ if ((_game._player._playerPos == _destPos) && _northFl) {
+ if (_globals[kSexOfRex] == REX_MALE) {
+ _game._triggerSetupMode = SEQUENCE_TRIGGER_DAEMON;
+ _game._player._stepEnabled = false;
+ _game._player._visible = false;
+ _vm->_sound->command(21);
+ _scene->loadAnimation(formAnimName('s', 1), 70);
+ _globals[kHasBeenScanned] = true;
+ _vm->_sound->command(22);
+ int idx = _scene->_kernelMessages.add(Common::Point(153, 46), 0x1110, 32, 0, 60, _game.getQuote(0x1D4));
+ _scene->_kernelMessages.setQuoted(idx, 4, true);
+ }
+
+ if (_globals[kSexOfRex] == REX_FEMALE) {
+ _game._triggerSetupMode = SEQUENCE_TRIGGER_DAEMON;
+ _game._player._stepEnabled = false;
+ _game._player._visible = false;
+ _vm->_sound->command(21);
+ _scene->loadAnimation(formAnimName('s', 2), 80);
+ _vm->_sound->command(23);
+ _globals[kHasBeenScanned] = true;
+ }
+ }
+
+ if (_action.isAction(VERB_WALK_INTO, NOUN_BAR)) {
+ if (!_northFl)
+ _scene->_nextSceneId = 402;
+ } else if (_action.isAction(VERB_WALK_DOWN, NOUN_CORRIDOR_TO_NORTH))
+ _scene->_nextSceneId = 354;
+ else if (_action.isAction(VERB_LOOK, NOUN_SCANNER)) {
+ if (_globals[kHasBeenScanned])
+ _vm->_dialogs->show(40111);
+ else
+ _vm->_dialogs->show(40110);
+ } else if (_action.isAction(VERB_LOOK, NOUN_BAR))
+ _vm->_dialogs->show(40112);
+ else if (_action.isAction(VERB_LOOK, NOUN_SIGN))
+ _vm->_dialogs->show(40113);
+ else if (_action.isAction(VERB_LOOK, NOUN_CORRIDOR_TO_SOUTH))
+ _vm->_dialogs->show(40114);
+ else if (_action.isAction(VERB_LOOK, NOUN_CORRIDOR_TO_NORTH))
+ _vm->_dialogs->show(40115);
+ else if (_action._lookFlag)
+ _vm->_dialogs->show(40116);
+ else
+ return;
+
+ _action._inProgress = false;
+}
+
+/*------------------------------------------------------------------------*/
+
+Scene402::Scene402(MADSEngine *vm) : Scene4xx(vm) {
+ _lightOn = false;
+ _blowingSmoke = false;
+ _leftWomanMoving = false;
+ _rightWomanMoving = false;
+ _firstTalkToGirlInChair = false;
+ _waitingGinnyMove = false;
+ _ginnyLooking = false;
+ _bigBeatFl = false;
+ _roxOnStool = false;
+ _bartenderSteady = false;
+ _bartenderHandsHips = false;
+ _bartenderLooksLeft = false;
+ _bartenderReady = false;
+ _bartenderTalking = false;
+ _bartenderCalled = false;
+ _conversationFl = false;
+ _activeTeleporter = false;
+ _activeArrows = false;
+ _activeArrow1 = false;
+ _activeArrow2 = false;
+ _activeArrow3 = false;
+ _cutSceneReady = false;
+ _cutSceneNeeded = false;
+ _helgaReady = false;
+ _refuseAlienLiquor = false;
+
+ _drinkTimer = -1;
+ _beatCounter = -1;
+ _bartenderMode = -1;
+ _bartenderDialogNode = -1;
+ _bartenderCurrentQuestion = -1;
+ _helgaTalkMode = -1;
+ _roxMode = -1;
+ _rexMode = -1;
+ _talkTimer = -1;
+}
+
+void Scene402::synchronize(Common::Serializer &s) {
+ Scene4xx::synchronize(s);
+
+ s.syncAsByte(_lightOn);
+ s.syncAsByte(_blowingSmoke);
+ s.syncAsByte(_leftWomanMoving);
+ s.syncAsByte(_rightWomanMoving);
+ s.syncAsByte(_firstTalkToGirlInChair);
+ s.syncAsByte(_waitingGinnyMove);
+ s.syncAsByte(_ginnyLooking);
+ s.syncAsByte(_bigBeatFl);
+ s.syncAsByte(_roxOnStool);
+ s.syncAsByte(_bartenderSteady);
+ s.syncAsByte(_bartenderHandsHips);
+ s.syncAsByte(_bartenderLooksLeft);
+ s.syncAsByte(_bartenderReady);
+ s.syncAsByte(_bartenderTalking);
+ s.syncAsByte(_bartenderCalled);
+ s.syncAsByte(_conversationFl);
+ s.syncAsByte(_activeTeleporter);
+ s.syncAsByte(_activeArrows);
+ s.syncAsByte(_activeArrow1);
+ s.syncAsByte(_activeArrow2);
+ s.syncAsByte(_activeArrow3);
+ s.syncAsByte(_cutSceneReady);
+ s.syncAsByte(_cutSceneNeeded);
+ s.syncAsByte(_helgaReady);
+ s.syncAsByte(_refuseAlienLiquor);
+
+ s.syncAsSint16LE(_drinkTimer);
+ s.syncAsSint16LE(_beatCounter);
+ s.syncAsSint16LE(_bartenderMode);
+ s.syncAsSint16LE(_bartenderDialogNode);
+ s.syncAsSint16LE(_bartenderCurrentQuestion);
+ s.syncAsSint16LE(_helgaTalkMode);
+ s.syncAsSint16LE(_roxMode);
+ s.syncAsSint16LE(_rexMode);
+ s.syncAsSint16LE(_talkTimer);
+}
+
+void Scene402::setup() {
+ setPlayerSpritesPrefix();
+ setAAName();
+
+ _scene->addActiveVocab(NOUN_BARTENDER);
+ _scene->addActiveVocab(NOUN_ALIEN_LIQUOR);
+ _scene->addActiveVocab(VERB_DRINK);
+ _scene->addActiveVocab(NOUN_BINOCULARS);
+ _scene->addActiveVocab(VERB_WALKTO);
+ _scene->addActiveVocab(NOUN_CREDIT_CHIP);
+ _scene->addActiveVocab(VERB_TAKE);
+ _scene->addActiveVocab(NOUN_REPAIR_LIST);
+ _scene->addActiveVocab(VERB_LOOK_AT);
+}
+
+void Scene402::setDialogNode(int node) {
+ if (node > 0)
+ _bartenderDialogNode = node;
+
+ _game._player._stepEnabled = true;
+
+ switch (node) {
+ case 0:
+ _scene->_userInterface.setup(kInputBuildingSentences);
+ _conversationFl = false;
+ _bartenderDialogNode = 0;
+ break;
+
+ case 1:
+ _dialog1.start();
+ _bartenderDialogNode = 1;
+ break;
+
+ case 2:
+ _dialog2.start();
+ _bartenderDialogNode = 2;
+ break;
+
+ case 3:
+ _dialog3.start();
+ _bartenderDialogNode = 3;
+ break;
+
+ case 4:
+ _dialog4.start();
+ _bartenderDialogNode = 4;
+ break;
+
+ default:
+ break;
+ }
+}
+
+void Scene402::handleConversation1() {
+ switch (_action._activeAction._verbId) {
+ case 0x214: {
+ int quoteId = 0;
+ int quotePosX = 0;
+ switch (_vm->getRandomNumber(1, 3)) {
+ case 1:
+ quoteId = 0x1E4;
+ _bartenderCurrentQuestion = 4;
+ quotePosX = 205;
+ break;
+
+ case 2:
+ quoteId = 0x1E5;
+ _bartenderCurrentQuestion = 5;
+ quotePosX = 203;
+ break;
+
+ case 3:
+ quoteId = 0x1E6;
+ _bartenderCurrentQuestion = 6;
+ quotePosX = 260;
+ break;
+
+ default:
+ break;
+ }
+ _scene->_kernelMessages.reset();
+ _scene->_kernelMessages.add(Common::Point(quotePosX, 41), 0xFDFC, 0, 0, 9999999, _game.getQuote(quoteId));
+ _game._triggerSetupMode = SEQUENCE_TRIGGER_DAEMON;
+ _scene->_sequences.addTimer(1, 100);
+ _talkTimer = 120;
+ setDialogNode(2);
+ }
+ break;
+
+ case 0x215:
+ _scene->_kernelMessages.reset();
+ _scene->_kernelMessages.add(Common::Point(260, 41), 0xFDFC, 0, 0, 9999999, _game.getQuote(0x1EC));
+ _game._triggerSetupMode = SEQUENCE_TRIGGER_DAEMON;
+ _scene->_sequences.addTimer(1, 100);
+ _talkTimer = 120;
+ _bartenderCurrentQuestion = 1;
+ setDialogNode(3);
+ break;
+
+ case 0x237:
+ _scene->_kernelMessages.reset();
+ _scene->_kernelMessages.add(Common::Point(208, 41), 0xFDFC, 0, 0, 100, _game.getQuote(0x1FD));
+ setDialogNode(0);
+ _game._triggerSetupMode = SEQUENCE_TRIGGER_DAEMON;
+ _scene->_sequences.addTimer(1, 100);
+ _talkTimer = 1120;
+ break;
+
+ default:
+ break;
+ }
+}
+
+void Scene402::handleConversation2() {
+ switch (_action._activeAction._verbId) {
+ case 0x216:
+ _dialog2.write(0x216, false);
+ _dialog2.write(0x21D, true);
+ break;
+
+ case 0x219:
+ _dialog2.write(0x219, false);
+ _dialog2.write(0x220, true);
+ break;
+
+ case 0x21A:
+ _dialog2.write(0x21A, false);
+ _dialog2.write(0x223, true);
+ break;
+
+ case 0x21B:
+ _dialog2.write(0x21B, false);
+ _dialog2.write(0x224, true);
+ break;
+
+ case 0x21D:
+ _dialog2.write(0x21D, false);
+ _dialog2.write(0x227, true);
+ break;
+
+ case 0x220:
+ _dialog2.write(0x220, false);
+ _dialog2.write(0x22A, true);
+ break;
+
+ case 0x223:
+ _dialog2.write(0x223, false);
+ _dialog2.write(0x22D, true);
+ break;
+
+ case 0x224:
+ _dialog2.write(0x224, false);
+ _dialog2.write(0x230, true);
+ break;
+
+ case 0x227:
+ _dialog2.write(0x227, false);
+ break;
+
+ case 0x22A:
+ _dialog2.write(0x22A, false);
+ break;
+
+ case 0x22D:
+ _dialog2.write(0x22D, false);
+ break;
+
+ case 0x230:
+ _dialog2.write(0x230, false);
+ break;
+
+ case 0x21C:
+ setDialogNode(0);
+ break;
+
+ default:
+ break;
+
+ }
+
+ if (_action._activeAction._verbId != 0x21C) {
+ switch (_vm->getRandomNumber(1, 3)) {
+ case 1:
+ _game._triggerSetupMode = SEQUENCE_TRIGGER_DAEMON;
+ _scene->_sequences.addTimer(1, 100);
+ _talkTimer = 180;
+ _scene->_kernelMessages.reset();
+ _scene->_kernelMessages.add(Common::Point(198, 27), 0xFDFC, 0, 0, 9999999, _game.getQuote(0x1E7));
+ _scene->_kernelMessages.add(Common::Point(201, 41), 0xFDFC, 0, 0, 9999999, _game.getQuote(0x1E8));
+ _bartenderCurrentQuestion = 7;
+ break;
+
+ case 2:
+ _game._triggerSetupMode = SEQUENCE_TRIGGER_DAEMON;
+ _scene->_sequences.addTimer(1, 100);
+ _talkTimer = 180;
+ _scene->_kernelMessages.reset();
+ _scene->_kernelMessages.add(Common::Point(220, 27), 0xFDFC, 0, 0, 9999999, _game.getQuote(0x1E9));
+ _scene->_kernelMessages.add(Common::Point(190, 41), 0xFDFC, 0, 0, 9999999, _game.getQuote(0x1EA));
+ _bartenderCurrentQuestion = 8;
+ break;
+
+ case 3:
+ _game._triggerSetupMode = SEQUENCE_TRIGGER_DAEMON;
+ _scene->_sequences.addTimer(1, 100);
+ _talkTimer = 150;
+ _scene->_kernelMessages.reset();
+ _scene->_kernelMessages.add(Common::Point(196, 41), 0xFDFC, 0, 0, 9999999, _game.getQuote(0x1EB));
+ _bartenderCurrentQuestion = 9;
+ break;
+
+ default:
+ break;
+ }
+ _dialog2.start();
+ } else {
+ _scene->_kernelMessages.reset();
+ _scene->_kernelMessages.add(Common::Point(208, 41), 0xFDFC, 0, 0, 100, _game.getQuote(0x1FD));
+ _game._triggerSetupMode = SEQUENCE_TRIGGER_DAEMON;
+ _scene->_sequences.addTimer(1, 100);
+ _talkTimer = 1120;
+ }
+}
+
+void Scene402::handleConversation3() {
+ switch (_action._activeAction._verbId) {
+ case 0x233:
+ case 0x234:
+ case 0x235:
+ case 0x236:
+ _game._triggerSetupMode = SEQUENCE_TRIGGER_DAEMON;
+ _scene->_sequences.addTimer(1, 86);
+ _scene->_kernelMessages.reset();
+ _scene->_kernelMessages.add(Common::Point(188, 27), 0xFDFC, 0, 0, 9999999, _game.getQuote(0x1ED));
+ _scene->_kernelMessages.add(Common::Point(199, 41), 0xFDFC, 0, 0, 9999999, _game.getQuote(0x1EE));
+ setDialogNode(4);
+ _bartenderCurrentQuestion = 2;
+ break;
+
+ case 0x237:
+ _scene->_kernelMessages.reset();
+ _scene->_kernelMessages.add(Common::Point(208, 41), 0xFDFC, 0, 0, 100, _game.getQuote(0x1FD));
+ _game._triggerSetupMode = SEQUENCE_TRIGGER_DAEMON;
+ _scene->_sequences.addTimer(1, 100);
+ _talkTimer = 1120;
+ setDialogNode(0);
+ break;
+
+ default:
+ break;
+ }
+}
+
+void Scene402::handleConversation4() {
+ switch (_action._activeAction._verbId) {
+ case 0x238:
+ _scene->_kernelMessages.reset();
+ setDialogNode(0);
+ _game._player._stepEnabled = false;
+ _scene->_kernelMessages.add(Common::Point(196, 13), 0xFDFC, 0, 0, 180, _game.getQuote(0x1F0));
+ _scene->_kernelMessages.add(Common::Point(184, 27), 0xFDFC, 0, 0, 180, _game.getQuote(0x1F1));
+ _scene->_kernelMessages.add(Common::Point(200, 41), 0xFDFC, 0, 0, 180, _game.getQuote(0x1F2));
+ _game._triggerSetupMode = SEQUENCE_TRIGGER_DAEMON;
+ _scene->_sequences.addTimer(1, 100);
+ _talkTimer = 1100;
+ _dialog4.write(0x238, false);
+ _bartenderMode = 22;
+ _game._triggerSetupMode = SEQUENCE_TRIGGER_DAEMON;
+ _scene->_sequences.addTimer(100, 95);
+ _refuseAlienLiquor = true;
+ break;
+
+ case 0x239:
+ _game._player._stepEnabled = false;
+ _roxMode = 21;
+ _game._triggerSetupMode = SEQUENCE_TRIGGER_DAEMON;
+ _scene->_sequences.addTimer(1, 92);
+ _scene->_userInterface.setup(kInputBuildingSentences);
+ _conversationFl = false;
+ break;
+
+ case 0x23A:
+ setDialogNode(0);
+ _game._player._stepEnabled = false;
+ _scene->_kernelMessages.add(Common::Point(193, 27), 0xFDFC, 0, 0, 150, _game.getQuote(0x1F4));
+ _scene->_kernelMessages.add(Common::Point(230, 41), 0xFDFC, 0, 0, 150, _game.getQuote(0x1F5));
+ _dialog4.write(0x23A, false);
+ _globals[kHasSaidTimer] = true;
+ _game._triggerSetupMode = SEQUENCE_TRIGGER_DAEMON;
+ _scene->_sequences.addTimer(1, 100);
+ _talkTimer = 1100;
+ _bartenderMode = 22;
+ _game._triggerSetupMode = SEQUENCE_TRIGGER_DAEMON;
+ _scene->_sequences.addTimer(100, 95);
+ _refuseAlienLiquor = true;
+ break;
+
+ case 0x23D:
+ setDialogNode(0);
+ _game._player._stepEnabled = false;
+ _scene->_kernelMessages.add(Common::Point(153, 27), 0xFDFC, 0, 0, 150, _game.getQuote(0x1F6));
+ _scene->_kernelMessages.add(Common::Point(230, 41), 0xFDFC, 0, 0, 150, _game.getQuote(0x1F7));
+ _dialog4.write(0x23D, false);
+ _globals[kHasSaidBinocs] = true;
+ _game._triggerSetupMode = SEQUENCE_TRIGGER_DAEMON;
+ _scene->_sequences.addTimer(1, 100);
+ _talkTimer = 1100;
+ _bartenderMode = 22;
+ _game._triggerSetupMode = SEQUENCE_TRIGGER_DAEMON;
+ _scene->_sequences.addTimer(100, 95);
+ _refuseAlienLiquor = true;
+ break;
+
+ case 0x23E:
+ _scene->_kernelMessages.reset();
+ setDialogNode(0);
+ _game._player._stepEnabled = false;
+ _scene->_kernelMessages.add(Common::Point(205, 41), 0xFDFC, 0, 0, 100, _game.getQuote(0x1F8));
+ _bartenderMode = 22;
+ _game._triggerSetupMode = SEQUENCE_TRIGGER_DAEMON;
+ _scene->_sequences.addTimer(1, 100);
+ _talkTimer = 1050;
+ _game._triggerSetupMode = SEQUENCE_TRIGGER_DAEMON;
+ _scene->_sequences.addTimer(50, 95);
+ _refuseAlienLiquor = true;
+ break;
+
+ default:
+ break;
+ }
+}
+
+void Scene402::handleDialogs() {
+ if (_game._trigger == 0) {
+ _scene->_kernelMessages.reset();
+ _game._player._stepEnabled = false;
+ Common::String curQuote = _game.getQuote(_action._activeAction._verbId);
+ if (_vm->_font->getWidth(curQuote, _scene->_textSpacing) > 200) {
+ Common::String subQuote1, subQuote2;
+ _game.splitQuote(curQuote, subQuote1, subQuote2);
+ _scene->_kernelMessages.add(Common::Point(230, 42), 0x1110, 32, 0, 140, subQuote1);
+ _scene->_kernelMessages.add(Common::Point(230, 56), 0x1110, 32, 0, 140, subQuote2);
+ _scene->_sequences.addTimer(160, 120);
+ } else {
+ _scene->_kernelMessages.add(Common::Point(230, 56), 0x1110, 32, 1, 140, curQuote);
+ _scene->_sequences.addTimer(160, 120);
+ }
+ } else if (_game._trigger == 120) {
+ _game._player._stepEnabled = true;
+ switch (_bartenderDialogNode) {
+ case 1:
+ handleConversation1();
+ break;
+
+ case 2:
+ handleConversation2();
+ break;
+
+ case 3:
+ handleConversation3();
+ break;
+
+ case 4:
+ handleConversation4();
+ break;
+
+ default:
+ break;
+ }
+ }
+}
+
+void Scene402::enter() {
+ _globals._spriteIndexes[0] = _scene->_sprites.addSprites(formAnimName('n', -1));
+ _globals._spriteIndexes[1] = _scene->_sprites.addSprites(formAnimName('x', 2));
+ _globals._spriteIndexes[3] = _scene->_sprites.addSprites(formAnimName('x', 0));
+ _globals._spriteIndexes[2] = _scene->_sprites.addSprites(formAnimName('x', 1));
+ _globals._spriteIndexes[4] = _scene->_sprites.addSprites(formAnimName('g', 0));
+ _globals._spriteIndexes[5] = _scene->_sprites.addSprites(formAnimName('g', 1));
+ _globals._spriteIndexes[6] = _scene->_sprites.addSprites(formAnimName('a', 0));
+ _globals._spriteIndexes[7] = _scene->_sprites.addSprites(formAnimName('a', 1));
+ _globals._spriteIndexes[15] = _scene->_sprites.addSprites(formAnimName('x', 5));
+ _globals._spriteIndexes[8] = _scene->_sprites.addSprites(formAnimName('x', 4));
+ _globals._spriteIndexes[9] = _scene->_sprites.addSprites(formAnimName('b', 0));
+ _globals._spriteIndexes[10] = _scene->_sprites.addSprites(formAnimName('b', 1));
+ _globals._spriteIndexes[11] = _scene->_sprites.addSprites(formAnimName('b', 2));
+ _globals._spriteIndexes[12] = _scene->_sprites.addSprites(formAnimName('b', 3));
+ _globals._spriteIndexes[13] = _scene->_sprites.addSprites(formAnimName('c', 0));
+ _globals._spriteIndexes[14] = _scene->_sprites.addSprites(formAnimName('l', 0));
+ _globals._spriteIndexes[16] = _scene->_sprites.addSprites(formAnimName('h', 0));
+ _globals._spriteIndexes[17] = _scene->_sprites.addSprites(formAnimName('z', 0));
+ _globals._spriteIndexes[18] = _scene->_sprites.addSprites(formAnimName('z', 1));
+ _globals._spriteIndexes[19] = _scene->_sprites.addSprites(formAnimName('z', 2));
+ _globals._spriteIndexes[20] = _scene->_sprites.addSprites(formAnimName('x', 6));
+ _globals._spriteIndexes[21] = _scene->_sprites.addSprites("*ROXRC_9");
+ _globals._spriteIndexes[22] = _scene->_sprites.addSprites("*ROXCL_8");
+
+ if (_scene->_priorSceneId == 401) {
+ _game._player._playerPos = Common::Point(160, 150);
+ _game._player._facing = FACING_NORTH;
+ _roxOnStool = false;
+ _bartenderDialogNode = 1;
+ _conversationFl = false;
+ } else if (_scene->_priorSceneId != -2) {
+ _game._player._playerPos = Common::Point(160, 150);
+ _game._player._facing = FACING_NORTH;
+ _game._objects.addToInventory(OBJ_CREDIT_CHIP);
+ _game._objects.addToInventory(OBJ_BINOCULARS);
+ _game._objects.addToInventory(OBJ_TIMER_MODULE);
+ _roxOnStool = false;
+ _bartenderDialogNode = 1;
+ _conversationFl = false;
+ }
+
+ _game.loadQuoteSet(0x1D7, 0x1D8, 0x1D9, 0x1DA, 0x1DB, 0x1DC, 0x1DD, 0x1DE, 0x1DF, 0x1E2, 0x1E3, 0x1E6, 0x1E5, 0x1E7,
+ 0x1E8, 0x1E9, 0x1EA, 0x1EF, 0x1F0, 0x1F1, 0x1F2, 0x1F3, 0x1F4, 0x1F5, 0x1F6, 0x1F7, 0x1F8, 0x1F9, 0x1FA, 0x1FB,
+ 0x1FC, 0x1EB, 0x1EC, 0x1ED, 0x1EE, 0x1E4, 0x1FD, 0x1E0, 0x1E1, 0x1FE, 0x1FF, 0x200, 0x201, 0x202, 0x203, 0x204,
+ 0x205, 0x206, 0x207, 0x208, 0x209, 0x20A, 0x20B, 0x20C, 0x20F, 0x20D, 0x20E, 0x210, 0x211, 0x212, 0x213, 0x214,
+ 0x215, 0x237, 0x216, 0x219, 0x21A, 0x21B, 0x21C, 0x21D, 0x220, 0x223, 0x224, 0x227, 0x22A, 0x22D, 0x230, 0x233,
+ 0x234, 0x235, 0x236, 0x238, 0x239, 0x23A, 0x23D, 0x23E, 0x23F, 0);
+
+ _vm->_palette->setEntry(250, 47, 41, 40);
+ _vm->_palette->setEntry(251, 50, 63, 55);
+ _vm->_palette->setEntry(252, 38, 34, 25);
+ _vm->_palette->setEntry(253, 45, 41, 35);
+
+ _dialog1.setup(0x60, 0x214, 0x215, 0x237, 0);
+ _dialog2.setup(0x61, 0x216, 0x219, 0x21A, 0x21B, 0x21D, 0x220, 0x223, 0x224, 0x227, 0x22A, 0x22D, 0x230, 0x21C, 0);
+ _dialog3.setup(0x62, 0x233, 0x234, 0x235, 0x236, 0x237, -1);
+ _dialog4.setup(0x63, 0x238, 0x239, 0x23A, 0x23D, 0x23E, 0);
+
+ if (!_game._visitedScenes._sceneRevisited) {
+ _dialog2.set(0x61, 0x216, 0x219, 0x21A, 0x21B, 0x21C, 0);
+ _dialog4.set(0x63, 0x238, 0x23E, 0);
+ _dialog1.set(0x60, 0x214, 0x215, 0x237, 0);
+ }
+
+ if (_game._objects.isInInventory(OBJ_CREDIT_CHIP))
+ _dialog4.write(0x239, true);
+ else
+ _dialog4.write(0x239, false);
+
+ if (_game._objects.isInInventory(OBJ_BINOCULARS) && !_globals[kHasSaidBinocs])
+ _dialog4.write(0x23D, true);
+ else
+ _dialog4.write(0x23D, false);
+
+ if (_game._objects.isInInventory(OBJ_TIMER_MODULE) && !_globals[kHasSaidTimer])
+ _dialog4.write(0x23A, true);
+ else
+ _dialog4.write(0x23A, false);
+
+ if (_dialog2.read(0) <= 1)
+ _dialog1.write(0x214, false);
+
+ if (_conversationFl) {
+ switch (_bartenderDialogNode) {
+ case 0:
+ _scene->_userInterface.setup(kInputBuildingSentences);
+ _bartenderDialogNode = 1;
+ break;
+
+ case 1:
+ _dialog1.start();
+ break;
+
+ case 2:
+ _dialog2.start();
+ break;
+
+ case 3:
+ _dialog3.start();
+ break;
+
+ case 4:
+ _dialog4.start();
+ break;
+
+ default:
+ break;
+ }
+
+ switch (_bartenderCurrentQuestion) {
+ case 1:
+ _scene->_kernelMessages.add(Common::Point(260, 41), 0xFDFC, 0, 0, 9999999, _game.getQuote(0x1EC));
+ break;
+
+ case 2:
+ _scene->_kernelMessages.add(Common::Point(188, 27), 0xFDFC, 0, 0, 9999999, _game.getQuote(0x1ED));
+ _scene->_kernelMessages.add(Common::Point(199, 41), 0xFDFC, 0, 0, 9999999, _game.getQuote(0x1EE));
+ break;
+
+ case 3:
+ _scene->_kernelMessages.add(Common::Point(177, 41), 0xFDFC, 0, 0, 9999999, _game.getQuote(0x1EF));
+ break;
+
+ case 4:
+ _scene->_kernelMessages.add(Common::Point(205, 41), 0xFDFC, 0, 0, 9999999, _game.getQuote(0x1E4));
+ break;
+
+ case 5:
+ _scene->_kernelMessages.add(Common::Point(203, 41), 0xFDFC, 0, 0, 9999999, _game.getQuote(0x1E5));
+ break;
+
+ case 6:
+ _scene->_kernelMessages.add(Common::Point(260, 41), 0xFDFC, 0, 0, 9999999, _game.getQuote(0x1E6));
+ break;
+
+ case 7:
+ _scene->_kernelMessages.add(Common::Point(198, 27), 0xFDFC, 0, 0, 9999999, _game.getQuote(0x1E7));
+ _scene->_kernelMessages.add(Common::Point(201, 41), 0xFDFC, 0, 0, 9999999, _game.getQuote(0x1E8));
+ break;
+
+ case 8:
+ _scene->_kernelMessages.add(Common::Point(220, 27), 0xFDFC, 0, 0, 9999999, _game.getQuote(0x1E9));
+ _scene->_kernelMessages.add(Common::Point(190, 41), 0xFDFC, 0, 0, 9999999, _game.getQuote(0x1EA));
+ break;
+
+ case 9:
+ _scene->_kernelMessages.add(Common::Point(196, 41), 0xFDFC, 0, 0, 9999999, _game.getQuote(0x1EB));
+ break;
+
+ case 10:
+ _scene->_kernelMessages.add(Common::Point(198, 27), 0xFDFC, 0, 0, 9999999, _game.getQuote(0x1E2));
+ _scene->_kernelMessages.add(Common::Point(199, 41), 0xFDFC, 0, 0, 9999999, _game.getQuote(0x1E3));
+ break;
+
+ default:
+ break;
+ }
+ }
+
+ _firstTalkToGirlInChair = false;
+ _lightOn = false;
+ _blowingSmoke = false;
+ _leftWomanMoving = false;
+ _rightWomanMoving = false;
+ _ginnyLooking = false;
+ _beatCounter = 0;
+ _waitingGinnyMove = false;
+ _bigBeatFl = true;
+ _bartenderHandsHips = false;
+ _bartenderSteady = true;
+ _bartenderLooksLeft = false;
+ _activeTeleporter = false;
+ _activeArrows = false;
+ _activeArrow1 = false;
+ _activeArrow2 = false;
+ _activeArrow3 = false;
+ _cutSceneReady = false;
+ _cutSceneNeeded = false;
+ _helgaReady = true;
+ _bartenderReady = true;
+ _drinkTimer = 0;
+ _bartenderTalking = false;
+ _bartenderCalled = false;
+ _helgaTalkMode = 0;
+ _rexMode = 0;
+ _refuseAlienLiquor = false;
+
+ _scene->loadAnimation(Resources::formatName(402, 'd', 1, EXT_AA, ""));
+ _scene->_activeAnimation->_resetFlag = true;
+
+ _globals._sequenceIndexes[5] = _scene->_sequences.startCycle(_globals._spriteIndexes[5], false, 1);
+ _scene->_sequences.setDepth(_globals._sequenceIndexes[5], 1);
+
+ _globals._sequenceIndexes[13] = _scene->_sequences.startCycle(_globals._spriteIndexes[13], false, 2);
+ _scene->_sequences.setDepth(_globals._sequenceIndexes[13], 8);
+
+ if (!_game._objects.isInInventory(OBJ_REPAIR_LIST)) {
+ _globals._sequenceIndexes[14] = _scene->_sequences.startCycle(_globals._spriteIndexes[14], false, 1);
+ _scene->_sequences.setDepth(_globals._sequenceIndexes[14], 7);
+ _scene->_sequences.setPosition(_globals._sequenceIndexes[14], Common::Point(210, 80));
+ int idx = _scene->_dynamicHotspots.add(NOUN_REPAIR_LIST, VERB_LOOK_AT, _globals._sequenceIndexes[14], Common::Rect(0, 0, 0, 0));
+ _scene->_dynamicHotspots.setPosition(idx, Common::Point(0, 0), FACING_NONE);
+ }
+
+ {
+ _globals._sequenceIndexes[9] = _scene->_sequences.startCycle(_globals._spriteIndexes[9], false, 1);
+ _scene->_sequences.setDepth(_globals._sequenceIndexes[9], 8);
+ int idx = _scene->_dynamicHotspots.add(NOUN_BARTENDER, VERB_WALKTO, _globals._sequenceIndexes[9], Common::Rect(0, 0, 0, 0));
+ _scene->_dynamicHotspots.setPosition(idx, Common::Point(228, 83), FACING_SOUTH);
+ }
+
+ if (!_game._objects.isInRoom(OBJ_ALIEN_LIQUOR) && !_game._objects.isInInventory(OBJ_CREDIT_CHIP)) {
+ _globals._sequenceIndexes[15] = _scene->_sequences.startCycle(_globals._spriteIndexes[15], false, 1);
+ _scene->_sequences.setDepth(_globals._sequenceIndexes[15], 8);
+ _scene->_sequences.setPosition(_globals._sequenceIndexes[15], Common::Point(250, 80));
+ int idx = _scene->_dynamicHotspots.add(NOUN_CREDIT_CHIP, VERB_TAKE, _globals._sequenceIndexes[15], Common::Rect(0, 0, 0, 0));
+ _scene->_dynamicHotspots.setPosition(idx, Common::Point(0, 0), FACING_NONE);
+ }
+
+ _globals._sequenceIndexes[20] = _scene->_sequences.startCycle(_globals._spriteIndexes[20], false, 1);
+ _scene->_sequences.setDepth(_globals._sequenceIndexes[20], 7);
+ _scene->_sequences.setPosition(_globals._sequenceIndexes[20], Common::Point(234, 72));
+
+ if (_globals[kBottleDisplayed]) {
+ _globals._sequenceIndexes[8] = _scene->_sequences.startCycle(_globals._spriteIndexes[8], false, 4);
+ _scene->_sequences.setDepth(_globals._sequenceIndexes[8], 7);
+ }
+
+ if (_roxOnStool) {
+ _globals._sequenceIndexes[6] = _scene->_sequences.startCycle(_globals._spriteIndexes[6], false, 11);
+ _scene->_sequences.setDepth(_globals._sequenceIndexes[6], 5);
+ _game._player._visible = false;
+ }
+
+ sceneEntrySound();
+}
+
+void Scene402::step() {
+ if (_game._trigger == 104) {
+ _game._player._priorTimer = _scene->_frameStartTime + _game._player._ticksAmount;
+ _game._player._visible = true;
+ _scene->_sequences.remove(_globals._sequenceIndexes[15]);
+ _game._objects.addToInventory(OBJ_CREDIT_CHIP);
+ _vm->_dialogs->showItem(OBJ_CREDIT_CHIP, 40242);
+ _game._player._stepEnabled = true;
+ }
+
+ if ((_vm->getRandomNumber(1, 1500) == 1) && (!_activeTeleporter) && (_game._player._playerPos.x < 150)) {
+ _vm->_sound->command(30);
+ _globals._sequenceIndexes[4] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[4], false, 13, 1, 0, 0);
+ _scene->_sequences.setAnimRange(_globals._sequenceIndexes[4], 1, 11);
+ _scene->_sequences.setDepth(_globals._sequenceIndexes[4], 14);
+ _scene->_sequences.addSubEntry(_globals._sequenceIndexes[4], SEQUENCE_TRIGGER_EXPIRE, 0, 48);
+ _activeTeleporter = true;
+ _globals[kSomeoneHasExploded] = true;
+ }
+
+ if (_game._trigger == 48)
+ _activeTeleporter = false;
+
+ if (_game._trigger == 100) {
+ _bartenderReady = false;
+ if (_bartenderHandsHips) {
+ _scene->_sequences.remove(_globals._sequenceIndexes[10]);
+ _bartenderHandsHips = false;
+ } else if (_bartenderLooksLeft) {
+ _scene->_sequences.remove(_globals._sequenceIndexes[11]);
+ _bartenderLooksLeft = false;
+ } else if (_bartenderSteady) {
+ _scene->_sequences.remove(_globals._sequenceIndexes[9]);
+ _bartenderSteady = false;
+ }
+
+ if (!_bartenderTalking) {
+ _globals._sequenceIndexes[10] = _scene->_sequences.startReverseCycle(_globals._spriteIndexes[10], false, 7, 0, 0, 0);
+ _scene->_sequences.setAnimRange(_globals._sequenceIndexes[10], 3, 4);
+ _scene->_sequences.setDepth(_globals._sequenceIndexes[10], 8);
+ int idx = _scene->_dynamicHotspots.add(NOUN_BARTENDER, VERB_WALKTO, _globals._sequenceIndexes[10], Common::Rect(0, 0, 0, 0));
+ _scene->_dynamicHotspots.setPosition(idx, Common::Point(228, 83), FACING_SOUTH);
+ _bartenderTalking = true;
+ if (_talkTimer > 1000)
+ _scene->_sequences.addTimer(_talkTimer - 1000, 101);
+ else
+ _scene->_sequences.addTimer(_talkTimer, 101);
+ }
+ }
+
+ if ((_game._trigger == 101) && _bartenderTalking) {
+ _scene->_sequences.remove(_globals._sequenceIndexes[10]);
+ _globals._sequenceIndexes[9] = _scene->_sequences.startCycle(_globals._spriteIndexes[9], false, 1);
+ int idx = _scene->_dynamicHotspots.add(NOUN_BARTENDER, VERB_WALKTO, _globals._sequenceIndexes[9], Common::Rect(0, 0, 0, 0));
+ _scene->_dynamicHotspots.setPosition(idx, Common::Point(228, 83), FACING_SOUTH);
+ _scene->_sequences.setDepth(_globals._sequenceIndexes[9], 8);
+ _bartenderSteady = true;
+ _bartenderTalking = false;
+ if (_talkTimer < 1000)
+ _bartenderReady = true;
+ }
+
+ if (_game._trigger == 28)
+ _game._player._stepEnabled = true;
+
+ switch (_game._trigger) {
+ case 92:
+ _game._player._stepEnabled = false;
+ _scene->_sequences.remove(_globals._sequenceIndexes[6]);
+ _globals._sequenceIndexes[7] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[7], false, 10, 1, 0, 0);
+ _scene->_sequences.setAnimRange(_globals._sequenceIndexes[7], 1, 2);
+ _scene->_sequences.setDepth(_globals._sequenceIndexes[7], 5);
+ _scene->_sequences.addSubEntry(_globals._sequenceIndexes[7], SEQUENCE_TRIGGER_EXPIRE, 0, 93);
+ break;
+
+ case 93: {
+ int seqIdx = _globals._sequenceIndexes[7];
+ switch (_roxMode) {
+ case 20:
+ _vm->_sound->command(57);
+ _scene->_sequences.remove(_globals._sequenceIndexes[15]);
+ _game._objects.addToInventory(OBJ_CREDIT_CHIP);
+ _vm->_dialogs->showItem(OBJ_CREDIT_CHIP, 40242);
+ break;
+
+ case 22:
+ _vm->_sound->command(57);
+ _scene->_sequences.remove(_globals._sequenceIndexes[8]);
+ _game._objects.addToInventory(OBJ_ALIEN_LIQUOR);
+ _globals[kBottleDisplayed] = false;
+ _vm->_dialogs->showItem(OBJ_ALIEN_LIQUOR, 40241);
+ break;
+
+ case 21:
+ _globals._sequenceIndexes[15] = _scene->_sequences.startCycle(_globals._spriteIndexes[15], false, 1);
+ _scene->_sequences.setDepth(_globals._sequenceIndexes[15], 8);
+ _scene->_sequences.setPosition(_globals._sequenceIndexes[15], Common::Point(250, 80));
+ break;
+
+ default:
+ break;
+ }
+ _globals._sequenceIndexes[7] = _scene->_sequences.addReverseSpriteCycle(_globals._spriteIndexes[7], false, 10, 1, 0, 0);
+ _scene->_sequences.setAnimRange(_globals._sequenceIndexes[7], 1, 3);
+ _scene->_sequences.setDepth(_globals._sequenceIndexes[7], 5);
+ _scene->_sequences.updateTimeout(_globals._sequenceIndexes[7], seqIdx);
+ _scene->_sequences.addSubEntry(_globals._sequenceIndexes[7], SEQUENCE_TRIGGER_EXPIRE, 0, 94);
+
+ if (_roxMode == 21) {
+ if (_game._objects.isInInventory(OBJ_CREDIT_CHIP))
+ _game._objects.setRoom (OBJ_CREDIT_CHIP, NOWHERE);
+
+ _bartenderMode = 20;
+ _scene->_sequences.addTimer(60, 95);
+ }
+ }
+ break;
+
+ case 94: {
+ int seqIdx = _globals._sequenceIndexes[7];
+ _globals._sequenceIndexes[6] = _scene->_sequences.startCycle(_globals._spriteIndexes[6], false, 11);
+ _scene->_sequences.setDepth(_globals._sequenceIndexes[6], 5);
+ _scene->_sequences.updateTimeout(_globals._sequenceIndexes[6], seqIdx);
+ if (_roxMode == 22) {
+ _scene->_kernelMessages.reset();
+ _scene->_kernelMessages.add(Common::Point(230, 56), 0x1110, 32, 0, 120, _game.getQuote(0x23F));
+ _bartenderMode = 21;
+ _globals[kHasPurchased] = true;
+ _scene->_sequences.addTimer(140, 95);
+ } else if (_roxMode == 20)
+ _game._player._stepEnabled = true;
+
+ }
+ break;
+ }
+
+ switch (_game._trigger) {
+ case 95:
+ _bartenderReady = false;
+ _game._player._stepEnabled = false;
+ if (_bartenderHandsHips || _bartenderTalking) {
+ _scene->_sequences.remove(_globals._sequenceIndexes[10]);
+ _bartenderHandsHips = false;
+ _bartenderTalking = false;
+ }
+
+ if (_bartenderLooksLeft) {
+ _scene->_sequences.remove(_globals._sequenceIndexes[11]);
+ _bartenderLooksLeft = false;
+ }
+
+ if (_bartenderSteady) {
+ _scene->_sequences.remove(_globals._sequenceIndexes[9]);
+ _bartenderSteady = false;
+ }
+ _globals._sequenceIndexes[12] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[12], false, 10, 1, 0, 0);
+ _scene->_sequences.setAnimRange(_globals._sequenceIndexes[12], 1, 4);
+ _scene->_sequences.setDepth(_globals._sequenceIndexes[12], 8);
+ _scene->_sequences.addSubEntry(_globals._sequenceIndexes[12], SEQUENCE_TRIGGER_EXPIRE, 0, 96);
+ break;
+
+ case 96: {
+ int seqIdx = _globals._sequenceIndexes[12];
+ _globals._sequenceIndexes[12] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[12], false, 10, 1, 0, 0);
+ _scene->_sequences.setAnimRange(_globals._sequenceIndexes[12], 6, 7);
+ _scene->_sequences.setDepth(_globals._sequenceIndexes[12], 8);
+ _scene->_sequences.updateTimeout(_globals._sequenceIndexes[12], seqIdx);
+ _scene->_sequences.addSubEntry(_globals._sequenceIndexes[12], SEQUENCE_TRIGGER_EXPIRE, 0, 97);
+ }
+ break;
+
+ case 97: {
+ int seqIdx = _globals._sequenceIndexes[12];
+ switch (_bartenderMode) {
+ case 20:
+ _scene->_sequences.remove(_globals._sequenceIndexes[15]);
+ break;
+
+ case 21: {
+ _globals._sequenceIndexes[15] = _scene->_sequences.startCycle(_globals._spriteIndexes[15], false, 1);
+ _scene->_sequences.setDepth(_globals._sequenceIndexes[15], 8);
+ _scene->_sequences.setPosition(_globals._sequenceIndexes[15], Common::Point(250, 80));
+ int idx = _scene->_dynamicHotspots.add(NOUN_CREDIT_CHIP, VERB_TAKE, _globals._sequenceIndexes[15], Common::Rect(0, 0, 0, 0));
+ _scene->_dynamicHotspots.setPosition(idx, Common::Point(0, 0), FACING_NONE);
+ }
+ break;
+
+ case 22:
+ _scene->_sequences.remove(_globals._sequenceIndexes[8]);
+ _globals[kBottleDisplayed] = false;
+ break;
+
+ default:
+ break;
+ }
+
+ _globals._sequenceIndexes[12] = _scene->_sequences.startCycle(_globals._spriteIndexes[12], false, 6);
+ _scene->_sequences.updateTimeout(_globals._sequenceIndexes[12], seqIdx);
+ _scene->_sequences.setDepth(_globals._sequenceIndexes[12], 8);
+ _scene->_sequences.addTimer(10, 98);
+ }
+ break;
+
+ case 98:
+ _scene->_sequences.remove(_globals._sequenceIndexes[12]);
+ _globals._sequenceIndexes[12] = _scene->_sequences.addReverseSpriteCycle(_globals._spriteIndexes[12], false, 10, 1, 0, 0);
+ _scene->_sequences.setAnimRange(_globals._sequenceIndexes[12], 1, 4);
+ _scene->_sequences.setDepth(_globals._sequenceIndexes[12], 8);
+ _scene->_sequences.addSubEntry(_globals._sequenceIndexes[12], SEQUENCE_TRIGGER_EXPIRE, 0, 99);
+ break;
+
+ case 99: {
+ int seqIdx = _globals._sequenceIndexes[12];
+ _globals._sequenceIndexes[9] = _scene->_sequences.startCycle(_globals._spriteIndexes[9], false, 1);
+ _bartenderSteady = true;
+ int idx = _scene->_dynamicHotspots.add(NOUN_BARTENDER, VERB_WALKTO, _globals._sequenceIndexes[9], Common::Rect(0, 0, 0, 0));
+ _scene->_dynamicHotspots.setPosition(idx, Common::Point(228, 83), FACING_SOUTH);
+ _scene->_sequences.updateTimeout(_globals._sequenceIndexes[9], seqIdx);
+ _scene->_sequences.setDepth(_globals._sequenceIndexes[9], 8);
+ if (_bartenderMode == 20) {
+ _scene->_kernelMessages.reset();
+ _scene->_kernelMessages.add(Common::Point(210, 41), 0xFDFC, 0, 0, 100, _game.getQuote(0x1F3));
+ _scene->_sequences.addTimer(5, 100);
+ _talkTimer = 180;
+ _roxMode = 22;
+ _scene->_sequences.addTimer(65, 92);
+ } else if ((_bartenderMode == 21) || (_bartenderMode == 22)) {
+ _game._player._stepEnabled = true;
+ _bartenderReady = true;
+ }
+
+ }
+ break;
+ }
+
+ switch (_game._trigger) {
+ case 86:
+ _bartenderReady = false;
+ _game._player._stepEnabled = false;
+ if ((_bartenderHandsHips) || (_bartenderTalking)) {
+ _scene->_sequences.remove(_globals._sequenceIndexes[10]);
+ _bartenderHandsHips = false;
+ _bartenderTalking = false;
+ } else if (_bartenderLooksLeft) {
+ _scene->_sequences.remove(_globals._sequenceIndexes[11]);
+ _bartenderLooksLeft = false;
+ } else if (_bartenderSteady) {
+ _scene->_sequences.remove(_globals._sequenceIndexes[9]);
+ _bartenderSteady = false;
+ }
+ _globals._sequenceIndexes[9] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[9], false, 10, 1, 0, 0);
+ _scene->_sequences.setAnimRange(_globals._sequenceIndexes[9], 1, 9);
+ _scene->_sequences.setDepth(_globals._sequenceIndexes[9], 8);
+ _scene->_sequences.addSubEntry(_globals._sequenceIndexes[9], SEQUENCE_TRIGGER_EXPIRE, 0, 87);
+ break;
+
+ case 87: {
+ int seqIdx = _globals._sequenceIndexes[9];
+ _globals._sequenceIndexes[9] = _scene->_sequences.startCycle(_globals._spriteIndexes[9], false, 9);
+ _scene->_sequences.setDepth(_globals._sequenceIndexes[9], 8);
+ _scene->_sequences.updateTimeout(_globals._sequenceIndexes[9], seqIdx);
+ _scene->_sequences.addTimer(10, 89);
+
+ _globals._sequenceIndexes[8] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[8], false, 10, 1, 0, 0);
+ _scene->_sequences.setAnimRange(_globals._sequenceIndexes[8], 1, 4);
+ _scene->_sequences.setDepth(_globals._sequenceIndexes[8], 7);
+ _scene->_sequences.addSubEntry(_globals._sequenceIndexes[8], SEQUENCE_TRIGGER_EXPIRE, 0, 88);
+ }
+ break;
+
+ case 88:
+ _globals._sequenceIndexes[8] = _scene->_sequences.startCycle(_globals._spriteIndexes[8], false, 4);
+ _scene->_sequences.setDepth(_globals._sequenceIndexes[8], 7);
+ _globals[kBottleDisplayed] = true;
+ break;
+
+ case 89:
+ _scene->_sequences.remove(_globals._sequenceIndexes[9]);
+ _globals._sequenceIndexes[9] = _scene->_sequences.startCycle(_globals._spriteIndexes[9], false, 6);
+ _scene->_sequences.setDepth(_globals._sequenceIndexes[9], 8);
+ _scene->_sequences.addTimer(10, 90);
+ break;
+
+ case 90:
+ _scene->_sequences.remove(_globals._sequenceIndexes[9]);
+ _globals._sequenceIndexes[9] = _scene->_sequences.startCycle(_globals._spriteIndexes[9], false, 5);
+ _scene->_sequences.setDepth(_globals._sequenceIndexes[9], 8);
+ _scene->_sequences.addTimer(10, 91);
+ break;
+
+ case 91: {
+ _scene->_sequences.remove(_globals._sequenceIndexes[9]);
+ _globals._sequenceIndexes[9] = _scene->_sequences.startCycle(_globals._spriteIndexes[9], false, 1);
+ int idx = _scene->_dynamicHotspots.add(NOUN_BARTENDER, VERB_WALKTO, _globals._sequenceIndexes[9], Common::Rect(0, 0, 0, 0));
+ _scene->_dynamicHotspots.setPosition(idx, Common::Point(228, 83), FACING_SOUTH);
+ _scene->_sequences.setDepth(_globals._sequenceIndexes[9], 8);
+ _bartenderSteady = true;
+ _game._player._stepEnabled = true;
+ _bartenderReady = true;
+ }
+ break;
+ }
+
+ if (!_waitingGinnyMove && !_ginnyLooking) {
+ _waitingGinnyMove = true;
+ ++ _beatCounter;
+ if (_beatCounter >= 20) {
+ _ginnyLooking = true;
+ _beatCounter = 0;
+ _scene->_sequences.addTimer(60, 54);
+ } else {
+ _scene->_sequences.addTimer(30, 75);
+ }
+ }
+
+ switch (_game._trigger) {
+ case 75:
+ _scene->_sequences.remove(_globals._sequenceIndexes[5]);
+ _bigBeatFl = !_bigBeatFl;
+
+ if (_bigBeatFl) {
+ _globals._sequenceIndexes[5] = _scene->_sequences.startCycle(_globals._spriteIndexes[5], false, 5);
+ _scene->_sequences.addTimer(8, 130);
+ } else {
+ _globals._sequenceIndexes[5] = _scene->_sequences.startCycle(_globals._spriteIndexes[5], false, 5);
+ _scene->_sequences.addTimer(8, 53);
+ }
+
+ _scene->_sequences.setDepth(_globals._sequenceIndexes[5], 1);
+ break;
+
+ case 130:
+ _scene->_sequences.remove(_globals._sequenceIndexes[5]);
+ _globals._sequenceIndexes[5] = _scene->_sequences.startCycle(_globals._spriteIndexes[5], false, 6);
+ _scene->_sequences.setDepth(_globals._sequenceIndexes[5], 1);
+ _scene->_sequences.addTimer(8, 131);
+ break;
+
+ case 131:
+ _scene->_sequences.remove(_globals._sequenceIndexes[5]);
+ _globals._sequenceIndexes[5] = _scene->_sequences.startCycle(_globals._spriteIndexes[5], false, 5);
+ _scene->_sequences.setDepth(_globals._sequenceIndexes[5], 1);
+ _scene->_sequences.addTimer(8, 53);
+ break;
+
+ case 53:
+ _scene->_sequences.remove(_globals._sequenceIndexes[5]);
+ _globals._sequenceIndexes[5] = _scene->_sequences.startCycle(_globals._spriteIndexes[5], false, 1);
+ _scene->_sequences.setDepth(_globals._sequenceIndexes[5], 1);
+ _waitingGinnyMove = false;
+ break;
+ }
+
+ if ((_game._trigger == 54) && _ginnyLooking) {
+ ++_beatCounter;
+ if (_beatCounter >= 10) {
+ _ginnyLooking = false;
+ _waitingGinnyMove = false;
+ _beatCounter = 0;
+ _bigBeatFl = true;
+ } else {
+ _scene->_sequences.remove(_globals._sequenceIndexes[5]);
+ _globals._sequenceIndexes[5] = _scene->_sequences.startCycle(_globals._spriteIndexes[5], false, _vm->getRandomNumber(1, 4));
+ _scene->_sequences.setDepth(_globals._sequenceIndexes[5], 1);
+ _scene->_sequences.addTimer(60, 54);
+ }
+ }
+
+ if (_bartenderReady) {
+ if (_vm->getRandomNumber(1, 250) == 1) {
+ if (_bartenderLooksLeft) {
+ _scene->_sequences.remove(_globals._sequenceIndexes[11]);
+ _bartenderLooksLeft = false;
+ } else if (_bartenderHandsHips) {
+ _scene->_sequences.remove(_globals._sequenceIndexes[10]);
+ _bartenderHandsHips = false;
+ } else if (_bartenderSteady) {
+ _scene->_sequences.remove(_globals._sequenceIndexes[9]);
+ _bartenderSteady = false;
+ }
+
+ switch (_vm->getRandomNumber(1, 3)) {
+ case 1: {
+ _globals._sequenceIndexes[10] = _scene->_sequences.startCycle(_globals._spriteIndexes[10], false, 4);
+ _scene->_sequences.setDepth(_globals._sequenceIndexes[10], 8);
+ int idx = _scene->_dynamicHotspots.add(NOUN_BARTENDER, VERB_WALKTO, _globals._sequenceIndexes[10], Common::Rect(0, 0, 0, 0));
+ _scene->_dynamicHotspots.setPosition(idx, Common::Point(228, 83), FACING_SOUTH);
+ _bartenderHandsHips = true;
+ }
+ break;
+
+ case 2: {
+ _globals._sequenceIndexes[11] = _scene->_sequences.startCycle(_globals._spriteIndexes[11], false, 2);
+ _scene->_sequences.setDepth(_globals._sequenceIndexes[11], 8);
+ int idx = _scene->_dynamicHotspots.add(NOUN_BARTENDER, VERB_WALKTO, _globals._sequenceIndexes[11], Common::Rect(0, 0, 0, 0));
+ _scene->_dynamicHotspots.setPosition(idx, Common::Point(228, 83), FACING_SOUTH);
+ _bartenderLooksLeft = true;
+ }
+ break;
+
+ case 3: {
+ _globals._sequenceIndexes[9] = _scene->_sequences.startCycle(_globals._spriteIndexes[9], false, 1);
+ _scene->_sequences.setDepth(_globals._sequenceIndexes[9], 8);
+ int idx = _scene->_dynamicHotspots.add(NOUN_BARTENDER, VERB_WALKTO, _globals._sequenceIndexes[9], Common::Rect(0, 0, 0, 0));
+ _scene->_dynamicHotspots.setPosition(idx, Common::Point(228, 83), FACING_SOUTH);
+ _bartenderSteady = true;
+ }
+ break;
+
+ default:
+ break;
+ }
+ }
+ }
+
+ if (_game._trigger == 76) {
+ int seqIdx = _globals._sequenceIndexes[6];
+ _globals._sequenceIndexes[6] = _scene->_sequences.startCycle(_globals._spriteIndexes[6], false, 11);
+ _scene->_sequences.setDepth(_globals._sequenceIndexes[6], 5);
+ _scene->_sequences.updateTimeout(_globals._sequenceIndexes[6], seqIdx);
+ if (!_globals[kBeenThruHelgaScene]) {
+ _game._player._stepEnabled = false;
+ _cutSceneNeeded = true;
+ } else {
+ _game._player._stepEnabled = true;
+ }
+ _roxOnStool = true;
+ }
+
+ switch (_game._trigger) {
+ case 77:
+ _game._player._stepEnabled = false;
+ _scene->_sequences.remove(_globals._sequenceIndexes[6]);
+ _globals._sequenceIndexes[7] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[7], false, 10, 1, 0, 0);
+ _scene->_sequences.setAnimRange(_globals._sequenceIndexes[7], 10, 12);
+ _scene->_sequences.setDepth(_globals._sequenceIndexes[7], 5);
+ _scene->_sequences.addSubEntry(_globals._sequenceIndexes[7], SEQUENCE_TRIGGER_EXPIRE, 0, 78);
+ break;
+
+ case 78: {
+ _vm->_sound->command(57);
+ int seqIdx = _globals._sequenceIndexes[7];
+ _game._objects.addToInventory(OBJ_REPAIR_LIST);
+ _scene->_sequences.remove(_globals._sequenceIndexes[14]);
+ _globals._sequenceIndexes[7] = _scene->_sequences.addReverseSpriteCycle(_globals._spriteIndexes[7], false, 10, 1, 0, 0);
+ _scene->_sequences.setAnimRange(_globals._sequenceIndexes[7], 10, 12);
+ _scene->_sequences.setDepth(_globals._sequenceIndexes[7], 5);
+ _scene->_sequences.updateTimeout(_globals._sequenceIndexes[7], seqIdx);
+ _scene->_sequences.addSubEntry(_globals._sequenceIndexes[7], SEQUENCE_TRIGGER_EXPIRE, 0, 79);
+ }
+ break;
+
+ case 79: {
+ int seqIdx = _globals._sequenceIndexes[7];
+ _globals._sequenceIndexes[6] = _scene->_sequences.startCycle(_globals._spriteIndexes[6], false, 11);
+ _scene->_sequences.setDepth(_globals._sequenceIndexes[6], 5);
+ _scene->_sequences.updateTimeout(_globals._sequenceIndexes[6], seqIdx);
+ _scene->_sequences.addTimer(20, 180);
+ }
+ break;
+
+ case 180:
+ _vm->_dialogs->showItem(OBJ_REPAIR_LIST, 40240);
+ _game._player._stepEnabled = true;
+ break;
+
+ default:
+ break;
+ }
+
+ if (_cutSceneNeeded && _cutSceneReady) {
+ _cutSceneNeeded = false;
+ _scene->_sequences.addTimer(20, 55);
+ _helgaReady = false;
+ _bartenderReady = false;
+ }
+
+ if (_vm->getRandomNumber(1, 25) == 1) {
+ if (_lightOn) {
+ _scene->_sequences.remove(_globals._sequenceIndexes[0]);
+ _lightOn = false;
+ } else {
+ _globals._sequenceIndexes[0] = _scene->_sequences.startCycle(_globals._spriteIndexes[0], false, 1);
+ _lightOn = true;
+ }
+ }
+
+ if (!_blowingSmoke && (_vm->getRandomNumber(1, 300) == 1)) {
+ _globals._sequenceIndexes[1] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[1], false, 8, 1, 0, 0);
+ _scene->_sequences.setAnimRange(_globals._sequenceIndexes[1], 1, 14);
+ _scene->_sequences.setDepth(_globals._sequenceIndexes[1], 14);
+ _scene->_sequences.addSubEntry(_globals._sequenceIndexes[1], SEQUENCE_TRIGGER_EXPIRE, 0, 30);
+ _blowingSmoke = true;
+ }
+
+ switch (_game._trigger) {
+ case 30:
+ _globals._sequenceIndexes[1] = _scene->_sequences.addReverseSpriteCycle(_globals._spriteIndexes[1], false, 8, 1, 0, 0);
+ _scene->_sequences.setAnimRange(_globals._sequenceIndexes[1], 1, 5);
+ _scene->_sequences.setDepth(_globals._sequenceIndexes[1], 14);
+ _scene->_sequences.addSubEntry(_globals._sequenceIndexes[1],SEQUENCE_TRIGGER_EXPIRE, 0, 31);
+ break;
+
+ case 31:
+ _blowingSmoke = false;
+ break;
+ }
+
+ if (!_leftWomanMoving) {
+ if (_vm->getRandomNumber(1, 1000) == 1) {
+ switch (_vm->getRandomNumber(1, 2)) {
+ case 1:
+ _globals._sequenceIndexes[2] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[2], false, 12, 1, 0, 0);
+ _scene->_sequences.setAnimRange(_globals._sequenceIndexes[2], 1, 8);
+ _scene->_sequences.addSubEntry(_globals._sequenceIndexes[2], SEQUENCE_TRIGGER_EXPIRE, 0, 33);
+ _leftWomanMoving = true;
+ break;
+
+ case 2:
+ _globals._sequenceIndexes[2] = _scene->_sequences.startCycle(_globals._spriteIndexes[2], false, 1);
+ _scene->_sequences.addTimer(12, 35);
+ _leftWomanMoving = true;
+ break;
+
+ default:
+ break;
+ }
+ }
+ }
+
+ switch (_game._trigger) {
+ case 33: {
+ int seqIdx = _globals._sequenceIndexes[2];
+ _globals._sequenceIndexes[2] = _scene->_sequences.startCycle(_globals._spriteIndexes[2], false, 9);
+ _scene->_sequences.updateTimeout(_globals._sequenceIndexes[2], seqIdx);
+ _scene->_sequences.addTimer(_vm->getRandomNumber(60, 250), 34);
+ }
+ break;
+
+ case 34:
+ _scene->_sequences.remove(_globals._sequenceIndexes[2]);
+ _globals._sequenceIndexes[2] = _scene->_sequences.addReverseSpriteCycle(_globals._spriteIndexes[2], false, 12, 1, 0, 0);
+ _scene->_sequences.setAnimRange(_globals._sequenceIndexes[2], 1, 8);
+ _scene->_sequences.addSubEntry(_globals._sequenceIndexes[2], SEQUENCE_TRIGGER_EXPIRE, 0, 38);
+ break;
+
+ case 35:
+ _scene->_sequences.remove(_globals._sequenceIndexes[2]);
+ _globals._sequenceIndexes[2] = _scene->_sequences.startCycle(_globals._spriteIndexes[2], false, 2);
+ _scene->_sequences.addTimer(_vm->getRandomNumber(60, 300), 36);
+ break;
+
+ case 36:
+ _scene->_sequences.remove(_globals._sequenceIndexes[2]);
+ _globals._sequenceIndexes[2] = _scene->_sequences.startCycle(_globals._spriteIndexes[2], false, 1);
+ _scene->_sequences.addTimer(12, 37);
+ break;
+
+ case 37:
+ _scene->_sequences.remove(_globals._sequenceIndexes[2]);
+ _leftWomanMoving = false;
+ break;
+
+ case 38:
+ _leftWomanMoving = false;
+ break;
+
+ default:
+ break;
+ }
+
+ if (!_rightWomanMoving) {
+ if (_vm->getRandomNumber(1, 300) == 1) {
+ switch (_vm->getRandomNumber(1, 4)) {
+ case 1:
+ _globals._sequenceIndexes[3] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[3], false, 12, 1, 0, 0);
+ _scene->_sequences.setAnimRange(_globals._sequenceIndexes[3], 1, 4);
+ _scene->_sequences.addSubEntry(_globals._sequenceIndexes[3], SEQUENCE_TRIGGER_EXPIRE, 0, 32);
+ _rightWomanMoving = true;
+ break;
+
+ case 2:
+ _globals._sequenceIndexes[3] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[3], false, 12, 2, 0, 0);
+ _scene->_sequences.setAnimRange(_globals._sequenceIndexes[3], 4, 5);
+ _scene->_sequences.addSubEntry(_globals._sequenceIndexes[3], SEQUENCE_TRIGGER_EXPIRE, 0, 32);
+ _rightWomanMoving = true;
+ break;
+
+ case 3:
+ _globals._sequenceIndexes[3] = _scene->_sequences.startReverseCycle(_globals._spriteIndexes[3], false, 12, 2, 0, 0);
+ _scene->_sequences.setAnimRange(_globals._sequenceIndexes[3], 4, 5);
+ _scene->_sequences.addSubEntry(_globals._sequenceIndexes[3], SEQUENCE_TRIGGER_EXPIRE, 0, 32);
+ _rightWomanMoving = true;
+ break;
+
+ case 4:
+ _globals._sequenceIndexes[3] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[3], false, 12, 2, 0, 0);
+ _scene->_sequences.setAnimRange(_globals._sequenceIndexes[3], 3, 4);
+ _scene->_sequences.addSubEntry(_globals._sequenceIndexes[3], SEQUENCE_TRIGGER_EXPIRE, 0, 32);
+ _rightWomanMoving = true;
+ break;
+
+ default:
+ break;
+ }
+ }
+ }
+
+ if (_game._trigger == 32)
+ _rightWomanMoving = false;
+
+ if (_scene->_activeAnimation->getCurrentFrame() == 1) {
+ switch (_vm->getRandomNumber(1, 50)) {
+ case 1:
+ _scene->_activeAnimation->setCurrentFrame(2);
+ break;
+
+ case 2:
+ _scene->_activeAnimation->setCurrentFrame(7);
+ break;
+
+ case 3:
+ _scene->_activeAnimation->setCurrentFrame(11);
+ break;
+
+ default:
+ _scene->_activeAnimation->setCurrentFrame(0);
+ break;
+ }
+ }
+
+ if ((_scene->_activeAnimation->getCurrentFrame() == 4) && (_drinkTimer < 10)) {
+ ++ _drinkTimer;
+ _scene->_activeAnimation->setCurrentFrame(3);
+ }
+
+ if (_drinkTimer == 10) {
+ _drinkTimer = 0;
+ _scene->_activeAnimation->setCurrentFrame(4);
+ _scene->_activeAnimation->_currentFrame = 5;
+ }
+
+
+ switch (_scene->_activeAnimation->getCurrentFrame()) {
+ case 6:
+ case 10:
+ case 14:
+ _scene->_activeAnimation->setCurrentFrame(0);
+ break;
+
+ default:
+ break;
+ }
+
+ switch (_game._trigger) {
+ case 39:
+ _scene->_kernelMessages.reset();
+ _scene->_kernelMessages.add(Common::Point(89, 67), 0xFDFC, 32, 0, 120, _game.getQuote(0x1D8));
+ _scene->_sequences.addTimer(150, 40);
+ break;
+
+ case 40:
+ _scene->_kernelMessages.add(Common::Point(89, 67), 0xFDFC, 32, 0, 120, _game.getQuote(0x1D9));
+ _scene->_sequences.addTimer(150, 41);
+ break;
+
+ case 41:
+ _scene->_kernelMessages.add(Common::Point(89, 67), 0xFDFC, 32, 0, 120, _game.getQuote(0x1DA));
+ _game._player._stepEnabled = true;
+ break;
+
+ case 42:
+ _scene->_kernelMessages.reset();
+ _scene->_kernelMessages.add(Common::Point(89, 67), 0xFDFC, 32, 0, 120, _game.getQuote(0x1DC));
+ _scene->_sequences.addTimer(150, 43);
+ break;
+
+ case 43:
+ _scene->_kernelMessages.add(Common::Point(89, 67), 0xFDFC, 32, 0, 120, _game.getQuote(0x1DD));
+ _game._player._stepEnabled = true;
+ break;
+
+ case 44:
+ _game._player._stepEnabled = true;
+ break;
+
+ default:
+ break;
+ }
+
+ switch (_game._trigger) {
+ case 55:
+ if (_bartenderHandsHips) {
+ _scene->_sequences.remove(_globals._sequenceIndexes[10]);
+ _bartenderHandsHips = false;
+ _globals._sequenceIndexes[9] = _scene->_sequences.startCycle(_globals._spriteIndexes[9], false, 1);
+ int idx = _scene->_dynamicHotspots.add(NOUN_BARTENDER, VERB_WALKTO, _globals._sequenceIndexes[9], Common::Rect(0, 0, 0, 0));
+ _scene->_dynamicHotspots.setPosition(idx, Common::Point(228, 83), FACING_SOUTH);
+ _bartenderSteady = true;
+ _scene->_sequences.setDepth(_globals._sequenceIndexes[9], 8);
+ } else if (_bartenderLooksLeft) {
+ _scene->_sequences.remove(_globals._sequenceIndexes[11]);
+ _bartenderLooksLeft = false;
+ _globals._sequenceIndexes[9] = _scene->_sequences.startCycle(_globals._spriteIndexes[9], false, 1);
+ int idx = _scene->_dynamicHotspots.add(NOUN_BARTENDER, VERB_WALKTO, _globals._sequenceIndexes[9], Common::Rect(0, 0, 0, 0));
+ _scene->_dynamicHotspots.setPosition(idx, Common::Point(228, 83), FACING_SOUTH);
+ _bartenderSteady = true;
+ _scene->_sequences.setDepth(_globals._sequenceIndexes[9], 8);
+ }
+ _game._player._stepEnabled = false;
+ _scene->_kernelMessages.reset();
+ _scene->_kernelMessages.add(Common::Point(180, 47), 0xFBFA, 0, 0, 100, _game.getQuote(0x1FE));
+ _scene->_sequences.addTimer(120, 56);
+ break;
+
+ case 56:
+ _scene->_sequences.remove(_globals._sequenceIndexes[13]);
+ _globals._sequenceIndexes[13] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[13], false, 10, 1, 0, 0);
+ _scene->_sequences.setAnimRange(_globals._sequenceIndexes[13], 2, 5);
+ _scene->_sequences.setDepth(_globals._sequenceIndexes[13], 8);
+ _scene->_sequences.addSubEntry(_globals._sequenceIndexes[13], SEQUENCE_TRIGGER_EXPIRE, 0, 57);
+ break;
+
+ case 57: {
+ int seqIdx = _globals._sequenceIndexes[13];
+ _scene->_sequences.remove(_globals._sequenceIndexes[20]);
+ _globals._sequenceIndexes[13] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[13], false, 10, 1, 0, 0);
+ _scene->_sequences.setAnimRange(_globals._sequenceIndexes[13], 6, 9);
+ _scene->_sequences.setDepth(_globals._sequenceIndexes[13], 8);
+ _scene->_sequences.updateTimeout(_globals._sequenceIndexes[13], seqIdx);
+ _scene->_sequences.addSubEntry(_globals._sequenceIndexes[13], SEQUENCE_TRIGGER_EXPIRE, 0, 58);
+ }
+ break;
+
+ case 58: {
+ int seqIdx = _globals._sequenceIndexes[13];
+ _globals._sequenceIndexes[13] = _scene->_sequences.addReverseSpriteCycle(_globals._spriteIndexes[13], false, 10, 1, 0, 0);
+ _scene->_sequences.setAnimRange(_globals._sequenceIndexes[13], 5, 9);
+ _scene->_sequences.setDepth(_globals._sequenceIndexes[13], 8);
+ _scene->_sequences.updateTimeout(_globals._sequenceIndexes[13], seqIdx);
+ _scene->_sequences.addSubEntry(_globals._sequenceIndexes[13], SEQUENCE_TRIGGER_EXPIRE, 0, 59);
+ }
+ break;
+
+ case 59: {
+ int seqIdx = _globals._sequenceIndexes[13];
+ _globals._sequenceIndexes[13] = _scene->_sequences.addReverseSpriteCycle(_globals._spriteIndexes[13], false, 10, 1, 0, 0);
+ _scene->_sequences.setAnimRange(_globals._sequenceIndexes[13], 1, 4);
+ _scene->_sequences.setDepth(_globals._sequenceIndexes[13], 8);
+ _scene->_sequences.updateTimeout(_globals._sequenceIndexes[13], seqIdx);
+ _scene->_sequences.addSubEntry(_globals._sequenceIndexes[13], SEQUENCE_TRIGGER_EXPIRE, 0, 60);
+ _globals._sequenceIndexes[20] = _scene->_sequences.startCycle(_globals._spriteIndexes[20], false, 1);
+ _scene->_sequences.setDepth(_globals._sequenceIndexes[20], 8);
+ _scene->_sequences.setPosition(_globals._sequenceIndexes[20], Common::Point(234, 72));
+ }
+ break;
+
+ case 60: {
+ int seqIdx = _globals._sequenceIndexes[13];
+ _globals._sequenceIndexes[13] = _scene->_sequences.startCycle(_globals._spriteIndexes[13], false, 2);
+ _scene->_sequences.updateTimeout(_globals._sequenceIndexes[13], seqIdx);
+ _scene->_sequences.setDepth(_globals._sequenceIndexes[13], 8);
+ _scene->_sequences.addTimer(10, 61);
+ }
+ break;
+
+ case 61:
+ _scene->_kernelMessages.reset();
+ _scene->_kernelMessages.add(Common::Point(181, 33), 0xFBFA, 0, 0, 130, _game.getQuote(0x1FF));
+ _scene->_kernelMessages.add(Common::Point(171, 47), 0xFBFA, 0, 0, 130, _game.getQuote(0x200));
+ _scene->_sequences.addTimer(150, 63);
+ _scene->_sequences.remove(_globals._sequenceIndexes[13]);
+ _globals._sequenceIndexes[13] = _scene->_sequences.startReverseCycle(_globals._spriteIndexes[13], false, 30, 4, 0, 0);
+ _scene->_sequences.setAnimRange(_globals._sequenceIndexes[13], 10, 11);
+ _scene->_sequences.setDepth(_globals._sequenceIndexes[13], 8);
+ _scene->_sequences.addSubEntry(_globals._sequenceIndexes[13], SEQUENCE_TRIGGER_EXPIRE, 0, 62);
+ break;
+
+ case 62: {
+ int seqIdx = _globals._sequenceIndexes[13];
+ _globals._sequenceIndexes[13] = _scene->_sequences.startCycle(_globals._spriteIndexes[13], false, 2);
+ _scene->_sequences.updateTimeout(_globals._sequenceIndexes[13], seqIdx);
+ _scene->_sequences.setDepth(_globals._sequenceIndexes[13], 8);
+ }
+ break;
+
+ case 63:
+ _scene->_kernelMessages.reset();
+ _scene->_kernelMessages.add(Common::Point(160, 33), 0xFBFA, 0, 0, 130, _game.getQuote(0x201));
+ _scene->_kernelMessages.add(Common::Point(165, 47), 0xFBFA, 0, 0, 130, _game.getQuote(0x202));
+ _scene->_sequences.addTimer(150, 64);
+ break;
+
+ case 64:
+ _scene->_kernelMessages.reset();
+ _scene->_kernelMessages.add(Common::Point(210, 27), 0xFDFC, 0, 0, 130, _game.getQuote(0x1E0));
+ _scene->_kernelMessages.add(Common::Point(198, 41), 0xFDFC, 0, 0, 130, _game.getQuote(0x1E1));
+ _scene->_sequences.addTimer(150, 65);
+ _scene->_sequences.addTimer(1, 100);
+ _talkTimer = 1130;
+ break;
+
+ case 65:
+ _vm->_sound->command(30);
+ _globals._sequenceIndexes[16] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[16], false, 10, 1, 0, 0);
+ _scene->_sequences.setAnimRange(_globals._sequenceIndexes[16], 1, 6);
+ _scene->_sequences.setDepth(_globals._sequenceIndexes[16], 9);
+ _scene->_sequences.addSubEntry(_globals._sequenceIndexes[16], SEQUENCE_TRIGGER_EXPIRE, 0, 66);
+ break;
+
+ case 66: {
+ int seqIdx = _globals._sequenceIndexes[16];
+ _globals._sequenceIndexes[16] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[16], false, 10, 1, 0, 0);
+ _scene->_sequences.setAnimRange(_globals._sequenceIndexes[16], 7, 37);
+ _scene->_sequences.setDepth(_globals._sequenceIndexes[16], 9);
+ _scene->_sequences.updateTimeout(_globals._sequenceIndexes[16], seqIdx);
+ _scene->_sequences.addSubEntry(_globals._sequenceIndexes[16], SEQUENCE_TRIGGER_EXPIRE, 0, 68);
+
+ _scene->_sequences.remove(_globals._sequenceIndexes[13]);
+ _globals._sequenceIndexes[13] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[13], false, 10, 1, 0, 0);
+ _scene->_sequences.setAnimRange(_globals._sequenceIndexes[13], 12, 13);
+ _scene->_sequences.setDepth(_globals._sequenceIndexes[13], 8);
+ _scene->_sequences.addSubEntry(_globals._sequenceIndexes[13], SEQUENCE_TRIGGER_EXPIRE, 0, 67);
+ }
+ break;
+
+ case 67: {
+ int seqIdx = _globals._sequenceIndexes[13];
+ _globals._sequenceIndexes[13] = _scene->_sequences.startCycle(_globals._spriteIndexes[13], false, 13);
+ _scene->_sequences.updateTimeout(_globals._sequenceIndexes[13], seqIdx);
+ _scene->_sequences.setDepth(_globals._sequenceIndexes[13], 8);
+ }
+ break;
+
+ case 68:
+ _scene->_sequences.remove(_globals._sequenceIndexes[13]);
+ _globals._sequenceIndexes[13] = _scene->_sequences.addReverseSpriteCycle(_globals._spriteIndexes[13], false, 10, 1, 0, 0);
+ _scene->_sequences.setAnimRange(_globals._sequenceIndexes[13], 12, 13);
+ _scene->_sequences.setDepth(_globals._sequenceIndexes[13], 8);
+ _scene->_sequences.addSubEntry(_globals._sequenceIndexes[13], SEQUENCE_TRIGGER_EXPIRE, 0, 69);
+ break;
+
+ case 69: {
+ int seqIdx = _globals._sequenceIndexes[13];
+ _globals._sequenceIndexes[13] = _scene->_sequences.startReverseCycle(_globals._spriteIndexes[13], false, 25, 4, 0, 0);
+ _scene->_sequences.setAnimRange(_globals._sequenceIndexes[13], 10, 11);
+ _scene->_sequences.setDepth(_globals._sequenceIndexes[13], 8);
+ _scene->_sequences.updateTimeout(_globals._sequenceIndexes[13], seqIdx);
+
+ _scene->_kernelMessages.reset();
+ _scene->_kernelMessages.add(Common::Point(179, 33), 0xFBFA, 0, 0, 130, _game.getQuote(0x203));
+ _scene->_kernelMessages.add(Common::Point(167, 47), 0xFBFA, 0, 0, 130, _game.getQuote(0x204));
+ _scene->_sequences.addTimer(150, 71);
+ _scene->_sequences.addSubEntry(_globals._sequenceIndexes[13], SEQUENCE_TRIGGER_EXPIRE, 0, 70);
+ }
+ break;
+
+ case 70:
+ _globals._sequenceIndexes[13] = _scene->_sequences.startReverseCycle(_globals._spriteIndexes[13], false, 25, 4, 0, 0);
+ _scene->_sequences.setAnimRange(_globals._sequenceIndexes[13], 10, 12);
+ _scene->_sequences.setDepth(_globals._sequenceIndexes[13], 8);
+ _scene->_sequences.addSubEntry(_globals._sequenceIndexes[13], SEQUENCE_TRIGGER_EXPIRE, 0, 72);
+ break;
+
+ case 71:
+ _scene->_sequences.addTimer(210, 73);
+ _scene->_kernelMessages.reset();
+ _scene->_kernelMessages.add(Common::Point(168, 33), 0xFBFA, 0, 0, 180, _game.getQuote(0x205));
+ _scene->_kernelMessages.add(Common::Point(151, 47), 0xFBFA, 0, 0, 180, _game.getQuote(0x206));
+ if (!_game._objects.isInInventory(OBJ_REPAIR_LIST))
+ _activeArrows = true;
+ break;
+
+ case 72: {
+ int seqIdx = _globals._sequenceIndexes[13];
+ _globals._sequenceIndexes[13] = _scene->_sequences.startCycle(_globals._spriteIndexes[13], false, 2);
+ _scene->_sequences.updateTimeout(_globals._sequenceIndexes[13], seqIdx);
+ _scene->_sequences.setDepth(_globals._sequenceIndexes[13], 8);
+ }
+ break;
+
+ case 73:
+ _scene->_kernelMessages.reset();
+ _scene->_kernelMessages.add(Common::Point(177, 33), 0xFBFA, 0, 0, 150, _game.getQuote(0x207));
+ _scene->_kernelMessages.add(Common::Point(172, 47), 0xFBFA, 0, 0, 150, _game.getQuote(0x208));
+ _bartenderSteady = true;
+ _game._player._stepEnabled = true;
+ _helgaReady = true;
+ _bartenderReady = true;
+ _globals[kBeenThruHelgaScene] = true;
+ _activeArrows = false;
+ break;
+
+ default:
+ break;
+ }
+
+ if (_helgaReady) {
+ int rndVal = _vm->getRandomNumber(1, 1000);
+ if (rndVal < 6)
+ switch (rndVal) {
+ case 1:
+ _cutSceneReady = false;
+ _helgaReady = false;
+ _scene->_sequences.remove(_globals._sequenceIndexes[13]);
+ _globals._sequenceIndexes[13] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[13], false, 10, 1, 0, 0);
+ _scene->_sequences.setAnimRange(_globals._sequenceIndexes[13], 2, 5);
+ _scene->_sequences.setDepth(_globals._sequenceIndexes[13], 8);
+ _scene->_sequences.addSubEntry(_globals._sequenceIndexes[13], SEQUENCE_TRIGGER_EXPIRE, 0, 82);
+ break;
+
+ case 2:
+ _cutSceneReady = false;
+ _helgaReady = false;
+ _scene->_sequences.remove(_globals._sequenceIndexes[13]);
+ _globals._sequenceIndexes[13] = _scene->_sequences.startReverseCycle(_globals._spriteIndexes[13], false, 15, 2, 0, 0);
+ _scene->_sequences.setAnimRange(_globals._sequenceIndexes[13], 11, 13);
+ _scene->_sequences.setDepth(_globals._sequenceIndexes[13], 8);
+ _scene->_sequences.addSubEntry(_globals._sequenceIndexes[13], SEQUENCE_TRIGGER_EXPIRE, 0, 26);
+ break;
+
+ case 3:
+ _cutSceneReady = false;
+ _helgaReady = false;
+ _scene->_sequences.remove(_globals._sequenceIndexes[13]);
+ _globals._sequenceIndexes[13] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[13], false, 10, 1, 0, 0);
+ _scene->_sequences.setAnimRange(_globals._sequenceIndexes[13], 10, 11);
+ _scene->_sequences.setDepth(_globals._sequenceIndexes[13], 8);
+ _scene->_sequences.addSubEntry(_globals._sequenceIndexes[13], SEQUENCE_TRIGGER_EXPIRE, 0, 26);
+ break;
+
+ case 4:
+ _cutSceneReady = false;
+ _helgaReady = false;
+ _scene->_sequences.remove(_globals._sequenceIndexes[13]);
+ _globals._sequenceIndexes[13] = _scene->_sequences.startReverseCycle(_globals._spriteIndexes[13], false, 15, 2, 0, 0);
+ _scene->_sequences.setAnimRange(_globals._sequenceIndexes[13], 14, 15);
+ _scene->_sequences.setDepth(_globals._sequenceIndexes[13], 8);
+ _scene->_sequences.addSubEntry(_globals._sequenceIndexes[13], SEQUENCE_TRIGGER_EXPIRE, 0, 26);
+ break;
+
+ case 5:
+ _cutSceneReady = false;
+ _helgaReady = false;
+ _scene->_sequences.remove(_globals._sequenceIndexes[13]);
+ _globals._sequenceIndexes[13] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[13], false, 10, 1, 0, 0);
+ _scene->_sequences.setAnimRange(_globals._sequenceIndexes[13], 16, 19);
+ _scene->_sequences.setDepth(_globals._sequenceIndexes[13], 8);
+ _scene->_sequences.addSubEntry(_globals._sequenceIndexes[13], SEQUENCE_TRIGGER_EXPIRE, 0, 80);
+ break;
+
+ default:
+ break;
+ }
+ }
+
+ if (_game._trigger == 80) {
+ int seqIdx = _globals._sequenceIndexes[13];
+ _globals._sequenceIndexes[13] = _scene->_sequences.startCycle(_globals._spriteIndexes[13], false, 19);
+ _scene->_sequences.updateTimeout(_globals._sequenceIndexes[13], seqIdx);
+ _scene->_sequences.setDepth(_globals._sequenceIndexes[13], 8);
+ _scene->_sequences.addTimer(_vm->getRandomNumber(60, 120), 81);
+ }
+
+ if (_game._trigger == 81) {
+ _scene->_sequences.remove(_globals._sequenceIndexes[13]);
+ _globals._sequenceIndexes[13] = _scene->_sequences.addReverseSpriteCycle(_globals._spriteIndexes[13], false, 10, 1, 0, 0);
+ _scene->_sequences.setAnimRange(_globals._sequenceIndexes[13], 16, 19);
+ _scene->_sequences.setDepth(_globals._sequenceIndexes[13], 8);
+ _scene->_sequences.addSubEntry(_globals._sequenceIndexes[13], SEQUENCE_TRIGGER_EXPIRE, 0, 26);
+ }
+
+ if (_game._trigger == 26) {
+ int seqIdx = _globals._sequenceIndexes[13];
+ _globals._sequenceIndexes[13] = _scene->_sequences.startCycle(_globals._spriteIndexes[13], false, 2);
+ _scene->_sequences.updateTimeout(_globals._sequenceIndexes[13], seqIdx);
+ _scene->_sequences.setDepth(_globals._sequenceIndexes[13], 8);
+ _cutSceneReady = true;
+
+ if (!_cutSceneNeeded)
+ _helgaReady = true;
+ }
+
+ if (_game._trigger == 82) {
+ _scene->_sequences.remove(_globals._sequenceIndexes[20]);
+ int seqIdx = _globals._sequenceIndexes[13];
+ _globals._sequenceIndexes[13] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[13], false, 10, 1, 0, 0);
+ _scene->_sequences.setAnimRange(_globals._sequenceIndexes[13], 6, 9);
+ _scene->_sequences.setDepth(_globals._sequenceIndexes[13], 8);
+ _scene->_sequences.updateTimeout(_globals._sequenceIndexes[13], seqIdx);
+ _scene->_sequences.addSubEntry(_globals._sequenceIndexes[13], SEQUENCE_TRIGGER_EXPIRE, 0, 83);
+ }
+
+ if (_game._trigger == 83) {
+ int seqIdx = _globals._sequenceIndexes[13];
+ _globals._sequenceIndexes[13] = _scene->_sequences.addReverseSpriteCycle(_globals._spriteIndexes[13], false, 10, 1, 0, 0);
+ _scene->_sequences.setAnimRange(_globals._sequenceIndexes[13], 5, 9);
+ _scene->_sequences.setDepth(_globals._sequenceIndexes[13], 8);
+ _scene->_sequences.updateTimeout(_globals._sequenceIndexes[13], seqIdx);
+ _scene->_sequences.addSubEntry(_globals._sequenceIndexes[13], SEQUENCE_TRIGGER_EXPIRE, 0, 84);
+ }
+
+ if (_game._trigger == 84) {
+ int seqIdx = _globals._sequenceIndexes[13];
+ _globals._sequenceIndexes[13] = _scene->_sequences.addReverseSpriteCycle(_globals._spriteIndexes[13], false, 10, 1, 0, 0);
+ _scene->_sequences.setAnimRange(_globals._sequenceIndexes[13], 1, 4);
+ _scene->_sequences.setDepth(_globals._sequenceIndexes[13], 8);
+ _scene->_sequences.updateTimeout(_globals._sequenceIndexes[13], seqIdx);
+ _scene->_sequences.addSubEntry(_globals._sequenceIndexes[13], SEQUENCE_TRIGGER_EXPIRE, 0, 85);
+
+ _globals._sequenceIndexes[20] = _scene->_sequences.startCycle(_globals._spriteIndexes[20], false, 1);
+ _scene->_sequences.setDepth(_globals._sequenceIndexes[20], 8);
+ _scene->_sequences.setPosition(_globals._sequenceIndexes[20], Common::Point(234, 72));
+ }
+
+ if (_game._trigger == 85) {
+ int seqIdx = _globals._sequenceIndexes[13];
+ _globals._sequenceIndexes[13] = _scene->_sequences.startCycle(_globals._spriteIndexes[13], false, 2);
+ _scene->_sequences.updateTimeout(_globals._sequenceIndexes[13], seqIdx);
+ _scene->_sequences.setDepth(_globals._sequenceIndexes[13], 8);
+ _cutSceneReady = true;
+ if (!_cutSceneNeeded)
+ _helgaReady = true;
+ }
+
+ if (_game._trigger == 102) {
+ _scene->_sequences.remove(_globals._sequenceIndexes[6]);
+ _game._player._priorTimer = _scene->_frameStartTime - _game._player._ticksAmount;
+ _globals._sequenceIndexes[7] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[7], false, 8, 1, 0, 0);
+ _scene->_sequences.setAnimRange(_globals._sequenceIndexes[7], 14, 18);
+ _scene->_sequences.setDepth(_globals._sequenceIndexes[7], 5);
+ _scene->_sequences.addSubEntry(_globals._sequenceIndexes[7], SEQUENCE_TRIGGER_EXPIRE, 0, 103);
+ } else if (_game._trigger == 103) {
+ _game._player._priorTimer = _scene->_frameStartTime + _game._player._ticksAmount;
+ _roxOnStool = false;
+ _game._player._facing = FACING_SOUTH;
+ _game._player.selectSeries();
+ _game._player._visible = true;
+ _game._player._stepEnabled = true;
+ _game._player._readyToWalk = true;
+ }
+
+ if (_activeArrows) {
+ if (!_activeArrow1) {
+ _globals._sequenceIndexes[17] = _scene->_sequences.startCycle(_globals._spriteIndexes[17], false, 1);
+ _scene->_sequences.setDepth(_globals._sequenceIndexes[17], 1);
+ _scene->_sequences.addTimer(_vm->getRandomNumber(10, 15), 49);
+ _activeArrow1 = true;
+ }
+
+ if (!_activeArrow2) {
+ _globals._sequenceIndexes[18] = _scene->_sequences.startCycle(_globals._spriteIndexes[18], false, 1);
+ _scene->_sequences.setDepth(_globals._sequenceIndexes[18], 1);
+ _scene->_sequences.addTimer(_vm->getRandomNumber(10, 15), 50);
+ _activeArrow2 = true;
+ }
+
+ if (!_activeArrow3) {
+ _globals._sequenceIndexes[19] = _scene->_sequences.startCycle(_globals._spriteIndexes[19], false, 1);
+ _scene->_sequences.setDepth(_globals._sequenceIndexes[19], 1);
+ _scene->_sequences.addTimer(_vm->getRandomNumber(10, 15), 51);
+ _activeArrow3 = true;
+ }
+ }
+
+ if (_game._trigger == 49) {
+ _scene->_sequences.remove(_globals._sequenceIndexes[17]);
+ _scene->_sequences.addTimer(_vm->getRandomNumber(10, 15), 45);
+ }
+
+ if (_game._trigger == 45)
+ _activeArrow1 = false;
+
+ if (_game._trigger == 50) {
+ _scene->_sequences.remove(_globals._sequenceIndexes[18]);
+ _scene->_sequences.addTimer(_vm->getRandomNumber(10, 15), 46);
+ }
+
+ if (_game._trigger == 46)
+ _activeArrow2 = false;
+
+ if (_game._trigger == 51) {
+ _scene->_sequences.remove(_globals._sequenceIndexes[19]);
+ _scene->_sequences.addTimer(_vm->getRandomNumber(10, 15), 47);
+ }
+
+ if (_game._trigger == 47)
+ _activeArrow3 = false;
+}
+
+void Scene402::preActions() {
+ if (_action.isAction(VERB_SIT_ON, NOUN_BAR_STOOL) && (_game._player._prepareWalkPos.x != 248))
+ _game._player.walk(Common::Point(232, 112), FACING_EAST);
+
+ if (_action.isAction(VERB_WALKTO, NOUN_WOMAN_ON_BALCONY))
+ _game._player._needToWalk = _game._player._readyToWalk;
+
+ if (!_roxOnStool && _action.isAction(VERB_TAKE, NOUN_CREDIT_CHIP) && !_game._objects.isInInventory(OBJ_CREDIT_CHIP))
+ _game._player.walk(Common::Point(246, 108), FACING_NORTH);
+
+ if (_action.isAction(VERB_TAKE))
+ _game._player._needToWalk = false;
+
+ if (_action.isAction(VERB_TAKE, NOUN_CREDIT_CHIP) && !_roxOnStool)
+ _game._player._needToWalk = true;
+
+ if (_roxOnStool) {
+ if (_action.isAction(VERB_LOOK) || _action.isObject(NOUN_BAR_STOOL) || _action.isAction(VERB_TALKTO))
+ _game._player._needToWalk = false;
+
+ if (_action.isAction(VERB_TAKE, NOUN_REPAIR_LIST) || _action.isAction(VERB_TAKE, NOUN_CREDIT_CHIP))
+ _game._player._needToWalk = false;
+
+ if (_action.isAction(VERB_TALKTO, NOUN_WOMAN_IN_CHAIR) || _action.isAction(VERB_TALKTO, NOUN_WOMAN_IN_ALCOVE))
+ _game._player._needToWalk = _game._player._readyToWalk;
+
+ if (_game._player._needToWalk) {
+ _game._player._facing = FACING_SOUTH;
+ _game._player._readyToWalk = false;
+ _game._player._stepEnabled = false;
+ _game._triggerSetupMode = SEQUENCE_TRIGGER_DAEMON;
+ _scene->_sequences.addTimer(1, 102);
+ }
+ }
+
+ if (_action.isAction(VERB_TAKE, NOUN_REPAIR_LIST) && !_roxOnStool && !_game._objects.isInInventory(OBJ_REPAIR_LIST))
+ _game._player.walk(Common::Point(191, 99), FACING_NORTHEAST);
+
+ if (_action.isAction(VERB_TALKTO, NOUN_BARTENDER) && !_roxOnStool)
+ _game._player.walk(Common::Point(228, 83), FACING_SOUTH);
+
+ if (_action.isAction(VERB_TALKTO, NOUN_REPAIR_WOMAN) && !_roxOnStool)
+ _game._player.walk(Common::Point(208, 102), FACING_NORTHEAST);
+}
+
+void Scene402::actions() {
+ if (_action.isAction(VERB_TAKE, NOUN_REPAIR_LIST) && _game._objects.isInRoom(OBJ_REPAIR_LIST) && _roxOnStool) {
+ _game._triggerSetupMode = SEQUENCE_TRIGGER_DAEMON;
+ _scene->_sequences.addTimer(1, 77);
+ _game._player._needToWalk = false;
+ } else if (_action.isAction(VERB_TAKE, NOUN_REPAIR_LIST) && _game._objects.isInRoom(OBJ_REPAIR_LIST) && !_roxOnStool) {
+ if (_game._trigger == 0) {
+ _game._player._stepEnabled = false;
+ _game._player._visible = false;
+ _globals._sequenceIndexes[21] = _scene->_sequences.startReverseCycle(_globals._spriteIndexes[21], false, 7, 2, 0, 0);
+ _scene->_sequences.setAnimRange(_globals._sequenceIndexes[21], 1, 2);
+ _scene->_sequences.setMsgLayout(_globals._sequenceIndexes[21]);
+ _scene->_sequences.addSubEntry(_globals._sequenceIndexes[21], SEQUENCE_TRIGGER_SPRITE, 2, 165);
+ _scene->_sequences.addSubEntry(_globals._sequenceIndexes[21], SEQUENCE_TRIGGER_EXPIRE, 0, 166);
+ } else if (_game._trigger == 165) {
+ _scene->_sequences.remove(_globals._sequenceIndexes[14]);
+ _game._objects.addToInventory(OBJ_REPAIR_LIST);
+ }
+ } else if (_game._trigger == 166) {
+ _game._player._priorTimer = _scene->_frameStartTime + _game._player._ticksAmount;
+ _game._player._visible = true;
+ _scene->_sequences.addTimer(20, 167);
+ } else if (_game._trigger == 167) {
+ _vm->_dialogs->showItem(OBJ_REPAIR_LIST, 40240);
+ _game._player._stepEnabled = true;
+ } else if (_game._screenObjects._inputMode == kInputConversation)
+ handleDialogs();
+ else if (_action.isAction(VERB_WALK_INTO, NOUN_CORRIDOR_TO_SOUTH))
+ _scene->_nextSceneId = 401;
+ else if (_action.isAction(VERB_WALK_ONTO, NOUN_DANCE_FLOOR))
+ ; // just... nothing
+ else if (_action.isAction(VERB_TALKTO, NOUN_REPAIR_WOMAN)) {
+ switch (_game._trigger) {
+ case 0: {
+ _game._player._stepEnabled = false;
+ int random = _vm->getRandomNumber(1, 3);
+ if (_helgaTalkMode == 0)
+ random = 1;
+
+ int centerFlag;
+ Common::Point centerPos;
+ if (_roxOnStool) {
+ centerFlag = 0;
+ centerPos = Common::Point(230, 56);
+ } else {
+ centerFlag = 2;
+ centerPos = Common::Point(0, 0);
+ }
+
+ switch (random) {
+ case 1:
+ _scene->_kernelMessages.add(centerPos, 0x1110, 32 | centerFlag, 0, 90, _game.getQuote(0x211));
+ _scene->_sequences.addTimer(110, 25);
+ break;
+
+ case 2:
+ _scene->_kernelMessages.add(centerPos, 0x1110, 32 | centerFlag, 0, 90, _game.getQuote(0x212));
+ _scene->_sequences.addTimer(110, 25);
+ break;
+
+ case 3:
+ _scene->_kernelMessages.add(centerPos, 0x1110, 32 | centerFlag, 0, 90, _game.getQuote(0x213));
+ _scene->_sequences.addTimer(110, 25);
+ break;
+
+ default:
+ break;
+ }
+ }
+ break;
+
+ case 25:
+ switch (_helgaTalkMode) {
+ case 0:
+ _game._player._stepEnabled = false;
+ _helgaTalkMode = 1;
+ _scene->_kernelMessages.add(Common::Point(177, 33), 0xFBFA, 0, 0, 130, _game.getQuote(0x209));
+ _scene->_kernelMessages.add(Common::Point(182, 47), 0xFBFA, 0, 0, 130, _game.getQuote(0x20A));
+ _game._triggerSetupMode = SEQUENCE_TRIGGER_DAEMON;
+ _scene->_sequences.addTimer(130, 28);
+ break;
+
+ case 1:
+ _game._player._stepEnabled = false;
+ _helgaTalkMode = 2;
+ _scene->_kernelMessages.add(Common::Point(157, 47), 0xFBFA, 0, 0, 100, _game.getQuote(0x20B));
+ _game._triggerSetupMode = SEQUENCE_TRIGGER_DAEMON;
+ _scene->_sequences.addTimer(100, 28);
+ break;
+
+ case 2:
+ _game._player._stepEnabled = false;
+ _helgaTalkMode = 3;
+ _scene->_kernelMessages.add(Common::Point(172, 47), 0xFBFA, 0, 0, 100, _game.getQuote(0x20C));
+ _game._triggerSetupMode = SEQUENCE_TRIGGER_DAEMON;
+ _scene->_sequences.addTimer(100, 28);
+ break;
+
+ case 3:
+ _game._player._stepEnabled = true;
+ break;
+
+ default:
+ break;
+ }
+ break;
+ }
+ } else if (_action.isAction(VERB_TALKTO, NOUN_WOMAN_IN_CHAIR) && !_firstTalkToGirlInChair) {
+ _scene->_kernelMessages.add(Common::Point(0, 0), 0x1110, 34, 0, 120, _game.getQuote(0x1D7));
+ _game._triggerSetupMode = SEQUENCE_TRIGGER_DAEMON;
+ _scene->_sequences.addTimer(150, 39);
+ _game._player._stepEnabled = false;
+ _firstTalkToGirlInChair = true;
+ } else if (_action.isAction(VERB_TALKTO, NOUN_WOMAN_IN_CHAIR) && _firstTalkToGirlInChair) {
+ _scene->_kernelMessages.add(Common::Point(0, 0), 0x1110, 34, 0, 120, _game.getQuote(0x1DB));
+ _game._triggerSetupMode = SEQUENCE_TRIGGER_DAEMON;
+ _scene->_sequences.addTimer(150, 42);
+ _game._player._stepEnabled = false;
+ } else if (_action.isAction(VERB_TALKTO, NOUN_WOMAN_IN_ALCOVE) || _action.isAction(VERB_WALKTO, NOUN_WOMAN_IN_ALCOVE)) {
+ _scene->_kernelMessages.add(Common::Point(102, 48), 0xFBFA, 0, 0, 120, _game.getQuote(0x1DE));
+ _game._triggerSetupMode = SEQUENCE_TRIGGER_DAEMON;
+ _scene->_sequences.addTimer(120, 44);
+ _game._player._stepEnabled = false;
+ } else if (_action.isAction(VERB_SIT_ON, NOUN_BAR_STOOL) && (_game._player._targetPos.x == 248)){
+ _scene->_kernelMessages.add(Common::Point(0, -14), 0x1110, 34, 0, 120, _game.getQuote(0x20D));
+ _scene->_kernelMessages.add(Common::Point(0, 0), 0x1110, 34, 0, 120, _game.getQuote(0x20E));
+ } else if (_action.isAction(VERB_SIT_ON, NOUN_BAR_STOOL) && !_roxOnStool && (_game._player._targetPos.x != 248)) {
+ _game._player._visible = false;
+ _game._triggerSetupMode = SEQUENCE_TRIGGER_DAEMON;
+ _globals._sequenceIndexes[6] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[6], false, 7, 1, 0, 0);
+ _scene->_sequences.setAnimRange(_globals._sequenceIndexes[6], 1, 11);
+ _scene->_sequences.setDepth(_globals._sequenceIndexes[6], 5);
+ _scene->_sequences.addSubEntry(_globals._sequenceIndexes[6], SEQUENCE_TRIGGER_EXPIRE, 0, 76);
+ _game._player._stepEnabled = false;
+ } else if (_action.isAction(VERB_TAKE, NOUN_CREDIT_CHIP) && !_game._objects.isInInventory(OBJ_CREDIT_CHIP) && _roxOnStool) {
+ _roxMode = 20;
+ _game._triggerSetupMode = SEQUENCE_TRIGGER_DAEMON;
+ _scene->_sequences.addTimer(1, 92);
+ } else if (_action.isAction(VERB_TAKE, NOUN_CREDIT_CHIP) && !_game._objects.isInInventory(OBJ_CREDIT_CHIP) && !_roxOnStool) {
+ _game._triggerSetupMode = SEQUENCE_TRIGGER_DAEMON;
+ _game._player._stepEnabled = false;
+ _game._player._visible = false;
+ _globals._sequenceIndexes[22] = _scene->_sequences.startReverseCycle(_globals._spriteIndexes[22], false, 7, 2, 0, 0);
+ _scene->_sequences.setAnimRange(_globals._sequenceIndexes[22], 1, 2);
+ _scene->_sequences.setPosition(_globals._sequenceIndexes[22], Common::Point(_game._player._playerPos.x, _game._player._playerPos.y + 1));
+ _scene->_sequences.setDepth(_globals._sequenceIndexes[22], 5);
+ _scene->_sequences.setScale(_globals._sequenceIndexes[22], 88);
+ _game._triggerSetupMode = SEQUENCE_TRIGGER_DAEMON;
+ _scene->_sequences.addSubEntry(_globals._sequenceIndexes[22], SEQUENCE_TRIGGER_EXPIRE, 0, 104);
+ } else if (_action.isAction(VERB_TALKTO, NOUN_BARTENDER)) {
+ switch (_game._trigger) {
+ case 0: {
+ int centerFlag;
+ Common::Point centerPos;
+ if (_roxOnStool) {
+ centerFlag = 0;
+ centerPos = Common::Point(230, 56);
+ } else {
+ centerFlag = 2;
+ centerPos = Common::Point(0, 0);
+ }
+
+ _game._player._stepEnabled = false;
+ int quoteId;
+ if (_bartenderCalled) {
+ quoteId = 0x210;
+ } else {
+ quoteId = 0x20F;
+ _bartenderCalled = true;
+ }
+ _scene->_kernelMessages.reset();
+ _scene->_kernelMessages.add(centerPos, 0x1110, 32 | centerFlag, 0, 90, _game.getQuote(quoteId));
+ _scene->_sequences.addTimer(110, 29);
+ _game._triggerSetupMode = SEQUENCE_TRIGGER_DAEMON;
+ _scene->_sequences.addTimer(90, 28);
+ }
+ break;
+
+ case 29:
+ _scene->_kernelMessages.reset();
+ if (!_roxOnStool) {
+ if (_game._objects.isInRoom(OBJ_ALIEN_LIQUOR)) {
+ _scene->_kernelMessages.add(Common::Point(177, 41), 0xFDFC, 0, 0, 120, _game.getQuote(0x1DF));
+ _game._triggerSetupMode = SEQUENCE_TRIGGER_DAEMON;
+ _scene->_sequences.addTimer(1, 100);
+ _talkTimer = 120;
+ } else if (_rexMode == 0) {
+ _scene->_kernelMessages.add(Common::Point(175, 13), 0xFDFC, 0, 0, 180, _game.getQuote(0x1F9));
+ _scene->_kernelMessages.add(Common::Point(184, 27), 0xFDFC, 0, 0, 180, _game.getQuote(0x1FA));
+ _scene->_kernelMessages.add(Common::Point(200, 41), 0xFDFC, 0, 0, 180, _game.getQuote(0x1FB));
+ _game._triggerSetupMode = SEQUENCE_TRIGGER_DAEMON;
+ _scene->_sequences.addTimer(1, 100);
+ _talkTimer = 180;
+ _rexMode = 1;
+ } else if (_rexMode == 1) {
+ _scene->_kernelMessages.add(Common::Point(205, 41), 0xFDFC, 0, 0, 120, _game.getQuote(0x1FC));
+ _game._player._stepEnabled = true;
+ _game._triggerSetupMode = SEQUENCE_TRIGGER_DAEMON;
+ _scene->_sequences.addTimer(1, 100);
+ _talkTimer = 120;
+ _rexMode = 3;
+ } else {
+ _game._player._stepEnabled = true;
+ }
+ } else {
+ if (_game._objects.isInRoom(OBJ_ALIEN_LIQUOR)) {
+ if (!_refuseAlienLiquor) {
+ _scene->_kernelMessages.reset();
+ _scene->_kernelMessages.add(Common::Point(198, 27), 0xFDFC, 0, 0, 9999999, _game.getQuote(0x1E2));
+ _scene->_kernelMessages.add(Common::Point(199, 41), 0xFDFC, 0, 0, 9999999, _game.getQuote(0x1E3));
+ _bartenderCurrentQuestion = 10;
+ _game._triggerSetupMode = SEQUENCE_TRIGGER_DAEMON;
+ _scene->_sequences.addTimer(1, 100);
+ _talkTimer = 120;
+ _conversationFl = true;
+ _bartenderDialogNode = 1;
+ if (_dialog2.read(0) <= 1)
+ _dialog1.write(0x214, false);
+
+ _dialog1.start();
+ } else {
+ _scene->_kernelMessages.add(Common::Point(177, 41), 0xFDFC, 0, 0, 9999999, _game.getQuote(0x1EF));
+ _game._triggerSetupMode = SEQUENCE_TRIGGER_DAEMON;
+ _scene->_sequences.addTimer(1, 100);
+ _talkTimer = 120;
+ _bartenderCurrentQuestion = 3;
+ _conversationFl = true;
+ _bartenderDialogNode = 1;
+ if (_dialog2.read(0) <= 1)
+ _dialog1.write(0x214, false);
+
+ _dialog1.start();
+ _game._player._stepEnabled = true;
+ }
+ } else {
+ if (_rexMode == 0) {
+ _scene->_kernelMessages.add(Common::Point(175, 13), 0xFDFC, 0, 0, 180, _game.getQuote(0x1F9));
+ _scene->_kernelMessages.add(Common::Point(184, 27), 0xFDFC, 0, 0, 180, _game.getQuote(0x1FA));
+ _scene->_kernelMessages.add(Common::Point(200, 41), 0xFDFC, 0, 0, 180, _game.getQuote(0x1FB));
+ _game._triggerSetupMode = SEQUENCE_TRIGGER_DAEMON;
+ _scene->_sequences.addTimer(1, 100);
+ _talkTimer = 180;
+ _rexMode = 1;
+ } else if (_rexMode == 1) {
+ _scene->_kernelMessages.add(Common::Point(205, 41), 0xFDFC, 0, 0, 120, _game.getQuote(0x1FC));
+ _game._player._stepEnabled = true;
+ _game._triggerSetupMode = SEQUENCE_TRIGGER_DAEMON;
+ _scene->_sequences.addTimer(1, 100);
+ _talkTimer = 120;
+ _rexMode = 3;
+ } else {
+ _game._player._stepEnabled = true;
+ }
+ }
+ }
+ break;
+
+ default:
+ break;
+ }
+ } else if (_action.isAction(VERB_LOOK, NOUN_DANCE_FLOOR))
+ _vm->_dialogs->show(40210);
+ else if (_action.isAction(VERB_LOOK, NOUN_TELEPORTER)) {
+ if (_globals[kSomeoneHasExploded])
+ _vm->_dialogs->show(40212);
+ else
+ _vm->_dialogs->show(40211);
+ } else if (_action.isAction(VERB_LOOK, NOUN_BAR))
+ _vm->_dialogs->show(40213);
+ else if (_action.isAction(VERB_LOOK, NOUN_BARTENDER))
+ _vm->_dialogs->show(40214);
+ else if (_action.isAction(VERB_LOOK, NOUN_WOMAN_IN_ALCOVE))
+ _vm->_dialogs->show(40215);
+ else if (_action.isAction(VERB_LOOK, NOUN_WOMAN_ON_BALCONY))
+ _vm->_dialogs->show(40216);
+ else if (_action.isAction(VERB_LOOK, NOUN_WOMAN_IN_CHAIR))
+ _vm->_dialogs->show(40217);
+ else if (_action.isAction(VERB_LOOK, NOUN_REPAIR_WOMAN))
+ _vm->_dialogs->show(40218);
+ else if (_action.isAction(VERB_LOOK, NOUN_CORRIDOR_TO_SOUTH))
+ _vm->_dialogs->show(40219);
+ else if (_action._lookFlag)
+ _vm->_dialogs->show(40220);
+ else if (_action.isAction(VERB_LOOK, NOUN_WOMEN))
+ _vm->_dialogs->show(40221);
+ else if (_action.isAction(VERB_PUSH, NOUN_REPAIR_WOMAN) || _action.isAction(VERB_PULL, NOUN_REPAIR_WOMAN))
+ _vm->_dialogs->show(40222);
+ else if (_action.isAction(VERB_TALKTO, NOUN_WOMEN))
+ _vm->_dialogs->show(40223);
+ else if (_action.isAction(VERB_TALKTO, NOUN_WOMAN_ON_BALCONY))
+ _vm->_dialogs->show(40224);
+ else if (_action.isAction(VERB_LOOK, NOUN_RAILING))
+ _vm->_dialogs->show(40225);
+ else if (_action.isAction(VERB_LOOK, NOUN_TABLE))
+ _vm->_dialogs->show(40226);
+ else if (_action.isAction(VERB_TAKE, NOUN_TABLE))
+ _vm->_dialogs->show(40227);
+ else if (_action.isAction(VERB_LOOK, NOUN_SIGN))
+ _vm->_dialogs->show(40228);
+ else if (_action.isAction(VERB_TAKE, NOUN_SIGN))
+ _vm->_dialogs->show(40229);
+ else if (_action.isAction(VERB_LOOK, NOUN_BAR_STOOL))
+ _vm->_dialogs->show(40230);
+ else if (_action.isAction(VERB_TAKE, NOUN_BAR_STOOL))
+ _vm->_dialogs->show(40231);
+ else if (_action.isAction(VERB_LOOK, NOUN_CACTUS))
+ _vm->_dialogs->show(40232);
+ else if (_action.isAction(VERB_TAKE, NOUN_CACTUS))
+ _vm->_dialogs->show(40233);
+ else if (_action.isAction(VERB_LOOK, NOUN_DISCO_BALL))
+ _vm->_dialogs->show(40234);
+ else if (_action.isAction(VERB_LOOK, NOUN_UPPER_DANCE_FLOOR))
+ _vm->_dialogs->show(40235);
+ else if (_action.isAction(VERB_LOOK, NOUN_TREE))
+ _vm->_dialogs->show(40236);
+ else if (_action.isAction(VERB_LOOK, NOUN_PLANT))
+ _vm->_dialogs->show(40237);
+ else if (_action.isAction(VERB_TAKE, NOUN_PLANT))
+ _vm->_dialogs->show(40238);
+ else if (_action.isAction(VERB_LOOK, NOUN_REPAIR_LIST) && _game._objects.isInRoom(OBJ_REPAIR_LIST))
+ _vm->_dialogs->show(40239);
+ else
+ return;
+
+ _action._inProgress = false;
+}
+
+/*------------------------------------------------------------------------*/
+
+void Scene405::setup() {
+ setPlayerSpritesPrefix();
+ setAAName();
+}
+
+void Scene405::enter() {
+ _globals._spriteIndexes[1] = _scene->_sprites.addSprites(formAnimName('x', 0));
+ _globals._spriteIndexes[2] = _scene->_sprites.addSprites(formAnimName('x', 1));
+ _globals._spriteIndexes[3] = _scene->_sprites.addSprites("*ROXCL_8");
+
+ if (_scene->_priorSceneId == 401) {
+ _game._player._playerPos = Common::Point(23, 123);
+ _game._player._facing = FACING_EAST;
+ } else if (_scene->_priorSceneId == 406) {
+ _game._player._playerPos = Common::Point(300, 128);
+ _game._player._facing = FACING_WEST;
+ } else if (_scene->_priorSceneId == 408) {
+ _game._player._playerPos = Common::Point(154, 109);
+ _game._player._facing = FACING_SOUTH;
+ } else if (_scene->_priorSceneId == 413) {
+ _game._player._playerPos = Common::Point(284, 109);
+ _game._player._facing = FACING_SOUTH;
+ } else if (_scene->_priorSceneId != -2) {
+ _game._player._playerPos = Common::Point(23, 123);
+ _game._player._facing = FACING_EAST;
+ }
+
+ if (_globals[kArmoryDoorOpen])
+ _globals._sequenceIndexes[2] = _scene->_sequences.startCycle(_globals._spriteIndexes[2], false, 1);
+ else
+ _globals._sequenceIndexes[1] = _scene->_sequences.startCycle(_globals._spriteIndexes[1], false, 1);
+
+ if (_scene->_roomChanged) {
+ _globals[kArmoryDoorOpen] = false;
+ _game._objects.addToInventory(OBJ_SECURITY_CARD);
+ }
+
+ _game.loadQuoteSet(0x24F, 0);
+ sceneEntrySound();
+}
+
+void Scene405::step() {
+ if (_game._trigger == 80) {
+ _scene->_sequences.addTimer(20, 81);
+ _game._player._priorTimer = _scene->_frameStartTime + _game._player._ticksAmount;
+ _game._player._visible = true;
+ }
+
+ if (_game._trigger == 81) {
+ _game._player._stepEnabled = true;
+ _vm->_dialogs->show(40525);
+ }
+
+ if (_game._trigger == 70) {
+ _game._player._priorTimer = _scene->_frameStartTime + _game._player._ticksAmount ;
+ _game._player._visible = true;
+ _globals._sequenceIndexes[1] = _scene->_sequences.startReverseCycle(_globals._spriteIndexes[1], false, 6, 1, 0, 0);
+ _scene->_sequences.addSubEntry(_globals._sequenceIndexes[1], SEQUENCE_TRIGGER_EXPIRE, 0, 71);
+ _vm->_sound->command(19);
+ }
+
+ if (_game._trigger == 71) {
+ _globals._sequenceIndexes[1] = _scene->_sequences.startCycle(_globals._spriteIndexes[1], false, 1);
+ _globals[kArmoryDoorOpen] = false;
+ _scene->_sequences.remove(_globals._sequenceIndexes[2]);
+ _game._player._stepEnabled = true;
+ }
+
+ if (_game._trigger == 75) {
+ _game._player._priorTimer = _scene->_frameStartTime + _game._player._ticksAmount ;
+ _game._player._visible = true;
+ _scene->_sequences.remove(_globals._sequenceIndexes[1]);
+ _globals._sequenceIndexes[1] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[1], false, 6, 1, 0, 0);
+ _globals[kArmoryDoorOpen] = true;
+ _game._player._stepEnabled = true;
+ _globals._sequenceIndexes[2] = _scene->_sequences.startCycle (_globals._spriteIndexes[2],
+ false, 1);
+ _vm->_sound->command(19);
+ }
+}
+
+void Scene405::preActions() {
+ if (_action.isAction(VERB_TAKE))
+ _game._player._needToWalk = false;
+
+ if (_action.isAction(VERB_WALK_DOWN, NOUN_CORRIDOR_TO_WEST))
+ _game._player._walkOffScreenSceneId = 401;
+
+ if (_action.isAction(VERB_WALK_DOWN, NOUN_CORRIDOR_TO_EAST))
+ _game._player._walkOffScreenSceneId = 406;
+
+ if (_action.isAction(VERB_CLOSE, NOUN_WIDE_DOOR) && _globals[kArmoryDoorOpen])
+ _game._player.walk(Common::Point(212, 113), FACING_NORTH);
+}
+
+void Scene405::actions() {
+ if (_action.isAction(VERB_WALK_THROUGH, NOUN_DOOR))
+ _scene->_nextSceneId = 413;
+ else if (_action.isAction(VERB_WALK_THROUGH, NOUN_WIDE_DOOR) && _globals[kArmoryDoorOpen])
+ _scene->_nextSceneId = 408;
+ else if (_action.isAction(VERB_WALK_THROUGH, NOUN_WIDE_DOOR) && !_globals[kArmoryDoorOpen])
+ _scene->_kernelMessages.add(Common::Point(0, 0), 0x1110, 34, 0, 60, _game.getQuote(0x24F));
+ else if (_action.isAction(VERB_PUT, NOUN_SECURITY_CARD, NOUN_CARD_SLOT) && !_globals[kArmoryDoorOpen]) {
+ _game._player._stepEnabled = false;
+ _game._player._visible = false;
+ _game._triggerSetupMode = SEQUENCE_TRIGGER_DAEMON;
+ _globals._sequenceIndexes[3] = _scene->_sequences.startReverseCycle(_globals._spriteIndexes[3], false, 7, 2, 0, 0);
+ _scene->_sequences.setAnimRange(_globals._sequenceIndexes[3], 1, 2);
+ _scene->_sequences.addSubEntry(_globals._sequenceIndexes[3], SEQUENCE_TRIGGER_EXPIRE, 0, 75);
+ Common::Point msgPos = Common::Point(_game._player._playerPos.x, _game._player._playerPos.y + 1);
+ _scene->_sequences.setPosition(_globals._sequenceIndexes[3], msgPos);
+ _scene->_sequences.setScale(_globals._sequenceIndexes[3], 87);
+ } else if ((_action.isAction(VERB_PUT, NOUN_SECURITY_CARD, NOUN_CARD_SLOT) || _action.isAction(VERB_CLOSE, NOUN_WIDE_DOOR)) && _globals[kArmoryDoorOpen]) {
+ _game._triggerSetupMode = SEQUENCE_TRIGGER_DAEMON;
+ _game._player._stepEnabled = false;
+ _game._player._visible = false;
+ _globals._sequenceIndexes[3] = _scene->_sequences.startReverseCycle(_globals._spriteIndexes[3], false, 7, 2, 0, 0);
+ _scene->_sequences.setAnimRange(_globals._sequenceIndexes[3], 1, 2);
+ _scene->_sequences.addSubEntry(_globals._sequenceIndexes[3], SEQUENCE_TRIGGER_EXPIRE, 0, 70);
+ _scene->_sequences.setPosition(_globals._sequenceIndexes[3], _game._player._playerPos);
+ _scene->_sequences.setScale(_globals._sequenceIndexes[3], 87);
+ } else if (_action.isAction(VERB_PUT, NOUN_CARD_SLOT)) {
+ _game._triggerSetupMode = SEQUENCE_TRIGGER_DAEMON;
+ _game._player._stepEnabled = false;
+ _game._player._visible = false;
+ _globals._sequenceIndexes[3] = _scene->_sequences.startReverseCycle(_globals._spriteIndexes[3], false, 7, 2, 0, 0);
+ _scene->_sequences.setAnimRange(_globals._sequenceIndexes[3], 1, 2);
+ _scene->_sequences.addSubEntry(_globals._sequenceIndexes[3], SEQUENCE_TRIGGER_EXPIRE, 0, 80);
+ _scene->_sequences.setPosition(_globals._sequenceIndexes[3], _game._player._playerPos);
+ _scene->_sequences.setScale(_globals._sequenceIndexes[3], 87);
+ } else if (_action.isAction(VERB_LOOK, NOUN_CANNON_BALLS))
+ _vm->_dialogs->show(40510);
+ else if (_action.isAction(VERB_TAKE, NOUN_CANNON_BALLS))
+ _vm->_dialogs->show(40511);
+ else if (_action.isAction(VERB_LOOK, NOUN_WATER_FOUNTAIN))
+ _vm->_dialogs->show(40512);
+ else if (_action.isAction(VERB_LOOK, NOUN_BACKBOARD) || _action.isAction(VERB_LOOK, NOUN_HOOP))
+ _vm->_dialogs->show(40513);
+ else if (_action.isAction(VERB_LOOK, NOUN_LIGHT))
+ _vm->_dialogs->show(40514);
+ else if (_action.isAction(VERB_LOOK, NOUN_CARD_SLOT))
+ _vm->_dialogs->show(40515);
+ else if (_action.isAction(VERB_LOOK, NOUN_CORRIDOR_TO_EAST))
+ _vm->_dialogs->show(40516);
+ else if (_action.isAction(VERB_LOOK, NOUN_CORRIDOR_TO_WEST))
+ _vm->_dialogs->show(40517);
+ else if (_action.isAction(VERB_LOOK, NOUN_MONITOR))
+ _vm->_dialogs->show(40518);
+ else if (_action.isAction(VERB_LOOK, NOUN_CORRIDOR) || _action._lookFlag)
+ _vm->_dialogs->show(40519);
+ else if (_action.isAction(VERB_LOOK, NOUN_WIDE_DOOR)) {
+ if (_globals[kArmoryDoorOpen])
+ _vm->_dialogs->show(40521);
+ else
+ _vm->_dialogs->show(40520);
+ } else if (_action.isAction(VERB_LOOK, NOUN_DOOR))
+ _vm->_dialogs->show(40522);
+ else if (_action.isAction(VERB_LOOK, NOUN_COACH_LAMP))
+ _vm->_dialogs->show(40523);
+ else if (_action.isAction(VERB_LOOK, NOUN_SUPPORT))
+ _vm->_dialogs->show(40524);
+ else
+ return;
+
+ _action._inProgress = false;
+}
+
+/*------------------------------------------------------------------------*/
+
+Scene406::Scene406(MADSEngine *vm) : Scene4xx(vm) {
+ _hitStorageDoor = false;
+}
+
+void Scene406::synchronize(Common::Serializer &s) {
+ Scene4xx::synchronize(s);
+
+ s.syncAsByte(_hitStorageDoor);
+}
+
+void Scene406::setup() {
+ setPlayerSpritesPrefix();
+ setAAName();
+}
+
+void Scene406::enter() {
+ _game._player._visible = true;
+ if (_scene->_priorSceneId == 405) {
+ _game._player._playerPos = Common::Point(15, 129);
+ _game._player._facing = FACING_EAST;
+ } else if (_scene->_priorSceneId == 407) {
+ _game._player._playerPos = Common::Point(270, 127);
+ _game._player._facing = FACING_WEST;
+ } else if (_scene->_priorSceneId == 410) {
+ _game._player._playerPos = Common::Point(30, 108);
+ _game._player._facing = FACING_SOUTH;
+ } else if (_scene->_priorSceneId == 411) {
+ _game._player._playerPos = Common::Point(153, 108);
+ _game._player._facing = FACING_SOUTH;
+ } else if (_scene->_priorSceneId != -2) {
+ _game._player._playerPos = Common::Point(15, 129);
+ _game._player._facing = FACING_EAST;
+ }
+
+ _globals._spriteIndexes[2] = _scene->_sprites.addSprites("*ROXCL_8");
+ _globals._spriteIndexes[1] = _scene->_sprites.addSprites(formAnimName('x', 0));
+ _globals._spriteIndexes[3] = _scene->_sprites.addSprites(formAnimName('x', 1));
+
+ if (_scene->_roomChanged) {
+ _globals[kStorageDoorOpen] = false;
+ _game._objects.addToInventory(OBJ_SECURITY_CARD);
+ }
+
+ if (!_globals[kStorageDoorOpen])
+ _globals._sequenceIndexes[1] = _scene->_sequences.startCycle(_globals._spriteIndexes[1], false, 1);
+
+ if (_scene->_priorSceneId != 411)
+ _globals._sequenceIndexes[3] = _scene->_sequences.startCycle(_globals._spriteIndexes[3], false, 1);
+ else {
+ _game._player._stepEnabled = false;
+ _game._triggerSetupMode = SEQUENCE_TRIGGER_DAEMON;
+ _globals._sequenceIndexes[3] = _scene->_sequences.startReverseCycle(_globals._spriteIndexes[3], false, 3, 1, 0, 0);
+ _scene->_sequences.addSubEntry(_globals._sequenceIndexes[3], SEQUENCE_TRIGGER_EXPIRE, 0, 90);
+ _vm->_sound->command(19);
+ }
+
+ _game.loadQuoteSet(0x24F, 0);
+ _hitStorageDoor = false;
+ sceneEntrySound();
+}
+
+void Scene406::step() {
+ if (_game._trigger == 90) {
+ _game._player._stepEnabled = true;
+ _globals._sequenceIndexes[3] = _scene->_sequences.startCycle(_globals._spriteIndexes[3], false, 1);
+ }
+
+ if (_game._trigger == 80)
+ _scene->_nextSceneId = 411;
+
+ if (_game._trigger == 100) {
+ _vm->_dialogs->show(40622);
+ _hitStorageDoor = true;
+ }
+
+ if (_game._trigger == 110) {
+ _scene->_sequences.addTimer(20, 111);
+ _game._player._priorTimer = _scene->_frameStartTime + _game._player._ticksAmount;
+ _game._player._visible = true;
+ }
+
+ if (_game._trigger == 111) {
+ _game._player._stepEnabled = true;
+ _vm->_dialogs->show(40613);
+ }
+
+ if (_game._trigger == 70) {
+ _game._player._priorTimer = _scene->_frameStartTime + _game._player._ticksAmount;
+ _game._player._visible = true;
+ _globals._sequenceIndexes[1] = _scene->_sequences.startReverseCycle(_globals._spriteIndexes[1], false, 4, 1, 0, 0);
+ _scene->_sequences.addSubEntry(_globals._sequenceIndexes[1], SEQUENCE_TRIGGER_EXPIRE, 0, 71);
+ _vm->_sound->command(19);
+ }
+
+ if (_game._trigger == 71) {
+ _globals._sequenceIndexes[1] = _scene->_sequences.startCycle(_globals._spriteIndexes[1], false, 1);
+ _globals[kStorageDoorOpen] = false;
+ _game._player._stepEnabled = true;
+ }
+
+ if (_game._trigger == 75) {
+ _scene->_sequences.remove(_globals._sequenceIndexes[1]);
+ _globals._sequenceIndexes[1] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[1], false, 4, 1, 0, 0);
+ _globals[kStorageDoorOpen] = true;
+ _game._player._stepEnabled = true;
+ _game._player._priorTimer = _scene->_frameStartTime + _game._player._ticksAmount;
+ _game._player._visible = true;
+ _vm->_sound->command(19);
+ }
+}
+
+void Scene406::preActions() {
+ if (_action.isAction(VERB_WALK_DOWN, NOUN_CORRIDOR_TO_WEST))
+ _game._player._walkOffScreenSceneId = 405;
+
+ if (_action.isAction(VERB_WALK_DOWN, NOUN_CORRIDOR_TO_EAST))
+ _game._player._walkOffScreenSceneId = 407;
+
+ if (_action.isAction(VERB_TAKE))
+ _game._player._needToWalk = false;
+
+ if (_action.isAction(VERB_LOOK, NOUN_SIGN) || _action.isAction(VERB_LOOK, NOUN_TRASH))
+ _game._player._needToWalk = true;
+}
+
+void Scene406::actions() {
+ if (_action.isAction(VERB_WALK_THROUGH, NOUN_DOOR) && (_game._player._targetPos.x> 100)) {
+ _game._player._stepEnabled = false;
+ _game._triggerSetupMode = SEQUENCE_TRIGGER_DAEMON;
+ _scene->_sequences.remove(_globals._sequenceIndexes[3]);
+ _globals._sequenceIndexes[3] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[3], false, 3, 1, 0, 0);
+ _scene->_sequences.addSubEntry(_globals._sequenceIndexes[3], SEQUENCE_TRIGGER_EXPIRE, 0, 80);
+ _vm->_sound->command(19);
+ } else if (_action.isAction(VERB_WALK_THROUGH, NOUN_DOOR) && _globals[kStorageDoorOpen] && (_game._player._targetPos.x < 100))
+ _scene->_nextSceneId = 410;
+ else if (_action.isAction(VERB_WALK_THROUGH, NOUN_DOOR) && !_globals[kStorageDoorOpen] && (_game._player._targetPos.x < 100)) {
+ _scene->_kernelMessages.add(Common::Point(0, 0), 0x1110, 34, 0, 60, _game.getQuote(0x24F));
+ if (!_hitStorageDoor) {
+ _game._triggerSetupMode = SEQUENCE_TRIGGER_DAEMON;
+ _scene->_sequences.addTimer(80, 100);
+ }
+ } else if (_action.isAction(VERB_PUT, NOUN_SECURITY_CARD, NOUN_CARD_SLOT) && !_globals[kStorageDoorOpen]) {
+ _game._player._stepEnabled = false;
+ _game._player._visible = false;
+ _game._triggerSetupMode = SEQUENCE_TRIGGER_DAEMON;
+ _globals._sequenceIndexes[2] = _scene->_sequences.startReverseCycle(_globals._spriteIndexes[2], false, 7, 2, 0, 0);
+ _scene->_sequences.setAnimRange(_globals._sequenceIndexes[2], 1, 2);
+ _scene->_sequences.addSubEntry(_globals._sequenceIndexes[2], SEQUENCE_TRIGGER_EXPIRE, 0, 75);
+ Common::Point msgPos = Common::Point(_game._player._playerPos.x, _game._player._playerPos.y + 1);
+ _scene->_sequences.setPosition(_globals._sequenceIndexes[2], msgPos);
+ _scene->_sequences.setScale(_globals._sequenceIndexes[2], 87);
+ } else if (_action.isAction(VERB_PUT, NOUN_SECURITY_CARD, NOUN_CARD_SLOT) && _globals[kStorageDoorOpen]) {
+ _game._triggerSetupMode = SEQUENCE_TRIGGER_DAEMON;
+ _game._player._stepEnabled = false;
+ _game._player._visible = false;
+ _globals._sequenceIndexes[2] = _scene->_sequences.startReverseCycle(_globals._spriteIndexes[2], false, 7, 2, 0, 0);
+ _scene->_sequences.setAnimRange(_globals._sequenceIndexes[2], 1, 2);
+ _scene->_sequences.addSubEntry(_globals._sequenceIndexes[2], SEQUENCE_TRIGGER_EXPIRE, 0, 70);
+ Common::Point msgPos = Common::Point(_game._player._playerPos.x, _game._player._playerPos.y + 1);
+ _scene->_sequences.setPosition(_globals._sequenceIndexes[2], msgPos);
+ _scene->_sequences.setScale(_globals._sequenceIndexes[2], 87);
+ } else if (_action.isAction(VERB_PUT, NOUN_CARD_SLOT)) {
+ _game._triggerSetupMode = SEQUENCE_TRIGGER_DAEMON;
+ _game._player._stepEnabled = false;
+ _game._player._visible = false;
+ _globals._sequenceIndexes[2] = _scene->_sequences.startReverseCycle(_globals._spriteIndexes[2], false, 7, 2, 0, 0);
+ _scene->_sequences.setAnimRange(_globals._sequenceIndexes[2], 1, 2);
+ _scene->_sequences.addSubEntry(_globals._sequenceIndexes[2], SEQUENCE_TRIGGER_EXPIRE, 0, 110);
+ _scene->_sequences.setPosition(_globals._sequenceIndexes[2], _game._player._playerPos);
+ _scene->_sequences.setScale(_globals._sequenceIndexes[2], 87);
+ } else if (_action.isAction(VERB_LOOK, NOUN_TRASH))
+ _vm->_dialogs->show(40610);
+ else if (_action.isAction(VERB_TAKE, NOUN_TRASH))
+ _vm->_dialogs->show(40611);
+ else if (_action.isAction(VERB_LOOK, NOUN_CARD_SLOT))
+ _vm->_dialogs->show(40612);
+ else if (_action.isAction(VERB_LOOK, NOUN_FIRE_EXTINGUISHER))
+ _vm->_dialogs->show(40614);
+ else if (_action.isAction(VERB_TAKE, NOUN_FIRE_EXTINGUISHER))
+ _vm->_dialogs->show(40615);
+ else if (_action.isAction(VERB_LOOK, NOUN_CORRIDOR_TO_EAST))
+ _vm->_dialogs->show(40616);
+ else if (_action.isAction(VERB_LOOK, NOUN_CORRIDOR_TO_WEST))
+ _vm->_dialogs->show(40617);
+ else if (_action.isAction(VERB_LOOK, NOUN_CORRIDOR) || _action._lookFlag)
+ _vm->_dialogs->show(40618);
+ else if (_action.isAction(VERB_LOOK, NOUN_WALL))
+ _vm->_dialogs->show(40619);
+ else if (_action.isAction(VERB_LOOK, NOUN_DOOR)) {
+ if (_globals[kStorageDoorOpen])
+ _vm->_dialogs->show(40621);
+ else
+ _vm->_dialogs->show(40620);
+ } else if (_action.isAction(VERB_LOOK, NOUN_MONITOR))
+ _vm->_dialogs->show(40623);
+ else if (_action.isAction(VERB_LOOK, NOUN_SIGNPOST))
+ _vm->_dialogs->show(40624);
+ else if (_action.isAction(VERB_TAKE, NOUN_SIGNPOST))
+ _vm->_dialogs->show(40625);
+ else if (_action.isAction(VERB_LOOK, NOUN_BOULDER))
+ _vm->_dialogs->show(40626);
+ else if (_action.isAction(VERB_TAKE, NOUN_BOULDER))
+ _vm->_dialogs->show(40627);
+ else if (_action.isAction(VERB_LOOK, NOUN_SIGN))
+ _vm->_dialogs->show(40628);
+ else if (_action.isAction(VERB_TAKE, NOUN_SIGN))
+ _vm->_dialogs->show(40629);
+ else
+ return;
+
+ _action._inProgress = false;
+}
+
+/*------------------------------------------------------------------------*/
+
+Scene407::Scene407(MADSEngine *vm) : Scene4xx(vm), _destPos(0, 0) {
+ _fromNorth = false;
+}
+
+void Scene407::synchronize(Common::Serializer &s) {
+ Scene4xx::synchronize(s);
+
+ s.syncAsByte(_fromNorth);
+ s.syncAsSint16LE(_destPos.x);
+ s.syncAsSint16LE(_destPos.y);
+}
+
+void Scene407::setup() {
+ setPlayerSpritesPrefix();
+ setAAName();
+}
+
+void Scene407::enter() {
+ if (_scene->_priorSceneId != -2)
+ _fromNorth = false;
+
+ if (_scene->_priorSceneId == 318) {
+ _game._player._playerPos = Common::Point(172, 92);
+ _game._player._facing = FACING_SOUTH;
+ _fromNorth = true;
+ } else if (_scene->_priorSceneId != -2) {
+ _game._player._playerPos = Common::Point(172, 132);
+ _game._player._facing = FACING_NORTH;
+ }
+
+ _game.loadQuoteSet(0x250, 0);
+ sceneEntrySound();
+}
+
+void Scene407::step() {
+ if (_game._trigger == 70) {
+ _scene->_nextSceneId = 318;
+ _scene->_reloadSceneFlag = true;
+ }
+
+ if (_game._trigger == 80) {
+ _game._player._priorTimer = _scene->_frameStartTime - _game._player._ticksAmount;
+ _game._player._stepEnabled = true;
+ _game._player._visible = true;
+ _fromNorth = false;
+ _game._player.walk(Common::Point(173, 104), FACING_SOUTH);
+ }
+}
+
+void Scene407::preActions() {
+ if (_action.isAction(VERB_TAKE))
+ _game._player._needToWalk = false;
+
+ if (_action.isAction(VERB_LOOK, NOUN_DOOR))
+ _game._player._needToWalk = true;
+
+ if (_action.isAction(VERB_WALK_DOWN, NOUN_CORRIDOR_TO_NORTH)) {
+ _game._player.walk(Common::Point(172, 91), FACING_NORTH);
+ _fromNorth = false;
+ }
+
+ if (_game._player._needToWalk && _fromNorth) {
+ if (_globals[kSexOfRex] == REX_MALE)
+ _destPos = Common::Point(171, 95);
+ else
+ _destPos = Common::Point(173, 96);
+
+ _game._player.walk(_destPos, FACING_SOUTH);
+ }
+}
+
+void Scene407::actions() {
+ if ((_game._player._playerPos == _destPos) && _fromNorth) {
+ if (_globals[kSexOfRex] == REX_MALE) {
+ _game._triggerSetupMode = SEQUENCE_TRIGGER_DAEMON;
+ _game._player._stepEnabled = false;
+ _game._player._visible = false;
+ _vm->_sound->command(21);
+ _scene->loadAnimation(formAnimName('s', 1), 70);
+ _globals[kHasBeenScanned] = true;
+ _scene->_kernelMessages.add(Common::Point(0, 0), 0x1110, 34, 0, 60, _game.getQuote(60));
+ _vm->_sound->command(22);
+ }
+
+ if (_globals[kSexOfRex] == REX_FEMALE) {
+ _game._triggerSetupMode = SEQUENCE_TRIGGER_DAEMON;
+ _game._player._stepEnabled = false;
+ _game._player._visible = false;
+ _vm->_sound->command(21);
+ _scene->loadAnimation(formAnimName('s', 2), 80);
+ _vm->_sound->command(23);
+ _globals[kHasBeenScanned] = true;
+ }
+ }
+
+ if (_action.isAction(VERB_WALK_DOWN, NOUN_CORRIDOR_TO_SOUTH) && !_fromNorth)
+ _scene->_nextSceneId = 406;
+ else if (_action.isAction(VERB_WALK_DOWN, NOUN_CORRIDOR_TO_NORTH))
+ _scene->_nextSceneId = 318;
+ else if (_action.isAction(VERB_LOOK, NOUN_SCANNER)) {
+ if (_globals[kHasBeenScanned])
+ _vm->_dialogs->show(40711);
+ else
+ _vm->_dialogs->show(40710);
+ } else if (_action.isAction(VERB_LOOK, NOUN_DOOR))
+ _vm->_dialogs->show(40712);
+ else if (_action.isAction(VERB_LOOK, NOUN_CORRIDOR_TO_SOUTH))
+ _vm->_dialogs->show(40713);
+ else if (_action.isAction(VERB_LOOK, NOUN_CORRIDOR_TO_NORTH))
+ _vm->_dialogs->show(40714);
+ else if (_action._lookFlag)
+ _vm->_dialogs->show(40715);
+ else
+ return;
+
+ _action._inProgress = false;
+}
+
+/*------------------------------------------------------------------------*/
+
+void Scene408::setup() {
+ setPlayerSpritesPrefix();
+ setAAName();
+ _scene->addActiveVocab(NOUN_TARGET_MODULE);
+ _scene->addActiveVocab(VERB_WALKTO);
+}
+
+void Scene408::enter() {
+ _game._player._playerPos = Common::Point(137, 150);
+ _game._player._facing = FACING_NORTH;
+
+ _globals._spriteIndexes[1] = _scene->_sprites.addSprites("*ROXRC_7");
+ _globals._spriteIndexes[2] = _scene->_sprites.addSprites(formAnimName('m', -1));
+
+ if (_game._objects.isInRoom(OBJ_TARGET_MODULE)) {
+ _globals._sequenceIndexes[2] = _scene->_sequences.startCycle(_globals._spriteIndexes[2], false, 1);
+ _scene->_sequences.setDepth(_globals._sequenceIndexes[2], 3);
+ int idx = _scene->_dynamicHotspots.add(NOUN_TARGET_MODULE, VERB_WALKTO, _globals._sequenceIndexes[2], Common::Rect(0, 0, 0, 0));
+ _scene->_dynamicHotspots.setPosition(idx, Common::Point(283, 128), FACING_NORTHEAST);
+ }
+ sceneEntrySound();
+}
+
+void Scene408::preActions() {
+ if ((_action.isAction(VERB_TAKE) && !_action.isObject(NOUN_TARGET_MODULE)) || _action.isAction(VERB_PULL, NOUN_PIN) || _action.isAction(VERB_OPEN, NOUN_CARTON))
+ _game._player._needToWalk = false;
+
+ if ((_action.isAction(VERB_LOOK, NOUN_TARGET_MODULE) && _game._objects.isInRoom(OBJ_TARGET_MODULE)) || _action.isAction(VERB_LOOK, NOUN_CHEST))
+ _game._player._needToWalk = true;
+}
+
+void Scene408::actions() {
+ if (_action.isAction(VERB_WALK_INTO, NOUN_CORRIDOR_TO_SOUTH)) {
+ _scene->_nextSceneId = 405;
+ _vm->_sound->command(58);
+ } else if (_action.isAction(VERB_TAKE, NOUN_TARGET_MODULE) && (_game._objects.isInRoom(OBJ_TARGET_MODULE) || _game._trigger)) {
+ switch (_game._trigger) {
+ case 0:
+ _vm->_sound->command(57);
+ _game._player._stepEnabled = false;
+ _game._player._visible = false;
+ _globals._sequenceIndexes[1] = _scene->_sequences.startReverseCycle(_globals._spriteIndexes[1], true, 7, 2, 0, 0);
+ _scene->_sequences.setAnimRange(_globals._sequenceIndexes[1], 1, 2);
+ _scene->_sequences.setMsgLayout(_globals._sequenceIndexes[1]);
+ _scene->_sequences.addSubEntry(_globals._sequenceIndexes[1], SEQUENCE_TRIGGER_SPRITE, 2, 1);
+ _scene->_sequences.addSubEntry(_globals._sequenceIndexes[1], SEQUENCE_TRIGGER_EXPIRE, 0, 2);
+ break;
+
+ case 1:
+ _scene->_sequences.remove(_globals._sequenceIndexes[2]);
+ _game._objects.addToInventory(OBJ_TARGET_MODULE);
+ _vm->_dialogs->showItem(OBJ_TARGET_MODULE, 40847);
+ break;
+
+ case 2:
+ _game._player._priorTimer = _game._player._ticksAmount + _scene->_frameStartTime;
+ _game._player._visible = true;
+ _scene->_sequences.addTimer(20, 3);
+ break;
+
+ case 3:
+ _game._player._stepEnabled = true;
+ break;
+
+ default:
+ break;
+ }
+ } else if (_action.isAction(VERB_LOOK, NOUN_ARMORED_VEHICLE))
+ _vm->_dialogs->show(40810);
+ else if (_action.isAction(VERB_TAKE, NOUN_ARMORED_VEHICLE) || _action.isAction(VERB_TAKE, NOUN_ANVIL) || _action.isAction(VERB_TAKE, NOUN_TWO_TON_WEIGHT))
+ _vm->_dialogs->show(40811);
+ else if (_action.isAction(VERB_LOOK, NOUN_MISSILE))
+ _vm->_dialogs->show(40812);
+ else if (_action.isAction(VERB_TAKE, NOUN_MISSILE))
+ _vm->_dialogs->show(40813);
+ else if (_action.isAction(VERB_LOOK, NOUN_GRENADE))
+ _vm->_dialogs->show(40814);
+ else if (_action.isAction(VERB_TAKE, NOUN_GRENADE))
+ _vm->_dialogs->show(40815);
+ else if (_action.isAction(VERB_TAKE, NOUN_PIN) || _action.isAction(VERB_PULL, NOUN_PIN))
+ _vm->_dialogs->show(40816);
+ else if (_action.isAction(VERB_LOOK, NOUN_BLIMP))
+ _vm->_dialogs->show(40817);
+ else if (_action.isAction(VERB_TAKE, NOUN_BLIMP))
+ _vm->_dialogs->show(40818);
+ else if (_action.isAction(VERB_LOOK, NOUN_AMMUNITION))
+ _vm->_dialogs->show(40819);
+ else if (_action.isAction(VERB_TAKE, NOUN_AMMUNITION))
+ _vm->_dialogs->show(40820);
+ else if (_action.isAction(VERB_LOOK, NOUN_CATAPULT))
+ _vm->_dialogs->show(40821);
+ else if (_action.isAction(VERB_TAKE, NOUN_CATAPULT))
+ _vm->_dialogs->show(40822);
+ else if (_action.isAction(VERB_LOOK, NOUN_CHEST)) {
+ if (_game._objects.isInRoom(OBJ_TARGET_MODULE))
+ _vm->_dialogs->show(40823);
+ else
+ _vm->_dialogs->show(40824);
+ } else if (_action.isAction(VERB_TAKE, NOUN_CHEST))
+ _vm->_dialogs->show(40825);
+ else if (_action.isAction(VERB_LOOK, NOUN_SUIT_OF_ARMOR))
+ _vm->_dialogs->show(40826);
+ else if (_action.isAction(VERB_TAKE, NOUN_SUIT_OF_ARMOR))
+ _vm->_dialogs->show(40827);
+ else if (_action.isAction(VERB_LOOK, NOUN_ESCAPE_HATCH))
+ _vm->_dialogs->show(40828);
+ else if (_action.isAction(VERB_OPEN, NOUN_ESCAPE_HATCH) || _action.isAction(VERB_PULL, NOUN_ESCAPE_HATCH))
+ _vm->_dialogs->show(40829);
+ else if (_action.isAction(VERB_LOOK, NOUN_BARRELS))
+ _vm->_dialogs->show(40830);
+ else if (_action.isAction(VERB_TAKE, NOUN_BARRELS))
+ _vm->_dialogs->show(40831);
+ else if (_action.isAction(VERB_LOOK, NOUN_INFLATABLE_RAFT))
+ _vm->_dialogs->show(40832);
+ else if (_action.isAction(VERB_TAKE, NOUN_INFLATABLE_RAFT))
+ _vm->_dialogs->show(40833);
+ else if (_action.isAction(VERB_LOOK, NOUN_TOMATO))
+ _vm->_dialogs->show(40834);
+ else if (_action.isAction(VERB_TAKE, NOUN_TOMATO))
+ _vm->_dialogs->show(40835);
+ else if (_action.isAction(VERB_LOOK, NOUN_ANVIL))
+ _vm->_dialogs->show(40836);
+ else if (_action.isAction(VERB_LOOK, NOUN_TWO_TON_WEIGHT))
+ _vm->_dialogs->show(40837);
+ else if (_action.isAction(VERB_LOOK, NOUN_POWDER_CONTAINER))
+ _vm->_dialogs->show(40838);
+ else if (_action.isAction(VERB_LOOK, NOUN_POWDER_PUFF))
+ _vm->_dialogs->show(40839);
+ else if (_action.isAction(VERB_TAKE, NOUN_POWDER_PUFF))
+ _vm->_dialogs->show(40840);
+ else if (_action.isAction(VERB_LOOK, NOUN_CARTON))
+ _vm->_dialogs->show(40841);
+ else if (_action.isAction(VERB_TAKE, NOUN_CARTON))
+ _vm->_dialogs->show(40842);
+ else if (_action.isAction(VERB_OPEN, NOUN_CARTON))
+ _vm->_dialogs->show(40843);
+ else if (_action.isAction(VERB_LOOK, NOUN_CORRIDOR_TO_SOUTH))
+ _vm->_dialogs->show(40844);
+ else if (_action._lookFlag)
+ _vm->_dialogs->show(40845);
+ else if (_action.isAction(VERB_LOOK, NOUN_TARGET_MODULE) && _game._objects.isInRoom(OBJ_TARGET_MODULE))
+ _vm->_dialogs->show(40846);
+ else if (_action.isAction(VERB_LOOK, NOUN_LOADING_RAMP))
+ _vm->_dialogs->show(40848);
+ else if (_action.isAction(VERB_OPEN, NOUN_CHEST))
+ _vm->_dialogs->show(40849);
+ else
+ return;
+
+ _action._inProgress = false;
+}
+
+/*------------------------------------------------------------------------*/
+
+void Scene409::setup() {
+ _game._player._spritesPrefix = "";
+
+ // The original is calling Scene4xx::setAAName()
+ _game._aaName = Resources::formatAAName(4);
+}
+
+void Scene409::enter() {
+ _handSpriteId = _scene->_sprites.addSprites("*ROXHAND");
+ teleporterEnter();
+
+ // The original is calling Scene4xx::sceneEntrySound()
+ if (!_vm->_musicFlag)
+ _vm->_sound->command(2);
+ else
+ _vm->_sound->command(10);
+}
+
+void Scene409::step() {
+ teleporterStep();
+}
+
+void Scene409::actions() {
+ if (teleporterActions()) {
+ _action._inProgress = false;
+ return;
+ }
+
+ if (_action.isAction(VERB_LOOK, NOUN_VIEWPORT))
+ _vm->_dialogs->show(40910);
+ else if (_action.isAction(VERB_PEER_THROUGH, NOUN_VIEWPORT))
+ _vm->_dialogs->show(40910);
+ else if (_action.isAction(VERB_LOOK, NOUN_KEYPAD))
+ _vm->_dialogs->show(40911);
+ else if (_action.isAction(VERB_INSPECT, NOUN_KEYPAD))
+ _vm->_dialogs->show(40911);
+ else if (_action.isAction(VERB_LOOK, NOUN_DISPLAY))
+ _vm->_dialogs->show(40912);
+ else if (_action.isAction(VERB_LOOK, NOUN_1_KEY) || _action.isAction(VERB_LOOK, NOUN_2_KEY)
+ || _action.isAction(VERB_LOOK, NOUN_3_KEY) || _action.isAction(VERB_LOOK, NOUN_4_KEY)
+ || _action.isAction(VERB_LOOK, NOUN_5_KEY) || _action.isAction(VERB_LOOK, NOUN_6_KEY)
+ || _action.isAction(VERB_LOOK, NOUN_7_KEY) || _action.isAction(VERB_LOOK, NOUN_8_KEY)
+ || _action.isAction(VERB_LOOK, NOUN_9_KEY) || _action.isAction(VERB_LOOK, NOUN_0_KEY)
+ || _action.isAction(VERB_LOOK, NOUN_SMILE_KEY) || _action.isAction(VERB_LOOK, NOUN_FROWN_KEY))
+ _vm->_dialogs->show(40913);
+ else if (_action.isAction(VERB_LOOK, NOUN_DEVICE))
+ _vm->_dialogs->show(40914);
+ else if (_action._lookFlag)
+ _vm->_dialogs->show(40914);
+ else
+ return;
+
+ _action._inProgress = false;
+}
+
+/*------------------------------------------------------------------------*/
+
+void Scene410::setup() {
+ setPlayerSpritesPrefix();
+ setAAName();
+}
+
+void Scene410::enter() {
+ _globals._spriteIndexes[1] = _scene->_sprites.addSprites(formAnimName('y', -1));
+ _globals._spriteIndexes[2] = _scene->_sprites.addSprites("*ROXRC_7");
+
+ if (_game._objects.isInRoom(OBJ_CHARGE_CASES))
+ _globals._sequenceIndexes[1] = _scene->_sequences.startCycle(_globals._spriteIndexes[1], false, 1);
+ else
+ _scene->_hotspots.activate(NOUN_CHARGE_CASES, false);
+
+ if (_scene->_priorSceneId != -2) {
+ _game._player._playerPos = Common::Point(155, 150);
+ _game._player._facing = FACING_NORTH;
+ }
+
+ sceneEntrySound();
+
+ _scene->loadAnimation(Resources::formatName(410, 'r', -1, EXT_AA, ""));
+ _scene->_activeAnimation->_resetFlag = true;
+}
+
+void Scene410::step() {
+ if (_scene->_activeAnimation->getCurrentFrame() == 1) {
+ if (_vm->getRandomNumber(1, 30) == 1)
+ _scene->_activeAnimation->setCurrentFrame(2);
+ else
+ _scene->_activeAnimation->setCurrentFrame(0);
+ }
+
+ if (_scene->_activeAnimation->getCurrentFrame() == 9) {
+ if (_vm->getRandomNumber(1, 30) == 1)
+ _scene->_activeAnimation->setCurrentFrame(10);
+ else
+ _scene->_activeAnimation->setCurrentFrame(8);
+ }
+
+ if (_scene->_activeAnimation->getCurrentFrame() == 5) {
+ if (_vm->getRandomNumber(1, 30) == 1)
+ _scene->_activeAnimation->setCurrentFrame(6);
+ else
+ _scene->_activeAnimation->setCurrentFrame(4);
+ }
+
+ if (_scene->_activeAnimation->getCurrentFrame() == 3) {
+ if (_vm->getRandomNumber(1, 2) == 1)
+ _scene->_activeAnimation->setCurrentFrame(4);
+ else // == 2
+ _scene->_activeAnimation->setCurrentFrame(8);
+ }
+}
+
+void Scene410::preActions() {
+ if (_action.isAction(VERB_TAKE) && !_action.isObject(NOUN_CHARGE_CASES))
+ _game._player._needToWalk = false;
+
+ if (_action.isAction(VERB_LOOK, NOUN_CHARGE_CASES) && _game._objects.isInRoom(OBJ_CHARGE_CASES))
+ _game._player._needToWalk = true;
+
+ if (_action.isAction(VERB_OPEN, NOUN_SACKS) || _action.isAction(VERB_OPEN, NOUN_SACK))
+ _game._player._needToWalk = false;
+
+ if (_action.isAction(VERB_LOOK, NOUN_CAN))
+ _game._player._needToWalk = true;
+}
+
+void Scene410::actions() {
+ if (_action.isAction(VERB_WALK_INTO, NOUN_CORRIDOR_TO_SOUTH))
+ _scene->_nextSceneId = 406;
+ else if (_action.isAction(VERB_TAKE, NOUN_CHARGE_CASES) && (_game._objects.isInRoom(OBJ_CHARGE_CASES) || _game._trigger)) {
+ switch (_game._trigger) {
+ case 0:
+ _vm->_sound->command(57);
+ _game._player._stepEnabled = false;
+ _game._player._visible = false;
+ _globals._sequenceIndexes[2] = _scene->_sequences.startReverseCycle(_globals._spriteIndexes[2], false, 7, 2, 0, 0);
+ _scene->_sequences.setAnimRange(_globals._sequenceIndexes[2], 1, 3);
+ _scene->_sequences.setMsgLayout(_globals._sequenceIndexes[2]);
+ _scene->_sequences.addSubEntry(_globals._sequenceIndexes[2], SEQUENCE_TRIGGER_SPRITE, 3, 1);
+ _scene->_sequences.addSubEntry(_globals._sequenceIndexes[2], SEQUENCE_TRIGGER_EXPIRE, 0, 2);
+ break;
+
+ case 1:
+ _scene->_sequences.remove(_globals._sequenceIndexes[1]);
+ _scene->_hotspots.activate(NOUN_CHARGE_CASES, false);
+ _game._objects.addToInventory(OBJ_CHARGE_CASES);
+ _vm->_dialogs->showItem(OBJ_CHARGE_CASES, 41032);
+ break;
+
+ case 2:
+ _game._player._priorTimer = _game._player._ticksAmount + _scene->_frameStartTime;
+ _game._player._visible = true;
+ _scene->_sequences.addTimer(20, 3);
+ break;
+
+ case 3:
+ _game._player._stepEnabled = true;
+ break;
+
+ default:
+ break;
+ }
+ } else if (_action.isAction(VERB_LOOK, NOUN_BARREL))
+ _vm->_dialogs->show(41010);
+ else if (_action.isAction(VERB_TAKE, NOUN_BARREL))
+ _vm->_dialogs->show(41011);
+ else if (_action.isAction(VERB_OPEN, NOUN_BARREL))
+ _vm->_dialogs->show(41012);
+ else if (_action.isAction(VERB_LOOK, NOUN_RUG))
+ _vm->_dialogs->show(41013);
+ else if (_action.isAction(VERB_TAKE, NOUN_RUG))
+ _vm->_dialogs->show(41014);
+ else if (_action.isAction(VERB_LOOK, NOUN_CARTON) || _action.isAction(VERB_OPEN, NOUN_CARTON)) {
+ if (_game._objects.isInRoom(OBJ_CHARGE_CASES))
+ _vm->_dialogs->show(41015);
+ else
+ _vm->_dialogs->show(41016);
+ } else if (_action.isAction(VERB_LOOK, NOUN_FLOUR))
+ _vm->_dialogs->show(41017);
+ else if (_action.isAction(VERB_TAKE, NOUN_FLOUR))
+ _vm->_dialogs->show(41018);
+ else if (_action.isAction(VERB_LOOK, NOUN_SACKS))
+ _vm->_dialogs->show(41019);
+ else if (_action.isAction(VERB_LOOK, NOUN_SACK))
+ _vm->_dialogs->show(41019);
+ else if (_action.isAction(VERB_OPEN, NOUN_SACKS))
+ _vm->_dialogs->show(41020);
+ else if (_action.isAction(VERB_OPEN, NOUN_SACK))
+ _vm->_dialogs->show(41020);
+ else if (_action.isAction(VERB_LOOK, NOUN_BUCKET_OF_TAR))
+ _vm->_dialogs->show(41021);
+ else if (_action.isAction(VERB_TAKE, NOUN_BUCKET_OF_TAR))
+ _vm->_dialogs->show(41022);
+ else if (_action.isAction(VERB_LOOK, NOUN_CAN))
+ _vm->_dialogs->show(41023);
+ else if (_action.isAction(VERB_TAKE, NOUN_CAN))
+ _vm->_dialogs->show(41024);
+ else if (_action.isAction(VERB_LOOK, NOUN_CHARGE_CASES) && _game._objects.isInRoom(OBJ_CHARGE_CASES))
+ _vm->_dialogs->show(41025);
+ else if (_action.isAction(VERB_LOOK, NOUN_FENCE))
+ _vm->_dialogs->show(41027);
+ else if (_action.isAction(VERB_LOOK, NOUN_SHELVES))
+ _vm->_dialogs->show(41028);
+ else if (_action.isAction(VERB_LOOK, NOUN_RAT))
+ _vm->_dialogs->show(41029);
+ else if (_action.isAction(VERB_TAKE, NOUN_RAT))
+ _vm->_dialogs->show(41030);
+ else if (_action.isAction(VERB_THROW, NOUN_RAT))
+ _vm->_dialogs->show(41031);
+ else if (_action._lookFlag)
+ _vm->_dialogs->show(41033);
+ else
+ return;
+
+ _action._inProgress = false;
+}
+
+/*------------------------------------------------------------------------*/
+
+Scene411::Scene411(MADSEngine *vm) : Scene4xx(vm) {
+ _curAnimationFrame = -1;
+ _newIngredient = -1;
+ _newQuantity = -1;
+ _resetFrame = -1;
+ _badThreshold = -1;
+
+ _killRox = false;
+ _makeMushroomCloud = false;
+}
+
+void Scene411::synchronize(Common::Serializer &s) {
+ Scene4xx::synchronize(s);
+
+ s.syncAsSint32LE(_curAnimationFrame);
+ s.syncAsSint32LE(_newIngredient);
+ s.syncAsSint32LE(_newQuantity);
+ s.syncAsSint32LE(_resetFrame);
+ s.syncAsSint32LE(_badThreshold);
+
+ s.syncAsByte(_killRox);
+ s.syncAsByte(_makeMushroomCloud);
+}
+
+bool Scene411::addIngredient() {
+ bool retVal = false;
+
+ switch (_newIngredient) {
+ case OBJ_LECITHIN:
+ if (_globals[kIngredientList + _globals[kNextIngredient]] == 1)
+ retVal = true;
+
+ _badThreshold = 1;
+ break;
+
+ case OBJ_ALIEN_LIQUOR:
+ if (_globals[kIngredientList + _globals[kNextIngredient]] == 0)
+ retVal = true;
+
+ _badThreshold = 0;
+ break;
+
+ case OBJ_FORMALDEHYDE:
+ if (_globals[kIngredientList + _globals[kNextIngredient]] == 3)
+ retVal = true;
+
+ _badThreshold = 3;
+ break;
+
+ case OBJ_PETROX:
+ if (_globals[kIngredientList + _globals[kNextIngredient]] == 2)
+ retVal = true;
+
+ _badThreshold = 2;
+ break;
+
+ default:
+ break;
+ }
+
+ if (!retVal && (_globals[kNextIngredient] == 0))
+ _globals[kBadFirstIngredient] = _badThreshold;
+
+ if (_globals[kNextIngredient] == 0)
+ retVal = true;
+
+ return(retVal);
+}
+
+bool Scene411::addQuantity() {
+ bool retVal = false;
+
+ if (_globals[kIngredientQuantity + _globals[kNextIngredient]] == _newQuantity)
+ retVal = true;
+
+ if (!retVal && (_globals[kNextIngredient] == 0))
+ _globals[kBadFirstIngredient] = _badThreshold;
+
+ if (_globals[kNextIngredient] == 0)
+ retVal = true;
+
+ return(retVal);
+}
+
+int Scene411::computeQuoteAndQuantity() {
+ int quoteId;
+ int quantity;
+
+ switch (_action._activeAction._verbId) {
+ case 0x252:
+ quoteId = 0x26F;
+ quantity = 0;
+ break;
+
+ case 0x253:
+ quoteId = 0x271;
+ quantity = 0;
+ break;
+
+ case 0x254:
+ quoteId = 0x270;
+ quantity = 0;
+ break;
+
+ case 0x255:
+ quoteId = 0x272;
+ quantity = 0;
+ break;
+
+ case 0x256:
+ quoteId = 0x267;
+ quantity = 2;
+ break;
+
+ case 0x257:
+ quoteId = 0x269;
+ quantity = 2;
+ break;
+
+ case 0x258:
+ quoteId = 0x268;
+ quantity = 2;
+ break;
+
+ case 0x259:
+ quoteId = 0x26A;
+ quantity = 2;
+ break;
+
+ case 0x25A:
+ quoteId = 0x26B;
+ quantity = 3;
+ break;
+
+ case 0x25B:
+ quoteId = 0x26D;
+ quantity = 3;
+ break;
+
+ case 0x25C:
+ quoteId = 0x26C;
+ quantity = 3;
+ break;
+
+ case 0x25D:
+ quoteId = 0x26E;
+ quantity = 3;
+ break;
+
+ case 0x25E:
+ quoteId = 0x263;
+ quantity = 1;
+ break;
+
+ case 0x25F:
+ quoteId = 0x265;
+ quantity = 1;
+ break;
+
+ case 0x260:
+ quoteId = 0x264;
+ quantity = 1;
+ break;
+
+ case 0x261:
+ quoteId = 0x266;
+ quantity = 1;
+ break;
+
+ default:
+ quoteId = 0;
+ quantity = 0;
+ break;
+ }
+
+ _scene->_kernelMessages.add(Common::Point(202, 82), 0x1110, 32, 0, 120, _game.getQuote(quoteId));
+ return quantity;
+}
+
+void Scene411::handleKettleAction() {
+ switch (_globals[kNextIngredient]) {
+ case 1:
+ _globals._sequenceIndexes[4] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[4],
+ false, 15, 0, 0, 0);
+ break;
+
+ case 2:
+ _scene->_sequences.remove(_globals._sequenceIndexes[4]);
+ _globals._sequenceIndexes[4] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[4],
+ false, 6, 0, 0, 0);
+ break;
+
+ case 3:
+ _makeMushroomCloud = true;
+ break;
+
+ default:
+ break;
+ }
+}
+
+void Scene411::handleDialog() {
+ if ((_action._activeAction._verbId != 0x262) && (_game._trigger == 0)) {
+ if (_game._objects.isInInventory(_newIngredient)) {
+ switch (_newIngredient) {
+ case OBJ_FORMALDEHYDE:
+ _resetFrame = 17;
+ break;
+
+ case OBJ_PETROX:
+ _resetFrame = 55;
+ break;
+
+ case OBJ_LECITHIN:
+ _resetFrame = 36;
+ break;
+
+ default:
+ _resetFrame = 112;
+ break;
+ }
+
+ _game._player._priorTimer = _scene->_frameStartTime + _game._player._ticksAmount;
+ _game._player._visible = false;
+ _game._player._stepEnabled = false;
+ _scene->_activeAnimation->setCurrentFrame(_resetFrame);
+ }
+ _scene->_kernelMessages.reset();
+ _newQuantity = computeQuoteAndQuantity();
+
+ if ((_globals[kNextIngredient] == 1) && (_globals[kBadFirstIngredient] > -1))
+ _killRox = true;
+ else if (addIngredient() && addQuantity()) {
+ handleKettleAction();
+ _globals[kNextIngredient]++;
+ } else
+ _killRox = true;
+
+ _scene->_userInterface.setup(kInputBuildingSentences);
+ } else if (_action._activeAction._verbId == 0x262)
+ _scene->_userInterface.setup(kInputBuildingSentences);
+}
+
+void Scene411::giveToRex(int object) {
+ switch (object) {
+ case 0:
+ _game._objects.addToInventory(OBJ_ALIEN_LIQUOR);
+ break;
+
+ case 1:
+ _game._objects.addToInventory(OBJ_LECITHIN);
+ break;
+
+ case 2:
+ _game._objects.addToInventory(OBJ_PETROX);
+ break;
+
+ case 3:
+ _game._objects.addToInventory(OBJ_FORMALDEHYDE);
+ break;
+
+ default:
+ break;
+ }
+}
+
+void Scene411::setup() {
+ setPlayerSpritesPrefix();
+ setAAName();
+ _scene->addActiveVocab(VERB_WALKTO);
+ _scene->addActiveVocab(NOUN_ALIEN_LIQUOR);
+ _scene->addActiveVocab(NOUN_FORMALDEHYDE);
+ _scene->addActiveVocab(NOUN_PETROX);
+ _scene->addActiveVocab(NOUN_LECITHIN);
+}
+
+void Scene411::enter() {
+ if (_scene->_priorSceneId == 411) {
+ if ((_globals[kNextIngredient] == 1) && (_globals[kBadFirstIngredient] > -1))
+ giveToRex(_globals[kBadFirstIngredient]);
+ else if (_globals[kNextIngredient] > 0) {
+ for (int i = 0; i < _globals[kNextIngredient]; i ++)
+ giveToRex(_globals[kIngredientList + i]);
+ }
+ _globals[kNextIngredient] = 0;
+ _globals[kBadFirstIngredient] = -1;
+ }
+
+ _globals._spriteIndexes[1] = _scene->_sprites.addSprites(formAnimName('x', 0));
+ _globals._spriteIndexes[2] = _scene->_sprites.addSprites(formAnimName('x', 1));
+ _globals._spriteIndexes[4] = _scene->_sprites.addSprites(formAnimName('c', 0));
+ _globals._spriteIndexes[5] = _scene->_sprites.addSprites(formAnimName('f', 0));
+ _globals._spriteIndexes[6] = _scene->_sprites.addSprites(formAnimName('f', 1));
+ _globals._spriteIndexes[7] = _scene->_sprites.addSprites(formAnimName('f', 2));
+ _globals._spriteIndexes[9] = _scene->_sprites.addSprites(formAnimName('c', 1));
+ _globals._spriteIndexes[10] = _scene->_sprites.addSprites(formAnimName('a', 6));
+ _globals._spriteIndexes[11] = _scene->_sprites.addSprites(formAnimName('a', 1));
+ _globals._spriteIndexes[8] = _scene->_sprites.addSprites("*ROXRC_9");
+
+ _globals._sequenceIndexes[1] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[1], false, 5, 0, 0, 0);
+ _globals._sequenceIndexes[2] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[2], false, 50, 0, 0, 0);
+
+ _game.loadQuoteSet(0x252, 0x25E, 0x25A, 0x256, 0x253, 0x25F, 0x25B, 0x257, 0x254, 0x260, 0x25C, 0x258, 0x255,
+ 0x261, 0x25D, 0x259, 0x262, 0x267, 0x263, 0x26B, 0x26F, 0x268, 0x264, 0x26C, 0x270, 0x26A, 0x266, 0x26E,
+ 0x272, 0x269, 0x265, 0x26D, 0x271, 0);
+
+ _dialog1.setup(0x5B, 0x252, 0x25E, 0x25A, 0x256, 0x262, -1);
+ _dialog2.setup(0x5C, 0x253, 0x25F, 0x25B, 0x257, 0x262, -1);
+ _dialog3.setup(0x5D, 0x254, 0x260, 0x25C, 0x258, 0x262, -1);
+ _dialog4.setup(0x5E, 0x255, 0x261, 0x25D, 0x259, 0x262, -1);
+
+ if (_globals[kNextIngredient] >= 4 && !_game._objects[OBJ_CHARGE_CASES].getQuality(3)) {
+ _scene->_hotspots.activate(NOUN_KETTLE, false);
+ _scene->_hotspots.activate(NOUN_EXPLOSIVES, true);
+ } else {
+ _scene->_hotspots.activate(NOUN_EXPLOSIVES, false);
+ _scene->_hotspots.activate(NOUN_KETTLE, true);
+ }
+
+ if (_globals[kNextIngredient] >= 4 && _game._objects[OBJ_CHARGE_CASES].getQuality(3)) {
+ _globals._sequenceIndexes[4] = _scene->_sequences.startCycle(_globals._spriteIndexes[4], true, 6);
+ } else if (!_game._objects[OBJ_CHARGE_CASES].getQuality(3)) {
+ switch (_globals[kNextIngredient]) {
+ case 1:
+ _vm->_sound->command(53);
+ break;
+
+ case 2:
+ _vm->_sound->command(53);
+ _vm->_sound->command(54);
+ _globals._sequenceIndexes[4] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[4], false, 15, 0, 0, 0);
+ break;
+
+ case 3:
+ _vm->_sound->command(53);
+ _vm->_sound->command(54);
+ _vm->_sound->command(55);
+ _globals._sequenceIndexes[4] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[4], false, 6, 0, 0, 0);
+ break;
+
+ case 4:
+ _vm->_sound->command(53);
+ _vm->_sound->command(54);
+ _vm->_sound->command(55);
+ _vm->_sound->command(56);
+ _globals._sequenceIndexes[4] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[4], false, 6, 0, 0, 0);
+ break;
+
+ default:
+ _vm->_sound->command(10);
+ break;
+ }
+ }
+
+ if (_globals[kNextIngredient] >= 4 && _game._objects[OBJ_CHARGE_CASES].getQuality(3)) {
+ _globals._sequenceIndexes[4] = _scene->_sequences.startCycle(_globals._spriteIndexes[4], true, 6);
+ _scene->_sequences.setDepth(_globals._sequenceIndexes[4], 1);
+ }
+
+ if (_game._objects.isInRoom(OBJ_FORMALDEHYDE)) {
+ _globals._sequenceIndexes[7] = _scene->_sequences.startCycle(_globals._spriteIndexes[7], false, 1);
+ _scene->_sequences.setDepth(_globals._sequenceIndexes[7], 1);
+ int idx = _scene->_dynamicHotspots.add(NOUN_FORMALDEHYDE, VERB_WALKTO, _globals._sequenceIndexes[7], Common::Rect(0, 0, 0, 0));
+ _scene->_dynamicHotspots.setPosition(idx, Common::Point(206, 145), FACING_SOUTHEAST);
+ }
+
+ if (_game._objects.isInRoom(OBJ_PETROX)) {
+ _globals._sequenceIndexes[5] = _scene->_sequences.startCycle(_globals._spriteIndexes[5], false, 1);
+ _scene->_sequences.setDepth(_globals._sequenceIndexes[5], 8);
+ int idx = _scene->_dynamicHotspots.add(NOUN_PETROX, VERB_WALKTO, _globals._sequenceIndexes[5], Common::Rect(0, 0, 0, 0));
+ _scene->_dynamicHotspots.setPosition(idx, Common::Point(186, 112), FACING_NORTHEAST);
+ }
+
+ if (_game._objects.isInRoom(OBJ_LECITHIN)) {
+ _globals._sequenceIndexes[6] = _scene->_sequences.startCycle(_globals._spriteIndexes[6], false, 1);
+ _scene->_sequences.setDepth(_globals._sequenceIndexes[6], 8);
+ int idx = _scene->_dynamicHotspots.add(NOUN_LECITHIN, VERB_WALKTO, _globals._sequenceIndexes[6], Common::Rect(0, 0, 0, 0));
+ _scene->_dynamicHotspots.setPosition(idx, Common::Point(220, 121), FACING_NORTHEAST);
+ }
+
+ if (_scene->_priorSceneId != -2) {
+ _game._player._playerPos = Common::Point(60, 146);
+ _game._player._facing = FACING_NORTHEAST;
+ }
+
+ sceneEntrySound();
+
+ if (_scene->_roomChanged) {
+ _game._objects.addToInventory(OBJ_ALIEN_LIQUOR);
+ _game._objects.addToInventory(OBJ_CHARGE_CASES);
+ _game._objects.addToInventory(OBJ_TAPE_PLAYER);
+ _game._objects.addToInventory(OBJ_AUDIO_TAPE);
+ }
+
+ _scene->loadAnimation(formAnimName('a', -1));
+ _scene->_activeAnimation->setCurrentFrame(128);
+
+ _makeMushroomCloud = false;
+ _killRox = false;
+}
+
+void Scene411::step() {
+ if (_scene->_activeAnimation != nullptr) {
+ if (_curAnimationFrame != _scene->_activeAnimation->getCurrentFrame()) {
+ _curAnimationFrame = _scene->_activeAnimation->getCurrentFrame();
+ _resetFrame = -1;
+
+ switch (_curAnimationFrame) {
+ case 16:
+ _game._player._stepEnabled = true;
+ _game._player._priorTimer = _scene->_frameStartTime + _game._player._ticksAmount;
+ _game._player._visible = true;
+ _resetFrame = 128;
+ break;
+
+ case 35:
+ case 54:
+ case 71:
+ case 127:
+ if (_killRox) {
+ _resetFrame = 72;
+ } else {
+ _resetFrame = 0;
+ _game._objects.removeFromInventory(_newIngredient, NOWHERE);
+ switch (_globals[kNextIngredient]) {
+ case 1:
+ _vm->_sound->command(53);
+ break;
+
+ case 2:
+ _vm->_sound->command(54);
+ break;
+
+ case 3:
+ _vm->_sound->command(55);
+ break;
+
+ case 4:
+ _vm->_sound->command(56);
+ break;
+
+ default:
+ break;
+ }
+ }
+ break;
+
+ case 22:
+ case 41:
+ case 59:
+ case 115:
+ if (_makeMushroomCloud) {
+ _globals._sequenceIndexes[9] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[9], false, 5, 1, 0, 0);
+ _makeMushroomCloud = false;
+ _scene->_hotspots.activate(NOUN_KETTLE, false);
+ _scene->_hotspots.activate(NOUN_EXPLOSIVES, true);
+ }
+ break;
+
+ case 111:
+ _resetFrame = 111;
+ _scene->_reloadSceneFlag = true;
+ break;
+
+ case 129:
+ _resetFrame = 128;
+ break;
+
+ default:
+ break;
+ }
+
+ if ((_resetFrame >= 0) && (_resetFrame != _scene->_activeAnimation->getCurrentFrame())) {
+ _scene->_activeAnimation->setCurrentFrame(_resetFrame);
+ _curAnimationFrame = _resetFrame;
+ }
+ }
+ }
+
+ if (_scene->_activeAnimation->getCurrentFrame() == 86)
+ _vm->_sound->command(59);
+}
+
+void Scene411::preActions() {
+ if (_action.isAction(VERB_LOOK, NOUN_PETROX) && (_game._objects.isInRoom(OBJ_PETROX)))
+ _game._player._needToWalk = true;
+
+ if (_action.isAction(VERB_LOOK, NOUN_LECITHIN) && (_game._objects.isInRoom(OBJ_LECITHIN)))
+ _game._player._needToWalk = true;
+
+ if (_action.isAction(VERB_LOOK, NOUN_FORMALDEHYDE) && (_game._objects.isInRoom(OBJ_FORMALDEHYDE)))
+ _game._player._needToWalk = true;
+
+ if (_action.isAction(VERB_LOOK, NOUN_EXPLOSIVES) || _action.isAction(VERB_LOOK, NOUN_KETTLE) || _action.isAction(VERB_LOOK, NOUN_MISHAP) ||
+ _action.isAction(VERB_LOOK, NOUN_ALCOVE) || _action.isAction(VERB_LOOK, NOUN_SINK) || _action.isAction(VERB_PUT, NOUN_SINK) ||
+ _action.isAction(VERB_LOOK, NOUN_EXPERIMENT) || _action.isAction(VERB_LOOK, NOUN_DRAWING_BOARD))
+ _game._player._needToWalk = true;
+
+ if (_action.isAction(VERB_PULL, NOUN_KNIFE_SWITCH) || _action.isAction(VERB_PUSH, NOUN_KNIFE_SWITCH))
+ _game._player._needToWalk = false;
+}
+
+void Scene411::actions() {
+ if (_game._screenObjects._inputMode == kInputConversation) {
+ handleDialog();
+ _action._inProgress = false;
+ return;
+ }
+
+ if (_action.isAction(VERB_WALK_INTO, NOUN_CORRIDOR_TO_SOUTH)) {
+ _scene->_nextSceneId = 406;
+ _vm->_sound->command(10);
+ _action._inProgress = false;
+ return;
+ }
+
+ if ((_globals[kNextIngredient] >= 4) && (_action.isAction(VERB_TAKE, NOUN_EXPLOSIVES) || _action.isAction(VERB_PUT, NOUN_CHARGE_CASES, NOUN_EXPLOSIVES))
+ && !_game._objects[OBJ_CHARGE_CASES].getQuality(3)
+ && _game._objects.isInInventory(OBJ_CHARGE_CASES)) {
+ switch (_game._trigger) {
+ case 0:
+ _vm->_sound->command(10);
+ _vm->_sound->command(57);
+ _game._player._stepEnabled = false;
+ _game._player._visible = false;
+ _globals._sequenceIndexes[10] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[10], false, 8, 1, 0, 0);
+ _scene->_sequences.setAnimRange(_globals._sequenceIndexes[10], 1, 6);
+ _scene->_sequences.setDepth(_globals._sequenceIndexes[10], 3);
+ _scene->_sequences.addSubEntry(_globals._sequenceIndexes[10], SEQUENCE_TRIGGER_EXPIRE, 0, 110);
+ break;
+
+ case 110: {
+ int idx = _globals._sequenceIndexes[10];
+ _globals._sequenceIndexes[10] = _scene->_sequences.startCycle(_globals._spriteIndexes[10], false, 6);
+ _scene->_sequences.setDepth(_globals._sequenceIndexes[10], 3);
+ _scene->_sequences.updateTimeout(_globals._sequenceIndexes[10], idx);
+ _scene->_sequences.addTimer(180, 111);
+ }
+ break;
+
+ case 111:
+ _scene->_hotspots.activate(NOUN_KETTLE, true);
+ _scene->_hotspots.activate(NOUN_EXPLOSIVES, false);
+ _scene->_sequences.remove(_globals._sequenceIndexes[4]);
+ _scene->_sequences.remove(_globals._sequenceIndexes[10]);
+
+ _globals._sequenceIndexes[4] = _scene->_sequences.startCycle(_globals._spriteIndexes[4], true, 6);
+ _scene->_sequences.setDepth(_globals._sequenceIndexes[4], 1);
+
+ _globals._sequenceIndexes[10] = _scene->_sequences.addReverseSpriteCycle(_globals._spriteIndexes[10], false, 8, 1, 0, 0);
+ _scene->_sequences.setAnimRange(_globals._sequenceIndexes[10], 1, 6);
+ _scene->_sequences.setDepth(_globals._sequenceIndexes[10], 3);
+ _scene->_sequences.addSubEntry(_globals._sequenceIndexes[10], SEQUENCE_TRIGGER_EXPIRE, 0, 112);
+ // No break on purpose
+ case 112:
+ _game._player._priorTimer = _scene->_frameStartTime - _game._player._ticksAmount;
+ _game._player._visible = true;
+ _game._player._stepEnabled = true;
+ _game._objects[OBJ_CHARGE_CASES].setQuality(3, 1);
+ _vm->_dialogs->showItem(OBJ_CHARGE_CASES, 41142);
+ break;
+ }
+ _action._inProgress = false;
+ return;
+ } else if (!_game._objects.isInInventory(OBJ_CHARGE_CASES) && _action.isAction(VERB_TAKE, NOUN_EXPLOSIVES)) {
+ _vm->_dialogs->show(41143);
+ _action._inProgress = false;
+ return;
+ }
+
+ if (_action.isAction(VERB_TAKE, NOUN_PETROX) && (_game._objects.isInRoom(OBJ_PETROX) || _game._trigger)) {
+ switch (_game._trigger) {
+ case 0:
+ _vm->_sound->command(57);
+ _game._player._stepEnabled = false;
+ _game._player._visible = false;
+ _globals._sequenceIndexes[8] = _scene->_sequences.startReverseCycle(_globals._spriteIndexes[8], false, 7, 2, 0, 0);
+ _scene->_sequences.setAnimRange(_globals._sequenceIndexes[8], 1, 2);
+ _scene->_sequences.setMsgLayout(_globals._sequenceIndexes[8]);
+ _scene->_sequences.addSubEntry(_globals._sequenceIndexes[8], SEQUENCE_TRIGGER_SPRITE, 2, 1);
+ _scene->_sequences.addSubEntry(_globals._sequenceIndexes[8], SEQUENCE_TRIGGER_EXPIRE, 0, 2);
+ break;
+
+ case 1:
+ _scene->_sequences.remove(_globals._sequenceIndexes[5]);
+ _game._objects.addToInventory(OBJ_PETROX);
+ _vm->_dialogs->showItem(OBJ_PETROX, 41120);
+ break;
+
+ case 2:
+ _game._player._priorTimer = _scene->_frameStartTime + _game._player._ticksAmount;
+ _game._player._priorTimer = _scene->_frameStartTime + _game._player._ticksAmount;
+ _game._player._visible = true;
+ _scene->_sequences.addTimer(20, 3);
+ break;
+
+ case 3:
+ _game._player._stepEnabled = true;
+ break;
+
+ default:
+ break;
+ }
+ _action._inProgress = false;
+ return;
+ }
+
+ if (_action.isAction(VERB_TAKE, NOUN_LECITHIN) && (_game._objects.isInRoom(OBJ_LECITHIN) || _game._trigger)) {
+ switch (_game._trigger) {
+ case 0:
+ _vm->_sound->command(57);
+ _game._player._stepEnabled = false;
+ _game._player._visible = false;
+ _globals._sequenceIndexes[8] = _scene->_sequences.startReverseCycle(_globals._spriteIndexes[8], false, 7, 2, 0, 0);
+ _scene->_sequences.setAnimRange(_globals._sequenceIndexes[8], 1, 2);
+ _scene->_sequences.setMsgLayout(_globals._sequenceIndexes[8]);
+ _scene->_sequences.addSubEntry(_globals._sequenceIndexes[8], SEQUENCE_TRIGGER_SPRITE, 2, 1);
+ _scene->_sequences.addSubEntry(_globals._sequenceIndexes[8], SEQUENCE_TRIGGER_EXPIRE, 0, 2);
+ break;
+
+ case 1:
+ _scene->_sequences.remove(_globals._sequenceIndexes[6]);
+ _game._objects.addToInventory(OBJ_LECITHIN);
+ _vm->_dialogs->showItem(OBJ_LECITHIN, 41124);
+ break;
+
+ case 2:
+ _game._player._priorTimer = _scene->_frameStartTime + _game._player._ticksAmount;
+ _game._player._visible = true;
+ _scene->_sequences.addTimer(20, 3);
+ break;
+
+ case 3:
+ _game._player._stepEnabled = true;
+ break;
+
+ default:
+ break;
+ }
+ _action._inProgress = false;
+ return;
+ }
+
+ if (_action.isAction(VERB_TAKE, NOUN_FORMALDEHYDE) && _game._objects.isInRoom(OBJ_FORMALDEHYDE) && (_game._trigger == 0)) {
+ _vm->_sound->command(57);
+ _game._player._stepEnabled = false;
+ _game._player._visible = false;
+ _globals._sequenceIndexes[11] = _scene->_sequences.startCycle(_globals._spriteIndexes[11], false, 2);
+ _scene->_sequences.setDepth(_globals._sequenceIndexes[11], 1);
+ _scene->_sequences.addTimer(20, 100);
+ _scene->_sequences.remove(_globals._sequenceIndexes[7]);
+ _game._objects.addToInventory(OBJ_FORMALDEHYDE);
+ _action._inProgress = false;
+ return;
+ }
+
+ if (_game._trigger == 100) {
+ _scene->_sequences.remove(_globals._sequenceIndexes[11]);
+ _game._player._priorTimer = _scene->_frameStartTime - _game._player._ticksAmount;
+ _game._player._visible = true;
+ _game._player._stepEnabled = true;
+ _scene->_sequences.addTimer(20, 10);
+ }
+
+ if (_game._trigger == 10)
+ _vm->_dialogs->showItem(OBJ_FORMALDEHYDE, 41124);
+
+ if (_action.isAction(VERB_PUT) && _action.isTarget(NOUN_KETTLE)) {
+ if (_action.isObject(NOUN_PETROX) ||
+ _action.isObject(NOUN_FORMALDEHYDE) ||
+ _action.isObject(NOUN_LECITHIN) ||
+ _action.isObject(NOUN_ALIEN_LIQUOR)) {
+ _newIngredient = _game._objects.getIdFromDesc(_action._activeAction._objectNameId);
+ switch (_newIngredient) {
+ case OBJ_ALIEN_LIQUOR:
+ _dialog1.start();
+ break;
+
+ case OBJ_FORMALDEHYDE:
+ _dialog3.start();
+ break;
+
+ case OBJ_PETROX:
+ _dialog4.start();
+ break;
+
+ case OBJ_LECITHIN:
+ _dialog2.start();
+ break;
+
+ default:
+ break;
+ }
+ }
+ }
+
+
+ if (_action.isAction(VERB_LOOK, NOUN_MONITOR))
+ _vm->_dialogs->show(41110);
+ else if (_action.isAction(VERB_LOOK, NOUN_AIR_PURIFIER))
+ _vm->_dialogs->show(41111);
+ else if (_action.isAction(VERB_LOOK, NOUN_LAB_EQUIPMENT))
+ _vm->_dialogs->show(41112);
+ else if (_action.isAction(VERB_LOOK, NOUN_KNIFE_SWITCH))
+ _vm->_dialogs->show(41113);
+ else if (_action.isAction(VERB_PUSH, NOUN_KNIFE_SWITCH) || _action.isAction(VERB_PULL, NOUN_KNIFE_SWITCH))
+ _vm->_dialogs->show(41114);
+ else if (_action.isAction(VERB_LOOK, NOUN_TOXIC_WASTE))
+ _vm->_dialogs->show(41115);
+ else if (_action.isAction(VERB_TAKE, NOUN_TOXIC_WASTE))
+ _vm->_dialogs->show(41116);
+ else if (_action.isAction(VERB_LOOK, NOUN_DRAWING_BOARD))
+ _vm->_dialogs->show(41117);
+ else if (_action.isAction(VERB_LOOK, NOUN_EXPERIMENT))
+ _vm->_dialogs->show(41118);
+ else if (_action.isAction(VERB_LOOK, NOUN_PETROX) && _game._objects.isInRoom(OBJ_PETROX))
+ _vm->_dialogs->show(41119);
+ else if (_action.isAction(VERB_LOOK, NOUN_ALCOVE))
+ _vm->_dialogs->show(41121);
+ else if ((_action.isAction(VERB_LOOK, NOUN_FORMALDEHYDE)) && (_game._objects.isInRoom(OBJ_FORMALDEHYDE)))
+ _vm->_dialogs->show(41122);
+ else if ((_action.isAction(VERB_LOOK, NOUN_LECITHIN)) && (_game._objects.isInRoom(OBJ_LECITHIN)))
+ _vm->_dialogs->show(41123);
+ else if (_action.isAction(VERB_LOOK, NOUN_KETTLE)) {
+ if (_globals[kNextIngredient] > 0 && !_game._objects[OBJ_CHARGE_CASES].getQuality(3)) {
+ _vm->_dialogs->show(41126);
+ } else if (_globals[kNextIngredient] == 0 || _game._objects[OBJ_CHARGE_CASES].getQuality(3)) {
+ _vm->_dialogs->show(41125);
+ }
+ } else if (_action.isAction(VERB_LOOK, NOUN_EXPLOSIVES) && _game._objects[OBJ_CHARGE_CASES].getQuality(3) == 0) {
+ _vm->_dialogs->show(41127);
+ } else if (_action.isAction(VERB_TAKE, NOUN_KETTLE))
+ _vm->_dialogs->show(41128);
+ else if (_action.isAction(VERB_LOOK, NOUN_CONTROL_PANEL))
+ _vm->_dialogs->show(41129);
+ else if (_action.isAction(VERB_LOOK, NOUN_MISHAP))
+ _vm->_dialogs->show(41130);
+ else if (_action.isAction(VERB_LOOK, NOUN_CORRIDOR_TO_SOUTH))
+ _vm->_dialogs->show(41131);
+ else if (_action._lookFlag)
+ _vm->_dialogs->show(41132);
+ else if (_action.isAction(VERB_LOOK, NOUN_AIR_HORN))
+ _vm->_dialogs->show(41133);
+ else if (_action.isAction(VERB_LOOK, NOUN_DEBRIS))
+ _vm->_dialogs->show(41134);
+ else if (_action.isAction(VERB_LOOK, NOUN_HEATER))
+ _vm->_dialogs->show(41135);
+ else if (_action.isAction(VERB_LOOK, NOUN_PIPE))
+ _vm->_dialogs->show(41136);
+ else if (_action.isAction(VERB_LOOK, NOUN_SINK))
+ _vm->_dialogs->show(41137);
+ else if (_action.isAction(VERB_PUT, NOUN_SINK))
+ _vm->_dialogs->show(41138);
+ else if (_action.isAction(VERB_TAKE, NOUN_EXPERIMENT))
+ _vm->_dialogs->show(41139);
+ else if (_action.isAction(VERB_LOOK, NOUN_ELECTRODES))
+ _vm->_dialogs->show(41140);
+ else if (_action.isAction(VERB_TAKE, NOUN_ELECTRODES))
+ _vm->_dialogs->show(41141);
+ else
+ return;
+
+ _action._inProgress = false;
+}
+
+/*------------------------------------------------------------------------*/
+
+Scene413::Scene413(MADSEngine *vm) : Scene4xx(vm) {
+ _rexDeath = -1;
+ _canMove = -1;
+}
+
+void Scene413::synchronize(Common::Serializer &s) {
+ Scene4xx::synchronize(s);
+
+ s.syncAsSint32LE(_rexDeath);
+ s.syncAsSint32LE(_canMove);
+}
+
+void Scene413::setup() {
+ setPlayerSpritesPrefix();
+ setAAName();
+}
+
+void Scene413::enter() {
+ _globals._spriteIndexes[1] = _scene->_sprites.addSprites(formAnimName('a', 2));
+ _rexDeath = false;
+
+ if (_scene->_priorSceneId == 405) {
+ _game._player._playerPos = Common::Point(142, 146);
+ _game._player._facing = FACING_NORTH;
+ _game._player._visible = true;
+ } else if (_scene->_priorSceneId != -2) {
+ if (_globals[kSexOfRex] == REX_MALE) {
+ _scene->loadAnimation(Resources::formatName(413, 'd', 1, EXT_AA, ""), 78);
+ _vm->_sound->command(30);
+ _game._player._visible = false;
+ _game._player._stepEnabled = false;
+ _rexDeath = true;
+ } else if (!_globals[kTeleporterCommand]) {
+ _game._player._playerPos = Common::Point(136, 117);
+ _game._player.walk(Common::Point(141, 130), FACING_SOUTH);
+ _game._player._facing = FACING_SOUTH;
+ _game._player._visible = true;
+ }
+ }
+
+ if ((_globals[kTeleporterCommand]) && (!_rexDeath)) {
+ switch (_globals[kTeleporterCommand]) {
+ case 1:
+ _vm->_sound->command(30);
+ _game._player._visible = false;
+ _globals._sequenceIndexes[1] = _scene->_sequences.startReverseCycle(_globals._spriteIndexes[1], false, 7, 1, 0, 0);
+ _scene->_sequences.setAnimRange(_globals._sequenceIndexes[1], 1, 19);
+ _scene->_sequences.setDepth(_globals._sequenceIndexes[1], 8);
+ _scene->_sequences.addSubEntry(_globals._sequenceIndexes[1], SEQUENCE_TRIGGER_EXPIRE, 0, 76);
+ break;
+
+ case 2:
+ _game._player._visible = false;
+ _vm->_sound->command(30);
+ _globals._sequenceIndexes[1] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[1], false, 7, 1, 0, 0);
+ _scene->_sequences.setAnimRange(_globals._sequenceIndexes[1], 1, 20);
+ _scene->_sequences.setDepth(_globals._sequenceIndexes[1], 8);
+ _scene->_sequences.addSubEntry(_globals._sequenceIndexes[1], SEQUENCE_TRIGGER_EXPIRE, 0, 77);
+ break;
+
+ case 3:
+ case 4:
+ _game._player._playerPos = Common::Point(136, 117);
+ _game._player._facing = FACING_SOUTH;
+ _game._player.walk(Common::Point(141, 130), FACING_SOUTH);
+ _game._player._visible = true;
+ _game._player._stepEnabled = true;
+ break;
+
+ default:
+ break;
+ }
+ _globals[kTeleporterCommand] = 0;
+ }
+
+ _canMove = true;
+ sceneEntrySound();
+}
+
+void Scene413::step() {
+ if (_scene->_activeAnimation && _scene->_activeAnimation->getCurrentFrame() == 38)
+ _scene->_activeAnimation->setCurrentFrame(37);
+
+ if (_scene->_activeAnimation && _scene->_activeAnimation->getCurrentFrame() == 21 && _canMove) {
+ _vm->_sound->command(27);
+ _canMove = false;
+ }
+
+ if (_game._trigger == 76) {
+ _game._player._playerPos = Common::Point(136, 117);
+ _game._player.walk(Common::Point(141, 130), FACING_SOUTH);
+ _game._player._facing = FACING_SOUTH;
+ _game._player.selectSeries();
+ _game._player._visible = true;
+ _game._player._stepEnabled = true;
+ }
+
+ if (_game._trigger == 77) {
+ _globals[kTeleporterCommand] = TELEPORTER_BEAM_IN;
+ _scene->_nextSceneId = _globals[kTeleporterDestination];
+ _scene->_reloadSceneFlag = true;
+ }
+
+ if (_game._trigger == 78) {
+ _scene->_reloadSceneFlag = true;
+ _scene->_nextSceneId = _scene->_priorSceneId;
+ _globals[kTeleporterCommand] = TELEPORTER_NONE;
+ }
+}
+
+void Scene413::preActions() {
+ if (_action.isAction(VERB_TAKE) || _action.isAction(VERB_PUT, NOUN_CONVEYOR_BELT))
+ _game._player._needToWalk = false;
+
+ if (_action.isAction(VERB_LOOK, NOUN_WOODEN_STATUE) || _action.isAction(VERB_LOOK, NOUN_DISPLAY)
+ || _action.isAction(VERB_LOOK, NOUN_PICTURE) || _action.isAction(VERB_LOOK, NOUN_PLANT)) {
+ _game._player._needToWalk = true;
+ }
+}
+
+void Scene413::actions() {
+ if (_action.isAction(VERB_WALK_INSIDE, NOUN_TELEPORTER)) {
+ _game._player._stepEnabled = false;
+ _game._player._visible = false;
+ _scene->_nextSceneId = 409;
+ } else if (_action.isAction(VERB_WALK_INTO, NOUN_CORRIDOR_TO_SOUTH))
+ _scene->_nextSceneId = 405;
+ else if (_action.isAction(VERB_LOOK, NOUN_WOODEN_STATUE))
+ _vm->_dialogs->show(41310);
+ else if (_action.isAction(VERB_TAKE, NOUN_WOODEN_STATUE))
+ _vm->_dialogs->show(41311);
+ else if (_action.isAction(VERB_LOOK, NOUN_CONVEYOR_BELT))
+ _vm->_dialogs->show(41312);
+ else if (_action.isAction(VERB_PUT, NOUN_CONVEYOR_BELT))
+ _vm->_dialogs->show(41313);
+ else if (_action.isAction(VERB_LOOK, NOUN_TELEPORTER))
+ _vm->_dialogs->show(41314);
+ else if (_action.isAction(VERB_LOOK, NOUN_DISPLAY))
+ _vm->_dialogs->show(41315);
+ else if (_action.isAction(VERB_LOOK, NOUN_CORRIDOR_TO_SOUTH))
+ _vm->_dialogs->show(41316);
+ else if (_action.isAction(VERB_LOOK, NOUN_PICTURE))
+ _vm->_dialogs->show(41317);
+ else if (_action.isAction(VERB_LOOK, NOUN_PLANT))
+ _vm->_dialogs->show(41318);
+ else if (_action.isAction(VERB_TAKE, NOUN_PLANT))
+ _vm->_dialogs->show(41319);
+ else if (_action._lookFlag)
+ _vm->_dialogs->show(41320);
+ else
+ return;
+
+ _action._inProgress = false;
+}
+
+/*------------------------------------------------------------------------*/
+
+} // End of namespace Nebular
+} // End of namespace MADS
diff --git a/engines/mads/nebular/nebular_scenes4.h b/engines/mads/nebular/nebular_scenes4.h
new file mode 100644
index 0000000000..fbd5ce81f0
--- /dev/null
+++ b/engines/mads/nebular/nebular_scenes4.h
@@ -0,0 +1,258 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+
+ * You should have received a copy of the GNU General Public 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 MADS_NEBULAR_SCENES4_H
+#define MADS_NEBULAR_SCENES4_H
+
+#include "common/scummsys.h"
+#include "mads/game.h"
+#include "mads/scene.h"
+#include "mads/nebular/nebular_scenes.h"
+
+namespace MADS {
+
+namespace Nebular {
+
+class Scene4xx : public NebularScene {
+protected:
+ /**
+ * Plays an appropriate sound when entering a scene
+ */
+ void setAAName();
+
+ /**
+ * Updates the prefix used for getting player sprites for the scene
+ */
+ void setPlayerSpritesPrefix();
+
+ void sceneEntrySound();
+
+public:
+ Scene4xx(MADSEngine *vm) : NebularScene(vm) {}
+};
+
+class Scene401 : public Scene4xx {
+private:
+ bool _northFl;
+ Common::Point _destPos;
+ uint32 _timer;
+
+public:
+ Scene401(MADSEngine *vm);
+ void synchronize(Common::Serializer &s);
+
+ virtual void setup();
+ virtual void enter();
+ virtual void step();
+ virtual void preActions();
+ virtual void actions();
+};
+
+class Scene402 : public Scene4xx {
+private:
+ bool _lightOn;
+ bool _blowingSmoke;
+ bool _leftWomanMoving;
+ bool _rightWomanMoving;
+ bool _firstTalkToGirlInChair;
+ bool _waitingGinnyMove;
+ bool _ginnyLooking;
+ bool _bigBeatFl;
+ bool _roxOnStool;
+ bool _bartenderSteady;
+ bool _bartenderHandsHips;
+ bool _bartenderLooksLeft;
+ bool _bartenderReady;
+ bool _bartenderTalking;
+ bool _bartenderCalled;
+ bool _conversationFl;
+ bool _activeTeleporter;
+ bool _activeArrows;
+ bool _activeArrow1;
+ bool _activeArrow2;
+ bool _activeArrow3;
+ bool _cutSceneReady;
+ bool _cutSceneNeeded;
+ bool _helgaReady;
+ bool _refuseAlienLiquor;
+
+ int _drinkTimer;
+ int _beatCounter;
+ int _bartenderMode;
+ int _bartenderDialogNode;
+ int _bartenderCurrentQuestion;
+ int _helgaTalkMode;
+ int _roxMode;
+ int _rexMode;
+ int _talkTimer;
+
+ Conversation _dialog1;
+ Conversation _dialog2;
+ Conversation _dialog3;
+ Conversation _dialog4;
+
+ void setDialogNode(int node);
+ void handleConversation1();
+ void handleConversation2();
+ void handleConversation3();
+ void handleConversation4();
+ void handleDialogs();
+
+public:
+ Scene402(MADSEngine *vm);
+ void synchronize(Common::Serializer &s);
+
+ virtual void setup();
+ virtual void enter();
+ virtual void step();
+ virtual void preActions();
+ virtual void actions();
+};
+
+class Scene405 : public Scene4xx {
+public:
+ Scene405(MADSEngine *vm) : Scene4xx(vm) {}
+
+ virtual void setup();
+ virtual void enter();
+ virtual void step();
+ virtual void preActions();
+ virtual void actions();
+};
+
+class Scene406 : public Scene4xx {
+private:
+ bool _hitStorageDoor;
+
+public:
+ Scene406(MADSEngine *vm);
+ void synchronize(Common::Serializer &s);
+
+ virtual void setup();
+ virtual void enter();
+ virtual void step();
+ virtual void preActions();
+ virtual void actions();
+};
+
+class Scene407 : public Scene4xx {
+private:
+ bool _fromNorth;
+ Common::Point _destPos;
+
+public:
+ Scene407(MADSEngine *vm);
+ void synchronize(Common::Serializer &s);
+
+ virtual void setup();
+ virtual void enter();
+ virtual void step();
+ virtual void preActions();
+ virtual void actions();
+};
+
+class Scene408 : public Scene4xx {
+public:
+ Scene408(MADSEngine *vm) : Scene4xx(vm) {}
+
+ virtual void setup();
+ virtual void enter();
+ virtual void preActions();
+ virtual void actions();
+};
+
+class Scene409 : public SceneTeleporter {
+public:
+ Scene409(MADSEngine *vm) : SceneTeleporter(vm) {}
+
+ virtual void setup();
+ virtual void enter();
+ virtual void step();
+ virtual void actions();
+};
+
+class Scene410 : public Scene4xx {
+public:
+ Scene410(MADSEngine *vm) : Scene4xx(vm) {}
+
+ virtual void setup();
+ virtual void enter();
+ virtual void step();
+ virtual void preActions();
+ virtual void actions();
+};
+
+class Scene411 : public Scene4xx {
+private:
+ int _curAnimationFrame;
+ int _newIngredient;
+ int _newQuantity;
+ int _resetFrame;
+ int _badThreshold;
+
+ bool _killRox;
+ bool _makeMushroomCloud;
+
+ Conversation _dialog1;
+ Conversation _dialog2;
+ Conversation _dialog3;
+ Conversation _dialog4;
+
+ void giveToRex(int object);
+ void handleDialog();
+ void handleKettleAction();
+
+ int computeQuoteAndQuantity();
+
+ bool addQuantity();
+ bool addIngredient();
+
+public:
+ Scene411(MADSEngine *vm);
+ void synchronize(Common::Serializer &s);
+
+ virtual void setup();
+ virtual void enter();
+ virtual void step();
+ virtual void preActions();
+ virtual void actions();
+};
+
+class Scene413 : public Scene4xx {
+private:
+ int _rexDeath;
+ int _canMove;
+
+public:
+ Scene413(MADSEngine *vm);
+ void synchronize(Common::Serializer &s);
+
+ virtual void setup();
+ virtual void enter();
+ virtual void step();
+ virtual void preActions();
+ virtual void actions();
+};
+} // End of namespace Nebular
+} // End of namespace MADS
+
+#endif /* MADS_NEBULAR_SCENES4_H */
diff --git a/engines/mads/nebular/nebular_scenes5.cpp b/engines/mads/nebular/nebular_scenes5.cpp
new file mode 100644
index 0000000000..5a67d1541f
--- /dev/null
+++ b/engines/mads/nebular/nebular_scenes5.cpp
@@ -0,0 +1,2872 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+
+ * You should have received a copy of the GNU General Public 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 "mads/mads.h"
+#include "mads/scene.h"
+#include "mads/nebular/nebular_scenes.h"
+#include "mads/nebular/nebular_scenes5.h"
+
+namespace MADS {
+
+namespace Nebular {
+
+void Scene5xx::setAAName() {
+ _game._aaName = Resources::formatAAName(5);
+}
+
+void Scene5xx::setPlayerSpritesPrefix() {
+ _vm->_sound->command(5);
+
+ Common::String oldName = _game._player._spritesPrefix;
+
+ if ((_scene->_nextSceneId == 502) || (_scene->_nextSceneId == 504) || (_scene->_nextSceneId == 505) || (_scene->_nextSceneId == 515))
+ _game._player._spritesPrefix = "";
+ else if (_globals[kSexOfRex] == REX_MALE)
+ _game._player._spritesPrefix = "RXM";
+ else if ((_scene->_nextSceneId == 501) || (_scene->_nextSceneId == 503) || (_scene->_nextSceneId == 551))
+ _game._player._spritesPrefix = "ROX";
+
+ _game._player._scalingVelocity = true;
+
+ if ((_scene->_nextSceneId == 512) || (_scene->_nextSceneId == 507))
+ _game._player._scalingVelocity = false;
+
+ if (oldName != _game._player._spritesPrefix)
+ _game._player._spritesChanged = true;
+
+ _vm->_palette->setEntry(16, 10, 63, 63);
+ _vm->_palette->setEntry(17, 10, 45, 45);
+}
+
+void Scene5xx::sceneEntrySound() {
+ if (!_vm->_musicFlag) {
+ _vm->_sound->command(2);
+ return;
+ }
+
+ switch (_scene->_nextSceneId) {
+ case 501:
+ case 502:
+ case 504:
+ case 505:
+ case 506:
+ case 507:
+ case 508:
+ case 511:
+ case 512:
+ case 513:
+ case 515:
+ case 551:
+ if (_scene->_priorSceneId == 503)
+ _vm->_sound->command(38);
+ else
+ _vm->_sound->command(29);
+ break;
+ case 503:
+ _vm->_sound->command(41);
+ break;
+ default:
+ break;
+ }
+}
+
+/*------------------------------------------------------------------------*/
+
+Scene501::Scene501(MADSEngine *vm) : Scene5xx(vm) {
+ _mainSequenceId = -1;
+ _mainSpriteId = -1;
+ _doorHotspotid = -1;
+
+ _rexPunched = false;
+}
+
+void Scene501::synchronize(Common::Serializer &s) {
+ Scene5xx::synchronize(s);
+
+ s.syncAsSint16LE(_mainSequenceId);
+ s.syncAsSint16LE(_mainSpriteId);
+ s.syncAsSint16LE(_doorHotspotid);
+ s.syncAsByte(_rexPunched);
+}
+
+void Scene501::setup() {
+ setPlayerSpritesPrefix();
+ setAAName();
+ _scene->addActiveVocab(NOUN_DOOR);
+ _scene->addActiveVocab(VERB_WALK_THROUGH);
+}
+
+void Scene501::handleSlotActions() {
+ switch (_game._trigger) {
+ case 0:
+ _game._player._stepEnabled = false;
+ _game._player._visible = false;
+ int numTicks, frameIndex;
+ if (_globals[kSexOfRex] == REX_MALE) {
+ _mainSpriteId = _globals._spriteIndexes[4];
+ numTicks = 8;
+ frameIndex = 3;
+ } else {
+ _mainSpriteId = _globals._spriteIndexes[5];
+ numTicks = 10;
+ frameIndex = 2;
+ }
+
+ _mainSequenceId = _scene->_sequences.startReverseCycle(_mainSpriteId, false, numTicks, 1, 0, 0);
+ _scene->_sequences.setAnimRange(_mainSequenceId, 1, frameIndex);
+ _scene->_sequences.setMsgLayout(_mainSequenceId);
+ _vm->_sound->command(10);
+ _scene->_sequences.addSubEntry(_mainSequenceId, SEQUENCE_TRIGGER_SPRITE, frameIndex, 1);
+ _scene->_sequences.addSubEntry(_mainSequenceId, SEQUENCE_TRIGGER_EXPIRE, 0, 2);
+ break;
+
+ case 1:
+ _globals._sequenceIndexes[1] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[1], false, 12, 6, 0, 0);
+ break;
+
+ case 2:
+ _scene->_sequences.updateTimeout(-1, _mainSequenceId);
+ _game._player._visible = true;
+ _scene->_sequences.addTimer(15, 3);
+ break;
+
+ case 3:
+ _game._player.walk(Common::Point(282, 110), FACING_NORTH);
+ _scene->_sequences.addTimer(60, 4);
+ break;
+
+ default:
+ break;
+ }
+}
+
+void Scene501::enter() {
+ _globals._spriteIndexes[1] = _scene->_sprites.addSprites(formAnimName('x', 1));
+ _globals._spriteIndexes[2] = _scene->_sprites.addSprites(formAnimName('c', 0));
+ _globals._spriteIndexes[3] = _scene->_sprites.addSprites(formAnimName('x', 0));
+
+ if (_globals[kSexOfRex] == REX_MALE) {
+ _globals._spriteIndexes[4] = _scene->_sprites.addSprites("*RXMRC_9");
+ _globals._spriteIndexes[6] = _scene->_sprites.addSprites("*RXCD_7");
+ } else {
+ _globals._spriteIndexes[5] = _scene->_sprites.addSprites("*ROXRC_9");
+ _globals._spriteIndexes[7] = _scene->_sprites.addSprites("*ROXCD_7");
+ }
+
+ _globals._sequenceIndexes[3] = _scene->_sequences.startCycle(_globals._spriteIndexes[3], false, 1);
+ int idx = _scene->_dynamicHotspots.add(NOUN_DOOR, VERB_WALK_THROUGH, _globals._sequenceIndexes[3], Common::Rect(0, 0, 0, 0));
+ _doorHotspotid = _scene->_dynamicHotspots.setPosition(idx,Common::Point(282, 110), FACING_NORTH);
+ _scene->_dynamicHotspots.setCursor(_doorHotspotid, CURSOR_GO_UP);
+ _scene->_sequences.setDepth(_globals._sequenceIndexes[3], 7);
+ _globals._sequenceIndexes[2] = _scene->_sequences.startCycle(_globals._spriteIndexes[2], false, -1);
+ _scene->_sequences.setDepth(_globals._sequenceIndexes[2], 4);
+ _rexPunched = true;
+
+ if (_scene->_priorSceneId == 504) {
+ _game._player._stepEnabled = false;
+ _game._player._playerPos = Common::Point(74, 121);
+ _game._player._facing = FACING_NORTHWEST;
+ _game._player._visible = false;
+ _game._player._stepEnabled = false;
+ _scene->_sequences.remove(_globals._sequenceIndexes[2]);
+ _globals._sequenceIndexes[2] = _scene->_sequences.startCycle(_globals._spriteIndexes[2], false, -2);
+ _scene->_sequences.setDepth(_globals._sequenceIndexes[2], 4);
+ if (_globals[kSexOfRex] == REX_MALE)
+ _scene->loadAnimation(formAnimName('G', 2), 70);
+ else
+ _scene->loadAnimation(formAnimName('R', 2), 70);
+ } else if (_scene->_priorSceneId == 503) {
+ _game._player._playerPos = Common::Point(317, 102);
+ _game._player._facing = FACING_SOUTHWEST;
+ _scene->_sequences.addTimer(15, 80);
+ } else if (_scene->_priorSceneId != -2)
+ _game._player._playerPos = Common::Point(299, 131);
+
+ if (_scene->_roomChanged) {
+ _game._objects.addToInventory(OBJ_FAKE_ID);
+ _game._objects.addToInventory(OBJ_SECURITY_CARD);
+ _game._objects.addToInventory(OBJ_ID_CARD);
+ }
+
+ sceneEntrySound();
+ _game.loadQuoteSet(0x275, 0x276, 0x277, 0);
+
+ if (!_game._visitedScenes._sceneRevisited)
+ _scene->_sequences.addTimer(2, 90);
+}
+
+void Scene501::step() {
+ if (_game._trigger == 90)
+ _vm->_dialogs->show(50127);
+
+ if (_game._trigger >= 80) {
+ switch (_game._trigger) {
+ case 80:
+ _game._player._stepEnabled = false;
+ _scene->_sequences.remove(_globals._sequenceIndexes[3]);
+ _globals._sequenceIndexes[1] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[1], false, 12, 6, 0, 0);
+ _globals._sequenceIndexes[3] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[3], false, 9, 1, 0, 0);
+ _scene->_sequences.setDepth(_globals._sequenceIndexes[3], 7);
+ _vm->_sound->command(11);
+ _scene->_sequences.addSubEntry(_globals._sequenceIndexes[3], SEQUENCE_TRIGGER_EXPIRE, 0, 81);
+ break;
+
+ case 81:
+ _scene->_dynamicHotspots.remove(_doorHotspotid);
+ _game._player.walk(Common::Point(276, 110), FACING_SOUTHWEST);
+ _scene->_sequences.addTimer(120, 82);
+ break;
+
+ case 82:
+ _globals._sequenceIndexes[3] = _scene->_sequences.startReverseCycle(_globals._spriteIndexes[3], false, 9, 1, 0, 0);
+ _scene->_sequences.setDepth(_globals._sequenceIndexes[3], 7);
+ _vm->_sound->command(12);
+ _doorHotspotid = _scene->_dynamicHotspots.add(NOUN_DOOR, VERB_WALK_THROUGH, _globals._sequenceIndexes[3], Common::Rect(0, 0, 0, 0));
+ _scene->_dynamicHotspots.setPosition(_globals._sequenceIndexes[3], Common::Point(282, 110), FACING_NORTH);
+ _scene->_dynamicHotspots.setCursor(_doorHotspotid, CURSOR_GO_UP);
+ _scene->_sequences.addSubEntry(_globals._sequenceIndexes[3], SEQUENCE_TRIGGER_EXPIRE, 0, 83);
+ break;
+
+ case 83:
+ _game._player._stepEnabled = true;
+ _globals._sequenceIndexes[3] = _scene->_sequences.startCycle(_globals._spriteIndexes[3], false, -1);
+ _scene->_sequences.setDepth(_globals._sequenceIndexes[3], 7);
+ break;
+
+ default:
+ break;
+ }
+ }
+
+ if (_game._trigger >= 70 && _game._trigger <= 73) {
+ switch (_game._trigger) {
+ case 70:
+ _game._player._visible = true;
+ _game._player._priorTimer = _scene->_frameStartTime - _game._player._ticksAmount;
+ _scene->_sequences.addTimer(15, 71);
+ break;
+
+ case 71:
+ _game._player.walk(Common::Point(92, 130), FACING_SOUTH);
+ _scene->_sequences.addTimer(30, 72);
+ break;
+
+ case 72:
+ _scene->_sequences.remove(_globals._sequenceIndexes[2]);
+ _globals._sequenceIndexes[2] = _scene->_sequences.startReverseCycle(_globals._spriteIndexes[2], false, 6, 1, 0, 0);
+ _scene->_sequences.setDepth(_globals._sequenceIndexes[2], 4);
+ _scene->_sequences.addSubEntry(_globals._sequenceIndexes[2], SEQUENCE_TRIGGER_EXPIRE, 0, 73);
+ break;
+
+ case 73:
+ _game._player._stepEnabled = true;
+ _globals._sequenceIndexes[2] = _scene->_sequences.startCycle(_globals._spriteIndexes[2], false, -1);
+ _scene->_sequences.setDepth(_globals._sequenceIndexes[2], 4);
+ break;
+
+ default:
+ break;
+ }
+ }
+}
+
+void Scene501::preActions() {
+ if (_action.isAction(VERB_WALK_DOWN) && (_action.isObject(NOUN_STREET_TO_EAST) || _action.isObject(NOUN_SIDEWALK_TO_EAST)))
+ _game._player._walkOffScreenSceneId = 551;
+}
+
+void Scene501::actions() {
+ if (_action.isAction(VERB_GET_INTO, NOUN_CAR)) {
+ switch (_game._trigger) {
+ case 0:
+ _game._player._stepEnabled = false;
+ _scene->_sequences.remove(_globals._sequenceIndexes[2]);
+ _globals._sequenceIndexes[2] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[2], false, 6, 1, 0, 0);
+ _scene->_sequences.setDepth(_globals._sequenceIndexes[2], 4);
+ _scene->_sequences.addSubEntry(_globals._sequenceIndexes[2], SEQUENCE_TRIGGER_EXPIRE, 0, 1);
+ break;
+
+ case 1: {
+ int syncIdx = _globals._sequenceIndexes[2];
+ _globals._sequenceIndexes[2] = _scene->_sequences.startCycle(_globals._spriteIndexes[2], false, -2);
+ _scene->_sequences.setDepth(_globals._sequenceIndexes[2], 4);
+ _scene->_sequences.updateTimeout(_globals._sequenceIndexes[2], syncIdx);
+ _scene->_sequences.addTimer(15, 2);
+ }
+ break;
+
+ case 2:
+ _game._player._visible = false;
+ if (_globals[kSexOfRex] == REX_MALE)
+ _mainSpriteId = _globals._spriteIndexes[6];
+ else
+ _mainSpriteId = _globals._spriteIndexes[7];
+
+ _mainSequenceId = _scene->_sequences.addSpriteCycle(_mainSpriteId, false, 8, 1, 0, 0);
+ _scene->_sequences.setMsgLayout(_mainSequenceId);
+ _scene->_sequences.addSubEntry(_mainSequenceId, SEQUENCE_TRIGGER_EXPIRE, 0, 3);
+ break;
+
+ case 3: {
+ int syncIdx = _mainSequenceId;
+ _mainSequenceId = _scene->_sequences.startCycle(_mainSpriteId, false, -2);
+ _scene->_sequences.setMsgLayout(_mainSequenceId);
+ _scene->_sequences.updateTimeout(_mainSequenceId, syncIdx);
+ _scene->_sequences.addTimer(30, 4);
+ }
+ break;
+
+ case 4:
+ _scene->_nextSceneId = 504;
+ break;
+
+ default:
+ break;
+ }
+ } else if (_action.isAction(VERB_PUT, NOUN_SECURITY_CARD, NOUN_CARD_SLOT))
+ _vm->_dialogs->show(50113);
+ else if (_action.isAction(VERB_PUT, NOUN_FAKE_ID, NOUN_CARD_SLOT)) {
+ switch (_game._trigger) {
+ case 0:
+ case 1:
+ case 2:
+ case 3:
+ handleSlotActions();
+ break;
+
+ case 4:
+ if (_globals[kSexOfRex] == REX_MALE) {
+ _game._player._visible = false;
+ _vm->_sound->command(13);
+ _scene->loadAnimation(formAnimName('G', 1), 5);
+ } else {
+ _rexPunched = false;
+ _scene->_kernelMessages.reset();
+ _scene->_kernelMessages.add(Common::Point(0, 0), 0x1110, 34, 6, 120, _game.getQuote(0x277));
+ }
+ break;
+
+ case 5:
+ _game._player._visible = true;
+ _game._player._priorTimer = _scene->_frameStartTime - _game._player._ticksAmount;
+ _scene->_sequences.addTimer(30, 6);
+ break;
+
+ case 6:
+ if (_globals[kSexOfRex] == REX_MALE) {
+ if (_rexPunched) {
+ _scene->_kernelMessages.reset();
+ _scene->_kernelMessages.add(Common::Point(0, 0), 0x1110, 34, 0, 120, _game.getQuote(0x275));
+ _rexPunched = false;
+ } else {
+ _scene->_kernelMessages.reset();
+ _scene->_kernelMessages.add(Common::Point(0, 0), 0x1110, 34, 0, 120, _game.getQuote(0x276));
+ }
+ }
+ _game._player._stepEnabled = true;
+ break;
+
+ default:
+ break;
+ }
+ } else if (_action.isAction(VERB_PUT, NOUN_ID_CARD, NOUN_CARD_SLOT)) {
+ switch (_game._trigger) {
+ case 0:
+ case 1:
+ case 2:
+ case 3:
+ handleSlotActions();
+ break;
+
+ case 4:
+ _scene->_sequences.remove(_globals._sequenceIndexes[3]);
+ _scene->_dynamicHotspots.remove(_doorHotspotid);
+ _globals._sequenceIndexes[3] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[3], false, 9, 1, 0, 0);
+ _scene->_sequences.setDepth(_globals._sequenceIndexes[3], 7);
+ _vm->_sound->command(11);
+ _scene->_sequences.addSubEntry(_globals._sequenceIndexes[3], SEQUENCE_TRIGGER_EXPIRE, 0, 6);
+ break;
+
+ case 6:
+ _game._player.walk(Common::Point(317, 102), FACING_NORTHEAST);
+ _scene->_sequences.addTimer(120, 7);
+ break;
+
+ case 7: {
+ _vm->_sound->command(12);
+ int syncIdx = _globals._sequenceIndexes[3];
+ _globals._sequenceIndexes[3] = _scene->_sequences.startReverseCycle(_globals._spriteIndexes[3], false, 9, 1, 0, 0);
+ _scene->_sequences.setDepth(_globals._sequenceIndexes[3], 7);
+ _scene->_sequences.updateTimeout(_globals._sequenceIndexes[3], syncIdx);
+ _vm->_sound->command(12);
+ _scene->_sequences.addSubEntry(_globals._sequenceIndexes[3], SEQUENCE_TRIGGER_EXPIRE, 0, 8);
+ }
+ break;
+
+ case 8: {
+ int syncIdx = _globals._sequenceIndexes[3];
+ _globals._sequenceIndexes[3] = _scene->_sequences.startCycle(_globals._spriteIndexes[3], false, 1);
+ _scene->_sequences.setDepth(_globals._sequenceIndexes[3], 7);
+ _scene->_sequences.updateTimeout(_globals._sequenceIndexes[3], syncIdx);
+ _scene->_nextSceneId = 503;
+ }
+ break;
+
+ default:
+ break;
+ }
+ } else if (_action._lookFlag || _action.isAction(VERB_LOOK, NOUN_STREET))
+ _vm->_dialogs->show(50121);
+ else if (_action.isAction(VERB_LOOK, NOUN_DOOR))
+ _vm->_dialogs->show(50110);
+ else if (_action.isAction(VERB_LOOK, NOUN_CARD_SLOT))
+ _vm->_dialogs->show(50112);
+ else if (_action.isAction(VERB_LOOK, NOUN_SIGN))
+ _vm->_dialogs->show(50114);
+ else if (_action.isAction(VERB_TAKE, NOUN_SIGN))
+ _vm->_dialogs->show(50115);
+ else if (_action.isAction(VERB_LOOK, NOUN_SIDEWALK_TO_EAST))
+ _vm->_dialogs->show(50118);
+ else if (_action.isAction(VERB_LOOK, NOUN_SIDEWALK_TO_WEST) || _action.isAction(VERB_LOOK, NOUN_STREET_TO_WEST)
+ || _action.isAction(VERB_WALK_DOWN, NOUN_SIDEWALK_TO_WEST) || _action.isAction(VERB_WALK_DOWN, NOUN_STREET_TO_WEST))
+ _vm->_dialogs->show(50119);
+ else if (_action.isAction(VERB_LOOK, NOUN_BUILDING))
+ _vm->_dialogs->show(50120);
+ else if (_action.isAction(VERB_OPEN, NOUN_DOOR))
+ _vm->_dialogs->show(50122);
+ else if (_action.isAction(VERB_LOOK, NOUN_FIRE_HYDRANT))
+ _vm->_dialogs->show(50123);
+ else if (_action.isAction(VERB_OPEN, NOUN_FIRE_HYDRANT))
+ _vm->_dialogs->show(50124);
+ else if (_action.isAction(VERB_LOOK, NOUN_EQUIPMENT_OVERHEAD))
+ _vm->_dialogs->show(50125);
+ else if (_action.isAction(VERB_LOOK, NOUN_PIPES) || _action.isAction(VERB_LOOK, NOUN_PIPE))
+ _vm->_dialogs->show(50126);
+ else if (_action.isAction(VERB_LOOK, NOUN_CAR)) {
+ if (!_game._visitedScenes.exists(504))
+ _vm->_dialogs->show(50116);
+ else
+ _vm->_dialogs->show(50117);
+ } else
+ return;
+
+ _action._inProgress = false;
+}
+
+/*------------------------------------------------------------------------*/
+
+void Scene502::setup() {
+ _game._player._spritesPrefix = "";
+ // The original is using Scene5xx_setAAName()
+ _game._aaName = Resources::formatAAName(5);
+}
+
+void Scene502::enter() {
+ if (_globals[kSexOfRex] == REX_MALE)
+ _handSpriteId = _scene->_sprites.addSprites("*REXHAND");
+ else
+ _handSpriteId = _scene->_sprites.addSprites("*ROXHAND");
+
+ teleporterEnter();
+
+ // The original uses scene5xx_sceneEntrySound
+ if (!_vm->_musicFlag)
+ _vm->_sound->command(2);
+ else if (_scene->_priorSceneId == 503)
+ _vm->_sound->command(38);
+ else
+ _vm->_sound->command(29);
+}
+
+void Scene502::step() {
+ teleporterStep();
+}
+
+void Scene502::actions() {
+ if (teleporterActions()) {
+ _action._inProgress = false;
+ return;
+ }
+
+ if (_action.isAction(VERB_LOOK, NOUN_VIEWPORT) || _action.isAction(VERB_PEER_THROUGH, NOUN_VIEWPORT))
+ _vm->_dialogs->show(50210);
+ else if (_action.isAction(VERB_LOOK, NOUN_KEYPAD))
+ _vm->_dialogs->show(50211);
+ else if (_action.isAction(VERB_LOOK, NOUN_DISPLAY))
+ _vm->_dialogs->show(50212);
+ else if (_action.isAction(VERB_LOOK, NOUN_0_KEY) || _action.isAction(VERB_LOOK, NOUN_1_KEY)
+ || _action.isAction(VERB_LOOK, NOUN_2_KEY) || _action.isAction(VERB_LOOK, NOUN_3_KEY)
+ || _action.isAction(VERB_LOOK, NOUN_4_KEY) || _action.isAction(VERB_LOOK, NOUN_5_KEY)
+ || _action.isAction(VERB_LOOK, NOUN_6_KEY) || _action.isAction(VERB_LOOK, NOUN_7_KEY)
+ || _action.isAction(VERB_LOOK, NOUN_8_KEY) || _action.isAction(VERB_LOOK, NOUN_9_KEY)
+ || _action.isAction(VERB_LOOK, NOUN_SMILE_KEY) || _action.isAction(VERB_LOOK, NOUN_ENTER_KEY)
+ || _action.isAction(VERB_LOOK, NOUN_FROWN_KEY))
+ _vm->_dialogs->show(50213);
+ else if (_action.isAction(VERB_LOOK, NOUN_DEVICE) || _action._lookFlag)
+ _vm->_dialogs->show(50214);
+ else
+ return;
+
+ _action._inProgress = false;
+}
+
+/*------------------------------------------------------------------------*/
+
+Scene503::Scene503(MADSEngine *vm) : Scene5xx(vm) {
+ _detonatorHotspotId = -1;
+}
+
+void Scene503::synchronize(Common::Serializer &s) {
+ Scene5xx::synchronize(s);
+
+ s.syncAsSint16LE(_detonatorHotspotId);
+}
+
+void Scene503::setup() {
+ setPlayerSpritesPrefix();
+ setAAName();
+ _scene->addActiveVocab(NOUN_DETONATORS);
+ _scene->addActiveVocab(VERB_WALKTO);
+}
+
+void Scene503::enter() {
+ _globals._spriteIndexes[1] = _scene->_sprites.addSprites(formAnimName('c', -1));
+
+ if (_globals[kSexOfRex] == REX_MALE)
+ _globals._spriteIndexes[2] = _scene->_sprites.addSprites("*RXMBD_2");
+ else
+ _globals._spriteIndexes[3] = _scene->_sprites.addSprites("*ROXBD_2");
+
+ if (_game._objects[OBJ_DETONATORS]._roomNumber == _scene->_currentSceneId) {
+ _globals._sequenceIndexes[1] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[1], false, 9, 0, 0, 0);
+ _detonatorHotspotId = _scene->_dynamicHotspots.add(NOUN_DETONATORS, VERB_WALKTO, _globals._sequenceIndexes[1], Common::Rect(0, 0, 0, 0));
+ _scene->_dynamicHotspots.setPosition(_detonatorHotspotId, Common::Point(254, 135), FACING_SOUTH);
+ }
+
+ if (_scene->_priorSceneId != -2) {
+ _game._player._playerPos = Common::Point(191, 152);
+ _game._player._facing = FACING_NORTHWEST;
+ }
+
+ sceneEntrySound();
+}
+
+void Scene503::actions() {
+ if (_action.isAction(VERB_WALK, NOUN_OUTSIDE))
+ _scene->_nextSceneId = 501;
+ else if (_action.isAction(VERB_TAKE, NOUN_DETONATORS)) {
+ if ( _game._trigger || !_game._objects.isInInventory(OBJ_DETONATORS)) {
+ switch (_game._trigger) {
+ case 0:
+ _game._player._stepEnabled = false;
+ _game._player._visible = false;
+ if (_globals[kSexOfRex] == REX_MALE) {
+ _globals._sequenceIndexes[2] = _scene->_sequences.startReverseCycle(_globals._spriteIndexes[2], false, 8, 1, 0, 0);
+ _scene->_sequences.setAnimRange(_globals._sequenceIndexes[2], 1, 3);
+ _scene->_sequences.setMsgLayout(_globals._sequenceIndexes[2]);
+ _scene->_sequences.addSubEntry(_globals._sequenceIndexes[2], SEQUENCE_TRIGGER_SPRITE, 3, 1);
+ _scene->_sequences.addSubEntry(_globals._sequenceIndexes[2], SEQUENCE_TRIGGER_EXPIRE, 0, 2);
+ } else {
+ _globals._sequenceIndexes[3] = _scene->_sequences.startReverseCycle(_globals._spriteIndexes[3], true, 8, 1, 0, 0);
+ _scene->_sequences.setAnimRange(_globals._sequenceIndexes[3], 1, 4);
+ _scene->_sequences.setMsgLayout(_globals._sequenceIndexes[3]);
+ _scene->_sequences.addSubEntry(_globals._sequenceIndexes[3], SEQUENCE_TRIGGER_SPRITE, 4, 1);
+ _scene->_sequences.addSubEntry(_globals._sequenceIndexes[3], SEQUENCE_TRIGGER_EXPIRE, 0, 2);
+ }
+ break;
+
+ case 1:
+ _vm->_sound->command(9);
+ _scene->_sequences.remove(_globals._sequenceIndexes[1]);
+ _scene->_dynamicHotspots.remove(_detonatorHotspotId);
+ _game._objects.addToInventory(OBJ_DETONATORS);
+ _vm->_dialogs->showItem(OBJ_DETONATORS, 50326);
+ break;
+
+ case 2:
+ if (_globals[kSexOfRex] == REX_MALE)
+ _scene->_sequences.updateTimeout(-1, _globals._sequenceIndexes[2]);
+ else
+ _scene->_sequences.updateTimeout(-1, _globals._sequenceIndexes[3]);
+
+ _game._player._visible = true;
+ _game._player._stepEnabled = true;
+ break;
+
+ default:
+ break;
+ }
+ }
+ } else if (_action._lookFlag)
+ _vm->_dialogs->show(50328);
+ else if (_action.isAction(VERB_LOOK, NOUN_MONITORING_EQUIPMENT))
+ _vm->_dialogs->show(50310);
+ else if (_action.isAction(VERB_LOOK, NOUN_PHOTON_RIFLES))
+ _vm->_dialogs->show(50311);
+ else if (_action.isAction(VERB_TAKE, NOUN_PHOTON_RIFLES) || _action.isAction(VERB_TAKE, NOUN_NUCLEAR_SLINGSHOT))
+ _vm->_dialogs->show(50312);
+ else if (_action.isAction(VERB_LOOK, NOUN_DISPLAY_CASE))
+ _vm->_dialogs->show(50313);
+ else if (_action.isAction(VERB_LOOK, NOUN_NUCLEAR_SLINGSHOT))
+ _vm->_dialogs->show(50314);
+ else if (_action.isAction(VERB_LOOK, NOUN_WATER_COOLER))
+ _vm->_dialogs->show(50315);
+ else if (_action.isAction(VERB_LOOK, NOUN_STORAGE_BOX))
+ _vm->_dialogs->show(50316);
+ else if (_action.isAction(VERB_OPEN, NOUN_STORAGE_BOX))
+ _vm->_dialogs->show(50317);
+ else if (_action.isAction(VERB_LOOK, NOUN_WARNING_LABEL))
+ _vm->_dialogs->show(50318);
+ else if (_action.isAction(VERB_LOOK, NOUN_DESK))
+ _vm->_dialogs->show(50319);
+ else if (_action.isAction(VERB_LOOK, NOUN_MONITOR))
+ _vm->_dialogs->show(50320);
+ else if (_action.isAction(VERB_LOOK, NOUN_FILE_CABINETS))
+ _vm->_dialogs->show(50322);
+ else if (_action.isAction(VERB_LOOK, NOUN_BOX)) {
+ if (_game._objects.isInRoom(OBJ_DETONATORS))
+ _vm->_dialogs->show(50323);
+ else
+ _vm->_dialogs->show(50324);
+ } else if (_action.isAction(VERB_LOOK, NOUN_DETONATORS) && (_action._savedFields._mainObjectSource == 4))
+ _vm->_dialogs->show(50325);
+ else if (_action.isAction(VERB_LOOK, NOUN_WINDOWS))
+ _vm->_dialogs->show(50327);
+ else if (_action.isAction(VERB_OPEN, NOUN_DISPLAY_CASE))
+ _vm->_dialogs->show(50329);
+ else if (_action.isAction(VERB_THROW, NOUN_DISPLAY_CASE) && _game._objects.isInInventory(_game._objects.getIdFromDesc(_action._activeAction._objectNameId)))
+ _vm->_dialogs->show(50330);
+ else
+ return;
+
+ _action._inProgress = false;
+}
+
+/*------------------------------------------------------------------------*/
+
+Scene504::Scene504(MADSEngine *vm) : Scene5xx(vm) {
+ _carAnimationMode = -1;
+ _carFrame = -1;
+}
+
+void Scene504::synchronize(Common::Serializer &s) {
+ Scene5xx::synchronize(s);
+
+ s.syncAsSint16LE(_carAnimationMode);
+ s.syncAsSint16LE(_carFrame);
+}
+
+void Scene504::setup() {
+ _game._player._spritesPrefix = "";
+ setAAName();
+}
+
+void Scene504::enter() {
+ _globals._spriteIndexes[2] = _scene->_sprites.addSprites(formAnimName('a', 2));
+
+ for (int i = 0; i < 4; i++)
+ _globals._spriteIndexes[5 + i] = _scene->_sprites.addSprites(formAnimName('m', i));
+
+ if (_globals[kSexOfRex] == REX_MALE)
+ _globals._spriteIndexes[1] = _scene->_sprites.addSprites(formAnimName('a', 0));
+ else {
+ _globals._spriteIndexes[1] = _scene->_sprites.addSprites(formAnimName('a', 1));
+ _scene->changeVariant(1);
+ }
+
+ _globals._sequenceIndexes[1] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[1], false, 6, 1, 0, 0);
+ _scene->_sequences.setDepth(_globals._sequenceIndexes[1], 0);
+ _globals._sequenceIndexes[2] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[2], false, 6, 0, 0, 0);
+ _carFrame = -1;
+
+ if ((_scene->_priorSceneId == 505) && (_globals[kHoverCarDestination] != _globals[kHoverCarLocation])){
+ _carAnimationMode = 1;
+ _scene->loadAnimation(formAnimName('A', -1));
+ _vm->_sound->command(14);
+ _scene->_sequences.addTimer(1, 70);
+ _game._player._stepEnabled = false;
+ } else {
+ _globals._spriteIndexes[3] = _scene->_sprites.addSprites(formAnimName('a', 3));
+ _carAnimationMode = 1;
+ _scene->loadAnimation(formAnimName('A', -1));
+ if ((_scene->_priorSceneId != -2) && (_scene->_priorSceneId != 505))
+ _globals[kHoverCarLocation] = _scene->_priorSceneId;
+
+ _globals._sequenceIndexes[7] = _scene->_sequences.startCycle(_globals._spriteIndexes[7], false, 1);
+ }
+
+ if (_globals[kTimebombTimer] > 10500)
+ _globals[kTimebombTimer] = 10500;
+
+ sceneEntrySound();
+}
+
+void Scene504::step() {
+ if ((_carAnimationMode == 1) && (_scene->_activeAnimation != nullptr)) {
+ if (_scene->_activeAnimation->getCurrentFrame() != _carFrame) {
+ _carFrame = _scene->_activeAnimation->getCurrentFrame();
+ int nextFrame;
+
+ if (_carFrame == 1)
+ nextFrame = 0;
+ else
+ nextFrame = -1;
+
+ if ((nextFrame >= 0) && (nextFrame != _scene->_activeAnimation->getCurrentFrame())) {
+ _scene->_activeAnimation->setCurrentFrame(nextFrame);
+ _carFrame = nextFrame;
+ }
+ }
+ }
+
+
+ if (_game._trigger >= 70) {
+ switch (_game._trigger) {
+ case 70:
+ if (_globals[kHoverCarDestination] != -1) {
+ _game._player._stepEnabled = false;
+ _scene->freeAnimation();
+ _carAnimationMode = 2;
+ if (((_globals[kHoverCarLocation] >= 500 && _globals[kHoverCarLocation] <= 599) &&
+ (_globals[kHoverCarDestination] >= 500 && _globals[kHoverCarDestination] <= 599)) ||
+ ((_globals[kHoverCarLocation] >= 600 && _globals[kHoverCarLocation] <= 699) &&
+ (_globals[kHoverCarDestination] >= 600 && _globals[kHoverCarDestination] <= 699))) {
+ _scene->loadAnimation(formAnimName('A', -1), 71);
+ } else if (_globals[kHoverCarLocation] > _globals[kHoverCarDestination])
+ _scene->loadAnimation(formAnimName('C', -1), 71);
+ else
+ _scene->loadAnimation(formAnimName('B', -1), 71);
+ }
+ break;
+
+ case 71:
+ _vm->_sound->command(15);
+ _scene->_nextSceneId = _globals[kHoverCarDestination];
+ break;
+
+ default:
+ break;
+ }
+ }
+
+ if ((_globals[kTimebombTimer] >= 10800) && (_globals[kTimebombStatus] == TIMEBOMB_ACTIVATED) && (_game._difficulty != 3)) {
+ _globals[kTimebombStatus] = TIMEBOMB_DEAD;
+ _globals[kTimebombTimer] = 0;
+ _globals[kCheckDaemonTimebomb] = false;
+ _scene->_nextSceneId = 620;
+ }
+}
+
+void Scene504::preActions() {
+ _game._player._needToWalk = false;
+}
+
+void Scene504::actions() {
+ if (_action.isAction(VERB_EXIT_FROM, NOUN_CAR)) {
+ _vm->_sound->command(15);
+ _scene->_nextSceneId = _globals[kHoverCarLocation];
+ } else if (_action.isAction(VERB_ACTIVATE, NOUN_CAR_CONTROLS)) {
+ switch (_game._trigger) {
+ case 0:
+ _game._player._stepEnabled = false;
+ _vm->_sound->command(39);
+ _globals._sequenceIndexes[3] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[3], false, 6, 1, 0, 0);
+ _scene->_sequences.setDepth(_globals._sequenceIndexes[3], 13);
+ _scene->_sequences.addSubEntry(_globals._sequenceIndexes[3], SEQUENCE_TRIGGER_EXPIRE, 0, 1);
+ _scene->_sequences.remove(_globals._sequenceIndexes[7]);
+ _globals._sequenceIndexes[5] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[5], false, 18, 0, 0, 0);
+ _scene->_sequences.setDepth(_globals._sequenceIndexes[5], 14);
+ break;
+
+ case 1: {
+ int syncIdx = _globals._sequenceIndexes[3];
+ _globals._sequenceIndexes[3] = _scene->_sequences.startReverseCycle(_globals._spriteIndexes[3], false, 6, 1, 0, 0);
+ _scene->_sequences.setDepth(_globals._sequenceIndexes[3], 13);
+ _scene->_sequences.setAnimRange(_globals._sequenceIndexes[3], 1, 6);
+ _scene->_sequences.addSubEntry(_globals._sequenceIndexes[3], SEQUENCE_TRIGGER_EXPIRE, 0, 2);
+ _scene->_sequences.updateTimeout(_globals._sequenceIndexes[3], syncIdx);
+ }
+ break;
+
+ case 2:
+ _scene->_sequences.addTimer(10, 3);
+ break;
+
+ case 3:
+ _scene->_sequences.remove(_globals._sequenceIndexes[5]);
+ if (_globals[kSexOfRex] == REX_MALE) {
+ _vm->_sound->command(34);
+ _scene->_sequences.addTimer(60, 4);
+ _globals._sequenceIndexes[6] = _scene->_sequences.startCycle(_globals._spriteIndexes[6], false, 1);
+ _scene->_sequences.setDepth(_globals._sequenceIndexes[6], 14);
+ } else {
+ _vm->_sound->command(40);
+ _globals._sequenceIndexes[8] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[8], false, 18, 0, 0, 0);
+ _scene->_sequences.setDepth(_globals._sequenceIndexes[8], 14);
+ _scene->_sequences.addTimer(120, 5);
+ }
+ break;
+
+ case 4:
+ _game._player._stepEnabled = true;
+ _globals[kHoverCarDestination] = _globals[kHoverCarLocation];
+ _scene->_nextSceneId = 505;
+ break;
+
+ case 5:
+ _game._player._stepEnabled = true;
+ _scene->_sequences.remove(_globals._sequenceIndexes[8]);
+ _globals._sequenceIndexes[7] = _scene->_sequences.startCycle(_globals._spriteIndexes[7], false, 1);
+ _vm->_dialogs->show(50421);
+ break;
+
+ default:
+ break;
+ }
+ } else if (_action._lookFlag || _action.isAction(VERB_LOOK, NOUN_INTERIOR_OF_CAR))
+ _vm->_dialogs->show(50412);
+ else if (_action.isAction(VERB_LOOK, NOUN_GLOVE_COMPARTMENT))
+ _vm->_dialogs->show(50410);
+ else if (_action.isAction(VERB_LOOK, NOUN_CAR_CONTROLS) || _action.isAction(VERB_LOOK, NOUN_DASHBOARD))
+ _vm->_dialogs->show(50411);
+ else if (_action.isAction(VERB_LOOK, NOUN_SCENT_PACKET))
+ _vm->_dialogs->show(50413);
+ else if (_action.isAction(VERB_LOOK, NOUN_SODA_CANS))
+ _vm->_dialogs->show(50414);
+ else if (_action.isAction(VERB_LOOK, NOUN_KITTY))
+ _vm->_dialogs->show(50415);
+ else if (_action.isAction(VERB_LOOK, NOUN_WINDSHIELD) || _action.isAction(VERB_LOOK_THROUGH, NOUN_WINDSHIELD))
+ _vm->_dialogs->show(50416);
+ else if (_action.isAction(VERB_LOOK, NOUN_REARVIEW_MIRROR))
+ _vm->_dialogs->show(50417);
+ else if (_action.isAction(VERB_TAKE, NOUN_REARVIEW_MIRROR))
+ _vm->_dialogs->show(50418);
+ else if (_action.isAction(VERB_LOOK, NOUN_MOLDY_SOCK))
+ _vm->_dialogs->show(50419);
+ else if (_action.isAction(VERB_TAKE, NOUN_MOLDY_SOCK))
+ _vm->_dialogs->show(50420);
+ else
+ return;
+
+ _action._inProgress = false;
+}
+
+/*------------------------------------------------------------------------*/
+
+Scene505::Scene505(MADSEngine *vm) : Scene5xx(vm) {
+ _frame = -1;
+ _nextButtonId = -1;
+ _homeSelectedId = -1;
+ _selectedId = -1;
+ _activeCars = -1;
+
+ for (int i = 0; i < 9; i++)
+ _carLocations[i] = -1;
+}
+
+void Scene505::synchronize(Common::Serializer &s) {
+ Scene5xx::synchronize(s);
+
+ s.syncAsSint16LE(_frame);
+ s.syncAsSint16LE(_nextButtonId);
+ s.syncAsSint16LE(_homeSelectedId);
+ s.syncAsSint16LE(_selectedId);
+ s.syncAsSint16LE(_activeCars);
+
+ for (int i = 0; i < 9; i++)
+ s.syncAsSint16LE(_carLocations[i]);
+}
+
+void Scene505::setup() {
+ _game._player._spritesPrefix = "";
+ setAAName();
+}
+
+void Scene505::enter() {
+ for (int i = 0; i < 9; i++)
+ _globals._spriteIndexes[i] = _scene->_sprites.addSprites(formAnimName('a', i + 1));
+
+ _globals._spriteIndexes[13] = _scene->_sprites.addSprites(formAnimName('b', 1));
+ _globals._spriteIndexes[9] = _scene->_sprites.addSprites(formAnimName('g', 1));
+ _globals._spriteIndexes[10] = _scene->_sprites.addSprites(formAnimName('g', 0));
+ _globals._spriteIndexes[11] = _scene->_sprites.addSprites(formAnimName('t', -1));
+ _globals._spriteIndexes[12] = _scene->_sprites.addSprites(formAnimName('e', -1));
+
+ if (_scene->_priorSceneId != -2)
+ _globals._sequenceIndexes[12] = _scene->_sequences.startReverseCycle(_globals._spriteIndexes[12], false, 6, 1, 0, 0);
+
+ _globals._sequenceIndexes[13] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[13], false, 6, 1, 120, 0);
+ _scene->_sequences.addSubEntry(_globals._sequenceIndexes[13], SEQUENCE_TRIGGER_EXPIRE, 0, 60);
+ _scene->_sequences.addTimer(30, 62);
+
+ _carLocations[0] = 501;
+ _carLocations[1] = 506;
+ _carLocations[2] = 511;
+ _carLocations[3] = 513;
+ _carLocations[4] = 601;
+ _carLocations[5] = 604;
+ _carLocations[6] = 607;
+ _carLocations[7] = 609;
+ _carLocations[8] = 612;
+
+ _activeCars = false;
+
+ for (int i = 0; i < 9; i++) {
+ if (_globals[kHoverCarLocation] == _carLocations[i]) {
+ _homeSelectedId = i;
+ if (_scene->_priorSceneId != -2)
+ _selectedId = i;
+ }
+ }
+
+ _game._player._visible = false;
+ _game._player._stepEnabled = false;
+ _frame = -1;
+ _scene->loadAnimation(formAnimName('a', -1));
+ _scene->_activeAnimation->setCurrentFrame(86);
+
+ sceneEntrySound();
+ _vm->_sound->command(16);
+}
+
+void Scene505::step() {
+ if (_frame != _scene->_activeAnimation->getCurrentFrame()) {
+ _frame = _scene->_activeAnimation->getCurrentFrame();
+ int resetFrame = -1;
+
+ switch (_frame) {
+ case 4:
+ case 24:
+ case 33:
+ case 53:
+ case 62:
+ case 82:
+ if (_nextButtonId == 0x38A)
+ resetFrame = 4;
+ else if (_nextButtonId == 0x38B)
+ resetFrame = 33;
+ else if (_nextButtonId == 0x2DE)
+ resetFrame = 62;
+
+ break;
+
+ case 15:
+ case 44:
+ case 73: {
+ int this_button;
+ int old_select;
+ _vm->_sound->command(17);
+ old_select = _selectedId;
+ if (_frame == 15) {
+ this_button = 0x38A;
+ _selectedId = (_selectedId + 1) % 9;
+ } else if (_frame == 44) {
+ this_button = 0x38B;
+ _selectedId--;
+ if (_selectedId < 0)
+ _selectedId = 8;
+ } else {
+ this_button = 0x2DE;
+ if ((_globals[kTimebombStatus] == TIMEBOMB_ACTIVATED) && (_carLocations[_selectedId] == 501))
+ _vm->_dialogs->show(431);
+ else if (_selectedId != _homeSelectedId) {
+ _nextButtonId = 0;
+ _activeCars = true;
+ _game._player._stepEnabled = false;
+ _scene->_sequences.remove(_globals._sequenceIndexes[1]);
+ _scene->_sequences.remove(_globals._sequenceIndexes[0]);
+ _scene->_sequences.remove(_globals._sequenceIndexes[13]);
+ _globals._sequenceIndexes[13] = _scene->_sequences.startReverseCycle(_globals._spriteIndexes[13], false, 6, 1, 0, 0);
+ _scene->_sequences.addSubEntry(_globals._sequenceIndexes[13], SEQUENCE_TRIGGER_EXPIRE, 0, 63);
+ _vm->_sound->command(18);
+ }
+ }
+
+ if (_nextButtonId == this_button)
+ _nextButtonId = 0;
+
+ if (old_select != _selectedId) {
+ _scene->_sequences.remove(_globals._sequenceIndexes[11]);
+ _globals._sequenceIndexes[11] = _scene->_sequences.startCycle(_globals._spriteIndexes[11], false, _selectedId + 1);
+ if (old_select != _homeSelectedId)
+ _scene->_sequences.remove(_globals._sequenceIndexes[0]);
+
+ if (_selectedId != _homeSelectedId) {
+ _globals._sequenceIndexes[0] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[0 + _selectedId], false, 24, 0, 0, 0);
+ _scene->_sequences.setDepth(_globals._sequenceIndexes[0], 1);
+ }
+ }
+ break;
+ }
+
+ case 18:
+ case 19:
+ case 20:
+ case 21:
+ case 22:
+ case 23:
+ if (_nextButtonId == 0x38A)
+ resetFrame = 29 - _frame;
+
+ break;
+
+ case 26:
+ case 55:
+ case 84:
+ if (_nextButtonId != 0)
+ resetFrame = 3;
+
+ break;
+
+ case 27:
+ case 56:
+ case 85:
+ if (_nextButtonId != 0)
+ resetFrame = 2;
+
+ break;
+
+ case 29:
+ case 58:
+ case 87:
+ if (_activeCars)
+ _globals[kHoverCarDestination] = _carLocations[_selectedId];
+
+ if (_nextButtonId == 0x38A)
+ resetFrame = 0;
+ else if (_nextButtonId == 0x38B)
+ resetFrame = 29;
+ else if (_nextButtonId == 0x2DE)
+ resetFrame = 58;
+ else
+ resetFrame = 86;
+ break;
+
+ case 47:
+ case 48:
+ case 49:
+ case 50:
+ case 51:
+ case 52:
+ if (_nextButtonId == 0x38B)
+ resetFrame = 87 - _frame;
+
+ break;
+
+ case 76:
+ case 77:
+ case 78:
+ case 79:
+ case 80:
+ case 81:
+ if (_nextButtonId == 0x2DE)
+ resetFrame = 145 - _frame;
+
+ break;
+
+ default:
+ break;
+ }
+
+ if ((resetFrame >= 0) && (resetFrame != _scene->_activeAnimation->getCurrentFrame())) {
+ _scene->_activeAnimation->setCurrentFrame(resetFrame);
+ _frame = resetFrame;
+ }
+ }
+
+ switch (_game._trigger) {
+ case 60: {
+ _game._player._stepEnabled = true;
+ int syncIdx = _globals._sequenceIndexes[13];
+ _globals._sequenceIndexes[13] = _scene->_sequences.startCycle(_globals._spriteIndexes[13], false, -2);
+ _scene->_sequences.setDepth(_globals._sequenceIndexes[13], 8);
+ _scene->_sequences.updateTimeout(_globals._sequenceIndexes[13], syncIdx);
+ _globals._sequenceIndexes[1] = _scene->_sequences.startCycle(_globals._spriteIndexes[_homeSelectedId], false, 1);
+ _scene->_sequences.setDepth(_globals._sequenceIndexes[1], 1);
+ _globals._sequenceIndexes[11] = _scene->_sequences.startCycle(_globals._spriteIndexes[11], false, _selectedId + 1);
+
+ if (_selectedId != _homeSelectedId) {
+ _globals._sequenceIndexes[0] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[0 + _selectedId], false, 24, 0, 0, 0);
+ _scene->_sequences.setDepth(_globals._sequenceIndexes[0], 1);
+ }
+ break;
+ }
+
+ case 61:
+ _globals._sequenceIndexes[10] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[10], false, 8, 0, 0, 0);
+ _scene->_sequences.setDepth(_globals._sequenceIndexes[10], 8);
+ _scene->_sequences.updateTimeout(_globals._sequenceIndexes[10], _globals._sequenceIndexes[9]);
+ break;
+
+ case 62:
+ _globals._sequenceIndexes[9] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[9], false, 8, 1, 0, 0);
+ _scene->_sequences.setDepth(_globals._sequenceIndexes[9], 8);
+ _scene->_sequences.addSubEntry(_globals._sequenceIndexes[9], SEQUENCE_TRIGGER_EXPIRE, 0, 61);
+ break;
+
+ case 63:
+ _globals[kHoverCarDestination] = _carLocations[_selectedId];
+ _scene->_nextSceneId = 504;
+ break;
+
+ default:
+ break;
+ }
+}
+
+void Scene505::actions() {
+ if (_action.isAction(VERB_PRESS))
+ _nextButtonId = _action._activeAction._objectNameId;
+ else if (_action.isAction(VERB_RETURN_TO, NOUN_INSIDE_OF_CAR))
+ _scene->_nextSceneId = 504;
+ else if (_action.isAction(VERB_LOOK, NOUN_VIEW_SCREEN))
+ _vm->_dialogs->show(50510);
+ else if (_action.isAction(VERB_LOOK, NOUN_CONTROL_PANEL))
+ _vm->_dialogs->show(50511);
+ else
+ return;
+
+ _action._inProgress = false;
+}
+
+/*------------------------------------------------------------------------*/
+
+Scene506::Scene506(MADSEngine *vm) : Scene5xx(vm), _doorPos(0, 0) {
+ _heroFacing = FACING_DUMMY;
+
+ _doorDepth = -1;
+ _doorSpriteIdx = -1;
+ _doorSequenceIdx = -1;
+ _doorWord = -1;
+
+ _labDoorFl = false;
+ _firstDoorFl = false;
+ _actionFl = false;
+}
+
+void Scene506::synchronize(Common::Serializer &s) {
+ Scene5xx::synchronize(s);
+
+ s.syncAsSint16LE(_doorPos.x);
+ s.syncAsSint16LE(_doorPos.y);
+
+ s.syncAsByte(_heroFacing);
+
+ s.syncAsSint16LE(_doorDepth);
+ s.syncAsSint16LE(_doorSpriteIdx);
+ s.syncAsSint16LE(_doorSequenceIdx);
+ s.syncAsSint16LE(_doorWord);
+
+ s.syncAsByte(_labDoorFl);
+ s.syncAsByte(_firstDoorFl);
+ s.syncAsByte(_actionFl);
+}
+
+void Scene506::setup() {
+ setPlayerSpritesPrefix();
+ setAAName();
+ _scene->addActiveVocab(VERB_WALK_INTO);
+ _scene->addActiveVocab(NOUN_SOFTWARE_STORE);
+ _scene->addActiveVocab(NOUN_LABORATORY);
+}
+
+void Scene506::enter() {
+ _globals._spriteIndexes[1] = _scene->_sprites.addSprites(formAnimName('q', 0));
+ _globals._spriteIndexes[2] = _scene->_sprites.addSprites(formAnimName('q', 1));
+ _globals._spriteIndexes[3] = _scene->_sprites.addSprites(formAnimName('c', -1));
+ _globals._spriteIndexes[4] = _scene->_sprites.addSprites("*RXCD_3");
+
+ _globals._sequenceIndexes[1] = _scene->_sequences.startCycle(_globals._spriteIndexes[1], false, 1);
+ int idx = _scene->_dynamicHotspots.add(NOUN_LABORATORY, VERB_WALK_INTO, _globals._sequenceIndexes[1], Common::Rect(0, 0, 0, 0));
+ int hotspotId = _scene->_dynamicHotspots.setPosition(idx, Common::Point(65, 125), FACING_NORTHWEST);
+ _scene->_dynamicHotspots.setCursor(hotspotId, CURSOR_GO_LEFT);
+ _scene->_sequences.setDepth(_globals._sequenceIndexes[1], 10);
+ _globals._sequenceIndexes[2] = _scene->_sequences.startCycle(_globals._spriteIndexes[2], false, 1);
+ idx = _scene->_dynamicHotspots.add(NOUN_SOFTWARE_STORE, VERB_WALK_INTO, _globals._sequenceIndexes[2], Common::Rect(0, 0, 0, 0));
+ hotspotId = _scene->_dynamicHotspots.setPosition(idx, Common::Point(112, 102), FACING_NORTHWEST);
+ _scene->_dynamicHotspots.setCursor(hotspotId, CURSOR_GO_LEFT);
+ _scene->_sequences.setDepth(_globals._sequenceIndexes[2], 13);
+
+ _globals._sequenceIndexes[3] = _scene->_sequences.startCycle(_globals._spriteIndexes[3], false, -1);
+ _scene->_sequences.setDepth(_globals._sequenceIndexes[3], 5);
+ _firstDoorFl = true;
+ _actionFl = false;
+
+ if (_scene->_priorSceneId == 508) {
+ _game._player._playerPos = Common::Point(16, 111);
+ _game._player._facing = FACING_SOUTHEAST;
+ _scene->_sequences.addTimer(15, 80);
+ _game._player._stepEnabled = false;
+ } else if (_scene->_priorSceneId == 507) {
+ _game._player._playerPos = Common::Point(80, 102);
+ _game._player._facing = FACING_SOUTHEAST;
+ _scene->_sequences.addTimer(60, 80);
+ _game._player._stepEnabled = false;
+ } else if (_scene->_priorSceneId != -2) {
+ _game._player._playerPos = Common::Point(138, 116);
+ _game._player._facing = FACING_NORTHEAST;
+ _game._player._visible = false;
+ _game._player._stepEnabled = false;
+ _scene->_sequences.remove(_globals._sequenceIndexes[3]);
+ _globals._sequenceIndexes[3] = _scene->_sequences.startCycle(_globals._spriteIndexes[3], false, -2);
+ _scene->_sequences.setDepth(_globals._sequenceIndexes[3], 5);
+ _scene->loadAnimation(formAnimName('R', 1), 70);
+ }
+ sceneEntrySound();
+}
+
+void Scene506::step() {
+ if (_game._trigger >= 80) {
+ if (_firstDoorFl) {
+ _heroFacing = FACING_SOUTHEAST;
+ if (_scene->_priorSceneId == 507) {
+ _doorPos = Common::Point(112, 102);
+ _doorWord = 0x336;
+ } else {
+ _doorPos = Common::Point(65, 125);
+ _doorWord = 0x37D;
+ }
+ }
+ handleDoorSequences();
+ }
+
+ if (_game._trigger >= 70) {
+ switch (_game._trigger) {
+ case 70:
+ _game._player._visible = true;
+ _game._player._priorTimer = _scene->_activeAnimation->getNextFrameTimer() - _game._player._ticksAmount;
+ _scene->_sequences.addTimer(6, 71);
+ break;
+
+ case 71:
+ _scene->_sequences.remove(_globals._sequenceIndexes[3]);
+ _globals._sequenceIndexes[3] = _scene->_sequences.startReverseCycle(_globals._spriteIndexes[3], false, 6, 1, 0, 0);
+ _scene->_sequences.setDepth(_globals._sequenceIndexes[3], 5);
+ _scene->_sequences.addSubEntry(_globals._sequenceIndexes[3], SEQUENCE_TRIGGER_EXPIRE, 0, 72);
+ break;
+
+ case 72:
+ _globals._sequenceIndexes[3] = _scene->_sequences.startCycle(_globals._spriteIndexes[3], false, -1);
+ _scene->_sequences.setDepth(_globals._sequenceIndexes[3], 5);
+ _game._player._stepEnabled = true;
+ break;
+
+ default:
+ break;
+ }
+ }
+}
+
+void Scene506::handleDoorSequences() {
+ _game._triggerSetupMode = SEQUENCE_TRIGGER_DAEMON;
+
+ if (_firstDoorFl) {
+ if (_action.isAction(VERB_WALK_INTO, NOUN_SOFTWARE_STORE) || ((_scene->_priorSceneId == 507) && !_actionFl)) {
+ _doorDepth = 13;
+ _doorSpriteIdx = _globals._spriteIndexes[2];
+ _doorSequenceIdx = _globals._sequenceIndexes[2];
+ _labDoorFl = false;
+ } else {
+ _doorDepth = 10;
+ _doorSpriteIdx = _globals._spriteIndexes[1];
+ _doorSequenceIdx = _globals._sequenceIndexes[1];
+ _labDoorFl = true;
+ }
+ _firstDoorFl = false;
+ }
+
+ switch (_game._trigger) {
+ case 0:
+ case 80:
+ _game._player._stepEnabled = false;
+ _scene->_sequences.remove(_doorSequenceIdx);
+ _doorSequenceIdx = _scene->_sequences.addSpriteCycle(_doorSpriteIdx, false, 7, 1, 0, 0);
+ _scene->_sequences.setDepth(_doorSequenceIdx, _doorDepth);
+ _scene->changeVariant(1);
+ _scene->_sequences.addSubEntry(_doorSequenceIdx, SEQUENCE_TRIGGER_EXPIRE, 0, 81);
+ break;
+
+
+ case 81:
+ _doorSequenceIdx = _scene->_sequences.startCycle(_doorSpriteIdx, false, -2);
+ _scene->_sequences.setDepth(_doorSequenceIdx, _doorDepth);
+ _game._player._walkAnywhere = true;
+ _game._player.walk(_doorPos, _heroFacing);
+ _scene->_sequences.addTimer(120, 82);
+ break;
+
+ case 82:
+ _scene->_sequences.remove(_doorSequenceIdx);
+ _doorSequenceIdx = _scene->_sequences.startReverseCycle(_doorSpriteIdx, false, 7, 1, 0, 0);
+ _scene->_sequences.setDepth(_doorSequenceIdx, _doorDepth);
+ if (_actionFl)
+ _scene->_sequences.addSubEntry(_doorSequenceIdx, SEQUENCE_TRIGGER_EXPIRE, 0, 84);
+ else
+ _scene->_sequences.addSubEntry(_doorSequenceIdx, SEQUENCE_TRIGGER_EXPIRE, 0, 83);
+
+ break;
+
+ case 83: {
+ _doorSequenceIdx = _scene->_sequences.startCycle(_doorSpriteIdx, false, 1);
+ int idx = _scene->_dynamicHotspots.add(_doorWord, VERB_WALK_INTO, _doorSequenceIdx, Common::Rect(0, 0, 0, 0));
+ int hotspotId = _scene->_dynamicHotspots.setPosition(idx, _doorPos, FACING_NORTHWEST);
+ _scene->_dynamicHotspots.setCursor(hotspotId, CURSOR_GO_LEFT);
+ _scene->_sequences.setDepth(_doorSequenceIdx, _doorDepth);
+ _firstDoorFl = true;
+ if (_labDoorFl) {
+ _globals._spriteIndexes[1] = _doorSpriteIdx;
+ _globals._sequenceIndexes[1] = _doorSequenceIdx;
+ } else {
+ _globals._spriteIndexes[2] = _doorSpriteIdx;
+ _globals._sequenceIndexes[2] = _doorSequenceIdx;
+ }
+ _game._player._stepEnabled = true;
+
+ }
+ break;
+
+ case 84:
+ _actionFl = false;
+ _game._player._stepEnabled = true;
+ if (_labDoorFl)
+ _scene->_nextSceneId = 508;
+ else
+ _scene->_nextSceneId = 507;
+
+ break;
+
+ default:
+ break;
+ }
+}
+
+void Scene506::actions() {
+ if (_action.isAction(VERB_WALK_INTO, NOUN_LABORATORY)) {
+ if (_firstDoorFl) {
+ _heroFacing = FACING_NORTHWEST;
+ _doorPos = Common::Point(16, 111);
+ }
+ _actionFl = true;
+ handleDoorSequences();
+ } else if (_action.isAction(VERB_WALK_INTO, NOUN_SOFTWARE_STORE)) {
+ if (_firstDoorFl) {
+ _heroFacing = FACING_NORTHWEST;
+ _doorPos = Common::Point(80, 102);
+ }
+ _actionFl = true;
+ handleDoorSequences();
+ } else if (_action.isAction(VERB_GET_INTO, NOUN_CAR)) {
+ switch (_game._trigger) {
+ case 0:
+ _game._player._stepEnabled = false;
+ _scene->_sequences.remove(_globals._sequenceIndexes[3]);
+ _globals._sequenceIndexes[3] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[3], false, 6, 1, 0, 0);
+ _scene->_sequences.setDepth(_globals._sequenceIndexes[3], 5);
+ _scene->_sequences.addSubEntry(_globals._sequenceIndexes[3], SEQUENCE_TRIGGER_EXPIRE, 0, 1);
+ break;
+
+ case 1: {
+ int syncIdx = _globals._sequenceIndexes[3];
+ _globals._sequenceIndexes[3] = _scene->_sequences.startCycle(_globals._spriteIndexes[3], false, -2);
+ _scene->_sequences.updateTimeout(_globals._sequenceIndexes[3], syncIdx);
+ _scene->_sequences.addTimer(6, 2);
+ }
+ break;
+
+ case 2:
+ _game._player._visible = false;
+ _globals._sequenceIndexes[4] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[4], false, 10, 1, 0, 0);
+ _scene->_sequences.setMsgLayout(_globals._sequenceIndexes[4]);
+ _scene->_sequences.addSubEntry(_globals._sequenceIndexes[4], SEQUENCE_TRIGGER_EXPIRE, 0, 3);
+ break;
+
+ case 3: {
+ int syncIdx = _globals._sequenceIndexes[4];
+ _globals._sequenceIndexes[4] = _scene->_sequences.startCycle(_globals._spriteIndexes[4], false, -2);
+ _scene->_sequences.setMsgLayout(_globals._sequenceIndexes[4]);
+ _scene->_sequences.updateTimeout(_globals._sequenceIndexes[4], syncIdx);
+ _scene->_nextSceneId = 504;
+ }
+ break;
+
+ default:
+ break;
+ }
+ } else if (_action._lookFlag || _action.isAction(VERB_LOOK, NOUN_STREET))
+ _vm->_dialogs->show(50618);
+ else if (_action.isAction(VERB_LOOK, NOUN_RESTAURANT))
+ _vm->_dialogs->show(50610);
+ else if (_action.isAction(VERB_LOOK, NOUN_MOTEL))
+ _vm->_dialogs->show(50611);
+ else if (_action.isAction(VERB_LOOK, NOUN_CYCLE_SHOP))
+ _vm->_dialogs->show(50612);
+ else if (_action.isAction(VERB_LOOK, NOUN_AIR_BIKE))
+ _vm->_dialogs->show(50613);
+ else if (_action.isAction(VERB_TAKE, NOUN_AIR_BIKE))
+ _vm->_dialogs->show(50614);
+ else if (_action.isAction(VERB_LOOK, NOUN_SOFTWARE_STORE))
+ _vm->_dialogs->show(50615);
+ else if (_action.isAction(VERB_LOOK, NOUN_LABORATORY))
+ _vm->_dialogs->show(50616);
+ else if (_action.isAction(VERB_LOOK, NOUN_STREET_TO_WEST) || _action.isAction(VERB_WALK_DOWN, NOUN_STREET_TO_WEST))
+ _vm->_dialogs->show(50617);
+ else if (_action.isAction(VERB_LOOK, NOUN_SOFTWARE_STORE_SIGN))
+ _vm->_dialogs->show(50619);
+ else if (_action.isAction(VERB_LOOK, NOUN_CAR))
+ _vm->_dialogs->show(50620);
+ else if (_action.isAction(VERB_LOOK, NOUN_SKY))
+ _vm->_dialogs->show(50621);
+ else
+ return;
+
+ _action._inProgress = false;
+}
+
+/*------------------------------------------------------------------------*/
+
+Scene507::Scene507(MADSEngine *vm) : Scene5xx(vm) {
+ _penlightHotspotId = -1;
+}
+
+void Scene507::synchronize(Common::Serializer &s) {
+ Scene5xx::synchronize(s);
+
+ s.syncAsSint16LE(_penlightHotspotId);
+}
+
+void Scene507::setup() {
+ setPlayerSpritesPrefix();
+ setAAName();
+ _scene->addActiveVocab(NOUN_PENLIGHT);
+ _scene->addActiveVocab(VERB_WALKTO);
+}
+
+void Scene507::enter() {
+ _globals._spriteIndexes[1] = _scene->_sprites.addSprites(formAnimName('p', -1));
+ _globals._spriteIndexes[2] = _scene->_sprites.addSprites("*RXMRD_3");
+
+ if ((_game._difficulty != DIFFICULTY_EASY) && (_game._objects[OBJ_PENLIGHT]._roomNumber == _scene->_currentSceneId)) {
+ _globals._sequenceIndexes[1] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[1], false, 9, 0, 0, 0);
+ _penlightHotspotId = _scene->_dynamicHotspots.add(NOUN_PENLIGHT, VERB_WALKTO, _globals._sequenceIndexes[1], Common::Rect(0, 0, 0, 0));
+ _scene->_dynamicHotspots.setPosition(_penlightHotspotId, Common::Point(233, 152), FACING_SOUTHEAST);
+ }
+
+ if (_scene->_priorSceneId != -2) {
+ _game._player._playerPos = Common::Point(121, 147);
+ _game._player._facing = FACING_NORTH;
+ }
+
+ sceneEntrySound();
+}
+void Scene507::actions() {
+ if (_action.isAction(VERB_WALK_THROUGH, NOUN_ENTRANCE))
+ _scene->_nextSceneId = 506;
+ else if (_action.isAction(VERB_TAKE, NOUN_PENLIGHT)) {
+ if (_game._trigger || !_game._objects.isInInventory(OBJ_PENLIGHT)) {
+ switch (_game._trigger) {
+ case 0:
+ _game._player._stepEnabled = false;
+ _game._player._visible = false;
+ _globals._sequenceIndexes[2] = _scene->_sequences.startReverseCycle(_globals._spriteIndexes[2], false, 6, 1, 0, 0);
+ _scene->_sequences.setAnimRange(_globals._sequenceIndexes[2], 1, 5);
+ _scene->_sequences.setMsgLayout(_globals._sequenceIndexes[2]);
+ _scene->_sequences.addSubEntry(_globals._sequenceIndexes[2], SEQUENCE_TRIGGER_SPRITE, 5, 1);
+ _scene->_sequences.addSubEntry(_globals._sequenceIndexes[2], SEQUENCE_TRIGGER_EXPIRE, 0, 2);
+ break;
+
+ case 1:
+ _scene->_sequences.remove(_globals._sequenceIndexes[1]);
+ _scene->_dynamicHotspots.remove(_penlightHotspotId);
+ _vm->_sound->command(27);
+ _game._objects.addToInventory(OBJ_PENLIGHT);
+ _vm->_dialogs->showItem(OBJ_PENLIGHT, 50730);
+ break;
+
+ case 2:
+ _scene->_sequences.updateTimeout(-1, _globals._sequenceIndexes[2]);
+ _game._player._visible = true;
+ _game._player._stepEnabled = true;
+ break;
+
+ default:
+ break;
+ }
+ }
+ } else if (_action._lookFlag)
+ _vm->_dialogs->show(50722);
+ else if (_action.isAction(VERB_LOOK, NOUN_SWIRLING_LIGHT))
+ _vm->_dialogs->show(50710);
+ else if (_action.isAction(VERB_TAKE, NOUN_SWIRLING_LIGHT))
+ _vm->_dialogs->show(50711);
+ else if (_action.isAction(VERB_LOOK, NOUN_OLD_SOFTWARE))
+ _vm->_dialogs->show(50712);
+ else if (_action.isAction(VERB_TAKE, NOUN_OLD_SOFTWARE))
+ _vm->_dialogs->show(50713);
+ else if (_action.isAction(VERB_LOOK, NOUN_ADVERTISEMENT))
+ _vm->_dialogs->show(50714);
+ else if (_action.isAction(VERB_LOOK, NOUN_ADVERTISING_POSTER))
+ _vm->_dialogs->show(50715);
+ else if (_action.isAction(VERB_LOOK, NOUN_SIGN)) {
+ if (_scene->_customDest.x < 100)
+ _vm->_dialogs->show(50726);
+ else
+ _vm->_dialogs->show(50716);
+ } else if (_action.isAction(VERB_LOOK, NOUN_HOTTEST_SOFTWARE))
+ _vm->_dialogs->show(50717);
+ else if (_action.isAction(VERB_LOOK, NOUN_SOFTWARE_SHELF))
+ _vm->_dialogs->show(50718);
+ else if (_action.isAction(VERB_LOOK, NOUN_SENSOR))
+ _vm->_dialogs->show(50719);
+ else if (_action.isAction(VERB_LOOK, NOUN_CASH_REGISTER))
+ _vm->_dialogs->show(50720);
+ else if (_action.isAction(VERB_LOOK, NOUN_PAD_OF_PAPER))
+ _vm->_dialogs->show(50721);
+ else if (_action.isAction(VERB_OPEN, NOUN_CASH_REGISTER))
+ _vm->_dialogs->show(50723);
+ else if (_action.isAction(VERB_LOOK, NOUN_BARGAIN_VAT))
+ _vm->_dialogs->show(50724);
+ else if (_action.isAction(VERB_LOOK, NOUN_WINDOW))
+ _vm->_dialogs->show(50725);
+ else if (_action.isAction(VERB_LOOK, NOUN_COUNTER)) {
+ if (_game._objects.isInRoom(OBJ_PENLIGHT))
+ _vm->_dialogs->show(50728);
+ else
+ _vm->_dialogs->show(50727);
+ } else if (_action.isAction(VERB_LOOK, NOUN_PENLIGHT) && !_game._objects.isInInventory(OBJ_PENLIGHT)) {
+ if (_game._objects.isInRoom(OBJ_PENLIGHT))
+ _vm->_dialogs->show(50729);
+ } else if (_action.isAction(VERB_LOOK, NOUN_EMERGENCY_LIGHT))
+ _vm->_dialogs->show(50731);
+ else
+ return;
+
+ _action._inProgress = false;
+}
+
+/*------------------------------------------------------------------------*/
+
+Scene508::Scene508(MADSEngine *vm) : Scene5xx(vm) {
+ _chosenObject = -1;
+}
+
+void Scene508::synchronize(Common::Serializer &s) {
+ Scene5xx::synchronize(s);
+
+ s.syncAsSint16LE(_chosenObject);
+}
+
+void Scene508::setup() {
+ setPlayerSpritesPrefix();
+ setAAName();
+ _scene->addActiveVocab(NOUN_SPINACH_PATCH_DOLL);
+ _scene->addActiveVocab(VERB_WALKTO);
+ _scene->addActiveVocab(NOUN_LASER_BEAM);
+}
+
+void Scene508::enter() {
+ _globals._spriteIndexes[1] = _scene->_sprites.addSprites(formAnimName('a', 0));
+ _globals._spriteIndexes[2] = _scene->_sprites.addSprites(formAnimName('m', 0));
+ _globals._spriteIndexes[3] = _scene->_sprites.addSprites(formAnimName('h', 0));
+ _globals._spriteIndexes[4] = _scene->_sprites.addSprites(formAnimName('l', 2));
+ _globals._spriteIndexes[5] = _scene->_sprites.addSprites(formAnimName('t', 0));
+ _globals._spriteIndexes[6] = _scene->_sprites.addSprites("*RXMRC_9");
+ _globals._spriteIndexes[7] = _scene->_sprites.addSprites(formAnimName('l', 3));
+
+ if (!_game._visitedScenes._sceneRevisited) {
+ _globals[kLaserOn] = false;
+ _chosenObject = 0;
+ }
+
+ if (!_globals[kLaserOn]) {
+ _globals._sequenceIndexes[3] = _scene->_sequences.startCycle(_globals._spriteIndexes[3], false, -2);
+ _scene->_sequences.setDepth(_globals._sequenceIndexes[3], 8);
+ _globals._sequenceIndexes[5] = _scene->_sequences.startCycle(_globals._spriteIndexes[5], false, -2);
+ int idx = _scene->_dynamicHotspots.add(NOUN_LASER_BEAM, VERB_WALKTO, _globals._sequenceIndexes[5], Common::Rect(0, 0, 0, 0));
+ _scene->_dynamicHotspots.setPosition(idx, Common::Point(57, 116), FACING_NORTHEAST);
+ _scene->_hotspots.activate(NOUN_HOLE, false);
+ _scene->_hotspots.activate(NOUN_LASER_BEAM, false);
+ } else {
+ _scene->changeVariant(1);
+ _globals._sequenceIndexes[3] = _scene->_sequences.startCycle(_globals._spriteIndexes[3], false, -2);
+ _scene->_sequences.setDepth(_globals._sequenceIndexes[3], 8);
+ _globals._sequenceIndexes[4] = _scene->_sequences.startCycle(_globals._spriteIndexes[4], false, -2);
+ _scene->_sequences.setDepth(_globals._sequenceIndexes[4], 11);
+ int idx = _scene->_dynamicHotspots.add(NOUN_LASER_BEAM, VERB_WALKTO, _globals._sequenceIndexes[4], Common::Rect(0, 0, 0, 0));
+ _scene->_dynamicHotspots.setPosition(idx, Common::Point(57, 116), FACING_NORTHEAST);
+ _globals._sequenceIndexes[2] = _scene->_sequences.startReverseCycle(_globals._spriteIndexes[2], false, 15, 0, 0, 0);
+ _scene->_sequences.setAnimRange(_globals._sequenceIndexes[2], 6, 8);
+ _scene->_sequences.setDepth(_globals._sequenceIndexes[2], 6);
+ if (_globals[kLaserHoleIsThere]) {
+ _globals._sequenceIndexes[7] = _scene->_sequences.startCycle(_globals._spriteIndexes[7], false, -2);
+ _scene->_hotspots.activate(NOUN_HOLE, true);
+ _scene->_hotspots.activate(NOUN_LASER_BEAM, true);
+ }
+ _vm->_sound->command(21);
+ }
+ _vm->_sound->command(20);
+
+ if (_scene->_priorSceneId == 515) {
+ _game._player._playerPos = Common::Point(57, 116);
+ _game._player._facing = FACING_NORTHEAST;
+ } else if (_scene->_priorSceneId != -2) {
+ _game._player._playerPos = Common::Point(289, 139);
+ _game._player._facing = FACING_WEST;
+ }
+
+ sceneEntrySound();
+ _game.loadQuoteSet(0x273, 0);
+
+ if (_scene->_roomChanged) {
+ _game._objects.addToInventory(OBJ_COMPACT_CASE);
+ _game._objects.addToInventory(OBJ_REARVIEW_MIRROR);
+ }
+}
+
+void Scene508::preActions() {
+ if (_action.isAction(VERB_WALK, NOUN_OUTSIDE))
+ _game._player._walkOffScreenSceneId = 506;
+}
+
+void Scene508::handlePedestral() {
+ if (!_globals[kLaserOn])
+ _vm->_dialogs->show(50835);
+
+ if (_globals[kLaserHoleIsThere])
+ _vm->_dialogs->show(50836);
+
+ if (_globals[kLaserOn] && !_globals[kLaserHoleIsThere]) {
+ switch (_game._trigger) {
+ case 0:
+ _game._player._stepEnabled = false;
+ _game._player._visible = false;
+ _globals._sequenceIndexes[6] = _scene->_sequences.startReverseCycle(_globals._spriteIndexes[6], false, 9, 1, 0, 0);
+ _scene->_sequences.setAnimRange(_globals._sequenceIndexes[6], 1, 4);
+ _scene->_sequences.setMsgLayout(_globals._sequenceIndexes[6]);
+ _scene->_sequences.addSubEntry(_globals._sequenceIndexes[6], SEQUENCE_TRIGGER_SPRITE, 4, 1);
+ _scene->_sequences.addSubEntry(_globals._sequenceIndexes[6], SEQUENCE_TRIGGER_EXPIRE, 0, 3);
+ break;
+
+ case 1:
+ if (_chosenObject == 2)
+ _game._objects.removeFromInventory(OBJ_COMPACT_CASE, 1);
+ else
+ _game._objects.removeFromInventory(OBJ_REARVIEW_MIRROR, 1);
+
+ _globals._sequenceIndexes[7] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[7], false, 6, 1, 0, 0);
+ _scene->_sequences.addSubEntry(_globals._sequenceIndexes[7], SEQUENCE_TRIGGER_EXPIRE, 0, 2);
+ break;
+
+ case 2:
+ _globals._sequenceIndexes[7] = _scene->_sequences.startCycle(_globals._spriteIndexes[7], false, -2);
+ _scene->_hotspots.activate(NOUN_HOLE, true);
+ _scene->_hotspots.activate(NOUN_LASER_BEAM, true);
+ break;
+
+ case 3:
+ _scene->_sequences.updateTimeout(-1, _globals._sequenceIndexes[6]);
+ _game._player._visible = true;
+ _scene->_sequences.addTimer(120, 4);
+ break;
+
+ case 4:
+ _vm->_dialogs->show(50834);
+ _globals[kLaserHoleIsThere] = true;
+ _scene->_nextSceneId = 515;
+ break;
+
+ default:
+ break;
+ }
+ }
+}
+
+void Scene508::actions() {
+ if (_action.isAction(VERB_PULL, NOUN_LEVER)) {
+ if (!_globals[kLaserOn]) {
+ switch (_game._trigger) {
+ case 0:
+ _game._player._stepEnabled = false;
+ _scene->_kernelMessages.reset();
+ _scene->_kernelMessages.add(Common::Point(0, 0), 0x1110, 34, 2, 120, _game.getQuote(0x273));
+ break;
+
+ case 2:
+ _game._player._visible = false;
+ _scene->_sequences.remove(_globals._sequenceIndexes[3]);
+ _globals._sequenceIndexes[1] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[1], false, 10, 1, 0, 0);
+ _scene->_sequences.setDepth(_globals._sequenceIndexes[1], 7);
+ _scene->_sequences.updateTimeout(_globals._sequenceIndexes[1], -1);
+ _scene->_sequences.addSubEntry(_globals._sequenceIndexes[1], SEQUENCE_TRIGGER_EXPIRE, 0, 3);
+ break;
+
+ case 3:
+ _vm->_sound->command(19);
+ _globals._sequenceIndexes[2] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[2], false, 15, 1, 0, 0);
+ _scene->_sequences.setDepth(_globals._sequenceIndexes[2], 6);
+ _scene->_sequences.addSubEntry(_globals._sequenceIndexes[2], SEQUENCE_TRIGGER_EXPIRE, 0, 4);
+ _globals._sequenceIndexes[3] = _scene->_sequences.startCycle(_globals._spriteIndexes[3], false, -2);
+ _scene->_sequences.setDepth(_globals._sequenceIndexes[3], 8);
+ _scene->_sequences.updateTimeout(-1, _globals._sequenceIndexes[1]);
+ _game._player._visible = true;
+ _scene->_sequences.addTimer(15, 5);
+ break;
+
+ case 4:
+ _globals._sequenceIndexes[2] = _scene->_sequences.startReverseCycle(_globals._spriteIndexes[2], false, 15, 0, 0, 0);
+ _scene->_sequences.setAnimRange(_globals._sequenceIndexes[2], 6, 8);
+ _scene->_sequences.setDepth(_globals._sequenceIndexes[2], 6);
+ break;
+
+ case 5:
+ _scene->_sequences.remove(_globals._sequenceIndexes[5]);
+ _scene->loadAnimation(formAnimName('B', 1), 6);
+ break;
+
+ case 6: {
+ _vm->_sound->command(22);
+ _globals._sequenceIndexes[4] = _scene->_sequences.startCycle(_globals._spriteIndexes[4], false, -2);
+ _scene->_sequences.setDepth(_globals._sequenceIndexes[4], 11);
+ int idx = _scene->_dynamicHotspots.add(NOUN_LASER_BEAM, VERB_WALKTO, _globals._sequenceIndexes[4], Common::Rect(0, 0, 0, 0));
+ _scene->_dynamicHotspots.setPosition(idx, Common::Point(57, 116), FACING_NORTHEAST);
+ _scene->_kernelMessages.reset();
+ _scene->changeVariant(1);
+ _scene->_sequences.addTimer(30, 7);
+ }
+ break;
+
+ case 7:
+ _globals[kLaserOn] = true;
+ _vm->_dialogs->show(50833);
+ _game._player._stepEnabled = true;
+ break;
+
+ default:
+ break;
+ }
+ } else {
+ _vm->_dialogs->show(50837);
+ }
+ } else if (_action.isAction(VERB_REFLECT, NOUN_REARVIEW_MIRROR, NOUN_LASER_BEAM) || _action.isAction(VERB_PUT, NOUN_REARVIEW_MIRROR, NOUN_PEDESTAL) || _action.isAction(VERB_PUT, NOUN_REARVIEW_MIRROR, NOUN_LASER_BEAM)) {
+ _chosenObject = 1;
+ handlePedestral();
+ } else if (_action.isAction(VERB_PUT, NOUN_COMPACT_CASE, NOUN_PEDESTAL) || _action.isAction(VERB_PUT, NOUN_COMPACT_CASE, NOUN_LASER_BEAM) || _action.isAction(VERB_REFLECT, NOUN_COMPACT_CASE, NOUN_LASER_BEAM)) {
+ _chosenObject = 2;
+ handlePedestral();
+ } else if (_action._lookFlag)
+ _vm->_dialogs->show(50822);
+ else if (_action.isAction(VERB_LOOK, NOUN_TARGET_AREA))
+ _vm->_dialogs->show(50810);
+ else if (_action.isAction(VERB_LOOK, NOUN_SPINACH_PATCH_DOLL))
+ _vm->_dialogs->show(50811);
+ else if (_action.isAction(VERB_TAKE, NOUN_SPINACH_PATCH_DOLL))
+ _vm->_dialogs->show(50812);
+ else if (_action.isAction(VERB_LOOK, NOUN_SAND_BAGS))
+ _vm->_dialogs->show(50816);
+ else if (_action.isAction(VERB_TAKE, NOUN_SAND_BAGS))
+ _vm->_dialogs->show(50817);
+ else if (_action.isAction(VERB_LOOK, NOUN_CONTROL_STATION))
+ _vm->_dialogs->show(50818);
+ else if (_action.isAction(VERB_LOOK, NOUN_MONITOR)) {
+ if (_globals[kLaserOn])
+ _vm->_dialogs->show(50820);
+ else
+ _vm->_dialogs->show(50819);
+ } else if (_action.isAction(VERB_LOOK, NOUN_LASER_CANNON)) {
+ if (_globals[kLaserOn])
+ _vm->_dialogs->show(50822);
+ else
+ _vm->_dialogs->show(50821);
+ } else if (_action.isAction(VERB_TAKE, NOUN_LASER_CANNON))
+ _vm->_dialogs->show(50823);
+ else if (_action.isAction(VERB_LOOK, NOUN_LEVER)) {
+ if (_globals[kLaserOn])
+ _vm->_dialogs->show(50825);
+ else
+ _vm->_dialogs->show(50824);
+ } else if (_action.isAction(VERB_PUSH, NOUN_LEVER))
+ _vm->_dialogs->show(50826);
+ else if (_action.isAction(VERB_LOOK, NOUN_LASER_BEAM)) {
+ if (_globals[kLaserHoleIsThere])
+ _vm->_dialogs->show(50828);
+ else
+ _vm->_dialogs->show(50827);
+ } else if (_action.isAction(VERB_TAKE, NOUN_LASER_BEAM))
+ _vm->_dialogs->show(50829);
+ else if (_action.isAction(VERB_LOOK, NOUN_CEILING)) {
+ if (_globals[kLaserHoleIsThere])
+ _vm->_dialogs->show(50831);
+ else
+ _vm->_dialogs->show(50830);
+ } else if (_action.isAction(VERB_LOOK, NOUN_WALL))
+ _vm->_dialogs->show(50832);
+ else if (_action.isAction(VERB_LOOK, NOUN_PEDESTAL)) {
+ if (!_globals[kLaserOn])
+ _vm->_dialogs->show(50813);
+ else if (!_globals[kLaserHoleIsThere])
+ _vm->_dialogs->show(50814);
+ else
+ _vm->_dialogs->show(50815);
+ } else
+ return;
+
+ _action._inProgress = false;
+}
+
+/*------------------------------------------------------------------------*/
+
+Scene511::Scene511(MADSEngine *vm) : Scene5xx(vm) {
+ _handingLine = false;
+ _lineMoving = false;
+
+ _lineAnimationMode = -1;
+ _lineFrame = -1;
+ _lineAnimationPosition = -1;
+}
+
+void Scene511::synchronize(Common::Serializer &s) {
+ Scene5xx::synchronize(s);
+
+ s.syncAsByte(_handingLine);
+ s.syncAsByte(_lineMoving);
+
+ s.syncAsSint16LE(_lineAnimationMode);
+ s.syncAsSint16LE(_lineFrame);
+ s.syncAsSint16LE(_lineAnimationPosition);
+}
+
+void Scene511::setup() {
+ setPlayerSpritesPrefix();
+ setAAName();
+ _scene->addActiveVocab(NOUN_BOAT);
+ _scene->addActiveVocab(NOUN_FISHING_LINE);
+ _scene->addActiveVocab(VERB_WALKTO);
+}
+
+void Scene511::enter() {
+ _globals._spriteIndexes[1] = _scene->_sprites.addSprites(formAnimName('c', 0));
+ _globals._spriteIndexes[4] = _scene->_sprites.addSprites("*RXCD_6");
+
+ if (_scene->_priorSceneId != -2)
+ _handingLine = false;
+
+ if (_globals[kBoatRaised]) {
+ _globals._spriteIndexes[2] = _scene->_sprites.addSprites(formAnimName('b', 0));
+ _globals._sequenceIndexes[2] = _scene->_sequences.startCycle(_globals._spriteIndexes[2], false, 1);
+ _scene->_sequences.setDepth(_globals._sequenceIndexes[2], 3);
+ _scene->_hotspots.activate(NOUN_BOAT, false);
+ int idx = _scene->_dynamicHotspots.add(NOUN_BOAT, VERB_WALKTO, _globals._sequenceIndexes[2], Common::Rect(0, 0, 0, 0));
+ _scene->_dynamicHotspots.setPosition(idx, Common::Point(75, 124), FACING_NORTH);
+ _scene->_hotspots.activate(NOUN_ROPE, false);
+ } else {
+ _globals._spriteIndexes[5] = _scene->_sprites.addSprites(formAnimName('b', 2));
+ _globals._spriteIndexes[6] = _scene->_sprites.addSprites(formAnimName('b', 3));
+ _globals._spriteIndexes[3] = _scene->_sprites.addSprites(formAnimName('b', 1));
+
+ _globals._sequenceIndexes[3] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[3], false, 1, 1, 0, 0);
+ _scene->_sequences.setDepth(_globals._sequenceIndexes[3], 5);
+
+ _globals._sequenceIndexes[5] = _scene->_sequences.startCycle(_globals._spriteIndexes[5], false, 1);
+ _scene->_sequences.setDepth(_globals._sequenceIndexes[5], 4);
+
+ _globals._sequenceIndexes[6] = _scene->_sequences.startCycle(_globals._spriteIndexes[6], false, 1);
+ _scene->_sequences.setDepth(_globals._sequenceIndexes[6],5);
+
+ _scene->_hotspots.activate(NOUN_ROPE, true);
+ _scene->_hotspots.activate(NOUN_BOAT, true);
+ _scene->changeVariant(1);
+ }
+
+ int frame = 0;
+ if (_globals[kLineStatus] == 2)
+ frame = -1;
+ else if (_globals[kLineStatus] == 3)
+ frame = -2;
+
+ if (_globals[kLineStatus] == 2 || _globals[kLineStatus] == 3) {
+ _globals._spriteIndexes[7] = _scene->_sprites.addSprites(formAnimName('b', 4));
+ _globals._sequenceIndexes[7] = _scene->_sequences.startCycle(_globals._spriteIndexes[7], false, frame);
+ int idx = _scene->_dynamicHotspots.add(NOUN_FISHING_LINE, VERB_WALKTO, _globals._sequenceIndexes[7], Common::Rect(0, 0, 0, 0));
+ _scene->_dynamicHotspots.setPosition(idx, Common::Point(26, 153), FACING_NORTHEAST);
+ _scene->_sequences.setDepth(_globals._sequenceIndexes[7], 3);
+ if (_globals[kBoatRaised])
+ _scene->changeVariant(2);
+ }
+
+ _lineFrame = -1;
+ _lineMoving = false;
+
+ _globals._sequenceIndexes[1] = _scene->_sequences.startCycle(_globals._spriteIndexes[1], false, -2);
+ _scene->_sequences.setDepth(_globals._sequenceIndexes[1], 1);
+
+ if (_scene->_priorSceneId == 512) {
+ _game._player._playerPos = Common::Point(60, 112);
+ _game._player._facing = FACING_SOUTHEAST;
+ } else if (_scene->_priorSceneId != -2) {
+ _game._player._playerPos = Common::Point(55, 152);
+ _game._player._facing = FACING_NORTHWEST;
+ _game._player._visible = false;
+ _game._player._stepEnabled = false;
+ _scene->_sequences.remove(_globals._sequenceIndexes[1]);
+ _globals._sequenceIndexes[1] = _scene->_sequences.startCycle(_globals._spriteIndexes[1], false, -1);
+ _scene->_sequences.setDepth(_globals._sequenceIndexes[1], 1);
+ _scene->loadAnimation(formAnimName('R', 1), 70);
+ } else if (_handingLine) {
+ _game._player._visible = false;
+ _lineAnimationMode = 1;
+ _lineAnimationPosition = 1;
+ _scene->loadAnimation(formAnimName('R', -1));
+ _lineFrame = 2;
+ }
+ sceneEntrySound();
+}
+
+void Scene511::step() {
+ if ((_lineAnimationMode == 1) && _scene->_activeAnimation) {
+ if (_lineFrame != _scene->_activeAnimation->getCurrentFrame()) {
+ _lineFrame = _scene->_activeAnimation->getCurrentFrame();
+ int resetFrame = -1;
+
+ if ((_lineAnimationPosition == 2) && (_lineFrame == 14))
+ _lineMoving = false;
+
+ if (_lineAnimationPosition == 1) {
+ if (_lineFrame == 3) {
+ _lineMoving = false;
+ resetFrame = 2;
+ }
+
+ if (_handingLine)
+ resetFrame = 2;
+ }
+
+ if ((resetFrame >= 0) && (resetFrame != _scene->_activeAnimation->getCurrentFrame())) {
+ _scene->_activeAnimation->setCurrentFrame(resetFrame);
+ _lineFrame = resetFrame;
+ }
+ }
+ }
+
+ switch (_game._trigger) {
+ case 70:
+ _game._player._visible = true;
+ _game._player._priorTimer = _scene->_activeAnimation->getNextFrameTimer() - _game._player._ticksAmount;
+ _scene->_sequences.addTimer(6, 71);
+ break;
+
+ case 71:
+ _scene->_sequences.remove(_globals._sequenceIndexes[1]);
+ _globals._sequenceIndexes[1] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[1], false, 6, 1, 0, 0);
+ _scene->_sequences.setDepth(_globals._sequenceIndexes[1], 1);
+ _scene->_sequences.addSubEntry(_globals._sequenceIndexes[1], SEQUENCE_TRIGGER_EXPIRE, 0, 72);
+ break;
+
+ case 72:
+ _globals._sequenceIndexes[1] = _scene->_sequences.startCycle(_globals._spriteIndexes[1], false, -2);
+ _scene->_sequences.setDepth(_globals._sequenceIndexes[1], 1);
+ _game._player._stepEnabled = true;
+ break;
+
+ default:
+ break;
+ }
+}
+
+void Scene511::preActions() {
+ if (!_handingLine)
+ return;
+
+ if (_action.isAction(VERB_LOOK) || _action.isObject(NOUN_FISHING_LINE) || _action.isAction(VERB_TALKTO))
+ _game._player._needToWalk = false;
+
+ if ((!_action.isAction(VERB_TIE, NOUN_FISHING_LINE, NOUN_BOAT) || !_action.isAction(VERB_ATTACH, NOUN_FISHING_LINE, NOUN_BOAT)) && _game._player._needToWalk) {
+ if (_game._trigger == 0) {
+ _game._player._readyToWalk = false;
+ _game._player._stepEnabled = false;
+ _scene->freeAnimation ();
+ _lineAnimationMode = 2;
+ _scene->loadAnimation(formAnimName('R',2), 1);
+ } else if (_game._trigger == 1) {
+ _game._player._visible = true;
+ _game._player._priorTimer = _scene->_activeAnimation->getNextFrameTimer() - _game._player._ticksAmount;
+ _game._objects.setRoom(OBJ_FISHING_LINE, 1);
+ _handingLine = false;
+ _game._player._stepEnabled = true;
+ _game._player._readyToWalk = true;
+ }
+ }
+}
+
+void Scene511::actions() {
+ if (_action.isAction(VERB_WALK_INTO, NOUN_RESTAURANT))
+ _scene->_nextSceneId = 512;
+ else if (_action.isAction(VERB_GET_INTO, NOUN_CAR)) {
+ switch (_game._trigger) {
+ case 0:
+ _game._player._stepEnabled = false;
+ _scene->_sequences.remove(_globals._sequenceIndexes[1]);
+ _globals._sequenceIndexes[1] = _scene->_sequences.startReverseCycle(_globals._spriteIndexes[1], false, 6, 1, 0, 0);
+ _scene->_sequences.setDepth(_globals._sequenceIndexes[1], 1);
+ _scene->_sequences.addSubEntry(_globals._sequenceIndexes[1], SEQUENCE_TRIGGER_EXPIRE, 0, 1);
+ break;
+
+ case 1: {
+ int syncIdx = _globals._sequenceIndexes[1];
+ _globals._sequenceIndexes[1] = _scene->_sequences.startCycle(_globals._spriteIndexes[1], false, -1);
+ _scene->_sequences.setDepth(_globals._sequenceIndexes[1], 1);
+ _scene->_sequences.updateTimeout(_globals._sequenceIndexes[1], syncIdx);
+ _scene->_sequences.addTimer(6, 2);
+ }
+ break;
+
+ case 2:
+ _game._player._visible = false;
+ _globals._sequenceIndexes[4] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[4], false, 8, 1, 0, 0);
+ _scene->_sequences.setMsgLayout(_globals._sequenceIndexes[4]);
+ _scene->_sequences.addSubEntry(_globals._sequenceIndexes[4], SEQUENCE_TRIGGER_EXPIRE, 0, 3);
+ break;
+
+ case 3: {
+ int syncIdx = _globals._sequenceIndexes[4];
+ _globals._sequenceIndexes[4] = _scene->_sequences.startCycle(_globals._spriteIndexes[4], false, -2);
+ _scene->_sequences.setMsgLayout(_globals._sequenceIndexes[4]);
+ _scene->_sequences.updateTimeout(_globals._sequenceIndexes[4], syncIdx);
+ _scene->_nextSceneId = 504;
+ }
+ break;
+
+ default:
+ break;
+ }
+ } else if (_action.isAction(VERB_TAKE, NOUN_FISHING_LINE)) {
+ if (!_globals[kBoatRaised]) {
+ if (_globals[kLineStatus] == 2) {
+ if (_globals[kLineStatus] != 3) {
+ if (_game._trigger == 0) {
+ _game._player._stepEnabled = false;
+ _game._player._visible = false;
+ _lineAnimationMode = 1;
+ _lineAnimationPosition = 1;
+ _lineMoving = true;
+ _scene->loadAnimation(formAnimName('R', -1));
+ _scene->_sequences.addTimer(1, 1);
+ } else if (_game._trigger == 1) {
+ if (_lineMoving) {
+ _scene->_sequences.addTimer(1, 1);
+ } else {
+ _game._objects.addToInventory(OBJ_FISHING_LINE);
+ _lineMoving = true;
+ _handingLine = true;
+ _game._player._stepEnabled = true;
+ }
+ }
+ } else
+ _vm->_dialogs->show(51129);
+ } else
+ return;
+ } else {
+ _vm->_dialogs->show(51130);
+ }
+ } else if (_action.isAction(VERB_TIE, NOUN_FISHING_LINE, NOUN_BOAT) || _action.isAction(VERB_ATTACH, NOUN_FISHING_LINE, NOUN_BOAT)) {
+ if (_globals[kBoatRaised])
+ _vm->_dialogs->show(51131);
+ else if (_globals[kLineStatus] == 1)
+ _vm->_dialogs->show(51130);
+ else if (!_globals[kBoatRaised] && _handingLine) {
+ if (_globals[kLineStatus] != 3) {
+ if (_game._trigger == 0) {
+ _game._player._stepEnabled = false;
+ _scene->_sequences.remove(_globals._sequenceIndexes[7]);
+ _lineMoving = true;
+ _lineAnimationPosition = 2;
+ _scene->_sequences.addTimer(1, 1);
+ } else if (_game._trigger == 1) {
+ if (_lineMoving)
+ _scene->_sequences.addTimer(1, 1);
+ else {
+ _game._player._visible = true;
+ _game._player._priorTimer = _scene->_frameStartTime - _game._player._ticksAmount;
+ _globals._sequenceIndexes[7] = _scene->_sequences.startCycle(_globals._spriteIndexes[7], false, -2);
+ _scene->_sequences.setDepth(_globals._sequenceIndexes[7], 4);
+ int idx = _scene->_dynamicHotspots.add(NOUN_FISHING_LINE, VERB_WALKTO, _globals._sequenceIndexes[7], Common::Rect(0, 0, 0, 0));
+ _scene->_dynamicHotspots.setPosition(idx, Common::Point(26, 153), FACING_NORTHEAST);
+ _game._objects.removeFromInventory(OBJ_FISHING_LINE, 1);
+ _handingLine = false;
+ _lineMoving = true;
+ _globals[kLineStatus] = 3;
+ _game._player._stepEnabled = true;
+ }
+ }
+ }
+ }
+ } else if (_action.isAction(VERB_LOOK, NOUN_STREET) || _action._lookFlag) {
+ if (_globals[kLineStatus] == 2)
+ _vm->_dialogs->show(51110);
+ else {
+ if (_globals[kLineStatus] == 3)
+ _vm->_dialogs->show(51111);
+ else
+ _vm->_dialogs->show(51112);
+ }
+ } else if (_action.isAction(VERB_LOOK, NOUN_CAR))
+ _vm->_dialogs->show(51113);
+ else if (_action.isAction(VERB_LOOK, NOUN_SIDEWALK))
+ _vm->_dialogs->show(51114);
+ else if (_action.isAction(VERB_WALK_DOWN, NOUN_SIDEWALK_TO_EAST) || _action.isAction(VERB_WALK_DOWN, NOUN_SIDEWALK_TO_WEST) || _action.isAction(VERB_WALK_DOWN, NOUN_STREET_TO_EAST))
+ _vm->_dialogs->show(51115);
+ else if (_action.isAction(VERB_LOOK, NOUN_PLEASURE_DOME))
+ _vm->_dialogs->show(51116);
+ else if (_action.isAction(VERB_LOOK, NOUN_TICKET_BOOTH))
+ _vm->_dialogs->show(51117);
+ else if (_action.isAction(VERB_LOOK, NOUN_DOME_ENTRANCE))
+ _vm->_dialogs->show(51118);
+ else if (_action.isAction(VERB_UNLOCK, NOUN_PADLOCK_KEY, NOUN_DOME_ENTRANCE) || _action.isAction(VERB_UNLOCK, NOUN_DOOR_KEY, NOUN_DOME_ENTRANCE))
+ _vm->_dialogs->show(51119);
+ else if ( (_action.isAction(VERB_PUT) || _action.isAction(VERB_THROW))
+ && (_action.isObject(NOUN_TIMEBOMB) || _action.isObject(NOUN_BOMB) || _action.isObject(NOUN_BOMBS))
+ && _action.isObject(NOUN_DOME_ENTRANCE))
+ _vm->_dialogs->show(51120);
+ else if (_action.isAction(VERB_LOOK, NOUN_RESTAURANT)) {
+ if (_globals[kBoatRaised])
+ _vm->_dialogs->show(51121);
+ else
+ _vm->_dialogs->show(51128);
+ } else if (_action.isAction(VERB_LOOK, NOUN_PORTHOLE))
+ _vm->_dialogs->show(51122);
+ else if (_action.isAction(VERB_LOOK, NOUN_FISHING_LINE) && (_action._mainObjectSource == 4) && (_globals[kLineStatus] == 2))
+ _vm->_dialogs->show(51126);
+ else if (_action.isAction(VERB_LOOK, NOUN_FISHING_LINE) && (_action._mainObjectSource == 4) && (_globals[kLineStatus] == 3))
+ _vm->_dialogs->show(51133);
+ else if (_action.isAction(VERB_LOOK, NOUN_STATUE))
+ _vm->_dialogs->show(51127);
+ else if (_action.isAction(VERB_LOOK, NOUN_BOAT))
+ if (_globals[kBoatRaised])
+ _vm->_dialogs->show(51123);
+ else if (_globals[kLineStatus] != 3)
+ _vm->_dialogs->show(51124);
+ else
+ _vm->_dialogs->show(51125);
+ else if (_action.isAction(VERB_LOOK, NOUN_FISHING_LINE) && (_globals[kLineStatus] == 3))
+ _vm->_dialogs->show(51125);
+ else
+ return;
+
+ _action._inProgress = false;
+}
+
+/*------------------------------------------------------------------------*/
+
+Scene512::Scene512(MADSEngine *vm) : Scene5xx(vm) {
+ _fishingRodHotspotId = -1;
+ _keyHotspotId = -1;
+}
+
+void Scene512::synchronize(Common::Serializer &s) {
+ Scene5xx::synchronize(s);
+
+ s.syncAsSint16LE(_fishingRodHotspotId);
+ s.syncAsSint16LE(_keyHotspotId);
+}
+
+void Scene512::setup() {
+ setPlayerSpritesPrefix();
+ setAAName();
+ _scene->addActiveVocab(NOUN_FISHING_ROD);
+ _scene->addActiveVocab(VERB_WALKTO);
+ _scene->addActiveVocab(NOUN_PADLOCK_KEY);
+ _scene->addActiveVocab(NOUN_REGISTER_DRAWER);
+}
+
+void Scene512::enter() {
+ _globals._spriteIndexes[1] = _scene->_sprites.addSprites(formAnimName('r', -1));
+ _globals._spriteIndexes[2] = _scene->_sprites.addSprites("*RXMRC_9");
+ _globals._spriteIndexes[8] = _scene->_sprites.addSprites("*RXMRC_8");
+ _globals._spriteIndexes[3] = _scene->_sprites.addSprites(formAnimName('x', 0));
+ _globals._spriteIndexes[4] = _scene->_sprites.addSprites(formAnimName('x', 1));
+ _globals._spriteIndexes[5] = _scene->_sprites.addSprites(formAnimName('x', 2));
+ _globals._spriteIndexes[6] = _scene->_sprites.addSprites(formAnimName('x', 3));
+
+ if (_game._objects[OBJ_FISHING_ROD]._roomNumber == _scene->_currentSceneId) {
+ _globals._sequenceIndexes[1] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[1], false, 9, 0, 0, 0);
+ _fishingRodHotspotId = _scene->_dynamicHotspots.add(NOUN_FISHING_ROD, VERB_WALKTO, _globals._sequenceIndexes[1], Common::Rect(0, 0, 0, 0));
+ _scene->_dynamicHotspots.setPosition(_fishingRodHotspotId, Common::Point(199, 101), FACING_NORTHEAST);
+ }
+
+ if (!_game._visitedScenes._sceneRevisited)
+ _globals[kRegisterOpen] = false;
+
+ _scene->_hotspots.activate(NOUN_PADLOCK_KEY, false);
+ if (_game._difficulty == DIFFICULTY_EASY) {
+ if (_game._objects[OBJ_PADLOCK_KEY]._roomNumber == _scene->_currentSceneId) {
+ _globals._sequenceIndexes[6] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[6], false, 10, 0, 0, 0);
+ _scene->_sequences.setDepth(_globals._sequenceIndexes[6], 3);
+ _keyHotspotId = _scene->_dynamicHotspots.add(NOUN_PADLOCK_KEY, VERB_WALKTO, _globals._sequenceIndexes[6], Common::Rect(0, 0, 0, 0));
+ _scene->_dynamicHotspots.setPosition(_keyHotspotId, Common::Point(218, 152), FACING_NORTHEAST);
+ }
+ if (_globals[kRegisterOpen]) {
+ _globals._sequenceIndexes[3] = _scene->_sequences.startCycle(_globals._spriteIndexes[3], false, -2);
+ _scene->_sequences.setDepth(_globals._sequenceIndexes[3], 3);
+ _scene->_hotspots.activate(NOUN_PADLOCK_KEY, false);
+ }
+ } else if (_globals[kRegisterOpen]) {
+ if (_game._objects[OBJ_PADLOCK_KEY]._roomNumber == _scene->_currentSceneId) {
+ _scene->_hotspots.activate(NOUN_PADLOCK_KEY, true);
+ _globals._sequenceIndexes[5] = _scene->_sequences.startCycle(_globals._spriteIndexes[5], false, -2);
+ _scene->_sequences.setDepth(_globals._sequenceIndexes[5], 3);
+ } else {
+ _scene->_hotspots.activate(NOUN_PADLOCK_KEY, false);
+ _globals._sequenceIndexes[3] = _scene->_sequences.startCycle(_globals._spriteIndexes[3], false, -2);
+ _scene->_sequences.setDepth(_globals._sequenceIndexes[3], 3);
+ }
+ } else
+ _scene->_hotspots.activate(NOUN_PADLOCK_KEY, false);
+
+ if (_scene->_priorSceneId != -2) {
+ _game._player._playerPos = Common::Point(144, 152);
+ _game._player._facing = FACING_NORTHEAST;
+ }
+
+ sceneEntrySound();
+}
+
+void Scene512::actions() {
+ if (_action.isAction(VERB_WALK, NOUN_OUTSIDE))
+ _scene->_nextSceneId = 511;
+ else if (_action.isAction(VERB_TAKE, NOUN_FISHING_ROD)) {
+ if (_game._trigger || !_game._objects.isInInventory(OBJ_FISHING_ROD)) {
+ switch (_game._trigger) {
+ case 0:
+ _game._player._stepEnabled = false;
+ _game._player._visible = false;
+ _globals._sequenceIndexes[2] = _scene->_sequences.startReverseCycle(_globals._spriteIndexes[2], false, 8, 1, 0, 0);
+ _scene->_sequences.setMsgLayout(_globals._sequenceIndexes[2]);
+ _scene->_sequences.addSubEntry(_globals._sequenceIndexes[2], SEQUENCE_TRIGGER_SPRITE, 5, 1);
+ _scene->_sequences.addSubEntry(_globals._sequenceIndexes[2], SEQUENCE_TRIGGER_EXPIRE, 0, 2);
+ break;
+
+ case 1:
+ _vm->_sound->command(9);
+ _scene->_sequences.remove(_globals._sequenceIndexes[1]);
+ _scene->_dynamicHotspots.remove(_fishingRodHotspotId);
+ _game._objects.addToInventory(OBJ_FISHING_ROD);
+ _vm->_dialogs->showItem(OBJ_FISHING_ROD, 51217);
+ break;
+
+ case 2:
+ _scene->_sequences.updateTimeout(-1, _globals._sequenceIndexes[2]);
+ _game._player._visible = true;
+ _game._player._stepEnabled = true;
+ break;
+
+ default:
+ break;
+ }
+ }
+ } else if (_action.isAction(VERB_OPEN, NOUN_CASH_REGISTER)) {
+ if (!_globals[kRegisterOpen]) {
+ switch (_game._trigger) {
+ case 0:
+ _vm->_dialogs->show(51236);
+ _game._player._stepEnabled = false;
+ _game._player._facing = FACING_NORTH;
+ _scene->_sequences.addTimer(15, 1);
+ break;
+
+ case 1:
+ _game._player._visible = false;
+ _globals._sequenceIndexes[8] = _scene->_sequences.startReverseCycle(_globals._spriteIndexes[8], false, 9, 1, 0, 0);
+ _scene->_sequences.setAnimRange(_globals._sequenceIndexes[8], 1, 3);
+ _scene->_sequences.setMsgLayout(_globals._sequenceIndexes[8]);
+ _scene->_sequences.addSubEntry(_globals._sequenceIndexes[8], SEQUENCE_TRIGGER_EXPIRE, 0, 2);
+ break;
+
+ case 2:
+ _scene->_sequences.updateTimeout(-1, _globals._sequenceIndexes[8]);
+ _game._player._visible = true;
+ _scene->_sequences.addTimer(30, 3);
+ break;
+
+ case 3:
+ _game._player._facing = FACING_NORTHEAST;
+ if (!_game._objects.isInRoom(OBJ_PADLOCK_KEY) || (_game._difficulty == DIFFICULTY_EASY)) {
+ _globals._sequenceIndexes[3] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[3], false, 12, 1, 0, 0);
+ _scene->_sequences.setDepth(_globals._sequenceIndexes[3], 3);
+ _scene->_sequences.addSubEntry(_globals._sequenceIndexes[3], SEQUENCE_TRIGGER_EXPIRE, 0, 4);
+ } else {
+ _globals._sequenceIndexes[4] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[4], false, 12, 1, 0, 0);
+ _scene->_sequences.setDepth(_globals._sequenceIndexes[4], 3);
+ _scene->_sequences.addSubEntry(_globals._sequenceIndexes[4], SEQUENCE_TRIGGER_EXPIRE, 0, 5);
+ }
+ _vm->_sound->command(23);
+ break;
+
+ case 4:
+ _globals._sequenceIndexes[3] = _scene->_sequences.startCycle(_globals._spriteIndexes[3], false, -2);
+ _scene->_sequences.setDepth(_globals._sequenceIndexes[3], 3);
+ _scene->_sequences.addTimer(60, 6);
+ break;
+
+ case 5:
+ _globals._sequenceIndexes[5] = _scene->_sequences.startReverseCycle(_globals._spriteIndexes[5], false, 14, 0, 0, 0);
+ _scene->_sequences.setDepth(_globals._sequenceIndexes[5], 3);
+ _scene->_hotspots.activate(NOUN_PADLOCK_KEY, true);
+ _scene->_sequences.addTimer(60, 6);
+ break;
+
+ case 6:
+ _globals[kRegisterOpen] = true;
+ _game._player._stepEnabled = true;
+ break;
+
+ default:
+ break;
+ }
+ } else
+ _vm->_dialogs->show(51239);
+ } else if (_action.isAction(VERB_CLOSE, NOUN_CASH_REGISTER) && _globals[kRegisterOpen]) {
+ switch (_game._trigger) {
+ case 0:
+ _game._player._stepEnabled = false;
+ _game._player._visible = false;
+ _globals._sequenceIndexes[2] = _scene->_sequences.startReverseCycle(_globals._spriteIndexes[2], false, 10, 1, 0, 0);
+ _scene->_sequences.setAnimRange(_globals._sequenceIndexes[2], 1, 2);
+ _scene->_sequences.setMsgLayout(_globals._sequenceIndexes[2]);
+ _scene->_sequences.addSubEntry(_globals._sequenceIndexes[2], SEQUENCE_TRIGGER_EXPIRE, 0, 1);
+ break;
+
+ case 1:
+ _scene->_sequences.updateTimeout(-1, _globals._sequenceIndexes[2]);
+ _game._player._visible = true;
+ if (!_game._objects.isInRoom(OBJ_PADLOCK_KEY) || _game._difficulty == DIFFICULTY_EASY) {
+ _scene->_sequences.remove(_globals._sequenceIndexes[3]);
+ _globals._sequenceIndexes[3] = _scene->_sequences.startReverseCycle(_globals._spriteIndexes[3], false, 12, 1, 0, 0);
+ _scene->_sequences.setDepth(_globals._sequenceIndexes[3], 3);
+ _scene->_sequences.addSubEntry(_globals._sequenceIndexes[3], SEQUENCE_TRIGGER_EXPIRE, 0, 2);
+ } else {
+ _scene->_sequences.remove(_globals._sequenceIndexes[5]);
+ _globals._sequenceIndexes[4] = _scene->_sequences.startReverseCycle(_globals._spriteIndexes[4], false, 12, 1, 0, 0);
+ _scene->_sequences.setDepth(_globals._sequenceIndexes[4], 3);
+ _scene->_hotspots.activate(NOUN_PADLOCK_KEY, false);
+ _scene->_sequences.addSubEntry(_globals._sequenceIndexes[4], SEQUENCE_TRIGGER_EXPIRE, 0, 2);
+ }
+ break;
+
+ case 2:
+ _globals[kRegisterOpen] = false;
+ _game._player._stepEnabled = true;
+ break;
+
+ default:
+ break;
+ }
+ } else if (_action.isAction(VERB_TAKE, NOUN_PADLOCK_KEY)) {
+ if (_game._trigger || !_game._objects.isInInventory(OBJ_PADLOCK_KEY)) {
+ switch (_game._trigger) {
+ case 0:
+ _game._player._stepEnabled = false;
+ _game._player._visible = false;
+
+ int endVal;
+ if (_game._player._playerPos == Common::Point(218, 152))
+ endVal = 3;
+ else
+ endVal = 2;
+
+ _globals._sequenceIndexes[2] = _scene->_sequences.startReverseCycle(_globals._spriteIndexes[2], false, 10, 1, 0, 0);
+ _scene->_sequences.setAnimRange(_globals._sequenceIndexes[2], 1, endVal);
+ _scene->_sequences.setMsgLayout(_globals._sequenceIndexes[2]);
+ _scene->_sequences.addSubEntry(_globals._sequenceIndexes[2], SEQUENCE_TRIGGER_SPRITE, endVal, 1);
+ _scene->_sequences.addSubEntry(_globals._sequenceIndexes[2], SEQUENCE_TRIGGER_EXPIRE, 0, 2);
+ break;
+
+ case 1:
+ if (_game._player._playerPos == Common::Point(218, 152)) {
+ _scene->_sequences.remove(_globals._sequenceIndexes[6]);
+ _scene->_dynamicHotspots.remove(_keyHotspotId);
+ } else {
+ _scene->_sequences.remove(_globals._sequenceIndexes[5]);
+ _globals._sequenceIndexes[3] = _scene->_sequences.startCycle(_globals._spriteIndexes[3], false, -2);
+ _scene->_sequences.setDepth(_globals._sequenceIndexes[3], 3);
+ _scene->_hotspots.activate(NOUN_PADLOCK_KEY, false);
+ }
+ _vm->_sound->command(9);
+ _game._objects.addToInventory(OBJ_PADLOCK_KEY);
+ _vm->_dialogs->showItem(OBJ_PADLOCK_KEY, 51226);
+ break;
+
+ case 2:
+ _scene->_sequences.updateTimeout(-1, _globals._sequenceIndexes[2]);
+ _game._player._visible = true;
+ _game._player._stepEnabled = true;
+ break;
+
+ default:
+ break;
+ }
+ }
+ } else if (_action._lookFlag)
+ _vm->_dialogs->show(51225);
+ else if (_action.isAction(VERB_LOOK, NOUN_PADLOCK_KEY) && _game._objects.isInRoom(OBJ_PADLOCK_KEY))
+ _vm->_dialogs->show(51215);
+ else if (_action.isAction(VERB_LOOK, NOUN_FISHING_ROD) && (_scene->_activeAnimation->getCurrentFrame() == 4))
+ _vm->_dialogs->show(51216);
+ else if (_action.isAction(VERB_LOOK, NOUN_SHIPS_WHEEL))
+ _vm->_dialogs->show(51218);
+ else if (_action.isAction(VERB_TAKE, NOUN_SHIPS_WHEEL))
+ _vm->_dialogs->show(51219);
+ else if (_action.isAction(VERB_LOOK, NOUN_PORTHOLE) || _action.isAction(VERB_PEER_THROUGH, NOUN_PORTHOLE))
+ _vm->_dialogs->show(51220);
+ else if (_action.isAction(VERB_LOOK, NOUN_TABLE))
+ _vm->_dialogs->show(51221);
+ else if (_action.isAction(VERB_LOOK, NOUN_STARFISH))
+ _vm->_dialogs->show(51222);
+ else if (_action.isAction(VERB_TAKE, NOUN_STARFISH))
+ _vm->_dialogs->show(51223);
+ else if (_action.isAction(VERB_LOOK, NOUN_OUTSIDE))
+ _vm->_dialogs->show(51224);
+ else if (_action.isAction(VERB_LOOK, NOUN_POSTER))
+ _vm->_dialogs->show(51227);
+ else if (_action.isAction(VERB_TAKE, NOUN_POSTER))
+ _vm->_dialogs->show(51228);
+ else if (_action.isAction(VERB_LOOK, NOUN_TROPHY)) {
+ if (_game._visitedScenes.exists(604))
+ _vm->_dialogs->show(51229);
+ else
+ _vm->_dialogs->show(51230);
+ } else if (_action.isAction(VERB_LOOK, NOUN_CHAIR))
+ _vm->_dialogs->show(51231);
+ else if (_action.isAction(VERB_LOOK, NOUN_ROPE))
+ _vm->_dialogs->show(51232);
+ else if (_action.isAction(VERB_TAKE, NOUN_ROPE))
+ _vm->_dialogs->show(51233);
+ else if (_action.isAction(VERB_LOOK, NOUN_LAMP))
+ _vm->_dialogs->show(51234);
+ else if (_action.isAction(VERB_LOOK, NOUN_COUNTER))
+ _vm->_dialogs->show(51235);
+ else if (_action.isAction(VERB_LOOK, NOUN_ICE_CHESTS))
+ _vm->_dialogs->show(51237);
+ else if (_action.isAction(VERB_OPEN, NOUN_ICE_CHESTS))
+ _vm->_dialogs->show(51238);
+ else if (_action.isAction(VERB_LOOK, NOUN_CASH_REGISTER)) {
+ if (!_globals[kRegisterOpen])
+ _vm->_dialogs->show(51212);
+ else if (_game._objects.isInRoom(OBJ_PADLOCK_KEY))
+ _vm->_dialogs->show(51214);
+ else
+ _vm->_dialogs->show(51213);
+ } else
+ return;
+
+ _action._inProgress = false;
+}
+
+/*------------------------------------------------------------------------*/
+
+void Scene513::setup() {
+ setPlayerSpritesPrefix();
+ setAAName();
+ _scene->addActiveVocab(NOUN_ELEVATOR_DOOR);
+ _scene->addActiveVocab(VERB_WALKTO);
+}
+
+void Scene513::enter() {
+ _globals._spriteIndexes[1] = _scene->_sprites.addSprites(formAnimName('c', 0));
+ _globals._spriteIndexes[2] = _scene->_sprites.addSprites(formAnimName('x', 0));
+ _globals._spriteIndexes[3] = _scene->_sprites.addSprites("*RXCD_9");
+ _globals._spriteIndexes[4] = _scene->_sprites.addSprites("*RXMRC_9");
+
+ _globals._sequenceIndexes[2] = _scene->_sequences.startCycle(_globals._spriteIndexes[2], false, -2);
+ _scene->_sequences.setDepth(_globals._sequenceIndexes[2], 2);
+
+ _globals._sequenceIndexes[1] = _scene->_sequences.startCycle(_globals._spriteIndexes[1], false, -2);
+ _scene->_sequences.setDepth(_globals._sequenceIndexes[1], 1);
+
+ if ((_scene->_priorSceneId == 751) || (_scene->_priorSceneId == 701)) {
+ _game._player._playerPos = Common::Point(296, 147);
+ _game._player._facing = FACING_WEST;
+ _game._player._stepEnabled = false;
+ _scene->_sequences.addTimer(15, 80);
+ } else if (_scene->_priorSceneId != -2) {
+ _game._player._playerPos = Common::Point(63, 149);
+ _game._player._facing = FACING_NORTHEAST;
+ _game._player._visible = false;
+ _game._player._stepEnabled = false;
+ _scene->_sequences.remove(_globals._sequenceIndexes[1]);
+ _globals._sequenceIndexes[1] = _scene->_sequences.startCycle(_globals._spriteIndexes[1], false, -1);
+ _scene->_sequences.setDepth(_globals._sequenceIndexes[1], 1);
+ _scene->loadAnimation(formAnimName('R', 1), 70);
+ }
+
+ sceneEntrySound();
+
+ if (_scene->_roomChanged)
+ _game._objects.addToInventory(OBJ_SECURITY_CARD);
+
+ _game.loadQuoteSet(0x278, 0);
+}
+
+void Scene513::step() {
+ switch (_game._trigger) {
+ case 80:
+ _game._player._stepEnabled = false;
+ _scene->_sequences.remove(_globals._sequenceIndexes[2]);
+ _globals._sequenceIndexes[2] = _scene->_sequences.startReverseCycle(_globals._spriteIndexes[2], false, 7, 1, 0, 0);
+ _scene->_sequences.setDepth(_globals._sequenceIndexes[2], 2);
+ _vm->_sound->command(24);
+ _scene->_sequences.addSubEntry(_globals._sequenceIndexes[2], SEQUENCE_TRIGGER_EXPIRE, 0, 81);
+ break;
+
+ case 81:
+ _game._player.walk(Common::Point(265, 152), FACING_WEST);
+ _scene->_sequences.addTimer(120, 82);
+ break;
+
+ case 82:
+ _globals._sequenceIndexes[2] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[2], false, 7, 1, 0, 0);
+ _scene->_sequences.setDepth(_globals._sequenceIndexes[2], 2);
+ _vm->_sound->command(25);
+ _scene->_sequences.addSubEntry(_globals._sequenceIndexes[2], SEQUENCE_TRIGGER_EXPIRE, 0, 83);
+ break;
+
+ case 83:
+ _globals._sequenceIndexes[2] = _scene->_sequences.startCycle(_globals._spriteIndexes[2], false, -2);
+ _scene->_sequences.setDepth(_globals._sequenceIndexes[2], 2);
+ _game._player._stepEnabled = true;
+ break;
+
+ default:
+ break;
+ }
+
+ switch (_game._trigger) {
+ case 70:
+ _game._player._visible = true;
+ _game._player._priorTimer = _scene->_activeAnimation->getNextFrameTimer() - _game._player._ticksAmount;
+ _scene->_sequences.addTimer(6, 71);
+ break;
+
+ case 71:
+ _scene->_sequences.remove(_globals._sequenceIndexes[1]);
+ _globals._sequenceIndexes[1] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[1], false, 6, 1, 0, 0);
+ _scene->_sequences.setDepth(_globals._sequenceIndexes[1], 1);
+ _scene->_sequences.addSubEntry(_globals._sequenceIndexes[1], SEQUENCE_TRIGGER_EXPIRE, 0, 72);
+ break;
+
+ case 72:
+ _globals._sequenceIndexes[1] = _scene->_sequences.startCycle(_globals._spriteIndexes[1], false, -2);
+ _scene->_sequences.setDepth(_globals._sequenceIndexes[1], 1);
+ _game._player._stepEnabled = true;
+ break;
+
+ default:
+ break;
+ }
+}
+
+void Scene513::actions() {
+ if (_action.isAction(VERB_GET_INTO, NOUN_CAR)) {
+ switch (_game._trigger) {
+ case 0:
+ _game._player._stepEnabled = false;
+ _scene->_sequences.remove(_globals._sequenceIndexes[1]);
+ _globals._sequenceIndexes[1] = _scene->_sequences.startReverseCycle(_globals._spriteIndexes[1], false, 6, 1, 0, 0);
+ _scene->_sequences.setDepth(_globals._sequenceIndexes[1], 1);
+ _scene->_sequences.addSubEntry(_globals._sequenceIndexes[1], SEQUENCE_TRIGGER_EXPIRE, 0, 1);
+ break;
+
+ case 1: {
+ int syncIdx = _globals._sequenceIndexes[1];
+ _globals._sequenceIndexes[1] = _scene->_sequences.startCycle(_globals._spriteIndexes[1], false, -1);
+ _scene->_sequences.setDepth(_globals._sequenceIndexes[1], 1);
+ _scene->_sequences.updateTimeout(_globals._sequenceIndexes[1], syncIdx);
+ _scene->_sequences.addTimer(6, 2);
+ }
+ break;
+
+ case 2:
+ _game._player._visible = false;
+ _globals._sequenceIndexes[3] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[3], false, 10, 1, 0, 0);
+ _scene->_sequences.setMsgLayout(_globals._sequenceIndexes[3]);
+ _scene->_sequences.addSubEntry(_globals._sequenceIndexes[3], SEQUENCE_TRIGGER_EXPIRE, 0, 3);
+ break;
+
+ case 3: {
+ int syncIdx = _globals._sequenceIndexes[3];
+ _globals._sequenceIndexes[3] = _scene->_sequences.startCycle(_globals._spriteIndexes[3], false, -2);
+ _scene->_sequences.setMsgLayout(_globals._sequenceIndexes[3]);
+ _scene->_sequences.updateTimeout(_globals._sequenceIndexes[3], syncIdx);
+ _scene->_nextSceneId = 504;
+ }
+ break;
+
+ default:
+ break;
+ }
+ } else if (_action.isAction(VERB_PUT, NOUN_ID_CARD, NOUN_CARD_SLOT) || _action.isAction(VERB_PUT, NOUN_FAKE_ID, NOUN_CARD_SLOT)) {
+ switch (_game._trigger) {
+ case 0:
+ _game._player._stepEnabled = false;
+ _game._player._visible = false;
+ _globals._sequenceIndexes[4] = _scene->_sequences.startReverseCycle(_globals._spriteIndexes[4], false, 7, 1, 0, 0);
+ _scene->_sequences.setAnimRange(_globals._sequenceIndexes[4], 1, 2);
+ _scene->_sequences.setMsgLayout(_globals._sequenceIndexes[4]);
+ _scene->_sequences.addSubEntry(_globals._sequenceIndexes[4], SEQUENCE_TRIGGER_EXPIRE, 0, 1);
+ break;
+
+ case 1:
+ _scene->_sequences.updateTimeout(-1, _globals._sequenceIndexes[4]);
+ _game._player._visible = true;
+ _scene->_sequences.remove(_globals._sequenceIndexes[2]);
+ _globals._sequenceIndexes[2] = _scene->_sequences.startReverseCycle(_globals._spriteIndexes[2], false, 7, 1, 0, 0);
+ _scene->_sequences.setDepth(_globals._sequenceIndexes[2], 2);
+ _vm->_sound->command(24);
+ _scene->_kernelMessages.reset();
+ _scene->_kernelMessages.add(Common::Point(0, 0), 0x1110, 34, 0, 120, _game.getQuote(0x278));
+ _scene->_sequences.addSubEntry(_globals._sequenceIndexes[2], SEQUENCE_TRIGGER_EXPIRE, 0, 2);
+ break;
+
+ case 2:
+ _game._player.walk(Common::Point(296, 147), FACING_WEST);
+ _scene->_sequences.addTimer(120, 3);
+ break;
+
+ case 3:
+ _globals._sequenceIndexes[2] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[2], false, 7, 1, 0, 0);
+ _scene->_sequences.setDepth(_globals._sequenceIndexes[2], 2);
+ _vm->_sound->command(25);
+ _scene->_sequences.addSubEntry(_globals._sequenceIndexes[2], SEQUENCE_TRIGGER_EXPIRE, 0, 4);
+ break;
+
+ case 4:
+ _globals._sequenceIndexes[2] = _scene->_sequences.startCycle(_globals._spriteIndexes[2], false, -2);
+ _scene->_sequences.setDepth(_globals._sequenceIndexes[2], 2);
+ _game._player._stepEnabled = true;
+ if (_globals[kCityFlooded])
+ _scene->_nextSceneId = 701;
+ else
+ _scene->_nextSceneId = 751;
+
+ break;
+
+ default:
+ break;
+ }
+ } else if ((_action._lookFlag) || _action.isAction(VERB_LOOK, NOUN_STREET))
+ _vm->_dialogs->show(51318);
+ else if (_action.isAction(VERB_LOOK, NOUN_ELEVATOR))
+ _vm->_dialogs->show(51310);
+ else if (_action.isAction(VERB_LOOK, NOUN_ELEVATOR_DOOR))
+ _vm->_dialogs->show(51311);
+ else if (_action.isAction(VERB_LOOK, NOUN_CARD_SLOT))
+ _vm->_dialogs->show(51312);
+ else if (_action.isAction(VERB_LOOK, NOUN_HANDICAP_SIGN))
+ _vm->_dialogs->show(51313);
+ else if (_action.isAction(VERB_LOOK, NOUN_BIKE_RACK))
+ _vm->_dialogs->show(51314);
+ else if (_action.isAction(VERB_LOOK, NOUN_BUILDING))
+ _vm->_dialogs->show(51315);
+ else if (_action.isAction(VERB_LOOK, NOUN_SIGN))
+ _vm->_dialogs->show(51316);
+ else if (_action.isAction(VERB_LOOK, NOUN_STREET_TO_WEST) || _action.isAction(VERB_WALK_DOWN, NOUN_STREET_TO_WEST))
+ _vm->_dialogs->show(51317);
+ else if (_action.isAction(VERB_OPEN, NOUN_ELEVATOR_DOOR) || _action.isAction(VERB_OPEN, NOUN_ELEVATOR))
+ _vm->_dialogs->show(51319);
+ else if (_action.isAction(VERB_LOOK, NOUN_CAR))
+ _vm->_dialogs->show(51321);
+ else if (_action.isAction(VERB_LOOK, NOUN_BRICK_WALL))
+ _vm->_dialogs->show(51322);
+ else if (_action.isAction(VERB_PUT, NOUN_SECURITY_CARD, NOUN_CARD_SLOT))
+ _vm->_dialogs->show(51320);
+ else
+ return;
+
+ _action._inProgress = false;
+}
+
+/*------------------------------------------------------------------------*/
+
+void Scene515::setup() {
+ _game._player._spritesPrefix = "";
+ setAAName();
+}
+
+void Scene515::enter() {
+ _game._player._visible = false;
+ _game._player._stepEnabled = false;
+ _scene->_sequences.addTimer(30, 70);
+
+ sceneEntrySound();
+}
+
+void Scene515::step() {
+ if (_game._trigger == 70)
+ _scene->loadAnimation(formAnimName('A', -1), 71);
+ else if (_game._trigger == 71)
+ _scene->_nextSceneId = 508;
+}
+
+/*------------------------------------------------------------------------*/
+
+void Scene551::setup() {
+ setPlayerSpritesPrefix();
+ setAAName();
+}
+
+void Scene551::enter() {
+ if (_globals[kSexOfRex] == REX_MALE)
+ _globals._spriteIndexes[2] = _scene->_sprites.addSprites(formAnimName('a', 0));
+ else
+ _globals._spriteIndexes[3] = _scene->_sprites.addSprites(formAnimName('a', 1));
+
+ if (_scene->_priorSceneId == 501)
+ _game._player._playerPos = Common::Point(18, 130);
+ else if (_scene->_priorSceneId != -2) {
+ _game._player._playerPos = Common::Point(124, 119);
+ _game._player._facing = FACING_NORTH;
+ }
+
+ if (_globals[kTeleporterCommand]) {
+ _game._player._visible = false;
+ _game._player._stepEnabled = false;
+
+ char sepChar;
+ if (_globals[kSexOfRex] == REX_MALE)
+ sepChar = 'e';
+ else
+ sepChar = 'u';
+
+ int suffixNum;
+ int trigger;
+
+ switch (_globals[kTeleporterCommand]) {
+ case 1:
+ suffixNum = 3;
+ trigger = 75;
+ _globals[kTeleporterUnderstood] = true;
+ break;
+
+ case 2:
+ suffixNum = 1;
+ trigger = 80;
+ break;
+
+ case 4:
+ suffixNum = 2;
+ trigger = 90;
+ break;
+
+ default:
+ trigger = 0;
+ suffixNum = 0;
+ }
+
+ _globals[kTeleporterCommand] = 0;
+
+ if (suffixNum > 0)
+ _scene->loadAnimation(formAnimName(sepChar, suffixNum), trigger);
+ else {
+ _game._player._visible = true;
+ _game._player._stepEnabled = true;
+ }
+ }
+
+ sceneEntrySound();
+}
+
+void Scene551::step() {
+ switch (_game._trigger) {
+ case 75:
+ _game._player._stepEnabled = true;
+ _game._player._visible = true;
+ _game._player._priorTimer = _scene->_frameStartTime - _game._player._ticksAmount;
+ break;
+
+ case 80:
+ _globals[kTeleporterCommand] = 1;
+ _scene->_nextSceneId = _globals[kTeleporterDestination];
+ _scene->_reloadSceneFlag = true;
+ break;
+
+ case 90:
+ if (_globals[kSexOfRex] == REX_MALE) {
+ _globals._sequenceIndexes[2] = _scene->_sequences.startCycle(_globals._spriteIndexes[2], false, -2);
+ _scene->_sequences.setDepth(_globals._sequenceIndexes[2], 8);
+ } else {
+ _globals._sequenceIndexes[3] = _scene->_sequences.startCycle(_globals._spriteIndexes[3], false, -2);
+ _scene->_sequences.setDepth(_globals._sequenceIndexes[3], 8);
+ }
+ _vm->_sound->command(28);
+ _scene->_sequences.addTimer(60, 91);
+ break;
+
+ case 91:
+ _scene->_reloadSceneFlag = true;
+ break;
+
+ default:
+ break;
+ }
+}
+
+void Scene551::preActions() {
+ if (_action.isAction(VERB_WALK_DOWN) && (_action.isObject(NOUN_STREET_TO_WEST) || _action.isObject(NOUN_SIDEWALK_TO_WEST)))
+ _game._player._walkOffScreenSceneId = 501;
+}
+
+void Scene551::actions() {
+ if (_action.isAction(VERB_STEP_INTO, NOUN_TELEPORTER))
+ _scene->_nextSceneId = 502;
+ else if ((_action._lookFlag))
+ _vm->_dialogs->show(55117);
+ else if (_action.isAction(VERB_LOOK, NOUN_SKELETON))
+ _vm->_dialogs->show(55110);
+ else if (_action.isAction(VERB_LOOK, NOUN_ELEVATOR_SHAFT))
+ _vm->_dialogs->show(55111);
+ else if (_action.isAction(VERB_WALKTO, NOUN_ELEVATOR_SHAFT))
+ _vm->_dialogs->show(55112);
+ else if (_action.isAction(VERB_LOOK, NOUN_BUILDING))
+ _vm->_dialogs->show(55113);
+ else if (_action.isAction(VERB_LOOK, NOUN_TELEPORTER))
+ _vm->_dialogs->show(55114);
+ else if (_action.isAction(VERB_LOOK, NOUN_BUILDING))
+ _vm->_dialogs->show(55115);
+ else if (_action.isAction(VERB_LOOK, NOUN_SIDEWALK_TO_WEST)) {
+ if (_game._visitedScenes.exists(505))
+ _vm->_dialogs->show(55116);
+ else
+ _vm->_dialogs->show(55115);
+ } else if (_action.isAction(VERB_LOOK, NOUN_SIDEWALK))
+ _vm->_dialogs->show(55118);
+ else if (_action.isAction(VERB_LOOK, NOUN_EQUIPMENT_OVERHEAD))
+ _vm->_dialogs->show(55119);
+ else if (_action.isAction(VERB_LOOK, NOUN_RAILING))
+ _vm->_dialogs->show(55120);
+ else
+ return;
+
+ _action._inProgress = false;
+}
+
+/*------------------------------------------------------------------------*/
+
+} // End of namespace Nebular
+} // End of namespace MADS
diff --git a/engines/mads/nebular/nebular_scenes5.h b/engines/mads/nebular/nebular_scenes5.h
new file mode 100644
index 0000000000..2face26508
--- /dev/null
+++ b/engines/mads/nebular/nebular_scenes5.h
@@ -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.
+ *
+ */
+
+#ifndef MADS_NEBULAR_SCENES5_H
+#define MADS_NEBULAR_SCENES5_H
+
+#include "common/scummsys.h"
+#include "mads/game.h"
+#include "mads/scene.h"
+#include "mads/nebular/nebular_scenes.h"
+
+namespace MADS {
+
+namespace Nebular {
+
+class Scene5xx : public NebularScene {
+protected:
+ /**
+ * Plays an appropriate sound when entering a scene
+ */
+ void setAAName();
+
+ /**
+ * Updates the prefix used for getting player sprites for the scene
+ */
+ void setPlayerSpritesPrefix();
+
+ void sceneEntrySound();
+
+public:
+ Scene5xx(MADSEngine *vm) : NebularScene(vm) {}
+};
+
+class Scene501 : public Scene5xx{
+private:
+ int _mainSequenceId;
+ int _mainSpriteId;
+ int _doorHotspotid;
+ bool _rexPunched;
+
+ void handleSlotActions();
+
+public:
+ Scene501(MADSEngine *vm);
+ void synchronize(Common::Serializer &s);
+
+ virtual void setup();
+ virtual void enter();
+ virtual void step();
+ virtual void preActions();
+ virtual void actions();
+};
+
+class Scene502 : public SceneTeleporter {
+public:
+ Scene502(MADSEngine *vm) : SceneTeleporter(vm) {}
+
+ virtual void setup();
+ virtual void enter();
+ virtual void step();
+ virtual void actions();
+};
+
+class Scene503 : public Scene5xx{
+private:
+ int _detonatorHotspotId;
+
+public:
+ Scene503(MADSEngine *vm);
+ void synchronize(Common::Serializer &s);
+
+ virtual void setup();
+ virtual void enter();
+ virtual void actions();
+};
+
+class Scene504 : public Scene5xx{
+private:
+ int _carAnimationMode;
+ int _carFrame;
+
+public:
+ Scene504(MADSEngine *vm);
+ void synchronize(Common::Serializer &s);
+
+ virtual void setup();
+ virtual void enter();
+ virtual void step();
+ virtual void preActions();
+ virtual void actions();
+};
+
+class Scene505 : public Scene5xx{
+private:
+ int _frame;
+ int _nextButtonId;
+ int _homeSelectedId;
+ int _selectedId;
+ int _activeCars;
+
+ int _carLocations[9];
+
+public:
+ Scene505(MADSEngine *vm);
+ void synchronize(Common::Serializer &s);
+
+ virtual void setup();
+ virtual void enter();
+ virtual void step();
+ virtual void actions();
+};
+
+class Scene506 : public Scene5xx{
+private:
+ Common::Point _doorPos;
+ Facing _heroFacing;
+
+ int _doorDepth;
+ int _doorSpriteIdx;
+ int _doorSequenceIdx;
+ int _doorWord;
+
+ bool _labDoorFl;
+ bool _firstDoorFl;
+ bool _actionFl;
+
+ void handleDoorSequences();
+
+public:
+ Scene506(MADSEngine *vm);
+ void synchronize(Common::Serializer &s);
+
+ virtual void setup();
+ virtual void enter();
+ virtual void step();
+ virtual void actions();
+};
+
+class Scene507 : public Scene5xx{
+private:
+ int _penlightHotspotId;
+
+public:
+ Scene507(MADSEngine *vm);
+ void synchronize(Common::Serializer &s);
+
+ virtual void setup();
+ virtual void enter();
+ virtual void actions();
+};
+
+class Scene508 : public Scene5xx{
+private:
+ int _chosenObject;
+
+ void handlePedestral();
+
+public:
+ Scene508(MADSEngine *vm);
+ void synchronize(Common::Serializer &s);
+
+ virtual void setup();
+ virtual void enter();
+ virtual void preActions();
+ virtual void actions();
+};
+
+class Scene511 : public Scene5xx{
+private:
+ bool _handingLine;
+ bool _lineMoving;
+
+ int _lineAnimationMode;
+ int _lineFrame;
+ int _lineAnimationPosition;
+
+public:
+ Scene511(MADSEngine *vm);
+ void synchronize(Common::Serializer &s);
+
+ virtual void setup();
+ virtual void enter();
+ virtual void step();
+ virtual void preActions();
+ virtual void actions();
+};
+
+class Scene512 : public Scene5xx{
+private:
+ int _fishingRodHotspotId;
+ int _keyHotspotId;
+
+public:
+ Scene512(MADSEngine *vm);
+ void synchronize(Common::Serializer &s);
+
+ virtual void setup();
+ virtual void enter();
+ virtual void actions();
+};
+
+class Scene513 : public Scene5xx{
+public:
+ Scene513(MADSEngine *vm) : Scene5xx(vm) {}
+
+ virtual void setup();
+ virtual void enter();
+ virtual void step();
+ virtual void actions();
+};
+
+class Scene515 : public Scene5xx{
+public:
+ Scene515(MADSEngine *vm) : Scene5xx(vm) {}
+
+ virtual void setup();
+ virtual void enter();
+ virtual void step();
+ virtual void actions() {};
+};
+
+class Scene551 : public Scene5xx{
+public:
+ Scene551(MADSEngine *vm) : Scene5xx(vm) {}
+
+ virtual void setup();
+ virtual void enter();
+ virtual void step();
+ virtual void preActions();
+ virtual void actions();
+};
+} // End of namespace Nebular
+} // End of namespace MADS
+
+#endif /* MADS_NEBULAR_SCENES5_H */
diff --git a/engines/mads/nebular/nebular_scenes6.cpp b/engines/mads/nebular/nebular_scenes6.cpp
new file mode 100644
index 0000000000..d33675c578
--- /dev/null
+++ b/engines/mads/nebular/nebular_scenes6.cpp
@@ -0,0 +1,4742 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+
+ * You should have received a copy of the GNU General Public 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 "mads/mads.h"
+#include "mads/scene.h"
+#include "mads/nebular/nebular_scenes.h"
+#include "mads/nebular/nebular_scenes6.h"
+
+namespace MADS {
+
+namespace Nebular {
+
+void Scene6xx::setAAName() {
+ _game._aaName = Resources::formatAAName(5);
+}
+
+void Scene6xx::setPlayerSpritesPrefix() {
+ _vm->_sound->command(5);
+ Common::String oldName = _game._player._spritesPrefix;
+
+ if ((_scene->_nextSceneId == 605) || (_scene->_nextSceneId == 620))
+ _game._player._spritesPrefix = "";
+ else if (_globals[kSexOfRex] == REX_MALE)
+ _game._player._spritesPrefix = "RXM";
+ else
+ _game._player._spritesPrefix = "ROX";
+
+ if (oldName != _game._player._spritesPrefix)
+ _game._player._spritesChanged = true;
+
+ _game._player._scalingVelocity = true;
+ _vm->_palette->setEntry(16, 10, 63, 63);
+ _vm->_palette->setEntry(17, 10, 45, 45);
+}
+
+void Scene6xx::sceneEntrySound() {
+ if (!_vm->_musicFlag) {
+ _vm->_sound->command(2);
+ return;
+ }
+
+ switch (_scene->_nextSceneId) {
+ case 601:
+ case 602:
+ case 603:
+ case 604:
+ case 605:
+ case 607:
+ case 608:
+ case 609:
+ case 610:
+ case 612:
+ case 620:
+ _vm->_sound->command(29);
+ break;
+ case 611:
+ _vm->_sound->command(24);
+ break;
+ default:
+ break;
+ }
+}
+
+/*------------------------------------------------------------------------*/
+
+void Scene601::setup() {
+ setPlayerSpritesPrefix();
+ setAAName();
+ _scene->addActiveVocab(NOUN_LASER_BEAM);
+ _scene->addActiveVocab(VERB_LOOK_AT);
+}
+
+void Scene601::enter() {
+ _globals._spriteIndexes[1] = _scene->_sprites.addSprites(formAnimName('x', 0));
+ _globals._spriteIndexes[2] = _scene->_sprites.addSprites(formAnimName('c', 0));
+ _globals._spriteIndexes[3] = _scene->_sprites.addSprites("*RXCD_4");
+
+ if (_globals[kLaserHoleIsThere]) {
+ _globals._sequenceIndexes[1] = _scene->_sequences.startCycle(_globals._spriteIndexes[1], false, -2);
+ _scene->_dynamicHotspots.add(NOUN_LASER_BEAM, VERB_LOOK_AT, _globals._sequenceIndexes[1], Common::Rect(0, 0, 0, 0));
+ }
+
+ _globals._sequenceIndexes[2] = _scene->_sequences.startCycle(_globals._spriteIndexes[2], false, -1);
+ _scene->_sequences.setDepth(_globals._sequenceIndexes[2], 3);
+
+ if (_scene->_priorSceneId == 504) {
+ _game._player._playerPos = Common::Point(73, 148);
+ _game._player._facing = FACING_WEST;
+ _game._player._visible = false;
+ _game._player._stepEnabled = false;
+ _scene->_sequences.remove(_globals._sequenceIndexes[2]);
+ _globals._sequenceIndexes[2] = _scene->_sequences.startCycle(_globals._spriteIndexes[2], false, -2);
+ _scene->_sequences.setDepth(_globals._sequenceIndexes[2], 3);
+ _scene->loadAnimation(formAnimName('R', 1), 70);
+ } else if (_scene->_priorSceneId != -2) {
+ _game._player._playerPos = Common::Point(229, 129);
+ _game._player._facing = FACING_SOUTHWEST;
+ }
+
+ sceneEntrySound();
+}
+
+void Scene601::step() {
+ switch (_game._trigger) {
+ case 70:
+ _game._player._visible = true;
+ _game._player._priorTimer = _scene->_activeAnimation->getNextFrameTimer() - _game._player._ticksAmount;
+ _scene->_sequences.addTimer(30, 71);
+ break;
+
+ case 71:
+ _scene->_sequences.remove(_globals._sequenceIndexes[2]);
+ _globals._sequenceIndexes[2] = _scene->_sequences.startReverseCycle(_globals._spriteIndexes[2], false, 6, 1, 0, 0);
+ _scene->_sequences.setDepth(_globals._sequenceIndexes[2], 3);
+ _scene->_sequences.addSubEntry(_globals._sequenceIndexes[2], SEQUENCE_TRIGGER_EXPIRE, 0, 72);
+ break;
+
+ case 72:
+ _globals._sequenceIndexes[2] = _scene->_sequences.startCycle(_globals._spriteIndexes[2], false, -1);
+ _scene->_sequences.setDepth(_globals._sequenceIndexes[2], 3);
+ _game._player._stepEnabled = true;
+ break;
+
+ default:
+ break;
+ }
+}
+
+void Scene601::actions() {
+ if (_action.isAction(VERB_WALK_THROUGH, NOUN_ENTRANCE))
+ _scene->_nextSceneId = 602;
+ else if (_action.isAction(VERB_GET_INSIDE, NOUN_CAR)) {
+ switch (_game._trigger) {
+ case 0:
+ _game._player._stepEnabled = false;
+ _scene->_sequences.remove(_globals._sequenceIndexes[2]);
+ _globals._sequenceIndexes[2] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[2], false, 6, 1, 0, 0);
+ _scene->_sequences.setDepth(_globals._sequenceIndexes[2], 3);
+ _scene->_sequences.addSubEntry(_globals._sequenceIndexes[2], SEQUENCE_TRIGGER_EXPIRE, 0, 1);
+ break;
+
+ case 1: {
+ int syncIdx = _globals._sequenceIndexes[2];
+ _globals._sequenceIndexes[2] = _scene->_sequences.startCycle(_globals._spriteIndexes[2], false, -2);
+ _scene->_sequences.updateTimeout(_globals._sequenceIndexes[2], syncIdx);
+ _scene->_sequences.addTimer(6, 2);
+ }
+ break;
+
+ case 2:
+ _game._player._visible = false;
+ _globals._sequenceIndexes[3] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[3], false, 10, 1, 0, 0);
+ _scene->_sequences.setMsgLayout(_globals._sequenceIndexes[3]);
+ _scene->_sequences.addSubEntry(_globals._sequenceIndexes[3], SEQUENCE_TRIGGER_EXPIRE, 0, 3);
+ break;
+
+ case 3: {
+ int syncIdx = _globals._sequenceIndexes[3];
+ _globals._sequenceIndexes[3] = _scene->_sequences.startCycle(_globals._spriteIndexes[3], false, -2);
+ _scene->_sequences.setMsgLayout(_globals._sequenceIndexes[3]);
+ _scene->_sequences.updateTimeout(_globals._sequenceIndexes[3], syncIdx);
+ _scene->_nextSceneId = 504;
+ }
+ break;
+
+ default:
+ break;
+ }
+ } else if (_action._lookFlag || _action.isAction(VERB_LOOK, NOUN_STREET)) {
+ if (!_globals[kLaserHoleIsThere])
+ _vm->_dialogs->show(60110);
+ else
+ _vm->_dialogs->show(60111);
+ } else if (_action.isAction(VERB_LOOK, NOUN_CAR))
+ _vm->_dialogs->show(60112);
+ else if (_action.isAction(VERB_LOOK, NOUN_PAPERS))
+ _vm->_dialogs->show(60113);
+ else if (_action.isAction(VERB_LOOK, NOUN_BUILDING))
+ _vm->_dialogs->show(60114);
+ else if (_action.isAction(VERB_WALK_DOWN, NOUN_STREET))
+ _vm->_dialogs->show(60115);
+ else if (_action.isAction(VERB_LOOK, NOUN_BALCONY))
+ _vm->_dialogs->show(60116);
+ else if (_action.isAction(VERB_LOOK, NOUN_ENTRANCE))
+ _vm->_dialogs->show(60117);
+ else if (_action.isAction(VERB_LOOK, NOUN_WALL))
+ _vm->_dialogs->show(60118);
+ else if (_action.isAction(VERB_LOOK, NOUN_CITY))
+ _vm->_dialogs->show(60119);
+ else if (_action.isAction(VERB_LOOK, NOUN_FOUNTAIN))
+ _vm->_dialogs->show(60120);
+ else
+ return;
+
+ _action._inProgress = false;
+}
+
+/*------------------------------------------------------------------------*/
+
+Scene602::Scene602(MADSEngine *vm) : Scene6xx(vm) {
+ _lastSpriteIdx = -1;
+ _lastSequenceIdx = -1;
+ _cycleIndex = -1;
+ _safeMode = -1;
+}
+
+void Scene602::synchronize(Common::Serializer &s) {
+ Scene6xx::synchronize(s);
+
+ s.syncAsSint16LE(_lastSpriteIdx);
+ s.syncAsSint16LE(_lastSequenceIdx);
+ s.syncAsSint16LE(_cycleIndex);
+ s.syncAsSint16LE(_safeMode);
+}
+
+void Scene602::setup() {
+ setPlayerSpritesPrefix();
+ setAAName();
+ _scene->addActiveVocab(VERB_WALKTO);
+ _scene->addActiveVocab(NOUN_SAFE);
+ _scene->addActiveVocab(NOUN_LASER_BEAM);
+}
+
+void Scene602::enter() {
+ _globals._spriteIndexes[1] = _scene->_sprites.addSprites(formAnimName('h', -1));
+ _globals._spriteIndexes[2] = _scene->_sprites.addSprites(formAnimName('x', 0));
+ _globals._spriteIndexes[3] = _scene->_sprites.addSprites(formAnimName('x', 1));
+ _globals._spriteIndexes[4] = _scene->_sprites.addSprites(formAnimName('l', 0));
+ _globals._spriteIndexes[5] = _scene->_sprites.addSprites("*RXMRC_9");
+
+ if (!_game._visitedScenes._sceneRevisited)
+ _globals[kSafeStatus] = 0;
+
+ if (_globals[kLaserHoleIsThere]) {
+ _globals._sequenceIndexes[1] = _scene->_sequences.startCycle(_globals._spriteIndexes[1], false, 1);
+ _scene->_sequences.setDepth(_globals._sequenceIndexes[1], 9);
+ _globals._sequenceIndexes[4] = _scene->_sequences.startCycle(_globals._spriteIndexes[4], false, 1);
+ _scene->_sequences.setDepth(_globals._sequenceIndexes[4], 9);
+ int idx = _scene->_dynamicHotspots.add(NOUN_LASER_BEAM, VERB_WALKTO, _globals._sequenceIndexes[4], Common::Rect(0, 0, 0, 0));
+ _scene->_dynamicHotspots.setPosition(idx, Common::Point(80, 134), FACING_NORTHEAST);
+ _scene->changeVariant(1);
+ } else
+ _scene->_hotspots.activate(NOUN_HOLE, false);
+
+ if (_globals[kSafeStatus] == 0) {
+ _lastSpriteIdx = _globals._spriteIndexes[2];
+ _cycleIndex = -1;
+ } else if (_globals[kSafeStatus] == 1) {
+ _lastSpriteIdx = _globals._spriteIndexes[2];
+ _cycleIndex = -2;
+ } else if (_globals[kSafeStatus] == 3) {
+ _lastSpriteIdx = _globals._spriteIndexes[3];
+ _cycleIndex = -2;
+ } else {
+ _lastSpriteIdx = _globals._spriteIndexes[3];
+ _cycleIndex = -1;
+ }
+
+ _lastSequenceIdx = _scene->_sequences.startCycle(_lastSpriteIdx, false, _cycleIndex);
+ _scene->_sequences.setDepth(_lastSequenceIdx, 14);
+ int idx = _scene->_dynamicHotspots.add(NOUN_SAFE, VERB_WALKTO, _lastSequenceIdx, Common::Rect(0, 0, 0, 0));
+ _scene->_dynamicHotspots.setPosition(idx, Common::Point(185, 113), FACING_NORTHWEST);
+
+ if (_game._objects.isInRoom(OBJ_DOOR_KEY)) {
+ _globals._spriteIndexes[6] = _scene->_sprites.addSprites(formAnimName('k', -1));
+ _globals._sequenceIndexes[6] = _scene->_sequences.startCycle(_globals._spriteIndexes[6], false, -1);
+ _scene->_sequences.setDepth(_globals._sequenceIndexes[6], 15);
+ if (_globals[kSafeStatus] == 0 || _globals[kSafeStatus] == 2)
+ _scene->_hotspots.activate(NOUN_DOOR_KEY, false);
+ } else
+ _scene->_hotspots.activate(NOUN_DOOR_KEY, false);
+
+ if (_scene->_priorSceneId == 603) {
+ _game._player._playerPos = Common::Point(228, 126);
+ _game._player._facing = FACING_WEST;
+ } else if (_scene->_priorSceneId != -2) {
+ _game._player._playerPos = Common::Point(50, 127);
+ _game._player._facing = FACING_EAST;
+ }
+
+ sceneEntrySound();
+ _game.loadQuoteSet(0x2F1, 0x2F2, 0x2F3, 0);
+
+ if (_scene->_roomChanged) {
+ _game._objects.addToInventory(OBJ_NOTE);
+ _game._objects.addToInventory(OBJ_REARVIEW_MIRROR);
+ _game._objects.addToInventory(OBJ_COMPACT_CASE);
+ }
+}
+
+void Scene602::handleSafeActions() {
+ switch (_game._trigger) {
+ case 0:
+ _game._player._stepEnabled = false;
+ _game._player._visible = false;
+ _globals._sequenceIndexes[5] = _scene->_sequences.startReverseCycle(_globals._spriteIndexes[5], true, 12, 1, 0, 0);
+ _scene->_sequences.setAnimRange(_globals._sequenceIndexes[5], 1, 3);
+ _scene->_sequences.setMsgLayout(_globals._sequenceIndexes[5]);
+ _scene->_sequences.addSubEntry(_globals._sequenceIndexes[5], SEQUENCE_TRIGGER_SPRITE, 3, 1);
+ _scene->_sequences.addSubEntry(_globals._sequenceIndexes[5], SEQUENCE_TRIGGER_EXPIRE, 0, 3);
+ break;
+
+ case 1:
+ if (_safeMode == 1 || _safeMode == 3) {
+ if (_globals[kSafeStatus] == 0 && _safeMode == 1) {
+ _scene->_kernelMessages.reset();
+ _scene->_kernelMessages.add(Common::Point(0, 0), 0x1110, 34, 0, 120, _game.getQuote(0x2F1));
+ _scene->_sequences.addTimer(120, 4);
+ } else {
+ _scene->_sequences.remove(_lastSequenceIdx);
+ if (_safeMode == 3)
+ _lastSpriteIdx = _globals._spriteIndexes[2];
+ else
+ _lastSpriteIdx = _globals._spriteIndexes[3];
+
+ _lastSequenceIdx = _scene->_sequences.addSpriteCycle(_lastSpriteIdx, false, 12, 1, 0, 0);
+ _scene->_sequences.setDepth(_lastSequenceIdx, 14);
+ if (_game._objects[OBJ_DOOR_KEY]._roomNumber == _scene->_currentSceneId)
+ _scene->_hotspots.activate(NOUN_DOOR_KEY, true);
+
+ _scene->_sequences.addSubEntry(_lastSequenceIdx,
+ SEQUENCE_TRIGGER_EXPIRE, 0, 2);
+ }
+ } else {
+ _scene->_sequences.remove(_lastSequenceIdx);
+ if (_globals[kSafeStatus] == 1)
+ _lastSpriteIdx = _globals._spriteIndexes[2];
+ else
+ _lastSpriteIdx = _globals._spriteIndexes[3];
+
+ _lastSequenceIdx = _scene->_sequences.startReverseCycle(_lastSpriteIdx, false, 12, 1, 0, 0);
+ _scene->_sequences.setDepth(_lastSequenceIdx, 14);
+ if (_game._objects[OBJ_DOOR_KEY]._roomNumber == _scene->_currentSceneId)
+ _scene->_hotspots.activate(NOUN_DOOR_KEY, false);
+
+ _scene->_sequences.addSubEntry(_lastSequenceIdx, SEQUENCE_TRIGGER_EXPIRE, 0, 2);
+ }
+ break;
+
+ case 2: {
+ int synxIdx = _lastSequenceIdx;
+ _lastSequenceIdx = _scene->_sequences.startCycle(_lastSpriteIdx, false, _cycleIndex);
+ _scene->_sequences.setDepth(_lastSequenceIdx, 14);
+ _scene->_sequences.updateTimeout(_lastSequenceIdx, synxIdx);
+ int idx = _scene->_dynamicHotspots.add(NOUN_SAFE, VERB_WALKTO, _lastSequenceIdx, Common::Rect(0, 0, 0, 0));
+ _scene->_dynamicHotspots.setPosition(idx, Common::Point(185, 113), FACING_NORTHWEST);
+ if (_safeMode == 3) {
+ _scene->_kernelMessages.reset();
+ _scene->_kernelMessages.add(Common::Point(0, 0), 0x1110, 34, 0, 120, _game.getQuote(0x2F3));
+ _scene->_sequences.addTimer(120, 4);
+ } else
+ _scene->_sequences.addTimer(60, 4);
+ break;
+ }
+
+ case 3:
+ _scene->_sequences.updateTimeout(-1, _globals._sequenceIndexes[5]);
+ _game._player._visible = true;
+ break;
+
+ case 4:
+ if (_safeMode == 1) {
+ if (_globals[kSafeStatus] == 2)
+ _globals[kSafeStatus] = 3;
+ } else if (_safeMode == 2) {
+ if (_globals[kSafeStatus] == 3)
+ _globals[kSafeStatus] = 2;
+ else
+ _globals[kSafeStatus] = 0;
+ } else
+ _globals[kSafeStatus] = 1;
+
+ _game._player._stepEnabled = true;
+ break;
+
+ default:
+ break;
+ }
+}
+
+void Scene602::actions() {
+ if (_action.isAction(VERB_WALK_THROUGH, NOUN_HALLWAY))
+ _scene->_nextSceneId = 601;
+ else if (_action.isAction(VERB_WALK_THROUGH, NOUN_DOORWAY))
+ _scene->_nextSceneId = 603;
+ else if (_action.isAction(VERB_OPEN, NOUN_SAFE) && ((_globals[kSafeStatus] == 0) || (_globals[kSafeStatus] == 2))) {
+ _safeMode = 1;
+ _cycleIndex = -2;
+ handleSafeActions();
+ } else if (_action.isAction(VERB_CLOSE, NOUN_SAFE) && ((_globals[kSafeStatus] == 1) || (_globals[kSafeStatus] == 3))) {
+ _safeMode = 2;
+ _cycleIndex = -1;
+ handleSafeActions();
+ } else if (_action.isAction(VERB_UNLOCK, NOUN_COMBINATION, NOUN_SAFE)) {
+ if ((_globals[kSafeStatus] == 0) && (_game._difficulty != DIFFICULTY_HARD)) {
+ _safeMode = 3;
+ _cycleIndex = -2;
+ handleSafeActions();
+ }
+ } else if ((_action.isAction(VERB_PUT, NOUN_REARVIEW_MIRROR, NOUN_LASER_BEAM) || _action.isAction(VERB_PUT, NOUN_COMPACT_CASE, NOUN_LASER_BEAM)
+ || _action.isAction(VERB_REFLECT, NOUN_COMPACT_CASE, NOUN_LASER_BEAM) || _action.isAction(VERB_REFLECT, NOUN_REARVIEW_MIRROR, NOUN_LASER_BEAM)) && (_globals[kSafeStatus] == 0)) {
+ switch (_game._trigger) {
+ case 0:
+ _vm->_dialogs->show(60230);
+ _game._player._stepEnabled = false;
+ _game._player._visible = false;
+ _scene->_sequences.remove(_globals._sequenceIndexes[4]);
+ _scene->_sequences.remove(_lastSequenceIdx);
+ _scene->loadAnimation(formAnimName('L', 1), 1);
+ break;
+
+ case 1: {
+ _game._player._visible = true;
+ _game._player._priorTimer = _scene->_activeAnimation->getNextFrameTimer() - _game._player._ticksAmount;
+ _lastSpriteIdx = _globals._spriteIndexes[3];
+ _lastSequenceIdx = _scene->_sequences.startCycle(_lastSpriteIdx, false, -1);
+ _scene->_sequences.setDepth(_lastSequenceIdx, 14);
+ int idx = _scene->_dynamicHotspots.add(NOUN_SAFE, VERB_WALKTO, _lastSequenceIdx, Common::Rect(0, 0, 0, 0));
+ _scene->_dynamicHotspots.setPosition(idx, Common::Point(185, 113), FACING_NORTHWEST);
+ _globals._sequenceIndexes[4] = _scene->_sequences.startCycle(_globals._spriteIndexes[4], false, 1);
+ _scene->_sequences.setDepth(_globals._sequenceIndexes[4], 9);
+ idx = _scene->_dynamicHotspots.add(NOUN_LASER_BEAM, VERB_WALKTO, _globals._sequenceIndexes[4], Common::Rect(0, 0, 0, 0));
+ _scene->_dynamicHotspots.setPosition(idx, Common::Point(80, 134), FACING_NORTHEAST);
+ _scene->_sequences.addTimer(60, 2);
+ }
+ break;
+
+ case 2:
+ _scene->_kernelMessages.reset();
+ _scene->_kernelMessages.add(Common::Point(0, 0), 0x1110, 34, 0, 120, _game.getQuote(0x2F2));
+ _globals[kSafeStatus] = 2;
+ _game._player._stepEnabled = true;
+ break;
+
+ default:
+ break;
+ }
+ } else if (_action.isAction(VERB_TAKE, NOUN_DOOR_KEY) && (_game._trigger || _game._objects.isInRoom(OBJ_DOOR_KEY))) {
+ switch (_game._trigger) {
+ case 0:
+ _game._player._stepEnabled = false;
+ _game._player._visible = false;
+ _globals._sequenceIndexes[5] = _scene->_sequences.startReverseCycle(_globals._spriteIndexes[5], true, 8, 1, 0, 0);
+ _scene->_sequences.setAnimRange(_globals._sequenceIndexes[5], 1, 3);
+ _scene->_sequences.setMsgLayout(_globals._sequenceIndexes[5]);
+ _scene->_sequences.addSubEntry(_globals._sequenceIndexes[5], SEQUENCE_TRIGGER_SPRITE, 3, 1);
+ _scene->_sequences.addSubEntry(_globals._sequenceIndexes[5], SEQUENCE_TRIGGER_EXPIRE, 0, 2);
+ break;
+
+ case 1:
+ _scene->_sequences.remove(_globals._sequenceIndexes[6]);
+ _scene->_hotspots.activate(NOUN_DOOR_KEY, false);
+ _vm->_sound->command(9);
+ _game._objects.addToInventory(OBJ_DOOR_KEY);
+ break;
+
+ case 2:
+ _scene->_sequences.updateTimeout(-1, _globals._sequenceIndexes[5]);
+ _game._player._visible = true;
+ _game._player._stepEnabled = true;
+ _vm->_dialogs->showItem(OBJ_DOOR_KEY, 835);
+ break;
+
+ default:
+ break;
+ }
+ } else if (_action._lookFlag)
+ _vm->_dialogs->show(60210);
+ else if (_action.isAction(VERB_LOOK, NOUN_FLOOR))
+ _vm->_dialogs->show(60211);
+ else if (_action.isAction(VERB_LOOK, NOUN_HALLWAY))
+ _vm->_dialogs->show(60212);
+ else if (_action.isAction(VERB_LOOK, NOUN_TABLE))
+ _vm->_dialogs->show(60213);
+ else if (_action.isAction(VERB_LOOK, NOUN_CHAIR) || _action.isAction(VERB_LOOK, NOUN_LOUNGE_CHAIR))
+ _vm->_dialogs->show(60214);
+ else if (_action.isAction(VERB_LOOK, NOUN_NEON_LIGHTS))
+ _vm->_dialogs->show(60215);
+ else if (_action.isAction(VERB_LOOK, NOUN_FIREPLACE))
+ _vm->_dialogs->show(60216);
+ else if (_action.isAction(VERB_LOOK, NOUN_PICTURE))
+ _vm->_dialogs->show(60217);
+ else if (_action.isAction(VERB_LOOK, NOUN_LAMP))
+ _vm->_dialogs->show(60218);
+ else if (_action.isAction(VERB_LOOK, NOUN_MASKS))
+ _vm->_dialogs->show(60219);
+ else if (_action.isAction(VERB_LOOK, NOUN_GLASS_BLOCK_WALL))
+ _vm->_dialogs->show(60220);
+ else if (_action.isAction(VERB_LOOK, NOUN_DOORWAY))
+ _vm->_dialogs->show(60221);
+ else if (_action.isAction(VERB_LOOK, NOUN_SAFE)) {
+ if (_globals[kSafeStatus] == 0)
+ _vm->_dialogs->show(60222);
+ else if (_globals[kSafeStatus] == 1) {
+ if (!_game._objects.isInRoom(OBJ_DOOR_KEY))
+ _vm->_dialogs->show(60223);
+ else
+ _vm->_dialogs->show(60224);
+ } else if (_globals[kSafeStatus] == 2)
+ _vm->_dialogs->show(60234);
+ else if (_game._objects.isInRoom(OBJ_DOOR_KEY))
+ _vm->_dialogs->show(60235);
+ else
+ _vm->_dialogs->show(60236);
+ } else if (_action.isAction(VERB_UNLOCK, NOUN_DOOR_KEY, NOUN_SAFE) || _action.isAction(VERB_UNLOCK, NOUN_PADLOCK_KEY, NOUN_SAFE))
+ _vm->_dialogs->show(60225);
+ else if (_action.isAction(VERB_PULL, NOUN_SAFE))
+ _vm->_dialogs->show(60226);
+ else if (_action.isAction(VERB_PUT, NOUN_FIREPLACE) && _game._objects.isInInventory(_game._objects.getIdFromDesc(_action._activeAction._objectNameId)))
+ _vm->_dialogs->show(60227);
+ else if (_action.isAction(VERB_LOOK, NOUN_HOLE))
+ _vm->_dialogs->show(60228);
+ else if (_action.isAction(VERB_LOOK, NOUN_LASER_BEAM))
+ _vm->_dialogs->show(60229);
+ else if (_action.isAction(VERB_LOOK, NOUN_FLOWER_BOX))
+ _vm->_dialogs->show(60231);
+ else if (_action.isAction(VERB_THROW, NOUN_BOMB, NOUN_SAFE) || _action.isAction(VERB_THROW, NOUN_BOMBS, NOUN_SAFE))
+ _vm->_dialogs->show(60232);
+ else if (_action.isAction(VERB_PUT, NOUN_TIMEBOMB))
+ _vm->_dialogs->show(60233);
+ else
+ return;
+
+ _action._inProgress = false;
+}
+
+/*------------------------------------------------------------------------*/
+
+Scene603::Scene603(MADSEngine *vm) : Scene6xx(vm) {
+ _compactCaseHotspotId = -1;
+ _noteHotspotId = -1;
+}
+
+void Scene603::synchronize(Common::Serializer &s) {
+ Scene6xx::synchronize(s);
+
+ s.syncAsSint16LE(_compactCaseHotspotId);
+ s.syncAsSint16LE(_noteHotspotId);
+}
+
+void Scene603::setup() {
+ setPlayerSpritesPrefix();
+ setAAName();
+ _scene->addActiveVocab(VERB_WALKTO);
+ _scene->addActiveVocab(NOUN_COMPACT_CASE);
+ _scene->addActiveVocab(NOUN_NOTE);
+}
+
+void Scene603::enter() {
+ if (_game._objects[OBJ_COMPACT_CASE]._roomNumber == _scene->_currentSceneId) {
+ _globals._spriteIndexes[4] = _scene->_sprites.addSprites("*RXMRD_3");
+ _globals._spriteIndexes[1] = _scene->_sprites.addSprites(formAnimName('c', -1));
+ _globals._sequenceIndexes[1] = _scene->_sequences.startCycle(_globals._spriteIndexes[1], false, -1);
+ _scene->_sequences.setDepth(_globals._sequenceIndexes[1], 1);
+ _compactCaseHotspotId = _scene->_dynamicHotspots.add(NOUN_COMPACT_CASE, VERB_WALKTO, _globals._sequenceIndexes[1], Common::Rect(0, 0, 0, 0));
+ _scene->_dynamicHotspots.setPosition(_compactCaseHotspotId, Common::Point(250, 152), FACING_SOUTHEAST);
+ }
+
+ if ((_game._difficulty != DIFFICULTY_HARD) && (_game._objects[OBJ_NOTE]._roomNumber == _scene->_currentSceneId)) {
+ _globals._spriteIndexes[3] = _scene->_sprites.addSprites("*RXMRC_9");
+ _globals._spriteIndexes[2] = _scene->_sprites.addSprites(formAnimName('p', -1));
+ _globals._sequenceIndexes[2] = _scene->_sequences.startCycle(_globals._spriteIndexes[2], false, -1);
+ _scene->_sequences.setDepth(_globals._sequenceIndexes[2], 14);
+ _noteHotspotId = _scene->_dynamicHotspots.add(NOUN_NOTE, VERB_WALKTO, _globals._sequenceIndexes[2], Common::Rect(0, 0, 0, 0));
+ _scene->_dynamicHotspots.setPosition(_noteHotspotId, Common::Point(242, 118), FACING_NORTHEAST);
+ }
+
+ if (_scene->_priorSceneId != -2)
+ _game._player._playerPos = Common::Point(113, 134);
+
+ sceneEntrySound();
+}
+
+void Scene603::actions() {
+ if (_action.isAction(VERB_WALK_TOWARDS, NOUN_LIVINGROOM))
+ _scene->_nextSceneId = 602;
+ else if (_action.isAction(VERB_TAKE, NOUN_COMPACT_CASE)) {
+ if ( _game._trigger || !_game._objects.isInInventory(OBJ_COMPACT_CASE)) {
+ switch (_game._trigger) {
+ case 0:
+ _game._player._stepEnabled = false;
+ _game._player._visible = false;
+ _globals._sequenceIndexes[4] = _scene->_sequences.startReverseCycle(_globals._spriteIndexes[4], false, 8, 1, 0, 0);
+ _scene->_sequences.setAnimRange(_globals._sequenceIndexes[4], 1, 5);
+ _scene->_sequences.setMsgLayout(_globals._sequenceIndexes[4]);
+ _scene->_sequences.addSubEntry(_globals._sequenceIndexes[4], SEQUENCE_TRIGGER_SPRITE, 5, 1);
+ _scene->_sequences.addSubEntry(_globals._sequenceIndexes[4], SEQUENCE_TRIGGER_EXPIRE, 0, 2);
+ break;
+
+ case 1:
+ _vm->_sound->command(9);
+ _scene->_sequences.remove(_globals._sequenceIndexes[1]);
+ _scene->_dynamicHotspots.remove(_compactCaseHotspotId);
+ _game._objects.addToInventory(OBJ_COMPACT_CASE);
+ _vm->_dialogs->showItem(OBJ_COMPACT_CASE, 60330);
+ break;
+
+ case 2:
+ _scene->_sequences.updateTimeout(-1, _globals._sequenceIndexes[4]);
+ _game._player._visible = true;
+ _game._player._stepEnabled = true;
+ break;
+
+ default:
+ break;
+ }
+ }
+ } else if (_action.isAction(VERB_TAKE, NOUN_NOTE)) {
+ if ( _game._trigger || !_game._objects.isInInventory(OBJ_NOTE)) {
+ if (_game._trigger == 0) {
+ _game._player._stepEnabled = false;
+ _game._player._visible = false;
+ _globals._sequenceIndexes[3] = _scene->_sequences.startCycle(_globals._spriteIndexes[3], false, 1);
+ _scene->_sequences.setMsgLayout(_globals._sequenceIndexes[3]);
+ _scene->_sequences.addTimer(15, 1);
+ } else if (_game._trigger == 1) {
+ _vm->_sound->command(9);
+ _scene->_sequences.remove(_globals._sequenceIndexes[2]);
+ _scene->_dynamicHotspots.remove(_noteHotspotId);
+ _game._objects.addToInventory(OBJ_NOTE);
+ _scene->_sequences.remove(_globals._sequenceIndexes[3]);
+ _game._player._priorTimer = _scene->_frameStartTime - _game._player._ticksAmount;
+ _game._player._visible = true;
+ _game._player._stepEnabled = true;
+ }
+ }
+ } else if (_action._lookFlag)
+ _vm->_dialogs->show(60310);
+ else if (_action.isAction(VERB_LOOK, NOUN_BED))
+ _vm->_dialogs->show(60311);
+ else if (_action.isAction(VERB_LOOK, NOUN_WIG_STAND))
+ _vm->_dialogs->show(60312);
+ else if (_action.isAction(VERB_TAKE, NOUN_WIG_STAND))
+ _vm->_dialogs->show(60313);
+ else if (_action.isAction(VERB_LOOK, NOUN_REVIEW))
+ _vm->_dialogs->show(60314);
+ else if (_action.isAction(VERB_LOOK, NOUN_SOUVENIR_TICKETS))
+ _vm->_dialogs->show(60315);
+ else if (_action.isAction(VERB_LOOK, NOUN_PHOTOGRAPH))
+ _vm->_dialogs->show(60316);
+ else if (_action.isAction(VERB_LOOK, NOUN_LAMP))
+ _vm->_dialogs->show(60317);
+ else if (_action.isAction(VERB_LOOK, NOUN_DIRECTORS_SLATE) || _action.isAction(VERB_LOOK, NOUN_CROP) || _action.isAction(VERB_LOOK, NOUN_MEGAPHONE))
+ _vm->_dialogs->show(60318);
+ else if (_action.isAction(VERB_LOOK, NOUN_SNAPSHOT))
+ _vm->_dialogs->show(60319);
+ else if (_action.isAction(VERB_TAKE, NOUN_SNAPSHOT))
+ _vm->_dialogs->show(60320);
+ else if (_action.isAction(VERB_LOOK, NOUN_PERFUME))
+ _vm->_dialogs->show(60321);
+ else if (_action.isAction(VERB_TAKE, NOUN_PERFUME))
+ _vm->_dialogs->show(60322);
+ else if (_action.isAction(VERB_TAKE, NOUN_NOTE))
+ _vm->_dialogs->show(60323);
+ else if (_action.isAction(VERB_LOOK, NOUN_NOTE)) {
+ if (_game._objects[OBJ_NOTE]._roomNumber == _scene->_currentSceneId)
+ _vm->_dialogs->show(60324);
+ } else if (_action.isAction(VERB_LOOK, NOUN_CORNER_TABLE)) {
+ if (_game._objects[OBJ_NOTE]._roomNumber == _scene->_currentSceneId)
+ _vm->_dialogs->show(60326);
+ else
+ _vm->_dialogs->show(60325);
+ } else if (_action.isAction(VERB_LOOK, NOUN_VANITY)) {
+ if (_game._objects[OBJ_COMPACT_CASE]._roomNumber == _scene->_currentSceneId)
+ _vm->_dialogs->show(60327);
+ else
+ _vm->_dialogs->show(60328);
+ } else if (_action.isAction(VERB_LOOK, NOUN_COMPACT_CASE) && (_action._mainObjectSource == 4))
+ _vm->_dialogs->show(60329);
+ // For the next two checks, the second part of the check wasn't surrounded par parenthesis, which was obviously wrong
+ else if (_action.isAction(VERB_LOOK) && (_action.isObject(NOUN_BRA) || _action.isObject(NOUN_BOA) || _action.isObject(NOUN_SLIP)))
+ _vm->_dialogs->show(60331);
+ else if (_action.isAction(VERB_TAKE) && (_action.isObject(NOUN_BRA) || _action.isObject(NOUN_BOA) || _action.isObject(NOUN_SLIP)))
+ _vm->_dialogs->show(60332);
+ else
+ return;
+
+ _action._inProgress = false;
+}
+
+/*------------------------------------------------------------------------*/
+
+Scene604::Scene604(MADSEngine *vm) : Scene6xx(vm) {
+ _timebombHotspotId = -1;
+ _bombMode = -1;
+ _monsterFrame = -1;
+
+ _monsterTimer = 0;
+
+ _monsterActive = false;
+ _animationActiveFl = false;
+}
+
+void Scene604::synchronize(Common::Serializer &s) {
+ Scene6xx::synchronize(s);
+
+ s.syncAsSint16LE(_timebombHotspotId);
+ s.syncAsSint16LE(_bombMode);
+ s.syncAsSint16LE(_monsterFrame);
+
+ s.syncAsUint32LE(_monsterTimer);
+
+ s.syncAsByte(_monsterActive);
+ s.syncAsByte(_animationActiveFl);
+}
+
+void Scene604::setup() {
+ setPlayerSpritesPrefix();
+ setAAName();
+ _scene->addActiveVocab(NOUN_SEA_MONSTER);
+ _scene->addActiveVocab(VERB_WALKTO);
+ _scene->addActiveVocab(NOUN_TIMEBOMB);
+}
+
+void Scene604::enter() {
+ _globals._spriteIndexes[2] = _scene->_sprites.addSprites(formAnimName('c', 0));
+ _globals._spriteIndexes[4] = _scene->_sprites.addSprites("*RXCD_9");
+ _globals._spriteIndexes[6] = _scene->_sprites.addSprites(Resources::formatName(620, 'b', 0, EXT_SS, ""));
+ _globals._spriteIndexes[5] = _scene->_sprites.addSprites("*RXMRC_9");
+
+ if (_globals[kTimebombStatus] == 1) {
+ _globals._sequenceIndexes[6] = _scene->_sequences.startCycle(_globals._spriteIndexes[6], false, -1);
+ _timebombHotspotId = _scene->_dynamicHotspots.add(NOUN_TIMEBOMB, VERB_WALKTO, _globals._sequenceIndexes[6], Common::Rect(0, 0, 0, 0));
+ _scene->_dynamicHotspots.setPosition(_timebombHotspotId, Common::Point(166, 118), FACING_NORTHEAST);
+ }
+
+ if (_scene->_roomChanged)
+ _game._objects.addToInventory(OBJ_TIMEBOMB);
+
+ _vm->_palette->setEntry(252, 63, 37, 26);
+ _vm->_palette->setEntry(253, 45, 24, 17);
+ _animationActiveFl = false;
+
+ if (_scene->_priorSceneId != -2) {
+ _game._player._playerPos = Common::Point(72, 149);
+ _game._player._facing = FACING_NORTHEAST;
+ _game._player._visible = false;
+ _game._player._stepEnabled = false;
+ _globals._sequenceIndexes[2] = _scene->_sequences.startCycle(_globals._spriteIndexes[2], false, -1);
+ _scene->_sequences.setDepth(_globals._sequenceIndexes[2], 1);
+ _scene->loadAnimation(formAnimName('R', 1), 70);
+ _animationActiveFl = true;
+ } else {
+ _globals._sequenceIndexes[2] = _scene->_sequences.startCycle(_globals._spriteIndexes[2], false, -2);
+ _scene->_sequences.setDepth(_globals._sequenceIndexes[2], 1);
+ }
+
+ _monsterTimer = _scene->_frameStartTime;
+ _monsterActive = false;
+
+ sceneEntrySound();
+ _game.loadQuoteSet(0x2E7, 0x2E8, 0x2E9, 0x2EA, 0x2EB, 0x2EC, 0x2ED, 0x2EE, 0x2EF, 0x2F0, 0);
+}
+
+void Scene604::step() {
+ switch (_game._trigger) {
+ case 70:
+ _game._player._visible = true;
+ _game._player._priorTimer = _scene->_activeAnimation->getNextFrameTimer() - _game._player._ticksAmount;
+ _scene->_sequences.addTimer(30, 71);
+ break;
+
+ case 71:
+ _scene->_sequences.remove(_globals._sequenceIndexes[2]);
+ _globals._sequenceIndexes[2] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[2], false, 6, 1, 0, 0);
+ _scene->_sequences.setDepth(_globals._sequenceIndexes[2], 1);
+ _scene->_sequences.addSubEntry(_globals._sequenceIndexes[2], SEQUENCE_TRIGGER_EXPIRE, 0, 72);
+ break;
+
+ case 72:
+ _globals._sequenceIndexes[2] = _scene->_sequences.startCycle(_globals._spriteIndexes[2], false, -2);
+ _scene->_sequences.setDepth(_globals._sequenceIndexes[2], 1);
+ _game._player._stepEnabled = true;
+ _animationActiveFl = false;
+ break;
+
+ default:
+ break;
+ }
+
+ if (_monsterActive && (_scene->_activeAnimation != nullptr)) {
+ if (_scene->_activeAnimation->getCurrentFrame() != _monsterFrame) {
+ _monsterFrame = _scene->_activeAnimation->getCurrentFrame();
+ int nextMonsterFrame = -1;
+
+ switch (_monsterFrame) {
+ case 50:
+ case 137:
+ case 174: {
+ int randVal = _vm->getRandomNumber(1, 1000);
+ if ((randVal <= 450) && (_game._player._special)) {
+ if (_game._player._special == 1)
+ nextMonsterFrame = 50;
+ else if (_game._player._special == 2)
+ nextMonsterFrame = 84;
+ else
+ nextMonsterFrame = 137;
+ } else if (randVal <= 150)
+ nextMonsterFrame = 50;
+ else if (randVal <= 300)
+ nextMonsterFrame = 84;
+ else if (randVal <= 450)
+ nextMonsterFrame = 137;
+ else if (randVal < 750)
+ nextMonsterFrame = 13;
+ else
+ nextMonsterFrame = 114;
+
+ }
+ break;
+
+ case 84:
+ nextMonsterFrame = 14;
+ break;
+
+ default:
+ break;
+ }
+
+ if ((nextMonsterFrame >= 0) && (nextMonsterFrame != _monsterFrame)) {
+ _scene->_activeAnimation->setCurrentFrame(nextMonsterFrame);
+ _monsterFrame = nextMonsterFrame;
+ }
+ }
+ }
+
+ if ((!_monsterActive && !_animationActiveFl) && (_scene->_frameStartTime > (_monsterTimer + 4))) {
+ _monsterTimer = _scene->_frameStartTime;
+ if ((_vm->getRandomNumber(1, 1000) < 25) || !_game._visitedScenes._sceneRevisited) {
+ _monsterActive = true;
+ _scene->freeAnimation();
+ _scene->loadAnimation(formAnimName('m', -1));
+ }
+ }
+}
+
+void Scene604::handleBombActions() {
+ switch (_game._trigger) {
+ case 0:
+ _game._player._stepEnabled = false;
+ _game._player._visible = false;
+ _globals._sequenceIndexes[5] = _scene->_sequences.startReverseCycle(_globals._spriteIndexes[5], false, 9, 1, 0, 0);
+ _scene->_sequences.setAnimRange(_globals._sequenceIndexes[5], 1, 3);
+ _scene->_sequences.setMsgLayout(_globals._sequenceIndexes[5]);
+ if (_bombMode == 1)
+ _scene->_sequences.addSubEntry(_globals._sequenceIndexes[5], SEQUENCE_TRIGGER_SPRITE, 3, 1);
+ else
+ _scene->_sequences.addSubEntry(_globals._sequenceIndexes[5], SEQUENCE_TRIGGER_SPRITE, 3, 2);
+
+ _scene->_sequences.addSubEntry(_globals._sequenceIndexes[5], SEQUENCE_TRIGGER_EXPIRE, 0, 3);
+ break;
+
+ case 1:
+ _globals._sequenceIndexes[6] = _scene->_sequences.startCycle(_globals._spriteIndexes[6], false, -1);
+ _timebombHotspotId = _scene->_dynamicHotspots.add(NOUN_TIMEBOMB, VERB_WALKTO, _globals._sequenceIndexes[6], Common::Rect(0, 0, 0, 0));
+ _scene->_dynamicHotspots.setPosition(_timebombHotspotId, Common::Point(166, 118), FACING_NORTHEAST);
+ _game._objects.setRoom(OBJ_TIMEBOMB, _scene->_currentSceneId);
+ break;
+
+ case 2:
+ _scene->_sequences.remove(_globals._sequenceIndexes[6]);
+ _scene->_dynamicHotspots.remove(_timebombHotspotId);
+ _game._objects.addToInventory(OBJ_TIMEBOMB);
+ break;
+
+ case 3:
+ _scene->_sequences.updateTimeout(-1, _globals._sequenceIndexes[5]);
+ _game._player._visible = true;
+ _game._player._stepEnabled = true;
+ if (_bombMode == 1) {
+ _vm->_dialogs->show(60421);
+ _globals[kTimebombStatus] = TIMEBOMB_ACTIVATED;
+ _globals[kTimebombTimer] = 0;
+ } else {
+ _vm->_dialogs->show(60423);
+ _globals[kTimebombStatus] = TIMEBOMB_DEACTIVATED;
+ _globals[kTimebombTimer] = 0;
+ }
+ break;
+
+ default:
+ break;
+ }
+}
+
+void Scene604::actions() {
+ if (_action.isAction(VERB_GET_INSIDE, NOUN_CAR)) {
+ switch (_game._trigger) {
+ case 0:
+ _game._player._stepEnabled = false;
+ _scene->_sequences.remove(_globals._sequenceIndexes[2]);
+ _globals._sequenceIndexes[2] = _scene->_sequences.startReverseCycle(_globals._spriteIndexes[2], false, 6, 1, 0, 0);
+ _scene->_sequences.setDepth(_globals._sequenceIndexes[2], 1);
+ _scene->_sequences.addSubEntry(_globals._sequenceIndexes[2], SEQUENCE_TRIGGER_EXPIRE, 0, 1);
+ break;
+
+ case 1: {
+ int syncIdx = _globals._sequenceIndexes[2];
+ _globals._sequenceIndexes[2] = _scene->_sequences.startCycle(_globals._spriteIndexes[2], false, -1);
+ _scene->_sequences.setDepth(_globals._sequenceIndexes[2], 1);
+ _scene->_sequences.updateTimeout(_globals._sequenceIndexes[2], syncIdx);
+ _scene->_sequences.addTimer(6, 2);
+ }
+ break;
+
+ case 2:
+ _game._player._visible = false;
+ _globals._sequenceIndexes[4] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[4], false, 10, 1, 0, 0);
+ _scene->_sequences.setMsgLayout(_globals._sequenceIndexes[4]);
+ _scene->_sequences.addSubEntry(_globals._sequenceIndexes[4], SEQUENCE_TRIGGER_EXPIRE, 0, 3);
+ break;
+
+ case 3: {
+ int syncIdx = _globals._sequenceIndexes[4];
+ _globals._sequenceIndexes[4] = _scene->_sequences.startCycle(_globals._spriteIndexes[4], false, -2);
+ _scene->_sequences.setMsgLayout(_globals._sequenceIndexes[4]);
+ _scene->_sequences.updateTimeout(_globals._sequenceIndexes[4], syncIdx);
+ _scene->_nextSceneId = 504;
+ }
+ break;
+
+ default:
+ break;
+ }
+ } else if ((_action.isAction(VERB_PUT, NOUN_LEDGE) || _action.isAction(VERB_PUT, NOUN_VIEWPORT) || _action.isAction(VERB_THROW, NOUN_VIEWPORT))
+ && (_action.isObject(NOUN_BOMB) || _action.isObject(NOUN_BOMBS)))
+ _vm->_dialogs->show(60420);
+ else if (_action.isAction(VERB_PUT, NOUN_TIMEBOMB, NOUN_LEDGE) || _action.isAction(VERB_PUT, NOUN_TIMEBOMB, NOUN_VIEWPORT)) {
+ _bombMode = 1;
+ if ((_game._difficulty == DIFFICULTY_HARD) || _globals[kWarnedFloodCity])
+ handleBombActions();
+ else if ((_game._objects.isInInventory(OBJ_POLYCEMENT) && _game._objects.isInInventory(OBJ_CHICKEN))
+ && ((_globals[kLineStatus] == LINE_TIED) || ((_game._difficulty == DIFFICULTY_EASY) && (!_globals[kBoatRaised]))))
+ handleBombActions();
+ else if (_game._difficulty == DIFFICULTY_EASY)
+ _vm->_dialogs->show(60424);
+ else {
+ _vm->_dialogs->show(60425);
+ _globals[kWarnedFloodCity] = true;
+ }
+ } else if (_action.isAction(VERB_TAKE, NOUN_TIMEBOMB)) {
+ if (_game._trigger || !_game._objects.isInInventory(OBJ_TIMEBOMB)) {
+ _bombMode = 2;
+ handleBombActions();
+ }
+ } else if (_action._lookFlag)
+ _vm->_dialogs->show(60411);
+ else if (_action.isAction(VERB_LOOK, NOUN_VIEWPORT)) {
+ if (_monsterActive) {
+ _vm->_dialogs->show(60413);
+ } else {
+ _vm->_dialogs->show(60412);
+ }
+ } else if (_action.isAction(VERB_LOOK, NOUN_WALL))
+ _vm->_dialogs->show(60414);
+ else if (_action.isAction(VERB_LOOK, NOUN_VENT))
+ _vm->_dialogs->show(60415);
+ else if (_action.isAction(VERB_LOOK, NOUN_INDICATOR))
+ _vm->_dialogs->show(60416);
+ else if (_action.isAction(VERB_LOOK, NOUN_SCULPTURE))
+ _vm->_dialogs->show(60417);
+ else if (_action.isAction(VERB_LOOK, NOUN_CAR))
+ _vm->_dialogs->show(60418);
+ else if (_action.isAction(VERB_LOOK, NOUN_FOUNTAIN))
+ _vm->_dialogs->show(60419);
+ else
+ return;
+
+ _action._inProgress = false;
+}
+
+/*------------------------------------------------------------------------*/
+
+void Scene605::setup() {
+ _game._player._spritesPrefix = "";
+ setAAName();
+}
+
+void Scene605::enter() {
+ _globals._spriteIndexes[1] = _scene->_sprites.addSprites(formAnimName('r', -1));
+ _globals._spriteIndexes[2] = _scene->_sprites.addSprites(formAnimName('b', -1));
+ _globals._spriteIndexes[3] = _scene->_sprites.addSprites(formAnimName('l', -1));
+ _globals._spriteIndexes[4] = _scene->_sprites.addSprites(formAnimName('p', -1));
+ _globals._spriteIndexes[5] = _scene->_sprites.addSprites(formAnimName('n', -1));
+ _globals._spriteIndexes[6] = _scene->_sprites.addSprites(formAnimName('f', -1));
+
+ _globals._sequenceIndexes[1] = _scene->_sequences.startReverseCycle(_globals._spriteIndexes[1], false, 15, 0, 0, 0);
+ _globals._sequenceIndexes[2] = _scene->_sequences.startReverseCycle(_globals._spriteIndexes[2], false, 17, 0, 0, 0);
+ _globals._sequenceIndexes[3] = _scene->_sequences.startReverseCycle(_globals._spriteIndexes[3], false, 14, 0, 0, 0);
+ _globals._sequenceIndexes[4] = _scene->_sequences.startReverseCycle(_globals._spriteIndexes[4], false, 13, 0, 0, 0);
+ _globals._sequenceIndexes[5] = _scene->_sequences.startReverseCycle(_globals._spriteIndexes[5], false, 17, 0, 0, 0);
+ _globals._sequenceIndexes[6] = _scene->_sequences.startReverseCycle(_globals._spriteIndexes[6], false, 18, 0, 0, 0);
+
+ _game._player._visible = false;
+ _game._player._stepEnabled = false;
+ _scene->_sequences.addTimer(600, 70);
+ _scene->_userInterface.setup(kInputLimitedSentences);
+ sceneEntrySound();
+ _vm->_sound->command(22);
+}
+
+void Scene605::step() {
+ if (_game._trigger == 70) {
+ _vm->_sound->command(23);
+ if (_globals[kResurrectRoom] >= 700)
+ _vm->_dialogs->show(60598);
+ else
+ _vm->_dialogs->show(60599);
+
+ _scene->_nextSceneId = _globals[kResurrectRoom];
+ }
+}
+
+void Scene605::actions() {
+ return;
+}
+
+/*------------------------------------------------------------------------*/
+
+Scene607::Scene607(MADSEngine *vm) : Scene6xx(vm) {
+ _dogTimer = 0;
+ _lastFrameTime = 0;
+
+ _dogLoop = false;
+ _dogEatsRex = false;
+ _dogBarking = false;
+ _shopAvailable = false;
+
+ _animationMode = -1;
+ _animationActive = -1;
+ _counter = -1;
+}
+
+void Scene607::synchronize(Common::Serializer &s) {
+ Scene6xx::synchronize(s);
+
+ s.syncAsUint32LE(_dogTimer);
+ s.syncAsUint32LE(_lastFrameTime);
+
+ s.syncAsByte(_dogLoop);
+ s.syncAsByte(_dogEatsRex);
+ s.syncAsByte(_dogBarking);
+ s.syncAsByte(_shopAvailable);
+
+ s.syncAsSint16LE(_animationMode);
+ s.syncAsSint16LE(_animationActive);
+ s.syncAsSint16LE(_counter);
+}
+
+void Scene607::setup() {
+ setPlayerSpritesPrefix();
+ setAAName();
+ _scene->addActiveVocab(NOUN_OBNOXIOUS_DOG);
+ _scene->addActiveVocab(VERB_WALKTO);
+}
+
+void Scene607::enter() {
+ _globals._spriteIndexes[2] = _scene->_sprites.addSprites(formAnimName('c', 0));
+ _globals._spriteIndexes[3] = _scene->_sprites.addSprites("*RXCD_3");
+
+ if (!_game._visitedScenes._sceneRevisited && (_scene->_priorSceneId != 608))
+ _globals[kDogStatus] = DOG_PRESENT;
+
+ if ((_scene->_priorSceneId == 608) && (_globals[kDogStatus] < DOG_GONE))
+ _globals[kDogStatus] = DOG_GONE;
+
+ _animationActive = 0;
+
+ if ((_globals[kDogStatus] == DOG_PRESENT) && (_game._difficulty != DIFFICULTY_EASY)) {
+ _globals._spriteIndexes[4] = _scene->_sprites.addSprites(formAnimName('g', 3));
+ _globals._spriteIndexes[5] = _scene->_sprites.addSprites(formAnimName('g', 7));
+ _globals._spriteIndexes[1] = _scene->_sprites.addSprites(formAnimName('g', 0));
+
+ _globals._sequenceIndexes[1] = _scene->_sequences.startCycle(_globals._spriteIndexes[1], false, 1);
+ _scene->_sequences.setDepth(_globals._sequenceIndexes[1], 6);
+ _dogBarking = false;
+ _dogLoop = false;
+ _shopAvailable = false;
+ _dogEatsRex = false;
+ _dogTimer = 0;
+ } else
+ _scene->_hotspots.activate(NOUN_OBNOXIOUS_DOG, false);
+
+ _globals._sequenceIndexes[2] = _scene->_sequences.startCycle(_globals._spriteIndexes[2], false, -2);
+ _scene->_sequences.setDepth(_globals._sequenceIndexes[2], 4);
+
+ if (_scene->_priorSceneId == 608) {
+ _game._player._playerPos = Common::Point(297, 50);
+ _game._player._facing = FACING_SOUTHEAST;
+ } else if (_scene->_priorSceneId != -2) {
+ _game._player._playerPos = Common::Point(40, 104);
+ _game._player._facing = FACING_SOUTHEAST;
+ _game._player._visible = false;
+ _game._player._stepEnabled = false;
+ _scene->_sequences.remove(_globals._sequenceIndexes[2]);
+ _globals._sequenceIndexes[2] = _scene->_sequences.startCycle(_globals._spriteIndexes[2], false, -1);
+ _scene->_sequences.setDepth(_globals._sequenceIndexes[2], 4);
+ _scene->loadAnimation(formAnimName('R', 1), 80);
+ } else if (_globals[kDogStatus] == DOG_LEFT) {
+ _globals._spriteIndexes[4] = _scene->_sprites.addSprites(formAnimName('g', 3));
+ _globals._spriteIndexes[5] = _scene->_sprites.addSprites(formAnimName('g', 7));
+ _globals._spriteIndexes[1] = _scene->_sprites.addSprites(formAnimName('g', 0));
+ }
+
+ sceneEntrySound();
+
+ if (_scene->_roomChanged)
+ _game._objects.addToInventory(OBJ_BONES);
+
+ _vm->_palette->setEntry(252, 63, 44, 30);
+ _vm->_palette->setEntry(253, 63, 20, 22);
+ _game.loadQuoteSet(0x2F8, 0x2F7, 0x2F6, 0x2F9, 0x2FA, 0);
+}
+
+void Scene607::step() {
+ if (_globals[kDogStatus] == DOG_LEFT) {
+ int32 diff = _scene->_frameStartTime - _lastFrameTime;
+ if ((diff >= 0) && (diff <= 4))
+ _dogTimer += diff;
+ else
+ _dogTimer++;
+
+ _lastFrameTime = _scene->_frameStartTime;
+ }
+
+ if ((_dogTimer >= 480) && !_dogLoop && !_shopAvailable && (_globals[kDogStatus] == DOG_LEFT) && !_game._player._special) {
+ _vm->_sound->command(14);
+ _dogLoop = true;
+ _globals._sequenceIndexes[5] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[5], false, 10, 1, 0, 0);
+ _scene->_sequences.setDepth(_globals._sequenceIndexes[5], 1);
+ _scene->_sequences.addSubEntry(_globals._sequenceIndexes[5], SEQUENCE_TRIGGER_EXPIRE, 0, 91);
+ _dogLoop = false;
+ _dogTimer = 0;
+ }
+
+ if (_game._trigger == 91) {
+ _globals._sequenceIndexes[1] = _scene->_sequences.startCycle(_globals._spriteIndexes[1], false, 1);
+ _scene->_sequences.setDepth(_globals._sequenceIndexes[1], 6);
+ _dogBarking = false;
+ _globals[kDogStatus] = DOG_PRESENT;
+ _scene->_hotspots.activate(NOUN_OBNOXIOUS_DOG, true);
+ }
+
+ if (!_dogEatsRex && (_game._difficulty != DIFFICULTY_EASY) && !_animationActive && (_globals[kDogStatus] == DOG_PRESENT)
+ && !_dogBarking && (_vm->getRandomNumber(1, 50) == 10)) {
+ _dogBarking = true;
+ _scene->_sequences.remove(_globals._sequenceIndexes[1]);
+ _globals._sequenceIndexes[1] = _scene->_sequences.startReverseCycle(_globals._spriteIndexes[1], false, 5, 8, 0, 0);
+ _scene->_sequences.setDepth(_globals._sequenceIndexes[1], 6);
+ _scene->_kernelMessages.reset();
+ _scene->_sequences.addSubEntry(_globals._sequenceIndexes[1], SEQUENCE_TRIGGER_SPRITE, 2, 100);
+ _scene->_sequences.addSubEntry(_globals._sequenceIndexes[1], SEQUENCE_TRIGGER_EXPIRE, 0, 70);
+ _counter = 0;
+ }
+
+ if ((_game._trigger == 70) && !_dogEatsRex && (_globals[kDogStatus] == DOG_PRESENT) && !_animationActive) {
+ int syncIdx = _globals._sequenceIndexes[1];
+ _globals._sequenceIndexes[1] = _scene->_sequences.startCycle(_globals._spriteIndexes[1], false, 1);
+ _scene->_sequences.setDepth(_globals._sequenceIndexes[1], 6);
+ _scene->_sequences.updateTimeout(_globals._sequenceIndexes[1], syncIdx);
+ _scene->_kernelMessages.reset();
+ _dogBarking = false;
+ }
+
+ if (_game._trigger == 100) {
+ _counter++;
+ _vm->_sound->command(12);
+
+ if ((_counter >= 1) && (_counter <= 4)) {
+ Common::Point pos(0, 0);
+ switch (_counter) {
+ case 1:
+ pos = Common::Point(237, 5);
+ break;
+
+ case 2:
+ pos = Common::Point(270, 15);
+ break;
+
+ case 3:
+ pos = Common::Point(237, 25);
+ break;
+
+ case 4:
+ pos = Common::Point(270, 36);
+ break;
+
+ default:
+ break;
+ }
+ _scene->_kernelMessages.add(pos, 0xFDFC, 0, 0, 120, _game.getQuote(0x2F9));
+ }
+ }
+
+ if (_game._player._moving && (_game._difficulty != DIFFICULTY_EASY) && !_shopAvailable && (_globals[kDogStatus] == DOG_PRESENT) && (_scene->_rails.getNext() > 0)) {
+ _game._player.cancelCommand();
+ _game._player.startWalking(Common::Point(268, 72), FACING_NORTHEAST);
+ _scene->_rails.resetNext();
+ }
+
+ if ((_game._player._special > 0) && (_game._difficulty != DIFFICULTY_EASY) && (_globals[kDogStatus] == DOG_PRESENT) && _game._player._stepEnabled)
+ _game._player._stepEnabled = false;
+
+ if ((_game._difficulty != DIFFICULTY_EASY) && (_globals[kDogStatus] == DOG_PRESENT) && (_game._player._playerPos == Common::Point(268, 72))
+ && (_game._trigger || !_dogEatsRex)) {
+ _dogEatsRex = true;
+ switch (_game._trigger) {
+ case 91:
+ case 0:
+ _animationActive = 1;
+ _game._player._visible = false;
+ _scene->_sequences.remove(_globals._sequenceIndexes[1]);
+ _globals._sequenceIndexes[4] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[4], false, 10, 1, 0, 0);
+ _scene->_sequences.setAnimRange(_globals._sequenceIndexes[4], -1, 7);
+ _scene->_sequences.setDepth(_globals._sequenceIndexes[4], 1);
+ _scene->_kernelMessages.reset();
+ _scene->_kernelMessages.add(Common::Point(0, 0), 0x1110, 34, 0, 120, _game.getQuote(0x2FA));
+ _scene->_sequences.addSubEntry(_globals._sequenceIndexes[4], SEQUENCE_TRIGGER_EXPIRE, 0, 60);
+ _scene->_sequences.addTimer(10, 64);
+ break;
+
+ case 60: {
+ int syncIdx = _globals._sequenceIndexes[4];
+ _globals._sequenceIndexes[4] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[4], false, 5, 1, 0, 0);
+ _scene->_sequences.setAnimRange(_globals._sequenceIndexes[4], 8, 45);
+ _scene->_sequences.setDepth(_globals._sequenceIndexes[4], 1);
+ _scene->_sequences.updateTimeout(_globals._sequenceIndexes[4], syncIdx);
+ _scene->_sequences.addSubEntry(_globals._sequenceIndexes[4], SEQUENCE_TRIGGER_EXPIRE, 0, 61);
+ }
+ break;
+
+ case 61: {
+ int syncIdx = _globals._sequenceIndexes[4];
+ _globals._sequenceIndexes[4] = _scene->_sequences.startReverseCycle(_globals._spriteIndexes[4], false, 15, 3, 0, 0);
+ _scene->_sequences.setAnimRange(_globals._sequenceIndexes[4], 46, -2);
+ _scene->_sequences.setDepth(_globals._sequenceIndexes[4], 1);
+ _scene->_sequences.updateTimeout(_globals._sequenceIndexes[4], syncIdx);
+ _scene->_sequences.addSubEntry(_globals._sequenceIndexes[4], SEQUENCE_TRIGGER_EXPIRE, 0, 62);
+ }
+ break;
+
+ case 62: {
+ int syncIdx = _globals._sequenceIndexes[4];
+ _animationActive = 2;
+ _globals._sequenceIndexes[4] = _scene->_sequences.startCycle(_globals._spriteIndexes[4], false, -2);
+ _scene->_sequences.setDepth(_globals._sequenceIndexes[4], 1);
+ _scene->_sequences.updateTimeout(_globals._sequenceIndexes[4], syncIdx);
+ _scene->_sequences.addTimer(60, 63);
+ }
+ break;
+
+ case 63:
+ _vm->_dialogs->show(60729);
+ _animationActive = 0;
+ _dogEatsRex = false;
+ _scene->_reloadSceneFlag = true;
+ _game._player._stepEnabled = true;
+ break;
+
+ case 64:
+ if (_dogEatsRex && (_animationActive == 1)) {
+ _vm->_sound->command(12);
+ _scene->_sequences.addTimer(10, 64);
+ }
+ break;
+
+ default:
+ break;
+ }
+ }
+
+ switch (_game._trigger) {
+ case 80:
+ _game._player._visible = true;
+ _game._player._priorTimer = _scene->_activeAnimation->getNextFrameTimer() - _game._player._ticksAmount;
+ _scene->_sequences.addTimer(6, 81);
+ break;
+
+ case 81:
+ _scene->_sequences.remove(_globals._sequenceIndexes[2]);
+ _globals._sequenceIndexes[2] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[2], false, 6, 1, 0, 0);
+ _scene->_sequences.setDepth(_globals._sequenceIndexes[2], 4);
+ _scene->_sequences.addSubEntry(_globals._sequenceIndexes[2], SEQUENCE_TRIGGER_EXPIRE, 0, 82);
+ break;
+
+ case 82:
+ _globals._sequenceIndexes[2] = _scene->_sequences.startCycle(_globals._spriteIndexes[2], false, -2);
+ _scene->_sequences.setDepth(_globals._sequenceIndexes[2], 4);
+ _game._player._stepEnabled = true;
+ break;
+
+ default:
+ break;
+ }
+}
+
+void Scene607::handleThrowingBone() {
+ _animationActive = -1;
+ switch (_game._trigger) {
+ case 0:
+ _game._player._stepEnabled = false;
+ _scene->_sequences.remove(_globals._sequenceIndexes[1]);
+ _game._player._visible = false;
+ _scene->loadAnimation(formAnimName('D', _animationMode), 1);
+ break;
+
+ case 1:
+ _game._player._visible = true;
+ _game._player._priorTimer = _scene->_activeAnimation->getNextFrameTimer() - _game._player._ticksAmount;
+
+ if (_animationMode != 1)
+ _scene->_hotspots.activate(NOUN_OBNOXIOUS_DOG, false);
+ else {
+ _globals._sequenceIndexes[1] = _scene->_sequences.startCycle(_globals._spriteIndexes[1], false, 1);
+ _scene->_sequences.setDepth(_globals._sequenceIndexes[1], 6);
+ }
+
+ _dogBarking = false;
+ if (_game._objects.isInInventory(OBJ_BONE)) {
+ _game._objects.setRoom(OBJ_BONE, 1);
+ if (_animationMode == 1)
+ _globals[kBone202Status] = 0;
+ } else {
+ _game._objects.setRoom(OBJ_BONES, 1);
+ _game._objects.addToInventory(OBJ_BONE);
+ }
+
+ _scene->_sequences.addTimer(60, 2);
+ break;
+
+ case 2: {
+ int quoteId = 0x2F8;
+ if (_animationMode == 1)
+ quoteId = 0x2F7;
+
+ if (_animationMode == 2) {
+ _globals[kDogStatus] = DOG_LEFT;
+ _dogTimer = 0;
+ }
+
+ _scene->_kernelMessages.reset();
+ _scene->_kernelMessages.add(Common::Point(0, 0), 0x1110, 34, 0, 120, _game.getQuote(quoteId));
+ _scene->_sequences.addTimer(60, 3);
+ }
+ break;
+
+ case 3:
+ _game._player._stepEnabled = true;
+ _animationActive = 0;
+ break;
+
+ default:
+ break;
+ }
+}
+
+void Scene607::preActions() {
+ if (_action.isAction(VERB_TALKTO, NOUN_OBNOXIOUS_DOG))
+ _game._player._needToWalk = false;
+
+ if (_action.isAction(VERB_WALK_THROUGH, NOUN_SIDE_ENTRANCE) && (_globals[kDogStatus] == DOG_LEFT) && (_game._difficulty != DIFFICULTY_EASY)) {
+ _shopAvailable = true;
+ _dogTimer = 0;
+ }
+
+ if (_action.isAction(VERB_THROW, NOUN_BONES, NOUN_OBNOXIOUS_DOG) || _action.isAction(VERB_THROW, NOUN_BONE, NOUN_OBNOXIOUS_DOG))
+ _game._player.walk(Common::Point(193, 100), FACING_NORTHEAST);
+
+ if (_action.isAction(VERB_THROW, NOUN_BONES, NOUN_FENCE) || _action.isAction(VERB_THROW, NOUN_BONE, NOUN_FENCE))
+ _game._player.walk(Common::Point(201, 107), FACING_SOUTHEAST);
+}
+
+void Scene607::actions() {
+ if (_action.isAction(VERB_WALK_THROUGH, NOUN_SIDE_ENTRANCE))
+ _scene->_nextSceneId = 608;
+ else if (_action.isAction(VERB_GET_INSIDE, NOUN_CAR)) {
+ switch (_game._trigger) {
+ case 0:
+ _game._player._stepEnabled = false;
+ _scene->_sequences.remove(_globals._sequenceIndexes[2]);
+ _globals._sequenceIndexes[2] = _scene->_sequences.startReverseCycle(_globals._spriteIndexes[2], false, 6, 1, 0, 0);
+ _scene->_sequences.setDepth(_globals._sequenceIndexes[2], 4);
+ _scene->_sequences.addSubEntry(_globals._sequenceIndexes[2], SEQUENCE_TRIGGER_EXPIRE, 0, 1);
+ break;
+
+ case 1: {
+ int syncIdx = _globals._sequenceIndexes[2];
+ _globals._sequenceIndexes[2] = _scene->_sequences.startCycle(_globals._spriteIndexes[2], false, -1);
+ _scene->_sequences.updateTimeout(_globals._sequenceIndexes[2], syncIdx);
+ _scene->_sequences.addTimer(6, 2);
+ }
+ break;
+
+ case 2:
+ _game._player._visible = false;
+ _globals._sequenceIndexes[3] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[3], false, 10, 1, 0, 0);
+ _scene->_sequences.setMsgLayout(_globals._sequenceIndexes[3]);
+ _scene->_sequences.addSubEntry(_globals._sequenceIndexes[3], SEQUENCE_TRIGGER_EXPIRE, 0, 3);
+ break;
+
+ case 3: {
+ int syncIdx = _globals._sequenceIndexes[3];
+ _globals._sequenceIndexes[3] = _scene->_sequences.startCycle(_globals._spriteIndexes[3], false, -2);
+ _scene->_sequences.setMsgLayout(_globals._sequenceIndexes[3]);
+ _scene->_sequences.updateTimeout(_globals._sequenceIndexes[3], syncIdx);
+ _scene->_nextSceneId = 504;
+ }
+ break;
+
+ default:
+ break;
+ }
+ } else if (_action.isAction(VERB_THROW, NOUN_BONES, NOUN_OBNOXIOUS_DOG) || _action.isAction(VERB_THROW, NOUN_BONE, NOUN_OBNOXIOUS_DOG)) {
+ if (_game._difficulty != DIFFICULTY_EASY) {
+ _animationMode = 1;
+ _scene->_kernelMessages.reset();
+ if (_game._trigger == 0)
+ _scene->_kernelMessages.add(Common::Point(0, 0), 0x1110, 34, 0, 120, _game.getQuote(0x2F6));
+
+ handleThrowingBone();
+ }
+ } else if ((_action.isAction(VERB_THROW, NOUN_BONES, NOUN_FENCE) || _action.isAction(VERB_THROW, NOUN_BONE, NOUN_FENCE)) && (_game._difficulty != DIFFICULTY_EASY)
+ && ((_globals[kDogStatus] == DOG_PRESENT) || _game._trigger)) {
+ _animationMode = 2;
+ if (_game._trigger == 0) {
+ _scene->_kernelMessages.reset();
+ _scene->_kernelMessages.add(Common::Point(0, 0), 0x1110, 34, 0, 120, _game.getQuote(0x2F6));
+ }
+ handleThrowingBone();
+ } else if (_action._lookFlag || _action.isAction(VERB_LOOK, NOUN_STREET)) {
+ if ((_globals[kDogStatus] == DOG_PRESENT) || (_game._difficulty == DIFFICULTY_EASY))
+ _vm->_dialogs->show(60710);
+ else
+ _vm->_dialogs->show(60711);
+ } else if (_action.isAction(VERB_LOOK, NOUN_WALL))
+ _vm->_dialogs->show(60712);
+ else if (_action.isAction(VERB_LOOK, NOUN_FENCE))
+ _vm->_dialogs->show(60713);
+ else if (_action.isAction(VERB_LOOK, NOUN_CAR))
+ _vm->_dialogs->show(60714);
+ else if (_action.isAction(VERB_LOOK, NOUN_MANHOLE))
+ _vm->_dialogs->show(60715);
+ else if (_action.isAction(VERB_LOOK, NOUN_FIRE_HYDRANT) && (_globals[kDogStatus] == DOG_PRESENT))
+ _vm->_dialogs->show(60716);
+ else if (_action.isAction(VERB_LOOK, NOUN_SIGN))
+ _vm->_dialogs->show(60717);
+ else if (_action.isAction(VERB_LOOK, NOUN_BROKEN_WINDOW))
+ _vm->_dialogs->show(60718);
+ else if (_action.isAction(VERB_LOOK, NOUN_GARAGE_DOOR))
+ _vm->_dialogs->show(60719);
+ else if (_action.isAction(VERB_LOOK, NOUN_SIDEWALK))
+ _vm->_dialogs->show(60720);
+ else if (_action.isAction(VERB_LOOK, NOUN_AIR_HOSE))
+ _vm->_dialogs->show(60721);
+ else if (_action.isAction(VERB_LOOK, NOUN_AUTO_SHOP)) {
+ if (_globals[kDogStatus] == DOG_PRESENT)
+ _vm->_dialogs->show(60723);
+ else
+ _vm->_dialogs->show(60722);
+ } else if (_action.isAction(VERB_LOOK, NOUN_SIDE_ENTRANCE)) {
+ if (_globals[kDogStatus] == DOG_PRESENT)
+ _vm->_dialogs->show(60725);
+ else
+ _vm->_dialogs->show(60724);
+ } else if (_action.isAction(VERB_LOOK, NOUN_OBNOXIOUS_DOG))
+ _vm->_dialogs->show(60726);
+ else if (_action.isAction(VERB_TALKTO, NOUN_OBNOXIOUS_DOG))
+ _vm->_dialogs->show(60727);
+ else if (_action.isAction(VERB_LOOK, NOUN_BARRICADE))
+ _vm->_dialogs->show(60728);
+ else if (_action.isAction(VERB_WALK_DOWN, NOUN_STREET))
+ _vm->_dialogs->show(60730);
+ else if (_action.isObject(NOUN_GARAGE_DOOR) && (_action.isAction(VERB_OPEN) || _action.isAction(VERB_PUSH) || _action.isAction(VERB_PULL)))
+ _vm->_dialogs->show(60731);
+ else
+ return;
+
+ _action._inProgress = false;
+}
+
+/*------------------------------------------------------------------------*/
+
+Scene608::Scene608(MADSEngine *vm) : Scene6xx(vm) {
+ _carMode = -1;
+ _carFrame = -1;
+ _carMoveMode = -1;
+ _dogDeathMode = -1;
+ _carHotspotId = -1;
+ _barkCount = -1;
+ _polycementHotspotId = -1;
+ _animationMode = -1;
+ _nextTrigger = -1;
+ _throwMode = -1;
+
+ _resetPositionsFl = false;
+ _dogActiveFl = false;
+ _dogBarkingFl = false;
+ _dogFirstEncounter = false;
+ _rexBeingEaten = false;
+ _dogHitWindow = false;
+ _checkFl = false;
+ _dogSquashFl = false;
+ _dogSafeFl = false;
+ _buttonPressedonTimeFl = false;
+ _dogUnderCar = false;
+ _dogYelping = false;
+
+ _dogWindowTimer = -1;
+ _dogRunTimer = -1;
+
+ _dogTimer1 = 0;
+ _dogTimer2 = 0;
+}
+
+void Scene608::synchronize(Common::Serializer &s) {
+ Scene6xx::synchronize(s);
+
+ s.syncAsSint16LE(_carMode);
+ s.syncAsSint16LE(_carFrame);
+ s.syncAsSint16LE(_carMoveMode);
+ s.syncAsSint16LE(_dogDeathMode);
+ s.syncAsSint16LE(_carHotspotId);
+ s.syncAsSint16LE(_barkCount);
+ s.syncAsSint16LE(_polycementHotspotId);
+ s.syncAsSint16LE(_animationMode);
+ s.syncAsSint16LE(_nextTrigger);
+ s.syncAsSint16LE(_throwMode);
+
+ s.syncAsByte(_resetPositionsFl);
+ s.syncAsByte(_dogActiveFl);
+ s.syncAsByte(_dogBarkingFl);
+ s.syncAsByte(_dogFirstEncounter);
+ s.syncAsByte(_rexBeingEaten);
+ s.syncAsByte(_dogHitWindow);
+ s.syncAsByte(_checkFl);
+ s.syncAsByte(_dogSquashFl);
+ s.syncAsByte(_dogSafeFl);
+ s.syncAsByte(_buttonPressedonTimeFl);
+ s.syncAsByte(_dogUnderCar);
+ s.syncAsByte(_dogYelping);
+
+ s.syncAsSint32LE(_dogWindowTimer);
+ s.syncAsSint32LE(_dogRunTimer);
+
+ s.syncAsUint32LE(_dogTimer1);
+ s.syncAsUint32LE(_dogTimer2);
+}
+
+void Scene608::setup() {
+ setPlayerSpritesPrefix();
+ setAAName();
+ _scene->addActiveVocab(VERB_WALKTO);
+ _scene->addActiveVocab(NOUN_POLYCEMENT);
+ _scene->addActiveVocab(NOUN_CAR);
+ _scene->addActiveVocab(NOUN_OBNOXIOUS_DOG);
+}
+
+void Scene608::resetDogVariables() {
+ _globals._sequenceIndexes[5] = _scene->_sequences.startCycle(_globals._spriteIndexes[5], false, 1);
+ int idx = _scene->_dynamicHotspots.add(NOUN_OBNOXIOUS_DOG, VERB_WALKTO, _globals._sequenceIndexes[5], Common::Rect(0, 0, 0, 0));
+ _scene->_dynamicHotspots.setPosition(idx, Common::Point(194, 142), FACING_EAST);
+ _scene->_sequences.setDepth(_globals._sequenceIndexes[5], 4);
+ _dogBarkingFl = false;
+ _dogFirstEncounter = false;
+}
+
+void Scene608::restoreAnimations() {
+ _scene->freeAnimation();
+ _carMode = 0;
+ _game._player._stepEnabled = true;
+ if (_throwMode == 6)
+ _dogSquashFl = true;
+
+ if (_globals[kCarStatus] == CAR_UP) {
+ _scene->_sequences.remove(_globals._sequenceIndexes[6]);
+ _scene->_sequences.remove(_globals._sequenceIndexes[7]);
+ _scene->loadAnimation(formAnimName('A', -1));
+ } else {
+ _scene->_sequences.remove(_globals._sequenceIndexes[8]);
+ _scene->_sequences.remove(_globals._sequenceIndexes[6]);
+ _scene->_sequences.remove(_globals._sequenceIndexes[7]);
+ _scene->loadAnimation(formAnimName('A', -1));
+ _scene->_activeAnimation->setCurrentFrame(6);
+ }
+}
+
+void Scene608::setCarAnimations() {
+ _scene->freeAnimation();
+ if (_globals[kCarStatus] == CAR_UP) {
+ _globals._sequenceIndexes[6] = _scene->_sequences.startCycle(_globals._spriteIndexes[6], false, 1);
+ _scene->_sequences.setPosition(_globals._sequenceIndexes[6], Common::Point(143, 98));
+ _scene->_sequences.setDepth(_globals._sequenceIndexes[6], 6);
+ _globals._sequenceIndexes[7] = _scene->_sequences.startCycle(_globals._spriteIndexes[7], false, 1);
+ _scene->_sequences.setPosition(_globals._sequenceIndexes[7], Common::Point(141, 67));
+ _scene->_sequences.setDepth(_globals._sequenceIndexes[7], 15);
+ } else {
+ _globals._sequenceIndexes[6] = _scene->_sequences.startCycle(_globals._spriteIndexes[6], false, 1);
+ _scene->_sequences.setPosition(_globals._sequenceIndexes[6], Common::Point(143, 128));
+ _scene->_sequences.setDepth(_globals._sequenceIndexes[6], 6);
+ _globals._sequenceIndexes[7] = _scene->_sequences.startCycle(_globals._spriteIndexes[7], false, 1);
+ _scene->_sequences.setPosition(_globals._sequenceIndexes[7], Common::Point(141, 97));
+ _scene->_sequences.setDepth(_globals._sequenceIndexes[7], 15);
+ _globals._sequenceIndexes[8] = _scene->_sequences.startCycle(_globals._spriteIndexes[8], false, 1);
+ _scene->_sequences.setPosition(_globals._sequenceIndexes[8], Common::Point(144, 126));
+ _scene->_sequences.setDepth(_globals._sequenceIndexes[8], 5);
+ }
+}
+
+void Scene608::handleThrowingBone() {
+ switch (_game._trigger) {
+ case 0:
+ _game._player._stepEnabled = false;
+ setCarAnimations();
+ _scene->_sequences.remove(_globals._sequenceIndexes[5]);
+ _animationMode = -1;
+ _game._player._visible = false;
+ _carMode = _throwMode;
+ if (_throwMode == 4)
+ _scene->loadAnimation(formAnimName('X', 2), 1);
+ else if (_throwMode == 5)
+ _scene->loadAnimation(formAnimName('X', 1), 1);
+ else
+ _scene->loadAnimation(formAnimName('X', 3), 1);
+ break;
+
+ case 1:
+ _nextTrigger = 1;
+ _scene->_sequences.addTimer(1, 2);
+ break;
+
+ case 2:
+ if (_nextTrigger != 2)
+ _scene->_sequences.addTimer(1, 2);
+ else {
+ if (_game._objects.isInInventory(OBJ_BONE))
+ _game._objects.setRoom(OBJ_BONE, 1);
+ else {
+ _game._objects.setRoom(OBJ_BONES, 1);
+ _game._objects.addToInventory(OBJ_BONE);
+ }
+ _scene->_sequences.addTimer(60, 3);
+ }
+ break;
+
+ case 3:
+ if (_throwMode != 6) {
+ _scene->_kernelMessages.reset();
+ _scene->_kernelMessages.add(Common::Point(0, 0), 0x1110, 34, 0, 120, _game.getQuote(0x304));
+ _scene->_sequences.addTimer(120, 4);
+ } else
+ restoreAnimations();
+ break;
+
+ case 4:
+ restoreAnimations();
+ break;
+
+ default:
+ break;
+ }
+}
+
+void Scene608::enter() {
+ _globals._spriteIndexes[2] = _scene->_sprites.addSprites("*RXMRD_7");
+ _globals._spriteIndexes[3] = _scene->_sprites.addSprites("*RXMRC_9");
+ _globals._spriteIndexes[6] = _scene->_sprites.addSprites(formAnimName('c', 2));
+ _globals._spriteIndexes[7] = _scene->_sprites.addSprites(formAnimName('c', 0));
+ _globals._spriteIndexes[8] = _scene->_sprites.addSprites(formAnimName('c', 1));
+
+ if (_game._objects.isInRoom(OBJ_POLYCEMENT)) {
+ _globals._spriteIndexes[1] = _scene->_sprites.addSprites(formAnimName('g', -1));
+ _globals._sequenceIndexes[1] = _scene->_sequences.startCycle(_globals._spriteIndexes[1], false, 1);
+ int idx = _scene->_dynamicHotspots.add(NOUN_POLYCEMENT, VERB_WALKTO, _globals._sequenceIndexes[1], Common::Rect(0, 0, 0, 0));
+ _polycementHotspotId = _scene->_dynamicHotspots.setPosition(idx, Common::Point(249, 129), FACING_NORTHEAST);
+ _scene->_sequences.setDepth(_globals._sequenceIndexes[1], 6);
+ }
+
+ if (_game._objects.isInRoom(OBJ_REARVIEW_MIRROR)) {
+ _globals._spriteIndexes[12] = _scene->_sprites.addSprites(formAnimName('m', -1));
+ _globals._sequenceIndexes[12] = _scene->_sequences.startCycle(_globals._spriteIndexes[12], false, 1);
+ int idx = _scene->_dynamicHotspots.add(NOUN_REARVIEW_MIRROR, VERB_WALKTO, _globals._sequenceIndexes[12], Common::Rect(0, 0, 0, 0));
+ _scene->_dynamicHotspots.setPosition(idx, Common::Point(71, 113), FACING_NORTHEAST);
+ _scene->_sequences.setDepth(_globals._sequenceIndexes[12], 15);
+ }
+
+ if (_game._difficulty == DIFFICULTY_HARD) {
+ _globals._spriteIndexes[9] = _scene->_sprites.addSprites(formAnimName('g', 0));
+ _globals._spriteIndexes[4] = _scene->_sprites.addSprites(formAnimName('g', 1));
+ _globals._spriteIndexes[5] = _scene->_sprites.addSprites(formAnimName('g', 2));
+ _globals._spriteIndexes[10] = _scene->_sprites.addSprites(formAnimName('h', 2));
+ _globals._spriteIndexes[11] = _scene->_sprites.addSprites(formAnimName('h', 3));
+ _rexBeingEaten = false;
+
+ if (!_game._visitedScenes._sceneRevisited) {
+ _globals[kDogStatus] = DOG_GONE;
+ _dogActiveFl = true;
+ } else
+ _dogActiveFl = (_globals[kDogStatus] != DOG_DEAD);
+ } else {
+ _globals[kDogStatus] = DOG_DEAD;
+ _dogActiveFl = false;
+ }
+
+ _dogSquashFl = false;
+ _buttonPressedonTimeFl = false;
+ _dogWindowTimer = 0;
+ _dogRunTimer = 0;
+ _dogHitWindow = false;
+ _checkFl = false;
+ _dogUnderCar = false;
+ _dogYelping = false;
+
+
+ if (!_game._visitedScenes._sceneRevisited)
+ _globals[kCarStatus] = CAR_UP;
+
+ _animationMode = 0;
+ _carMoveMode = 0;
+ _carFrame = -1;
+
+ if (_globals[kCarStatus] == CAR_UP) {
+ _carMode = 0;
+ _dogDeathMode = 0;
+ _resetPositionsFl = false;
+ int idx = _scene->_dynamicHotspots.add(NOUN_CAR, VERB_WALKTO, -1, Common::Rect(99, 69, 99 + 82, 69 + 25));
+ _carHotspotId = _scene->_dynamicHotspots.setPosition(idx, Common::Point(96, 132), FACING_NORTHEAST);
+ _scene->loadAnimation(formAnimName('A', -1));
+ } else if (_globals[kCarStatus] == CAR_DOWN) {
+ _carMode = 0;
+ _dogDeathMode = 0;
+ _resetPositionsFl = false;
+ int idx = _scene->_dynamicHotspots.add(NOUN_CAR, VERB_WALKTO, -1, Common::Rect(100, 100, 100 + 82, 100 + 25));
+ _carHotspotId = _scene->_dynamicHotspots.setPosition(idx, Common::Point(96, 132), FACING_NORTHEAST);
+ _scene->loadAnimation(formAnimName('A', -1));
+ _scene->_activeAnimation->setCurrentFrame(6);
+ } else if (_globals[kCarStatus] == CAR_SQUASHES_DOG) {
+ _carMode = 2;
+ _dogDeathMode = 0;
+ _resetPositionsFl = false;
+ int idx = _scene->_dynamicHotspots.add(NOUN_CAR, VERB_WALKTO, -1, Common::Rect(99, 69, 99 + 82, 69 + 25));
+ _carHotspotId = _scene->_dynamicHotspots.setPosition(idx, Common::Point(96, 132), FACING_NORTHEAST);
+ _scene->loadAnimation(formAnimName('C', -1));
+ } else if (_globals[kCarStatus] == CAR_SQUASHES_DOG_AGAIN) {
+ _carMode = 1;
+ _dogDeathMode = 2;
+ _resetPositionsFl = true;
+ int idx = _scene->_dynamicHotspots.add(NOUN_CAR, VERB_WALKTO, -1, Common::Rect(99, 69, 99 + 82, 69 + 25));
+ _carHotspotId = _scene->_dynamicHotspots.setPosition(idx, Common::Point(96, 132), FACING_NORTHEAST);
+ _scene->loadAnimation(formAnimName('B', -1));
+ } else {
+ _carMode = 3;
+ _dogDeathMode = 2;
+ _resetPositionsFl = true;
+ int idx = _scene->_dynamicHotspots.add(NOUN_CAR, VERB_WALKTO, -1, Common::Rect(100, 100, 100 + 82, 100 + 25));
+ _carHotspotId = _scene->_dynamicHotspots.setPosition(idx, Common::Point(96, 132), FACING_NORTHEAST);
+ _scene->loadAnimation(formAnimName('D', -1));
+ }
+
+ _vm->_palette->setEntry(252, 63, 44, 30);
+ _vm->_palette->setEntry(253, 63, 20, 22);
+
+ if (_scene->_priorSceneId != -2) {
+ _game._player._playerPos = Common::Point(46, 132);
+ _game._player._facing = FACING_EAST;
+ if (_game._difficulty == DIFFICULTY_HARD) {
+ if (!_game._visitedScenes._sceneRevisited)
+ _dogFirstEncounter = true;
+ else if (_dogActiveFl)
+ resetDogVariables();
+ }
+ } else if ((_game._difficulty == DIFFICULTY_HARD) && !_dogFirstEncounter && _dogActiveFl) {
+ if (!_dogUnderCar)
+ resetDogVariables();
+ else {
+ _globals._sequenceIndexes[10] = _scene->_sequences.startReverseCycle(_globals._spriteIndexes[10], false, 9, 0, 0, 0);
+ _scene->_sequences.setAnimRange(_globals._sequenceIndexes[10], 10, 11);
+ _scene->_sequences.setDepth(_globals._sequenceIndexes[10], 6);
+ }
+ }
+
+ sceneEntrySound();
+
+ if (_scene->_roomChanged)
+ _game._objects.addToInventory(OBJ_BONES);
+
+ _game.loadQuoteSet(0x2FB, 0x2FC, 0x2FE, 0x2FD, 0x2FF, 0x300, 0x301, 0x302, 0x303, 0x304, 0);
+}
+
+void Scene608::step() {
+ if (_dogFirstEncounter) {
+ long diff = _scene->_frameStartTime - _dogTimer1;
+ if ((diff >= 0) && (diff <= 1))
+ _dogWindowTimer += diff;
+ else
+ _dogWindowTimer++;
+
+ _dogTimer1 = _scene->_frameStartTime;
+ }
+
+ if (_dogActiveFl && (_dogWindowTimer >= 2) && !_dogHitWindow) {
+ _dogHitWindow = true;
+ _globals._sequenceIndexes[4] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[4], false, 11, 1, 0, 0);
+ _scene->_sequences.setDepth(_globals._sequenceIndexes[4], 1);
+ _vm->_sound->command(14);
+ _scene->_sequences.addSubEntry(_globals._sequenceIndexes[4], SEQUENCE_TRIGGER_EXPIRE, 0, 70);
+ _dogWindowTimer = 0;
+ }
+
+ if (_game._trigger == 70)
+ resetDogVariables();
+
+ if ((_game._difficulty == DIFFICULTY_HARD) && !_animationMode && _dogActiveFl && !_dogFirstEncounter && !_dogUnderCar) {
+ if (!_dogBarkingFl) {
+ if (_vm->getRandomNumber(1, 50) == 10) {
+ _dogBarkingFl = true;
+ _scene->_sequences.remove(_globals._sequenceIndexes[5]);
+ _globals._sequenceIndexes[5] = _scene->_sequences.startReverseCycle(_globals._spriteIndexes[5], false, 5, 8, 0, 0);
+ _scene->_sequences.setDepth(_globals._sequenceIndexes[5], 4);
+ int idx = _scene->_dynamicHotspots.add(NOUN_OBNOXIOUS_DOG, VERB_WALKTO, _globals._sequenceIndexes[5], Common::Rect(0, 0, 0, 0));
+ _scene->_dynamicHotspots.setPosition(idx, Common::Point(194, 142), FACING_EAST);
+ _barkCount = 0;
+ _scene->_sequences.addSubEntry(_globals._sequenceIndexes[5], SEQUENCE_TRIGGER_SPRITE, 2, 100);
+ _scene->_sequences.addSubEntry(_globals._sequenceIndexes[5], SEQUENCE_TRIGGER_EXPIRE, 0, 60);
+ }
+ } else if (_game._trigger == 60) {
+ int syncIdx = _globals._sequenceIndexes[5];
+ _globals._sequenceIndexes[5] = _scene->_sequences.startCycle(_globals._spriteIndexes[5], false, 1);
+ _scene->_sequences.setDepth(_globals._sequenceIndexes[5], 6);
+ _scene->_sequences.updateTimeout(_globals._sequenceIndexes[5], syncIdx);
+ _scene->_kernelMessages.reset();
+ _dogBarkingFl = false;
+ }
+ }
+
+ if ((_game._trigger == 100) && _dogBarkingFl) {
+ _vm->_sound->command(12);
+ _barkCount++;
+
+ if ((_barkCount >= 1) && (_barkCount <= 4)) {
+ Common::Point _barkPos(0, 0);
+ switch (_barkCount) {
+ case 1:
+ _barkPos = Common::Point(197, 66);
+ break;
+
+ case 2:
+ _barkPos = Common::Point(230, 76);
+ break;
+
+ case 3:
+ _barkPos = Common::Point(197, 86);
+ break;
+
+ case 4:
+ _barkPos = Common::Point(230, 97);
+ break;
+
+ default:
+ break;
+ }
+ _scene->_kernelMessages.add(_barkPos, 0xFDFC, 0, 0, 120, _game.getQuote(0x2FB));
+ }
+ }
+
+ if (_dogSquashFl && !_dogFirstEncounter && _dogUnderCar && _dogActiveFl) {
+ long diff = _scene->_frameStartTime - _dogTimer2;
+ if ((diff >= 0) && (diff <= 4))
+ _dogRunTimer += diff;
+ else
+ _dogRunTimer++;
+
+ _dogTimer2 = _scene->_frameStartTime;
+ }
+
+ if (_dogRunTimer >= 480 && !_checkFl && !_buttonPressedonTimeFl && !_dogFirstEncounter && _dogUnderCar && _dogActiveFl) {
+ _checkFl = true;
+ _dogSquashFl = false;
+ _dogSafeFl = true;
+ _checkFl = false;
+ _dogRunTimer = 0;
+ } else {
+ _dogSafeFl = false;
+ if (_game._player._moving && (_game._difficulty == DIFFICULTY_HARD) && _dogActiveFl && (_scene->_rails.getNext() > 0) && _dogUnderCar)
+ _dogSafeFl = true;
+ }
+
+ if (_dogActiveFl && _dogSafeFl && !_buttonPressedonTimeFl) {
+ _dogDeathMode = 0;
+ _globals[kCarStatus] = CAR_UP;
+ _carMode = 0;
+ _scene->_sequences.remove(_globals._sequenceIndexes[10]);
+ _dogUnderCar = false;
+ _dogYelping = false;
+ _scene->_kernelMessages.reset();
+ _globals._sequenceIndexes[11] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[11], false, 6, 1, 0, 0);
+ _scene->_sequences.addSubEntry(_globals._sequenceIndexes[11], SEQUENCE_TRIGGER_EXPIRE, 0, 92);
+ _scene->_kernelMessages.add(Common::Point(0, 0), 0x1110, 34, 0, 120, _game.getQuote(0x2FF));
+ }
+
+ if (_game._trigger == 92) {
+ resetDogVariables();
+ _animationMode = 0;
+ }
+
+ if ((_carMode == 4) && (_scene->_activeAnimation != nullptr)) {
+ if (_scene->_activeAnimation->getCurrentFrame() != _carFrame) {
+ _carFrame = _scene->_activeAnimation->getCurrentFrame();
+
+ if (_carFrame == 10) {
+ _game._player._visible = true;
+ _game._player._priorTimer = _scene->_activeAnimation->getNextFrameTimer() - _game._player._ticksAmount;
+ } else if (_carFrame == 56) {
+ resetDogVariables();
+ _animationMode = 0;
+ _nextTrigger = 2;
+ }
+ }
+ }
+
+ if ((_carMode == 5) && (_scene->_activeAnimation != nullptr)) {
+ if (_scene->_activeAnimation->getCurrentFrame() != _carFrame) {
+ _carFrame = _scene->_activeAnimation->getCurrentFrame();
+ if (_carFrame == 10) {
+ _game._player._visible = true;
+ _game._player._priorTimer = _scene->_activeAnimation->getNextFrameTimer() - _game._player._ticksAmount;
+ } else if (_carFrame == 52) {
+ resetDogVariables();
+ _animationMode = 0;
+ _nextTrigger = 2;
+ }
+ }
+ }
+
+ if ((_carMode == 6) && (_scene->_activeAnimation != nullptr)) {
+ if (_scene->_activeAnimation->getCurrentFrame() != _carFrame) {
+ _carFrame = _scene->_activeAnimation->getCurrentFrame();
+
+ if (_carFrame == 11) {
+ _game._player._visible = true;
+ _game._player._priorTimer = _scene->_activeAnimation->getNextFrameTimer() - _game._player._ticksAmount;
+ } else if (_carFrame == 41) {
+ _globals._sequenceIndexes[10] = _scene->_sequences.startReverseCycle(_globals._spriteIndexes[10], false, 9, 0, 0, 0);
+ _scene->_sequences.setAnimRange(_globals._sequenceIndexes[10], 10, 11);
+ _scene->_sequences.setDepth(_globals._sequenceIndexes[10], 6);
+ _dogUnderCar = true;
+ _nextTrigger = 2;
+ }
+ }
+ }
+
+ if (_dogUnderCar) {
+ if (!_dogYelping) {
+ if (_vm->getRandomNumber(1, 50) == 10) {
+ _dogYelping = true;
+ _barkCount = 0;
+ _scene->_sequences.addTimer(12, 110);
+ _scene->_sequences.addTimer(22, 111);
+ _scene->_sequences.addTimer(120, 112);
+ }
+ _scene->_kernelMessages.reset();
+ }
+ } else
+ _dogYelping = false;
+
+ if (_game._trigger == 110) {
+ _vm->_sound->command(12);
+ _scene->_kernelMessages.add(Common::Point(150, 97), 0xFDFC, 0, 0, 60, _game.getQuote(0x303));
+ }
+
+ if (_game._trigger == 111) {
+ _vm->_sound->command(12);
+ _scene->_kernelMessages.add(Common::Point(183, 93), 0xFDFC, 0, 0, 60, _game.getQuote(0x303));
+ }
+
+ if (_game._trigger == 112)
+ _dogYelping = false;
+
+ if ((_carMode == 0) && (_scene->_activeAnimation != nullptr)) {
+ if (_scene->_activeAnimation->getCurrentFrame() != _carFrame) {
+ _carFrame = _scene->_activeAnimation->getCurrentFrame();
+ int nextFrame = -1;
+
+ if ((_globals[kCarStatus] == CAR_UP) || (_globals[kCarStatus] == CAR_DOWN)) {
+ switch (_carMoveMode) {
+ case 0:
+ if (_globals[kCarStatus] == CAR_UP)
+ nextFrame = 0;
+ else
+ nextFrame = 6;
+ break;
+
+ case 1:
+ if (_scene->_activeAnimation->getCurrentFrame() >= 12) {
+ nextFrame = 0;
+ _carMoveMode = 0;
+ _globals[kCarStatus] = CAR_UP;
+ }
+ break;
+
+ case 2:
+ if (_scene->_activeAnimation->getCurrentFrame() >= 6) {
+ nextFrame = 6;
+ _carMoveMode = 0;
+ _globals[kCarStatus] = CAR_DOWN;
+ }
+ break;
+
+ default:
+ break;
+ }
+ }
+
+ if ((nextFrame >= 0) && (nextFrame != _scene->_activeAnimation->getCurrentFrame())) {
+ _scene->_activeAnimation->setCurrentFrame(nextFrame);
+ _carFrame = nextFrame;
+ }
+ }
+ }
+
+ if ((_carMode == 2) && (_scene->_activeAnimation != nullptr)) {
+ if (_scene->_activeAnimation->getCurrentFrame() != _carFrame) {
+ _carFrame = _scene->_activeAnimation->getCurrentFrame();
+ int nextFrame = -1;
+
+ if (_carMoveMode == 0)
+ nextFrame = 28;
+ else if (_scene->_activeAnimation->getCurrentFrame() >= 28) {
+ nextFrame = 28;
+ _carMoveMode = 0;
+ }
+
+ if ((nextFrame >= 0) && (nextFrame != _scene->_activeAnimation->getCurrentFrame())) {
+ _scene->_activeAnimation->setCurrentFrame(nextFrame);
+ _carFrame = nextFrame;
+ }
+ }
+ }
+
+ if ((_carMode == 3) && (_scene->_activeAnimation != nullptr)) {
+ if (_scene->_activeAnimation->getCurrentFrame() != _carFrame) {
+ _carFrame = _scene->_activeAnimation->getCurrentFrame();
+ int nextFrame = -1;
+
+ if (_resetPositionsFl) {
+ nextFrame = 0;
+ _carMoveMode = 0;
+ } else if (_carMoveMode == 0)
+ nextFrame = 6;
+ else if (_scene->_activeAnimation->getCurrentFrame() >= 6) {
+ nextFrame = 6;
+ _carMoveMode = 0;
+ }
+
+ if ((nextFrame >= 0) && (nextFrame != _scene->_activeAnimation->getCurrentFrame())) {
+ _scene->_activeAnimation->setCurrentFrame(nextFrame);
+ _carFrame = nextFrame;
+ }
+ }
+ }
+
+
+ if ((_carMode == 1) && (_scene->_activeAnimation != nullptr)) {
+ if (_scene->_activeAnimation->getCurrentFrame() != _carFrame) {
+ _carFrame = _scene->_activeAnimation->getCurrentFrame();
+ int nextFrame = -1;
+
+ if (_resetPositionsFl) {
+ nextFrame = 0;
+ _carMoveMode = 0;
+ } else if (_carMoveMode == 0)
+ nextFrame = 6;
+ else if (_scene->_activeAnimation->getCurrentFrame() >= 6) {
+ nextFrame = 6;
+ _carMoveMode = 0;
+ }
+
+ if ((nextFrame >= 0) && (nextFrame != _scene->_activeAnimation->getCurrentFrame())) {
+ _scene->_activeAnimation->setCurrentFrame(nextFrame);
+ _carFrame = nextFrame;
+ }
+ }
+ }
+
+ if (_game._player._moving && (_game._difficulty == DIFFICULTY_HARD) && _dogActiveFl && (_scene->_rails.getNext() > 0)) {
+ _game._player.cancelCommand();
+ _game._player.startWalking(Common::Point(194, 142), FACING_EAST);
+ _scene->_rails.resetNext();
+ if (_dogUnderCar)
+ _dogSafeFl = true;
+ }
+
+ if (_game._player._special > 0 && (_game._difficulty == DIFFICULTY_HARD) && _dogActiveFl && _game._player._stepEnabled)
+ _game._player._stepEnabled = false;
+
+ if ((_game._difficulty == DIFFICULTY_HARD) && _dogActiveFl && (_game._player._playerPos == Common::Point(194, 142))
+ && (_game._trigger || !_rexBeingEaten)) {
+ _rexBeingEaten = true;
+ switch (_game._trigger) {
+ case 0:
+ _scene->_sequences.remove(_globals._sequenceIndexes[5]);
+ _animationMode = 1;
+ _globals._sequenceIndexes[9] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[9], false, 10, 1, 0, 0);
+ _scene->_sequences.setAnimRange(_globals._sequenceIndexes[9], 1, 2);
+ _scene->_sequences.setDepth(_globals._sequenceIndexes[9], 5);
+ _scene->_sequences.addSubEntry(_globals._sequenceIndexes[9], SEQUENCE_TRIGGER_EXPIRE, 0, 80);
+ _scene->_sequences.addTimer(10, 85);
+ break;
+
+ case 80:
+ _game._player._visible = false;
+ _globals._sequenceIndexes[9] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[9], false, 10, 1, 0, 0);
+ _scene->_sequences.setAnimRange(_globals._sequenceIndexes[9], 3, 5);
+ _scene->_sequences.setDepth(_globals._sequenceIndexes[9], 5);
+ _scene->_sequences.updateTimeout(_globals._sequenceIndexes[9], -1);
+ _scene->_kernelMessages.reset();
+ _scene->_kernelMessages.add(Common::Point(0, 0), 0x1110, 34, 0, 120, _game.getQuote(0x2FC));
+ _scene->_sequences.addSubEntry(_globals._sequenceIndexes[9], SEQUENCE_TRIGGER_EXPIRE, 0, 81);
+ break;
+
+ case 81: {
+ int syncIdx = _globals._sequenceIndexes[9];
+ _globals._sequenceIndexes[9] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[9], false, 5, 1, 0, 0);
+ _scene->_sequences.setAnimRange(_globals._sequenceIndexes[9], 6, 38);
+ _scene->_sequences.setDepth(_globals._sequenceIndexes[9], 5);
+ _scene->_sequences.updateTimeout(_globals._sequenceIndexes[9], syncIdx);
+ _scene->_sequences.addSubEntry(_globals._sequenceIndexes[9], SEQUENCE_TRIGGER_EXPIRE, 0, 82);
+ }
+ break;
+
+ case 82: {
+ int syncIdx = _globals._sequenceIndexes[9];
+ _globals._sequenceIndexes[9] = _scene->_sequences.startReverseCycle(_globals._spriteIndexes[9], false, 15, 5, 0, 0);
+ _scene->_sequences.setAnimRange(_globals._sequenceIndexes[9], 39, 40);
+ _scene->_sequences.setDepth(_globals._sequenceIndexes[9], 5);
+ _scene->_sequences.updateTimeout(_globals._sequenceIndexes[9], syncIdx);
+ _scene->_sequences.addSubEntry(_globals._sequenceIndexes[9], SEQUENCE_TRIGGER_EXPIRE, 0, 83);
+ }
+ break;
+
+ case 83: {
+ _animationMode = 2;
+ int syncIdx = _globals._sequenceIndexes[9];
+ _globals._sequenceIndexes[9] = _scene->_sequences.startCycle(_globals._spriteIndexes[9], false, -2);
+ _scene->_sequences.setDepth(_globals._sequenceIndexes[9], 5);
+ _scene->_sequences.updateTimeout(_globals._sequenceIndexes[9], syncIdx);
+ _scene->_sequences.addTimer(60, 84);
+ }
+ break;
+
+ case 84:
+ _rexBeingEaten = false;
+ _animationMode = 0;
+ _scene->_reloadSceneFlag = true;
+ _game._player._stepEnabled = true;
+ break;
+
+ case 85:
+ if (_rexBeingEaten && (_animationMode == 1)) {
+ _vm->_sound->command(12);
+ _scene->_sequences.addTimer(10, 85);
+ }
+ break;
+
+ default:
+ break;
+ }
+ }
+}
+
+void Scene608::preActions() {
+ _game._triggerSetupMode = SEQUENCE_TRIGGER_DAEMON;
+
+ if ((_action.isAction(VERB_THROW, NOUN_BONE, NOUN_REAR_OF_GARAGE) || _action.isAction(VERB_THROW, NOUN_BONES, NOUN_REAR_OF_GARAGE)
+ || _action.isAction(VERB_THROW, NOUN_BONE, NOUN_FRONT_OF_GARAGE) || _action.isAction(VERB_THROW, NOUN_BONES, NOUN_FRONT_OF_GARAGE)
+ || _action.isAction(VERB_THROW, NOUN_BONES, NOUN_OBNOXIOUS_DOG) || _action.isAction(VERB_THROW, NOUN_BONE, NOUN_OBNOXIOUS_DOG)) && _dogActiveFl) {
+ _game._player._stepEnabled = false;
+ _game._player.walk(Common::Point(56, 146), FACING_EAST);
+ }
+
+ if ((_action.isAction(VERB_THROW, NOUN_BONES, NOUN_AREA_BEHIND_CAR) || _action.isAction(VERB_THROW, NOUN_BONE, NOUN_AREA_BEHIND_CAR)
+ || _action.isAction(VERB_THROW, NOUN_BONES, NOUN_DANGER_ZONE) || _action.isAction(VERB_THROW, NOUN_BONE, NOUN_DANGER_ZONE)) && _dogActiveFl) {
+ _game._player._stepEnabled = false;
+ _game._player.walk(Common::Point(75, 136), FACING_EAST);
+ }
+
+ if (_action.isAction(VERB_PUSH, NOUN_DOWN_BUTTON) && _dogUnderCar) {
+ _buttonPressedonTimeFl = true;
+ _dogDeathMode = 1;
+ } else
+ _buttonPressedonTimeFl = false;
+}
+
+void Scene608::actions() {
+ if (_action.isAction(VERB_WALK_THROUGH, NOUN_DOORWAY))
+ _scene->_nextSceneId = 607;
+ else if (_action.isAction(VERB_PUSH, NOUN_DOWN_BUTTON)) {
+ _game._player._stepEnabled = true;
+ switch (_game._trigger) {
+ case 0:
+ if ((_globals[kCarStatus] == CAR_UP) || (_globals[kCarStatus] == CAR_SQUASHES_DOG) || (_globals[kCarStatus] == CAR_SQUASHES_DOG_AGAIN)) {
+ _game._player._stepEnabled = false;
+ _game._player._visible = false;
+ _globals._sequenceIndexes[3] = _scene->_sequences.startReverseCycle(_globals._spriteIndexes[3], true, 6, 2, 0, 0);
+ _scene->_sequences.setAnimRange(_globals._sequenceIndexes[3], 1, 2);
+ _scene->_sequences.setMsgLayout(_globals._sequenceIndexes[3]);
+ _scene->_sequences.addSubEntry(_globals._sequenceIndexes[3], SEQUENCE_TRIGGER_EXPIRE, 0, 1);
+ } else
+ _vm->_dialogs->show(60839);
+ break;
+
+ case 1:
+ _scene->_sequences.updateTimeout(-1, _globals._sequenceIndexes[3]);
+ _game._player._visible = true;
+ if (_dogDeathMode == 0)
+ _carMode = 0;
+ else if (_dogDeathMode == 1) {
+ _scene->_kernelMessages.reset();
+ _scene->_kernelMessages.add(Common::Point(0, 0), 0x1110, 34, 0, 120, _game.getQuote(0x300));
+ _globals[kCarStatus] = CAR_SQUASHES_DOG;
+ _carMode = 2;
+ _globals[kDogStatus] = DOG_DEAD;
+ _dogActiveFl = false;
+ _dogUnderCar = false;
+ _scene->_sequences.remove(_globals._sequenceIndexes[10]);
+ _scene->freeAnimation();
+ _scene->loadAnimation(formAnimName('C', -1));
+ } else {
+ _resetPositionsFl = false;
+ _carMode = 1;
+ _scene->freeAnimation();
+ _scene->loadAnimation(formAnimName('B', -1));
+ }
+
+ _carMoveMode = 2;
+ _scene->_sequences.addTimer(1, 2);
+ break;
+
+ case 2:
+ if (_carMoveMode != 0)
+ _scene->_sequences.addTimer(1, 2);
+ else {
+ _scene->_dynamicHotspots.remove(_carHotspotId);
+ int idx = _scene->_dynamicHotspots.add(NOUN_CAR, VERB_WALKTO, -1, Common::Rect(100, 100, 100 + 82, 100 + 25));
+ _carHotspotId = _scene->_dynamicHotspots.setPosition(idx, Common::Point(96, 132), FACING_NORTHEAST);
+ if (_globals[kCarStatus] == CAR_SQUASHES_DOG)
+ _scene->_sequences.addTimer(120, 3);
+ else {
+ if (_dogDeathMode == 0)
+ _globals[kCarStatus] = CAR_DOWN;
+ else {
+ _globals[kCarStatus] = CAR_DOWN_ON_SQUASHED_DOG;
+ _carMode = 3;
+ _dogDeathMode = 2;
+ }
+ _game._player._stepEnabled = true;
+ }
+ }
+ break;
+
+ case 3:
+ _scene->_kernelMessages.add(Common::Point(0, 0), 0x1110, 34, 0, 120, _game.getQuote(0x302));
+ _globals[kCarStatus] = CAR_DOWN_ON_SQUASHED_DOG;
+ _carMode = 3;
+ _dogDeathMode = 2;
+ _game._player._stepEnabled = true;
+ break;
+
+ default:
+ break;
+ }
+ } else if (_action.isAction(VERB_PUSH, NOUN_UP_BUTTON)) {
+ switch (_game._trigger) {
+ case 0:
+ if ((_globals[kCarStatus] == CAR_DOWN) || (_globals[kCarStatus] == CAR_DOWN_ON_SQUASHED_DOG)) {
+ _game._player._stepEnabled = false;
+ _game._player._visible = false;
+ _globals._sequenceIndexes[3] = _scene->_sequences.startReverseCycle(_globals._spriteIndexes[3], true, 6, 2, 0, 0);
+ _scene->_sequences.setAnimRange(_globals._sequenceIndexes[3], 1, 3);
+ _scene->_sequences.setMsgLayout(_globals._sequenceIndexes[3]);
+ _scene->_sequences.addSubEntry(_globals._sequenceIndexes[3], SEQUENCE_TRIGGER_EXPIRE, 0, 1);
+ } else
+ _vm->_dialogs->show(60840);
+ break;
+
+ case 1:
+ _scene->_sequences.updateTimeout(-1, _globals._sequenceIndexes[3]);
+ _game._player._visible = true;
+ if (_dogDeathMode == 0)
+ _carMode = 0;
+ else {
+ _carMode = 3;
+ _resetPositionsFl = false;
+ _scene->freeAnimation();
+ _scene->loadAnimation(formAnimName('D', -1));
+ }
+ _carMoveMode = 1;
+ _scene->_sequences.addTimer(1, 2);
+ break;
+
+ case 2: {
+ if (_carMoveMode != 0)
+ _scene->_sequences.addTimer(1, 2);
+ else if (_dogDeathMode == 0)
+ _globals[kCarStatus] = CAR_UP;
+ else if (_dogDeathMode == 2) {
+ _globals[kCarStatus] = CAR_SQUASHES_DOG_AGAIN;
+ _carMode = 3;
+ _dogDeathMode = 2;
+ }
+ _scene->_dynamicHotspots.remove(_carHotspotId);
+ int idx = _scene->_dynamicHotspots.add(NOUN_CAR, VERB_WALKTO, -1, Common::Rect(99, 69, 99 + 82, 69 + 25));
+ _carHotspotId = _scene->_dynamicHotspots.setPosition(idx, Common::Point(96, 132), FACING_NORTHEAST);
+ _game._player._stepEnabled = true;
+ }
+ break;
+
+ default:
+ break;
+ }
+ } else if (_action.isAction(VERB_THROW, NOUN_BONE, NOUN_REAR_OF_GARAGE) || _action.isAction(VERB_THROW, NOUN_BONES, NOUN_REAR_OF_GARAGE)
+ || _action.isAction(VERB_THROW, NOUN_BONES, NOUN_OBNOXIOUS_DOG) || _action.isAction(VERB_THROW, NOUN_BONE, NOUN_OBNOXIOUS_DOG)) {
+ _game._player._stepEnabled = true;
+ if (_dogActiveFl) {
+ if (_game._trigger == 0) {
+ _scene->_kernelMessages.reset();
+ _scene->_kernelMessages.add(Common::Point(0, 0), 0x1110, 34, 0, 120, _game.getQuote(0x2FE));
+ }
+ _throwMode = 4;
+ handleThrowingBone();
+ } else
+ _vm->_dialogs->show(60841);
+ } else if (_action.isAction(VERB_THROW, NOUN_BONE, NOUN_FRONT_OF_GARAGE) || _action.isAction(VERB_THROW, NOUN_BONES, NOUN_FRONT_OF_GARAGE)) {
+ _game._player._stepEnabled = true;
+ if (_dogActiveFl) {
+ if (_game._trigger == 0) {
+ _scene->_kernelMessages.reset();
+ _scene->_kernelMessages.add(Common::Point(0, 0), 0x1110, 34, 0, 120, _game.getQuote(0x2FD));
+ }
+ _throwMode = 5;
+ handleThrowingBone();
+ } else
+ _vm->_dialogs->show(60841);
+ } else if (_action.isAction(VERB_THROW, NOUN_BONES, NOUN_AREA_BEHIND_CAR) || _action.isAction(VERB_THROW, NOUN_BONE, NOUN_AREA_BEHIND_CAR)
+ || _action.isAction(VERB_THROW, NOUN_BONES, NOUN_DANGER_ZONE) || _action.isAction(VERB_THROW, NOUN_BONE, NOUN_DANGER_ZONE)) {
+ _game._player._stepEnabled = true;
+ if ((_globals[kCarStatus] == CAR_UP) && _dogActiveFl) {
+ if (_dogActiveFl) {
+ if (_game._trigger == 0) {
+ _scene->_kernelMessages.reset();
+ _scene->_kernelMessages.add(Common::Point(0, 0), 0x1110, 34, 0, 120, _game.getQuote(0x301));
+ }
+ _throwMode = 6;
+ handleThrowingBone();
+ } else
+ _vm->_dialogs->show(60841);
+ } else
+ _vm->_dialogs->show(60842);
+ } else if (_action.isAction(VERB_TAKE, NOUN_POLYCEMENT) && (_game._trigger || !_game._objects.isInInventory(OBJ_POLYCEMENT))) {
+ switch (_game._trigger) {
+ case 0:
+ _game._player._stepEnabled = false;
+ _game._player._visible = false;
+ _globals._sequenceIndexes[2] = _scene->_sequences.startReverseCycle(_globals._spriteIndexes[2], true, 6, 2, 0, 0);
+ _scene->_sequences.setMsgLayout(_globals._sequenceIndexes[2]);
+ _scene->_sequences.addSubEntry(_globals._sequenceIndexes[2], SEQUENCE_TRIGGER_SPRITE, 4, 1);
+ _scene->_sequences.addSubEntry(_globals._sequenceIndexes[2], SEQUENCE_TRIGGER_EXPIRE, 0, 2);
+ break;
+
+ case 1:
+ _vm->_sound->command(9);
+ _scene->_sequences.remove(_globals._sequenceIndexes[1]);
+ _scene->_dynamicHotspots.remove(_polycementHotspotId);
+ break;
+
+ case 2:
+ _game._objects.addToInventory(OBJ_POLYCEMENT);
+ _scene->_sequences.updateTimeout(-1, _globals._sequenceIndexes[2]);
+ _game._player._visible = true;
+ _game._player._stepEnabled = true;
+ _vm->_dialogs->showItem(OBJ_POLYCEMENT, 60833);
+ break;
+
+ default:
+ break;
+ }
+ } else if (_action.isAction(VERB_TAKE, NOUN_REARVIEW_MIRROR) && (_game._trigger || !_game._objects.isInInventory(OBJ_REARVIEW_MIRROR))) {
+ switch (_game._trigger) {
+ case 0:
+ _game._player._stepEnabled = false;
+ _game._player._visible = false;
+ _globals._sequenceIndexes[2] = _scene->_sequences.startReverseCycle(_globals._spriteIndexes[2], true, 6, 2, 0, 0);
+ _scene->_sequences.setAnimRange(_globals._sequenceIndexes[2], 1, 2);
+ _scene->_sequences.setMsgLayout(_globals._sequenceIndexes[2]);
+ _scene->_sequences.addSubEntry(_globals._sequenceIndexes[2], SEQUENCE_TRIGGER_SPRITE, 2, 1);
+ _scene->_sequences.addSubEntry(_globals._sequenceIndexes[2], SEQUENCE_TRIGGER_EXPIRE, 0, 2);
+ break;
+
+ case 1:
+ _vm->_sound->command(9);
+ _scene->_sequences.remove(_globals._sequenceIndexes[12]);
+ _game._objects.addToInventory(OBJ_REARVIEW_MIRROR);
+ _vm->_dialogs->showItem(OBJ_REARVIEW_MIRROR, 60827);
+ break;
+
+ case 2:
+ _scene->_sequences.updateTimeout(-1, _globals._sequenceIndexes[2]);
+ _game._player._visible = true;
+ _game._player._stepEnabled = true;
+ break;
+
+ default:
+ break;
+ }
+ } else if (_action._lookFlag) {
+ if (_game._difficulty != DIFFICULTY_HARD)
+ _vm->_dialogs->show(60810);
+ else if (_globals[kDogStatus] == DOG_DEAD)
+ _vm->_dialogs->show(60812);
+ else
+ _vm->_dialogs->show(60811);
+ } else if (_action.isAction(VERB_LOOK) && (_action.isObject(NOUN_MUFFLER) || _action.isObject(NOUN_CAR_SEAT) || _action.isObject(NOUN_HUBCAP)
+ || _action.isObject(NOUN_COILS) || _action.isObject(NOUN_QUARTER_PANEL)))
+ _vm->_dialogs->show(60813);
+ else if (_action.isAction(VERB_TAKE) && (_action.isObject(NOUN_MUFFLER) || _action.isObject(NOUN_CAR_SEAT) || _action.isObject(NOUN_HUBCAP)
+ || _action.isObject(NOUN_COILS) || _action.isObject(NOUN_QUARTER_PANEL)))
+ _vm->_dialogs->show(60814);
+ else if (_action.isAction(VERB_LOOK, NOUN_GARAGE_FLOOR) || _action.isAction(VERB_LOOK, NOUN_FRONT_OF_GARAGE) || _action.isAction(VERB_LOOK, NOUN_REAR_OF_GARAGE)) {
+ if (_dogActiveFl)
+ _vm->_dialogs->show(60815);
+ else
+ _vm->_dialogs->show(60816);
+ } else if (_action.isAction(VERB_LOOK, NOUN_SPARE_RIBS))
+ _vm->_dialogs->show(60817);
+ else if (_action.isAction(VERB_TAKE, NOUN_SPARE_RIBS)) {
+ if (_game._difficulty == DIFFICULTY_HARD)
+ _vm->_dialogs->show(60818);
+ else
+ _vm->_dialogs->show(60819);
+ } else if (_action.isAction(VERB_LOOK, NOUN_UP_BUTTON))
+ _vm->_dialogs->show(60820);
+ else if (_action.isAction(VERB_LOOK, NOUN_DOWN_BUTTON))
+ _vm->_dialogs->show(60821);
+ else if (_action.isAction(VERB_LOOK, NOUN_TRASH_CAN))
+ _vm->_dialogs->show(60822);
+ else if (_action.isAction(VERB_LOOK, NOUN_CALENDAR))
+ _vm->_dialogs->show(60823);
+ else if (_action.isAction(VERB_LOOK, NOUN_STORAGE_BOX)) {
+ if (_game._objects[OBJ_REARVIEW_MIRROR]._roomNumber == _scene->_currentSceneId)
+ _vm->_dialogs->show(60825);
+ else
+ _vm->_dialogs->show(60824);
+ } else if (_action.isAction(VERB_OPEN, NOUN_STORAGE_BOX))
+ _vm->_dialogs->show(60826);
+ else if (_action.isAction(VERB_LOOK, NOUN_REARVIEW_MIRROR) && (_action._mainObjectSource == 4))
+ _vm->_dialogs->show(60828);
+ else if (_action.isAction(VERB_LOOK, NOUN_TOOL_BOX)) {
+ if (_game._objects[OBJ_POLYCEMENT]._roomNumber == _scene->_currentSceneId)
+ _vm->_dialogs->show(60829);
+ else
+ _vm->_dialogs->show(60830);
+ } else if (_action.isAction(VERB_OPEN, NOUN_TOOL_BOX))
+ _vm->_dialogs->show(60831);
+ else if ((_action.isAction(VERB_LOOK, NOUN_POLYCEMENT)) && (_game._objects.isInRoom(OBJ_POLYCEMENT)))
+ _vm->_dialogs->show(60832);
+ else if (_action.isAction(VERB_LOOK, NOUN_GREASE_CAN) || _action.isAction(VERB_LOOK, NOUN_OIL_CAN))
+ _vm->_dialogs->show(60834);
+ else if (_action.isAction(VERB_LOOK, NOUN_CAR_LIFT))
+ _vm->_dialogs->show(60835);
+ else if (_action.isAction(VERB_LOOK, NOUN_CHAIR) || _action.isAction(VERB_LOOK, NOUN_HAT))
+ _vm->_dialogs->show(60836);
+ else if (_action.isAction(VERB_LOOK, NOUN_DANGER_ZONE))
+ _vm->_dialogs->show(60838);
+ else
+ return;
+
+ _action._inProgress = false;
+}
+
+/*------------------------------------------------------------------------*/
+
+Scene609::Scene609(MADSEngine *vm) : Scene6xx(vm) {
+ _videoDoorMode = -1;
+}
+
+void Scene609::synchronize(Common::Serializer &s) {
+ Scene6xx::synchronize(s);
+
+ s.syncAsSint16LE(_videoDoorMode);
+}
+
+void Scene609::setup() {
+ setPlayerSpritesPrefix();
+ setAAName();
+}
+
+void Scene609::enter() {
+ _globals._spriteIndexes[1] = _scene->_sprites.addSprites(formAnimName('c', 0));
+ _globals._spriteIndexes[2] = _scene->_sprites.addSprites(formAnimName('x', 0));
+ _globals._spriteIndexes[3] = _scene->_sprites.addSprites(formAnimName('h', 0));
+ _globals._spriteIndexes[4] = _scene->_sprites.addSprites("*RXCD_9");
+ _globals._spriteIndexes[5] = _scene->_sprites.addSprites("*RXMRC_9");
+
+ _globals._sequenceIndexes[1] = _scene->_sequences.startCycle(_globals._spriteIndexes[1], false, -2);
+ _scene->_sequences.setDepth(_globals._sequenceIndexes[1], 5);
+ _globals._sequenceIndexes[2] = _scene->_sequences.startCycle(_globals._spriteIndexes[2], false, -1);
+ _scene->_sequences.setDepth(_globals._sequenceIndexes[2], 9);
+
+ if (!_game._visitedScenes._sceneRevisited)
+ _globals[kBeenInVideoStore] = false;
+
+ if (_scene->_priorSceneId == 611) {
+ _game._player._playerPos = Common::Point(264, 69);
+ _game._player._facing = FACING_SOUTHWEST;
+ } else if (_scene->_priorSceneId == 610) {
+ _game._player._playerPos = Common::Point(23, 90);
+ _game._player._facing = FACING_EAST;
+ _scene->_sequences.addTimer(60, 60);
+ _game._player._stepEnabled = false;
+ } else if (_scene->_priorSceneId != -2) {
+ _game._player._playerPos = Common::Point(86, 136);
+ _game._player._facing = FACING_NORTHEAST;
+ _game._player._visible = false;
+ _game._player._stepEnabled = false;
+ _scene->_sequences.remove(_globals._sequenceIndexes[1]);
+ _globals._sequenceIndexes[1] = _scene->_sequences.startCycle(_globals._spriteIndexes[1], false, -1);
+ _scene->_sequences.setDepth(_globals._sequenceIndexes[1], 5);
+ _scene->loadAnimation(formAnimName('R', 1), 70);
+ }
+
+ if (_scene->_roomChanged) {
+ _game._objects.addToInventory(OBJ_DOOR_KEY);
+ if (_game._difficulty != DIFFICULTY_EASY)
+ _game._objects.addToInventory(OBJ_PENLIGHT);
+ }
+
+ sceneEntrySound();
+ _game.loadQuoteSet(0x305, 0x306, 0x307, 0x308, 0x309, 0);
+}
+
+void Scene609::step() {
+ switch (_game._trigger) {
+ case 60:
+ _game._player._stepEnabled = false;
+ _scene->_sequences.remove(_globals._sequenceIndexes[2]);
+ _globals._sequenceIndexes[2] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[2], false, 7, 1, 0, 0);
+ _scene->_sequences.setDepth(_globals._sequenceIndexes[2], 9);
+ _scene->_sequences.addSubEntry(_globals._sequenceIndexes[2], SEQUENCE_TRIGGER_EXPIRE, 0, 61);
+ break;
+
+ case 61:
+ _scene->_hotspots.activate(NOUN_VIDEO_STORE_DOOR, false);
+ _game._player.walk(Common::Point(101, 100), FACING_EAST);
+ _scene->_sequences.addTimer(180, 62);
+ break;
+
+ case 62:
+ _scene->_sequences.remove( _globals._sequenceIndexes[2]);
+ _globals._sequenceIndexes[2] = _scene->_sequences.startReverseCycle(_globals._spriteIndexes[2], false, 7, 1, 0, 0);
+ _scene->_hotspots.activate(NOUN_VIDEO_STORE_DOOR, true);
+ _scene->_sequences.setDepth(_globals._sequenceIndexes[2], 9);
+ _scene->_sequences.addSubEntry(_globals._sequenceIndexes[2], SEQUENCE_TRIGGER_EXPIRE, 0, 63);
+ break;
+
+ case 63:
+ if (!_globals[kHasTalkedToHermit] && (_game._difficulty != DIFFICULTY_HARD)) {
+ _globals._sequenceIndexes[3] = _scene->_sequences.startReverseCycle(_globals._spriteIndexes[3], false, 26, 2, 0, 0);
+ _scene->_sequences.setDepth(_globals._sequenceIndexes[3], 7);
+ _scene->_sequences.setPosition(_globals._sequenceIndexes[3], Common::Point(287, 73));
+ _scene->_sequences.setScale(_globals._sequenceIndexes[3], 47);
+ }
+ _globals._sequenceIndexes[2] = _scene->_sequences.startCycle(_globals._spriteIndexes[2], false, -1);
+ _scene->_sequences.setDepth(_globals._sequenceIndexes[2], 9);
+ _game._player._stepEnabled = true;
+ break;
+
+ default:
+ break;
+ }
+
+ switch (_game._trigger) {
+ case 70:
+ _game._player._visible = true;
+ _game._player._priorTimer = _scene->_activeAnimation->getNextFrameTimer() - _game._player._ticksAmount;
+ _scene->_sequences.addTimer(6, 71);
+ break;
+
+ case 71:
+ if (!_globals[kHasTalkedToHermit]) {
+ _globals._sequenceIndexes[3] = _scene->_sequences.startReverseCycle(_globals._spriteIndexes[3], false, 26, 2, 0, 0);
+ _scene->_sequences.setDepth(_globals._sequenceIndexes[3], 7);
+ _scene->_sequences.setPosition(_globals._sequenceIndexes[3], Common::Point(287, 73));
+ _scene->_sequences.setScale(_globals._sequenceIndexes[3], 47);
+ }
+ _scene->_sequences.remove(_globals._sequenceIndexes[1]);
+ _globals._sequenceIndexes[1] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[1], false, 6, 1, 0, 0);
+ _scene->_sequences.setDepth(_globals._sequenceIndexes[1], 5);
+ _scene->_sequences.addSubEntry(_globals._sequenceIndexes[1], SEQUENCE_TRIGGER_EXPIRE, 0, 72);
+ break;
+
+ case 72:
+ _globals._sequenceIndexes[1] = _scene->_sequences.startCycle(_globals._spriteIndexes[1], false, -2);
+ _scene->_sequences.setDepth(_globals._sequenceIndexes[1], 5);
+ _game._player._stepEnabled = true;
+ break;
+
+ default:
+ break;
+ }
+}
+
+void Scene609::enterStore() {
+ switch (_game._trigger) {
+ case 0:
+ _game._player._stepEnabled = false;
+ if (_videoDoorMode == 2)
+ _scene->_sequences.addTimer(1, 4);
+ else {
+ _scene->_kernelMessages.reset();
+ _scene->_kernelMessages.add(Common::Point(0, 0), 0x1110, 34, 0, 120, _game.getQuote(0x305));
+ _scene->_sequences.addTimer(120, 1);
+ }
+ break;
+
+ case 1:
+ _scene->_kernelMessages.reset();
+ _scene->_kernelMessages.add(Common::Point(0, 0), 0x1110, 34, 0, 120, _game.getQuote(0x306));
+ _scene->_sequences.addTimer(60, 2);
+ break;
+
+ case 2:
+ _game._player._visible = false;
+ _globals._sequenceIndexes[5] = _scene->_sequences.startReverseCycle(_globals._spriteIndexes[5], true, 11, 2, 0, 0);
+ _scene->_sequences.setAnimRange(_globals._sequenceIndexes[5], 1, 2);
+ _scene->_sequences.setMsgLayout(_globals._sequenceIndexes[5]);
+ _scene->_sequences.addSubEntry(_globals._sequenceIndexes[5], SEQUENCE_TRIGGER_EXPIRE, 0, 3);
+ break;
+
+ case 3:
+ _scene->_sequences.updateTimeout(-1, _globals._sequenceIndexes[5]);
+ _game._player._visible = true;
+ _game._objects.setRoom(OBJ_DOOR_KEY, 1);
+ _scene->_sequences.addTimer(15, 4);
+ break;
+
+ case 4:
+ _game._player._visible = false;
+ _globals._sequenceIndexes[5] = _scene->_sequences.startCycle(_globals._spriteIndexes[5], true, 1);
+ _scene->_sequences.setMsgLayout(_globals._sequenceIndexes[5]);
+ _scene->_sequences.addTimer(15, 5);
+ break;
+
+ case 5:
+ _scene->_sequences.remove(_globals._sequenceIndexes[5]);
+ _game._player._priorTimer = _scene->_frameStartTime - _game._player._ticksAmount;
+ _game._player._visible = true;
+ _scene->_sequences.remove(_globals._sequenceIndexes[2]);
+ _globals._sequenceIndexes[2] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[2], false, 7, 1, 0, 0);
+ _scene->_sequences.setDepth(_globals._sequenceIndexes[2], 9);
+ _scene->_sequences.addSubEntry(_globals._sequenceIndexes[2], SEQUENCE_TRIGGER_EXPIRE, 0, 6);
+ break;
+
+ case 6:
+ _scene->_hotspots.activate(NOUN_VIDEO_STORE_DOOR, false);
+ if (_videoDoorMode == 1) {
+ _scene->_kernelMessages.reset();
+ _scene->_kernelMessages.add(Common::Point(0, 0), 0x1110, 34, 0, 180, _game.getQuote(0x307));
+ }
+ _game._player.walk(Common::Point(23, 90), FACING_WEST);
+ _scene->_sequences.addTimer(180, 7);
+ break;
+
+ case 7:
+ _scene->_sequences.remove(_globals._sequenceIndexes[2]);
+ _globals._sequenceIndexes[2] = _scene->_sequences.startReverseCycle(_globals._spriteIndexes[2], false, 7, 1, 0, 0);
+ _scene->_sequences.setDepth(_globals._sequenceIndexes[2], 9);
+ _scene->_sequences.addSubEntry(_globals._sequenceIndexes[2], SEQUENCE_TRIGGER_EXPIRE, 0, 8);
+ break;
+
+ case 8:
+ _scene->_hotspots.activate(NOUN_VIDEO_STORE_DOOR, true);
+ _globals._sequenceIndexes[2] = _scene->_sequences.startCycle(_globals._spriteIndexes[2], false, -1);
+ _scene->_sequences.setDepth(_globals._sequenceIndexes[2], 9);
+ _globals[kBeenInVideoStore] = true;
+ _game._player._stepEnabled = true;
+ _scene->_nextSceneId = 610;
+ break;
+
+ default:
+ break;
+ }
+}
+
+void Scene609::preActions() {
+ if (_action.isAction(VERB_UNLOCK, NOUN_DOOR_KEY, NOUN_VIDEO_STORE_DOOR))
+ _game._player.walk(Common::Point(78, 99), FACING_NORTHWEST);
+}
+
+void Scene609::actions() {
+ if (_action.isAction(VERB_WALK_TOWARDS, NOUN_ALLEY))
+ _scene->_nextSceneId = 611;
+ else if (_action.isAction(VERB_WALK_THROUGH, NOUN_VIDEO_STORE_DOOR)) {
+ if (!_globals[kBeenInVideoStore]) {
+ switch (_game._trigger) {
+ case 0:
+ _game._player._stepEnabled = false;
+ _scene->_kernelMessages.reset();
+ _scene->_kernelMessages.add(Common::Point(0, 0), 0x1110, 34, 0, 120, _game.getQuote(0x308));
+ _scene->_sequences.addTimer(120, 1);
+ break;
+
+ case 1:
+ _game._player._visible = false;
+ _globals._sequenceIndexes[5] = _scene->_sequences.startCycle(_globals._spriteIndexes[5], true, 1);
+ _scene->_sequences.setMsgLayout(_globals._sequenceIndexes[5]);
+ _scene->_sequences.addTimer(30, 2);
+ break;
+
+ case 2:
+ _scene->_sequences.remove(_globals._sequenceIndexes[5]);
+ _game._player._priorTimer = _scene->_frameStartTime - _game._player._ticksAmount;
+ _game._player._visible = true;
+ _scene->_sequences.addTimer(60, 3);
+ break;
+
+ case 3:
+ _scene->_kernelMessages.reset();
+ _scene->_kernelMessages.add(Common::Point(0, 0), 0x1110, 34, 0, 120, _game.getQuote(0x309));
+ _scene->_sequences.addTimer(120, 4);
+ break;
+
+ case 4:
+ _game._player._stepEnabled = true;
+ break;
+
+ default:
+ break;
+ }
+ } else {
+ _videoDoorMode = 2;
+ enterStore();
+ }
+ } else if (_action.isAction(VERB_UNLOCK, NOUN_DOOR_KEY, NOUN_VIDEO_STORE_DOOR)) {
+ _videoDoorMode = 1;
+ enterStore();
+ } else if (_action.isAction(VERB_GET_INSIDE, NOUN_CAR)) {
+ switch (_game._trigger) {
+ case 0:
+ _game._player._stepEnabled = false;
+ _scene->_sequences.remove(_globals._sequenceIndexes[1]);
+ _globals._sequenceIndexes[1] = _scene->_sequences.startReverseCycle(_globals._spriteIndexes[1], false, 6, 1, 0, 0);
+ _scene->_sequences.setDepth(_globals._sequenceIndexes[1], 5);
+ _scene->_sequences.addSubEntry(_globals._sequenceIndexes[1], SEQUENCE_TRIGGER_EXPIRE, 0, 1);
+ break;
+
+ case 1: {
+ int syncIdx = _globals._sequenceIndexes[1];
+ _globals._sequenceIndexes[1] = _scene->_sequences.startCycle(_globals._spriteIndexes[1], false, -1);
+ _scene->_sequences.setDepth(_globals._sequenceIndexes[1], 5);
+ _scene->_sequences.updateTimeout(_globals._sequenceIndexes[1], syncIdx);
+ _scene->_sequences.addTimer(6, 2);
+ }
+ break;
+
+ case 2:
+ _game._player._visible = false;
+ _globals._sequenceIndexes[4] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[4], false, 10, 1, 0, 0);
+ _scene->_sequences.setMsgLayout(_globals._sequenceIndexes[4]);
+ _scene->_sequences.addSubEntry(_globals._sequenceIndexes[4], SEQUENCE_TRIGGER_EXPIRE, 0, 3);
+ break;
+
+ case 3: {
+ int syncIdx = _globals._sequenceIndexes[4];
+ _globals._sequenceIndexes[4] = _scene->_sequences.startCycle(_globals._spriteIndexes[4], false, -2);
+ _scene->_sequences.setMsgLayout(_globals._sequenceIndexes[4]);
+ _scene->_sequences.updateTimeout(_globals._sequenceIndexes[4], syncIdx);
+ _scene->_nextSceneId = 504;
+ }
+ break;
+
+ default:
+ break;
+ }
+ } else if (_action._lookFlag)
+ _vm->_dialogs->show(60910);
+ else if (_action.isAction(VERB_LOOK, NOUN_STREET))
+ _vm->_dialogs->show(60911);
+ else if (_action.isAction(VERB_LOOK, NOUN_SPOT_A_POT))
+ _vm->_dialogs->show(60912);
+ else if (_action.isAction(VERB_LOOK, NOUN_VIDEO_STORE))
+ _vm->_dialogs->show(60913);
+ else if (_action.isAction(VERB_LOOK, NOUN_BILLBOARD))
+ _vm->_dialogs->show(60914);
+ else if (_action.isAction(VERB_LOOK, NOUN_STATUE))
+ _vm->_dialogs->show(60915);
+ else if (_action.isAction(VERB_LOOK, NOUN_CAR))
+ _vm->_dialogs->show(60916);
+ else if (_action.isAction(VERB_LOOK, NOUN_NEWSSTAND))
+ _vm->_dialogs->show(60917);
+ else if (_action.isAction(VERB_LOOK, NOUN_VIDEO_STORE_DOOR)) {
+ if (!_globals[kBeenInVideoStore])
+ _vm->_dialogs->show(60918);
+ else
+ _vm->_dialogs->show(60919);
+ } else if (_action.isAction(VERB_WALK_DOWN, NOUN_STREET))
+ _vm->_dialogs->show(60730);
+ else
+ return;
+
+ _action._inProgress = false;
+}
+
+/*------------------------------------------------------------------------*/
+
+Scene610::Scene610(MADSEngine *vm) : Scene6xx(vm) {
+ _handsetHotspotId = -1;
+ _checkVal = -1;
+
+ _cellCharging = false;
+
+ _cellChargingTimer = -1;
+ _lastFrameTimer = 0;
+}
+
+void Scene610::synchronize(Common::Serializer &s) {
+ Scene6xx::synchronize(s);
+
+ s.syncAsSint16LE(_handsetHotspotId);
+ s.syncAsSint16LE(_checkVal);
+
+ s.syncAsByte(_cellCharging);
+
+ s.syncAsSint32LE(_cellChargingTimer);
+ s.syncAsUint32LE(_lastFrameTimer);
+}
+
+void Scene610::setup() {
+ setPlayerSpritesPrefix();
+ setAAName();
+ _scene->addActiveVocab(NOUN_PHONE_HANDSET);
+ _scene->addActiveVocab(VERB_WALKTO);
+}
+
+void Scene610::enter() {
+ _globals._spriteIndexes[1] = _scene->_sprites.addSprites(formAnimName('p', -1));
+ _globals._spriteIndexes[2] = _scene->_sprites.addSprites("*RXMRC_9");
+ _globals._spriteIndexes[3] = _scene->_sprites.addSprites(formAnimName('x', 0));
+ _globals._spriteIndexes[4] = _scene->_sprites.addSprites(formAnimName('x', 1));
+
+ _globals._sequenceIndexes[4] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[4], false, 60, 0, 0, 0);
+ _scene->_sequences.setDepth(_globals._sequenceIndexes[4], 13);
+ _globals._sequenceIndexes[3] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[3], false, 30, 0, 0, 0);
+ _scene->_sequences.setDepth(_globals._sequenceIndexes[3], 9);
+
+ if (!_game._visitedScenes._sceneRevisited)
+ _cellCharging = false;
+
+ if (_game._objects[OBJ_PHONE_HANDSET]._roomNumber == _scene->_currentSceneId) {
+ _globals._sequenceIndexes[1] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[1], false, 9, 0, 0, 0);
+ _handsetHotspotId = _scene->_dynamicHotspots.add(NOUN_PHONE_HANDSET, VERB_WALKTO, _globals._sequenceIndexes[1], Common::Rect(0, 0, 0, 0));
+ _scene->_dynamicHotspots.setPosition(_handsetHotspotId, Common::Point(132, 121), FACING_NORTHWEST);
+ if ((_globals[kHandsetCellStatus] == 2) && (_game._difficulty == DIFFICULTY_HARD) && !_globals[kDurafailRecharged])
+ _globals[kHandsetCellStatus] = 1;
+ }
+
+ if (_scene->_roomChanged && _game._difficulty != DIFFICULTY_EASY)
+ _game._objects.addToInventory(OBJ_PENLIGHT);
+
+ if (_scene->_priorSceneId != -2) {
+ _game._player._playerPos = Common::Point(175, 152);
+ _game._player._facing = FACING_NORTHWEST;
+ }
+
+ sceneEntrySound();
+}
+
+void Scene610::step() {
+ if (_cellCharging) {
+ long diff = _scene->_frameStartTime - _lastFrameTimer;
+ if ((diff >= 0) && (diff <= 60))
+ _cellChargingTimer += diff;
+ else
+ _cellChargingTimer++;
+
+ _lastFrameTimer = _scene->_frameStartTime;
+ }
+
+ // CHECKME: _checkVal is always false, could be removed
+ if ((_cellChargingTimer >= 60) && !_checkVal) {
+ _checkVal = true;
+ _globals[kHandsetCellStatus] = 1;
+ _cellCharging = false;
+ _checkVal = false;
+ _cellChargingTimer = 0;
+ }
+}
+
+void Scene610::actions() {
+ if (_action.isAction(VERB_EXIT_FROM, NOUN_VIDEO_STORE))
+ _scene->_nextSceneId = 609;
+ else if (_action.isAction(VERB_TAKE, NOUN_PHONE_HANDSET)) {
+ if ( _game._trigger || !_game._objects.isInInventory(OBJ_PHONE_HANDSET)) {
+ switch (_game._trigger) {
+ case 0:
+ _game._player._stepEnabled = false;
+ _game._player._visible = false;
+ _globals._sequenceIndexes[2] = _scene->_sequences.startReverseCycle(_globals._spriteIndexes[2], true, 8, 1, 0, 0);
+ _scene->_sequences.setAnimRange(_globals._sequenceIndexes[2], 1, 2);
+ _scene->_sequences.setMsgLayout(_globals._sequenceIndexes[2]);
+ _scene->_sequences.addSubEntry(_globals._sequenceIndexes[2], SEQUENCE_TRIGGER_SPRITE, 2, 1);
+ _scene->_sequences.addSubEntry(_globals._sequenceIndexes[2], SEQUENCE_TRIGGER_EXPIRE, 0, 2);
+ break;
+
+ case 1:
+ _vm->_sound->command(9);
+ _scene->_sequences.remove(_globals._sequenceIndexes[1]);
+ _scene->_dynamicHotspots.remove(_handsetHotspotId);
+ _game._objects.addToInventory(OBJ_PHONE_HANDSET);
+ _vm->_dialogs->showItem(OBJ_PHONE_HANDSET, 61017);
+ break;
+
+ case 2:
+ _scene->_sequences.updateTimeout(-1, _globals._sequenceIndexes[2]);
+ _game._player._visible = true;
+ _game._player._stepEnabled = true;
+ break;
+
+ default:
+ break;
+ }
+ }
+ } else if (_action.isAction(VERB_PUT, NOUN_PHONE_HANDSET, NOUN_PHONE_CRADLE)) {
+ switch (_game._trigger) {
+ case 0:
+ _game._player._stepEnabled = false;
+ _game._player._visible = false;
+ _globals._sequenceIndexes[2] = _scene->_sequences.startReverseCycle(_globals._spriteIndexes[2], true, 8, 1, 0, 0);
+ _scene->_sequences.setAnimRange(_globals._sequenceIndexes[2], 1, 2);
+ _scene->_sequences.setMsgLayout(_globals._sequenceIndexes[2]);
+ _scene->_sequences.addSubEntry(_globals._sequenceIndexes[2], SEQUENCE_TRIGGER_SPRITE, 2, 1);
+ _scene->_sequences.addSubEntry(_globals._sequenceIndexes[2], SEQUENCE_TRIGGER_EXPIRE, 0, 2);
+ break;
+
+ case 1:
+ _globals._sequenceIndexes[1] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[1], false, 9, 0, 0, 0);
+ _handsetHotspotId = _scene->_dynamicHotspots.add(NOUN_PHONE_HANDSET, VERB_WALKTO, _globals._sequenceIndexes[1], Common::Rect(0, 0, 0, 0));
+ _scene->_dynamicHotspots.setPosition(_handsetHotspotId, Common::Point(132, 121), FACING_NORTHWEST);
+ _game._objects.setRoom(OBJ_PHONE_HANDSET, _scene->_currentSceneId);
+ break;
+
+ case 2:
+ _scene->_sequences.updateTimeout(-1, _globals._sequenceIndexes[2]);
+ _game._player._visible = true;
+ _game._player._stepEnabled = true;
+ if ((_globals[kHandsetCellStatus] == 2) && (_game._difficulty == DIFFICULTY_HARD) && !_globals[kDurafailRecharged])
+ _cellCharging = true;
+
+ _vm->_dialogs->show(61032);
+ break;
+
+ default:
+ break;
+ }
+ } else if (_action.isAction(VERB_LOOK, NOUN_PIPPY_BILLBOARD))
+ _vm->_dialogs->show(61010);
+ else if (_action.isAction(VERB_LOOK, NOUN_CIVILIZATION_AD))
+ _vm->_dialogs->show(61011);
+ else if (_action.isAction(VERB_LOOK, NOUN_MARX_BROS_POSTER))
+ _vm->_dialogs->show(61012);
+ else if (_action.isAction(VERB_LOOK, NOUN_VIDEO_MONITOR))
+ _vm->_dialogs->show(61013);
+ else if (_action.isAction(VERB_LOOK, NOUN_VIDEO_STORE))
+ _vm->_dialogs->show(61014);
+ else if (_action._lookFlag)
+ _vm->_dialogs->show(61015);
+ else if (_action.isAction(VERB_LOOK, NOUN_LOGO))
+ _vm->_dialogs->show(61018);
+ else if (_action.isAction(VERB_LOOK, NOUN_CEMENT)) {
+ if (_game._visitedScenes.exists(601))
+ _vm->_dialogs->show(61020);
+ else
+ _vm->_dialogs->show(61019);
+ } else if (_action.isAction(VERB_LOOK, NOUN_COUNTER))
+ _vm->_dialogs->show(61021);
+ else if (_action.isAction(VERB_LOOK, NOUN_PHONE_ANTENNA))
+ _vm->_dialogs->show(61022);
+ else if (_action.isAction(VERB_LOOK, NOUN_SMELLY_SNEAKER))
+ _vm->_dialogs->show(61023);
+ else if (_action.isAction(VERB_TAKE, NOUN_SMELLY_SNEAKER))
+ _vm->_dialogs->show(61024);
+ else if (_action.isAction(VERB_LOOK, NOUN_SPOTLIGHT))
+ _vm->_dialogs->show(61025);
+ else if (_action.isAction(VERB_LOOK, NOUN_PHONE_HANDSET) && (_action._mainObjectSource == 4))
+ _vm->_dialogs->show(61026);
+ else if (_action.isAction(VERB_LOOK, NOUN_PHONE_CRADLE))
+ _vm->_dialogs->show(61027);
+ else if (_action.isAction(VERB_LOOK, NOUN_RETURN_SLOT))
+ _vm->_dialogs->show(61028);
+ else if (_action.isAction(VERB_PUT, NOUN_RETURN_SLOT)
+ && _game._objects.isInInventory(_game._objects.getIdFromDesc(_action._activeAction._objectNameId)))
+ _vm->_dialogs->show(61029);
+ else if ( _action.isObject(NOUN_CLASSIC_VIDEOS) || _action.isObject(NOUN_MORE_CLASSIC_VIDEOS) || _action.isObject(NOUN_DRAMA_VIDEOS)
+ || _action.isObject(NOUN_NEW_RELEASE_VIDEOS) || _action.isObject(NOUN_PORNO_VIDEOS) || _action.isObject(NOUN_EDUCATIONAL_VIDEOS)
+ || _action.isObject(NOUN_INSTRUCTIONAL_VIDEOS) || _action.isObject(NOUN_WORKOUT_VIDEOS) || _action.isObject(NOUN_FOREIGN_VIDEOS)
+ || _action.isObject(NOUN_ADVENTURE_VIDEOS) || _action.isObject(NOUN_COMEDY_VIDEOS)) {
+ if (_action.isAction(VERB_LOOK))
+ _vm->_dialogs->show(61030);
+ else if (_action.isAction(VERB_TAKE))
+ _vm->_dialogs->show(61031);
+ else
+ return;
+ } else
+ return;
+
+ _action._inProgress = false;
+}
+
+/*------------------------------------------------------------------------*/
+
+Scene611::Scene611(MADSEngine *vm) : Scene6xx(vm), _defaultDialogPos(0, 0) {
+ _seenRatFl = false;
+ _eyesRunningFl = false;
+ _shouldRemoveEyes = false;
+ _ratPresentFl = false;
+ _duringDialogFl = false;
+ _resetBatterieText = false;
+ _hermitTalkingFl = false;
+ _hermitMovingFl = false;
+ _alreadyTalkingFl = false;
+ _giveBatteriesFl = false;
+ _startTradingFl = false;
+ _check1Fl = false;
+ _stickFingerFl = false;
+
+ _randVal = -1;
+ _ratHotspotId = -1;
+ _hermitDialogNode = -1;
+ _hermitDisplayedQuestion = -1;
+ _nextFrame = -1;
+ _hermitMode = -1;
+
+ _ratTimer = 0;
+}
+
+void Scene611::synchronize(Common::Serializer &s) {
+ Scene6xx::synchronize(s);
+
+ s.syncAsByte(_seenRatFl);
+ s.syncAsByte(_eyesRunningFl);
+ s.syncAsByte(_shouldRemoveEyes);
+ s.syncAsByte(_ratPresentFl);
+ s.syncAsByte(_duringDialogFl);
+ s.syncAsByte(_resetBatterieText);
+ s.syncAsByte(_hermitTalkingFl);
+ s.syncAsByte(_hermitMovingFl);
+ s.syncAsByte(_alreadyTalkingFl);
+ s.syncAsByte(_giveBatteriesFl);
+ s.syncAsByte(_startTradingFl);
+ s.syncAsByte(_check1Fl);
+ s.syncAsByte(_stickFingerFl);
+
+ s.syncAsSint16LE(_randVal);
+ s.syncAsSint16LE(_ratHotspotId);
+ s.syncAsSint16LE(_hermitDialogNode);
+ s.syncAsSint16LE(_hermitDisplayedQuestion);
+ s.syncAsSint16LE(_nextFrame);
+ s.syncAsSint16LE(_hermitMode);
+
+ s.syncAsUint32LE(_ratTimer);
+
+ s.syncAsSint16LE(_defaultDialogPos.x);
+ s.syncAsSint16LE(_defaultDialogPos.y);
+}
+
+void Scene611::setup() {
+ setPlayerSpritesPrefix();
+ setAAName();
+ _scene->addActiveVocab(NOUN_RAT);
+ _scene->addActiveVocab(VERB_WALKTO);
+}
+
+void Scene611::handleRatMoves() {
+ _ratPresentFl = false;
+ _scene->_sequences.remove(_globals._sequenceIndexes[1]);
+ _globals._sequenceIndexes[1] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[1], false, 12, 1, 0, 0);
+ _scene->_sequences.setAnimRange(_globals._sequenceIndexes[1], 11, -2);
+ _ratTimer = _game._player._priorTimer;
+ _scene->_dynamicHotspots.remove(_ratHotspotId);
+}
+
+void Scene611::handleTrading() {
+ if (_game._objects.isInInventory(OBJ_DURAFAIL_CELLS))
+ _game._objects.setRoom(OBJ_DURAFAIL_CELLS, 1);
+
+ if (_game._objects.isInInventory(OBJ_PHONE_CELLS))
+ _game._objects.setRoom(OBJ_PHONE_CELLS, 1);
+
+ _game._objects.addToInventory(OBJ_FAKE_ID);
+}
+
+void Scene611::setDialogNode(int node) {
+ if (node > 0)
+ _hermitDialogNode = node;
+
+ _game._player._stepEnabled = true;
+
+ switch (node) {
+ case 0:
+ _scene->_userInterface.setup(kInputBuildingSentences);
+ _duringDialogFl = false;
+ _hermitDialogNode = 0;
+ break;
+
+ case 1:
+ _dialog1.start();
+ _duringDialogFl = true;
+ _hermitDialogNode = 1;
+ break;
+
+ case 2:
+ _dialog2.start();
+ _duringDialogFl = true;
+ _hermitDialogNode = 2;
+ break;
+
+ default:
+ break;
+ }
+}
+
+bool Scene611::check2ChargedBatteries() {
+ if ((_game._objects.isInInventory(OBJ_DURAFAIL_CELLS) && !_game._objects.isInInventory(OBJ_PHONE_CELLS))
+ || (!_game._objects.isInInventory(OBJ_DURAFAIL_CELLS) && _game._objects.isInInventory(OBJ_PHONE_CELLS)))
+ return true;
+
+ return false;
+}
+
+bool Scene611::check4ChargedBatteries() {
+ if (_game._objects.isInInventory(OBJ_DURAFAIL_CELLS) && _game._objects.isInInventory(OBJ_PHONE_CELLS)
+ && _globals[kDurafailRecharged])
+ return true;
+
+ return false;
+}
+
+void Scene611::handleTalking(int delay) {
+ if (_hermitTalkingFl)
+ _alreadyTalkingFl = true;
+
+ _hermitTalkingFl = true;
+ _game._triggerSetupMode = SEQUENCE_TRIGGER_DAEMON;
+ _scene->_sequences.addTimer(delay, 100);
+}
+
+void Scene611::handleSubDialog1() {
+ switch (_action._activeAction._verbId) {
+ case 0x287:
+ _stickFingerFl = true;
+ _nextFrame = 34;
+ _hermitMovingFl = false;
+ _hermitMode = 5;
+ displayHermitQuestions(5);
+ _dialog1.write(0x287, false);
+ if (!_dialog1.read(0x288))
+ _dialog1.write(0x28E, true);
+
+ _dialog2.write(0x29C, true);
+ _dialog2.write(0x29D, true);
+ _dialog2.write(0x29E, true);
+ setDialogNode(2);
+ break;
+
+ case 0x288:
+ handleTalking(500);
+ displayHermitQuestions(6);
+ _dialog1.write(0x288, false);
+ _dialog1.write(0x289, true);
+ if (!_dialog1.read(0x287))
+ _dialog1.write(0x28E, true);
+
+ setDialogNode(1);
+ break;
+
+ case 0x289:
+ handleTalking(500);
+ displayHermitQuestions(10);
+ _dialog1.write(0x289, false);
+ _dialog1.write(0x28A, true);
+ _dialog1.write(0x28B, true);
+ setDialogNode(1);
+ break;
+
+ case 0x28A:
+ handleTalking(500);
+ displayHermitQuestions(11);
+ _dialog1.write(0x28A, false);
+ setDialogNode(1);
+ break;
+
+ case 0x28B:
+ handleTalking(500);
+ displayHermitQuestions(12);
+ _dialog1.write(0x28C, true);
+ _dialog1.write(0x28D, true);
+ _dialog1.write(0x28B, false);
+ setDialogNode(1);
+ break;
+
+ case 0x28C:
+ handleTalking(500);
+ displayHermitQuestions(13);
+ _dialog1.write(0x28C, false);
+ setDialogNode(1);
+ break;
+
+ case 0x28D:
+ handleTalking(500);
+ displayHermitQuestions(14);
+ _dialog1.write(0x290, true);
+ _dialog1.write(0x28D, false);
+ _dialog1.write(0x28F, true);
+ setDialogNode(1);
+ break;
+
+ case 0x28E:
+ handleTalking(500);
+ displayHermitQuestions(15);
+ _dialog1.write(0x295, true);
+ _dialog1.write(0x28E, false);
+ setDialogNode(1);
+ break;
+
+ case 0x290:
+ handleTalking(500);
+ displayHermitQuestions(17);
+ _dialog1.write(0x290, false);
+ if (!_dialog1.read(0x28F))
+ _dialog1.write(0x291, true);
+
+ setDialogNode(1);
+ break;
+
+ case 0x291:
+ handleTalking(500);
+ displayHermitQuestions(18);
+ _dialog1.write(0x291, false);
+ if ((!_game._objects.isInInventory(OBJ_DURAFAIL_CELLS)) && (!_game._objects.isInInventory(OBJ_PHONE_CELLS))) {
+ _dialog1.write(0x292, true);
+ _dialog1.write(0x293, true);
+ }
+
+ if ((_game._objects.isInInventory(OBJ_DURAFAIL_CELLS)) || (_game._objects.isInInventory(OBJ_PHONE_CELLS)))
+ _dialog1.write(0x294, true);
+
+ if (!_game._objects.isInInventory(OBJ_DURAFAIL_CELLS) && !_game._objects.isInInventory(OBJ_PHONE_CELLS))
+ _globals[kExecuted_1_11] = true;
+
+ setDialogNode(1);
+ break;
+
+ case 0x28F:
+ handleTalking(500);
+ displayHermitQuestions(16);
+ _dialog1.write(0x28F, false);
+ if (!_dialog1.read(0x290))
+ _dialog1.write(0x291, true);
+
+ setDialogNode(1);
+ break;
+
+ case 0x295:
+ handleTalking(500);
+ displayHermitQuestions(20);
+ _dialog1.write(0x295, false);
+ setDialogNode(1);
+ break;
+
+ case 0x292:
+ handleTalking(500);
+ displayHermitQuestions(19);
+ _dialog1.write(0x292, false);
+ _dialog1.write(0x293, false);
+ setDialogNode(1);
+ break;
+
+ case 0x293: {
+ handleTalking(200);
+ _scene->_kernelMessages.reset();
+
+ Common::String curQuote = _game.getQuote(0x2D1);
+ int width = _vm->_font->getWidth(curQuote, _scene->_textSpacing);
+ int quotePosX = _defaultDialogPos.x - (width / 2);
+ _scene->_kernelMessages.add(Common::Point(quotePosX, _defaultDialogPos.y), 0xFDFC, 0, 0, 120, curQuote);
+
+ curQuote = _game.getQuote(0x2D2);
+ width = _vm->_font->getWidth(curQuote, _scene->_textSpacing);
+ quotePosX = _defaultDialogPos.x - (width / 2);
+ _scene->_kernelMessages.add(Common::Point(quotePosX, _defaultDialogPos.y + 14), 0xFDFC, 0, 0, 120, curQuote);
+
+ _dialog1.write(0x293, false);
+ setDialogNode(0);
+ }
+ break;
+
+ case 0x294: {
+ bool hermitPleasedFl = false;
+
+ switch (_game._difficulty) {
+ case DIFFICULTY_EASY:
+ hermitPleasedFl = _game._objects.isInInventory(OBJ_DURAFAIL_CELLS) || _game._objects.isInInventory(OBJ_PHONE_CELLS);
+ break;
+
+ case DIFFICULTY_MEDIUM:
+ hermitPleasedFl = _game._objects.isInInventory(OBJ_DURAFAIL_CELLS) && _game._objects.isInInventory(OBJ_PHONE_CELLS);
+ break;
+
+ default: // HARD
+ hermitPleasedFl = check4ChargedBatteries();
+ break;
+ }
+
+ if (hermitPleasedFl) {
+ _hermitDisplayedQuestion = 21;
+ if (!_giveBatteriesFl)
+ setDialogNode(0);
+ else
+ _giveBatteriesFl = false;
+ } else if (((_game._difficulty == DIFFICULTY_MEDIUM) || (_game._difficulty == DIFFICULTY_HARD)) && check2ChargedBatteries()) {
+ _hermitDisplayedQuestion = 22;
+ if (!_giveBatteriesFl)
+ setDialogNode(0);
+ else
+ _giveBatteriesFl = false;
+ } else {
+ _hermitDisplayedQuestion = 23;
+ if (!_giveBatteriesFl)
+ setDialogNode(0);
+ else
+ _giveBatteriesFl = false;
+ }
+ _startTradingFl = true;
+ }
+ break;
+
+ case 0x296: {
+ _scene->_kernelMessages.reset();
+
+ Common::String curQuote = _game.getQuote(0x2E6);
+ int width = _vm->_font->getWidth(curQuote, _scene->_textSpacing);
+ int quotePosX = _defaultDialogPos.x - (width / 2);
+ _scene->_kernelMessages.add(Common::Point(quotePosX, _defaultDialogPos.y + 14), 0xFDFC, 0, 0, 120, curQuote);
+
+ setDialogNode(0);
+ handleTalking(200);
+ }
+ break;
+
+ default:
+ break;
+ }
+}
+
+void Scene611::handleSubDialog2() {
+ switch (_action._activeAction._verbId) {
+ case 0x29C:
+ displayHermitQuestions(7);
+ setDialogNode(1);
+ handleTalking(500);
+ break;
+
+ case 0x29D:
+ displayHermitQuestions(8);
+ setDialogNode(1);
+ handleTalking(500);
+ break;
+
+ case 0x29E:
+ displayHermitQuestions(9);
+ setDialogNode(1);
+ handleTalking(500);
+ break;
+
+ case 0x29F: {
+ _scene->_kernelMessages.reset();
+ Common::String curQuote = _game.getQuote(0x2A7);
+ int width = _vm->_font->getWidth(curQuote, _scene->_textSpacing);
+ int quotePosX = _defaultDialogPos.x - (width / 2);
+ _scene->_kernelMessages.add(Common::Point(quotePosX, _defaultDialogPos.y + 14), 0xFDFC, 0, 0, 120, curQuote);
+ setDialogNode(0);
+ _dialog2.write(0x29F, false);
+ }
+ break;
+
+ default:
+ break;
+ }
+}
+
+void Scene611::handleDialog() {
+ if (_game._trigger == 0) {
+ _scene->_kernelMessages.reset();
+ _game._player._stepEnabled = false;
+
+ Common::String curQuote = _game.getQuote(_action._activeAction._verbId);
+ int width = _vm->_font->getWidth(curQuote, _scene->_textSpacing);
+
+ if (width > 200) {
+ Common::String subQuote1, subQuote2;
+ _game.splitQuote(curQuote, subQuote1, subQuote2);
+ _scene->_kernelMessages.add(Common::Point(0, -14), 0x1110, 34, 0, 150, subQuote1);
+
+ if (_action._activeAction._verbId == 0x29D)
+ _scene->_kernelMessages.add(Common::Point(-18, 0), 0x1110, 34, 1, 150, subQuote2);
+ else if (_action._activeAction._verbId == 0x28A)
+ _scene->_kernelMessages.add(Common::Point(-10, 0), 0x1110, 34, 1, 150, subQuote2);
+ else
+ _scene->_kernelMessages.add(Common::Point(0, 0), 0x1110, 34, 1, 150, subQuote2);
+
+ _scene->_sequences.addTimer(170, 50);
+ } else {
+ _scene->_kernelMessages.add(Common::Point(0, 0), 0x1110, 34, 1, 120, curQuote);
+ _scene->_sequences.addTimer(140, 50);
+ }
+ } else if (_game._trigger == 50) {
+ if (_hermitDialogNode == 1)
+ handleSubDialog1();
+ else if (_hermitDialogNode == 2)
+ handleSubDialog2();
+ }
+}
+
+void Scene611::displayHermitQuestions(int question) {
+ _scene->_kernelMessages.reset();
+ _hermitDisplayedQuestion = question;
+
+ switch (question) {
+ case 1: {
+ Common::String curQuote = _game.getQuote(0x281);
+ int width = _vm->_font->getWidth(curQuote, _scene->_textSpacing);
+ int quotePosX = _defaultDialogPos.x - (width / 2);
+ _scene->_kernelMessages.add(Common::Point(quotePosX, _defaultDialogPos.y), 0xFDFC, 0, 0, 9999999, curQuote);
+
+ curQuote = _game.getQuote(0x282);
+ width = _vm->_font->getWidth(curQuote, _scene->_textSpacing);
+ quotePosX = _defaultDialogPos.x - (width / 2);
+ _scene->_kernelMessages.add(Common::Point(quotePosX, _defaultDialogPos.y + 14), 0xFDFC, 0, 0, 9999999, curQuote);
+ }
+ break;
+
+ case 2: {
+ Common::String curQuote = _game.getQuote(0x283);
+ int width = _vm->_font->getWidth(curQuote, _scene->_textSpacing);
+ int quotePosX = _defaultDialogPos.x - (width / 2);
+ _scene->_kernelMessages.add(Common::Point(quotePosX, _defaultDialogPos.y), 0xFDFC, 0, 0, 9999999, curQuote);
+
+ curQuote = _game.getQuote(0x284);
+ width = _vm->_font->getWidth(curQuote, _scene->_textSpacing);
+ quotePosX = _defaultDialogPos.x - (width / 2);
+ _scene->_kernelMessages.add(Common::Point(quotePosX, _defaultDialogPos.y + 14), 0xFDFC, 0, 0, 9999999, curQuote);
+ }
+ break;
+
+ case 3: {
+ Common::String curQuote = _game.getQuote(0x285);
+ int width = _vm->_font->getWidth(curQuote, _scene->_textSpacing);
+ int quotePosX = _defaultDialogPos.x - (width / 2);
+ _scene->_kernelMessages.add(Common::Point(quotePosX, _defaultDialogPos.y + 14), 0xFDFC, 0, 0, 9999999, curQuote);
+ }
+ break;
+
+ case 4: {
+ Common::String curQuote = _game.getQuote(0x286);
+ int width = _vm->_font->getWidth(curQuote, _scene->_textSpacing);
+ int quotePosX = _defaultDialogPos.x - (width / 2);
+ _scene->_kernelMessages.add(Common::Point(quotePosX, _defaultDialogPos.y + 14), 0xFDFC, 0, 0, 9999999, curQuote);
+ }
+ break;
+
+ case 5: {
+ Common::String curQuote = _game.getQuote(0x297);
+ int width = _vm->_font->getWidth(curQuote, _scene->_textSpacing);
+ int quotePosX = _defaultDialogPos.x - (width / 2);
+ _scene->_kernelMessages.add(Common::Point(quotePosX, _defaultDialogPos.y - 14), 0xFDFC, 0, 0, 9999999, curQuote);
+
+ curQuote = _game.getQuote(0x298);
+ width = _vm->_font->getWidth(curQuote, _scene->_textSpacing);
+ quotePosX = _defaultDialogPos.x - (width / 2);
+ _scene->_kernelMessages.add(Common::Point(quotePosX, _defaultDialogPos.y), 0xFDFC, 0, 0, 9999999, curQuote);
+
+ curQuote = _game.getQuote(0x299);
+ width = _vm->_font->getWidth(curQuote, _scene->_textSpacing);
+ quotePosX = _defaultDialogPos.x - (width / 2);
+ _scene->_kernelMessages.add(Common::Point(quotePosX, _defaultDialogPos.y + 14), 0xFDFC, 0, 0, 9999999, curQuote);
+ }
+ break;
+
+ case 6: {
+ Common::String curQuote = _game.getQuote(0x29A);
+ int width = _vm->_font->getWidth(curQuote, _scene->_textSpacing);
+ int quotePosX = _defaultDialogPos.x - (width / 2);
+ _scene->_kernelMessages.add(Common::Point(quotePosX, _defaultDialogPos.y), 0xFDFC, 0, 0, 9999999, curQuote);
+
+ curQuote = _game.getQuote(0x29B);
+ width = _vm->_font->getWidth(curQuote, _scene->_textSpacing);
+ quotePosX = _defaultDialogPos.x - (width / 2);
+ _scene->_kernelMessages.add(Common::Point(quotePosX, _defaultDialogPos.y + 14), 0xFDFC, 0, 0, 9999999, curQuote);
+ }
+ break;
+
+ case 7: {
+ Common::String curQuote = _game.getQuote(0x2A0);
+ int width = _vm->_font->getWidth(curQuote, _scene->_textSpacing);
+ int quotePosX = _defaultDialogPos.x - (width / 2);
+ _scene->_kernelMessages.add(Common::Point(quotePosX, _defaultDialogPos.y + 45), 0xFDFC, 0, 0, 9999999, curQuote);
+
+ curQuote = _game.getQuote(0x2A1);
+ width = _vm->_font->getWidth(curQuote, _scene->_textSpacing);
+ quotePosX = _defaultDialogPos.x - (width / 2);
+ _scene->_kernelMessages.add(Common::Point(quotePosX, _defaultDialogPos.y + 59), 0xFDFC, 0, 0, 9999999, curQuote);
+ }
+ break;
+
+ case 8: {
+ Common::String curQuote = _game.getQuote(0x2A2);
+ int width = _vm->_font->getWidth(curQuote, _scene->_textSpacing);
+ int quotePosX = _defaultDialogPos.x - (width / 2);
+ _scene->_kernelMessages.add(Common::Point(quotePosX, _defaultDialogPos.y + 31), 0xFDFC, 0, 0, 9999999, curQuote);
+
+ curQuote = _game.getQuote(0x2A3);
+ width = _vm->_font->getWidth(curQuote, _scene->_textSpacing);
+ quotePosX = _defaultDialogPos.x - (width / 2);
+ _scene->_kernelMessages.add(Common::Point(quotePosX, _defaultDialogPos.y + 45), 0xFDFC, 0, 0, 9999999, curQuote);
+
+ curQuote = _game.getQuote(0x2A4);
+ width = _vm->_font->getWidth(curQuote, _scene->_textSpacing);
+ quotePosX = _defaultDialogPos.x - (width / 2);
+ _scene->_kernelMessages.add(Common::Point(quotePosX, _defaultDialogPos.y + 59), 0xFDFC, 0, 0, 9999999, curQuote);
+ }
+ break;
+
+ case 9: {
+ Common::String curQuote = _game.getQuote(0x2A5);
+ int width = _vm->_font->getWidth(curQuote, _scene->_textSpacing);
+ int quotePosX = _defaultDialogPos.x - (width / 2);
+ _scene->_kernelMessages.add(Common::Point(quotePosX, _defaultDialogPos.y + 45), 0xFDFC, 0, 0, 9999999, curQuote);
+
+ curQuote = _game.getQuote(0x2A6);
+ width = _vm->_font->getWidth(curQuote, _scene->_textSpacing);
+ quotePosX = _defaultDialogPos.x - (width / 2);
+ _scene->_kernelMessages.add(Common::Point(quotePosX, _defaultDialogPos.y + 59), 0xFDFC, 0, 0, 9999999, curQuote);
+ }
+ break;
+
+ case 10: {
+ Common::String curQuote = _game.getQuote(0x2A8);
+ int width = _vm->_font->getWidth(curQuote, _scene->_textSpacing);
+ int quotePosX = _defaultDialogPos.x - (width / 2);
+ _scene->_kernelMessages.add(Common::Point(quotePosX, _defaultDialogPos.y + 31), 0xFDFC, 0, 0, 9999999, curQuote);
+
+ curQuote = _game.getQuote(0x2A9);
+ width = _vm->_font->getWidth(curQuote, _scene->_textSpacing);
+ quotePosX = _defaultDialogPos.x - (width / 2);
+ _scene->_kernelMessages.add(Common::Point(quotePosX, _defaultDialogPos.y + 45), 0xFDFC, 0, 0, 9999999, curQuote);
+
+ curQuote = _game.getQuote(0x2AA);
+ width = _vm->_font->getWidth(curQuote, _scene->_textSpacing);
+ quotePosX = _defaultDialogPos.x - (width / 2);
+ _scene->_kernelMessages.add(Common::Point(quotePosX, _defaultDialogPos.y + 59), 0xFDFC, 0, 0, 9999999, curQuote);
+ }
+ break;
+
+ case 11: {
+ Common::String curQuote = _game.getQuote(0x2AB);
+ int width = _vm->_font->getWidth(curQuote, _scene->_textSpacing);
+ int quotePosX = _defaultDialogPos.x - (width / 2);
+ _scene->_kernelMessages.add(Common::Point(quotePosX, _defaultDialogPos.y + 17), 0xFDFC, 0, 0, 9999999, curQuote);
+
+ curQuote = _game.getQuote(0x2AC);
+ width = _vm->_font->getWidth(curQuote, _scene->_textSpacing);
+ quotePosX = _defaultDialogPos.x - (width / 2);
+ _scene->_kernelMessages.add(Common::Point(quotePosX, _defaultDialogPos.y + 31), 0xFDFC, 0, 0, 9999999, curQuote);
+
+ curQuote = _game.getQuote(0x2AD);
+ width = _vm->_font->getWidth(curQuote, _scene->_textSpacing);
+ quotePosX = _defaultDialogPos.x - (width / 2);
+ _scene->_kernelMessages.add(Common::Point(quotePosX, _defaultDialogPos.y + 45), 0xFDFC, 0, 0, 9999999, curQuote);
+
+ curQuote = _game.getQuote(0x2AE);
+ width = _vm->_font->getWidth(curQuote, _scene->_textSpacing);
+ quotePosX = _defaultDialogPos.x - (width / 2);
+ _scene->_kernelMessages.add(Common::Point(quotePosX, _defaultDialogPos.y + 59), 0xFDFC, 0, 0, 9999999, curQuote);
+ }
+ break;
+
+ case 12: {
+ Common::String curQuote = _game.getQuote(0x2AF);
+ int width = _vm->_font->getWidth(curQuote, _scene->_textSpacing);
+ int quotePosX = _defaultDialogPos.x - (width / 2);
+ _scene->_kernelMessages.add(Common::Point(quotePosX, _defaultDialogPos.y + 17), 0xFDFC, 0, 0, 9999999, curQuote);
+
+ curQuote = _game.getQuote(0x2B0);
+ width = _vm->_font->getWidth(curQuote, _scene->_textSpacing);
+ quotePosX = _defaultDialogPos.x - (width / 2);
+ _scene->_kernelMessages.add(Common::Point(quotePosX, _defaultDialogPos.y + 31), 0xFDFC, 0, 0, 9999999, curQuote);
+
+ curQuote = _game.getQuote(0x2B1);
+ width = _vm->_font->getWidth(curQuote, _scene->_textSpacing);
+ quotePosX = _defaultDialogPos.x - (width / 2);
+ _scene->_kernelMessages.add(Common::Point(quotePosX, _defaultDialogPos.y + 45), 0xFDFC, 0, 0, 9999999, curQuote);
+
+ curQuote = _game.getQuote(0x2B2);
+ width = _vm->_font->getWidth(curQuote, _scene->_textSpacing);
+ quotePosX = _defaultDialogPos.x - (width / 2);
+ _scene->_kernelMessages.add(Common::Point(quotePosX, _defaultDialogPos.y + 59), 0xFDFC, 0, 0, 9999999, curQuote);
+ }
+ break;
+
+ case 13: {
+ Common::String curQuote = _game.getQuote(0x2B3);
+ int width = _vm->_font->getWidth(curQuote, _scene->_textSpacing);
+ int quotePosX = _defaultDialogPos.x - (width / 2);
+ _scene->_kernelMessages.add(Common::Point(quotePosX, _defaultDialogPos.y + 3), 0xFDFC, 0, 0, 9999999, curQuote);
+
+ curQuote = _game.getQuote(0x2B4);
+ width = _vm->_font->getWidth(curQuote, _scene->_textSpacing);
+ quotePosX = _defaultDialogPos.x - (width / 2);
+ _scene->_kernelMessages.add(Common::Point(quotePosX, _defaultDialogPos.y + 17), 0xFDFC, 0, 0, 9999999, curQuote);
+
+ curQuote = _game.getQuote(0x2B5);
+ width = _vm->_font->getWidth(curQuote, _scene->_textSpacing);
+ quotePosX = _defaultDialogPos.x - (width / 2);
+ _scene->_kernelMessages.add(Common::Point(quotePosX, _defaultDialogPos.y + 31), 0xFDFC, 0, 0, 9999999, curQuote);
+
+ curQuote = _game.getQuote(0x2B6);
+ width = _vm->_font->getWidth(curQuote, _scene->_textSpacing);
+ quotePosX = _defaultDialogPos.x - (width / 2);
+ _scene->_kernelMessages.add(Common::Point(quotePosX, _defaultDialogPos.y + 45), 0xFDFC, 0, 0, 9999999, curQuote);
+
+ _scene->_kernelMessages.add(Common::Point(11, _defaultDialogPos.y + 59), 0xFDFC, 0, 0, 9999999, _game.getQuote(0x2B7));
+ _scene->_kernelMessages.add(Common::Point(11, _defaultDialogPos.y + 73), 0xFDFC, 0, 0, 9999999, _game.getQuote(0x2B8));
+ _scene->_kernelMessages.add(Common::Point(11, _defaultDialogPos.y + 87), 0xFDFC, 0, 0, 9999999, _game.getQuote(0x2B9));
+ }
+ break;
+
+ case 14: {
+ Common::String curQuote = _game.getQuote(0x2BA);
+ int width = _vm->_font->getWidth(curQuote, _scene->_textSpacing);
+ int quotePosX = _defaultDialogPos.x - (width / 2);
+ _scene->_kernelMessages.add(Common::Point(quotePosX, _defaultDialogPos.y + 17), 0xFDFC, 0, 0, 9999999, curQuote);
+
+ curQuote = _game.getQuote(0x2BB);
+ width = _vm->_font->getWidth(curQuote, _scene->_textSpacing);
+ quotePosX = _defaultDialogPos.x - (width / 2);
+ _scene->_kernelMessages.add(Common::Point(quotePosX, _defaultDialogPos.y + 31), 0xFDFC, 0, 0, 9999999, curQuote);
+
+ curQuote = _game.getQuote(0x2BC);
+ width = _vm->_font->getWidth(curQuote, _scene->_textSpacing);
+ quotePosX = _defaultDialogPos.x - (width / 2);
+ _scene->_kernelMessages.add(Common::Point(quotePosX, _defaultDialogPos.y + 45), 0xFDFC, 0, 0, 9999999, curQuote);
+
+ curQuote = _game.getQuote(0x2BD);
+ width = _vm->_font->getWidth(curQuote, _scene->_textSpacing);
+ quotePosX = _defaultDialogPos.x - (width / 2);
+ _scene->_kernelMessages.add(Common::Point(quotePosX, _defaultDialogPos.y + 59), 0xFDFC, 0, 0, 9999999, curQuote);
+ }
+ break;
+
+ case 15: {
+ Common::String curQuote = _game.getQuote(0x2BE);
+ int width = _vm->_font->getWidth(curQuote, _scene->_textSpacing);
+ int quotePosX = _defaultDialogPos.x - (width / 2);
+ _scene->_kernelMessages.add(Common::Point(quotePosX, _defaultDialogPos.y + 17), 0xFDFC, 0, 0, 9999999, curQuote);
+
+ curQuote = _game.getQuote(0x2BF);
+ width = _vm->_font->getWidth(curQuote, _scene->_textSpacing);
+ quotePosX = _defaultDialogPos.x - (width / 2);
+ _scene->_kernelMessages.add(Common::Point(quotePosX, _defaultDialogPos.y + 31), 0xFDFC, 0, 0, 9999999, curQuote);
+
+ curQuote = _game.getQuote(0x2C0);
+ width = _vm->_font->getWidth(curQuote, _scene->_textSpacing);
+ quotePosX = _defaultDialogPos.x - (width / 2);
+ _scene->_kernelMessages.add(Common::Point(quotePosX, _defaultDialogPos.y + 45), 0xFDFC, 0, 0, 9999999, curQuote);
+
+ curQuote = _game.getQuote(0x2C1);
+ width = _vm->_font->getWidth(curQuote, _scene->_textSpacing);
+ quotePosX = _defaultDialogPos.x - (width / 2);
+ _scene->_kernelMessages.add(Common::Point(quotePosX, _defaultDialogPos.y + 59), 0xFDFC, 0, 0, 9999999, curQuote);
+ }
+ break;
+
+ case 16: {
+ Common::String curQuote = _game.getQuote(0x2C2);
+ int width = _vm->_font->getWidth(curQuote, _scene->_textSpacing);
+ int quotePosX = _defaultDialogPos.x - (width / 2);
+ _scene->_kernelMessages.add(Common::Point(quotePosX, _defaultDialogPos.y + 3), 0xFDFC, 0, 0, 9999999, curQuote);
+
+ curQuote = _game.getQuote(0x2C3);
+ width = _vm->_font->getWidth(curQuote, _scene->_textSpacing);
+ quotePosX = _defaultDialogPos.x - (width / 2);
+ _scene->_kernelMessages.add(Common::Point(quotePosX, _defaultDialogPos.y + 17), 0xFDFC, 0, 0, 9999999, curQuote);
+
+ curQuote = _game.getQuote(0x2C4);
+ width = _vm->_font->getWidth(curQuote, _scene->_textSpacing);
+ quotePosX = _defaultDialogPos.x - (width / 2);
+ _scene->_kernelMessages.add(Common::Point(quotePosX, _defaultDialogPos.y + 31), 0xFDFC, 0, 0, 9999999, curQuote);
+
+ curQuote = _game.getQuote(0x2C5);
+ width = _vm->_font->getWidth(curQuote, _scene->_textSpacing);
+ quotePosX = _defaultDialogPos.x - (width / 2);
+ _scene->_kernelMessages.add(Common::Point(quotePosX, _defaultDialogPos.y + 45), 0xFDFC, 0, 0, 9999999, curQuote);
+
+ curQuote = _game.getQuote(0x2C6);
+ width = _vm->_font->getWidth(curQuote, _scene->_textSpacing);
+ quotePosX = _defaultDialogPos.x - (width / 2);
+ _scene->_kernelMessages.add(Common::Point(quotePosX, _defaultDialogPos.y + 59), 0xFDFC, 0, 0, 9999999, curQuote);
+ }
+ break;
+
+ case 17: {
+ Common::String curQuote = _game.getQuote(0x2C7);
+ int width = _vm->_font->getWidth(curQuote, _scene->_textSpacing);
+ int quotePosX = _defaultDialogPos.x - (width / 2);
+ _scene->_kernelMessages.add(Common::Point(quotePosX, _defaultDialogPos.y + 17), 0xFDFC, 0, 0, 9999999, curQuote);
+
+ curQuote = _game.getQuote(0x2C8);
+ width = _vm->_font->getWidth(curQuote, _scene->_textSpacing);
+ quotePosX = _defaultDialogPos.x - (width / 2);
+ _scene->_kernelMessages.add(Common::Point(quotePosX, _defaultDialogPos.y + 31), 0xFDFC, 0, 0, 9999999, curQuote);
+
+ curQuote = _game.getQuote(0x2C0);
+ width = _vm->_font->getWidth(curQuote, _scene->_textSpacing);
+ quotePosX = _defaultDialogPos.x - (width / 2);
+ _scene->_kernelMessages.add(Common::Point(quotePosX, _defaultDialogPos.y + 45), 0xFDFC, 0, 0, 9999999, curQuote);
+
+ curQuote = _game.getQuote(0x2CA);
+ width = _vm->_font->getWidth(curQuote, _scene->_textSpacing);
+ quotePosX = _defaultDialogPos.x - (width / 2);
+ _scene->_kernelMessages.add(Common::Point(quotePosX, _defaultDialogPos.y + 59), 0xFDFC, 0, 0, 9999999, curQuote);
+ }
+ break;
+
+ case 18: {
+ Common::String curQuote = _game.getQuote(0x2CB);
+ int width = _vm->_font->getWidth(curQuote, _scene->_textSpacing);
+ int quotePosX = _defaultDialogPos.x - (width / 2);
+ _scene->_kernelMessages.add(Common::Point(quotePosX, _defaultDialogPos.y + 31), 0xFDFC, 0, 0, 9999999, curQuote);
+
+ curQuote = _game.getQuote(0x2CC);
+ width = _vm->_font->getWidth(curQuote, _scene->_textSpacing);
+ quotePosX = _defaultDialogPos.x - (width / 2);
+ _scene->_kernelMessages.add(Common::Point(quotePosX, _defaultDialogPos.y + 45), 0xFDFC, 0, 0, 9999999, curQuote);
+
+ curQuote = _game.getQuote(0x2CD);
+ width = _vm->_font->getWidth(curQuote, _scene->_textSpacing);
+ quotePosX = _defaultDialogPos.x - (width / 2);
+ _scene->_kernelMessages.add(Common::Point(quotePosX, _defaultDialogPos.y + 59), 0xFDFC, 0, 0, 9999999, curQuote);
+ }
+ break;
+
+ case 19: {
+ Common::String curQuote = _game.getQuote(0x2CE);
+ int width = _vm->_font->getWidth(curQuote, _scene->_textSpacing);
+ int quotePosX = _defaultDialogPos.x - (width / 2);
+ _scene->_kernelMessages.add(Common::Point(quotePosX, _defaultDialogPos.y + 31), 0xFDFC, 0, 0, 9999999, curQuote);
+
+ curQuote = _game.getQuote(0x2CF);
+ width = _vm->_font->getWidth(curQuote, _scene->_textSpacing);
+ quotePosX = _defaultDialogPos.x - (width / 2);
+ _scene->_kernelMessages.add(Common::Point(quotePosX, _defaultDialogPos.y + 45), 0xFDFC, 0, 0, 9999999, curQuote);
+
+ curQuote = _game.getQuote(0x2D0);
+ width = _vm->_font->getWidth(curQuote, _scene->_textSpacing);
+ quotePosX = _defaultDialogPos.x - (width / 2);
+ _scene->_kernelMessages.add(Common::Point(quotePosX, _defaultDialogPos.y + 59), 0xFDFC, 0, 0, 9999999, curQuote);
+ }
+ break;
+
+ case 20: {
+ Common::String curQuote = _game.getQuote(0x2E1);
+ int width = _vm->_font->getWidth(curQuote, _scene->_textSpacing);
+ int quotePosX = _defaultDialogPos.x - (width / 2);
+ _scene->_kernelMessages.add(Common::Point(quotePosX, _defaultDialogPos.y + 3), 0xFDFC, 0, 0, 9999999, curQuote);
+
+ curQuote = _game.getQuote(0x2E2);
+ width = _vm->_font->getWidth(curQuote, _scene->_textSpacing);
+ quotePosX = _defaultDialogPos.x - (width / 2);
+ _scene->_kernelMessages.add(Common::Point(quotePosX, _defaultDialogPos.y + 17), 0xFDFC, 0, 0, 9999999, curQuote);
+
+ curQuote = _game.getQuote(0x2E3);
+ width = _vm->_font->getWidth(curQuote, _scene->_textSpacing);
+ quotePosX = _defaultDialogPos.x - (width / 2);
+ _scene->_kernelMessages.add(Common::Point(quotePosX, _defaultDialogPos.y + 31), 0xFDFC, 0, 0, 9999999, curQuote);
+
+ curQuote = _game.getQuote(0x2E4);
+ width = _vm->_font->getWidth(curQuote, _scene->_textSpacing);
+ quotePosX = _defaultDialogPos.x - (width / 2);
+ _scene->_kernelMessages.add(Common::Point(quotePosX, _defaultDialogPos.y + 45), 0xFDFC, 0, 0, 9999999, curQuote);
+
+ curQuote = _game.getQuote(0x2E5);
+ width = _vm->_font->getWidth(curQuote, _scene->_textSpacing);
+ quotePosX = _defaultDialogPos.x - (width / 2);
+ _scene->_kernelMessages.add(Common::Point(quotePosX, _defaultDialogPos.y + 59), 0xFDFC, 0, 0, 9999999, curQuote);
+ }
+ break;
+
+ case 21: {
+ Common::String curQuote = _game.getQuote(0x2D3);
+ int width = _vm->_font->getWidth(curQuote, _scene->_textSpacing);
+ int quotePosX = _defaultDialogPos.x - (width / 2);
+ _scene->_kernelMessages.add(Common::Point(quotePosX, _defaultDialogPos.y + 3), 0xFDFC, 0, 0, 9999999, curQuote);
+
+ curQuote = _game.getQuote(0x2D4);
+ width = _vm->_font->getWidth(curQuote, _scene->_textSpacing);
+ quotePosX = _defaultDialogPos.x - (width / 2);
+ _scene->_kernelMessages.add(Common::Point(quotePosX, _defaultDialogPos.y + 17), 0xFDFC, 0, 0, 9999999, curQuote);
+
+ curQuote = _game.getQuote(0x2D5);
+ width = _vm->_font->getWidth(curQuote, _scene->_textSpacing);
+ quotePosX = _defaultDialogPos.x - (width / 2);
+ _scene->_kernelMessages.add(Common::Point(quotePosX, _defaultDialogPos.y + 31), 0xFDFC, 0, 0, 9999999, curQuote);
+
+ curQuote = _game.getQuote(0x2D6);
+ width = _vm->_font->getWidth(curQuote, _scene->_textSpacing);
+ quotePosX = _defaultDialogPos.x - (width / 2);
+ _scene->_kernelMessages.add(Common::Point(quotePosX, _defaultDialogPos.y + 45), 0xFDFC, 0, 0, 9999999, curQuote);
+
+ curQuote = _game.getQuote(0x2D7);
+ width = _vm->_font->getWidth(curQuote, _scene->_textSpacing);
+ quotePosX = _defaultDialogPos.x - (width / 2);
+ _scene->_kernelMessages.add(Common::Point(quotePosX, _defaultDialogPos.y + 59), 0xFDFC, 0, 0, 9999999, curQuote);
+ }
+ break;
+
+ case 22: {
+ Common::String curQuote = _game.getQuote(0x2D8);
+ int width = _vm->_font->getWidth(curQuote, _scene->_textSpacing);
+ int quotePosX = _defaultDialogPos.x - (width / 2);
+ _scene->_kernelMessages.add(Common::Point(quotePosX, _defaultDialogPos.y + 17), 0xFDFC, 0, 0, 700, curQuote);
+
+ curQuote = _game.getQuote(0x2D9);
+ width = _vm->_font->getWidth(curQuote, _scene->_textSpacing);
+ quotePosX = _defaultDialogPos.x - (width / 2);
+ _scene->_kernelMessages.add(Common::Point(quotePosX, _defaultDialogPos.y + 31), 0xFDFC, 0, 0, 700, curQuote);
+
+ curQuote = _game.getQuote(0x2DA);
+ width = _vm->_font->getWidth(curQuote, _scene->_textSpacing);
+ quotePosX = _defaultDialogPos.x - (width / 2);
+ _scene->_kernelMessages.add(Common::Point(quotePosX, _defaultDialogPos.y + 45), 0xFDFC, 0, 0, 700, curQuote);
+
+ curQuote = _game.getQuote(0x2DB);
+ width = _vm->_font->getWidth(curQuote, _scene->_textSpacing);
+ quotePosX = _defaultDialogPos.x - (width / 2);
+ _scene->_kernelMessages.add(Common::Point(quotePosX, _defaultDialogPos.y + 59), 0xFDFC, 0, 0, 700, curQuote);
+ }
+ break;
+
+ case 23: {
+ Common::String curQuote = _game.getQuote(0x2DC);
+ int width = _vm->_font->getWidth(curQuote, _scene->_textSpacing);
+ int quotePosX = _defaultDialogPos.x - (width / 2);
+ _scene->_kernelMessages.add(Common::Point(quotePosX, _defaultDialogPos.y + 3), 0xFDFC, 0, 0, 700, curQuote);
+
+ curQuote = _game.getQuote(0x2DD);
+ width = _vm->_font->getWidth(curQuote, _scene->_textSpacing);
+ quotePosX = _defaultDialogPos.x - (width / 2);
+ _scene->_kernelMessages.add(Common::Point(quotePosX, _defaultDialogPos.y + 17), 0xFDFC, 0, 0, 700, curQuote);
+
+ curQuote = _game.getQuote(0x2DE);
+ width = _vm->_font->getWidth(curQuote, _scene->_textSpacing);
+ quotePosX = _defaultDialogPos.x - (width / 2);
+ _scene->_kernelMessages.add(Common::Point(quotePosX, _defaultDialogPos.y + 31), 0xFDFC, 0, 0, 700, curQuote);
+
+ curQuote = _game.getQuote(0x2DF);
+ width = _vm->_font->getWidth(curQuote, _scene->_textSpacing);
+ quotePosX = _defaultDialogPos.x - (width / 2);
+ _scene->_kernelMessages.add(Common::Point(quotePosX, _defaultDialogPos.y + 45), 0xFDFC, 0, 0, 700, curQuote);
+
+ curQuote = _game.getQuote(0x2E0);
+ width = _vm->_font->getWidth(curQuote, _scene->_textSpacing);
+ quotePosX = _defaultDialogPos.x - (width / 2);
+ _scene->_kernelMessages.add(Common::Point(quotePosX, _defaultDialogPos.y + 59), 0xFDFC, 0, 0, 700, curQuote);
+ }
+ break;
+
+ default:
+ break;
+ }
+}
+
+void Scene611::enter() {
+ _globals._spriteIndexes[1] = _scene->_sprites.addSprites(formAnimName('x', 0));
+ _globals._spriteIndexes[2] = _scene->_sprites.addSprites(formAnimName('x', 1));
+ _globals._spriteIndexes[3] = _scene->_sprites.addSprites("*RXMRC_9");
+
+ _game.loadQuoteSet(0x279, 0x27A, 0x27B, 0x27C, 0x27D, 0x27E, 0x27F, 0x280, 0x281, 0x282, 0x283, 0x284,
+ 0x285, 0x286, 0x287, 0x288, 0x289, 0x28A, 0x28B, 0x28C, 0x28D, 0x28E, 0x28F, 0x290, 0x291, 0x292,
+ 0x293, 0x294, 0x295, 0x296, 0x297, 0x298, 0x299, 0x29A, 0x29B, 0x29C, 0x29D, 0x29E, 0x29F, 0x2A0,
+ 0x2A1, 0x2A2, 0x2A3, 0x2A4, 0x2A5, 0x2A6, 0x2A7, 0x2A8, 0x2A9, 0x2AA, 0x2AB, 0x2AC, 0x2AD, 0x2AE,
+ 0x2AF, 0x2B0, 0x2B1, 0x2B2, 0x2B3, 0x2B4, 0x2B5, 0x2B6, 0x2B7, 0x2B8, 0x2B9, 0x2BA, 0x2BB, 0x2BC,
+ 0x2BD, 0x2BE, 0x2BF, 0x2C0, 0x2C1, 0x2C2, 0x2C3, 0x2C4, 0x2C5, 0x2C6, 0x2C7, 0x2C8, 0x2C9, 0x2CA,
+ 0x2CB, 0x2CC, 0x2CD, 0x2CE, 0x2CF, 0x2D0, 0x2D1, 0x2D2, 0x2D3, 0x2D4, 0x2D5, 0x2D6, 0x2D7, 0x2D8,
+ 0x2D9, 0x2DA, 0x2DB, 0x2DC, 0x2DD, 0x2DE, 0x2DF, 0x2E0, 0x2E1, 0x2E2, 0x2E3, 0x2E4, 0x2E5, 0x2E6,
+ 0x323, 0x324, 0);
+
+ _dialog1.setup(0x82, 0x287, 0x288, 0x289, 0x28A, 0x28B, 0x28C, 0x28D, 0x28E, 0x28F, 0x290,
+ 0x291, 0x292, 0x293, 0x294, 0x295, 0x296, 0);
+
+ _dialog2.setup(0x83, 0x29C, 0x29D, 0x29E, 0x29F, 0);
+
+ if (!_game._visitedScenes._sceneRevisited) {
+ _dialog1.set(0x82, 0x287, 0x288, 0x296, 0);
+ _dialog2.set(0x83, 0x29F, 0);
+ }
+
+ _vm->_palette->setEntry(252, 51, 51, 47);
+ _vm->_palette->setEntry(253, 37, 37, 37);
+
+ _ratPresentFl = false;
+ _seenRatFl = true;
+ _eyesRunningFl = false;
+ _shouldRemoveEyes = false;
+ _randVal = 0;
+ _defaultDialogPos = Common::Point(264, 43);
+ _giveBatteriesFl = false;
+ _resetBatterieText = false;
+ _alreadyTalkingFl = false;
+ _startTradingFl = false;
+
+ if (_scene->_priorSceneId != -2) {
+ _game._player._playerPos = Common::Point(22, 132);
+ _game._player._facing = FACING_EAST;
+ _duringDialogFl = false;
+ }
+
+ if (!_globals[kHasTalkedToHermit]) {
+ _scene->loadAnimation(Resources::formatName(611, 'h', -1, EXT_AA, ""), 0);
+ _nextFrame = 47;
+ _hermitMode = 1;
+ _hermitTalkingFl = false;
+ _hermitMovingFl = true;
+ _check1Fl = true;
+ _stickFingerFl = false;
+ } else {
+ _hermitMode = 0;
+ _scene->_hotspots.activate(NOUN_HERMIT, false);
+ }
+
+ // CHECKME: The last line of the block looks extremely useless
+ if (_globals[kExecuted_1_11]) {
+ _dialog1.write(0x294, true);
+ _dialog1.write(0x292, false);
+ _globals[kExecuted_1_11] = true;
+ }
+
+ if (_duringDialogFl) {
+ _game._player._playerPos = Common::Point(237, 129);
+ _game._player._facing = FACING_NORTHEAST;
+
+ switch (_hermitDialogNode) {
+ case 0:
+ _scene->_userInterface.setup(kInputBuildingSentences);
+ _hermitDialogNode = 1;
+ break;
+
+ case 1:
+ _dialog1.start();
+ break;
+
+ case 2:
+ _dialog2.start();
+ break;
+
+ default:
+ break;
+ }
+ displayHermitQuestions(_hermitDisplayedQuestion);
+ }
+
+ sceneEntrySound();
+}
+
+void Scene611::step() {
+ if (_seenRatFl && (_vm->getRandomNumber(1, 100) == 10)) {
+ _seenRatFl = false;
+ _scene->_sequences.addTimer(1, 80);
+ }
+
+ if (_game._trigger == 80) {
+ _globals._sequenceIndexes[1] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[1], false, 12, 1, 0, 0);
+ _scene->_sequences.setAnimRange(_globals._sequenceIndexes[1], 1, 8);
+ _scene->_sequences.setDepth(_globals._sequenceIndexes[1], 1);
+ _ratPresentFl = true;
+ _scene->_sequences.addSubEntry(_globals._sequenceIndexes[1], SEQUENCE_TRIGGER_EXPIRE, 0, 81);
+ } else if (_game._trigger == 81) {
+ int syncId = _globals._sequenceIndexes[1];
+ _globals._sequenceIndexes[1] = _scene->_sequences.startReverseCycle(_globals._spriteIndexes[1], false, 20, 0, 0, 0);
+ int idx = _scene->_dynamicHotspots.add(NOUN_RAT, VERB_WALKTO, _globals._sequenceIndexes[1], Common::Rect(0, 0, 0, 0));
+ _ratHotspotId = _scene->_dynamicHotspots.setPosition(idx, Common::Point(272, 154), FACING_SOUTHEAST);
+ _scene->_sequences.setAnimRange(_globals._sequenceIndexes[1], 9, 10);
+ _scene->_sequences.updateTimeout(_globals._sequenceIndexes[1], syncId);
+ _scene->_sequences.setDepth(_globals._sequenceIndexes[1], 1);
+ _ratTimer = _game._player._priorTimer;
+ }
+
+ if (_ratPresentFl && ((_game._player._priorTimer - _ratTimer) > 1200))
+ handleRatMoves();
+
+ if (!_eyesRunningFl) {
+ _randVal = _vm->getRandomNumber(1, 30);
+ _eyesRunningFl = true;
+ _scene->_sequences.addTimer(1, 70);
+ }
+
+ if (_game._trigger == 70) {
+ switch (_randVal) {
+ case 2:
+ _globals._sequenceIndexes[2] = _scene->_sequences.startCycle(_globals._spriteIndexes[2], false, 1);
+ _scene->_sequences.setDepth(_globals._sequenceIndexes[2], 1);
+ _shouldRemoveEyes = true;
+ _scene->_sequences.addTimer(60, 71);
+ break;
+
+ case 6:
+ _globals._sequenceIndexes[2] = _scene->_sequences.startReverseCycle(_globals._spriteIndexes[2], false, 12, 3, 0, 0);
+ _scene->_sequences.setAnimRange(_globals._sequenceIndexes[2], 2, 4);
+ _scene->_sequences.setDepth(_globals._sequenceIndexes[2], 1);
+ _scene->_sequences.addSubEntry(_globals._sequenceIndexes[2], SEQUENCE_TRIGGER_EXPIRE, 0, 71);
+ break;
+
+ case 7:
+ _globals._sequenceIndexes[2] = _scene->_sequences.startCycle(_globals._spriteIndexes[2], false, 5);
+ _scene->_sequences.setDepth(_globals._sequenceIndexes[2], 1);
+ _shouldRemoveEyes = true;
+ _scene->_sequences.addTimer(60, 71);
+ break;
+
+ case 9:
+ _globals._sequenceIndexes[2] = _scene->_sequences.startCycle(_globals._spriteIndexes[2], false, 6);
+ _scene->_sequences.setDepth(_globals._sequenceIndexes[2], 1);
+ _shouldRemoveEyes = true;
+ _scene->_sequences.addTimer(60, 71);
+ break;
+
+ case 13:
+ _globals._sequenceIndexes[2] = _scene->_sequences.startCycle(_globals._spriteIndexes[2], false, 7);
+ _scene->_sequences.setDepth(_globals._sequenceIndexes[2], 1);
+ _shouldRemoveEyes = true;
+ _scene->_sequences.addTimer(60, 71);
+ break;
+
+ case 14:
+ _globals._sequenceIndexes[2] = _scene->_sequences.startCycle(_globals._spriteIndexes[2], false, 8);
+ _scene->_sequences.setDepth(_globals._sequenceIndexes[2], 1);
+ _shouldRemoveEyes = true;
+ _scene->_sequences.addTimer(60, 71);
+ break;
+
+ case 15:
+ _globals._sequenceIndexes[2] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[2], false, 24, 1, 0, 0);
+ _scene->_sequences.setAnimRange(_globals._sequenceIndexes[2], 5, 8);
+ _scene->_sequences.setDepth(_globals._sequenceIndexes[2], 1);
+ _scene->_sequences.addSubEntry(_globals._sequenceIndexes[2], SEQUENCE_TRIGGER_EXPIRE, 0, 71);
+ break;
+
+ case 17:
+ _globals._sequenceIndexes[2] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[2], false, 20, 1, 0, 0);
+ _scene->_sequences.setAnimRange(_globals._sequenceIndexes[2], 9, 11);
+ _scene->_sequences.setDepth(_globals._sequenceIndexes[2], 1);
+ _scene->_sequences.addSubEntry(_globals._sequenceIndexes[2], SEQUENCE_TRIGGER_EXPIRE, 0, 71);
+ break;
+
+ case 21:
+ _globals._sequenceIndexes[2] = _scene->_sequences.startCycle(_globals._spriteIndexes[2], false, 9);
+ _scene->_sequences.setDepth(_globals._sequenceIndexes[2], 1);
+ _shouldRemoveEyes = true;
+ _scene->_sequences.addTimer(60, 71);
+ break;
+
+ case 25:
+ _globals._sequenceIndexes[2] = _scene->_sequences.startCycle(_globals._spriteIndexes[2], false, 10);
+ _scene->_sequences.setDepth(_globals._sequenceIndexes[2], 1);
+ _shouldRemoveEyes = true;
+ _scene->_sequences.addTimer(60, 71);
+ break;
+
+ case 27:
+ _globals._sequenceIndexes[2] = _scene->_sequences.startCycle(_globals._spriteIndexes[2], false, 11);
+ _scene->_sequences.setDepth(_globals._sequenceIndexes[2], 1);
+ _shouldRemoveEyes = true;
+ _scene->_sequences.addTimer(60, 71);
+ break;
+
+ case 29:
+ _globals._sequenceIndexes[2] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[2], false, 20, 1, 0, 0);
+ _scene->_sequences.setDepth(_globals._sequenceIndexes[2], 1);
+ _scene->_sequences.addSubEntry(_globals._sequenceIndexes[2], SEQUENCE_TRIGGER_EXPIRE, 0, 71);
+ break;
+
+ default:
+ _scene->_sequences.addTimer(1, 71);
+ break;
+ }
+ }
+
+ if (_game._trigger == 71) {
+ if (_shouldRemoveEyes) {
+ _scene->_sequences.remove(_globals._sequenceIndexes[2]);
+ _shouldRemoveEyes = false;
+ }
+ _eyesRunningFl = false;
+ _randVal = 0;
+ }
+
+ if (_game._trigger == 100) {
+ if (_alreadyTalkingFl)
+ _alreadyTalkingFl = false;
+ else
+ _hermitMovingFl = true;
+ }
+
+ if (_stickFingerFl && (_scene->_activeAnimation->getCurrentFrame() == 47)) {
+ _stickFingerFl = false;
+ _hermitMovingFl = true;
+ _hermitMode = 1;
+ }
+
+ if (_scene->_activeAnimation != nullptr && (_scene->_activeAnimation->getCurrentFrame() == 240) && _check1Fl) {
+ _check1Fl = false;
+ _scene->_kernelMessages.add(Common::Point(33, 88), 0xFDFC, 0, 0, 90, _game.getQuote(0x27E));
+ _scene->_sequences.addTimer(120, 120);
+ }
+
+ if (_game._trigger == 120) {
+ int msgIdx = _scene->_kernelMessages.add(Common::Point(28, 102), 0xFDFC, 0, 0, 90, _game.getQuote(0x27F));
+ _scene->_kernelMessages.setQuoted(msgIdx, 4, true);
+ _scene->_sequences.addTimer(100, 121);
+ }
+
+ if (_game._trigger == 121) {
+ int msgIdx = _scene->_kernelMessages.add(Common::Point(23, 116), 0xFDFC, 0, 0, 90, _game.getQuote(0x280));
+ _scene->_kernelMessages.setQuoted(msgIdx, 4, true);
+ }
+
+ if (_hermitMode == 1) {
+ if (_startTradingFl) {
+ _hermitMode = 6;
+ _hermitMovingFl = false;
+ _hermitTalkingFl = false;
+ _scene->_sequences.addTimer(1, 110);
+ } else if (_hermitTalkingFl) {
+ _hermitMode = 2;
+ _nextFrame = 18;
+ _hermitMovingFl = false;
+ } else {
+ switch (_vm->getRandomNumber(1, 5)) {
+ case 1:
+ _nextFrame = 46;
+ break;
+
+ case 2:
+ _nextFrame = 47;
+ break;
+
+ case 3:
+ _nextFrame = 48;
+ break;
+
+ case 4:
+ _nextFrame = 49;
+ break;
+
+ case 5:
+ _nextFrame = 50;
+ break;
+
+ default:
+ break;
+ }
+ }
+ }
+
+ if (_hermitMode == 2) {
+ if (_startTradingFl) {
+ _hermitMode = 6;
+ _hermitMovingFl = false;
+ _hermitTalkingFl = false;
+ _scene->_sequences.addTimer(1, 110);
+ } else if (_hermitMovingFl) {
+ _hermitMode = 1;
+ _nextFrame = 47;
+ _hermitTalkingFl = false;
+ } else {
+ switch (_vm->getRandomNumber(1, 4)) {
+ case 1:
+ _nextFrame = 18;
+ break;
+
+ case 2:
+ _nextFrame = 20;
+ break;
+
+ case 3:
+ _nextFrame = 22;
+ break;
+
+ case 4:
+ _nextFrame = 24;
+ break;
+
+ default:
+ break;
+ }
+ }
+ }
+
+ if (_scene->_activeAnimation != nullptr && _scene->_activeAnimation->getCurrentFrame() == 254)
+ _game._player._stepEnabled = true;
+
+ if (_game._trigger == 110) {
+ _game._player._stepEnabled = false;
+ _game._player._visible = false;
+ _globals._sequenceIndexes[3] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[3], false, 7, 1, 0, 0);
+ _scene->_sequences.setAnimRange(_globals._sequenceIndexes[3], 1, 2);
+ _scene->_sequences.setMsgLayout(_globals._sequenceIndexes[3]);
+ _scene->_sequences.addSubEntry(_globals._sequenceIndexes[3], SEQUENCE_TRIGGER_EXPIRE, 0, 111);
+ }
+
+ if (_game._trigger == 111) {
+ int syncIdx = _globals._sequenceIndexes[3];
+ _globals._sequenceIndexes[3] = _scene->_sequences.startCycle(_globals._spriteIndexes[3], false, 2);
+ _scene->_sequences.setMsgLayout(_globals._sequenceIndexes[3]);
+ _scene->_sequences.updateTimeout(_globals._sequenceIndexes[3], syncIdx);
+ _nextFrame = 1;
+ }
+
+ if (_game._trigger == 112) {
+ _game._player._priorTimer = _scene->_frameStartTime - _game._player._ticksAmount;
+ _game._player._visible = true;
+ }
+
+ if (_hermitMode == 6) {
+ if ((_scene->_activeAnimation->getCurrentFrame() == 9) && _check1Fl) {
+ _scene->_sequences.remove(_globals._sequenceIndexes[3]);
+ _globals._sequenceIndexes[3] = _scene->_sequences.startReverseCycle(_globals._spriteIndexes[3], false, 7, 1, 0, 0);
+ _scene->_sequences.setAnimRange(_globals._sequenceIndexes[3], 1, 2);
+ _scene->_sequences.setMsgLayout(_globals._sequenceIndexes[3]);
+ _scene->_sequences.addSubEntry(_globals._sequenceIndexes[3], SEQUENCE_TRIGGER_EXPIRE, 0, 112);
+ _check1Fl = false;
+ }
+
+ if ((_scene->_activeAnimation->getCurrentFrame() == 17) && !_check1Fl) {
+ _nextFrame = 26;
+ _hermitMode = 4;
+ _check1Fl = true;
+ }
+ }
+
+ if (_hermitMode == 4) {
+ if ((_scene->_activeAnimation->getCurrentFrame() == 33) && _check1Fl) {
+ displayHermitQuestions(_hermitDisplayedQuestion);
+ _nextFrame = 1;
+ _check1Fl = false;
+ }
+
+ if ((_scene->_activeAnimation->getCurrentFrame() == 9) && !_check1Fl) {
+ _nextFrame = 8;
+ _scene->_sequences.addTimer(1, 113);
+ _check1Fl = true;
+ }
+ }
+
+ if (_game._trigger == 113) {
+ _game._player._visible = false;
+ _globals._sequenceIndexes[3] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[3], false, 7, 1, 0, 0);
+ _scene->_sequences.setAnimRange(_globals._sequenceIndexes[3], 1, 2);
+ _scene->_sequences.setMsgLayout(_globals._sequenceIndexes[3]);
+ _scene->_sequences.addSubEntry(_globals._sequenceIndexes[3], SEQUENCE_TRIGGER_EXPIRE, 0, 114);
+ }
+
+ if (_game._trigger == 114) {
+ _resetBatterieText = true;
+ int syncIdx = _globals._sequenceIndexes[3];
+ _nextFrame = 10;
+ _globals._sequenceIndexes[3] = _scene->_sequences.startReverseCycle(_globals._spriteIndexes[3], false, 7, 1, 0, 0);
+ _scene->_sequences.setAnimRange(_globals._sequenceIndexes[3], 1, 2);
+ _scene->_sequences.updateTimeout(_globals._sequenceIndexes[3], syncIdx);
+ _scene->_sequences.setMsgLayout(_globals._sequenceIndexes[3]);
+ _scene->_sequences.addSubEntry(_globals._sequenceIndexes[3], SEQUENCE_TRIGGER_EXPIRE, 0, 115);
+ }
+
+ if ((_nextFrame >= 0) && (_nextFrame != _scene->_activeAnimation->getCurrentFrame())) {
+ _scene->_activeAnimation->setCurrentFrame(_nextFrame);
+ _nextFrame = -1;
+ }
+
+ if (_game._trigger == 115) {
+ _game._player._priorTimer = _scene->_frameStartTime - _game._player._ticksAmount;
+ _game._player._visible = true;
+ if (_hermitDisplayedQuestion == 21) {
+ _game._player._stepEnabled = false;
+ handleTrading();
+ _hermitMode = 0;
+ _startTradingFl = false;
+ _nextFrame = 52;
+ _globals[kHasTalkedToHermit] = true;
+ _scene->_hotspots.activate(NOUN_HERMIT, false);
+ } else {
+ _game._player._stepEnabled = true;
+ _hermitMode = 1;
+ _nextFrame = 47;
+ _hermitTalkingFl = false;
+ _startTradingFl = false;
+ _check1Fl = true;
+ }
+ }
+}
+
+void Scene611::preActions() {
+ if (_action.isAction(VERB_WALK_DOWN, NOUN_ALLEY))
+ _game._player._walkOffScreenSceneId = 609;
+
+ if (_resetBatterieText)
+ _scene->_kernelMessages.reset();
+}
+
+void Scene611::actions() {
+ if (_game._screenObjects._inputMode == kInputConversation)
+ handleDialog();
+ else if ((_action.isAction(VERB_GIVE, NOUN_PHONE_CELLS, NOUN_HERMIT)) || (_action.isAction(VERB_GIVE, NOUN_DURAFAIL_CELLS, NOUN_HERMIT))) {
+ _action._activeAction._verbId = 0x294;
+ _giveBatteriesFl = true;
+ handleSubDialog1();
+ } else if (_action.isAction(VERB_GIVE, NOUN_HERMIT)) {
+ _scene->_kernelMessages.reset();
+
+ Common::String curQuote = _game.getQuote(0x323);
+ int width = _vm->_font->getWidth(curQuote, _scene->_textSpacing);
+ int quotePosX = _defaultDialogPos.x - (width / 2);
+ _scene->_kernelMessages.add(Common::Point(quotePosX, _defaultDialogPos.y), 0xFDFC, 0, 0, 120, curQuote);
+
+ curQuote = _game.getQuote(0x324);
+ width = _vm->_font->getWidth(curQuote, _scene->_textSpacing);
+ quotePosX = _defaultDialogPos.x - (width / 2);
+ _scene->_kernelMessages.add(Common::Point(quotePosX, _defaultDialogPos.y + 14), 0xFDFC, 0, 0, 120, curQuote);
+ } else if (_game._trigger == 90) {
+ if (_dialog2.read(0x29C) && _dialog2.read(0x29D) && _dialog2.read(0x29E)) {
+ handleTalking(180);
+ if (_vm->getRandomNumber(1, 2) == 1)
+ displayHermitQuestions(1);
+ else
+ displayHermitQuestions(2);
+ } else {
+ handleTalking(180);
+ if (_vm->getRandomNumber(1, 2) == 1)
+ displayHermitQuestions(3);
+ else
+ displayHermitQuestions(4);
+ }
+
+ _duringDialogFl = true;
+ if (_dialog2.read(0x29F)) {
+ _hermitDialogNode = 1;
+ _dialog1.start();
+ _duringDialogFl = true;
+ } else {
+ _hermitDialogNode = 2;
+ _dialog2.write(0x29F, true);
+ _dialog2.start();
+ _duringDialogFl = true;
+ }
+ } else if (_action.isAction(VERB_TALKTO, NOUN_HERMIT)) {
+ if (!_dialog1.read(0x287)) {
+ _scene->_kernelMessages.reset();
+ _scene->_kernelMessages.add(Common::Point(0, 0), 0x1110, 34, 0, 120, _game.getQuote(0x27A));
+ _scene->_sequences.addTimer(120, 90);
+ } else {
+ int nextQuote = 0;
+ switch (_vm->getRandomNumber(1, 3)) {
+ case 1:
+ nextQuote = 0x27B;
+ break;
+
+ case 2:
+ nextQuote = 0x27C;
+ break;
+
+ case 3:
+ nextQuote = 0x27D;
+ break;
+ }
+ _scene->_kernelMessages.reset();
+ _scene->_kernelMessages.add(Common::Point(0, 0), 0x1110, 34, 0, 120, _game.getQuote(nextQuote));
+ _scene->_sequences.addTimer(120, 90);
+ }
+ } else if ((_action.isAction(VERB_WALKTO) || _action.isAction(VERB_LOOK)) && _action.isObject(NOUN_RAT)) {
+ switch (_game._trigger) {
+ case 0:
+ _scene->_kernelMessages.reset();
+ _scene->_kernelMessages.add(Common::Point(0, 0), 0x1110, 34, 0, 120, _game.getQuote(0x279));
+ _scene->_sequences.addTimer(60, 1);
+ break;
+
+ case 1:
+ handleRatMoves();
+ _game._player._stepEnabled = true;
+ break;
+
+ default:
+ break;
+ }
+ } else if (_action._lookFlag) {
+ if (_globals[kHasTalkedToHermit])
+ _vm->_dialogs->show(61111);
+ else
+ _vm->_dialogs->show(61110);
+ } else if (_action.isAction(VERB_LOOK, NOUN_HERMIT))
+ _vm->_dialogs->show(61112);
+ else if (_action.isAction(VERB_LOOK, NOUN_TRASH))
+ _vm->_dialogs->show(61113);
+ else if (_action.isAction(VERB_TAKE, NOUN_TRASH))
+ _vm->_dialogs->show(61114);
+ else if (_action.isAction(VERB_LOOK, NOUN_CARDBOARD_BOX))
+ _vm->_dialogs->show(61115);
+ else if (_action.isAction(VERB_TAKE, NOUN_CARDBOARD_BOX))
+ _vm->_dialogs->show(61116);
+ else if (_action.isAction(VERB_OPEN, NOUN_CARDBOARD_BOX))
+ _vm->_dialogs->show(61117);
+ else if (_action.isAction(VERB_LOOK, NOUN_REFRIGERATOR))
+ _vm->_dialogs->show(61118);
+ else if (_action.isAction(VERB_OPEN, NOUN_REFRIGERATOR))
+ _vm->_dialogs->show(61119);
+ else if (_action.isAction(VERB_TAKE, NOUN_REFRIGERATOR))
+ _vm->_dialogs->show(61120);
+ else if (_action.isAction(VERB_LOOK, NOUN_BUILDING))
+ _vm->_dialogs->show(61121);
+ else if (_action.isAction(VERB_LOOK, NOUN_GRAFFITI))
+ _vm->_dialogs->show(61122);
+ else if (_action.isAction(VERB_LOOK, NOUN_METAL_PIPE))
+ _vm->_dialogs->show(61123);
+ else
+ return;
+
+ _action._inProgress = false;
+}
+
+/*------------------------------------------------------------------------*/
+
+Scene612::Scene612(MADSEngine *vm) : Scene6xx(vm) {
+ _actionMode = -1;
+ _cycleIndex = -1;
+}
+
+void Scene612::synchronize(Common::Serializer &s) {
+ Scene6xx::synchronize(s);
+
+ s.syncAsSint16LE(_actionMode);
+ s.syncAsSint16LE(_cycleIndex);
+}
+
+void Scene612::setup() {
+ setPlayerSpritesPrefix();
+ setAAName();
+ _scene->addActiveVocab(NOUN_FISHING_LINE);
+ _scene->addActiveVocab(VERB_WALKTO);
+}
+
+void Scene612::handleWinchMovement() {
+ switch (_game._trigger) {
+ case 0:
+ _game._player._stepEnabled = false;
+ _game._player._visible = false;
+ _globals._sequenceIndexes[4] = _scene->_sequences.startReverseCycle(_globals._spriteIndexes[4], false, 10, 1, 0, 0);
+ _scene->_sequences.setAnimRange(_globals._sequenceIndexes[4], 1, 5);
+ _scene->_sequences.setMsgLayout(_globals._sequenceIndexes[4]);
+ _scene->_sequences.addSubEntry(_globals._sequenceIndexes[4], SEQUENCE_TRIGGER_SPRITE, 5, 1);
+ _scene->_sequences.addSubEntry(_globals._sequenceIndexes[4], SEQUENCE_TRIGGER_EXPIRE, 0, 2);
+ break;
+
+ case 1:
+ // CHECKME: Is the "else" block useful as action is always equal to 1 at this point?
+ // Or is it a missing bit of code we could fix?
+ if (_actionMode == 1) {
+ _scene->_sequences.remove(_globals._sequenceIndexes[2]);
+ _globals._sequenceIndexes[2] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[2], false, 17, 7, 0, 0);
+ _vm->_sound->command(19);
+ _game._objects.setRoom(OBJ_PADLOCK_KEY, 1);
+ _globals[kBoatRaised] = false;
+ } else {
+ _scene->_sequences.remove(_globals._sequenceIndexes[2]);
+ _globals._sequenceIndexes[2] = _scene->_sequences.startReverseCycle(_globals._spriteIndexes[2], false, 17, 9, 0, 0);
+ _vm->_sound->command(18);
+ }
+ _scene->_sequences.setDepth(_globals._sequenceIndexes[2], 1);
+ _scene->_sequences.addSubEntry(_globals._sequenceIndexes[2], SEQUENCE_TRIGGER_EXPIRE, 0, 3);
+ break;
+
+ case 2:
+ _scene->_sequences.updateTimeout(-1, _globals._sequenceIndexes[4]);
+ _game._player._visible = true;
+ break;
+
+ case 3: {
+ int syncIdx = _globals._sequenceIndexes[2];
+ _globals._sequenceIndexes[2] = _scene->_sequences.startCycle(_globals._spriteIndexes[2], false, _cycleIndex);
+ _scene->_sequences.setDepth(_globals._sequenceIndexes[2], 1);
+ _scene->_sequences.updateTimeout(_globals._sequenceIndexes[2], syncIdx);
+ _scene->_kernelMessages.reset();
+ _scene->_kernelMessages.add(Common::Point(0, 0), 0x1110, 34, 0, 120, _game.getQuote(0x2F4));
+ _game._player._stepEnabled = true;
+
+ _vm->_dialogs->show(61217);
+ }
+ break;
+
+ default:
+ break;
+ }
+}
+
+void Scene612::enter() {
+ _globals._spriteIndexes[1] = _scene->_sprites.addSprites(formAnimName('c', -1));
+ _globals._spriteIndexes[2] = _scene->_sprites.addSprites(formAnimName('p', -1));
+ _globals._spriteIndexes[3] = _scene->_sprites.addSprites("*RXCD_3");
+ _globals._spriteIndexes[4] = _scene->_sprites.addSprites("*RXRC_6");
+
+ if ((_globals[kLineStatus] == 2) || (_globals[kLineStatus] == 3)) {
+ _globals._spriteIndexes[5] = _scene->_sprites.addSprites(formAnimName('f', -1));
+ _globals._sequenceIndexes[5] = _scene->_sequences.startCycle(_globals._spriteIndexes[5], false, -1);
+ _scene->_sequences.setDepth(_globals._sequenceIndexes[5], 1);
+ int idx = _scene->_dynamicHotspots.add(NOUN_FISHING_LINE, VERB_WALKTO, _globals._sequenceIndexes[5], Common::Rect(0, 0, 0, 0));
+ _scene->_dynamicHotspots.setPosition(idx, Common::Point(34, 117), FACING_SOUTHEAST);
+ }
+
+ if (_globals[kBoatRaised])
+ _cycleIndex = -2;
+ else
+ _cycleIndex = -1;
+
+ _globals._sequenceIndexes[2] = _scene->_sequences.startCycle(_globals._spriteIndexes[2], false, _cycleIndex);
+ _scene->_sequences.setDepth(_globals._sequenceIndexes[2], 1);
+
+ if (_scene->_priorSceneId != -2) {
+ _game._player._playerPos = Common::Point(280, 75);
+ _game._player._facing = FACING_SOUTHWEST;
+ _game._player._visible = false;
+ _game._player._stepEnabled = false;
+ _globals._sequenceIndexes[1] = _scene->_sequences.startCycle(_globals._spriteIndexes[1], false, -1);
+ _scene->_sequences.setDepth(_globals._sequenceIndexes[1], 3);
+ _scene->loadAnimation(formAnimName('R', 1), 70);
+ }
+
+ sceneEntrySound();
+
+ if (_scene->_roomChanged)
+ _game._objects.addToInventory(OBJ_PADLOCK_KEY);
+
+ _game.loadQuoteSet(0x2F5, 0x2F4, 0);
+}
+
+void Scene612::step() {
+ switch (_game._trigger) {
+ case 70:
+ _game._player._visible = true;
+ _game._player._priorTimer = _scene->_activeAnimation->getNextFrameTimer() - _game._player._ticksAmount;
+ _scene->_sequences.addTimer(6, 71);
+ break;
+
+ case 71:
+ _scene->_sequences.remove(_globals._sequenceIndexes[1]);
+ _globals._sequenceIndexes[1] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[1], false, 6, 1, 0, 0);
+ _scene->_sequences.setDepth(_globals._sequenceIndexes[1], 2);
+ _scene->_sequences.addSubEntry(_globals._sequenceIndexes[1], SEQUENCE_TRIGGER_EXPIRE, 0, 72);
+ break;
+
+ case 72:
+ _globals._sequenceIndexes[1] = _scene->_sequences.startCycle(_globals._spriteIndexes[1], false, -2);
+ _scene->_sequences.setDepth(_globals._sequenceIndexes[1], 2);
+ _game._player._stepEnabled = true;
+ break;
+
+ default:
+ break;
+ }
+}
+
+void Scene612::actions() {
+ if (_action.isAction(VERB_GET_INSIDE, NOUN_CAR)) {
+ switch (_game._trigger) {
+ case 0:
+ _game._player._stepEnabled = false;
+ _scene->_sequences.remove(_globals._sequenceIndexes[1]);
+ _globals._sequenceIndexes[1] = _scene->_sequences.startReverseCycle(_globals._spriteIndexes[1], false, 6, 1, 0, 0);
+ _scene->_sequences.setDepth(_globals._sequenceIndexes[1], 2);
+ _scene->_sequences.addSubEntry(_globals._sequenceIndexes[1], SEQUENCE_TRIGGER_EXPIRE, 0, 1);
+ break;
+
+ case 1: {
+ int syncIdx = _globals._sequenceIndexes[1];
+ _globals._sequenceIndexes[1] = _scene->_sequences.startCycle(_globals._spriteIndexes[1], false, -1);
+ _scene->_sequences.setDepth(_globals._sequenceIndexes[1], 3);
+ _scene->_sequences.updateTimeout(_globals._sequenceIndexes[1], syncIdx);
+ _scene->_sequences.addTimer(6, 2);
+ }
+ break;
+
+ case 2:
+ _game._player._visible = false;
+ _globals._sequenceIndexes[3] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[3], true, 10, 1, 0, 0);
+ _scene->_sequences.setMsgLayout(_globals._sequenceIndexes[3]);
+ _scene->_sequences.addSubEntry(_globals._sequenceIndexes[3], SEQUENCE_TRIGGER_EXPIRE, 0, 3);
+ break;
+
+ case 3: {
+ int syncIdx = _globals._sequenceIndexes[3];
+ _globals._sequenceIndexes[3] = _scene->_sequences.startCycle(_globals._spriteIndexes[3], true, -2);
+ _scene->_sequences.setMsgLayout(_globals._sequenceIndexes[3]);
+ _scene->_sequences.updateTimeout(_globals._sequenceIndexes[3], syncIdx);
+ _scene->_nextSceneId = 504;
+ }
+ break;
+
+ default:
+ break;
+ }
+ } else if (_action.isAction(VERB_UNLOCK, NOUN_PADLOCK_KEY, NOUN_CONTROL_BOX)) {
+ _cycleIndex = -2;
+ _actionMode = 1;
+ handleWinchMovement();
+ } else if (_action._lookFlag || _action.isAction(VERB_LOOK, NOUN_EXPRESSWAY))
+ _vm->_dialogs->show(61210);
+ else if (_action.isAction(VERB_LOOK, NOUN_ROPE) || _action.isAction(VERB_LOOK, NOUN_ARMATURE)) {
+ if (_globals[kBoatRaised])
+ _vm->_dialogs->show(61211);
+ else
+ _vm->_dialogs->show(61212);
+ } else if (_action.isAction(VERB_TAKE, NOUN_ROPE))
+ _vm->_dialogs->show(61213);
+ else if (_action.isAction(VERB_LOOK, NOUN_CONTROL_BOX)) {
+ if (_globals[kBoatRaised])
+ _vm->_dialogs->show(61214);
+ else
+ _vm->_dialogs->show(61216);
+ } else if (_action.isAction(VERB_OPEN, NOUN_CONTROL_BOX))
+ _vm->_dialogs->show(61215);
+ else if (_action.isAction(VERB_LOOK, NOUN_BUILDINGS))
+ _vm->_dialogs->show(61218);
+ else if (_action.isAction(VERB_LOOK, NOUN_DOME))
+ _vm->_dialogs->show(61219);
+ else if (_action.isAction(VERB_LOOK, NOUN_STATUE))
+ _vm->_dialogs->show(61220);
+ else if (_action.isAction(VERB_LOOK, NOUN_MAINTENANCE_BUILDING))
+ _vm->_dialogs->show(61221);
+ else if (_action.isAction(VERB_OPEN, NOUN_MAINTENANCE_BUILDING))
+ _vm->_dialogs->show(61222);
+ else if (_action.isAction(VERB_LOOK, NOUN_WALL))
+ _vm->_dialogs->show(61223);
+ else if (_action.isAction(VERB_LOOK, NOUN_SUPPORT))
+ _vm->_dialogs->show(61224);
+ else if (_action.isAction(VERB_WALK_DOWN, NOUN_EXPRESSWAY_TO_EAST) || _action.isAction(VERB_WALK_DOWN, NOUN_EXPRESSWAY_TO_WEST))
+ _vm->_dialogs->show(61225);
+ else
+ return;
+
+ _action._inProgress = false;
+}
+
+/*------------------------------------------------------------------------*/
+
+void Scene620::setup() {
+ _game._player._spritesPrefix = "";
+ setAAName();
+}
+
+void Scene620::enter() {
+ _globals._spriteIndexes[1] = _scene->_sprites.addSprites(formAnimName('b', 0));
+ _globals._sequenceIndexes[1] = _scene->_sequences.startCycle(_globals._spriteIndexes[1], false, -1);
+ _game._player._stepEnabled = false;
+ _game._player._visible = false;
+ _scene->_sequences.addTimer(30, 70);
+ _scene->_userInterface.setup(kInputLimitedSentences);
+ sceneEntrySound();
+}
+
+void Scene620::step() {
+ switch (_game._trigger) {
+ case 70:
+ _scene->_sequences.remove(_globals._sequenceIndexes[1]);
+ _scene->loadAnimation(formAnimName('E', -1), 71);
+ break;
+
+ case 71:
+ if (_scene->_priorSceneId == 751) {
+ _globals[kCityFlooded] = true;
+ _globals[kTeleporterRoom + 5] = 0;
+ _scene->_nextSceneId = 701;
+ } else if (_scene->_priorSceneId == 752) {
+ _globals[kCityFlooded] = true;
+ _globals[kTeleporterRoom + 5] = 0;
+ _scene->_nextSceneId = 702;
+ } else if (_scene->_priorSceneId < 501 || _scene->_priorSceneId > 752) {
+ _globals[kCityFlooded] = true;
+ _globals[kTeleporterRoom + 5] = 0;
+ _scene->_nextSceneId = _scene->_priorSceneId;
+ } else if (_scene->_priorSceneId >= 501 && _scene->_priorSceneId <= 612) {
+ _globals[kResurrectRoom] = _globals[kHoverCarLocation];
+ _game._objects.addToInventory(OBJ_TIMEBOMB);
+ _globals[kTimebombStatus] = 0;
+ _globals[kTimebombTimer] = 0;
+ _scene->_nextSceneId = 605;
+ }
+ _game._player._stepEnabled = true;
+ break;
+
+ default:
+ break;
+ }
+}
+
+/*------------------------------------------------------------------------*/
+
+} // End of namespace Nebular
+} // End of namespace MADS
diff --git a/engines/mads/nebular/nebular_scenes6.h b/engines/mads/nebular/nebular_scenes6.h
new file mode 100644
index 0000000000..c5cac56626
--- /dev/null
+++ b/engines/mads/nebular/nebular_scenes6.h
@@ -0,0 +1,322 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+
+ * You should have received a copy of the GNU General Public 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 MADS_NEBULAR_SCENES6_H
+#define MADS_NEBULAR_SCENES6_H
+
+#include "common/scummsys.h"
+#include "mads/game.h"
+#include "mads/scene.h"
+#include "mads/nebular/nebular_scenes.h"
+
+namespace MADS {
+
+namespace Nebular {
+
+class Scene6xx : public NebularScene {
+protected:
+ /**
+ * Plays an appropriate sound when entering a scene
+ */
+ void setAAName();
+
+ /**
+ * Updates the prefix used for getting player sprites for the scene
+ */
+ void setPlayerSpritesPrefix();
+
+ void sceneEntrySound();
+
+public:
+ Scene6xx(MADSEngine *vm) : NebularScene(vm) {}
+};
+
+class Scene601 : public Scene6xx{
+public:
+ Scene601(MADSEngine *vm) : Scene6xx(vm) {}
+
+ virtual void setup();
+ virtual void enter();
+ virtual void step();
+ virtual void actions();
+};
+
+class Scene602 : public Scene6xx{
+private:
+ int _lastSpriteIdx;
+ int _lastSequenceIdx;
+ int _cycleIndex;
+ int _safeMode;
+
+ void handleSafeActions();
+
+public:
+ Scene602(MADSEngine *vm);
+ void synchronize(Common::Serializer &s);
+
+ virtual void setup();
+ virtual void enter();
+ virtual void actions();
+};
+
+class Scene603 : public Scene6xx{
+private:
+ int _compactCaseHotspotId;
+ int _noteHotspotId;
+
+public:
+ Scene603(MADSEngine *vm);
+ void synchronize(Common::Serializer &s);
+
+ virtual void setup();
+ virtual void enter();
+ virtual void actions();
+};
+
+class Scene604 : public Scene6xx{
+private:
+ int _timebombHotspotId;
+ int _bombMode;
+ int _monsterFrame;
+
+ uint32 _monsterTimer;
+
+ bool _monsterActive;
+ bool _animationActiveFl;
+
+ void handleBombActions();
+
+public:
+ Scene604(MADSEngine *vm);
+ void synchronize(Common::Serializer &s);
+
+ virtual void setup();
+ virtual void enter();
+ virtual void step();
+ virtual void actions();
+};
+
+class Scene605 : public Scene6xx{
+public:
+ Scene605(MADSEngine *vm) : Scene6xx(vm) {}
+
+ virtual void setup();
+ virtual void enter();
+ virtual void step();
+ virtual void actions();
+};
+
+class Scene607 : public Scene6xx{
+private:
+ uint32 _dogTimer;
+ uint32 _lastFrameTime;
+
+ bool _dogLoop;
+ bool _dogEatsRex;
+ bool _dogBarking;
+ bool _shopAvailable;
+
+ int _animationMode;
+ int _animationActive;
+ int _counter;
+
+ void handleThrowingBone();
+
+public:
+ Scene607(MADSEngine *vm);
+ void synchronize(Common::Serializer &s);
+
+ virtual void setup();
+ virtual void enter();
+ virtual void step();
+ virtual void preActions();
+ virtual void actions();
+};
+
+class Scene608 : public Scene6xx{
+private:
+ int _carMode;
+ int _carFrame;
+ int _carMoveMode;
+ int _dogDeathMode;
+ int _carHotspotId;
+ int _barkCount;
+ int _polycementHotspotId;
+ int _animationMode;
+ int _nextTrigger;
+ int _throwMode;
+
+ bool _resetPositionsFl;
+ bool _dogActiveFl;
+ bool _dogBarkingFl;
+ bool _dogFirstEncounter;
+ bool _rexBeingEaten;
+ bool _dogHitWindow;
+ bool _checkFl;
+ bool _dogSquashFl;
+ bool _dogSafeFl;
+ bool _buttonPressedonTimeFl;
+ bool _dogUnderCar;
+ bool _dogYelping;
+
+ long _dogWindowTimer;
+ long _dogRunTimer;
+
+ uint32 _dogTimer1;
+ uint32 _dogTimer2;
+
+ void resetDogVariables();
+ void restoreAnimations();
+ void setCarAnimations();
+ void handleThrowingBone();
+
+public:
+ Scene608(MADSEngine *vm);
+ void synchronize(Common::Serializer &s);
+
+ virtual void setup();
+ virtual void enter();
+ virtual void step();
+ virtual void preActions();
+ virtual void actions();
+};
+
+class Scene609 : public Scene6xx{
+private:
+ int _videoDoorMode;
+
+ void enterStore();
+
+public:
+ Scene609(MADSEngine *vm);
+ void synchronize(Common::Serializer &s);
+
+ virtual void setup();
+ virtual void enter();
+ virtual void step();
+ virtual void preActions();
+ virtual void actions();
+};
+
+class Scene610 : public Scene6xx{
+private:
+ int _handsetHotspotId;
+ int _checkVal;
+
+ bool _cellCharging;
+
+ long _cellChargingTimer;
+ uint32 _lastFrameTimer;
+
+public:
+ Scene610(MADSEngine *vm);
+ void synchronize(Common::Serializer &s);
+
+ virtual void setup();
+ virtual void enter();
+ virtual void step();
+ virtual void actions();
+};
+
+class Scene611 : public Scene6xx{
+private:
+ bool _seenRatFl;
+ bool _eyesRunningFl;
+ bool _shouldRemoveEyes;
+ bool _ratPresentFl;
+ bool _duringDialogFl;
+ bool _resetBatterieText;
+ bool _hermitTalkingFl;
+ bool _hermitMovingFl;
+ bool _alreadyTalkingFl;
+ bool _giveBatteriesFl;
+ bool _startTradingFl;
+ bool _check1Fl;
+ bool _stickFingerFl;
+
+ int _randVal;
+ int _ratHotspotId;
+ int _hermitDialogNode;
+ int _hermitDisplayedQuestion;
+ int _nextFrame;
+ int _hermitMode;
+
+ uint32 _ratTimer;
+
+ Conversation _dialog1;
+ Conversation _dialog2;
+
+ Common::Point _defaultDialogPos;
+
+ void handleTrading();
+ void handleRatMoves();
+ void handleDialog();
+ void handleSubDialog1();
+ void handleSubDialog2();
+ void handleTalking(int delay);
+ void setDialogNode(int node);
+ void displayHermitQuestions(int question);
+
+ bool check2ChargedBatteries();
+ bool check4ChargedBatteries();
+
+public:
+ Scene611(MADSEngine *vm);
+ void synchronize(Common::Serializer &s);
+
+ virtual void setup();
+ virtual void enter();
+ virtual void step();
+ virtual void preActions();
+ virtual void actions();
+};
+
+class Scene612 : public Scene6xx{
+private:
+ int _actionMode;
+ int _cycleIndex;
+
+ void handleWinchMovement();
+
+public:
+ Scene612(MADSEngine *vm);
+ void synchronize(Common::Serializer &s);
+
+ virtual void setup();
+ virtual void enter();
+ virtual void step();
+ virtual void actions();
+};
+
+class Scene620 : public Scene6xx{
+public:
+ Scene620(MADSEngine *vm) : Scene6xx(vm) {}
+
+ virtual void setup();
+ virtual void enter();
+ virtual void step();
+ virtual void actions() {};
+};
+} // End of namespace Nebular
+} // End of namespace MADS
+
+#endif /* MADS_NEBULAR_SCENES6_H */
diff --git a/engines/mads/nebular/nebular_scenes7.cpp b/engines/mads/nebular/nebular_scenes7.cpp
new file mode 100644
index 0000000000..930bb7c250
--- /dev/null
+++ b/engines/mads/nebular/nebular_scenes7.cpp
@@ -0,0 +1,2679 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+
+ * You should have received a copy of the GNU General Public 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 "mads/mads.h"
+#include "mads/scene.h"
+#include "mads/nebular/nebular_scenes.h"
+#include "mads/nebular/nebular_scenes7.h"
+
+namespace MADS {
+
+namespace Nebular {
+
+void Scene7xx::setAAName() {
+ _game._aaName = Resources::formatAAName(5);
+}
+
+void Scene7xx::setPlayerSpritesPrefix() {
+ _vm->_sound->command(5);
+
+ Common::String oldName = _game._player._spritesPrefix;
+
+ if ((_scene->_nextSceneId == 703) || (_scene->_nextSceneId == 704) || (_scene->_nextSceneId == 705)
+ || (_scene->_nextSceneId == 707) || (_scene->_nextSceneId == 710) || (_scene->_nextSceneId == 711))
+ _game._player._spritesPrefix = "";
+ else if (_globals[kSexOfRex] == REX_MALE)
+ _game._player._spritesPrefix = "RXM";
+ else
+ _game._player._spritesPrefix = "ROX";
+
+ _game._player._scalingVelocity = true;
+
+ if (oldName != _game._player._spritesPrefix)
+ _game._player._spritesChanged = true;
+
+ _vm->_palette->setEntry(16, 10, 63, 63);
+ _vm->_palette->setEntry(17, 10, 45, 45);
+}
+
+void Scene7xx::sceneEntrySound() {
+ if (!_vm->_musicFlag) {
+ _vm->_sound->command(2);
+ return;
+ }
+
+ switch (_scene->_nextSceneId) {
+ case 701:
+ case 702:
+ case 704:
+ case 705:
+ case 751:
+ _vm->_sound->command(38);
+ break;
+ case 703:
+ if (_globals[kMonsterAlive] == 0)
+ _vm->_sound->command(24);
+ else
+ _vm->_sound->command(27);
+ break;
+ case 706:
+ case 707:
+ case 710:
+ case 711:
+ _vm->_sound->command(25);
+ break;
+ default:
+ break;
+ }
+}
+
+/*------------------------------------------------------------------------*/
+
+Scene701::Scene701(MADSEngine *vm) : Scene7xx(vm) {
+ _fishingLineId = -1;
+}
+
+void Scene701::synchronize(Common::Serializer &s) {
+ Scene7xx::synchronize(s);
+
+ s.syncAsSint16LE(_fishingLineId);
+}
+
+void Scene701::setup() {
+ setPlayerSpritesPrefix();
+ setAAName();
+
+ _scene->addActiveVocab(NOUN_BOAT);
+ _scene->addActiveVocab(VERB_CLIMB_INTO);
+ _scene->addActiveVocab(NOUN_FISHING_LINE);
+ _scene->addActiveVocab(VERB_WALKTO);
+}
+
+void Scene701::enter() {
+ _globals._spriteIndexes[1] = _scene->_sprites.addSprites(formAnimName('x', 0));
+ _globals._spriteIndexes[2] = _scene->_sprites.addSprites(formAnimName('b', 5));
+ _globals._spriteIndexes[4] = _scene->_sprites.addSprites(formAnimName('b', 0));
+ _globals._spriteIndexes[3] = _scene->_sprites.addSprites(formAnimName('b', 1));
+ _globals._spriteIndexes[5] = _scene->_sprites.addSprites("*RM202A1");
+ _globals._spriteIndexes[6] = _scene->_sprites.addSprites(formAnimName('b', 8));
+
+ if (_scene->_roomChanged) {
+ _game._objects.addToInventory(OBJ_BINOCULARS);
+ _game._objects.addToInventory(OBJ_TWINKIFRUIT);
+ _game._objects.addToInventory(OBJ_BOMB);
+ _game._objects.addToInventory(OBJ_CHICKEN);
+ _game._objects.addToInventory(OBJ_BONES);
+
+ _globals[kCityFlooded] = true;
+ _globals[kLineStatus] = LINE_TIED;
+ _globals[kBoatRaised] = false;
+ }
+
+ if (_globals[kBoatStatus] == BOAT_UNFLOODED) {
+ if (_globals[kBoatRaised])
+ _globals[kBoatStatus] = BOAT_GONE;
+ else if (_globals[kLineStatus] == LINE_TIED)
+ _globals[kBoatStatus] = BOAT_TIED_FLOATING;
+ else if (_game._difficulty == DIFFICULTY_HARD)
+ _globals[kBoatStatus] = BOAT_ADRIFT;
+ else
+ _globals[kBoatStatus] = BOAT_TIED;
+ }
+
+ _globals._sequenceIndexes[1] = _scene->_sequences.startCycle(_globals._spriteIndexes[1], false, 1);
+ _scene->_sequences.setPosition(_globals._sequenceIndexes[1], Common::Point(48, 136));
+ _scene->_sequences.setDepth(_globals._sequenceIndexes[1], 10);
+
+ int boatStatus = (_scene->_priorSceneId == 703) ? BOAT_GONE : _globals[kBoatStatus];
+
+ switch (boatStatus) {
+ case BOAT_TIED_FLOATING:
+ _globals._sequenceIndexes[4] = _scene->_sequences.startReverseCycle(_globals._spriteIndexes[4], false, 20, 0, 0, 0);
+ _scene->_sequences.setDepth(_globals._sequenceIndexes[4], 10);
+ break;
+ case BOAT_ADRIFT:
+ _globals._sequenceIndexes[6] = _scene->_sequences.startReverseCycle(_globals._spriteIndexes[6], false, 20, 0, 0, 0);
+ _scene->_sequences.setDepth(_globals._sequenceIndexes[6], 10);
+ break;
+ case BOAT_TIED:
+ _globals._sequenceIndexes[2] = _scene->_sequences.startCycle(_globals._spriteIndexes[2], false, -1);
+ _scene->_sequences.setDepth(_globals._sequenceIndexes[2], 9);
+ break;
+ case BOAT_GONE:
+ _scene->_hotspots.activate(NOUN_BOAT, false);
+ break;
+ default:
+ break;
+ }
+
+ if (_globals[kLineStatus] == LINE_DROPPED || _globals[kLineStatus] == LINE_TIED) {
+ _globals._sequenceIndexes[3] = _scene->_sequences.startCycle(_globals._spriteIndexes[3], false, -1);
+ _scene->_sequences.setDepth(_globals._sequenceIndexes[3], 8);
+ int idx = _scene->_dynamicHotspots.add(NOUN_FISHING_LINE, VERB_WALKTO, _globals._sequenceIndexes[3], Common::Rect(0, 0, 0, 0));
+ _fishingLineId = _scene->_dynamicHotspots.setPosition(idx, Common::Point(234, 129), FACING_NORTHEAST);
+ }
+
+ if (_scene->_priorSceneId == 702) {
+ _game._player._playerPos = Common::Point(309, 138);
+ _game._player._facing = FACING_WEST;
+ } else if (_scene->_priorSceneId == 710) {
+ _game._player._playerPos = Common::Point(154, 129);
+ _game._player._facing = FACING_NORTH;
+ _game._player._visible = false;
+ _game._player._stepEnabled = false;
+ _globals._sequenceIndexes[5] = _scene->_sequences.startCycle(_globals._spriteIndexes[5], false, 1);
+ _scene->_sequences.setPosition(_globals._sequenceIndexes[5], Common::Point(155, 129));
+ _scene->_sequences.addTimer(15, 60);
+ } else if (_scene->_priorSceneId == 703) {
+ _game._player._playerPos = Common::Point(231, 127);
+ _game._player._facing = FACING_SOUTH;
+ _game._player._visible = false;
+ _game._player._stepEnabled = false;
+ _scene->loadAnimation(formAnimName('B', 1), 80);
+ _vm->_sound->command(28);
+ } else if (_scene->_priorSceneId != -2 && _scene->_priorSceneId != 620) {
+ _game._player._playerPos = Common::Point(22, 131);
+ _game._player._facing = FACING_EAST;
+ _game._player._stepEnabled = false;
+ _scene->_sequences.addTimer(60, 70);
+ }
+
+ _game.loadQuoteSet(0x310, 0x30F, 0);
+ sceneEntrySound();
+}
+
+void Scene701::step() {
+ switch(_game._trigger) {
+ case 60:
+ _scene->_sequences.remove(_globals._sequenceIndexes[5]);
+ _globals._sequenceIndexes[5] = _scene->_sequences.startReverseCycle(_globals._spriteIndexes[5], false, 6, 1, 0, 0);
+ _scene->_sequences.setPosition(_globals._sequenceIndexes[5], Common::Point(155, 129));
+ _scene->_sequences.addSubEntry(_globals._sequenceIndexes[5], SEQUENCE_TRIGGER_EXPIRE, 0, 61);
+ break;
+
+ case 61:
+ _scene->_sequences.updateTimeout(-1, _globals._sequenceIndexes[5]);
+ _game._player._visible = true;
+ _game._player._stepEnabled = true;
+ break;
+
+ case 70:
+ _vm->_sound->command(16);
+ _scene->_sequences.remove(_globals._sequenceIndexes[1]);
+ _globals._sequenceIndexes[1] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[1], false, 5, 1, 0, 0);
+ _scene->_sequences.setPosition(_globals._sequenceIndexes[1], Common::Point(48, 136));
+ _scene->_sequences.setDepth(_globals._sequenceIndexes[1], 10);
+ _scene->_sequences.addSubEntry(_globals._sequenceIndexes[1], SEQUENCE_TRIGGER_EXPIRE, 0, 71);
+ break;
+
+ case 71:
+ _game._player.walk(Common::Point(61, 131), FACING_EAST);
+ _scene->_sequences.addTimer(120, 72);
+ break;
+
+ case 72:
+ _vm->_sound->command(17);
+ _globals._sequenceIndexes[1] = _scene->_sequences.addReverseSpriteCycle(_globals._spriteIndexes[1], false, 5, 1, 0, 0);
+ _scene->_sequences.setPosition(_globals._sequenceIndexes[1], Common::Point(48, 136));
+ _scene->_sequences.setDepth(_globals._sequenceIndexes[1], 10);
+ _scene->_sequences.addSubEntry(_globals._sequenceIndexes[1], SEQUENCE_TRIGGER_EXPIRE, 0, 73);
+ break;
+
+ case 73:
+ _game._player._stepEnabled = true;
+ _globals._sequenceIndexes[1] = _scene->_sequences.startCycle(_globals._spriteIndexes[1], false, -1);
+ _scene->_sequences.setPosition(_globals._sequenceIndexes[1], Common::Point(48, 136));
+ _scene->_sequences.setDepth(_globals._sequenceIndexes[1], 10);
+ _scene->_kernelMessages.reset();
+ break;
+
+ case 80: {
+ _game._player._visible = true;
+ _game._player._priorTimer = _scene->_frameStartTime - _game._player._ticksAmount;
+ _globals._sequenceIndexes[2] = _scene->_sequences.startCycle(_globals._spriteIndexes[2], false, -1);
+ _scene->_sequences.setDepth(_globals._sequenceIndexes[2], 9);
+ int idx = _scene->_dynamicHotspots.add(NOUN_BOAT, VERB_CLIMB_INTO, _globals._sequenceIndexes[2], Common::Rect(0, 0, 0, 0));
+ _scene->_dynamicHotspots.setPosition(idx, Common::Point(234, 129), FACING_NORTH);
+ _globals[kBoatStatus] = BOAT_TIED;
+ _game._player._stepEnabled = true;
+ }
+ break;
+
+ default:
+ break;
+ }
+}
+
+void Scene701::preActions() {
+ if (_action.isAction(VERB_WALKTO, NOUN_EAST_END_OF_PLATFORM))
+ _game._player._walkOffScreenSceneId = 702;
+
+ if (_action.isAction(VERB_LOOK, NOUN_BUILDING))
+ _game._player.walk(Common::Point(154, 129), FACING_NORTHEAST);
+
+ if (_action.isAction(VERB_LOOK, NOUN_BINOCULARS, NOUN_BUILDING))
+ _game._player.walk(Common::Point(154, 129), FACING_NORTH);
+}
+
+void Scene701::actions() {
+ if (_action.isAction(VERB_WALK_ALONG, NOUN_PLATFORM))
+ return;
+
+ if (_action.isAction(VERB_LOOK, NOUN_BINOCULARS, NOUN_BUILDING) && _game._objects[OBJ_VASE]._roomNumber == 706) {
+ switch (_game._trigger) {
+ case 0:
+ _game._player._stepEnabled = false;
+ _game._player._visible = false;
+ _globals._sequenceIndexes[5] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[5], false, 6, 1, 0, 0);
+ _scene->_sequences.setPosition(_globals._sequenceIndexes[5], Common::Point(155, 129));
+ _scene->_sequences.addSubEntry(_globals._sequenceIndexes[5], SEQUENCE_TRIGGER_EXPIRE, 0, 1);
+ break;
+
+ case 1: {
+ int temp = _globals._sequenceIndexes[5];
+ _globals._sequenceIndexes[5] = _scene->_sequences.startCycle(_globals._spriteIndexes[5], false, -2);
+ _scene->_sequences.setPosition(_globals._sequenceIndexes[5], Common::Point(155, 129));
+ _scene->_sequences.updateTimeout(_globals._sequenceIndexes[5], temp);
+ _scene->_sequences.addTimer(15, 2);
+ }
+ break;
+
+ case 2:
+ _scene->_nextSceneId = 710;
+ break;
+
+ default:
+ break;
+ }
+ } else if (_action.isAction(VERB_STEP_INTO, NOUN_ELEVATOR)) {
+ switch (_game._trigger) {
+ case 0:
+ _game._player._stepEnabled = false;
+ _scene->_sequences.remove(_globals._sequenceIndexes[1]);
+ _vm->_sound->command(16);
+ _globals._sequenceIndexes[1] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[1], false, 5, 1, 0, 0);
+ _scene->_sequences.setPosition(_globals._sequenceIndexes[1], Common::Point(48, 136));
+ _scene->_sequences.setDepth(_globals._sequenceIndexes[1], 10);
+ _scene->_kernelMessages.reset();
+ _scene->_kernelMessages.add(Common::Point(0, 0), 0x310, 34, 0, 120, _game.getQuote(0x30D));
+ _scene->_sequences.addSubEntry(_globals._sequenceIndexes[1], SEQUENCE_TRIGGER_EXPIRE, 0, 1);
+ break;
+
+ case 1:
+ _game._player.walk(Common::Point(22, 131), FACING_EAST);
+ _scene->_sequences.addTimer(120, 3);
+ break;
+
+ case 3:
+ _vm->_sound->command(17);
+ _globals._sequenceIndexes[1] = _scene->_sequences.startReverseCycle(_globals._spriteIndexes[1], false, 5, 1, 0, 0);
+ _scene->_sequences.setPosition(_globals._sequenceIndexes[1], Common::Point(48, 136));
+ _scene->_sequences.setDepth(_globals._sequenceIndexes[1], 10);
+ _scene->_sequences.addSubEntry(_globals._sequenceIndexes[1], SEQUENCE_TRIGGER_EXPIRE, 0, 4);
+ break;
+
+ case 4:
+ _globals._sequenceIndexes[1] = _scene->_sequences.startCycle(_globals._spriteIndexes[1], false, -1);
+ _scene->_sequences.setPosition(_globals._sequenceIndexes[1], Common::Point(48, 136));
+ _scene->_sequences.setDepth(_globals._sequenceIndexes[1], 10);
+ _globals[kResurrectRoom] = 701;
+ _scene->_nextSceneId = 605;
+ break;
+
+ default:
+ break;
+ }
+ } else if ((_action.isAction(VERB_PULL, NOUN_BOAT) || _action.isAction(VERB_TAKE, NOUN_BOAT) ||
+ _action.isAction(VERB_PULL, NOUN_FISHING_LINE) || _action.isAction(VERB_TAKE, NOUN_FISHING_LINE)) &&
+ !_game._objects.isInInventory(OBJ_FISHING_LINE)) {
+ if (_globals[kBoatStatus] == BOAT_TIED_FLOATING) {
+ switch (_game._trigger) {
+ case 0:
+ _game._player._stepEnabled = false;
+ _scene->_sequences.remove(_globals._sequenceIndexes[4]);
+ _scene->_sequences.remove(_globals._sequenceIndexes[3]);
+ _scene->_dynamicHotspots.remove(_fishingLineId);
+ _scene->_hotspots.activate(NOUN_BOAT, false);
+ _game._player._visible = false;
+ _scene->loadAnimation(formAnimName('E', -1), 1);
+ break;
+
+ case 1: {
+ _game._player._visible = true;
+ _game._player._priorTimer = _scene->_activeAnimation->getNextFrameTimer() - _game._player._ticksAmount;
+ _globals._sequenceIndexes[2] = _scene->_sequences.startCycle(_globals._spriteIndexes[2], false, -1);
+ _scene->_sequences.setDepth (_globals._sequenceIndexes[2], 9);
+ int idx = _scene->_dynamicHotspots.add(NOUN_BOAT, VERB_CLIMB_INTO, _globals._sequenceIndexes[2], Common::Rect(0, 0, 0, 0));
+ _scene->_dynamicHotspots.setPosition(idx, Common::Point(231, 127), FACING_NORTH);
+ _scene->_sequences.addTimer(15, 2);
+ }
+ break;
+
+ case 2:
+ _globals[kBoatStatus] = BOAT_TIED;
+ _globals[kLineStatus] = LINE_NOW_UNTIED;
+ _game._player._stepEnabled = true;
+ break;
+
+ default:
+ break;
+ }
+ } else if (_globals[kBoatStatus] == BOAT_TIED) {
+ _vm->_dialogs->show(70125);
+ } else if (_globals[kLineStatus] == LINE_DROPPED) {
+ _globals[kLineStatus] = LINE_NOW_UNTIED;
+ _game._objects.addToInventory(OBJ_FISHING_LINE);
+ _vm->_sound->command(15);
+ _scene->_sequences.remove(_globals._sequenceIndexes[3]);
+ _vm->_dialogs->showItem(OBJ_FISHING_LINE, 70126);
+ } else {
+ _vm->_dialogs->show(70127);
+ }
+ } else if (_action.isAction(VERB_CLIMB_INTO, NOUN_BOAT) && _globals[kBoatStatus] == BOAT_TIED) {
+ switch (_game._trigger) {
+ case 0:
+ _game._player._stepEnabled = false;
+ _scene->_sequences.remove(_globals._sequenceIndexes[2]);
+ _game._player._visible = false;
+ _scene->loadAnimation(formAnimName('B', 0), 1);
+ break;
+
+ case 1:
+ _scene->_nextSceneId = 703;
+ break;
+
+ default:
+ break;
+ }
+ } else if (_action._lookFlag) {
+ if (_globals[kBoatStatus] != BOAT_GONE) {
+ if (_globals[kBoatStatus] == BOAT_TIED)
+ _vm->_dialogs->show(70128);
+ else
+ _vm->_dialogs->show(70110);
+ } else
+ _vm->_dialogs->show(70111);
+ } else if (_action.isAction(VERB_LOOK, NOUN_SUBMERGED_CITY))
+ _vm->_dialogs->show(70112);
+ else if (_action.isAction(VERB_LOOK, 0))
+ _vm->_dialogs->show(70113);
+ else if (_action.isAction(VERB_LOOK, NOUN_PLATFORM))
+ _vm->_dialogs->show(70114);
+ else if (_action.isAction(VERB_LOOK, NOUN_CEMENT_PYLON))
+ _vm->_dialogs->show(70115);
+ else if (_action.isAction(VERB_LOOK, NOUN_HOOK)) {
+ if (_globals[kLineStatus] == LINE_NOT_DROPPED || _globals[kLineStatus] == LINE_NOW_UNTIED)
+ _vm->_dialogs->show(70116);
+ else
+ _vm->_dialogs->show(70117);
+ } else if (_action.isAction(VERB_LOOK, NOUN_ROCK))
+ _vm->_dialogs->show(70118);
+ else if (_action.isAction(VERB_TAKE, NOUN_ROCK))
+ _vm->_dialogs->show(70119);
+ else if (_action.isAction(VERB_LOOK, NOUN_EAST_END_OF_PLATFORM))
+ _vm->_dialogs->show(70120);
+ else if (_action.isAction(VERB_LOOK, NOUN_BUILDING))
+ _vm->_dialogs->show(70121);
+ else if (_action.isAction(VERB_LOOK, NOUN_BOAT)) {
+ if (_globals[kBoatStatus] == BOAT_ADRIFT || _globals[kBoatStatus] == BOAT_TIED_FLOATING)
+ _vm->_dialogs->show(70122);
+ else
+ _vm->_dialogs->show(70123);
+ } else if (_action.isAction(VERB_CAST, NOUN_FISHING_ROD, NOUN_BOAT) && _game._objects.isInInventory(OBJ_FISHING_LINE))
+ _vm->_dialogs->show(70124);
+ else
+ return;
+
+ _action._inProgress = false;
+}
+
+/*------------------------------------------------------------------------*/
+
+void Scene702::setup() {
+ setPlayerSpritesPrefix();
+ setAAName();
+}
+
+void Scene702::enter() {
+ _globals._spriteIndexes[12] = _scene->_sprites.addSprites("*RXMBD_8");
+
+ if (_scene->_priorSceneId == 701) {
+ _game._player._playerPos = Common::Point(13, 145);
+ _game._player._facing = FACING_EAST;
+ } else if (_scene->_priorSceneId != -2 && _scene->_priorSceneId != 620) {
+ _game._player._playerPos = Common::Point(289, 138);
+ _game._player.walk(Common::Point(262, 148), FACING_WEST);
+ _game._player._facing = FACING_WEST;
+ _game._player._visible = true;
+ }
+
+ if (_game._globals[kTeleporterCommand]) {
+ switch(_game._globals[kTeleporterCommand]) {
+ case TELEPORTER_BEAM_OUT:
+ case TELEPORTER_WRONG:
+ case TELEPORTER_STEP_OUT:
+ _game._player._visible = true;
+ _game._player._stepEnabled = true;
+ break;
+ default:
+ break;
+ }
+
+ _game._globals[kTeleporterCommand] = TELEPORTER_NONE;
+ }
+
+ sceneEntrySound();
+}
+
+void Scene702::preActions() {
+ if (_action.isAction(VERB_WALKTO, NOUN_WEST_END_OF_PLATFORM))
+ _game._player._walkOffScreenSceneId = 701;
+}
+
+void Scene702::actions() {
+ if (_action.isAction(VERB_WALK_ALONG, NOUN_PLATFORM))
+ ; // Only set the action as finished
+ else if (_action.isAction(VERB_STEP_INTO, NOUN_TELEPORTER)) {
+ _game._player._stepEnabled = false;
+ _game._player._visible = false;
+ _scene->_nextSceneId = 711;
+ } else if (_action.isAction(VERB_TAKE, NOUN_BONES) && (_action._mainObjectSource == 4) && (!_game._objects.isInInventory(OBJ_BONES) || _game._trigger)) {
+ switch (_game._trigger) {
+ case 0:
+ _game._player._stepEnabled = false;
+ _game._player._visible = false;
+ _globals._sequenceIndexes[12] = _scene->_sequences.startReverseCycle(_globals._spriteIndexes[12], false, 5, 2, 0, 0);
+ _scene->_sequences.setMsgLayout(_globals._sequenceIndexes[12]);
+ _scene->_sequences.addSubEntry(_globals._sequenceIndexes[12], SEQUENCE_TRIGGER_SPRITE, 4, 1);
+ _scene->_sequences.addSubEntry(_globals._sequenceIndexes[12], SEQUENCE_TRIGGER_EXPIRE, 0, 2);
+ break;
+ case 1:
+ _vm->_sound->command(0xF);
+ if (_game._objects.isInInventory(OBJ_BONE))
+ _game._objects.setRoom(OBJ_BONE, 1);
+ _game._objects.addToInventory(OBJ_BONES);
+ _vm->_dialogs->show(OBJ_BONES, 70218);
+ break;
+ case 2:
+ _scene->_sequences.updateTimeout(-1, _globals._sequenceIndexes[12]);
+ _game._player._visible = true;
+ _game._player._stepEnabled = true;
+ break;
+ default:
+ break;
+ }
+ } else if (_action._lookFlag)
+ _vm->_dialogs->show(70210);
+ else if (_action.isAction(VERB_LOOK, NOUN_PLATFORM))
+ _vm->_dialogs->show(70211);
+ else if (_action.isAction(VERB_LOOK, NOUN_CEMENT_BLOCK))
+ _vm->_dialogs->show(70212);
+ else if (_action.isAction(VERB_LOOK, NOUN_ROCK))
+ _vm->_dialogs->show(70213);
+ else if (_action.isAction(VERB_TAKE, NOUN_ROCK))
+ _vm->_dialogs->show(70214);
+ else if (_action.isAction(VERB_LOOK, NOUN_WEST_END_OF_PLATFORM))
+ _vm->_dialogs->show(70215);
+ else if (_action.isAction(VERB_LOOK, NOUN_TELEPORTER))
+ _vm->_dialogs->show(70216);
+ else if (_action.isAction(VERB_LOOK, NOUN_BONES) && (_action._mainObjectSource == 4))
+ _vm->_dialogs->show(70217);
+ else if (_action.isAction(VERB_TAKE, NOUN_BONES) && (_action._mainObjectSource == 4)) {
+ if (_game._objects.isInInventory(OBJ_BONES))
+ _vm->_dialogs->show(70219);
+ } else if (_action.isAction(VERB_LOOK, NOUN_SUBMERGED_CITY))
+ _vm->_dialogs->show(70220);
+ else
+ return;
+
+ _action._inProgress = false;
+}
+
+/*------------------------------------------------------------------------*/
+
+Scene703::Scene703(MADSEngine *vm) : Scene7xx(vm) {
+ _monsterMode = -1;
+ _boatFrame = -1;
+ _curSequence = -1;
+ _boatDir = -1;
+
+ _useBomb = false;
+ _startMonsterTimer = false;
+ _rexDeathFl = false;
+ _restartTrigger70Fl = false;
+
+ _lastFrameTime = 0;
+ _monsterTime = 0;
+}
+
+void Scene703::synchronize(Common::Serializer &s) {
+ Scene7xx::synchronize(s);
+
+ s.syncAsSint16LE(_monsterMode);
+ s.syncAsSint16LE(_boatFrame);
+ s.syncAsSint16LE(_curSequence);
+ s.syncAsSint16LE(_boatDir);
+
+ s.syncAsByte(_useBomb);
+ s.syncAsByte(_startMonsterTimer);
+ s.syncAsByte(_rexDeathFl);
+ s.syncAsByte(_restartTrigger70Fl);
+
+ s.syncAsUint32LE(_lastFrameTime);
+ s.syncAsUint32LE(_monsterTime);
+}
+
+void Scene703::setup() {
+ _game._player._spritesPrefix = "";
+ setAAName();
+}
+
+void Scene703::handleBottleInterface() {
+ switch (_globals[kBottleStatus]) {
+ case 0:
+ _dialog1.write(0x311, true);
+ _dialog1.write(0x312, true);
+ _dialog1.write(0x313, true);
+ _dialog1.write(0x314, true);
+ _dialog1.write(0x315, true);
+ break;
+
+ case 1:
+ _dialog1.write(0x311, false);
+ _dialog1.write(0x312, true);
+ _dialog1.write(0x313, true);
+ _dialog1.write(0x314, true);
+ _dialog1.write(0x315, true);
+ break;
+
+ case 2:
+ _dialog1.write(0x311, false);
+ _dialog1.write(0x312, false);
+ _dialog1.write(0x313, true);
+ _dialog1.write(0x314, true);
+ _dialog1.write(0x315, true);
+ break;
+
+ case 3:
+ _dialog1.write(0x311, false);
+ _dialog1.write(0x312, false);
+ _dialog1.write(0x313, false);
+ _dialog1.write(0x314, true);
+ _dialog1.write(0x315, true);
+ break;
+
+ default:
+ break;
+ }
+}
+
+void Scene703::setBottleSequence() {
+ _scene->_userInterface.setup(kInputBuildingSentences);
+ _game._player._stepEnabled = false;
+ if (_boatDir == 2)
+ _curSequence = 6;
+ else
+ _curSequence = 7;
+}
+
+void Scene703::handleFillBottle(int quote) {
+ switch (quote) {
+ case 0x311:
+ _globals[kBottleStatus] = 1;
+ setBottleSequence();
+ break;
+
+ case 0x312:
+ _globals[kBottleStatus] = 2;
+ setBottleSequence();
+ break;
+
+ case 0x313:
+ _globals[kBottleStatus] = 3;
+ setBottleSequence();
+ break;
+
+ case 0x314:
+ _globals[kBottleStatus] = 4;
+ setBottleSequence();
+ break;
+
+ case 0x315:
+ _scene->_userInterface.setup(kInputBuildingSentences);
+ break;
+
+ default:
+ break;
+ }
+}
+
+void Scene703::enter() {
+ _game._player._visible = false;
+
+ if (!_game._visitedScenes._sceneRevisited) {
+ if (_scene->_priorSceneId == 704)
+ _globals[kMonsterAlive] = false;
+ else
+ _globals[kMonsterAlive] = true;
+ }
+
+ _startMonsterTimer = true;
+ _rexDeathFl = true;
+ _monsterTime = 0;
+ _restartTrigger70Fl = true;
+ _useBomb = false;
+ _boatFrame = -1;
+
+ if (!_globals[kMonsterAlive])
+ _scene->_hotspots.activate(NOUN_SEA_MONSTER, false);
+
+ if (_scene->_priorSceneId == 704) {
+ _game._player._stepEnabled = false;
+ _curSequence = 2;
+ _boatDir = 2;
+ _monsterMode = 0;
+ _scene->loadAnimation(formAnimName('A', -1));
+ _scene->_activeAnimation->setCurrentFrame(34);
+ } else if (_scene->_priorSceneId != -2) {
+ _game._player._stepEnabled = false;
+ _boatDir = 1;
+ if (_globals[kMonsterAlive]) {
+ _monsterMode = 1;
+ _curSequence = 0;
+ _scene->loadAnimation(formAnimName('B', -1));
+ } else {
+ _curSequence = 0;
+ _monsterMode = 0;
+ _scene->loadAnimation(formAnimName('A', -1));
+ }
+ } else if (_globals[kMonsterAlive]) {
+ _curSequence = 0;
+ _boatDir = 1;
+ _monsterMode = 1;
+ _scene->loadAnimation(formAnimName('B', -1));
+ _scene->_activeAnimation->setCurrentFrame(39);
+ } else if (_boatDir == 1) {
+ _curSequence = 0;
+ _monsterMode = 0;
+ _scene->loadAnimation(formAnimName('A', -1));
+ _scene->_activeAnimation->setCurrentFrame(9);
+ } else if (_boatDir == 2) {
+ _curSequence = 0;
+ _monsterMode = 0;
+ _scene->loadAnimation(formAnimName('A', -1));
+ _scene->_activeAnimation->setCurrentFrame(56);
+ }
+
+ if (_scene->_roomChanged) {
+ _game._objects.addToInventory(OBJ_TWINKIFRUIT);
+ _game._objects.addToInventory(OBJ_BOMB);
+ _game._objects.addToInventory(OBJ_CHICKEN);
+ _game._objects.addToInventory(OBJ_BONES);
+ }
+
+ _game.loadQuoteSet(0x311, 0x312, 0x313, 0x314, 0x315, 0);
+ _dialog1.setup(0x98, 0x311, 0x312, 0x313, 0x314, 0x315, 0);
+ sceneEntrySound();
+ _vm->_sound->command(28);
+}
+
+void Scene703::step() {
+ if (_startMonsterTimer) {
+ long diff = _scene->_frameStartTime - _lastFrameTime;
+ if ((diff >= 0) && (diff <= 12))
+ _monsterTime += diff;
+ else
+ _monsterTime++;
+
+ _lastFrameTime = _scene->_frameStartTime;
+ }
+
+ if ((_monsterTime >= 2400) && !_rexDeathFl && !_useBomb) {
+ _startMonsterTimer = false;
+ _rexDeathFl = true;
+ _game._player._stepEnabled = false;
+ _scene->freeAnimation();
+ _monsterMode = 3;
+ _scene->loadAnimation(formAnimName('D', -1));
+ _rexDeathFl = false;
+ _monsterTime = 0;
+ }
+
+
+ if (_game._trigger == 70)
+ _scene->_reloadSceneFlag = true;
+
+ if ((_monsterMode == 3) && (_scene->_activeAnimation != nullptr)) {
+ if (_scene->_activeAnimation->getCurrentFrame() != _boatFrame) {
+ _boatFrame = _scene->_activeAnimation->getCurrentFrame();
+ int nextBoatFrame = -1;
+
+ if (_boatFrame == 62) {
+ nextBoatFrame = 61;
+ if (_restartTrigger70Fl) {
+ _restartTrigger70Fl = false;
+ _scene->_sequences.addTimer(15, 70);
+ }
+ }
+
+ if ((nextBoatFrame >= 0) && (nextBoatFrame != _scene->_activeAnimation->getCurrentFrame())) {
+ _scene->_activeAnimation->setCurrentFrame(nextBoatFrame);
+ _boatFrame = nextBoatFrame;
+ }
+ }
+ }
+
+ if (_game._trigger == 70)
+ _scene->_reloadSceneFlag = true;
+
+ if ((_monsterMode == 0) && (_scene->_activeAnimation != nullptr)) {
+ if (_scene->_activeAnimation->getCurrentFrame() != _boatFrame) {
+ _boatFrame = _scene->_activeAnimation->getCurrentFrame();
+ int nextBoatFrame = -1;
+
+ switch (_boatFrame) {
+ case 11:
+ if (_curSequence == 7) {
+ _curSequence = 0;
+ nextBoatFrame = 100;
+ } else if (_curSequence == 5)
+ nextBoatFrame = 82;
+ else if (_curSequence == 1)
+ nextBoatFrame = 11;
+ else {
+ nextBoatFrame = 9;
+ if (!_game._player._stepEnabled)
+ _game._player._stepEnabled = true;
+ }
+ break;
+
+ case 34:
+ if (_curSequence != 2)
+ _scene->_nextSceneId = 704;
+ break;
+
+ case 57:
+ if (_curSequence == 6) {
+ _curSequence = 0;
+ nextBoatFrame = 91;
+ } else if (_curSequence == 4)
+ nextBoatFrame = 73;
+ else if (_curSequence == 3)
+ nextBoatFrame = 57;
+ else {
+ nextBoatFrame = 56;
+ if (!_game._player._stepEnabled)
+ _game._player._stepEnabled = true;
+ }
+ break;
+
+ case 73:
+ _scene->_nextSceneId = 701;
+ break;
+
+ case 82:
+ nextBoatFrame = 11;
+ break;
+
+ case 91:
+ nextBoatFrame = 57;
+ break;
+
+ case 100:
+ nextBoatFrame = 56;
+ if (!_game._player._stepEnabled) {
+ _scene->_sequences.addTimer(30, 80);
+ _game._player._stepEnabled = true;
+ }
+ break;
+
+ case 110:
+ nextBoatFrame = 9;
+ if (!_game._player._stepEnabled) {
+ _scene->_sequences.addTimer(30, 80);
+ _game._player._stepEnabled = true;
+ }
+ break;
+
+ default:
+ break;
+ }
+
+ if ((nextBoatFrame >= 0) && (nextBoatFrame != _scene->_activeAnimation->getCurrentFrame())) {
+ _scene->_activeAnimation->setCurrentFrame(nextBoatFrame);
+ _boatFrame = nextBoatFrame;
+ }
+ }
+ }
+
+ if (_game._trigger == 80) {
+ switch (_globals[kBottleStatus]) {
+ case 0:
+ _vm->_dialogs->show(432);
+ break;
+
+ case 1:
+ _vm->_dialogs->show(70324);
+ break;
+
+ case 2:
+ _vm->_dialogs->show(70325);
+ break;
+
+ case 3:
+ _vm->_dialogs->show(70326);
+ break;
+
+ case 4:
+ _vm->_dialogs->show(70327);
+ break;
+
+ default:
+ break;
+ }
+ }
+
+
+ if ((_monsterMode == 1) && (_scene->_activeAnimation != nullptr)) {
+ if (_scene->_activeAnimation->getCurrentFrame() != _boatFrame) {
+ _boatFrame = _scene->_activeAnimation->getCurrentFrame();
+ int nextBoatFrame = -1;
+
+ switch (_boatFrame) {
+ case 39:
+ _game._player._stepEnabled = true;
+ _startMonsterTimer = true;
+ _rexDeathFl = false;
+ break;
+
+ case 40:
+ case 49:
+ case 54:
+ case 67:
+ case 78:
+ case 87:
+ case 96:
+ case 105:
+ case 114:
+ case 123:
+ if (_curSequence == 8)
+ nextBoatFrame = 129;
+
+ break;
+
+ case 129:
+ nextBoatFrame = 39;
+ break;
+
+ case 151:
+ _scene->_nextSceneId = 701;
+ break;
+
+ default:
+ break;
+ }
+
+ if ((nextBoatFrame >= 0) && (nextBoatFrame != _scene->_activeAnimation->getCurrentFrame())) {
+ _scene->_activeAnimation->setCurrentFrame(nextBoatFrame);
+ _boatFrame = nextBoatFrame;
+ }
+ }
+ }
+
+ if ((_monsterMode == 2) && (_scene->_activeAnimation != nullptr)) {
+ if (_scene->_activeAnimation->getCurrentFrame() != _boatFrame) {
+ _boatFrame = _scene->_activeAnimation->getCurrentFrame();
+ int nextBoatFrame = -1;
+
+ switch (_boatFrame) {
+ case 14:
+ if (!_useBomb) {
+ if (_game._difficulty == DIFFICULTY_HARD)
+ _game._objects.setRoom(OBJ_CHICKEN, 1);
+ else
+ _vm->_dialogs->show(70319);
+ }
+ nextBoatFrame = 80;
+ break;
+
+ case 33:
+ if (_game._objects.isInInventory(OBJ_BONES)) {
+ _game._objects.setRoom(OBJ_BONES, 1);
+ _game._objects.addToInventory(OBJ_BONE);
+ } else
+ _game._objects.setRoom(OBJ_BONE, 1);
+
+ nextBoatFrame = 80;
+ break;
+
+ case 53:
+ _game._objects.setRoom(OBJ_TWINKIFRUIT, 1);
+ nextBoatFrame = 80;
+ _curSequence = 9;
+ break;
+
+ case 80:
+ if (_game._difficulty == DIFFICULTY_HARD) {
+ _game._objects.setRoom(OBJ_BOMB, 1);
+ _vm->_dialogs->show(70318);
+ } else
+ _vm->_dialogs->show(70317);
+
+ _scene->freeAnimation();
+ _monsterMode = 1;
+ _scene->loadAnimation(formAnimName('B', -1));
+ _scene->_activeAnimation->setCurrentFrame(39);
+ _game._player._stepEnabled = true;
+ break;
+
+ case 91:
+ if (!_useBomb) {
+ _scene->freeAnimation();
+ _monsterMode = 1;
+ _scene->loadAnimation(formAnimName('B', -1));
+ _scene->_activeAnimation->setCurrentFrame(39);
+ _game._player._stepEnabled = true;
+ } else
+ _game._objects.setRoom(OBJ_CHICKEN_BOMB, 1);
+
+ break;
+
+ case 126:
+ _scene->_hotspots.activate(NOUN_SEA_MONSTER, false);
+ _globals[kMonsterAlive] = false;
+ _scene->freeAnimation();
+ _monsterMode = 0;
+ _scene->loadAnimation(formAnimName('A', -1));
+ _scene->_activeAnimation->setCurrentFrame(9);
+ _game._player._stepEnabled = true;
+ if (_game._storyMode == STORYMODE_NAUGHTY)
+ _vm->_dialogs->show(70321);
+ else
+ _vm->_dialogs->show(70322);
+
+ break;
+
+ default:
+ break;
+ }
+
+ if ((nextBoatFrame >= 0) && (nextBoatFrame != _scene->_activeAnimation->getCurrentFrame())) {
+ _scene->_activeAnimation->setCurrentFrame(nextBoatFrame);
+ _boatFrame = nextBoatFrame;
+ }
+ }
+ }
+}
+
+void Scene703::actions() {
+ if (_game._screenObjects._inputMode == kInputConversation)
+ handleFillBottle(_action._activeAction._verbId);
+ else if (_action.isAction(VERB_STEER_TOWARDS, NOUN_DOCK_TO_SOUTH)) {
+ _game._player._stepEnabled = false;
+ if (_globals[kMonsterAlive])
+ _curSequence = 8;
+ else if (_boatDir == 1)
+ _curSequence = 5;
+ else
+ _curSequence = 3;
+ } else if (_action.isAction(VERB_STEER_TOWARDS, NOUN_BUILDING_TO_NORTH)) {
+ _game._player._stepEnabled = false;
+ if (_globals[kMonsterAlive]) {
+ _startMonsterTimer = false;
+ _rexDeathFl = true;
+ _monsterTime = 0;
+ _scene->freeAnimation();
+ _monsterMode = 3;
+ _scene->loadAnimation(formAnimName('D', -1));
+ } else if (_boatDir == 2)
+ _curSequence = 4;
+ else
+ _curSequence = 1;
+ } else if (_action.isAction(VERB_THROW, NOUN_BONE, NOUN_SEA_MONSTER) || _action.isAction(VERB_THROW, NOUN_BONES, NOUN_SEA_MONSTER)) {
+ _game._player._stepEnabled = false;
+ _scene->freeAnimation();
+ _monsterMode = 2;
+ _scene->loadAnimation(formAnimName('C', -1));
+ _scene->_activeAnimation->setCurrentFrame(19);
+ } else if (_action.isAction(VERB_THROW, NOUN_CHICKEN, NOUN_SEA_MONSTER)) {
+ _game._player._stepEnabled = false;
+ _scene->freeAnimation();
+ _monsterMode = 2;
+ _scene->loadAnimation(formAnimName('C', -1));
+ } else if (_action.isAction(VERB_THROW, NOUN_TWINKIFRUIT, NOUN_SEA_MONSTER)) {
+ _game._player._stepEnabled = false;
+ _scene->freeAnimation();
+ _monsterMode = 2;
+ _scene->loadAnimation(formAnimName('C', -1));
+ _scene->_activeAnimation->setCurrentFrame(39);
+ } else if (_action.isAction(VERB_THROW, NOUN_BOMB, NOUN_SEA_MONSTER)) {
+ _game._player._stepEnabled = false;
+ _scene->freeAnimation();
+ _monsterMode = 2;
+ _scene->loadAnimation(formAnimName('C', -1));
+ _scene->_activeAnimation->setCurrentFrame(59);
+ } else if (_action.isAction(VERB_THROW, NOUN_CHICKEN_BOMB, NOUN_SEA_MONSTER)) {
+ _useBomb = true;
+ _game._player._stepEnabled = false;
+ _scene->freeAnimation();
+ _monsterMode = 2;
+ _scene->loadAnimation(formAnimName('C', -1));
+ } else if (_action.isAction(VERB_PUT, NOUN_BOTTLE, NOUN_WATER) || _action.isAction(VERB_FILL, NOUN_BOTTLE, NOUN_WATER)) {
+ if (_globals[kBottleStatus] != 4) {
+ handleBottleInterface();
+ _dialog1.start();
+ } else
+ _vm->_dialogs->show(70323);
+ } else if (_action._lookFlag || _action.isAction(VERB_LOOK, NOUN_SEA_MONSTER)) {
+ if (_globals[kMonsterAlive])
+ _vm->_dialogs->show(70310);
+ } else if (_action.isAction(VERB_LOOK, NOUN_WATER)) {
+ if (!_globals[kMonsterAlive])
+ _vm->_dialogs->show(70311);
+ else
+ _vm->_dialogs->show(70312);
+ } else if (_action.isAction(VERB_LOOK, NOUN_BUILDING_TO_NORTH)) {
+ if (_globals[kMonsterAlive])
+ _vm->_dialogs->show(70313);
+ else if (_game._visitedScenes.exists(710))
+ _vm->_dialogs->show(70314);
+ else
+ _vm->_dialogs->show(70315);
+ } else if (_action.isAction(VERB_LOOK, NOUN_VOLCANO_RIM))
+ _vm->_dialogs->show(70316);
+ else
+ return;
+
+ _action._inProgress = false;
+}
+
+/*------------------------------------------------------------------------*/
+
+Scene704::Scene704(MADSEngine *vm) : Scene7xx(vm) {
+ _bottleHotspotId = -1;
+ _boatCurrentFrame = -1;
+ _animationMode = -1;
+ _boatDirection = -1;
+
+ _takeBottleFl = false;
+}
+
+void Scene704::synchronize(Common::Serializer &s) {
+ Scene7xx::synchronize(s);
+
+ s.syncAsSint16LE(_bottleHotspotId);
+ s.syncAsSint16LE(_boatCurrentFrame);
+ s.syncAsSint16LE(_animationMode);
+ s.syncAsSint16LE(_boatDirection);
+
+ s.syncAsByte(_takeBottleFl);
+}
+
+void Scene704::setup() {
+ _game._player._spritesPrefix = "";
+ setAAName();
+ _scene->addActiveVocab(NOUN_BOTTLE);
+ _scene->addActiveVocab(VERB_LOOK_AT);
+}
+
+void Scene704::handleBottleInterface() {
+ switch (_globals[kBottleStatus]) {
+ case 0:
+ _dialog1.write(0x311, true);
+ _dialog1.write(0x312, true);
+ _dialog1.write(0x313, true);
+ _dialog1.write(0x314, true);
+ _dialog1.write(0x315, true);
+ break;
+
+ case 1:
+ _dialog1.write(0x311, false);
+ _dialog1.write(0x312, true);
+ _dialog1.write(0x313, true);
+ _dialog1.write(0x314, true);
+ _dialog1.write(0x315, true);
+ break;
+
+ case 2:
+ _dialog1.write(0x311, false);
+ _dialog1.write(0x312, false);
+ _dialog1.write(0x313, true);
+ _dialog1.write(0x314, true);
+ _dialog1.write(0x315, true);
+ break;
+
+ case 3:
+ _dialog1.write(0x311, false);
+ _dialog1.write(0x312, false);
+ _dialog1.write(0x313, false);
+ _dialog1.write(0x314, true);
+ _dialog1.write(0x315, true);
+ break;
+
+ default:
+ break;
+ }
+}
+
+void Scene704::setBottleSequence() {
+ _scene->_userInterface.setup(kInputBuildingSentences);
+ _game._player._stepEnabled = false;
+ if (_boatDirection == 2)
+ _animationMode = 6;
+ else
+ _animationMode = 7;
+}
+
+void Scene704::handleFillBottle(int quote) {
+ switch (quote) {
+ case 0x311:
+ _globals[kBottleStatus] = 1;
+ setBottleSequence();
+ break;
+
+ case 0x312:
+ _globals[kBottleStatus] = 2;
+ setBottleSequence();
+ break;
+
+ case 0x313:
+ _globals[kBottleStatus] = 3;
+ setBottleSequence();
+ break;
+
+ case 0x314:
+ _globals[kBottleStatus] = 4;
+ setBottleSequence();
+ break;
+
+ case 0x315:
+ _scene->_userInterface.setup(kInputBuildingSentences);
+ break;
+
+ default:
+ break;
+ }
+}
+
+void Scene704::enter() {
+ if (_game._objects[OBJ_BOTTLE]._roomNumber == _scene->_currentSceneId) {
+ _globals._spriteIndexes[1] = _scene->_sprites.addSprites(formAnimName('b', 0));
+ _globals._sequenceIndexes[1] = _scene->_sequences.startReverseCycle(_globals._spriteIndexes[1], false, 6, 0, 0, 0);
+ _scene->_sequences.setDepth(_globals._sequenceIndexes[1], 1);
+ if (_scene->_priorSceneId == 705) {
+ _scene->_sequences.setPosition(_globals._sequenceIndexes[1], Common::Point(123, 125));
+ _scene->_sequences.setDepth(_globals._sequenceIndexes[1], 1);
+ } else {
+ _scene->_sequences.setPosition(_globals._sequenceIndexes[1], Common::Point(190, 122));
+ _scene->_sequences.setDepth(_globals._sequenceIndexes[1], 2);
+ }
+ int idx = _scene->_dynamicHotspots.add(NOUN_BOTTLE, VERB_LOOK_AT, _globals._sequenceIndexes[1], Common::Rect(0, 0, 0, 0));
+ _bottleHotspotId = _scene->_dynamicHotspots.setPosition(idx, Common::Point(-2, 0), FACING_NONE);
+ }
+
+ _game._player._visible = false;
+ _takeBottleFl = false;
+ _boatCurrentFrame = -1;
+
+ if (_scene->_priorSceneId == 705) {
+ _game._player._stepEnabled = false;
+ _animationMode = 2;
+ _boatDirection = 2;
+ _scene->loadAnimation(formAnimName('A', -1));
+ _scene->_activeAnimation->setCurrentFrame(36);
+ } else if (_scene->_priorSceneId != -2) {
+ _game._player._stepEnabled = false;
+ _boatDirection = 1;
+ _scene->loadAnimation(formAnimName('A', -1));
+ } else if (_boatDirection == 1) {
+ _scene->loadAnimation(formAnimName('A', -1));
+ _scene->_activeAnimation->setCurrentFrame(8);
+ } else if (_boatDirection == 2) {
+ if (_game._objects[OBJ_BOTTLE]._roomNumber == _scene->_currentSceneId) {
+ _scene->_sequences.setPosition(_globals._sequenceIndexes[1], Common::Point(123, 125));
+ _scene->_sequences.setDepth(_globals._sequenceIndexes[1], 1);
+ }
+ _scene->loadAnimation(formAnimName('A', -1));
+ _scene->_activeAnimation->setCurrentFrame(57);
+ }
+
+ if (_scene->_roomChanged)
+ _globals[kMonsterAlive] = false;
+
+ _game.loadQuoteSet(0x311, 0x312, 0x313, 0x314, 0x315, 0);
+ _dialog1.setup(0x98, 0x311, 0x312, 0x313, 0x314, 0x315, 0);
+
+ sceneEntrySound();
+ _vm->_sound->command(28);
+}
+
+void Scene704::step() {
+ if (_scene->_activeAnimation != nullptr) {
+ if (_scene->_activeAnimation->getCurrentFrame() != _boatCurrentFrame) {
+ _boatCurrentFrame = _scene->_activeAnimation->getCurrentFrame();
+ int nextFrame = -1;
+
+ switch (_boatCurrentFrame) {
+ case 10:
+ switch (_animationMode) {
+ case 1:
+ nextFrame = 10;
+ break;
+ case 5:
+ nextFrame = 74;
+ break;
+ case 7:
+ _animationMode = 0;
+ nextFrame = 92;
+ break;
+ default:
+ if (!_game._player._stepEnabled)
+ _game._player._stepEnabled = true;
+
+ nextFrame = 8;
+ break;
+ }
+ break;
+
+ case 36:
+ if (_animationMode != 2)
+ _scene->_nextSceneId = 705;
+ break;
+
+ case 59:
+ switch (_animationMode) {
+ case 3:
+ nextFrame = 59;
+ break;
+
+ case 4:
+ nextFrame = 65;
+ break;
+
+ case 6:
+ _animationMode = 0;
+ nextFrame = 83;
+ break;
+
+ default:
+ if (!_game._player._stepEnabled) {
+ _game._player._stepEnabled = true;
+ }
+ nextFrame = 57;
+ break;
+ }
+ break;
+
+ case 65:
+ _scene->_nextSceneId = 703;
+ break;
+
+ case 74:
+ nextFrame = 10;
+ break;
+
+ case 83:
+ nextFrame = 59;
+ break;
+
+ case 90:
+ if (_takeBottleFl) {
+ _scene->_sequences.remove(_globals._sequenceIndexes[1]);
+ _scene->_dynamicHotspots.remove(_bottleHotspotId);
+ _game._objects.addToInventory(OBJ_BOTTLE);
+ _vm->_sound->command(15);
+ _vm->_dialogs->showItem(OBJ_BOTTLE, 70415);
+ }
+ break;
+
+ case 92:
+ nextFrame = 57;
+ if (!_game._player._stepEnabled && !_takeBottleFl) {
+ _scene->_sequences.addTimer(30, 70);
+ _game._player._stepEnabled = true;
+ }
+ break;
+
+ case 98:
+ if (_takeBottleFl) {
+ _scene->_sequences.remove(_globals._sequenceIndexes[1]);
+ _scene->_dynamicHotspots.remove(_bottleHotspotId);
+ _game._objects.addToInventory(OBJ_BOTTLE);
+ _vm->_sound->command(15);
+ _vm->_dialogs->showItem(OBJ_BOTTLE, 70415);
+ }
+ break;
+
+ case 101:
+ nextFrame = 8;
+ if (!_game._player._stepEnabled && !_takeBottleFl) {
+ _scene->_sequences.addTimer(30, 70);
+ _game._player._stepEnabled = true;
+ }
+ break;
+
+ default:
+ break;
+ }
+
+ if ((nextFrame >= 0) && (nextFrame != _scene->_activeAnimation->getCurrentFrame())) {
+ _scene->_activeAnimation->setCurrentFrame(nextFrame);
+ _boatCurrentFrame = nextFrame;
+ }
+ }
+ }
+
+ if (_game._trigger == 70) {
+ switch (_globals[kBottleStatus]) {
+ case 0:
+ _vm->_dialogs->show(432);
+ break;
+
+ case 1:
+ _vm->_dialogs->show(70324);
+ break;
+
+ case 2:
+ _vm->_dialogs->show(70325);
+ break;
+
+ case 3:
+ _vm->_dialogs->show(70326);
+ break;
+
+ case 4:
+ _vm->_dialogs->show(70327);
+ break;
+
+ default:
+ break;
+ }
+ }
+}
+
+void Scene704::actions() {
+ if (_game._screenObjects._inputMode == kInputConversation)
+ handleFillBottle(_action._activeAction._verbId);
+ else if (_action.isAction(VERB_STEER_TOWARDS, NOUN_OPEN_WATER_TO_SOUTH)) {
+ _game._player._stepEnabled = false;
+ if (_boatDirection == 1)
+ _animationMode = 5;
+ else
+ _animationMode = 3;
+ } else if (_action.isAction(VERB_STEER_TOWARDS, NOUN_BUILDING_TO_NORTH)) {
+ _game._player._stepEnabled = false;
+ if (_boatDirection == 2)
+ _animationMode = 4;
+ else
+ _animationMode = 1;
+ } else if (_action.isAction(VERB_TAKE, NOUN_BOTTLE)) {
+ if (!_game._objects.isInInventory(OBJ_BOTTLE)) {
+ _game._player._stepEnabled = false;
+ _takeBottleFl = true;
+ if (_boatDirection == 2) {
+ _animationMode = 6;
+ } else {
+ _animationMode = 7;
+ }
+ }
+ } else if (_action.isAction(VERB_PUT, NOUN_BOTTLE, NOUN_WATER) || _action.isAction(VERB_FILL, NOUN_BOTTLE, NOUN_WATER)) {
+ if (_game._objects.isInInventory(OBJ_BOTTLE)) {
+ if (_globals[kBottleStatus] != 4) {
+ _takeBottleFl = false;
+ handleBottleInterface();
+ _dialog1.start();
+ } else
+ _vm->_dialogs->show(70323);
+ }
+ } else if (_action._lookFlag || _action.isAction(VERB_LOOK, NOUN_WATER))
+ _vm->_dialogs->show(70410);
+ else if (_action.isAction(VERB_LOOK, NOUN_BUILDING_TO_NORTH)) {
+ if (_game._visitedScenes.exists(710))
+ _vm->_dialogs->show(70411);
+ else
+ _vm->_dialogs->show(70412);
+ } else if (_action.isAction(VERB_LOOK, NOUN_VOLCANO_RIM))
+ _vm->_dialogs->show(70413);
+ else if (_action.isAction(VERB_LOOK, NOUN_BOTTLE) && (_action._mainObjectSource == 4))
+ _vm->_dialogs->show(70414);
+ else if (_action.isAction(VERB_LOOK, NOUN_OPEN_WATER_TO_SOUTH))
+ _vm->_dialogs->show(70416);
+ else if (_action.isAction(VERB_LOOK, NOUN_SKY))
+ _vm->_dialogs->show(70417);
+ else
+ return;
+
+ _action._inProgress = false;
+}
+
+/*------------------------------------------------------------------------*/
+
+void Scene705::setup() {
+ _game._player._spritesPrefix = "";
+ setAAName();
+}
+
+void Scene705::synchronize(Common::Serializer &s) {
+ Scene7xx::synchronize(s);
+}
+
+void Scene705::handleBottleInterface() {
+ switch (_globals[kBottleStatus]) {
+ case 0:
+ _dialog1.write(0x311, true);
+ _dialog1.write(0x312, true);
+ _dialog1.write(0x313, true);
+ _dialog1.write(0x314, true);
+ _dialog1.write(0x315, true);
+ break;
+
+ case 1:
+ _dialog1.write(0x311, false);
+ _dialog1.write(0x312, true);
+ _dialog1.write(0x313, true);
+ _dialog1.write(0x314, true);
+ _dialog1.write(0x315, true);
+ break;
+
+ case 2:
+ _dialog1.write(0x311, false);
+ _dialog1.write(0x312, false);
+ _dialog1.write(0x313, true);
+ _dialog1.write(0x314, true);
+ _dialog1.write(0x315, true);
+ break;
+
+ case 3:
+ _dialog1.write(0x311, false);
+ _dialog1.write(0x312, false);
+ _dialog1.write(0x313, false);
+ _dialog1.write(0x314, true);
+ _dialog1.write(0x315, true);
+ break;
+
+ default:
+ break;
+ }
+}
+
+void Scene705::setBottleSequence() {
+ _scene->_userInterface.setup(kInputBuildingSentences);
+ _game._player._stepEnabled = false;
+ _scene->_sequences.remove(_globals._sequenceIndexes[3]);
+ _game._triggerSetupMode = SEQUENCE_TRIGGER_DAEMON;
+ _scene->loadAnimation(formAnimName('F', -1), 90);
+}
+
+void Scene705::handleFillBottle(int quote) {
+ switch (quote) {
+ case 0x311:
+ _globals[kBottleStatus] = 1;
+ setBottleSequence();
+ break;
+
+ case 0x312:
+ _globals[kBottleStatus] = 2;
+ setBottleSequence();
+ break;
+
+ case 0x313:
+ _globals[kBottleStatus] = 3;
+ setBottleSequence();
+ break;
+
+ case 0x314:
+ _globals[kBottleStatus] = 4;
+ setBottleSequence();
+ break;
+
+ case 0x315:
+ _scene->_userInterface.setup(kInputBuildingSentences);
+ break;
+
+ default:
+ break;
+ }
+}
+
+void Scene705::enter() {
+ _globals._spriteIndexes[1] = _scene->_sprites.addSprites(formAnimName('b', 0));
+ _globals._spriteIndexes[2] = _scene->_sprites.addSprites(formAnimName('b', 1));
+ _globals._spriteIndexes[3] = _scene->_sprites.addSprites(formAnimName('a', 0));
+
+ _game._player._visible = false;
+
+ if (_scene->_priorSceneId == 706) {
+ _game._player._stepEnabled = false;
+ _globals._sequenceIndexes[3] = _scene->_sequences.addReverseSpriteCycle(_globals._spriteIndexes[3], false, 9, 1, 0, 0);
+ _scene->_sequences.setAnimRange(_globals._sequenceIndexes[3], 1, 4);
+ _scene->_sequences.addSubEntry(_globals._sequenceIndexes[3], SEQUENCE_TRIGGER_EXPIRE, 0, 71);
+ } else if (_scene->_priorSceneId != -2) {
+ _game._player._stepEnabled = false;
+ _scene->_sequences.addTimer(1, 80);
+ _vm->_sound->command(28);
+ } else
+ _globals._sequenceIndexes[3] = _scene->_sequences.startCycle(_globals._spriteIndexes[3], false, 1);
+
+ if (_scene->_roomChanged)
+ _game._objects.addToInventory(OBJ_BOTTLE);
+
+ _game.loadQuoteSet(0x311, 0x312, 0x313, 0x314, 0x315, 0);
+ _dialog1.setup(0x98, 0x311, 0x312, 0x313, 0x314, 0x315, 0);
+ sceneEntrySound();
+}
+
+void Scene705::step() {
+ switch (_game._trigger) {
+ case 70:
+ _globals._sequenceIndexes[3] = _scene->_sequences.startReverseCycle(_globals._spriteIndexes[3], false, 9, 1, 0, 0);
+ _scene->_sequences.setAnimRange(_globals._sequenceIndexes[3], 1, 4);
+ _scene->_sequences.addSubEntry(_globals._sequenceIndexes[3], SEQUENCE_TRIGGER_EXPIRE, 0, 71);
+ break;
+
+ case 71: {
+ int syncIdx = _globals._sequenceIndexes[3];
+ _globals._sequenceIndexes[3] = _scene->_sequences.startCycle(_globals._spriteIndexes[3], false, 1);
+ _scene->_sequences.updateTimeout(_globals._sequenceIndexes[3], syncIdx);
+ _game._player._stepEnabled = true;
+ }
+ break;
+
+ default:
+ break;
+ }
+
+ switch (_game._trigger) {
+ case 80:
+ _globals._sequenceIndexes[1] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[1], false, 9, 1, 0, 0);
+ _scene->_sequences.setDepth(_globals._sequenceIndexes[1], 2);
+ _scene->_sequences.addSubEntry(_globals._sequenceIndexes[1], SEQUENCE_TRIGGER_EXPIRE, 0, 81);
+ break;
+
+ case 81: {
+ _vm->_sound->command(19);
+ int syncIdx = _globals._sequenceIndexes[1];
+ _globals._sequenceIndexes[3] = _scene->_sequences.startCycle(_globals._spriteIndexes[3], false, 1);
+ _scene->_sequences.updateTimeout(_globals._sequenceIndexes[3], syncIdx);
+ _game._player._stepEnabled = true;
+ }
+ break;
+
+ default:
+ break;
+ }
+
+ switch (_game._trigger) {
+ case 90:
+ _globals._sequenceIndexes[3] = _scene->_sequences.startCycle(_globals._spriteIndexes[3], false, 1);
+ _scene->_sequences.addTimer(30, 91);
+ break;
+
+ case 91:
+ switch (_globals[kBottleStatus]) {
+ case 0:
+ _vm->_dialogs->show(432);
+ break;
+
+ case 1:
+ _vm->_dialogs->show(70324);
+ break;
+
+ case 2:
+ _vm->_dialogs->show(70325);
+ break;
+
+ case 3:
+ _vm->_dialogs->show(70326);
+ break;
+
+ case 4:
+ _vm->_dialogs->show(70327);
+ break;
+
+ default:
+ break;
+ }
+ _game._player._stepEnabled = true;
+ break;
+
+ default:
+ break;
+ }
+}
+
+void Scene705::actions() {
+ if (_game._screenObjects._inputMode == kInputConversation)
+ handleFillBottle(_action._activeAction._verbId);
+ else if (_action.isAction(VERB_STEER_TOWARDS, NOUN_OPEN_WATER_TO_SOUTH)) {
+ switch (_game._trigger) {
+ case 0:
+ _game._player._stepEnabled = false;
+ _scene->_sequences.remove(_globals._sequenceIndexes[3]);
+ _globals._sequenceIndexes[2] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[2], false, 6, 1, 0, 0);
+ _scene->_sequences.setDepth(_globals._sequenceIndexes[2], 2);
+ _scene->_sequences.addSubEntry(_globals._sequenceIndexes[2], SEQUENCE_TRIGGER_EXPIRE, 0, 1);
+ _vm->_sound->command(18);
+ break;
+
+ case 1: {
+ int syncIdx = _globals._sequenceIndexes[2];
+ _globals._sequenceIndexes[2] = _scene->_sequences.startCycle(_globals._spriteIndexes[2], false, -2);
+ _scene->_sequences.setDepth(_globals._sequenceIndexes[2], 2);
+ _scene->_sequences.updateTimeout(_globals._sequenceIndexes[2], syncIdx);
+ _scene->_nextSceneId = 704;
+ _game._player._stepEnabled = true;
+ }
+ break;
+
+ default:
+ break;
+ }
+ } else if (_action.isAction(VERB_CLIMB_THROUGH, NOUN_WINDOW)) {
+ switch (_game._trigger) {
+ case 0:
+ _game._player._stepEnabled = false;
+ _scene->_sequences.remove(_globals._sequenceIndexes[3]);
+ _globals._sequenceIndexes[3] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[3], false, 6, 1, 0, 0);
+ _scene->_sequences.setAnimRange(_globals._sequenceIndexes[3], 1, 16);
+ _scene->_sequences.addSubEntry(_globals._sequenceIndexes[3], SEQUENCE_TRIGGER_EXPIRE, 0, 1);
+ break;
+
+ case 1: {
+ int syncIdx = _globals._sequenceIndexes[3];
+ _globals._sequenceIndexes[3] = _scene->_sequences.startCycle(_globals._spriteIndexes[3], false, 16);
+ _scene->_sequences.updateTimeout(_globals._sequenceIndexes[3], syncIdx);
+ _scene->_nextSceneId = 706;
+ _game._player._stepEnabled = true;
+ }
+ break;
+
+ default:
+ break;
+ }
+ } else if (_action.isAction(VERB_FILL, NOUN_BOTTLE, NOUN_WATER) || _action.isAction(VERB_PUT, NOUN_BOTTLE, NOUN_WATER)) {
+ if (_globals[kBottleStatus] != 4) {
+ handleBottleInterface();
+ _dialog1.start();
+ } else
+ _vm->_dialogs->show(70323);
+ } else if (_action._lookFlag || _action.isAction(VERB_LOOK, NOUN_WATER))
+ _vm->_dialogs->show(70511);
+ else if (_action.isAction(VERB_LOOK, NOUN_VOLCANO_RIM))
+ _vm->_dialogs->show(70512);
+ else if (_action.isAction(VERB_LOOK, NOUN_OPEN_WATER_TO_SOUTH))
+ _vm->_dialogs->show(70513);
+ else if (_action.isAction(VERB_LOOK, NOUN_SKY))
+ _vm->_dialogs->show(70514);
+ else if (_action.isAction(VERB_LOOK, NOUN_BUILDING))
+ _vm->_dialogs->show(70515);
+ else if (_action.isAction(VERB_LOOK, NOUN_WINDOW))
+ _vm->_dialogs->show(70516);
+ else
+ return;
+
+ _action._inProgress = false;
+}
+
+/*------------------------------------------------------------------------*/
+
+Scene706::Scene706(MADSEngine *vm) : Scene7xx(vm) {
+ _vaseHotspotId = -1;
+ _vaseMode = -1;
+ _animationMode = -1;
+ _animationFrame = -1;
+
+ _emptyPedestral = false;
+}
+
+void Scene706::synchronize(Common::Serializer &s) {
+ Scene7xx::synchronize(s);
+
+ s.syncAsSint16LE(_vaseHotspotId);
+ s.syncAsSint16LE(_vaseMode);
+ s.syncAsSint16LE(_animationMode);
+ s.syncAsSint16LE(_animationFrame);
+
+ s.syncAsByte(_emptyPedestral);
+}
+
+void Scene706::setup() {
+ setPlayerSpritesPrefix();
+ setAAName();
+ _scene->addActiveVocab(NOUN_BOTTLE);
+ _scene->addActiveVocab(NOUN_VASE);
+ _scene->addActiveVocab(VERB_WALKTO);
+}
+
+void Scene706::handleRexDeath() {
+ switch (_game._trigger) {
+ case 0:
+ _game._player._stepEnabled = false;
+ _game._player._visible = false;
+ _scene->loadAnimation(formAnimName('a', -1), 2);
+ break;
+
+ case 2:
+ if (_animationMode == 1)
+ _vm->_dialogs->show(70625);
+ else if (_globals[kBottleStatus] < 2)
+ _vm->_dialogs->show(70628);
+ else
+ _vm->_dialogs->show(70629);
+
+ _game._objects.setRoom(OBJ_VASE, _scene->_currentSceneId);
+ if (_animationMode == 2)
+ _game._objects.setRoom(OBJ_BOTTLE, 2);
+
+ _animationMode = 0;
+ _scene->_reloadSceneFlag = true;
+ break;
+
+ default:
+ break;
+ }
+}
+
+void Scene706::handleTakeVase() {
+ switch (_game._trigger) {
+ case 0:
+ _game._player._stepEnabled = false;
+ _game._player._visible = false;
+ _globals._sequenceIndexes[3] = _scene->_sequences.startReverseCycle(_globals._spriteIndexes[3], false, 4, 2, 0, 0);
+ _scene->_sequences.setMsgLayout(_globals._sequenceIndexes[3]);
+ _scene->_sequences.addSubEntry(_globals._sequenceIndexes[3], SEQUENCE_TRIGGER_SPRITE, 7, 1);
+ _scene->_sequences.addSubEntry(_globals._sequenceIndexes[3], SEQUENCE_TRIGGER_EXPIRE, 0, 2);
+ break;
+
+ case 1:
+ _vm->_sound->command(9);
+ _scene->_sequences.remove(_globals._sequenceIndexes[1]);
+ _scene->_dynamicHotspots.remove(_vaseHotspotId);
+ _game._objects.addToInventory(OBJ_VASE);
+ if (_vaseMode == 1) {
+ _globals._sequenceIndexes[4] = _scene->_sequences.startCycle(_globals._spriteIndexes[4], false, 1);
+ _scene->_sequences.setDepth(_globals._sequenceIndexes[4], 4);
+ _scene->_sequences.setPosition(_globals._sequenceIndexes[4], Common::Point(195, 99));
+ int idx = _scene->_dynamicHotspots.add(NOUN_BOTTLE, VERB_WALKTO, _globals._sequenceIndexes[4], Common::Rect(0, 0, 0, 0));
+ _scene->_dynamicHotspots.setPosition(idx, Common::Point(175, 124), FACING_SOUTHEAST);
+ _game._objects.setRoom(OBJ_BOTTLE, _scene->_currentSceneId);
+ }
+ break;
+
+ case 2:
+ _scene->_sequences.updateTimeout(-1, _globals._sequenceIndexes[3]);
+ _game._player._visible = true;
+ _vm->_dialogs->showItem(OBJ_VASE, 70630);
+ _game._player._stepEnabled = true;
+ break;
+ }
+}
+
+void Scene706::enter() {
+ _globals._spriteIndexes[3] = _scene->_sprites.addSprites("*RXMRC_3");
+ _globals._spriteIndexes[4] = _scene->_sprites.addSprites(formAnimName('b', -1));
+
+ if (!_game._visitedScenes._sceneRevisited)
+ _emptyPedestral = false;
+
+ if (_game._objects[OBJ_VASE]._roomNumber == _scene->_currentSceneId) {
+ _globals._spriteIndexes[1] = _scene->_sprites.addSprites(formAnimName('v', -1));
+ _globals._sequenceIndexes[1] = _scene->_sequences.startCycle(_globals._spriteIndexes[1], false, 1);
+ _scene->_sequences.setDepth(_globals._sequenceIndexes[1], 4);
+ int idx = _scene->_dynamicHotspots.add(NOUN_VASE, VERB_WALKTO, _globals._sequenceIndexes[1], Common::Rect(0, 0, 0, 0));
+ _vaseHotspotId = _scene->_dynamicHotspots.setPosition(idx, Common::Point(175, 124), FACING_SOUTHEAST);
+ } else if (_game._objects.isInRoom(OBJ_BOTTLE)) {
+ _globals._sequenceIndexes[4] = _scene->_sequences.startCycle(_globals._spriteIndexes[4], false, 1);
+ _scene->_sequences.setDepth(_globals._sequenceIndexes[4], 4);
+ _scene->_sequences.setPosition(_globals._sequenceIndexes[4], Common::Point(195, 99));
+ int idx = _scene->_dynamicHotspots.add(NOUN_BOTTLE, VERB_WALKTO, _globals._sequenceIndexes[4], Common::Rect(0, 0, 0, 0));
+ _scene->_dynamicHotspots.setPosition(idx, Common::Point(175, 124), FACING_SOUTHEAST);
+ }
+
+ _game._player._visible = true;
+
+ if (_scene->_priorSceneId == 707) {
+ _game._player._playerPos = Common::Point(277, 103);
+ _game._player._facing = FACING_SOUTHWEST;
+ } else if (_scene->_priorSceneId != -2) {
+ _game._player._playerPos = Common::Point(167, 152);
+ _game._player._facing = FACING_NORTH;
+ }
+
+ if (_globals[kTeleporterCommand]) {
+ _game._player._visible = false;
+ _game._player._stepEnabled = false;
+
+ switch (_globals[kTeleporterCommand]) {
+ case 1:
+ _scene->loadAnimation(formAnimName('E', 1), 75);
+ break;
+
+ case 2:
+ _scene->loadAnimation(formAnimName('E', -1), 80);
+ break;
+
+ default:
+ _game._player.walk(Common::Point(264, 116), FACING_SOUTHWEST);
+ _game._player._visible = true;
+ _game._player._stepEnabled = true;
+ break;
+ }
+ _globals[kTeleporterCommand] = 0;
+ }
+
+ _animationMode = 0;
+
+ if (_scene->_roomChanged) {
+ _game._objects.addToInventory(OBJ_BOTTLE);
+ _globals[kBottleStatus] = 2;
+ }
+
+ sceneEntrySound();
+}
+
+void Scene706::step() {
+ if (_game._trigger == 75) {
+ _game._player._stepEnabled = true;
+ _game._player._visible = true;
+ _game._player._priorTimer = _scene->_frameStartTime - _game._player._ticksAmount;
+ _game._player.walk(Common::Point(264, 116), FACING_SOUTHWEST);
+ }
+
+ if (_game._trigger == 80) {
+ _globals[kTeleporterCommand] = 1;
+ _scene->_nextSceneId = _globals[kTeleporterDestination];
+ _scene->_reloadSceneFlag = true;
+ }
+
+ if (_scene->_activeAnimation != nullptr) {
+ if ((_animationMode != 0) && (_scene->_activeAnimation->getCurrentFrame() != _animationFrame)) {
+ _animationFrame = _scene->_activeAnimation->getCurrentFrame();
+
+ if (_animationFrame == 6) {
+ _scene->_sequences.remove(_globals._sequenceIndexes[1]);
+ _game._objects.setRoom(OBJ_VASE, 2);
+
+ if (_animationMode == 2) {
+ _game._objects.setRoom(OBJ_BOTTLE, 1);
+
+ _globals._sequenceIndexes[4] = _scene->_sequences.startCycle(_globals._spriteIndexes[4], false, 1);
+ _scene->_sequences.setDepth(_globals._sequenceIndexes[4], 4);
+ _scene->_sequences.setPosition(_globals._sequenceIndexes[4], Common::Point(195, 99));
+ int idx = _scene->_dynamicHotspots.add(NOUN_BOTTLE, VERB_WALKTO, _globals._sequenceIndexes[4], Common::Rect(0, 0, 0, 0));
+ _scene->_dynamicHotspots.setPosition(idx, Common::Point(175, 124), FACING_SOUTHEAST);
+ }
+ }
+ }
+ }
+}
+
+void Scene706::preActions() {
+ if (_action.isAction(VERB_LOOK, NOUN_PORTRAIT))
+ _game._player._needToWalk = true;
+}
+
+void Scene706::actions() {
+ if (_action.isAction(VERB_WALK_INSIDE, NOUN_TELEPORTER)) {
+ _game._player._stepEnabled = false;
+ _game._player._visible = false;
+ _scene->_nextSceneId = 707;
+ _action._inProgress = false;
+ return;
+ }
+
+ if (_action.isAction(VERB_EXIT, NOUN_ROOM)) {
+ _scene->_nextSceneId = 705;
+ _action._inProgress = false;
+ return;
+ }
+
+ if (_action.isAction(VERB_TAKE, NOUN_VASE)) {
+ if (_game._difficulty != DIFFICULTY_EASY) {
+ _animationMode = 1;
+ handleRexDeath();
+ } else if (_game._trigger || !_game._objects.isInInventory(OBJ_VASE)) {
+ handleTakeVase();
+ _emptyPedestral = true;
+ }
+ _action._inProgress = false;
+ return;
+ }
+
+ if (_action.isAction(VERB_PUT, NOUN_BOTTLE, NOUN_PEDESTAL)) {
+ if ((_globals[kBottleStatus] == 2 && _game._difficulty == DIFFICULTY_HARD) ||
+ (_globals[kBottleStatus] != 0 && _game._difficulty != DIFFICULTY_HARD)) {
+ if (!_game._objects.isInInventory(OBJ_VASE) || _game._trigger) {
+ _vaseMode = 1;
+ handleTakeVase();
+ _action._inProgress = false;
+ return;
+ }
+ } else if (_game._objects.isInRoom(OBJ_VASE) || _game._trigger) {
+ _animationMode = 2;
+ handleRexDeath();
+ _action._inProgress = false;
+ return;
+ }
+ }
+
+ if (_action.isAction(VERB_PUT, NOUN_PEDESTAL) && _game._objects.isInInventory(_game._objects.getIdFromDesc(_action._activeAction._objectNameId))) {
+ int objectId = _game._objects.getIdFromDesc(_action._activeAction._objectNameId);
+ if (_game._objects[objectId].hasQuality(10))
+ _vm->_dialogs->show(70626);
+ else
+ _vm->_dialogs->show(70627);
+ } else if (_action.isAction(VERB_TAKE, NOUN_BOTTLE) && _game._objects.isInInventory(OBJ_VASE))
+ _vm->_dialogs->show(70631);
+ else if (_action._lookFlag) {
+ if (_game._objects[OBJ_VASE]._roomNumber == _scene->_currentSceneId)
+ _vm->_dialogs->show(70610);
+ else
+ _vm->_dialogs->show(70611);
+ } else if (_action.isAction(VERB_LOOK, NOUN_FLOOR))
+ _vm->_dialogs->show(70612);
+ else if (_action.isAction(VERB_LOOK, NOUN_PILLAR))
+ _vm->_dialogs->show(70613);
+ else if (_action.isAction(VERB_LOOK, NOUN_OLD_TEA_CUP))
+ _vm->_dialogs->show(70614);
+ else if (_action.isAction(VERB_TAKE, NOUN_OLD_TEA_CUP))
+ _vm->_dialogs->show(70615);
+ else if (_action.isAction(VERB_LOOK, NOUN_OLD_VASE))
+ _vm->_dialogs->show(70616);
+ else if (_action.isAction(VERB_LOOK, NOUN_PORTRAIT))
+ _vm->_dialogs->show(70617);
+ else if (_action.isAction(VERB_LOOK, NOUN_NAME_PLATE))
+ _vm->_dialogs->show(70618);
+ else if (_action.isAction(VERB_LOOK, NOUN_WALL))
+ _vm->_dialogs->show(70619);
+ else if (_action.isAction(VERB_LOOK, NOUN_PEDESTAL)) {
+ if (_game._objects[OBJ_VASE]._roomNumber == _scene->_currentSceneId)
+ _vm->_dialogs->show(70620);
+ else if (_game._objects[OBJ_BOTTLE]._roomNumber == _scene->_currentSceneId)
+ _vm->_dialogs->show(70622);
+ else
+ _vm->_dialogs->show(70621);
+ } else if (_action.isAction(VERB_LOOK, NOUN_TELEPORTER))
+ _vm->_dialogs->show(70623);
+ else if (_action.isAction(VERB_LOOK, NOUN_VASE) && (_game._objects[OBJ_VASE]._roomNumber == _scene->_currentSceneId))
+ _vm->_dialogs->show(70624);
+ else if (_action.isAction(VERB_LOOK, NOUN_BOTTLE) && (_action._mainObjectSource == 4))
+ _vm->_dialogs->show(70632);
+ else
+ return;
+
+ _action._inProgress = false;
+}
+
+/*------------------------------------------------------------------------*/
+
+void Scene707::setup() {
+ _game._player._spritesPrefix = "";
+ // The original calls Scene7xx::setAAName()
+ _game._aaName = Resources::formatAAName(5);
+}
+
+void Scene707::enter() {
+ _handSpriteId = _scene->_sprites.addSprites("*REXHAND");
+ teleporterEnter();
+
+ // The original uses Scene7xx_sceneEntrySound
+ if (!_vm->_musicFlag)
+ _vm->_sound->command(2);
+ else
+ _vm->_sound->command(25);
+}
+
+void Scene707::step() {
+ teleporterStep();
+}
+
+void Scene707::actions() {
+ if (teleporterActions()) {
+ _action._inProgress = false;
+ return;
+ }
+
+ if (_action.isAction(VERB_LOOK, NOUN_VIEWPORT) || _action.isAction(VERB_PEER_THROUGH, NOUN_VIEWPORT))
+ _vm->_dialogs->show(70710);
+ else if (_action.isAction(VERB_LOOK, NOUN_KEYPAD))
+ _vm->_dialogs->show(70711);
+ else if (_action.isAction(VERB_LOOK, NOUN_DISPLAY))
+ _vm->_dialogs->show(70712);
+ else if (_action.isAction(VERB_LOOK, NOUN_0_KEY) || _action.isAction(VERB_LOOK, NOUN_1_KEY)
+ || _action.isAction(VERB_LOOK, NOUN_2_KEY) || _action.isAction(VERB_LOOK, NOUN_3_KEY)
+ || _action.isAction(VERB_LOOK, NOUN_4_KEY) || _action.isAction(VERB_LOOK, NOUN_5_KEY)
+ || _action.isAction(VERB_LOOK, NOUN_6_KEY) || _action.isAction(VERB_LOOK, NOUN_7_KEY)
+ || _action.isAction(VERB_LOOK, NOUN_8_KEY) || _action.isAction(VERB_LOOK, NOUN_9_KEY)
+ || _action.isAction(VERB_LOOK, NOUN_SMILE_KEY) || _action.isAction(VERB_LOOK, NOUN_ENTER_KEY)
+ || _action.isAction(VERB_LOOK, NOUN_FROWN_KEY))
+ _vm->_dialogs->show(70713);
+ else if (_action.isAction(VERB_LOOK, NOUN_DEVICE) || _action._lookFlag)
+ _vm->_dialogs->show(70714);
+ else
+ return;
+
+ _action._inProgress = false;
+}
+
+/*------------------------------------------------------------------------*/
+
+void Scene710::setup() {
+ _game._player._spritesPrefix = "";
+ setAAName();
+}
+
+void Scene710::enter() {
+ _scene->_userInterface.setup(kInputLimitedSentences);
+
+ if (_game._objects[OBJ_VASE]._roomNumber == 706) {
+ _globals._spriteIndexes[1] = _scene->_sprites.addSprites(formAnimName('g', -1));
+ _globals._sequenceIndexes[1] = _scene->_sequences.startReverseCycle(_globals._spriteIndexes[1], false, 6, 0, 0, 0);
+ }
+
+ _game._player._visible = false;
+ _scene->_sequences.addTimer(600, 70);
+
+ sceneEntrySound();
+}
+
+void Scene710::step() {
+ if (_game._trigger == 70) {
+ if (_game._globals[kCityFlooded])
+ _scene->_nextSceneId = 701;
+ else
+ _scene->_nextSceneId = 751;
+ }
+}
+
+void Scene710::actions() {
+ if (_action.isAction(VERB_PUT_DOWN, NOUN_BINOCULARS)) {
+ _game._player._stepEnabled = false;
+
+ if (_game._globals[kCityFlooded])
+ _scene->_nextSceneId = 701;
+ else
+ _scene->_nextSceneId = 751;
+
+ _action._inProgress = false;
+ }
+}
+
+/*------------------------------------------------------------------------*/
+
+void Scene711::setup() {
+ // The original was calling Scene7xx::setPlayerSpreitesPrefix()
+ _vm->_sound->command(5);
+ Common::String oldName = _game._player._spritesPrefix;
+ _game._player._spritesPrefix = "";
+ _game._player._scalingVelocity = true;
+
+ if (oldName != _game._player._spritesPrefix)
+ _game._player._spritesChanged = true;
+
+ _vm->_palette->setEntry(16, 10, 63, 63);
+ _vm->_palette->setEntry(17, 10, 45, 45);
+
+ // The original was calling Scene7xx::setAAName()
+ _game._aaName = Resources::formatAAName(5);
+
+ _game._player._spritesPrefix = "";
+}
+
+void Scene711::enter() {
+ if (_globals[kSexOfRex] == REX_FEMALE)
+ _handSpriteId = _scene->_sprites.addSprites("*ROXHAND");
+ else
+ _handSpriteId = _scene->_sprites.addSprites("*REXHAND");
+
+ teleporterEnter();
+
+ // The original was using Scene7xx_SceneEntrySound()
+ if (!_vm->_musicFlag)
+ _vm->_sound->command(2);
+ else
+ _vm->_sound->command(25);
+}
+
+void Scene711::step() {
+ teleporterStep();
+}
+
+void Scene711::actions() {
+ if (teleporterActions())
+ _action._inProgress = false;
+}
+
+/*------------------------------------------------------------------------*/
+
+Scene751::Scene751(MADSEngine *vm) : Scene7xx(vm) {
+ _rexHandingLine = false;
+}
+
+void Scene751::synchronize(Common::Serializer &s) {
+ Scene7xx::synchronize(s);
+
+ s.syncAsByte(_rexHandingLine);
+}
+
+void Scene751::setup() {
+ setPlayerSpritesPrefix();
+ setAAName();
+ _scene->addActiveVocab(NOUN_FISHING_LINE);
+ _scene->addActiveVocab(VERB_WALKTO);
+}
+
+void Scene751::enter() {
+ _globals._spriteIndexes[1] = _scene->_sprites.addSprites("*RM701X0");
+ _globals._spriteIndexes[2] = _scene->_sprites.addSprites(formAnimName('a', 0));
+ _globals._spriteIndexes[3] = _scene->_sprites.addSprites(formAnimName('f', 0));
+ _globals._spriteIndexes[4] = _scene->_sprites.addSprites("*RM202A1");
+
+ if (!_game._visitedScenes._sceneRevisited)
+ _rexHandingLine = false;
+
+ if (_globals[kLineStatus] == 2 || _globals[kLineStatus] == 3) {
+ _globals._sequenceIndexes[3] = _scene->_sequences.startCycle(_globals._spriteIndexes[3], false, -1);
+ _scene->_sequences.setDepth(_globals._sequenceIndexes[3], 7);
+ int idx = _scene->_dynamicHotspots.add(NOUN_FISHING_LINE, VERB_WALKTO, _globals._sequenceIndexes[3], Common::Rect(0, 0, 0, 0));
+ _scene->_dynamicHotspots.setPosition(idx, Common::Point(268, 140), FACING_NORTHWEST);
+ }
+
+ _globals._sequenceIndexes[1] = _scene->_sequences.startCycle(_globals._spriteIndexes[1], false, 1);
+ _scene->_sequences.setPosition(_globals._sequenceIndexes[1], Common::Point(48, 136));
+ _scene->_sequences.setDepth(_globals._sequenceIndexes[1], 10);
+
+ if (_scene->_priorSceneId == 752) {
+ _game._player._playerPos = Common::Point(309, 138);
+ _game._player._facing = FACING_WEST;
+ } else if (_scene->_priorSceneId == 710) {
+ _game._player._playerPos = Common::Point(154, 129);
+ _game._player._facing = FACING_NORTH;
+ _game._player._visible = false;
+ _game._player._stepEnabled = false;
+ _globals._sequenceIndexes[4] = _scene->_sequences.startCycle(_globals._spriteIndexes[4], false, -2);
+ _scene->_sequences.setPosition(_globals._sequenceIndexes[4], Common::Point(155, 129));
+ _scene->_sequences.addTimer(15, 70);
+ } else if (_scene->_priorSceneId != -2) {
+ _game._player._playerPos = Common::Point(22, 131);
+ _game._player._facing = FACING_EAST;
+ _game._player._stepEnabled = false;
+ _scene->_sequences.addTimer(60, 60);
+ } else if (_rexHandingLine) {
+ _game._player._visible = false;
+ _game._player._playerPos = Common::Point(268, 140);
+ _game._player._facing = FACING_NORTHWEST;
+ _game._player._visible = false;
+ _globals._sequenceIndexes[2] = _scene->_sequences.startCycle(_globals._spriteIndexes[2], false, 7);
+ _scene->_sequences.setMsgLayout(_globals._sequenceIndexes[2]);
+ } else if (_globals[kLineStatus] == 2) {
+ _globals._sequenceIndexes[3] = _scene->_sequences.startCycle(_globals._spriteIndexes[3], false, -1);
+ _scene->_sequences.setDepth(_globals._sequenceIndexes[3], 7);
+ int idx = _scene->_dynamicHotspots.add(NOUN_FISHING_LINE, VERB_WALKTO, _globals._sequenceIndexes[3], Common::Rect(0, 0, 0, 0));
+ _scene->_dynamicHotspots.setPosition(idx, Common::Point(268, 140), FACING_NORTHWEST);
+ }
+
+ if (_scene->_roomChanged) {
+ _game._objects.addToInventory(OBJ_FISHING_LINE);
+ _game._objects.addToInventory(OBJ_BINOCULARS);
+ }
+
+ sceneEntrySound();
+ _game.loadQuoteSet(0x30A, 0x30B, 0x30C, 0x30D, 0x30E, 0);
+
+ if (_globals[kTimebombTimer] > 0)
+ _globals[kTimebombTimer] = 10200;
+}
+
+void Scene751::step() {
+ switch (_game._trigger) {
+ case 70:
+ _scene->_sequences.remove(_globals._sequenceIndexes[4]);
+ _globals._sequenceIndexes[4] = _scene->_sequences.startReverseCycle(_globals._spriteIndexes[4], false, 6, 1, 0, 0);
+ _scene->_sequences.setPosition(_globals._sequenceIndexes[4], Common::Point(155, 129));
+ _scene->_sequences.addSubEntry(_globals._sequenceIndexes[4], SEQUENCE_TRIGGER_EXPIRE, 0, 71);
+ break;
+
+ case 71:
+ _scene->_sequences.updateTimeout(-1, _globals._sequenceIndexes[4]);
+ _game._player._visible = true;
+ _game._player._stepEnabled = true;
+ break;
+
+ default:
+ break;
+ }
+
+ if ((_globals[kTimebombTimer] >= 10800) && (_globals[kTimebombStatus] == 1)) {
+ _globals[kTimebombStatus] = 3;
+ _globals[kTimebombTimer] = 0;
+ _globals[kCheckDaemonTimebomb] = false;
+ _scene->_nextSceneId = 620;
+ }
+
+ switch (_game._trigger) {
+ case 60:
+ _vm->_sound->command(16);
+ _scene->_sequences.remove(_globals._sequenceIndexes[1]);
+ _globals._sequenceIndexes[1] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[1], false, 5, 1, 0, 0);
+ _scene->_sequences.setPosition(_globals._sequenceIndexes[1], Common::Point(48, 136));
+ _scene->_sequences.setDepth(_globals._sequenceIndexes[1], 10);
+ _scene->_sequences.addSubEntry(_globals._sequenceIndexes[1], SEQUENCE_TRIGGER_EXPIRE, 0, 61);
+ break;
+
+ case 61:
+ _game._player.walk(Common::Point(61, 131), FACING_EAST);
+ _scene->_sequences.addTimer(120, 62);
+ break;
+
+ case 62:
+ _vm->_sound->command(17);
+ _globals._sequenceIndexes[1] = _scene->_sequences.startReverseCycle(_globals._spriteIndexes[1], false, 5, 1, 0, 0);
+ _scene->_sequences.setPosition(_globals._sequenceIndexes[1], Common::Point(48, 136));
+ _scene->_sequences.setDepth(_globals._sequenceIndexes[1], 10);
+ _scene->_sequences.addSubEntry(_globals._sequenceIndexes[1], SEQUENCE_TRIGGER_EXPIRE, 0, 63);
+ break;
+
+ case 63:
+ _globals._sequenceIndexes[1] = _scene->_sequences.startCycle(_globals._spriteIndexes[1], false, -1);
+ _scene->_sequences.setPosition(_globals._sequenceIndexes[1], Common::Point(48, 136));
+ _scene->_sequences.setDepth(_globals._sequenceIndexes[1], 10);
+ _game._player._stepEnabled = true;
+ _scene->_kernelMessages.reset();
+ break;
+
+ default:
+ break;
+ }
+}
+
+void Scene751::preActions() {
+ if (_action.isAction(VERB_LOOK, NOUN_TALL_BUILDING))
+ _game._player.walk(Common::Point(154, 129), FACING_NORTHEAST);
+
+ if (_action.isAction(VERB_LOOK, NOUN_BINOCULARS, NOUN_TALL_BUILDING))
+ _game._player.walk(Common::Point(154, 129), FACING_NORTH);
+
+ if (_action.isAction(VERB_WALKTO, NOUN_EAST_END_OF_PLATFORM))
+ _game._player._walkOffScreenSceneId = 752;
+
+ if (!_rexHandingLine)
+ return;
+
+ if (_action.isAction(VERB_LOOK) || _action.isObject(NOUN_FISHING_LINE) || _action.isAction(VERB_TALKTO))
+ _game._player._needToWalk = false;
+
+ if ((!_action.isAction(VERB_PUT, NOUN_FISHING_LINE, NOUN_HOOK) || !_action.isAction(VERB_TIE, NOUN_FISHING_LINE, NOUN_HOOK) || !_action.isAction(VERB_ATTACH, NOUN_FISHING_LINE, NOUN_HOOK))
+ && (_game._player._needToWalk)) {
+ switch (_game._trigger) {
+ case 0:
+ _game._player._readyToWalk = false;
+ _game._player._stepEnabled = false;
+ _scene->_sequences.remove(_globals._sequenceIndexes[2]);
+ _globals._sequenceIndexes[2] = _scene->_sequences.startReverseCycle(_globals._spriteIndexes[2], false, 11, 1, 0, 0);
+ _scene->_sequences.setAnimRange(_globals._sequenceIndexes[2], -1, 7);
+ _scene->_sequences.addSubEntry(_globals._sequenceIndexes[2], SEQUENCE_TRIGGER_EXPIRE, 0, 1);
+ break;
+
+ case 1:
+ _scene->_sequences.updateTimeout(-1, _globals._sequenceIndexes[2]);
+ _game._player._visible = true;
+ _rexHandingLine = false;
+ _game._player._stepEnabled = true;
+ _game._player._readyToWalk = true;
+ break;
+
+ default:
+ break;
+ }
+ }
+}
+
+void Scene751::actions() {
+ if (_action.isAction(VERB_WALK_ALONG, NOUN_PLATFORM))
+ ; // Nothing
+ else if (_action.isAction(VERB_LOOK, NOUN_BINOCULARS, NOUN_TALL_BUILDING)) {
+ switch (_game._trigger) {
+ case 0:
+ _game._player._stepEnabled = false;
+ _game._player._visible = false;
+ _globals._sequenceIndexes[4] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[4], false, 6, 1, 0, 0);
+ _scene->_sequences.setPosition(_globals._sequenceIndexes[4], Common::Point(155, 129));
+ _scene->_sequences.addSubEntry(_globals._sequenceIndexes[4], SEQUENCE_TRIGGER_EXPIRE, 0, 1);
+ break;
+
+ case 1: {
+ int syncIdx = _globals._sequenceIndexes[4];
+ _globals._sequenceIndexes[4] = _scene->_sequences.startCycle(_globals._spriteIndexes[4], false, -2);
+ _scene->_sequences.setPosition(_globals._sequenceIndexes[4], Common::Point(155, 129));
+ _scene->_sequences.updateTimeout(_globals._sequenceIndexes[4], syncIdx);
+ _scene->_sequences.addTimer(15, 2);
+ }
+ break;
+
+ case 2:
+ _scene->_nextSceneId = 710;
+ break;
+
+ default:
+ break;
+ }
+ } else if (_action.isAction(VERB_STEP_INTO, NOUN_ELEVATOR)) {
+ switch (_game._trigger) {
+ case 0:
+ _game._player._stepEnabled = false;
+ _scene->_sequences.remove(_globals._sequenceIndexes[1]);
+ _vm->_sound->command(16);
+ _globals._sequenceIndexes[1] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[1], false, 5, 1, 0, 0);
+ _scene->_sequences.setPosition(_globals._sequenceIndexes[1], Common::Point(48, 136));
+ _scene->_sequences.setDepth(_globals._sequenceIndexes[1], 10);
+ _scene->_kernelMessages.reset();
+ _scene->_kernelMessages.add(Common::Point(0, 0), 0x1110, 34, 0, 120, _game.getQuote(0x30D));
+ _scene->_sequences.addSubEntry(_globals._sequenceIndexes[1], SEQUENCE_TRIGGER_EXPIRE, 0, 1);
+ break;
+
+ case 1:
+ _game._player.walk(Common::Point(22, 131), FACING_EAST);
+ _scene->_sequences.addTimer(120, 3);
+ break;
+
+ case 3:
+ _vm->_sound->command(17);
+ _globals._sequenceIndexes[1] = _scene->_sequences.startReverseCycle(_globals._spriteIndexes[1], false, 5, 1, 0, 0);
+ _scene->_sequences.setPosition(_globals._sequenceIndexes[1], Common::Point(48, 136));
+ _scene->_sequences.setDepth(_globals._sequenceIndexes[1], 10);
+ _scene->_sequences.addSubEntry(_globals._sequenceIndexes[1], SEQUENCE_TRIGGER_EXPIRE, 0, 4);
+ break;
+
+ case 4:
+ _globals._sequenceIndexes[1] = _scene->_sequences.startCycle(_globals._spriteIndexes[1], false, -1);
+ _scene->_sequences.setPosition(_globals._sequenceIndexes[1], Common::Point(48, 136));
+ _scene->_sequences.setDepth(_globals._sequenceIndexes[1], 10);
+ _scene->_sequences.addTimer(60, 5);
+ break;
+
+ case 5:
+ _game._player._stepEnabled = true;
+ _scene->_nextSceneId = 513;
+ break;
+
+ default:
+ break;
+ }
+ } else if (_action.isAction(VERB_PUT, NOUN_FISHING_LINE, NOUN_HOOK) || _action.isAction(VERB_TIE, NOUN_FISHING_LINE, NOUN_HOOK) || _action.isAction(VERB_ATTACH, NOUN_FISHING_LINE, NOUN_HOOK)) {
+ if (_globals[kLineStatus] == 1) {
+ switch (_game._trigger) {
+ case 0:
+ _game._player._visible = false;
+ _game._player._stepEnabled = false;
+ _globals._sequenceIndexes[2] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[2], false, 8, 1, 0, 0);
+ _scene->_sequences.setAnimRange(_globals._sequenceIndexes[2], -1, 6);
+ _scene->_sequences.updateTimeout(_globals._sequenceIndexes[2], -1);
+ _scene->_sequences.addSubEntry(_globals._sequenceIndexes[2], SEQUENCE_TRIGGER_EXPIRE, 0, 1);
+ break;
+
+ case 1: {
+ int syncIdx = _globals._sequenceIndexes[2];
+ _globals._sequenceIndexes[2] = _scene->_sequences.startCycle(_globals._spriteIndexes[2], false, 7);
+ _scene->_sequences.updateTimeout(_globals._sequenceIndexes[2], syncIdx);
+ _scene->_sequences.addTimer(30, 2);
+ }
+ break;
+
+ case 2:
+ _rexHandingLine = true;
+ _scene->_sequences.remove(_globals._sequenceIndexes[2]);
+ _globals._sequenceIndexes[2] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[2], false, 8, 1, 0, 0);
+ _scene->_sequences.setAnimRange(_globals._sequenceIndexes[2], 8, -2);
+ _scene->_sequences.addSubEntry(_globals._sequenceIndexes[2], SEQUENCE_TRIGGER_EXPIRE, 0, 3);
+ break;
+
+ case 3: {
+ _scene->_sequences.updateTimeout(-1, _globals._sequenceIndexes[2]);
+ _game._player._visible = true;
+ _globals._sequenceIndexes[3] = _scene->_sequences.startCycle(_globals._spriteIndexes[3], false, -1);
+ _scene->_sequences.setDepth(_globals._sequenceIndexes[3], 7);
+ int idx = _scene->_dynamicHotspots.add(NOUN_FISHING_LINE, VERB_WALKTO, _globals._sequenceIndexes[3], Common::Rect(0, 0, 0, 0));
+ _scene->_dynamicHotspots.setPosition(idx, Common::Point(268, 140), FACING_NORTHWEST);
+ _scene->_kernelMessages.reset();
+ _game._objects.setRoom(OBJ_FISHING_LINE, _scene->_currentSceneId);
+ _rexHandingLine = false;
+ _globals[kLineStatus] = 2;
+ _game._player._stepEnabled = true;
+ _vm->_dialogs->show(75120);
+ }
+ break;
+
+ default:
+ break;
+ }
+ }
+ } else if (_action._lookFlag || _action.isAction(VERB_LOOK, NOUN_CITY))
+ _vm->_dialogs->show(75110);
+ else if (_action.isAction(VERB_LOOK, NOUN_ELEVATOR))
+ _vm->_dialogs->show(75112);
+ else if (_action.isAction(VERB_LOOK, NOUN_PLATFORM))
+ _vm->_dialogs->show(75113);
+ else if (_action.isAction(VERB_LOOK, NOUN_CEMENT_PYLON))
+ _vm->_dialogs->show(75114);
+ else if ((_action.isAction(VERB_LOOK, NOUN_HOOK) || _action.isAction(VERB_LOOK, NOUN_FISHING_LINE))
+ && (_globals[kLineStatus] == 2 || _globals[kLineStatus] == 3))
+ _vm->_dialogs->show(75116);
+ else if (_action.isAction(VERB_LOOK, NOUN_HOOK))
+ _vm->_dialogs->show(75115);
+ else if (_action.isAction(VERB_LOOK, NOUN_ROCK))
+ _vm->_dialogs->show(75117);
+ else if (_action.isAction(VERB_TAKE, NOUN_ROCK))
+ _vm->_dialogs->show(75118);
+ else if (_action.isAction(VERB_LOOK, NOUN_EAST_END_OF_PLATFORM))
+ _vm->_dialogs->show(75119);
+ else if (_action.isAction(VERB_TAKE, NOUN_FISHING_LINE) && (_globals[kLineStatus] == 3 || _globals[kLineStatus] == 2))
+ _vm->_dialogs->show(75121);
+ else if (_action.isAction(VERB_LOOK, NOUN_TALL_BUILDING))
+ _vm->_dialogs->show(75122);
+ else if (_action.isAction(VERB_TIE, NOUN_FISHING_LINE, NOUN_CEMENT_PYLON) || _action.isAction(VERB_ATTACH, NOUN_FISHING_LINE, NOUN_CEMENT_PYLON))
+ _vm->_dialogs->show(75123);
+ else
+ return;
+
+ _action._inProgress = false;
+}
+
+/*------------------------------------------------------------------------*/
+
+Scene752::Scene752(MADSEngine *vm) : Scene7xx(vm) {
+ _cardId = -1;
+}
+
+void Scene752::synchronize(Common::Serializer &s) {
+ Scene7xx::synchronize(s);
+
+ s.syncAsSint16LE(_cardId);
+}
+
+void Scene752::setup() {
+ setPlayerSpritesPrefix();
+ setAAName();
+
+ _scene->addActiveVocab(NOUN_ID_CARD);
+ _scene->addActiveVocab(VERB_WALKTO);
+ _scene->addActiveVocab(VERB_LOOK_AT);
+ _scene->addActiveVocab(NOUN_LASER_BEAM);
+}
+
+void Scene752::enter() {
+ _globals._spriteIndexes[14] = _scene->_sprites.addSprites(formAnimName('l', -1));
+ _globals._spriteIndexes[12] = _scene->_sprites.addSprites("*RXMBD_8");
+
+ if (_scene->_priorSceneId == 751) {
+ _game._player._playerPos = Common::Point(13, 145);
+ _game._player._facing = FACING_EAST;
+ } else if (_scene->_priorSceneId != -2) {
+ _game._player._playerPos = Common::Point(289, 138);
+ _game._player.walk(Common::Point(262, 148), FACING_WEST);
+ _game._player._facing = FACING_WEST;
+ _game._player._visible = true;
+ }
+
+ if (_game._objects[OBJ_ID_CARD]._roomNumber == 752) {
+ _globals._spriteIndexes[13] = _scene->_sprites.addSprites(formAnimName('i', -1));
+ _globals._sequenceIndexes[13] = _scene->_sequences.startCycle(_globals._spriteIndexes[13], false, 1);
+ _scene->_sequences.setDepth(_globals._sequenceIndexes[13], 8);
+ int idx = _scene->_dynamicHotspots.add(NOUN_ID_CARD, VERB_WALKTO, _globals._sequenceIndexes[13], Common::Rect(0, 0, 0, 0));
+ _cardId = _scene->_dynamicHotspots.setPosition(idx, Common::Point(234, 135), FACING_NORTH);
+ }
+
+ if (_game._globals[kLaserHoleIsThere]) {
+ _globals._sequenceIndexes[14] = _scene->_sequences.startCycle(_globals._spriteIndexes[14], false, 1);
+ _scene->_sequences.setDepth(_globals._sequenceIndexes[14], 13);
+ int idx = _scene->_dynamicHotspots.add(NOUN_LASER_BEAM, VERB_LOOK_AT, _globals._sequenceIndexes[14], Common::Rect(0, 0, 0, 0));
+ _scene->_dynamicHotspots.setPosition(idx, Common::Point(215, 130), FACING_NORTHWEST);
+ }
+
+ if (_game._globals[kTeleporterCommand]) {
+ switch(_game._globals[kTeleporterCommand]) {
+ case TELEPORTER_BEAM_OUT:
+ case TELEPORTER_WRONG:
+ case TELEPORTER_STEP_OUT:
+ _game._player._visible = true;
+ _game._player._stepEnabled = true;
+ break;
+ default:
+ break;
+ }
+
+ _game._globals[kTeleporterCommand] = TELEPORTER_NONE;
+ }
+
+ if (_globals._timebombTimer > 0)
+ _globals._timebombTimer = 10800 - 600;
+
+ sceneEntrySound();
+}
+
+void Scene752::step() {
+ if (_globals._timebombTimer >= 10800 && _game._globals[kTimebombStatus] == TIMEBOMB_ACTIVATED) {
+ _globals[kTimebombStatus] = TIMEBOMB_DEAD;
+ _globals._timebombTimer = 0;
+ _globals[kCheckDaemonTimebomb] = false;
+ _scene->_nextSceneId = 620;
+ }
+}
+
+void Scene752::preActions() {
+ if (_action.isAction(VERB_WALKTO, NOUN_WEST_END_OF_PLATFORM)) {
+ _game._player._walkOffScreenSceneId = 751;
+ }
+}
+
+void Scene752::actions() {
+ if (_action.isAction(VERB_WALK_ALONG, NOUN_PLATFORM))
+ ;
+ else if (_action.isAction(VERB_STEP_INTO, NOUN_TELEPORTER)) {
+ _game._player._stepEnabled = false;
+ _game._player._visible = false;
+ _scene->_nextSceneId = 711;
+ } else if (_action.isAction(VERB_TAKE, NOUN_ID_CARD) && (!_game._objects.isInInventory(OBJ_ID_CARD) || _game._trigger)) {
+ switch (_game._trigger) {
+ case 0:
+ _game._player._stepEnabled = false;
+ _game._player._visible = false;
+ _globals._sequenceIndexes[12] = _scene->_sequences.startReverseCycle(_globals._spriteIndexes[12], false, 5, 2, 0, 0);
+ _scene->_sequences.setMsgLayout(_globals._sequenceIndexes[12]);
+ _scene->_sequences.addSubEntry(_globals._sequenceIndexes[12], SEQUENCE_TRIGGER_SPRITE, 4, 1);
+ _scene->_sequences.addSubEntry(_globals._sequenceIndexes[12], SEQUENCE_TRIGGER_EXPIRE, 0, 2);
+ break;
+ case 1:
+ _vm->_sound->command(15);
+ _scene->_sequences.remove(_globals._sequenceIndexes[13]);
+ _game._objects.addToInventory(OBJ_ID_CARD);
+ _scene->_dynamicHotspots.remove(_cardId);
+ _vm->_dialogs->showItem(OBJ_ID_CARD, 830);
+ break;
+ case 2:
+ _game._player._visible = true;
+ _game._player._stepEnabled = true;
+ break;
+ default:
+ break;
+ }
+ } else if (_action.isAction(VERB_TAKE, NOUN_BONES) && (_action._savedFields._mainObjectSource == CAT_HOTSPOT) &&
+ (!_game._objects.isInInventory(OBJ_BONES) || _game._trigger)) {
+ switch (_game._trigger) {
+ case 0:
+ _game._player._stepEnabled = false;
+ _game._player._visible = false;
+ _globals._sequenceIndexes[12] = _scene->_sequences.startReverseCycle(_globals._spriteIndexes[12], false, 5, 2, 0, 0);
+ _scene->_sequences.setMsgLayout(_globals._sequenceIndexes[12]);
+ _scene->_sequences.addSubEntry(_globals._sequenceIndexes[12], SEQUENCE_TRIGGER_SPRITE, 4, 1);
+ _scene->_sequences.addSubEntry(_globals._sequenceIndexes[12], SEQUENCE_TRIGGER_EXPIRE, 0, 2);
+ break;
+ case 1:
+ _vm->_sound->command(15);
+ if (_game._objects.isInInventory(OBJ_BONE))
+ _game._objects.setRoom(OBJ_BONE, NOWHERE);
+ _game._objects.addToInventory(OBJ_BONES);
+ _vm->_dialogs->showItem(OBJ_BONES, 75221);
+ break;
+ case 2:
+ _scene->_sequences.updateTimeout(-1, _globals._sequenceIndexes[12]);
+ _game._player._visible = true;
+ _game._player._stepEnabled = true;
+ break;
+ default:
+ break;
+ }
+ } else if (_action._lookFlag || _action.isAction(VERB_LOOK, NOUN_CITY)) {
+ if (_globals[kLaserHoleIsThere])
+ _vm->_dialogs->show(75212);
+ else
+ _vm->_dialogs->show(75210);
+ } else if (_action.isAction(VERB_LOOK, NOUN_PLATFORM))
+ _vm->_dialogs->show(75213);
+ else if (_action.isAction(VERB_LOOK, NOUN_CEMENT_BLOCK))
+ _vm->_dialogs->show(75214);
+ else if (_action.isAction(VERB_LOOK, NOUN_ROCK))
+ _vm->_dialogs->show(75215);
+ else if (_action.isAction(VERB_TAKE, NOUN_ROCK))
+ _vm->_dialogs->show(75216);
+ else if (_action.isAction(VERB_LOOK, NOUN_WEST_END_OF_PLATFORM))
+ _vm->_dialogs->show(75217);
+ else if (_action.isAction(VERB_LOOK, NOUN_TELEPORTER))
+ _vm->_dialogs->show(75218);
+ else if ((_action.isAction(VERB_LOOK, NOUN_BONES) || _action.isAction(VERB_LOOK, NOUN_ID_CARD)) && (_action._mainObjectSource == CAT_HOTSPOT)) {
+ if (_game._objects[OBJ_ID_CARD]._roomNumber == 752)
+ _vm->_dialogs->show(75219);
+ else
+ _vm->_dialogs->show(75220);
+ } else if (_action.isAction(VERB_TAKE, NOUN_BONES) && (_action._savedFields._mainObjectSource == CAT_HOTSPOT)) {
+ if (_game._objects.isInInventory(OBJ_BONES))
+ _vm->_dialogs->show(75222);
+ } else
+ return;
+
+ _action._inProgress = false;
+}
+
+/*------------------------------------------------------------------------*/
+
+} // End of namespace Nebular
+} // End of namespace MADS
diff --git a/engines/mads/nebular/nebular_scenes7.h b/engines/mads/nebular/nebular_scenes7.h
new file mode 100644
index 0000000000..dfb3c0f16e
--- /dev/null
+++ b/engines/mads/nebular/nebular_scenes7.h
@@ -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.
+ *
+ */
+
+#ifndef MADS_NEBULAR_SCENES7_H
+#define MADS_NEBULAR_SCENES7_H
+
+#include "common/scummsys.h"
+#include "mads/game.h"
+#include "mads/scene.h"
+#include "mads/nebular/nebular_scenes.h"
+
+namespace MADS {
+
+namespace Nebular {
+
+class Scene7xx : public NebularScene {
+protected:
+ /**
+ * Plays an appropriate sound when entering a scene
+ */
+ void setAAName();
+
+ /**
+ * Updates the prefix used for getting player sprites for the scene
+ */
+ void setPlayerSpritesPrefix();
+
+ void sceneEntrySound();
+
+public:
+ Scene7xx(MADSEngine *vm) : NebularScene(vm) {}
+};
+
+class Scene701 : public Scene7xx {
+private:
+ int _fishingLineId;
+
+public:
+ Scene701(MADSEngine *vm);
+ void synchronize(Common::Serializer &s);
+
+ virtual void setup();
+ virtual void enter();
+ virtual void preActions();
+ virtual void actions();
+ virtual void step();
+};
+
+class Scene702 : public Scene7xx {
+public:
+ Scene702(MADSEngine *vm) : Scene7xx(vm) {}
+
+ virtual void setup();
+ virtual void enter();
+ virtual void preActions();
+ virtual void actions();
+};
+
+class Scene703 : public Scene7xx{
+private:
+ int _monsterMode;
+ int _boatFrame;
+ int _curSequence;
+ int _boatDir;
+
+ bool _useBomb;
+ bool _startMonsterTimer;
+ bool _rexDeathFl;
+ bool _restartTrigger70Fl;
+
+ uint32 _lastFrameTime;
+ uint32 _monsterTime;
+
+ Conversation _dialog1;
+
+ void handleBottleInterface();
+ void setBottleSequence();
+ void handleFillBottle(int quote);
+
+public:
+ Scene703(MADSEngine *vm);
+ void synchronize(Common::Serializer &s);
+
+ virtual void setup();
+ virtual void enter();
+ virtual void step();
+ virtual void actions();
+};
+
+class Scene704 : public Scene7xx{
+private:
+ int _bottleHotspotId;
+ int _boatCurrentFrame;
+ int _animationMode;
+ int _boatDirection;
+
+ bool _takeBottleFl;
+
+ Conversation _dialog1;
+
+ void handleFillBottle(int quote);
+ void setBottleSequence();
+ void handleBottleInterface();
+
+public:
+ Scene704(MADSEngine *vm);
+ void synchronize(Common::Serializer &s);
+
+ virtual void setup();
+ virtual void enter();
+ virtual void step();
+ virtual void actions();
+};
+
+class Scene705 : public Scene7xx{
+private:
+ Conversation _dialog1;
+
+ void handleFillBottle(int quote);
+ void setBottleSequence();
+ void handleBottleInterface();
+
+public:
+ Scene705(MADSEngine *vm) : Scene7xx(vm) {}
+ void synchronize(Common::Serializer &s);
+
+ virtual void setup();
+ virtual void enter();
+ virtual void step();
+ virtual void actions();
+};
+
+class Scene706 : public Scene7xx{
+private:
+ int _vaseHotspotId;
+ int _vaseMode;
+ int _animationMode;
+ int _animationFrame;
+
+ bool _emptyPedestral;
+
+ void handleTakeVase();
+ void handleRexDeath();
+
+public:
+ Scene706(MADSEngine *vm);
+ void synchronize(Common::Serializer &s);
+
+ virtual void setup();
+ virtual void enter();
+ virtual void step();
+ virtual void preActions();
+ virtual void actions();
+};
+
+class Scene707 : public SceneTeleporter {
+public:
+ Scene707(MADSEngine *vm) : SceneTeleporter(vm) {}
+
+ virtual void setup();
+ virtual void enter();
+ virtual void step();
+ virtual void actions();
+};
+
+class Scene710 : public Scene7xx {
+public:
+ Scene710(MADSEngine *vm) : Scene7xx(vm) {}
+
+ virtual void setup();
+ virtual void enter();
+ virtual void step();
+ virtual void actions();
+};
+
+class Scene711 : public SceneTeleporter {
+public:
+ Scene711(MADSEngine *vm) : SceneTeleporter(vm) {}
+
+ virtual void setup();
+ virtual void enter();
+ virtual void step();
+ virtual void actions();
+};
+
+class Scene751 : public Scene7xx{
+private:
+ bool _rexHandingLine;
+
+public:
+ Scene751(MADSEngine *vm);
+ void synchronize(Common::Serializer &s);
+
+ virtual void setup();
+ virtual void enter();
+ virtual void step();
+ virtual void preActions();
+ virtual void actions();
+};
+
+class Scene752 : public Scene7xx {
+private:
+ int _cardId;
+
+public:
+ Scene752(MADSEngine *vm);
+ void synchronize(Common::Serializer &s);
+
+ virtual void setup();
+ virtual void enter();
+ virtual void step();
+ virtual void preActions();
+ virtual void actions();
+};
+
+} // End of namespace Nebular
+} // End of namespace MADS
+
+#endif /* MADS_NEBULAR_SCENES7_H */
diff --git a/engines/mads/nebular/nebular_scenes8.cpp b/engines/mads/nebular/nebular_scenes8.cpp
new file mode 100644
index 0000000000..6039135794
--- /dev/null
+++ b/engines/mads/nebular/nebular_scenes8.cpp
@@ -0,0 +1,1618 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+
+ * You should have received a copy of the GNU General Public 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 "mads/mads.h"
+#include "mads/scene.h"
+#include "mads/nebular/nebular_scenes.h"
+#include "mads/nebular/nebular_scenes8.h"
+
+namespace MADS {
+
+namespace Nebular {
+
+void Scene8xx::setPlayerSpritesPrefix() {
+ _vm->_sound->command(5);
+ if ((_globals[kFromCockpit] && !_globals[kExitShip]) ||
+ _scene->_nextSceneId == 804 || _scene->_nextSceneId == 805 ||
+ _scene->_nextSceneId == 808 || _scene->_nextSceneId == 810) {
+ _game._player._spritesPrefix = "";
+ } else
+ _game._player._spritesPrefix = _globals[kSexOfRex] == SEX_FEMALE ? "ROX" : "RXM";
+
+ _vm->_palette->setEntry(16, 0x0A, 0x3F, 0x3F);
+ _vm->_palette->setEntry(17, 0x0A, 0x2D, 0x2D);
+}
+
+void Scene8xx::setAAName() {
+ _game._aaName = Resources::formatAAName(5);
+}
+
+void Scene8xx::sceneEntrySound() {
+ if (!_vm->_musicFlag)
+ _vm->_sound->command(2);
+ else {
+ switch (_scene->_nextSceneId) {
+ case 801:
+ case 802:
+ case 803:
+ case 804:
+ case 806:
+ case 807:
+ case 808:
+ _vm->_sound->command(20);
+ break;
+
+ case 805:
+ _vm->_sound->command(23);
+ break;
+
+ case 810:
+ _vm->_sound->command(10);
+ break;
+
+ default:
+ break;
+ }
+ }
+}
+
+/*------------------------------------------------------------------------*/
+
+Scene801::Scene801(MADSEngine *vm) : Scene8xx(vm) {
+ _walkThroughDoor = false;
+}
+
+void Scene801::synchronize(Common::Serializer &s) {
+ Scene8xx::synchronize(s);
+
+ s.syncAsByte(_walkThroughDoor);
+}
+
+void Scene801::setup() {
+ setPlayerSpritesPrefix();
+ setAAName();
+}
+
+void Scene801::enter() {
+ _globals._spriteIndexes[1] = _scene->_sprites.addSprites(formAnimName('x', 1));
+ _globals._spriteIndexes[2] = _scene->_sprites.addSprites(formAnimName('x', 0));
+ _globals._spriteIndexes[3] = _scene->_sprites.addSprites(formAnimName('x', 2));
+ _globals._spriteIndexes[4] = _scene->_sprites.addSprites(formAnimName('x', 3));
+ _globals._spriteIndexes[5] = _scene->_sprites.addSprites(formAnimName('a', -1));
+
+ if (_scene->_priorSceneId != 802) {
+ _globals._sequenceIndexes[2] = _scene->_sequences.startCycle(_globals._spriteIndexes[2], false, 5);
+ _scene->_sequences.setDepth(_globals._sequenceIndexes[2], 13);
+ }
+
+ if ((_globals[kCameFromCut]) && (_globals[kCutX] != 0)) {
+ _game._player._playerPos = Common::Point(_globals[kCutX], _globals[kCutY]);
+ _game._player._facing = (Facing)_globals[kCutFacing];
+ _globals[kCutX] = 0;
+ _globals[kCameFromCut] = false;
+ _globals[kReturnFromCut] = false;
+ _globals[kBeamIsUp] = false;
+ _globals[kForceBeamDown] = false;
+ _globals[kDontRepeat] = false;
+ } else if (_scene->_priorSceneId == 808) {
+ _game._player._playerPos = Common::Point(148, 110);
+ _game._player._facing = FACING_NORTH;
+ } else if (_scene->_priorSceneId == 802) {
+ _game._player._playerPos = Common::Point(307, 111);
+ _game._player.walk(Common::Point(270, 118), FACING_WEST);
+ _game._player._visible = true;
+ } else if ((_scene->_priorSceneId != -2) && !_globals[kTeleporterCommand]) {
+ _game._player._playerPos = Common::Point(8, 117);
+ _game._player.walk(Common::Point(41, 115), FACING_EAST);
+ _game._player._visible = true;
+ }
+
+ _globals[kBetweenRooms] = false;
+
+ if (_globals[kTeleporterCommand]) {
+ _game._player._stepEnabled = false;
+ switch (_globals[kTeleporterCommand]) {
+ case 1:
+ _game._player._playerPos = Common::Point(8, 117);
+ _globals[kTeleporterUnderstood] = true;
+ _globals._sequenceIndexes[1] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[1], false, 8, 1, 0, 0);
+ _scene->_sequences.setAnimRange(_globals._sequenceIndexes[1], 1, 13);
+ _game._triggerSetupMode = SEQUENCE_TRIGGER_DAEMON;
+ _scene->_sequences.addSubEntry(_globals._sequenceIndexes[1], SEQUENCE_TRIGGER_EXPIRE, 0, 75);
+ _vm->_sound->command(30);
+ break;
+
+ case 2:
+ _game._player._playerPos = Common::Point(8, 117);
+ _globals[kTeleporterUnderstood] = true;
+ _globals._sequenceIndexes[1] = _scene->_sequences.startReverseCycle(_globals._spriteIndexes[1], false, 8, 1, 0, 0);
+ _scene->_sequences.setAnimRange(_globals._sequenceIndexes[1], 1, 13);
+ _game._triggerSetupMode = SEQUENCE_TRIGGER_DAEMON;
+ _scene->_sequences.addSubEntry(_globals._sequenceIndexes[1], SEQUENCE_TRIGGER_EXPIRE, 0, 8090);
+ _vm->_sound->command(30);
+ break;
+
+ case 3:
+ case 4:
+ _game._player._playerPos = Common::Point(8, 117);
+ _game._player.walk(Common::Point(41, 115), FACING_EAST);
+ _game._player._visible = true;
+ _game._player._stepEnabled = true;
+ break;
+
+ default:
+ break;
+ }
+ _globals[kTeleporterCommand] = 0;
+ }
+
+ _walkThroughDoor = false;
+ if (_scene->_priorSceneId == 802) {
+ _game._player._stepEnabled = false;
+ _walkThroughDoor = true;
+ }
+
+ _globals._sequenceIndexes[3] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[3], false, 11, 0, 0, 0);
+ _scene->_sequences.setAnimRange(_globals._sequenceIndexes[3], -1, -2);
+ _scene->_sequences.setDepth(_globals._sequenceIndexes[3], 14);
+
+ _globals._sequenceIndexes[4] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[4], false, 9, 0, 0, 0);
+ _scene->_sequences.setAnimRange(_globals._sequenceIndexes[4], -1, -2);
+ _scene->_sequences.setDepth(_globals._sequenceIndexes[4], 14);
+
+ sceneEntrySound();
+}
+
+void Scene801::step() {
+ if (_game._trigger == 75) {
+ if (_globals[kSexOfRex] == REX_FEMALE) {
+ _globals._sequenceIndexes[5] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[5], false, 8, 1, 0, 0);
+ _scene->_sequences.setAnimRange(_globals._sequenceIndexes[5], 1, 8);
+ _scene->_sequences.addSubEntry(_globals._sequenceIndexes[5], SEQUENCE_TRIGGER_EXPIRE, 0, 140);
+ } else {
+ _game._player._stepEnabled = true;
+ _game._player._visible = true;
+ _game._player._playerPos = Common::Point(8, 117);
+ _game._player.walk(Common::Point(41, 115), FACING_EAST);
+ }
+ }
+
+ if (_game._trigger == 140) {
+ _vm->_sound->command(27);
+ _globals._sequenceIndexes[5] = _scene->_sequences.startCycle(_globals._spriteIndexes[5], false, 8);
+ _scene->_sequences.addTimer(100, 141);
+ }
+
+ if (_game._trigger == 141) {
+ _scene->_reloadSceneFlag = true;
+ _scene->_nextSceneId = _scene->_priorSceneId;
+ _globals[kTeleporterCommand] = 0;
+ }
+
+ if (_game._trigger == 80) {
+ _globals[kTeleporterCommand] = 1;
+ _scene->_nextSceneId = _globals[kTeleporterDestination];
+ _scene->_reloadSceneFlag = true;
+ }
+
+ if (_walkThroughDoor && (_game._player._playerPos == Common::Point(270, 118))) {
+ _game._player._stepEnabled = false;
+ _globals._sequenceIndexes[2] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[2], false, 4, 1, 0, 0);
+ _scene->_sequences.setAnimRange(_globals._sequenceIndexes[2], 1, 5);
+ _scene->_sequences.setDepth(_globals._sequenceIndexes[2], 10);
+ _walkThroughDoor = false;
+ _scene->_sequences.addSubEntry(_globals._sequenceIndexes[2], SEQUENCE_TRIGGER_EXPIRE, 0, 120);
+ }
+
+ if (_game._trigger == 120) {
+ _vm->_sound->command(12);
+ _globals._sequenceIndexes[2] = _scene->_sequences.startCycle(_globals._spriteIndexes[2], false, 5);
+ _scene->_sequences.setDepth(_globals._sequenceIndexes[2], 10);
+ _game._player._stepEnabled = true;
+ }
+
+ if (_game._trigger == 90) {
+ _game._player.walk(Common::Point(307, 111), FACING_EAST);
+ _scene->_sequences.addTimer(80, 130);
+ }
+
+ if (_game._trigger == 130) {
+ _vm->_sound->command(12);
+ _scene->_sequences.remove(_globals._sequenceIndexes[2]);
+ _globals._sequenceIndexes[2] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[2], false, 4, 1, 0, 0);
+ _scene->_sequences.setAnimRange(_globals._sequenceIndexes[2], 1, 5);
+ _scene->_sequences.setDepth(_globals._sequenceIndexes[2], 10);
+ _scene->_sequences.addSubEntry(_globals._sequenceIndexes[2], SEQUENCE_TRIGGER_EXPIRE, 0, 110);
+ }
+
+ if (_game._trigger == 110) {
+ _globals._sequenceIndexes[2] = _scene->_sequences.startCycle(_globals._spriteIndexes[2], false, 5);
+ _scene->_sequences.setDepth(_globals._sequenceIndexes[2], 10);
+ _scene->_nextSceneId = 802;
+ }
+}
+
+void Scene801::preActions() {
+ if (_action.isAction(VERB_LOOK, NOUN_CONTROL_PANEL)) {
+ _game._player.walk(Common::Point(148, 110), FACING_NORTH);
+ _game._player._needToWalk = true;
+ _game._player._readyToWalk = true;
+ }
+
+ if (_action.isAction(VERB_WALK_INSIDE, NOUN_TELEPORTER) && _globals[kBeamIsUp]) {
+ _globals[kCutX] = _game._player._playerPos.x;
+ _globals[kCutY] = _game._player._playerPos.y;
+ _globals[kCutFacing] = _game._player._facing;
+ _globals[kForceBeamDown] = true;
+ _globals[kDontRepeat] = true;
+ _scene->_nextSceneId = 803;
+ }
+}
+
+void Scene801::actions() {
+ if (_action.isAction(VERB_LOOK, NOUN_CONTROL_PANEL))
+ _scene->_nextSceneId = 808;
+ else if (_action.isAction(VERB_WALK_INSIDE, NOUN_TELEPORTER)) {
+ _game._player._stepEnabled = false;
+ _game._player._visible = false;
+ _scene->_nextSceneId = 807;
+ } else if (_action.isAction(VERB_WALK_THROUGH, NOUN_DOOR) && (_game._player._playerPos == Common::Point(270, 118))) {
+ _game._player._stepEnabled = false;
+ _game._player._facing = FACING_EAST;
+ _game._player.selectSeries();
+ _globals[kBetweenRooms] = true;
+ _game._triggerSetupMode = SEQUENCE_TRIGGER_DAEMON;
+ _scene->_sequences.remove(_globals._sequenceIndexes[2]);
+ _globals._sequenceIndexes[2] = _scene->_sequences.startReverseCycle(_globals._spriteIndexes[2], false, 4, 1, 0, 0);
+ _scene->_sequences.addSubEntry(_globals._sequenceIndexes[2], SEQUENCE_TRIGGER_EXPIRE, 0, 90);
+ _scene->_sequences.setAnimRange(_globals._sequenceIndexes[2], 1, 5);
+ _scene->_sequences.setDepth(_globals._sequenceIndexes[2], 13);
+ _vm->_sound->command(11);
+ } else if (_action.isAction(VERB_LOOK, NOUN_CEILING))
+ _vm->_dialogs->show(80110);
+ else if (_action.isAction(VERB_LOOK, NOUN_MONITOR))
+ _vm->_dialogs->show(80111);
+ else if (_action.isAction(VERB_LOOK, NOUN_TELEPORTER))
+ _vm->_dialogs->show(80112);
+ else if (_action.isAction(VERB_LOOK, NOUN_EQUIPMENT) || _action._lookFlag)
+ _vm->_dialogs->show(80113);
+ else if (_action.isAction(VERB_LOOK, NOUN_SPEAKER))
+ _vm->_dialogs->show(80114);
+ else if (_action.isAction(VERB_LOOK, NOUN_EYE_CHART))
+ _vm->_dialogs->show(80115);
+ else if (_action.isAction(VERB_LOOK, NOUN_WALL))
+ _vm->_dialogs->show(80116);
+ else if (_action.isAction(VERB_LOOK, NOUN_DOOR))
+ _vm->_dialogs->show(80117);
+ else
+ return;
+
+ _action._inProgress = false;
+}
+
+/*------------------------------------------------------------------------*/
+
+void Scene802::setup() {
+ setPlayerSpritesPrefix();
+ setAAName();
+ _scene->addActiveVocab(NOUN_SHIELD_MODULATOR);
+ _scene->addActiveVocab(VERB_WALKTO);
+ _scene->addActiveVocab(NOUN_REMOTE);
+}
+
+void Scene802::enter() {
+ _globals._spriteIndexes[2] = _scene->_sprites.addSprites("*RXMRC_8");
+ _globals._spriteIndexes[1] = _scene->_sprites.addSprites(formAnimName('f', 2));
+ _globals._spriteIndexes[3] = _scene->_sprites.addSprites(formAnimName('f', 0));
+ _globals._spriteIndexes[4] = _scene->_sprites.addSprites(formAnimName('f', 1));
+ _globals._spriteIndexes[5] = _scene->_sprites.addSprites("*RXMBD_8");
+ _globals[kBetweenRooms] = false;
+
+ if ((_globals[kCameFromCut]) && (_globals[kCutX] != 0)) {
+ _game._player._playerPos.x = _globals[kCutX];
+ _game._player._playerPos.y = _globals[kCutY];
+ _game._player._facing = (Facing)_globals[kCutFacing];
+ _globals[kCutX] = 0;
+ _globals[kCameFromCut] = false;
+ _globals[kReturnFromCut] = false;
+ _globals[kBeamIsUp] = false;
+ _globals[kForceBeamDown] = false;
+ _globals[kDontRepeat] = false;
+ _globals[kAntigravClock] = _scene->_frameStartTime;
+ } else if (_scene->_priorSceneId == 801) {
+ _game._player._playerPos = Common::Point(15, 129);
+ _game._player._facing = FACING_EAST;
+ } else if (_scene->_priorSceneId == 803) {
+ _game._player._playerPos = Common::Point(303, 119);
+ _game._player._facing = FACING_WEST;
+
+ } else if (_scene->_priorSceneId != -2) {
+ _game._player._playerPos = Common::Point(15, 129);
+ _game._player._facing = FACING_EAST;
+ }
+
+ _game._player._visible = true;
+
+
+
+ if (_globals[kHasWatchedAntigrav] && !_globals[kRemoteSequenceRan]) {
+ _game._triggerSetupMode = SEQUENCE_TRIGGER_DAEMON;
+ _scene->_sequences.addTimer(200, 70);
+ }
+
+ if ((_globals[kRemoteOnGround]) && (!_game._objects.isInInventory(OBJ_REMOTE))) {
+ _globals._sequenceIndexes[4] = _scene->_sequences.startCycle(_globals._spriteIndexes[4], false, 1);
+ _scene->_sequences.setDepth(_globals._sequenceIndexes[4], 8);
+ int idx = _scene->_dynamicHotspots.add(NOUN_REMOTE, VERB_WALKTO,_globals._sequenceIndexes[4], Common::Rect(0, 0, 0, 0));
+ _scene->_dynamicHotspots.setPosition(idx, Common::Point(107, 99), FACING_NORTH);
+ }
+
+ if (!_game._objects.isInInventory(OBJ_SHIELD_MODULATOR) && !_globals[kShieldModInstalled]) {
+ _globals._sequenceIndexes[1] = _scene->_sequences.startCycle(_globals._spriteIndexes[1], false, 1);
+ _scene->_sequences.setDepth(_globals._sequenceIndexes[1], 8);
+ int idx = _scene->_dynamicHotspots.add(NOUN_SHIELD_MODULATOR, VERB_WALKTO, _globals._sequenceIndexes[1], Common::Rect(0, 0, 0, 0));
+ _scene->_dynamicHotspots.setPosition(idx, Common::Point(93, 97), FACING_NORTH);
+ }
+ sceneEntrySound();
+}
+
+void Scene802::step() {
+ if (_game._trigger == 70) {
+ _game._player._stepEnabled = false;
+ _globals._sequenceIndexes[3] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[3], false, 8, 1, 0, 0);
+ _scene->_sequences.setAnimRange(_globals._sequenceIndexes[3], 1, 19);
+ _scene->_sequences.addSubEntry(_globals._sequenceIndexes[3], SEQUENCE_TRIGGER_EXPIRE, 0, 71);
+ _scene->_sequences.addSubEntry(_globals._sequenceIndexes[3], SEQUENCE_TRIGGER_SPRITE, 4, 72);
+ }
+
+ if (_game._trigger == 71) {
+ _globals._sequenceIndexes[4] = _scene->_sequences.startCycle(_globals._spriteIndexes[4], false, 1);
+ _scene->_sequences.setDepth(_globals._sequenceIndexes[4], 8);
+ int idx = _scene->_dynamicHotspots.add(NOUN_REMOTE, VERB_WALKTO, _globals._sequenceIndexes[4], Common::Rect(0, 0, 0, 0));
+ _scene->_dynamicHotspots.setPosition(idx, Common::Point(107, 99), FACING_NORTH);
+
+ _globals[kRemoteSequenceRan] = true;
+ _globals[kRemoteOnGround] = true;
+ _game._player._stepEnabled = true;
+ }
+
+ if (_game._trigger == 72)
+ _vm->_sound->command(13);
+}
+
+void Scene802::preActions() {
+ if (_action.isAction(VERB_WALK_TOWARDS, NOUN_BUILDING_TO_WEST))
+ _game._player._walkOffScreenSceneId = 801;
+
+ if (_action.isAction(VERB_WALK_DOWN, NOUN_PATH_TO_EAST)) {
+ _game._player._walkOffScreenSceneId = 803;
+ _globals[kForceBeamDown] = false;
+ }
+
+ if (_action.isAction(VERB_TAKE, NOUN_SHIP))
+ _game._player._needToWalk = false;
+}
+
+void Scene802::actions() {
+ if (_action.isAction(VERB_TAKE, NOUN_SHIELD_MODULATOR) && !_game._objects.isInInventory(OBJ_SHIELD_MODULATOR)) {
+ switch (_game._trigger) {
+ case 0:
+ _game._player._stepEnabled = false;
+ _game._player._visible = false;
+ _globals._sequenceIndexes[2] = _scene->_sequences.startReverseCycle(_globals._spriteIndexes[2], true, 7, 2, 0, 0);
+ _scene->_sequences.setAnimRange(_globals._sequenceIndexes[2], 1, 2);
+ _scene->_sequences.setMsgLayout(_globals._sequenceIndexes[2]);
+ _scene->_sequences.addSubEntry(_globals._sequenceIndexes[2], SEQUENCE_TRIGGER_SPRITE, 2, 1);
+ _scene->_sequences.addSubEntry(_globals._sequenceIndexes[2], SEQUENCE_TRIGGER_EXPIRE, 0, 2);
+ break;
+
+ case 1:
+ _scene->_sequences.remove(_globals._sequenceIndexes[1]);
+ _vm->_sound->command(9);
+ break;
+
+ case 2:
+ _game._player._priorTimer = _scene->_frameStartTime + _game._player._ticksAmount;
+ _game._player._visible = true;
+ _scene->_sequences.addTimer(20, 3);
+ break;
+
+ case 3:
+ _game._player._stepEnabled = true;
+ _game._objects.addToInventory(OBJ_SHIELD_MODULATOR);
+ _vm->_dialogs->showItem(OBJ_SHIELD_MODULATOR, 80215);
+ break;
+
+ default:
+ break;
+ }
+ } else if ((_action.isAction(VERB_TAKE, NOUN_REMOTE)) && (!_game._objects.isInInventory(OBJ_REMOTE))) {
+ switch (_game._trigger) {
+ case 0:
+ _game._player._stepEnabled = false;
+ _game._player._visible = false;
+ _globals._sequenceIndexes[5] = _scene->_sequences.startReverseCycle(_globals._spriteIndexes[5], true, 7, 2, 0, 0);
+ _scene->_sequences.setAnimRange(_globals._sequenceIndexes[5], 1, 4);
+ _scene->_sequences.setMsgLayout(_globals._sequenceIndexes[5]);
+ _scene->_sequences.addSubEntry(_globals._sequenceIndexes[5], SEQUENCE_TRIGGER_SPRITE, 4, 1);
+ _scene->_sequences.addSubEntry(_globals._sequenceIndexes[5], SEQUENCE_TRIGGER_EXPIRE, 0, 2);
+ break;
+
+ case 1:
+ _scene->_sequences.remove(_globals._sequenceIndexes[4]);
+ _vm->_sound->command(9);
+ _globals[kRemoteOnGround] = false;
+ break;
+
+ case 2:
+ _game._player._priorTimer = _scene->_frameStartTime + _game._player._ticksAmount;
+ _game._player._visible = true;
+ _scene->_sequences.addTimer(20, 3);
+ break;
+
+ case 3:
+ _game._player._stepEnabled = true;
+ _game._objects.addToInventory(OBJ_REMOTE);
+ _vm->_dialogs->showItem(OBJ_REMOTE, 80223);
+ break;
+
+ default:
+ break;
+ }
+ } else if (!_globals[kRemoteOnGround] && (_game._objects.isInInventory(OBJ_SHIELD_MODULATOR) || _globals[kShieldModInstalled])
+ && (_action.isAction(VERB_LOOK, NOUN_LAUNCH_PAD) || _action._lookFlag))
+ _vm->_dialogs->show(80210);
+ else if (!_globals[kRemoteOnGround]&& !_game._objects.isInInventory(OBJ_SHIELD_MODULATOR) && !_globals[kShieldModInstalled]
+ && (_action.isAction(VERB_LOOK, NOUN_LAUNCH_PAD) || _action._lookFlag))
+ _vm->_dialogs->show(80211);
+ else if (_globals[kRemoteOnGround] && !_game._objects.isInInventory(OBJ_SHIELD_MODULATOR) && !_globals[kShieldModInstalled]
+ && (_action.isAction(VERB_LOOK, NOUN_LAUNCH_PAD) || _action._lookFlag))
+ _vm->_dialogs->show(80213);
+ else if (_globals[kRemoteOnGround] && (_game._objects.isInInventory(OBJ_SHIELD_MODULATOR) || _globals[kShieldModInstalled])
+ && (_action.isAction(VERB_LOOK, NOUN_LAUNCH_PAD) || _action._lookFlag))
+ _vm->_dialogs->show(80212);
+ else if (!_game._objects.isInInventory(OBJ_SHIELD_MODULATOR) && !_globals[kShieldModInstalled] && _action.isAction(VERB_LOOK, NOUN_SHIELD_MODULATOR))
+ _vm->_dialogs->show(80214);
+ else if (_globals[kRemoteOnGround] && _action.isAction(VERB_LOOK, NOUN_REMOTE))
+ _vm->_dialogs->show(80216);
+ else if (_action.isAction(VERB_LOOK, NOUN_SHIP)) {
+ if ((!_game._objects.isInInventory(OBJ_SHIELD_MODULATOR)) && (!_globals[kShieldModInstalled]))
+ _vm->_dialogs->show(80218);
+ else
+ _vm->_dialogs->show(80217);
+ } else if (_action.isAction(VERB_LOOK, NOUN_BUSHES))
+ _vm->_dialogs->show(80219);
+ else if (_action.isAction(VERB_LOOK, NOUN_PATH_TO_EAST))
+ _vm->_dialogs->show(80220);
+ else if (_action.isAction(VERB_LOOK, NOUN_SKY))
+ _vm->_dialogs->show(80221);
+ else if (_action.isAction(VERB_TAKE, NOUN_SHIP))
+ _vm->_dialogs->show(80222);
+ else if (_action.isAction(VERB_LOOK, NOUN_TREE) || _action.isAction(VERB_LOOK, NOUN_TREES))
+ _vm->_dialogs->show(80224);
+ else if (_action.isAction(VERB_LOOK, NOUN_BUILDING_TO_WEST))
+ _vm->_dialogs->show(80225);
+ else
+ return;
+
+ _action._inProgress = false;
+}
+
+/*------------------------------------------------------------------------*/
+
+void Scene803::setup() {
+ setPlayerSpritesPrefix();
+ setAAName();
+ _scene->addActiveVocab(NOUN_GUTS);
+ _scene->addActiveVocab(VERB_WALKTO);
+
+ if ((!_globals[kFromCockpit] && _globals[kReturnFromCut] && !_globals[kBeamIsUp])
+ || (_globals[kFromCockpit] && !_globals[kExitShip])) {
+ _game._player._spritesPrefix = "";
+ _game._player._spritesChanged = true;
+ }
+}
+
+void Scene803::enter() {
+ _globals[kBetweenRooms] = false;
+ _game._player._visible = false;
+ _globals._spriteIndexes[1] = _scene->_sprites.addSprites(formAnimName('f', 1));
+ _globals._spriteIndexes[9] = _scene->_sprites.addSprites("*RXMBD_2");
+ _globals._spriteIndexes[6] = _scene->_sprites.addSprites(formAnimName('d', 1));
+
+ _game.loadQuoteSet(0x31B, 0x31C, 0x31D, 0x31E, 0x31F, 0x320, 0x321, 0x322, 0);
+
+ if (_globals[kHoppyDead]) {
+ _globals._spriteIndexes[7] = _scene->_sprites.addSprites(formAnimName('e', 1));
+ _globals._sequenceIndexes[7] = _scene->_sequences.startCycle(_globals._spriteIndexes[7], false, 1);
+ int idx = _scene->_dynamicHotspots.add(NOUN_GUTS, VERB_WALKTO, _globals._sequenceIndexes[7], Common::Rect(0, 0, 0, 0));
+ _scene->_dynamicHotspots.setPosition(idx, Common::Point(66, 123), FACING_SOUTH);
+ }
+
+ if (!_globals[kBeamIsUp] && !_globals[kReturnFromCut] && (!_globals[kFromCockpit] || _globals[kExitShip])) {
+ _globals._sequenceIndexes[1] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[1], false, 8, 1, 0, 0);
+ _scene->_sequences.setAnimRange(_globals._sequenceIndexes[1], 2, 2);
+ _scene->_sequences.setDepth(_globals._sequenceIndexes[1], 1);
+ }
+
+ if (!_globals[kFromCockpit]) {
+ if (!_globals[kReturnFromCut]) {
+ if (_scene->_priorSceneId != -2) {
+ _game._player._playerPos = Common::Point(15, 130);
+ _game._player._facing = FACING_EAST;
+ }
+ _game._player._visible = true;
+ } else if (!_globals[kBeamIsUp]){
+ _globals._spriteIndexes[3] = _scene->_sprites.addSprites(formAnimName('a', 1));
+ _globals._spriteIndexes[2] = _scene->_sprites.addSprites(formAnimName('a', 3));
+ _globals._spriteIndexes[4] = _scene->_sprites.addSprites(formAnimName('a', 2));
+ _game._player._visible = false;
+ _game._player._stepEnabled = false;
+ _globals._sequenceIndexes[3] = _scene->_sequences.startCycle(_globals._spriteIndexes[3], false, 1);
+ _scene->_sequences.setDepth(_globals._sequenceIndexes[3], 15);
+ _globals._sequenceIndexes[3] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[3], false, 8, 1, 0, 0);
+ _scene->_sequences.setDepth(_globals._sequenceIndexes[3], 1);
+ _scene->_sequences.addSubEntry(_globals._sequenceIndexes[3], SEQUENCE_TRIGGER_EXPIRE, 0, 80);
+ _vm->_sound->command(14);
+ }
+
+ if (_globals[kBeamIsUp] && !_globals[kReturnFromCut]){
+ if (_globals[kForceBeamDown])
+ _game._player._visible = false;
+ else
+ _game._player._visible = true;
+
+ _globals._spriteIndexes[5] = _scene->_sprites.addSprites(formAnimName('b', 1));
+ _vm->_sound->command(15);
+ _game._player._stepEnabled = false;
+ _globals._sequenceIndexes[5] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[5], false, 12, 1, 0, 0);
+ _scene->_sequences.setAnimRange(_globals._sequenceIndexes[5], 1, 6);
+ _scene->_sequences.setDepth(_globals._sequenceIndexes[5], 1);
+ _scene->_sequences.addSubEntry(_globals._sequenceIndexes[5], SEQUENCE_TRIGGER_EXPIRE, 0, 100);
+ }
+ } else if (!_globals[kExitShip]) {
+ if (!_globals[kBeamIsUp]) {
+ _globals._spriteIndexes[3] = _scene->_sprites.addSprites(formAnimName('a', 1));
+ _game._player._visible = false;
+ _game._player._stepEnabled = false;
+ _globals._sequenceIndexes[3] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[3], false, 8, 1, 0, 0);
+ _scene->_sequences.setDepth(_globals._sequenceIndexes[3], 1);
+ _scene->_sequences.addSubEntry(_globals._sequenceIndexes[3], SEQUENCE_TRIGGER_EXPIRE, 0, 130);
+ _vm->_sound->command(14);
+ } else {
+ _globals._spriteIndexes[8] = _scene->_sprites.addSprites(formAnimName('c', 1));
+ _game._player._visible = false;
+ _game._player._stepEnabled = false;
+ _globals._sequenceIndexes[8] = _scene->_sequences.startCycle(_globals._spriteIndexes[8], false, 1);
+ _globals._sequenceIndexes[8] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[8], false, 8, 1, 0, 0);
+ _scene->_sequences.setDepth(_globals._sequenceIndexes[8], 1);
+ _scene->_sequences.addSubEntry(_globals._sequenceIndexes[8], SEQUENCE_TRIGGER_EXPIRE, 0, 140);
+ }
+ } else {
+ _game._player._stepEnabled = false;
+ _game._player._playerPos = Common::Point(197, 96);
+ _game._player._facing = FACING_SOUTHWEST;
+ _game._player._visible = true;
+ _globals._spriteIndexes[6] = _scene->_sprites.addSprites(formAnimName('d', 1));
+ _globals._sequenceIndexes[6] = _scene->_sequences.startCycle(_globals._spriteIndexes[6], false, 19);
+ _scene->_sequences.addTimer(1, 150);
+ }
+
+ sceneEntrySound();
+}
+
+void Scene803::step() {
+ if (_game._trigger == 120) {
+ _globals._sequenceIndexes[6] = _scene->_sequences.startCycle(_globals._spriteIndexes[6], false, 19);
+ _scene->_nextSceneId = 804;
+ }
+
+ if (_game._trigger == 100) {
+ _globals._sequenceIndexes[1] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[1], false, 8, 1, 0, 0);
+ _scene->_sequences.setAnimRange(_globals._sequenceIndexes[1], 2, 2);
+ _scene->_sequences.setDepth(_globals._sequenceIndexes[1], 1);
+ if (!_globals[kHoppyDead]) {
+ _globals._sequenceIndexes[5] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[5], false, 7, 1, 0, 0);
+ _scene->_sequences.setAnimRange(_globals._sequenceIndexes[5], 7, 12);
+ _scene->_sequences.addSubEntry(_globals._sequenceIndexes[5],SEQUENCE_TRIGGER_EXPIRE, 0, 101);
+ } else {
+ _globals._sequenceIndexes[5] = _scene->_sequences.startCycle(_globals._spriteIndexes[5], false, -2);
+ int idx = _scene->_dynamicHotspots.add(NOUN_GUTS, VERB_WALKTO, _globals._sequenceIndexes[5], Common::Rect(0, 0, 0, 0));
+ _scene->_dynamicHotspots.setPosition(idx, Common::Point(66, 123), FACING_SOUTH);
+ _vm->_sound->command(16);
+ _globals[kCameFromCut] = true;
+ _globals[kBeamIsUp] = false;
+ _globals[kReturnFromCut] = false;
+ _globals[kDontRepeat] = false;
+ _globals[kHoppyDead] = true;
+ _globals[kHasWatchedAntigrav] = true;
+
+ if (_globals[kForceBeamDown])
+ _scene->_nextSceneId = _scene->_priorSceneId;
+ else
+ _game._player._stepEnabled = true;
+ }
+ }
+
+ if (_game._trigger == 101) {
+ _globals._sequenceIndexes[5] = _scene->_sequences.startCycle(_globals._spriteIndexes[5], false, -2);
+ int idx = _scene->_dynamicHotspots.add(NOUN_GUTS, VERB_WALKTO, _globals._sequenceIndexes[5], Common::Rect(0, 0, 0, 0));
+ _scene->_dynamicHotspots.setPosition(idx, Common::Point(66, 123), FACING_SOUTH);
+ _vm->_sound->command(16);
+ _globals[kCameFromCut] = true;
+ _globals[kBeamIsUp] = false;
+ _globals[kReturnFromCut] = false;
+ _globals[kDontRepeat] = false;
+ _globals[kHoppyDead] = true;
+ _globals[kHasWatchedAntigrav] = true;
+
+ if (_globals[kForceBeamDown])
+ _scene->_nextSceneId = _scene->_priorSceneId;
+ else
+ _game._player._stepEnabled = true;
+ }
+
+ if (_game._trigger == 80) {
+ if (!_globals[kHoppyDead])
+ _scene->_sequences.addTimer(350, 70);
+
+ _globals._sequenceIndexes[4] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[4], false, 12, 1, 0, 0);
+ _scene->_sequences.setAnimRange(_globals._sequenceIndexes[4], 1, 3);
+ _scene->_sequences.addSubEntry(_globals._sequenceIndexes[4], SEQUENCE_TRIGGER_EXPIRE, 0, 90);
+ }
+
+ if (_game._trigger == 70) {
+ _globals._sequenceIndexes[2] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[2], false, 8, 1, 0, 0);
+ _scene->_sequences.addSubEntry(_globals._sequenceIndexes[2], SEQUENCE_TRIGGER_EXPIRE, 0, 71);
+ _vm->_sound->command(31);
+ }
+
+ if (_game._trigger == 71)
+ _scene->_sequences.addTimer(200, 110);
+
+ if (_game._trigger == 90) {
+ int syncIdx = _globals._sequenceIndexes[4];
+ _globals._sequenceIndexes[4] = _scene->_sequences.startReverseCycle(_globals._spriteIndexes[4], false, 15, 0, 0, 0);
+ _scene->_sequences.updateTimeout(_globals._sequenceIndexes[4], syncIdx);
+ _scene->_sequences.setAnimRange(_globals._sequenceIndexes[4], 4, 9);
+ if (_globals[kHoppyDead])
+ _scene->_sequences.addTimer(200, 110);
+ }
+
+ if (_game._trigger == 110)
+ _scene->_nextSceneId = 808;
+
+ if (_game._trigger == 130) {
+ _globals[kBeamIsUp] = true;
+ _scene->_nextSceneId = 804;
+ }
+
+ if (_game._trigger == 140) {
+ if (!_globals[kWindowFixed]) {
+ _scene->_nextSceneId = 810;
+ _globals[kInSpace] = true;
+ } else {
+ if (!_globals[kShieldModInstalled])
+ _game._winStatus = 1;
+ else if (!_globals[kTargetModInstalled])
+ _game._winStatus = 2;
+ else
+ _game._winStatus = 3;
+
+ _vm->quitGame();
+ }
+ }
+
+ if (_game._trigger == 150) {
+ _scene->_sequences.remove(_globals._sequenceIndexes[6]);
+ _vm->_sound->command(18);
+ _globals._sequenceIndexes[6] = _scene->_sequences.startReverseCycle(_globals._spriteIndexes[6], false, 8, 1, 0, 0);
+ _scene->_sequences.setAnimRange(_globals._sequenceIndexes[6], 1, 19);
+ _scene->_sequences.setDepth(_globals._sequenceIndexes[6], 4);
+ _scene->_sequences.addSubEntry(_globals._sequenceIndexes[6], SEQUENCE_TRIGGER_EXPIRE, 0, 151);
+ }
+
+ if (_game._trigger == 151) {
+ _globals[kBeamIsUp] = false;
+ _globals[kFromCockpit] = false;
+ _globals[kExitShip] = false;
+ _game._player._stepEnabled = true;
+ }
+}
+
+void Scene803::preActions() {
+ if (_action.isAction(VERB_WALK_DOWN, NOUN_PATH_TO_WEST))
+ _game._player._walkOffScreenSceneId = 802;
+
+ if (_action.isAction(VERB_TAKE, NOUN_SHIP))
+ _game._player._needToWalk = false;
+}
+
+void Scene803::actions() {
+ if (_action.isAction(VERB_TAKE, NOUN_GUTS)) {
+ switch (_game._trigger) {
+ case 0:
+ _game._player._stepEnabled = false;
+ _game._player._visible = false;
+ _globals._sequenceIndexes[9] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[9], true, 6, 1, 0, 0);
+ _scene->_sequences.setAnimRange(_globals._sequenceIndexes[9], 1, 4);
+ _scene->_sequences.setMsgLayout(_globals._sequenceIndexes[9]);
+ _scene->_sequences.addSubEntry(_globals._sequenceIndexes[9], SEQUENCE_TRIGGER_EXPIRE, 0, 160);
+ break;
+
+ case 160: {
+ int syncIdx = _globals._sequenceIndexes[9];
+ _globals._sequenceIndexes[9] = _scene->_sequences.startCycle(_globals._spriteIndexes[9], false, 4);
+ _scene->_sequences.updateTimeout(_globals._sequenceIndexes[9], syncIdx);
+ _scene->_sequences.setMsgLayout(_globals._sequenceIndexes[9]);
+ _scene->_sequences.addTimer(60, 161);
+ }
+ break;
+
+ case 161: {
+ int quoteId = 0x31A + _vm->getRandomNumber(1, 8);
+ _scene->_kernelMessages.add(Common::Point(64, 67), 0x1110, 32, 0, 80, _game.getQuote(quoteId));
+ _scene->_sequences.addTimer(60, 162);
+ }
+ break;
+
+ case 162:
+ _scene->_sequences.remove(_globals._sequenceIndexes[9]);
+ _globals._sequenceIndexes[9] = _scene->_sequences.startReverseCycle(_globals._spriteIndexes[9], true, 6, 1, 0, 0);
+ _scene->_sequences.setAnimRange(_globals._sequenceIndexes[9], 1, 4);
+ _scene->_sequences.setMsgLayout(_globals._sequenceIndexes[9]);
+ _scene->_sequences.addSubEntry(_globals._sequenceIndexes[9], SEQUENCE_TRIGGER_EXPIRE, 0, 163);
+ break;
+
+ case 163:
+ _game._player._priorTimer = _scene->_frameStartTime + _game._player._ticksAmount;
+ _game._player._visible = true;
+ _game._player._stepEnabled = true;
+ break;
+
+ default:
+ break;
+ }
+ } else if (_action.isAction(VERB_ENTER, NOUN_SHIP)) {
+ _vm->_sound->command(17);
+ _game._player._stepEnabled = false;
+ _game._triggerSetupMode = SEQUENCE_TRIGGER_DAEMON;
+ _globals._sequenceIndexes[6] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[6], false, 8, 1, 0, 0);
+ _scene->_sequences.setAnimRange(_globals._sequenceIndexes[6], 1, 19);
+ _scene->_sequences.setDepth(_globals._sequenceIndexes[6], 4);
+ _scene->_sequences.addSubEntry(_globals._sequenceIndexes[6], SEQUENCE_TRIGGER_EXPIRE, 0, 120);
+ _globals[kBeamIsUp] = false;
+ } else if (_action.isAction(VERB_LOOK, NOUN_LAUNCH_PAD))
+ _vm->_dialogs->show(80310);
+ else if (_action._lookFlag)
+ _vm->_dialogs->show(80310);
+ else if (_action.isAction(VERB_LOOK, NOUN_PAD_TO_WEST))
+ _vm->_dialogs->show(80311);
+ else if (_action.isAction(VERB_LOOK, NOUN_GUTS)) {
+ if (_game._storyMode == STORYMODE_NICE)
+ _vm->_dialogs->show(80312);
+ else
+ _vm->_dialogs->show(80313);
+ } else if (_action.isAction(VERB_LOOK, NOUN_BUSHES))
+ _vm->_dialogs->show(80315);
+ else if (_action.isAction(VERB_LOOK, NOUN_SHIP))
+ _vm->_dialogs->show(80317);
+ else if (_action.isAction(VERB_LOOK, NOUN_TOWER))
+ _vm->_dialogs->show(80318);
+ else if (_action.isAction(VERB_LOOK, NOUN_TREE) || _action.isAction(VERB_LOOK, NOUN_TREES))
+ _vm->_dialogs->show(80319);
+ else if (_action.isAction(VERB_LOOK, NOUN_SKY))
+ _vm->_dialogs->show(80320);
+ else if (_action.isAction(VERB_TAKE, NOUN_SHIP))
+ _vm->_dialogs->show(80321);
+ else
+ return;
+
+ _action._inProgress = false;
+}
+
+/*------------------------------------------------------------------------*/
+
+Scene804::Scene804(MADSEngine *vm) : Scene8xx(vm) {
+ _messWithThrottle = false;
+ _movingThrottle = false;
+ _throttleGone = false;
+ _dontPullThrottleAgain = false;
+ _pullThrottleReally = false;
+ _alreadyOrgan = false;
+ _alreadyPop = false;
+
+ _throttleCounter = 0;
+ _resetFrame = -1;
+}
+
+void Scene804::synchronize(Common::Serializer &s) {
+ Scene8xx::synchronize(s);
+
+ s.syncAsByte(_messWithThrottle);
+ s.syncAsByte(_movingThrottle);
+ s.syncAsByte(_throttleGone);
+ s.syncAsByte(_dontPullThrottleAgain);
+ s.syncAsByte(_pullThrottleReally);
+ s.syncAsByte(_alreadyOrgan);
+ s.syncAsByte(_alreadyPop);
+
+ s.syncAsSint16LE(_resetFrame);
+ s.syncAsUint32LE(_throttleCounter);
+}
+
+void Scene804::setup() {
+ Scene8xx::setPlayerSpritesPrefix();
+ Scene8xx::setAAName();
+}
+
+void Scene804::enter() {
+ _messWithThrottle = false;
+ _throttleCounter = 0;
+ _movingThrottle = false;
+ _throttleGone = false;
+ _dontPullThrottleAgain = false;
+ _resetFrame = -1;
+ _pullThrottleReally = false;
+ _alreadyOrgan = false;
+ _alreadyPop = false;
+
+
+ if (_globals[kCopyProtectFailed]) {
+ // Copy protection failed
+ _globals[kInSpace] = true;
+ _globals[kWindowFixed] = 0;
+ }
+
+ _globals._spriteIndexes[4] = _scene->_sprites.addSprites(formAnimName('x', 0));
+ _globals._spriteIndexes[5] = _scene->_sprites.addSprites(formAnimName('x', 1));
+ _globals._spriteIndexes[6] = _scene->_sprites.addSprites(formAnimName('x', 2));
+ _globals._spriteIndexes[1] = _scene->_sprites.addSprites(formAnimName('x', 3));
+ _globals._spriteIndexes[7] = _scene->_sprites.addSprites(formAnimName('x', 4));
+ _globals._spriteIndexes[8] = _scene->_sprites.addSprites(formAnimName('f', 1));
+
+ _game.loadQuoteSet(791, 0);
+
+ if (_globals[kInSpace]) {
+ if (_globals[kWindowFixed]) {
+ _globals._sequenceIndexes[5] = _scene->_sequences.startCycle(_globals._spriteIndexes[5], 0, 1);
+ _scene->_sequences.addTimer(60, 100);
+ } else {
+ _globals._sequenceIndexes[6] = _scene->_sequences.startCycle(_globals._spriteIndexes[6], false, 1);
+ _globals._sequenceIndexes[7] = _scene->_sequences.startReverseCycle(_globals._spriteIndexes[7], false, 4, 0, 0, 0);
+ _scene->_sequences.addTimer(160, 70);
+ _game._player._stepEnabled = false;
+ }
+ } else {
+ if (_globals[kBeamIsUp] == 0)
+ _globals._sequenceIndexes[8] = _scene->_sequences.startCycle(_globals._spriteIndexes[8], false, 1);
+
+ if (_globals[kWindowFixed] == 0)
+ _globals._sequenceIndexes[4] = _scene->_sequences.startCycle(_globals._spriteIndexes[4], false, 1);
+
+ _globals._sequenceIndexes[1] = _scene->_sequences.startCycle(_globals._spriteIndexes[1], false, 1);
+ _scene->_sequences.setPosition(_globals._sequenceIndexes[1], Common::Point(133, 139));
+ _scene->_sequences.setDepth(_globals._sequenceIndexes[1], 8);
+ }
+
+ _scene->loadAnimation(Resources::formatName(804, 'r', 1, EXT_AA, ""));
+
+ Scene8xx::sceneEntrySound();
+
+ if (_globals[kInSpace] && !_globals[kWindowFixed]) {
+ _scene->_userInterface.setup(kInputLimitedSentences);
+ _vm->_sound->command(19);
+ }
+}
+
+void Scene804::step() {
+ if (!_messWithThrottle) {
+
+ if ((_throttleGone) && (_movingThrottle) && (_scene->_activeAnimation->getCurrentFrame() == 39)) {
+ _globals._sequenceIndexes[1] = _scene->_sequences.startCycle
+ (_globals._spriteIndexes[1], false, 1);
+ _scene->_sequences.setPosition(_globals._sequenceIndexes[1], Common::Point(133, 139));
+ _scene->_sequences.setDepth(_globals._sequenceIndexes[1], 8);
+ _throttleGone = false;
+ }
+
+ if ((_movingThrottle) && (_scene->_activeAnimation->getCurrentFrame() == 42)) {
+ _resetFrame = 0;
+ _movingThrottle = false;
+ }
+
+ if (_game._trigger == 70) {
+ _resetFrame = 42;
+ }
+
+ if (_scene->_activeAnimation->getCurrentFrame() == 65)
+ _scene->_sequences.remove(_globals._sequenceIndexes[7]);
+
+ switch (_game._storyMode) {
+ case STORYMODE_NAUGHTY:
+ if (_scene->_activeAnimation->getCurrentFrame() == 81) {
+ _resetFrame = 80;
+ _globals[kInSpace] = false;
+ _globals[kBeamIsUp] = true;
+
+ assert(!_globals[kCopyProtectFailed]);
+ _game._winStatus = 4;
+ _vm->quitGame();
+ }
+ break;
+
+ case STORYMODE_NICE:
+ if (_scene->_activeAnimation->getCurrentFrame() == 68) {
+ _resetFrame = 66;
+ _globals[kInSpace] = false;
+ _globals[kBeamIsUp] = true;
+
+ assert(!_globals[kCopyProtectFailed]);
+ _game._winStatus = 4;
+ _vm->quitGame();
+ }
+ }
+
+ if (_scene->_activeAnimation->getCurrentFrame() == 34) {
+ _resetFrame = 36;
+ _scene->_sequences.remove(_globals._sequenceIndexes[1]);
+ }
+
+ if (_scene->_activeAnimation->getCurrentFrame() == 37) {
+ _resetFrame = 36;
+ if (!_dontPullThrottleAgain) {
+ _dontPullThrottleAgain = true;
+ _scene->_sequences.addTimer(60, 80);
+ }
+ }
+
+ if (_game._trigger == 80) {
+ _scene->_nextSceneId = 803;
+ }
+
+ if ((_scene->_activeAnimation->getCurrentFrame() == 7) && (!_globals[kWindowFixed])) {
+ _globals._sequenceIndexes[4] = _scene->_sequences.startCycle(_globals._spriteIndexes[4], false, 1);
+ _scene->_sequences.addTimer(20, 110);
+ _globals[kWindowFixed] = true;
+ }
+
+ if (_scene->_activeAnimation->getCurrentFrame() == 10) {
+ _resetFrame = 0;
+ _game._player._stepEnabled = true;
+ _game._objects.setRoom(OBJ_POLYCEMENT, NOWHERE);
+ }
+
+ // FIXME: Original doesn't have resetFrame check. Check why this has been needed
+ if (_resetFrame == -1 && _scene->_activeAnimation->getCurrentFrame() == 1) {
+ int randomVal = _vm->getRandomNumber(29) + 1;
+ switch (randomVal) {
+ case 1:
+ _resetFrame = 25;
+ break;
+ case 2:
+ _resetFrame = 27;
+ break;
+ case 3:
+ _resetFrame = 29;
+ break;
+ default:
+ _resetFrame = 0;
+ break;
+ }
+ }
+
+ switch (_scene->_activeAnimation->getCurrentFrame()) {
+ case 26:
+ case 28:
+ case 31:
+ _resetFrame = 0;
+ break;
+ }
+ } else {
+ if ((_scene->_activeAnimation->getCurrentFrame() == 36) && (!_throttleGone)) {
+ _scene->_sequences.remove(_globals._sequenceIndexes[1]);
+ _throttleGone = true;
+ }
+
+ if (_scene->_activeAnimation->getCurrentFrame() == 39) {
+ _movingThrottle = false;
+ switch (_throttleCounter) {
+ case 1:
+ break;
+ case 3:
+ _scene->_sequences.addTimer(130, 120);
+ break;
+ }
+ }
+
+ if (!_movingThrottle) {
+ ++_throttleCounter;
+ _movingThrottle = true;
+ if (_throttleCounter < 4) {
+ _resetFrame = 34;
+ } else {
+ _messWithThrottle = false;
+ _throttleCounter = 0;
+ _game._player._stepEnabled = true;
+ }
+ }
+ }
+
+ if (_game._trigger == 120) {
+ _vm->_dialogs->show(80422);
+ }
+
+ if (_game._trigger == 110) {
+ _vm->_dialogs->show(80426);
+ }
+
+ if (_pullThrottleReally) {
+ _resetFrame = 32;
+ _pullThrottleReally = false;
+ }
+
+ if (_resetFrame >= 0) {
+ if (_resetFrame != _scene->_activeAnimation->getCurrentFrame()) {
+ _scene->_activeAnimation->setCurrentFrame(_resetFrame);
+ _resetFrame = -1;
+ }
+ }
+
+ if (_game._trigger == 90) {
+ _scene->_nextSceneId = 803;
+ }
+
+ if ((_scene->_activeAnimation->getCurrentFrame() == 72) && !_alreadyPop) {
+ _vm->_sound->command(21);
+ _alreadyPop = true;
+ }
+
+ if ((_scene->_activeAnimation->getCurrentFrame() == 80) && !_alreadyOrgan) {
+ _vm->_sound->command(22);
+ _alreadyOrgan = true;
+ }
+}
+
+void Scene804::actions() {
+ if (_action.isAction(VERB_LOOK, NOUN_SERVICE_PANEL) ||
+ _action.isAction(VERB_OPEN, NOUN_SERVICE_PANEL)) {
+ _scene->_nextSceneId = 805;
+ } else if ((_action.isAction(VERB_ACTIVATE, NOUN_REMOTE)) && _globals[kTopButtonPushed]) {
+ if (!_globals[kInSpace]) {
+ // Top button pressed on panel in hanger control
+ if (!_globals[kBeamIsUp]) {
+ _globals[kFromCockpit] = true;
+ _globals[kUpBecauseOfRemote] = true;
+ _scene->_nextSceneId = 803;
+ } else {
+ // Player turning off remote
+ _globals[kBeamIsUp] = false;
+ _globals[kUpBecauseOfRemote] = false;
+ _scene->_sequences.remove(_globals._sequenceIndexes[8]);
+ _vm->_sound->command(15);
+ }
+ }
+ } else if (_action.isAction(VERB_PULL, NOUN_THROTTLE)) {
+ _game._player._stepEnabled = false;
+ if (_globals[kBeamIsUp]) {
+ if (!_game._objects.isInInventory(OBJ_VASE) && _globals[kWindowFixed]) {
+ _vm->_dialogs->show(80423);
+ _game._player._stepEnabled = true;
+ } else {
+ _action._inProgress = false;
+
+ //saveGame("REX000.SAV");
+
+ _vm->_dialogs->show(80424);
+ _pullThrottleReally = true;
+ _scene->_kernelMessages.add(Common::Point(78, 75), 0x1110, 0, 0,
+ 120, _game.getQuote(791));
+ }
+ } else {
+ _messWithThrottle = true;
+ }
+ }
+ else if (_action.isAction(VERB_APPLY, NOUN_POLYCEMENT, NOUN_CRACK) ||
+ _action.isAction(VERB_PUT, NOUN_POLYCEMENT, NOUN_CRACK)) {
+ if (!_globals[kWindowFixed]) {
+ _resetFrame = 2;
+ _game._player._stepEnabled = false;
+ }
+ } else if (_action.isAction(VERB_EXIT, NOUN_SHIP)) {
+ _globals[kExitShip] = true;
+ _globals[kFromCockpit] = true;
+ if (_globals[kBeamIsUp]) {
+ _vm->_dialogs->show(80425);
+ _scene->_sequences.remove(_globals._sequenceIndexes[8]);
+ _vm->_sound->command(15);
+ _globals[kBeamIsUp] = false;
+ }
+ _game._triggerSetupMode = SEQUENCE_TRIGGER_DAEMON;
+ _scene->_sequences.addTimer(2, 90);
+ } else if (_action._lookFlag) {
+ _vm->_dialogs->show(80410);
+ } else if ((_action.isAction(VERB_LOOK, NOUN_WINDOW)) ||
+ (_action.isAction(VERB_LOOK_OUT, NOUN_WINDOW))) {
+ if (_globals[kBeamIsUp]) {
+ _vm->_dialogs->show(80412);
+ } else {
+ _vm->_dialogs->show(80411);
+ }
+ } else if (_action.isAction(VERB_LOOK, NOUN_CRACK)) {
+ if (_globals[kWindowFixed]) {
+ _vm->_dialogs->show(80414);
+ } else {
+ _vm->_dialogs->show(80413);
+ }
+ } else if (_action.isAction(VERB_LOOK, NOUN_CONTROLS)) {
+ _vm->_dialogs->show(80415);
+ } else if (_action.isAction(VERB_LOOK, NOUN_STATUS_PANEL)) {
+ if (_globals[kBeamIsUp]) {
+ _vm->_dialogs->show(80417);
+ } else {
+ _vm->_dialogs->show(80416);
+ }
+ } else if (_action.isAction(VERB_LOOK, NOUN_TP)) {
+ _vm->_dialogs->show(80418);
+ } else if (_action.isAction(VERB_TAKE, NOUN_TP)) {
+ _vm->_dialogs->show(80419);
+ } else if (_action.isAction(VERB_LOOK, NOUN_INSTRUMENTATION)) {
+ _vm->_dialogs->show(80420);
+ } else if (_action.isAction(VERB_LOOK, NOUN_SEAT)) {
+ _vm->_dialogs->show(80421);
+ } else
+ return;
+
+ _action._inProgress = false;
+}
+
+/*------------------------------------------------------------------------*/
+
+void Scene805::setup() {
+ setPlayerSpritesPrefix();
+ setAAName();
+ _scene->addActiveVocab(VERB_REMOVE);
+ _scene->addActiveVocab(NOUN_TARGET_MODULE);
+ _scene->addActiveVocab(NOUN_SHIELD_MODULATOR);
+}
+
+void Scene805::enter() {
+ _game._player._visible = false;
+ _scene->_userInterface.setup(kInputLimitedSentences);
+
+ _globals._spriteIndexes[1] = _scene->_sprites.addSprites(formAnimName('a', 1));
+ _globals._spriteIndexes[2] = _scene->_sprites.addSprites(formAnimName('a', 2));
+
+ if (_globals[kShieldModInstalled]) {
+ _scene->_hotspots.activate(OBJ_SHIELD_MODULATOR, false);
+ _globals._sequenceIndexes[1] = _scene->_sequences.startCycle(_globals._spriteIndexes[1], false, 25);
+ int idx = _scene->_dynamicHotspots.add(NOUN_SHIELD_MODULATOR, VERB_REMOVE, _globals._sequenceIndexes[1], Common::Rect(0, 0, 0, 0));
+ _scene->_dynamicHotspots.setPosition(idx, Common::Point(0, 0), FACING_DUMMY);
+ }
+
+ if (_globals[kTargetModInstalled]) {
+ _scene->_hotspots.activate(OBJ_TARGET_MODULE, false);
+ _globals._sequenceIndexes[2] = _scene->_sequences.startCycle(_globals._spriteIndexes[2], false, 12);
+ int idx = _scene->_dynamicHotspots.add(NOUN_TARGET_MODULE, VERB_REMOVE, _globals._sequenceIndexes[2], Common::Rect(0, 0, 0, 0));
+ _scene->_dynamicHotspots.setPosition(idx, Common::Point(0, 0), FACING_DUMMY);
+ }
+
+ sceneEntrySound();
+}
+
+void Scene805::step() {
+ if (_game._trigger == 70) {
+ _scene->_hotspots.activate(OBJ_SHIELD_MODULATOR, false);
+ _globals._sequenceIndexes[1] = _scene->_sequences.startCycle(_globals._spriteIndexes[1], false, 25);
+ int idx = _scene->_dynamicHotspots.add(NOUN_SHIELD_MODULATOR, VERB_REMOVE, _globals._sequenceIndexes[1], Common::Rect(0, 0, 0, 0));
+ _scene->_dynamicHotspots.setPosition(idx, Common::Point(0, 0), FACING_DUMMY);
+ _globals[kShieldModInstalled] = true;
+ _game._objects.setRoom(OBJ_SHIELD_MODULATOR, NOWHERE);
+ _game._player._stepEnabled = true;
+ _vm->_sound->command(24);
+ }
+
+ if (_game._trigger == 80) {
+ _scene->_hotspots.activate(OBJ_TARGET_MODULE, false);
+ _globals._sequenceIndexes[2] = _scene->_sequences.startCycle(_globals._spriteIndexes[2], false, 12);
+ int idx = _scene->_dynamicHotspots.add(NOUN_TARGET_MODULE, VERB_REMOVE, _globals._sequenceIndexes[2], Common::Rect(0, 0, 0, 0));
+ _scene->_dynamicHotspots.setPosition(idx, Common::Point(0, 0), FACING_DUMMY);
+ _globals[kTargetModInstalled] = true;
+ _game._objects.setRoom(OBJ_TARGET_MODULE, NOWHERE);
+ _game._player._stepEnabled = true;
+ _vm->_sound->command(24);
+ }
+
+ if (_game._trigger == 71) {
+ _scene->_hotspots.activate(OBJ_SHIELD_MODULATOR, true);
+ _globals[kShieldModInstalled] = false;
+ _game._objects.addToInventory(OBJ_SHIELD_MODULATOR);
+ _game._player._stepEnabled = true;
+ }
+
+ if (_game._trigger == 81) {
+ _scene->_hotspots.activate(OBJ_TARGET_MODULE, true);
+ _globals[kTargetModInstalled] = false;
+ _game._objects.addToInventory(OBJ_TARGET_MODULE);
+ _game._player._stepEnabled = true;
+ }
+}
+
+void Scene805::preActions() {
+ _game._player._needToWalk = false;
+}
+
+void Scene805::actions() {
+ if (_action.isAction(VERB_EXIT, NOUN_SERVICE_PANEL))
+ _scene->_nextSceneId = 804;
+ else if (_action.isAction(VERB_INSTALL, NOUN_SHIELD_MODULATOR) && _game._objects.isInInventory(OBJ_SHIELD_MODULATOR)) {
+ _game._triggerSetupMode = SEQUENCE_TRIGGER_DAEMON;
+ _globals._sequenceIndexes[1] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[1], false, 7, 1, 0, 0);
+ _scene->_sequences.setAnimRange(_globals._sequenceIndexes[1], -1, -2);
+ _scene->_sequences.addSubEntry(_globals._sequenceIndexes[1], SEQUENCE_TRIGGER_EXPIRE, 0, 70);
+ _game._player._stepEnabled = false;
+ } else if (_action.isAction(VERB_INSTALL, NOUN_TARGET_MODULE) && _game._objects.isInInventory(OBJ_TARGET_MODULE)) {
+ _game._triggerSetupMode = SEQUENCE_TRIGGER_DAEMON;
+ _globals._sequenceIndexes[2] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[2], false, 7, 1, 0, 0);
+ _scene->_sequences.setAnimRange(_globals._sequenceIndexes[2], -1, -2);
+ _scene->_sequences.addSubEntry(_globals._sequenceIndexes[2], SEQUENCE_TRIGGER_EXPIRE, 0, 80);
+ _game._player._stepEnabled = false;
+ } else if (_action.isAction(VERB_REMOVE, NOUN_SHIELD_MODULATOR) && _globals[kShieldModInstalled]) {
+ _scene->_sequences.remove(_globals._sequenceIndexes[1]);
+ _game._triggerSetupMode = SEQUENCE_TRIGGER_DAEMON;
+ _globals._sequenceIndexes[1] = _scene->_sequences.startReverseCycle(_globals._spriteIndexes[1], false, 7, 1, 0, 0);
+ _scene->_sequences.setAnimRange(_globals._sequenceIndexes[1], -1, -2);
+ _scene->_sequences.addSubEntry(_globals._sequenceIndexes[1], SEQUENCE_TRIGGER_EXPIRE, 0, 71);
+ _game._player._stepEnabled = false;
+ } else if (_action.isAction(VERB_REMOVE, NOUN_TARGET_MODULE) && _globals[kTargetModInstalled]) {
+ _scene->_sequences.remove(_globals._sequenceIndexes[2]);
+ _game._triggerSetupMode = SEQUENCE_TRIGGER_DAEMON;
+ _globals._sequenceIndexes[2] = _scene->_sequences.startReverseCycle(_globals._spriteIndexes[2], false, 7, 1, 0, 0);
+ _scene->_sequences.setAnimRange(_globals._sequenceIndexes[2], -1, -2);
+ _scene->_sequences.addSubEntry(_globals._sequenceIndexes[2], SEQUENCE_TRIGGER_EXPIRE, 0, 81);
+ _game._player._stepEnabled = false;
+ } else if (_action.isAction(VERB_INSTALL, NOUN_SHIELD_MODULATOR) && !_game._objects.isInInventory(OBJ_SHIELD_MODULATOR))
+ _vm->_dialogs->show(80511);
+ else if (_action.isAction(VERB_INSTALL, NOUN_TARGET_MODULE) && !_game._objects.isInInventory(OBJ_TARGET_MODULE))
+ _vm->_dialogs->show(80510);
+ else if (_action.isAction(VERB_REMOVE, NOUN_LIFE_SUPPORT_MODULE))
+ _vm->_dialogs->show(80512);
+ else
+ return;
+
+ _action._inProgress = false;
+}
+
+/*------------------------------------------------------------------------*/
+
+void Scene807::setup() {
+ _game._player._spritesPrefix = "";
+ // The original was calling Scene8xx::setAAName()
+ _game._aaName = Resources::formatAAName(5);
+}
+
+void Scene807::enter() {
+ if (_globals[kSexOfRex] == REX_FEMALE)
+ _handSpriteId = _scene->_sprites.addSprites("*ROXHAND");
+ else
+ _handSpriteId = _scene->_sprites.addSprites("*REXHAND");
+
+ teleporterEnter();
+
+ // The original uses Scene8xx::SceneEntrySound()
+ if (!_vm->_musicFlag)
+ _vm->_sound->command(2);
+ else
+ _vm->_sound->command(20);
+}
+
+void Scene807::step() {
+ teleporterStep();
+}
+
+void Scene807::actions() {
+ if (teleporterActions()) {
+ _action._inProgress = false;
+ return;
+ }
+
+ if (_action.isAction(VERB_LOOK, NOUN_VIEWPORT))
+ _vm->_dialogs->show(80710);
+ else if (_action.isAction(VERB_PEER_THROUGH, NOUN_VIEWPORT))
+ _vm->_dialogs->show(80710);
+ else if (_action.isAction(VERB_LOOK, NOUN_KEYPAD) && _action.isAction(VERB_INSPECT, NOUN_KEYPAD))
+ _vm->_dialogs->show(80711);
+ else if (_action.isAction(VERB_LOOK, NOUN_DISPLAY))
+ _vm->_dialogs->show(80712);
+ else if (_action.isAction(VERB_LOOK, NOUN_1_KEY) || _action.isAction(VERB_LOOK, NOUN_2_KEY)
+ || _action.isAction(VERB_LOOK, NOUN_3_KEY) || _action.isAction(VERB_LOOK, NOUN_4_KEY)
+ || _action.isAction(VERB_LOOK, NOUN_5_KEY) || _action.isAction(VERB_LOOK, NOUN_6_KEY)
+ || _action.isAction(VERB_LOOK, NOUN_7_KEY) || _action.isAction(VERB_LOOK, NOUN_8_KEY)
+ || _action.isAction(VERB_LOOK, NOUN_9_KEY) || _action.isAction(VERB_LOOK, NOUN_0_KEY)
+ || _action.isAction(VERB_LOOK, NOUN_SMILE_KEY) || _action.isAction(VERB_LOOK, NOUN_FROWN_KEY))
+ _vm->_dialogs->show(80713);
+ else if (_action.isAction(VERB_LOOK, NOUN_DEVICE) && _action._lookFlag)
+ _vm->_dialogs->show(80714);
+ else
+ return;
+
+ _action._inProgress = false;
+}
+
+/*------------------------------------------------------------------------*/
+
+Scene808::Scene808(MADSEngine *vm) : Scene8xx(vm) {
+ _goingTo803 = false;
+}
+
+void Scene808::synchronize(Common::Serializer &s) {
+ Scene8xx::synchronize(s);
+
+ s.syncAsByte(_goingTo803);
+}
+
+void Scene808::setup() {
+ setPlayerSpritesPrefix();
+ setAAName();
+}
+
+void Scene808::enter() {
+ _scene->_userInterface.setup(kInputLimitedSentences);
+
+ _globals._spriteIndexes[4] = _scene->_sprites.addSprites ("*REXHAND");
+ _globals._spriteIndexes[1] = _scene->_sprites.addSprites(formAnimName('b', 0));
+ _globals._spriteIndexes[2] = _scene->_sprites.addSprites(formAnimName('b', 1));
+ _globals._spriteIndexes[3] = _scene->_sprites.addSprites(formAnimName('b', 2));
+
+ if (_globals[kTopButtonPushed])
+ _globals._sequenceIndexes[1] = _scene->_sequences.startCycle(_globals._spriteIndexes[1], false, 1);
+ else
+ _globals._sequenceIndexes[2] = _scene->_sequences.startCycle(_globals._spriteIndexes[2], false, 1);
+
+ _goingTo803 = false;
+
+ if (_globals[kCameFromCut] && _globals[kCutX] != 0) {
+ _globals[kCutX] = 0;
+ _globals[kCameFromCut] = false;
+ _globals[kReturnFromCut] = false;
+ _globals[kBeamIsUp] = false;
+ _globals[kForceBeamDown] = false;
+ _globals[kDontRepeat] = false;
+ } else if ((_scene->_priorSceneId == 803) && _globals[kReturnFromCut]){
+ _globals[kDontRepeat] = false;
+ _globals[kBeamIsUp] = true;
+ _globals[kAntigravClock] = _scene->_frameStartTime;
+ _globals[kAntigravTiming] = _scene->_frameStartTime;
+ _globals[kForceBeamDown] = false;
+ _globals[kReturnFromCut] = false;
+ }
+
+ _globals[kBetweenRooms] = false;
+
+ if (_globals[kBeamIsUp]) {
+ _globals._sequenceIndexes[3] = _scene->_sequences.startCycle(_globals._spriteIndexes[3], false, 1);
+ _scene->_sequences.setDepth(_globals._sequenceIndexes[3], 8);
+ }
+
+ sceneEntrySound();
+}
+
+void Scene808::actions() {
+ if (_action.isAction(VERB_PRESS, NOUN_START_BUTTON_2)) {
+ switch (_game._trigger) {
+ case 0:
+ _game._player._stepEnabled = false;
+ _globals._sequenceIndexes[4] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[4], false, 4, 1, 0, 0);
+ _scene->_sequences.setPosition(_globals._sequenceIndexes[4], Common::Point(248, 211));
+ _scene->_sequences.setDepth(_globals._sequenceIndexes[4], 2);
+ _scene->_sequences.addSubEntry(_globals._sequenceIndexes[4], SEQUENCE_TRIGGER_EXPIRE, 0, 70);
+ break;
+
+ case 70:
+ if (!_globals[kBeamIsUp] && !_globals[kTopButtonPushed]) {
+ _globals._sequenceIndexes[3] = _scene->_sequences.startCycle(_globals._spriteIndexes[3], false, 1);
+ _scene->_sequences.setDepth(_globals._sequenceIndexes[3], 8);
+ _goingTo803 = true;
+ _vm->_sound->command(20);
+ _vm->_sound->command(25);
+ }
+ _globals._sequenceIndexes[4] = _scene->_sequences.startReverseCycle(_globals._spriteIndexes[4], false, 4, 1, 0, 0);
+ _scene->_sequences.setPosition(_globals._sequenceIndexes[4], Common::Point(248, 211));
+ _scene->_sequences.setDepth(_globals._sequenceIndexes[4], 2);
+ _scene->_sequences.addSubEntry(_globals._sequenceIndexes[4], SEQUENCE_TRIGGER_EXPIRE, 0, 71);
+ break;
+
+ case 71:
+ _game._player._stepEnabled = true;
+ if (_goingTo803 && !_globals[kTopButtonPushed]) {
+ _goingTo803 = false;
+ _globals[kReturnFromCut] = true;
+ _scene->_nextSceneId = 803;
+ }
+ break;
+
+ default:
+ break;
+ }
+ } else if (_action.isAction(VERB_PRESS, NOUN_TIMER_BUTTON_2)) {
+ switch (_game._trigger) {
+ case 0:
+ _game._player._stepEnabled = false;
+ _globals._sequenceIndexes[4] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[4], false, 4, 1, 0, 0);
+ _scene->_sequences.setPosition(_globals._sequenceIndexes[4], Common::Point(248, 186));
+ _scene->_sequences.setDepth(_globals._sequenceIndexes[4], 2);
+ _scene->_sequences.addSubEntry(_globals._sequenceIndexes[4], SEQUENCE_TRIGGER_EXPIRE, 0, 90);
+ break;
+ case 90:
+ if (_globals[kTopButtonPushed]) {
+ _scene->_sequences.remove(_globals._sequenceIndexes[1]);
+ _globals._sequenceIndexes[2] = _scene->_sequences.startCycle(_globals._spriteIndexes[2], false, 1);
+ _scene->_sequences.setDepth(_globals._sequenceIndexes[2], 8);
+ _vm->_sound->command(20);
+ }
+ _globals[kTopButtonPushed] = false;
+ _globals._sequenceIndexes[4] = _scene->_sequences.startReverseCycle(_globals._spriteIndexes[4], false, 4, 1, 0, 0);
+ _scene->_sequences.setPosition(_globals._sequenceIndexes[4], Common::Point(248, 186));
+ _scene->_sequences.setDepth(_globals._sequenceIndexes[4], 2);
+ _scene->_sequences.addSubEntry(_globals._sequenceIndexes[4], SEQUENCE_TRIGGER_EXPIRE, 0, 91);
+ break;
+
+ case 91:
+ _game._player._stepEnabled = true;
+ break;
+
+ default:
+ break;
+ }
+ } else if (_action.isAction(VERB_PRESS, NOUN_REMOTE_BUTTON_2)) {
+ switch (_game._trigger) {
+ case 0:
+ _game._player._stepEnabled = false;
+ _globals._sequenceIndexes[4] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[4], false, 4, 1, 0, 0);
+ _scene->_sequences.setPosition(_globals._sequenceIndexes[4], Common::Point(248, 163));
+ _scene->_sequences.setDepth(_globals._sequenceIndexes[4], 2);
+ _scene->_sequences.addSubEntry(_globals._sequenceIndexes[4], SEQUENCE_TRIGGER_EXPIRE, 0, 80);
+ break;
+
+ case 80:
+ if (!_globals[kTopButtonPushed]) {
+ _scene->_sequences.remove(_globals._sequenceIndexes[2]);
+ _globals._sequenceIndexes[1] = _scene->_sequences.startCycle(_globals._spriteIndexes[1], false, 1);
+ _scene->_sequences.setDepth(_globals._sequenceIndexes[1], 8);
+ _vm->_sound->command(20);
+ }
+ _globals[kTopButtonPushed] = true;
+ _globals._sequenceIndexes[4] = _scene->_sequences.startReverseCycle(_globals._spriteIndexes[4], false, 4, 1, 0, 0);
+ _scene->_sequences.setPosition(_globals._sequenceIndexes[4], Common::Point(248, 163));
+ _scene->_sequences.setDepth(_globals._sequenceIndexes[4], 2);
+ _scene->_sequences.addSubEntry(_globals._sequenceIndexes[4], SEQUENCE_TRIGGER_EXPIRE, 0, 81);
+ break;
+
+ case 81:
+ _game._player._stepEnabled = true;
+ break;
+
+ default:
+ break;
+ }
+ } else if (_action.isAction(VERB_PRESS, NOUN_START_BUTTON_1)) {
+ switch (_game._trigger) {
+ case 0:
+ _game._player._stepEnabled = false;
+ _globals._sequenceIndexes[4] = _scene->_sequences.startReverseCycle(_globals._spriteIndexes[4], false, 4, 2, 0, 0);
+ _scene->_sequences.setPosition(_globals._sequenceIndexes[4], Common::Point(168, 211));
+ _scene->_sequences.setDepth(_globals._sequenceIndexes[4], 2);
+ _scene->_sequences.addSubEntry(_globals._sequenceIndexes[4], SEQUENCE_TRIGGER_EXPIRE, 0, 70);
+ break;
+
+ case 70:
+ _game._player._stepEnabled = true;
+ break;
+
+ default:
+ break;
+ }
+ } else if (_action.isAction(VERB_PRESS, NOUN_REMOTE_BUTTON_1)) {
+ switch (_game._trigger) {
+ case 0:
+ _game._player._stepEnabled = false;
+ _globals._sequenceIndexes[4] = _scene->_sequences.startReverseCycle(_globals._spriteIndexes[4], false, 4, 2, 0, 0);
+ _scene->_sequences.setPosition(_globals._sequenceIndexes[4], Common::Point(172, 163));
+ _scene->_sequences.setDepth(_globals._sequenceIndexes[4], 2);
+ _scene->_sequences.addSubEntry(_globals._sequenceIndexes[4], SEQUENCE_TRIGGER_EXPIRE, 0, 80);
+ break;
+
+ case 80:
+ _game._player._stepEnabled = true;
+ break;
+
+ default:
+ break;
+ }
+ } else if (_action.isAction(VERB_PRESS, NOUN_TIMER_BUTTON_1)) {
+ switch (_game._trigger) {
+ case 0:
+ _game._player._stepEnabled = false;
+ _globals._sequenceIndexes[4] = _scene->_sequences.startReverseCycle(_globals._spriteIndexes[4], false, 4, 2, 0, 0);
+ _scene->_sequences.setPosition(_globals._sequenceIndexes[4], Common::Point(172, 186));
+ _scene->_sequences.setDepth(_globals._sequenceIndexes[4], 2);
+ _scene->_sequences.addSubEntry(_globals._sequenceIndexes[4], SEQUENCE_TRIGGER_EXPIRE, 0, 90);
+ break;
+
+ case 90:
+ _game._player._stepEnabled = true;
+ break;
+
+ default:
+ break;
+ }
+ } else if (_action.isAction(VERB_EXIT, NOUN_PANEL)) {
+ _scene->_nextSceneId = 801;
+ _globals[kBetweenRooms] = true;
+ } else
+ return;
+
+ _action._inProgress = false;
+}
+
+/*------------------------------------------------------------------------*/
+
+Scene810::Scene810(MADSEngine *vm) : Scene8xx(vm) {
+ _moveAllowed = false;
+}
+
+void Scene810::synchronize(Common::Serializer &s) {
+ Scene8xx::synchronize(s);
+
+ s.syncAsByte(_moveAllowed);
+}
+
+void Scene810::setup() {
+ setPlayerSpritesPrefix();
+ setAAName();
+}
+
+void Scene810::enter() {
+ _scene->_userInterface.setup(kInputLimitedSentences);
+ _game._player._visible = false;
+ _game._player._stepEnabled = false;
+ _scene->loadAnimation(Resources::formatName(810, 'a', -1, EXT_AA, ""));
+ _moveAllowed = true;
+
+ sceneEntrySound();
+}
+
+void Scene810::step() {
+ if ((_scene->_activeAnimation->getCurrentFrame() == 200) && _moveAllowed) {
+ _scene->_sequences.addTimer(100, 70);
+ _moveAllowed = false;
+ }
+
+ if (_game._trigger == 70)
+ _scene->_nextSceneId = 804;
+}
+
+/*------------------------------------------------------------------------*/
+
+} // End of namespace Nebular
+} // End of namespace MADS
diff --git a/engines/mads/nebular/nebular_scenes8.h b/engines/mads/nebular/nebular_scenes8.h
new file mode 100644
index 0000000000..7f2c34a843
--- /dev/null
+++ b/engines/mads/nebular/nebular_scenes8.h
@@ -0,0 +1,165 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+
+ * You should have received a copy of the GNU General Public 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 MADS_NEBULAR_SCENES8_H
+#define MADS_NEBULAR_SCENES8_H
+
+#include "common/scummsys.h"
+#include "mads/game.h"
+#include "mads/scene.h"
+#include "mads/nebular/nebular_scenes.h"
+
+namespace MADS {
+
+namespace Nebular {
+
+class Scene8xx : public NebularScene {
+protected:
+ /**
+ * Initial setup code shared by several scenes
+ */
+ void setPlayerSpritesPrefix();
+
+ /**
+ * Initial setup code shared by several scenes
+ */
+ void setAAName();
+
+ /**
+ * Common scene enter code used by multiple scenes
+ */
+ void sceneEntrySound();
+public:
+ Scene8xx(MADSEngine *vm) : NebularScene(vm) {}
+};
+
+class Scene801 : public Scene8xx{
+private:
+ bool _walkThroughDoor;
+
+public:
+ Scene801(MADSEngine *vm);
+ void synchronize(Common::Serializer &s);
+
+ virtual void setup();
+ virtual void enter();
+ virtual void step();
+ virtual void preActions();
+ virtual void actions();
+};
+
+class Scene802 : public Scene8xx{
+public:
+ Scene802(MADSEngine *vm) : Scene8xx(vm) {}
+
+ virtual void setup();
+ virtual void enter();
+ virtual void step();
+ virtual void preActions();
+ virtual void actions();
+};
+
+class Scene803 : public Scene8xx{
+public:
+ Scene803(MADSEngine *vm) : Scene8xx(vm) {}
+
+ virtual void setup();
+ virtual void enter();
+ virtual void step();
+ virtual void preActions();
+ virtual void actions();
+};
+
+class Scene804 : public Scene8xx {
+private:
+ bool _messWithThrottle;
+ bool _movingThrottle;
+ bool _throttleGone;
+ bool _dontPullThrottleAgain;
+ bool _pullThrottleReally;
+ bool _alreadyOrgan;
+ bool _alreadyPop;
+ uint32 _throttleCounter;
+ int _resetFrame;
+
+public:
+ Scene804(MADSEngine *vm);
+ void synchronize(Common::Serializer &s);
+
+ virtual void setup();
+ virtual void enter();
+ virtual void step();
+ virtual void actions();
+};
+
+class Scene805 : public Scene8xx{
+public:
+ Scene805(MADSEngine *vm) : Scene8xx(vm) {}
+
+ virtual void setup();
+ virtual void enter();
+ virtual void step();
+ virtual void preActions();
+ virtual void actions();
+};
+
+class Scene807 : public SceneTeleporter {
+public:
+ Scene807(MADSEngine *vm) : SceneTeleporter(vm) {}
+
+ virtual void setup();
+ virtual void enter();
+ virtual void step();
+ virtual void actions();
+};
+
+class Scene808 : public Scene8xx{
+private:
+ bool _goingTo803;
+
+public:
+ Scene808(MADSEngine *vm);
+ void synchronize(Common::Serializer &s);
+
+ virtual void setup();
+ virtual void enter();
+ virtual void actions();
+};
+
+class Scene810 : public Scene8xx{
+private:
+ bool _moveAllowed;
+
+public:
+ Scene810(MADSEngine *vm);
+ void synchronize(Common::Serializer &s);
+
+ virtual void setup();
+ virtual void enter();
+ virtual void step();
+ virtual void actions() {};
+};
+
+} // End of namespace Nebular
+} // End of namespace MADS
+
+#endif /* MADS_NEBULAR_SCENES8_H */
diff --git a/engines/mads/nebular/sound_nebular.cpp b/engines/mads/nebular/sound_nebular.cpp
new file mode 100644
index 0000000000..fc2755db2f
--- /dev/null
+++ b/engines/mads/nebular/sound_nebular.cpp
@@ -0,0 +1,3119 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+
+ * You should have received a copy of the GNU General Public 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 "audio/audiostream.h"
+#include "audio/decoders/raw.h"
+#include "common/algorithm.h"
+#include "common/debug.h"
+#include "common/memstream.h"
+#include "mads/sound.h"
+#include "mads/nebular/sound_nebular.h"
+
+namespace MADS {
+
+namespace Nebular {
+
+bool AdlibChannel::_channelsEnabled;
+
+AdlibChannel::AdlibChannel() {
+ _activeCount = 0;
+ _field1 = 0;
+ _field2 = 0;
+ _field3 = 0;
+ _field4 = 0;
+ _sampleIndex = 0;
+ _volume = 0;
+ _field7 = 0;
+ _field8 = 0;
+ _field9 = 0;
+ _fieldA = 0;
+ _fieldB = 0;
+ _fieldC = 0;
+ _fieldD = 0;
+ _fieldE = 0;
+ _ptr1 = nullptr;
+ _pSrc = nullptr;
+ _ptr3 = nullptr;
+ _ptr4 = nullptr;
+ _field17 = 0;
+ _field19 = 0;
+ _soundData = nullptr;
+ _field1D = 0;
+ _field1E = 0;
+ _field1F = 0;
+
+ _field20 = 0;
+}
+
+void AdlibChannel::reset() {
+ _activeCount = 0;
+ _field1 = 0;
+ _field2 = 0;
+ _field3 = 0;
+}
+
+void AdlibChannel::enable(int flag) {
+ if (_activeCount) {
+ _fieldE = flag;
+
+ // WORKAROUND: Original set _soundData pointer to flag. Since this seems
+ // just intended to invalidate any prior pointer, I've replaced it with
+ // a simple null pointer
+ _soundData = nullptr;
+ }
+
+ _channelsEnabled = true;
+}
+
+void AdlibChannel::setPtr2(byte *pData) {
+ _pSrc = pData;
+ _field2 = 0xFF;
+ _fieldA = 1;
+ _field9 = 1;
+}
+
+void AdlibChannel::load(byte *pData) {
+ _ptr1 = _pSrc = _ptr3 = pData;
+ _ptr4 = _soundData = pData;
+ _fieldA = 0xFF;
+ _activeCount = 1;
+ _fieldD = 64;
+ _field1 = 0;
+ _field1F = 0;
+ _field2 = _field3 = 0;
+ _volume = _field7 = 0;
+ _field1D = _field1E = 0;
+ _fieldE = 0;
+ _field9 = 0;
+ _fieldB = 0;
+ _field17 = 0;
+ _field19 = 0;
+}
+
+void AdlibChannel::check(byte *nullPtr) {
+ if (_activeCount && _fieldE) {
+ if (!_field1E) {
+ _pSrc = nullPtr;
+ _fieldE = 0;
+ } else {
+ _field2 = 0xFF;
+ _fieldA = 4;
+ if (!_field9)
+ _field9 = 1;
+ }
+ }
+}
+
+/*-----------------------------------------------------------------------*/
+
+AdlibSample::AdlibSample(Common::SeekableReadStream &s) {
+ _attackRate = s.readByte();
+ _decayRate = s.readByte();
+ _sustainLevel = s.readByte();
+ _releaseRate = s.readByte();
+ _egTyp = s.readByte() != 0;
+ _ksr = s.readByte() != 0;
+ _totalLevel = s.readByte();
+ _scalingLevel = s.readByte();
+ _waveformSelect = s.readByte();
+ _freqMultiple = s.readByte();
+ _feedback = s.readByte();
+ _ampMod = s.readByte() != 0;
+ _vib = s.readByte();
+ _alg = s.readByte();
+ _fieldE = s.readByte();
+ s.skip(1);
+ _freqMask = s.readUint16LE();
+ _freqBase = s.readUint16LE();
+ _field14 = s.readUint16LE();
+}
+
+/*-----------------------------------------------------------------------*/
+
+ASound::ASound(Audio::Mixer *mixer, const Common::String &filename, int dataOffset) {
+ // Open up the appropriate sound file
+ if (!_soundFile.open(filename))
+ error("Could not open file - %s", filename.c_str());
+
+ // Initialize fields
+ _commandParam = 0;
+ _activeChannelPtr = nullptr;
+ _samplePtr = nullptr;
+ _frameCounter = 0;
+ _isDisabled = false;
+ _v1 = 0;
+ _v2 = 0;
+ _activeChannelNumber = 0;
+ _freqMask1 = _freqMask2 = 0;
+ _freqBase1 = _freqBase2 = 0;
+ _channelNum1 = _channelNum2 = 0;
+ _v7 = 0;
+ _v8 = 0;
+ _v9 = 0;
+ _v10 = 0;
+ _pollResult = 0;
+ _resultFlag = 0;
+ _nullData[0] = _nullData[1] = 0;
+ Common::fill(&_ports[0], &_ports[256], 0);
+ _stateFlag = false;
+ _activeChannelReg = 0;
+ _v11 = 0;
+ _randomSeed = 1234;
+ _amDep = _vibDep = _splitPoint = true;
+
+ _samplesTillCallback = 0;
+ _samplesTillCallbackRemainder = 0;
+ _samplesPerCallback = getRate() / CALLBACKS_PER_SECOND;
+ _samplesPerCallbackRemainder = getRate() % CALLBACKS_PER_SECOND;
+
+ for (int i = 0; i < 11; ++i) {
+ _channelData[i]._field0 = 0;
+ _channelData[i]._freqMask = 0;
+ _channelData[i]._freqBase = 0;
+ _channelData[i]._field6 = 0;
+ }
+
+ AdlibChannel::_channelsEnabled = false;
+
+ // Store passed parameters, and setup OPL
+ _dataOffset = dataOffset;
+ _mixer = mixer;
+ _opl = OPL::Config::create();
+ assert(_opl);
+
+ _opl->init(getRate());
+ _mixer->playStream(Audio::Mixer::kPlainSoundType, &_soundHandle, this, -1,
+ Audio::Mixer::kMaxChannelVolume, 0, DisposeAfterUse::NO, true);
+
+ // Initialize the Adlib
+ adlibInit();
+
+ // Reset the adlib
+ command0();
+}
+
+ASound::~ASound() {
+ Common::List<CachedDataEntry>::iterator i;
+ for (i = _dataCache.begin(); i != _dataCache.end(); ++i)
+ delete[] (*i)._data;
+
+ _mixer->stopHandle(_soundHandle);
+ delete _opl;
+}
+
+void ASound::adlibInit() {
+ write(4, 0x60);
+ write(4, 0x80);
+ write(2, 0xff);
+ write(4, 0x21);
+ write(4, 0x60);
+ write(4, 0x80);
+}
+
+int ASound::stop() {
+ command0();
+ int result = _pollResult;
+ _pollResult = 0;
+ return result;
+}
+
+int ASound::poll() {
+ // Update any playing sounds
+ update();
+
+ // Return result
+ int result = _pollResult;
+ _pollResult = 0;
+ return result;
+}
+
+void ASound::noise() {
+ int randomVal = getRandomNumber();
+
+ if (_v1) {
+ setFrequency(_channelNum1, ((randomVal ^ 0xFFFF) & _freqMask1) + _freqBase1);
+ }
+
+ if (_v2) {
+ setFrequency(_channelNum2, (randomVal & _freqMask2) + _freqBase2);
+ }
+}
+
+void ASound::write(int reg, int val) {
+ _queue.push(RegisterValue(reg, val));
+}
+
+int ASound::write2(int state, int reg, int val) {
+ // TODO: Original has a state parameter, not used when in Adlib mode?
+ _ports[reg] = val;
+ write(reg, val);
+ return state;
+}
+
+void ASound::flush() {
+ Common::StackLock slock(_driverMutex);
+
+ while (!_queue.empty()) {
+ RegisterValue v = _queue.pop();
+ _opl->writeReg(v._regNum, v._value);
+ }
+}
+
+void ASound::channelOn(int reg, int volume) {
+ write2(8, reg, (_ports[reg] & 0xC0) | (volume & 0x3F));
+}
+
+void ASound::channelOff(int reg) {
+ write2(8, reg, _ports[reg] | 0x3F);
+}
+
+void ASound::resultCheck() {
+ if (_resultFlag != 1) {
+ _resultFlag = 1;
+ _pollResult = 1;
+ }
+}
+
+byte *ASound::loadData(int offset, int size) {
+ // First scan for an existing copy
+ Common::List<CachedDataEntry>::iterator i;
+ for (i = _dataCache.begin(); i != _dataCache.end(); ++i) {
+ CachedDataEntry &e = *i;
+ if (e._offset == offset)
+ return e._data;
+ }
+
+ // No existing entry found, so load up data and store as a new entry
+ CachedDataEntry rec;
+ rec._offset = offset;
+ rec._data = new byte[size];
+ _soundFile.seek(_dataOffset + offset);
+ _soundFile.read(rec._data, size);
+ _dataCache.push_back(rec);
+
+ // Return the data
+ return rec._data;
+}
+
+void ASound::playSound(int offset, int size) {
+ // Load the specified data block
+ playSoundData(loadData(offset, size));
+}
+
+void ASound::playSoundData(byte *pData, int startingChannel) {
+ // Scan for a high level free channel
+ for (int i = startingChannel; i < ADLIB_CHANNEL_COUNT; ++i) {
+ if (!_channels[i]._activeCount) {
+ _channels[i].load(pData);
+ return;
+ }
+ }
+
+ // None found, do a secondary scan for an interruptable channel
+ for (int i = ADLIB_CHANNEL_COUNT - 1; i >= startingChannel; --i) {
+ if (_channels[i]._fieldE == 0xFF) {
+ _channels[i].load(pData);
+ return;
+ }
+ }
+}
+
+bool ASound::isSoundActive(byte *pData) {
+ for (int i = 0; i < ADLIB_CHANNEL_MIDWAY; ++i) {
+ if (_channels[i]._activeCount && _channels[i]._soundData == pData)
+ return true;
+ }
+
+ return false;
+}
+
+void ASound::setFrequency(int channel, int freq) {
+ write2(8, 0xA0 + channel, freq & 0xFF);
+ write2(8, 0xB0 + channel, (freq >> 8) | 0x20);
+}
+
+int ASound::getRandomNumber() {
+ int v = 0x9248 + (int)_randomSeed;
+ _randomSeed = ((v >> 3) | (v << 13)) & 0xFFFF;
+ return _randomSeed;
+}
+
+void ASound::update() {
+ getRandomNumber();
+ if (_isDisabled)
+ return;
+
+ ++_frameCounter;
+ pollChannels();
+ checkChannels();
+
+ if (_v1 == _v2) {
+ if (_resultFlag != -1) {
+ _resultFlag = -1;
+ _pollResult = -1;
+ }
+ } else {
+ if (_v1) {
+ _freqBase1 += _v7;
+ if (!--_v1) {
+ if (!_v2 || _channelNum1 != _channelNum2) {
+ write2(8, 0xA0 + _channelNum1, 0);
+ write2(8, 0xB0 + _channelNum1, 0);
+ }
+ }
+ }
+
+ if (_v2) {
+ _freqBase2 += _v8;
+ if (!--_v2) {
+ if (!_v1 || _channelNum2 != _channelNum1) {
+ write2(8, 0xA0 + _channelNum2, 0);
+ write2(8, 0xB0 + _channelNum2, 0);
+ }
+ }
+ }
+ }
+}
+
+void ASound::pollChannels() {
+ _activeChannelNumber = 0;
+ for (int i = 0; i < ADLIB_CHANNEL_COUNT; ++i) {
+ _activeChannelPtr = &_channels[i];
+ pollActiveChannel();
+ }
+}
+
+void ASound::checkChannels() {
+ if (AdlibChannel::_channelsEnabled) {
+ for (int i = 0; i < ADLIB_CHANNEL_COUNT; ++i)
+ _channels[i].check(_nullData);
+ }
+}
+
+void ASound::pollActiveChannel() {
+ AdlibChannel *chan = _activeChannelPtr;
+
+ if (chan->_activeCount) {
+ if (chan->_field8 > 0 && --chan->_field8 == 0)
+ updateOctave();
+
+ bool updateFlag = true;
+ if (--_activeChannelPtr->_activeCount <= 0) {
+ for (;;) {
+ byte *pSrc = chan->_pSrc;
+ if (!chan->_ptr1) {
+ warning("pollActiveChannel(): No data found for sound channel");
+ break;
+ }
+ if (!(*pSrc & 0x80) || (*pSrc <= 0xF0)) {
+ if (updateFlag)
+ updateActiveChannel();
+
+ chan->_field4 = *pSrc++;
+ chan->_activeCount = *pSrc++;
+ chan->_pSrc += 2;
+
+ if (!chan->_field4 || !chan->_activeCount) {
+ updateOctave();
+ } else {
+ chan->_field8 = chan->_activeCount - chan->_field7;
+ updateChannelState();
+ }
+
+ // Break out of processing loop
+ break;
+ } else {
+ updateFlag = false;
+
+ switch ((~*pSrc) & 0xF) {
+ case 0:
+ if (!chan->_field17) {
+ if (*++pSrc == 0) {
+ chan->_pSrc += 2;
+ chan->_ptr3 = chan->_pSrc;
+ chan->_field17 = 0;
+ } else {
+ chan->_field17 = *pSrc;
+ chan->_pSrc = chan->_ptr3;
+ }
+ } else if (--chan->_field17) {
+ chan->_pSrc = chan->_ptr3;
+ } else {
+ chan->_pSrc += 2;
+ chan->_ptr3 = chan->_pSrc;
+ }
+ break;
+
+ case 1:
+ if (!chan->_field19) {
+ if (*++pSrc == 0) {
+ chan->_pSrc += 2;
+ chan->_ptr4 = chan->_pSrc;
+ chan->_ptr3 = chan->_pSrc;
+ chan->_field17 = 0;
+ chan->_field19 = 0;
+ } else {
+ chan->_field19 = *pSrc;
+ chan->_pSrc = chan->_ptr4;
+ chan->_ptr3 = chan->_ptr4;
+ }
+ } else if (--chan->_field19) {
+ chan->_ptr4 = chan->_pSrc;
+ chan->_ptr3 = chan->_pSrc;
+ } else {
+ chan->_pSrc += 2;
+ chan->_ptr4 = chan->_pSrc;
+ chan->_ptr3 = chan->_pSrc;
+ }
+ break;
+
+ case 2:
+ // Loop sound data
+ chan->_field1 = 0;
+ chan->_field2 = chan->_field3 = 0;
+ chan->_volume = chan->_field7 = 0;
+ chan->_field1D = chan->_field1E = 0;
+ chan->_field8 = 0;
+ chan->_field9 = 0;
+ chan->_fieldB = 0;
+ chan->_field17 = 0;
+ chan->_field19 = 0;
+ chan->_fieldD = 0x40;
+ chan->_ptr1 = chan->_soundData;
+ chan->_pSrc = chan->_soundData;
+ chan->_ptr3 = chan->_soundData;
+ chan->_ptr4 = chan->_soundData;
+
+ chan->_pSrc += 2;
+ break;
+
+ case 3:
+ chan->_sampleIndex = *++pSrc;
+ chan->_pSrc += 2;
+ loadSample(chan->_sampleIndex);
+ break;
+
+ case 4:
+ chan->_field7 = *++pSrc;
+ chan->_pSrc += 2;
+ break;
+
+ case 5:
+ chan->_field1 = *++pSrc;
+ chan->_pSrc += 2;
+ break;
+
+ case 6:
+ ++pSrc;
+ if (chan->_fieldE) {
+ chan->_pSrc += 2;
+ } else {
+ chan->_volume = *pSrc >> 1;
+ updateFlag = true;
+ chan->_pSrc += 2;
+ }
+ break;
+
+ case 7:
+ ++pSrc;
+ if (!chan->_fieldE) {
+ chan->_fieldA = *pSrc;
+ chan->_field2 = *++pSrc;
+ chan->_field9 = 1;
+ }
+
+ chan->_pSrc += 3;
+ break;
+
+ case 8:
+ chan->_field1D = *++pSrc;
+ chan->_pSrc += 2;
+ break;
+
+ case 9: {
+ int v1 = *++pSrc;
+ ++pSrc;
+ int v2 = (v1 - 1) & getRandomNumber();
+ int v3 = pSrc[v2];
+ int v4 = pSrc[v1];
+
+ pSrc[v4 + v1 + 1] = v3;
+ chan->_pSrc += v1 + 3;
+ break;
+ }
+
+ case 10:
+ ++pSrc;
+ if (chan->_fieldE) {
+ chan->_pSrc += 2;
+ } else {
+ chan->_field1E = *pSrc >> 1;
+ updateFlag = true;
+ chan->_pSrc += 2;
+ }
+ break;
+
+ case 11:
+ chan->_fieldD = *++pSrc;
+ updateFlag = true;
+ chan->_pSrc += 2;
+ break;
+
+ case 12:
+ chan->_fieldC = *++pSrc;
+ chan->_field3 = *++pSrc;
+ chan->_fieldB = 1;
+ chan->_pSrc += 2;
+ break;
+
+ case 13:
+ ++pSrc;
+ chan->_pSrc += 2;
+ break;
+
+ case 14:
+ chan->_field1F = *++pSrc;
+ chan->_pSrc += 2;
+ break;
+
+ default:
+ break;
+ }
+ }
+ }
+ }
+
+ if (chan->_field1)
+ updateFNumber();
+
+ updateFlag = false;
+ if (chan->_field9 || chan->_fieldB) {
+ if (!--chan->_field9) {
+ chan->_field9 = chan->_fieldA;
+ if (chan->_field2) {
+ int8 newVal = (int8)chan->_field2 + (int8)chan->_field1E;
+ if (newVal < 0) {
+ chan->_field9 = 0;
+ newVal = 0;
+ } else if (newVal > 63) {
+ chan->_field9 = 0;
+ newVal = 63;
+ }
+
+ chan->_field1E = newVal;
+ updateFlag = true;
+ }
+ }
+
+ if (!--chan->_fieldB) {
+ chan->_fieldB = chan->_fieldC;
+ if (chan->_field3) {
+ chan->_fieldD = chan->_field3;
+ updateFlag = true;
+ }
+ }
+
+ if (updateFlag)
+ updateActiveChannel();
+ }
+ }
+
+ ++_activeChannelNumber;
+}
+
+void ASound::updateOctave() {
+ int reg = 0xB0 + _activeChannelNumber;
+ write2(8, reg, _ports[reg] & 0xDF);
+}
+
+static int _vList1[] = {
+ 0x200, 0x21E, 0x23F, 0x261, 0x285, 0x2AB,
+ 0x2D4, 0x2FF, 0x32D, 0x35D, 0x390, 0x3C7
+};
+
+void ASound::updateChannelState() {
+ updateActiveChannel();
+
+ if (_channelData[_activeChannelNumber]._field0) {
+ if (_channelNum1 == _activeChannelNumber)
+ _stateFlag = 0;
+ if (_channelNum2 == _activeChannelNumber)
+ _stateFlag = 1;
+
+ if (!_stateFlag) {
+ _stateFlag = 1;
+ if (_v1)
+ write2(8, 0xB0 + _channelNum1, _ports[0xB0 + _channelNum1] & 0xDF);
+
+ _channelNum1 = _activeChannelNumber;
+ _v1 = _channelData[_channelNum1]._field0;
+ _freqMask1 = _channelData[_channelNum1]._freqMask;
+ _freqBase1 = _channelData[_channelNum1]._freqBase;
+ _v7 = _channelData[_channelNum1]._field6;
+ } else {
+ _stateFlag = 0;
+ if (_v2)
+ write2(8, 0xB0 + _channelNum2, _ports[0xB0 + _channelNum2] & 0xDF);
+
+ _channelNum2 = _activeChannelNumber;
+ _v2 = _channelData[_channelNum2]._field0;
+ _freqMask2 = _channelData[_channelNum2]._freqMask;
+ _freqBase2 = _channelData[_channelNum2]._freqBase;
+ _v8 = _channelData[_channelNum2]._field6;
+ }
+
+ resultCheck();
+ } else {
+ int reg = 0xA0 + _activeChannelNumber;
+ int vTimes = (_activeChannelPtr->_field4 + _activeChannelPtr->_field1F) / 12;
+ int vOffset = (_activeChannelPtr->_field4 + _activeChannelPtr->_field1F) % 12;
+ int val = _vList1[vOffset] + _activeChannelPtr->_field1D;
+ write2(8, reg, val & 0xFF);
+
+ reg += 0x10;
+ write2(8, reg, (_ports[reg] & 0x20) | (vTimes << 2) | (val >> 8));
+
+ write2(8, reg, _ports[reg] | 0x20);
+ }
+}
+
+static const int outputIndexes[] = {
+ 0, 3, 1, 4, 2, 5, 6, 9, 7, 10, 8, 11, 12, 15, 13, 16, 14, 17
+};
+static const int outputChannels[] = {
+ 0, 1, 2, 3, 4, 5, 8, 9, 10, 11, 12, 13, 16, 17, 18, 19, 20, 21, 0
+};
+static const int volumeList[] = {
+ 0x3F, 0x3F, 0x36, 0x31, 0x2D, 0x2A, 0x28, 0x26, 0x24, 0x22, 0x21, 0x20, 0x1F, 0x1E, 0x1D, 0x1C,
+ 0x1B, 0x1A, 0x19, 0x19, 0x18, 0x17, 0x17, 0x16, 0x16, 0x15, 0x15, 0x14, 0x14, 0x13, 0x12, 0x12,
+ 0x11, 0x11, 0x10, 0x10, 0x0F, 0x0F, 0x0E, 0x0E, 0x0D, 0x0D, 0x0C, 0x0C, 0x0B, 0x0B, 0x0A, 0x0A,
+ 0x0A, 0x09, 0x09, 0x09, 0x09, 0x09, 0x08, 0x08, 0x08, 0x08, 0x08, 0x07, 0x07, 0x07, 0x07, 0x07,
+ 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x04,
+ 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03,
+ 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x01,
+ 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+};
+
+void ASound::updateActiveChannel() {
+ int reg = 0x40 + outputChannels[outputIndexes[_activeChannelNumber * 2 + 1]];
+ int portVal = _ports[reg] & 0xFFC0;
+ int newVolume = CLIP(_activeChannelPtr->_volume + _activeChannelPtr->_field1E, 0, 63);
+
+ // Note: Original had a whole block not seeming to be used, since the initialisation
+ // sets a variable to 5660h, and doesn't change it, so the branch is never taken
+ int val = CLIP(newVolume - volumeList[_activeChannelPtr->_fieldD], 0, 63);
+ val = (63 - val) | portVal;
+
+ int val2 = CLIP(newVolume - volumeList[-(_activeChannelPtr->_fieldD - 127)], 0, 63);
+ val2 = (63 - val2) | portVal;
+ write2(0, reg, val);
+ write2(2, reg, val2);
+}
+
+void ASound::loadSample(int sampleIndex) {
+ _activeChannelReg = 0xB0 + _activeChannelNumber;
+ write2(8, _activeChannelReg, _ports[_activeChannelReg] & 0xDF);
+
+ _activeChannelReg = _activeChannelNumber;
+ _samplePtr = &_samples[sampleIndex * 2];
+ _v11 = outputChannels[outputIndexes[_activeChannelReg * 2]];
+ processSample();
+
+ AdlibChannelData &cd = _channelData[_activeChannelNumber];
+ cd._field6 = _samplePtr->_field14;
+ cd._freqBase = _samplePtr->_freqBase;
+ cd._freqMask = _samplePtr->_freqMask;
+ cd._field0 = _samplePtr->_fieldE;
+
+ _samplePtr = &_samples[sampleIndex * 2 + 1];
+ _v11 = outputChannels[outputIndexes[_activeChannelReg * 2 + 1]];
+ processSample();
+}
+
+void ASound::processSample() {
+ // Write out vib flags and split point
+ write2(8, 0x40 + _v11, 0x3F);
+ int depthRhythm = (_ports[0xBD] & 0x3F) | (_amDep ? 0x80 : 0) |
+ (_vibDep ? 0x40 : 0);
+ write2(8, 0xBD, depthRhythm);
+ write2(8, 8, _splitPoint ? 0x40 : 0);
+
+ // Write out feedback & Alg
+ int val = (_samplePtr->_feedback << 1) | (1 - _samplePtr->_alg);
+ write2(8, 0xC0 + _activeChannelReg, val);
+
+ // Write out attack/decay rate
+ val = (_samplePtr->_attackRate << 4) | (_samplePtr->_decayRate & 0xF);
+ write2(8, 0x60 + _v11, val);
+
+ // Write out sustain level/release rate
+ val = (_samplePtr->_sustainLevel << 4) | (_samplePtr->_releaseRate & 0xF);
+ write2(8, 0x80 + _v11, val);
+
+ // Write out misc flags
+ val = (_samplePtr->_ampMod ? 0x80 : 0) | (_samplePtr->_vib ? 0x40 : 0)
+ | (_samplePtr->_egTyp ? 0x20 : 0) | (_samplePtr->_ksr ? 0x10 : 0)
+ | (_samplePtr->_freqMultiple & 0xF);
+ write2(8, 0x20 + _v11, val);
+
+ // Write out waveform select
+ write2(8, 0xE0 + _v11, _samplePtr->_waveformSelect & 3);
+
+ // Write out total level & scaling level
+ val = -((_samplePtr->_totalLevel & 0x3F) - 0x3F) | (_samplePtr->_scalingLevel << 6);
+ write2(8, 0x40 + _v11, val);
+}
+
+void ASound::updateFNumber() {
+ int loReg = 0xA0 + _activeChannelNumber;
+ int hiReg = 0xB0 + _activeChannelNumber;
+ int val1 = (_ports[hiReg] & 0x1F) << 8;
+ val1 += _ports[loReg] + _activeChannelPtr->_field1;
+ write2(8, loReg, val1);
+
+ int val2 = (_ports[hiReg] & 0x20) | (val1 >> 8);
+ write2(8, hiReg, val2);
+}
+
+int ASound::readBuffer(int16 *buffer, const int numSamples) {
+ Common::StackLock slock(_driverMutex);
+
+ int32 samplesLeft = numSamples;
+ memset(buffer, 0, sizeof(int16) * numSamples);
+ while (samplesLeft) {
+ if (!_samplesTillCallback) {
+ poll();
+ 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;
+}
+
+int ASound::command0() {
+ bool isDisabled = _isDisabled;
+ _isDisabled = true;
+
+ for (int i = 0; i < ADLIB_CHANNEL_COUNT; ++i)
+ _channels[i].reset();
+
+ _v1 = 0;
+ _v2 = 0;
+ _freqMask1 = _freqMask2 = 0;
+ _freqBase1 = _freqBase2 = 0;
+ _v7 = 0;
+ _v8 = 0;
+
+ // Reset Adlib port registers
+ for (int reg = 0x4F; reg >= 0x40; --reg)
+ write2(8, reg, 0x3F);
+ for (int reg = 0xFF; reg >= 0x60; --reg)
+ write2(8, reg, 0);
+ for (int reg = 0x3F; reg > 0; --reg)
+ write2(8, reg, 0);
+ write2(8, 1, 0x20);
+
+ _isDisabled = isDisabled;
+ return 0;
+}
+
+int ASound::command1() {
+ for (int i = 0; i < ADLIB_CHANNEL_COUNT; ++i)
+ _channels[i].enable(0xFF);
+ return 0;
+}
+
+int ASound::command2() {
+ for (int i = 0; i < ADLIB_CHANNEL_MIDWAY; ++i)
+ _channels[i].setPtr2(_nullData);
+ return 0;
+}
+
+int ASound::command3() {
+ for (int i = 0; i < ADLIB_CHANNEL_MIDWAY; ++i)
+ _channels[i].enable(0xFF);
+ return 0;
+}
+
+int ASound::command4() {
+ for (int i = ADLIB_CHANNEL_MIDWAY; i < ADLIB_CHANNEL_COUNT; ++i)
+ _channels[i].setPtr2(_nullData);
+ return 0;
+}
+
+int ASound::command5() {
+ for (int i = 5; i < ADLIB_CHANNEL_COUNT; ++i)
+ _channels[i].enable(0xFF);
+ return 0;
+}
+
+int ASound::command6() {
+ _v9 = _v1;
+ _v1 = 0;
+ _v10 = _v2;
+ _v2 = 0;
+
+ channelOff(0x43);
+ channelOff(0x44);
+ channelOff(0x45);
+ channelOff(0x4B);
+ channelOff(0x4C);
+ channelOff(0x4D);
+ channelOff(0x53);
+ channelOff(0x54);
+ channelOff(0x55);
+
+ return 0;
+}
+
+int ASound::command7() {
+ channelOn(0x43, _channels[0]._volume);
+ channelOn(0x44, _channels[1]._volume);
+ channelOn(0x45, _channels[2]._volume);
+ channelOn(0x4B, _channels[3]._volume);
+ channelOn(0x4C, _channels[4]._volume);
+ channelOn(0x4D, _channels[5]._volume);
+
+ _v1 = _v9;
+ _v2 = _v10;
+
+ if (_v9 != _v10)
+ resultCheck();
+
+ _isDisabled = 0;
+ return _v10;
+}
+
+int ASound::command8() {
+ int result = 0;
+ for (int i = 0; i < ADLIB_CHANNEL_COUNT; ++i)
+ result |= _channels[i]._activeCount;
+
+ return result;
+}
+
+/*-----------------------------------------------------------------------*/
+
+const ASound1::CommandPtr ASound1::_commandList[42] = {
+ &ASound1::command0, &ASound1::command1, &ASound1::command2, &ASound1::command3,
+ &ASound1::command4, &ASound1::command5, &ASound1::command6, &ASound1::command7,
+ &ASound1::command8, &ASound1::command9, &ASound1::command10, &ASound1::command11,
+ &ASound1::command12, &ASound1::command13, &ASound1::command14, &ASound1::command15,
+ &ASound1::command16, &ASound1::command17, &ASound1::command18, &ASound1::command19,
+ &ASound1::command20, &ASound1::command21, &ASound1::command22, &ASound1::command23,
+ &ASound1::command24, &ASound1::command25, &ASound1::command26, &ASound1::command27,
+ &ASound1::command28, &ASound1::command29, &ASound1::command30, &ASound1::command31,
+ &ASound1::command32, &ASound1::command33, &ASound1::command34, &ASound1::command35,
+ &ASound1::command36, &ASound1::command37, &ASound1::command38, &ASound1::command39,
+ &ASound1::command40, &ASound1::command41
+};
+
+ASound1::ASound1(Audio::Mixer *mixer)
+ : ASound(mixer, "asound.001", 0x1520) {
+ _cmd23Toggle = false;
+
+ // Load sound samples
+ _soundFile.seek(_dataOffset + 0x12C);
+ for (int i = 0; i < 98; ++i)
+ _samples.push_back(AdlibSample(_soundFile));
+}
+
+int ASound1::command(int commandId, int param) {
+ if (commandId > 41)
+ return 0;
+
+ _commandParam = param;
+ _frameCounter = 0;
+ return (this->*_commandList[commandId])();
+}
+
+int ASound1::command9() {
+ playSound(0xC68, 12);
+ return 0;
+}
+
+int ASound1::command10() {
+ byte *pData1 = loadData(0x130E, 48);
+ if (!isSoundActive(pData1)) {
+ command1();
+ _channels[0].load(pData1);
+ _channels[1].load(loadData(0x133E, 392));
+ _channels[2].load(loadData(0x14C6, 46));
+ _channels[3].load(loadData(0x14F4, 48));
+ }
+
+ return 0;
+}
+
+int ASound1::command11() {
+ command111213();
+ _channels[0]._field1E = 0;
+ _channels[1]._field1E = 0;
+ return 0;
+}
+
+int ASound1::command12() {
+ command111213();
+ _channels[0]._field1E = 40;
+ _channels[1]._field1E = 0;
+ return 0;
+}
+
+int ASound1::command13() {
+ command111213();
+ _channels[0]._field1E = 40;
+ _channels[1]._field1E = 50;
+ return 0;
+}
+
+int ASound1::command14() {
+ playSound(0x1216, 248);
+ return 0;
+}
+
+int ASound1::command15() {
+ byte *pData1 = loadData(0x1524, 152);
+ if (!isSoundActive(pData1)) {
+ command1();
+ _channels[4].load(pData1);
+ _channels[5].load(loadData(0x15BC, 94));
+ _channels[6].load(loadData(0x161A, 94));
+ _channels[7].load(loadData(0x1678, 42));
+ _channels[8].load(loadData(0x16A2, 42));
+ }
+
+ return 0;
+}
+
+int ASound1::command16() {
+ playSound(0xC74, 14);
+ return 0;
+}
+
+int ASound1::command17() {
+ playSound(0xE9A, 10);
+ return 0;
+}
+
+int ASound1::command18() {
+ command1();
+ playSound(0xCA6, 20);
+ return 0;
+}
+
+int ASound1::command19() {
+ command1();
+ playSound(0xCBA, 74);
+ return 0;
+}
+
+int ASound1::command20() {
+ byte *pData = loadData(0xD18, 28);
+ if (!isSoundActive(pData))
+ playSoundData(pData);
+ return 0;
+}
+
+int ASound1::command21() {
+ playSound(0xD04, 20);
+ return 0;
+}
+
+int ASound1::command22() {
+ byte *pData = loadData(0xD34, 10);
+ pData[6] = (getRandomNumber() & 7) + 85;
+
+ if (!isSoundActive(pData))
+ playSoundData(pData);
+
+ return 0;
+}
+
+int ASound1::command23() {
+ _cmd23Toggle = !_cmd23Toggle;
+ playSound(_cmd23Toggle ? 0xD3E : 0xD46, 8);
+ return 0;
+}
+
+int ASound1::command24() {
+ playSound(0xD4E, 18);
+ playSound(0xD60, 20);
+ playSound(0xD74, 14);
+ return 0;
+}
+
+int ASound1::command25() {
+ byte *pData = loadData(0xD82, 16);
+ if (!isSoundActive(pData))
+ playSoundData(pData);
+
+ return 0;
+}
+
+int ASound1::command26() {
+ byte *pData = loadData(0xEEC, 10);
+ pData[5] = (command2627293032() + 0x7F) & 0xFF;
+
+ if (!isSoundActive(pData))
+ _channels[6].load(pData);
+
+ return 0;
+}
+
+int ASound1::command27() {
+ byte *pData = loadData(0xEE2, 10);
+ pData[5] = (command2627293032() + 0x40) & 0xFF;
+
+ if (!isSoundActive(pData))
+ _channels[7].load(pData);
+
+ return 0;
+}
+
+int ASound1::command28() {
+ playSound(0xD92, 28);
+ return 0;
+}
+
+int ASound1::command29() {
+ byte *pData = loadData(0xC82, 36);
+ byte v = (command2627293032() + 0x40) & 0xFF;
+ pData[7] = pData[13] = pData[21] = pData[27] = v;
+
+ if (!isSoundActive(pData))
+ playSoundData(pData, 0);
+
+ return 0;
+}
+
+int ASound1::command30() {
+ byte *pData = loadData(0xEA6, 16);
+ pData[7] = (command2627293032() + 0x40) & 0xFF;
+
+ if (!isSoundActive(pData))
+ playSoundData(pData, 0);
+
+ return 0;
+}
+
+int ASound1::command31() {
+ byte *pData = loadData(0xDAE, 14);
+ if (!isSoundActive(pData))
+ playSoundData(pData);
+
+ return 0;
+}
+
+int ASound1::command32() {
+ byte *pData = loadData(0xEB4, 46);
+ int v = command2627293032() + 0x40;
+ pData[9] = pData[17] = pData[25] = pData[33] = v & 0xFF;
+ pData[11] = pData[19] = pData[27] = pData[35] = v >> 8;
+
+ if (!isSoundActive(pData))
+ playSoundData(pData, 0);
+
+ return 0;
+}
+
+int ASound1::command33() {
+ playSound(0xDBC, 10);
+ playSound(0xDC6, 10);
+ return 0;
+}
+
+int ASound1::command34() {
+ int v = getRandomNumber() & 0x20;
+ if (!v)
+ v = 0x60;
+
+ byte *pData = loadData(0xDD0, 22);
+ pData[8] = pData[15] = v;
+ playSoundData(pData);
+ return 0;
+}
+
+int ASound1::command35() {
+ playSound(0xDE6, 16);
+ return 0;
+}
+
+int ASound1::command36() {
+ playSound(0xE10, 10);
+ command34();
+
+ return 0;
+}
+
+int ASound1::command37() {
+ playSound(0xE1A, 14);
+ return 0;
+}
+
+int ASound1::command38() {
+ playSound(0xE28, 114);
+ return 0;
+}
+
+int ASound1::command39() {
+ byte *pData1 = loadData(0x16CC, 82);
+ if (!isSoundActive(pData1)) {
+ _channels[5].load(pData1);
+ _channels[6].load(loadData(0x171E, 30));
+ _channels[7].load(loadData(0x173C, 40));
+ _channels[8].load(loadData(0x1764, 64));
+ }
+ return 0;
+}
+
+int ASound1::command40() {
+ playSound(0xDF6, 26);
+ return 0;
+}
+
+int ASound1::command41() {
+ playSound(0xC32, 34);
+ playSound(0xC54, 20);
+ return 0;
+}
+
+void ASound1::command111213() {
+ byte *pData1 = loadData(0xEF6, 408);
+ if (!isSoundActive(pData1)) {
+ command1();
+ _channels[0].load(pData1);
+ _channels[1].load(loadData(0x108E, 266));
+ _channels[2].load(loadData(0x1198, 66));
+ _channels[2].load(loadData(0x11DA, 60));
+ }
+}
+
+int ASound1::command2627293032() {
+ return (_commandParam > 0x40) ? _commandParam - 0x40 : _commandParam & 0xff00;
+}
+
+
+/*-----------------------------------------------------------------------*/
+
+const ASound2::CommandPtr ASound2::_commandList[44] = {
+ &ASound2::command0, &ASound2::command1, &ASound2::command2, &ASound2::command3,
+ &ASound2::command4, &ASound2::command5, &ASound2::command6, &ASound2::command7,
+ &ASound2::command8, &ASound2::command9, &ASound2::command10, &ASound2::command11,
+ &ASound2::command12, &ASound2::command13, &ASound2::command14, &ASound2::command15,
+ &ASound2::command16, &ASound2::command17, &ASound2::command18, &ASound2::command19,
+ &ASound2::command20, &ASound2::command21, &ASound2::command22, &ASound2::command23,
+ &ASound2::command24, &ASound2::command25, &ASound2::command26, &ASound2::command27,
+ &ASound2::command28, &ASound2::command29, &ASound2::command30, &ASound2::command31,
+ &ASound2::command32, &ASound2::command33, &ASound2::command34, &ASound2::command35,
+ &ASound2::command36, &ASound2::command37, &ASound2::command38, &ASound2::command39,
+ &ASound2::command40, &ASound2::command41, &ASound2::command42, &ASound2::command43
+};
+
+ASound2::ASound2(Audio::Mixer *mixer) : ASound(mixer, "asound.002", 0x15E0) {
+ _command12Param = 0xFD;
+
+ // Load sound samples
+ _soundFile.seek(_dataOffset + 0x144);
+ for (int i = 0; i < 164; ++i)
+ _samples.push_back(AdlibSample(_soundFile));
+}
+
+int ASound2::command(int commandId, int param) {
+ if (commandId > 43)
+ return 0;
+
+ _frameCounter = 0;
+ return (this->*_commandList[commandId])();
+}
+
+int ASound2::command0() {
+ _command12Param = 0xFD;
+ return ASound::command0();
+}
+
+int ASound2::command9() {
+ byte *pData1 = loadData(0x1094, 376);
+ if (!isSoundActive(pData1)) {
+ command1();
+ _channels[0].load(pData1);
+ _channels[2].load(loadData(0x123E, 130));
+
+ command9Randomize();
+ _channels[1].load(loadData(0x120C, 50));
+ }
+ return 0;
+}
+
+void ASound2::command9Randomize() {
+ // Randomization
+ int v;
+ while (((v = getRandomNumber()) & 0x3F) > 36)
+ ;
+
+ byte *pData = loadData(0x120C, 50);
+ command9Apply(pData, v + 20, -1);
+ command9Apply(pData + 1, 10 - ((v + 1) / 6), 1);
+}
+
+void ASound2::command9Apply(byte *data, int val, int incr) {
+ data += 8;
+ for (int ctr = 0; ctr < 10; ++ctr, data += 4, val += incr) {
+ *data = val;
+ }
+}
+
+int ASound2::command10() {
+ byte *pData1 = loadData(0x12C0, 60);
+ if (!isSoundActive(pData1)) {
+ command1();
+ _channels[0].load(pData1);
+ _channels[1].load(loadData(0x12FC, 318));
+ _channels[2].load(loadData(0x143A, 110));
+ }
+
+ return 0;
+}
+
+int ASound2::command11() {
+ byte *pData = loadData(0x14A8, 170);
+ if (!isSoundActive(pData)) {
+ playSoundData(pData);
+ playSoundData(loadData(0x1552, 1802));
+ playSoundData(loadData(0x1C5C, 716));
+ playSoundData(loadData(0x1F28, 106));
+ }
+
+ return 0;
+}
+
+int ASound2::command12() {
+ _command12Param += 26;
+ byte v = _command12Param & 0x7f;
+
+ byte *pData = loadData(0x4A5E, 38);
+ pData[5] = pData[20] = v;
+ playSoundData(pData);
+
+ pData = loadData(0x4A84, 30);
+ pData[5] = pData[18] = v;
+ playSoundData(pData);
+
+ return 0;
+}
+
+int ASound2::command13() {
+ playSoundData(loadData(0x4AA2, 20));
+ playSoundData(loadData(0x4AB6, 20));
+
+ return 0;
+}
+
+int ASound2::command14() {
+ playSound(0x4ACA, 40);
+ playSound(0x4AF2, 42);
+
+ return 0;
+}
+
+int ASound2::command15() {
+ byte *pData1 = loadData(0x1F92, 1074);
+ if (!isSoundActive(pData1)) {
+ command1();
+ playSoundData(pData1);
+ playSound(0x23C4, 1050);
+ playSound(0x27DE, 58);
+ playSound(0x2818, 712);
+ playSound(0x2AE0, 256);
+ }
+
+ return 0;
+}
+
+int ASound2::command16() {
+ byte *pData1 = loadData(0x3960, 280);
+ if (!isSoundActive(pData1)) {
+ command1();
+ playSoundData(pData1);
+ playSound(0x3A78, 266);
+ playSound(0x3B72, 322);
+ playSound(0x3CC4, 488);
+ playSound(0x3EAC, 104);
+ playSound(0x3F14, 104);
+ }
+
+ return 0;
+}
+
+int ASound2::command17() {
+ byte *pData1 = loadData(0x3F7C, 432);
+ if (!isSoundActive(pData1)) {
+ command1();
+ playSoundData(pData1);
+ playSound(0x412C, 422);
+ playSound(0x42D2, 424);
+ playSound(0x447A, 418);
+ }
+
+ return 0;
+}
+
+static const int command18_list[16][2] = {
+ { 0x337C, 28 }, { 0x3398, 26 }, { 0x33B2, 26 }, { 0x33CC, 26 },
+ { 0x33E6, 56 }, { 0x341E, 46 }, { 0x344C, 56 }, { 0x3484, 22 },
+ { 0x349A, 38 }, { 0x34C0, 62 }, { 0x34FE, 26 }, { 0x3518, 26 },
+ { 0x3532, 26 }, { 0x354C, 26 }, { 0x3566, 32 }, { 0x3586, 24 }
+};
+
+int ASound2::command18() {
+ if (_channels[3]._activeCount == 0) {
+ int idx = (getRandomNumber() & 0x1E) >> 1;
+ byte *pData = loadData(command18_list[idx][0], command18_list[idx][1]);
+ _channels[3].load(pData);
+ }
+
+ return 0;
+}
+
+int ASound2::command19() {
+ byte *pData1 = loadData(0x2BE0, 366);
+ if (!isSoundActive(pData1)) {
+ command1();
+ playSoundData(pData1);
+ playSound(0x2D4E, 460);
+ playSound(0x2F1A, 266);
+ playSound(0x3024, 328);
+ playSound(0x316C, 162);
+ playSound(0x320E, 366);
+ }
+
+ return 0;
+}
+
+int ASound2::command20() {
+ playSound(0x4A36, 40);
+
+ return 0;
+}
+
+int ASound2::command21() {
+ playSound(0x49DE, 16);
+ playSound(0x49EE, 16);
+ playSound(0x49FF, 16);
+
+ return 0;
+}
+
+int ASound2::command22() {
+ playSound(0x4A0E, 24);
+ playSound(0x4A26, 16);
+
+ return 0;
+}
+
+int ASound2::command23() {
+ playSound(0x49B6, 16);
+
+ return 0;
+}
+
+int ASound2::command24() {
+ playSound(0x49C6, 24);
+
+ return 0;
+}
+
+int ASound2::command25() {
+ playSound(0x49AC, 10);
+
+ return 0;
+}
+
+int ASound2::command26() {
+ playSound(0x498A, 14);
+ playSound(0x4998, 20);
+
+ return 0;
+}
+
+int ASound2::command27() {
+ playSound(0x4912, 80);
+ playSound(0x4962, 40);
+
+ return 0;
+}
+
+int ASound2::command28() {
+ playSound(0x48E8, 28);
+ playSound(0x4904, 14);
+
+ return 0;
+}
+
+int ASound2::command29() {
+ playSound(0x48B2, 22);
+
+ return 0;
+}
+
+int ASound2::command30() {
+ playSound(0x4870, 22);
+ playSound(0x4886, 22);
+ playSound(0x489C, 22);
+
+ return 0;
+}
+
+int ASound2::command31() {
+ playSound(0x482E, 22);
+ playSound(0x4844, 22);
+ playSound(0x489C, 22);
+
+ return 0;
+}
+
+int ASound2::command32() {
+ playSound(0x46E8, 10);
+
+ return 0;
+}
+
+int ASound2::command33() {
+ playSound(0x46D8, 16);
+
+ return 0;
+}
+
+int ASound2::command34() {
+ playSound(0x46C8, 16);
+
+ return 0;
+}
+
+int ASound2::command35() {
+ playSound(0x46B2, 22);
+
+ return 0;
+}
+
+int ASound2::command36() {
+ playSound(0x4624, 16);
+
+ return 0;
+}
+
+int ASound2::command37() {
+ playSound(0x4674, 20);
+ playSound(0x4688, 32);
+ playSound(0x46A8, 10);
+
+ return 0;
+}
+
+int ASound2::command38() {
+ byte *pData1 = loadData(0x359E, 202);
+ if (!isSoundActive(pData1)) {
+ command1();
+ playSoundData(pData1);
+ playSound(0x3668, 220);
+ playSound(0x3744, 124);
+ playSound(0x37C0, 162);
+ playSound(0x3862, 78);
+ playSound(0x38B0, 176);
+ }
+
+ return 0;
+}
+
+int ASound2::command39() {
+ byte *pData = loadData(0x466A, 10);
+ pData[6] = (getRandomNumber() & 7) + 85;
+ playSoundData(pData);
+
+ return 0;
+}
+
+int ASound2::command40() {
+ playSound(0x4634, 34);
+ playSound(0x4656, 20);
+
+ return 0;
+}
+
+int ASound2::command41() {
+ playSound(0x48C8, 32);
+
+ return 0;
+}
+
+int ASound2::command42() {
+ playSound(0x46F2, 156);
+ playSound(0x478E, 160);
+
+ return 0;
+}
+
+int ASound2::command43() {
+ playSound(0x4B1C, 40);
+ playSound(0x4B44, 41);
+
+ return 0;
+}
+
+/*-----------------------------------------------------------------------*/
+
+const ASound3::CommandPtr ASound3::_commandList[61] = {
+ &ASound3::command0, &ASound3::command1, &ASound3::command2, &ASound3::command3,
+ &ASound3::command4, &ASound3::command5, &ASound3::command6, &ASound3::command7,
+ &ASound3::command8, &ASound3::command9, &ASound3::command10, &ASound3::command11,
+ &ASound3::nullCommand, &ASound3::command13, &ASound3::command14, &ASound3::command15,
+ &ASound3::command16, &ASound3::command17, &ASound3::command18, &ASound3::command19,
+ &ASound3::command20, &ASound3::command21, &ASound3::command22, &ASound3::command23,
+ &ASound3::command24, &ASound3::command25, &ASound3::command26, &ASound3::command27,
+ &ASound3::command28, &ASound3::command29, &ASound3::command30, &ASound3::command31,
+ &ASound3::command32, &ASound3::command33, &ASound3::command34, &ASound3::command35,
+ &ASound3::command36, &ASound3::command37, &ASound3::command38, &ASound3::command39,
+ &ASound3::command40, &ASound3::command41, &ASound3::command42, &ASound3::command43,
+ &ASound3::command44, &ASound3::command45, &ASound3::command46, &ASound3::command47,
+ &ASound3::nullCommand, &ASound3::command49, &ASound3::command50, &ASound3::command51,
+ &ASound3::nullCommand, &ASound3::nullCommand, &ASound3::nullCommand, &ASound3::nullCommand,
+ &ASound3::nullCommand, &ASound3::command57, &ASound3::nullCommand, &ASound3::command59,
+ &ASound3::command60
+};
+
+ASound3::ASound3(Audio::Mixer *mixer) : ASound(mixer, "asound.003", 0x15B0) {
+ _command39Flag = false;
+
+ // Load sound samples
+ _soundFile.seek(_dataOffset + 0x122);
+ for (int i = 0; i < 192; ++i)
+ _samples.push_back(AdlibSample(_soundFile));
+}
+
+int ASound3::command(int commandId, int param) {
+ if (commandId > 60)
+ return 0;
+
+ _commandParam = param;
+ _frameCounter = 0;
+ return (this->*_commandList[commandId])();
+}
+
+int ASound3::command9() {
+ AdlibChannel::_channelsEnabled = _commandParam != 0;
+
+ return 0;
+}
+
+int ASound3::command10() {
+ byte *pData1 = loadData(0x13EA, 254);
+ if (!isSoundActive(pData1)) {
+ command1();
+ _channels[0].load(pData1);
+ _channels[1].load(loadData(0X14E8, 452));
+ _channels[2].load(loadData(0x16AC, 396));
+ _channels[3].load(loadData(0x1838, 118));
+ _channels[4].load(loadData(0x18AE, 74));
+ }
+
+ return 0;
+}
+
+int ASound3::command11() {
+ byte *pData1 = loadData(0x2B84, 596);
+ if (!isSoundActive(pData1)) {
+ command1();
+ _channels[0].load(pData1);
+ _channels[1].load(loadData(0x2DD8, 562));
+ _channels[2].load(loadData(0x300A, 1694));
+ _channels[3].load(loadData(0x36A8, 1100));
+ _channels[4].load(loadData(0x3AF4, 420));
+ _channels[5].load(loadData(0x3C98, 1516));
+ }
+
+ return 0;
+}
+
+int ASound3::command13() {
+ byte *pData1 = loadData(0x4470, 64);
+ if (!isSoundActive(pData1)) {
+ command1();
+ playSoundData(pData1);
+ playSound(0x44B0, 64);
+ playSound(0x44F0, 64);
+ playSound(0x4530, 64);
+ playSound(0x4570, 64);
+ playSound(0X45b0, 64);
+ }
+
+ return 0;
+}
+
+int ASound3::command14() {
+ byte *pData1 = loadData(0X45F0, 36);
+ if (!isSoundActive(pData1)) {
+ command1();
+ playSoundData(pData1);
+ playSound(0x4614, 36);
+ playSound(0x4638, 36);
+ playSound(0x465C, 32);
+ playSound(0x467C, 76);
+ playSound(0x46C8, 74);
+ }
+
+ return 0;
+}
+
+int ASound3::command15() {
+ _channels[3].load(loadData(0x36A8, 1100));
+ _channels[4].load(loadData(0x3AF4, 420));
+ _channels[5].load(loadData(0x3C98, 1516));
+
+ _channels[3]._field20 = 0xDD;
+ _channels[4]._field20 = 0xDD;
+ _channels[5]._field20 = 0xDD;
+
+ return 0;
+}
+
+int ASound3::command16() {
+ byte *pData1 = loadData(0x4712, 398);
+ if (!isSoundActive(pData1)) {
+ command1();
+ _channels[0].load(pData1);
+ _channels[1].load(loadData(0x48A0, 354));
+ _channels[2].load(loadData(0x4A02, 410));
+ _channels[3].load(loadData(0x4B9C, 392));
+ }
+
+ return 0;
+}
+
+int ASound3::command17() {
+ byte *pData1 = loadData(0x18F8, 400);
+ if (!isSoundActive(pData1)) {
+ command1();
+ _channels[0].load(pData1);
+ _channels[1].load(loadData(0x1A88, 680));
+ _channels[2].load(loadData(0x1D30, 478));
+ _channels[3].load(loadData(0x1F0E, 1146));
+ _channels[4].load(loadData(0x2388, 1006));
+ _channels[5].load(loadData(0x2776, 1038));
+ }
+
+ return 0;
+}
+
+int ASound3::command18() {
+ byte *pData1 = loadData(0x4284, 142);
+ if (!isSoundActive(pData1)) {
+ command1();
+ playSoundData(pData1);
+ playSound(0x4312, 172);
+ playSound(0x43BE, 88);
+ playSound(0x4416, 90);
+ }
+
+ return 0;
+}
+
+int ASound3::command19() {
+ playSound(0x4F6, 8);
+
+ return 0;
+}
+
+int ASound3::command20() {
+ playSound(0x4F1C, 10);
+
+ return 0;
+}
+
+int ASound3::command21() {
+ playSound(0x4F2E, 8);
+
+ return 0;
+}
+
+int ASound3::command22() {
+ playSound(0x4F36, 16);
+
+ return 0;
+}
+
+int ASound3::command23() {
+ playSound(0x4F50, 10);
+ playSound(0x4F46, 10);
+
+ return 0;
+}
+
+int ASound3::command24() {
+ // WORKAROUND: Original calls isSoundActive without loading data pointer
+ byte *pData = loadData(0x4EFC, 12);
+ if (!isSoundActive(pData)) {
+ int v;
+ while ((v = (getRandomNumber() & 0x3F)) > 45)
+ ;
+
+ pData[6] = v + 19;
+ playSoundData(pData);
+ }
+
+ return 0;
+}
+
+int ASound3::command25() {
+ playSound(0x4EE6, 22);
+
+ return 0;
+}
+
+int ASound3::command26() {
+ playSound(0x4F5A, 8);
+
+ return 0;
+}
+
+int ASound3::command27() {
+ playSound(0x4DA2, 34);
+ playSound(0x4DC4, 20);
+
+ return 0;
+}
+
+int ASound3::command28() {
+ playSound(0x4F72, 10);
+ playSound(0x4F72, 10);
+
+ return 0;
+}
+
+int ASound3::command29() {
+ playSound(0x4F72, 10);
+ playSound(0x4F72, 10);
+
+ return 0;
+}
+
+int ASound3::command30() {
+ playSound(0x4E5A, 22);
+ playSound(0x4E70, 22);
+ playSound(0x4E86, 22);
+
+ return 0;
+}
+
+int ASound3::command31() {
+ playSound(0x4F7C, 40);
+
+ return 0;
+}
+
+int ASound3::command32() {
+ playSound(0x4ED2, 10);
+
+ return 0;
+}
+
+int ASound3::command33() {
+ playSound(0x4EC2, 16);
+
+ return 0;
+}
+
+int ASound3::command34() {
+ playSound(0x4EB2, 16);
+
+ return 0;
+}
+
+int ASound3::command35() {
+ playSound(0x4E9C, 22);
+
+ return 0;
+}
+
+int ASound3::command36() {
+ playSound(0x4D2C, 16);
+
+ return 0;
+}
+
+int ASound3::command37() {
+ playSound(0x4E1E, 20);
+ playSound(0x4E32, 30);
+ playSound(0x4E50, 10);
+
+ return 0;
+}
+
+int ASound3::command38() {
+ playSound(0x4FAC, 10);
+
+ return 0;
+}
+
+int ASound3::command39() {
+ _command39Flag = !_command39Flag;
+ if (_command39Flag) {
+ playSound(0x4FD0, 8);
+ } else {
+ playSound(0x4FD8, 8);
+ }
+
+ return 0;
+}
+
+int ASound3::command40() {
+ _command39Flag = !_command39Flag;
+ if (_command39Flag) {
+ playSound(0x4EE0, 8);
+ } else {
+ playSound(0x4EE8, 8);
+ }
+
+ return 0;
+}
+
+int ASound3::command41() {
+ playSound(0x4F08, 20);
+
+ return 0;
+}
+
+int ASound3::command42() {
+ playSound(0x4DD8, 28);
+ playSound(0x4DF4, 42);
+
+ return 0;
+}
+
+int ASound3::command43() {
+ playSound(0x4FB6, 12);
+ playSound(0x4FC2, 14);
+
+ return 0;
+}
+
+int ASound3::command44() {
+ playSound(0x4FFE, 14);
+
+ return 0;
+}
+
+int ASound3::command45() {
+ playSound(0x500C, 14);
+
+ return 0;
+}
+
+int ASound3::command46() {
+ playSound(0x4D78, 14);
+ playSound(0x4D86, 14);
+ playSound(0x4D94, 14);
+
+ return 0;
+}
+
+int ASound3::command47() {
+ playSound(0x4D62, 8);
+ playSound(0x4D6A, 14);
+
+ return 0;
+}
+
+int ASound3::command49() {
+ playSound(0x4D62, 8);
+ playSound(0x4D6A, 14);
+
+ return 0;
+}
+
+int ASound3::command50() {
+ playSound(0x4D3C, 14);
+ playSound(0x4D4A, 14);
+ playSound(0x4D58, 10);
+
+ return 0;
+}
+
+int ASound3::command51() {
+ playSound(0x4FF0, 14);
+
+ return 0;
+}
+
+int ASound3::command57() {
+ byte *pData = loadData(0x4EDC, 10);
+ pData[6] = (getRandomNumber() & 7) + 85;
+ playSoundData(pData);
+
+ return 0;
+}
+
+int ASound3::command59() {
+ playSound(0x4F62, 16);
+
+ return 0;
+}
+
+int ASound3::command60() {
+ playSound(0x4FA4, 8);
+
+ return 0;
+}
+
+/*-----------------------------------------------------------------------*/
+
+const ASound4::CommandPtr ASound4::_commandList[61] = {
+ &ASound4::command0, &ASound4::command1, &ASound4::command2, &ASound4::command3,
+ &ASound4::command4, &ASound4::command5, &ASound4::command6, &ASound4::command7,
+ &ASound4::command8, &ASound4::nullCommand, &ASound4::command10, &ASound4::nullCommand,
+ &ASound4::command12, &ASound4::nullCommand, &ASound4::nullCommand, &ASound4::nullCommand,
+ &ASound4::nullCommand, &ASound4::nullCommand, &ASound4::nullCommand, &ASound4::command19,
+ &ASound4::command20, &ASound4::command21, &ASound4::nullCommand, &ASound4::nullCommand,
+ &ASound4::command24, &ASound4::nullCommand, &ASound4::nullCommand, &ASound4::command27,
+ &ASound4::nullCommand, &ASound4::nullCommand, &ASound4::command30, &ASound4::nullCommand,
+ &ASound4::command32, &ASound4::command33, &ASound4::command34, &ASound4::command35,
+ &ASound4::command36, &ASound4::command37, &ASound4::command38, &ASound4::nullCommand,
+ &ASound4::nullCommand, &ASound4::nullCommand, &ASound4::nullCommand, &ASound4::command43,
+ &ASound4::nullCommand, &ASound4::nullCommand, &ASound4::nullCommand, &ASound4::nullCommand,
+ &ASound4::nullCommand, &ASound4::nullCommand, &ASound4::nullCommand, &ASound4::nullCommand,
+ &ASound4::nullCommand, &ASound4::nullCommand, &ASound4::nullCommand, &ASound4::nullCommand,
+ &ASound4::nullCommand, &ASound4::command57, &ASound4::nullCommand, &ASound4::command59,
+ &ASound4::command60
+};
+
+ASound4::ASound4(Audio::Mixer *mixer) : ASound(mixer, "asound.004", 0x14F0) {
+ // Load sound samples
+ _soundFile.seek(_dataOffset + 0x122);
+ for (int i = 0; i < 210; ++i)
+ _samples.push_back(AdlibSample(_soundFile));
+}
+
+int ASound4::command(int commandId, int param) {
+ if (commandId > 60)
+ return 0;
+
+ _commandParam = param;
+ _frameCounter = 0;
+ return (this->*_commandList[commandId])();
+}
+
+int ASound4::command10() {
+ byte *pData = loadData(0x22AA, 254);
+ if (!isSoundActive(pData)) {
+ command1();
+ _channels[0].load(pData);
+ _channels[1].load(loadData(0x23A8, 452));
+ _channels[2].load(loadData(0x256C, 396));
+ _channels[3].load(loadData(0x26F8, 118));
+ _channels[4].load(loadData(0x276E, 74));
+ }
+
+ return 0;
+}
+
+int ASound4::command12() {
+ byte *pData = loadData(0x16A8, 550);
+ if (!isSoundActive(pData)) {
+ command1();
+ _channels[0].load(pData);
+ _channels[1].load(loadData(0x18CE, 442));
+ _channels[2].load(loadData(0x1A88, 298));
+ _channels[3].load(loadData(0x1BB2, 354));
+ _channels[4].load(loadData(0x1D14, 572));
+ _channels[4].load(loadData(0x1F50, 560));
+ }
+
+ int v = (_commandParam > 0x40) ? _commandParam - 0x40 : 0;
+ v += 0xB5;
+ for (int channelNum = 0; channelNum < 6; ++channelNum)
+ _channels[channelNum]._field20 = v;
+
+ return 0;
+}
+
+int ASound4::command19() {
+ playSound(0x28EC, 8);
+
+ return 0;
+}
+
+int ASound4::command20() {
+ playSound(0x28E2, 10);
+
+ return 0;
+}
+
+int ASound4::command21() {
+ playSound(0x27C0, 8);
+
+ return 0;
+}
+
+int ASound4::command24() {
+ int v;
+ while ((v = (getRandomNumber() & 0x3F)) > 45)
+ ;
+
+ byte *pData = loadData(0x28D6, 12);
+ pData[6] = v + 19;
+ playSoundData(pData);
+
+ return 0;
+}
+
+int ASound4::command27() {
+ playSound(0x27D8, 34);
+ playSound(0x27FA, 20);
+
+ return 0;
+}
+
+int ASound4::command30() {
+ playSound(0x284A, 22);
+ playSound(0x2860, 22);
+ playSound(0x2876, 22);
+
+ return 0;
+}
+
+int ASound4::command32() {
+ playSound(0x28C2, 10);
+
+ return 0;
+}
+
+int ASound4::command33() {
+ playSound(0x28B2, 16);
+
+ return 0;
+}
+
+int ASound4::command34() {
+ playSound(0x28A2, 16);
+
+ return 0;
+}
+
+int ASound4::command35() {
+ playSound(0x288C, 22);
+
+ return 0;
+}
+
+int ASound4::command36() {
+ playSound(0x27C8, 16);
+
+ return 0;
+}
+
+int ASound4::command37() {
+ playSound(0x280E, 20);
+ playSound(0x2822, 30);
+ playSound(0x2840, 10);
+
+ return 0;
+}
+
+int ASound4::command38() {
+ playSound(0x2904, 10);
+
+ return 0;
+}
+
+int ASound4::command43() {
+ playSound(0x290E, 12);
+ playSound(0x291A, 14);
+
+ return 0;
+}
+
+int ASound4::command52() {
+ byte *pData = loadData(0x23A8, 452);
+ if (_channels[1]._ptr1 == pData) {
+ pData = loadData(0x146E, 570);
+ if (!isSoundActive(pData)) {
+ _channels[0].load(pData);
+ _channels[1]._field20 = 0xD8;
+ _channels[2]._field20 = 0xD8;
+ }
+ }
+
+ return 0;
+}
+
+int ASound4::command53() {
+ method1();
+ _channels[0]._field20 = 0;
+
+ return 0;
+}
+
+int ASound4::command54() {
+ method1();
+ _channels[1]._field20 = 0;
+ _channels[2]._field20 = 0;
+
+ return 0;
+}
+
+int ASound4::command55() {
+ method1();
+ _channels[3]._field20 = 0;
+ _channels[4]._field20 = 0;
+
+ return 0;
+}
+
+int ASound4::command56() {
+ method1();
+ _channels[5]._field20 = 0;
+
+ return 0;
+}
+
+int ASound4::command57() {
+ int v = (getRandomNumber() & 7) + 85;
+ byte *pData = loadData(0x28CC, 10);
+ pData[6] = v;
+ playSoundData(pData);
+
+ return 0;
+}
+
+int ASound4::command58() {
+ byte *pData = loadData(0x146E, 570);
+ if (_channels[1]._ptr1 == pData) {
+ _channels[0].load(loadData(0x22AA, 254));
+ _channels[1]._field20 = 0;
+ _channels[2]._field20 = 0;
+ }
+
+ return 0;
+}
+
+int ASound4::command59() {
+ playSound(0x28F4, 8);
+
+ return 0;
+}
+
+int ASound4::command60() {
+ playSound(0x28FC, 8);
+
+ return 0;
+}
+
+void ASound4::method1() {
+ byte *pData = loadData(0x2180, 58);
+ if (!isSoundActive(pData)) {
+ command1();
+
+ _channels[0].load(pData);
+ _channels[1].load(loadData(0x21BA, 48));
+ _channels[2].load(loadData(0x21EA, 50));
+ _channels[3].load(loadData(0x221C, 40));
+ _channels[4].load(loadData(0x2244, 28));
+ _channels[5].load(loadData(0x2260, 74));
+
+ for (int channel = 0; channel < 6; ++channel)
+ _channels[channel]._field20 = 0xB5;
+ }
+}
+
+
+/*-----------------------------------------------------------------------*/
+
+const ASound5::CommandPtr ASound5::_commandList[42] = {
+ &ASound5::command0, &ASound5::command1, &ASound5::command2, &ASound5::command3,
+ &ASound5::command4, &ASound5::command5, &ASound5::command6, &ASound5::command7,
+ &ASound5::command8, &ASound5::command9, &ASound5::command10, &ASound5::command11,
+ &ASound5::command11, &ASound5::command13, &ASound5::command14, &ASound5::command15,
+ &ASound5::command16, &ASound5::command17, &ASound5::command18, &ASound5::command19,
+ &ASound5::command20, &ASound5::command21, &ASound5::command22, &ASound5::command23,
+ &ASound5::command11, &ASound5::command11, &ASound5::command26, &ASound5::command27,
+ &ASound5::command28, &ASound5::command29, &ASound5::command30, &ASound5::command31,
+ &ASound5::command32, &ASound5::command33, &ASound5::command34, &ASound5::command35,
+ &ASound5::command36, &ASound5::command37, &ASound5::command38, &ASound5::command39,
+ &ASound5::command40, &ASound5::command41
+};
+
+ASound5::ASound5(Audio::Mixer *mixer) : ASound(mixer, "asound.002", 0x15E0) {
+ // Load sound samples
+ _soundFile.seek(_dataOffset + 0x144);
+ for (int i = 0; i < 164; ++i)
+ _samples.push_back(AdlibSample(_soundFile));
+}
+
+int ASound5::command(int commandId, int param) {
+ if (commandId > 41)
+ return 0;
+
+ _frameCounter = 0;
+ return (this->*_commandList[commandId])();
+}
+
+int ASound5::command9() {
+ byte *pData = loadData(0x2114, 10);
+ pData[6] = (getRandomNumber() & 7) + 85;
+ playSoundData(pData);
+
+ return 0;
+}
+
+int ASound5::command10() {
+ playSound(0x211E, 10);
+
+ return 0;
+}
+
+int ASound5::command11() {
+ playSound(0x2016, 10);
+
+ return 0;
+}
+
+int ASound5::command13() {
+ playSound(0x2154, 10);
+
+ return 0;
+}
+
+int ASound5::command14() {
+ playSound(0x21DC, 22);
+
+ return 0;
+}
+
+int ASound5::command15() {
+ byte *pData = loadData(0x21DC, 22);
+ if (_channels[0]._ptr1 == pData) {
+ pData = loadData(0x1F2, 12);
+ _channels[0]._soundData = pData;
+ _channels[0]._field17 = 1;
+ _channels[0]._field19 = 1;
+ }
+
+ return 0;
+}
+
+int ASound5::command16() {
+ playSound(0x214C, 8);
+
+ return 0;
+}
+
+int ASound5::command17() {
+ playSound(0x2142, 10);
+
+ return 0;
+}
+
+int ASound5::command18() {
+ playSound(0x21A2, 22);
+
+ return 0;
+}
+
+int ASound5::command19() {
+ playSound(0x2190, 18);
+
+ return 0;
+}
+
+int ASound5::command20() {
+ playSound(0x2170, 16);
+
+ return 0;
+}
+
+int ASound5::command21() {
+ playSound(0x2180, 16);
+
+ return 0;
+}
+
+int ASound5::command22() {
+ playSound(0x2168, 8);
+
+ return 0;
+}
+
+int ASound5::command23() {
+ playSound(0x215E, 10);
+
+ return 0;
+}
+
+int ASound5::command26() {
+ playSound(0x21B8, 12);
+
+ return 0;
+}
+
+int ASound5::command27() {
+ playSound(0x21C4, 24);
+
+ return 0;
+}
+
+int ASound5::command28() {
+ playSound(0x2020, 34);
+ playSound(0x4904, 20);
+
+ return 0;
+}
+
+int ASound5::command29() {
+ byte *pData = loadData(0x17C, 312);
+ if (!isSoundActive(pData)) {
+ command1();
+ _channels[0].load(pData);
+ _channels[1].load(loadData(0x1864, 304));
+ _channels[2].load(loadData(0x1994, 222));
+ _channels[3].load(loadData(0x1864, 304));
+ _channels[4].load(loadData(0x1994, 222));
+ }
+
+ return 0;
+}
+
+int ASound5::command30() {
+ playSound(0x2092, 22);
+ playSound(0x20A8, 22);
+ playSound(0x20BE, 22);
+
+ return 0;
+}
+
+int ASound5::command31() {
+ playSound(0x2128, 22);
+ playSound(0x2134, 14);
+
+ return 0;
+}
+
+int ASound5::command32() {
+ playSound(0x210A, 10);
+
+ return 0;
+}
+
+int ASound5::command33() {
+ playSound(0x20FA, 16);
+
+ return 0;
+}
+
+int ASound5::command34() {
+ playSound(0x20EA, 16);
+
+ return 0;
+}
+
+int ASound5::command35() {
+ playSound(0x20D4, 22);
+
+ return 0;
+}
+
+int ASound5::command36() {
+ playSound(0x2006, 16);
+
+ return 0;
+}
+
+int ASound5::command37() {
+ playSound(0x2056, 20);
+ playSound(0x206A, 30);
+ playSound(0x2088, 10);
+
+ return 0;
+}
+
+int ASound5::command38() {
+ byte *pData1 = loadData(0x14F2, 570);
+ if (_channels[3]._ptr1 == pData1) {
+ _channels[3].load(loadData(0x1A72, 522));
+ _channels[3].load(loadData(0x1C7C, 874));
+ }
+
+ return 0;
+}
+
+int ASound5::command39() {
+ playSound(0x1FEE, 8);
+
+ return 0;
+}
+
+int ASound5::command40() {
+ playSound(0x1FF6, 16);
+
+ return 0;
+}
+
+int ASound5::command41() {
+ byte *pData1 = loadData(0x14F2, 570);
+ if (!isSoundActive(pData1)) {
+ byte *pData2 = loadData(0x1A72, 522);
+ if (_channels[3]._ptr1 == pData2) {
+ _channels[3].load(pData1);
+ _channels[4].load(loadData(0x1FE6, 8));
+ }
+ }
+
+ return 0;
+}
+
+/*-----------------------------------------------------------------------*/
+
+const ASound6::CommandPtr ASound6::_commandList[30] = {
+ &ASound6::command0, &ASound6::command1, &ASound6::command2, &ASound6::command3,
+ &ASound6::command4, &ASound6::command5, &ASound6::command6, &ASound6::command7,
+ &ASound6::command8, &ASound6::command9, &ASound6::command10, &ASound6::command11,
+ &ASound6::command11, &ASound6::command13, &ASound6::command14, &ASound6::command15,
+ &ASound6::command16, &ASound6::command17, &ASound6::command18, &ASound6::command19,
+ &ASound6::command20, &ASound6::command21, &ASound6::command22, &ASound6::command23,
+ &ASound6::command11, &ASound6::command11, &ASound6::nullCommand, &ASound6::nullCommand,
+ &ASound6::nullCommand, &ASound6::command29
+};
+
+ASound6::ASound6(Audio::Mixer *mixer) : ASound(mixer, "asound.006", 0x1390) {
+ // Load sound samples
+ _soundFile.seek(_dataOffset + 0x122);
+ for (int i = 0; i < 200; ++i)
+ _samples.push_back(AdlibSample(_soundFile));
+}
+
+int ASound6::command(int commandId, int param) {
+ if (commandId > 29)
+ return 0;
+
+ _frameCounter = 0;
+ return (this->*_commandList[commandId])();
+}
+
+int ASound6::command9() {
+ byte *pData = loadData(0x2194, 10);
+ pData[6] = (getRandomNumber() & 7) + 85;
+ playSoundData(pData);
+
+ return 0;
+}
+
+int ASound6::command10() {
+ playSound(0x2224, 24);
+
+ return 0;
+}
+
+int ASound6::command11() {
+ playSound(0x2202, 34);
+
+ return 0;
+}
+
+int ASound6::command12() {
+ playSound(0x2246, 8);
+
+ return 0;
+}
+
+int ASound6::command13() {
+ playSound(0x2298, 28);
+
+ return 0;
+}
+
+int ASound6::command14() {
+ playSound(0x22B4, 27);
+
+ return 0;
+}
+
+int ASound6::command15() {
+ playSound(0x219E, 12);
+
+ return 0;
+}
+
+int ASound6::command16() {
+ playSound(0x21AA, 22);
+ playSound(0x21C0, 12);
+
+ return 0;
+}
+
+int ASound6::command17() {
+ playSound(0x21CC, 54);
+
+ return 0;
+}
+
+int ASound6::command18() {
+ playSound(0x2270, 16);
+
+ return 0;
+}
+
+int ASound6::command19() {
+ playSound(0x2280, 16);
+
+ return 0;
+}
+
+int ASound6::command20() {
+ playSound(0x223C, 10);
+
+ return 0;
+}
+
+int ASound6::command21() {
+ playSound(0x224E, 34);
+
+ return 0;
+}
+
+int ASound6::command22() {
+ playSound(0x2290, 8);
+
+ return 0;
+}
+
+int ASound6::command23() {
+ playSound(0x215E, 34);
+ playSound(0x2180, 20);
+
+ return 0;
+}
+
+int ASound6::command24() {
+ byte *pData1 = loadData(0x1D54, 540);
+ if (!isSoundActive(pData1)) {
+ command1();
+ _channels[0].load(pData1);
+ _channels[1].load(loadData(0x1F70, 52));
+ _channels[2].load(loadData(0x1FA4, 430));
+ }
+
+ return 0;
+}
+
+int ASound6::command25() {
+ playSound(0x2152, 12);
+
+ return 0;
+}
+
+int ASound6::command29() {
+ byte *pData1 = loadData(0x149A, 312);
+ if (!isSoundActive(pData1)) {
+ command1();
+ _channels[0].load(pData1);
+ _channels[1].load(loadData(0x15D2, 304));
+ _channels[2].load(loadData(0x1702, 222));
+ _channels[3].load(loadData(0x17E0, 522));
+ _channels[4].load(loadData(0x19EA, 874));
+ }
+
+ return 0;
+}
+
+/*-----------------------------------------------------------------------*/
+
+const ASound7::CommandPtr ASound7::_commandList[38] = {
+ &ASound7::command0, &ASound7::command1, &ASound7::command2, &ASound7::command3,
+ &ASound7::command4, &ASound7::command5, &ASound7::command6, &ASound7::command7,
+ &ASound7::command8, &ASound7::command9, &ASound7::nullCommand, &ASound7::nullCommand,
+ &ASound7::nullCommand, &ASound7::nullCommand, &ASound7::nullCommand, &ASound7::command15,
+ &ASound7::command16, &ASound7::command16, &ASound7::command18, &ASound7::command19,
+ &ASound7::command20, &ASound7::command21, &ASound7::command22, &ASound7::command23,
+ &ASound7::command24, &ASound7::command25, &ASound7::command26, &ASound7::command27,
+ &ASound7::command28, &ASound7::nullCommand, &ASound7::command30, &ASound7::nullCommand,
+ &ASound7::command32, &ASound7::command33, &ASound7::command34, &ASound7::command35,
+ &ASound7::command36, &ASound7::command37
+};
+
+ASound7::ASound7(Audio::Mixer *mixer) : ASound(mixer, "asound.007", 0x1460) {
+ // Load sound samples
+ _soundFile.seek(_dataOffset + 0x122);
+ for (int i = 0; i < 214; ++i)
+ _samples.push_back(AdlibSample(_soundFile));
+}
+
+int ASound7::command(int commandId, int param) {
+ if (commandId > 37)
+ return 0;
+
+ _frameCounter = 0;
+ return (this->*_commandList[commandId])();
+}
+
+int ASound7::command9() {
+ byte *pData1 = loadData(0x2992, 122);
+ if (!isSoundActive(pData1)) {
+ _channels[0].load(pData1);
+ _channels[1].load(loadData(0x2A0C, 76));
+ _channels[2].load(loadData(0x2A58, 122));
+ _channels[3].load(loadData(0x2AD2, 38));
+ }
+
+ return 0;
+}
+
+int ASound7::command15() {
+ byte *pData = loadData(0x2B3E, 10);
+ pData[6] = (getRandomNumber() & 7) + 85;
+
+ return 0;
+}
+
+int ASound7::command16() {
+ playSound(0x2CE2, 8);
+
+ return 0;
+}
+
+int ASound7::command18() {
+ playSound(0x2C94, 22);
+
+ return 0;
+}
+
+int ASound7::command19() {
+ byte *pData1 = loadData(0x2C94, 22);
+ byte *pData2 = loadData(0x2CAA, 16);
+ if (_channels[8]._ptr1 == pData1 || _channels[8]._ptr1 == pData2) {
+ _channels[8]._soundData = loadData(0x2CBA, 12);
+ _channels[8]._field17 = 1;
+ _channels[8]._field19 = 1;
+ }
+
+ return 0;
+}
+
+int ASound7::command20() {
+ playSound(0x2CD0, 18);
+
+ return 0;
+}
+
+int ASound7::command21() {
+ playSound(0x2CC6, 10);
+
+ return 0;
+}
+
+int ASound7::command22() {
+ playSound(0x2C08, 140);
+
+ return 0;
+}
+
+int ASound7::command23() {
+ playSound(0x2B08, 34);
+ playSound(0x2B2A, 20);
+
+ return 0;
+}
+
+int ASound7::command24() {
+ byte *pData1 = loadData(0x14C6, 144);
+ if (!isSoundActive(pData1)) {
+ command1();
+ _channels[0].load(pData1);
+ _channels[1].load(loadData(0x1556, 146));
+ _channels[2].load(loadData(0x15E8, 138));
+ _channels[3].load(loadData(0x1672, 122));
+ _channels[4].load(loadData(0x16EC, 74));
+ }
+
+ return 0;
+}
+
+int ASound7::command25() {
+ byte *pData1 = loadData(0x1DBE, 182);
+ if (!isSoundActive(pData1)) {
+ command1();
+ _channels[0].load(pData1);
+ _channels[1].load(loadData(0x1E74, 182));
+ _channels[2].load(loadData(0x1F2A, 186));
+ _channels[3].load(loadData(0x1FE4, 244));
+ }
+
+ return 0;
+}
+
+int ASound7::command26() {
+ byte *pData1 = loadData(0x20D8, 312);
+ if (!isSoundActive(pData1)) {
+ command1();
+ _channels[0].load(pData1);
+ _channels[1].load(loadData(0x2210, 304));
+ _channels[2].load(loadData(0x2340, 222));
+ _channels[3].load(loadData(0x241E, 522));
+ _channels[4].load(loadData(0x2628, 874));
+ }
+
+ return 0;
+}
+
+int ASound7::command27() {
+ byte *pData1 = loadData(0x1736, 158);
+ if (!isSoundActive(pData1)) {
+ command1();
+ _channels[0].load(pData1);
+ _channels[1].load(loadData(0x17D4, 288));
+ _channels[2].load(loadData(0x18F4, 290));
+ _channels[3].load(loadData(0x1A16, 396));
+ _channels[4].load(loadData(0x1BA2, 380));
+ _channels[5].load(loadData(0x1D1E, 160));
+ }
+
+ return 0;
+}
+
+int ASound7::command28() {
+ playSound(0x2CAA, 16);
+
+ return 0;
+}
+
+int ASound7::command30() {
+ playSound(0x2B86, 22);
+ playSound(0x2B9C, 22);
+ playSound(0x2BB2, 22);
+
+ return 0;
+}
+
+int ASound7::command32() {
+ playSound(0x2BFE, 10);
+
+ return 0;
+}
+
+int ASound7::command33() {
+ playSound(0x2BEE, 16);
+
+ return 0;
+}
+
+int ASound7::command34() {
+ playSound(0x2BDE, 16);
+
+ return 0;
+}
+
+int ASound7::command35() {
+ playSound(0x2BC8, 22);
+
+ return 0;
+}
+
+int ASound7::command36() {
+ playSound(0x2AF8, 16);
+
+ return 0;
+}
+
+int ASound7::command37() {
+ playSound(0x2B48, 20);
+ playSound(0x2B5C, 32);
+ playSound(0x2B7C, 10);
+
+ return 0;
+}
+
+/*-----------------------------------------------------------------------*/
+
+const ASound8::CommandPtr ASound8::_commandList[38] = {
+ &ASound8::command0, &ASound8::command1, &ASound8::command2, &ASound8::command3,
+ &ASound8::command4, &ASound8::command5, &ASound8::command6, &ASound8::command7,
+ &ASound8::command8, &ASound8::command9, &ASound8::command10, &ASound8::command11,
+ &ASound8::command12, &ASound8::command13, &ASound8::command14, &ASound8::command15,
+ &ASound8::command16, &ASound8::command16, &ASound8::command18, &ASound8::command19,
+ &ASound8::command20, &ASound8::command21, &ASound8::command22, &ASound8::command23,
+ &ASound8::command24, &ASound8::command25, &ASound8::command26, &ASound8::command27,
+ &ASound8::command28, &ASound8::command29, &ASound8::command30, &ASound8::command31,
+ &ASound8::command32, &ASound8::command33, &ASound8::command34, &ASound8::command35,
+ &ASound8::command36, &ASound8::command37
+};
+
+ASound8::ASound8(Audio::Mixer *mixer) : ASound(mixer, "asound.008", 0x1490) {
+ // Load sound samples
+ _soundFile.seek(_dataOffset + 0x122);
+ for (int i = 0; i < 174; ++i)
+ _samples.push_back(AdlibSample(_soundFile));
+}
+
+int ASound8::command(int commandId, int param) {
+ if (commandId > 37)
+ return 0;
+
+ _frameCounter = 0;
+ return (this->*_commandList[commandId])();
+}
+
+int ASound8::command9() {
+ byte *pData = loadData(0x15BE, 10);
+ pData[6] = (getRandomNumber() & 7) + 85;
+ playSoundData(pData);
+
+ return 0;
+}
+
+int ASound8::command10() {
+ byte *pData = loadData(0x2B3E, 10);
+ pData[6] = (getRandomNumber() & 7) + 85;
+ playSoundData(pData);
+
+ return 0;
+}
+
+int ASound8::command11() {
+ playSound(0x17CA, 12);
+
+ return 0;
+}
+
+int ASound8::command12() {
+ playSound(0x17D6, 12);
+
+ return 0;
+}
+
+int ASound8::command13() {
+ playSound(0x1694, 10);
+
+ return 0;
+}
+
+int ASound8::command14() {
+ playSound(0x169E, 24);
+
+ return 0;
+}
+
+int ASound8::command15() {
+ byte *pData = loadData(0x169E, 24);
+ if (_channels[8]._ptr1 == pData) {
+ _channels[8]._soundData = loadData(0x16B6, 12);
+ _channels[8]._field17 = 1;
+ _channels[8]._field19 = 1;
+ }
+
+ return 0;
+}
+
+int ASound8::command16() {
+ playSound(0x1686, 14);
+
+ return 0;
+}
+
+int ASound8::command17() {
+ playSound(0x17EC, 12);
+
+ return 0;
+}
+
+int ASound8::command18() {
+ playSound(0x17F8, 12);
+
+ return 0;
+}
+
+int ASound8::command19() {
+ playSound(0x16D8, 8);
+
+ return 0;
+}
+
+int ASound8::command20() {
+ playSound(0x16E0, 8);
+
+ return 0;
+}
+
+int ASound8::command21() {
+ playSound(0x17E2, 10);
+
+ return 0;
+}
+
+int ASound8::command22() {
+ playSound(0x178C, 14);
+ playSound(0x179A, 14);
+ playSound(0x17A8, 14);
+
+ return 0;
+}
+
+int ASound8::command23() {
+ playSound(0x2B08, 34);
+ playSound(0x2B2A, 20);
+
+ return 0;
+}
+
+int ASound8::command24() {
+ playSound(0x17B6, 8);
+
+ return 0;
+}
+
+int ASound8::command25() {
+ playSound(0x17BE, 12);
+
+ return 0;
+}
+
+int ASound8::command26() {
+ playSound(0x16C2, 22);
+
+ return 0;
+}
+
+int ASound8::command27() {
+ playSound(0x1588, 34);
+ playSound(0x15AA, 20);
+
+ return 0;
+}
+
+int ASound8::command28() {
+ byte *pData1 = loadData(0x114E, 376);
+ if (!isSoundActive(pData1)) {
+ command1();
+ _channels[0].load(pData1);
+ _channels[2].load(loadData(0x12F8, 130));
+
+ byte *pData = loadData(0x12C6, 50);
+ method1(pData);
+ _channels[1].load(pData);
+ }
+
+ return 0;
+}
+
+void ASound8::method1(byte *pData) {
+ int v;
+ while ((v = (getRandomNumber() & 0x3F)) > 36)
+ ;
+
+ adjustRange(pData, v + 20, -1);
+ adjustRange(pData + 1, 10 - ((v + 1) / 6), 1);
+}
+
+void ASound8::adjustRange(byte *pData, byte v, int incr) {
+ pData += 8;
+
+ for (int i = 0; i < 10; ++i, pData += 4, v += incr) {
+ *pData = v;
+ }
+}
+
+int ASound8::command29() {
+ byte *pData1 = loadData(0x137A, 60);
+ if (!isSoundActive(pData1)) {
+ command1();
+ _channels[0].load(pData1);
+ _channels[1].load(loadData(0x13B6, 318));
+ _channels[2].load(loadData(0x14F4, 118));
+ }
+
+ return 0;
+}
+
+int ASound8::command30() {
+ playSound(0x1644, 22);
+ playSound(0x165A, 22);
+ playSound(0x1670, 22);
+
+ return 0;
+}
+
+int ASound8::command31() {
+ playSound(0x156A, 14);
+
+ return 0;
+}
+
+int ASound8::command32() {
+ playSound(0x163A, 10);
+
+ return 0;
+}
+
+int ASound8::command33() {
+ playSound(0x162A, 16);
+
+ return 0;
+}
+
+int ASound8::command34() {
+ playSound(0x161A, 16);
+
+ return 0;
+}
+
+int ASound8::command35() {
+ playSound(0x1604, 22);
+
+ return 0;
+}
+
+int ASound8::command36() {
+ playSound(0x1578, 16);
+
+ return 0;
+}
+
+int ASound8::command37() {
+ playSound(0x15C8, 20);
+ playSound(0x15DC, 30);
+ playSound(0X15FA, 10);
+
+ return 0;
+}
+
+} // End of namespace Nebular
+
+} // End of namespace MADS
diff --git a/engines/mads/nebular/sound_nebular.h b/engines/mads/nebular/sound_nebular.h
new file mode 100644
index 0000000000..c485bd7955
--- /dev/null
+++ b/engines/mads/nebular/sound_nebular.h
@@ -0,0 +1,720 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ */
+
+#ifndef MADS_SOUND_NEBULAR_H
+#define MADS_SOUND_NEBULAR_H
+
+#include "common/scummsys.h"
+#include "common/file.h"
+#include "common/mutex.h"
+#include "common/queue.h"
+#include "audio/audiostream.h"
+#include "audio/fmopl.h"
+#include "audio/mixer.h"
+
+namespace MADS {
+
+class SoundManager;
+
+namespace Nebular {
+
+/**
+ * Represents the data for a channel on the Adlib
+ */
+class AdlibChannel {
+public:
+ int _activeCount;
+ int _field1;
+ int _field2;
+ int _field3;
+ int _field4;
+ int _sampleIndex;
+ int _volume;
+ int _field7;
+ int _field8;
+ int _field9;
+ int _fieldA;
+ uint8 _fieldB;
+ int _fieldC;
+ int _fieldD;
+ int _fieldE;
+ byte *_ptr1;
+ byte *_pSrc;
+ byte *_ptr3;
+ byte *_ptr4;
+ int _field17;
+ int _field19;
+ byte *_soundData;
+ int _field1D;
+ int _field1E;
+ int _field1F;
+
+ // TODO: Only used by asound.003. Figure out usage
+ byte _field20;
+public:
+ static bool _channelsEnabled;
+public:
+ AdlibChannel();
+
+ void reset();
+ void enable(int flag);
+ void setPtr2(byte *pData);
+ void load(byte *pData);
+ void check(byte *nullPtr);
+};
+
+class AdlibChannelData {
+public:
+ int _field0;
+ int _freqMask;
+ int _freqBase;
+ int _field6;
+};
+
+class AdlibSample {
+public:
+ int _attackRate;
+ int _decayRate;
+ int _sustainLevel;
+ int _releaseRate;
+ bool _egTyp;
+ bool _ksr;
+ int _totalLevel;
+ int _scalingLevel;
+ int _waveformSelect;
+ int _freqMultiple;
+ int _feedback;
+ bool _ampMod;
+ int _vib;
+ int _alg;
+ int _fieldE;
+ int _freqMask;
+ int _freqBase;
+ int _field14;
+
+ AdlibSample() {}
+ AdlibSample(Common::SeekableReadStream &s);
+};
+
+struct RegisterValue {
+ uint8 _regNum;
+ uint8 _value;
+
+ RegisterValue(int regNum, int value) {
+ _regNum = regNum; _value = value;
+ }
+};
+
+#define ADLIB_CHANNEL_COUNT 9
+#define ADLIB_CHANNEL_MIDWAY 5
+#define CALLBACKS_PER_SECOND 60
+
+/**
+ * Base class for the sound player resource files
+ */
+class ASound : public Audio::AudioStream {
+private:
+ struct CachedDataEntry {
+ int _offset;
+ byte *_data;
+ };
+ Common::List<CachedDataEntry> _dataCache;
+ uint16 _randomSeed;
+
+ /**
+ * Does the initial Adlib initialisation
+ */
+ void adlibInit();
+
+ /**
+ * Does on-going processing for the Adlib sounds being played
+ */
+ void update();
+
+ /**
+ * Polls each of the channels for updates
+ */
+ void pollChannels();
+
+ /**
+ * Checks the status of the channels
+ */
+ void checkChannels();
+
+ /**
+ * Polls the currently active channel
+ */
+ void pollActiveChannel();
+
+ /**
+ * Updates the octave of the currently active channel
+ */
+ void updateOctave();
+
+ void updateChannelState();
+ void updateActiveChannel();
+
+ /**
+ * Loads up the specified sample
+ */
+ void loadSample(int sampleIndex);
+
+ /**
+ * Writes out the data of the selected sample to the Adlib
+ */
+ void processSample();
+
+ void updateFNumber();
+protected:
+ int _commandParam;
+
+ /**
+ * Queue a byte for an Adlib register
+ */
+ void write(int reg, int val);
+
+ /**
+ * Queue a byte for an Adlib register, and store it in the _ports array
+ */
+ int write2(int state, int reg, int val);
+
+ /**
+ * Flush any pending Adlib register values to the OPL driver
+ */
+ void flush();
+
+ /**
+ * Turn a channel on
+ */
+ void channelOn(int reg, int volume);
+
+ /**
+ * Turn a channel off
+ */
+ void channelOff(int reg);
+
+ /**
+ * Checks for whether a poll result needs to be set
+ */
+ void resultCheck();
+
+ /**
+ * Loads a data block from the sound file, caching the result for any future
+ * calls for the same data
+ */
+ byte *loadData(int offset, int size);
+
+ /**
+ * Play the specified sound
+ * @param offset Offset of sound data within sound player data segment
+ * @param size Size of sound data block
+ */
+ void playSound(int offset, int size);
+
+ /**
+ * Play the specified raw sound data
+ * @param pData Pointer to data block containing sound data
+ * @param startingChannel Channel to start scan from
+ */
+ void playSoundData(byte *pData, int startingChannel = ADLIB_CHANNEL_MIDWAY);
+
+ /**
+ * Checks to see whether the given block of data is already loaded into a channel.
+ */
+ bool isSoundActive(byte *pData);
+
+ /**
+ * Sets the frequency for a given channel.
+ */
+ void setFrequency(int channel, int freq);
+
+ /**
+ * Returns a 16-bit random number
+ */
+ int getRandomNumber();
+
+ virtual int command0();
+ int command1();
+ int command2();
+ int command3();
+ int command4();
+ int command5();
+ int command6();
+ int command7();
+ int command8();
+
+ int nullCommand() { return 0; }
+public:
+ Audio::Mixer *_mixer;
+ FM_OPL *_opl;
+ Audio::SoundHandle _soundHandle;
+ AdlibChannel _channels[ADLIB_CHANNEL_COUNT];
+ AdlibChannel *_activeChannelPtr;
+ AdlibChannelData _channelData[11];
+ Common::Array<AdlibSample> _samples;
+ AdlibSample *_samplePtr;
+ Common::File _soundFile;
+ Common::Queue<RegisterValue> _queue;
+ Common::Mutex _driverMutex;
+ int _dataOffset;
+ int _frameCounter;
+ bool _isDisabled;
+ int _v1;
+ int _v2;
+ int _activeChannelNumber;
+ int _freqMask1;
+ int _freqMask2;
+ int _freqBase1;
+ int _freqBase2;
+ int _channelNum1, _channelNum2;
+ int _v7;
+ int _v8;
+ int _v9;
+ int _v10;
+ int _pollResult;
+ int _resultFlag;
+ byte _nullData[2];
+ int _ports[256];
+ bool _stateFlag;
+ int _activeChannelReg;
+ int _v11;
+ bool _amDep, _vibDep, _splitPoint;
+ int _samplesPerCallback;
+ int _samplesPerCallbackRemainder;
+ int _samplesTillCallback;
+ int _samplesTillCallbackRemainder;
+public:
+ /**
+ * Constructor
+ * @param filename Specifies the adlib sound player file to use
+ * @param dataOffset Offset in the file of the data segment
+ */
+ ASound(Audio::Mixer *mixer, const Common::String &filename, int dataOffset);
+
+ /**
+ * Destructor
+ */
+ virtual ~ASound();
+
+ /**
+ * Execute a player command. Most commands represent sounds to play, but some
+ * low number commands also provide control operations.
+ * @param commandId Player ommand to execute.
+ * @param param Optional parameter used by a few commands
+ */
+ virtual int command(int commandId, int param) = 0;
+
+ /**
+ * Stop all currently playing sounds
+ */
+ int stop();
+
+ /**
+ * Main poll method to allow sounds to progress
+ */
+ int poll();
+
+ /**
+ * General noise/note output
+ */
+ void noise();
+
+ /**
+ * Return the current frame counter
+ */
+ int getFrameCounter() { return _frameCounter; }
+
+ // AudioStream interface
+ /**
+ * Main buffer read
+ */
+ virtual int readBuffer(int16 *buffer, const int numSamples);
+
+ /**
+ * Mono sound only
+ */
+ virtual bool isStereo() const { return false; }
+
+ /**
+ * Data is continuously pushed, so definitive end
+ */
+ virtual bool endOfData() const { return false; }
+
+ /**
+ * Return sample rate
+ */
+ virtual int getRate() const { return 11025; }
+};
+
+class ASound1 : public ASound {
+private:
+ typedef int (ASound1::*CommandPtr)();
+ static const CommandPtr _commandList[42];
+ bool _cmd23Toggle;
+
+ int command9();
+ int command10();
+ int command11();
+ int command12();
+ int command13();
+ int command14();
+ int command15();
+ int command16();
+ int command17();
+ int command18();
+ int command19();
+ int command20();
+ int command21();
+ int command22();
+ int command23();
+ int command24();
+ int command25();
+ int command26();
+ int command27();
+ int command28();
+ int command29();
+ int command30();
+ int command31();
+ int command32();
+ int command33();
+ int command34();
+ int command35();
+ int command36();
+ int command37();
+ int command38();
+ int command39();
+ int command40();
+ int command41();
+
+ void command111213();
+ int command2627293032();
+public:
+ ASound1(Audio::Mixer *mixer);
+
+ virtual int command(int commandId, int param);
+};
+
+class ASound2 : public ASound {
+private:
+ byte _command12Param;
+private:
+ typedef int (ASound2::*CommandPtr)();
+ static const CommandPtr _commandList[44];
+
+ virtual int command0();
+ int command9();
+ int command10();
+ int command11();
+ int command12();
+ int command13();
+ int command14();
+ int command15();
+ int command16();
+ int command17();
+ int command18();
+ int command19();
+ int command20();
+ int command21();
+ int command22();
+ int command23();
+ int command24();
+ int command25();
+ int command26();
+ int command27();
+ int command28();
+ int command29();
+ int command30();
+ int command31();
+ int command32();
+ int command33();
+ int command34();
+ int command35();
+ int command36();
+ int command37();
+ int command38();
+ int command39();
+ int command40();
+ int command41();
+ int command42();
+ int command43();
+
+ void command9Randomize();
+ void command9Apply(byte *data, int val, int incr);
+public:
+ ASound2(Audio::Mixer *mixer);
+
+ virtual int command(int commandId, int param);
+};
+
+class ASound3 : public ASound {
+private:
+ bool _command39Flag;
+
+ typedef int (ASound3::*CommandPtr)();
+ static const CommandPtr _commandList[61];
+
+ int command9();
+ int command10();
+ int command11();
+ int command13();
+ int command14();
+ int command15();
+ int command16();
+ int command17();
+ int command18();
+ int command19();
+ int command20();
+ int command21();
+ int command22();
+ int command23();
+ int command24();
+ int command25();
+ int command26();
+ int command27();
+ int command28();
+ int command29();
+ int command30();
+ int command31();
+ int command32();
+ int command33();
+ int command34();
+ int command35();
+ int command36();
+ int command37();
+ int command38();
+ int command39();
+ int command40();
+ int command41();
+ int command42();
+ int command43();
+ int command44();
+ int command45();
+ int command46();
+ int command47();
+ int command49();
+ int command50();
+ int command51();
+ int command57();
+ int command59();
+ int command60();
+
+ void command9Randomize();
+ void command9Apply(byte *data, int val, int incr);
+public:
+ ASound3(Audio::Mixer *mixer);
+
+ virtual int command(int commandId, int param);
+};
+
+class ASound4 : public ASound {
+private:
+ typedef int (ASound4::*CommandPtr)();
+ static const CommandPtr _commandList[61];
+
+ int command10();
+ int command12();
+ int command19();
+ int command20();
+ int command21();
+ int command24();
+ int command27();
+ int command30();
+ int command32();
+ int command33();
+ int command34();
+ int command35();
+ int command36();
+ int command37();
+ int command38();
+ int command43();
+ int command52();
+ int command53();
+ int command54();
+ int command55();
+ int command56();
+ int command57();
+ int command58();
+ int command59();
+ int command60();
+
+ void method1();
+public:
+ ASound4(Audio::Mixer *mixer);
+
+ virtual int command(int commandId, int param);
+};
+
+class ASound5 : public ASound {
+private:
+ typedef int (ASound5::*CommandPtr)();
+ static const CommandPtr _commandList[42];
+
+ int command9();
+ int command10();
+ int command11();
+ int command12();
+ int command13();
+ int command14();
+ int command15();
+ int command16();
+ int command17();
+ int command18();
+ int command19();
+ int command20();
+ int command21();
+ int command22();
+ int command23();
+ int command24();
+ int command25();
+ int command26();
+ int command27();
+ int command28();
+ int command29();
+ int command30();
+ int command31();
+ int command32();
+ int command33();
+ int command34();
+ int command35();
+ int command36();
+ int command37();
+ int command38();
+ int command39();
+ int command40();
+ int command41();
+ int command42();
+ int command43();
+public:
+ ASound5(Audio::Mixer *mixer);
+
+ virtual int command(int commandId, int param);
+};
+
+class ASound6 : public ASound {
+private:
+ typedef int (ASound6::*CommandPtr)();
+ static const CommandPtr _commandList[30];
+
+ int command9();
+ int command10();
+ int command11();
+ int command12();
+ int command13();
+ int command14();
+ int command15();
+ int command16();
+ int command17();
+ int command18();
+ int command19();
+ int command20();
+ int command21();
+ int command22();
+ int command23();
+ int command24();
+ int command25();
+ int command29();
+public:
+ ASound6(Audio::Mixer *mixer);
+
+ virtual int command(int commandId, int param);
+};
+
+class ASound7 : public ASound {
+private:
+ typedef int (ASound7::*CommandPtr)();
+ static const CommandPtr _commandList[38];
+
+ int command9();
+ int command15();
+ int command16();
+ int command18();
+ int command19();
+ int command20();
+ int command21();
+ int command22();
+ int command23();
+ int command24();
+ int command25();
+ int command26();
+ int command27();
+ int command28();
+ int command30();
+ int command32();
+ int command33();
+ int command34();
+ int command35();
+ int command36();
+ int command37();
+public:
+ ASound7(Audio::Mixer *mixer);
+
+ virtual int command(int commandId, int param);
+};
+
+class ASound8 : public ASound {
+private:
+ typedef int (ASound8::*CommandPtr)();
+ static const CommandPtr _commandList[38];
+
+ int command9();
+ int command10();
+ int command11();
+ int command12();
+ int command13();
+ int command14();
+ int command15();
+ int command16();
+ int command17();
+ int command18();
+ int command19();
+ int command20();
+ int command21();
+ int command22();
+ int command23();
+ int command24();
+ int command25();
+ int command26();
+ int command27();
+ int command28();
+ int command29();
+ int command30();
+ int command31();
+ int command32();
+ int command33();
+ int command34();
+ int command35();
+ int command36();
+ int command37();
+
+ void method1(byte *pData);
+ void adjustRange(byte *pData, byte v, int incr);
+public:
+ ASound8(Audio::Mixer *mixer);
+
+ virtual int command(int commandId, int param);
+};
+
+} // End of namespace Nebular
+
+} // End of namespace MADS
+
+#endif /* MADS_SOUND_NEBULAR_H */
diff --git a/engines/mads/palette.cpp b/engines/mads/palette.cpp
new file mode 100644
index 0000000000..eedbf36ddd
--- /dev/null
+++ b/engines/mads/palette.cpp
@@ -0,0 +1,835 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+
+ * You should have received a copy of the GNU General Public 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 "engines/util.h"
+#include "graphics/palette.h"
+#include "mads/mads.h"
+#include "mads/msurface.h"
+#include "mads/staticres.h"
+
+namespace MADS {
+
+#define VGA_COLOR_TRANS(x) ((x) * 255 / 63)
+
+void RGB6::load(Common::SeekableReadStream *f) {
+ r = VGA_COLOR_TRANS(f->readByte());
+ g = VGA_COLOR_TRANS(f->readByte());
+ b = VGA_COLOR_TRANS(f->readByte());
+ _palIndex = f->readByte();
+ _u2 = f->readByte();
+ _flags = f->readByte();
+}
+
+/*------------------------------------------------------------------------*/
+
+PaletteUsage::PaletteUsage(MADSEngine *vm) {
+ _vm = vm;
+ _data = nullptr;
+}
+
+void PaletteUsage::load(Common::Array<UsageEntry> *data) {
+ _data = data;
+}
+
+void PaletteUsage::getKeyEntries(Common::Array<RGB6> &palette) {
+ _data->clear();
+
+ for (uint i = 0; i < palette.size(); ++i) {
+ byte *uPtr = &palette[i]._flags;
+ if ((*uPtr & 0x10) && _data->size() < 3) {
+ _data->push_back(UsageEntry(i));
+ }
+ }
+}
+
+static bool sortHelper(const PaletteUsage::UsageEntry &ue1, const PaletteUsage::UsageEntry &ue2) {
+ return ue1._sortValue < ue2._sortValue;
+}
+
+void PaletteUsage::prioritize(Common::Array<RGB6> &palette) {
+ for (uint i = 0; i < _data->size(); ++i) {
+ RGB6 &palEntry = palette[(*_data)[i]._palIndex];
+ (*_data)[i]._sortValue = _vm->_palette->rgbMerge(palEntry);
+ }
+
+ Common::sort(_data->begin(), _data->end(), sortHelper);
+}
+
+static bool rangeSorter(const PaletteUsage::UsageRange &ur1, const PaletteUsage::UsageRange &ur2) {
+ return ur1._v2 < ur2._v2;
+}
+
+int PaletteUsage::process(Common::Array<RGB6> &palette, uint flags) {
+ int palLow;
+ int palHigh = (flags & 0x800) ? 0x100 : 0xFC;
+ int palIdx;
+
+ PaletteUsage tempUsage(_vm);
+ Common::Array<UsageEntry> tempUsageData;
+ tempUsage.load(&tempUsageData);
+
+ if (flags & 0x4000) {
+ palLow = 0;
+ palIdx = palHigh;
+ } else {
+ palLow = _vm->_palette->_lowRange;
+ if ((PALETTE_COUNT - _vm->_palette->_highRange) > palHigh) {
+ palIdx = palHigh;
+ } else {
+ palIdx = PALETTE_COUNT - _vm->_palette->_highRange;
+ }
+ }
+
+ int rgbIndex = _vm->_palette->_rgbList.scan();
+ uint32 rgbMask = 1 << rgbIndex;
+ bool noUsageFlag = flags & 0x8000;
+ bool hasUsage = _data != nullptr;
+ bool flag1 = false;
+
+ if (hasUsage) {
+ if (noUsageFlag || _data->size() == 0)
+ hasUsage = false;
+
+ if (noUsageFlag && _data->size() > 0)
+ flag1 = true;
+ }
+
+ if (hasUsage) {
+ tempUsage.getKeyEntries(palette);
+ tempUsage.prioritize(palette);
+ }
+
+ int freeIndex;
+ int palCount = getGamePalFreeIndex(&freeIndex);
+ Common::Array<UsageRange> palRange;
+
+ for (uint palIndex = 0; palIndex < palette.size(); ++palIndex) {
+ byte pal2 = palIndex;
+ byte pal1 = 0;
+
+ if (!(palette[palIndex]._flags & 0x80)) {
+ pal1 = 0x40;
+ }
+ if (palette[palIndex]._flags & 0x60) {
+ pal1 |= 0x20;
+ }
+
+ palRange.push_back(UsageRange(pal1, pal2));
+ }
+
+ Common::sort(palRange.begin(), palRange.end(), rangeSorter);
+
+ int var3A = (flags & 0x4000) ? 0xffff : 0xfffe;
+
+ for (uint palIndex = 0; palIndex < palette.size(); ++palIndex) {
+ bool changed = false;
+ int newPalIndex = -1;
+ int v1 = palRange[palIndex]._v2;
+
+ if (palette[v1]._flags & 8) {
+ changed = true;
+ newPalIndex = 0xFD;
+ }
+
+ if (hasUsage && palette[v1]._flags & 0x10) {
+ for (uint usageIndex = 0; usageIndex < tempUsage._data->size() && !changed; ++usageIndex) {
+ if ((*tempUsage._data)[usageIndex]._palIndex == palIndex) {
+ changed = true;
+ int dataIndex = MIN(usageIndex, _data->size() - 1);
+ newPalIndex = (*_data)[dataIndex]._palIndex;
+ }
+ }
+ }
+
+ if (flag1 && palette[palIndex]._flags & 0x10) {
+ for (uint usageIndex = 0; usageIndex < _data->size() && !changed; ++usageIndex) {
+ if ((*_data)[usageIndex]._palIndex == palIndex) {
+ changed = true;
+ newPalIndex = 0xF0 + usageIndex;
+
+ // Copy data into the high end of the main palette
+ RGB6 &pSrc = palette[palIndex];
+ byte *pDest = &_vm->_palette->_mainPalette[newPalIndex * 3];
+ pDest[0] = pSrc.r;
+ pDest[1] = pSrc.g;
+ pDest[2] = pSrc.b;
+ }
+ }
+ }
+
+ if (!changed && !noUsageFlag) {
+ int var2 = (palette[palIndex]._flags & 0x20) ||
+ (((flags & 0x2000) || (palette[palIndex]._flags & 0x4000)) &&
+ ((flags & 0x1000) || (palCount == 0))) ? 0x7fff : 1;
+ int var36 = (palette[palIndex]._flags & 0x80) ? 0 : 2;
+
+ for (int idx = palLow; idx < palIdx; ++idx) {
+ uint32 v = _vm->_palette->_palFlags[idx];
+ if ((v & var3A) && !(v & var36)) {
+ int var10;
+
+ if (var2 > 1) {
+ var10 = rgbFactor(&_vm->_palette->_mainPalette[idx * 3], palette[palIndex]);
+ }
+ else if (_vm->_palette->_mainPalette[idx * 3] != palette[palIndex].r ||
+ _vm->_palette->_mainPalette[idx * 3 + 1] != palette[palIndex].g ||
+ _vm->_palette->_mainPalette[idx * 3 + 2] != palette[palIndex].b) {
+ var10 = 1;
+ } else {
+ var10 = 0;
+ }
+
+ if (var2 > var10) {
+ changed = true;
+ newPalIndex = idx;
+ var2 = var10;
+ }
+ }
+ }
+ }
+
+ if (!changed && (!(flags & 0x1000) || (!(palette[palIndex]._flags & 0x60) && !(flags & 0x2000)))) {
+ for (int idx = freeIndex; idx < palIdx && !changed; ++idx) {
+ if (!_vm->_palette->_palFlags[idx]) {
+ --palCount;
+ ++freeIndex;
+ changed = true;
+ newPalIndex = idx;
+
+ RGB6 &pSrc = palette[palIndex];
+ byte *pDest = &_vm->_palette->_mainPalette[idx * 3];
+ pDest[0] = pSrc.r;
+ pDest[1] = pSrc.g;
+ pDest[2] = pSrc.b;
+ }
+ }
+ }
+
+ // TODO: Not sure if it's valid or not for changed flag to ever be false.
+ // In at least scene 318, when the doctor knocks you with the blackjack,
+ // the changed flag can be false
+ //assert(changed);
+ assert(newPalIndex != -1);
+
+ int var52 = (noUsageFlag && palette[palIndex]._u2) ? 2 : 0;
+
+ _vm->_palette->_palFlags[newPalIndex] |= var52 | rgbMask;
+ palette[palIndex]._palIndex = newPalIndex;
+ }
+
+ _vm->_palette->_rgbList[rgbIndex] = true;
+
+ return rgbIndex;
+}
+
+void PaletteUsage::transform(Common::Array<RGB6> &palette) {
+ if (!empty()) {
+ for (uint i = 0; i < _data->size(); ++i) {
+ int palIndex = (*_data)[i]._palIndex;
+ (*_data)[i]._palIndex = palette[palIndex]._palIndex;
+ }
+ }
+}
+
+void PaletteUsage::updateUsage(Common::Array<int> &usageList, int sceneUsageIndex) {
+ uint32 mask1 = 0xFFFFFFFF;
+ uint32 mask2 = 0;
+
+ for (uint idx = 0; idx < usageList.size(); ++idx) {
+ uint32 bitMask = 1 << usageList[idx];
+ mask1 ^= bitMask;
+ mask2 |= bitMask;
+ _vm->_palette->_rgbList[usageList[idx]] = false;
+ }
+
+ uint32 mask3 = 1 << sceneUsageIndex;
+
+ for (uint idx = 0; idx < PALETTE_COUNT; ++idx) {
+ uint32 mask = mask2 & _vm->_palette->_palFlags[idx];
+ if (mask) {
+ _vm->_palette->_palFlags[idx] = (_vm->_palette->_palFlags[idx] &
+ mask1) | mask3;
+ }
+ }
+
+ _vm->_palette->_rgbList[sceneUsageIndex] = true;
+}
+
+void PaletteUsage::resetPalFlags(int idx) {
+ if (idx >= 0 && idx < 32) {
+ uint32 rgbMask = ~(1 << idx);
+
+ uint32 *flagP = _vm->_palette->_palFlags;
+ for (int i = 0; i < 256; ++i, ++flagP) {
+ *flagP &= rgbMask;
+ if (*flagP == 2)
+ *flagP = 0;
+ }
+
+ _vm->_palette->_rgbList[idx] = false;
+ }
+}
+
+int PaletteUsage::getGamePalFreeIndex(int *palIndex) {
+ *palIndex = -1;
+ int count = 0;
+
+ for (int i = 0; i < PALETTE_COUNT; ++i) {
+ if (!_vm->_palette->_palFlags[i]) {
+ ++count;
+ if (*palIndex < 0)
+ *palIndex = i;
+ }
+ }
+
+ return count;
+}
+
+int PaletteUsage::rgbFactor(byte *palEntry, RGB6 &pal6) {
+ int total = 0;
+ total += (palEntry[0] - pal6.r) * (palEntry[0] - pal6.r);
+ total += (palEntry[1] - pal6.g) * (palEntry[1] - pal6.g);
+ total += (palEntry[2] - pal6.b) * (palEntry[2] - pal6.b);
+
+ return total;
+}
+
+/*------------------------------------------------------------------------*/
+
+void RGBList::clear() {
+ for (int i = 0; i < 32; i++)
+ _data[i] = false;
+}
+
+void RGBList::reset() {
+ for (int i = 2; i < 32; i++)
+ _data[i] = false;
+}
+
+int RGBList::scan() {
+ for (int i = 0; i < 32; ++i) {
+ if (!_data[i])
+ return i;
+ }
+
+ error("RGBList was full");
+}
+
+void RGBList::copy(RGBList &src) {
+ Common::copy(&src._data[0], &src._data[32], &_data[0]);
+}
+
+/*------------------------------------------------------------------------*/
+
+Fader::Fader(MADSEngine *vm)
+ : _vm(vm) {
+ _colorFlags[0] = _colorFlags[1] = _colorFlags[2] = true;
+ _colorFlags[3] = false;
+ _colorValues[0] = _colorValues[1] = 0;
+ _colorValues[2] = _colorValues[3] = 0;
+
+ // TODO: It would be better if the fader routines could be refactored
+ // to work directly with 8-bit RGB values rather than 6-bit RGB values
+ Common::fill(&_rgb64Map[0], &_rgb64Map[PALETTE_COUNT], 0);
+ for (int i = 0; i < 64; ++i)
+ _rgb64Map[VGA_COLOR_TRANS(i)] = i;
+ byte v = 0;
+ for (int i = 0; i < PALETTE_COUNT; ++i) {
+ if (_rgb64Map[i])
+ v = _rgb64Map[i];
+ else
+ _rgb64Map[i] = v;
+ }
+}
+
+
+void Fader::setPalette(const byte *colors, uint start, uint num) {
+ g_system->getPaletteManager()->setPalette(colors, start, num);
+}
+
+void Fader::grabPalette(byte *colors, uint start, uint num) {
+ g_system->getPaletteManager()->grabPalette(colors, start, num);
+}
+
+void Fader::fadeOut(byte palette[PALETTE_SIZE], byte *paletteMap,
+ int baseColor, int numColors, int baseGrey, int numGreys,
+ int tickDelay, int steps) {
+ GreyEntry map[PALETTE_COUNT];
+ int intensity;
+ byte palIndex[PALETTE_COUNT][3];
+ int8 signs[PALETTE_COUNT][3];
+
+ mapToGreyRamp(palette, baseColor, numColors, baseGrey, numGreys, map);
+
+ for (int palCtr = baseColor; palCtr < (baseColor + numColors); ++palCtr) {
+ int index = palCtr - baseColor;
+ for (int colorCtr = 0; colorCtr < 3; ++colorCtr) {
+ if (_colorFlags[colorCtr]) {
+ int shiftSign = _colorValues[colorCtr];
+ if (shiftSign >= 0) {
+ intensity = map[index]._intensity << shiftSign;
+ } else {
+ intensity = map[index]._intensity >> ABS(shiftSign);
+ }
+ } else {
+ intensity = _colorValues[colorCtr];
+ }
+
+ int diff = intensity - _rgb64Map[palette[palCtr * 3 + colorCtr]];
+ palIndex[palCtr][colorCtr] = (byte)ABS(diff);
+ signs[palCtr][colorCtr] = (diff == 0) ? 0 : (diff < 0 ? -1 : 1);
+ }
+ }
+
+ for (int stepCtr = 0; stepCtr < steps; ++stepCtr) {
+ for (int palCtr = baseColor; palCtr < (baseColor + numColors); ++palCtr) {
+ int index = palCtr - baseColor;
+ for (int colorCtr = 0; colorCtr < 3; ++colorCtr) {
+ map[index]._accum[colorCtr] += palIndex[palCtr][colorCtr];
+ while (map[index]._accum[colorCtr] >= steps) {
+ map[index]._accum[colorCtr] -= steps;
+
+ byte rgb63 = _rgb64Map[palette[palCtr * 3 + colorCtr]] +
+ signs[palCtr][colorCtr];
+ palette[palCtr * 3 + colorCtr] = VGA_COLOR_TRANS(rgb63);
+ }
+ }
+ }
+
+ setFullPalette(palette);
+
+ _vm->_events->waitForNextFrame();
+ }
+
+ if (paletteMap != nullptr) {
+ for (int palCtr = 0; palCtr < numColors; palCtr++) {
+ paletteMap[palCtr] = map[palCtr]._mapColor;
+ }
+ }
+}
+
+void Fader::fadeIn(byte palette[PALETTE_SIZE], byte destPalette[PALETTE_SIZE],
+ int baseColor, int numColors, int baseGrey, int numGreys,
+ int tickDelay, int steps) {
+ GreyEntry map[PALETTE_COUNT];
+ byte tempPal[PALETTE_SIZE];;
+ int8 signs[PALETTE_COUNT][3];
+ byte palIndex[PALETTE_COUNT][3];
+ int intensity;
+
+ Common::copy(destPalette, destPalette + PALETTE_SIZE, tempPal);
+
+ mapToGreyRamp(tempPal, baseColor, numColors, baseGrey, numGreys, map);
+
+ for (int palCtr = baseColor; palCtr < (baseColor + numColors); ++palCtr) {
+ int index = palCtr - baseColor;
+ for (int colorCtr = 0; colorCtr < 3; ++colorCtr) {
+ if (_colorFlags[colorCtr]) {
+ int shiftSign = _colorValues[colorCtr];
+ if (shiftSign >= 0) {
+ intensity = map[index]._intensity << shiftSign;
+ }
+ else {
+ intensity = map[index]._intensity >> abs(shiftSign);
+ }
+ }
+ else {
+ intensity = _colorValues[colorCtr];
+ }
+
+ int diff = _rgb64Map[destPalette[palCtr * 3 + colorCtr]] - intensity;
+ palIndex[palCtr][colorCtr] = (byte)ABS(diff);
+ signs[palCtr][colorCtr] = (diff == 0) ? 0 : (diff < 0 ? -1 : 1);
+
+ map[index]._accum[colorCtr] = 0;
+ }
+ }
+
+ for (int stepCtr = 0; stepCtr < steps; ++stepCtr) {
+ for (int palCtr = baseColor; palCtr < (baseColor + numColors); ++palCtr) {
+ int index = palCtr - baseColor;
+ for (int colorCtr = 0; colorCtr < 3; ++colorCtr) {
+ map[index]._accum[colorCtr] += palIndex[palCtr][colorCtr];
+ while (map[index]._accum[colorCtr] >= steps) {
+ map[index]._accum[colorCtr] -= steps;
+
+ byte rgb63 = _rgb64Map[palette[palCtr * 3 + colorCtr]] +
+ signs[palCtr][colorCtr];
+ palette[palCtr * 3 + colorCtr] = VGA_COLOR_TRANS(rgb63);
+ }
+ }
+ }
+
+ setFullPalette(palette);
+
+ _vm->_events->waitForNextFrame();
+ }
+}
+
+void Fader::mapToGreyRamp(byte palette[PALETTE_SIZE], int baseColor, int numColors,
+ int baseGrey, int numGreys, GreyEntry *map) {
+ byte greyList[PALETTE_COUNT];
+ byte greyMapping[PALETTE_COUNT];
+ byte greyTable[64];
+ byte greyIntensity[64];
+ int intensity, shiftSign;
+
+ getGreyValues(palette, greyList, baseColor, numColors);
+ greyPopularity(greyList, greyTable, numColors);
+
+ for (int idx = 0; idx < numColors; ++idx) {
+ greyMapping[idx] = idx;
+ Common::fill(&map[idx]._accum[0], &map[idx]._accum[3], 0);
+ }
+
+ for (int idx = 0; idx < PALETTE_COUNT; ++idx) {
+ map[idx]._mapColor = (byte)idx;
+ }
+
+ // Sort the mapping lists
+ insertionSort(numColors, greyList, greyMapping);
+
+ // Initialize state variables
+ int greySum = 0;
+ int greyScan = 0;
+ int greyMark = 0;
+ int greyColors = 0;
+ int greyAccum = 0;
+ int firstColor = 0;
+
+ for (int greyCtr = 0; greyCtr < 64; ++greyCtr) {
+ for (int idx = 0; idx < greyTable[greyCtr]; ++idx) {
+ greySum += greyList[greyScan++];
+ ++greyColors;
+
+ greyAccum += numGreys;
+ while (greyAccum >= numColors) {
+ greyAccum -= numColors;
+ if (greyColors > 0) {
+ greyIntensity[greyMark] = (byte)(greySum / greyColors);
+ }
+
+ for (int rescan = firstColor; rescan < greyScan; ++rescan) {
+ map[greyMapping[rescan]]._intensity = greyIntensity[greyMark];
+ map[greyMapping[rescan]]._mapColor = (byte)(greyMark + baseGrey);
+ }
+
+ firstColor = greyScan;
+ greySum = 0;
+ greyColors = 0;
+ ++greyMark;
+ }
+ }
+ }
+
+ // Set the palette range of greyscale values to be used
+ byte *palP = &palette[baseGrey * 3];
+ for (int greys = 0; greys < numGreys; ++greys) {
+ for (int color = 0; color < 3; ++color) {
+ if (_colorFlags[color]) {
+ shiftSign = (byte)_colorValues[color];
+ if (shiftSign >= 0) {
+ intensity = greyIntensity[greys] << shiftSign;
+ } else {
+ intensity = greyIntensity[greys] >> abs(shiftSign);
+ }
+ } else {
+ intensity = _colorValues[color];
+ }
+ *palP++ = VGA_COLOR_TRANS(intensity);
+ }
+ }
+}
+
+void Fader::getGreyValues(const byte palette[PALETTE_SIZE],
+ byte greyList[PALETTE_COUNT], int baseColor, int numColors) {
+ const byte *palP = &palette[baseColor * 3];
+
+ for (int i = 0; i < numColors; ++i, palP += 3) {
+ int v = rgbMerge(palP[0], palP[1], palP[2]);
+ greyList[i] = v >> 7;
+ }
+}
+
+void Fader::greyPopularity(const byte greyList[PALETTE_COUNT],
+ byte greyTable[64], int numColors) {
+ Common::fill(&greyTable[0], &greyTable[64], 0);
+ for (int i = 0; i < numColors; ++i) {
+ int idx = greyList[i];
+ ++greyTable[idx];
+ }
+}
+
+void Fader::insertionSort(int size, byte *id, byte *value) {
+ bool restartFlag;
+ int endIndex = size - 1;
+
+ do {
+ restartFlag = false;
+ if (endIndex <= 0)
+ break;
+
+ for (int arrIndex = 0; arrIndex < endIndex && !restartFlag; ++arrIndex) {
+ byte *idP = id + arrIndex;
+ byte *valueP = value + arrIndex;
+
+ // Check whether the next index is out of order with the one following it
+ if (*idP > *(idP + 1)) {
+ // Found an incorrect ordering
+ restartFlag = true;
+
+ // Save id/value at current index
+ byte savedId = *idP;
+ byte savedValue = *valueP;
+
+ int moveCount = size - arrIndex - 1;
+ if (moveCount > 0) {
+ Common::copy(idP + 1, idP + moveCount + 2, idP);
+ Common::copy(valueP + 1, valueP + moveCount + 2, valueP);
+ }
+
+ // Scan for insert spot
+ int idx = 0;
+ if (endIndex > 0) {
+ bool breakFlag = false;
+ for (; idx <= endIndex && !breakFlag; ++idx) {
+ breakFlag = savedId < id[idx];
+ }
+ }
+
+ // Set up an insert point for entry
+ moveCount = size - idx - 1;
+ if (moveCount > 0) {
+ Common::copy_backward(id + idx, id + idx + moveCount, id + idx + moveCount + 1);
+ Common::copy_backward(value + idx, value + idx + moveCount, value + idx + moveCount + 1);
+ }
+
+ // Set shifted values at the new position
+ id[idx] = savedId;
+ value[idx] = savedValue;
+ }
+ }
+ } while (restartFlag);
+}
+
+int Fader::rgbMerge(RGB6 &palEntry) {
+ return rgbMerge(palEntry.r, palEntry.g, palEntry.b);
+}
+
+int Fader::rgbMerge(byte r, byte g, byte b) {
+ return _rgb64Map[r] * 38 + _rgb64Map[g] * 76 + _rgb64Map[b] * 14;
+}
+
+/*------------------------------------------------------------------------*/
+
+Palette::Palette(MADSEngine *vm) : Fader(vm), _paletteUsage(vm) {
+ _lockFl = false;
+ _lowRange = 0;
+ _highRange = 0;
+ Common::fill(&_mainPalette[0], &_mainPalette[PALETTE_SIZE], 0);
+ Common::fill(&_palFlags[0], &_palFlags[PALETTE_COUNT], 0);
+}
+
+void Palette::setEntry(byte palIndex, byte r, byte g, byte b) {
+ _mainPalette[palIndex * 3] = VGA_COLOR_TRANS(r);
+ _mainPalette[palIndex * 3 + 1] = VGA_COLOR_TRANS(g);
+ _mainPalette[palIndex * 3 + 2] = VGA_COLOR_TRANS(b);
+
+ setPalette((const byte *)&_mainPalette[palIndex * 3], palIndex, 1);
+}
+
+uint8 Palette::palIndexFromRgb(byte r, byte g, byte b, byte *paletteData) {
+ byte index = 0;
+ int32 minDist = 0x7fffffff;
+ byte palData[PALETTE_SIZE];
+
+ if (paletteData == NULL) {
+ g_system->getPaletteManager()->grabPalette(palData, 0, PALETTE_COUNT);
+ paletteData = &palData[0];
+ }
+
+ for (int palIndex = 0; palIndex < PALETTE_COUNT; ++palIndex) {
+ int Rdiff = r - paletteData[palIndex * 3];
+ int Gdiff = g - paletteData[palIndex * 3 + 1];
+ int Bdiff = b - paletteData[palIndex * 3 + 2];
+
+ if (Rdiff * Rdiff + Gdiff * Gdiff + Bdiff * Bdiff < minDist) {
+ minDist = Rdiff * Rdiff + Gdiff * Gdiff + Bdiff * Bdiff;
+ index = (uint8)palIndex;
+ }
+ }
+
+ return (uint8)index;
+}
+
+void Palette::setGradient(byte *palette, int start, int count, int rgbValue1, int rgbValue2) {
+ int rgbCurrent = rgbValue2;
+ int rgbDiff = -(rgbValue2 - rgbValue1);
+
+ if (count > 0) {
+ byte *pDest = palette + start * 3;
+ int endVal = count - 1;
+ int numLeft = count;
+
+ int rgbCtr = 0;
+ do {
+ pDest[0] = pDest[1] = pDest[2] = rgbCurrent;
+
+ if (numLeft > 1) {
+ rgbCtr += rgbDiff;
+ if (rgbCtr >= endVal) {
+ do {
+ ++rgbCurrent;
+ rgbCtr += 1 - numLeft;
+ } while (rgbCtr >= endVal);
+ }
+ }
+
+ pDest += 3;
+ } while (--numLeft > 0);
+ }
+}
+
+void Palette::setSystemPalette() {
+ byte palData[4 * 3];
+ palData[0 * 3] = palData[0 * 3 + 1] = palData[0 * 3 + 2] = 0;
+ palData[1 * 3] = palData[1 * 3 + 1] = palData[1 * 3 + 2] = 0x54;
+ palData[2 * 3] = palData[2 * 3 + 1] = palData[2 * 3 + 2] = 0xb4;
+ palData[3 * 3] = palData[3 * 3 + 1] = palData[3 * 3 + 2] = 0xff;
+
+ setPalette(palData, 0, 4);
+}
+
+void Palette::resetGamePalette(int lowRange, int highRange) {
+ Common::fill((byte *)&_palFlags[0], (byte *)&_palFlags[PALETTE_COUNT], 0);
+ initVGAPalette(_mainPalette);
+
+ // Reserve the start of the palette for things like on-screen text
+ if (lowRange) {
+ Common::fill(&_palFlags[0], &_palFlags[lowRange], 1);
+ }
+
+ // Reserve the high end of the palette for dialog display
+ if (highRange) {
+ Common::fill(&_palFlags[256 - highRange], &_palFlags[256], 1);
+ }
+
+ _rgbList.clear();
+ _rgbList[0] = _rgbList[1] = true;
+
+ _lockFl = false;
+ _lowRange = lowRange;
+ _highRange = highRange;
+}
+
+void Palette::initPalette() {
+ uint32 palMask = 1;
+
+ if (_vm->_game->_player._spritesLoaded && _vm->_game->_player._numSprites) {
+
+ for (int idx = 0; idx < _vm->_game->_player._numSprites; ++idx) {
+ SpriteAsset *asset = _vm->_game->_scene._sprites[
+ _vm->_game->_player._spritesStart + idx];
+
+ uint32 mask = 1;
+ if (asset->_usageIndex)
+ mask <<= asset->_usageIndex;
+
+ palMask = mask;
+ }
+ }
+
+ for (int idx = 0; idx < PALETTE_COUNT; ++idx)
+ _palFlags[idx] = palMask;
+
+ _lockFl = false;
+ _rgbList.reset();
+}
+
+void Palette::initVGAPalette(byte *palette) {
+ byte *destP = palette;
+ for (int palIndex = 0; palIndex < 16; ++palIndex) {
+ for (int byteCtr = 2; byteCtr >= 0; --byteCtr)
+ *destP++ = ((DEFAULT_VGA_LOW_PALETTE[palIndex] >> (8 * byteCtr)) & 0xff) >> 2;
+ }
+
+ destP = &palette[0xF0 * 3];
+ for (int palIndex = 0; palIndex < 16; ++palIndex) {
+ for (int byteCtr = 2; byteCtr >= 0; --byteCtr)
+ *destP++ = ((DEFAULT_VGA_HIGH_PALETTE[palIndex] >> (8 * byteCtr)) & 0xff) >> 2;
+ }
+}
+
+void Palette::setLowRange() {
+ _mainPalette[0] = _mainPalette[1] = _mainPalette[2] = VGA_COLOR_TRANS(0);
+ _mainPalette[3] = _mainPalette[4] = _mainPalette[5] = VGA_COLOR_TRANS(0x15);
+ _mainPalette[6] = _mainPalette[7] = _mainPalette[8] = VGA_COLOR_TRANS(0x2A);
+ _mainPalette[9] = _mainPalette[10] = _mainPalette[11] = VGA_COLOR_TRANS(0x3F);
+ _vm->_palette->setPalette(_mainPalette, 0, 4);
+}
+
+void Palette::setColorFlags(byte r, byte g, byte b) {
+ _colorFlags[0] = r;
+ _colorFlags[1] = g;
+ _colorFlags[2] = b;
+}
+
+void Palette::setColorValues(byte r, byte g, byte b) {
+ _colorValues[0] = r;
+ _colorValues[1] = g;
+ _colorValues[2] = b;
+}
+
+void Palette::lock() {
+ if (_rgbList[31] && !_lockFl)
+ error("Palette Lock - Unexpected values");
+
+ _lockFl = true;
+ _rgbList[31] = true;
+
+ for (int i = 0; i < 256; i++) {
+ if (_palFlags[i])
+ _palFlags[i] |= 0x80000000;
+ }
+}
+
+void Palette::unlock() {
+ if (!_lockFl)
+ return;
+
+ for (int i = 0; i < 256; i++)
+ _palFlags[i] &= 0x7FFFFFFF;
+
+ _rgbList[31] = false;
+ _lockFl = false;
+}
+
+void Palette::refreshSceneColors() {
+ int val = 18;
+ if (_vm->_game->_scene._cyclingActive)
+ val += _vm->_game->_scene._totalCycleColors;
+
+ setPalette(_mainPalette + (val * 3), val, 256 - val);
+}
+
+} // End of namespace MADS
diff --git a/engines/mads/palette.h b/engines/mads/palette.h
new file mode 100644
index 0000000000..975167a458
--- /dev/null
+++ b/engines/mads/palette.h
@@ -0,0 +1,323 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+
+ * You should have received a copy of the GNU General Public 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 MADS_PALETTE_H
+#define MADS_PALETTE_H
+
+#include "common/scummsys.h"
+#include "common/stream.h"
+
+namespace MADS {
+
+class MADSEngine;
+
+#define PALETTE_USAGE_COUNT 4
+
+#define PALETTE_RESERVED_LOW_COUNT 18
+#define PALETTE_RESERVED_HIGH_COUNT 10
+
+#define PALETTE_COUNT 256
+#define PALETTE_SIZE (256 * 3)
+
+/**
+ * Palette mapping options
+ */
+enum {
+ PALFLAG_BACKGROUND = 0x8000, // Loading initial background
+ PALFLAG_RESERVED = 0x4000, // Enable mapping reserved colors
+ PALFLAG_ANY_TO_CLOSEST = 0x2000, // Any color can map to closest
+ PALFLAG_ALL_TO_CLOSEST = 0x1000, // Any colors that can map must map
+ PALFLAG_TOP_COLORS = 0x0800, // Allow mapping to high four colors
+ PALFLAG_DEFINE_RESERVED = 0x0400, // Define initial reserved color
+ PALFLAG_MASK = 0xfc00 // Mask for all the palette flags
+};
+
+struct PaletteCycle {
+ byte _colorCount;
+ byte _firstListColor;
+ byte _firstColorIndex;
+ byte _ticks;
+
+ PaletteCycle() { _colorCount = _firstListColor = _firstColorIndex = _ticks = 0; }
+};
+
+struct RGB6 {
+ byte r;
+ byte g;
+ byte b;
+ byte _palIndex;
+ byte _u2;
+ byte _flags;
+
+ /**
+ * Load an entry from a stream
+ */
+ void load(Common::SeekableReadStream *f);
+};
+
+class PaletteUsage {
+public:
+ struct UsageEntry {
+ uint16 _palIndex;
+ int _sortValue;
+
+ UsageEntry(int palIndex) { _palIndex = palIndex; _sortValue = -1; }
+ UsageEntry() { _palIndex = 0; _sortValue = 0; }
+ };
+ struct UsageRange {
+ byte _v1, _v2;
+
+ UsageRange(byte v1, byte v2) { _v1 = v1; _v2 = v2; }
+ };
+private:
+ MADSEngine *_vm;
+ Common::Array<UsageEntry> *_data;
+
+ int getGamePalFreeIndex(int *palIndex);
+
+ int rgbFactor(byte *palEntry, RGB6 &pal6);
+
+ Common::Array<UsageEntry> _nullUsage;
+public:
+ /**
+ * Constructor
+ */
+ PaletteUsage(MADSEngine *vm);
+
+ void load(Common::Array<UsageEntry> *data);
+
+ /**
+ * Returns whether the usage list is empty
+ */
+ bool empty() const { return _data == nullptr; }
+
+ uint16 &operator[](int index) { return (*_data)[index]._palIndex; }
+
+ /**
+ * Assigns the class to an empty usage array
+ */
+ void setEmpty() { _data = &_nullUsage; }
+
+ /**
+ * Gets key entries from the passed palette
+ * @param palette 6-bit per entry read in palette
+ */
+ void getKeyEntries(Common::Array<RGB6> &palette);
+
+ /**
+ * Prioritizes the palette index list based on the intensity of the
+ * RGB values of the palette entries that they refer to
+ */
+ void prioritize(Common::Array<RGB6> &palette);
+
+ int process(Common::Array<RGB6> &palette, uint flags);
+
+ void transform(Common::Array<RGB6> &palette);
+
+ void updateUsage(Common::Array<int> &usageList, int sceneUsageIndex);
+
+ void resetPalFlags(int idx);
+};
+
+class RGBList {
+private:
+ bool _data[32];
+public:
+ RGBList() { clear(); }
+
+ void clear();
+
+ void reset();
+
+ /**
+ * Copies the data from another instance
+ */
+ void copy(RGBList &src);
+
+ /**
+ * Scans for a free slot
+ */
+ int scan();
+
+ bool &operator[](int idx) { return _data[idx]; }
+};
+
+class Fader {
+public:
+ struct GreyEntry {
+ byte _intensity;
+ byte _mapColor;
+ uint16 _accum[3];
+ };
+private:
+ void mapToGreyRamp(byte palette[PALETTE_SIZE], int baseColor, int numColors,
+ int baseGrey, int numGreys, GreyEntry *map);
+
+ void getGreyValues(const byte palette[PALETTE_SIZE], byte greyList[PALETTE_COUNT],
+ int baseColor, int numColors);
+
+ /**
+ * Given a grey value list containing grey shades (0-63), creates a 64 byte
+ * grey table containing the number of grey values for each intensity
+ */
+ void greyPopularity(const byte greyList[PALETTE_COUNT], byte greyTable[64], int numColors);
+
+ /**
+ * Does an insertion sort of a given id/value array pair
+ */
+ void insertionSort(int size, byte *id, byte *value);
+protected:
+ MADSEngine *_vm;
+ byte _rgb64Map[PALETTE_COUNT];
+public:
+ bool _colorFlags[4];
+ int _colorValues[4];
+public:
+ /**
+ * Constructor
+ */
+ Fader(MADSEngine *vm);
+
+ /**
+ * Sets a new palette
+ */
+ void setPalette(const byte *colors, uint start, uint num);
+
+ /**
+ * Returns a subset of the currently loaded palette
+ */
+ void grabPalette(byte *colors, uint start, uint num);
+
+ /**
+ * Gets the entire palette at once
+ */
+ void getFullPalette(byte palette[PALETTE_SIZE]) {
+ grabPalette(&palette[0], 0, PALETTE_COUNT);
+ }
+
+ /**
+ * Sets the entire palette at once
+ */
+ void setFullPalette(byte palette[PALETTE_SIZE]) {
+ setPalette(&palette[0], 0, PALETTE_COUNT);
+ }
+
+ /**
+ * Calculates a merge/hash for a given palette entry
+ */
+ int rgbMerge(byte r, byte g, byte b);
+
+ /**
+ * Calculates a merge/hash for a given palette entry
+ */
+ int rgbMerge(RGB6 &palEntry);
+
+ /**
+ * Fades the given palette out to black or grey
+ */
+ void fadeOut(byte palette[PALETTE_SIZE], byte *paletteMap,
+ int baseColor, int numColors, int baseGrey, int numGreys,
+ int tickDelay, int steps);
+
+ /**
+ * Fade into the given palette
+ */
+ void fadeIn(byte palette[PALETTE_SIZE], byte destPalette[PALETTE_SIZE],
+ int baseColor, int numColors, int baseGrey, int numGreys,
+ int tickDelay, int steps);
+};
+
+class Palette : public Fader {
+private:
+ /**
+ * Initializes the first 16 palette indexes with the equivalent
+ * standard VGA palette
+ */
+ void initVGAPalette(byte *palette);
+public:
+ byte _mainPalette[PALETTE_SIZE];
+ byte _cyclingPalette[PALETTE_SIZE];
+ uint32 _palFlags[PALETTE_COUNT];
+ PaletteUsage _paletteUsage;
+ RGBList _rgbList;
+ bool _lockFl;
+ int _lowRange;
+ int _highRange;
+public:
+ /**
+ * Constructor
+ */
+ Palette(MADSEngine *vm);
+
+ /**
+ * Destructor
+ */
+ virtual ~Palette() {}
+
+ /**
+ * Set a palette entry
+ */
+ void setEntry(byte palIndex, byte r, byte g, byte b);
+
+ /**
+ * Returns the palette index in the palette that most closely matches the
+ * specified RGB pair
+ */
+ uint8 palIndexFromRgb(byte r, byte g, byte b, byte *paletteData = nullptr);
+
+ /**
+ * Sets a small set of system/core colors needed by the game
+ */
+ void setSystemPalette();
+
+ /**
+ * Update a range of an arbitrary palette
+ */
+ static void setGradient(byte *palette, int start, int count, int rgbValue1, int rgbValue2);
+
+ /**
+ * Resets the game palette
+ */
+ void resetGamePalette(int v1, int v2);
+
+ /**
+ * Initializes the main palette
+ */
+ void initPalette();
+
+ /**
+ * Set the first four palette entries with preset values
+ */
+ void setLowRange();
+
+ void setColorFlags(byte r, byte g, byte b);
+ void setColorValues(byte r, byte g, byte b);
+
+ void lock();
+ void unlock();
+
+ void refreshSceneColors();
+};
+
+} // End of namespace MADS
+
+#endif /* MADS_PALETTE_H */
diff --git a/engines/mads/phantom/game_phantom.cpp b/engines/mads/phantom/game_phantom.cpp
new file mode 100644
index 0000000000..b0b1bf7836
--- /dev/null
+++ b/engines/mads/phantom/game_phantom.cpp
@@ -0,0 +1,147 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+
+ * You should have received a copy of the GNU General Public 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 "mads/mads.h"
+#include "mads/game.h"
+#include "mads/screen.h"
+#include "mads/msurface.h"
+#include "mads/phantom/game_phantom.h"
+//#include "mads/nebular/dialogs_nebular.h"
+//#include "mads/nebular/globals_nebular.h"
+#include "mads/phantom/phantom_scenes.h"
+
+namespace MADS {
+
+namespace Phantom {
+
+GamePhantom::GamePhantom(MADSEngine *vm)
+ : Game(vm) {
+ _surface = new MSurface(MADS_SCREEN_WIDTH, MADS_SCENE_HEIGHT);
+ _storyMode = STORYMODE_NAUGHTY;
+}
+
+void GamePhantom::startGame() {
+ initializeGlobals();
+}
+
+void GamePhantom::initializeGlobals() {
+ //int count, count2;
+ //int bad;
+
+ _globals.reset();
+ //_globals[kTalkInanimateCount] = 8;
+
+ /* Section #1 variables */
+ // TODO
+
+ /* Section #2 variables */
+ // TODO
+
+ /* Section #3 variables */
+ // TODO
+
+ /* Section #4 variables */
+ // TODO
+
+ /* Section #5 variables */
+ // TODO
+
+ /* Section #9 variables */
+ // TODO
+
+ _player._facing = FACING_NORTH;
+ _player._turnToFacing = FACING_NORTH;
+
+ //Player::preloadSequences("RXM", 1);
+ //Player::preloadSequences("ROX", 1);
+}
+
+void GamePhantom::setSectionHandler() {
+ delete _sectionHandler;
+
+ switch (_sectionNumber) {
+ case 1:
+ _sectionHandler = new Section1Handler(_vm);
+ break;
+ case 2:
+ _sectionHandler = new Section2Handler(_vm);
+ break;
+ case 3:
+ _sectionHandler = new Section3Handler(_vm);
+ break;
+ case 4:
+ _sectionHandler = new Section4Handler(_vm);
+ break;
+ case 5:
+ _sectionHandler = new Section5Handler(_vm);
+ break;
+ default:
+ break;
+ }
+}
+
+void GamePhantom::checkShowDialog() {
+ // TODO: Copied from Nebular
+ if (_vm->_dialogs->_pendingDialog && _player._stepEnabled && !_globals[5]) {
+ _player.releasePlayerSprites();
+ _vm->_dialogs->showDialog();
+ _vm->_dialogs->_pendingDialog = DIALOG_NONE;
+ }
+}
+
+void GamePhantom::doObjectAction() {
+ // TODO: Copied from Nebular
+ //Scene &scene = _scene;
+ MADSAction &action = _scene._action;
+ //Dialogs &dialogs = *_vm->_dialogs;
+ //int id;
+
+ action._inProgress = false;
+}
+
+void GamePhantom::unhandledAction() {
+ // TODO
+}
+
+void GamePhantom::step() {
+ if (_player._visible && _player._stepEnabled && !_player._moving &&
+ (_player._facing == _player._turnToFacing)) {
+
+ // TODO
+ }
+
+}
+
+void GamePhantom::synchronize(Common::Serializer &s, bool phase1) {
+ Game::synchronize(s, phase1);
+
+ // TODO: Copied from Nebular
+ if (!phase1) {
+ _globals.synchronize(s);
+ }
+}
+
+} // End of namespace Phantom
+
+} // End of namespace MADS
diff --git a/engines/mads/phantom/game_phantom.h b/engines/mads/phantom/game_phantom.h
new file mode 100644
index 0000000000..99cc2c1230
--- /dev/null
+++ b/engines/mads/phantom/game_phantom.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.
+ *
+ */
+
+#ifndef MADS_GAME_PHANTOM_H
+#define MADS_GAME_PHANTOM_H
+
+#include "common/scummsys.h"
+#include "mads/game.h"
+#include "mads/globals.h"
+//#include "mads/nebular/globals_nebular.h"
+
+namespace MADS {
+
+namespace Phantom {
+
+// TODO: Adapt for Phantom's difficulty setting
+enum StoryMode { STORYMODE_NAUGHTY = 1, STORYMODE_NICE = 2 };
+
+enum InventoryObject {
+ OBJ_NONE = -1,
+ OBJ_KEY = 0,
+ OBJ_LANTERN = 1,
+ OBJ_RED_FRAME = 2,
+ OBJ_SANDBAG = 3,
+ OBJ_YELLOW_FRAME = 4,
+ OBJ_FIRE_AXE = 5,
+ OBJ_SMALL_NOTE = 6,
+ OBJ_ROPE = 7,
+ OBJ_SWORD = 8,
+ OBJ_ENVELOPE = 9,
+ OBJ_TICKET = 10,
+ OBJ_PIECE_OF_PAPER = 11,
+ OBJ_PARCHMENT = 12,
+ OBJ_LETTER = 13,
+ OBJ_NOTICE = 14,
+ OBJ_BOOK = 15,
+ OBJ_CRUMPLED_NOTE = 16,
+ OBJ_BLUE_FRAME = 17,
+ OBJ_LARGE_NOTE = 18,
+ OBJ_GREEN_FRAME = 19,
+ OBJ_MUSIC_SCORE = 20,
+ OBJ_WEDDING_RING = 21,
+ OBJ_CABLE_HOOK = 22,
+ OBJ_ROPE_WITH_HOOK = 23,
+ OBJ_OAR = 24
+};
+
+// HACK: A stub for now, remove from here once it's implemented properly
+class PhantomGlobals : public Globals {
+public:
+ PhantomGlobals() {
+ resize(210); // Rex has 210 globals
+ }
+ virtual ~PhantomGlobals() {}
+};
+
+class GamePhantom : public Game {
+ friend class Game;
+protected:
+ GamePhantom(MADSEngine *vm);
+
+ virtual void startGame();
+
+ virtual void initializeGlobals();
+
+ virtual void setSectionHandler();
+
+ virtual void checkShowDialog();
+public:
+ PhantomGlobals _globals;
+ StoryMode _storyMode;
+
+ virtual Globals &globals() { return _globals; }
+
+ virtual void doObjectAction();
+
+ virtual void unhandledAction();
+
+ virtual void step();
+
+ virtual void synchronize(Common::Serializer &s, bool phase1);
+};
+
+
+class Section1Handler : public SectionHandler {
+public:
+ Section1Handler(MADSEngine *vm) : SectionHandler(vm) {}
+
+ // TODO: Properly implement handler methods
+ virtual void preLoadSection() {}
+ virtual void sectionPtr2() {}
+ virtual void postLoadSection() {}
+};
+
+// TODO: Properly implement handler classes
+typedef Section1Handler Section2Handler;
+typedef Section1Handler Section3Handler;
+typedef Section1Handler Section4Handler;
+typedef Section1Handler Section5Handler;
+
+} // End of namespace Nebular
+
+} // End of namespace MADS
+
+#endif /* MADS_GAME_PHANTOM_H */
diff --git a/engines/mads/phantom/phantom_scenes.cpp b/engines/mads/phantom/phantom_scenes.cpp
new file mode 100644
index 0000000000..dbce014525
--- /dev/null
+++ b/engines/mads/phantom/phantom_scenes.cpp
@@ -0,0 +1,204 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+
+ * You should have received a copy of the GNU General Public 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 "mads/mads.h"
+#include "mads/compression.h"
+#include "mads/resources.h"
+#include "mads/scene.h"
+#include "mads/phantom/game_phantom.h"
+#include "mads/phantom/phantom_scenes.h"
+
+namespace MADS {
+
+namespace Phantom {
+
+SceneLogic *SceneFactory::createScene(MADSEngine *vm) {
+ Scene &scene = vm->_game->_scene;
+
+ // TODO
+ //scene.addActiveVocab(NOUN_DROP);
+
+ switch (scene._nextSceneId) {
+ // Scene group #1 (theater, stage and dressing rooms)
+ case 101: // seats
+ return new DummyScene(vm); // TODO
+ case 102: // music stands
+ return new DummyScene(vm); // TODO
+ case 103: // below stage
+ return new DummyScene(vm); // TODO
+ case 104: // stage
+ return new DummyScene(vm); // TODO
+ case 105: // ground floor, storage room
+ return new DummyScene(vm); // TODO
+ case 106: // behind stage
+ return new DummyScene(vm); // TODO
+ case 107: // stage right wing
+ return new DummyScene(vm); // TODO
+ case 108: // stage left wing
+ return new DummyScene(vm); // TODO
+ case 109: // upper floor, staircase
+ return new DummyScene(vm); // TODO
+ case 110: // outside dressing rooms 1
+ return new DummyScene(vm); // TODO
+ case 111: // outside dressing rooms 2
+ return new DummyScene(vm); // TODO
+ case 112: // inside dressing room 1
+ return new DummyScene(vm); // TODO
+ case 113: // inside dressing room 2
+ return new DummyScene(vm); // TODO
+ case 114: // lower floor, storage room
+ return new DummyScene(vm); // TODO
+ case 150: // cutscene
+ return new DummyScene(vm); // TODO
+
+ // Scene group #2 (theater entrance, offices, balcony)
+ case 201: // entrance / ticket office
+ return new DummyScene(vm); // TODO
+ case 202: // outside offices / paintings room
+ return new DummyScene(vm); // TODO
+ case 203: // office
+ return new DummyScene(vm); // TODO
+ case 204: // library
+ return new DummyScene(vm); // TODO
+ case 205: // upper floor, outside balcony boxes
+ return new DummyScene(vm); // TODO
+ case 206: // balcony box #1
+ return new DummyScene(vm); // TODO
+ case 207: // balcony box #2
+ return new DummyScene(vm); // TODO
+ case 208: // stage and balcony view
+ return new DummyScene(vm); // TODO
+ case 250: // cutscene
+ return new DummyScene(vm); // TODO
+
+ // Scene group #3 (catwalks, chandelier, lake / catacombs entrance)
+ case 301: // catwalk #1 above stage
+ return new DummyScene(vm); // TODO
+ case 302: // catwalk #2 above stage
+ return new DummyScene(vm); // TODO
+ case 303: // above chandelier
+ return new DummyScene(vm); // TODO
+ case 304: // chandelier
+ return new DummyScene(vm); // TODO
+ case 305: // chandelier fight, phantom closeup
+ return new DummyScene(vm); // TODO
+ case 306: // chandelier #2
+ return new DummyScene(vm); // TODO
+ case 307: // catwalk #3 above stage
+ return new DummyScene(vm); // TODO
+ case 308: // hidden staircase behind balcony box
+ return new DummyScene(vm); // TODO
+ case 309: // lake and archway
+ return new DummyScene(vm); // TODO
+ case 310: // lake
+ return new DummyScene(vm); // TODO
+
+ // Scene group #4 (labyrinth)
+ case 401: // labyrinth room, 3 exits
+ return new DummyScene(vm); // TODO
+ case 403: // labyrinth room (big), 4 exits + 1 bricked door, left
+ return new DummyScene(vm); // TODO
+ case 404: // labyrinth room, 3 exits
+ return new DummyScene(vm); // TODO
+ case 406: // labyrinth room, 2 exits
+ return new DummyScene(vm); // TODO
+ case 407: // catacomb room / lake
+ return new DummyScene(vm); // TODO
+ case 408: // catacomb corridor
+ return new DummyScene(vm); // TODO
+ case 409: // catacomb room, door with switch panel
+ return new DummyScene(vm); // TODO
+ case 410: // skull switch panel
+ return new DummyScene(vm); // TODO
+ case 453: // Labyrinth room (big), 4 exits + 1 bricked door, right
+ return new DummyScene(vm); // TODO
+ case 456: // Labyrinth room, 2 exits
+ return new DummyScene(vm); // TODO
+
+ // Scene group #5 (Phantom's hideout)
+ case 501: // catacombs, outside phantom's hideout, lake and boat
+ return new DummyScene(vm); // TODO
+ case 502: // push panel trap
+ return new DummyScene(vm); // TODO
+ case 504: // Phantom's hideout, church organ
+ return new DummyScene(vm); // TODO
+ case 505: // Phantom's hideout, sarcophagus
+ return new DummyScene(vm); // TODO
+ case 506: // catacomb room with ramp
+ return new DummyScene(vm); // TODO
+
+ default:
+ error("Invalid scene %d called", scene._nextSceneId);
+ }
+}
+
+/*------------------------------------------------------------------------*/
+
+PhantomScene::PhantomScene(MADSEngine *vm) : SceneLogic(vm),
+ _globals(static_cast<GamePhantom *>(vm->_game)->_globals),
+ _game(*static_cast<GamePhantom *>(vm->_game)),
+ _action(vm->_game->_scene._action) {
+}
+
+Common::String PhantomScene::formAnimName(char sepChar, int suffixNum) {
+ return Resources::formatName(_scene->_currentSceneId, sepChar, suffixNum,
+ EXT_NONE, "");
+}
+
+/*------------------------------------------------------------------------*/
+
+void SceneInfoPhantom::loadCodes(MSurface &depthSurface, int variant) {
+ File f(Resources::formatName(RESPREFIX_RM, _sceneId, ".DAT"));
+ MadsPack codesPack(&f);
+ Common::SeekableReadStream *stream = codesPack.getItemStream(variant + 1);
+
+ loadCodes(depthSurface, stream);
+
+ delete stream;
+ f.close();
+}
+
+void SceneInfoPhantom::loadCodes(MSurface &depthSurface, Common::SeekableReadStream *stream) {
+ byte *destP = depthSurface.getData();
+ byte *endP = depthSurface.getBasePtr(0, depthSurface.h);
+
+ byte runLength = stream->readByte();
+ while (destP < endP && runLength > 0) {
+ byte runValue = stream->readByte();
+
+ // Write out the run length
+ Common::fill(destP, destP + runLength, runValue);
+ destP += runLength;
+
+ // Get the next run length
+ runLength = stream->readByte();
+ }
+
+ if (destP < endP)
+ Common::fill(destP, endP, 0);
+}
+
+} // End of namespace Phantom
+
+} // End of namespace MADS
diff --git a/engines/mads/phantom/phantom_scenes.h b/engines/mads/phantom/phantom_scenes.h
new file mode 100644
index 0000000000..cd295a28b6
--- /dev/null
+++ b/engines/mads/phantom/phantom_scenes.h
@@ -0,0 +1,521 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+
+ * You should have received a copy of the GNU General Public 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 MADS_PHANTOM_SCENES_H
+#define MADS_PHANTOM_SCENES_H
+
+#include "common/scummsys.h"
+#include "mads/game.h"
+#include "mads/scene.h"
+#include "mads/phantom/game_phantom.h"
+//#include "mads/phantom/globals_phantom.h"
+
+
+namespace MADS {
+
+namespace Phantom {
+
+enum Noun {
+ NOUN_GAME = 0x1,
+ NOUN_QSAVE = 0x2,
+ NOUN_LOOK = 0x3,
+ NOUN_TAKE = 0x4,
+ NOUN_PUSH = 0x5,
+ NOUN_OPEN = 0x6,
+ NOUN_PUT = 0x7,
+ NOUN_TALK_TO = 0x8,
+ NOUN_GIVE = 0x9,
+ NOUN_PULL = 0xA,
+ NOUN_CLOSE = 0xB,
+ NOUN_THROW = 0xC,
+ NOUN_WALK_TO = 0xD,
+ NOUN_ = 0xE,
+ NOUN_IN_ONE = 0xF,
+ NOUN_IN_TWO = 0x10,
+ NOUN_ACT_CURTAIN = 0x11,
+ NOUN_AISLE = 0x12,
+ NOUN_APRON = 0x13,
+ NOUN_ATTACK = 0x14,
+ NOUN_BACKSTAGE = 0x15,
+ NOUN_BEAR_PROP = 0x16,
+ NOUN_BLUE_FRAME = 0x17,
+ NOUN_BOOK = 0x18,
+ NOUN_BUST = 0x19,
+ NOUN_CABLE = 0x1A,
+ NOUN_CARPET = 0x1B,
+ NOUN_CARTON = 0x1C,
+ NOUN_CARTONS = 0x1D,
+ NOUN_CEILING = 0x1E,
+ NOUN_CHAIR = 0x1F,
+ NOUN_CIRCULAR_STAIRCASE = 0x20,
+ NOUN_CLIMB_DOWN = 0x21,
+ NOUN_CLIMB_INTO = 0x22,
+ NOUN_CLIMB_THROUGH = 0x23,
+ NOUN_COLUMN_PROP = 0x24,
+ NOUN_CONDUCTORS_STAND = 0x25,
+ NOUN_CORRIDOR = 0x26,
+ NOUN_COUCH = 0x27,
+ NOUN_COUNTERWEIGHT_SYSTEM = 0x28,
+ NOUN_CRATE = 0x29,
+ NOUN_CRATES = 0x2A,
+ NOUN_CRUMPLED_NOTE = 0x2B,
+ NOUN_CYCLORAMA = 0x2C,
+ NOUN_CYLINDER = 0x2D,
+ NOUN_DOOR = 0x2E,
+ NOUN_DRESSING_ROOM_DOOR = 0x2F,
+ NOUN_DRESSING_SCREEN = 0x30,
+ NOUN_DRESSING_TABLE = 0x31,
+ NOUN_ELEPHANT_PROP = 0x32,
+ NOUN_ENVELOPE = 0x33,
+ NOUN_EXIT = 0x34,
+ NOUN_EXIT_DOWN = 0x35,
+ NOUN_EXIT_SIGN = 0x36,
+ NOUN_EXIT_TO = 0x37,
+ NOUN_EXIT_TO_BACKSTAGE = 0x38,
+ NOUN_EXIT_TO_CELLAR = 0x39,
+ NOUN_EXIT_TO_CORRIDOR = 0x3A,
+ NOUN_EXIT_TO_DRESSING_RMS = 0x3B,
+ NOUN_EXIT_TO_LEFT_WING = 0x3C,
+ NOUN_EXIT_TO_PIT = 0x3D,
+ NOUN_EXIT_TO_RIGHT_WING = 0x3E,
+ NOUN_EXIT_TO_STAGE = 0x3F,
+ NOUN_EXIT_TO_STAIRWELL = 0x40,
+ NOUN_EXIT_TO_TRAP_ROOM = 0x41,
+ NOUN_EXIT_UP = 0x42,
+ NOUN_EXPOSED_BRICK = 0x43,
+ NOUN_FAN = 0x44,
+ NOUN_FIRE_AXE = 0x45,
+ NOUN_FL = 0x46,
+ NOUN_FLAT = 0x47,
+ NOUN_FLATS = 0x48,
+ NOUN_FLOOR = 0x49,
+ NOUN_FOLDING_CHAIRS = 0x4A,
+ NOUN_GARBAGE_CAN = 0x4B,
+ NOUN_GRAFFITI = 0x4C,
+ NOUN_GREEN_FRAME = 0x4D,
+ NOUN_HEMP = 0x4E,
+ NOUN_HOLE = 0x4F,
+ NOUN_HOUSE = 0x50,
+ NOUN_IN_ONE2 = 0x51,
+ NOUN_IN_TWO2 = 0x52,
+ NOUN_JUMP_INTO = 0x53,
+ NOUN_JUNK = 0x54,
+ NOUN_KEY = 0x55,
+ NOUN_LAMP = 0x56,
+ NOUN_LANTERN = 0x57,
+ NOUN_LARGE_NOTE = 0x58,
+ NOUN_LASSO = 0x59,
+ NOUN_LEG = 0x5A,
+ NOUN_LETTER = 0x5B,
+ NOUN_LIGHT_FIXTURE = 0x5C,
+ NOUN_LOCK = 0x5D,
+ NOUN_LOCKING_RAIL = 0x5E,
+ NOUN_LOCKRAIL = 0x5F,
+ NOUN_LOOK_AT = 0x60,
+ NOUN_LOOK_THROUGH = 0x61,
+ NOUN_MANNEQUINS = 0x62,
+ NOUN_MIRROR = 0x63,
+ NOUN_MUMMY_PROP = 0x64,
+ NOUN_MURAL = 0x65,
+ NOUN_MUSIC_SCORE = 0x66,
+ NOUN_MUSIC_STAND = 0x67,
+ NOUN_MUSIC_STANDS = 0x68,
+ NOUN_NOTHING = 0x69,
+ NOUN_NOTICE = 0x6A,
+ NOUN_ORCHESTRA_DOOR = 0x6B,
+ NOUN_ORCHESTRA_PIT = 0x6C,
+ NOUN_PAINTING = 0x6D,
+ NOUN_PARCHMENT = 0x6E,
+ NOUN_PIECE_OF_PAPER = 0x6F,
+ NOUN_PIPE = 0x70,
+ NOUN_PIT = 0x71,
+ NOUN_PLANT = 0x72,
+ NOUN_POSTER = 0x73,
+ NOUN_PROMPTERS_BOX = 0x74,
+ NOUN_PROP_TABLE = 0x75,
+ NOUN_PROPS = 0x76,
+ NOUN_PROSCENIUM_ARCH = 0x77,
+ NOUN_PURCHASE_LINES = 0x78,
+ NOUN_RAILING = 0x79,
+ NOUN_READ = 0x7A,
+ NOUN_RED_FRAME = 0x7B,
+ NOUN_REMOVE = 0x7C,
+ NOUN_ROPE = 0x7D,
+ NOUN_RUG = 0x7E,
+ NOUN_SANDBAG = 0x7F,
+ NOUN_SCAFFOLDING = 0x80,
+ NOUN_SEATS = 0x81,
+ NOUN_SIDE_WALL = 0x82,
+ NOUN_SMALL_NOTE = 0x83,
+ NOUN_STAGE = 0x84,
+ NOUN_STAGE_EXIT = 0x85,
+ NOUN_STAGE_LEFT = 0x86,
+ NOUN_STAGE_RIGHT = 0x87,
+ NOUN_STAGEMANAGERS_POST = 0x88,
+ NOUN_STAIR_UNIT = 0x89,
+ NOUN_STAIRCASE = 0x8A,
+ NOUN_STAIRWELL = 0x8B,
+ NOUN_STOOL = 0x8C,
+ NOUN_STRIKE = 0x8D,
+ NOUN_SWORD = 0x8E,
+ NOUN_TABLE = 0x8F,
+ NOUN_THE_HOUSE = 0x90,
+ NOUN_THUNDER_MACHINE = 0x91,
+ NOUN_TICKET = 0x92,
+ NOUN_TRAP_CEILING = 0x93,
+ NOUN_TRAP_DOOR = 0x94,
+ NOUN_TURN_OFF = 0x95,
+ NOUN_TURN_ON = 0x96,
+ NOUN_UNLOCK = 0x97,
+ NOUN_URN = 0x98,
+ NOUN_WALK_ACROSS = 0x99,
+ NOUN_WALK_DOWN = 0x9A,
+ NOUN_WALK_THROUGH = 0x9B,
+ NOUN_WALK_UP = 0x9C,
+ NOUN_WALL = 0x9D,
+ NOUN_WARDROBE = 0x9E,
+ NOUN_WASTE_BASKET = 0x9F,
+ NOUN_WATER_PIPE = 0xA0,
+ NOUN_WEAR = 0xA1,
+ NOUN_WEDDING_RING = 0xA2,
+ NOUN_YELLOW_FRAME = 0xA3,
+ NOUN_PROP = 0xA4,
+ NOUN_CLIMB_UP = 0xA5,
+ NOUN_WALK_ONTO = 0xA6,
+ NOUN_WALK = 0xA7,
+ NOUN_LEFT_DOOR = 0xA8,
+ NOUN_RIGHT_DOOR = 0xA9,
+ NOUN_DOOR_TO_PIT = 0xAA,
+ NOUN_HEADPHONES = 0xAB,
+ NOUN_BOXES = 0xAC,
+ NOUN_MUG = 0xAD,
+ NOUN_DINETTE_SET = 0xAE,
+ NOUN_BOX = 0xAF,
+ NOUN_CASES = 0xB0,
+ NOUN_TRASH_BUCKET = 0xB1,
+ NOUN_CORK_BOARD = 0xB2,
+ NOUN_HEADSET = 0xB3,
+ NOUN_GRAND_FOYER = 0xB4,
+ NOUN_BACK_WALL = 0xB5,
+ NOUN_BALLET_BAR = 0xB6,
+ NOUN_THROW_RUGS = 0xB7,
+ NOUN_COSTUME_RACK = 0xB8,
+ NOUN_COAT_RACK = 0xB9,
+ NOUN_PAINTINGS = 0xBA,
+ NOUN_UMBRELLA = 0xBB,
+ NOUN_SHELF = 0xBC,
+ NOUN_CONTAINER = 0xBD,
+ NOUN_TORN_POSTER = 0xBE,
+ NOUN_REVIEW = 0xBF,
+ NOUN_REVIEWS = 0xC0,
+ NOUN_STAGE_RIGHT_WING = 0xC1,
+ NOUN_STAGE_LEFT_WING = 0xC2,
+ NOUN_PEDESTAL = 0xC3,
+ NOUN_PLANT_PROP = 0xC4,
+ NOUN_STATUE = 0xC5,
+ NOUN_BATTEN = 0xC6,
+ NOUN_BIG_PROP = 0xC7,
+ NOUN_VENTILATION_DUCT = 0xC8,
+ NOUN_CHANDELIER = 0xC9,
+ NOUN_BARRIER = 0xCA,
+ NOUN_PLACARD = 0xCB,
+ NOUN_TICKET_WINDOW = 0xCC,
+ NOUN_ARCHWAY = 0xCD,
+ NOUN_COLUMN = 0xCE,
+ NOUN_RAIL = 0xCF,
+ NOUN_SEAT = 0xD0,
+ NOUN_LOGE_CORRIDOR = 0xD1,
+ NOUN_HOUSE_LIGHT = 0xD2,
+ NOUN_FLOV = 0xD3,
+ NOUN_LEFT_COLUMN = 0xD4,
+ NOUN_RIGHT_COLUMN = 0xD5,
+ NOUN_BOOKCASE = 0xD6,
+ NOUN_DOORWAY = 0xD7,
+ NOUN_COMFY_CHAIR = 0xD8,
+ NOUN_DESK = 0xD9,
+ NOUN_MANAGERS_CHAIR = 0xDA,
+ NOUN_DESK_LAMP = 0xDB,
+ NOUN_WINDOW = 0xDC,
+ NOUN_SHEERS = 0xDD,
+ NOUN_TAPESTRY = 0xDE,
+ NOUN_OVERDOOR_MEDALLION = 0xDF,
+ NOUN_LATTICEWORK = 0xE0,
+ NOUN_DECORATIVE_MOLDING = 0xE1,
+ NOUN_LEFT_DOORWAY = 0xE2,
+ NOUN_LEFT_ARCHWAY = 0xE3,
+ NOUN_RIGHT_DOORWAY = 0xE4,
+ NOUN_RIGHT_ARCHWAY = 0xE5,
+ NOUN_SOFA = 0xE6,
+ NOUN_END_TABLE = 0xE7,
+ NOUN_COFFEE_TABLE = 0xE8,
+ NOUN_DECORATIVE_VASE = 0xE9,
+ NOUN_MARBLE_COLUMN = 0xEA,
+ NOUN_BOX_FIVE = 0xEB,
+ NOUN_ENTER = 0xEC,
+ NOUN_BOX_SIX = 0xED,
+ NOUN_BOX_SEVEN = 0xEE,
+ NOUN_BOX_EIGHT = 0xEF,
+ NOUN_BOX_NINE = 0xF0,
+ NOUN_STEP = 0xF1,
+ NOUN_PANEL = 0xF2,
+ NOUN_WALK_BEHIND = 0xF3,
+ NOUN_MIDDLE_DOORWAY = 0xF4,
+ NOUN_LIGHT = 0xF5,
+ NOUN_CANDLE = 0xF6,
+ NOUN_CASE = 0xF7,
+ NOUN_HANDLE = 0xF8,
+ NOUN_AXE = 0xF9,
+ NOUN_DOOR_CHUNKS = 0xFA,
+ NOUN_FLO = 0xFB,
+ NOUN_BULLETIN_BOARD = 0xFC,
+ NOUN_JULIE = 0xFD,
+ NOUN_GLASS_CASE = 0xFE,
+ NOUN_KEYHOLE = 0xFF,
+ NOUN_MIDDLE_DOOR = 0x100,
+ NOUN_DRESSING_GOWN = 0x101,
+ NOUN_MONSIEUR_BRIE = 0x102,
+ NOUN_CATWALK = 0x103,
+ NOUN_GRID = 0x104,
+ NOUN_GIRDER = 0x105,
+ NOUN_GRIDWORK = 0x106,
+ NOUN_DUCTWORK = 0x107,
+ NOUN_OPENING = 0x108,
+ NOUN_DOME = 0x109,
+ NOUN_ALCOVE = 0x10A,
+ NOUN_CHRISTINE_DAAE = 0x10B,
+ NOUN_CHRISTINE = 0x10C,
+ NOUN_WOMAN = 0x10D,
+ NOUN_PROMPTERS_STAND = 0x10E,
+ NOUN_SUPPORT = 0x10F,
+ NOUN_OTHER_CATWALK = 0x110,
+ NOUN_SLOT = 0x111,
+ NOUN_BEAM_POSITION = 0x112,
+ NOUN_LIGHTING_INSTRUMENT = 0x113,
+ NOUN_TARP = 0x114,
+ NOUN_FACE = 0x115,
+ NOUN_CATWALK_OVER_HOUSE = 0x116,
+ NOUN_STAIRCASE_POST = 0x117,
+ NOUN_JACQUES = 0x118,
+ NOUN_GENTLEMAN = 0x119,
+ NOUN_BODY = 0x11A,
+ NOUN_HOLLOW_COLUMN = 0x11B,
+ NOUN_UPPER_LEVEL = 0x11C,
+ NOUN_MIDDLE_LEVEL = 0x11D,
+ NOUN_LOWER_LEVEL = 0x11E,
+ NOUN_LADDER = 0x11F,
+ NOUN_CLIMB = 0x120,
+ NOUN_CHANDELIER_TRAP = 0x121,
+ NOUN_PIECE_OF_WOOD = 0x122,
+ NOUN_CUT_HEMP = 0x123,
+ NOUN_STONE_WALL = 0x124,
+ NOUN_LAKE = 0x125,
+ NOUN_STONE_COLUMN = 0x126,
+ NOUN_EXIT_THROUGH = 0x127,
+ NOUN_STONE_FLOOR = 0x128,
+ NOUN_STONE_ARCHWAY = 0x129,
+ NOUN_CHARLES = 0x12A,
+ NOUN_SWITCH = 0x12B,
+ NOUN_PROMPTERS_SEAT = 0x12C,
+ NOUN_LEVER = 0x12D,
+ NOUN_MONSIEUR_RICHARD = 0x12E,
+ NOUN_JULIE2 = 0x12F,
+ NOUN_CABLE_HOOK = 0x130,
+ NOUN_ATTACH = 0x131,
+ NOUN_ROPE_WITH_HOOK = 0x132,
+ NOUN_GRAPPLE = 0x133,
+ NOUN_OAR = 0x134,
+ NOUN_ORGAN = 0x135,
+ NOUN_SIT_AT = 0x136,
+ NOUN_ORGAN_BENCH = 0x137,
+ NOUN_SIT_ON = 0x138,
+ NOUN_LARGE_CHAIR = 0x139,
+ NOUN_SIT_IN = 0x13A,
+ NOUN_SARCOPHAGUS = 0x13B,
+ NOUN_SKULL = 0x13C,
+ NOUN_SKULLS = 0x13D,
+ NOUN_TOTEM = 0x13E,
+ NOUN_POLE = 0x13F,
+ NOUN_CURTAIN = 0x140,
+ NOUN_TORCH = 0x141,
+ NOUN_RAMP = 0x142,
+ NOUN_MADAME_GIRY = 0x143,
+ NOUN_PANELS = 0x144,
+ NOUN_MORE_CATACOMBS = 0x145,
+ NOUN_BLOCKED_ARCHWAY = 0x146,
+ NOUN_GRATE = 0x147,
+ NOUN_CATACOMBS = 0x148,
+ NOUN_TICKET_SELLER = 0x149,
+ NOUN_USHER = 0x14A,
+ NOUN_UNLUCKY_ADVENTURER = 0x14B,
+ NOUN_SWITCH_PANEL = 0x14C,
+ NOUN_SKULL_SWITCH = 0x14D,
+ NOUN_TOGGLE = 0x14E,
+ NOUN_CATACOMB_ROOM = 0x14F,
+ NOUN_BOX_TEN = 0x150,
+ NOUN_FOYER = 0x151,
+ NOUN_WALK_DOWN_STAIRCASE = 0x152,
+ NOUN_WALK_DOWN_STAIRS_TO = 0x153,
+ NOUN_HAT_RACK = 0x154,
+ NOUN_VASE = 0x155,
+ NOUN_CLOTHES_DUMMY = 0x156,
+ NOUN_NOTICES = 0x157,
+ NOUN_ARCHWAY_TO_NORTH = 0x158,
+ NOUN_ARCHWAY_TO_WEST = 0x159,
+ NOUN_ARCHWAY_TO_EAST = 0x15A,
+ NOUN_GATE = 0x15B,
+ NOUN_NEST = 0x15C,
+ NOUN_POT = 0x15D,
+ NOUN_PUDDLE = 0x15E,
+ NOUN_WEB = 0x15F,
+ NOUN_PLANK = 0x160,
+ NOUN_BLOCK = 0x161,
+ NOUN_RATS_NEST = 0x162,
+ NOUN_BROKEN_POT = 0x163,
+ NOUN_STONE = 0x164,
+ NOUN_DRAIN = 0x165,
+ NOUN_FATE = 0x166,
+ NOUN_SKULL_SWITCH_1 = 0x167,
+ NOUN_SKULL_SWITCH_2 = 0x168,
+ NOUN_SKULL_SWITCH_3 = 0x169,
+ NOUN_SKULL_SWITCH_4 = 0x16A,
+ NOUN_SKULL_SWITCH_5 = 0x16B,
+ NOUN_SKULL_SWITCH_6 = 0x16C,
+ NOUN_SKULL_SWITCH_7 = 0x16D,
+ NOUN_SKULL_SWITCH_8 = 0x16E,
+ NOUN_SKULL_SWITCH_9 = 0x16F,
+ NOUN_SKULL_SWITCH_10 = 0x170,
+ NOUN_SKULL_SWITCH_11 = 0x171,
+ NOUN_SKULL_SWITCH_12 = 0x172,
+ NOUN_SKULL_SWITCH_13 = 0x173,
+ NOUN_SKULL_SWITCH_14 = 0x174,
+ NOUN_SKULL_SWITCH_15 = 0x175,
+ NOUN_SKULL_SWITCH_16 = 0x176,
+ NOUN_SKULL_SWITCH_17 = 0x177,
+ NOUN_SKULL_SWITCH_18 = 0x178,
+ NOUN_SKULL_SWITCH_19 = 0x179,
+ NOUN_SKULL_SWITCH_20 = 0x17A,
+ NOUN_SKULL_SWITCH_21 = 0x17B,
+ NOUN_SKULL_SWITCH_22 = 0x17C,
+ NOUN_SKULL_SWITCH_23 = 0x17D,
+ NOUN_SKULL_SWITCH_24 = 0x17E,
+ NOUN_SKULL_SWITCH_25 = 0x17F,
+ NOUN_SKULL_SWITCH_26 = 0x180,
+ NOUN_EDGAR_DEGAS = 0x181,
+ NOUN_CHANDELIER_CABLE = 0x182,
+ NOUN_COB_WEB = 0x183,
+ NOUN_SKULL_FACE = 0x184,
+ NOUN_BOAT = 0x185,
+ NOUN_HOOK = 0x186,
+ NOUN_AROUND = 0x187,
+ NOUN_CANE = 0x188,
+ NOUN_MASK = 0x189,
+ NOUN_COVER = 0x18A,
+ NOUN_PADLOCK = 0x18B,
+ NOUN_LID = 0x18C,
+ NOUN_COBWEB = 0x18D,
+ NOUN_PHANTOM = 0x18E,
+ NOUN_PAPER = 0x18F
+};
+
+class SceneFactory {
+public:
+ static SceneLogic *createScene(MADSEngine *vm);
+};
+
+/**
+ * Specialized base class for Dragonsphere game scenes
+ */
+class PhantomScene : public SceneLogic {
+protected:
+ PhantomGlobals &_globals;
+ GamePhantom &_game;
+ MADSAction &_action;
+
+ /**
+ * Forms an animation resource name
+ */
+ Common::String formAnimName(char sepChar, int suffixNum);
+
+ /**
+ * Plays appropriate sound for entering varous rooms
+ */
+ void lowRoomsEntrySound();
+public:
+ /**
+ * Constructor
+ */
+ PhantomScene(MADSEngine *vm);
+
+ void sub7178C();
+};
+
+class SceneInfoPhantom : public SceneInfo {
+ friend class SceneInfo;
+protected:
+ virtual void loadCodes(MSurface &depthSurface, int variant);
+
+ virtual void loadCodes(MSurface &depthSurface, Common::SeekableReadStream *stream);
+
+ /**
+ * Constructor
+ */
+ SceneInfoPhantom(MADSEngine *vm) : SceneInfo(vm) {}
+};
+
+// TODO: Temporary, remove once implemented properly
+class Scene1xx : public PhantomScene {
+protected:
+ /**
+ * Plays an appropriate sound when entering a scene
+ */
+ void sceneEntrySound() {}
+
+ /**
+ *Sets the AA file to use for the scene
+ */
+ void setAAName() {}
+
+ /**
+ * Updates the prefix used for getting player sprites for the scene
+ */
+ void setPlayerSpritesPrefix() {}
+public:
+ Scene1xx(MADSEngine *vm) : PhantomScene(vm) {}
+};
+
+// TODO: Temporary, remove once implemented properly
+class DummyScene : public PhantomScene {
+public:
+ DummyScene(MADSEngine *vm) : PhantomScene(vm) {
+ warning("Unimplemented scene");
+ }
+
+ virtual void setup() {}
+ virtual void enter() {}
+ virtual void actions() {}
+};
+
+} // End of namespace Phantom
+
+} // End of namespace MADS
+
+#endif /* MADS_PHANTOM_SCENES_H */
diff --git a/engines/mads/player.cpp b/engines/mads/player.cpp
new file mode 100644
index 0000000000..bde313af8d
--- /dev/null
+++ b/engines/mads/player.cpp
@@ -0,0 +1,794 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+
+ * You should have received a copy of the GNU General Public 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 "mads/mads.h"
+#include "mads/player.h"
+
+namespace MADS {
+
+#define PLAYER_SEQ_INDEX -2
+
+const int Player::_directionListIndexes[32] = {
+ 0, 7, 4, 3, 6, 0, 2, 5, 0, 1, 9, 4, 1, 2, 7, 9, 3, 8, 9, 6, 7, 2, 3, 6, 1, 7, 9, 4, 7, 8, 0, 0
+};
+
+Player::Player(MADSEngine *vm)
+ : _vm(vm) {
+ _action = nullptr;
+ _facing = FACING_NORTH;
+ _turnToFacing = FACING_NORTH;
+ _targetFacing = FACING_NORTH;
+ _prepareWalkFacing = FACING_NONE;
+ _mirror = false;
+ _spritesLoaded = false;
+ _spritesStart = 0;
+ _spritesIdx = 0;
+ _numSprites = 0;
+ _stepEnabled = false;
+ _visible = false;
+ _priorVisible = false;
+ _needToWalk = false;
+ _readyToWalk = false;
+ _beenVisible = false;
+ _loadsFirst = false;
+ _loadedFirst = false;
+ _walkAnywhere = false;
+ _special = 0;
+ _ticksAmount = 0;
+ _priorTimer = 0;
+ _trigger = 0;
+ _scalingVelocity = false;
+ _spritesChanged = false;
+ _forceRefresh = false;
+ _highSprites = false;
+ _currentDepth = 0;
+ _currentScale = 0;
+ _frameNumber = 0;
+ _centerOfGravity = 0;
+ _frameCount = 0;
+ _velocity = 0;
+ _upcomingTrigger = 0;
+ _trigger = 0;
+ _frameListIndex = 0;
+ _stopWalkerIndex = 0;
+ _totalDistance = 0;
+ _distAccum = 0;
+ _pixelAccum = 0;
+ _deltaDistance = 0;
+ _xDirection = 0;
+ _yDirection = 0;
+ _moving = false;
+ _walkOffScreen = 0;
+ _walkOffScreenSceneId = -1;
+
+ Common::fill(&_stopWalkerList[0], &_stopWalkerList[12], 0);
+ Common::fill(&_stopWalkerTrigger[0], &_stopWalkerTrigger[12], 0);
+ Common::fill(&_spriteSetsPresent[0], &_spriteSetsPresent[PLAYER_SPRITES_FILE_COUNT], false);
+}
+
+void Player::cancelWalk() {
+ Scene &scene = _vm->_game->_scene;
+ _action = &scene._action;
+ _targetPos = _playerPos;
+ _targetFacing = FACING_NONE;
+ _turnToFacing = _facing;
+ _moving = false;
+ _walkOffScreen = _walkOffScreenSceneId = 0;
+ scene._rails.resetRoute();
+ _walkAnywhere = false;
+
+ _needToWalk = false;
+ _readyToWalk = false;
+}
+
+bool Player::loadSprites(const Common::String &prefix) {
+ Common::String suffixList = "89632741";
+
+ Common::String newPrefix;
+ if (prefix.empty()) {
+ newPrefix = _spritesPrefix;
+ } else {
+ _spritesPrefix = prefix;
+ newPrefix = prefix;
+ }
+
+ _numSprites = 0;
+ if (!_spritesPrefix.empty()) {
+ for (int fileIndex = 0; fileIndex < PLAYER_SPRITES_FILE_COUNT; ++fileIndex) {
+ Common::String setName = Common::String::format("*%s_%c.SS",
+ newPrefix.c_str(), suffixList[fileIndex]);
+ if (fileIndex >= 5)
+ _highSprites = true;
+
+ _spriteSetsPresent[fileIndex] = true;
+
+ int setIndex = -1;
+ if (Common::File::exists(setName)) {
+ setIndex = _vm->_game->_scene._sprites.addSprites(setName, 4);
+ ++_numSprites;
+ } else if (fileIndex < 5) {
+ _highSprites = false;
+ return true;
+ } else {
+ _spriteSetsPresent[fileIndex] = false;
+ }
+
+ if (fileIndex == 0)
+ _spritesStart = setIndex;
+ }
+
+ _spritesLoaded = true;
+ _spritesChanged = false;
+ } else {
+ Common::fill(&_spriteSetsPresent[0], &_spriteSetsPresent[PLAYER_SPRITES_FILE_COUNT], false);
+ _visible = false;
+ }
+
+ _highSprites = false;
+ return false;
+}
+
+void Player::setFinalFacing() {
+ if (_targetFacing != FACING_NONE)
+ _turnToFacing = _targetFacing;
+}
+
+void Player::changeFacing() {
+ int dirIndex = 0, dirIndex2 = 0;
+ int newDir = 0, newDir2 = 0;
+
+ if (_facing != _turnToFacing) {
+ // Find the index for the given direction in the player direction list
+ int tempDir = _facing;
+ do {
+ ++dirIndex;
+ newDir += tempDir;
+ tempDir = _directionListIndexes[tempDir + 10];
+ } while (tempDir != _turnToFacing);
+ }
+
+
+ if (_facing != _turnToFacing) {
+ // Find the index for the given direction in the player direction list
+ int tempDir = _facing;
+ do {
+ ++dirIndex2;
+ newDir2 += tempDir;
+ tempDir = _directionListIndexes[tempDir + 20];
+ } while (tempDir != _turnToFacing);
+ }
+
+ int diff = dirIndex - dirIndex2;
+ if (diff == 0)
+ diff = newDir - newDir2;
+
+ _facing = (diff >= 0) ? (Facing)_directionListIndexes[_facing + 20] :
+ (Facing)_directionListIndexes[_facing + 10];
+ selectSeries();
+
+ if ((_facing == _turnToFacing) && !_moving)
+ updateFrame();
+
+ _priorTimer += 1;
+}
+
+void Player::cancelCommand() {
+ cancelWalk();
+ _action->_inProgress = false;
+}
+
+void Player::selectSeries() {
+ Scene &scene = _vm->_game->_scene;
+
+ clearStopList();
+ _mirror = false;
+
+ _spritesIdx = _directionListIndexes[_facing];
+ if (!_spriteSetsPresent[_spritesIdx]) {
+ // Direction isn't present, so use alternate direction, with entries flipped
+ _spritesIdx -= 4;
+ _mirror = true;
+ }
+
+ // If the user isn't to be present (such as for a cutscene), exit immediately
+ // WORKAROUND: Original didn't do a secondary check for the sprite set being
+ // present, but it's needed to prevent invalid reads during cutscenes
+ if ((_spritesStart + _spritesIdx) < 0 || !_spriteSetsPresent[_spritesIdx])
+ return;
+
+ SpriteAsset &spriteSet = *scene._sprites[_spritesStart + _spritesIdx];
+ assert(spriteSet._charInfo);
+ _velocity = MAX(spriteSet._charInfo->_velocity, 100);
+ setBaseFrameRate();
+
+ _frameCount = spriteSet._charInfo->_totalFrames;
+ if (_frameCount == 0)
+ _frameCount = spriteSet.getCount();
+
+ _centerOfGravity = spriteSet._charInfo->_centerOfGravity;
+
+ if ((_frameNumber <= 0) || (_frameNumber > _frameCount))
+ _frameNumber = 1;
+
+ _forceRefresh = true;
+}
+
+void Player::updateFrame() {
+ // WORKAROUND: Prevent character info being referenced when not present
+ if ((_spritesStart + _spritesIdx) < 0 || !_spriteSetsPresent[_spritesStart + _spritesIdx])
+ return;
+
+ Scene &scene = _vm->_game->_scene;
+ SpriteAsset &spriteSet = *scene._sprites[_spritesStart + _spritesIdx];
+ assert(spriteSet._charInfo);
+
+ if (!spriteSet._charInfo->_numEntries) {
+ _frameNumber = 1;
+ } else {
+ _frameListIndex = _stopWalkerList[_stopWalkerIndex];
+
+ if (!_visible) {
+ _upcomingTrigger = 0;
+ } else {
+ _upcomingTrigger = _stopWalkerTrigger[_stopWalkerIndex];
+
+ if (_stopWalkerIndex > 0)
+ --_stopWalkerIndex;
+ }
+
+ // Set the player frame number
+ int listIndex = ABS(_frameListIndex);
+ _frameNumber = (_frameListIndex >= 0) ? spriteSet._charInfo->_startFrames[listIndex] :
+ spriteSet._charInfo->_stopFrames[listIndex];
+
+ // Set next waiting period in ticks
+ if (listIndex == 0) {
+ setBaseFrameRate();
+ } else {
+ _ticksAmount = spriteSet._charInfo->_ticksList[listIndex];
+ }
+ }
+
+ _forceRefresh = true;
+}
+
+void Player::update() {
+ Scene &scene = _vm->_game->_scene;
+
+ if (_forceRefresh || (_visible != _priorVisible)) {
+ int slotIndex = getSpriteSlot();
+ if (slotIndex >= 0)
+ scene._spriteSlots[slotIndex]._flags = IMG_ERASE;
+
+ int newDepth = 1;
+ int yp = MIN(_playerPos.y, (int16)(MADS_SCENE_HEIGHT - 1));
+
+ for (int idx = 1; idx < 15; ++idx) {
+ if (scene._sceneInfo->_depthList[newDepth] >= yp)
+ newDepth = idx + 1;
+ }
+ _currentDepth = newDepth;
+
+ // Get the scale
+ int newScale = getScale(_playerPos.y);
+ _currentScale = MIN(newScale, 100);
+
+ if (_visible) {
+ // Player sprite needs to be rendered
+ SpriteSlot slot;
+ slot._flags = IMG_UPDATE;
+ slot._seqIndex = PLAYER_SEQ_INDEX;
+ slot._spritesIndex = _spritesStart + _spritesIdx;
+ slot._frameNumber = _mirror ? -_frameNumber : _frameNumber;
+ slot._position.x = _playerPos.x;
+ slot._position.y = _playerPos.y + (_centerOfGravity * newScale) / 100;
+ slot._depth = newDepth;
+ slot._scale = newScale;
+
+ if (slotIndex >= 0) {
+ // Check if the existing player slot has the same details, and can be re-used
+ SpriteSlot &s2 = scene._spriteSlots[slotIndex];
+ bool equal = (s2._seqIndex == slot._seqIndex)
+ && (s2._spritesIndex == slot._spritesIndex)
+ && (s2._frameNumber == slot._frameNumber)
+ && (s2._position == slot._position)
+ && (s2._depth == slot._depth)
+ && (s2._scale == slot._scale);
+
+ if (equal)
+ // Undo the prior expiry of the player sprite
+ s2._flags = IMG_STATIC;
+ else
+ slotIndex = -1;
+ }
+
+ if (slotIndex < 0) {
+ // New slot needed, so allocate one and copy the slot data
+ slotIndex = scene._spriteSlots.add();
+ scene._spriteSlots[slotIndex] = slot;
+ }
+
+ // If changing a scene, check to change the scene when the player
+ // has moved off-screen
+ if (_walkOffScreen) {
+ SpriteAsset *asset = scene._sprites[slot._spritesIndex];
+ MSprite *frame = asset->getFrame(_frameNumber - 1);
+ int xScale = frame->w * newScale / 200;
+ int yScale = frame->h * newScale / 100;
+ int playerX = slot._position.x;
+ int playerY = slot._position.y;
+
+ if ((playerX + xScale) < 0 || (playerX + xScale) >= MADS_SCREEN_WIDTH ||
+ playerY < 0 || (playerY + yScale) >= MADS_SCENE_HEIGHT) {
+ scene._nextSceneId = _walkOffScreen;
+ _walkOffScreen = 0;
+ _walkAnywhere = false;
+ }
+ }
+
+ }
+ }
+
+ _beenVisible |= _visible;
+ _priorVisible = _visible;
+ _forceRefresh = false;
+}
+
+void Player::clearStopList() {
+ _stopWalkerList[0] = 0;
+ _stopWalkerTrigger[0] = 0;
+ _stopWalkerIndex = 0;
+ _upcomingTrigger = 0;
+ _trigger = 0;
+}
+
+void Player::startWalking(const Common::Point &pt, Facing facing) {
+ Scene &scene = _vm->_game->_scene;
+
+ clearStopList();
+ setBaseFrameRate();
+ _moving = true;
+ _targetFacing = facing;
+
+ bool v = scene._depthSurface.getDepthHighBit(pt);
+
+ scene._rails.setupRoute(v, _playerPos, pt);
+}
+
+void Player::walk(const Common::Point &pos, Facing facing) {
+ cancelWalk();
+ _needToWalk = true;
+ _readyToWalk = true;
+ _prepareWalkPos = pos;
+ _prepareWalkFacing = facing;
+}
+
+void Player::nextFrame() {
+ Scene &scene = _vm->_game->_scene;
+
+ uint32 newTime = _priorTimer + _ticksAmount;
+ if (scene._frameStartTime >= newTime) {
+ _priorTimer = scene._frameStartTime;
+ if (_moving) {
+ move();
+ } else {
+ idle();
+ }
+
+ setFrame();
+ update();
+ }
+}
+
+void Player::move() {
+ Scene &scene = _vm->_game->_scene;
+ Rails &rails = scene._rails;
+ bool newFacing = false;
+
+ if (_moving) {
+ while (!_walkOffScreen && _playerPos == _targetPos) {
+ bool isRouteEmpty = rails.empty();
+ if (!isRouteEmpty) {
+ const WalkNode &node = rails.popNode();
+
+ _targetPos = node._walkPos;
+ newFacing = true;
+ } else if (!_walkOffScreenSceneId) {
+ // End of walking path
+ rails.resetRoute();
+ _moving = false;
+ setFinalFacing();
+ newFacing = true;
+ } else {
+ _walkOffScreen = _walkOffScreenSceneId;
+ _walkAnywhere = true;
+ _walkOffScreenSceneId = 0;
+ _stepEnabled = false;
+ newFacing = false;
+ }
+
+ if (!_moving)
+ break;
+ }
+ }
+
+ if (newFacing && _moving)
+ startMovement();
+
+ if (_turnToFacing != _facing)
+ changeFacing();
+ else if (!_moving)
+ updateFrame();
+
+ int velocity = _velocity;
+ if (_scalingVelocity && (_totalDistance > 0)) {
+ int angleRange = 100 - _currentScale;
+ int angleScale = angleRange * (_posDiff.x - 1) / _totalDistance + _currentScale;
+ velocity = MAX(1L, (angleScale * _currentScale * velocity) / 10000L);
+ }
+
+ if (!_moving || (_facing != _turnToFacing))
+ return;
+
+ Common::Point newPos = _playerPos;
+ newFacing = false;
+ _special = 0;
+
+ if (_distAccum < velocity) {
+ do {
+ if (_pixelAccum < _posDiff.x)
+ _pixelAccum += _posDiff.y;
+ if (_pixelAccum >= _posDiff.x) {
+ if ((_posChange.y > 0) || _walkOffScreen)
+ newPos.y += _yDirection;
+ --_posChange.y;
+ _pixelAccum -= _posDiff.x;
+ }
+
+ if (_pixelAccum < _posDiff.x) {
+ if ((_posChange.x > 0) || _walkOffScreen)
+ newPos.x += _xDirection;
+ --_posChange.x;
+ }
+
+ if (!_walkAnywhere && !_walkOffScreen && (_walkOffScreenSceneId == 0)) {
+ newFacing = scene._depthSurface.getDepthHighBit(newPos);
+
+ if (_special == 0)
+ _special = scene.getDepthHighBits(newPos);
+ }
+
+ _distAccum += _deltaDistance;
+
+ } while ((_distAccum < velocity) && !newFacing && ((_posChange.x > 0) || (_posChange.y > 0) || (_walkOffScreen != 0)));
+ }
+
+ _distAccum -= velocity;
+
+ if (newFacing) {
+ cancelCommand();
+ } else {
+ if (!_walkOffScreen) {
+ // If the move is complete, make sure the position is exactly on the given destination
+ if (_posChange.x == 0)
+ newPos.x = _targetPos.x;
+ if (_posChange.y == 0)
+ newPos.y = _targetPos.y;
+ }
+
+ _playerPos = newPos;
+ }
+}
+
+void Player::idle() {
+ Scene &scene = _vm->_game->_scene;
+
+ if (_facing != _turnToFacing) {
+ // The direction has changed, so reset for new direction
+ changeFacing();
+ return;
+ }
+
+ if ((_spritesStart + _spritesIdx) < 0 || !_spriteSetsPresent[_spritesStart + _spritesIdx])
+ return;
+
+ SpriteAsset &spriteSet = *scene._sprites[_spritesStart + _spritesIdx];
+ assert(spriteSet._charInfo);
+ if (spriteSet._charInfo->_numEntries == 0)
+ // No entries, so exit immediately
+ return;
+
+ int frameIndex = ABS(_frameListIndex);
+ int direction = (_frameListIndex < 0) ? -1 : 1;
+
+ if (frameIndex >= spriteSet._charInfo->_numEntries) {
+ // Reset back to the start of the list
+ _frameListIndex = 0;
+ } else {
+ _frameNumber += direction;
+ _forceRefresh = true;
+
+ if (spriteSet._charInfo->_stopFrames[frameIndex] < _frameNumber) {
+ _trigger = _upcomingTrigger;
+ updateFrame();
+ }
+ if (spriteSet._charInfo->_startFrames[frameIndex] < _frameNumber) {
+ _trigger = _upcomingTrigger;
+ updateFrame();
+ }
+ }
+}
+
+void Player::setFrame() {
+ if (_moving) {
+ if (++_frameNumber > _frameCount)
+ _frameNumber = 1;
+ _forceRefresh = true;
+ } else {
+ if (!_forceRefresh)
+ idle();
+ }
+}
+
+int Player::getSpriteSlot() {
+ SpriteSlots &spriteSlots = _vm->_game->_scene._spriteSlots;
+
+ for (uint idx = 0; idx < spriteSlots.size(); ++idx) {
+ if (spriteSlots[idx]._seqIndex == PLAYER_SEQ_INDEX &&
+ spriteSlots[idx]._flags >= IMG_STATIC)
+ return idx;
+ }
+
+ return - 1;
+}
+
+int Player::getScale(int yp) {
+ Scene &scene = _vm->_game->_scene;
+
+ int scale = (scene._bandsRange == 0) ? scene._sceneInfo->_maxScale :
+ (yp - scene._sceneInfo->_yBandsStart) * scene._scaleRange / scene._bandsRange +
+ scene._sceneInfo->_minScale;
+
+ return MIN(scale, 100);
+}
+
+void Player::setBaseFrameRate() {
+ Scene &scene = _vm->_game->_scene;
+
+ SpriteAsset &spriteSet = *scene._sprites[_spritesStart + _spritesIdx];
+ assert(spriteSet._charInfo);
+
+ _ticksAmount = spriteSet._charInfo->_ticksAmount;
+ if (_ticksAmount == 0)
+ _ticksAmount = 6;
+}
+
+void Player::startMovement() {
+ int xDiff = _targetPos.x - _playerPos.x;
+ int yDiff = _targetPos.y - _playerPos.y;
+ int srcScale = getScale(_playerPos.y);
+ int destScale = getScale(_targetPos.y);
+
+ // Sets the X direction
+ if (xDiff > 0)
+ _xDirection = 1;
+ else if (xDiff < 0)
+ _xDirection = -1;
+ else
+ _xDirection = 0;
+
+ // Sets the Y direction
+ if (yDiff > 0)
+ _yDirection = 1;
+ else if (yDiff < 0)
+ _yDirection = -1;
+ else
+ _yDirection = 0;
+
+ xDiff = ABS(xDiff);
+ yDiff = ABS(yDiff);
+ int scaleDiff = ABS(srcScale - destScale);
+
+ int xAmt100 = xDiff * 100;
+ int yAmt100 = yDiff * 100;
+ int xAmt33 = xDiff * 33;
+
+ int scaleAmount = (_scalingVelocity ? scaleDiff * 3 : 0) + 100 * yDiff / 100;
+ int scaleAmount100 = scaleAmount * 100;
+
+ // Figure out direction that will need to be moved in
+ int majorDir;
+ if (xDiff == 0) {
+ majorDir = 1;
+ } else if (yDiff == 0) {
+ majorDir = 3;
+ } else {
+ if ((scaleAmount < xDiff) && ((xAmt33 / scaleAmount) >= 141))
+ majorDir = 3;
+ else if (yDiff <= xDiff)
+ majorDir = 2;
+ else if ((scaleAmount100 / xDiff) >= 141)
+ majorDir = 1;
+ else
+ majorDir = 2;
+ }
+
+ switch (majorDir) {
+ case 1:
+ _turnToFacing = (_yDirection <= 0) ? FACING_NORTH : FACING_SOUTH;
+ break;
+ case 2: {
+ _turnToFacing = (Facing)(((_yDirection <= 0) ? 9 : 3) - ((_xDirection <= 0) ? 2 : 0));
+ break;
+ }
+ case 3:
+ _turnToFacing = (_xDirection <= 0) ? FACING_WEST : FACING_EAST;
+ break;
+ default:
+ break;
+ }
+
+ _totalDistance = (int)sqrt((double)(xAmt100 * xAmt100 + yAmt100 * yAmt100));
+ _posDiff.x = xDiff + 1;
+ _posDiff.y = yDiff + 1;
+ _posChange.x = xDiff;
+ _posChange.y = yDiff;
+
+ int majorChange = MAX(xDiff, yDiff);
+ _deltaDistance = (majorChange == 0) ? 0 : _totalDistance / majorChange;
+
+ if (_playerPos.x > _targetPos.x)
+ _pixelAccum = MAX(_posChange.x, _posChange.y);
+ else
+ _pixelAccum = 0;
+
+ _totalDistance /= 100;
+ _distAccum = -_deltaDistance;
+}
+
+void Player::newWalk() {
+ if (_needToWalk && _readyToWalk) {
+ startWalking(_prepareWalkPos, _prepareWalkFacing);
+ _needToWalk = false;
+ }
+}
+
+void Player::addWalker(int walker, int trigger) {
+ Scene &scene = _vm->_game->_scene;
+ SpriteAsset &spriteSet = *scene._sprites[_spritesStart + _spritesIdx];
+ assert(spriteSet._charInfo);
+
+ if (walker < spriteSet._charInfo->_numEntries && _stopWalkerIndex < 11) {
+ ++_stopWalkerIndex;
+ _stopWalkerList[_stopWalkerIndex] = walker;
+ _stopWalkerTrigger[_stopWalkerIndex] = trigger;
+ }
+}
+
+
+/**
+* Releases any sprites used by the player
+*/
+void Player::releasePlayerSprites() {
+ Scene &scene = _vm->_game->_scene;
+
+ if (_spritesLoaded && _numSprites > 0) {
+ int spriteEnd = _spritesStart + _numSprites - 1;
+ do {
+ scene._sprites.remove(spriteEnd);
+ } while (--spriteEnd >= _spritesStart);
+ }
+
+ _numSprites = 0;
+ _spritesLoaded = false;
+ _spritesChanged = true;
+
+ if (scene._sprites._assetCount > 0) {
+ warning("Player::releasePlayerSprites(): leftover sprites remain, clearing list");
+ scene._sprites.clear();
+ }
+}
+
+void Player::synchronize(Common::Serializer &s) {
+ s.syncAsByte(_moving);
+ s.syncAsSint16LE(_playerPos.x);
+ s.syncAsSint16LE(_playerPos.y);
+ s.syncAsSint16LE(_targetPos.x);
+ s.syncAsSint16LE(_targetPos.y);
+ s.syncAsSint16LE(_xDirection);
+ s.syncAsSint16LE(_yDirection);
+ s.syncAsSint16LE(_posDiff.x);
+ s.syncAsSint16LE(_posDiff.y);
+ s.syncAsSint16LE(_posChange.x);
+ s.syncAsSint16LE(_posChange.y);
+ s.syncAsUint16LE(_targetFacing);
+ s.syncAsSint16LE(_special);
+ s.syncAsByte(_forceRefresh);
+ s.syncAsSint16LE(_ticksAmount);
+ s.syncAsByte(_walkAnywhere);
+ s.syncAsUint16LE(_walkOffScreenSceneId);
+ s.syncAsByte(_walkOffScreen);
+ s.syncAsByte(_needToWalk);
+ s.syncAsByte(_readyToWalk);
+ s.syncAsUint16LE(_prepareWalkFacing);
+ s.syncAsSint16LE(_prepareWalkPos.x);
+ s.syncAsSint16LE(_prepareWalkPos.y);
+ s.syncAsByte(_stepEnabled);
+ s.syncAsByte(_visible);
+ s.syncAsByte(_priorVisible);
+
+ for (int i = 0; i < 8; ++i)
+ s.syncAsByte(_spriteSetsPresent[i]);
+
+ s.syncAsByte(_facing);
+ s.syncAsByte(_turnToFacing);
+ s.syncAsSint16LE(_spritesIdx);
+ s.syncAsSint16LE(_frameNumber);
+ s.syncAsSint16LE(_currentDepth);
+ s.syncAsSint16LE(_currentScale);
+ s.syncAsSint16LE(_frameListIndex);
+
+ for (int i = 0; i < 12; ++i) {
+ s.syncAsSint16LE(_stopWalkerList[i]);
+ s.syncAsSint16LE(_stopWalkerTrigger[i]);
+ }
+
+ s.syncAsSint16LE(_stopWalkerIndex);
+ s.syncAsSint16LE(_upcomingTrigger);
+ s.syncAsSint16LE(_trigger);
+ s.syncAsSint16LE(_scalingVelocity);
+ s.syncAsSint16LE(_pixelAccum);
+ s.syncAsSint16LE(_distAccum);
+ s.syncAsSint16LE(_deltaDistance);
+ s.syncAsSint16LE(_totalDistance);
+ s.syncAsSint16LE(_velocity);
+ s.syncAsUint16LE(_frameCount);
+ s.syncString(_spritesPrefix);
+ s.syncAsUint32LE(_priorTimer);
+ s.syncAsByte(_loadsFirst);
+ s.syncAsByte(_loadedFirst);
+ s.syncAsByte(_spritesLoaded);
+ s.syncAsByte(_spritesChanged);
+ s.syncAsByte(_beenVisible);
+ s.syncAsSint16LE(_centerOfGravity);
+ s.syncAsByte(_mirror);
+}
+
+void Player::removePlayerSprites() {
+ Scene &scene = _vm->_game->_scene;
+ int heroSpriteId = _spritesStart;
+ for (int i = 0; i < 8; i++) {
+ if (_spriteSetsPresent[i]) {
+ scene._sprites.remove(heroSpriteId++);
+ _spriteSetsPresent[i] = false;
+ }
+ }
+
+ if (scene._activeAnimation != nullptr)
+ scene._activeAnimation->resetSpriteSetsCount();
+
+ scene._spriteSlots.fullRefresh();
+ _visible = false;
+}
+
+} // End of namespace MADS
diff --git a/engines/mads/player.h b/engines/mads/player.h
new file mode 100644
index 0000000000..671ac9d16e
--- /dev/null
+++ b/engines/mads/player.h
@@ -0,0 +1,228 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+
+ * You should have received a copy of the GNU General Public 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 MADS_PLAYER_H
+#define MADS_PLAYER_H
+
+#include "common/scummsys.h"
+#include "common/str.h"
+#include "common/serializer.h"
+
+namespace MADS {
+
+class MADSEngine;
+class MADSAction;
+
+#define PLAYER_SPRITES_FILE_COUNT 8
+#define MAX_ROUTE_NODES 22
+
+/**
+ * Player facings
+ */
+enum Facing {
+ FACING_NORTH = 8, FACING_SOUTH = 2, FACING_EAST = 6, FACING_WEST = 4,
+ FACING_NORTHEAST = 9, FACING_SOUTHEAST = 3,
+ FACING_SOUTHWEST = 1, FACING_NORTHWEST = 7,
+ FACING_NONE = 5, FACING_DUMMY = 0
+};
+
+class Player {
+private:
+ static const int _directionListIndexes[32];
+private:
+ MADSEngine *_vm;
+ bool _highSprites;
+ bool _spriteSetsPresent[PLAYER_SPRITES_FILE_COUNT];
+ bool _mirror;
+ int _frameCount;
+ int _frameListIndex;
+ int _distAccum;
+ int _pixelAccum;
+ int _deltaDistance;
+ int _stopWalkerList[12];
+ int _stopWalkerTrigger[12];
+ int _totalDistance;
+
+ void clearStopList();
+
+ /**
+ * If the player is moving, handles figuring out the correct motion
+ */
+ void move();
+
+ /**
+ * Update the player's frame number
+ */
+ void setFrame();
+
+ /**
+ * Get the sprite slot index for the player
+ */
+ int getSpriteSlot();
+
+ /**
+ * Get the scale for the player at the given Y position
+ */
+ int getScale(int yp);
+
+ /**
+ * Sets the frame rate for the current sprite set
+ */
+ void setBaseFrameRate();
+
+ /**
+ * Starts a player moving to a given destination
+ */
+ void startMovement();
+
+ void changeFacing();
+public:
+ MADSAction *_action;
+
+ Facing _facing;
+ Facing _turnToFacing;
+ Facing _prepareWalkFacing;
+ int _xDirection, _yDirection;
+ Facing _targetFacing;
+ bool _spritesLoaded;
+ int _spritesStart;
+ int _spritesIdx;
+ int _numSprites;
+ bool _stepEnabled;
+ bool _spritesChanged;
+ bool _visible;
+ bool _priorVisible;
+ bool _beenVisible;
+ bool _walkAnywhere;
+ int _frameNumber;
+ bool _loadsFirst;
+ bool _loadedFirst;
+ Common::Point _playerPos;
+ Common::Point _targetPos;
+ Common::Point _posChange;
+ Common::Point _posDiff;
+ Common::Point _prepareWalkPos;
+ bool _moving;
+ int _walkOffScreen, _walkOffScreenSceneId;
+ int _special;
+ int _ticksAmount;
+ uint32 _priorTimer;
+ int _velocity;
+ int _upcomingTrigger;
+ int _trigger;
+ bool _scalingVelocity;
+ bool _forceRefresh;
+ bool _needToWalk;
+ bool _readyToWalk;
+ int _stopWalkerIndex;
+ int _centerOfGravity;
+ int _currentDepth;
+ int _currentScale;
+ Common::String _spritesPrefix;
+public:
+ Player(MADSEngine *vm);
+
+ /**
+ * Load sprites for the player
+ */
+ bool loadSprites(const Common::String &prefix);
+
+ /**
+ * Called when the player has reached the given destination, start him
+ * turning to the specified facing
+ */
+ void setFinalFacing();
+
+ /**
+ * Stops the player walking
+ */
+ void cancelWalk();
+
+ /**
+ * Cancels any oustanding player action
+ */
+ void cancelCommand();
+
+ /**
+ * Set up control parameters for the current active series (the
+ * direction which the player is facing in) */
+ void selectSeries();
+
+ /*
+ * Moves to the next frame for the currently active player sprite set
+ */
+ void updateFrame();
+
+ void update();
+
+ /**
+ * Handler method for when the player is not moving
+ */
+ void idle();
+
+ /**
+ * Starts the player walking towards a given point and direction facing
+ * @param pos Destination location
+ * @param facing Direction to face once the destination is reached
+ */
+ void startWalking(const Common::Point &pt, Facing facing);
+
+ /**
+ * Used by the game scripst to make the player walk to a given destination.
+ * The difference from startWalking is that this contains several extra
+ * layers of checking that startWalking bypasses.
+ */
+ void walk(const Common::Point &pos, Facing facing);
+
+ /**
+ * If a new walk sequence is pending, and has been okayed by the preparser,
+ * start the actual walking
+ */
+ void newWalk();
+
+ void nextFrame();
+
+ /**
+ * Add a walker to the current queue
+ */
+ void addWalker(int walker, int trigger);
+
+ /**
+ * Delete any sprites used by the player
+ */
+ void releasePlayerSprites();
+
+ /**
+ * Serialize the data of the player
+ */
+ void synchronize(Common::Serializer &s);
+
+ static void preloadSequences(const Common::String &prefix, int level) {
+ // No implementation in ScummVM
+ }
+
+ void removePlayerSprites();
+};
+
+} // End of namespace MADS
+
+#endif /* MADS_PLAYER_H */
diff --git a/engines/mads/rails.cpp b/engines/mads/rails.cpp
new file mode 100644
index 0000000000..322e6e7cb3
--- /dev/null
+++ b/engines/mads/rails.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 "common/scummsys.h"
+#include "mads/mads.h"
+#include "mads/rails.h"
+
+namespace MADS {
+
+WalkNode::WalkNode() {
+ _active = false;
+ Common::fill(&_distances[0], &_distances[MAX_ROUTE_NODES], 0);
+}
+
+void WalkNode::load(Common::SeekableReadStream *f) {
+ _walkPos.x = f->readSint16LE();
+ _walkPos.y = f->readSint16LE();
+ for (int i = 0; i < MAX_ROUTE_NODES; ++i)
+ _distances[i] = f->readUint16LE();
+}
+
+/*------------------------------------------------------------------------*/
+
+Rails::Rails() {
+ _depthSurface = nullptr;
+ _routeLength = 0;
+ _depthStyle = 0;
+ _next = 0;
+}
+
+void Rails::load(const WalkNodeList &nodes, DepthSurface *depthSurface, int depthStyle) {
+ // Store the depth surface and depth style to use
+ _depthSurface = depthSurface;
+ _depthStyle = depthStyle;
+
+ // Load the passed node list
+ _nodes.clear();
+
+ for (uint i = 0; i < nodes.size(); ++i)
+ _nodes.push_back(nodes[i]);
+
+ // Add two more empty nodes for the start and end points of any walk sequence
+ _nodes.push_back(WalkNode());
+ _nodes.push_back(WalkNode());
+}
+
+
+void Rails::setupRoute(bool bitFlag, const Common::Point &srcPos, const Common::Point &destPos) {
+ // Reset the nodes in as being inactive
+ for (uint i = 0; i < _nodes.size(); ++i)
+ _nodes[i]._active = false;
+
+ // Set the two extra walk nodes to the start and destination positions
+ setNodePosition(_nodes.size() - 2, srcPos);
+ setNodePosition(_nodes.size() - 1, destPos);
+
+ // Start constructing route node list
+ _routeLength = 0x3FFF;
+ _routeIndexes.clear();
+
+ // Recursively form a route from the destination walk node back to the player's position
+ setupRouteNode(&_tempRoute[0], _nodes.size() - 1, bitFlag ? 0xC000 : 0x8000, 0);
+
+ _next = 0;
+ if (_routeIndexes.size() > 0) {
+ Common::Point currPos = srcPos;
+ for (int routeCtr = size() - 1; (routeCtr >= 0) && !_next; --routeCtr) {
+ int idx = _routeIndexes[routeCtr];
+ const Common::Point &pt = _nodes[idx]._walkPos;
+
+ _next = scanPath(currPos, pt);
+ currPos = pt;
+ }
+ }
+}
+
+void Rails::setupRouteNode(int *routeIndexP, int nodeIndex, int flags, int routeLength) {
+ WalkNode &currentNode = _nodes[nodeIndex];
+ currentNode._active = true;
+
+ *routeIndexP++ = nodeIndex;
+
+ // Get the index of the ultimate source position (the player)
+ int subIndex = _nodes.size() - 2;
+
+ int distanceVal = _nodes[nodeIndex]._distances[subIndex];
+ if (distanceVal & flags) {
+ routeLength += distanceVal & 0x3FFF;
+ if (routeLength < _routeLength) {
+ // Found a new shorter route to destination, so set up the route with the found one
+ _routeIndexes.clear();
+ for (int i = 0; routeIndexP != &_tempRoute[i]; ++i)
+ _routeIndexes.push(_tempRoute[i]);
+ _routeLength = routeLength;
+ }
+ } else {
+ for (int idx = _nodes.size() - 2; idx > 0; --idx) {
+ int nodePos = idx - 1;
+ if (!_nodes[nodePos]._active && ((currentNode._distances[nodePos] & flags) != 0))
+ setupRouteNode(routeIndexP, nodePos, 0x8000, routeLength + (distanceVal & 0x3fff));
+ }
+ }
+
+ currentNode._active = false;
+}
+
+
+int Rails::scanPath(const Common::Point &srcPos, const Common::Point &destPos) {
+ // For compressed depth surfaces, always return 0
+ if (_depthStyle == 2)
+ return 0;
+
+ int yDiff = destPos.y - srcPos.y;
+ int yAmount = MADS_SCREEN_WIDTH;
+
+ if (yDiff < 0) {
+ yDiff = -yDiff;
+ yAmount = -yAmount;
+ }
+
+ int xDiff = destPos.x - srcPos.x;
+ int xDirection = 1;
+ int xAmount = 0;
+ if (xDiff < 0) {
+ xDiff = -xDiff;
+ xDirection = -xDirection;
+ xAmount = MIN(yDiff, xDiff);
+ }
+
+ ++xDiff;
+ ++yDiff;
+
+ const byte *srcP = _depthSurface->getBasePtr(srcPos.x, srcPos.y);
+ int index = xAmount;
+
+ // Outer loop
+ for (int xCtr = 0; xCtr < xDiff; ++xCtr, srcP += xDirection) {
+ index += yDiff;
+ int v = (*srcP & 0x7F) >> 4;
+ if (v)
+ return v;
+
+ // Inner loop for handling vertical movement
+ while (index >= xDiff) {
+ index -= xDiff;
+
+ v = (*srcP & 0x7F) >> 4;
+ if (v)
+ return v;
+
+ srcP += yAmount;
+ }
+ }
+
+ return 0;
+}
+
+void Rails::resetRoute() {
+ _routeIndexes.clear();
+ _next = 0;
+}
+
+const WalkNode &Rails::popNode() {
+ assert(!_routeIndexes.empty());
+
+ return _nodes[_routeIndexes.pop()];
+}
+
+void Rails::setNodePosition(int nodeIndex, const Common::Point &pt) {
+ int flags, hypotenuse;
+
+ _nodes[nodeIndex]._walkPos = pt;
+
+ // Recalculate inter-node lengths
+ for (uint idx = 0; idx < _nodes.size(); ++idx) {
+ int entry;
+ if (idx == (uint)nodeIndex) {
+ entry = 0x3FFF;
+ } else {
+ // Process the node
+ flags = getRouteFlags(pt, _nodes[idx]._walkPos);
+
+ int xDiff = ABS(_nodes[idx]._walkPos.x - pt.x);
+ int yDiff = ABS(_nodes[idx]._walkPos.y - pt.y);
+ hypotenuse = (int)sqrt((double)(xDiff * xDiff + yDiff * yDiff));
+
+ if (hypotenuse >= 0x3FFF)
+ // Shouldn't ever be this large
+ hypotenuse = 0x3FFF;
+
+ entry = hypotenuse | flags;
+ }
+
+ _nodes[idx]._distances[nodeIndex] = entry;
+ _nodes[nodeIndex]._distances[idx] = entry;
+ }
+}
+
+int Rails::getRouteFlags(const Common::Point &src, const Common::Point &dest) {
+ int result = 0x8000;
+ bool flag = false;
+
+ int xDiff = ABS(dest.x - src.x);
+ int yDiff = ABS(dest.y - src.y);
+ int xDirection = dest.x >= src.x ? 1 : -1;
+ int yDirection = dest.y >= src.y ? _depthSurface->w : -_depthSurface->w;
+ int minorDiff = 0;
+ if (dest.x < src.x)
+ minorDiff = MIN(xDiff, yDiff);
+ ++xDiff;
+ ++yDiff;
+
+ byte *srcP = _depthSurface->getBasePtr(src.x, src.y);
+
+ int totalCtr = minorDiff;
+ for (int xCtr = 0; xCtr < xDiff; ++xCtr, srcP += xDirection) {
+ totalCtr += yDiff;
+
+ if ((*srcP & 0x80) == 0)
+ flag = false;
+ else if (!flag) {
+ flag = true;
+ result -= 0x4000;
+ if (result == 0)
+ break;
+ }
+
+ while (totalCtr >= xDiff) {
+ totalCtr -= xDiff;
+
+ if ((*srcP & 0x80) == 0)
+ flag = false;
+ else if (!flag) {
+ flag = true;
+ result -= 0x4000;
+ if (result == 0)
+ break;
+ }
+
+ srcP += yDirection;
+ }
+ if (result == 0)
+ break;
+ }
+
+ return result;
+}
+
+void Rails::synchronize(Common::Serializer &s) {
+ s.syncAsSint16LE(_routeLength);
+ s.syncAsSint16LE(_next);
+
+ if (s.isLoading()) {
+ _routeIndexes.clear();
+ }
+}
+
+} // End of namespace MADS
diff --git a/engines/mads/rails.h b/engines/mads/rails.h
new file mode 100644
index 0000000000..e6cab08f85
--- /dev/null
+++ b/engines/mads/rails.h
@@ -0,0 +1,134 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+
+ * You should have received a copy of the GNU General Public 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 MADS_RAILS_H
+#define MADS_RAILS_H
+
+#include "common/scummsys.h"
+#include "common/array.h"
+#include "common/rect.h"
+#include "common/serializer.h"
+#include "common/stack.h"
+#include "mads/msurface.h"
+
+namespace MADS {
+
+class WalkNode {
+public:
+ Common::Point _walkPos;
+ uint16 _distances[MAX_ROUTE_NODES];
+ bool _active;
+
+ /**
+ * Constructor
+ */
+ WalkNode();
+
+ /**
+ * Loads the scene node
+ */
+ void load(Common::SeekableReadStream *f);
+};
+typedef Common::Array<WalkNode> WalkNodeList;
+
+/**
+ * This class handles storing the intermediate walk node points for a
+ * given scene, and calculating walking routes between any two positions.
+ */
+class Rails {
+private:
+ WalkNodeList _nodes;
+ DepthSurface *_depthSurface;
+ int _depthStyle;
+ int _routeLength;
+ int _next;
+ int _tempRoute[MAX_ROUTE_NODES];
+ Common::Stack<int> _routeIndexes;
+private:
+ /**
+ * Change the position of a walking node. Doing so causes a recalculation of the
+ * distance between it and every other node, and vice versa
+ */
+ void setNodePosition(int nodeIndex, const Common::Point &pt);
+
+ int getRouteFlags(const Common::Point &src, const Common::Point &dest);
+public:
+ /**
+ * Constructor
+ */
+ Rails();
+
+ /**
+ * Loads the scene data for the list of intermediate walk nodes and the
+ * depth surface to use.
+ * @param nodes Intermediate walk-points
+ * @param depthSurface Depth surface to use
+ */
+ void load(const WalkNodeList &nodes, DepthSurface *depthSurface, int depthStyle);
+
+ /**
+ * Set up a route between two points in a scene
+ */
+ void setupRoute(bool bitFlag, const Common::Point &srcPos, const Common::Point &destPos);
+
+ void setupRouteNode(int *routeIndexP, int nodeIndex, int flags, int routeLength);
+
+ /**
+ * Resets any currently running route
+ */
+ void resetRoute();
+
+ /**
+ * Scans along an edge connecting two points within the depths/walk surface, and returns the information of the first
+ * pixel high nibble encountered with a non-zero value
+ */
+ int scanPath(const Common::Point &srcPos, const Common::Point &destPos);
+
+ /*
+ * Return the number of walk nodes in the calculated route
+ */
+ int size() const { return _routeIndexes.size(); }
+
+ /**
+ * Returns true if the current calculated walk route is empty
+ */
+ bool empty() const { return _routeIndexes.empty(); }
+
+ /**
+ * Returns the data for a given walk node
+ */
+ const WalkNode &operator[](int idx) { return _nodes[_routeIndexes[idx]]; }
+
+ const WalkNode &popNode();
+
+ void resetNext() { _next = 0; }
+ int getNext() { return _next; }
+
+ /**
+ * Synchronize the data for the route
+ */
+ void synchronize(Common::Serializer &s);
+};
+
+} // End of namespace MADS
+
+#endif /* MADS_RAILS_H */
diff --git a/engines/mads/resources.cpp b/engines/mads/resources.cpp
new file mode 100644
index 0000000000..1fb75e6ba2
--- /dev/null
+++ b/engines/mads/resources.cpp
@@ -0,0 +1,417 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+
+ * You should have received a copy of the GNU General Public 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/archive.h"
+#include "common/textconsole.h"
+#include "mads/mads.h"
+#include "mads/resources.h"
+
+namespace MADS {
+
+enum ResourceType {RESTYPE_ROOM, RESTYPE_SC, RESTYPE_TEXT, RESTYPE_QUO, RESTYPE_I,
+ RESTYPE_OB, RESTYPE_FONT, RESTYPE_SOUND, RESTYPE_SPEECH, RESTYPE_HAS_EXT, RESTYPE_NO_EXT};
+
+/**
+ * HAG Archives implementation
+ */
+class HagArchive : public Common::Archive {
+private:
+ /**
+ * Details of a single entry in a HAG file index
+ */
+ struct HagEntry {
+ Common::String _resourceName;
+ uint32 _offset;
+ uint32 _size;
+
+ HagEntry() : _offset(0), _size(0) {}
+ HagEntry(Common::String resourceName, uint32 offset, uint32 size)
+ : _resourceName(resourceName), _offset(offset), _size(size) {
+ }
+ };
+
+ class HagIndex {
+ public:
+ Common::List<HagEntry> _entries;
+ Common::String _filename;
+ };
+
+ Common::Array<HagIndex> _index;
+
+ /**
+ * Load the index of all the game's HAG files
+ */
+ void loadIndex(MADSEngine *vm);
+
+ /**
+ * Given a resource name, opens up the correct HAG file and returns whether
+ * an entry with the given name exists.
+ */
+ bool getHeaderEntry(const Common::String &resourceName, HagIndex &hagIndex, HagEntry &hagEntry) const;
+
+ /**
+ * Returns the HAG resource filename that will contain a given resource
+ */
+ Common::String getResourceFilename(const Common::String &resourceName) const;
+
+ /**
+ * Return a resource type given a resource name
+ */
+ ResourceType getResourceType(const Common::String &resourceName) const;
+public:
+ HagArchive(MADSEngine *vm);
+ virtual ~HagArchive();
+
+ // Archive implementation
+ virtual bool hasFile(const Common::String &name) const;
+ virtual int listMembers(Common::ArchiveMemberList &list) const;
+ virtual const Common::ArchiveMemberPtr getMember(const Common::String &name) const;
+ virtual Common::SeekableReadStream *createReadStreamForMember(const Common::String &name) const;
+};
+
+const char *const MADSCONCAT_STRING = "MADSCONCAT";
+
+HagArchive::HagArchive(MADSEngine *vm) {
+ loadIndex(vm);
+}
+
+HagArchive::~HagArchive() {
+}
+
+// Archive implementation
+bool HagArchive::hasFile(const Common::String &name) const {
+ HagIndex hagIndex;
+ HagEntry hagEntry;
+ return getHeaderEntry(name, hagIndex, hagEntry);
+}
+
+int HagArchive::listMembers(Common::ArchiveMemberList &list) const {
+ int members = 0;
+
+ for (uint hagCtr = 0; hagCtr < _index.size(); ++hagCtr) {
+ HagIndex hagIndex = _index[hagCtr];
+ Common::List<HagEntry>::iterator i;
+
+ for (i = hagIndex._entries.begin(); i != hagIndex._entries.end(); ++i) {
+ list.push_back(Common::ArchiveMemberList::value_type(
+ new Common::GenericArchiveMember((*i)._resourceName, this)));
+ ++members;
+ }
+ }
+
+ return members;
+}
+
+const Common::ArchiveMemberPtr HagArchive::getMember(const Common::String &name) const {
+ if (!hasFile(name))
+ return Common::ArchiveMemberPtr();
+
+ return Common::ArchiveMemberPtr(new Common::GenericArchiveMember(name, this));
+}
+
+Common::SeekableReadStream *HagArchive::createReadStreamForMember(const Common::String &name) const {
+ HagIndex hagIndex;
+ HagEntry hagEntry;
+
+ if (getHeaderEntry(name, hagIndex, hagEntry)) {
+ // Entry found. If the correct file is not already open, open it
+ Common::File f;
+ if (!f.open(hagIndex._filename))
+ error("Could not open HAG file");
+
+ // Return a new stream for the specific resource
+ f.seek(hagEntry._offset);
+ return f.readStream(hagEntry._size);
+ }
+
+ return nullptr;
+}
+
+void HagArchive::loadIndex(MADSEngine *vm) {
+ Common::File hagFile;
+
+ for (int sectionIndex = -1; sectionIndex < 11; ++sectionIndex) {
+ if (sectionIndex == 0)
+ continue;
+
+ // Dragonsphere does not have some sections - skip them
+ if (vm->getGameID() == GType_Dragonsphere) {
+ if (sectionIndex == 7 || sectionIndex == 8)
+ continue;
+ }
+
+ // Phantom does not have some sections - skip them
+ if (vm->getGameID() == GType_Phantom) {
+ if (sectionIndex == 6 || sectionIndex == 7 || sectionIndex == 8)
+ continue;
+ }
+
+ Common::String filename = (sectionIndex == -1) ? "GLOBAL.HAG" :
+ Common::String::format("SECTION%d.HAG", sectionIndex);
+ if (sectionIndex == 10) {
+ // Speech
+ if (!Common::File::exists("SPEECH.HAG"))
+ break;
+ else
+ filename = "SPEECH.HAG";
+ }
+ if (!hagFile.open(filename))
+ error("Could not locate HAG file - %s", filename.c_str());
+
+ // Check for header
+ char headerBuffer[16];
+ if ((hagFile.read(headerBuffer, 16) != 16) ||
+ (strncmp(headerBuffer, MADSCONCAT_STRING, 10) != 0))
+ error("Invalid HAG file opened");
+
+ // Scan through the HAG index
+ int numEntries = hagFile.readUint16LE();
+
+ HagIndex hagIndex;
+ hagIndex._filename = filename;
+
+ for (int idx = 0; idx < numEntries; ++idx) {
+ // Read in the details of the next resource
+ char resourceBuffer[14];
+ uint32 offset = hagFile.readUint32LE();
+ uint32 size = hagFile.readUint32LE();
+ hagFile.read(resourceBuffer, 14);
+
+ hagIndex._entries.push_back(HagEntry(resourceBuffer, offset, size));
+ }
+
+ hagFile.close();
+ _index.push_back(hagIndex);
+ }
+}
+
+bool HagArchive::getHeaderEntry(const Common::String &resourceName,
+ HagIndex &hagIndex, HagEntry &hagEntry) const {
+ Common::String resName = resourceName;
+ resName.toUppercase();
+ if (resName[0] == '*')
+ resName.deleteChar(0);
+
+ Common::String hagFilename = getResourceFilename(resName);
+
+ // Find the index for the given file
+ for (uint hagCtr = 0; hagCtr < _index.size(); ++hagCtr) {
+ hagIndex = _index[hagCtr];
+
+ if (hagIndex._filename == hagFilename) {
+ Common::List<HagEntry>::iterator ei;
+ for (ei = hagIndex._entries.begin(); ei != hagIndex._entries.end(); ++ei) {
+ hagEntry = *ei;
+ if (hagEntry._resourceName.compareToIgnoreCase(resName) == 0)
+ return true;
+ }
+ }
+ }
+
+ return false;
+}
+
+Common::String HagArchive::getResourceFilename(const Common::String &resourceName) const {
+ ResourceType resType = getResourceType(resourceName);
+ Common::String outputFilename = "GLOBAL.HAG";
+
+ if ((resType == RESTYPE_ROOM) || (resType == RESTYPE_SC)) {
+ int value = atoi(resourceName.c_str() + 2);
+ int hagFileNum = (resType == RESTYPE_ROOM) ? value / 100 : value;
+
+ if (hagFileNum > 0)
+ outputFilename = Common::String::format("SECTION%d.HAG", hagFileNum);
+ }
+
+ if (resType == RESTYPE_SPEECH)
+ outputFilename = "SPEECH.HAG";
+
+ return outputFilename;
+}
+
+ResourceType HagArchive::getResourceType(const Common::String &resourceName) const {
+ if (resourceName.hasPrefix("RM")) {
+ // Room resource
+ return RESTYPE_ROOM;
+ } else if (resourceName.hasPrefix("SC")) {
+ // SC resource
+ return RESTYPE_SC;
+ } else if (resourceName.hasSuffix(".TXT")) {
+ // Text resource
+ return RESTYPE_TEXT;
+ } else if (resourceName.hasSuffix(".QUO")) {
+ // QUO resource
+ return RESTYPE_QUO;
+ } else if (resourceName.hasPrefix("I")) {
+ // I resource
+ return RESTYPE_I;
+ } else if (resourceName.hasPrefix("OB")) {
+ // OB resource
+ return RESTYPE_OB;
+ } else if (resourceName.hasPrefix("FONT")) {
+ // FONT resource
+ return RESTYPE_FONT;
+ } else if (resourceName.hasPrefix("SOUND")) {
+ // SOUND resource
+ return RESTYPE_SOUND;
+ } else if (resourceName.hasPrefix("SPCHC")) {
+ // SPEECH resource
+ return RESTYPE_SPEECH;
+ }
+
+ // Check for a known extension
+ const char *extPos = strchr(resourceName.c_str(), '.');
+ if (extPos) {
+ ++extPos;
+ if (!strcmp(extPos, "FL") || !strcmp(extPos, "LBM") || !strcmp(extPos, "ANM") ||
+ !strcmp(extPos, "AA") || !strcmp(extPos, "SS")) {
+ return RESTYPE_HAS_EXT;
+ }
+ }
+
+ return RESTYPE_NO_EXT;
+}
+
+/*------------------------------------------------------------------------*/
+
+void Resources::init(MADSEngine *vm) {
+ SearchMan.add("HAG", new HagArchive(vm));
+}
+
+Common::String Resources::formatName(RESPREFIX resType, int id, const Common::String &ext) {
+ Common::String result = "*";
+
+ if (resType == 3 && !id) {
+ id = id / 100;
+ }
+
+ if (!ext.empty()) {
+ switch (resType) {
+ case RESPREFIX_GL:
+ result += "GL000";
+ break;
+ case RESPREFIX_SC:
+ result += Common::String::format("SC%.3d", id);
+ break;
+ case RESPREFIX_RM:
+ result += Common::String::format("RM%.3d", id);
+ break;
+ default:
+ break;
+ }
+
+ result += ext;
+ }
+
+ return result;
+}
+
+Common::String Resources::formatName(int prefix, char asciiCh, int id, EXTTYPE extType,
+ const Common::String &suffix) {
+ Common::String result;
+ if (prefix <= 0) {
+ result = "*";
+ } else {
+ result = Common::String::format("%s%.3d",
+ (prefix < 100) ? "*SC" : "*RM", prefix);
+ }
+
+ result += Common::String::format("%c", asciiCh);
+ if (id >= 0)
+ result += Common::String::format("%d", id);
+ if (!suffix.empty())
+ result += suffix;
+
+ switch (extType) {
+ case EXT_SS:
+ result += ".SS";
+ break;
+ case EXT_AA:
+ result += ".AA";
+ break;
+ case EXT_DAT:
+ result += ".DAT";
+ break;
+ case EXT_HH:
+ result += ".HH";
+ break;
+ case EXT_ART:
+ result += ".ART";
+ break;
+ case EXT_INT:
+ result += ".INT";
+ break;
+ default:
+ break;
+ }
+
+ return result;
+}
+
+Common::String Resources::formatResource(const Common::String &resName,
+ const Common::String &hagFilename) {
+// int v1 = 0, v2 = 0;
+
+ if (resName.hasPrefix("*")) {
+ // Resource file specified
+ error("TODO: formatResource");
+ } else {
+ // File outside of hag file
+ return resName;
+ }
+}
+
+Common::String Resources::formatAAName(int idx) {
+ return formatName(0, 'I', idx, EXT_AA, "");
+}
+
+/*------------------------------------------------------------------------*/
+
+void File::openFile(const Common::String &filename) {
+ if (!Common::File::open(filename))
+ error("Could not open file - %s", filename.c_str());
+}
+
+/*------------------------------------------------------------------------*/
+
+void SynchronizedList::synchronize(Common::Serializer &s) {
+ int v = 0;
+ int count = size();
+ s.syncAsUint16LE(count);
+
+ if (s.isSaving()) {
+ for (int idx = 0; idx < count; ++idx) {
+ v = (*this)[idx];
+ s.syncAsSint32LE(v);
+ }
+ } else {
+ clear();
+ reserve(count);
+ for (int idx = 0; idx < count; ++idx) {
+ s.syncAsSint32LE(v);
+ push_back(v);
+ }
+ }
+}
+
+} // End of namespace MADS
diff --git a/engines/mads/resources.h b/engines/mads/resources.h
new file mode 100644
index 0000000000..8d9ab1e39f
--- /dev/null
+++ b/engines/mads/resources.h
@@ -0,0 +1,89 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+
+ * You should have received a copy of the GNU General Public 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 MADS_RESOURCES_H
+#define MADS_RESOURCES_H
+
+#include "common/scummsys.h"
+#include "common/file.h"
+#include "common/serializer.h"
+#include "common/str.h"
+
+namespace MADS {
+
+class MADSEngine;
+
+enum RESPREFIX {
+ RESPREFIX_GL = 1, RESPREFIX_SC = 2, RESPREFIX_RM = 3
+};
+
+enum EXTTYPE {
+ EXT_NONE = -1, EXT_SS = 1, EXT_AA = 2, EXT_DAT = 3, EXT_HH = 4,
+ EXT_ART = 5, EXT_INT = 6
+};
+
+class Resources {
+public:
+ /**
+ * Instantiates the resource manager
+ */
+ static void init(MADSEngine *vm);
+
+ static Common::String formatName(RESPREFIX resType, int id, const Common::String &ext);
+ static Common::String formatName(int prefix, char asciiCh, int id,
+ EXTTYPE extType, const Common::String &suffix);
+ static Common::String formatResource(const Common::String &resName, const Common::String &hagFilename);
+ static Common::String formatAAName(int idx);
+};
+
+/**
+ * Derived file class
+ */
+class File : public Common::File {
+public:
+ /**
+ * Constructor
+ */
+ File() : Common::File() {}
+
+ /**
+ * Constructor
+ */
+ File(const Common::String &filename) { openFile(filename); }
+
+ /**
+ * Opens the given file, throwing an error if it can't be opened
+ */
+ void openFile(const Common::String &filename);
+};
+
+class SynchronizedList : public Common::Array<int> {
+public:
+ /**
+ * Synchronize the list
+ */
+ void synchronize(Common::Serializer &s);
+};
+
+} // End of namespace MADS
+
+#endif /* MADS_RESOURCES_H */
diff --git a/engines/mads/scene.cpp b/engines/mads/scene.cpp
new file mode 100644
index 0000000000..ffeed6cda8
--- /dev/null
+++ b/engines/mads/scene.cpp
@@ -0,0 +1,723 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+
+ * You should have received a copy of the GNU General Public 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 "mads/scene.h"
+#include "mads/compression.h"
+#include "mads/mads.h"
+#include "mads/dragonsphere/dragonsphere_scenes.h"
+#include "mads/nebular/nebular_scenes.h"
+#include "mads/phantom/phantom_scenes.h"
+
+namespace MADS {
+
+Scene::Scene(MADSEngine *vm)
+ : _vm(vm), _action(_vm), _depthSurface(vm),
+ _dirtyAreas(_vm), _dynamicHotspots(vm), _hotspots(vm),
+ _kernelMessages(vm), _sequences(vm), _sprites(vm), _spriteSlots(vm),
+ _textDisplay(vm), _userInterface(vm) {
+ _priorSceneId = 0;
+ _nextSceneId = 0;
+ _currentSceneId = 0;
+ _sceneLogic = nullptr;
+ _sceneInfo = nullptr;
+ _cyclingActive = false;
+ _cyclingThreshold = 0;
+ _cyclingDelay = 0;
+ _totalCycleColors = 0;
+ _depthStyle = 0;
+ _roomChanged = false;
+ _reloadSceneFlag = false;
+ _freeAnimationFlag = false;
+ _animationData = nullptr;
+ _activeAnimation = nullptr;
+ _textSpacing = -1;
+ _frameStartTime = 0;
+ _layer = LAYER_GUI;
+ _lookFlag = false;
+ _bandsRange = 0;
+ _scaleRange = 0;
+ _interfaceY = 0;
+ _spritesCount = 0;
+ _variant = 0;
+
+ _paletteUsageF.push_back(PaletteUsage::UsageEntry(0xF));
+
+ // Set up a scene surface that maps to our physical screen drawing surface
+ _sceneSurface.init(MADS_SCREEN_WIDTH, MADS_SCENE_HEIGHT, MADS_SCREEN_WIDTH,
+ _vm->_screen.getPixels(), Graphics::PixelFormat::createFormatCLUT8());
+
+ // Set up the verb list
+ _verbList.push_back(VerbInit(VERB_LOOK, VERB_THAT, PREP_NONE));
+ _verbList.push_back(VerbInit(VERB_TAKE, VERB_THAT, PREP_NONE));
+ _verbList.push_back(VerbInit(VERB_PUSH, VERB_THAT, PREP_NONE));
+ _verbList.push_back(VerbInit(VERB_OPEN, VERB_THAT, PREP_NONE));
+ _verbList.push_back(VerbInit(VERB_PUT, VERB_THIS, PREP_RELATIONAL));
+ _verbList.push_back(VerbInit(VERB_TALKTO, VERB_THAT, PREP_NONE));
+ _verbList.push_back(VerbInit(VERB_GIVE, VERB_THIS, PREP_TO));
+ _verbList.push_back(VerbInit(VERB_PULL, VERB_THAT, PREP_NONE));
+ _verbList.push_back(VerbInit(VERB_CLOSE, VERB_THAT, PREP_NONE));
+ _verbList.push_back(VerbInit(VERB_THROW, VERB_THIS, PREP_AT));
+}
+
+Scene::~Scene() {
+ delete _sceneLogic;
+ delete _sceneInfo;
+}
+
+void Scene::clearVocab() {
+ _activeVocabs.clear();
+}
+
+void Scene::addActiveVocab(int vocabId) {
+ if (activeVocabIndexOf(vocabId) == -1) {
+ assert(_activeVocabs.size() < 200);
+ _activeVocabs.push_back(vocabId);
+ }
+}
+
+int Scene::activeVocabIndexOf(int vocabId) {
+ for (uint i = 0; i < _activeVocabs.size(); ++i) {
+ if (_activeVocabs[i] == vocabId)
+ return i;
+ }
+
+ return -1;
+}
+
+void Scene::clearSequenceList() {
+ _sequences.clear();
+}
+
+void Scene::clearMessageList() {
+ _kernelMessages.clear();
+ _talkFont = FONT_CONVERSATION;
+ _textSpacing = -1;
+}
+
+void Scene::loadSceneLogic() {
+ delete _sceneLogic;
+
+ switch (_vm->getGameID()) {
+ case GType_RexNebular:
+ _sceneLogic = Nebular::SceneFactory::createScene(_vm);
+ break;
+ case GType_Dragonsphere:
+ _sceneLogic = Dragonsphere::SceneFactory::createScene(_vm);
+ break;
+ case GType_Phantom:
+ _sceneLogic = Phantom::SceneFactory::createScene(_vm);
+ break;
+ default:
+ error("Scene logic: Unknown game");
+ }
+}
+
+void Scene::loadScene(int sceneId, const Common::String &prefix, bool palFlag) {
+ // Store the previously active scene number and set the new one
+ _priorSceneId = _currentSceneId;
+ _currentSceneId = sceneId;
+
+ _variant = 0;
+ if (palFlag)
+ _vm->_palette->resetGamePalette(18, 10);
+
+ _spriteSlots.reset(false);
+ _sequences.clear();
+ _kernelMessages.clear();
+ _vm->_palette->_paletteUsage.load(&_scenePaletteUsage);
+
+ int flags = SCENEFLAG_LOAD_SHADOW;
+ if (_vm->_dithering)
+ flags |= SCENEFLAG_DITHER;
+
+ _sceneInfo = SceneInfo::init(_vm);
+ _sceneInfo->load(_currentSceneId, _variant, Common::String(), flags,
+ _depthSurface, _backgroundSurface);
+
+ // Initialize palette animation for the scene
+ initPaletteAnimation(_sceneInfo->_paletteCycles, false);
+
+ // Copy over nodes
+ _rails.load(_sceneInfo->_nodes, &_depthSurface, _sceneInfo->_depthStyle);
+
+ // Load hotspots
+ loadHotspots();
+
+ // Load vocab
+ loadVocab();
+
+ // Load palette usage
+ _vm->_palette->_paletteUsage.load(&_paletteUsageF);
+
+ // Load interface
+ flags = PALFLAG_RESERVED | ANIMFLAG_LOAD_BACKGROUND;
+ if (_vm->_dithering)
+ flags |= ANIMFLAG_DITHER;
+ if (_vm->_textWindowStill)
+ flags |= ANIMFLAG_LOAD_BACKGROUND_ONLY;
+
+ _animationData = Animation::init(_vm, this);
+ DepthSurface depthSurface(_vm);
+ _animationData->load(_userInterface, depthSurface, prefix, flags, nullptr, nullptr);
+
+ _vm->_palette->_paletteUsage.load(&_scenePaletteUsage);
+
+ _bandsRange = _sceneInfo->_yBandsEnd - _sceneInfo->_yBandsStart;
+ _scaleRange = _sceneInfo->_maxScale - _sceneInfo->_minScale;
+
+ _spriteSlots.reset(false);
+ _interfaceY = MADS_SCENE_HEIGHT;
+ _spritesCount = _sprites.size();
+
+ _userInterface.setup(_vm->_game->_screenObjects._inputMode);
+
+ _vm->_game->_screenObjects._category = CAT_NONE;
+ _vm->_events->showCursor();
+}
+
+void Scene::loadHotspots() {
+ File f(Resources::formatName(RESPREFIX_RM, _currentSceneId, ".HH"));
+ MadsPack madsPack(&f);
+ bool isV2 = (_vm->getGameID() != GType_RexNebular);
+
+ Common::SeekableReadStream *stream = madsPack.getItemStream(0);
+ int count = stream->readUint16LE();
+ delete stream;
+
+ stream = madsPack.getItemStream(1);
+ _hotspots.clear();
+ for (int i = 0; i < count; ++i)
+ _hotspots.push_back(Hotspot(*stream, isV2));
+
+ delete stream;
+ f.close();
+}
+
+void Scene::loadVocab() {
+ // Add all the verbs to the active vocab list
+ for (uint i = 0; i < _verbList.size(); ++i)
+ addActiveVocab(_verbList[i]._id);
+
+ // Load the vocabs for any object descriptions and custom actions
+ for (uint objIndex = 0; objIndex < _vm->_game->_objects.size(); ++objIndex) {
+ InventoryObject &io = _vm->_game->_objects[objIndex];
+ addActiveVocab(io._descId);
+
+ for (int vocabIndex = 0; vocabIndex <io._vocabCount; ++vocabIndex) {
+ addActiveVocab(io._vocabList[vocabIndex]._vocabId);
+ }
+ }
+
+ // Load scene hotspot list vocabs and verbs
+ for (uint i = 0; i < _hotspots.size(); ++i) {
+ addActiveVocab(_hotspots[i]._vocabId);
+ if (_hotspots[i]._verbId)
+ addActiveVocab(_hotspots[i]._verbId);
+ }
+
+ loadVocabStrings();
+}
+
+void Scene::loadVocabStrings() {
+ _vocabStrings.clear();
+ File f("*VOCAB.DAT");
+ Common::String msg;
+
+ for (;;) {
+ char c = (char)f.readByte();
+ if (f.eos()) break;
+
+ if (c == '\0') {
+ _vocabStrings.push_back(msg);
+ msg = "";
+ } else {
+ msg += c;
+ }
+ }
+
+ f.close();
+}
+
+uint32 Scene::getVocabStringsCount() const {
+ return _vocabStrings.size();
+}
+
+void Scene::initPaletteAnimation(Common::Array<PaletteCycle> &palCycles, bool animFlag) {
+ // Initialize the animation palette and ticks list
+ _cycleTicks.clear();
+ _paletteCycles.clear();
+
+ for (uint i = 0; i < palCycles.size(); ++i) {
+ _cycleTicks.push_back(_vm->_events->getFrameCounter());
+ _paletteCycles.push_back(palCycles[i]);
+ }
+
+ // Save the initial starting palette
+ Common::copy(&_vm->_palette->_mainPalette[0], &_vm->_palette->_mainPalette[PALETTE_SIZE],
+ &_vm->_palette->_cyclingPalette[0]);
+
+ // Calculate total
+ _totalCycleColors = 0;
+ for (uint i = 0; i < _paletteCycles.size(); ++i)
+ _totalCycleColors += _paletteCycles[i]._colorCount;
+
+ _cyclingThreshold = (_totalCycleColors > 16) ? 3 : 0;
+ _cyclingActive = animFlag;
+}
+
+void Scene::animatePalette() {
+ byte rgb[3];
+
+ if (_cyclingActive) {
+ Scene::_cyclingDelay++;
+ if (_cyclingDelay >= _cyclingThreshold) {
+ uint32 frameCounter = _vm->_events->getFrameCounter();
+ bool changesFlag = false;
+ for (uint16 idx = 0; idx < _paletteCycles.size(); idx++) {
+ if (frameCounter >= (_cycleTicks[idx] + _paletteCycles[idx]._ticks)) {
+ _cycleTicks[idx] = frameCounter;
+ int count = _paletteCycles[idx]._colorCount;
+ int first = _paletteCycles[idx]._firstColorIndex;
+ int listIndex = _paletteCycles[idx]._firstListColor;
+ changesFlag = true;
+
+ if (count > 1) {
+ // Make a copy of the last color
+ byte *pSrc = &_vm->_palette->_cyclingPalette[first * 3];
+ byte *pEnd = pSrc + count * 3;
+ Common::copy(pEnd - 3, pEnd, &rgb[0]);
+
+ // Shift the cycle palette forward one entry
+ Common::copy_backward(pSrc, pEnd - 3, pEnd);
+
+ // Move the saved color to the start of the cycle
+ Common::copy(&rgb[0], &rgb[3], pSrc);
+
+ if (++listIndex >= count)
+ listIndex = 0;
+ }
+
+ _paletteCycles[idx]._firstListColor = listIndex;
+ }
+ }
+
+ if (changesFlag) {
+ int firstColor = _paletteCycles[0]._firstColorIndex;
+ byte *pSrc = &_vm->_palette->_cyclingPalette[firstColor * 3];
+ _vm->_palette->setPalette(pSrc, firstColor, _totalCycleColors);
+ }
+
+ _cyclingDelay = 0;
+ }
+ }
+}
+
+bool Scene::getDepthHighBits(const Common::Point &pt) {
+ if (_sceneInfo->_depthStyle == 2) {
+ return 0;
+ } else {
+ const byte *p = _depthSurface.getBasePtr(pt.x, pt.y);
+ return (*p & 0x70) >> 4;
+ }
+}
+
+void Scene::loop() {
+ while (!_vm->shouldQuit() && !_reloadSceneFlag && (_nextSceneId == _currentSceneId)) {
+ // Handle drawing a game frame
+ doFrame();
+
+ // TODO: Verify correctness of frame wait
+ _vm->_events->waitForNextFrame();
+
+ if (_vm->_dialogs->_pendingDialog != DIALOG_NONE && !_vm->_game->_trigger
+ && _vm->_game->_player._stepEnabled)
+ _reloadSceneFlag = true;
+ }
+}
+
+void Scene::doFrame() {
+ Player &player = _vm->_game->_player;
+ bool flag = false;
+
+ if (_action._selectedAction || !player._stepEnabled) {
+ _action.clear();
+ _action._selectedAction = 0;
+ }
+
+ if (!_vm->_game->_trigger && !player._trigger) {
+ // Refresh the dynamic hotspots if they've changed
+ if (_dynamicHotspots._changed)
+ _dynamicHotspots.refresh();
+
+ // Check all on-screen visual objects
+ _vm->_game->_screenObjects.check(player._stepEnabled && !player._needToWalk &&
+ !_vm->_game->_fx);
+ }
+
+ if (_action._selectedAction && player._stepEnabled && !player._needToWalk &&
+ !_vm->_game->_trigger && !player._trigger) {
+ _action.startAction();
+ if (_action._activeAction._verbId == Nebular::VERB_LOOK_AT) {
+ _action._activeAction._verbId = VERB_LOOK;
+ _action._savedFields._command = false;
+ }
+
+ flag = true;
+ }
+
+ if (flag || (_vm->_game->_trigger && _vm->_game->_triggerMode == SEQUENCE_TRIGGER_PREPARE)) {
+ doPreactions();
+ }
+
+ player.newWalk();
+ if (!_vm->_game->_fx)
+ _frameStartTime = _vm->_events->getFrameCounter();
+
+ // Handle parser actions as well as game triggers
+ if ((_action._inProgress && !player._moving && !player._needToWalk &&
+ (player._facing == player._turnToFacing) && !_vm->_game->_trigger) ||
+ (_vm->_game->_trigger && (_vm->_game->_triggerMode == SEQUENCE_TRIGGER_PARSER))) {
+ doAction();
+ }
+
+ if (_currentSceneId != _nextSceneId) {
+ _freeAnimationFlag = true;
+ } else {
+ doSceneStep();
+ checkKeyboard();
+
+ if (_currentSceneId != _nextSceneId) {
+ _freeAnimationFlag = true;
+ } else {
+ player.nextFrame();
+
+ // Cursor update code
+ updateCursor();
+
+ if (!_vm->_game->_trigger) {
+ // Handle any active sequences
+ _sequences.tick();
+
+ // Handle any active animation
+ if (_activeAnimation)
+ _activeAnimation->update();
+ }
+
+ // If the debugget flag is set, show the mouse position
+ int mouseTextIndex = 0;
+ if (_vm->_debugger->_showMousePos) {
+ Common::Point pt = _vm->_events->mousePos();
+ Common::String msg = Common::String::format("(%d,%d)", pt.x, pt.y);
+ mouseTextIndex = _kernelMessages.add(Common::Point(5, 5),
+ 0x203, 0, 0, 1, msg);
+ }
+
+ if (!_vm->_game->_trigger) {
+ if (_reloadSceneFlag || _currentSceneId != _nextSceneId)
+ _kernelMessages.reset();
+ _kernelMessages.update();
+ }
+
+ _userInterface._uiSlots.draw(!_vm->_game->_fx, _vm->_game->_fx);
+
+ // Write any text needed by the interface
+ if (_vm->_game->_fx)
+ _userInterface.drawTextElements();
+
+ // Draw any elements
+ drawElements((ScreenTransition)_vm->_game->_fx, _vm->_game->_fx);
+
+ // Handle message updates
+ if (_vm->_game->_fx) {
+ uint32 priorTime = _vm->_game->_priorFrameTimer;
+ uint32 newTime = _vm->_events->getFrameCounter();
+ _sequences.delay(priorTime, newTime);
+ _kernelMessages.delay(priorTime, newTime);
+ }
+
+ if (_vm->_debugger->_showMousePos)
+ // Mouse position display isn't persistent, so remove it
+ _kernelMessages.remove(mouseTextIndex);
+
+ // Original had a debugger check/call here to allow pausing after
+ // drawing each frame. Not implemented under ScummVM
+ }
+ }
+
+ if (_vm->_game->_fx)
+ _cyclingActive = true;
+ _vm->_game->_fx = kTransitionNone;
+
+ // Handle freeing animation if necessary
+ if (_activeAnimation && _activeAnimation->freeFlag())
+ _freeAnimationFlag = true;
+ if (_freeAnimationFlag)
+ freeAnimation();
+}
+
+void Scene::drawElements(ScreenTransition transitionType, bool surfaceFlag) {
+ // Draw any sprite backgrounds
+ _spriteSlots.drawBackground();
+
+ // Set up dirty areas for any text display
+ _textDisplay.setDirtyAreas();
+
+ // Merge any identified dirty areas
+ _dirtyAreas.merge(1, DIRTY_AREAS_SIZE);
+
+ // Copy background for the dirty areas to the screen
+ _dirtyAreas.copy(&_backgroundSurface, &_vm->_screen, _posAdjust);
+
+ // Handle dirty areas for foreground objects
+ if (_vm->getGameID() == GType_RexNebular) // TODO: Implement for V2 games
+ _spriteSlots.setDirtyAreas();
+ _textDisplay.setDirtyAreas2();
+ _dirtyAreas.merge(1, DIRTY_AREAS_SIZE);
+
+ // Draw sprites that have changed
+ if (_vm->getGameID() == GType_RexNebular) // TODO: Implement for V2 games
+ _spriteSlots.drawSprites(&_sceneSurface);
+
+ // Draw text elements onto the view
+ _textDisplay.draw(&_vm->_screen);
+
+ if (transitionType) {
+ // Fading in the screen
+ _vm->_screen.transition(transitionType, surfaceFlag);
+ _vm->_sound->startQueuedCommands();
+ } else {
+ // Copy dirty areas to the screen
+ _dirtyAreas.copyToScreen(_vm->_screen._offset);
+ }
+
+ _spriteSlots.cleanUp();
+ _textDisplay.cleanUp();
+}
+
+void Scene::doPreactions() {
+ if (_vm->_game->_screenObjects._inputMode == kInputBuildingSentences ||
+ _vm->_game->_screenObjects._inputMode == kInputLimitedSentences) {
+ _vm->_game->_triggerSetupMode = SEQUENCE_TRIGGER_PREPARE;
+ _action.checkAction();
+ _sceneLogic->preActions();
+
+ if (_vm->_game->_triggerMode == SEQUENCE_TRIGGER_PREPARE)
+ _vm->_game->_trigger = 0;
+ }
+}
+
+void Scene::doAction() {
+ bool flag = false;
+
+ _vm->_game->_triggerSetupMode = SEQUENCE_TRIGGER_PARSER;
+ if ((_action._inProgress || _vm->_game->_trigger) && !_action._savedFields._commandError) {
+ _sceneLogic->actions();
+ flag = !_action._inProgress;
+ }
+
+ if (_vm->_game->_screenObjects._inputMode == kInputConversation) {
+ _action._inProgress = false;
+ } else {
+ if ((_action._inProgress || _vm->_game->_trigger) ||
+ (!flag && _action._savedFields._commandError == flag)) {
+ _vm->_game->_sectionHandler->sectionPtr2();
+ flag = !_action._inProgress;
+ }
+
+ if ((_action._inProgress || _vm->_game->_trigger) &&
+ (!flag || _action._savedFields._commandError == flag)) {
+ _vm->_game->doObjectAction();
+ }
+
+ if (!_action._savedFields._lookFlag) {
+ if (_action._inProgress) {
+ _action._savedFields._commandError = true;
+ _sceneLogic->postActions();
+ }
+
+ if (_action._inProgress) {
+ _action._savedFields._commandError = true;
+ _sceneLogic->unhandledAction();
+ }
+
+ if (_action._inProgress)
+ _vm->_game->unhandledAction();
+ }
+ }
+
+ _action._inProgress = false;
+ if (_vm->_game->_triggerMode == SEQUENCE_TRIGGER_PARSER)
+ _vm->_game->_trigger = 0;
+}
+
+void Scene::doSceneStep() {
+ _vm->_game->_triggerSetupMode = SEQUENCE_TRIGGER_DAEMON;
+ _sceneLogic->step();
+ _vm->_game->_sectionHandler->step();
+ _vm->_game->step();
+
+ if (_vm->_game->_triggerMode == SEQUENCE_TRIGGER_DAEMON)
+ _vm->_game->_trigger = 0;
+}
+
+void Scene::checkKeyboard() {
+ if (_vm->_events->isKeyPressed()) {
+ Common::Event evt = _vm->_events->_pendingKeys.pop();
+ _vm->_game->handleKeypress(evt);
+ }
+
+ if ((_vm->_events->_mouseStatus & 3) == 3 && _vm->_game->_player._stepEnabled) {
+ _reloadSceneFlag = true;
+ _vm->_dialogs->_pendingDialog = DIALOG_GAME_MENU;
+ _action.clear();
+ _action._selectedAction = 0;
+ }
+}
+
+void Scene::loadAnimation(const Common::String &resName, int trigger) {
+ // WORKAROUND: If there's already a previous active animation used by the
+ // scene, then free it before we create the new one
+ if (_activeAnimation)
+ freeAnimation();
+
+ DepthSurface depthSurface(_vm);
+ UserInterface interfaceSurface(_vm);
+
+ _activeAnimation = Animation::init(_vm, this);
+ _activeAnimation->load(interfaceSurface, depthSurface, resName,
+ _vm->_dithering ? ANIMFLAG_DITHER : 0, nullptr, nullptr);
+ _activeAnimation->startAnimation(trigger);
+}
+
+void Scene::updateCursor() {
+ Player &player = _vm->_game->_player;
+
+ CursorType cursorId = CURSOR_ARROW;
+ if (_action._interAwaiting == AWAITING_COMMAND && !_vm->_events->_rightMousePressed &&
+ _vm->_game->_screenObjects._category == CAT_HOTSPOT) {
+ int idx = _vm->_game->_screenObjects._selectedObject -
+ _userInterface._categoryIndexes[CAT_HOTSPOT - 1];
+ assert(idx >= 0);
+
+ if (idx >= (int)_hotspots.size()) {
+ idx -= _hotspots.size();
+ _vm->_events->_newCursorId = _dynamicHotspots[idx]._cursor;
+ } else {
+ idx = _hotspots.size() - idx - 1;
+ _vm->_events->_newCursorId = _hotspots[idx]._cursor;
+ }
+
+ cursorId = _vm->_events->_newCursorId == CURSOR_NONE ?
+ CURSOR_ARROW : _vm->_events->_newCursorId;
+ }
+
+ if (!player._stepEnabled)
+ cursorId = CURSOR_WAIT;
+ if (cursorId >= _vm->_events->_cursorSprites->getCount())
+ cursorId = (CursorType)_vm->_events->_cursorSprites->getCount();
+ _vm->_events->_newCursorId = cursorId;
+
+ if (cursorId != _vm->_events->_cursorId) {
+ _vm->_events->setCursor(cursorId);
+ }
+}
+
+void Scene::freeCurrentScene() {
+ if (_animationData) {
+ delete _animationData;
+ _animationData = nullptr;
+ }
+ if (_activeAnimation) {
+ delete _activeAnimation;
+ _activeAnimation = nullptr;
+ }
+
+ _vm->_palette->_paletteUsage.load(nullptr);
+ _hotspots.clear();
+ _backgroundSurface.free();
+ _depthSurface.free();
+
+ delete _sceneInfo;
+ _sceneInfo = nullptr;
+}
+
+void Scene::removeSprites() {
+ for (int idx = _sprites.size() - 1; idx >= _spritesCount; --idx)
+ _sprites.remove(idx);
+}
+
+void Scene::changeVariant(int variant) {
+ _variant = variant;
+ _sceneInfo->loadCodes(_depthSurface, variant);
+ _spriteSlots.fullRefresh();
+}
+
+void Scene::resetScene() {
+ _vm->_game->clearQuotes();
+ removeSprites();
+ _spriteSlots.fullRefresh(true);
+ _sequences.clear();
+}
+
+void Scene::freeAnimation() {
+ if (_activeAnimation) {
+ Player &player = _vm->_game->_player;
+
+ if (!_freeAnimationFlag) {
+ _spriteSlots.fullRefresh(true);
+ _sequences.scan();
+ }
+
+ // Refresh the player
+ if (player._visible) {
+ player._forceRefresh = true;
+ player.update();
+ }
+
+ // Remove any kernel messages in use by the animation
+ for (uint i = 0; i < _activeAnimation->_messages.size(); ++i) {
+ int msgIndex = _activeAnimation->_messages[i]._kernelMsgIndex;
+ if (msgIndex >= 0)
+ _kernelMessages.remove(msgIndex);
+ }
+
+ // Delete the animation
+ delete _activeAnimation;
+ _activeAnimation = nullptr;
+ }
+
+ _freeAnimationFlag = false;
+}
+
+void Scene::synchronize(Common::Serializer &s) {
+ _action.synchronize(s);
+ _rails.synchronize(s);
+ _userInterface.synchronize(s);
+ s.syncAsByte(_reloadSceneFlag);
+ s.syncAsByte(_roomChanged);
+ s.syncAsUint16LE(_nextSceneId);
+ s.syncAsUint16LE(_priorSceneId);
+ _dynamicHotspots.synchronize(s);
+}
+
+} // End of namespace MADS
diff --git a/engines/mads/scene.h b/engines/mads/scene.h
new file mode 100644
index 0000000000..407d70dc85
--- /dev/null
+++ b/engines/mads/scene.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.
+ *
+ */
+
+#ifndef MADS_SCENE_H
+#define MADS_SCENE_H
+
+#include "common/scummsys.h"
+#include "common/array.h"
+#include "common/rect.h"
+#include "mads/assets.h"
+#include "mads/screen.h"
+#include "mads/hotspots.h"
+#include "mads/messages.h"
+#include "mads/msurface.h"
+#include "mads/scene_data.h"
+#include "mads/animation.h"
+#include "mads/rails.h"
+#include "mads/sequence.h"
+#include "mads/sprites.h"
+#include "mads/user_interface.h"
+
+namespace MADS {
+
+class Scene {
+private:
+ /**
+ * Return the index of a given Vocab in the active vocab list
+ */
+ int activeVocabIndexOf(int vocabId);
+
+ /**
+ * Secondary loading vocab list
+ */
+ void loadVocabStrings();
+
+ /*
+ * Initializes the data for palette animation within the scene
+ */
+ void initPaletteAnimation(Common::Array<PaletteCycle> &palCycles, bool animFlag);
+
+ /**
+ * Handles a single frame within the game scene
+ */
+ void doFrame();
+
+ void doPreactions();
+
+ void doAction();
+
+ /**
+ * Calls all the necessary step handlers for the current frame
+ */
+ void doSceneStep();
+
+ /**
+ * Checks whether there's a pending keypress, and if so handles it.
+ */
+ void checkKeyboard();
+
+ /**
+ * Checks for a highlighted hotspot, and updates the cursor accordingly
+ */
+ void updateCursor();
+protected:
+ MADSEngine *_vm;
+public:
+ SceneLogic *_sceneLogic;
+ MSurface _sceneSurface;
+ int _priorSceneId;
+ int _nextSceneId;
+ int _currentSceneId;
+ Common::Array<VerbInit> _verbList;
+ TextDisplayList _textDisplay;
+ SpriteSlots _spriteSlots;
+ SpriteSets _sprites;
+ DynamicHotspots _dynamicHotspots;
+ Common::Array<int> _activeVocabs;
+ SequenceList _sequences;
+ KernelMessages _kernelMessages;
+ Rails _rails;
+ Common::String _talkFont;
+ int _textSpacing;
+ Hotspots _hotspots;
+ DirtyAreas _dirtyAreas;
+ int _variant;
+ SceneInfo *_sceneInfo;
+ MSurface _backgroundSurface;
+ DepthSurface _depthSurface;
+ UserInterface _userInterface;
+ bool _cyclingActive;
+ int _cyclingThreshold;
+ int _cyclingDelay;
+ int _totalCycleColors;
+ Common::Array<uint32> _cycleTicks;
+ Common::Array<PaletteCycle> _paletteCycles;
+ Common::StringArray _vocabStrings;
+ Animation *_animationData;
+ Animation *_activeAnimation;
+ bool _freeAnimationFlag;
+ int _depthStyle;
+ int _bandsRange;
+ int _scaleRange;
+ int _interfaceY;
+ int _spritesCount;
+ MADSAction _action;
+ bool _roomChanged;
+ bool _reloadSceneFlag;
+ Common::Point _posAdjust;
+ uint32 _frameStartTime;
+ Layer _layer;
+ bool _lookFlag;
+ Common::Point _customDest;
+ Common::Array<PaletteUsage::UsageEntry> _paletteUsageF;
+ Common::Array<PaletteUsage::UsageEntry> _scenePaletteUsage;
+
+ /**
+ * Constructor
+ */
+ Scene(MADSEngine *vm);
+
+ /**
+ * Destructor
+ */
+ ~Scene();
+
+ /**
+ * Clear the vocabulary list
+ */
+ void clearVocab();
+
+ /**
+ * Add a given vocab entry to the active list
+ */
+ void addActiveVocab(int vocabId);
+
+ /**
+ * Get the number of entries in the game's vocabulary
+ */
+ uint32 getVocabStringsCount() const;
+
+ /**
+ * Clear the sequence list
+ */
+ void clearSequenceList();
+
+ /**
+ * Clear the message list
+ */
+ void clearMessageList();
+
+ /**
+ * Loads the scene logic for a given scene
+ */
+ void loadSceneLogic();
+
+ /**
+ * Loads the resources associated with the given scene
+ * @param sceneId Scene to load
+ * @param prefix Prefix to use for retrieving animation data
+ * @param palFlag Flag for whether to reset the high/lo palette areas
+ */
+ void loadScene(int sceneId, const Common::String &prefix, bool palFlag);
+
+ /**
+ * Loads the hotstpots for the scene
+ */
+ void loadHotspots();
+
+ /**
+ * Loads the vocab list
+ */
+ void loadVocab();
+
+ bool getDepthHighBits(const Common::Point &pt);
+
+ /**
+ * Main scene loop
+ */
+ void loop();
+
+ /**
+ * Draw all the elements onto the scene
+ */
+ void drawElements(ScreenTransition transitionType, bool surfaceFlag);
+
+ /**
+ * Handles cycling palette colors for the scene
+ */
+ void animatePalette();
+
+ /**
+ * Load an animation
+ */
+ void loadAnimation(const Common::String &resName, int trigger = 0);
+
+ /**
+ * Returns a vocab entry
+ */
+ Common::String getVocab(int vocabId) { return _vocabStrings[vocabId - 1]; }
+
+ /**
+ * Clear the data for the currently loaded scene
+ */
+ void freeCurrentScene();
+
+ /**
+ * Set the walk surface for a scene to a different variant
+ */
+ void changeVariant(int variant);
+
+ void resetScene();
+
+ /**
+ * Removes all the scene specific sprites fromt the sprites list,
+ * leaving any player sprites list in place at the start of the list.
+ */
+ void removeSprites();
+
+ /**
+ * Frees any currently active animation for the scene
+ */
+ void freeAnimation();
+
+ /**
+ * Synchronize the game
+ */
+ void synchronize(Common::Serializer &s);
+};
+
+} // End of namespace MADS
+
+#endif /* MADS_SCENE_H */
diff --git a/engines/mads/scene_data.cpp b/engines/mads/scene_data.cpp
new file mode 100644
index 0000000000..1494f62d7a
--- /dev/null
+++ b/engines/mads/scene_data.cpp
@@ -0,0 +1,463 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+
+ * You should have received a copy of the GNU General Public 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 "mads/scene_data.h"
+#include "mads/mads.h"
+#include "mads/compression.h"
+#include "mads/screen.h"
+#include "mads/resources.h"
+#include "mads/dragonsphere/dragonsphere_scenes.h"
+#include "mads/nebular/nebular_scenes.h"
+#include "mads/phantom/phantom_scenes.h"
+
+namespace MADS {
+
+KernelMessage::KernelMessage() {
+ _flags = 0;
+ _sequenceIndex = 0;
+ _color1 = 0;
+ _color2 = 0;
+ _msgOffset = 0;
+ _numTicks = 0;
+ _frameTimer2 = 0;
+ _frameTimer = 0;
+ _timeout = 0;
+ _trigger = 0;
+ _abortMode = SEQUENCE_TRIGGER_PARSER;
+ _actionDetails._verbId = VERB_NONE;
+ _actionDetails._objectNameId = 0;
+ _actionDetails._indirectObjectId = 0;
+ _textDisplayIndex = 0;
+}
+
+/*------------------------------------------------------------------------*/
+
+void ARTHeader::load(Common::SeekableReadStream *f, bool isV2) {
+ if (!isV2) {
+ // Read in dimensions of image
+ _width = f->readUint16LE();
+ _height = f->readUint16LE();
+ }
+
+ // Read in palette information
+ int palCount = f->readUint16LE();
+ for (int i = 0; i < palCount; ++i) {
+ RGB6 rgb;
+ rgb.load(f);
+ _palette.push_back(rgb);
+ }
+ f->skip(6 * (256 - palCount));
+
+ // Read palette animations
+ int cycleCount = f->readUint16LE();
+ for (int i = 0; i < cycleCount; ++i) {
+ PaletteCycle cycle;
+ cycle._colorCount = f->readByte();
+ cycle._firstListColor = f->readByte();
+ cycle._firstColorIndex = f->readByte();
+ cycle._ticks = f->readByte();
+
+ _paletteCycles.push_back(cycle);
+ }
+}
+
+/*------------------------------------------------------------------------*/
+
+void SceneInfo::SpriteInfo::load(Common::SeekableReadStream *f) {
+ f->skip(3);
+ _spriteSetIndex = f->readByte();
+ f->skip(2);
+ _position.x = f->readSint16LE();
+ _position.y = f->readSint16LE();
+ _depth = f->readByte();
+ _scale = f->readByte();
+}
+
+/*------------------------------------------------------------------------*/
+
+SceneInfo::SceneInfo(MADSEngine *vm) : _vm(vm) {
+ _sceneId = 0;
+ _artFileNum = 0;
+ _depthStyle = 0;
+ _width = 0;
+ _height = 0;
+ _yBandsEnd = 0;
+ _yBandsStart = 0;
+ _maxScale = 0;
+ _minScale = 0;
+ _field4A = 0;
+ _usageIndex = 0;
+ for (int i = 0; i < 15; ++i)
+ _depthList[i] = 0;
+}
+
+SceneInfo *SceneInfo::init(MADSEngine *vm) {
+ switch (vm->getGameID()) {
+ case GType_RexNebular:
+ return new Nebular::SceneInfoNebular(vm);
+ case GType_Dragonsphere:
+ return new Dragonsphere::SceneInfoDragonsphere(vm);
+ case GType_Phantom:
+ return new Phantom::SceneInfoPhantom(vm);
+ default:
+ error("SceneInfo: Unknown game");
+ }
+
+ return nullptr;
+}
+
+void SceneInfo::load(int sceneId, int variant, const Common::String &resName,
+ int flags, DepthSurface &depthSurface, MSurface &bgSurface) {
+ bool sceneFlag = sceneId >= 0;
+
+ // Figure out the resource to use
+ Common::String resourceName;
+ if (sceneFlag) {
+ resourceName = Resources::formatName(RESPREFIX_RM, sceneId, ".DAT");
+ } else {
+ resourceName = "*" + Resources::formatResource(resName, resName);
+ }
+
+ // Open the scene info resource for access
+ File infoFile(resourceName);
+ MadsPack infoPack(&infoFile);
+
+ // Read in basic data
+ Common::SeekableReadStream *infoStream = infoPack.getItemStream(0);
+ if (_vm->getGameID() == GType_RexNebular) {
+ _sceneId = infoStream->readUint16LE();
+ } else {
+ infoStream->skip(6); // actual scene ID (string)
+ _sceneId = sceneId;
+ }
+
+ // TODO: The following isn't quite right for V2 games (it's all 0)
+ _artFileNum = infoStream->readUint16LE();
+ _depthStyle = infoStream->readUint16LE();
+ _width = infoStream->readUint16LE();
+ _height = infoStream->readUint16LE();
+
+ // HACK for V2 games (for now)
+ if (_vm->getGameID() != GType_RexNebular) {
+ _width = 320;
+ _height = 156;
+ }
+
+ infoStream->skip(24);
+
+ int nodeCount = infoStream->readUint16LE();
+ _yBandsEnd = infoStream->readUint16LE();
+ _yBandsStart = infoStream->readUint16LE();
+ _maxScale = infoStream->readUint16LE();
+ _minScale = infoStream->readUint16LE();
+ for (int i = 0; i < DEPTH_BANDS_SIZE; ++i)
+ _depthList[i] = infoStream->readUint16LE();
+ _field4A = infoStream->readUint16LE();
+
+ // Load the set of objects that are associated with the scene
+ for (int i = 0; i < 20; ++i) {
+ WalkNode node;
+ node.load(infoStream);
+
+ if (i < nodeCount)
+ _nodes.push_back(node);
+ }
+
+ int spriteSetsCount = infoStream->readUint16LE();
+ int spriteInfoCount = infoStream->readUint16LE();
+
+ // Load in sprite sets
+ Common::StringArray setNames;
+ for (int i = 0; i < 10; ++i) {
+ char name[64];
+ infoStream->read(name, 64);
+
+ if (i < spriteSetsCount)
+ setNames.push_back(Common::String(name));
+ }
+
+ // Load in sprite draw information
+ Common::Array<SpriteInfo> spriteInfo;
+ // TODO: The following isn't quite right for V2 games
+ if (_vm->getGameID() == GType_RexNebular) {
+ for (int i = 0; i < 50; ++i) {
+ SpriteInfo info;
+ info.load(infoStream);
+
+ if (i < spriteInfoCount)
+ spriteInfo.push_back(info);
+ }
+ }
+ delete infoStream;
+
+ int width = _width;
+ int height = _height;
+
+ if (!bgSurface.getPixels()) {
+ bgSurface.setSize(width, height);
+ }
+
+ if (_depthStyle == 2)
+ width >>= 2;
+ if (!depthSurface.getPixels()) {
+ depthSurface.setSize(width, height);
+ }
+
+ if (_vm->getGameID() == GType_RexNebular) {
+ // Load the depth surface with the scene codes
+ Common::SeekableReadStream *depthStream = infoPack.getItemStream(variant + 1);
+ loadCodes(depthSurface, depthStream);
+ delete depthStream;
+ }
+
+ infoFile.close();
+
+ if (_vm->getGameID() == GType_RexNebular) {
+ loadMadsV1Background(sceneId, resName, flags, bgSurface);
+ loadPalette(sceneId, _artFileNum, resName, flags, bgSurface);
+ } else {
+ loadMadsV2Background(sceneId, resName, flags, bgSurface);
+ loadPalette(sceneId, sceneId, resName, flags, bgSurface);
+ }
+
+ Common::Array<SpriteAsset *> spriteSets;
+ Common::Array<int> usageList;
+
+ // TODO: The following isn't quite right for V2 games
+ if (_vm->getGameID() == GType_RexNebular) {
+ for (uint i = 0; i < setNames.size(); ++i) {
+ Common::String setResName;
+ if (sceneFlag || resName.hasPrefix("*"))
+ setResName += "*";
+ setResName += setNames[i];
+
+ SpriteAsset *sprites = new SpriteAsset(_vm, setResName, flags);
+ spriteSets.push_back(sprites);
+ usageList.push_back(sprites->_usageIndex);
+ }
+ }
+
+ _vm->_palette->_paletteUsage.updateUsage(usageList, _usageIndex);
+
+ for (uint i = 0; i < spriteInfo.size(); ++i) {
+ SpriteInfo &si = spriteInfo[i];
+ SpriteAsset *asset = spriteSets[si._spriteSetIndex];
+ assert(asset && _depthStyle != 2);
+
+ MSprite *spr = asset->getFrame(asset->getCount() - 1);
+ bgSurface.copyFrom(spr, si._position, si._depth, &depthSurface,
+ si._scale, spr->getTransparencyIndex());
+ }
+
+ // Free the sprite sets
+ for (int i = (int)spriteSets.size() - 1; i >= 0; --i) {
+ _vm->_palette->_paletteUsage.resetPalFlags(spriteSets[i]->_usageIndex);
+ delete spriteSets[i];
+ }
+}
+
+void SceneInfo::loadPalette(int sceneId, int artFileNum, const Common::String &resName, int flags, MSurface &bgSurface) {
+ bool sceneFlag = sceneId >= 0;
+ Common::String resourceName;
+ bool isV2 = (_vm->getGameID() != GType_RexNebular);
+ Common::String extension = !isV2 ? ".ART" : ".TT";
+ int paletteStream = !isV2 ? 0 : 2;
+
+ // Get the ART resource
+ if (sceneFlag) {
+ resourceName = Resources::formatName(RESPREFIX_RM, artFileNum, extension);
+ } else {
+ resourceName = "*" + Resources::formatResource(resName, resName);
+ }
+
+ // Load in the ART header and palette
+ File artFile(resourceName);
+ MadsPack artResource(&artFile);
+ Common::SeekableReadStream *stream = artResource.getItemStream(paletteStream);
+
+ ARTHeader artHeader;
+ artHeader.load(stream, isV2);
+ delete stream;
+
+ // Copy out the palette animation data
+ for (uint i = 0; i < artHeader._paletteCycles.size(); ++i)
+ _paletteCycles.push_back(artHeader._paletteCycles[i]);
+
+ if (!(flags & 1)) {
+ if (!_vm->_palette->_paletteUsage.empty()) {
+ _vm->_palette->_paletteUsage.getKeyEntries(artHeader._palette);
+ _vm->_palette->_paletteUsage.prioritize(artHeader._palette);
+ }
+
+ _usageIndex = _vm->_palette->_paletteUsage.process(artHeader._palette,
+ (flags & 0xF800) | 0x8000);
+ if (_usageIndex > 0) {
+ _vm->_palette->_paletteUsage.transform(artHeader._palette);
+
+ for (uint i = 0; i < _paletteCycles.size(); ++i) {
+ byte listColor = _paletteCycles[i]._firstListColor;
+ _paletteCycles[i]._firstColorIndex = artHeader._palette[listColor]._palIndex;
+ }
+ }
+ }
+
+ if (!(flags & 1)) {
+ // Translate the background to use the correct palette indexes
+ bgSurface.translate(artHeader._palette);
+ }
+}
+
+void SceneInfo::loadMadsV1Background(int sceneId, const Common::String &resName, int flags, MSurface &bgSurface) {
+ bool sceneFlag = sceneId >= 0;
+ Common::String resourceName;
+ Common::SeekableReadStream *stream;
+
+ // Get the ART resource
+ if (sceneFlag) {
+ resourceName = Resources::formatName(RESPREFIX_RM, _artFileNum, ".ART");
+ } else {
+ resourceName = "*" + Resources::formatResource(resName, resName);
+ }
+
+ // Load in the ART data
+ File artFile(resourceName);
+ MadsPack artResource(&artFile);
+
+ // Read in the background surface data
+ assert(_width == bgSurface.w && _height == bgSurface.h);
+ stream = artResource.getItemStream(1);
+ stream->read(bgSurface.getPixels(), bgSurface.w * bgSurface.h);
+
+ // Close the ART file
+ delete stream;
+ artFile.close();
+}
+
+void SceneInfo::loadMadsV2Background(int sceneId, const Common::String &resName, int flags, MSurface &bgSurface) {
+ Common::String tileMapResourceName = Resources::formatName(RESPREFIX_RM, sceneId, ".MM");
+ File tileMapFile(tileMapResourceName);
+ MadsPack tileMapPack(&tileMapFile);
+ Common::SeekableReadStream *mapStream = tileMapPack.getItemStream(0);
+
+ // Get the details of the tiles and map
+ mapStream->readUint32LE();
+ int tileCountX = mapStream->readUint16LE();
+ int tileCountY = mapStream->readUint16LE();
+ int tileWidthMap = mapStream->readUint16LE();
+ int tileHeightMap = mapStream->readUint16LE();
+ int screenWidth = mapStream->readUint16LE();
+ int screenHeight = mapStream->readUint16LE();
+ int tileCountMap = tileCountX * tileCountY;
+ delete mapStream;
+
+ // Obtain tile map information
+ typedef Common::List<Common::SharedPtr<MSurface> > TileSetList;
+ typedef TileSetList::iterator TileSetIterator;
+ TileSetList tileSet;
+ uint16 *tileMap = new uint16[tileCountMap];
+ mapStream = tileMapPack.getItemStream(1);
+ for (int i = 0; i < tileCountMap; ++i)
+ tileMap[i] = mapStream->readUint16LE();
+ delete mapStream;
+ tileMapFile.close();
+
+ // --------------------------------------------------------------------------------
+
+ // Tile data, which needs to be kept compressed, as the tile map offsets refer to
+ // the compressed data. Each tile is then uncompressed separately
+ Common::String tileDataResourceName = Resources::formatName(RESPREFIX_RM, sceneId, ".TT");
+ File tileDataFile(tileDataResourceName);
+ MadsPack tileDataPack(&tileDataFile);
+ Common::SeekableReadStream *tileDataUncomp = tileDataPack.getItemStream(0);
+
+ // Validate that the data matches between the tiles and tile map file and is valid
+ int tileCount = tileDataUncomp->readUint16LE();
+ int tileWidth = tileDataUncomp->readUint16LE();
+ int tileHeight = tileDataUncomp->readUint16LE();
+ delete tileDataUncomp;
+ assert(tileCountMap == tileCount);
+ assert(tileWidth == tileWidthMap);
+ assert(tileHeight == tileHeightMap);
+ assert(screenWidth == _width);
+ assert(screenHeight <= _height);
+
+ // --------------------------------------------------------------------------------
+
+ // Get tile data
+
+ tileDataUncomp = tileDataPack.getItemStream(1);
+ FabDecompressor fab;
+ uint32 compressedTileDataSize = 0;
+
+ for (int i = 0; i < tileCount; i++) {
+ tileDataUncomp->seek(i * 4, SEEK_SET);
+ uint32 tileOfs = tileDataUncomp->readUint32LE();
+ MSurface* newTile = new MSurface(tileWidth, tileHeight);
+
+ if (i == tileCount - 1)
+ compressedTileDataSize = tileDataFile.size() - tileOfs;
+ else
+ compressedTileDataSize = tileDataUncomp->readUint32LE() - tileOfs;
+
+ //debugCN(kDebugGraphics, "Tile: %i, compressed size: %i\n", i, compressedTileDataSize);
+
+ newTile->empty();
+
+ byte *compressedTileData = new byte[compressedTileDataSize];
+
+ tileDataFile.seek(tileDataPack.getDataOffset() + tileOfs, SEEK_SET);
+ tileDataFile.read(compressedTileData, compressedTileDataSize);
+
+ fab.decompress(compressedTileData, compressedTileDataSize, (byte*)newTile->getPixels(), tileWidth * tileHeight);
+ tileSet.push_back(TileSetList::value_type(newTile));
+ delete[] compressedTileData;
+ }
+
+ delete tileDataUncomp;
+
+ // --------------------------------------------------------------------------------
+
+ // Loop through the mapping data to place the tiles on the screen
+
+ uint16 *tIndex = &tileMap[0];
+ for (int y = 0; y < tileCountY; y++) {
+ for (int x = 0; x < tileCountX; x++) {
+ int tileIndex = *tIndex++;
+ assert(tileIndex < tileCount);
+ TileSetIterator tile = tileSet.begin();
+ for (int i = 0; i < tileIndex; i++)
+ ++tile;
+ ((*tile).get())->copyTo(&bgSurface, Common::Point(x * tileWidth, y * tileHeight));
+ }
+ }
+ tileSet.clear();
+ tileDataFile.close();
+}
+
+/*------------------------------------------------------------------------*/
+
+SceneLogic::SceneLogic(MADSEngine *vm) : _vm(vm) {
+ _scene = &_vm->_game->_scene;
+}
+
+} // End of namespace MADS
diff --git a/engines/mads/scene_data.h b/engines/mads/scene_data.h
new file mode 100644
index 0000000000..783a9ab8a9
--- /dev/null
+++ b/engines/mads/scene_data.h
@@ -0,0 +1,224 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+
+ * You should have received a copy of the GNU General Public 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 MADS_SCENE_DATA_H
+#define MADS_SCENE_DATA_H
+
+#include "common/scummsys.h"
+#include "common/array.h"
+#include "common/serializer.h"
+#include "common/str.h"
+#include "common/str-array.h"
+#include "common/rect.h"
+#include "mads/action.h"
+#include "mads/assets.h"
+#include "mads/events.h"
+#include "mads/game_data.h"
+#include "mads/hotspots.h"
+#include "mads/messages.h"
+#include "mads/rails.h"
+#include "mads/user_interface.h"
+
+namespace MADS {
+
+class MADSEngine;
+class Scene;
+class SpriteSlot;
+
+#define MADS_INTERFACE_HEIGHT 44
+#define MADS_SCENE_HEIGHT 156
+
+#define DEPTH_BANDS_SIZE 15
+
+#define SPRITE_SLOTS_MAX_SIZE 50
+#define TEXT_DISPLAY_MAX_SIZE 40
+#define DIRTY_AREAS_SIZE (SPRITE_SLOTS_MAX_SIZE + TEXT_DISPLAY_MAX_SIZE)
+
+enum {
+ SCENEFLAG_DITHER = 0x01, // Dither to 16 colors
+ SCENEFLAG_LOAD_SHADOW = 0x10 // Load hard shadows
+};
+
+class VerbInit {
+public:
+ int _id;
+ VerbType _verbType;
+ PrepType _prepType;
+
+ VerbInit() {}
+ VerbInit(int id, VerbType verbType, PrepType prepType)
+ : _id(id), _verbType(verbType), _prepType(prepType) {
+ }
+};
+
+class SceneLogic {
+protected:
+ MADSEngine *_vm;
+ Scene *_scene;
+public:
+ /**
+ * Constructor
+ */
+ SceneLogic(MADSEngine *vm);
+
+ /**
+ * Destructor
+ */
+ virtual ~SceneLogic() {}
+
+ /**
+ * Called to initially setup a scene
+ */
+ virtual void setup() = 0;
+
+ /**
+ * Called as the scene is entered (made active)
+ */
+ virtual void enter() = 0;
+
+ /**
+ * Called one per frame
+ */
+ virtual void step() {}
+
+ /**
+ * Called before an action is started
+ */
+ virtual void preActions() {}
+
+ /**
+ * Handles scene actions
+ */
+ virtual void actions() = 0;
+
+ /**
+ * Post-action handling
+ */
+ virtual void postActions() {}
+
+ /**
+ * Unhandled action handling
+ */
+ virtual void unhandledAction() {}
+
+ /**
+ * Synchronize any local data for the scene
+ */
+ virtual void synchronize(Common::Serializer &s) {}
+};
+
+struct ARTHeader {
+ int _width;
+ int _height;
+ Common::Array<RGB6> _palette;
+ Common::Array<PaletteCycle> _paletteCycles;
+
+ void load(Common::SeekableReadStream *f, bool isV2);
+};
+
+/**
+ * Handles general data for a given scene
+ */
+class SceneInfo {
+ class SpriteInfo {
+ public:
+ int _spriteSetIndex;
+ Common::Point _position;
+ int _depth;
+ int _scale;
+
+ void load(Common::SeekableReadStream *f);
+ };
+protected:
+ MADSEngine *_vm;
+
+ /**
+ * Constructor
+ */
+ SceneInfo(MADSEngine *vm);
+public:
+ int _sceneId;
+ int _artFileNum;
+ int _depthStyle;
+ int _width;
+ int _height;
+
+ int _yBandsEnd;
+ int _yBandsStart;
+ int _maxScale;
+ int _minScale;
+ int _depthList[DEPTH_BANDS_SIZE];
+ int _field4A; // Useless field ?
+
+ int _usageIndex;
+ Common::Array<PaletteCycle> _paletteCycles;
+ WalkNodeList _nodes;
+public:
+ /**
+ * Destructor
+ */
+ virtual ~SceneInfo() {}
+
+ /**
+ * Instantiates the class
+ */
+ static SceneInfo *init(MADSEngine *vm);
+
+ /**
+ * loads the data
+ */
+ void load(int sceneId, int variant, const Common::String &resName, int flags,
+ DepthSurface &depthSurface, MSurface &bgSurface);
+
+ /**
+ * Loads the palette for a scene
+ */
+ void loadPalette(int sceneId, int artFileNum, const Common::String &resName, int flags, MSurface &bgSurface);
+
+ /**
+ * Loads a V1 game background
+ */
+ void loadMadsV1Background(int sceneId, const Common::String &resName, int flags, MSurface &bgSurface);
+
+ /**
+ * Loads a V2 game background
+ */
+ void loadMadsV2Background(int sceneId, const Common::String &resName, int flags, MSurface &bgSurface);
+
+ /**
+ * Loads the given surface with depth information of a given scene
+ * @param depthSurface Depth/walk surface
+ * @param variant Variant number to load
+ */
+ virtual void loadCodes(MSurface &depthSurface, int variant) = 0;
+
+ /**
+ * Loads the given surface with depth information of a given scene
+ * @param depthSurface Depth/walk surface
+ * @param stream Stream to load the data from
+ */
+ virtual void loadCodes(MSurface &depthSurface, Common::SeekableReadStream *stream) = 0;
+};
+
+} // End of namespace MADS
+
+#endif /* MADS_SCENE_DATA_H */
diff --git a/engines/mads/screen.cpp b/engines/mads/screen.cpp
new file mode 100644
index 0000000000..7e8710db56
--- /dev/null
+++ b/engines/mads/screen.cpp
@@ -0,0 +1,653 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+
+ * You should have received a copy of the GNU General Public 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 "mads/mads.h"
+#include "mads/game.h"
+#include "mads/screen.h"
+#include "mads/palette.h"
+#include "mads/user_interface.h"
+
+namespace MADS {
+
+MADSEngine *DirtyArea::_vm = nullptr;
+
+DirtyArea::DirtyArea() {
+ _active = false;
+ _textActive = false;
+ _mergedArea = nullptr;
+}
+
+void DirtyArea::setArea(int width, int height, int maxWidth, int maxHeight) {
+ if (_bounds.left % 2) {
+ --_bounds.left;
+ ++width;
+ }
+
+ if (_bounds.left < 0)
+ _bounds.left = 0;
+ else if (_bounds.left > maxWidth)
+ _bounds.left = maxWidth;
+ int right = _bounds.left + width;
+ if (right < 0)
+ right = 0;
+ if (right > maxWidth)
+ right = maxWidth;
+
+ _bounds.right = right;
+
+ if (_bounds.top < 0)
+ _bounds.top = 0;
+ else if (_bounds.top > maxHeight)
+ _bounds.top = maxHeight;
+ int bottom = _bounds.top + height;
+ if (bottom < 0)
+ bottom = 0;
+ if (bottom > maxHeight)
+ bottom = maxHeight;
+
+ _bounds.bottom = bottom;
+ _active = true;
+}
+
+
+void DirtyArea::setSpriteSlot(const SpriteSlot *spriteSlot) {
+ int width, height;
+ Scene &scene = _vm->_game->_scene;
+
+ if (spriteSlot->_flags == IMG_REFRESH) {
+ // Special entry to refresh the entire screen
+ _bounds.left = 0;
+ _bounds.top = 0;
+ width = MADS_SCREEN_WIDTH;
+ height = MADS_SCENE_HEIGHT;
+ } else {
+ // Standard sprite slots
+ _bounds.left = spriteSlot->_position.x - scene._posAdjust.x;
+ _bounds.top = spriteSlot->_position.y - scene._posAdjust.y;
+
+ SpriteAsset &spriteSet = *scene._sprites[spriteSlot->_spritesIndex];
+ MSprite *frame = spriteSet.getFrame(ABS(spriteSlot->_frameNumber) - 1);
+
+ if (spriteSlot->_scale == -1) {
+ width = frame->w;
+ height = frame->h;
+ } else {
+ width = frame->w * spriteSlot->_scale / 100;
+ height = frame->h * spriteSlot->_scale / 100;
+
+ _bounds.left -= width / 2;
+ _bounds.top += -(height - 1);
+ }
+ }
+
+ setArea(width, height, MADS_SCREEN_WIDTH, MADS_SCENE_HEIGHT);
+}
+
+void DirtyArea::setTextDisplay(const TextDisplay *textDisplay) {
+ _bounds.left = textDisplay->_bounds.left;
+ _bounds.top = textDisplay->_bounds.top;
+
+ setArea(textDisplay->_bounds.width(), textDisplay->_bounds.height(),
+ MADS_SCREEN_WIDTH, MADS_SCENE_HEIGHT);
+}
+
+void DirtyArea::setUISlot(const UISlot *slot) {
+ int type = slot->_flags;
+ if (type <= IMG_UPDATE_ONLY)
+ type += -IMG_UPDATE_ONLY;
+ if (type >= 0x40)
+ type &= ~0x40;
+
+ MSurface &intSurface = _vm->_game->_scene._userInterface;
+ switch (type) {
+ case IMG_REFRESH:
+ _bounds.left = 0;
+ _bounds.top = 0;
+ setArea(intSurface.w, intSurface.h, intSurface.w, intSurface.h);
+ break;
+
+ case IMG_OVERPRINT:
+ _bounds.left = slot->_position.x;
+ _bounds.top = slot->_position.y;
+ _bounds.setWidth(slot->_width);
+ _bounds.setHeight(slot->_height);
+ setArea(slot->_width, slot->_height, intSurface.w, intSurface.h);
+ break;
+
+ default: {
+ SpriteAsset *asset = _vm->_game->_scene._sprites[slot->_spritesIndex];
+ MSprite *frame = asset->getFrame(slot->_frameNumber - 1);
+ int w = frame->w;
+ int h = frame->h;
+
+ if (slot->_segmentId == IMG_SPINNING_OBJECT) {
+ _bounds.left = slot->_position.x;
+ _bounds.top = slot->_position.y;
+ } else {
+ _bounds.left = slot->_position.x + w / 2;
+ _bounds.top = slot->_position.y - h + 1;
+ }
+
+ setArea(w, h, intSurface.w, intSurface.h);
+ break;
+ }
+ }
+}
+
+/*------------------------------------------------------------------------*/
+
+DirtyAreas::DirtyAreas(MADSEngine *vm) : _vm(vm) {
+ DirtyArea::_vm = vm;
+
+ for (int i = 0; i < DIRTY_AREAS_SIZE; ++i) {
+ DirtyArea rec;
+ rec._active = false;
+ push_back(rec);
+ }
+}
+
+void DirtyAreas::merge(int startIndex, int count) {
+ if (startIndex >= count)
+ return;
+
+ for (int outerCtr = startIndex - 1, idx = 0; idx < count; ++outerCtr, ++idx) {
+ if (!(*this)[outerCtr]._active)
+ continue;
+
+ for (int innerCtr = outerCtr + 1; innerCtr < count; ++innerCtr) {
+ if (!(*this)[innerCtr]._active || !intersects(outerCtr, innerCtr))
+ continue;
+
+ if ((*this)[outerCtr]._textActive && (*this)[innerCtr]._textActive)
+ mergeAreas(innerCtr, outerCtr);
+ }
+ }
+}
+
+/**
+* Returns true if two dirty areas intersect
+*/
+bool DirtyAreas::intersects(int idx1, int idx2) {
+ return (*this)[idx1]._bounds.intersects((*this)[idx2]._bounds);
+}
+
+void DirtyAreas::mergeAreas(int idx1, int idx2) {
+ DirtyArea &da1 = (*this)[idx1];
+ DirtyArea &da2 = (*this)[idx2];
+
+ da1._bounds.extend(da2._bounds);
+
+ da2._active = false;
+ da2._mergedArea = &da1;
+ da1._textActive = true;
+}
+
+void DirtyAreas::copy(MSurface *srcSurface, MSurface *destSurface, const Common::Point &posAdjust) {
+ for (uint i = 0; i < size(); ++i) {
+ const Common::Rect &srcBounds = (*this)[i]._bounds;
+
+ // Check if this is a sane rectangle before attempting to create it
+ if (srcBounds.left >= srcBounds.right || srcBounds.top >= srcBounds.bottom)
+ continue;
+
+ Common::Rect bounds(srcBounds.left + posAdjust.x, srcBounds.top + posAdjust.y,
+ srcBounds.right + posAdjust.x, srcBounds.bottom + posAdjust.y);
+
+ if ((*this)[i]._active && bounds.isValidRect()) {
+ srcSurface->copyTo(destSurface, bounds, Common::Point(bounds.left, bounds.top));
+ }
+ }
+}
+
+void DirtyAreas::copyToScreen(const Common::Point &posAdjust) {
+ for (uint i = 0; i < size(); ++i) {
+ const Common::Rect &srcBounds = (*this)[i]._bounds;
+
+ // Check if this is a sane rectangle before attempting to create it
+ if (srcBounds.left >= srcBounds.right || srcBounds.top >= srcBounds.bottom)
+ continue;
+
+ Common::Rect bounds(srcBounds.left + posAdjust.x, srcBounds.top + posAdjust.y,
+ srcBounds.right + posAdjust.x, srcBounds.bottom + posAdjust.y);
+
+ if ((*this)[i]._active && (*this)[i]._bounds.isValidRect()) {
+ _vm->_screen.copyRectToScreen(bounds);
+ }
+ }
+}
+
+void DirtyAreas::reset() {
+ for (uint i = 0; i < size(); ++i)
+ (*this)[i]._active = false;
+}
+
+/*------------------------------------------------------------------------*/
+
+ScreenObject::ScreenObject() {
+ _category = CAT_NONE;
+ _descId = 0;
+ _layer = 0;
+ _active = false;
+}
+
+/*------------------------------------------------------------------------*/
+
+ScreenObjects::ScreenObjects(MADSEngine *vm) : _vm(vm) {
+ _objectY = -1;
+ _forceRescan = false;
+ _inputMode = kInputBuildingSentences;
+ _v7FED6 = 0;
+ _v8332A = 0;
+ _category = CAT_NONE;
+ _spotId = 0;
+ _released = false;
+ _uiCount = 0;
+ _selectedObject = -1;
+ _eventFlag = false;
+ _baseTime = 0;
+}
+
+void ScreenObjects::add(const Common::Rect &bounds, Layer layer, ScrCategory category, int descId) {
+ //assert(size() < 100);
+
+ ScreenObject so;
+ so._bounds = bounds;
+ so._category = category;
+ so._descId = descId;
+ so._layer = layer;
+ so._active = true;
+
+ push_back(so);
+}
+
+void ScreenObjects::check(bool scanFlag) {
+ Scene &scene = _vm->_game->_scene;
+ UserInterface &userInterface = scene._userInterface;
+
+ if (!_vm->_events->_mouseButtons || _inputMode != kInputBuildingSentences)
+ _vm->_events->_rightMousePressed = false;
+
+ if ((_vm->_events->_mouseMoved || userInterface._scrollbarActive
+ || _v8332A || _forceRescan) && scanFlag) {
+ _category = CAT_NONE;
+ _selectedObject = scanBackwards(_vm->_events->currentPos(), LAYER_GUI);
+ if (_selectedObject > 0) {
+ ScreenObject &scrObject = (*this)[_selectedObject];
+ _category = (ScrCategory)(scrObject._category & 7);
+ _spotId = scrObject._descId;
+ }
+
+ // Handling for easy mouse
+ ScrCategory category = scene._userInterface._category;
+ if (_vm->_easyMouse && _vm->_events->_mouseButtons && category != _category
+ && scene._userInterface._category != CAT_NONE) {
+ _released = true;
+ if (category >= CAT_COMMAND && category <= CAT_TALK_ENTRY) {
+ elementHighlighted();
+ }
+
+ scene._action.checkActionAtMousePos();
+ }
+
+ //_released = _vm->_events->_mouseReleased;
+ if (_vm->_events->_vD2 || (_vm->_easyMouse && !_vm->_events->_mouseStatusCopy))
+ scene._userInterface._category = _category;
+
+ if (!_vm->_events->_mouseButtons || _vm->_easyMouse) {
+ if (userInterface._category >= CAT_COMMAND && userInterface._category <= CAT_TALK_ENTRY) {
+ elementHighlighted();
+ }
+ }
+
+ if (_vm->_events->_mouseButtons || (_vm->_easyMouse && scene._action._interAwaiting > AWAITING_COMMAND
+ && scene._userInterface._category == CAT_INV_LIST) ||
+ (_vm->_easyMouse && scene._userInterface._category == CAT_HOTSPOT)) {
+ scene._action.checkActionAtMousePos();
+ }
+
+ if (_vm->_events->_mouseReleased) {
+ scene._action.leftClick();
+ scene._userInterface._category = CAT_NONE;
+ }
+
+ if (_vm->_events->_mouseButtons || _vm->_easyMouse || userInterface._scrollbarActive)
+ scene._userInterface.updateInventoryScroller();
+
+ if (_vm->_events->_mouseButtons || _vm->_easyMouse)
+ scene._action.set();
+
+ _forceRescan = false;
+ }
+
+ scene._action.refresh();
+
+ uint32 currentTicks = _vm->_events->getFrameCounter();
+ if (currentTicks >= _baseTime) {
+ // Check the user interface slots to see if there's any slots that need to be expired
+ UISlots &uiSlots = userInterface._uiSlots;
+ for (uint idx = 0; idx < uiSlots.size(); ++idx) {
+ UISlot &slot = uiSlots[idx];
+
+ if (slot._flags != IMG_REFRESH && slot._flags > IMG_UPDATE_ONLY
+ && slot._segmentId != IMG_SPINNING_OBJECT)
+ slot._flags = IMG_ERASE;
+ }
+
+ // Any background animation in the user interface
+ userInterface.doBackgroundAnimation();
+
+ // Handle animating the selected inventory item
+ userInterface.inventoryAnim();
+
+ // Set the base time
+ _baseTime = currentTicks + 6;
+ }
+}
+
+int ScreenObjects::scan(const Common::Point &pt, int layer) {
+ for (uint i = 1; i <= size(); ++i) {
+ ScreenObject &sObj = (*this)[i];
+ if (sObj._active && sObj._bounds.contains(pt) && sObj._layer == layer)
+ return i;
+ }
+
+ // Entry not found
+ return 0;
+}
+
+int ScreenObjects::scanBackwards(const Common::Point &pt, int layer) {
+ for (int i = (int)size(); i >= 1; --i) {
+ ScreenObject &sObj = (*this)[i];
+ if (sObj._active && sObj._bounds.contains(pt) && sObj._layer == layer)
+ return i;
+ }
+
+ // Entry not found
+ return 0;
+}
+
+void ScreenObjects::elementHighlighted() {
+ Scene &scene = _vm->_game->_scene;
+ UserInterface &userInterface = scene._userInterface;
+ Common::Array<int> &invList = _vm->_game->_objects._inventoryList;
+ MADSAction &action = scene._action;
+ int varA;
+ int topIndex;
+ int *idxP;
+ int var4;
+ int index;
+ int indexEnd = -1;
+ int var8 = 0;
+ int uiCount;
+
+ switch (userInterface._category) {
+ case CAT_COMMAND:
+ index = 10;
+ indexEnd = 9;
+ varA = 5;
+ topIndex = 0;
+ idxP = !_vm->_events->_rightMousePressed ? &userInterface._highlightedCommandIndex :
+ &userInterface._selectedActionIndex;
+
+ if (_vm->_events->_rightMousePressed && userInterface._selectedItemVocabIdx >= 0)
+ userInterface.updateSelection(CAT_INV_VOCAB, -1, &userInterface._selectedItemVocabIdx);
+
+ var4 = _released && !_vm->_events->_rightMousePressed ? 1 : 0;
+ break;
+
+ case CAT_INV_LIST:
+ userInterface.scrollInventory();
+
+ index = MIN((int)invList.size() - userInterface._inventoryTopIndex, 5);
+ indexEnd = invList.size() - 1;
+ varA = 0;
+ topIndex = userInterface._inventoryTopIndex;
+ idxP = &userInterface._highlightedInvIndex;
+ var4 = (!_released || (_vm->_events->_mouseButtons && action._interAwaiting == 1)) ? 0 : 1;
+ break;
+
+ case CAT_INV_VOCAB:
+ if (userInterface._selectedInvIndex >= 0) {
+ InventoryObject &invObject = _vm->_game->_objects.getItem(
+ userInterface._selectedInvIndex);
+ index = invObject._vocabCount;
+ indexEnd = index - 1;
+ } else {
+ index = 0;
+ }
+
+ varA = 0;
+ topIndex = 0;
+ idxP = _vm->_events->_rightMousePressed ? &userInterface._selectedItemVocabIdx : &userInterface._highlightedItemVocabIndex;
+
+ if (_vm->_events->_rightMousePressed && userInterface._selectedActionIndex >= 0)
+ userInterface.updateSelection(CAT_COMMAND, -1, &userInterface._selectedActionIndex);
+
+ var4 = _released && !_vm->_events->_rightMousePressed ? 1 : 0;
+ break;
+
+ case CAT_INV_ANIM:
+ index = 1;
+ indexEnd = invList.size() - 1;
+ varA = 0;
+ topIndex = userInterface._selectedInvIndex;
+ idxP = &var8;
+ var4 = -1;
+ break;
+
+ case CAT_TALK_ENTRY:
+ index = userInterface._talkStrings.size();
+ indexEnd = index - 1;
+ varA = 0;
+ topIndex = 0;
+ idxP = &userInterface._highlightedCommandIndex;
+ var4 = -1;
+ break;
+
+ default:
+ uiCount = size() - _uiCount;
+ index = uiCount + scene._hotspots.size();
+ indexEnd = index - 1;
+ varA = 0;
+ topIndex = 0;
+ idxP = &var8;
+ var4 = -1;
+ break;
+ }
+
+ int newIndex = -1;
+ int catIndex = userInterface._categoryIndexes[userInterface._category - 1];
+ int newX = 0, newY = 0;
+ Common::Point currentPos = _vm->_events->currentPos();
+
+ for (int idx = 0; idx < index && newIndex < 0; ++idx) {
+ int scrObjIndex = (_category == CAT_HOTSPOT) ? catIndex - idx + index - 1 :
+ catIndex + idx;
+
+ ScreenObject &scrObject = (*this)[scrObjIndex];
+ if (!scrObject._active)
+ continue;
+
+ const Common::Rect &bounds = scrObject._bounds;
+ newY = MAX((int)bounds.bottom, newY);
+ newX = MAX((int)bounds.left, newX);
+
+ if (currentPos.y >= bounds.top && currentPos.y < bounds.bottom) {
+ if (var4) {
+ if (currentPos.x >= bounds.left && currentPos.x < bounds.right) {
+ // Cursor is inside hotspot bounds
+ newIndex = scrObjIndex - catIndex;
+ if (_category == CAT_HOTSPOT && newIndex < (int)scene._hotspots.size())
+ newIndex = scene._hotspots.size() - newIndex - 1;
+ }
+ } else if (!varA) {
+ newIndex = idx;
+ } else if (varA <= idx) {
+ if (currentPos.x > bounds.left)
+ newIndex = idx;
+ } else {
+ if (currentPos.x < bounds.right)
+ newIndex = idx;
+ }
+ }
+ }
+
+ if (newIndex == -1 && index > 0 && !var4) {
+ if (_vm->_events->currentPos().y <= newY) {
+ newIndex = 0;
+ if (varA && _vm->_events->currentPos().x >= newX)
+ newIndex = varA;
+ } else {
+ newIndex = index - 1;
+ }
+ }
+
+ if (newIndex >= 0)
+ newIndex = MIN(newIndex + topIndex, indexEnd);
+
+ action._pickedWord = newIndex;
+
+ if (_category == CAT_INV_LIST || _category == CAT_INV_ANIM) {
+ if (action._interAwaiting == 1 && newIndex >= 0 && _released &&
+ (!_vm->_events->_mouseReleased || !_vm->_easyMouse))
+ newIndex = -1;
+ }
+
+ if (_released && !_vm->_events->_rightMousePressed &&
+ (_vm->_events->_mouseReleased || !_vm->_easyMouse))
+ newIndex = -1;
+
+ if (_category != CAT_HOTSPOT && _category != CAT_INV_ANIM)
+ userInterface.updateSelection(_category, newIndex, idxP);
+}
+
+void ScreenObjects::setActive(ScrCategory category, int descId, bool active) {
+ for (uint idx = 1; idx < size(); ++idx) {
+ ScreenObject &sObj = (*this)[idx];
+ if (sObj._category == category && sObj._descId == descId)
+ sObj._active = active;
+ }
+}
+
+void ScreenObjects::synchronize(Common::Serializer &s) {
+ s.syncAsSint16LE(_selectedObject);
+ s.syncAsSint16LE(_category);
+}
+
+/*------------------------------------------------------------------------*/
+
+ScreenSurface::ScreenSurface() {
+ _shakeCountdown = -1;
+ _random = 0x4D2;
+}
+
+void ScreenSurface::init() {
+ setSize(g_system->getWidth(), g_system->getHeight());
+}
+
+void ScreenSurface::copyRectToScreen(const Common::Point &destPos,
+ const Common::Rect &bounds) {
+ const byte *buf = getBasePtr(destPos.x, destPos.y);
+
+ if (bounds.width() != 0 && bounds.height() != 0)
+ g_system->copyRectToScreen(buf, this->pitch, bounds.left, bounds.top,
+ bounds.width(), bounds.height());
+}
+
+void ScreenSurface::copyRectToScreen(const Common::Rect &bounds) {
+ copyRectToScreen(Common::Point(bounds.left, bounds.top), bounds);
+}
+
+void ScreenSurface::updateScreen() {
+ if (_shakeCountdown >= 0) {
+ _random = _random * 5 + 1;
+ int offset = (_random >> 8) & 3;
+ if (_shakeCountdown-- <= 0)
+ offset = 0;
+
+ // Copy the screen with the left hand hide side of the screen of a given
+ // offset width shown at the very right. The offset changes to give
+ // an effect of shaking the screen
+ offset *= 4;
+ const byte *buf = getBasePtr(offset, 0);
+ g_system->copyRectToScreen(buf, this->pitch, 0, 0,
+ this->pitch - offset, this->h);
+ if (offset > 0)
+ g_system->copyRectToScreen(this->pixels, this->pitch,
+ this->pitch - offset, 0, offset, this->h);
+ }
+
+ g_system->updateScreen();
+}
+
+void ScreenSurface::transition(ScreenTransition transitionType, bool surfaceFlag) {
+ Palette &pal = *_vm->_palette;
+ byte palData[PALETTE_SIZE];
+
+ switch (transitionType) {
+ case kTransitionFadeIn:
+ case kTransitionFadeOutIn:
+ Common::fill(&pal._colorValues[0], &pal._colorValues[3], 0);
+ Common::fill(&pal._colorFlags[0], &pal._colorFlags[3], false);
+
+ if (transitionType == kTransitionFadeOutIn) {
+ // Fade out
+ pal.getFullPalette(palData);
+ pal.fadeOut(palData, nullptr, 0, PALETTE_COUNT, 0, 0, 1, 16);
+ }
+
+ // Reset palette to black
+ Common::fill(&palData[0], &palData[PALETTE_SIZE], 0);
+ pal.setFullPalette(palData);
+
+ copyRectToScreen(getBounds());
+ pal.fadeIn(palData, pal._mainPalette, 0, 256, 0, 1, 1, 16);
+ break;
+
+ case kTransitionBoxInBottomLeft:
+ case kTransitionBoxInBottomRight:
+ case kTransitionBoxInTopLeft:
+ case kTransitionBoxInTopRight:
+ error("TODO: transition");
+ break;
+
+ case kTransitionPanLeftToRight:
+ case kTransitionPanRightToLeft:
+ error("TODO: transition");
+
+ case kTransitionCircleIn1:
+ case kTransitionCircleIn2:
+ case kTransitionCircleIn3:
+ case kTransitionCircleIn4:
+ error("TODO circle transition");
+
+ case kCenterVertTransition:
+ error("TODO: center vert transition");
+
+ default:
+ // Quick transitions
+ break;
+ }
+}
+
+} // End of namespace MADS
diff --git a/engines/mads/screen.h b/engines/mads/screen.h
new file mode 100644
index 0000000000..7937e15456
--- /dev/null
+++ b/engines/mads/screen.h
@@ -0,0 +1,246 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+
+ * You should have received a copy of the GNU General Public 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 MADS_SCREEN_H
+#define MADS_SCREEN_H
+
+#include "common/scummsys.h"
+#include "common/array.h"
+#include "mads/msurface.h"
+#include "mads/action.h"
+
+namespace MADS {
+
+#define MADS_SCREEN_WIDTH 320
+#define MADS_SCREEN_HEIGHT 200
+
+enum Layer {
+ LAYER_GUI = 19
+};
+
+enum ScreenTransition {
+ kTransitionNone = 0,
+ kTransitionFadeIn, kTransitionFadeOutIn,
+ kTransitionBoxInBottomLeft, kTransitionBoxInBottomRight,
+ kTransitionBoxInTopLeft, kTransitionBoxInTopRight,
+ kTransitionPanLeftToRight, kTransitionPanRightToLeft,
+ kTransitionCircleIn1, kTransitionCircleIn2,
+ kTransitionCircleIn3, kTransitionCircleIn4,
+ kVertTransition1, kVertTransition2, kVertTransition3,
+ kVertTransition4, kVertTransition5, kVertTransition6,
+ kVertTransition7, kCenterVertTransition
+};
+
+enum InputMode {
+ kInputBuildingSentences = 0, // Normal sentence building
+ kInputConversation = 1, // Conversation mode
+ kInputLimitedSentences = 2 // Use only scene hotspots
+};
+
+class SpriteSlot;
+class TextDisplay;
+class UISlot;
+
+class DirtyArea {
+private:
+ static MADSEngine *_vm;
+ friend class DirtyAreas;
+public:
+ Common::Rect _bounds;
+ bool _textActive;
+ bool _active;
+ DirtyArea *_mergedArea;
+
+ DirtyArea();
+
+ void setArea(int width, int height, int maxWidth, int maxHeight);
+
+ /**
+ * Set up a dirty area for a sprite slot
+ */
+ void setSpriteSlot(const SpriteSlot *spriteSlot);
+
+ /**
+ * Set up a dirty area for a text display
+ */
+ void setTextDisplay(const TextDisplay *textDisplay);
+
+ /**
+ * Set up a dirty area for a UI slot
+ */
+ void setUISlot(const UISlot *slot);
+};
+
+class DirtyAreas : public Common::Array<DirtyArea> {
+private:
+ MADSEngine *_vm;
+public:
+ DirtyAreas(MADSEngine *vm);
+
+ /**
+ * Merge together any designated dirty areas that overlap
+ * @param startIndex 1-based starting dirty area starting index
+ * @param count Number of entries to process
+ */
+ void merge(int startIndex, int count);
+
+ bool intersects(int idx1, int idx2);
+ void mergeAreas(int idx1, int idx2);
+
+ /**
+ * Copy the data specified by the dirty rect list between surfaces
+ * @param srcSurface Source surface
+ * @param destSurface Dest surface
+ * @param posAdjust Position adjustment
+ */
+ void copy(MSurface *srcSurface, MSurface *destSurface, const Common::Point &posAdjust);
+
+ /**
+ * Use the lsit of dirty areas to copy areas of the screen surface to
+ * the physical screen
+ * @param posAdjust Position adjustment */
+ void copyToScreen(const Common::Point &posAdjust);
+
+ void reset();
+};
+
+
+class ScreenObject {
+public:
+ bool _active;
+ Common::Rect _bounds;
+ ScrCategory _category;
+ int _descId;
+ int _layer;
+
+ ScreenObject();
+};
+
+class ScreenObjects : public Common::Array<ScreenObject> {
+private:
+ MADSEngine *_vm;
+ int _objectY;
+
+ int scanBackwards(const Common::Point &pt, int layer);
+public:
+ InputMode _inputMode;
+ int _v7FED6;
+ int _v8332A;
+ int _forceRescan;
+ int _selectedObject;
+ ScrCategory _category;
+ bool _released;
+ int _uiCount;
+ bool _eventFlag;
+ uint32 _baseTime;
+ int _spotId;
+
+ /*
+ * Constructor
+ */
+ ScreenObjects(MADSEngine *vm);
+
+ /**
+ * Add a new item to the list
+ */
+ void add(const Common::Rect &bounds, Layer layer, ScrCategory category, int descId);
+
+ /**
+ * Check objects on the screen
+ */
+ void check(bool scanFlag);
+
+ /**
+ * Scan the registered screen objects
+ */
+ int scan(const Common::Point &pt, int layer);
+
+ /**
+ * Handle an element being highlighted on the screen, and make it active.
+ */
+ void elementHighlighted();
+
+ /**
+ * Retrieve a ScreenObject from the list
+ * @remarks This array is 1-based indexed by the game
+ */
+ ScreenObject &operator[](int idx) {
+ assert(idx > 0);
+ return Common::Array<ScreenObject>::operator[](idx - 1);
+ }
+
+ /**
+ * Sets an item identified by category and Desc Id as active or not
+ * @param category Screen category
+ * @param descId Description for item
+ * @param active Whether to set item as active or not
+ */
+ void setActive(ScrCategory category, int descId, bool active);
+
+ /**
+ * Synchronize the data
+ */
+ void synchronize(Common::Serializer &s);
+};
+
+class ScreenSurface : public MSurface {
+private:
+ uint16 _random;
+public:
+ Common::Point _offset;
+ int _shakeCountdown;
+public:
+ /**
+ * Constructor
+ */
+ ScreenSurface();
+
+ /**
+ * Initialize the surface
+ */
+ void init();
+
+ /**
+ * Copys an area of the screen surface to a given destination position on
+ * the ScummVM physical screen buffer
+ * @param destPos Destination position
+ * @param bounds Area of screen surface to copy
+ */
+ void copyRectToScreen(const Common::Point &destPos, const Common::Rect &bounds);
+
+ /**
+ * Copys an area of the screen surface to the ScmmVM physical screen buffer
+ * @param bounds Area of screen surface to copy
+ */
+ void copyRectToScreen(const Common::Rect &bounds);
+
+ /**
+ * Updates the screen with the contents of the surface
+ */
+ void updateScreen();
+
+ void transition(ScreenTransition transitionType, bool surfaceFlag);
+};
+
+} // End of namespace MADS
+
+#endif /* MADS_SCREEN_H */
diff --git a/engines/mads/sequence.cpp b/engines/mads/sequence.cpp
new file mode 100644
index 0000000000..07b1451718
--- /dev/null
+++ b/engines/mads/sequence.cpp
@@ -0,0 +1,541 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+
+ * You should have received a copy of the GNU General Public 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 "mads/mads.h"
+#include "mads/assets.h"
+#include "mads/sequence.h"
+#include "mads/scene.h"
+
+namespace MADS {
+
+SequenceEntry::SequenceEntry() {
+ _spritesIndex = 0;
+ _flipped = 0;
+ _frameIndex = 0;
+ _frameStart = 0;
+ _numSprites = 0;
+ _animType = ANIMTYPE_NONE;
+ _frameInc = 0;
+ _depth = 0;
+ _scale = 0;
+ _dynamicHotspotIndex = -1;
+ _triggerCountdown = 0;
+ _doneFlag = 0;
+ _triggerMode = SEQUENCE_TRIGGER_DAEMON;
+ _numTicks = 0;
+ _extraTicks = 0;
+ _timeout = 0;
+ _active = false;
+ _nonFixed = false;
+ _flags = 0;
+ for (int i = 0; i < 5; ++i)
+ _entries._mode[i] = SEQUENCE_TRIGGER_EXPIRE;
+
+ _entries._count = 0;
+ _actionNouns._verbId = VERB_NONE;
+ _actionNouns._objectNameId = -1;
+ _actionNouns._indirectObjectId = -1;
+
+ Common::fill(&_entries._frameIndex[0], &_entries._frameIndex[SEQUENCE_ENTRY_SUBSET_MAX], 0);
+ Common::fill(&_entries._trigger[0], &_entries._trigger[SEQUENCE_ENTRY_SUBSET_MAX], 0);
+}
+
+/*------------------------------------------------------------------------*/
+
+#define SEQUENCE_LIST_SIZE 30
+
+SequenceList::SequenceList(MADSEngine *vm) : _vm(vm) {
+ // IMPORTANT: Preallocate timer slots. Note that sprite slots refer to entries
+ // in this list by index, so we can't just add or delete entries later
+ for (int i = 0; i < SEQUENCE_LIST_SIZE; ++i) {
+ SequenceEntry rec;
+ rec._active = false;
+ rec._dynamicHotspotIndex = -1;
+ _entries.push_back(rec);
+ }
+}
+
+void SequenceList::clear() {
+ for (uint i = 0; i < _entries.size(); ++i) {
+ _entries[i]._active = false;
+ _entries[i]._dynamicHotspotIndex = -1;
+ }
+}
+
+bool SequenceList::addSubEntry(int index, SequenceTrigger mode, int frameIndex, int trigger) {
+ if (_entries[index]._entries._count >= SEQUENCE_ENTRY_SUBSET_MAX)
+ return true;
+
+ int subIndex = _entries[index]._entries._count++;
+ _entries[index]._entries._mode[subIndex] = mode;
+ _entries[index]._entries._frameIndex[subIndex] = frameIndex;
+ _entries[index]._entries._trigger[subIndex] = trigger;
+
+ return false;
+}
+
+int SequenceList::add(int spriteListIndex, bool flipped, int frameIndex, int triggerCountdown, int delayTicks, int extraTicks, int numTicks,
+ int msgX, int msgY, bool nonFixed, int scale, int depth, int frameInc, SpriteAnimType animType, int numSprites,
+ int frameStart) {
+ Scene &scene = _vm->_game->_scene;
+
+ // Find a free slot
+ uint seqIndex = 0;
+ while ((seqIndex < _entries.size()) && _entries[seqIndex]._active)
+ ++seqIndex;
+ if (seqIndex == _entries.size())
+ error("TimerList full");
+
+ if (frameStart <= 0)
+ frameStart = 1;
+ if (numSprites == 0)
+ numSprites = scene._sprites[spriteListIndex]->getCount();
+ if (frameStart == numSprites)
+ frameInc = 0;
+
+ // Set the list entry fields
+ _entries[seqIndex]._active = true;
+ _entries[seqIndex]._spritesIndex = spriteListIndex;
+ _entries[seqIndex]._flipped = flipped;
+ _entries[seqIndex]._frameIndex = frameIndex;
+ _entries[seqIndex]._frameStart = frameStart;
+ _entries[seqIndex]._numSprites = numSprites;
+ _entries[seqIndex]._animType = animType;
+ _entries[seqIndex]._frameInc = frameInc;
+ _entries[seqIndex]._depth = depth;
+ _entries[seqIndex]._scale = scale;
+ _entries[seqIndex]._nonFixed = nonFixed;
+ _entries[seqIndex]._position.x = msgX;
+ _entries[seqIndex]._position.y = msgY;
+ _entries[seqIndex]._numTicks = numTicks;
+ _entries[seqIndex]._extraTicks = extraTicks;
+
+ _entries[seqIndex]._timeout = scene._frameStartTime + delayTicks;
+
+ _entries[seqIndex]._triggerCountdown = triggerCountdown;
+ _entries[seqIndex]._doneFlag = false;
+ _entries[seqIndex]._flags = 0;
+ _entries[seqIndex]._dynamicHotspotIndex = -1;
+ _entries[seqIndex]._entries._count = 0;
+ _entries[seqIndex]._triggerMode = _vm->_game->_triggerSetupMode;
+
+ _entries[seqIndex]._actionNouns = _vm->_game->_scene._action._activeAction;
+
+ return seqIndex;
+}
+
+int SequenceList::addTimer(int timeout, int abortVal) {
+ Scene &scene = _vm->_game->_scene;
+ uint seqIndex;
+ for (seqIndex = 0; seqIndex < _entries.size(); ++seqIndex) {
+ if (!_entries[seqIndex]._active)
+ break;
+ }
+ assert(seqIndex < _entries.size());
+
+ SequenceEntry &se = _entries[seqIndex];
+ se._active = true;
+ se._spritesIndex = -1;
+ se._numTicks = timeout;
+ se._extraTicks = 0;
+ se._timeout = scene._frameStartTime + timeout;
+ se._triggerCountdown = true;
+ se._doneFlag = false;
+ se._entries._count = 0;
+ se._triggerMode = _vm->_game->_triggerSetupMode;
+ se._actionNouns = _vm->_game->_scene._action._activeAction;
+ addSubEntry(seqIndex, SEQUENCE_TRIGGER_EXPIRE, 0, abortVal);
+
+ return seqIndex;
+}
+
+void SequenceList::remove(int seqIndex) {
+ Scene &scene = _vm->_game->_scene;
+
+ if (_entries[seqIndex]._active) {
+ if (_entries[seqIndex]._dynamicHotspotIndex >= 0)
+ scene._dynamicHotspots.remove(_entries[seqIndex]._dynamicHotspotIndex);
+ }
+
+ _entries[seqIndex]._active = false;
+ scene._spriteSlots.deleteTimer(seqIndex);
+}
+
+void SequenceList::setSpriteSlot(int seqIndex, SpriteSlot &spriteSlot) {
+ Scene &scene = _vm->_game->_scene;
+ SequenceEntry &timerEntry = _entries[seqIndex];
+ SpriteAsset &spriteSet = *scene._sprites[timerEntry._spritesIndex];
+
+ spriteSlot._flags = spriteSet.isBackground() ? IMG_DELTA : IMG_UPDATE;
+ spriteSlot._seqIndex = seqIndex;
+ spriteSlot._spritesIndex = timerEntry._spritesIndex;
+ spriteSlot._frameNumber = timerEntry._flipped ? -timerEntry._frameIndex : timerEntry._frameIndex;
+ spriteSlot._depth = timerEntry._depth;
+ spriteSlot._scale = timerEntry._scale;
+
+ if (!timerEntry._nonFixed) {
+ spriteSlot._position = timerEntry._position;
+ } else {
+ MSprite *sprite = spriteSet.getFrame(timerEntry._frameIndex - 1);
+ spriteSlot._position = sprite->_offset;
+ }
+}
+
+bool SequenceList::loadSprites(int seqIndex) {
+ Scene &scene = _vm->_game->_scene;
+ SequenceEntry &seqEntry = _entries[seqIndex];
+ int slotIndex;
+ bool result = false;
+ int idx = -1;
+
+ scene._spriteSlots.deleteTimer(seqIndex);
+ if (seqEntry._doneFlag) {
+ remove(seqIndex);
+ return false;
+ }
+
+ if (seqEntry._spritesIndex == -1) {
+ // Doesn't have an associated sprite anymore, so mark as done
+ seqEntry._doneFlag = true;
+ } else if ((slotIndex = scene._spriteSlots.add()) >= 0) {
+ SpriteSlot &spriteSlot = scene._spriteSlots[slotIndex];
+ setSpriteSlot(seqIndex, spriteSlot);
+
+ if ((seqEntry._flags != 0) || (seqEntry._dynamicHotspotIndex >= 0)) {
+ SpriteAsset &spriteSet = *scene._sprites[seqEntry._spritesIndex];
+ MSprite *frame = spriteSet.getFrame(seqEntry._frameIndex - 1);
+ int width = frame->getWidth() * seqEntry._scale / 200;
+ int height = frame->getHeight() * seqEntry._scale / 100;
+ Common::Point pt = spriteSlot._position;
+
+ // Handle sprite movement, if present
+ if (seqEntry._flags & 1) {
+ seqEntry._posAccum.x += seqEntry._posDiff.x;
+ if (seqEntry._posAccum.x >= 100) {
+ int v = seqEntry._posAccum.x / 100;
+ seqEntry._position.x += v * seqEntry._posSign.x;
+ seqEntry._posAccum.x -= v * 100;
+ }
+
+ seqEntry._posAccum.y += seqEntry._posDiff.y;
+ if (seqEntry._posAccum.y >= 100) {
+ int v = seqEntry._posAccum.y / 100;
+ seqEntry._position.y += v * seqEntry._posSign.y;
+ seqEntry._posAccum.y -= v * 100;
+ }
+ }
+
+ if (seqEntry._flags & 2) {
+ // Check for object having moved off-scren
+ if ((pt.x + width) < 0 || (pt.x + width) >= MADS_SCREEN_WIDTH ||
+ pt.y < 0 || (pt.y - height) >= MADS_SCENE_HEIGHT) {
+ result = true;
+ seqEntry._doneFlag = true;
+ }
+ }
+
+ if (seqEntry._dynamicHotspotIndex >= 0) {
+ DynamicHotspot &dynHotspot = scene._dynamicHotspots[seqEntry._dynamicHotspotIndex];
+
+ dynHotspot._bounds.left = MAX(pt.x - width, 0);
+ dynHotspot._bounds.top = MAX(pt.y - height, 0);
+ dynHotspot._bounds.right = dynHotspot._bounds.left + width + 1;
+ dynHotspot._bounds.bottom = dynHotspot._bounds.top + height + 1;
+
+ scene._dynamicHotspots._changed = true;
+ }
+ }
+
+ // Frame adjustments
+ if (seqEntry._frameStart != seqEntry._numSprites)
+ seqEntry._frameIndex += seqEntry._frameInc;
+
+ if (seqEntry._frameIndex >= seqEntry._frameStart) {
+ if (seqEntry._frameIndex > seqEntry._numSprites) {
+ result = true;
+ if (seqEntry._animType == ANIMTYPE_CYCLED) {
+ // back to the starting frame (cyclic)
+ seqEntry._frameIndex = seqEntry._frameStart;
+ } else {
+ // Switch into reverse mode
+ seqEntry._frameIndex = seqEntry._numSprites - 1;
+ seqEntry._frameInc = -1;
+ }
+ }
+ } else {
+ // Currently in reverse mode and moved past starting frame
+ result = true;
+
+ if (seqEntry._animType == ANIMTYPE_CYCLED)
+ {
+ // Switch back to forward direction again
+ seqEntry._frameIndex = seqEntry._frameStart + 1;
+ seqEntry._frameInc = 1;
+ } else {
+ // Otherwise reset back to last sprite for further reverse animating
+ seqEntry._frameIndex = seqEntry._numSprites;
+ }
+ }
+
+ if (result && (seqEntry._triggerCountdown != 0)) {
+ if (--seqEntry._triggerCountdown == 0)
+ seqEntry._doneFlag = true;
+ }
+ } else {
+ // Out of sprite display slots, so mark entry as done
+ seqEntry._doneFlag = true;
+ }
+
+ for (int i = 0; i < seqEntry._entries._count; ++i) {
+ switch (seqEntry._entries._mode[i]) {
+ case SEQUENCE_TRIGGER_EXPIRE:
+ case SEQUENCE_TRIGGER_LOOP:
+ if (((seqEntry._entries._mode[i] == SEQUENCE_TRIGGER_EXPIRE) && seqEntry._doneFlag) ||
+ ((seqEntry._entries._mode[i] == SEQUENCE_TRIGGER_LOOP) && result))
+ idx = i;
+ break;
+
+ case SEQUENCE_TRIGGER_SPRITE: {
+ int v = seqEntry._entries._frameIndex[i];
+ if ((v == seqEntry._frameIndex) || (v == 0))
+ idx = i;
+ break;
+ }
+
+ default:
+ break;
+ }
+ }
+
+ if (idx >= 0) {
+ _vm->_game->_trigger = seqEntry._entries._trigger[idx];
+ _vm->_game->_triggerMode = seqEntry._triggerMode;
+
+ if (seqEntry._triggerMode != SEQUENCE_TRIGGER_DAEMON)
+ scene._action._activeAction = seqEntry._actionNouns;
+ }
+
+ return result;
+}
+
+/**
+* Handles counting down entries in the timer list for action
+*/
+void SequenceList::tick() {
+ Scene &scene = _vm->_game->_scene;
+ for (uint idx = 0; idx < _entries.size(); ++idx) {
+ if ((_vm->_game->_fx == 0) && (_vm->_game->_trigger != 0))
+ break;
+
+ SequenceEntry &seqEntry = _entries[idx];
+ uint32 currentTimer = scene._frameStartTime;
+
+ if (!seqEntry._active || (currentTimer < seqEntry._timeout))
+ continue;
+
+ // Set the next timeout for the timer entry
+ seqEntry._timeout = currentTimer + seqEntry._numTicks;
+
+ // Action the sprite
+ if (loadSprites(idx)) {
+ seqEntry._timeout += seqEntry._extraTicks;
+ }
+ }
+}
+
+void SequenceList::delay(uint32 priorFrameTime, uint32 currentTime) {
+ for (uint idx = 0; idx < _entries.size(); ++idx) {
+ if (_entries[idx]._active) {
+ _entries[idx]._timeout += currentTime - priorFrameTime;
+ }
+ }
+}
+
+void SequenceList::setAnimRange(int seqIndex, int startVal, int endVal) {
+ Scene &scene = _vm->_game->_scene;
+ SequenceEntry &seqEntry = _entries[seqIndex];
+ SpriteAsset &spriteSet = *scene._sprites[seqEntry._spritesIndex];
+ int numSprites = spriteSet.getCount();
+ int tempStart, tempEnd;
+
+ switch (startVal) {
+ case -2:
+ tempStart = numSprites;
+ break;
+ case -1:
+ tempStart = 1;
+ break;
+ default:
+ tempStart = startVal;
+ break;
+ }
+
+ switch (endVal) {
+ case -2:
+ case 0:
+ tempEnd = numSprites;
+ break;
+ case -1:
+ tempEnd = 1;
+ break;
+ default:
+ tempEnd = endVal;
+ break;
+ }
+
+ seqEntry._frameStart = tempStart;
+ seqEntry._numSprites = tempEnd;
+
+ seqEntry._frameIndex = (seqEntry._frameInc >= 0) ? tempStart : tempEnd;
+}
+
+void SequenceList::scan() {
+ Scene &scene = _vm->_game->_scene;
+
+ for (uint i = 0; i < _entries.size(); ++i) {
+ if (_entries[i]._active && (_entries[i]._spritesIndex != -1)) {
+ int idx = scene._spriteSlots.add();
+ setSpriteSlot(i, scene._spriteSlots[idx]);
+ }
+ }
+}
+
+/**
+* Sets the depth of the specified entry in the sequence list
+*/
+void SequenceList::setDepth(int seqIndex, int depth) {
+ _entries[seqIndex]._depth = depth;
+}
+
+void SequenceList::setPosition(int seqIndex, const Common::Point &pt) {
+ _entries[seqIndex]._position = pt;
+ _entries[seqIndex]._nonFixed = false;
+}
+
+int SequenceList::addSpriteCycle(int srcSpriteIdx, bool flipped, int numTicks, int triggerCountdown, int timeoutTicks, int extraTicks) {
+ Scene &scene = _vm->_game->_scene;
+ MSprite *spriteFrame = scene._sprites[srcSpriteIdx]->getFrame(0);
+ int depth = scene._depthSurface.getDepth(Common::Point(
+ spriteFrame->_offset.x + (spriteFrame->w / 2),
+ spriteFrame->_offset.y + (spriteFrame->h / 2)));
+
+ return add(srcSpriteIdx, flipped, 1, triggerCountdown, timeoutTicks, extraTicks, numTicks, 0, 0,
+ true, 100, depth - 1, 1, ANIMTYPE_CYCLED, 0, 0);
+}
+
+int SequenceList::addReverseSpriteCycle(int srcSpriteIdx, bool flipped, int numTicks,
+ int triggerCountdown, int timeoutTicks, int extraTicks) {
+ Scene &scene = _vm->_game->_scene;
+
+ SpriteAsset *asset = scene._sprites[srcSpriteIdx];
+ MSprite *spriteFrame = asset->getFrame(0);
+ int depth = scene._depthSurface.getDepth(Common::Point(
+ spriteFrame->_offset.x + (spriteFrame->w / 2),
+ spriteFrame->_offset.y + (spriteFrame->h / 2)));
+
+ return add(srcSpriteIdx, flipped, asset->getCount(), triggerCountdown, timeoutTicks, extraTicks,
+ numTicks, 0, 0, true, 100, depth - 1, -1, ANIMTYPE_CYCLED, 0, 0);
+}
+
+
+int SequenceList::startCycle(int srcSpriteIndex, bool flipped, int cycleIndex) {
+ int result = addSpriteCycle(srcSpriteIndex, flipped, INDEFINITE_TIMEOUT, 0, 0, 0);
+ if (result >= 0)
+ setAnimRange(result, cycleIndex, cycleIndex);
+
+ return result;
+}
+
+int SequenceList::startReverseCycle(int srcSpriteIndex, bool flipped, int numTicks,
+ int triggerCountdown, int timeoutTicks, int extraTicks) {
+ SpriteAsset *sprites = _vm->_game->_scene._sprites[srcSpriteIndex];
+ MSprite *frame = sprites->getFrame(0);
+ int depth = _vm->_game->_scene._depthSurface.getDepth(Common::Point(
+ frame->_offset.x + frame->w / 2, frame->_offset.y + frame->h / 2));
+
+ return add(srcSpriteIndex, flipped, sprites->getCount(), triggerCountdown, timeoutTicks,
+ extraTicks, numTicks, 0, 0, true, 100, depth - 1, -1, ANIMTYPE_REVERSIBLE, 0, 0);
+}
+
+void SequenceList::updateTimeout(int spriteIdx, int seqIndex) {
+ Player &player = _vm->_game->_player;
+ int timeout;
+
+ if (spriteIdx >= 0)
+ timeout = _entries[spriteIdx]._timeout;
+ else
+ timeout = player._priorTimer + player._ticksAmount;
+
+ if (seqIndex >= 0)
+ _entries[seqIndex]._timeout = timeout;
+ else
+ player._priorTimer = timeout - player._ticksAmount;
+
+}
+
+void SequenceList::setScale(int spriteIdx, int scale) {
+ _entries[spriteIdx]._scale = scale;
+}
+
+void SequenceList::setMsgLayout(int seqIndex) {
+ Player &player = _vm->_game->_player;
+ int yp = player._playerPos.y + (player._centerOfGravity * player._currentScale) / 100;
+ setPosition(seqIndex, Common::Point(player._playerPos.x, yp));
+ setDepth(seqIndex, player._currentDepth);
+ setScale(seqIndex, player._currentScale);
+ updateTimeout(-1, seqIndex);
+}
+
+void SequenceList::setDone(int seqIndex) {
+ _entries[seqIndex]._doneFlag = true;
+ _entries[seqIndex]._timeout = _vm->_game->_player._priorTimer;
+}
+
+void SequenceList::setMotion(int seqIndex, int flags, int deltaX, int deltaY) {
+ SequenceEntry &se = _entries[seqIndex];
+ se._flags = flags | 1;
+
+ // Set the direction sign for movement
+ if (deltaX > 0) {
+ se._posSign.x = 1;
+ } else if (deltaX < 0) {
+ se._posSign.x = -1;
+ } else {
+ se._posSign.x = 0;
+ }
+
+ if (deltaY > 0) {
+ se._posSign.y = 1;
+ }
+ else if (deltaY < 0) {
+ se._posSign.y = -1;
+ } else {
+ se._posSign.y = 0;
+ }
+
+ se._posDiff.x = ABS(deltaX);
+ se._posDiff.y = ABS(deltaY);
+ se._posAccum.x = se._posAccum.y = 0;
+}
+
+} // End of namespace
diff --git a/engines/mads/sequence.h b/engines/mads/sequence.h
new file mode 100644
index 0000000000..ee587ff02d
--- /dev/null
+++ b/engines/mads/sequence.h
@@ -0,0 +1,131 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+
+ * You should have received a copy of the GNU General Public 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 MADS_SEQUENCE_H
+#define MADS_SEQUENCE_H
+
+#include "common/scummsys.h"
+#include "common/array.h"
+#include "common/rect.h"
+#include "mads/action.h"
+
+namespace MADS {
+
+class SpriteSlot;
+
+enum SequenceTrigger {
+ SEQUENCE_TRIGGER_EXPIRE = 0, // Trigger when the sequence finishes
+ SEQUENCE_TRIGGER_LOOP = 1, // Trigger when the sequence loops
+ SEQUENCE_TRIGGER_SPRITE = 2 // Trigger when sequence reaches specific sprite
+};
+
+enum SpriteAnimType { ANIMTYPE_NONE = 0, ANIMTYPE_CYCLED = 1, ANIMTYPE_REVERSIBLE = 2 };
+
+#define SEQUENCE_ENTRY_SUBSET_MAX 5
+
+struct SequenceSubEntries {
+ int _count;
+ SequenceTrigger _mode[SEQUENCE_ENTRY_SUBSET_MAX];
+ int _frameIndex[SEQUENCE_ENTRY_SUBSET_MAX];
+ int _trigger[SEQUENCE_ENTRY_SUBSET_MAX];
+};
+
+struct SequenceEntry {
+ bool _active;
+ int8 _spritesIndex;
+ bool _flipped;
+
+ int _frameIndex;
+ int _frameStart;
+ int _numSprites;
+
+ SpriteAnimType _animType;
+ int _frameInc;
+
+ int _depth;
+ int _scale;
+ int _dynamicHotspotIndex;
+
+ bool _nonFixed;
+ uint32 _flags;
+
+ Common::Point _position;
+ Common::Point _posDiff;
+ Common::Point _posSign;
+ Common::Point _posAccum;
+ int _triggerCountdown;
+ bool _doneFlag;
+ SequenceSubEntries _entries;
+ TriggerMode _triggerMode;
+
+ ActionDetails _actionNouns;
+ int _numTicks;
+ int _extraTicks;
+ uint32 _timeout;
+
+ SequenceEntry();
+};
+
+class MADSEngine;
+
+class SequenceList {
+private:
+ MADSEngine *_vm;
+ Common::Array<SequenceEntry> _entries;
+public:
+ SequenceList(MADSEngine *vm);
+
+ SequenceEntry &operator[](int index) { return _entries[index]; }
+ void clear();
+ bool addSubEntry(int index, SequenceTrigger mode, int frameIndex, int trigger);
+ int add(int spriteListIndex, bool flipped, int frameIndex, int triggerCountdown, int delayTicks,
+ int extraTicks, int numTicks, int msgX, int msgY, bool nonFixed, int scale, int depth,
+ int frameInc, SpriteAnimType animType, int numSprites, int frameStart);
+
+ int addTimer(int timeout, int abortVal);
+ void remove(int seqIndex);
+ void setSpriteSlot(int seqIndex, SpriteSlot &spriteSlot);
+ bool loadSprites(int seqIndex);
+ void tick();
+ void delay(uint32 priorFrameTime, uint32 currentTime);
+ void setAnimRange(int seqIndex, int startVal, int endVal);
+ void scan();
+ void setDepth(int seqIndex, int depth);
+ void setPosition(int seqIndex, const Common::Point &pt);
+ int addSpriteCycle(int srcSpriteIdx, bool flipped, int numTicks,
+ int triggerCountdown = 0, int timeoutTicks = 0, int extraTicks = 0);
+ int addReverseSpriteCycle(int srcSpriteIdx, bool flipped, int numTicks,
+ int triggerCountdown = 0, int timeoutTicks = 0, int extraTicks = 0);
+
+ int startCycle(int srcSpriteIdx, bool flipped, int cycleIndex);
+ int startReverseCycle(int srcSpriteIndex, bool flipped, int numTicks,
+ int triggerCountdown = 0, int timeoutTicks = 0, int extraTicks = 0);
+ void updateTimeout(int spriteIdx, int seqIndex);
+ void setScale(int spriteIdx, int scale);
+ void setMsgLayout(int seqIndex);
+ void setDone(int seqIndex);
+ void setMotion(int seqIndex, int flags, int deltaX, int deltaY);
+};
+
+} // End of namespace MADS
+
+#endif /* MADS_SEQUENCE_H */
diff --git a/engines/mads/sound.cpp b/engines/mads/sound.cpp
new file mode 100644
index 0000000000..bd99aed2f4
--- /dev/null
+++ b/engines/mads/sound.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 "audio/audiostream.h"
+#include "audio/decoders/raw.h"
+#include "common/memstream.h"
+#include "mads/sound.h"
+#include "mads/mads.h"
+#include "mads/nebular/sound_nebular.h"
+
+namespace MADS {
+
+SoundManager::SoundManager(MADSEngine *vm, Audio::Mixer *mixer) {
+ _vm = vm;
+ _mixer = mixer;
+ _driver = nullptr;
+ _pollSoundEnabled = false;
+ _soundPollFlag = false;
+ _newSoundsPaused = false;
+}
+
+SoundManager::~SoundManager() {
+ delete _driver;
+}
+
+void SoundManager::init(int sectionNumber) {
+ assert(sectionNumber > 0 && sectionNumber < 10);
+
+ switch (_vm->getGameID()) {
+ case GType_RexNebular:
+ switch (sectionNumber) {
+ case 1:
+ _driver = new Nebular::ASound1(_mixer);
+ break;
+ case 2:
+ _driver = new Nebular::ASound2(_mixer);
+ break;
+ case 3:
+ _driver = new Nebular::ASound3(_mixer);
+ break;
+ case 4:
+ _driver = new Nebular::ASound4(_mixer);
+ break;
+ case 5:
+ _driver = new Nebular::ASound5(_mixer);
+ break;
+ case 6:
+ _driver = new Nebular::ASound6(_mixer);
+ break;
+ case 7:
+ _driver = new Nebular::ASound7(_mixer);
+ break;
+ case 8:
+ _driver = new Nebular::ASound8(_mixer);
+ break;
+ case 9:
+ error("Sound driver 9 not implemented");
+ default:
+ _driver = nullptr;
+ break;
+ }
+ break;
+
+ default:
+ warning("SoundManager: Unknown game");
+ _driver = nullptr;
+ break;
+ }
+}
+
+void SoundManager::closeDriver() {
+ if (_driver) {
+ command(0);
+ setEnabled(false);
+ stop();
+
+ removeDriver();
+ }
+}
+
+void SoundManager::removeDriver() {
+ delete _driver;
+ _driver = nullptr;
+}
+
+void SoundManager::setEnabled(bool flag) {
+ _pollSoundEnabled = flag;
+ _soundPollFlag = false;
+}
+
+void SoundManager::pauseNewCommands() {
+ _newSoundsPaused = true;
+}
+
+void SoundManager::startQueuedCommands() {
+ _newSoundsPaused = false;
+
+ while (!_queuedCommands.empty()) {
+ int commandId = _queuedCommands.pop();
+ command(commandId);
+ }
+}
+
+void SoundManager::command(int commandId, int param) {
+ if (_newSoundsPaused) {
+ if (_queuedCommands.size() < 8)
+ _queuedCommands.push(commandId);
+ } else if (_driver) {
+ _driver->command(commandId, param);
+ }
+}
+
+void SoundManager::stop() {
+ if (_driver)
+ _driver->stop();
+}
+
+void SoundManager::noise() {
+ if (_driver)
+ _driver->noise();
+}
+
+} // End of namespace MADS
diff --git a/engines/mads/sound.h b/engines/mads/sound.h
new file mode 100644
index 0000000000..9a251f9dd0
--- /dev/null
+++ b/engines/mads/sound.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 MADS_SOUND_H
+#define MADS_SOUND_H
+
+#include "common/scummsys.h"
+#include "common/queue.h"
+#include "audio/audiostream.h"
+#include "audio/mixer.h"
+#include "mads/nebular/sound_nebular.h"
+
+namespace MADS {
+
+class MADSEngine;
+
+class SoundManager {
+private:
+ MADSEngine *_vm;
+ Audio::Mixer *_mixer;
+ Nebular::ASound *_driver;
+ bool _pollSoundEnabled;
+ bool _soundPollFlag;
+ bool _newSoundsPaused;
+ Common::Queue<int> _queuedCommands;
+public:
+ SoundManager(MADSEngine *vm, Audio::Mixer *mixer);
+ ~SoundManager();
+
+ /**
+ * Initializes the sound driver for a given game section
+ */
+ void init(int sectionNumber);
+
+ /**
+ * Stop any currently active sound and remove the driver
+ */
+ void closeDriver();
+
+ /**
+ * Remove the driver
+ */
+ void removeDriver();
+
+ /**
+ * Sets the enabled status of the sound
+ * @flag True if sound should be enabled
+ */
+ void setEnabled(bool flag);
+
+ /**
+ * Temporarily pause the playback of any new sound commands
+ */
+ void pauseNewCommands();
+
+ /**
+ * Stop queueing sound commands, and execute any previously queued ones
+ */
+ void startQueuedCommands();
+
+ //@{
+ /**
+ * Executes a command on the sound driver
+ * @param commandid Command Id to execute
+ * @param param Optional paramater specific to a few commands
+ */
+ void command(int commandId, int param = 0);
+
+ /**
+ * Stops any currently playing sound
+ */
+ void stop();
+
+ /**
+ * Noise
+ * Some sort of random noise generation?
+ */
+ void noise();
+ //@}
+};
+
+} // End of namespace MADS
+
+#endif /* MADS_SOUND_H */
diff --git a/engines/mads/sprites.cpp b/engines/mads/sprites.cpp
new file mode 100644
index 0000000000..cd358077b5
--- /dev/null
+++ b/engines/mads/sprites.cpp
@@ -0,0 +1,417 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+
+ * You should have received a copy of the GNU General Public 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 "engines/util.h"
+#include "graphics/palette.h"
+#include "mads/mads.h"
+#include "mads/screen.h"
+#include "mads/msurface.h"
+#include "mads/sprites.h"
+
+namespace MADS {
+
+enum {
+ kEndOfLine = 0,
+ kEndOfSprite = 1,
+ kMarker = 2
+};
+
+#define TRANSPARENT_COLOR_INDEX 0xFF
+
+class DepthEntry {
+public:
+ int depth;
+ int index;
+
+ DepthEntry(int depthAmt, int indexVal) { depth = depthAmt; index = indexVal; }
+};
+
+bool sortHelper(const DepthEntry &entry1, const DepthEntry &entry2) {
+ return entry1.depth < entry2.depth;
+}
+
+typedef Common::List<DepthEntry> DepthList;
+
+/*------------------------------------------------------------------------*/
+
+MSprite::MSprite() : MSurface() {
+ _transparencyIndex = TRANSPARENT_COLOR_INDEX;
+}
+
+MSprite::MSprite(Common::SeekableReadStream *source, const Common::Array<RGB6> &palette,
+ const Common::Rect &bounds)
+ : MSurface(bounds.width(), bounds.height()),
+ _offset(Common::Point(bounds.left, bounds.top)), _transparencyIndex(TRANSPARENT_COLOR_INDEX) {
+ // Load the sprite data
+ loadSprite(source, palette);
+}
+
+MSprite::~MSprite() {
+}
+
+void MSprite::loadSprite(Common::SeekableReadStream *source,
+ const Common::Array<RGB6> &palette) {
+ byte *outp, *lineStart;
+ bool newLine = false;
+
+ outp = getData();
+ lineStart = getData();
+ int spriteSize = this->w * this->h;
+ byte transIndex = getTransparencyIndex();
+ Common::fill(outp, outp + spriteSize, transIndex);
+
+ for (;;) {
+ byte cmd1, cmd2, count, pixel;
+
+ if (newLine) {
+ outp = lineStart + getWidth();
+ lineStart = outp;
+ newLine = false;
+ }
+
+ cmd1 = source->readByte();
+
+ if (cmd1 == 0xFC)
+ break;
+ else if (cmd1 == 0xFF)
+ newLine = true;
+ else if (cmd1 == 0xFD) {
+ while (!newLine) {
+ count = source->readByte();
+ if (count == 0xFF) {
+ newLine = true;
+ } else {
+ pixel = source->readByte();
+ while (count--)
+ *outp++ = (pixel == 0xFD) ? getTransparencyIndex() : pixel;
+ }
+ }
+ } else {
+ while (!newLine) {
+ cmd2 = source->readByte();
+ if (cmd2 == 0xFF) {
+ newLine = true;
+ } else if (cmd2 == 0xFE) {
+ count = source->readByte();
+ pixel = source->readByte();
+ while (count--)
+ *outp++ = (pixel == 0xFD) ? getTransparencyIndex() : pixel;
+ } else {
+ *outp++ = (cmd2 == 0xFD) ? getTransparencyIndex() : cmd2;
+ }
+ }
+ }
+ }
+
+ // Do a final iteration over the sprite to convert it's pixels to
+ // the final positions in the main palette
+ spriteSize = this->w * this->h;
+ for (outp = getData(); spriteSize > 0; --spriteSize, ++outp) {
+ if (*outp != transIndex)
+ *outp = palette[*outp]._palIndex;
+ }
+}
+
+byte MSprite::getTransparencyIndex() const {
+ return _transparencyIndex;
+}
+
+/*------------------------------------------------------------------------*/
+
+MADSEngine *SpriteSlot::_vm = nullptr;
+
+SpriteSlot::SpriteSlot() {
+ _flags = IMG_STATIC;
+ _seqIndex = 0;
+ _spritesIndex = 0;
+ _frameNumber = 0;
+ _depth = 0;
+ _scale = 0;
+}
+
+SpriteSlot::SpriteSlot(SpriteFlags type, int seqIndex) {
+ _flags = type;
+ _seqIndex = seqIndex;
+ _spritesIndex = 0;
+ _frameNumber = 0;
+ _depth = 0;
+ _scale = 0;
+}
+
+bool SpriteSlot::operator==(const SpriteSlotSubset &other) const {
+ return (_spritesIndex == other._spritesIndex) && (_frameNumber == other._frameNumber) &&
+ (_position == other._position) && (_depth == other._depth) &&
+ (_scale == other._scale);
+}
+
+void SpriteSlot::copy(const SpriteSlotSubset &other) {
+ _spritesIndex = other._spritesIndex;
+ _frameNumber = other._frameNumber;
+ _position = other._position;
+ _depth = other._depth;
+ _scale = other._scale;
+}
+
+/*------------------------------------------------------------------------*/
+
+SpriteSlots::SpriteSlots(MADSEngine *vm) : _vm(vm) {
+ SpriteSlot::_vm = vm;
+}
+
+void SpriteSlots::reset(bool flag) {
+ _vm->_game->_scene._textDisplay.reset();
+
+ if (flag)
+ _vm->_game->_scene._sprites.clear();
+
+ Common::Array<SpriteSlot>::clear();
+ push_back(SpriteSlot(IMG_REFRESH, -1));
+}
+
+void SpriteSlots::deleteEntry(int index) {
+ remove_at(index);
+}
+
+void SpriteSlots::setDirtyAreas() {
+ Scene &scene = _vm->_game->_scene;
+
+ for (uint i = 0; i < size(); ++i) {
+ if ((*this)[i]._flags >= IMG_STATIC) {
+ scene._dirtyAreas[i].setSpriteSlot(&(*this)[i]);
+
+ scene._dirtyAreas[i]._textActive = ((*this)[i]._flags <= IMG_STATIC) ? 0 : 1;
+ (*this)[i]._flags = IMG_STATIC;
+ }
+ }
+}
+
+void SpriteSlots::fullRefresh(bool clearAll) {
+ if (clearAll)
+ Common::Array<SpriteSlot>::clear();
+
+ push_back(SpriteSlot(IMG_REFRESH, -1));
+}
+
+void SpriteSlots::deleteTimer(int seqIndex) {
+ for (uint idx = 0; idx < size(); ++idx) {
+ SpriteSlot &slot = (*this)[idx];
+ if (slot._seqIndex == seqIndex) {
+ slot._flags = IMG_ERASE;
+ return;
+ }
+ }
+}
+
+int SpriteSlots::add() {
+ SpriteSlot ss;
+ push_back(ss);
+ return size() - 1;
+}
+
+void SpriteSlots::drawBackground() {
+ Scene &scene = _vm->_game->_scene;
+
+ // Initial draw loop for any active sprites in the background
+ for (uint i = 0; i < size(); ++i) {
+ SpriteSlot &spriteSlot = (*this)[i];
+ DirtyArea &dirtyArea = scene._dirtyAreas[i];
+
+ if (spriteSlot._flags >= IMG_STATIC) {
+ // Foreground sprite, so we can ignore it
+ dirtyArea._active = false;
+ } else {
+ dirtyArea._active = true;
+ dirtyArea.setSpriteSlot(&spriteSlot);
+
+ if (spriteSlot._flags == IMG_DELTA) {
+ // Background object, so need to draw it
+ assert(spriteSlot._frameNumber > 0);
+ SpriteAsset *asset = scene._sprites[spriteSlot._spritesIndex];
+ MSprite *frame = asset->getFrame(spriteSlot._frameNumber - 1);
+
+ Common::Point pt = spriteSlot._position;
+ if (spriteSlot._scale != -1) {
+ // Adjust the drawing position
+ pt.x -= frame->w / 2;
+ pt.y -= frame->h - 1;
+ }
+
+ if (spriteSlot._depth <= 1) {
+ frame->copyTo(&scene._backgroundSurface, pt, frame->getTransparencyIndex());
+ } else if (scene._depthStyle == 0) {
+ scene._backgroundSurface.copyFrom(frame, pt, spriteSlot._depth, &scene._depthSurface,
+ -1, false, frame->getTransparencyIndex());
+ } else {
+ error("Unsupported depth style");
+ }
+ }
+ }
+ }
+
+ // Mark any remaning sprite slot dirty areas as inactive
+ for (uint i = size(); i < SPRITE_SLOTS_MAX_SIZE; ++i)
+ scene._dirtyAreas[i]._active = false;
+
+ // Flag any active text display
+ for (uint i = 0; i < scene._textDisplay.size(); ++i) {
+ TextDisplay &textDisplay = scene._textDisplay[i];
+ DirtyArea &dirtyArea = scene._dirtyAreas[i + SPRITE_SLOTS_MAX_SIZE];
+
+ if (textDisplay._expire >= 0 || !textDisplay._active) {
+ dirtyArea._active = false;
+ } else {
+ dirtyArea._active = true;
+ dirtyArea.setTextDisplay(&textDisplay);
+ }
+ }
+}
+
+void SpriteSlots::drawSprites(MSurface *s) {
+ DepthList depthList;
+ Scene &scene = _vm->_game->_scene;
+
+ // Get a list of sprite object depths for active objects
+ for (uint i = 0; i < size(); ++i) {
+ SpriteSlot &spriteSlot = (*this)[i];
+ if (spriteSlot._flags >= IMG_STATIC) {
+ DepthEntry rec(16 - spriteSlot._depth, i);
+ depthList.push_back(rec);
+ }
+ }
+
+ // Sort the list in order of the depth
+ Common::sort(depthList.begin(), depthList.end(), sortHelper);
+
+ // Loop through each of the objects
+ DepthList::iterator i;
+ for (i = depthList.begin(); i != depthList.end(); ++i) {
+ DepthEntry &de = *i;
+ SpriteSlot &slot = (*this)[de.index];
+ assert(slot._spritesIndex < (int)scene._sprites.size());
+ SpriteAsset &spriteSet = *scene._sprites[slot._spritesIndex];
+
+ // Get the sprite frame
+ int frameNumber = ABS(slot._frameNumber);
+ bool flipped = slot._frameNumber < 0;
+
+ assert(frameNumber > 0);
+ MSprite *sprite = spriteSet.getFrame(frameNumber - 1);
+
+ if ((slot._scale < 100) && (slot._scale != -1)) {
+ // Scaled drawing
+ s->copyFrom(sprite, slot._position, slot._depth, &scene._depthSurface,
+ slot._scale, flipped, sprite->getTransparencyIndex());
+ } else {
+ int xp, yp;
+
+ if (slot._scale == -1) {
+ xp = slot._position.x - scene._posAdjust.x;
+ yp = slot._position.y - scene._posAdjust.y;
+ } else {
+ xp = slot._position.x - (sprite->w / 2) - scene._posAdjust.x;
+ yp = slot._position.y - sprite->h - scene._posAdjust.y + 1;
+ }
+
+ if (slot._depth > 1) {
+ // Draw the frame with depth processing
+ s->copyFrom(sprite, Common::Point(xp, yp), slot._depth, &scene._depthSurface,
+ -1, flipped, sprite->getTransparencyIndex());
+ } else {
+ MSurface *spr = sprite;
+ if (flipped) {
+ // Create a flipped copy of the sprite temporarily
+ spr = sprite->flipHorizontal();
+ }
+
+ // No depth, so simply draw the image
+ spr->copyTo(s, Common::Point(xp, yp), sprite->getTransparencyIndex());
+
+ // Free sprite if it was a flipped one
+ if (flipped)
+ delete spr;
+ }
+ }
+ }
+}
+
+void SpriteSlots::cleanUp() {
+ for (int i = (int)size() - 1; i >= 0; --i) {
+ if ((*this)[i]._flags < IMG_STATIC)
+ remove_at(i);
+ }
+}
+
+/*------------------------------------------------------------------------*/
+
+SpriteSets::~SpriteSets() {
+ clear();
+}
+
+int SpriteSets::add(SpriteAsset *asset, int idx) {
+ if (idx)
+ idx = idx + 49;
+ else
+ idx = size();
+
+ if (idx >= (int)size())
+ resize(idx + 1);
+
+ if ((*this)[idx]) {
+ delete (*this)[idx];
+ } else {
+ ++_assetCount;
+ }
+
+ (*this)[idx] = asset;
+ return idx;
+}
+
+int SpriteSets::addSprites(const Common::String &resName, int flags) {
+ return add(new SpriteAsset(_vm, resName, flags));
+}
+
+void SpriteSets::clear() {
+ for (uint i = 0; i < size(); ++i)
+ delete (*this)[i];
+
+ _assetCount = 0;
+ Common::Array<SpriteAsset *>::clear();
+}
+
+void SpriteSets::remove(int idx) {
+ if (idx >= 0) {
+ if (idx < ((int)size() - 1)) {
+ delete (*this)[idx];
+ (*this)[idx] = nullptr;
+ } else {
+ while (size() > 0 && (*this)[size() - 1] == nullptr) {
+ remove_at(size() - 1);
+ }
+ }
+
+ if (_assetCount > 0)
+ --_assetCount;
+ }
+}
+
+} // End of namespace MADS
diff --git a/engines/mads/sprites.h b/engines/mads/sprites.h
new file mode 100644
index 0000000000..6ea3c9e52e
--- /dev/null
+++ b/engines/mads/sprites.h
@@ -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.
+ *
+ */
+
+#ifndef MADS_SPRITES_H
+#define MADS_SPRITES_H
+
+#include "common/scummsys.h"
+#include "common/array.h"
+#include "mads/assets.h"
+#include "mads/msurface.h"
+
+namespace MADS {
+
+enum SpriteFlags {
+ IMG_STATIC = 0, // Item should remain fixed on the screen
+ IMG_UPDATE = 1, // Item needs to be redrawn
+ IMG_ERASE = -1, // Erase image and remove it
+ IMG_REFRESH = -2, // Full refresh
+ IMG_OVERPRINT = -3, // Interface overprint
+ IMG_DELTA = -4, // Delta change
+ IMG_FULL_UPDATE = -5, // Interface refresh
+ IMG_UPDATE_ONLY = -20 // Update the active screen area only
+};
+
+class MADSEngine;
+
+struct BGR8 {
+ uint8 b, g, r;
+};
+
+typedef struct {
+ int32 x; // x position relative to GrBuff(0, 0)
+ int32 y; // y position relative to GrBuff(0, 0)
+ int32 scale_x; // x scale factor (can be negative for reverse draw)
+ int32 scale_y; // y scale factor (can't be negative)
+ uint8* depth_map; // depth code array for destination (doesn't care if srcDepth is 0)
+ BGR8* Pal; // palette for shadow draw (doesn't care if SHADOW bit is not set in Src.encoding)
+ uint8* ICT; // Inverse Color Table (doesn't care if SHADOW bit is not set in Src.encoding)
+ uint8 depth; // depth code for source (0 if no depth processing)
+} DrawRequestX;
+
+typedef struct {
+ uint32 Pack;
+ uint32 Stream;
+ long hot_x;
+ long hot_y;
+ uint32 Width;
+ uint32 Height;
+ uint32 Comp;
+ uint32 Reserved[8];
+ uint8* data;
+} RendCell;
+
+#define SS_HEADER_NUM_FIELDS 14
+struct SpriteSeriesHeader {
+ uint32 header;
+ uint32 size;
+ uint32 packing;
+ uint32 frameRate;
+ uint32 pixSpeed;
+ uint32 maxWidth;
+ uint32 maxHeight;
+ uint32 reserved3;
+ uint32 reserved4;
+ uint32 reserved5;
+ uint32 reserved6;
+ uint32 reserved7;
+ uint32 reserved8;
+ uint32 count;
+};
+
+#define SF_HEADER_NUM_FIELDS 15
+struct SpriteFrameHeader {
+ uint32 pack;
+ uint32 stream;
+ uint32 x;
+ uint32 y;
+ uint32 width;
+ uint32 height;
+ uint32 comp;
+ uint32 reserved1;
+ uint32 reserved2;
+ uint32 reserved3;
+ uint32 reserved4;
+ uint32 reserved5;
+ uint32 reserved6;
+ uint32 reserved7;
+ uint32 reserved8;
+};
+
+class MSprite : public MSurface {
+private:
+ void loadSprite(Common::SeekableReadStream *source, const Common::Array<RGB6> &palette);
+public:
+ MSprite();
+ MSprite(Common::SeekableReadStream *source, const Common::Array<RGB6> &palette,
+ const Common::Rect &bounds);
+ virtual ~MSprite();
+
+ Common::Point _offset;
+ int _transparencyIndex;
+
+ byte getTransparencyIndex() const;
+};
+
+class SpriteSlotSubset {
+public:
+ int _spritesIndex;
+ int _frameNumber;
+ Common::Point _position;
+ int _depth;
+ int _scale;
+};
+
+class SpriteSlot : public SpriteSlotSubset {
+private:
+ static MADSEngine *_vm;
+ friend class SpriteSlots;
+public:
+ SpriteFlags _flags;
+ int _seqIndex;
+public:
+ SpriteSlot();
+ SpriteSlot(SpriteFlags type, int seqIndex);
+
+ void setup(int dirtyAreaIndex);
+ bool operator==(const SpriteSlotSubset &other) const;
+ void copy(const SpriteSlotSubset &other);
+};
+
+class SpriteSlots : public Common::Array<SpriteSlot> {
+private:
+ MADSEngine *_vm;
+public:
+ SpriteSlots(MADSEngine *vm);
+
+ /**
+ * Clears any pending slot data and schedules a full screen refresh.
+ * @param flag Also reset sprite list
+ */
+ void reset(bool flag = true);
+
+ /**
+ * Delete a sprite entry
+ * @param index Specifies the index in the array
+ */
+ void deleteEntry(int index);
+
+ /**
+ * Setup dirty areas for the sprite slots
+ */
+ void setDirtyAreas();
+
+ /**
+ * Adds a full screen refresh to the sprite slots
+ */
+ void fullRefresh(bool clearAll = false);
+
+ /**
+ * Delete a timer entry with the given Id
+ */
+ void deleteTimer(int seqIndex);
+
+ /**
+ * Add a new slot entry and return it's index
+ */
+ int add();
+
+ /**
+ * Draw any sprites into the background of the scene
+ */
+ void drawBackground();
+
+ /**
+ * Draw any sprites into the foreground of the scene
+ */
+ void drawSprites(MSurface *s);
+
+ void cleanUp();
+};
+
+class SpriteSets : public Common::Array<SpriteAsset *> {
+private:
+ MADSEngine *_vm;
+public:
+ int _assetCount;
+
+ /**
+ * Constructor
+ */
+ SpriteSets(MADSEngine *vm) : _vm(vm), _assetCount(0) {}
+
+ /**
+ * Destructor
+ */
+ ~SpriteSets();
+
+ /**
+ * Clears the current list, freeing any laoded assets
+ */
+ void clear();
+
+ /**
+ * Add a sprite asset to the list
+ */
+ int add(SpriteAsset *asset, int idx = 0);
+
+ /**
+ * Adds a sprite asset to the list by name
+ */
+ int addSprites(const Common::String &resName, int flags = 0);
+
+ /**
+ * Remove an asset from the list
+ */
+ void remove(int idx);
+};
+
+} // End of namespace MADS
+
+#endif /* MADS_SPRITES_H */
diff --git a/engines/mads/staticres.cpp b/engines/mads/staticres.cpp
new file mode 100644
index 0000000000..189e5f72e7
--- /dev/null
+++ b/engines/mads/staticres.cpp
@@ -0,0 +1,58 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ */
+
+#include "common/scummsys.h"
+#include "mads/staticres.h"
+
+namespace MADS {
+
+const char *const kArticleList[9] = {
+ nullptr, "with", "to", "at", "from", "on", "in", "under", "behind"
+};
+
+const char *const kCheatingEnabledDesc[3] = {
+ "CHEATING ENABLED",
+ "(For your convenience).",
+ nullptr
+};
+
+const char *const kLookAroundStr = "Look around";
+const char *const kToStr = "to ";
+const char *const kUseStr = "Use ";
+const char *const kWalkToStr = "Walk to ";
+const char *const kFenceStr = "fence";
+const char *const kOverStr = "over";
+
+const char *const kGameReleaseInfoStr = "ScummVM rev: 8.43 14-Sept-92";
+const char *const kGameReleaseTitleStr = "GAME RELASE VERSION INFO";
+
+const uint32 DEFAULT_VGA_LOW_PALETTE[16] = {
+ 0x000000, 0x0000a8, 0x00a800, 0x00a8a8, 0xa80000, 0xa800a8, 0xa85400, 0xa8a8a8,
+ 0x545454, 0x5454fc, 0x54fc54, 0x54fcfc, 0xfc5454, 0xfc54fc, 0xfcfc54, 0xfcfcfc
+};
+
+const uint32 DEFAULT_VGA_HIGH_PALETTE[16] = {
+ 0x2c402c, 0x2c4030, 0x2c4034, 0x2c403c, 0x2c4040, 0x2c3c40, 0x2c3440, 0x2c3040,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000
+};
+
+} // End of namespace MADS
diff --git a/engines/mads/staticres.h b/engines/mads/staticres.h
new file mode 100644
index 0000000000..560fd12e67
--- /dev/null
+++ b/engines/mads/staticres.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 MADS_STATICRES_H
+#define MADS_STATICRES_H
+
+namespace MADS {
+
+extern const char *const kArticleList[9];
+
+extern const char *const kCheatingEnabledDesc[3];
+
+extern const char *const kLookAroundStr;
+extern const char *const kToStr;
+extern const char *const kUseStr;
+extern const char *const kWalkToStr;
+extern const char *const kFenceStr;
+extern const char *const kOverStr;
+
+extern const char *const kGameReleaseInfoStr;
+extern const char *const kGameReleaseTitleStr;
+
+extern const uint32 DEFAULT_VGA_LOW_PALETTE[16];
+extern const uint32 DEFAULT_VGA_HIGH_PALETTE[16];
+
+} // End of namespace MADS
+
+#endif /* MADS_STATICRES_H */
diff --git a/engines/mads/user_interface.cpp b/engines/mads/user_interface.cpp
new file mode 100644
index 0000000000..1f8d5037bc
--- /dev/null
+++ b/engines/mads/user_interface.cpp
@@ -0,0 +1,1096 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+
+ * You should have received a copy of the GNU General Public 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 "mads/mads.h"
+#include "mads/compression.h"
+#include "mads/user_interface.h"
+#include "mads/nebular/game_nebular.h"
+
+namespace MADS {
+
+UISlot::UISlot() {
+ _flags = IMG_STATIC;
+ _segmentId = 0;
+ _spritesIndex = 0;
+ _frameNumber = 0;
+ _width = _height = 0;
+}
+
+/*------------------------------------------------------------------------*/
+
+void UISlots::fullRefresh() {
+ UISlot slot;
+ slot._flags = IMG_REFRESH;
+ slot._segmentId = -1;
+
+ push_back(slot);
+}
+
+void UISlots::add(const Common::Rect &bounds) {
+ assert(size() < 50);
+
+ UISlot ie;
+ ie._flags = IMG_OVERPRINT;
+ ie._segmentId = IMG_TEXT_UPDATE;
+ ie._position = Common::Point(bounds.left, bounds.top);
+ ie._width = bounds.width();
+ ie._height = bounds.height();
+
+ push_back(ie);
+}
+
+void UISlots::add(const AnimFrameEntry &frameEntry) {
+ assert(size() < 50);
+
+ UISlot ie;
+ ie._flags = IMG_UPDATE;
+ ie._segmentId = frameEntry._seqIndex;
+ ie._spritesIndex = frameEntry._spriteSlot._spritesIndex;
+ ie._frameNumber = frameEntry._spriteSlot._frameNumber;
+ ie._position = frameEntry._spriteSlot._position;
+
+ push_back(ie);
+}
+
+void UISlots::draw(bool updateFlag, bool delFlag) {
+ Scene &scene = _vm->_game->_scene;
+ UserInterface &userInterface = scene._userInterface;
+ DirtyArea *dirtyAreaPtr = nullptr;
+
+ // Loop through setting up the dirty areas
+ for (uint idx = 0; idx < size(); ++idx) {
+ DirtyArea &dirtyArea = userInterface._dirtyAreas[idx];
+ UISlot &slot = (*this)[idx];
+
+ if (slot._flags >= IMG_STATIC) {
+ dirtyArea._active = false;
+ } else {
+ dirtyArea.setUISlot(&slot);
+ dirtyArea._textActive = true;
+ if (slot._segmentId == IMG_SPINNING_OBJECT && slot._flags == IMG_FULL_UPDATE) {
+ dirtyArea._active = false;
+ dirtyAreaPtr = &dirtyArea;
+ }
+ }
+ }
+
+ userInterface._dirtyAreas.merge(1, userInterface._uiSlots.size());
+ if (dirtyAreaPtr)
+ dirtyAreaPtr->_active = true;
+
+ // Copy parts of the user interface background that need to be erased
+ for (uint idx = 0; idx < size(); ++idx) {
+ DirtyArea &dirtyArea = userInterface._dirtyAreas[idx];
+ UISlot &slot = (*this)[idx];
+
+ if (dirtyArea._active && dirtyArea._bounds.width() > 0
+ && dirtyArea._bounds.height() > 0 && slot._flags > -20) {
+
+ if (slot._flags >= IMG_ERASE) {
+ // Merge area
+ userInterface.mergeFrom(&userInterface._surface, dirtyArea._bounds,
+ Common::Point(dirtyArea._bounds.left, dirtyArea._bounds.top));
+ } else {
+ // Copy area
+ userInterface._surface.copyTo(&userInterface, dirtyArea._bounds,
+ Common::Point(dirtyArea._bounds.left, dirtyArea._bounds.top));
+ }
+ }
+ }
+
+ for (uint idx = 0; idx < size(); ++idx) {
+ DirtyArea &dirtyArea = userInterface._dirtyAreas[idx];
+ UISlot &slot = (*this)[idx];
+
+ int slotType = slot._flags;
+ if (slotType >= IMG_STATIC) {
+ dirtyArea.setUISlot(&slot);
+ if (!updateFlag)
+ slotType &= ~0x40;
+
+ dirtyArea._textActive = slotType > 0;
+ slot._flags &= 0x40;
+ }
+ }
+
+ userInterface._dirtyAreas.merge(1, userInterface._uiSlots.size());
+
+ for (uint idx = 0; idx < size(); ++idx) {
+ DirtyArea *dirtyArea = &userInterface._dirtyAreas[idx];
+ UISlot &slot = (*this)[idx];
+
+ if (slot._flags >= IMG_STATIC && !(slot._flags & 0x40)) {
+ if (!dirtyArea->_active) {
+ do {
+ dirtyArea = dirtyArea->_mergedArea;
+ } while (!dirtyArea->_active);
+ }
+
+ if (dirtyArea->_textActive) {
+ SpriteAsset *asset = scene._sprites[slot._spritesIndex];
+
+ // Get the frame details
+ int frameNumber = ABS(slot._frameNumber);
+ bool flipped = slot._frameNumber < 0;
+
+ if (slot._segmentId == IMG_SPINNING_OBJECT) {
+ MSprite *sprite = asset->getFrame(frameNumber - 1);
+ sprite->copyTo(&userInterface, slot._position,
+ sprite->getTransparencyIndex());
+ } else {
+ MSprite *sprite = asset->getFrame(frameNumber - 1);
+
+ if (flipped) {
+ MSurface *spr = sprite->flipHorizontal();
+ userInterface.mergeFrom(spr, spr->getBounds(), slot._position,
+ sprite->getTransparencyIndex());
+ delete spr;
+ } else {
+ userInterface.mergeFrom(sprite, sprite->getBounds(), slot._position,
+ sprite->getTransparencyIndex());
+ }
+ }
+ }
+ }
+ }
+
+ // Mark areas of the screen surface for updating
+ if (updateFlag) {
+ for (uint idx = 0; idx < size(); ++idx) {
+ DirtyArea &dirtyArea = userInterface._dirtyAreas[idx];
+
+ if (dirtyArea._active && dirtyArea._textActive &&
+ dirtyArea._bounds.width() > 0 && dirtyArea._bounds.height() > 0) {
+ // Flag area of screen as needing update
+ Common::Rect r = dirtyArea._bounds;
+ r.translate(0, scene._interfaceY);
+ _vm->_screen.copyRectToScreen(r);
+ }
+ }
+ }
+
+ // Post-processing to remove slots no longer needed
+ for (int idx = (int)size() - 1; idx >= 0; --idx) {
+ UISlot &slot = (*this)[idx];
+
+ if (slot._flags < IMG_STATIC) {
+ if (delFlag || updateFlag)
+ remove_at(idx);
+ else if (slot._flags > -20)
+ slot._flags -= 20;
+ } else {
+ if (updateFlag)
+ slot._flags &= ~0x40;
+ else
+ slot._flags |= 0x40;
+ }
+ }
+}
+
+/*------------------------------------------------------------------------*/
+
+MADSEngine *Conversation::_vm;
+
+void Conversation::init(MADSEngine *vm) {
+ _vm = vm;
+}
+
+void Conversation::setup(int globalId, ...) {
+ va_list va;
+ va_start(va, globalId);
+
+ // Load the list of conversation quotes
+ _quotes.clear();
+ int quoteId = va_arg(va, int);
+ while (quoteId > 0) {
+ _quotes.push_back(quoteId);
+ quoteId = va_arg(va, int);
+ }
+ va_end(va);
+
+ if (quoteId < 0) {
+ // For an ending value of -1, also initial the bitflags for the global
+ // associated with the conversation entry, which enables all the quote Ids
+ _vm->_game->globals()[globalId] = (int16)0xffff;
+ }
+
+ _globalId = globalId;
+}
+
+void Conversation::set(int quoteId, ...) {
+ _vm->_game->globals()[_globalId] = 0;
+
+ va_list va;
+ va_start(va, quoteId);
+
+ // Loop through handling each quote
+ while (quoteId > 0) {
+ for (uint idx = 0; idx < _quotes.size(); ++idx) {
+ if (_quotes[idx] == quoteId) {
+ // Found index, so set that bit in the global keeping track of conversation state
+ _vm->_game->globals()[_globalId] |= 1 << idx;
+ break;
+ }
+ }
+
+ quoteId = va_arg(va, int);
+ }
+ va_end(va);
+}
+
+int Conversation::read(int quoteId) {
+ uint16 flags = _vm->_game->globals()[_globalId];
+ int count = 0;
+
+ for (uint idx = 0; idx < _quotes.size(); ++idx) {
+ if (flags & (1 << idx))
+ ++count;
+
+ if (_quotes[idx] == quoteId)
+ return flags & (1 << idx);
+ }
+
+ // Could not find it, simply return number of active quotes
+ return count;
+}
+
+void Conversation::write(int quoteId, bool flag) {
+ for (uint idx = 0; idx < _quotes.size(); ++idx) {
+ if (_quotes[idx] == quoteId) {
+ // Found index, so set or clear the flag
+ if (flag) {
+ // Set bit
+ _vm->_game->globals()[_globalId] |= 1 << idx;
+ } else {
+ // Clear bit
+ _vm->_game->globals()[_globalId] &= ~(1 << idx);
+ }
+ return;
+ }
+ }
+}
+
+void Conversation::start() {
+ UserInterface &userInterface = _vm->_game->_scene._userInterface;
+ userInterface.emptyConversationList();
+
+ // Loop through each of the quotes loaded into the conversation
+ for (uint idx = 0; idx < _quotes.size(); ++idx) {
+ // Check whether the given quote is enabled or not
+ if (_vm->_game->globals()[_globalId] & (1 << idx)) {
+ // Quote enabled, so add it to the list of talk selections
+ Common::String msg = _vm->_game->getQuote(_quotes[idx]);
+ userInterface.addConversationMessage(_quotes[idx], msg);
+ }
+ }
+
+ userInterface.setup(kInputConversation);
+}
+
+/*------------------------------------------------------------------------*/
+
+UserInterface::UserInterface(MADSEngine *vm) : _vm(vm), _dirtyAreas(vm),
+ _uiSlots(vm) {
+ _invSpritesIndex = -1;
+ _invFrameNumber = 1;
+ _scrollMilli = 0;
+ _scrollFlag = false;
+ _category = CAT_NONE;
+ _inventoryTopIndex = 0;
+ _selectedInvIndex = -1;
+ _selectedActionIndex = 0;
+ _selectedItemVocabIdx = -1;
+ _scrollbarActive = SCROLLBAR_NONE;
+ _scrollbarOldActive = SCROLLBAR_NONE;
+ _scrollbarStrokeType = SCROLLBAR_NONE;
+ _scrollbarQuickly = false;
+ _scrollbarMilliTime = 0;
+ _scrollbarElevator = _scrollbarOldElevator = 0;
+ _highlightedCommandIndex = -1;
+ _highlightedInvIndex = -1;
+ _highlightedItemVocabIndex = -1;
+ _dirtyAreas.resize(50);
+ _inventoryChanged = false;
+ _noSegmentsActive = 0;
+ _someSegmentsActive = 0;
+ _rectP = nullptr;
+
+ Common::fill(&_categoryIndexes[0], &_categoryIndexes[7], 0);
+
+ // Map the user interface to the bottom of the game's screen surface
+ byte *pData = _vm->_screen.getBasePtr(0, MADS_SCENE_HEIGHT);
+ setPixels(pData, MADS_SCREEN_WIDTH, MADS_INTERFACE_HEIGHT);
+
+ _surface.setSize(MADS_SCREEN_WIDTH, MADS_INTERFACE_HEIGHT);
+}
+
+void UserInterface::load(const Common::String &resName) {
+ File f(resName);
+ MadsPack madsPack(&f);
+
+ // Load in the palette
+ Common::SeekableReadStream *palStream = madsPack.getItemStream(0);
+
+ uint32 *gamePalP = &_vm->_palette->_palFlags[0];
+ byte *palP = &_vm->_palette->_mainPalette[0];
+
+ for (int i = 0; i < 16; ++i, gamePalP++, palP += 3) {
+ RGB6 rgb;
+ rgb.load(palStream);
+ palP[0] = rgb.r;
+ palP[1] = rgb.g;
+ palP[2] = rgb.b;
+ *gamePalP |= 1;
+ }
+ delete palStream;
+
+ // Read in the surface data
+ Common::SeekableReadStream *pixelsStream = madsPack.getItemStream(1);
+ pixelsStream->read(_surface.getData(), MADS_SCREEN_WIDTH * MADS_INTERFACE_HEIGHT);
+ delete pixelsStream;
+}
+
+void UserInterface::setup(InputMode inputMode) {
+ Scene &scene = _vm->_game->_scene;
+
+ if (_vm->_game->_screenObjects._inputMode != inputMode) {
+ Common::String resName = _vm->_game->_aaName;
+
+ // Strip off any extension
+ const char *p = strchr(resName.c_str(), '.');
+ if (p) {
+ resName = Common::String(resName.c_str(), p);
+ }
+
+ // Add on suffix if necessary
+ if (inputMode != kInputBuildingSentences)
+ resName += "A";
+
+ resName += ".INT";
+
+ load(resName);
+ _surface.copyTo(this);
+ }
+ _vm->_game->_screenObjects._inputMode = inputMode;
+
+ scene._userInterface._uiSlots.clear();
+ scene._userInterface._uiSlots.fullRefresh();
+ _vm->_game->_screenObjects._baseTime = _vm->_events->getFrameCounter();
+ _highlightedCommandIndex = -1;
+ _highlightedItemVocabIndex = -1;
+ _highlightedInvIndex = -1;
+
+ if (_vm->_game->_kernelMode == KERNEL_ACTIVE_CODE)
+ scene._userInterface._uiSlots.draw(false, false);
+
+ scene._action.clear();
+ drawTextElements();
+ loadElements();
+ scene._dynamicHotspots.refresh();
+}
+
+void UserInterface::drawTextElements() {
+ if (_vm->_game->_screenObjects._inputMode) {
+ drawConversationList();
+ } else {
+ // Draw the actions
+ drawActions();
+ drawInventoryList();
+ drawItemVocabList();
+ }
+}
+
+void UserInterface::mergeFrom(MSurface *src, const Common::Rect &srcBounds,
+ const Common::Point &destPos, int transparencyIndex) {
+ // Validation of the rectangle and position
+ int destX = destPos.x, destY = destPos.y;
+ if ((destX >= w) || (destY >= h))
+ return;
+
+ Common::Rect copyRect = srcBounds;
+ if (destX < 0) {
+ copyRect.left += -destX;
+ destX = 0;
+ } else if (destX + copyRect.width() > w) {
+ copyRect.right -= destX + copyRect.width() - w;
+ }
+ if (destY < 0) {
+ copyRect.top += -destY;
+ destY = 0;
+ } else if (destY + copyRect.height() > h) {
+ copyRect.bottom -= destY + copyRect.height() - h;
+ }
+
+ if (!copyRect.isValidRect())
+ return;
+
+ // Copy the specified area
+
+ byte *data = src->getData();
+ byte *srcPtr = data + (src->getWidth() * copyRect.top + copyRect.left);
+ byte *destPtr = (byte *)this->pixels + (destY * getWidth()) + destX;
+
+ for (int rowCtr = 0; rowCtr < copyRect.height(); ++rowCtr) {
+ // Process each line of the area
+ for (int xCtr = 0; xCtr < copyRect.width(); ++xCtr) {
+ // Check for the range used for the user interface background,
+ // which are the only pixels that can be replaced
+ if ((destPtr[xCtr] >= 8 && destPtr[xCtr] <= 15) && (int)srcPtr[xCtr] != transparencyIndex)
+ destPtr[xCtr] = srcPtr[xCtr];
+ }
+
+ srcPtr += src->getWidth();
+ destPtr += getWidth();
+ }
+}
+
+void UserInterface::drawActions() {
+ for (int idx = 0; idx < 10; ++idx) {
+ writeVocab(CAT_COMMAND, idx);
+ }
+}
+
+void UserInterface::drawInventoryList() {
+ int endIndex = MIN((int)_vm->_game->_objects._inventoryList.size(), _inventoryTopIndex + 5);
+ for (int idx = _inventoryTopIndex; idx < endIndex; ++idx) {
+ writeVocab(CAT_INV_LIST, idx);
+ }
+}
+
+void UserInterface::drawItemVocabList() {
+ if (_selectedInvIndex >= 0) {
+ InventoryObject &io = _vm->_game->_objects[
+ _vm->_game->_objects._inventoryList[_selectedInvIndex]];
+ for (int idx = 0; idx < io._vocabCount; ++idx) {
+ writeVocab(CAT_INV_VOCAB, idx);
+ }
+ }
+}
+
+void UserInterface::drawScroller() {
+ if (_scrollbarActive)
+ writeVocab(CAT_INV_SCROLLER, _scrollbarActive);
+ writeVocab(CAT_INV_SCROLLER, 4);
+}
+
+void UserInterface::updateInventoryScroller() {
+ ScreenObjects &screenObjects = _vm->_game->_screenObjects;
+ Common::Array<int> &inventoryList = _vm->_game->_objects._inventoryList;
+
+ if (screenObjects._inputMode != kInputBuildingSentences)
+ return;
+
+ _scrollbarActive = SCROLLBAR_NONE;
+
+ if ((screenObjects._category == CAT_INV_SCROLLER) || (screenObjects._category != CAT_INV_SCROLLER
+ && _scrollbarOldActive == SCROLLBAR_ELEVATOR && _vm->_events->_mouseStatusCopy)) {
+ if (_vm->_events->_mouseStatusCopy || _vm->_easyMouse) {
+ if ((_vm->_events->_mouseClicked || (_vm->_easyMouse && !_vm->_events->_mouseStatusCopy))
+ && (screenObjects._category == CAT_INV_SCROLLER))
+ _scrollbarStrokeType = (ScrollbarActive)screenObjects._spotId;
+
+ if (screenObjects._spotId == _scrollbarStrokeType || _scrollbarOldActive == SCROLLBAR_ELEVATOR) {
+ _scrollbarActive = _scrollbarStrokeType;
+ uint32 currentMilli = g_system->getMillis();
+ uint32 timeInc = _scrollbarQuickly ? 100 : 380;
+
+ if (_vm->_events->_mouseStatus && (_scrollbarMilliTime + timeInc) <= currentMilli) {
+ _scrollbarQuickly = _vm->_events->_vD2 < 1;
+ _scrollbarMilliTime = currentMilli;
+
+ switch (_scrollbarStrokeType) {
+ case SCROLLBAR_UP:
+ // Scroll up
+ if (_inventoryTopIndex > 0 && inventoryList.size() > 0) {
+ --_inventoryTopIndex;
+ _inventoryChanged = true;
+ }
+ break;
+
+ case SCROLLBAR_DOWN:
+ // Scroll down
+ if (_inventoryTopIndex < ((int)inventoryList.size() - 1) && inventoryList.size() > 1) {
+ ++_inventoryTopIndex;
+ _inventoryChanged = true;
+ }
+ break;
+
+ case SCROLLBAR_ELEVATOR: {
+ // Inventory slider
+ int newIndex = CLIP((int)_vm->_events->currentPos().y - 170, 0, 17)
+ * inventoryList.size() / 10;
+ if (newIndex >= (int)inventoryList.size())
+ newIndex = inventoryList.size() - 1;
+
+ if (inventoryList.size() > 0) {
+ _inventoryChanged = newIndex != _inventoryTopIndex;
+ _inventoryTopIndex = newIndex;
+ }
+ break;
+ }
+
+ default:
+ break;
+ }
+
+ if (_inventoryChanged) {
+ int dummy;
+ updateSelection(CAT_INV_LIST, 0, &dummy);
+ }
+ }
+ }
+ }
+ }
+
+ if (_scrollbarActive != _scrollbarOldActive || _scrollbarElevator != _scrollbarOldElevator)
+ scrollbarChanged();
+
+ _scrollbarOldActive = _scrollbarActive;
+ _scrollbarOldElevator = _scrollbarElevator;
+}
+
+void UserInterface::scrollbarChanged() {
+ Common::Rect r(73, 4, 73 + 9, 4 + 38);
+ _uiSlots.add(r);
+ _uiSlots.draw(false, false);
+ drawScroller();
+ updateRect(r);
+}
+
+void UserInterface::writeVocab(ScrCategory category, int id) {
+ Common::Rect bounds;
+ if (!getBounds(category, id, bounds))
+ return;
+
+ Scene &scene = _vm->_game->_scene;
+ Font *font = nullptr;
+
+ int vocabId;
+ Common::String vocabStr;
+ switch (category) {
+ case CAT_COMMAND:
+ font = _vm->_font->getFont(FONT_INTERFACE);
+ vocabId = scene._verbList[id]._id;
+ if (id == _highlightedCommandIndex) {
+ _vm->_font->setColorMode(SELMODE_HIGHLIGHTED);
+ } else {
+ _vm->_font->setColorMode(id == _selectedActionIndex ? SELMODE_SELECTED : SELMODE_UNSELECTED);
+ }
+ vocabStr = scene.getVocab(vocabId);
+ vocabStr.setChar(toupper(vocabStr[0]), 0);
+ font->writeString(this, vocabStr, Common::Point(bounds.left, bounds.top));
+ break;
+
+ case CAT_INV_LIST:
+ font = _vm->_font->getFont(FONT_INTERFACE);
+ vocabId = _vm->_game->_objects.getItem(id)._descId;
+ if (id == _highlightedInvIndex) {
+ _vm->_font->setColorMode(SELMODE_HIGHLIGHTED);
+ } else {
+ _vm->_font->setColorMode(id == _selectedInvIndex ? SELMODE_SELECTED : SELMODE_UNSELECTED);
+ }
+
+ vocabStr = scene.getVocab(vocabId);
+ vocabStr.setChar(toupper(vocabStr[0]), 0);
+ font->writeString(this, vocabStr, Common::Point(bounds.left, bounds.top));
+ break;
+
+ case CAT_TALK_ENTRY:
+ font = _vm->_font->getFont(FONT_INTERFACE);
+ font->setColorMode(id == _highlightedCommandIndex ? SELMODE_HIGHLIGHTED : SELMODE_UNSELECTED);
+ font->writeString(this, _talkStrings[id], Common::Point(bounds.left, bounds.top));
+ break;
+
+ case CAT_INV_SCROLLER:
+ font = _vm->_font->getFont(FONT_MISC);
+
+ switch (id) {
+ case 1:
+ vocabStr = "a";
+ break;
+ case 2:
+ vocabStr = "b";
+ break;
+ case 3:
+ vocabStr = "d";
+ break;
+ case 4:
+ vocabStr = "c";
+ break;
+ default:
+ break;
+ }
+
+ font->setColorMode((id == 4) || (_scrollbarActive == SCROLLBAR_ELEVATOR) ?
+ SELMODE_HIGHLIGHTED : SELMODE_UNSELECTED);
+ font->writeString(this, vocabStr, Common::Point(bounds.left, bounds.top));
+ break;
+ default:
+ // Item specific verbs
+ font = _vm->_font->getFont(FONT_INTERFACE);
+ vocabId = _vm->_game->_objects.getItem(_selectedInvIndex)._vocabList[id]._vocabId;
+ if (id == _highlightedItemVocabIndex) {
+ _vm->_font->setColorMode(SELMODE_HIGHLIGHTED);
+ } else {
+ _vm->_font->setColorMode(id == _selectedInvIndex ? SELMODE_SELECTED : SELMODE_UNSELECTED);
+ vocabStr = scene.getVocab(vocabId);
+ vocabStr.setChar(toupper(vocabStr[0]), 0);
+ font->writeString(this, vocabStr, Common::Point(bounds.left, bounds.top));
+ break;
+ }
+ break;
+ }
+}
+
+void UserInterface::loadElements() {
+ Scene &scene = _vm->_game->_scene;
+ Common::Rect bounds;
+ _vm->_game->_screenObjects.clear();
+
+ if (_vm->_game->_screenObjects._inputMode == kInputBuildingSentences) {
+ // Set up screen objects for the inventory scroller
+ for (int idx = 1; idx <= 3; ++idx) {
+ getBounds(CAT_INV_SCROLLER, idx, bounds);
+ moveRect(bounds);
+
+ _vm->_game->_screenObjects.add(bounds, LAYER_GUI, CAT_INV_SCROLLER, idx);
+ }
+
+ // Set up actions
+ _categoryIndexes[CAT_COMMAND - 1] = _vm->_game->_screenObjects.size() + 1;
+ for (int idx = 0; idx < 10; ++idx) {
+ getBounds(CAT_COMMAND, idx, bounds);
+ moveRect(bounds);
+
+ _vm->_game->_screenObjects.add(bounds, LAYER_GUI, CAT_COMMAND, idx);
+ }
+
+ // Set up inventory list
+ _categoryIndexes[CAT_INV_LIST - 1] = _vm->_game->_screenObjects.size() + 1;
+ for (int idx = 0; idx < 5; ++idx) {
+ getBounds(CAT_INV_LIST, _inventoryTopIndex + idx, bounds);
+ moveRect(bounds);
+
+ _vm->_game->_screenObjects.add(bounds, LAYER_GUI, CAT_INV_LIST, idx);
+ }
+
+ // Set up the inventory vocab list
+ _categoryIndexes[CAT_INV_VOCAB - 1] = _vm->_game->_screenObjects.size() + 1;
+ for (int idx = 0; idx < 5; ++idx) {
+ getBounds(CAT_INV_VOCAB, idx, bounds);
+ moveRect(bounds);
+
+ _vm->_game->_screenObjects.add(bounds, LAYER_GUI, CAT_INV_VOCAB, idx);
+ }
+
+ // Set up the inventory item picture
+ _categoryIndexes[CAT_INV_ANIM - 1] = _vm->_game->_screenObjects.size() + 1;
+ _vm->_game->_screenObjects.add(Common::Rect(160, 159, 231, 194), LAYER_GUI,
+ CAT_INV_ANIM, 0);
+ }
+
+ if (_vm->_game->_screenObjects._inputMode == kInputBuildingSentences ||
+ _vm->_game->_screenObjects._inputMode == kInputLimitedSentences) {
+ _categoryIndexes[CAT_HOTSPOT - 1] = _vm->_game->_screenObjects.size() + 1;
+ for (int hotspotIdx = scene._hotspots.size() - 1; hotspotIdx >= 0; --hotspotIdx) {
+ Hotspot &hs = scene._hotspots[hotspotIdx];
+ _vm->_game->_screenObjects.add(hs._bounds, LAYER_GUI, CAT_HOTSPOT, hotspotIdx);
+ }
+ }
+
+ if (_vm->_game->_screenObjects._inputMode == kInputConversation) {
+ // setup areas for talk entries
+ _categoryIndexes[CAT_TALK_ENTRY - 1] = _vm->_game->_screenObjects.size() + 1;
+ for (int idx = 0; idx < 5; ++idx) {
+ getBounds(CAT_TALK_ENTRY, idx, bounds);
+ moveRect(bounds);
+
+ _vm->_game->_screenObjects.add(bounds, LAYER_GUI, CAT_TALK_ENTRY, idx);
+ }
+ }
+
+ // Store the number of UI elements loaded for easy nuking/refreshing hotspots added later
+ _vm->_game->_screenObjects._uiCount = _vm->_game->_screenObjects.size();
+}
+
+bool UserInterface::getBounds(ScrCategory category, int v, Common::Rect &bounds) {
+ int heightMultiplier, widthMultiplier;
+ int leftStart, yOffset, widthAmt;
+
+ switch (category) {
+ case CAT_COMMAND:
+ heightMultiplier = v % 5;
+ widthMultiplier = v / 5;
+ leftStart = 2;
+ yOffset = 3;
+ widthAmt = 32;
+ break;
+
+ case CAT_INV_LIST:
+ if (v < _inventoryTopIndex || v >= (_inventoryTopIndex + 5))
+ return false;
+
+ heightMultiplier = v - _inventoryTopIndex;
+ widthMultiplier = 0;
+ leftStart = 90;
+ yOffset = 3;
+ widthAmt = 69;
+ break;
+
+ case CAT_TALK_ENTRY:
+ heightMultiplier = v;
+ widthMultiplier = 0;
+ leftStart = 2;
+ yOffset = 3;
+ widthAmt = 310;
+ break;
+
+ case CAT_INV_SCROLLER:
+ heightMultiplier = 0;
+ widthMultiplier = 0;
+ yOffset = 0;
+ widthAmt = 9;
+ leftStart = (v != 73) ? 73 : 75;
+ break;
+
+ default:
+ heightMultiplier = v;
+ widthMultiplier = 0;
+ leftStart = 240;
+ yOffset = 3;
+ widthAmt = 80;
+ break;
+ }
+
+ bounds.left = (widthMultiplier > 0) ? widthMultiplier * widthAmt + leftStart : leftStart;
+ bounds.setWidth(widthAmt);
+ bounds.top = heightMultiplier * 8 + yOffset;
+ bounds.setHeight(8);
+
+ if (category == CAT_INV_SCROLLER) {
+ switch (v) {
+ case SCROLLBAR_UP:
+ // Arrow up
+ bounds.top = 4;
+ bounds.setHeight(7);
+ break;
+ case SCROLLBAR_DOWN:
+ // Arrow down
+ bounds.top = 35;
+ bounds.setHeight(7);
+ break;
+ case SCROLLBAR_ELEVATOR:
+ // Scroller
+ bounds.top = 12;
+ bounds.setHeight(22);
+ break;
+ case SCROLLBAR_THUMB:
+ // Thumb
+ bounds.top = _scrollbarElevator + 14;
+ bounds.setHeight(1);
+ break;
+ default:
+ break;
+ }
+ }
+
+ return true;
+}
+
+void UserInterface::moveRect(Common::Rect &bounds) {
+ bounds.translate(0, MADS_SCENE_HEIGHT);
+}
+
+void UserInterface::drawConversationList() {
+ for (uint idx = 0; idx < _talkStrings.size(); ++idx) {
+ writeVocab(CAT_TALK_ENTRY, idx);
+ }
+}
+
+void UserInterface::emptyConversationList() {
+ _talkStrings.clear();
+ _talkIds.clear();
+}
+
+void UserInterface::addConversationMessage(int vocabId, const Common::String &msg) {
+ assert(_talkStrings.size() < 5);
+
+ _talkStrings.push_back(msg);
+ _talkIds.push_back(vocabId);
+}
+
+void UserInterface::loadInventoryAnim(int objectId) {
+ Scene &scene = _vm->_game->_scene;
+ noInventoryAnim();
+
+ if (_vm->_invObjectsAnimated) {
+ Common::String resName = Common::String::format("*OB%.3dI", objectId);
+ SpriteAsset *asset = new SpriteAsset(_vm, resName, ASSET_SPINNING_OBJECT);
+ _invSpritesIndex = scene._sprites.add(asset, 1);
+ if (_invSpritesIndex >= 0) {
+ _invFrameNumber = 1;
+ }
+ }
+}
+
+void UserInterface::noInventoryAnim() {
+ Scene &scene = _vm->_game->_scene;
+
+ if (_invSpritesIndex >= 0) {
+ scene._sprites.remove(_invSpritesIndex);
+ _vm->_game->_screenObjects._baseTime = _vm->_events->getFrameCounter();
+ _invSpritesIndex = -1;
+ }
+
+ if (_vm->_game->_screenObjects._inputMode == kInputBuildingSentences)
+ refresh();
+}
+
+void UserInterface::refresh() {
+ _uiSlots.clear();
+ _uiSlots.fullRefresh();
+ _uiSlots.draw(false, false);
+
+ drawTextElements();
+}
+
+void UserInterface::inventoryAnim() {
+ Scene &scene = _vm->_game->_scene;
+ if (_vm->_game->_screenObjects._inputMode == kInputConversation ||
+ _vm->_game->_screenObjects._inputMode == kInputLimitedSentences ||
+ _invSpritesIndex < 0)
+ return;
+
+ // Move to the next frame number in the sequence, resetting if at the end
+ SpriteAsset *asset = scene._sprites[_invSpritesIndex];
+ if (++_invFrameNumber > asset->getCount())
+ _invFrameNumber = 1;
+
+ // Loop through the slots list for inventory animation entry
+ for (uint i = 0; i < _uiSlots.size(); ++i) {
+ if (_uiSlots[i]._segmentId == IMG_SPINNING_OBJECT)
+ _uiSlots[i]._flags = IMG_FULL_UPDATE;
+ }
+
+ // Add a new slot entry for the inventory animation
+ UISlot slot;
+ slot._flags = IMG_UPDATE;
+ slot._segmentId = IMG_SPINNING_OBJECT;
+ slot._frameNumber = _invFrameNumber;
+ slot._spritesIndex = _invSpritesIndex;
+ slot._position = Common::Point(160, 3);
+
+ _uiSlots.push_back(slot);
+}
+
+void UserInterface::doBackgroundAnimation() {
+ Scene &scene = _vm->_game->_scene;
+ Common::Array<AnimUIEntry> &uiEntries = scene._animationData->_uiEntries;
+ Common::Array<AnimFrameEntry> &frameEntries = scene._animationData->_frameEntries;
+
+ _noSegmentsActive = !_someSegmentsActive;
+ _someSegmentsActive = false;
+
+ for (int idx = 0; idx < (int)uiEntries.size(); ++idx) {
+ AnimUIEntry &uiEntry = uiEntries[idx];
+
+ if (uiEntry._counter < 0) {
+ if (uiEntry._counter == -1) {
+ int probabilityRandom = _vm->getRandomNumber(1, 30000);
+ int probability = uiEntry._probability;
+ if (uiEntry._probability > 30000) {
+ if (_noSegmentsActive) {
+ probability -= 30000;
+ } else {
+ probability = -1;
+ }
+ }
+ if (probabilityRandom <= probability) {
+ uiEntry._counter = uiEntry._firstImage;
+ _someSegmentsActive = true;
+ }
+ } else {
+ uiEntry._counter = uiEntry._firstImage;
+ _someSegmentsActive = true;
+ }
+ } else {
+ for (int idx2 = 0; idx2 < ANIM_SPAWN_COUNT; idx2++) {
+ if (uiEntry._spawnFrame[idx2] == (uiEntry._counter - uiEntry._firstImage)) {
+ int tempIndex = uiEntry._spawn[idx2];
+ if (idx >= tempIndex) {
+ uiEntries[tempIndex]._counter = uiEntries[tempIndex]._firstImage;
+ } else {
+ uiEntries[tempIndex]._counter = -2;
+ }
+ _someSegmentsActive = true;
+ }
+ }
+
+ ++uiEntry._counter;
+ if (uiEntry._counter > uiEntry._lastImage) {
+ uiEntry._counter = -1;
+ } else {
+ _someSegmentsActive = true;
+ }
+ }
+ }
+
+ for (uint idx = 0; idx < uiEntries.size(); ++idx) {
+ int imgScan = uiEntries[idx]._counter;
+ if (imgScan >= 0) {
+ _uiSlots.add(frameEntries[imgScan]);
+ }
+ }
+}
+
+void UserInterface::categoryChanged() {
+ _highlightedInvIndex = -1;
+ _vm->_events->initVars();
+ _category = CAT_NONE;
+}
+
+void UserInterface::selectObject(int invIndex) {
+ if (_selectedInvIndex != invIndex || _inventoryChanged) {
+ int oldVocabCount = _selectedInvIndex < 0 ? 0 : _vm->_game->_objects.getItem(_selectedInvIndex)._vocabCount;
+ int newVocabCount = invIndex < 0 ? 0 : _vm->_game->_objects.getItem(invIndex)._vocabCount;
+ int maxVocab = MAX(oldVocabCount, newVocabCount);
+
+ updateSelection(CAT_INV_LIST, invIndex, &_selectedInvIndex);
+ _highlightedItemVocabIndex = -1;
+ _selectedItemVocabIdx = -1;
+
+ if (maxVocab) {
+ assert(_uiSlots.size() < 50);
+ int vocabHeight = maxVocab * 8;
+
+ Common::Rect bounds(240, 3, 240 + 80, 3 + vocabHeight);
+ _uiSlots.add(bounds);
+ _uiSlots.draw(false, false);
+ drawItemVocabList();
+ updateRect(bounds);
+ }
+ }
+
+ if (invIndex == -1) {
+ noInventoryAnim();
+ } else {
+ loadInventoryAnim(_vm->_game->_objects._inventoryList[invIndex]);
+ _vm->_palette->setPalette(&_vm->_palette->_mainPalette[7 * 3], 7, 1);
+ _vm->_palette->setPalette(&_vm->_palette->_mainPalette[246 * 3], 246, 2);
+ }
+}
+
+void UserInterface::updateSelection(ScrCategory category, int newIndex, int *idx) {
+ Game &game = *_vm->_game;
+ Common::Array<int> &invList = game._objects._inventoryList;
+ Common::Rect bounds;
+
+ if (category == CAT_INV_LIST && _inventoryChanged) {
+ *idx = newIndex;
+ bounds = Common::Rect(90, 3, 90 + 69, 3 + 40);
+ _uiSlots.add(bounds);
+ _uiSlots.draw(false, false);
+ drawInventoryList();
+ updateRect(bounds);
+ _inventoryChanged = false;
+
+ if (invList.size() < 2) {
+ _scrollbarElevator = 0;
+ } else {
+ int v = _inventoryTopIndex * 18 / (invList.size() - 1);
+ _scrollbarElevator = MIN(v, 17);
+ }
+ } else {
+ int oldIndex = *idx;
+ *idx = newIndex;
+
+ if (oldIndex >= 0) {
+ writeVocab(category, oldIndex);
+
+ if (getBounds(category, oldIndex, bounds))
+ updateRect(bounds);
+ }
+
+ if (newIndex >= 0) {
+ writeVocab(category, newIndex);
+
+ if (getBounds(category, newIndex, bounds))
+ updateRect(bounds);
+ }
+ }
+}
+
+void UserInterface::updateRect(const Common::Rect &bounds) {
+ Common::Rect r = bounds;
+ r.translate(0, MADS_SCENE_HEIGHT);
+ _vm->_screen.copyRectToScreen(r);
+}
+
+void UserInterface::scrollerChanged() {
+ warning("TODO: scrollerChanged");
+}
+
+void UserInterface::scrollInventory() {
+ Common::Array<int> &invList = _vm->_game->_objects._inventoryList;
+
+ if (_vm->_events->_mouseButtons) {
+ int yp = _vm->_events->currentPos().y;
+ if (yp < MADS_SCENE_HEIGHT || yp == (MADS_SCREEN_HEIGHT - 1)) {
+ uint32 timeDiff = _scrollFlag ? 100 : 380;
+ uint32 currentMilli = g_system->getMillis();
+ _vm->_game->_screenObjects._v8332A = -1;
+
+ if (currentMilli >= (_scrollMilli + timeDiff)) {
+ _scrollMilli = currentMilli;
+ _scrollFlag = true;
+
+ if (yp == (MADS_SCREEN_HEIGHT - 1)) {
+ if (_inventoryTopIndex < ((int)invList.size() - 1)) {
+ ++_inventoryTopIndex;
+ _inventoryChanged = true;
+ }
+ } else {
+ if (_inventoryTopIndex > 0) {
+ --_inventoryTopIndex;
+ _inventoryChanged = true;
+ }
+ }
+ }
+ }
+ }
+
+ _vm->_game->_screenObjects._v8332A = 0;
+}
+
+void UserInterface::synchronize(Common::Serializer &s) {
+ InventoryObjects &invObjects = _vm->_game->_objects;
+
+ if (s.isLoading()) {
+ _selectedInvIndex = invObjects._inventoryList.empty() ? -1 : 0;
+ }
+
+ for (int i = 0; i < 8; ++i)
+ s.syncAsSint16LE(_categoryIndexes[i]);
+}
+
+} // End of namespace MADS
diff --git a/engines/mads/user_interface.h b/engines/mads/user_interface.h
new file mode 100644
index 0000000000..f251441e40
--- /dev/null
+++ b/engines/mads/user_interface.h
@@ -0,0 +1,306 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+
+ * You should have received a copy of the GNU General Public 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 MADS_USER_INTERFACE_H
+#define MADS_USER_INTERFACE_H
+
+#include "common/scummsys.h"
+#include "common/rect.h"
+#include "common/str.h"
+#include "mads/msurface.h"
+#include "mads/screen.h"
+
+namespace MADS {
+
+enum { IMG_SPINNING_OBJECT = 200, IMG_TEXT_UPDATE = 201 };
+
+enum ScrollbarActive {
+ SCROLLBAR_NONE = 0, // No state
+ SCROLLBAR_UP = 1, // Up butotn
+ SCROLLBAR_DOWN = 2, // Down button
+ SCROLLBAR_ELEVATOR = 3, // Elevator bar
+ SCROLLBAR_THUMB = 4 // Scrollbar thumb
+};
+
+class AnimFrameEntry;
+class MADSEngine;
+
+class UISlot {
+public:
+ int _flags;
+ int _segmentId;
+ int _spritesIndex;
+ int _frameNumber;
+ Common::Point _position;
+
+ // Only used for IMG_OVERPRINT
+ int _width;
+ int _height;
+
+ UISlot();
+};
+
+/**
+ * Sprite list for the user interface
+ */
+class UISlots : public Common::Array<UISlot> {
+private:
+ MADSEngine *_vm;
+public:
+ /**
+ * Constructor
+ */
+ UISlots(MADSEngine *vm) : _vm(vm) {}
+
+ /**
+ * Add an overprint (text) entry to the list
+ */
+ void add(const Common::Rect &bounds);
+
+ /**
+ * Loads the data from an aimation frame entry
+ */
+ void add(const AnimFrameEntry &frameEntry);
+
+ /**
+ * Adds a special entry for full refresh of the user interface
+ */
+ void fullRefresh();
+
+ /**
+ * Draw all the sprites in the list on the user interface.
+ * @param updateFlag Flag drawn areas to be updated on physical screen
+ * @param delFlag Controls how used slots are deleted after drawing
+ */
+ void draw(bool updateFlag, bool delFlag);
+};
+
+class Conversation {
+private:
+ static MADSEngine *_vm;
+public:
+ static void init(MADSEngine *vm);
+public:
+ int _globalId;
+ Common::Array<int> _quotes;
+
+ /**
+ * Set up a conversation sequence
+ */
+ void setup(int globalId, ...);
+
+ /**
+ * Activates the passed set of quotes in the given conversation node
+ */
+ void set(int quoteId, ...);
+
+ /**
+ * Returns the bit for a given quote to indicate whether it's active or not or,
+ * if 0 is passed, returns the number of currently active quotes
+ */
+ int read(int quoteId);
+
+ /**
+ * Activates or deactivates the specified quote in the given conversation node
+ */
+ void write(int quoteId, bool flag);
+
+ /**
+ * Starts the conversation
+ */
+ void start();
+};
+
+class UserInterface : public MSurface {
+ friend class UISlots;
+private:
+ MADSEngine *_vm;
+ int _invSpritesIndex;
+ int _invFrameNumber;
+ uint32 _scrollMilli;
+ bool _scrollFlag;
+ int _noSegmentsActive;
+ int _someSegmentsActive;
+ ScrollbarActive _scrollbarStrokeType;
+
+ /**
+ * Loads the elements of the user interface
+ */
+ void loadElements();
+
+ /**
+ * Returns the area within the user interface a given element falls
+ */
+ bool getBounds(ScrCategory category, int invIndex, Common::Rect &bounds);
+
+ /**
+ * Reposition a bounding rectangle to physical co-ordinates
+ */
+ void moveRect(Common::Rect &bounds);
+
+ /**
+ * Draw options during a conversation.
+ */
+ void drawConversationList();
+
+ /**
+ * Draw the action list
+ */
+ void drawActions();
+
+ /**
+ * Draw the inventory list
+ */
+ void drawInventoryList();
+
+ /**
+ * Draw the inventory item vocab list
+ */
+ void drawItemVocabList();
+
+ /**
+ * Draw the inventory scroller
+ */
+ void drawScroller();
+
+ /**
+ * Called when the inventory scrollbar has changed
+ */
+ void scrollbarChanged();
+
+ /**
+ * Draw a UI textual element
+ */
+ void writeVocab(ScrCategory category, int id);
+
+ void refresh();
+
+ void updateRect(const Common::Rect &bounds);
+public:
+ MSurface _surface;
+ UISlots _uiSlots;
+ DirtyAreas _dirtyAreas;
+ ScrCategory _category;
+ Common::Rect *_rectP;
+ int _inventoryTopIndex;
+ int _selectedInvIndex;
+ int _selectedActionIndex;
+ int _selectedItemVocabIdx;
+ ScrollbarActive _scrollbarActive, _scrollbarOldActive;
+ int _highlightedCommandIndex;
+ int _highlightedInvIndex;
+ int _highlightedItemVocabIndex;
+ bool _inventoryChanged;
+ int _categoryIndexes[8];
+ Common::StringArray _talkStrings;
+ Common::Array<int> _talkIds;
+ bool _scrollbarQuickly;
+ uint32 _scrollbarMilliTime;
+ int _scrollbarElevator, _scrollbarOldElevator;
+public:
+ /**
+ * Constructor
+ */
+ UserInterface(MADSEngine *vm);
+
+ /**
+ * Loads an interface from a specified resource
+ */
+ void load(const Common::String &resName);
+
+ /**
+ * Set up the interface
+ */
+ void setup(InputMode inputMode);
+
+ void drawTextElements();
+
+ /**
+ * Merges a sub-section of another surface into the user interface without
+ * destroying any on-screen text
+ * @param src Source surface
+ * @param srcBounds Area to copy/merge from
+ * @param destPos Destination position to draw in current surface
+ * @param transparencyIndex Transparency color
+ */
+ void mergeFrom(MSurface *src, const Common::Rect &srcBounds, const Common::Point &destPos,
+ int transparencyIndex = -1);
+
+ /**
+ * Loads the animation sprite data for a given inventory object
+ */
+ void loadInventoryAnim(int objectId);
+
+ /**
+ * Resets the inventory animation when no inventory item is selected
+ */
+ void noInventoryAnim();
+
+ /**
+ * Handles any animation that occurs in the background of the user interface
+ */
+ void doBackgroundAnimation();
+
+ /**
+ * Handles queuing a new frame of an inventory animation for drawing
+ */
+ void inventoryAnim();
+
+ void categoryChanged();
+
+ /**
+ * Select an item from the inventory list
+ * @param invIndex Index in the inventory list of the item to select
+ */
+ void selectObject(int invIndex);
+
+ void updateSelection(ScrCategory category, int newIndex, int *idx);
+
+ void scrollerChanged();
+
+ void scrollInventory();
+
+ /**
+ * Checks for the mouse being on the user interface inventory scroller,
+ * and update the scroller highlight and selected inventory object as necessary
+ */
+ void updateInventoryScroller();
+
+ /**
+ * Empties the current conversation talk list
+ */
+ void emptyConversationList();
+
+ /**
+ * Add a msesage to the list of conversation items to select from
+ */
+ void addConversationMessage(int vocabId, const Common::String &msg);
+
+ /**
+ * Synchronize the data
+ */
+ void synchronize(Common::Serializer &s);
+};
+
+} // End of namespace MADS
+
+#endif /* MADS_USER_INTERFACE_H */
diff --git a/engines/metaengine.h b/engines/metaengine.h
index ffa682fc53..41f3ec4cba 100644
--- a/engines/metaengine.h
+++ b/engines/metaengine.h
@@ -17,6 +17,7 @@
* You should have received a copy of the GNU General Public 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 ENGINES_METAENGINE_H
diff --git a/engines/mohawk/bitmap.cpp b/engines/mohawk/bitmap.cpp
index b321e043d9..6435daf46f 100644
--- a/engines/mohawk/bitmap.cpp
+++ b/engines/mohawk/bitmap.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -29,7 +29,7 @@
#include "common/substream.h"
#include "common/system.h"
#include "common/textconsole.h"
-#include "graphics/decoders/bmp.h"
+#include "image/bmp.h"
namespace Mohawk {
@@ -635,7 +635,7 @@ MohawkSurface *MystBitmap::decodeImage(Common::SeekableReadStream *stream) {
Common::SeekableReadStream *bmpStream = decompressLZ(stream, uncompressedSize);
delete stream;
- Graphics::BitmapDecoder bitmapDecoder;
+ Image::BitmapDecoder bitmapDecoder;
if (!bitmapDecoder.loadStream(*bmpStream))
error("Could not decode Myst bitmap");
diff --git a/engines/mohawk/bitmap.h b/engines/mohawk/bitmap.h
index 73c117b5c7..ea8664f39d 100644
--- a/engines/mohawk/bitmap.h
+++ b/engines/mohawk/bitmap.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/mohawk/configure.engine b/engines/mohawk/configure.engine
new file mode 100644
index 0000000000..fa9d15cffc
--- /dev/null
+++ b/engines/mohawk/configure.engine
@@ -0,0 +1,6 @@
+# This file is included from the main "configure" script
+# add_engine [name] [desc] [build-by-default] [subengines] [base games] [deps]
+add_engine mohawk "Mohawk" yes "cstime myst riven" "Living Books"
+add_engine cstime "Where in Time is Carmen Sandiego?" no
+add_engine riven "Riven: The Sequel to Myst" no "" "" "16bit"
+add_engine myst "Myst" no "" "" "16bit"
diff --git a/engines/mohawk/console.cpp b/engines/mohawk/console.cpp
index ce22132cee..d49f3e8637 100644
--- a/engines/mohawk/console.cpp
+++ b/engines/mohawk/console.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -49,20 +49,20 @@ namespace Mohawk {
#ifdef ENABLE_MYST
MystConsole::MystConsole(MohawkEngine_Myst *vm) : GUI::Debugger(), _vm(vm) {
- DCmd_Register("changeCard", WRAP_METHOD(MystConsole, Cmd_ChangeCard));
- DCmd_Register("curCard", WRAP_METHOD(MystConsole, Cmd_CurCard));
- DCmd_Register("var", WRAP_METHOD(MystConsole, Cmd_Var));
- DCmd_Register("curStack", WRAP_METHOD(MystConsole, Cmd_CurStack));
- DCmd_Register("changeStack", WRAP_METHOD(MystConsole, Cmd_ChangeStack));
- DCmd_Register("drawImage", WRAP_METHOD(MystConsole, Cmd_DrawImage));
- DCmd_Register("drawRect", WRAP_METHOD(MystConsole, Cmd_DrawRect));
- DCmd_Register("setResourceEnable", WRAP_METHOD(MystConsole, Cmd_SetResourceEnable));
- DCmd_Register("playSound", WRAP_METHOD(MystConsole, Cmd_PlaySound));
- DCmd_Register("stopSound", WRAP_METHOD(MystConsole, Cmd_StopSound));
- DCmd_Register("playMovie", WRAP_METHOD(MystConsole, Cmd_PlayMovie));
- DCmd_Register("disableInitOpcodes", WRAP_METHOD(MystConsole, Cmd_DisableInitOpcodes));
- DCmd_Register("cache", WRAP_METHOD(MystConsole, Cmd_Cache));
- DCmd_Register("resources", WRAP_METHOD(MystConsole, Cmd_Resources));
+ registerCmd("changeCard", WRAP_METHOD(MystConsole, Cmd_ChangeCard));
+ registerCmd("curCard", WRAP_METHOD(MystConsole, Cmd_CurCard));
+ registerCmd("var", WRAP_METHOD(MystConsole, Cmd_Var));
+ registerCmd("curStack", WRAP_METHOD(MystConsole, Cmd_CurStack));
+ registerCmd("changeStack", WRAP_METHOD(MystConsole, Cmd_ChangeStack));
+ registerCmd("drawImage", WRAP_METHOD(MystConsole, Cmd_DrawImage));
+ registerCmd("drawRect", WRAP_METHOD(MystConsole, Cmd_DrawRect));
+ registerCmd("setResourceEnable", WRAP_METHOD(MystConsole, Cmd_SetResourceEnable));
+ registerCmd("playSound", WRAP_METHOD(MystConsole, Cmd_PlaySound));
+ registerCmd("stopSound", WRAP_METHOD(MystConsole, Cmd_StopSound));
+ registerCmd("playMovie", WRAP_METHOD(MystConsole, Cmd_PlayMovie));
+ registerCmd("disableInitOpcodes", WRAP_METHOD(MystConsole, Cmd_DisableInitOpcodes));
+ registerCmd("cache", WRAP_METHOD(MystConsole, Cmd_Cache));
+ registerCmd("resources", WRAP_METHOD(MystConsole, Cmd_Resources));
}
MystConsole::~MystConsole() {
@@ -70,7 +70,7 @@ MystConsole::~MystConsole() {
bool MystConsole::Cmd_ChangeCard(int argc, const char **argv) {
if (argc < 2) {
- DebugPrintf("Usage: changeCard <card>\n");
+ debugPrintf("Usage: changeCard <card>\n");
return true;
}
@@ -81,20 +81,20 @@ bool MystConsole::Cmd_ChangeCard(int argc, const char **argv) {
}
bool MystConsole::Cmd_CurCard(int argc, const char **argv) {
- DebugPrintf("Current Card: %d\n", _vm->getCurCard());
+ debugPrintf("Current Card: %d\n", _vm->getCurCard());
return true;
}
bool MystConsole::Cmd_Var(int argc, const char **argv) {
if (argc == 1) {
- DebugPrintf("Usage: var <var> (<value>)\n");
+ debugPrintf("Usage: var <var> (<value>)\n");
return true;
}
if (argc > 2)
_vm->_scriptParser->setVarValue((uint16)atoi(argv[1]), (uint16)atoi(argv[2]));
- DebugPrintf("%d = %d\n", (uint16)atoi(argv[1]), _vm->_scriptParser->getVar((uint16)atoi(argv[1])));
+ debugPrintf("%d = %d\n", (uint16)atoi(argv[1]), _vm->_scriptParser->getVar((uint16)atoi(argv[1])));
return true;
}
@@ -130,19 +130,19 @@ static const uint16 default_start_card[12] = {
};
bool MystConsole::Cmd_CurStack(int argc, const char **argv) {
- DebugPrintf("Current Stack: %s\n", mystStackNames[_vm->getCurStack()]);
+ debugPrintf("Current Stack: %s\n", mystStackNames[_vm->getCurStack()]);
return true;
}
bool MystConsole::Cmd_ChangeStack(int argc, const char **argv) {
if (argc != 2 && argc != 3) {
- DebugPrintf("Usage: changeStack <stack> [<card>]\n\n");
- DebugPrintf("Stacks:\n=======\n");
+ debugPrintf("Usage: changeStack <stack> [<card>]\n\n");
+ debugPrintf("Stacks:\n=======\n");
for (byte i = 0; i < ARRAYSIZE(mystStackNames); i++)
- DebugPrintf(" %s\n", mystStackNames[i]);
+ debugPrintf(" %s\n", mystStackNames[i]);
- DebugPrintf("\n");
+ debugPrintf("\n");
return true;
}
@@ -156,7 +156,7 @@ bool MystConsole::Cmd_ChangeStack(int argc, const char **argv) {
}
if (!stackNum) {
- DebugPrintf("\'%s\' is not a stack name!\n", argv[1]);
+ debugPrintf("\'%s\' is not a stack name!\n", argv[1]);
return true;
}
@@ -177,7 +177,7 @@ bool MystConsole::Cmd_ChangeStack(int argc, const char **argv) {
bool MystConsole::Cmd_DrawImage(int argc, const char **argv) {
if (argc != 2 && argc != 6) {
- DebugPrintf("Usage: drawImage <image> [<left> <top> <right> <bottom>]\n");
+ debugPrintf("Usage: drawImage <image> [<left> <top> <right> <bottom>]\n");
return true;
}
@@ -195,8 +195,8 @@ bool MystConsole::Cmd_DrawImage(int argc, const char **argv) {
bool MystConsole::Cmd_DrawRect(int argc, const char **argv) {
if (argc != 5 && argc != 2) {
- DebugPrintf("Usage: drawRect <left> <top> <right> <bottom>\n");
- DebugPrintf("Usage: drawRect <resource id>\n");
+ debugPrintf("Usage: drawRect <left> <top> <right> <bottom>\n");
+ debugPrintf("Usage: drawRect <resource id>\n");
return true;
}
@@ -213,7 +213,7 @@ bool MystConsole::Cmd_DrawRect(int argc, const char **argv) {
bool MystConsole::Cmd_SetResourceEnable(int argc, const char **argv) {
if (argc < 3) {
- DebugPrintf("Usage: setResourceEnable <resource id> <bool>\n");
+ debugPrintf("Usage: setResourceEnable <resource id> <bool>\n");
return true;
}
@@ -223,7 +223,7 @@ bool MystConsole::Cmd_SetResourceEnable(int argc, const char **argv) {
bool MystConsole::Cmd_PlaySound(int argc, const char **argv) {
if (argc == 1) {
- DebugPrintf("Usage: playSound <value>\n");
+ debugPrintf("Usage: playSound <value>\n");
return true;
}
@@ -234,7 +234,7 @@ bool MystConsole::Cmd_PlaySound(int argc, const char **argv) {
}
bool MystConsole::Cmd_StopSound(int argc, const char **argv) {
- DebugPrintf("Stopping Sound\n");
+ debugPrintf("Stopping Sound\n");
_vm->_sound->stopSound();
@@ -243,8 +243,8 @@ bool MystConsole::Cmd_StopSound(int argc, const char **argv) {
bool MystConsole::Cmd_PlayMovie(int argc, const char **argv) {
if (argc < 2) {
- DebugPrintf("Usage: playMovie <name> [<stack>] [<left> <top>]\n");
- DebugPrintf("NOTE: The movie will play *once* in the background.\n");
+ debugPrintf("Usage: playMovie <name> [<stack>] [<left> <top>]\n");
+ debugPrintf("NOTE: The movie will play *once* in the background.\n");
return true;
}
@@ -258,7 +258,7 @@ bool MystConsole::Cmd_PlayMovie(int argc, const char **argv) {
}
if (!stackNum) {
- DebugPrintf("\'%s\' is not a stack name!\n", argv[2]);
+ debugPrintf("\'%s\' is not a stack name!\n", argv[2]);
return true;
}
}
@@ -277,7 +277,7 @@ bool MystConsole::Cmd_PlayMovie(int argc, const char **argv) {
bool MystConsole::Cmd_DisableInitOpcodes(int argc, const char **argv) {
if (argc != 1) {
- DebugPrintf("Usage: disableInitOpcodes\n");
+ debugPrintf("Usage: disableInitOpcodes\n");
return true;
}
@@ -289,7 +289,7 @@ bool MystConsole::Cmd_DisableInitOpcodes(int argc, const char **argv) {
bool MystConsole::Cmd_Cache(int argc, const char **argv) {
if (argc > 2) {
- DebugPrintf("Usage: cache on/off - Omit parameter to get current state\n");
+ debugPrintf("Usage: cache on/off - Omit parameter to get current state\n");
return true;
}
@@ -304,15 +304,15 @@ bool MystConsole::Cmd_Cache(int argc, const char **argv) {
_vm->setCacheState(state);
}
- DebugPrintf("Cache: %s\n", state ? "Enabled" : "Disabled");
+ debugPrintf("Cache: %s\n", state ? "Enabled" : "Disabled");
return true;
}
bool MystConsole::Cmd_Resources(int argc, const char **argv) {
- DebugPrintf("Resources in card %d:\n", _vm->getCurCard());
+ debugPrintf("Resources in card %d:\n", _vm->getCurCard());
for (uint i = 0; i < _vm->_resources.size(); i++) {
- DebugPrintf("#%2d %s\n", i, _vm->_resources[i]->describe().c_str());
+ debugPrintf("#%2d %s\n", i, _vm->_resources[i]->describe().c_str());
}
return true;
@@ -323,21 +323,21 @@ bool MystConsole::Cmd_Resources(int argc, const char **argv) {
#ifdef ENABLE_RIVEN
RivenConsole::RivenConsole(MohawkEngine_Riven *vm) : GUI::Debugger(), _vm(vm) {
- DCmd_Register("changeCard", WRAP_METHOD(RivenConsole, Cmd_ChangeCard));
- DCmd_Register("curCard", WRAP_METHOD(RivenConsole, Cmd_CurCard));
- DCmd_Register("var", WRAP_METHOD(RivenConsole, Cmd_Var));
- DCmd_Register("playSound", WRAP_METHOD(RivenConsole, Cmd_PlaySound));
- DCmd_Register("playSLST", WRAP_METHOD(RivenConsole, Cmd_PlaySLST));
- DCmd_Register("stopSound", WRAP_METHOD(RivenConsole, Cmd_StopSound));
- DCmd_Register("curStack", WRAP_METHOD(RivenConsole, Cmd_CurStack));
- DCmd_Register("changeStack", WRAP_METHOD(RivenConsole, Cmd_ChangeStack));
- DCmd_Register("hotspots", WRAP_METHOD(RivenConsole, Cmd_Hotspots));
- DCmd_Register("zipMode", WRAP_METHOD(RivenConsole, Cmd_ZipMode));
- DCmd_Register("dumpScript", WRAP_METHOD(RivenConsole, Cmd_DumpScript));
- DCmd_Register("listZipCards", WRAP_METHOD(RivenConsole, Cmd_ListZipCards));
- DCmd_Register("getRMAP", WRAP_METHOD(RivenConsole, Cmd_GetRMAP));
- DCmd_Register("combos", WRAP_METHOD(RivenConsole, Cmd_Combos));
- DCmd_Register("sliderState", WRAP_METHOD(RivenConsole, Cmd_SliderState));
+ registerCmd("changeCard", WRAP_METHOD(RivenConsole, Cmd_ChangeCard));
+ registerCmd("curCard", WRAP_METHOD(RivenConsole, Cmd_CurCard));
+ registerCmd("var", WRAP_METHOD(RivenConsole, Cmd_Var));
+ registerCmd("playSound", WRAP_METHOD(RivenConsole, Cmd_PlaySound));
+ registerCmd("playSLST", WRAP_METHOD(RivenConsole, Cmd_PlaySLST));
+ registerCmd("stopSound", WRAP_METHOD(RivenConsole, Cmd_StopSound));
+ registerCmd("curStack", WRAP_METHOD(RivenConsole, Cmd_CurStack));
+ registerCmd("changeStack", WRAP_METHOD(RivenConsole, Cmd_ChangeStack));
+ registerCmd("hotspots", WRAP_METHOD(RivenConsole, Cmd_Hotspots));
+ registerCmd("zipMode", WRAP_METHOD(RivenConsole, Cmd_ZipMode));
+ registerCmd("dumpScript", WRAP_METHOD(RivenConsole, Cmd_DumpScript));
+ registerCmd("listZipCards", WRAP_METHOD(RivenConsole, Cmd_ListZipCards));
+ registerCmd("getRMAP", WRAP_METHOD(RivenConsole, Cmd_GetRMAP));
+ registerCmd("combos", WRAP_METHOD(RivenConsole, Cmd_Combos));
+ registerCmd("sliderState", WRAP_METHOD(RivenConsole, Cmd_SliderState));
}
RivenConsole::~RivenConsole() {
@@ -346,7 +346,7 @@ RivenConsole::~RivenConsole() {
bool RivenConsole::Cmd_ChangeCard(int argc, const char **argv) {
if (argc < 2) {
- DebugPrintf("Usage: changeCard <card>\n");
+ debugPrintf("Usage: changeCard <card>\n");
return true;
}
@@ -358,19 +358,19 @@ bool RivenConsole::Cmd_ChangeCard(int argc, const char **argv) {
}
bool RivenConsole::Cmd_CurCard(int argc, const char **argv) {
- DebugPrintf("Current Card: %d\n", _vm->getCurCard());
+ debugPrintf("Current Card: %d\n", _vm->getCurCard());
return true;
}
bool RivenConsole::Cmd_Var(int argc, const char **argv) {
if (argc == 1) {
- DebugPrintf("Usage: var <var name> (<value>)\n");
+ debugPrintf("Usage: var <var name> (<value>)\n");
return true;
}
if (!_vm->_vars.contains(argv[1])) {
- DebugPrintf("Unknown variable '%s'\n", argv[1]);
+ debugPrintf("Unknown variable '%s'\n", argv[1]);
return true;
}
@@ -379,13 +379,13 @@ bool RivenConsole::Cmd_Var(int argc, const char **argv) {
if (argc > 2)
var = (uint32)atoi(argv[2]);
- DebugPrintf("%s = %d\n", argv[1], var);
+ debugPrintf("%s = %d\n", argv[1], var);
return true;
}
bool RivenConsole::Cmd_PlaySound(int argc, const char **argv) {
if (argc < 2) {
- DebugPrintf("Usage: playSound <value>\n");
+ debugPrintf("Usage: playSound <value>\n");
return true;
}
@@ -397,7 +397,7 @@ bool RivenConsole::Cmd_PlaySound(int argc, const char **argv) {
bool RivenConsole::Cmd_PlaySLST(int argc, const char **argv) {
if (argc < 2) {
- DebugPrintf("Usage: playSLST <slst index> <card, default = current>\n");
+ debugPrintf("Usage: playSLST <slst index> <card, default = current>\n");
return true;
}
@@ -412,7 +412,7 @@ bool RivenConsole::Cmd_PlaySLST(int argc, const char **argv) {
}
bool RivenConsole::Cmd_StopSound(int argc, const char **argv) {
- DebugPrintf("Stopping Sound\n");
+ debugPrintf("Stopping Sound\n");
_vm->_sound->stopSound();
_vm->_sound->stopAllSLST();
@@ -420,58 +420,57 @@ bool RivenConsole::Cmd_StopSound(int argc, const char **argv) {
}
bool RivenConsole::Cmd_CurStack(int argc, const char **argv) {
- DebugPrintf("Current Stack: %s\n", _vm->getStackName(_vm->getCurStack()).c_str());
+ debugPrintf("Current Stack: %s\n", _vm->getStackName(_vm->getCurStack()).c_str());
return true;
}
bool RivenConsole::Cmd_ChangeStack(int argc, const char **argv) {
- byte i;
-
if (argc < 3) {
- DebugPrintf("Usage: changeStack <stack> <card>\n\n");
- DebugPrintf("Stacks:\n=======\n");
+ debugPrintf("Usage: changeStack <stack> <card>\n\n");
+ debugPrintf("Stacks:\n=======\n");
- for (i = 0; i <= tspit; i++)
- DebugPrintf(" %s\n", _vm->getStackName(i).c_str());
+ for (uint i = kStackFirst; i <= kStackLast; i++)
+ debugPrintf(" %s\n", _vm->getStackName(i).c_str());
- DebugPrintf("\n");
+ debugPrintf("\n");
return true;
}
- byte stackNum = 0;
+ uint stack = kStackUnknown;
- for (i = 1; i <= tspit + 1; i++)
- if (!scumm_stricmp(argv[1], _vm->getStackName(i - 1).c_str())) {
- stackNum = i;
+ for (uint i = kStackFirst; i <= kStackLast; i++) {
+ if (!scumm_stricmp(argv[1], _vm->getStackName(i).c_str())) {
+ stack = i;
break;
}
+ }
- if (!stackNum) {
- DebugPrintf("\'%s\' is not a stack name!\n", argv[1]);
+ if (stack == kStackUnknown) {
+ debugPrintf("\'%s\' is not a stack name!\n", argv[1]);
return true;
}
- _vm->changeToStack(stackNum - 1);
+ _vm->changeToStack(stack);
_vm->changeToCard((uint16)atoi(argv[2]));
return false;
}
bool RivenConsole::Cmd_Hotspots(int argc, const char **argv) {
- DebugPrintf("Current card (%d) has %d hotspots:\n", _vm->getCurCard(), _vm->getHotspotCount());
+ debugPrintf("Current card (%d) has %d hotspots:\n", _vm->getCurCard(), _vm->getHotspotCount());
for (uint16 i = 0; i < _vm->getHotspotCount(); i++) {
- DebugPrintf("Hotspot %d, index %d, BLST ID %d (", i, _vm->_hotspots[i].index, _vm->_hotspots[i].blstID);
+ debugPrintf("Hotspot %d, index %d, BLST ID %d (", i, _vm->_hotspots[i].index, _vm->_hotspots[i].blstID);
if (_vm->_hotspots[i].enabled)
- DebugPrintf("enabled");
+ debugPrintf("enabled");
else
- DebugPrintf("disabled");
+ debugPrintf("disabled");
- DebugPrintf(") - (%d, %d, %d, %d)\n", _vm->_hotspots[i].rect.left, _vm->_hotspots[i].rect.top, _vm->_hotspots[i].rect.right, _vm->_hotspots[i].rect.bottom);
- DebugPrintf(" Name = %s\n", _vm->getHotspotName(i).c_str());
+ debugPrintf(") - (%d, %d, %d, %d)\n", _vm->_hotspots[i].rect.left, _vm->_hotspots[i].rect.top, _vm->_hotspots[i].rect.right, _vm->_hotspots[i].rect.bottom);
+ debugPrintf(" Name = %s\n", _vm->getHotspotName(i).c_str());
}
return true;
@@ -481,34 +480,33 @@ bool RivenConsole::Cmd_ZipMode(int argc, const char **argv) {
uint32 &zipModeActive = _vm->_vars["azip"];
zipModeActive = !zipModeActive;
- DebugPrintf("Zip Mode is ");
- DebugPrintf(zipModeActive ? "Enabled" : "Disabled");
- DebugPrintf("\n");
+ debugPrintf("Zip Mode is ");
+ debugPrintf(zipModeActive ? "Enabled" : "Disabled");
+ debugPrintf("\n");
return true;
}
bool RivenConsole::Cmd_DumpScript(int argc, const char **argv) {
if (argc < 4) {
- DebugPrintf("Usage: dumpScript <stack> <CARD or HSPT> <card>\n");
+ debugPrintf("Usage: dumpScript <stack> <CARD or HSPT> <card>\n");
return true;
}
uint16 oldStack = _vm->getCurStack();
+ uint newStack = kStackUnknown;
- byte newStack = 0;
-
- for (byte i = 1; i <= tspit + 1; i++)
- if (!scumm_stricmp(argv[1], _vm->getStackName(i - 1).c_str())) {
+ for (uint i = kStackFirst; i <= kStackLast; i++) {
+ if (!scumm_stricmp(argv[1], _vm->getStackName(i).c_str())) {
newStack = i;
break;
}
+ }
- if (!newStack) {
- DebugPrintf("\'%s\' is not a stack name!\n", argv[1]);
+ if (newStack == kStackUnknown) {
+ debugPrintf("\'%s\' is not a stack name!\n", argv[1]);
return true;
}
- newStack--;
_vm->changeToStack(newStack);
// Load in Variable Names
@@ -594,7 +592,7 @@ bool RivenConsole::Cmd_DumpScript(int argc, const char **argv) {
delete hsptStream;
} else {
- DebugPrintf("%s doesn't have any scripts!\n", argv[2]);
+ debugPrintf("%s doesn't have any scripts!\n", argv[2]);
}
// See above for why this is printed via debugN
@@ -602,18 +600,18 @@ bool RivenConsole::Cmd_DumpScript(int argc, const char **argv) {
_vm->changeToStack(oldStack);
- DebugPrintf("Script dump complete.\n");
+ debugPrintf("Script dump complete.\n");
return true;
}
bool RivenConsole::Cmd_ListZipCards(int argc, const char **argv) {
if (_vm->_zipModeData.size() == 0) {
- DebugPrintf("No zip card data.\n");
+ debugPrintf("No zip card data.\n");
} else {
- DebugPrintf("Listing zip cards:\n");
+ debugPrintf("Listing zip cards:\n");
for (uint32 i = 0; i < _vm->_zipModeData.size(); i++)
- DebugPrintf("ID = %d, Name = %s\n", _vm->_zipModeData[i].id, _vm->_zipModeData[i].name.c_str());
+ debugPrintf("ID = %d, Name = %s\n", _vm->_zipModeData[i].id, _vm->_zipModeData[i].name.c_str());
}
return true;
@@ -621,7 +619,7 @@ bool RivenConsole::Cmd_ListZipCards(int argc, const char **argv) {
bool RivenConsole::Cmd_GetRMAP(int argc, const char **argv) {
uint32 rmapCode = _vm->getCurCardRMAP();
- DebugPrintf("RMAP for %s %d = %08x\n", _vm->getStackName(_vm->getCurStack()).c_str(), _vm->getCurCard(), rmapCode);
+ debugPrintf("RMAP for %s %d = %08x\n", _vm->getStackName(_vm->getCurStack()).c_str(), _vm->getCurCard(), rmapCode);
return true;
}
@@ -635,20 +633,20 @@ bool RivenConsole::Cmd_Combos(int argc, const char **argv) {
uint32 prisonCombo = _vm->_vars["pcorrectorder"];
uint32 domeCombo = _vm->_vars["adomecombo"];
- DebugPrintf("Telescope Combo:\n ");
+ debugPrintf("Telescope Combo:\n ");
for (int i = 0; i < 5; i++)
- DebugPrintf("%d ", _vm->_externalScriptHandler->getComboDigit(teleCombo, i));
+ debugPrintf("%d ", _vm->_externalScriptHandler->getComboDigit(teleCombo, i));
- DebugPrintf("\nPrison Combo:\n ");
+ debugPrintf("\nPrison Combo:\n ");
for (int i = 0; i < 5; i++)
- DebugPrintf("%d ", _vm->_externalScriptHandler->getComboDigit(prisonCombo, i));
+ debugPrintf("%d ", _vm->_externalScriptHandler->getComboDigit(prisonCombo, i));
- DebugPrintf("\nDome Combo:\n ");
+ debugPrintf("\nDome Combo:\n ");
for (int i = 1; i <= 25; i++)
if (domeCombo & (1 << (25 - i)))
- DebugPrintf("%d ", i);
+ debugPrintf("%d ", i);
- DebugPrintf("\n");
+ debugPrintf("\n");
return true;
}
@@ -656,17 +654,17 @@ bool RivenConsole::Cmd_SliderState(int argc, const char **argv) {
if (argc > 1)
_vm->_externalScriptHandler->setDomeSliderState((uint32)atoi(argv[1]));
- DebugPrintf("Dome Slider State = %08x\n", _vm->_externalScriptHandler->getDomeSliderState());
+ debugPrintf("Dome Slider State = %08x\n", _vm->_externalScriptHandler->getDomeSliderState());
return true;
}
#endif // ENABLE_RIVEN
LivingBooksConsole::LivingBooksConsole(MohawkEngine_LivingBooks *vm) : GUI::Debugger(), _vm(vm) {
- DCmd_Register("playSound", WRAP_METHOD(LivingBooksConsole, Cmd_PlaySound));
- DCmd_Register("stopSound", WRAP_METHOD(LivingBooksConsole, Cmd_StopSound));
- DCmd_Register("drawImage", WRAP_METHOD(LivingBooksConsole, Cmd_DrawImage));
- DCmd_Register("changePage", WRAP_METHOD(LivingBooksConsole, Cmd_ChangePage));
+ registerCmd("playSound", WRAP_METHOD(LivingBooksConsole, Cmd_PlaySound));
+ registerCmd("stopSound", WRAP_METHOD(LivingBooksConsole, Cmd_StopSound));
+ registerCmd("drawImage", WRAP_METHOD(LivingBooksConsole, Cmd_DrawImage));
+ registerCmd("changePage", WRAP_METHOD(LivingBooksConsole, Cmd_ChangePage));
}
LivingBooksConsole::~LivingBooksConsole() {
@@ -674,7 +672,7 @@ LivingBooksConsole::~LivingBooksConsole() {
bool LivingBooksConsole::Cmd_PlaySound(int argc, const char **argv) {
if (argc == 1) {
- DebugPrintf("Usage: playSound <value>\n");
+ debugPrintf("Usage: playSound <value>\n");
return true;
}
@@ -684,7 +682,7 @@ bool LivingBooksConsole::Cmd_PlaySound(int argc, const char **argv) {
}
bool LivingBooksConsole::Cmd_StopSound(int argc, const char **argv) {
- DebugPrintf("Stopping Sound\n");
+ debugPrintf("Stopping Sound\n");
_vm->_sound->stopSound();
return true;
@@ -692,7 +690,7 @@ bool LivingBooksConsole::Cmd_StopSound(int argc, const char **argv) {
bool LivingBooksConsole::Cmd_DrawImage(int argc, const char **argv) {
if (argc == 1) {
- DebugPrintf("Usage: drawImage <value>\n");
+ debugPrintf("Usage: drawImage <value>\n");
return true;
}
@@ -703,13 +701,13 @@ bool LivingBooksConsole::Cmd_DrawImage(int argc, const char **argv) {
bool LivingBooksConsole::Cmd_ChangePage(int argc, const char **argv) {
if (argc < 2 || argc > 3) {
- DebugPrintf("Usage: changePage <page>[.<subpage>] [<mode>]\n");
+ debugPrintf("Usage: changePage <page>[.<subpage>] [<mode>]\n");
return true;
}
int page, subpage = 0;
if (sscanf(argv[1], "%d.%d", &page, &subpage) == 0) {
- DebugPrintf("Usage: changePage <page>[.<subpage>] [<mode>]\n");
+ debugPrintf("Usage: changePage <page>[.<subpage>] [<mode>]\n");
return true;
}
LBMode mode = argc == 2 ? _vm->getCurMode() : (LBMode)atoi(argv[2]);
@@ -720,21 +718,21 @@ bool LivingBooksConsole::Cmd_ChangePage(int argc, const char **argv) {
if (_vm->loadPage(mode, page, subpage))
return false;
}
- DebugPrintf("no such page %d.%d\n", page, subpage);
+ debugPrintf("no such page %d.%d\n", page, subpage);
return true;
}
#ifdef ENABLE_CSTIME
CSTimeConsole::CSTimeConsole(MohawkEngine_CSTime *vm) : GUI::Debugger(), _vm(vm) {
- DCmd_Register("playSound", WRAP_METHOD(CSTimeConsole, Cmd_PlaySound));
- DCmd_Register("stopSound", WRAP_METHOD(CSTimeConsole, Cmd_StopSound));
- DCmd_Register("drawImage", WRAP_METHOD(CSTimeConsole, Cmd_DrawImage));
- DCmd_Register("drawSubimage", WRAP_METHOD(CSTimeConsole, Cmd_DrawSubimage));
- DCmd_Register("changeCase", WRAP_METHOD(CSTimeConsole, Cmd_ChangeCase));
- DCmd_Register("changeScene", WRAP_METHOD(CSTimeConsole, Cmd_ChangeScene));
- DCmd_Register("caseVariable", WRAP_METHOD(CSTimeConsole, Cmd_CaseVariable));
- DCmd_Register("invItem", WRAP_METHOD(CSTimeConsole, Cmd_InvItem));
+ registerCmd("playSound", WRAP_METHOD(CSTimeConsole, Cmd_PlaySound));
+ registerCmd("stopSound", WRAP_METHOD(CSTimeConsole, Cmd_StopSound));
+ registerCmd("drawImage", WRAP_METHOD(CSTimeConsole, Cmd_DrawImage));
+ registerCmd("drawSubimage", WRAP_METHOD(CSTimeConsole, Cmd_DrawSubimage));
+ registerCmd("changeCase", WRAP_METHOD(CSTimeConsole, Cmd_ChangeCase));
+ registerCmd("changeScene", WRAP_METHOD(CSTimeConsole, Cmd_ChangeScene));
+ registerCmd("caseVariable", WRAP_METHOD(CSTimeConsole, Cmd_CaseVariable));
+ registerCmd("invItem", WRAP_METHOD(CSTimeConsole, Cmd_InvItem));
}
CSTimeConsole::~CSTimeConsole() {
@@ -742,7 +740,7 @@ CSTimeConsole::~CSTimeConsole() {
bool CSTimeConsole::Cmd_PlaySound(int argc, const char **argv) {
if (argc == 1) {
- DebugPrintf("Usage: playSound <value>\n");
+ debugPrintf("Usage: playSound <value>\n");
return true;
}
@@ -752,7 +750,7 @@ bool CSTimeConsole::Cmd_PlaySound(int argc, const char **argv) {
}
bool CSTimeConsole::Cmd_StopSound(int argc, const char **argv) {
- DebugPrintf("Stopping Sound\n");
+ debugPrintf("Stopping Sound\n");
_vm->_sound->stopSound();
return true;
@@ -760,7 +758,7 @@ bool CSTimeConsole::Cmd_StopSound(int argc, const char **argv) {
bool CSTimeConsole::Cmd_DrawImage(int argc, const char **argv) {
if (argc == 1) {
- DebugPrintf("Usage: drawImage <value>\n");
+ debugPrintf("Usage: drawImage <value>\n");
return true;
}
@@ -771,7 +769,7 @@ bool CSTimeConsole::Cmd_DrawImage(int argc, const char **argv) {
bool CSTimeConsole::Cmd_DrawSubimage(int argc, const char **argv) {
if (argc < 3) {
- DebugPrintf("Usage: drawSubimage <value> <subimage>\n");
+ debugPrintf("Usage: drawSubimage <value> <subimage>\n");
return true;
}
@@ -782,7 +780,7 @@ bool CSTimeConsole::Cmd_DrawSubimage(int argc, const char **argv) {
bool CSTimeConsole::Cmd_ChangeCase(int argc, const char **argv) {
if (argc < 2) {
- DebugPrintf("Usage: changeCase <value>\n");
+ debugPrintf("Usage: changeCase <value>\n");
return true;
}
@@ -792,7 +790,7 @@ bool CSTimeConsole::Cmd_ChangeCase(int argc, const char **argv) {
bool CSTimeConsole::Cmd_ChangeScene(int argc, const char **argv) {
if (argc < 2) {
- DebugPrintf("Usage: changeScene <value>\n");
+ debugPrintf("Usage: changeScene <value>\n");
return true;
}
@@ -802,12 +800,12 @@ bool CSTimeConsole::Cmd_ChangeScene(int argc, const char **argv) {
bool CSTimeConsole::Cmd_CaseVariable(int argc, const char **argv) {
if (argc < 2) {
- DebugPrintf("Usage: caseVariable <id> [<value>]\n");
+ debugPrintf("Usage: caseVariable <id> [<value>]\n");
return true;
}
if (argc == 2) {
- DebugPrintf("case variable %d has value %d\n", atoi(argv[1]), _vm->_caseVariable[atoi(argv[1])]);
+ debugPrintf("case variable %d has value %d\n", atoi(argv[1]), _vm->_caseVariable[atoi(argv[1])]);
} else {
_vm->_caseVariable[atoi(argv[1])] = atoi(argv[2]);
}
@@ -816,7 +814,7 @@ bool CSTimeConsole::Cmd_CaseVariable(int argc, const char **argv) {
bool CSTimeConsole::Cmd_InvItem(int argc, const char **argv) {
if (argc < 3) {
- DebugPrintf("Usage: invItem <id> <0 or 1>\n");
+ debugPrintf("Usage: invItem <id> <0 or 1>\n");
return true;
}
diff --git a/engines/mohawk/console.h b/engines/mohawk/console.h
index cdb4e1bedf..af01c0d1e0 100644
--- a/engines/mohawk/console.h
+++ b/engines/mohawk/console.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/mohawk/cstime.cpp b/engines/mohawk/cstime.cpp
index 0f69d50a22..3b26378819 100644
--- a/engines/mohawk/cstime.cpp
+++ b/engines/mohawk/cstime.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/mohawk/cstime.h b/engines/mohawk/cstime.h
index db06b9791e..f95222d3a1 100644
--- a/engines/mohawk/cstime.h
+++ b/engines/mohawk/cstime.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/mohawk/cstime_cases.cpp b/engines/mohawk/cstime_cases.cpp
index c0a8dfc0e3..722d82a9f2 100644
--- a/engines/mohawk/cstime_cases.cpp
+++ b/engines/mohawk/cstime_cases.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/mohawk/cstime_cases.h b/engines/mohawk/cstime_cases.h
index 1ac9abf87e..ba1231784a 100644
--- a/engines/mohawk/cstime_cases.h
+++ b/engines/mohawk/cstime_cases.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/mohawk/cstime_game.cpp b/engines/mohawk/cstime_game.cpp
index 91d2f895c0..8eced701c3 100644
--- a/engines/mohawk/cstime_game.cpp
+++ b/engines/mohawk/cstime_game.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/mohawk/cstime_game.h b/engines/mohawk/cstime_game.h
index 88e813c999..6c082fc4d2 100644
--- a/engines/mohawk/cstime_game.h
+++ b/engines/mohawk/cstime_game.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/mohawk/cstime_graphics.cpp b/engines/mohawk/cstime_graphics.cpp
index 3a1452e67c..29336525da 100644
--- a/engines/mohawk/cstime_graphics.cpp
+++ b/engines/mohawk/cstime_graphics.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/mohawk/cstime_graphics.h b/engines/mohawk/cstime_graphics.h
index 5f034f47f4..35d5882bf0 100644
--- a/engines/mohawk/cstime_graphics.h
+++ b/engines/mohawk/cstime_graphics.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/mohawk/cstime_ui.cpp b/engines/mohawk/cstime_ui.cpp
index 6d5e5dd3ef..f3fe27a966 100644
--- a/engines/mohawk/cstime_ui.cpp
+++ b/engines/mohawk/cstime_ui.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/mohawk/cstime_ui.h b/engines/mohawk/cstime_ui.h
index 3154d4b2ef..47e03081d2 100644
--- a/engines/mohawk/cstime_ui.h
+++ b/engines/mohawk/cstime_ui.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/mohawk/cstime_view.cpp b/engines/mohawk/cstime_view.cpp
index 37c418f416..7879175bb0 100644
--- a/engines/mohawk/cstime_view.cpp
+++ b/engines/mohawk/cstime_view.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/mohawk/cstime_view.h b/engines/mohawk/cstime_view.h
index ae3283771d..0005d906f3 100644
--- a/engines/mohawk/cstime_view.h
+++ b/engines/mohawk/cstime_view.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/mohawk/cursors.cpp b/engines/mohawk/cursors.cpp
index f70efde5fb..f1baac02e2 100644
--- a/engines/mohawk/cursors.cpp
+++ b/engines/mohawk/cursors.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/mohawk/cursors.h b/engines/mohawk/cursors.h
index 7bfa491904..c41b5c273e 100644
--- a/engines/mohawk/cursors.h
+++ b/engines/mohawk/cursors.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/mohawk/detection.cpp b/engines/mohawk/detection.cpp
index ef07de0180..926c296257 100644
--- a/engines/mohawk/detection.cpp
+++ b/engines/mohawk/detection.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/mohawk/detection_tables.h b/engines/mohawk/detection_tables.h
index 3b925af5a9..7632cde294 100644
--- a/engines/mohawk/detection_tables.h
+++ b/engines/mohawk/detection_tables.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -294,7 +294,7 @@ static const MohawkGameDescription gameDescriptions[] = {
},
// Riven: The Sequel to Myst
- // Version 1.? (5CD)
+ // Version 1.? (5CD) - Spanish
// From jvprat
{
{
@@ -312,6 +312,24 @@ static const MohawkGameDescription gameDescriptions[] = {
},
// Riven: The Sequel to Myst
+ // Version 1.0 (5CD) - Italian
+ // From dodomorandi on bug #6629
+ {
+ {
+ "riven",
+ "",
+ AD_ENTRY1("a_Data.MHK", "0e21e89df7788f32056b6521abf2e81a"),
+ Common::IT_ITA,
+ Common::kPlatformWindows,
+ ADGF_UNSTABLE,
+ GUIO1(GUIO_NOASPECT)
+ },
+ GType_RIVEN,
+ 0,
+ 0,
+ },
+
+ // Riven: The Sequel to Myst
// Version 1.? (DVD, From "Myst 10th Anniversary Edition")
// From Clone2727
{
diff --git a/engines/mohawk/dialogs.cpp b/engines/mohawk/dialogs.cpp
index 5f5a3b3800..ffc455286f 100644
--- a/engines/mohawk/dialogs.cpp
+++ b/engines/mohawk/dialogs.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/mohawk/dialogs.h b/engines/mohawk/dialogs.h
index 844c01ad26..7470cd3acd 100644
--- a/engines/mohawk/dialogs.h
+++ b/engines/mohawk/dialogs.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/mohawk/graphics.cpp b/engines/mohawk/graphics.cpp
index 0f9a62c891..ea9b57ae17 100644
--- a/engines/mohawk/graphics.cpp
+++ b/engines/mohawk/graphics.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/mohawk/graphics.h b/engines/mohawk/graphics.h
index 51d25db5d9..5f9b523e9a 100644
--- a/engines/mohawk/graphics.h
+++ b/engines/mohawk/graphics.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/mohawk/installer_archive.cpp b/engines/mohawk/installer_archive.cpp
index 5af95f27e3..0abc930683 100644
--- a/engines/mohawk/installer_archive.cpp
+++ b/engines/mohawk/installer_archive.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/mohawk/installer_archive.h b/engines/mohawk/installer_archive.h
index 89d2d85f8d..c3212d7f7c 100644
--- a/engines/mohawk/installer_archive.h
+++ b/engines/mohawk/installer_archive.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/mohawk/livingbooks.cpp b/engines/mohawk/livingbooks.cpp
index 634ff441b6..998ef048f6 100644
--- a/engines/mohawk/livingbooks.cpp
+++ b/engines/mohawk/livingbooks.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/mohawk/livingbooks.h b/engines/mohawk/livingbooks.h
index 615fcd0e16..1a265a1a02 100644
--- a/engines/mohawk/livingbooks.h
+++ b/engines/mohawk/livingbooks.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/mohawk/livingbooks_code.cpp b/engines/mohawk/livingbooks_code.cpp
index c45efb2c39..6dcd8c3ce7 100644
--- a/engines/mohawk/livingbooks_code.cpp
+++ b/engines/mohawk/livingbooks_code.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/mohawk/livingbooks_code.h b/engines/mohawk/livingbooks_code.h
index c9d9ae06e6..080377ce99 100644
--- a/engines/mohawk/livingbooks_code.h
+++ b/engines/mohawk/livingbooks_code.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/mohawk/livingbooks_graphics.cpp b/engines/mohawk/livingbooks_graphics.cpp
index fb764fa15b..fae0c99f6e 100644
--- a/engines/mohawk/livingbooks_graphics.cpp
+++ b/engines/mohawk/livingbooks_graphics.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/mohawk/livingbooks_graphics.h b/engines/mohawk/livingbooks_graphics.h
index 3e2609750a..c76f92f641 100644
--- a/engines/mohawk/livingbooks_graphics.h
+++ b/engines/mohawk/livingbooks_graphics.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/mohawk/livingbooks_lbx.cpp b/engines/mohawk/livingbooks_lbx.cpp
index dcf8caa4a5..b5f62704a1 100644
--- a/engines/mohawk/livingbooks_lbx.cpp
+++ b/engines/mohawk/livingbooks_lbx.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/mohawk/livingbooks_lbx.h b/engines/mohawk/livingbooks_lbx.h
index 3cca0a8e82..f9457c1425 100644
--- a/engines/mohawk/livingbooks_lbx.h
+++ b/engines/mohawk/livingbooks_lbx.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/mohawk/mohawk.cpp b/engines/mohawk/mohawk.cpp
index cb419064c0..d740d9479a 100644
--- a/engines/mohawk/mohawk.cpp
+++ b/engines/mohawk/mohawk.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/mohawk/mohawk.h b/engines/mohawk/mohawk.h
index 2f0e570d56..6fa733e38e 100644
--- a/engines/mohawk/mohawk.h
+++ b/engines/mohawk/mohawk.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/mohawk/myst.cpp b/engines/mohawk/myst.cpp
index 975c6c2a21..7634e8d88a 100644
--- a/engines/mohawk/myst.cpp
+++ b/engines/mohawk/myst.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/mohawk/myst.h b/engines/mohawk/myst.h
index a268c19737..4d86642652 100644
--- a/engines/mohawk/myst.h
+++ b/engines/mohawk/myst.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/mohawk/myst_areas.cpp b/engines/mohawk/myst_areas.cpp
index 12a2c7f44c..4a3001774a 100644
--- a/engines/mohawk/myst_areas.cpp
+++ b/engines/mohawk/myst_areas.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/mohawk/myst_areas.h b/engines/mohawk/myst_areas.h
index 62af5ec4cf..97ec882497 100644
--- a/engines/mohawk/myst_areas.h
+++ b/engines/mohawk/myst_areas.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/mohawk/myst_graphics.cpp b/engines/mohawk/myst_graphics.cpp
index 6a292c66e2..9ea9f15444 100644
--- a/engines/mohawk/myst_graphics.cpp
+++ b/engines/mohawk/myst_graphics.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -28,8 +28,7 @@
#include "common/system.h"
#include "common/textconsole.h"
#include "engines/util.h"
-#include "graphics/decoders/jpeg.h"
-#include "graphics/decoders/pict.h"
+#include "image/pict.h"
namespace Mohawk {
@@ -94,7 +93,7 @@ MohawkSurface *MystGraphics::decodeImage(uint16 id) {
MohawkSurface *mhkSurface = 0;
if (isPict) {
- Graphics::PICTDecoder pict;
+ Image::PICTDecoder pict;
if (!pict.loadStream(*dataStream))
error("Could not decode Myst ME PICT");
diff --git a/engines/mohawk/myst_graphics.h b/engines/mohawk/myst_graphics.h
index 4bbc8d5b8c..1f70320bf6 100644
--- a/engines/mohawk/myst_graphics.h
+++ b/engines/mohawk/myst_graphics.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/mohawk/myst_scripts.cpp b/engines/mohawk/myst_scripts.cpp
index c1b75df4cf..15d74a2253 100644
--- a/engines/mohawk/myst_scripts.cpp
+++ b/engines/mohawk/myst_scripts.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/mohawk/myst_scripts.h b/engines/mohawk/myst_scripts.h
index b75da0801a..7d8165c762 100644
--- a/engines/mohawk/myst_scripts.h
+++ b/engines/mohawk/myst_scripts.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/mohawk/myst_stacks/channelwood.cpp b/engines/mohawk/myst_stacks/channelwood.cpp
index 63ba5f7c85..2dd5745550 100644
--- a/engines/mohawk/myst_stacks/channelwood.cpp
+++ b/engines/mohawk/myst_stacks/channelwood.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/mohawk/myst_stacks/channelwood.h b/engines/mohawk/myst_stacks/channelwood.h
index a3ea406003..bd5d7ffe94 100644
--- a/engines/mohawk/myst_stacks/channelwood.h
+++ b/engines/mohawk/myst_stacks/channelwood.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/mohawk/myst_stacks/credits.cpp b/engines/mohawk/myst_stacks/credits.cpp
index 192e55d5e3..b9ff8b26aa 100644
--- a/engines/mohawk/myst_stacks/credits.cpp
+++ b/engines/mohawk/myst_stacks/credits.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/mohawk/myst_stacks/credits.h b/engines/mohawk/myst_stacks/credits.h
index a1f8b0a7d8..3c0f969203 100644
--- a/engines/mohawk/myst_stacks/credits.h
+++ b/engines/mohawk/myst_stacks/credits.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/mohawk/myst_stacks/demo.cpp b/engines/mohawk/myst_stacks/demo.cpp
index 9f393ea401..848736e37c 100644
--- a/engines/mohawk/myst_stacks/demo.cpp
+++ b/engines/mohawk/myst_stacks/demo.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/mohawk/myst_stacks/demo.h b/engines/mohawk/myst_stacks/demo.h
index c3e57cf7ae..f19b9a6c2c 100644
--- a/engines/mohawk/myst_stacks/demo.h
+++ b/engines/mohawk/myst_stacks/demo.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/mohawk/myst_stacks/dni.cpp b/engines/mohawk/myst_stacks/dni.cpp
index d103105c2d..3eb3c40cbb 100644
--- a/engines/mohawk/myst_stacks/dni.cpp
+++ b/engines/mohawk/myst_stacks/dni.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/mohawk/myst_stacks/dni.h b/engines/mohawk/myst_stacks/dni.h
index 7f04287082..3dc4645bd3 100644
--- a/engines/mohawk/myst_stacks/dni.h
+++ b/engines/mohawk/myst_stacks/dni.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/mohawk/myst_stacks/intro.cpp b/engines/mohawk/myst_stacks/intro.cpp
index 71733227ac..2a33379198 100644
--- a/engines/mohawk/myst_stacks/intro.cpp
+++ b/engines/mohawk/myst_stacks/intro.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/mohawk/myst_stacks/intro.h b/engines/mohawk/myst_stacks/intro.h
index 9fe3920e53..a6c4a594d2 100644
--- a/engines/mohawk/myst_stacks/intro.h
+++ b/engines/mohawk/myst_stacks/intro.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/mohawk/myst_stacks/makingof.cpp b/engines/mohawk/myst_stacks/makingof.cpp
index b5ad647381..1059fd0c5e 100644
--- a/engines/mohawk/myst_stacks/makingof.cpp
+++ b/engines/mohawk/myst_stacks/makingof.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/mohawk/myst_stacks/makingof.h b/engines/mohawk/myst_stacks/makingof.h
index d4bc0fd9f2..79ef913bcf 100644
--- a/engines/mohawk/myst_stacks/makingof.h
+++ b/engines/mohawk/myst_stacks/makingof.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/mohawk/myst_stacks/mechanical.cpp b/engines/mohawk/myst_stacks/mechanical.cpp
index 43e9bcfed5..b5d1285435 100644
--- a/engines/mohawk/myst_stacks/mechanical.cpp
+++ b/engines/mohawk/myst_stacks/mechanical.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -353,7 +353,7 @@ void Mechanical::o_elevatorRotationMove(uint16 op, uint16 var, uint16 argc, uint
int16 step = ((rect.bottom - mouse.y) * lever->getNumFrames()) / rect.height();
step = CLIP<int16>(step, 0, maxStep);
- _elevatorRotationSpeed = step * 0.1;
+ _elevatorRotationSpeed = step * 0.1f;
// Draw current frame
lever->drawFrame(step);
@@ -386,9 +386,9 @@ void Mechanical::o_elevatorRotationStop(uint16 op, uint16 var, uint16 argc, uint
// Decrease speed
while (speed > 2) {
- speed -= 0.5;
+ speed -= 0.5f;
- _elevatorRotationGearPosition += speed * 0.1;
+ _elevatorRotationGearPosition += speed * 0.1f;
if (_elevatorRotationGearPosition > 12)
break;
diff --git a/engines/mohawk/myst_stacks/mechanical.h b/engines/mohawk/myst_stacks/mechanical.h
index 7f3d5143e4..6360b2be2d 100644
--- a/engines/mohawk/myst_stacks/mechanical.h
+++ b/engines/mohawk/myst_stacks/mechanical.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/mohawk/myst_stacks/myst.cpp b/engines/mohawk/myst_stacks/myst.cpp
index dc5f433ce7..c500df5ad3 100644
--- a/engines/mohawk/myst_stacks/myst.cpp
+++ b/engines/mohawk/myst_stacks/myst.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/mohawk/myst_stacks/myst.h b/engines/mohawk/myst_stacks/myst.h
index de88843d59..a83609f640 100644
--- a/engines/mohawk/myst_stacks/myst.h
+++ b/engines/mohawk/myst_stacks/myst.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/mohawk/myst_stacks/preview.cpp b/engines/mohawk/myst_stacks/preview.cpp
index 75e870281e..4cae4aaca7 100644
--- a/engines/mohawk/myst_stacks/preview.cpp
+++ b/engines/mohawk/myst_stacks/preview.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/mohawk/myst_stacks/preview.h b/engines/mohawk/myst_stacks/preview.h
index 706220e8ed..0959e935f5 100644
--- a/engines/mohawk/myst_stacks/preview.h
+++ b/engines/mohawk/myst_stacks/preview.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/mohawk/myst_stacks/selenitic.cpp b/engines/mohawk/myst_stacks/selenitic.cpp
index a941b14eaa..8b95c7fa53 100644
--- a/engines/mohawk/myst_stacks/selenitic.cpp
+++ b/engines/mohawk/myst_stacks/selenitic.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/mohawk/myst_stacks/selenitic.h b/engines/mohawk/myst_stacks/selenitic.h
index d314c4d810..c669d01012 100644
--- a/engines/mohawk/myst_stacks/selenitic.h
+++ b/engines/mohawk/myst_stacks/selenitic.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/mohawk/myst_stacks/slides.cpp b/engines/mohawk/myst_stacks/slides.cpp
index 720926904a..a1413f0d71 100644
--- a/engines/mohawk/myst_stacks/slides.cpp
+++ b/engines/mohawk/myst_stacks/slides.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/mohawk/myst_stacks/slides.h b/engines/mohawk/myst_stacks/slides.h
index 9fb76728b6..fb7868a03c 100644
--- a/engines/mohawk/myst_stacks/slides.h
+++ b/engines/mohawk/myst_stacks/slides.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/mohawk/myst_stacks/stoneship.cpp b/engines/mohawk/myst_stacks/stoneship.cpp
index 1359685302..710c36ac8d 100644
--- a/engines/mohawk/myst_stacks/stoneship.cpp
+++ b/engines/mohawk/myst_stacks/stoneship.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/mohawk/myst_stacks/stoneship.h b/engines/mohawk/myst_stacks/stoneship.h
index 4125412b4d..4e1b42f26b 100644
--- a/engines/mohawk/myst_stacks/stoneship.h
+++ b/engines/mohawk/myst_stacks/stoneship.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/mohawk/myst_state.cpp b/engines/mohawk/myst_state.cpp
index 3a8d233a26..d07aa9d5ec 100644
--- a/engines/mohawk/myst_state.cpp
+++ b/engines/mohawk/myst_state.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/mohawk/myst_state.h b/engines/mohawk/myst_state.h
index c7a6c0b4ac..b07a0f2469 100644
--- a/engines/mohawk/myst_state.h
+++ b/engines/mohawk/myst_state.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/mohawk/resource.cpp b/engines/mohawk/resource.cpp
index d7e829118a..4a4b78e391 100644
--- a/engines/mohawk/resource.cpp
+++ b/engines/mohawk/resource.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/mohawk/resource.h b/engines/mohawk/resource.h
index f2ead7af65..d9074a5b73 100644
--- a/engines/mohawk/resource.h
+++ b/engines/mohawk/resource.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/mohawk/resource_cache.cpp b/engines/mohawk/resource_cache.cpp
index e73d8c43d3..0c19934278 100644
--- a/engines/mohawk/resource_cache.cpp
+++ b/engines/mohawk/resource_cache.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/mohawk/resource_cache.h b/engines/mohawk/resource_cache.h
index b7eac9ebd7..b3c5bf7bb9 100644
--- a/engines/mohawk/resource_cache.h
+++ b/engines/mohawk/resource_cache.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/mohawk/riven.cpp b/engines/mohawk/riven.cpp
index 71aa371073..a7fe12b9e1 100644
--- a/engines/mohawk/riven.cpp
+++ b/engines/mohawk/riven.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -55,7 +55,7 @@ MohawkEngine_Riven::MohawkEngine_Riven(OSystem *syst, const MohawkGameDescriptio
_activatedSLST = false;
_ignoreNextMouseUp = false;
_extrasFile = 0;
- _curStack = aspit;
+ _curStack = kStackUnknown;
_hotspots = 0;
removeTimer();
@@ -161,7 +161,7 @@ Common::Error MohawkEngine_Riven::run() {
// Let's begin, shall we?
if (getFeatures() & GF_DEMO) {
// Start the demo off with the videos
- changeToStack(aspit);
+ changeToStack(kStackAspit);
changeToCard(6);
} else if (ConfMan.hasKey("save_slot")) {
// Load game from launcher/command line if requested
@@ -172,12 +172,12 @@ Common::Error MohawkEngine_Riven::run() {
// Attempt to load the game. On failure, just send us to the main menu.
if (_saveLoad->loadGame(savedGamesList[gameToLoad]).getCode() != Common::kNoError) {
- changeToStack(aspit);
+ changeToStack(kStackAspit);
changeToCard(1);
}
} else {
// Otherwise, start us off at aspit's card 1 (the main menu)
- changeToStack(aspit);
+ changeToStack(kStackAspit);
changeToCard(1);
}
@@ -255,16 +255,16 @@ void MohawkEngine_Riven::handleEvents() {
case Common::KEYCODE_r:
// Return to the main menu in the demo on ctrl+r
if (event.kbd.flags & Common::KBD_CTRL && getFeatures() & GF_DEMO) {
- if (_curStack != aspit)
- changeToStack(aspit);
+ if (_curStack != kStackAspit)
+ changeToStack(kStackAspit);
changeToCard(1);
}
break;
case Common::KEYCODE_p:
// Play the intro videos in the demo on ctrl+p
if (event.kbd.flags & Common::KBD_CTRL && getFeatures() & GF_DEMO) {
- if (_curStack != aspit)
- changeToStack(aspit);
+ if (_curStack != kStackAspit)
+ changeToStack(kStackAspit);
changeToCard(6);
}
break;
@@ -343,20 +343,22 @@ struct RivenSpecialChange {
uint32 startCardRMAP;
byte targetStack;
uint32 targetCardRMAP;
-} rivenSpecialChange[] = {
- { aspit, 0x1f04, ospit, 0x44ad }, // Trap Book
- { bspit, 0x1c0e7, ospit, 0x2e76 }, // Dome Linking Book
- { gspit, 0x111b1, ospit, 0x2e76 }, // Dome Linking Book
- { jspit, 0x28a18, rspit, 0xf94 }, // Tay Linking Book
- { jspit, 0x26228, ospit, 0x2e76 }, // Dome Linking Book
- { ospit, 0x5f0d, pspit, 0x3bf0 }, // Return from 233rd Age
- { ospit, 0x470a, jspit, 0x1508e }, // Return from 233rd Age
- { ospit, 0x5c52, gspit, 0x10bea }, // Return from 233rd Age
- { ospit, 0x5d68, bspit, 0x1adfd }, // Return from 233rd Age
- { ospit, 0x5e49, tspit, 0xe87 }, // Return from 233rd Age
- { pspit, 0x4108, ospit, 0x2e76 }, // Dome Linking Book
- { rspit, 0x32d8, jspit, 0x1c474 }, // Return from Tay
- { tspit, 0x21b69, ospit, 0x2e76 } // Dome Linking Book
+};
+
+static const RivenSpecialChange rivenSpecialChange[] = {
+ { kStackAspit, 0x1f04, kStackOspit, 0x44ad }, // Trap Book
+ { kStackBspit, 0x1c0e7, kStackOspit, 0x2e76 }, // Dome Linking Book
+ { kStackGspit, 0x111b1, kStackOspit, 0x2e76 }, // Dome Linking Book
+ { kStackJspit, 0x28a18, kStackRspit, 0xf94 }, // Tay Linking Book
+ { kStackJspit, 0x26228, kStackOspit, 0x2e76 }, // Dome Linking Book
+ { kStackOspit, 0x5f0d, kStackPspit, 0x3bf0 }, // Return from 233rd Age
+ { kStackOspit, 0x470a, kStackJspit, 0x1508e }, // Return from 233rd Age
+ { kStackOspit, 0x5c52, kStackGspit, 0x10bea }, // Return from 233rd Age
+ { kStackOspit, 0x5d68, kStackBspit, 0x1adfd }, // Return from 233rd Age
+ { kStackOspit, 0x5e49, kStackTspit, 0xe87 }, // Return from 233rd Age
+ { kStackPspit, 0x4108, kStackOspit, 0x2e76 }, // Dome Linking Book
+ { kStackRspit, 0x32d8, kStackJspit, 0x1c474 }, // Return from Tay
+ { kStackTspit, 0x21b69, kStackOspit, 0x2e76 } // Dome Linking Book
};
void MohawkEngine_Riven::changeToCard(uint16 dest) {
@@ -556,16 +558,16 @@ void MohawkEngine_Riven::checkInventoryClick() {
// In the demo, check if we've clicked the exit button
if (getFeatures() & GF_DEMO) {
if (g_demoExitRect->contains(mousePos)) {
- if (_curStack == aspit && _curCard == 1) {
+ if (_curStack == kStackAspit && _curCard == 1) {
// From the main menu, go to the "quit" screen
changeToCard(12);
- } else if (_curStack == aspit && _curCard == 12) {
+ } else if (_curStack == kStackAspit && _curCard == 12) {
// From the "quit" screen, just quit
_gameOver = true;
} else {
// Otherwise, return to the main menu
- if (_curStack != aspit)
- changeToStack(aspit);
+ if (_curStack != kStackAspit)
+ changeToStack(kStackAspit);
changeToCard(1);
}
}
@@ -573,7 +575,7 @@ void MohawkEngine_Riven::checkInventoryClick() {
}
// No inventory shown on aspit
- if (_curStack == aspit)
+ if (_curStack == kStackAspit)
return;
// Set the return stack/card id's.
@@ -589,31 +591,31 @@ void MohawkEngine_Riven::checkInventoryClick() {
if (!hasCathBook) {
if (g_atrusJournalRect1->contains(mousePos)) {
_gfx->hideInventory();
- changeToStack(aspit);
+ changeToStack(kStackAspit);
changeToCard(5);
}
} else if (!hasTrapBook) {
if (g_atrusJournalRect2->contains(mousePos)) {
_gfx->hideInventory();
- changeToStack(aspit);
+ changeToStack(kStackAspit);
changeToCard(5);
} else if (g_cathJournalRect2->contains(mousePos)) {
_gfx->hideInventory();
- changeToStack(aspit);
+ changeToStack(kStackAspit);
changeToCard(6);
}
} else {
if (g_atrusJournalRect3->contains(mousePos)) {
_gfx->hideInventory();
- changeToStack(aspit);
+ changeToStack(kStackAspit);
changeToCard(5);
} else if (g_cathJournalRect3->contains(mousePos)) {
_gfx->hideInventory();
- changeToStack(aspit);
+ changeToStack(kStackAspit);
changeToCard(6);
} else if (g_trapBookRect3->contains(mousePos)) {
_gfx->hideInventory();
- changeToStack(aspit);
+ changeToStack(kStackAspit);
changeToCard(7);
}
}
@@ -735,16 +737,20 @@ Common::Error MohawkEngine_Riven::saveGameState(int slot, const Common::String &
Common::String MohawkEngine_Riven::getStackName(uint16 stack) const {
static const char *rivenStackNames[] = {
- "aspit",
- "bspit",
- "gspit",
- "jspit",
+ "<unknown>",
"ospit",
"pspit",
"rspit",
- "tspit"
+ "tspit",
+ "bspit",
+ "gspit",
+ "jspit",
+ "aspit"
};
+ // Sanity check.
+ assert(stack < ARRAYSIZE(rivenStackNames));
+
return rivenStackNames[stack];
}
diff --git a/engines/mohawk/riven.h b/engines/mohawk/riven.h
index 961d85d61a..9c23d07c52 100644
--- a/engines/mohawk/riven.h
+++ b/engines/mohawk/riven.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -44,18 +44,20 @@ class RivenConsole;
class RivenSaveLoad;
class RivenOptionsDialog;
-#define RIVEN_STACKS 8
-
// Riven Stack Types
enum {
- aspit = 0, // Main Menu, Books, Setup
- bspit = 1, // Book-Making Island
- gspit = 2, // Garden Island
- jspit = 3, // Jungle Island
- ospit = 4, // 233rd Age (Gehn's Office)
- pspit = 5, // Prison Island
- rspit = 6, // Rebel Age (Tay)
- tspit = 7 // Temple Island
+ kStackUnknown = 0, // Default value for ReturnStackID
+ kStackOspit = 1, // 233rd Age (Gehn's Office)
+ kStackPspit = 2, // Prison Island
+ kStackRspit = 3, // Temple Island
+ kStackTspit = 4, // Rebel Age (Tay)
+ kStackBspit = 5, // Book-Making Island
+ kStackGspit = 6, // Garden Island
+ kStackJspit = 7, // Jungle Island
+ kStackAspit = 8, // Main Menu, Books, Setup
+
+ kStackFirst = kStackOspit,
+ kStackLast = kStackAspit
};
// NAME Resource ID's
diff --git a/engines/mohawk/riven_external.cpp b/engines/mohawk/riven_external.cpp
index 384e89a4cf..3d0bccc47f 100644
--- a/engines/mohawk/riven_external.cpp
+++ b/engines/mohawk/riven_external.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -405,7 +405,7 @@ void RivenExternal::drawDomeSliders(uint16 startHotspot) {
// On pspit, the rect is different by two pixels
// (alternatively, we could just use hotspot 3 here, but only on pspit is there a hotspot for this)
- if (_vm->getCurStack() == pspit)
+ if (_vm->getCurStack() == kStackPspit)
dstAreaRect.translate(-2, 0);
// Find out bitmap id
@@ -2016,8 +2016,8 @@ void RivenExternal::xorollcredittime(uint16 argc, uint16 *argv) {
// WORKAROUND: The special change stuff only handles one destination and it would
// be messy to modify the way that currently works. If we use the trap book on Tay,
// we should be using the Tay end game sequences.
- if (_vm->_vars["returnstackid"] == rspit) {
- _vm->changeToStack(rspit);
+ if (_vm->_vars["returnstackid"] == kStackRspit) {
+ _vm->changeToStack(kStackRspit);
_vm->changeToCard(2);
return;
}
diff --git a/engines/mohawk/riven_external.h b/engines/mohawk/riven_external.h
index 9f076325a2..58dfde1a00 100644
--- a/engines/mohawk/riven_external.h
+++ b/engines/mohawk/riven_external.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/mohawk/riven_graphics.cpp b/engines/mohawk/riven_graphics.cpp
index cd15960b85..b44fbb828e 100644
--- a/engines/mohawk/riven_graphics.cpp
+++ b/engines/mohawk/riven_graphics.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -289,7 +289,7 @@ void RivenGraphics::showInventory() {
drawInventoryImage(101, g_demoExitRect);
} else {
// We don't want to show the inventory on setup screens or in other journals.
- if (_vm->getCurStack() == aspit)
+ if (_vm->getCurStack() == kStackAspit)
return;
// There are three books and three vars. We have three different
diff --git a/engines/mohawk/riven_graphics.h b/engines/mohawk/riven_graphics.h
index 48dda28afd..577e5e6911 100644
--- a/engines/mohawk/riven_graphics.h
+++ b/engines/mohawk/riven_graphics.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/mohawk/riven_saveload.cpp b/engines/mohawk/riven_saveload.cpp
index f5bf7782d4..6af66f7a2d 100644
--- a/engines/mohawk/riven_saveload.cpp
+++ b/engines/mohawk/riven_saveload.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -38,56 +38,6 @@ Common::StringArray RivenSaveLoad::generateSaveGameList() {
return _saveFileMan->listSavefiles("*.rvn");
}
-// Note: The stack numbers we use do not match up to what the original executable,
-// so, match them ;)
-static uint16 mapOldStackIDToNew(uint16 oldID) {
- switch (oldID) {
- case 1:
- return ospit;
- case 2:
- return pspit;
- case 3:
- return rspit;
- case 4:
- return tspit;
- case 5:
- return bspit;
- case 6:
- return gspit;
- case 7:
- return jspit;
- case 8:
- return aspit;
- }
-
- error("Unknown old stack ID %d", oldID);
- return 0;
-}
-
-static uint16 mapNewStackIDToOld(uint16 newID) {
- switch (newID) {
- case aspit:
- return 8;
- case bspit:
- return 5;
- case gspit:
- return 6;
- case jspit:
- return 7;
- case ospit:
- return 1;
- case pspit:
- return 2;
- case rspit:
- return 3;
- case tspit:
- return 4;
- }
-
- error("Unknown new stack ID %d", newID);
- return 0;
-}
-
Common::Error RivenSaveLoad::loadGame(Common::String filename) {
if (_vm->getFeatures() & GF_DEMO) // Don't load games in the demo
return Common::kNoError;
@@ -141,9 +91,6 @@ Common::Error RivenSaveLoad::loadGame(Common::String filename) {
names->readUint16BE(); // Skip unknown values
uint32 curNamesPos = names->pos();
- uint16 stackID = 0;
- uint16 cardID = 0;
-
for (uint32 i = 0; i < namesCount && !names->eos(); i++) {
names->seek(curNamesPos);
names->seek(stringOffsets[i], SEEK_CUR);
@@ -165,25 +112,18 @@ Common::Error RivenSaveLoad::loadGame(Common::String filename) {
uint32 &var = _vm->_vars[name];
name.toLowercase();
- // Handle any special variables here
// WORKAROUND: time variables are reset here for one main reason:
// The save does not store any start point for the time, so we don't know the real time.
// Because of this, in many cases, the original would just give a 'free' Ytram upon saving
// since the time would be used in a new (improper) time frame.
- if (name.equalsIgnoreCase("CurrentStackID")) // Remap to our definitions, store for later
- stackID = mapOldStackIDToNew(rawVariables[i]);
- else if (name.equalsIgnoreCase("CurrentCardID")) // Store for later
- cardID = rawVariables[i];
- else if (name.equalsIgnoreCase("ReturnStackID") && var != 0) // if 0, the game did not use the variable yet
- var = mapOldStackIDToNew(rawVariables[i]);
- else if (name.contains("time")) // WORKAROUND: See above
+ if (name.contains("time"))
var = 0;
- else // Otherwise, just store it
+ else
var = rawVariables[i];
}
- _vm->changeToStack(stackID);
- _vm->changeToCard(cardID);
+ _vm->changeToStack(_vm->_vars["CurrentStackID"]);
+ _vm->changeToCard(_vm->_vars["CurrentCardID"]);
delete names;
delete[] stringOffsets;
@@ -224,14 +164,7 @@ Common::MemoryWriteStreamDynamic *RivenSaveLoad::genVARSSection() {
for (RivenVariableMap::const_iterator it = _vm->_vars.begin(); it != _vm->_vars.end(); it++) {
stream->writeUint32BE(0); // Unknown
stream->writeUint32BE(0); // Unknown
-
- // Remap returnstackid here because we don't actually want to change
- // our internal returnstackid.
- uint32 variable = it->_value;
- if (it->_key == "returnstackid")
- variable = mapNewStackIDToOld(variable);
-
- stream->writeUint32BE(variable);
+ stream->writeUint32BE(it->_value);
}
return stream;
@@ -290,7 +223,7 @@ Common::Error RivenSaveLoad::saveGame(Common::String filename) {
filename += ".rvn";
// Convert class variables to variable numbers
- _vm->_vars["currentstackid"] = mapNewStackIDToOld(_vm->getCurStack());
+ _vm->_vars["currentstackid"] = _vm->getCurStack();
_vm->_vars["currentcardid"] = _vm->getCurCard();
Common::OutSaveFile *saveFile = _saveFileMan->openForSaving(filename);
diff --git a/engines/mohawk/riven_saveload.h b/engines/mohawk/riven_saveload.h
index 37b73c26c6..a6ddce5713 100644
--- a/engines/mohawk/riven_saveload.h
+++ b/engines/mohawk/riven_saveload.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/mohawk/riven_scripts.cpp b/engines/mohawk/riven_scripts.cpp
index 352a018990..29ee5cd50b 100644
--- a/engines/mohawk/riven_scripts.cpp
+++ b/engines/mohawk/riven_scripts.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -403,7 +403,7 @@ void RivenScript::stopSound(uint16 op, uint16 argc, uint16 *argv) {
// would cause all ambient sounds not to play. An alternative
// fix would be to stop all scripts on a stack change, but this
// does fine for now.
- if (_vm->getCurStack() == tspit && (_vm->getCurCardRMAP() == 0x6e9a || _vm->getCurCardRMAP() == 0xfeeb))
+ if (_vm->getCurStack() == kStackTspit && (_vm->getCurCardRMAP() == 0x6e9a || _vm->getCurCardRMAP() == 0xfeeb))
return;
// The argument is a bitflag for the setting.
@@ -586,7 +586,7 @@ void RivenScript::activatePLST(uint16 op, uint16 argc, uint16 *argv) {
void RivenScript::activateSLST(uint16 op, uint16 argc, uint16 *argv) {
// WORKAROUND: Disable the SLST that is played during Riven's intro.
// Riven X does this too (spoke this over with Jeff)
- if (_vm->getCurStack() == tspit && _vm->getCurCardRMAP() == 0x6e9a && argv[0] == 2)
+ if (_vm->getCurStack() == kStackTspit && _vm->getCurCardRMAP() == 0x6e9a && argv[0] == 2)
return;
_vm->_sound->playSLST(argv[0], _vm->getCurCard());
diff --git a/engines/mohawk/riven_scripts.h b/engines/mohawk/riven_scripts.h
index 6df4a2e523..b669cd5081 100644
--- a/engines/mohawk/riven_scripts.h
+++ b/engines/mohawk/riven_scripts.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/mohawk/riven_vars.cpp b/engines/mohawk/riven_vars.cpp
index 8ddb76eec9..f09aba7f90 100644
--- a/engines/mohawk/riven_vars.cpp
+++ b/engines/mohawk/riven_vars.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -31,240 +31,240 @@ namespace Mohawk {
static const char *variableNames[] = {
// aspit
- "aatrusbook",
- "aatruspage",
- "acathbook",
- "acathpage",
- "acathstate",
- "adoit",
- "adomecombo",
- "agehn",
- "ainventory",
- "aova",
- "apower",
- "araw",
- "atemp",
- "atrap",
- "atrapbook",
- "auservolume",
- "azip",
+ "aAtrusBook",
+ "aAtrusPage",
+ "aCathBook",
+ "aCathPage",
+ "aCathState",
+ "aDoIt",
+ "aDomeCombo",
+ "aGehn",
+ "aInventory",
+ "aOva",
+ "aPower",
+ "aRaw",
+ "aTemp",
+ "aTrap",
+ "aTrapBook",
+ "aUserVolume",
+ "aZip",
// bspit
- "bbacklock",
- "bbait",
- "bbigbridge",
- "bbirds",
- "bblrarm",
- "bblrdoor",
- "bblrgrt",
- "bblrsw",
- "bblrvalve",
- "bblrwtr",
- "bbook",
- "bbrlever",
- "bcavedoor",
+ "bBackLock",
+ "bBait",
+ "bBigBridge",
+ "bBirds",
+ "bBlrArm",
+ "bBlrDoor",
+ "bBlrGrt",
+ "bBlrSw",
+ "bBlrValve",
+ "bBlrWtr",
+ "bBook",
+ "bBrLever",
+ "bCaveDoor",
"bcombo",
- "bcpipegr",
- "bcratergg",
- "bdome",
- "bdrwr",
- "bfans",
- "bfmdoor",
- "bidvlv",
- "blab",
- "blabbackdr",
- "blabbook",
- "blabeye",
- "blabfrontdr",
- "blabpage",
- "blever",
- "bfrontlock",
- "bheat",
- "bmagcar",
- "bpipdr",
- "bprs",
- "bstove",
- "btrap",
- "bvalve",
- "bvise",
- "bytram",
- "bytramtime",
- "bytrap",
- "bytrapped",
+ "bCPipeGr",
+ "bCraterGg",
+ "bDome",
+ "bDrwr",
+ "bFans",
+ "bFMDoor",
+ "bIdVlv",
+ "bLab",
+ "bLabBackDr",
+ "bLabBook",
+ "bLabEye",
+ "bLabFrontDr",
+ "bLabPage",
+ "bLever",
+ "bFrontLock",
+ "bHeat",
+ "bMagCar",
+ "bPipDr",
+ "bPrs",
+ "bStove",
+ "bTrap",
+ "bValve",
+ "bVise",
+ "bYtram",
+ "bYtramTime",
+ "bYtrap",
+ "bYtrapped",
// gspit
- "gbook",
- "gcathtime",
- "gcathstate",
- "gcombo",
- "gdome",
- "gemagcar",
- "gimagecurr",
+ "gBook",
+ "gCathTime",
+ "gCathState",
+ "gCombo",
+ "gDome",
+ "gEmagCar",
+ "gImageCurr",
"gimagemax",
- "gimagerot",
- "glkbtns",
- "glkbridge",
- "glkelev",
- "glview",
- "glviewmpos",
- "glviewpos",
- "gnmagrot",
- "gnmagcar",
- "gpinup",
- "gpinpos",
- "gpinsmpos",
- "grview",
- "grviewmpos",
- "grviewpos",
- "gscribe",
- "gscribetime",
- "gsubelev",
- "gsubdr",
- "gupmoov",
- "gwhark",
- "gwharktime",
+ "gImageRot",
+ "gLkBtns",
+ "gLkBridge",
+ "gLkElev",
+ "gLView",
+ "gLViewMPos",
+ "gLViewPos",
+ "gNmagRot",
+ "gNmagCar",
+ "gPinUp",
+ "gPinPos",
+ "gPinsMPos",
+ "gRView",
+ "gRViewMPos",
+ "gRViewPos",
+ "gScribe",
+ "gScribeTime",
+ "gSubElev",
+ "gSubDr",
+ "gUpMoov",
+ "gWhark",
+ "gWharkTime",
// jspit
- "jwmagcar",
- "jbeetle",
- "jbeetlepool",
- "jbook",
- "jbridge1",
- "jbridge2",
- "jbridge3",
- "jbridge4",
- "jbridge5",
- "jccb",
- "jcombo",
- "jcrg",
- "jdome",
- "jdrain",
- "jgallows",
- "jgate",
- "jgirl",
- "jiconcorrectorder",
- "jiconorder",
- "jicons",
- "jladder",
- "jleftpos",
- "jpeek",
- "jplaybeetle",
- "jprebel",
- "jprisondr",
- "jprisonsecdr",
- "jrbook",
- "jrightpos",
- "jsouthpathdr",
- "jschooldr",
- "jsub",
- "jsubdir",
- "jsubhatch",
- "jsubsw",
- "jsunners",
- "jsunnertime",
- "jthronedr",
- "jtunneldr",
- "jtunnellamps",
- "jvillagepeople",
- "jwarning",
- "jwharkpos",
- "jwharkram",
- "jwmouth",
- "jwmagcar",
- "jymagcar",
+ "jWMagCar",
+ "jBeetle",
+ "jBeetlePool",
+ "jBook",
+ "jBridge1",
+ "jBridge2",
+ "jBridge3",
+ "jBridge4",
+ "jBridge5",
+ "jCCB",
+ "jCombo",
+ "jCrg",
+ "jDome",
+ "jDrain",
+ "jGallows",
+ "jGate",
+ "jGirl",
+ "jIconCorrectOrder",
+ "jIconOrder",
+ "jIcons",
+ "jLadder",
+ "jLeftPos",
+ "jPeek",
+ "jPlayBeetle",
+ "jPRebel",
+ "jPrisonDr",
+ "jPrisonSecDr",
+ "jrBook",
+ "jRightPos",
+ "jSouthPathDr",
+ "jSchoolDr",
+ "jSub",
+ "jSubDir",
+ "jSubHatch",
+ "jSubSw",
+ "jSunners",
+ "jSunnerTime",
+ "jThroneDr",
+ "jTunnelDr",
+ "jTunnelLamps",
+ "jVillagePeople",
+ "jWarning",
+ "jWharkPos",
+ "jWharkRam",
+ "jWMouth",
+ "jWMagCar",
+ "jYMagCar",
// ospit
"oambient",
- "obutton",
+ "oButton",
"ocage",
- "odeskbook",
- "ogehnpage",
- "omusicplayer",
- "ostanddrawer",
- "ostove",
+ "oDeskBook",
+ "oGehnPage",
+ "oMusicPlayer",
+ "oStandDrawer",
+ "oStove",
// pspit
- "pbook",
- "pcage",
- "pcathcheck",
- "pcathstate",
- "pcathtime",
- "pcombo",
- "pcorrectorder",
+ "pBook",
+ "pCage",
+ "pCathCheck",
+ "pCathState",
+ "pCathTime",
+ "pCombo",
+ "pCorrectOrder",
"pdome",
- "pelevcombo",
- "pleftpos",
- "prightpos",
- "ptemp",
- "pwharkpos",
+ "pElevCombo",
+ "pLeftPos",
+ "pRightPos",
+ "pTemp",
+ "pWharkPos",
// rspit
- "rrebel",
- "rrebelview",
- "rrichard",
- "rvillagetime",
+ "rRebel",
+ "rRebelView",
+ "rRichard",
+ "rVillageTime",
// tspit
- "tbars",
- "tbeetle",
- "tblue",
- "tbook",
- "tbookvalve",
- "tcage",
- "tcombo",
- "tcorrectorder",
- "tcovercombo",
- "tdl",
- "tdome",
- "tdomeelev",
- "tdomeelevbtn",
- "tgatebrhandle",
- "tgatebridge",
- "tgatestate",
- "tgreen",
- "tgridoor",
- "tgrodoor",
- "tgrmdoor",
- "tguard",
- "timagedoor",
- "tmagcar",
- "torange",
- "tred",
- "tsecdoor",
- "tsubbridge",
- "ttelecover",
- "ttelehandle",
- "ttelepin",
- "ttelescope",
- "ttelevalve",
- "ttemple",
- "ttempledoor",
- "ttunneldoor",
- "tviewer",
- "tviolet",
- "twabrvalve",
- "twaffle",
- "tyellow",
+ "tBars",
+ "tBeetle",
+ "tBlue",
+ "tBook",
+ "tBookValve",
+ "tCage",
+ "tCombo",
+ "tCorrectOrder",
+ "tCoverCombo",
+ "tDL",
+ "tDome",
+ "tDomeElev",
+ "tDomeElevBtn",
+ "tGateBrHandle",
+ "tGateBridge",
+ "tGateState",
+ "tGreen",
+ "tGRIDoor",
+ "tGRODoor",
+ "tGRMDoor",
+ "tGuard",
+ "tImageDoor",
+ "tMagCar",
+ "tOrange",
+ "tRed",
+ "tSecDoor",
+ "tSubBridge",
+ "tTeleCover",
+ "tTeleHandle",
+ "tTelePin",
+ "tTelescope",
+ "tTeleValve",
+ "tTemple",
+ "tTempleDoor",
+ "tTunnelDoor",
+ "tViewer",
+ "tViolet",
+ "tWaBrValve",
+ "tWaffle",
+ "tYellow",
// Miscellaneous
"elevbtn1",
"elevbtn2",
"elevbtn3",
- "domecheck",
- "transitionsenabled",
- "transitionmode",
- "waterenabled",
- "rivenambients",
- "stackvarsinitialized",
- "doingsetupscreens",
+ "domeCheck",
+ "transitionsEnabled",
+ "transitionMode",
+ "waterEnabled",
+ "RivenAmbients",
+ "stackVarsInitialized",
+ "DoingSetupScreens",
"all_book",
- "playerhasbook",
- "returnstackid",
- "returncardid",
- "newpos",
- "themarble",
- "currentstackid",
- "currentcardid"
+ "playerHasBook",
+ "returnStackID",
+ "returnCardID",
+ "NewPos",
+ "theMarble",
+ "CurrentStackID",
+ "CurrentCardID"
};
uint32 &MohawkEngine_Riven::getStackVar(uint32 index) {
diff --git a/engines/mohawk/sound.cpp b/engines/mohawk/sound.cpp
index f92bebf10e..6f18d7178e 100644
--- a/engines/mohawk/sound.cpp
+++ b/engines/mohawk/sound.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/mohawk/sound.h b/engines/mohawk/sound.h
index 12a59cdedf..49f6751072 100644
--- a/engines/mohawk/sound.h
+++ b/engines/mohawk/sound.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/mohawk/video.cpp b/engines/mohawk/video.cpp
index b7e06a2b9f..cebb72e24f 100644
--- a/engines/mohawk/video.cpp
+++ b/engines/mohawk/video.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -316,7 +316,7 @@ void VideoManager::clearMLST() {
VideoHandle VideoManager::playMovieRiven(uint16 id) {
for (uint16 i = 0; i < _mlstRecords.size(); i++)
if (_mlstRecords[i].code == id) {
- debug(1, "Play tMOV %d (non-blocking) at (%d, %d) %s", _mlstRecords[i].movieID, _mlstRecords[i].left, _mlstRecords[i].top, _mlstRecords[i].loop != 0 ? "looping" : "non-looping");
+ debug(1, "Play tMOV %d (non-blocking) at (%d, %d) %s, Volume = %d", _mlstRecords[i].movieID, _mlstRecords[i].left, _mlstRecords[i].top, _mlstRecords[i].loop != 0 ? "looping" : "non-looping", _mlstRecords[i].volume);
return createVideoHandle(_mlstRecords[i].movieID, _mlstRecords[i].left, _mlstRecords[i].top, _mlstRecords[i].loop != 0, _mlstRecords[i].volume);
}
@@ -326,7 +326,7 @@ VideoHandle VideoManager::playMovieRiven(uint16 id) {
void VideoManager::playMovieBlockingRiven(uint16 id) {
for (uint16 i = 0; i < _mlstRecords.size(); i++)
if (_mlstRecords[i].code == id) {
- debug(1, "Play tMOV %d (blocking) at (%d, %d)", _mlstRecords[i].movieID, _mlstRecords[i].left, _mlstRecords[i].top);
+ debug(1, "Play tMOV %d (blocking) at (%d, %d), Volume = %d", _mlstRecords[i].movieID, _mlstRecords[i].left, _mlstRecords[i].top, _mlstRecords[i].volume);
VideoHandle videoHandle = createVideoHandle(_mlstRecords[i].movieID, _mlstRecords[i].left, _mlstRecords[i].top, false);
waitUntilMovieEnds(videoHandle);
return;
@@ -373,7 +373,7 @@ void VideoManager::disableAllMovies() {
_videoStreams[i].enabled = false;
}
-VideoHandle VideoManager::createVideoHandle(uint16 id, uint16 x, uint16 y, bool loop, byte volume) {
+VideoHandle VideoManager::createVideoHandle(uint16 id, uint16 x, uint16 y, bool loop, uint16 volume) {
// First, check to see if that video is already playing
for (uint32 i = 0; i < _videoStreams.size(); i++)
if (_videoStreams[i].id == id)
@@ -383,7 +383,7 @@ VideoHandle VideoManager::createVideoHandle(uint16 id, uint16 x, uint16 y, bool
Video::QuickTimeDecoder *decoder = new Video::QuickTimeDecoder();
decoder->setChunkBeginOffset(_vm->getResourceOffset(ID_TMOV, id));
decoder->loadStream(_vm->getResource(ID_TMOV, id));
- decoder->setVolume(volume);
+ decoder->setVolume((volume >= 256) ? 255 : volume);
VideoEntry entry;
entry.clear();
diff --git a/engines/mohawk/video.h b/engines/mohawk/video.h
index 2c4c827aa8..43181e3e6c 100644
--- a/engines/mohawk/video.h
+++ b/engines/mohawk/video.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -122,7 +122,7 @@ private:
// Keep tabs on any videos playing
Common::Array<VideoEntry> _videoStreams;
- VideoHandle createVideoHandle(uint16 id, uint16 x, uint16 y, bool loop, byte volume = 0xff);
+ VideoHandle createVideoHandle(uint16 id, uint16 x, uint16 y, bool loop, uint16 volume = 0xff);
VideoHandle createVideoHandle(const Common::String &filename, uint16 x, uint16 y, bool loop, byte volume = 0xff);
};
diff --git a/engines/mohawk/view.cpp b/engines/mohawk/view.cpp
index 719c288af5..1aaf32ea78 100644
--- a/engines/mohawk/view.cpp
+++ b/engines/mohawk/view.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/mohawk/view.h b/engines/mohawk/view.h
index 06ffe605a3..47853f056f 100644
--- a/engines/mohawk/view.h
+++ b/engines/mohawk/view.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/mortevielle/actions.cpp b/engines/mortevielle/actions.cpp
index b68dd48b0f..556475d515 100644
--- a/engines/mortevielle/actions.cpp
+++ b/engines/mortevielle/actions.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope 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.
@@ -40,7 +40,7 @@ namespace Mortevielle {
* @remarks Originally called 'taller'
*/
void MortevielleEngine::fctMove() {
- int oldMenu = (_menu._moveMenu[6]._menuId << 8) | _menu._moveMenu[6]._actionId;
+ int oldMenu = (_menu->_moveMenu[6]._menuId << 8) | _menu->_moveMenu[6]._actionId;
if ((_coreVar._currPlace == ROOM26) && (_currAction == oldMenu)) {
_coreVar._currPlace = LANDING;
_caff = _coreVar._currPlace;
@@ -65,10 +65,10 @@ void MortevielleEngine::fctMove() {
if (_num == 1) {
_coreVar._currPlace = OWN_ROOM;
- _menu.setDestinationText(OWN_ROOM);
+ _menu->setDestinationText(OWN_ROOM);
} else if (_num == 7) {
_coreVar._currPlace = ATTIC;
- _menu.setDestinationText(ATTIC);
+ _menu->setDestinationText(ATTIC);
} else if (_num != 6)
_coreVar._currPlace = ROOM26;
@@ -85,10 +85,10 @@ void MortevielleEngine::fctMove() {
}
exitRoom();
int menuChoice = 1;
- oldMenu = (_menu._moveMenu[menuChoice]._menuId << 8) | _menu._moveMenu[menuChoice]._actionId;
+ oldMenu = (_menu->_moveMenu[menuChoice]._menuId << 8) | _menu->_moveMenu[menuChoice]._actionId;
while (oldMenu != _currAction) {
++menuChoice;
- oldMenu = (_menu._moveMenu[menuChoice]._menuId << 8) | _menu._moveMenu[menuChoice]._actionId;
+ oldMenu = (_menu->_moveMenu[menuChoice]._menuId << 8) | _menu->_moveMenu[menuChoice]._actionId;
}
switch (_coreVar._currPlace) {
@@ -97,14 +97,14 @@ void MortevielleEngine::fctMove() {
gotoManorFront();
else if (menuChoice == 2)
checkManorDistance();
- _menu.setDestinationText(_coreVar._currPlace);
+ _menu->setDestinationText(_coreVar._currPlace);
return;
case INSIDE_WELL:
if (menuChoice == 1)
floodedInWell();
else if (menuChoice == 2)
gotoManorBack();
- _menu.setDestinationText(_coreVar._currPlace);
+ _menu->setDestinationText(_coreVar._currPlace);
return;
case BUREAU:
if (menuChoice == 1)
@@ -193,7 +193,7 @@ void MortevielleEngine::fctMove() {
if ((menuChoice < 5) || (menuChoice == 13) || (menuChoice == 14))
prepareDisplayText();
resetRoomVariables(_coreVar._currPlace);
- _menu.setDestinationText(_coreVar._currPlace);
+ _menu->setDestinationText(_coreVar._currPlace);
}
/**
@@ -208,23 +208,32 @@ void MortevielleEngine::fctTake() {
if (_currBitIndex > 0)
_coreVar._faithScore += 3;
if (_obpart) {
- if (_coreVar._currPlace == PURPLE_ROOM)
+ switch (_coreVar._currPlace) {
+ case PURPLE_ROOM:
_coreVar._purpleRoomObjectId = 0;
- if (_coreVar._currPlace == ATTIC) {
+ break;
+ case ATTIC:
if (_coreVar._atticBallHoleObjectId == _caff)
_coreVar._atticBallHoleObjectId = 0;
if (_coreVar._atticRodHoleObjectId == _caff)
_coreVar._atticRodHoleObjectId = 0;
- }
- if (_coreVar._currPlace == CELLAR)
+ break;
+ case CELLAR:
_coreVar._cellarObjectId = 0;
- if (_coreVar._currPlace == CRYPT)
+ break;
+ case CRYPT:
_coreVar._cryptObjectId = 0;
- if (_coreVar._currPlace == SECRET_PASSAGE)
+ break;
+ case SECRET_PASSAGE:
_coreVar._secretPassageObjectId = 0;
- if (_coreVar._currPlace == WELL)
+ break;
+ case WELL:
_coreVar._wellObjectId = 0;
- _menu.unsetSearchMenu();
+ break;
+ default:
+ break;
+ }
+ _menu->unsetSearchMenu();
_obpart = false;
prepareDisplayText();
} else {
@@ -258,38 +267,54 @@ void MortevielleEngine::fctTake() {
if (_currBitIndex > 0)
_coreVar._faithScore += 3;
_crep = 997;
- if ((_coreVar._currPlace == PURPLE_ROOM) && (_coreVar._purpleRoomObjectId != 0))
- putInHand(_coreVar._purpleRoomObjectId);
- if ((_coreVar._currPlace == ATTIC) && (_num == 1) && (_coreVar._atticBallHoleObjectId != 0)) {
- putInHand(_coreVar._atticBallHoleObjectId);
- if ((_crep != 997) && (_crep != 139))
- displayAnimFrame(2, 7);
- }
- if ((_coreVar._currPlace == ATTIC) && (_num == 2) && (_coreVar._atticRodHoleObjectId != 0)) {
- putInHand(_coreVar._atticRodHoleObjectId);
- if ((_crep != 997) && (_crep != 139))
- displayAnimFrame(2, 6);
- }
- if ((_coreVar._currPlace == CELLAR) && (_coreVar._cellarObjectId != 0)) {
- putInHand(_coreVar._cellarObjectId);
- if ((_crep != 997) && (_crep != 139))
- displayAnimFrame(2, 2);
- }
- if ((_coreVar._currPlace == CRYPT) && (_coreVar._cryptObjectId != 0))
- putInHand(_coreVar._cryptObjectId);
-
- if ((_coreVar._currPlace == SECRET_PASSAGE) && (_coreVar._secretPassageObjectId != 0)) {
- putInHand(_coreVar._secretPassageObjectId);
- if ((_crep != 997) && (_crep != 139)) {
- _crep = 182;
- displayAnimFrame(2, 1);
+
+ switch (_coreVar._currPlace) {
+ case PURPLE_ROOM:
+ if (_coreVar._purpleRoomObjectId != 0)
+ putInHand(_coreVar._purpleRoomObjectId);
+ break;
+ case ATTIC:
+ if ((_num == 1) && (_coreVar._atticBallHoleObjectId != 0)) {
+ putInHand(_coreVar._atticBallHoleObjectId);
+ if ((_crep != 997) && (_crep != 139))
+ displayAnimFrame(2, 7);
+ } else if ((_num == 2) && (_coreVar._atticRodHoleObjectId != 0)) {
+ putInHand(_coreVar._atticRodHoleObjectId);
+ if ((_crep != 997) && (_crep != 139))
+ displayAnimFrame(2, 6);
}
+ break;
+ case CELLAR:
+ if (_coreVar._cellarObjectId != 0) {
+ putInHand(_coreVar._cellarObjectId);
+ if ((_crep != 997) && (_crep != 139))
+ displayAnimFrame(2, 2);
+ }
+ break;
+ case CRYPT:
+ if (_coreVar._cryptObjectId != 0)
+ putInHand(_coreVar._cryptObjectId);
+ break;
+ case SECRET_PASSAGE:
+ if (_coreVar._secretPassageObjectId != 0) {
+ putInHand(_coreVar._secretPassageObjectId);
+ if ((_crep != 997) && (_crep != 139)) {
+ _crep = 182;
+ displayAnimFrame(2, 1);
+ }
+ }
+ break;
+ case WELL:
+ if (_coreVar._wellObjectId != 0) {
+ putInHand(_coreVar._wellObjectId);
+ if ((_crep != 997) && (_crep != 139))
+ displayAnimFrame(2, 1);
+ }
+ break;
+ default:
+ break;
}
- if ((_coreVar._currPlace == WELL) && (_coreVar._wellObjectId != 0)) {
- putInHand(_coreVar._wellObjectId);
- if ((_crep != 997) && (_crep != 139))
- displayAnimFrame(2, 1);
- }
+
if ((_crep != 997) && (_crep != 182) && (_crep != 139))
_crep = 999;
}
@@ -325,7 +350,7 @@ void MortevielleEngine::fctInventoryTake() {
int oldMenu = 0;
do {
++inventIndex;
- oldMenu = (_menu._inventoryMenu[inventIndex]._menuId << 8) | _menu._inventoryMenu[inventIndex]._actionId;
+ oldMenu = (_menu->_inventoryMenu[inventIndex]._menuId << 8) | _menu->_inventoryMenu[inventIndex]._actionId;
} while (oldMenu != _currAction);
int cz = 0;
int cy = 0;
@@ -336,7 +361,7 @@ void MortevielleEngine::fctInventoryTake() {
} while (cz != inventIndex);
cz = _coreVar._inventory[cy];
_coreVar._inventory[cy] = 0;
- _menu.setInventoryText();
+ _menu->setInventoryText();
putInHand(cz);
_crep = 998;
clearDescriptionBar();
@@ -456,13 +481,24 @@ void MortevielleEngine::fctLook() {
}
return;
}
+
int cx = _coreVar._currPlace;
- if (_coreVar._currPlace == CHAPEL)
+ switch (_coreVar._currPlace) {
+ case CHAPEL:
cx = 17;
- if ((_coreVar._currPlace > MANOR_FRONT) && (_coreVar._currPlace < DOOR))
+ break;
+ case MANOR_BACK:
+ case INSIDE_WELL:
+ case WELL:
cx -= 4;
- if (_coreVar._currPlace == ROOM26)
+ break;
+ case ROOM26:
cx = 21;
+ break;
+ default:
+ break;
+ }
+
_crep = _tabdon[kArega + (cx * 7) + _num - 1];
if ((_coreVar._currPlace == ATTIC) && (_num == 8))
_crep = 126;
@@ -536,7 +572,7 @@ void MortevielleEngine::fctSearch() {
if (_curSearchObjId != 0) {
_searchCount = 0;
_heroSearching = true;
- _menu.setSearchMenu();
+ _menu->setSearchMenu();
prepareNextObject();
} else
_crep = 997;
@@ -607,7 +643,7 @@ void MortevielleEngine::fctOpen() {
if (_caff == ROOM26) {
if (_roomDoorId != OWN_ROOM) {
- _currAction = _menu._opcodeEnter;
+ _currAction = _menu->_opcodeEnter;
_syn = true;
} else
_crep = 997;
@@ -663,11 +699,11 @@ void MortevielleEngine::fctOpen() {
|| (_coreVar._currPlace == PURPLE_ROOM)
|| (_coreVar._currPlace == BLUE_ROOM)) {
if (getRandomNumber(1, 4) == 3)
- _soundManager.startSpeech(7, 9, 1);
+ _soundManager->startSpeech(7, 9, 1);
}
_openObjects[i] = _num;
displayAnimFrame(1, _num);
- _soundManager.waitSpeech();
+ _soundManager->waitSpeech();
}
int tmpPlace = _coreVar._currPlace;
if (_coreVar._currPlace == CRYPT)
@@ -731,21 +767,21 @@ void MortevielleEngine::fctPlace() {
displayAnimFrame(1, 1);
handleDescriptionText(2, 165);
displayEmptyHand();
- _soundManager.startSpeech(6, -9, 1);
+ _soundManager->startSpeech(6, -9, 1);
// Do you want to enter the hidden passage?
- int answer = _dialogManager.show(getEngineString(S_YES_NO));
+ int answer = _dialogManager->show(getEngineString(S_YES_NO));
if (answer == 1) {
Common::String alertTxt = getString(582);
- _dialogManager.show(alertTxt);
+ _dialogManager->show(alertTxt);
- bool enterPassageFl = _dialogManager.showKnowledgeCheck();
- _mouse.hideMouse();
+ bool enterPassageFl = _dialogManager->showKnowledgeCheck();
+ _mouse->hideMouse();
clearScreen();
drawRightFrame();
clearDescriptionBar();
clearVerbBar();
- _mouse.showMouse();
+ _mouse->showMouse();
prepareRoom();
drawClock();
if (_currBitIndex != 0)
@@ -753,18 +789,18 @@ void MortevielleEngine::fctPlace() {
else
displayAloneText();
- _menu.displayMenu();
+ _menu->displayMenu();
if (enterPassageFl) {
_coreVar._currPlace = SECRET_PASSAGE;
- _menu.setDestinationText(SECRET_PASSAGE);
+ _menu->setDestinationText(SECRET_PASSAGE);
} else {
- _menu.setDestinationText(_coreVar._currPlace);
+ _menu->setDestinationText(_coreVar._currPlace);
setPal(14);
drawPicture();
displayAnimFrame(1, 2);
displayAnimFrame(1, 1);
alertTxt = getString(577);
- _dialogManager.show(alertTxt);
+ _dialogManager->show(alertTxt);
displayAnimFrame(2, 1);
_crep = 166;
}
@@ -832,8 +868,8 @@ void MortevielleEngine::fctTurn() {
_crep = 997;
if ((_coreVar._currPlace == ATTIC) && (_coreVar._atticRodHoleObjectId == 159) && (_coreVar._atticBallHoleObjectId == 141)) {
handleDescriptionText(2, 167);
- _soundManager.startSpeech(7, 9, 1);
- int answer = _dialogManager.show(getEngineString(S_YES_NO));
+ _soundManager->startSpeech(7, 9, 1);
+ int answer = _dialogManager->show(getEngineString(S_YES_NO));
if (answer == 1)
_endGame = true;
else
@@ -842,8 +878,8 @@ void MortevielleEngine::fctTurn() {
if ((_coreVar._currPlace == SECRET_PASSAGE) && (_coreVar._secretPassageObjectId == 143)) {
handleDescriptionText(2, 175);
clearVerbBar();
- _soundManager.startSpeech(6, -9, 1);
- int answer = _dialogManager.show(getEngineString(S_YES_NO));
+ _soundManager->startSpeech(6, -9, 1);
+ int answer = _dialogManager->show(getEngineString(S_YES_NO));
if (answer == 1) {
_coreVar._currPlace = CRYPT;
prepareDisplayText();
@@ -949,7 +985,7 @@ void MortevielleEngine::fctKnock() {
displayTextInVerbBar(getEngineString(S_HIT));
if (_coreVar._currPlace == LANDING) {
- _dialogManager.show(getEngineString(S_BEFORE_USE_DEP_MENU));
+ _dialogManager->show(getEngineString(S_BEFORE_USE_DEP_MENU));
return;
}
@@ -967,7 +1003,7 @@ void MortevielleEngine::fctKnock() {
if (_coreVar._currPlace == ROOM26) {
int rand = (getRandomNumber(0, 8)) - 4;
- _soundManager.startSpeech(11, rand, 1);
+ _soundManager->startSpeech(11, rand, 1);
int pres = getPresenceStats(rand, _coreVar._faithScore, _roomDoorId);
if (_roomDoorId != OWN_ROOM) {
if (pres != -500) {
@@ -1132,7 +1168,7 @@ void MortevielleEngine::fctEat() {
_coreVar._currPlace = DINING_ROOM;
_caff = DINING_ROOM;
resetRoomVariables(_coreVar._currPlace);
- _menu.setDestinationText(_coreVar._currPlace);
+ _menu->setDestinationText(_coreVar._currPlace);
int day, hour, minute;
updateHour(day, hour, minute);
@@ -1168,7 +1204,7 @@ void MortevielleEngine::fctEat() {
void MortevielleEngine::fctEnter() {
if ((_coreVar._currPlace == MANOR_FRONT) || (_coreVar._currPlace == MANOR_BACK)) {
gotoDiningRoom();
- _menu.setDestinationText(_coreVar._currPlace);
+ _menu->setDestinationText(_coreVar._currPlace);
} else if (_coreVar._currPlace == LANDING)
showMoveMenuAlert();
else if (_roomDoorId == OWN_ROOM)
@@ -1178,22 +1214,22 @@ void MortevielleEngine::fctEnter() {
_coreVar._availableQuestion[8] = '*';
} else {
int pres = 0;
- if (!_blo)
+ if (!_outsideOnlyFl)
pres = getPresence(_roomDoorId);
if (pres != 0) {
if ((_roomDoorId == TOILETS) || (_roomDoorId == BATHROOM))
_crep = 179;
else {
int randVal = (getRandomNumber(0, 10)) - 5;
- _soundManager.startSpeech(7, randVal, 1);
+ _soundManager->startSpeech(7, randVal, 1);
displayAnimFrame(1, 1);
- _soundManager.waitSpeech();
+ _soundManager->waitSpeech();
int charIndex = convertBitIndexToCharacterIndex(pres);
++_coreVar._faithScore;
_coreVar._currPlace = LANDING;
_currMenu = MENU_DISCUSS;
- _currAction = (_menu._discussMenu[charIndex]._menuId << 8) | _menu._discussMenu[charIndex]._actionId;
+ _currAction = (_menu->_discussMenu[charIndex]._menuId << 8) | _menu->_discussMenu[charIndex]._actionId;
_syn = true;
if (_roomDoorId == JULIA_ROOM) {
_col = true;
@@ -1207,14 +1243,14 @@ void MortevielleEngine::fctEnter() {
}
} else {
int randVal = (getRandomNumber(0, 10)) - 5;
- _soundManager.startSpeech(7, randVal, 1);
+ _soundManager->startSpeech(7, randVal, 1);
displayAnimFrame(1, 1);
- _soundManager.waitSpeech();
+ _soundManager->waitSpeech();
_coreVar._currPlace = _roomDoorId;
prepareDisplayText();
resetRoomVariables(_coreVar._currPlace);
- _menu.setDestinationText(_coreVar._currPlace);
+ _menu->setDestinationText(_coreVar._currPlace);
_roomDoorId = OWN_ROOM;
_savedBitIndex = 0;
_currBitIndex = 0;
@@ -1237,7 +1273,7 @@ void MortevielleEngine::fctSleep() {
prepareDisplayText();
drawPictureWithText();
resetRoomVariables(_coreVar._currPlace);
- _menu.setDestinationText(_coreVar._currPlace);
+ _menu->setDestinationText(_coreVar._currPlace);
}
clearVerbBar();
clearDescriptionBar();
@@ -1261,7 +1297,7 @@ void MortevielleEngine::fctSleep() {
if (hour > 23)
hour = 0;
prepareRoom();
- answer = _dialogManager.show(getEngineString(S_YES_NO));
+ answer = _dialogManager->show(getEngineString(S_YES_NO));
_anyone = false;
} while (answer != 1);
_crep = 998;
@@ -1321,7 +1357,7 @@ void MortevielleEngine::fctLeave() {
if (_crep == 0)
_crep = nextPlace;
resetRoomVariables(nextPlace);
- _menu.setDestinationText(nextPlace);
+ _menu->setDestinationText(nextPlace);
}
}
@@ -1337,7 +1373,7 @@ void MortevielleEngine::fctWait() {
do {
++_currentHourCount;
prepareRoom();
- if (!_blo)
+ if (!_outsideOnlyFl)
getPresence(_coreVar._currPlace);
if ((_currBitIndex != 0) && (_savedBitIndex == 0)) {
_crep = 998;
@@ -1351,7 +1387,7 @@ void MortevielleEngine::fctWait() {
return;
}
handleDescriptionText(2, 102);
- answer = _dialogManager.show(getEngineString(S_YES_NO));
+ answer = _dialogManager->show(getEngineString(S_YES_NO));
} while (answer != 2);
_crep = 998;
if (!_anyone)
@@ -1394,7 +1430,7 @@ void MortevielleEngine::fctDiscuss() {
int oldMenu;
do {
++cx;
- oldMenu = (_menu._discussMenu[cx]._menuId << 8) | _menu._discussMenu[cx]._actionId;
+ oldMenu = (_menu->_discussMenu[cx]._menuId << 8) | _menu->_discussMenu[cx]._actionId;
} while (oldMenu != _currAction);
_caff = 69 + cx;
drawPictureWithText();
@@ -1403,7 +1439,7 @@ void MortevielleEngine::fctDiscuss() {
}
testKey(false);
menuUp();
- _mouse.hideMouse();
+ _mouse->hideMouse();
clearScreen();
drawDiscussionBox();
startDialog(displId);
@@ -1417,13 +1453,13 @@ void MortevielleEngine::fctDiscuss() {
}
lib[46] = lib[45];
lib[45] = ' ';
- _mouse.showMouse();
+ _mouse->showMouse();
do {
choice = 0;
int posX = 0;
int posY = 0;
for (int icm = 1; icm < 43; icm++) {
- _screenSurface.putxy(posX, posY);
+ _screenSurface->putxy(posX, posY);
if (_coreVar._availableQuestion[icm] == '*') {
// If question already asked, write it in reverse video
if (questionAsked[icm])
@@ -1438,17 +1474,17 @@ void MortevielleEngine::fctDiscuss() {
} else
posY += 8;
}
- _screenSurface.putxy(320, 176);
+ _screenSurface->putxy(320, 176);
displayQuestionText(lib[46], 0);
char retKey = '\0';
bool click;
do {
bool dummyFl;
- _mouse.moveMouse(dummyFl, retKey);
+ _mouse->moveMouse(dummyFl, retKey);
if (shouldQuit())
return;
- _mouse.getMousePosition(x, y, click);
+ _mouse->getMousePosition(x, y, click);
x *= (3 - kResolutionScaler);
if (x > 319)
cx = 41;
@@ -1462,7 +1498,7 @@ void MortevielleEngine::fctDiscuss() {
posX = 320;
else
posX = 0;
- _screenSurface.putxy(posX, posY);
+ _screenSurface->putxy(posX, posY);
if (questionAsked[choice])
displayQuestionText(lib[choice], 0);
else
@@ -1481,7 +1517,7 @@ void MortevielleEngine::fctDiscuss() {
posX = 320;
else
posX = 0;
- _screenSurface.putxy(posX, posY);
+ _screenSurface->putxy(posX, posY);
if (questionAsked[choice])
displayQuestionText(lib[choice], 0);
else
@@ -1494,7 +1530,7 @@ void MortevielleEngine::fctDiscuss() {
posX = 320;
else
posX = 0;
- _screenSurface.putxy(posX, posY);
+ _screenSurface->putxy(posX, posY);
if (questionAsked[ix])
displayQuestionText(lib[ix], 0);
else
@@ -1533,11 +1569,11 @@ void MortevielleEngine::fctDiscuss() {
_coreVar._faithScore += 3;
displId = 139;
}
- _mouse.hideMouse();
+ _mouse->hideMouse();
clearScreen();
drawDiscussionBox();
startDialog(displId);
- _mouse.showMouse();
+ _mouse->showMouse();
if ((displId == 84) || (displId == 86)) {
_coreVar._pctHintFound[5] = '*';
_coreVar._availableQuestion[7] = '*';
@@ -1551,32 +1587,32 @@ void MortevielleEngine::fctDiscuss() {
_coreVar._pctHintFound[8] = '*';
_coreVar._availableQuestion[32] = '*';
}
- _mouse.hideMouse();
+ _mouse->hideMouse();
clearScreen();
- _mouse.showMouse();
+ _mouse->showMouse();
}
} while ((choice != 46) && (displId != 138));
if (_col) {
_coreVar._faithScore += (3 * (_coreVar._faithScore / 10));
- _mouse.hideMouse();
+ _mouse->hideMouse();
clearScreen();
drawDiscussionBox();
startDialog(138);
- _mouse.showMouse();
+ _mouse->showMouse();
_col = false;
_coreVar._currPlace = LANDING;
}
_controlMenu = 0;
- _mouse.hideMouse();
+ _mouse->hideMouse();
clearScreen();
drawRightFrame();
- _mouse.showMouse();
+ _mouse->showMouse();
showPeoplePresent(_currBitIndex);
prepareRoom();
drawClock();
prepareDisplayText();
/* chech;*/
- _menu.setDestinationText(_coreVar._currPlace);
+ _menu->setDestinationText(_coreVar._currPlace);
clearVerbBar();
}
@@ -1625,13 +1661,13 @@ void MortevielleEngine::endGame() {
clearVerbBar();
handleDescriptionText(9, 1509);
testKey(false);
- _mouse.hideMouse();
+ _mouse->hideMouse();
_caff = 70;
- _text.taffich();
+ _text->taffich();
clearScreen();
drawDiscussionBox();
startDialog(141);
- _mouse.showMouse();
+ _mouse->showMouse();
clearUpperLeftPart();
handleDescriptionText(9, 1509);
handleDescriptionText(2, 142);
@@ -1667,7 +1703,7 @@ void MortevielleEngine::askRestart() {
_day = 0;
handleDescriptionText(2, 180);
- int answer = _dialogManager.show(getEngineString(S_YES_NO));
+ int answer = _dialogManager->show(getEngineString(S_YES_NO));
_quitGame = (answer != 1);
}
diff --git a/engines/mortevielle/configure.engine b/engines/mortevielle/configure.engine
new file mode 100644
index 0000000000..a7fb2ccda6
--- /dev/null
+++ b/engines/mortevielle/configure.engine
@@ -0,0 +1,3 @@
+# This file is included from the main "configure" script
+# add_engine [name] [desc] [build-by-default] [subengines] [base games] [deps]
+add_engine mortevielle "Mortevielle" yes
diff --git a/engines/mortevielle/debugger.cpp b/engines/mortevielle/debugger.cpp
index 4ef5151c81..b2c99b894a 100644
--- a/engines/mortevielle/debugger.cpp
+++ b/engines/mortevielle/debugger.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope 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.
@@ -25,10 +25,11 @@
namespace Mortevielle {
-Debugger::Debugger() : GUI::Debugger() {
- DCmd_Register("continue", WRAP_METHOD(Debugger, Cmd_Exit));
- DCmd_Register("show_questions", WRAP_METHOD(Debugger, Cmd_showAllQuestions));
- DCmd_Register("reset_parano", WRAP_METHOD(Debugger, Cmd_resetParano));
+Debugger::Debugger(MortevielleEngine *vm) : GUI::Debugger() {
+ _vm = vm;
+ registerCmd("continue", WRAP_METHOD(Debugger, cmdExit));
+ registerCmd("show_questions", WRAP_METHOD(Debugger, Cmd_showAllQuestions));
+ registerCmd("reset_parano", WRAP_METHOD(Debugger, Cmd_resetParano));
}
bool Debugger::Cmd_showAllQuestions(int argc, const char **argv) {
@@ -52,8 +53,4 @@ bool Debugger::Cmd_resetParano(int argc, const char **argv) {
return true;
}
-void Debugger::setParent(MortevielleEngine *vm) {
- _vm = vm;
-}
-
} // End of namespace Mortevielle
diff --git a/engines/mortevielle/debugger.h b/engines/mortevielle/debugger.h
index 9041d90110..66f5afef9d 100644
--- a/engines/mortevielle/debugger.h
+++ b/engines/mortevielle/debugger.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope 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.
@@ -39,9 +39,8 @@ protected:
bool Cmd_resetParano(int argc, const char **argv);
public:
- Debugger();
+ Debugger(MortevielleEngine *vm);
virtual ~Debugger() {}
- void setParent(MortevielleEngine *vm);
};
} // End of namespace Mortevielle
diff --git a/engines/mortevielle/detection.cpp b/engines/mortevielle/detection.cpp
index ee9cb40c99..b6c27e6b12 100644
--- a/engines/mortevielle/detection.cpp
+++ b/engines/mortevielle/detection.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope 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.
diff --git a/engines/mortevielle/detection_tables.h b/engines/mortevielle/detection_tables.h
index 8d0cd5630c..3e1e5aaefe 100644
--- a/engines/mortevielle/detection_tables.h
+++ b/engines/mortevielle/detection_tables.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/mortevielle/dialogs.cpp b/engines/mortevielle/dialogs.cpp
index 9a2ade60ab..89098fabe5 100644
--- a/engines/mortevielle/dialogs.cpp
+++ b/engines/mortevielle/dialogs.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope 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.
@@ -35,15 +35,19 @@
namespace Mortevielle {
+DialogManager::DialogManager(MortevielleEngine *vm) {
+ _vm = vm;
+}
+
/**
* Alert function - Show
* @remarks Originally called 'do_alert'
*/
int DialogManager::show(const Common::String &msg) {
// Make a copy of the current screen surface for later restore
- _vm->_backgroundSurface.copyFrom(_vm->_screenSurface);
+ _vm->_backgroundSurface.copyFrom(*_vm->_screenSurface);
- _vm->_mouse.hideMouse();
+ _vm->_mouse->hideMouse();
while (_vm->keyPressed())
_vm->getChar();
@@ -63,7 +67,7 @@ int DialogManager::show(const Common::String &msg) {
} else {
drawAlertBox(8, 7, colNumb);
int i = 0;
- _vm->_screenSurface._textPos.y = 70;
+ _vm->_screenSurface->_textPos.y = 70;
do {
curPos.x = 320;
Common::String displayStr = "";
@@ -72,9 +76,9 @@ int DialogManager::show(const Common::String &msg) {
displayStr += alertStr[i];
curPos.x -= 3;
}
- _vm->_screenSurface.putxy(curPos.x, _vm->_screenSurface._textPos.y);
- _vm->_screenSurface._textPos.y += 6;
- _vm->_screenSurface.drawString(displayStr, 4);
+ _vm->_screenSurface->putxy(curPos.x, _vm->_screenSurface->_textPos.y);
+ _vm->_screenSurface->_textPos.y += 6;
+ _vm->_screenSurface->drawString(displayStr, 4);
++i;
} while (alertStr[i] != ']');
}
@@ -99,17 +103,17 @@ int DialogManager::show(const Common::String &msg) {
limit[2][1] = ((uint)(320 + ((uint)esp >> 1)) / 2) * kResolutionScaler;
limit[2][2] = (limit[2][1]) + 40;
}
- _vm->_mouse.showMouse();
+ _vm->_mouse->showMouse();
int id = 0;
bool dummyFl = false;
bool test3;
do {
char dummyKey = '\377';
- _vm->_mouse.moveMouse(dummyFl, dummyKey);
+ _vm->_mouse->moveMouse(dummyFl, dummyKey);
if (_vm->shouldQuit())
return 0;
- curPos = _vm->_mouse._pos;
+ curPos = _vm->_mouse->_pos;
bool newaff = false;
if ((curPos.y > 95) && (curPos.y < 105)) {
bool test1 = (curPos.x > limit[1][1]) && (curPos.x < limit[1][2]);
@@ -125,56 +129,56 @@ int DialogManager::show(const Common::String &msg) {
else
ix = 2;
if (ix != id) {
- _vm->_mouse.hideMouse();
+ _vm->_mouse->hideMouse();
if (id != 0) {
setPosition(id, coldep, esp);
Common::String tmpStr(" ");
tmpStr += buttonStr[id];
tmpStr += " ";
- _vm->_screenSurface.drawString(tmpStr, 0);
+ _vm->_screenSurface->drawString(tmpStr, 0);
}
setPosition(ix, coldep, esp);
Common::String tmp2 = " ";
tmp2 += buttonStr[ix];
tmp2 += " ";
- _vm->_screenSurface.drawString(tmp2, 1);
+ _vm->_screenSurface->drawString(tmp2, 1);
id = ix;
- _vm->_mouse.showMouse();
+ _vm->_mouse->showMouse();
}
}
}
if ((id != 0) && !newaff) {
- _vm->_mouse.hideMouse();
+ _vm->_mouse->hideMouse();
setPosition(id, coldep, esp);
Common::String tmp3(" ");
tmp3 += buttonStr[id];
tmp3 += " ";
- _vm->_screenSurface.drawString(tmp3, 0);
+ _vm->_screenSurface->drawString(tmp3, 0);
id = 0;
- _vm->_mouse.showMouse();
+ _vm->_mouse->showMouse();
}
test3 = (curPos.y > 95) && (curPos.y < 105) && (((curPos.x > limit[1][1]) && (curPos.x < limit[1][2]))
|| ((curPos.x > limit[2][1]) && (curPos.x < limit[2][2])));
} while (!_vm->getMouseClick());
_vm->setMouseClick(false);
- _vm->_mouse.hideMouse();
+ _vm->_mouse->hideMouse();
if (!test3) {
id = 1;
setPosition(1, coldep, esp);
Common::String tmp4(" ");
tmp4 += buttonStr[1];
tmp4 += " ";
- _vm->_screenSurface.drawString(tmp4, 1);
+ _vm->_screenSurface->drawString(tmp4, 1);
}
- _vm->_mouse.showMouse();
+ _vm->_mouse->showMouse();
/* Restore the background area */
- _vm->_screenSurface.copyFrom(_vm->_backgroundSurface, 0, 0);
+ _vm->_screenSurface->copyFrom(_vm->_backgroundSurface, 0, 0);
return id;
}
@@ -221,7 +225,7 @@ void DialogManager::decodeAlertDetails(Common::String inputStr, int &choiceNumb,
}
void DialogManager::setPosition(int ji, int coldep, int esp) {
- _vm->_screenSurface.putxy(coldep + (40 + esp) * (ji - 1), 98);
+ _vm->_screenSurface->putxy(coldep + (40 + esp) * (ji - 1), 98);
}
/**
@@ -235,9 +239,9 @@ void DialogManager::drawAlertBox(int firstLine, int lineNum, int width) {
int y = (firstLine - 1) * 8;
int xx = x + width;
int yy = y + (lineNum * 8);
- _vm->_screenSurface.fillRect(15, Common::Rect(x, y, xx, yy));
- _vm->_screenSurface.fillRect(0, Common::Rect(x, y + 2, xx, y + 4));
- _vm->_screenSurface.fillRect(0, Common::Rect(x, yy - 4, xx, yy - 2));
+ _vm->_screenSurface->fillRect(15, Common::Rect(x, y, xx, yy));
+ _vm->_screenSurface->fillRect(0, Common::Rect(x, y + 2, xx, y + 4));
+ _vm->_screenSurface->fillRect(0, Common::Rect(x, yy - 4, xx, yy - 2));
}
/**
@@ -259,13 +263,13 @@ void DialogManager::setButtonText(Common::String c, int coldep, int nbcase, Comm
while (str[l].size() < 3)
str[l] += ' ';
- _vm->_screenSurface.putxy(x, 98);
+ _vm->_screenSurface->putxy(x, 98);
Common::String tmp(" ");
tmp += str[l];
tmp += " ";
- _vm->_screenSurface.drawString(tmp, 0);
+ _vm->_screenSurface->drawString(tmp, 0);
x += esp + 40;
}
}
@@ -288,17 +292,17 @@ bool DialogManager::showKnowledgeCheck() {
Common::String choiceArray[15];
- int currChoice, prevChoice;
+ int currChoice;
int correctCount = 0;
for (int indx = 0; indx < 10; ++indx) {
- _vm->_mouse.hideMouse();
+ _vm->_mouse->hideMouse();
_vm->clearScreen();
- _vm->_mouse.showMouse();
+ _vm->_mouse->showMouse();
int dialogHeight = 23;
- _vm->_screenSurface.fillRect(15, Common::Rect(0, 14, 630, dialogHeight));
+ _vm->_screenSurface->fillRect(15, Common::Rect(0, 14, 630, dialogHeight));
Common::String tmpStr = _vm->getString(textIndexArr[indx]);
- _vm->_text.displayStr(tmpStr, 20, 15, 100, 2, 0);
+ _vm->_text->displayStr(tmpStr, 20, 15, 100, 2, 0);
int firstOption;
int lastOption;
@@ -313,12 +317,12 @@ bool DialogManager::showKnowledgeCheck() {
int optionPosY = 35;
int maxLength = 0;
- prevChoice = 1;
+ int prevChoice = 1;
for (int j = firstOption; j <= lastOption; ++j, ++prevChoice) {
tmpStr = _vm->getString(j);
if ((int) tmpStr.size() > maxLength)
maxLength = tmpStr.size();
- _vm->_text.displayStr(tmpStr, 100, optionPosY, 100, 1, 0);
+ _vm->_text->displayStr(tmpStr, 100, optionPosY, 100, 1, 0);
choiceArray[prevChoice] = tmpStr;
optionPosY += 8;
}
@@ -333,7 +337,7 @@ bool DialogManager::showKnowledgeCheck() {
}
coor[lastOption - firstOption + 2]._enabled = false;
int rep = 6;
- _vm->_screenSurface.drawBox(80, 33, 40 + (maxLength * rep), (lastOption - firstOption) * 8 + 16, 15);
+ _vm->_screenSurface->drawBox(80, 33, 40 + (maxLength * rep), (lastOption - firstOption) * 8 + 16, 15);
rep = 0;
prevChoice = 0;
@@ -342,26 +346,26 @@ bool DialogManager::showKnowledgeCheck() {
_vm->setMouseClick(false);
bool flag;
char key;
- _vm->_mouse.moveMouse(flag, key);
+ _vm->_mouse->moveMouse(flag, key);
if (_vm->shouldQuit())
return false;
currChoice = 1;
- while (coor[currChoice]._enabled && !_vm->_mouse.isMouseIn(coor[currChoice]._rect))
+ while (coor[currChoice]._enabled && !_vm->_mouse->isMouseIn(coor[currChoice]._rect))
++currChoice;
if (coor[currChoice]._enabled) {
if ((prevChoice != 0) && (prevChoice != currChoice)) {
tmpStr = choiceArray[prevChoice] + '$';
- _vm->_text.displayStr(tmpStr, 100, 27 + (prevChoice * 8), 100, 1, 0);
+ _vm->_text->displayStr(tmpStr, 100, 27 + (prevChoice * 8), 100, 1, 0);
}
if (prevChoice != currChoice) {
tmpStr = choiceArray[currChoice] + '$';
- _vm->_text.displayStr(tmpStr, 100, 27 + (currChoice * 8), 100, 1, 1);
+ _vm->_text->displayStr(tmpStr, 100, 27 + (currChoice * 8), 100, 1, 1);
prevChoice = currChoice;
}
} else if (prevChoice != 0) {
tmpStr = choiceArray[prevChoice] + '$';
- _vm->_text.displayStr(tmpStr, 100, 27 + (prevChoice * 8), 100, 1, 0);
+ _vm->_text->displayStr(tmpStr, 100, 27 + (prevChoice * 8), 100, 1, 0);
prevChoice = 0;
}
} while (!((prevChoice != 0) && _vm->getMouseClick()));
@@ -391,17 +395,17 @@ void DialogManager::drawF3F8() {
Common::String f8 = _vm->getEngineString(S_F8);
// Write the F3 and F8 text strings
- _vm->_screenSurface.putxy(3, 44);
- _vm->_screenSurface.drawString(f3, 5);
- _vm->_screenSurface._textPos.y = 51;
- _vm->_screenSurface.drawString(f8, 5);
+ _vm->_screenSurface->putxy(3, 44);
+ _vm->_screenSurface->drawString(f3, 5);
+ _vm->_screenSurface->_textPos.y = 51;
+ _vm->_screenSurface->drawString(f8, 5);
// Get the width of the written text strings
- int f3Width = _vm->_screenSurface.getStringWidth(f3);
- int f8Width = _vm->_screenSurface.getStringWidth(f8);
+ int f3Width = _vm->_screenSurface->getStringWidth(f3);
+ int f8Width = _vm->_screenSurface->getStringWidth(f8);
// Write out the bounding box
- _vm->_screenSurface.drawBox(0, 42, MAX(f3Width, f8Width) + 6, 18, 7);
+ _vm->_screenSurface->drawBox(0, 42, MAX(f3Width, f8Width) + 6, 18, 7);
}
/**
@@ -412,7 +416,7 @@ void DialogManager::drawF3F8() {
void DialogManager::checkForF8(int SpeechNum, bool drawFrame2Fl) {
_vm->testKeyboard();
do {
- _vm->_soundManager.startSpeech(SpeechNum, 0, 0);
+ _vm->_soundManager->startSpeech(SpeechNum, 0, 0);
_vm->_key = waitForF3F8();
if (_vm->shouldQuit())
return;
@@ -442,7 +446,7 @@ int DialogManager::waitForF3F8() {
void DialogManager::displayIntroScreen(bool drawFrame2Fl) {
_vm->_caff = 50;
_vm->_maff = 0;
- _vm->_text.taffich();
+ _vm->_text->taffich();
_vm->draw(63, 12);
if (drawFrame2Fl)
displayIntroFrame2();
@@ -466,7 +470,4 @@ void DialogManager::displayIntroFrame2() {
_vm->handleDescriptionText(2, kDialogStringIndex + 143);
}
-void DialogManager::setParent(MortevielleEngine *vm) {
- _vm = vm;
-}
} // End of namespace Mortevielle
diff --git a/engines/mortevielle/dialogs.h b/engines/mortevielle/dialogs.h
index 3f30851960..abd8ee2493 100644
--- a/engines/mortevielle/dialogs.h
+++ b/engines/mortevielle/dialogs.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope 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.
@@ -51,7 +51,8 @@ private:
void drawAlertBox(int firstLine, int lineNum, int width);
void setButtonText(Common::String c, int coldep, int nbcase, Common::String *str, int esp);
public:
- void setParent(MortevielleEngine *vm);
+ DialogManager(MortevielleEngine *vm);
+
int show(const Common::String &msg);
void drawF3F8();
void checkForF8(int SpeechNum, bool drawFrame2Fl);
diff --git a/engines/mortevielle/graphics.cpp b/engines/mortevielle/graphics.cpp
index daf7926438..553c1a759e 100644
--- a/engines/mortevielle/graphics.cpp
+++ b/engines/mortevielle/graphics.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope 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.
@@ -881,6 +881,10 @@ GfxSurface::~GfxSurface() {
* Screen surface
*-------------------------------------------------------------------------*/
+ScreenSurface::ScreenSurface(MortevielleEngine *vm) {
+ _vm = vm;
+}
+
/**
* Called to populate the font data from the passed file
*/
@@ -1070,7 +1074,7 @@ void ScreenSurface::drawString(const Common::String &l, int command) {
if (l == "")
return;
- _vm->_mouse.hideMouse();
+ _vm->_mouse->hideMouse();
Common::Point pt = _textPos;
int charWidth = 6;
@@ -1082,11 +1086,11 @@ void ScreenSurface::drawString(const Common::String &l, int command) {
case 0:
case 2:
color = 15;
- _vm->_screenSurface.fillRect(0, Common::Rect(pt.x, pt.y, x, pt.y + 7));
+ _vm->_screenSurface->fillRect(0, Common::Rect(pt.x, pt.y, x, pt.y + 7));
break;
case 1:
case 3:
- _vm->_screenSurface.fillRect(15, Common::Rect(pt.x, pt.y, x, pt.y + 7));
+ _vm->_screenSurface->fillRect(15, Common::Rect(pt.x, pt.y, x, pt.y + 7));
break;
case 5:
color = 15;
@@ -1099,10 +1103,10 @@ void ScreenSurface::drawString(const Common::String &l, int command) {
pt.x += 1;
pt.y += 1;
for (x = 1; (x <= (int)l.size()) && (l[x - 1] != 0); ++x) {
- _vm->_screenSurface.writeCharacter(Common::Point(pt.x, pt.y), l[x - 1], color);
+ _vm->_screenSurface->writeCharacter(Common::Point(pt.x, pt.y), l[x - 1], color);
pt.x += charWidth;
}
- _vm->_mouse.showMouse();
+ _vm->_mouse->showMouse();
}
/**
@@ -1133,7 +1137,7 @@ void ScreenSurface::drawLine(int x, int y, int xx, int yy, int coul) {
else
step = 1;
do {
- _vm->_screenSurface.setPixel(Common::Point(abs((int)(a * i + b)), i), coul);
+ _vm->_screenSurface->setPixel(Common::Point(abs((int)(a * i + b)), i), coul);
i += step;
} while (i != yy);
} else {
@@ -1145,7 +1149,7 @@ void ScreenSurface::drawLine(int x, int y, int xx, int yy, int coul) {
else
step = 1;
do {
- _vm->_screenSurface.setPixel(Common::Point(i, abs((int)(a * i + b))), coul);
+ _vm->_screenSurface->setPixel(Common::Point(i, abs((int)(a * i + b))), coul);
i = i + step;
} while (i != xx);
}
@@ -1156,12 +1160,7 @@ void ScreenSurface::drawLine(int x, int y, int xx, int yy, int coul) {
* @remarks Originally called 'paint_rect'
*/
void ScreenSurface::drawRectangle(int x, int y, int dx, int dy) {
- _vm->_screenSurface.fillRect(11, Common::Rect(x, y, x + dx, y + dy));
+ _vm->_screenSurface->fillRect(11, Common::Rect(x, y, x + dx, y + dy));
}
-void ScreenSurface::setParent(MortevielleEngine *vm) {
- _vm = vm;
-}
-
-
} // End of namespace Mortevielle
diff --git a/engines/mortevielle/graphics.h b/engines/mortevielle/graphics.h
index e31f5da29a..d29d9b2d8d 100644
--- a/engines/mortevielle/graphics.h
+++ b/engines/mortevielle/graphics.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope 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.
@@ -91,6 +91,8 @@ private:
byte _fontData[FONT_NUM_CHARS * FONT_HEIGHT];
public:
+ ScreenSurface(MortevielleEngine *vm);
+
Common::Point _textPos; // Original called xwhere/ywhere
void readFontData(Common::File &f, int dataSize);
Graphics::Surface lockArea(const Common::Rect &bounds);
@@ -106,7 +108,6 @@ public:
int getStringWidth(const Common::String &s);
void drawLine(int x, int y, int xx, int yy, int coul);
void drawRectangle(int x, int y, int dx, int dy);
- void setParent(MortevielleEngine *vm);
// TODO: Refactor code to remove this method, for increased performance
void setPixel(const Common::Point &pt, int palIndex);
diff --git a/engines/mortevielle/menu.cpp b/engines/mortevielle/menu.cpp
index 641a527c98..c0b81b252a 100644
--- a/engines/mortevielle/menu.cpp
+++ b/engines/mortevielle/menu.cpp
@@ -2,18 +2,18 @@
*
* ScummVM is the legal property of its developers, whose names
* are too numerous to list here. Please refer to the COPYRIGHT
- * file _distributed with this source _distribution.
+ * file distributed with this source distribution.
*
- * This program is free software; you can re_distribute it and/or
+ * This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
- * This program is _distributed in the hope that it will be useful,
+ *
+ * This program is distributed in the hope 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.
@@ -48,14 +48,34 @@ const byte menuConstants[8][4] = {
{62, 46, 13, 10}
};
-Menu::Menu() {
+Menu::Menu(MortevielleEngine *vm) {
+ _vm = vm;
_opcodeAttach = _opcodeWait = _opcodeForce = _opcodeSleep = OPCODE_NONE;
_opcodeListen = _opcodeEnter = _opcodeClose = _opcodeSearch = OPCODE_NONE;
_opcodeKnock = _opcodeScratch = _opcodeRead = _opcodeEat = OPCODE_NONE;
_opcodePlace = _opcodeOpen = _opcodeTake = _opcodeLook = OPCODE_NONE;
_opcodeSmell = _opcodeSound = _opcodeLeave = _opcodeLift = OPCODE_NONE;
_opcodeTurn = _opcodeSHide = _opcodeSSearch = _opcodeSRead = OPCODE_NONE;
- _opcodeSPut = _opcodeSLook = OPCODE_NONE;
+ _opcodeSPut = _opcodeSLook = _msg3 = _msg4 = OPCODE_NONE;
+
+ _menuActive = false;
+ _menuSelected = false;
+ _multiTitle = false;
+ _menuDisplayed = false;
+ for (int i = 0; i < 9; i++) {
+ _discussMenu[i]._menuId = MENU_NONE;
+ _discussMenu[i]._actionId = 0;
+ _inventoryMenu[i]._menuId = MENU_NONE;
+ _inventoryMenu[i]._actionId = 0;
+ }
+ for (int i = 0; i < 8; i++) {
+ _moveMenu[i]._menuId = MENU_NONE;
+ _moveMenu[i]._actionId = 0;
+ }
+ for (int i = 0; i < 12; i++) {
+ _actionMenu[i]._menuId = MENU_NONE;
+ _actionMenu[i]._actionId = 0;
+ }
}
void Menu::readVerbNums(Common::File &f, int dataSize) {
@@ -121,19 +141,19 @@ void Menu::readVerbNums(Common::File &f, int dataSize) {
_actionMenu[1]._actionId = _opcodeSHide & 0xFF;
_actionMenu[2]._menuId = _opcodeAttach >> 8;
- _actionMenu[2]._actionId = _opcodeAttach & 0xFF;
+ _actionMenu[2]._actionId = _opcodeAttach & 0xFF;
_actionMenu[3]._menuId = _opcodeForce >> 8;
- _actionMenu[3]._actionId = _opcodeForce & 0xFF;
+ _actionMenu[3]._actionId = _opcodeForce & 0xFF;
_actionMenu[4]._menuId = _opcodeSleep >> 8;
_actionMenu[4]._actionId = _opcodeSleep & 0xFF;
_actionMenu[5]._menuId = _opcodeEnter >> 8;
- _actionMenu[5]._actionId = _opcodeEnter & 0xFF;
+ _actionMenu[5]._actionId = _opcodeEnter & 0xFF;
_actionMenu[6]._menuId = _opcodeClose >> 8;
- _actionMenu[6]._actionId = _opcodeClose & 0xFF;
+ _actionMenu[6]._actionId = _opcodeClose & 0xFF;
_actionMenu[7]._menuId = _opcodeKnock >> 8;
_actionMenu[7]._actionId = _opcodeKnock & 0xFF;
@@ -295,8 +315,8 @@ void Menu::enableMenuItem(MenuItem item) {
}
void Menu::displayMenu() {
- _vm->_mouse.hideMouse();
- _vm->_screenSurface.fillRect(7, Common::Rect(0, 0, 639, 10));
+ _vm->_mouse->hideMouse();
+ _vm->_screenSurface->fillRect(7, Common::Rect(0, 0, 639, 10));
int col = 28 * kResolutionScaler;
for (int charNum = 0; charNum < 6; charNum++) {
@@ -310,9 +330,9 @@ void Menu::displayMenu() {
uint msk = 0x80;
for (int pt = 0; pt <= 7; ++pt) {
if ((_charArr[charNum][idx] & msk) != 0) {
- _vm->_screenSurface.setPixel(Common::Point(x + 1, y + 1), 0);
- _vm->_screenSurface.setPixel(Common::Point(x, y + 1), 0);
- _vm->_screenSurface.setPixel(Common::Point(x, y), 9);
+ _vm->_screenSurface->setPixel(Common::Point(x + 1, y + 1), 0);
+ _vm->_screenSurface->setPixel(Common::Point(x, y + 1), 0);
+ _vm->_screenSurface->setPixel(Common::Point(x, y), 9);
}
msk >>= 1;
++x;
@@ -322,7 +342,7 @@ void Menu::displayMenu() {
}
col += 48 * kResolutionScaler;
}
- _vm->_mouse.showMouse();
+ _vm->_mouse->showMouse();
}
/**
@@ -348,7 +368,7 @@ void Menu::invert(int indx) {
int menuIndex = _msg4 & 0xFF;
- _vm->_screenSurface.putxy(menuConstants[_msg3 - 1][0] << 3, (menuIndex + 1) << 3);
+ _vm->_screenSurface->putxy(menuConstants[_msg3 - 1][0] << 3, (menuIndex + 1) << 3);
Common::String str;
switch (_msg3) {
@@ -388,7 +408,7 @@ void Menu::invert(int indx) {
break;
}
if ((str[0] != '*') && (str[0] != '<'))
- _vm->_screenSurface.drawString(str, indx);
+ _vm->_screenSurface->drawString(str, indx);
else
_msg4 = OPCODE_NONE;
}
@@ -419,71 +439,71 @@ void Menu::util(Common::Point pos) {
*/
void Menu::menuDown(int ii) {
// Make a copy of the current screen surface for later restore
- _vm->_backgroundSurface.copyFrom(_vm->_screenSurface);
+ _vm->_backgroundSurface.copyFrom(*_vm->_screenSurface);
// Draw the menu
int minX = menuConstants[ii - 1][0] << 3;
int lineNum = menuConstants[ii - 1][3];
- _vm->_mouse.hideMouse();
+ _vm->_mouse->hideMouse();
int deltaX = 6;
int maxX = minX + (menuConstants[ii - 1][2] * deltaX) + 6;
if ((ii == 4) && (_vm->getLanguage() == Common::EN_ANY))
// Extra width needed for Self menu in English version
maxX = 435;
- _vm->_screenSurface.fillRect(15, Common::Rect(minX, 12, maxX, 10 + (menuConstants[ii - 1][1] << 1)));
- _vm->_screenSurface.fillRect(0, Common::Rect(maxX, 12, maxX + 4, 10 + (menuConstants[ii - 1][1] << 1)));
- _vm->_screenSurface.fillRect(0, Common::Rect(minX, 8 + (menuConstants[ii - 1][1] << 1), maxX + 4, 12 + (menuConstants[ii - 1][1] << 1)));
- _vm->_screenSurface.putxy(minX, 16);
+ _vm->_screenSurface->fillRect(15, Common::Rect(minX, 12, maxX, 10 + (menuConstants[ii - 1][1] << 1)));
+ _vm->_screenSurface->fillRect(0, Common::Rect(maxX, 12, maxX + 4, 10 + (menuConstants[ii - 1][1] << 1)));
+ _vm->_screenSurface->fillRect(0, Common::Rect(minX, 8 + (menuConstants[ii - 1][1] << 1), maxX + 4, 12 + (menuConstants[ii - 1][1] << 1)));
+ _vm->_screenSurface->putxy(minX, 16);
for (int i = 1; i <= lineNum; i++) {
switch (ii) {
case 1:
if (_inventoryStringArray[i][0] != '*')
- _vm->_screenSurface.drawString(_inventoryStringArray[i], 4);
+ _vm->_screenSurface->drawString(_inventoryStringArray[i], 4);
break;
case 2:
if (_moveStringArray[i][0] != '*')
- _vm->_screenSurface.drawString(_moveStringArray[i], 4);
+ _vm->_screenSurface->drawString(_moveStringArray[i], 4);
break;
case 3:
if (_actionStringArray[i][0] != '*')
- _vm->_screenSurface.drawString(_actionStringArray[i], 4);
+ _vm->_screenSurface->drawString(_actionStringArray[i], 4);
break;
case 4:
if (_selfStringArray[i][0] != '*')
- _vm->_screenSurface.drawString(_selfStringArray[i], 4);
+ _vm->_screenSurface->drawString(_selfStringArray[i], 4);
break;
case 5:
if (_discussStringArray[i][0] != '*')
- _vm->_screenSurface.drawString(_discussStringArray[i], 4);
+ _vm->_screenSurface->drawString(_discussStringArray[i], 4);
break;
case 6:
- _vm->_screenSurface.drawString(_vm->getEngineString(S_SAVE_LOAD + i), 4);
+ _vm->_screenSurface->drawString(_vm->getEngineString(S_SAVE_LOAD + i), 4);
break;
case 7: {
Common::String s = _vm->getEngineString(S_SAVE_LOAD + 1);
s += ' ';
s += (char)(48 + i);
- _vm->_screenSurface.drawString(s, 4);
+ _vm->_screenSurface->drawString(s, 4);
}
break;
case 8:
if (i == 1)
- _vm->_screenSurface.drawString(_vm->getEngineString(S_RESTART), 4);
+ _vm->_screenSurface->drawString(_vm->getEngineString(S_RESTART), 4);
else {
Common::String s = _vm->getEngineString(S_SAVE_LOAD + 2);
s += ' ';
s += (char)(47 + i);
- _vm->_screenSurface.drawString(s, 4);
+ _vm->_screenSurface->drawString(s, 4);
}
break;
default:
break;
}
- _vm->_screenSurface.putxy(minX, _vm->_screenSurface._textPos.y + 8);
+ _vm->_screenSurface->putxy(minX, _vm->_screenSurface->_textPos.y + 8);
}
_multiTitle = true;
- _vm->_mouse.showMouse();
+ _vm->_mouse->showMouse();
}
/**
@@ -492,11 +512,11 @@ void Menu::menuDown(int ii) {
void Menu::menuUp(int msgId) {
if (_multiTitle) {
/* Restore the background area */
- assert(_vm->_screenSurface.pitch == _vm->_backgroundSurface.pitch);
+ assert(_vm->_screenSurface->pitch == _vm->_backgroundSurface.pitch);
// Get a pointer to the source and destination of the area to restore
const byte *pSrc = (const byte *)_vm->_backgroundSurface.getBasePtr(0, 10);
- Graphics::Surface destArea = _vm->_screenSurface.lockArea(Common::Rect(0, 10, SCREEN_WIDTH, SCREEN_HEIGHT));
+ Graphics::Surface destArea = _vm->_screenSurface->lockArea(Common::Rect(0, 10, SCREEN_WIDTH, SCREEN_HEIGHT));
byte *pDest = (byte *)destArea.getPixels();
// Copy the data
@@ -523,7 +543,7 @@ void Menu::updateMenu() {
if (!_menuActive)
return;
- Common::Point curPos = _vm->_mouse._pos;
+ Common::Point curPos = _vm->_mouse->_pos;
if (!_vm->getMouseClick()) {
if (curPos == _vm->_prevPos)
return;
@@ -590,13 +610,9 @@ void Menu::updateMenu() {
}
}
-void Menu::setParent(MortevielleEngine *vm) {
- _vm = vm;
-}
-
void Menu::initMenu() {
Common::File f;
-
+
bool menuLoaded = false;
// First try to read it from mort.dat if useOriginalData() is false
if (!_vm->useOriginalData()) {
@@ -620,7 +636,7 @@ void Menu::initMenu() {
desiredLanguageId = MORTDAT_LANG_ENGLISH;
break;
}
-
+
// Validate the data file header
char fileId[4];
f.read(fileId, 4);
@@ -638,7 +654,7 @@ void Menu::initMenu() {
// Read in the language
byte languageId = f.readByte();
--dataSize;
-
+
// If the language isn't correct, then skip the entire block
if (languageId != desiredLanguageId) {
f.skip(dataSize);
diff --git a/engines/mortevielle/menu.h b/engines/mortevielle/menu.h
index debf5b09b6..b3695fef28 100644
--- a/engines/mortevielle/menu.h
+++ b/engines/mortevielle/menu.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope 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.
@@ -60,7 +60,7 @@ private:
void menuDown(int ii);
public:
- Menu();
+ Menu(MortevielleEngine *vm);
bool _menuActive;
bool _menuSelected;
@@ -103,7 +103,6 @@ public:
int _opcodeSLook;
MenuItem _actionMenu[12];
- void setParent(MortevielleEngine *vm);
void readVerbNums(Common::File &f, int dataSize);
void setText(MenuItem item, Common::String name);
void setDestinationText(int roomId);
diff --git a/engines/mortevielle/module.mk b/engines/mortevielle/module.mk
index a9f02c2a67..7188e36958 100644
--- a/engines/mortevielle/module.mk
+++ b/engines/mortevielle/module.mk
@@ -19,5 +19,5 @@ ifeq ($(ENABLE_MORTEVIELLE), DYNAMIC_PLUGIN)
PLUGIN := 1
endif
-# Include common rules
+# Include common rules
include $(srcdir)/rules.mk
diff --git a/engines/mortevielle/mortevielle.cpp b/engines/mortevielle/mortevielle.cpp
index d434150977..90d366ed7e 100644
--- a/engines/mortevielle/mortevielle.cpp
+++ b/engines/mortevielle/mortevielle.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope 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.
@@ -47,17 +47,16 @@ namespace Mortevielle {
MortevielleEngine *g_vm;
MortevielleEngine::MortevielleEngine(OSystem *system, const MortevielleGameDescription *gameDesc):
- Engine(system), _gameDescription(gameDesc), _randomSource("mortevielle"),
- _soundManager(_mixer) {
+ Engine(system), _gameDescription(gameDesc), _randomSource("mortevielle") {
g_vm = this;
- _debugger.setParent(this);
- _dialogManager.setParent(this);
- _screenSurface.setParent(this);
- _mouse.setParent(this);
- _text.setParent(this);
- _soundManager.setParent(this);
- _savegameManager.setParent(this);
- _menu.setParent(this);
+ _debugger = new Debugger(this);
+ _dialogManager = new DialogManager(this);
+ _screenSurface = new ScreenSurface(this);
+ _mouse = new MouseHandler(this);
+ _text = new TextHandler(this);
+ _soundManager = new SoundManager(this, _mixer);
+ _savegameManager = new SavegameManager(this);
+ _menu = new Menu(this);
_lastGameFrame = 0;
_mouseClick = false;
@@ -84,7 +83,7 @@ MortevielleEngine::MortevielleEngine(OSystem *system, const MortevielleGameDescr
_keyPressedEsc = false;
_reloadCFIEC = false;
- _blo = false;
+ _outsideOnlyFl = true;
_col = false;
_syn = false;
_obpart = false;
@@ -102,9 +101,62 @@ MortevielleEngine::MortevielleEngine(OSystem *system, const MortevielleGameDescr
_curPict = nullptr;
_curAnim = nullptr;
_rightFramePict = nullptr;
+
+ resetCoreVar();
+
+ _maff = 0;
+ _crep = 0;
+
+ _minute = 0;
+ _curSearchObjId = 0;
+ _controlMenu = 0;
+ _startTime = 0;
+ _endTime = 0;
+ _roomDoorId = OWN_ROOM;
+ _openObjCount = 0;
+ _takeObjCount = 0;
+ _num = 0;
+ _searchCount = 0;
+ _introSpeechPlayed = false;
+ _inGameHourDuration = 0;
+ _x = 0;
+ _y = 0;
+ _currentHourCount = 0;
+ _currentTime = 0;
+ _cfiecBuffer = nullptr;
+ _cfiecBufferSize = 0;
+ for (int i = 0; i < 601; i++) {
+ _dialogHintArray[i]._hintId = 0;
+ _dialogHintArray[i]._point = 0;
+ }
+ _currMenu = OPCODE_NONE;
+ _currAction = OPCODE_NONE;
+ _menuOpcode = OPCODE_NONE;
+ _addFix = 0;
+ _currBitIndex = 0;
+ _currDay = 0;
+ _currHour = 10;
+ _currHalfHour = 0;
+ _hour = 10;
+ _key = 0;
+ _manorDistance = 0;
+ _numpal = 0;
+ _savedBitIndex = 0;
+ _endGame = false;
+ _loseGame = false;
+ _txxFileFl = false;
}
MortevielleEngine::~MortevielleEngine() {
+ delete _menu;
+ delete _savegameManager;
+ delete _soundManager;
+ delete _text;
+ delete _mouse;
+ delete _screenSurface;
+ delete _dialogManager;
+ delete _debugger;
+
free(_curPict);
free(_curAnim);
free(_rightFramePict);
@@ -140,7 +192,7 @@ bool MortevielleEngine::canSaveGameStateCurrently() {
* Load in a savegame at the specified slot number
*/
Common::Error MortevielleEngine::loadGameState(int slot) {
- return _savegameManager.loadGame(slot);
+ return _savegameManager->loadGame(slot);
}
/**
@@ -150,7 +202,7 @@ Common::Error MortevielleEngine::saveGameState(int slot, const Common::String &d
if (slot == 0)
return Common::kWritingFailed;
- return _savegameManager.saveGame(slot, desc);
+ return _savegameManager->saveGame(slot, desc);
}
/**
@@ -196,7 +248,7 @@ Common::ErrorCode MortevielleEngine::initialize() {
DebugMan.addDebugChannel(kMortevielleGraphics, "graphics", "Graphics debugging");
// Set up an intermediate screen surface
- _screenSurface.create(SCREEN_WIDTH, SCREEN_HEIGHT, Graphics::PixelFormat::createFormatCLUT8());
+ _screenSurface->create(SCREEN_WIDTH, SCREEN_HEIGHT, Graphics::PixelFormat::createFormatCLUT8());
_txxFileFl = false;
// Load texts from TXX files
@@ -205,7 +257,7 @@ Common::ErrorCode MortevielleEngine::initialize() {
// Load the mort.dat resource
Common::ErrorCode result = loadMortDat();
if (result != Common::kNoError) {
- _screenSurface.free();
+ _screenSurface->free();
return result;
}
@@ -235,8 +287,8 @@ Common::ErrorCode MortevielleEngine::initialize() {
testKeyboard();
clearScreen();
- _soundManager.loadNoise();
- _soundManager.loadAmbiantSounds();
+ _soundManager->loadNoise();
+ _soundManager->loadAmbiantSounds();
return Common::kNoError;
}
@@ -278,13 +330,13 @@ Common::ErrorCode MortevielleEngine::loadMortDat() {
if (!strncmp(dataType, "FONT", 4)) {
// Font resource
- _screenSurface.readFontData(f, dataSize);
+ _screenSurface->readFontData(f, dataSize);
} else if (!strncmp(dataType, "SSTR", 4)) {
readStaticStrings(f, dataSize, kStaticStrings);
} else if ((!strncmp(dataType, "GSTR", 4)) && (!_txxFileFl)) {
readStaticStrings(f, dataSize, kGameStrings);
} else if (!strncmp(dataType, "VERB", 4)) {
- _menu.readVerbNums(f, dataSize);
+ _menu->readVerbNums(f, dataSize);
} else {
// Unknown section
f.skip(dataSize);
@@ -369,21 +421,21 @@ Common::Error MortevielleEngine::run() {
showIntroduction();
else {
_caff = 51;
- _text.taffich();
+ _text->taffich();
}
// Either load the initial game state savegame, or the specified savegame number
adzon();
resetVariables();
if (loadSlot != 0)
- _savegameManager.loadSavegame(generateSaveFilename(loadSlot));
+ _savegameManager->loadSavegame(generateSaveFilename(loadSlot));
// Run the main game loop
mainGame();
// Cleanup (allocated in initialize())
- _screenSurface.free();
- free(_soundManager._cfiphBuffer);
+ _screenSurface->free();
+ free(_soundManager->_cfiphBuffer);
free(_cfiecBuffer);
return Common::kNoError;
@@ -393,13 +445,13 @@ Common::Error MortevielleEngine::run() {
* Show the game introduction
*/
void MortevielleEngine::showIntroduction() {
- _dialogManager.displayIntroScreen(false);
- _dialogManager.checkForF8(142, false);
+ _dialogManager->displayIntroScreen(false);
+ _dialogManager->checkForF8(142, false);
if (shouldQuit())
return;
- _dialogManager.displayIntroFrame2();
- _dialogManager.checkForF8(143, true);
+ _dialogManager->displayIntroFrame2();
+ _dialogManager->checkForF8(143, true);
if (shouldQuit())
return;
@@ -419,13 +471,13 @@ void MortevielleEngine::mainGame() {
for (_crep = 1; _crep <= _x26KeyCount; ++_crep)
decodeNumber(&_cfiecBuffer[161 * 16], (_cfiecBufferSize - (161 * 16)) / 64);
- _menu.initMenu();
+ _menu->initMenu();
charToHour();
initGame();
clearScreen();
drawRightFrame();
- _mouse.showMouse();
+ _mouse->showMouse();
// Loop to play the game
do {
diff --git a/engines/mortevielle/mortevielle.h b/engines/mortevielle/mortevielle.h
index 5ae94987a0..c3d1e4ae8b 100644
--- a/engines/mortevielle/mortevielle.h
+++ b/engines/mortevielle/mortevielle.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope 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.
@@ -122,7 +122,6 @@ const int kMaxPatt = 20;
const int kResolutionScaler = 2;
/*
-9 "A glance at the forbidden$",
18 "It's already open$",
26 "A photograph$"
*/
@@ -135,11 +134,6 @@ enum Places {
DOOR = 25, ROOM26 = 26, COAT_ARMS = 27
};
-struct Pattern {
- byte _tay, _tax;
- byte _des[kMaxPatt + 1][kMaxPatt + 1];
-};
-
struct SaveStruct {
int _faithScore;
byte _pctHintFound[11];
@@ -391,6 +385,7 @@ private:
void prepareNextObject();
void putObject();
void resetObjectPlace();
+ void resetCoreVar();
void drawDiscussionBox();
void displayNarrativePicture(int af, int ob);
void menuUp();
@@ -407,7 +402,7 @@ public:
int _charAnswerMax[9];
byte _tabdon[4001];
bool _soundOff;
- bool _blo;
+ bool _outsideOnlyFl;
bool _destinationOk;
bool _largestClearScreen;
float _addFix;
@@ -427,17 +422,18 @@ public:
byte *_curAnim;
byte *_rightFramePict;
- Debugger _debugger;
- ScreenSurface _screenSurface;
PaletteManager _paletteManager;
GfxSurface _backgroundSurface;
Common::RandomSource _randomSource;
- SoundManager _soundManager;
- SavegameManager _savegameManager;
- Menu _menu;
- MouseHandler _mouse;
- TextHandler _text;
- DialogManager _dialogManager;
+
+ Debugger *_debugger;
+ ScreenSurface *_screenSurface;
+ SoundManager *_soundManager;
+ SavegameManager *_savegameManager;
+ Menu *_menu;
+ MouseHandler *_mouse;
+ TextHandler *_text;
+ DialogManager *_dialogManager;
MortevielleEngine(OSystem *system, const MortevielleGameDescription *gameDesc);
~MortevielleEngine();
@@ -448,7 +444,7 @@ public:
virtual Common::Error saveGameState(int slot, const Common::String &desc);
virtual Common::Error run();
virtual void pauseEngineIntern(bool pause);
- virtual GUI::Debugger *getDebugger() {return &_debugger;}
+ virtual GUI::Debugger *getDebugger() {return _debugger;}
uint32 getGameFlags() const;
Common::Language getLanguage() const;
Common::Language getOriginalLanguage() const;
diff --git a/engines/mortevielle/mouse.cpp b/engines/mortevielle/mouse.cpp
index 9eb4e129c0..8f96ba3ef5 100644
--- a/engines/mortevielle/mouse.cpp
+++ b/engines/mortevielle/mouse.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope 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.
@@ -33,14 +33,16 @@
namespace Mortevielle {
+MouseHandler::MouseHandler(MortevielleEngine *vm) {
+ _vm = vm;
+}
+
/**
* Initialize the mouse
* @remarks Originally called 'init_mouse'
*/
void MouseHandler::initMouse() {
- _counter = 0;
_pos = Common::Point(0, 0);
-
_vm->setMouseClick(false);
}
@@ -95,15 +97,13 @@ void MouseHandler::getMousePosition(int &x, int &y, bool &click) {
* @remarks Originally called 'mov_mouse'
*/
void MouseHandler::moveMouse(bool &funct, char &key) {
- bool p_key;
- char in1, in2;
int cx, cy;
bool click;
// Set defaults and check pending events
funct = false;
key = '\377';
- p_key = _vm->keyPressed();
+ bool p_key = _vm->keyPressed();
// If mouse button clicked, return it
if (_vm->getMouseClick())
@@ -114,7 +114,7 @@ void MouseHandler::moveMouse(bool &funct, char &key) {
if (_vm->shouldQuit())
return;
- in1 = _vm->getChar();
+ char in1 = _vm->getChar();
getMousePosition(cx, cy, click);
switch (toupper(in1)) {
case '4':
@@ -158,7 +158,7 @@ void MouseHandler::moveMouse(bool &funct, char &key) {
p_key = _vm->keyPressed();
if (p_key) {
- in2 = _vm->getChar();
+ char in2 = _vm->getChar();
if ((in2 >= ';') && (in2 <= 'D')) {
funct = true;
@@ -266,8 +266,4 @@ bool MouseHandler::isMouseIn(Common::Rect r) {
return false;
}
-void MouseHandler::setParent(MortevielleEngine *vm) {
- _vm = vm;
-}
-
} // End of namespace Mortevielle
diff --git a/engines/mortevielle/mouse.h b/engines/mortevielle/mouse.h
index 594031d816..0f28d50131 100644
--- a/engines/mortevielle/mouse.h
+++ b/engines/mortevielle/mouse.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope 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.
@@ -36,12 +36,10 @@ class MortevielleEngine;
class MouseHandler {
private:
MortevielleEngine *_vm;
-
- int _counter;
public:
Common::Point _pos;
+ MouseHandler(MortevielleEngine *vm);
- void setParent(MortevielleEngine *vm);
void initMouse();
void hideMouse();
void showMouse();
diff --git a/engines/mortevielle/outtext.cpp b/engines/mortevielle/outtext.cpp
index d50f4005de..6a479c0859 100644
--- a/engines/mortevielle/outtext.cpp
+++ b/engines/mortevielle/outtext.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope 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.
@@ -35,6 +35,10 @@
namespace Mortevielle {
+TextHandler::TextHandler(MortevielleEngine *vm) {
+ _vm = vm;
+}
+
/**
* Next word
* @remarks Originally called 'l_motsuiv'
@@ -59,7 +63,7 @@ void TextHandler::displayStr(Common::String inputStr, int x, int y, int dx, int
// Safeguard: add $ just in case
inputStr += '$';
- _vm->_screenSurface.putxy(x, y);
+ _vm->_screenSurface->putxy(x, y);
int tab = 6;
dx *= 6;
dy *= 6;
@@ -73,19 +77,19 @@ void TextHandler::displayStr(Common::String inputStr, int x, int y, int dx, int
while (!stringParsed) {
switch (inputStr[p]) {
case '@':
- _vm->_screenSurface.drawString(s, typ);
+ _vm->_screenSurface->drawString(s, typ);
s = "";
++p;
xc = x;
yc += 6;
- _vm->_screenSurface.putxy(xc, yc);
+ _vm->_screenSurface->putxy(xc, yc);
break;
case ' ':
s += ' ';
xc += tab;
++p;
if (nextWord(p, inputStr.c_str(), tab) + xc > xf) {
- _vm->_screenSurface.drawString(s, typ);
+ _vm->_screenSurface->drawString(s, typ);
s = "";
xc = x;
yc += 6;
@@ -96,20 +100,20 @@ void TextHandler::displayStr(Common::String inputStr, int x, int y, int dx, int
do {
j = x;
do {
- _vm->_screenSurface.putxy(j, i);
- _vm->_screenSurface.drawString(" ", 0);
+ _vm->_screenSurface->putxy(j, i);
+ _vm->_screenSurface->drawString(" ", 0);
j += 6;
} while (j <= xf);
i += 6;
} while (i <= yf);
yc = y;
}
- _vm->_screenSurface.putxy(xc, yc);
+ _vm->_screenSurface->putxy(xc, yc);
}
break;
case '$':
stringParsed = true;
- _vm->_screenSurface.drawString(s, typ);
+ _vm->_screenSurface->drawString(s, typ);
break;
default:
s += inputStr[p];
@@ -218,7 +222,7 @@ void TextHandler::taffich() {
}
_vm->_destinationOk = true;
- _vm->_mouse.hideMouse();
+ _vm->_mouse->hideMouse();
drawingStartPos = 0;
Common::String filename, altFilename;
@@ -283,26 +287,22 @@ void TextHandler::taffich() {
filename = "AXX.mor";
} else { // b == 50
// CHECKME: the size of AZZ.mor is 1280 for the DOS version
- // and 1260 for the Amiga version. Maybe the 20 bytes
- // are a filler (to get 10 blocks of 128 bytes),
+ // and 1260 for the Amiga version. Maybe the 20 bytes
+ // are a filler (to get 10 blocks of 128 bytes),
// or the size should be variable.
drawingSize = 1260;
filename = "AZZ.mor";
}
loadAniFile(filename, drawingStartPos, drawingSize);
}
- _vm->_mouse.showMouse();
- if ((a < COAT_ARMS) && ((_vm->_maff < COAT_ARMS) || (_vm->_coreVar._currPlace == LANDING)) && (_vm->_currAction != _vm->_menu._opcodeEnter)) {
+ _vm->_mouse->showMouse();
+ if ((a < COAT_ARMS) && ((_vm->_maff < COAT_ARMS) || (_vm->_coreVar._currPlace == LANDING)) && (_vm->_currAction != _vm->_menu->_opcodeEnter)) {
if ((a == ATTIC) || (a == CELLAR))
_vm->displayAloneText();
- else if (!_vm->_blo)
+ else if (!_vm->_outsideOnlyFl)
_vm->getPresence(_vm->_coreVar._currPlace);
_vm->_savedBitIndex = 0;
}
}
-void TextHandler::setParent(MortevielleEngine *vm) {
- _vm = vm;
-}
-
} // End of namespace Mortevielle
diff --git a/engines/mortevielle/outtext.h b/engines/mortevielle/outtext.h
index 44868036d5..515bc9ece0 100644
--- a/engines/mortevielle/outtext.h
+++ b/engines/mortevielle/outtext.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope 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.
@@ -38,7 +38,8 @@ private:
MortevielleEngine *_vm;
int nextWord(int p, const char *ch, int &tab);
public:
- void setParent(MortevielleEngine *vm);
+ TextHandler (MortevielleEngine *vm);
+
void displayStr(Common::String inputStr, int x, int y, int dx, int dy, int typ);
void loadPictureFile(Common::String filename, Common::String altFilename, int32 skipSize, int length);
void loadAniFile(Common::String filename, int32 skipSize, int length);
diff --git a/engines/mortevielle/saveload.cpp b/engines/mortevielle/saveload.cpp
index c14a03cd60..9f46940e1f 100644
--- a/engines/mortevielle/saveload.cpp
+++ b/engines/mortevielle/saveload.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope 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.
@@ -37,7 +37,7 @@ namespace Mortevielle {
static const char SAVEGAME_ID[4] = { 'M', 'O', 'R', 'T' };
-void SavegameManager::setParent(MortevielleEngine *vm) {
+SavegameManager::SavegameManager(MortevielleEngine *vm) {
_vm = vm;
}
@@ -116,16 +116,16 @@ bool SavegameManager::loadSavegame(const Common::String &filename) {
* Load a saved game
*/
Common::Error SavegameManager::loadGame(const Common::String &filename) {
- g_vm->_mouse.hideMouse();
+ g_vm->_mouse->hideMouse();
g_vm->displayEmptyHand();
if (loadSavegame(filename)) {
/* Initialization */
g_vm->charToHour();
g_vm->initGame();
g_vm->gameLoaded();
- g_vm->_mouse.showMouse();
+ g_vm->_mouse->showMouse();
return Common::kNoError;
- } else
+ } else
return Common::kUnknownError;
}
@@ -136,7 +136,7 @@ Common::Error SavegameManager::saveGame(int n, const Common::String &saveName) {
Common::OutSaveFile *f;
int i;
- g_vm->_mouse.hideMouse();
+ g_vm->_mouse->hideMouse();
g_vm->hourToChar();
for (i = 0; i <= 389; ++i)
@@ -165,7 +165,7 @@ Common::Error SavegameManager::saveGame(int n, const Common::String &saveName) {
// Skipped: dialog asking to swap floppy
- g_vm->_mouse.showMouse();
+ g_vm->_mouse->showMouse();
return Common::kNoError;
}
@@ -191,7 +191,7 @@ void SavegameManager::writeSavegameHeader(Common::OutSaveFile *out, const Common
// Create a thumbnail and save it
Graphics::Surface *thumb = new Graphics::Surface();
- Graphics::Surface s = g_vm->_screenSurface.lockArea(Common::Rect(0, 0, SCREEN_WIDTH, SCREEN_HEIGHT));
+ Graphics::Surface s = g_vm->_screenSurface->lockArea(Common::Rect(0, 0, SCREEN_WIDTH, SCREEN_HEIGHT));
::createThumbnail(thumb, (const byte *)s.getPixels(), SCREEN_WIDTH, SCREEN_HEIGHT, thumbPalette);
Graphics::saveThumbnail(*out, *thumb);
diff --git a/engines/mortevielle/saveload.h b/engines/mortevielle/saveload.h
index 79747e6889..a0de05b920 100644
--- a/engines/mortevielle/saveload.h
+++ b/engines/mortevielle/saveload.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope 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.
@@ -56,7 +56,8 @@ private:
void sync_save(Common::Serializer &sz);
public:
- void setParent(MortevielleEngine *vm);
+ SavegameManager(MortevielleEngine *vm);
+
bool loadSavegame(const Common::String &filename);
Common::Error loadGame(const Common::String &filename);
Common::Error saveGame(int n, const Common::String &saveName);
diff --git a/engines/mortevielle/sound.cpp b/engines/mortevielle/sound.cpp
index b670246726..23ca9d89b4 100644
--- a/engines/mortevielle/sound.cpp
+++ b/engines/mortevielle/sound.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope 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.
@@ -55,7 +55,8 @@ namespace Mortevielle {
const byte _tabdph[16] = {0, 10, 2, 0, 2, 10, 3, 0, 3, 7, 5, 0, 6, 7, 7, 10};
const byte _tabdbc[18] = {7, 23, 7, 14, 13, 9, 14, 9, 5, 12, 6, 12, 13, 4, 0, 4, 5, 9};
-SoundManager::SoundManager(Audio::Mixer *mixer) {
+SoundManager::SoundManager(MortevielleEngine *vm, Audio::Mixer *mixer) {
+ _vm = vm;
_mixer = mixer;
_audioStream = nullptr;
_ambiantNoiseBuf = nullptr;
@@ -72,6 +73,8 @@ SoundManager::SoundManager(Audio::Mixer *mixer) {
_queue[i]._rep = 0;
}
_buildingSentence = false;
+ _ptr_oct = 0;
+ _cfiphBuffer = nullptr;
}
SoundManager::~SoundManager() {
@@ -88,13 +91,12 @@ int SoundManager::decodeMusic(const byte *PSrc, byte *PDest, int size) {
static const int tab[16] = { -96, -72, -48, -32, -20, -12, -8, -4, 0, 4, 8, 12, 20, 32, 48, 72 };
uint seed = 128;
- int v;
int decompSize = 0;
int skipSize = 0;
for (int idx1 = 0; idx1 < size; ++idx1) {
byte srcByte = *PSrc++;
- v = tab[srcByte >> 4];
+ int v = tab[srcByte >> 4];
seed += v;
*PDest++ = seed & 0xff;
@@ -201,7 +203,7 @@ void SoundManager::litph(tablint &t, int typ, int tempo) {
}
} else { // 2
debugC(5, kMortevielleSounds, "litph - vadson");
- const static int ambiantNoiseAdr[] = {0, 14020,
+ const static int ambiantNoiseAdr[] = {0, 14020,
14020, 18994,
18994, 19630,
19630, 22258,
@@ -281,10 +283,6 @@ void SoundManager::playSong(const byte* buf, uint size, uint loops) {
_mixer->stopHandle(songHandle);
}
-void SoundManager::setParent(MortevielleEngine *vm) {
- _vm = vm;
-}
-
void SoundManager::spfrac(int wor) {
_queue[2]._rep = (uint)wor >> 12;
if ((_soundType == 0) && (_queue[2]._code != 9)) {
@@ -697,7 +695,7 @@ void SoundManager::handlePhoneme() {
uint16 startPos = _cfiphBuffer[_phonemeNumb - 1] + deca[_soundType];
uint16 endPos = _cfiphBuffer[_phonemeNumb] + deca[_soundType];
int wordCount = endPos - startPos;
-
+
startPos /= 2;
endPos /= 2;
assert((endPos - startPos) < 1711);
diff --git a/engines/mortevielle/sound.h b/engines/mortevielle/sound.h
index cc0567fd98..d913684935 100644
--- a/engines/mortevielle/sound.h
+++ b/engines/mortevielle/sound.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope 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.
@@ -84,15 +84,13 @@ private:
void litph(tablint &t, int typ, int tempo);
public:
- SoundManager(Audio::Mixer *mixer);
+ SoundManager(MortevielleEngine *vm, Audio::Mixer *mixer);
~SoundManager();
Audio::Mixer *_mixer;
Audio::SoundHandle _soundHandle;
uint16 *_cfiphBuffer;
- void setParent(MortevielleEngine *vm);
-
int decodeMusic(const byte *PSrc, byte *PDest, int size);
void playSong(const byte *buf, uint usize, uint loops);
void loadAmbiantSounds();
diff --git a/engines/mortevielle/utils.cpp b/engines/mortevielle/utils.cpp
index 7809143176..d5dec6a286 100644
--- a/engines/mortevielle/utils.cpp
+++ b/engines/mortevielle/utils.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope 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.
@@ -50,9 +50,9 @@ bool MortevielleEngine::keyPressed() {
if (g_system->getMillis() > (_lastGameFrame + GAME_FRAME_DELAY)) {
_lastGameFrame = g_system->getMillis();
- _screenSurface.updateScreen();
+ _screenSurface->updateScreen();
- _debugger.onFrame();
+ _debugger->onFrame();
}
// Delay briefly to keep CPU usage down
@@ -92,8 +92,8 @@ bool MortevielleEngine::handleEvents() {
case Common::EVENT_LBUTTONUP:
case Common::EVENT_MOUSEMOVE:
_mousePos = Common::Point(event.mouse.x, event.mouse.y / 2);
- _mouse._pos.x = event.mouse.x;
- _mouse._pos.y = event.mouse.y / 2;
+ _mouse->_pos.x = event.mouse.x;
+ _mouse->_pos.y = event.mouse.y / 2;
if (event.type == Common::EVENT_LBUTTONDOWN)
_mouseClick = true;
@@ -121,8 +121,8 @@ void MortevielleEngine::addKeypress(Common::Event &evt) {
// Check for debugger
if ((evt.kbd.keycode == Common::KEYCODE_d) && (evt.kbd.flags & Common::KBD_CTRL)) {
// Attach to the debugger
- _debugger.attach();
- _debugger.onFrame();
+ _debugger->attach();
+ _debugger->onFrame();
} else if ((evt.kbd.keycode >= Common::KEYCODE_a) && (evt.kbd.keycode <= Common::KEYCODE_z)) {
// Handle alphabetic keys
if (evt.kbd.hasFlags(Common::KBD_CTRL))
@@ -208,7 +208,7 @@ void MortevielleEngine::initMouse() {
CursorMan.replaceCursor(CURSOR_ARROW_DATA, 16, 16, 0, 0, 0xff);
CursorMan.showMouse(true);
- _mouse.initMouse();
+ _mouse->initMouse();
}
/**
@@ -237,9 +237,9 @@ void MortevielleEngine::delay(int amount) {
while (g_system->getMillis() < endTime) {
if (g_system->getMillis() > (_lastGameFrame + GAME_FRAME_DELAY)) {
_lastGameFrame = g_system->getMillis();
- _screenSurface.updateScreen();
+ _screenSurface->updateScreen();
- _debugger.onFrame();
+ _debugger->onFrame();
}
g_system->delayMillis(10);
@@ -258,11 +258,10 @@ void MortevielleEngine::handleAction() {
clearVerbBar();
- bool handledOpcodeFl = false;
_controlMenu = 0;
if (!_keyPressedEsc) {
- _menu.drawMenu();
- _menu._menuDisplayed = true;
+ _menu->drawMenu();
+ _menu->_menuDisplayed = true;
temps = 0;
_key = 0;
funct = false;
@@ -270,28 +269,28 @@ void MortevielleEngine::handleAction() {
_inMainGameLoop = true;
do {
- _menu.updateMenu();
+ _menu->updateMenu();
prepareRoom();
- _mouse.moveMouse(funct, inkey);
+ _mouse->moveMouse(funct, inkey);
if (shouldQuit())
return;
++temps;
if (keyPressed() || _mouseClick) {
- _soundManager._mixer->stopHandle(_soundManager._soundHandle);
+ _soundManager->_mixer->stopHandle(_soundManager->_soundHandle);
}
- } while (!((_menu._menuSelected) || (temps > lim) || (funct) || (_anyone)));
+ } while (!((_menu->_menuSelected) || (temps > lim) || (funct) || (_anyone)));
_inMainGameLoop = false;
- _menu.eraseMenu();
- _menu._menuDisplayed = false;
- if (_menu._menuSelected && (_currMenu == MENU_SAVE)) {
+ _menu->eraseMenu();
+ _menu->_menuDisplayed = false;
+ if (_menu->_menuSelected && (_currMenu == MENU_SAVE)) {
Common::String saveName = Common::String::format("Savegame #%d", _currAction & 15);
- _savegameManager.saveGame(_currAction & 15, saveName);
+ _savegameManager->saveGame(_currAction & 15, saveName);
}
- if (_menu._menuSelected && (_currMenu == MENU_LOAD))
- _savegameManager.loadGame((_currAction & 15) - 1);
+ if (_menu->_menuSelected && (_currMenu == MENU_LOAD))
+ _savegameManager->loadGame((_currAction & 15) - 1);
if (inkey == '\103') { /* F9 */
- temps = _dialogManager.show(_hintPctMessage);
+ temps = _dialogManager->show(_hintPctMessage);
return;
} else if (inkey == '\77') {
if ((_menuOpcode != OPCODE_NONE) && ((_currMenu == MENU_ACTION) || (_currMenu == MENU_SELF))) {
@@ -319,14 +318,15 @@ void MortevielleEngine::handleAction() {
_menuOpcode = _currMenu;
if ((_currMenu == MENU_ACTION) || (_currMenu == MENU_SELF))
_menuOpcode = _currAction;
+ bool handledOpcodeFl = false;
if (!_anyone) {
if ((_heroSearching) || (_obpart)) {
- if (_mouse._pos.y < 12)
+ if (_mouse->_pos.y < 12)
return;
- if ((_currAction == _menu._opcodeSound) || (_currAction == _menu._opcodeLift)) {
+ if ((_currAction == _menu->_opcodeSound) || (_currAction == _menu->_opcodeLift)) {
handledOpcodeFl = true;
- if ((_currAction == _menu._opcodeLift) || (_obpart)) {
+ if ((_currAction == _menu->_opcodeLift) || (_obpart)) {
endSearch();
_caff = _coreVar._currPlace;
_crep = 998;
@@ -341,7 +341,7 @@ void MortevielleEngine::handleAction() {
handleOpcode();
if ((_controlMenu == 0) && (! _loseGame) && (! _endGame)) {
- _text.taffich();
+ _text->taffich();
if (_destinationOk) {
_destinationOk = false;
drawPicture();
@@ -389,7 +389,7 @@ void MortevielleEngine::setTextColor(int col) {
*/
void MortevielleEngine::prepareScreenType1() {
// Large drawing
- _screenSurface.drawBox(0, 11, 512, 164, 15);
+ _screenSurface->drawBox(0, 11, 512, 164, 15);
}
/**
@@ -466,7 +466,7 @@ int MortevielleEngine::convertBitIndexToCharacterIndex(int bitIndex) {
*/
void MortevielleEngine::resetPresenceInRooms(int roomId) {
if (roomId == DINING_ROOM)
- _blo = false;
+ _outsideOnlyFl = false;
if (roomId != GREEN_ROOM) {
_roomPresenceLuc = false;
@@ -500,51 +500,51 @@ void MortevielleEngine::resetPresenceInRooms(int roomId) {
* @remarks Originally called 'affper'
*/
void MortevielleEngine::showPeoplePresent(int bitIndex) {
- int xp = 580 - (_screenSurface.getStringWidth("LEO") / 2);
+ int xp = 580 - (_screenSurface->getStringWidth("LEO") / 2);
for (int i = 1; i <= 8; ++i)
- _menu.disableMenuItem(_menu._discussMenu[i]);
+ _menu->disableMenuItem(_menu->_discussMenu[i]);
clearUpperRightPart();
if ((bitIndex & 128) == 128) {
- _screenSurface.putxy(xp, 24);
- _screenSurface.drawString("LEO", 4);
- _menu.enableMenuItem(_menu._discussMenu[1]);
+ _screenSurface->putxy(xp, 24);
+ _screenSurface->drawString("LEO", 4);
+ _menu->enableMenuItem(_menu->_discussMenu[1]);
}
if ((bitIndex & 64) == 64) {
- _screenSurface.putxy(xp, 32);
- _screenSurface.drawString("PAT", 4);
- _menu.enableMenuItem(_menu._discussMenu[2]);
+ _screenSurface->putxy(xp, 32);
+ _screenSurface->drawString("PAT", 4);
+ _menu->enableMenuItem(_menu->_discussMenu[2]);
}
if ((bitIndex & 32) == 32) {
- _screenSurface.putxy(xp, 40);
- _screenSurface.drawString("GUY", 4);
- _menu.enableMenuItem(_menu._discussMenu[3]);
+ _screenSurface->putxy(xp, 40);
+ _screenSurface->drawString("GUY", 4);
+ _menu->enableMenuItem(_menu->_discussMenu[3]);
}
if ((bitIndex & 16) == 16) {
- _screenSurface.putxy(xp, 48);
- _screenSurface.drawString("EVA", 4);
- _menu.enableMenuItem(_menu._discussMenu[4]);
+ _screenSurface->putxy(xp, 48);
+ _screenSurface->drawString("EVA", 4);
+ _menu->enableMenuItem(_menu->_discussMenu[4]);
}
if ((bitIndex & 8) == 8) {
- _screenSurface.putxy(xp, 56);
- _screenSurface.drawString("BOB", 4);
- _menu.enableMenuItem(_menu._discussMenu[5]);
+ _screenSurface->putxy(xp, 56);
+ _screenSurface->drawString("BOB", 4);
+ _menu->enableMenuItem(_menu->_discussMenu[5]);
}
if ((bitIndex & 4) == 4) {
- _screenSurface.putxy(xp, 64);
- _screenSurface.drawString("LUC", 4);
- _menu.enableMenuItem(_menu._discussMenu[6]);
+ _screenSurface->putxy(xp, 64);
+ _screenSurface->drawString("LUC", 4);
+ _menu->enableMenuItem(_menu->_discussMenu[6]);
}
if ((bitIndex & 2) == 2) {
- _screenSurface.putxy(xp, 72);
- _screenSurface.drawString("IDA", 4);
- _menu.enableMenuItem(_menu._discussMenu[7]);
+ _screenSurface->putxy(xp, 72);
+ _screenSurface->drawString("IDA", 4);
+ _menu->enableMenuItem(_menu->_discussMenu[7]);
}
if ((bitIndex & 1) == 1) {
- _screenSurface.putxy(xp, 80);
- _screenSurface.drawString("MAX", 4);
- _menu.enableMenuItem(_menu._discussMenu[8]);
+ _screenSurface->putxy(xp, 80);
+ _screenSurface->drawString("MAX", 4);
+ _menu->enableMenuItem(_menu->_discussMenu[8]);
}
_currBitIndex = bitIndex;
}
@@ -605,7 +605,7 @@ int MortevielleEngine::getPresenceStatsGreenRoom() {
else if ((hour >= 0) && (hour < 8))
retVal = 70;
- _menu.updateMenu();
+ _menu->updateMenu();
return retVal;
}
@@ -698,19 +698,19 @@ int MortevielleEngine::getPresenceStatsRedRoom() {
*/
void MortevielleEngine::displayAloneText() {
for (int i = 1; i <= 8; ++i)
- _menu.disableMenuItem(_menu._discussMenu[i]);
+ _menu->disableMenuItem(_menu->_discussMenu[i]);
Common::String sYou = getEngineString(S_YOU);
Common::String sAre = getEngineString(S_ARE);
Common::String sAlone = getEngineString(S_ALONE);
clearUpperRightPart();
- _screenSurface.putxy(580 - (_screenSurface.getStringWidth(sYou) / 2), 30);
- _screenSurface.drawString(sYou, 4);
- _screenSurface.putxy(580 - (_screenSurface.getStringWidth(sAre) / 2), 50);
- _screenSurface.drawString(sAre, 4);
- _screenSurface.putxy(580 - (_screenSurface.getStringWidth(sAlone) / 2), 70);
- _screenSurface.drawString(sAlone, 4);
+ _screenSurface->putxy(580 - (_screenSurface->getStringWidth(sYou) / 2), 30);
+ _screenSurface->drawString(sYou, 4);
+ _screenSurface->putxy(580 - (_screenSurface->getStringWidth(sAre) / 2), 50);
+ _screenSurface->drawString(sAre, 4);
+ _screenSurface->putxy(580 - (_screenSurface->getStringWidth(sAlone) / 2), 70);
+ _screenSurface->drawString(sAlone, 4);
_currBitIndex = 0;
}
@@ -1080,7 +1080,7 @@ void MortevielleEngine::initGame() {
_place = MANOR_FRONT;
_currentHourCount = 0;
if (!_coreVar._alreadyEnteredManor)
- _blo = true;
+ _outsideOnlyFl = true;
_inGameHourDuration = kTime1;
_currentTime = readclock();
}
@@ -1255,24 +1255,24 @@ void MortevielleEngine::startMusicOrSpeech(int so) {
;
} else if ((!_introSpeechPlayed) && (!_coreVar._alreadyEnteredManor)) {
// Type 1: Speech
- _soundManager.startSpeech(10, 1, 1);
+ _soundManager->startSpeech(10, 1, 1);
_introSpeechPlayed = true;
} else {
if (((_coreVar._currPlace == MOUNTAIN) || (_coreVar._currPlace == MANOR_FRONT) || (_coreVar._currPlace == MANOR_BACK)) && (getRandomNumber(1, 3) == 2))
// Type 1: Speech
- _soundManager.startSpeech(9, getRandomNumber(2, 4), 1);
+ _soundManager->startSpeech(9, getRandomNumber(2, 4), 1);
else if ((_coreVar._currPlace == CHAPEL) && (getRandomNumber(1, 2) == 1))
// Type 1: Speech
- _soundManager.startSpeech(8, 1, 1);
+ _soundManager->startSpeech(8, 1, 1);
else if ((_coreVar._currPlace == WELL) && (getRandomNumber(1, 2) == 2))
// Type 1: Speech
- _soundManager.startSpeech(12, 1, 1);
+ _soundManager->startSpeech(12, 1, 1);
else if (_coreVar._currPlace == INSIDE_WELL)
// Type 1: Speech
- _soundManager.startSpeech(13, 1, 1);
+ _soundManager->startSpeech(13, 1, 1);
else
// Type 2 : music
- _soundManager.startSpeech(getRandomNumber(1, 17), 1, 2);
+ _soundManager->startSpeech(getRandomNumber(1, 17), 1, 2);
}
}
@@ -1284,13 +1284,13 @@ void MortevielleEngine::loseGame() {
resetOpenObjects();
_roomDoorId = OWN_ROOM;
_curSearchObjId = 0;
- _menu.unsetSearchMenu();
- if (!_blo)
+ _menu->unsetSearchMenu();
+ if (!_outsideOnlyFl)
getPresence(MANOR_FRONT);
_loseGame = true;
clearUpperLeftPart();
- _screenSurface.drawBox(60, 35, 400, 50, 15);
+ _screenSurface->drawBox(60, 35, 400, 50, 15);
handleDescriptionText(9, _crep);
clearDescriptionBar();
clearVerbBar();
@@ -1333,20 +1333,20 @@ void MortevielleEngine::startDialog(int16 rep) {
assert(rep >= 0);
- _mouse.hideMouse();
+ _mouse->hideMouse();
Common::String dialogStr = getString(rep + kDialogStringIndex);
- _text.displayStr(dialogStr, 230, 4, 65, 26, 5);
- _dialogManager.drawF3F8();
+ _text->displayStr(dialogStr, 230, 4, 65, 26, 5);
+ _dialogManager->drawF3F8();
key = 0;
do {
- _soundManager.startSpeech(rep, haut[_caff - 69], 0);
- key = _dialogManager.waitForF3F8();
+ _soundManager->startSpeech(rep, haut[_caff - 69], 0);
+ key = _dialogManager->waitForF3F8();
if (shouldQuit())
return;
} while (key != 66);
clearScreen();
- _mouse.showMouse();
+ _mouse->showMouse();
}
/**
@@ -1357,7 +1357,7 @@ void MortevielleEngine::endSearch() {
_heroSearching = false;
_obpart = false;
_searchCount = 0;
- _menu.unsetSearchMenu();
+ _menu->unsetSearchMenu();
}
/**
@@ -1379,21 +1379,21 @@ void MortevielleEngine::gotoDiningRoom() {
showPeoplePresent(_currBitIndex);
_caff = 77;
drawPictureWithText();
- _screenSurface.drawBox(223, 47, 155, 92, 15);
+ _screenSurface->drawBox(223, 47, 155, 92, 15);
handleDescriptionText(2, 33);
testKey(false);
menuUp();
- _mouse.hideMouse();
+ _mouse->hideMouse();
clearScreen();
drawDiscussionBox();
startDialog(140);
drawRightFrame();
drawClock();
- _mouse.showMouse();
+ _mouse->showMouse();
_coreVar._currPlace = OWN_ROOM;
prepareDisplayText();
resetPresenceInRooms(DINING_ROOM);
- if (!_blo)
+ if (!_outsideOnlyFl)
getPresence(OWN_ROOM);
_currBitIndex = 0;
_savedBitIndex = 0;
@@ -1451,8 +1451,8 @@ void MortevielleEngine::floodedInWell() {
* @remarks Originally called 'antegame'
*/
void MortevielleEngine::gameLoaded() {
- _mouse.hideMouse();
- _menu._menuDisplayed = false;
+ _mouse->hideMouse();
+ _menu->_menuDisplayed = false;
_loseGame = true;
_anyone = false;
_destinationOk = true;
@@ -1490,11 +1490,11 @@ void MortevielleEngine::gameLoaded() {
handleDescriptionText(2, _crep);
clearVerbBar();
_endGame = false;
- _menu.setDestinationText(_coreVar._currPlace);
- _menu.setInventoryText();
+ _menu->setDestinationText(_coreVar._currPlace);
+ _menu->setInventoryText();
if (_coreVar._selectedObjectId != 0)
displayItemInHand(_coreVar._selectedObjectId + 400);
- _mouse.showMouse();
+ _mouse->showMouse();
}
/**
@@ -1508,7 +1508,7 @@ void MortevielleEngine::handleOpcode() {
_keyPressedEsc = false;
if (!_anyone) {
if (_uptodatePresence) {
- if ((_currMenu == MENU_MOVE) || (_currAction == _menu._opcodeLeave) || (_currAction == _menu._opcodeSleep) || (_currAction == _menu._opcodeEat)) {
+ if ((_currMenu == MENU_MOVE) || (_currAction == _menu->_opcodeLeave) || (_currAction == _menu->_opcodeSleep) || (_currAction == _menu->_opcodeEat)) {
_controlMenu = 4;
menuUp();
return;
@@ -1521,60 +1521,60 @@ void MortevielleEngine::handleOpcode() {
fctDiscuss();
else if (_currMenu == MENU_INVENTORY)
fctInventoryTake();
- else if (_currAction == _menu._opcodeAttach)
+ else if (_currAction == _menu->_opcodeAttach)
fctAttach();
- else if (_currAction == _menu._opcodeWait)
+ else if (_currAction == _menu->_opcodeWait)
fctWait();
- else if (_currAction == _menu._opcodeForce)
+ else if (_currAction == _menu->_opcodeForce)
fctForce();
- else if (_currAction == _menu._opcodeSleep)
+ else if (_currAction == _menu->_opcodeSleep)
fctSleep();
- else if (_currAction == _menu._opcodeListen)
+ else if (_currAction == _menu->_opcodeListen)
fctListen();
- else if (_currAction == _menu._opcodeEnter)
+ else if (_currAction == _menu->_opcodeEnter)
fctEnter();
- else if (_currAction == _menu._opcodeClose)
+ else if (_currAction == _menu->_opcodeClose)
fctClose();
- else if (_currAction == _menu._opcodeSearch)
+ else if (_currAction == _menu->_opcodeSearch)
fctSearch();
- else if (_currAction == _menu._opcodeKnock)
+ else if (_currAction == _menu->_opcodeKnock)
fctKnock();
- else if (_currAction == _menu._opcodeScratch)
+ else if (_currAction == _menu->_opcodeScratch)
fctScratch();
- else if (_currAction == _menu._opcodeRead)
+ else if (_currAction == _menu->_opcodeRead)
fctRead();
- else if (_currAction == _menu._opcodeEat)
+ else if (_currAction == _menu->_opcodeEat)
fctEat();
- else if (_currAction == _menu._opcodePlace)
+ else if (_currAction == _menu->_opcodePlace)
fctPlace();
- else if (_currAction == _menu._opcodeOpen)
+ else if (_currAction == _menu->_opcodeOpen)
fctOpen();
- else if (_currAction == _menu._opcodeTake)
+ else if (_currAction == _menu->_opcodeTake)
fctTake();
- else if (_currAction == _menu._opcodeLook)
+ else if (_currAction == _menu->_opcodeLook)
fctLook();
- else if (_currAction == _menu._opcodeSmell)
+ else if (_currAction == _menu->_opcodeSmell)
fctSmell();
- else if (_currAction == _menu._opcodeSound)
+ else if (_currAction == _menu->_opcodeSound)
fctSound();
- else if (_currAction == _menu._opcodeLeave)
+ else if (_currAction == _menu->_opcodeLeave)
fctLeave();
- else if (_currAction == _menu._opcodeLift)
+ else if (_currAction == _menu->_opcodeLift)
fctLift();
- else if (_currAction == _menu._opcodeTurn)
+ else if (_currAction == _menu->_opcodeTurn)
fctTurn();
- else if (_currAction == _menu._opcodeSSearch)
+ else if (_currAction == _menu->_opcodeSSearch)
fctSelfSearch();
- else if (_currAction == _menu._opcodeSRead)
+ else if (_currAction == _menu->_opcodeSRead)
fctSelfRead();
- else if (_currAction == _menu._opcodeSPut)
+ else if (_currAction == _menu->_opcodeSPut)
fctSelfPut();
- else if (_currAction == _menu._opcodeSLook)
+ else if (_currAction == _menu->_opcodeSLook)
fctSelftLook();
_hiddenHero = false;
- if (_currAction == _menu._opcodeSHide)
+ if (_currAction == _menu->_opcodeSHide)
fctSelfHide();
} else if (_anyone) {
interactNPC();
@@ -1640,9 +1640,9 @@ void MortevielleEngine::charToHour() {
* @remarks Originally called 'clsf1'
*/
void MortevielleEngine::clearUpperLeftPart() {
- _mouse.hideMouse();
- _screenSurface.fillRect(0, Common::Rect(0, 11, 514, 175));
- _mouse.showMouse();
+ _mouse->hideMouse();
+ _screenSurface->fillRect(0, Common::Rect(0, 11, 514, 175));
+ _mouse->showMouse();
}
/**
@@ -1650,16 +1650,16 @@ void MortevielleEngine::clearUpperLeftPart() {
* @remarks Originally called 'clsf2'
*/
void MortevielleEngine::clearDescriptionBar() {
- _mouse.hideMouse();
+ _mouse->hideMouse();
if (_largestClearScreen) {
- _screenSurface.fillRect(0, Common::Rect(1, 176, 633, 199));
- _screenSurface.drawBox(0, 176, 634, 23, 15);
+ _screenSurface->fillRect(0, Common::Rect(1, 176, 633, 199));
+ _screenSurface->drawBox(0, 176, 634, 23, 15);
_largestClearScreen = false;
} else {
- _screenSurface.fillRect(0, Common::Rect(1, 176, 633, 190));
- _screenSurface.drawBox(0, 176, 634, 14, 15);
+ _screenSurface->fillRect(0, Common::Rect(1, 176, 633, 190));
+ _screenSurface->drawBox(0, 176, 634, 14, 15);
}
- _mouse.showMouse();
+ _mouse->showMouse();
}
/**
@@ -1667,10 +1667,10 @@ void MortevielleEngine::clearDescriptionBar() {
* @remarks Originally called 'clsf3'
*/
void MortevielleEngine::clearVerbBar() {
- _mouse.hideMouse();
- _screenSurface.fillRect(0, Common::Rect(1, 192, 633, 199));
- _screenSurface.drawBox(0, 191, 634, 8, 15);
- _mouse.showMouse();
+ _mouse->hideMouse();
+ _screenSurface->fillRect(0, Common::Rect(1, 192, 633, 199));
+ _screenSurface->drawBox(0, 191, 634, 8, 15);
+ _mouse->showMouse();
}
/**
@@ -1680,10 +1680,10 @@ void MortevielleEngine::clearVerbBar() {
void MortevielleEngine::clearUpperRightPart() {
Common::String st;
- _mouse.hideMouse();
+ _mouse->hideMouse();
// Clear ambiance description
- _screenSurface.fillRect(15, Common::Rect(544, 93, 600, 98));
+ _screenSurface->fillRect(15, Common::Rect(544, 93, 600, 98));
if (_coreVar._faithScore < 33)
st = getEngineString(S_COOL);
else if (_coreVar._faithScore < 66)
@@ -1691,13 +1691,13 @@ void MortevielleEngine::clearUpperRightPart() {
else if (_coreVar._faithScore > 65)
st = getEngineString(S_MALSAINE);
- int x1 = 580 - (_screenSurface.getStringWidth(st) / 2);
- _screenSurface.putxy(x1, 92);
- _screenSurface.drawString(st, 4);
+ int x1 = 580 - (_screenSurface->getStringWidth(st) / 2);
+ _screenSurface->putxy(x1, 92);
+ _screenSurface->drawString(st, 4);
// Clear person list
- _screenSurface.fillRect(15, Common::Rect(560, 24, 610, 86));
- _mouse.showMouse();
+ _screenSurface->fillRect(15, Common::Rect(560, 24, 610, 86));
+ _mouse->showMouse();
}
/**
@@ -1713,7 +1713,7 @@ int MortevielleEngine::getRandomNumber(int minval, int maxval) {
* @remarks Originally called 'aldepl'
*/
void MortevielleEngine::showMoveMenuAlert() {
- _dialogManager.show(getEngineString(S_USE_DEP_MENU));
+ _dialogManager->show(getEngineString(S_USE_DEP_MENU));
}
/**
@@ -1888,24 +1888,18 @@ void MortevielleEngine::resetObjectPlace() {
_tabdon[i] = _tabdon[i + 390];
}
-/**
- * Engine function - When restarting the game, reset the main variables used by the engine
- * @remarks Originally called 'inzon'
- */
-void MortevielleEngine::resetVariables() {
- resetObjectPlace();
-
- _coreVar._alreadyEnteredManor = false;
- _coreVar._selectedObjectId = 0;
- _coreVar._cellarObjectId = 0;
- _coreVar._atticBallHoleObjectId = 0;
- _coreVar._atticRodHoleObjectId = 0;
- _coreVar._wellObjectId = 0;
- _coreVar._secretPassageObjectId = 0;
- _coreVar._purpleRoomObjectId = 136;
- _coreVar._cryptObjectId = 141;
- _coreVar._faithScore = getRandomNumber(4, 10);
- _coreVar._currPlace = MANOR_FRONT;
+void MortevielleEngine::resetCoreVar() {
+ _saveStruct._alreadyEnteredManor = _coreVar._alreadyEnteredManor = false;
+ _saveStruct._selectedObjectId = _coreVar._selectedObjectId = 0;
+ _saveStruct._cellarObjectId = _coreVar._cellarObjectId = 0;
+ _saveStruct._atticBallHoleObjectId = _coreVar._atticBallHoleObjectId = 0;
+ _saveStruct._atticRodHoleObjectId = _coreVar._atticRodHoleObjectId = 0;
+ _saveStruct._wellObjectId = _coreVar._wellObjectId = 0;
+ _saveStruct._secretPassageObjectId = _coreVar._secretPassageObjectId = 0;
+ _saveStruct._purpleRoomObjectId = _coreVar._purpleRoomObjectId = 136;
+ _saveStruct._cryptObjectId = _coreVar._cryptObjectId = 141;
+ _saveStruct._faithScore = _coreVar._faithScore = getRandomNumber(4, 10);
+ _saveStruct._currPlace = _coreVar._currPlace = MANOR_FRONT;
for (int i = 2; i <= 6; ++i)
_coreVar._inventory[i] = 0;
@@ -1913,7 +1907,7 @@ void MortevielleEngine::resetVariables() {
// Only object in inventory: a gun
_coreVar._inventory[1] = 113;
- _coreVar._fullHour = (unsigned char)20;
+ _saveStruct._fullHour = _coreVar._fullHour = (unsigned char)20;
for (int i = 1; i <= 10; ++i)
_coreVar._pctHintFound[i] = ' ';
@@ -1931,6 +1925,14 @@ void MortevielleEngine::resetVariables() {
_coreVar._availableQuestion[i] = ' ';
_coreVar._availableQuestion[33] = '*';
+}
+/**
+ * Engine function - When restarting the game, reset the main variables used by the engine
+ * @remarks Originally called 'inzon'
+ */
+void MortevielleEngine::resetVariables() {
+ resetObjectPlace();
+ resetCoreVar();
for (int i = 1; i <= 8; ++i)
_charAnswerCount[i] = 0;
@@ -2074,10 +2076,10 @@ void MortevielleEngine::loadCFIPH() {
error("Missing file - *cfiph.mor");
}
- _soundManager._cfiphBuffer = (uint16 *)malloc(sizeof(uint16) * (f.size() / 2));
+ _soundManager->_cfiphBuffer = (uint16 *)malloc(sizeof(uint16) * (f.size() / 2));
for (int i = 0; i < (f.size() / 2); ++i)
- _soundManager._cfiphBuffer[i] = f.readUint16BE();
+ _soundManager->_cfiphBuffer[i] = f.readUint16BE();
f.close();
}
@@ -2102,10 +2104,10 @@ void MortevielleEngine::music() {
f.read(compMusicBuf, size);
f.close();
- int musicSize = _soundManager.decodeMusic(compMusicBuf, musicBuf, size);
+ int musicSize = _soundManager->decodeMusic(compMusicBuf, musicBuf, size);
free(compMusicBuf);
- _soundManager.playSong(musicBuf, musicSize, 5);
+ _soundManager->playSong(musicBuf, musicSize, 5);
while (keyPressed())
getChar();
@@ -2120,14 +2122,14 @@ void MortevielleEngine::showTitleScreen() {
clearScreen();
handleDescriptionText(7, 2035);
_caff = 51;
- _text.taffich();
+ _text->taffich();
testKeyboard();
clearScreen();
draw(0, 0);
Common::String cpr = "COPYRIGHT 1989 : LANKHOR";
- _screenSurface.putxy(104 + 72 * kResolutionScaler, 185);
- _screenSurface.drawString(cpr, 0);
+ _screenSurface->putxy(104 + 72 * kResolutionScaler, 185);
+ _screenSurface->drawString(cpr, 0);
}
/**
@@ -2135,10 +2137,10 @@ void MortevielleEngine::showTitleScreen() {
* @remarks Originally called 'dessine'
*/
void MortevielleEngine::draw(int x, int y) {
- _mouse.hideMouse();
+ _mouse->hideMouse();
setPal(_numpal);
displayPicture(_curPict, x, y);
- _mouse.showMouse();
+ _mouse->showMouse();
}
/**
@@ -2147,9 +2149,9 @@ void MortevielleEngine::draw(int x, int y) {
*/
void MortevielleEngine::drawRightFrame() {
setPal(89);
- _mouse.hideMouse();
+ _mouse->hideMouse();
displayPicture(_rightFramePict, 0, 0);
- _mouse.showMouse();
+ _mouse->showMouse();
}
/**
@@ -2205,10 +2207,10 @@ void MortevielleEngine::prepareRoom() {
_minute = 30;
drawClock();
}
- if (_mouse._pos.y < 12)
+ if (_mouse->_pos.y < 12)
return;
- if (!_blo) {
+ if (!_outsideOnlyFl) {
if ((hour == 12) || ((hour > 18) && (hour < 21)) || ((hour >= 0) && (hour < 7)))
_inGameHourDuration = kTime2;
else
@@ -2221,8 +2223,8 @@ void MortevielleEngine::prepareRoom() {
int newTime = readclock();
if ((newTime - _currentTime) > _inGameHourDuration) {
- bool activeMenu = _menu._menuActive;
- _menu.eraseMenu();
+ bool activeMenu = _menu->_menuActive;
+ _menu->eraseMenu();
_currentHourCount += ((newTime - _currentTime) / _inGameHourDuration);
_currentTime = newTime;
switch (_place) {
@@ -2280,8 +2282,8 @@ void MortevielleEngine::prepareRoom() {
prepareScreenType2();
displayTextInVerbBar(getEngineString(S_HEAR_NOISE));
int rand = (getRandomNumber(0, 4)) - 2;
- _soundManager.startSpeech(1, rand, 1);
- _soundManager.waitSpeech();
+ _soundManager->startSpeech(1, rand, 1);
+ _soundManager->waitSpeech();
clearVerbBar();
}
}
@@ -2289,7 +2291,7 @@ void MortevielleEngine::prepareRoom() {
}
if (activeMenu)
- _menu.drawMenu();
+ _menu->drawMenu();
}
}
_endTime = readclock();
@@ -2315,15 +2317,15 @@ void MortevielleEngine::drawClock() {
const int y = 123;
const int rg = 9;
- _mouse.hideMouse();
+ _mouse->hideMouse();
- _screenSurface.drawRectangle(570, 118, 20, 10);
- _screenSurface.drawRectangle(578, 114, 6, 18);
+ _screenSurface->drawRectangle(570, 118, 20, 10);
+ _screenSurface->drawRectangle(578, 114, 6, 18);
if (_minute == 0)
- _screenSurface.drawLine(((uint)x >> 1) * kResolutionScaler, y, ((uint)x >> 1) * kResolutionScaler, (y - rg), 1);
+ _screenSurface->drawLine(((uint)x >> 1) * kResolutionScaler, y, ((uint)x >> 1) * kResolutionScaler, (y - rg), 1);
else
- _screenSurface.drawLine(((uint)x >> 1) * kResolutionScaler, y, ((uint)x >> 1) * kResolutionScaler, (y + rg), 1);
+ _screenSurface->drawLine(((uint)x >> 1) * kResolutionScaler, y, ((uint)x >> 1) * kResolutionScaler, (y + rg), 1);
int hour12 = _hour;
if (hour12 > 12)
@@ -2331,20 +2333,20 @@ void MortevielleEngine::drawClock() {
if (hour12 == 0)
hour12 = 12;
- _screenSurface.drawLine(((uint)x >> 1) * kResolutionScaler, y, ((uint)(x + cv[0][hour12 - 1]) >> 1) * kResolutionScaler, y + cv[1][hour12 - 1], 1);
- _mouse.showMouse();
- _screenSurface.putxy(568, 154);
+ _screenSurface->drawLine(((uint)x >> 1) * kResolutionScaler, y, ((uint)(x + cv[0][hour12 - 1]) >> 1) * kResolutionScaler, y + cv[1][hour12 - 1], 1);
+ _mouse->showMouse();
+ _screenSurface->putxy(568, 154);
if (_hour > 11)
- _screenSurface.drawString("PM ", 1);
+ _screenSurface->drawString("PM ", 1);
else
- _screenSurface.drawString("AM ", 1);
+ _screenSurface->drawString("AM ", 1);
- _screenSurface.putxy(550, 160);
+ _screenSurface->putxy(550, 160);
if ((_day >= 0) && (_day <= 8)) {
Common::String tmp = getEngineString(S_DAY);
tmp.insertChar((char)(_day + 49), 0);
- _screenSurface.drawString(tmp, 1);
+ _screenSurface->drawString(tmp, 1);
}
}
@@ -2364,8 +2366,7 @@ Common::String MortevielleEngine::copy(const Common::String &s, int idx, size_t
// Copy the substring into a temporary buffer
char *tmp = new char[size + 1];
- strncpy(tmp, s.c_str() + idx - 1, size);
- tmp[size] = '\0';
+ Common::strlcpy(tmp, s.c_str() + idx - 1, size + 1);
Common::String result(tmp);
delete[] tmp;
@@ -2377,7 +2378,7 @@ Common::String MortevielleEngine::copy(const Common::String &s, int idx, size_t
* @remarks Originally called 'hirs'
*/
void MortevielleEngine::clearScreen() {
- _screenSurface.clearScreen();
+ _screenSurface->clearScreen();
}
/**
@@ -2392,8 +2393,8 @@ void MortevielleEngine::initCaveOrCellar() {
prepareScreenType2();
displayTextInVerbBar(getEngineString(S_SOMEONE_ENTERS));
int rand = (getRandomNumber(0, 4)) - 2;
- _soundManager.startSpeech(2, rand, 1);
- _soundManager.waitSpeech();
+ _soundManager->startSpeech(2, rand, 1);
+ _soundManager->waitSpeech();
// The original was doing here a useless loop.
// It has been removed
@@ -2417,7 +2418,7 @@ void MortevielleEngine::displayControlMenu() {
void MortevielleEngine::displayPicture(const byte *pic, int x, int y) {
GfxSurface surface;
surface.decode(pic);
- _screenSurface.drawPicture(surface, x, y);
+ _screenSurface->drawPicture(surface, x, y);
}
void MortevielleEngine::adzon() {
@@ -2466,7 +2467,7 @@ void MortevielleEngine::displayTextInDescriptionBar(int x, int y, int nb, int me
Common::String tmpStr = getString(mesgId);
if ((y == 182) && ((int) tmpStr.size() > nb))
y = 176;
- _text.displayStr(tmpStr, x, y, nb, 20, _textColor);
+ _text->displayStr(tmpStr, x, y, nb, 20, _textColor);
}
/**
@@ -2483,7 +2484,7 @@ void MortevielleEngine::handleDescriptionText(int f, int mesgId) {
_largestClearScreen = false;
clearDescriptionBar();
- _text.displayStr(tmpStr, 8, 176, 85, 3, 5);
+ _text->displayStr(tmpStr, 8, 176, 85, 3, 5);
} else {
mapMessageId(mesgId);
switch (f) {
@@ -2512,7 +2513,7 @@ void MortevielleEngine::handleDescriptionText(int f, int mesgId) {
i = 5;
Common::String tmpStr = getString(mesgId);
- _text.displayStr(tmpStr, 80, 40, 60, 25, i);
+ _text->displayStr(tmpStr, 80, 40, 60, 25, i);
if (mesgId == 180)
_coreVar._pctHintFound[6] = '*';
@@ -2585,32 +2586,32 @@ void MortevielleEngine::resetOpenObjects() {
*/
void MortevielleEngine::displayTextBlock(Common::String text) {
// Some dead code was present in the original: removed
- _screenSurface.putxy(8, 177);
+ _screenSurface->putxy(8, 177);
int tlig = 59 + (kResolutionScaler - 1) * 36;
if ((int)text.size() < tlig)
- _screenSurface.drawString(text, 5);
+ _screenSurface->drawString(text, 5);
else if ((int)text.size() < (tlig << 1)) {
- _screenSurface.putxy(8, 176);
- _screenSurface.drawString(copy(text, 1, (tlig - 1)), 5);
- _screenSurface.putxy(8, 182);
- _screenSurface.drawString(copy(text, tlig, tlig << 1), 5);
+ _screenSurface->putxy(8, 176);
+ _screenSurface->drawString(copy(text, 1, (tlig - 1)), 5);
+ _screenSurface->putxy(8, 182);
+ _screenSurface->drawString(copy(text, tlig, tlig << 1), 5);
} else {
_largestClearScreen = true;
clearDescriptionBar();
- _screenSurface.putxy(8, 176);
- _screenSurface.drawString(copy(text, 1, (tlig - 1)), 5);
- _screenSurface.putxy(8, 182);
- _screenSurface.drawString(copy(text, tlig, ((tlig << 1) - 1)), 5);
- _screenSurface.putxy(8, 190);
- _screenSurface.drawString(copy(text, tlig << 1, tlig * 3), 5);
+ _screenSurface->putxy(8, 176);
+ _screenSurface->drawString(copy(text, 1, (tlig - 1)), 5);
+ _screenSurface->putxy(8, 182);
+ _screenSurface->drawString(copy(text, tlig, ((tlig << 1) - 1)), 5);
+ _screenSurface->putxy(8, 190);
+ _screenSurface->drawString(copy(text, tlig << 1, tlig * 3), 5);
}
}
void MortevielleEngine::displayTextInVerbBar(Common::String text) {
clearVerbBar();
- _screenSurface.putxy(8, 192);
- _screenSurface.drawString(text, 5);
+ _screenSurface->putxy(8, 192);
+ _screenSurface->drawString(text, 5);
}
/**
@@ -2623,8 +2624,8 @@ void MortevielleEngine::displayItemInHand(int objId) {
if (objId != 500)
strp = getString(objId - 501 + kInventoryStringIndex);
- _menu.setText(_menu._inventoryMenu[8], strp);
- _menu.disableMenuItem(_menu._inventoryMenu[8]);
+ _menu->setText(_menu->_inventoryMenu[8], strp);
+ _menu->disableMenuItem(_menu->_inventoryMenu[8]);
}
/**
@@ -2832,7 +2833,7 @@ int MortevielleEngine::getPresence(int roomId) {
* @remarks Originally called 'writetp'
*/
void MortevielleEngine::displayQuestionText(Common::String s, int cmd) {
- _screenSurface.drawString(s, cmd);
+ _screenSurface->drawString(s, cmd);
}
/**
@@ -2856,7 +2857,7 @@ void MortevielleEngine::displayAnimFrame(int frameNum, int animId) {
GfxSurface surface;
surface.decode(&_curAnim[offset]);
- _screenSurface.drawPicture(surface, 0, 12);
+ _screenSurface->drawPicture(surface, 0, 12);
prepareScreenType1();
}
@@ -2869,10 +2870,10 @@ void MortevielleEngine::drawPicture() {
clearUpperLeftPart();
if (_caff > 99) {
draw(60, 33);
- _screenSurface.drawBox(118, 32, 291, 122, 15); // Medium box
+ _screenSurface->drawBox(118, 32, 291, 122, 15); // Medium box
} else if (_caff > 69) {
draw(112, 48); // Heads
- _screenSurface.drawBox(222, 47, 155, 92, 15);
+ _screenSurface->drawBox(222, 47, 155, 92, 15);
} else {
draw(0, 12);
prepareScreenType1();
@@ -2911,7 +2912,7 @@ void MortevielleEngine::drawPicture() {
}
void MortevielleEngine::drawPictureWithText() {
- _text.taffich();
+ _text->taffich();
drawPicture();
_destinationOk = false;
}
@@ -2925,7 +2926,7 @@ void MortevielleEngine::testKey(bool d) {
int x, y;
bool click;
- _mouse.hideMouse();
+ _mouse->hideMouse();
displayStatusInDescriptionBar('K');
// Wait for release from any key or mouse button
@@ -2933,8 +2934,10 @@ void MortevielleEngine::testKey(bool d) {
_key = gettKeyPressed();
do {
- _mouse.getMousePosition(x, y, click);
- keyPressed();
+ _mouse->getMousePosition(x, y, click);
+ quest = keyPressed();
+ if (quest && shouldQuit())
+ return;
} while (click);
// Event loop
@@ -2942,14 +2945,14 @@ void MortevielleEngine::testKey(bool d) {
if (d)
prepareRoom();
quest = keyPressed();
- _mouse.getMousePosition(x, y, click);
+ _mouse->getMousePosition(x, y, click);
if (shouldQuit())
return;
} while (!(quest || (click) || (d && _anyone)));
if (quest)
gettKeyPressed();
setMouseClick(false);
- _mouse.showMouse();
+ _mouse->showMouse();
}
/**
@@ -3060,7 +3063,7 @@ void MortevielleEngine::getSearchDescription(int objId) {
* @remarks Originally called 'mennor'
*/
void MortevielleEngine::menuUp() {
- _menu.menuUp(_currMenu);
+ _menu->menuUp(_currMenu);
}
/**
@@ -3069,7 +3072,7 @@ void MortevielleEngine::menuUp() {
*/
void MortevielleEngine::drawDiscussionBox() {
draw(10, 80);
- _screenSurface.drawBox(18, 79, 155, 92, 15);
+ _screenSurface->drawBox(18, 79, 155, 92, 15);
}
/**
@@ -3100,7 +3103,7 @@ void MortevielleEngine::addObjectToInventory(int objectId) {
if (_coreVar._inventory[i] == 0) {
_coreVar._inventory[i] = objectId;
- _menu.setInventoryText();
+ _menu->setInventoryText();
} else
// Inventory is full
_crep = 139;
@@ -3111,8 +3114,8 @@ void MortevielleEngine::addObjectToInventory(int objectId) {
* @remarks Originally called 'quelquun'
*/
void MortevielleEngine::interactNPC() {
- if (_menu._menuDisplayed)
- _menu.eraseMenu();
+ if (_menu->_menuDisplayed)
+ _menu->eraseMenu();
endSearch();
_crep = 997;
@@ -3122,9 +3125,9 @@ L1:
_crep = 138;
handleDescriptionText(2, _crep);
if (_crep == 138)
- _soundManager.startSpeech(5, 2, 1);
+ _soundManager->startSpeech(5, 2, 1);
else
- _soundManager.startSpeech(4, 4, 1);
+ _soundManager->startSpeech(4, 4, 1);
if (_openObjCount == 0)
_coreVar._faithScore += 2;
@@ -3133,12 +3136,12 @@ L1:
else
_coreVar._faithScore += 3 * (_coreVar._faithScore / 10);
exitRoom();
- _menu.setDestinationText(LANDING);
+ _menu->setDestinationText(LANDING);
int charIdx = convertBitIndexToCharacterIndex(_currBitIndex);
_caff = 69 + charIdx;
_crep = _caff;
_currMenu = MENU_DISCUSS;
- _currAction = (_menu._discussMenu[charIdx]._menuId << 8) | _menu._discussMenu[charIdx]._actionId;
+ _currAction = (_menu->_discussMenu[charIdx]._menuId << 8) | _menu->_discussMenu[charIdx]._actionId;
_syn = true;
_col = true;
} else {
@@ -3149,15 +3152,15 @@ L1:
} else {
handleDescriptionText(2, 136);
int rand = (getRandomNumber(0, 4)) - 2;
- _soundManager.startSpeech(3, rand, 1);
+ _soundManager->startSpeech(3, rand, 1);
clearDescriptionBar();
displayAloneText();
resetRoomVariables(MANOR_FRONT);
prepareDisplayText();
}
}
- if (_menu._menuDisplayed)
- _menu.drawMenu();
+ if (_menu->_menuDisplayed)
+ _menu->drawMenu();
}
/**
@@ -3205,25 +3208,25 @@ void MortevielleEngine::displayStatusArrow() {
touch = '\0';
do {
- _mouse.moveMouse(qust, touch);
+ _mouse->moveMouse(qust, touch);
if (shouldQuit())
return;
if (getMouseClick())
- inRect = (_mouse._pos.x < 256 * kResolutionScaler) && (_mouse._pos.y < 176) && (_mouse._pos.y > 12);
+ inRect = (_mouse->_pos.x < 256 * kResolutionScaler) && (_mouse->_pos.y < 176) && (_mouse->_pos.y > 12);
prepareRoom();
} while (!(qust || inRect || _anyone));
if (qust && (touch == '\103'))
- _dialogManager.show(_hintPctMessage);
+ _dialogManager->show(_hintPctMessage);
} while (!((touch == '\73') || ((touch == '\104') && (_x != 0) && (_y != 0)) || (_anyone) || (inRect)));
if (touch == '\73')
_keyPressedEsc = true;
if (inRect) {
- _x = _mouse._pos.x;
- _y = _mouse._pos.y;
+ _x = _mouse->_pos.x;
+ _y = _mouse->_pos.y;
}
}
@@ -3291,7 +3294,7 @@ void MortevielleEngine::displayLookScreen(int objId) {
int mdes = _caff;
_caff = objId;
- if (((_caff > 29) && (_caff < 33)) || (_caff == 144) || (_caff == 147) || (_caff == 149) || (_currAction == _menu._opcodeSLook)) {
+ if (((_caff > 29) && (_caff < 33)) || (_caff == 144) || (_caff == 147) || (_caff == 149) || (_currAction == _menu->_opcodeSLook)) {
drawPictureWithText();
if ((_caff > 29) && (_caff < 33))
handleDescriptionText(2, _caff);
@@ -3304,7 +3307,7 @@ void MortevielleEngine::displayLookScreen(int objId) {
} else {
_obpart = true;
_crep = _caff + 400;
- _menu.setSearchMenu();
+ _menu->setSearchMenu();
}
}
@@ -3356,10 +3359,10 @@ int MortevielleEngine::checkLeaveSecretPassage() {
* @remarks Originally called 'fenat'
*/
void MortevielleEngine::displayStatusInDescriptionBar(char stat) {
- _mouse.hideMouse();
- _screenSurface.writeCharacter(Common::Point(306, 193), stat, 12);
- _screenSurface.drawBox(300, 191, 16, 8, 15);
- _mouse.showMouse();
+ _mouse->hideMouse();
+ _screenSurface->writeCharacter(Common::Point(306, 193), stat, 12);
+ _screenSurface->drawBox(300, 191, 16, 8, 15);
+ _mouse->showMouse();
}
/**
diff --git a/engines/neverhood/background.cpp b/engines/neverhood/background.cpp
index d6a9900d38..77c1e057a6 100644
--- a/engines/neverhood/background.cpp
+++ b/engines/neverhood/background.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/neverhood/background.h b/engines/neverhood/background.h
index ef88be21c0..d4ba20c8e5 100644
--- a/engines/neverhood/background.h
+++ b/engines/neverhood/background.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/neverhood/blbarchive.cpp b/engines/neverhood/blbarchive.cpp
index c743037e63..d1d8cf1aa2 100644
--- a/engines/neverhood/blbarchive.cpp
+++ b/engines/neverhood/blbarchive.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/neverhood/blbarchive.h b/engines/neverhood/blbarchive.h
index 620b12b8ac..25e816ddcd 100644
--- a/engines/neverhood/blbarchive.h
+++ b/engines/neverhood/blbarchive.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/neverhood/configure.engine b/engines/neverhood/configure.engine
new file mode 100644
index 0000000000..46910e293e
--- /dev/null
+++ b/engines/neverhood/configure.engine
@@ -0,0 +1,3 @@
+# This file is included from the main "configure" script
+# add_engine [name] [desc] [build-by-default] [subengines] [base games] [deps]
+add_engine neverhood "Neverhood" yes
diff --git a/engines/neverhood/console.cpp b/engines/neverhood/console.cpp
index 34438d821f..91ab3e767a 100644
--- a/engines/neverhood/console.cpp
+++ b/engines/neverhood/console.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -34,13 +34,13 @@
namespace Neverhood {
Console::Console(NeverhoodEngine *vm) : GUI::Debugger(), _vm(vm) {
- DCmd_Register("cheat", WRAP_METHOD(Console, Cmd_Cheat));
- DCmd_Register("checkresource", WRAP_METHOD(Console, Cmd_CheckResource));
- DCmd_Register("dumpresource", WRAP_METHOD(Console, Cmd_DumpResource));
- DCmd_Register("dumpvars", WRAP_METHOD(Console, Cmd_Dumpvars));
- DCmd_Register("playsound", WRAP_METHOD(Console, Cmd_PlaySound));
- DCmd_Register("scene", WRAP_METHOD(Console, Cmd_Scene));
- DCmd_Register("surfaces", WRAP_METHOD(Console, Cmd_Surfaces));
+ registerCmd("cheat", WRAP_METHOD(Console, Cmd_Cheat));
+ registerCmd("checkresource", WRAP_METHOD(Console, Cmd_CheckResource));
+ registerCmd("dumpresource", WRAP_METHOD(Console, Cmd_DumpResource));
+ registerCmd("dumpvars", WRAP_METHOD(Console, Cmd_Dumpvars));
+ registerCmd("playsound", WRAP_METHOD(Console, Cmd_PlaySound));
+ registerCmd("scene", WRAP_METHOD(Console, Cmd_Scene));
+ registerCmd("surfaces", WRAP_METHOD(Console, Cmd_Surfaces));
}
Console::~Console() {
@@ -55,33 +55,33 @@ bool Console::Cmd_Scene(int argc, const char **argv) {
const char *sceneTypes[] = { "normal", "smacker", "navigation" };
- DebugPrintf("Current module: %d, previous module: %d, scene %d (%s scene)\n", currentModule, previousModule, scenenNum, sceneTypes[sceneType]);
+ debugPrintf("Current module: %d, previous module: %d, scene %d (%s scene)\n", currentModule, previousModule, scenenNum, sceneTypes[sceneType]);
if (sceneType == kSceneTypeNormal) {
Scene *scene = (Scene *)((GameModule *)_vm->_gameModule->_childObject)->_childObject;
// Normal scenes have a background and a cursor file hash
- DebugPrintf("Background hash: 0x%x, cursor hash: 0x%x\n", scene->getBackgroundFileHash(), scene->getCursorFileHash());
+ debugPrintf("Background hash: 0x%x, cursor hash: 0x%x\n", scene->getBackgroundFileHash(), scene->getCursorFileHash());
} else if (sceneType == kSceneTypeSmacker) {
SmackerScene *scene = (SmackerScene *)((GameModule *)_vm->_gameModule->_childObject)->_childObject;
// Smacker scenes have a file hash, or a list of hashes
// TODO: Only the first file hash is shown - any additional hashes, found in
// scenes with a list of hashes (two scenes in module 1100 and the making of
// video) aren't shown yet
- DebugPrintf("File hash: 0x%x\n", scene->getSmackerFileHash());
+ debugPrintf("File hash: 0x%x\n", scene->getSmackerFileHash());
} else if (sceneType == kSceneTypeNavigation) {
NavigationScene *scene = (NavigationScene *)((GameModule *)_vm->_gameModule->_childObject)->_childObject;
// Navigation scenes have a navigation list and its index
NavigationList *navigationList = _vm->_staticData->getNavigationList(scene->getNavigationListId());
int navigationIndex = scene->getGlobalVar(V_NAVIGATION_INDEX);
NavigationItem curNavigation = (*navigationList)[navigationIndex];
- DebugPrintf("Navigation list ID: 0x%x, index: %d\n", scene->getNavigationListId(), navigationIndex);
- DebugPrintf("File hash: 0x%x, cursor hash: 0x%x, Smacker hashes: [left: 0x%x, middle: 0x%x, right: 0x%x\n",
+ debugPrintf("Navigation list ID: 0x%x, index: %d\n", scene->getNavigationListId(), navigationIndex);
+ debugPrintf("File hash: 0x%x, cursor hash: 0x%x, Smacker hashes: [left: 0x%x, middle: 0x%x, right: 0x%x\n",
curNavigation.fileHash, curNavigation.mouseCursorFileHash,
curNavigation.leftSmackerFileHash, curNavigation.middleSmackerFileHash, curNavigation.rightSmackerFileHash);
}
- DebugPrintf("Use %s <module> <scene> to change scenes\n", argv[0]);
- DebugPrintf("Modules are incremental by 100, from 1000 to 3000\n");
+ debugPrintf("Use %s <module> <scene> to change scenes\n", argv[0]);
+ debugPrintf("Modules are incremental by 100, from 1000 to 3000\n");
} else {
int newModule = atoi(argv[1]);
int newScene = atoi(argv[2]);
@@ -102,17 +102,17 @@ bool Console::Cmd_Surfaces(int argc, const char **argv) {
bool Console::Cmd_Cheat(int argc, const char **argv) {
if (argc < 2) {
- DebugPrintf("Cheats for various puzzles in the game\n");
- DebugPrintf("Use %s <cheatname> to use a cheat.\n", argv[0]);
- DebugPrintf("Cheats:\n-------\n");
- DebugPrintf(" buttons - enables all 3 buttons on the door in the purple building, module 3000, scene 9\n");
- DebugPrintf(" cannon - sets the correct cannon combination in module 3000, scene 8\n");
- DebugPrintf(" dice - shows the correct dice combination in the teddy bear puzzle, module 1100, scene 6\n");
- DebugPrintf(" memory - solves the memory puzzle, module 1400, scene 4\n");
- DebugPrintf(" music - shows the correct index in the radio music puzzle, module 2800, scene 1\n");
- DebugPrintf(" radio - enables the radio, module 3000, scene 9 - same as pulling the rightmost cord in the flytrap room\n");
- DebugPrintf(" symbols - solves the symbols puzzle, module 1600, scene 8. Only available in that room\n");
- DebugPrintf(" tubes - shows the correct test tube combination in module 2800, scenes 7 and 10\n");
+ debugPrintf("Cheats for various puzzles in the game\n");
+ debugPrintf("Use %s <cheatname> to use a cheat.\n", argv[0]);
+ debugPrintf("Cheats:\n-------\n");
+ debugPrintf(" buttons - enables all 3 buttons on the door in the purple building, module 3000, scene 9\n");
+ debugPrintf(" cannon - sets the correct cannon combination in module 3000, scene 8\n");
+ debugPrintf(" dice - shows the correct dice combination in the teddy bear puzzle, module 1100, scene 6\n");
+ debugPrintf(" memory - solves the memory puzzle, module 1400, scene 4\n");
+ debugPrintf(" music - shows the correct index in the radio music puzzle, module 2800, scene 1\n");
+ debugPrintf(" radio - enables the radio, module 3000, scene 9 - same as pulling the rightmost cord in the flytrap room\n");
+ debugPrintf(" symbols - solves the symbols puzzle, module 1600, scene 8. Only available in that room\n");
+ debugPrintf(" tubes - shows the correct test tube combination in module 2800, scenes 7 and 10\n");
return true;
}
@@ -127,7 +127,7 @@ bool Console::Cmd_Cheat(int argc, const char **argv) {
scene->setSubVar(VA_LOCKS_DISABLED, 0x40119852, 1); // kScene3010ButtonNameHashes[1]
scene->setSubVar(VA_LOCKS_DISABLED, 0x01180951, 1); // kScene3010ButtonNameHashes[2]
- DebugPrintf("All 3 door buttons have been enabled\n");
+ debugPrintf("All 3 door buttons have been enabled\n");
} else if (cheatName == "cannon") {
Scene *scene = (Scene *)((GameModule *)_vm->_gameModule->_childObject)->_childObject;
@@ -137,10 +137,10 @@ bool Console::Cmd_Cheat(int argc, const char **argv) {
for (int i = 3; i < 6; i++)
scene->setSubVar(VA_CURR_CANNON_SYMBOLS, i, scene->getSubVar(VA_GOOD_CANNON_SYMBOLS_2, i - 3));
- DebugPrintf("Puzzle solved\n");
+ debugPrintf("Puzzle solved\n");
} else if (cheatName == "dice") {
Scene *scene = (Scene *)((GameModule *)_vm->_gameModule->_childObject)->_childObject;
- DebugPrintf("Good: (%d %d %d), current: (%d %d %d)\n",
+ debugPrintf("Good: (%d %d %d), current: (%d %d %d)\n",
scene->getSubVar(VA_GOOD_DICE_NUMBERS, 0), scene->getSubVar(VA_GOOD_DICE_NUMBERS, 1), scene->getSubVar(VA_GOOD_DICE_NUMBERS, 2),
scene->getSubVar(VA_CURR_DICE_NUMBERS, 0), scene->getSubVar(VA_CURR_DICE_NUMBERS, 1), scene->getSubVar(VA_CURR_DICE_NUMBERS, 2)
);
@@ -162,15 +162,15 @@ bool Console::Cmd_Cheat(int argc, const char **argv) {
}
}
- DebugPrintf("Puzzle solved\n");
+ debugPrintf("Puzzle solved\n");
} else if (cheatName == "music") {
Scene *scene = (Scene *)((GameModule *)_vm->_gameModule->_childObject)->_childObject;
- DebugPrintf("Good music index: %d, current radio music index: %d\n", scene->getGlobalVar(V_CURR_RADIO_MUSIC_INDEX), scene->getGlobalVar(V_GOOD_RADIO_MUSIC_INDEX));
+ debugPrintf("Good music index: %d, current radio music index: %d\n", scene->getGlobalVar(V_CURR_RADIO_MUSIC_INDEX), scene->getGlobalVar(V_GOOD_RADIO_MUSIC_INDEX));
} else if (cheatName == "radio") {
Scene *scene = (Scene *)((GameModule *)_vm->_gameModule->_childObject)->_childObject;
scene->setGlobalVar(V_RADIO_ENABLED, 1);
- DebugPrintf("The radio has been enabled\n");
+ debugPrintf("The radio has been enabled\n");
} else if (cheatName == "symbols") {
if (moduleNum == 1600 && sceneNum == 8) {
Scene1609 *scene = ((Scene1609 *)((Module1600 *)_vm->_gameModule->_childObject)->_childObject);
@@ -183,14 +183,14 @@ bool Console::Cmd_Cheat(int argc, const char **argv) {
scene->_symbolPosition = 11;
scene->_countdown1 = 36;
- DebugPrintf("Puzzle solved\n");
+ debugPrintf("Puzzle solved\n");
} else {
- DebugPrintf("Only available in module 1600, scene 8\n");
+ debugPrintf("Only available in module 1600, scene 8\n");
}
} else if (cheatName == "tubes") {
Scene *scene = (Scene *)((GameModule *)_vm->_gameModule->_childObject)->_childObject;
- DebugPrintf("Tube set 1: %d %d %d\n", scene->getSubVar(VA_GOOD_TEST_TUBES_LEVEL_1, 0), scene->getSubVar(VA_GOOD_TEST_TUBES_LEVEL_1, 1), scene->getSubVar(VA_GOOD_TEST_TUBES_LEVEL_1, 2));
- DebugPrintf("Tube set 2: %d %d %d\n", scene->getSubVar(VA_GOOD_TEST_TUBES_LEVEL_2, 0), scene->getSubVar(VA_GOOD_TEST_TUBES_LEVEL_2, 1), scene->getSubVar(VA_GOOD_TEST_TUBES_LEVEL_2, 2));
+ debugPrintf("Tube set 1: %d %d %d\n", scene->getSubVar(VA_GOOD_TEST_TUBES_LEVEL_1, 0), scene->getSubVar(VA_GOOD_TEST_TUBES_LEVEL_1, 1), scene->getSubVar(VA_GOOD_TEST_TUBES_LEVEL_1, 2));
+ debugPrintf("Tube set 2: %d %d %d\n", scene->getSubVar(VA_GOOD_TEST_TUBES_LEVEL_2, 0), scene->getSubVar(VA_GOOD_TEST_TUBES_LEVEL_2, 1), scene->getSubVar(VA_GOOD_TEST_TUBES_LEVEL_2, 2));
}
return true;
@@ -204,7 +204,7 @@ bool Console::Cmd_Dumpvars(int argc, const char **argv) {
bool Console::Cmd_PlaySound(int argc, const char **argv) {
if (argc < 2) {
- DebugPrintf("Usage: %s <sound hash>\n", argv[0]);
+ debugPrintf("Usage: %s <sound hash>\n", argv[0]);
} else {
uint32 soundHash = strtol(argv[1], NULL, 0);
AudioResourceManSoundItem *soundItem = new AudioResourceManSoundItem(_vm, soundHash);
@@ -223,17 +223,17 @@ bool Console::Cmd_CheckResource(int argc, const char **argv) {
const char *resourceNames[] = { "unknown", "unknown", "bitmap", "palette", "animation", "data", "text", "sound", "music", "unknown", "video" };
if (argc < 2) {
- DebugPrintf("Gets information about a resource\n");
- DebugPrintf("Usage: %s <resource hash>\n", argv[0]);
+ debugPrintf("Gets information about a resource\n");
+ debugPrintf("Usage: %s <resource hash>\n", argv[0]);
} else {
uint32 resourceHash = strtol(argv[1], NULL, 0);
ResourceHandle handle;
_vm->_res->queryResource(resourceHash, handle);
if (!handle.isValid()) {
- DebugPrintf("Invalid resource hash\n");
+ debugPrintf("Invalid resource hash\n");
} else {
- DebugPrintf("Resource type: %d (%s). Size: %d bytes\n", handle.type(), resourceNames[handle.type()], handle.size());
+ debugPrintf("Resource type: %d (%s). Size: %d bytes\n", handle.type(), resourceNames[handle.type()], handle.size());
}
}
@@ -242,8 +242,8 @@ bool Console::Cmd_CheckResource(int argc, const char **argv) {
bool Console::Cmd_DumpResource(int argc, const char **argv) {
if (argc < 3) {
- DebugPrintf("Dumps a resource to disk\n");
- DebugPrintf("Usage: %s <resource hash> <output file>\n", argv[0]);
+ debugPrintf("Dumps a resource to disk\n");
+ debugPrintf("Usage: %s <resource hash> <output file>\n", argv[0]);
} else {
uint32 resourceHash = strtol(argv[1], NULL, 0);
const char *outFileName = argv[2];
@@ -251,7 +251,7 @@ bool Console::Cmd_DumpResource(int argc, const char **argv) {
_vm->_res->queryResource(resourceHash, handle);
if (!handle.isValid()) {
- DebugPrintf("Invalid resource hash\n");
+ debugPrintf("Invalid resource hash\n");
} else {
_vm->_res->loadResource(handle, _vm->applyResourceFixes());
Common::DumpFile outFile;
diff --git a/engines/neverhood/console.h b/engines/neverhood/console.h
index 70260a96af..bf1b201270 100644
--- a/engines/neverhood/console.h
+++ b/engines/neverhood/console.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/neverhood/detection.cpp b/engines/neverhood/detection.cpp
index 96c87ab3ae..57580395bf 100644
--- a/engines/neverhood/detection.cpp
+++ b/engines/neverhood/detection.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -130,6 +130,9 @@ static const NeverhoodGameDescription gameDescriptions[] = {
0,
},
+// FIXME: Disabled for now, as it has broken resources that corrupt the heap
+// (e.g. the menu header).
+#if 0
{
// Neverhood Russian version. Fargus
{
@@ -146,19 +149,35 @@ static const NeverhoodGameDescription gameDescriptions[] = {
0,
0,
},
+#endif
{ AD_TABLE_END_MARKER, 0, 0, 0, 0 }
};
} // End of namespace Neverhood
-static const ExtraGuiOption neverhoodExtraGuiOption = {
+static const ExtraGuiOption neverhoodExtraGuiOption1 = {
_s("Use original save/load screens"),
_s("Use the original save/load screens, instead of the ScummVM ones"),
"originalsaveload",
false
};
+static const ExtraGuiOption neverhoodExtraGuiOption2 = {
+ _s("Skip the Hall of Records storyboard scenes"),
+ _s("Allows the player to skip past the Hall of Records storyboard scenes"),
+ "skiphallofrecordsscenes",
+ false
+};
+
+static const ExtraGuiOption neverhoodExtraGuiOption3 = {
+ _s("Scale the making of videos to full screen"),
+ _s("Scale the making of videos, so that they use the whole screen"),
+ "scalemakingofvideos",
+ false
+};
+
+
class NeverhoodMetaEngine : public AdvancedMetaEngine {
public:
NeverhoodMetaEngine() : AdvancedMetaEngine(Neverhood::gameDescriptions, sizeof(Neverhood::NeverhoodGameDescription), neverhoodGames) {
@@ -189,7 +208,7 @@ bool NeverhoodMetaEngine::hasFeature(MetaEngineFeature f) const {
(f == kSupportsListSaves) ||
(f == kSupportsLoadingDuringStartup) ||
(f == kSupportsDeleteSave) ||
- (f == kSavesSupportMetaInfo) ||
+ (f == kSavesSupportMetaInfo) ||
(f == kSavesSupportThumbnail) ||
(f == kSavesSupportCreationDate) ||
(f == kSavesSupportPlayTime);
@@ -212,7 +231,9 @@ bool NeverhoodMetaEngine::createInstance(OSystem *syst, Engine **engine, const A
const ExtraGuiOptions NeverhoodMetaEngine::getExtraGuiOptions(const Common::String &target) const {
ExtraGuiOptions options;
- options.push_back(neverhoodExtraGuiOption);
+ options.push_back(neverhoodExtraGuiOption1);
+ options.push_back(neverhoodExtraGuiOption2);
+ options.push_back(neverhoodExtraGuiOption3);
return options;
}
diff --git a/engines/neverhood/diskplayerscene.cpp b/engines/neverhood/diskplayerscene.cpp
index ef2b856b2f..96a935851c 100644
--- a/engines/neverhood/diskplayerscene.cpp
+++ b/engines/neverhood/diskplayerscene.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -169,7 +169,7 @@ AsDiskplayerSceneKey::AsDiskplayerSceneKey(NeverhoodEngine *vm)
uint32 AsDiskplayerSceneKey::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
uint32 messageResult = Sprite::handleMessage(messageNum, param, sender);
switch (messageNum) {
- case 0x3002:
+ case NM_ANIMATION_STOP:
gotoNextState();
break;
}
@@ -442,7 +442,7 @@ uint32 DiskplayerScene::handleMessage(int messageNum, const MessageParam &param,
Scene::handleMessage(messageNum, param, sender);
if (!_inputDisabled) {
switch (messageNum) {
- case 0x0001:
+ case NM_MOUSE_CLICK:
if (param.asPoint().x <= 20 || param.asPoint().x >= 620) {
sendMessage(_parentModule, 0x1009, 0);
} else if (!_dropKey &&
@@ -460,7 +460,7 @@ uint32 DiskplayerScene::handleMessage(int messageNum, const MessageParam &param,
}
}
break;
- case 0x2000:
+ case NM_ANIMATION_UPDATE:
tuneIn();
break;
case 0x2001:
diff --git a/engines/neverhood/diskplayerscene.h b/engines/neverhood/diskplayerscene.h
index 150d5c58ed..2ae85b9a0b 100644
--- a/engines/neverhood/diskplayerscene.h
+++ b/engines/neverhood/diskplayerscene.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/neverhood/entity.cpp b/engines/neverhood/entity.cpp
index 1ebf1dcf6c..68390051f5 100644
--- a/engines/neverhood/entity.cpp
+++ b/engines/neverhood/entity.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/neverhood/entity.h b/engines/neverhood/entity.h
index 5c29bf8a4f..4edb19239d 100644
--- a/engines/neverhood/entity.h
+++ b/engines/neverhood/entity.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/neverhood/gamemodule.cpp b/engines/neverhood/gamemodule.cpp
index 50c7c503d3..12ae66658c 100644
--- a/engines/neverhood/gamemodule.cpp
+++ b/engines/neverhood/gamemodule.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -79,7 +79,7 @@ GameModule::GameModule(NeverhoodEngine *vm)
_mainMenuRequested(false) {
// Other initializations moved to actual engine class
- _vm->_soundMan->playSoundThree(0x002D0031, 0x8861079);
+ _vm->_soundMan->playSoundThree(0x002D0031, 0x08861079);
SetMessageHandler(&GameModule::handleMessage);
}
@@ -95,7 +95,7 @@ void GameModule::handleMouseMove(int16 x, int16 y) {
mousePos.x = x;
mousePos.y = y;
debug(2, "GameModule::handleMouseMove(%d, %d)", x, y);
- sendPointMessage(_childObject, 0, mousePos);
+ sendPointMessage(_childObject, NM_MOUSE_MOVE, mousePos);
}
}
@@ -105,7 +105,7 @@ void GameModule::handleMouseDown(int16 x, int16 y) {
mousePos.x = x;
mousePos.y = y;
debug(2, "GameModule::handleMouseDown(%d, %d)", x, y);
- sendPointMessage(_childObject, 0x0001, mousePos);
+ sendPointMessage(_childObject, NM_MOUSE_CLICK, mousePos);
}
}
@@ -115,14 +115,26 @@ void GameModule::handleMouseUp(int16 x, int16 y) {
mousePos.x = x;
mousePos.y = y;
debug(2, "GameModule::handleMouseUp(%d, %d)", x, y);
- sendPointMessage(_childObject, 0x0002, mousePos);
+ sendPointMessage(_childObject, NM_MOUSE_RELEASE, mousePos);
+ }
+}
+
+void GameModule::handleWheelUp() {
+ if (_childObject) {
+ sendMessage(_childObject, NM_MOUSE_WHEELUP, 0);
+ }
+}
+
+void GameModule::handleWheelDown() {
+ if (_childObject) {
+ sendMessage(_childObject, NM_MOUSE_WHEELDOWN, 0);
}
}
void GameModule::handleSpaceKey() {
if (_childObject) {
debug(2, "GameModule::handleSpaceKey()");
- sendMessage(_childObject, 0x0009, 0);
+ sendMessage(_childObject, NM_KEYPRESS_SPACE, 0);
}
}
@@ -150,7 +162,7 @@ void GameModule::handleEscapeKey() {
else if (!_prevChildObject && _canRequestMainMenu)
_mainMenuRequested = true;
else if (_childObject)
- sendMessage(_childObject, 0x000C, 0);
+ sendMessage(_childObject, NM_KEYPRESS_ESC, 0);
}
void GameModule::initKeySlotsPuzzle() {
@@ -216,7 +228,7 @@ void GameModule::initRadioPuzzle() {
setGlobalVar(V_RADIO_ROOM_LEFT_DOOR, 1);
setGlobalVar(V_RADIO_ROOM_RIGHT_DOOR, 0);
setSubVar(VA_IS_PUZZLE_INIT, 0x08C80800, 1);
- }
+ }
}
void GameModule::initTestTubes1Puzzle() {
@@ -415,6 +427,8 @@ void GameModule::checkRequests() {
_vm->_audioResourceMan->stopAllSounds();
_vm->_soundMan->stopAllMusic();
_vm->_soundMan->stopAllSounds();
+ // Reinsert turning sound because SoundMan::stopAllSounds() removes it
+ _vm->_soundMan->playSoundThree(0x002D0031, 0x08861079);
delete _childObject;
delete _prevChildObject;
_childObject = NULL;
@@ -781,7 +795,7 @@ void GameModule::updateModule() {
void GameModule::openMainMenu() {
if (_childObject) {
- sendMessage(_childObject, 0x101D, 0);
+ sendMessage(_childObject, NM_MOUSE_HIDE, 0);
_childObject->draw();
} else {
// If there's no module, create one so there's something to return to
@@ -807,7 +821,7 @@ void GameModule::updateMenuModule() {
if (!updateChild()) {
_vm->_screen->restoreParams();
_childObject = _prevChildObject;
- sendMessage(_childObject, 0x101E, 0);
+ sendMessage(_childObject, NM_MOUSE_SHOW, 0);
_prevChildObject = NULL;
_moduleNum = _prevModuleNum;
SetUpdateHandler(&GameModule::updateModule);
diff --git a/engines/neverhood/gamemodule.h b/engines/neverhood/gamemodule.h
index 2f2fecf463..b8f7276773 100644
--- a/engines/neverhood/gamemodule.h
+++ b/engines/neverhood/gamemodule.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -40,6 +40,8 @@ public:
void handleMouseMove(int16 x, int16 y);
void handleMouseDown(int16 x, int16 y);
void handleMouseUp(int16 x, int16 y);
+ void handleWheelUp();
+ void handleWheelDown();
void handleSpaceKey();
void handleAsciiKey(char key);
void handleKeyDown(Common::KeyCode keyCode);
diff --git a/engines/neverhood/gamevars.cpp b/engines/neverhood/gamevars.cpp
index 9c080fea24..dcbe5583de 100644
--- a/engines/neverhood/gamevars.cpp
+++ b/engines/neverhood/gamevars.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -127,7 +127,7 @@ int16 GameVars::getSubVarIndex(int16 varIndex, uint32 subNameHash) {
void GameVars::dumpVars(Console *con) {
for (Common::Array<GameVar>::iterator it = _vars.begin(); it != _vars.end(); ++it) {
GameVar gameVar = *it;
- con->DebugPrintf("hash: %08X, var: %08X, first index: %3d, next index: %3d\n", gameVar.nameHash, gameVar.value, gameVar.firstIndex, gameVar.nextIndex);
+ con->debugPrintf("hash: %08X, var: %08X, first index: %3d, next index: %3d\n", gameVar.nameHash, gameVar.value, gameVar.firstIndex, gameVar.nextIndex);
}
}
diff --git a/engines/neverhood/gamevars.h b/engines/neverhood/gamevars.h
index 3aec4d1da4..9bb49ebf5b 100644
--- a/engines/neverhood/gamevars.h
+++ b/engines/neverhood/gamevars.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/neverhood/graphics.cpp b/engines/neverhood/graphics.cpp
index 490959020f..939428ed19 100644
--- a/engines/neverhood/graphics.cpp
+++ b/engines/neverhood/graphics.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -47,6 +47,7 @@ BaseSurface::BaseSurface(NeverhoodEngine *vm, int priority, int16 width, int16 h
}
BaseSurface::~BaseSurface() {
+ _surface->free();
delete _surface;
}
@@ -299,11 +300,11 @@ void unpackSpriteRle(const byte *source, int width, int height, byte *dest, int
}
source += copy;
}
- dest += destPitch;
if (replaceColors)
for (int xc = 0; xc < width; xc++)
if (dest[xc] == oldColor)
dest[xc] = newColor;
+ dest += destPitch;
}
}
rows = READ_LE_UINT16(source);
diff --git a/engines/neverhood/graphics.h b/engines/neverhood/graphics.h
index b80bd60729..12fb2d2215 100644
--- a/engines/neverhood/graphics.h
+++ b/engines/neverhood/graphics.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/neverhood/klaymen.cpp b/engines/neverhood/klaymen.cpp
index 666b20a08a..de940bda79 100644
--- a/engines/neverhood/klaymen.cpp
+++ b/engines/neverhood/klaymen.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -77,7 +77,7 @@ uint32 Klaymen::xHandleMessage(int messageNum, const MessageParam &param) {
case 0x4800:
startWalkToX(param.asPoint().x, false);
break;
- case 0x4004:
+ case NM_KLAYMEN_STAND_IDLE:
GotoState(&Klaymen::stTryStandIdle);
break;
case 0x4818:
@@ -126,7 +126,7 @@ void Klaymen::stIdlePickEar() {
uint32 Klaymen::hmIdlePickEar(int messageNum, const MessageParam &param, Entity *sender) {
uint32 messageResult = hmLowLevelAnimation(messageNum, param, sender);
switch (messageNum) {
- case 0x100D:
+ case NM_ANIMATION_START:
if (param.asInteger() == 0x04DBC02C) {
playSound(0, 0x44528AA1);
}
@@ -152,7 +152,7 @@ void Klaymen::stIdleSpinHead() {
uint32 Klaymen::hmIdleSpinHead(int messageNum, const MessageParam &param, Entity *sender) {
uint32 messageResult = hmLowLevelAnimation(messageNum, param, sender);
switch (messageNum) {
- case 0x100D:
+ case NM_ANIMATION_START:
if (param.asInteger() == 0x808A0008) {
playSound(0, 0xD948A340);
}
@@ -179,7 +179,7 @@ void Klaymen::evIdleArmsDone() {
uint32 Klaymen::hmIdleArms(int messageNum, const MessageParam &param, Entity *sender) {
uint32 messageResult = hmLowLevelAnimation(messageNum, param, sender);
switch (messageNum) {
- case 0x100D:
+ case NM_ANIMATION_START:
if (param.asInteger() == 0x5A0F0104) {
playSound(0, 0x7970A100);
} else if (param.asInteger() == 0x9A9A0109) {
@@ -205,7 +205,7 @@ void Klaymen::stIdleChest() {
uint32 Klaymen::hmIdleChest(int messageNum, const MessageParam &param, Entity *sender) {
uint32 messageResult = hmLowLevelAnimation(messageNum, param, sender);
switch (messageNum) {
- case 0x100D:
+ case NM_ANIMATION_START:
if (param.asInteger() == 0x0D2A0288) {
playSound(0, 0xD192A368);
}
@@ -227,7 +227,7 @@ void Klaymen::stIdleHeadOff() {
uint32 Klaymen::hmIdleHeadOff(int messageNum, const MessageParam &param, Entity *sender) {
uint32 messageResult = hmLowLevelAnimation(messageNum, param, sender);
switch (messageNum) {
- case 0x100D:
+ case NM_ANIMATION_START:
if (param.asInteger() == 0xC006000C) {
playSound(0, 0x9D406340);
} else if (param.asInteger() == 0x2E4A2940) {
@@ -300,7 +300,7 @@ void Klaymen::stSitIdleTeleporterBlink() {
void Klaymen::stSitIdleTeleporterBlinkSecond() {
_busyStatus = 0;
_acceptInput = true;
- startAnimation(0x5C24C018, 0, -1);
+ startAnimation(0x582EC138, 0, -1);
SetUpdateHandler(&Klaymen::upSitIdleTeleporter);
SetMessageHandler(&Klaymen::hmLowLevel);
SetSpriteUpdate(NULL);
@@ -333,9 +333,9 @@ void Klaymen::stPickUpTube() {
uint32 Klaymen::hmPickUpTube(int messageNum, const MessageParam &param, Entity *sender) {
uint32 messageResult = hmLowLevelAnimation(messageNum, param, sender);
switch (messageNum) {
- case 0x100D:
+ case NM_ANIMATION_START:
if (param.asInteger() == 0xC1380080) {
- sendMessage(_attachedSprite, 0x4806, 0);
+ sendMessage(_attachedSprite, NM_KLAYMEN_USE_OBJECT, 0);
playSound(0, 0xC8004340);
} else if (param.asInteger() == 0x02B20220) {
playSound(0, 0xC5408620);
@@ -394,7 +394,7 @@ void Klaymen::stSitInTeleporter() {
uint32 Klaymen::hmSitInTeleporter(int messageNum, const MessageParam &param, Entity *sender) {
uint32 messageResult = hmLowLevelAnimation(messageNum, param, sender);
switch (messageNum) {
- case 0x100D:
+ case NM_ANIMATION_START:
if (param.asInteger() == 0x001A2832) {
playSound(0, 0xC0E4884C);
}
@@ -518,7 +518,7 @@ uint32 Klaymen::hmLowLevel(int messageNum, const MessageParam &param, Entity *se
case 0x1014:
_attachedSprite = (Sprite*)(param.asEntity());
break;
- case 0x1019:
+ case NM_SCENE_LEAVE:
gotoNextStateExt();
break;
case 0x101C:
@@ -556,7 +556,7 @@ void Klaymen::stIdleBlink() {
uint32 Klaymen::hmLowLevelAnimation(int messageNum, const MessageParam &param, Entity *sender) {
uint32 messageResult = hmLowLevel(messageNum, param, sender);
switch (messageNum) {
- case 0x3002:
+ case NM_ANIMATION_STOP:
gotoNextStateExt();
break;
}
@@ -575,7 +575,7 @@ void Klaymen::stStandAround() {
uint32 Klaymen::hmStartAction(int messageNum, const MessageParam &param, Entity *sender) {
uint32 messageResult = hmLowLevelAnimation(messageNum, param, sender);
switch (messageNum) {
- case 0x100D:
+ case NM_ANIMATION_START:
if (param.asInteger() == 0x271AA210) {
playSound(0, 0x4924AAC4);
} else if (param.asInteger() == 0x2B22AA81) {
@@ -730,7 +730,7 @@ void Klaymen::evSneakingDone() {
uint32 Klaymen::hmSneaking(int messageNum, const MessageParam &param, Entity *sender) {
uint32 messageResult = hmLowLevel(messageNum, param, sender);
switch (messageNum) {
- case 0x100D:
+ case NM_ANIMATION_START:
if (param.asInteger() == 0x32180101) {
playSound(0, 0x4924AAC4);
} else if (param.asInteger() == 0x0A2A9098) {
@@ -741,7 +741,7 @@ uint32 Klaymen::hmSneaking(int messageNum, const MessageParam &param, Entity *se
playSound(0, _soundFlag ? 0x50399F64 : 0x0460E2FA);
}
break;
- case 0x3002:
+ case NM_ANIMATION_STOP:
_x = _destX;
gotoNextStateExt();
break;
@@ -771,7 +771,7 @@ void Klaymen::evStartWalkingDone() {
uint32 Klaymen::hmStartWalking(int messageNum, const MessageParam &param, Entity *sender) {
uint32 messageResult = hmLowLevelAnimation(messageNum, param, sender);
switch (messageNum) {
- case 0x100D:
+ case NM_ANIMATION_START:
if (param.asInteger() == 0x32180101) {
playSound(0, _soundFlag ? 0x48498E46 : 0x405002D8);
} else if (param.asInteger() == 0x0A2A9098) {
@@ -802,7 +802,7 @@ void Klaymen::suWalkingFirst() {
uint32 Klaymen::hmWalking(int messageNum, const MessageParam &param, Entity *sender) {
uint32 messageResult = hmLowLevel(messageNum, param, sender);
switch (messageNum) {
- case 0x100D:
+ case NM_ANIMATION_START:
if (param.asInteger() == 0x32180101) {
playSound(0, _soundFlag ? 0x48498E46 : 0x405002D8);
} else if (param.asInteger() == 0x0A2A9098) {
@@ -861,7 +861,7 @@ void Klaymen::suWalkingTestExit() {
(_actionStatus != 2 && _actionStatus != 3 && xdiff <= 10 && (_currFrameIndex >= 12 || _currFrameIndex <= 4)) ||
(_actionStatus == 3 && xdiff < 30) ||
(_actionStatus == 3 && xdiff < 150 && _currFrameIndex >= 6)) {
- sendMessage(this, 0x1019, 0);
+ sendMessage(this, NM_SCENE_LEAVE, 0);
} else {
HitRect *hitRectPrev = _parentScene->findHitRectAtPos(_x, _y);
_x += xdelta;
@@ -893,11 +893,11 @@ void Klaymen::suWalkingTestExit() {
uint32 Klaymen::hmLever(int messageNum, const MessageParam &param, Entity *sender) {
uint32 messageResult = hmLowLevelAnimation(messageNum, param, sender);
switch (messageNum) {
- case 0x100D:
+ case NM_ANIMATION_START:
if (param.asInteger() == 0x4AB28209) {
- sendMessage(_attachedSprite, 0x482A, 0);
+ sendMessage(_attachedSprite, NM_MOVE_TO_BACK, 0);
} else if (param.asInteger() == 0x88001184) {
- sendMessage(_attachedSprite, 0x482B, 0);
+ sendMessage(_attachedSprite, NM_MOVE_TO_FRONT, 0);
}
break;
}
@@ -919,9 +919,9 @@ void Klaymen::stPickUpGeneric() {
uint32 Klaymen::hmPickUpObject(int messageNum, const MessageParam &param, Entity *sender) {
uint32 messageResult = hmLowLevelAnimation(messageNum, param, sender);
switch (messageNum) {
- case 0x100D:
+ case NM_ANIMATION_START:
if (param.asInteger() == 0xC1380080) {
- sendMessage(_attachedSprite, 0x4806, 0);
+ sendMessage(_attachedSprite, NM_KLAYMEN_USE_OBJECT, 0);
playSound(0, 0x40208200);
} else if (param.asInteger() == 0x02B20220) {
playSound(0, 0xC5408620);
@@ -954,7 +954,7 @@ void Klaymen::stPressButton() {
uint32 Klaymen::hmPressButton(int messageNum, const MessageParam &param, Entity *sender) {
uint32 messageResult = hmLowLevelAnimation(messageNum, param, sender);
switch (messageNum) {
- case 0x100D:
+ case NM_ANIMATION_START:
if (param.asInteger() == 0x0D01B294) {
sendMessage(_attachedSprite, 0x480B, 0);
} else if (param.asInteger() == 0x32180101) {
@@ -1048,7 +1048,7 @@ void Klaymen::stStartWalkingSmall() {
uint32 Klaymen::hmWalkingSmall(int messageNum, const MessageParam &param, Entity *sender) {
uint32 messageResult = hmLowLevel(messageNum, param, sender);
switch (messageNum) {
- case 0x100D:
+ case NM_ANIMATION_START:
if (param.asInteger() == 0x32180101)
playSound(0, 0x4924AAC4);
else if (param.asInteger() == 0x0A2A9098)
@@ -1105,11 +1105,11 @@ void Klaymen::stWalkToFrontNoStepSmall() {
uint32 Klaymen::hmWalkFrontBackSmall(int messageNum, const MessageParam &param, Entity *sender) {
uint32 messageResult = hmLowLevelAnimation(messageNum, param, sender);
switch (messageNum) {
- case 0x100D:
+ case NM_ANIMATION_START:
if (param.asInteger() == 0x80C110B5)
- sendMessage(_parentScene, 0x482A, 0);
+ sendMessage(_parentScene, NM_MOVE_TO_BACK, 0);
else if (param.asInteger() == 0x110010D1)
- sendMessage(_parentScene, 0x482B, 0);
+ sendMessage(_parentScene, NM_MOVE_TO_FRONT, 0);
else if (param.asInteger() == 0x32180101)
playSound(0, 0x4924AAC4);
else if (param.asInteger() == 0x0A2A9098)
@@ -1187,12 +1187,12 @@ void Klaymen::stReleaseCord() {
uint32 Klaymen::hmPullReleaseCord(int messageNum, const MessageParam &param, Entity *sender) {
uint32 messageResult = hmLowLevelAnimation(messageNum, param, sender);
switch (messageNum) {
- case 0x100D:
+ case NM_ANIMATION_START:
if (param.asInteger() == 0x4AB28209) {
- sendMessage(_attachedSprite, 0x482A, 0);
- sendMessage(_attachedSprite, 0x480F, 0);
+ sendMessage(_attachedSprite, NM_MOVE_TO_BACK, 0);
+ sendMessage(_attachedSprite, NM_KLAYMEN_LOWER_LEVER, 0);
} else if (param.asInteger() == 0x88001184) {
- sendMessage(_attachedSprite, 0x482B, 0);
+ sendMessage(_attachedSprite, NM_MOVE_TO_FRONT, 0);
}
break;
}
@@ -1213,7 +1213,7 @@ void Klaymen::stUseTube() {
uint32 Klaymen::hmUseTube(int messageNum, const MessageParam &param, Entity *sender) {
uint32 messageResult = hmLowLevelAnimation(messageNum, param, sender);
switch (messageNum) {
- case 0x100D:
+ case NM_ANIMATION_START:
if (param.asInteger() == 0x02B20220)
playSound(0, 0xC5408620);
else if (param.asInteger() == 0x0A720138)
@@ -1369,14 +1369,14 @@ void Klaymen::suLargeStep() {
uint32 Klaymen::hmLargeStep(int messageNum, const MessageParam &param, Entity *sender) {
uint32 messageResult = hmLowLevel(messageNum, param, sender);
switch (messageNum) {
- case 0x100D:
+ case NM_ANIMATION_START:
if (param.asInteger() == 0x32180101) {
playSound(0, 0x4924AAC4);
} else if (param.asInteger() == 0x0A2A9098) {
playSound(0, 0x0A2AA8E0);
}
break;
- case 0x3002:
+ case NM_ANIMATION_STOP:
_x = _destX;
gotoNextStateExt();
break;
@@ -1414,7 +1414,7 @@ void Klaymen::stTurnToUseHalf() {
uint32 Klaymen::hmTurnToUse(int messageNum, const MessageParam &param, Entity *sender) {
uint32 messageResult = hmLowLevelAnimation(messageNum, param, sender);
switch (messageNum) {
- case 0x100D:
+ case NM_ANIMATION_START:
if (param.asInteger() == 0x32180101) {
playSound(0, 0x4924AAC4);
} else if (param.asInteger() == 0x0A2A9098) {
@@ -1460,7 +1460,7 @@ uint32 Klaymen::hmPeekWall(int messageNum, const MessageParam &param, Entity *se
if (_currFrameIndex < speedUpFrameIndex)
startAnimation(0xAC20C012, speedUpFrameIndex, -1);
return 0;
- case 0x100D:
+ case NM_ANIMATION_START:
if (param.asInteger() == 0x32180101) {
playSound(0, 0x405002D8);
} else if (param.asInteger() == 0x0A2A9098) {
@@ -1479,7 +1479,7 @@ void Klaymen::suUpdateDestX() {
void Klaymen::stReleaseRing() {
_busyStatus = 1;
_acceptInput = false;
- sendMessage(_attachedSprite, 0x4807, 0);
+ sendMessage(_attachedSprite, NM_KLAYMEN_RAISE_LEVER, 0);
_attachedSprite = NULL;
startAnimation(0xB869A4B9, 0, -1);
SetUpdateHandler(&Klaymen::update);
@@ -1559,7 +1559,7 @@ void Klaymen::stClimbLadderHalf() {
uint32 Klaymen::hmClimbLadderHalf(int messageNum, const MessageParam &param, Entity *sender) {
uint32 messageResult = hmLowLevelAnimation(messageNum, param, sender);
switch (messageNum) {
- case 0x100D:
+ case NM_ANIMATION_START:
if (param.asInteger() == 0x489B025C) {
playSound(0, 0x52C4C2D7);
} else if (param.asInteger() == 0x400A0E64) {
@@ -1577,7 +1577,7 @@ uint32 Klaymen::hmClimbLadderHalf(int messageNum, const MessageParam &param, Ent
uint32 Klaymen::hmClimbLadderUpDown(int messageNum, const MessageParam &param, Entity *sender) {
uint32 messageResult = hmLowLevel(messageNum, param, sender);
switch (messageNum) {
- case 0x100D:
+ case NM_ANIMATION_START:
if (param.asInteger() == 0x01084280) {
_acceptInput = true;
} else if (param.asInteger() == 0x489B025C) {
@@ -1588,11 +1588,11 @@ uint32 Klaymen::hmClimbLadderUpDown(int messageNum, const MessageParam &param, E
if (_ladderStatus == 1) {
startAnimationByHash(0x3A292504, 0x01084280, 0);
if (_destY >= _y - 30)
- sendMessage(this, 0x1019, 0);
+ sendMessage(this, NM_SCENE_LEAVE, 0);
} else {
startAnimationByHash(0x122D1505, 0x01084280, 0);
if (_destY <= _y)
- sendMessage(this, 0x1019, 0);
+ sendMessage(this, NM_SCENE_LEAVE, 0);
}
}
break;
@@ -1639,11 +1639,11 @@ void Klaymen::stWalkToFrontNoStep() {
uint32 Klaymen::hmWalkToFront(int messageNum, const MessageParam &param, Entity *sender) {
uint32 messageResult = hmLowLevelAnimation(messageNum, param, sender);
switch (messageNum) {
- case 0x100D:
+ case NM_ANIMATION_START:
if (param.asInteger() == 0x80C110B5) {
- sendMessage(_parentScene, 0x482A, 0);
+ sendMessage(_parentScene, NM_MOVE_TO_BACK, 0);
} else if (param.asInteger() == 0x110010D1) {
- sendMessage(_parentScene, 0x482B, 0);
+ sendMessage(_parentScene, NM_MOVE_TO_FRONT, 0);
} else if (param.asInteger() == 0x32180101) {
playSound(0, _soundFlag ? 0x48498E46 : 0x405002D8);
} else if (param.asInteger() == 0x0A2A9098) {
@@ -1699,7 +1699,7 @@ void Klaymen::stLandOnFeet() {
uint32 Klaymen::hmLandOnFeet(int messageNum, const MessageParam &param, Entity *sender) {
uint32 messageResult = hmLowLevelAnimation(messageNum, param, sender);
switch (messageNum) {
- case 0x100D:
+ case NM_ANIMATION_START:
if (param.asInteger() == 0x320AC306) {
playSound(0, 0x5860C640);
}
@@ -1722,7 +1722,7 @@ void Klaymen::stTurnToBackToUse() {
uint32 Klaymen::hmTurnToBackToUse(int messageNum, const MessageParam &param, Entity *sender) {
uint32 messageResult = hmLowLevelAnimation(messageNum, param, sender);
switch (messageNum) {
- case 0x100D:
+ case NM_ANIMATION_START:
if (param.asInteger() == 0xC61A0119) {
playSound(0, 0x402338C2);
} else if (param.asInteger() == 0x32180101) {
@@ -1783,12 +1783,12 @@ void Klaymen::stMoveObjectSkipTurnFaceObject() {
}
void Klaymen::evMoveObjectTurnDone() {
- sendMessage(_attachedSprite, 0x4807, 0);
+ sendMessage(_attachedSprite, NM_KLAYMEN_RAISE_LEVER, 0);
}
uint32 Klaymen::hmMoveObjectTurn(int messageNum, const MessageParam &param, Entity *sender) {
switch (messageNum) {
- case 0x100D:
+ case NM_ANIMATION_START:
if (param.asInteger() == 0x01084280) {
sendMessage(_attachedSprite, 0x480B, _doDeltaX ? 1 : 0);
} else if (param.asInteger() == 0x02421405) {
@@ -1804,7 +1804,7 @@ uint32 Klaymen::hmMoveObjectTurn(int messageNum, const MessageParam &param, Enti
playSound(0, 0x0460E2FA);
}
break;
- case 0x480A:
+ case NM_KLAYMEN_MOVE_OBJECT:
_isMoveObjectRequested = true;
return 0;
}
@@ -1839,7 +1839,7 @@ void Klaymen::stUseLever() {
if (_isLeverDown) {
stUseLeverRelease();
} else {
- sendMessage(_attachedSprite, 0x482B, 0);
+ sendMessage(_attachedSprite, NM_MOVE_TO_FRONT, 0);
startAnimation(0x0C303040, 0, -1);
SetSpriteUpdate(&Klaymen::suUpdateDestX);
SetMessageHandler(&Klaymen::hmLever);
@@ -1853,7 +1853,7 @@ void Klaymen::stUseLever() {
// Exactly the same code as sub420DA0 which was removed
void Klaymen::stPullLeverDown() {
startAnimation(0x0D318140, 0, -1);
- sendMessage(_attachedSprite, 0x480F, 0);
+ sendMessage(_attachedSprite, NM_KLAYMEN_LOWER_LEVER, 0);
NextState(&Klaymen::stHoldLeverDown);
}
@@ -1871,7 +1871,7 @@ void Klaymen::stUseLeverRelease() {
SetUpdateHandler(&Klaymen::update);
SetMessageHandler(&Klaymen::hmLever);
SetSpriteUpdate(&Klaymen::suUpdateDestX);
- sendMessage(_attachedSprite, 0x4807, 0);
+ sendMessage(_attachedSprite, NM_KLAYMEN_RAISE_LEVER, 0);
NextState(&Klaymen::stPullLeverDown);
_acceptInput = false;
}
@@ -1883,7 +1883,7 @@ void Klaymen::stReleaseLever() {
SetUpdateHandler(&Klaymen::update);
SetMessageHandler(&Klaymen::hmLever);
SetSpriteUpdate(&Klaymen::suUpdateDestX);
- sendMessage(_attachedSprite, 0x4807, 0);
+ sendMessage(_attachedSprite, NM_KLAYMEN_RAISE_LEVER, 0);
NextState(&Klaymen::stLetGoOfLever);
_acceptInput = false;
_isLeverDown = false;
@@ -1898,7 +1898,7 @@ void Klaymen::stLetGoOfLever() {
}
void Klaymen::evLeverReleasedEvent() {
- sendMessage(_attachedSprite, 0x482A, 0);
+ sendMessage(_attachedSprite, NM_MOVE_TO_BACK, 0);
}
void Klaymen::stInsertDisk() {
@@ -1929,7 +1929,7 @@ void Klaymen::stInsertDisk() {
uint32 Klaymen::hmInsertDisk(int messageNum, const MessageParam &param, Entity *sender) {
uint32 messageResult = Klaymen::hmLowLevelAnimation(messageNum, param, sender);
switch (messageNum) {
- case 0x100D:
+ case NM_ANIMATION_START:
if (_tapesToInsert == 0 && param.asInteger() == 0x06040580) {
nextAnimationByHash(0xD8C8D100, calcHash("GoToStartLoop/Finish"), 0);
} else if (_tapesToInsert != 0 && param.asInteger() == calcHash("GoToStartLoop/Finish")) {
@@ -2033,15 +2033,15 @@ void Klaymen::suJumpToGrab() {
uint32 Klaymen::hmJumpToGrab(int messageNum, const MessageParam &param, Entity *sender) {
uint32 messageResult = hmLowLevel(messageNum, param, sender);
switch (messageNum) {
- case 0x100D:
+ case NM_ANIMATION_START:
if (param.asInteger() == 0x168050A0)
- sendMessage(_attachedSprite, 0x4806, 0);
+ sendMessage(_attachedSprite, NM_KLAYMEN_USE_OBJECT, 0);
else if (param.asInteger() == 0x320AC306)
startAnimationByHash(0x00AB8C10, 0x01084280, 0);
else if (param.asInteger() == 0x4AB28209)
- sendMessage(_attachedSprite, 0x482A, 0);
+ sendMessage(_attachedSprite, NM_MOVE_TO_BACK, 0);
else if (param.asInteger() == 0x88001184)
- sendMessage(_attachedSprite, 0x482B, 0);
+ sendMessage(_attachedSprite, NM_MOVE_TO_FRONT, 0);
break;
}
return messageResult;
@@ -2059,7 +2059,7 @@ void Klaymen::stFinishGrow() {
uint32 Klaymen::hmFinishGrow(int messageNum, const MessageParam &param, Entity *sender) {
uint32 messageResult = hmLowLevelAnimation(messageNum, param, sender);
switch (messageNum) {
- case 0x100D:
+ case NM_ANIMATION_START:
if (param.asInteger() == 0x040C4C01)
playSound(0, 0x01E11140);
break;
@@ -2086,7 +2086,7 @@ void Klaymen::stJumpToGrabFall() {
SetUpdateHandler(&Klaymen::update);
SetMessageHandler(&Klaymen::hmJumpToGrab);
SetSpriteUpdate(&Klaymen::suJumpToGrab);
- sendMessage(_attachedSprite, 0x482B, 0);
+ sendMessage(_attachedSprite, NM_MOVE_TO_FRONT, 0);
}
}
@@ -2103,7 +2103,7 @@ void Klaymen::stJumpToGrabRelease() {
uint32 Klaymen::hmJumpToGrabRelease(int messageNum, const MessageParam &param, Entity *sender) {
uint32 messageResult = hmLowLevelAnimation(messageNum, param, sender);
switch (messageNum) {
- case 0x100D:
+ case NM_ANIMATION_START:
if (param.asInteger() == 0x320AC306)
playSound(0, 0x5860C640);
break;
@@ -2152,7 +2152,7 @@ void Klaymen::teleporterDisappear(uint32 fileHash) {
uint32 Klaymen::hmTeleporterAppearDisappear(int messageNum, const MessageParam &param, Entity *sender) {
uint32 messageResult = hmLowLevelAnimation(messageNum, param, sender);
switch (messageNum) {
- case 0x100D:
+ case NM_ANIMATION_START:
if (param.asInteger() == 0x4E0A2C24) {
playSound(0, 0x85B10BB8);
} else if (param.asInteger() == 0x4E6A0CA0) {
@@ -2185,7 +2185,7 @@ uint32 Klaymen::hmDrinkPotion(int messageNum, const MessageParam &param, Entity
} else
_potionFlag2 = true;
break;
- case 0x100D:
+ case NM_ANIMATION_START:
if (param.asInteger() == 0x0002418E)
sendMessage(_parentScene, 0x2000, 0);
else if (param.asInteger() == 0x924090C2) {
@@ -2230,7 +2230,7 @@ uint32 Klaymen::hmDrinkPotion(int messageNum, const MessageParam &param, Entity
uint32 Klaymen::hmGrow(int messageNum, const MessageParam &param, Entity *sender) {
uint32 messageResult = hmLowLevelAnimation(messageNum, param, sender);
switch (messageNum) {
- case 0x100D:
+ case NM_ANIMATION_START:
if (param.asInteger() == 0x32180101)
playSound(0, 0x405002D8);
else if (param.asInteger() == 0x0A2A9098)
@@ -2283,7 +2283,7 @@ void Klaymen::stDrinkPotion() {
uint32 Klaymen::hmInsertKey(int messageNum, const MessageParam &param, Entity *sender) {
uint32 messageResult = Klaymen::hmLowLevelAnimation(messageNum, param, sender);
switch (messageNum) {
- case 0x100D:
+ case NM_ANIMATION_START:
if (_keysToInsert == 0 && param.asInteger() == 0x06040580) {
nextAnimationByHash(0xDC409440, 0x46431401, 0);
} else if (_keysToInsert != 0 && param.asInteger() == 0x46431401) {
@@ -2344,7 +2344,7 @@ void Klaymen::stInsertKey() {
uint32 Klaymen::hmPeekWallReturn(int messageNum, const MessageParam &param, Entity *sender) {
uint32 messageResult = hmLowLevelAnimation(messageNum, param, sender);
switch (messageNum) {
- case 0x100D:
+ case NM_ANIMATION_START:
if (param.asInteger() == calcHash("PopBalloon")) {
sendMessage(_parentScene, 0x2000, 0);
} else if (param.asInteger() == 0x02B20220) {
@@ -2438,54 +2438,13 @@ uint32 Klaymen::hmStandIdleSpecial(int messageNum, const MessageParam &param, En
return 0;
}
-uint32 Klaymen::hmPressDoorButton(int messageNum, const MessageParam &param, Entity *sender) {
- uint32 messageResult = hmLowLevelAnimation(messageNum, param, sender);
- switch (messageNum) {
- case 0x100D:
- if (param.asInteger() == 0x942D2081) {
- _acceptInput = false;
- sendMessage(_attachedSprite, 0x2003, 0);
- } else if (param.asInteger() == 0xDA600012) {
- stHitByBoxingGlove();
- } else if (param.asInteger() == 0x0D01B294) {
- _acceptInput = false;
- sendMessage(_attachedSprite, 0x480B, 0);
- }
- break;
- }
- return messageResult;
-}
-
-uint32 Klaymen::hmHitByBoxingGlove(int messageNum, const MessageParam &param, Entity *sender) {
- int16 speedUpFrameIndex;
- uint32 messageResult = hmLowLevelAnimation(messageNum, param, sender);
- switch (messageNum) {
- case 0x1008:
- speedUpFrameIndex = getFrameIndex(kKlaymenSpeedUpHash);
- if (_currFrameIndex < speedUpFrameIndex) {
- startAnimation(0x35AA8059, speedUpFrameIndex, -1);
- _y = 435;
- }
- messageResult = 0;
- break;
- case 0x100D:
- if (param.asInteger() == 0x1A1A0785) {
- playSound(0, 0x40F0A342);
- } else if (param.asInteger() == 0x60428026) {
- playSound(0, 0x40608A59);
- }
- break;
- }
- return messageResult;
-}
-
void Klaymen::suFallDown() {
AnimatedSprite::updateDeltaXY();
HitRect *hitRect = _parentScene->findHitRectAtPos(_x, _y + 10);
if (hitRect->type == 0x5001) {
_y = hitRect->rect.y1;
updateBounds();
- sendMessage(this, 0x1019, 0);
+ sendMessage(this, NM_SCENE_LEAVE, 0);
}
_parentScene->checkCollision(this, 0xFFFF, 0x4810, 0);
}
@@ -2536,7 +2495,7 @@ void Klaymen::stFalling() {
SetSpriteUpdate(NULL);
SetMessageHandler(&Klaymen::hmLowLevelAnimation);
NextState(&Klaymen::stFallTouchdown);
- sendMessage(_parentScene, 0x2002, 0);
+ sendMessage(_parentScene, NM_POSITION_CHANGE, 0);
_attachedSprite = NULL;
sendMessage(_parentScene, 0x8001, 0);
}
@@ -2546,37 +2505,13 @@ void Klaymen::stFallTouchdown() {
stTryStandIdle();
}
-void Klaymen::stPressDoorButton() {
- _busyStatus = 2;
- _acceptInput = true;
- setDoDeltaX(0);
- startAnimation(0x1CD89029, 0, -1);
- SetUpdateHandler(&Klaymen::update);
- SetMessageHandler(&Klaymen::hmPressDoorButton);
- SetSpriteUpdate(&Klaymen::suAction);
-}
-
-void Klaymen::stHitByBoxingGlove() {
- _busyStatus = 1;
- _acceptInput = false;
- startAnimation(0x35AA8059, 0, -1);
- SetUpdateHandler(&Klaymen::update);
- SetMessageHandler(&Klaymen::hmHitByBoxingGlove);
- SetSpriteUpdate(&AnimatedSprite::updateDeltaXY);
- FinalizeState(&Klaymen::evHitByBoxingGloveDone);
-}
-
-void Klaymen::evHitByBoxingGloveDone() {
- sendMessage(_parentScene, 0x1024, 1);
-}
-
void Klaymen::suFallSkipJump() {
updateDeltaXY();
HitRect *hitRect = _parentScene->findHitRectAtPos(_x, _y + 10);
if (hitRect->type == 0x5001) {
_y = hitRect->rect.y1;
updateBounds();
- sendMessage(this, 0x1019, 0);
+ sendMessage(this, NM_SCENE_LEAVE, 0);
}
}
@@ -2598,7 +2533,7 @@ void Klaymen::upMoveObject() {
uint32 Klaymen::hmMoveObject(int messageNum, const MessageParam &param, Entity *sender) {
switch (messageNum) {
- case 0x100D:
+ case NM_ANIMATION_START:
if (param.asInteger() == 0x01084280) {
playSound(0, 0x405002D8);
sendMessage(_attachedSprite, 0x480B, 0);
@@ -2672,7 +2607,7 @@ void Klaymen::stInteractLever() {
void Klaymen::stPullLever() {
startAnimation(0x0D318140, 0, -1);
NextState(&Klaymen::stLookLeverDown);
- sendMessage(_attachedSprite, 0x480F, 0);
+ sendMessage(_attachedSprite, NM_KLAYMEN_LOWER_LEVER, 0);
}
void Klaymen::stLookLeverDown() {
diff --git a/engines/neverhood/klaymen.h b/engines/neverhood/klaymen.h
index 524bb9a9f2..6c25d5b4de 100644
--- a/engines/neverhood/klaymen.h
+++ b/engines/neverhood/klaymen.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -248,10 +248,6 @@ public:
uint32 hmMoveObject(int messageNum, const MessageParam &param, Entity *sender);
void upMoveObject();
- void stHitByBoxingGlove();
- uint32 hmHitByBoxingGlove(int messageNum, const MessageParam &param, Entity *sender);
- void evHitByBoxingGloveDone();
-
void stStandIdleSmall();
void stWonderAboutSmall();
void stWonderAboutHalfSmall();
@@ -271,9 +267,6 @@ public:
void stStandIdleSpecial();
uint32 hmStandIdleSpecial(int messageNum, const MessageParam &param, Entity *sender);
- void stPressDoorButton();
- uint32 hmPressDoorButton(int messageNum, const MessageParam &param, Entity *sender);
-
void stSpitOutFall0();
void stSpitOutFall2();
void suFallDown();
diff --git a/engines/neverhood/menumodule.cpp b/engines/neverhood/menumodule.cpp
index 5ad2dd69d7..255d04dc86 100644
--- a/engines/neverhood/menumodule.cpp
+++ b/engines/neverhood/menumodule.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -112,7 +112,7 @@ void MenuModule::createScene(int sceneNum, int which) {
_childObject = new CreditsScene(_vm, this, true);
break;
case MAKING_OF:
- createSmackerScene(kMakingOfSmackerFileHashList, false, true, true);
+ createSmackerScene(kMakingOfSmackerFileHashList, ConfMan.getBool("scalemakingofvideos"), true, true);
break;
case LOAD_GAME_MENU:
createLoadGameMenu();
@@ -150,7 +150,6 @@ void MenuModule::updateScene() {
leaveModule(0);
break;
case kMainMenuQuitGame:
- leaveModule(0);
_vm->quitGame();
break;
case kMainMenuCredits:
@@ -195,6 +194,14 @@ void MenuModule::updateScene() {
}
uint32 MenuModule::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
+ switch(messageNum) {
+ case NM_KEYPRESS_ESC:
+ leaveModule(0);
+ break;
+ default:
+ break;
+ }
+
return Module::handleMessage(messageNum, param, sender);;
}
@@ -374,7 +381,7 @@ MainMenu::MainMenu(NeverhoodEngine *vm, Module *parentModule)
uint32 MainMenu::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
Scene::handleMessage(messageNum, param, sender);
switch (messageNum) {
- case 0x2000:
+ case NM_ANIMATION_UPDATE:
leaveScene(param.asInteger());
break;
}
@@ -446,17 +453,17 @@ void CreditsScene::update() {
uint32 CreditsScene::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
Scene::handleMessage(messageNum, param, sender);
switch (messageNum) {
- case 0x0009:
+ case NM_KEYPRESS_SPACE:
leaveScene(0);
break;
case 0x000B:
if (param.asInteger() == Common::KEYCODE_ESCAPE && _canAbort)
leaveScene(0);
break;
- case 0x101D:
+ case NM_MOUSE_HIDE:
_ticksDuration = _ticksTime - _vm->_system->getMillis();
break;
- case 0x101E:
+ case NM_MOUSE_SHOW:
_ticksTime = _ticksDuration + _vm->_system->getMillis();
break;
}
@@ -995,7 +1002,7 @@ uint32 GameStateMenu::handleMessage(int messageNum, const MessageParam &param, E
setCurrWidget(_textEditWidget);
}
break;
- case 0x2000:
+ case NM_ANIMATION_UPDATE:
// Handle menu button click
switch (param.asInteger()) {
case 0:
@@ -1018,6 +1025,12 @@ uint32 GameStateMenu::handleMessage(int messageNum, const MessageParam &param, E
break;
}
break;
+ case NM_MOUSE_WHEELUP:
+ _listBox->scrollUp();
+ break;
+ case NM_MOUSE_WHEELDOWN:
+ _listBox->scrollDown();
+ break;
}
return 0;
}
@@ -1070,7 +1083,7 @@ static const NRect kLoadGameMenuButtonCollisionBounds[] = {
{ 182, 358, 241, 433 }
};
-static const NRect kLoadGameMenuListBoxRect = { 0, 0, 320, 271 };
+static const NRect kLoadGameMenuListBoxRect = { 0, 0, 320, 272 };
static const NRect kLoadGameMenuTextEditRect = { 0, 0, 320, 17 };
static const NRect kLoadGameMenuMouseRect = { 263, 48, 583, 65 };
@@ -1103,7 +1116,7 @@ static const NRect kDeleteGameMenuButtonCollisionBounds[] = {
{ 395, 278, 452, 372 }
};
-static const NRect kDeleteGameMenuListBoxRect = { 0, 0, 320, 271 };
+static const NRect kDeleteGameMenuListBoxRect = { 0, 0, 320, 272 };
static const NRect kDeleteGameMenuTextEditRect = { 0, 0, 320, 17 };
DeleteGameMenu::DeleteGameMenu(NeverhoodEngine *vm, Module *parentModule, SavegameList *savegameList)
@@ -1164,7 +1177,7 @@ QueryOverwriteMenu::QueryOverwriteMenu(NeverhoodEngine *vm, Module *parentModule
uint32 QueryOverwriteMenu::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
Scene::handleMessage(messageNum, param, sender);
switch (messageNum) {
- case 0x2000:
+ case NM_ANIMATION_UPDATE:
// Handle menu button click
leaveScene(param.asInteger());
break;
diff --git a/engines/neverhood/menumodule.h b/engines/neverhood/menumodule.h
index 9da9c849a9..6508ccbdf2 100644
--- a/engines/neverhood/menumodule.h
+++ b/engines/neverhood/menumodule.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/neverhood/messages.h b/engines/neverhood/messages.h
index 78c66868d5..15a762fbe9 100644
--- a/engines/neverhood/messages.h
+++ b/engines/neverhood/messages.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -26,10 +26,50 @@
namespace Neverhood {
enum NeverhoodMessage {
- NM_KLAYMEN_PICKUP = 0x4812,
- NM_KLAYMEN_PRESS_BUTTON = 0x4816,
- NM_KLAYMEN_INSERT_DISK = 0x481A,
- NM_KLAYMEN_RELEASE_LEVER = 0x4827
+ NM_MOUSE_MOVE = 0x0000,
+ NM_MOUSE_CLICK = 0x0001,
+ NM_MOUSE_RELEASE = 0x0002,
+ NM_MOUSE_HIDE = 0x101D,
+ NM_MOUSE_SHOW = 0x101E,
+ NM_KEYPRESS_SPACE = 0x0009,
+ NM_KEYPRESS_ESC = 0x000C,
+ NM_ANIMATION_START = 0x100D,
+ NM_SCENE_LEAVE = 0x1019,
+ NM_PRIORITY_CHANGE = 0x1022,
+ NM_ANIMATION_UPDATE = 0x2000,
+ NM_POSITION_CHANGE = 0x2002,
+ NM_KLAYMEN_CLIMB_LADDER = 0x2005,
+ NM_KLAYMEN_STOP_CLIMBING = 0x2006,
+
+ NM_CAR_MOVE_TO_PREV_POINT = 0x2007,
+ NM_CAR_MOVE_TO_NEXT_POINT = 0x2008,
+ NM_CAR_ENTER = 0x2009,
+ NM_CAR_LEAVE = 0x200A,
+ NM_CAR_TURN = 0x200E,
+ NM_CAR_AT_HOME = 0x200F,
+
+ NM_ANIMATION_STOP = 0x3002,
+
+ NM_KLAYMEN_STAND_IDLE = 0x4004,
+ NM_KLAYMEN_USE_OBJECT = 0x4806,
+ NM_KLAYMEN_RAISE_LEVER = 0x4807,
+ NM_KLAYMEN_OPEN_DOOR = 0x4808,
+ NM_KLAYMEN_CLOSE_DOOR = 0x4809,
+ NM_KLAYMEN_MOVE_OBJECT = 0x480A,
+ NM_KLAYMEN_LOWER_LEVER = 0x480F,
+ NM_KLAYMEN_PICKUP = 0x4812,
+ NM_KLAYMEN_PRESS_BUTTON = 0x4816,
+ NM_KLAYMEN_INSERT_DISK = 0x481A,
+ NM_KLAYMEN_TURN_TO_USE = 0x481D,
+ NM_KLAYMEN_RETURN_FROM_USE = 0x481E,
+ NM_KLAYMEN_RELEASE_LEVER = 0x4827,
+
+ NM_MOVE_TO_BACK = 0x482A,
+ NM_MOVE_TO_FRONT = 0x482B,
+
+ // New to ScummVM
+ NM_MOUSE_WHEELUP = 0xF000,
+ NM_MOUSE_WHEELDOWN = 0xF001
};
} // End of namespace Neverhood
diff --git a/engines/neverhood/microtiles.cpp b/engines/neverhood/microtiles.cpp
index 3dd6475046..a1075b8d09 100644
--- a/engines/neverhood/microtiles.cpp
+++ b/engines/neverhood/microtiles.cpp
@@ -8,17 +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.
*
- *
*/
#include "neverhood/microtiles.h"
diff --git a/engines/neverhood/microtiles.h b/engines/neverhood/microtiles.h
index 29af3d956a..15152600df 100644
--- a/engines/neverhood/microtiles.h
+++ b/engines/neverhood/microtiles.h
@@ -8,17 +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.
*
- *
*/
#ifndef NEVERHOOD_MICROTILES_H
diff --git a/engines/neverhood/module.cpp b/engines/neverhood/module.cpp
index d1578e680c..0d6b70c9a2 100644
--- a/engines/neverhood/module.cpp
+++ b/engines/neverhood/module.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -48,7 +48,7 @@ void Module::draw() {
uint32 Module::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
switch (messageNum) {
case 0x0008:
- sendMessage(_parentModule, 8, 0);
+ sendMessage(_parentModule, 0x0008, 0);
return 0;
case 0x1009:
_moduleResult = param.asInteger();
diff --git a/engines/neverhood/module.h b/engines/neverhood/module.h
index 8ab2159030..d4c954c716 100644
--- a/engines/neverhood/module.h
+++ b/engines/neverhood/module.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/neverhood/modules/module1000.cpp b/engines/neverhood/modules/module1000.cpp
index 534fb2ec2f..5e4d67d2bc 100644
--- a/engines/neverhood/modules/module1000.cpp
+++ b/engines/neverhood/modules/module1000.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -192,7 +192,7 @@ uint32 Scene1001::handleMessage(int messageNum, const MessageParam &param, Entit
uint32 messageResult = 0;
Scene::handleMessage(messageNum, param, sender);
switch (messageNum) {
- case 0x100D:
+ case NM_ANIMATION_START:
if (param.asInteger() == 0x00342624) {
sendEntityMessage(_klaymen, 0x1014, _asLever);
setMessageList2(0x004B4910);
@@ -214,13 +214,13 @@ uint32 Scene1001::handleMessage(int messageNum, const MessageParam &param, Entit
}
}
break;
- case 0x2002:
+ case NM_POSITION_CHANGE:
setRectList(0x004B49F0);
break;
case 0x480B:
sendMessage(_asWindow, 0x2001, 0);
break;
- case 0x480F:
+ case NM_KLAYMEN_LOWER_LEVER:
sendMessage(_asHammer, 0x2000, 0);
break;
}
@@ -228,7 +228,7 @@ uint32 Scene1001::handleMessage(int messageNum, const MessageParam &param, Entit
}
Scene1002::Scene1002(NeverhoodEngine *vm, Module *parentModule, int which)
- : Scene(vm, parentModule), _isKlaymenFloor(false), _isClimbingLadder(false) {
+ : Scene(vm, parentModule), _isKlaymenFloor(false), _isClimbingLadder(false), _asKlaymenPeekHand(nullptr) {
NRect tempClipRect;
Sprite *tempSprite;
@@ -317,7 +317,7 @@ Scene1002::Scene1002(NeverhoodEngine *vm, Module *parentModule, int which)
_asVenusFlyTrap = insertSprite<AsScene1002VenusFlyTrap>(this, _klaymen, false);
addCollisionSprite(_asVenusFlyTrap);
- sendEntityMessage(_klaymen, 0x2007, _asVenusFlyTrap);
+ sendEntityMessage(_klaymen, NM_CAR_MOVE_TO_PREV_POINT, _asVenusFlyTrap);
_asOutsideDoorBackground = insertSprite<AsScene1002OutsideDoorBackground>();
@@ -347,7 +347,7 @@ uint32 Scene1002::handleMessage(int messageNum, const MessageParam &param, Entit
uint32 messageResult = 0;
Scene::handleMessage(messageNum, param, sender);
switch (messageNum) {
- case 0x100D:
+ case NM_ANIMATION_START:
if (param.asInteger() == 0xE6EE60E1) {
if (getGlobalVar(V_FLYTRAP_RING_DOOR))
setMessageList(0x004B4428);
@@ -381,7 +381,7 @@ uint32 Scene1002::handleMessage(int messageNum, const MessageParam &param, Entit
case 0x1024:
sendMessage(_parentModule, 0x1024, param.asInteger());
break;
- case 0x2000:
+ case NM_ANIMATION_UPDATE:
if (_isClimbingLadder) {
setMessageList2(0x004B43D0);
} else {
@@ -395,18 +395,18 @@ uint32 Scene1002::handleMessage(int messageNum, const MessageParam &param, Entit
}
}
break;
- case 0x2002:
+ case NM_POSITION_CHANGE:
_messageList = NULL;
break;
- case 0x2005:
+ case NM_KLAYMEN_CLIMB_LADDER:
_isClimbingLadder = true;
setRectList(0x004B4418);
break;
- case 0x2006:
+ case NM_KLAYMEN_STOP_CLIMBING:
_isClimbingLadder = false;
setRectList(0x004B43A0);
break;
- case 0x4806:
+ case NM_KLAYMEN_USE_OBJECT:
if (sender == _asRing1) {
setGlobalVar(V_RADIO_ENABLED, 0);
playSound(0, 0x665198C0);
@@ -416,8 +416,8 @@ uint32 Scene1002::handleMessage(int messageNum, const MessageParam &param, Entit
} else if (sender == _asRing3) {
setGlobalVar(V_RADIO_ENABLED, 0);
playSound(1);
- sendMessage(_asDoor, 0x4808, 0);
- sendMessage(_asOutsideDoorBackground, 0x4808, 0);
+ sendMessage(_asDoor, NM_KLAYMEN_OPEN_DOOR, 0);
+ sendMessage(_asOutsideDoorBackground, NM_KLAYMEN_OPEN_DOOR, 0);
} else if (sender == _asRing4) {
setGlobalVar(V_RADIO_ENABLED, 0);
playSound(0, 0xE0558848);
@@ -426,25 +426,25 @@ uint32 Scene1002::handleMessage(int messageNum, const MessageParam &param, Entit
playSound(0, 0x44014282);
}
break;
- case 0x4807:
+ case NM_KLAYMEN_RAISE_LEVER:
if (sender == _asRing3) {
playSound(2);
- sendMessage(_asDoor, 0x4809, 0);
- sendMessage(_asOutsideDoorBackground, 0x4809, 0);
+ sendMessage(_asDoor, NM_KLAYMEN_CLOSE_DOOR, 0);
+ sendMessage(_asOutsideDoorBackground, NM_KLAYMEN_CLOSE_DOOR, 0);
} else if (sender == _asVenusFlyTrap) {
if (getGlobalVar(V_FLYTRAP_RING_DOOR)) {
- sendMessage(_asRing3, 0x4807, 0);
+ sendMessage(_asRing3, NM_KLAYMEN_RAISE_LEVER, 0);
}
}
break;
case 0x480B:
sendEntityMessage(_klaymen, 0x1014, _asDoorSpy);
break;
- case 0x480F:
+ case NM_KLAYMEN_LOWER_LEVER:
setGlobalVar(V_RADIO_ENABLED, 0);
playSound(1);
- sendMessage(_asDoor, 0x4808, 0);
- sendMessage(_asOutsideDoorBackground, 0x4808, 0);
+ sendMessage(_asDoor, NM_KLAYMEN_OPEN_DOOR, 0);
+ sendMessage(_asOutsideDoorBackground, NM_KLAYMEN_OPEN_DOOR, 0);
break;
case 0x8000:
setSpriteSurfacePriority(_ssCeiling, 995);
@@ -521,20 +521,20 @@ uint32 Scene1004::handleMessage(int messageNum, const MessageParam &param, Entit
uint32 messageResult = 0;
Scene::handleMessage(messageNum, param, sender);
switch (messageNum) {
- case 0x100D:
+ case NM_ANIMATION_START:
if (param.asInteger() == 0x926500A1) {
setMessageList(0x004B7C20);
messageResult = 1;
}
break;
- case 0x2000:
+ case NM_ANIMATION_UPDATE:
loadDataResource(0x01900A04);
break;
case 0x2001:
setRectList(0x004B7C70);
break;
- case 0x2002:
- sendMessage(_asTrashCan, 0x2002, 0);
+ case NM_POSITION_CHANGE:
+ sendMessage(_asTrashCan, NM_POSITION_CHANGE, 0);
break;
}
return messageResult;
@@ -581,7 +581,7 @@ Scene1005::Scene1005(NeverhoodEngine *vm, Module *parentModule, int which)
uint32 Scene1005::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
Scene::handleMessage(messageNum, param, sender);
switch (messageNum) {
- case 0x0001:
+ case NM_MOUSE_CLICK:
if (param.asPoint().x <= 20 || param.asPoint().x >= 620)
leaveScene(0);
break;
@@ -609,7 +609,7 @@ uint32 Scene1005::getTextIndex() {
uint32 textIndex;
textIndex = getTextIndex1();
if (getGlobalVar(V_ENTRANCE_OPEN)) {
- textIndex = getTextIndex2();
+ textIndex = getKloggsTextIndex();
}
if (getGlobalVar(V_TEXT_FLAG1) && getGlobalVar(V_TEXT_INDEX) == textIndex) {
textIndex = getTextIndex3();
@@ -690,25 +690,21 @@ uint32 Scene1005::getTextIndex1() {
return textIndex;
}
-uint32 Scene1005::getTextIndex2() {
+uint32 Scene1005::getKloggsTextIndex() {
uint32 textIndex = getGlobalVar(V_TEXT_COUNTING_INDEX1);
- if (textIndex + 1 >= 10) {
- setGlobalVar(V_TEXT_COUNTING_INDEX1, 0);
+ if (textIndex + 1 > 10) {
textIndex = 0;
- } else {
- setGlobalVar(V_TEXT_COUNTING_INDEX1, textIndex + 1);
}
+ setGlobalVar(V_TEXT_COUNTING_INDEX1, textIndex + 1);
return textIndex + 40;
}
uint32 Scene1005::getTextIndex3() {
uint32 textIndex = getGlobalVar(V_TEXT_COUNTING_INDEX2);
- if (textIndex + 1 >= 10) {
- setGlobalVar(V_TEXT_COUNTING_INDEX2, 0);
+ if (textIndex + 1 > 10) {
textIndex = 0;
- } else {
- setGlobalVar(V_TEXT_COUNTING_INDEX2, textIndex + 1);
}
+ setGlobalVar(V_TEXT_COUNTING_INDEX2, textIndex + 1);
return textIndex + 30;
}
diff --git a/engines/neverhood/modules/module1000.h b/engines/neverhood/modules/module1000.h
index 4b17c92b3b..58aa92e45f 100644
--- a/engines/neverhood/modules/module1000.h
+++ b/engines/neverhood/modules/module1000.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -101,7 +101,7 @@ protected:
void drawTextToBackground();
uint32 getTextIndex();
uint32 getTextIndex1();
- uint32 getTextIndex2();
+ uint32 getKloggsTextIndex();
uint32 getTextIndex3();
};
diff --git a/engines/neverhood/modules/module1000_sprites.cpp b/engines/neverhood/modules/module1000_sprites.cpp
index 55618f0124..dd504ae25a 100644
--- a/engines/neverhood/modules/module1000_sprites.cpp
+++ b/engines/neverhood/modules/module1000_sprites.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -39,10 +39,10 @@ AsScene1001Door::AsScene1001Door(NeverhoodEngine *vm)
uint32 AsScene1001Door::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
Sprite::handleMessage(messageNum, param, sender);
switch (messageNum) {
- case 0x2000:
+ case NM_ANIMATION_UPDATE:
hammerHitsDoor();
break;
- case 0x3002:
+ case NM_ANIMATION_STOP:
gotoNextState();
break;
}
@@ -118,13 +118,13 @@ AsScene1001Hammer::AsScene1001Hammer(NeverhoodEngine *vm, Sprite *asDoor)
uint32 AsScene1001Hammer::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
Sprite::handleMessage(messageNum, param, sender);
switch (messageNum) {
- case 0x100D:
+ case NM_ANIMATION_START:
if (param.asInteger() == 0x00352100)
sendMessage(_asDoor, 0x2000, 0);
else if (param.asInteger() == 0x0A1A0109)
playSound(0, 0x66410886);
break;
- case 0x2000:
+ case NM_ANIMATION_UPDATE:
startAnimation(0x022C90D4, 1, -1);
playSound(0, 0xE741020A);
_newStickFrameIndex = STICK_LAST_FRAME;
@@ -148,14 +148,14 @@ AsScene1001Window::AsScene1001Window(NeverhoodEngine *vm)
uint32 AsScene1001Window::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
Sprite::handleMessage(messageNum, param, sender);
switch (messageNum) {
- case 0x100D:
+ case NM_ANIMATION_START:
if (param.asInteger() == 0x0E0A1410)
playSound(0, 0x60803F10);
break;
case 0x2001:
startAnimation(0xC68C2299, 0, -1);
break;
- case 0x3002:
+ case NM_ANIMATION_STOP:
SetMessageHandler(NULL);
setGlobalVar(V_WINDOW_OPEN, 1);
setVisible(false);
@@ -180,9 +180,9 @@ AsScene1001Lever::AsScene1001Lever(NeverhoodEngine *vm, Scene *parentScene, int1
uint32 AsScene1001Lever::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
uint32 messageResult = Sprite::handleMessage(messageNum, param, sender);
switch (messageNum) {
- case 0x100D:
+ case NM_ANIMATION_START:
if (param.asInteger() == 0x00C0C444)
- sendMessage(_parentScene, 0x480F, 0);
+ sendMessage(_parentScene, NM_KLAYMEN_LOWER_LEVER, 0);
else if (param.asInteger() == 0xC41A02C0)
playSound(0, 0x40581882);
break;
@@ -190,18 +190,18 @@ uint32 AsScene1001Lever::handleMessage(int messageNum, const MessageParam &param
sendMessage(_parentScene, 0x4826, 0);
messageResult = 1;
break;
- case 0x3002:
+ case NM_ANIMATION_STOP:
startAnimation(0x04A98C36, 0, -1);
_newStickFrameIndex = 0;
break;
- case 0x480F:
+ case NM_KLAYMEN_LOWER_LEVER:
startAnimation(0x04A98C36, 0, -1);
break;
- case 0x482A:
- sendMessage(_parentScene, 0x1022, 990);
+ case NM_MOVE_TO_BACK:
+ sendMessage(_parentScene, NM_PRIORITY_CHANGE, 990);
break;
- case 0x482B:
- sendMessage(_parentScene, 0x1022, 1010);
+ case NM_MOVE_TO_FRONT:
+ sendMessage(_parentScene, NM_PRIORITY_CHANGE, 1010);
break;
}
return messageResult;
@@ -272,23 +272,23 @@ void AsScene1002Ring::update() {
uint32 AsScene1002Ring::hmRingIdle(int messageNum, const MessageParam &param, Entity *sender) {
uint32 messageResult = Sprite::handleMessage(messageNum, param, sender);
switch (messageNum) {
- case 0x4806:
+ case NM_KLAYMEN_USE_OBJECT:
setDoDeltaX(((Sprite*)sender)->isDoDeltaX() ? 1 : 0);
- sendMessage(_parentScene, 0x4806, 0);
+ sendMessage(_parentScene, NM_KLAYMEN_USE_OBJECT, 0);
SetMessageHandler(&AsScene1002Ring::hmRingPulled1);
startAnimation(_isSpecial ? 0x87502558 : 0x80DD4010, 0, -1);
break;
- case 0x480F:
+ case NM_KLAYMEN_LOWER_LEVER:
setDoDeltaX(((Sprite*)sender)->isDoDeltaX() ? 1 : 0);
- sendMessage(_parentScene, 0x480F, 0);
+ sendMessage(_parentScene, NM_KLAYMEN_LOWER_LEVER, 0);
SetMessageHandler(&AsScene1002Ring::hmRingPulled2);
startAnimation(0x861A2020, 0, -1);
break;
- case 0x482A:
- sendMessage(_parentScene, 0x1022, 990);
+ case NM_MOVE_TO_BACK:
+ sendMessage(_parentScene, NM_PRIORITY_CHANGE, 990);
break;
- case 0x482B:
- sendMessage(_parentScene, 0x1022, 1010);
+ case NM_MOVE_TO_FRONT:
+ sendMessage(_parentScene, NM_PRIORITY_CHANGE, 1010);
break;
}
return messageResult;
@@ -297,21 +297,21 @@ uint32 AsScene1002Ring::hmRingIdle(int messageNum, const MessageParam &param, En
uint32 AsScene1002Ring::hmRingPulled1(int messageNum, const MessageParam &param, Entity *sender) {
uint32 messageResult = Sprite::handleMessage(messageNum, param, sender);
switch (messageNum) {
- case 0x3002:
+ case NM_ANIMATION_STOP:
startAnimation(_isSpecial ? 0x78D0A812 : 0xB85D2A10, 0, -1);
SetMessageHandler(&AsScene1002Ring::hmRingHangingLow);
break;
- case 0x4807:
- sendMessage(_parentScene, 0x4807, 0);
+ case NM_KLAYMEN_RAISE_LEVER:
+ sendMessage(_parentScene, NM_KLAYMEN_RAISE_LEVER, 0);
setDoDeltaX(_vm->_rnd->getRandomNumber(1));
startAnimation(0x8258A030, 0, -1);
SetMessageHandler(&AsScene1002Ring::hmRingReleased);
break;
- case 0x482A:
- sendMessage(_parentScene, 0x1022, 990);
+ case NM_MOVE_TO_BACK:
+ sendMessage(_parentScene, NM_PRIORITY_CHANGE, 990);
break;
- case 0x482B:
- sendMessage(_parentScene, 0x1022, 1010);
+ case NM_MOVE_TO_FRONT:
+ sendMessage(_parentScene, NM_PRIORITY_CHANGE, 1010);
break;
}
return messageResult;
@@ -320,15 +320,15 @@ uint32 AsScene1002Ring::hmRingPulled1(int messageNum, const MessageParam &param,
uint32 AsScene1002Ring::hmRingPulled2(int messageNum, const MessageParam &param, Entity *sender) {
uint32 messageResult = Sprite::handleMessage(messageNum, param, sender);
switch (messageNum) {
- case 0x3002:
+ case NM_ANIMATION_STOP:
startAnimation(0x04103090, 0, -1);
SetMessageHandler(&AsScene1002Ring::hmRingHangingLow);
break;
- case 0x482A:
- sendMessage(_parentScene, 0x1022, 990);
+ case NM_MOVE_TO_BACK:
+ sendMessage(_parentScene, NM_PRIORITY_CHANGE, 990);
break;
- case 0x482B:
- sendMessage(_parentScene, 0x1022, 1010);
+ case NM_MOVE_TO_FRONT:
+ sendMessage(_parentScene, NM_PRIORITY_CHANGE, 1010);
break;
}
return messageResult;
@@ -337,17 +337,17 @@ uint32 AsScene1002Ring::hmRingPulled2(int messageNum, const MessageParam &param,
uint32 AsScene1002Ring::hmRingHangingLow(int messageNum, const MessageParam &param, Entity *sender) {
uint32 messageResult = Sprite::handleMessage(messageNum, param, sender);
switch (messageNum) {
- case 0x4807:
- sendMessage(_parentScene, 0x4807, 0);
+ case NM_KLAYMEN_RAISE_LEVER:
+ sendMessage(_parentScene, NM_KLAYMEN_RAISE_LEVER, 0);
setDoDeltaX(_vm->_rnd->getRandomNumber(1));
startAnimation(0x8258A030, 0, -1);
SetMessageHandler(&AsScene1002Ring::hmRingReleased);
break;
- case 0x482A:
- sendMessage(_parentScene, 0x1022, 990);
+ case NM_MOVE_TO_BACK:
+ sendMessage(_parentScene, NM_PRIORITY_CHANGE, 990);
break;
- case 0x482B:
- sendMessage(_parentScene, 0x1022, 1010);
+ case NM_MOVE_TO_FRONT:
+ sendMessage(_parentScene, NM_PRIORITY_CHANGE, 1010);
break;
}
return messageResult;
@@ -356,18 +356,18 @@ uint32 AsScene1002Ring::hmRingHangingLow(int messageNum, const MessageParam &par
uint32 AsScene1002Ring::hmRingReleased(int messageNum, const MessageParam &param, Entity *sender) {
uint32 messageResult = hmRingIdle(messageNum, param, sender);
switch (messageNum) {
- case 0x100D:
+ case NM_ANIMATION_START:
if (param.asInteger() == 0x05410F72)
playSound(0, 0x21EE40A9);
break;
- case 0x3002:
+ case NM_ANIMATION_STOP:
startAnimation(0xA85C4011, 0, -1);
break;
- case 0x482A:
- sendMessage(_parentScene, 0x1022, 990);
+ case NM_MOVE_TO_BACK:
+ sendMessage(_parentScene, NM_PRIORITY_CHANGE, 990);
break;
- case 0x482B:
- sendMessage(_parentScene, 0x1022, 1010);
+ case NM_MOVE_TO_FRONT:
+ sendMessage(_parentScene, NM_PRIORITY_CHANGE, 1010);
break;
}
return messageResult;
@@ -391,11 +391,11 @@ void AsScene1002Door::update() {
uint32 AsScene1002Door::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
uint32 messageResult = Sprite::handleMessage(messageNum, param, sender);
switch (messageNum) {
- case 0x4808:
+ case NM_KLAYMEN_OPEN_DOOR:
setGlobalVar(V_FLYTRAP_RING_DOOR, 1);
SetSpriteUpdate(&AsScene1002Door::suOpenDoor);
break;
- case 0x4809:
+ case NM_KLAYMEN_CLOSE_DOOR:
setGlobalVar(V_FLYTRAP_RING_DOOR, 0);
SetSpriteUpdate(&AsScene1002Door::suCloseDoor);
break;
@@ -443,7 +443,7 @@ uint32 AsScene1002BoxingGloveHitEffect::handleMessage(int messageNum, const Mess
startAnimation(0x0422255A, 0, -1);
setVisible(true);
break;
- case 0x3002:
+ case NM_ANIMATION_STOP:
stopAnimation();
setVisible(false);
break;
@@ -467,7 +467,7 @@ AsScene1002DoorSpy::AsScene1002DoorSpy(NeverhoodEngine *vm, NRect &clipRect, Sce
uint32 AsScene1002DoorSpy::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
uint32 messageResult = Sprite::handleMessage(messageNum, param, sender);
switch (messageNum) {
- case 0x100D:
+ case NM_ANIMATION_START:
if (param.asInteger() == 0xA61CA1C2)
sendMessage(_asBoxingGloveHitEffect, 0x2004, 0);
else if (param.asInteger() == 0x14CE0620)
@@ -483,7 +483,7 @@ uint32 AsScene1002DoorSpy::handleMessage(int messageNum, const MessageParam &par
uint32 AsScene1002DoorSpy::hmDoorSpyAnimation(int messageNum, const MessageParam &param, Entity *sender) {
uint32 messageResult = handleMessage(messageNum, param, sender);
switch (messageNum) {
- case 0x3002:
+ case NM_ANIMATION_STOP:
gotoNextState();
break;
}
@@ -607,7 +607,7 @@ void AsScene1002VenusFlyTrap::upIdle() {
uint32 AsScene1002VenusFlyTrap::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
uint32 messageResult = Sprite::handleMessage(messageNum, param, sender);
switch (messageNum) {
- case 0x100D:
+ case NM_ANIMATION_START:
if (param.asInteger() == 0x000890C4)
playSound(0, 0xC21190D8);
else if (param.asInteger() == 0x522200A0)
@@ -660,11 +660,11 @@ uint32 AsScene1002VenusFlyTrap::handleMessage(int messageNum, const MessageParam
case 0x4810:
swallowKlaymen();
break;
- case 0x482A:
- sendMessage(_parentScene, 0x1022, 995);
+ case NM_MOVE_TO_BACK:
+ sendMessage(_parentScene, NM_PRIORITY_CHANGE, 995);
break;
- case 0x482B:
- sendMessage(_parentScene, 0x1022, 1015);
+ case NM_MOVE_TO_FRONT:
+ sendMessage(_parentScene, NM_PRIORITY_CHANGE, 1015);
break;
}
return messageResult;
@@ -673,7 +673,7 @@ uint32 AsScene1002VenusFlyTrap::handleMessage(int messageNum, const MessageParam
uint32 AsScene1002VenusFlyTrap::hmAnimationSimple(int messageNum, const MessageParam &param, Entity *sender) {
uint32 messageResult = handleMessage(messageNum, param, sender);
switch (messageNum) {
- case 0x3002:
+ case NM_ANIMATION_STOP:
gotoNextState();
break;
}
@@ -683,7 +683,7 @@ uint32 AsScene1002VenusFlyTrap::hmAnimationSimple(int messageNum, const MessageP
uint32 AsScene1002VenusFlyTrap::hmAnimationExt(int messageNum, const MessageParam &param, Entity *sender) {
uint32 messageResult = Sprite::handleMessage(messageNum, param, sender);
switch (messageNum) {
- case 0x100D:
+ case NM_ANIMATION_START:
if (param.asInteger() == 0x000890C4)
playSound(0, 0xC21190D8);
else if (param.asInteger() == 0x41881801) {
@@ -698,14 +698,14 @@ uint32 AsScene1002VenusFlyTrap::hmAnimationExt(int messageNum, const MessagePara
} else if (param.asInteger() == 0x522200A0)
playSound(0, 0x931080C8);
break;
- case 0x3002:
+ case NM_ANIMATION_STOP:
gotoNextState();
break;
- case 0x482A:
- sendMessage(_parentScene, 0x1022, 995);
+ case NM_MOVE_TO_BACK:
+ sendMessage(_parentScene, NM_PRIORITY_CHANGE, 995);
break;
- case 0x482B:
- sendMessage(_parentScene, 0x1022, 1015);
+ case NM_MOVE_TO_FRONT:
+ sendMessage(_parentScene, NM_PRIORITY_CHANGE, 1015);
break;
}
return messageResult;
@@ -727,7 +727,7 @@ void AsScene1002VenusFlyTrap::stWalk() {
}
void AsScene1002VenusFlyTrap::stRelease() {
- sendMessage(_parentScene, 0x4807, 0);
+ sendMessage(_parentScene, NM_KLAYMEN_RAISE_LEVER, 0);
startAnimation(0x82292851, 0, -1);
SetUpdateHandler(&AsScene1002VenusFlyTrap::update);
SetMessageHandler(&AsScene1002VenusFlyTrap::hmAnimationSimple);
@@ -833,11 +833,11 @@ void AsScene1002OutsideDoorBackground::update() {
uint32 AsScene1002OutsideDoorBackground::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
uint32 messageResult = Sprite::handleMessage(messageNum, param, sender);
switch (messageResult) {
- case 0x4808:
+ case NM_KLAYMEN_OPEN_DOOR:
_isDoorClosed = false;
_countdown = 2;
break;
- case 0x4809:
+ case NM_KLAYMEN_CLOSE_DOOR:
_isDoorClosed = true;
_countdown = 2;
break;
@@ -848,7 +848,7 @@ uint32 AsScene1002OutsideDoorBackground::handleMessage(int messageNum, const Mes
uint32 AsScene1002OutsideDoorBackground::hmAnimation(int messageNum, const MessageParam &param, Entity *sender) {
uint32 messageResult = handleMessage(messageNum, param, sender);
switch (messageResult) {
- case 0x3002:
+ case NM_ANIMATION_STOP:
gotoNextState();
break;
}
@@ -930,14 +930,14 @@ void AsScene1002KlaymenPeekHand::update() {
uint32 AsScene1002KlaymenPeekHand::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
uint32 messageResult = Sprite::handleMessage(messageNum, param, sender);
switch (messageNum) {
- case 0x100D:
+ case NM_ANIMATION_START:
if (param.asInteger() == 0x4AB28209) {
- sendMessage(_parentScene, 0x1022, 1200);
+ sendMessage(_parentScene, NM_PRIORITY_CHANGE, 1200);
_isClipRectSaved = true;
_savedClipRect = _surface->getClipRect();
setClipRect(0, 0, 640, 480);
} else if (param.asInteger() == 0x88001184) {
- sendMessage(_parentScene, 0x1022, 1000);
+ sendMessage(_parentScene, NM_PRIORITY_CHANGE, 1000);
if (_isClipRectSaved)
setClipRect(_savedClipRect);
}
@@ -960,15 +960,15 @@ AsScene1004TrashCan::AsScene1004TrashCan(NeverhoodEngine *vm)
uint32 AsScene1004TrashCan::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
Sprite::handleMessage(messageNum, param, sender);
switch (messageNum) {
- case 0x100D:
+ case NM_ANIMATION_START:
if (param.asInteger() == 0x225A8587)
playSound(0, 0x109AFC4C);
break;
- case 0x2002:
+ case NM_POSITION_CHANGE:
startAnimation(0xEB312C11, 0, -1);
setVisible(true);
break;
- case 0x3002:
+ case NM_ANIMATION_STOP:
stopAnimation();
setVisible(false);
break;
@@ -991,7 +991,7 @@ uint32 KmScene1001::xHandleMessage(int messageNum, const MessageParam &param) {
case 0x4800:
startWalkToX(param.asPoint().x, false);
break;
- case 0x4004:
+ case NM_KLAYMEN_STAND_IDLE:
GotoState(&Klaymen::stTryStandIdle);
break;
case 0x4804:
@@ -1001,10 +1001,10 @@ uint32 KmScene1001::xHandleMessage(int messageNum, const MessageParam &param) {
case 0x480D:
GotoState(&KmScene1001::stPullHammerLever);
break;
- case 0x4812:
+ case NM_KLAYMEN_PICKUP:
GotoState(&Klaymen::stPickUpGeneric);
break;
- case 0x4816:
+ case NM_KLAYMEN_PRESS_BUTTON:
if (param.asInteger() == 1)
GotoState(&Klaymen::stPressButton);
else if (param.asInteger() == 2)
@@ -1040,7 +1040,7 @@ uint32 KmScene1001::xHandleMessage(int messageNum, const MessageParam &param) {
break;
case 0x4836:
if (param.asInteger() == 1) {
- sendMessage(_parentScene, 0x2002, 0);
+ sendMessage(_parentScene, NM_POSITION_CHANGE, 0);
GotoState(&KmScene1001::stWakeUp);
}
break;
@@ -1075,7 +1075,7 @@ void KmScene1001::stSleeping() {
uint32 KmScene1001::hmSleeping(int messageNum, const MessageParam &param, Entity *sender) {
uint32 messageResult = hmLowLevel(messageNum, param, sender);
switch (messageNum) {
- case 0x100D:
+ case NM_ANIMATION_START:
if (param.asInteger() == 0x03060012) {
playSound(0, 0xC0238244);
}
@@ -1098,9 +1098,9 @@ void KmScene1001::stPullHammerLever() {
uint32 KmScene1001::hmPullHammerLever(int messageNum, const MessageParam &param, Entity *sender) {
uint32 messageResult = Klaymen::hmLever(messageNum, param, sender);
switch (messageNum) {
- case 0x100D:
+ case NM_ANIMATION_START:
if (param.asInteger() == 0x4AB28209)
- sendMessage(_attachedSprite, 0x480F, 0);
+ sendMessage(_attachedSprite, NM_KLAYMEN_LOWER_LEVER, 0);
break;
}
return messageResult;
@@ -1112,23 +1112,6 @@ KmScene1002::KmScene1002(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16
setKlaymenIdleTable1();
}
-void KmScene1002::setupJumpToRing() {
- _acceptInput = false;
- SetUpdateHandler(&Klaymen::update);
- SetMessageHandler(&KmScene1002::hmJumpToRing);
- SetSpriteUpdate(&Klaymen::suUpdateDestX);
- NextState(&KmScene1002::stHangOnRing);
- sendMessage(_attachedSprite, 0x482B, 0);
-}
-
-void KmScene1002::stJumpToRing1() {
- if (!stStartAction(AnimationCallback(&KmScene1002::stJumpToRing1))) {
- _busyStatus = 0;
- startAnimation(0xD82890BA, 0, -1);
- setupJumpToRing();
- }
-}
-
void KmScene1002::xUpdate() {
if (_x >= 250 && _x <= 435 && _y >= 420) {
if (_idleTableNum == 0) {
@@ -1146,14 +1129,14 @@ uint32 KmScene1002::xHandleMessage(int messageNum, const MessageParam &param) {
case 0x2001:
GotoState(&Klaymen::stStandIdleSpecial);
break;
- case 0x2007:
+ case NM_CAR_MOVE_TO_PREV_POINT:
_otherSprite = (Sprite*)param.asEntity();
break;
case 0x4001:
case 0x4800:
startWalkToX(param.asPoint().x, false);
break;
- case 0x4004:
+ case NM_KLAYMEN_STAND_IDLE:
GotoState(&Klaymen::stTryStandIdle);
break;
case 0x4803:
@@ -1181,15 +1164,15 @@ uint32 KmScene1002::xHandleMessage(int messageNum, const MessageParam &param) {
break;
}
break;
- case 0x480A:
+ case NM_KLAYMEN_MOVE_OBJECT:
GotoState(&KmScene1002::stMoveVenusFlyTrap);
break;
case 0x480D:
GotoState(&KmScene1002::stJumpToRingVenusFlyTrap);
break;
- case 0x4816:
+ case NM_KLAYMEN_PRESS_BUTTON:
if (param.asInteger() == 0)
- GotoState(&Klaymen::stPressDoorButton);
+ GotoState(&KmScene1002::stPressDoorButton);
break;
case 0x4817:
setDoDeltaX(param.asInteger());
@@ -1199,21 +1182,21 @@ uint32 KmScene1002::xHandleMessage(int messageNum, const MessageParam &param) {
startWalkToAttachedSpriteXDistance(param.asInteger());
break;
case 0x4820:
- sendMessage(_parentScene, 0x2005, 0);
+ sendMessage(_parentScene, NM_KLAYMEN_CLIMB_LADDER, 0);
GotoState(&Klaymen::stContinueClimbLadderUp);
break;
case 0x4821:
- sendMessage(_parentScene, 0x2005, 0);
+ sendMessage(_parentScene, NM_KLAYMEN_CLIMB_LADDER, 0);
_destY = param.asInteger();
GotoState(&Klaymen::stStartClimbLadderDown);
break;
case 0x4822:
- sendMessage(_parentScene, 0x2005, 0);
+ sendMessage(_parentScene, NM_KLAYMEN_CLIMB_LADDER, 0);
_destY = param.asInteger();
GotoState(&Klaymen::stStartClimbLadderUp);
break;
case 0x4823:
- sendMessage(_parentScene, 0x2006, 0);
+ sendMessage(_parentScene, NM_KLAYMEN_STOP_CLIMBING, 0);
GotoState(&Klaymen::stClimbLadderHalf);
break;
case 0x482E:
@@ -1238,85 +1221,28 @@ uint32 KmScene1002::xHandleMessage(int messageNum, const MessageParam &param) {
return 0;
}
-KmScene1004::KmScene1004(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y)
- : Klaymen(vm, parentScene, x, y) {
-
- _dataResource.load(0x01900A04);
-}
-
-uint32 KmScene1004::xHandleMessage(int messageNum, const MessageParam &param) {
- switch (messageNum) {
- case 0x4001:
- case 0x4800:
- startWalkToX(param.asPoint().x, false);
- break;
- case 0x4004:
- GotoState(&Klaymen::stTryStandIdle);
- break;
- case 0x4817:
- setDoDeltaX(param.asInteger());
- gotoNextStateExt();
- break;
- case 0x4818:
- startWalkToX(_dataResource.getPoint(param.asInteger()).x, false);
- break;
- case 0x481E:
- GotoState(&KmScene1004::stReadNote);
- break;
- case 0x4820:
- sendMessage(_parentScene, 0x2000, 0);
- GotoState(&Klaymen::stContinueClimbLadderUp);
- break;
- case 0x4821:
- sendMessage(_parentScene, 0x2000, 0);
- _destY = param.asInteger();
- GotoState(&Klaymen::stStartClimbLadderDown);
- break;
- case 0x4822:
- sendMessage(_parentScene, 0x2000, 0);
- _destY = param.asInteger();
- GotoState(&Klaymen::stStartClimbLadderUp);
- break;
- case 0x4823:
- sendMessage(_parentScene, 0x2001, 0);
- GotoState(&Klaymen::stClimbLadderHalf);
- break;
- case 0x4824:
- sendMessage(_parentScene, 0x2000, 0);
- _destY = _dataResource.getPoint(param.asInteger()).y;
- GotoState(&Klaymen::stStartClimbLadderDown);
- break;
- case 0x4825:
- sendMessage(_parentScene, 0x2000, 0);
- _destY = _dataResource.getPoint(param.asInteger()).y;
- GotoState(&Klaymen::stStartClimbLadderUp);
- break;
- case 0x4828:
- GotoState(&Klaymen::stTurnToBackToUse);
- break;
- case 0x483F:
- startSpecialWalkRight(param.asInteger());
- break;
- case 0x4840:
- startSpecialWalkLeft(param.asInteger());
- break;
- }
- return 0;
+void KmScene1002::setupJumpToRing() {
+ _acceptInput = false;
+ SetUpdateHandler(&Klaymen::update);
+ SetMessageHandler(&KmScene1002::hmJumpToRing);
+ SetSpriteUpdate(&Klaymen::suUpdateDestX);
+ NextState(&KmScene1002::stHangOnRing);
+ sendMessage(_attachedSprite, NM_MOVE_TO_FRONT, 0);
}
uint32 KmScene1002::hmJumpToRing(int messageNum, const MessageParam &param, Entity *sender) {
uint32 messageResult = hmLowLevelAnimation(messageNum, param, sender);
switch (messageNum) {
- case 0x100D:
+ case NM_ANIMATION_START:
if (param.asInteger() == 0x168050A0) {
- sendMessage(_attachedSprite, 0x4806, 0);
+ sendMessage(_attachedSprite, NM_KLAYMEN_USE_OBJECT, 0);
_acceptInput = true;
} else if (param.asInteger() == 0x320AC306) {
playSound(0, 0x5860C640);
} else if (param.asInteger() == 0x4AB28209) {
- sendMessage(_attachedSprite, 0x482A, 0);
+ sendMessage(_attachedSprite, NM_MOVE_TO_BACK, 0);
} else if (param.asInteger() == 0x88001184) {
- sendMessage(_attachedSprite, 0x482B, 0);
+ sendMessage(_attachedSprite, NM_MOVE_TO_FRONT, 0);
}
break;
}
@@ -1332,6 +1258,14 @@ void KmScene1002::stHangOnRing() {
SetSpriteUpdate(NULL);
}
+void KmScene1002::stJumpToRing1() {
+ if (!stStartAction(AnimationCallback(&KmScene1002::stJumpToRing1))) {
+ _busyStatus = 0;
+ startAnimation(0xD82890BA, 0, -1);
+ setupJumpToRing();
+ }
+}
+
void KmScene1002::stJumpToRing2() {
if (!stStartAction(AnimationCallback(&KmScene1002::stJumpToRing2))) {
_busyStatus = 0;
@@ -1349,22 +1283,22 @@ void KmScene1002::stJumpToRing3() {
SetSpriteUpdate(&Klaymen::suUpdateDestX);
SetMessageHandler(&KmScene1002::hmJumpToRing3);
NextState(&KmScene1002::stHoldRing3);
- sendMessage(_attachedSprite, 0x482B, 0);
+ sendMessage(_attachedSprite, NM_MOVE_TO_FRONT, 0);
}
}
uint32 KmScene1002::hmJumpToRing3(int messageNum, const MessageParam &param, Entity *sender) {
uint32 messageResult = hmLowLevelAnimation(messageNum, param, sender);
switch (messageNum) {
- case 0x100D:
+ case NM_ANIMATION_START:
if (param.asInteger() == 0x168050A0) {
- sendMessage(_attachedSprite, 0x4806, 0);
+ sendMessage(_attachedSprite, NM_KLAYMEN_USE_OBJECT, 0);
} else if (param.asInteger() == 0x320AC306) {
playSound(0, 0x5860C640);
} else if (param.asInteger() == 0x4AB28209) {
- sendMessage(_attachedSprite, 0x482A, 0);
+ sendMessage(_attachedSprite, NM_MOVE_TO_BACK, 0);
} else if (param.asInteger() == 0x88001184) {
- sendMessage(_attachedSprite, 0x482B, 0);
+ sendMessage(_attachedSprite, NM_MOVE_TO_FRONT, 0);
}
break;
}
@@ -1405,22 +1339,22 @@ void KmScene1002::stJumpToRingVenusFlyTrap() {
SetMessageHandler(&KmScene1002::hmJumpToRingVenusFlyTrap);
SetSpriteUpdate(&AnimatedSprite::updateDeltaXY);
NextState(&KmScene1002::stLandOnFeet);
- sendMessage(_attachedSprite, 0x482B, 0);
+ sendMessage(_attachedSprite, NM_MOVE_TO_FRONT, 0);
}
}
uint32 KmScene1002::hmJumpToRingVenusFlyTrap(int messageNum, const MessageParam &param, Entity *sender) {
uint32 messageResult = hmLowLevelAnimation(messageNum, param, sender);
switch (messageNum) {
- case 0x100D:
+ case NM_ANIMATION_START:
if (param.asInteger() == 0x168050A0) {
- sendMessage(_attachedSprite, 0x480F, 0);
+ sendMessage(_attachedSprite, NM_KLAYMEN_LOWER_LEVER, 0);
} else if (param.asInteger() == 0x586B0300) {
sendMessage(_otherSprite, 0x480E, 1);
} else if (param.asInteger() == 0x4AB28209) {
- sendMessage(_attachedSprite, 0x482A, 0);
+ sendMessage(_attachedSprite, NM_MOVE_TO_BACK, 0);
} else if (param.asInteger() == 0x88001184) {
- sendMessage(_attachedSprite, 0x482B, 0);
+ sendMessage(_attachedSprite, NM_MOVE_TO_FRONT, 0);
}
break;
}
@@ -1443,7 +1377,7 @@ void KmScene1002::stJumpAndFall() {
void KmScene1002::stDropFromRing() {
if (_attachedSprite) {
_x = _attachedSprite->getX();
- sendMessage(_attachedSprite, 0x4807, 0);
+ sendMessage(_attachedSprite, NM_KLAYMEN_RAISE_LEVER, 0);
_attachedSprite = NULL;
}
_busyStatus = 2;
@@ -1458,7 +1392,7 @@ void KmScene1002::stDropFromRing() {
uint32 KmScene1002::hmJumpAndFall(int messageNum, const MessageParam &param, Entity *sender) {
uint32 messageResult = hmLowLevel(messageNum, param, sender);
switch (messageNum) {
- case 0x100D:
+ case NM_ANIMATION_START:
if (param.asInteger() == 0x1307050A) {
playSound(0, 0x40428A09);
}
@@ -1492,12 +1426,12 @@ void KmScene1002::stContinueMovingVenusFlyTrap() {
}
void KmScene1002::evMoveVenusFlyTrapDone() {
- sendMessage(_attachedSprite, 0x482A, 0);
+ sendMessage(_attachedSprite, NM_MOVE_TO_BACK, 0);
}
uint32 KmScene1002::hmMoveVenusFlyTrap(int messageNum, const MessageParam &param, Entity *sender) {
switch (messageNum) {
- case 0x100D:
+ case NM_ANIMATION_START:
if (param.asInteger() == 0x01084280) {
sendMessage(_attachedSprite, 0x480B, (uint32)_doDeltaX);
} else if (param.asInteger() == 0x02421405) {
@@ -1508,16 +1442,16 @@ uint32 KmScene1002::hmMoveVenusFlyTrap(int messageNum, const MessageParam &param
SetMessageHandler(&KmScene1002::hmFirstMoveVenusFlyTrap);
}
} else if (param.asInteger() == 0x4AB28209) {
- sendMessage(_attachedSprite, 0x482A, 0);
+ sendMessage(_attachedSprite, NM_MOVE_TO_BACK, 0);
} else if (param.asInteger() == 0x88001184) {
- sendMessage(_attachedSprite, 0x482B, 0);
+ sendMessage(_attachedSprite, NM_MOVE_TO_FRONT, 0);
} else if (param.asInteger() == 0x32180101) {
playSound(0, 0x405002D8);
} else if (param.asInteger() == 0x0A2A9098) {
playSound(0, 0x0460E2FA);
}
break;
- case 0x480A:
+ case NM_KLAYMEN_MOVE_OBJECT:
_isMoveObjectRequested = true;
return 0;
}
@@ -1527,11 +1461,11 @@ uint32 KmScene1002::hmMoveVenusFlyTrap(int messageNum, const MessageParam &param
uint32 KmScene1002::hmFirstMoveVenusFlyTrap(int messageNum, const MessageParam &param, Entity *sender) {
uint32 messageResult = hmLowLevelAnimation(messageNum, param, sender);
switch (messageNum) {
- case 0x100D:
+ case NM_ANIMATION_START:
if (param.asInteger() == 0x4AB28209) {
- sendMessage(_attachedSprite, 0x482A, 0);
+ sendMessage(_attachedSprite, NM_MOVE_TO_BACK, 0);
} else if (param.asInteger() == 0x88001184) {
- sendMessage(_attachedSprite, 0x482B, 0);
+ sendMessage(_attachedSprite, NM_MOVE_TO_FRONT, 0);
} else if (param.asInteger() == 0x32180101) {
playSound(0, 0x405002D8);
} else if (param.asInteger() == 0x0A2A9098) {
@@ -1542,13 +1476,144 @@ uint32 KmScene1002::hmFirstMoveVenusFlyTrap(int messageNum, const MessageParam &
return messageResult;
}
+void KmScene1002::stPressDoorButton() {
+ _busyStatus = 2;
+ _acceptInput = true;
+ setDoDeltaX(0);
+ startAnimation(0x1CD89029, 0, -1);
+ SetUpdateHandler(&Klaymen::update);
+ SetMessageHandler(&KmScene1002::hmPressDoorButton);
+ SetSpriteUpdate(&Klaymen::suAction);
+}
+
+void KmScene1002::stHitByBoxingGlove() {
+ _busyStatus = 1;
+ _acceptInput = false;
+ startAnimation(0x35AA8059, 0, -1);
+ SetUpdateHandler(&Klaymen::update);
+ SetMessageHandler(&KmScene1002::hmHitByBoxingGlove);
+ SetSpriteUpdate(&AnimatedSprite::updateDeltaXY);
+ FinalizeState(&KmScene1002::evHitByBoxingGloveDone);
+}
+
+void KmScene1002::evHitByBoxingGloveDone() {
+ sendMessage(_parentScene, 0x1024, 1);
+}
+
+uint32 KmScene1002::hmPressDoorButton(int messageNum, const MessageParam &param, Entity *sender) {
+ uint32 messageResult = hmLowLevelAnimation(messageNum, param, sender);
+ switch (messageNum) {
+ case NM_ANIMATION_START:
+ if (param.asInteger() == 0x942D2081) {
+ _acceptInput = false;
+ sendMessage(_attachedSprite, 0x2003, 0);
+ } else if (param.asInteger() == 0xDA600012) {
+ stHitByBoxingGlove();
+ } else if (param.asInteger() == 0x0D01B294) {
+ _acceptInput = false;
+ sendMessage(_attachedSprite, 0x480B, 0);
+ }
+ break;
+ }
+ return messageResult;
+}
+
+uint32 KmScene1002::hmHitByBoxingGlove(int messageNum, const MessageParam &param, Entity *sender) {
+ int16 speedUpFrameIndex;
+ uint32 messageResult = hmLowLevelAnimation(messageNum, param, sender);
+ switch (messageNum) {
+ case 0x1008:
+ speedUpFrameIndex = getFrameIndex(kKlaymenSpeedUpHash);
+ if (_currFrameIndex < speedUpFrameIndex) {
+ startAnimation(0x35AA8059, speedUpFrameIndex, -1);
+ _y = 435;
+ }
+ messageResult = 0;
+ break;
+ case NM_ANIMATION_START:
+ if (param.asInteger() == 0x1A1A0785) {
+ playSound(0, 0x40F0A342);
+ } else if (param.asInteger() == 0x60428026) {
+ playSound(0, 0x40608A59);
+ }
+ break;
+ }
+ return messageResult;
+}
+
+KmScene1004::KmScene1004(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y)
+ : Klaymen(vm, parentScene, x, y) {
+
+ _dataResource.load(0x01900A04);
+}
+
+uint32 KmScene1004::xHandleMessage(int messageNum, const MessageParam &param) {
+ switch (messageNum) {
+ case 0x4001:
+ case 0x4800:
+ startWalkToX(param.asPoint().x, false);
+ break;
+ case NM_KLAYMEN_STAND_IDLE:
+ GotoState(&Klaymen::stTryStandIdle);
+ break;
+ case 0x4817:
+ setDoDeltaX(param.asInteger());
+ gotoNextStateExt();
+ break;
+ case 0x4818:
+ startWalkToX(_dataResource.getPoint(param.asInteger()).x, false);
+ break;
+ case NM_KLAYMEN_RETURN_FROM_USE:
+ GotoState(&KmScene1004::stReadNote);
+ break;
+ case 0x4820:
+ sendMessage(_parentScene, 0x2000, 0);
+ GotoState(&Klaymen::stContinueClimbLadderUp);
+ break;
+ case 0x4821:
+ sendMessage(_parentScene, 0x2000, 0);
+ _destY = param.asInteger();
+ GotoState(&Klaymen::stStartClimbLadderDown);
+ break;
+ case 0x4822:
+ sendMessage(_parentScene, 0x2000, 0);
+ _destY = param.asInteger();
+ GotoState(&Klaymen::stStartClimbLadderUp);
+ break;
+ case 0x4823:
+ sendMessage(_parentScene, 0x2001, 0);
+ GotoState(&Klaymen::stClimbLadderHalf);
+ break;
+ case 0x4824:
+ sendMessage(_parentScene, 0x2000, 0);
+ _destY = _dataResource.getPoint(param.asInteger()).y;
+ GotoState(&Klaymen::stStartClimbLadderDown);
+ break;
+ case 0x4825:
+ sendMessage(_parentScene, 0x2000, 0);
+ _destY = _dataResource.getPoint(param.asInteger()).y;
+ GotoState(&Klaymen::stStartClimbLadderUp);
+ break;
+ case 0x4828:
+ GotoState(&Klaymen::stTurnToBackToUse);
+ break;
+ case 0x483F:
+ startSpecialWalkRight(param.asInteger());
+ break;
+ case 0x4840:
+ startSpecialWalkLeft(param.asInteger());
+ break;
+ }
+ return 0;
+}
+
uint32 KmScene1004::hmReadNote(int messageNum, const MessageParam &param, Entity *sender) {
uint32 messageResult = hmLowLevelAnimation(messageNum, param, sender);
switch (messageNum) {
- case 0x100D:
+ case NM_ANIMATION_START:
if (param.asInteger() == 0x04684052) {
_acceptInput = true;
- sendMessage(_parentScene, 0x2002, 0);
+ sendMessage(_parentScene, NM_POSITION_CHANGE, 0);
}
break;
}
diff --git a/engines/neverhood/modules/module1000_sprites.h b/engines/neverhood/modules/module1000_sprites.h
index 540a258ddc..8a03824086 100644
--- a/engines/neverhood/modules/module1000_sprites.h
+++ b/engines/neverhood/modules/module1000_sprites.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -230,6 +230,9 @@ protected:
void stMoveVenusFlyTrap();
void stContinueMovingVenusFlyTrap();
void evMoveVenusFlyTrapDone();
+ void stPressDoorButton();
+ void stHitByBoxingGlove();
+ void evHitByBoxingGloveDone();
uint32 hmJumpToRing(int messageNum, const MessageParam &param, Entity *sender);
uint32 hmJumpToRing3(int messageNum, const MessageParam &param, Entity *sender);
@@ -238,6 +241,8 @@ protected:
uint32 hmJumpAndFall(int messageNum, const MessageParam &param, Entity *sender);
uint32 hmMoveVenusFlyTrap(int messageNum, const MessageParam &param, Entity *sender);
uint32 hmFirstMoveVenusFlyTrap(int messageNum, const MessageParam &param, Entity *sender);
+ uint32 hmPressDoorButton(int messageNum, const MessageParam &param, Entity *sender);
+ uint32 hmHitByBoxingGlove(int messageNum, const MessageParam &param, Entity *sender);
void xUpdate();
uint32 xHandleMessage(int messageNum, const MessageParam &param);
diff --git a/engines/neverhood/modules/module1100.cpp b/engines/neverhood/modules/module1100.cpp
index af2df2e742..cca80f3f62 100644
--- a/engines/neverhood/modules/module1100.cpp
+++ b/engines/neverhood/modules/module1100.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -136,15 +136,20 @@ void Module1100::updateScene() {
switch (_sceneNum) {
case 0:
_countdown = 0;
- _vm->_soundMan->playTwoSounds(0x0002C818, 0x48498E46, 0x50399F64, 0);
_vm->_soundMan->setSoundVolume(0x48498E46, 65);
_vm->_soundMan->setSoundVolume(0x50399F64, 65);
- if (_moduleResult == 0)
+ if (_moduleResult == 0) {
+ _vm->_soundMan->playTwoSounds(0x0002C818, 0x48498E46, 0x50399F64, 0);
createScene(1, 0);
- else if (_moduleResult == 1)
+ } else if (_moduleResult == 1) {
+ /* NOTE This fixes a bug in the original where the "tunnel" footstep
+ sounds are played instead of the correct footsteps. */
+ _vm->_soundMan->playTwoSounds(0x0002C818, 0x41861371, 0x43A2507F, 0);
createScene(8, 0);
+ }
break;
case 1:
+ _countdown = 0;
_vm->_soundMan->playTwoSounds(0x0002C818, 0x41861371, 0x43A2507F, 0);
if (getGlobalVar(V_ROBOT_HIT)) {
if (_moduleResult == 0)
@@ -286,7 +291,7 @@ uint32 Scene1105::handleMessage(int messageNum, const MessageParam &param, Entit
uint32 messageResult = 0;
Scene::handleMessage(messageNum, param, sender);
switch (messageNum) {
- case 0x0001:
+ case NM_MOUSE_CLICK:
if (param.asPoint().x <= 20 || param.asPoint().x >= 620) {
if (!_isActionButtonClicked && _backgroundIndex == 0) {
if (_isPanelOpen) {
@@ -309,7 +314,7 @@ uint32 Scene1105::handleMessage(int messageNum, const MessageParam &param, Entit
_leaveResult = 1;
SetUpdateHandler(&Scene1105::upClosePanel);
break;
- case 0x4807:
+ case NM_KLAYMEN_RAISE_LEVER:
if (sender == _ssActionButton) {
if (getSubVar(VA_GOOD_DICE_NUMBERS, 0) == getSubVar(VA_CURR_DICE_NUMBERS, 0) &&
getSubVar(VA_GOOD_DICE_NUMBERS, 1) == getSubVar(VA_CURR_DICE_NUMBERS, 1) &&
@@ -318,7 +323,7 @@ uint32 Scene1105::handleMessage(int messageNum, const MessageParam &param, Entit
playSound(2);
_doMoveTeddy = true;
} else {
- sendMessage(_asTeddyBear, 0x2002, 0);
+ sendMessage(_asTeddyBear, NM_POSITION_CHANGE, 0);
}
showMouse(false);
_isActionButtonClicked = true;
@@ -460,7 +465,7 @@ void Scene1105::update() {
if (_isClosePanelDone && !isSoundPlaying(1))
leaveScene(_leaveResult);
if (_doMoveTeddy && !isSoundPlaying(2)) {
- sendMessage(_asTeddyBear, 0x2002, 0);
+ sendMessage(_asTeddyBear, NM_POSITION_CHANGE, 0);
_doMoveTeddy = false;
}
}
@@ -513,7 +518,7 @@ Scene1109::Scene1109(NeverhoodEngine *vm, Module *parentModule, int which)
uint32 Scene1109::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
Scene::handleMessage(messageNum, param, sender);
switch (messageNum) {
- case 0x2000:
+ case NM_ANIMATION_UPDATE:
if (param.asInteger()) {
setRectList(0x004B63A8);
_klaymen->setKlaymenIdleTable3();
diff --git a/engines/neverhood/modules/module1100.h b/engines/neverhood/modules/module1100.h
index 38bac1f298..31f5f8a04e 100644
--- a/engines/neverhood/modules/module1100.h
+++ b/engines/neverhood/modules/module1100.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/neverhood/modules/module1100_sprites.cpp b/engines/neverhood/modules/module1100_sprites.cpp
index 51e0bb3f49..b5fd8490f6 100644
--- a/engines/neverhood/modules/module1100_sprites.cpp
+++ b/engines/neverhood/modules/module1100_sprites.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -48,7 +48,7 @@ SsScene1105Button::SsScene1105Button(NeverhoodEngine *vm, Scene *parentScene, ui
void SsScene1105Button::update() {
if (_countdown != 0 && (--_countdown == 0)) {
- sendMessage(_parentScene, 0x4807, 0);
+ sendMessage(_parentScene, NM_KLAYMEN_RAISE_LEVER, 0);
setVisible(false);
}
}
@@ -96,7 +96,7 @@ SsScene1105SymbolDie::SsScene1105SymbolDie(NeverhoodEngine *vm, uint dieIndex, i
uint32 SsScene1105SymbolDie::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
uint32 messageResult = Sprite::handleMessage(messageNum, param, sender);
switch (messageNum) {
- case 0x2000:
+ case NM_ANIMATION_UPDATE:
loadSymbolSprite();
break;
}
@@ -133,7 +133,7 @@ AsScene1105TeddyBear::AsScene1105TeddyBear(NeverhoodEngine *vm, Scene *parentSce
uint32 AsScene1105TeddyBear::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
uint32 messageResult = Sprite::handleMessage(messageNum, param, sender);
switch (messageNum) {
- case 0x2002:
+ case NM_POSITION_CHANGE:
if (getGlobalVar(V_ROBOT_TARGET)) {
startAnimation(0x6B0C0432, 0, -1);
playSound(0);
@@ -142,7 +142,7 @@ uint32 AsScene1105TeddyBear::handleMessage(int messageNum, const MessageParam &p
playSound(1);
}
break;
- case 0x3002:
+ case NM_ANIMATION_STOP:
sendMessage(_parentScene, 0x2003, 0);
stopAnimation();
break;
@@ -206,7 +206,7 @@ KmScene1109::KmScene1109(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16
uint32 KmScene1109::xHandleMessage(int messageNum, const MessageParam &param) {
uint32 messageResult = 0;
switch (messageNum) {
- case 0x2000:
+ case NM_ANIMATION_UPDATE:
_isSittingInTeleporter = param.asInteger() != 0;
messageResult = 1;
break;
@@ -214,7 +214,7 @@ uint32 KmScene1109::xHandleMessage(int messageNum, const MessageParam &param) {
case 0x4800:
startWalkToX(param.asPoint().x, false);
break;
- case 0x4004:
+ case NM_KLAYMEN_STAND_IDLE:
if (_isSittingInTeleporter)
GotoState(&Klaymen::stSitIdleTeleporter);
else
@@ -231,11 +231,11 @@ uint32 KmScene1109::xHandleMessage(int messageNum, const MessageParam &param) {
setDoDeltaX(param.asInteger());
gotoNextStateExt();
break;
- case 0x481D:
+ case NM_KLAYMEN_TURN_TO_USE:
if (_isSittingInTeleporter)
GotoState(&Klaymen::stTurnToUseInTeleporter);
break;
- case 0x481E:
+ case NM_KLAYMEN_RETURN_FROM_USE:
if (_isSittingInTeleporter)
GotoState(&Klaymen::stReturnFromUseInTeleporter);
break;
diff --git a/engines/neverhood/modules/module1100_sprites.h b/engines/neverhood/modules/module1100_sprites.h
index c8e5a838da..2e50902664 100644
--- a/engines/neverhood/modules/module1100_sprites.h
+++ b/engines/neverhood/modules/module1100_sprites.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/neverhood/modules/module1200.cpp b/engines/neverhood/modules/module1200.cpp
index 975545091d..ba5e18ab15 100644
--- a/engines/neverhood/modules/module1200.cpp
+++ b/engines/neverhood/modules/module1200.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -296,15 +296,15 @@ void Scene1201::update() {
uint32 Scene1201::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
uint32 messageResult = Scene::handleMessage(messageNum, param, sender);
switch (messageNum) {
- case 0x100D:
+ case NM_ANIMATION_START:
if (param.asInteger() == 0x07053000) {
_creatureExploded = true;
sendMessage(_asCreature, 0x2004, 0);
} else if (param.asInteger() == 0x140E5744)
- sendMessage(_asCreature, 0x2005, 0);
+ sendMessage(_asCreature, NM_KLAYMEN_CLIMB_LADDER, 0);
else if (param.asInteger() == 0x40253C40) {
_canAcceptInput = false;
- sendMessage(_asCreature, 0x2006, 0);
+ sendMessage(_asCreature, NM_KLAYMEN_STOP_CLIMBING, 0);
} else if (param.asInteger() == 0x090EB048) {
if (_klaymen->getX() < 572)
setMessageList2(0x004AEC90);
@@ -320,7 +320,7 @@ uint32 Scene1201::handleMessage(int messageNum, const MessageParam &param, Entit
setMessageList2(0x004AECC0);
}
break;
- case 0x2002:
+ case NM_POSITION_CHANGE:
if (getGlobalVar(V_TNT_DUMMY_FUSE_LIT)) {
// Move the TNT dummy if the fuse is burning
sendEntityMessage(_klaymen, 0x1014, _asTntMan);
@@ -347,7 +347,7 @@ uint32 Scene1201::handleMessage(int messageNum, const MessageParam &param, Entit
sendMessage(_asRightDoor, 0x4829, 0);
break;
case 0x8000:
- sendMessage(_asKlaymenHead, 0x2006, 0);
+ sendMessage(_asKlaymenHead, NM_KLAYMEN_STOP_CLIMBING, 0);
break;
}
return messageResult;
@@ -427,14 +427,14 @@ uint32 Scene1202::handleMessage(int messageNum, const MessageParam &param, Entit
uint32 messageResult = 0;
Scene::handleMessage(messageNum, param, sender);
switch (messageNum) {
- case 0x0001:
+ case NM_MOUSE_CLICK:
if ((param.asPoint().x <= 20 || param.asPoint().x >= 620) && !_isPuzzleSolved)
leaveScene(0);
break;
- case 0x2000:
+ case NM_ANIMATION_UPDATE:
_clickedIndex = (int)param.asInteger();
break;
- case 0x2002:
+ case NM_POSITION_CHANGE:
_counter--;
break;
}
@@ -444,7 +444,7 @@ uint32 Scene1202::handleMessage(int messageNum, const MessageParam &param, Entit
uint32 Scene1202::hmSolved(int messageNum, const MessageParam &param, Entity *sender) {
Scene::handleMessage(messageNum, param, sender);
switch (messageNum) {
- case 0x0001:
+ case NM_MOUSE_CLICK:
if (param.asPoint().x <= 20 || param.asPoint().x >= 620)
leaveScene(0);
break;
diff --git a/engines/neverhood/modules/module1200.h b/engines/neverhood/modules/module1200.h
index d9d4dd11f2..492f0d42f0 100644
--- a/engines/neverhood/modules/module1200.h
+++ b/engines/neverhood/modules/module1200.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/neverhood/modules/module1200_sprites.cpp b/engines/neverhood/modules/module1200_sprites.cpp
index da38924d9a..04bd4c1cb7 100644
--- a/engines/neverhood/modules/module1200_sprites.cpp
+++ b/engines/neverhood/modules/module1200_sprites.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -72,7 +72,7 @@ uint32 AsScene1201Tape::handleMessage(int messageNum, const MessageParam &param,
sendMessage(_parentScene, 0x4826, 0);
messageResult = 1;
break;
- case 0x4806:
+ case NM_KLAYMEN_USE_OBJECT:
setSubVar(VA_HAS_TAPE, _nameHash, 1);
setVisible(false);
SetMessageHandler(NULL);
@@ -101,11 +101,11 @@ AsScene1201TntManRope::AsScene1201TntManRope(NeverhoodEngine *vm, bool isDummyHa
uint32 AsScene1201TntManRope::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
uint32 messageResult = Sprite::handleMessage(messageNum, param, sender);
switch (messageNum) {
- case 0x100D:
+ case NM_ANIMATION_START:
if (param.asInteger() == 0x02060018)
playSound(0, 0x47900E06);
break;
- case 0x2006:
+ case NM_KLAYMEN_STOP_CLIMBING:
startAnimation(0x928F0C10, 1, -1);
_newStickFrameIndex = STICK_LAST_FRAME;
break;
@@ -141,7 +141,7 @@ void AsScene1201RightDoor::update() {
uint32 AsScene1201RightDoor::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
uint32 messageResult = Sprite::handleMessage(messageNum, param, sender);
switch (messageNum) {
- case 0x3002:
+ case NM_ANIMATION_STOP:
gotoNextState();
break;
case 0x4829:
@@ -184,13 +184,13 @@ AsScene1201KlaymenHead::AsScene1201KlaymenHead(NeverhoodEngine *vm)
uint32 AsScene1201KlaymenHead::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
uint32 messageResult = Sprite::handleMessage(messageNum, param, sender);
switch (messageNum) {
- case 0x2006:
+ case NM_KLAYMEN_STOP_CLIMBING:
_x = 436;
_y = 339;
startAnimation(0xA060C599, 0, -1);
setVisible(true);
break;
- case 0x3002:
+ case NM_ANIMATION_STOP:
stopAnimation();
setVisible(false);
gotoNextState();
@@ -223,14 +223,14 @@ AsScene1201TntMan::~AsScene1201TntMan() {
uint32 AsScene1201TntMan::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
uint32 messageResult = Sprite::handleMessage(messageNum, param, sender);
switch (messageNum) {
- case 0x100D:
+ case NM_ANIMATION_START:
if (param.asInteger() == 0x092870C0)
- sendMessage(_asTntManRope, 0x2006, 0);
+ sendMessage(_asTntManRope, NM_KLAYMEN_STOP_CLIMBING, 0);
else if (param.asInteger() == 0x11CA0144)
playSound(0, 0x51800A04);
break;
case 0x1011:
- sendMessage(_parentScene, 0x2002, 0);
+ sendMessage(_parentScene, NM_POSITION_CHANGE, 0);
messageResult = 1;
break;
case 0x480B:
@@ -247,7 +247,7 @@ uint32 AsScene1201TntMan::handleMessage(int messageNum, const MessageParam &para
uint32 AsScene1201TntMan::hmComingDown(int messageNum, const MessageParam &param, Entity *sender) {
uint32 messageResult = AsScene1201TntMan::handleMessage(messageNum, param, sender);
switch (messageNum) {
- case 0x3002:
+ case NM_ANIMATION_STOP:
gotoNextState();
break;
}
@@ -353,7 +353,7 @@ void AsScene1201Match::update() {
uint32 AsScene1201Match::hmOnDoorFrameAboutToMove(int messageNum, const MessageParam &param, Entity *sender) {
uint32 messageResult = Sprite::handleMessage(messageNum, param, sender);
switch (messageNum) {
- case 0x100D:
+ case NM_ANIMATION_START:
if (param.asInteger() == 0x86668011)
playSound(0);
break;
@@ -364,7 +364,7 @@ uint32 AsScene1201Match::hmOnDoorFrameAboutToMove(int messageNum, const MessageP
uint32 AsScene1201Match::hmOnDoorFrameMoving(int messageNum, const MessageParam &param, Entity *sender) {
uint32 messageResult = hmOnDoorFrameAboutToMove(messageNum, param, sender);
switch (messageNum) {
- case 0x3002:
+ case NM_ANIMATION_STOP:
gotoNextState();
break;
}
@@ -378,7 +378,7 @@ uint32 AsScene1201Match::hmIdle(int messageNum, const MessageParam &param, Entit
sendMessage(_parentScene, 0x2001, 0);
messageResult = 1;
break;
- case 0x4806:
+ case NM_KLAYMEN_USE_OBJECT:
setVisible(false);
setGlobalVar(V_MATCH_STATUS, 3);
break;
@@ -459,14 +459,14 @@ void AsScene1201Creature::update() {
uint32 AsScene1201Creature::hmWaiting(int messageNum, const MessageParam &param, Entity *sender) {
uint32 messageResult = Sprite::handleMessage(messageNum, param, sender);
switch (messageNum) {
- case 0x100D:
+ case NM_ANIMATION_START:
if (param.asInteger() == 0x02060018)
playSound(0, 0xCD298116);
break;
case 0x2004:
GotoState(&AsScene1201Creature::stStartReachForTntDummy);
break;
- case 0x2006:
+ case NM_KLAYMEN_STOP_CLIMBING:
GotoState(&AsScene1201Creature::stPincerSnapKlaymen);
break;
}
@@ -476,7 +476,7 @@ uint32 AsScene1201Creature::hmWaiting(int messageNum, const MessageParam &param,
uint32 AsScene1201Creature::hmPincerSnap(int messageNum, const MessageParam &param, Entity *sender) {
uint32 messageResult = hmWaiting(messageNum, param, sender);
switch (messageNum) {
- case 0x3002:
+ case NM_ANIMATION_STOP:
gotoNextState();
break;
}
@@ -486,14 +486,14 @@ uint32 AsScene1201Creature::hmPincerSnap(int messageNum, const MessageParam &par
uint32 AsScene1201Creature::hmPincerSnapKlaymen(int messageNum, const MessageParam &param, Entity *sender) {
uint32 messageResult = Sprite::handleMessage(messageNum, param, sender);
switch (messageNum) {
- case 0x100D:
+ case NM_ANIMATION_START:
if (param.asInteger() == 0x02060018) {
playSound(0, 0xCD298116);
sendMessage(_parentScene, 0x4814, 0);
sendMessage(_klaymen, 0x4814, 0);
}
break;
- case 0x3002:
+ case NM_ANIMATION_STOP:
gotoNextState();
break;
}
@@ -556,7 +556,7 @@ AsScene1201LeftDoor::AsScene1201LeftDoor(NeverhoodEngine *vm, Sprite *klaymen)
uint32 AsScene1201LeftDoor::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
uint32 messageResult = Sprite::handleMessage(messageNum, param, sender);
switch (messageNum) {
- case 0x4809:
+ case NM_KLAYMEN_CLOSE_DOOR:
stCloseDoor();
break;
}
@@ -619,7 +619,7 @@ uint32 AsScene1202TntItem::hmShowIdle(int messageNum, const MessageParam &param,
uint32 AsScene1202TntItem::hmChangePosition(int messageNum, const MessageParam &param, Entity *sender) {
uint32 messageResult = Sprite::handleMessage(messageNum, param, sender);
switch (messageNum) {
- case 0x3002:
+ case NM_ANIMATION_STOP:
gotoNextState();
break;
}
@@ -648,7 +648,7 @@ void AsScene1202TntItem::stChangePositionFadeIn() {
}
void AsScene1202TntItem::stChangePositionDone() {
- sendMessage(_parentScene, 0x2002, _itemIndex);
+ sendMessage(_parentScene, NM_POSITION_CHANGE, _itemIndex);
stShowIdle();
}
@@ -671,13 +671,13 @@ uint32 KmScene1201::xHandleMessage(int messageNum, const MessageParam &param) {
case 0x4800:
startWalkToX(param.asPoint().x, false);
break;
- case 0x4004:
+ case NM_KLAYMEN_STAND_IDLE:
GotoState(&Klaymen::stTryStandIdle);
break;
- case 0x480A:
+ case NM_KLAYMEN_MOVE_OBJECT:
GotoState(&Klaymen::stMoveObject);
break;
- case 0x4812:
+ case NM_KLAYMEN_PICKUP:
GotoState(&Klaymen::stPickUpGeneric);
break;
case 0x4813:
@@ -689,7 +689,7 @@ uint32 KmScene1201::xHandleMessage(int messageNum, const MessageParam &param) {
case 0x4815:
GotoState(&KmScene1201::stCloseEyes);
break;
- case 0x4816:
+ case NM_KLAYMEN_PRESS_BUTTON:
if (param.asInteger() == 0)
GotoState(&Klaymen::stPressButtonSide);
break;
@@ -703,10 +703,10 @@ uint32 KmScene1201::xHandleMessage(int messageNum, const MessageParam &param) {
else
startWalkToAttachedSpriteXDistance(param.asPoint().x);
break;
- case 0x481D:
+ case NM_KLAYMEN_TURN_TO_USE:
GotoState(&Klaymen::stTurnToUse);
break;
- case 0x481E:
+ case NM_KLAYMEN_RETURN_FROM_USE:
GotoState(&Klaymen::stReturnFromUse);
break;
case 0x481F:
@@ -755,7 +755,7 @@ void KmScene1201::stCloseEyes() {
uint32 KmScene1201::hmMatch(int messageNum, const MessageParam &param, Entity *sender) {
uint32 messageResult = Klaymen::hmLowLevelAnimation(messageNum, param, sender);
switch (messageNum) {
- case 0x100D:
+ case NM_ANIMATION_START:
if (param.asInteger() == 0x51281850) {
setGlobalVar(V_TNT_DUMMY_FUSE_LIT, 1);
} else if (param.asInteger() == 0x43000538) {
@@ -798,7 +798,7 @@ void KmScene1201::stLightMatch() {
uint32 KmScene1201::hmTumbleHeadless(int messageNum, const MessageParam &param, Entity *sender) {
uint32 messageResult = Klaymen::hmLowLevelAnimation(messageNum, param, sender);
switch (messageNum) {
- case 0x100D:
+ case NM_ANIMATION_START:
if (param.asInteger() == 0x000F0082) {
playSound(0, 0x74E2810F);
}
diff --git a/engines/neverhood/modules/module1200_sprites.h b/engines/neverhood/modules/module1200_sprites.h
index ef1ec40ced..ae820f0530 100644
--- a/engines/neverhood/modules/module1200_sprites.h
+++ b/engines/neverhood/modules/module1200_sprites.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/neverhood/modules/module1300.cpp b/engines/neverhood/modules/module1300.cpp
index 312fb85ae7..60ff0411a6 100644
--- a/engines/neverhood/modules/module1300.cpp
+++ b/engines/neverhood/modules/module1300.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -350,7 +350,7 @@ Scene1302::Scene1302(NeverhoodEngine *vm, Module *parentModule, int which)
_asVenusFlyTrap = insertSprite<AsScene1002VenusFlyTrap>(this, _klaymen, true);
addCollisionSprite(_asVenusFlyTrap);
- sendEntityMessage(_klaymen, 0x2007, _asVenusFlyTrap);
+ sendEntityMessage(_klaymen, NM_CAR_MOVE_TO_PREV_POINT, _asVenusFlyTrap);
}
@@ -358,10 +358,10 @@ uint32 Scene1302::handleMessage(int messageNum, const MessageParam &param, Entit
uint32 messageResult = 0;
Scene::handleMessage(messageNum, param, sender);
switch (messageNum) {
- case 0x100D:
- if (param.asInteger() == 0x4A845A00)
+ case NM_ANIMATION_START:
+ if (param.asInteger() == 0x4A845A00) {
sendEntityMessage(_klaymen, 0x1014, _asRing1);
- else if (param.asInteger() == 0x43807801) {
+ } else if (param.asInteger() == 0x43807801) {
if (!getGlobalVar(V_FLYTRAP_RING_BRIDGE)) {
sendEntityMessage(_klaymen, 0x1014, _asRing2);
if (_asVenusFlyTrap->getX() - 10 < 218 + 32 && _asVenusFlyTrap->getX() + 10 > 218 + 32)
@@ -371,9 +371,9 @@ uint32 Scene1302::handleMessage(int messageNum, const MessageParam &param, Entit
} else
setMessageList(0x004B0950);
messageResult = 1;
- } else if (param.asInteger() == 0x46C26A01)
+ } else if (param.asInteger() == 0x46C26A01) {
sendEntityMessage(_klaymen, 0x1014, _asRing3);
- else if (param.asInteger() == 0x468C7B11) {
+ } else if (param.asInteger() == 0x468C7B11) {
if (!getGlobalVar(V_FLYTRAP_RING_FENCE)) {
sendEntityMessage(_klaymen, 0x1014, _asRing4);
if (_asVenusFlyTrap->getX() - 10 < 218 + 32 + 32 + 32 && _asVenusFlyTrap->getX() + 10 > 218 + 32 + 32 + 32)
@@ -383,9 +383,9 @@ uint32 Scene1302::handleMessage(int messageNum, const MessageParam &param, Entit
} else
setMessageList(0x004B0950);
messageResult = 1;
- } else if (param.asInteger() == 0x42845B19)
+ } else if (param.asInteger() == 0x42845B19) {
sendEntityMessage(_klaymen, 0x1014, _asRing5);
- else if (param.asInteger() == 0x430A6060) {
+ } else if (param.asInteger() == 0x430A6060) {
if (getGlobalVar(V_FLYTRAP_RING_BRIDGE))
setMessageList2(0x004B0910);
else
@@ -402,66 +402,66 @@ uint32 Scene1302::handleMessage(int messageNum, const MessageParam &param, Entit
setMessageList(0x004B0978);
}
break;
- case 0x2000:
+ case NM_ANIMATION_UPDATE:
if (_klaymen->getY() > 360) {
sendEntityMessage(_klaymen, 0x1014, _asVenusFlyTrap);
setMessageList2(0x004B08F0);
} else
setMessageList2(0x004B0920);
break;
- case 0x2002:
+ case NM_POSITION_CHANGE:
if (_klaymen->getX() > 545)
leaveScene(1);
break;
case 0x2032:
_sprite2->setVisible(true);
break;
- case 0x4806:
+ case NM_KLAYMEN_USE_OBJECT:
sendMessage(_parentModule, 0x1024, 2);
if (sender == _asRing1)
playSound(0, 0x665198C0);
else if (sender == _asRing2) {
- sendMessage(_asBridge, 0x4808, 0);
+ sendMessage(_asBridge, NM_KLAYMEN_OPEN_DOOR, 0);
setGlobalVar(V_FLYTRAP_RING_BRIDGE, 1);
- } else if (sender == _asRing3)
+ } else if (sender == _asRing3) {
playSound(0, 0xE2D389C0);
- else if (sender == _asRing4) {
- sendMessage(_ssFence, 0x4808, 0);
+ } else if (sender == _asRing4) {
+ sendMessage(_ssFence, NM_KLAYMEN_OPEN_DOOR, 0);
setGlobalVar(V_FLYTRAP_RING_FENCE, 1);
} else if (sender == _asRing5)
playSound(0, 0x40428A09);
break;
- case 0x4807:
+ case NM_KLAYMEN_RAISE_LEVER:
if (sender == _asRing2) {
- sendMessage(_asBridge, 0x4809, 0);
+ sendMessage(_asBridge, NM_KLAYMEN_CLOSE_DOOR, 0);
setGlobalVar(V_FLYTRAP_RING_BRIDGE, 0);
_sprite2->setVisible(false);
} else if (sender == _asRing4) {
- sendMessage(_ssFence, 0x4809, 0);
+ sendMessage(_ssFence, NM_KLAYMEN_CLOSE_DOOR, 0);
setGlobalVar(V_FLYTRAP_RING_FENCE, 0);
} else if (sender == _asVenusFlyTrap) {
if (getGlobalVar(V_FLYTRAP_RING_BRIDGE))
- sendMessage(_asRing2, 0x4807, 0);
+ sendMessage(_asRing2, NM_KLAYMEN_RAISE_LEVER, 0);
else
- sendMessage(_asRing4, 0x4807, 0);
+ sendMessage(_asRing4, NM_KLAYMEN_RAISE_LEVER, 0);
}
break;
- case 0x480F:
+ case NM_KLAYMEN_LOWER_LEVER:
if (sender == _asRing2) {
playSound(0, 0x60755842);
- sendMessage(_asBridge, 0x4808, 0);
+ sendMessage(_asBridge, NM_KLAYMEN_OPEN_DOOR, 0);
setGlobalVar(V_FLYTRAP_RING_BRIDGE, 1);
} else if (sender == _asRing4) {
playSound(0, 0x60755842);
- sendMessage(_ssFence, 0x4808, 0);
+ sendMessage(_ssFence, NM_KLAYMEN_OPEN_DOOR, 0);
setGlobalVar(V_FLYTRAP_RING_FENCE, 1);
}
break;
- case 0x482A:
- sendMessage(_asVenusFlyTrap, 0x482B, 0);
+ case NM_MOVE_TO_BACK:
+ sendMessage(_asVenusFlyTrap, NM_MOVE_TO_FRONT, 0);
break;
- case 0x482B:
- sendMessage(_asVenusFlyTrap, 0x482A, 0);
+ case NM_MOVE_TO_FRONT:
+ sendMessage(_asVenusFlyTrap, NM_MOVE_TO_BACK, 0);
break;
case 0x8000:
setSpriteSurfacePriority(_class595, 995);
@@ -500,7 +500,7 @@ Scene1303::Scene1303(NeverhoodEngine *vm, Module *parentModule)
uint32 Scene1303::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
Scene::handleMessage(messageNum, param, sender);
switch (messageNum) {
- case 0x2000:
+ case NM_ANIMATION_UPDATE:
setGlobalVar(V_BALLOON_POPPED, 1);
sendMessage(_asBalloon, 0x2000, 0);
break;
@@ -555,7 +555,7 @@ Scene1304::Scene1304(NeverhoodEngine *vm, Module *parentModule, int which)
uint32 Scene1304::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
Scene::handleMessage(messageNum, param, sender);
switch (messageNum) {
- case 0x100D:
+ case NM_ANIMATION_START:
if (param.asInteger() == 0x415634A4) {
if (getGlobalVar(V_BALLOON_POPPED))
cancelMessageList();
@@ -603,7 +603,7 @@ uint32 Scene1305::handleMessage(int messageNum, const MessageParam &param, Entit
}
Scene1306::Scene1306(NeverhoodEngine *vm, Module *parentModule, int which)
- : Scene(vm, parentModule) {
+ : Scene(vm, parentModule), _asKey(nullptr) {
if (getGlobalVar(V_HAS_FINAL_KEY) && getGlobalVar(V_KEY3_LOCATION) == 0)
setGlobalVar(V_KEY3_LOCATION, 4);
@@ -629,7 +629,7 @@ Scene1306::Scene1306(NeverhoodEngine *vm, Module *parentModule, int which)
insertStaticSprite(0x00042313, 1100);
if (which < 0) {
- // Resoring game
+ // Restoring game
insertKlaymen<KmScene1306>(380, 440);
setMessageList(0x004AFAD0);
sendMessage(this, 0x2000, 0);
@@ -681,9 +681,8 @@ Scene1306::Scene1306(NeverhoodEngine *vm, Module *parentModule, int which)
sendMessage(this, 0x2000, 0);
SetMessageHandler(&Scene1306::handleMessage416EB0);
clearRectList();
- sendMessage(_asElevator, 0x4808, 0);
+ sendMessage(_asElevator, NM_KLAYMEN_OPEN_DOOR, 0);
}
-
}
Scene1306::~Scene1306() {
@@ -693,7 +692,7 @@ Scene1306::~Scene1306() {
uint32 Scene1306::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
Scene::handleMessage(messageNum, param, sender);
switch (messageNum) {
- case 0x100D:
+ case NM_ANIMATION_START:
if (param.asInteger() == 0x402064D8)
sendEntityMessage(_klaymen, 0x1014, _ssButton);
else if (param.asInteger() == 0x01C66840) {
@@ -707,7 +706,7 @@ uint32 Scene1306::handleMessage(int messageNum, const MessageParam &param, Entit
SetMessageHandler(&Scene1306::handleMessage416EB0);
}
break;
- case 0x2000:
+ case NM_ANIMATION_UPDATE:
if (param.asInteger() != 0) {
setRectList(0x004AFD28);
_klaymen->setKlaymenIdleTable3();
@@ -718,7 +717,7 @@ uint32 Scene1306::handleMessage(int messageNum, const MessageParam &param, Entit
break;
case 0x480B:
if (sender == _ssButton)
- sendMessage(_asElevator, 0x4808, 0);
+ sendMessage(_asElevator, NM_KLAYMEN_OPEN_DOOR, 0);
break;
case 0x4826:
if (sender == _asKey) {
@@ -733,12 +732,12 @@ uint32 Scene1306::handleMessage(int messageNum, const MessageParam &param, Entit
}
}
break;
- case 0x482A:
+ case NM_MOVE_TO_BACK:
setSurfacePriority(_asElevator->getSurface(), 1100);
setSurfacePriority(_asElevatorDoor->getSurface(), 1090);
setSurfacePriority(_sprite1->getSurface(), 1080);
break;
- case 0x482B:
+ case NM_MOVE_TO_FRONT:
setSurfacePriority(_asElevator->getSurface(), 100);
setSurfacePriority(_asElevatorDoor->getSurface(), 90);
setSurfacePriority(_sprite1->getSurface(), 80);
@@ -752,19 +751,19 @@ uint32 Scene1306::handleMessage(int messageNum, const MessageParam &param, Entit
uint32 Scene1306::handleMessage416EB0(int messageNum, const MessageParam &param, Entity *sender) {
Scene::handleMessage(messageNum, param, sender);
switch (messageNum) {
- case 0x4808:
+ case NM_KLAYMEN_OPEN_DOOR:
setMessageList(0x004AFBD0);
SetMessageHandler(&Scene1306::handleMessage);
break;
- case 0x4809:
+ case NM_KLAYMEN_CLOSE_DOOR:
leaveScene(1);
break;
- case 0x482A:
+ case NM_MOVE_TO_BACK:
setSurfacePriority(_asElevator->getSurface(), 1100);
setSurfacePriority(_asElevatorDoor->getSurface(), 1090);
setSurfacePriority(_sprite1->getSurface(), 1080);
break;
- case 0x482B:
+ case NM_MOVE_TO_FRONT:
setSurfacePriority(_asElevator->getSurface(), 100);
setSurfacePriority(_asElevatorDoor->getSurface(), 90);
setSurfacePriority(_sprite1->getSurface(), 80);
@@ -840,7 +839,7 @@ uint32 Scene1307::handleMessage(int messageNum, const MessageParam &param, Entit
uint32 messageResult = 0;
Scene::handleMessage(messageNum, param, sender);
switch (messageNum) {
- case 0x0001:
+ case NM_MOUSE_CLICK:
if (!_isPuzzleSolved) {
if (param.asPoint().x > 20 && param.asPoint().x < 620) {
if (_asCurrKey && !_isInsertingKey) {
@@ -873,7 +872,7 @@ uint32 Scene1307::handleMessage(int messageNum, const MessageParam &param, Entit
leaveScene(0);
}
break;
- case 0x2002:
+ case NM_POSITION_CHANGE:
// Check if all keys are in the correct keyholes
if (getSubVar(VA_IS_KEY_INSERTED, 0) && getSubVar(VA_CURR_KEY_SLOT_NUMBERS, 0) == getSubVar(VA_GOOD_KEY_SLOT_NUMBERS, 0) &&
getSubVar(VA_IS_KEY_INSERTED, 1) && getSubVar(VA_CURR_KEY_SLOT_NUMBERS, 1) == getSubVar(VA_GOOD_KEY_SLOT_NUMBERS, 1) &&
@@ -942,6 +941,7 @@ Scene1308::Scene1308(NeverhoodEngine *vm, Module *parentModule, int which)
_sprite2 = insertStaticSprite(0x40043120, 995);
_sprite3 = insertStaticSprite(0x43003100, 995);
_sprite4 = NULL;
+ _sprite5 = nullptr;
if (which < 0) {
// Restoring game
@@ -981,7 +981,7 @@ Scene1308::Scene1308(NeverhoodEngine *vm, Module *parentModule, int which)
// Klaymen entering from the left
insertKlaymen<KmScene1308>(41, 440);
setMessageList(0x004B57D0);
- sendMessage(_asJaggyDoor, 0x4808, 0);
+ sendMessage(_asJaggyDoor, NM_KLAYMEN_OPEN_DOOR, 0);
_sprite1->setVisible(false);
if (getGlobalVar(V_KEYDOOR_UNLOCKED)) {
_sprite4 = insertStaticSprite(0x0101A624, 1100);
@@ -1009,7 +1009,7 @@ Scene1308::Scene1308(NeverhoodEngine *vm, Module *parentModule, int which)
uint32 Scene1308::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
Scene::handleMessage(messageNum, param, sender);
switch (messageNum) {
- case 0x100D:
+ case NM_ANIMATION_START:
if (param.asInteger() == 0x88C11390) {
setRectList(0x004B59A0);
_isProjecting = true;
@@ -1022,12 +1022,12 @@ uint32 Scene1308::handleMessage(int messageNum, const MessageParam &param, Entit
_isProjecting = false;
} else if (param.asInteger() == 0x4AC68808) {
clearRectList();
- sendMessage(_asJaggyDoor, 0x4809, 0);
+ sendMessage(_asJaggyDoor, NM_KLAYMEN_CLOSE_DOOR, 0);
_sprite1->setVisible(false);
_klaymen->setVisible(false);
}
break;
- case 0x1022:
+ case NM_PRIORITY_CHANGE:
if (sender == _asProjector) {
if (param.asInteger() >= 1000)
setSurfacePriority(_sprite3->getSurface(), 1100);
@@ -1035,7 +1035,7 @@ uint32 Scene1308::handleMessage(int messageNum, const MessageParam &param, Entit
setSurfacePriority(_sprite3->getSurface(), 995);
}
break;
- case 0x2000:
+ case NM_ANIMATION_UPDATE:
if (getGlobalVar(V_KEYDOOR_UNLOCKED))
setRectList(0x004B5990);
else
@@ -1056,11 +1056,11 @@ uint32 Scene1308::handleMessage(int messageNum, const MessageParam &param, Entit
_sprite4->setVisible(true);
setRectList(0x004B5990);
break;
- case 0x4807:
+ case NM_KLAYMEN_RAISE_LEVER:
sendMessage(_asLightWallSymbols, 0x2003, 0);
break;
- case 0x480F:
- sendMessage(_asLightWallSymbols, 0x2002, 0);
+ case NM_KLAYMEN_LOWER_LEVER:
+ sendMessage(_asLightWallSymbols, NM_POSITION_CHANGE, 0);
_ssNumber1->setVisible(true);
_ssNumber2->setVisible(true);
_ssNumber3->setVisible(true);
@@ -1141,7 +1141,7 @@ void Scene1317::upChooseKing() {
uint32 Scene1317::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
uint32 messageResult = Scene::handleMessage(messageNum, param, sender);
switch (messageNum) {
- case 0x3002:
+ case NM_ANIMATION_STOP:
stChooseKing();
break;
}
@@ -1151,7 +1151,7 @@ uint32 Scene1317::handleMessage(int messageNum, const MessageParam &param, Entit
uint32 Scene1317::hmChooseKing(int messageNum, const MessageParam &param, Entity *sender) {
uint32 messageResult = Scene::handleMessage(messageNum, param, sender);
switch (messageNum) {
- case 0x0001:
+ case NM_MOUSE_CLICK:
if (param.asPoint().x >= 21 && param.asPoint().y >= 24 &&
param.asPoint().x <= 261 && param.asPoint().y <= 280) {
stHoborgAsKing();
@@ -1170,7 +1170,7 @@ uint32 Scene1317::hmChooseKing(int messageNum, const MessageParam &param, Entity
uint32 Scene1317::hmHoborgAsKing(int messageNum, const MessageParam &param, Entity *sender) {
uint32 messageResult = Scene::handleMessage(messageNum, param, sender);
switch (messageNum) {
- case 0x3002:
+ case NM_ANIMATION_STOP:
stEndMovie();
break;
}
@@ -1180,7 +1180,7 @@ uint32 Scene1317::hmHoborgAsKing(int messageNum, const MessageParam &param, Enti
uint32 Scene1317::hmEndMovie(int messageNum, const MessageParam &param, Entity *sender) {
uint32 messageResult = Scene::handleMessage(messageNum, param, sender);
switch (messageNum) {
- case 0x3002:
+ case NM_ANIMATION_STOP:
leaveScene(0);
break;
}
diff --git a/engines/neverhood/modules/module1300.h b/engines/neverhood/modules/module1300.h
index 2f59ff16c2..4a0ca6c062 100644
--- a/engines/neverhood/modules/module1300.h
+++ b/engines/neverhood/modules/module1300.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/neverhood/modules/module1300_sprites.cpp b/engines/neverhood/modules/module1300_sprites.cpp
index a65f2363a3..b4b42198e1 100644
--- a/engines/neverhood/modules/module1300_sprites.cpp
+++ b/engines/neverhood/modules/module1300_sprites.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -46,13 +46,13 @@ AsScene1302Bridge::AsScene1302Bridge(NeverhoodEngine *vm, Scene *parentScene)
uint32 AsScene1302Bridge::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
uint32 messageResult = Sprite::handleMessage(messageNum, param, sender);
switch (messageNum) {
- case 0x3002:
+ case NM_ANIMATION_STOP:
gotoNextState();
break;
- case 0x4808:
+ case NM_KLAYMEN_OPEN_DOOR:
stLowerBridge();
break;
- case 0x4809:
+ case NM_KLAYMEN_CLOSE_DOOR:
stRaiseBridge();
break;
}
@@ -99,12 +99,12 @@ void SsScene1302Fence::update() {
uint32 SsScene1302Fence::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
uint32 messageResult = Sprite::handleMessage(messageNum, param, sender);
switch (messageNum) {
- case 0x4808:
+ case NM_KLAYMEN_OPEN_DOOR:
playSound(0);
SetMessageHandler(NULL);
SetSpriteUpdate(&SsScene1302Fence::suMoveDown);
break;
- case 0x4809:
+ case NM_KLAYMEN_CLOSE_DOOR:
playSound(1);
SetMessageHandler(NULL);
SetSpriteUpdate(&SsScene1302Fence::suMoveUp);
@@ -150,7 +150,7 @@ uint32 AsScene1303Balloon::handleMessage(int messageNum, const MessageParam &par
sendMessage(_parentScene, 0x4826, 0);
messageResult = 1;
break;
- case 0x2000:
+ case NM_ANIMATION_UPDATE:
stPopBalloon();
break;
}
@@ -160,11 +160,11 @@ uint32 AsScene1303Balloon::handleMessage(int messageNum, const MessageParam &par
uint32 AsScene1303Balloon::hmBalloonPopped(int messageNum, const MessageParam &param, Entity *sender) {
uint32 messageResult = Sprite::handleMessage(messageNum, param, sender);
switch (messageNum) {
- case 0x100D:
+ case NM_ANIMATION_START:
if (param.asInteger() == 0x020B0003)
playSound(0, 0x742B0055);
break;
- case 0x3002:
+ case NM_ANIMATION_STOP:
playSound(0, 0x470007EE);
stopAnimation();
setVisible(false);
@@ -193,7 +193,7 @@ uint32 AsScene1304Needle::handleMessage(int messageNum, const MessageParam &para
sendMessage(_parentScene, 0x4826, 0);
messageResult = 1;
break;
- case 0x4806:
+ case NM_KLAYMEN_USE_OBJECT:
setGlobalVar(V_HAS_NEEDLE, 1);
setVisible(false);
SetMessageHandler(NULL);
@@ -241,10 +241,10 @@ uint32 AsScene1306Elevator::handleMessage(int messageNum, const MessageParam &pa
_countdown = 144;
messageResult = _isUp ? 1 : 0;
break;
- case 0x3002:
+ case NM_ANIMATION_STOP:
gotoNextState();
break;
- case 0x4808:
+ case NM_KLAYMEN_OPEN_DOOR:
if (_isDown)
stGoingUp();
break;
@@ -262,7 +262,7 @@ void AsScene1306Elevator::stGoingUp() {
}
void AsScene1306Elevator::cbGoingUpEvent() {
- sendMessage(_parentScene, 0x4808, 0);
+ sendMessage(_parentScene, NM_KLAYMEN_OPEN_DOOR, 0);
_isUp = true;
_countdown = 144;
stopAnimation();
@@ -282,7 +282,7 @@ void AsScene1306Elevator::stGoingDown() {
void AsScene1306Elevator::cbGoingDownEvent() {
_isDown = true;
- sendMessage(_parentScene, 0x4809, 0);
+ sendMessage(_parentScene, NM_KLAYMEN_CLOSE_DOOR, 0);
stopAnimation();
SetUpdateHandler(&AsScene1306Elevator::update);
}
@@ -361,7 +361,7 @@ uint32 AsScene1307Key::handleMessage(int messageNum, const MessageParam &param,
messageResult = 1;
}
break;
- case 0x2000:
+ case NM_ANIMATION_UPDATE:
_isClickable = param.asInteger() != 0;
break;
case 0x2001:
@@ -401,7 +401,7 @@ void AsScene1307Key::suInsertKey() {
playSound(0);
} else {
SetSpriteUpdate(NULL);
- sendMessage(_parentScene, 0x2002, 0);
+ sendMessage(_parentScene, NM_POSITION_CHANGE, 0);
}
}
@@ -430,7 +430,7 @@ void AsScene1307Key::stRemoveKey() {
void AsScene1307Key::stInsertKey() {
_pointIndex = 0;
- sendMessage(_parentScene, 0x1022, kAsScene1307KeySurfacePriorities[getSubVar(VA_CURR_KEY_SLOT_NUMBERS, _keyIndex) % 4]);
+ sendMessage(_parentScene, NM_PRIORITY_CHANGE, kAsScene1307KeySurfacePriorities[getSubVar(VA_CURR_KEY_SLOT_NUMBERS, _keyIndex) % 4]);
setClipRect(_clipRects[getSubVar(VA_CURR_KEY_SLOT_NUMBERS, _keyIndex) % 4]);
_newStickFrameIndex = STICK_LAST_FRAME;
SetSpriteUpdate(&AsScene1307Key::suInsertKey);
@@ -440,7 +440,7 @@ void AsScene1307Key::stMoveKey() {
NPoint pt = (*_pointList)[getSubVar(VA_CURR_KEY_SLOT_NUMBERS, _keyIndex)];
int16 newX = pt.x + kAsScene1307KeyXDelta;
int16 newY = pt.y + kAsScene1307KeyYDelta;
- sendMessage(_parentScene, 0x1022, 1000);
+ sendMessage(_parentScene, NM_PRIORITY_CHANGE, 1000);
setClipRect(0, 0, 640, 480);
_prevX = _x;
_prevY = _y;
@@ -480,13 +480,13 @@ AsScene1308JaggyDoor::AsScene1308JaggyDoor(NeverhoodEngine *vm, Scene *parentSce
uint32 AsScene1308JaggyDoor::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
uint32 messageResult = Sprite::handleMessage(messageNum, param, sender);
switch (messageNum) {
- case 0x3002:
+ case NM_ANIMATION_STOP:
gotoNextState();
break;
- case 0x4808:
+ case NM_KLAYMEN_OPEN_DOOR:
stOpenDoor();
break;
- case 0x4809:
+ case NM_KLAYMEN_CLOSE_DOOR:
stCloseDoor();
break;
}
@@ -530,7 +530,7 @@ AsScene1308KeyboardDoor::AsScene1308KeyboardDoor(NeverhoodEngine *vm, Scene *par
uint32 AsScene1308KeyboardDoor::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
uint32 messageResult = Sprite::handleMessage(messageNum, param, sender);
switch (messageNum) {
- case 0x3002:
+ case NM_ANIMATION_STOP:
gotoNextState();
break;
}
@@ -562,13 +562,13 @@ AsScene1308LightWallSymbols::AsScene1308LightWallSymbols(NeverhoodEngine *vm, Sc
uint32 AsScene1308LightWallSymbols::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
uint32 messageResult = Sprite::handleMessage(messageNum, param, sender);
switch (messageNum) {
- case 0x2002:
+ case NM_POSITION_CHANGE:
stFadeIn();
break;
case 0x2003:
stFadeOut();
break;
- case 0x3002:
+ case NM_ANIMATION_STOP:
gotoNextState();
break;
}
@@ -615,7 +615,7 @@ AsScene1308Mouse::AsScene1308Mouse(NeverhoodEngine *vm)
uint32 AsScene1308Mouse::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
uint32 messageResult = Sprite::handleMessage(messageNum, param, sender);
switch (messageNum) {
- case 0x100D:
+ case NM_ANIMATION_START:
if (param.asInteger() == 0x66382026)
playSound(0, 0x0CD84468);
else if (param.asInteger() == 0x6E28061C)
@@ -660,10 +660,10 @@ uint32 KmScene1304::xHandleMessage(int messageNum, const MessageParam &param) {
case 0x4800:
startWalkToX(param.asPoint().x, false);
break;
- case 0x4004:
+ case NM_KLAYMEN_STAND_IDLE:
GotoState(&Klaymen::stTryStandIdle);
break;
- case 0x4812:
+ case NM_KLAYMEN_PICKUP:
if (param.asInteger() == 2)
GotoState(&Klaymen::stPickUpNeedle);
else if (param.asInteger() == 1)
@@ -711,7 +711,7 @@ uint32 KmScene1305::xHandleMessage(int messageNum, const MessageParam &param) {
case 0x4800:
startWalkToX(param.asPoint().x, false);
break;
- case 0x4004:
+ case NM_KLAYMEN_STAND_IDLE:
GotoState(&Klaymen::stTryStandIdle);
break;
case 0x4804:
@@ -750,7 +750,7 @@ KmScene1306::KmScene1306(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16
uint32 KmScene1306::xHandleMessage(int messageNum, const MessageParam &param) {
uint32 messageResult = 0;
switch (messageNum) {
- case 0x2000:
+ case NM_ANIMATION_UPDATE:
_isSittingInTeleporter = param.asInteger() != 0;
messageResult = 1;
break;
@@ -758,13 +758,13 @@ uint32 KmScene1306::xHandleMessage(int messageNum, const MessageParam &param) {
case 0x4800:
startWalkToX(param.asPoint().x, false);
break;
- case 0x4004:
+ case NM_KLAYMEN_STAND_IDLE:
if (_isSittingInTeleporter)
GotoState(&Klaymen::stSitIdleTeleporter);
else
GotoState(&Klaymen::stTryStandIdle);
break;
- case 0x4812:
+ case NM_KLAYMEN_PICKUP:
if (param.asInteger() == 2)
GotoState(&Klaymen::stPickUpNeedle);
else if (param.asInteger() == 1)
@@ -772,7 +772,7 @@ uint32 KmScene1306::xHandleMessage(int messageNum, const MessageParam &param) {
else
GotoState(&Klaymen::stPickUpGeneric);
break;
- case 0x4816:
+ case NM_KLAYMEN_PRESS_BUTTON:
if (param.asInteger() == 1)
GotoState(&Klaymen::stPressButton);
else if (param.asInteger() == 2)
@@ -784,7 +784,7 @@ uint32 KmScene1306::xHandleMessage(int messageNum, const MessageParam &param) {
setDoDeltaX(param.asInteger());
gotoNextStateExt();
break;
- case 0x481A:
+ case NM_KLAYMEN_INSERT_DISK:
GotoState(&Klaymen::stInsertDisk);
break;
case 0x481B:
@@ -793,13 +793,13 @@ uint32 KmScene1306::xHandleMessage(int messageNum, const MessageParam &param) {
else
startWalkToAttachedSpriteXDistance(param.asPoint().x);
break;
- case 0x481D:
+ case NM_KLAYMEN_TURN_TO_USE:
if (_isSittingInTeleporter)
GotoState(&Klaymen::stTurnToUseInTeleporter);
else
GotoState(&Klaymen::stTurnToUse);
break;
- case 0x481E:
+ case NM_KLAYMEN_RETURN_FROM_USE:
if (_isSittingInTeleporter)
GotoState(&Klaymen::stReturnFromUseInTeleporter);
else
@@ -874,10 +874,10 @@ uint32 KmScene1308::xHandleMessage(int messageNum, const MessageParam &param) {
case 0x4800:
startWalkToX(param.asPoint().x, false);
break;
- case 0x4004:
+ case NM_KLAYMEN_STAND_IDLE:
GotoState(&Klaymen::stTryStandIdle);
break;
- case 0x480A:
+ case NM_KLAYMEN_MOVE_OBJECT:
if (param.asInteger() == 1)
GotoState(&Klaymen::stMoveObjectSkipTurnFaceObject);
else
@@ -886,7 +886,7 @@ uint32 KmScene1308::xHandleMessage(int messageNum, const MessageParam &param) {
case 0x480D:
GotoState(&Klaymen::stUseLever);
break;
- case 0x4812:
+ case NM_KLAYMEN_PICKUP:
if (param.asInteger() == 2)
GotoState(&Klaymen::stPickUpNeedle);
else if (param.asInteger() == 1)
@@ -898,7 +898,7 @@ uint32 KmScene1308::xHandleMessage(int messageNum, const MessageParam &param) {
setDoDeltaX(param.asInteger());
gotoNextStateExt();
break;
- case 0x481A:
+ case NM_KLAYMEN_INSERT_DISK:
if (param.asInteger() == 1)
GotoState(&Klaymen::stInsertKey);
else
@@ -910,13 +910,13 @@ uint32 KmScene1308::xHandleMessage(int messageNum, const MessageParam &param) {
else
startWalkToAttachedSpriteXDistance(param.asPoint().x);
break;
- case 0x481D:
+ case NM_KLAYMEN_TURN_TO_USE:
GotoState(&Klaymen::stTurnToUse);
break;
- case 0x481E:
+ case NM_KLAYMEN_RETURN_FROM_USE:
GotoState(&Klaymen::stReturnFromUse);
break;
- case 0x4827:
+ case NM_KLAYMEN_RELEASE_LEVER:
GotoState(&Klaymen::stReleaseLever);
break;
case 0x4834:
diff --git a/engines/neverhood/modules/module1300_sprites.h b/engines/neverhood/modules/module1300_sprites.h
index e044d3cec8..6f4faaa234 100644
--- a/engines/neverhood/modules/module1300_sprites.h
+++ b/engines/neverhood/modules/module1300_sprites.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/neverhood/modules/module1400.cpp b/engines/neverhood/modules/module1400.cpp
index 2fc1052ab1..551b6874ff 100644
--- a/engines/neverhood/modules/module1400.cpp
+++ b/engines/neverhood/modules/module1400.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -207,7 +207,7 @@ Scene1401::Scene1401(NeverhoodEngine *vm, Module *parentModule, int which)
_klaymen->setClipRect(_sprite3->getDrawRect().x, 0, 640, 480);
if (which == 0 && _asProjector)
- sendMessage(_asProjector, 0x482B, 0);
+ sendMessage(_asProjector, NM_MOVE_TO_FRONT, 0);
_asBackDoor = insertSprite<AsScene1401BackDoor>(_klaymen, which == 0);
@@ -225,7 +225,7 @@ void Scene1401::update() {
uint32 Scene1401::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
Scene::handleMessage(messageNum, param, sender);
switch (messageNum) {
- case 0x100D:
+ case NM_ANIMATION_START:
if (param.asInteger() == 0x02144CB1)
sendEntityMessage(_klaymen, 0x1014, _ssFloorButton);
else if (param.asInteger() == 0x402064D8)
@@ -237,7 +237,7 @@ uint32 Scene1401::handleMessage(int messageNum, const MessageParam &param, Entit
setMessageList(0x004B66B0);
}
break;
- case 0x1019:
+ case NM_SCENE_LEAVE:
if (param.asInteger() != 0)
leaveScene(2);
else
@@ -254,7 +254,7 @@ uint32 Scene1401::handleMessage(int messageNum, const MessageParam &param, Entit
if (_asProjector && _asProjector->getX() > 404 && _asProjector->getX() < 504)
sendMessage(_asProjector , 0x4839, 0);
} else if (sender == _ssButton)
- sendMessage(_asBackDoor, 0x4808, 0);
+ sendMessage(_asBackDoor, NM_KLAYMEN_OPEN_DOOR, 0);
break;
case 0x4826:
if (sender == _asProjector) {
@@ -265,15 +265,15 @@ uint32 Scene1401::handleMessage(int messageNum, const MessageParam &param, Entit
setMessageList2(0x004B65F0);
}
break;
- case 0x482A:
+ case NM_MOVE_TO_BACK:
_sprite1->setVisible(true);
if (_asProjector)
- sendMessage(_asProjector, 0x482B, 0);
+ sendMessage(_asProjector, NM_MOVE_TO_FRONT, 0);
break;
- case 0x482B:
+ case NM_MOVE_TO_FRONT:
_sprite1->setVisible(false);
if (_asProjector)
- sendMessage(_asProjector, 0x482A, 0);
+ sendMessage(_asProjector, NM_MOVE_TO_BACK, 0);
break;
}
return 0;
@@ -375,7 +375,7 @@ void Scene1402::upShaking() {
uint32 Scene1402::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
Scene::handleMessage(messageNum, param, sender);
switch (messageNum) {
- case 0x100D:
+ case NM_ANIMATION_START:
if (param.asInteger() == 0x00F43389) {
if (getGlobalVar(V_MOUSE_PUZZLE_SOLVED))
leaveScene(0);
@@ -383,18 +383,18 @@ uint32 Scene1402::handleMessage(int messageNum, const MessageParam &param, Entit
clearRectList();
_klaymen->setVisible(false);
showMouse(false);
- sendMessage(_asPuzzleBox, 0x2002, 0);
+ sendMessage(_asPuzzleBox, NM_POSITION_CHANGE, 0);
startShaking();
}
}
break;
- case 0x1019:
+ case NM_SCENE_LEAVE:
if (param.asInteger())
leaveScene(0);
else
leaveScene(1);
break;
- case 0x2000:
+ case NM_ANIMATION_UPDATE:
stopShaking();
showMouse(true);
setRectList(0x004B0C48);
@@ -455,7 +455,7 @@ void Scene1407::update() {
uint32 Scene1407::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
Scene::handleMessage(messageNum, param, sender);
switch (messageNum) {
- case 0x0001:
+ case NM_MOUSE_CLICK:
if (_puzzleSolvedCountdown == 0) {
if (param.asPoint().x <= 20 || param.asPoint().x >= 620) {
// Exit scene
@@ -473,7 +473,7 @@ uint32 Scene1407::handleMessage(int messageNum, const MessageParam &param, Entit
}
}
break;
- case 0x2000:
+ case NM_ANIMATION_UPDATE:
// The mouse got the cheese (nomnom)
setGlobalVar(V_MOUSE_PUZZLE_SOLVED, 1);
playSound(0, 0x68E25540);
@@ -534,7 +534,7 @@ Scene1403::Scene1403(NeverhoodEngine *vm, Module *parentModule, int which)
uint32 Scene1403::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
Scene::handleMessage(messageNum, param, sender);
switch (messageNum) {
- case 0x100D:
+ case NM_ANIMATION_START:
if (param.asInteger() == 0x88C11390) {
setRectList(0x004B2008);
_isProjecting = true;
@@ -544,10 +544,10 @@ uint32 Scene1403::handleMessage(int messageNum, const MessageParam &param, Entit
_isProjecting = false;
}
break;
- case 0x1019:
+ case NM_SCENE_LEAVE:
leaveScene(0);
break;
- case 0x1022:
+ case NM_PRIORITY_CHANGE:
if (sender == _asProjector) {
if (param.asInteger() >= 1000)
setSurfacePriority(_sprite3->getSurface(), 1100);
@@ -555,10 +555,10 @@ uint32 Scene1403::handleMessage(int messageNum, const MessageParam &param, Entit
setSurfacePriority(_sprite3->getSurface(), 995);
}
break;
- case 0x4807:
+ case NM_KLAYMEN_RAISE_LEVER:
_sprite1->setVisible(false);
break;
- case 0x480F:
+ case NM_KLAYMEN_LOWER_LEVER:
_sprite1->setVisible(true);
break;
case 0x4826:
@@ -655,7 +655,7 @@ Scene1404::~Scene1404() {
uint32 Scene1404::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
Scene::handleMessage(messageNum, param, sender);
switch (messageNum) {
- case 0x100D:
+ case NM_ANIMATION_START:
if (param.asInteger() == 0x410650C2) {
if (_asProjector && _asProjector->getX() == 220)
setMessageList(0x004B8C40);
@@ -663,7 +663,7 @@ uint32 Scene1404::handleMessage(int messageNum, const MessageParam &param, Entit
setMessageList(0x004B8CE8);
}
break;
- case 0x1019:
+ case NM_SCENE_LEAVE:
leaveScene(0);
break;
case 0x4826:
@@ -725,11 +725,11 @@ void Scene1405::update() {
uint32 Scene1405::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
Scene::handleMessage(messageNum, param, sender);
switch (messageNum) {
- case 0x0001:
+ case NM_MOUSE_CLICK:
if (param.asPoint().x <= 20 || param.asPoint().x >= 620)
leaveScene(0);
break;
- case 0x2000:
+ case NM_ANIMATION_UPDATE:
if (_selectFirstTile) {
_firstTileIndex = param.asInteger();
_selectFirstTile = false;
diff --git a/engines/neverhood/modules/module1400.h b/engines/neverhood/modules/module1400.h
index 53ad7125ab..52f72db6d3 100644
--- a/engines/neverhood/modules/module1400.h
+++ b/engines/neverhood/modules/module1400.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/neverhood/modules/module1400_sprites.cpp b/engines/neverhood/modules/module1400_sprites.cpp
index c0ab73c93d..30a5c340c9 100644
--- a/engines/neverhood/modules/module1400_sprites.cpp
+++ b/engines/neverhood/modules/module1400_sprites.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -59,11 +59,11 @@ void AsScene1401Pipe::upSuckInProjector() {
uint32 AsScene1401Pipe::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
uint32 messageResult = Sprite::handleMessage(messageNum, param, sender);
switch (messageNum) {
- case 0x100D:
+ case NM_ANIMATION_START:
if (param.asInteger() == 0x0A8A1490)
playSound(1, 0x6AB6666F);
break;
- case 0x2000:
+ case NM_ANIMATION_UPDATE:
_countdown1 = 70;
_countdown2 = 8;
stStartSucking();
@@ -78,7 +78,7 @@ uint32 AsScene1401Pipe::handleMessage(int messageNum, const MessageParam &param,
uint32 AsScene1401Pipe::hmSuckInProjector(int messageNum, const MessageParam &param, Entity *sender) {
uint32 messageResult = Sprite::handleMessage(messageNum, param, sender);
switch (messageNum) {
- case 0x3002:
+ case NM_ANIMATION_STOP:
if (_countdown1 != 0)
stStartSucking();
else
@@ -121,7 +121,7 @@ AsScene1401Mouse::AsScene1401Mouse(NeverhoodEngine *vm)
uint32 AsScene1401Mouse::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
uint32 messageResult = Sprite::handleMessage(messageNum, param, sender);
switch (messageNum) {
- case 0x100D:
+ case NM_ANIMATION_START:
if (param.asInteger() == 0x66382026)
playSound(0, 0x0CD84468);
else if (param.asInteger() == 0x6E28061C)
@@ -222,10 +222,10 @@ uint32 AsScene1401BackDoor::handleMessage(int messageNum, const MessageParam &pa
_countdown = 168;
messageResult = _isOpen ? 1 : 0;
break;
- case 0x3002:
+ case NM_ANIMATION_STOP:
gotoNextState();
break;
- case 0x4808:
+ case NM_KLAYMEN_OPEN_DOOR:
_countdown = 168;
if (!_isOpen)
stOpenDoor();
@@ -292,7 +292,7 @@ uint32 AsCommonProjector::handleMessage(int messageNum, const MessageParam &para
sendMessage(_parentScene, 0x4826, 0);
messageResult = 1;
break;
- case 0x4807:
+ case NM_KLAYMEN_RAISE_LEVER:
setGlobalVar(V_PROJECTOR_SLOT, (_x - _asProjectorItem->point.x) / 108);
if ((int8)getGlobalVar(V_PROJECTOR_SLOT) == _asProjectorItem->lockSlotIndex)
stStartLockedInSlot();
@@ -314,11 +314,11 @@ uint32 AsCommonProjector::handleMessage(int messageNum, const MessageParam &para
else
messageResult = getGlobalVar(V_PROJECTOR_SLOT) > 0 ? 1 : 0;
break;
- case 0x482A:
- sendMessage(_parentScene, 0x1022, 990);
+ case NM_MOVE_TO_BACK:
+ sendMessage(_parentScene, NM_PRIORITY_CHANGE, 990);
break;
- case 0x482B:
- sendMessage(_parentScene, 0x1022, 1010);
+ case NM_MOVE_TO_FRONT:
+ sendMessage(_parentScene, NM_PRIORITY_CHANGE, 1010);
break;
case 0x4839:
stStartSuckedIn();
@@ -338,8 +338,8 @@ uint32 AsCommonProjector::hmLockedInSlot(int messageNum, const MessageParam &par
sendMessage(_parentScene, 0x4826, 0);
messageResult = 1;
break;
- case 0x4807:
- sendMessage(_parentScene, 0x4807, 0);
+ case NM_KLAYMEN_RAISE_LEVER:
+ sendMessage(_parentScene, NM_KLAYMEN_RAISE_LEVER, 0);
stStopProjecting();
break;
case 0x480B:
@@ -357,14 +357,14 @@ uint32 AsCommonProjector::hmLockedInSlot(int messageNum, const MessageParam &par
else
messageResult = getGlobalVar(V_PROJECTOR_SLOT) > 0 ? 1 : 0;
break;
- case 0x480F:
+ case NM_KLAYMEN_LOWER_LEVER:
stStartProjecting();
break;
- case 0x482A:
- sendMessage(_parentScene, 0x1022, 990);
+ case NM_MOVE_TO_BACK:
+ sendMessage(_parentScene, NM_PRIORITY_CHANGE, 990);
break;
- case 0x482B:
- sendMessage(_parentScene, 0x1022, 1010);
+ case NM_MOVE_TO_FRONT:
+ sendMessage(_parentScene, NM_PRIORITY_CHANGE, 1010);
break;
}
return messageResult;
@@ -373,7 +373,7 @@ uint32 AsCommonProjector::hmLockedInSlot(int messageNum, const MessageParam &par
uint32 AsCommonProjector::hmAnimation(int messageNum, const MessageParam &param, Entity *sender) {
uint32 messageResult = Sprite::handleMessage(messageNum, param, sender);
switch (messageNum) {
- case 0x3002:
+ case NM_ANIMATION_STOP:
gotoNextState();
break;
}
@@ -388,11 +388,11 @@ void AsCommonProjector::suMoving() {
moveProjector();
if (_beforeMoveX == _x) {
if (getGlobalVar(V_PROJECTOR_SLOT) == 0 && _asProjectorItem->leftBorderLeaves != 0) {
- sendMessage(_parentScene, 0x1019, 0);
+ sendMessage(_parentScene, NM_SCENE_LEAVE, 0);
incGlobalVar(V_PROJECTOR_LOCATION, -1);
setGlobalVar(V_PROJECTOR_SLOT, kAsCommonProjectorItems[getGlobalVar(V_PROJECTOR_LOCATION)].maxSlotCount);
} else if ((int8)getGlobalVar(V_PROJECTOR_SLOT) == _asProjectorItem->maxSlotCount && _asProjectorItem->rightBorderLeaves != 0) {
- sendMessage(_parentScene, 0x1019, 1);
+ sendMessage(_parentScene, NM_SCENE_LEAVE, 1);
incGlobalVar(V_PROJECTOR_LOCATION, +1);
setGlobalVar(V_PROJECTOR_SLOT, 0);
}
@@ -481,7 +481,7 @@ void AsCommonProjector::stStartProjecting() {
}
void AsCommonProjector::stLockedInSlot() {
- sendMessage(_parentScene, 0x480F, 0);
+ sendMessage(_parentScene, NM_KLAYMEN_LOWER_LEVER, 0);
startAnimation(0xD833207F, 0, -1);
SetMessageHandler(&AsCommonProjector::hmLockedInSlot);
SetSpriteUpdate(NULL);
@@ -553,13 +553,13 @@ AsScene1402PuzzleBox::AsScene1402PuzzleBox(NeverhoodEngine *vm, Scene *parentSce
uint32 AsScene1402PuzzleBox::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
uint32 messageResult = Sprite::handleMessage(messageNum, param, sender);
switch (messageNum) {
- case 0x2002:
+ case NM_POSITION_CHANGE:
playSound(1);
startAnimation(0x20060259, -1, -1);
_playBackwards = true;
NextState(&AsScene1402PuzzleBox::stMoveDownDone);
break;
- case 0x3002:
+ case NM_ANIMATION_STOP:
gotoNextState();
break;
}
@@ -691,7 +691,7 @@ void AsScene1407Mouse::suWalkTo() {
xdelta = -_deltaX;
_deltaX = 0;
if (_walkDestX == _x)
- sendMessage(this, 0x1019, 0);
+ sendMessage(this, NM_SCENE_LEAVE, 0);
else {
_x += xdelta;
updateBounds();
@@ -709,7 +709,7 @@ void AsScene1407Mouse::upGoThroughHole() {
uint32 AsScene1407Mouse::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
uint32 messageResult = Sprite::handleMessage(messageNum, param, sender);
switch (messageNum) {
- case 0x0001:
+ case NM_MOUSE_CLICK:
{
int16 mouseX = param.asPoint().x;
int16 mouseY = param.asPoint().y;
@@ -735,7 +735,7 @@ uint32 AsScene1407Mouse::handleMessage(int messageNum, const MessageParam &param
}
}
break;
- case 0x1019:
+ case NM_SCENE_LEAVE:
gotoNextState();
break;
case 0x2001:
@@ -893,16 +893,16 @@ uint32 KmScene1401::xHandleMessage(int messageNum, const MessageParam &param) {
case 0x4800:
startWalkToX(param.asPoint().x, false);
break;
- case 0x4004:
+ case NM_KLAYMEN_STAND_IDLE:
GotoState(&Klaymen::stTryStandIdle);
break;
- case 0x480A:
+ case NM_KLAYMEN_MOVE_OBJECT:
if (param.asInteger() == 1)
GotoState(&Klaymen::stMoveObjectSkipTurnFaceObject);
else
GotoState(&Klaymen::stMoveObjectFaceObject);
break;
- case 0x4816:
+ case NM_KLAYMEN_PRESS_BUTTON:
if (param.asInteger() == 1)
GotoState(&Klaymen::stPressButton);
else if (param.asInteger() == 2)
@@ -960,10 +960,10 @@ uint32 KmScene1402::xHandleMessage(int messageNum, const MessageParam &param) {
case 0x4800:
startWalkToX(param.asPoint().x, false);
break;
- case 0x4004:
+ case NM_KLAYMEN_STAND_IDLE:
GotoState(&Klaymen::stTryStandIdle);
break;
- case 0x480A:
+ case NM_KLAYMEN_MOVE_OBJECT:
if (param.asInteger() == 1)
GotoState(&Klaymen::stMoveObjectSkipTurnFaceObject);
else
@@ -979,10 +979,10 @@ uint32 KmScene1402::xHandleMessage(int messageNum, const MessageParam &param) {
else
startWalkToAttachedSpriteXDistance(param.asPoint().x);
break;
- case 0x481D:
+ case NM_KLAYMEN_TURN_TO_USE:
GotoState(&Klaymen::stTurnToUse);
break;
- case 0x481E:
+ case NM_KLAYMEN_RETURN_FROM_USE:
GotoState(&Klaymen::stReturnFromUse);
break;
}
@@ -1007,10 +1007,10 @@ uint32 KmScene1403::xHandleMessage(int messageNum, const MessageParam &param) {
case 0x4800:
startWalkToX(param.asPoint().x, false);
break;
- case 0x4004:
+ case NM_KLAYMEN_STAND_IDLE:
GotoState(&Klaymen::stTryStandIdle);
break;
- case 0x480A:
+ case NM_KLAYMEN_MOVE_OBJECT:
if (param.asInteger() == 1)
GotoState(&Klaymen::stMoveObjectSkipTurnFaceObject);
else
@@ -1019,7 +1019,7 @@ uint32 KmScene1403::xHandleMessage(int messageNum, const MessageParam &param) {
case 0x480D:
GotoState(&Klaymen::stUseLever);
break;
- case 0x4812:
+ case NM_KLAYMEN_PICKUP:
if (param.asInteger() == 2)
GotoState(&Klaymen::stPickUpNeedle);
else if (param.asInteger() == 1)
@@ -1037,7 +1037,7 @@ uint32 KmScene1403::xHandleMessage(int messageNum, const MessageParam &param) {
else
startWalkToAttachedSpriteXDistance(param.asPoint().x);
break;
- case 0x4827:
+ case NM_KLAYMEN_RELEASE_LEVER:
GotoState(&Klaymen::stReleaseLever);
break;
case 0x483F:
@@ -1064,16 +1064,16 @@ uint32 KmScene1404::xHandleMessage(int messageNum, const MessageParam &param) {
case 0x4800:
startWalkToX(param.asPoint().x, false);
break;
- case 0x4004:
+ case NM_KLAYMEN_STAND_IDLE:
GotoState(&Klaymen::stTryStandIdle);
break;
- case 0x480A:
+ case NM_KLAYMEN_MOVE_OBJECT:
if (param.asInteger() == 1)
GotoState(&Klaymen::stMoveObjectSkipTurnFaceObject);
else
GotoState(&Klaymen::stMoveObjectFaceObject);
break;
- case 0x4812:
+ case NM_KLAYMEN_PICKUP:
if (param.asInteger() == 2)
GotoState(&Klaymen::stPickUpNeedle);
else if (param.asInteger() == 1)
@@ -1085,7 +1085,7 @@ uint32 KmScene1404::xHandleMessage(int messageNum, const MessageParam &param) {
setDoDeltaX(param.asInteger());
gotoNextStateExt();
break;
- case 0x481A:
+ case NM_KLAYMEN_INSERT_DISK:
GotoState(&Klaymen::stInsertDisk);
break;
case 0x481B:
@@ -1094,10 +1094,10 @@ uint32 KmScene1404::xHandleMessage(int messageNum, const MessageParam &param) {
else
startWalkToAttachedSpriteXDistance(param.asPoint().x);
break;
- case 0x481D:
+ case NM_KLAYMEN_TURN_TO_USE:
GotoState(&Klaymen::stTurnToUse);
break;
- case 0x481E:
+ case NM_KLAYMEN_RETURN_FROM_USE:
GotoState(&Klaymen::stReturnFromUse);
break;
case 0x481F:
diff --git a/engines/neverhood/modules/module1400_sprites.h b/engines/neverhood/modules/module1400_sprites.h
index 49b91fe0cf..fe0db66d27 100644
--- a/engines/neverhood/modules/module1400_sprites.h
+++ b/engines/neverhood/modules/module1400_sprites.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/neverhood/modules/module1500.cpp b/engines/neverhood/modules/module1500.cpp
index 3ce9783b69..8e51b1aff5 100644
--- a/engines/neverhood/modules/module1500.cpp
+++ b/engines/neverhood/modules/module1500.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -102,11 +102,11 @@ void Scene1501::update() {
Scene::update();
if (_countdown1 != 0) {
_countdown1--;
- if (_countdown1 == 0) {
+ if (_countdown1 == 0 || _skip) {
_vm->_screen->clear();
leaveScene(0);
}
- } else if ((_countdown2 != 0 && (--_countdown2 == 0)) || (_countdown2 == 0 && !isSoundPlaying(0))) {
+ } else if ((_countdown2 != 0 && (--_countdown2 == 0)) || (_countdown2 == 0 && !isSoundPlaying(0)) || _skip) {
_countdown1 = 12;
_palette->startFadeToBlack(11);
}
@@ -124,7 +124,7 @@ void Scene1501::update() {
uint32 Scene1501::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
uint32 messageResult = Scene::handleMessage(messageNum, param, sender);
switch (messageNum) {
- case 0x0009:
+ case NM_KEYPRESS_SPACE:
_skip = true;
break;
}
diff --git a/engines/neverhood/modules/module1500.h b/engines/neverhood/modules/module1500.h
index f244948918..6c8bf32340 100644
--- a/engines/neverhood/modules/module1500.h
+++ b/engines/neverhood/modules/module1500.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/neverhood/modules/module1600.cpp b/engines/neverhood/modules/module1600.cpp
index 0df7dd8925..0adcd939cd 100644
--- a/engines/neverhood/modules/module1600.cpp
+++ b/engines/neverhood/modules/module1600.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -258,7 +258,7 @@ Scene1608::Scene1608(NeverhoodEngine *vm, Module *parentModule, int which)
SetMessageHandler(&Scene1608::hmUpperFloor);
SetUpdateHandler(&Scene1608::upUpperFloor);
_asCar->setPathPoints(_roomPathPoints);
- sendMessage(_asCar, 0x2002, _roomPathPoints->size() - 1);
+ sendMessage(_asCar, NM_POSITION_CHANGE, _roomPathPoints->size() - 1);
_sprite3 = insertStaticSprite(0xB47026B0, 1100);
_clipRect1.set(_sprite3->getDrawRect().x, _sprite3->getDrawRect().y, 640, _sprite2->getDrawRect().y2());
_clipRect3.set(_sprite2->getDrawRect().x, _sprite3->getDrawRect().y, 640, _sprite2->getDrawRect().y2());
@@ -299,15 +299,15 @@ Scene1608::Scene1608(NeverhoodEngine *vm, Module *parentModule, int which)
_asIdleCarLower->setVisible(false);
_asIdleCarFull->setVisible(false);
_asCar->setPathPoints(_roomPathPoints);
- sendMessage(_asCar, 0x2002, 0);
- sendMessage(_asCar, 0x2008, 90);
+ sendMessage(_asCar, NM_POSITION_CHANGE, 0);
+ sendMessage(_asCar, NM_CAR_MOVE_TO_NEXT_POINT, 90);
_sprite3 = insertStaticSprite(0xB47026B0, 1100);
_clipRect1.set(_sprite3->getDrawRect().x, _sprite3->getDrawRect().y, 640, _sprite2->getDrawRect().y2());
_clipRect3.set(_sprite2->getDrawRect().x, _sprite3->getDrawRect().y, 640, _sprite2->getDrawRect().y2());
_clipRect2 = _clipRect1;
_clipRect2.y2 = 215;
_kmScene1608->setClipRect(_clipRect1);
- _asCar->setClipRect(_clipRect1);
+ _asCar->setClipRect(_clipRect3);
_asIdleCarLower->setClipRect(_clipRect1);
_asIdleCarFull->setClipRect(_clipRect1);
_asTape = insertSprite<AsScene1201Tape>(this, 13, 1100, 412, 443, 0x9148A011);
@@ -349,7 +349,7 @@ void Scene1608::upUpperFloor() {
_asIdleCarLower->setVisible(false);
_asIdleCarFull->setVisible(false);
_asCar->setVisible(true);
- sendMessage(_asCar, 0x2009, 0);
+ sendMessage(_asCar, NM_CAR_ENTER, 0);
_asCar->handleUpdate();
_klaymen = NULL;
_carStatus = 0;
@@ -361,7 +361,7 @@ void Scene1608::upCarAtHome() {
Scene::update();
if (_mouseClicked) {
if (_mouseClickPos.x <= 329 && _asCar->getX() == 375 && _asCar->getY() == 227) {
- sendMessage(_asCar, 0x200A, 0);
+ sendMessage(_asCar, NM_CAR_LEAVE, 0);
SetUpdateHandler(&Scene1608::upGettingOutOfCar);
} else {
sendPointMessage(_asCar, 0x2004, _mouseClickPos);
@@ -401,12 +401,12 @@ void Scene1608::upRidingCar() {
sendPointMessage(_asCar, 0x2004, _mouseClickPos);
_mouseClicked = false;
}
- if (_asCar->getX() < 300) {
+ if (_asCar->getY() < 330) {
if (_carClipFlag) {
_carClipFlag = false;
_asCar->setClipRect(_clipRect1);
if (!_asCar->isDoDeltaX())
- sendMessage(_asCar, 0x200E, 0);
+ sendMessage(_asCar, NM_CAR_TURN, 0);
}
} else if (!_carClipFlag) {
_carClipFlag = true;
@@ -417,13 +417,13 @@ void Scene1608::upRidingCar() {
uint32 Scene1608::hmLowerFloor(int messageNum, const MessageParam &param, Entity *sender) {
Scene::handleMessage(messageNum, param, sender);
switch (messageNum) {
- case 0x100D:
+ case NM_ANIMATION_START:
if (param.asInteger() == 0x20250B1A) {
clearRectList();
_klaymen->setVisible(false);
showMouse(false);
_sprite1->setVisible(false);
- //sendMessage(_asDoor, 0x4809, 0); // Play sound?
+ //sendMessage(_asDoor, NM_KLAYMEN_CLOSE_DOOR, 0); // Play sound?
_countdown1 = 28;
}
break;
@@ -444,7 +444,7 @@ uint32 Scene1608::hmLowerFloor(int messageNum, const MessageParam &param, Entity
uint32 Scene1608::hmUpperFloor(int messageNum, const MessageParam &param, Entity *sender) {
Scene::handleMessage(messageNum, param, sender);
switch (messageNum) {
- case 0x100D:
+ case NM_ANIMATION_START:
if (param.asInteger() == 0x60842040)
_carStatus = 1;
break;
@@ -464,13 +464,13 @@ uint32 Scene1608::hmUpperFloor(int messageNum, const MessageParam &param, Entity
uint32 Scene1608::hmRidingCar(int messageNum, const MessageParam &param, Entity *sender) {
Scene::handleMessage(messageNum, param, sender);
switch (messageNum) {
- case 0x2005:
+ case NM_KLAYMEN_CLIMB_LADDER:
leaveScene(1);
break;
- case 0x2006:
+ case NM_KLAYMEN_STOP_CLIMBING:
SetMessageHandler(&Scene1608::hmCarAtHome);
SetUpdateHandler(&Scene1608::upCarAtHome);
- sendMessage(_asCar, 0x200F, 1);
+ sendMessage(_asCar, NM_CAR_AT_HOME, 1);
break;
case 0x200D:
sendMessage(_parentModule, 0x200D, 0);
@@ -482,7 +482,7 @@ uint32 Scene1608::hmRidingCar(int messageNum, const MessageParam &param, Entity
uint32 Scene1608::hmCarAtHome(int messageNum, const MessageParam &param, Entity *sender) {
Scene::handleMessage(messageNum, param, sender);
switch (messageNum) {
- case 0x200A:
+ case NM_CAR_LEAVE:
_carStatus = 2;
break;
case 0x200D:
@@ -544,11 +544,11 @@ void Scene1609::update() {
uint32 Scene1609::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
Scene::handleMessage(messageNum, param, sender);
switch (messageNum) {
- case 0x0001:
+ case NM_MOUSE_CLICK:
if (param.asPoint().x <= 20 || param.asPoint().x >= 620)
leaveScene(0);
break;
- case 0x2000:
+ case NM_ANIMATION_UPDATE:
if (!_isSolved) {
if (_changeCurrentSymbol)
_asSymbols[_symbolPosition]->change(_currentSymbolIndex + 12, false);
diff --git a/engines/neverhood/modules/module1600.h b/engines/neverhood/modules/module1600.h
index f08eaad8fc..b1c9662f79 100644
--- a/engines/neverhood/modules/module1600.h
+++ b/engines/neverhood/modules/module1600.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/neverhood/modules/module1600_sprites.cpp b/engines/neverhood/modules/module1600_sprites.cpp
index 06a00c82c0..09e3d0afe1 100644
--- a/engines/neverhood/modules/module1600_sprites.cpp
+++ b/engines/neverhood/modules/module1600_sprites.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -94,10 +94,10 @@ void AsCommonCar::upIdle() {
uint32 AsCommonCar::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
uint32 messageResult = Sprite::handleMessage(messageNum, param, sender);
switch (messageNum) {
- case 0x1019:
+ case NM_SCENE_LEAVE:
SetSpriteUpdate(NULL);
break;
- case 0x2002:
+ case NM_POSITION_CHANGE:
// Set the current position without moving
_currPointIndex = param.asInteger();
_stepError = 0;
@@ -116,10 +116,10 @@ uint32 AsCommonCar::handleMessage(int messageNum, const MessageParam &param, Ent
} else if (_currPointIndex == newPointIndex && _stepError == 0) {
if (_currPointIndex == 0) {
_yMoveTotalSteps = 0;
- sendMessage(_parentScene, 0x2005, 0);
+ sendMessage(_parentScene, NM_KLAYMEN_CLIMB_LADDER, 0);
} else if (_currPointIndex == (int)_pathPoints->size()) {
_yMoveTotalSteps = 0;
- sendMessage(_parentScene, 0x2006, 0);
+ sendMessage(_parentScene, NM_KLAYMEN_STOP_CLIMBING, 0);
}
} else {
moveToPrevPoint();
@@ -177,30 +177,30 @@ uint32 AsCommonCar::handleMessage(int messageNum, const MessageParam &param, Ent
}
}
break;
- case 0x2007:
+ case NM_CAR_MOVE_TO_PREV_POINT:
_yMoveTotalSteps = param.asInteger();
_steps = 0;
_isBraking = false;
_lastDistance = 640;
SetSpriteUpdate(&AsCommonCar::suMoveToPrevPoint);
break;
- case 0x2008:
+ case NM_CAR_MOVE_TO_NEXT_POINT:
_yMoveTotalSteps = param.asInteger();
_steps = 0;
_isBraking = false;
_lastDistance = 640;
SetSpriteUpdate(&AsCommonCar::suMoveToNextPoint);
break;
- case 0x2009:
+ case NM_CAR_ENTER:
stEnterCar();
break;
- case 0x200A:
+ case NM_CAR_LEAVE:
stLeaveCar();
break;
- case 0x200E:
+ case NM_CAR_TURN:
stTurnCar();
break;
- case 0x200F:
+ case NM_CAR_AT_HOME:
stCarAtHome();
_newDeltaXType = param.asInteger();
break;
@@ -211,11 +211,11 @@ uint32 AsCommonCar::handleMessage(int messageNum, const MessageParam &param, Ent
uint32 AsCommonCar::hmAnimation(int messageNum, const MessageParam &param, Entity *sender) {
uint32 messageResult = AsCommonCar::handleMessage(messageNum, param, sender);
switch (messageNum) {
- case 0x100D:
+ case NM_ANIMATION_START:
if (_isBusy && param.asInteger() == 0x025424A2)
gotoNextState();
break;
- case 0x3002:
+ case NM_ANIMATION_STOP:
gotoNextState();
break;
}
@@ -224,11 +224,11 @@ uint32 AsCommonCar::hmAnimation(int messageNum, const MessageParam &param, Entit
uint32 AsCommonCar::hmLeaveCar(int messageNum, const MessageParam &param, Entity *sender) {
switch (messageNum) {
- case 0x2009:
+ case NM_CAR_ENTER:
stEnterCar();
break;
- case 0x3002:
- sendMessage(_parentScene, 0x200A, 0);
+ case NM_ANIMATION_STOP:
+ sendMessage(_parentScene, NM_CAR_LEAVE, 0);
SetMessageHandler(&AsCommonCar::handleMessage);
break;
}
@@ -350,8 +350,8 @@ void AsCommonCar::stUpdateMoveDirection() {
void AsCommonCar::moveToNextPoint() {
if (_currPointIndex >= (int)_pathPoints->size() - 1) {
_yMoveTotalSteps = 0;
- sendMessage(this, 0x1019, 0);
- sendMessage(_parentScene, 0x2006, 0);
+ sendMessage(this, NM_SCENE_LEAVE, 0);
+ sendMessage(_parentScene, NM_KLAYMEN_STOP_CLIMBING, 0);
} else {
NPoint nextPt = pathPoint(_currPointIndex + 1);
NPoint currPt = pathPoint(_currPointIndex);
@@ -431,8 +431,8 @@ void AsCommonCar::stTurnCarMoveToPrevPoint() {
void AsCommonCar::moveToPrevPoint() {
if (_currPointIndex == 0 && _stepError == 0) {
_yMoveTotalSteps = 0;
- sendMessage(this, 0x1019, 0);
- sendMessage(_parentScene, 0x2005, 0);
+ sendMessage(this, NM_SCENE_LEAVE, 0);
+ sendMessage(_parentScene, NM_KLAYMEN_CLIMB_LADDER, 0);
} else {
NPoint prevPt;
NPoint currPt;
@@ -492,14 +492,14 @@ void AsCommonCar::suMoveToNextPoint() {
if (_currPointIndex >= (int)_pathPoints->size()) {
_yMoveTotalSteps = 0;
- sendMessage(this, 0x1019, 0);
- sendMessage(_parentScene, 0x2006, 0);
+ sendMessage(this, NM_SCENE_LEAVE, 0);
+ sendMessage(_parentScene, NM_KLAYMEN_STOP_CLIMBING, 0);
return;
}
if (_isBraking) {
if (_steps <= 0) {
- sendMessage(this, 0x1019, 0);
+ sendMessage(this, NM_SCENE_LEAVE, 0);
return;
} else
_steps--;
@@ -623,8 +623,8 @@ void AsCommonCar::suMoveToNextPoint() {
if (_currPointIndex == (int)_pathPoints->size() - 1) {
_isBraking = true;
_yMoveTotalSteps = 0;
- sendMessage(this, 0x1019, 0);
- sendMessage(_parentScene, 0x2006, 0);
+ sendMessage(this, NM_SCENE_LEAVE, 0);
+ sendMessage(_parentScene, NM_KLAYMEN_STOP_CLIMBING, 0);
}
}
@@ -635,14 +635,14 @@ void AsCommonCar::suMoveToPrevPoint() {
if (_currPointIndex == 0 && _stepError == 0) {
_yMoveTotalSteps = 0;
- sendMessage(this, 0x1019, 0);
- sendMessage(_parentScene, 0x2005, 0);
+ sendMessage(this, NM_SCENE_LEAVE, 0);
+ sendMessage(_parentScene, NM_KLAYMEN_CLIMB_LADDER, 0);
return;
}
if (_isBraking) {
if (_steps <= 0) {
- sendMessage(this, 0x1019, 0);
+ sendMessage(this, NM_SCENE_LEAVE, 0);
return;
} else
_steps--;
@@ -768,8 +768,8 @@ void AsCommonCar::suMoveToPrevPoint() {
if (_currPointIndex == 0 && _stepError == 0) {
_isBraking = true;
_yMoveTotalSteps = 0;
- sendMessage(this, 0x1019, 0);
- sendMessage(_parentScene, 0x2005, 0);
+ sendMessage(this, NM_SCENE_LEAVE, 0);
+ sendMessage(_parentScene, NM_KLAYMEN_CLIMB_LADDER, 0);
}
}
@@ -860,13 +860,13 @@ uint32 KmScene1608::xHandleMessage(int messageNum, const MessageParam &param) {
case 0x4800:
startWalkToX(param.asPoint().x, false);
break;
- case 0x4004:
+ case NM_KLAYMEN_STAND_IDLE:
if (_isSittingInTeleporter)
GotoState(&Klaymen::stSitIdleTeleporter);
else
GotoState(&Klaymen::stTryStandIdle);
break;
- case 0x4812:
+ case NM_KLAYMEN_PICKUP:
if (param.asInteger() == 2)
GotoState(&Klaymen::stPickUpNeedle);
else if (param.asInteger() == 1)
@@ -884,11 +884,11 @@ uint32 KmScene1608::xHandleMessage(int messageNum, const MessageParam &param) {
else
startWalkToAttachedSpriteXDistance(param.asPoint().x);
break;
- case 0x481D:
+ case NM_KLAYMEN_TURN_TO_USE:
if (_isSittingInTeleporter)
GotoState(&Klaymen::stTurnToUseInTeleporter);
break;
- case 0x481E:
+ case NM_KLAYMEN_RETURN_FROM_USE:
if (_isSittingInTeleporter)
GotoState(&Klaymen::stReturnFromUseInTeleporter);
break;
diff --git a/engines/neverhood/modules/module1600_sprites.h b/engines/neverhood/modules/module1600_sprites.h
index fa59475dad..1c51160be3 100644
--- a/engines/neverhood/modules/module1600_sprites.h
+++ b/engines/neverhood/modules/module1600_sprites.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/neverhood/modules/module1700.cpp b/engines/neverhood/modules/module1700.cpp
index e3a5fc3663..6ff34ecd91 100644
--- a/engines/neverhood/modules/module1700.cpp
+++ b/engines/neverhood/modules/module1700.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -215,7 +215,7 @@ void Scene1705::update() {
uint32 Scene1705::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
Scene::handleMessage(messageNum, param, sender);
switch (messageNum) {
- case 0x2000:
+ case NM_ANIMATION_UPDATE:
if (param.asInteger()) {
setRectList(0x004B6B40);
_klaymen->setKlaymenIdleTable3();
diff --git a/engines/neverhood/modules/module1700.h b/engines/neverhood/modules/module1700.h
index 09daff2acf..57d04312bb 100644
--- a/engines/neverhood/modules/module1700.h
+++ b/engines/neverhood/modules/module1700.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/neverhood/modules/module1700_sprites.cpp b/engines/neverhood/modules/module1700_sprites.cpp
index 6274e5a8cc..3a6784b0f5 100644
--- a/engines/neverhood/modules/module1700_sprites.cpp
+++ b/engines/neverhood/modules/module1700_sprites.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -56,7 +56,7 @@ uint32 SsScene1705Tape::handleMessage(int messageNum, const MessageParam &param,
sendMessage(_parentScene, 0x4826, 0);
messageResult = 1;
break;
- case 0x4806:
+ case NM_KLAYMEN_USE_OBJECT:
setSubVar(VA_HAS_TAPE, _tapeIndex, 1);
setVisible(false);
SetMessageHandler(NULL);
@@ -74,7 +74,7 @@ KmScene1705::KmScene1705(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16
uint32 KmScene1705::xHandleMessage(int messageNum, const MessageParam &param) {
uint32 messageResult = 0;
switch (messageNum) {
- case 0x2000:
+ case NM_ANIMATION_UPDATE:
_isSittingInTeleporter = param.asInteger() != 0;
messageResult = 1;
break;
@@ -82,7 +82,7 @@ uint32 KmScene1705::xHandleMessage(int messageNum, const MessageParam &param) {
case 0x4800:
startWalkToX(param.asPoint().x, false);
break;
- case 0x4004:
+ case NM_KLAYMEN_STAND_IDLE:
if (_isSittingInTeleporter)
GotoState(&Klaymen::stSitIdleTeleporter);
else
@@ -91,7 +91,7 @@ uint32 KmScene1705::xHandleMessage(int messageNum, const MessageParam &param) {
case 0x4803:
GotoState(&Klaymen::stFallSkipJump);
break;
- case 0x4812:
+ case NM_KLAYMEN_PICKUP:
if (param.asInteger() == 2)
GotoState(&Klaymen::stPickUpNeedle);
else if (param.asInteger() == 1)
@@ -109,12 +109,12 @@ uint32 KmScene1705::xHandleMessage(int messageNum, const MessageParam &param) {
else
startWalkToAttachedSpriteXDistance(param.asPoint().x);
break;
- case 0x481D:
+ case NM_KLAYMEN_TURN_TO_USE:
if (_isSittingInTeleporter) {
GotoState(&Klaymen::stTurnToUseInTeleporter);
}
break;
- case 0x481E:
+ case NM_KLAYMEN_RETURN_FROM_USE:
if (_isSittingInTeleporter)
GotoState(&Klaymen::stReturnFromUseInTeleporter);
break;
diff --git a/engines/neverhood/modules/module1700_sprites.h b/engines/neverhood/modules/module1700_sprites.h
index 4117de01d9..afa5d9f7ad 100644
--- a/engines/neverhood/modules/module1700_sprites.h
+++ b/engines/neverhood/modules/module1700_sprites.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/neverhood/modules/module1800.cpp b/engines/neverhood/modules/module1800.cpp
index 282292a516..17d6367252 100644
--- a/engines/neverhood/modules/module1800.cpp
+++ b/engines/neverhood/modules/module1800.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/neverhood/modules/module1800.h b/engines/neverhood/modules/module1800.h
index d3f3a635c3..35af1f8e58 100644
--- a/engines/neverhood/modules/module1800.h
+++ b/engines/neverhood/modules/module1800.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/neverhood/modules/module1900.cpp b/engines/neverhood/modules/module1900.cpp
index a920893755..71926d6950 100644
--- a/engines/neverhood/modules/module1900.cpp
+++ b/engines/neverhood/modules/module1900.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -198,13 +198,13 @@ void Scene1907::update() {
uint32 Scene1907::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
Scene::handleMessage(messageNum, param, sender);
switch (messageNum) {
- case 0x0001:
+ case NM_MOUSE_CLICK:
if ((param.asPoint().x <= 20 || param.asPoint().x >= 620) &&
!_hasPlugInFailed && _moveDownCountdown == 0 && _moveUpCountdown == 0 && _countdown3 == 0) {
leaveScene(0);
}
break;
- case 0x2000:
+ case NM_ANIMATION_UPDATE:
if (getGlobalVar(V_STAIRS_DOWN)) {
playSound(0);
for (int i = 0; i < 9; i++)
diff --git a/engines/neverhood/modules/module1900.h b/engines/neverhood/modules/module1900.h
index d785c6f506..78128f8f37 100644
--- a/engines/neverhood/modules/module1900.h
+++ b/engines/neverhood/modules/module1900.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/neverhood/modules/module1900_sprites.cpp b/engines/neverhood/modules/module1900_sprites.cpp
index 09c0b132d5..074a83cdcd 100644
--- a/engines/neverhood/modules/module1900_sprites.cpp
+++ b/engines/neverhood/modules/module1900_sprites.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -122,7 +122,7 @@ uint32 AsScene1907Symbol::handleMessage(int messageNum, const MessageParam &para
uint32 AsScene1907Symbol::hmTryToPlugIn(int messageNum, const MessageParam &param, Entity *sender) {
uint32 messageResult = Sprite::handleMessage(messageNum, param, sender);
switch (messageNum) {
- case 0x3002:
+ case NM_ANIMATION_STOP:
gotoNextState();
break;
}
@@ -216,7 +216,7 @@ void AsScene1907Symbol::tryToPlugIn() {
_plugInTryCount++;
_newPositionIndex = _parentScene->getNextPosition();
_parentScene->setPositionFree(_currPositionIndex, true);
- sendMessage(_parentScene, 0x1022, 1100 + _newPositionIndex);
+ sendMessage(_parentScene, NM_PRIORITY_CHANGE, 1100 + _newPositionIndex);
startAnimation(kAsScene1907SymbolFileHashes[_elementIndex], 0, -1);
SetUpdateHandler(&AsScene1907Symbol::update);
SetMessageHandler(&AsScene1907Symbol::hmTryToPlugIn);
@@ -255,7 +255,7 @@ void AsScene1907Symbol::fallOff(int newPositionIndex, int fallOffDelay) {
void AsScene1907Symbol::stFallOffHitGround() {
playSound(1);
- sendMessage(_parentScene, 0x1022, 1000 + _newPositionIndex);
+ sendMessage(_parentScene, NM_PRIORITY_CHANGE, 1000 + _newPositionIndex);
Entity::_priority = 1000 - _newPositionIndex;
_parentScene->removeCollisionSprite(this);
_parentScene->addCollisionSprite(this);
@@ -394,7 +394,7 @@ void AsScene1907WaterHint::update() {
uint32 AsScene1907WaterHint::hmShowing(int messageNum, const MessageParam &param, Entity *sender) {
uint32 messageResult = Sprite::handleMessage(messageNum, param, sender);
switch (messageNum) {
- case 0x3002:
+ case NM_ANIMATION_STOP:
gotoNextState();
break;
}
@@ -426,17 +426,17 @@ uint32 KmScene1901::xHandleMessage(int messageNum, const MessageParam &param) {
case 0x4800:
startWalkToX(param.asPoint().x, false);
break;
- case 0x4004:
+ case NM_KLAYMEN_STAND_IDLE:
GotoState(&Klaymen::stTryStandIdle);
break;
case 0x4817:
setDoDeltaX(param.asInteger());
gotoNextStateExt();
break;
- case 0x481D:
+ case NM_KLAYMEN_TURN_TO_USE:
GotoState(&Klaymen::stTurnToUse);
break;
- case 0x481E:
+ case NM_KLAYMEN_RETURN_FROM_USE:
GotoState(&Klaymen::stReturnFromUse);
break;
case 0x482D:
diff --git a/engines/neverhood/modules/module1900_sprites.h b/engines/neverhood/modules/module1900_sprites.h
index 7e57b11618..6df02e2279 100644
--- a/engines/neverhood/modules/module1900_sprites.h
+++ b/engines/neverhood/modules/module1900_sprites.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/neverhood/modules/module2000.cpp b/engines/neverhood/modules/module2000.cpp
index 3364f60f8b..498f50989e 100644
--- a/engines/neverhood/modules/module2000.cpp
+++ b/engines/neverhood/modules/module2000.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -144,7 +144,7 @@ Scene2001::Scene2001(NeverhoodEngine *vm, Module *parentModule, int which)
uint32 Scene2001::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
Scene::handleMessage(messageNum, param, sender);
switch (messageNum) {
- case 0x2000:
+ case NM_ANIMATION_UPDATE:
if (param.asInteger()) {
setRectList(0x004B3680);
_klaymen->setKlaymenIdleTable3();
diff --git a/engines/neverhood/modules/module2000.h b/engines/neverhood/modules/module2000.h
index 8dc72c57dc..6e1cfb6fe6 100644
--- a/engines/neverhood/modules/module2000.h
+++ b/engines/neverhood/modules/module2000.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/neverhood/modules/module2000_sprites.cpp b/engines/neverhood/modules/module2000_sprites.cpp
index c9c1481aa7..ccf383d26d 100644
--- a/engines/neverhood/modules/module2000_sprites.cpp
+++ b/engines/neverhood/modules/module2000_sprites.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -33,7 +33,7 @@ KmScene2001::KmScene2001(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16
uint32 KmScene2001::xHandleMessage(int messageNum, const MessageParam &param) {
uint32 messageResult = 0;
switch (messageNum) {
- case 0x2000:
+ case NM_ANIMATION_UPDATE:
_isSittingInTeleporter = param.asInteger() != 0;
messageResult = 1;
break;
@@ -41,7 +41,7 @@ uint32 KmScene2001::xHandleMessage(int messageNum, const MessageParam &param) {
case 0x4800:
startWalkToX(param.asPoint().x, false);
break;
- case 0x4004:
+ case NM_KLAYMEN_STAND_IDLE:
if (_isSittingInTeleporter)
GotoState(&Klaymen::stSitIdleTeleporter);
else
@@ -58,11 +58,11 @@ uint32 KmScene2001::xHandleMessage(int messageNum, const MessageParam &param) {
setDoDeltaX(param.asInteger());
gotoNextStateExt();
break;
- case 0x481D:
+ case NM_KLAYMEN_TURN_TO_USE:
if (_isSittingInTeleporter)
GotoState(&Klaymen::stTurnToUseInTeleporter);
break;
- case 0x481E:
+ case NM_KLAYMEN_RETURN_FROM_USE:
if (_isSittingInTeleporter)
GotoState(&Klaymen::stReturnFromUseInTeleporter);
break;
diff --git a/engines/neverhood/modules/module2000_sprites.h b/engines/neverhood/modules/module2000_sprites.h
index ca84aa73ca..62b738d9fb 100644
--- a/engines/neverhood/modules/module2000_sprites.h
+++ b/engines/neverhood/modules/module2000_sprites.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/neverhood/modules/module2100.cpp b/engines/neverhood/modules/module2100.cpp
index db7258b066..9488057fa4 100644
--- a/engines/neverhood/modules/module2100.cpp
+++ b/engines/neverhood/modules/module2100.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -147,7 +147,7 @@ void Scene2101::update() {
if (_countdown1 != 0) {
if (_doorStatus == 2) {
if (--_countdown1 == 0) {
- sendMessage(_asDoor, 0x4809, 0);
+ sendMessage(_asDoor, NM_KLAYMEN_CLOSE_DOOR, 0);
_doorStatus = 1;
}
} else {
@@ -155,12 +155,12 @@ void Scene2101::update() {
_canAcceptInput = false;
if (--_countdown1 == 0) {
if (_klaymen->getX() < 480) {
- sendMessage(_asDoor, 0x4809, 0);
+ sendMessage(_asDoor, NM_KLAYMEN_CLOSE_DOOR, 0);
_doorStatus = 1;
} else if (_klaymen->getX() >= 480 && _klaymen->getX() <= 575) {
_klaymen->setDoDeltaX(0);
setMessageList2(0x004B8F48);
- sendMessage(_asDoor, 0x4809, 0);
+ sendMessage(_asDoor, NM_KLAYMEN_CLOSE_DOOR, 0);
sendMessage(_asHitByDoorEffect, 0x2001, 0);
_doorStatus = 1;
}
@@ -174,7 +174,7 @@ void Scene2101::update() {
uint32 Scene2101::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
Scene::handleMessage(messageNum, param, sender);
switch (messageNum) {
- case 0x100D:
+ case NM_ANIMATION_START:
if (param.asInteger() == 0x02144CB1)
sendEntityMessage(_klaymen, 0x1014, _ssFloorButton);
else if (param.asInteger() == 0x21E64A00) {
@@ -185,7 +185,7 @@ uint32 Scene2101::handleMessage(int messageNum, const MessageParam &param, Entit
} else if (param.asInteger() == 0x41442820)
cancelMessageList();
break;
- case 0x2000:
+ case NM_ANIMATION_UPDATE:
if (param.asInteger() != 0) {
setRectList(0x004B9008);
_klaymen->setKlaymenIdleTable3();
@@ -196,7 +196,7 @@ uint32 Scene2101::handleMessage(int messageNum, const MessageParam &param, Entit
break;
case 0x480B:
if (sender == _ssFloorButton && _doorStatus == 1) {
- sendMessage(_asDoor, 0x4808, 0);
+ sendMessage(_asDoor, NM_KLAYMEN_OPEN_DOOR, 0);
_doorStatus = 0;
_countdown1 = 90;
}
diff --git a/engines/neverhood/modules/module2100.h b/engines/neverhood/modules/module2100.h
index c5256434d9..e660eba7c0 100644
--- a/engines/neverhood/modules/module2100.h
+++ b/engines/neverhood/modules/module2100.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/neverhood/modules/module2100_sprites.cpp b/engines/neverhood/modules/module2100_sprites.cpp
index 707ebe342f..4d2e4956e6 100644
--- a/engines/neverhood/modules/module2100_sprites.cpp
+++ b/engines/neverhood/modules/module2100_sprites.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -42,13 +42,13 @@ AsScene2101Door::AsScene2101Door(NeverhoodEngine *vm, bool isOpen)
uint32 AsScene2101Door::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
uint32 messageResult = Sprite::handleMessage(messageNum, param, sender);
switch (messageNum) {
- case 0x3002:
+ case NM_ANIMATION_STOP:
gotoNextState();
break;
- case 0x4808:
+ case NM_KLAYMEN_OPEN_DOOR:
stOpenDoor();
break;
- case 0x4809:
+ case NM_KLAYMEN_CLOSE_DOOR:
stCloseDoor();
break;
}
@@ -93,7 +93,7 @@ uint32 AsScene2101HitByDoorEffect::handleMessage(int messageNum, const MessagePa
startAnimation(0x0422255A, 0, -1);
setVisible(true);
break;
- case 0x3002:
+ case NM_ANIMATION_STOP:
stopAnimation();
setVisible(false);
break;
@@ -118,7 +118,7 @@ SsCommonFloorButton::SsCommonFloorButton(NeverhoodEngine *vm, Scene *parentScene
void SsCommonFloorButton::update() {
if (_countdown != 0 && (--_countdown == 0)) {
- sendMessage(_parentScene, 0x1022, 1010);
+ sendMessage(_parentScene, NM_PRIORITY_CHANGE, 1010);
if (_fileHash1)
loadSprite(_fileHash1, kSLFDefDrawOffset | kSLFDefPosition);
else
@@ -132,7 +132,7 @@ uint32 SsCommonFloorButton::handleMessage(int messageNum, const MessageParam &pa
case 0x480B:
sendMessage(_parentScene, 0x480B, 0);
setVisible(true);
- sendMessage(_parentScene, 0x1022, 990);
+ sendMessage(_parentScene, NM_PRIORITY_CHANGE, 990);
loadSprite(_fileHash2, kSLFDefDrawOffset | kSLFDefPosition);
_countdown = 16;
playSound(0, _soundFileHash);
@@ -150,7 +150,7 @@ KmScene2101::KmScene2101(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16
uint32 KmScene2101::xHandleMessage(int messageNum, const MessageParam &param) {
uint32 messageResult = 0;
switch (messageNum) {
- case 0x2000:
+ case NM_ANIMATION_UPDATE:
_isSittingInTeleporter = param.asInteger() != 0;
messageResult = 1;
break;
@@ -158,7 +158,7 @@ uint32 KmScene2101::xHandleMessage(int messageNum, const MessageParam &param) {
case 0x4800:
startWalkToX(param.asPoint().x, false);
break;
- case 0x4004:
+ case NM_KLAYMEN_STAND_IDLE:
if (_isSittingInTeleporter)
GotoState(&Klaymen::stSitIdleTeleporter);
else
@@ -167,7 +167,7 @@ uint32 KmScene2101::xHandleMessage(int messageNum, const MessageParam &param) {
case 0x4811:
GotoState(&KmScene2101::stHitByDoor);
break;
- case 0x4812:
+ case NM_KLAYMEN_PICKUP:
if (param.asInteger() == 2)
GotoState(&Klaymen::stPickUpNeedle);
else if (param.asInteger() == 1)
@@ -175,7 +175,7 @@ uint32 KmScene2101::xHandleMessage(int messageNum, const MessageParam &param) {
else
GotoState(&Klaymen::stPickUpGeneric);
break;
- case 0x4816:
+ case NM_KLAYMEN_PRESS_BUTTON:
if (param.asInteger() == 1)
GotoState(&Klaymen::stPressButton);
else if (param.asInteger() == 2)
@@ -193,11 +193,11 @@ uint32 KmScene2101::xHandleMessage(int messageNum, const MessageParam &param) {
else
startWalkToAttachedSpriteXDistance(param.asPoint().x);
break;
- case 0x481D:
+ case NM_KLAYMEN_TURN_TO_USE:
if (_isSittingInTeleporter)
GotoState(&Klaymen::stTurnToUseInTeleporter);
break;
- case 0x481E:
+ case NM_KLAYMEN_RETURN_FROM_USE:
if (_isSittingInTeleporter)
GotoState(&Klaymen::stReturnFromUseInTeleporter);
break;
@@ -236,7 +236,7 @@ uint32 KmScene2101::hmHitByDoor(int messageNum, const MessageParam &param, Entit
}
messageResult = 0;
break;
- case 0x100D:
+ case NM_ANIMATION_START:
if (param.asInteger() == 0x1A1A0785) {
playSound(0, 0x40F0A342);
} else if (param.asInteger() == 0x60428026) {
diff --git a/engines/neverhood/modules/module2100_sprites.h b/engines/neverhood/modules/module2100_sprites.h
index 85a6b9f27d..c1116ef9a5 100644
--- a/engines/neverhood/modules/module2100_sprites.h
+++ b/engines/neverhood/modules/module2100_sprites.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/neverhood/modules/module2200.cpp b/engines/neverhood/modules/module2200.cpp
index 745af42f72..6618cb3ab0 100644
--- a/engines/neverhood/modules/module2200.cpp
+++ b/engines/neverhood/modules/module2200.cpp
@@ -8,18 +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.
*
*/
+#include "common/config-manager.h"
+
#include "neverhood/diskplayerscene.h"
#include "neverhood/gamemodule.h"
#include "neverhood/modules/module1000_sprites.h"
@@ -46,6 +48,18 @@ Module2200::~Module2200() {
}
void Module2200::createScene(int sceneNum, int which) {
+ if (sceneNum == 46 && ConfMan.getBool("skiphallofrecordsscenes")) {
+ // Skip the whole Hall of Records storyboard scenes,
+ // and teleport to the last scene
+ sceneNum = 41;
+ }
+
+ if (sceneNum == 40 && ConfMan.getBool("skiphallofrecordsscenes")) {
+ // Skip the whole Hall of Records storyboard scenes,
+ // and teleport back to the first scene
+ sceneNum = 5;
+ }
+
debug(1, "Module2200::createScene(%d, %d)", sceneNum, which);
_sceneNum = sceneNum;
switch (_sceneNum) {
@@ -537,7 +551,7 @@ void Scene2201::update() {
uint32 Scene2201::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
Scene::handleMessage(messageNum, param, sender);
switch (messageNum) {
- case 0x100D:
+ case NM_ANIMATION_START:
if (param.asInteger() == 0x402064D8)
sendEntityMessage(_klaymen, 0x1014, _ssDoorButton);
else if (param.asInteger() == 0x35803198) {
@@ -561,7 +575,7 @@ uint32 Scene2201::handleMessage(int messageNum, const MessageParam &param, Entit
break;
case 0x480B:
if (sender == _ssDoorButton)
- sendMessage(_asDoor, 0x4808, 0);
+ sendMessage(_asDoor, NM_KLAYMEN_OPEN_DOOR, 0);
break;
case 0x4826:
if (sender == _asTape) {
@@ -648,15 +662,15 @@ void Scene2202::update() {
uint32 Scene2202::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
Scene::handleMessage(messageNum, param, sender);
switch (messageNum) {
- case 0x0001:
+ case NM_MOUSE_CLICK:
if (param.asPoint().x <= 20 || param.asPoint().x >= 620)
leaveScene(0);
break;
- case 0x2000:
+ case NM_ANIMATION_UPDATE:
_movingCubePosition = (int16)param.asInteger();
_ssMovingCube = (Sprite*)sender;
break;
- case 0x2002:
+ case NM_POSITION_CHANGE:
_isCubeMoving = false;
_ssDoneMovingCube = (Sprite*)sender;
if (param.asInteger() <= 2)
@@ -772,7 +786,7 @@ uint32 Scene2203::handleMessage(int messageNum, const MessageParam &param, Entit
else
setMessageList2(0x004B83C8);
break;
- case 0x2002:
+ case NM_POSITION_CHANGE:
if (sender == _asLeftDoor)
setMessageList2(0x004B8370);
else
@@ -784,7 +798,7 @@ uint32 Scene2203::handleMessage(int messageNum, const MessageParam &param, Entit
else
_ssSmallRightDoor->setVisible(false);
break;
- case 0x4808:
+ case NM_KLAYMEN_OPEN_DOOR:
if (sender == _asLeftDoor) {
_ssSmallLeftDoor->setVisible(true);
_klaymen->setClipRect(_leftDoorClipRect);
@@ -871,7 +885,7 @@ void Scene2205::update() {
} else if (_isLightOn && !getGlobalVar(V_LIGHTS_ON)) {
_palette->addPalette(0xD00A028D, 0, 256, 0);
changeBackground(0xD00A028D);
- _ssLightSwitch->setFileHashes(0x2D339030, 0xDAC86E84);
+ _ssLightSwitch->setFileHashes(0xD6C86E84, 0xDAC86E84);
sendMessage(_ssDoorFrame, 0x2000, 0);
changeMouseCursor(0xA0289D08);
_isKlaymenInLight = true;
@@ -897,7 +911,7 @@ void Scene2205::update() {
uint32 Scene2205::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
Scene::handleMessage(messageNum, param, sender);
switch (messageNum) {
- case 0x100D:
+ case NM_ANIMATION_START:
if (param.asInteger() == 0x6449569A)
setMessageList(0x004B0690);
else if (param.asInteger() == 0x2841369C)
@@ -998,7 +1012,7 @@ Scene2206::~Scene2206() {
uint32 Scene2206::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
uint32 messageResult = Scene::handleMessage(messageNum, param, sender);
switch (messageNum) {
- case 0x100D:
+ case NM_ANIMATION_START:
if (param.asInteger() == 0x800C6694)
readClickedColumn();
else if (param.asInteger() == 0x402064D8)
@@ -1017,19 +1031,19 @@ uint32 Scene2206::handleMessage(int messageNum, const MessageParam &param, Entit
if (sender == _ssButton) {
setGlobalVar(V_SPIKES_RETRACTED, getGlobalVar(V_SPIKES_RETRACTED) ? 0 : 1);
if (getGlobalVar(V_SPIKES_RETRACTED))
- sendMessage(_asDoorSpikes, 0x4808, 0);
+ sendMessage(_asDoorSpikes, NM_KLAYMEN_OPEN_DOOR, 0);
else
- sendMessage(_asDoorSpikes, 0x4809, 0);
+ sendMessage(_asDoorSpikes, NM_KLAYMEN_CLOSE_DOOR, 0);
}
break;
case 0x4826:
sendEntityMessage(_klaymen, 0x1014, _ssTestTube);
setMessageList(0x004B8988);
break;
- case 0x482A:
+ case NM_MOVE_TO_BACK:
klaymenBehindSpikes();
break;
- case 0x482B:
+ case NM_MOVE_TO_FRONT:
klaymenInFrontSpikes();
break;
}
@@ -1165,7 +1179,7 @@ void Scene2207::update() {
uint32 Scene2207::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
uint32 messageResult = Scene::handleMessage(messageNum, param, sender);
switch (messageNum) {
- case 0x100D:
+ case NM_ANIMATION_START:
if (param.asInteger() == 0x0014F275) {
if (_klaymenAtElevator) {
sendMessage(_asElevator, 0x2000, _mouseClickPos.y);
@@ -1201,15 +1215,15 @@ uint32 Scene2207::handleMessage(int messageNum, const MessageParam &param, Entit
setMessageList(0x004B37D8);
}
break;
- case 0x2002:
+ case NM_POSITION_CHANGE:
_elevatorSurfacePriority = param.asInteger();
break;
case 0x2003:
_isKlaymenBusy = false;
break;
- case 0x4807:
- sendMessage(_asWallRobotAnimation, 0x2007, 0);
- sendMessage(_asWallCannonAnimation, 0x2007, 0);
+ case NM_KLAYMEN_RAISE_LEVER:
+ sendMessage(_asWallRobotAnimation, NM_CAR_MOVE_TO_PREV_POINT, 0);
+ sendMessage(_asWallCannonAnimation, NM_CAR_MOVE_TO_PREV_POINT, 0);
break;
case 0x480B:
if (sender == _ssButton) {
@@ -1222,9 +1236,9 @@ uint32 Scene2207::handleMessage(int messageNum, const MessageParam &param, Entit
}
}
break;
- case 0x480F:
- sendMessage(_asWallRobotAnimation, 0x2006, 0);
- sendMessage(_asWallCannonAnimation, 0x2006, 0);
+ case NM_KLAYMEN_LOWER_LEVER:
+ sendMessage(_asWallRobotAnimation, NM_KLAYMEN_STOP_CLIMBING, 0);
+ sendMessage(_asWallCannonAnimation, NM_KLAYMEN_STOP_CLIMBING, 0);
_asWallRobotAnimation->setVisible(true);
_asWallCannonAnimation->setVisible(true);
break;
@@ -1248,12 +1262,12 @@ uint32 Scene2207::handleMessage(int messageNum, const MessageParam &param, Entit
uint32 Scene2207::handleMessage2(int messageNum, const MessageParam &param, Entity *sender) {
uint32 messageResult = Scene::handleMessage(messageNum, param, sender);
switch (messageNum) {
- case 0x2002:
+ case NM_POSITION_CHANGE:
_elevatorSurfacePriority = param.asInteger();
break;
case 0x2004:
SetMessageHandler(&Scene2207::handleMessage);
- sendMessage(_klaymen, 0x2005, 0);
+ sendMessage(_klaymen, NM_KLAYMEN_CLIMB_LADDER, 0);
sendEntityMessage(_klaymen, 0x1014, _asLever);
setMessageList(0x004B3920);
setRectList(0x004B3948);
@@ -1386,7 +1400,7 @@ void Scene2208::update() {
uint32 Scene2208::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
uint32 messageResult = Scene::handleMessage(messageNum, param, sender);
switch (messageNum) {
- case 0x0001:
+ case NM_MOUSE_CLICK:
if (param.asPoint().x <= 40 || param.asPoint().x >= 600)
leaveScene(0);
break;
@@ -1505,7 +1519,7 @@ void Scene2242::update() {
uint32 Scene2242::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
uint32 messageResult = Scene::handleMessage(messageNum, param, sender);
switch (messageNum) {
- case 0x100D:
+ case NM_ANIMATION_START:
if (param.asInteger() == 0x800C6694)
readClickedColumn();
break;
@@ -1606,7 +1620,7 @@ HallOfRecordsScene::~HallOfRecordsScene() {
uint32 HallOfRecordsScene::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
uint32 messageResult = Scene::handleMessage(messageNum, param, sender);
switch (messageNum) {
- case 0x100D:
+ case NM_ANIMATION_START:
if (param.asInteger() == 0x800C6694)
readClickedColumn();
break;
@@ -1694,7 +1708,7 @@ Scene2247::~Scene2247() {
uint32 Scene2247::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
uint32 messageResult = Scene::handleMessage(messageNum, param, sender);
switch (messageNum) {
- case 0x100D:
+ case NM_ANIMATION_START:
if (param.asInteger() == 0x800C6694)
readClickedColumn();
break;
diff --git a/engines/neverhood/modules/module2200.h b/engines/neverhood/modules/module2200.h
index 6b414304ae..5250bf3fe9 100644
--- a/engines/neverhood/modules/module2200.h
+++ b/engines/neverhood/modules/module2200.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/neverhood/modules/module2200_sprites.cpp b/engines/neverhood/modules/module2200_sprites.cpp
index 30f0404cf1..7c1e84c3cf 100644
--- a/engines/neverhood/modules/module2200_sprites.cpp
+++ b/engines/neverhood/modules/module2200_sprites.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -62,7 +62,7 @@ void AsScene2201Door::update() {
uint32 AsScene2201Door::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
uint32 messageResult = Sprite::handleMessage(messageNum, param, sender);
switch (messageNum) {
- case 0x100D:
+ case NM_ANIMATION_START:
if (param.asInteger() == 0x11001090) {
if (_isOpen)
_ssDoorLight->setVisible(true);
@@ -71,15 +71,15 @@ uint32 AsScene2201Door::handleMessage(int messageNum, const MessageParam &param,
_ssDoorLight->setVisible(false);
}
break;
- case 0x2000:
+ case NM_ANIMATION_UPDATE:
if (_isOpen)
_countdown = 144;
messageResult = _isOpen ? 1 : 0;
break;
- case 0x3002:
+ case NM_ANIMATION_STOP:
gotoNextState();
break;
- case 0x4808:
+ case NM_KLAYMEN_OPEN_DOOR:
_countdown = 144;
if (!_isOpen)
stOpenDoor();
@@ -317,7 +317,7 @@ void SsScene2202PuzzleCube::stopMoving() {
loadSprite(kSsScene2202PuzzleCubeFileHashes2[_cubeSymbol], kSLFCenteredDrawOffset);
SetSpriteUpdate(NULL);
_isMoving = false;
- sendMessage(_parentScene, 0x2002, _cubePosition);
+ sendMessage(_parentScene, NM_POSITION_CHANGE, _cubePosition);
}
static const uint32 kAsCommonKeyFileHashes[] = {
@@ -343,7 +343,7 @@ uint32 AsCommonKey::handleMessage(int messageNum, const MessageParam &param, Ent
sendMessage(_parentScene, 0x4826, 0);
messageResult = 1;
break;
- case 0x4806:
+ case NM_KLAYMEN_USE_OBJECT:
setSubVar(VA_HAS_KEY, _keyIndex, 1);
setVisible(false);
SetMessageHandler(NULL);
@@ -377,25 +377,25 @@ uint32 AsScene2203Door::handleMessage(int messageNum, const MessageParam &param,
switch (messageNum) {
case 0x1011:
if (_doorIndex == getGlobalVar(V_LARGE_DOOR_NUMBER))
- sendMessage(_parentScene, 0x2002, 0);
+ sendMessage(_parentScene, NM_POSITION_CHANGE, 0);
else
sendMessage(_parentScene, 0x2001, 0);
messageResult = 1;
break;
- case 0x2000:
+ case NM_ANIMATION_UPDATE:
_otherDoor = (Sprite*)param.asEntity();
break;
- case 0x3002:
+ case NM_ANIMATION_STOP:
if (_doorIndex == getGlobalVar(V_LARGE_DOOR_NUMBER))
- sendMessage(_parentScene, 0x4808, 0);
+ sendMessage(_parentScene, NM_KLAYMEN_OPEN_DOOR, 0);
stopAnimation();
break;
- case 0x4808:
+ case NM_KLAYMEN_OPEN_DOOR:
setGlobalVar(V_LARGE_DOOR_NUMBER, _doorIndex);
- sendMessage(_otherDoor, 0x4809, 0);
+ sendMessage(_otherDoor, NM_KLAYMEN_CLOSE_DOOR, 0);
openDoor();
break;
- case 0x4809:
+ case NM_KLAYMEN_CLOSE_DOOR:
closeDoor();
sendMessage(_parentScene, 0x2003, 0);
break;
@@ -425,7 +425,7 @@ SsScene2205DoorFrame::SsScene2205DoorFrame(NeverhoodEngine *vm)
uint32 SsScene2205DoorFrame::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
uint32 messageResult = Sprite::handleMessage(messageNum, param, sender);
switch (messageNum) {
- case 0x2000:
+ case NM_ANIMATION_UPDATE:
loadSprite(getGlobalVar(V_LIGHTS_ON) ? 0x24306227 : 0xD90032A0, kSLFDefDrawOffset | kSLFDefPosition);
break;
}
@@ -458,13 +458,13 @@ void AsScene2206DoorSpikes::update() {
uint32 AsScene2206DoorSpikes::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
uint32 messageResult = Sprite::handleMessage(messageNum, param, sender);
switch (messageNum) {
- case 0x4808:
+ case NM_KLAYMEN_OPEN_DOOR:
_deltaIndex = 0;
playSound(0, 0x032746E0);
SetMessageHandler(NULL);
SetSpriteUpdate(&AsScene2206DoorSpikes::suOpen);
break;
- case 0x4809:
+ case NM_KLAYMEN_CLOSE_DOOR:
_deltaIndex = 0;
playSound(0, 0x002642C0);
SetMessageHandler(NULL);
@@ -543,7 +543,7 @@ uint32 SsScene2206TestTube::handleMessage(int messageNum, const MessageParam &pa
sendMessage(_parentScene, 0x4826, 0);
messageResult = 1;
break;
- case 0x4806:
+ case NM_KLAYMEN_USE_OBJECT:
setGlobalVar(V_HAS_TEST_TUBE, 1);
setVisible(false);
SetMessageHandler(NULL);
@@ -607,9 +607,9 @@ void AsScene2207Elevator::update() {
}
if (_pointIndex > 20 && _surface->getPriority() != 900)
- sendMessage(_parentScene, 0x2002, 900);
+ sendMessage(_parentScene, NM_POSITION_CHANGE, 900);
else if (_pointIndex < 20 && _surface->getPriority() != 1100)
- sendMessage(_parentScene, 0x2002, 1100);
+ sendMessage(_parentScene, NM_POSITION_CHANGE, 1100);
AnimatedSprite::update();
@@ -629,7 +629,7 @@ void AsScene2207Elevator::suSetPosition() {
uint32 AsScene2207Elevator::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
uint32 messageResult = Sprite::handleMessage(messageNum, param, sender);
switch (messageNum) {
- case 0x2000:
+ case NM_ANIMATION_UPDATE:
moveToY(param.asInteger());
break;
}
@@ -685,21 +685,21 @@ uint32 AsScene2207Lever::handleMessage(int messageNum, const MessageParam &param
sendMessage(_parentScene, 0x4826, 0);
messageResult = 1;
break;
- case 0x3002:
+ case NM_ANIMATION_STOP:
gotoNextState();
stopAnimation();
break;
- case 0x4807:
+ case NM_KLAYMEN_RAISE_LEVER:
stLeverUp();
break;
- case 0x480F:
+ case NM_KLAYMEN_LOWER_LEVER:
stLeverDown();
break;
- case 0x482A:
- sendMessage(_parentScene, 0x1022, 990);
+ case NM_MOVE_TO_BACK:
+ sendMessage(_parentScene, NM_PRIORITY_CHANGE, 990);
break;
- case 0x482B:
- sendMessage(_parentScene, 0x1022, 1010);
+ case NM_MOVE_TO_FRONT:
+ sendMessage(_parentScene, NM_PRIORITY_CHANGE, 1010);
break;
}
return messageResult;
@@ -712,7 +712,7 @@ void AsScene2207Lever::stLeverDown() {
}
void AsScene2207Lever::stLeverDownEvent() {
- sendMessage(_parentScene, 0x480F, 0);
+ sendMessage(_parentScene, NM_KLAYMEN_LOWER_LEVER, 0);
}
void AsScene2207Lever::stLeverUp() {
@@ -723,7 +723,7 @@ void AsScene2207Lever::stLeverUp() {
}
void AsScene2207Lever::stLeverUpEvent() {
- sendMessage(_parentScene, 0x4807, 0);
+ sendMessage(_parentScene, NM_KLAYMEN_RAISE_LEVER, 0);
}
AsScene2207WallRobotAnimation::AsScene2207WallRobotAnimation(NeverhoodEngine *vm, Scene *parentScene)
@@ -748,7 +748,7 @@ AsScene2207WallRobotAnimation::~AsScene2207WallRobotAnimation() {
uint32 AsScene2207WallRobotAnimation::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
uint32 messageResult = Sprite::handleMessage(messageNum, param, sender);
switch (messageNum) {
- case 0x100D:
+ case NM_ANIMATION_START:
if (!_idle) {
if (param.asInteger() == 0x3423093) {
_vm->_soundMan->addSound(0x80D00820, 0x12121943);
@@ -769,13 +769,13 @@ uint32 AsScene2207WallRobotAnimation::handleMessage(int messageNum, const Messag
playSound(0, 0xE0702146);
}
break;
- case 0x2006:
+ case NM_KLAYMEN_STOP_CLIMBING:
stStartAnimation();
break;
- case 0x2007:
+ case NM_CAR_MOVE_TO_PREV_POINT:
stStopAnimation();
break;
- case 0x3002:
+ case NM_ANIMATION_STOP:
gotoNextState();
break;
}
@@ -822,13 +822,13 @@ AsScene2207WallCannonAnimation::AsScene2207WallCannonAnimation(NeverhoodEngine *
uint32 AsScene2207WallCannonAnimation::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
uint32 messageResult = Sprite::handleMessage(messageNum, param, sender);
switch (messageNum) {
- case 0x2006:
+ case NM_KLAYMEN_STOP_CLIMBING:
stStartAnimation();
break;
- case 0x2007:
+ case NM_CAR_MOVE_TO_PREV_POINT:
stStopAnimation();
break;
- case 0x3002:
+ case NM_ANIMATION_STOP:
gotoNextState();
break;
}
@@ -876,13 +876,13 @@ uint32 KmScene2201::xHandleMessage(int messageNum, const MessageParam &param) {
case 0x4800:
startWalkToX(param.asPoint().x, false);
break;
- case 0x4004:
+ case NM_KLAYMEN_STAND_IDLE:
GotoState(&Klaymen::stTryStandIdle);
break;
- case 0x4812:
+ case NM_KLAYMEN_PICKUP:
GotoState(&Klaymen::stPickUpGeneric);
break;
- case 0x4816:
+ case NM_KLAYMEN_PRESS_BUTTON:
if (param.asInteger() == 0)
GotoState(&Klaymen::stPressButtonSide);
break;
@@ -899,10 +899,10 @@ uint32 KmScene2201::xHandleMessage(int messageNum, const MessageParam &param) {
else
startWalkToAttachedSpriteXDistance(param.asPoint().x);
break;
- case 0x481D:
+ case NM_KLAYMEN_TURN_TO_USE:
GotoState(&Klaymen::stTurnToUse);
break;
- case 0x481E:
+ case NM_KLAYMEN_RETURN_FROM_USE:
GotoState(&Klaymen::stReturnFromUse);
break;
case 0x482D:
@@ -943,10 +943,10 @@ uint32 KmScene2203::xHandleMessage(int messageNum, const MessageParam &param) {
case 0x4800:
startWalkToX(param.asPoint().x, false);
break;
- case 0x4004:
+ case NM_KLAYMEN_STAND_IDLE:
GotoState(&Klaymen::stTryStandIdle);
break;
- case 0x4812:
+ case NM_KLAYMEN_PICKUP:
if (param.asInteger() == 2)
GotoState(&Klaymen::stPickUpNeedle);
else if (param.asInteger() == 1)
@@ -954,7 +954,7 @@ uint32 KmScene2203::xHandleMessage(int messageNum, const MessageParam &param) {
else
GotoState(&Klaymen::stPickUpGeneric);
break;
- case 0x4816:
+ case NM_KLAYMEN_PRESS_BUTTON:
if (param.asInteger() == 1)
GotoState(&Klaymen::stPressButton);
else if (param.asInteger() == 2)
@@ -972,7 +972,7 @@ uint32 KmScene2203::xHandleMessage(int messageNum, const MessageParam &param) {
case 0x4819:
GotoState(&KmScene2203::stClayDoorOpen);
break;
- case 0x481A:
+ case NM_KLAYMEN_INSERT_DISK:
GotoState(&Klaymen::stInsertDisk);
break;
case 0x481B:
@@ -981,10 +981,10 @@ uint32 KmScene2203::xHandleMessage(int messageNum, const MessageParam &param) {
else
startWalkToAttachedSpriteXDistance(param.asPoint().x);
break;
- case 0x481D:
+ case NM_KLAYMEN_TURN_TO_USE:
GotoState(&Klaymen::stTurnToUse);
break;
- case 0x481E:
+ case NM_KLAYMEN_RETURN_FROM_USE:
GotoState(&Klaymen::stReturnFromUse);
break;
case 0x482D:
@@ -1015,9 +1015,9 @@ void KmScene2203::stClayDoorOpen() {
uint32 KmScene2203::hmClayDoorOpen(int messageNum, const MessageParam &param, Entity *sender) {
uint32 messageResult = hmLowLevelAnimation(messageNum, param, sender);
switch (messageNum) {
- case 0x100D:
+ case NM_ANIMATION_START:
if (param.asInteger() == 0x040D4186) {
- sendMessage(_attachedSprite, 0x4808, 0);
+ sendMessage(_attachedSprite, NM_KLAYMEN_OPEN_DOOR, 0);
}
break;
}
@@ -1040,7 +1040,7 @@ uint32 KmScene2205::xHandleMessage(int messageNum, const MessageParam &param) {
case 0x4800:
startWalkToX(param.asPoint().x, false);
break;
- case 0x4004:
+ case NM_KLAYMEN_STAND_IDLE:
GotoState(&Klaymen::stTryStandIdle);
break;
case 0x4804:
@@ -1050,7 +1050,7 @@ uint32 KmScene2205::xHandleMessage(int messageNum, const MessageParam &param) {
} else
GotoState(&Klaymen::stPeekWall);
break;
- case 0x4816:
+ case NM_KLAYMEN_PRESS_BUTTON:
if (param.asInteger() == 0)
GotoState(&Klaymen::stPressButtonSide);
break;
@@ -1092,7 +1092,7 @@ uint32 KmScene2206::xHandleMessage(int messageNum, const MessageParam &param) {
case 0x4800:
startWalkToX(param.asPoint().x, false);
break;
- case 0x4004:
+ case NM_KLAYMEN_STAND_IDLE:
GotoState(&Klaymen::stTryStandIdle);
break;
case 0x4803:
@@ -1105,13 +1105,13 @@ uint32 KmScene2206::xHandleMessage(int messageNum, const MessageParam &param) {
} else
GotoState(&Klaymen::stPeekWall);
break;
- case 0x4812:
+ case NM_KLAYMEN_PICKUP:
if (param.asInteger() == 1)
GotoState(&Klaymen::stPickUpTube);
else
GotoState(&Klaymen::stPickUpGeneric);
break;
- case 0x4816:
+ case NM_KLAYMEN_PRESS_BUTTON:
if (param.asInteger() == 1)
GotoState(&Klaymen::stPressButton);
else if (param.asInteger() == 2)
@@ -1174,7 +1174,7 @@ void KmScene2206::suRidePlatformDown() {
_platformDeltaY++;
_y += _platformDeltaY;
if (_y > 600)
- sendMessage(this, 0x1019, 0);
+ sendMessage(this, NM_SCENE_LEAVE, 0);
}
void KmScene2206::stRidePlatformDown() {
@@ -1202,7 +1202,7 @@ uint32 KmScene2207::xHandleMessage(int messageNum, const MessageParam &param) {
case 0x2001:
GotoState(&Klaymen::stRidePlatform);
break;
- case 0x2005:
+ case NM_KLAYMEN_CLIMB_LADDER:
suRidePlatform();
GotoState(&Klaymen::stTryStandIdle);
break;
@@ -1210,16 +1210,16 @@ uint32 KmScene2207::xHandleMessage(int messageNum, const MessageParam &param) {
case 0x4800:
startWalkToX(param.asPoint().x, false);
break;
- case 0x4004:
+ case NM_KLAYMEN_STAND_IDLE:
GotoState(&Klaymen::stTryStandIdle);
break;
case 0x480D:
GotoState(&Klaymen::stInteractLever);
break;
- case 0x4812:
+ case NM_KLAYMEN_PICKUP:
GotoState(&Klaymen::stPickUpGeneric);
break;
- case 0x4816:
+ case NM_KLAYMEN_PRESS_BUTTON:
if (param.asInteger() == 1)
GotoState(&Klaymen::stPressButton);
else if (param.asInteger() == 2)
@@ -1237,7 +1237,7 @@ uint32 KmScene2207::xHandleMessage(int messageNum, const MessageParam &param) {
else
startWalkToAttachedSpriteXDistance(param.asPoint().x);
break;
- case 0x4827:
+ case NM_KLAYMEN_RELEASE_LEVER:
GotoState(&Klaymen::stReleaseLever);
break;
case 0x482D:
@@ -1270,7 +1270,7 @@ uint32 KmScene2242::xHandleMessage(int messageNum, const MessageParam &param) {
case 0x4800:
startWalkToX(param.asPoint().x, false);
break;
- case 0x4004:
+ case NM_KLAYMEN_STAND_IDLE:
GotoState(&Klaymen::stTryStandIdle);
break;
case 0x4804:
@@ -1280,7 +1280,7 @@ uint32 KmScene2242::xHandleMessage(int messageNum, const MessageParam &param) {
} else
GotoState(&Klaymen::stPeekWall);
break;
- case 0x4812:
+ case NM_KLAYMEN_PICKUP:
if (param.asInteger() == 2)
GotoState(&Klaymen::stPickUpNeedle);
else if (param.asInteger() == 1)
@@ -1336,7 +1336,7 @@ uint32 KmHallOfRecords::xHandleMessage(int messageNum, const MessageParam &param
case 0x4800:
startWalkToX(param.asPoint().x, false);
break;
- case 0x4004:
+ case NM_KLAYMEN_STAND_IDLE:
GotoState(&Klaymen::stTryStandIdle);
break;
case 0x4804:
@@ -1389,7 +1389,7 @@ uint32 KmScene2247::xHandleMessage(int messageNum, const MessageParam &param) {
case 0x4800:
startWalkToX(param.asPoint().x, false);
break;
- case 0x4004:
+ case NM_KLAYMEN_STAND_IDLE:
GotoState(&Klaymen::stTryStandIdle);
break;
case 0x4804:
diff --git a/engines/neverhood/modules/module2200_sprites.h b/engines/neverhood/modules/module2200_sprites.h
index 9aaf3b6aae..9327b1cb9f 100644
--- a/engines/neverhood/modules/module2200_sprites.h
+++ b/engines/neverhood/modules/module2200_sprites.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/neverhood/modules/module2300.cpp b/engines/neverhood/modules/module2300.cpp
index 689d53570f..68ae07f2bb 100644
--- a/engines/neverhood/modules/module2300.cpp
+++ b/engines/neverhood/modules/module2300.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -31,14 +31,14 @@ static const uint32 kModule2300SoundList[] = {
};
Module2300::Module2300(NeverhoodEngine *vm, Module *parentModule, int which)
- : Module(vm, parentModule), _soundVolume(0) {
+ : Module(vm, parentModule), _waterfallSoundVolume(0) {
_vm->_soundMan->addSoundList(0x1A214010, kModule2300SoundList);
_vm->_soundMan->setSoundListParams(kModule2300SoundList, true, 50, 600, 10, 150);
- _isWallBroken = getGlobalVar(V_WALL_BROKEN) != 0;
+ _isWaterfallRunning = getGlobalVar(V_WALL_BROKEN) != 1;
- if (_isWallBroken) {
+ if (_isWaterfallRunning) {
_vm->_soundMan->setSoundVolume(0x90F0D1C3, 0);
_vm->_soundMan->playSoundLooping(0x90F0D1C3);
} else {
@@ -78,8 +78,8 @@ void Module2300::createScene(int sceneNum, int which) {
case 1:
_vm->gameState().sceneNum = 1;
createNavigationScene(0x004B67E8, which);
- if (_isWallBroken) {
- _soundVolume = 15;
+ if (_isWaterfallRunning) {
+ _waterfallSoundVolume = 15;
_vm->_soundMan->setSoundVolume(0x90F0D1C3, 15);
}
break;
@@ -92,10 +92,10 @@ void Module2300::createScene(int sceneNum, int which) {
if (getGlobalVar(V_WALL_BROKEN))
createNavigationScene(0x004B68F0, which);
else {
- _vm->_soundMan->setSoundVolume(0x90F0D1C3, _soundVolume);
+ _vm->_soundMan->setSoundVolume(0x90F0D1C3, _waterfallSoundVolume);
createNavigationScene(0x004B68A8, which);
- if (_isWallBroken) {
- _soundVolume = 87;
+ if (_isWaterfallRunning) {
+ _waterfallSoundVolume = 87;
_vm->_soundMan->setSoundVolume(0x90F0D1C3, 87);
}
}
@@ -161,10 +161,10 @@ void Module2300::updateScene() {
} else {
switch (_sceneNum) {
case 1:
- if (_isWallBroken && navigationScene()->isWalkingForward() && navigationScene()->getNavigationIndex() == 4 &&
+ if (_isWaterfallRunning && navigationScene()->isWalkingForward() && navigationScene()->getNavigationIndex() == 4 &&
navigationScene()->getFrameNumber() % 2) {
- _soundVolume++;
- _vm->_soundMan->setSoundVolume(0x90F0D1C3, _soundVolume);
+ _waterfallSoundVolume++;
+ _vm->_soundMan->setSoundVolume(0x90F0D1C3, _waterfallSoundVolume);
}
if (navigationScene()->isWalkingForward() && navigationScene()->getNavigationIndex() == 0 &&
navigationScene()->getFrameNumber() == 50) {
@@ -174,9 +174,9 @@ void Module2300::updateScene() {
}
break;
case 3:
- if (_isWallBroken && navigationScene()->isWalkingForward() && navigationScene()->getFrameNumber() % 2) {
- _soundVolume--;
- _vm->_soundMan->setSoundVolume(0x90F0D1C3, _soundVolume);
+ if (_isWaterfallRunning && navigationScene()->isWalkingForward() && navigationScene()->getFrameNumber() % 2) {
+ _waterfallSoundVolume--;
+ _vm->_soundMan->setSoundVolume(0x90F0D1C3, _waterfallSoundVolume);
}
break;
}
diff --git a/engines/neverhood/modules/module2300.h b/engines/neverhood/modules/module2300.h
index 0a1e1d57a4..58bffb710c 100644
--- a/engines/neverhood/modules/module2300.h
+++ b/engines/neverhood/modules/module2300.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -37,8 +37,8 @@ public:
virtual ~Module2300();
protected:
int _sceneNum;
- bool _isWallBroken;
- int _soundVolume;
+ int _waterfallSoundVolume;
+ bool _isWaterfallRunning;
void createScene(int sceneNum, int which);
void updateScene();
};
diff --git a/engines/neverhood/modules/module2400.cpp b/engines/neverhood/modules/module2400.cpp
index dab39b24f6..3acb952db9 100644
--- a/engines/neverhood/modules/module2400.cpp
+++ b/engines/neverhood/modules/module2400.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -253,11 +253,11 @@ void Scene2401::update() {
if (puzzleSolved) {
setGlobalVar(V_NOTES_DOOR_UNLOCKED, 1);
setGlobalVar(V_NOTES_PUZZLE_SOLVED, 1);
- sendMessage(_asDoor, 0x4808, 0);
+ sendMessage(_asDoor, NM_KLAYMEN_OPEN_DOOR, 0);
} else if (waterInside) {
playPipeSound(0xD0431020);
for (uint i = 0; i < 5; i++) {
- sendMessage(_asWaterFlushing[i], 0x2002, getSubVar(VA_CURR_WATER_PIPES_LEVEL, i));
+ sendMessage(_asWaterFlushing[i], NM_POSITION_CHANGE, getSubVar(VA_CURR_WATER_PIPES_LEVEL, i));
setSubVar(VA_CURR_WATER_PIPES_LEVEL, i, 0);
}
}
@@ -283,7 +283,7 @@ void Scene2401::update() {
uint32 Scene2401::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
uint32 messageResult = Scene::handleMessage(messageNum, param, sender);
switch (messageNum) {
- case 0x100D:
+ case NM_ANIMATION_START:
if (param.asInteger() == 0x402064D8)
sendEntityMessage(_klaymen, 0x1014, _ssButton);
else if (param.asInteger() == 0x02144CB1)
@@ -313,7 +313,7 @@ uint32 Scene2401::handleMessage(int messageNum, const MessageParam &param, Entit
} else if (param.asInteger() == 0x09C4B40A && _countdown2 > 12)
_countdown2 = 12;
break;
- case 0x2000:
+ case NM_ANIMATION_UPDATE:
messageResult = 0;
for (uint32 i = 0; i < 5; i++)
if (kScene2401Rects[i].contains(_mouseClickPos.x, _mouseClickPos.y)) {
@@ -334,15 +334,15 @@ uint32 Scene2401::handleMessage(int messageNum, const MessageParam &param, Entit
_countdown1 = 8;
} else if (sender == _ssFloorButton && getGlobalVar(V_WATER_RUNNING)) {
_countdown2 = 144;
- sendMessage(_asFlowingWater, 0x2002, 0);
+ sendMessage(_asFlowingWater, NM_POSITION_CHANGE, 0);
playSound(0, 0xE1130324);
}
break;
- case 0x482A:
+ case NM_MOVE_TO_BACK:
_palette->addBasePalette(0xB103B604, 0, 65, 0);
_palette->startFadeToPalette(12);
break;
- case 0x482B:
+ case NM_MOVE_TO_FRONT:
_palette->addBasePalette(0x91D3A391, 0, 65, 0);
_palette->startFadeToPalette(12);
break;
@@ -411,7 +411,7 @@ Scene2402::~Scene2402() {
void Scene2402::update() {
if (_countdown != 0 && (--_countdown) == 0) {
if (_pipeStatus >= 10) {
- sendMessage(_asDoor, 0x4808, 0);
+ sendMessage(_asDoor, NM_KLAYMEN_OPEN_DOOR, 0);
_ssDoorFrame->loadSprite(0x00B415E0, kSLFDefDrawOffset | kSLFDefPosition);
} else if (_pipeStatus >= 5) {
_countdown = 8;
@@ -428,7 +428,7 @@ void Scene2402::update() {
uint32 Scene2402::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
uint32 messageResult = Scene::handleMessage(messageNum, param, sender);
switch (messageNum) {
- case 0x100D:
+ case NM_ANIMATION_START:
if (param.asInteger() == 0x402064D8)
sendEntityMessage(_klaymen, 0x1014, _ssButton);
else if (param.asInteger() == 0x01C66840) {
@@ -516,13 +516,13 @@ Scene2403::Scene2403(NeverhoodEngine *vm, Module *parentModule, int which)
uint32 Scene2403::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
uint32 messageResult = Scene::handleMessage(messageNum, param, sender);
switch (messageNum) {
- case 0x100D:
+ case NM_ANIMATION_START:
if (param.asInteger() == 0x040424D0)
sendEntityMessage(_klaymen, 0x1014, _ssButton);
else if (param.asInteger() == 0x180CE614)
sendEntityMessage(_klaymen, 0x1014, _asLightCord);
break;
- case 0x2000:
+ case NM_ANIMATION_UPDATE:
_isClimbingLadder = true;
setRectList(0x004B5E28);
break;
@@ -541,7 +541,7 @@ uint32 Scene2403::handleMessage(int messageNum, const MessageParam &param, Entit
}
}
break;
- case 0x480F:
+ case NM_KLAYMEN_LOWER_LEVER:
if (sender == _asLightCord)
leaveScene(2);
break;
@@ -637,7 +637,7 @@ Scene2406::Scene2406(NeverhoodEngine *vm, Module *parentModule, int which)
uint32 Scene2406::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
uint32 messageResult = Scene::handleMessage(messageNum, param, sender);
switch (messageNum) {
- case 0x100D:
+ case NM_ANIMATION_START:
if (param.asInteger() == 0x41062804) {
if (getGlobalVar(V_SPIKES_RETRACTED))
setMessageList(0x004B7758);
@@ -645,7 +645,7 @@ uint32 Scene2406::handleMessage(int messageNum, const MessageParam &param, Entit
setMessageList(0x004B7738);
}
break;
- case 0x2000:
+ case NM_ANIMATION_UPDATE:
_isClimbingLadder = true;
setRectList(0x004B78D8);
break;
diff --git a/engines/neverhood/modules/module2400.h b/engines/neverhood/modules/module2400.h
index 61603f3e00..0ab56dd86a 100644
--- a/engines/neverhood/modules/module2400.h
+++ b/engines/neverhood/modules/module2400.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/neverhood/modules/module2400_sprites.cpp b/engines/neverhood/modules/module2400_sprites.cpp
index bf85b0dc37..f31fd59907 100644
--- a/engines/neverhood/modules/module2400_sprites.cpp
+++ b/engines/neverhood/modules/module2400_sprites.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -49,11 +49,11 @@ AsScene2401WaterSpit::AsScene2401WaterSpit(NeverhoodEngine *vm)
uint32 AsScene2401WaterSpit::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
uint32 messageResult = Sprite::handleMessage(messageNum, param, sender);
switch (messageNum) {
- case 0x100D:
+ case NM_ANIMATION_START:
if (param.asInteger() == 0x120A0013)
playSound(0, kAsScene2401WaterSpitFileHashes1[_soundIndex]);
break;
- case 0x2000:
+ case NM_ANIMATION_UPDATE:
_x = 240;
_y = 447;
_soundIndex = getSubVar(VA_CURR_WATER_PIPES_LEVEL, param.asInteger());
@@ -61,7 +61,7 @@ uint32 AsScene2401WaterSpit::handleMessage(int messageNum, const MessageParam &p
setVisible(true);
playSound(0, 0x48640244);
break;
- case 0x3002:
+ case NM_ANIMATION_STOP:
stopAnimation();
setVisible(false);
break;
@@ -87,11 +87,11 @@ AsScene2401FlowingWater::~AsScene2401FlowingWater() {
uint32 AsScene2401FlowingWater::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
uint32 messageResult = Sprite::handleMessage(messageNum, param, sender);
switch (messageNum) {
- case 0x100D:
+ case NM_ANIMATION_START:
if (_isWaterFlowing && param.asInteger() == 0x02421405)
startAnimationByHash(0x10203116, 0x01084280, 0);
break;
- case 0x2002:
+ case NM_POSITION_CHANGE:
if (!_isWaterFlowing) {
_vm->_soundMan->addSound(0x40F11C09, 0x980C1420);
_vm->_soundMan->playSoundLooping(0x980C1420);
@@ -104,7 +104,7 @@ uint32 AsScene2401FlowingWater::handleMessage(int messageNum, const MessageParam
_vm->_soundMan->deleteSound(0x980C1420);
_isWaterFlowing = false;
break;
- case 0x3002:
+ case NM_ANIMATION_STOP:
stopAnimation();
setVisible(false);
break;
@@ -135,19 +135,19 @@ void AsScene2401WaterFlushing::update() {
uint32 AsScene2401WaterFlushing::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
uint32 messageResult = Sprite::handleMessage(messageNum, param, sender);
switch (messageNum) {
- case 0x100D:
+ case NM_ANIMATION_START:
if (_flushLoopCount > 0 && param.asInteger() == 0x02421405) {
startAnimationByHash(0xB8596884, 0x01084280, 0);
_flushLoopCount--;
}
break;
- case 0x2002:
+ case NM_POSITION_CHANGE:
if (param.asInteger() > 0) {
_flushLoopCount = param.asInteger() - 1;
_countdown = _vm->_rnd->getRandomNumber(3) + 1;
}
break;
- case 0x3002:
+ case NM_ANIMATION_STOP:
stopAnimation();
setVisible(false);
break;
@@ -194,10 +194,10 @@ uint32 AsScene2401Door::handleMessage(int messageNum, const MessageParam &param,
_countdown = 168;
messageResult = _isOpen ? 1 : 0;
break;
- case 0x3002:
+ case NM_ANIMATION_STOP:
gotoNextState();
break;
- case 0x4808:
+ case NM_KLAYMEN_OPEN_DOOR:
if (!_isOpen) {
_countdown = 168;
_isOpen = true;
@@ -249,15 +249,15 @@ void AsScene2402Door::update() {
uint32 AsScene2402Door::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
uint32 messageResult = Sprite::handleMessage(messageNum, param, sender);
switch (messageNum) {
- case 0x2000:
+ case NM_ANIMATION_UPDATE:
if (_isOpen)
_countdown = 144;
messageResult = _isOpen ? 1 : 0;
break;
- case 0x3002:
+ case NM_ANIMATION_STOP:
gotoNextState();
break;
- case 0x4808:
+ case NM_KLAYMEN_OPEN_DOOR:
_countdown = 144;
_isOpen = true;
setVisible(true);
@@ -342,11 +342,11 @@ void AsScene2402TV::stJokeFinished() {
uint32 AsScene2402TV::hmJoke(int messageNum, const MessageParam &param, Entity *sender) {
uint32 messageResult = Sprite::handleMessage(messageNum, param, sender);
switch (messageNum) {
- case 0x100D:
+ case NM_ANIMATION_START:
if (param.asInteger() == 0x431EA0B0)
playSound(0);
break;
- case 0x3002:
+ case NM_ANIMATION_STOP:
gotoNextState();
break;
}
@@ -368,10 +368,10 @@ uint32 KmScene2401::xHandleMessage(int messageNum, const MessageParam &param) {
case 0x4800:
startWalkToX(param.asPoint().x, false);
break;
- case 0x4004:
+ case NM_KLAYMEN_STAND_IDLE:
GotoState(&Klaymen::stTryStandIdle);
break;
- case 0x4816:
+ case NM_KLAYMEN_PRESS_BUTTON:
if (param.asInteger() == 1)
GotoState(&Klaymen::stPressButton);
else if (param.asInteger() == 2)
@@ -437,7 +437,7 @@ uint32 KmScene2401::xHandleMessage(int messageNum, const MessageParam &param) {
uint32 KmScene2401::hmSpit(int messageNum, const MessageParam &param, Entity *sender) {
uint32 messageResult = Klaymen::hmLowLevelAnimation(messageNum, param, sender);
switch (messageNum) {
- case 0x100D:
+ case NM_ANIMATION_START:
if (param.asInteger() == 0x16401CA6) {
_canSpitPipe = true;
if (_contSpitPipe)
@@ -508,7 +508,7 @@ uint32 KmScene2402::xHandleMessage(int messageNum, const MessageParam &param) {
case 0x4800:
startWalkToX(param.asPoint().x, false);
break;
- case 0x4004:
+ case NM_KLAYMEN_STAND_IDLE:
if (!getGlobalVar(V_TV_JOKE_TOLD))
GotoState(&Klaymen::stStandWonderAbout);
else
@@ -521,10 +521,10 @@ uint32 KmScene2402::xHandleMessage(int messageNum, const MessageParam &param) {
} else
GotoState(&Klaymen::stPeekWall);
break;
- case 0x4812:
+ case NM_KLAYMEN_PICKUP:
GotoState(&Klaymen::stPickUpGeneric);
break;
- case 0x4816:
+ case NM_KLAYMEN_PRESS_BUTTON:
if (param.asInteger() == 1)
GotoState(&Klaymen::stPressButton);
else if (param.asInteger() == 2)
@@ -577,16 +577,16 @@ uint32 KmScene2403::xHandleMessage(int messageNum, const MessageParam &param) {
case 0x4800:
startWalkToX(param.asPoint().x, false);
break;
- case 0x4004:
+ case NM_KLAYMEN_STAND_IDLE:
GotoState(&Klaymen::stTryStandIdle);
break;
case 0x480D:
GotoState(&Klaymen::stPullCord);
break;
- case 0x4812:
+ case NM_KLAYMEN_PICKUP:
GotoState(&Klaymen::stPickUpGeneric);
break;
- case 0x4816:
+ case NM_KLAYMEN_PRESS_BUTTON:
if (param.asInteger() == 1)
GotoState(&Klaymen::stPressButton);
else if (param.asInteger() == 2)
@@ -661,7 +661,7 @@ uint32 KmScene2406::xHandleMessage(int messageNum, const MessageParam &param) {
case 0x4800:
startWalkToX(param.asPoint().x, false);
break;
- case 0x4004:
+ case NM_KLAYMEN_STAND_IDLE:
GotoState(&Klaymen::stTryStandIdle);
break;
case 0x4804:
@@ -671,7 +671,7 @@ uint32 KmScene2406::xHandleMessage(int messageNum, const MessageParam &param) {
} else
GotoState(&Klaymen::stPeekWall);
break;
- case 0x4812:
+ case NM_KLAYMEN_PICKUP:
if (param.asInteger() == 2)
GotoState(&Klaymen::stPickUpNeedle);
else if (param.asInteger() == 1)
@@ -683,7 +683,7 @@ uint32 KmScene2406::xHandleMessage(int messageNum, const MessageParam &param) {
setDoDeltaX(param.asInteger());
gotoNextStateExt();
break;
- case 0x481A:
+ case NM_KLAYMEN_INSERT_DISK:
GotoState(&Klaymen::stInsertDisk);
break;
case 0x481B:
@@ -692,10 +692,10 @@ uint32 KmScene2406::xHandleMessage(int messageNum, const MessageParam &param) {
else
startWalkToAttachedSpriteXDistance(param.asPoint().x);
break;
- case 0x481D:
+ case NM_KLAYMEN_TURN_TO_USE:
GotoState(&Klaymen::stTurnToUse);
break;
- case 0x481E:
+ case NM_KLAYMEN_RETURN_FROM_USE:
GotoState(&Klaymen::stReturnFromUse);
break;
case 0x481F:
diff --git a/engines/neverhood/modules/module2400_sprites.h b/engines/neverhood/modules/module2400_sprites.h
index a901eb101c..5d9464af13 100644
--- a/engines/neverhood/modules/module2400_sprites.h
+++ b/engines/neverhood/modules/module2400_sprites.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/neverhood/modules/module2500.cpp b/engines/neverhood/modules/module2500.cpp
index d0e60adf65..7e93b0ebc0 100644
--- a/engines/neverhood/modules/module2500.cpp
+++ b/engines/neverhood/modules/module2500.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -252,7 +252,7 @@ Scene2501::Scene2501(NeverhoodEngine *vm, Module *parentModule, int which)
setRectList(0x004B2608);
SetMessageHandler(&Scene2501::handleMessage);
SetUpdateHandler(&Scene2501::update);
- sendMessage(_asCar, 0x2009, 0);
+ sendMessage(_asCar, NM_CAR_ENTER, 0);
_asCar->setVisible(false);
_currTrackIndex = 0;
} else if (which == 1 || which == 2) {
@@ -277,7 +277,7 @@ Scene2501::Scene2501(NeverhoodEngine *vm, Module *parentModule, int which)
setRectList(0x004B2608);
SetMessageHandler(&Scene2501::handleMessage);
SetUpdateHandler(&Scene2501::update);
- sendMessage(_asCar, 0x2009, 0);
+ sendMessage(_asCar, NM_CAR_ENTER, 0);
_asCar->setVisible(false);
_currTrackIndex = 0;
}
@@ -295,14 +295,14 @@ Scene2501::Scene2501(NeverhoodEngine *vm, Module *parentModule, int which)
if (which >= 0 && _tracks[_currTrackIndex]->which2 == which) {
NPoint testPoint = (*_trackPoints)[_trackPoints->size() - 1];
- sendMessage(_asCar, 0x2002, _trackPoints->size() - 1);
+ sendMessage(_asCar, NM_POSITION_CHANGE, _trackPoints->size() - 1);
if (testPoint.x < 0 || testPoint.x >= 640 || testPoint.y < 0 || testPoint.y >= 480)
- sendMessage(_asCar, 0x2007, 150);
+ sendMessage(_asCar, NM_CAR_MOVE_TO_PREV_POINT, 150);
} else {
NPoint testPoint = (*_trackPoints)[0];
- sendMessage(_asCar, 0x2002, 0);
+ sendMessage(_asCar, NM_POSITION_CHANGE, 0);
if (testPoint.x < 0 || testPoint.x >= 640 || testPoint.y < 0 || testPoint.y >= 480)
- sendMessage(_asCar, 0x2008, 150);
+ sendMessage(_asCar, NM_CAR_MOVE_TO_NEXT_POINT, 150);
}
_carStatus = 0;
@@ -329,7 +329,7 @@ void Scene2501::update() {
_asIdleCarLower->setVisible(false);
_asIdleCarFull->setVisible(false);
_asCar->setVisible(true);
- sendMessage(_asCar, 0x2009, 0);
+ sendMessage(_asCar, NM_CAR_ENTER, 0);
_asCar->handleUpdate();
_klaymen = NULL;
_carStatus = 0;
@@ -341,7 +341,7 @@ void Scene2501::upCarAtHome() {
Scene::update();
if (_mouseClicked) {
if (_mouseClickPos.x <= 210 && _asCar->getX() == 211 && _asCar->getY() == 400) {
- sendMessage(_asCar, 0x200A, 0);
+ sendMessage(_asCar, NM_CAR_LEAVE, 0);
SetUpdateHandler(&Scene2501::upGettingOutOfCar);
} else {
moveCarToPoint(_mouseClickPos);
@@ -385,7 +385,7 @@ void Scene2501::upRidingCar() {
uint32 Scene2501::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
uint32 messageResult = Scene::handleMessage(messageNum, param, sender);
switch (messageNum) {
- case 0x100D:
+ case NM_ANIMATION_START:
if (param.asInteger() == 0x60842040)
_carStatus = 1;
break;
@@ -399,23 +399,23 @@ uint32 Scene2501::handleMessage(int messageNum, const MessageParam &param, Entit
uint32 Scene2501::hmRidingCar(int messageNum, const MessageParam &param, Entity *sender) {
uint32 messageResult = Scene::handleMessage(messageNum, param, sender);
switch (messageNum) {
- case 0x2005:
+ case NM_KLAYMEN_CLIMB_LADDER:
if (_tracks[_currTrackIndex]->which1 < 0 && _newTrackIndex >= 0)
changeTrack();
else if (_tracks[_currTrackIndex]->which1 == 0) {
SetMessageHandler(&Scene2501::hmCarAtHome);
SetUpdateHandler(&Scene2501::upCarAtHome);
- sendMessage(_asCar, 0x200F, 1);
+ sendMessage(_asCar, NM_CAR_AT_HOME, 1);
} else if (_tracks[_currTrackIndex]->which1 > 0)
leaveScene(_tracks[_currTrackIndex]->which1);
break;
- case 0x2006:
+ case NM_KLAYMEN_STOP_CLIMBING:
if (_tracks[_currTrackIndex]->which2 < 0 && _newTrackIndex >= 0)
changeTrack();
else if (_tracks[_currTrackIndex]->which2 == 0) {
SetMessageHandler(&Scene2501::hmCarAtHome);
SetUpdateHandler(&Scene2501::upCarAtHome);
- sendMessage(_asCar, 0x200F, 1);
+ sendMessage(_asCar, NM_CAR_AT_HOME, 1);
} else if (_tracks[_currTrackIndex]->which2 > 0)
leaveScene(_tracks[_currTrackIndex]->which2);
break;
@@ -429,7 +429,7 @@ uint32 Scene2501::hmRidingCar(int messageNum, const MessageParam &param, Entity
uint32 Scene2501::hmCarAtHome(int messageNum, const MessageParam &param, Entity *sender) {
uint32 messageResult = Scene::handleMessage(messageNum, param, sender);
switch (messageNum) {
- case 0x200A:
+ case NM_CAR_LEAVE:
_carStatus = 2;
break;
case 0x200D:
@@ -460,9 +460,9 @@ void Scene2501::changeTrack() {
_trackPoints = _dataResource.getPointArray(_tracks[_currTrackIndex]->trackPointsName);
_asCar->setPathPoints(_trackPoints);
if (_currTrackIndex == 0)
- sendMessage(_asCar, 0x2002, _trackPoints->size() - 1);
+ sendMessage(_asCar, NM_POSITION_CHANGE, _trackPoints->size() - 1);
else
- sendMessage(_asCar, 0x2002, 0);
+ sendMessage(_asCar, NM_POSITION_CHANGE, 0);
sendPointMessage(_asCar, 0x2004, _clickPoint);
_newTrackIndex = -1;
}
@@ -491,7 +491,7 @@ Scene2504::Scene2504(NeverhoodEngine *vm, Module *parentModule, int which)
uint32 Scene2504::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
uint32 messageResult = Scene::handleMessage(messageNum, param, sender);
switch (messageNum) {
- case 0x0001:
+ case NM_MOUSE_CLICK:
if (param.asPoint().x <= 20 || param.asPoint().x >= 620)
leaveScene(0);
break;
diff --git a/engines/neverhood/modules/module2500.h b/engines/neverhood/modules/module2500.h
index de6226ef0c..57ab22889a 100644
--- a/engines/neverhood/modules/module2500.h
+++ b/engines/neverhood/modules/module2500.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/neverhood/modules/module2500_sprites.cpp b/engines/neverhood/modules/module2500_sprites.cpp
index ab6b3dcfbe..b628cd8f02 100644
--- a/engines/neverhood/modules/module2500_sprites.cpp
+++ b/engines/neverhood/modules/module2500_sprites.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -81,7 +81,7 @@ KmScene2501::KmScene2501(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16
uint32 KmScene2501::xHandleMessage(int messageNum, const MessageParam &param) {
uint32 messageResult = 0;
switch (messageNum) {
- case 0x2000:
+ case NM_ANIMATION_UPDATE:
_isSittingInTeleporter = param.asInteger() != 0;
messageResult = 1;
break;
@@ -89,7 +89,7 @@ uint32 KmScene2501::xHandleMessage(int messageNum, const MessageParam &param) {
case 0x4800:
startWalkToX(param.asPoint().x, false);
break;
- case 0x4004:
+ case NM_KLAYMEN_STAND_IDLE:
if (_isSittingInTeleporter)
GotoState(&Klaymen::stSitIdleTeleporter);
else
@@ -99,11 +99,11 @@ uint32 KmScene2501::xHandleMessage(int messageNum, const MessageParam &param) {
setDoDeltaX(param.asInteger());
gotoNextStateExt();
break;
- case 0x481D:
+ case NM_KLAYMEN_TURN_TO_USE:
if (_isSittingInTeleporter)
GotoState(&Klaymen::stTurnToUseInTeleporter);
break;
- case 0x481E:
+ case NM_KLAYMEN_RETURN_FROM_USE:
if (_isSittingInTeleporter)
GotoState(&Klaymen::stReturnFromUseInTeleporter);
break;
diff --git a/engines/neverhood/modules/module2500_sprites.h b/engines/neverhood/modules/module2500_sprites.h
index e7f7b05702..b5c2a1ac01 100644
--- a/engines/neverhood/modules/module2500_sprites.h
+++ b/engines/neverhood/modules/module2500_sprites.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/neverhood/modules/module2600.cpp b/engines/neverhood/modules/module2600.cpp
index a6484a4926..d0f6090ea8 100644
--- a/engines/neverhood/modules/module2600.cpp
+++ b/engines/neverhood/modules/module2600.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -239,20 +239,20 @@ Scene2609::Scene2609(NeverhoodEngine *vm, Module *parentModule, int which)
uint32 Scene2609::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
Scene::handleMessage(messageNum, param, sender);
switch (messageNum) {
- case 0x0001:
+ case NM_MOUSE_CLICK:
if ((param.asPoint().x <= 20 || param.asPoint().x >= 620) && !_isBusy)
leaveScene(0);
break;
- case 0x2000:
+ case NM_ANIMATION_UPDATE:
_isBusy = true;
break;
case 0x2001:
_isBusy = false;
sendMessage(_asWater, 0x2001, 0);
break;
- case 0x2002:
+ case NM_POSITION_CHANGE:
_isBusy = false;
- sendMessage(_asWater, 0x2002, 0);
+ sendMessage(_asWater, NM_POSITION_CHANGE, 0);
break;
}
return 0;
diff --git a/engines/neverhood/modules/module2600.h b/engines/neverhood/modules/module2600.h
index 99ec3a34ca..0f13ed4b09 100644
--- a/engines/neverhood/modules/module2600.h
+++ b/engines/neverhood/modules/module2600.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/neverhood/modules/module2600_sprites.cpp b/engines/neverhood/modules/module2600_sprites.cpp
index 2c24b533f3..ffba6a4e59 100644
--- a/engines/neverhood/modules/module2600_sprites.cpp
+++ b/engines/neverhood/modules/module2600_sprites.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -47,7 +47,7 @@ void SsScene2609Button::update() {
sendMessage(_parentScene, 0x2001, 0);
} else {
setGlobalVar(V_WATER_RUNNING, 1);
- sendMessage(_parentScene, 0x2002, 0);
+ sendMessage(_parentScene, NM_POSITION_CHANGE, 0);
}
}
}
@@ -88,7 +88,7 @@ AsScene2609Water::AsScene2609Water(NeverhoodEngine *vm)
SetUpdateHandler(&AnimatedSprite::update);
SetMessageHandler(&AsScene2609Water::handleMessage);
if (getGlobalVar(V_WATER_RUNNING))
- sendMessage(this, 0x2002, 0);
+ sendMessage(this, NM_POSITION_CHANGE, 0);
}
AsScene2609Water::~AsScene2609Water() {
@@ -103,7 +103,7 @@ uint32 AsScene2609Water::handleMessage(int messageNum, const MessageParam &param
setVisible(false);
_vm->_soundMan->stopSound(0xDC2769B0);
break;
- case 0x2002:
+ case NM_POSITION_CHANGE:
startAnimation(0x9C210C90, 0, -1);
setVisible(true);
_vm->_soundMan->playSoundLooping(0xDC2769B0);
diff --git a/engines/neverhood/modules/module2600_sprites.h b/engines/neverhood/modules/module2600_sprites.h
index c36e72cae8..0b4954ceb1 100644
--- a/engines/neverhood/modules/module2600_sprites.h
+++ b/engines/neverhood/modules/module2600_sprites.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/neverhood/modules/module2700.cpp b/engines/neverhood/modules/module2700.cpp
index 1b78615fdb..a510c02558 100644
--- a/engines/neverhood/modules/module2700.cpp
+++ b/engines/neverhood/modules/module2700.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -84,7 +84,7 @@ static const uint32 kScene2725StaticSprites[] = {
};
Module2700::Module2700(NeverhoodEngine *vm, Module *parentModule, int which)
- : Module(vm, parentModule), _soundIndex(0), _radioMusicInitialized(false) {
+ : Module(vm, parentModule), _soundIndex(0), _radioMusicInitialized(false), _musicFileHash(0) {
_vm->_soundMan->addMusic(0x42212411, 0x04020210);
_vm->_soundMan->startMusic(0x04020210, 24, 2);
@@ -461,6 +461,7 @@ void Module2700::updateScene() {
_vm->_soundMan->deleteMusic(_musicFileHash);
_vm->_soundMan->startMusic(0x04020210, 0, 2);
_vm->_soundMan->deleteSoundGroup(0x42212411);
+ _radioMusicInitialized = false;
createScene(20, 3);
break;
case 22:
@@ -576,14 +577,14 @@ Scene2701::Scene2701(NeverhoodEngine *vm, Module *parentModule, int which)
if (which == _which2) {
NPoint testPoint = (*_trackPoints)[_trackPoints->size() - 1];
- sendMessage(_asCar, 0x2002, _trackPoints->size() - 1);
+ sendMessage(_asCar, NM_POSITION_CHANGE, _trackPoints->size() - 1);
if (testPoint.x < 0 || testPoint.x >= 640 || testPoint.y < 0 || testPoint.y >= 480)
- sendMessage(_asCar, 0x2007, 150);
+ sendMessage(_asCar, NM_CAR_MOVE_TO_PREV_POINT, 150);
} else {
NPoint testPoint = (*_trackPoints)[0];
- sendMessage(_asCar, 0x2002, 0);
+ sendMessage(_asCar, NM_POSITION_CHANGE, 0);
if (testPoint.x < 0 || testPoint.x >= 640 || testPoint.y < 0 || testPoint.y >= 480)
- sendMessage(_asCar, 0x2008, 150);
+ sendMessage(_asCar, NM_CAR_MOVE_TO_NEXT_POINT, 150);
}
_asCar->setClipRect(clipRect);
@@ -592,7 +593,7 @@ Scene2701::Scene2701(NeverhoodEngine *vm, Module *parentModule, int which)
if (which == 1) {
SetMessageHandler(&Scene2701::hmRidingCar);
} else {
- sendMessage(_asCar, 0x2009, 0);
+ sendMessage(_asCar, NM_CAR_ENTER, 0);
SetMessageHandler(&Scene2701::hmCarAtHome);
}
@@ -601,14 +602,14 @@ Scene2701::Scene2701(NeverhoodEngine *vm, Module *parentModule, int which)
uint32 Scene2701::hmRidingCar(int messageNum, const MessageParam &param, Entity *sender) {
Scene::handleMessage(messageNum, param, sender);
switch (messageNum) {
- case 0x0001:
+ case NM_MOUSE_CLICK:
sendPointMessage(_asCar, 0x2004, param.asPoint());
break;
- case 0x2005:
+ case NM_KLAYMEN_CLIMB_LADDER:
if (_which1 >= 0)
SetMessageHandler(&Scene2701::hmCarAtHome);
break;
- case 0x2006:
+ case NM_KLAYMEN_STOP_CLIMBING:
if (_which2 >= 0)
leaveScene(_which2);
break;
@@ -622,7 +623,7 @@ uint32 Scene2701::hmRidingCar(int messageNum, const MessageParam &param, Entity
uint32 Scene2701::hmCarAtHome(int messageNum, const MessageParam &param, Entity *sender) {
Scene::handleMessage(messageNum, param, sender);
switch (messageNum) {
- case 0x0001:
+ case NM_MOUSE_CLICK:
if (param.asPoint().x >= 385)
leaveScene(0);
else {
@@ -702,11 +703,11 @@ Scene2702::Scene2702(NeverhoodEngine *vm, Module *parentModule, int which)
_asCar->setPathPoints(_trackPoints);
if (which == _tracks[_currTrackIndex]->which2) {
- sendMessage(_asCar, 0x2002, _trackPoints->size() - 1);
- sendMessage(_asCar, 0x2007, 150);
+ sendMessage(_asCar, NM_POSITION_CHANGE, _trackPoints->size() - 1);
+ sendMessage(_asCar, NM_CAR_MOVE_TO_PREV_POINT, 150);
} else {
- sendMessage(_asCar, 0x2002, 0);
- sendMessage(_asCar, 0x2008, 150);
+ sendMessage(_asCar, NM_POSITION_CHANGE, 0);
+ sendMessage(_asCar, NM_CAR_MOVE_TO_NEXT_POINT, 150);
}
_palette->copyBasePalette(0, 256, 0);
@@ -731,17 +732,17 @@ void Scene2702::update() {
uint32 Scene2702::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
Scene::handleMessage(messageNum, param, sender);
switch (messageNum) {
- case 0x0001:
+ case NM_MOUSE_CLICK:
moveCarToPoint(param.asPoint());
break;
- case 0x2005:
+ case NM_KLAYMEN_CLIMB_LADDER:
if (_newTrackIndex >= 0) {
if (_tracks[_currTrackIndex]->which1 < 0)
changeTrack();
} else if (_tracks[_currTrackIndex]->which1 >= 0)
leaveScene(_tracks[_currTrackIndex]->which1);
break;
- case 0x2006:
+ case NM_KLAYMEN_STOP_CLIMBING:
if (_newTrackIndex >= 0) {
if (_tracks[_currTrackIndex]->which2 < 0)
changeTrack();
@@ -782,13 +783,13 @@ void Scene2702::changeTrack() {
_asCar->setPathPoints(_trackPoints);
if (_isUpperTrack) {
if (_currTrackIndex == 0)
- sendMessage(_asCar, 0x2002, _trackPoints->size() - 1);
+ sendMessage(_asCar, NM_POSITION_CHANGE, _trackPoints->size() - 1);
else
- sendMessage(_asCar, 0x2002, 0);
+ sendMessage(_asCar, NM_POSITION_CHANGE, 0);
} else if (_currTrackIndex == 2)
- sendMessage(_asCar, 0x2002, 0);
+ sendMessage(_asCar, NM_POSITION_CHANGE, 0);
else
- sendMessage(_asCar, 0x2002, _trackPoints->size() - 1);
+ sendMessage(_asCar, NM_POSITION_CHANGE, _trackPoints->size() - 1);
sendMessage(_asCar, 0x2004, _newTrackDestX);
_newTrackIndex = -1;
}
@@ -832,18 +833,18 @@ Scene2703::Scene2703(NeverhoodEngine *vm, Module *parentModule, int which, uint3
if (which == _which2) {
NPoint testPoint = (*_trackPoints)[_trackPoints->size() - 1];
- sendMessage(_asCar, 0x2002, _trackPoints->size() - 1);
+ sendMessage(_asCar, NM_POSITION_CHANGE, _trackPoints->size() - 1);
if (testPoint.x > 0 && testPoint.x < 640 && testPoint.y > 0 && testPoint.y < 480)
- sendMessage(_asCar, 0x2009, 0);
+ sendMessage(_asCar, NM_CAR_ENTER, 0);
else
- sendMessage(_asCar, 0x2007, 150);
+ sendMessage(_asCar, NM_CAR_MOVE_TO_PREV_POINT, 150);
} else {
NPoint testPoint = (*_trackPoints)[0];
- sendMessage(_asCar, 0x2002, 0);
+ sendMessage(_asCar, NM_POSITION_CHANGE, 0);
if (testPoint.x > 0 && testPoint.x < 640 && testPoint.y > 0 && testPoint.y < 480)
- sendMessage(_asCar, 0x2009, 0);
+ sendMessage(_asCar, NM_CAR_ENTER, 0);
else
- sendMessage(_asCar, 0x2008, 150);
+ sendMessage(_asCar, NM_CAR_MOVE_TO_NEXT_POINT, 150);
}
if (which == 0) {
@@ -891,11 +892,11 @@ void Scene2703::update() {
uint32 Scene2703::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
Scene::handleMessage(messageNum, param, sender);
switch (messageNum) {
- case 0x2005:
+ case NM_KLAYMEN_CLIMB_LADDER:
if (_which1 >= 0)
leaveScene(_which1);
break;
- case 0x2006:
+ case NM_KLAYMEN_STOP_CLIMBING:
if (_which2 >= 0)
leaveScene(_which2);
break;
@@ -951,18 +952,18 @@ Scene2704::Scene2704(NeverhoodEngine *vm, Module *parentModule, int which, uint3
if (which == _which2) {
NPoint testPoint = (*_trackPoints)[_trackPoints->size() - 1];
- sendMessage(_asCar, 0x2002, _trackPoints->size() - 1);
+ sendMessage(_asCar, NM_POSITION_CHANGE, _trackPoints->size() - 1);
if (testPoint.x > 0 && testPoint.x < 640 && testPoint.y > 0 && testPoint.y < 480)
- sendMessage(_asCar, 0x2009, 0);
+ sendMessage(_asCar, NM_CAR_ENTER, 0);
else
- sendMessage(_asCar, 0x2007, 0);
+ sendMessage(_asCar, NM_CAR_MOVE_TO_PREV_POINT, 150);
} else {
NPoint testPoint = (*_trackPoints)[0];
- sendMessage(_asCar, 0x2002, 0);
+ sendMessage(_asCar, NM_POSITION_CHANGE, 0);
if (testPoint.x > 0 && testPoint.x < 640 && testPoint.y > 0 && testPoint.y < 480)
- sendMessage(_asCar, 0x2009, 0);
+ sendMessage(_asCar, NM_CAR_ENTER, 0);
else
- sendMessage(_asCar, 0x2008, 0);
+ sendMessage(_asCar, NM_CAR_MOVE_TO_NEXT_POINT, 150);
}
if (clipRect) {
@@ -990,11 +991,11 @@ void Scene2704::update() {
uint32 Scene2704::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
Scene::handleMessage(messageNum, param, sender);
switch (messageNum) {
- case 0x2005:
+ case NM_KLAYMEN_CLIMB_LADDER:
if (_which1 >= 0)
leaveScene(_which1);
break;
- case 0x2006:
+ case NM_KLAYMEN_STOP_CLIMBING:
if (_which2 >= 0)
leaveScene(_which2);
break;
@@ -1044,17 +1045,17 @@ Scene2706::Scene2706(NeverhoodEngine *vm, Module *parentModule, int which)
_asCar->setPathPoints(_trackPoints);
if (which == _tracks[_currTrackIndex]->which2) {
- sendMessage(_asCar, 0x2002, _trackPoints->size() - 1);
+ sendMessage(_asCar, NM_POSITION_CHANGE, _trackPoints->size() - 1);
if (which == 5)
- sendMessage(_asCar, 0x2007, 50);
+ sendMessage(_asCar, NM_CAR_MOVE_TO_PREV_POINT, 50);
else
- sendMessage(_asCar, 0x2007, 150);
+ sendMessage(_asCar, NM_CAR_MOVE_TO_PREV_POINT, 150);
} else {
- sendMessage(_asCar, 0x2002, 0);
+ sendMessage(_asCar, NM_POSITION_CHANGE, 0);
if (which == 5)
- sendMessage(_asCar, 0x2008, 50);
+ sendMessage(_asCar, NM_CAR_MOVE_TO_NEXT_POINT, 50);
else
- sendMessage(_asCar, 0x2008, 150);
+ sendMessage(_asCar, NM_CAR_MOVE_TO_NEXT_POINT, 150);
}
}
@@ -1062,17 +1063,17 @@ Scene2706::Scene2706(NeverhoodEngine *vm, Module *parentModule, int which)
uint32 Scene2706::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
Scene::handleMessage(messageNum, param, sender);
switch (messageNum) {
- case 0x0001:
+ case NM_MOUSE_CLICK:
moveCarToPoint(param.asPoint());
break;
- case 0x2005:
+ case NM_KLAYMEN_CLIMB_LADDER:
if (_newTrackIndex >= 0) {
if (_tracks[_currTrackIndex]->which1 < 0)
changeTrack();
} else if (_tracks[_currTrackIndex]->which1 >= 0)
leaveScene(_tracks[_currTrackIndex]->which1);
break;
- case 0x2006:
+ case NM_KLAYMEN_STOP_CLIMBING:
if (_newTrackIndex >= 0) {
if (_tracks[_currTrackIndex]->which2 < 0)
changeTrack();
@@ -1107,9 +1108,9 @@ void Scene2706::changeTrack() {
_trackPoints = _dataResource.getPointArray(_tracks[_currTrackIndex]->trackPointsName);
_asCar->setPathPoints(_trackPoints);
if (_currTrackIndex == 0)
- sendMessage(_asCar, 0x2002, _trackPoints->size() - 1);
+ sendMessage(_asCar, NM_POSITION_CHANGE, _trackPoints->size() - 1);
else
- sendMessage(_asCar, 0x2002, 0);
+ sendMessage(_asCar, NM_POSITION_CHANGE, 0);
sendMessage(_asCar, 0x2004, _newTrackDestX);
_newTrackIndex = -1;
}
diff --git a/engines/neverhood/modules/module2700.h b/engines/neverhood/modules/module2700.h
index 97b4f1cbea..9ac2159765 100644
--- a/engines/neverhood/modules/module2700.h
+++ b/engines/neverhood/modules/module2700.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/neverhood/modules/module2700_sprites.cpp b/engines/neverhood/modules/module2700_sprites.cpp
index 8dd2fa3461..e17cddc834 100644
--- a/engines/neverhood/modules/module2700_sprites.cpp
+++ b/engines/neverhood/modules/module2700_sprites.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/neverhood/modules/module2700_sprites.h b/engines/neverhood/modules/module2700_sprites.h
index 394ba896a1..7da0223bce 100644
--- a/engines/neverhood/modules/module2700_sprites.h
+++ b/engines/neverhood/modules/module2700_sprites.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/neverhood/modules/module2800.cpp b/engines/neverhood/modules/module2800.cpp
index 0578a5df2e..a59c3f8156 100644
--- a/engines/neverhood/modules/module2800.cpp
+++ b/engines/neverhood/modules/module2800.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -59,155 +59,126 @@ Module2800::~Module2800() {
_vm->_soundMan->deleteGroup(0x64210814);
}
+#define statueCloseup(backgroundFileHash, cursorFileHash) \
+ _vm->_soundMan->startMusic(0xD2FA4D14, 0, 2); \
+ createStaticScene(backgroundFileHash, cursorFileHash)
+
void Module2800::createScene(int sceneNum, int which) {
debug(1, "Module2800::createScene(%d, %d)", sceneNum, which);
_sceneNum = sceneNum;
+
+ if (_sceneNum != 1001)
+ _vm->gameState().sceneNum = _sceneNum;
+
switch (_sceneNum) {
- case 0:
- _vm->gameState().sceneNum = 0;
+ case 0: // in front of radio
_vm->_soundMan->stopMusic(0xD2FA4D14, 0, 0);
_childObject = new Scene2801(_vm, this, which);
break;
- case 1:
- _vm->gameState().sceneNum = 1;
+ case 1: // radio
_vm->_soundMan->stopMusic(0xD2FA4D14, 0, 0);
if (getGlobalVar(V_RADIO_ENABLED))
_childObject = new Scene2802(_vm, this, which);
else
createStaticScene(0x000C6444, 0xC6440008);
break;
- case 2:
- _vm->gameState().sceneNum = 2;
+ case 2: // outside shrink machine
_vm->_soundMan->startMusic(0xD2FA4D14, 0, 2);
if (getGlobalVar(V_KLAYMEN_SMALL))
_childObject = new Scene2803Small(_vm, this, which);
else
_childObject = new Scene2803(_vm, this, which);
break;
- case 3:
- _vm->gameState().sceneNum = 3;
+ case 3: // glass cylinder with diamonds
_childObject = new Scene2804(_vm, this, which);
break;
- case 4:
- _vm->gameState().sceneNum = 4;
+ case 4: // outside the transporter
_vm->_soundMan->stopMusic(0xD2FA4D14, 0, 2);
_childObject = new Scene2805(_vm, this, which);
break;
- case 5:
- _vm->gameState().sceneNum = 5;
+ case 5: // left test tube room
_vm->_soundMan->startMusic(0xD2FA4D14, 0, 2);
_childObject = new Scene2806(_vm, this, which);
break;
- case 6:
- _vm->gameState().sceneNum = 6;
+ case 6: // the three test tubes next to the window
_vm->_soundMan->startMusic(0xD2FA4D14, 0, 2);
_childObject = new Scene2807(_vm, this, which);
break;
- case 7:
- _vm->gameState().sceneNum = 7;
+ case 7: // left test tube room closeup
_vm->_soundMan->startMusic(0xD2FA4D14, 0, 2);
_childObject = new Scene2808(_vm, this, 0);
break;
- case 8:
- _vm->gameState().sceneNum = 8;
+ case 8: // right test tube room
_vm->_soundMan->startMusic(0xD2FA4D14, 0, 2);
_childObject = new Scene2809(_vm, this, which);
break;
- case 9:
- _vm->gameState().sceneNum = 9;
+ case 9: // statue room
_vm->_soundMan->startMusic(0xD2FA4D14, 0, 2);
_childObject = new Scene2810(_vm, this, which);
break;
- case 10:
- _vm->gameState().sceneNum = 10;
+ case 10: // right test tube room closeup
_vm->_soundMan->startMusic(0xD2FA4D14, 0, 2);
_childObject = new Scene2808(_vm, this, 1);
break;
- case 11:
- _vm->gameState().sceneNum = 11;
+ case 11: // disk player room (above the statue room)
_vm->_soundMan->startMusic(0xD2FA4D14, 0, 2);
_childObject = new Scene2812(_vm, this, which);
break;
case 12:
- _vm->gameState().sceneNum = 12;
- _vm->_soundMan->startMusic(0xD2FA4D14, 0, 2);
- createStaticScene(0x0000A245, 0x0A241008);
+ statueCloseup(0x0000A245, 0x0A241008);
break;
case 13:
- _vm->gameState().sceneNum = 13;
- _vm->_soundMan->startMusic(0xD2FA4D14, 0, 2);
- createStaticScene(0x81C60635, 0x60631814);
+ statueCloseup(0x81C60635, 0x60631814);
break;
case 14:
- _vm->gameState().sceneNum = 14;
- _vm->_soundMan->startMusic(0xD2FA4D14, 0, 2);
- createStaticScene(0xCA811204, 0x11200CA0);
+ statueCloseup(0xCA811204, 0x11200CA0);
break;
case 15:
- _vm->gameState().sceneNum = 15;
- _vm->_soundMan->startMusic(0xD2FA4D14, 0, 2);
- createStaticScene(0x2D438A00, 0x38A042DC);
+ statueCloseup(0x2D438A00, 0x38A042DC);
break;
case 16:
- _vm->gameState().sceneNum = 16;
- _vm->_soundMan->startMusic(0xD2FA4D14, 0, 2);
- createStaticScene(0x0A806204, 0x062000A0);
+ statueCloseup(0x0A806204, 0x062000A0);
break;
case 17:
- _vm->gameState().sceneNum = 17;
- _vm->_soundMan->startMusic(0xD2FA4D14, 0, 2);
- createStaticScene(0x010F9284, 0xF9280018);
+ statueCloseup(0x010F9284, 0xF9280018);
break;
case 18:
- _vm->gameState().sceneNum = 18;
- _vm->_soundMan->startMusic(0xD2FA4D14, 0, 2);
- createStaticScene(0x0100022B, 0x0022F018);
+ statueCloseup(0x0100022B, 0x0022F018);
break;
case 19:
- _vm->gameState().sceneNum = 19;
- _vm->_soundMan->startMusic(0xD2FA4D14, 0, 2);
- createStaticScene(0x10866205, 0x66201100);
+ statueCloseup(0x10866205, 0x66201100);
break;
case 20:
- _vm->gameState().sceneNum = 20;
- _vm->_soundMan->startMusic(0xD2FA4D14, 0, 2);
- createStaticScene(0x01C58000, 0x58004014);
+ statueCloseup(0x01C58000, 0x58004014);
break;
- case 21:
- _vm->gameState().sceneNum = 21;
+ case 21: // statue with ladder down button
_vm->_soundMan->startMusic(0xD2FA4D14, 0, 2);
_childObject = new Scene2822(_vm, this, which);
break;
case 22:
- _vm->gameState().sceneNum = 22;
- _vm->_soundMan->startMusic(0xD2FA4D14, 0, 2);
- createStaticScene(0x9408121E, 0x8121A948);
+ statueCloseup(0x9408121E, 0x8121A948);
break;
case 23:
- _vm->gameState().sceneNum = 23;
- _vm->_soundMan->startMusic(0xD2FA4D14, 0, 2);
- createStaticScene(0x048C0600, 0xC0604040);
+ statueCloseup(0x048C0600, 0xC0604040);
break;
case 24:
- _vm->gameState().sceneNum = 24;
- _vm->_soundMan->startMusic(0xD2FA4D14, 0, 2);
- createStaticScene(0x04270A94, 0x70A9004A);
+ statueCloseup(0x04270A94, 0x70A9004A);
break;
- case 25:
- _vm->gameState().sceneNum = 25;
+ case 25: // window
_vm->_soundMan->startMusic(0xD2FA4D14, 0, 2);
if (getGlobalVar(V_SHRINK_LIGHTS_ON))
createStaticScene(0x01600204, 0x0020001E);
else
createStaticScene(0x08611204, 0x1120008E);
break;
- case 26:
- _vm->gameState().sceneNum = 26;
- _vm->_soundMan->startMusic(0xD2FA4D14, 0, 2);
+ case 26: // disk player
+ _vm->_soundMan->stopMusic(0xD2FA4D14, 0, 2);
_childObject = new DiskplayerScene(_vm, this, 4);
break;
- case 1001:
+ case 1001: // tower rotation video
_vm->_soundMan->stopMusic(0xD2FA4D14, 0, 0);
+ _musicResource->stop(0);
+ _currentMusicFileHash = 0;
createSmackerScene(0x00800801, true, true, false);
break;
}
@@ -215,6 +186,8 @@ void Module2800::createScene(int sceneNum, int which) {
_childObject->handleUpdate();
}
+#undef statueCloseup
+
void Module2800::updateScene() {
if (!updateChild()) {
switch (_sceneNum) {
@@ -354,7 +327,6 @@ void Module2800::updateScene() {
}
void Module2800::updateMusic(bool halfVolume) {
-
uint32 newMusicFileHash = _vm->_gameModule->getCurrRadioMusicFileHash();
if (!_musicResource)
@@ -477,11 +449,11 @@ uint32 Scene2801::handleMessage(int messageNum, const MessageParam &param, Entit
setMessageList(0x004B6C40);
}
break;
- case 0x482A:
+ case NM_MOVE_TO_BACK:
_palette->addBasePalette(0xB103B604, 0, 65, 0);
_palette->startFadeToPalette(12);
break;
- case 0x482B:
+ case NM_MOVE_TO_FRONT:
_palette->addBasePalette(_paletteHash, 0, 65, 0);
_palette->startFadeToPalette(12);
break;
@@ -585,7 +557,7 @@ uint32 Scene2802::handleMessage(int messageNum, const MessageParam &param, Entit
int prevTuneStatus = _currTuneStatus;
Scene::handleMessage(messageNum, param, sender);
switch (messageNum) {
- case 0x0001:
+ case NM_MOUSE_CLICK:
if (param.asPoint().x <= 20 || param.asPoint().x >= 620) {
leaveScene(0);
} else if (_currTuneStatus == 0) {
@@ -602,7 +574,7 @@ uint32 Scene2802::handleMessage(int messageNum, const MessageParam &param, Entit
}
}
break;
- case 0x0002:
+ case NM_MOUSE_RELEASE:
if (_countdown1 == 0)
_currTuneStatus = 0;
else {
@@ -778,10 +750,10 @@ void Scene2803::upKlaymenStairs() {
uint32 Scene2803::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
uint32 messageResult = Scene::handleMessage(messageNum, param, sender);
switch (messageNum) {
- case 0x480F:
+ case NM_KLAYMEN_LOWER_LEVER:
toggleBackground();
// NOTE Intentional fall-through
- case 0x100D:
+ case NM_ANIMATION_START:
if (param.asInteger() == 0x84251F82)
setMessageList(0x004B7A50);
else if (param.asInteger() == 0x4254A2D2)
@@ -796,11 +768,11 @@ uint32 Scene2803::handleMessage(int messageNum, const MessageParam &param, Entit
} else if (param.asInteger() == 0x9626F390)
setMessageList(0x004B7A88);
break;
- case 0x482A:
+ case NM_MOVE_TO_BACK:
klaymenStairs();
setPaletteArea1();
break;
- case 0x482B:
+ case NM_MOVE_TO_FRONT:
klaymenFloor();
setPaletteArea0();
break;
@@ -1014,7 +986,7 @@ Scene2803Small::Scene2803Small(NeverhoodEngine *vm, Module *parentModule, int wh
uint32 Scene2803Small::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
Scene::handleMessage(messageNum, param, sender);
switch (messageNum) {
- case 0x100D:
+ case NM_ANIMATION_START:
if (param.asInteger() == 0xB4E4884C) {
setMessageList(0x004B6180);
} else if (param.asInteger() == 0xB1FDAB2E) {
@@ -1042,7 +1014,7 @@ uint32 Scene2803Small::handleMessage(int messageNum, const MessageParam &param,
setMessageList(0x004B61A8);
}
break;
- case 0x482A:
+ case NM_MOVE_TO_BACK:
if (_klaymen->getX() < 200) {
setPaletteArea3();
} else if (_klaymen->getX() < 500) {
@@ -1054,7 +1026,7 @@ uint32 Scene2803Small::handleMessage(int messageNum, const MessageParam &param,
setPaletteArea2();
}
break;
- case 0x482B:
+ case NM_MOVE_TO_FRONT:
_sprite6->setVisible(false);
_sprite7->setVisible(false);
_klaymen->setClipRect(0, 0, 640, 480);
@@ -1205,14 +1177,14 @@ Scene2804::Scene2804(NeverhoodEngine *vm, Module *parentModule, int which)
uint32 Scene2804::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
Scene::handleMessage(messageNum, param, sender);
switch (messageNum) {
- case 0x0001:
+ case NM_MOUSE_CLICK:
if (param.asPoint().x <= 20 || param.asPoint().x >= 620) {
leaveScene(0);
}
break;
- case 0x2000:
+ case NM_ANIMATION_UPDATE:
_isWorking = true;
- sendMessage(_asCoil, 0x2002, 0);
+ sendMessage(_asCoil, NM_POSITION_CHANGE, 0);
if (getGlobalVar(V_SHRINK_LIGHTS_ON)) {
sendMessage(_asTarget, 0x2004, 0);
_countdown2 = 48;
@@ -1242,7 +1214,7 @@ void Scene2804::update() {
if (_countdown2 != 0 && (--_countdown2) == 0) {
_isWorking = false;
sendMessage(_asCoil, 0x2003, 0);
- sendMessage(_asTarget, 0x2005, 0);
+ sendMessage(_asTarget, NM_KLAYMEN_CLIMB_LADDER, 0);
for (uint index = 0; index < 5; index++)
_asCrystals[index]->hide();
}
@@ -1316,7 +1288,7 @@ Scene2805::Scene2805(NeverhoodEngine *vm, Module *parentModule, int which)
uint32 Scene2805::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
Scene::handleMessage(messageNum, param, sender);
switch (messageNum) {
- case 0x2000:
+ case NM_ANIMATION_UPDATE:
if (param.asInteger()) {
setRectList(0x004AE318);
_klaymen->setKlaymenIdleTable3();
@@ -1406,12 +1378,12 @@ Scene2806::Scene2806(NeverhoodEngine *vm, Module *parentModule, int which)
uint32 Scene2806::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
Scene::handleMessage(messageNum, param, sender);
switch (messageNum) {
- case 0x100D:
+ case NM_ANIMATION_START:
if (param.asInteger() == 0x44262B12) {
setMessageList(0x004AF0E0);
}
break;
- case 0x2000:
+ case NM_ANIMATION_UPDATE:
sendMessage(_asSpew, 0x2000, 0);
break;
}
@@ -1486,7 +1458,7 @@ Scene2807::Scene2807(NeverhoodEngine *vm, Module *parentModule, int which)
uint32 Scene2807::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
Scene::handleMessage(messageNum, param, sender);
switch (messageNum) {
- case 0x0001:
+ case NM_MOUSE_CLICK:
if (param.asPoint().x <= 20 || param.asPoint().x >= 620) {
leaveScene(0);
}
@@ -1556,19 +1528,19 @@ Scene2808::Scene2808(NeverhoodEngine *vm, Module *parentModule, int which)
uint32 Scene2808::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
Scene::handleMessage(messageNum, param, sender);
switch (messageNum) {
- case 0x0001:
+ case NM_MOUSE_CLICK:
if ((param.asPoint().x <= 20 || param.asPoint().x >= 620) && !isAnyTestTubeFilled()) {
leaveScene(1);
}
break;
- case 0x2000:
+ case NM_ANIMATION_UPDATE:
if (!_isFlowing)
_asTestTubes[param.asInteger()]->fill();
break;
case 0x2001:
_isFlowing = true;
break;
- case 0x2002:
+ case NM_POSITION_CHANGE:
if (isAnyTestTubeFilled()) {
_leaveResult = 3;
if (!isMixtureGood())
@@ -1696,12 +1668,12 @@ void Scene2809::update() {
uint32 Scene2809::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
Scene::handleMessage(messageNum, param, sender);
switch (messageNum) {
- case 0x100D:
+ case NM_ANIMATION_START:
if (param.asInteger() == 0x160DA937) {
setMessageList(0x004B5B98);
}
break;
- case 0x2000:
+ case NM_ANIMATION_UPDATE:
sendMessage(_asSpew, 0x2000, 0);
break;
}
@@ -1903,7 +1875,7 @@ void Scene2810::insertKlaymenLadder() {
uint32 Scene2810::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
uint32 messageResult = Scene::handleMessage(messageNum, param, sender);
switch (messageNum) {
- case 0x100D:
+ case NM_ANIMATION_START:
if (param.asInteger() == 0xE574F14C)
setMessageList(0x004AE458);
else if (param.asInteger() == 0x7214A05C || param.asInteger() == 0x2905E574)
@@ -1933,7 +1905,7 @@ uint32 Scene2810::handleMessage(int messageNum, const MessageParam &param, Entit
else if (param.asInteger() == 0x2064294C || param.asInteger() == 0x2194E053)
setMessageList(0x004AE688);
break;
- case 0x2000:
+ case NM_ANIMATION_UPDATE:
setRectList(0x004AE800);
_isRopingDown = true;
break;
@@ -2036,7 +2008,7 @@ void Scene2812::update() {
uint32 Scene2812::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
uint32 messageResult = Scene::handleMessage(messageNum, param, sender);
switch (messageNum) {
- case 0x100D:
+ case NM_ANIMATION_START:
if (param.asInteger() == 0x0004269B)
sendEntityMessage(_klaymen, 0x1014, _asRope);
break;
@@ -2045,12 +2017,12 @@ uint32 Scene2812::handleMessage(int messageNum, const MessageParam &param, Entit
setRectList(0x004AF710);
_klaymen->setClipRect(_sprite4->getDrawRect().x, 0, 640, _sprite4->getDrawRect().y2());
break;
- case 0x2002:
+ case NM_POSITION_CHANGE:
_isRopingDown = false;
setRectList(0x004AF700);
_klaymen->setClipRect(_sprite4->getDrawRect().x, 0, 640, _sprite3->getDrawRect().y2());
break;
- case 0x4806:
+ case NM_KLAYMEN_USE_OBJECT:
sendMessage(_asWinch, 0x2000, 0);
sendMessage(_asTrapDoor, 0x2000, 0);
break;
@@ -2063,12 +2035,12 @@ uint32 Scene2812::handleMessage(int messageNum, const MessageParam &param, Entit
setMessageList(0x004AF668);
}
break;
- case 0x482A:
+ case NM_MOVE_TO_BACK:
setPaletteArea1(false);
_sprite1->setVisible(true);
_klaymen->setClipRect(_sprite1->getDrawRect().x, 0, _sprite1->getDrawRect().x2(), _sprite3->getDrawRect().y2());
break;
- case 0x482B:
+ case NM_MOVE_TO_FRONT:
setPaletteArea0(false);
_sprite1->setVisible(false);
_klaymen->setClipRect(_sprite4->getDrawRect().x, 0, 640, _sprite3->getDrawRect().y2());
@@ -2159,7 +2131,7 @@ void Scene2822::update() {
uint32 Scene2822::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
uint32 messageResult = Scene::handleMessage(messageNum, param, sender);
switch (messageNum) {
- case 0x0001:
+ case NM_MOUSE_CLICK:
if (param.asPoint().x <= 20 || param.asPoint().x >= 620) {
leaveScene(0);
} else if (param.asPoint().x >= 257 && param.asPoint().y >= 235 &&
diff --git a/engines/neverhood/modules/module2800.h b/engines/neverhood/modules/module2800.h
index 26e44bc543..73a13610e3 100644
--- a/engines/neverhood/modules/module2800.h
+++ b/engines/neverhood/modules/module2800.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/neverhood/modules/module2800_sprites.cpp b/engines/neverhood/modules/module2800_sprites.cpp
index a600c55dd3..f9a58de92d 100644
--- a/engines/neverhood/modules/module2800_sprites.cpp
+++ b/engines/neverhood/modules/module2800_sprites.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -40,20 +40,20 @@ AsScene2803LightCord::AsScene2803LightCord(NeverhoodEngine *vm, Scene *parentSce
uint32 AsScene2803LightCord::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
uint32 messageResult = Sprite::handleMessage(messageNum, param, sender);
switch (messageNum) {
- case 0x100D:
+ case NM_ANIMATION_START:
if (!_isBusy && param.asInteger() == calcHash("ClickSwitch")) {
- sendMessage(_parentScene, 0x480F, 0);
+ sendMessage(_parentScene, NM_KLAYMEN_LOWER_LEVER, 0);
playSound(0, 0x4E1CA4A0);
}
break;
- case 0x480F:
+ case NM_KLAYMEN_LOWER_LEVER:
stPulled();
break;
- case 0x482A:
- sendMessage(_parentScene, 0x1022, 990);
+ case NM_MOVE_TO_BACK:
+ sendMessage(_parentScene, NM_PRIORITY_CHANGE, 990);
break;
- case 0x482B:
- sendMessage(_parentScene, 0x1022, 1010);
+ case NM_MOVE_TO_FRONT:
+ sendMessage(_parentScene, NM_PRIORITY_CHANGE, 1010);
break;
}
return messageResult;
@@ -62,7 +62,7 @@ uint32 AsScene2803LightCord::handleMessage(int messageNum, const MessageParam &p
uint32 AsScene2803LightCord::hmPulled(int messageNum, const MessageParam &param, Entity *sender) {
uint32 messageResult = handleMessage(messageNum, param, sender);
switch (messageNum) {
- case 0x3002:
+ case NM_ANIMATION_STOP:
gotoNextState();
break;
}
@@ -107,7 +107,7 @@ AsScene2803TestTubeOne::AsScene2803TestTubeOne(NeverhoodEngine *vm, uint32 fileH
uint32 AsScene2803TestTubeOne::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
uint32 messageResult = Sprite::handleMessage(messageNum, param, sender);
switch (messageNum) {
- case 0x2000:
+ case NM_ANIMATION_UPDATE:
if (param.asInteger())
startAnimation(_fileHash2, 0, -1);
else
@@ -133,15 +133,15 @@ AsScene2803Rope::AsScene2803Rope(NeverhoodEngine *vm, Scene *parentScene, int16
uint32 AsScene2803Rope::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
uint32 messageResult = Sprite::handleMessage(messageNum, param, sender);
switch (messageNum) {
- case 0x3002:
+ case NM_ANIMATION_STOP:
startAnimation(0x9D098C23, 50, -1);
SetMessageHandler(&AsScene2803Rope::hmReleased);
break;
- case 0x482A:
- sendMessage(_parentScene, 0x1022, 990);
+ case NM_MOVE_TO_BACK:
+ sendMessage(_parentScene, NM_PRIORITY_CHANGE, 990);
break;
- case 0x482B:
- sendMessage(_parentScene, 0x1022, 1010);
+ case NM_MOVE_TO_FRONT:
+ sendMessage(_parentScene, NM_PRIORITY_CHANGE, 1010);
break;
}
return messageResult;
@@ -150,14 +150,14 @@ uint32 AsScene2803Rope::handleMessage(int messageNum, const MessageParam &param,
uint32 AsScene2803Rope::hmReleased(int messageNum, const MessageParam &param, Entity *sender) {
uint32 messageResult = Sprite::handleMessage(messageNum, param, sender);
switch (messageNum) {
- case 0x3002:
+ case NM_ANIMATION_STOP:
gotoNextState();
break;
- case 0x482A:
- sendMessage(_parentScene, 0x1022, 990);
+ case NM_MOVE_TO_BACK:
+ sendMessage(_parentScene, NM_PRIORITY_CHANGE, 990);
break;
- case 0x482B:
- sendMessage(_parentScene, 0x1022, 1010);
+ case NM_MOVE_TO_FRONT:
+ sendMessage(_parentScene, NM_PRIORITY_CHANGE, 1010);
break;
}
return messageResult;
@@ -217,7 +217,7 @@ SsScene2804LightCoil::SsScene2804LightCoil(NeverhoodEngine *vm)
uint32 SsScene2804LightCoil::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
uint32 messageResult = Sprite::handleMessage(messageNum, param, sender);
switch (messageNum) {
- case 0x2002:
+ case NM_POSITION_CHANGE:
setVisible(true);
updatePosition();
messageResult = 1;
@@ -247,7 +247,7 @@ uint32 SsScene2804LightTarget::handleMessage(int messageNum, const MessageParam
updatePosition();
messageResult = 1;
break;
- case 0x2005:
+ case NM_KLAYMEN_CLIMB_LADDER:
setVisible(false);
updatePosition();
messageResult = 1;
@@ -470,7 +470,7 @@ void AsScene2804BeamCoil::update() {
uint32 AsScene2804BeamCoil::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
uint32 messageResult = Sprite::handleMessage(messageNum, param, sender);
switch (messageNum) {
- case 0x2002:
+ case NM_POSITION_CHANGE:
show();
_countdown = 92;
messageResult = 1;
@@ -509,7 +509,7 @@ void AsScene2804BeamCoil::stBeaming() {
uint32 AsScene2804BeamCoil::hmBeaming(int messageNum, const MessageParam &param, Entity *sender) {
uint32 messageResult = handleMessage(messageNum, param, sender);
switch (messageNum) {
- case 0x3002:
+ case NM_ANIMATION_STOP:
gotoNextState();
break;
}
@@ -537,7 +537,7 @@ uint32 AsScene2804BeamTarget::handleMessage(int messageNum, const MessageParam &
startAnimation(0x03842000, 0, -1);
messageResult = 1;
break;
- case 0x2005:
+ case NM_KLAYMEN_CLIMB_LADDER:
setVisible(false);
stopAnimation();
messageResult = 1;
@@ -561,12 +561,12 @@ AsScene2806Spew::AsScene2806Spew(NeverhoodEngine *vm)
uint32 AsScene2806Spew::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
uint32 messageResult = Sprite::handleMessage(messageNum, param, sender);
switch (messageNum) {
- case 0x2000:
+ case NM_ANIMATION_UPDATE:
playSound(0, 0x48640244);
startAnimation(0x04211490, 0, -1);
setVisible(true);
break;
- case 0x3002:
+ case NM_ANIMATION_STOP:
stopAnimation();
setVisible(false);
break;
@@ -774,7 +774,7 @@ uint32 AsScene2808Handle::handleMessage(int messageNum, const MessageParam &para
uint32 AsScene2808Handle::hmActivating(int messageNum, const MessageParam &param, Entity *sender) {
uint32 messageResult = handleMessage(messageNum, param, sender);
switch (messageNum) {
- case 0x3002:
+ case NM_ANIMATION_STOP:
gotoNextState();
break;
}
@@ -791,7 +791,7 @@ void AsScene2808Handle::activate() {
void AsScene2808Handle::stActivated() {
stopAnimation();
- sendMessage(_parentScene, 0x2002, 0);
+ sendMessage(_parentScene, NM_POSITION_CHANGE, 0);
}
AsScene2808Flow::AsScene2808Flow(NeverhoodEngine *vm, Scene *parentScene, int testTubeSetNum)
@@ -817,7 +817,7 @@ AsScene2808Flow::AsScene2808Flow(NeverhoodEngine *vm, Scene *parentScene, int te
uint32 AsScene2808Flow::hmFlowing(int messageNum, const MessageParam &param, Entity *sender) {
uint32 messageResult = Sprite::handleMessage(messageNum, param, sender);
switch (messageNum) {
- case 0x3002:
+ case NM_ANIMATION_STOP:
gotoNextState();
break;
}
@@ -875,12 +875,12 @@ AsScene2809Spew::AsScene2809Spew(NeverhoodEngine *vm)
uint32 AsScene2809Spew::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
uint32 messageResult = Sprite::handleMessage(messageNum, param, sender);
switch (messageNum) {
- case 0x2000:
+ case NM_ANIMATION_UPDATE:
playSound(0, 0x48640244);
startAnimation(0x04211490, 0, -1);
setVisible(true);
break;
- case 0x3002:
+ case NM_ANIMATION_STOP:
stopAnimation();
setVisible(false);
break;
@@ -903,14 +903,14 @@ AsScene2810Rope::AsScene2810Rope(NeverhoodEngine *vm, Scene *parentScene, int16
uint32 AsScene2810Rope::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
uint32 messageResult = Sprite::handleMessage(messageNum, param, sender);
switch (messageNum) {
- case 0x3002:
+ case NM_ANIMATION_STOP:
startAnimation(0x9D098C23, 35, 53);
break;
- case 0x482A:
- sendMessage(_parentScene, 0x1022, 990);
+ case NM_MOVE_TO_BACK:
+ sendMessage(_parentScene, NM_PRIORITY_CHANGE, 990);
break;
- case 0x482B:
- sendMessage(_parentScene, 0x1022, 1010);
+ case NM_MOVE_TO_FRONT:
+ sendMessage(_parentScene, NM_PRIORITY_CHANGE, 1010);
break;
}
return messageResult;
@@ -934,13 +934,13 @@ AsScene2812Winch::~AsScene2812Winch() {
uint32 AsScene2812Winch::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
uint32 messageResult = Sprite::handleMessage(messageNum, param, sender);
switch (messageNum) {
- case 0x2000:
+ case NM_ANIMATION_UPDATE:
startAnimation(0x20DA08A0, 0, -1);
setVisible(true);
_vm->_soundMan->addSound(0x00B000E2, 0xC874EE6C);
_vm->_soundMan->playSoundLooping(0xC874EE6C);
break;
- case 0x3002:
+ case NM_ANIMATION_STOP:
startAnimation(0x20DA08A0, 7, -1);
break;
}
@@ -962,15 +962,15 @@ AsScene2812Rope::AsScene2812Rope(NeverhoodEngine *vm, Scene *parentScene)
uint32 AsScene2812Rope::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
uint32 messageResult = Sprite::handleMessage(messageNum, param, sender);
switch (messageNum) {
- case 0x4806:
+ case NM_KLAYMEN_USE_OBJECT:
setDoDeltaX(((Sprite*)sender)->isDoDeltaX() ? 1 : 0);
stRopingDown();
break;
- case 0x482A:
- sendMessage(_parentScene, 0x1022, 990);
+ case NM_MOVE_TO_BACK:
+ sendMessage(_parentScene, NM_PRIORITY_CHANGE, 990);
break;
- case 0x482B:
- sendMessage(_parentScene, 0x1022, 1010);
+ case NM_MOVE_TO_FRONT:
+ sendMessage(_parentScene, NM_PRIORITY_CHANGE, 1010);
break;
}
return messageResult;
@@ -979,7 +979,7 @@ uint32 AsScene2812Rope::handleMessage(int messageNum, const MessageParam &param,
uint32 AsScene2812Rope::hmRopingDown(int messageNum, const MessageParam &param, Entity *sender) {
uint32 messageResult = Sprite::handleMessage(messageNum, param, sender);
switch (messageNum) {
- case 0x3002:
+ case NM_ANIMATION_STOP:
gotoNextState();
break;
}
@@ -987,7 +987,7 @@ uint32 AsScene2812Rope::hmRopingDown(int messageNum, const MessageParam &param,
}
void AsScene2812Rope::stRopingDown() {
- sendMessage(_parentScene, 0x4806, 0);
+ sendMessage(_parentScene, NM_KLAYMEN_USE_OBJECT, 0);
startAnimation(0x9D098C23, 0, -1);
SetMessageHandler(&AsScene2812Rope::hmRopingDown);
}
@@ -1002,7 +1002,7 @@ AsScene2812TrapDoor::AsScene2812TrapDoor(NeverhoodEngine *vm)
uint32 AsScene2812TrapDoor::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
uint32 messageResult = Sprite::handleMessage(messageNum, param, sender);
switch (messageNum) {
- case 0x2000:
+ case NM_ANIMATION_UPDATE:
startAnimation(0x805D0029, 0, -1);
playSound(0, 0xEA005F40);
_newStickFrameIndex = STICK_LAST_FRAME;
@@ -1023,10 +1023,10 @@ uint32 KmScene2801::xHandleMessage(int messageNum, const MessageParam &param) {
case 0x4800:
startWalkToX(param.asPoint().x, false);
break;
- case 0x4004:
+ case NM_KLAYMEN_STAND_IDLE:
GotoState(&Klaymen::stTryStandIdle);
break;
- case 0x4812:
+ case NM_KLAYMEN_PICKUP:
GotoState(&Klaymen::stPickUpGeneric);
break;
case 0x4817:
@@ -1039,10 +1039,10 @@ uint32 KmScene2801::xHandleMessage(int messageNum, const MessageParam &param) {
else
startWalkToAttachedSpriteXDistance(param.asPoint().x);
break;
- case 0x481D:
+ case NM_KLAYMEN_TURN_TO_USE:
GotoState(&Klaymen::stTurnToUse);
break;
- case 0x481E:
+ case NM_KLAYMEN_RETURN_FROM_USE:
GotoState(&Klaymen::stReturnFromUse);
break;
case 0x481F:
@@ -1093,7 +1093,7 @@ uint32 KmScene2803::xHandleMessage(int messageNum, const MessageParam &param) {
case 0x4800:
startWalkToX(param.asPoint().x, false);
break;
- case 0x4004:
+ case NM_KLAYMEN_STAND_IDLE:
GotoState(&Klaymen::stTryStandIdle);
break;
case 0x4803:
@@ -1114,10 +1114,10 @@ uint32 KmScene2803::xHandleMessage(int messageNum, const MessageParam &param) {
case 0x4818:
startWalkToX(_dataResource.getPoint(param.asInteger()).x, false);
break;
- case 0x481D:
+ case NM_KLAYMEN_TURN_TO_USE:
GotoState(&Klaymen::stTurnToUse);
break;
- case 0x481E:
+ case NM_KLAYMEN_RETURN_FROM_USE:
GotoState(&Klaymen::stReturnFromUse);
break;
case 0x481F:
@@ -1154,7 +1154,7 @@ uint32 KmScene2803Small::xHandleMessage(int messageNum, const MessageParam &para
case 0x4800:
startWalkToXSmall(param.asPoint().x);
break;
- case 0x4004:
+ case NM_KLAYMEN_STAND_IDLE:
GotoState(&Klaymen::stStandIdleSmall);
break;
case 0x4817:
@@ -1198,9 +1198,9 @@ uint32 KmScene2803Small::xHandleMessage(int messageNum, const MessageParam &para
uint32 KmScene2803Small::hmShrink(int messageNum, const MessageParam &param, Entity *sender) {
uint32 messageResult = hmLowLevelAnimation(messageNum, param, sender);
switch (messageNum) {
- case 0x100D:
+ case NM_ANIMATION_START:
if (param.asInteger() == 0x80C110B5)
- sendMessage(_parentScene, 0x482A, 0);
+ sendMessage(_parentScene, NM_MOVE_TO_BACK, 0);
else if (param.asInteger() == 0x33288344)
playSound(2, 0x10688664);
break;
@@ -1227,7 +1227,7 @@ KmScene2805::KmScene2805(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16
uint32 KmScene2805::xHandleMessage(int messageNum, const MessageParam &param) {
uint32 messageResult = 0;
switch (messageNum) {
- case 0x2000:
+ case NM_ANIMATION_UPDATE:
_isSittingInTeleporter = param.asInteger() != 0;
messageResult = 1;
break;
@@ -1235,7 +1235,7 @@ uint32 KmScene2805::xHandleMessage(int messageNum, const MessageParam &param) {
case 0x4800:
startWalkToX(param.asPoint().x, false);
break;
- case 0x4004:
+ case NM_KLAYMEN_STAND_IDLE:
if (_isSittingInTeleporter)
GotoState(&Klaymen::stSitIdleTeleporter);
else
@@ -1245,11 +1245,11 @@ uint32 KmScene2805::xHandleMessage(int messageNum, const MessageParam &param) {
setDoDeltaX(param.asInteger());
gotoNextStateExt();
break;
- case 0x481D:
+ case NM_KLAYMEN_TURN_TO_USE:
if (_isSittingInTeleporter)
GotoState(&Klaymen::stTurnToUseInTeleporter);
break;
- case 0x481E:
+ case NM_KLAYMEN_RETURN_FROM_USE:
if (_isSittingInTeleporter)
GotoState(&Klaymen::stReturnFromUseInTeleporter);
break;
@@ -1301,7 +1301,7 @@ uint32 KmScene2806::xHandleMessage(int messageNum, const MessageParam &param) {
case 0x4800:
startWalkToX(param.asPoint().x, false);
break;
- case 0x4004:
+ case NM_KLAYMEN_STAND_IDLE:
GotoState(&Klaymen::stTryStandIdle);
break;
case 0x4804:
@@ -1310,7 +1310,7 @@ uint32 KmScene2806::xHandleMessage(int messageNum, const MessageParam &param) {
case 0x480D:
GotoState(&Klaymen::stPullCord);
break;
- case 0x4816:
+ case NM_KLAYMEN_PRESS_BUTTON:
if (param.asInteger() == 0)
GotoState(&Klaymen::stPressButtonSide);
break;
@@ -1359,7 +1359,7 @@ uint32 KmScene2809::xHandleMessage(int messageNum, const MessageParam &param) {
case 0x4800:
startWalkToX(param.asPoint().x, false);
break;
- case 0x4004:
+ case NM_KLAYMEN_STAND_IDLE:
GotoState(&Klaymen::stTryStandIdle);
break;
case 0x4804:
@@ -1368,7 +1368,7 @@ uint32 KmScene2809::xHandleMessage(int messageNum, const MessageParam &param) {
case 0x480D:
GotoState(&Klaymen::stPullCord);
break;
- case 0x4816:
+ case NM_KLAYMEN_PRESS_BUTTON:
if (param.asInteger() == 0)
GotoState(&Klaymen::stPressButtonSide);
break;
@@ -1404,7 +1404,7 @@ uint32 KmScene2810Small::xHandleMessage(int messageNum, const MessageParam &para
case 0x4800:
startWalkToXSmall(param.asPoint().x);
break;
- case 0x4004:
+ case NM_KLAYMEN_STAND_IDLE:
GotoState(&Klaymen::stStandIdleSmall);
break;
case 0x4817:
@@ -1453,7 +1453,7 @@ uint32 KmScene2810::xHandleMessage(int messageNum, const MessageParam &param) {
case 0x4800:
startWalkToX(param.asPoint().x, false);
break;
- case 0x4004:
+ case NM_KLAYMEN_STAND_IDLE:
GotoState(&Klaymen::stTryStandIdle);
break;
case 0x4803:
@@ -1464,7 +1464,7 @@ uint32 KmScene2810::xHandleMessage(int messageNum, const MessageParam &param) {
if (param.asInteger() == 3)
GotoState(&Klaymen::stFinishGrow);
break;
- case 0x4812:
+ case NM_KLAYMEN_PICKUP:
GotoState(&Klaymen::stPickUpGeneric);
break;
case 0x4817:
@@ -1545,14 +1545,14 @@ uint32 KmScene2812::xHandleMessage(int messageNum, const MessageParam &param) {
case 0x4800:
startWalkToX(param.asPoint().x, false);
break;
- case 0x4004:
+ case NM_KLAYMEN_STAND_IDLE:
GotoState(&Klaymen::stTryStandIdle);
break;
case 0x4805:
_destY = param.asInteger();
GotoState(&Klaymen::stJumpToGrabFall);
break;
- case 0x4812:
+ case NM_KLAYMEN_PICKUP:
if (param.asInteger() == 2)
GotoState(&Klaymen::stPickUpNeedle);
else if (param.asInteger() == 1)
@@ -1564,7 +1564,7 @@ uint32 KmScene2812::xHandleMessage(int messageNum, const MessageParam &param) {
setDoDeltaX(param.asInteger());
gotoNextStateExt();
break;
- case 0x481A:
+ case NM_KLAYMEN_INSERT_DISK:
GotoState(&Klaymen::stInsertDisk);
break;
case 0x481B:
@@ -1573,10 +1573,10 @@ uint32 KmScene2812::xHandleMessage(int messageNum, const MessageParam &param) {
else
startWalkToAttachedSpriteXDistance(param.asPoint().x);
break;
- case 0x481D:
+ case NM_KLAYMEN_TURN_TO_USE:
GotoState(&Klaymen::stTurnToUse);
break;
- case 0x481E:
+ case NM_KLAYMEN_RETURN_FROM_USE:
GotoState(&Klaymen::stReturnFromUse);
break;
case 0x4820:
@@ -1594,7 +1594,7 @@ uint32 KmScene2812::xHandleMessage(int messageNum, const MessageParam &param) {
GotoState(&Klaymen::stStartClimbLadderUp);
break;
case 0x4823:
- sendMessage(_parentScene, 0x2002, 0);
+ sendMessage(_parentScene, NM_POSITION_CHANGE, 0);
GotoState(&Klaymen::stClimbLadderHalf);
break;
case 0x482D:
diff --git a/engines/neverhood/modules/module2800_sprites.h b/engines/neverhood/modules/module2800_sprites.h
index 91f26d7849..ec34a7ccf5 100644
--- a/engines/neverhood/modules/module2800_sprites.h
+++ b/engines/neverhood/modules/module2800_sprites.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/neverhood/modules/module2900.cpp b/engines/neverhood/modules/module2900.cpp
index bb0b69f35d..69186514a2 100644
--- a/engines/neverhood/modules/module2900.cpp
+++ b/engines/neverhood/modules/module2900.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -34,11 +34,12 @@ namespace Neverhood {
Module2900::Module2900(NeverhoodEngine *vm, Module *parentModule, int which)
: Module(vm, parentModule) {
+ _teleporterModuleResult = -1;
+
if (which >= 0)
setGlobalVar(V_TELEPORTER_WHICH, which);
createScene(0, 0);
-
}
void Module2900::createScene(int sceneNum, int which) {
@@ -211,11 +212,11 @@ void Scene2901::update() {
uint32 Scene2901::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
Scene::handleMessage(messageNum, param, sender);
switch (messageNum) {
- case 0x0001:
+ case NM_MOUSE_CLICK:
if (param.asPoint().x <= 20 || param.asPoint().x >= 620)
leaveScene((uint32)-1);
break;
- case 0x2000:
+ case NM_ANIMATION_UPDATE:
if (_currLocationButtonNum != _selectedButtonNum)
leaveScene(_selectedButtonNum);
break;
diff --git a/engines/neverhood/modules/module2900.h b/engines/neverhood/modules/module2900.h
index 5f6ed29a12..8d6dad5660 100644
--- a/engines/neverhood/modules/module2900.h
+++ b/engines/neverhood/modules/module2900.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/neverhood/modules/module2900_sprites.cpp b/engines/neverhood/modules/module2900_sprites.cpp
index 59780b33a0..1ec820abdf 100644
--- a/engines/neverhood/modules/module2900_sprites.cpp
+++ b/engines/neverhood/modules/module2900_sprites.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/neverhood/modules/module2900_sprites.h b/engines/neverhood/modules/module2900_sprites.h
index 9f7df502e1..3ad7f2eefd 100644
--- a/engines/neverhood/modules/module2900_sprites.h
+++ b/engines/neverhood/modules/module2900_sprites.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/neverhood/modules/module3000.cpp b/engines/neverhood/modules/module3000.cpp
index a12776611e..d4809611ad 100644
--- a/engines/neverhood/modules/module3000.cpp
+++ b/engines/neverhood/modules/module3000.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -39,7 +39,7 @@ static const uint32 kModule3000SoundList[] = {
};
Module3000::Module3000(NeverhoodEngine *vm, Module *parentModule, int which)
- : Module(vm, parentModule), _soundVolume(0) {
+ : Module(vm, parentModule), _waterfallSoundVolume(0) {
_vm->_soundMan->addSoundList(0x81293110, kModule3000SoundList);
_vm->_soundMan->setSoundListParams(kModule3000SoundList, true, 50, 600, 5, 150);
@@ -48,9 +48,9 @@ Module3000::Module3000(NeverhoodEngine *vm, Module *parentModule, int which)
_vm->_soundMan->playTwoSounds(0x81293110, 0x40030A51, 0xC862CA15, 0);
_vm->_soundMan->playTwoSounds(0x81293110, 0x41861371, 0x43A2507F, 0);
- _isWallBroken = getGlobalVar(V_WALL_BROKEN) != 0;
+ _isWaterfallRunning = getGlobalVar(V_WALL_BROKEN) != 1;
- if (!_isWallBroken) {
+ if (_isWaterfallRunning) {
_vm->_soundMan->setSoundVolume(0x90F0D1C3, 0);
_vm->_soundMan->playSoundLooping(0x90F0D1C3);
}
@@ -78,12 +78,11 @@ void Module3000::createScene(int sceneNum, int which) {
static const byte kNavigationTypes06[] = {5};
debug(1, "Module3000::createScene(%d, %d)", sceneNum, which);
_vm->gameState().sceneNum = sceneNum;
- _isWallBroken = getGlobalVar(V_WALL_BROKEN) != 0;
switch (_vm->gameState().sceneNum) {
case 1:
if (!getGlobalVar(V_BOLT_DOOR_OPEN)) {
createNavigationScene(0x004B7C80, which);
- } else if (_isWallBroken) {
+ } else if (getGlobalVar(V_WALL_BROKEN)) {
createNavigationScene(0x004B7CE0, which);
} else {
createNavigationScene(0x004B7CB0, which);
@@ -91,11 +90,11 @@ void Module3000::createScene(int sceneNum, int which) {
break;
case 2:
_vm->_soundMan->playTwoSounds(0x81293110, 0x40030A51, 0xC862CA15, 0);
- if (!_isWallBroken) {
- _soundVolume = 90;
+ if (_isWaterfallRunning) {
+ _waterfallSoundVolume = 90;
_vm->_soundMan->setSoundVolume(0x90F0D1C3, 90);
}
- if (_isWallBroken) {
+ if (getGlobalVar(V_WALL_BROKEN)) {
createNavigationScene(0x004B7D58, which);
} else {
createNavigationScene(0x004B7D10, which);
@@ -104,7 +103,7 @@ void Module3000::createScene(int sceneNum, int which) {
case 3:
if (getGlobalVar(V_STAIRS_DOWN))
createNavigationScene(0x004B7E60, which);
- else if (_isWallBroken)
+ else if (getGlobalVar(V_WALL_BROKEN))
createNavigationScene(0x004B7DA0, which);
else
createNavigationScene(0x004B7E00, which);
@@ -152,12 +151,12 @@ void Module3000::createScene(int sceneNum, int which) {
// NOTE: Newly introduced sceneNums
case 1001:
if (!getGlobalVar(V_BOLT_DOOR_OPEN))
- if (_isWallBroken)
+ if (getGlobalVar(V_WALL_BROKEN))
createSmackerScene(0x00940021, true, true, false);
else
createSmackerScene(0x01140021, true, true, false);
else
- if (_isWallBroken)
+ if (getGlobalVar(V_WALL_BROKEN))
createSmackerScene(0x001011B1, true, true, false);
else
createSmackerScene(0x001021B1, true, true, false);
@@ -195,8 +194,8 @@ void Module3000::updateScene() {
break;
case 2:
_vm->_soundMan->playTwoSounds(0x81293110, 0x41861371, 0x43A2507F, 0);
- if (_isWallBroken) {
- _soundVolume = 0;
+ if (_isWaterfallRunning) {
+ _waterfallSoundVolume = 0;
_vm->_soundMan->setSoundVolume(0x90F0D1C3, 0);
}
if (_moduleResult == 0) {
@@ -240,7 +239,7 @@ void Module3000::updateScene() {
createScene(8, -1);
break;
case 8:
- _isWallBroken = getGlobalVar(V_WALL_BROKEN) != 0;
+ _isWaterfallRunning = getGlobalVar(V_WALL_BROKEN) != 1;
if (_moduleResult != 1) {
_vm->_soundMan->setSoundListParams(kModule3000SoundList, true, 0, 0, 0, 0);
createScene(4, 1);
@@ -301,12 +300,12 @@ void Module3000::updateScene() {
} else if (frameNumber == 10) {
_vm->_soundMan->playTwoSounds(0x81293110, 0x40030A51, 0xC862CA15, 0);
}
- if (!_isWallBroken && _soundVolume < 90 && frameNumber % 2) {
+ if (_isWaterfallRunning && _waterfallSoundVolume < 90 && frameNumber % 2) {
if (frameNumber == 0)
- _soundVolume = 40;
+ _waterfallSoundVolume = 40;
else
- _soundVolume++;
- _vm->_soundMan->setSoundVolume(0x90F0D1C3, _soundVolume);
+ _waterfallSoundVolume++;
+ _vm->_soundMan->setSoundVolume(0x90F0D1C3, _waterfallSoundVolume);
}
}
}
@@ -315,9 +314,9 @@ void Module3000::updateScene() {
if (navigationScene()->isWalkingForward()) {
uint32 frameNumber = navigationScene()->getFrameNumber();
int navigationIndex = navigationScene()->getNavigationIndex();
- if (!_isWallBroken && _soundVolume > 1 && frameNumber % 2) {
- _soundVolume--;
- _vm->_soundMan->setSoundVolume(0x90F0D1C3, _soundVolume);
+ if (_isWaterfallRunning && _waterfallSoundVolume > 1 && frameNumber % 2) {
+ _waterfallSoundVolume--;
+ _vm->_soundMan->setSoundVolume(0x90F0D1C3, _waterfallSoundVolume);
}
if (navigationIndex == 0) {
if (frameNumber == 35) {
@@ -340,12 +339,12 @@ void Module3000::updateScene() {
if (frameNumber == 40) {
_vm->_soundMan->playTwoSounds(0x81293110, 0x40030A51, 0xC862CA15, 0);
}
- if (!_isWallBroken && _soundVolume < 90 && frameNumber % 2) {
+ if (_isWaterfallRunning && _waterfallSoundVolume < 90 && frameNumber % 2) {
if (frameNumber == 0)
- _soundVolume = 40;
+ _waterfallSoundVolume = 40;
else
- _soundVolume++;
- _vm->_soundMan->setSoundVolume(0x90F0D1C3, _soundVolume);
+ _waterfallSoundVolume++;
+ _vm->_soundMan->setSoundVolume(0x90F0D1C3, _waterfallSoundVolume);
}
}
}
@@ -552,13 +551,13 @@ void Scene3009::update() {
uint32 Scene3009::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
Scene::handleMessage(messageNum, param, sender);
switch (messageNum) {
- case 0x0001:
+ case NM_MOUSE_CLICK:
if ((param.asPoint().x <= 20 || param.asPoint().x >= 620) && !getGlobalVar(V_CANNON_RAISED)) {
setGlobalVar(V_CANNON_TARGET_STATUS, 0);
leaveScene(0);
}
break;
- case 0x2000:
+ case NM_ANIMATION_UPDATE:
if (!getGlobalVar(V_CANNON_RAISED)) {
if (!getGlobalVar(V_WALL_BROKEN)) {
_cannonTargetStatus = kCTSBreakWall;
@@ -581,7 +580,7 @@ uint32 Scene3009::handleMessage(int messageNum, const MessageParam &param, Entit
case 0x2001:
_lockSymbolsPart1Countdown = 24;
break;
- case 0x2002:
+ case NM_POSITION_CHANGE:
// Raise/lower the cannon
if (!getGlobalVar(V_CANNON_TURNED) && !_isTurning) {
if (getGlobalVar(V_CANNON_RAISED)) {
@@ -731,7 +730,7 @@ void Scene3010::update() {
uint32 Scene3010::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
Scene::handleMessage(messageNum, param, sender);
switch (messageNum) {
- case 0x0001:
+ case NM_MOUSE_CLICK:
if ((param.asPoint().x <= 20 || param.asPoint().x >= 620) && _countdown == 0 && !_checkUnlocked) {
if (!_boltUnlocking[0] && !_boltUnlocking[1] && !_boltUnlocking[2]) {
showMouse(false);
@@ -749,7 +748,7 @@ uint32 Scene3010::handleMessage(int messageNum, const MessageParam &param, Entit
}
}
break;
- case 0x2000:
+ case NM_ANIMATION_UPDATE:
if (!_boltUnlocked[param.asInteger()] && !_checkUnlocked && _countdown == 0) {
_asDeadBolts[param.asInteger()]->unlock(false);
_boltUnlocking[param.asInteger()] = true;
@@ -769,7 +768,7 @@ uint32 Scene3010::handleMessage(int messageNum, const MessageParam &param, Entit
_doorUnlocked = true;
}
break;
- case 0x2002:
+ case NM_POSITION_CHANGE:
if (!_checkUnlocked && _countdown == 0) {
_asDeadBolts[param.asInteger()]->lock();
}
@@ -853,12 +852,12 @@ void Scene3011::update() {
uint32 Scene3011::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
Scene::handleMessage(messageNum, param, sender);
switch (messageNum) {
- case 0x0001:
+ case NM_MOUSE_CLICK:
if (param.asPoint().x <= 20 || param.asPoint().x >= 620) {
leaveScene(0);
}
break;
- case 0x2000:
+ case NM_ANIMATION_UPDATE:
_buttonClicked = true;
if (_countdown == 0)
_countdown = 1;
diff --git a/engines/neverhood/modules/module3000.h b/engines/neverhood/modules/module3000.h
index a88dea513e..3d895b8d8a 100644
--- a/engines/neverhood/modules/module3000.h
+++ b/engines/neverhood/modules/module3000.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -34,8 +34,8 @@ public:
Module3000(NeverhoodEngine *vm, Module *parentModule, int which);
virtual ~Module3000();
protected:
- int _soundVolume;
- bool _isWallBroken;
+ int _waterfallSoundVolume;
+ bool _isWaterfallRunning;
void createScene(int sceneNum, int which);
void updateScene();
};
diff --git a/engines/neverhood/modules/module3000_sprites.cpp b/engines/neverhood/modules/module3000_sprites.cpp
index 7d0162d7d0..3f883eaa72 100644
--- a/engines/neverhood/modules/module3000_sprites.cpp
+++ b/engines/neverhood/modules/module3000_sprites.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -261,7 +261,7 @@ uint32 SsScene3009SymbolArrow::handleMessage(int messageNum, const MessageParam
_countdown = 2;
loadSprite(kSsScene3009SymbolArrowFileHashes1[_index], kSLFDefDrawOffset);
playSound(0);
- sendMessage(_asSymbol, 0x2005, _incrDecr);
+ sendMessage(_asSymbol, NM_KLAYMEN_CLIMB_LADDER, _incrDecr);
}
messageResult = 1;
break;
@@ -294,7 +294,7 @@ uint32 AsScene3009VerticalIndicator::handleMessage(int messageNum, const Message
switch (messageNum) {
case 0x1011:
if (_enabled) {
- sendMessage(_parentScene, 0x2002, 0);
+ sendMessage(_parentScene, NM_POSITION_CHANGE, 0);
}
messageResult = 1;
break;
@@ -388,7 +388,7 @@ AsScene3009Symbol::AsScene3009Symbol(NeverhoodEngine *vm, Scene3009 *parentScene
uint32 AsScene3009Symbol::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
uint32 messageResult = Sprite::handleMessage(messageNum, param, sender);
switch (messageNum) {
- case 0x2005:
+ case NM_KLAYMEN_CLIMB_LADDER:
if (param.asInteger()) {
if (_symbolIndex == 11)
_symbolIndex = 0;
@@ -501,7 +501,7 @@ uint32 SsScene3010DeadBoltButton::handleMessage(int messageNum, const MessagePar
_buttonLocked = true;
sendMessage(_parentScene, 0x2000, _buttonIndex);
} else {
- sendMessage(_parentScene, 0x2002, _buttonIndex);
+ sendMessage(_parentScene, NM_POSITION_CHANGE, _buttonIndex);
}
_needRefresh = true;
updatePosition();
@@ -565,7 +565,7 @@ void AsScene3010DeadBolt::update() {
uint32 AsScene3010DeadBolt::hmAnimation(int messageNum, const MessageParam &param, Entity *sender) {
uint32 messageResult = Sprite::handleMessage(messageNum, param, sender);
switch (messageNum) {
- case 0x3002:
+ case NM_ANIMATION_STOP:
gotoNextState();
break;
}
diff --git a/engines/neverhood/modules/module3000_sprites.h b/engines/neverhood/modules/module3000_sprites.h
index 7316613327..2c1369251d 100644
--- a/engines/neverhood/modules/module3000_sprites.h
+++ b/engines/neverhood/modules/module3000_sprites.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/neverhood/mouse.cpp b/engines/neverhood/mouse.cpp
index f11a3f99ea..0abbeba19d 100644
--- a/engines/neverhood/mouse.cpp
+++ b/engines/neverhood/mouse.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/neverhood/mouse.h b/engines/neverhood/mouse.h
index d6f42b4071..3e71f60de2 100644
--- a/engines/neverhood/mouse.h
+++ b/engines/neverhood/mouse.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/neverhood/navigationscene.cpp b/engines/neverhood/navigationscene.cpp
index a15c00de07..a1eeae9c1c 100644
--- a/engines/neverhood/navigationscene.cpp
+++ b/engines/neverhood/navigationscene.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -106,19 +106,19 @@ void NavigationScene::update() {
uint32 NavigationScene::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
switch (messageNum) {
- case 0x0000:
+ case NM_MOUSE_MOVE:
if (_interactive)
sendMessage(_mouseCursor, 0x4002, param);
break;
- case 0x0001:
+ case NM_MOUSE_CLICK:
if (_interactive)
handleNavigation(param.asPoint());
break;
- case 0x0009:
+ case NM_KEYPRESS_SPACE:
if (!_interactive)
_smackerDone = true;
break;
- case 0x3002:
+ case NM_ANIMATION_STOP:
_smackerDone = true;
break;
}
diff --git a/engines/neverhood/navigationscene.h b/engines/neverhood/navigationscene.h
index c17446811c..8e286effb9 100644
--- a/engines/neverhood/navigationscene.h
+++ b/engines/neverhood/navigationscene.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/neverhood/neverhood.cpp b/engines/neverhood/neverhood.cpp
index 1fb32a1834..c0a235cae3 100644
--- a/engines/neverhood/neverhood.cpp
+++ b/engines/neverhood/neverhood.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -45,7 +45,7 @@
namespace Neverhood {
-NeverhoodEngine::NeverhoodEngine(OSystem *syst, const NeverhoodGameDescription *gameDesc) : Engine(syst), _gameDescription(gameDesc) {
+NeverhoodEngine::NeverhoodEngine(OSystem *syst, const NeverhoodGameDescription *gameDesc) : Engine(syst), _gameDescription(gameDesc), _console(nullptr) {
// Setup mixer
if (!_mixer->isReady()) {
warning("Sound initialization failed.");
@@ -79,6 +79,7 @@ Common::Error NeverhoodEngine::run() {
// Assign default values to the config manager, in case settings are missing
ConfMan.registerDefault("originalsaveload", "false");
+ ConfMan.registerDefault("skiphallofrecordsscenes", "false");
_staticData = new StaticData();
_staticData->load("neverhood.dat");
@@ -177,6 +178,12 @@ void NeverhoodEngine::mainLoop() {
case Common::EVENT_RBUTTONUP:
_gameModule->handleMouseUp(event.mouse.x, event.mouse.y);
break;
+ case Common::EVENT_WHEELUP:
+ _gameModule->handleWheelUp();
+ break;
+ case Common::EVENT_WHEELDOWN:
+ _gameModule->handleWheelDown();
+ break;
case Common::EVENT_QUIT:
_system->quit();
break;
@@ -190,13 +197,12 @@ void NeverhoodEngine::mainLoop() {
_gameModule->draw();
_console->onFrame();
_screen->update();
+ if (_updateSound)
+ _soundMan->update();
nextFrameTime = _screen->getNextFrameTime();
};
- if (_updateSound) {
- _soundMan->update();
- _audioResourceMan->updateMusic();
- }
+ _audioResourceMan->updateMusic();
_system->updateScreen();
_system->delayMillis(10);
diff --git a/engines/neverhood/neverhood.h b/engines/neverhood/neverhood.h
index 0561aa251e..0661bcba0e 100644
--- a/engines/neverhood/neverhood.h
+++ b/engines/neverhood/neverhood.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -32,6 +32,8 @@
#include "common/system.h"
#include "audio/mixer.h"
#include "engines/engine.h"
+#include "gui/debugger.h"
+#include "neverhood/console.h"
#include "neverhood/messages.h"
namespace Neverhood {
@@ -48,7 +50,6 @@ class Screen;
class SoundMan;
class AudioResourceMan;
class StaticData;
-class Console;
struct NPoint;
struct GameState {
@@ -90,6 +91,7 @@ public:
GameModule *_gameModule;
StaticData *_staticData;
Console *_console;
+ GUI::Debugger *getDebugger() { return _console; }
SoundMan *_soundMan;
AudioResourceMan *_audioResourceMan;
diff --git a/engines/neverhood/palette.cpp b/engines/neverhood/palette.cpp
index 941bcc3cd3..39f1ecdbf1 100644
--- a/engines/neverhood/palette.cpp
+++ b/engines/neverhood/palette.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -119,7 +119,7 @@ void Palette::startFadeToBlack(int counter) {
_fadeToG = 0;
_fadeToB = 0;
_palCounter = counter;
- _fadeStep = 255 / counter;
+ _fadeStep = calculateFadeStep(counter);
_status = 1;
}
@@ -131,7 +131,7 @@ void Palette::startFadeToWhite(int counter) {
_fadeToG = 255;
_fadeToB = 255;
_palCounter = counter;
- _fadeStep = 255 / counter;
+ _fadeStep = calculateFadeStep(counter);
_status = 1;
}
@@ -140,7 +140,7 @@ void Palette::startFadeToPalette(int counter) {
if (counter == 0)
counter = 1;
_palCounter = counter;
- _fadeStep = 255 / counter;
+ _fadeStep = calculateFadeStep(counter);
_status = 2;
}
@@ -203,4 +203,11 @@ void Palette::fadeColor(byte *rgb, byte toR, byte toG, byte toB) {
#undef FADE
}
+int Palette::calculateFadeStep(int counter) {
+ int fadeStep = 255 / counter;
+ if (255 % counter)
+ fadeStep++;
+ return fadeStep;
+}
+
} // End of namespace Neverhood
diff --git a/engines/neverhood/palette.h b/engines/neverhood/palette.h
index c83207caae..f1b365fe47 100644
--- a/engines/neverhood/palette.h
+++ b/engines/neverhood/palette.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -61,6 +61,7 @@ protected:
int _fadeStep;
void update();
void fadeColor(byte *rgb, byte toR, byte toG, byte toB);
+ int calculateFadeStep(int counter);
};
} // End of namespace Neverhood
diff --git a/engines/neverhood/resource.cpp b/engines/neverhood/resource.cpp
index b45dbff3b9..8aba0ad37b 100644
--- a/engines/neverhood/resource.cpp
+++ b/engines/neverhood/resource.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/neverhood/resource.h b/engines/neverhood/resource.h
index 40236d9d22..a9d5b86d17 100644
--- a/engines/neverhood/resource.h
+++ b/engines/neverhood/resource.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/neverhood/resourceman.cpp b/engines/neverhood/resourceman.cpp
index b7d560bbb3..2065a13347 100644
--- a/engines/neverhood/resourceman.cpp
+++ b/engines/neverhood/resourceman.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -94,22 +94,30 @@ struct EntrySizeFix {
};
static const EntrySizeFix entrySizeFixes[] = {
- // fileHash offset diskSize size fixedSize
+ // fileHash offset diskSize size fixedSize
// Fixes for the Russian "Dyadyushka Risech" version
- { 0x41137051, 667019, 23391, 41398, 41401 }, // "Options" menu header text
- { 0x0f960021, 402268, 1704, 4378, 1870 }, // "Save" menu
- { 0x1301a7ea, 1220008, 2373, 4146, 2877 }, // "Load" menu
- { 0x84181e81, 201409, 1622, 5058, 1833 }, // "Delete" menu
- { 0x08C0AC24, 1031009, 3030, 6498, 3646 }, // Overwrite dialog
- { 0xc6604282, 12813649, 19623, 35894, 35895 }, // One of the fonts when reading Willie's notes
- { 0x80283101, 13104841, 1961, 3712, 3511 }, // The first message from Willie
- { 0x00918480, 17676417, 581, 916, 706 }, // The first wall in the museum
- { 0x00800090C,16064875, 19555, 38518, 38526 }, // The first wall in the museum
- { 0x058208810,46010519, 24852, 131874, 131776}, // The entry to hut with musical lock
+ { 0x041137051, 667019, 23391, 41398, 41401 }, // "Options" menu header text
+ { 0x00f960021, 402268, 1704, 4378, 1870 }, // "Save" menu
+ { 0x01301a7ea, 1220008, 2373, 4146, 2877 }, // "Load" menu
+ { 0x084181e81, 201409, 1622, 5058, 1833 }, // "Delete" menu
+ { 0x008C0AC24, 1031009, 3030, 6498, 3646 }, // Overwrite dialog
+ { 0x0c6604282, 12813649, 19623, 35894, 35895 }, // One of the fonts when reading Willie's notes
+ { 0x080283101, 13104841, 1961, 3712, 3511 }, // First message from Willie
+ { 0x000918480, 17676417, 581, 916, 706 }, // First wall in the museum
+ { 0x00800090C, 16064875, 19555, 38518, 38526 }, // First wall in the museum
+ { 0x058208810, 46010519, 24852, 131874, 131776 }, // Entry to hut with musical lock
+ { 0x00008E486, 39600019, 240, 454, 271 }, // Second wall in the museum
+ { 0x003086004, 39621755, 482, 614, 600 }, // Second wall in the museum
+ { 0x02008048E, 39611075, 3798, 21089, 21087 }, // Next couple of walls in the museum
+ { 0x008586283, 39587864, 12155, 29731, 29730 }, // Next couple of walls in the museum
+ { 0x030A84C80, 39606142, 4933, 16305, 16275 }, // Next couple of walls in the museum
+ { 0x000C9A480, 39614873, 6882, 23915, 23913 }, // Next couple of walls in the museum
+ { 0x000098880, 39603114, 3028, 10860, 10859 }, // Next couple of walls in the museum
+ { 0x040080183, 39600259, 2855, 13400, 13395 }, // Last buggy wall in the museum
// Fixes for the Russian "Fargus" version
- { 0x41137051, 758264, 29037, 49590, 49591 }, // "Options" menu header text
- { 0xc10b2015, 787304, 4414, 15848, 15853 }, // Text on option buttons
+ { 0x041137051, 758264, 29037, 49590, 49591 }, // "Options" menu header text
+ { 0x0c10b2015, 787304, 4414, 15848, 15853 }, // Text on option buttons
//
{ 0, 0, 0, 0, 0 }
};
diff --git a/engines/neverhood/resourceman.h b/engines/neverhood/resourceman.h
index 29bf40a6b8..306e02f788 100644
--- a/engines/neverhood/resourceman.h
+++ b/engines/neverhood/resourceman.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/neverhood/saveload.cpp b/engines/neverhood/saveload.cpp
index 01988769e6..8fe6c9a155 100644
--- a/engines/neverhood/saveload.cpp
+++ b/engines/neverhood/saveload.cpp
@@ -8,17 +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.
*
- *
*/
#include "common/savefile.h"
diff --git a/engines/neverhood/scene.cpp b/engines/neverhood/scene.cpp
index 9a7e87ac8d..1a8e74da38 100644
--- a/engines/neverhood/scene.cpp
+++ b/engines/neverhood/scene.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -148,7 +148,7 @@ void Scene::printSurfaces(Console *con) {
NDrawRect drawRect = _surfaces[index]->getDrawRect();
NRect clipRect = _surfaces[index]->getClipRect();
int priority = _surfaces[index]->getPriority();
- con->DebugPrintf("%d ('%s'): Priority %d, draw rect (%d, %d, %d, %d), clip rect (%d, %d, %d, %d)\n",
+ con->debugPrintf("%d ('%s'): Priority %d, draw rect (%d, %d, %d, %d), clip rect (%d, %d, %d, %d)\n",
index, _surfaces[index]->getName().c_str(), priority,
drawRect.x, drawRect.y, drawRect.x2(), drawRect.y2(),
clipRect.x1, clipRect.y1, clipRect.x2, clipRect.y2);
@@ -283,11 +283,11 @@ void Scene::leaveScene(uint32 result) {
uint32 Scene::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
switch (messageNum) {
- case 0x0000: // mouse moved
+ case NM_MOUSE_MOVE:
if (_mouseCursor && _mouseCursor->hasMessageHandler())
sendMessage(_mouseCursor, 0x4002, param);
break;
- case 0x0001: // mouse clicked
+ case NM_MOUSE_CLICK:
_mouseClicked = true;
_mouseClickPos = param.asPoint();
break;
@@ -301,7 +301,7 @@ uint32 Scene::handleMessage(int messageNum, const MessageParam &param, Entity *s
if (_messageListIndex == _messageListCount) {
// If the current message list was processed completely,
// sent Klaymen into the idle state.
- sendMessage(_klaymen, 0x4004, 0);
+ sendMessage(_klaymen, NM_KLAYMEN_STAND_IDLE, 0);
} else {
// Else continue with the next message in the current message list
processMessageList();
@@ -314,23 +314,21 @@ uint32 Scene::handleMessage(int messageNum, const MessageParam &param, Entity *s
if (_isKlaymenBusy) {
_isKlaymenBusy = false;
_messageList = NULL;
- sendMessage(_klaymen, 0x4004, 0);
+ sendMessage(_klaymen, NM_KLAYMEN_STAND_IDLE, 0);
}
break;
- case 0x101D:
- // Hide the mouse cursor
+ case NM_MOUSE_HIDE:
if (_mouseCursor) {
_mouseCursorWasVisible = _mouseCursor->getSurface()->getVisible();
_mouseCursor->getSurface()->setVisible(false);
}
break;
- case 0x101E:
- // Show the mouse cursor
+ case NM_MOUSE_SHOW:
if (_mouseCursorWasVisible && _mouseCursor) {
_mouseCursor->getSurface()->setVisible(true);
}
break;
- case 0x1022:
+ case NM_PRIORITY_CHANGE:
// Set the sender's surface priority
setSurfacePriority(((Sprite*)sender)->getSurface(), param.asInteger());
break;
@@ -451,7 +449,7 @@ void Scene::processMessageList() {
_isKlaymenBusy = true;
sendPointMessage(_klaymen, 0x4001, _mouseClickPos);
} else if (messageNum == 0x100D) {
- if (this->hasMessageHandler() && sendMessage(this, 0x100D, messageParam) != 0)
+ if (this->hasMessageHandler() && sendMessage(this, NM_ANIMATION_START, messageParam) != 0)
continue;
} else if (messageNum == 0x101A) {
_messageListStatus = 0;
@@ -485,7 +483,7 @@ void Scene::cancelMessageList() {
_isKlaymenBusy = false;
_messageList = NULL;
_canAcceptInput = true;
- sendMessage(_klaymen, 0x4004, 0);
+ sendMessage(_klaymen, NM_KLAYMEN_STAND_IDLE, 0);
}
void Scene::setRectList(uint32 id) {
@@ -617,7 +615,7 @@ StaticScene::StaticScene(NeverhoodEngine *vm, Module *parentModule, uint32 backg
uint32 StaticScene::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
Scene::handleMessage(messageNum, param, sender);
switch (messageNum) {
- case 0x0001:
+ case NM_MOUSE_CLICK:
if (param.asPoint().x <= 20 || param.asPoint().x >= 620)
leaveScene(0);
break;
diff --git a/engines/neverhood/scene.h b/engines/neverhood/scene.h
index e6183199ce..98a7fa5090 100644
--- a/engines/neverhood/scene.h
+++ b/engines/neverhood/scene.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/neverhood/screen.cpp b/engines/neverhood/screen.cpp
index 901ab73b39..cc735c4c16 100644
--- a/engines/neverhood/screen.cpp
+++ b/engines/neverhood/screen.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/neverhood/screen.h b/engines/neverhood/screen.h
index c778066152..82ce90b245 100644
--- a/engines/neverhood/screen.h
+++ b/engines/neverhood/screen.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -79,7 +79,6 @@ public:
void drawSurface2(const Graphics::Surface *surface, NDrawRect &drawRect, NRect &clipRect, bool transparent, byte version,
const Graphics::Surface *shadowSurface = NULL);
void drawSurface3(const Graphics::Surface *surface, int16 x, int16 y, NDrawRect &drawRect, NRect &clipRect, bool transparent, byte version);
- void drawShadowSurface(const Graphics::Surface *surface, const Graphics::Surface *shadowSurface, int16 x, int16 y, NDrawRect &drawRect, NRect &clipRect);
void drawDoubleSurface2(const Graphics::Surface *surface, NDrawRect &drawRect);
void drawUnk(const Graphics::Surface *surface, NDrawRect &drawRect, NDrawRect &sysRect, NRect &clipRect, bool transparent, byte version);
void drawSurfaceClipRects(const Graphics::Surface *surface, NDrawRect &drawRect, NRect *clipRects, uint clipRectsCount, bool transparent, byte version);
diff --git a/engines/neverhood/smackerplayer.cpp b/engines/neverhood/smackerplayer.cpp
index 187939faee..e15e729f81 100644
--- a/engines/neverhood/smackerplayer.cpp
+++ b/engines/neverhood/smackerplayer.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -21,6 +21,7 @@
*/
#include "graphics/palette.h"
+#include "neverhood/gamemodule.h"
#include "neverhood/smackerplayer.h"
#include "neverhood/palette.h"
#include "neverhood/resourceman.h"
@@ -160,7 +161,7 @@ void SmackerPlayer::close() {
void SmackerPlayer::gotoFrame(int frameNumber) {
if (_smackerDecoder) {
_smackerDecoder->forceSeekToFrame(frameNumber);
- _smackerDecoder->decodeNextFrame();
+ updateFrame();
}
}
@@ -204,7 +205,7 @@ void SmackerPlayer::update() {
} else if (!_keepLastFrame) {
// Inform the scene about the end of the video playback
if (_scene)
- sendMessage(_scene, 0x3002, 0);
+ sendMessage(_scene, NM_ANIMATION_STOP, 0);
_videoDone = true;
} else {
rewind();
@@ -251,6 +252,15 @@ void SmackerPlayer::updatePalette() {
tempPalette[i * 4 + 1] = smackerPalette[i * 3 + 1];
tempPalette[i * 4 + 2] = smackerPalette[i * 3 + 2];
}
+
+ // WORKAROUND: Scene 3, module 3000 defines a black color 255 instead of
+ // white, which results in the mouse cursor showing black. I'm not sure if
+ // color 255 is always supposed to be white. It's not feasible to check
+ // all scenes for a glitch that only seems to manifest in one, therefore
+ // we define color 255 to be white only for that scene.
+ if (_vm->_gameModule->getCurrentModuleNum() == 3000 && _vm->_gameState.sceneNum == 3)
+ tempPalette[255 * 4 + 0] = tempPalette[255 * 4 + 1] = tempPalette[255 * 4 + 2] = 0xFF;
+
_palette->copyPalette(tempPalette, 0, 256, 0);
}
diff --git a/engines/neverhood/smackerplayer.h b/engines/neverhood/smackerplayer.h
index dd7199dd6d..e08854bd96 100644
--- a/engines/neverhood/smackerplayer.h
+++ b/engines/neverhood/smackerplayer.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/neverhood/smackerscene.cpp b/engines/neverhood/smackerscene.cpp
index d9d032a3b5..2b43579130 100644
--- a/engines/neverhood/smackerscene.cpp
+++ b/engines/neverhood/smackerscene.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -104,15 +104,15 @@ void SmackerScene::update() {
uint32 SmackerScene::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
uint32 messageResult = Scene::handleMessage(messageNum, param, sender);
switch (messageNum) {
- case 0x0009:
+ case NM_KEYPRESS_SPACE:
if ((_videoPlayedBefore && _canSkip) || (_canAbort && _canSkip))
_playNextVideoFlag = true;
break;
- case 0x000C:
+ case NM_KEYPRESS_ESC:
if (_canAbort)
sendMessage(_parentModule, 0x1009, 0);
break;
- case 0x3002:
+ case NM_ANIMATION_STOP:
_playNextVideoFlag = true;
break;
}
diff --git a/engines/neverhood/smackerscene.h b/engines/neverhood/smackerscene.h
index 8e5084512f..e2c1802b61 100644
--- a/engines/neverhood/smackerscene.h
+++ b/engines/neverhood/smackerscene.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/neverhood/sound.cpp b/engines/neverhood/sound.cpp
index 3ea45491a7..d53243d4ba 100644
--- a/engines/neverhood/sound.cpp
+++ b/engines/neverhood/sound.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -66,6 +66,12 @@ void SoundResource::play() {
soundItem->playSound(false);
}
+void SoundResource::playLooping() {
+ AudioResourceManSoundItem *soundItem = getSoundItem();
+ if (soundItem)
+ soundItem->playSound(true);
+}
+
void SoundResource::stop() {
AudioResourceManSoundItem *soundItem = getSoundItem();
if (soundItem)
@@ -208,7 +214,7 @@ void SoundItem::setSoundParams(bool playOnceAfterRandomCountdown, int16 minCount
_minCountdown = minCountdown;
if (maxCountdown > 0)
_maxCountdown = maxCountdown;
- if (firstMinCountdown >= firstMaxCountdown)
+ if (firstMinCountdown > firstMaxCountdown)
_currCountdown = firstMinCountdown;
else if (firstMinCountdown > 0 && firstMaxCountdown > 0 && firstMinCountdown < firstMaxCountdown)
_currCountdown = _vm->_rnd->getRandomNumberRng(firstMinCountdown, firstMaxCountdown);
@@ -235,24 +241,24 @@ void SoundItem::update() {
if (_playOnceAfterCountdown) {
if (_currCountdown == 0)
_currCountdown = _initialCountdown;
- else if (--_currCountdown == 0)
+ else if (--_currCountdown <= 0)
_soundResource->play();
} else if (_playOnceAfterRandomCountdown) {
if (_currCountdown == 0) {
if (_minCountdown > 0 && _maxCountdown > 0 && _minCountdown < _maxCountdown)
_currCountdown = _vm->_rnd->getRandomNumberRng(_minCountdown, _maxCountdown);
- } else if (--_currCountdown == 0)
+ } else if (--_currCountdown <= 0)
_soundResource->play();
} else if (_playLooping && !_soundResource->isPlaying())
- _soundResource->play();
+ _soundResource->playLooping();
}
// SoundMan
SoundMan::SoundMan(NeverhoodEngine *vm)
: _vm(vm), _soundIndex1(-1), _soundIndex2(-1), _soundIndex3(-1),
- _initialCountdown(0), _playOnceAfterCountdown(false),
- _initialCountdown3(0), _playOnceAfterCountdown3(false) {
+ _initialCountdown(15), _playOnceAfterCountdown(false),
+ _initialCountdown3(9), _playOnceAfterCountdown3(false) {
}
SoundMan::~SoundMan() {
@@ -373,7 +379,6 @@ void SoundMan::update() {
if (soundItem)
soundItem->update();
}
-
for (uint i = 0; i < _musicItems.size(); ++i) {
MusicItem *musicItem = _musicItems[i];
if (musicItem)
@@ -553,15 +558,19 @@ int NeverhoodAudioStream::readBuffer(int16 *buffer, const int numSamples) {
*buffer++ = _prevValue << _shiftValue;
}
} else {
- memcpy(buffer, _buffer, bytesRead);
- buffer += bytesRead;
+ while (samplesRead--) {
+ *buffer++ = READ_LE_UINT16(src);
+ src += 2;
+ }
}
if (bytesRead < bytesToRead || _stream->pos() >= _stream->size() || _stream->err() || _stream->eos()) {
- if (_isLooping)
+ if (_isLooping) {
_stream->seek(0);
- else
+ _prevValue = 0;
+ } else {
_endOfData = true;
+ }
}
}
@@ -609,7 +618,7 @@ void AudioResourceManSoundItem::playSound(bool looping) {
if (_data) {
const byte *shiftValue = _resourceHandle.extData();
Common::MemoryReadStream *stream = new Common::MemoryReadStream(_data, _resourceHandle.size(), DisposeAfterUse::NO);
- NeverhoodAudioStream *audioStream = new NeverhoodAudioStream(22050, *shiftValue, false, DisposeAfterUse::YES, stream);
+ NeverhoodAudioStream *audioStream = new NeverhoodAudioStream(22050, *shiftValue, looping, DisposeAfterUse::YES, stream);
_vm->_mixer->playStream(Audio::Mixer::kSFXSoundType, &_soundHandle,
audioStream, -1, VOLUME(_volume), PANNING(_panning));
debug(1, "playing sound %08X", _fileHash);
diff --git a/engines/neverhood/sound.h b/engines/neverhood/sound.h
index 548fe88501..512b0fef98 100644
--- a/engines/neverhood/sound.h
+++ b/engines/neverhood/sound.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -50,6 +50,7 @@ public:
void unload();
void play(uint32 fileHash);
void play();
+ void playLooping();
void stop();
void setVolume(int16 volume);
void setPan(int16 pan);
diff --git a/engines/neverhood/sprite.cpp b/engines/neverhood/sprite.cpp
index 1a432461fb..a566b8ee3b 100644
--- a/engines/neverhood/sprite.cpp
+++ b/engines/neverhood/sprite.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -372,7 +372,7 @@ void AnimatedSprite::updateFrameIndex() {
} else {
// Inform self about end of current animation
// The caller can then e.g. set a new animation fileHash
- sendMessage(this, 0x3002, 0);
+ sendMessage(this, NM_ANIMATION_STOP, 0);
if (_newAnimFileHash == 0)
_currFrameIndex = 0;
}
@@ -380,7 +380,7 @@ void AnimatedSprite::updateFrameIndex() {
if (_currFrameIndex > 0) {
_currFrameIndex--;
} else {
- sendMessage(this, 0x3002, 0);
+ sendMessage(this, NM_ANIMATION_STOP, 0);
if (_newAnimFileHash == 0)
_currFrameIndex = _lastFrameIndex;
}
@@ -399,7 +399,7 @@ void AnimatedSprite::updateFrameInfo() {
updateBounds();
_needRefresh = true;
if (frameInfo.frameHash != 0)
- sendMessage(this, 0x100D, frameInfo.frameHash);
+ sendMessage(this, NM_ANIMATION_START, frameInfo.frameHash);
}
void AnimatedSprite::createSurface1(uint32 fileHash, int surfacePriority) {
diff --git a/engines/neverhood/sprite.h b/engines/neverhood/sprite.h
index 1d17bf0e70..5422fd15d5 100644
--- a/engines/neverhood/sprite.h
+++ b/engines/neverhood/sprite.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/neverhood/staticdata.cpp b/engines/neverhood/staticdata.cpp
index ec9c852118..03af44b2a5 100644
--- a/engines/neverhood/staticdata.cpp
+++ b/engines/neverhood/staticdata.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -28,6 +28,18 @@ StaticData::StaticData() {
}
StaticData::~StaticData() {
+ for (Common::HashMap<uint32, HitRectList*>::iterator i = _hitRectLists.begin(); i != _hitRectLists.end(); ++i)
+ delete i->_value;
+ for (Common::HashMap<uint32, RectList*>::iterator i = _rectLists.begin(); i != _rectLists.end(); ++i)
+ delete i->_value;
+ for (Common::HashMap<uint32, MessageList*>::iterator i = _messageLists.begin(); i != _messageLists.end(); ++i)
+ delete i->_value;
+ for (Common::HashMap<uint32, NavigationList*>::iterator i = _navigationLists.begin(); i != _navigationLists.end(); ++i)
+ delete i->_value;
+ for (Common::HashMap<uint32, HallOfRecordsInfo*>::iterator i = _hallOfRecordsInfoItems.begin(); i != _hallOfRecordsInfoItems.end(); ++i)
+ delete i->_value;
+ for (Common::HashMap<uint32, TrackInfo*>::iterator i = _trackInfoItems.begin(); i != _trackInfoItems.end(); ++i)
+ delete i->_value;
}
void StaticData::load(const char *filename) {
@@ -69,6 +81,11 @@ void StaticData::load(const char *filename) {
messageList->push_back(messageItem);
}
+ if(_messageLists.contains(id)) {
+ warning("Duplicate id %d in _messageLists - freeing older entry", id);
+ delete _messageLists[id];
+ }
+
_messageLists[id] = messageList;
}
@@ -98,6 +115,12 @@ void StaticData::load(const char *filename) {
}
rectList->push_back(rectItem);
}
+
+ if(_rectLists.contains(id)) {
+ warning("Duplicate id %d in _rectLists - freeing older entry", id);
+ delete _rectLists[id];
+ }
+
_rectLists[id] = rectList;
}
@@ -117,6 +140,12 @@ void StaticData::load(const char *filename) {
hitRect.type = fd.readUint16LE();
hitRectList->push_back(hitRect);
}
+
+ if(_hitRectLists.contains(id)) {
+ warning("Duplicate id %d in _hitRectLists - freeing older entry", id);
+ delete _hitRectLists[id];
+ }
+
_hitRectLists[id] = hitRectList;
}
@@ -138,6 +167,12 @@ void StaticData::load(const char *filename) {
navigationItem.mouseCursorFileHash = fd.readUint32LE();
navigationList->push_back(navigationItem);
}
+
+ if(_navigationLists.contains(id)) {
+ warning("Duplicate id %d in _navigationLists - freeing older entry", id);
+ delete _navigationLists[id];
+ }
+
_navigationLists[id] = navigationList;
}
@@ -153,6 +188,12 @@ void StaticData::load(const char *filename) {
hallOfRecordsInfo->bgFilename3 = fd.readUint32LE();
hallOfRecordsInfo->xPosIndex = fd.readByte();
hallOfRecordsInfo->count = fd.readByte();
+
+ if(_hallOfRecordsInfoItems.contains(id)) {
+ warning("Duplicate id %d in _hallOfRecordsInfoItems - freeing older entry", id);
+ delete _hallOfRecordsInfoItems[id];
+ }
+
_hallOfRecordsInfoItems[id] = hallOfRecordsInfo;
}
@@ -172,6 +213,12 @@ void StaticData::load(const char *filename) {
trackInfo->mouseCursorFilename = fd.readUint32LE();
trackInfo->which1 = fd.readUint16LE();
trackInfo->which2 = fd.readUint16LE();
+
+ if(_trackInfoItems.contains(id)) {
+ warning("Duplicate id %d in _trackInfoItems - freeing older entry", id);
+ delete _trackInfoItems[id];
+ }
+
_trackInfoItems[id] = trackInfo;
}
diff --git a/engines/neverhood/staticdata.h b/engines/neverhood/staticdata.h
index b1cab3bfcd..88dad56f78 100644
--- a/engines/neverhood/staticdata.h
+++ b/engines/neverhood/staticdata.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/obsolete.cpp b/engines/obsolete.cpp
index 6733a384be..d65fb13ec1 100644
--- a/engines/obsolete.cpp
+++ b/engines/obsolete.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/obsolete.h b/engines/obsolete.h
index 97bc7524a6..be0963a7dc 100644
--- a/engines/obsolete.h
+++ b/engines/obsolete.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/parallaction/adlib.cpp b/engines/parallaction/adlib.cpp
index 134e5cfbf3..7c1dd1681f 100644
--- a/engines/parallaction/adlib.cpp
+++ b/engines/parallaction/adlib.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/parallaction/balloons.cpp b/engines/parallaction/balloons.cpp
index 2a7e0ce375..234abff59a 100644
--- a/engines/parallaction/balloons.cpp
+++ b/engines/parallaction/balloons.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/parallaction/callables_br.cpp b/engines/parallaction/callables_br.cpp
index 7d3e63dfba..ca60b8e578 100644
--- a/engines/parallaction/callables_br.cpp
+++ b/engines/parallaction/callables_br.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/parallaction/callables_ns.cpp b/engines/parallaction/callables_ns.cpp
index 04642aa632..280cccd15f 100644
--- a/engines/parallaction/callables_ns.cpp
+++ b/engines/parallaction/callables_ns.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/parallaction/configure.engine b/engines/parallaction/configure.engine
new file mode 100644
index 0000000000..babca4579f
--- /dev/null
+++ b/engines/parallaction/configure.engine
@@ -0,0 +1,3 @@
+# This file is included from the main "configure" script
+# add_engine [name] [desc] [build-by-default] [subengines] [base games] [deps]
+add_engine parallaction "Parallaction" yes
diff --git a/engines/parallaction/debug.cpp b/engines/parallaction/debug.cpp
index 4a8f8c71d7..a7087c64d7 100644
--- a/engines/parallaction/debug.cpp
+++ b/engines/parallaction/debug.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -33,18 +33,18 @@ Debugger::Debugger(Parallaction *vm)
: GUI::Debugger() {
_vm = vm;
- DCmd_Register("continue", WRAP_METHOD(Debugger, Cmd_Exit));
- DCmd_Register("location", WRAP_METHOD(Debugger, Cmd_Location));
- DCmd_Register("give", WRAP_METHOD(Debugger, Cmd_Give));
- DCmd_Register("zones", WRAP_METHOD(Debugger, Cmd_Zones));
- DCmd_Register("animations", WRAP_METHOD(Debugger, Cmd_Animations));
- DCmd_Register("globalflags",WRAP_METHOD(Debugger, Cmd_GlobalFlags));
- DCmd_Register("toggleglobalflag",WRAP_METHOD(Debugger, Cmd_ToggleGlobalFlag));
- DCmd_Register("localflags", WRAP_METHOD(Debugger, Cmd_LocalFlags));
- DCmd_Register("locations", WRAP_METHOD(Debugger, Cmd_Locations));
- DCmd_Register("gfxobjects", WRAP_METHOD(Debugger, Cmd_GfxObjects));
- DCmd_Register("programs", WRAP_METHOD(Debugger, Cmd_Programs));
- DCmd_Register("showmouse", WRAP_METHOD(Debugger, Cmd_ShowMouse));
+ registerCmd("continue", WRAP_METHOD(Debugger, cmdExit));
+ registerCmd("location", WRAP_METHOD(Debugger, Cmd_Location));
+ registerCmd("give", WRAP_METHOD(Debugger, Cmd_Give));
+ registerCmd("zones", WRAP_METHOD(Debugger, Cmd_Zones));
+ registerCmd("animations", WRAP_METHOD(Debugger, Cmd_Animations));
+ registerCmd("globalflags",WRAP_METHOD(Debugger, Cmd_GlobalFlags));
+ registerCmd("toggleglobalflag",WRAP_METHOD(Debugger, Cmd_ToggleGlobalFlag));
+ registerCmd("localflags", WRAP_METHOD(Debugger, Cmd_LocalFlags));
+ registerCmd("locations", WRAP_METHOD(Debugger, Cmd_Locations));
+ registerCmd("gfxobjects", WRAP_METHOD(Debugger, Cmd_GfxObjects));
+ registerCmd("programs", WRAP_METHOD(Debugger, Cmd_Programs));
+ registerCmd("showmouse", WRAP_METHOD(Debugger, Cmd_ShowMouse));
}
@@ -81,7 +81,7 @@ bool Debugger::Cmd_Location(int argc, const char **argv) {
break;
case 1:
- DebugPrintf("location <location name> [character name]\n");
+ debugPrintf("location <location name> [character name]\n");
}
@@ -90,13 +90,13 @@ bool Debugger::Cmd_Location(int argc, const char **argv) {
bool Debugger::Cmd_Locations(int argc, const char **argv) {
- DebugPrintf("+------------------------------+---------+\n"
+ debugPrintf("+------------------------------+---------+\n"
"| location name | flags |\n"
"+------------------------------+---------+\n");
for (uint i = 0; i < _vm->_numLocations; i++) {
- DebugPrintf("|%-30s| %08x|\n", _vm->_locationNames[i], _vm->_localFlags[i]);
+ debugPrintf("|%-30s| %08x|\n", _vm->_locationNames[i], _vm->_localFlags[i]);
}
- DebugPrintf("+------------------------------+---------+\n");
+ debugPrintf("+------------------------------+---------+\n");
return true;
}
@@ -105,14 +105,14 @@ bool Debugger::Cmd_GlobalFlags(int argc, const char **argv) {
uint32 flags = g_globalFlags;
- DebugPrintf("+------------------------------+---------+\n"
+ debugPrintf("+------------------------------+---------+\n"
"| flag name | value |\n"
"+------------------------------+---------+\n");
for (uint i = 0; i < _vm->_globalFlagsNames->count(); i++) {
const char *value = ((flags & (1 << i)) == 0) ? "OFF" : "ON";
- DebugPrintf("|%-30s| %-6s|\n", _vm->_globalFlagsNames->item(i), value);
+ debugPrintf("|%-30s| %-6s|\n", _vm->_globalFlagsNames->item(i), value);
}
- DebugPrintf("+------------------------------+---------+\n");
+ debugPrintf("+------------------------------+---------+\n");
return true;
}
@@ -125,7 +125,7 @@ bool Debugger::Cmd_ToggleGlobalFlag(int argc, const char **argv) {
case 2:
i = _vm->_globalFlagsNames->lookup(argv[1]);
if (i == Table::notFound) {
- DebugPrintf("invalid flag '%s'\n", argv[1]);
+ debugPrintf("invalid flag '%s'\n", argv[1]);
} else {
i--;
if ((g_globalFlags & (1 << i)) == 0)
@@ -136,7 +136,7 @@ bool Debugger::Cmd_ToggleGlobalFlag(int argc, const char **argv) {
break;
default:
- DebugPrintf("toggleglobalflag <flag name>\n");
+ debugPrintf("toggleglobalflag <flag name>\n");
}
@@ -147,14 +147,14 @@ bool Debugger::Cmd_LocalFlags(int argc, const char **argv) {
uint32 flags = _vm->getLocationFlags();
- DebugPrintf("+------------------------------+---------+\n"
+ debugPrintf("+------------------------------+---------+\n"
"| flag name | value |\n"
"+------------------------------+---------+\n");
for (uint i = 0; i < _vm->_localFlagNames->count(); i++) {
const char *value = ((flags & (1 << i)) == 0) ? "OFF" : "ON";
- DebugPrintf("|%-30s| %-6s|\n", _vm->_localFlagNames->item(i), value);
+ debugPrintf("|%-30s| %-6s|\n", _vm->_localFlagNames->item(i), value);
}
- DebugPrintf("+------------------------------+---------+\n");
+ debugPrintf("+------------------------------+---------+\n");
return true;
}
@@ -162,13 +162,13 @@ bool Debugger::Cmd_LocalFlags(int argc, const char **argv) {
bool Debugger::Cmd_Give(int argc, const char **argv) {
if (argc == 1) {
- DebugPrintf("give <item name>\n");
+ debugPrintf("give <item name>\n");
} else {
int index = _vm->_objectsNames->lookup(argv[1]);
if (index != Table::notFound)
_vm->addInventoryItem(index + 4);
else
- DebugPrintf("invalid item name '%s'\n", argv[1]);
+ debugPrintf("invalid item name '%s'\n", argv[1]);
}
return true;
@@ -181,15 +181,15 @@ bool Debugger::Cmd_Zones(int argc, const char **argv) {
ZoneList::iterator e = _vm->_location._zones.end();
Common::Rect r;
- DebugPrintf("+--------------------+---+---+---+---+--------+--------+\n"
+ debugPrintf("+--------------------+---+---+---+---+--------+--------+\n"
"| name | l | t | r | b | type | flag |\n"
"+--------------------+---+---+---+---+--------+--------+\n");
for ( ; b != e; ++b) {
ZonePtr z = *b;
z->getRect(r);
- DebugPrintf("|%-20s|%3i|%3i|%3i|%3i|%8x|%8x|\n", z->_name, r.left, r.top, r.right, r.bottom, z->_type, z->_flags );
+ debugPrintf("|%-20s|%3i|%3i|%3i|%3i|%8x|%8x|\n", z->_name, r.left, r.top, r.right, r.bottom, z->_type, z->_flags );
}
- DebugPrintf("+--------------------+---+---+---+---+--------+--------+\n");
+ debugPrintf("+--------------------+---+---+---+---+--------+--------+\n");
return true;
@@ -260,15 +260,15 @@ bool Debugger::Cmd_Animations(int argc, const char **argv) {
AnimationList::iterator e = _vm->_location._animations.end();
Common::String flags;
- DebugPrintf("+--------------------+----+----+----+---+--------+----------------------------------------+\n"
+ debugPrintf("+--------------------+----+----+----+---+--------+----------------------------------------+\n"
"| name | x | y | z | f | type | flags | \n"
"+--------------------+----+----+----+---+--------+----------------------------------------+\n");
for ( ; b != e; ++b) {
AnimationPtr a = *b;
flags = decodeZoneFlags(a->_flags);
- DebugPrintf("|%-20s|%4i|%4i|%4i|%3i|%8x|%-40s|\n", a->_name, a->getX(), a->getY(), a->getZ(), a->getF(), a->_type, flags.c_str() );
+ debugPrintf("|%-20s|%4i|%4i|%4i|%3i|%8x|%-40s|\n", a->_name, a->getX(), a->getY(), a->getZ(), a->getF(), a->_type, flags.c_str() );
}
- DebugPrintf("+--------------------+---+---+---+---+--------+----------------------------------------+\n");
+ debugPrintf("+--------------------+---+---+---+---+--------+----------------------------------------+\n");
return true;
@@ -278,7 +278,7 @@ bool Debugger::Cmd_GfxObjects(int argc, const char **argv) {
const char *objType[] = { "DOOR", "GET", "ANIM" };
- DebugPrintf("+--------------------+-----+-----+-----+-----+-----+-------+-----+--------+\n"
+ debugPrintf("+--------------------+-----+-----+-----+-----+-----+-------+-----+--------+\n"
"| name | x | y | w | h | z | layer | f | type |\n"
"+--------------------+-----+-----+-----+-----+-----+-------+-----+--------+\n");
@@ -289,11 +289,11 @@ bool Debugger::Cmd_GfxObjects(int argc, const char **argv) {
for ( ; b != e; ++b) {
GfxObj *obj = *b;
obj->getRect(obj->frame, r);
- DebugPrintf("|%-20s|%5i|%5i|%5i|%5i|%5i|%7i|%5i|%8s|\n", obj->getName(), r.left, r.top, r.width(), r.height(),
+ debugPrintf("|%-20s|%5i|%5i|%5i|%5i|%5i|%7i|%5i|%8s|\n", obj->getName(), r.left, r.top, r.width(), r.height(),
obj->z, obj->layer, obj->frame, objType[obj->type]);
}
- DebugPrintf("+--------------------+-----+-----+-----+-----+-----+-------+-----+--------+\n");
+ debugPrintf("+--------------------+-----+-----+-----+-----+-----+-------+-----+--------+\n");
return true;
}
@@ -307,14 +307,14 @@ bool Debugger::Cmd_Programs(int argc, const char** argv) {
int i = 1;
- DebugPrintf("+---+--------------------+--------+----------+\n"
+ debugPrintf("+---+--------------------+--------+----------+\n"
"| # | bound animation | size | status |\n"
"+---+--------------------+--------+----------+\n");
for ( ; b != e; b++, i++) {
ProgramPtr p = *b;
- DebugPrintf("|%3i|%-20s|%8i|%-10s|\n", i, p->_anim->_name, p->_instructions.size(), status[p->_status] );
+ debugPrintf("|%3i|%-20s|%8i|%-10s|\n", i, p->_anim->_name, p->_instructions.size(), status[p->_status] );
}
- DebugPrintf("+---+--------------------+--------+----------+\n");
+ debugPrintf("+---+--------------------+--------+----------+\n");
return true;
}
diff --git a/engines/parallaction/debug.h b/engines/parallaction/debug.h
index 887d08e945..551d746edf 100644
--- a/engines/parallaction/debug.h
+++ b/engines/parallaction/debug.h
@@ -22,7 +22,6 @@ private:
Parallaction *_vm;
MouseTriState _mouseState;
- bool Cmd_DebugLevel(int argc, const char **argv);
bool Cmd_Location(int argc, const char **argv);
bool Cmd_Give(int argc, const char **argv);
bool Cmd_Zones(int argc, const char **argv);
diff --git a/engines/parallaction/detection.cpp b/engines/parallaction/detection.cpp
index fb892c44b2..277f1cbe69 100644
--- a/engines/parallaction/detection.cpp
+++ b/engines/parallaction/detection.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/parallaction/dialogue.cpp b/engines/parallaction/dialogue.cpp
index 06ffd0b89b..62e2152816 100644
--- a/engines/parallaction/dialogue.cpp
+++ b/engines/parallaction/dialogue.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/parallaction/disk.h b/engines/parallaction/disk.h
index 63e33dcfbd..2e43b6f87b 100644
--- a/engines/parallaction/disk.h
+++ b/engines/parallaction/disk.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/parallaction/disk_br.cpp b/engines/parallaction/disk_br.cpp
index f648f4b9a1..7458065b8c 100644
--- a/engines/parallaction/disk_br.cpp
+++ b/engines/parallaction/disk_br.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -23,7 +23,7 @@
#include "common/config-manager.h"
#include "common/fs.h"
#include "common/textconsole.h"
-#include "graphics/decoders/iff.h"
+#include "image/iff.h"
#include "parallaction/parallaction.h"
#include "parallaction/parser.h"
@@ -460,7 +460,7 @@ void AmigaDisk_br::loadBackground(BackgroundInfo& info, const char *filename) {
byte r,g,b;
const byte *p;
Common::SeekableReadStream *stream;
- Graphics::IFFDecoder decoder;
+ Image::IFFDecoder decoder;
uint i;
stream = tryOpenFile("backs/" + Common::String(filename), ".ap");
@@ -544,7 +544,7 @@ MaskBuffer *AmigaDisk_br::loadMask(const char *name, uint32 w, uint32 h) {
return 0;
}
- Graphics::IFFDecoder decoder;
+ Image::IFFDecoder decoder;
decoder.setNumRelevantPlanes(2); // use only 2 first bits from each pixels
decoder.setPixelPacking(true); // pack 4 2bit pixels into 1 byte
decoder.loadStream(*stream);
@@ -583,7 +583,7 @@ GfxObj* AmigaDisk_br::loadStatic(const char* name) {
Common::String sName = name;
Common::SeekableReadStream *stream = openFile("ras/" + sName, ".ras");
- Graphics::IFFDecoder decoder;
+ Image::IFFDecoder decoder;
decoder.loadStream(*stream);
Graphics::Surface *surf = new Graphics::Surface;
@@ -720,7 +720,7 @@ GfxObj* AmigaDisk_br::loadObjects(const char *name, uint8 part) {
debugC(5, kDebugDisk, "AmigaDisk_br::loadObjects");
Common::SeekableReadStream *stream = openFile(name);
- Graphics::IFFDecoder decoder;
+ Image::IFFDecoder decoder;
decoder.loadStream(*stream);
uint16 max = objectsMax[part];
diff --git a/engines/parallaction/disk_ns.cpp b/engines/parallaction/disk_ns.cpp
index ae28e864a9..28e61b04f9 100644
--- a/engines/parallaction/disk_ns.cpp
+++ b/engines/parallaction/disk_ns.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -26,7 +26,7 @@
#include "common/memstream.h"
#include "common/substream.h"
#include "common/textconsole.h"
-#include "graphics/decoders/iff.h"
+#include "image/iff.h"
#include "parallaction/parser.h"
#include "parallaction/parallaction.h"
@@ -917,7 +917,7 @@ void AmigaDisk_ns::buildMask(byte* buf) {
void AmigaDisk_ns::loadBackground(BackgroundInfo& info, const char *name) {
Common::SeekableReadStream *s = openFile(name);
- Graphics::IFFDecoder decoder;
+ Image::IFFDecoder decoder;
decoder.loadStream(*s);
info.bg.copyFrom(*decoder.getSurface());
@@ -935,7 +935,7 @@ void AmigaDisk_ns::loadBackground(BackgroundInfo& info, const char *name) {
info.palette.setEntry(i, r, g, b);
}
- const Common::Array<Graphics::IFFDecoder::PaletteRange> &paletteRanges = decoder.getPaletteRanges();
+ const Common::Array<Image::IFFDecoder::PaletteRange> &paletteRanges = decoder.getPaletteRanges();
for (uint j = 0; j < 6 && j < paletteRanges.size(); j++) {
PaletteFxRange range;
range._timer = paletteRanges[j].timer;
@@ -959,7 +959,7 @@ void AmigaDisk_ns::loadMask_internal(BackgroundInfo& info, const char *name) {
return; // no errors if missing mask files: not every location has one
}
- Graphics::IFFDecoder decoder;
+ Image::IFFDecoder decoder;
decoder.setNumRelevantPlanes(2); // use only 2 first bits from each pixel
decoder.setPixelPacking(true); // pack 4 2bit pixels into 1 byte
decoder.loadStream(*s);
@@ -990,7 +990,7 @@ void AmigaDisk_ns::loadPath_internal(BackgroundInfo& info, const char *name) {
return; // no errors if missing path files: not every location has one
}
- Graphics::IFFDecoder decoder;
+ Image::IFFDecoder decoder;
decoder.setNumRelevantPlanes(1); // use only first bit from each pixel
decoder.setPixelPacking(true); // pack 8 1bit pixels into 1 byte
decoder.loadStream(*s);
diff --git a/engines/parallaction/exec.cpp b/engines/parallaction/exec.cpp
index 122abf9e0e..ceba072173 100644
--- a/engines/parallaction/exec.cpp
+++ b/engines/parallaction/exec.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/parallaction/exec.h b/engines/parallaction/exec.h
index b966d677cd..15217d3a4c 100644
--- a/engines/parallaction/exec.h
+++ b/engines/parallaction/exec.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -62,7 +62,7 @@ struct ProgramContext {
AnimationPtr _anim;
ProgramPtr _program;
InstructionPtr _inst;
- uint32 _ip;
+ uint32 _ip;
uint16 _modCounter;
bool _suspend;
};
diff --git a/engines/parallaction/exec_br.cpp b/engines/parallaction/exec_br.cpp
index 985ea29311..c2fbc415af 100644
--- a/engines/parallaction/exec_br.cpp
+++ b/engines/parallaction/exec_br.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/parallaction/exec_ns.cpp b/engines/parallaction/exec_ns.cpp
index 816f220b1f..45fe0a9900 100644
--- a/engines/parallaction/exec_ns.cpp
+++ b/engines/parallaction/exec_ns.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/parallaction/font.cpp b/engines/parallaction/font.cpp
index 03b1ced8e1..57b04deb12 100644
--- a/engines/parallaction/font.cpp
+++ b/engines/parallaction/font.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -518,6 +518,9 @@ AmigaFont::AmigaFont(Common::SeekableReadStream &stream) {
_charSpace = 0;
_charKern = 0;
+ _cp = 0;
+ _pitch = 0;
+
if (_font->_charSpace != 0)
_charSpace = (uint16 *)(_data + FROM_BE_32(_font->_charSpace));
if (_font->_charKern != 0)
diff --git a/engines/parallaction/gfxbase.cpp b/engines/parallaction/gfxbase.cpp
index e2d9532c8a..f1499f7782 100644
--- a/engines/parallaction/gfxbase.cpp
+++ b/engines/parallaction/gfxbase.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/parallaction/graphics.cpp b/engines/parallaction/graphics.cpp
index 3f36d56420..06b315016a 100644
--- a/engines/parallaction/graphics.cpp
+++ b/engines/parallaction/graphics.cpp
@@ -9,12 +9,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -218,7 +218,7 @@ void Palette::rotate(uint first, uint last, bool forward) {
-void Gfx::setPalette(Palette pal) {
+void Gfx::setPalette(Palette &pal) {
byte sysPal[256*3];
uint n = pal.fillRGB(sysPal);
diff --git a/engines/parallaction/graphics.h b/engines/parallaction/graphics.h
index 55c1c0c04e..55e2bbca84 100644
--- a/engines/parallaction/graphics.h
+++ b/engines/parallaction/graphics.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -138,7 +138,7 @@ public:
}
Cnv(uint16 numFrames, uint16 width, uint16 height, byte* data, bool freeData = false)
- : _count(numFrames), _width(width), _height(height), _data(data), _freeData(freeData) {
+ : _count(numFrames), _width(width), _height(height), _data(data), _freeData(freeData), field_8(0) {
}
@@ -465,7 +465,7 @@ public:
void invertBackground(const Common::Rect& r);
// palette
- void setPalette(Palette palette);
+ void setPalette(Palette &palette);
void setBlackPalette();
void animatePalette();
diff --git a/engines/parallaction/gui.cpp b/engines/parallaction/gui.cpp
index aa9c29ac57..a2d33f0256 100644
--- a/engines/parallaction/gui.cpp
+++ b/engines/parallaction/gui.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/parallaction/gui.h b/engines/parallaction/gui.h
index a6eed240c4..c8cad29935 100644
--- a/engines/parallaction/gui.h
+++ b/engines/parallaction/gui.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -43,7 +43,7 @@ class MenuInputHelper {
MenuInputState *_newState;
public:
- MenuInputHelper() : _state(0) {
+ MenuInputHelper() : _state(0), _newState(0) {
}
~MenuInputHelper();
diff --git a/engines/parallaction/gui_br.cpp b/engines/parallaction/gui_br.cpp
index ddbc31d730..ae3d136b0e 100644
--- a/engines/parallaction/gui_br.cpp
+++ b/engines/parallaction/gui_br.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -196,6 +196,11 @@ class MainMenuInputState_BR : public MenuInputState {
public:
MainMenuInputState_BR(Parallaction_br *vm, MenuInputHelper *helper) : MenuInputState("mainmenu", helper), _vm(vm) {
memset(_lines, 0, sizeof(_lines));
+
+ _menuStrings = 0;
+ _options = 0;
+ _availItems = 0;
+ _selection = 0;
}
~MainMenuInputState_BR() {
diff --git a/engines/parallaction/gui_ns.cpp b/engines/parallaction/gui_ns.cpp
index 082c37f666..3d977c9e51 100644
--- a/engines/parallaction/gui_ns.cpp
+++ b/engines/parallaction/gui_ns.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -117,6 +117,7 @@ public:
_allowChoice = false;
_nextState = "selectgame";
_label = 0;
+ _blocks = 0;
_dosLanguageSelectBlocks[0] = Common::Rect( 80, 110, 128, 180 ); // Italian
_dosLanguageSelectBlocks[1] = Common::Rect( 129, 85, 177, 155 ); // French
@@ -414,7 +415,7 @@ class SelectCharacterInputState_NS : public MenuInputState {
#define CHAR_DONNA 1
#define CHAR_DOUGH 2
- Common::Rect _codeSelectBlocks[9];
+ Common::Rect _codeSelectBlocks[9];
Common::Rect _codeTrueBlocks[9];
Parallaction_ns *_vm;
diff --git a/engines/parallaction/input.cpp b/engines/parallaction/input.cpp
index a445ce0138..290af339bb 100644
--- a/engines/parallaction/input.cpp
+++ b/engines/parallaction/input.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/parallaction/input.h b/engines/parallaction/input.h
index a815469ec3..f7a2d8c1d5 100644
--- a/engines/parallaction/input.h
+++ b/engines/parallaction/input.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -114,7 +114,7 @@ public:
void trackMouse(ZonePtr z);
void waitForButtonEvent(uint32 buttonEventMask, int32 timeout = -1);
uint32 getLastButtonEvent() { return _mouseButtons; }
- bool getLastKeyDown(uint16 &ascii);
+ bool getLastKeyDown(uint16 &ascii);
void stopHovering();
diff --git a/engines/parallaction/inventory.cpp b/engines/parallaction/inventory.cpp
index 1cae63be42..fcac9f08e2 100644
--- a/engines/parallaction/inventory.cpp
+++ b/engines/parallaction/inventory.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/parallaction/inventory.h b/engines/parallaction/inventory.h
index d5cf8badf0..832bd7bf36 100644
--- a/engines/parallaction/inventory.h
+++ b/engines/parallaction/inventory.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/parallaction/objects.cpp b/engines/parallaction/objects.cpp
index 50556c3ec4..50a5b38d8d 100644
--- a/engines/parallaction/objects.cpp
+++ b/engines/parallaction/objects.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/parallaction/objects.h b/engines/parallaction/objects.h
index 81761b2c6b..7cee0460c1 100644
--- a/engines/parallaction/objects.h
+++ b/engines/parallaction/objects.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -147,7 +147,7 @@ typedef Common::List<CommandPtr> CommandList;
struct Answer {
Common::String _text;
uint16 _mood;
- Common::String _followingName;
+ Common::String _followingName;
CommandList _commands;
uint32 _noFlags;
@@ -188,7 +188,7 @@ struct Dialogue {
~Dialogue();
};
-#define MAX_WALKPOINT_LISTS 20
+#define MAX_WALKPOINT_LISTS 20
#define FREE_HEAR_CHANNEL -1
#define MUSIC_HEAR_CHANNEL -2
@@ -452,7 +452,7 @@ struct Program {
uint16 _numLocals;
uint32 _ip;
- uint32 _loopStart;
+ uint32 _loopStart;
InstructionList _instructions;
uint32 _status;
diff --git a/engines/parallaction/parallaction.cpp b/engines/parallaction/parallaction.cpp
index f868abfbf4..2b75e78582 100644
--- a/engines/parallaction/parallaction.cpp
+++ b/engines/parallaction/parallaction.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -59,6 +59,33 @@ Parallaction::Parallaction(OSystem *syst, const PARALLACTIONGameDescription *gam
DebugMan.addDebugChannel(kDebugAudio, "audio", "Audio debug level");
DebugMan.addDebugChannel(kDebugMenu, "menu", "Menu debug level");
DebugMan.addDebugChannel(kDebugInventory, "inventory", "Inventory debug level");
+
+ _screenHeight = 0;
+ _screenSize = 0;
+ _gameType = 0;
+ _gfx = 0;
+ _disk = 0;
+ _input = 0;
+ _debugger = 0;
+ _saveLoad = 0;
+ _menuHelper = 0;
+ _soundMan = 0;
+ _labelFont = 0;
+ _menuFont = 0;
+ _introFont = 0;
+ _dialogueFont = 0;
+ _globalFlagsNames = 0;
+ _objectsNames = 0;
+ _objects = 0;
+ _callableNames = 0;
+ _localFlagNames = 0;
+ _cmdExec = 0;
+ _programExec = 0;
+ _balloonMan = 0;
+ _inventoryRenderer = 0;
+ _inventory = 0;
+ _currentLocationIndex = 0;
+ _numLocations = 0;
}
Parallaction::~Parallaction() {
@@ -882,6 +909,9 @@ void CharacterName::dummify() {
CharacterName::CharacterName() {
dummify();
+
+ _suffix = 0;
+ _prefix = 0;
}
CharacterName::CharacterName(const char *name) {
diff --git a/engines/parallaction/parallaction.h b/engines/parallaction/parallaction.h
index 2dbb0227d6..6ea50584f8 100644
--- a/engines/parallaction/parallaction.h
+++ b/engines/parallaction/parallaction.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -360,7 +360,7 @@ public:
uint32 getLocationFlags();
bool checkSpecialZoneBox(ZonePtr z, uint32 type, uint x, uint y);
bool checkZoneBox(ZonePtr z, uint32 type, uint x, uint y);
- bool checkZoneType(ZonePtr z, uint32 type);
+ bool checkZoneType(ZonePtr z, uint32 type);
bool checkLinkedAnimBox(ZonePtr z, uint32 type, uint x, uint y);
ZonePtr hitZone(uint32 type, uint16 x, uint16 y);
void runZone(ZonePtr z);
@@ -579,7 +579,7 @@ private:
void freeLocation(bool removeAll);
void loadProgram(AnimationPtr a, const char *filename);
void startGui(bool showSplash);
- void startIngameMenu();
+ void startIngameMenu();
void freeCharacter();
typedef void (Parallaction_br::*Callable)(void *);
diff --git a/engines/parallaction/parallaction_br.cpp b/engines/parallaction/parallaction_br.cpp
index f9df9d85db..1e1c0b0a3d 100644
--- a/engines/parallaction/parallaction_br.cpp
+++ b/engines/parallaction/parallaction_br.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -45,6 +45,18 @@ const char *Parallaction_br::_partNames[] = {
Parallaction_br::Parallaction_br(OSystem* syst, const PARALLACTIONGameDescription *gameDesc) : Parallaction(syst, gameDesc),
_locationParser(0), _programParser(0), _soundManI(0) {
+ _audioCommandsNamesRes = 0;
+ _part = 0;
+ _nextPart = 0;
+ _subtitleY = 0;
+ _subtitle[0] = 0;
+ _subtitle[1] = 0;
+ _charInventories[0] = 0;
+ _charInventories[1] = 0;
+ _charInventories[2] = 0;
+ _countersNames = 0;
+ _callables = 0;
+ _walker = 0;
}
Common::Error Parallaction_br::init() {
diff --git a/engines/parallaction/parallaction_ns.cpp b/engines/parallaction/parallaction_ns.cpp
index 49b63dcac3..144c2b3a98 100644
--- a/engines/parallaction/parallaction_ns.cpp
+++ b/engines/parallaction/parallaction_ns.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -145,6 +145,18 @@ void LocationName::bind(const char *s) {
Parallaction_ns::Parallaction_ns(OSystem* syst, const PARALLACTIONGameDescription *gameDesc) : Parallaction(syst, gameDesc),
_locationParser(0), _programParser(0), _walker(0) {
+ _soundManI = 0;
+ _score = 0;
+ _inTestResult = 0;
+ _callables = 0;
+ num_foglie = 0;
+ _sarcophagusDeltaX = 0;
+ _movingSarcophagus = 0;
+ _freeSarcophagusSlotX = 0;
+ _intro = 0;
+
+ _testResultLabels[0] = 0;
+ _testResultLabels[1] = 0;
}
Common::Error Parallaction_ns::init() {
diff --git a/engines/parallaction/parser.cpp b/engines/parallaction/parser.cpp
index 5d61c2988c..c37cee692e 100644
--- a/engines/parallaction/parser.cpp
+++ b/engines/parallaction/parser.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/parallaction/parser.h b/engines/parallaction/parser.h
index 3e2604eda2..7b77f58eb0 100644
--- a/engines/parallaction/parser.h
+++ b/engines/parallaction/parser.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -207,6 +207,11 @@ protected:
public:
LocationParser_ns(Parallaction_ns *vm) : _vm(vm), _commandsNames(0), _locationStmt(0),
_locationZoneStmt(0), _locationAnimStmt(0) {
+ _script = 0;
+ _parser = 0;
+ _zoneTypeNames = 0;
+ _zoneFlagNames = 0;
+ _zoneProg = 0;
}
virtual void init();
@@ -292,14 +297,14 @@ public:
virtual void parseGetData(ZonePtr z);
virtual void parseDoorData(ZonePtr z);
virtual void parseHearData(ZonePtr z);
- virtual void parseNoneData(ZonePtr z);
+ virtual void parseNoneData(ZonePtr z);
protected:
void parseAnswerCounter(Answer *answer);
virtual Answer *parseAnswer();
public:
LocationParser_br(Parallaction_br *vm) : LocationParser_ns((Parallaction_ns*)vm), _vm(vm),
- _audioCommandsNames(0) {
+ _audioCommandsNames(0), _out(0) {
}
virtual void init();
@@ -363,7 +368,7 @@ protected:
}
public:
- ProgramParser_ns(Parallaction_ns *vm) : _vm(vm), _parser(0), _instructionNames(0) {
+ ProgramParser_ns(Parallaction_ns *vm) : _vm(vm), _parser(0), _instructionNames(0), _script(0), _currentInstruction(0) {
}
virtual void init();
diff --git a/engines/parallaction/parser_br.cpp b/engines/parallaction/parser_br.cpp
index e60349ffa8..c6693dc65b 100644
--- a/engines/parallaction/parser_br.cpp
+++ b/engines/parallaction/parser_br.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/parallaction/parser_ns.cpp b/engines/parallaction/parser_ns.cpp
index ac5e7c7135..710f00ee4d 100644
--- a/engines/parallaction/parser_ns.cpp
+++ b/engines/parallaction/parser_ns.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/parallaction/saveload.cpp b/engines/parallaction/saveload.cpp
index 2ecc5377a4..72e9400acd 100644
--- a/engines/parallaction/saveload.cpp
+++ b/engines/parallaction/saveload.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/parallaction/saveload.h b/engines/parallaction/saveload.h
index 3976ee1290..c9b724e69d 100644
--- a/engines/parallaction/saveload.h
+++ b/engines/parallaction/saveload.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -71,12 +71,12 @@ public:
};
class SaveLoad_br : public SaveLoad {
- Parallaction_br *_vm;
+// Parallaction_br *_vm;
virtual void doLoadGame(uint16 slot);
virtual void doSaveGame(uint16 slot, const char* name);
public:
- SaveLoad_br(Parallaction_br *vm, Common::SaveFileManager *saveFileMan) : SaveLoad(saveFileMan, "bra"), _vm(vm) { }
+ SaveLoad_br(Parallaction_br *vm, Common::SaveFileManager *saveFileMan) : SaveLoad(saveFileMan, "bra") { }
virtual void getGamePartProgress(bool *complete, int size);
virtual void setPartComplete(const char *part);
diff --git a/engines/parallaction/sound.h b/engines/parallaction/sound.h
index e12e50e278..79cc346f62 100644
--- a/engines/parallaction/sound.h
+++ b/engines/parallaction/sound.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -103,7 +103,7 @@ protected:
Audio::Mixer *_mixer;
char _musicFile[PATH_LEN];
- bool _sfxLooping;
+ bool _sfxLooping;
int _sfxVolume;
int _sfxRate;
uint _sfxChannel;
@@ -156,7 +156,7 @@ class AmigaSoundMan_ns : public SoundMan_ns {
Audio::AudioStream *_musicStream;
Audio::SoundHandle _musicHandle;
- uint32 beepSoundBufferSize;
+ uint32 beepSoundBufferSize;
int8 *beepSoundBuffer;
Channel _channels[NUM_SFX_CHANNELS];
@@ -188,7 +188,7 @@ protected:
Common::String _musicFile;
- bool _sfxLooping;
+ bool _sfxLooping;
int _sfxVolume;
int _sfxRate;
uint _sfxChannel;
diff --git a/engines/parallaction/sound_br.cpp b/engines/parallaction/sound_br.cpp
index 4a643aaf1d..d13b318ace 100644
--- a/engines/parallaction/sound_br.cpp
+++ b/engines/parallaction/sound_br.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -207,6 +207,7 @@ public:
void play(Common::SeekableReadStream *stream);
virtual void pause(bool p);
+ virtual void pause() { assert(0); } // overridden
virtual void setVolume(int volume);
virtual void onTimer();
diff --git a/engines/parallaction/sound_ns.cpp b/engines/parallaction/sound_ns.cpp
index 0ee3d73556..692389b490 100644
--- a/engines/parallaction/sound_ns.cpp
+++ b/engines/parallaction/sound_ns.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -43,6 +43,7 @@ public:
void play(Common::SeekableReadStream *stream);
void pause(bool p);
+ virtual void pause() { assert(0); } // overridden
virtual void onTimer();
private:
diff --git a/engines/parallaction/staticres.cpp b/engines/parallaction/staticres.cpp
index 32404037f0..40bac5b64d 100644
--- a/engines/parallaction/staticres.cpp
+++ b/engines/parallaction/staticres.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/parallaction/walk.cpp b/engines/parallaction/walk.cpp
index 19162cd7db..40f0bd2805 100644
--- a/engines/parallaction/walk.cpp
+++ b/engines/parallaction/walk.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/parallaction/walk.h b/engines/parallaction/walk.h
index ae6db6eaf1..f77e834fcb 100644
--- a/engines/parallaction/walk.h
+++ b/engines/parallaction/walk.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/pegasus/ai/ai_area.cpp b/engines/pegasus/ai/ai_area.cpp
index 5ac8af8812..9cab568d66 100644
--- a/engines/pegasus/ai/ai_area.cpp
+++ b/engines/pegasus/ai/ai_area.cpp
@@ -234,6 +234,7 @@ void AIArea::playAIAreaSequence(const LowerClientSignature, const LowerAreaSigna
vm->_cursor->hide();
while (_middleAreaMovie.isRunning()) {
+ InputDevice.pumpEvents();
vm->checkCallBacks();
vm->refreshDisplay();
g_system->delayMillis(10);
@@ -258,6 +259,7 @@ void AIArea::playAIAreaSequence(const LowerClientSignature, const LowerAreaSigna
vm->_cursor->hide();
while (_rightAreaMovie.isRunning()) {
+ InputDevice.pumpEvents();
vm->checkCallBacks();
vm->refreshDisplay();
g_system->delayMillis(10);
diff --git a/engines/pegasus/configure.engine b/engines/pegasus/configure.engine
new file mode 100644
index 0000000000..ed7e295287
--- /dev/null
+++ b/engines/pegasus/configure.engine
@@ -0,0 +1,3 @@
+# This file is included from the main "configure" script
+# add_engine [name] [desc] [build-by-default] [subengines] [base games] [deps]
+add_engine pegasus "The Journeyman Project: Pegasus Prime" yes "" "" "16bit"
diff --git a/engines/pegasus/console.cpp b/engines/pegasus/console.cpp
index 64bd0ba5f2..e5a0cfec98 100644
--- a/engines/pegasus/console.cpp
+++ b/engines/pegasus/console.cpp
@@ -28,11 +28,11 @@
namespace Pegasus {
PegasusConsole::PegasusConsole(PegasusEngine *vm) : GUI::Debugger(), _vm(vm) {
- DCmd_Register("die", WRAP_METHOD(PegasusConsole, Cmd_Die));
+ registerCmd("die", WRAP_METHOD(PegasusConsole, Cmd_Die));
// These functions are non-demo specific
if (!_vm->isDemo())
- DCmd_Register("jump", WRAP_METHOD(PegasusConsole, Cmd_Jump));
+ registerCmd("jump", WRAP_METHOD(PegasusConsole, Cmd_Jump));
}
PegasusConsole::~PegasusConsole() {
@@ -40,7 +40,7 @@ PegasusConsole::~PegasusConsole() {
bool PegasusConsole::Cmd_Die(int argc, const char **argv) {
if (argc == 1) {
- DebugPrintf("Usage: die <death reason>\n");
+ debugPrintf("Usage: die <death reason>\n");
return true;
}
@@ -54,7 +54,7 @@ bool PegasusConsole::Cmd_Die(int argc, const char **argv) {
if (invalidReason) {
- DebugPrintf("Invalid death reason %d\n", reason);
+ debugPrintf("Invalid death reason %d\n", reason);
return true;
}
@@ -65,14 +65,14 @@ bool PegasusConsole::Cmd_Die(int argc, const char **argv) {
bool PegasusConsole::Cmd_Jump(int argc, const char **argv) {
if (!g_interface) {
// TODO
- DebugPrintf("Cannot jump without interface set up\n");
+ debugPrintf("Cannot jump without interface set up\n");
return true;
}
// TODO: Default room/direction for each neighborhood
if (argc < 4) {
- DebugPrintf("Usage: jump <neighborhood> <room> <direction>\n");
+ debugPrintf("Usage: jump <neighborhood> <room> <direction>\n");
return true;
}
@@ -82,14 +82,14 @@ bool PegasusConsole::Cmd_Jump(int argc, const char **argv) {
if ((neighborhood < kCaldoriaID || neighborhood > kNoradDeltaID || neighborhood == kFinalTSAID) &&
neighborhood != kNoradSubChaseID) {
- DebugPrintf("Invalid neighborhood %d", neighborhood);
+ debugPrintf("Invalid neighborhood %d", neighborhood);
return true;
}
// No real way to check room validity at this point
if (direction > kWest) {
- DebugPrintf("Invalid direction %d", direction);
+ debugPrintf("Invalid direction %d", direction);
return true;
}
diff --git a/engines/pegasus/cursor.cpp b/engines/pegasus/cursor.cpp
index ad0d2c2d7d..602ae88068 100644
--- a/engines/pegasus/cursor.cpp
+++ b/engines/pegasus/cursor.cpp
@@ -28,7 +28,7 @@
#include "common/system.h"
#include "graphics/cursorman.h"
#include "graphics/surface.h"
-#include "graphics/decoders/pict.h"
+#include "image/pict.h"
#include "pegasus/cursor.h"
#include "pegasus/graphics.h"
@@ -148,7 +148,7 @@ void Cursor::loadCursorImage(CursorInfo &cursorInfo) {
Common::SeekableReadStream *pictStream = vm->_resFork->getResource(MKTAG('P', 'I', 'C', 'T'), cursorInfo.tag + 1000);
if (pictStream) {
- Graphics::PICTDecoder pict;
+ Image::PICTDecoder pict;
if (!pict.loadStream(*pictStream))
error("Failed to decode cursor PICT %d", cursorInfo.tag + 1000);
@@ -166,7 +166,7 @@ void Cursor::loadCursorImage(CursorInfo &cursorInfo) {
error("Failed to find color icon %d", cursorInfo.tag);
// PixMap section
- Graphics::PICTDecoder::PixMap pixMap = Graphics::PICTDecoder::readPixMap(*cicnStream);
+ Image::PICTDecoder::PixMap pixMap = Image::PICTDecoder::readPixMap(*cicnStream);
// Mask section
cicnStream->readUint32BE(); // mask baseAddr
diff --git a/engines/pegasus/energymonitor.cpp b/engines/pegasus/energymonitor.cpp
index be9d205360..40e54afb89 100644
--- a/engines/pegasus/energymonitor.cpp
+++ b/engines/pegasus/energymonitor.cpp
@@ -269,6 +269,7 @@ void EnergyMonitor::calibrateEnergyBar() {
// Make sure warning light is hidden...
_energyLight.hide();
while (getCurrentEnergy() != (int32)kMaxJMPEnergy) {
+ InputDevice.pumpEvents();
vm->checkCallBacks();
vm->refreshDisplay();
g_system->delayMillis(10);
diff --git a/engines/pegasus/fader.cpp b/engines/pegasus/fader.cpp
index a2bbf22944..80ce8ef5dc 100644
--- a/engines/pegasus/fader.cpp
+++ b/engines/pegasus/fader.cpp
@@ -94,6 +94,7 @@ void Fader::startFaderSync(const FaderMoveSpec &spec) {
start();
while (isFading()) {
+ InputDevice.pumpEvents();
((PegasusEngine *)g_engine)->checkCallBacks();
useIdleTime();
}
diff --git a/engines/pegasus/input.cpp b/engines/pegasus/input.cpp
index b74e4a4c45..e1b7e25cd5 100644
--- a/engines/pegasus/input.cpp
+++ b/engines/pegasus/input.cpp
@@ -57,9 +57,10 @@ InputDeviceManager::InputDeviceManager() {
_keyMap[Common::KEYCODE_p] = false;
_keyMap[Common::KEYCODE_TILDE] = false;
_keyMap[Common::KEYCODE_BACKQUOTE] = false;
- _keyMap[Common::KEYCODE_NUMLOCK] = false;
+ _keyMap[Common::KEYCODE_KP7] = false;
_keyMap[Common::KEYCODE_BACKSPACE] = false;
_keyMap[Common::KEYCODE_KP_MULTIPLY] = false;
+ _keyMap[Common::KEYCODE_KP9] = false;
_keyMap[Common::KEYCODE_LALT] = false;
_keyMap[Common::KEYCODE_RALT] = false;
_keyMap[Common::KEYCODE_e] = false;
@@ -81,9 +82,7 @@ void InputDeviceManager::getInput(Input &input, const InputBits filter) {
// (ie. if one uses enter to access the restore menu, we never receive
// the key up event, which leads to bad things)
// This is to closely emulate what the GetKeys() function did on Mac OS
- Common::Event event;
- while (g_system->getEventManager()->pollEvent(event))
- ;
+ pumpEvents();
// Now create the bitfield
InputBits currentBits = 0;
@@ -115,10 +114,19 @@ void InputDeviceManager::getInput(Input &input, const InputBits filter) {
if (_keyMap[Common::KEYCODE_ESCAPE] || _keyMap[Common::KEYCODE_p])
currentBits |= (kRawButtonDown << kMod3ButtonShift);
- if (_keyMap[Common::KEYCODE_TILDE] || _keyMap[Common::KEYCODE_BACKQUOTE] || _keyMap[Common::KEYCODE_NUMLOCK])
+ // The original also used clear (aka "num lock" on Mac keyboards) here, but it doesn't
+ // work right on most systems. Either SDL or the OS treats num lock specially and the
+ // events don't come as expected. In many cases, the key down event is sent many times
+ // causing the drawer to open and close constantly until pressed again. It only causes
+ // more grief than anything else.
+
+ // The original doesn't use KP7 for inventory, but we're using it as an alternative for
+ // num lock. KP9 is used for the biochip drawer to balance things out.
+
+ if (_keyMap[Common::KEYCODE_TILDE] || _keyMap[Common::KEYCODE_BACKQUOTE] || _keyMap[Common::KEYCODE_KP7])
currentBits |= (kRawButtonDown << kLeftFireButtonShift);
- if (_keyMap[Common::KEYCODE_BACKSPACE] || _keyMap[Common::KEYCODE_KP_MULTIPLY])
+ if (_keyMap[Common::KEYCODE_BACKSPACE] || _keyMap[Common::KEYCODE_KP_MULTIPLY] || _keyMap[Common::KEYCODE_KP9])
currentBits |= (kRawButtonDown << kRightFireButtonShift);
// Update mouse button state
@@ -206,6 +214,13 @@ bool InputDeviceManager::notifyEvent(const Common::Event &event) {
return false;
}
+void InputDeviceManager::pumpEvents() {
+ // Just poll for events. notifyEvent() will pick up on them.
+ Common::Event event;
+ while (g_system->getEventManager()->pollEvent(event))
+ ;
+}
+
int operator==(const Input &arg1, const Input &arg2) {
return arg1._inputState == arg2._inputState;
}
diff --git a/engines/pegasus/input.h b/engines/pegasus/input.h
index 3e938fa42a..ba6f11dba0 100644
--- a/engines/pegasus/input.h
+++ b/engines/pegasus/input.h
@@ -50,6 +50,8 @@ public:
void waitInput(const InputBits);
+ void pumpEvents();
+
protected:
friend class Common::Singleton<SingletonBaseType>;
diff --git a/engines/pegasus/interface.cpp b/engines/pegasus/interface.cpp
index f2429bf36a..f8ae6a0752 100644
--- a/engines/pegasus/interface.cpp
+++ b/engines/pegasus/interface.cpp
@@ -604,6 +604,7 @@ void Interface::raiseInventoryDrawerSync() {
raiseInventoryDrawer(false);
while (_inventoryLid.isRunning()) {
+ InputDevice.pumpEvents();
vm->checkCallBacks();
vm->refreshDisplay();
g_system->delayMillis(10);
@@ -613,6 +614,7 @@ void Interface::raiseInventoryDrawerSync() {
inventoryLidOpen(false);
while (_inventoryPush.isFading()) {
+ InputDevice.pumpEvents();
vm->checkCallBacks();
vm->refreshDisplay();
g_system->delayMillis(10);
@@ -628,6 +630,7 @@ void Interface::lowerInventoryDrawerSync() {
lowerInventoryDrawer(false);
while (_inventoryPush.isFading()) {
+ InputDevice.pumpEvents();
vm->checkCallBacks();
vm->refreshDisplay();
g_system->delayMillis(10);
@@ -637,6 +640,7 @@ void Interface::lowerInventoryDrawerSync() {
inventoryDrawerDown(false);
while (_inventoryLid.isRunning()) {
+ InputDevice.pumpEvents();
vm->checkCallBacks();
vm->refreshDisplay();
g_system->delayMillis(10);
@@ -652,6 +656,7 @@ void Interface::raiseBiochipDrawerSync() {
raiseBiochipDrawer(false);
while (_biochipLid.isRunning()) {
+ InputDevice.pumpEvents();
vm->checkCallBacks();
vm->refreshDisplay();
g_system->delayMillis(10);
@@ -661,6 +666,7 @@ void Interface::raiseBiochipDrawerSync() {
biochipLidOpen(false);
while (_biochipPush.isFading()) {
+ InputDevice.pumpEvents();
vm->checkCallBacks();
vm->refreshDisplay();
g_system->delayMillis(10);
@@ -676,6 +682,7 @@ void Interface::lowerBiochipDrawerSync() {
lowerBiochipDrawer(false);
while (_biochipPush.isFading()) {
+ InputDevice.pumpEvents();
vm->checkCallBacks();
vm->refreshDisplay();
g_system->delayMillis(10);
@@ -685,6 +692,7 @@ void Interface::lowerBiochipDrawerSync() {
biochipDrawerDown(false);
while (_biochipLid.isRunning()) {
+ InputDevice.pumpEvents();
vm->checkCallBacks();
vm->refreshDisplay();
g_system->delayMillis(10);
diff --git a/engines/pegasus/items/inventorypicture.cpp b/engines/pegasus/items/inventorypicture.cpp
index fc812faae2..bfdc382f5d 100644
--- a/engines/pegasus/items/inventorypicture.cpp
+++ b/engines/pegasus/items/inventorypicture.cpp
@@ -331,6 +331,7 @@ void InventoryItemsPicture::playEndMessage(DisplayElement *pushElement) {
endMessage.start();
while (endMessage.isRunning()) {
+ InputDevice.pumpEvents();
vm->checkCallBacks();
vm->refreshDisplay();
g_system->delayMillis(10);
diff --git a/engines/pegasus/items/item.cpp b/engines/pegasus/items/item.cpp
index 8089f2b93d..830d3f2f34 100644
--- a/engines/pegasus/items/item.cpp
+++ b/engines/pegasus/items/item.cpp
@@ -39,9 +39,9 @@
namespace Pegasus {
Item::Item(const ItemID id, const NeighborhoodID neighborhood, const RoomID room, const DirectionConstant direction) : IDObject(id) {
- _itemNeighborhood = neighborhood;
- _itemRoom = room;
- _itemDirection = direction;
+ _originalNeighborhood = _itemNeighborhood = neighborhood;
+ _originalRoom = _itemRoom = room;
+ _originalDirection = _itemDirection = direction;
_itemWeight = 1;
_itemOwnerID = kNoActorID;
_itemState = 0;
@@ -131,6 +131,14 @@ Item::~Item() {
delete[] _itemExtras.entries;
}
+void Item::reset() {
+ _itemNeighborhood = _originalNeighborhood;
+ _itemRoom = _originalRoom;
+ _itemDirection = _originalDirection;
+ _itemOwnerID = kNoActorID;
+ _itemState = 0;
+}
+
void Item::writeToStream(Common::WriteStream *stream) {
stream->writeUint16BE(_itemNeighborhood);
stream->writeUint16BE(_itemRoom);
diff --git a/engines/pegasus/items/item.h b/engines/pegasus/items/item.h
index a1451b2a58..26cccf043c 100644
--- a/engines/pegasus/items/item.h
+++ b/engines/pegasus/items/item.h
@@ -339,6 +339,9 @@ public:
void findItemExtra(const uint32 extraID, ItemExtraEntry &entry);
+ // Reset to its original state at the beginning of the game
+ void reset();
+
protected:
NeighborhoodID _itemNeighborhood;
RoomID _itemRoom;
@@ -347,6 +350,10 @@ protected:
WeightType _itemWeight;
ItemState _itemState;
+ NeighborhoodID _originalNeighborhood;
+ RoomID _originalRoom;
+ DirectionConstant _originalDirection;
+
JMPItemInfo _itemInfo;
ItemStateInfo _sharedAreaInfo;
ItemExtraInfo _itemExtras;
diff --git a/engines/pegasus/items/itemlist.cpp b/engines/pegasus/items/itemlist.cpp
index ff8cae546b..4b58d9ad78 100644
--- a/engines/pegasus/items/itemlist.cpp
+++ b/engines/pegasus/items/itemlist.cpp
@@ -64,4 +64,9 @@ Item *ItemList::findItemByID(const ItemID id) {
return 0;
}
+void ItemList::resetAllItems() {
+ for (ItemIterator it = begin(); it != end(); it++)
+ (*it)->reset();
+}
+
} // End of namespace Pegasus
diff --git a/engines/pegasus/items/itemlist.h b/engines/pegasus/items/itemlist.h
index 9b59206ab3..22bef2c96e 100644
--- a/engines/pegasus/items/itemlist.h
+++ b/engines/pegasus/items/itemlist.h
@@ -48,6 +48,7 @@ public:
virtual void readFromStream(Common::ReadStream *stream);
Item *findItemByID(const ItemID id);
+ void resetAllItems();
};
typedef ItemList::iterator ItemIterator;
diff --git a/engines/pegasus/menu.cpp b/engines/pegasus/menu.cpp
index e55c006f86..4bbda8fd93 100644
--- a/engines/pegasus/menu.cpp
+++ b/engines/pegasus/menu.cpp
@@ -227,6 +227,7 @@ MainMenu::MainMenu() : GameMenu(kMainMenuID), _menuBackground(0), _overviewButto
_menuLoop.attachFader(&_menuFader);
_menuLoop.initFromAIFFFile("Sounds/Main Menu.aiff");
+ _menuFader.setMasterVolume(((PegasusEngine *)g_engine)->getAmbienceLevel());
updateDisplay();
}
@@ -736,6 +737,7 @@ DeathMenu::DeathMenu(const DeathReason deathReason) : GameMenu(kDeathMenuID), _d
_largeSelect.startDisplaying();
} else {
_triumphSound.initFromQuickTime("Sounds/Caldoria/Galactic Triumph");
+ _triumphSound.setVolume(((PegasusEngine *)g_engine)->getAmbienceLevel());
_triumphSound.playSound();
}
diff --git a/engines/pegasus/neighborhood/caldoria/caldoria.cpp b/engines/pegasus/neighborhood/caldoria/caldoria.cpp
index 0b3e1ee040..9d2d6723a9 100644
--- a/engines/pegasus/neighborhood/caldoria/caldoria.cpp
+++ b/engines/pegasus/neighborhood/caldoria/caldoria.cpp
@@ -196,6 +196,8 @@ void Caldoria::start() {
if (!pullbackMovie->loadFile("Images/Caldoria/Pullback.movie"))
error("Could not load pullback movie");
+ pullbackMovie->setVolume(MIN<uint>(_vm->getSoundFXLevel(), 0xFF));
+
// Draw the first frame so we can fade to it
const Graphics::Surface *frame = pullbackMovie->decodeNextFrame();
assert(frame);
@@ -386,54 +388,72 @@ void Caldoria::startSpotOnceOnly(TimeValue startTime, TimeValue stopTime) {
if (!_privateFlags.getFlag(kCaldoriaPrivateSeen13CarFlag) && _vm->getRandomBit() == 0) {
_privateFlags.setFlag(kCaldoriaPrivateSeen13CarFlag, true);
Neighborhood::startSpotOnceOnly(startTime, stopTime);
+ } else {
+ showViewFrame(getViewTime(GameState.getCurrentRoom(), GameState.getCurrentDirection()));
}
break;
case MakeRoomView(kCaldoria14, kEast):
if (!_privateFlags.getFlag(kCaldoriaPrivateSeen14CarFlag) && _vm->getRandomBit() == 0) {
_privateFlags.setFlag(kCaldoriaPrivateSeen14CarFlag, true);
Neighborhood::startSpotOnceOnly(startTime, stopTime);
+ } else {
+ showViewFrame(getViewTime(GameState.getCurrentRoom(), GameState.getCurrentDirection()));
}
break;
case MakeRoomView(kCaldoria18, kWest):
if (!_privateFlags.getFlag(kCaldoriaPrivateSeen18CarFlag) && _vm->getRandomBit() == 0) {
_privateFlags.setFlag(kCaldoriaPrivateSeen18CarFlag, true);
Neighborhood::startSpotOnceOnly(startTime, stopTime);
+ } else {
+ showViewFrame(getViewTime(GameState.getCurrentRoom(), GameState.getCurrentDirection()));
}
break;
case MakeRoomView(kCaldoria23, kSouth):
if (!_privateFlags.getFlag(kCaldoriaPrivateSeen23CarFlag) && _vm->getRandomBit() == 0) {
_privateFlags.setFlag(kCaldoriaPrivateSeen23CarFlag, true);
Neighborhood::startSpotOnceOnly(startTime, stopTime);
+ } else {
+ showViewFrame(getViewTime(GameState.getCurrentRoom(), GameState.getCurrentDirection()));
}
break;
case MakeRoomView(kCaldoria33, kSouth):
if (!_privateFlags.getFlag(kCaldoriaPrivateSeen33CarFlag) && _vm->getRandomBit() == 0) {
_privateFlags.setFlag(kCaldoriaPrivateSeen33CarFlag, true);
Neighborhood::startSpotOnceOnly(startTime, stopTime);
+ } else {
+ showViewFrame(getViewTime(GameState.getCurrentRoom(), GameState.getCurrentDirection()));
}
break;
case MakeRoomView(kCaldoria36, kNorth):
if (!_privateFlags.getFlag(kCaldoriaPrivateSeen36CarFlag) && _vm->getRandomBit() == 0) {
_privateFlags.setFlag(kCaldoriaPrivateSeen36CarFlag, true);
Neighborhood::startSpotOnceOnly(startTime, stopTime);
+ } else {
+ showViewFrame(getViewTime(GameState.getCurrentRoom(), GameState.getCurrentDirection()));
}
break;
case MakeRoomView(kCaldoria41, kNorth):
if (!_privateFlags.getFlag(kCaldoriaPrivateSeen41NorthCarFlag) && _vm->getRandomBit() == 0) {
_privateFlags.setFlag(kCaldoriaPrivateSeen41NorthCarFlag, true);
Neighborhood::startSpotOnceOnly(startTime, stopTime);
+ } else {
+ showViewFrame(getViewTime(GameState.getCurrentRoom(), GameState.getCurrentDirection()));
}
break;
case MakeRoomView(kCaldoria41, kEast):
if (!_privateFlags.getFlag(kCaldoriaPrivateSeen41EastCarFlag) && _vm->getRandomBit() == 0) {
_privateFlags.setFlag(kCaldoriaPrivateSeen41EastCarFlag, true);
Neighborhood::startSpotOnceOnly(startTime, stopTime);
+ } else {
+ showViewFrame(getViewTime(GameState.getCurrentRoom(), GameState.getCurrentDirection()));
}
break;
case MakeRoomView(kCaldoria41, kWest):
if (!_privateFlags.getFlag(kCaldoriaPrivateSeen41WestCarFlag) && _vm->getRandomBit() == 0) {
_privateFlags.setFlag(kCaldoriaPrivateSeen41WestCarFlag, true);
Neighborhood::startSpotOnceOnly(startTime, stopTime);
+ } else {
+ showViewFrame(getViewTime(GameState.getCurrentRoom(), GameState.getCurrentDirection()));
}
break;
default:
@@ -889,7 +909,7 @@ void Caldoria::arriveAtCaldoria49() {
setCurrentAlternate(kAltCaldoriaNormal);
// Need to force the loop to play.
- if (GameState.getCurrentDirection() == kNorth) {
+ if (GameState.getCurrentDirection() == kNorth && !GameState.getCaldoriaSinclairShot()) {
GameState.setCaldoriaFuseTimeLimit(kSinclairShootsTimeLimit);
startExtraSequence(kCa49NorthVoiceAnalysis, kExtraCompletedFlag, kFilterNoInput);
}
@@ -1898,10 +1918,13 @@ uint Caldoria::getNumHints() {
numHints = 1;
}
break;
+#if 0
+ // The hint file is missing
case MakeRoomView(kCaldoria49, kEast):
case MakeRoomView(kCaldoria54, kEast):
numHints = 1;
break;
+#endif
case MakeRoomView(kCaldoria49, kNorth):
numHints = 1;
break;
@@ -1932,9 +1955,12 @@ Common::String Caldoria::getHintMovie(uint hintNum) {
}
return "Images/AI/Globals/XGLOB1A";
+#if 0
+ // The hint file is missing
case MakeRoomView(kCaldoria49, kEast):
case MakeRoomView(kCaldoria54, kEast):
return "Images/AI/Caldoria/X49E";
+#endif
case MakeRoomView(kCaldoria49, kNorth):
return "Images/AI/Caldoria/X49NB2";
}
diff --git a/engines/pegasus/neighborhood/caldoria/caldoriabomb.cpp b/engines/pegasus/neighborhood/caldoria/caldoriabomb.cpp
index abf34d3863..c964e3458b 100644
--- a/engines/pegasus/neighborhood/caldoria/caldoriabomb.cpp
+++ b/engines/pegasus/neighborhood/caldoria/caldoriabomb.cpp
@@ -1167,6 +1167,18 @@ CaldoriaBomb::~CaldoriaBomb() {
delete[] _bombLevel[i];
}
+void CaldoriaBomb::setSoundFXLevel(const uint16) {
+ // The transition sounds between levels are ambience, so overwrite what
+ // Neighborhood::setSoundFXLevel does and keep using the ambience volume level
+ if (_timer.isRunning())
+ _owner->_navMovie.setVolume(((PegasusEngine *)g_engine)->getAmbienceLevel());
+}
+
+void CaldoriaBomb::setAmbienceLevel(const uint16 level) {
+ if (_timer.isRunning())
+ _owner->_navMovie.setVolume(level);
+}
+
void CaldoriaBomb::openInteraction() {
_grid.moveElementTo(kCaldoriaBombGridLeft, kCaldoriaBombGridTop);
_grid.setDisplayOrder(kCaldoriaBombGridOrder);
@@ -1234,6 +1246,7 @@ void CaldoriaBomb::receiveNotification(Notification *notification, const Notific
_timer.start();
_currentLevel = 0;
_lastVertex = -1;
+ _owner->_navMovie.setVolume(((PegasusEngine *)g_engine)->getAmbienceLevel());
startBombAmbient("Sounds/Caldoria/BmbLoop1.22K.AIFF");
break;
case kCaldoria56BombStage2:
@@ -1258,6 +1271,7 @@ void CaldoriaBomb::receiveNotification(Notification *notification, const Notific
_grid.hide();
_timer.stop();
_timer.hide();
+ _owner->_navMovie.setVolume(((PegasusEngine *)g_engine)->getSoundFXLevel());
_owner->loadLoopSound1("");
_owner->playDeathExtra(kCaldoria56BombExplodes, kDeathNuclearExplosion);
}
@@ -1411,6 +1425,7 @@ void CaldoriaBomb::handleInput(const Input &input, const Hotspot *hotspot) {
_timer.stop();
_grid.hide();
_timer.hide();
+ _owner->_navMovie.setVolume(((PegasusEngine *)g_engine)->getSoundFXLevel());
_owner->startExtraSequence(kCaldoria56BombStage7, kExtraCompletedFlag, kFilterNoInput);
break;
}
diff --git a/engines/pegasus/neighborhood/caldoria/caldoriabomb.h b/engines/pegasus/neighborhood/caldoria/caldoriabomb.h
index 5bb39b4122..ba6d1e8998 100644
--- a/engines/pegasus/neighborhood/caldoria/caldoriabomb.h
+++ b/engines/pegasus/neighborhood/caldoria/caldoriabomb.h
@@ -122,6 +122,9 @@ public:
CaldoriaBomb(Neighborhood *, NotificationManager *);
virtual ~CaldoriaBomb();
+ void setSoundFXLevel(const uint16);
+ void setAmbienceLevel(const uint16);
+
long getNumHints();
Common::String getHintMovie(uint);
void doSolve();
diff --git a/engines/pegasus/neighborhood/caldoria/caldoriamessages.cpp b/engines/pegasus/neighborhood/caldoria/caldoriamessages.cpp
index a3ce97d438..2ae990d775 100644
--- a/engines/pegasus/neighborhood/caldoria/caldoriamessages.cpp
+++ b/engines/pegasus/neighborhood/caldoria/caldoriamessages.cpp
@@ -24,6 +24,7 @@
*/
#include "pegasus/gamestate.h"
+#include "pegasus/pegasus.h"
#include "pegasus/neighborhood/neighborhood.h"
#include "pegasus/neighborhood/caldoria/caldoria.h"
#include "pegasus/neighborhood/caldoria/caldoriamessages.h"
@@ -45,6 +46,10 @@ void CaldoriaMessages::openInteraction() {
_messageNumber = 1;
}
+void CaldoriaMessages::setSoundFXLevel(const uint16 fxLevel) {
+ _messageMovie.setVolume(fxLevel);
+}
+
void CaldoriaMessages::initInteraction() {
GameInteraction::_owner->startExtraSequence(kCaBedroomVidPhone, kExtraCompletedFlag, kFilterNoInput);
}
@@ -101,6 +106,7 @@ void CaldoriaMessages::play1Message(uint messageNumber) {
GameState.setCaldoriaSeenMessages(true);
}
+ _messageMovie.setVolume(((PegasusEngine *)g_engine)->getSoundFXLevel());
_messageMovie.moveElementTo(kCaldoriaMessageLeft, kCaldoriaMessageTop);
_messageMovie.setDisplayOrder(kCaldoriaMessagesOrder);
_messageMovie.startDisplaying();
diff --git a/engines/pegasus/neighborhood/caldoria/caldoriamessages.h b/engines/pegasus/neighborhood/caldoria/caldoriamessages.h
index 955fe10ce9..b2fc7c3bf9 100644
--- a/engines/pegasus/neighborhood/caldoria/caldoriamessages.h
+++ b/engines/pegasus/neighborhood/caldoria/caldoriamessages.h
@@ -41,6 +41,8 @@ public:
CaldoriaMessages(Neighborhood *, const NotificationID, NotificationManager *);
virtual ~CaldoriaMessages() {}
+ void setSoundFXLevel(const uint16);
+
protected:
void openInteraction();
void initInteraction();
diff --git a/engines/pegasus/neighborhood/mars/mars.cpp b/engines/pegasus/neighborhood/mars/mars.cpp
index 775221589a..df5a75541c 100644
--- a/engines/pegasus/neighborhood/mars/mars.cpp
+++ b/engines/pegasus/neighborhood/mars/mars.cpp
@@ -535,6 +535,10 @@ void Mars::doorOpened() {
}
void Mars::setUpReactorEnergyDrain() {
+ // If there's no energy monitor, there's nothing to do
+ if (!g_energyMonitor)
+ return;
+
switch (GameState.getCurrentRoomAndView()) {
case MakeRoomView(kMars51, kEast):
if (GameState.isCurrentDoorOpen()) {
@@ -2011,7 +2015,7 @@ void Mars::dropItemIntoRoom(Item *item, Hotspot *dropSpot) {
void Mars::robotTiredOfWaiting() {
if (GameState.getCurrentRoomAndView() == MakeRoomView(kMars48, kEast)) {
- if (_attackingItem) {
+ if (!_attackingItem) {
startExtraSequence(kMars48RobotKillsPlayer, kExtraCompletedFlag, kFilterNoInput);
loadLoopSound2("");
} else {
@@ -2398,6 +2402,8 @@ void Mars::doCanyonChase() {
if (!video->loadFile("Images/Mars/M44ESA.movie"))
error("Could not load interface->shuttle transition video");
+ video->setVolume(MIN<uint>(_vm->getSoundFXLevel(), 0xFF));
+
video->start();
while (!_vm->shouldQuit() && !video->endOfVideo()) {
@@ -2476,6 +2482,7 @@ void Mars::doCanyonChase() {
_shuttleEnergyMeter.initShuttleEnergyMeter();
_shuttleEnergyMeter.powerUpMeter();
while (_shuttleEnergyMeter.isFading()) {
+ InputDevice.pumpEvents();
_vm->checkCallBacks();
_vm->refreshDisplay();
g_system->updateScreen();
@@ -2607,6 +2614,7 @@ void Mars::startUpFromFinishedSpaceChase() {
kShuttleJunkTop, false);
initOneMovie(&_explosions, "Images/Mars/Explosions.movie", kShuttleWeaponFrontOrder, 0, 0, false);
+ _explosions.setVolume(_vm->getSoundFXLevel());
_explosionCallBack.initCallBack(&_explosions, kCallBackAtExtremes);
_energyBeam.initShuttleWeapon();
@@ -2645,6 +2653,7 @@ void Mars::startUpFromFinishedSpaceChase() {
initOneMovie(&_canyonChaseMovie, "Images/Mars/M98EAS.movie", kShuttleTractorBeamMovieOrder,
kShuttleWindowLeft, kShuttleWindowTop, true);
+ _canyonChaseMovie.setVolume(_vm->getSoundFXLevel());
_canyonChaseMovie.setTime(_canyonChaseMovie.getDuration());
_canyonChaseMovie.redrawMovieWorld();
}
@@ -2720,6 +2729,7 @@ void Mars::startUpFromSpaceChase() {
kShuttleJunkTop, false);
initOneMovie(&_explosions, "Images/Mars/Explosions.movie", kShuttleWeaponFrontOrder, 0, 0, false);
+ _explosions.setVolume(_vm->getSoundFXLevel());
_explosionCallBack.initCallBack(&_explosions, kCallBackAtExtremes);
_energyBeam.initShuttleWeapon();
@@ -2783,6 +2793,10 @@ void Mars::startUpFromSpaceChase() {
void Mars::setSoundFXLevel(const uint16 level) {
Neighborhood::setSoundFXLevel(level);
+ if (GameState.getCurrentRoomAndView() == MakeRoomView(kMars48, kEast) &&
+ !GameState.getMarsAvoidedReactorRobot())
+ _loop2Fader.setMasterVolume(level);
+
if (_canyonChaseMovie.isMovieValid())
_canyonChaseMovie.setVolume(level);
@@ -2812,6 +2826,7 @@ void Mars::marsTimerExpired(MarsTimerEvent &event) {
GameState.setScoringEnteredLaunchTube();
while (_canyonChaseMovie.isRunning()) {
+ InputDevice.pumpEvents();
_vm->checkCallBacks();
_vm->refreshDisplay();
_vm->_system->delayMillis(10);
@@ -2836,6 +2851,7 @@ void Mars::marsTimerExpired(MarsTimerEvent &event) {
initOneMovie(&_junk, "Images/Mars/Junk.movie", kShuttleJunkOrder, kShuttleJunkLeft, kShuttleJunkTop, false);
initOneMovie(&_explosions, "Images/Mars/Explosions.movie", kShuttleWeaponFrontOrder, 0, 0, false);
+ _explosions.setVolume(_vm->getSoundFXLevel());
_explosionCallBack.initCallBack(&_explosions, kCallBackAtExtremes);
_energyBeam.initShuttleWeapon();
@@ -2945,6 +2961,7 @@ void Mars::marsTimerExpired(MarsTimerEvent &event) {
showBigExplosion(r, kShuttleAlienShipOrder);
while (_explosions.isRunning()) {
+ InputDevice.pumpEvents();
_vm->checkCallBacks();
_vm->refreshDisplay();
g_system->delayMillis(10);
@@ -3138,6 +3155,7 @@ void Mars::spaceChaseClick(const Input &input, const HotSpotID id) {
_shuttleEnergyMeter.drainForTractorBeam();
while (_shuttleEnergyMeter.isFading()) {
+ InputDevice.pumpEvents();
_vm->checkCallBacks();
_vm->refreshDisplay();
_vm->_system->delayMillis(10);
@@ -3167,11 +3185,13 @@ void Mars::spaceChaseClick(const Input &input, const HotSpotID id) {
// Shameless reuse of a variable :P
initOneMovie(&_canyonChaseMovie, "Images/Mars/M98EAS.movie", kShuttleTractorBeamMovieOrder,
kShuttleWindowLeft, kShuttleWindowTop, true);
+ _canyonChaseMovie.setVolume(_vm->getSoundFXLevel());
_canyonChaseMovie.redrawMovieWorld();
playMovieSegment(&_canyonChaseMovie, 0, _canyonChaseMovie.getDuration());
// wait here until any junk clears...
while (_junk.junkFlying()) {
+ InputDevice.pumpEvents();
_vm->checkCallBacks();
_vm->refreshDisplay();
_vm->_system->delayMillis(10);
diff --git a/engines/pegasus/neighborhood/neighborhood.cpp b/engines/pegasus/neighborhood/neighborhood.cpp
index 3116bd7978..c9be349694 100644
--- a/engines/pegasus/neighborhood/neighborhood.cpp
+++ b/engines/pegasus/neighborhood/neighborhood.cpp
@@ -470,6 +470,7 @@ void Neighborhood::requestSpotSound(const TimeValue in, const TimeValue out, con
void Neighborhood::playSpotSoundSync(const TimeValue in, const TimeValue out) {
// Let the action queue play out first...
while (!actionQueueEmpty()) {
+ InputDevice.pumpEvents();
_vm->checkCallBacks();
_vm->refreshDisplay();
_vm->checkNotifications();
@@ -480,6 +481,7 @@ void Neighborhood::playSpotSoundSync(const TimeValue in, const TimeValue out) {
_spotSounds.playSoundSegment(in, out);
while (_spotSounds.isPlaying()) {
+ InputDevice.pumpEvents();
_vm->checkCallBacks();
_vm->refreshDisplay();
_vm->_system->delayMillis(10);
@@ -1105,6 +1107,7 @@ void Neighborhood::startTurnPush(const TurnDirection turnDirection, const TimeVa
_turnPush.continueFader();
do {
+ InputDevice.pumpEvents();
_vm->checkCallBacks();
_vm->refreshDisplay();
_vm->_system->delayMillis(10);
@@ -1492,7 +1495,15 @@ void Neighborhood::loadLoopSound2(const Common::String &soundName, uint16 volume
if (!_loop2SoundString.empty()) {
_soundLoop2.initFromAIFFFile(_loop2SoundString);
_soundLoop2.loopSound();
- _loop2Fader.setMasterVolume(_vm->getAmbienceLevel());
+ // HACK: Some ambient loops are actually sound effects, like Ares waiting at
+ // the reactor and Poseidon at the launch console. Detect these and use the
+ // SFX volume instead of ambience.
+ if (soundName == "Sounds/Mars/Robot Loop.aiff" ||
+ soundName == "Sounds/Norad/Breathing Typing.22K.AIFF" ||
+ soundName == "Sounds/Norad/N54NAS.32K.AIFF")
+ _loop2Fader.setMasterVolume(_vm->getSoundFXLevel());
+ else
+ _loop2Fader.setMasterVolume(_vm->getAmbienceLevel());
_loop2Fader.setFaderValue(0);
faderMove.makeTwoKnotFaderSpec(fadeScale, 0, 0, fadeIn, volume);
_loop2Fader.startFaderSync(faderMove);
@@ -1577,6 +1588,7 @@ void Neighborhood::closeCroppedMovie() {
void Neighborhood::playCroppedMovieOnce(const Common::String &movieName, CoordType left, CoordType top, const InputBits interruptionFilter) {
openCroppedMovie(movieName, left, top);
+ _croppedMovie.setVolume(_vm->getSoundFXLevel());
_croppedMovie.redrawMovieWorld();
_croppedMovie.start();
@@ -1616,6 +1628,7 @@ void Neighborhood::playMovieSegment(Movie *movie, TimeValue startTime, TimeValue
movie->start();
while (movie->isRunning()) {
+ InputDevice.pumpEvents();
_vm->checkCallBacks();
_vm->refreshDisplay();
_vm->_system->delayMillis(10);
diff --git a/engines/pegasus/neighborhood/neighborhood.h b/engines/pegasus/neighborhood/neighborhood.h
index 3c1c5eac92..f7f2b038c6 100644
--- a/engines/pegasus/neighborhood/neighborhood.h
+++ b/engines/pegasus/neighborhood/neighborhood.h
@@ -91,6 +91,7 @@ struct QueueRequest {
bool operator==(const QueueRequest &arg1, const QueueRequest &arg2);
bool operator!=(const QueueRequest &arg1, const QueueRequest &arg2);
+class CaldoriaBomb;
class GameInteraction;
class Item;
class Neighborhood;
@@ -109,6 +110,7 @@ protected:
typedef Common::Queue<QueueRequest> NeighborhoodActionQueue;
class Neighborhood : public IDObject, public NotificationReceiver, public InputHandler, public Idler {
+friend class CaldoriaBomb;
friend class StriderCallBack;
public:
diff --git a/engines/pegasus/neighborhood/norad/delta/globegame.cpp b/engines/pegasus/neighborhood/norad/delta/globegame.cpp
index 0b95e9bc2b..5c321a8e8a 100644
--- a/engines/pegasus/neighborhood/norad/delta/globegame.cpp
+++ b/engines/pegasus/neighborhood/norad/delta/globegame.cpp
@@ -453,8 +453,13 @@ GlobeGame::GlobeGame(Neighborhood *handler) : GameInteraction(kNoradGlobeGameInt
_neighborhoodNotification = handler->getNeighborhoodNotification();
}
+void GlobeGame::setSoundFXLevel(const uint16 fxLevel) {
+ _monitorMovie.setVolume(fxLevel);
+}
+
void GlobeGame::openInteraction() {
_monitorMovie.initFromMovieFile("Images/Norad Delta/N79 Left Monitor");
+ _monitorMovie.setVolume(((PegasusEngine *)g_engine)->getSoundFXLevel());
_monitorMovie.moveElementTo(kGlobeMonitorLeft, kGlobeMonitorTop);
_monitorMovie.setDisplayOrder(kGlobeMonitorLayer);
_monitorMovie.startDisplaying();
diff --git a/engines/pegasus/neighborhood/norad/delta/globegame.h b/engines/pegasus/neighborhood/norad/delta/globegame.h
index 73ed48866f..93235a1784 100644
--- a/engines/pegasus/neighborhood/norad/delta/globegame.h
+++ b/engines/pegasus/neighborhood/norad/delta/globegame.h
@@ -98,6 +98,8 @@ public:
GlobeGame(Neighborhood *);
virtual ~GlobeGame() {}
+ void setSoundFXLevel(const uint16);
+
void handleInput(const Input &, const Hotspot *);
void clickInHotspot(const Input &, const Hotspot *);
void activateHotspots();
diff --git a/engines/pegasus/neighborhood/norad/delta/noraddelta.cpp b/engines/pegasus/neighborhood/norad/delta/noraddelta.cpp
index 1eea2f0156..ee047d72b2 100644
--- a/engines/pegasus/neighborhood/norad/delta/noraddelta.cpp
+++ b/engines/pegasus/neighborhood/norad/delta/noraddelta.cpp
@@ -514,6 +514,17 @@ void NoradDelta::openDoor() {
}
}
+void NoradDelta::cantMoveThatWay(CanOpenDoorReason reason) {
+ // WORKAROUND: The door outside the launch console room isn't treated as a door,
+ // so play the correct sound.
+ if (reason == kCantMoveBlocked && GameState.getCurrentRoomAndView() == MakeRoomView(kNorad67, kNorth)) {
+ cantOpenDoor(kCantOpenLocked);
+ return;
+ }
+
+ Neighborhood::cantMoveThatWay(reason);
+}
+
void NoradDelta::activateHotspots() {
Norad::activateHotspots();
@@ -863,6 +874,13 @@ void NoradDelta::doSolve() {
}
}
+void NoradDelta::setSoundFXLevel(const uint16 level) {
+ Neighborhood::setSoundFXLevel(level);
+
+ if (GameState.getCurrentRoomAndView() == MakeRoomView(kNorad54North, kNorth))
+ _loop2Fader.setMasterVolume(level);
+}
+
Common::String NoradDelta::getSoundSpotsName() {
return "Sounds/Norad/Norad Delta Spots";
}
diff --git a/engines/pegasus/neighborhood/norad/delta/noraddelta.h b/engines/pegasus/neighborhood/norad/delta/noraddelta.h
index 11065f2c9d..591fd691a2 100644
--- a/engines/pegasus/neighborhood/norad/delta/noraddelta.h
+++ b/engines/pegasus/neighborhood/norad/delta/noraddelta.h
@@ -68,6 +68,8 @@ public:
bool canSolve();
void doSolve();
+ void setSoundFXLevel(const uint16);
+
void doorOpened();
protected:
@@ -90,6 +92,7 @@ protected:
void arriveAtNorad79West();
TimeValue getViewTime(const RoomID, const DirectionConstant);
void openDoor();
+ void cantMoveThatWay(CanMoveForwardReason);
void activateHotspots();
void clickInHotspot(const Input &, const Hotspot *);
void receiveNotification(Notification *, const NotificationFlags);
diff --git a/engines/pegasus/neighborhood/prehistoric/prehistoric.cpp b/engines/pegasus/neighborhood/prehistoric/prehistoric.cpp
index d62b069e46..190984f8bc 100644
--- a/engines/pegasus/neighborhood/prehistoric/prehistoric.cpp
+++ b/engines/pegasus/neighborhood/prehistoric/prehistoric.cpp
@@ -124,11 +124,6 @@ void Prehistoric::setUpAIRules() {
AIHasItemCondition *hasLogCondition = new AIHasItemCondition(kHistoricalLog);
AIRule *rule = new AIRule(hasLogCondition, doneAction);
g_AIArea->addAIRule(rule);
- } else {
- AIPlayMessageAction *messageAction = new AIPlayMessageAction("Images/AI/Prehistoric/XP25W", false);
- AIHasItemCondition *hasLogCondition = new AIHasItemCondition(kHistoricalLog);
- AIRule *rule = new AIRule(hasLogCondition, messageAction);
- g_AIArea->addAIRule(rule);
}
if (!_vm->isOldDemo()) {
@@ -167,6 +162,13 @@ void Prehistoric::setUpAIRules() {
rule = new AIRule(timerCondition, messageAction);
g_AIArea->addAIRule(rule);
}
+
+ if (!_vm->isDemo()) {
+ AIPlayMessageAction *messageAction = new AIPlayMessageAction("Images/AI/Prehistoric/XP25W", false);
+ AIHasItemCondition *hasLogCondition = new AIHasItemCondition(kHistoricalLog);
+ AIRule *rule = new AIRule(hasLogCondition, messageAction);
+ g_AIArea->addAIRule(rule);
+ }
}
}
@@ -202,11 +204,11 @@ TimeValue Prehistoric::getViewTime(const RoomID room, const DirectionConstant di
void Prehistoric::findSpotEntry(const RoomID room, const DirectionConstant direction, SpotFlags flags, SpotTable::Entry &entry) {
Neighborhood::findSpotEntry(room, direction, flags, entry);
+ // The original strangely disabled the loop for the two volcano spots:
+ // (kPrehistoric01, kSouth) and (kPrehistoric25, kSouth)
+ // We don't do that here.
+
switch (MakeRoomView(room, direction)) {
- case MakeRoomView(kPrehistoric01, kSouth):
- case MakeRoomView(kPrehistoric25, kSouth):
- entry.clear();
- break;
case MakeRoomView(kPrehistoric01, kEast):
if (GameState.getPrehistoricSeenFlyer1())
entry.clear();
diff --git a/engines/pegasus/neighborhood/tsa/fulltsa.cpp b/engines/pegasus/neighborhood/tsa/fulltsa.cpp
index 99efe10272..92b79c038e 100644
--- a/engines/pegasus/neighborhood/tsa/fulltsa.cpp
+++ b/engines/pegasus/neighborhood/tsa/fulltsa.cpp
@@ -1692,7 +1692,9 @@ void FullTSA::initializeTBPMonitor(const int newMode, const ExtraID highlightExt
releaseSprites();
}
- _interruptionFilter = kFilterAllInput;
+ // Only allow input if we're not in the middle of series of queue requests.
+ if (actionQueueEmpty())
+ _interruptionFilter = kFilterAllInput;
}
void FullTSA::startUpComparisonMonitor() {
@@ -2643,6 +2645,7 @@ void FullTSA::receiveNotification(Notification *notification, const Notification
GameState.setMarsReadyForShuttleTransport(false);
GameState.setMarsFinishedCanyonChase(false);
GameState.setMarsThreadedMaze(false);
+ GameState.setMarsSawRobotLeave(false);
break;
case kPlayerOnWayToWSC:
_vm->jumpToNewEnvironment(kWSCID, kWSC01, kWest);
@@ -2691,16 +2694,18 @@ void FullTSA::receiveNotification(Notification *notification, const Notification
}
break;
case kTSA37DownloadToOpMemReview:
- switch (GameState.getTSAState()) {
- case kPlayerOnWayToNorad:
- g_opticalChip->playOpMemMovie(kPoseidonSpotID);
- break;
- case kPlayerOnWayToMars:
- g_opticalChip->playOpMemMovie(kAriesSpotID);
- break;
- case kPlayerOnWayToWSC:
- g_opticalChip->playOpMemMovie(kMercurySpotID);
- break;
+ if (_vm->itemInBiochips(kOpticalBiochip)) {
+ switch (GameState.getTSAState()) {
+ case kPlayerOnWayToNorad:
+ g_opticalChip->playOpMemMovie(kPoseidonSpotID);
+ break;
+ case kPlayerOnWayToMars:
+ g_opticalChip->playOpMemMovie(kAriesSpotID);
+ break;
+ case kPlayerOnWayToWSC:
+ g_opticalChip->playOpMemMovie(kMercurySpotID);
+ break;
+ }
}
if (GameState.allTimeZonesFinished()) {
diff --git a/engines/pegasus/neighborhood/tsa/tinytsa.cpp b/engines/pegasus/neighborhood/tsa/tinytsa.cpp
index 0d11f5d904..c808325b0f 100644
--- a/engines/pegasus/neighborhood/tsa/tinytsa.cpp
+++ b/engines/pegasus/neighborhood/tsa/tinytsa.cpp
@@ -327,6 +327,7 @@ void TinyTSA::receiveNotification(Notification *notification, const Notification
GameState.setMarsReadyForShuttleTransport(false);
GameState.setMarsFinishedCanyonChase(false);
GameState.setMarsThreadedMaze(false);
+ GameState.setMarsSawRobotLeave(false);
break;
case kPlayerOnWayToWSC:
_vm->jumpToNewEnvironment(kWSCID, kWSC01, kWest);
@@ -372,16 +373,18 @@ void TinyTSA::receiveNotification(Notification *notification, const Notification
}
break;
case kTinyTSA37DownloadToOpMemReview:
- switch (GameState.getTSAState()) {
- case kPlayerOnWayToNorad:
- g_opticalChip->playOpMemMovie(kPoseidonSpotID);
- break;
- case kPlayerOnWayToMars:
- g_opticalChip->playOpMemMovie(kAriesSpotID);
- break;
- case kPlayerOnWayToWSC:
- g_opticalChip->playOpMemMovie(kMercurySpotID);
- break;
+ if (_vm->itemInBiochips(kOpticalBiochip)) {
+ switch (GameState.getTSAState()) {
+ case kPlayerOnWayToNorad:
+ g_opticalChip->playOpMemMovie(kPoseidonSpotID);
+ break;
+ case kPlayerOnWayToMars:
+ g_opticalChip->playOpMemMovie(kAriesSpotID);
+ break;
+ case kPlayerOnWayToWSC:
+ g_opticalChip->playOpMemMovie(kMercurySpotID);
+ break;
+ }
}
requestExtraSequence(kTinyTSA37OpMemReviewToMainMenu, kExtraCompletedFlag, kFilterNoInput);
diff --git a/engines/pegasus/neighborhood/wsc/wsc.cpp b/engines/pegasus/neighborhood/wsc/wsc.cpp
index 09e2a48a52..f009b35cdc 100644
--- a/engines/pegasus/neighborhood/wsc/wsc.cpp
+++ b/engines/pegasus/neighborhood/wsc/wsc.cpp
@@ -2029,6 +2029,7 @@ void WSC::moleculeGameClick(const HotSpotID id) {
_moleculesMovie.start();
while (_moleculesMovie.isRunning()) {
+ InputDevice.pumpEvents();
_vm->checkCallBacks();
_vm->refreshDisplay();
_vm->_system->delayMillis(10);
@@ -2063,6 +2064,7 @@ void WSC::moleculeGameClick(const HotSpotID id) {
_moleculesMovie.start();
while (_moleculesMovie.isRunning()) {
+ InputDevice.pumpEvents();
_vm->checkCallBacks();
_vm->refreshDisplay();
_vm->_system->delayMillis(10);
@@ -2076,6 +2078,7 @@ void WSC::moleculeGameClick(const HotSpotID id) {
while (_moleculesMovie.isRunning()) {
+ InputDevice.pumpEvents();
_vm->checkCallBacks();
_vm->refreshDisplay();
_vm->_system->delayMillis(10);
diff --git a/engines/pegasus/pegasus.cpp b/engines/pegasus/pegasus.cpp
index 3bd29ce8dd..0010180d8d 100644
--- a/engines/pegasus/pegasus.cpp
+++ b/engines/pegasus/pegasus.cpp
@@ -36,6 +36,7 @@
#include "backends/keymapper/keymapper.h"
#include "base/plugins.h"
#include "base/version.h"
+#include "gui/message.h"
#include "gui/saveload.h"
#include "video/theora_decoder.h"
#include "video/qt_decoder.h"
@@ -306,6 +307,7 @@ void PegasusEngine::runIntro() {
Video::VideoDecoder *video = new Video::QuickTimeDecoder();
if (video->loadFile(_introDirectory + "/BandaiLogo.movie")) {
+ video->setVolume(MIN<uint>(getAmbienceLevel(), 0xFF));
video->start();
while (!shouldQuit() && !video->endOfVideo() && !skipped) {
@@ -337,6 +339,8 @@ void PegasusEngine::runIntro() {
if (!video->loadFile(_introDirectory + "/Big Movie.movie"))
error("Could not load intro movie");
+ video->setVolume(MIN<uint>(getAmbienceLevel(), 0xFF));
+
video->seek(Audio::Timestamp(0, 10 * 600, 600));
video->start();
@@ -379,20 +383,21 @@ Common::Error PegasusEngine::showSaveDialog() {
int slot = slc.runModalWithPluginAndTarget(plugin, ConfMan.getActiveDomainName());
- Common::Error result;
+ if (slot >= 0)
+ return saveGameState(slot, slc.getResultString());
- if (slot >= 0) {
- if (saveGameState(slot, slc.getResultString()).getCode() == Common::kNoError)
- result = Common::kNoError;
- else
- result = Common::kUnknownError;
- } else {
- result = Common::kUserCanceled;
- }
+ return Common::kUserCanceled;
+}
- return result;
+void PegasusEngine::showSaveFailedDialog(const Common::Error &status) {
+ Common::String failMessage = Common::String::format(_("Gamestate save failed (%s)! "
+ "Please consult the README for basic information, and for "
+ "instructions on how to obtain further assistance."), status.getDesc().c_str());
+ GUI::MessageDialog dialog(failMessage);
+ dialog.runModal();
}
+
GUI::Debugger *PegasusEngine::getDebugger() {
return _console;
}
@@ -429,8 +434,10 @@ void PegasusEngine::removeTimeBase(TimeBase *timeBase) {
_timeBases.remove(timeBase);
}
-bool PegasusEngine::loadFromStream(Common::ReadStream *stream) {
+bool PegasusEngine::loadFromStream(Common::SeekableReadStream *stream) {
// Dispose currently running stuff
+ lowerInventoryDrawerSync();
+ lowerBiochipDrawerSync();
useMenu(0);
useNeighborhood(0);
removeAllItemsFromInventory();
@@ -520,8 +527,36 @@ bool PegasusEngine::loadFromStream(Common::ReadStream *stream) {
performJump(GameState.getCurrentNeighborhood());
// AI rules
- if (g_AIArea)
- g_AIArea->readAIRules(stream);
+ if (g_AIArea) {
+ // HACK: clone2727 accidentally changed some Prehistoric code to output some bad saves
+ // at one point. That's fixed now, but I don't want to leave the other users high
+ // and dry.
+ if (GameState.getCurrentNeighborhood() == kPrehistoricID && !isDemo()) {
+ uint32 pos = stream->pos();
+ stream->seek(0x208);
+ uint32 roomView = stream->readUint32BE();
+ stream->seek(pos);
+
+ if (roomView == 0x30019) {
+ // This is a bad save -> Let's fix the data
+ // One byte should be put at the end instead
+ uint32 size = stream->size() - pos;
+ byte *data = (byte *)malloc(size);
+ data[0] = stream->readByte();
+ data[1] = stream->readByte();
+ data[2] = stream->readByte();
+ byte wrongData = stream->readByte();
+ stream->read(data + 3, size - 4);
+ data[size - 1] = wrongData;
+ Common::MemoryReadStream tempStream(data, size, DisposeAfterUse::YES);
+ g_AIArea->readAIRules(&tempStream);
+ } else {
+ g_AIArea->readAIRules(stream);
+ }
+ } else {
+ g_AIArea->readAIRules(stream);
+ }
+ }
startNeighborhood();
@@ -762,6 +797,8 @@ void PegasusEngine::introTimerExpired() {
if (!video->loadFile(_introDirectory + "/LilMovie.movie"))
error("Failed to load little movie");
+ video->setVolume(MIN<uint>(getAmbienceLevel(), 0xFF));
+
bool saveAllowed = swapSaveAllowed(false);
bool openAllowed = swapLoadAllowed(false);
@@ -804,6 +841,7 @@ void PegasusEngine::delayShell(TimeValue time, TimeScale scale) {
uint32 timeInMillis = time * 1000 / scale;
while (g_system->getMillis() < startTime + timeInMillis) {
+ InputDevice.pumpEvents();
checkCallBacks();
_gfx->updateDisplay();
}
@@ -908,6 +946,8 @@ void PegasusEngine::doGameMenuCommand(const GameMenuCommand command) {
if (!video->loadFile(_introDirectory + "/Closing.movie"))
error("Could not load closing movie");
+ video->setVolume(MIN<uint>(getSoundFXLevel(), 0xFF));
+
uint16 x = (640 - video->getWidth() * 2) / 2;
uint16 y = (480 - video->getHeight() * 2) / 2;
@@ -939,8 +979,14 @@ void PegasusEngine::doGameMenuCommand(const GameMenuCommand command) {
resetIntroTimer();
break;
case kMenuCmdPauseSave:
- if (showSaveDialog().getCode() != Common::kUserCanceled)
+ result = showSaveDialog();
+
+ if (result.getCode() != Common::kUserCanceled) {
+ if (result.getCode() != Common::kNoError)
+ showSaveFailedDialog(result);
+
pauseMenu(false);
+ }
break;
case kMenuCmdPauseContinue:
pauseMenu(false);
@@ -991,7 +1037,12 @@ void PegasusEngine::handleInput(const Input &input, const Hotspot *cursorSpot) {
// Can only save during a game and not in the demo
if (g_neighborhood && !isDemo()) {
pauseEngine(true);
- showSaveDialog();
+
+ Common::Error result = showSaveDialog();
+
+ if (result.getCode() != Common::kNoError && result.getCode() != Common::kUserCanceled)
+ showSaveFailedDialog(result);
+
pauseEngine(false);
}
}
@@ -1432,6 +1483,15 @@ void PegasusEngine::throwAwayEverything() {
g_interface = 0;
}
+InputBits PegasusEngine::getInputFilter() {
+ InputBits filter = InputHandler::getInputFilter();
+
+ if (isPaused())
+ return filter & ~JMPPPInput::getItemPanelsInputFilter();
+
+ return filter;
+}
+
void PegasusEngine::processShell() {
checkCallBacks();
checkNotifications();
@@ -1630,6 +1690,9 @@ void PegasusEngine::startNewGame() {
removeAllItemsFromInventory();
removeAllItemsFromBiochips();
+ // Properly reset all items to their original state
+ g_allItems.resetAllItems();
+
BiochipItem *biochip = (BiochipItem *)_allItems.findItemByID(kAIBiochip);
addItemToBiochips(biochip);
@@ -2120,6 +2183,7 @@ void PegasusEngine::autoDragItemIntoRoom(Item *item, Sprite *draggingSprite) {
_autoDragger.autoDrag(draggingSprite, start, stop, time, kDefaultTimeScale);
while (_autoDragger.isDragging()) {
+ InputDevice.pumpEvents();
checkCallBacks();
refreshDisplay();
_system->delayMillis(10);
@@ -2153,6 +2217,7 @@ void PegasusEngine::autoDragItemIntoInventory(Item *, Sprite *draggingSprite) {
_autoDragger.autoDrag(draggingSprite, start, stop, time, kDefaultTimeScale);
while (_autoDragger.isDragging()) {
+ InputDevice.pumpEvents();
checkCallBacks();
refreshDisplay();
_system->delayMillis(10);
@@ -2229,10 +2294,7 @@ void PegasusEngine::doSubChase() {
drawScaledFrame(frame, 0, 0);
}
- Common::Event event;
- while (_eventMan->pollEvent(event))
- ;
-
+ InputDevice.pumpEvents();
_system->delayMillis(10);
}
diff --git a/engines/pegasus/pegasus.h b/engines/pegasus/pegasus.h
index 07e6d8f761..d88545a4d1 100644
--- a/engines/pegasus/pegasus.h
+++ b/engines/pegasus/pegasus.h
@@ -249,7 +249,7 @@ private:
Common::List<TimeBase *> _timeBases;
// Save/Load
- bool loadFromStream(Common::ReadStream *stream);
+ bool loadFromStream(Common::SeekableReadStream *stream);
bool writeToStream(Common::WriteStream *stream, int saveType);
void loadFromContinuePoint();
void writeContinueStream(Common::WriteStream *stream);
@@ -257,6 +257,7 @@ private:
bool _saveAllowed, _loadAllowed; // It's so nice that this was in the original code already :P
Common::Error showLoadDialog();
Common::Error showSaveDialog();
+ void showSaveFailedDialog(const Common::Error &status);
bool _saveRequested, _loadRequested;
// Misc.
@@ -272,6 +273,7 @@ private:
uint getNeighborhoodCD(const NeighborhoodID neighborhood) const;
uint _currentCD;
void initKeymap();
+ InputBits getInputFilter();
// Menu
GameMenu *_gameMenu;
diff --git a/engines/pegasus/surface.cpp b/engines/pegasus/surface.cpp
index cdcb3c6e79..cb1e2e7bcc 100644
--- a/engines/pegasus/surface.cpp
+++ b/engines/pegasus/surface.cpp
@@ -28,7 +28,7 @@
#include "common/stream.h"
#include "common/system.h"
#include "graphics/surface.h"
-#include "graphics/decoders/pict.h"
+#include "image/pict.h"
#include "video/video_decoder.h"
#include "pegasus/pegasus.h"
@@ -101,7 +101,7 @@ void Surface::getImageFromPICTResource(Common::MacResManager *resFork, uint16 id
}
bool Surface::getImageFromPICTStream(Common::SeekableReadStream *stream) {
- Graphics::PICTDecoder pict;
+ Image::PICTDecoder pict;
if (!pict.loadStream(*stream))
return false;
diff --git a/engines/pegasus/timers.cpp b/engines/pegasus/timers.cpp
index 8463d866e8..5fb2551e7a 100644
--- a/engines/pegasus/timers.cpp
+++ b/engines/pegasus/timers.cpp
@@ -333,6 +333,7 @@ void TimeBaseCallBack::releaseCallBack() {
void TimeBaseCallBack::disposeCallBack() {
_timeBase = 0;
+ _trigger = kTriggerNone;
_hasBeenTriggered = false;
}
diff --git a/engines/plugins_table.h b/engines/plugins_table.h
deleted file mode 100644
index 38cd43ac74..0000000000
--- a/engines/plugins_table.h
+++ /dev/null
@@ -1,130 +0,0 @@
-// This file is being included by "base/plugins.cpp"
-#if PLUGIN_ENABLED_STATIC(SCUMM)
-LINK_PLUGIN(SCUMM)
-#endif
-#if PLUGIN_ENABLED_STATIC(AGI)
-LINK_PLUGIN(AGI)
-#endif
-#if PLUGIN_ENABLED_STATIC(AGOS)
-LINK_PLUGIN(AGOS)
-#endif
-#if PLUGIN_ENABLED_STATIC(AVALANCHE)
-LINK_PLUGIN(AVALANCHE)
-#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
-#if PLUGIN_ENABLED_STATIC(DRACI)
-LINK_PLUGIN(DRACI)
-#endif
-#if PLUGIN_ENABLED_STATIC(DRASCULA)
-LINK_PLUGIN(DRASCULA)
-#endif
-#if PLUGIN_ENABLED_STATIC(DREAMWEB)
-LINK_PLUGIN(DREAMWEB)
-#endif
-#if PLUGIN_ENABLED_STATIC(FULLPIPE)
-LINK_PLUGIN(FULLPIPE)
-#endif
-#if PLUGIN_ENABLED_STATIC(GOB)
-LINK_PLUGIN(GOB)
-#endif
-#if PLUGIN_ENABLED_STATIC(GROOVIE)
-LINK_PLUGIN(GROOVIE)
-#endif
-#if PLUGIN_ENABLED_STATIC(HOPKINS)
-LINK_PLUGIN(HOPKINS)
-#endif
-#if PLUGIN_ENABLED_STATIC(HUGO)
-LINK_PLUGIN(HUGO)
-#endif
-#if PLUGIN_ENABLED_STATIC(KYRA)
-LINK_PLUGIN(KYRA)
-#endif
-#if PLUGIN_ENABLED_STATIC(MORTEVIELLE)
-LINK_PLUGIN(MORTEVIELLE)
-#endif
-#if PLUGIN_ENABLED_STATIC(LASTEXPRESS)
-LINK_PLUGIN(LASTEXPRESS)
-#endif
-#if PLUGIN_ENABLED_STATIC(LURE)
-LINK_PLUGIN(LURE)
-#endif
-#if PLUGIN_ENABLED_STATIC(MADE)
-LINK_PLUGIN(MADE)
-#endif
-#if PLUGIN_ENABLED_STATIC(MOHAWK)
-LINK_PLUGIN(MOHAWK)
-#endif
-#if PLUGIN_ENABLED_STATIC(NEVERHOOD)
-LINK_PLUGIN(NEVERHOOD)
-#endif
-#if PLUGIN_ENABLED_STATIC(PARALLACTION)
-LINK_PLUGIN(PARALLACTION)
-#endif
-#if PLUGIN_ENABLED_STATIC(PEGASUS)
-LINK_PLUGIN(PEGASUS)
-#endif
-#if PLUGIN_ENABLED_STATIC(QUEEN)
-LINK_PLUGIN(QUEEN)
-#endif
-#if PLUGIN_ENABLED_STATIC(SAGA)
-LINK_PLUGIN(SAGA)
-#endif
-#if PLUGIN_ENABLED_STATIC(SCI)
-LINK_PLUGIN(SCI)
-#endif
-#if PLUGIN_ENABLED_STATIC(SKY)
-LINK_PLUGIN(SKY)
-#endif
-#if PLUGIN_ENABLED_STATIC(SWORD1)
-LINK_PLUGIN(SWORD1)
-#endif
-#if PLUGIN_ENABLED_STATIC(SWORD2)
-LINK_PLUGIN(SWORD2)
-#endif
-#if PLUGIN_ENABLED_STATIC(SWORD25)
-LINK_PLUGIN(SWORD25)
-#endif
-#if PLUGIN_ENABLED_STATIC(TEENAGENT)
-LINK_PLUGIN(TEENAGENT)
-#endif
-#if PLUGIN_ENABLED_STATIC(TESTBED)
-LINK_PLUGIN(TESTBED)
-#endif
-#if PLUGIN_ENABLED_STATIC(TINSEL)
-LINK_PLUGIN(TINSEL)
-#endif
-#if PLUGIN_ENABLED_STATIC(TOLTECS)
-LINK_PLUGIN(TOLTECS)
-#endif
-#if PLUGIN_ENABLED_STATIC(TONY)
-LINK_PLUGIN(TONY)
-#endif
-#if PLUGIN_ENABLED_STATIC(TOON)
-LINK_PLUGIN(TOON)
-#endif
-#if PLUGIN_ENABLED_STATIC(TSAGE)
-LINK_PLUGIN(TSAGE)
-#endif
-#if PLUGIN_ENABLED_STATIC(TOUCHE)
-LINK_PLUGIN(TOUCHE)
-#endif
-#if PLUGIN_ENABLED_STATIC(TUCKER)
-LINK_PLUGIN(TUCKER)
-#endif
-#if PLUGIN_ENABLED_STATIC(WINTERMUTE)
-LINK_PLUGIN(WINTERMUTE)
-#endif
-#if PLUGIN_ENABLED_STATIC(ZVISION)
-LINK_PLUGIN(ZVISION)
-#endif
diff --git a/engines/queen/bankman.cpp b/engines/queen/bankman.cpp
index ea823773dc..6d99874697 100644
--- a/engines/queen/bankman.cpp
+++ b/engines/queen/bankman.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/queen/bankman.h b/engines/queen/bankman.h
index 9e1e726fbf..87c58022a1 100644
--- a/engines/queen/bankman.h
+++ b/engines/queen/bankman.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/queen/command.cpp b/engines/queen/command.cpp
index 7876dbfae9..d9fafa3a1d 100644
--- a/engines/queen/command.cpp
+++ b/engines/queen/command.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/queen/command.h b/engines/queen/command.h
index 6865aa80a2..1d49b134de 100644
--- a/engines/queen/command.h
+++ b/engines/queen/command.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/queen/configure.engine b/engines/queen/configure.engine
new file mode 100644
index 0000000000..c8766743f9
--- /dev/null
+++ b/engines/queen/configure.engine
@@ -0,0 +1,3 @@
+# This file is included from the main "configure" script
+# add_engine [name] [desc] [build-by-default] [subengines] [base games] [deps]
+add_engine queen "Flight of the Amazon Queen" yes
diff --git a/engines/queen/credits.cpp b/engines/queen/credits.cpp
index 43e3bc7c6a..b2f6a601bf 100644
--- a/engines/queen/credits.cpp
+++ b/engines/queen/credits.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/queen/credits.h b/engines/queen/credits.h
index b89d029a59..56e0bdb882 100644
--- a/engines/queen/credits.h
+++ b/engines/queen/credits.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/queen/cutaway.cpp b/engines/queen/cutaway.cpp
index 1e53c00564..0f54431acf 100644
--- a/engines/queen/cutaway.cpp
+++ b/engines/queen/cutaway.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -552,7 +552,6 @@ void Cutaway::dumpCutawayAnim(CutawayAnim &anim) {
const byte *Cutaway::handleAnimation(const byte *ptr, CutawayObject &object) {
// lines 1517-1770 in cutaway.c
int frameCount = 0;
- int header = 0;
int i;
CutawayAnim objAnim[56];
@@ -560,7 +559,7 @@ const byte *Cutaway::handleAnimation(const byte *ptr, CutawayObject &object) {
// Read animation frames
for (;;) {
- header = (int16)READ_BE_INT16(ptr);
+ int header = (int16)READ_BE_INT16(ptr);
ptr += 2;
if (-2 == header)
diff --git a/engines/queen/cutaway.h b/engines/queen/cutaway.h
index a7e3646a59..f6115c8023 100644
--- a/engines/queen/cutaway.h
+++ b/engines/queen/cutaway.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/queen/debug.cpp b/engines/queen/debug.cpp
index d09c5d4469..125ddf30c6 100644
--- a/engines/queen/debug.cpp
+++ b/engines/queen/debug.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -21,6 +21,7 @@
*/
#include "common/scummsys.h"
+#include "common/util.h"
#include "queen/debug.h"
@@ -35,15 +36,15 @@ namespace Queen {
Debugger::Debugger(QueenEngine *vm)
: _vm(vm), _flags(0) {
- DCmd_Register("areas", WRAP_METHOD(Debugger, Cmd_Areas));
- DCmd_Register("asm", WRAP_METHOD(Debugger, Cmd_Asm));
- DCmd_Register("bob", WRAP_METHOD(Debugger, Cmd_Bob));
- DCmd_Register("bobs", WRAP_METHOD(Debugger, Cmd_PrintBobs));
- DCmd_Register("gs", WRAP_METHOD(Debugger, Cmd_GameState));
- DCmd_Register("info", WRAP_METHOD(Debugger, Cmd_Info));
- DCmd_Register("items", WRAP_METHOD(Debugger, Cmd_Items));
- DCmd_Register("room", WRAP_METHOD(Debugger, Cmd_Room));
- DCmd_Register("song", WRAP_METHOD(Debugger, Cmd_Song));
+ registerCmd("areas", WRAP_METHOD(Debugger, Cmd_Areas));
+ registerCmd("asm", WRAP_METHOD(Debugger, Cmd_Asm));
+ registerCmd("bob", WRAP_METHOD(Debugger, Cmd_Bob));
+ registerCmd("bobs", WRAP_METHOD(Debugger, Cmd_PrintBobs));
+ registerCmd("gs", WRAP_METHOD(Debugger, Cmd_GameState));
+ registerCmd("info", WRAP_METHOD(Debugger, Cmd_Info));
+ registerCmd("items", WRAP_METHOD(Debugger, Cmd_Items));
+ registerCmd("room", WRAP_METHOD(Debugger, Cmd_Room));
+ registerCmd("song", WRAP_METHOD(Debugger, Cmd_Song));
}
Debugger::~Debugger() {} // we need this here for __SYMBIAN32__
@@ -57,81 +58,94 @@ void Debugger::postEnter() {
_vm->graphics()->setupMouseCursor();
}
+static bool isNumeric(const char *arg) {
+ const char *str = arg;
+ bool retVal = true;
+ while (retVal && (*str != '\0')) {
+ retVal = Common::isDigit(*str++);
+ }
+ return retVal;
+}
+
bool Debugger::Cmd_Asm(int argc, const char **argv) {
- if (argc == 2) {
+ if (argc == 2 && isNumeric(argv[1])) {
uint16 sm = atoi(argv[1]);
_vm->logic()->executeSpecialMove(sm);
return false;
} else {
- DebugPrintf("Usage: %s smnum\n", argv[0]);
+ debugPrintf("Usage: %s smnum\n", argv[0]);
}
return true;
}
bool Debugger::Cmd_Areas(int argc, const char **argv) {
_flags ^= DF_DRAW_AREAS;
- DebugPrintf("Room areas display %s\n", (_flags & DF_DRAW_AREAS) != 0 ? "on" : "off");
+ debugPrintf("Room areas display %s\n", (_flags & DF_DRAW_AREAS) != 0 ? "on" : "off");
return true;
}
bool Debugger::Cmd_Bob(int argc, const char **argv) {
- if (argc >= 3) {
+ if (argc >= 3 && isNumeric(argv[1])) {
int bobNum = atoi(argv[1]);
if (bobNum >= Graphics::MAX_BOBS_NUMBER) {
- DebugPrintf("Bob %d is out of range (range: 0 - %d)\n", bobNum, Graphics::MAX_BOBS_NUMBER);
+ debugPrintf("Bob %d is out of range (range: 0 - %d)\n", bobNum, Graphics::MAX_BOBS_NUMBER);
} else {
- int param = (argc > 3) ? atoi(argv[3]) : 0;
+ int param = 0;
+ if (argc > 3 && isNumeric(argv[3])) {
+ param = atoi(argv[3]);
+ } else {
+ debugPrintf("Invalid parameter for bob command '%s'\n", argv[2]);
+ }
BobSlot *bob = _vm->graphics()->bob(bobNum);
if (!strcmp(argv[2], "toggle")) {
bob->active = !bob->active;
- DebugPrintf("bob[%d].active = %d\n", bobNum, bob->active);
+ debugPrintf("bob[%d].active = %d\n", bobNum, bob->active);
} else if (!strcmp(argv[2], "x")) {
bob->x = param;
- DebugPrintf("bob[%d].x = %d\n", bobNum, bob->x);
+ debugPrintf("bob[%d].x = %d\n", bobNum, bob->x);
} else if (!strcmp(argv[2], "y")) {
bob->y = param;
- DebugPrintf("bob[%d].y = %d\n", bobNum, bob->y);
+ debugPrintf("bob[%d].y = %d\n", bobNum, bob->y);
} else if (!strcmp(argv[2], "frame")) {
bob->frameNum = param;
- DebugPrintf("bob[%d].frameNum = %d\n", bobNum, bob->frameNum);
+ debugPrintf("bob[%d].frameNum = %d\n", bobNum, bob->frameNum);
} else if (!strcmp(argv[2], "speed")) {
bob->speed = param;
- DebugPrintf("bob[%d].speed = %d\n", bobNum, bob->speed);
+ debugPrintf("bob[%d].speed = %d\n", bobNum, bob->speed);
} else {
- DebugPrintf("Unknown bob command '%s'\n", argv[2]);
+ debugPrintf("Unknown bob command '%s'\n", argv[2]);
}
}
} else {
- DebugPrintf("Usage: %s bobnum command parameter\n", argv[0]);
+ debugPrintf("Usage: %s bobnum command parameter\n", argv[0]);
}
return true;
}
bool Debugger::Cmd_GameState(int argc, const char **argv) {
uint16 slot;
- switch (argc) {
- case 2:
- slot = atoi(argv[1]);
- DebugPrintf("GAMESTATE[%d] ", slot);
- DebugPrintf("is %d\n", _vm->logic()->gameState(slot));
- break;
- case 3:
+ if ((argc == 2 || argc == 3) && isNumeric(argv[1])) {
slot = atoi(argv[1]);
- DebugPrintf("GAMESTATE[%d] ", slot);
- DebugPrintf("was %d ", _vm->logic()->gameState(slot));
- _vm->logic()->gameState(slot, atoi(argv[2]));
- DebugPrintf("now %d\n", _vm->logic()->gameState(slot));
- break;
- default:
- DebugPrintf("Usage: %s slotnum value\n", argv[0]);
- break;
+ debugPrintf("GAMESTATE[%d] ", slot);
+ debugPrintf("%s %d\n", (argc == 2) ? "is" : "was", _vm->logic()->gameState(slot));
+
+ if (argc == 3) {
+ if (isNumeric(argv[1])) {
+ _vm->logic()->gameState(slot, atoi(argv[2]));
+ debugPrintf("now %d\n", _vm->logic()->gameState(slot));
+ } else {
+ debugPrintf("Usage: %s slotnum <value>\n", argv[0]);
+ }
+ }
+ } else {
+ debugPrintf("Usage: %s slotnum <value>\n", argv[0]);
}
return true;
}
bool Debugger::Cmd_Info(int argc, const char **argv) {
- DebugPrintf("Version: %s\n", _vm->resource()->getJASVersion());
- DebugPrintf("Audio compression: %d\n", _vm->resource()->getCompression());
+ debugPrintf("Version: %s\n", _vm->resource()->getJASVersion());
+ debugPrintf("Audio compression: %d\n", _vm->resource()->getCompression());
return true;
}
@@ -142,36 +156,36 @@ bool Debugger::Cmd_Items(int argc, const char **argv) {
item->name = ABS(item->name);
++item;
}
- DebugPrintf("Enabled all inventory items\n");
+ debugPrintf("Enabled all inventory items\n");
return true;
}
bool Debugger::Cmd_PrintBobs(int argc, const char**argv) {
int i;
BobSlot *bob = _vm->graphics()->bob(0);
- DebugPrintf("+------------------------------------+\n");
- DebugPrintf("|# | x| y|f|scl|frm|a|m|spd| ex| ey|\n");
- DebugPrintf("+--+---+---+-+---+---+-+-+---+---+---+\n");
+ debugPrintf("+------------------------------------+\n");
+ debugPrintf("|# | x| y|f|scl|frm|a|m|spd| ex| ey|\n");
+ debugPrintf("+--+---+---+-+---+---+-+-+---+---+---+\n");
for (i = 0; i < Graphics::MAX_BOBS_NUMBER; ++i, ++bob) {
if (bob->active) {
- DebugPrintf("|%2d|%3d|%3d|%1d|%3d|%3d|%1d|%1d|%3d|%3d|%3d|\n",
+ debugPrintf("|%2d|%3d|%3d|%1d|%3d|%3d|%1d|%1d|%3d|%3d|%3d|\n",
i, bob->x, bob->y, bob->xflip, bob->scale, bob->frameNum,
bob->animating, bob->moving, bob->speed, bob->endx, bob->endy);
}
}
- DebugPrintf("+--------------------------------+\n");
+ debugPrintf("+--------------------------------+\n");
return true;
}
bool Debugger::Cmd_Room(int argc, const char **argv) {
- if (argc == 2) {
+ if (argc == 2 && isNumeric(argv[1])) {
uint16 roomNum = atoi(argv[1]);
_vm->logic()->joePos(0, 0);
_vm->logic()->newRoom(roomNum);
_vm->logic()->entryObj(_vm->logic()->roomData(roomNum) + 1);
return false;
} else {
- DebugPrintf("Current room: %d (%s), use '%s <roomnum>' to switch\n",
+ debugPrintf("Current room: %d (%s), use '%s <roomnum>' to switch\n",
_vm->logic()->currentRoom(),
_vm->logic()->roomName(_vm->logic()->currentRoom()),
argv[0]);
@@ -180,12 +194,12 @@ bool Debugger::Cmd_Room(int argc, const char **argv) {
}
bool Debugger::Cmd_Song(int argc, const char **argv) {
- if (argc == 2) {
+ if (argc == 2 && isNumeric(argv[1])) {
int16 songNum = atoi(argv[1]);
_vm->sound()->playSong(songNum);
- DebugPrintf("Playing song %d\n", songNum);
+ debugPrintf("Playing song %d\n", songNum);
} else {
- DebugPrintf("Usage: %s songnum\n", argv[0]);
+ debugPrintf("Usage: %s songnum\n", argv[0]);
}
return true;
}
diff --git a/engines/queen/debug.h b/engines/queen/debug.h
index 01da4a35d6..19d77dffc0 100644
--- a/engines/queen/debug.h
+++ b/engines/queen/debug.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/queen/defs.h b/engines/queen/defs.h
index 3d06485ef5..1904a390bc 100644
--- a/engines/queen/defs.h
+++ b/engines/queen/defs.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/queen/detection.cpp b/engines/queen/detection.cpp
new file mode 100644
index 0000000000..5a7b4c6ad0
--- /dev/null
+++ b/engines/queen/detection.cpp
@@ -0,0 +1,508 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public 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 "common/config-manager.h"
+#include "common/file.h"
+#include "common/gui_options.h"
+#include "common/savefile.h"
+#include "common/system.h"
+#include "common/translation.h"
+
+#include "queen/queen.h"
+#include "queen/resource.h"
+
+namespace Queen {
+
+struct QueenGameDescription {
+ ADGameDescription desc;
+};
+
+} // End of namespace Queen
+
+static const PlainGameDescriptor queenGames[] = {
+ {"queen", "Flight of the Amazon Queen"},
+ {0, 0}
+};
+
+#define GAMEOPTION_ALT_INTRO GUIO_GAMEOPTIONS1
+
+static const ADExtraGuiOptionsMap optionsList[] = {
+ {
+ GAMEOPTION_ALT_INTRO,
+ {
+ _s("Alternative intro"),
+ _s("Use an alternative game intro (CD version only)"),
+ "alt_intro",
+ false
+ }
+ },
+
+ AD_EXTRA_GUI_OPTIONS_TERMINATOR
+};
+
+namespace Queen {
+
+static const QueenGameDescription gameDescriptions[] = {
+ // Amiga Demo - English
+ {
+ {
+ "queen",
+ "Demo",
+ AD_ENTRY1s("queen.1", "f7a1a37ac93bf763b1569231237cb4d8", 563335),
+ Common::EN_ANY,
+ Common::kPlatformAmiga,
+ ADGF_DEMO,
+ GUIO1(GUIO_NOSPEECH)
+ },
+ },
+
+ // Amiga Interview Demo - English
+ {
+ {
+ "queen",
+ "Interview",
+ AD_ENTRY1s("queen.1", "f5d42a18d8f5689480413871410663d7", 597032),
+ Common::EN_ANY,
+ Common::kPlatformAmiga,
+ ADGF_DEMO,
+ GUIO1(GUIO_NOSPEECH)
+ },
+ },
+
+ // DOS Demo - English
+ {
+ {
+ "queen",
+ "Demo",
+ AD_ENTRY1s("queen.1", "f39334d8133840aa3bcbd733c12937cf", 3732177),
+ Common::EN_ANY,
+ Common::kPlatformDOS,
+ ADGF_DEMO,
+ GUIO1(GUIO_NOSPEECH)
+ },
+ },
+
+ // DOS Interview Demo - English
+ {
+ {
+ "queen",
+ "Interview",
+ AD_ENTRY1s("queen.1", "30b3291f37665bf24d9482b183cb2f67", 1915913),
+ Common::EN_ANY,
+ Common::kPlatformDOS,
+ ADGF_DEMO,
+ GUIO1(GUIO_NOSPEECH)
+ },
+ },
+
+ // PCGAMES DOS Demo - English
+ {
+ {
+ "queen",
+ "Demo",
+ AD_ENTRY1s("queen.1", "f39334d8133840aa3bcbd733c12937cf", 3724538),
+ Common::EN_ANY,
+ Common::kPlatformDOS,
+ ADGF_DEMO,
+ GUIO1(GUIO_NOSPEECH)
+ },
+ },
+
+#if 0
+ // Amiga Floppy - English
+ {
+ {
+ "queen",
+ "Floppy",
+ AD_ENTRY1s("queen.1", NULL, 351775), // TODO: Fill in correct MD5
+ Common::EN_ANY,
+ Common::kPlatformAmiga,
+ ADGF_NO_FLAGS,
+ GUIO1(GUIO_NOSPEECH)
+ },
+ },
+#endif
+
+ // DOS Floppy - English
+ {
+ {
+ "queen",
+ "Floppy",
+ AD_ENTRY1s("queen.1", "f5e827645d3c887be3bdf4729d847756", 22677657),
+ Common::EN_ANY,
+ Common::kPlatformDOS,
+ ADGF_NO_FLAGS,
+ GUIO1(GUIO_NOSPEECH)
+ },
+ },
+
+ // DOS CD - English
+ {
+ {
+ "queen",
+ "Talkie",
+ AD_ENTRY1s("queen.1", "b6302bccf70463de3d5faf0f0628f742", 190787021),
+ Common::EN_ANY,
+ Common::kPlatformDOS,
+ ADGF_NO_FLAGS,
+ GUIO1(GAMEOPTION_ALT_INTRO)
+ },
+ },
+
+ // DOS Floppy - French
+ {
+ {
+ "queen",
+ "Floppy",
+ AD_ENTRY1s("queen.1", "f5e827645d3c887be3bdf4729d847756", 22157304),
+ Common::FR_FRA,
+ Common::kPlatformDOS,
+ ADGF_NO_FLAGS,
+ GUIO1(GUIO_NOSPEECH)
+ },
+ },
+
+ // DOS CD - French
+ {
+ {
+ "queen",
+ "Talkie",
+ AD_ENTRY1s("queen.1", "6fd5486a0db75bae2e023b575c3d6a5d", 186689095),
+ Common::FR_FRA,
+ Common::kPlatformDOS,
+ ADGF_NO_FLAGS,
+ GUIO1(GAMEOPTION_ALT_INTRO)
+ },
+ },
+
+#if 0
+ // DOS Floppy - German
+ {
+ {
+ "queen",
+ "Floppy",
+ AD_ENTRY1s("queen.1", NULL, 22240013), // TODO: Fill in correct MD5
+ Common::DE_DEU,
+ Common::kPlatformDOS,
+ ADGF_NO_FLAGS,
+ GUIO1(GUIO_NOSPEECH)
+ },
+ },
+#endif
+
+#if 0
+ // DOS CD - German
+ {
+ {
+ "queen",
+ "Talkie",
+ AD_ENTRY1s("queen.1", NULL, 217648975), // TODO: Fill in correct MD5
+ Common::DE_DEU,
+ Common::kPlatformDOS,
+ ADGF_NO_FLAGS,
+ GUIO1(GAMEOPTION_ALT_INTRO)
+ },
+ },
+#endif
+
+#if 0
+ // DOS CD - Hebrew
+ {
+ {
+ "queen",
+ "Talkie",
+ AD_ENTRY1s("queen.1", NULL, 190705558), // TODO: Fill in correct MD5
+ Common::HE_ISR,
+ Common::kPlatformDOS,
+ ADGF_NO_FLAGS,
+ GUIO1(GAMEOPTION_ALT_INTRO)
+ },
+ },
+#endif
+
+#if 0
+ // DOS Floppy - Italian
+ {
+ {
+ "queen",
+ "Floppy",
+ AD_ENTRY1s("queen.1", NULL, 22461366), // TODO: Fill in correct MD5
+ Common::IT_ITA,
+ Common::kPlatformDOS,
+ ADGF_NO_FLAGS,
+ GUIO1(GUIO_NOSPEECH)
+ },
+ },
+#endif
+
+ // DOS CD - Italian
+ {
+ {
+ "queen",
+ "Talkie",
+ AD_ENTRY1s("queen.1", "b6302bccf70463de3d5faf0f0628f742", 190795582),
+ Common::IT_ITA,
+ Common::kPlatformDOS,
+ ADGF_NO_FLAGS,
+ GUIO1(GAMEOPTION_ALT_INTRO)
+ },
+ },
+
+#if 0
+ // DOS CD - Spanish
+ {
+ {
+ "queen",
+ "Talkie",
+ AD_ENTRY1s("queen.1", NULL, 190730602), // TODO: Fill in correct MD5
+ Common::ES_ESP,
+ Common::kPlatformDOS,
+ ADGF_NO_FLAGS,
+ GUIO1(GAMEOPTION_ALT_INTRO)
+ },
+ },
+#endif
+
+ // DOS CD - English (Compressed Freeware Release v1.0)
+ {
+ {
+ "queen",
+ "Talkie",
+ AD_ENTRY1s("queen.1c", "a0749bb8b72e537ead1a63a3dde1443d", 54108887),
+ Common::EN_ANY,
+ Common::kPlatformDOS,
+ ADGF_NO_FLAGS,
+ GUIO1(GAMEOPTION_ALT_INTRO)
+ },
+ },
+
+ // DOS CD - English (Compressed Freeware Release v1.1)
+ {
+ {
+ "queen",
+ "Talkie",
+ AD_ENTRY1s("queen.1c", "21fd690b372f8a6289f6f33bc986276c", 51222412),
+ Common::EN_ANY,
+ Common::kPlatformDOS,
+ ADGF_NO_FLAGS,
+ GUIO1(GAMEOPTION_ALT_INTRO)
+ },
+ },
+
+ // DOS CD - French (Compressed Freeware Release v1.0)
+ {
+ {
+ "queen",
+ "Talkie",
+ AD_ENTRY1s("queen.1c", "67e3020f8a35e1df7b1c753b5aaa71e1", 97382620),
+ Common::FR_FRA,
+ Common::kPlatformDOS,
+ ADGF_NO_FLAGS,
+ GUIO1(GAMEOPTION_ALT_INTRO)
+ },
+ },
+
+ // DOS CD - German (Compressed Freeware Release v1.0)
+ {
+ {
+ "queen",
+ "Talkie",
+ AD_ENTRY1s("queen.1c", "28f78dbec7e20f603a10c2f8ea889a5c", 108738717),
+ Common::DE_DEU,
+ Common::kPlatformDOS,
+ ADGF_NO_FLAGS,
+ GUIO1(GAMEOPTION_ALT_INTRO)
+ },
+ },
+
+ // DOS CD - Hebrew (Compressed Freeware Release v1.0)
+ {
+ {
+ "queen",
+ "Talkie",
+ AD_ENTRY1s("queen.1c", "4d52d8780613ef27a2b779caecb20a21", 99391805),
+ Common::HE_ISR,
+ Common::kPlatformDOS,
+ ADGF_NO_FLAGS,
+ GUIO1(GAMEOPTION_ALT_INTRO)
+ },
+ },
+
+ // DOS CD - Italian (Compressed Freeware Release v1.0)
+ {
+ {
+ "queen",
+ "Talkie",
+ AD_ENTRY1s("queen.1c", "2f72b715ed753cf905a37cdcc7ea611e", 98327801),
+ Common::IT_ITA,
+ Common::kPlatformDOS,
+ ADGF_NO_FLAGS,
+ GUIO1(GAMEOPTION_ALT_INTRO)
+ },
+ },
+
+ // TODO: Freeware Release for Spanish DOS CD is missing.
+#if 0
+ // DOS CD - Spanish (Compressed Freeware Release v1.0)
+ {
+ {
+ "queen",
+ "Talkie",
+ AD_ENTRY1s("queen.1c", NULL, ?),
+ Common::ES_ESP,
+ Common::kPlatformDOS,
+ ADGF_NO_FLAGS,
+ GUIO1(GAMEOPTION_ALT_INTRO)
+ },
+ },
+#endif
+
+ { AD_TABLE_END_MARKER }
+};
+
+} // End of namespace Queen
+
+class QueenMetaEngine : public AdvancedMetaEngine {
+public:
+ QueenMetaEngine() : AdvancedMetaEngine(Queen::gameDescriptions, sizeof(Queen::QueenGameDescription), queenGames, optionsList) {
+ _singleid = "queen";
+ }
+
+ virtual const char *getName() const {
+ return "Queen";
+ }
+
+ virtual const char *getOriginalCopyright() const {
+ return "Flight of the Amazon Queen (C) John Passfield and Steve Stamatiadis";
+ }
+
+ virtual bool hasFeature(MetaEngineFeature f) const;
+ virtual bool createInstance(OSystem *syst, Engine **engine, const ADGameDescription *desc) const;
+ virtual SaveStateList listSaves(const char *target) const;
+ virtual int getMaximumSaveSlot() const { return 99; }
+ virtual void removeSaveState(const char *target, int slot) const;
+
+ const ADGameDescription *fallbackDetect(const FileMap &allFiles, const Common::FSList &fslist) const;
+};
+
+bool QueenMetaEngine::hasFeature(MetaEngineFeature f) const {
+ return
+ (f == kSupportsListSaves) ||
+ (f == kSupportsLoadingDuringStartup) ||
+ (f == kSupportsDeleteSave);
+}
+
+const ADGameDescription *QueenMetaEngine::fallbackDetect(const FileMap &allFiles, const Common::FSList &fslist) const {
+ static ADGameDescription desc;
+
+ // Iterate over all files in the given directory
+ for (Common::FSList::const_iterator file = fslist.begin(); file != fslist.end(); ++file) {
+ if (file->isDirectory()) {
+ continue;
+ }
+ if (file->getName().equalsIgnoreCase("queen.1") || file->getName().equalsIgnoreCase("queen.1c")) {
+ Common::File dataFile;
+ if (!dataFile.open(*file)) {
+ continue;
+ }
+ Queen::DetectedGameVersion version;
+ if (Queen::Resource::detectVersion(&version, &dataFile)) {
+ desc.gameid = "queen";
+ desc.language = version.language;
+ desc.platform = version.platform;
+ desc.flags = ADGF_NO_FLAGS;
+ desc.guioptions = GUIO0();
+ if (version.features & Queen::GF_DEMO) {
+ desc.extra = "Demo";
+ desc.flags = ADGF_DEMO;
+ desc.guioptions = GUIO_NOSPEECH;
+ } else if (version.features & Queen::GF_INTERVIEW) {
+ desc.extra = "Interview";
+ desc.flags = ADGF_DEMO;
+ desc.guioptions = GUIO_NOSPEECH;
+ } else if (version.features & Queen::GF_FLOPPY) {
+ desc.extra = "Floppy";
+ desc.guioptions = GUIO_NOSPEECH;
+ } else if (version.features & Queen::GF_TALKIE) {
+ desc.extra = "Talkie";
+ desc.guioptions = GAMEOPTION_ALT_INTRO;
+ }
+ return (const ADGameDescription *)&desc;
+ }
+ }
+ }
+ return 0;
+}
+
+SaveStateList QueenMetaEngine::listSaves(const char *target) const {
+ Common::SaveFileManager *saveFileMan = g_system->getSavefileManager();
+ Common::StringArray filenames;
+ char saveDesc[32];
+ Common::String pattern("queen.s??");
+
+ filenames = saveFileMan->listSavefiles(pattern);
+ sort(filenames.begin(), filenames.end()); // Sort (hopefully ensuring we are sorted numerically..)
+
+ SaveStateList saveList;
+ for (Common::StringArray::const_iterator file = filenames.begin(); file != filenames.end(); ++file) {
+ // Obtain the last 2 digits of the filename, since they correspond to the save slot
+ int slotNum = atoi(file->c_str() + file->size() - 2);
+
+ if (slotNum >= 0 && slotNum <= 99) {
+ Common::InSaveFile *in = saveFileMan->openForLoading(*file);
+ if (in) {
+ for (int i = 0; i < 4; i++)
+ in->readUint32BE();
+ in->read(saveDesc, 32);
+ saveList.push_back(SaveStateDescriptor(slotNum, saveDesc));
+ delete in;
+ }
+ }
+ }
+
+ return saveList;
+}
+
+void QueenMetaEngine::removeSaveState(const char *target, int slot) const {
+ Common::String filename = Common::String::format("queen.s%02d", slot);
+
+ g_system->getSavefileManager()->removeSavefile(filename);
+}
+
+bool QueenMetaEngine::createInstance(OSystem *syst, Engine **engine, const ADGameDescription *desc) const {
+ const Queen::QueenGameDescription *gd = (const Queen::QueenGameDescription *)desc;
+
+ if (gd)
+ *engine = new Queen::QueenEngine(syst); //FIXME , gd);
+
+ return (gd != 0);
+}
+
+#if PLUGIN_ENABLED_DYNAMIC(QUEEN)
+ REGISTER_PLUGIN_DYNAMIC(QUEEN, PLUGIN_TYPE_ENGINE, QueenMetaEngine);
+#else
+ REGISTER_PLUGIN_STATIC(QUEEN, PLUGIN_TYPE_ENGINE, QueenMetaEngine);
+#endif
diff --git a/engines/queen/display.cpp b/engines/queen/display.cpp
index 7437bab974..b2213f7fee 100644
--- a/engines/queen/display.cpp
+++ b/engines/queen/display.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -29,8 +29,9 @@
#include "graphics/cursorman.h"
#include "graphics/palette.h"
#include "graphics/surface.h"
-#include "graphics/decoders/iff.h"
-#include "graphics/decoders/pcx.h"
+
+#include "image/iff.h"
+#include "image/pcx.h"
#include "queen/display.h"
#include "queen/input.h"
@@ -813,7 +814,7 @@ void Display::fill(uint8 *dstBuf, uint16 dstPitch, uint16 x, uint16 y, uint16 w,
void Display::decodePCX(const uint8 *src, uint32 srcSize, uint8 *dst, uint16 dstPitch, uint16 *w, uint16 *h, uint8 *pal, uint16 palStart, uint16 palEnd) {
Common::MemoryReadStream str(src, srcSize);
- ::Graphics::PCXDecoder pcx;
+ Image::PCXDecoder pcx;
if (!pcx.loadStream(str))
error("Error while reading PCX image");
@@ -832,7 +833,7 @@ void Display::decodePCX(const uint8 *src, uint32 srcSize, uint8 *dst, uint16 dst
void Display::decodeIFF(const uint8 *src, uint32 srcSize, uint8 *dst, uint16 dstPitch, uint16 *w, uint16 *h, uint8 *pal, uint16 palStart, uint16 palEnd, uint8 colorBase) {
Common::MemoryReadStream str(src, srcSize);
- ::Graphics::IFFDecoder iff;
+ Image::IFFDecoder iff;
if (!iff.loadStream(str))
error("Error while reading IFF image");
diff --git a/engines/queen/display.h b/engines/queen/display.h
index 8a8aaef5a6..7261d05b07 100644
--- a/engines/queen/display.h
+++ b/engines/queen/display.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/queen/graphics.cpp b/engines/queen/graphics.cpp
index 70f7d7c94b..87236447e8 100644
--- a/engines/queen/graphics.cpp
+++ b/engines/queen/graphics.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -522,7 +522,7 @@ void Graphics::setBobText(const BobSlot *pbs, const char *text, int textX, int t
// Calc text position
- short x, y, width, height;
+ short x, y, width;
if (flags) {
if (flags == 2)
@@ -540,7 +540,7 @@ void Graphics::setBobText(const BobSlot *pbs, const char *text, int textX, int t
BobFrame *pbf = _vm->bankMan()->fetchFrame(pbs->frameNum);
width = (pbf->width * pbs->scale) / 100;
- height = (pbf->height * pbs->scale) / 100;
+ short height = (pbf->height * pbs->scale) / 100;
y = y - height - 16 - lineCount * 9;
}
diff --git a/engines/queen/graphics.h b/engines/queen/graphics.h
index 9c719ba22c..2035b170d3 100644
--- a/engines/queen/graphics.h
+++ b/engines/queen/graphics.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/queen/grid.cpp b/engines/queen/grid.cpp
index 82b98c0150..467f341c0b 100644
--- a/engines/queen/grid.cpp
+++ b/engines/queen/grid.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/queen/grid.h b/engines/queen/grid.h
index f905e3f4fe..2e60c62b59 100644
--- a/engines/queen/grid.h
+++ b/engines/queen/grid.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/queen/input.cpp b/engines/queen/input.cpp
index dd10e7ad46..1cce9ad6d1 100644
--- a/engines/queen/input.cpp
+++ b/engines/queen/input.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/queen/input.h b/engines/queen/input.h
index f04ecb24f7..87f6b20e71 100644
--- a/engines/queen/input.h
+++ b/engines/queen/input.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/queen/journal.cpp b/engines/queen/journal.cpp
index 474f72eca5..db80775fc7 100644
--- a/engines/queen/journal.cpp
+++ b/engines/queen/journal.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/queen/journal.h b/engines/queen/journal.h
index a9b9ccb2b8..57907f0ff1 100644
--- a/engines/queen/journal.h
+++ b/engines/queen/journal.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/queen/logic.cpp b/engines/queen/logic.cpp
index ea13e5973e..d48bb8a498 100644
--- a/engines/queen/logic.cpp
+++ b/engines/queen/logic.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/queen/logic.h b/engines/queen/logic.h
index 608c19e71e..d597942257 100644
--- a/engines/queen/logic.h
+++ b/engines/queen/logic.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/queen/midiadlib.cpp b/engines/queen/midiadlib.cpp
index 83853cba92..25175c21d7 100644
--- a/engines/queen/midiadlib.cpp
+++ b/engines/queen/midiadlib.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/queen/module.mk b/engines/queen/module.mk
index 5e0602cae7..8ba49a301d 100644
--- a/engines/queen/module.mk
+++ b/engines/queen/module.mk
@@ -6,6 +6,7 @@ MODULE_OBJS := \
credits.o \
cutaway.o \
debug.o \
+ detection.o \
display.o \
graphics.o \
grid.o \
diff --git a/engines/queen/music.cpp b/engines/queen/music.cpp
index 2835954003..93d6527622 100644
--- a/engines/queen/music.cpp
+++ b/engines/queen/music.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/queen/music.h b/engines/queen/music.h
index ea6affcbe5..b475639f22 100644
--- a/engines/queen/music.h
+++ b/engines/queen/music.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/queen/musicdata.cpp b/engines/queen/musicdata.cpp
index a046355446..57c28c90f4 100644
--- a/engines/queen/musicdata.cpp
+++ b/engines/queen/musicdata.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/queen/queen.cpp b/engines/queen/queen.cpp
index 08fc594560..0aea6122ca 100644
--- a/engines/queen/queen.cpp
+++ b/engines/queen/queen.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -23,14 +23,12 @@
#include "base/plugins.h"
#include "common/config-manager.h"
+#include "common/events.h"
#include "common/file.h"
#include "common/fs.h"
-#include "common/gui_options.h"
#include "common/savefile.h"
#include "common/system.h"
-#include "common/events.h"
#include "common/textconsole.h"
-#include "common/translation.h"
#include "engines/util.h"
@@ -49,177 +47,6 @@
#include "queen/talk.h"
#include "queen/walk.h"
-#include "engines/metaengine.h"
-
-static const PlainGameDescriptor queenGameDescriptor = {
- "queen", "Flight of the Amazon Queen"
-};
-
-static const ExtraGuiOption queenExtraGuiOption = {
- _s("Alternative intro"),
- _s("Use an alternative game intro (CD version only)"),
- "alt_intro",
- false
-};
-
-class QueenMetaEngine : public MetaEngine {
-public:
- virtual const char *getName() const;
- virtual const char *getOriginalCopyright() const;
-
- virtual bool hasFeature(MetaEngineFeature f) const;
- virtual GameList getSupportedGames() const;
- virtual const ExtraGuiOptions getExtraGuiOptions(const Common::String &target) const;
- virtual GameDescriptor findGame(const char *gameid) const;
- virtual GameList detectGames(const Common::FSList &fslist) const;
- virtual SaveStateList listSaves(const char *target) const;
- virtual int getMaximumSaveSlot() const;
- virtual void removeSaveState(const char *target, int slot) const;
-
- virtual Common::Error createInstance(OSystem *syst, Engine **engine) const;
-};
-
-const char *QueenMetaEngine::getName() const {
- return "Queen";
-}
-
-const char *QueenMetaEngine::getOriginalCopyright() const {
- return "Flight of the Amazon Queen (C) John Passfield and Steve Stamatiadis";
-}
-
-bool QueenMetaEngine::hasFeature(MetaEngineFeature f) const {
- return
- (f == kSupportsListSaves) ||
- (f == kSupportsLoadingDuringStartup) ||
- (f == kSupportsDeleteSave);
-}
-
-bool Queen::QueenEngine::hasFeature(EngineFeature f) const {
- return
- (f == kSupportsRTL) ||
- (f == kSupportsLoadingDuringRuntime) ||
- (f == kSupportsSavingDuringRuntime) ||
- (f == kSupportsSubtitleOptions);
-}
-
-GameList QueenMetaEngine::getSupportedGames() const {
- GameList games;
- games.push_back(queenGameDescriptor);
- return games;
-}
-
-int QueenMetaEngine::getMaximumSaveSlot() const { return 99; }
-
-const ExtraGuiOptions QueenMetaEngine::getExtraGuiOptions(const Common::String &target) const {
- Common::String guiOptions;
- ExtraGuiOptions options;
-
- if (target.empty()) {
- options.push_back(queenExtraGuiOption);
- return options;
- }
-
- if (ConfMan.hasKey("guioptions", target)) {
- guiOptions = ConfMan.get("guioptions", target);
- guiOptions = parseGameGUIOptions(guiOptions);
- }
-
- if (!guiOptions.contains(GUIO_NOSPEECH))
- options.push_back(queenExtraGuiOption);
- return options;
-}
-
-GameDescriptor QueenMetaEngine::findGame(const char *gameid) const {
- if (0 == scumm_stricmp(gameid, queenGameDescriptor.gameid)) {
- return queenGameDescriptor;
- }
- return GameDescriptor();
-}
-
-GameList QueenMetaEngine::detectGames(const Common::FSList &fslist) const {
- GameList detectedGames;
-
- // Iterate over all files in the given directory
- for (Common::FSList::const_iterator file = fslist.begin(); file != fslist.end(); ++file) {
- if (file->isDirectory()) {
- continue;
- }
- if (file->getName().equalsIgnoreCase("queen.1") || file->getName().equalsIgnoreCase("queen.1c")) {
- Common::File dataFile;
- if (!dataFile.open(*file)) {
- continue;
- }
- Queen::DetectedGameVersion version;
- if (Queen::Resource::detectVersion(&version, &dataFile)) {
- GameDescriptor dg(queenGameDescriptor.gameid, queenGameDescriptor.description, version.language, version.platform);
- if (version.features & Queen::GF_DEMO) {
- dg.updateDesc("Demo");
- dg.setGUIOptions(GUIO_NOSPEECH);
- } else if (version.features & Queen::GF_INTERVIEW) {
- dg.updateDesc("Interview");
- dg.setGUIOptions(GUIO_NOSPEECH);
- } else if (version.features & Queen::GF_FLOPPY) {
- dg.updateDesc("Floppy");
- dg.setGUIOptions(GUIO_NOSPEECH);
- } else if (version.features & Queen::GF_TALKIE) {
- dg.updateDesc("Talkie");
- }
- detectedGames.push_back(dg);
- break;
- }
- }
- }
- return detectedGames;
-}
-
-SaveStateList QueenMetaEngine::listSaves(const char *target) const {
- Common::SaveFileManager *saveFileMan = g_system->getSavefileManager();
- Common::StringArray filenames;
- char saveDesc[32];
- Common::String pattern("queen.s??");
-
- filenames = saveFileMan->listSavefiles(pattern);
- sort(filenames.begin(), filenames.end()); // Sort (hopefully ensuring we are sorted numerically..)
-
- SaveStateList saveList;
- for (Common::StringArray::const_iterator file = filenames.begin(); file != filenames.end(); ++file) {
- // Obtain the last 2 digits of the filename, since they correspond to the save slot
- int slotNum = atoi(file->c_str() + file->size() - 2);
-
- if (slotNum >= 0 && slotNum <= 99) {
- Common::InSaveFile *in = saveFileMan->openForLoading(*file);
- if (in) {
- for (int i = 0; i < 4; i++)
- in->readUint32BE();
- in->read(saveDesc, 32);
- saveList.push_back(SaveStateDescriptor(slotNum, saveDesc));
- delete in;
- }
- }
- }
-
- return saveList;
-}
-
-void QueenMetaEngine::removeSaveState(const char *target, int slot) const {
- Common::String filename = target;
- filename += Common::String::format(".s%02d", slot);
-
- g_system->getSavefileManager()->removeSavefile(filename);
-}
-
-Common::Error QueenMetaEngine::createInstance(OSystem *syst, Engine **engine) const {
- assert(engine);
- *engine = new Queen::QueenEngine(syst);
- return Common::kNoError;
-}
-
-#if PLUGIN_ENABLED_DYNAMIC(QUEEN)
- REGISTER_PLUGIN_DYNAMIC(QUEEN, PLUGIN_TYPE_ENGINE, QueenMetaEngine);
-#else
- REGISTER_PLUGIN_STATIC(QUEEN, PLUGIN_TYPE_ENGINE, QueenMetaEngine);
-#endif
-
namespace Queen {
QueenEngine::QueenEngine(OSystem *syst)
@@ -488,6 +315,14 @@ GUI::Debugger *QueenEngine::getDebugger() {
return _debugger;
}
+bool Queen::QueenEngine::hasFeature(EngineFeature f) const {
+ return
+ (f == kSupportsRTL) ||
+ (f == kSupportsLoadingDuringRuntime) ||
+ (f == kSupportsSavingDuringRuntime) ||
+ (f == kSupportsSubtitleOptions);
+}
+
Common::Error QueenEngine::run() {
initGraphics(GAME_SCREEN_WIDTH, GAME_SCREEN_HEIGHT, false);
diff --git a/engines/queen/queen.h b/engines/queen/queen.h
index a8b0e9f6ed..c00e1b3a70 100644
--- a/engines/queen/queen.h
+++ b/engines/queen/queen.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/queen/resource.cpp b/engines/queen/resource.cpp
index 6a55929d65..714b3cef39 100644
--- a/engines/queen/resource.cpp
+++ b/engines/queen/resource.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/queen/resource.h b/engines/queen/resource.h
index 7317ec5134..e090dabbd3 100644
--- a/engines/queen/resource.h
+++ b/engines/queen/resource.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/queen/restables.cpp b/engines/queen/restables.cpp
index bc828164b0..55e13b2135 100644
--- a/engines/queen/restables.cpp
+++ b/engines/queen/restables.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/queen/sound.cpp b/engines/queen/sound.cpp
index 6731a51e04..63e24454c1 100644
--- a/engines/queen/sound.cpp
+++ b/engines/queen/sound.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/queen/sound.h b/engines/queen/sound.h
index 6a5dfc2c28..d06d93b9e1 100644
--- a/engines/queen/sound.h
+++ b/engines/queen/sound.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/queen/state.cpp b/engines/queen/state.cpp
index a07e68045b..09d2ccca47 100644
--- a/engines/queen/state.cpp
+++ b/engines/queen/state.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/queen/state.h b/engines/queen/state.h
index 1a6725c800..786434156b 100644
--- a/engines/queen/state.h
+++ b/engines/queen/state.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/queen/structs.h b/engines/queen/structs.h
index 6dd98fa1f5..4f413d8c6d 100644
--- a/engines/queen/structs.h
+++ b/engines/queen/structs.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/queen/talk.cpp b/engines/queen/talk.cpp
index 1531510ba4..1b9d72babc 100644
--- a/engines/queen/talk.cpp
+++ b/engines/queen/talk.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -1252,7 +1252,6 @@ int16 Talk::selectSentence() {
_vm->input()->clearKeyVerb();
if (sentenceCount > 0) {
- int zone = 0;
int oldZone = 0;
while (0 == selectedSentence) {
@@ -1263,7 +1262,7 @@ int16 Talk::selectSentence() {
_vm->update();
Common::Point mouse = _vm->input()->getMousePos();
- zone = _vm->grid()->findZoneForPos(GS_PANEL, mouse.x, mouse.y);
+ int zone = _vm->grid()->findZoneForPos(GS_PANEL, mouse.x, mouse.y);
int mouseButton = _vm->input()->mouseButton();
_vm->input()->clearMouseButton();
diff --git a/engines/queen/talk.h b/engines/queen/talk.h
index cba77cc255..4dcf5ba52c 100644
--- a/engines/queen/talk.h
+++ b/engines/queen/talk.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/queen/walk.cpp b/engines/queen/walk.cpp
index b5c9b97ce0..dd7e46c765 100644
--- a/engines/queen/walk.cpp
+++ b/engines/queen/walk.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/queen/walk.h b/engines/queen/walk.h
index e5257b7afa..ce72607cbf 100644
--- a/engines/queen/walk.h
+++ b/engines/queen/walk.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/saga/actor.cpp b/engines/saga/actor.cpp
index 0548da9ee5..d8b115f9bd 100644
--- a/engines/saga/actor.cpp
+++ b/engines/saga/actor.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/saga/actor.h b/engines/saga/actor.h
index d9d4b70168..b8a5436d76 100644
--- a/engines/saga/actor.h
+++ b/engines/saga/actor.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/saga/actor_path.cpp b/engines/saga/actor_path.cpp
index d0f1cf2b5b..7cf834ded1 100644
--- a/engines/saga/actor_path.cpp
+++ b/engines/saga/actor_path.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/saga/actor_walk.cpp b/engines/saga/actor_walk.cpp
index ea33a0950d..04741da2cd 100644
--- a/engines/saga/actor_walk.cpp
+++ b/engines/saga/actor_walk.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -1378,7 +1378,7 @@ void Actor::cmdActorWalkTo(int argc, const char **argv) {
location.fromScreenPoint(movePoint);
if (!validActorId(actorId)) {
- _vm->_console->DebugPrintf("Actor::cmActorWalkTo Invalid actorId 0x%X.\n", actorId);
+ _vm->_console->debugPrintf("Actor::cmActorWalkTo Invalid actorId 0x%X.\n", actorId);
return;
}
diff --git a/engines/saga/animation.cpp b/engines/saga/animation.cpp
index df8283b4c2..25119c6407 100644
--- a/engines/saga/animation.cpp
+++ b/engines/saga/animation.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -914,14 +914,14 @@ void Anim::animInfo() {
animCount = getAnimationCount();
- _vm->_console->DebugPrintf("There are %d animations loaded:\n", animCount);
+ _vm->_console->debugPrintf("There are %d animations loaded:\n", animCount);
for (i = 0; i < MAX_ANIMATIONS; i++) {
if (_animations[i] == NULL) {
continue;
}
- _vm->_console->DebugPrintf("%02d: Frames: %u Flags: %u\n", i, _animations[i]->maxFrame, _animations[i]->flags);
+ _vm->_console->debugPrintf("%02d: Frames: %u Flags: %u\n", i, _animations[i]->maxFrame, _animations[i]->flags);
}
}
@@ -929,10 +929,10 @@ void Anim::animInfo() {
void Anim::cutawayInfo() {
uint16 i;
- _vm->_console->DebugPrintf("There are %d cutaways loaded:\n", _cutawayList.size());
+ _vm->_console->debugPrintf("There are %d cutaways loaded:\n", _cutawayList.size());
for (i = 0; i < _cutawayList.size(); i++) {
- _vm->_console->DebugPrintf("%02d: Bg res: %u Anim res: %u Cycles: %u Framerate: %u\n", i,
+ _vm->_console->debugPrintf("%02d: Bg res: %u Anim res: %u Cycles: %u Framerate: %u\n", i,
_cutawayList[i].backgroundResourceId, _cutawayList[i].animResourceId,
_cutawayList[i].cycles, _cutawayList[i].frameRate);
}
diff --git a/engines/saga/animation.h b/engines/saga/animation.h
index 2c42cb7253..dbb3117ba2 100644
--- a/engines/saga/animation.h
+++ b/engines/saga/animation.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/saga/configure.engine b/engines/saga/configure.engine
new file mode 100644
index 0000000000..99e2ab367b
--- /dev/null
+++ b/engines/saga/configure.engine
@@ -0,0 +1,5 @@
+# This file is included from the main "configure" script
+# add_engine [name] [desc] [build-by-default] [subengines] [base games] [deps]
+add_engine saga "SAGA" yes "ihnm saga2" "ITE"
+add_engine ihnm "IHNM" yes
+add_engine saga2 "SAGA 2 games" no
diff --git a/engines/saga/console.cpp b/engines/saga/console.cpp
index 771925a321..0b801eef3e 100644
--- a/engines/saga/console.cpp
+++ b/engines/saga/console.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -35,15 +35,15 @@ namespace Saga {
Console::Console(SagaEngine *vm) : GUI::Debugger() {
_vm = vm;
- DCmd_Register("continue", WRAP_METHOD(Console, Cmd_Exit));
+ registerCmd("continue", WRAP_METHOD(Console, cmdExit));
// Actor commands
- DCmd_Register("actor_walk_to", WRAP_METHOD(Console, cmdActorWalkTo));
+ registerCmd("actor_walk_to", WRAP_METHOD(Console, cmdActorWalkTo));
// Animation commands
- DCmd_Register("anim_info", WRAP_METHOD(Console, cmdAnimInfo));
- DCmd_Register("cutaway_info", WRAP_METHOD(Console, cmdCutawayInfo));
- DCmd_Register("play_cutaway", WRAP_METHOD(Console, cmdPlayCutaway));
+ registerCmd("anim_info", WRAP_METHOD(Console, cmdAnimInfo));
+ registerCmd("cutaway_info", WRAP_METHOD(Console, cmdCutawayInfo));
+ registerCmd("play_cutaway", WRAP_METHOD(Console, cmdPlayCutaway));
// Game stuff
@@ -60,28 +60,28 @@ Console::Console(SagaEngine *vm) : GUI::Debugger() {
#endif
// Scene commands
- DCmd_Register("current_scene", WRAP_METHOD(Console, cmdCurrentScene));
- DCmd_Register("current_chapter", WRAP_METHOD(Console, cmdCurrentChapter));
- DCmd_Register("scene_change", WRAP_METHOD(Console, cmdSceneChange));
- DCmd_Register("chapter_change", WRAP_METHOD(Console, cmdChapterChange));
+ registerCmd("current_scene", WRAP_METHOD(Console, cmdCurrentScene));
+ registerCmd("current_chapter", WRAP_METHOD(Console, cmdCurrentChapter));
+ registerCmd("scene_change", WRAP_METHOD(Console, cmdSceneChange));
+ registerCmd("chapter_change", WRAP_METHOD(Console, cmdChapterChange));
- DCmd_Register("action_map_info", WRAP_METHOD(Console, cmdActionMapInfo));
- DCmd_Register("object_map_info", WRAP_METHOD(Console, cmdObjectMapInfo));
+ registerCmd("action_map_info", WRAP_METHOD(Console, cmdActionMapInfo));
+ registerCmd("object_map_info", WRAP_METHOD(Console, cmdObjectMapInfo));
// Script commands
- DCmd_Register("wake_up_threads", WRAP_METHOD(Console, cmdWakeUpThreads));
+ registerCmd("wake_up_threads", WRAP_METHOD(Console, cmdWakeUpThreads));
// Panel commands
- DCmd_Register("current_panel_mode", WRAP_METHOD(Console, cmdCurrentPanelMode));
- DCmd_Register("set_panel_mode", WRAP_METHOD(Console, cmdSetPanelMode));
+ registerCmd("current_panel_mode", WRAP_METHOD(Console, cmdCurrentPanelMode));
+ registerCmd("set_panel_mode", WRAP_METHOD(Console, cmdSetPanelMode));
// Font commands
- DCmd_Register("set_font_mapping", WRAP_METHOD(Console, cmdSetFontMapping));
+ registerCmd("set_font_mapping", WRAP_METHOD(Console, cmdSetFontMapping));
// Global flags commands
- DCmd_Register("global_flags_info", WRAP_METHOD(Console, cmdGlobalFlagsInfo));
- DCmd_Register("set_global_flag", WRAP_METHOD(Console, cmdSetGlobalFlag));
- DCmd_Register("clear_global_flag", WRAP_METHOD(Console, cmdClearGlobalFlag));
+ registerCmd("global_flags_info", WRAP_METHOD(Console, cmdGlobalFlagsInfo));
+ registerCmd("set_global_flag", WRAP_METHOD(Console, cmdSetGlobalFlag));
+ registerCmd("clear_global_flag", WRAP_METHOD(Console, cmdClearGlobalFlag));
}
Console::~Console() {
@@ -89,7 +89,7 @@ Console::~Console() {
bool Console::cmdActorWalkTo(int argc, const char **argv) {
if (argc != 4)
- DebugPrintf("Usage: %s <Actor id> <lx> <ly>\n", argv[0]);
+ debugPrintf("Usage: %s <Actor id> <lx> <ly>\n", argv[0]);
else
_vm->_actor->cmdActorWalkTo(argc, argv);
return true;
@@ -110,7 +110,7 @@ bool Console::cmdCutawayInfo(int argc, const char **argv) {
bool Console::cmdPlayCutaway(int argc, const char **argv) {
#ifdef ENABLE_IHNM
if (argc != 2)
- DebugPrintf("Usage: %s <Cutaway number>\n", argv[0]);
+ debugPrintf("Usage: %s <Cutaway number>\n", argv[0]);
else
_vm->_anim->playCutaway(atoi(argv[1]), false);
#endif
@@ -118,19 +118,19 @@ bool Console::cmdPlayCutaway(int argc, const char **argv) {
}
bool Console::cmdCurrentScene(int argc, const char **argv) {
- DebugPrintf("Current Scene is: %i, scene resource id: %i\n",
+ debugPrintf("Current Scene is: %i, scene resource id: %i\n",
_vm->_scene->currentSceneNumber(), _vm->_scene->currentSceneResourceId());
return true;
}
bool Console::cmdCurrentChapter(int argc, const char **argv) {
- DebugPrintf("Current Chapter is: %i\n", _vm->_scene->currentChapterNumber());
+ debugPrintf("Current Chapter is: %i\n", _vm->_scene->currentChapterNumber());
return true;
}
bool Console::cmdSceneChange(int argc, const char **argv) {
if (argc != 2)
- DebugPrintf("Usage: %s <Scene number>\n", argv[0]);
+ debugPrintf("Usage: %s <Scene number>\n", argv[0]);
else
_vm->_scene->cmdSceneChange(argc, argv);
return true;
@@ -138,7 +138,7 @@ bool Console::cmdSceneChange(int argc, const char **argv) {
bool Console::cmdChapterChange(int argc, const char **argv) {
if (argc != 3)
- DebugPrintf("Usage: %s <Chapter number> <Scene number>\n", argv[0]);
+ debugPrintf("Usage: %s <Chapter number> <Scene number>\n", argv[0]);
else {
_vm->_scene->setChapterNumber(atoi(argv[2]));
_vm->_scene->cmdSceneChange(argc, argv);
@@ -158,9 +158,9 @@ bool Console::cmdObjectMapInfo(int argc, const char **argv) {
bool Console::cmdWakeUpThreads(int argc, const char **argv) {
if (argc != 2) {
- DebugPrintf("Usage: %s <wait type>\n", argv[0]);
- DebugPrintf("e.g.: 1 for kWaitTypeDelay, 2 for kWaitTypeSpeech, 10 for kWaitTypeWaitFrames");
- DebugPrintf("Refer to saga/script.h for additional types");
+ debugPrintf("Usage: %s <wait type>\n", argv[0]);
+ debugPrintf("e.g.: 1 for kWaitTypeDelay, 2 for kWaitTypeSpeech, 10 for kWaitTypeWaitFrames");
+ debugPrintf("Refer to saga/script.h for additional types");
} else {
_vm->_script->wakeUpThreads(atoi(argv[1]));
}
@@ -168,13 +168,13 @@ bool Console::cmdWakeUpThreads(int argc, const char **argv) {
}
bool Console::cmdCurrentPanelMode(int argc, const char **argv) {
- DebugPrintf("Current Panel Mode is: %i\n", _vm->_interface->getMode());
+ debugPrintf("Current Panel Mode is: %i\n", _vm->_interface->getMode());
return true;
}
bool Console::cmdSetPanelMode(int argc, const char **argv) {
if (argc != 2)
- DebugPrintf("Usage: %s <Panel mode number>\n", argv[0]);
+ debugPrintf("Usage: %s <Panel mode number>\n", argv[0]);
else
_vm->_interface->setMode(atoi(argv[1]));
return true;
@@ -182,8 +182,8 @@ bool Console::cmdSetPanelMode(int argc, const char **argv) {
bool Console::cmdSetFontMapping(int argc, const char **argv) {
if (argc != 2) {
- DebugPrintf("Sets font mapping\nUsage: %s <Font mapping flag>\n", argv[0]);
- DebugPrintf("Mapping flags:\n0 - default game behavior\n1 - force font mapping\n2 - ignore font mapping\n");
+ debugPrintf("Sets font mapping\nUsage: %s <Font mapping flag>\n", argv[0]);
+ debugPrintf("Mapping flags:\n0 - default game behavior\n1 - force font mapping\n2 - ignore font mapping\n");
} else {
_vm->_font->setFontMapping(atoi(argv[1]));
}
@@ -191,7 +191,7 @@ bool Console::cmdSetFontMapping(int argc, const char **argv) {
}
bool Console::cmdGlobalFlagsInfo(int argc, const char **argv) {
- DebugPrintf("Global flags status for IHNM:\n");
+ debugPrintf("Global flags status for IHNM:\n");
// Global flags in IHNM:
// 00: Tested when Gorrister's chapter ends. 0: Gorrister failed, 1: Gorrister won
@@ -232,9 +232,9 @@ bool Console::cmdGlobalFlagsInfo(int argc, const char **argv) {
for (i = 0; i < 32; i += 8) {
for (k = i; k < i + 8; k ++) {
flagStatus = _vm->_globalFlags & (1 << k) ? 1 : 0;
- _vm->_console->DebugPrintf("%02d: %u |", k, flagStatus);
+ _vm->_console->debugPrintf("%02d: %u |", k, flagStatus);
}
- _vm->_console->DebugPrintf("\n");
+ _vm->_console->debugPrintf("\n");
}
return true;
@@ -242,13 +242,13 @@ bool Console::cmdGlobalFlagsInfo(int argc, const char **argv) {
bool Console::cmdSetGlobalFlag(int argc, const char **argv) {
if (argc != 2) {
- DebugPrintf("Usage: %s <Global flag number>\nValid flag numbers are 0 - 31\n", argv[0]);
+ debugPrintf("Usage: %s <Global flag number>\nValid flag numbers are 0 - 31\n", argv[0]);
} else {
int flagNumber = atoi(argv[1]);
if (flagNumber >= 0 && flagNumber <= 31) {
_vm->_globalFlags |= (1 << flagNumber);
} else {
- DebugPrintf("Valid flag numbers are 0 - 31\n");
+ debugPrintf("Valid flag numbers are 0 - 31\n");
}
}
return true;
@@ -256,13 +256,13 @@ bool Console::cmdSetGlobalFlag(int argc, const char **argv) {
bool Console::cmdClearGlobalFlag(int argc, const char **argv) {
if (argc != 2) {
- DebugPrintf("Usage: %s <Global flag number>\nValid flag numbers are 0 - 31\n", argv[0]);
+ debugPrintf("Usage: %s <Global flag number>\nValid flag numbers are 0 - 31\n", argv[0]);
} else {
int flagNumber = atoi(argv[1]);
if (flagNumber >= 0 && flagNumber <= 31) {
_vm->_globalFlags &= ~(1 << flagNumber);
} else {
- DebugPrintf("Valid flag numbers are 0 - 31\n");
+ debugPrintf("Valid flag numbers are 0 - 31\n");
}
}
return true;
diff --git a/engines/saga/console.h b/engines/saga/console.h
index b93638467b..625e6f57ad 100644
--- a/engines/saga/console.h
+++ b/engines/saga/console.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/saga/detection.cpp b/engines/saga/detection.cpp
index f6872c41ad..8487811398 100644
--- a/engines/saga/detection.cpp
+++ b/engines/saga/detection.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/saga/detection_tables.h b/engines/saga/detection_tables.h
index 30cb13a031..72187a1a13 100644
--- a/engines/saga/detection_tables.h
+++ b/engines/saga/detection_tables.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/saga/displayinfo.h b/engines/saga/displayinfo.h
index 70c36bafd5..a0cdf5733b 100644
--- a/engines/saga/displayinfo.h
+++ b/engines/saga/displayinfo.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/saga/events.cpp b/engines/saga/events.cpp
index c5842f4998..013b019c9f 100644
--- a/engines/saga/events.cpp
+++ b/engines/saga/events.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/saga/events.h b/engines/saga/events.h
index 581abe17b0..6c423abb8c 100644
--- a/engines/saga/events.h
+++ b/engines/saga/events.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/saga/font.cpp b/engines/saga/font.cpp
index 8c3f4d7c42..73d42598cb 100644
--- a/engines/saga/font.cpp
+++ b/engines/saga/font.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/saga/font.h b/engines/saga/font.h
index a45299ad48..e46468e816 100644
--- a/engines/saga/font.h
+++ b/engines/saga/font.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/saga/font_map.cpp b/engines/saga/font_map.cpp
index 936c8e779c..145956f25f 100644
--- a/engines/saga/font_map.cpp
+++ b/engines/saga/font_map.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/saga/gfx.cpp b/engines/saga/gfx.cpp
index 62250a0820..ceb86ebb18 100644
--- a/engines/saga/gfx.cpp
+++ b/engines/saga/gfx.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/saga/gfx.h b/engines/saga/gfx.h
index c68160e907..ef2c2bde43 100644
--- a/engines/saga/gfx.h
+++ b/engines/saga/gfx.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/saga/image.cpp b/engines/saga/image.cpp
index 3434d46b42..31a38623f8 100644
--- a/engines/saga/image.cpp
+++ b/engines/saga/image.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/saga/input.cpp b/engines/saga/input.cpp
index 8576a3e536..cf30c5fc38 100644
--- a/engines/saga/input.cpp
+++ b/engines/saga/input.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/saga/interface.cpp b/engines/saga/interface.cpp
index b105e34487..680b2274f5 100644
--- a/engines/saga/interface.cpp
+++ b/engines/saga/interface.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/saga/interface.h b/engines/saga/interface.h
index 84533705fe..340a0e9180 100644
--- a/engines/saga/interface.h
+++ b/engines/saga/interface.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/saga/introproc_ihnm.cpp b/engines/saga/introproc_ihnm.cpp
index 7922d56425..fc28d2372f 100644
--- a/engines/saga/introproc_ihnm.cpp
+++ b/engines/saga/introproc_ihnm.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/saga/introproc_ite.cpp b/engines/saga/introproc_ite.cpp
index ed53e078a0..91b1d3db95 100644
--- a/engines/saga/introproc_ite.cpp
+++ b/engines/saga/introproc_ite.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/saga/introproc_saga2.cpp b/engines/saga/introproc_saga2.cpp
index e61dfbf161..710236b0c4 100644
--- a/engines/saga/introproc_saga2.cpp
+++ b/engines/saga/introproc_saga2.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/saga/isomap.cpp b/engines/saga/isomap.cpp
index 945b4ad5a7..77680178c1 100644
--- a/engines/saga/isomap.cpp
+++ b/engines/saga/isomap.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/saga/isomap.h b/engines/saga/isomap.h
index b35f79b1af..155d9b8d24 100644
--- a/engines/saga/isomap.h
+++ b/engines/saga/isomap.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/saga/itedata.cpp b/engines/saga/itedata.cpp
index 44aa48ccee..87b71c2cb7 100644
--- a/engines/saga/itedata.cpp
+++ b/engines/saga/itedata.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/saga/itedata.h b/engines/saga/itedata.h
index 73f0a2aa21..d27b84781f 100644
--- a/engines/saga/itedata.h
+++ b/engines/saga/itedata.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/saga/music.cpp b/engines/saga/music.cpp
index 3ac89bc2c2..e444900967 100644
--- a/engines/saga/music.cpp
+++ b/engines/saga/music.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/saga/music.h b/engines/saga/music.h
index 081fab21f6..ba44c3ca71 100644
--- a/engines/saga/music.h
+++ b/engines/saga/music.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/saga/objectmap.cpp b/engines/saga/objectmap.cpp
index b300a247e9..ad5167209c 100644
--- a/engines/saga/objectmap.cpp
+++ b/engines/saga/objectmap.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -231,7 +231,7 @@ int ObjectMap::hitTest(const Point& testPoint) {
}
void ObjectMap::cmdInfo() {
- _vm->_console->DebugPrintf("%d zone(s) loaded.\n\n", _hitZoneList.size());
+ _vm->_console->debugPrintf("%d zone(s) loaded.\n\n", _hitZoneList.size());
}
} // End of namespace Saga
diff --git a/engines/saga/objectmap.h b/engines/saga/objectmap.h
index 3f71c8f95d..7f00fc390a 100644
--- a/engines/saga/objectmap.h
+++ b/engines/saga/objectmap.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/saga/palanim.cpp b/engines/saga/palanim.cpp
index 021a4c9bac..b5178a3d75 100644
--- a/engines/saga/palanim.cpp
+++ b/engines/saga/palanim.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/saga/palanim.h b/engines/saga/palanim.h
index 920cbec65a..a6ec4674cf 100644
--- a/engines/saga/palanim.h
+++ b/engines/saga/palanim.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/saga/puzzle.cpp b/engines/saga/puzzle.cpp
index 63d9a88fee..705834f1b7 100644
--- a/engines/saga/puzzle.cpp
+++ b/engines/saga/puzzle.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/saga/puzzle.h b/engines/saga/puzzle.h
index 0f9bd8aeff..2a6a8cf4ed 100644
--- a/engines/saga/puzzle.h
+++ b/engines/saga/puzzle.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/saga/render.cpp b/engines/saga/render.cpp
index a9ef23381e..1f23a388d0 100644
--- a/engines/saga/render.cpp
+++ b/engines/saga/render.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/saga/render.h b/engines/saga/render.h
index 5694bacb35..4aaaf61eb4 100644
--- a/engines/saga/render.h
+++ b/engines/saga/render.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/saga/resource.cpp b/engines/saga/resource.cpp
index 8025a949d4..cdf674dc66 100644
--- a/engines/saga/resource.cpp
+++ b/engines/saga/resource.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/saga/resource.h b/engines/saga/resource.h
index a8e2e92361..252e92c967 100644
--- a/engines/saga/resource.h
+++ b/engines/saga/resource.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/saga/resource_hrs.cpp b/engines/saga/resource_hrs.cpp
index ac16e21c12..09da9cf0bb 100644
--- a/engines/saga/resource_hrs.cpp
+++ b/engines/saga/resource_hrs.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/saga/resource_res.cpp b/engines/saga/resource_res.cpp
index 4fec9da662..d57238b2eb 100644
--- a/engines/saga/resource_res.cpp
+++ b/engines/saga/resource_res.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/saga/resource_rsc.cpp b/engines/saga/resource_rsc.cpp
index bc66e9e30a..aaec90e655 100644
--- a/engines/saga/resource_rsc.cpp
+++ b/engines/saga/resource_rsc.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/saga/saga.cpp b/engines/saga/saga.cpp
index 239a3be9db..b15d161ba3 100644
--- a/engines/saga/saga.cpp
+++ b/engines/saga/saga.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/saga/saga.h b/engines/saga/saga.h
index 01cab21f5d..6077e55094 100644
--- a/engines/saga/saga.h
+++ b/engines/saga/saga.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -138,7 +138,7 @@ enum GameFileTypes {
enum GameFeatures {
GF_ITE_FLOPPY = 1 << 0,
#if 0
- GF_OLD_ITE_DOS = 1 << 1, // Currently unused
+ GF_OLD_ITE_DOS = 1 << 1, // Currently unused
#endif
GF_EXTRA_ITE_CREDITS = 1 << 2,
GF_8BIT_UNSIGNED_PCM = 1 << 3
diff --git a/engines/saga/saveload.cpp b/engines/saga/saveload.cpp
index 9784cf4e33..90ba62070b 100644
--- a/engines/saga/saveload.cpp
+++ b/engines/saga/saveload.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/saga/scene.cpp b/engines/saga/scene.cpp
index eff31cf98b..04776bd5dc 100644
--- a/engines/saga/scene.cpp
+++ b/engines/saga/scene.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -43,7 +43,7 @@
#include "common/util.h"
-#include "graphics/decoders/iff.h"
+#include "image/iff.h"
namespace Saga {
@@ -463,7 +463,7 @@ void Scene::changeScene(int16 sceneNumber, int actorsEntrance, SceneTransitionTy
_vm->_interface->setMode(kPanelSceneSubstitute);
if (file.open(sceneSubstitutes[i].image)) {
- Graphics::IFFDecoder decoder;
+ Image::IFFDecoder decoder;
decoder.loadStream(file);
pal = decoder.getPalette();
rect.setWidth(decoder.getSurface()->w);
@@ -1220,7 +1220,7 @@ void Scene::cmdSceneChange(int argc, const char **argv) {
scene_num = atoi(argv[1]);
if ((scene_num < 1) || (uint(scene_num) >= _sceneLUT.size())) {
- _vm->_console->DebugPrintf("Invalid scene number.\n");
+ _vm->_console->debugPrintf("Invalid scene number.\n");
return;
}
diff --git a/engines/saga/scene.h b/engines/saga/scene.h
index 6e2cb12380..0a3b98b33f 100644
--- a/engines/saga/scene.h
+++ b/engines/saga/scene.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/saga/script.cpp b/engines/saga/script.cpp
index 3efc554cb3..94b26c8da3 100644
--- a/engines/saga/script.cpp
+++ b/engines/saga/script.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/saga/script.h b/engines/saga/script.h
index c4ea2d62b3..dd080fbe24 100644
--- a/engines/saga/script.h
+++ b/engines/saga/script.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/saga/sfuncs.cpp b/engines/saga/sfuncs.cpp
index c623349b7a..cb963e23ac 100644
--- a/engines/saga/sfuncs.cpp
+++ b/engines/saga/sfuncs.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -139,7 +139,7 @@ void Script::setupITEScriptFuncList() {
void Script::sfPutString(SCRIPTFUNC_PARAMS) {
const char *str = thread->_strings->getString(thread->pop());
- _vm->_console->DebugPrintf("sfPutString: %s\n",str);
+ _vm->_console->debugPrintf("sfPutString: %s\n",str);
debug(0, "sfPutString: %s", str);
}
diff --git a/engines/saga/sfuncs_ihnm.cpp b/engines/saga/sfuncs_ihnm.cpp
index fdfd0fdf2c..6957360942 100644
--- a/engines/saga/sfuncs_ihnm.cpp
+++ b/engines/saga/sfuncs_ihnm.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/saga/shorten.cpp b/engines/saga/shorten.cpp
index 619ffc243e..426430c892 100644
--- a/engines/saga/shorten.cpp
+++ b/engines/saga/shorten.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/saga/shorten.h b/engines/saga/shorten.h
index 77feafa54d..556abaf311 100644
--- a/engines/saga/shorten.h
+++ b/engines/saga/shorten.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/saga/sndres.cpp b/engines/saga/sndres.cpp
index ca843af465..39578e96f0 100644
--- a/engines/saga/sndres.cpp
+++ b/engines/saga/sndres.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/saga/sndres.h b/engines/saga/sndres.h
index 979c0288f6..554eed4a27 100644
--- a/engines/saga/sndres.h
+++ b/engines/saga/sndres.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/saga/sound.cpp b/engines/saga/sound.cpp
index 67be499bc7..0eb6f8a82a 100644
--- a/engines/saga/sound.cpp
+++ b/engines/saga/sound.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/saga/sound.h b/engines/saga/sound.h
index e2163dfb0e..fa59538bbc 100644
--- a/engines/saga/sound.h
+++ b/engines/saga/sound.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/saga/sprite.cpp b/engines/saga/sprite.cpp
index bf550659e9..ae8ee9cd54 100644
--- a/engines/saga/sprite.cpp
+++ b/engines/saga/sprite.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/saga/sprite.h b/engines/saga/sprite.h
index 0375d8c63f..525958006d 100644
--- a/engines/saga/sprite.h
+++ b/engines/saga/sprite.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/saga/sthread.cpp b/engines/saga/sthread.cpp
index 6e5cc68ae6..dde266bb0b 100644
--- a/engines/saga/sthread.cpp
+++ b/engines/saga/sthread.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/savestate.cpp b/engines/savestate.cpp
index 260c7cd3ff..186d7bc5f2 100644
--- a/engines/savestate.cpp
+++ b/engines/savestate.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/savestate.h b/engines/savestate.h
index c233554657..970e01485d 100644
--- a/engines/savestate.h
+++ b/engines/savestate.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/sci/configure.engine b/engines/sci/configure.engine
new file mode 100644
index 0000000000..d1c45a4654
--- /dev/null
+++ b/engines/sci/configure.engine
@@ -0,0 +1,4 @@
+# This file is included from the main "configure" script
+# add_engine [name] [desc] [build-by-default] [subengines] [base games] [deps]
+add_engine sci "SCI" yes "sci32" "SCI 0-1.1 games"
+add_engine sci32 "SCI32 games" no
diff --git a/engines/sci/console.cpp b/engines/sci/console.cpp
index 50fae61de0..565e9752c3 100644
--- a/engines/sci/console.cpp
+++ b/engines/sci/console.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -79,148 +79,151 @@ Console::Console(SciEngine *engine) : GUI::Debugger(),
assert(_engine->_gamestate);
// Variables
- DVar_Register("sleeptime_factor", &g_debug_sleeptime_factor, DVAR_INT, 0);
- DVar_Register("gc_interval", &engine->_gamestate->scriptGCInterval, DVAR_INT, 0);
- DVar_Register("simulated_key", &g_debug_simulated_key, DVAR_INT, 0);
- DVar_Register("track_mouse_clicks", &g_debug_track_mouse_clicks, DVAR_BOOL, 0);
- DVar_Register("script_abort_flag", &_engine->_gamestate->abortScriptProcessing, DVAR_INT, 0);
+ registerVar("sleeptime_factor", &g_debug_sleeptime_factor);
+ registerVar("gc_interval", &engine->_gamestate->scriptGCInterval);
+ registerVar("simulated_key", &g_debug_simulated_key);
+ registerVar("track_mouse_clicks", &g_debug_track_mouse_clicks);
+ // FIXME: This actually passes an enum type instead of an integer but no
+ // precaution is taken to assure that all assigned values are in the range
+ // of the enum type. We should handle this more carefully...
+ registerVar("script_abort_flag", (int *)&_engine->_gamestate->abortScriptProcessing);
// General
- DCmd_Register("help", WRAP_METHOD(Console, cmdHelp));
+ registerCmd("help", WRAP_METHOD(Console, cmdHelp));
// Kernel
-// DCmd_Register("classes", WRAP_METHOD(Console, cmdClasses)); // TODO
- DCmd_Register("opcodes", WRAP_METHOD(Console, cmdOpcodes));
- DCmd_Register("selector", WRAP_METHOD(Console, cmdSelector));
- DCmd_Register("selectors", WRAP_METHOD(Console, cmdSelectors));
- DCmd_Register("functions", WRAP_METHOD(Console, cmdKernelFunctions));
- DCmd_Register("class_table", WRAP_METHOD(Console, cmdClassTable));
+// registerCmd("classes", WRAP_METHOD(Console, cmdClasses)); // TODO
+ registerCmd("opcodes", WRAP_METHOD(Console, cmdOpcodes));
+ registerCmd("selector", WRAP_METHOD(Console, cmdSelector));
+ registerCmd("selectors", WRAP_METHOD(Console, cmdSelectors));
+ registerCmd("functions", WRAP_METHOD(Console, cmdKernelFunctions));
+ registerCmd("class_table", WRAP_METHOD(Console, cmdClassTable));
// Parser
- DCmd_Register("suffixes", WRAP_METHOD(Console, cmdSuffixes));
- DCmd_Register("parse_grammar", WRAP_METHOD(Console, cmdParseGrammar));
- DCmd_Register("parser_nodes", WRAP_METHOD(Console, cmdParserNodes));
- DCmd_Register("parser_words", WRAP_METHOD(Console, cmdParserWords));
- DCmd_Register("sentence_fragments", WRAP_METHOD(Console, cmdSentenceFragments));
- DCmd_Register("parse", WRAP_METHOD(Console, cmdParse));
- DCmd_Register("set_parse_nodes", WRAP_METHOD(Console, cmdSetParseNodes));
- DCmd_Register("said", WRAP_METHOD(Console, cmdSaid));
+ registerCmd("suffixes", WRAP_METHOD(Console, cmdSuffixes));
+ registerCmd("parse_grammar", WRAP_METHOD(Console, cmdParseGrammar));
+ registerCmd("parser_nodes", WRAP_METHOD(Console, cmdParserNodes));
+ registerCmd("parser_words", WRAP_METHOD(Console, cmdParserWords));
+ registerCmd("sentence_fragments", WRAP_METHOD(Console, cmdSentenceFragments));
+ registerCmd("parse", WRAP_METHOD(Console, cmdParse));
+ registerCmd("set_parse_nodes", WRAP_METHOD(Console, cmdSetParseNodes));
+ registerCmd("said", WRAP_METHOD(Console, cmdSaid));
// Resources
- DCmd_Register("diskdump", WRAP_METHOD(Console, cmdDiskDump));
- DCmd_Register("hexdump", WRAP_METHOD(Console, cmdHexDump));
- DCmd_Register("resource_id", WRAP_METHOD(Console, cmdResourceId));
- DCmd_Register("resource_info", WRAP_METHOD(Console, cmdResourceInfo));
- DCmd_Register("resource_types", WRAP_METHOD(Console, cmdResourceTypes));
- DCmd_Register("list", WRAP_METHOD(Console, cmdList));
- DCmd_Register("hexgrep", WRAP_METHOD(Console, cmdHexgrep));
- DCmd_Register("verify_scripts", WRAP_METHOD(Console, cmdVerifyScripts));
+ registerCmd("diskdump", WRAP_METHOD(Console, cmdDiskDump));
+ registerCmd("hexdump", WRAP_METHOD(Console, cmdHexDump));
+ registerCmd("resource_id", WRAP_METHOD(Console, cmdResourceId));
+ registerCmd("resource_info", WRAP_METHOD(Console, cmdResourceInfo));
+ registerCmd("resource_types", WRAP_METHOD(Console, cmdResourceTypes));
+ registerCmd("list", WRAP_METHOD(Console, cmdList));
+ registerCmd("hexgrep", WRAP_METHOD(Console, cmdHexgrep));
+ registerCmd("verify_scripts", WRAP_METHOD(Console, cmdVerifyScripts));
// Game
- DCmd_Register("save_game", WRAP_METHOD(Console, cmdSaveGame));
- DCmd_Register("restore_game", WRAP_METHOD(Console, cmdRestoreGame));
- DCmd_Register("restart_game", WRAP_METHOD(Console, cmdRestartGame));
- DCmd_Register("version", WRAP_METHOD(Console, cmdGetVersion));
- DCmd_Register("room", WRAP_METHOD(Console, cmdRoomNumber));
- DCmd_Register("quit", WRAP_METHOD(Console, cmdQuit));
- DCmd_Register("list_saves", WRAP_METHOD(Console, cmdListSaves));
+ registerCmd("save_game", WRAP_METHOD(Console, cmdSaveGame));
+ registerCmd("restore_game", WRAP_METHOD(Console, cmdRestoreGame));
+ registerCmd("restart_game", WRAP_METHOD(Console, cmdRestartGame));
+ registerCmd("version", WRAP_METHOD(Console, cmdGetVersion));
+ registerCmd("room", WRAP_METHOD(Console, cmdRoomNumber));
+ registerCmd("quit", WRAP_METHOD(Console, cmdQuit));
+ registerCmd("list_saves", WRAP_METHOD(Console, cmdListSaves));
// Graphics
- DCmd_Register("show_map", WRAP_METHOD(Console, cmdShowMap));
- DCmd_Register("set_palette", WRAP_METHOD(Console, cmdSetPalette));
- DCmd_Register("draw_pic", WRAP_METHOD(Console, cmdDrawPic));
- DCmd_Register("draw_cel", WRAP_METHOD(Console, cmdDrawCel));
- DCmd_Register("undither", WRAP_METHOD(Console, cmdUndither));
- DCmd_Register("pic_visualize", WRAP_METHOD(Console, cmdPicVisualize));
- DCmd_Register("play_video", WRAP_METHOD(Console, cmdPlayVideo));
- DCmd_Register("animate_list", WRAP_METHOD(Console, cmdAnimateList));
- DCmd_Register("al", WRAP_METHOD(Console, cmdAnimateList)); // alias
- DCmd_Register("window_list", WRAP_METHOD(Console, cmdWindowList));
- DCmd_Register("wl", WRAP_METHOD(Console, cmdWindowList)); // alias
- DCmd_Register("plane_list", WRAP_METHOD(Console, cmdPlaneList));
- DCmd_Register("pl", WRAP_METHOD(Console, cmdPlaneList)); // alias
- DCmd_Register("plane_items", WRAP_METHOD(Console, cmdPlaneItemList));
- DCmd_Register("pi", WRAP_METHOD(Console, cmdPlaneItemList)); // alias
- DCmd_Register("saved_bits", WRAP_METHOD(Console, cmdSavedBits));
- DCmd_Register("show_saved_bits", WRAP_METHOD(Console, cmdShowSavedBits));
+ registerCmd("show_map", WRAP_METHOD(Console, cmdShowMap));
+ registerCmd("set_palette", WRAP_METHOD(Console, cmdSetPalette));
+ registerCmd("draw_pic", WRAP_METHOD(Console, cmdDrawPic));
+ registerCmd("draw_cel", WRAP_METHOD(Console, cmdDrawCel));
+ registerCmd("undither", WRAP_METHOD(Console, cmdUndither));
+ registerCmd("pic_visualize", WRAP_METHOD(Console, cmdPicVisualize));
+ registerCmd("play_video", WRAP_METHOD(Console, cmdPlayVideo));
+ registerCmd("animate_list", WRAP_METHOD(Console, cmdAnimateList));
+ registerCmd("al", WRAP_METHOD(Console, cmdAnimateList)); // alias
+ registerCmd("window_list", WRAP_METHOD(Console, cmdWindowList));
+ registerCmd("wl", WRAP_METHOD(Console, cmdWindowList)); // alias
+ registerCmd("plane_list", WRAP_METHOD(Console, cmdPlaneList));
+ registerCmd("pl", WRAP_METHOD(Console, cmdPlaneList)); // alias
+ registerCmd("plane_items", WRAP_METHOD(Console, cmdPlaneItemList));
+ registerCmd("pi", WRAP_METHOD(Console, cmdPlaneItemList)); // alias
+ registerCmd("saved_bits", WRAP_METHOD(Console, cmdSavedBits));
+ registerCmd("show_saved_bits", WRAP_METHOD(Console, cmdShowSavedBits));
// Segments
- DCmd_Register("segment_table", WRAP_METHOD(Console, cmdPrintSegmentTable));
- DCmd_Register("segtable", WRAP_METHOD(Console, cmdPrintSegmentTable)); // alias
- DCmd_Register("segment_info", WRAP_METHOD(Console, cmdSegmentInfo));
- DCmd_Register("seginfo", WRAP_METHOD(Console, cmdSegmentInfo)); // alias
- DCmd_Register("segment_kill", WRAP_METHOD(Console, cmdKillSegment));
- DCmd_Register("segkill", WRAP_METHOD(Console, cmdKillSegment)); // alias
+ registerCmd("segment_table", WRAP_METHOD(Console, cmdPrintSegmentTable));
+ registerCmd("segtable", WRAP_METHOD(Console, cmdPrintSegmentTable)); // alias
+ registerCmd("segment_info", WRAP_METHOD(Console, cmdSegmentInfo));
+ registerCmd("seginfo", WRAP_METHOD(Console, cmdSegmentInfo)); // alias
+ registerCmd("segment_kill", WRAP_METHOD(Console, cmdKillSegment));
+ registerCmd("segkill", WRAP_METHOD(Console, cmdKillSegment)); // alias
// Garbage collection
- DCmd_Register("gc", WRAP_METHOD(Console, cmdGCInvoke));
- DCmd_Register("gc_objects", WRAP_METHOD(Console, cmdGCObjects));
- DCmd_Register("gc_reachable", WRAP_METHOD(Console, cmdGCShowReachable));
- DCmd_Register("gc_freeable", WRAP_METHOD(Console, cmdGCShowFreeable));
- DCmd_Register("gc_normalize", WRAP_METHOD(Console, cmdGCNormalize));
+ registerCmd("gc", WRAP_METHOD(Console, cmdGCInvoke));
+ registerCmd("gc_objects", WRAP_METHOD(Console, cmdGCObjects));
+ registerCmd("gc_reachable", WRAP_METHOD(Console, cmdGCShowReachable));
+ registerCmd("gc_freeable", WRAP_METHOD(Console, cmdGCShowFreeable));
+ registerCmd("gc_normalize", WRAP_METHOD(Console, cmdGCNormalize));
// Music/SFX
- DCmd_Register("songlib", WRAP_METHOD(Console, cmdSongLib));
- DCmd_Register("songinfo", WRAP_METHOD(Console, cmdSongInfo));
- DCmd_Register("is_sample", WRAP_METHOD(Console, cmdIsSample));
- DCmd_Register("startsound", WRAP_METHOD(Console, cmdStartSound));
- DCmd_Register("togglesound", WRAP_METHOD(Console, cmdToggleSound));
- DCmd_Register("stopallsounds", WRAP_METHOD(Console, cmdStopAllSounds));
- DCmd_Register("sfx01_header", WRAP_METHOD(Console, cmdSfx01Header));
- DCmd_Register("sfx01_track", WRAP_METHOD(Console, cmdSfx01Track));
- DCmd_Register("show_instruments", WRAP_METHOD(Console, cmdShowInstruments));
- DCmd_Register("map_instrument", WRAP_METHOD(Console, cmdMapInstrument));
+ registerCmd("songlib", WRAP_METHOD(Console, cmdSongLib));
+ registerCmd("songinfo", WRAP_METHOD(Console, cmdSongInfo));
+ registerCmd("is_sample", WRAP_METHOD(Console, cmdIsSample));
+ registerCmd("startsound", WRAP_METHOD(Console, cmdStartSound));
+ registerCmd("togglesound", WRAP_METHOD(Console, cmdToggleSound));
+ registerCmd("stopallsounds", WRAP_METHOD(Console, cmdStopAllSounds));
+ registerCmd("sfx01_header", WRAP_METHOD(Console, cmdSfx01Header));
+ registerCmd("sfx01_track", WRAP_METHOD(Console, cmdSfx01Track));
+ registerCmd("show_instruments", WRAP_METHOD(Console, cmdShowInstruments));
+ registerCmd("map_instrument", WRAP_METHOD(Console, cmdMapInstrument));
// Script
- DCmd_Register("addresses", WRAP_METHOD(Console, cmdAddresses));
- DCmd_Register("registers", WRAP_METHOD(Console, cmdRegisters));
- DCmd_Register("dissect_script", WRAP_METHOD(Console, cmdDissectScript));
- DCmd_Register("backtrace", WRAP_METHOD(Console, cmdBacktrace));
- DCmd_Register("bt", WRAP_METHOD(Console, cmdBacktrace)); // alias
- DCmd_Register("trace", WRAP_METHOD(Console, cmdTrace));
- DCmd_Register("t", WRAP_METHOD(Console, cmdTrace)); // alias
- DCmd_Register("s", WRAP_METHOD(Console, cmdTrace)); // alias
- DCmd_Register("stepover", WRAP_METHOD(Console, cmdStepOver));
- DCmd_Register("p", WRAP_METHOD(Console, cmdStepOver)); // alias
- DCmd_Register("step_ret", WRAP_METHOD(Console, cmdStepRet));
- DCmd_Register("pret", WRAP_METHOD(Console, cmdStepRet)); // alias
- DCmd_Register("step_event", WRAP_METHOD(Console, cmdStepEvent));
- DCmd_Register("se", WRAP_METHOD(Console, cmdStepEvent)); // alias
- DCmd_Register("step_global", WRAP_METHOD(Console, cmdStepGlobal));
- DCmd_Register("sg", WRAP_METHOD(Console, cmdStepGlobal)); // alias
- DCmd_Register("step_callk", WRAP_METHOD(Console, cmdStepCallk));
- DCmd_Register("snk", WRAP_METHOD(Console, cmdStepCallk)); // alias
- DCmd_Register("disasm", WRAP_METHOD(Console, cmdDisassemble));
- DCmd_Register("disasm_addr", WRAP_METHOD(Console, cmdDisassembleAddress));
- DCmd_Register("find_callk", WRAP_METHOD(Console, cmdFindKernelFunctionCall));
- DCmd_Register("send", WRAP_METHOD(Console, cmdSend));
- DCmd_Register("go", WRAP_METHOD(Console, cmdGo));
- DCmd_Register("logkernel", WRAP_METHOD(Console, cmdLogKernel));
+ registerCmd("addresses", WRAP_METHOD(Console, cmdAddresses));
+ registerCmd("registers", WRAP_METHOD(Console, cmdRegisters));
+ registerCmd("dissect_script", WRAP_METHOD(Console, cmdDissectScript));
+ registerCmd("backtrace", WRAP_METHOD(Console, cmdBacktrace));
+ registerCmd("bt", WRAP_METHOD(Console, cmdBacktrace)); // alias
+ registerCmd("trace", WRAP_METHOD(Console, cmdTrace));
+ registerCmd("t", WRAP_METHOD(Console, cmdTrace)); // alias
+ registerCmd("s", WRAP_METHOD(Console, cmdTrace)); // alias
+ registerCmd("stepover", WRAP_METHOD(Console, cmdStepOver));
+ registerCmd("p", WRAP_METHOD(Console, cmdStepOver)); // alias
+ registerCmd("step_ret", WRAP_METHOD(Console, cmdStepRet));
+ registerCmd("pret", WRAP_METHOD(Console, cmdStepRet)); // alias
+ registerCmd("step_event", WRAP_METHOD(Console, cmdStepEvent));
+ registerCmd("se", WRAP_METHOD(Console, cmdStepEvent)); // alias
+ registerCmd("step_global", WRAP_METHOD(Console, cmdStepGlobal));
+ registerCmd("sg", WRAP_METHOD(Console, cmdStepGlobal)); // alias
+ registerCmd("step_callk", WRAP_METHOD(Console, cmdStepCallk));
+ registerCmd("snk", WRAP_METHOD(Console, cmdStepCallk)); // alias
+ registerCmd("disasm", WRAP_METHOD(Console, cmdDisassemble));
+ registerCmd("disasm_addr", WRAP_METHOD(Console, cmdDisassembleAddress));
+ registerCmd("find_callk", WRAP_METHOD(Console, cmdFindKernelFunctionCall));
+ registerCmd("send", WRAP_METHOD(Console, cmdSend));
+ registerCmd("go", WRAP_METHOD(Console, cmdGo));
+ registerCmd("logkernel", WRAP_METHOD(Console, cmdLogKernel));
// Breakpoints
- DCmd_Register("bp_list", WRAP_METHOD(Console, cmdBreakpointList));
- DCmd_Register("bplist", WRAP_METHOD(Console, cmdBreakpointList)); // alias
- DCmd_Register("bl", WRAP_METHOD(Console, cmdBreakpointList)); // alias
- DCmd_Register("bp_del", WRAP_METHOD(Console, cmdBreakpointDelete));
- DCmd_Register("bpdel", WRAP_METHOD(Console, cmdBreakpointDelete)); // alias
- DCmd_Register("bc", WRAP_METHOD(Console, cmdBreakpointDelete)); // alias
- DCmd_Register("bp_method", WRAP_METHOD(Console, cmdBreakpointMethod));
- DCmd_Register("bpx", WRAP_METHOD(Console, cmdBreakpointMethod)); // alias
- DCmd_Register("bp_read", WRAP_METHOD(Console, cmdBreakpointRead));
- DCmd_Register("bpr", WRAP_METHOD(Console, cmdBreakpointRead)); // alias
- DCmd_Register("bp_write", WRAP_METHOD(Console, cmdBreakpointWrite));
- DCmd_Register("bpw", WRAP_METHOD(Console, cmdBreakpointWrite)); // alias
- DCmd_Register("bp_kernel", WRAP_METHOD(Console, cmdBreakpointKernel));
- DCmd_Register("bpk", WRAP_METHOD(Console, cmdBreakpointKernel)); // alias
- DCmd_Register("bp_function", WRAP_METHOD(Console, cmdBreakpointFunction));
- DCmd_Register("bpe", WRAP_METHOD(Console, cmdBreakpointFunction)); // alias
+ registerCmd("bp_list", WRAP_METHOD(Console, cmdBreakpointList));
+ registerCmd("bplist", WRAP_METHOD(Console, cmdBreakpointList)); // alias
+ registerCmd("bl", WRAP_METHOD(Console, cmdBreakpointList)); // alias
+ registerCmd("bp_del", WRAP_METHOD(Console, cmdBreakpointDelete));
+ registerCmd("bpdel", WRAP_METHOD(Console, cmdBreakpointDelete)); // alias
+ registerCmd("bc", WRAP_METHOD(Console, cmdBreakpointDelete)); // alias
+ registerCmd("bp_method", WRAP_METHOD(Console, cmdBreakpointMethod));
+ registerCmd("bpx", WRAP_METHOD(Console, cmdBreakpointMethod)); // alias
+ registerCmd("bp_read", WRAP_METHOD(Console, cmdBreakpointRead));
+ registerCmd("bpr", WRAP_METHOD(Console, cmdBreakpointRead)); // alias
+ registerCmd("bp_write", WRAP_METHOD(Console, cmdBreakpointWrite));
+ registerCmd("bpw", WRAP_METHOD(Console, cmdBreakpointWrite)); // alias
+ registerCmd("bp_kernel", WRAP_METHOD(Console, cmdBreakpointKernel));
+ registerCmd("bpk", WRAP_METHOD(Console, cmdBreakpointKernel)); // alias
+ registerCmd("bp_function", WRAP_METHOD(Console, cmdBreakpointFunction));
+ registerCmd("bpe", WRAP_METHOD(Console, cmdBreakpointFunction)); // alias
// VM
- DCmd_Register("script_steps", WRAP_METHOD(Console, cmdScriptSteps));
- DCmd_Register("vm_varlist", WRAP_METHOD(Console, cmdVMVarlist));
- DCmd_Register("vmvarlist", WRAP_METHOD(Console, cmdVMVarlist)); // alias
- DCmd_Register("vl", WRAP_METHOD(Console, cmdVMVarlist)); // alias
- DCmd_Register("vm_vars", WRAP_METHOD(Console, cmdVMVars));
- DCmd_Register("vmvars", WRAP_METHOD(Console, cmdVMVars)); // alias
- DCmd_Register("vv", WRAP_METHOD(Console, cmdVMVars)); // alias
- DCmd_Register("stack", WRAP_METHOD(Console, cmdStack));
- DCmd_Register("value_type", WRAP_METHOD(Console, cmdValueType));
- DCmd_Register("view_listnode", WRAP_METHOD(Console, cmdViewListNode));
- DCmd_Register("view_reference", WRAP_METHOD(Console, cmdViewReference));
- DCmd_Register("vr", WRAP_METHOD(Console, cmdViewReference)); // alias
- DCmd_Register("view_object", WRAP_METHOD(Console, cmdViewObject));
- DCmd_Register("vo", WRAP_METHOD(Console, cmdViewObject)); // alias
- DCmd_Register("active_object", WRAP_METHOD(Console, cmdViewActiveObject));
- DCmd_Register("acc_object", WRAP_METHOD(Console, cmdViewAccumulatorObject));
+ registerCmd("script_steps", WRAP_METHOD(Console, cmdScriptSteps));
+ registerCmd("vm_varlist", WRAP_METHOD(Console, cmdVMVarlist));
+ registerCmd("vmvarlist", WRAP_METHOD(Console, cmdVMVarlist)); // alias
+ registerCmd("vl", WRAP_METHOD(Console, cmdVMVarlist)); // alias
+ registerCmd("vm_vars", WRAP_METHOD(Console, cmdVMVars));
+ registerCmd("vmvars", WRAP_METHOD(Console, cmdVMVars)); // alias
+ registerCmd("vv", WRAP_METHOD(Console, cmdVMVars)); // alias
+ registerCmd("stack", WRAP_METHOD(Console, cmdStack));
+ registerCmd("value_type", WRAP_METHOD(Console, cmdValueType));
+ registerCmd("view_listnode", WRAP_METHOD(Console, cmdViewListNode));
+ registerCmd("view_reference", WRAP_METHOD(Console, cmdViewReference));
+ registerCmd("vr", WRAP_METHOD(Console, cmdViewReference)); // alias
+ registerCmd("view_object", WRAP_METHOD(Console, cmdViewObject));
+ registerCmd("vo", WRAP_METHOD(Console, cmdViewObject)); // alias
+ registerCmd("active_object", WRAP_METHOD(Console, cmdViewActiveObject));
+ registerCmd("acc_object", WRAP_METHOD(Console, cmdViewAccumulatorObject));
_debugState.seeking = kDebugSeekNothing;
_debugState.seekLevel = 0;
@@ -307,137 +310,137 @@ void Console::postEnter() {
}
bool Console::cmdHelp(int argc, const char **argv) {
- DebugPrintf("\n");
- DebugPrintf("Variables\n");
- DebugPrintf("---------\n");
- DebugPrintf("sleeptime_factor: Factor to multiply with wait times in kWait()\n");
- DebugPrintf("gc_interval: Number of kernel calls in between garbage collections\n");
- DebugPrintf("simulated_key: Add a key with the specified scan code to the event list\n");
- DebugPrintf("track_mouse_clicks: Toggles mouse click tracking to the console\n");
- DebugPrintf("weak_validations: Turns some validation errors into warnings\n");
- DebugPrintf("script_abort_flag: Set to 1 to abort script execution. Set to 2 to force a replay afterwards\n");
- DebugPrintf("\n");
- DebugPrintf("Debug flags\n");
- DebugPrintf("-----------\n");
- DebugPrintf("debugflag_list - Lists the available debug flags and their status\n");
- DebugPrintf("debugflag_enable - Enables a debug flag\n");
- DebugPrintf("debugflag_disable - Disables a debug flag\n");
- DebugPrintf("\n");
- DebugPrintf("Commands\n");
- DebugPrintf("--------\n");
- DebugPrintf("Kernel:\n");
- DebugPrintf(" opcodes - Lists the opcode names\n");
- DebugPrintf(" selectors - Lists the selector names\n");
- DebugPrintf(" selector - Attempts to find the requested selector by name\n");
- DebugPrintf(" functions - Lists the kernel functions\n");
- DebugPrintf(" class_table - Shows the available classes\n");
- DebugPrintf("\n");
- DebugPrintf("Parser:\n");
- DebugPrintf(" suffixes - Lists the vocabulary suffixes\n");
- DebugPrintf(" parse_grammar - Shows the parse grammar, in strict GNF\n");
- DebugPrintf(" parser_nodes - Shows the specified number of nodes from the parse node tree\n");
- DebugPrintf(" parser_words - Shows the words from the parse node tree\n");
- DebugPrintf(" sentence_fragments - Shows the sentence fragments (used to build Parse trees)\n");
- DebugPrintf(" parse - Parses a sequence of words and prints the resulting parse tree\n");
- DebugPrintf(" set_parse_nodes - Sets the contents of all parse nodes\n");
- DebugPrintf(" said - Match a string against a said spec\n");
- DebugPrintf("\n");
- DebugPrintf("Resources:\n");
- DebugPrintf(" diskdump - Dumps the specified resource to disk as a patch file\n");
- DebugPrintf(" hexdump - Dumps the specified resource to standard output\n");
- DebugPrintf(" resource_id - Identifies a resource number by splitting it up in resource type and resource number\n");
- DebugPrintf(" resource_info - Shows info about a resource\n");
- DebugPrintf(" resource_types - Shows the valid resource types\n");
- DebugPrintf(" list - Lists all the resources of a given type\n");
- DebugPrintf(" hexgrep - Searches some resources for a particular sequence of bytes, represented as hexadecimal numbers\n");
- DebugPrintf(" verify_scripts - Performs sanity checks on SCI1.1-SCI2.1 game scripts (e.g. if they're up to 64KB in total)\n");
- DebugPrintf("\n");
- DebugPrintf("Game:\n");
- DebugPrintf(" save_game - Saves the current game state to the hard disk\n");
- DebugPrintf(" restore_game - Restores a saved game from the hard disk\n");
- DebugPrintf(" list_saves - List all saved games including filenames\n");
- DebugPrintf(" restart_game - Restarts the game\n");
- DebugPrintf(" version - Shows the resource and interpreter versions\n");
- DebugPrintf(" room - Gets or sets the current room number\n");
- DebugPrintf(" quit - Quits the game\n");
- DebugPrintf("\n");
- DebugPrintf("Graphics:\n");
- DebugPrintf(" show_map - Switches to visual, priority, control or display screen\n");
- DebugPrintf(" set_palette - Sets a palette resource\n");
- DebugPrintf(" draw_pic - Draws a pic resource\n");
- DebugPrintf(" draw_cel - Draws a cel from a view resource\n");
- DebugPrintf(" pic_visualize - Enables visualization of the drawing process of EGA pictures\n");
- DebugPrintf(" undither - Enable/disable undithering\n");
- DebugPrintf(" play_video - Plays a SEQ, AVI, VMD, RBT or DUK video\n");
- DebugPrintf(" animate_list / al - Shows the current list of objects in kAnimate's draw list (SCI0 - SCI1.1)\n");
- DebugPrintf(" window_list / wl - Shows a list of all the windows (ports) in the draw list (SCI0 - SCI1.1)\n");
- DebugPrintf(" plane_list / pl - Shows a list of all the planes in the draw list (SCI2+)\n");
- DebugPrintf(" plane_items / pi - Shows a list of all items for a plane (SCI2+)\n");
- DebugPrintf(" saved_bits - List saved bits on the hunk\n");
- DebugPrintf(" show_saved_bits - Display saved bits\n");
- DebugPrintf("\n");
- DebugPrintf("Segments:\n");
- DebugPrintf(" segment_table / segtable - Lists all segments\n");
- DebugPrintf(" segment_info / seginfo - Provides information on the specified segment\n");
- DebugPrintf(" segment_kill / segkill - Deletes the specified segment\n");
- DebugPrintf("\n");
- DebugPrintf("Garbage collection:\n");
- DebugPrintf(" gc - Invokes the garbage collector\n");
- DebugPrintf(" gc_objects - Lists all reachable objects, normalized\n");
- DebugPrintf(" gc_reachable - Lists all addresses directly reachable from a given memory object\n");
- DebugPrintf(" gc_freeable - Lists all addresses freeable in a given segment\n");
- DebugPrintf(" gc_normalize - Prints the \"normal\" address of a given address\n");
- DebugPrintf("\n");
- DebugPrintf("Music/SFX:\n");
- DebugPrintf(" songlib - Shows the song library\n");
- DebugPrintf(" songinfo - Shows information about a specified song in the song library\n");
- DebugPrintf(" togglesound - Starts/stops a sound in the song library\n");
- DebugPrintf(" stopallsounds - Stops all sounds in the playlist\n");
- DebugPrintf(" startsound - Starts the specified sound resource, replacing the first song in the song library\n");
- DebugPrintf(" is_sample - Shows information on a given sound resource, if it's a PCM sample\n");
- DebugPrintf(" sfx01_header - Dumps the header of a SCI01 song\n");
- DebugPrintf(" sfx01_track - Dumps a track of a SCI01 song\n");
- DebugPrintf(" show_instruments - Shows the instruments of a specific song, or all songs\n");
- DebugPrintf(" map_instrument - Dynamically maps an MT-32 instrument to a GM instrument\n");
- DebugPrintf("\n");
- DebugPrintf("Script:\n");
- DebugPrintf(" addresses - Provides information on how to pass addresses\n");
- DebugPrintf(" registers - Shows the current register values\n");
- DebugPrintf(" dissect_script - Examines a script\n");
- DebugPrintf(" backtrace / bt - Dumps the send/self/super/call/calle/callb stack\n");
- DebugPrintf(" trace / t / s - Executes one operation (no parameters) or several operations (specified as a parameter) \n");
- DebugPrintf(" stepover / p - Executes one operation, skips over call/send\n");
- DebugPrintf(" step_ret / pret - Steps forward until ret is called on the current execution stack level.\n");
- DebugPrintf(" step_event / se - Steps forward until a SCI event is received.\n");
- DebugPrintf(" step_global / sg - Steps until the global variable with the specified index is modified.\n");
- DebugPrintf(" step_callk / snk - Steps forward until it hits the next callk operation, or a specific callk (specified as a parameter)\n");
- DebugPrintf(" disasm - Disassembles a method by name\n");
- DebugPrintf(" disasm_addr - Disassembles one or more commands\n");
- DebugPrintf(" send - Sends a message to an object\n");
- DebugPrintf(" go - Executes the script\n");
- DebugPrintf(" logkernel - Logs kernel calls\n");
- DebugPrintf("\n");
- DebugPrintf("Breakpoints:\n");
- DebugPrintf(" bp_list / bplist / bl - Lists the current breakpoints\n");
- DebugPrintf(" bp_del / bpdel / bc - Deletes a breakpoint with the specified index\n");
- DebugPrintf(" bp_method / bpx - Sets a breakpoint on the execution of a specified method/selector\n");
- DebugPrintf(" bp_read / bpr - Sets a breakpoint on reading of a specified selector\n");
- DebugPrintf(" bp_write / bpw - Sets a breakpoint on writing to a specified selector\n");
- DebugPrintf(" bp_kernel / bpk - Sets a breakpoint on execution of a kernel function\n");
- DebugPrintf(" bp_function / bpe - Sets a breakpoint on the execution of the specified exported function\n");
- DebugPrintf("\n");
- DebugPrintf("VM:\n");
- DebugPrintf(" script_steps - Shows the number of executed SCI operations\n");
- DebugPrintf(" vm_varlist / vmvarlist / vl - Shows the addresses of variables in the VM\n");
- DebugPrintf(" vm_vars / vmvars / vv - Displays or changes variables in the VM\n");
- DebugPrintf(" stack - Lists the specified number of stack elements\n");
- DebugPrintf(" value_type - Determines the type of a value\n");
- DebugPrintf(" view_listnode - Examines the list node at the given address\n");
- DebugPrintf(" view_reference / vr - Examines an arbitrary reference\n");
- DebugPrintf(" view_object / vo - Examines the object at the given address\n");
- DebugPrintf(" active_object - Shows information on the currently active object or class\n");
- DebugPrintf(" acc_object - Shows information on the object or class at the address indexed by the accumulator\n");
- DebugPrintf("\n");
+ debugPrintf("\n");
+ debugPrintf("Variables\n");
+ debugPrintf("---------\n");
+ debugPrintf("sleeptime_factor: Factor to multiply with wait times in kWait()\n");
+ debugPrintf("gc_interval: Number of kernel calls in between garbage collections\n");
+ debugPrintf("simulated_key: Add a key with the specified scan code to the event list\n");
+ debugPrintf("track_mouse_clicks: Toggles mouse click tracking to the console\n");
+ debugPrintf("weak_validations: Turns some validation errors into warnings\n");
+ debugPrintf("script_abort_flag: Set to 1 to abort script execution. Set to 2 to force a replay afterwards\n");
+ debugPrintf("\n");
+ debugPrintf("Debug flags\n");
+ debugPrintf("-----------\n");
+ debugPrintf("debugflag_list - Lists the available debug flags and their status\n");
+ debugPrintf("debugflag_enable - Enables a debug flag\n");
+ debugPrintf("debugflag_disable - Disables a debug flag\n");
+ debugPrintf("\n");
+ debugPrintf("Commands\n");
+ debugPrintf("--------\n");
+ debugPrintf("Kernel:\n");
+ debugPrintf(" opcodes - Lists the opcode names\n");
+ debugPrintf(" selectors - Lists the selector names\n");
+ debugPrintf(" selector - Attempts to find the requested selector by name\n");
+ debugPrintf(" functions - Lists the kernel functions\n");
+ debugPrintf(" class_table - Shows the available classes\n");
+ debugPrintf("\n");
+ debugPrintf("Parser:\n");
+ debugPrintf(" suffixes - Lists the vocabulary suffixes\n");
+ debugPrintf(" parse_grammar - Shows the parse grammar, in strict GNF\n");
+ debugPrintf(" parser_nodes - Shows the specified number of nodes from the parse node tree\n");
+ debugPrintf(" parser_words - Shows the words from the parse node tree\n");
+ debugPrintf(" sentence_fragments - Shows the sentence fragments (used to build Parse trees)\n");
+ debugPrintf(" parse - Parses a sequence of words and prints the resulting parse tree\n");
+ debugPrintf(" set_parse_nodes - Sets the contents of all parse nodes\n");
+ debugPrintf(" said - Match a string against a said spec\n");
+ debugPrintf("\n");
+ debugPrintf("Resources:\n");
+ debugPrintf(" diskdump - Dumps the specified resource to disk as a patch file\n");
+ debugPrintf(" hexdump - Dumps the specified resource to standard output\n");
+ debugPrintf(" resource_id - Identifies a resource number by splitting it up in resource type and resource number\n");
+ debugPrintf(" resource_info - Shows info about a resource\n");
+ debugPrintf(" resource_types - Shows the valid resource types\n");
+ debugPrintf(" list - Lists all the resources of a given type\n");
+ debugPrintf(" hexgrep - Searches some resources for a particular sequence of bytes, represented as hexadecimal numbers\n");
+ debugPrintf(" verify_scripts - Performs sanity checks on SCI1.1-SCI2.1 game scripts (e.g. if they're up to 64KB in total)\n");
+ debugPrintf("\n");
+ debugPrintf("Game:\n");
+ debugPrintf(" save_game - Saves the current game state to the hard disk\n");
+ debugPrintf(" restore_game - Restores a saved game from the hard disk\n");
+ debugPrintf(" list_saves - List all saved games including filenames\n");
+ debugPrintf(" restart_game - Restarts the game\n");
+ debugPrintf(" version - Shows the resource and interpreter versions\n");
+ debugPrintf(" room - Gets or sets the current room number\n");
+ debugPrintf(" quit - Quits the game\n");
+ debugPrintf("\n");
+ debugPrintf("Graphics:\n");
+ debugPrintf(" show_map - Switches to visual, priority, control or display screen\n");
+ debugPrintf(" set_palette - Sets a palette resource\n");
+ debugPrintf(" draw_pic - Draws a pic resource\n");
+ debugPrintf(" draw_cel - Draws a cel from a view resource\n");
+ debugPrintf(" pic_visualize - Enables visualization of the drawing process of EGA pictures\n");
+ debugPrintf(" undither - Enable/disable undithering\n");
+ debugPrintf(" play_video - Plays a SEQ, AVI, VMD, RBT or DUK video\n");
+ debugPrintf(" animate_list / al - Shows the current list of objects in kAnimate's draw list (SCI0 - SCI1.1)\n");
+ debugPrintf(" window_list / wl - Shows a list of all the windows (ports) in the draw list (SCI0 - SCI1.1)\n");
+ debugPrintf(" plane_list / pl - Shows a list of all the planes in the draw list (SCI2+)\n");
+ debugPrintf(" plane_items / pi - Shows a list of all items for a plane (SCI2+)\n");
+ debugPrintf(" saved_bits - List saved bits on the hunk\n");
+ debugPrintf(" show_saved_bits - Display saved bits\n");
+ debugPrintf("\n");
+ debugPrintf("Segments:\n");
+ debugPrintf(" segment_table / segtable - Lists all segments\n");
+ debugPrintf(" segment_info / seginfo - Provides information on the specified segment\n");
+ debugPrintf(" segment_kill / segkill - Deletes the specified segment\n");
+ debugPrintf("\n");
+ debugPrintf("Garbage collection:\n");
+ debugPrintf(" gc - Invokes the garbage collector\n");
+ debugPrintf(" gc_objects - Lists all reachable objects, normalized\n");
+ debugPrintf(" gc_reachable - Lists all addresses directly reachable from a given memory object\n");
+ debugPrintf(" gc_freeable - Lists all addresses freeable in a given segment\n");
+ debugPrintf(" gc_normalize - Prints the \"normal\" address of a given address\n");
+ debugPrintf("\n");
+ debugPrintf("Music/SFX:\n");
+ debugPrintf(" songlib - Shows the song library\n");
+ debugPrintf(" songinfo - Shows information about a specified song in the song library\n");
+ debugPrintf(" togglesound - Starts/stops a sound in the song library\n");
+ debugPrintf(" stopallsounds - Stops all sounds in the playlist\n");
+ debugPrintf(" startsound - Starts the specified sound resource, replacing the first song in the song library\n");
+ debugPrintf(" is_sample - Shows information on a given sound resource, if it's a PCM sample\n");
+ debugPrintf(" sfx01_header - Dumps the header of a SCI01 song\n");
+ debugPrintf(" sfx01_track - Dumps a track of a SCI01 song\n");
+ debugPrintf(" show_instruments - Shows the instruments of a specific song, or all songs\n");
+ debugPrintf(" map_instrument - Dynamically maps an MT-32 instrument to a GM instrument\n");
+ debugPrintf("\n");
+ debugPrintf("Script:\n");
+ debugPrintf(" addresses - Provides information on how to pass addresses\n");
+ debugPrintf(" registers - Shows the current register values\n");
+ debugPrintf(" dissect_script - Examines a script\n");
+ debugPrintf(" backtrace / bt - Dumps the send/self/super/call/calle/callb stack\n");
+ debugPrintf(" trace / t / s - Executes one operation (no parameters) or several operations (specified as a parameter) \n");
+ debugPrintf(" stepover / p - Executes one operation, skips over call/send\n");
+ debugPrintf(" step_ret / pret - Steps forward until ret is called on the current execution stack level.\n");
+ debugPrintf(" step_event / se - Steps forward until a SCI event is received.\n");
+ debugPrintf(" step_global / sg - Steps until the global variable with the specified index is modified.\n");
+ debugPrintf(" step_callk / snk - Steps forward until it hits the next callk operation, or a specific callk (specified as a parameter)\n");
+ debugPrintf(" disasm - Disassembles a method by name\n");
+ debugPrintf(" disasm_addr - Disassembles one or more commands\n");
+ debugPrintf(" send - Sends a message to an object\n");
+ debugPrintf(" go - Executes the script\n");
+ debugPrintf(" logkernel - Logs kernel calls\n");
+ debugPrintf("\n");
+ debugPrintf("Breakpoints:\n");
+ debugPrintf(" bp_list / bplist / bl - Lists the current breakpoints\n");
+ debugPrintf(" bp_del / bpdel / bc - Deletes a breakpoint with the specified index\n");
+ debugPrintf(" bp_method / bpx - Sets a breakpoint on the execution of a specified method/selector\n");
+ debugPrintf(" bp_read / bpr - Sets a breakpoint on reading of a specified selector\n");
+ debugPrintf(" bp_write / bpw - Sets a breakpoint on writing to a specified selector\n");
+ debugPrintf(" bp_kernel / bpk - Sets a breakpoint on execution of a kernel function\n");
+ debugPrintf(" bp_function / bpe - Sets a breakpoint on the execution of the specified exported function\n");
+ debugPrintf("\n");
+ debugPrintf("VM:\n");
+ debugPrintf(" script_steps - Shows the number of executed SCI operations\n");
+ debugPrintf(" vm_varlist / vmvarlist / vl - Shows the addresses of variables in the VM\n");
+ debugPrintf(" vm_vars / vmvars / vv - Displays or changes variables in the VM\n");
+ debugPrintf(" stack - Lists the specified number of stack elements\n");
+ debugPrintf(" value_type - Determines the type of a value\n");
+ debugPrintf(" view_listnode - Examines the list node at the given address\n");
+ debugPrintf(" view_reference / vr - Examines an arbitrary reference\n");
+ debugPrintf(" view_object / vo - Examines the object at the given address\n");
+ debugPrintf(" active_object - Shows information on the currently active object or class\n");
+ debugPrintf(" acc_object - Shows information on the object or class at the address indexed by the accumulator\n");
+ debugPrintf("\n");
return true;
}
@@ -464,30 +467,30 @@ bool Console::cmdGetVersion(int argc, const char **argv) {
versionFile.close();
}
- DebugPrintf("Game ID: %s\n", _engine->getGameIdStr());
- DebugPrintf("Emulated interpreter version: %s\n", getSciVersionDesc(getSciVersion()));
- DebugPrintf("\n");
- DebugPrintf("Detected features:\n");
- DebugPrintf("------------------\n");
- DebugPrintf("Sound type: %s\n", getSciVersionDesc(_engine->_features->detectDoSoundType()));
- DebugPrintf("Graphics functions type: %s\n", getSciVersionDesc(_engine->_features->detectGfxFunctionsType()));
- DebugPrintf("Lofs type: %s\n", getSciVersionDesc(_engine->_features->detectLofsType()));
- DebugPrintf("Move count type: %s\n", (_engine->_features->handleMoveCount()) ? "increment" : "ignore");
- DebugPrintf("SetCursor type: %s\n", getSciVersionDesc(_engine->_features->detectSetCursorType()));
+ debugPrintf("Game ID: %s\n", _engine->getGameIdStr());
+ debugPrintf("Emulated interpreter version: %s\n", getSciVersionDesc(getSciVersion()));
+ debugPrintf("\n");
+ debugPrintf("Detected features:\n");
+ debugPrintf("------------------\n");
+ debugPrintf("Sound type: %s\n", getSciVersionDesc(_engine->_features->detectDoSoundType()));
+ debugPrintf("Graphics functions type: %s\n", getSciVersionDesc(_engine->_features->detectGfxFunctionsType()));
+ debugPrintf("Lofs type: %s\n", getSciVersionDesc(_engine->_features->detectLofsType()));
+ debugPrintf("Move count type: %s\n", (_engine->_features->handleMoveCount()) ? "increment" : "ignore");
+ debugPrintf("SetCursor type: %s\n", getSciVersionDesc(_engine->_features->detectSetCursorType()));
#ifdef ENABLE_SCI32
if (getSciVersion() >= SCI_VERSION_2)
- DebugPrintf("kString type: %s\n", (_engine->_features->detectSci2StringFunctionType() == kSci2StringFunctionOld) ? "SCI2 (old)" : "SCI2.1 (new)");
+ debugPrintf("kString type: %s\n", (_engine->_features->detectSci2StringFunctionType() == kSci2StringFunctionOld) ? "SCI2 (old)" : "SCI2.1 (new)");
if (getSciVersion() == SCI_VERSION_2_1)
- DebugPrintf("SCI2.1 kernel table: %s\n", (_engine->_features->detectSci21KernelType() == SCI_VERSION_2) ? "modified SCI2 (old)" : "SCI2.1 (new)");
+ debugPrintf("SCI2.1 kernel table: %s\n", (_engine->_features->detectSci21KernelType() == SCI_VERSION_2) ? "modified SCI2 (old)" : "SCI2.1 (new)");
#endif
- DebugPrintf("View type: %s\n", viewTypeDesc[g_sci->getResMan()->getViewType()]);
- DebugPrintf("Uses palette merging: %s\n", g_sci->_gfxPalette->isMerging() ? "yes" : "no");
- DebugPrintf("Resource volume version: %s\n", g_sci->getResMan()->getVolVersionDesc());
- DebugPrintf("Resource map version: %s\n", g_sci->getResMan()->getMapVersionDesc());
- DebugPrintf("Contains selector vocabulary (vocab.997): %s\n", hasVocab997 ? "yes" : "no");
- DebugPrintf("Has CantBeHere selector: %s\n", g_sci->getKernel()->_selectorCache.cantBeHere != -1 ? "yes" : "no");
- DebugPrintf("Game version (VERSION file): %s\n", gameVersion.c_str());
- DebugPrintf("\n");
+ debugPrintf("View type: %s\n", viewTypeDesc[g_sci->getResMan()->getViewType()]);
+ debugPrintf("Uses palette merging: %s\n", g_sci->_gfxPalette->isMerging() ? "yes" : "no");
+ debugPrintf("Resource volume version: %s\n", g_sci->getResMan()->getVolVersionDesc());
+ debugPrintf("Resource map version: %s\n", g_sci->getResMan()->getMapVersionDesc());
+ debugPrintf("Contains selector vocabulary (vocab.997): %s\n", hasVocab997 ? "yes" : "no");
+ debugPrintf("Has CantBeHere selector: %s\n", g_sci->getKernel()->_selectorCache.cantBeHere != -1 ? "yes" : "no");
+ debugPrintf("Game version (VERSION file): %s\n", gameVersion.c_str());
+ debugPrintf("\n");
return true;
}
@@ -498,13 +501,13 @@ bool Console::cmdOpcodes(int argc, const char **argv) {
// If the resource couldn't be loaded, leave
if (!r) {
- DebugPrintf("unable to load vocab.998");
+ debugPrintf("unable to load vocab.998");
return true;
}
int count = READ_LE_UINT16(r->data);
- DebugPrintf("Opcode names in numeric order [index: type name]:\n");
+ debugPrintf("Opcode names in numeric order [index: type name]:\n");
for (int i = 0; i < count; i++) {
int offset = READ_LE_UINT16(r->data + 2 + i * 2);
@@ -512,49 +515,49 @@ bool Console::cmdOpcodes(int argc, const char **argv) {
int type = READ_LE_UINT16(r->data + offset + 2);
// QFG3 has empty opcodes
Common::String name = len > 0 ? Common::String((const char *)r->data + offset + 4, len) : "Dummy";
- DebugPrintf("%03x: %03x %20s | ", i, type, name.c_str());
+ debugPrintf("%03x: %03x %20s | ", i, type, name.c_str());
if ((i % 3) == 2)
- DebugPrintf("\n");
+ debugPrintf("\n");
}
- DebugPrintf("\n");
+ debugPrintf("\n");
return true;
}
bool Console::cmdSelector(int argc, const char **argv) {
if (argc < 2) {
- DebugPrintf("Attempts to find the requested selector by name.\n");
- DebugPrintf("Usage: %s <selector name>\n", argv[0]);
+ debugPrintf("Attempts to find the requested selector by name.\n");
+ debugPrintf("Usage: %s <selector name>\n", argv[0]);
return true;
}
Common::String name = argv[1];
int seeker = _engine->getKernel()->findSelector(name.c_str());
if (seeker >= 0) {
- DebugPrintf("Selector %s found at %03x (%d)\n", name.c_str(), seeker, seeker);
+ debugPrintf("Selector %s found at %03x (%d)\n", name.c_str(), seeker, seeker);
return true;
}
- DebugPrintf("Selector %s wasn't found\n", name.c_str());
+ debugPrintf("Selector %s wasn't found\n", name.c_str());
return true;
}
bool Console::cmdSelectors(int argc, const char **argv) {
- DebugPrintf("Selector names in numeric order:\n");
+ debugPrintf("Selector names in numeric order:\n");
Common::String selectorName;
for (uint seeker = 0; seeker < _engine->getKernel()->getSelectorNamesSize(); seeker++) {
selectorName = _engine->getKernel()->getSelectorName(seeker);
if (selectorName != "BAD SELECTOR")
- DebugPrintf("%03x: %20s | ", seeker, selectorName.c_str());
+ debugPrintf("%03x: %20s | ", seeker, selectorName.c_str());
else
continue;
if ((seeker % 3) == 2)
- DebugPrintf("\n");
+ debugPrintf("\n");
}
- DebugPrintf("\n");
+ debugPrintf("\n");
#if 0
// For debug/development
@@ -584,14 +587,14 @@ bool Console::cmdSelectors(int argc, const char **argv) {
}
bool Console::cmdKernelFunctions(int argc, const char **argv) {
- DebugPrintf("Kernel function names in numeric order:\n");
+ debugPrintf("Kernel function names in numeric order:\n");
for (uint seeker = 0; seeker < _engine->getKernel()->getKernelNamesSize(); seeker++) {
- DebugPrintf("%03x: %20s | ", seeker, _engine->getKernel()->getKernelName(seeker).c_str());
+ debugPrintf("%03x: %20s | ", seeker, _engine->getKernel()->getKernelName(seeker).c_str());
if ((seeker % 3) == 2)
- DebugPrintf("\n");
+ debugPrintf("\n");
}
- DebugPrintf("\n");
+ debugPrintf("\n");
return true;
}
@@ -610,9 +613,9 @@ bool Console::cmdParserWords(int argc, const char **argv) {
bool Console::cmdSetParseNodes(int argc, const char **argv) {
if (argc < 2) {
- DebugPrintf("Sets the contents of all parse nodes.\n");
- DebugPrintf("Usage: %s <parse node1> <parse node2> ... <parse noden>\n", argv[0]);
- DebugPrintf("Tokens should be separated by blanks and enclosed in parentheses\n");
+ debugPrintf("Sets the contents of all parse nodes.\n");
+ debugPrintf("Usage: %s <parse node1> <parse node2> ... <parse noden>\n", argv[0]);
+ debugPrintf("Tokens should be separated by blanks and enclosed in parentheses\n");
return true;
}
@@ -643,46 +646,62 @@ bool Console::cmdSetParseNodes(int argc, const char **argv) {
bool Console::cmdRegisters(int argc, const char **argv) {
EngineState *s = _engine->_gamestate;
- DebugPrintf("Current register values:\n");
- DebugPrintf("acc=%04x:%04x prev=%04x:%04x &rest=%x\n", PRINT_REG(s->r_acc), PRINT_REG(s->r_prev), s->r_rest);
+ debugPrintf("Current register values:\n");
+ debugPrintf("acc=%04x:%04x prev=%04x:%04x &rest=%x\n", PRINT_REG(s->r_acc), PRINT_REG(s->r_prev), s->r_rest);
if (!s->_executionStack.empty()) {
- DebugPrintf("pc=%04x:%04x obj=%04x:%04x fp=ST:%04x sp=ST:%04x\n",
+ debugPrintf("pc=%04x:%04x obj=%04x:%04x fp=ST:%04x sp=ST:%04x\n",
PRINT_REG(s->xs->addr.pc), PRINT_REG(s->xs->objp),
(unsigned)(s->xs->fp - s->stack_base), (unsigned)(s->xs->sp - s->stack_base));
} else
- DebugPrintf("<no execution stack: pc,obj,fp omitted>\n");
+ debugPrintf("<no execution stack: pc,obj,fp omitted>\n");
return true;
}
bool Console::cmdDiskDump(int argc, const char **argv) {
+ int resNumFrom = 0;
+ int resNumTo = 0;
+ int resNumCur = 0;
+
if (argc != 3) {
- DebugPrintf("Dumps the specified resource to disk as a patch file\n");
- DebugPrintf("Usage: %s <resource type> <resource number>\n", argv[0]);
+ debugPrintf("Dumps the specified resource to disk as a patch file\n");
+ debugPrintf("Usage: %s <resource type> <resource number>\n", argv[0]);
+ debugPrintf(" <resource number> may be '*' to dump all resources of given type\n");
cmdResourceTypes(argc, argv);
return true;
}
+
+ if (strcmp(argv[2], "*") == 0) {
+ resNumFrom = 0;
+ resNumTo = 65535;
+ } else {
+ resNumFrom = atoi(argv[2]);
+ resNumTo = resNumFrom;
+ }
- int resNum = atoi(argv[2]);
ResourceType res = parseResourceType(argv[1]);
if (res == kResourceTypeInvalid)
- DebugPrintf("Resource type '%s' is not valid\n", argv[1]);
+ debugPrintf("Resource type '%s' is not valid\n", argv[1]);
else {
- Resource *resource = _engine->getResMan()->findResource(ResourceId(res, resNum), 0);
- if (resource) {
- char outFileName[50];
- sprintf(outFileName, "%s.%03d", getResourceTypeName(res), resNum);
- Common::DumpFile *outFile = new Common::DumpFile();
- outFile->open(outFileName);
- resource->writeToStream(outFile);
- outFile->finalize();
- outFile->close();
- delete outFile;
- DebugPrintf("Resource %s.%03d (located in %s) has been dumped to disk\n", argv[1], resNum, resource->getResourceLocation().c_str());
- } else {
- DebugPrintf("Resource %s.%03d not found\n", argv[1], resNum);
+ for (resNumCur = resNumFrom; resNumCur <= resNumTo; resNumCur++) {
+ Resource *resource = _engine->getResMan()->findResource(ResourceId(res, resNumCur), 0);
+ if (resource) {
+ char outFileName[50];
+ sprintf(outFileName, "%s.%03d", getResourceTypeName(res), resNumCur);
+ Common::DumpFile *outFile = new Common::DumpFile();
+ outFile->open(outFileName);
+ resource->writeToStream(outFile);
+ outFile->finalize();
+ outFile->close();
+ delete outFile;
+ debugPrintf("Resource %s.%03d (located in %s) has been dumped to disk\n", argv[1], resNumCur, resource->getResourceLocation().c_str());
+ } else {
+ if (resNumFrom == resNumTo) {
+ debugPrintf("Resource %s.%03d not found\n", argv[1], resNumCur);
+ }
+ }
}
}
@@ -691,8 +710,8 @@ bool Console::cmdDiskDump(int argc, const char **argv) {
bool Console::cmdHexDump(int argc, const char **argv) {
if (argc != 3) {
- DebugPrintf("Dumps the specified resource to standard output\n");
- DebugPrintf("Usage: %s <resource type> <resource number>\n", argv[0]);
+ debugPrintf("Dumps the specified resource to standard output\n");
+ debugPrintf("Usage: %s <resource type> <resource number>\n", argv[0]);
cmdResourceTypes(argc, argv);
return true;
}
@@ -701,14 +720,14 @@ bool Console::cmdHexDump(int argc, const char **argv) {
ResourceType res = parseResourceType(argv[1]);
if (res == kResourceTypeInvalid)
- DebugPrintf("Resource type '%s' is not valid\n", argv[1]);
+ debugPrintf("Resource type '%s' is not valid\n", argv[1]);
else {
Resource *resource = _engine->getResMan()->findResource(ResourceId(res, resNum), 0);
if (resource) {
Common::hexdump(resource->data, resource->size, 16, 0);
- DebugPrintf("Resource %s.%03d has been dumped to standard output\n", argv[1], resNum);
+ debugPrintf("Resource %s.%03d has been dumped to standard output\n", argv[1], resNum);
} else {
- DebugPrintf("Resource %s.%03d not found\n", argv[1], resNum);
+ debugPrintf("Resource %s.%03d not found\n", argv[1], resNum);
}
}
@@ -717,21 +736,21 @@ bool Console::cmdHexDump(int argc, const char **argv) {
bool Console::cmdResourceId(int argc, const char **argv) {
if (argc != 2) {
- DebugPrintf("Identifies a resource number by splitting it up in resource type and resource number\n");
- DebugPrintf("Usage: %s <resource number>\n", argv[0]);
+ debugPrintf("Identifies a resource number by splitting it up in resource type and resource number\n");
+ debugPrintf("Usage: %s <resource number>\n", argv[0]);
return true;
}
int id = atoi(argv[1]);
- DebugPrintf("%s.%d (0x%x)\n", getResourceTypeName((ResourceType)(id >> 11)), id & 0x7ff, id & 0x7ff);
+ debugPrintf("%s.%d (0x%x)\n", getResourceTypeName((ResourceType)(id >> 11)), id & 0x7ff, id & 0x7ff);
return true;
}
bool Console::cmdDissectScript(int argc, const char **argv) {
if (argc != 2) {
- DebugPrintf("Examines a script\n");
- DebugPrintf("Usage: %s <script number>\n", argv[0]);
+ debugPrintf("Examines a script\n");
+ debugPrintf("Usage: %s <script number>\n", argv[0]);
return true;
}
@@ -745,13 +764,13 @@ bool Console::cmdRoomNumber(int argc, const char **argv) {
// The same functionality is provided by "vmvars g 13" (but this one is more straighforward)
if (argc != 2) {
- DebugPrintf("Current room number is %d\n", _engine->_gamestate->currentRoomNumber());
- DebugPrintf("Calling this command with the room number (in decimal or hexadecimal) changes the room\n");
+ debugPrintf("Current room number is %d\n", _engine->_gamestate->currentRoomNumber());
+ debugPrintf("Calling this command with the room number (in decimal or hexadecimal) changes the room\n");
} else {
Common::String roomNumberStr = argv[1];
int roomNumber = strtol(roomNumberStr.c_str(), NULL, roomNumberStr.hasSuffix("h") ? 16 : 10);
_engine->_gamestate->setRoomNumber(roomNumber);
- DebugPrintf("Room number changed to %d (%x in hex)\n", roomNumber, roomNumber);
+ debugPrintf("Room number changed to %d (%x in hex)\n", roomNumber, roomNumber);
}
return true;
@@ -759,8 +778,8 @@ bool Console::cmdRoomNumber(int argc, const char **argv) {
bool Console::cmdResourceInfo(int argc, const char **argv) {
if (argc != 3) {
- DebugPrintf("Shows information about a resource\n");
- DebugPrintf("Usage: %s <resource type> <resource number>\n", argv[0]);
+ debugPrintf("Shows information about a resource\n");
+ debugPrintf("Usage: %s <resource type> <resource number>\n", argv[0]);
return true;
}
@@ -768,14 +787,14 @@ bool Console::cmdResourceInfo(int argc, const char **argv) {
ResourceType res = parseResourceType(argv[1]);
if (res == kResourceTypeInvalid)
- DebugPrintf("Resource type '%s' is not valid\n", argv[1]);
+ debugPrintf("Resource type '%s' is not valid\n", argv[1]);
else {
Resource *resource = _engine->getResMan()->findResource(ResourceId(res, resNum), 0);
if (resource) {
- DebugPrintf("Resource size: %d\n", resource->size);
- DebugPrintf("Resource location: %s\n", resource->getResourceLocation().c_str());
+ debugPrintf("Resource size: %d\n", resource->size);
+ debugPrintf("Resource location: %s\n", resource->getResourceLocation().c_str());
} else {
- DebugPrintf("Resource %s.%03d not found\n", argv[1], resNum);
+ debugPrintf("Resource %s.%03d not found\n", argv[1], resNum);
}
}
@@ -783,10 +802,10 @@ bool Console::cmdResourceInfo(int argc, const char **argv) {
}
bool Console::cmdResourceTypes(int argc, const char **argv) {
- DebugPrintf("The %d valid resource types are:\n", kResourceTypeInvalid);
+ debugPrintf("The %d valid resource types are:\n", kResourceTypeInvalid);
for (int i = 0; i < kResourceTypeInvalid; i++) {
- DebugPrintf("%s", getResourceTypeName((ResourceType) i));
- DebugPrintf((i < kResourceTypeInvalid - 1) ? ", " : "\n");
+ debugPrintf("%s", getResourceTypeName((ResourceType) i));
+ debugPrintf((i < kResourceTypeInvalid - 1) ? ", " : "\n");
}
return true;
@@ -794,10 +813,10 @@ bool Console::cmdResourceTypes(int argc, const char **argv) {
bool Console::cmdHexgrep(int argc, const char **argv) {
if (argc < 4) {
- DebugPrintf("Searches some resources for a particular sequence of bytes, represented as decimal or hexadecimal numbers.\n");
- DebugPrintf("Usage: %s <resource type> <resource number> <search string>\n", argv[0]);
- DebugPrintf("<resource number> can be a specific resource number, or \"all\" for all of the resources of the specified type\n");
- DebugPrintf("EXAMPLES:\n hexgrep script all 0xe8 0x03 0xc8 0x00\n hexgrep pic 0x42 0xfe\n");
+ debugPrintf("Searches some resources for a particular sequence of bytes, represented as decimal or hexadecimal numbers.\n");
+ debugPrintf("Usage: %s <resource type> <resource number> <search string>\n", argv[0]);
+ debugPrintf("<resource number> can be a specific resource number, or \"all\" for all of the resources of the specified type\n");
+ debugPrintf("EXAMPLES:\n hexgrep script all 0xe8 0x03 0xc8 0x00\n hexgrep pic 0x42 0xfe\n");
cmdResourceTypes(argc, argv);
return true;
}
@@ -807,7 +826,7 @@ bool Console::cmdHexgrep(int argc, const char **argv) {
Resource *script = NULL;
if (restype == kResourceTypeInvalid) {
- DebugPrintf("Resource type '%s' is not valid\n", argv[1]);
+ debugPrintf("Resource type '%s' is not valid\n", argv[1]);
return true;
}
@@ -845,10 +864,10 @@ bool Console::cmdHexgrep(int argc, const char **argv) {
seeker = seekerold + 1;
if (!output_script_name) {
- DebugPrintf("\nIn %s.%03d:\n", getResourceTypeName((ResourceType)restype), resNumber);
+ debugPrintf("\nIn %s.%03d:\n", getResourceTypeName((ResourceType)restype), resNumber);
output_script_name = 1;
}
- DebugPrintf(" 0x%04x\n", seekerold);
+ debugPrintf(" 0x%04x\n", seekerold);
}
} else
comppos = 0;
@@ -863,38 +882,38 @@ bool Console::cmdHexgrep(int argc, const char **argv) {
bool Console::cmdVerifyScripts(int argc, const char **argv) {
if (getSciVersion() < SCI_VERSION_1_1) {
- DebugPrintf("This script check is only meant for SCI1.1-SCI3 games\n");
+ debugPrintf("This script check is only meant for SCI1.1-SCI3 games\n");
return true;
}
Common::List<ResourceId> resources = _engine->getResMan()->listResources(kResourceTypeScript);
Common::sort(resources.begin(), resources.end());
- DebugPrintf("%d SCI1.1-SCI3 scripts found, performing sanity checks...\n", resources.size());
+ debugPrintf("%d SCI1.1-SCI3 scripts found, performing sanity checks...\n", resources.size());
Resource *script, *heap;
Common::List<ResourceId>::iterator itr;
for (itr = resources.begin(); itr != resources.end(); ++itr) {
script = _engine->getResMan()->findResource(*itr, false);
if (!script)
- DebugPrintf("Error: script %d couldn't be loaded\n", itr->getNumber());
+ debugPrintf("Error: script %d couldn't be loaded\n", itr->getNumber());
if (getSciVersion() <= SCI_VERSION_2_1) {
heap = _engine->getResMan()->findResource(ResourceId(kResourceTypeHeap, itr->getNumber()), false);
if (!heap)
- DebugPrintf("Error: script %d doesn't have a corresponding heap\n", itr->getNumber());
+ debugPrintf("Error: script %d doesn't have a corresponding heap\n", itr->getNumber());
if (script && heap && (script->size + heap->size > 65535))
- DebugPrintf("Error: script and heap %d together are larger than 64KB (%d bytes)\n",
+ debugPrintf("Error: script and heap %d together are larger than 64KB (%d bytes)\n",
itr->getNumber(), script->size + heap->size);
} else { // SCI3
if (script && script->size > 65535)
- DebugPrintf("Error: script %d is larger than 64KB (%d bytes)\n",
+ debugPrintf("Error: script %d is larger than 64KB (%d bytes)\n",
itr->getNumber(), script->size);
}
}
- DebugPrintf("SCI1.1-SCI2.1 script check finished\n");
+ debugPrintf("SCI1.1-SCI2.1 script check finished\n");
return true;
}
@@ -931,9 +950,9 @@ bool Console::cmdShowInstruments(int argc, const char **argv) {
instrumentsSongs[i][j] = false;
if (songNumber == -1) {
- DebugPrintf("%d sounds found, checking their instrument mappings...\n", resources.size());
- DebugPrintf("Instruments:\n");
- DebugPrintf("============\n");
+ debugPrintf("%d sounds found, checking their instrument mappings...\n", resources.size());
+ debugPrintf("Instruments:\n");
+ debugPrintf("============\n");
}
Common::List<ResourceId>::iterator itr;
@@ -956,7 +975,7 @@ bool Console::cmdShowInstruments(int argc, const char **argv) {
bool endOfTrack = false;
bool firstOneShown = false;
- DebugPrintf("Song %d: ", itr->getNumber());
+ debugPrintf("Song %d: ", itr->getNumber());
do {
while (*channelData == 0xF8)
@@ -984,9 +1003,9 @@ bool Console::cmdShowInstruments(int argc, const char **argv) {
if (!firstOneShown)
firstOneShown = true;
else
- DebugPrintf(",");
+ debugPrintf(",");
- DebugPrintf(" %d", instrument);
+ debugPrintf(" %d", instrument);
instruments[instrument]++;
instrumentsSongs[instrument][itr->getNumber()] = true;
} else {
@@ -1024,44 +1043,44 @@ bool Console::cmdShowInstruments(int argc, const char **argv) {
}
} while (!endOfTrack);
- DebugPrintf("\n");
+ debugPrintf("\n");
}
delete parser;
delete player;
- DebugPrintf("\n");
+ debugPrintf("\n");
if (songNumber == -1) {
- DebugPrintf("Used instruments: ");
+ debugPrintf("Used instruments: ");
for (int i = 0; i < 128; i++) {
if (instruments[i] > 0)
- DebugPrintf("%d, ", i);
+ debugPrintf("%d, ", i);
}
- DebugPrintf("\n\n");
+ debugPrintf("\n\n");
}
- DebugPrintf("Instruments not mapped in the MT32->GM map: ");
+ debugPrintf("Instruments not mapped in the MT32->GM map: ");
for (int i = 0; i < 128; i++) {
if (instruments[i] > 0 && getGmInstrument(Mt32MemoryTimbreMaps[i]) == MIDI_UNMAPPED)
- DebugPrintf("%d, ", i);
+ debugPrintf("%d, ", i);
}
- DebugPrintf("\n\n");
+ debugPrintf("\n\n");
if (songNumber == -1) {
- DebugPrintf("Used instruments in songs:\n");
+ debugPrintf("Used instruments in songs:\n");
for (int i = 0; i < 128; i++) {
if (instruments[i] > 0) {
- DebugPrintf("Instrument %d: ", i);
+ debugPrintf("Instrument %d: ", i);
for (int j = 0; j < 1000; j++) {
if (instrumentsSongs[i][j])
- DebugPrintf("%d, ", j);
+ debugPrintf("%d, ", j);
}
- DebugPrintf("\n");
+ debugPrintf("\n");
}
}
- DebugPrintf("\n\n");
+ debugPrintf("\n\n");
}
return true;
@@ -1069,13 +1088,13 @@ bool Console::cmdShowInstruments(int argc, const char **argv) {
bool Console::cmdMapInstrument(int argc, const char **argv) {
if (argc != 4) {
- DebugPrintf("Maps an MT-32 custom instrument to a GM instrument on the fly\n\n");
- DebugPrintf("Usage %s <MT-32 instrument name> <GM instrument> <GM rhythm key>\n", argv[0]);
- DebugPrintf("Each MT-32 instrument is always 10 characters and is mapped to either a GM instrument, or a GM rhythm key\n");
- DebugPrintf("A value of 255 (0xff) signifies an unmapped instrument\n");
- DebugPrintf("Please replace the spaces in the instrument name with underscores (\"_\"). They'll be converted to spaces afterwards\n\n");
- DebugPrintf("Example: %s test_0__XX 1 255\n", argv[0]);
- DebugPrintf("The above example will map the MT-32 instrument \"test 0 XX\" to GM instrument 1\n\n");
+ debugPrintf("Maps an MT-32 custom instrument to a GM instrument on the fly\n\n");
+ debugPrintf("Usage %s <MT-32 instrument name> <GM instrument> <GM rhythm key>\n", argv[0]);
+ debugPrintf("Each MT-32 instrument is always 10 characters and is mapped to either a GM instrument, or a GM rhythm key\n");
+ debugPrintf("A value of 255 (0xff) signifies an unmapped instrument\n");
+ debugPrintf("Please replace the spaces in the instrument name with underscores (\"_\"). They'll be converted to spaces afterwards\n\n");
+ debugPrintf("Example: %s test_0__XX 1 255\n", argv[0]);
+ debugPrintf("The above example will map the MT-32 instrument \"test 0 XX\" to GM instrument 1\n\n");
} else {
if (Mt32dynamicMappings != NULL) {
Mt32ToGmMap newMapping;
@@ -1093,11 +1112,11 @@ bool Console::cmdMapInstrument(int argc, const char **argv) {
}
}
- DebugPrintf("Current dynamic mappings:\n");
+ debugPrintf("Current dynamic mappings:\n");
if (Mt32dynamicMappings != NULL) {
const Mt32ToGmMapList::iterator end = Mt32dynamicMappings->end();
for (Mt32ToGmMapList::iterator it = Mt32dynamicMappings->begin(); it != end; ++it) {
- DebugPrintf("\"%s\" -> %d / %d\n", (*it).name, (*it).gmInstr, (*it).gmRhythmKey);
+ debugPrintf("\"%s\" -> %d / %d\n", (*it).name, (*it).gmInstr, (*it).gmRhythmKey);
}
}
@@ -1106,7 +1125,7 @@ bool Console::cmdMapInstrument(int argc, const char **argv) {
bool Console::cmdList(int argc, const char **argv) {
if (argc < 2) {
- DebugPrintf("Lists all the resources of a given type\n");
+ debugPrintf("Lists all the resources of a given type\n");
cmdResourceTypes(argc, argv);
return true;
}
@@ -1114,13 +1133,13 @@ bool Console::cmdList(int argc, const char **argv) {
ResourceType res = parseResourceType(argv[1]);
if (res == kResourceTypeInvalid)
- DebugPrintf("Unknown resource type: '%s'\n", argv[1]);
+ debugPrintf("Unknown resource type: '%s'\n", argv[1]);
else {
int number = -1;
if ((res == kResourceTypeAudio36) || (res == kResourceTypeSync36)) {
if (argc != 3) {
- DebugPrintf("Please specify map number (-1: all maps)\n");
+ debugPrintf("Please specify map number (-1: all maps)\n");
return true;
}
number = atoi(argv[2]);
@@ -1133,18 +1152,18 @@ bool Console::cmdList(int argc, const char **argv) {
Common::List<ResourceId>::iterator itr;
for (itr = resources.begin(); itr != resources.end(); ++itr) {
if (number == -1) {
- DebugPrintf("%8i", itr->getNumber());
+ debugPrintf("%8i", itr->getNumber());
if (++cnt % 10 == 0)
- DebugPrintf("\n");
+ debugPrintf("\n");
} else if (number == (int)itr->getNumber()) {
const uint32 tuple = itr->getTuple();
- DebugPrintf("(%3i, %3i, %3i, %3i) ", (tuple >> 24) & 0xff, (tuple >> 16) & 0xff,
+ debugPrintf("(%3i, %3i, %3i, %3i) ", (tuple >> 24) & 0xff, (tuple >> 16) & 0xff,
(tuple >> 8) & 0xff, tuple & 0xff);
if (++cnt % 4 == 0)
- DebugPrintf("\n");
+ debugPrintf("\n");
}
}
- DebugPrintf("\n");
+ debugPrintf("\n");
}
return true;
@@ -1152,8 +1171,8 @@ bool Console::cmdList(int argc, const char **argv) {
bool Console::cmdSaveGame(int argc, const char **argv) {
if (argc != 2) {
- DebugPrintf("Saves the current game state to the hard disk\n");
- DebugPrintf("Usage: %s <filename>\n", argv[0]);
+ debugPrintf("Saves the current game state to the hard disk\n");
+ debugPrintf("Usage: %s <filename>\n", argv[0]);
return true;
}
@@ -1163,19 +1182,19 @@ bool Console::cmdSaveGame(int argc, const char **argv) {
result++;
if (result)
- DebugPrintf("Note: Game state has %d open file handles.\n", result);
+ debugPrintf("Note: Game state has %d open file handles.\n", result);
Common::SaveFileManager *saveFileMan = g_engine->getSaveFileManager();
Common::OutSaveFile *out = saveFileMan->openForSaving(argv[1]);
const char *version = "";
if (!out) {
- DebugPrintf("Error opening savegame \"%s\" for writing\n", argv[1]);
+ debugPrintf("Error opening savegame \"%s\" for writing\n", argv[1]);
return true;
}
// TODO: enable custom descriptions? force filename into a specific format?
if (!gamestate_save(_engine->_gamestate, out, "debugging", version)) {
- DebugPrintf("Saving the game state to '%s' failed\n", argv[1]);
+ debugPrintf("Saving the game state to '%s' failed\n", argv[1]);
} else {
out->finalize();
if (out->err()) {
@@ -1189,8 +1208,8 @@ bool Console::cmdSaveGame(int argc, const char **argv) {
bool Console::cmdRestoreGame(int argc, const char **argv) {
if (argc != 2) {
- DebugPrintf("Restores a saved game from the hard disk\n");
- DebugPrintf("Usage: %s <filename>\n", argv[0]);
+ debugPrintf("Restores a saved game from the hard disk\n");
+ debugPrintf("Usage: %s <filename>\n", argv[0]);
return true;
}
@@ -1203,17 +1222,17 @@ bool Console::cmdRestoreGame(int argc, const char **argv) {
}
if (_engine->_gamestate->r_acc == make_reg(0, 1)) {
- DebugPrintf("Restoring gamestate '%s' failed.\n", argv[1]);
+ debugPrintf("Restoring gamestate '%s' failed.\n", argv[1]);
return true;
}
- return Cmd_Exit(0, 0);
+ return cmdExit(0, 0);
}
bool Console::cmdRestartGame(int argc, const char **argv) {
_engine->_gamestate->abortScriptProcessing = kAbortRestartGame;
- return Cmd_Exit(0, 0);
+ return cmdExit(0, 0);
}
// The scripts get IDs ranging from 100->199, because the scripts require us to assign unique ids THAT EVEN STAY BETWEEN
@@ -1231,25 +1250,25 @@ bool Console::cmdListSaves(int argc, const char **argv) {
for (uint i = 0; i < saves.size(); i++) {
Common::String filename = g_sci->getSavegameName(saves[i].id);
- DebugPrintf("%s: '%s'\n", filename.c_str(), saves[i].name);
+ debugPrintf("%s: '%s'\n", filename.c_str(), saves[i].name);
}
return true;
}
bool Console::cmdClassTable(int argc, const char **argv) {
- DebugPrintf("Available classes (parse a parameter to filter the table by a specific class):\n");
+ debugPrintf("Available classes (parse a parameter to filter the table by a specific class):\n");
for (uint i = 0; i < _engine->_gamestate->_segMan->classTableSize(); i++) {
Class temp = _engine->_gamestate->_segMan->_classTable[i];
if (temp.reg.getSegment()) {
const char *className = _engine->_gamestate->_segMan->getObjectName(temp.reg);
if (argc == 1 || (argc == 2 && !strcmp(className, argv[1]))) {
- DebugPrintf(" Class 0x%x (%s) at %04x:%04x (script %d)\n", i,
+ debugPrintf(" Class 0x%x (%s) at %04x:%04x (script %d)\n", i,
className,
PRINT_REG(temp.reg),
temp.script);
- } else DebugPrintf(" Class 0x%x (not loaded; can't get name) (script %d)\n", i, temp.script);
+ } else debugPrintf(" Class 0x%x (not loaded; can't get name) (script %d)\n", i, temp.script);
}
}
@@ -1257,52 +1276,52 @@ bool Console::cmdClassTable(int argc, const char **argv) {
}
bool Console::cmdSentenceFragments(int argc, const char **argv) {
- DebugPrintf("Sentence fragments (used to build Parse trees)\n");
+ debugPrintf("Sentence fragments (used to build Parse trees)\n");
for (uint i = 0; i < _engine->getVocabulary()->getParserBranchesSize(); i++) {
int j = 0;
const parse_tree_branch_t &branch = _engine->getVocabulary()->getParseTreeBranch(i);
- DebugPrintf("R%02d: [%x] ->", i, branch.id);
+ debugPrintf("R%02d: [%x] ->", i, branch.id);
while ((j < 10) && branch.data[j]) {
int dat = branch.data[j++];
switch (dat) {
case VOCAB_TREE_NODE_COMPARE_TYPE:
dat = branch.data[j++];
- DebugPrintf(" C(%x)", dat);
+ debugPrintf(" C(%x)", dat);
break;
case VOCAB_TREE_NODE_COMPARE_GROUP:
dat = branch.data[j++];
- DebugPrintf(" WG(%x)", dat);
+ debugPrintf(" WG(%x)", dat);
break;
case VOCAB_TREE_NODE_FORCE_STORAGE:
dat = branch.data[j++];
- DebugPrintf(" FORCE(%x)", dat);
+ debugPrintf(" FORCE(%x)", dat);
break;
default:
if (dat > VOCAB_TREE_NODE_LAST_WORD_STORAGE) {
int dat2 = branch.data[j++];
- DebugPrintf(" %x[%x]", dat, dat2);
+ debugPrintf(" %x[%x]", dat, dat2);
} else
- DebugPrintf(" ?%x?", dat);
+ debugPrintf(" ?%x?", dat);
}
}
- DebugPrintf("\n");
+ debugPrintf("\n");
}
- DebugPrintf("%d rules.\n", _engine->getVocabulary()->getParserBranchesSize());
+ debugPrintf("%d rules.\n", _engine->getVocabulary()->getParserBranchesSize());
return true;
}
bool Console::cmdParse(int argc, const char **argv) {
if (argc < 2) {
- DebugPrintf("Parses a sequence of words with a GNF rule set and prints the resulting parse tree\n");
- DebugPrintf("Usage: %s <word1> <word2> ... <wordn>\n", argv[0]);
+ debugPrintf("Parses a sequence of words with a GNF rule set and prints the resulting parse tree\n");
+ debugPrintf("Usage: %s <word1> <word2> ... <wordn>\n", argv[0]);
return true;
}
@@ -1316,7 +1335,7 @@ bool Console::cmdParse(int argc, const char **argv) {
strcat(string, argv[i]);
}
- DebugPrintf("Parsing '%s'\n", string);
+ debugPrintf("Parsing '%s'\n", string);
ResultWordListList words;
bool res = _engine->getVocabulary()->tokenizeString(words, string, &error);
@@ -1325,26 +1344,26 @@ bool Console::cmdParse(int argc, const char **argv) {
_engine->getVocabulary()->synonymizeTokens(words);
- DebugPrintf("Parsed to the following blocks:\n");
+ debugPrintf("Parsed to the following blocks:\n");
for (ResultWordListList::const_iterator i = words.begin(); i != words.end(); ++i) {
- DebugPrintf(" ");
+ debugPrintf(" ");
for (ResultWordList::const_iterator j = i->begin(); j != i->end(); ++j) {
- DebugPrintf("%sType[%04x] Group[%04x]", j == i->begin() ? "" : " / ", j->_class, j->_group);
+ debugPrintf("%sType[%04x] Group[%04x]", j == i->begin() ? "" : " / ", j->_class, j->_group);
}
- DebugPrintf("\n");
+ debugPrintf("\n");
}
if (_engine->getVocabulary()->parseGNF(words, true))
syntax_fail = 1; // Building a tree failed
if (syntax_fail)
- DebugPrintf("Building a tree failed.\n");
+ debugPrintf("Building a tree failed.\n");
else
_engine->getVocabulary()->dumpParseTree();
} else {
- DebugPrintf("Unknown word: '%s'\n", error);
+ debugPrintf("Unknown word: '%s'\n", error);
free(error);
}
@@ -1353,10 +1372,10 @@ bool Console::cmdParse(int argc, const char **argv) {
bool Console::cmdSaid(int argc, const char **argv) {
if (argc < 2) {
- DebugPrintf("Matches a string against a said spec\n");
- DebugPrintf("Usage: %s <string> > & <said spec>\n", argv[0]);
- DebugPrintf("<string> is a sequence of actual words.\n");
- DebugPrintf("<said spec> is a sequence of hex tokens.\n");
+ debugPrintf("Matches a string against a said spec\n");
+ debugPrintf("Usage: %s <string> > & <said spec>\n", argv[0]);
+ debugPrintf("<string> is a sequence of actual words.\n");
+ debugPrintf("<said spec> is a sequence of hex tokens.\n");
return true;
}
@@ -1373,10 +1392,10 @@ bool Console::cmdSaid(int argc, const char **argv) {
}
if (p >= argc-1) {
- DebugPrintf("Matches a string against a said spec\n");
- DebugPrintf("Usage: %s <string> > & <said spec>\n", argv[0]);
- DebugPrintf("<string> is a sequence of actual words.\n");
- DebugPrintf("<said spec> is a sequence of hex tokens.\n");
+ debugPrintf("Matches a string against a said spec\n");
+ debugPrintf("Usage: %s <string> > & <said spec>\n", argv[0]);
+ debugPrintf("<string> is a sequence of actual words.\n");
+ debugPrintf("<said spec> is a sequence of hex tokens.\n");
return true;
}
@@ -1440,14 +1459,14 @@ bool Console::cmdSaid(int argc, const char **argv) {
_engine->getVocabulary()->synonymizeTokens(words);
- DebugPrintf("Parsed to the following blocks:\n");
+ debugPrintf("Parsed to the following blocks:\n");
for (ResultWordListList::const_iterator i = words.begin(); i != words.end(); ++i) {
- DebugPrintf(" ");
+ debugPrintf(" ");
for (ResultWordList::const_iterator j = i->begin(); j != i->end(); ++j) {
- DebugPrintf("%sType[%04x] Group[%04x]", j == i->begin() ? "" : " / ", j->_class, j->_group);
+ debugPrintf("%sType[%04x] Group[%04x]", j == i->begin() ? "" : " / ", j->_class, j->_group);
}
- DebugPrintf("\n");
+ debugPrintf("\n");
}
@@ -1456,17 +1475,17 @@ bool Console::cmdSaid(int argc, const char **argv) {
syntax_fail = 1; // Building a tree failed
if (syntax_fail)
- DebugPrintf("Building a tree failed.\n");
+ debugPrintf("Building a tree failed.\n");
else {
_engine->getVocabulary()->dumpParseTree();
_engine->getVocabulary()->parserIsValid = true;
int ret = said((byte *)spec, true);
- DebugPrintf("kSaid: %s\n", (ret == SAID_NO_MATCH ? "No match" : "Match"));
+ debugPrintf("kSaid: %s\n", (ret == SAID_NO_MATCH ? "No match" : "Match"));
}
} else {
- DebugPrintf("Unknown word: '%s'\n", error);
+ debugPrintf("Unknown word: '%s'\n", error);
free(error);
}
@@ -1476,9 +1495,9 @@ bool Console::cmdSaid(int argc, const char **argv) {
bool Console::cmdParserNodes(int argc, const char **argv) {
if (argc != 2) {
- DebugPrintf("Shows the specified number of nodes from the parse node tree\n");
- DebugPrintf("Usage: %s <nr>\n", argv[0]);
- DebugPrintf("where <nr> is the number of nodes to show from the parse node tree\n");
+ debugPrintf("Shows the specified number of nodes from the parse node tree\n");
+ debugPrintf("Usage: %s <nr>\n", argv[0]);
+ debugPrintf("where <nr> is the number of nodes to show from the parse node tree\n");
return true;
}
@@ -1491,9 +1510,9 @@ bool Console::cmdParserNodes(int argc, const char **argv) {
bool Console::cmdSetPalette(int argc, const char **argv) {
if (argc < 2) {
- DebugPrintf("Sets a palette resource\n");
- DebugPrintf("Usage: %s <resourceId>\n", argv[0]);
- DebugPrintf("where <resourceId> is the number of the palette resource to set\n");
+ debugPrintf("Sets a palette resource\n");
+ debugPrintf("Usage: %s <resourceId>\n", argv[0]);
+ debugPrintf("where <resourceId> is the number of the palette resource to set\n");
return true;
}
@@ -1505,9 +1524,9 @@ bool Console::cmdSetPalette(int argc, const char **argv) {
bool Console::cmdDrawPic(int argc, const char **argv) {
if (argc < 2) {
- DebugPrintf("Draws a pic resource\n");
- DebugPrintf("Usage: %s <resourceId>\n", argv[0]);
- DebugPrintf("where <resourceId> is the number of the pic resource to draw\n");
+ debugPrintf("Draws a pic resource\n");
+ debugPrintf("Usage: %s <resourceId>\n", argv[0]);
+ debugPrintf("where <resourceId> is the number of the pic resource to draw\n");
return true;
}
@@ -1532,9 +1551,9 @@ bool Console::cmdDrawPic(int argc, const char **argv) {
bool Console::cmdDrawCel(int argc, const char **argv) {
if (argc < 4) {
- DebugPrintf("Draws a cel from a view resource\n");
- DebugPrintf("Usage: %s <resourceId> <loopNr> <celNr> \n", argv[0]);
- DebugPrintf("where <resourceId> is the number of the view resource to draw\n");
+ debugPrintf("Draws a cel from a view resource\n");
+ debugPrintf("Usage: %s <resourceId> <loopNr> <celNr> \n", argv[0]);
+ debugPrintf("where <resourceId> is the number of the view resource to draw\n");
return true;
}
@@ -1555,24 +1574,24 @@ bool Console::cmdDrawCel(int argc, const char **argv) {
bool Console::cmdUndither(int argc, const char **argv) {
if (argc != 2) {
- DebugPrintf("Enable/disable undithering.\n");
- DebugPrintf("Usage: %s <0/1>\n", argv[0]);
+ debugPrintf("Enable/disable undithering.\n");
+ debugPrintf("Usage: %s <0/1>\n", argv[0]);
return true;
}
bool flag = atoi(argv[1]) ? true : false;
_engine->_gfxScreen->enableUndithering(flag);
if (flag)
- DebugPrintf("undithering ENABLED\n");
+ debugPrintf("undithering ENABLED\n");
else
- DebugPrintf("undithering DISABLED\n");
+ debugPrintf("undithering DISABLED\n");
return true;
}
bool Console::cmdPicVisualize(int argc, const char **argv) {
if (argc != 2) {
- DebugPrintf("Enable/disable picture visualization (EGA only)\n");
- DebugPrintf("Usage: %s <0/1>\n", argv[0]);
+ debugPrintf("Enable/disable picture visualization (EGA only)\n");
+ debugPrintf("Usage: %s <0/1>\n", argv[0]);
return true;
}
@@ -1581,21 +1600,21 @@ bool Console::cmdPicVisualize(int argc, const char **argv) {
if (_engine->_resMan->getViewType() == kViewEga) {
_engine->_gfxPaint16->debugSetEGAdrawingVisualize(state);
if (state)
- DebugPrintf("picture visualization ENABLED\n");
+ debugPrintf("picture visualization ENABLED\n");
else
- DebugPrintf("picture visualization DISABLED\n");
+ debugPrintf("picture visualization DISABLED\n");
} else {
- DebugPrintf("picture visualization only available for EGA games\n");
+ debugPrintf("picture visualization only available for EGA games\n");
}
return true;
}
bool Console::cmdPlayVideo(int argc, const char **argv) {
if (argc < 2) {
- DebugPrintf("Plays a SEQ, AVI, VMD, RBT or DUK video.\n");
- DebugPrintf("Usage: %s <video file name> <delay>\n", argv[0]);
- DebugPrintf("The video file name should include the extension\n");
- DebugPrintf("Delay is only used in SEQ videos and is measured in ticks (default: 10)\n");
+ debugPrintf("Plays a SEQ, AVI, VMD, RBT or DUK video.\n");
+ debugPrintf("Usage: %s <video file name> <delay>\n", argv[0]);
+ debugPrintf("The video file name should include the extension\n");
+ debugPrintf("Delay is only used in SEQ videos and is measured in ticks (default: 10)\n");
return true;
}
@@ -1606,29 +1625,29 @@ bool Console::cmdPlayVideo(int argc, const char **argv) {
filename.hasSuffix(".rbt") || filename.hasSuffix(".duk")) {
_videoFile = filename;
_videoFrameDelay = (argc == 2) ? 10 : atoi(argv[2]);
- return Cmd_Exit(0, 0);
+ return cmdExit(0, 0);
} else {
- DebugPrintf("Unknown video file type\n");
+ debugPrintf("Unknown video file type\n");
return true;
}
}
bool Console::cmdAnimateList(int argc, const char **argv) {
if (_engine->_gfxAnimate) {
- DebugPrintf("Animate list:\n");
+ debugPrintf("Animate list:\n");
_engine->_gfxAnimate->printAnimateList(this);
} else {
- DebugPrintf("This SCI version does not have an animate list\n");
+ debugPrintf("This SCI version does not have an animate list\n");
}
return true;
}
bool Console::cmdWindowList(int argc, const char **argv) {
if (_engine->_gfxPorts) {
- DebugPrintf("Window list:\n");
+ debugPrintf("Window list:\n");
_engine->_gfxPorts->printWindowList(this);
} else {
- DebugPrintf("This SCI version does not have a list of ports\n");
+ debugPrintf("This SCI version does not have a list of ports\n");
}
return true;
}
@@ -1636,41 +1655,41 @@ bool Console::cmdWindowList(int argc, const char **argv) {
bool Console::cmdPlaneList(int argc, const char **argv) {
#ifdef ENABLE_SCI32
if (_engine->_gfxFrameout) {
- DebugPrintf("Plane list:\n");
+ debugPrintf("Plane list:\n");
_engine->_gfxFrameout->printPlaneList(this);
} else {
- DebugPrintf("This SCI version does not have a list of planes\n");
+ debugPrintf("This SCI version does not have a list of planes\n");
}
#else
- DebugPrintf("SCI32 isn't included in this compiled executable\n");
+ debugPrintf("SCI32 isn't included in this compiled executable\n");
#endif
return true;
}
bool Console::cmdPlaneItemList(int argc, const char **argv) {
if (argc != 2) {
- DebugPrintf("Shows the list of items for a plane\n");
- DebugPrintf("Usage: %s <plane address>\n", argv[0]);
+ debugPrintf("Shows the list of items for a plane\n");
+ debugPrintf("Usage: %s <plane address>\n", argv[0]);
return true;
}
reg_t planeObject = NULL_REG;
if (parse_reg_t(_engine->_gamestate, argv[1], &planeObject, false)) {
- DebugPrintf("Invalid address passed.\n");
- DebugPrintf("Check the \"addresses\" command on how to use addresses\n");
+ debugPrintf("Invalid address passed.\n");
+ debugPrintf("Check the \"addresses\" command on how to use addresses\n");
return true;
}
#ifdef ENABLE_SCI32
if (_engine->_gfxFrameout) {
- DebugPrintf("Plane item list:\n");
+ debugPrintf("Plane item list:\n");
_engine->_gfxFrameout->printPlaneItemList(this, planeObject);
} else {
- DebugPrintf("This SCI version does not have a list of plane items\n");
+ debugPrintf("This SCI version does not have a list of plane items\n");
}
#else
- DebugPrintf("SCI32 isn't included in this compiled executable\n");
+ debugPrintf("SCI32 isn't included in this compiled executable\n");
#endif
return true;
}
@@ -1680,7 +1699,7 @@ bool Console::cmdSavedBits(int argc, const char **argv) {
SegmentId id = segman->findSegmentByType(SEG_TYPE_HUNK);
HunkTable* hunks = (HunkTable *)segman->getSegmentObj(id);
if (!hunks) {
- DebugPrintf("No hunk segment found.\n");
+ debugPrintf("No hunk segment found.\n");
return true;
}
@@ -1693,7 +1712,7 @@ bool Console::cmdSavedBits(int argc, const char **argv) {
byte* memoryPtr = (byte *)h.mem;
if (memoryPtr) {
- DebugPrintf("%04x:%04x:", PRINT_REG(entries[i]));
+ debugPrintf("%04x:%04x:", PRINT_REG(entries[i]));
Common::Rect rect;
byte mask;
@@ -1702,17 +1721,17 @@ bool Console::cmdSavedBits(int argc, const char **argv) {
memcpy((void *)&rect, memoryPtr, sizeof(rect));
memcpy((void *)&mask, memoryPtr + sizeof(rect), sizeof(mask));
- DebugPrintf(" %d,%d - %d,%d", rect.top, rect.left,
+ debugPrintf(" %d,%d - %d,%d", rect.top, rect.left,
rect.bottom, rect.right);
if (mask & GFX_SCREEN_MASK_VISUAL)
- DebugPrintf(" visual");
+ debugPrintf(" visual");
if (mask & GFX_SCREEN_MASK_PRIORITY)
- DebugPrintf(" priority");
+ debugPrintf(" priority");
if (mask & GFX_SCREEN_MASK_CONTROL)
- DebugPrintf(" control");
+ debugPrintf(" control");
if (mask & GFX_SCREEN_MASK_DISPLAY)
- DebugPrintf(" display");
- DebugPrintf("\n");
+ debugPrintf(" display");
+ debugPrintf("\n");
}
}
}
@@ -1723,22 +1742,22 @@ bool Console::cmdSavedBits(int argc, const char **argv) {
bool Console::cmdShowSavedBits(int argc, const char **argv) {
if (argc < 2) {
- DebugPrintf("Display saved bits.\n");
- DebugPrintf("Usage: %s <address>\n", argv[0]);
- DebugPrintf("Check the \"addresses\" command on how to use addresses\n");
+ debugPrintf("Display saved bits.\n");
+ debugPrintf("Usage: %s <address>\n", argv[0]);
+ debugPrintf("Check the \"addresses\" command on how to use addresses\n");
return true;
}
reg_t memoryHandle = NULL_REG;
if (parse_reg_t(_engine->_gamestate, argv[1], &memoryHandle, false)) {
- DebugPrintf("Invalid address passed.\n");
- DebugPrintf("Check the \"addresses\" command on how to use addresses\n");
+ debugPrintf("Invalid address passed.\n");
+ debugPrintf("Check the \"addresses\" command on how to use addresses\n");
return true;
}
if (memoryHandle.isNull()) {
- DebugPrintf("Invalid address.\n");
+ debugPrintf("Invalid address.\n");
return true;
}
@@ -1746,26 +1765,26 @@ bool Console::cmdShowSavedBits(int argc, const char **argv) {
SegmentId id = segman->findSegmentByType(SEG_TYPE_HUNK);
HunkTable* hunks = (HunkTable *)segman->getSegmentObj(id);
if (!hunks) {
- DebugPrintf("No hunk segment found.\n");
+ debugPrintf("No hunk segment found.\n");
return true;
}
if (memoryHandle.getSegment() != id || !hunks->isValidOffset(memoryHandle.getOffset())) {
- DebugPrintf("Invalid address.\n");
+ debugPrintf("Invalid address.\n");
return true;
}
const Hunk& h = hunks->_table[memoryHandle.getOffset()];
if (strcmp(h.type, "SaveBits()") != 0) {
- DebugPrintf("Invalid address.\n");
+ debugPrintf("Invalid address.\n");
return true;
}
byte *memoryPtr = segman->getHunkPointer(memoryHandle);
if (!memoryPtr) {
- DebugPrintf("Invalid or freed bits.\n");
+ debugPrintf("Invalid or freed bits.\n");
return true;
}
@@ -1783,17 +1802,17 @@ bool Console::cmdShowSavedBits(int argc, const char **argv) {
Common::Point bl(rect.left, rect.bottom-1);
Common::Point br(rect.right-1, rect.bottom-1);
- DebugPrintf(" %d,%d - %d,%d", rect.top, rect.left,
+ debugPrintf(" %d,%d - %d,%d", rect.top, rect.left,
rect.bottom, rect.right);
if (mask & GFX_SCREEN_MASK_VISUAL)
- DebugPrintf(" visual");
+ debugPrintf(" visual");
if (mask & GFX_SCREEN_MASK_PRIORITY)
- DebugPrintf(" priority");
+ debugPrintf(" priority");
if (mask & GFX_SCREEN_MASK_CONTROL)
- DebugPrintf(" control");
+ debugPrintf(" control");
if (mask & GFX_SCREEN_MASK_DISPLAY)
- DebugPrintf(" display");
- DebugPrintf("\n");
+ debugPrintf(" display");
+ debugPrintf("\n");
if (!_engine->_gfxPaint16 || !_engine->_gfxScreen)
return true;
@@ -1843,7 +1862,7 @@ bool Console::cmdShowSavedBits(int argc, const char **argv) {
bool Console::cmdParseGrammar(int argc, const char **argv) {
- DebugPrintf("Parse grammar, in strict GNF:\n");
+ debugPrintf("Parse grammar, in strict GNF:\n");
_engine->getVocabulary()->buildGNF(true);
@@ -1851,71 +1870,71 @@ bool Console::cmdParseGrammar(int argc, const char **argv) {
}
bool Console::cmdPrintSegmentTable(int argc, const char **argv) {
- DebugPrintf("Segment table:\n");
+ debugPrintf("Segment table:\n");
for (uint i = 0; i < _engine->_gamestate->_segMan->_heap.size(); i++) {
SegmentObj *mobj = _engine->_gamestate->_segMan->_heap[i];
if (mobj && mobj->getType()) {
- DebugPrintf(" [%04x] ", i);
+ debugPrintf(" [%04x] ", i);
switch (mobj->getType()) {
case SEG_TYPE_SCRIPT:
- DebugPrintf("S script.%03d l:%d ", (*(Script *)mobj).getScriptNumber(), (*(Script *)mobj).getLockers());
+ debugPrintf("S script.%03d l:%d ", (*(Script *)mobj).getScriptNumber(), (*(Script *)mobj).getLockers());
break;
case SEG_TYPE_CLONES:
- DebugPrintf("C clones (%d allocd)", (*(CloneTable *)mobj).entries_used);
+ debugPrintf("C clones (%d allocd)", (*(CloneTable *)mobj).entries_used);
break;
case SEG_TYPE_LOCALS:
- DebugPrintf("V locals %03d", (*(LocalVariables *)mobj).script_id);
+ debugPrintf("V locals %03d", (*(LocalVariables *)mobj).script_id);
break;
case SEG_TYPE_STACK:
- DebugPrintf("D data stack (%d)", (*(DataStack *)mobj)._capacity);
+ debugPrintf("D data stack (%d)", (*(DataStack *)mobj)._capacity);
break;
case SEG_TYPE_LISTS:
- DebugPrintf("L lists (%d)", (*(ListTable *)mobj).entries_used);
+ debugPrintf("L lists (%d)", (*(ListTable *)mobj).entries_used);
break;
case SEG_TYPE_NODES:
- DebugPrintf("N nodes (%d)", (*(NodeTable *)mobj).entries_used);
+ debugPrintf("N nodes (%d)", (*(NodeTable *)mobj).entries_used);
break;
case SEG_TYPE_HUNK:
- DebugPrintf("H hunk (%d)", (*(HunkTable *)mobj).entries_used);
+ debugPrintf("H hunk (%d)", (*(HunkTable *)mobj).entries_used);
break;
case SEG_TYPE_DYNMEM:
- DebugPrintf("M dynmem: %d bytes", (*(DynMem *)mobj)._size);
+ debugPrintf("M dynmem: %d bytes", (*(DynMem *)mobj)._size);
break;
#ifdef ENABLE_SCI32
case SEG_TYPE_ARRAY:
- DebugPrintf("A SCI32 arrays (%d)", (*(ArrayTable *)mobj).entries_used);
+ debugPrintf("A SCI32 arrays (%d)", (*(ArrayTable *)mobj).entries_used);
break;
case SEG_TYPE_STRING:
- DebugPrintf("T SCI32 strings (%d)", (*(StringTable *)mobj).entries_used);
+ debugPrintf("T SCI32 strings (%d)", (*(StringTable *)mobj).entries_used);
break;
#endif
default:
- DebugPrintf("I Invalid (type = %x)", mobj->getType());
+ debugPrintf("I Invalid (type = %x)", mobj->getType());
break;
}
- DebugPrintf(" \n");
+ debugPrintf(" \n");
}
}
- DebugPrintf("\n");
+ debugPrintf("\n");
return true;
}
bool Console::segmentInfo(int nr) {
- DebugPrintf("[%04x] ", nr);
+ debugPrintf("[%04x] ", nr);
if ((nr < 0) || ((uint)nr >= _engine->_gamestate->_segMan->_heap.size()) || !_engine->_gamestate->_segMan->_heap[nr])
return false;
@@ -1926,30 +1945,30 @@ bool Console::segmentInfo(int nr) {
case SEG_TYPE_SCRIPT: {
Script *scr = (Script *)mobj;
- DebugPrintf("script.%03d locked by %d, bufsize=%d (%x)\n", scr->getScriptNumber(), scr->getLockers(), (uint)scr->getBufSize(), (uint)scr->getBufSize());
+ debugPrintf("script.%03d locked by %d, bufsize=%d (%x)\n", scr->getScriptNumber(), scr->getLockers(), (uint)scr->getBufSize(), (uint)scr->getBufSize());
if (scr->getExportTable())
- DebugPrintf(" Exports: %4d at %d\n", scr->getExportsNr(), (int)(((const byte *)scr->getExportTable()) - ((const byte *)scr->getBuf())));
+ debugPrintf(" Exports: %4d at %d\n", scr->getExportsNr(), (int)(((const byte *)scr->getExportTable()) - ((const byte *)scr->getBuf())));
else
- DebugPrintf(" Exports: none\n");
+ debugPrintf(" Exports: none\n");
- DebugPrintf(" Synonyms: %4d\n", scr->getSynonymsNr());
+ debugPrintf(" Synonyms: %4d\n", scr->getSynonymsNr());
if (scr->getLocalsCount() > 0)
- DebugPrintf(" Locals : %4d in segment 0x%x\n", scr->getLocalsCount(), scr->getLocalsSegment());
+ debugPrintf(" Locals : %4d in segment 0x%x\n", scr->getLocalsCount(), scr->getLocalsSegment());
else
- DebugPrintf(" Locals : none\n");
+ debugPrintf(" Locals : none\n");
ObjMap objects = scr->getObjectMap();
- DebugPrintf(" Objects: %4d\n", objects.size());
+ debugPrintf(" Objects: %4d\n", objects.size());
ObjMap::iterator it;
const ObjMap::iterator end = objects.end();
for (it = objects.begin(); it != end; ++it) {
- DebugPrintf(" ");
+ debugPrintf(" ");
// Object header
const Object *obj = _engine->_gamestate->_segMan->getObject(it->_value.getPos());
if (obj)
- DebugPrintf("[%04x:%04x] %s : %3d vars, %3d methods\n", PRINT_REG(it->_value.getPos()),
+ debugPrintf("[%04x:%04x] %s : %3d vars, %3d methods\n", PRINT_REG(it->_value.getPos()),
_engine->_gamestate->_segMan->getObjectName(it->_value.getPos()),
obj->getVarCount(), obj->getMethodCount());
}
@@ -1958,31 +1977,31 @@ bool Console::segmentInfo(int nr) {
case SEG_TYPE_LOCALS: {
LocalVariables *locals = (LocalVariables *)mobj;
- DebugPrintf("locals for script.%03d\n", locals->script_id);
- DebugPrintf(" %d (0x%x) locals\n", locals->_locals.size(), locals->_locals.size());
+ debugPrintf("locals for script.%03d\n", locals->script_id);
+ debugPrintf(" %d (0x%x) locals\n", locals->_locals.size(), locals->_locals.size());
}
break;
case SEG_TYPE_STACK: {
DataStack *stack = (DataStack *)mobj;
- DebugPrintf("stack\n");
- DebugPrintf(" %d (0x%x) entries\n", stack->_capacity, stack->_capacity);
+ debugPrintf("stack\n");
+ debugPrintf(" %d (0x%x) entries\n", stack->_capacity, stack->_capacity);
}
break;
case SEG_TYPE_CLONES: {
CloneTable *ct = (CloneTable *)mobj;
- DebugPrintf("clones\n");
+ debugPrintf("clones\n");
for (uint i = 0; i < ct->_table.size(); i++)
if (ct->isValidEntry(i)) {
reg_t objpos = make_reg(nr, i);
- DebugPrintf(" [%04x] %s; copy of ", i, _engine->_gamestate->_segMan->getObjectName(objpos));
+ debugPrintf(" [%04x] %s; copy of ", i, _engine->_gamestate->_segMan->getObjectName(objpos));
// Object header
const Object *obj = _engine->_gamestate->_segMan->getObject(ct->_table[i].getPos());
if (obj)
- DebugPrintf("[%04x:%04x] %s : %3d vars, %3d methods\n", PRINT_REG(ct->_table[i].getPos()),
+ debugPrintf("[%04x:%04x] %s : %3d vars, %3d methods\n", PRINT_REG(ct->_table[i].getPos()),
_engine->_gamestate->_segMan->getObjectName(ct->_table[i].getPos()),
obj->getVarCount(), obj->getMethodCount());
}
@@ -1992,34 +2011,34 @@ bool Console::segmentInfo(int nr) {
case SEG_TYPE_LISTS: {
ListTable *lt = (ListTable *)mobj;
- DebugPrintf("lists\n");
+ debugPrintf("lists\n");
for (uint i = 0; i < lt->_table.size(); i++)
if (lt->isValidEntry(i)) {
- DebugPrintf(" [%04x]: ", i);
+ debugPrintf(" [%04x]: ", i);
printList(&(lt->_table[i]));
}
}
break;
case SEG_TYPE_NODES: {
- DebugPrintf("nodes (total %d)\n", (*(NodeTable *)mobj).entries_used);
+ debugPrintf("nodes (total %d)\n", (*(NodeTable *)mobj).entries_used);
break;
}
case SEG_TYPE_HUNK: {
HunkTable *ht = (HunkTable *)mobj;
- DebugPrintf("hunk (total %d)\n", ht->entries_used);
+ debugPrintf("hunk (total %d)\n", ht->entries_used);
for (uint i = 0; i < ht->_table.size(); i++)
if (ht->isValidEntry(i)) {
- DebugPrintf(" [%04x] %d bytes at %p, type=%s\n",
+ debugPrintf(" [%04x] %d bytes at %p, type=%s\n",
i, ht->_table[i].size, ht->_table[i].mem, ht->_table[i].type);
}
}
break;
case SEG_TYPE_DYNMEM: {
- DebugPrintf("dynmem (%s): %d bytes\n",
+ debugPrintf("dynmem (%s): %d bytes\n",
(*(DynMem *)mobj)._description.c_str(), (*(DynMem *)mobj)._size);
Common::hexdump((*(DynMem *)mobj)._buf, (*(DynMem *)mobj)._size, 16, 0);
@@ -2028,28 +2047,28 @@ bool Console::segmentInfo(int nr) {
#ifdef ENABLE_SCI32
case SEG_TYPE_STRING:
- DebugPrintf("SCI32 strings\n");
+ debugPrintf("SCI32 strings\n");
break;
case SEG_TYPE_ARRAY:
- DebugPrintf("SCI32 arrays\n");
+ debugPrintf("SCI32 arrays\n");
break;
#endif
default :
- DebugPrintf("Invalid type %d\n", mobj->getType());
+ debugPrintf("Invalid type %d\n", mobj->getType());
break;
}
- DebugPrintf("\n");
+ debugPrintf("\n");
return true;
}
bool Console::cmdSegmentInfo(int argc, const char **argv) {
if (argc != 2) {
- DebugPrintf("Provides information on the specified segment(s)\n");
- DebugPrintf("Usage: %s <segment number>\n", argv[0]);
- DebugPrintf("<segment number> can be a number, which shows the information of the segment with\n");
- DebugPrintf("the specified number, or \"all\" to show information on all active segments\n");
+ debugPrintf("Provides information on the specified segment(s)\n");
+ debugPrintf("Usage: %s <segment number>\n", argv[0]);
+ debugPrintf("<segment number> can be a number, which shows the information of the segment with\n");
+ debugPrintf("the specified number, or \"all\" to show information on all active segments\n");
return true;
}
@@ -2061,7 +2080,7 @@ bool Console::cmdSegmentInfo(int argc, const char **argv) {
if (!parseInteger(argv[1], segmentNr))
return true;
if (!segmentInfo(segmentNr))
- DebugPrintf("Segment %04xh does not exist\n", segmentNr);
+ debugPrintf("Segment %04xh does not exist\n", segmentNr);
}
return true;
@@ -2070,8 +2089,8 @@ bool Console::cmdSegmentInfo(int argc, const char **argv) {
bool Console::cmdKillSegment(int argc, const char **argv) {
if (argc != 2) {
- DebugPrintf("Deletes the specified segment\n");
- DebugPrintf("Usage: %s <segment number>\n", argv[0]);
+ debugPrintf("Deletes the specified segment\n");
+ debugPrintf("Usage: %s <segment number>\n", argv[0]);
return true;
}
int segmentNumber;
@@ -2084,13 +2103,13 @@ bool Console::cmdKillSegment(int argc, const char **argv) {
bool Console::cmdShowMap(int argc, const char **argv) {
if (argc != 2) {
- DebugPrintf("Switches to one of the following screen maps\n");
- DebugPrintf("Usage: %s <screen map>\n", argv[0]);
- DebugPrintf("Screen maps:\n");
- DebugPrintf("- 0: visual map\n");
- DebugPrintf("- 1: priority map\n");
- DebugPrintf("- 2: control map\n");
- DebugPrintf("- 3: display screen\n");
+ debugPrintf("Switches to one of the following screen maps\n");
+ debugPrintf("Usage: %s <screen map>\n", argv[0]);
+ debugPrintf("Screen maps:\n");
+ debugPrintf("- 0: visual map\n");
+ debugPrintf("- 1: priority map\n");
+ debugPrintf("- 2: control map\n");
+ debugPrintf("- 3: display screen\n");
return true;
}
@@ -2105,14 +2124,14 @@ bool Console::cmdShowMap(int argc, const char **argv) {
break;
default:
- DebugPrintf("Map %d is not available.\n", map);
+ debugPrintf("Map %d is not available.\n", map);
return true;
}
- return Cmd_Exit(0, 0);
+ return cmdExit(0, 0);
}
bool Console::cmdSongLib(int argc, const char **argv) {
- DebugPrintf("Song library:\n");
+ debugPrintf("Song library:\n");
g_sci->_soundCmd->printPlayList(this);
return true;
@@ -2120,16 +2139,16 @@ bool Console::cmdSongLib(int argc, const char **argv) {
bool Console::cmdSongInfo(int argc, const char **argv) {
if (argc != 2) {
- DebugPrintf("Shows information about a given song in the playlist\n");
- DebugPrintf("Usage: %s <song object>\n", argv[0]);
+ debugPrintf("Shows information about a given song in the playlist\n");
+ debugPrintf("Usage: %s <song object>\n", argv[0]);
return true;
}
reg_t addr;
if (parse_reg_t(_engine->_gamestate, argv[1], &addr, false)) {
- DebugPrintf("Invalid address passed.\n");
- DebugPrintf("Check the \"addresses\" command on how to use addresses\n");
+ debugPrintf("Invalid address passed.\n");
+ debugPrintf("Check the \"addresses\" command on how to use addresses\n");
return true;
}
@@ -2140,38 +2159,38 @@ bool Console::cmdSongInfo(int argc, const char **argv) {
bool Console::cmdStartSound(int argc, const char **argv) {
if (argc != 2) {
- DebugPrintf("Adds the requested sound resource to the playlist, and starts playing it\n");
- DebugPrintf("Usage: %s <sound resource id>\n", argv[0]);
+ debugPrintf("Adds the requested sound resource to the playlist, and starts playing it\n");
+ debugPrintf("Usage: %s <sound resource id>\n", argv[0]);
return true;
}
int16 number = atoi(argv[1]);
if (!_engine->getResMan()->testResource(ResourceId(kResourceTypeSound, number))) {
- DebugPrintf("Unable to load this sound resource, most probably it has an equivalent audio resource (SCI1.1)\n");
+ debugPrintf("Unable to load this sound resource, most probably it has an equivalent audio resource (SCI1.1)\n");
return true;
}
g_sci->_soundCmd->startNewSound(number);
- return Cmd_Exit(0, 0);
+ return cmdExit(0, 0);
}
bool Console::cmdToggleSound(int argc, const char **argv) {
if (argc != 3) {
- DebugPrintf("Plays or stops the specified sound in the playlist\n");
- DebugPrintf("Usage: %s <address> <state>\n", argv[0]);
- DebugPrintf("Where:\n");
- DebugPrintf("- <address> is the address of the sound to play or stop.\n");
- DebugPrintf("- <state> is the new state (play or stop).\n");
- DebugPrintf("Check the \"addresses\" command on how to use addresses\n");
+ debugPrintf("Plays or stops the specified sound in the playlist\n");
+ debugPrintf("Usage: %s <address> <state>\n", argv[0]);
+ debugPrintf("Where:\n");
+ debugPrintf("- <address> is the address of the sound to play or stop.\n");
+ debugPrintf("- <state> is the new state (play or stop).\n");
+ debugPrintf("Check the \"addresses\" command on how to use addresses\n");
return true;
}
reg_t id;
if (parse_reg_t(_engine->_gamestate, argv[1], &id, false)) {
- DebugPrintf("Invalid address passed.\n");
- DebugPrintf("Check the \"addresses\" command on how to use addresses\n");
+ debugPrintf("Invalid address passed.\n");
+ debugPrintf("Check the \"addresses\" command on how to use addresses\n");
return true;
}
@@ -2183,7 +2202,7 @@ bool Console::cmdToggleSound(int argc, const char **argv) {
else if (newState == "stop")
g_sci->_soundCmd->processStopSound(id, false);
else
- DebugPrintf("New state can either be 'play' or 'stop'");
+ debugPrintf("New state can either be 'play' or 'stop'");
return true;
}
@@ -2191,40 +2210,40 @@ bool Console::cmdToggleSound(int argc, const char **argv) {
bool Console::cmdStopAllSounds(int argc, const char **argv) {
g_sci->_soundCmd->stopAllSounds();
- DebugPrintf("All sounds have been stopped\n");
+ debugPrintf("All sounds have been stopped\n");
return true;
}
bool Console::cmdIsSample(int argc, const char **argv) {
if (argc != 2) {
- DebugPrintf("Tests whether a given sound resource is a PCM sample, \n");
- DebugPrintf("and displays information on it if it is.\n");
- DebugPrintf("Usage: %s <sample id>\n", argv[0]);
+ debugPrintf("Tests whether a given sound resource is a PCM sample, \n");
+ debugPrintf("and displays information on it if it is.\n");
+ debugPrintf("Usage: %s <sample id>\n", argv[0]);
return true;
}
int16 number = atoi(argv[1]);
if (!_engine->getResMan()->testResource(ResourceId(kResourceTypeSound, number))) {
- DebugPrintf("Unable to load this sound resource, most probably it has an equivalent audio resource (SCI1.1)\n");
+ debugPrintf("Unable to load this sound resource, most probably it has an equivalent audio resource (SCI1.1)\n");
return true;
}
SoundResource *soundRes = new SoundResource(number, _engine->getResMan(), _engine->_features->detectDoSoundType());
if (!soundRes) {
- DebugPrintf("Not a sound resource!\n");
+ debugPrintf("Not a sound resource!\n");
return true;
}
SoundResource::Track *track = soundRes->getDigitalTrack();
if (!track || track->digitalChannelNr == -1) {
- DebugPrintf("Valid song, but not a sample.\n");
+ debugPrintf("Valid song, but not a sample.\n");
delete soundRes;
return true;
}
- DebugPrintf("Sample size: %d, sample rate: %d, channels: %d, digital channel number: %d\n",
+ debugPrintf("Sample size: %d, sample rate: %d, channels: %d, digital channel number: %d\n",
track->digitalSampleSize, track->digitalSampleRate, track->channelCount, track->digitalChannelNr);
delete soundRes;
@@ -2232,7 +2251,7 @@ bool Console::cmdIsSample(int argc, const char **argv) {
}
bool Console::cmdGCInvoke(int argc, const char **argv) {
- DebugPrintf("Performing garbage collection...\n");
+ debugPrintf("Performing garbage collection...\n");
run_gc(_engine->_gamestate);
return true;
}
@@ -2240,9 +2259,9 @@ bool Console::cmdGCInvoke(int argc, const char **argv) {
bool Console::cmdGCObjects(int argc, const char **argv) {
AddrSet *use_map = findAllActiveReferences(_engine->_gamestate);
- DebugPrintf("Reachable object references (normalised):\n");
+ debugPrintf("Reachable object references (normalised):\n");
for (AddrSet::iterator i = use_map->begin(); i != use_map->end(); ++i) {
- DebugPrintf(" - %04x:%04x\n", PRINT_REG(i->_key));
+ debugPrintf(" - %04x:%04x\n", PRINT_REG(i->_key));
}
delete use_map;
@@ -2252,93 +2271,93 @@ bool Console::cmdGCObjects(int argc, const char **argv) {
bool Console::cmdGCShowReachable(int argc, const char **argv) {
if (argc != 2) {
- DebugPrintf("Prints all addresses directly reachable from the memory object specified as parameter.\n");
- DebugPrintf("Usage: %s <address>\n", argv[0]);
- DebugPrintf("Check the \"addresses\" command on how to use addresses\n");
+ debugPrintf("Prints all addresses directly reachable from the memory object specified as parameter.\n");
+ debugPrintf("Usage: %s <address>\n", argv[0]);
+ debugPrintf("Check the \"addresses\" command on how to use addresses\n");
return true;
}
reg_t addr;
if (parse_reg_t(_engine->_gamestate, argv[1], &addr, false)) {
- DebugPrintf("Invalid address passed.\n");
- DebugPrintf("Check the \"addresses\" command on how to use addresses\n");
+ debugPrintf("Invalid address passed.\n");
+ debugPrintf("Check the \"addresses\" command on how to use addresses\n");
return true;
}
SegmentObj *mobj = _engine->_gamestate->_segMan->getSegmentObj(addr.getSegment());
if (!mobj) {
- DebugPrintf("Unknown segment : %x\n", addr.getSegment());
+ debugPrintf("Unknown segment : %x\n", addr.getSegment());
return 1;
}
- DebugPrintf("Reachable from %04x:%04x:\n", PRINT_REG(addr));
+ debugPrintf("Reachable from %04x:%04x:\n", PRINT_REG(addr));
const Common::Array<reg_t> tmp = mobj->listAllOutgoingReferences(addr);
for (Common::Array<reg_t>::const_iterator it = tmp.begin(); it != tmp.end(); ++it)
if (it->getSegment())
- g_sci->getSciDebugger()->DebugPrintf(" %04x:%04x\n", PRINT_REG(*it));
+ g_sci->getSciDebugger()->debugPrintf(" %04x:%04x\n", PRINT_REG(*it));
return true;
}
bool Console::cmdGCShowFreeable(int argc, const char **argv) {
if (argc != 2) {
- DebugPrintf("Prints all addresses freeable in the segment associated with the\n");
- DebugPrintf("given address (offset is ignored).\n");
- DebugPrintf("Usage: %s <address>\n", argv[0]);
- DebugPrintf("Check the \"addresses\" command on how to use addresses\n");
+ debugPrintf("Prints all addresses freeable in the segment associated with the\n");
+ debugPrintf("given address (offset is ignored).\n");
+ debugPrintf("Usage: %s <address>\n", argv[0]);
+ debugPrintf("Check the \"addresses\" command on how to use addresses\n");
return true;
}
reg_t addr;
if (parse_reg_t(_engine->_gamestate, argv[1], &addr, false)) {
- DebugPrintf("Invalid address passed.\n");
- DebugPrintf("Check the \"addresses\" command on how to use addresses\n");
+ debugPrintf("Invalid address passed.\n");
+ debugPrintf("Check the \"addresses\" command on how to use addresses\n");
return true;
}
SegmentObj *mobj = _engine->_gamestate->_segMan->getSegmentObj(addr.getSegment());
if (!mobj) {
- DebugPrintf("Unknown segment : %x\n", addr.getSegment());
+ debugPrintf("Unknown segment : %x\n", addr.getSegment());
return true;
}
- DebugPrintf("Freeable in segment %04x:\n", addr.getSegment());
+ debugPrintf("Freeable in segment %04x:\n", addr.getSegment());
const Common::Array<reg_t> tmp = mobj->listAllDeallocatable(addr.getSegment());
for (Common::Array<reg_t>::const_iterator it = tmp.begin(); it != tmp.end(); ++it)
if (it->getSegment())
- g_sci->getSciDebugger()->DebugPrintf(" %04x:%04x\n", PRINT_REG(*it));
+ g_sci->getSciDebugger()->debugPrintf(" %04x:%04x\n", PRINT_REG(*it));
return true;
}
bool Console::cmdGCNormalize(int argc, const char **argv) {
if (argc != 2) {
- DebugPrintf("Prints the \"normal\" address of a given address,\n");
- DebugPrintf("i.e. the address we would free in order to free\n");
- DebugPrintf("the object associated with the original address.\n");
- DebugPrintf("Usage: %s <address>\n", argv[0]);
- DebugPrintf("Check the \"addresses\" command on how to use addresses\n");
+ debugPrintf("Prints the \"normal\" address of a given address,\n");
+ debugPrintf("i.e. the address we would free in order to free\n");
+ debugPrintf("the object associated with the original address.\n");
+ debugPrintf("Usage: %s <address>\n", argv[0]);
+ debugPrintf("Check the \"addresses\" command on how to use addresses\n");
return true;
}
reg_t addr;
if (parse_reg_t(_engine->_gamestate, argv[1], &addr, false)) {
- DebugPrintf("Invalid address passed.\n");
- DebugPrintf("Check the \"addresses\" command on how to use addresses\n");
+ debugPrintf("Invalid address passed.\n");
+ debugPrintf("Check the \"addresses\" command on how to use addresses\n");
return true;
}
SegmentObj *mobj = _engine->_gamestate->_segMan->getSegmentObj(addr.getSegment());
if (!mobj) {
- DebugPrintf("Unknown segment : %x\n", addr.getSegment());
+ debugPrintf("Unknown segment : %x\n", addr.getSegment());
return true;
}
addr = mobj->findCanonicAddress(_engine->_gamestate->_segMan, addr);
- DebugPrintf(" %04x:%04x\n", PRINT_REG(addr));
+ debugPrintf(" %04x:%04x\n", PRINT_REG(addr));
return true;
}
@@ -2347,12 +2366,12 @@ bool Console::cmdVMVarlist(int argc, const char **argv) {
EngineState *s = _engine->_gamestate;
const char *varnames[] = {"global", "local", "temp", "param"};
- DebugPrintf("Addresses of variables in the VM:\n");
+ debugPrintf("Addresses of variables in the VM:\n");
for (int i = 0; i < 4; i++) {
- DebugPrintf("%s vars at %04x:%04x ", varnames[i], PRINT_REG(make_reg(s->variablesSegment[i], s->variables[i] - s->variablesBase[i])));
- DebugPrintf(" total %d", s->variablesMax[i]);
- DebugPrintf("\n");
+ debugPrintf("%s vars at %04x:%04x ", varnames[i], PRINT_REG(make_reg(s->variablesSegment[i], s->variables[i] - s->variablesBase[i])));
+ debugPrintf(" total %d", s->variablesMax[i]);
+ debugPrintf("\n");
}
return true;
@@ -2360,12 +2379,12 @@ bool Console::cmdVMVarlist(int argc, const char **argv) {
bool Console::cmdVMVars(int argc, const char **argv) {
if (argc < 2) {
- DebugPrintf("Displays or changes variables in the VM\n");
- DebugPrintf("Usage: %s <type> <varnum> [<value>]\n", argv[0]);
- DebugPrintf("First parameter is either g(lobal), l(ocal), t(emp), p(aram) or a(cc).\n");
- DebugPrintf("Second parameter is the var number (not specified on acc)\n");
- DebugPrintf("Third parameter (if specified) is the value to set the variable to, in address form\n");
- DebugPrintf("Check the \"addresses\" command on how to use addresses\n");
+ debugPrintf("Displays or changes variables in the VM\n");
+ debugPrintf("Usage: %s <type> <varnum> [<value>]\n", argv[0]);
+ debugPrintf("First parameter is either g(lobal), l(ocal), t(emp), p(aram) or a(cc).\n");
+ debugPrintf("Second parameter is the var number (not specified on acc)\n");
+ debugPrintf("Third parameter (if specified) is the value to set the variable to, in address form\n");
+ debugPrintf("Check the \"addresses\" command on how to use addresses\n");
return true;
}
@@ -2379,7 +2398,7 @@ bool Console::cmdVMVars(int argc, const char **argv) {
const char *setValue = NULL;
if (!varType_pre) {
- DebugPrintf("Invalid variable type '%c'\n", *argv[1]);
+ debugPrintf("Invalid variable type '%c'\n", *argv[1]);
return true;
}
@@ -2392,11 +2411,11 @@ bool Console::cmdVMVars(int argc, const char **argv) {
case 3: {
// for global, local, temp and param, we need an index
if (argc < 3) {
- DebugPrintf("Variable number must be specified for requested type\n");
+ debugPrintf("Variable number must be specified for requested type\n");
return true;
}
if (argc > 4) {
- DebugPrintf("Too many arguments\n");
+ debugPrintf("Too many arguments\n");
return true;
}
@@ -2404,12 +2423,12 @@ bool Console::cmdVMVars(int argc, const char **argv) {
return true;
if (varIndex < 0) {
- DebugPrintf("Variable number may not be negative\n");
+ debugPrintf("Variable number may not be negative\n");
return true;
}
if (s->variablesMax[varType] <= varIndex) {
- DebugPrintf("Maximum variable number for this type is %d (0x%x)\n", s->variablesMax[varType], s->variablesMax[varType]);
+ debugPrintf("Maximum variable number for this type is %d (0x%x)\n", s->variablesMax[varType], s->variablesMax[varType]);
return true;
}
curValue = &s->variables[varType][varIndex];
@@ -2421,7 +2440,7 @@ bool Console::cmdVMVars(int argc, const char **argv) {
case 4:
// acc
if (argc > 3) {
- DebugPrintf("Too many arguments\n");
+ debugPrintf("Too many arguments\n");
return true;
}
curValue = &s->r_acc;
@@ -2435,16 +2454,16 @@ bool Console::cmdVMVars(int argc, const char **argv) {
if (!setValue) {
if (varType == 4)
- DebugPrintf("%s == %04x:%04x", varNames[varType], PRINT_REG(*curValue));
+ debugPrintf("%s == %04x:%04x", varNames[varType], PRINT_REG(*curValue));
else
- DebugPrintf("%s var %d == %04x:%04x", varNames[varType], varIndex, PRINT_REG(*curValue));
+ debugPrintf("%s var %d == %04x:%04x", varNames[varType], varIndex, PRINT_REG(*curValue));
printBasicVarInfo(*curValue);
- DebugPrintf("\n");
+ debugPrintf("\n");
} else {
if (parse_reg_t(s, setValue, curValue, true)) {
- DebugPrintf("Invalid value/address passed.\n");
- DebugPrintf("Check the \"addresses\" command on how to use addresses\n");
- DebugPrintf("Or pass a decimal or hexadecimal value directly (e.g. 12, 1Ah)\n");
+ debugPrintf("Invalid value/address passed.\n");
+ debugPrintf("Check the \"addresses\" command on how to use addresses\n");
+ debugPrintf("Or pass a decimal or hexadecimal value directly (e.g. 12, 1Ah)\n");
return true;
}
}
@@ -2453,13 +2472,13 @@ bool Console::cmdVMVars(int argc, const char **argv) {
bool Console::cmdStack(int argc, const char **argv) {
if (argc != 2) {
- DebugPrintf("Lists the specified number of stack elements.\n");
- DebugPrintf("Usage: %s <elements>\n", argv[0]);
+ debugPrintf("Lists the specified number of stack elements.\n");
+ debugPrintf("Usage: %s <elements>\n", argv[0]);
return true;
}
if (_engine->_gamestate->_executionStack.empty()) {
- DebugPrintf("No exec stack!");
+ debugPrintf("No exec stack!");
return true;
}
@@ -2468,9 +2487,9 @@ bool Console::cmdStack(int argc, const char **argv) {
for (int i = nr; i > 0; i--) {
if ((xs.sp - xs.fp - i) == 0)
- DebugPrintf("-- temp variables --\n");
+ debugPrintf("-- temp variables --\n");
if (xs.sp - i >= _engine->_gamestate->stack_base)
- DebugPrintf("ST:%04x = %04x:%04x\n", (unsigned)(xs.sp - i - _engine->_gamestate->stack_base), PRINT_REG(xs.sp[-i]));
+ debugPrintf("ST:%04x = %04x:%04x\n", (unsigned)(xs.sp - i - _engine->_gamestate->stack_base), PRINT_REG(xs.sp[-i]));
}
return true;
@@ -2478,19 +2497,19 @@ bool Console::cmdStack(int argc, const char **argv) {
bool Console::cmdValueType(int argc, const char **argv) {
if (argc != 2) {
- DebugPrintf("Determines the type of a value.\n");
- DebugPrintf("The type can be one of the following:\n");
- DebugPrintf("Invalid, list, object, reference or arithmetic\n");
- DebugPrintf("Usage: %s <address>\n", argv[0]);
- DebugPrintf("Check the \"addresses\" command on how to use addresses\n");
+ debugPrintf("Determines the type of a value.\n");
+ debugPrintf("The type can be one of the following:\n");
+ debugPrintf("Invalid, list, object, reference or arithmetic\n");
+ debugPrintf("Usage: %s <address>\n", argv[0]);
+ debugPrintf("Check the \"addresses\" command on how to use addresses\n");
return true;
}
reg_t val;
if (parse_reg_t(_engine->_gamestate, argv[1], &val, false)) {
- DebugPrintf("Invalid address passed.\n");
- DebugPrintf("Check the \"addresses\" command on how to use addresses\n");
+ debugPrintf("Invalid address passed.\n");
+ debugPrintf("Check the \"addresses\" command on how to use addresses\n");
return true;
}
@@ -2498,22 +2517,22 @@ bool Console::cmdValueType(int argc, const char **argv) {
switch (t) {
case SIG_TYPE_LIST:
- DebugPrintf("List");
+ debugPrintf("List");
break;
case SIG_TYPE_OBJECT:
- DebugPrintf("Object");
+ debugPrintf("Object");
break;
case SIG_TYPE_REFERENCE:
- DebugPrintf("Reference");
+ debugPrintf("Reference");
break;
case SIG_TYPE_INTEGER:
- DebugPrintf("Integer");
+ debugPrintf("Integer");
break;
case SIG_TYPE_INTEGER | SIG_TYPE_NULL:
- DebugPrintf("Null");
+ debugPrintf("Null");
break;
default:
- DebugPrintf("Erroneous unknown type 0x%02x (%d decimal)\n", t, t);
+ debugPrintf("Erroneous unknown type 0x%02x (%d decimal)\n", t, t);
}
return true;
@@ -2521,17 +2540,17 @@ bool Console::cmdValueType(int argc, const char **argv) {
bool Console::cmdViewListNode(int argc, const char **argv) {
if (argc != 2) {
- DebugPrintf("Examines the list node at the given address.\n");
- DebugPrintf("Usage: %s <address>\n", argv[0]);
- DebugPrintf("Check the \"addresses\" command on how to use addresses\n");
+ debugPrintf("Examines the list node at the given address.\n");
+ debugPrintf("Usage: %s <address>\n", argv[0]);
+ debugPrintf("Check the \"addresses\" command on how to use addresses\n");
return true;
}
reg_t addr;
if (parse_reg_t(_engine->_gamestate, argv[1], &addr, false)) {
- DebugPrintf("Invalid address passed.\n");
- DebugPrintf("Check the \"addresses\" command on how to use addresses\n");
+ debugPrintf("Invalid address passed.\n");
+ debugPrintf("Check the \"addresses\" command on how to use addresses\n");
return true;
}
@@ -2541,11 +2560,11 @@ bool Console::cmdViewListNode(int argc, const char **argv) {
bool Console::cmdViewReference(int argc, const char **argv) {
if (argc < 2) {
- DebugPrintf("Examines an arbitrary reference.\n");
- DebugPrintf("Usage: %s <start address> [<end address>]\n", argv[0]);
- DebugPrintf("Where <start address> is the starting address to examine\n");
- DebugPrintf("<end address>, if provided, is the address where examining ends at\n");
- DebugPrintf("Check the \"addresses\" command on how to use addresses\n");
+ debugPrintf("Examines an arbitrary reference.\n");
+ debugPrintf("Usage: %s <start address> [<end address>]\n", argv[0]);
+ debugPrintf("Where <start address> is the starting address to examine\n");
+ debugPrintf("<end address>, if provided, is the address where examining ends at\n");
+ debugPrintf("Check the \"addresses\" command on how to use addresses\n");
return true;
}
@@ -2553,15 +2572,15 @@ bool Console::cmdViewReference(int argc, const char **argv) {
reg_t reg_end = NULL_REG;
if (parse_reg_t(_engine->_gamestate, argv[1], &reg, false)) {
- DebugPrintf("Invalid address passed.\n");
- DebugPrintf("Check the \"addresses\" command on how to use addresses\n");
+ debugPrintf("Invalid address passed.\n");
+ debugPrintf("Check the \"addresses\" command on how to use addresses\n");
return true;
}
if (argc > 2) {
if (parse_reg_t(_engine->_gamestate, argv[2], &reg_end, false)) {
- DebugPrintf("Invalid address passed.\n");
- DebugPrintf("Check the \"addresses\" command on how to use addresses\n");
+ debugPrintf("Invalid address passed.\n");
+ debugPrintf("Check the \"addresses\" command on how to use addresses\n");
return true;
}
}
@@ -2570,15 +2589,15 @@ bool Console::cmdViewReference(int argc, const char **argv) {
int filter;
int found = 0;
- DebugPrintf("%04x:%04x is of type 0x%x: ", PRINT_REG(reg), type_mask);
+ debugPrintf("%04x:%04x is of type 0x%x: ", PRINT_REG(reg), type_mask);
if (reg.getSegment() == 0 && reg.getOffset() == 0) {
- DebugPrintf("Null.\n");
+ debugPrintf("Null.\n");
return true;
}
if (reg_end.getSegment() != reg.getSegment() && reg_end != NULL_REG) {
- DebugPrintf("Ending segment different from starting segment. Assuming no bound on dump.\n");
+ debugPrintf("Ending segment different from starting segment. Assuming no bound on dump.\n");
reg_end = NULL_REG;
}
@@ -2586,7 +2605,7 @@ bool Console::cmdViewReference(int argc, const char **argv) {
int type = type_mask & filter;
if (found && type) {
- DebugPrintf("--- Alternatively, it could be a ");
+ debugPrintf("--- Alternatively, it could be a ");
}
@@ -2596,33 +2615,33 @@ bool Console::cmdViewReference(int argc, const char **argv) {
case SIG_TYPE_LIST: {
List *list = _engine->_gamestate->_segMan->lookupList(reg);
- DebugPrintf("list\n");
+ debugPrintf("list\n");
if (list)
printList(list);
else
- DebugPrintf("Invalid list.\n");
+ debugPrintf("Invalid list.\n");
}
break;
case SIG_TYPE_NODE:
- DebugPrintf("list node\n");
+ debugPrintf("list node\n");
printNode(reg);
break;
case SIG_TYPE_OBJECT:
- DebugPrintf("object\n");
+ debugPrintf("object\n");
printObject(reg);
break;
case SIG_TYPE_REFERENCE: {
switch (_engine->_gamestate->_segMan->getSegmentType(reg.getSegment())) {
#ifdef ENABLE_SCI32
case SEG_TYPE_STRING: {
- DebugPrintf("SCI32 string\n");
+ debugPrintf("SCI32 string\n");
const SciString *str = _engine->_gamestate->_segMan->lookupString(reg);
Common::hexdump((const byte *) str->getRawData(), str->getSize(), 16, 0);
break;
}
case SEG_TYPE_ARRAY: {
- DebugPrintf("SCI32 array:\n");
+ debugPrintf("SCI32 array:\n");
const SciArray<reg_t> *array = _engine->_gamestate->_segMan->lookupArray(reg);
hexDumpReg(array->getRawData(), array->getSize(), 4, 0, true);
break;
@@ -2632,10 +2651,10 @@ bool Console::cmdViewReference(int argc, const char **argv) {
const SegmentRef block = _engine->_gamestate->_segMan->dereference(reg);
uint16 size = block.maxSize;
- DebugPrintf("raw data\n");
+ debugPrintf("raw data\n");
if (reg_end.getSegment() != 0 && (size < reg_end.getOffset() - reg.getOffset())) {
- DebugPrintf("Block end out of bounds (size %d). Resetting.\n", size);
+ debugPrintf("Block end out of bounds (size %d). Resetting.\n", size);
reg_end = NULL_REG;
}
@@ -2643,7 +2662,7 @@ bool Console::cmdViewReference(int argc, const char **argv) {
size = reg_end.getOffset() - reg.getOffset();
if (reg_end.getSegment() != 0)
- DebugPrintf("Block size less than or equal to %d\n", size);
+ debugPrintf("Block size less than or equal to %d\n", size);
if (block.isRaw)
Common::hexdump(block.raw, size, 16, 0);
@@ -2654,14 +2673,14 @@ bool Console::cmdViewReference(int argc, const char **argv) {
break;
}
case SIG_TYPE_INTEGER:
- DebugPrintf("arithmetic value\n %d (%04x)\n", (int16) reg.getOffset(), reg.getOffset());
+ debugPrintf("arithmetic value\n %d (%04x)\n", (int16) reg.getOffset(), reg.getOffset());
break;
default:
- DebugPrintf("unknown type %d.\n", type);
+ debugPrintf("unknown type %d.\n", type);
}
if (type) {
- DebugPrintf("\n");
+ debugPrintf("\n");
found = 1;
}
}
@@ -2671,47 +2690,47 @@ bool Console::cmdViewReference(int argc, const char **argv) {
bool Console::cmdViewObject(int argc, const char **argv) {
if (argc != 2) {
- DebugPrintf("Examines the object at the given address.\n");
- DebugPrintf("Usage: %s <address>\n", argv[0]);
- DebugPrintf("Check the \"addresses\" command on how to use addresses\n");
+ debugPrintf("Examines the object at the given address.\n");
+ debugPrintf("Usage: %s <address>\n", argv[0]);
+ debugPrintf("Check the \"addresses\" command on how to use addresses\n");
return true;
}
reg_t addr;
if (parse_reg_t(_engine->_gamestate, argv[1], &addr, false)) {
- DebugPrintf("Invalid address passed.\n");
- DebugPrintf("Check the \"addresses\" command on how to use addresses\n");
+ debugPrintf("Invalid address passed.\n");
+ debugPrintf("Check the \"addresses\" command on how to use addresses\n");
return true;
}
- DebugPrintf("Information on the object at the given address:\n");
+ debugPrintf("Information on the object at the given address:\n");
printObject(addr);
return true;
}
bool Console::cmdViewActiveObject(int argc, const char **argv) {
- DebugPrintf("Information on the currently active object or class:\n");
+ debugPrintf("Information on the currently active object or class:\n");
printObject(_engine->_gamestate->xs->objp);
return true;
}
bool Console::cmdViewAccumulatorObject(int argc, const char **argv) {
- DebugPrintf("Information on the currently active object or class at the address indexed by the accumulator:\n");
+ debugPrintf("Information on the currently active object or class at the address indexed by the accumulator:\n");
printObject(_engine->_gamestate->r_acc);
return true;
}
bool Console::cmdScriptSteps(int argc, const char **argv) {
- DebugPrintf("Number of executed SCI operations: %d\n", _engine->_gamestate->scriptStepCounter);
+ debugPrintf("Number of executed SCI operations: %d\n", _engine->_gamestate->scriptStepCounter);
return true;
}
bool Console::cmdBacktrace(int argc, const char **argv) {
- DebugPrintf("Call stack (current base: 0x%x):\n", _engine->_gamestate->executionStackBase);
+ debugPrintf("Call stack (current base: 0x%x):\n", _engine->_gamestate->executionStackBase);
Common::List<ExecStack>::const_iterator iter;
uint i = 0;
@@ -2724,22 +2743,22 @@ bool Console::cmdBacktrace(int argc, const char **argv) {
switch (call.type) {
case EXEC_STACK_TYPE_CALL: // Normal function
if (call.type == EXEC_STACK_TYPE_CALL)
- DebugPrintf(" %x: script %d - ", i, (*(Script *)_engine->_gamestate->_segMan->_heap[call.addr.pc.getSegment()]).getScriptNumber());
+ debugPrintf(" %x: script %d - ", i, (*(Script *)_engine->_gamestate->_segMan->_heap[call.addr.pc.getSegment()]).getScriptNumber());
if (call.debugSelector != -1) {
- DebugPrintf("%s::%s(", objname, _engine->getKernel()->getSelectorName(call.debugSelector).c_str());
+ debugPrintf("%s::%s(", objname, _engine->getKernel()->getSelectorName(call.debugSelector).c_str());
} else if (call.debugExportId != -1) {
- DebugPrintf("export %d (", call.debugExportId);
+ debugPrintf("export %d (", call.debugExportId);
} else if (call.debugLocalCallOffset != -1) {
- DebugPrintf("call %x (", call.debugLocalCallOffset);
+ debugPrintf("call %x (", call.debugLocalCallOffset);
}
break;
case EXEC_STACK_TYPE_KERNEL: // Kernel function
- DebugPrintf(" %x:[%x] k%s(", i, call.debugOrigin, _engine->getKernel()->getKernelName(call.debugSelector).c_str());
+ debugPrintf(" %x:[%x] k%s(", i, call.debugOrigin, _engine->getKernel()->getKernelName(call.debugSelector).c_str());
break;
case EXEC_STACK_TYPE_VARSELECTOR:
- DebugPrintf(" %x:[%x] vs%s %s::%s (", i, call.debugOrigin, (call.argc) ? "write" : "read",
+ debugPrintf(" %x:[%x] vs%s %s::%s (", i, call.debugOrigin, (call.argc) ? "write" : "read",
objname, _engine->getKernel()->getSelectorName(call.debugSelector).c_str());
break;
}
@@ -2750,32 +2769,32 @@ bool Console::cmdBacktrace(int argc, const char **argv) {
totalparamc = 16;
for (paramc = 1; paramc <= totalparamc; paramc++) {
- DebugPrintf("%04x:%04x", PRINT_REG(call.variables_argp[paramc]));
+ debugPrintf("%04x:%04x", PRINT_REG(call.variables_argp[paramc]));
if (paramc < call.argc)
- DebugPrintf(", ");
+ debugPrintf(", ");
}
if (call.argc > 16)
- DebugPrintf("...");
+ debugPrintf("...");
- DebugPrintf(")\n ");
+ debugPrintf(")\n ");
if (call.debugOrigin != -1)
- DebugPrintf("by %x ", call.debugOrigin);
- DebugPrintf("obj@%04x:%04x", PRINT_REG(call.objp));
+ debugPrintf("by %x ", call.debugOrigin);
+ debugPrintf("obj@%04x:%04x", PRINT_REG(call.objp));
if (call.type == EXEC_STACK_TYPE_CALL) {
- DebugPrintf(" pc=%04x:%04x", PRINT_REG(call.addr.pc));
+ debugPrintf(" pc=%04x:%04x", PRINT_REG(call.addr.pc));
if (call.sp == CALL_SP_CARRY)
- DebugPrintf(" sp,fp:carry");
+ debugPrintf(" sp,fp:carry");
else {
- DebugPrintf(" sp=ST:%04x", (unsigned)(call.sp - _engine->_gamestate->stack_base));
- DebugPrintf(" fp=ST:%04x", (unsigned)(call.fp - _engine->_gamestate->stack_base));
+ debugPrintf(" sp=ST:%04x", (unsigned)(call.sp - _engine->_gamestate->stack_base));
+ debugPrintf(" fp=ST:%04x", (unsigned)(call.fp - _engine->_gamestate->stack_base));
}
} else
- DebugPrintf(" pc:none");
+ debugPrintf(" pc:none");
- DebugPrintf(" argp:ST:%04x", (unsigned)(call.variables_argp - _engine->_gamestate->stack_base));
- DebugPrintf("\n");
+ debugPrintf(" argp:ST:%04x", (unsigned)(call.variables_argp - _engine->_gamestate->stack_base));
+ debugPrintf("\n");
}
return true;
@@ -2786,7 +2805,7 @@ bool Console::cmdTrace(int argc, const char **argv) {
_debugState.runningStep = atoi(argv[1]) - 1;
_debugState.debugging = true;
- return Cmd_Exit(0, 0);
+ return cmdExit(0, 0);
}
bool Console::cmdStepOver(int argc, const char **argv) {
@@ -2794,14 +2813,14 @@ bool Console::cmdStepOver(int argc, const char **argv) {
_debugState.seekLevel = _engine->_gamestate->_executionStack.size();
_debugState.debugging = true;
- return Cmd_Exit(0, 0);
+ return cmdExit(0, 0);
}
bool Console::cmdStepEvent(int argc, const char **argv) {
_debugState.stopOnEvent = true;
_debugState.debugging = true;
- return Cmd_Exit(0, 0);
+ return cmdExit(0, 0);
}
bool Console::cmdStepRet(int argc, const char **argv) {
@@ -2809,13 +2828,13 @@ bool Console::cmdStepRet(int argc, const char **argv) {
_debugState.seekLevel = _engine->_gamestate->_executionStack.size() - 1;
_debugState.debugging = true;
- return Cmd_Exit(0, 0);
+ return cmdExit(0, 0);
}
bool Console::cmdStepGlobal(int argc, const char **argv) {
if (argc != 2) {
- DebugPrintf("Steps until the global variable with the specified index is modified.\n");
- DebugPrintf("Usage: %s <global variable index>\n", argv[0]);
+ debugPrintf("Steps until the global variable with the specified index is modified.\n");
+ debugPrintf("Usage: %s <global variable index>\n", argv[0]);
return true;
}
@@ -2823,7 +2842,7 @@ bool Console::cmdStepGlobal(int argc, const char **argv) {
_debugState.seekSpecial = atoi(argv[1]);
_debugState.debugging = true;
- return Cmd_Exit(0, 0);
+ return cmdExit(0, 0);
}
bool Console::cmdStepCallk(int argc, const char **argv) {
@@ -2844,7 +2863,7 @@ bool Console::cmdStepCallk(int argc, const char **argv) {
}
if (callk_index == -1) {
- DebugPrintf("Unknown kernel function '%s'\n", argv[1]);
+ debugPrintf("Unknown kernel function '%s'\n", argv[1]);
return true;
}
}
@@ -2856,16 +2875,16 @@ bool Console::cmdStepCallk(int argc, const char **argv) {
}
_debugState.debugging = true;
- return Cmd_Exit(0, 0);
+ return cmdExit(0, 0);
}
bool Console::cmdDisassemble(int argc, const char **argv) {
if (argc < 3) {
- DebugPrintf("Disassembles a method by name.\n");
- DebugPrintf("Usage: %s <object> <method> <options>\n", argv[0]);
- DebugPrintf("Valid options are:\n");
- DebugPrintf(" bwt : Print byte/word tag\n");
- DebugPrintf(" bc : Print bytecode\n");
+ debugPrintf("Disassembles a method by name.\n");
+ debugPrintf("Usage: %s <object> <method> <options>\n", argv[0]);
+ debugPrintf("Valid options are:\n");
+ debugPrintf(" bwt : Print byte/word tag\n");
+ debugPrintf(" bc : Print bytecode\n");
return true;
}
@@ -2874,8 +2893,8 @@ bool Console::cmdDisassemble(int argc, const char **argv) {
bool printBWTag = false;
if (parse_reg_t(_engine->_gamestate, argv[1], &objAddr, false)) {
- DebugPrintf("Invalid address passed.\n");
- DebugPrintf("Check the \"addresses\" command on how to use addresses\n");
+ debugPrintf("Invalid address passed.\n");
+ debugPrintf("Check the \"addresses\" command on how to use addresses\n");
return true;
}
@@ -2884,17 +2903,17 @@ bool Console::cmdDisassemble(int argc, const char **argv) {
reg_t addr = NULL_REG;
if (!obj) {
- DebugPrintf("Not an object.\n");
+ debugPrintf("Not an object.\n");
return true;
}
if (selectorId < 0) {
- DebugPrintf("Not a valid selector name.\n");
+ debugPrintf("Not a valid selector name.\n");
return true;
}
if (lookupSelector(_engine->_gamestate->_segMan, objAddr, selectorId, NULL, &addr) != kSelectorMethod) {
- DebugPrintf("Not a method.\n");
+ debugPrintf("Not a method.\n");
return true;
}
@@ -2924,12 +2943,12 @@ bool Console::cmdDisassemble(int argc, const char **argv) {
bool Console::cmdDisassembleAddress(int argc, const char **argv) {
if (argc < 2) {
- DebugPrintf("Disassembles one or more commands.\n");
- DebugPrintf("Usage: %s [startaddr] <options>\n", argv[0]);
- DebugPrintf("Valid options are:\n");
- DebugPrintf(" bwt : Print byte/word tag\n");
- DebugPrintf(" c<x> : Disassemble <x> bytes\n");
- DebugPrintf(" bc : Print bytecode\n");
+ debugPrintf("Disassembles one or more commands.\n");
+ debugPrintf("Usage: %s [startaddr] <options>\n", argv[0]);
+ debugPrintf("Valid options are:\n");
+ debugPrintf(" bwt : Print byte/word tag\n");
+ debugPrintf(" c<x> : Disassemble <x> bytes\n");
+ debugPrintf(" bc : Print bytecode\n");
return true;
}
@@ -2940,8 +2959,8 @@ bool Console::cmdDisassembleAddress(int argc, const char **argv) {
uint16 size;
if (parse_reg_t(_engine->_gamestate, argv[1], &vpc, false)) {
- DebugPrintf("Invalid address passed.\n");
- DebugPrintf("Check the \"addresses\" command on how to use addresses\n");
+ debugPrintf("Invalid address passed.\n");
+ debugPrintf("Check the \"addresses\" command on how to use addresses\n");
return true;
}
@@ -2956,7 +2975,7 @@ bool Console::cmdDisassembleAddress(int argc, const char **argv) {
else if (toupper(argv[i][0]) == 'C')
opCount = atoi(argv[i] + 1);
else {
- DebugPrintf("Invalid option '%s'\n", argv[i]);
+ debugPrintf("Invalid option '%s'\n", argv[i]);
return true;
}
}
@@ -2974,13 +2993,13 @@ void Console::printKernelCallsFound(int kernelFuncNum, bool showFoundScripts) {
Common::sort(resources.begin(), resources.end());
if (showFoundScripts)
- DebugPrintf("%d scripts found, dissassembling...\n", resources.size());
+ debugPrintf("%d scripts found, dissassembling...\n", resources.size());
int scriptSegment;
Script *script;
// Create a custom segment manager here, so that the game's segment
// manager won't be affected by loading and unloading scripts here.
- SegManager *customSegMan = new SegManager(_engine->getResMan());
+ SegManager *customSegMan = new SegManager(_engine->getResMan(), _engine->getScriptPatcher());
Common::List<ResourceId>::iterator itr;
for (itr = resources.begin(); itr != resources.end(); ++itr) {
@@ -3023,7 +3042,7 @@ void Console::printKernelCallsFound(int kernelFuncNum, bool showFoundScripts) {
uint16 argc2 = opparams[1];
if (kFuncNum == kernelFuncNum) {
- DebugPrintf("Called from script %d, object %s, method %s(%d) with %d bytes for arguments\n",
+ debugPrintf("Called from script %d, object %s, method %s(%d) with %d bytes for arguments\n",
itr->getNumber(), objName,
_engine->getKernel()->getSelectorName(obj->getFuncSelector(i)).c_str(), i, argc2);
}
@@ -3055,19 +3074,19 @@ void Console::printKernelCallsFound(int kernelFuncNum, bool showFoundScripts) {
bool Console::cmdFindKernelFunctionCall(int argc, const char **argv) {
if (argc < 2) {
- DebugPrintf("Finds the scripts and methods that call a specific kernel function.\n");
- DebugPrintf("Usage: %s <kernel function>\n", argv[0]);
- DebugPrintf("Example: %s Display\n", argv[0]);
- DebugPrintf("Special usage:\n");
- DebugPrintf("%s Dummy - find all calls to actual dummy functions "
+ debugPrintf("Finds the scripts and methods that call a specific kernel function.\n");
+ debugPrintf("Usage: %s <kernel function>\n", argv[0]);
+ debugPrintf("Example: %s Display\n", argv[0]);
+ debugPrintf("Special usage:\n");
+ debugPrintf("%s Dummy - find all calls to actual dummy functions "
"(mapped to kDummy, and dummy in the kernel table). "
"There shouldn't be calls to these (apart from a known "
"one in Shivers)\n", argv[0]);
- DebugPrintf("%s Unused - find all calls to unused functions (mapped to "
+ debugPrintf("%s Unused - find all calls to unused functions (mapped to "
"kDummy - i.e. mapped in SSCI but dummy in ScummVM, thus "
"they'll error out when called). Only debug scripts should "
"be calling these\n", argv[0]);
- DebugPrintf("%s Unmapped - find all calls to currently unmapped or "
+ debugPrintf("%s Unmapped - find all calls to currently unmapped or "
"unimplemented functions (mapped to kStub/kStubNull)\n", argv[0]);
return true;
}
@@ -3080,7 +3099,7 @@ bool Console::cmdFindKernelFunctionCall(int argc, const char **argv) {
int kernelFuncNum = kernel->findKernelFuncPos(argv[1]);
if (kernelFuncNum < 0) {
- DebugPrintf("Invalid kernel function requested\n");
+ debugPrintf("Invalid kernel function requested\n");
return true;
}
@@ -3090,7 +3109,7 @@ bool Console::cmdFindKernelFunctionCall(int argc, const char **argv) {
// in the kernel table)
for (uint i = 0; i < kernel->_kernelFuncs.size(); i++) {
if (kernel->_kernelFuncs[i].function == &kDummy && kernel->getKernelName(i) == "Dummy") {
- DebugPrintf("Searching for kernel function %d (%s)...\n", i, kernel->getKernelName(i).c_str());
+ debugPrintf("Searching for kernel function %d (%s)...\n", i, kernel->getKernelName(i).c_str());
printKernelCallsFound(i, false);
}
}
@@ -3100,7 +3119,7 @@ bool Console::cmdFindKernelFunctionCall(int argc, const char **argv) {
// called)
for (uint i = 0; i < kernel->_kernelFuncs.size(); i++) {
if (kernel->_kernelFuncs[i].function == &kDummy && kernel->getKernelName(i) != "Dummy") {
- DebugPrintf("Searching for kernel function %d (%s)...\n", i, kernel->getKernelName(i).c_str());
+ debugPrintf("Searching for kernel function %d (%s)...\n", i, kernel->getKernelName(i).c_str());
printKernelCallsFound(i, false);
}
}
@@ -3109,7 +3128,7 @@ bool Console::cmdFindKernelFunctionCall(int argc, const char **argv) {
for (uint i = 0; i < kernel->_kernelFuncs.size(); i++) {
if (kernel->_kernelFuncs[i].function == &kStub ||
kernel->_kernelFuncs[i].function == &kStubNull) {
- DebugPrintf("Searching for kernel function %d (%s)...\n", i, kernel->getKernelName(i).c_str());
+ debugPrintf("Searching for kernel function %d (%s)...\n", i, kernel->getKernelName(i).c_str());
printKernelCallsFound(i, false);
}
}
@@ -3120,17 +3139,17 @@ bool Console::cmdFindKernelFunctionCall(int argc, const char **argv) {
bool Console::cmdSend(int argc, const char **argv) {
if (argc < 3) {
- DebugPrintf("Sends a message to an object.\n");
- DebugPrintf("Usage: %s <object> <selector name> <param1> <param2> ... <paramn>\n", argv[0]);
- DebugPrintf("Example: %s ?fooScript cue\n", argv[0]);
+ debugPrintf("Sends a message to an object.\n");
+ debugPrintf("Usage: %s <object> <selector name> <param1> <param2> ... <paramn>\n", argv[0]);
+ debugPrintf("Example: %s ?fooScript cue\n", argv[0]);
return true;
}
reg_t object;
if (parse_reg_t(_engine->_gamestate, argv[1], &object, false)) {
- DebugPrintf("Invalid address \"%s\" passed.\n", argv[1]);
- DebugPrintf("Check the \"addresses\" command on how to use addresses\n");
+ debugPrintf("Invalid address \"%s\" passed.\n", argv[1]);
+ debugPrintf("Check the \"addresses\" command on how to use addresses\n");
return true;
}
@@ -3138,20 +3157,20 @@ bool Console::cmdSend(int argc, const char **argv) {
int selectorId = _engine->getKernel()->findSelector(selectorName);
if (selectorId < 0) {
- DebugPrintf("Unknown selector: \"%s\"\n", selectorName);
+ debugPrintf("Unknown selector: \"%s\"\n", selectorName);
return true;
}
const Object *o = _engine->_gamestate->_segMan->getObject(object);
if (o == NULL) {
- DebugPrintf("Address \"%04x:%04x\" is not an object\n", PRINT_REG(object));
+ debugPrintf("Address \"%04x:%04x\" is not an object\n", PRINT_REG(object));
return true;
}
SelectorType selector_type = lookupSelector(_engine->_gamestate->_segMan, object, selectorId, NULL, NULL);
if (selector_type == kSelectorNone) {
- DebugPrintf("Object does not support selector: \"%s\"\n", selectorName);
+ debugPrintf("Object does not support selector: \"%s\"\n", selectorName);
return true;
}
@@ -3165,8 +3184,8 @@ bool Console::cmdSend(int argc, const char **argv) {
stackframe[1] = make_reg(0, send_argc);
for (int i = 0; i < send_argc; i++) {
if (parse_reg_t(_engine->_gamestate, argv[3+i], &stackframe[2+i], false)) {
- DebugPrintf("Invalid address \"%s\" passed.\n", argv[3+i]);
- DebugPrintf("Check the \"addresses\" command on how to use addresses\n");
+ debugPrintf("Invalid address \"%s\" passed.\n", argv[3+i]);
+ debugPrintf("Check the \"addresses\" command on how to use addresses\n");
return true;
}
}
@@ -3184,7 +3203,7 @@ bool Console::cmdSend(int argc, const char **argv) {
if (old_xstack != xstack) {
_engine->_gamestate->_executionStackPosChanged = true;
- DebugPrintf("Message scheduled for execution\n");
+ debugPrintf("Message scheduled for execution\n");
// We call run_engine explictly so we can restore the value of r_acc
// after execution.
@@ -3194,7 +3213,7 @@ bool Console::cmdSend(int argc, const char **argv) {
if (restore_acc) {
// varselector read or message executed
- DebugPrintf("Message completed. Value returned: %04x:%04x\n", PRINT_REG(_engine->_gamestate->r_acc));
+ debugPrintf("Message completed. Value returned: %04x:%04x\n", PRINT_REG(_engine->_gamestate->r_acc));
_engine->_gamestate->r_acc = old_acc;
}
@@ -3205,14 +3224,14 @@ bool Console::cmdGo(int argc, const char **argv) {
// CHECKME: is this necessary?
_debugState.seeking = kDebugSeekNothing;
- return Cmd_Exit(argc, argv);
+ return cmdExit(argc, argv);
}
bool Console::cmdLogKernel(int argc, const char **argv) {
if (argc < 3) {
- DebugPrintf("Logs calls to specified kernel function.\n");
- DebugPrintf("Usage: %s <kernel function/*> <on/off>\n", argv[0]);
- DebugPrintf("Example: %s StrCpy on\n", argv[0]);
+ debugPrintf("Logs calls to specified kernel function.\n");
+ debugPrintf("Usage: %s <kernel function/*> <on/off>\n", argv[0]);
+ debugPrintf("Example: %s StrCpy on\n", argv[0]);
return true;
}
@@ -3222,14 +3241,14 @@ bool Console::cmdLogKernel(int argc, const char **argv) {
else if (strcmp(argv[2], "off") == 0)
logging = false;
else {
- DebugPrintf("2nd parameter must be either on or off\n");
+ debugPrintf("2nd parameter must be either on or off\n");
return true;
}
if (g_sci->getKernel()->debugSetFunction(argv[1], logging, -1))
- DebugPrintf("Logging %s for k%s\n", logging ? "enabled" : "disabled", argv[1]);
+ debugPrintf("Logging %s for k%s\n", logging ? "enabled" : "disabled", argv[1]);
else
- DebugPrintf("Unknown kernel function %s\n", argv[1]);
+ debugPrintf("Unknown kernel function %s\n", argv[1]);
return true;
}
@@ -3237,25 +3256,25 @@ bool Console::cmdBreakpointList(int argc, const char **argv) {
int i = 0;
int bpdata;
- DebugPrintf("Breakpoint list:\n");
+ debugPrintf("Breakpoint list:\n");
Common::List<Breakpoint>::const_iterator bp = _debugState._breakpoints.begin();
Common::List<Breakpoint>::const_iterator end = _debugState._breakpoints.end();
for (; bp != end; ++bp) {
- DebugPrintf(" #%i: ", i);
+ debugPrintf(" #%i: ", i);
switch (bp->type) {
case BREAK_SELECTOREXEC:
- DebugPrintf("Execute %s\n", bp->name.c_str());
+ debugPrintf("Execute %s\n", bp->name.c_str());
break;
case BREAK_SELECTORREAD:
- DebugPrintf("Read %s\n", bp->name.c_str());
+ debugPrintf("Read %s\n", bp->name.c_str());
break;
case BREAK_SELECTORWRITE:
- DebugPrintf("Write %s\n", bp->name.c_str());
+ debugPrintf("Write %s\n", bp->name.c_str());
break;
case BREAK_EXPORT:
bpdata = bp->address;
- DebugPrintf("Execute script %d, export %d\n", bpdata >> 16, bpdata & 0xFFFF);
+ debugPrintf("Execute script %d, export %d\n", bpdata >> 16, bpdata & 0xFFFF);
break;
}
@@ -3263,16 +3282,16 @@ bool Console::cmdBreakpointList(int argc, const char **argv) {
}
if (!i)
- DebugPrintf(" No breakpoints defined.\n");
+ debugPrintf(" No breakpoints defined.\n");
return true;
}
bool Console::cmdBreakpointDelete(int argc, const char **argv) {
if (argc != 2) {
- DebugPrintf("Deletes a breakpoint with the specified index.\n");
- DebugPrintf("Usage: %s <breakpoint index>\n", argv[0]);
- DebugPrintf("<index> * will remove all breakpoints\n");
+ debugPrintf("Deletes a breakpoint with the specified index.\n");
+ debugPrintf("Usage: %s <breakpoint index>\n", argv[0]);
+ debugPrintf("<index> * will remove all breakpoints\n");
return true;
}
@@ -3292,7 +3311,7 @@ bool Console::cmdBreakpointDelete(int argc, const char **argv) {
}
if (bp == end) {
- DebugPrintf("Invalid breakpoint index %i\n", idx);
+ debugPrintf("Invalid breakpoint index %i\n", idx);
return true;
}
@@ -3312,11 +3331,11 @@ bool Console::cmdBreakpointDelete(int argc, const char **argv) {
bool Console::cmdBreakpointMethod(int argc, const char **argv) {
if (argc != 2) {
- DebugPrintf("Sets a breakpoint on execution of a specified method/selector.\n");
- DebugPrintf("Usage: %s <name>\n", argv[0]);
- DebugPrintf("Example: %s ego::doit\n", argv[0]);
- DebugPrintf("May also be used to set a breakpoint that applies whenever an object\n");
- DebugPrintf("of a specific type is touched: %s foo::\n", argv[0]);
+ debugPrintf("Sets a breakpoint on execution of a specified method/selector.\n");
+ debugPrintf("Usage: %s <name>\n", argv[0]);
+ debugPrintf("Example: %s ego::doit\n", argv[0]);
+ debugPrintf("May also be used to set a breakpoint that applies whenever an object\n");
+ debugPrintf("of a specific type is touched: %s foo::\n", argv[0]);
return true;
}
@@ -3334,9 +3353,9 @@ bool Console::cmdBreakpointMethod(int argc, const char **argv) {
bool Console::cmdBreakpointRead(int argc, const char **argv) {
if (argc != 2) {
- DebugPrintf("Sets a breakpoint on reading of a specified selector.\n");
- DebugPrintf("Usage: %s <name>\n", argv[0]);
- DebugPrintf("Example: %s ego::view\n", argv[0]);
+ debugPrintf("Sets a breakpoint on reading of a specified selector.\n");
+ debugPrintf("Usage: %s <name>\n", argv[0]);
+ debugPrintf("Example: %s ego::view\n", argv[0]);
return true;
}
@@ -3351,9 +3370,9 @@ bool Console::cmdBreakpointRead(int argc, const char **argv) {
bool Console::cmdBreakpointWrite(int argc, const char **argv) {
if (argc != 2) {
- DebugPrintf("Sets a breakpoint on writing of a specified selector.\n");
- DebugPrintf("Usage: %s <name>\n", argv[0]);
- DebugPrintf("Example: %s ego::view\n", argv[0]);
+ debugPrintf("Sets a breakpoint on writing of a specified selector.\n");
+ debugPrintf("Usage: %s <name>\n", argv[0]);
+ debugPrintf("Example: %s ego::view\n", argv[0]);
return true;
}
@@ -3368,9 +3387,9 @@ bool Console::cmdBreakpointWrite(int argc, const char **argv) {
bool Console::cmdBreakpointKernel(int argc, const char **argv) {
if (argc < 3) {
- DebugPrintf("Sets a breakpoint on execution of a kernel function.\n");
- DebugPrintf("Usage: %s <name> <on/off>\n", argv[0]);
- DebugPrintf("Example: %s DrawPic on\n", argv[0]);
+ debugPrintf("Sets a breakpoint on execution of a kernel function.\n");
+ debugPrintf("Usage: %s <name> <on/off>\n", argv[0]);
+ debugPrintf("Example: %s DrawPic on\n", argv[0]);
return true;
}
@@ -3380,22 +3399,22 @@ bool Console::cmdBreakpointKernel(int argc, const char **argv) {
else if (strcmp(argv[2], "off") == 0)
breakpoint = false;
else {
- DebugPrintf("2nd parameter must be either on or off\n");
+ debugPrintf("2nd parameter must be either on or off\n");
return true;
}
if (g_sci->getKernel()->debugSetFunction(argv[1], -1, breakpoint))
- DebugPrintf("Breakpoint %s for k%s\n", (breakpoint ? "enabled" : "disabled"), argv[1]);
+ debugPrintf("Breakpoint %s for k%s\n", (breakpoint ? "enabled" : "disabled"), argv[1]);
else
- DebugPrintf("Unknown kernel function %s\n", argv[1]);
+ debugPrintf("Unknown kernel function %s\n", argv[1]);
return true;
}
bool Console::cmdBreakpointFunction(int argc, const char **argv) {
if (argc != 3) {
- DebugPrintf("Sets a breakpoint on the execution of the specified exported function.\n");
- DebugPrintf("Usage: %s <script number> <export number\n", argv[0]);
+ debugPrintf("Sets a breakpoint on the execution of the specified exported function.\n");
+ debugPrintf("Usage: %s <script number> <export number\n", argv[0]);
return true;
}
@@ -3415,21 +3434,21 @@ bool Console::cmdBreakpointFunction(int argc, const char **argv) {
bool Console::cmdSfx01Header(int argc, const char **argv) {
if (argc != 2) {
- DebugPrintf("Dumps the header of a SCI01 song\n");
- DebugPrintf("Usage: %s <track>\n", argv[0]);
+ debugPrintf("Dumps the header of a SCI01 song\n");
+ debugPrintf("Usage: %s <track>\n", argv[0]);
return true;
}
Resource *song = _engine->getResMan()->findResource(ResourceId(kResourceTypeSound, atoi(argv[1])), 0);
if (!song) {
- DebugPrintf("Doesn't exist\n");
+ debugPrintf("Doesn't exist\n");
return true;
}
uint32 offset = 0;
- DebugPrintf("SCI01 song track mappings:\n");
+ debugPrintf("SCI01 song track mappings:\n");
if (*song->data == 0xf0) // SCI1 priority spec
offset = 8;
@@ -3439,7 +3458,7 @@ bool Console::cmdSfx01Header(int argc, const char **argv) {
while (song->data[offset] != 0xff) {
byte device_id = song->data[offset];
- DebugPrintf("* Device %02x:\n", device_id);
+ debugPrintf("* Device %02x:\n", device_id);
offset++;
if (offset + 1 >= song->size)
@@ -3461,12 +3480,12 @@ bool Console::cmdSfx01Header(int argc, const char **argv) {
track_offset += 2;
end = READ_LE_UINT16(song->data + offset + 2);
- DebugPrintf(" - %04x -- %04x", track_offset, track_offset + end);
+ debugPrintf(" - %04x -- %04x", track_offset, track_offset + end);
if (track_offset == 0xfe)
- DebugPrintf(" (PCM data)\n");
+ debugPrintf(" (PCM data)\n");
else
- DebugPrintf(" (channel %d, special %d, %d playing notes, %d foo)\n",
+ debugPrintf(" (channel %d, special %d, %d playing notes, %d foo)\n",
header1 & 0xf, header1 >> 4, header2 & 0xf, header2 >> 4);
offset += 4;
}
@@ -3580,8 +3599,8 @@ static void midi_hexdump(byte *data, int size, int notational_offset) {
bool Console::cmdSfx01Track(int argc, const char **argv) {
if (argc != 3) {
- DebugPrintf("Dumps a track of a SCI01 song\n");
- DebugPrintf("Usage: %s <track> <offset>\n", argv[0]);
+ debugPrintf("Dumps a track of a SCI01 song\n");
+ debugPrintf("Usage: %s <track> <offset>\n", argv[0]);
return true;
}
@@ -3590,7 +3609,7 @@ bool Console::cmdSfx01Track(int argc, const char **argv) {
int offset = atoi(argv[2]);
if (!song) {
- DebugPrintf("Doesn't exist\n");
+ debugPrintf("Doesn't exist\n");
return true;
}
@@ -3614,29 +3633,29 @@ bool Console::cmdQuit(int argc, const char **argv) {
_debugState.runningStep = 0;
} else {
- DebugPrintf("%s [game] - exit gracefully\n", argv[0]);
- DebugPrintf("%s now - exit ungracefully\n", argv[0]);
+ debugPrintf("%s [game] - exit gracefully\n", argv[0]);
+ debugPrintf("%s now - exit ungracefully\n", argv[0]);
return true;
}
- return Cmd_Exit(0, 0);
+ return cmdExit(0, 0);
}
bool Console::cmdAddresses(int argc, const char **argv) {
- DebugPrintf("Address parameters may be passed in one of three forms:\n");
- DebugPrintf(" - ssss:oooo -- where 'ssss' denotes a segment and 'oooo' an offset.\n");
- DebugPrintf(" Example: \"a:c5\" would address something in segment 0xa at offset 0xc5.\n");
- DebugPrintf(" - &scr:oooo -- where 'scr' is a script number and oooo an offset within that script; will\n");
- DebugPrintf(" fail if the script is not currently loaded\n");
- DebugPrintf(" - $REG -- where 'REG' is one of 'PC', 'ACC', 'PREV' or 'OBJ': References the address\n");
- DebugPrintf(" indicated by the register of this name.\n");
- DebugPrintf(" - $REG+n (or -n) -- Like $REG, but modifies the offset part by a specific amount (which\n");
- DebugPrintf(" is specified in hexadecimal).\n");
- DebugPrintf(" - ?obj -- Looks up an object with the specified name, uses its address. This will abort if\n");
- DebugPrintf(" the object name is ambiguous; in that case, a list of addresses and indices is provided.\n");
- DebugPrintf(" ?obj.idx may be used to disambiguate 'obj' by the index 'idx'.\n");
- DebugPrintf(" Underscores are used as substitute characters for spaces in object names.\n");
- DebugPrintf(" For example, an object named \"Glass Jar\" can be accessed as \"Glass_Jar\".\n");
+ debugPrintf("Address parameters may be passed in one of three forms:\n");
+ debugPrintf(" - ssss:oooo -- where 'ssss' denotes a segment and 'oooo' an offset.\n");
+ debugPrintf(" Example: \"a:c5\" would address something in segment 0xa at offset 0xc5.\n");
+ debugPrintf(" - &scr:oooo -- where 'scr' is a script number and oooo an offset within that script; will\n");
+ debugPrintf(" fail if the script is not currently loaded\n");
+ debugPrintf(" - $REG -- where 'REG' is one of 'PC', 'ACC', 'PREV' or 'OBJ': References the address\n");
+ debugPrintf(" indicated by the register of this name.\n");
+ debugPrintf(" - $REG+n (or -n) -- Like $REG, but modifies the offset part by a specific amount (which\n");
+ debugPrintf(" is specified in hexadecimal).\n");
+ debugPrintf(" - ?obj -- Looks up an object with the specified name, uses its address. This will abort if\n");
+ debugPrintf(" the object name is ambiguous; in that case, a list of addresses and indices is provided.\n");
+ debugPrintf(" ?obj.idx may be used to disambiguate 'obj' by the index 'idx'.\n");
+ debugPrintf(" Underscores are used as substitute characters for spaces in object names.\n");
+ debugPrintf(" For example, an object named \"Glass Jar\" can be accessed as \"Glass_Jar\".\n");
return true;
}
@@ -3840,10 +3859,15 @@ static int parse_reg_t(EngineState *s, const char *str, reg_t *dest, bool mayBeV
const char *tmp = Common::find(str_objname.begin(), str_objname.end(), '.');
if (tmp != str_objname.end()) {
index = strtol(tmp + 1, &endptr, 16);
- if (*endptr)
- return -1;
- // Chop off the index
- str_objname = Common::String(str_objname.c_str(), tmp);
+ if (*endptr) {
+ // The characters after the dot do not represent an index.
+ // This can happen if an object contains a dot in its name,
+ // like 'dominoes.opt' in Hoyle 3.
+ index = -1;
+ } else {
+ // Valid index found, chop it off
+ str_objname = Common::String(str_objname.c_str(), tmp);
+ }
}
// Replace all underscores in the name with spaces
@@ -3882,14 +3906,14 @@ bool Console::parseInteger(const char *argument, int &result) {
// hexadecimal number
result = strtol(argument, &endPtr, 16);
if ((*endPtr != 0) && (*endPtr != 'h')) {
- DebugPrintf("Invalid hexadecimal number '%s'\n", argument);
+ debugPrintf("Invalid hexadecimal number '%s'\n", argument);
return false;
}
} else {
// decimal number
result = strtol(argument, &endPtr, 10);
if (*endPtr != 0) {
- DebugPrintf("Invalid decimal number '%s'\n", argument);
+ debugPrintf("Invalid decimal number '%s'\n", argument);
return false;
}
}
@@ -3907,57 +3931,57 @@ void Console::printBasicVarInfo(reg_t variable) {
case SIG_TYPE_INTEGER: {
uint16 content = variable.toUint16();
if (content >= 10)
- DebugPrintf(" (%dd)", content);
+ debugPrintf(" (%dd)", content);
break;
}
case SIG_TYPE_OBJECT:
- DebugPrintf(" (object '%s')", segMan->getObjectName(variable));
+ debugPrintf(" (object '%s')", segMan->getObjectName(variable));
break;
case SIG_TYPE_REFERENCE:
- DebugPrintf(" (reference)");
+ debugPrintf(" (reference)");
break;
case SIG_TYPE_NODE:
- DebugPrintf(" (node)");
+ debugPrintf(" (node)");
break;
case SIG_TYPE_LIST:
- DebugPrintf(" (list)");
+ debugPrintf(" (list)");
break;
case SIG_TYPE_UNINITIALIZED:
- DebugPrintf(" (uninitialized)");
+ debugPrintf(" (uninitialized)");
break;
case SIG_TYPE_ERROR:
- DebugPrintf(" (error)");
+ debugPrintf(" (error)");
break;
default:
- DebugPrintf(" (??\?)");
+ debugPrintf(" (??\?)");
}
if (regType & SIG_IS_INVALID)
- DebugPrintf(" IS INVALID!");
+ debugPrintf(" IS INVALID!");
}
void Console::printList(List *list) {
reg_t pos = list->first;
reg_t my_prev = NULL_REG;
- DebugPrintf("\t<\n");
+ debugPrintf("\t<\n");
while (!pos.isNull()) {
Node *node;
NodeTable *nt = (NodeTable *)_engine->_gamestate->_segMan->getSegment(pos.getSegment(), SEG_TYPE_NODES);
if (!nt || !nt->isValidEntry(pos.getOffset())) {
- DebugPrintf(" WARNING: %04x:%04x: Doesn't contain list node!\n",
+ debugPrintf(" WARNING: %04x:%04x: Doesn't contain list node!\n",
PRINT_REG(pos));
return;
}
node = &(nt->_table[pos.getOffset()]);
- DebugPrintf("\t%04x:%04x : %04x:%04x -> %04x:%04x\n", PRINT_REG(pos), PRINT_REG(node->key), PRINT_REG(node->value));
+ debugPrintf("\t%04x:%04x : %04x:%04x -> %04x:%04x\n", PRINT_REG(pos), PRINT_REG(node->key), PRINT_REG(node->value));
if (my_prev != node->pred)
- DebugPrintf(" WARNING: current node gives %04x:%04x as predecessor!\n",
+ debugPrintf(" WARNING: current node gives %04x:%04x as predecessor!\n",
PRINT_REG(node->pred));
my_prev = pos;
@@ -3965,9 +3989,9 @@ void Console::printList(List *list) {
}
if (my_prev != list->last)
- DebugPrintf(" WARNING: Last node was expected to be %04x:%04x, was %04x:%04x!\n",
+ debugPrintf(" WARNING: Last node was expected to be %04x:%04x, was %04x:%04x!\n",
PRINT_REG(list->last), PRINT_REG(my_prev));
- DebugPrintf("\t>\n");
+ debugPrintf("\t>\n");
}
int Console::printNode(reg_t addr) {
@@ -3978,32 +4002,32 @@ int Console::printNode(reg_t addr) {
List *list;
if (!lt->isValidEntry(addr.getOffset())) {
- DebugPrintf("Address does not contain a list\n");
+ debugPrintf("Address does not contain a list\n");
return 1;
}
list = &(lt->_table[addr.getOffset()]);
- DebugPrintf("%04x:%04x : first x last = (%04x:%04x, %04x:%04x)\n", PRINT_REG(addr), PRINT_REG(list->first), PRINT_REG(list->last));
+ debugPrintf("%04x:%04x : first x last = (%04x:%04x, %04x:%04x)\n", PRINT_REG(addr), PRINT_REG(list->first), PRINT_REG(list->last));
} else {
NodeTable *nt;
Node *node;
mobj = _engine->_gamestate->_segMan->getSegment(addr.getSegment(), SEG_TYPE_NODES);
if (!mobj) {
- DebugPrintf("Segment #%04x is not a list or node segment\n", addr.getSegment());
+ debugPrintf("Segment #%04x is not a list or node segment\n", addr.getSegment());
return 1;
}
nt = (NodeTable *)mobj;
if (!nt->isValidEntry(addr.getOffset())) {
- DebugPrintf("Address does not contain a node\n");
+ debugPrintf("Address does not contain a node\n");
return 1;
}
node = &(nt->_table[addr.getOffset()]);
- DebugPrintf("%04x:%04x : prev x next = (%04x:%04x, %04x:%04x); maps %04x:%04x -> %04x:%04x\n",
+ debugPrintf("%04x:%04x : prev x next = (%04x:%04x, %04x:%04x); maps %04x:%04x -> %04x:%04x\n",
PRINT_REG(addr), PRINT_REG(node->pred), PRINT_REG(node->succ), PRINT_REG(node->key), PRINT_REG(node->value));
}
@@ -4017,44 +4041,44 @@ int Console::printObject(reg_t pos) {
uint i;
if (!obj) {
- DebugPrintf("[%04x:%04x]: Not an object.", PRINT_REG(pos));
+ debugPrintf("[%04x:%04x]: Not an object.", PRINT_REG(pos));
return 1;
}
// Object header
- DebugPrintf("[%04x:%04x] %s : %3d vars, %3d methods\n", PRINT_REG(pos), s->_segMan->getObjectName(pos),
+ debugPrintf("[%04x:%04x] %s : %3d vars, %3d methods\n", PRINT_REG(pos), s->_segMan->getObjectName(pos),
obj->getVarCount(), obj->getMethodCount());
if (!obj->isClass() && getSciVersion() != SCI_VERSION_3)
var_container = s->_segMan->getObject(obj->getSuperClassSelector());
- DebugPrintf(" -- member variables:\n");
+ debugPrintf(" -- member variables:\n");
for (i = 0; (uint)i < obj->getVarCount(); i++) {
- DebugPrintf(" ");
+ debugPrintf(" ");
if (var_container && i < var_container->getVarCount()) {
uint16 varSelector = var_container->getVarSelector(i);
- DebugPrintf("[%03x] %s = ", varSelector, _engine->getKernel()->getSelectorName(varSelector).c_str());
+ debugPrintf("[%03x] %s = ", varSelector, _engine->getKernel()->getSelectorName(varSelector).c_str());
} else
- DebugPrintf("p#%x = ", i);
+ debugPrintf("p#%x = ", i);
reg_t val = obj->getVariable(i);
- DebugPrintf("%04x:%04x", PRINT_REG(val));
+ debugPrintf("%04x:%04x", PRINT_REG(val));
if (!val.getSegment())
- DebugPrintf(" (%d)", val.getOffset());
+ debugPrintf(" (%d)", val.getOffset());
const Object *ref = s->_segMan->getObject(val);
if (ref)
- DebugPrintf(" (%s)", s->_segMan->getObjectName(val));
+ debugPrintf(" (%s)", s->_segMan->getObjectName(val));
- DebugPrintf("\n");
+ debugPrintf("\n");
}
- DebugPrintf(" -- methods:\n");
+ debugPrintf(" -- methods:\n");
for (i = 0; i < obj->getMethodCount(); i++) {
reg_t fptr = obj->getFunction(i);
- DebugPrintf(" [%03x] %s = %04x:%04x\n", obj->getFuncSelector(i), _engine->getKernel()->getSelectorName(obj->getFuncSelector(i)).c_str(), PRINT_REG(fptr));
+ debugPrintf(" [%03x] %s = %04x:%04x\n", obj->getFuncSelector(i), _engine->getKernel()->getSelectorName(obj->getFuncSelector(i)).c_str(), PRINT_REG(fptr));
}
if (s->_segMan->_heap[pos.getSegment()]->getType() == SEG_TYPE_SCRIPT)
- DebugPrintf("\nOwner script: %d\n", s->_segMan->getScript(pos.getSegment())->getScriptNumber());
+ debugPrintf("\nOwner script: %d\n", s->_segMan->getScript(pos.getSegment())->getScriptNumber());
return 0;
}
diff --git a/engines/sci/console.h b/engines/sci/console.h
index 37cf35a471..c8e99f78f7 100644
--- a/engines/sci/console.h
+++ b/engines/sci/console.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/sci/debug.h b/engines/sci/debug.h
index 765ceca07d..4fcb757c10 100644
--- a/engines/sci/debug.h
+++ b/engines/sci/debug.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/sci/decompressor.cpp b/engines/sci/decompressor.cpp
index 306825008d..e65ff148de 100644
--- a/engines/sci/decompressor.cpp
+++ b/engines/sci/decompressor.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/sci/decompressor.h b/engines/sci/decompressor.h
index 5753026709..dab35fa41c 100644
--- a/engines/sci/decompressor.h
+++ b/engines/sci/decompressor.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/sci/detection.cpp b/engines/sci/detection.cpp
index 883a4d965b..4f28738508 100644
--- a/engines/sci/detection.cpp
+++ b/engines/sci/detection.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/sci/detection_tables.h b/engines/sci/detection_tables.h
index 5ad49acf5c..344298ce9a 100644
--- a/engines/sci/detection_tables.h
+++ b/engines/sci/detection_tables.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -50,7 +50,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.map", 0, "f3d1be7752d30ba60614533d531e2e98", 474},
{"resource.001", 0, "6fd05926c2199af0af6f72f90d0d7260", 126895},
AD_LISTEND},
- Common::EN_ANY, Common::kPlatformDOS, 0, GUIO5(GUIO_NOSPEECH, GAMEOPTION_EGA_UNDITHER, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
+ Common::EN_ANY, Common::kPlatformDOS, 0, GUIO5(GUIO_NOSPEECH, GAMEOPTION_EGA_UNDITHER, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
// Castle of Dr. Brain - English Amiga (from www.back2roots.org)
// Executable scanning reports "1.005.000"
@@ -62,7 +62,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.002", 0, "d226d7d3b4f77c4a566913fc310487fc", 792380},
{"resource.003", 0, "d226d7d3b4f77c4a566913fc310487fc", 464348},
AD_LISTEND},
- Common::EN_ANY, Common::kPlatformAmiga, 0, GUIO4(GUIO_NOSPEECH, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
+ Common::EN_ANY, Common::kPlatformAmiga, 0, GUIO4(GUIO_NOSPEECH, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
// Castle of Dr. Brain - German Amiga (from www.back2roots.org, also includes English language)
// Executable scanning reports "1.005.001"
@@ -74,7 +74,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.002", 0, "85e51acb5f9c539d66e3c8fe40e17da5", 826309},
{"resource.003", 0, "85e51acb5f9c539d66e3c8fe40e17da5", 493638},
AD_LISTEND},
- Common::DE_DEU, Common::kPlatformAmiga, ADGF_ADDENGLISH, GUIO4(GUIO_NOSPEECH, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
+ Common::DE_DEU, Common::kPlatformAmiga, ADGF_ADDENGLISH, GUIO4(GUIO_NOSPEECH, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
// Castle of Dr. Brain Macintosh (from omer_mor, bug report #3328251)
{"castlebrain", "", {
@@ -84,7 +84,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.002", 0, "e1a6b6f1060f60be9dcb6d28ad7a2a20", 1168310},
{"resource.003", 0, "6c3d1bb26ad532c94046bc9ac49b5ff4", 891295},
AD_LISTEND},
- Common::EN_ANY, Common::kPlatformMacintosh, 0, GUIO4(GUIO_NOSPEECH, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
+ Common::EN_ANY, Common::kPlatformMacintosh, 0, GUIO4(GUIO_NOSPEECH, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
// Castle of Dr. Brain - English DOS Non-Interactive Demo
// SCI interpreter version 1.000.005
@@ -93,7 +93,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.000", 0, "9780f040d58182994e22d2e34fab85b0", 67367},
{"resource.001", 0, "2af49dbd8f2e1db4ab09f9310dc91259", 570553},
AD_LISTEND},
- Common::EN_ANY, Common::kPlatformDOS, ADGF_DEMO, GUIO4(GUIO_NOSPEECH, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
+ Common::EN_ANY, Common::kPlatformDOS, ADGF_DEMO, GUIO4(GUIO_NOSPEECH, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
// Castle of Dr. Brain - English DOS 5.25" Floppy EGA (from omer_mor, bug report #3035349)
{"castlebrain", "EGA", {
@@ -106,7 +106,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.005", 0, "8a5ed3ba96e2eaf18e36fedfaab89419", 297838},
{"resource.006", 0, "dceed92e709cad1bd9582809a235b0a0", 266682},
AD_LISTEND},
- Common::EN_ANY, Common::kPlatformDOS, 0, GUIO5(GUIO_NOSPEECH, GAMEOPTION_EGA_UNDITHER, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
+ Common::EN_ANY, Common::kPlatformDOS, 0, GUIO4(GUIO_NOSPEECH, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
// Castle of Dr. Brain - English DOS 3.5" Floppy EGA (from nozomi77, bug report #3405307)
{"castlebrain", "EGA", {
@@ -116,7 +116,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.002", 0, "de2f182529efaad2c4b510b452ab77ac", 633662},
{"resource.003", 0, "38b4b37febc6b4f5061c461a283df148", 430388},
AD_LISTEND},
- Common::EN_ANY, Common::kPlatformDOS, 0, GUIO5(GUIO_NOSPEECH, GAMEOPTION_EGA_UNDITHER, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
+ Common::EN_ANY, Common::kPlatformDOS, 0, GUIO4(GUIO_NOSPEECH, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
// 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"
@@ -127,7 +127,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.001", 0, "d2f5a1be74ed963fa849a76892be5290", 794832},
{"resource.002", 0, "c0c29c51af66d65cb53f49e785a2d978", 1280907},
AD_LISTEND},
- Common::EN_ANY, Common::kPlatformDOS, 0, GUIO4(GUIO_NOSPEECH, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
+ Common::EN_ANY, Common::kPlatformDOS, 0, GUIO4(GUIO_NOSPEECH, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
// Castle of Dr. Brain - English DOS 5.25" Floppy VGA 1.1 (from rnjacobs, bug report #3578286)
{"castlebrain", "", {
@@ -137,7 +137,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.002", 0, "583d348c908f89f94f8551d7fe0a2eca", 991752},
{"resource.003", 0, "6c3d1bb26ad532c94046bc9ac49b5ff4", 728315},
AD_LISTEND},
- Common::EN_ANY, Common::kPlatformDOS, 0, GUIO4(GUIO_NOSPEECH, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
+ Common::EN_ANY, Common::kPlatformDOS, 0, GUIO4(GUIO_NOSPEECH, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
// Castle of Dr. Brain - English DOS Floppy 1.1
{"castlebrain", "", {
@@ -146,7 +146,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.001", 0, "13e81e1839cd7b216d2bb5615c1ca160", 796776},
{"resource.002", 0, "930e416bec196b9703a331d81b3d66f2", 1283812},
AD_LISTEND},
- Common::EN_ANY, Common::kPlatformDOS, 0, GUIO4(GUIO_NOSPEECH, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
+ Common::EN_ANY, Common::kPlatformDOS, 0, GUIO4(GUIO_NOSPEECH, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
// Castle of Dr. Brain - English DOS Floppy 1.000
// Reported by graxer in bug report #3037942
@@ -161,7 +161,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.006", 0, "1d778a0c65cac9ddbab65495e50a94ee", 335281},
{"resource.007", 0, "063bb8ce4157c778cf30d1c912c006f1", 335631},
AD_LISTEND},
- Common::EN_ANY, Common::kPlatformDOS, 0, GUIO4(GUIO_NOSPEECH, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
+ Common::EN_ANY, Common::kPlatformDOS, 0, GUIO4(GUIO_NOSPEECH, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
// Castle of Dr. Brain - Spanish DOS (also includes english language)
// SCI interpreter version 1.000.510
@@ -170,7 +170,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.000", 0, "27ec5fa09cd12a7fd16e86d96a2ed245", 1197694},
{"resource.001", 0, "735be4e58957180cfc807d5e18fdffcd", 1433302},
AD_LISTEND},
- Common::ES_ESP, Common::kPlatformDOS, ADGF_ADDENGLISH, GUIO4(GUIO_NOSPEECH, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
+ Common::ES_ESP, Common::kPlatformDOS, ADGF_ADDENGLISH, GUIO4(GUIO_NOSPEECH, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
#ifdef ENABLE_SCI32
// Inside the Chest / Behind the Developer's Shield
@@ -179,7 +179,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.map", 0, "9dd015e79cac4f91e7de805448f39775", 1912},
{"resource.000", 0, "e4efcd042f86679dd4e1834bb3a38edb", 3770943},
AD_LISTEND},
- Common::EN_ANY, Common::kPlatformDOS, ADGF_UNSTABLE, GUIO3(GUIO_NOSPEECH, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_FB01_MIDI) },
+ Common::EN_ANY, Common::kPlatformDOS, ADGF_UNSTABLE, GUIO3(GUIO_NOSPEECH, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_FB01_MIDI) },
#endif
// Christmas Card 1988 - English DOS
@@ -188,7 +188,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.map", 0, "39485580d34a72997f3d5b3aba4d24f1", 426},
{"resource.001", 0, "11391434f41c834090d7a1e9488ce936", 129739},
AD_LISTEND},
- Common::EN_ANY, Common::kPlatformDOS, 0, GUIO5(GUIO_NOSPEECH, GAMEOPTION_EGA_UNDITHER, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
+ Common::EN_ANY, Common::kPlatformDOS, 0, GUIO5(GUIO_NOSPEECH, GAMEOPTION_EGA_UNDITHER, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
// Christmas Card 1990: The Seasoned Professional - English DOS (16 Colors)
// SCI interpreter version 1.000.172
@@ -196,7 +196,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.map", 0, "8f656714a05b94423ac6eb10ee8797d0", 600},
{"resource.001", 0, "acde93e58fca4f7a2a5a220558a94aa8", 272629},
AD_LISTEND},
- Common::EN_ANY, Common::kPlatformDOS, 0, GUIO4(GUIO_NOSPEECH, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
+ Common::EN_ANY, Common::kPlatformDOS, 0, GUIO4(GUIO_NOSPEECH, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
// Christmas Card 1990: The Seasoned Professional - English DOS (256 Colors)
// SCI interpreter version 1.000.174
@@ -204,7 +204,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.map", 0, "44b8f45b841b9b5e17e939a35e443988", 600},
{"resource.001", 0, "acde93e58fca4f7a2a5a220558a94aa8", 335362},
AD_LISTEND},
- Common::EN_ANY, Common::kPlatformDOS, 0, GUIO4(GUIO_NOSPEECH, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
+ Common::EN_ANY, Common::kPlatformDOS, 0, GUIO4(GUIO_NOSPEECH, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
// Christmas Card 1992 - English DOS
// SCI interpreter version 1.001.055
@@ -212,7 +212,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.map", 0, "f1f8c8a8443f523422af70b4ec85b71c", 318},
{"resource.000", 0, "62fb9256f8e7e6e65a6875efdb7939ac", 203396},
AD_LISTEND},
- Common::EN_ANY, Common::kPlatformDOS, 0, GUIO4(GUIO_NOSPEECH, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
+ Common::EN_ANY, Common::kPlatformDOS, 0, GUIO4(GUIO_NOSPEECH, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
// Codename: Iceman - English Amiga (from www.back2roots.org)
// Executable scanning reports "1.002.031"
@@ -226,7 +226,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.004", 0, "8613c45fc771d658e5a505b9a4a54f31", 713382},
{"resource.005", 0, "605b67a9ef199a9bb015745e7c004cf4", 478384},
AD_LISTEND},
- Common::EN_ANY, Common::kPlatformAmiga, 0, GUIO5(GUIO_NOSPEECH, GAMEOPTION_EGA_UNDITHER, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
+ Common::EN_ANY, Common::kPlatformAmiga, 0, GUIO5(GUIO_NOSPEECH, GAMEOPTION_EGA_UNDITHER, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
// Codename: Iceman - English DOS Non-Interactive Demo
// Executable scanning reports "0.000.685"
@@ -234,7 +234,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.map", 0, "782974f29d8a824782d2d4aea39964e3", 1056},
{"resource.001", 0, "d4b75e280d1c3a97cfef1b0bebff387c", 573647},
AD_LISTEND},
- Common::EN_ANY, Common::kPlatformDOS, ADGF_DEMO, GUIO5(GUIO_NOSPEECH, GAMEOPTION_EGA_UNDITHER, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
+ Common::EN_ANY, Common::kPlatformDOS, ADGF_DEMO, GUIO5(GUIO_NOSPEECH, GAMEOPTION_EGA_UNDITHER, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
// 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"
@@ -247,7 +247,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.003", 0, "d97a96f1ab91b41cf46a02cc89b0a04e", 624303},
{"resource.004", 0, "8613c45fc771d658e5a505b9a4a54f31", 670883},
AD_LISTEND},
- Common::EN_ANY, Common::kPlatformDOS, 0, GUIO5(GUIO_NOSPEECH, GAMEOPTION_EGA_UNDITHER, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
+ Common::EN_ANY, Common::kPlatformDOS, 0, GUIO5(GUIO_NOSPEECH, GAMEOPTION_EGA_UNDITHER, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
// Codename: Iceman - English DOS (from FRG)
// SCI interpreter version 0.000.668
@@ -259,7 +259,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.003", 0, "dc7c5280e7acfaffe6ef2a6c963c5f94", 622118},
{"resource.004", 0, "64f342463f6f35ba71b3509ef696ae3f", 669188},
AD_LISTEND},
- Common::EN_ANY, Common::kPlatformDOS, 0, GUIO5(GUIO_NOSPEECH, GAMEOPTION_EGA_UNDITHER, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
+ Common::EN_ANY, Common::kPlatformDOS, 0, GUIO5(GUIO_NOSPEECH, GAMEOPTION_EGA_UNDITHER, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
// Codename: Iceman - English DOS (supplied by ssburnout in bug report #3049193)
// 1.022 9x5.25" (label: Int#0.000.668)
@@ -274,7 +274,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.006", 0, "08050329aa113a9f14ed99cbfe3536ec", 232942},
{"resource.007", 0, "64f342463f6f35ba71b3509ef696ae3f", 267811},
AD_LISTEND},
- Common::EN_ANY, Common::kPlatformDOS, 0, GUIO5(GUIO_NOSPEECH, GAMEOPTION_EGA_UNDITHER, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
+ Common::EN_ANY, Common::kPlatformDOS, 0, GUIO5(GUIO_NOSPEECH, GAMEOPTION_EGA_UNDITHER, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
// Codename: Iceman - English DOS 1.023 (from abevi, bug report #2612718)
{"iceman", "", {
@@ -288,7 +288,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.006", 0, "08050329aa113a9f14ed99cbfe3536ec", 232942},
{"resource.007", 0, "64f342463f6f35ba71b3509ef696ae3f", 267702},
AD_LISTEND},
- Common::EN_ANY, Common::kPlatformDOS, 0, GUIO5(GUIO_NOSPEECH, GAMEOPTION_EGA_UNDITHER, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
+ Common::EN_ANY, Common::kPlatformDOS, 0, GUIO5(GUIO_NOSPEECH, GAMEOPTION_EGA_UNDITHER, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
// Conquests of Camelot - English Amiga (from www.back2roots.org)
// Executable scanning reports "1.002.030"
@@ -303,7 +303,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.005", 0, "c6e551bdc24f0acc193159038d4ca767", 605882},
{"resource.006", 0, "8f880a536908ab496bbc552f7f5c3738", 585255},
AD_LISTEND},
- Common::EN_ANY, Common::kPlatformAmiga, 0, GUIO5(GUIO_NOSPEECH, GAMEOPTION_EGA_UNDITHER, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
+ Common::EN_ANY, Common::kPlatformAmiga, 0, GUIO5(GUIO_NOSPEECH, GAMEOPTION_EGA_UNDITHER, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
// Conquests of Camelot - English DOS Non-Interactive Demo
// SCI interpreter version 0.000.668
@@ -311,7 +311,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.map", 0, "f4cd75c15be75e04cdca3acda2c0b0ea", 468},
{"resource.001", 0, "4930708722f34bfbaa4945fb08f55f61", 232523},
AD_LISTEND},
- Common::EN_ANY, Common::kPlatformDOS, ADGF_DEMO, GUIO5(GUIO_NOSPEECH, GAMEOPTION_EGA_UNDITHER, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
+ Common::EN_ANY, Common::kPlatformDOS, ADGF_DEMO, GUIO5(GUIO_NOSPEECH, GAMEOPTION_EGA_UNDITHER, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
// 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"
@@ -323,7 +323,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.003", 0, "8e1a3a8c588007404b532b8dfacc1460", 723712},
{"resource.004", 0, "8e1a3a8c588007404b532b8dfacc1460", 729143},
AD_LISTEND},
- Common::EN_ANY, Common::kPlatformDOS, 0, GUIO5(GUIO_NOSPEECH, GAMEOPTION_EGA_UNDITHER, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
+ Common::EN_ANY, Common::kPlatformDOS, 0, GUIO5(GUIO_NOSPEECH, GAMEOPTION_EGA_UNDITHER, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
// Conquests of Camelot - English DOS
// SCI interpreter version 0.000.685
@@ -337,7 +337,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.006", 0, "8e1a3a8c588007404b532b8dfacc1460", 332446},
{"resource.007", 0, "8e1a3a8c588007404b532b8dfacc1460", 358182},
AD_LISTEND},
- Common::EN_ANY, Common::kPlatformDOS, 0, GUIO5(GUIO_NOSPEECH, GAMEOPTION_EGA_UNDITHER, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
+ Common::EN_ANY, Common::kPlatformDOS, 0, GUIO5(GUIO_NOSPEECH, GAMEOPTION_EGA_UNDITHER, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
// Conquests of the Longbow - English Amiga (from www.back2roots.org)
// Executable scanning reports "1.005.001"
@@ -352,7 +352,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.005", 0, "1c3804e56b114028c5873a35c2f06d13", 653002},
{"resource.006", 0, "f9487732289a4f4966b4e34eea413325", 842817},
AD_LISTEND},
- Common::EN_ANY, Common::kPlatformAmiga, 0, GUIO4(GUIO_NOSPEECH, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
+ Common::EN_ANY, Common::kPlatformAmiga, 0, GUIO4(GUIO_NOSPEECH, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
// Conquests of the Longbow - English DOS
// SCI interpreter version 1.000.510
@@ -366,7 +366,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.005", 0, "d036df0872f2db19bca34601276be2d7", 1154950},
{"resource.006", 0, "b367a6a59f29ee30dde1d88a5a41152d", 1042966},
AD_LISTEND},
- Common::EN_ANY, Common::kPlatformDOS, 0, GUIO4(GUIO_NOSPEECH, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
+ Common::EN_ANY, Common::kPlatformDOS, 0, GUIO4(GUIO_NOSPEECH, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
// 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"
@@ -380,7 +380,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.004", 0, "9cfce07e204a329e94fda8b5657621da", 1261462},
{"resource.005", 0, "21ebe6b39b57a73fc449f67f013765aa", 1284720},
AD_LISTEND},
- Common::EN_ANY, Common::kPlatformDOS, 0, GUIO4(GUIO_NOSPEECH, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
+ Common::EN_ANY, Common::kPlatformDOS, 0, GUIO4(GUIO_NOSPEECH, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
// Conquests of the Longbow - English DOS
// SCI interpreter version 1.000.510
@@ -393,30 +393,32 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.004", 0, "9cfce07e204a329e94fda8b5657621da", 1260237},
{"resource.005", 0, "21ebe6b39b57a73fc449f67f013765aa", 1284609},
AD_LISTEND},
- Common::EN_ANY, Common::kPlatformDOS, 0, GUIO4(GUIO_NOSPEECH, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
+ Common::EN_ANY, Common::kPlatformDOS, 0, GUIO4(GUIO_NOSPEECH, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
// Conquests of the Longbow EGA - English DOS
// SCI interpreter version 1.000.510
{"longbow", "EGA", {
- {"resource.map", 0, "7676ec9f08967d7a9a7724f5170456e0", 6261},
- {"resource.000", 0, "36e8fda5d0b8c49e587c8a9617959f72", 718161},
- {"resource.001", 0, "3c3735caa34fa3f261a9552831bb43ed", 705680},
- {"resource.002", 0, "7025b87e735b1df3f0e9488a621f4333", 700633},
- {"resource.003", 0, "eaca7933e8e56bea22b42f7fd5d7a8a7", 686510},
- {"resource.004", 0, "b7bb35c027bb424ecefcd122768e5e60", 705631},
- {"resource.005", 0, "58942b1aa6d6ffeb66e9f8897fd4435f", 469243},
- {"resource.006", 0, "8c767b3939add63d11274065e46aad04", 713158},
- AD_LISTEND}, Common::EN_ANY, Common::kPlatformDOS, 0, GUIO5(GUIO_NOSPEECH, GAMEOPTION_EGA_UNDITHER, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
+ {"resource.map", 0, "7676ec9f08967d7a9a7724f5170456e0", 6261},
+ {"resource.000", 0, "36e8fda5d0b8c49e587c8a9617959f72", 718161},
+ {"resource.001", 0, "3c3735caa34fa3f261a9552831bb43ed", 705680},
+ {"resource.002", 0, "7025b87e735b1df3f0e9488a621f4333", 700633},
+ {"resource.003", 0, "eaca7933e8e56bea22b42f7fd5d7a8a7", 686510},
+ {"resource.004", 0, "b7bb35c027bb424ecefcd122768e5e60", 705631},
+ {"resource.005", 0, "58942b1aa6d6ffeb66e9f8897fd4435f", 469243},
+ {"resource.006", 0, "8c767b3939add63d11274065e46aad04", 713158},
+ AD_LISTEND},
+ Common::EN_ANY, Common::kPlatformDOS, 0, GUIO4(GUIO_NOSPEECH, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
// Conquests of the Longbow DOS 1.0 EGA (4 x 5.25" disks)
// Provided by ssburnout in bug report #3046802
{"longbow", "EGA", {
- {"resource.map", 0, "0517ca368ec844df0cb21a05020fae01", 6021},
- {"resource.000", 0, "36e8fda5d0b8c49e587c8a9617959f72", 934643},
- {"resource.001", 0, "76c729e563809170e6cc8b2f3f6cf0a4", 1196133},
- {"resource.002", 0, "8c767b3939add63d11274065e46aad04", 1152478},
- {"resource.003", 0, "7025b87e735b1df3f0e9488a621f4333", 1171439},
- AD_LISTEND}, Common::EN_ANY, Common::kPlatformDOS, 0, GUIO5(GUIO_NOSPEECH, GAMEOPTION_EGA_UNDITHER, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
+ {"resource.map", 0, "0517ca368ec844df0cb21a05020fae01", 6021},
+ {"resource.000", 0, "36e8fda5d0b8c49e587c8a9617959f72", 934643},
+ {"resource.001", 0, "76c729e563809170e6cc8b2f3f6cf0a4", 1196133},
+ {"resource.002", 0, "8c767b3939add63d11274065e46aad04", 1152478},
+ {"resource.003", 0, "7025b87e735b1df3f0e9488a621f4333", 1171439},
+ AD_LISTEND},
+ Common::EN_ANY, Common::kPlatformDOS, 0, GUIO4(GUIO_NOSPEECH, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
// Conquests of the Longbow - English DOS Non-Interactive Demo
// SCI interpreter version 1.000.510
@@ -424,7 +426,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.map", 0, "cbc5cb73341de1bff1b1e20a640af220", 588},
{"resource.001", 0, "f05a20cc07eee85da8e999d0ac0f596b", 869916},
AD_LISTEND},
- Common::EN_ANY, Common::kPlatformDOS, ADGF_DEMO, GUIO4(GUIO_NOSPEECH, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
+ Common::EN_ANY, Common::kPlatformDOS, ADGF_DEMO, GUIO4(GUIO_NOSPEECH, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
// Conquests of the Longbow - German DOS (suplied by markcoolio in bug report #2727681, also includes english language)
// SCI interpreter version 1.000.510
@@ -438,7 +440,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.005", 0, "d036df0872f2db19bca34601276be2d7", 1176914},
{"resource.006", 0, "b367a6a59f29ee30dde1d88a5a41152d", 1123585},
AD_LISTEND},
- Common::DE_DEU, Common::kPlatformDOS, ADGF_ADDENGLISH, GUIO4(GUIO_NOSPEECH, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
+ Common::DE_DEU, Common::kPlatformDOS, ADGF_ADDENGLISH, GUIO4(GUIO_NOSPEECH, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
// Eco Quest - English DOS Non-Interactive Demo (from FRG)
// Executable scanning reports "x.yyy.zzz"
@@ -447,7 +449,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.map", 0, "c819e171359b7c95f4c13b846d5c034e", 873},
{"resource.001", 0, "baf9393a9bfa73098adb501e5bc5487b", 657518},
AD_LISTEND},
- Common::EN_ANY, Common::kPlatformDOS, ADGF_DEMO, GUIO4(GUIO_NOSPEECH, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
+ Common::EN_ANY, Common::kPlatformDOS, ADGF_DEMO, GUIO4(GUIO_NOSPEECH, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
// Eco Quest - English DOS CD 1.1
// SCI interpreter version 1.001.064
@@ -455,7 +457,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.map", 0, "a4b73d5d2b55bdb6e44345e99c8fbdd0", 4804},
{"resource.000", 0, "d908dbef56816ac6c60dd145fdeafb2b", 3536046},
AD_LISTEND},
- Common::EN_ANY, Common::kPlatformDOS, ADGF_CD, GUIO3(GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
+ Common::EN_ANY, Common::kPlatformDOS, ADGF_CD, GUIO3(GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
// Eco Quest - English DOS CD 1.1
// SCI interpreter version 1.001.064
@@ -465,7 +467,15 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.map", 0, "a4b73d5d2b55bdb6e44345e99c8fbdd0", 4804},
{"resource.000", 0, "d908dbef56816ac6c60dd145fdeafb2b", 3536046},
AD_LISTEND},
- Common::EN_ANY, Common::kPlatformWindows, ADGF_CD, GUIO4(GUIO_MIDIGM, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
+ Common::EN_ANY, Common::kPlatformWindows, ADGF_CD, GUIO4(GUIO_MIDIGM, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
+
+ // Eco Quest - English DOS Floppy (reported by misterhands in bug #6599)
+ // Game v1.10, interpreter 2.000.286, INT #6.12.92
+ {"ecoquest", "Floppy", {
+ {"resource.map", 0, "acb10c12bf15ffa7d0fac36124b20c8e", 4890},
+ {"resource.000", 0, "89cf7c8eed99afd0a9f4188170b81ebe", 3428654},
+ AD_LISTEND},
+ Common::EN_ANY, Common::kPlatformDOS, 0, GUIO4(GUIO_NOSPEECH, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
// Eco Quest - English DOS Floppy
// SCI interpreter version 1.000.510
@@ -476,7 +486,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.002", 0, "28fe9b4f0567e71feb198bc9f3a2c605", 1241816},
{"resource.003", 0, "f3146df0ad4297f5ce35aa8c4753bf6c", 586832},
AD_LISTEND},
- Common::EN_ANY, Common::kPlatformDOS, 0, GUIO4(GUIO_NOSPEECH, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
+ Common::EN_ANY, Common::kPlatformDOS, 0, GUIO4(GUIO_NOSPEECH, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
// Eco Quest - English DOS Floppy
// SCI interpreter version 1.000.510
@@ -487,7 +497,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.002", 0, "323b3b12f43d53f27d259beb225f0aa7", 1129316},
{"resource.003", 0, "83ac03e4bddb2c1ac2d36d2a587d0536", 1145616},
AD_LISTEND},
- Common::EN_ANY, Common::kPlatformDOS, 0, GUIO4(GUIO_NOSPEECH, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
+ Common::EN_ANY, Common::kPlatformDOS, 0, GUIO4(GUIO_NOSPEECH, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
// Eco Quest - German DOS Floppy (supplied by markcoolio in bug report #2723744, also includes english language)
// SCI interpreter version 1.000.510
@@ -498,7 +508,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.002", 0, "02d7d0411f7903aacb3bc8b0f8ca8a9a", 1202581},
{"resource.003", 0, "84dd11b6825255671c703aee5ceff620", 1175835},
AD_LISTEND},
- Common::DE_DEU, Common::kPlatformDOS, ADGF_ADDENGLISH, GUIO4(GUIO_NOSPEECH, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
+ Common::DE_DEU, Common::kPlatformDOS, ADGF_ADDENGLISH, GUIO4(GUIO_NOSPEECH, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
// 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"
@@ -510,7 +520,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.002", 0, "2d21a1d2dcbffa551552e3e0725d2284", 1186033},
{"resource.003", 0, "84dd11b6825255671c703aee5ceff620", 1174993},
AD_LISTEND},
- Common::ES_ESP, Common::kPlatformDOS, ADGF_ADDENGLISH, GUIO4(GUIO_NOSPEECH, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
+ Common::ES_ESP, Common::kPlatformDOS, ADGF_ADDENGLISH, GUIO4(GUIO_NOSPEECH, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
// Eco Quest - French DOS Floppy (from Strangerke, also includes english language)
// SCI interpreter version 1.ECO.013
@@ -521,7 +531,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.002", 0, "b836c6ee9de67d814ac5d1b05f5b9858", 1173872},
{"resource.003", 0, "f8f767f9d6351432621c6e54c1b2ba8c", 1141520},
AD_LISTEND},
- Common::FR_FRA, Common::kPlatformDOS, ADGF_ADDENGLISH, GUIO4(GUIO_NOSPEECH, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
+ Common::FR_FRA, Common::kPlatformDOS, ADGF_ADDENGLISH, GUIO4(GUIO_NOSPEECH, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
// Eco Quest 2 - English DOS Non-Interactive Demo
// SCI interpreter version 1.001.055
@@ -529,7 +539,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.map", 0, "607cfa0d8a03b7d348c06ee727e3d939", 1321},
{"resource.000", 0, "dd6f614c43c029f063e93cd243af90a4", 525992},
AD_LISTEND},
- Common::EN_ANY, Common::kPlatformDOS, ADGF_DEMO, GUIO4(GUIO_NOSPEECH, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
+ Common::EN_ANY, Common::kPlatformDOS, ADGF_DEMO, GUIO4(GUIO_NOSPEECH, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
// Eco Quest 2 - English DOS Floppy (supplied by markcoolio in bug report #2723761)
// SCI interpreter version 1.001.065
@@ -537,7 +547,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.map", 0, "28fb7b6abb9fc1cb8882d7c2e701b63f", 5658},
{"resource.000", 0, "cc1d17e5637528dbe4a812699e1cbfc6", 4208192},
AD_LISTEND},
- Common::EN_ANY, Common::kPlatformDOS, 0, GUIO4(GUIO_NOSPEECH, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
+ Common::EN_ANY, Common::kPlatformDOS, 0, GUIO4(GUIO_NOSPEECH, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
// Eco Quest 2 - French DOS Floppy (from Strangerke)
// SCI interpreter version 1.001.081
@@ -545,7 +555,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.map", 0, "c22ab8b33c339c138b6b1697b77b9e79", 5588},
{"resource.000", 0, "1c4093f7248240329121fdf8c0d59152", 4231946},
AD_LISTEND},
- Common::FR_FRA, Common::kPlatformDOS, 0, GUIO4(GUIO_NOSPEECH, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
+ Common::FR_FRA, Common::kPlatformDOS, 0, GUIO4(GUIO_NOSPEECH, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
// Eco Quest 2 - Spanish DOS Floppy (supplied by umbrio in bug report #3313962)
{"ecoquest2", "Floppy", {
@@ -553,7 +563,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.000", 0, "1c4093f7248240329121fdf8c0d59152", 4209150},
{"resource.msg", 0, "eff8be1925d42288de55e405983e9314", 117810},
AD_LISTEND},
- Common::ES_ESP, Common::kPlatformDOS, 0, GUIO4(GUIO_NOSPEECH, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
+ Common::ES_ESP, Common::kPlatformDOS, 0, GUIO4(GUIO_NOSPEECH, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
// Eco Quest 2 - German DOS Floppy (supplied by frankenbuam in bug report #3615072)
{"ecoquest2", "Floppy", {
@@ -569,7 +579,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.map", 0, "97aa9fcfe84c9993a64debd28c32393a", 1909},
{"resource.000", 0, "5ea8e7a3ea10cce6efd5c106dc62fd8c", 867724},
AD_LISTEND},
- Common::EN_ANY, Common::kPlatformDOS, ADGF_DEMO, GUIO4(GUIO_NOSPEECH, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
+ Common::EN_ANY, Common::kPlatformDOS, ADGF_DEMO, GUIO4(GUIO_NOSPEECH, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
// Freddy Pharkas - English CD DOS (from FRG)
// SCI interpreter version 1.001.132
@@ -577,7 +587,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.map", 0, "d46b282f228a67ba13bd4b4009e95f8f", 6058},
{"resource.000", 0, "ee3c64ffff0ba9fb08bea2624631c598", 5490246},
AD_LISTEND},
- Common::EN_ANY, Common::kPlatformDOS, ADGF_CD, GUIO3(GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
+ Common::EN_ANY, Common::kPlatformDOS, ADGF_CD, GUIO3(GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
// Freddy Pharkas - English DOS Floppy (updated information from markcoolio in bug reports #2723773 and #2724720)
// Executable scanning reports "1.cfs.081"
@@ -587,7 +597,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.000", 0, "96b07e9b914dba1c8dc6c78a176326df", 5233230},
{"resource.msg", 0, "554f65315d851184f6e38211489fdd8f", -1},
AD_LISTEND},
- Common::EN_ANY, Common::kPlatformDOS, 0, GUIO4(GUIO_NOSPEECH, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
+ Common::EN_ANY, Common::kPlatformDOS, 0, GUIO4(GUIO_NOSPEECH, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
// Freddy Pharkas - French DOS Floppy (supplied by misterhands in bug report #3589449)
// Executable scanning reports "1.cfs.081"
@@ -596,7 +606,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.000", 0, "fed4808fdb72486908ac7ad0044b14d8", 5233230},
{"resource.msg", 0, "4dc478f5c73b57e5d690bdfffdcf1c44", 816518},
AD_LISTEND},
- Common::FR_FRA, Common::kPlatformDOS, 0, GUIO4(GUIO_NOSPEECH, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
+ Common::FR_FRA, Common::kPlatformDOS, 0, GUIO4(GUIO_NOSPEECH, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
// Freddy Pharkas - Windows (supplied by abevi in bug report #2612718)
// Executable scanning reports "1.cfs.081"
@@ -605,7 +615,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.map", 0, "a32674e7fbf7b213b4a066c8037f16b6", 5816},
{"resource.000", 0, "fed4808fdb72486908ac7ad0044b14d8", 5233230},
AD_LISTEND},
- Common::EN_ANY, Common::kPlatformWindows, 0, GUIO4(GUIO_NOSPEECH, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
+ Common::EN_ANY, Common::kPlatformWindows, 0, GUIO4(GUIO_NOSPEECH, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
// Freddy Pharkas - German DOS Floppy (from Tobis87, updated information from markcoolio in bug reports #2723772 and #2724720)
// Executable scanning reports "1.cfs.081"
@@ -615,7 +625,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.000", 0, "96b07e9b914dba1c8dc6c78a176326df", 5233230},
{"resource.msg", 0, "304b5a5781800affd2235152a5794fa8", -1},
AD_LISTEND},
- Common::DE_DEU, Common::kPlatformDOS, 0, GUIO4(GUIO_NOSPEECH, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
+ Common::DE_DEU, Common::kPlatformDOS, 0, GUIO4(GUIO_NOSPEECH, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
// Freddy Pharkas - Spanish DOS (from jvprat)
// Executable scanning reports "1.cfs.081", VERSION file reports "1.000, March 30, 1995"
@@ -628,7 +638,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.003", 0, "05acdc256c742e79c50b9fe7ec2cc898", 863310},
{"resource.msg", 0, "45b5bf74933ac3727e4cc844446dc052", 796156},
AD_LISTEND},
- Common::ES_ESP, Common::kPlatformDOS, ADGF_CD, GUIO3(GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
+ Common::ES_ESP, Common::kPlatformDOS, ADGF_CD, GUIO3(GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
// Freddy Pharkas - Spanish DOS (from jvprat)
// Executable scanning reports "1.cfs.081", VERSION file reports "1.000, March 30, 1995"
@@ -638,7 +648,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.000", 0, "96b07e9b914dba1c8dc6c78a176326df", 5233230},
{"resource.msg", 0, "45b5bf74933ac3727e4cc844446dc052", 796156},
AD_LISTEND},
- Common::ES_ESP, Common::kPlatformDOS, 0, GUIO4(GUIO_NOSPEECH, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
+ Common::ES_ESP, Common::kPlatformDOS, 0, GUIO4(GUIO_NOSPEECH, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
// Freddy Pharkas - English DOS CD Demo
// SCI interpreter version 1.001.095
@@ -646,14 +656,14 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.map", 0, "a62a7eae85dd1e6b07f39662b278437e", 1918},
{"resource.000", 0, "4962a3c4dd44e36e78ea4a7a374c2220", 957382},
AD_LISTEND},
- Common::EN_ANY, Common::kPlatformDOS, ADGF_DEMO, GUIO3(GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
+ Common::EN_ANY, Common::kPlatformDOS, ADGF_DEMO, GUIO3(GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
// Freddy Pharkas - English Macintosh
{"freddypharkas", "", {
{"Data1", 0, "ef7cbd62727989818f1cfae69c9fd61d", 3038492},
{"Data2", 0, "2424b418f7d52c385cea4701f529c69a", 4721732},
AD_LISTEND},
- Common::EN_ANY, Common::kPlatformMacintosh, ADGF_MACRESFORK, GUIO4(GUIO_NOSPEECH, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
+ Common::EN_ANY, Common::kPlatformMacintosh, ADGF_MACRESFORK, GUIO4(GUIO_NOSPEECH, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
// Fun Seeker's Guide - English DOS
// SCI interpreter version 0.000.506
@@ -661,7 +671,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.map", 0, "7ee6859ef74314f6d91938c3595348a9", 282},
{"resource.001", 0, "f1e680095424e31f7fae1255d36bacba", 40692},
AD_LISTEND},
- Common::EN_ANY, Common::kPlatformDOS, 0, GUIO5(GUIO_NOSPEECH, GAMEOPTION_EGA_UNDITHER, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
+ Common::EN_ANY, Common::kPlatformDOS, 0, GUIO5(GUIO_NOSPEECH, GAMEOPTION_EGA_UNDITHER, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
// Gabriel Knight - English DOS CD Demo
// SCI interpreter version 1.001.092
@@ -669,7 +679,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.map", 0, "39645952ae0ed8072c7e838f31b75464", 2490},
{"resource.000", 0, "eb3ed7477ca4110813fe1fcf35928561", 1718450},
AD_LISTEND},
- Common::EN_ANY, Common::kPlatformDOS, ADGF_DEMO, GUIO3(GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
+ Common::EN_ANY, Common::kPlatformDOS, ADGF_DEMO, GUIO3(GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
// Gabriel Knight - English DOS CD Demo (from DrMcCoy)
// SCI interpreter version 1.001.092
@@ -677,7 +687,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.map", 0, "8cad2a256f41463030cbb7ea1bfb2857", 2490},
{"resource.000", 0, "eb3ed7477ca4110813fe1fcf35928561", 1718450},
AD_LISTEND},
- Common::EN_ANY, Common::kPlatformDOS, ADGF_DEMO, GUIO3(GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
+ Common::EN_ANY, Common::kPlatformDOS, ADGF_DEMO, GUIO3(GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
#ifdef ENABLE_SCI32
// Gabriel Knight - English DOS Floppy
@@ -686,7 +696,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.map", 0, "372d059f75856afa6d73dd84cbb8913d", 10783},
{"resource.000", 0, "69b7516962510f780d38519cc15fcc7c", 13022630},
AD_LISTEND},
- Common::EN_ANY, Common::kPlatformDOS, ADGF_UNSTABLE, GUIO4(GUIO_NOSPEECH, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
+ Common::EN_ANY, Common::kPlatformDOS, ADGF_UNSTABLE, GUIO4(GUIO_NOSPEECH, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
// Gabriel Knight - English DOS Floppy (supplied my markcoolio in bug report #2723777)
// SCI interpreter version 2.000.000
@@ -694,7 +704,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.map", 0, "65e8c14092e4c9b3b3538b7602c8c5ec", 10783},
{"resource.000", 0, "69b7516962510f780d38519cc15fcc7c", 13022630},
AD_LISTEND},
- Common::EN_ANY, Common::kPlatformDOS, ADGF_UNSTABLE, GUIO4(GUIO_NOSPEECH, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
+ Common::EN_ANY, Common::kPlatformDOS, ADGF_UNSTABLE, GUIO4(GUIO_NOSPEECH, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
// 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"
@@ -702,7 +712,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.map", 0, "ef41df08cf2c1f680216cdbeed0f8311", 10783},
{"resource.000", 0, "69b7516962510f780d38519cc15fcc7c", 13022630},
AD_LISTEND},
- Common::EN_ANY, Common::kPlatformDOS, ADGF_UNSTABLE, GUIO4(GUIO_NOSPEECH, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
+ Common::EN_ANY, Common::kPlatformDOS, ADGF_UNSTABLE, GUIO4(GUIO_NOSPEECH, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
// Gabriel Knight - German DOS Floppy (supplied my markcoolio in bug report #2723775)
// SCI interpreter version 2.000.000
@@ -710,7 +720,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.map", 0, "ad6508b0296b25c07b1f58828dc33696", 10789},
{"resource.000", 0, "091cf08910780feabc56f8551b09cb36", 13077029},
AD_LISTEND},
- Common::DE_DEU, Common::kPlatformDOS, ADGF_UNSTABLE, GUIO4(GUIO_NOSPEECH, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
+ Common::DE_DEU, Common::kPlatformDOS, ADGF_UNSTABLE, GUIO4(GUIO_NOSPEECH, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
// Gabriel Knight - French DOS Floppy (supplied my kervala in bug report #3611487)
// SCI interpreter version 2.000.000
@@ -718,7 +728,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.map", 0, "236e36cc847cdeafdd5e5fa8cba916ed", 10801},
{"resource.000", 0, "091cf08910780feabc56f8551b09cb36", 13033072},
AD_LISTEND},
- Common::FR_FRA, Common::kPlatformDOS, ADGF_UNSTABLE, GUIO4(GUIO_NOSPEECH, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
+ Common::FR_FRA, Common::kPlatformDOS, ADGF_UNSTABLE, GUIO4(GUIO_NOSPEECH, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
// Gabriel Knight - English DOS CD (from jvprat)
// Executable scanning reports "2.000.000", VERSION file reports "01.100.000"
@@ -726,7 +736,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.map", 0, "372d059f75856afa6d73dd84cbb8913d", 10996},
{"resource.000", 0, "69b7516962510f780d38519cc15fcc7c", 12581736},
AD_LISTEND},
- Common::EN_ANY, Common::kPlatformDOS, ADGF_CD | ADGF_UNSTABLE, GUIO3(GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
+ Common::EN_ANY, Common::kPlatformDOS, ADGF_CD | ADGF_UNSTABLE, GUIO3(GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
// Gabriel Knight - English Windows CD (from jvprat)
// Executable scanning reports "2.000.000", VERSION file reports "01.100.000"
@@ -734,7 +744,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, GUIO4(GUIO_NOASPECT, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
+ Common::EN_ANY, Common::kPlatformWindows, ADGF_CD | ADGF_UNSTABLE, GUIO4(GUIO_NOASPECT, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
// Gabriel Knight - German DOS CD (from Tobis87)
// SCI interpreter version 2.000.000
@@ -742,7 +752,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.map", 0, "a7d3e55114c65647310373cb390815ba", 11392},
{"resource.000", 0, "091cf08910780feabc56f8551b09cb36", 13400497},
AD_LISTEND},
- Common::DE_DEU, Common::kPlatformDOS, ADGF_CD | ADGF_UNSTABLE, GUIO3(GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
+ Common::DE_DEU, Common::kPlatformDOS, ADGF_CD | ADGF_UNSTABLE, GUIO3(GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
// Gabriel Knight - Spanish DOS CD (from jvprat)
// Executable scanning reports "2.000.000", VERSION file reports "1.000.000, April 13, 1995"
@@ -750,7 +760,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.map", 0, "7cb6e9bba15b544ec7a635c45bde9953", 11404},
{"resource.000", 0, "091cf08910780feabc56f8551b09cb36", 13381599},
AD_LISTEND},
- Common::ES_ESP, Common::kPlatformDOS, ADGF_CD | ADGF_UNSTABLE, GUIO3(GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
+ Common::ES_ESP, Common::kPlatformDOS, ADGF_CD | ADGF_UNSTABLE, GUIO3(GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
// Gabriel Knight - French DOS CD (from Hkz)
// VERSION file reports "1.000.000, May 3, 1994"
@@ -758,7 +768,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.map", 0, "55f909ba93a2515042a08d8a2da8414e", 11392},
{"resource.000", 0, "091cf08910780feabc56f8551b09cb36", 13325145},
AD_LISTEND},
- Common::FR_FRA, Common::kPlatformDOS, ADGF_CD | ADGF_UNSTABLE, GUIO3(GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
+ Common::FR_FRA, Common::kPlatformDOS, ADGF_CD | ADGF_UNSTABLE, GUIO3(GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
// Gabriel Knight - German Windows CD (from Tobis87)
// SCI interpreter version 2.000.000
@@ -766,7 +776,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, GUIO4(GUIO_NOASPECT, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
+ Common::DE_DEU, Common::kPlatformWindows, ADGF_CD | ADGF_UNSTABLE, GUIO4(GUIO_NOASPECT, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
// Gabriel Knight - Spanish Windows CD (from jvprat)
// Executable scanning reports "2.000.000", VERSION file reports "1.000.000, April 13, 1995"
@@ -774,7 +784,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, GUIO4(GUIO_NOASPECT, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
+ Common::ES_ESP, Common::kPlatformWindows, ADGF_CD | ADGF_UNSTABLE, GUIO4(GUIO_NOASPECT, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
// Gabriel Knight - English Macintosh
{"gk1", "", {
@@ -783,7 +793,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, GUIO4(GUIO_NOASPECT, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
+ Common::EN_ANY, Common::kPlatformMacintosh, ADGF_MACRESFORK | ADGF_UNSTABLE, GUIO4(GUIO_NOASPECT, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
// Gabriel Knight 2 - English Windows Non-Interactive Demo
// Executable scanning reports "2.100.002"
@@ -791,7 +801,7 @@ 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, GUIO5(GUIO_NOSPEECH, GUIO_NOASPECT, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
+ Common::EN_ANY, Common::kPlatformWindows, ADGF_DEMO | ADGF_UNSTABLE, GUIO5(GUIO_NOSPEECH, GUIO_NOASPECT, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
// Gabriel Knight 2 - English DOS (GOG version) - ressci.* merged in ressci.000
// using Enrico Rolfi's HD/DVD installer: http://gkpatches.vogons.zetafleet.com/
@@ -799,7 +809,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resmap.000", 0, "b996fa1e57389a1e179a00a0049de1f4", 8110},
{"ressci.000", 0, "a19fc3604c6e5407abcf03d59ee87217", 168522221},
AD_LISTEND},
- Common::EN_ANY, Common::kPlatformDOS, ADGF_UNSTABLE, GUIO4(GUIO_NOASPECT, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
+ Common::EN_ANY, Common::kPlatformDOS, ADGF_UNSTABLE, GUIO4(GUIO_NOASPECT, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
// Gabriel Knight 2 - English DOS (from jvprat)
// Executable scanning reports "2.100.002", VERSION file reports "1.1"
@@ -817,7 +827,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resmap.006", 0, "ce9359037277b7d7976da185c2fa0aad", 2977},
{"ressci.006", 0, "8e44e03890205a7be12f45aaba9644b4", 60659424},
AD_LISTEND},
- Common::EN_ANY, Common::kPlatformDOS, ADGF_UNSTABLE, GUIO4(GUIO_NOASPECT, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
+ Common::EN_ANY, Common::kPlatformDOS, ADGF_UNSTABLE, GUIO4(GUIO_NOASPECT, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
// Gabriel Knight 2 - French DOS (6-CDs Sierra Originals reedition)
// Executable scanning reports "2.100.002", VERSION file reports "1.0"
@@ -835,7 +845,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resmap.006", 0, "11b2e722170b8c93fdaa5428e2c7676f", 3001},
{"ressci.006", 0, "4037d941aec39d2e654e20960429aefc", 60568486},
AD_LISTEND},
- Common::FR_FRA, Common::kPlatformDOS, ADGF_UNSTABLE, GUIO4(GUIO_NOASPECT, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
+ Common::FR_FRA, Common::kPlatformDOS, ADGF_UNSTABLE, GUIO4(GUIO_NOASPECT, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
// Gabriel Knight 2 - English Macintosh
// NOTE: This only contains disc 1 files (as well as the persistent file:
@@ -847,7 +857,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, GUIO4(GUIO_NOASPECT, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
+ Common::EN_ANY, Common::kPlatformMacintosh, ADGF_MACRESFORK | ADGF_UNSTABLE, GUIO4(GUIO_NOASPECT, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
#endif // ENABLE_SCI32
@@ -859,7 +869,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.002", 0, "e0dd44069a62a463fd124974b915f10d", 342149},
{"resource.003", 0, "e0dd44069a62a463fd124974b915f10d", 328925},
AD_LISTEND},
- Common::EN_ANY, Common::kPlatformDOS, 0, GUIO4(GUIO_NOSPEECH, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
+ Common::EN_ANY, Common::kPlatformDOS, 0, GUIO5(GUIO_NOSPEECH, GAMEOPTION_EGA_UNDITHER, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
// Hoyle 1 - English DOS (supplied by wibble92 in bug report #2644547)
// SCI interpreter version 0.000.530
@@ -869,7 +879,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.002", 0, "e0dd44069a62a463fd124974b915f10d", 342309},
{"resource.003", 0, "e0dd44069a62a463fd124974b915f10d", 328912},
AD_LISTEND},
- Common::EN_ANY, Common::kPlatformDOS, 0, GUIO5(GUIO_NOSPEECH, GAMEOPTION_EGA_UNDITHER, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
+ Common::EN_ANY, Common::kPlatformDOS, 0, GUIO5(GUIO_NOSPEECH, GAMEOPTION_EGA_UNDITHER, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
// Hoyle 1 - English DOS (supplied by merkur in bug report #2719227)
// SCI interpreter version 0.000.530
@@ -877,14 +887,22 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.map", 0, "1034a218943d12f1f36e753fa10c95b8", 4386},
{"resource.001", 0, "e0dd44069a62a463fd124974b915f10d", 518308},
AD_LISTEND},
- Common::EN_ANY, Common::kPlatformDOS, 0, GUIO5(GUIO_NOSPEECH, GAMEOPTION_EGA_UNDITHER, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
+ Common::EN_ANY, Common::kPlatformDOS, 0, GUIO5(GUIO_NOSPEECH, GAMEOPTION_EGA_UNDITHER, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
// 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::kPlatformDOS, 0, GUIO5(GUIO_NOSPEECH, GAMEOPTION_EGA_UNDITHER, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
+ Common::EN_ANY, Common::kPlatformDOS, 0, GUIO5(GUIO_NOSPEECH, GAMEOPTION_EGA_UNDITHER, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
+
+ // Hoyle 1 - English DOS v1.000.115 (supplied by misterhands in bug report #6597)
+ // Executable scanning reports "0.000.668"
+ {"hoyle1", "", {
+ {"resource.map", 0, "3ddf55fdbe14eb0e89a27a2cfc1338bd", 4386},
+ {"resource.001", 0, "e0dd44069a62a463fd124974b915f10d", 519525},
+ AD_LISTEND},
+ Common::EN_ANY, Common::kPlatformDOS, 0, GUIO5(GUIO_NOSPEECH, GAMEOPTION_EGA_UNDITHER, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
#if 0 // TODO: unknown if these files are corrupt
// Hoyle 1 - English Amiga (from www.back2roots.org)
@@ -894,7 +912,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.001", 0, "e0dd44069a62a463fd124974b915f10d", 218755},
{"resource.002", 0, "e0dd44069a62a463fd124974b915f10d", 439502},
AD_LISTEND},
- Common::EN_ANY, Common::kPlatformAmiga, 0, GUIO4(GUIO_NOSPEECH, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
+ Common::EN_ANY, Common::kPlatformAmiga, 0, GUIO4(GUIO_NOSPEECH, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
#endif
// Hoyle 2 - English DOS
@@ -904,7 +922,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.001", 0, "8f2dd70abe01112eca464cda818b5eb6", 98138},
{"resource.002", 0, "8f2dd70abe01112eca464cda818b5eb6", 196631},
AD_LISTEND},
- Common::EN_ANY, Common::kPlatformDOS, 0, GUIO5(GUIO_NOSPEECH, GAMEOPTION_EGA_UNDITHER, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
+ Common::EN_ANY, Common::kPlatformDOS, 0, GUIO5(GUIO_NOSPEECH, GAMEOPTION_EGA_UNDITHER, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
// Hoyle 2 - English DOS (supplied by ssburnout in bug report #3049193)
// 1.000.011 1x3.5" (label:Int#6.21.90)
@@ -912,7 +930,15 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.map", 0, "db0ba08b953e9904a4960ad99cd29c20", 1356},
{"resource.001", 0, "8f2dd70abe01112eca464cda818b5eb6", 216315},
AD_LISTEND},
- Common::EN_ANY, Common::kPlatformDOS, 0, GUIO5(GUIO_NOSPEECH, GAMEOPTION_EGA_UNDITHER, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
+ Common::EN_ANY, Common::kPlatformDOS, 0, GUIO5(GUIO_NOSPEECH, GAMEOPTION_EGA_UNDITHER, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
+
+ // Hoyle 2 - English DOS (supplied by misterhands in bug report #6598)
+ // Game v1.000.016, interpreter 0.000.668, INT #12.5.90
+ {"hoyle2", "", {
+ {"resource.map", 0, "d8758a4eb6f34f6b3130bf25a496d123", 1356},
+ {"resource.001", 0, "8f2dd70abe01112eca464cda818b5eb6", 217880},
+ AD_LISTEND},
+ Common::EN_ANY, Common::kPlatformDOS, 0, GUIO5(GUIO_NOSPEECH, GAMEOPTION_EGA_UNDITHER, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
// Hoyle 2 - English Amiga (from www.back2roots.org)
// Executable scanning reports "1.002.032"
@@ -921,15 +947,15 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.map", 0, "62ed48d20c580e5a98f102f7cd93706a", 1356},
{"resource.001", 0, "8f2dd70abe01112eca464cda818b5eb6", 222704},
AD_LISTEND},
- Common::EN_ANY, Common::kPlatformAmiga, 0, GUIO4(GUIO_NOSPEECH, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
+ Common::EN_ANY, Common::kPlatformAmiga, 0, GUIO5(GUIO_NOSPEECH, GAMEOPTION_EGA_UNDITHER, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
// Hoyle 2 - English Macintosh
// Executable scanning reports "x.yyy.zzz"
{"hoyle2", "", {
{"resource.map", 0, "1af1d3aa3cf564f93477c9f87e53f495", 1728},
{"resource.001", 0, "b73b8131669d69d41a326415e4519138", 482882},
- {NULL, 0, NULL, 0}},
- Common::EN_ANY, Common::kPlatformMacintosh, 0, GUIO4(GUIO_NOSPEECH, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
+ AD_LISTEND},
+ Common::EN_ANY, Common::kPlatformMacintosh, 0, GUIO5(GUIO_NOSPEECH, GAMEOPTION_EGA_UNDITHER, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
#if 0 // TODO: unknown if these files are corrupt
// Hoyle 3 - English Amiga (from www.back2roots.org)
@@ -940,7 +966,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.000", 0, "595b6039ea1356e7f96a52c58eedcf22", 355791},
{"resource.001", 0, "143df8aef214a2db34c2d48190742012", 632273},
AD_LISTEND},
- Common::EN_ANY, Common::kPlatformAmiga, 0, GUIO4(GUIO_NOSPEECH, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
+ Common::EN_ANY, Common::kPlatformAmiga, 0, GUIO4(GUIO_NOSPEECH, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
#endif
// Hoyle 3 - English DOS Non-Interactive Demo
@@ -950,7 +976,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.map", 0, "0d06cacc87dc21a08cd017e73036f905", 735},
{"resource.001", 0, "24db2bccda0a3c43ac4a7b5edb116c7e", 797678},
AD_LISTEND},
- Common::EN_ANY, Common::kPlatformDOS, ADGF_DEMO, GUIO4(GUIO_NOSPEECH, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
+ Common::EN_ANY, Common::kPlatformDOS, ADGF_DEMO, GUIO4(GUIO_NOSPEECH, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
// 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"
@@ -960,7 +986,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.000", 0, "6ef28cac094dcd97fdb461662ead6f92", 541845},
{"resource.001", 0, "0a98a268ee99b92c233a0d7187c1f0fa", 845795},
AD_LISTEND},
- Common::EN_ANY, Common::kPlatformDOS, 0, GUIO4(GUIO_NOSPEECH, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
+ Common::EN_ANY, Common::kPlatformDOS, 0, GUIO4(GUIO_NOSPEECH, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
// Hoyle 3 - English DOS Floppy (supplied by eddydrama in bug report #3038837)
{"hoyle3", "", {
@@ -971,7 +997,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.003", 0, "97cfd72633f8f9b2a0b1d4116cf3ee81", 346116},
{"resource.004", 0, "2884fb91b225fabd9ca87ea231293b48", 351218},
AD_LISTEND},
- Common::EN_ANY, Common::kPlatformDOS, 0, GUIO4(GUIO_NOSPEECH, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
+ Common::EN_ANY, Common::kPlatformDOS, 0, GUIO4(GUIO_NOSPEECH, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
// Hoyle 3 EGA - English DOS Floppy 1.0 (supplied by abevi in bug report #2612718)
{"hoyle3", "EGA", {
@@ -979,14 +1005,14 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.000", 0, "6ef28cac094dcd97fdb461662ead6f92", 319905},
{"resource.001", 0, "0a98a268ee99b92c233a0d7187c1f0fa", 526438},
AD_LISTEND},
- Common::EN_ANY, Common::kPlatformDOS, 0, GUIO5(GUIO_NOSPEECH, GAMEOPTION_EGA_UNDITHER, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
+ Common::EN_ANY, Common::kPlatformDOS, 0, GUIO5(GUIO_NOSPEECH, GAMEOPTION_EGA_UNDITHER, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
// 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::kPlatformDOS, ADGF_DEMO, GUIO4(GUIO_NOSPEECH, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
+ Common::EN_ANY, Common::kPlatformDOS, ADGF_DEMO, GUIO4(GUIO_NOSPEECH, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
// Hoyle 4 (Hoyle Classic Card Games) - English DOS Demo
// SCI interpreter version 1.001.200 (just a guess)
@@ -995,7 +1021,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.map", 0, "662087cb383e52e3cc4ae7ecb10e20aa", 938},
{"resource.000", 0, "24c10844792c54d476d272213cbac300", 675252},
AD_LISTEND},
- Common::EN_ANY, Common::kPlatformDOS, ADGF_DEMO, GUIO4(GUIO_NOSPEECH, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
+ Common::EN_ANY, Common::kPlatformDOS, ADGF_DEMO, GUIO4(GUIO_NOSPEECH, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
// Hoyle 4 (Hoyle Classic Card Games) - English DOS/Win
// Supplied by abevi in bug report #3039291
@@ -1003,7 +1029,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.map", 0, "2b577c975cc8d8d43f61b6a756129fe3", 4352},
{"resource.000", 0, "43e2c15ce436aab611a462ad0603e12d", 2000132},
AD_LISTEND},
- Common::EN_ANY, Common::kPlatformDOS, 0, GUIO4(GUIO_NOSPEECH, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
+ Common::EN_ANY, Common::kPlatformDOS, 0, GUIO4(GUIO_NOSPEECH, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
// Hoyle 4 (Hoyle Classic Card Games) - English Macintosh Floppy
// VERSION file reports "2.0"
@@ -1011,7 +1037,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"Data1", 0, "99575fae4579540a314bbedd72d51e8c", 7682887},
{"Data2", 0, "7d4bf5bdf3c02edbf35cb8471c84ec13", 1539134},
AD_LISTEND},
- Common::EN_ANY, Common::kPlatformMacintosh, ADGF_MACRESFORK, GUIO4(GUIO_NOSPEECH, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
+ Common::EN_ANY, Common::kPlatformMacintosh, ADGF_MACRESFORK, GUIO4(GUIO_NOSPEECH, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
// Jones in the Fast Lane EGA - English DOS
// SCI interpreter version 1.000.172 (not 100% sure FIXME)
@@ -1020,14 +1046,14 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.001", 0, "bac3ec6cb3e3920984ab0f32becf5163", 202105},
{"resource.002", 0, "b86daa3ba2784d1502da881eedb80d9b", 341771},
AD_LISTEND},
- Common::EN_ANY, Common::kPlatformDOS, 0, GUIO5(GUIO_NOSPEECH, GAMEOPTION_EGA_UNDITHER, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
+ Common::EN_ANY, Common::kPlatformDOS, 0, GUIO4(GUIO_NOSPEECH, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
// 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::kPlatformDOS, 0, GUIO5(GUIO_NOSPEECH, GAMEOPTION_EGA_UNDITHER, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
+ Common::EN_ANY, Common::kPlatformDOS, 0, GUIO4(GUIO_NOSPEECH, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
// Jones in the Fast Lane VGA - English DOS
// SCI interpreter version 1.000.172
@@ -1036,7 +1062,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.001", 0, "bac3ec6cb3e3920984ab0f32becf5163", 313476},
{"resource.002", 0, "b86daa3ba2784d1502da881eedb80d9b", 719747},
AD_LISTEND},
- Common::EN_ANY, Common::kPlatformDOS, 0, GUIO4(GUIO_NOSPEECH, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
+ Common::EN_ANY, Common::kPlatformDOS, 0, GUIO4(GUIO_NOSPEECH, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
// Jones in the Fast Lane VGA - English DOS (supplied by omer_mor in bug report #3037054)
// VERSION file reports "1.000.060"
@@ -1044,14 +1070,14 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.map", 0, "db175ab494ab0666f19ab8f2597a8e49", 1602},
{"resource.001", 0, "bac3ec6cb3e3920984ab0f32becf5163", 994487},
AD_LISTEND},
- Common::EN_ANY, Common::kPlatformDOS, 0, GUIO4(GUIO_NOSPEECH, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
+ Common::EN_ANY, Common::kPlatformDOS, 0, GUIO4(GUIO_NOSPEECH, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
// 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::kPlatformDOS, ADGF_CD, GUIO1(GAMEOPTION_JONES_CDAUDIO) },
+ Common::EN_ANY, Common::kPlatformDOS, ADGF_CD, GUIO1(GAMEOPTION_JONES_CDAUDIO) },
// Jones in the Fast Lane - English DOS CD
// Same entry as the DOS version above. This one is used for the alternate
@@ -1060,7 +1086,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, GUIO4(GUIO_MIDIGM, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_FB01_MIDI, GAMEOPTION_JONES_CDAUDIO) },
+ Common::EN_ANY, Common::kPlatformWindows, ADGF_CD, GUIO4(GUIO_MIDIGM, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_FB01_MIDI, GAMEOPTION_JONES_CDAUDIO) },
// Jones in the Fast Lane - English DOS US CD (alternate version)
// Supplied by collector9 in bug #3614668
@@ -1068,7 +1094,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.map", 0, "4344ff3f796707843b992adec2c87663", 4878},
{"resource.001", 0, "3876da2ce16fb7dea2f5d943d946fa84", 1652062},
AD_LISTEND},
- Common::EN_ANY, Common::kPlatformDOS, ADGF_CD, GUIO1(GAMEOPTION_JONES_CDAUDIO) },
+ Common::EN_ANY, Common::kPlatformDOS, ADGF_CD, GUIO1(GAMEOPTION_JONES_CDAUDIO) },
// Jones in the Fast Lane - English DOS US CD (alternate version)
// Same entry as the DOS version above. This one is used for the alternate
@@ -1077,7 +1103,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.map", 0, "4344ff3f796707843b992adec2c87663", 4878},
{"resource.001", 0, "3876da2ce16fb7dea2f5d943d946fa84", 1652062},
AD_LISTEND},
- Common::EN_ANY, Common::kPlatformWindows, ADGF_CD, GUIO4(GUIO_MIDIGM, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_FB01_MIDI, GAMEOPTION_JONES_CDAUDIO) },
+ Common::EN_ANY, Common::kPlatformWindows, ADGF_CD, GUIO4(GUIO_MIDIGM, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_FB01_MIDI, GAMEOPTION_JONES_CDAUDIO) },
// King's Quest 1 SCI Remake - English Amiga (from www.back2roots.org)
// Executable scanning reports "1.003.007"
@@ -1089,7 +1115,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.003", 0, "9ae2a13708d691cd42f9129173c4b39d", 763224},
{"resource.004", 0, "9ae2a13708d691cd42f9129173c4b39d", 820443},
AD_LISTEND},
- Common::EN_ANY, Common::kPlatformAmiga, 0, GUIO4(GUIO_NOSPEECH, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
+ Common::EN_ANY, Common::kPlatformAmiga, 0, GUIO4(GUIO_NOSPEECH, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
// King's Quest 1 SCI Remake - English DOS Non-Interactive Demo
// Executable scanning reports "S.old.010"
@@ -1097,7 +1123,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.map", 0, "59b13619078bd47011421468959ee5d4", 954},
{"resource.001", 0, "4cfb9040db152868f7cb6a1e8151c910", 296555},
AD_LISTEND},
- Common::EN_ANY, Common::kPlatformDOS, ADGF_DEMO, GUIO5(GUIO_NOSPEECH, GAMEOPTION_EGA_UNDITHER, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
+ Common::EN_ANY, Common::kPlatformDOS, ADGF_DEMO, GUIO5(GUIO_NOSPEECH, GAMEOPTION_EGA_UNDITHER, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
// 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"
@@ -1108,7 +1134,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.002", 0, "fed9e0072ffd511d248674e60dee2099", 714062},
{"resource.003", 0, "fed9e0072ffd511d248674e60dee2099", 717478},
AD_LISTEND},
- Common::EN_ANY, Common::kPlatformDOS, 0, GUIO5(GUIO_NOSPEECH, GAMEOPTION_EGA_UNDITHER, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
+ Common::EN_ANY, Common::kPlatformDOS, 0, GUIO5(GUIO_NOSPEECH, GAMEOPTION_EGA_UNDITHER, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
// 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)
@@ -1122,7 +1148,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.006", 0, "fed9e0072ffd511d248674e60dee2099", 351062},
{"resource.007", 0, "fed9e0072ffd511d248674e60dee2099", 330472},
AD_LISTEND},
- Common::EN_ANY, Common::kPlatformDOS, 0, GUIO4(GUIO_NOSPEECH, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
+ Common::EN_ANY, Common::kPlatformDOS, 0, GUIO4(GUIO_NOSPEECH, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
// King's Quest 4 - English Amiga (from www.back2roots.org)
// Executable scanning reports "1.002.032"
@@ -1135,7 +1161,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.003", 0, "fd16c9c223f7dc5b65f06447615224ff", 683016},
{"resource.004", 0, "3fac034c7d130e055d05bc43a1f8d5f8", 549993},
AD_LISTEND},
- Common::EN_ANY, Common::kPlatformAmiga, 0, GUIO5(GUIO_NOSPEECH, GAMEOPTION_EGA_UNDITHER, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
+ Common::EN_ANY, Common::kPlatformAmiga, 0, GUIO5(GUIO_NOSPEECH, GAMEOPTION_EGA_UNDITHER, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
// King's Quest 4 - English DOS Non-Interactive Demo
// Executable scanning reports "0.000.494"
@@ -1143,7 +1169,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.map", 0, "992ac7cc31d3717fe53818a9bb6d1dae", 594},
{"resource.001", 0, "143e1c14f15ad0fbfc714f648a65f661", 205330},
AD_LISTEND},
- Common::EN_ANY, Common::kPlatformDOS, ADGF_DEMO, GUIO5(GUIO_NOSPEECH, GAMEOPTION_EGA_UNDITHER, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
+ Common::EN_ANY, Common::kPlatformDOS, ADGF_DEMO, GUIO5(GUIO_NOSPEECH, GAMEOPTION_EGA_UNDITHER, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
// King's Quest 4 - English DOS (original boxed release, 3 1/2" disks)
// SCI interpreter version 0.000.247
@@ -1154,7 +1180,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.003", 0, "851a62d00972dc4002f472cc0d84e71d", 683145},
{"resource.004", 0, "851a62d00972dc4002f472cc0d84e71d", 649441},
AD_LISTEND},
- Common::EN_ANY, Common::kPlatformDOS, 0, GUIO5(GUIO_NOSPEECH, GAMEOPTION_EGA_UNDITHER, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
+ Common::EN_ANY, Common::kPlatformDOS, 0, GUIO5(GUIO_NOSPEECH, GAMEOPTION_EGA_UNDITHER, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
// King's Quest 4 - English DOS (from the King's Quest Collection)
// Executable scanning reports "0.000.502"
@@ -1166,7 +1192,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.003", 0, "77615c595388acf3d1df8e107bfb6b52", 707591},
{"resource.004", 0, "77615c595388acf3d1df8e107bfb6b52", 479562},
AD_LISTEND},
- Common::EN_ANY, Common::kPlatformDOS, 0, GUIO5(GUIO_NOSPEECH, GAMEOPTION_EGA_UNDITHER, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
+ Common::EN_ANY, Common::kPlatformDOS, 0, GUIO5(GUIO_NOSPEECH, GAMEOPTION_EGA_UNDITHER, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
// King's Quest 4 - English DOS (supplied by ssburnout in bug report #3049193)
// 1.006.003 8x5.25" (label: Int.#0.000.502)
@@ -1180,7 +1206,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.006", 0, "6db7de6f93c6ea62dca78abee677f8c0", 324789},
{"resource.007", 0, "6db7de6f93c6ea62dca78abee677f8c0", 334441},
AD_LISTEND},
- Common::EN_ANY, Common::kPlatformDOS, 0, GUIO5(GUIO_NOSPEECH, GAMEOPTION_EGA_UNDITHER, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
+ Common::EN_ANY, Common::kPlatformDOS, 0, GUIO5(GUIO_NOSPEECH, GAMEOPTION_EGA_UNDITHER, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
// King's Quest 4 - English DOS
// SCI interpreter version 0.000.274
@@ -1194,7 +1220,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.006", 0, "851a62d00972dc4002f472cc0d84e71d", 333777},
{"resource.007", 0, "851a62d00972dc4002f472cc0d84e71d", 341038},
AD_LISTEND},
- Common::EN_ANY, Common::kPlatformDOS, 0, GUIO5(GUIO_NOSPEECH, GAMEOPTION_EGA_UNDITHER, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
+ Common::EN_ANY, Common::kPlatformDOS, 0, GUIO5(GUIO_NOSPEECH, GAMEOPTION_EGA_UNDITHER, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
// King's Quest 4 - English DOS
// SCI interpreter version 0.000.253
@@ -1208,7 +1234,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.006", 0, "0c8566848a76eea19a6d6220914030a7", 337288},
{"resource.007", 0, "0c8566848a76eea19a6d6220914030a7", 343882},
AD_LISTEND},
- Common::EN_ANY, Common::kPlatformDOS, 0, GUIO5(GUIO_NOSPEECH, GAMEOPTION_EGA_UNDITHER, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
+ Common::EN_ANY, Common::kPlatformDOS, 0, GUIO5(GUIO_NOSPEECH, GAMEOPTION_EGA_UNDITHER, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
// King's Quest 4 - English Atari ST (double-sided diskettes)
// Game version 1.003.006 (January 12, 1989)
@@ -1221,7 +1247,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.003", 0, "a3cdb4848fb859fdd302976fff56490f", 705074},
{"resource.004", 0, "a3cdb4848fb859fdd302976fff56490f", 478366},
AD_LISTEND},
- Common::EN_ANY, Common::kPlatformAtariST, 0, GUIO5(GUIO_NOSPEECH, GAMEOPTION_EGA_UNDITHER, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
+ Common::EN_ANY, Common::kPlatformAtariST, 0, GUIO5(GUIO_NOSPEECH, GAMEOPTION_EGA_UNDITHER, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
// King's Quest 5 - English Amiga (from www.back2roots.org)
// Executable scanning reports "1.004.018"
@@ -1237,7 +1263,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.006", 0, "26c0c25399b6715fec03fc3e12544fe3", 823048},
{"resource.007", 0, "b914b5901e786327213e779725d30dd1", 778772},
AD_LISTEND},
- Common::EN_ANY, Common::kPlatformAmiga, 0, GUIO4(GUIO_NOSPEECH, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
+ Common::EN_ANY, Common::kPlatformAmiga, 0, GUIO4(GUIO_NOSPEECH, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
// King's Quest 5 - German Amiga (also includes english language)
// Executable scanning reports "1.004.024"
@@ -1253,7 +1279,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, GUIO4(GUIO_NOSPEECH, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
+ Common::DE_DEU, Common::kPlatformAmiga, ADGF_ADDENGLISH, GUIO4(GUIO_NOSPEECH, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
// King's Quest 5 - Italian Amiga (also includes english language)
// Executable scanning reports "1.004.024"
@@ -1269,7 +1295,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, GUIO4(GUIO_NOSPEECH, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
+ Common::IT_ITA, Common::kPlatformAmiga, ADGF_ADDENGLISH, GUIO4(GUIO_NOSPEECH, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
// 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"
@@ -1279,7 +1305,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.000", 0, "449471bfd77be52f18a3773c7f7d843d", 571368},
{"resource.001", 0, "b45a581ff8751e052c7e364f58d3617f", 16800210},
AD_LISTEND},
- Common::EN_ANY, Common::kPlatformDOS, ADGF_CD, GUIO3(GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
+ Common::EN_ANY, Common::kPlatformDOS, ADGF_CD, GUIO3(GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
// 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"
@@ -1291,7 +1317,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, GUIO4(GUIO_MIDIGM, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
+ Common::EN_ANY, Common::kPlatformWindows, ADGF_CD, GUIO4(GUIO_MIDIGM, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
// King's Quest 5 - English DOS Floppy
// SCI interpreter version 1.000.060
@@ -1306,7 +1332,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.006", 0, "672ede1136e9e401658538e51bd5dc22", 1172619},
{"resource.007", 0, "2f48faf27666b58c276dda20f91f4a93", 1240456},
AD_LISTEND},
- Common::EN_ANY, Common::kPlatformDOS, 0, GUIO4(GUIO_NOSPEECH, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
+ Common::EN_ANY, Common::kPlatformDOS, 0, GUIO4(GUIO_NOSPEECH, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
// King's Quest 5 - English DOS Floppy
// VERSION file reports "0.000.051"
@@ -1324,7 +1350,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.006", 0, "da82e4beb744731d0a151f1d4922fafa", 1170456},
{"resource.007", 0, "431def14ca29cdb5e6a5e84d3f38f679", 1240176},
AD_LISTEND},
- Common::EN_ANY, Common::kPlatformDOS, 0, GUIO4(GUIO_NOSPEECH, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
+ Common::EN_ANY, Common::kPlatformDOS, 0, GUIO4(GUIO_NOSPEECH, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
// King's Quest 5 - English DOS Floppy (supplied by omer_mor in bug report #3036996)
// VERSION file reports "0.000.051"
@@ -1339,7 +1365,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.006", 0, "06cb3f689836086ebe08b1efc0126592", 921113},
{"resource.007", 0, "252249753c6e850eacceb8af634986d3", 1133608},
AD_LISTEND},
- Common::EN_ANY, Common::kPlatformDOS, 0, GUIO4(GUIO_NOSPEECH, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
+ Common::EN_ANY, Common::kPlatformDOS, 0, GUIO4(GUIO_NOSPEECH, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
// King's Quest 5 EGA (supplied by markcoolio in bug report #2829470)
// SCI interpreter version 1.000.060
@@ -1355,7 +1381,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.006", 0, "698c698570cde9015e4d51eb8d2e9db1", 666527},
{"resource.007", 0, "703d8df30e89541af337d7706540d5c4", 541743},
AD_LISTEND},
- Common::EN_ANY, Common::kPlatformDOS, 0, GUIO5(GUIO_NOSPEECH, GAMEOPTION_EGA_UNDITHER, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
+ Common::EN_ANY, Common::kPlatformDOS, 0, GUIO4(GUIO_NOSPEECH, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
// King's Quest 5 EGA 1.2M disk version (from LordHoto)
// VERSION file reports "0.000.055"
@@ -1367,7 +1393,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.map", 0, "53206afb4fd73871a484e83acab80f31", 7608},
{"resource.004", 0, "83568edf7fde18b3eed988bc5d22ceb1", 1188053},
AD_LISTEND},
- Common::EN_ANY, Common::kPlatformDOS, 0, GUIO5(GUIO_NOSPEECH, GAMEOPTION_EGA_UNDITHER, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
+ Common::EN_ANY, Common::kPlatformDOS, 0, GUIO4(GUIO_NOSPEECH, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
// King's Quest 5 EGA (supplied by omer_mor in bug report #3035421)
// VERSION file reports "0.000.062"
@@ -1382,7 +1408,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.006", 0, "698c698570cde9015e4d51eb8d2e9db1", 666541},
{"resource.007", 0, "703d8df30e89541af337d7706540d5c4", 541762},
AD_LISTEND},
- Common::EN_ANY, Common::kPlatformDOS, 0, GUIO5(GUIO_NOSPEECH, GAMEOPTION_EGA_UNDITHER, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
+ Common::EN_ANY, Common::kPlatformDOS, 0, GUIO4(GUIO_NOSPEECH, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
// King's Quest V DOS 0.000.062 EGA (5 x 5.25" disks)
// Supplied by ssburnout in bug report #3046780
@@ -1394,7 +1420,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.003", 0, "3cca5b2dae8afe94532edfdc98d7edbe", 1092325},
{"resource.004", 0, "8e5c1bc4d738cf7316ff506f59d265e2", 1187803},
AD_LISTEND},
- Common::EN_ANY, Common::kPlatformDOS, 0, GUIO5(GUIO_NOSPEECH, GAMEOPTION_EGA_UNDITHER, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
+ Common::EN_ANY, Common::kPlatformDOS, 0, GUIO4(GUIO_NOSPEECH, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
// King's Quest 5 DOS Spanish Floppy 0.000.062 VGA (5 x 3.5" disks)
// Supplied by dianiu in bug report #3555646
@@ -1409,7 +1435,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.006", 0, "65b520e60c4217e6a6572d9edf77193b", 1141985},
{"resource.007", 0, "f42b0100f0a1c30806814f8648b6bc28", 1145583},
AD_LISTEND},
- Common::ES_ESP, Common::kPlatformDOS, ADGF_ADDENGLISH, GUIO4(GUIO_NOSPEECH, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
+ Common::ES_ESP, Common::kPlatformDOS, ADGF_ADDENGLISH, GUIO4(GUIO_NOSPEECH, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
// King's Quest 5 - German DOS Floppy (supplied by markcoolio in bug report #2727101, also includes english language)
// SCI interpreter version 1.000.060
@@ -1424,7 +1450,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.006", 0, "d1a75fdc01840664d00366cff6919366", 1208972},
{"resource.007", 0, "c07494f0cce7c05210893938786a955b", 1337361},
AD_LISTEND},
- Common::DE_DEU, Common::kPlatformDOS, ADGF_ADDENGLISH, GUIO4(GUIO_NOSPEECH, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
+ Common::DE_DEU, Common::kPlatformDOS, ADGF_ADDENGLISH, GUIO4(GUIO_NOSPEECH, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
// 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
@@ -1440,7 +1466,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.006", 0, "f7dc85307632ef657ceb1651204f6f51", 1210081},
{"resource.007", 0, "7db4d0a1d8d547c0019cb7d2a6acbdd4", 1338473},
AD_LISTEND},
- Common::FR_FRA, Common::kPlatformDOS, ADGF_ADDENGLISH, GUIO4(GUIO_NOSPEECH, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
+ Common::FR_FRA, Common::kPlatformDOS, ADGF_ADDENGLISH, GUIO4(GUIO_NOSPEECH, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
// King's Quest 5 - Italian DOS Floppy (from glorifindel, includes english language)
// SCI interpreter version 1.000.060
@@ -1455,7 +1481,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.006", 0, "8eeabd92af71e766e323db2100879102", 1209325},
{"resource.007", 0, "dc10c107e0923b902326a040b9c166b9", 1337859},
AD_LISTEND},
- Common::IT_ITA, Common::kPlatformDOS, ADGF_ADDENGLISH, GUIO4(GUIO_NOSPEECH, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
+ Common::IT_ITA, Common::kPlatformDOS, ADGF_ADDENGLISH, GUIO4(GUIO_NOSPEECH, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
// King's Quest 5 - Polish DOS Floppy (supplied by jacek909 in bug report #2725722)
// SCI interpreter version 1.000.060
@@ -1473,7 +1499,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.007", 0, "431def14ca29cdb5e6a5e84d3f38f679", 1240176},
{"text.000", 0, "601aa35a3ddeb558e1280e0963e955a2", 1517},
AD_LISTEND},
- Common::PL_POL, Common::kPlatformDOS, ADGF_ADDENGLISH, GUIO4(GUIO_NOSPEECH, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
+ Common::PL_POL, Common::kPlatformDOS, ADGF_ADDENGLISH, GUIO4(GUIO_NOSPEECH, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
// King's Quest 5 - English Macintosh
// VERSION file reports "1.000.055"
@@ -1488,7 +1514,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.006", 0, "3d22904a374c192f51e5665b74364133", 1264079},
{"resource.007", 0, "ffe17e23d5833a79f3695addfc149a56", 1361965},
AD_LISTEND},
- Common::EN_ANY, Common::kPlatformMacintosh, 0, GUIO4(GUIO_NOSPEECH, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
+ Common::EN_ANY, Common::kPlatformMacintosh, 0, GUIO4(GUIO_NOSPEECH, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
// King's Quest 5 - FM-Towns (supplied by abevi in bug report #3038720)
{"kq5", "", {
@@ -1496,7 +1522,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.000", 0, "71afd220d46bde1109c58e6acc0f3a01", 469094},
{"resource.001", 0, "72a569f46f1abf2d9d2b1526ad3799c3", 12808839},
AD_LISTEND},
- Common::EN_ANY, Common::kPlatformFMTowns, 0, GUIO2(GUIO_NOASPECT, GUIO_MIDITOWNS) },
+ Common::EN_ANY, Common::kPlatformFMTowns, 0, GUIO2(GUIO_NOASPECT, GUIO_MIDITOWNS) },
{"kq5", "", {
{"resource.map", 0, "20c7cd248ff1a349ed354568eebd972b", 12733},
{"resource.000", 0, "71afd220d46bde1109c58e6acc0f3a01", 469094},
@@ -1514,7 +1540,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, GUIO5(GUIO_NOSPEECH, GUIO_NOASPECT, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
+ Common::JA_JPN, Common::kPlatformPC98, ADGF_ADDENGLISH, GUIO5(GUIO_NOSPEECH, GUIO_NOASPECT, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
// King's Quest 6 - English DOS Non-Interactive Demo
// Executable scanning reports "1.001.055", VERSION file reports "1.000.000"
@@ -1524,7 +1550,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.000", 0, "535b1b920441ec73f42eaa4ccfd47b89", 264116},
{"resource.msg", 0, "54d1fdc936f98c81f9e4c19e04fb1510", 8260},
AD_LISTEND},
- Common::EN_ANY, Common::kPlatformDOS, ADGF_DEMO, GUIO4(GUIO_NOSPEECH, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
+ Common::EN_ANY, Common::kPlatformDOS, ADGF_DEMO, GUIO4(GUIO_NOSPEECH, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
// King's Quest 6 - English DOS Floppy
// SCI interpreter version 1.001.054
@@ -1533,7 +1559,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.000", 0, "f2b7f753992c56a0c7a08d6a5077c895", 7863324},
{"resource.msg", 0, "3cf5de44de36191f109d425b8450efc8", 258590},
AD_LISTEND},
- Common::EN_ANY, Common::kPlatformDOS, 0, GUIO4(GUIO_NOSPEECH, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
+ Common::EN_ANY, Common::kPlatformDOS, 0, GUIO4(GUIO_NOSPEECH, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
// King's Quest 6 - French DOS Floppy (supplied by misterhands in bug #3503425)
// SCI interpreter version ???
@@ -1542,7 +1568,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.000", 0, "f2b7f753992c56a0c7a08d6a5077c895", 7863324},
{"resource.msg", 0, "adc2aa8adbdcc97507d44a6f492fbd77", 265194},
AD_LISTEND},
- Common::FR_FRA, Common::kPlatformDOS, 0, GUIO4(GUIO_NOSPEECH, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
+ Common::FR_FRA, Common::kPlatformDOS, 0, GUIO4(GUIO_NOSPEECH, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
// King's Quest 6 - German DOS Floppy (supplied by markcoolio in bug report #2727156)
// SCI interpreter version 1.001.054
@@ -1551,7 +1577,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.000", 0, "f2b7f753992c56a0c7a08d6a5077c895", 7863324},
{"resource.msg", 0, "756297b2155db9e43f621c6f6fb763c3", 282822},
AD_LISTEND},
- Common::DE_DEU, Common::kPlatformDOS, 0, GUIO4(GUIO_NOSPEECH, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
+ Common::DE_DEU, Common::kPlatformDOS, 0, GUIO4(GUIO_NOSPEECH, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
// King's Quest 6 - Spanish DOS Floppy (from jvprat)
// Executable scanning reports "1.cfs.158", VERSION file reports "1.000.000, July 5, 1994"
@@ -1561,7 +1587,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.000", 0, "4da3ad5868a775549a7cc4f72770a58e", 8537260},
{"resource.msg", 0, "41eed2d3893e1ca6c3695deba4e9d2e8", 267102},
AD_LISTEND},
- Common::ES_ESP, Common::kPlatformDOS, 0, GUIO4(GUIO_NOSPEECH, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
+ Common::ES_ESP, Common::kPlatformDOS, 0, GUIO4(GUIO_NOSPEECH, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
// King's Quest 6 - Italian DOS Floppy (supplied by guybrush79 in bug report #3606719)
{"kq6", "", {
@@ -1569,7 +1595,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.000", 0, "d3358ba7306378aed83d02b5c3f11311", 8531908},
{"resource.msg", 0, "b7e8220be596fd6a9287eae5a8fd354a", 279886},
AD_LISTEND},
- Common::IT_ITA, Common::kPlatformDOS, 0, GUIO4(GUIO_NOSPEECH, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
+ Common::IT_ITA, Common::kPlatformDOS, 0, GUIO4(GUIO_NOSPEECH, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
// 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"
@@ -1578,7 +1604,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.map", 0, "7a550ebfeae2575ca00d47703a6a774c", 9215},
{"resource.000", 0, "233394a5f33b475ae5975e7e9a420865", 8376352},
AD_LISTEND},
- Common::EN_ANY, Common::kPlatformDOS, ADGF_CD, GUIO3(GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
+ Common::EN_ANY, Common::kPlatformDOS, ADGF_CD, GUIO3(GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
// 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"
@@ -1587,7 +1613,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, GUIO5(GUIO_NOASPECT, GAMEOPTION_KQ6_WINDOWS_CURSORS, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
+ Common::EN_ANY, Common::kPlatformWindows, ADGF_CD, GUIO5(GUIO_NOASPECT, GAMEOPTION_KQ6_WINDOWS_CURSORS, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
// King's Quest 6 - English Macintosh Floppy
// VERSION file reports "1.0"
@@ -1595,7 +1621,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"Data1", 0, "a183fc0c22fcbd9be4c8800d974b5599", 3892124},
{"Data2", 0, "b3722460dfd3097a1fbaf99a21ad8ea5", 15031272},
AD_LISTEND},
- Common::EN_ANY, Common::kPlatformMacintosh, ADGF_MACRESFORK, GUIO4(GUIO_NOSPEECH, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
+ Common::EN_ANY, Common::kPlatformMacintosh, ADGF_MACRESFORK, GUIO4(GUIO_NOSPEECH, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
#ifdef ENABLE_SCI32
@@ -1606,7 +1632,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, GUIO5(GUIO_NOSPEECH, GUIO_NOASPECT, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
+ Common::EN_ANY, Common::kPlatformWindows, ADGF_UNSTABLE, GUIO5(GUIO_NOSPEECH, GUIO_NOASPECT, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
// King's Quest 7 - English Windows (from the King's Quest Collection)
// Executable scanning reports "2.100.002", VERSION file reports "1.4"
@@ -1614,7 +1640,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, GUIO5(GUIO_NOSPEECH, GUIO_NOASPECT, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
+ Common::EN_ANY, Common::kPlatformWindows, ADGF_UNSTABLE, GUIO5(GUIO_NOSPEECH, GUIO_NOASPECT, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
// King's Quest 7 - English DOS (from FRG)
// SCI interpreter version 2.100.002, VERSION file reports "2.00b"
@@ -1622,7 +1648,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.map", 0, "8676b0fbbd7362989a029fe72fea14c6", 18709},
{"resource.000", 0, "51c1ead1163e19a2de8f121c39df7a76", 200764100},
AD_LISTEND},
- Common::EN_ANY, Common::kPlatformDOS, ADGF_UNSTABLE, GUIO5(GUIO_NOSPEECH, GUIO_NOASPECT, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
+ Common::EN_ANY, Common::kPlatformDOS, ADGF_UNSTABLE, GUIO5(GUIO_NOSPEECH, GUIO_NOASPECT, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
// King's Quest 7 - English Windows (from FRG)
// SCI interpreter version 2.100.002, VERSION file reports "2.00b"
@@ -1630,7 +1656,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, GUIO5(GUIO_NOSPEECH, GUIO_NOASPECT, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
+ Common::EN_ANY, Common::kPlatformWindows, ADGF_UNSTABLE, GUIO5(GUIO_NOSPEECH, GUIO_NOASPECT, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
// King's Quest 7 - German Windows (supplied by markcoolio in bug report #2727402)
// SCI interpreter version 2.100.002
@@ -1638,7 +1664,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.map", 0, "838b9ff132bd6962026fee832e8a7ddb", 18697},
{"resource.000", 0, "eb63ea3a2c2469dc2d777d351c626404", 206626576},
AD_LISTEND},
- Common::DE_DEU, Common::kPlatformDOS, ADGF_UNSTABLE, GUIO5(GUIO_NOSPEECH, GUIO_NOASPECT, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
+ Common::DE_DEU, Common::kPlatformDOS, ADGF_UNSTABLE, GUIO5(GUIO_NOSPEECH, GUIO_NOASPECT, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
// King's Quest 7 - Spanish DOS (from jvprat)
// Executable scanning reports "2.100.002", VERSION file reports "2.00"
@@ -1646,7 +1672,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.map", 0, "0b62693cbe87e3aaca3e8655a437f27f", 18709},
{"resource.000", 0, "51c1ead1163e19a2de8f121c39df7a76", 200764100},
AD_LISTEND},
- Common::ES_ESP, Common::kPlatformDOS, ADGF_UNSTABLE, GUIO5(GUIO_NOSPEECH, GUIO_NOASPECT, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
+ Common::ES_ESP, Common::kPlatformDOS, ADGF_UNSTABLE, GUIO5(GUIO_NOSPEECH, GUIO_NOASPECT, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
// King's Quest 7 - English DOS Non-Interactive Demo
// SCI interpreter version 2.100.002
@@ -1654,7 +1680,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.map", 0, "b44f774108d63faa1d021101221c5a54", 1690},
{"resource.000", 0, "d9659d2cf0c269c6a9dc776707f5bea0", 2433827},
AD_LISTEND},
- Common::EN_ANY, Common::kPlatformDOS, ADGF_DEMO | ADGF_UNSTABLE, GUIO5(GUIO_NOSPEECH, GUIO_NOASPECT, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
+ Common::EN_ANY, Common::kPlatformDOS, ADGF_DEMO | ADGF_UNSTABLE, GUIO5(GUIO_NOSPEECH, GUIO_NOASPECT, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
// King's Quest 7 - English Windows Demo (from DrMcCoy)
// SCI interpreter version 2.100.002
@@ -1662,7 +1688,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.map", 0, "38e627a37a975aea40cc72b0518b0709", 18412},
{"resource.000", 0, "bad61d50aaa64298fa57a7c6ccd3bccf", 84020382},
AD_LISTEND},
- Common::EN_ANY, Common::kPlatformWindows, ADGF_DEMO | ADGF_UNSTABLE, GUIO5(GUIO_NOSPEECH, GUIO_NOASPECT, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
+ Common::EN_ANY, Common::kPlatformWindows, ADGF_DEMO | ADGF_UNSTABLE, GUIO5(GUIO_NOSPEECH, GUIO_NOASPECT, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
// King's Questions mini-game from the King's Quest Collection
// SCI interpreter version 2.000.000
@@ -1670,7 +1696,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.000", 0, "9b1cddecd4f0720d83661ba7aed28891", 162697},
{"resource.map", 0, "93a2251fa64e729d7a7d2fe56b217c8e", 502},
AD_LISTEND},
- Common::EN_ANY, Common::kPlatformDOS, ADGF_UNSTABLE, GUIO3(GUIO_NOSPEECH, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_FB01_MIDI) },
+ Common::EN_ANY, Common::kPlatformDOS, ADGF_UNSTABLE, GUIO3(GUIO_NOSPEECH, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_FB01_MIDI) },
#endif // ENABLE_SCI32
@@ -1686,7 +1712,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.004", 0, "aa553977f7e5804081de293800d3bcce", 695067},
{"resource.005", 0, "bfd870d51dc97729f0914095f58e6957", 676881},
AD_LISTEND},
- Common::EN_ANY, Common::kPlatformAmiga, 0, GUIO5(GUIO_NOSPEECH, GAMEOPTION_EGA_UNDITHER, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
+ Common::EN_ANY, Common::kPlatformAmiga, 0, GUIO5(GUIO_NOSPEECH, GAMEOPTION_EGA_UNDITHER, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
// Laura Bow - English Atari ST (from jvprat)
// Executable scanning reports "1.002.030", Floppy label reports "1.000.062, 9.23.90"
@@ -1698,7 +1724,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.003", 0, "e45c888d9c7c04aec0a20e9f820b79ff", 667365},
{"resource.004", 0, "e45c888d9c7c04aec0a20e9f820b79ff", 683737},
AD_LISTEND},
- Common::EN_ANY, Common::kPlatformAtariST, 0, GUIO5(GUIO_NOSPEECH, GAMEOPTION_EGA_UNDITHER, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
+ Common::EN_ANY, Common::kPlatformAtariST, 0, GUIO5(GUIO_NOSPEECH, GAMEOPTION_EGA_UNDITHER, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
// Laura Bow - English DOS Non-Interactive Demo
// Executable scanning reports "x.yyy.zzz"
@@ -1706,7 +1732,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.map", 0, "e625726268ff4e123ada11f31f0249f3", 768},
{"resource.001", 0, "0c8912290af0890f8d95faeb4ddb2d68", 333031},
AD_LISTEND},
- Common::EN_ANY, Common::kPlatformDOS, ADGF_DEMO, GUIO5(GUIO_NOSPEECH, GAMEOPTION_EGA_UNDITHER, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
+ Common::EN_ANY, Common::kPlatformDOS, ADGF_DEMO, GUIO5(GUIO_NOSPEECH, GAMEOPTION_EGA_UNDITHER, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
// Laura Bow - English DOS 3.5" Floppy (from "The Roberta Williams Anthology"/1996)
// SCI interpreter version 0.000.631
@@ -1717,7 +1743,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.003", 0, "e45c888d9c7c04aec0a20e9f820b79ff", 667468},
{"resource.004", 0, "e45c888d9c7c04aec0a20e9f820b79ff", 683807},
AD_LISTEND},
- Common::EN_ANY, Common::kPlatformDOS, 0, GUIO5(GUIO_NOSPEECH, GAMEOPTION_EGA_UNDITHER, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
+ Common::EN_ANY, Common::kPlatformDOS, 0, GUIO5(GUIO_NOSPEECH, GAMEOPTION_EGA_UNDITHER, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
// Laura Bow - English DOS (from FRG)
// SCI interpreter version 0.000.631
@@ -1731,7 +1757,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.006", 0, "e45c888d9c7c04aec0a20e9f820b79ff", 328390},
{"resource.007", 0, "e45c888d9c7c04aec0a20e9f820b79ff", 317687},
AD_LISTEND},
- Common::EN_ANY, Common::kPlatformDOS, 0, GUIO5(GUIO_NOSPEECH, GAMEOPTION_EGA_UNDITHER, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
+ Common::EN_ANY, Common::kPlatformDOS, 0, GUIO5(GUIO_NOSPEECH, GAMEOPTION_EGA_UNDITHER, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
// Laura Bow 2 - English DOS Non-Interactive Demo (from FRG)
// Executable scanning reports "x.yyy.zzz"
@@ -1740,16 +1766,25 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.map", 0, "24dffc5db1d88c7999f13e8767ed7346", 855},
{"resource.000", 0, "2b2b1b4f7584f9b38fd13f6ab95634d1", 781912},
AD_LISTEND},
- Common::EN_ANY, Common::kPlatformDOS, ADGF_DEMO, GUIO4(GUIO_NOSPEECH, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
+ Common::EN_ANY, Common::kPlatformDOS, ADGF_DEMO, GUIO4(GUIO_NOSPEECH, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
- // Laura Bow 2 - English DOS Floppy
+ // Laura Bow 2 - English DOS Floppy v1.0
// Executable scanning reports "2.000.274"
// SCI interpreter version 1.001.069 (just a guess)
{"laurabow2", "", {
{"resource.map", 0, "610bfd9a852004222f0faaf5fc9e630a", 6489},
{"resource.000", 0, "57084910bc923bff5d6d9bc1b56e9604", 5035964},
AD_LISTEND},
- Common::EN_ANY, Common::kPlatformDOS, 0, GUIO4(GUIO_NOSPEECH, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
+ Common::EN_ANY, Common::kPlatformDOS, 0, GUIO4(GUIO_NOSPEECH, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
+
+ // Laura Bow 2 v1.1 - English DOS Floppy (supplied by misterhands in bug report #6543)
+ // Executable scanning reports "2.000.274"
+ {"laurabow2", "", {
+ {"resource.map", 0, "3b6dfbcda210bbc3f23fd1927113bf98", 6483},
+ {"resource.000", 0, "57084910bc923bff5d6d9bc1b56e9604", 5028766},
+ {"resource.msg", 0, "d1755fc4f41b5210febc9410503c6a29", 278354},
+ AD_LISTEND},
+ Common::EN_ANY, Common::kPlatformDOS, 0, GUIO4(GUIO_NOSPEECH, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
// 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)
@@ -1758,7 +1793,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.map", 0, "a70945e61ba7ac7bfea6b7bd72c6aec5", 7274},
{"resource.000", 0, "82578b8d5a7e09c4c58891ca49fae35b", 5598672},
AD_LISTEND},
- Common::EN_ANY, Common::kPlatformDOS, ADGF_CD, GUIO3(GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
+ Common::EN_ANY, Common::kPlatformDOS, ADGF_CD, GUIO3(GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
// Laura Bow 2 v1.1 - French DOS Floppy (from Hkz)
{"laurabow2", "", {
@@ -1766,7 +1801,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.000", 0, "57084910bc923bff5d6d9bc1b56e9604", 5028766},
{"resource.msg", 0, "0fceedfbdd85a4bc7851fdd9dd2d2f19", 278253},
AD_LISTEND},
- Common::FR_FRA, Common::kPlatformDOS, 0, GUIO4(GUIO_NOSPEECH, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
+ Common::FR_FRA, Common::kPlatformDOS, 0, GUIO4(GUIO_NOSPEECH, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
// 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"
@@ -1775,7 +1810,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.000", 0, "57084910bc923bff5d6d9bc1b56e9604", 5028766},
{"resource.msg", 0, "795c928cd00dfec9fbc62ebcd12e1f65", 303185},
AD_LISTEND},
- Common::DE_DEU, Common::kPlatformDOS, 0, GUIO4(GUIO_NOSPEECH, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
+ Common::DE_DEU, Common::kPlatformDOS, 0, GUIO4(GUIO_NOSPEECH, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
// Laura Bow 2 - Spanish DOS CD (from jvprat)
// Executable scanning reports "2.000.274", VERSION file reports "1.000.000, May 10, 1994"
@@ -1784,7 +1819,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.000", 0, "57084910bc923bff5d6d9bc1b56e9604", 5028766},
{"resource.msg", 0, "71f1f0cd9f082da2e750c793a8ed9d84", 286141},
AD_LISTEND},
- Common::ES_ESP, Common::kPlatformDOS, ADGF_CD, GUIO3(GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
+ Common::ES_ESP, Common::kPlatformDOS, ADGF_CD, GUIO3(GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
// Larry 1 EGA Remake - English DOS (from spookypeanut)
// SCI interpreter version 0.000.510 (or 0.000.577?)
@@ -1795,7 +1830,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.002", 0, "24c958bc922b07f91e25e8c93aa01fcf", 491230},
{"resource.003", 0, "685cd6c1e05a695ab1e0db826337ee2a", 553279},
AD_LISTEND},
- Common::EN_ANY, Common::kPlatformDOS, 0, GUIO5(GUIO_NOSPEECH, GAMEOPTION_EGA_UNDITHER, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
+ Common::EN_ANY, Common::kPlatformDOS, 0, GUIO4(GUIO_NOSPEECH, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
#if 0
// The resource.002 file, contained in disk 3, is broken in this version
@@ -1813,7 +1848,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.002", 0, "5790ac0505f7ca98d4567132b875eb1e", 681041},
{"resource.003", 0, "4a34c3367c2fe7eb380d741374da1989", 572251},
AD_LISTEND},
- Common::EN_ANY, Common::kPlatformAmiga, 0, GUIO4(GUIO_NOSPEECH, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
+ Common::EN_ANY, Common::kPlatformAmiga, 0, GUIO4(GUIO_NOSPEECH, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
#endif
// Larry 1 VGA Remake - English DOS (from spookypeanut)
@@ -1824,7 +1859,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.001", 0, "ec20246209d7b19f38989261e5c8f5b8", 1111226},
{"resource.002", 0, "85d6935ef77e6b0e16bc307640a0d913", 1088312},
AD_LISTEND},
- Common::EN_ANY, Common::kPlatformDOS, 0, GUIO4(GUIO_NOSPEECH, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
+ Common::EN_ANY, Common::kPlatformDOS, 0, GUIO4(GUIO_NOSPEECH, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
// Larry 1 VGA Remake - English DOS (from FRG)
// SCI interpreter version 1.000.510
@@ -1834,7 +1869,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.001", 0, "d34cadb11e1aefbb497cf91bc1d3baa7", 1114688},
{"resource.002", 0, "85b030bb66d5342b0a068f1208c431a8", 1078443},
AD_LISTEND},
- Common::EN_ANY, Common::kPlatformDOS, 0, GUIO4(GUIO_NOSPEECH, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
+ Common::EN_ANY, Common::kPlatformDOS, 0, GUIO4(GUIO_NOSPEECH, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
// Larry 1 VGA Remake - English Macintosh (from omer_mor, bug report #3328262)
{"lsl1sci", "SCI", {
@@ -1843,7 +1878,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.001", 0, "aa6f153f70f1e32d1bde465fff08eecf", 1137418},
{"resource.002", 0, "b22c616aa789ebef990290c7ffd86548", 1097477},
AD_LISTEND},
- Common::EN_ANY, Common::kPlatformMacintosh, 0, GUIO4(GUIO_NOSPEECH, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
+ Common::EN_ANY, Common::kPlatformMacintosh, 0, GUIO4(GUIO_NOSPEECH, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
// Larry 1 VGA Remake - English DOS Non-Interactive Demo
// SCI interpreter version 1.000.084
@@ -1851,7 +1886,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.map", 0, "434e1f6c39d71647b34f0ee57b2bbd68", 444},
{"resource.001", 0, "0c0768215c562d9dace4a5ca53696cf3", 359913},
AD_LISTEND},
- Common::EN_ANY, Common::kPlatformDOS, ADGF_DEMO, GUIO4(GUIO_NOSPEECH, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
+ Common::EN_ANY, Common::kPlatformDOS, ADGF_DEMO, GUIO4(GUIO_NOSPEECH, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
// 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"
@@ -1864,7 +1899,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.002", 0, "3fe2a3aec0ed53c7d6db1845a67e3aa2", 1095908},
{"resource.003", 0, "ac175df0ea9a2cba57f0248651856d27", 376556},
AD_LISTEND},
- Common::ES_ESP, Common::kPlatformDOS, ADGF_ADDENGLISH, GUIO4(GUIO_NOSPEECH, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
+ Common::ES_ESP, Common::kPlatformDOS, ADGF_ADDENGLISH, GUIO4(GUIO_NOSPEECH, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
// Larry 1 VGA Remake - Russian DOS (also includes english language?!)
// Executable scanning reports "1.000.510", VERSION file reports "2.0"
@@ -1875,7 +1910,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.001", 0, "bc8ca10c807515d959cbd91f9ba47735", 1123759},
{"resource.002", 0, "b7409ab32bc3bee2d6cce887cd33f2b6", 1092160},
AD_LISTEND},
- Common::RU_RUS, Common::kPlatformDOS, ADGF_ADDENGLISH, GUIO4(GUIO_NOSPEECH, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
+ Common::RU_RUS, Common::kPlatformDOS, ADGF_ADDENGLISH, GUIO4(GUIO_NOSPEECH, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
// 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)
@@ -1883,7 +1918,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.map", 0, "58330a85767e42a2487129913283ab5b", 3228},
{"resource.000", 0, "b6097ff35cdc8469f02150fe2f824198", 4781210},
AD_LISTEND},
- Common::PL_POL, Common::kPlatformDOS, 0, GUIO4(GUIO_NOSPEECH, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
+ Common::PL_POL, Common::kPlatformDOS, 0, GUIO4(GUIO_NOSPEECH, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
// Larry 2 - English Amiga (from www.back2roots.org)
// Executable scanning reports "x.yyy.zzz"
@@ -1895,7 +1930,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.003", 0, "a0d4a625311d307257da7fc43d00459d", 570356},
{"resource.004", 0, "a0d4a625311d307257da7fc43d00459d", 717844},
AD_LISTEND},
- Common::EN_ANY, Common::kPlatformAmiga, 0, GUIO5(GUIO_NOSPEECH, GAMEOPTION_EGA_UNDITHER, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
+ Common::EN_ANY, Common::kPlatformAmiga, 0, GUIO5(GUIO_NOSPEECH, GAMEOPTION_EGA_UNDITHER, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
// Larry 2 - English DOS Non-Interactive Demo
// Executable scanning reports "x.yyy.zzz"
@@ -1904,7 +1939,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.map", 0, "03dba704bb77da55a91ad27b5a3cac09", 528},
{"resource.001", 0, "9f5520f0297206928df0b0b36493cd33", 127532},
AD_LISTEND},
- Common::EN_ANY, Common::kPlatformDOS, ADGF_DEMO, GUIO5(GUIO_NOSPEECH, GAMEOPTION_EGA_UNDITHER, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
+ Common::EN_ANY, Common::kPlatformDOS, ADGF_DEMO, GUIO5(GUIO_NOSPEECH, GAMEOPTION_EGA_UNDITHER, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
// Larry 2 - English DOS
// SCI interpreter version 0.000.409
@@ -1917,7 +1952,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.005", 0, "4a24443a25e2b1492462a52809605dc2", 277732},
{"resource.006", 0, "4a24443a25e2b1492462a52809605dc2", 345683},
AD_LISTEND},
- Common::EN_ANY, Common::kPlatformDOS, 0, GUIO5(GUIO_NOSPEECH, GAMEOPTION_EGA_UNDITHER, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
+ Common::EN_ANY, Common::kPlatformDOS, 0, GUIO5(GUIO_NOSPEECH, GAMEOPTION_EGA_UNDITHER, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
// Larry 2 - English DOS
// SCI interpreter version 0.000.343
@@ -1932,7 +1967,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::kPlatformDOS, 0, GUIO5(GUIO_NOSPEECH, GAMEOPTION_EGA_UNDITHER, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
+ Common::EN_ANY, Common::kPlatformDOS, 0, GUIO5(GUIO_NOSPEECH, GAMEOPTION_EGA_UNDITHER, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
// Larry 2 - English DOS (supplied by ssburnout in bug report #3049193)
// 1.000.011 3x3.5" (label: Int. #0.000.343)
@@ -1942,7 +1977,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.002", 0, "96033f57accfca903750413fd09193c8", 407014},
{"resource.003", 0, "96033f57accfca903750413fd09193c8", 592834},
AD_LISTEND},
- Common::EN_ANY, Common::kPlatformDOS, 0, GUIO5(GUIO_NOSPEECH, GAMEOPTION_EGA_UNDITHER, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
+ Common::EN_ANY, Common::kPlatformDOS, 0, GUIO5(GUIO_NOSPEECH, GAMEOPTION_EGA_UNDITHER, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
// Larry 2 - English DOS (supplied by ssburnout in bug report #3049193)
// 1.002.000 3x3.5" (label: INT#0.000.409)
@@ -1952,7 +1987,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.002", 0, "4a24443a25e2b1492462a52809605dc2", 406935},
{"resource.003", 0, "4a24443a25e2b1492462a52809605dc2", 592533},
AD_LISTEND},
- Common::EN_ANY, Common::kPlatformDOS, 0, GUIO5(GUIO_NOSPEECH, GAMEOPTION_EGA_UNDITHER, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
+ Common::EN_ANY, Common::kPlatformDOS, 0, GUIO5(GUIO_NOSPEECH, GAMEOPTION_EGA_UNDITHER, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
// Larry 3 - English Amiga (from www.back2roots.org)
// Executable scanning reports "1.002.032"
@@ -1966,7 +2001,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.004", 0, "f408e59cbee1457f042e5773b8c53951", 651634},
{"resource.005", 0, "433911eb764089d493aed1f958a5615a", 524259},
AD_LISTEND},
- Common::EN_ANY, Common::kPlatformAmiga, 0, GUIO4(GUIO_NOSPEECH, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
+ Common::EN_ANY, Common::kPlatformAmiga, 0, GUIO4(GUIO_NOSPEECH, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
// Larry 3 - English DOS (supplied by ssburnout in bug report #3049193)
// 1.021 8x5.25" (label: Int#5.15.90)
@@ -1980,7 +2015,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.006", 0, "f18441027154292836b973c655fa3175", 282649},
{"resource.007", 0, "f18441027154292836b973c655fa3175", 257178},
AD_LISTEND},
- Common::EN_ANY, Common::kPlatformDOS, 0, GUIO5(GUIO_NOSPEECH, GAMEOPTION_EGA_UNDITHER, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
+ Common::EN_ANY, Common::kPlatformDOS, 0, GUIO5(GUIO_NOSPEECH, GAMEOPTION_EGA_UNDITHER, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
// Larry 3 - English DOS
// SCI interpreter version 0.000.572
@@ -1994,7 +2029,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.006", 0, "f18441027154292836b973c655fa3175", 282465},
{"resource.007", 0, "f18441027154292836b973c655fa3175", 257174},
AD_LISTEND},
- Common::EN_ANY, Common::kPlatformDOS, 0, GUIO5(GUIO_NOSPEECH, GAMEOPTION_EGA_UNDITHER, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
+ Common::EN_ANY, Common::kPlatformDOS, 0, GUIO5(GUIO_NOSPEECH, GAMEOPTION_EGA_UNDITHER, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
// Larry 3 - English DOS
// SCI interpreter version 0.000.572
@@ -2005,7 +2040,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.003", 0, "f18441027154292836b973c655fa3175", 506807},
{"resource.004", 0, "f18441027154292836b973c655fa3175", 513651},
AD_LISTEND},
- Common::EN_ANY, Common::kPlatformDOS, 0, GUIO5(GUIO_NOSPEECH, GAMEOPTION_EGA_UNDITHER, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
+ Common::EN_ANY, Common::kPlatformDOS, 0, GUIO5(GUIO_NOSPEECH, GAMEOPTION_EGA_UNDITHER, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
// Larry 3 - English DOS (supplied by kervala in bug report #3611488)
{"lsl3", "", {
@@ -2015,7 +2050,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.003", 0, "f18441027154292836b973c655fa3175", 506817},
{"resource.004", 0, "f18441027154292836b973c655fa3175", 513337},
AD_LISTEND},
- Common::EN_ANY, Common::kPlatformDOS, 0, GUIO5(GUIO_NOSPEECH, GAMEOPTION_EGA_UNDITHER, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
+ Common::EN_ANY, Common::kPlatformDOS, 0, GUIO5(GUIO_NOSPEECH, GAMEOPTION_EGA_UNDITHER, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
// Larry 3 - English DOS Non-Interactive Demo
// SCI interpreter version 0.000.530
@@ -2024,7 +2059,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.001", 0, "f773d79b93dfd4052ec8c1cc64c1e6ab", 76525},
{"resource.002", 0, "f773d79b93dfd4052ec8c1cc64c1e6ab", 268299},
AD_LISTEND},
- Common::EN_ANY, Common::kPlatformDOS, ADGF_DEMO, GUIO5(GUIO_NOSPEECH, GAMEOPTION_EGA_UNDITHER, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
+ Common::EN_ANY, Common::kPlatformDOS, ADGF_DEMO, GUIO5(GUIO_NOSPEECH, GAMEOPTION_EGA_UNDITHER, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
// Larry 3 - German DOS (from Tobis87, updated info from markcoolio in bug report #2723832, also includes english language)
// Executable scanning reports "S.old.123"
@@ -2036,7 +2071,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.003", 0, "3827a9b17b926e12dcc336860f50612a", 587036},
{"resource.004", 0, "3827a9b17b926e12dcc336860f50612a", 691932},
AD_LISTEND},
- Common::DE_DEU, Common::kPlatformDOS, ADGF_ADDENGLISH, GUIO5(GUIO_NOSPEECH, GAMEOPTION_EGA_UNDITHER, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
+ Common::DE_DEU, Common::kPlatformDOS, ADGF_ADDENGLISH, GUIO5(GUIO_NOSPEECH, GAMEOPTION_EGA_UNDITHER, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
// Larry 3 - French DOS (provided by richiefs in bug report #2670691, also includes english language)
// Executable scanning reports "S.old.123"
@@ -2048,7 +2083,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.003", 0, "65f1bdaa20f6d0470e9d969f22473873", 586921},
{"resource.004", 0, "65f1bdaa20f6d0470e9d969f22473873", 690826},
AD_LISTEND},
- Common::FR_FRA, Common::kPlatformDOS, ADGF_ADDENGLISH, GUIO5(GUIO_NOSPEECH, GAMEOPTION_EGA_UNDITHER, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
+ Common::FR_FRA, Common::kPlatformDOS, ADGF_ADDENGLISH, GUIO5(GUIO_NOSPEECH, GAMEOPTION_EGA_UNDITHER, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
// Larry 3 1.050 Fr/En (9 x 5.25" disks)
// Provided by ssburnout in bug report #3046779
@@ -2062,7 +2097,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.006", 0, "65f1bdaa20f6d0470e9d969f22473873", 325292},
{"resource.007", 0, "65f1bdaa20f6d0470e9d969f22473873", 308982},
AD_LISTEND},
- Common::FR_FRA, Common::kPlatformDOS, ADGF_ADDENGLISH, GUIO4(GUIO_NOSPEECH, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
+ Common::FR_FRA, Common::kPlatformDOS, ADGF_ADDENGLISH, GUIO4(GUIO_NOSPEECH, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
// Larry 5 - English Amiga
// Executable scanning reports "1.004.023"
@@ -2077,7 +2112,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.005", 0, "f8b2d1137bb767e5d232056b99dd69eb", 623621},
{"resource.006", 0, "bafc64e3144f115dc58c6aee02de98fb", 715598},
AD_LISTEND},
- Common::EN_ANY, Common::kPlatformAmiga, 0, GUIO4(GUIO_NOSPEECH, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
+ Common::EN_ANY, Common::kPlatformAmiga, 0, GUIO4(GUIO_NOSPEECH, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
// Larry 5 - German Amiga (also includes english language)
// Executable scanning reports "1.004.024"
@@ -2093,7 +2128,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, GUIO4(GUIO_NOSPEECH, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
+ Common::DE_DEU, Common::kPlatformAmiga, ADGF_ADDENGLISH, GUIO4(GUIO_NOSPEECH, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
// Larry 5 - English DOS Non-Interactive Demo (from FRG)
// SCI interpreter version 1.000.181
@@ -2101,7 +2136,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.map", 0, "efe8d3f45ce4f6bd9a6643e0ac8d2a97", 504},
{"resource.001", 0, "8bd8d9c0b5f455ee1269d63ce86c50dd", 531380},
AD_LISTEND},
- Common::EN_ANY, Common::kPlatformDOS, ADGF_DEMO, GUIO4(GUIO_NOSPEECH, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
+ Common::EN_ANY, Common::kPlatformDOS, ADGF_DEMO, GUIO4(GUIO_NOSPEECH, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
// Larry 5 - English DOS (from spookypeanut)
// SCI interpreter version 1.000.510
@@ -2116,7 +2151,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.006", 0, "dda27ce00682aa76198dac124bbbe334", 1024810},
{"resource.007", 0, "ac443fae1285fb359bf2b2bc6a7301ae", 1030656},
AD_LISTEND},
- Common::EN_ANY, Common::kPlatformDOS, 0, GUIO4(GUIO_NOSPEECH, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
+ Common::EN_ANY, Common::kPlatformDOS, 0, GUIO4(GUIO_NOSPEECH, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
// Larry 5 - English Macintosh (from omer_mor, bug report #3328257)
{"lsl5", "", {
@@ -2130,7 +2165,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.006", 0, "dda27ce00682aa76198dac124bbbe334", 1110043},
{"resource.007", 0, "ac443fae1285fb359bf2b2bc6a7301ae", 989801},
AD_LISTEND},
- Common::EN_ANY, Common::kPlatformMacintosh, 0, GUIO4(GUIO_NOSPEECH, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
+ Common::EN_ANY, Common::kPlatformMacintosh, 0, GUIO4(GUIO_NOSPEECH, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
// Larry 5 - German DOS (from Tobis87)
// SCI interpreter version T.A00.196
@@ -2145,7 +2180,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.006", 0, "dda27ce00682aa76198dac124bbbe334", 1021774},
{"resource.007", 0, "ac443fae1285fb359bf2b2bc6a7301ae", 993408},
AD_LISTEND},
- Common::DE_DEU, Common::kPlatformDOS, ADGF_ADDENGLISH, GUIO4(GUIO_NOSPEECH, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
+ Common::DE_DEU, Common::kPlatformDOS, ADGF_ADDENGLISH, GUIO4(GUIO_NOSPEECH, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
// Larry 5 - French DOS (provided by richiefs in bug report #2670691)
// Executable scanning reports "1.lsl5.019"
@@ -2161,7 +2196,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.006", 0, "dda27ce00682aa76198dac124bbbe334", 946540},
{"resource.007", 0, "ac443fae1285fb359bf2b2bc6a7301ae", 958842},
AD_LISTEND},
- Common::FR_FRA, Common::kPlatformDOS, ADGF_ADDENGLISH, GUIO4(GUIO_NOSPEECH, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
+ Common::FR_FRA, Common::kPlatformDOS, ADGF_ADDENGLISH, GUIO4(GUIO_NOSPEECH, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
// Larry 5 - Spanish DOS (from the Leisure Suit Larry Collection)
// Executable scanning reports "1.ls5.006", VERSION file reports "1.000, 4/21/92"
@@ -2177,7 +2212,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.006", 0, "dda27ce00682aa76198dac124bbbe334", 1015136},
{"resource.007", 0, "ac443fae1285fb359bf2b2bc6a7301ae", 987222},
AD_LISTEND},
- Common::ES_ESP, Common::kPlatformDOS, ADGF_ADDENGLISH, GUIO4(GUIO_NOSPEECH, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
+ Common::ES_ESP, Common::kPlatformDOS, ADGF_ADDENGLISH, GUIO4(GUIO_NOSPEECH, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
// Larry 5 - Italian DOS Floppy (from glorifindel)
// SCI interpreter version 1.000.510 (just a guess)
@@ -2185,7 +2220,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.map", 0, "a99776df795127f387cb35dae872d4e4", 5919},
{"resource.000", 0, "a8989a5a89e7d4f702b26b378c7a357a", 7001981},
AD_LISTEND},
- Common::IT_ITA, Common::kPlatformDOS, 0, GUIO4(GUIO_NOSPEECH, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
+ Common::IT_ITA, Common::kPlatformDOS, 0, GUIO4(GUIO_NOSPEECH, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
// Larry 5 1.0 EGA DOS (8 x 3.5" disks)
// Provided by ssburnout in bug report #3046806
@@ -2200,7 +2235,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.006", 0, "f6046a8445422f17d40b1b10ab21ebf3", 568551},
{"resource.007", 0, "640ee65595d40372ef95462f2c1ae28a", 593429},
AD_LISTEND},
- Common::EN_ANY, Common::kPlatformDOS, 0, GUIO5(GUIO_NOSPEECH, GAMEOPTION_EGA_UNDITHER, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
+ Common::EN_ANY, Common::kPlatformDOS, 0, GUIO4(GUIO_NOSPEECH, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
// Larry 5 EGA
// Supplied by omer_mor in bug report #3049771
@@ -2211,7 +2246,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.002", 0, "5a55af4e40728b1a8103dc47ad2afa8d", 1100539},
{"resource.003", 0, "16f4d8fb1b526125edaca4fc6cbb7530", 1064563},
AD_LISTEND},
- Common::EN_ANY, Common::kPlatformDOS, 0, GUIO5(GUIO_NOSPEECH, GAMEOPTION_EGA_UNDITHER, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
+ Common::EN_ANY, Common::kPlatformDOS, 0, GUIO4(GUIO_NOSPEECH, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
// Larry 6 - English DOS (from spookypeanut)
// SCI interpreter version 1.001.113
@@ -2219,7 +2254,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.map", 0, "bb8a39d9e2a77ba449a1e591109ad9a8", 6973},
{"resource.000", 0, "4462fe48c7452d98fddcec327a3e738d", 5789138},
AD_LISTEND},
- Common::EN_ANY, Common::kPlatformDOS, 0, GUIO4(GUIO_NOSPEECH, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
+ Common::EN_ANY, Common::kPlatformDOS, 0, GUIO4(GUIO_NOSPEECH, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
// Larry 6 - English/German/French DOS CD - LOWRES
// SCI interpreter version 1.001.115
@@ -2227,7 +2262,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.map", 0, "0b91234b7112782962cb480b7791b6e2", 7263},
{"resource.000", 0, "57d5fe8bb9e044158514476ea7678eb0", 5754790},
AD_LISTEND},
- Common::EN_ANY, Common::kPlatformDOS, ADGF_CD, GUIO3(GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
+ Common::EN_ANY, Common::kPlatformDOS, ADGF_CD, GUIO3(GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
// Larry 6 - German DOS CD - LOWRES (provided by richiefs in bug report #2670691)
// SCI interpreter version 1.001.115
@@ -2235,7 +2270,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.map", 0, "bafe85f32738854135991d4324ad147e", 7268},
{"resource.000", 0, "f6cbc6da7b90ea135883e0759848ca2c", 5773160},
AD_LISTEND},
- Common::DE_DEU, Common::kPlatformDOS, ADGF_CD, GUIO3(GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
+ Common::DE_DEU, Common::kPlatformDOS, ADGF_CD, GUIO3(GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
// Larry 6 - French DOS CD - LOWRES (provided by richiefs in bug report #2670691)
// SCI interpreter version 1.001.115
@@ -2243,7 +2278,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.map", 0, "97797ea775baaf18a1907d357d3c0ea6", 7268},
{"resource.000", 0, "f6cbc6da7b90ea135883e0759848ca2c", 5776092},
AD_LISTEND},
- Common::FR_FRA, Common::kPlatformDOS, ADGF_CD, GUIO3(GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
+ Common::FR_FRA, Common::kPlatformDOS, ADGF_CD, GUIO3(GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
// 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"
@@ -2251,7 +2286,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.map", 0, "633bf8f42170b6271019917c8009989b", 6943},
{"resource.000", 0, "7884a8db9253e29e6b37a2651fd90ba3", 5733116},
AD_LISTEND},
- Common::ES_ESP, Common::kPlatformDOS, 0, GUIO4(GUIO_NOSPEECH, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
+ Common::ES_ESP, Common::kPlatformDOS, 0, GUIO4(GUIO_NOSPEECH, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
// 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"
@@ -2259,35 +2294,35 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.map", 0, "194f1578f2624db813c9072359ad1639", 783},
{"resource.001", 0, "3733433b517ec3d14a3331d9ab3842ae", 344830},
AD_LISTEND},
- Common::EN_ANY, Common::kPlatformDOS, 0, GUIO4(GUIO_NOSPEECH, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
+ Common::EN_ANY, Common::kPlatformDOS, 0, GUIO4(GUIO_NOSPEECH, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
// 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::kPlatformDOS, 0, GUIO4(GUIO_NOSPEECH, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
+ Common::EN_ANY, Common::kPlatformDOS, 0, GUIO4(GUIO_NOSPEECH, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
// 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::kPlatformDOS, 0, GUIO4(GUIO_NOSPEECH, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
+ Common::EN_ANY, Common::kPlatformDOS, 0, GUIO4(GUIO_NOSPEECH, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
// 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::kPlatformDOS, 0, GUIO4(GUIO_NOSPEECH, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
+ Common::EN_ANY, Common::kPlatformDOS, 0, GUIO4(GUIO_NOSPEECH, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
// 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::kPlatformDOS, 0, GUIO4(GUIO_NOSPEECH, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
+ Common::EN_ANY, Common::kPlatformDOS, 0, GUIO4(GUIO_NOSPEECH, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
#ifdef ENABLE_SCI32
// Larry 6 - English/German DOS CD - HIRES
@@ -2296,7 +2331,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.map", 0, "0c0804434ea62278dd15032b1947426c", 8872},
{"resource.000", 0, "9a9f4870504444cda863dd14d077a680", 18520872},
AD_LISTEND},
- Common::EN_ANY, Common::kPlatformDOS, ADGF_UNSTABLE, GUIO4(GUIO_NOASPECT, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
+ Common::EN_ANY, Common::kPlatformDOS, ADGF_UNSTABLE, GUIO4(GUIO_NOASPECT, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
// Larry 6 - German DOS CD - HIRES (provided by richiefs in bug report #2670691)
// SCI interpreter version 2.100.002
@@ -2304,7 +2339,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.map", 0, "badfdf446ffed569a310d2c63a249421", 8896},
{"resource.000", 0, "bd944d2b06614a5b39f1586906f0ee88", 18534274},
AD_LISTEND},
- Common::DE_DEU, Common::kPlatformDOS, ADGF_UNSTABLE, GUIO4(GUIO_NOASPECT, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
+ Common::DE_DEU, Common::kPlatformDOS, ADGF_UNSTABLE, GUIO4(GUIO_NOASPECT, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
// Larry 6 - French DOS CD - HIRES (provided by richiefs in bug report #2670691)
// SCI interpreter version 2.100.002
@@ -2312,7 +2347,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.map", 0, "d184e9aa4f2d4b5670ddb3669db82cda", 8896},
{"resource.000", 0, "bd944d2b06614a5b39f1586906f0ee88", 18538987},
AD_LISTEND},
- Common::FR_FRA, Common::kPlatformDOS, ADGF_UNSTABLE, GUIO4(GUIO_NOASPECT, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
+ Common::FR_FRA, Common::kPlatformDOS, ADGF_UNSTABLE, GUIO4(GUIO_NOASPECT, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
// Larry 7 - English DOS Demo (provided by richiefs in bug report #2670691)
// SCI interpreter version 2.100.002
@@ -2320,7 +2355,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"ressci.000", 0, "5cc6159688b2dc03790a67c90ccc67f9", 10195878},
{"resmap.000", 0, "6a2b2811eef82e87cde91cf1de845af8", 2695},
AD_LISTEND},
- Common::EN_ANY, Common::kPlatformDOS, ADGF_DEMO | ADGF_UNSTABLE, GUIO5(GUIO_NOSPEECH, GUIO_NOASPECT, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
+ Common::EN_ANY, Common::kPlatformDOS, ADGF_DEMO | ADGF_UNSTABLE, GUIO5(GUIO_NOSPEECH, GUIO_NOASPECT, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
#ifdef ENABLE_SCI3_GAMES
// Larry 7 - English DOS CD (from spookypeanut)
@@ -2329,7 +2364,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resmap.000", 0, "eae93e1b1d1ccc58b4691c371281c95d", 8188},
{"ressci.000", 0, "89353723488219e25589165d73ed663e", 66965678},
AD_LISTEND},
- Common::EN_ANY, Common::kPlatformDOS, ADGF_UNSTABLE, GUIO4(GUIO_NOASPECT, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
+ Common::EN_ANY, Common::kPlatformDOS, ADGF_UNSTABLE, GUIO4(GUIO_NOASPECT, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
// Larry 7 - German DOS (from Tobis87)
// SCI interpreter version 3.000.000
@@ -2337,7 +2372,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resmap.000", 0, "c11e6bfcfc2f2d05da47e5a7df3e9b1a", 8188},
{"ressci.000", 0, "a8c6817bb94f332ff498a71c8b47f893", 66971724},
AD_LISTEND},
- Common::DE_DEU, Common::kPlatformDOS, ADGF_UNSTABLE, GUIO5(GUIO_NOSPEECH, GUIO_NOASPECT, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
+ Common::DE_DEU, Common::kPlatformDOS, ADGF_UNSTABLE, GUIO5(GUIO_NOSPEECH, GUIO_NOASPECT, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
// Larry 7 - French DOS (provided by richiefs in bug report #2670691)
// SCI interpreter version 3.000.000
@@ -2345,7 +2380,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resmap.000", 0, "4407849fd52fe3efb0c30fba60cd5cd4", 8206},
{"ressci.000", 0, "dc37c3055fffbefb494ff22b145d377b", 66964472},
AD_LISTEND},
- Common::FR_FRA, Common::kPlatformDOS, ADGF_UNSTABLE, GUIO5(GUIO_NOSPEECH, GUIO_NOASPECT, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
+ Common::FR_FRA, Common::kPlatformDOS, ADGF_UNSTABLE, GUIO5(GUIO_NOSPEECH, GUIO_NOASPECT, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
// Larry 7 - Italian DOS CD (from glorifindel)
// SCI interpreter version 3.000.000
@@ -2353,7 +2388,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resmap.000", 0, "9852a97141f789413f29bf956052acdb", 8212},
{"ressci.000", 0, "440b9fed89590abb4e4386ed6f948ee2", 67140181},
AD_LISTEND},
- Common::IT_ITA, Common::kPlatformDOS, ADGF_UNSTABLE, GUIO4(GUIO_NOASPECT, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
+ Common::IT_ITA, Common::kPlatformDOS, ADGF_UNSTABLE, GUIO4(GUIO_NOASPECT, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
// Larry 7 - Spanish DOS (from the Leisure Suit Larry Collection)
// Executable scanning reports "3.000.000", VERSION file reports "1.0s"
@@ -2361,7 +2396,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resmap.000", 0, "8f3d603e1acc834a5d598b30cdfc93f3", 8188},
{"ressci.000", 0, "32792f9bc1bf3633a88b382bb3f6e40d", 67071418},
AD_LISTEND},
- Common::ES_ESP, Common::kPlatformDOS, ADGF_UNSTABLE, GUIO5(GUIO_NOSPEECH, GUIO_NOASPECT, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
+ Common::ES_ESP, Common::kPlatformDOS, ADGF_UNSTABLE, GUIO5(GUIO_NOSPEECH, GUIO_NOASPECT, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
#endif
// Lighthouse - English Windows Demo (from jvprat)
@@ -2370,7 +2405,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.map", 0, "543124606352bfa5e07696ddf2a669be", 64},
{"resource.000", 0, "5d7714416b612463d750fb9c5690c859", 28952},
AD_LISTEND},
- Common::EN_ANY, Common::kPlatformDOS, ADGF_DEMO | ADGF_UNSTABLE, GUIO5(GUIO_NOSPEECH, GUIO_NOASPECT, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
+ Common::EN_ANY, Common::kPlatformDOS, ADGF_DEMO | ADGF_UNSTABLE, GUIO5(GUIO_NOSPEECH, GUIO_NOASPECT, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
#ifdef ENABLE_SCI3_GAMES
// Lighthouse - English Windows Demo
@@ -2379,7 +2414,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resmap.000", 0, "3bdee7a16926975a4729f75cf6b80a92", 1525},
{"ressci.000", 0, "3c585827fa4a82f4c04a56a0bc52ccee", 11494351},
AD_LISTEND},
- Common::EN_ANY, Common::kPlatformDOS, ADGF_DEMO | ADGF_UNSTABLE, GUIO5(GUIO_NOSPEECH, GUIO_NOASPECT, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
+ Common::EN_ANY, Common::kPlatformDOS, ADGF_DEMO | ADGF_UNSTABLE, GUIO5(GUIO_NOSPEECH, GUIO_NOASPECT, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
// Lighthouse - English DOS (from jvprat)
// Executable scanning reports "3.000.000", VERSION file reports "1.1"
@@ -2389,7 +2424,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resmap.002", 0, "c68db5333f152fea6ca2dfc75cad8b34", 7573},
{"ressci.002", 0, "175468431a979b9f317c294ce3bc1430", 94628315},
AD_LISTEND},
- Common::EN_ANY, Common::kPlatformDOS, ADGF_UNSTABLE, GUIO5(GUIO_NOSPEECH, GUIO_NOASPECT, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
+ Common::EN_ANY, Common::kPlatformDOS, ADGF_UNSTABLE, GUIO5(GUIO_NOSPEECH, GUIO_NOASPECT, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
// Lighthouse - Spanish DOS (from jvprat)
// Executable scanning reports "3.000.000", VERSION file reports "1.1"
@@ -2399,7 +2434,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resmap.002", 0, "e7dc85884a2417e2eff9de0c63dd65fa", 7630},
{"ressci.002", 0, "3c8d627c555b0e3e4f1d9955bc0f0df4", 94631127},
AD_LISTEND},
- Common::ES_ESP, Common::kPlatformDOS, ADGF_UNSTABLE, GUIO5(GUIO_NOSPEECH, GUIO_NOASPECT, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
+ Common::ES_ESP, Common::kPlatformDOS, ADGF_UNSTABLE, GUIO5(GUIO_NOSPEECH, GUIO_NOASPECT, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
#endif // ENABLE_SCI3_GAMES
#endif // ENABLE_SCI32
@@ -2410,7 +2445,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.000", 0, "8be56a3a88c065ee00c02c0e29199f3a", 14643},
{"resource.001", 0, "9e33566515b18bee7915db448063bba2", 871853},
AD_LISTEND},
- Common::EN_ANY, Common::kPlatformDOS, ADGF_DEMO, GUIO4(GUIO_NOSPEECH, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
+ Common::EN_ANY, Common::kPlatformDOS, ADGF_DEMO, GUIO4(GUIO_NOSPEECH, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
// Mixed-Up Fairy Tales - English DOS Floppy EGA (from omer_mor, bug report #3035350)
{"fairytales", "EGA", {
@@ -2421,7 +2456,18 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.003", 0, "509b2467ba779100d5933ed51a9ae32f", 560255},
{"resource.004", 0, "93afc85d5ffa60ea555d6cc336d22c03", 651109},
AD_LISTEND},
- Common::EN_ANY, Common::kPlatformDOS, 0, GUIO5(GUIO_NOSPEECH, GAMEOPTION_EGA_UNDITHER, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
+ Common::EN_ANY, Common::kPlatformDOS, 0, GUIO5(GUIO_NOSPEECH, GAMEOPTION_EGA_UNDITHER, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
+
+ // Mixed-Up Fairy Tales - English DOS Floppy EGA (from misterhands, bug report #6596)
+ // Version 1.0, interpreter 1.000.158, INT# 11.23.91
+ {"fairytales", "EGA", {
+ {"resource.map", 0, "de9e151517013af15e0baf7bd8cbfe0b", 3243},
+ {"resource.000", 0, "27ec5fa09cd12a7fd16e86d96a2ed245", 840595},
+ {"resource.001", 0, "6ef4acdab49bdcaccf649640ddb12e9a", 115071},
+ {"resource.002", 0, "020d8c9da753a30899dd10c4463682db", 762020},
+ {"resource.003", 0, "9e0dea6b2bfd6cf0007cceb866bcbfb3", 670688},
+ AD_LISTEND},
+ Common::EN_ANY, Common::kPlatformDOS, 0, GUIO5(GUIO_NOSPEECH, GAMEOPTION_EGA_UNDITHER, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
// Mixed-Up Fairy Tales v1.000 - English DOS (supplied by markcoolio in bug report #2723791)
// Executable scanning reports "1.000.145"
@@ -2433,7 +2479,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.003", 0, "b1288e0821ee358d1ffe877e5900c8ec", 1047565},
{"resource.004", 0, "f79daa70390d73746742ffcfc3dc4471", 937580},
AD_LISTEND},
- Common::EN_ANY, Common::kPlatformDOS, 0, GUIO4(GUIO_NOSPEECH, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
+ Common::EN_ANY, Common::kPlatformDOS, 0, GUIO4(GUIO_NOSPEECH, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
// 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"
@@ -2444,7 +2490,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.002", 0, "564f516d991032e781492592a4eaa275", 1414142},
{"resource.003", 0, "dd6cef0c592eadb7e6be9a25307c57a2", 1344719},
AD_LISTEND},
- Common::EN_ANY, Common::kPlatformDOS, 0, GUIO4(GUIO_NOSPEECH, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
+ Common::EN_ANY, Common::kPlatformDOS, 0, GUIO4(GUIO_NOSPEECH, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
// Mixed-Up Mother Goose - English Amiga (from www.back2roots.org)
// Executable scanning reports "1.003.009"
@@ -2454,7 +2500,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.001", 0, "fb552ae550ca1dac19ed8f6a3767612d", 262885},
{"resource.002", 0, "fb552ae550ca1dac19ed8f6a3767612d", 817191},
AD_LISTEND},
- Common::EN_ANY, Common::kPlatformAmiga, 0, GUIO4(GUIO_NOSPEECH, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
+ Common::EN_ANY, Common::kPlatformAmiga, 0, GUIO4(GUIO_NOSPEECH, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
// Mixed-Up Mother Goose - English DOS Floppy EGA (from omer_mor, bug report #3035354)
{"mothergoose", "EGA", {
@@ -2462,7 +2508,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.001", 0, "d893892d62b3f061357291d66775e360", 239906},
{"resource.002", 0, "d893892d62b3f061357291d66775e360", 719398},
AD_LISTEND},
- Common::EN_ANY, Common::kPlatformDOS, 0, GUIO5(GUIO_NOSPEECH, GAMEOPTION_EGA_UNDITHER, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
+ Common::EN_ANY, Common::kPlatformDOS, 0, GUIO5(GUIO_NOSPEECH, GAMEOPTION_EGA_UNDITHER, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
// Mixed-Up Mother Goose - English DOS Floppy EGA (supplied by ssburnout in bug report #3049193)
// 1.011 5x5.25" (label: Int#8.2.90)
@@ -2475,7 +2521,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.004", 0, "dbbc22f124533ce308bc386b08956326", 146251},
{"resource.005", 0, "2ba5348e7fad641b9c4c7ff7c7cf4e68", 110979},
AD_LISTEND},
- Common::EN_ANY, Common::kPlatformDOS, 0, GUIO5(GUIO_NOSPEECH, GAMEOPTION_EGA_UNDITHER, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
+ Common::EN_ANY, Common::kPlatformDOS, 0, GUIO5(GUIO_NOSPEECH, GAMEOPTION_EGA_UNDITHER, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
// Mixed-Up Mother Goose v2.000 - English DOS Floppy (supplied by markcoolio in bug report #2723795)
// Executable scanning reports "1.001.031"
@@ -2483,7 +2529,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.map", 0, "52aae15e493cafd1da7e1c9b657a5bb9", 7026},
{"resource.000", 0, "b7ecd8ae9e254e80310b5a668b276e6e", 2948975},
AD_LISTEND},
- Common::EN_ANY, Common::kPlatformDOS, 0, GUIO4(GUIO_NOSPEECH, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
+ Common::EN_ANY, Common::kPlatformDOS, 0, GUIO4(GUIO_NOSPEECH, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
// Mixed-Up Mother Goose - English DOS CD (from jvprat)
// Executable scanning reports "x.yyy.zzz"
@@ -2492,7 +2538,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.map", 0, "1c7f311b0a2c927b2fbe81ae341fb2f6", 5790},
{"resource.001", 0, "5a0ed1d745855148364de1b3be099bac", 4369438},
AD_LISTEND},
- Common::EN_ANY, Common::kPlatformDOS, ADGF_CD, GUIO3(GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
+ Common::EN_ANY, Common::kPlatformDOS, ADGF_CD, GUIO3(GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
// Mixed-Up Mother Goose - English Windows Interactive Demo
// Executable scanning reports "x.yyy.zzz"
@@ -2500,19 +2546,19 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.map", 0, "87f9dc1cafc4d4fa835fb2f00cf3a6ef", 4560},
{"resource.001", 0, "5a0ed1d745855148364de1b3be099bac", 2070072},
AD_LISTEND},
- Common::EN_ANY, Common::kPlatformWindows, ADGF_DEMO, GUIO4(GUIO_NOSPEECH, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
+ Common::EN_ANY, Common::kPlatformWindows, ADGF_DEMO, GUIO4(GUIO_NOSPEECH, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
// 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, GUIO4(GUIO_NOASPECT, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
+ Common::EN_ANY, Common::kPlatformFMTowns, 0, GUIO4(GUIO_NOASPECT, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
{"mothergoose256", "", {
{"resource.map", 0, "b11e971ccd2040bebba59dfb409a08ef", 5772},
{"resource.001", 0, "d49625d9b8005ec01c852f8322a82867", 4330713},
AD_LISTEND},
- Common::JA_JPN, Common::kPlatformFMTowns, 0, GUIO4(GUIO_NOASPECT, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
+ Common::JA_JPN, Common::kPlatformFMTowns, 0, GUIO4(GUIO_NOASPECT, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
#ifdef ENABLE_SCI32
// Mixed-Up Mother Goose Deluxe - English Windows/DOS CD (supplied by markcoolio in bug report #2723810)
@@ -2521,7 +2567,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.map", 0, "5159a1578c4306bfe070a3e4d8c2e1d3", 4741},
{"resource.000", 0, "1926925c95d82f0999590e93b02887c5", 15150768},
AD_LISTEND},
- Common::EN_ANY, Common::kPlatformDOS, ADGF_UNSTABLE, GUIO4(GUIO_NOASPECT, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
+ Common::EN_ANY, Common::kPlatformDOS, ADGF_UNSTABLE, GUIO4(GUIO_NOASPECT, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
// Mixed-Up Mother Goose Deluxe - Multilingual Windows CD (English/French/German/Spanish)
// Executable scanning reports "2.100.002"
@@ -2529,7 +2575,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resmap.000", 0, "ef611af561898dcfea87846919ebf3eb", 4969},
{"ressci.000", 0, "227685bc59d90821978d330713e44a7a", 17205800},
AD_LISTEND},
- Common::EN_ANY, Common::kPlatformDOS, ADGF_UNSTABLE, GUIO4(GUIO_NOASPECT, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
+ Common::EN_ANY, Common::kPlatformDOS, ADGF_UNSTABLE, GUIO4(GUIO_NOASPECT, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
#endif // ENABLE_SCI32
// Ms. Astro Chicken - English DOS
@@ -2538,7 +2584,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.map", 0, "5b457cbe5042f557e5b610148171f6c0", 1158},
{"resource.001", 0, "453ea81ef66a50cbe33ce06302afe47f", 229737},
AD_LISTEND},
- Common::EN_ANY, Common::kPlatformDOS, 0, GUIO4(GUIO_NOSPEECH, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
+ Common::EN_ANY, Common::kPlatformDOS, 0, GUIO4(GUIO_NOSPEECH, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
#ifdef ENABLE_SCI32
// Phantasmagoria - English DOS (from jvprat)
@@ -2559,7 +2605,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resmap.007", 0, "afbd16ea77869a720afa1c5371de107d", 7972},
//{"ressci.007", 0, "3aae6559aa1df273bc542d5ac6330d75", 25859038},
AD_LISTEND},
- Common::EN_ANY, Common::kPlatformDOS, ADGF_UNSTABLE, GUIO5(GUIO_NOSPEECH, GUIO_NOASPECT, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
+ Common::EN_ANY, Common::kPlatformDOS, ADGF_UNSTABLE, GUIO5(GUIO_NOSPEECH, GUIO_NOASPECT, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
// Phantasmagoria - English DOS Demo
// Executable scanning reports "2.100.002"
@@ -2567,7 +2613,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resmap.001", 0, "416138651ea828219ca454cae18341a3", 11518},
{"ressci.001", 0, "3aae6559aa1df273bc542d5ac6330d75", 65844612},
AD_LISTEND},
- Common::EN_ANY, Common::kPlatformDOS, ADGF_DEMO | ADGF_UNSTABLE, GUIO5(GUIO_NOSPEECH, GUIO_NOASPECT, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
+ Common::EN_ANY, Common::kPlatformDOS, ADGF_DEMO | ADGF_UNSTABLE, GUIO5(GUIO_NOSPEECH, GUIO_NOASPECT, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
// Phantasmagoria - English DOS/Windows (GOG version) - ressci.* merged in ressci.000
// Windows executable scanning reports "2.100.002" - "Sep 19 1995 15:09:43"
@@ -2578,7 +2624,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"ressci.000", 0, "cd5967f9b9586e3380645961c0765be3", 116822037},
{"resmap.000", 0, "3cafc1c6a53945c1f3babbfd6380c64c", 16468},
AD_LISTEND},
- Common::EN_ANY, Common::kPlatformDOS, ADGF_UNSTABLE, GUIO5(GUIO_NOSPEECH, GUIO_NOASPECT, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
+ Common::EN_ANY, Common::kPlatformDOS, ADGF_UNSTABLE, GUIO5(GUIO_NOSPEECH, GUIO_NOASPECT, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
// Phantasmagoria - English Macintosh
// NOTE: This only contains disc 1 files (as well as the two persistent files:
@@ -2611,7 +2657,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, GUIO5(GUIO_NOSPEECH, GUIO_NOASPECT, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
+ Common::EN_ANY, Common::kPlatformWindows, ADGF_UNSTABLE, GUIO5(GUIO_NOSPEECH, GUIO_NOASPECT, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
// Phantasmagoria 2 - English DOS (GOG version) - ressci.* merged in ressci.000
// Executable scanning reports "3.000.000" - "Dec 07 1996 09:29:03"
@@ -2621,7 +2667,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, GUIO5(GUIO_NOSPEECH, GUIO_NOASPECT, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
+ Common::EN_ANY, Common::kPlatformWindows, ADGF_UNSTABLE, GUIO5(GUIO_NOSPEECH, GUIO_NOASPECT, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
#endif // ENABLE_SCI3_GAMES
#endif // ENABLE_SCI32
@@ -2632,7 +2678,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.map", 0, "72726dc81c1b4c1110c486be77369bc8", 5179},
{"resource.000", 0, "670d0c53622429f4b11275caf7f8d292", 5459574},
AD_LISTEND},
- Common::EN_ANY, Common::kPlatformDOS, 0, GUIO4(GUIO_NOSPEECH, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
+ Common::EN_ANY, Common::kPlatformDOS, 0, GUIO4(GUIO_NOSPEECH, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
// Pepper - English DOS Non-Interactive Demo
// Executable scanning reports "1.001.060", VERSION file reports "1.000"
@@ -2640,7 +2686,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.map", 0, "379bb4fb896630b14f2d91ed21e36ba1", 984},
{"resource.000", 0, "118f6c31a93ec7fd9a231c61125229e3", 645494},
AD_LISTEND},
- Common::EN_ANY, Common::kPlatformDOS, ADGF_DEMO, GUIO4(GUIO_NOSPEECH, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
+ Common::EN_ANY, Common::kPlatformDOS, ADGF_DEMO, GUIO4(GUIO_NOSPEECH, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
// Pepper - English DOS/Windows Interactive Demo
// Executable scanning reports "1.001.069", VERSION file reports ".001"
@@ -2648,7 +2694,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.map", 0, "975e8df76106a5c13d12ab674f906a02", 2514},
{"resource.000", 0, "e6a918a2dd7a4bcecd8fb389f43287c2", 1698164},
AD_LISTEND},
- Common::EN_ANY, Common::kPlatformDOS, ADGF_DEMO, GUIO4(GUIO_NOSPEECH, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
+ Common::EN_ANY, Common::kPlatformDOS, ADGF_DEMO, GUIO4(GUIO_NOSPEECH, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
// Pepper - English DOS Interactive Demo
// Executable scanning reports "1.001.072", VERSION file reports "1.000"
@@ -2656,7 +2702,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.map", 0, "9c9b7b900651a370dd3fb38d478b1798", 2524},
{"resource.000", 0, "e6a918a2dd7a4bcecd8fb389f43287c2", 1713544},
AD_LISTEND},
- Common::EN_ANY, Common::kPlatformDOS, ADGF_DEMO, GUIO4(GUIO_NOSPEECH, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
+ Common::EN_ANY, Common::kPlatformDOS, ADGF_DEMO, GUIO4(GUIO_NOSPEECH, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
// Police Quest 1 VGA Remake - English DOS (from the Police Quest Collection)
// Executable scanning reports "1.001.029", VERSION file reports "2.000"
@@ -2664,7 +2710,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.map", 0, "35efa814fb994b1cbdac9611e401da67", 5013},
{"resource.000", 0, "e0d5ddf34eda903a38f0837e2aa7145b", 6401433},
AD_LISTEND},
- Common::EN_ANY, Common::kPlatformDOS, 0, GUIO4(GUIO_NOSPEECH, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
+ Common::EN_ANY, Common::kPlatformDOS, 0, GUIO4(GUIO_NOSPEECH, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
// Police Quest 2 - English Amiga (from www.back2roots.org)
// SCI interpreter version 0.000.685 (just a guess)
@@ -2675,7 +2721,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.002", 0, "499737c21a28ac026e11ab817100d610", 511099},
{"resource.003", 0, "e008f5d6e2a7c4d4a0da0173e4fa8f8b", 553970},
AD_LISTEND},
- Common::EN_ANY, Common::kPlatformAmiga, 0, GUIO5(GUIO_NOSPEECH, GAMEOPTION_EGA_UNDITHER, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
+ Common::EN_ANY, Common::kPlatformAmiga, 0, GUIO5(GUIO_NOSPEECH, GAMEOPTION_EGA_UNDITHER, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
// Police Quest 2 - English DOS Non-Interactive Demo
// Executable scanning reports "0.000.413"
@@ -2683,7 +2729,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.map", 0, "8b77d0d4650c2052b356cece28294b58", 576},
{"resource.001", 0, "376ef6d6eaaeed66e1424bd219c4b9ab", 215398},
AD_LISTEND},
- Common::EN_ANY, Common::kPlatformDOS, ADGF_DEMO, GUIO5(GUIO_NOSPEECH, GAMEOPTION_EGA_UNDITHER, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
+ Common::EN_ANY, Common::kPlatformDOS, ADGF_DEMO, GUIO5(GUIO_NOSPEECH, GAMEOPTION_EGA_UNDITHER, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
// Police Quest 2 - English DOS (provided by richiefs in bug report #2670691)
// SCI interpreter version 0.000.395
@@ -2696,7 +2742,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.005", 0, "77f02def3094af804fd2371db25b7100", 349899},
{"resource.006", 0, "77f02def3094af804fd2371db25b7100", 354991},
AD_LISTEND},
- Common::EN_ANY, Common::kPlatformDOS, 0, GUIO5(GUIO_NOSPEECH, GAMEOPTION_EGA_UNDITHER, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
+ Common::EN_ANY, Common::kPlatformDOS, 0, GUIO5(GUIO_NOSPEECH, GAMEOPTION_EGA_UNDITHER, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
// Police Quest 2 - English DOS (from the Police Quest Collection)
// Executable scanning reports "0.000.490"
@@ -2706,7 +2752,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.002", 0, "77f02def3094af804fd2371db25b7100", 546000},
{"resource.003", 0, "77f02def3094af804fd2371db25b7100", 591851},
AD_LISTEND},
- Common::EN_ANY, Common::kPlatformDOS, 0, GUIO5(GUIO_NOSPEECH, GAMEOPTION_EGA_UNDITHER, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
+ Common::EN_ANY, Common::kPlatformDOS, 0, GUIO5(GUIO_NOSPEECH, GAMEOPTION_EGA_UNDITHER, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
// Police Quest 2 - English DOS (from FRG)
// SCI interpreter version 0.000.395
@@ -2716,7 +2762,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.002", 0, "77f02def3094af804fd2371db25b7100", 542897},
{"resource.003", 0, "77f02def3094af804fd2371db25b7100", 586857},
AD_LISTEND},
- Common::EN_ANY, Common::kPlatformDOS, 0, GUIO5(GUIO_NOSPEECH, GAMEOPTION_EGA_UNDITHER, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
+ Common::EN_ANY, Common::kPlatformDOS, 0, GUIO5(GUIO_NOSPEECH, GAMEOPTION_EGA_UNDITHER, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
// Police Quest 2 English DOS 1.001.006 (supplied by merkur-kun in bug report #3028479)
{"pq2", "", {
@@ -2725,7 +2771,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.002", 0, "77f02def3094af804fd2371db25b7100", 541261},
{"resource.003", 0, "77f02def3094af804fd2371db25b7100", 587511},
AD_LISTEND},
- Common::EN_ANY, Common::kPlatformDOS, 0, GUIO5(GUIO_NOSPEECH, GAMEOPTION_EGA_UNDITHER, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
+ Common::EN_ANY, Common::kPlatformDOS, 0, GUIO5(GUIO_NOSPEECH, GAMEOPTION_EGA_UNDITHER, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
// Police Quest 2 - Japanese PC-98 (also includes english language)
// SCI interpreter version unknown
@@ -2735,7 +2781,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, GUIO5(GUIO_NOSPEECH, GUIO_NOASPECT, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
+ Common::JA_JPN, Common::kPlatformPC98, ADGF_ADDENGLISH, GUIO5(GUIO_NOSPEECH, GUIO_NOASPECT, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
// Police Quest 3 - English Amiga
// Executable scanning reports "1.004.024"
@@ -2748,7 +2794,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.003", 0, "630bfa65beb05f743552704ac2899dae", 759891},
{"resource.004", 0, "7b229fbdf30d670d0728cede3e984a7e", 838663},
AD_LISTEND},
- Common::EN_ANY, Common::kPlatformAmiga, 0, GUIO4(GUIO_NOSPEECH, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
+ Common::EN_ANY, Common::kPlatformAmiga, 0, GUIO4(GUIO_NOSPEECH, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
// Police Quest 3 - German Amiga (also includes english language)
// Executable scanning reports "1.004.024"
@@ -2762,7 +2808,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, GUIO4(GUIO_NOSPEECH, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
+ Common::DE_DEU, Common::kPlatformAmiga, ADGF_ADDENGLISH, GUIO4(GUIO_NOSPEECH, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
// Police Quest 3 - English DOS (from the Police Quest Collection)
// Executable scanning reports "T.A00.178", VERSION file reports "1.00"
@@ -2775,7 +2821,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.003", 0, "8791b9eef53edf77c2dac950142221d3", 1159791},
{"resource.004", 0, "1b91e891a3c60a941dac0eecdf83375b", 1143606},
AD_LISTEND},
- Common::EN_ANY, Common::kPlatformDOS, 0, GUIO4(GUIO_NOSPEECH, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
+ Common::EN_ANY, Common::kPlatformDOS, 0, GUIO4(GUIO_NOSPEECH, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
// Police Quest 3 - English DOS Non-Interactive Demo
// Executable scanning reports "T.A00.052"
@@ -2785,7 +2831,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.000", 0, "277f97771f7a6d89677141f02da313d6", 65150},
{"resource.001", 0, "5c5a551b6c86cce2ee75becb90e0b586", 624411},
AD_LISTEND},
- Common::EN_ANY, Common::kPlatformDOS, ADGF_DEMO, GUIO4(GUIO_NOSPEECH, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
+ Common::EN_ANY, Common::kPlatformDOS, ADGF_DEMO, GUIO4(GUIO_NOSPEECH, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
// Police Quest 3 - German DOS (supplied by markcoolio in bug report #2723837, also includes english language)
// Executable scanning reports "T.A00.178"
@@ -2798,14 +2844,14 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.003", 0, "4836f460f4cfc8de61e2df4c45775504", 1180956},
{"resource.004", 0, "0c3eb84b9755852d9e795e0d5c9373c7", 1171760},
AD_LISTEND},
- Common::DE_DEU, Common::kPlatformDOS, ADGF_ADDENGLISH, GUIO4(GUIO_NOSPEECH, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
+ Common::DE_DEU, Common::kPlatformDOS, ADGF_ADDENGLISH, GUIO4(GUIO_NOSPEECH, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
// Police Quest 3 - Spanish DOS v1.000 - Supplied by dianiu in bug report #3555647
{"pq3", "", {
{"resource.map", 0, "ffa0b4631c4e36d69631256d19ba29e7", 5421},
{"resource.000", 0, "5ee460af3d70c06a745cc482b6c783ba", 5410263},
AD_LISTEND},
- Common::ES_ESP, Common::kPlatformDOS, ADGF_ADDENGLISH, GUIO4(GUIO_NOSPEECH, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
+ Common::ES_ESP, Common::kPlatformDOS, ADGF_ADDENGLISH, GUIO4(GUIO_NOSPEECH, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
// Police Quest 3 EGA
// Reported by musiclyinspired in bug report #3046573
@@ -2818,7 +2864,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.004", 0, "b96a86ab681769e4cbb439670d967ca6", 449682},
{"resource.005", 0, "9e6c53a0e7eef53694d260fade8b1fc7", 724000},
AD_LISTEND},
- Common::EN_ANY, Common::kPlatformDOS, 0, GUIO5(GUIO_NOSPEECH, GAMEOPTION_EGA_UNDITHER, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
+ Common::EN_ANY, Common::kPlatformDOS, 0, GUIO4(GUIO_NOSPEECH, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
// Police Quest 4 - English DOS Non-Interactive Demo (from FRG)
// SCI interpreter version 1.001.096
@@ -2826,7 +2872,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.map", 0, "be56f87a1c4a13062a30a362df860c2f", 1472},
{"resource.000", 0, "527d5684016e6816157cd15d9071b11b", 1121310},
AD_LISTEND},
- Common::EN_ANY, Common::kPlatformDOS, ADGF_DEMO, GUIO4(GUIO_NOSPEECH, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
+ Common::EN_ANY, Common::kPlatformDOS, ADGF_DEMO, GUIO4(GUIO_NOSPEECH, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
#ifdef ENABLE_SCI32
// Police Quest 4 - English DOS CD (from the Police Quest Collection)
@@ -2835,7 +2881,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.map", 0, "379dfe80ed6bd16c47e4b950c4722eac", 11374},
{"resource.000", 0, "fd316a09b628b7032248139003369022", 18841068},
AD_LISTEND},
- Common::EN_ANY, Common::kPlatformDOS, ADGF_CD | ADGF_UNSTABLE, GUIO3(GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
+ Common::EN_ANY, Common::kPlatformDOS, ADGF_CD | ADGF_UNSTABLE, GUIO3(GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
// Police Quest 4 - German DOS CD (German text, English speech)
// Supplied by markcoolio in bug report #3392955
@@ -2843,7 +2889,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.map", 0, "a398076371ed0e1e706c8f9fb9fc7ac5", 11386},
{"resource.000", 0, "6ff21954e0a2c5992279e7eb787c8d56", 18918747},
AD_LISTEND},
- Common::DE_DEU, Common::kPlatformDOS, ADGF_CD | ADGF_UNSTABLE, GUIO3(GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
+ Common::DE_DEU, Common::kPlatformDOS, ADGF_CD | ADGF_UNSTABLE, GUIO3(GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
// Police Quest 4 - English DOS
// SCI interpreter version 2.000.000 (a guess?)
@@ -2851,7 +2897,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.map", 0, "aed9643158ccf01b71f359db33137f82", 9895},
{"resource.000", 0, "da383857b3be1e4514daeba2524359e0", 15141432},
AD_LISTEND},
- Common::EN_ANY, Common::kPlatformDOS, ADGF_UNSTABLE, GUIO4(GUIO_NOSPEECH, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
+ Common::EN_ANY, Common::kPlatformDOS, ADGF_UNSTABLE, GUIO4(GUIO_NOSPEECH, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
// Police Quest 4 - French DOS (supplied by abevi in bug report #2612718)
// SCI interpreter version 2.000.000
@@ -2859,7 +2905,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.map", 0, "008030846edcc7c5c7a812c7f4ae4ceb", 9256},
{"resource.000", 0, "6ba98bd2e436739d87ecd2a9b99cabb4", 14730153},
AD_LISTEND},
- Common::FR_FRA, Common::kPlatformDOS, ADGF_UNSTABLE, GUIO4(GUIO_NOSPEECH, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
+ Common::FR_FRA, Common::kPlatformDOS, ADGF_UNSTABLE, GUIO4(GUIO_NOSPEECH, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
// Police Quest 4 - German DOS (supplied by markcoolio in bug report #2723840)
// SCI interpreter version 2.000.000 (a guess?)
@@ -2867,7 +2913,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.map", 0, "2393ee728ab930b2762cb5889f9b5aff", 9256},
{"resource.000", 0, "6ba98bd2e436739d87ecd2a9b99cabb4", 14730155},
AD_LISTEND},
- Common::DE_DEU, Common::kPlatformDOS, ADGF_UNSTABLE, GUIO4(GUIO_NOSPEECH, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
+ Common::DE_DEU, Common::kPlatformDOS, ADGF_UNSTABLE, GUIO4(GUIO_NOSPEECH, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
// Police Quest: SWAT - English DOS/Windows Demo (from jvprat)
// Executable scanning reports "2.100.002", VERSION file reports "0.001.200"
@@ -2875,7 +2921,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.map", 0, "8c96733ef94c21526792f7ca4e3f2120", 1648},
{"resource.000", 0, "d8892f1b8c56c8f7704325460f49b300", 3676175},
AD_LISTEND},
- Common::EN_ANY, Common::kPlatformDOS, ADGF_DEMO | ADGF_UNSTABLE, GUIO5(GUIO_NOSPEECH, GUIO_NOASPECT, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
+ Common::EN_ANY, Common::kPlatformDOS, ADGF_DEMO | ADGF_UNSTABLE, GUIO5(GUIO_NOSPEECH, GUIO_NOASPECT, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
// Police Quest: SWAT - English DOS (from GOG.com)
// Executable scanning reports "2.100.002", VERSION file reports "1.0c"
@@ -2883,7 +2929,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resmap.000", 0, "1c2563fee189885e29d9348f37306d94", 12175},
{"ressci.000", 0, "b2e1826ca81ce2e7e764587f5a14eee9", 127149181},
AD_LISTEND},
- Common::EN_ANY, Common::kPlatformDOS, ADGF_UNSTABLE, GUIO4(GUIO_NOASPECT, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
+ Common::EN_ANY, Common::kPlatformDOS, ADGF_UNSTABLE, GUIO4(GUIO_NOASPECT, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
// Police Quest: SWAT - English Windows (from the Police Quest Collection)
// Executable scanning reports "2.100.002", VERSION file reports "1.0c"
@@ -2898,7 +2944,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, GUIO4(GUIO_NOASPECT, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
+ Common::EN_ANY, Common::kPlatformWindows, ADGF_UNSTABLE, GUIO4(GUIO_NOASPECT, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
#endif // ENABLE_SCI32
// Quest for Glory 1 / Hero's Quest - English DOS 3.5" Floppy (supplied by merkur in bug report #2718784)
@@ -2911,7 +2957,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.003", 0, "7ab2bf8e224b57f75e0cd6e4ba790761", 642203},
{"resource.004", 0, "7ab2bf8e224b57f75e0cd6e4ba790761", 641688},
AD_LISTEND},
- Common::EN_ANY, Common::kPlatformDOS, 0, GUIO5(GUIO_NOSPEECH, GAMEOPTION_EGA_UNDITHER, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
+ Common::EN_ANY, Common::kPlatformDOS, 0, GUIO5(GUIO_NOSPEECH, GAMEOPTION_EGA_UNDITHER, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
// Quest for Glory 1 / Hero's Quest - English DOS 3.5" Floppy (supplied by alonzotg in bug report #3206006)
{"qfg1", "", {
@@ -2922,7 +2968,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.003", 0, "7ab2bf8e224b57f75e0cd6e4ba790761", 642203},
{"resource.004", 0, "7ab2bf8e224b57f75e0cd6e4ba790761", 641688},
AD_LISTEND},
- Common::EN_ANY, Common::kPlatformDOS, 0, GUIO5(GUIO_NOSPEECH, GAMEOPTION_EGA_UNDITHER, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
+ Common::EN_ANY, Common::kPlatformDOS, 0, GUIO5(GUIO_NOSPEECH, GAMEOPTION_EGA_UNDITHER, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
// Quest for Glory 1 / Hero's Quest - English DOS 3.5" Floppy v1.102 Int#0.000.629 (suppled by digitoxin1 in bug report #3554611)
{"qfg1", "", {
@@ -2933,7 +2979,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.003", 0, "f0af87c60ec869946da442833aa5afa8", 640502},
{"resource.004", 0, "f0af87c60ec869946da442833aa5afa8", 644575},
AD_LISTEND},
- Common::EN_ANY, Common::kPlatformDOS, 0, GUIO5(GUIO_NOSPEECH, GAMEOPTION_EGA_UNDITHER, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
+ Common::EN_ANY, Common::kPlatformDOS, 0, GUIO5(GUIO_NOSPEECH, GAMEOPTION_EGA_UNDITHER, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
// Quest for Glory 1 / Hero's Quest - English DOS 5.25" Floppy v1.102 Int#0.000.629 (suppled by digitoxin1 in bug report #3554611)
{"qfg1", "", {
@@ -2947,7 +2993,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.006", 0, "48b2b3c964dcbeccb68e984e6d4e97db", 278473},
{"resource.007", 0, "f0af87c60ec869946da442833aa5afa8", 269237},
AD_LISTEND},
- Common::EN_ANY, Common::kPlatformDOS, 0, GUIO5(GUIO_NOSPEECH, GAMEOPTION_EGA_UNDITHER, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
+ Common::EN_ANY, Common::kPlatformDOS, 0, GUIO5(GUIO_NOSPEECH, GAMEOPTION_EGA_UNDITHER, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
// 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"
@@ -2962,7 +3008,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.006", 0, "69366c2a2f99917199fe1b60a4fee19d", 267852},
{"resource.007", 0, "7ab2bf8e224b57f75e0cd6e4ba790761", 272747},
AD_LISTEND},
- Common::EN_ANY, Common::kPlatformDOS, 0, GUIO5(GUIO_NOSPEECH, GAMEOPTION_EGA_UNDITHER, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
+ Common::EN_ANY, Common::kPlatformDOS, 0, GUIO5(GUIO_NOSPEECH, GAMEOPTION_EGA_UNDITHER, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
// 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)
@@ -2977,7 +3023,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.006", 0, "69366c2a2f99917199fe1b60a4fee19d", 267852},
{"resource.007", 0, "7ab2bf8e224b57f75e0cd6e4ba790761", 272747},
AD_LISTEND},
- Common::EN_ANY, Common::kPlatformDOS, 0, GUIO5(GUIO_NOSPEECH, GAMEOPTION_EGA_UNDITHER, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
+ Common::EN_ANY, Common::kPlatformDOS, 0, GUIO5(GUIO_NOSPEECH, GAMEOPTION_EGA_UNDITHER, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
// 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)
@@ -2992,7 +3038,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.006", 0, "f46690dca714abc8c89357d30e363dd3", 278387},
{"resource.007", 0, "951299a82a8134ed12c5c18118d45c2f", 269173},
AD_LISTEND},
- Common::EN_ANY, Common::kPlatformDOS, 0, GUIO5(GUIO_NOSPEECH, GAMEOPTION_EGA_UNDITHER, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
+ Common::EN_ANY, Common::kPlatformDOS, 0, GUIO5(GUIO_NOSPEECH, GAMEOPTION_EGA_UNDITHER, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
// Quest for Glory 1 / Hero's Quest - English DOS Demo
// Executable scanning reports "0.000.685"
@@ -3000,7 +3046,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.map", 0, "df34c758cbb9026da175793ff686b0e6", 882},
{"resource.001", 0, "73fbaafdd313b39aeedb80fbf85ecef1", 389884},
AD_LISTEND},
- Common::EN_ANY, Common::kPlatformDOS, ADGF_DEMO, GUIO5(GUIO_NOSPEECH, GAMEOPTION_EGA_UNDITHER, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
+ Common::EN_ANY, Common::kPlatformDOS, ADGF_DEMO, GUIO5(GUIO_NOSPEECH, GAMEOPTION_EGA_UNDITHER, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
// Quest for Glory 1 - Japanese PC-98 5.25" Floppy (also includes English language)
// Executable scanning reports "S.old.201"
@@ -3010,7 +3056,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, GUIO3(GUIO_NOSPEECH, GUIO_NOASPECT, GAMEOPTION_EGA_UNDITHER) },
+ Common::JA_JPN, Common::kPlatformPC98, ADGF_ADDENGLISH, GUIO3(GUIO_NOSPEECH, GUIO_NOASPECT, GAMEOPTION_EGA_UNDITHER) },
// Quest for Glory 1 - Japanese PC-98 5.25" Floppy (also includes English language)
// Executable scanning reports "S.old.201"
@@ -3020,7 +3066,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, GUIO3(GUIO_NOSPEECH, GUIO_NOASPECT, GAMEOPTION_EGA_UNDITHER) },
+ Common::JA_JPN, Common::kPlatformPC98, ADGF_ADDENGLISH, GUIO3(GUIO_NOSPEECH, GUIO_NOASPECT, GAMEOPTION_EGA_UNDITHER) },
// Quest for Glory 1 - English Amiga
// Executable scanning reports "1.002.020"
@@ -3034,7 +3080,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.004", 0, "16cd4414c37ae3bb6d6da33dce8e25e8", 689124},
{"resource.005", 0, "5f3386ef2f2b1254e4a066f5d9027324", 609529},
AD_LISTEND},
- Common::EN_ANY, Common::kPlatformAmiga, 0, GUIO5(GUIO_NOSPEECH, GAMEOPTION_EGA_UNDITHER, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
+ Common::EN_ANY, Common::kPlatformAmiga, 0, GUIO5(GUIO_NOSPEECH, GAMEOPTION_EGA_UNDITHER, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
// Quest for Glory 1 - English DOS
// SCI interpreter version 0.000.629
@@ -3046,7 +3092,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.003", 0, "951299a82a8134ed12c5c18118d45c2f", 640483},
{"resource.004", 0, "951299a82a8134ed12c5c18118d45c2f", 644443},
AD_LISTEND},
- Common::EN_ANY, Common::kPlatformDOS, 0, GUIO5(GUIO_NOSPEECH, GAMEOPTION_EGA_UNDITHER, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
+ Common::EN_ANY, Common::kPlatformDOS, 0, GUIO5(GUIO_NOSPEECH, GAMEOPTION_EGA_UNDITHER, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
// Quest for Glory 1 VGA Remake - English DOS
// Executable scanning reports "2.000.411"
@@ -3054,7 +3100,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.map", 0, "a731fb6c9c0b282443f7027bc8694d4c", 8469},
{"resource.000", 0, "ecace1a2771846b1a8aa1afdd44111a0", 6570147},
AD_LISTEND},
- Common::EN_ANY, Common::kPlatformDOS, 0, GUIO4(GUIO_NOSPEECH, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
+ Common::EN_ANY, Common::kPlatformDOS, 0, GUIO4(GUIO_NOSPEECH, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
// Quest for Glory 1 VGA Remake - English DOS Non-Interactive Demo (from FRG)
// SCI interpreter version 1.001.029
@@ -3062,7 +3108,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.map", 0, "ac0257051c95a59c0cdc0be24d9b11fa", 729},
{"resource.000", 0, "ec6f5cf369054dd3e5392995e9975b9e", 768218},
AD_LISTEND},
- Common::EN_ANY, Common::kPlatformDOS, ADGF_DEMO, GUIO4(GUIO_NOSPEECH, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
+ Common::EN_ANY, Common::kPlatformDOS, ADGF_DEMO, GUIO4(GUIO_NOSPEECH, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
// Quest for Glory 1 VGA Remake - English Macintosh Floppy
// VERSION file reports "2.0"
@@ -3070,7 +3116,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"Data1", 0, "106527ff8756e4e1a795d63d23e8b833", 1752358},
{"Data2", 0, "5cdd92033231159c6e9c71d43e9f194d", 6574746},
AD_LISTEND},
- Common::EN_ANY, Common::kPlatformMacintosh, ADGF_MACRESFORK, GUIO4(GUIO_NOSPEECH, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
+ Common::EN_ANY, Common::kPlatformMacintosh, ADGF_MACRESFORK, GUIO4(GUIO_NOSPEECH, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
// Quest for Glory 2 - English Amiga
// Executable scanning reports "1.003.004"
@@ -3086,7 +3132,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.006", 0, "ccf5dba33e5cab6d5872838c0f8db44c", 500039},
{"resource.007", 0, "4c9fc1587545879295cb9627f56a2cb8", 575056},
AD_LISTEND},
- Common::EN_ANY, Common::kPlatformAmiga, 0, GUIO5(GUIO_NOSPEECH, GAMEOPTION_EGA_UNDITHER, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
+ Common::EN_ANY, Common::kPlatformAmiga, 0, GUIO5(GUIO_NOSPEECH, GAMEOPTION_EGA_UNDITHER, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
// Quest for Glory 2 - English (supplied by ssburnout in bug report #3049193)
// 1.000 5x5.25" (label: INT#10.31.90)
@@ -3098,7 +3144,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.003", 0, "0790f67d87642132be515cab05026baa", 972144},
{"resource.004", 0, "2ac1e6fea9aa1f5b91a06693a67b9766", 982830},
AD_LISTEND},
- Common::EN_ANY, Common::kPlatformDOS, 0, GUIO5(GUIO_NOSPEECH, GAMEOPTION_EGA_UNDITHER, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
+ Common::EN_ANY, Common::kPlatformDOS, 0, GUIO5(GUIO_NOSPEECH, GAMEOPTION_EGA_UNDITHER, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
// Quest for Glory 2 - English (supplied by ssburnout in bug report #3049193)
// 1.000 9x3.5" (label: INT#10.31.90)
@@ -3113,7 +3159,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.006", 0, "5e9deacbdb17198ad844988e04833520", 498593},
{"resource.007", 0, "2ac1e6fea9aa1f5b91a06693a67b9766", 490151},
AD_LISTEND},
- Common::EN_ANY, Common::kPlatformDOS, 0, GUIO5(GUIO_NOSPEECH, GAMEOPTION_EGA_UNDITHER, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
+ Common::EN_ANY, Common::kPlatformDOS, 0, GUIO5(GUIO_NOSPEECH, GAMEOPTION_EGA_UNDITHER, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
// Quest for Glory 2 - English (from FRG)
// Executable scanning reports "1.000.072"
@@ -3125,7 +3171,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.003", 0, "b192607c42f6960ecdf2ad2e4f90e9bc", 972804},
{"resource.004", 0, "cd2de58e27665d5853530de93fae7cd6", 983617},
AD_LISTEND},
- Common::EN_ANY, Common::kPlatformDOS, 0, GUIO5(GUIO_NOSPEECH, GAMEOPTION_EGA_UNDITHER, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
+ Common::EN_ANY, Common::kPlatformDOS, 0, GUIO5(GUIO_NOSPEECH, GAMEOPTION_EGA_UNDITHER, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
// Quest for Glory 2 - English DOS
// Executable scanning reports "1.000.072"
@@ -3140,7 +3186,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.006", 0, "b1944bd664ddbd2859cdaa0c4a0d6281", 507489},
{"resource.007", 0, "cd2de58e27665d5853530de93fae7cd6", 490794},
AD_LISTEND},
- Common::EN_ANY, Common::kPlatformDOS, 0, GUIO5(GUIO_NOSPEECH, GAMEOPTION_EGA_UNDITHER, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
+ Common::EN_ANY, Common::kPlatformDOS, 0, GUIO5(GUIO_NOSPEECH, GAMEOPTION_EGA_UNDITHER, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
// Quest for Glory 2 - English DOS (supplied by digitoxin1 in bug report #3554614)
// v1.102 9x3.5" (label: Int#11.20.90)
@@ -3155,7 +3201,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.006", 0, "b1944bd664ddbd2859cdaa0c4a0d6281", 507489},
{"resource.007", 0, "cd2de58e27665d5853530de93fae7cd6", 490794},
AD_LISTEND},
- Common::EN_ANY, Common::kPlatformDOS, 0, GUIO5(GUIO_NOSPEECH, GAMEOPTION_EGA_UNDITHER, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
+ Common::EN_ANY, Common::kPlatformDOS, 0, GUIO5(GUIO_NOSPEECH, GAMEOPTION_EGA_UNDITHER, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
// Quest for Glory 2 - English DOS Non-Interactive Demo
// Executable scanning reports "1.000.046"
@@ -3163,7 +3209,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.map", 0, "e75eb86bdd517b3ef709058249986a87", 906},
{"resource.001", 0, "9b098f9e1008abe30e56c93b896494e6", 362123},
AD_LISTEND},
- Common::EN_ANY, Common::kPlatformDOS, ADGF_DEMO, GUIO5(GUIO_NOSPEECH, GAMEOPTION_EGA_UNDITHER, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
+ Common::EN_ANY, Common::kPlatformDOS, ADGF_DEMO, GUIO5(GUIO_NOSPEECH, GAMEOPTION_EGA_UNDITHER, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
// 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"
@@ -3171,7 +3217,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.map", 0, "fd71de9b588a45f085317caacf050e91", 687},
{"resource.000", 0, "b6c69bf6c18bf177492249fe81fc6a6d", 648702},
AD_LISTEND},
- Common::EN_ANY, Common::kPlatformDOS, ADGF_DEMO, GUIO4(GUIO_NOSPEECH, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
+ Common::EN_ANY, Common::kPlatformDOS, ADGF_DEMO, GUIO4(GUIO_NOSPEECH, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
// Quest for Glory 3 - English DOS
// SCI interpreter version 1.001.050
@@ -3179,7 +3225,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.map", 0, "19e2bf9b693932b5e2bb59b9f9ab86c9", 5958},
{"resource.000", 0, "6178ad2e83e58e4671ca03315f7a6498", 5868000},
AD_LISTEND},
- Common::EN_ANY, Common::kPlatformDOS, 0, GUIO4(GUIO_NOSPEECH, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
+ Common::EN_ANY, Common::kPlatformDOS, 0, GUIO4(GUIO_NOSPEECH, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
// Quest for Glory 3 - English DOS (supplied by abevi in bug report #2612718)
// SCI interpreter version 1.001.050
@@ -3187,7 +3233,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.map", 0, "62c185d190363d7df06330fa0cc45b36", 5958},
{"resource.000", 0, "6178ad2e83e58e4671ca03315f7a6498", 5867442},
AD_LISTEND},
- Common::EN_ANY, Common::kPlatformDOS, 0, GUIO4(GUIO_NOSPEECH, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
+ Common::EN_ANY, Common::kPlatformDOS, 0, GUIO4(GUIO_NOSPEECH, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
// Quest for Glory 3 - English DOS (supplied by dknute in bug report #3125559)
{"qfg3", "", {
@@ -3195,7 +3241,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.000", 0, "6178ad2e83e58e4671ca03315f7a6498", 5868042},
{"resource.msg", 0, "27e5419c98ce444253f88c95dced14a9", 246888},
AD_LISTEND},
- Common::EN_ANY, Common::kPlatformDOS, 0, GUIO4(GUIO_NOSPEECH, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
+ Common::EN_ANY, Common::kPlatformDOS, 0, GUIO4(GUIO_NOSPEECH, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
// Quest for Glory 3 - German DOS (supplied by markcoolio in bug report #2723846)
// Executable scanning reports "L.rry.083"
@@ -3203,7 +3249,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.map", 0, "19e2bf9b693932b5e2bb59b9f9ab86c9", 5958},
{"resource.000", 0, "6178ad2e83e58e4671ca03315f7a6498", 5868042},
AD_LISTEND},
- Common::DE_DEU, Common::kPlatformDOS, 0, GUIO4(GUIO_NOSPEECH, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
+ Common::DE_DEU, Common::kPlatformDOS, 0, GUIO4(GUIO_NOSPEECH, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
// Quest for Glory 3 - French DOS v1.1 (supplied by misterhands in bug report #3586214)
// Executable scanning reports "L.rry.083"
@@ -3212,7 +3258,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.000", 0, "6178ad2e83e58e4671ca03315f7a6498", 5868000},
{"resource.msg", 0, "0fa1047002df904b8d1807bb7bab4fab", 267210},
AD_LISTEND},
- Common::FR_FRA, Common::kPlatformDOS, 0, GUIO3(GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
+ Common::FR_FRA, Common::kPlatformDOS, 0, GUIO3(GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
// Quest for Glory 3 - Spanish DOS CD (from jvprat)
// Executable scanning reports "L.rry.083", VERSION file reports "1.000.000, June 30, 1994"
@@ -3221,7 +3267,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.000", 0, "ba7ac86155e4c531e46cd73c86daa80a", 5884098},
{"resource.msg", 0, "a63974730d294dec0bea10057c36e506", 256014},
AD_LISTEND},
- Common::ES_ESP, Common::kPlatformDOS, 0, GUIO3(GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
+ Common::ES_ESP, Common::kPlatformDOS, 0, GUIO3(GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
// Quest for Glory 3 - Italian DOS
// Supplied by ghoost in bug report #3053457
@@ -3230,7 +3276,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.000", 0, "6178ad2e83e58e4671ca03315f7a6498", 5868000},
{"resource.msg", 0, "5a0a896ff3e4a628db38a75eb6c84114", 259018},
AD_LISTEND},
- Common::IT_ITA, Common::kPlatformDOS, 0, GUIO3(GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
+ Common::IT_ITA, Common::kPlatformDOS, 0, GUIO3(GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
// Quest for Glory 4 - English DOS Non-Interactive Demo (from FRG)
// SCI interpreter version 1.001.069 (just a guess)
@@ -3238,7 +3284,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.map", 0, "1ba7c7ae1efb315326d45cb931569b1b", 922},
{"resource.000", 0, "41ba03f0b188b029132daa3ece0d3e14", 623154},
AD_LISTEND},
- Common::EN_ANY, Common::kPlatformDOS, ADGF_DEMO, GUIO4(GUIO_NOSPEECH, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
+ Common::EN_ANY, Common::kPlatformDOS, ADGF_DEMO, GUIO4(GUIO_NOSPEECH, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
#ifdef ENABLE_SCI32
// Quest for Glory 4 1.1 Floppy - English DOS (supplied by markcool in bug report #2723852)
@@ -3247,7 +3293,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.map", 0, "685bdb1ed47bbbb0e5e25db392da83ce", 9301},
{"resource.000", 0, "f64fd6aa3977939a86ff30783dd677e1", 11004993},
AD_LISTEND},
- Common::EN_ANY, Common::kPlatformDOS, ADGF_UNSTABLE, GUIO4(GUIO_NOSPEECH, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
+ Common::EN_ANY, Common::kPlatformDOS, ADGF_UNSTABLE, GUIO4(GUIO_NOSPEECH, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
// Quest for Glory 4 1.1 Floppy - English DOS (supplied by abevi in bug report #2612718)
// SCI interpreter version 2.000.000
@@ -3255,7 +3301,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.map", 0, "d10a4cc177d2091d744e2ad8c049b0ae", 9295},
{"resource.000", 0, "f64fd6aa3977939a86ff30783dd677e1", 11003589},
AD_LISTEND},
- Common::EN_ANY, Common::kPlatformDOS, ADGF_UNSTABLE, GUIO4(GUIO_NOSPEECH, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
+ Common::EN_ANY, Common::kPlatformDOS, ADGF_UNSTABLE, GUIO4(GUIO_NOSPEECH, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
// 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"
@@ -3263,7 +3309,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.map", 0, "9e0abba8746f40565bc7eb5720522ecd", 9301},
{"resource.000", 0, "57f22cdc54eeb35fce1f26b31b5c3ee1", 11076197},
AD_LISTEND},
- Common::DE_DEU, Common::kPlatformDOS, ADGF_UNSTABLE, GUIO4(GUIO_NOSPEECH, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
+ Common::DE_DEU, Common::kPlatformDOS, ADGF_UNSTABLE, GUIO4(GUIO_NOSPEECH, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
// Quest for Glory 4 CD - English DOS/Windows (from jvprat)
// Executable scanning reports "2.100.002", VERSION file reports "1.0"
@@ -3271,7 +3317,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.map", 0, "aba367f2102e81782d961b14fbe3d630", 10246},
{"resource.000", 0, "263dce4aa34c49d3ad29bec889007b1c", 11571394},
AD_LISTEND},
- Common::EN_ANY, Common::kPlatformDOS, ADGF_CD | ADGF_UNSTABLE, GUIO4(GUIO_NOASPECT, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
+ Common::EN_ANY, Common::kPlatformDOS, ADGF_CD | ADGF_UNSTABLE, GUIO4(GUIO_NOASPECT, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
// RAMA - English DOS/Windows Demo
// Executable scanning reports "2.100.002", VERSION file reports "000.000.008"
@@ -3279,7 +3325,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, GUIO4(GUIO_NOASPECT, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
+ Common::EN_ANY, Common::kPlatformWindows, ADGF_DEMO | ADGF_UNSTABLE, GUIO4(GUIO_NOASPECT, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
#ifdef ENABLE_SCI3_GAMES
// RAMA - English Windows (from jvprat)
@@ -3292,7 +3338,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, GUIO4(GUIO_NOASPECT, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
+ Common::EN_ANY, Common::kPlatformWindows, ADGF_UNSTABLE, GUIO4(GUIO_NOASPECT, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
// RAMA - English Windows (from Quietust, in bug report #2850645)
{"rama", "", {
@@ -3303,18 +3349,18 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resmap.003", 0, "48841e4b84ef1b98b48d43566fda9e13", 1636},
{"ressci.003", 0, "2a68edd064e5e4937b5e9c74b38f2082", 6870356},
AD_LISTEND},
- Common::EN_ANY, Common::kPlatformWindows, ADGF_UNSTABLE, GUIO4(GUIO_NOASPECT, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
+ Common::EN_ANY, Common::kPlatformWindows, ADGF_UNSTABLE, GUIO4(GUIO_NOASPECT, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
// RAMA - German Windows CD (from farmboy0, in pull request 397)
{"rama", "", {
{"resmap.001", 0, "f68cd73308c46977a9632dfc618e1e38", 8338},
- {"ressci.001", 0, "2a68edd064e5e4937b5e9c74b38f2082", 70595521},
- {"resmap.002", 0, "891fc2f5d9e23e7d9a9454acc7aaae52", 12082},
- {"ressci.002", 0, "2a68edd064e5e4937b5e9c74b38f2082", 128508558},
- {"resmap.003", 0, "222096000bd83a1d56577114a452cccf", 1636},
- {"ressci.003", 0, "2a68edd064e5e4937b5e9c74b38f2082", 6954219},
+ {"ressci.001", 0, "2a68edd064e5e4937b5e9c74b38f2082", 70595521},
+ {"resmap.002", 0, "891fc2f5d9e23e7d9a9454acc7aaae52", 12082},
+ {"ressci.002", 0, "2a68edd064e5e4937b5e9c74b38f2082", 128508558},
+ {"resmap.003", 0, "222096000bd83a1d56577114a452cccf", 1636},
+ {"ressci.003", 0, "2a68edd064e5e4937b5e9c74b38f2082", 6954219},
AD_LISTEND},
- Common::DE_DEU, Common::kPlatformWindows, ADGF_UNSTABLE, GUIO4(GUIO_NOASPECT, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
+ Common::DE_DEU, Common::kPlatformWindows, ADGF_UNSTABLE, GUIO4(GUIO_NOASPECT, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
// RAMA - Italian Windows CD (from glorifindel)
// SCI interpreter version 3.000.000 (a guess?)
@@ -3322,7 +3368,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, GUIO4(GUIO_NOASPECT, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
+ Common::IT_ITA, Common::kPlatformWindows, ADGF_UNSTABLE, GUIO4(GUIO_NOASPECT, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
#endif // ENABLE_SCI3_GAMES
// Shivers - English Windows (from jvprat)
@@ -3331,14 +3377,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, GUIO4(GUIO_NOASPECT, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
+ Common::EN_ANY, Common::kPlatformWindows, ADGF_UNSTABLE, GUIO4(GUIO_NOASPECT, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
// 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, GUIO4(GUIO_NOASPECT, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
+ Common::DE_DEU, Common::kPlatformWindows, ADGF_UNSTABLE, GUIO4(GUIO_NOASPECT, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
// Shivers - English Windows Demo
// Executable scanning reports "2.100.002"
@@ -3346,7 +3392,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, GUIO4(GUIO_NOASPECT, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
+ Common::EN_ANY, Common::kPlatformWindows, ADGF_DEMO | ADGF_UNSTABLE, GUIO4(GUIO_NOASPECT, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
// Shivers 2 doesn't contain SCI scripts. The whole game logic has
// been reimplemented from SCI in native code placed in DLL files.
@@ -3364,7 +3410,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, GUIO4(GUIO_NOASPECT, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
+ Common::EN_ANY, Common::kPlatformWindows, ADGF_DEMO | ADGF_UNSTABLE, GUIO4(GUIO_NOASPECT, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
// Shivers 2 - English Windows (from abevi)
// VERSION.TXT Version 1.0 (3/25/97)
@@ -3372,7 +3418,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, GUIO5(GUIO_NOSPEECH, GUIO_NOASPECT, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
+ Common::EN_ANY, Common::kPlatformWindows, ADGF_UNSTABLE, GUIO5(GUIO_NOSPEECH, GUIO_NOASPECT, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
#endif
@@ -3385,7 +3431,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.msg", 0, "1aeafe2b495de288d002109650b66614", 1364},
{"resource.000", 0, "8e10d4f05c1fd9f883384fa38a898489", 377394},
AD_LISTEND},
- Common::EN_ANY, Common::kPlatformDOS, ADGF_DEMO, GUIO3(GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
+ Common::EN_ANY, Common::kPlatformDOS, ADGF_DEMO, GUIO3(GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
// Slater & Charlie Go Camping - English DOS/Windows
{"slater", "", {
@@ -3393,7 +3439,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.map", 0, "21f85414124dc23e54544a5536dc35cd", 4044},
{"resource.msg", 0, "c44f51fb955eae266fecf360ebcd5ad2", 1132},
AD_LISTEND},
- Common::EN_ANY, Common::kPlatformDOS, 0, GUIO3(GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
+ Common::EN_ANY, Common::kPlatformDOS, 0, GUIO3(GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
// Slater & Charlie Go Camping - English DOS/Windows (Sierra Originals)
@@ -3402,14 +3448,14 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.map", 0, "21f85414124dc23e54544a5536dc35cd", 4044},
{"resource.msg", 0, "c44f51fb955eae266fecf360ebcd5ad2", 1132},
AD_LISTEND},
- Common::EN_ANY, Common::kPlatformDOS, 0, GUIO3(GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
+ Common::EN_ANY, Common::kPlatformDOS, 0, GUIO3(GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
// Slater & Charlie Go Camping - English Macintosh
{"slater", "", {
{"Data1", 0, "7243b4390e5f0182d8133fbcae4b50c5", 2298853},
{"Data2", 0, "6b6f18f9b502dc0923eeae0ef47f02d5", 2276956},
AD_LISTEND},
- Common::EN_ANY, Common::kPlatformMacintosh, ADGF_MACRESFORK, GUIO1(GUIO_NONE) },
+ Common::EN_ANY, Common::kPlatformMacintosh, ADGF_MACRESFORK, GUIO1(GUIO_NONE) },
// Space Quest 1 VGA Remake - English Amiga (from www.back2roots.org)
// SCI interpreter version 1.000.510 (just a guess)
@@ -3422,7 +3468,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.004", 0, "b25a1539c71701f7715f738c5037e9a6", 775515},
{"resource.005", 0, "640ffe1a9acde392cc33cc1b1a528328", 806324},
AD_LISTEND},
- Common::EN_ANY, Common::kPlatformAmiga, 0, GUIO4(GUIO_NOSPEECH, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
+ Common::EN_ANY, Common::kPlatformAmiga, 0, GUIO4(GUIO_NOSPEECH, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
// Space Quest 1 VGA Remake - English DOS (from the Space Quest Collection)
// Executable scanning reports "T.A00.081", VERSION file reports "2.000"
@@ -3435,7 +3481,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.003", 0, "c47600e50c6fc591957ae0c5020ee7b8", 1213262},
{"resource.004", 0, "e19ea4ad131472f9238590f2e1d40289", 1203051},
AD_LISTEND},
- Common::EN_ANY, Common::kPlatformDOS, 0, GUIO4(GUIO_NOSPEECH, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
+ Common::EN_ANY, Common::kPlatformDOS, 0, GUIO4(GUIO_NOSPEECH, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
// Space Quest 1 VGA Remake - English Mac (from Fingolfin)
{"sq1sci", "SCI", {
@@ -3446,7 +3492,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.003", 0, "ae46e195e66df5a131917f0aa80b5669", 1242794},
{"resource.004", 0, "91d58a9eb2187c38424990afe4c12bc6", 1250949},
AD_LISTEND},
- Common::EN_ANY, Common::kPlatformMacintosh, 0, GUIO4(GUIO_NOSPEECH, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
+ Common::EN_ANY, Common::kPlatformMacintosh, 0, GUIO4(GUIO_NOSPEECH, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
// Space Quest 1 VGA Remake - English Non-Interactive Demo (from FRG)
// SCI interpreter version 1.000.181
@@ -3454,7 +3500,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.map", 0, "5af709ac5e0e923e0b8174f49978c30e", 636},
{"resource.001", 0, "fd99ea43f57576ded7c86036996346cf", 507642},
AD_LISTEND},
- Common::EN_ANY, Common::kPlatformDOS, ADGF_DEMO, GUIO4(GUIO_NOSPEECH, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
+ Common::EN_ANY, Common::kPlatformDOS, ADGF_DEMO, GUIO4(GUIO_NOSPEECH, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
// Space Quest 1 VGA Remake - Spanish DOS Floppy (from jvprat)
// Executable scanning reports "T.A00.081", VERSION file reports "2.000"
@@ -3468,7 +3514,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.004", 0, "9b78228ad4f9f335fedf74f1812dcfca", 513325},
{"resource.005", 0, "7d4ebcb745c0bf8fc42e4013f52ecd49", 1101812},
AD_LISTEND},
- Common::ES_ESP, Common::kPlatformDOS, 0, GUIO4(GUIO_NOSPEECH, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
+ Common::ES_ESP, Common::kPlatformDOS, 0, GUIO4(GUIO_NOSPEECH, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
// Space Quest I 2.0 EGA DOS (6 x 3.5" disks)
// Provided by ssburnout in bug report #3046805
@@ -3481,7 +3527,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.004", 0, "975c6e81194ae6b65e960a248129ecaa", 684119},
{"resource.005", 0, "13d96f7905637552c0647175ff816145", 695589},
AD_LISTEND},
- Common::EN_ANY, Common::kPlatformDOS, 0, GUIO5(GUIO_NOSPEECH, GAMEOPTION_EGA_UNDITHER, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
+ Common::EN_ANY, Common::kPlatformDOS, 0, GUIO4(GUIO_NOSPEECH, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
// Space Quest 3 - English Amiga (from www.back2roots.org)
// SCI interpreter version 0.000.453 (just a guess)
@@ -3492,7 +3538,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.003", 0, "ceeda7202b96e5c85ecaa88a40a540fc", 746496},
{"resource.004", 0, "ceeda7202b96e5c85ecaa88a40a540fc", 761984},
AD_LISTEND},
- Common::EN_ANY, Common::kPlatformAmiga, 0, GUIO5(GUIO_NOSPEECH, GAMEOPTION_EGA_UNDITHER, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
+ Common::EN_ANY, Common::kPlatformAmiga, 0, GUIO5(GUIO_NOSPEECH, GAMEOPTION_EGA_UNDITHER, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
// Space Quest 3 - German Amiga (also includes english language)
// Executable scanning reports "1.004.006"
@@ -3513,7 +3559,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.map", 0, "ec66ac2b1ce58b2575ba00b65058de1a", 612},
{"resource.001", 0, "ceeda7202b96e5c85ecaa88a40a540fc", 180245},
AD_LISTEND},
- Common::EN_ANY, Common::kPlatformDOS, ADGF_DEMO, GUIO5(GUIO_NOSPEECH, GAMEOPTION_EGA_UNDITHER, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
+ Common::EN_ANY, Common::kPlatformDOS, ADGF_DEMO, GUIO5(GUIO_NOSPEECH, GAMEOPTION_EGA_UNDITHER, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
// Space Quest 3 - English DOS (provided by richiefs in bug report #2670691)
// SCI interpreter version 0.000.453
@@ -3523,7 +3569,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.002", 0, "ceeda7202b96e5c85ecaa88a40a540fc", 720244},
{"resource.003", 0, "ceeda7202b96e5c85ecaa88a40a540fc", 688367},
AD_LISTEND},
- Common::EN_ANY, Common::kPlatformDOS, 0, GUIO5(GUIO_NOSPEECH, GAMEOPTION_EGA_UNDITHER, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
+ Common::EN_ANY, Common::kPlatformDOS, 0, GUIO5(GUIO_NOSPEECH, GAMEOPTION_EGA_UNDITHER, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
// Space Quest 3 - English DOS (from the Space Quest Collection)
// Executable scanning reports "0.000.685", VERSION file reports "1.018"
@@ -3533,7 +3579,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.002", 0, "8b55c4875298f45ea5696a5ee8f6a7fe", 715777},
{"resource.003", 0, "8b55c4875298f45ea5696a5ee8f6a7fe", 703370},
AD_LISTEND},
- Common::EN_ANY, Common::kPlatformDOS, 0, GUIO5(GUIO_NOSPEECH, GAMEOPTION_EGA_UNDITHER, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
+ Common::EN_ANY, Common::kPlatformDOS, 0, GUIO5(GUIO_NOSPEECH, GAMEOPTION_EGA_UNDITHER, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
// Space Quest 3 - English DOS (from abevi, bug report #2612718)
{"sq3", "", {
@@ -3545,7 +3591,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.005", 0, "ceeda7202b96e5c85ecaa88a40a540fc", 328278},
{"resource.006", 0, "ceeda7202b96e5c85ecaa88a40a540fc", 356702},
AD_LISTEND},
- Common::EN_ANY, Common::kPlatformDOS, 0, GUIO5(GUIO_NOSPEECH, GAMEOPTION_EGA_UNDITHER, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
+ Common::EN_ANY, Common::kPlatformDOS, 0, GUIO5(GUIO_NOSPEECH, GAMEOPTION_EGA_UNDITHER, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
// Space Quest 3 - English Mac (from Fingolfin)
{"sq3", "", {
@@ -3554,7 +3600,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.002", 0, "0d8dfe42683b46f3131823233a91ce6a", 794072},
{"resource.003", 0, "0d8dfe42683b46f3131823233a91ce6a", 776536},
AD_LISTEND},
- Common::EN_ANY, Common::kPlatformMacintosh, 0, GUIO5(GUIO_NOSPEECH, GAMEOPTION_EGA_UNDITHER, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
+ Common::EN_ANY, Common::kPlatformMacintosh, 0, GUIO5(GUIO_NOSPEECH, GAMEOPTION_EGA_UNDITHER, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
// Space Quest 3 - German DOS (from Tobis87, also includes english language)
// SCI interpreter version 0.000.453 (?)
@@ -3568,7 +3614,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.006", 0, "9107c2aa5398e28b5c5406df13491f85", 320643},
{"resource.007", 0, "9107c2aa5398e28b5c5406df13491f85", 344287},
AD_LISTEND},
- Common::DE_DEU, Common::kPlatformDOS, ADGF_ADDENGLISH, GUIO5(GUIO_NOSPEECH, GAMEOPTION_EGA_UNDITHER, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
+ Common::DE_DEU, Common::kPlatformDOS, ADGF_ADDENGLISH, GUIO5(GUIO_NOSPEECH, GAMEOPTION_EGA_UNDITHER, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
// Space Quest 3 v1.052 - German DOS (supplied by markcoolio in bug report #2723860, also includes english language)
// Executable scanning reports "S.old.114"
@@ -3578,7 +3624,18 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.002", 0, "9107c2aa5398e28b5c5406df13491f85", 596768},
{"resource.003", 0, "9107c2aa5398e28b5c5406df13491f85", 693573},
AD_LISTEND},
- Common::DE_DEU, Common::kPlatformDOS, ADGF_ADDENGLISH, GUIO4(GUIO_NOSPEECH, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
+ Common::DE_DEU, Common::kPlatformDOS, ADGF_ADDENGLISH, GUIO5(GUIO_NOSPEECH, GAMEOPTION_EGA_UNDITHER, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
+
+ // Space Quest 3 v1.1 (game says 0.016) - English Mac (supplied by misterhands in bug report #6484)
+ // Executable scanning reports "0.024"
+ {"sq3", "", {
+ {"resource.map", 0, "d1574928fc6187f5958d431ac9d8022e", 5844},
+ {"resource.001", 0, "0d8dfe42683b46f3131823233a91ce6a", 771942},
+ {"resource.002", 0, "0d8dfe42683b46f3131823233a91ce6a", 794127},
+ {"resource.003", 0, "0d8dfe42683b46f3131823233a91ce6a", 776554},
+ {"resource.004", 0, "0d8dfe42683b46f3131823233a91ce6a", 787066},
+ AD_LISTEND},
+ Common::EN_ANY, Common::kPlatformMacintosh, 0, GUIO5(GUIO_NOSPEECH, GAMEOPTION_EGA_UNDITHER, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
// Space Quest 4 - English Amiga
// Executable scanning reports "1.004.024"
@@ -3593,7 +3650,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.005", 0, "3540d1cc84d674cf4b2c898b88a3b563", 790296},
{"resource.006", 0, "ade814bc4d56244c156d9e9bcfebbc11", 664085},
AD_LISTEND},
- Common::EN_ANY, Common::kPlatformAmiga, 0, GUIO4(GUIO_NOSPEECH, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
+ Common::EN_ANY, Common::kPlatformAmiga, 0, GUIO4(GUIO_NOSPEECH, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
// Space Quest 4 - German Amiga (from www.back2roots.org, also includes english language)
// SCI interpreter version 1.000.200 (just a guess)
@@ -3607,7 +3664,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, GUIO4(GUIO_NOSPEECH, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
+ Common::DE_DEU, Common::kPlatformAmiga, ADGF_ADDENGLISH, GUIO4(GUIO_NOSPEECH, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
// Space Quest 4 - English DOS - THIS VERSION IS PIRATED/CRACKED AND REPACKAGED =DO NOT RE-ADD=
// Executable scanning reports "1.000.753"
@@ -3616,7 +3673,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.map", 0, "a18088c8aceb06025dbc945f29e02935", 5124},
{"resource.000", 0, "e1f46832cd2458796028e054a0466031", 5502009},
AD_LISTEND},
- Common::EN_ANY, Common::kPlatformDOS, ADGF_PIRATED, GUIO4(GUIO_NOSPEECH, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
+ Common::EN_ANY, Common::kPlatformDOS, ADGF_PIRATED, GUIO4(GUIO_NOSPEECH, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
// Space Quest 4 - English DOS
// Executable scanning reports "1.000.753"
@@ -3625,7 +3682,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.map", 0, "71ccf4f82ac4efb588731acfb7bf2603", 5646},
{"resource.000", 0, "e1f46832cd2458796028e054a0466031", 933928},
AD_LISTEND},
- Common::EN_ANY, Common::kPlatformDOS, 0, GUIO4(GUIO_NOSPEECH, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
+ Common::EN_ANY, Common::kPlatformDOS, 0, GUIO4(GUIO_NOSPEECH, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
// Space Quest 4 1.052 - English DOS Floppy (supplied by markcoolio in bug report #2723865)
// Executable scanning reports "1.000.753"
@@ -3639,7 +3696,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.004", 0, "ff9c87da3bc53473fdee8b9d3edbc93c", 1200631},
{"resource.005", 0, "e33019ac19f755ae33fbf49b4fc9066c", 1053294},
AD_LISTEND},
- Common::EN_ANY, Common::kPlatformDOS, 0, GUIO4(GUIO_NOSPEECH, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
+ Common::EN_ANY, Common::kPlatformDOS, 0, GUIO4(GUIO_NOSPEECH, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
// Space Quest 4 1.000 - French DOS Floppy (supplied by misterhands in bug report #3515247)
{"sq4", "", {
@@ -3652,7 +3709,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.004", 0, "b2cca3afcf2e013b8ce86b64155af766", 1254353},
{"resource.005", 0, "9e520577e035547c4b5149a6d12ef85b", 1098814},
AD_LISTEND},
- Common::FR_FRA, Common::kPlatformDOS, 0, GUIO4(GUIO_NOSPEECH, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
+ Common::FR_FRA, Common::kPlatformDOS, 0, GUIO4(GUIO_NOSPEECH, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
// Space Quest 4 1.000 - English DOS Floppy (from abevi, bug report #2612718)
{"sq4", "", {
@@ -3664,7 +3721,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.004", 0, "c06350184a490c10eb4585fff0aa3192", 1254368},
{"resource.005", 0, "b8d6efbd3235329bfe844c794097b2c9", 1098717},
AD_LISTEND},
- Common::EN_ANY, Common::kPlatformDOS, 0, GUIO4(GUIO_NOSPEECH, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
+ Common::EN_ANY, Common::kPlatformDOS, 0, GUIO4(GUIO_NOSPEECH, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
// Space Quest IV DOS 1.060 EGA (6 x 3.5" disks)
// Supplied by ssburnout in bug report #3046781
@@ -3677,7 +3734,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.004", 0, "9a673e33c3f6dd560b993ffed77eeb49", 534994},
{"resource.005", 0, "3c4841d0a3ebba4404af588c93620c22", 595465},
AD_LISTEND},
- Common::EN_ANY, Common::kPlatformDOS, 0, GUIO5(GUIO_NOSPEECH, GAMEOPTION_EGA_UNDITHER, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
+ Common::EN_ANY, Common::kPlatformDOS, 0, GUIO4(GUIO_NOSPEECH, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
// Space Quest 4 - German DOS (from Tobis87, also includes english language)
// SCI interpreter version 1.000.200 (just a guess)
@@ -3691,7 +3748,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.005", 0, "47ee647b5b12232d27e63cc627c25899", 1156765},
{"resource.006", 0, "dfb023e4e2a1e7a00fa18f9ede72a91b", 924059},
AD_LISTEND},
- Common::DE_DEU, Common::kPlatformDOS, ADGF_ADDENGLISH, GUIO4(GUIO_NOSPEECH, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
+ Common::DE_DEU, Common::kPlatformDOS, ADGF_ADDENGLISH, GUIO4(GUIO_NOSPEECH, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
// Space Quest 4 - Italian DOS Floppy (from glorifindel, also includes english language)
// SCI interpreter version 1.000.200 (just a guess)
@@ -3704,7 +3761,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.004", 0, "4277c61bed40a50dadc4b5a344520af2", 1251000},
{"resource.005", 0, "5f885abd335978e2fd4e5f886d7676c8", 1102880},
AD_LISTEND},
- Common::IT_ITA, Common::kPlatformDOS, ADGF_ADDENGLISH, GUIO4(GUIO_NOSPEECH, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
+ Common::IT_ITA, Common::kPlatformDOS, ADGF_ADDENGLISH, GUIO4(GUIO_NOSPEECH, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
// Space Quest 4 - Japanese PC-98 5.25" Floppy (also includes english language)
// SCI interpreter version 1.000.1068
@@ -3714,7 +3771,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, GUIO5(GUIO_NOSPEECH, GUIO_NOASPECT, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
+ Common::JA_JPN, Common::kPlatformPC98, ADGF_ADDENGLISH, GUIO5(GUIO_NOSPEECH, GUIO_NOASPECT, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
// Space Quest 4 - Japanese PC-98 5.25" Floppy (also includes english language)
// SCI interpreter version 1.000.1068
@@ -3724,7 +3781,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, GUIO5(GUIO_NOSPEECH, GUIO_NOASPECT, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
+ Common::EN_ANY, Common::kPlatformPC98, ADGF_ADDENGLISH, GUIO5(GUIO_NOSPEECH, GUIO_NOASPECT, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
// Space Quest 4 - English DOS CD (from the Space Quest Collection)
// Executable scanning reports "1.001.064", VERSION file reports "1.0"
@@ -3732,7 +3789,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.map", 0, "ed90a8e3ccc53af6633ff6ab58392bae", 7054},
{"resource.000", 0, "63247e3901ab8963d4eece73747832e0", 5157378},
AD_LISTEND},
- Common::EN_ANY, Common::kPlatformDOS, ADGF_CD, GUIO4(GAMEOPTION_SQ4_SILVER_CURSORS, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
+ Common::EN_ANY, Common::kPlatformDOS, ADGF_CD, GUIO4(GAMEOPTION_SQ4_SILVER_CURSORS, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
// Space Quest 4 - English Windows CD (from the Space Quest Collection)
// Executable scanning reports "1.001.064", VERSION file reports "1.0"
@@ -3742,7 +3799,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, GUIO5(GUIO_MIDIGM, GAMEOPTION_SQ4_SILVER_CURSORS, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
+ Common::EN_ANY, Common::kPlatformWindows, ADGF_CD, GUIO5(GUIO_MIDIGM, GAMEOPTION_SQ4_SILVER_CURSORS, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
// Space Quest 4 - English DOS CD patch 1.2 (unofficial - NRS) - THIS VERSION IS PIRATED/CRACKED AND REPACKAGED =DO NOT RE-ADD=
// In essence, this "patch" includes a mixture the CD and floppy versions (the whole game), without the speech file
@@ -3750,7 +3807,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.map", 0, "38287a646458a1dabded55d094407793", 7139},
{"resource.000", 0, "231fd8421e1f211e1bcf9d7b8b6408e7", 9525849},
AD_LISTEND},
- Common::EN_ANY, Common::kPlatformDOS, ADGF_PIRATED, GUIO4(GAMEOPTION_SQ4_SILVER_CURSORS, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
+ Common::EN_ANY, Common::kPlatformDOS, ADGF_PIRATED, GUIO4(GAMEOPTION_SQ4_SILVER_CURSORS, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
// 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"
@@ -3764,7 +3821,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.004", 0, "776fba81c110d1908776232cbe190e20", 1253752},
{"resource.005", 0, "55fae26c2a92f16ef72c1e216e827c0f", 1098328},
AD_LISTEND},
- Common::ES_ESP, Common::kPlatformDOS, ADGF_ADDENGLISH, GUIO4(GAMEOPTION_SQ4_SILVER_CURSORS, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
+ Common::ES_ESP, Common::kPlatformDOS, ADGF_ADDENGLISH, GUIO4(GAMEOPTION_SQ4_SILVER_CURSORS, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
// Space Quest 4 - Spanish DOS Floppy (from jvprat, also includes english language)
// Executable scanning reports "1.SQ4.056", VERSION file reports "1.000"
@@ -3776,7 +3833,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.002", 0, "74c62fa2146ff3b3b2ea2b3fb95b9af9", 1140801},
{"resource.003", 0, "42a307941edeb1a3be31daeb2e4be90b", 1088408},
AD_LISTEND},
- Common::ES_ESP, Common::kPlatformDOS, ADGF_ADDENGLISH, GUIO4(GUIO_NOSPEECH, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
+ Common::ES_ESP, Common::kPlatformDOS, ADGF_ADDENGLISH, GUIO4(GUIO_NOSPEECH, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
// 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"
@@ -3790,7 +3847,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.004", 0, "c06350184a490c10eb4585fff0aa3192", 1254368},
{"resource.005", 0, "b8d6efbd3235329bfe844c794097b2c9", 1098717},
AD_LISTEND},
- Common::DE_DEU, Common::kPlatformDOS, ADGF_ADDENGLISH, GUIO4(GUIO_NOSPEECH, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
+ Common::DE_DEU, Common::kPlatformDOS, ADGF_ADDENGLISH, GUIO4(GUIO_NOSPEECH, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
// Space Quest 4 - English Macintosh
// Executable scanning reports "x.yyy.zzz"
@@ -3805,7 +3862,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.005", 0, "869d16cab6641c80b06f4dcee18f86bc", 1426228},
{"resource.006", 0, "91d23407bc0447a3722fbeb952d7edee", 1402451},
AD_LISTEND},
- Common::EN_ANY, Common::kPlatformMacintosh, 0, GUIO4(GUIO_NOSPEECH, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
+ Common::EN_ANY, Common::kPlatformMacintosh, 0, GUIO4(GUIO_NOSPEECH, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
// Space Quest 4 - Russian DOS
// Executable scanning reports "1.000.753", VERSION file reports "1.994"
@@ -3818,7 +3875,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.004", 0, "2763fe4f0cb74df716ec8b0c464b0988", 1217428},
{"resource.005", 0, "d608713197c5ba1cd8c6ed46299c3069", 1057924},
AD_LISTEND},
- Common::RU_RUS, Common::kPlatformDOS, 0, GUIO4(GUIO_NOSPEECH, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
+ Common::RU_RUS, Common::kPlatformDOS, 0, GUIO4(GUIO_NOSPEECH, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
// Space Quest 5 - English DOS (from the Space Quest Collection)
// Executable scanning reports "1.001.068", VERSION file reports "1.04"
@@ -3827,7 +3884,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.000", 0, "4147edc5045e6d62998018b5614c58ec", 5496486},
{"resource.msg", 0, "bb8ad78793c26bdb3f77498b1d6515a9", 125988},
AD_LISTEND},
- Common::EN_ANY, Common::kPlatformDOS, 0, GUIO4(GUIO_NOSPEECH, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
+ Common::EN_ANY, Common::kPlatformDOS, 0, GUIO4(GUIO_NOSPEECH, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
// Space Quest 5 - English DOS - THIS IS THE UNOFFICIAL BETA VERSION, WHICH IS OBVIOUSLY PIRATED AND CONTAINS MANY BUGS
// refer to http://www.akril15.com/sr/sq5alt/sq5alt.html =DO NOT RE-ADD=
@@ -3836,7 +3893,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.map", 0, "8bde0a9adb9a3e9aaa861826874c9834", 6473},
{"resource.000", 0, "f4a48705764544d7cc64a7bb22a610df", 6025184},
AD_LISTEND},
- Common::EN_ANY, Common::kPlatformDOS, ADGF_PIRATED, GUIO4(GUIO_NOSPEECH, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
+ Common::EN_ANY, Common::kPlatformDOS, ADGF_PIRATED, GUIO4(GUIO_NOSPEECH, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
// 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
@@ -3845,7 +3902,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.000", 0, "4147edc5045e6d62998018b5614c58ec", 5496486},
{"resource.msg", 0, "7c71cfc36153cfe07b450423a51f7e68", 146282},
AD_LISTEND},
- Common::DE_DEU, Common::kPlatformDOS, 0, GUIO4(GUIO_NOSPEECH, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
+ Common::DE_DEU, Common::kPlatformDOS, 0, GUIO4(GUIO_NOSPEECH, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
// Space Quest 5 v1.04 - French DOS (from Hkz, Included in Space Quest Collector's Edition, with chapters I-V)
{"sq5", "", {
@@ -3853,7 +3910,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.000", 0, "4147edc5045e6d62998018b5614c58ec", 5496486},
{"resource.msg", 0, "877c42380320eb1db7dad83ccd261214", 140374},
AD_LISTEND},
- Common::FR_FRA, Common::kPlatformDOS, 0, GUIO4(GUIO_NOSPEECH, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
+ Common::FR_FRA, Common::kPlatformDOS, 0, GUIO4(GUIO_NOSPEECH, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
// Space Quest 5 - Italian DOS Floppy (from glorifindel)
// SCI interpreter version 1.001.068 (just a guess)
@@ -3861,7 +3918,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.000", 0, "5040026519f37199f3616fb1d4704dff", 6047170},
{"resource.map", 0, "5b09168baa2f6e2e22787429b2d72f54", 6492},
AD_LISTEND},
- Common::IT_ITA, Common::kPlatformDOS, 0, GUIO4(GUIO_NOSPEECH, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
+ Common::IT_ITA, Common::kPlatformDOS, 0, GUIO4(GUIO_NOSPEECH, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
// Space Quest 5 - Spanish DOS Floppy (from mirir, bug report #3090664)
{"sq5", "", {
@@ -3869,7 +3926,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.map", 0, "5714a899033bdebf2d61ad333c8c6637", 6492},
{"resource.msg", 0, "46deca7ef9cf057f7d442df98c1a2ae2", 134612},
AD_LISTEND},
- Common::ES_ESP, Common::kPlatformDOS, 0, GUIO4(GUIO_NOSPEECH, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
+ Common::ES_ESP, Common::kPlatformDOS, 0, GUIO4(GUIO_NOSPEECH, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
// Space Quest 5 - Russian DOS
// Executable scanning reports "1.001.068", VERSION file reports "1.994"
@@ -3878,7 +3935,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.000", 0, "6f9ed21e1001526b4137f6703ed476af", 6103778},
{"resource.msg", 0, "0a8931990cd2eac1691602391c68ab85", 147580},
AD_LISTEND},
- Common::RU_RUS, Common::kPlatformDOS, 0, GUIO4(GUIO_NOSPEECH, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
+ Common::RU_RUS, Common::kPlatformDOS, 0, GUIO4(GUIO_NOSPEECH, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
#ifdef ENABLE_SCI32
// Space Quest 6 - English DOS/Win3.11 CD (from the Space Quest Collection)
@@ -3887,7 +3944,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.map", 0, "6dddfa3a8f3a3a513ec9dfdfae955005", 10528},
{"resource.000", 0, "c4259ab7355aead07773397b1052827d", 41150806},
AD_LISTEND},
- Common::EN_ANY, Common::kPlatformDOS, ADGF_CD | ADGF_UNSTABLE, GUIO4(GUIO_NOASPECT, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
+ Common::EN_ANY, Common::kPlatformDOS, ADGF_CD | ADGF_UNSTABLE, GUIO4(GUIO_NOASPECT, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
// Space Quest 6 - English DOS/Win3.11 CD ver 1.11 (from FRG)
// SCI interpreter version 2.100.002 (just a guess)
@@ -3895,7 +3952,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.map", 0, "e0615d6e4e10e37ae42e6a2a95aaf145", 10528},
{"resource.000", 0, "c4259ab7355aead07773397b1052827d", 41150806},
AD_LISTEND},
- Common::EN_ANY, Common::kPlatformDOS, ADGF_CD | ADGF_UNSTABLE, GUIO4(GUIO_NOASPECT, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
+ Common::EN_ANY, Common::kPlatformDOS, ADGF_CD | ADGF_UNSTABLE, GUIO4(GUIO_NOASPECT, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
// 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"
@@ -3903,7 +3960,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.map", 0, "3c831625931d5079b73ae8c275f52c95", 10534},
{"resource.000", 0, "4195ca940f759424f62b90e262cc1737", 40932397},
AD_LISTEND},
- Common::FR_FRA, Common::kPlatformDOS, ADGF_CD | ADGF_UNSTABLE, GUIO4(GUIO_NOASPECT, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
+ Common::FR_FRA, Common::kPlatformDOS, ADGF_CD | ADGF_UNSTABLE, GUIO4(GUIO_NOASPECT, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
// Space Quest 6 - German DOS (from Tobis87, updated info from markcoolio in bug report #2723884)
// SCI interpreter version 2.100.002 (just a guess)
@@ -3911,7 +3968,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.map", 0, "664d797415484f85c90b1b45aedc7686", 10534},
{"resource.000", 0, "ba87ba91e5bdabb4169dd0df75777722", 40933685},
AD_LISTEND},
- Common::DE_DEU, Common::kPlatformDOS, ADGF_CD | ADGF_UNSTABLE, GUIO4(GUIO_NOASPECT, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
+ Common::DE_DEU, Common::kPlatformDOS, ADGF_CD | ADGF_UNSTABLE, GUIO4(GUIO_NOASPECT, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
// Space Quest 6 - English DOS/Win3.11 Interactive Demo (from FRG)
// SCI interpreter version 2.100.002 (just a guess)
@@ -3919,7 +3976,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.map", 0, "368f07b07433db3f819fa3fa0e5efee5", 2572},
{"resource.000", 0, "ab12724e078dea34b624e0d2a38dcd7c", 2272050},
AD_LISTEND},
- Common::EN_ANY, Common::kPlatformDOS, ADGF_DEMO | ADGF_UNSTABLE, GUIO5(GUIO_NOSPEECH, GUIO_NOASPECT, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
+ Common::EN_ANY, Common::kPlatformDOS, ADGF_DEMO | ADGF_UNSTABLE, GUIO5(GUIO_NOSPEECH, GUIO_NOASPECT, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
#endif // ENABLE_SCI32
// The Island of Dr. Brain - English DOS CD (from jvprat)
@@ -3928,7 +3985,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.map", 0, "2388efef8430b041b0f3b00b9050e4a2", 3281},
{"resource.000", 0, "b3acd9b9dd7fe53c4ee133ac9a1acfab", 2103560},
AD_LISTEND},
- Common::EN_ANY, Common::kPlatformDOS, 0, GUIO3(GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
+ Common::EN_ANY, Common::kPlatformDOS, 0, GUIO3(GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
// The Island of Dr. Brain - English DOS (from Quietust)
// Executable scanning reports "1.001.053", VERSION file reports "1.1 2.3.93"
@@ -3936,7 +3993,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.map", 0, "3c07da06bdd1689f9d07af78fb94d0ec", 3101},
{"resource.000", 0, "ecc686e0034fb4d41de077ac7167b3cf", 1947866},
AD_LISTEND},
- Common::EN_ANY, Common::kPlatformDOS, 0, GUIO4(GUIO_NOSPEECH, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
+ Common::EN_ANY, Common::kPlatformDOS, 0, GUIO4(GUIO_NOSPEECH, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
// The Island of Dr. Brain - English DOS Non-Interactive Demo
// SCI interpreter version 1.001.053 (just a guess)
@@ -3944,7 +4001,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resource.map", 0, "a8e5ca8ed1996974afa59f4c45e06195", 986},
{"resource.000", 0, "b3acd9b9dd7fe53c4ee133ac9a1acfab", 586560},
AD_LISTEND},
- Common::EN_ANY, Common::kPlatformDOS, ADGF_DEMO, GUIO4(GUIO_NOSPEECH, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
+ Common::EN_ANY, Common::kPlatformDOS, ADGF_DEMO, GUIO4(GUIO_NOSPEECH, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
#ifdef ENABLE_SCI32
// Torin's Passage - English Windows Interactive Demo
@@ -3953,7 +4010,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, GUIO4(GUIO_NOASPECT, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
+ Common::EN_ANY, Common::kPlatformWindows, ADGF_DEMO | ADGF_UNSTABLE, GUIO4(GUIO_NOASPECT, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
// Torin's Passage (Multilingual) - English Windows CD
// SCI interpreter version 2.100.002
@@ -3961,7 +4018,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, GUIO4(GUIO_NOASPECT, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
+ Common::EN_ANY, Common::kPlatformWindows, ADGF_UNSTABLE, GUIO4(GUIO_NOASPECT, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
// Torin's Passage (Multilingual) - Spanish Windows CD (from jvprat)
// Executable scanning reports "2.100.002", VERSION file reports "1.0"
@@ -3970,7 +4027,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, GUIO4(GUIO_NOASPECT, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
+ Common::ES_ESP, Common::kPlatformWindows, ADGF_UNSTABLE, GUIO4(GUIO_NOASPECT, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
// Torin's Passage (Multilingual) - French Windows CD
// SCI interpreter version 2.100.002
@@ -3978,7 +4035,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, GUIO4(GUIO_NOASPECT, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
+ Common::FR_FRA, Common::kPlatformWindows, ADGF_UNSTABLE, GUIO4(GUIO_NOASPECT, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
// Torin's Passage (Multilingual) - German Windows CD
// SCI interpreter version 2.100.002
@@ -3986,7 +4043,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, GUIO4(GUIO_NOASPECT, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
+ Common::DE_DEU, Common::kPlatformWindows, ADGF_UNSTABLE, GUIO4(GUIO_NOASPECT, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
// Torin's Passage (Multilingual) - Italian Windows CD (from glorifindel)
// SCI interpreter version 2.100.002
@@ -3994,7 +4051,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, GUIO4(GUIO_NOASPECT, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
+ Common::IT_ITA, Common::kPlatformWindows, ADGF_UNSTABLE, GUIO4(GUIO_NOASPECT, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
// Torin's Passage - French Windows (from LePhilousophe)
// SCI interpreter version 2.100.002
@@ -4002,16 +4059,30 @@ static const struct ADGameDescription SciGameDescriptions[] = {
{"resmap.000", 0, "66ed46e3e56f487e688d52f05b33d0ba", 9787},
{"ressci.000", 0, "118f9bec04bfe17c4f87bbb5ddb43c18", 56126981},
AD_LISTEND},
- Common::FR_FRA, Common::kPlatformWindows, ADGF_UNSTABLE, GUIO4(GUIO_NOASPECT, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
+ Common::FR_FRA, Common::kPlatformWindows, ADGF_UNSTABLE, GUIO4(GUIO_NOASPECT, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
+
+ // Torin's Passage - English Macintosh
+ {"torin", "", {
+ {"Data1", 0, "63887e33cc282c92dc1f916f54aea8eb", 700786},
+ {"Data2", 0, "da2f13be2819a7333fee372d38b8d1a2", 122485},
+ {"Data3", 0, "e9fda4f1714ddb443545ba8a2d58ef18", 7299126},
+ {"Data4", 0, "59b432ec35b24a216432a556e25087ef", 7209309},
+ {"Data5", 0, "189e809f24aee83c707dea03a543c7c4", 6615563},
+ {"Data6", 0, "b639487c83d1dae0e001e700f3631566", 7594881},
+ {"Data7", 0, "2afd9b5434102b89610916b904c3f73a", 7627374},
+ AD_LISTEND},
+ Common::EN_ANY, Common::kPlatformMacintosh, ADGF_MACRESFORK | ADGF_UNSTABLE, GUIO4(GUIO_NOASPECT, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) },
#endif // ENABLE_SCI32
// SCI Fanmade Games
+ FANMADE("120 Degrees Below Zero", "57f6135bd073802215c9b97f32d6aea3", 504, "03adf530a34557dfc20f848c9572f4d0", 320749),
FANMADE("Al Pond: Island Quest 2", "4cba6a5a4c8f66f21935ed78b0511a92", 870, "876587dc9a5ec569287a3dc4b29139d8", 613769),
FANMADE("Al Pond 2: Island Quest", "9625372e710d1a95d2027b48f9e325af", 1506, "a0f9aa65b9bf3d8703adff5a621f243c", 889843),
FANMADE("Al Pond 2: Island Quest (Updated)", "64be277cdcc6aafce7d9f26e88ad31a8", 1500, "571547228a212d63315f0c114cf48d54", 885241),
FANMADE("Another DG Game: I Want My C64 Back", "4a8ca7ca2abd18899ef856f47665e2e9", 588, "12ff558d20c72e42cc6adb408f34d6d8", 150513),
FANMADE_L("Another DG Game: I Want My C64 Back", "13dc1d9ebc57daf8895412eee5e39fea", 576, "e2ad60b3a280171429db5c85f158f84a", 141697, Common::FR_FRA),
FANMADE("Aquarius: An Aquatic Experience", "2e23bc3b82f22a454be202ea593fb478", 480, "01555c8de683d25405bda270aa1ff014", 272372),
+ FANMADE("Betrayed Alliance", "b1f43f496a83cb8503f290a838b26242", 4062, "e637255aae6191ee92b9e843ad276288", 2367197),
FANMADE("Bluntman and Chronic (Politically Correct Version)", "c3ef9fa6c7c5fb840078bf28d87c7f8b", 1362, "441636a9f6f86710844868fded868ee7", 596688),
FANMADE("Cascade Quest", "c94efc10d18c040b6e22a1dc6d3adfe1", 3468, "8ada33dfa945f81531e5508240b573de", 1432195),
FANMADE("Circus Quest", "35871f6b4e1df56af4113c0203a0b223", 630, "7d6f97d7935d8733f488d4cb74315e5b", 279627),
@@ -4019,26 +4090,40 @@ static const struct ADGameDescription SciGameDescriptions[] = {
FANMADE("Curt's Quest 1.1", "54084c29346683296e45ef32d7ae74f3", 1128, "c851182cdf6fc6a81b840f4d4875f1a0", 302000),
FANMADE("Demo Quest", "c89a0c9e0a4e4af0ecedb300a3b31dbf", 384, "a32f3495ba24764cba091119cc3f1e13", 160098),
FANMADE("Dr. Jummybummy's Space Adventure 2", "6ae6cb7de423f51736d9487b4ca0c6da", 810, "26e5b563f578e104d79689f36568b7cf", 394670),
+ FANMADE("Edy Oliver into the Cave of Whistling Skulls Demo", "eba0a0e86768ee3f14e78fecbc5af011", 2388, "4f6eab79a0f7980960eed101ab8122ad", 2601551),
+ FANMADE("Footsteps Sound Demo", "d9dabee6e1550b1fdb793f442f227738", 372, "06561df40dea49c6e84184e0ba6f19cb", 114212),
FANMADE_L("Grostesteing: Plus Mechant que Jamais", "ec9a97ccb134f69249f6ea8b16c13d8e", 1500, "b869f5f11bfe2ab5f67f4f0c618f2ce1", 464657, Common::FR_FRA), // FIXME: Accent
FANMADE("Humanoid Demo", "97d8331293a6d57e8bad58c1efc89a63", 624, "fb354b9abe64011b12159e45d724633f", 452320),
+ FANMADE("Island of Secrets Demo 0.3", "61279176c3e4530fec9b578877aecda7", 504, "7f4ed7a81b86bea22c62bc98e6d9ec39", 197790),
FANMADE("Jim’s Quest 1: The Phantom Thesis", "0af50be1d3f0cb77a09137709a76ef4f", 960, "9c042c136548b20d9183495668e03526", 496446),
+ FANMADE("King's Quest II SCI Pre-Alpha Version", "cdea1c081022e7697a1afffb1d2f9f6a", 2646, "fb2ce39002c3e05f3d83533638dea105", 2310356),
FANMADE("Knight's Quest Demo 1.0", "5e816edf993956752ed06fccfeeae6d9", 1260, "959321f88a22905fa1f8c6d897874744", 703836),
FANMADE("LockerGnome Quest", "3eeff9130206cad0c4e1551e2b9dd2c5", 420, "ae05ca90806fd90cc43f147c82d3547c", 158906),
+ FANMADE("LockerGnome Quest Redux", "55b0081dbdd77a07807c76cec3606970", 492, "75c9c5e8a475a7b5f1a6cb18edad67f2", 168069),
FANMADE("New Year's Mystery", "e4dcab1b1d3cb4a2c070a07a9c9589e0", 708, "e00ca5e44fd4e98d8174b467b31b0f21", 295425),
FANMADE("New Year's Mystery (Updated)", "efd1beb5120293725065c95959144f81", 714, "b3bd3c2372ed6efa28adb12403c4c31a", 305027),
FANMADE("Ocean Battle", "c2304a0568e0eb84f8e9a0915f01170a", 408, "46c520c1ac9b63528854d0f58c7e1b74", 142234),
FANMADE("Osama", "db8f1710453cfbecf4214b2946970043", 390, "7afd75d4620dedf97a84ae8f0a7523cf", 123827),
FANMADE("Quest for the Cheat", "a359d4cf27f98264b42b55c017671214", 882, "8a943029f73c4bc85d454b7f473455ba", 455209),
+ FANMADE("Robust Parse Demo 1.2", "c956d40b6eb42292ec328c510acb11d8", 540, "26f092bab5ec4490737d8463fd3ebbd5", 229044),
FANMADE("SCI Capture the Flag", "4cd679a51d93b8b27c6b38d81be24b8b", 432, "98ae1f6ed7b4c21f88addbf643dd1d2f", 147878),
FANMADE("SCI Companion Template", "ad54d4f504086cd597aa2348d0aa3b09", 354, "6798b7b601ce8154c1d1bc0f0edcdd18", 113061),
+ FANMADE("SCI Logging Demo", "615c30c1445ea9349847e8868312a674", 558, "2df6858526177612ef9473e7af5b31c6", 171012),
+#if 0
+ // Disabled as this requires network access to the Google Translate API, which is not available as OSystem has no network API.
+ FANMADE("SCI Narration Demo", "731f4f2b726a13c153380af08da16591", 360, "38c80558fb942e8568f011d4a1a4af59", 109789),
+#endif
FANMADE("SCI Programming April 2010 Competition Template", "36e5c4011dd7c92e1ae4c6fede7d698d", 456, "20c87fbb7f73e2a3eb2c5dfab4d76b5a", 142221),
FANMADE("SCI Studio Template 3.0", "ca0dc8d586e0a8670b7621cde090b532", 354, "58a48ee692a86c0575e6bd0b00a92b9a", 113097),
FANMADE("SCI Quest", "9067e1f1e54436d2dbfce855524bc84a", 552, "ffa7d355cd9223f245289108a696bcd2", 149634),
FANMADE("SCI-Man", "3ab85bd39a86c11f85781764f9db09bb", 468, "bb8f9992f504a242bf0860e3588e150b", 131810),
- FANMADE("The Black Cauldron", "5e1ff2833c7f33ebcfa456ba836e2067", 2592, "2f8e6264d2db91bb54982ab8aa18b3b4", 1881839),
+ FANMADE("Text Views Demo", "ad0485a96470566517f184ff5dd049f8", 372, "727b946b37588ed334737732c55007c4", 115788),
+ FANMADE("The Black Cauldron Demo", "5e1ff2833c7f33ebcfa456ba836e2067", 2592, "2f8e6264d2db91bb54982ab8aa18b3b4", 1881839),
+ FANMADE("The Black Cauldron Final", "cbb4705f0cd73760996e5b27aae54f6a", 2484, "fc3bcaa7783b91bb78faefa345c6b3d9", 1677293),
FANMADE("The Farm Nightmare", "fb6cbfddaa7c055e2c3d8cf4c683a7db", 906, "50655e8b8925f717e698e08f006f40be", 338303),
FANMADE("The Gem Scenario", "ef5f61f4d2c6d31122d3e2baf89ad976", 642, "2f16be390dd90c3d7ca1c8a594ac0bfa", 244794),
FANMADE("The Legend of the Lost Jewel", "ba1bca315e3818c5626eda51bcfbcccf", 636, "9b0736d69924af0cff32a0f78db96855", 300398),
+ FANMADE("Winter Wonderland", "c1ffaf8327462effd4ad21eeed9eea59", 504, "5d48666dc62f90d852a1d0de6e69195f", 305076),
// FIXME: The vga demo does not have a resource.000/001 file.
//FANMADE_V("SCI VGA Demo", "00b1abd87bad356b90fcdfcb6132c26f", 8, "", 0, 0),
diff --git a/engines/sci/engine/features.cpp b/engines/sci/engine/features.cpp
index c26c787fbd..31e7ca4931 100644
--- a/engines/sci/engine/features.cpp
+++ b/engines/sci/engine/features.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/sci/engine/features.h b/engines/sci/engine/features.h
index f6bb0b5759..a4d715fee0 100644
--- a/engines/sci/engine/features.h
+++ b/engines/sci/engine/features.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/sci/engine/file.cpp b/engines/sci/engine/file.cpp
index 3dc042389e..2ba7d15ac0 100644
--- a/engines/sci/engine/file.cpp
+++ b/engines/sci/engine/file.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/sci/engine/file.h b/engines/sci/engine/file.h
index 1c8e302d15..052eb735e9 100644
--- a/engines/sci/engine/file.h
+++ b/engines/sci/engine/file.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/sci/engine/gc.cpp b/engines/sci/engine/gc.cpp
index 9a30ff3e17..70c8c52bf0 100644
--- a/engines/sci/engine/gc.cpp
+++ b/engines/sci/engine/gc.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/sci/engine/gc.h b/engines/sci/engine/gc.h
index 9e02bbd0bd..fbaad14b00 100644
--- a/engines/sci/engine/gc.h
+++ b/engines/sci/engine/gc.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/sci/engine/kernel.cpp b/engines/sci/engine/kernel.cpp
index 8d55790ad2..2b16bb3d99 100644
--- a/engines/sci/engine/kernel.cpp
+++ b/engines/sci/engine/kernel.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -35,8 +35,6 @@ namespace Sci {
Kernel::Kernel(ResourceManager *resMan, SegManager *segMan)
: _resMan(resMan), _segMan(segMan), _invalid("<invalid>") {
- loadSelectorNames();
- mapSelectors(); // Map a few special selectors for later use
}
Kernel::~Kernel() {
@@ -53,6 +51,11 @@ Kernel::~Kernel() {
}
}
+void Kernel::init() {
+ loadSelectorNames();
+ mapSelectors(); // Map a few special selectors for later use
+}
+
uint Kernel::getSelectorNamesSize() const {
return _selectorNames.size();
}
@@ -104,6 +107,11 @@ int Kernel::findSelector(const char *selectorName) const {
return -1;
}
+// used by Script patcher to figure out, if it's okay to initialize signature/patch-table
+bool Kernel::selectorNamesAvailable() {
+ return !_selectorNames.empty();
+}
+
void Kernel::loadSelectorNames() {
Resource *r = _resMan->findResource(ResourceId(kResourceTypeVocab, VOCAB_RESOURCE_SELECTORS), 0);
bool oldScriptHeader = (getSciVersion() == SCI_VERSION_0_EARLY);
diff --git a/engines/sci/engine/kernel.h b/engines/sci/engine/kernel.h
index 8a021073fc..dddf845222 100644
--- a/engines/sci/engine/kernel.h
+++ b/engines/sci/engine/kernel.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -145,6 +145,8 @@ public:
*/
Kernel(ResourceManager *resMan, SegManager *segMan);
~Kernel();
+
+ void init();
uint getSelectorNamesSize() const;
const Common::String &getSelectorName(uint selector);
@@ -159,6 +161,8 @@ public:
* @return The appropriate selector ID, or -1 on error
*/
int findSelector(const char *selectorName) const;
+
+ bool selectorNamesAvailable();
// Script dissection/dumping functions
void dissectScript(int scriptNumber, Vocabulary *vocab);
diff --git a/engines/sci/engine/kernel_tables.h b/engines/sci/engine/kernel_tables.h
index d7858180f1..fc46d16b8d 100644
--- a/engines/sci/engine/kernel_tables.h
+++ b/engines/sci/engine/kernel_tables.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -331,7 +331,7 @@ static SciKernelMapEntry s_kernelMap[] = {
{ MAP_CALL(Clone), SIG_EVERYWHERE, "o", NULL, NULL },
{ MAP_CALL(CoordPri), SIG_EVERYWHERE, "i(i)", NULL, NULL },
{ MAP_CALL(CosDiv), SIG_EVERYWHERE, "ii", NULL, NULL },
- { MAP_CALL(DeleteKey), SIG_EVERYWHERE, "l.", NULL, NULL },
+ { MAP_CALL(DeleteKey), SIG_EVERYWHERE, "l.", NULL, kDeleteKey_workarounds },
{ MAP_CALL(DeviceInfo), SIG_EVERYWHERE, "i(r)(r)(i)", NULL, kDeviceInfo_workarounds }, // subop
{ MAP_CALL(Display), SIG_EVERYWHERE, "[ir]([ir!]*)", NULL, kDisplay_workarounds },
// ^ we allow invalid references here, because kDisplay gets called with those in e.g. pq3 during intro
@@ -421,7 +421,7 @@ static SciKernelMapEntry s_kernelMap[] = {
{ MAP_CALL(PrevNode), SIG_EVERYWHERE, "n", NULL, NULL },
{ MAP_CALL(PriCoord), SIG_EVERYWHERE, "i", NULL, NULL },
{ MAP_CALL(Random), SIG_EVERYWHERE, "i(i)(i)", NULL, NULL },
- { MAP_CALL(ReadNumber), SIG_EVERYWHERE, "r", NULL, NULL },
+ { MAP_CALL(ReadNumber), SIG_EVERYWHERE, "r", NULL, kReadNumber_workarounds },
{ MAP_CALL(RemapColors), SIG_SCI11, SIGFOR_ALL, "i(i)(i)(i)(i)", NULL, NULL },
#ifdef ENABLE_SCI32
{ "RemapColors", kRemapColors32, SIG_SCI32, SIGFOR_ALL, "i(i)(i)(i)(i)(i)", NULL, NULL },
@@ -431,7 +431,7 @@ static SciKernelMapEntry s_kernelMap[] = {
{ MAP_CALL(RestartGame), SIG_EVERYWHERE, "", NULL, NULL },
{ MAP_CALL(RestoreGame), SIG_EVERYWHERE, "[r0]i[r0]", NULL, NULL },
{ MAP_CALL(Said), SIG_EVERYWHERE, "[r0]", NULL, NULL },
- { MAP_CALL(SaveGame), SIG_EVERYWHERE, "[r0]i[r0](r)", NULL, NULL },
+ { MAP_CALL(SaveGame), SIG_EVERYWHERE, "[r0]i[r0](r0)", NULL, NULL },
{ MAP_CALL(ScriptID), SIG_EVERYWHERE, "[io](i)", NULL, NULL },
{ MAP_CALL(SetCursor), SIG_SCI21, SIGFOR_ALL, "i(i)([io])(i*)", NULL, NULL },
// TODO: SCI2.1 may supply an object optionally (mother goose sci21 right on startup) - find out why
@@ -454,7 +454,7 @@ static SciKernelMapEntry s_kernelMap[] = {
{ MAP_CALL(StrAt), SIG_EVERYWHERE, "ri(i)", NULL, kStrAt_workarounds },
{ MAP_CALL(StrCat), SIG_EVERYWHERE, "rr", NULL, NULL },
{ MAP_CALL(StrCmp), SIG_EVERYWHERE, "rr(i)", NULL, NULL },
- { MAP_CALL(StrCpy), SIG_EVERYWHERE, "r[r0](i)", NULL, NULL },
+ { MAP_CALL(StrCpy), SIG_EVERYWHERE, "r[r0](i)", NULL, kStrCpy_workarounds },
{ MAP_CALL(StrEnd), SIG_EVERYWHERE, "r", NULL, NULL },
{ MAP_CALL(StrLen), SIG_EVERYWHERE, "[r0]", NULL, kStrLen_workarounds },
{ MAP_CALL(StrSplit), SIG_EVERYWHERE, "rr[r0]", NULL, NULL },
diff --git a/engines/sci/engine/kevent.cpp b/engines/sci/engine/kevent.cpp
index 11ef18c0c2..cb81da2279 100644
--- a/engines/sci/engine/kevent.cpp
+++ b/engines/sci/engine/kevent.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -126,7 +126,7 @@ reg_t kGetEvent(EngineState *s, int argc, reg_t *argv) {
// track left buttton clicks, if requested
if (curEvent.type == SCI_EVENT_MOUSE_PRESS && curEvent.data == 1 && g_debug_track_mouse_clicks) {
- g_sci->getSciDebugger()->DebugPrintf("Mouse clicked at %d, %d\n",
+ g_sci->getSciDebugger()->debugPrintf("Mouse clicked at %d, %d\n",
mousePos.x, mousePos.y);
}
@@ -163,20 +163,20 @@ reg_t kGetEvent(EngineState *s, int argc, reg_t *argv) {
// A SCI event occurred, and we have been asked to stop, so open the debug console
Console *con = g_sci->getSciDebugger();
- con->DebugPrintf("SCI event occurred: ");
+ con->debugPrintf("SCI event occurred: ");
switch (curEvent.type) {
case SCI_EVENT_QUIT:
- con->DebugPrintf("quit event\n");
+ con->debugPrintf("quit event\n");
break;
case SCI_EVENT_KEYBOARD:
- con->DebugPrintf("keyboard event\n");
+ con->debugPrintf("keyboard event\n");
break;
case SCI_EVENT_MOUSE_RELEASE:
case SCI_EVENT_MOUSE_PRESS:
- con->DebugPrintf("mouse click event\n");
+ con->debugPrintf("mouse click event\n");
break;
default:
- con->DebugPrintf("unknown or no event (event type %d)\n", curEvent.type);
+ con->debugPrintf("unknown or no event (event type %d)\n", curEvent.type);
}
con->attach();
diff --git a/engines/sci/engine/kfile.cpp b/engines/sci/engine/kfile.cpp
index c6635f2f27..61fb717567 100644
--- a/engines/sci/engine/kfile.cpp
+++ b/engines/sci/engine/kfile.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -37,6 +37,7 @@
#include "sci/engine/state.h"
#include "sci/engine/kernel.h"
#include "sci/engine/savegame.h"
+#include "sci/sound/audio.h"
#include "sci/console.h"
namespace Sci {
@@ -494,6 +495,21 @@ reg_t kFileIOWriteString(EngineState *s, int argc, reg_t *argv) {
Common::String str = s->_segMan->getString(argv[1]);
debugC(kDebugLevelFile, "kFileIO(writeString): %d", handle);
+ // Handle sciAudio calls in fanmade games here. sciAudio is an
+ // external .NET library for playing MP3 files in fanmade games.
+ // It runs in the background, and obtains sound commands from the
+ // currently running game via text files (called "conductor files").
+ // We skip creating these files, and instead handle the calls
+ // directly. Since the sciAudio calls are only creating text files,
+ // this is probably the most straightforward place to handle them.
+ if (handle == 0xFFFF && str.hasPrefix("(sciAudio")) {
+ Common::List<ExecStack>::const_iterator iter = s->_executionStack.reverse_begin();
+ iter--; // sciAudio
+ iter--; // sciAudio child
+ g_sci->_audio->handleFanmadeSciAudio(iter->sendp, s->_segMan);
+ return NULL_REG;
+ }
+
#ifdef ENABLE_SCI32
if (handle == VIRTUALFILE_HANDLE) {
s->_virtualIndexFile->write(str.c_str(), str.size());
@@ -718,7 +734,7 @@ reg_t kSave(EngineState *s, int argc, reg_t *argv) {
reg_t kSaveGame(EngineState *s, int argc, reg_t *argv) {
Common::String game_id;
- int16 virtualId = argv[1].toSint16();
+ int16 virtualId = argv[1].toSint16();
int16 savegameId = -1;
Common::String game_description;
Common::String version;
@@ -743,11 +759,11 @@ reg_t kSaveGame(EngineState *s, int argc, reg_t *argv) {
savegameId = dialog->runModalWithCurrentTarget();
game_description = dialog->getResultString();
if (game_description.empty()) {
- // create our own description for the saved game, the user didnt enter it
+ // create our own description for the saved game, the user didn't enter it
game_description = dialog->createDefaultSaveDescription(savegameId);
}
delete dialog;
- g_sci->_soundCmd->pauseAll(false); // unpause music ( we can't have it paused during save)
+ g_sci->_soundCmd->pauseAll(false); // unpause music (we can't have it paused during save)
if (savegameId < 0)
return NULL_REG;
@@ -849,8 +865,6 @@ reg_t kRestoreGame(EngineState *s, int argc, reg_t *argv) {
}
// don't adjust ID of the saved game, it's already correct
} else {
- if (argv[2].isNull())
- error("kRestoreGame: called with parameter 2 being NULL");
if (g_sci->getGameId() == GID_JONES) {
// Jones has one save slot only
savegameId = 0;
@@ -879,16 +893,28 @@ reg_t kRestoreGame(EngineState *s, int argc, reg_t *argv) {
in = saveFileMan->openForLoading(filename);
if (in) {
// found a savegame file
-
gamestate_restore(s, in);
delete in;
- if (g_sci->getGameId() == GID_MOTHERGOOSE256) {
+ switch (g_sci->getGameId()) {
+ case GID_MOTHERGOOSE:
+ // WORKAROUND: Mother Goose SCI0
+ // Script 200 / rm200::newRoom will set global C5h directly right after creating a child to the
+ // current number of children plus 1.
+ // We can't trust that global, that's why we set the actual savedgame id right here directly after
+ // restoring a saved game.
+ // If we didn't, the game would always save to a new slot
+ s->variables[VAR_GLOBAL][0xC5].setOffset(SAVEGAMEID_OFFICIALRANGE_START + savegameId);
+ break;
+ case GID_MOTHERGOOSE256:
// WORKAROUND: Mother Goose SCI1/SCI1.1 does some weird things for
// saving a previously restored game.
// We set the current savedgame-id directly and remove the script
// code concerning this via script patch.
s->variables[VAR_GLOBAL][0xB3].setOffset(SAVEGAMEID_OFFICIALRANGE_START + savegameId);
+ break;
+ default:
+ break;
}
} else {
s->r_acc = TRUE_REG;
diff --git a/engines/sci/engine/kgraphics.cpp b/engines/sci/engine/kgraphics.cpp
index e4b3028bcd..c2089bcd4d 100644
--- a/engines/sci/engine/kgraphics.cpp
+++ b/engines/sci/engine/kgraphics.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -185,7 +185,8 @@ static reg_t kSetCursorSci11(EngineState *s, int argc, reg_t *argv) {
hotspot = new Common::Point(argv[3].toSint16(), argv[4].toSint16());
// Fallthrough
case 3:
- if (g_sci->getPlatform() == Common::kPlatformMacintosh) {
+ if (g_sci->getPlatform() == Common::kPlatformMacintosh && g_sci->getGameId() != GID_TORIN) {
+ // Torin Mac seems to be the only game that uses view cursors
delete hotspot; // Mac cursors have their own hotspot, so ignore any we get here
g_sci->_gfxCursor->kernelSetMacCursor(argv[0].toUint16(), argv[1].toUint16(), argv[2].toUint16());
} else {
diff --git a/engines/sci/engine/kgraphics32.cpp b/engines/sci/engine/kgraphics32.cpp
index cd735d1233..8953f45266 100644
--- a/engines/sci/engine/kgraphics32.cpp
+++ b/engines/sci/engine/kgraphics32.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -142,7 +142,15 @@ reg_t kIsOnMe(EngineState *s, int argc, reg_t *argv) {
uint16 y = argv[1].toUint16();
reg_t targetObject = argv[2];
uint16 illegalBits = argv[3].getOffset();
- Common::Rect nsRect = g_sci->_gfxCompare->getNSRect(targetObject, true);
+ Common::Rect nsRect = g_sci->_gfxCompare->getNSRect(targetObject);
+
+ uint16 itemX = readSelectorValue(s->_segMan, targetObject, SELECTOR(x));
+ uint16 itemY = readSelectorValue(s->_segMan, targetObject, SELECTOR(y));
+ // If top and left are negative, we need to adjust coordinates by the item's x and y
+ if (nsRect.left < 0)
+ nsRect.translate(itemX, 0);
+ if (nsRect.top < 0)
+ nsRect.translate(0, itemY);
// we assume that x, y are local coordinates
diff --git a/engines/sci/engine/klists.cpp b/engines/sci/engine/klists.cpp
index 7e6c112b9f..66590da23f 100644
--- a/engines/sci/engine/klists.cpp
+++ b/engines/sci/engine/klists.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/sci/engine/kmath.cpp b/engines/sci/engine/kmath.cpp
index b2aaa01b45..15bc24e0e3 100644
--- a/engines/sci/engine/kmath.cpp
+++ b/engines/sci/engine/kmath.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/sci/engine/kmenu.cpp b/engines/sci/engine/kmenu.cpp
index 05ba7005d7..8dca7f74df 100644
--- a/engines/sci/engine/kmenu.cpp
+++ b/engines/sci/engine/kmenu.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/sci/engine/kmisc.cpp b/engines/sci/engine/kmisc.cpp
index 8b7fc4ffec..448e641b63 100644
--- a/engines/sci/engine/kmisc.cpp
+++ b/engines/sci/engine/kmisc.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -244,7 +244,8 @@ reg_t kGetTime(EngineState *s, int argc, reg_t *argv) {
debugC(kDebugLevelTime, "GetTime(24h) returns %d", retval);
break;
case KGETTIME_DATE :
- retval = loc_time.tm_mday | ((loc_time.tm_mon + 1) << 5) | (((loc_time.tm_year + 1900) & 0x7f) << 9);
+ // Year since 1980 (0 = 1980, 1 = 1981, etc.)
+ retval = loc_time.tm_mday | ((loc_time.tm_mon + 1) << 5) | (((loc_time.tm_year - 80) & 0x7f) << 9);
debugC(kDebugLevelTime, "GetTime(date) returns %d", retval);
break;
default:
diff --git a/engines/sci/engine/kmovement.cpp b/engines/sci/engine/kmovement.cpp
index 649a1428a0..51d49eea9f 100644
--- a/engines/sci/engine/kmovement.cpp
+++ b/engines/sci/engine/kmovement.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/sci/engine/kparse.cpp b/engines/sci/engine/kparse.cpp
index 5e861daaa4..aa89b963cc 100644
--- a/engines/sci/engine/kparse.cpp
+++ b/engines/sci/engine/kparse.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/sci/engine/kpathing.cpp b/engines/sci/engine/kpathing.cpp
index 3c223bebbe..67d814b86f 100644
--- a/engines/sci/engine/kpathing.cpp
+++ b/engines/sci/engine/kpathing.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -1921,7 +1921,7 @@ static int intersectDir(const Vertex *v1, const Vertex *v2) {
// Direction of edge in degrees from pos. x-axis, between -180 and 180
static int edgeDir(const Vertex *v) {
Common::Point p = v->_next->v - v->v;
- int deg = (int)Common::rad2deg(atan2((double)p.y, (double)p.x));
+ int deg = (int)Common::rad2deg((float)atan2((double)p.y, (double)p.x));
if (deg < -180) deg += 360;
if (deg > 180) deg -= 360;
return deg;
diff --git a/engines/sci/engine/kscripts.cpp b/engines/sci/engine/kscripts.cpp
index 2c115be500..5c271780dd 100644
--- a/engines/sci/engine/kscripts.cpp
+++ b/engines/sci/engine/kscripts.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/sci/engine/ksound.cpp b/engines/sci/engine/ksound.cpp
index 2879b7f45d..6a1708d21a 100644
--- a/engines/sci/engine/ksound.cpp
+++ b/engines/sci/engine/ksound.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/sci/engine/kstring.cpp b/engines/sci/engine/kstring.cpp
index d72b1d1772..56dad583e4 100644
--- a/engines/sci/engine/kstring.cpp
+++ b/engines/sci/engine/kstring.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/sci/engine/kvideo.cpp b/engines/sci/engine/kvideo.cpp
index 3964ccc1f8..319469cb08 100644
--- a/engines/sci/engine/kvideo.cpp
+++ b/engines/sci/engine/kvideo.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/sci/engine/message.cpp b/engines/sci/engine/message.cpp
index 8c5741f8b0..640175b20a 100644
--- a/engines/sci/engine/message.cpp
+++ b/engines/sci/engine/message.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/sci/engine/message.h b/engines/sci/engine/message.h
index 5bead82efe..ff76534d2d 100644
--- a/engines/sci/engine/message.h
+++ b/engines/sci/engine/message.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/sci/engine/object.cpp b/engines/sci/engine/object.cpp
index b28026b71f..eeff45163d 100644
--- a/engines/sci/engine/object.cpp
+++ b/engines/sci/engine/object.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -175,6 +175,7 @@ bool Object::initBaseObject(SegManager *segMan, reg_t addr, bool doInitSuperClas
_variables.resize(baseObj->getVarCount());
// Copy base from species class, as we need its selector IDs
_baseObj = baseObj->_baseObj;
+ assert(_baseObj);
if (doInitSuperClass)
initSuperClass(segMan, addr);
diff --git a/engines/sci/engine/object.h b/engines/sci/engine/object.h
index 1ea9ae449a..00fe7c6875 100644
--- a/engines/sci/engine/object.h
+++ b/engines/sci/engine/object.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/sci/engine/savegame.cpp b/engines/sci/engine/savegame.cpp
index c60b50a964..cdcdcc41e5 100644
--- a/engines/sci/engine/savegame.cpp
+++ b/engines/sci/engine/savegame.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -219,25 +219,30 @@ void SegManager::saveLoadWithSerializer(Common::Serializer &s) {
syncArray<Class>(s, _classTable);
- // Now that all scripts are loaded, init their objects
- for (uint i = 0; i < _heap.size(); i++) {
- if (!_heap[i] || _heap[i]->getType() != SEG_TYPE_SCRIPT)
- continue;
+ // Now that all scripts are loaded, init their objects.
+ // Just like in Script::initializeObjectsSci0, we do two passes
+ // in case an object is loaded before its base.
+ int passes = getSciVersion() < SCI_VERSION_1_1 ? 2 : 1;
+ for (int pass = 1; pass <= passes; ++pass) {
+ for (uint i = 0; i < _heap.size(); i++) {
+ if (!_heap[i] || _heap[i]->getType() != SEG_TYPE_SCRIPT)
+ continue;
- Script *scr = (Script *)_heap[i];
- scr->syncLocalsBlock(this);
+ Script *scr = (Script *)_heap[i];
+ scr->syncLocalsBlock(this);
- ObjMap objects = scr->getObjectMap();
- for (ObjMap::iterator it = objects.begin(); it != objects.end(); ++it) {
- reg_t addr = it->_value.getPos();
- Object *obj = scr->scriptObjInit(addr, false);
+ ObjMap objects = scr->getObjectMap();
+ for (ObjMap::iterator it = objects.begin(); it != objects.end(); ++it) {
+ reg_t addr = it->_value.getPos();
+ Object *obj = scr->scriptObjInit(addr, false);
- if (getSciVersion() < SCI_VERSION_1_1) {
- if (!obj->initBaseObject(this, addr, false)) {
- // TODO/FIXME: This should not be happening at all. It might indicate a possible issue
- // with the garbage collector. It happens for example in LSL5 (German, perhaps English too).
- warning("Failed to locate base object for object at %04X:%04X; skipping", PRINT_REG(addr));
- objects.erase(addr.toUint16());
+ if (pass == 2) {
+ if (!obj->initBaseObject(this, addr, false)) {
+ // TODO/FIXME: This should not be happening at all. It might indicate a possible issue
+ // with the garbage collector. It happens for example in LSL5 (German, perhaps English too).
+ warning("Failed to locate base object for object at %04X:%04X; skipping", PRINT_REG(addr));
+ objects.erase(addr.toUint16());
+ }
}
}
}
@@ -465,7 +470,7 @@ void Script::syncStringHeap(Common::Serializer &s) {
break;
} while (1);
- } else if (getSciVersion() >= SCI_VERSION_1_1 && getSciVersion() <= SCI_VERSION_2_1){
+ } else if (getSciVersion() >= SCI_VERSION_1_1 && getSciVersion() <= SCI_VERSION_2_1){
// Strings in SCI1.1 come after the object instances
byte *buf = _heapStart + 4 + READ_SCI11ENDIAN_UINT16(_heapStart + 2) * 2;
@@ -484,7 +489,7 @@ void Script::saveLoadWithSerializer(Common::Serializer &s) {
s.syncAsSint32LE(_nr);
if (s.isLoading())
- load(_nr, g_sci->getResMan());
+ load(_nr, g_sci->getResMan(), g_sci->getScriptPatcher());
s.skip(4, VER(14), VER(22)); // OBSOLETE: Used to be _bufSize
s.skip(4, VER(14), VER(22)); // OBSOLETE: Used to be _scriptSize
s.skip(4, VER(14), VER(22)); // OBSOLETE: Used to be _heapSize
@@ -855,16 +860,13 @@ void gamestate_restore(EngineState *s, Common::SeekableReadStream *fh) {
return;
}
- if ((meta.version < MINIMUM_SAVEGAME_VERSION) ||
- (meta.version > CURRENT_SAVEGAME_VERSION)) {
- /*
- if (meta.version < MINIMUM_SAVEGAME_VERSION)
- warning("Old savegame version detected, unable to load it");
- else
- warning("Savegame version is %d, maximum supported is %0d", meta.version, CURRENT_SAVEGAME_VERSION);
- */
-
- showScummVMDialog("The format of this saved game is obsolete, unable to load it");
+ if ((meta.version < MINIMUM_SAVEGAME_VERSION) || (meta.version > CURRENT_SAVEGAME_VERSION)) {
+ if (meta.version < MINIMUM_SAVEGAME_VERSION) {
+ showScummVMDialog("The format of this saved game is obsolete, unable to load it");
+ } else {
+ Common::String msg = Common::String::format("Savegame version is %d, maximum supported is %0d", meta.version, CURRENT_SAVEGAME_VERSION);
+ showScummVMDialog(msg);
+ }
s->r_acc = TRUE_REG; // signal failure
return;
@@ -873,8 +875,6 @@ void gamestate_restore(EngineState *s, Common::SeekableReadStream *fh) {
if (meta.gameObjectOffset > 0 && meta.script0Size > 0) {
Resource *script0 = g_sci->getResMan()->findResource(ResourceId(kResourceTypeScript, 0), false);
if (script0->size != meta.script0Size || g_sci->getGameObject().getOffset() != meta.gameObjectOffset) {
- //warning("This saved game was created with a different version of the game, unable to load it");
-
showScummVMDialog("This saved game was created with a different version of the game, unable to load it");
s->r_acc = TRUE_REG; // signal failure
diff --git a/engines/sci/engine/savegame.h b/engines/sci/engine/savegame.h
index f1f02f89f2..8f2835654b 100644
--- a/engines/sci/engine/savegame.h
+++ b/engines/sci/engine/savegame.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/sci/engine/script.cpp b/engines/sci/engine/script.cpp
index 36d2841b07..2fe1aba975 100644
--- a/engines/sci/engine/script.cpp
+++ b/engines/sci/engine/script.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -32,7 +32,8 @@
namespace Sci {
-Script::Script() : SegmentObj(SEG_TYPE_SCRIPT), _buf(NULL) {
+Script::Script()
+ : SegmentObj(SEG_TYPE_SCRIPT), _buf(NULL) {
freeScript();
}
@@ -65,7 +66,7 @@ void Script::freeScript() {
_objects.clear();
}
-void Script::load(int script_nr, ResourceManager *resMan) {
+void Script::load(int script_nr, ResourceManager *resMan, ScriptPatcher *scriptPatcher) {
freeScript();
Resource *script = resMan->findResource(ResourceId(kResourceTypeScript, script_nr), 0);
@@ -136,7 +137,7 @@ void Script::load(int script_nr, ResourceManager *resMan) {
memcpy(_buf, script->data, script->size);
// Check scripts for matching signatures and patch those, if found
- matchSignatureAndPatch(_nr, _buf, script->size);
+ scriptPatcher->processScript(_nr, _buf, script->size);
if (getSciVersion() >= SCI_VERSION_1_1 && getSciVersion() <= SCI_VERSION_2_1) {
Resource *heap = resMan->findResource(ResourceId(kResourceTypeHeap, _nr), 0);
diff --git a/engines/sci/engine/script.h b/engines/sci/engine/script.h
index 0b499203c2..46d6ace917 100644
--- a/engines/sci/engine/script.h
+++ b/engines/sci/engine/script.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -25,12 +25,13 @@
#include "common/str.h"
#include "sci/engine/segment.h"
+#include "sci/engine/script_patches.h"
namespace Sci {
struct EngineState;
class ResourceManager;
-struct SciScriptSignature;
+struct SciScriptPatcherEntry;
enum ScriptObjectTypes {
SCI_OBJ_TERMINATOR,
@@ -96,11 +97,7 @@ public:
~Script();
void freeScript();
- void load(int script_nr, ResourceManager *resMan);
-
- void matchSignatureAndPatch(uint16 scriptNr, byte *scriptData, const uint32 scriptSize);
- int32 findSignature(const SciScriptSignature *signature, const byte *scriptData, const uint32 scriptSize);
- void applyPatch(const uint16 *patch, byte *scriptData, const uint32 scriptSize, int32 signatureOffset);
+ void load(int script_nr, ResourceManager *resMan, ScriptPatcher *scriptPatcher);
virtual bool isValidOffset(uint16 offset) const;
virtual SegmentRef dereference(reg_t pointer);
diff --git a/engines/sci/engine/script_patches.cpp b/engines/sci/engine/script_patches.cpp
index d2c3356d54..8bbbd713a6 100644
--- a/engines/sci/engine/script_patches.cpp
+++ b/engines/sci/engine/script_patches.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -21,43 +21,111 @@
*/
#include "sci/sci.h"
+#include "sci/engine/kernel.h"
#include "sci/engine/script.h"
#include "sci/engine/state.h"
#include "sci/engine/features.h"
+#include "sci/engine/script_patches.h"
#include "common/util.h"
namespace Sci {
-#define PATCH_END 0xFFFF
-#define PATCH_COMMANDMASK 0xF000
-#define PATCH_VALUEMASK 0x0FFF
-#define PATCH_ADDTOOFFSET 0xE000
-#define PATCH_GETORIGINALBYTE 0xD000
-#define PATCH_ADJUSTWORD 0xC000
-#define PATCH_ADJUSTWORD_NEG 0xB000
-#define PATCH_MAGICDWORD(a, b, c, d) CONSTANT_LE_32(a | (b << 8) | (c << 16) | (d << 24))
-#define PATCH_VALUELIMIT 4096
-
-struct SciScriptSignature {
- uint16 scriptNr;
- const char *description;
- int16 applyCount;
- uint32 magicDWord;
- int magicOffset;
- const byte *data;
- const uint16 *patch;
+// IMPORTANT:
+// every patch entry needs the following:
+// - script number (pretty obvious)
+//
+// - apply count
+// specifies the number of times a patch is supposed to get applied.
+// Most of the time, it should be 1.
+//
+// - magicDWORD + magicOffset
+// please ALWAYS put 0 for those two. Both will get filled out at runtime by the patcher.
+//
+// - signature data (is used to identify certain script code, that needs patching)
+// every signature needs to contain SIG_MAGICDWORD once.
+// The following 4 bytes after SIG_MAGICDWORD - which don't have to be fixed, you may for example
+// use SIG_SELECTOR16, will get used to quickly search for a partly match before verifying that
+// the whole signature actually matches. If it's not included, the script patcher will error() out
+// right when loading up the game.
+// If selector-IDs are included, please use SIG_SELECTOR16 + SIG_SELECTOR8 [1]. Simply
+// specify the selector that way, so that the patcher will search for the specific
+// selector instead of looking for a hardcoded value. Selectors may not be the same
+// between game versions.
+// For UINT16s either use SIG_UINT16 or SIG_SELECTOR16.
+// Macintosh versions of SCI games are using BE ordering instead of LE since SCI1.1 for UINT16s in scripts
+// By using those 2 commands, it's possible to make patches work for PC and Mac versions of the same game.
+// You may also skip bytes by using the SIG_ADDTOOFFSET command
+// Every signature data needs to get terminated using SIGNATURE_END
+//
+// - patch data (is used for actually patching scripts)
+// When a match is found, the patch data will get applied.
+// Patch data is similar to signature data. Just use PATCH_SELECTOR16 + PATCH_SELECTOR8 [1]
+// for patching in selectors.
+// There are also patch specific commands.
+// Those are PATCH_GETORIGINALBYTE, which fetches a byte from the original script
+// and PATCH_GETORIGINALBYTEADJUST, which does the same but gets a second value
+// from the uint16 array and uses that value to adjust the original byte.
+// Every patch data needs to get terminated using PATCH_END
+//
+// - and please always add a comment about why the patch was done and what's causing issues.
+// If possible make sure, that the patch works on localized (or just different) game versions
+// as well in case those need patching too.
+//
+// [1] - selectors need to get specified in selectorTable[] and ScriptPatcherSelectors-enum
+// before they can get used using the SIG_SELECTORx and PATCH_SELECTORx commands.
+// You have to use the exact same order in both the table and the enum, otherwise
+// it won't work.
+
+static const char *const selectorNameTable[] = {
+ "cycles", // system selector
+ "seconds", // system selector
+ "init", // system selector
+ "dispose", // system selector
+ "new", // system selector
+ "curEvent", // system selector
+ "disable", // system selector
+ "doit", // system selector
+ "show", // system selector
+ "x", // system selector
+ "cel", // system selector
+ "setMotion", // system selector
+ "overlay", // system selector
+ "deskSarg", // Gabriel Knight
+ "localize", // Freddy Pharkas
+ "put", // Police Quest 1 VGA
+ "solvePuzzle", // Quest For Glory 3
+ "timesShownID", // Space Quest 1 VGA
+ "startText", // King's Quest 6 CD / Laura Bow 2 CD for audio+text support
+ "startAudio", // King's Quest 6 CD / Laura Bow 2 CD for audio+text support
+ "modNum", // King's Quest 6 CD / Laura Bow 2 CD for audio+text support
+ NULL
+};
+
+enum ScriptPatcherSelectors {
+ SELECTOR_cycles = 0,
+ SELECTOR_seconds,
+ SELECTOR_init,
+ SELECTOR_dispose,
+ SELECTOR_new,
+ SELECTOR_curEvent,
+ SELECTOR_disable,
+ SELECTOR_doit,
+ SELECTOR_show,
+ SELECTOR_x,
+ SELECTOR_cel,
+ SELECTOR_setMotion,
+ SELECTOR_overlay,
+ SELECTOR_deskSarg,
+ SELECTOR_localize,
+ SELECTOR_put,
+ SELECTOR_solvePuzzle,
+ SELECTOR_timesShownID,
+ SELECTOR_startText,
+ SELECTOR_startAudio,
+ SELECTOR_modNum
};
-#define SCI_SIGNATUREENTRY_TERMINATOR { 0, NULL, 0, 0, 0, NULL, NULL }
-
-// signatures are built like this:
-// - first a counter of the bytes that follow
-// - then the actual bytes that need to get matched
-// - then another counter of bytes (0 for EOS)
-// - if not EOS, an adjust offset and the actual bytes
-// - rinse and repeat
-
// ===========================================================================
// Conquests of Camelot
// At the bazaar in Jerusalem, it's possible to see a girl taking a shower.
@@ -77,36 +145,33 @@ struct SciScriptSignature {
//
// We fix the script by patching in a jump to the proper code inside fawaz::doit.
// Responsible method: fawaz::handleEvent
-// Fixes bug #3614969
-const byte camelotSignaturePeepingTom[] = {
- 5,
- 0x72, 0x7e, 0x07, // lofsa fawaz <-- start of proper initializion code
- 0xa1, 0xb9, // sag b9h
- +255, 0,
- +255, 0,
- +61, 19, // skip 571 bytes
- 0x39, 0x7a, // pushi 7a <-- initialization code when walking automatically
- 0x78, // push1
- 0x7a, // push2
- 0x38, 0xa9, 0x00, // pushi 00a9 - script 169
- 0x78, // push1
- 0x43, 0x02, 0x04, // call kScriptID
- 0x36, // push
- 0x81, 0x00, // lag 00
- 0x4a, 0x06, // send 06
- 0x32, 0x20, 0x05, // jmp [end of fawaz::handleEvent]
- 0
-};
-
-const uint16 camelotPatchPeepingTom[] = {
- PATCH_ADDTOOFFSET | +576,
- 0x32, 0xbd, 0xfd, // jmp to fawaz::doit / properly init peepingTom code
+// Fixes bug: #6402
+static const uint16 camelotSignaturePeepingTom[] = {
+ 0x72, SIG_MAGICDWORD, SIG_UINT16(0x077e), // lofsa fawaz <-- start of proper initializion code
+ 0xa1, 0xb9, // sag b9h
+ SIG_ADDTOOFFSET(+571), // skip 571 bytes
+ 0x39, 0x7a, // pushi 7a <-- initialization code when walking automatically
+ 0x78, // push1
+ 0x7a, // push2
+ 0x38, SIG_UINT16(0x00a9), // + 0xa9, 0x00, // pushi 00a9 - script 169
+ 0x78, // push1
+ 0x43, 0x02, 0x04, // call kScriptID
+ 0x36, // push
+ 0x81, 0x00, // lag 00
+ 0x4a, 0x06, // send 06
+ 0x32, SIG_UINT16(0x0520), // jmp [end of fawaz::handleEvent]
+ SIG_END
+};
+
+static const uint16 camelotPatchPeepingTom[] = {
+ PATCH_ADDTOOFFSET(+576),
+ 0x32, PATCH_UINT16(0xfdbd), // jmp to fawaz::doit / properly init peepingTom code
PATCH_END
};
-// script, description, magic DWORD, adjust
-const SciScriptSignature camelotSignatures[] = {
- { 62, "fix peepingTom Sierra bug", 1, PATCH_MAGICDWORD(0x7e, 0x07, 0xa1, 0xb9), -1, camelotSignaturePeepingTom, camelotPatchPeepingTom },
+// script, description, signature patch
+static const SciScriptPatcherEntry camelotSignatures[] = {
+ { true, 62, "fix peepingTom Sierra bug", 1, camelotSignaturePeepingTom, camelotPatchPeepingTom },
SCI_SIGNATUREENTRY_TERMINATOR
};
@@ -115,64 +180,67 @@ const SciScriptSignature camelotSignatures[] = {
// boundaries of room 660. Normally a textbox is supposed to get on screen
// but the call is wrong, so not only do we get an error message the script
// is also hanging because the cue won't get sent out
-// This also happens in sierra sci - refer to bug #3038387
-const byte ecoquest1SignatureStayAndHelp[] = {
- 40,
- 0x3f, 0x01, // link 01
- 0x87, 0x01, // lap param[1]
- 0x65, 0x14, // aTop state
- 0x36, // push
- 0x3c, // dup
- 0x35, 0x00, // ldi 00
- 0x1a, // eq?
- 0x31, 0x1c, // bnt [next state]
- 0x76, // push0
- 0x45, 0x01, 0x00, // callb export1 from script 0 (switching control off)
- 0x38, 0x22, 0x01, // pushi 0122
- 0x78, // push1
- 0x76, // push0
- 0x81, 0x00, // lag global[0]
- 0x4a, 0x06, // send 06 - call ego::setMotion(0)
- 0x39, 0x6e, // pushi 6e (selector init)
- 0x39, 0x04, // pushi 04
- 0x76, // push0
- 0x76, // push0
- 0x39, 0x17, // pushi 17
- 0x7c, // pushSelf
- 0x51, 0x82, // class EcoNarrator
- 0x4a, 0x0c, // send 0c - call EcoNarrator::init(0, 0, 23, self) (BADLY BROKEN!)
- 0x33, // jmp [end]
- 0
+// This also happens in sierra sci
+// Applies to at least: PC-CD
+// Responsible method: stayAndHelp::changeState
+// Fixes bug: #5107
+static const uint16 ecoquest1SignatureStayAndHelp[] = {
+ 0x3f, 0x01, // link 01
+ 0x87, 0x01, // lap param[1]
+ 0x65, 0x14, // aTop state
+ 0x36, // push
+ 0x3c, // dup
+ 0x35, 0x00, // ldi 00
+ 0x1a, // eq?
+ 0x31, 0x1c, // bnt [next state]
+ 0x76, // push0
+ 0x45, 0x01, 0x00, // callb export1 from script 0 (switching control off)
+ SIG_MAGICDWORD,
+ 0x38, SIG_UINT16(0x0122), // pushi 0122
+ 0x78, // push1
+ 0x76, // push0
+ 0x81, 0x00, // lag global[0]
+ 0x4a, 0x06, // send 06 - call ego::setMotion(0)
+ 0x39, SIG_SELECTOR8(init), // pushi "init"
+ 0x39, 0x04, // pushi 04
+ 0x76, // push0
+ 0x76, // push0
+ 0x39, 0x17, // pushi 17
+ 0x7c, // pushSelf
+ 0x51, 0x82, // class EcoNarrator
+ 0x4a, 0x0c, // send 0c - call EcoNarrator::init(0, 0, 23, self) (BADLY BROKEN!)
+ 0x33, // jmp [end]
+ SIG_END
+};
+
+static const uint16 ecoquest1PatchStayAndHelp[] = {
+ 0x87, 0x01, // lap param[1]
+ 0x65, 0x14, // aTop state
+ 0x36, // push
+ 0x2f, 0x22, // bt [next state] (this optimization saves 6 bytes)
+ 0x39, 0x00, // pushi 0 (wasting 1 byte here)
+ 0x45, 0x01, 0x00, // callb export1 from script 0 (switching control off)
+ 0x38, PATCH_UINT16(0x0122), // pushi 0122
+ 0x78, // push1
+ 0x76, // push0
+ 0x81, 0x00, // lag global[0]
+ 0x4a, 0x06, // send 06 - call ego::setMotion(0)
+ 0x39, PATCH_SELECTOR8(init), // pushi "init"
+ 0x39, 0x06, // pushi 06
+ 0x39, 0x02, // pushi 02 (additional 2 bytes)
+ 0x76, // push0
+ 0x76, // push0
+ 0x39, 0x17, // pushi 17
+ 0x7c, // pushSelf
+ 0x38, PATCH_UINT16(0x0280), // pushi 280 (additional 3 bytes)
+ 0x51, 0x82, // class EcoNarrator
+ 0x4a, 0x10, // send 10 - call EcoNarrator::init(2, 0, 0, 23, self, 640)
+ PATCH_END
};
-const uint16 ecoquest1PatchStayAndHelp[] = {
- 0x87, 0x01, // lap param[1]
- 0x65, 0x14, // aTop state
- 0x36, // push
- 0x2f, 0x22, // bt [next state] (this optimization saves 6 bytes)
- 0x39, 0x00, // pushi 0 (wasting 1 byte here)
- 0x45, 0x01, 0x00, // callb export1 from script 0 (switching control off)
- 0x38, 0x22, 0x01, // pushi 0122
- 0x78, // push1
- 0x76, // push0
- 0x81, 0x00, // lag global[0]
- 0x4a, 0x06, // send 06 - call ego::setMotion(0)
- 0x39, 0x6e, // pushi 6e (selector init)
- 0x39, 0x06, // pushi 06
- 0x39, 0x02, // pushi 02 (additional 2 bytes)
- 0x76, // push0
- 0x76, // push0
- 0x39, 0x17, // pushi 17
- 0x7c, // pushSelf
- 0x38, 0x80, 0x02, // pushi 280 (additional 3 bytes)
- 0x51, 0x82, // class EcoNarrator
- 0x4a, 0x10, // send 10 - call EcoNarrator::init(2, 0, 0, 23, self, 640)
- PATCH_END
-};
-
-// script, description, magic DWORD, adjust
-const SciScriptSignature ecoquest1Signatures[] = {
- { 660, "CD: bad messagebox and freeze", 1, PATCH_MAGICDWORD(0x38, 0x22, 0x01, 0x78), -17, ecoquest1SignatureStayAndHelp, ecoquest1PatchStayAndHelp },
+// script, description, signature patch
+static const SciScriptPatcherEntry ecoquest1Signatures[] = {
+ { true, 660, "CD: bad messagebox and freeze", 1, ecoquest1SignatureStayAndHelp, ecoquest1PatchStayAndHelp },
SCI_SIGNATUREENTRY_TERMINATOR
};
@@ -181,122 +249,124 @@ const SciScriptSignature ecoquest1Signatures[] = {
// ecorder. This is done by reusing temp-space, that was filled on state 1.
// this worked in sierra sci just by accident. In our sci, the temp space
// is resetted every time, which means the previous text isn't available
-// anymore. We have to patch the code because of that - bug #3035386
-const byte ecoquest2SignatureEcorder[] = {
- 35,
- 0x31, 0x22, // bnt [next state]
- 0x39, 0x0a, // pushi 0a
- 0x5b, 0x04, 0x1e, // lea temp[1e]
- 0x36, // push
- 0x39, 0x64, // pushi 64
- 0x39, 0x7d, // pushi 7d
- 0x39, 0x32, // pushi 32
- 0x39, 0x66, // pushi 66
- 0x39, 0x17, // pushi 17
- 0x39, 0x69, // pushi 69
- 0x38, 0x31, 0x26, // pushi 2631
- 0x39, 0x6a, // pushi 6a
- 0x39, 0x64, // pushi 64
- 0x43, 0x1b, 0x14, // call kDisplay
- 0x35, 0x0a, // ldi 0a
- 0x65, 0x20, // aTop ticks
- 0x33, // jmp [end]
- +1, 5, // [skip 1 byte]
- 0x3c, // dup
- 0x35, 0x03, // ldi 03
- 0x1a, // eq?
- 0x31, // bnt [end]
- 0
-};
-
-const uint16 ecoquest2PatchEcorder[] = {
- 0x2f, 0x02, // bt [to pushi 07]
- 0x3a, // toss
- 0x48, // ret
- 0x38, 0x07, 0x00, // pushi 07 (parameter count) (waste 1 byte)
- 0x39, 0x0b, // push (FillBoxAny)
- 0x39, 0x1d, // pushi 29d
- 0x39, 0x73, // pushi 115d
- 0x39, 0x5e, // pushi 94d
- 0x38, 0xd7, 0x00, // pushi 215d
- 0x78, // push1 (visual screen)
- 0x38, 0x17, 0x00, // pushi 17 (color) (waste 1 byte)
- 0x43, 0x6c, 0x0e, // call kGraph
- 0x38, 0x05, 0x00, // pushi 05 (parameter count) (waste 1 byte)
- 0x39, 0x0c, // pushi 12d (UpdateBox)
- 0x39, 0x1d, // pushi 29d
- 0x39, 0x73, // pushi 115d
- 0x39, 0x5e, // pushi 94d
- 0x38, 0xd7, 0x00, // pushi 215d
- 0x43, 0x6c, 0x0a, // call kGraph
+// anymore. We have to patch the code because of that.
+// Fixes bug: #4993
+static const uint16 ecoquest2SignatureEcorder[] = {
+ 0x31, 0x22, // bnt [next state]
+ 0x39, 0x0a, // pushi 0a
+ 0x5b, 0x04, 0x1e, // lea temp[1e]
+ 0x36, // push
+ SIG_MAGICDWORD,
+ 0x39, 0x64, // pushi 64
+ 0x39, 0x7d, // pushi 7d
+ 0x39, 0x32, // pushi 32
+ 0x39, 0x66, // pushi 66
+ 0x39, 0x17, // pushi 17
+ 0x39, 0x69, // pushi 69
+ 0x38, PATCH_UINT16(0x2631), // pushi 2631
+ 0x39, 0x6a, // pushi 6a
+ 0x39, 0x64, // pushi 64
+ 0x43, 0x1b, 0x14, // call kDisplay
+ 0x35, 0x0a, // ldi 0a
+ 0x65, 0x20, // aTop ticks
+ 0x33, // jmp [end]
+ SIG_ADDTOOFFSET(+1), // [skip 1 byte]
+ 0x3c, // dup
+ 0x35, 0x03, // ldi 03
+ 0x1a, // eq?
+ 0x31, // bnt [end]
+ SIG_END
+};
+
+static const uint16 ecoquest2PatchEcorder[] = {
+ 0x2f, 0x02, // bt [to pushi 07]
+ 0x3a, // toss
+ 0x48, // ret
+ 0x38, PATCH_UINT16(0x0007), // pushi 07 (parameter count) (waste 1 byte)
+ 0x39, 0x0b, // push (FillBoxAny)
+ 0x39, 0x1d, // pushi 29d
+ 0x39, 0x73, // pushi 115d
+ 0x39, 0x5e, // pushi 94d
+ 0x38, PATCH_UINT16(0x00d7), // pushi 215d
+ 0x78, // push1 (visual screen)
+ 0x38, PATCH_UINT16(0x0017), // pushi 17 (color) (waste 1 byte)
+ 0x43, 0x6c, 0x0e, // call kGraph
+ 0x38, PATCH_UINT16(0x0005), // pushi 05 (parameter count) (waste 1 byte)
+ 0x39, 0x0c, // pushi 12d (UpdateBox)
+ 0x39, 0x1d, // pushi 29d
+ 0x39, 0x73, // pushi 115d
+ 0x39, 0x5e, // pushi 94d
+ 0x38, PATCH_UINT16(0x00d7), // pushi 215d
+ 0x43, 0x6c, 0x0a, // call kGraph
PATCH_END
};
// ===========================================================================
-// Same patch as above for the ecorder introduction. Fixes bug #3092115.
+// Same patch as above for the ecorder introduction.
// Two workarounds are needed for this patch in workarounds.cpp (when calling
// kGraphFillBoxAny and kGraphUpdateBox), as there isn't enough space to patch
// the function otherwise.
-const byte ecoquest2SignatureEcorderTutorial[] = {
- 36,
- 0x30, 0x23, 0x00, // bnt [next state]
- 0x39, 0x0a, // pushi 0a
- 0x5b, 0x04, 0x1f, // lea temp[1f]
- 0x36, // push
- 0x39, 0x64, // pushi 64
- 0x39, 0x7d, // pushi 7d
- 0x39, 0x32, // pushi 32
- 0x39, 0x66, // pushi 66
- 0x39, 0x17, // pushi 17
- 0x39, 0x69, // pushi 69
- 0x38, 0x31, 0x26, // pushi 2631
- 0x39, 0x6a, // pushi 6a
- 0x39, 0x64, // pushi 64
- 0x43, 0x1b, 0x14, // call kDisplay
- 0x35, 0x1e, // ldi 1e
- 0x65, 0x20, // aTop ticks
- 0x32, // jmp [end]
+// Fixes bug: #6467
+static const uint16 ecoquest2SignatureEcorderTutorial[] = {
+ 0x30, SIG_UINT16(0x0023), // bnt [next state]
+ 0x39, 0x0a, // pushi 0a
+ 0x5b, 0x04, 0x1f, // lea temp[1f]
+ 0x36, // push
+ SIG_MAGICDWORD,
+ 0x39, 0x64, // pushi 64
+ 0x39, 0x7d, // pushi 7d
+ 0x39, 0x32, // pushi 32
+ 0x39, 0x66, // pushi 66
+ 0x39, 0x17, // pushi 17
+ 0x39, 0x69, // pushi 69
+ 0x38, SIG_UINT16(0x2631), // pushi 2631
+ 0x39, 0x6a, // pushi 6a
+ 0x39, 0x64, // pushi 64
+ 0x43, 0x1b, 0x14, // call kDisplay
+ 0x35, 0x1e, // ldi 1e
+ 0x65, 0x20, // aTop ticks
+ 0x32, // jmp [end]
// 2 extra bytes, jmp offset
- 0
+ SIG_END
};
-const uint16 ecoquest2PatchEcorderTutorial[] = {
- 0x31, 0x23, // bnt [next state] (save 1 byte)
+static const uint16 ecoquest2PatchEcorderTutorial[] = {
+ 0x31, 0x23, // bnt [next state] (save 1 byte)
// The parameter count below should be 7, but we're out of bytes
// to patch! A workaround has been added because of this
- 0x78, // push1 (parameter count)
- //0x39, 0x07, // pushi 07 (parameter count)
- 0x39, 0x0b, // push (FillBoxAny)
- 0x39, 0x1d, // pushi 29d
- 0x39, 0x73, // pushi 115d
- 0x39, 0x5e, // pushi 94d
- 0x38, 0xd7, 0x00, // pushi 215d
- 0x78, // push1 (visual screen)
- 0x39, 0x17, // pushi 17 (color)
- 0x43, 0x6c, 0x0e, // call kGraph
+ 0x78, // push1 (parameter count)
+ //0x39, 0x07, // pushi 07 (parameter count)
+ 0x39, 0x0b, // push (FillBoxAny)
+ 0x39, 0x1d, // pushi 29d
+ 0x39, 0x73, // pushi 115d
+ 0x39, 0x5e, // pushi 94d
+ 0x38, PATCH_UINT16(0x00d7), // pushi 215d
+ 0x78, // push1 (visual screen)
+ 0x39, 0x17, // pushi 17 (color)
+ 0x43, 0x6c, 0x0e, // call kGraph
// The parameter count below should be 5, but we're out of bytes
// to patch! A workaround has been added because of this
- 0x78, // push1 (parameter count)
- //0x39, 0x05, // pushi 05 (parameter count)
- 0x39, 0x0c, // pushi 12d (UpdateBox)
- 0x39, 0x1d, // pushi 29d
- 0x39, 0x73, // pushi 115d
- 0x39, 0x5e, // pushi 94d
- 0x38, 0xd7, 0x00, // pushi 215d
- 0x43, 0x6c, 0x0a, // call kGraph
+ 0x78, // push1 (parameter count)
+ //0x39, 0x05, // pushi 05 (parameter count)
+ 0x39, 0x0c, // pushi 12d (UpdateBox)
+ 0x39, 0x1d, // pushi 29d
+ 0x39, 0x73, // pushi 115d
+ 0x39, 0x5e, // pushi 94d
+ 0x38, PATCH_UINT16(0x00d7), // pushi 215d
+ 0x43, 0x6c, 0x0a, // call kGraph
// We are out of bytes to patch at this point,
// so we skip 494 (0x1EE) bytes to reuse this code:
// ldi 1e
// aTop 20
// jmp 030e (jump to end)
- 0x32, 0xee, 0x01, // skip 494 (0x1EE) bytes
+ 0x32, PATCH_UINT16(0x01ee), // skip 494 (0x1EE) bytes
PATCH_END
};
-// script, description, magic DWORD, adjust
-const SciScriptSignature ecoquest2Signatures[] = {
- { 50, "initial text not removed on ecorder", 1, PATCH_MAGICDWORD(0x39, 0x64, 0x39, 0x7d), -8, ecoquest2SignatureEcorder, ecoquest2PatchEcorder },
- { 333, "initial text not removed on ecorder tutorial",1, PATCH_MAGICDWORD(0x39, 0x64, 0x39, 0x7d), -9, ecoquest2SignatureEcorderTutorial, ecoquest2PatchEcorderTutorial },
+// script, description, signature patch
+static const SciScriptPatcherEntry ecoquest2Signatures[] = {
+ { true, 50, "initial text not removed on ecorder", 1, ecoquest2SignatureEcorder, ecoquest2PatchEcorder },
+ { true, 333, "initial text not removed on ecorder tutorial", 1, ecoquest2SignatureEcorderTutorial, ecoquest2PatchEcorderTutorial },
SCI_SIGNATUREENTRY_TERMINATOR
};
@@ -305,27 +375,27 @@ const SciScriptSignature ecoquest2Signatures[] = {
// wrong address when an incorrect word is typed, therefore leading to an
// infinite loop. This script bug was not apparent in SSCI, probably because
// event handling was slightly different there, so it was never discovered.
-// Fixes bug #3038870.
-const byte fanmadeSignatureInfiniteLoop[] = {
- 13,
- 0x38, 0x4c, 0x00, // pushi 004c
- 0x39, 0x00, // pushi 00
- 0x87, 0x01, // lap 01
- 0x4b, 0x04, // send 04
- 0x18, // not
- 0x30, 0x2f, 0x00, // bnt 002f [06a5] --> jmp ffbc [0664] --> BUG! infinite loop
- 0
-};
-
-const uint16 fanmadePatchInfiniteLoop[] = {
- PATCH_ADDTOOFFSET | +10,
- 0x30, 0x32, 0x00, // bnt 0032 [06a8] --> pushi 004c
+// Fixes bug: #5120
+static const uint16 fanmadeSignatureInfiniteLoop[] = {
+ 0x38, SIG_UINT16(0x004c), // pushi 004c
+ 0x39, 0x00, // pushi 00
+ 0x87, 0x01, // lap 01
+ 0x4b, 0x04, // send 04
+ SIG_MAGICDWORD,
+ 0x18, // not
+ 0x30, SIG_UINT16(0x002f), // bnt 002f [06a5] --> jmp ffbc [0664] --> BUG! infinite loop
+ SIG_END
+};
+
+static const uint16 fanmadePatchInfiniteLoop[] = {
+ PATCH_ADDTOOFFSET(+10),
+ 0x30, SIG_UINT16(0x0032), // bnt 0032 [06a8] --> pushi 004c
PATCH_END
};
-// script, description, magic DWORD, adjust
-const SciScriptSignature fanmadeSignatures[] = {
- { 999, "infinite loop on typo", 1, PATCH_MAGICDWORD(0x18, 0x30, 0x2f, 0x00), -9, fanmadeSignatureInfiniteLoop, fanmadePatchInfiniteLoop },
+// script, description, signature patch
+static const SciScriptPatcherEntry fanmadeSignatures[] = {
+ { true, 999, "infinite loop on typo", 1, fanmadeSignatureInfiniteLoop, fanmadePatchInfiniteLoop },
SCI_SIGNATUREENTRY_TERMINATOR
};
@@ -337,21 +407,23 @@ const SciScriptSignature fanmadeSignatures[] = {
// was already playing in the sound driver. In our case we would also stop
// the sample from playing, so we patch it out
// The "score" code is already buggy and sets volume to 0 when playing
-const byte freddypharkasSignatureScoreDisposal[] = {
- 10,
- 0x67, 0x32, // pTos 32 (selector theAudCount)
- 0x78, // push1
- 0x39, 0x0d, // pushi 0d
- 0x43, 0x75, 0x02, // call kDoAudio
- 0x1c, // ne?
- 0x31, // bnt (-> to skip disposal)
- 0
-};
-
-const uint16 freddypharkasPatchScoreDisposal[] = {
- 0x34, 0x00, 0x00, // ldi 0000
- 0x34, 0x00, 0x00, // ldi 0000
- 0x34, 0x00, 0x00, // ldi 0000
+// Applies to at least: English PC-CD
+// Responsible method: unknown
+static const uint16 freddypharkasSignatureScoreDisposal[] = {
+ 0x67, 0x32, // pTos 32 (selector theAudCount)
+ 0x78, // push1
+ SIG_MAGICDWORD,
+ 0x39, 0x0d, // pushi 0d
+ 0x43, 0x75, 0x02, // call kDoAudio
+ 0x1c, // ne?
+ 0x31, // bnt (-> to skip disposal)
+ SIG_END
+};
+
+static const uint16 freddypharkasPatchScoreDisposal[] = {
+ 0x34, PATCH_UINT16(0x0000), // ldi 0000
+ 0x34, PATCH_UINT16(0x0000), // ldi 0000
+ 0x34, PATCH_UINT16(0x0000), // ldi 0000
PATCH_END
};
@@ -361,24 +433,26 @@ const uint16 freddypharkasPatchScoreDisposal[] = {
// in IconBar::disable doing endless loops even in sierra sci, because there
// is no enabled icon left. We remove disabling of icon 8 (which is help),
// this fixes the issue.
-const byte freddypharkasSignatureCanisterHang[] = {
- 12,
- 0x38, 0xf1, 0x00, // pushi f1 (selector disable)
- 0x7a, // push2
- 0x39, 0x07, // pushi 07
- 0x39, 0x08, // pushi 08
- 0x81, 0x45, // lag 45
- 0x4a, 0x08, // send 08 - call IconBar::disable(7, 8)
- 0
-};
-
-const uint16 freddypharkasPatchCanisterHang[] = {
- PATCH_ADDTOOFFSET | +3,
- 0x78, // push1
- PATCH_ADDTOOFFSET | +2,
- 0x33, 0x00, // ldi 00 (waste 2 bytes)
- PATCH_ADDTOOFFSET | +3,
- 0x06, // send 06 - call IconBar::disable(7)
+// Applies to at least: English PC-CD
+// Responsible method: rm235::init and sEnterFrom500::changeState
+static const uint16 freddypharkasSignatureCanisterHang[] = {
+ 0x38, SIG_SELECTOR16(disable), // pushi disable
+ 0x7a, // push2
+ SIG_MAGICDWORD,
+ 0x39, 0x07, // pushi 07
+ 0x39, 0x08, // pushi 08
+ 0x81, 0x45, // lag 45
+ 0x4a, 0x08, // send 08 - call IconBar::disable(7, 8)
+ SIG_END
+};
+
+static const uint16 freddypharkasPatchCanisterHang[] = {
+ PATCH_ADDTOOFFSET(+3),
+ 0x78, // push1
+ PATCH_ADDTOOFFSET(+2),
+ 0x33, 0x00, // ldi 00 (waste 2 bytes)
+ PATCH_ADDTOOFFSET(+3),
+ 0x06, // send 06 - call IconBar::disable(7)
PATCH_END
};
@@ -390,135 +464,132 @@ const uint16 freddypharkasPatchCanisterHang[] = {
// ego, sometimes clicks also won't get registered. Strangely it's not nearly
// as bad as in our sci, but these differences may be caused by timing.
// We just reuse the active event, thus removing the duplicate kGetEvent call.
-const byte freddypharkasSignatureLadderEvent[] = {
- 21,
- 0x39, 0x6d, // pushi 6d (selector new)
- 0x76, // push0
- 0x38, 0xf5, 0x00, // pushi f5 (selector curEvent)
- 0x76, // push0
- 0x81, 0x50, // lag global[50]
- 0x4a, 0x04, // send 04 - read User::curEvent
- 0x4a, 0x04, // send 04 - call curEvent::new
- 0xa5, 0x00, // sat temp[0]
- 0x38, 0x94, 0x00, // pushi 94 (selector localize)
- 0x76, // push0
- 0x4a, 0x04, // send 04 - call curEvent::localize
- 0
-};
-
-const uint16 freddypharkasPatchLadderEvent[] = {
- 0x34, 0x00, 0x00, // ldi 0000 (waste 3 bytes, overwrites first 2 pushes)
- PATCH_ADDTOOFFSET | +8,
- 0xa5, 0x00, // sat temp[0] (waste 2 bytes, overwrites 2nd send)
- PATCH_ADDTOOFFSET | +2,
- 0x34, 0x00, 0x00, // ldi 0000
- 0x34, 0x00, 0x00, // ldi 0000 (waste 6 bytes, overwrites last 3 opcodes)
+// Applies to at least: English PC-CD, German Floppy, English Mac
+// Responsible method: lowerLadder::doit and highLadder::doit
+static const uint16 freddypharkasSignatureLadderEvent[] = {
+ 0x39, SIG_MAGICDWORD,
+ SIG_SELECTOR8(new), // pushi new
+ 0x76, // push0
+ 0x38, SIG_SELECTOR16(curEvent), // pushi curEvent
+ 0x76, // push0
+ 0x81, 0x50, // lag global[50]
+ 0x4a, 0x04, // send 04 - read User::curEvent
+ 0x4a, 0x04, // send 04 - call curEvent::new
+ 0xa5, 0x00, // sat temp[0]
+ 0x38, SIG_SELECTOR16(localize),
+ 0x76, // push0
+ 0x4a, 0x04, // send 04 - call curEvent::localize
+ SIG_END
+};
+
+static const uint16 freddypharkasPatchLadderEvent[] = {
+ 0x34, 0x00, 0x00, // ldi 0000 (waste 3 bytes, overwrites first 2 pushes)
+ PATCH_ADDTOOFFSET(+8),
+ 0xa5, 0x00, // sat temp[0] (waste 2 bytes, overwrites 2nd send)
+ PATCH_ADDTOOFFSET(+2),
+ 0x34, 0x00, 0x00, // ldi 0000
+ 0x34, 0x00, 0x00, // ldi 0000 (waste 6 bytes, overwrites last 3 opcodes)
PATCH_END
};
// In the Macintosh version of Freddy Pharkas, kRespondsTo is broken for
// property selectors. They hacked the script to work around the issue,
// so we revert the script back to using the values of the DOS script.
-const byte freddypharkasSignatureMacInventory[] = {
- 10,
- 0x39, 0x23, // pushi 23
- 0x39, 0x74, // pushi 74
- 0x78, // push1
- 0x38, 0x01, 0x74, // pushi 0174
- 0x85, 0x15, // lat 15
- 0
+// Applies to at least: English Mac
+// Responsible method: unknown
+static const uint16 freddypharkasSignatureMacInventory[] = {
+ SIG_MAGICDWORD,
+ 0x39, 0x23, // pushi 23
+ 0x39, 0x74, // pushi 74
+ 0x78, // push1
+ 0x38, SIG_UINT16(0x0174), // pushi 0174 (on mac it's actually 0x01, 0x74)
+ 0x85, 0x15, // lat 15
+ SIG_END
+};
+
+static const uint16 freddypharkasPatchMacInventory[] = {
+ 0x39, 0x02, // pushi 02 (now matches the DOS version)
+ PATCH_ADDTOOFFSET(+23),
+ 0x39, 0x04, // pushi 04 (now matches the DOS version)
+ PATCH_END
};
-const uint16 freddypharkasPatchMacInventory[] = {
- 0x39, 0x02, // pushi 02 (now matches the DOS version)
- 0x39, 0x74, // pushi 74
- 0x78, // push1
- 0x38, 0x01, 0x74, // pushi 0174
- 0x85, 0x15, // lat 15
- 0x4a, 0x06, // send 06
- 0x31, 0x08, // bnt 08
- 0x38, 0x01, 0x74, // pushi 0174
- 0x76, // push0
- 0x85, 0x15, // lat 15
- 0x4a, 0x04, // send 04
- 0x02, // add
- 0xa5, 0x12, // sat 12
- 0x39, 0x04, // pushi 04 (now matches the DOS version)
- PATCH_END
-};
-
-// script, description, magic DWORD, adjust
-const SciScriptSignature freddypharkasSignatures[] = {
- { 0, "CD: score early disposal", 1, PATCH_MAGICDWORD(0x39, 0x0d, 0x43, 0x75), -3, freddypharkasSignatureScoreDisposal, freddypharkasPatchScoreDisposal },
- { 15, "Mac: broken inventory", 1, PATCH_MAGICDWORD(0x39, 0x23, 0x39, 0x74), 0, freddypharkasSignatureMacInventory, freddypharkasPatchMacInventory },
- { 235, "CD: canister pickup hang", 3, PATCH_MAGICDWORD(0x39, 0x07, 0x39, 0x08), -4, freddypharkasSignatureCanisterHang, freddypharkasPatchCanisterHang },
- { 320, "ladder event issue", 2, PATCH_MAGICDWORD(0x6d, 0x76, 0x38, 0xf5), -1, freddypharkasSignatureLadderEvent, freddypharkasPatchLadderEvent },
+// script, description, signature patch
+static const SciScriptPatcherEntry freddypharkasSignatures[] = {
+ { true, 0, "CD: score early disposal", 1, freddypharkasSignatureScoreDisposal, freddypharkasPatchScoreDisposal },
+ { true, 15, "Mac: broken inventory", 1, freddypharkasSignatureMacInventory, freddypharkasPatchMacInventory },
+ { true, 235, "CD: canister pickup hang", 3, freddypharkasSignatureCanisterHang, freddypharkasPatchCanisterHang },
+ { true, 320, "ladder event issue", 2, freddypharkasSignatureLadderEvent, freddypharkasPatchLadderEvent },
SCI_SIGNATUREENTRY_TERMINATOR
};
// ===========================================================================
// daySixBeignet::changeState (4) is called when the cop goes out and sets cycles to 220.
// this is not enough time to get to the door, so we patch that to 23 seconds
-const byte gk1SignatureDay6PoliceBeignet[] = {
- 4,
- 0x35, 0x04, // ldi 04
- 0x1a, // eq?
- 0x30, // bnt [next state check]
- +2, 5, // [skip 2 bytes, offset of bnt]
- 0x38, 0x93, 0x00, // pushi 93 (selector dispose)
- 0x76, // push0
- 0x72, // lofsa deskSarg
- +2, 9, // [skip 2 bytes, offset of lofsa]
- 0x4a, 0x04, 0x00, // send 04
- 0x34, 0xdc, 0x00, // ldi 220
- 0x65, 0x1a, // aTop cycles
- 0x32, // jmp [end]
- 0
-};
-
-const uint16 gk1PatchDay6PoliceBeignet[] = {
- PATCH_ADDTOOFFSET | +16,
- 0x34, 0x17, 0x00, // ldi 23
- 0x65, 0x1c, // aTop seconds
+// Applies to at least: English PC-CD, German PC-CD, English Mac
+// Responsible method: daySixBeignet::changeState
+static const uint16 gk1SignatureDay6PoliceBeignet[] = {
+ 0x35, 0x04, // ldi 04
+ 0x1a, // eq?
+ 0x30, SIG_ADDTOOFFSET(+2), // bnt [next state check]
+ 0x38, SIG_SELECTOR16(dispose), // pushi dispose
+ 0x76, // push0
+ 0x72, SIG_ADDTOOFFSET(+2), // lofsa deskSarg
+ 0x4a, SIG_UINT16(0x0004), // send 04
+ SIG_MAGICDWORD,
+ 0x34, SIG_UINT16(0x00dc), // ldi 220
+ 0x65, SIG_ADDTOOFFSET(+1), // aTop cycles (1a for PC, 1c for Mac)
+ 0x32, // jmp [end]
+ SIG_END
+};
+
+static const uint16 gk1PatchDay6PoliceBeignet[] = {
+ PATCH_ADDTOOFFSET(+16),
+ 0x34, PATCH_UINT16(0x0017), // ldi 23
+ 0x65, PATCH_GETORIGINALBYTEADJUST(+20, +2), // aTop seconds (1c for PC, 1e for Mac)
PATCH_END
};
// sargSleeping::changeState (8) is called when the cop falls asleep and sets cycles to 220.
// this is not enough time to get to the door, so we patch it to 42 seconds
-const byte gk1SignatureDay6PoliceSleep[] = {
- 4,
- 0x35, 0x08, // ldi 08
- 0x1a, // eq?
- 0x31, // bnt [next state check]
- +1, 6, // [skip 1 byte, offset of bnt]
- 0x34, 0xdc, 0x00, // ldi 220
- 0x65, 0x1a, // aTop cycles
- 0x32, // jmp [end]
+// Applies to at least: English PC-CD, German PC-CD, English Mac
+// Responsible method: sargSleeping::changeState
+static const uint16 gk1SignatureDay6PoliceSleep[] = {
+ 0x35, 0x08, // ldi 08
+ 0x1a, // eq?
+ 0x31, SIG_ADDTOOFFSET(+1), // bnt [next state check]
+ SIG_MAGICDWORD,
+ 0x34, SIG_UINT16(0x00dc), // ldi 220
+ 0x65, SIG_ADDTOOFFSET(+1), // aTop cycles (1a for PC, 1c for Mac)
+ 0x32, // jmp [end]
0
};
-const uint16 gk1PatchDay6PoliceSleep[] = {
- PATCH_ADDTOOFFSET | +5,
- 0x34, 0x2a, 0x00, // ldi 42
- 0x65, 0x1c, // aTop seconds
+static const uint16 gk1PatchDay6PoliceSleep[] = {
+ PATCH_ADDTOOFFSET(+5),
+ 0x34, SIG_UINT16(0x002a), // ldi 42
+ 0x65, PATCH_GETORIGINALBYTEADJUST(+9, +2), // aTop seconds (1c for PC, 1e for Mac)
PATCH_END
};
// startOfDay5::changeState (20h) - when gabriel goes to the phone the script will hang
-const byte gk1SignatureDay5PhoneFreeze[] = {
- 5,
- 0x35, 0x03, // ldi 03
- 0x65, 0x1a, // aTop cycles
- 0x32, // jmp [end]
- +2, 3, // [skip 2 bytes, offset of jmp]
- 0x3c, // dup
- 0x35, 0x21, // ldi 21
- 0
-};
-
-const uint16 gk1PatchDay5PhoneFreeze[] = {
- 0x35, 0x06, // ldi 06
- 0x65, 0x20, // aTop ticks
+// Applies to at least: English PC-CD, German PC-CD, English Mac
+// Responsible method: startOfDay5::changeState
+static const uint16 gk1SignatureDay5PhoneFreeze[] = {
+ 0x4a,
+ SIG_MAGICDWORD, SIG_UINT16(0x000c), // send 0c
+ 0x35, 0x03, // ldi 03
+ 0x65, SIG_ADDTOOFFSET(+1), // aTop cycles
+ 0x32, SIG_ADDTOOFFSET(+2), // jmp [end]
+ 0x3c, // dup
+ 0x35, 0x21, // ldi 21
+ SIG_END
+};
+
+static const uint16 gk1PatchDay5PhoneFreeze[] = {
+ PATCH_ADDTOOFFSET(+3),
+ 0x35, 0x06, // ldi 01
+ 0x65, PATCH_GETORIGINALBYTEADJUST(+6, +6), // aTop ticks
PATCH_END
};
@@ -530,63 +601,66 @@ const uint16 gk1PatchDay5PhoneFreeze[] = {
// comparison between a number an an object. In the CD version, the checks are
// in the correct order, thus the comparison is correct, thus we use the code
// from the CD version in the floppy one.
-const byte gk1SignatureInterrogationBug[] = {
- 43,
- 0x65, 0x4c, // aTop 4c
- 0x67, 0x50, // pTos 50
- 0x34, 0x10, 0x27, // ldi 2710
- 0x1e, // gt?
- 0x31, 0x08, // bnt 08 [05a0]
- 0x67, 0x50, // pTos 50
- 0x34, 0x10, 0x27, // ldi 2710
- 0x04, // sub
- 0x65, 0x50, // aTop 50
- 0x63, 0x50, // pToa 50
- 0x31, 0x15, // bnt 15 [05b9]
- 0x39, 0x0e, // pushi 0e
- 0x76, // push0
- 0x4a, 0x04, 0x00, // send 0004
- 0xa5, 0x00, // sat 00
- 0x38, 0x93, 0x00, // pushi 0093
- 0x76, // push0
- 0x63, 0x50, // pToa 50
- 0x4a, 0x04, 0x00, // send 0004
- 0x85, 0x00, // lat 00
- 0x65, 0x50, // aTop 50
- 0
+// Applies to at least: English Floppy
+// Responsible method: Interrogation::dispose
+// TODO: Check, if English Mac is affected too and if this patch applies
+static const uint16 gk1SignatureInterrogationBug[] = {
+ SIG_MAGICDWORD,
+ 0x65, 0x4c, // aTop 4c
+ 0x67, 0x50, // pTos 50
+ 0x34, SIG_UINT16(0x2710), // ldi 2710
+ 0x1e, // gt?
+ 0x31, 0x08, // bnt 08 [05a0]
+ 0x67, 0x50, // pTos 50
+ 0x34, SIG_UINT16(0x2710), // ldi 2710
+ 0x04, // sub
+ 0x65, 0x50, // aTop 50
+ 0x63, 0x50, // pToa 50
+ 0x31, 0x15, // bnt 15 [05b9]
+ 0x39, 0x0e, // pushi 0e
+ 0x76, // push0
+ 0x4a, SIG_UINT16(0x0004), // send 0004
+ 0xa5, 0x00, // sat 00
+ 0x38, SIG_SELECTOR16(dispose), // pushi dispose
+ 0x76, // push0
+ 0x63, 0x50, // pToa 50
+ 0x4a, SIG_UINT16(0x0004), // send 0004
+ 0x85, 0x00, // lat 00
+ 0x65, 0x50, // aTop 50
+ SIG_END
+};
+
+static const uint16 gk1PatchInterrogationBug[] = {
+ 0x65, 0x4c, // aTop 4c
+ 0x63, 0x50, // pToa 50
+ 0x31, 0x15, // bnt 15 [05b9]
+ 0x39, 0x0e, // pushi 0e
+ 0x76, // push0
+ 0x4a, 0x04, 0x00, // send 0004
+ 0xa5, 0x00, // sat 00
+ 0x38, SIG_SELECTOR16(dispose), // pushi dispose
+ 0x76, // push0
+ 0x63, 0x50, // pToa 50
+ 0x4a, 0x04, 0x00, // send 0004
+ 0x85, 0x00, // lat 00
+ 0x65, 0x50, // aTop 50
+ 0x67, 0x50, // pTos 50
+ 0x34, PATCH_UINT16(0x2710), // ldi 2710
+ 0x1e, // gt?
+ 0x31, 0x08, // bnt 08 [05b9]
+ 0x67, 0x50, // pTos 50
+ 0x34, PATCH_UINT16(0x2710), // ldi 2710
+ 0x04, // sub
+ 0x65, 0x50, // aTop 50
+ PATCH_END
};
-const uint16 gk1PatchInterrogationBug[] = {
- 0x65, 0x4c, // aTop 4c
- 0x63, 0x50, // pToa 50
- 0x31, 0x15, // bnt 15 [05b9]
- 0x39, 0x0e, // pushi 0e
- 0x76, // push0
- 0x4a, 0x04, 0x00, // send 0004
- 0xa5, 0x00, // sat 00
- 0x38, 0x93, 0x00, // pushi 0093
- 0x76, // push0
- 0x63, 0x50, // pToa 50
- 0x4a, 0x04, 0x00, // send 0004
- 0x85, 0x00, // lat 00
- 0x65, 0x50, // aTop 50
- 0x67, 0x50, // pTos 50
- 0x34, 0x10, 0x27, // ldi 2710
- 0x1e, // gt?
- 0x31, 0x08, // bnt 08 [05b9]
- 0x67, 0x50, // pTos 50
- 0x34, 0x10, 0x27, // ldi 2710
- 0x04, // sub
- 0x65, 0x50, // aTop 50
- PATCH_END
-};
-
-// script, description, magic DWORD, adjust
-const SciScriptSignature gk1Signatures[] = {
- { 51, "interrogation bug", 1, PATCH_MAGICDWORD(0x65, 0x4c, 0x67, 0x50), 0, gk1SignatureInterrogationBug, gk1PatchInterrogationBug },
- { 212, "day 5 phone freeze", 1, PATCH_MAGICDWORD(0x35, 0x03, 0x65, 0x1a), 0, gk1SignatureDay5PhoneFreeze, gk1PatchDay5PhoneFreeze },
- { 230, "day 6 police beignet timer issue", 1, PATCH_MAGICDWORD(0x34, 0xdc, 0x00, 0x65), -16, gk1SignatureDay6PoliceBeignet, gk1PatchDay6PoliceBeignet },
- { 230, "day 6 police sleep timer issue", 1, PATCH_MAGICDWORD(0x34, 0xdc, 0x00, 0x65), -5, gk1SignatureDay6PoliceSleep, gk1PatchDay6PoliceSleep },
+// script, description, signature patch
+static const SciScriptPatcherEntry gk1Signatures[] = {
+ { true, 51, "interrogation bug", 1, gk1SignatureInterrogationBug, gk1PatchInterrogationBug },
+ { true, 212, "day 5 phone freeze", 1, gk1SignatureDay5PhoneFreeze, gk1PatchDay5PhoneFreeze },
+ { true, 230, "day 6 police beignet timer issue", 1, gk1SignatureDay6PoliceBeignet, gk1PatchDay6PoliceBeignet },
+ { true, 230, "day 6 police sleep timer issue", 1, gk1SignatureDay6PoliceSleep, gk1PatchDay6PoliceSleep },
SCI_SIGNATUREENTRY_TERMINATOR
};
@@ -596,47 +670,47 @@ const SciScriptSignature gk1Signatures[] = {
// is later used to set master volume. This issue makes sierra sci set
// the volume to max. We fix the export, so volume won't get modified in
// those cases.
-const byte kq5SignatureCdHarpyVolume[] = {
- 34,
- 0x80, 0x91, 0x01, // lag global[191h]
- 0x18, // not
- 0x30, 0x2c, 0x00, // bnt [jump further] (jumping, if global 191h is 1)
- 0x35, 0x01, // ldi 01
- 0xa0, 0x91, 0x01, // sag global[191h] (setting global 191h to 1)
- 0x38, 0x7b, 0x01, // pushi 017b
- 0x76, // push0
- 0x81, 0x01, // lag global[1]
- 0x4a, 0x04, // send 04 - read KQ5::masterVolume
- 0xa5, 0x03, // sat temp[3] (store volume in temp 3)
- 0x38, 0x7b, 0x01, // pushi 017b
- 0x76, // push0
- 0x81, 0x01, // lag global[1]
- 0x4a, 0x04, // send 04 - read KQ5::masterVolume
- 0x36, // push
- 0x35, 0x04, // ldi 04
- 0x20, // ge? (followed by bnt)
- 0
-};
-
-const uint16 kq5PatchCdHarpyVolume[] = {
- 0x38, 0x2f, 0x02, // pushi 022f (selector theVol) (3 new bytes)
- 0x76, // push0 (1 new byte)
- 0x51, 0x88, // class SpeakTimer (2 new bytes)
- 0x4a, 0x04, // send 04 (2 new bytes) -> read SpeakTimer::theVol
- 0xa5, 0x03, // sat temp[3] (2 new bytes) -> write to temp 3
- 0x80, 0x91, 0x01, // lag global[191h]
+static const uint16 kq5SignatureCdHarpyVolume[] = {
+ SIG_MAGICDWORD,
+ 0x80, SIG_UINT16(0x0191), // lag global[191h]
+ 0x18, // not
+ 0x30, SIG_UINT16(0x002c), // bnt [jump further] (jumping, if global 191h is 1)
+ 0x35, 0x01, // ldi 01
+ 0xa0, SIG_UINT16(0x0191), // sag global[191h] (setting global 191h to 1)
+ 0x38, SIG_UINT16(0x017b), // pushi 017b
+ 0x76, // push0
+ 0x81, 0x01, // lag global[1]
+ 0x4a, 0x04, // send 04 - read KQ5::masterVolume
+ 0xa5, 0x03, // sat temp[3] (store volume in temp 3)
+ 0x38, SIG_UINT16(0x017b), // pushi 017b
+ 0x76, // push0
+ 0x81, 0x01, // lag global[1]
+ 0x4a, 0x04, // send 04 - read KQ5::masterVolume
+ 0x36, // push
+ 0x35, 0x04, // ldi 04
+ 0x20, // ge? (followed by bnt)
+ SIG_END
+};
+
+static const uint16 kq5PatchCdHarpyVolume[] = {
+ 0x38, PATCH_UINT16(0x022f), // pushi 022f (selector theVol) (3 new bytes)
+ 0x76, // push0 (1 new byte)
+ 0x51, 0x88, // class SpeakTimer (2 new bytes)
+ 0x4a, 0x04, // send 04 (2 new bytes) -> read SpeakTimer::theVol
+ 0xa5, 0x03, // sat temp[3] (2 new bytes) -> write to temp 3
+ 0x80, PATCH_UINT16(0x0191), // lag global[191h]
// saving 1 byte due optimization
- 0x2e, 0x23, 0x00, // bt [jump further] (jumping, if global 191h is 1)
- 0x35, 0x01, // ldi 01
- 0xa0, 0x91, 0x01, // sag global[191h] (setting global 191h to 1)
- 0x38, 0x7b, 0x01, // pushi 017b
- 0x76, // push0
- 0x81, 0x01, // lag global[1]
- 0x4a, 0x04, // send 04 - read KQ5::masterVolume
- 0xa5, 0x03, // sat temp[3] (store volume in temp 3)
+ 0x2e, PATCH_UINT16(0x0023), // bt [jump further] (jumping, if global 191h is 1)
+ 0x35, 0x01, // ldi 01
+ 0xa0, PATCH_UINT16(0x0191), // sag global[191h] (setting global 191h to 1)
+ 0x38, PATCH_UINT16(0x017b), // pushi 017b
+ 0x76, // push0
+ 0x81, 0x01, // lag global[1]
+ 0x4a, 0x04, // send 04 - read KQ5::masterVolume
+ 0xa5, 0x03, // sat temp[3] (store volume in temp 3)
// saving 8 bytes due removing of duplicate code
- 0x39, 0x04, // pushi 04 (saving 1 byte due swapping)
- 0x22, // lt? (because we switched values)
+ 0x39, 0x04, // pushi 04 (saving 1 byte due swapping)
+ 0x22, // lt? (because we switched values)
PATCH_END
};
@@ -648,30 +722,32 @@ const uint16 kq5PatchCdHarpyVolume[] = {
// Additionally its top,left,bottom,right properties are set to 0 rather
// than the right values. We fix the object by setting the right values.
// If they are all zero, this causes an impossible position check in
-// witch::cantBeHere and an infinite loop when entering room 22 (bug #3034714).
+// witch::cantBeHere and an infinite loop when entering room 22.
//
// This bug is accidentally not triggered in SSCI because the invalid number
// of variables effectively hides witchCage::doit, causing this position check
// to be bypassed entirely.
// See also the warning+comment in Object::initBaseObject
-const byte kq5SignatureWitchCageInit[] = {
- 16,
- 0x00, 0x00, // top
- 0x00, 0x00, // left
- 0x00, 0x00, // bottom
- 0x00, 0x00, // right
- 0x00, 0x00, // extra property #1
- 0x7a, 0x00, // extra property #2
- 0xc8, 0x00, // extra property #3
- 0xa3, 0x00, // extra property #4
- 0
-};
-
-const uint16 kq5PatchWitchCageInit[] = {
- 0x00, 0x00, // top
- 0x7a, 0x00, // left
- 0xc8, 0x00, // bottom
- 0xa3, 0x00, // right
+//
+// Fixes bug: #4964
+static const uint16 kq5SignatureWitchCageInit[] = {
+ SIG_UINT16(0x0000), // top
+ SIG_UINT16(0x0000), // left
+ SIG_UINT16(0x0000), // bottom
+ SIG_UINT16(0x0000), // right
+ SIG_UINT16(0x0000), // extra property #1
+ SIG_MAGICDWORD,
+ SIG_UINT16(0x007a), // extra property #2
+ SIG_UINT16(0x00c8), // extra property #3
+ SIG_UINT16(0x00a3), // extra property #4
+ SIG_END
+};
+
+static const uint16 kq5PatchWitchCageInit[] = {
+ PATCH_UINT16(0x0000), // top
+ PATCH_UINT16(0x007a), // left
+ PATCH_UINT16(0x00c8), // bottom
+ PATCH_UINT16(0x00a3), // right
PATCH_END
};
@@ -689,31 +765,25 @@ const uint16 kq5PatchWitchCageInit[] = {
// changes to GameFeatures::detectsetCursorType() ) and breaking savegame
// compatibilty between the DOS and Windows CD versions of KQ5.
// TODO: Investigate these side effects more closely.
-const byte kq5SignatureWinGMSignals[] = {
- 9,
- 0x80, 0x90, 0x01, // lag 0x190
- 0x18, // not
- 0x30, 0x1b, 0x00, // bnt +0x001B
- 0x89, 0x57, // lsg 0x57
- 0
+static const uint16 kq5SignatureWinGMSignals[] = {
+ SIG_MAGICDWORD,
+ 0x80, SIG_UINT16(0x0190), // lag 0x190
+ 0x18, // not
+ 0x30, SIG_UINT16(0x001b), // bnt +0x001B
+ 0x89, 0x57, // lsg 0x57
+ SIG_END
};
-const uint16 kq5PatchWinGMSignals[] = {
- 0x34, 0x01, 0x00, // ldi 0x0001
+static const uint16 kq5PatchWinGMSignals[] = {
+ 0x34, PATCH_UINT16(0x0001), // ldi 0x0001
PATCH_END
};
-// script, description, magic DWORD, adjust
-const SciScriptSignature kq5Signatures[] = {
- { 0, "CD: harpy volume change", 1, PATCH_MAGICDWORD(0x80, 0x91, 0x01, 0x18), 0, kq5SignatureCdHarpyVolume, kq5PatchCdHarpyVolume },
- { 200, "CD: witch cage init", 1, PATCH_MAGICDWORD(0x7a, 0x00, 0xc8, 0x00), -10, kq5SignatureWitchCageInit, kq5PatchWitchCageInit },
- SCI_SIGNATUREENTRY_TERMINATOR
-};
-
-const SciScriptSignature kq5WinGMSignatures[] = {
- { 0, "CD: harpy volume change", 1, PATCH_MAGICDWORD(0x80, 0x91, 0x01, 0x18), 0, kq5SignatureCdHarpyVolume, kq5PatchCdHarpyVolume },
- { 200, "CD: witch cage init", 1, PATCH_MAGICDWORD(0x7a, 0x00, 0xc8, 0x00), -10, kq5SignatureWitchCageInit, kq5PatchWitchCageInit },
- { 124, "Win: GM Music signal checks", 4, PATCH_MAGICDWORD(0x80, 0x90, 0x01, 0x18), 0, kq5SignatureWinGMSignals, kq5PatchWinGMSignals },
+// script, description, signature patch
+static const SciScriptPatcherEntry kq5Signatures[] = {
+ { true, 0, "CD: harpy volume change", 1, kq5SignatureCdHarpyVolume, kq5PatchCdHarpyVolume },
+ { true, 200, "CD: witch cage init", 1, kq5SignatureWitchCageInit, kq5PatchWitchCageInit },
+ { false, 124, "Win: GM Music signal checks", 4, kq5SignatureWinGMSignals, kq5PatchWinGMSignals },
SCI_SIGNATUREENTRY_TERMINATOR
};
@@ -725,25 +795,518 @@ const SciScriptSignature kq5WinGMSignatures[] = {
// sound is played twice, squelching all other sounds. We just rip the
// unnecessary cryMusic::check method out, thereby stopping the sound from
// constantly restarting (since it's being looped anyway), thus the normal
-// game speech can work while the baby cry sound is heard. Fixes bug #3034579.
-const byte kq6SignatureDuplicateBabyCry[] = {
- 10,
- 0x83, 0x00, // lal 00
- 0x31, 0x1e, // bnt 1e [07f4]
- 0x78, // push1
- 0x39, 0x04, // pushi 04
- 0x43, 0x75, 0x02, // callk DoAudio[75] 02
- 0
+// game speech can work while the baby cry sound is heard.
+// Fixes bug: #4955
+static const uint16 kq6SignatureDuplicateBabyCry[] = {
+ SIG_MAGICDWORD,
+ 0x83, 0x00, // lal 00
+ 0x31, 0x1e, // bnt 1e [07f4]
+ 0x78, // push1
+ 0x39, 0x04, // pushi 04
+ 0x43, 0x75, 0x02, // callk DoAudio[75] 02
+ SIG_END
+};
+
+static const uint16 kq6PatchDuplicateBabyCry[] = {
+ 0x48, // ret
+ PATCH_END
};
-const uint16 kq6PatchDuplicateBabyCry[] = {
- 0x48, // ret
+// The inventory of King's Quest 6 is buggy. When it grows too large,
+// it will get split into 2 pages. Switching between those pages will
+// grow the stack, because it's calling itself per switch.
+// Which means after a while ScummVM will bomb out because the stack frame
+// will be too large. This patch fixes the buggy script.
+// Applies to at least: PC-CD, English PC floppy, German PC floppy, English Mac
+// Responsible method: KqInv::showSelf
+// Fixes bug: #5681
+static const uint16 kq6SignatureInventoryStackFix[] = {
+ 0x67, 0x30, // pTos state
+ 0x34, SIG_UINT16(0x2000), // ldi 2000
+ 0x12, // and
+ 0x18, // not
+ 0x31, 0x04, // bnt [not first refresh]
+ 0x35, 0x00, // ldi 00
+ SIG_MAGICDWORD,
+ 0x65, 0x1e, // aTop curIcon
+ 0x67, 0x30, // pTos state
+ 0x34, SIG_UINT16(0xdfff), // ldi dfff
+ 0x12, // and
+ 0x65, 0x30, // aTop state
+ 0x38, SIG_SELECTOR16(show), // pushi "show" ("show" is e1h for KQ6CD)
+ 0x78, // push1
+ 0x87, 0x00, // lap param[0]
+ 0x31, 0x04, // bnt [use global for show]
+ 0x87, 0x01, // lap param[1]
+ 0x33, 0x02, // jmp [use param for show]
+ 0x81, 0x00, // lag global[0]
+ 0x36, // push
+ 0x54, 0x06, // self 06 (KqInv::show)
+ 0x31, SIG_ADDTOOFFSET(+1), // bnt [exit menu code] (0x08 for PC, 0x07 for mac)
+ 0x39, 0x39, // pushi 39
+ 0x76, // push0
+ 0x54, 0x04, // self 04 (KqInv::doit)
+ SIG_END // followed by jmp (0x32 for PC, 0x33 for mac)
+};
+
+static const uint16 kq6PatchInventoryStackFix[] = {
+ 0x67, 0x30, // pTos state
+ 0x3c, // dup (1 more byte, needed for patch)
+ 0x3c, // dup (1 more byte, saves 1 byte later)
+ 0x34, PATCH_UINT16(0x2000), // ldi 2000
+ 0x12, // and
+ 0x2f, 0x02, // bt [not first refresh] - saves 3 bytes in total
+ 0x65, 0x1e, // aTop curIcon
+ 0x00, // neg (either 2000 or 0000 in acc, this will create dfff or ffff) - saves 2 bytes
+ 0x12, // and
+ 0x65, 0x30, // aTop state
+ 0x38, // pushi "show"
+ PATCH_GETORIGINALBYTE(+22),
+ PATCH_GETORIGINALBYTE(+23),
+ 0x78, // push1
+ 0x87, 0x00, // lap param[0]
+ 0x31, 0x04, // bnt [call show using global 0]
+ 0x8f, 0x01, // lsp param[1], save 1 byte total with lsg global[0] combined
+ 0x33, 0x02, // jmp [call show using param 1]
+ 0x89, 0x00, // lsg global[0], save 1 byte total, see above
+ 0x54, 0x06, // self 06 (call x::show)
+ 0x31, // bnt [menu exit code]
+ PATCH_GETORIGINALBYTEADJUST(+39, +6),// dynamic offset must be 0x0E for PC and 0x0D for mac
+ 0x34, PATCH_UINT16(0x2000), // ldi 2000
+ 0x12, // and
+ 0x2f, 0x05, // bt [to return]
+ 0x39, 0x39, // pushi 39
+ 0x76, // push0
+ 0x54, 0x04, // self 04 (self::doit)
+ 0x48, // ret (saves 2 bytes for PC, 1 byte for mac)
PATCH_END
};
-// script, description, magic DWORD, adjust
-const SciScriptSignature kq6Signatures[] = {
- { 481, "duplicate baby cry", 1, PATCH_MAGICDWORD(0x83, 0x00, 0x31, 0x1e), 0, kq6SignatureDuplicateBabyCry, kq6PatchDuplicateBabyCry },
+// The "Drink Me" bottle code doesn't repaint the AddToPics elements to the screen,
+// when Alexander returns back from the effect of the bottle.
+// It's pretty strange that Sierra didn't find this bug, because it occurs when
+// drinking the bottle right on the screen, where the bottle is found.
+// This bug also occurs in Sierra SCI.
+// Applies to at least: PC-CD, English PC floppy, German PC floppy, English Mac
+// Responsible method: drinkMeScript::changeState
+// Fixes bug: #5252
+static const uint16 kq6SignatureDrinkMeFix[] = {
+ SIG_MAGICDWORD,
+ 0x3c, // dup
+ 0x35, 0x0f, // ldi 0f
+ 0x1a, // eq?
+ 0x30, SIG_UINT16(0x00a4), // bnt [skip to next check]
+ SIG_ADDTOOFFSET(+161),
+ 0x32, SIG_UINT16(0x007f), // jmp [return]
+ 0x3c, // dup
+ 0x35, 0x10, // ldi 10
+ 0x1a, // eq?
+ 0x31, 0x07, // bnt [skip to next check]
+ 0x35, 0x03, // ldi 03
+ 0x65, 0x1a, // aTop (cycles)
+ 0x32, SIG_UINT16(0x0072), // jmp [return]
+ 0x3c, // dup
+ 0x35, 0x11, // ldi 11
+ 0x1a, // eq?
+ 0x31, 0x13, // bnt [skip to next check]
+ SIG_ADDTOOFFSET(+20),
+ 0x35, 0x12, // ldi 12
+ SIG_ADDTOOFFSET(+23),
+ 0x35, 0x13, // ldi 13
+ SIG_END
+};
+
+static const uint16 kq6PatchDrinkMeFix[] = {
+ PATCH_ADDTOOFFSET(+5), // skip to bnt offset
+ PATCH_GETORIGINALBYTEADJUST(+5, +13), // adjust jump to [check for 11h code]
+ PATCH_ADDTOOFFSET(+162),
+ 0x39, PATCH_SELECTOR8(doit), // pushi (doit)
+ 0x76, // push0
+ 0x81, 0x0a, // lag 0a
+ 0x4a, 0x04, // send 04 (call addToPics::doit)
+ 0x3a, // toss
+ 0x48, // ret
+ PATCH_ADDTOOFFSET(+8), // skip to check 11h code
+ 0x35, 0x10, // ldi 10 instead of 11
+ PATCH_ADDTOOFFSET(+23), // skip to check 12h code
+ 0x35, 0x11, // ldi 11 instead of 12
+ PATCH_ADDTOOFFSET(+23), // skip to check 13h code
+ 0x35, 0x12, // ldi 12 instead of 13
+ PATCH_END
+};
+
+// Audio + subtitles support - SHARED! - used for King's Quest 6 and Laura Bow 2
+// this patch gets enabled, when the user selects "both" in the ScummVM "Speech + Subtitles" menu
+// We currently use global 98d to hold a kMemory pointer.
+// Applies to at least: KQ6 PC-CD, LB2 PC-CD
+// Patched method: Messager::sayNext / lb2Messager::sayNext (always use text branch)
+static const uint16 kq6laurabow2CDSignatureAudioTextSupport1[] = {
+ 0x89, 0x5a, // lsg global[5a]
+ 0x35, 0x02, // ldi 02
+ 0x12, // and
+ SIG_MAGICDWORD,
+ 0x31, 0x13, // bnt [audio call]
+ 0x38, SIG_SELECTOR16(modNum), // pushi modNum
+ SIG_END
+};
+
+static const uint16 kq6laurabow2CDPatchAudioTextSupport1[] = {
+ PATCH_ADDTOOFFSET(+5),
+ 0x33, 0x13, // jmp [audio call]
+ PATCH_END
+};
+
+// Applies to at least: KQ6 PC-CD, LB2 PC-CD
+// Patched method: Messager::sayNext / lb2Messager::sayNext (allocate audio memory)
+static const uint16 kq6laurabow2CDSignatureAudioTextSupport2[] = {
+ 0x7a, // push2
+ 0x78, // push1
+ 0x39, 0x0c, // pushi 0c
+ 0x43, SIG_MAGICDWORD, 0x72, 0x04, // kMemory
+ 0xa5, 0xc9, // sat global[c9]
+ SIG_END
+};
+
+static const uint16 kq6laurabow2CDPatchAudioTextSupport2[] = {
+ PATCH_ADDTOOFFSET(+7),
+ 0xa1, 98, // sag global[98d]
+ PATCH_END
+};
+
+// Applies to at least: KQ6 PC-CD, LB2 PC-CD
+// Patched method: Messager::sayNext / lb2Messager::sayNext (release audio memory)
+static const uint16 kq6laurabow2CDSignatureAudioTextSupport3[] = {
+ 0x7a, // push2
+ 0x39, 0x03, // pushi 03
+ SIG_MAGICDWORD,
+ 0x8d, 0xc9, // lst temp[c9]
+ 0x43, 0x72, 0x04, // kMemory
+ SIG_END
+};
+
+static const uint16 kq6laurabow2CDPatchAudioTextSupport3[] = {
+ PATCH_ADDTOOFFSET(+3),
+ 0x89, 98, // lsg global[98d]
+ PATCH_END
+};
+
+// startText call gets acc = 0 for text-only and acc = 2 for audio+text
+// Applies to at least: KQ6 PC-CD, LB2 PC-CD
+// Patched method: Narrator::say (use audio memory)
+static const uint16 kq6laurabow2CDSignatureAudioTextSupport4[] = {
+ // set caller property code
+ 0x31, 0x08, // bnt [set acc to 0 for caller]
+ 0x87, 0x02, // lap param[2]
+ 0x31, 0x04, // bnt [set acc to 0 for caller]
+ 0x87, 0x02, // lap param[2]
+ 0x33, 0x02, // jmp [set caller]
+ 0x35, 0x00, // ldi 00
+ 0x65, 0x68, // aTop caller
+ // call startText + startAudio code
+ 0x89, 0x5a, // lsg global[5a]
+ 0x35, 0x01, // ldi 01
+ 0x12, // and
+ 0x31, 0x08, // bnt [skip code]
+ 0x38, SIG_SELECTOR16(startText), // pushi startText
+ 0x78, // push1
+ 0x8f, 0x01, // lsp param[1]
+ 0x54, 0x06, // self 06
+ 0x89, 0x5a, // lsg global[5a]
+ 0x35, 0x02, // ldi 02
+ 0x12, // and
+ 0x31, 0x08, // bnt [skip code]
+ SIG_MAGICDWORD,
+ 0x38, SIG_SELECTOR16(startAudio), // pushi startAudio
+ 0x78, // push1
+ 0x8f, 0x01, // lsp param[1]
+ 0x54, 0x06, // self 06
+ SIG_END
+};
+
+static const uint16 kq6laurabow2CDPatchAudioTextSupport4[] = {
+ 0x31, 0x02, // bnt [set caller]
+ 0x87, 0x02, // lap param[2]
+ 0x65, 0x68, // aTop caller
+ 0x81, 0x5a, // lag global[5a]
+ 0x78, // push1
+ 0x12, // and
+ 0x31, 0x11, // bnt [skip startText code]
+ 0x81, 0x5a, // lag global[5a]
+ 0x7a, // push2
+ 0x12, // and
+ 0x33, 0x03, // skip over 3 unused bytes
+ PATCH_ADDTOOFFSET(+22),
+ 0x89, 98, // lsp global[98d]
+ PATCH_END
+};
+
+// Applies to at least: KQ6 PC-CD, LB2 PC-CD
+// Patched method: Talker::display/Narrator::say (remove reset saved mouse cursor code)
+// code would screw over mouse cursor
+static const uint16 kq6laurabow2CDSignatureAudioTextSupport5[] = {
+ SIG_MAGICDWORD,
+ 0x35, 0x00, // ldi 00
+ 0x65, 0x82, // aTop saveCursor
+ SIG_END
+};
+
+static const uint16 kq6laurabow2CDPatchAudioTextSupport5[] = {
+ 0x18, 0x18, 0x18, 0x18, // waste bytes, do nothing
+ PATCH_END
+};
+
+// Additional patch specifically for King's Quest 6
+// Fixes text window placement, when in "dual" mode
+// Applies to at least: PC-CD
+// Patched method: Kq6Talker::init
+static const uint16 kq6CDSignatureAudioTextSupport1[] = {
+ SIG_MAGICDWORD,
+ 0x89, 0x5a, // lsg global[5a]
+ 0x35, 0x02, // ldi 02
+ 0x1a, // eq?
+ 0x31, SIG_ADDTOOFFSET(+1), // bnt [jump-to-text-code]
+ 0x78, // push1
+ SIG_END
+};
+
+static const uint16 kq6CDPatchAudioTextSupport1[] = {
+ PATCH_ADDTOOFFSET(+4),
+ 0x12, // and
+ PATCH_END
+};
+
+// Additional patch specifically for King's Quest 6
+// Fixes low-res portrait staying on screen for hi-res mode
+// Applies to at least: PC-CD
+// Patched method: Talker::startText
+// this method is called by Narrator::say and acc is 0 for text-only and 2 for dual mode (audio+text)
+static const uint16 kq6CDSignatureAudioTextSupport2[] = {
+ SIG_MAGICDWORD,
+ 0x3f, 0x01, // link 01
+ 0x63, 0x8a, // pToa viewInPrint
+ 0x18, // not
+ 0x31, 0x06, // bnt [skip following code]
+ 0x38, SIG_UINT16(0x00e1), // pushi 00e1
+ 0x76, // push0
+ 0x54, 0x04, // self 04
+ SIG_END
+};
+
+static const uint16 kq6CDPatchAudioTextSupport2[] = {
+ PATCH_ADDTOOFFSET(+2),
+ 0x67, 0x8a, // pTos viewInPrint
+ 0x14, // or
+ 0x2f, // bt [skip following code]
+ PATCH_END
+};
+
+// Additional patch specifically for King's Quest 6
+// Fixes special windows, used for example in the Pawn shop (room 280),
+// when the man in a robe complains about no more mints.
+// We have to change even more code, because the game uses PODialog class for
+// text windows and myDialog class for audio. Both are saved to KQ6Print::dialog
+// Sadly PODialog is created during KQ6Print::addText, myDialog is set during
+// KQ6Print::showSelf, which is called much later and KQ6Print::addText requires
+// KQ6Print::dialog to be set, which means we have to set it before calling addText
+// for audio mode, otherwise the user would have to click to get those windows disposed.
+// Applies to at least: PC-CD
+// Patched method: KQ6Print::say
+static const uint16 kq6CDSignatureAudioTextSupport3[] = {
+ 0x31, 0x6e, // bnt [to text code]
+ SIG_ADDTOOFFSET(+85),
+ SIG_MAGICDWORD,
+ 0x8f, 0x01, // lsp param[1]
+ 0x35, 0x01, // ldi 01
+ 0x1a, // eq?
+ 0x31, 0x0c, // bnt [code to set property repressText to 1]
+ 0x38, // pushi (selector addText)
+ SIG_ADDTOOFFSET(+9), // skip addText-calling code
+ 0x33, 0x10, // jmp [to ret]
+ 0x35, 0x01, // ldi 01
+ 0x65, 0x2e, // aTop repressText
+ 0x33, 0x0a, // jmp [to ret]
+ SIG_END
+};
+
+static const uint16 kq6CDPatchAudioTextSupport3[] = {
+ 0x31, 0x5c, // adjust jump to reuse audio mode addText-calling code
+ PATCH_ADDTOOFFSET(102),
+ 0x48, // ret
+ 0x48, // ret (waste byte)
+ 0x72, 0x0e, 0x00, // lofsa myDialog
+ 0x65, 0x12, // aTop dialog
+ 0x33, 0xed, // jump back to audio mode addText-calling code
+ PATCH_END
+};
+
+// Additional patch specifically for King's Quest 6
+// Fixes text-window size for hires portraits mode
+// Otherwise at least at the end some text-windows will be way too small
+// Applies to at least: PC-CD
+// Patched method: Talker::init
+static const uint16 kq6CDSignatureAudioTextSupport4[] = {
+ SIG_MAGICDWORD,
+ 0x63, 0x94, // pToa raving
+ 0x31, 0x0a, // bnt [no rave code]
+ 0x35, 0x00, // ldi 00
+ SIG_ADDTOOFFSET(6), // skip reset of bust, eyes and mouth
+ 0x33, 0x24, // jmp [to super class code]
+ SIG_END
+};
+
+static const uint16 kq6CDPatchAudioTextSupport4[] = {
+ PATCH_ADDTOOFFSET(+12),
+ 0x33, PATCH_GETORIGINALBYTEADJUST(+13, -6), // adjust jump to also include setSize call
+ PATCH_END
+};
+
+// Fixes text window placement, when dual mode is active (Guards in room 220)
+// Applies to at least: PC-CD
+// Patched method: tlkGateGuard1::init & tlkGateGuard2::init
+static const uint16 kq6CDSignatureAudioTextSupportGuards[] = {
+ SIG_MAGICDWORD,
+ 0x89, 0x5a, // lsg global[5a]
+ 0x35, 0x01, // ldi 01
+ 0x1a, // eq?
+ SIG_END // followed by bnt for Guard1 and bt for Guard2
+};
+
+static const uint16 kq6CDPatchAudioTextSupportGuards[] = {
+ PATCH_ADDTOOFFSET(+2),
+ 0x35, 0x02, // ldi 02
+ 0x1c, // ne?
+ PATCH_END
+};
+
+// Fixes text window placement, when portrait+text is shown (Stepmother in room 250)
+// Applies to at least: PC-CD
+// Patched method: tlkStepmother::init
+static const uint16 kq6CDSignatureAudioTextSupportStepmother[] = {
+ SIG_MAGICDWORD,
+ 0x89, 0x5a, // lsg global[5a]
+ 0x35, 0x02, // ldi 02
+ 0x12, // and
+ 0x31, // bnt [jump-for-text-code]
+ SIG_END
+};
+
+static const uint16 kq6CDPatchAudioTextSupportJumpAlways[] = {
+ PATCH_ADDTOOFFSET(+4),
+ 0x1a, // eq?
+ PATCH_END
+};
+
+// Fixes "Girl In The Tower" to get played in dual mode as well
+// Applies to at least: PC-CD
+// Patched method: rm740::cue
+static const uint16 kq6CDSignatureAudioTextSupportGirlInTheTower[] = {
+ SIG_MAGICDWORD,
+ 0x89, 0x5a, // lsg global[5a]
+ 0x35, 0x02, // ldi 02
+ 0x1a, // eq?
+ 0x31, // bnt [jump-for-text-code]
+ SIG_END
+};
+
+static const uint16 kq6CDPatchAudioTextSupportGirlInTheTower[] = {
+ PATCH_ADDTOOFFSET(+4),
+ 0x12, // and
+ PATCH_END
+};
+
+// Additional patch specifically for King's Quest 6
+// Adds another button state for the text/audio button. We currently use the "speech" view for "dual" mode.
+// View 947, loop 9, cel 0+1 -> "text"
+// View 947, loop 8, cel 0+1 -> "speech"
+// View 947, loop 12, cel 0+1 -> "dual" (this view is injected by us into the game)
+// Applies to at least: PC-CD
+// Patched method: iconTextSwitch::show, iconTextSwitch::doit
+static const uint16 kq6CDSignatureAudioTextMenuSupport[] = {
+ SIG_MAGICDWORD,
+ 0x89, 0x5a, // lsg global[5a]
+ 0x35, 0x02, // ldi 02
+ 0x1a, // eq?
+ 0x31, 0x06, // bnt [set text view]
+ 0x35, 0x08, // ldi 08
+ 0x65, 0x14, // aTop loop
+ 0x33, 0x04, // jmp [skip over text view]
+ 0x35, 0x09, // ldi 09
+ 0x65, 0x14, // aTop loop
+ SIG_ADDTOOFFSET(+102), // skip to iconTextSwitch::doit code
+ 0x89, 0x5a, // lsg global[5a]
+ 0x3c, // dup
+ 0x35, 0x01, // ldi 01
+ 0x1a, // eq?
+ 0x31, 0x06, // bnt [set text mode]
+ 0x35, 0x02, // ldi 02
+ 0xa1, 0x5a, // sag global[5a]
+ 0x33, 0x0a, // jmp [skip over text mode code]
+ 0x3c, // dup
+ 0x35, 0x02, // ldi 02
+ 0x1a, // eq?
+ 0x31, 0x04, // bnt [skip over text ode code]
+ 0x35, 0x01, // ldi 01
+ 0xa1, 0x5a, // sag global[5a]
+ 0x3a, // toss
+ 0x67, 0x14, // pTos loop
+ 0x35, 0x09, // ldi 09
+ 0x1a, // eq?
+ 0x31, 0x04, // bnt [set text view]
+ 0x35, 0x08, // ldi 08
+ 0x33, 0x02, // jmp [skip text view]
+ 0x35, 0x09, // ldi 09
+ 0x65, 0x14, // aTop loop
+ SIG_END
+};
+
+static const uint16 kq6CDPatchAudioTextMenuSupport[] = {
+ PATCH_ADDTOOFFSET(+13),
+ 0x33, 0x79, // jmp to new text+dual code
+ PATCH_ADDTOOFFSET(+104), // seek to iconTextSwitch::doit
+ 0x81, 0x5a, // lag global[5a]
+ 0x78, // push1
+ 0x02, // add
+ 0xa1, 0x5a, // sag global[5a]
+ 0x36, // push
+ 0x35, 0x03, // ldi 03
+ 0x1e, // gt?
+ 0x31, 0x03, // bnt [skip over]
+ 0x78, // push1
+ 0xa9, 0x5a, // ssg global[5a]
+ 0x33, 0x17, // jmp [iconTextSwitch::show call]
+ // additional code for iconTextSwitch::show
+ 0x89, 0x5a, // lsg global[5a]
+ 0x35, 0x01, // ldi 01
+ 0x1a, // eq?
+ 0x31, 0x04, // bnt [dual mode]
+ 0x35, 0x09, // ldi 09
+ 0x33, 0x02, // jmp [skip over dual mode]
+ 0x35, 0x0c, // ldi 0c (view 947, loop 12, cel 0+1 is our "dual" view, injected by view.cpp)
+ 0x65, 0x14, // aTop loop
+ 0x32, PATCH_UINT16(0xff75), // jmp [back to iconTextSwitch::show]
+ PATCH_END
+};
+
+// script, description, signature patch
+static const SciScriptPatcherEntry kq6Signatures[] = {
+ { true, 481, "duplicate baby cry", 1, kq6SignatureDuplicateBabyCry, kq6PatchDuplicateBabyCry },
+ { true, 907, "inventory stack fix", 1, kq6SignatureInventoryStackFix, kq6PatchInventoryStackFix },
+ { true, 87, "Drink Me bottle fix", 1, kq6SignatureDrinkMeFix, kq6PatchDrinkMeFix },
+ // King's Quest 6 and Laura Bow 2 share basic patches for audio + text support
+ // *** King's Quest 6 audio + text support ***
+ { false, 924, "CD: audio + text support KQ6&LB2 1", 1, kq6laurabow2CDSignatureAudioTextSupport1, kq6laurabow2CDPatchAudioTextSupport1 },
+ { false, 924, "CD: audio + text support KQ6&LB2 2", 1, kq6laurabow2CDSignatureAudioTextSupport2, kq6laurabow2CDPatchAudioTextSupport2 },
+ { false, 924, "CD: audio + text support KQ6&LB2 3", 1, kq6laurabow2CDSignatureAudioTextSupport3, kq6laurabow2CDPatchAudioTextSupport3 },
+ { false, 928, "CD: audio + text support KQ6&LB2 4", 1, kq6laurabow2CDSignatureAudioTextSupport4, kq6laurabow2CDPatchAudioTextSupport4 },
+ { false, 928, "CD: audio + text support KQ6&LB2 5", 2, kq6laurabow2CDSignatureAudioTextSupport5, kq6laurabow2CDPatchAudioTextSupport5 },
+ { false, 909, "CD: audio + text support KQ6 1", 2, kq6CDSignatureAudioTextSupport1, kq6CDPatchAudioTextSupport1 },
+ { false, 928, "CD: audio + text support KQ6 2", 1, kq6CDSignatureAudioTextSupport2, kq6CDPatchAudioTextSupport2 },
+ { false, 104, "CD: audio + text support KQ6 3", 1, kq6CDSignatureAudioTextSupport3, kq6CDPatchAudioTextSupport3 },
+ { false, 928, "CD: audio + text support KQ6 4", 1, kq6CDSignatureAudioTextSupport4, kq6CDPatchAudioTextSupport4 },
+ { false, 1009, "CD: audio + text support KQ6 Guards", 2, kq6CDSignatureAudioTextSupportGuards, kq6CDPatchAudioTextSupportGuards },
+ { false, 1027, "CD: audio + text support KQ6 Stepmother", 1, kq6CDSignatureAudioTextSupportStepmother, kq6CDPatchAudioTextSupportJumpAlways },
+ { false, 740, "CD: audio + text support KQ6 Girl In The Tower", 1, kq6CDSignatureAudioTextSupportGirlInTheTower, kq6CDPatchAudioTextSupportGirlInTheTower },
+ { false, 903, "CD: audio + text support KQ6 menu", 1, kq6CDSignatureAudioTextMenuSupport, kq6CDPatchAudioTextMenuSupport },
SCI_SIGNATUREENTRY_TERMINATOR
};
@@ -756,40 +1319,40 @@ const SciScriptSignature kq6Signatures[] = {
// the function is undefined, thus kStrCat() that is called inside the function
// reads a random pointer and crashes. We patch all of the 5 function calls
// (one for each letter typed from "R", "O", "B", "I", "N") so that they are
-// the same as the English version. Fixes bug #3048054.
-const byte longbowSignatureShowHandCode[] = {
- 3,
- 0x78, // push1
- 0x78, // push1
- 0x72, // lofsa
- +2, 2, // skip 2 bytes, offset of lofsa (the letter typed)
- 0x36, // push
- 0x40, // call
- +2, 3, // skip 2 bytes, offset of call
- 0x02, // perform the call above with 2 parameters
- 0x36, // push
- 0x40, // call
- +2, 8, // skip 2 bytes, offset of call
- 0x02, // perform the call above with 2 parameters
- 0x38, 0x1c, 0x01, // pushi 011c (setMotion)
- 0x39, 0x04, // pushi 04 (x)
- 0x51, 0x1e, // class MoveTo
- 0
-};
-
-const uint16 longbowPatchShowHandCode[] = {
- 0x39, 0x01, // pushi 1 (combine the two push1's in one, like in the English version)
- PATCH_ADDTOOFFSET | +3, // leave the lofsa call untouched
+// the same as the English version.
+// Applies to at least: German floppy
+// Responsible method: unknown
+// Fixes bug: #5264
+static const uint16 longbowSignatureShowHandCode[] = {
+ 0x78, // push1
+ 0x78, // push1
+ 0x72, SIG_ADDTOOFFSET(+2), // lofsa (letter, that was typed)
+ 0x36, // push
+ 0x40, SIG_ADDTOOFFSET(+2), // call
+ 0x02, // perform the call above with 2 parameters
+ 0x36, // push
+ 0x40, SIG_ADDTOOFFSET(+2), // call
+ SIG_MAGICDWORD,
+ 0x02, // perform the call above with 2 parameters
+ 0x38, SIG_SELECTOR16(setMotion), // pushi "setMotion" (0x11c in Longbow German)
+ 0x39, SIG_SELECTOR8(x), // pushi "x" (0x04 in Longbow German)
+ 0x51, 0x1e, // class MoveTo
+ SIG_END
+};
+
+static const uint16 longbowPatchShowHandCode[] = {
+ 0x39, 0x01, // pushi 1 (combine the two push1's in one, like in the English version)
+ PATCH_ADDTOOFFSET(+3), // leave the lofsa call untouched
// The following will remove the duplicate call
- 0x32, 0x02, 0x00, // jmp 02 - skip 2 bytes (the remainder of the first call)
- 0x48, // ret (dummy, should never be reached)
- 0x48, // ret (dummy, should never be reached)
+ 0x32, PATCH_UINT16(0x0002), // jmp 02 - skip 2 bytes (the remainder of the first call)
+ 0x48, // ret (dummy, should never be reached)
+ 0x48, // ret (dummy, should never be reached)
PATCH_END
};
-// script, description, magic DWORD, adjust
-const SciScriptSignature longbowSignatures[] = {
- { 210, "hand code crash", 5, PATCH_MAGICDWORD(0x02, 0x38, 0x1c, 0x01), -14, longbowSignatureShowHandCode, longbowPatchShowHandCode },
+// script, description, signature patch
+static const SciScriptPatcherEntry longbowSignatures[] = {
+ { true, 210, "hand code crash", 5, longbowSignatureShowHandCode, longbowPatchShowHandCode },
SCI_SIGNATUREENTRY_TERMINATOR
};
@@ -807,31 +1370,60 @@ const SciScriptSignature longbowSignatures[] = {
// "worked" in SSCI, but ScummVM/SCI doesn't allow that.
// That's why those points weren't granted here at all.
// We patch the script to use global 90, which seems to be unused in the whole game.
+// Applies to at least: English floppy
// Responsible method: rm63Script::handleEvent
-// Fixes bug #3614419
-const byte larry2SignatureWearParachutePoints[] = {
- 16,
- 0x35, 0x01, // ldi 01
- 0xa1, 0x8e, // sag 8e
- 0x80, 0xe0, 0x01, // lag 1e0
- 0x18, // not
- 0x30, 0x0f, 0x00, // bnt [don't give points]
- 0x35, 0x01, // ldi 01
- 0xa0, 0xe0, 0x01, // sag 1e0
- 0
+// Fixes bug: #6346
+static const uint16 larry2SignatureWearParachutePoints[] = {
+ 0x35, 0x01, // ldi 01
+ 0xa1, SIG_MAGICDWORD, 0x8e, // sag 8e
+ 0x80, SIG_UINT16(0x01e0), // lag 1e0
+ 0x18, // not
+ 0x30, SIG_UINT16(0x000f), // bnt [don't give points]
+ 0x35, 0x01, // ldi 01
+ 0xa0, 0xe0, 0x01, // sag 1e0
+ SIG_END
+};
+
+static const uint16 larry2PatchWearParachutePoints[] = {
+ PATCH_ADDTOOFFSET(+4),
+ 0x80, PATCH_UINT16(0x005a), // lag 5a (global 90)
+ PATCH_ADDTOOFFSET(+6),
+ 0xa0, PATCH_UINT16(0x005a), // sag 5a (global 90)
+ PATCH_END
};
-const uint16 larry2PatchWearParachutePoints[] = {
- PATCH_ADDTOOFFSET | +4,
- 0x80, 0x5a, 0x00, // lag 5a (global 90)
- PATCH_ADDTOOFFSET | +6,
- 0xa0, 0x5a, 0x00, // sag 5a (global 90)
+// script, description, signature patch
+static const SciScriptPatcherEntry larry2Signatures[] = {
+ { true, 63, "plane: no points for wearing plane", 1, larry2SignatureWearParachutePoints, larry2PatchWearParachutePoints },
+ SCI_SIGNATUREENTRY_TERMINATOR
+};
+
+// ===========================================================================
+// Leisure Suit Larry 5
+// In one of the conversations near the end (to be exact - room 380 and the text
+// about using champagne on Reverse Biaz - only used when you actually did that
+// in the game), the German text is too large, causing the textbox to get too large.
+// Because of that the talking head of Patti is drawn over the textbox. A translation oversight.
+// Applies to at least: German floppy
+// Responsible method: none, position of talker object on screen needs to get modified
+static const uint16 larry5SignatureGermanEndingPattiTalker[] = {
+ SIG_MAGICDWORD,
+ SIG_UINT16(0x006e), // object pattiTalker::x (110)
+ SIG_UINT16(0x00b4), // object pattiTalker::y (180)
+ SIG_ADDTOOFFSET(+469), // verify that it's really the German version
+ 0x59, 0x6f, 0x75, // (object name) "You"
+ 0x23, 0x47, 0x44, 0x75, // "#GDu"
+ SIG_END
+};
+
+static const uint16 larry5PatchGermanEndingPattiTalker[] = {
+ PATCH_UINT16(0x005a), // change pattiTalker::x to 90
PATCH_END
};
-// script, description, magic DWORD, adjust
-const SciScriptSignature larry2Signatures[] = {
- { 63, "plane: no points for wearing plane", 1, PATCH_MAGICDWORD(0x8e, 0x80, 0xe0, 0x01), -3, larry2SignatureWearParachutePoints, larry2PatchWearParachutePoints },
+// script, description, signature patch
+static const SciScriptPatcherEntry larry5Signatures[] = {
+ { true, 380, "German-only: Enlarge Patti Textbox", 1, larry5SignatureGermanEndingPattiTalker, larry5PatchGermanEndingPattiTalker },
SCI_SIGNATUREENTRY_TERMINATOR
};
@@ -843,77 +1435,346 @@ const SciScriptSignature larry2Signatures[] = {
// doesn't happen anymore. We would otherwise get a crash
// calling for invalid views (this happens of course also
// in sierra sci)
-const byte larry6SignatureDeathDialog[] = {
- 7,
- 0x3e, 0x33, 0x01, // link 0133 (offset 0x20)
- 0x35, 0xff, // ldi ff
- 0xa3, 0x00, // sal 00
- +255, 0,
- +255, 0,
- +170, 12, // [skip 680 bytes]
- 0x8f, 0x01, // lsp 01 (offset 0x2cf)
- 0x7a, // push2
- 0x5a, 0x04, 0x00, 0x0e, 0x01, // lea 0004 010e
- 0x36, // push
- 0x43, 0x7c, 0x0e, // kMessage[7c] 0e
- +90, 10, // [skip 90 bytes]
- 0x38, 0xd6, 0x00, // pushi 00d6 (offset 0x335)
- 0x78, // push1
- 0x5a, 0x04, 0x00, 0x0e, 0x01, // lea 0004 010e
- 0x36, // push
- +76, 11, // [skip 76 bytes]
- 0x38, 0xcd, 0x00, // pushi 00cd (offset 0x38b)
- 0x39, 0x03, // pushi 03
- 0x5a, 0x04, 0x00, 0x0e, 0x01, // lea 0004 010e
+// Applies to at least: German PC-CD
+// Responsible method: unknown
+static const uint16 larry6SignatureDeathDialog[] = {
+ SIG_MAGICDWORD,
+ 0x3e, SIG_UINT16(0x0133), // link 0133 (offset 0x20)
+ 0x35, 0xff, // ldi ff
+ 0xa3, 0x00, // sal 00
+ SIG_ADDTOOFFSET(+680), // [skip 680 bytes]
+ 0x8f, 0x01, // lsp 01 (offset 0x2cf)
+ 0x7a, // push2
+ 0x5a, SIG_UINT16(0x0004), SIG_UINT16(0x010e), // lea 0004 010e
+ 0x36, // push
+ 0x43, 0x7c, 0x0e, // kMessage[7c] 0e
+ SIG_ADDTOOFFSET(+90), // [skip 90 bytes]
+ 0x38, SIG_UINT16(0x00d6), // pushi 00d6 (offset 0x335)
+ 0x78, // push1
+ 0x5a, SIG_UINT16(0x0004), SIG_UINT16(0x010e), // lea 0004 010e
+ 0x36, // push
+ SIG_ADDTOOFFSET(+76), // [skip 76 bytes]
+ 0x38, SIG_UINT16(0x00cd), // pushi 00cd (offset 0x38b)
+ 0x39, 0x03, // pushi 03
+ 0x5a, SIG_UINT16(0x0004), SIG_UINT16(0x010e), // lea 0004 010e
0x36,
- 0
+ SIG_END
};
-const uint16 larry6PatchDeathDialog[] = {
- 0x3e, 0x00, 0x02, // link 0200
- PATCH_ADDTOOFFSET | +687,
- 0x5a, 0x04, 0x00, 0x40, 0x01, // lea 0004 0140
- PATCH_ADDTOOFFSET | +98,
- 0x5a, 0x04, 0x00, 0x40, 0x01, // lea 0004 0140
- PATCH_ADDTOOFFSET | +82,
- 0x5a, 0x04, 0x00, 0x40, 0x01, // lea 0004 0140
+static const uint16 larry6PatchDeathDialog[] = {
+ 0x3e, 0x00, 0x02, // link 0200
+ PATCH_ADDTOOFFSET(+687),
+ 0x5a, PATCH_UINT16(0x0004), PATCH_UINT16(0x0140), // lea 0004 0140
+ PATCH_ADDTOOFFSET(+98),
+ 0x5a, PATCH_UINT16(0x0004), PATCH_UINT16(0x0140), // lea 0004 0140
+ PATCH_ADDTOOFFSET(+82),
+ 0x5a, PATCH_UINT16(0x0004), PATCH_UINT16(0x0140), // lea 0004 0140
PATCH_END
};
-// script, description, magic DWORD, adjust
-const SciScriptSignature larry6Signatures[] = {
- { 82, "death dialog memory corruption", 1, PATCH_MAGICDWORD(0x3e, 0x33, 0x01, 0x35), 0, larry6SignatureDeathDialog, larry6PatchDeathDialog },
+// script, description, signature patch
+static const SciScriptPatcherEntry larry6Signatures[] = {
+ { true, 82, "death dialog memory corruption", 1, larry6SignatureDeathDialog, larry6PatchDeathDialog },
SCI_SIGNATUREENTRY_TERMINATOR
};
// ===========================================================================
-// rm560::doit was supposed to close the painting, when Heimlich enters the
-// room. The code is buggy, so it actually closes the painting, when heimlich
-// is not in the room. We fix that.
-const byte laurabow2SignaturePaintingClosing[] = {
- 17,
- 0x4a, 0x04, // send 04 - read aHeimlich::room
- 0x36, // push
- 0x81, 0x0b, // lag global[11d] -> current room
- 0x1c, // ne?
- 0x31, 0x0e, // bnt [don't close]
- 0x35, 0x00, // ldi 00
- 0xa3, 0x00, // sal local[0]
- 0x38, 0x92, 0x00, // pushi 0092
- 0x78, // push1
- 0x72, // lofsa sDumpSafe
- 0
+// Laura Bow 2
+//
+// Moving away the painting in the room with the hidden safe is problematic
+// for the CD version of the game. safePic::doVerb gets triggered by the mouse-click.
+// This method sets local 0 as signal, which is only meant to get handled, when
+// the player clicks again to move the painting back. This signal is processed by
+// the room doit-script.
+// That doit-script checks safePic::cel to be not equal 0 and would then skip over
+// the "close painting" trigger code. On very fast computers this script may
+// get called too early (which is the case when running under ScummVM and when
+// running the game using Sierra SCI in DOS-Box with cycles 15000) and thinks
+// that it's supposed to move the painting back. Which then results in the painting
+// getting moved to its original position immediately (which means it won't be possible
+// to access the safe behind it).
+//
+// We patch the script, so that we check for cel to be not equal 4 (the final cel) and
+// we also reset the safePic-signal immediately as well.
+//
+// In the floppy version Laura's coordinates are checked directly in rm560::doit
+// and as soon as she moves, the painting will automatically move to its original position.
+// This is not the case for the CD version of the game. The painting will only "move" back,
+// when the player actually exits the room and re-enters.
+//
+// Applies to at least: English PC-CD
+// Responsible method: rm560::doit
+// Fixes bug: #6460
+static const uint16 laurabow2CDSignaturePaintingClosing[] = {
+ 0x39, 0x04, // pushi 04 (cel)
+ 0x76, // push0
+ SIG_MAGICDWORD,
+ 0x7a, // push2
+ 0x38, SIG_UINT16(0x0231), // pushi 0231h (561)
+ 0x76, // push0
+ 0x43, 0x02, 0x04, // kScriptID (get export 0 of script 561)
+ 0x4a, 0x04, // send 04 (gets safePicture::cel)
+ 0x18, // not
+ 0x31, 0x21, // bnt [exit]
+ 0x38, SIG_UINT16(0x0283), // pushi 0283h
+ 0x76, // push0
+ 0x7a, // push2
+ 0x39, 0x20, // pushi 20
+ 0x76, // push0
+ 0x43, 0x02, 0x04, // kScriptID (get export 0 of script 32)
+ 0x4a, 0x04, // send 04 (get sHeimlich::room)
+ 0x36, // push
+ 0x81, 0x0b, // lag global[b] (current room)
+ 0x1c, // ne?
+ 0x31, 0x0e, // bnt [exit]
+ 0x35, 0x00, // ldi 00
+ 0xa3, 0x00, // sal local[0] -> reset safePic signal
+ SIG_END
+};
+
+static const uint16 laurabow2CDPatchPaintingClosing[] = {
+ PATCH_ADDTOOFFSET(+2),
+ 0x3c, // dup (1 additional byte)
+ 0x76, // push0
+ 0x3c, // dup (1 additional byte)
+ 0xab, 0x00, // ssl local[0] -> reset safePic signal
+ 0x7a, // push2
+ 0x38, PATCH_UINT16(0x0231), // pushi 0231h (561)
+ 0x76, // push0
+ 0x43, 0x02, 0x04, // kScriptID (get export 0 of script 561)
+ 0x4a, 0x04, // send 04 (gets safePicture::cel)
+ 0x1a, // eq?
+ 0x31, 0x1d, // bnt [exit]
+ 0x38, PATCH_UINT16(0x0283), // pushi 0283h
+ 0x76, // push0
+ 0x7a, // push2
+ 0x39, 0x20, // pushi 20
+ 0x76, // push0
+ 0x43, 0x02, 0x04, // kScriptID (get export 0 of script 32)
+ 0x4a, 0x04, // send 04 (get sHeimlich::room)
+ 0x36, // push
+ 0x81, 0x0b, // lag global[b] (current room)
+ 0x1a, // eq? (2 opcodes changed, to save 2 bytes)
+ 0x2f, 0x0a, // bt [exit]
+ PATCH_END
+};
+
+// In the CD version the system menu is disabled for certain rooms. LB2::handsOff is called,
+// when leaving the room (and in other cases as well). This method remembers the disabled
+// icons of the icon bar. In the new room LB2::handsOn will get called, which then enables
+// all icons, but also disabled the ones, that were disabled before.
+//
+// Because of this behaviour certain rooms, that should have the system menu enabled, have
+// it disabled, when entering those rooms from rooms, where the menu is supposed to be
+// disabled.
+//
+// We patch this by injecting code into LB2::newRoom (which is called right after a room change)
+// and reset the global variable there, that normally holds the disabled buttons.
+//
+// This patch may cause side-effects and it's difficult to test, because it affects every room
+// in the game. At least for the intro, the speakeasy and plenty of rooms in the beginning it
+// seems to work correctly.
+//
+// Applies to at least: English PC-CD
+// Responsible method: LB2::newRoom, LB2::handsOff, LB2::handsOn
+// Fixes bug: #6440
+static const uint16 laurabow2CDSignatureFixProblematicIconBar[] = {
+ SIG_MAGICDWORD,
+ 0x38, SIG_UINT16(0x00f1), // pushi 00f1 (disable) - hardcoded, we only want to patch the CD version
+ 0x76, // push0
+ 0x81, 0x45, // lag global[45]
+ 0x4a, 0x04, // send 04
+ SIG_END
+};
+
+static const uint16 laurabow2CDPatchFixProblematicIconBar[] = {
+ 0x35, 0x00, // ldi 00
+ 0xa1, 0x74, // sag 74h
+ 0x35, 0x00, // ldi 00 (waste bytes)
+ 0x35, 0x00, // ldi 00
+ PATCH_END
+};
+
+// Opening/Closing the east door in the pterodactyl room doesn't
+// check, if it's locked and will open/close the door internally
+// even when it is.
+//
+// It will get wired shut later in the game by Laura Bow and will be
+// "locked" because of this. We patch in a check for the locked
+// state. We also add code, that will set the "locked" state
+// in case our eastDoor-wired-global is set. This makes the locked
+// state effectively persistent.
+//
+// Applies to at least: English PC-CD, English PC-Floppy
+// Responsible method (CD): eastDoor::doVerb
+// Responsible method (Floppy): eastDoor::<noname300>
+// Fixes bug: #6458 (partly, see additional patch below)
+static const uint16 laurabow2CDSignatureFixWiredEastDoor[] = {
+ 0x30, SIG_UINT16(0x0022), // bnt [skip hand action]
+ 0x67, SIG_ADDTOOFFSET(+1), // pTos CD: doorState, Floppy: state
+ 0x35, 0x00, // ldi 00
+ 0x1a, // eq?
+ 0x31, 0x08, // bnt [close door code]
+ 0x78, // push1
+ SIG_MAGICDWORD,
+ 0x39, 0x63, // pushi 63h
+ 0x45, 0x04, 0x02, // callb export000_4, 02 (sets door-bitflag)
+ 0x33, 0x06, // jmp [super-code]
+ 0x78, // push1
+ 0x39, 0x63, // pushi 63h
+ 0x45, 0x03, 0x02, // callb export000_3, 02 (resets door-bitflag)
+ 0x38, SIG_ADDTOOFFSET(+2), // pushi CD: 011dh, Floppy: 012ch
+ 0x78, // push1
+ 0x8f, 0x01, // lsp param[01]
+ 0x59, 0x02, // rest 02
+ 0x57, SIG_ADDTOOFFSET(+1), 0x06, // super CD: LbDoor, Floppy: Door, 06
+ 0x33, 0x0b, // jmp [ret]
+ SIG_END
+};
+
+static const uint16 laurabow2CDPatchFixWiredEastDoor[] = {
+ 0x31, 0x23, // bnt [skip hand action] (saves 1 byte)
+ 0x81, 97, // lag 97d (get our eastDoor-wired-global)
+ 0x31, 0x04, // bnt [skip setting locked property]
+ 0x35, 0x01, // ldi 01
+ 0x65, 0x6a, // aTop locked (set eastDoor::locked to 1)
+ 0x63, 0x6a, // pToa locked (get eastDoor::locked)
+ 0x2f, 0x17, // bt [skip hand action]
+ 0x63, PATCH_GETORIGINALBYTE(+4), // pToa CD: doorState, Floppy: state
+ 0x78, // push1
+ 0x39, 0x63, // pushi 63h
+ 0x2f, 0x05, // bt [close door code]
+ 0x45, 0x04, 0x02, // callb export000_4, 02 (sets door-bitflag)
+ 0x33, 0x0b, // jmp [super-code]
+ 0x45, 0x03, 0x02, // callb export000_3, 02 (resets door-bitflag)
+ 0x33, 0x06, // jmp [super-code]
+ PATCH_END
+};
+
+// We patch in code, so that our eastDoor-wired-global will get set to 1.
+// This way the wired-state won't get lost when exiting room 430.
+//
+// Applies to at least: English PC-CD, English PC-Floppy
+// Responsible method (CD): sWireItShut::changeState
+// Responsible method (Floppy): sWireItShut::<noname144>
+// Fixes bug: #6458 (partly, see additional patch above)
+static const uint16 laurabow2SignatureRememberWiredEastDoor[] = {
+ SIG_MAGICDWORD,
+ 0x33, 0x27, // jmp [ret]
+ 0x3c, // dup
+ 0x35, 0x06, // ldi 06
+ 0x1a, // eq?
+ 0x31, 0x21, // bnt [skip step]
+ SIG_END
+};
+
+static const uint16 laurabow2PatchRememberWiredEastDoor[] = {
+ PATCH_ADDTOOFFSET(+2), // skip jmp [ret]
+ 0x34, PATCH_UINT16(0x0001), // ldi 0001
+ 0xa1, PATCH_UINT16(97), // sag 97d (set our eastDoor-wired-global)
+ PATCH_END
+};
+
+// Laura Bow 2 CD resets the audio mode to speech on init/restart
+// We already sync the settings from ScummVM (see SciEngine::syncIngameAudioOptions())
+// and this script code would make it impossible to see the intro using "dual" mode w/o using debugger command
+// That's why we remove the corresponding code
+// Patched method: LB2::init, rm100::init
+static const uint16 laurabow2CDSignatureAudioTextSupportModeReset[] = {
+ SIG_MAGICDWORD,
+ 0x35, 0x02, // ldi 02
+ 0xa1, 0x5a, // sag global[5a]
+ SIG_END
+};
+
+static const uint16 laurabow2CDPatchAudioTextSupportModeReset[] = {
+ 0x34, PATCH_UINT16(0x0001), // ldi 0001 (waste bytes)
+ 0x18, // not (waste bytes)
+ PATCH_END
+};
+
+// Directly use global 5a for view-cel id
+// That way it's possible to use a new "dual" mode view in the game menu
+// View 995, loop 13, cel 0 -> "text"
+// View 995, loop 13, cel 1 -> "speech"
+// View 995, loop 13, cel 2 -> "dual" (this view is injected by us into the game)
+// Patched method: gcWin::open
+static const uint16 laurabow2CDSignatureAudioTextMenuSupport1[] = {
+ SIG_MAGICDWORD,
+ 0x89, 0x5a, // lsg global[5a]
+ 0x35, 0x02, // ldi 02
+ 0x1a, // eq?
+ 0x36, // push
+ SIG_END
+};
+
+static const uint16 laurabow2CDPatchAudioTextMenuSupport1[] = {
+ PATCH_ADDTOOFFSET(+2),
+ 0x35, 0x01, // ldi 01
+ 0x04, // sub
+ PATCH_END
};
-const uint16 laurabow2PatchPaintingClosing[] = {
- PATCH_ADDTOOFFSET | +6,
- 0x2f, 0x0e, // bt [don't close]
+// Adds another button state for the text/audio button. We currently use the "speech" view for "dual" mode.
+// Patched method: iconMode::doit
+static const uint16 laurabow2CDSignatureAudioTextMenuSupport2[] = {
+ SIG_MAGICDWORD,
+ 0x89, 0x5a, // lsg global[5a]
+ 0x3c, // dup
+ 0x1a, // eq?
+ 0x31, 0x0a, // bnt [set text mode]
+ 0x35, 0x02, // ldi 02
+ 0xa1, 0x5a, // sag global[5a]
+ 0x35, 0x01, // ldi 01
+ 0xa5, 0x00, // sat temp[0]
+ 0x33, 0x0e, // jmp [draw cel code]
+ 0x3c, // dup
+ 0x35, 0x02, // ldi 02
+ 0x1a, // eq?
+ 0x31, 0x08, // bnt [draw cel code]
+ 0x35, 0x01, // ldi 01
+ 0xa1, 0x5a, // sag global[5a]
+ 0x35, 0x00, // ldi 00
+ 0xa5, 0x00, // sat temp[0]
+ 0x3a, // toss
+ SIG_END
+};
+
+static const uint16 laurabow2CDPatchAudioTextMenuSupport2[] = {
+ 0x81, 0x5a, // lag global[5a]
+ 0x78, // push1
+ 0x02, // add
+ 0xa1, 0x5a, // sag global[5a]
+ 0x36, // push
+ 0x35, 0x03, // ldi 03
+ 0x1e, // gt?
+ 0x31, 0x03, // bnt [skip over]
+ 0x78, // push1
+ 0xa9, 0x5a, // ssg global[5a]
+ 0x89, 0x5a, // lsg global[5a]
+ 0x35, 0x01, // ldi 01
+ 0x04, // sub
+ 0xa5, 0x00, // sat temp[0] - calculate global[5a] - 1 to use as view cel id
+ 0x33, 0x07, // jmp [draw cel code, don't do toss]
PATCH_END
};
-// script, description, magic DWORD, adjust
-const SciScriptSignature laurabow2Signatures[] = {
- { 560, "painting closing immediately", 1, PATCH_MAGICDWORD(0x36, 0x81, 0x0b, 0x1c), -2, laurabow2SignaturePaintingClosing, laurabow2PatchPaintingClosing },
+// script, description, signature patch
+static const SciScriptPatcherEntry laurabow2Signatures[] = {
+ { true, 560, "CD: painting closing immediately", 1, laurabow2CDSignaturePaintingClosing, laurabow2CDPatchPaintingClosing },
+ { true, 0, "CD: fix problematic icon bar", 1, laurabow2CDSignatureFixProblematicIconBar, laurabow2CDPatchFixProblematicIconBar },
+ { true, 430, "CD/Floppy: make wired east door persistent", 1, laurabow2SignatureRememberWiredEastDoor, laurabow2PatchRememberWiredEastDoor },
+ { true, 430, "CD/Floppy: fix wired east door", 1, laurabow2CDSignatureFixWiredEastDoor, laurabow2CDPatchFixWiredEastDoor },
+ // King's Quest 6 and Laura Bow 2 share basic patches for audio + text support
+ { false, 924, "CD: audio + text support 1", 1, kq6laurabow2CDSignatureAudioTextSupport1, kq6laurabow2CDPatchAudioTextSupport1 },
+ { false, 924, "CD: audio + text support 2", 1, kq6laurabow2CDSignatureAudioTextSupport2, kq6laurabow2CDPatchAudioTextSupport2 },
+ { false, 924, "CD: audio + text support 3", 1, kq6laurabow2CDSignatureAudioTextSupport3, kq6laurabow2CDPatchAudioTextSupport3 },
+ { false, 928, "CD: audio + text support 4", 1, kq6laurabow2CDSignatureAudioTextSupport4, kq6laurabow2CDPatchAudioTextSupport4 },
+ { false, 928, "CD: audio + text support 5", 2, kq6laurabow2CDSignatureAudioTextSupport5, kq6laurabow2CDPatchAudioTextSupport5 },
+ { false, 0, "CD: audio + text support disable mode reset", 1, laurabow2CDSignatureAudioTextSupportModeReset, laurabow2CDPatchAudioTextSupportModeReset },
+ { false, 100, "CD: audio + text support disable mode reset", 1, laurabow2CDSignatureAudioTextSupportModeReset, laurabow2CDPatchAudioTextSupportModeReset },
+ { false, 24, "CD: audio + text support LB2 menu 1", 1, laurabow2CDSignatureAudioTextMenuSupport1, laurabow2CDPatchAudioTextMenuSupport1 },
+ { false, 24, "CD: audio + text support LB2 menu 2", 1, laurabow2CDSignatureAudioTextMenuSupport2, laurabow2CDPatchAudioTextMenuSupport2 },
SCI_SIGNATUREENTRY_TERMINATOR
};
@@ -922,42 +1783,40 @@ const SciScriptSignature laurabow2Signatures[] = {
// MG::replay somewhat calculates the savedgame-id used when saving again
// this doesn't work right and we remove the code completely.
// We set the savedgame-id directly right after restoring in kRestoreGame.
-const byte mothergoose256SignatureReplay[] = {
- 6,
- 0x36, // push
- 0x35, 0x20, // ldi 20
- 0x04, // sub
- 0xa1, 0xb3, // sag global[b3]
- 0
+static const uint16 mothergoose256SignatureReplay[] = {
+ 0x36, // push
+ 0x35, SIG_MAGICDWORD, 0x20, // ldi 20
+ 0x04, // sub
+ 0xa1, 0xb3, // sag global[b3]
+ SIG_END
};
-const uint16 mothergoose256PatchReplay[] = {
- 0x34, 0x00, 0x00, // ldi 0000 (dummy)
- 0x34, 0x00, 0x00, // ldi 0000 (dummy)
+static const uint16 mothergoose256PatchReplay[] = {
+ 0x34, PATCH_UINT16(0x0000), // ldi 0000 (dummy)
+ 0x34, PATCH_UINT16(0x0000), // ldi 0000 (dummy)
PATCH_END
};
// when saving, it also checks if the savegame ID is below 13.
// we change this to check if below 113 instead
-const byte mothergoose256SignatureSaveLimit[] = {
- 5,
- 0x89, 0xb3, // lsg global[b3]
- 0x35, 0x0d, // ldi 0d
- 0x20, // ge?
- 0
+static const uint16 mothergoose256SignatureSaveLimit[] = {
+ 0x89, SIG_MAGICDWORD, 0xb3, // lsg global[b3]
+ 0x35, 0x0d, // ldi 0d
+ 0x20, // ge?
+ SIG_END
};
-const uint16 mothergoose256PatchSaveLimit[] = {
- PATCH_ADDTOOFFSET | +2,
+static const uint16 mothergoose256PatchSaveLimit[] = {
+ PATCH_ADDTOOFFSET(+2),
0x35, 0x0d + SAVEGAMEID_OFFICIALRANGE_START, // ldi 113d
PATCH_END
};
-// script, description, magic DWORD, adjust
-const SciScriptSignature mothergoose256Signatures[] = {
- { 0, "replay save issue", 1, PATCH_MAGICDWORD(0x20, 0x04, 0xa1, 0xb3), -2, mothergoose256SignatureReplay, mothergoose256PatchReplay },
- { 0, "save limit dialog (SCI1.1)", 1, PATCH_MAGICDWORD(0xb3, 0x35, 0x0d, 0x20), -1, mothergoose256SignatureSaveLimit, mothergoose256PatchSaveLimit },
- { 994, "save limit dialog (SCI1)", 1, PATCH_MAGICDWORD(0xb3, 0x35, 0x0d, 0x20), -1, mothergoose256SignatureSaveLimit, mothergoose256PatchSaveLimit },
+// script, description, signature patch
+static const SciScriptPatcherEntry mothergoose256Signatures[] = {
+ { true, 0, "replay save issue", 1, mothergoose256SignatureReplay, mothergoose256PatchReplay },
+ { true, 0, "save limit dialog (SCI1.1)", 1, mothergoose256SignatureSaveLimit, mothergoose256PatchSaveLimit },
+ { true, 994, "save limit dialog (SCI1)", 1, mothergoose256SignatureSaveLimit, mothergoose256PatchSaveLimit },
SCI_SIGNATUREENTRY_TERMINATOR
};
@@ -971,55 +1830,89 @@ const SciScriptSignature mothergoose256Signatures[] = {
// SSCI.
// This patch changes the code, so that the gun is actually given away
// when the 2 seconds have passed and the locker got closed.
+// Applies to at least: English floppy
// Responsible method: putGun::changeState (script 341)
-// Fixes bug #3036933 / #3303802
-const byte pq1vgaSignaturePutGunInLockerBug[] = {
- 5,
- 0x35, 0x00, // ldi 00
- 0x1a, // eq?
- 0x31, 0x25, // bnt [next state check]
- +22, 29, // [skip 22 bytes]
- 0x38, 0x5f, 0x01, // pushi 15fh
- 0x78, // push1
- 0x76, // push0
- 0x81, 0x00, // lag 00
- 0x4a, 0x06, // send 06 - ego::put(0)
- 0x35, 0x02, // ldi 02
- 0x65, 0x1c, // aTop 1c (set timer to 2 seconds)
- 0x33, 0x0e, // jmp [end of method]
- 0x3c, // dup --- next state check target
- 0x35, 0x01, // ldi 01
- 0x1a, // eq?
- 0x31, 0x08, // bnt [end of method]
- 0x39, 0x6f, // pushi 6fh
- 0x76, // push0
- 0x72, 0x88, 0x00, // lofsa 0088
- 0x4a, 0x04, // send 04 - locker::dispose
- 0
+// Fixes bug: #5705 / #6400
+static const uint16 pq1vgaSignaturePutGunInLockerBug[] = {
+ 0x35, 0x00, // ldi 00
+ 0x1a, // eq?
+ 0x31, 0x25, // bnt [next state check]
+ SIG_ADDTOOFFSET(+22), // [skip 22 bytes]
+ SIG_MAGICDWORD,
+ 0x38, SIG_SELECTOR16(put), // pushi "put"
+ 0x78, // push1
+ 0x76, // push0
+ 0x81, 0x00, // lag 00
+ 0x4a, 0x06, // send 06 - ego::put(0)
+ 0x35, 0x02, // ldi 02
+ 0x65, 0x1c, // aTop 1c (set timer to 2 seconds)
+ 0x33, 0x0e, // jmp [end of method]
+ 0x3c, // dup --- next state check target
+ 0x35, 0x01, // ldi 01
+ 0x1a, // eq?
+ 0x31, 0x08, // bnt [end of method]
+ 0x39, SIG_SELECTOR8(dispose), // pushi "dispose"
+ 0x76, // push0
+ 0x72, SIG_UINT16(0x0088), // lofsa 0088
+ 0x4a, 0x04, // send 04 - locker::dispose
+ SIG_END
+};
+
+static const uint16 pq1vgaPatchPutGunInLockerBug[] = {
+ PATCH_ADDTOOFFSET(+3),
+ 0x31, 0x1c, // bnt [next state check]
+ PATCH_ADDTOOFFSET(+22),
+ 0x35, 0x02, // ldi 02
+ 0x65, 0x1c, // aTop 1c (set timer to 2 seconds)
+ 0x33, 0x17, // jmp [end of method]
+ 0x3c, // dup --- next state check target
+ 0x35, 0x01, // ldi 01
+ 0x1a, // eq?
+ 0x31, 0x11, // bnt [end of method]
+ 0x38, PATCH_SELECTOR16(put), // pushi "put"
+ 0x78, // push1
+ 0x76, // push0
+ 0x81, 0x00, // lag 00
+ 0x4a, 0x06, // send 06 - ego::put(0)
+ PATCH_END
};
-const uint16 pq1vgaPatchPutGunInLockerBug[] = {
- PATCH_ADDTOOFFSET | +3,
- 0x31, 0x1c, // bnt [next state check]
- PATCH_ADDTOOFFSET | +22,
- 0x35, 0x02, // ldi 02
- 0x65, 0x1c, // aTop 1c (set timer to 2 seconds)
- 0x33, 0x17, // jmp [end of method]
- 0x3c, // dup --- next state check target
- 0x35, 0x01, // ldi 01
- 0x1a, // eq?
- 0x31, 0x11, // bnt [end of method]
- 0x38, 0x5f, 0x01, // pushi 15fh
- 0x78, // push1
- 0x76, // push0
- 0x81, 0x00, // lag 00
- 0x4a, 0x06, // send 06 - ego::put(0)
- PATCH_END
-};
-
-// script, description, magic DWORD, adjust
-const SciScriptSignature pq1vgaSignatures[] = {
- { 341, "put gun in locker bug", 1, PATCH_MAGICDWORD(0x38, 0x5f, 0x01, 0x78), -27, pq1vgaSignaturePutGunInLockerBug, pq1vgaPatchPutGunInLockerBug },
+// When restoring a saved game, which was made while driving around,
+// the game didn't redraw the map. This also happened in Sierra SCI.
+//
+// The map is a picture resource and drawn over the main picture.
+// This is called an "overlay" in SCI. This wasn't implemented properly.
+// We fix it by actually implementing it properly.
+//
+// Applies to at least: English floppy
+// Responsible method: rm500::init, changeOverlay::changeState (script 500)
+// Fixes bug: #5016
+static const uint16 pq1vgaSignatureMapSaveRestoreBug[] = {
+ 0x39, 0x04, // pushi 04
+ SIG_ADDTOOFFSET(+2), // skip either lsg global[f9] or pTos register
+ SIG_MAGICDWORD,
+ 0x38, 0x64, 0x80, // pushi 8064
+ 0x76, // push0
+ 0x89, 0x28, // lsg global[28]
+ 0x43, 0x08, 0x08, // kDrawPic (8)
+ SIG_END
+};
+
+static const uint16 pq1vgaPatchMapSaveRestoreBug[] = {
+ 0x38, PATCH_SELECTOR16(overlay), // pushi "overlay"
+ 0x7a, // push2
+ 0x89, 0xf9, // lsg global[f9]
+ 0x39, 0x64, // pushi 64 (no transition)
+ 0x81, 0x02, // lag global[02] (current room object)
+ 0x4a, 0x08, // send 08
+ 0x18, // not (waste byte)
+ PATCH_END
+};
+
+// script, description, signature patch
+static const SciScriptPatcherEntry pq1vgaSignatures[] = {
+ { true, 341, "put gun in locker bug", 1, pq1vgaSignaturePutGunInLockerBug, pq1vgaPatchPutGunInLockerBug },
+ { true, 500, "map save/restore bug", 2, pq1vgaSignatureMapSaveRestoreBug, pq1vgaPatchMapSaveRestoreBug },
SCI_SIGNATUREENTRY_TERMINATOR
};
@@ -1032,43 +1925,45 @@ const SciScriptSignature pq1vgaSignatures[] = {
// not nearly as bad as in our sci, but these differences may be caused by
// timing.
// We just reuse the active event, thus removing the duplicate kGetEvent call.
-const byte qfg1vgaSignatureFightEvents[] = {
- 25,
- 0x39, 0x6d, // pushi 6d (selector new)
- 0x76, // push0
- 0x51, 0x07, // class Event
- 0x4a, 0x04, // send 04 - call Event::new
- 0xa5, 0x00, // sat temp[0]
- 0x78, // push1
- 0x76, // push0
- 0x4a, 0x04, // send 04 - read Event::x
- 0xa5, 0x03, // sat temp[3]
- 0x76, // push0 (selector y)
- 0x76, // push0
- 0x85, 0x00, // lat temp[0]
- 0x4a, 0x04, // send 04 - read Event::y
- 0x36, // push
- 0x35, 0x0a, // ldi 0a
- 0x04, // sub (poor mans localization) ;-)
- 0
-};
-
-const uint16 qfg1vgaPatchFightEvents[] = {
- 0x38, 0x5a, 0x01, // pushi 15a (selector curEvent)
- 0x76, // push0
- 0x81, 0x50, // lag global[50]
- 0x4a, 0x04, // send 04 - read User::curEvent -> needs one byte more than previous code
- 0xa5, 0x00, // sat temp[0]
- 0x78, // push1
- 0x76, // push0
- 0x4a, 0x04, // send 04 - read Event::x
- 0xa5, 0x03, // sat temp[3]
- 0x76, // push0 (selector y)
- 0x76, // push0
- 0x85, 0x00, // lat temp[0]
- 0x4a, 0x04, // send 04 - read Event::y
- 0x39, 0x00, // pushi 00
- 0x02, // add (waste 3 bytes) - we don't need localization, User::doit has already done it
+// Applies to at least: English floppy
+// Responsible method: pointBox::doit
+static const uint16 qfg1vgaSignatureFightEvents[] = {
+ 0x39, SIG_MAGICDWORD,
+ SIG_SELECTOR8(new), // pushi "new"
+ 0x76, // push0
+ 0x51, 0x07, // class Event
+ 0x4a, 0x04, // send 04 - call Event::new
+ 0xa5, 0x00, // sat temp[0]
+ 0x78, // push1
+ 0x76, // push0
+ 0x4a, 0x04, // send 04 - read Event::x
+ 0xa5, 0x03, // sat temp[3]
+ 0x76, // push0 (selector y)
+ 0x76, // push0
+ 0x85, 0x00, // lat temp[0]
+ 0x4a, 0x04, // send 04 - read Event::y
+ 0x36, // push
+ 0x35, 0x0a, // ldi 0a
+ 0x04, // sub (poor mans localization) ;-)
+ SIG_END
+};
+
+static const uint16 qfg1vgaPatchFightEvents[] = {
+ 0x38, PATCH_SELECTOR16(curEvent), // pushi 15a (selector curEvent)
+ 0x76, // push0
+ 0x81, 0x50, // lag global[50]
+ 0x4a, 0x04, // send 04 - read User::curEvent -> needs one byte more than previous code
+ 0xa5, 0x00, // sat temp[0]
+ 0x78, // push1
+ 0x76, // push0
+ 0x4a, 0x04, // send 04 - read Event::x
+ 0xa5, 0x03, // sat temp[3]
+ 0x76, // push0 (selector y)
+ 0x76, // push0
+ 0x85, 0x00, // lat temp[0]
+ 0x4a, 0x04, // send 04 - read Event::y
+ 0x39, 0x00, // pushi 00
+ 0x02, // add (waste 3 bytes) - we don't need localization, User::doit has already done it
PATCH_END
};
@@ -1079,31 +1974,31 @@ const uint16 qfg1vgaPatchFightEvents[] = {
// window text, which erases the window header text because of its length. To
// fix that, we allocate more temp space and move the pointer used for the
// window header a little bit, wherever it's used in script 814.
-// Fixes bug #3568431.
+// Fixes bug: #6139.
// Patch 1: Increase temp space
-const byte qfg1vgaSignatureTempSpace[] = {
- 4,
- 0x3f, 0xba, // link 0xba
- 0x87, 0x00, // lap 0
- 0
+static const uint16 qfg1vgaSignatureTempSpace[] = {
+ SIG_MAGICDWORD,
+ 0x3f, 0xba, // link 0xba
+ 0x87, 0x00, // lap 0
+ SIG_END
};
-const uint16 qfg1vgaPatchTempSpace[] = {
- 0x3f, 0xca, // link 0xca
+static const uint16 qfg1vgaPatchTempSpace[] = {
+ 0x3f, 0xca, // link 0xca
PATCH_END
};
// Patch 2: Move the pointer used for the window header a little bit
-const byte qfg1vgaSignatureDialogHeader[] = {
- 4,
- 0x5b, 0x04, 0x80, // lea temp[0x80]
- 0x36, // push
- 0
+static const uint16 qfg1vgaSignatureDialogHeader[] = {
+ SIG_MAGICDWORD,
+ 0x5b, 0x04, 0x80, // lea temp[0x80]
+ 0x36, // push
+ SIG_END
};
-const uint16 qfg1vgaPatchDialogHeader[] = {
- 0x5b, 0x04, 0x90, // lea temp[0x90]
+static const uint16 qfg1vgaPatchDialogHeader[] = {
+ 0x5b, 0x04, 0x90, // lea temp[0x90]
PATCH_END
};
@@ -1115,63 +2010,65 @@ const uint16 qfg1vgaPatchDialogHeader[] = {
// edge case that can occur when Ego is set to sneak. Normally, when clicking on
// the crusher, ego is supposed to move close to position 79, 165. We change it
// to 85, 165, which is not an edge case thus the freeze is avoided.
-// Fixes bug #3585189.
-const byte qfg1vgaSignatureMoveToCrusher[] = {
- 9,
- 0x51, 0x1f, // class Motion
- 0x36, // push
- 0x39, 0x4f, // pushi 4f (79 - x)
- 0x38, 0xa5, 0x00, // pushi 00a5 (165 - y)
- 0x7c, // pushSelf
- 0
-};
-
-const uint16 qfg1vgaPatchMoveToCrusher[] = {
- PATCH_ADDTOOFFSET | +3,
- 0x39, 0x55, // pushi 55 (85 - x)
+// Fixes bug: #6180
+static const uint16 qfg1vgaSignatureMoveToCrusher[] = {
+ SIG_MAGICDWORD,
+ 0x51, 0x1f, // class Motion
+ 0x36, // push
+ 0x39, 0x4f, // pushi 4f (79 - x)
+ 0x38, SIG_UINT16(0x00a5), // pushi 00a5 (165 - y)
+ 0x7c, // pushSelf
+ SIG_END
+};
+
+static const uint16 qfg1vgaPatchMoveToCrusher[] = {
+ PATCH_ADDTOOFFSET(+3),
+ 0x39, 0x55, // pushi 55 (85 - x)
PATCH_END
};
// Same pathfinding bug as above, where Ego is set to move to an impossible
// spot when sneaking. In GuardsTrumpet::changeState, we change the final
-// location where Ego is moved from 111, 111 to 114, 114. Fixes bug #3604939.
-const byte qfg1vgaSignatureMoveToCastleGate[] = {
- 7,
- 0x51, 0x1f, // class MoveTo
- 0x36, // push
- 0x39, 0x6f, // pushi 6f (111 - x)
- 0x3c, // dup (111 - y)
- 0x7c, // pushSelf
- 0
-};
-
-const uint16 qfg1vgaPatchMoveToCastleGate[] = {
- PATCH_ADDTOOFFSET | +3,
- 0x39, 0x72, // pushi 72 (114 - x)
+// location where Ego is moved from 111, 111 to 114, 114.
+// Fixes bug: #6248
+static const uint16 qfg1vgaSignatureMoveToCastleGate[] = {
+ SIG_MAGICDWORD,
+ 0x51, 0x1f, // class MoveTo
+ 0x36, // push
+ 0x39, 0x6f, // pushi 6f (111 - x)
+ 0x3c, // dup (111 - y)
+ 0x7c, // pushSelf
+ SIG_END
+};
+
+static const uint16 qfg1vgaPatchMoveToCastleGate[] = {
+ PATCH_ADDTOOFFSET(+3),
+ 0x39, 0x72, // pushi 72 (114 - x)
PATCH_END
};
// Typo in the original Sierra scripts
// Looking at a cheetaur resulted in a text about a Saurus Rex
// The code treats both monster types the same.
+// Applies to at least: English floppy
// Responsible method: smallMonster::doVerb
-// Fixes bug #3604943.
-const byte qfg1vgaSignatureCheetaurDescription[] = {
- 16,
- 0x34, 0xb8, 0x01, // ldi 01b8
- 0x1a, // eq?
- 0x31, 0x16, // bnt 16
- 0x38, 0x27, 0x01, // pushi 0127
- 0x39, 0x06, // pushi 06
- 0x39, 0x03, // pushi 03
- 0x78, // push1
- 0x39, 0x12, // pushi 12 -> monster type Saurus Rex
- 0
-};
-
-const uint16 qfg1vgaPatchCheetaurDescription[] = {
- PATCH_ADDTOOFFSET | +14,
- 0x39, 0x11, // pushi 11 -> monster type cheetaur
+// Fixes bug #6249
+static const uint16 qfg1vgaSignatureCheetaurDescription[] = {
+ SIG_MAGICDWORD,
+ 0x34, SIG_UINT16(0x01b8), // ldi 01b8
+ 0x1a, // eq?
+ 0x31, 0x16, // bnt 16
+ 0x38, SIG_UINT16(0x0127), // pushi 0127
+ 0x39, 0x06, // pushi 06
+ 0x39, 0x03, // pushi 03
+ 0x78, // push1
+ 0x39, 0x12, // pushi 12 -> monster type Saurus Rex
+ SIG_END
+};
+
+static const uint16 qfg1vgaPatchCheetaurDescription[] = {
+ PATCH_ADDTOOFFSET(+14),
+ 0x39, 0x11, // pushi 11 -> monster type cheetaur
PATCH_END
};
@@ -1185,41 +2082,42 @@ const uint16 qfg1vgaPatchCheetaurDescription[] = {
// Local 5 of that room is a timer, that closes the door (object door11).
// Setting it to 1 during happyFace::changeState(0) stops door11::doit from
// calling goTo6::init, so the whole issue is stopped from happening.
+// Applies to at least: English floppy
// Responsible method: happyFace::changeState, door11::doit
-// Fixes bug #3585793
-const byte qfg1vgaSignatureFunnyRoomFix[] = {
- 14,
- 0x65, 0x14, // aTop 14 (state)
- 0x36, // push
- 0x3c, // dup
- 0x35, 0x00, // ldi 00
- 0x1a, // eq?
- 0x30, 0x25, 0x00, // bnt 0025 [-> next state]
- 0x35, 0x01, // ldi 01
- 0xa3, 0x4e, // sal 4e
- 0
-};
-
-const uint16 qfg1vgaPatchFunnyRoomFix[] = {
- PATCH_ADDTOOFFSET | +3,
- 0x2e, 0x29, 0x00, // bt 0029 [-> next state] - saves 4 bytes
- 0x35, 0x01, // ldi 01
- 0xa3, 0x4e, // sal 4e
- 0xa3, 0x05, // sal 05 (sets local 5 to 1)
- 0xa3, 0x05, // and again to make absolutely sure (actually to waste 2 bytes)
+// Fixes bug #6181
+static const uint16 qfg1vgaSignatureFunnyRoomFix[] = {
+ 0x65, 0x14, // aTop 14 (state)
+ 0x36, // push
+ 0x3c, // dup
+ 0x35, 0x00, // ldi 00
+ 0x1a, // eq?
+ 0x30, SIG_UINT16(0x0025), // bnt 0025 [-> next state]
+ SIG_MAGICDWORD,
+ 0x35, 0x01, // ldi 01
+ 0xa3, 0x4e, // sal 4e
+ SIG_END
+};
+
+static const uint16 qfg1vgaPatchFunnyRoomFix[] = {
+ PATCH_ADDTOOFFSET(+3),
+ 0x2e, PATCH_UINT16(0x0029), // bt 0029 [-> next state] - saves 4 bytes
+ 0x35, 0x01, // ldi 01
+ 0xa3, 0x4e, // sal 4e
+ 0xa3, 0x05, // sal 05 (sets local 5 to 1)
+ 0xa3, 0x05, // and again to make absolutely sure (actually to waste 2 bytes)
PATCH_END
};
-// script, description, magic DWORD, adjust
-const SciScriptSignature qfg1vgaSignatures[] = {
- { 215, "fight event issue", 1, PATCH_MAGICDWORD(0x6d, 0x76, 0x51, 0x07), -1, qfg1vgaSignatureFightEvents, qfg1vgaPatchFightEvents },
- { 216, "weapon master event issue", 1, PATCH_MAGICDWORD(0x6d, 0x76, 0x51, 0x07), -1, qfg1vgaSignatureFightEvents, qfg1vgaPatchFightEvents },
- { 814, "window text temp space", 1, PATCH_MAGICDWORD(0x3f, 0xba, 0x87, 0x00), 0, qfg1vgaSignatureTempSpace, qfg1vgaPatchTempSpace },
- { 814, "dialog header offset", 3, PATCH_MAGICDWORD(0x5b, 0x04, 0x80, 0x36), 0, qfg1vgaSignatureDialogHeader, qfg1vgaPatchDialogHeader },
- { 331, "moving to crusher", 1, PATCH_MAGICDWORD(0x51, 0x1f, 0x36, 0x39), 0, qfg1vgaSignatureMoveToCrusher, qfg1vgaPatchMoveToCrusher },
- { 41, "moving to castle gate", 1, PATCH_MAGICDWORD(0x51, 0x1f, 0x36, 0x39), 0, qfg1vgaSignatureMoveToCastleGate, qfg1vgaPatchMoveToCastleGate },
- { 210, "cheetaur description fixed", 1, PATCH_MAGICDWORD(0x34, 0xb8, 0x01, 0x1a), 0, qfg1vgaSignatureCheetaurDescription, qfg1vgaPatchCheetaurDescription },
- { 96, "funny room script bug fixed", 1, PATCH_MAGICDWORD(0x35, 0x01, 0xa3, 0x4e), -10, qfg1vgaSignatureFunnyRoomFix, qfg1vgaPatchFunnyRoomFix },
+// script, description, signature patch
+static const SciScriptPatcherEntry qfg1vgaSignatures[] = {
+ { true, 215, "fight event issue", 1, qfg1vgaSignatureFightEvents, qfg1vgaPatchFightEvents },
+ { true, 216, "weapon master event issue", 1, qfg1vgaSignatureFightEvents, qfg1vgaPatchFightEvents },
+ { true, 814, "window text temp space", 1, qfg1vgaSignatureTempSpace, qfg1vgaPatchTempSpace },
+ { true, 814, "dialog header offset", 3, qfg1vgaSignatureDialogHeader, qfg1vgaPatchDialogHeader },
+ { true, 331, "moving to crusher", 1, qfg1vgaSignatureMoveToCrusher, qfg1vgaPatchMoveToCrusher },
+ { true, 41, "moving to castle gate", 1, qfg1vgaSignatureMoveToCastleGate, qfg1vgaPatchMoveToCastleGate },
+ { true, 210, "cheetaur description fixed", 1, qfg1vgaSignatureCheetaurDescription, qfg1vgaPatchCheetaurDescription },
+ { true, 96, "funny room script bug fixed", 1, qfg1vgaSignatureFunnyRoomFix, qfg1vgaPatchFunnyRoomFix },
SCI_SIGNATUREENTRY_TERMINATOR
};
@@ -1235,58 +2133,56 @@ const SciScriptSignature qfg1vgaSignatures[] = {
// deleted entries. We don't allow the user to change the directory, thus the
// contents of the file list are constant, so we can avoid the constant file
// and text entry refreshes whenever a button is pressed, and prevent possible
-// crashes because of these constant quick object reallocations. Fixes bug
-// #3037996.
-const byte qfg2SignatureImportDialog[] = {
- 16,
- 0x63, 0x20, // pToa text
- 0x30, 0x0b, 0x00, // bnt [next state]
- 0x7a, // push2
- 0x39, 0x03, // pushi 03
- 0x36, // push
- 0x43, 0x72, 0x04, // callk Memory 4
- 0x35, 0x00, // ldi 00
- 0x65, 0x20, // aTop text
- 0
-};
-
-const uint16 qfg2PatchImportDialog[] = {
- PATCH_ADDTOOFFSET | +5,
- 0x48, // ret
+// crashes because of these constant quick object reallocations.
+// Fixes bug: #5096
+static const uint16 qfg2SignatureImportDialog[] = {
+ 0x63, SIG_MAGICDWORD, 0x20, // pToa text
+ 0x30, SIG_UINT16(0x000b), // bnt [next state]
+ 0x7a, // push2
+ 0x39, 0x03, // pushi 03
+ 0x36, // push
+ 0x43, 0x72, 0x04, // callk Memory 4
+ 0x35, 0x00, // ldi 00
+ 0x65, 0x20, // aTop text
+ SIG_END
+};
+
+static const uint16 qfg2PatchImportDialog[] = {
+ PATCH_ADDTOOFFSET(+5),
+ 0x48, // ret
PATCH_END
};
-// script, description, magic DWORD, adjust
-const SciScriptSignature qfg2Signatures[] = {
- { 944, "import dialog continuous calls", 1, PATCH_MAGICDWORD(0x20, 0x30, 0x0b, 0x00), -1, qfg2SignatureImportDialog, qfg2PatchImportDialog },
+// script, description, signature patch
+static const SciScriptPatcherEntry qfg2Signatures[] = {
+ { true, 944, "import dialog continuous calls", 1, qfg2SignatureImportDialog, qfg2PatchImportDialog },
SCI_SIGNATUREENTRY_TERMINATOR
};
// ===========================================================================
// Patch for the import screen in QFG3, same as the one for QFG2 above
-const byte qfg3SignatureImportDialog[] = {
- 15,
- 0x63, 0x2a, // pToa text
- 0x31, 0x0b, // bnt [next state]
- 0x7a, // push2
- 0x39, 0x03, // pushi 03
- 0x36, // push
- 0x43, 0x72, 0x04, // callk Memory 4
- 0x35, 0x00, // ldi 00
- 0x65, 0x2a, // aTop text
- 0
-};
-
-const uint16 qfg3PatchImportDialog[] = {
- PATCH_ADDTOOFFSET | +4,
- 0x48, // ret
+static const uint16 qfg3SignatureImportDialog[] = {
+ 0x63, SIG_MAGICDWORD, 0x2a, // pToa text
+ 0x31, 0x0b, // bnt [next state]
+ 0x7a, // push2
+ 0x39, 0x03, // pushi 03
+ 0x36, // push
+ 0x43, 0x72, 0x04, // callk Memory 4
+ 0x35, 0x00, // ldi 00
+ 0x65, 0x2a, // aTop text
+ SIG_END
+};
+
+static const uint16 qfg3PatchImportDialog[] = {
+ PATCH_ADDTOOFFSET(+4),
+ 0x48, // ret
PATCH_END
};
// ===========================================================================
-// Patch for the Woo dialog option in Uhura's conversation. Bug #3040722
+// Patch for the Woo dialog option in Uhura's conversation.
// Problem: The Woo dialog option (0xffb5) is negative, and therefore
// treated as an option opening a submenu. This leads to uhuraTell::doChild
// being called, which calls hero::solvePuzzle and then proceeds with
@@ -1298,38 +2194,40 @@ const uint16 qfg3PatchImportDialog[] = {
// hero::solvePuzzle (0xfffc) which does a ret afterwards without going to
// Teller::doChild. We jump to this call of hero::solvePuzzle to get that same
// behaviour.
-
-const byte qfg3SignatureWooDialog[] = {
- 30,
- 0x67, 0x12, // pTos 12 (query)
- 0x35, 0xb6, // ldi b6
- 0x1a, // eq?
- 0x2f, 0x05, // bt 05
- 0x67, 0x12, // pTos 12 (query)
- 0x35, 0x9b, // ldi 9b
- 0x1a, // eq?
- 0x31, 0x0c, // bnt 0c
- 0x38, 0x97, 0x02, // pushi 0297
- 0x7a, // push2
- 0x38, 0x0c, 0x01, // pushi 010c
- 0x7a, // push2
- 0x81, 0x00, // lag 00
- 0x4a, 0x08, // send 08
- 0x67, 0x12, // pTos 12 (query)
- 0x35, 0xb5, // ldi b5
- 0
-};
-
-const uint16 qfg3PatchWooDialog[] = {
- PATCH_ADDTOOFFSET | +0x29,
- 0x33, 0x11, // jmp to 0x6a2, the call to hero::solvePuzzle for 0xFFFC
+// Applies to at least: English, German, Italian, French, Spanish Floppy
+// Responsible method: unknown
+// Fixes bug: #5172
+static const uint16 qfg3SignatureWooDialog[] = {
+ SIG_MAGICDWORD,
+ 0x67, 0x12, // pTos 12 (query)
+ 0x35, 0xb6, // ldi b6
+ 0x1a, // eq?
+ 0x2f, 0x05, // bt 05
+ 0x67, 0x12, // pTos 12 (query)
+ 0x35, 0x9b, // ldi 9b
+ 0x1a, // eq?
+ 0x31, 0x0c, // bnt 0c
+ 0x38, SIG_SELECTOR16(solvePuzzle), // pushi 0297
+ 0x7a, // push2
+ 0x38, SIG_UINT16(0x010c), // pushi 010c
+ 0x7a, // push2
+ 0x81, 0x00, // lag 00
+ 0x4a, 0x08, // send 08
+ 0x67, 0x12, // pTos 12 (query)
+ 0x35, 0xb5, // ldi b5
+ SIG_END
+};
+
+static const uint16 qfg3PatchWooDialog[] = {
+ PATCH_ADDTOOFFSET(+0x29),
+ 0x33, 0x11, // jmp to 0x6a2, the call to hero::solvePuzzle for 0xFFFC
PATCH_END
};
-// script, description, magic DWORD, adjust
-const SciScriptSignature qfg3Signatures[] = {
- { 944, "import dialog continuous calls", 1, PATCH_MAGICDWORD(0x2a, 0x31, 0x0b, 0x7a), -1, qfg3SignatureImportDialog, qfg3PatchImportDialog },
- { 440, "dialog crash when asking about Woo", 1, PATCH_MAGICDWORD(0x67, 0x12, 0x35, 0xb5), -26, qfg3SignatureWooDialog, qfg3PatchWooDialog },
+// script, description, signature patch
+static const SciScriptPatcherEntry qfg3Signatures[] = {
+ { true, 944, "import dialog continuous calls", 1, qfg3SignatureImportDialog, qfg3PatchImportDialog },
+ { true, 440, "dialog crash when asking about Woo", 1, qfg3SignatureWooDialog, qfg3PatchWooDialog },
SCI_SIGNATUREENTRY_TERMINATOR
};
@@ -1339,31 +2237,53 @@ const SciScriptSignature qfg3Signatures[] = {
// adds it to nest::x. The problem is that the script also checks if x exceeds
// we never reach that of course, so the pterodactyl-flight will go endlessly
// we could either calculate property count differently somehow fixing this
-// but I think just patching it out is cleaner (bug #3037938)
-const byte sq4FloppySignatureEndlessFlight[] = {
- 8,
- 0x39, 0x04, // pushi 04 (selector x)
- 0x78, // push1
- 0x67, 0x08, // pTos 08 (property x)
- 0x63, 0x44, // pToa 44 (invalid property)
- 0x02, // add
- 0
-};
-
-// Similar to the above, for the German version (bug #3110215)
-const byte sq4FloppySignatureEndlessFlightGerman[] = {
- 8,
- 0x39, 0x04, // pushi 04 (selector x)
- 0x78, // push1
- 0x67, 0x08, // pTos 08 (property x)
- 0x63, 0x4c, // pToa 4c (invalid property)
- 0x02, // add
- 0
+// but I think just patching it out is cleaner.
+// Fixes bug: #5093
+static const uint16 sq4FloppySignatureEndlessFlight[] = {
+ 0x39, 0x04, // pushi 04 (selector x)
+ SIG_MAGICDWORD,
+ 0x78, // push1
+ 0x67, 0x08, // pTos 08 (property x)
+ 0x63, SIG_ADDTOOFFSET(+1), // pToa (invalid property) - 44h for English floppy, 4ch for German floppy
+ 0x02, // add
+ SIG_END
+};
+
+static const uint16 sq4FloppyPatchEndlessFlight[] = {
+ PATCH_ADDTOOFFSET(+5),
+ 0x35, 0x03, // ldi 03 (which would be the content of the property)
+ PATCH_END
};
-const uint16 sq4FloppyPatchEndlessFlight[] = {
- PATCH_ADDTOOFFSET | +5,
- 0x35, 0x03, // ldi 03 (which would be the content of the property)
+// Floppy-only: When the player tries to throw something at the sequel police in Space Quest X (zero g zone),
+// the game will first show a textbox and then cause a signature mismatch in ScummVM/
+// crash the whole game in Sierra SCI/display garbage (the latter when the Sierra "patch" got applied).
+//
+// All of this is caused by a typo in the script. Right after the code for showing the textbox,
+// there is more similar code for showing another textbox, but without a pointer to the text.
+// This has to be a typo, because there is no unused text to be found within that script.
+//
+// Sierra's "patch" didn't include a proper fix (as in a modified script). Instead they shipped a dummy
+// text resource, which somewhat "solved" the issue in Sierra SCI, but it still showed another textbox
+// with garbage in it. Funnily Sierra must have known that, because that new text resource contains:
+// "Hi! This is a kludge!"
+//
+// We properly fix it by removing the faulty code.
+// Applies to at least: English Floppy
+// Responsible method: sp1::doVerb
+// Fixes bug: found by SCI developer
+static const uint16 sq4FloppySignatureThrowStuffAtSequelPoliceBug[] = {
+ 0x47, 0xff, 0x00, 0x02, // call export 255_0, 2
+ 0x3a, // toss
+ SIG_MAGICDWORD,
+ 0x36, // push
+ 0x47, 0xff, 0x00, 0x02, // call export 255_0, 2
+ SIG_END
+};
+
+static const uint16 sq4FloppyPatchThrowStuffAtSequelPoliceBug[] = {
+ PATCH_ADDTOOFFSET(+5),
+ 0x48, // ret
PATCH_END
};
@@ -1373,40 +2293,40 @@ const uint16 sq4FloppyPatchEndlessFlight[] = {
// Patch 1: iconTextSwitch::show, called when the text options button is shown.
// This is patched to add the "Both" text resource (i.e. we end up with
// "Speech", "Text" and "Both")
-const byte sq4CdSignatureTextOptionsButton[] = {
- 11,
- 0x35, 0x01, // ldi 0x01
- 0xa1, 0x53, // sag 0x53
- 0x39, 0x03, // pushi 0x03
- 0x78, // push1
- 0x39, 0x09, // pushi 0x09
- 0x54, 0x06, // self 0x06
- 0
-};
-
-const uint16 sq4CdPatchTextOptionsButton[] = {
- PATCH_ADDTOOFFSET | +7,
- 0x39, 0x0b, // pushi 0x0b
+static const uint16 sq4CdSignatureTextOptionsButton[] = {
+ SIG_MAGICDWORD,
+ 0x35, 0x01, // ldi 0x01
+ 0xa1, 0x53, // sag 0x53
+ 0x39, 0x03, // pushi 0x03
+ 0x78, // push1
+ 0x39, 0x09, // pushi 0x09
+ 0x54, 0x06, // self 0x06
+ SIG_END
+};
+
+static const uint16 sq4CdPatchTextOptionsButton[] = {
+ PATCH_ADDTOOFFSET(+7),
+ 0x39, 0x0b, // pushi 0x0b
PATCH_END
};
// Patch 2: Adjust a check in babbleIcon::init, which handles the babble icon
// (e.g. the two guys from Andromeda) shown when dying/quitting.
-// Fixes bug #3538418.
-const byte sq4CdSignatureBabbleIcon[] = {
- 7,
- 0x89, 0x5a, // lsg 5a
- 0x35, 0x02, // ldi 02
- 0x1a, // eq?
- 0x31, 0x26, // bnt 26 [02a7]
- 0
-};
-
-const uint16 sq4CdPatchBabbleIcon[] = {
- 0x89, 0x5a, // lsg 5a
- 0x35, 0x01, // ldi 01
- 0x1a, // eq?
- 0x2f, 0x26, // bt 26 [02a7]
+// Fixes bug: #6068
+static const uint16 sq4CdSignatureBabbleIcon[] = {
+ SIG_MAGICDWORD,
+ 0x89, 0x5a, // lsg 5a
+ 0x35, 0x02, // ldi 02
+ 0x1a, // eq?
+ 0x31, 0x26, // bnt 26 [02a7]
+ SIG_END
+};
+
+static const uint16 sq4CdPatchBabbleIcon[] = {
+ 0x89, 0x5a, // lsg 5a
+ 0x35, 0x01, // ldi 01
+ 0x1a, // eq?
+ 0x2f, 0x26, // bt 26 [02a7]
PATCH_END
};
@@ -1414,56 +2334,56 @@ const uint16 sq4CdPatchBabbleIcon[] = {
// when the text options button is clicked: "Speech", "Text" and "Both".
// Refer to the patch above for additional details.
// iconTextSwitch::doit (called when the text options button is clicked)
-const byte sq4CdSignatureTextOptions[] = {
- 32,
- 0x89, 0x5a, // lsg 0x5a (load global 90 to stack)
- 0x3c, // dup
- 0x35, 0x01, // ldi 0x01
- 0x1a, // eq? (global 90 == 1)
- 0x31, 0x06, // bnt 0x06 (0x0691)
- 0x35, 0x02, // ldi 0x02
- 0xa1, 0x5a, // sag 0x5a (save acc to global 90)
- 0x33, 0x0a, // jmp 0x0a (0x69b)
- 0x3c, // dup
- 0x35, 0x02, // ldi 0x02
- 0x1a, // eq? (global 90 == 2)
- 0x31, 0x04, // bnt 0x04 (0x069b)
- 0x35, 0x01, // ldi 0x01
- 0xa1, 0x5a, // sag 0x5a (save acc to global 90)
- 0x3a, // toss
- 0x38, 0xd9, 0x00, // pushi 0x00d9
- 0x76, // push0
- 0x54, 0x04, // self 0x04
- 0x48, // ret
- 0
-};
-
-const uint16 sq4CdPatchTextOptions[] = {
- 0x89, 0x5a, // lsg 0x5a (load global 90 to stack)
- 0x3c, // dup
- 0x35, 0x03, // ldi 0x03 (acc = 3)
- 0x1a, // eq? (global 90 == 3)
- 0x2f, 0x07, // bt 0x07
- 0x89, 0x5a, // lsg 0x5a (load global 90 to stack again)
- 0x35, 0x01, // ldi 0x01 (acc = 1)
- 0x02, // add: acc = global 90 (on stack) + 1 (previous acc value)
- 0x33, 0x02, // jmp 0x02
- 0x35, 0x01, // ldi 0x01 (reset acc to 1)
- 0xa1, 0x5a, // sag 0x5a (save acc to global 90)
- 0x33, 0x03, // jmp 0x03 (jump over the wasted bytes below)
- 0x34, 0x00, 0x00, // ldi 0x0000 (waste 3 bytes)
- 0x3a, // toss
+static const uint16 sq4CdSignatureTextOptions[] = {
+ SIG_MAGICDWORD,
+ 0x89, 0x5a, // lsg 0x5a (load global 90 to stack)
+ 0x3c, // dup
+ 0x35, 0x01, // ldi 0x01
+ 0x1a, // eq? (global 90 == 1)
+ 0x31, 0x06, // bnt 0x06 (0x0691)
+ 0x35, 0x02, // ldi 0x02
+ 0xa1, 0x5a, // sag 0x5a (save acc to global 90)
+ 0x33, 0x0a, // jmp 0x0a (0x69b)
+ 0x3c, // dup
+ 0x35, 0x02, // ldi 0x02
+ 0x1a, // eq? (global 90 == 2)
+ 0x31, 0x04, // bnt 0x04 (0x069b)
+ 0x35, 0x01, // ldi 0x01
+ 0xa1, 0x5a, // sag 0x5a (save acc to global 90)
+ 0x3a, // toss
+ 0x38, SIG_SELECTOR16(show), // pushi 0x00d9
+ 0x76, // push0
+ 0x54, 0x04, // self 0x04
+ 0x48, // ret
+ SIG_END
+};
+
+static const uint16 sq4CdPatchTextOptions[] = {
+ 0x89, 0x5a, // lsg 0x5a (load global 90 to stack)
+ 0x3c, // dup
+ 0x35, 0x03, // ldi 0x03 (acc = 3)
+ 0x1a, // eq? (global 90 == 3)
+ 0x2f, 0x07, // bt 0x07
+ 0x89, 0x5a, // lsg 0x5a (load global 90 to stack again)
+ 0x35, 0x01, // ldi 0x01 (acc = 1)
+ 0x02, // add: acc = global 90 (on stack) + 1 (previous acc value)
+ 0x33, 0x02, // jmp 0x02
+ 0x35, 0x01, // ldi 0x01 (reset acc to 1)
+ 0xa1, 0x5a, // sag 0x5a (save acc to global 90)
+ 0x33, 0x03, // jmp 0x03 (jump over the wasted bytes below)
+ 0x34, PATCH_UINT16(0x0000), // ldi 0x0000 (waste 3 bytes)
+ 0x3a, // toss
// (the rest of the code is the same)
PATCH_END
};
-// script, description, magic DWORD, adjust
-const SciScriptSignature sq4Signatures[] = {
- { 298, "Floppy: endless flight", 1, PATCH_MAGICDWORD(0x67, 0x08, 0x63, 0x44), -3, sq4FloppySignatureEndlessFlight, sq4FloppyPatchEndlessFlight },
- { 298, "Floppy (German): endless flight", 1, PATCH_MAGICDWORD(0x67, 0x08, 0x63, 0x4c), -3, sq4FloppySignatureEndlessFlightGerman, sq4FloppyPatchEndlessFlight },
- { 818, "CD: Speech and subtitles option", 1, PATCH_MAGICDWORD(0x89, 0x5a, 0x3c, 0x35), 0, sq4CdSignatureTextOptions, sq4CdPatchTextOptions },
- { 0, "CD: Babble icon speech and subtitles fix", 1, PATCH_MAGICDWORD(0x89, 0x5a, 0x35, 0x02), 0, sq4CdSignatureBabbleIcon, sq4CdPatchBabbleIcon },
- { 818, "CD: Speech and subtitles option button", 1, PATCH_MAGICDWORD(0x35, 0x01, 0xa1, 0x53), 0, sq4CdSignatureTextOptionsButton, sq4CdPatchTextOptionsButton },
+// script, description, signature patch
+static const SciScriptPatcherEntry sq4Signatures[] = {
+ { true, 298, "Floppy: endless flight", 1, sq4FloppySignatureEndlessFlight, sq4FloppyPatchEndlessFlight },
+ { true, 700, "Floppy: throw stuff at sequel police bug", 1, sq4FloppySignatureThrowStuffAtSequelPoliceBug, sq4FloppyPatchThrowStuffAtSequelPoliceBug },
+ { true, 818, "CD: Speech and subtitles option", 1, sq4CdSignatureTextOptions, sq4CdPatchTextOptions },
+ { true, 0, "CD: Babble icon speech and subtitles fix", 1, sq4CdSignatureBabbleIcon, sq4CdPatchBabbleIcon },
+ { true, 818, "CD: Speech and subtitles option button", 1, sq4CdSignatureTextOptionsButton, sq4CdPatchTextOptionsButton },
SCI_SIGNATUREENTRY_TERMINATOR
};
@@ -1478,75 +2398,234 @@ const SciScriptSignature sq4Signatures[] = {
// The same issue happens in Sierra SCI.
// We simply set the correct starting cel number to fix the bug.
// Responsible method: robotIntoShip::changeState(9)
-const byte sq1vgaSignatureUlenceFlatsTimepodGfxGlitch[] = {
- 8,
- 0x39, 0x07, // pushi 07 (ship::cel)
- 0x78, // push1
- 0x39, 0x0a, // pushi 0x0a (set ship::cel to 10)
- 0x38, 0xa0, 0x00, // pushi 0x00a0 (ship::setLoop)
- 0
+static const uint16 sq1vgaSignatureUlenceFlatsTimepodGfxGlitch[] = {
+ 0x39,
+ SIG_MAGICDWORD, SIG_SELECTOR8(cel), // pushi "cel"
+ 0x78, // push1
+ 0x39, 0x0a, // pushi 0x0a (set ship::cel to 10)
+ 0x38, SIG_UINT16(0x00a0), // pushi 0x00a0 (ship::setLoop)
+ SIG_END
+};
+
+static const uint16 sq1vgaPatchUlenceFlatsTimepodGfxGlitch[] = {
+ PATCH_ADDTOOFFSET(+3),
+ 0x39, 0x09, // pushi 0x09 (set ship::cel to 9)
+ PATCH_END
};
-const uint16 sq1vgaPatchUlenceFlatsTimepodGfxGlitch[] = {
- PATCH_ADDTOOFFSET | +3,
- 0x39, 0x09, // pushi 0x09 (set ship::cel to 9)
- PATCH_END
-};
-
-const byte sq1vgaSignatureEgoShowsCard[] = {
- 25,
- 0x38, 0x46, 0x02, // push 0x246 (set up send frame to set timesShownID)
- 0x78, // push1
- 0x38, 0x46, 0x02, // push 0x246 (set up send frame to get timesShownID)
- 0x76, // push0
- 0x51, 0x7c, // class DeltaurRegion
- 0x4a, 0x04, // send 0x04 (get timesShownID)
- 0x36, // push
- 0x35, 0x01, // ldi 1
- 0x02, // add
- 0x36, // push
- 0x51, 0x7c, // class DeltaurRegion
- 0x4a, 0x06, // send 0x06 (set timesShownID)
- 0x36, // push (wrong, acc clobbered by class, above)
- 0x35, 0x03, // ldi 0x03
- 0x22, // lt?
- 0
+static const uint16 sq1vgaSignatureEgoShowsCard[] = {
+ SIG_MAGICDWORD,
+ 0x38, SIG_SELECTOR16(timesShownID), // push "timesShownID"
+ 0x78, // push1
+ 0x38, SIG_SELECTOR16(timesShownID), // push "timesShownID"
+ 0x76, // push0
+ 0x51, 0x7c, // class DeltaurRegion
+ 0x4a, 0x04, // send 0x04 (get timesShownID)
+ 0x36, // push
+ 0x35, 0x01, // ldi 1
+ 0x02, // add
+ 0x36, // push
+ 0x51, 0x7c, // class DeltaurRegion
+ 0x4a, 0x06, // send 0x06 (set timesShownID)
+ 0x36, // push (wrong, acc clobbered by class, above)
+ 0x35, 0x03, // ldi 0x03
+ 0x22, // lt?
+ SIG_END
};
// Note that this script patch is merely a reordering of the
// instructions in the original script.
-const uint16 sq1vgaPatchEgoShowsCard[] = {
- 0x38, 0x46, 0x02, // push 0x246 (set up send frame to get timesShownID)
- 0x76, // push0
- 0x51, 0x7c, // class DeltaurRegion
- 0x4a, 0x04, // send 0x04 (get timesShownID)
- 0x36, // push
- 0x35, 0x01, // ldi 1
- 0x02, // add
- 0x36, // push (this push corresponds to the wrong one above)
- 0x38, 0x46, 0x02, // push 0x246 (set up send frame to set timesShownID)
- 0x78, // push1
- 0x36, // push
- 0x51, 0x7c, // class DeltaurRegion
- 0x4a, 0x06, // send 0x06 (set timesShownID)
- 0x35, 0x03, // ldi 0x03
- 0x22, // lt?
+static const uint16 sq1vgaPatchEgoShowsCard[] = {
+ 0x38, PATCH_SELECTOR16(timesShownID), // push "timesShownID"
+ 0x76, // push0
+ 0x51, 0x7c, // class DeltaurRegion
+ 0x4a, 0x04, // send 0x04 (get timesShownID)
+ 0x36, // push
+ 0x35, 0x01, // ldi 1
+ 0x02, // add
+ 0x36, // push (this push corresponds to the wrong one above)
+ 0x38, PATCH_SELECTOR16(timesShownID), // push "timesShownID"
+ 0x78, // push1
+ 0x36, // push
+ 0x51, 0x7c, // class DeltaurRegion
+ 0x4a, 0x06, // send 0x06 (set timesShownID)
+ 0x35, 0x03, // ldi 0x03
+ 0x22, // lt?
PATCH_END
};
+// The spider droid on planet Korona has a fixed movement speed,
+// which is way faster than the default movement speed of ego.
+// This means that the player would have to turn up movement speed,
+// otherwise it will be impossible to escape it.
+// We fix this issue by making the droid move a bit slower than ego
+// does (relative to movement speed setting).
+//
+// Applies to at least: English PC floppy
+// Responsible method: spider::doit
+static const uint16 sq1vgaSignatureSpiderDroidTiming[] = {
+ SIG_MAGICDWORD,
+ 0x63, 0x4e, // pToa script
+ 0x30, SIG_UINT16(0x0005), // bnt [further method code]
+ 0x35, 0x00, // ldi 00
+ 0x32, SIG_UINT16(0x0062), // jmp [super-call]
+ 0x38, SIG_UINT16(0x0088), // pushi 0088h (script)
+ 0x76, // push0
+ 0x81, 0x02, // lag global[2] (current room)
+ 0x4a, 0x04, // send 04 (get [current room].script)
+ 0x30, SIG_UINT16(0x0005), // bnt [further method code]
+ 0x35, 0x00, // ldi 00
+ 0x32, SIG_UINT16(0x0052), // jmp [super-call]
+ 0x89, 0xa6, // lsg global[a6]
+ 0x35, 0x01, // ldi 01
+ 0x1a, // eq?
+ 0x30, SIG_UINT16(0x0012), // bnt [2nd code], in case global A6 <> 1
+ 0x81, 0xb5, // lag global[b5]
+ 0x30, SIG_UINT16(0x000d), // bnt [2nd code], in case global B5 == 0
+ 0x38, SIG_UINT16(0x008c), // pushi 008c
+ 0x78, // push1
+ 0x72, SIG_UINT16(0x1cb6), // lofsa 1CB6 (moveToPath)
+ 0x36, // push
+ 0x54, 0x06, // self 06
+ 0x32, SIG_UINT16(0x0038), // jmp [super-call]
+ 0x81, 0xb5, // lag global[B5]
+ 0x18, // not
+ 0x30, SIG_UINT16(0x0032), // bnt [super-call], in case global B5 <> 0
+ SIG_END
+}; // 58 bytes)
+
+static const uint16 sq1vgaPatchSpiderDroidTiming[] = {
+ 0x63, 0x4e, // pToa script
+ 0x2f, 0x68, // bt [super-call]
+ 0x38, PATCH_UINT16(0x0088), // pushi 0088 (script)
+ 0x76, // push0
+ 0x81, 0x02, // lag global[2] (current room)
+ 0x4a, 0x04, // send 04
+ 0x2f, 0x5e, // bt [super-call]
+ // --> 12 bytes saved
+ // new code
+ 0x38, PATCH_UINT16(0x0176), // pushi 0176 (egoMoveSpeed)
+ 0x76, // push0
+ 0x81, 0x01, // lag global[1]
+ 0x4a, 0x04, // send 04 - sq1::egoMoveSpeed
+ 0x36, // push
+ 0x36, // push
+ 0x35, 0x03, // ldi 03
+ 0x0c, // shr
+ 0x02, // add --> egoMoveSpeed + (egoMoveSpeed >> 3)
+ 0x39, 0x01, // push 01 (waste 1 byte)
+ 0x02, // add --> egoMoveSpeed++
+ 0x65, 0x4c, // aTop cycleSpeed
+ 0x65, 0x5e, // aTop moveSpeed
+ // new code end
+ 0x89, 0xb5, // lsg global[B5]
+ 0x31, 0x13, // bnt [2nd code chunk]
+ 0x89, 0xa6, // lsg global[A6]
+ 0x35, 0x01, // ldi 01
+ 0x1a, // eq?
+ 0x31, 0x3e, // bnt [super-call]
+ 0x38, PATCH_UINT16(0x008c), // pushi 008c
+ 0x78, // push1
+ 0x72, PATCH_UINT16(0x1cb6), // lofsa moveToPath
+ 0x36, // push
+ 0x54, 0x06, // self 06 - spider::setScript(movePath)
+ 0x33, 0x32, // jmp [super-call]
+ // --> 9 bytes saved
+ PATCH_END
+};
+
+// script, description, signature patch
+static const SciScriptPatcherEntry sq1vgaSignatures[] = {
+ { true, 45, "Ulence Flats: timepod graphic glitch", 1, sq1vgaSignatureUlenceFlatsTimepodGfxGlitch, sq1vgaPatchUlenceFlatsTimepodGfxGlitch },
+ { true, 58, "Sarien armory droid zapping ego first time", 1, sq1vgaSignatureEgoShowsCard, sq1vgaPatchEgoShowsCard },
+ { true, 704, "spider droid timing issue", 1, sq1vgaSignatureSpiderDroidTiming, sq1vgaPatchSpiderDroidTiming },
+ SCI_SIGNATUREENTRY_TERMINATOR
+};
+
+// ===========================================================================
+// The toolbox in sq5 is buggy. When you click on the upper part of the "put
+// in inventory"-button (some items only - for example the hole puncher - at the
+// upper left), points will get awarded correctly and the item will get put into
+// the player's inventory, but you will then get a "not here" message and the
+// item will also remain to be the current mouse cursor.
+// The bug report also says that items may get lost. I wasn't able to reproduce
+// that part.
+// This is caused by the mouse-click event getting reprocessed (which wouldn't
+// be a problem by itself) and during this reprocessing coordinates are not
+// processed the same as during the first click (script 226 includes a local
+// subroutine, which checks coordinates in a hardcoded way w/o port-adjustment).
+// Because of this, the hotspot for the button is lower than it should be, which
+// then results in the game thinking that the user didn't click on the button
+// and also results in the previously mentioned message.
+// This happened in Sierra SCI as well (of course).
+// We fix it by combining state 0 + 1 of takeTool::changeState and so stopping
+// the event to get reprocessed. This was the only way possible, because everything
+// else is done in SCI system scripts and I don't want to touch those.
+// Applies to at least: English/German/French PC floppy
+// Responsible method: takeTool::changeState
+// Fixes bug: #6457
+static const uint16 sq5SignatureToolboxFix[] = {
+ 0x31, 0x13, // bnt [check for state 1]
+ SIG_MAGICDWORD,
+ 0x38, SIG_UINT16(0x00aa), // pushi 00aa
+ 0x39, 0x05, // pushi 05
+ 0x39, 0x16, // pushi 16
+ 0x76, // push0
+ 0x39, 0x03, // pushi 03
+ 0x76, // push0
+ 0x7c, // pushSelf
+ 0x81, 0x5b, // lag 5b
+ 0x4a, 0x0e, // send 0e
+ 0x32, SIG_UINT16(0x0088), // jmp [end-of-method]
+ 0x3c, // dup
+ 0x35, 0x01, // ldi 01
+ 0x1a, // eq?
+ 0x31, 0x28, // bnt [check for state 2]
+ SIG_END
+};
+
+static const uint16 sq5PatchToolboxFix[] = {
+ 0x31, 0x41, // bnt [check for state 2]
+ PATCH_ADDTOOFFSET(+16), // skip to jmp offset
+ 0x35, 0x01, // ldi 01
+ 0x65, 0x14, // aTop [state]
+ 0x36, 0x00, 0x00, // ldi 0000 (waste 3 bytes)
+ 0x35, 0x00, // ldi 00 (waste 2 bytes)
+ PATCH_END
+};
+
+// script, description, signature patch
+static const SciScriptPatcherEntry sq5Signatures[] = {
+ { true, 226, "toolbox fix", 1, sq5SignatureToolboxFix, sq5PatchToolboxFix },
+ SCI_SIGNATUREENTRY_TERMINATOR
+};
+
+// =================================================================================
-// script, description, magic DWORD, adjust
-const SciScriptSignature sq1vgaSignatures[] = {
- { 45, "Ulence Flats: timepod graphic glitch", 1, PATCH_MAGICDWORD( 0x07, 0x78, 0x39, 0x0a ), -1, sq1vgaSignatureUlenceFlatsTimepodGfxGlitch, sq1vgaPatchUlenceFlatsTimepodGfxGlitch },
- { 58, "Sarien armory droid zapping ego first time", 1, PATCH_MAGICDWORD( 0x72, 0x88, 0x15, 0x36 ), -70, sq1vgaSignatureEgoShowsCard, sq1vgaPatchEgoShowsCard },
+ScriptPatcher::ScriptPatcher() {
+ int selectorCount = ARRAYSIZE(selectorNameTable);
+ int selectorNr;
- SCI_SIGNATUREENTRY_TERMINATOR};
+ // Allocate table for selector-IDs and initialize that table as well
+ _selectorIdTable = new Selector[ selectorCount ];
+ for (selectorNr = 0; selectorNr < selectorCount; selectorNr++)
+ _selectorIdTable[selectorNr] = -1;
+
+ _runtimeTable = NULL;
+}
+
+ScriptPatcher::~ScriptPatcher() {
+ delete[] _runtimeTable;
+ delete[] _selectorIdTable;
+}
// will actually patch previously found signature area
-void Script::applyPatch(const uint16 *patch, byte *scriptData, const uint32 scriptSize, int32 signatureOffset) {
+void ScriptPatcher::applyPatch(const SciScriptPatcherEntry *patchEntry, byte *scriptData, const uint32 scriptSize, int32 signatureOffset, const bool isMacSci11) {
+ const uint16 *patchData = patchEntry->patchData;
byte orgData[PATCH_VALUELIMIT];
int32 offset = signatureOffset;
- uint16 patchWord = *patch;
+ uint16 patchWord = *patchEntry->patchData;
+ uint16 patchSelector = 0;
// Copy over original bytes from script
uint32 orgDataSize = scriptSize - offset;
@@ -1555,74 +2634,179 @@ void Script::applyPatch(const uint16 *patch, byte *scriptData, const uint32 scri
memcpy(&orgData, &scriptData[offset], orgDataSize);
while (patchWord != PATCH_END) {
+ uint16 patchCommand = patchWord & PATCH_COMMANDMASK;
uint16 patchValue = patchWord & PATCH_VALUEMASK;
- switch (patchWord & PATCH_COMMANDMASK) {
- case PATCH_ADDTOOFFSET:
+ switch (patchCommand) {
+ case PATCH_CODE_ADDTOOFFSET: {
// add value to offset
- offset += patchValue & ~PATCH_ADDTOOFFSET;
+ offset += patchValue;
break;
- case PATCH_GETORIGINALBYTE:
+ }
+ case PATCH_CODE_GETORIGINALBYTE: {
// get original byte from script
if (patchValue >= orgDataSize)
- error("patching: can not get requested original byte from script");
+ error("Script-Patcher: can not get requested original byte from script");
scriptData[offset] = orgData[patchValue];
offset++;
break;
- case PATCH_ADJUSTWORD: {
- // Adjust word right before current position
- byte *adjustPtr = &scriptData[offset - 2];
- uint16 adjustWord = READ_LE_UINT16(adjustPtr);
- adjustWord += patchValue;
- WRITE_LE_UINT16(adjustPtr, adjustWord);
+ }
+ case PATCH_CODE_GETORIGINALBYTEADJUST: {
+ // get original byte from script and adjust it
+ if (patchValue >= orgDataSize)
+ error("Script-Patcher: can not get requested original byte from script");
+ byte orgByte = orgData[patchValue];
+ int16 adjustValue;
+ patchData++; adjustValue = (int16)(*patchData);
+ scriptData[offset] = orgByte + adjustValue;
+ offset++;
break;
}
- case PATCH_ADJUSTWORD_NEG: {
- // Adjust word right before current position (negative way)
- byte *adjustPtr = &scriptData[offset - 2];
- uint16 adjustWord = READ_LE_UINT16(adjustPtr);
- adjustWord -= patchValue;
- WRITE_LE_UINT16(adjustPtr, adjustWord);
+ case PATCH_CODE_UINT16:
+ case PATCH_CODE_SELECTOR16: {
+ byte byte1;
+ byte byte2;
+
+ switch (patchCommand) {
+ case PATCH_CODE_UINT16: {
+ byte1 = patchValue & PATCH_BYTEMASK;
+ patchData++; patchWord = *patchData;
+ if (patchWord & PATCH_COMMANDMASK)
+ error("Script-Patcher: Patch inconsistent");
+ byte2 = patchWord & PATCH_BYTEMASK;
+ break;
+ }
+ case PATCH_CODE_SELECTOR16: {
+ patchSelector = _selectorIdTable[patchValue];
+ byte1 = patchSelector & 0xFF;
+ byte2 = patchSelector >> 8;
+ break;
+ }
+ default:
+ byte1 = 0; byte2 = 0;
+ }
+ if (!isMacSci11) {
+ scriptData[offset++] = byte1;
+ scriptData[offset++] = byte2;
+ } else {
+ // SCI1.1+ on macintosh had uint16s in script in BE-order
+ scriptData[offset++] = byte2;
+ scriptData[offset++] = byte1;
+ }
break;
}
- default:
- scriptData[offset] = patchValue & 0xFF;
+ case PATCH_CODE_SELECTOR8: {
+ patchSelector = _selectorIdTable[patchValue];
+ if (patchSelector & 0xFF00)
+ error("Script-Patcher: 8 bit selector required, game uses 16 bit selector");
+ scriptData[offset] = patchSelector & 0xFF;
offset++;
+ break;
}
- patch++;
- patchWord = *patch;
+ case PATCH_CODE_BYTE:
+ scriptData[offset] = patchValue & PATCH_BYTEMASK;
+ offset++;
+ }
+ patchData++;
+ patchWord = *patchData;
}
}
// will return -1 if no match was found, otherwise an offset to the start of the signature match
-int32 Script::findSignature(const SciScriptSignature *signature, const byte *scriptData, const uint32 scriptSize) {
+int32 ScriptPatcher::findSignature(const SciScriptPatcherEntry *patchEntry, SciScriptPatcherRuntimeEntry *runtimeEntry, const byte *scriptData, const uint32 scriptSize, const bool isMacSci11) {
if (scriptSize < 4) // we need to find a DWORD, so less than 4 bytes is not okay
return -1;
- const uint32 magicDWord = signature->magicDWord; // is platform-specific BE/LE form, so that the later match will work
+ const uint32 magicDWord = runtimeEntry->magicDWord; // is platform-specific BE/LE form, so that the later match will work
const uint32 searchLimit = scriptSize - 3;
uint32 DWordOffset = 0;
// first search for the magic DWORD
while (DWordOffset < searchLimit) {
if (magicDWord == READ_UINT32(scriptData + DWordOffset)) {
// magic DWORD found, check if actual signature matches
- uint32 offset = DWordOffset + signature->magicOffset;
+ uint32 offset = DWordOffset + runtimeEntry->magicOffset;
uint32 byteOffset = offset;
- const byte *signatureData = signature->data;
- byte matchAdjust = 1;
- while (matchAdjust) {
- byte matchBytesCount = *signatureData++;
- if ((byteOffset + matchBytesCount) > scriptSize) // Out-Of-Bounds?
+ const uint16 *signatureData = patchEntry->signatureData;
+ uint16 sigSelector = 0;
+
+ uint16 sigWord = *signatureData;
+ while (sigWord != SIG_END) {
+ uint16 sigCommand = sigWord & SIG_COMMANDMASK;
+ uint16 sigValue = sigWord & SIG_VALUEMASK;
+ switch (sigCommand) {
+ case SIG_CODE_ADDTOOFFSET: {
+ // add value to offset
+ byteOffset += sigValue;
+ break;
+ }
+ case SIG_CODE_UINT16:
+ case SIG_CODE_SELECTOR16: {
+ if ((byteOffset + 1) < scriptSize) {
+ byte byte1;
+ byte byte2;
+
+ switch (sigCommand) {
+ case SIG_CODE_UINT16: {
+ byte1 = sigValue & SIG_BYTEMASK;
+ signatureData++; sigWord = *signatureData;
+ if (sigWord & SIG_COMMANDMASK)
+ error("Script-Patcher: signature inconsistent\nFaulty patch: '%s'", patchEntry->description);
+ byte2 = sigWord & SIG_BYTEMASK;
+ break;
+ }
+ case SIG_CODE_SELECTOR16: {
+ sigSelector = _selectorIdTable[sigValue];
+ byte1 = sigSelector & 0xFF;
+ byte2 = sigSelector >> 8;
+ break;
+ }
+ default:
+ byte1 = 0; byte2 = 0;
+ }
+ if (!isMacSci11) {
+ if ((scriptData[byteOffset] != byte1) || (scriptData[byteOffset + 1] != byte2))
+ sigWord = SIG_MISMATCH;
+ } else {
+ // SCI1.1+ on macintosh had uint16s in script in BE-order
+ if ((scriptData[byteOffset] != byte2) || (scriptData[byteOffset + 1] != byte1))
+ sigWord = SIG_MISMATCH;
+ }
+ byteOffset += 2;
+ } else {
+ sigWord = SIG_MISMATCH;
+ }
break;
- if (memcmp(signatureData, &scriptData[byteOffset], matchBytesCount)) // Byte-Mismatch?
+ }
+ case SIG_CODE_SELECTOR8: {
+ if (byteOffset < scriptSize) {
+ sigSelector = _selectorIdTable[sigValue];
+ if (sigSelector & 0xFF00)
+ error("Script-Patcher: 8 bit selector required, game uses 16 bit selector\nFaulty patch: '%s'", patchEntry->description);
+ if (scriptData[byteOffset] != (sigSelector & 0xFF))
+ sigWord = SIG_MISMATCH;
+ byteOffset++;
+ } else {
+ sigWord = SIG_MISMATCH; // out of bounds
+ }
+ break;
+ }
+ case SIG_CODE_BYTE:
+ if (byteOffset < scriptSize) {
+ if (scriptData[byteOffset] != sigWord)
+ sigWord = SIG_MISMATCH;
+ byteOffset++;
+ } else {
+ sigWord = SIG_MISMATCH; // out of bounds
+ }
+ }
+
+ if (sigWord == SIG_MISMATCH)
break;
- // those bytes matched, adjust offsets accordingly
- signatureData += matchBytesCount;
- byteOffset += matchBytesCount;
- // get offset...
- matchAdjust = *signatureData++;
- byteOffset += matchAdjust;
+
+ signatureData++;
+ sigWord = *signatureData;
}
- if (!matchAdjust) // all matches worked?
+
+ if (sigWord == SIG_END) // signature fully matched?
return offset;
}
DWordOffset++;
@@ -1631,9 +2815,182 @@ int32 Script::findSignature(const SciScriptSignature *signature, const byte *scr
return -1;
}
-void Script::matchSignatureAndPatch(uint16 scriptNr, byte *scriptData, const uint32 scriptSize) {
- const SciScriptSignature *signatureTable = NULL;
- switch (g_sci->getGameId()) {
+// This method calculates the magic DWORD for each entry in the signature table
+// and it also initializes the selector table for selectors used in the signatures/patches of the current game
+void ScriptPatcher::initSignature(const SciScriptPatcherEntry *patchTable, bool isMacSci11) {
+ const SciScriptPatcherEntry *curEntry = patchTable;
+ SciScriptPatcherRuntimeEntry *curRuntimeEntry;
+ Selector curSelector = -1;
+ int step;
+ int magicOffset;
+ byte magicDWord[4];
+ int magicDWordLeft = 0;
+ const uint16 *curData;
+ uint16 curWord;
+ uint16 curCommand;
+ uint32 curValue;
+ byte byte1 = 0;
+ byte byte2 = 0;
+ int patchEntryCount = 0;
+
+ // Count entries and allocate runtime data
+ while (curEntry->signatureData) {
+ patchEntryCount++; curEntry++;
+ }
+ _runtimeTable = new SciScriptPatcherRuntimeEntry[patchEntryCount];
+ memset(_runtimeTable, 0, sizeof(SciScriptPatcherRuntimeEntry) * patchEntryCount);
+
+ curEntry = patchTable;
+ curRuntimeEntry = _runtimeTable;
+ while (curEntry->signatureData) {
+ // process signature
+ memset(magicDWord, 0, sizeof(magicDWord));
+
+ curRuntimeEntry->active = curEntry->defaultActive;
+ curRuntimeEntry->magicDWord = 0;
+ curRuntimeEntry->magicOffset = 0;
+
+ for (step = 0; step < 2; step++) {
+ switch (step) {
+ case 0: curData = curEntry->signatureData; break;
+ case 1: curData = curEntry->patchData; break;
+ }
+
+ curWord = *curData;
+ magicOffset = 0;
+ while (curWord != SIG_END) {
+ curCommand = curWord & SIG_COMMANDMASK;
+ curValue = curWord & SIG_VALUEMASK;
+ switch (curCommand) {
+ case SIG_MAGICDWORD: {
+ if (step == 0) {
+ if ((curRuntimeEntry->magicDWord) || (magicDWordLeft))
+ error("Script-Patcher: Magic-DWORD specified multiple times in signature\nFaulty patch: '%s'", curEntry->description);
+ magicDWordLeft = 4;
+ curRuntimeEntry->magicOffset = magicOffset;
+ }
+ break;
+ }
+ case SIG_CODE_ADDTOOFFSET: {
+ magicOffset -= curValue;
+ if (magicDWordLeft)
+ error("Script-Patcher: Magic-DWORD contains AddToOffset command\nFaulty patch: '%s'", curEntry->description);
+ break;
+ }
+ case SIG_CODE_UINT16:
+ case SIG_CODE_SELECTOR16: {
+ // UINT16 or 1
+ switch (curCommand) {
+ case SIG_CODE_UINT16: {
+ curData++; curWord = *curData;
+ if (curWord & SIG_COMMANDMASK)
+ error("Script-Patcher: signature entry inconsistent\nFaulty patch: '%s'", curEntry->description);
+ if (!isMacSci11) {
+ byte1 = curValue;
+ byte2 = curWord & SIG_BYTEMASK;
+ } else {
+ byte1 = curWord & SIG_BYTEMASK;
+ byte2 = curValue;
+ }
+ break;
+ }
+ case SIG_CODE_SELECTOR16: {
+ curSelector = _selectorIdTable[curValue];
+ if (curSelector == -1) {
+ curSelector = g_sci->getKernel()->findSelector(selectorNameTable[curValue]);
+ _selectorIdTable[curValue] = curSelector;
+ }
+ if (!isMacSci11) {
+ byte1 = curSelector & 0x00FF;
+ byte2 = curSelector >> 8;
+ } else {
+ byte1 = curSelector >> 8;
+ byte2 = curSelector & 0x00FF;
+ }
+ break;
+ }
+ }
+ magicOffset -= 2;
+ if (magicDWordLeft) {
+ // Remember current word for Magic DWORD
+ magicDWord[4 - magicDWordLeft] = byte1;
+ magicDWordLeft--;
+ if (magicDWordLeft) {
+ magicDWord[4 - magicDWordLeft] = byte2;
+ magicDWordLeft--;
+ }
+ if (!magicDWordLeft) {
+ curRuntimeEntry->magicDWord = READ_LE_UINT32(magicDWord);
+ }
+ }
+ break;
+ }
+ case SIG_CODE_BYTE:
+ case SIG_CODE_SELECTOR8: {
+ if (curCommand == SIG_CODE_SELECTOR8) {
+ curSelector = _selectorIdTable[curValue];
+ if (curSelector == -1) {
+ curSelector = g_sci->getKernel()->findSelector(selectorNameTable[curValue]);
+ _selectorIdTable[curValue] = curSelector;
+ if (curSelector != -1) {
+ if (curSelector & 0xFF00)
+ error("Script-Patcher: 8 bit selector required, game uses 16 bit selector\nFaulty patch: '%s'", curEntry->description);
+ }
+ }
+ curValue = curSelector;
+ }
+ magicOffset--;
+ if (magicDWordLeft) {
+ // Remember current byte for Magic DWORD
+ magicDWord[4 - magicDWordLeft] = (byte)curValue;
+ magicDWordLeft--;
+ if (!magicDWordLeft) {
+ curRuntimeEntry->magicDWord = READ_LE_UINT32(magicDWord);
+ }
+ }
+ }
+ }
+ curData++;
+ curWord = *curData;
+ }
+ }
+ if (magicDWordLeft)
+ error("Script-Patcher: Magic-DWORD beyond End-Of-Signature\nFaulty patch: '%s'", curEntry->description);
+ if (!curRuntimeEntry->magicDWord)
+ error("Script-Patcher: Magic-DWORD not specified in signature\nFaulty patch: '%s'", curEntry->description);
+
+ curEntry++; curRuntimeEntry++;
+ }
+}
+
+// This method enables certain patches
+// It's used for patches, which are not meant to get applied all the time
+void ScriptPatcher::enablePatch(const SciScriptPatcherEntry *patchTable, const char *searchDescription) {
+ const SciScriptPatcherEntry *curEntry = patchTable;
+ SciScriptPatcherRuntimeEntry *runtimeEntry = _runtimeTable;
+ int searchDescriptionLen = strlen(searchDescription);
+ int matchCount = 0;
+
+ while (curEntry->signatureData) {
+ if (strncmp(curEntry->description, searchDescription, searchDescriptionLen) == 0) {
+ // match found, enable patch
+ runtimeEntry->active = true;
+ matchCount++;
+ }
+ curEntry++; runtimeEntry++;
+ }
+
+ if (!matchCount)
+ error("Script-Patcher: no patch found to enable");
+}
+
+void ScriptPatcher::processScript(uint16 scriptNr, byte *scriptData, const uint32 scriptSize) {
+ const SciScriptPatcherEntry *signatureTable = NULL;
+ const SciScriptPatcherEntry *curEntry = NULL;
+ SciScriptPatcherRuntimeEntry *curRuntimeEntry = NULL;
+ const Sci::SciGameId gameId = g_sci->getGameId();
+
+ switch (gameId) {
case GID_CAMELOT:
signatureTable = camelotSignatures;
break;
@@ -1653,11 +3010,7 @@ void Script::matchSignatureAndPatch(uint16 scriptNr, byte *scriptData, const uin
signatureTable = gk1Signatures;
break;
case GID_KQ5:
- // See the explanation in the kq5SignatureWinGMSignals comment
- if (g_sci->_features->useAltWinGMSound())
- signatureTable = kq5WinGMSignatures;
- else
- signatureTable = kq5Signatures;
+ signatureTable = kq5Signatures;
break;
case GID_KQ6:
signatureTable = kq6Signatures;
@@ -1671,6 +3024,9 @@ void Script::matchSignatureAndPatch(uint16 scriptNr, byte *scriptData, const uin
case GID_LSL2:
signatureTable = larry2Signatures;
break;
+ case GID_LSL5:
+ signatureTable = larry5Signatures;
+ break;
case GID_LSL6:
signatureTable = larry6Signatures;
break;
@@ -1695,26 +3051,67 @@ void Script::matchSignatureAndPatch(uint16 scriptNr, byte *scriptData, const uin
case GID_SQ4:
signatureTable = sq4Signatures;
break;
+ case GID_SQ5:
+ signatureTable = sq5Signatures;
+ break;
default:
break;
}
if (signatureTable) {
- while (signatureTable->data) {
- if (scriptNr == signatureTable->scriptNr) {
+ bool isMacSci11 = (g_sci->getPlatform() == Common::kPlatformMacintosh && getSciVersion() >= SCI_VERSION_1_1);
+
+ if (!_runtimeTable) {
+ // Abort, in case selectors are not yet initialized (happens for games w/o selector-dictionary)
+ if (!g_sci->getKernel()->selectorNamesAvailable())
+ return;
+
+ // signature table needs to get initialized (Magic DWORD set, selector table set)
+ initSignature(signatureTable, isMacSci11);
+
+ // Do additional game-specific initialization
+ switch (gameId) {
+ case GID_KQ5:
+ if (g_sci->_features->useAltWinGMSound()) {
+ // See the explanation in the kq5SignatureWinGMSignals comment
+ enablePatch(signatureTable, "Win: GM Music signal checks");
+ }
+ break;
+ case GID_KQ6:
+ if (g_sci->isCD()) {
+ // Enables Dual mode patches (audio + subtitles at the same time) for King's Quest 6
+ enablePatch(signatureTable, "CD: audio + text support");
+ }
+ break;
+ case GID_LAURABOW2:
+ if (g_sci->isCD()) {
+ // Enables Dual mode patches (audio + subtitles at the same time) for Laura Bow 2
+ enablePatch(signatureTable, "CD: audio + text support");
+ }
+ break;
+ default:
+ break;
+ }
+ }
+
+ curEntry = signatureTable;
+ curRuntimeEntry = _runtimeTable;
+
+ while (curEntry->signatureData) {
+ if ((scriptNr == curEntry->scriptNr) && (curRuntimeEntry->active)) {
int32 foundOffset = 0;
- int16 applyCount = signatureTable->applyCount;
+ int16 applyCount = curEntry->applyCount;
do {
- foundOffset = findSignature(signatureTable, scriptData, scriptSize);
+ foundOffset = findSignature(curEntry, curRuntimeEntry, scriptData, scriptSize, isMacSci11);
if (foundOffset != -1) {
// found, so apply the patch
- debugC(kDebugLevelScripts, "matched and patched %s on script %d offset %d", signatureTable->description, scriptNr, foundOffset);
- applyPatch(signatureTable->patch, scriptData, scriptSize, foundOffset);
+ debugC(kDebugLevelScriptPatcher, "Script-Patcher: '%s' on script %d offset %d", curEntry->description, scriptNr, foundOffset);
+ applyPatch(curEntry, scriptData, scriptSize, foundOffset, isMacSci11);
}
applyCount--;
} while ((foundOffset != -1) && (applyCount));
}
- signatureTable++;
+ curEntry++; curRuntimeEntry++;
}
}
}
diff --git a/engines/sci/engine/script_patches.h b/engines/sci/engine/script_patches.h
new file mode 100644
index 0000000000..0b35792949
--- /dev/null
+++ b/engines/sci/engine/script_patches.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 SCI_ENGINE_SCRIPT_PATCHES_H
+#define SCI_ENGINE_SCRIPT_PATCHES_H
+
+#include "sci/sci.h"
+
+namespace Sci {
+
+// Please do not use the #defines, that are called SIG_CODE_* / PATCH_CODE_* inside signature/patch-tables
+#define SIG_END 0xFFFF
+#define SIG_MISMATCH 0xFFFE
+#define SIG_COMMANDMASK 0xF000
+#define SIG_VALUEMASK 0x0FFF
+#define SIG_BYTEMASK 0x00FF
+#define SIG_MAGICDWORD 0xF000
+#define SIG_CODE_ADDTOOFFSET 0xE000
+#define SIG_ADDTOOFFSET(_offset_) SIG_CODE_ADDTOOFFSET | _offset_
+#define SIG_CODE_SELECTOR16 0x9000
+#define SIG_SELECTOR16(_selectorID_) SIG_CODE_SELECTOR16 | SELECTOR_##_selectorID_
+#define SIG_CODE_SELECTOR8 0x8000
+#define SIG_SELECTOR8(_selectorID_) SIG_CODE_SELECTOR8 | SELECTOR_##_selectorID_
+#define SIG_CODE_UINT16 0x1000
+#define SIG_UINT16(_value_) SIG_CODE_UINT16 | (_value_ & 0xFF), (_value_ >> 8)
+#define SIG_CODE_BYTE 0x0000
+
+#define PATCH_END SIG_END
+#define PATCH_COMMANDMASK SIG_COMMANDMASK
+#define PATCH_VALUEMASK SIG_VALUEMASK
+#define PATCH_BYTEMASK SIG_BYTEMASK
+#define PATCH_CODE_ADDTOOFFSET SIG_CODE_ADDTOOFFSET
+#define PATCH_ADDTOOFFSET(_offset_) SIG_CODE_ADDTOOFFSET | _offset_
+#define PATCH_CODE_GETORIGINALBYTE 0xD000
+#define PATCH_GETORIGINALBYTE(_offset_) PATCH_CODE_GETORIGINALBYTE | _offset_
+#define PATCH_CODE_GETORIGINALBYTEADJUST 0xC000
+#define PATCH_GETORIGINALBYTEADJUST(_offset_, _adjustValue_) PATCH_CODE_GETORIGINALBYTEADJUST | _offset_, (uint16)(_adjustValue_)
+#define PATCH_CODE_SELECTOR16 SIG_CODE_SELECTOR16
+#define PATCH_SELECTOR16(_selectorID_) SIG_CODE_SELECTOR16 | SELECTOR_##_selectorID_
+#define PATCH_CODE_SELECTOR8 SIG_CODE_SELECTOR8
+#define PATCH_SELECTOR8(_selectorID_) SIG_CODE_SELECTOR8 | SELECTOR_##_selectorID_
+#define PATCH_CODE_UINT16 SIG_CODE_UINT16
+#define PATCH_UINT16(_value_) SIG_CODE_UINT16 | (_value_ & 0xFF), (_value_ >> 8)
+#define PATCH_CODE_BYTE SIG_CODE_BYTE
+
+// defines maximum scratch area for getting original bytes from unpatched script data
+#define PATCH_VALUELIMIT 4096
+
+struct SciScriptPatcherEntry {
+ bool defaultActive;
+ uint16 scriptNr;
+ const char *description;
+ int16 applyCount;
+ const uint16 *signatureData;
+ const uint16 *patchData;
+};
+
+//#define SCI_SIGNATUREENTRY_TERMINATOR { false, 0, NULL, 0, 0, 0, NULL, NULL }
+#define SCI_SIGNATUREENTRY_TERMINATOR { false, 0, NULL, 0, NULL, NULL }
+
+struct SciScriptPatcherRuntimeEntry {
+ bool active;
+ uint32 magicDWord;
+ int magicOffset;
+};
+
+/**
+ * ScriptPatcher class, handles on-the-fly patching of script data
+ */
+class ScriptPatcher {
+public:
+ ScriptPatcher();
+ ~ScriptPatcher();
+
+ void processScript(uint16 scriptNr, byte *scriptData, const uint32 scriptSize);
+
+private:
+ void initSignature(const SciScriptPatcherEntry *patchTable, bool isMacSci11);
+ void enablePatch(const SciScriptPatcherEntry *patchTable, const char *searchDescription);
+ int32 findSignature(const SciScriptPatcherEntry *patchEntry, SciScriptPatcherRuntimeEntry *runtimeEntry, const byte *scriptData, const uint32 scriptSize, bool isMacSci11);
+ void applyPatch(const SciScriptPatcherEntry *patchEntry, byte *scriptData, const uint32 scriptSize, int32 signatureOffset, bool isMacSci11);
+
+ Selector *_selectorIdTable;
+ SciScriptPatcherRuntimeEntry *_runtimeTable;
+};
+
+} // End of namespace Sci
+
+#endif // SCI_ENGINE_WORKAROUNDS_H
diff --git a/engines/sci/engine/scriptdebug.cpp b/engines/sci/engine/scriptdebug.cpp
index 277437109c..f0157a6569 100644
--- a/engines/sci/engine/scriptdebug.cpp
+++ b/engines/sci/engine/scriptdebug.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -604,7 +604,7 @@ bool SciEngine::checkSelectorBreakpoint(BreakpointType breakpointType, reg_t sen
Common::List<Breakpoint>::const_iterator bpIter;
for (bpIter = _debugState._breakpoints.begin(); bpIter != _debugState._breakpoints.end(); ++bpIter) {
if ((*bpIter).type == breakpointType && (*bpIter).name == methodName) {
- _console->DebugPrintf("Break on %s (in [%04x:%04x])\n", methodName.c_str(), PRINT_REG(send_obj));
+ _console->debugPrintf("Break on %s (in [%04x:%04x])\n", methodName.c_str(), PRINT_REG(send_obj));
_debugState.debugging = true;
_debugState.breakpointWasHit = true;
return true;
@@ -620,7 +620,7 @@ bool SciEngine::checkExportBreakpoint(uint16 script, uint16 pubfunct) {
Common::List<Breakpoint>::const_iterator bp;
for (bp = _debugState._breakpoints.begin(); bp != _debugState._breakpoints.end(); ++bp) {
if (bp->type == BREAK_EXPORT && bp->address == bpaddress) {
- _console->DebugPrintf("Break on script %d, export %d\n", script, pubfunct);
+ _console->debugPrintf("Break on script %d, export %d\n", script, pubfunct);
_debugState.debugging = true;
_debugState.breakpointWasHit = true;
return true;
@@ -666,12 +666,12 @@ void debugSelectorCall(reg_t send_obj, Selector selector, int argc, StackPtr arg
reg_t selectorValue = *varp.getPointer(segMan);
if (!argc && (activeBreakpointTypes & BREAK_SELECTORREAD)) {
if (g_sci->checkSelectorBreakpoint(BREAK_SELECTORREAD, send_obj, selector))
- con->DebugPrintf("Read from selector (%s:%s): %04x:%04x\n",
+ con->debugPrintf("Read from selector (%s:%s): %04x:%04x\n",
objectName, selectorName,
PRINT_REG(selectorValue));
} else if (argc && (activeBreakpointTypes & BREAK_SELECTORWRITE)) {
if (g_sci->checkSelectorBreakpoint(BREAK_SELECTORWRITE, send_obj, selector))
- con->DebugPrintf("Write to selector (%s:%s): change %04x:%04x to %04x:%04x\n",
+ con->debugPrintf("Write to selector (%s:%s): change %04x:%04x to %04x:%04x\n",
objectName, selectorName,
PRINT_REG(selectorValue), PRINT_REG(argp[1]));
}
@@ -690,13 +690,13 @@ void debugSelectorCall(reg_t send_obj, Selector selector, int argc, StackPtr arg
if (true) {
if (true) {
#endif
- con->DebugPrintf("%s::%s(", objectName, selectorName);
+ con->debugPrintf("%s::%s(", objectName, selectorName);
for (int i = 0; i < argc; i++) {
- con->DebugPrintf("%04x:%04x", PRINT_REG(argp[i+1]));
+ con->debugPrintf("%04x:%04x", PRINT_REG(argp[i+1]));
if (i + 1 < argc)
- con->DebugPrintf(", ");
+ con->debugPrintf(", ");
}
- con->DebugPrintf(") at %04x:%04x\n", PRINT_REG(funcp));
+ con->debugPrintf(") at %04x:%04x\n", PRINT_REG(funcp));
}
}
break;
@@ -737,37 +737,39 @@ void logKernelCall(const KernelFunction *kernelCall, const KernelSubFunction *ke
case SIG_TYPE_REFERENCE:
{
SegmentObj *mobj = s->_segMan->getSegmentObj(argv[parmNr].getSegment());
- switch (mobj->getType()) {
- case SEG_TYPE_HUNK:
- {
- HunkTable *ht = (HunkTable *)mobj;
- int index = argv[parmNr].getOffset();
- if (ht->isValidEntry(index)) {
- // NOTE: This ", deleted" isn't as useful as it could
- // be because it prints the status _after_ the kernel
- // call.
- debugN(" ('%s' hunk%s)", ht->_table[index].type, ht->_table[index].mem ? "" : ", deleted");
- } else
- debugN(" (INVALID hunk ref)");
- break;
- }
- default:
- // TODO: Any other segment types which could
- // use special handling?
-
- if (kernelCall->function == kSaid) {
- SegmentRef saidSpec = s->_segMan->dereference(argv[parmNr]);
- if (saidSpec.isRaw) {
- debugN(" ('");
- g_sci->getVocabulary()->debugDecipherSaidBlock(saidSpec.raw);
- debugN("')");
+ if (mobj) {
+ switch (mobj->getType()) {
+ case SEG_TYPE_HUNK:
+ {
+ HunkTable *ht = (HunkTable *)mobj;
+ int index = argv[parmNr].getOffset();
+ if (ht->isValidEntry(index)) {
+ // NOTE: This ", deleted" isn't as useful as it could
+ // be because it prints the status _after_ the kernel
+ // call.
+ debugN(" ('%s' hunk%s)", ht->_table[index].type, ht->_table[index].mem ? "" : ", deleted");
+ } else
+ debugN(" (INVALID hunk ref)");
+ break;
+ }
+ default:
+ // TODO: Any other segment types which could
+ // use special handling?
+
+ if (kernelCall->function == kSaid) {
+ SegmentRef saidSpec = s->_segMan->dereference(argv[parmNr]);
+ if (saidSpec.isRaw) {
+ debugN(" ('");
+ g_sci->getVocabulary()->debugDecipherSaidBlock(saidSpec.raw);
+ debugN("')");
+ } else {
+ debugN(" (non-raw said-spec)");
+ }
} else {
- debugN(" (non-raw said-spec)");
+ debugN(" ('%s')", s->_segMan->getString(argv[parmNr]).c_str());
}
- } else {
- debugN(" ('%s')", s->_segMan->getString(argv[parmNr]).c_str());
+ break;
}
- break;
}
}
default:
diff --git a/engines/sci/engine/seg_manager.cpp b/engines/sci/engine/seg_manager.cpp
index 97e33f256b..3738fd3dcb 100644
--- a/engines/sci/engine/seg_manager.cpp
+++ b/engines/sci/engine/seg_manager.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -28,7 +28,8 @@
namespace Sci {
-SegManager::SegManager(ResourceManager *resMan) {
+SegManager::SegManager(ResourceManager *resMan, ScriptPatcher *scriptPatcher)
+ : _resMan(resMan), _scriptPatcher(scriptPatcher) {
_heap.push_back(0);
_clonesSegId = 0;
@@ -44,8 +45,6 @@ SegManager::SegManager(ResourceManager *resMan) {
_stringSegId = 0;
#endif
- _resMan = resMan;
-
createClassTable();
}
@@ -262,8 +261,14 @@ const char *SegManager::getObjectName(reg_t pos) {
const char *name = 0;
if (nameReg.getSegment())
name = derefString(nameReg);
- if (!name)
- return "<invalid name>";
+ if (!name) {
+ // Crazy Nick Laura Bow is missing some object names needed for the static
+ // selector vocabulary
+ if (g_sci->getGameId() == GID_CNICK_LAURABOW && pos == make_reg(1, 0x2267))
+ return "Character";
+ else
+ return "<invalid name>";
+ }
return name;
}
@@ -977,7 +982,7 @@ int SegManager::instantiateScript(int scriptNum) {
scr = allocateScript(scriptNum, &segmentId);
}
- scr->load(scriptNum, _resMan);
+ scr->load(scriptNum, _resMan, _scriptPatcher);
scr->initializeLocals(this);
scr->initializeClasses(this);
scr->initializeObjects(this, segmentId);
diff --git a/engines/sci/engine/seg_manager.h b/engines/sci/engine/seg_manager.h
index 074d3f6b0a..2d6e624f6f 100644
--- a/engines/sci/engine/seg_manager.h
+++ b/engines/sci/engine/seg_manager.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -49,7 +49,7 @@ public:
/**
* Initialize the segment manager.
*/
- SegManager(ResourceManager *resMan);
+ SegManager(ResourceManager *resMan, ScriptPatcher *scriptPatcher);
/**
* Deallocate all memory associated with the segment manager.
@@ -224,7 +224,7 @@ public:
* Allocate a fresh chunk of the hunk
* @param[in] size Number of bytes to allocate for the hunk entry
* @param[in] hunk_type A descriptive string for the hunk entry, for
- * debugging purposes
+ * debugging purposes
* @return The offset of the freshly allocated hunk entry
*/
reg_t allocateHunkEntry(const char *hunk_type, int size);
@@ -448,6 +448,7 @@ private:
Common::HashMap<int, SegmentId> _scriptSegMap;
ResourceManager *_resMan;
+ ScriptPatcher *_scriptPatcher;
SegmentId _clonesSegId; ///< ID of the (a) clones segment
SegmentId _listsSegId; ///< ID of the (a) list segment
diff --git a/engines/sci/engine/segment.cpp b/engines/sci/engine/segment.cpp
index a7f147a15a..bb90698e6a 100644
--- a/engines/sci/engine/segment.cpp
+++ b/engines/sci/engine/segment.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/sci/engine/segment.h b/engines/sci/engine/segment.h
index 0d54b651e1..de7f60ac16 100644
--- a/engines/sci/engine/segment.h
+++ b/engines/sci/engine/segment.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/sci/engine/selector.cpp b/engines/sci/engine/selector.cpp
index 2f6b4d58dd..910f1f885f 100644
--- a/engines/sci/engine/selector.cpp
+++ b/engines/sci/engine/selector.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/sci/engine/selector.h b/engines/sci/engine/selector.h
index 5d3d0752ac..b3dd393708 100644
--- a/engines/sci/engine/selector.h
+++ b/engines/sci/engine/selector.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/sci/engine/state.cpp b/engines/sci/engine/state.cpp
index 0f0c8dcd66..7701822f6d 100644
--- a/engines/sci/engine/state.cpp
+++ b/engines/sci/engine/state.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -252,7 +252,7 @@ Common::String SciEngine::getSciLanguageString(const Common::String &str, kLangu
}
}
- if (seeker)
+ if (*seeker)
return Common::String(str.c_str(), seeker - str.c_str());
else
return str;
diff --git a/engines/sci/engine/state.h b/engines/sci/engine/state.h
index 25110ce0ca..ecc8cb7dfe 100644
--- a/engines/sci/engine/state.h
+++ b/engines/sci/engine/state.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/sci/engine/static_selectors.cpp b/engines/sci/engine/static_selectors.cpp
index 74d2851024..188da3d5a2 100644
--- a/engines/sci/engine/static_selectors.cpp
+++ b/engines/sci/engine/static_selectors.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/sci/engine/vm.cpp b/engines/sci/engine/vm.cpp
index ef8f165084..06858540ec 100644
--- a/engines/sci/engine/vm.cpp
+++ b/engines/sci/engine/vm.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -200,11 +200,18 @@ static void write_var(EngineState *s, int type, int index, reg_t value) {
s->variables[type][index] = value;
- // If the game is trying to change its speech/subtitle settings, apply the ScummVM audio
- // options first, if they haven't been applied yet
- if (type == VAR_GLOBAL && index == 90 && !g_sci->getEngineState()->_syncedAudioOptions) {
- g_sci->syncIngameAudioOptions();
- g_sci->getEngineState()->_syncedAudioOptions = true;
+ if (type == VAR_GLOBAL && index == 90) {
+ // The game is trying to change its speech/subtitle settings
+ if (!g_sci->getEngineState()->_syncedAudioOptions || s->variables[VAR_GLOBAL][4] == TRUE_REG) {
+ // ScummVM audio options haven't been applied yet, so apply them.
+ // We also force the ScummVM audio options when loading a game from
+ // the launcher.
+ g_sci->syncIngameAudioOptions();
+ g_sci->getEngineState()->_syncedAudioOptions = true;
+ } else {
+ // Update ScummVM's audio options
+ g_sci->updateScummVMAudioOptions();
+ }
}
}
}
diff --git a/engines/sci/engine/vm.h b/engines/sci/engine/vm.h
index 8b38faa013..cf65803929 100644
--- a/engines/sci/engine/vm.h
+++ b/engines/sci/engine/vm.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/sci/engine/vm_types.cpp b/engines/sci/engine/vm_types.cpp
index 5327dd1a2e..65a82832cc 100644
--- a/engines/sci/engine/vm_types.cpp
+++ b/engines/sci/engine/vm_types.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -28,6 +28,43 @@
namespace Sci {
+SegmentId reg_t::getSegment() const {
+ if (getSciVersion() <= SCI_VERSION_2_1) {
+ return _segment;
+ } else {
+ // Return the lower 14 bits of the segment
+ return (_segment & 0x3FFF);
+ }
+}
+
+void reg_t::setSegment(SegmentId segment) {
+ if (getSciVersion() <= SCI_VERSION_2_1) {
+ _segment = segment;
+ } else {
+ // Set the lower 14 bits of the segment, and preserve the upper 2 ones for the offset
+ _segment = (_segment & 0xC000) | (segment & 0x3FFF);
+ }
+}
+
+uint32 reg_t::getOffset() const {
+ if (getSciVersion() <= SCI_VERSION_2_1) {
+ return _offset;
+ } else {
+ // Return the lower 16 bits from the offset, and the 17th and 18th bits from the segment
+ return ((_segment & 0xC000) << 2) | _offset;
+ }
+}
+
+void reg_t::setOffset(uint32 offset) {
+ if (getSciVersion() <= SCI_VERSION_2_1) {
+ _offset = offset;
+ } else {
+ // Store the lower 16 bits in the offset, and the 17th and 18th bits in the segment
+ _offset = offset & 0xFFFF;
+ _segment = ((offset & 0x30000) >> 2) | (_segment & 0x3FFF);
+ }
+}
+
reg_t reg_t::lookForWorkaround(const reg_t right, const char *operation) const {
SciTrackOriginReply originReply;
SciWorkaroundSolution solution = trackOriginAndFindWorkaround(0, arithmeticWorkarounds, &originReply);
diff --git a/engines/sci/engine/vm_types.h b/engines/sci/engine/vm_types.h
index 22bd8beaa1..af78bd0b84 100644
--- a/engines/sci/engine/vm_types.h
+++ b/engines/sci/engine/vm_types.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -35,36 +35,25 @@ struct reg_t {
SegmentId _segment;
uint16 _offset;
- inline SegmentId getSegment() const {
- return _segment;
- }
-
- inline void setSegment(SegmentId segment) {
- _segment = segment;
- }
-
- inline uint16 getOffset() const {
- return _offset;
- }
-
- inline void setOffset(uint16 offset) {
- _offset = offset;
- }
+ SegmentId getSegment() const;
+ void setSegment(SegmentId segment);
+ uint32 getOffset() const;
+ void setOffset(uint32 offset);
inline void incOffset(int16 offset) {
setOffset(getOffset() + offset);
}
inline bool isNull() const {
- return (_offset | getSegment()) == 0;
+ return (getOffset() | getSegment()) == 0;
}
inline uint16 toUint16() const {
- return _offset;
+ return (uint16)getOffset();
}
inline int16 toSint16() const {
- return (int16)_offset;
+ return (int16)getOffset();
}
bool isNumber() const {
diff --git a/engines/sci/engine/workarounds.cpp b/engines/sci/engine/workarounds.cpp
index 154ac8f8b4..37e46b7a96 100644
--- a/engines/sci/engine/workarounds.cpp
+++ b/engines/sci/engine/workarounds.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -32,126 +32,139 @@ namespace Sci {
// gameID, room,script,lvl, object-name, method-name, call,index, workaround
const SciWorkaroundEntry arithmeticWorkarounds[] = {
- { GID_CAMELOT, 92, 92, 0, "endingCartoon2", "changeState", 0x20d, 0, { WORKAROUND_FAKE, 0 } }, // op_lai: during the ending, sub gets called with no parameters, uses parameter 1 which is theGrail in this case - bug #3044734
- { GID_ECOQUEST2, 100, 0, 0, "Rain", "points", 0xcc6, 0, { WORKAROUND_FAKE, 0 } }, // op_or: when giving the papers to the customs officer, gets called against a pointer instead of a number - bug #3034464
- { GID_ECOQUEST2, 100, 0, 0, "Rain", "points", 0xce0, 0, { WORKAROUND_FAKE, 0 } }, // Same as above, for the Spanish version - bug #3313962
- { GID_FANMADE, 516, 983, 0, "Wander", "setTarget", -1, 0, { WORKAROUND_FAKE, 0 } }, // op_mul: The Legend of the Lost Jewel Demo (fan made): called with object as second parameter when attacked by insects - bug #3038913
+ { GID_CAMELOT, 92, 92, 0, "endingCartoon2", "changeState", 0x20d, 0, { WORKAROUND_FAKE, 0 } }, // op_lai: during the ending, sub gets called with no parameters, uses parameter 1 which is theGrail in this case - bug #5237
+ { GID_ECOQUEST2, 100, 0, 0, "Rain", "points", 0xcc6, 0, { WORKAROUND_FAKE, 0 } }, // op_or: when giving the papers to the customs officer, gets called against a pointer instead of a number - bug #4939
+ { GID_ECOQUEST2, 100, 0, 0, "Rain", "points", 0xce0, 0, { WORKAROUND_FAKE, 0 } }, // Same as above, for the Spanish version - bug #5750
+ { GID_FANMADE, 516, 983, 0, "Wander", "setTarget", -1, 0, { WORKAROUND_FAKE, 0 } }, // op_mul: The Legend of the Lost Jewel Demo (fan made): called with object as second parameter when attacked by insects - bug #5124
{ GID_GK1, 800,64992, 0, "Fwd", "doit", -1, 0, { WORKAROUND_FAKE, 1 } }, // op_gt: when Mosely finds Gabriel and Grace near the end of the game, compares the Grooper object with 7
{ GID_HOYLE4, 700, -1, 1, "Code", "doit", -1, 0, { WORKAROUND_FAKE, 1 } }, // op_add: while bidding in Bridge, an object ("Bid") is added to an object in another segment ("hand3")
{ GID_ICEMAN, 199, 977, 0, "Grooper", "doit", -1, 0, { WORKAROUND_FAKE, 0 } }, // op_add: While dancing with the girl
{ GID_MOTHERGOOSE256, -1, 999, 0, "Event", "new", -1, 0, { WORKAROUND_FAKE, 0 } }, // op_and: constantly during the game (SCI1 version)
- { GID_MOTHERGOOSE256, -1, 4, 0, "rm004", "doit", -1, 0, { WORKAROUND_FAKE, 0 } }, // op_or: when going north and reaching the castle (rooms 4 and 37) - bug #3038228
+ { GID_MOTHERGOOSE256, -1, 4, 0, "rm004", "doit", -1, 0, { WORKAROUND_FAKE, 0 } }, // op_or: when going north and reaching the castle (rooms 4 and 37) - bug #5101
{ GID_MOTHERGOOSEHIRES,90, 90, 0, "newGameButton", "select", -1, 0, { WORKAROUND_FAKE, 0 } }, // op_ge: MUMG Deluxe, when selecting "New Game" in the main menu. It tries to compare an integer with a list. Needs to return false for the game to continue.
{ GID_PHANTASMAGORIA, 902, 0, 0, "", "export 7", -1, 0, { WORKAROUND_FAKE, 0 } }, // op_shr: when starting a chapter in Phantasmagoria
{ GID_QFG1VGA, 301, 928, 0, "Blink", "init", -1, 0, { WORKAROUND_FAKE, 0 } }, // op_div: when entering the inn, gets called with 1 parameter, but 2nd parameter is used for div which happens to be an object
- { GID_QFG2, 200, 200, 0, "astro", "messages", -1, 0, { WORKAROUND_FAKE, 0 } }, // op_lsi: when getting asked for your name by the astrologer bug #3039879
+ { GID_QFG2, 200, 200, 0, "astro", "messages", -1, 0, { WORKAROUND_FAKE, 0 } }, // op_lsi: when getting asked for your name by the astrologer bug #5152
{ GID_QFG4, 710,64941, 0, "RandCycle", "doit", -1, 0, { WORKAROUND_FAKE, 1 } }, // op_gt: when the tentacle appears in the third room of the caves
SCI_WORKAROUNDENTRY_TERMINATOR
};
// gameID, room,script,lvl, object-name, method-name, call,index, workaround
const SciWorkaroundEntry uninitializedReadWorkarounds[] = {
- { GID_CAMELOT, 40, 40, 0, "Rm40", "handleEvent", -1, 0, { WORKAROUND_FAKE, 0 } }, // when looking at the ground at the pool of Siloam - bug #3614968
- { GID_CASTLEBRAIN, 280, 280, 0, "programmer", "dispatchEvent", -1, 0, { WORKAROUND_FAKE, 0xf } }, // pressing 'q' on the computer screen in the robot room, and closing the help dialog that pops up (bug #3039656). Moves the cursor to the view with the ID returned (in this case, the robot hand)
- { GID_CNICK_KQ, -1, 0, 1, "Character", "say", -1, -1, { WORKAROUND_FAKE, 0 } }, // checkers/backgammon, like in hoyle 3 - temps 504 and 505 - bug #3606025
+ { GID_CAMELOT, 40, 40, 0, "Rm40", "handleEvent", -1, 0, { WORKAROUND_FAKE, 0 } }, // when looking at the ground at the pool of Siloam - bug #6401
+ { GID_CASTLEBRAIN, 280, 280, 0, "programmer", "dispatchEvent", -1, 0, { WORKAROUND_FAKE, 0xf } }, // pressing 'q' on the computer screen in the robot room, and closing the help dialog that pops up (bug #5143). Moves the cursor to the view with the ID returned (in this case, the robot hand)
+ { GID_CNICK_KQ, -1, 0, 1, "Character", "say", -1, -1, { WORKAROUND_FAKE, 0 } }, // checkers/backgammon, like in hoyle 3 - temps 504 and 505 - bug #6255
{ GID_CNICK_KQ, -1, 700, 0, "gcWindow", "open", -1, -1, { WORKAROUND_FAKE, 0 } }, // when entering the control menu, like in hoyle 3
+ { GID_CNICK_KQ, 300, 303, 0, "theDoubleCube", "<noname520>", -1, 5, { WORKAROUND_FAKE, 0 } }, // while playing backgammon with doubling enabled - bug #6426 (same as the theDoubleCube::make workaround for Hoyle 3)
+ { GID_CNICK_KQ, 300, 303, 0, "theDoubleCube", "<noname519>", -1, 9, { WORKAROUND_FAKE, 0 } }, // when accepting a double, while playing backgammon with doubling enabled (same as the theDoubleCube::accept workaround for Hoyle 3)
+ { GID_CNICK_LAURABOW, -1, 0, 1, "Character", "say", -1, -1, { WORKAROUND_FAKE, 0 } }, // Yatch, like in hoyle 3 - temps 504 and 505 - bug #6424
+ { GID_CNICK_LAURABOW, -1, 700, 0, NULL, "open", -1, -1, { WORKAROUND_FAKE, 0 } }, // when entering control menu - bug #6423 (same as the gcWindow workaround for Hoyle 3)
+ { GID_CNICK_LAURABOW,100, 100, 0, NULL, "<noname144>", -1, 1, { WORKAROUND_FAKE, 0 } }, // while playing domino - bug #6429 (same as the dominoHand2 workaround for Hoyle 3)
+ { GID_CNICK_LAURABOW,100, 110, 0, NULL, "doit", -1, -1, { WORKAROUND_FAKE, 0 } }, // when changing the "Dominoes per hand" setting - bug #6430
{ GID_CNICK_LONGBOW, 0, 0, 0, "RH Budget", "init", -1, 1, { WORKAROUND_FAKE, 0 } }, // when starting the game
{ GID_ECOQUEST, -1, -1, 0, NULL, "doVerb", -1, 0, { WORKAROUND_FAKE, 0 } }, // almost clicking anywhere triggers this in almost all rooms
{ GID_FANMADE, 516, 979, 0, "", "export 0", -1, 20, { WORKAROUND_FAKE, 0 } }, // Happens in Grotesteing after the logos
- { GID_FANMADE, 528, 990, 0, "GDialog", "doit", -1, 4, { WORKAROUND_FAKE, 0 } }, // Happens in Cascade Quest when closing the glossary - bug #3038757
- { GID_FANMADE, 488, 1, 0, "RoomScript", "doit", 0x1f17, 1, { WORKAROUND_FAKE, 0 } }, // Happens in Ocean Battle while playing - bug #3059871
+ { GID_FANMADE, 528, 990, 0, "GDialog", "doit", -1, 4, { WORKAROUND_FAKE, 0 } }, // Happens in Cascade Quest when closing the glossary - bug #5116
+ { GID_FANMADE, 488, 1, 0, "RoomScript", "doit", 0x1f17, 1, { WORKAROUND_FAKE, 0 } }, // Happens in Ocean Battle while playing - bug #5335
{ GID_FREDDYPHARKAS, -1, 24, 0, "gcWin", "open", -1, 5, { WORKAROUND_FAKE, 0xf } }, // is used as priority for game menu
{ GID_FREDDYPHARKAS, -1, 31, 0, "quitWin", "open", -1, 5, { WORKAROUND_FAKE, 0xf } }, // is used as priority for game menu
- { GID_FREDDYPHARKAS, 540, 540, 0, "WaverCode", "init", -1, -1, { WORKAROUND_FAKE, 0 } }, // Gun pratice mini-game (bug #3044218)
+ { GID_FREDDYPHARKAS, 540, 540, 0, "WaverCode", "init", -1, -1, { WORKAROUND_FAKE, 0 } }, // Gun pratice mini-game - bug #5232
{ GID_GK1, -1, 64950, -1, "Feature", "handleEvent", -1, 0, { WORKAROUND_FAKE, 0 } }, // sometimes when walk-clicking
{ GID_GK2, -1, 11, 0, "", "export 10", -1, 3, { WORKAROUND_FAKE, 0 } }, // called when the game starts
{ GID_GK2, -1, 11, 0, "", "export 10", -1, 4, { WORKAROUND_FAKE, 0 } }, // called during the game
{ GID_HOYLE1, 4, 104, 0, "GinRummyCardList", "calcRuns", -1, 4, { WORKAROUND_FAKE, 0 } }, // Gin Rummy / right when the game starts
{ GID_HOYLE1, 5, 204, 0, "tableau", "checkRuns", -1, 2, { WORKAROUND_FAKE, 0 } }, // Cribbage / during the game
- { GID_HOYLE1, 3, 16, 0, "", "export 0", 0x37c, 3, { WORKAROUND_FAKE, 0 } }, // Hearts / during the game - bug #3052359
- { GID_HOYLE1, -1, 997, 0, "MenuBar", "doit", -1, 0, { WORKAROUND_FAKE, 0 } }, // When changing game speed settings - bug #3108012
+ { GID_HOYLE1, 3, 16, 0, "", "export 0", 0x37c, 3, { WORKAROUND_FAKE, 0 } }, // Hearts / during the game - bug #5299
+ { GID_HOYLE1, -1, 997, 0, "MenuBar", "doit", -1, 0, { WORKAROUND_FAKE, 0 } }, // When changing game speed settings - bug #5512
{ GID_HOYLE3, -1, 0, 1, "Character", "say", -1, -1, { WORKAROUND_FAKE, 0 } }, // when starting checkers or dominoes, first time a character says something - temps 504 and 505
{ GID_HOYLE3, -1, 700, 0, "gcWindow", "open", -1, -1, { WORKAROUND_FAKE, 0 } }, // when entering control menu
- { GID_HOYLE3, 100, 100, 0, "dominoHand2", "cue", -1, 1, { WORKAROUND_FAKE, 0 } }, // while playing domino - bug #3036918
- { GID_HOYLE4, -1, 0, 0, NULL, "open", -1, -1, { WORKAROUND_FAKE, 0 } }, // when selecting "Control" from the menu (temp vars 0-3) - bug #3039294
- { GID_HOYLE4, 910, 18, 0, NULL, "init", -1, 0, { WORKAROUND_FAKE, 0 } }, // during tutorial - bug #3042756
- { GID_HOYLE4, 910, 910, 0, NULL, "setup", -1, 3, { WORKAROUND_FAKE, 0 } }, // when selecting "Tutorial" from the main menu - bug #3039294
+ { GID_HOYLE3, 100, 100, 0, "dominoHand2", "cue", -1, 1, { WORKAROUND_FAKE, 0 } }, // while playing domino - bug #5042
+ { GID_HOYLE3, 100, 110, 0, "OKButton", "doit", -1, -1, { WORKAROUND_FAKE, 0 } }, // when changing the "Dominoes per hand" setting - bug #6430
+ { GID_HOYLE3, 300, 303, 0, "theDoubleCube", "make", -1, 5, { WORKAROUND_FAKE, 0 } }, // while playing backgammon with doubling enabled
+ { GID_HOYLE3, 300, 303, 0, "theDoubleCube", "accept", -1, 9, { WORKAROUND_FAKE, 0 } }, // when accepting a double, while playing backgammon with doubling enabled
+ { GID_HOYLE4, -1, 0, 0, NULL, "open", -1, -1, { WORKAROUND_FAKE, 0 } }, // when selecting "Control" from the menu (temp vars 0-3) - bug #5132
+ { GID_HOYLE4, 910, 18, 0, NULL, "init", -1, 0, { WORKAROUND_FAKE, 0 } }, // during tutorial - bug #5213
+ { GID_HOYLE4, 910, 910, 0, NULL, "setup", -1, 3, { WORKAROUND_FAKE, 0 } }, // when selecting "Tutorial" from the main menu - bug #5132
{ GID_HOYLE4, 700, 700, 1, "BridgeHand", "calcQTS", -1, 3, { WORKAROUND_FAKE, 0 } }, // when placing a bid in bridge (always)
- { GID_HOYLE4, 700, 710, 1, "BridgeStrategyPlay", "checkSplitTops", -1, 10, { WORKAROUND_FAKE, 0 } }, // while playing bridge, objects LeadReturn_Trump, SecondSeat_Trump, ThirdSeat_Trump and others - bug #3361925
+ { GID_HOYLE4, 700, 710, 1, "BridgeStrategyPlay", "checkSplitTops", -1, 10, { WORKAROUND_FAKE, 0 } }, // while playing bridge, objects LeadReturn_Trump, SecondSeat_Trump, ThirdSeat_Trump and others - bug #5794
{ GID_HOYLE4, 700, -1, 1, "BridgeDefense", "think", -1, -1, { WORKAROUND_FAKE, 0 } }, // sometimes while playing bridge, temp var 3, 17 and others, objects LeadReturn_Trump, ThirdSeat_Trump and others
{ GID_HOYLE4, 700, 730, 1, "BridgeDefense", "beatTheirBest", -1, 3, { WORKAROUND_FAKE, 0 } }, // rarely while playing bridge
- { GID_HOYLE4, 700, -1, 1, "Code", "doit", -1, -1, { WORKAROUND_FAKE, 0 } }, // when placing a bid in bridge (always), temp var 11, 24, 27, 46, 75, objects compete_tree, compwe_tree, other1_tree, b1 - bugs #3292332 and #3361925
+ { GID_HOYLE4, 700, -1, 1, "Code", "doit", -1, -1, { WORKAROUND_FAKE, 0 } }, // when placing a bid in bridge (always), temp var 11, 24, 27, 46, 75, objects compete_tree, compwe_tree, other1_tree, b1 - bugs #5663 and #5794
+ { GID_HOYLE4, 700, 921, 0, "Print", "addEdit", -1, -1, { WORKAROUND_FAKE, 0 } }, // when saving the game (may also occur in other situations) - bug #6601
{ 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_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 #5665
+ { 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 #5662
+ { GID_HOYLE4, -1, 937, 0, "IconBar", "dispatchEvent", -1, 408, { WORKAROUND_FAKE, 0 } }, // pressing ENTER on scoreboard while mouse is not on OK button, may not happen all the time - bug #6603
+ { GID_ISLANDBRAIN, 100, 937, 0, "IconBar", "dispatchEvent", -1, 58, { WORKAROUND_FAKE, 0 } }, // when using ENTER at the startup menu - bug #5241
{ GID_ISLANDBRAIN, 140, 140, 0, "piece", "init", -1, 3, { WORKAROUND_FAKE, 1 } }, // first puzzle right at the start, some initialization variable. bnt is done on it, and it should be non-0
{ GID_ISLANDBRAIN, 200, 268, 0, "anElement", "select", -1, 0, { WORKAROUND_FAKE, 0 } }, // elements puzzle, gets used before super TextIcon
{ GID_JONES, 1, 232, 0, "weekendText", "draw", 0x3d3, 0, { WORKAROUND_FAKE, 0 } }, // jones/cd only - gets called during the game
{ GID_JONES, 1, 255, 0, "", "export 0", -1, -1, { WORKAROUND_FAKE, 0 } }, // jones/cd only - called when a game ends, temps 13 and 14
{ GID_JONES, 764, 255, 0, "", "export 0", -1, -1, { WORKAROUND_FAKE, 0 } }, // jones/ega&vga only - called when the game starts, temps 13 and 14
- //{ GID_KQ5, -1, 0, 0, "", "export 29", -1, 3, { WORKAROUND_FAKE, 0xf } }, // called when playing harp for the harpies or when aborting dialog in toy shop, is used for kDoAudio - bug #3034700
+ //{ GID_KQ5, -1, 0, 0, "", "export 29", -1, 3, { WORKAROUND_FAKE, 0xf } }, // called when playing harp for the harpies or when aborting dialog in toy shop, is used for kDoAudio - bug #4961
// ^^ shouldn't be needed anymore, we got a script patch instead (kq5PatchCdHarpyVolume)
{ GID_KQ5, 25, 25, 0, "rm025", "doit", -1, 0, { WORKAROUND_FAKE, 0 } }, // inside witch forest, when going to the room where the walking rock is
- { GID_KQ5, 55, 55, 0, "helpScript", "doit", -1, 0, { WORKAROUND_FAKE, 0 } }, // when giving the tambourine to the monster in the labyrinth (only happens at one of the locations) - bug #3041262
+ { GID_KQ5, 55, 55, 0, "helpScript", "doit", -1, 0, { WORKAROUND_FAKE, 0 } }, // when giving the tambourine to the monster in the labyrinth (only happens at one of the locations) - bug #5198
{ GID_KQ5, -1, 755, 0, "gcWin", "open", -1, -1, { WORKAROUND_FAKE, 0 } }, // when entering control menu in the FM-Towns version
- { GID_KQ6, -1, 30, 0, "rats", "changeState", -1, -1, { WORKAROUND_FAKE, 0 } }, // rats in the catacombs (temps 1 - 5) - bugs #3034597, #3035495, #3035824
- { GID_KQ6, 210, 210, 0, "rm210", "scriptCheck", -1, 0, { WORKAROUND_FAKE, 1 } }, // using inventory in that room - bug #3034565
+ { GID_KQ6, -1, 30, 0, "rats", "changeState", -1, -1, { WORKAROUND_FAKE, 0 } }, // rats in the catacombs (temps 1 - 5) - bugs #4958, #4998, #5017
+ { GID_KQ6, 210, 210, 0, "rm210", "scriptCheck", -1, 0, { WORKAROUND_FAKE, 1 } }, // using inventory in that room - bug #4953
{ GID_KQ6, 500, 500, 0, "rm500", "init", -1, 0, { WORKAROUND_FAKE, 0 } }, // going to island of the beast
{ GID_KQ6, 520, 520, 0, "rm520", "init", -1, 0, { WORKAROUND_FAKE, 0 } }, // going to boiling water trap on beast isle
{ GID_KQ6, -1, 903, 0, "controlWin", "open", -1, 4, { WORKAROUND_FAKE, 0 } }, // when opening the controls window (save, load etc)
- { GID_KQ6, -1, 907, 0, "tomato", "doVerb", -1, 2, { WORKAROUND_FAKE, 0 } }, // when looking at the rotten tomato in the inventory - bug #3059544
+ { GID_KQ6, -1, 907, 0, "tomato", "doVerb", -1, 2, { WORKAROUND_FAKE, 0 } }, // when looking at the rotten tomato in the inventory - bug #5331
+ { GID_KQ6, -1, 928, 0, NULL, "startText", -1, 0, { WORKAROUND_FAKE, 0 } }, // gets caused by Text+Audio support (see script patcher)
{ GID_KQ7, -1, 64996, 0, "User", "handleEvent", -1, 1, { WORKAROUND_FAKE, 0 } }, // called when pushing a keyboard key
- { GID_LAURABOW, 37, 0, 0, "CB1", "doit", -1, 1, { WORKAROUND_FAKE, 0 } }, // when going up the stairs (bug #3037694)
- { GID_LAURABOW, -1, 967, 0, "myIcon", "cycle", -1, 1, { WORKAROUND_FAKE, 0 } }, // having any portrait conversation coming up (initial bug #3034985)
+ { GID_LAURABOW, 37, 0, 0, "CB1", "doit", -1, 1, { WORKAROUND_FAKE, 0 } }, // when going up the stairs - bug #5084
+ { GID_LAURABOW, -1, 967, 0, "myIcon", "cycle", -1, 1, { WORKAROUND_FAKE, 0 } }, // having any portrait conversation coming up - initial bug #4971
{ GID_LAURABOW2, -1, 24, 0, "gcWin", "open", -1, 5, { WORKAROUND_FAKE, 0xf } }, // is used as priority for game menu
- { GID_LAURABOW2, -1, 21, 0, "dropCluesCode", "doit", -1, 1, { WORKAROUND_FAKE, 0x7fff } }, // when asking some questions (e.g. the reporter about the burglary, or the policeman about Ziggy). Must be big, as the game scripts perform lt on it and start deleting journal entries - bugs #3035068, #3036274
- { GID_LAURABOW2, -1, 90, 1, "MuseumActor", "init", -1, 6, { WORKAROUND_FAKE, 0 } }, // Random actors in museum (bug #3041257)
- { GID_LAURABOW2, 240, 240, 0, "sSteveAnimates", "changeState", -1, 0, { WORKAROUND_FAKE, 0 } }, // Steve Dorian's idle animation at the docks - bug #3036291
- { GID_LONGBOW, -1, 0, 0, "Longbow", "restart", -1, 0, { WORKAROUND_FAKE, 0 } }, // When canceling a restart game - bug #3046200
+ { GID_LAURABOW2, -1, 21, 0, "dropCluesCode", "doit", -1, 1, { WORKAROUND_FAKE, 0x7fff } }, // when asking some questions (e.g. the reporter about the burglary, or the policeman about Ziggy). Must be big, as the game scripts perform lt on it and start deleting journal entries - bugs #4979, #5026
+ { GID_LAURABOW2, -1, 90, 1, "MuseumActor", "init", -1, 6, { WORKAROUND_FAKE, 0 } }, // Random actors in museum - bug #5197
+ { GID_LAURABOW2, 240, 240, 0, "sSteveAnimates", "changeState", -1, 0, { WORKAROUND_FAKE, 0 } }, // Steve Dorian's idle animation at the docks - bug #5028
+ { GID_LAURABOW2, -1, 928, 0, NULL, "startText", -1, 0, { WORKAROUND_FAKE, 0 } }, // gets caused by Text+Audio support (see script patcher)
+ { GID_LONGBOW, -1, 0, 0, "Longbow", "restart", -1, 0, { WORKAROUND_FAKE, 0 } }, // When canceling a restart game - bug #5244
{ GID_LONGBOW, -1, 213, 0, "clear", "handleEvent", -1, 0, { WORKAROUND_FAKE, 0 } }, // When giving an answer using the druid hand sign code in any room
- { GID_LONGBOW, -1, 213, 0, "letter", "handleEvent", 0xa8, 1, { WORKAROUND_FAKE, 0 } }, // When using the druid hand sign code in any room - bug #3036601
+ { GID_LONGBOW, -1, 213, 0, "letter", "handleEvent", 0xa8, 1, { WORKAROUND_FAKE, 0 } }, // When using the druid hand sign code in any room - bug #5035
{ GID_LSL1, 250, 250, 0, "increase", "handleEvent", -1, 2, { WORKAROUND_FAKE, 0 } }, // casino, playing game, increasing bet
{ GID_LSL1, 720, 720, 0, "rm720", "init", -1, 0, { WORKAROUND_FAKE, 0 } }, // age check room
- { GID_LSL2, 38, 38, 0, "cloudScript", "changeState", -1, 1, { WORKAROUND_FAKE, 0 } }, // entering the room in the middle deck of the ship - bug #3036483
+ { GID_LSL2, 38, 38, 0, "cloudScript", "changeState", -1, 1, { WORKAROUND_FAKE, 0 } }, // entering the room in the middle deck of the ship - bug #5034
{ GID_LSL3, 340, 340, 0, "ComicScript", "changeState", -1, -1, { WORKAROUND_FAKE, 0 } }, // right after entering the 3 ethnic groups inside comedy club (temps 200, 201, 202, 203)
{ GID_LSL3, -1, 997, 0, "TheMenuBar", "handleEvent", -1, 1, { WORKAROUND_FAKE, 0xf } }, // when setting volume the first time, this temp is used to set volume on entry (normally it would have been initialized to 's')
- { GID_LSL6, 820, 82, 0, "", "export 0", -1, -1, { WORKAROUND_FAKE, 0 } }, // when touching the electric fence - bug #3038326
+ { GID_LSL6, 820, 82, 0, "", "export 0", -1, -1, { WORKAROUND_FAKE, 0 } }, // when touching the electric fence - bug #5103
{ GID_LSL6, -1, 85, 0, "washcloth", "doVerb", -1, 0, { WORKAROUND_FAKE, 0 } }, // washcloth in inventory
{ GID_LSL6, -1, 928, -1, "Narrator", "startText", -1, 0, { WORKAROUND_FAKE, 0 } }, // used by various objects that are even translated in foreign versions, that's why we use the base-class
{ GID_LSL6HIRES, 0, 85, 0, "LL6Inv", "init", -1, 0, { WORKAROUND_FAKE, 0 } }, // on startup
{ GID_LSL6HIRES, -1, 64950, 1, "Feature", "handleEvent", -1, 0, { WORKAROUND_FAKE, 0 } }, // at least when entering swimming pool area
{ GID_LSL6HIRES, -1, 64964, 0, "DPath", "init", -1, 1, { WORKAROUND_FAKE, 0 } }, // during the game
- { GID_MOTHERGOOSE256, -1, 0, 0, "MG", "doit", -1, 5, { WORKAROUND_FAKE, 0 } }, // SCI1.1: When moving the cursor all the way to the left during the game (bug #3043955)
- { GID_MOTHERGOOSE256, -1, 992, 0, "AIPath", "init", -1, 0, { WORKAROUND_FAKE, 0 } }, // Happens in the demo and full version. In the demo, it happens when walking two screens from mother goose's house to the north. In the full version, it happens in rooms 7 and 23 - bug #3049146
- { GID_MOTHERGOOSE256, 90, 90, 0, "introScript", "changeState", -1, 65, { WORKAROUND_FAKE, 0 } }, // SCI1(CD): At the very end, after the game is completed and restarted - bug #3268076
- { GID_MOTHERGOOSE256, 94, 94, 0, "sunrise", "changeState", -1, 367, { WORKAROUND_FAKE, 0 } }, // At the very end, after the game is completed - bug #3051163
+ { GID_MOTHERGOOSE256, -1, 0, 0, "MG", "doit", -1, 5, { WORKAROUND_FAKE, 0 } }, // SCI1.1: When moving the cursor all the way to the left during the game - bug #5224
+ { GID_MOTHERGOOSE256, -1, 992, 0, "AIPath", "init", -1, 0, { WORKAROUND_FAKE, 0 } }, // Happens in the demo and full version. In the demo, it happens when walking two screens from mother goose's house to the north. In the full version, it happens in rooms 7 and 23 - bug #5269
+ { GID_MOTHERGOOSE256, 90, 90, 0, "introScript", "changeState", -1, 65, { WORKAROUND_FAKE, 0 } }, // SCI1(CD): At the very end, after the game is completed and restarted - bug #5626
+ { GID_MOTHERGOOSE256, 94, 94, 0, "sunrise", "changeState", -1, 367, { WORKAROUND_FAKE, 0 } }, // At the very end, after the game is completed - bug #5294
{ GID_MOTHERGOOSEHIRES,-1,64950, 1, "Feature", "handleEvent", -1, 0, { WORKAROUND_FAKE, 0 } }, // right when clicking on a child at the start and probably also later
{ GID_MOTHERGOOSEHIRES,-1,64950, 1, "View", "handleEvent", -1, 0, { WORKAROUND_FAKE, 0 } }, // see above
- { GID_PEPPER, -1, 894, 0, "Package", "doVerb", -1, 3, { WORKAROUND_FAKE, 0 } }, // using the hand on the book in the inventory - bug #3040012
+ { GID_PEPPER, -1, 894, 0, "Package", "doVerb", -1, 3, { WORKAROUND_FAKE, 0 } }, // using the hand on the book in the inventory - bug #5154
{ 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
- { GID_QFG1VGA, 16, 16, 0, "lassoFailed", "changeState", -1, -1, { WORKAROUND_FAKE, 0 } }, // qfg1vga: casting the "fetch" spell in the screen with the flowers, temps 0 and 1 - bug #3053268
- { GID_QFG1VGA, -1, 210, 0, "Encounter", "init", 0xcee, 0, { WORKAROUND_FAKE, 0 } }, // qfg1vga: going to the brigands hideout - bug #3109299
+ { GID_QFG1VGA, 16, 16, 0, "lassoFailed", "changeState", -1, -1, { WORKAROUND_FAKE, 0 } }, // qfg1vga: casting the "fetch" spell in the screen with the flowers, temps 0 and 1 - bug #5309
+ { GID_QFG1VGA, -1, 210, 0, "Encounter", "init", 0xcee, 0, { WORKAROUND_FAKE, 0 } }, // qfg1vga: going to the brigands hideout - bug #5515
{ GID_QFG1VGA, -1, 210, 0, "Encounter", "init", 0xce7, 0, { WORKAROUND_FAKE, 0 } }, // qfg1vga: going to room 92
{ GID_QFG2, -1, 71, 0, "theInvSheet", "doit", -1, 1, { WORKAROUND_FAKE, 0 } }, // accessing the inventory
- { GID_QFG2, -1, 701, -1, "Alley", "at", -1, 0, { WORKAROUND_FAKE, 0 } }, // when walking inside the alleys in the town - bug #3035835 & #3038367
+ { GID_QFG2, -1, 701, -1, "Alley", "at", -1, 0, { WORKAROUND_FAKE, 0 } }, // when walking inside the alleys in the town - bug #5019 & #5106
{ GID_QFG2, -1, 990, 0, "Restore", "doit", -1, 364, { WORKAROUND_FAKE, 0 } }, // when pressing enter in restore dialog w/o any saved games present
- { GID_QFG2, 260, 260, 0, "abdulS", "changeState",0x2d22, -1, { WORKAROUND_FAKE, 0 } }, // During the thief's first mission (in the house), just before Abdul is about to enter the house (where you have to hide in the wardrobe), bug #3039891, temps 1 and 2
- { GID_QFG2, 260, 260, 0, "jabbarS", "changeState",0x2d22, -1, { WORKAROUND_FAKE, 0 } }, // During the thief's first mission (in the house), just before Jabbar is about to enter the house (where you have to hide in the wardrobe), bug #3040469, temps 1 and 2
- { GID_QFG2, 500, 500, 0, "lightNextCandleS", "changeState", -1, -1, { WORKAROUND_FAKE, 0 } }, // Inside the last room, while Ad Avis performs the ritual to summon the genie - bug #3148418
- { GID_QFG2, -1, 700, 0, NULL, "showSign", -1, 10, { WORKAROUND_FAKE, 0 } }, // Occurs sometimes when reading a sign in Raseir, Shapeir et al - bugs #3272735, #3275413
- { GID_QFG3, 510, 510, 0, "awardPrize", "changeState", -1, 0, { WORKAROUND_FAKE, 1 } }, // Simbani warrior challenge, after throwing the spears and retrieving the ring - bug #3049435. Must be non-zero, otherwise the prize is awarded twice - bug #3575570.
- { GID_QFG3, 140, 140, 0, "rm140", "init", 0x1008, 0, { WORKAROUND_FAKE, 0 } }, // when importing a character and selecting the previous profession - bug #3040460
- { GID_QFG3, 330, 330, -1, "Teller", "doChild", -1, -1, { WORKAROUND_FAKE, 0 } }, // when talking to King Rajah about "Rajah" (bug #3036390, temp 1) or "Tarna" (temp 0), or when clicking on yourself and saying "Greet" (bug #3039774, temp 1)
- { GID_QFG3, 700, 700, -1, "monsterIsDead", "changeState", -1, 0, { WORKAROUND_FAKE, 0 } }, // in the jungle, after winning any fight, bug #3040624
- { GID_QFG3, 470, 470, -1, "rm470", "notify", -1, 0, { WORKAROUND_FAKE, 0 } }, // closing the character screen in the Simbani village in the room with the bridge, bug #3040565
- { GID_QFG3, 490, 490, -1, "computersMove", "changeState", -1, 0, { WORKAROUND_FAKE, 0 } }, // when finishing awari game, bug #3040579
+ { GID_QFG2, 260, 260, 0, "abdulS", "changeState",0x2d22, -1, { WORKAROUND_FAKE, 0 } }, // During the thief's first mission (in the house), just before Abdul is about to enter the house (where you have to hide in the wardrobe), bug #5153, temps 1 and 2
+ { GID_QFG2, 260, 260, 0, "jabbarS", "changeState",0x2d22, -1, { WORKAROUND_FAKE, 0 } }, // During the thief's first mission (in the house), just before Jabbar is about to enter the house (where you have to hide in the wardrobe), bug #5164, temps 1 and 2
+ { GID_QFG2, 500, 500, 0, "lightNextCandleS", "changeState", -1, -1, { WORKAROUND_FAKE, 0 } }, // Inside the last room, while Ad Avis performs the ritual to summon the genie - bug #5566
+ { GID_QFG2, -1, 700, 0, NULL, "showSign", -1, 10, { WORKAROUND_FAKE, 0 } }, // Occurs sometimes when reading a sign in Raseir, Shapeir et al - bugs #5627, #5635
+ { GID_QFG3, 510, 510, 0, "awardPrize", "changeState", -1, 0, { WORKAROUND_FAKE, 1 } }, // Simbani warrior challenge, after throwing the spears and retrieving the ring - bug #5277. Must be non-zero, otherwise the prize is awarded twice - bug #6160
+ { GID_QFG3, 140, 140, 0, "rm140", "init", 0x1008, 0, { WORKAROUND_FAKE, 0 } }, // when importing a character and selecting the previous profession - bug #5163
+ { GID_QFG3, 330, 330, -1, "Teller", "doChild", -1, -1, { WORKAROUND_FAKE, 0 } }, // when talking to King Rajah about "Rajah" (bug #5033, temp 1) or "Tarna" (temp 0), or when clicking on yourself and saying "Greet" (bug #5148, temp 1)
+ { GID_QFG3, 700, 700, -1, "monsterIsDead", "changeState", -1, 0, { WORKAROUND_FAKE, 0 } }, // in the jungle, after winning any fight, bug #5169
+ { GID_QFG3, 470, 470, -1, "rm470", "notify", -1, 0, { WORKAROUND_FAKE, 0 } }, // closing the character screen in the Simbani village in the room with the bridge, bug #5165
+ { GID_QFG3, 490, 490, -1, "computersMove", "changeState", -1, 0, { WORKAROUND_FAKE, 0 } }, // when finishing awari game, bug #5167
{ GID_QFG3, 490, 490, -1, "computersMove", "changeState", 0xf53, 4, { WORKAROUND_FAKE, 0 } }, // also when finishing awari game
- { GID_QFG3, 851, 32, -1, "ProjObj", "doit", -1, 1, { WORKAROUND_FAKE, 0 } }, // near the end, when throwing the spear of death, bug #3050122
+ { GID_QFG3, 851, 32, -1, "ProjObj", "doit", -1, 1, { WORKAROUND_FAKE, 0 } }, // near the end, when throwing the spear of death, bug #5282
{ GID_QFG4, -1, 15, -1, "charInitScreen", "dispatchEvent", -1, 5, { WORKAROUND_FAKE, 0 } }, // floppy version, when viewing the character screen
{ GID_QFG4, -1, 64917, -1, "controlPlane", "setBitmap", -1, 3, { WORKAROUND_FAKE, 0 } }, // floppy version, when entering the game menu
{ GID_QFG4, -1, 64917, -1, "Plane", "setBitmap", -1, 3, { WORKAROUND_FAKE, 0 } }, // floppy version, happens sometimes in fight scenes
@@ -171,7 +184,10 @@ const SciWorkaroundEntry uninitializedReadWorkarounds[] = {
{ GID_SQ1, -1, 703, 0, "firePulsar", "changeState", 0x18a, 0, { WORKAROUND_FAKE, 0 } }, // export 1, but called locally (when shooting at aliens)
{ GID_SQ4, -1, 398, 0, "showBox", "changeState", -1, 0, { WORKAROUND_FAKE, 0 } }, // CD: called when rummaging in Software Excess bargain bin
{ GID_SQ4, -1, 928, -1, "Narrator", "startText", -1, 1000, { WORKAROUND_FAKE, 1 } }, // CD: happens in the options dialog and in-game when speech and subtitles are used simultaneously
- { GID_SQ5, 201, 201, 0, "buttonPanel", "doVerb", -1, 0, { WORKAROUND_FAKE, 1 } }, // when looking at the orange or red button - bug #3038563
+ { GID_SQ4, -1, 708, -1, "exitBut", "doVerb", -1, 0, { WORKAROUND_FAKE, 0 } }, // Floppy: happens, when looking at the "close" button in the sq4 hintbook - bug #6447
+ { GID_SQ4, -1, 708, -1, "prevBut", "doVerb", -1, 0, { WORKAROUND_FAKE, 0 } }, // Floppy: happens, when looking at the "previous" button in the sq4 hintbook - bug #6447
+ { GID_SQ4, -1, 708, -1, "nextBut", "doVerb", -1, 0, { WORKAROUND_FAKE, 0 } }, // Floppy: happens, when looking at the "next" button in the sq4 hintbook - bug #6447
+ { GID_SQ5, 201, 201, 0, "buttonPanel", "doVerb", -1, 0, { WORKAROUND_FAKE, 1 } }, // when looking at the orange or red button - bug #5112
{ GID_SQ6, -1, 0, 0, "SQ6", "init", -1, 2, { WORKAROUND_FAKE, 0 } }, // Demo and full version: called when the game starts (demo: room 0, full: room 100)
{ GID_SQ6, -1, 64950, -1, "Feature", "handleEvent", -1, 0, { WORKAROUND_FAKE, 0 } }, // called when pressing "Start game" in the main menu, when entering the Orion's Belt bar (room 300), and perhaps other places
{ GID_SQ6, -1, 64964, 0, "DPath", "init", -1, 1, { WORKAROUND_FAKE, 0 } }, // during the game
@@ -185,25 +201,33 @@ const SciWorkaroundEntry kAbs_workarounds[] = {
{ GID_HOYLE1, 2, 2, 0, "room2", "doit", -1, 0, { WORKAROUND_FAKE, 0x3e9 } }, // old maid - called with objects instead of integers
{ GID_HOYLE1, 3, 3, 0, "room3", "doit", -1, 0, { WORKAROUND_FAKE, 0x3e9 } }, // hearts - called with objects instead of integers
{ GID_QFG1VGA, -1, -1, 0, NULL, "doit", -1, 0, { WORKAROUND_FAKE, 0x3e9 } }, // when the game is patched with the NRS patch
- { GID_QFG3 , -1, -1, 0, NULL, "doit", -1, 0, { WORKAROUND_FAKE, 0x3e9 } }, // when the game is patched with the NRS patch (bugs #3528416, #3528542)
+ { GID_QFG3 , -1, -1, 0, NULL, "doit", -1, 0, { WORKAROUND_FAKE, 0x3e9 } }, // when the game is patched with the NRS patch - bugs #6042, #6043
SCI_WORKAROUNDENTRY_TERMINATOR
};
// gameID, room,script,lvl, object-name, method-name, call,index, workaround
const SciWorkaroundEntry kCelHigh_workarounds[] = {
- { GID_KQ5, -1, 255, 0, "deathIcon", "setSize", -1, 0, { WORKAROUND_STILLCALL, 0 } }, // english floppy: when getting beaten up in the inn and probably more, called with 2nd parameter as object - bug #3037003
+ { GID_KQ5, -1, 255, 0, "deathIcon", "setSize", -1, 0, { WORKAROUND_STILLCALL, 0 } }, // english floppy: when getting beaten up in the inn and probably more, called with 2nd parameter as object - bug #5049
{ GID_PQ2, -1, 255, 0, "DIcon", "setSize", -1, 0, { WORKAROUND_STILLCALL, 0 } }, // when showing picture within windows, called with 2nd/3rd parameters as objects
- { GID_SQ1, 1, 255, 0, "DIcon", "setSize", -1, 0, { WORKAROUND_STILLCALL, 0 } }, // DEMO: Called with 2nd/3rd parameters as objects when clicking on the menu - bug #3035720
- { GID_FANMADE, -1, 979, 0, "DIcon", "setSize", -1, 0, { WORKAROUND_STILLCALL, 0 } }, // In The Gem Scenario and perhaps other fanmade games, this is called with 2nd/3rd parameters as objects - bug #3039679
+ { GID_SQ1, 1, 255, 0, "DIcon", "setSize", -1, 0, { WORKAROUND_STILLCALL, 0 } }, // DEMO: Called with 2nd/3rd parameters as objects when clicking on the menu - bug #5012
+ { GID_FANMADE, -1, 979, 0, "DIcon", "setSize", -1, 0, { WORKAROUND_STILLCALL, 0 } }, // In The Gem Scenario and perhaps other fanmade games, this is called with 2nd/3rd parameters as objects - bug #5144
SCI_WORKAROUNDENTRY_TERMINATOR
};
// gameID, room,script,lvl, object-name, method-name, call,index, workaround
const SciWorkaroundEntry kCelWide_workarounds[] = {
- { GID_KQ5, -1, 255, 0, "deathIcon", "setSize", -1, 0, { WORKAROUND_STILLCALL, 0 } }, // english floppy: when getting beaten up in the inn and probably more, called with 2nd parameter as object - bug #3037003
+ { GID_KQ5, -1, 255, 0, "deathIcon", "setSize", -1, 0, { WORKAROUND_STILLCALL, 0 } }, // english floppy: when getting beaten up in the inn and probably more, called with 2nd parameter as object - bug #5049
{ GID_PQ2, -1, 255, 0, "DIcon", "setSize", -1, 0, { WORKAROUND_STILLCALL, 0 } }, // when showing picture within windows, called with 2nd/3rd parameters as objects
- { GID_SQ1, 1, 255, 0, "DIcon", "setSize", -1, 0, { WORKAROUND_STILLCALL, 0 } }, // DEMO: Called with 2nd/3rd parameters as objects when clicking on the menu - bug #3035720
- { GID_FANMADE, -1, 979, 0, "DIcon", "setSize", -1, 0, { WORKAROUND_STILLCALL, 0 } }, // In The Gem Scenario and perhaps other fanmade games, this is called with 2nd/3rd parameters as objects - bug #3039679
+ { GID_SQ1, 1, 255, 0, "DIcon", "setSize", -1, 0, { WORKAROUND_STILLCALL, 0 } }, // DEMO: Called with 2nd/3rd parameters as objects when clicking on the menu - bug #5012
+ { GID_FANMADE, -1, 979, 0, "DIcon", "setSize", -1, 0, { WORKAROUND_STILLCALL, 0 } }, // In The Gem Scenario and perhaps other fanmade games, this is called with 2nd/3rd parameters as objects - bug #5144
+ SCI_WORKAROUNDENTRY_TERMINATOR
+};
+
+// gameID, room,script,lvl, object-name, method-name, call,index, workaround
+const SciWorkaroundEntry kDeleteKey_workarounds[] = {
+ { GID_HOYLE4, 300, 999, 0, "handleEventList", "delete", -1, 0, { WORKAROUND_IGNORE, 0 } }, // restarting hearts, while tray is shown - bug #6604
+ { GID_HOYLE4, 500, 999, 0, "handleEventList", "delete", -1, 0, { WORKAROUND_IGNORE, 0 } }, // restarting cribbage, while tray is shown - bug #6604
+ { GID_HOYLE4, 975, 999, 0, "handleEventList", "delete", -1, 0, { WORKAROUND_IGNORE, 0 } }, // going back to gamelist from hearts/cribbage, while tray is shown - bug #6604
SCI_WORKAROUNDENTRY_TERMINATOR
};
@@ -212,6 +236,7 @@ const SciWorkaroundEntry kDeviceInfo_workarounds[] = {
{ GID_FANMADE, -1, 994, 1, "Game", "save", 0xd1c, 0, { WORKAROUND_STILLCALL, 0 } }, // In fanmade games, this is called with one parameter for CurDevice (Cascade Quest)
{ GID_FANMADE, -1, 994, 1, "Game", "save", 0xe55, 0, { WORKAROUND_STILLCALL, 0 } }, // In fanmade games, this is called with one parameter for CurDevice (Demo Quest)
{ GID_FANMADE, -1, 994, 1, "Game", "save", 0xe57, 0, { WORKAROUND_STILLCALL, 0 } }, // In fanmade games, this is called with one parameter for CurDevice (I Want My C64 Back)
+ { GID_FANMADE, -1, 994, 0, "Black", "save", 0xa, 0, { WORKAROUND_IGNORE, 0 } }, // In fanmade games, this is called with one parameter for CurDevice (Black Cauldron Remake)
{ GID_FANMADE, -1, 994, 1, "Game", "save", 0xe5c, 0, { WORKAROUND_STILLCALL, 0 } }, // In fanmade games, this is called with one parameter for CurDevice (Most of them)
{ GID_FANMADE, -1, 994, 1, "Game", "restore", 0xd1c, 0, { WORKAROUND_STILLCALL, 0 } }, // In fanmade games, this is called with one parameter for CurDevice (Cascade Quest)
{ GID_FANMADE, -1, 994, 1, "Game", "restore", 0xe55, 0, { WORKAROUND_STILLCALL, 0 } }, // In fanmade games, this is called with one parameter for CurDevice (Demo Quest)
@@ -224,9 +249,9 @@ const SciWorkaroundEntry kDeviceInfo_workarounds[] = {
const SciWorkaroundEntry kDisplay_workarounds[] = {
{ GID_ISLANDBRAIN, 300, 300, 0, "geneDude", "show", -1, 0, { WORKAROUND_IGNORE, 0 } }, // when looking at the gene explanation chart - a parameter is an object
{ GID_PQ2, 23, 23, 0, "rm23Script", "elements", 0x4ae, 0, { WORKAROUND_IGNORE, 0 } }, // when looking at the 2nd page of pate's file - 0x75 as id
- { GID_PQ2, 23, 23, 0, "rm23Script", "elements", 0x4c1, 0, { WORKAROUND_IGNORE, 0 } }, // when looking at the 2nd page of pate's file - 0x75 as id (another pq2 version, bug #3043904)
+ { GID_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 #5223)
{ GID_QFG1, 11, 11, 0, "battle", "<noname90>", -1, 0, { WORKAROUND_IGNORE, 0 } }, // DEMO: When entering battle, 0x75 as id
- { GID_SQ4, 397, 0, 0, "", "export 12", -1, 0, { WORKAROUND_IGNORE, 0 } }, // FLOPPY: when going into the computer store (bug #3044044)
+ { GID_SQ4, 397, 0, 0, "", "export 12", -1, 0, { WORKAROUND_IGNORE, 0 } }, // FLOPPY: when going into the computer store - bug #5227
{ GID_SQ4, 391, 391, 0, "doCatalog", "mode", 0x84, 0, { WORKAROUND_IGNORE, 0 } }, // CD: clicking on catalog in roboter sale - a parameter is an object
{ GID_SQ4, 391, 391, 0, "choosePlug", "changeState", -1, 0, { WORKAROUND_IGNORE, 0 } }, // CD: ordering connector in roboter sale - a parameter is an object
SCI_WORKAROUNDENTRY_TERMINATOR
@@ -234,13 +259,13 @@ const SciWorkaroundEntry kDisplay_workarounds[] = {
// gameID, room,script,lvl, object-name, method-name, call,index, workaround
const SciWorkaroundEntry kDirLoop_workarounds[] = {
- { GID_KQ4, 4, 992, 0, "Avoid", "doit", -1, 0, { WORKAROUND_IGNORE, 0 } }, // when the ogre catches you in front of his house, second parameter points to the same object as the first parameter, instead of being an integer (the angle) - bug #3042964
+ { GID_KQ4, 4, 992, 0, "Avoid", "doit", -1, 0, { WORKAROUND_IGNORE, 0 } }, // when the ogre catches you in front of his house, second parameter points to the same object as the first parameter, instead of being an integer (the angle) - bug #5217
SCI_WORKAROUNDENTRY_TERMINATOR
};
// gameID, room,script,lvl, object-name, method-name, call,index, workaround
const SciWorkaroundEntry kDisposeScript_workarounds[] = {
- { GID_LAURABOW, 777, 777, 0, "myStab", "changeState", -1, 0, { WORKAROUND_IGNORE, 0 } }, // DEMO: after the will is signed, parameter 0 is an object - bug #3034907
+ { GID_LAURABOW, 777, 777, 0, "myStab", "changeState", -1, 0, { WORKAROUND_IGNORE, 0 } }, // DEMO: after the will is signed, parameter 0 is an object - bug #4967
{ GID_QFG1, -1, 64, 0, "rm64", "dispose", -1, 0, { WORKAROUND_IGNORE, 0 } }, // when leaving graveyard, parameter 0 is an object
{ GID_SQ4, 150, 151, 0, "fightScript", "dispose", -1, 0, { WORKAROUND_IGNORE, 0 } }, // during fight with Vohaul, parameter 0 is an object
{ GID_SQ4, 150, 152, 0, "driveCloseUp", "dispose", -1, 0, { WORKAROUND_IGNORE, 0 } }, // when choosing "beam download", parameter 0 is an object
@@ -249,26 +274,26 @@ const SciWorkaroundEntry kDisposeScript_workarounds[] = {
// gameID, room,script,lvl, object-name, method-name, call,index, workaround
const SciWorkaroundEntry kDoSoundFade_workarounds[] = {
- { GID_KQ5, 213, 989, 0, "globalSound3", "fade", -1, 0, { WORKAROUND_STILLCALL, 0 } }, // english floppy: when bandits leave the secret temple, parameter 4 is an object - bug #3037594
+ { GID_KQ5, 213, 989, 0, "globalSound3", "fade", -1, 0, { WORKAROUND_STILLCALL, 0 } }, // english floppy: when bandits leave the secret temple, parameter 4 is an object - bug #5078
{ GID_KQ6, 105, 989, 0, "globalSound", "fade", -1, 0, { WORKAROUND_STILLCALL, 0 } }, // floppy: during intro, parameter 4 is an object
- { GID_KQ6, 460, 989, 0, "globalSound2", "fade", -1, 0, { WORKAROUND_STILLCALL, 0 } }, // after pulling the black widow's web on the isle of wonder, parameter 4 is an object - bug #3034567
+ { GID_KQ6, 460, 989, 0, "globalSound2", "fade", -1, 0, { WORKAROUND_STILLCALL, 0 } }, // after pulling the black widow's web on the isle of wonder, parameter 4 is an object - bug #4954
{ GID_QFG4, -1, 64989, 0, "longSong", "fade", -1, 0, { WORKAROUND_STILLCALL, 0 } }, // CD version: many places, parameter 4 is an object (longSong)
- { GID_SQ5, 800, 989, 0, "sq5Music1", "fade", -1, 0, { WORKAROUND_STILLCALL, 0 } }, // when cutting the wrong part of Goliath with the laser - bug #3614145
+ { GID_SQ5, 800, 989, 0, "sq5Music1", "fade", -1, 0, { WORKAROUND_STILLCALL, 0 } }, // when cutting the wrong part of Goliath with the laser - bug #6341
SCI_WORKAROUNDENTRY_TERMINATOR
};
// gameID, room,script,lvl, object-name, method-name, call,index, workaround
const SciWorkaroundEntry kGetAngle_workarounds[] = {
{ GID_FANMADE, 516, 992, 0, "Motion", "init", -1, 0, { WORKAROUND_FAKE, 0 } }, // The Legend of the Lost Jewel Demo (fan made): called with third/fourth parameters as objects
- { GID_KQ6, -1, 752, 0, "throwDazzle", "changeState", -1, 0, { WORKAROUND_STILLCALL, 0 } }, // room 740/790 after the Genie is exposed in the Palace (short and long ending), it starts shooting lightning bolts around. An extra 5th parameter is passed - bug #3034610 & #3041734
- { GID_SQ1, -1, 927, 0, "PAvoider", "doit", -1, 0, { WORKAROUND_FAKE, 0 } }, // all rooms in Ulence Flats after getting the Pilot Droid: called with a single parameter when the droid is in Roger's path - bug #3513207
+ { GID_KQ6, -1, 752, 0, "throwDazzle", "changeState", -1, 0, { WORKAROUND_STILLCALL, 0 } }, // room 740/790 after the Genie is exposed in the Palace (short and long ending), it starts shooting lightning bolts around. An extra 5th parameter is passed - bug #4959 & #5203
+ { GID_SQ1, -1, 927, 0, "PAvoider", "doit", -1, 0, { WORKAROUND_FAKE, 0 } }, // all rooms in Ulence Flats after getting the Pilot Droid: called with a single parameter when the droid is in Roger's path - bug #6016
SCI_WORKAROUNDENTRY_TERMINATOR
};
// gameID, room,script,lvl, object-name, method-name, call,index, workaround
const SciWorkaroundEntry kFindKey_workarounds[] = {
- { GID_ECOQUEST2, 100, 999, 0, "myList", "contains", -1, 0, { WORKAROUND_FAKE, 0 } }, // When Noah Greene gives Adam the Ecorder, and just before the game gives a demonstration, a null reference to a list is passed - bug #3035186
- { GID_HOYLE4, 300, 999, 0, "Piles", "contains", -1, 0, { WORKAROUND_FAKE, 0 } }, // When passing the three cards in Hearts, a null reference to a list is passed - bug #3292333
+ { GID_ECOQUEST2, 100, 999, 0, "myList", "contains", -1, 0, { WORKAROUND_FAKE, 0 } }, // When Noah Greene gives Adam the Ecorder, and just before the game gives a demonstration, a null reference to a list is passed - bug #4987
+ { GID_HOYLE4, 300, 999, 0, "Piles", "contains", -1, 0, { WORKAROUND_FAKE, 0 } }, // When passing the three cards in Hearts, a null reference to a list is passed - bug #5664
SCI_WORKAROUNDENTRY_TERMINATOR
};
@@ -276,18 +301,18 @@ const SciWorkaroundEntry kFindKey_workarounds[] = {
const SciWorkaroundEntry kGraphDrawLine_workarounds[] = {
{ GID_ISLANDBRAIN, 300, 300, 0, "dudeViewer", "show", -1, 0, { WORKAROUND_STILLCALL, 0 } }, // when looking at the gene explanation chart, gets called with 1 extra parameter
{ GID_SQ1, 43, 43, 0, "someoneDied", "changeState", -1, 0, { WORKAROUND_STILLCALL, 0 } }, // when ordering beer, gets called with 1 extra parameter
- { GID_SQ1, 71, 71, 0, "destroyXenon", "changeState", -1, 0, { WORKAROUND_STILLCALL, 0 } }, // during the Xenon destruction cutscene (which results in death), gets called with 1 extra parameter - bug #3040894
- { GID_SQ1, 53, 53, 0, "blastEgo", "changeState", -1, 0, { WORKAROUND_STILLCALL, 0 } }, // when Roger is found and zapped by the cleaning robot, gets called with 1 extra parameter - bug #3040905
+ { GID_SQ1, 71, 71, 0, "destroyXenon", "changeState", -1, 0, { WORKAROUND_STILLCALL, 0 } }, // during the Xenon destruction cutscene (which results in death), gets called with 1 extra parameter - bug #5176
+ { GID_SQ1, 53, 53, 0, "blastEgo", "changeState", -1, 0, { WORKAROUND_STILLCALL, 0 } }, // when Roger is found and zapped by the cleaning robot, gets called with 1 extra parameter - bug #5177
SCI_WORKAROUNDENTRY_TERMINATOR
};
// gameID, room,script,lvl, object-name, method-name, call,index, workaround
const SciWorkaroundEntry kGraphSaveBox_workarounds[] = {
{ GID_CASTLEBRAIN, 420, 427, 0, "alienIcon", "select", -1, 0, { WORKAROUND_STILLCALL, 0 } }, // when selecting a card during the alien card game, gets called with 1 extra parameter
- { GID_ISLANDBRAIN, 290, 291, 0, "upElevator", "changeState",0x201f, 0, { WORKAROUND_STILLCALL, 0 } }, // when testing in the elevator puzzle, gets called with 1 argument less - 15 is on stack - bug #3034485
+ { GID_ISLANDBRAIN, 290, 291, 0, "upElevator", "changeState",0x201f, 0, { WORKAROUND_STILLCALL, 0 } }, // when testing in the elevator puzzle, gets called with 1 argument less - 15 is on stack - bug #4943
{ GID_ISLANDBRAIN, 290, 291, 0, "downElevator", "changeState",0x201f, 0, { WORKAROUND_STILLCALL, 0 } }, // see above
{ GID_ISLANDBRAIN, 290, 291, 0, "correctElevator", "changeState",0x201f, 0, { WORKAROUND_STILLCALL, 0 } }, // see above (when testing the correct solution)
- { GID_PQ3, 202, 202, 0, "MapEdit", "movePt", -1, 0, { WORKAROUND_STILLCALL, 0 } }, // when plotting crimes, gets called with 2 extra parameters - bug #3038077
+ { GID_PQ3, 202, 202, 0, "MapEdit", "movePt", -1, 0, { WORKAROUND_STILLCALL, 0 } }, // when plotting crimes, gets called with 2 extra parameters - bug #5099
SCI_WORKAROUNDENTRY_TERMINATOR
};
@@ -317,12 +342,12 @@ const SciWorkaroundEntry kGraphRedrawBox_workarounds[] = {
{ GID_SQ4, 406, 406, 0, "swimAndShoot", "changeState", -1, 0, { WORKAROUND_STILLCALL, 0 } }, // skateOrama when "swimming" in the air - accidental additional parameter specified
{ GID_SQ4, 410, 410, 0, "swimAfterEgo", "changeState", -1, 0, { WORKAROUND_STILLCALL, 0 } }, // skateOrama when "swimming" in the air - accidental additional parameter specified
{ GID_SQ4, 411, 411, 0, "swimAndShoot", "changeState", -1, 0, { WORKAROUND_STILLCALL, 0 } }, // skateOrama when "swimming" in the air - accidental additional parameter specified
- { GID_SQ4, 150, 150, 0, "laserScript", "changeState", 0xb2, 0, { WORKAROUND_STILLCALL, 0 } }, // when visiting the pedestral where Roger Jr. is trapped, before trashing the brain icon in the programming chapter, accidental additional parameter specified - bug #3094235
- { GID_SQ4, 150, 150, 0, "laserScript", "changeState", 0x16, 0, { WORKAROUND_STILLCALL, 0 } }, // same as above, for the German version - bug #3116892
+ { GID_SQ4, 150, 150, 0, "laserScript", "changeState", 0xb2, 0, { WORKAROUND_STILLCALL, 0 } }, // when visiting the pedestral where Roger Jr. is trapped, before trashing the brain icon in the programming chapter, accidental additional parameter specified - bug #5479
+ { GID_SQ4, 150, 150, 0, "laserScript", "changeState", 0x16, 0, { WORKAROUND_STILLCALL, 0 } }, // same as above, for the German version - bug #5527
{ GID_SQ4, -1, 704, 0, "shootEgo", "changeState", -1, 0, { WORKAROUND_STILLCALL, 0 } }, // When shot by Droid in Super Computer Maze (Rooms 500, 505, 510...) - accidental additional parameter specified
- { GID_KQ5, -1, 981, 0, "myWindow", "dispose", -1, 0, { WORKAROUND_STILLCALL, 0 } }, // Happens in the floppy version, when closing any dialog box, accidental additional parameter specified - bug #3036331
+ { GID_KQ5, -1, 981, 0, "myWindow", "dispose", -1, 0, { WORKAROUND_STILLCALL, 0 } }, // Happens in the floppy version, when closing any dialog box, accidental additional parameter specified - bug #5031
{ GID_KQ5, -1, 995, 0, "invW", "doit", -1, 0, { WORKAROUND_STILLCALL, 0 } }, // Happens in the floppy version, when closing the inventory window, accidental additional parameter specified
- { GID_KQ5, -1, 995, 0, "", "export 0", -1, 0, { WORKAROUND_STILLCALL, 0 } }, // Happens in the floppy version, when opening the gem pouch, accidental additional parameter specified - bug #3039395
+ { GID_KQ5, -1, 995, 0, "", "export 0", -1, 0, { WORKAROUND_STILLCALL, 0 } }, // Happens in the floppy version, when opening the gem pouch, accidental additional parameter specified - bug #5138
{ GID_KQ5, -1, 403, 0, "KQ5Window", "dispose", -1, 0, { WORKAROUND_STILLCALL, 0 } }, // Happens in the FM Towns version when closing any dialog box, accidental additional parameter specified
SCI_WORKAROUNDENTRY_TERMINATOR
};
@@ -330,42 +355,49 @@ const SciWorkaroundEntry kGraphRedrawBox_workarounds[] = {
// gameID, room,script,lvl, object-name, method-name, call,index, workaround
const SciWorkaroundEntry kGraphUpdateBox_workarounds[] = {
{ GID_ECOQUEST2, 100, 333, 0, "showEcorder", "changeState", -1, 0, { WORKAROUND_STILLCALL, 0 } }, // necessary workaround for our ecorder script patch, because there isn't enough space to patch the function
- { GID_PQ3, 202, 202, 0, "MapEdit", "addPt", -1, 0, { WORKAROUND_STILLCALL, 0 } }, // when plotting crimes, gets called with 2 extra parameters - bug #3038077
- { GID_PQ3, 202, 202, 0, "MapEdit", "movePt", -1, 0, { WORKAROUND_STILLCALL, 0 } }, // when plotting crimes, gets called with 2 extra parameters - bug #3038077
+ { GID_PQ3, 202, 202, 0, "MapEdit", "addPt", -1, 0, { WORKAROUND_STILLCALL, 0 } }, // when plotting crimes, gets called with 2 extra parameters - bug #5099
+ { GID_PQ3, 202, 202, 0, "MapEdit", "movePt", -1, 0, { WORKAROUND_STILLCALL, 0 } }, // when plotting crimes, gets called with 2 extra parameters - bug #5099
{ GID_PQ3, 202, 202, 0, "MapEdit", "dispose", -1, 0, { WORKAROUND_STILLCALL, 0 } }, // when plotting crimes, gets called with 2 extra parameters
SCI_WORKAROUNDENTRY_TERMINATOR
};
// gameID, room,script,lvl, object-name, method-name, call,index, workaround
const SciWorkaroundEntry kIsObject_workarounds[] = {
- { GID_GK1, 50, 999, 0, "List", "eachElementDo", -1, 0, { WORKAROUND_FAKE, 0 } }, // GK1 demo, when asking Grace for messages it gets called with an invalid parameter (type "error") - bug #3034519
- { GID_ISLANDBRAIN, -1, 999, 0, "List", "eachElementDo", -1, 0, { WORKAROUND_FAKE, 0 } }, // when going to the game options, choosing "Info" and selecting anything from the list, gets called with an invalid parameter (type "error") - bug #3035262
+ { GID_GK1, 50, 999, 0, "List", "eachElementDo", -1, 0, { WORKAROUND_FAKE, 0 } }, // GK1 demo, when asking Grace for messages it gets called with an invalid parameter (type "error") - bug #4950
+ { GID_ISLANDBRAIN, -1, 999, 0, "List", "eachElementDo", -1, 0, { WORKAROUND_FAKE, 0 } }, // when going to the game options, choosing "Info" and selecting anything from the list, gets called with an invalid parameter (type "error") - bug #4989
{ GID_QFG3, -1, 999, 0, "List", "eachElementDo", -1, 0, { WORKAROUND_FAKE, 0 } }, // when asking for something, gets called with type error parameter
SCI_WORKAROUNDENTRY_TERMINATOR
};
// gameID, room,script,lvl, object-name, method-name, call,index, workaround
const SciWorkaroundEntry kMemory_workarounds[] = {
- { GID_LAURABOW2, -1, 999, 0, "", "export 6", -1, 0, { WORKAROUND_FAKE, 0 } }, // during the intro, when exiting the train (room 160), talking to Mr. Augustini, etc. - bug #3034490
- { GID_SQ1, -1, 999, 0, "", "export 6", -1, 0, { WORKAROUND_FAKE, 0 } }, // during walking Roger around Ulence Flats - bug #3513765
+ { GID_LAURABOW2, -1, 999, 0, "", "export 6", -1, 0, { WORKAROUND_FAKE, 0 } }, // during the intro, when exiting the train (room 160), talking to Mr. Augustini, etc. - bug #4944
+ { GID_SQ1, -1, 999, 0, "", "export 6", -1, 0, { WORKAROUND_FAKE, 0 } }, // during walking Roger around Ulence Flats - bug #6017
SCI_WORKAROUNDENTRY_TERMINATOR
};
// gameID, room,script,lvl, object-name, method-name, call,index, workaround
const SciWorkaroundEntry kMoveCursor_workarounds[] = {
- { GID_KQ5, -1, 937, 0, "IconBar", "handleEvent", -1, 0, { WORKAROUND_IGNORE, 0 } }, // when pressing escape to open the menu, gets called with one parameter instead of 2 - bug #3156472
+ { GID_KQ5, -1, 937, 0, "IconBar", "handleEvent", -1, 0, { WORKAROUND_IGNORE, 0 } }, // when pressing escape to open the menu, gets called with one parameter instead of 2 - bug #5575
SCI_WORKAROUNDENTRY_TERMINATOR
};
// gameID, room,script,lvl, object-name, method-name, call,index, workaround
const SciWorkaroundEntry kNewWindow_workarounds[] = {
- { GID_ECOQUEST, -1, 981, 0, "SysWindow", "open", -1, 0, { WORKAROUND_STILLCALL, 0 } }, // EcoQuest 1 demo uses an in-between interpreter from SCI1 to SCI1.1. It's SCI1.1, but uses the SCI1 semantics for this call - bug #3035057
+ { GID_ECOQUEST, -1, 981, 0, "SysWindow", "open", -1, 0, { WORKAROUND_STILLCALL, 0 } }, // EcoQuest 1 demo uses an in-between interpreter from SCI1 to SCI1.1. It's SCI1.1, but uses the SCI1 semantics for this call - bug #4976
+ SCI_WORKAROUNDENTRY_TERMINATOR
+};
+
+// gameID, room,script,lvl, object-name, method-name, call,index, workaround
+const SciWorkaroundEntry kReadNumber_workarounds[] = {
+ { GID_CNICK_LAURABOW,100, 101, 0, "dominoes.opt", "doit", -1, 0, { WORKAROUND_STILLCALL, 0 } }, // When dominoes.opt is present, the game scripts call kReadNumber with an extra integer parameter - bug #6425
+ { GID_HOYLE3, 100, 101, 0, "dominoes.opt", "doit", -1, 0, { WORKAROUND_STILLCALL, 0 } }, // When dominoes.opt is present, the game scripts call kReadNumber with an extra integer parameter - bug #6425
SCI_WORKAROUNDENTRY_TERMINATOR
};
// gameID, room,script,lvl, object-name, method-name, call,index, workaround
const SciWorkaroundEntry kPaletteUnsetFlag_workarounds[] = {
- { GID_QFG4, 100, 100, 0, "doMovie", "changeState", -1, 0, { WORKAROUND_IGNORE, 0 } }, // after the Sierra logo, no flags are passed, thus the call is meaningless - bug #3034506
+ { GID_QFG4, 100, 100, 0, "doMovie", "changeState", -1, 0, { WORKAROUND_IGNORE, 0 } }, // after the Sierra logo, no flags are passed, thus the call is meaningless - bug #4947
SCI_WORKAROUNDENTRY_TERMINATOR
};
@@ -378,28 +410,33 @@ const SciWorkaroundEntry kSetCursor_workarounds[] = {
// gameID, room,script,lvl, object-name, method-name, call,index, workaround
const SciWorkaroundEntry kSetPort_workarounds[] = {
{ GID_LSL6, 740, 740, 0, "rm740", "drawPic", -1, 0, { WORKAROUND_IGNORE, 0 } }, // ending scene, is called with additional 3 (!) parameters
- { GID_QFG3, 830, 830, 0, "portalOpens", "changeState", -1, 0, { WORKAROUND_IGNORE, 0 } }, // when the portal appears during the end, gets called with 4 parameters (bug #3040844)
+ { GID_QFG3, 830, 830, 0, "portalOpens", "changeState", -1, 0, { WORKAROUND_IGNORE, 0 } }, // when the portal appears during the end, gets called with 4 parameters - bug #5174
SCI_WORKAROUNDENTRY_TERMINATOR
};
// gameID, room,script,lvl, object-name, method-name, call,index, workaround
const SciWorkaroundEntry kStrAt_workarounds[] = {
- { GID_CASTLEBRAIN, 220, 220, 0, "robotJokes", "animateOnce", -1, 0, { WORKAROUND_FAKE, 0 } }, // when trying to view the terminal at the end of the maze without having collected any robot jokes - bug #3039036
- { GID_ISLANDBRAIN, 300, 310, 0, "childBreed", "changeState",0x1c7c, 0, { WORKAROUND_FAKE, 0 } }, // when clicking Breed to get the second-generation cyborg hybrid (Standard difficulty), the two parameters are swapped - bug #3037835
+ { GID_CASTLEBRAIN, 220, 220, 0, "robotJokes", "animateOnce", -1, 0, { WORKAROUND_FAKE, 0 } }, // when trying to view the terminal at the end of the maze without having collected any robot jokes - bug #5127
+ { GID_ISLANDBRAIN, 300, 310, 0, "childBreed", "changeState",0x1c7c, 0, { WORKAROUND_FAKE, 0 } }, // when clicking Breed to get the second-generation cyborg hybrid (Standard difficulty), the two parameters are swapped - bug #5088
+ SCI_WORKAROUNDENTRY_TERMINATOR
+};
+
+const SciWorkaroundEntry kStrCpy_workarounds[] = {
+ { GID_MOTHERGOOSE, 23, 23, 0, "talkScript", "changeState", -1, 0, { WORKAROUND_FAKE, 0 } }, // when talking to the girl in scene 23, there's no destination parameter (script bug - wrong instruction order). The original source is used directly afterwards in kDisplay, to show the girl's text - bug #6485
SCI_WORKAROUNDENTRY_TERMINATOR
};
// gameID, room,script,lvl, object-name, method-name, call,index, workaround
const SciWorkaroundEntry kStrLen_workarounds[] = {
- { GID_QFG2, 210, 2, 0, "", "export 21", 0xdeb, 0, { WORKAROUND_FAKE, 0 } }, // When saying something incorrect at the WIT, an integer is passed instead of a reference - bug #3100292
+ { GID_QFG2, 210, 2, 0, "", "export 21", 0xdeb, 0, { WORKAROUND_FAKE, 0 } }, // When saying something incorrect at the WIT, an integer is passed instead of a reference - bug #5489
SCI_WORKAROUNDENTRY_TERMINATOR
};
// gameID, room,script,lvl, object-name, method-name, call,index, workaround
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_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 #5483
+ { GID_LAURABOW2, -1, -1, 0, "sCartoon", "changeState", -1, 0, { WORKAROUND_IGNORE, 0 } }, // DEMO: during the intro, a 3rd parameter is passed by accident - bug #4966
{ 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
@@ -465,7 +502,7 @@ SciWorkaroundSolution trackOriginAndFindWorkaround(int index, const SciWorkaroun
// Special case: in the fanmade Russian translation of SQ4, all
// of the object names have been deleted or renamed to Russian,
- // thus we disable checking of the object name. Fixes bug #3155550.
+ // thus we disable checking of the object name. Fixes bug #5573.
if (g_sci->getLanguage() == Common::RU_RUS && g_sci->getGameId() == GID_SQ4)
objectNameMatches = true;
diff --git a/engines/sci/engine/workarounds.h b/engines/sci/engine/workarounds.h
index 59054ae552..9cad618481 100644
--- a/engines/sci/engine/workarounds.h
+++ b/engines/sci/engine/workarounds.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -76,6 +76,7 @@ extern const SciWorkaroundEntry kDirLoop_workarounds[];
extern const SciWorkaroundEntry kDisposeScript_workarounds[];
extern const SciWorkaroundEntry kDoSoundFade_workarounds[];
extern const SciWorkaroundEntry kFindKey_workarounds[];
+extern const SciWorkaroundEntry kDeleteKey_workarounds[];
extern const SciWorkaroundEntry kGetAngle_workarounds[];
extern const SciWorkaroundEntry kGraphDrawLine_workarounds[];
extern const SciWorkaroundEntry kGraphSaveBox_workarounds[];
@@ -88,10 +89,12 @@ extern const SciWorkaroundEntry kIsObject_workarounds[];
extern const SciWorkaroundEntry kMemory_workarounds[];
extern const SciWorkaroundEntry kMoveCursor_workarounds[];
extern const SciWorkaroundEntry kNewWindow_workarounds[];
+extern const SciWorkaroundEntry kReadNumber_workarounds[];
extern const SciWorkaroundEntry kPaletteUnsetFlag_workarounds[];
extern const SciWorkaroundEntry kSetCursor_workarounds[];
extern const SciWorkaroundEntry kSetPort_workarounds[];
extern const SciWorkaroundEntry kStrAt_workarounds[];
+extern const SciWorkaroundEntry kStrCpy_workarounds[];
extern const SciWorkaroundEntry kStrLen_workarounds[];
extern const SciWorkaroundEntry kUnLoad_workarounds[];
diff --git a/engines/sci/event.cpp b/engines/sci/event.cpp
index 7318fe2f68..511d2014bd 100644
--- a/engines/sci/event.cpp
+++ b/engines/sci/event.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/sci/event.h b/engines/sci/event.h
index 930001160a..82e93a9373 100644
--- a/engines/sci/event.h
+++ b/engines/sci/event.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/sci/graphics/animate.cpp b/engines/sci/graphics/animate.cpp
index 53715613fc..7957ed6a55 100644
--- a/engines/sci/graphics/animate.cpp
+++ b/engines/sci/graphics/animate.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -726,7 +726,7 @@ void GfxAnimate::printAnimateList(Console *con) {
Script *scr = _s->_segMan->getScriptIfLoaded(it->object.getSegment());
int16 scriptNo = scr ? scr->getScriptNumber() : -1;
- con->DebugPrintf("%04x:%04x (%s), script %d, view %d (%d, %d), pal %d, "
+ con->debugPrintf("%04x:%04x (%s), script %d, view %d (%d, %d), pal %d, "
"at %d, %d, scale %d, %d / %d (z: %d, prio: %d, shown: %d, signal: %d)\n",
PRINT_REG(it->object), _s->_segMan->getObjectName(it->object),
scriptNo, it->viewId, it->loopNo, it->celNo, it->paletteNo,
diff --git a/engines/sci/graphics/animate.h b/engines/sci/graphics/animate.h
index 52da7d6ec6..6c1822c903 100644
--- a/engines/sci/graphics/animate.h
+++ b/engines/sci/graphics/animate.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/sci/graphics/cache.cpp b/engines/sci/graphics/cache.cpp
index 55f8624c49..59af8334eb 100644
--- a/engines/sci/graphics/cache.cpp
+++ b/engines/sci/graphics/cache.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/sci/graphics/cache.h b/engines/sci/graphics/cache.h
index 2f462fe042..33fa4fe399 100644
--- a/engines/sci/graphics/cache.h
+++ b/engines/sci/graphics/cache.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/sci/graphics/compare.cpp b/engines/sci/graphics/compare.cpp
index b42063b119..3c2285a470 100644
--- a/engines/sci/graphics/compare.cpp
+++ b/engines/sci/graphics/compare.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -241,21 +241,13 @@ void GfxCompare::kernelBaseSetter(reg_t object) {
}
}
-Common::Rect GfxCompare::getNSRect(reg_t object, bool fixRect) {
+Common::Rect GfxCompare::getNSRect(reg_t object) {
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;
}
diff --git a/engines/sci/graphics/compare.h b/engines/sci/graphics/compare.h
index 0080406a3b..88b44aeeb1 100644
--- a/engines/sci/graphics/compare.h
+++ b/engines/sci/graphics/compare.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -42,7 +42,7 @@ 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);
+ Common::Rect getNSRect(reg_t object);
void setNSRect(reg_t object, Common::Rect nsRect);
private:
diff --git a/engines/sci/graphics/controls16.cpp b/engines/sci/graphics/controls16.cpp
index 0098f7b9ef..f2b2ccdfe6 100644
--- a/engines/sci/graphics/controls16.cpp
+++ b/engines/sci/graphics/controls16.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/sci/graphics/controls16.h b/engines/sci/graphics/controls16.h
index 2cde86d4b1..6a70c71aae 100644
--- a/engines/sci/graphics/controls16.h
+++ b/engines/sci/graphics/controls16.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/sci/graphics/controls32.cpp b/engines/sci/graphics/controls32.cpp
index 5b61e1a86a..90b5cd558c 100644
--- a/engines/sci/graphics/controls32.cpp
+++ b/engines/sci/graphics/controls32.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/sci/graphics/controls32.h b/engines/sci/graphics/controls32.h
index 1b705988c2..5af7c20f16 100644
--- a/engines/sci/graphics/controls32.h
+++ b/engines/sci/graphics/controls32.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/sci/graphics/coordadjuster.cpp b/engines/sci/graphics/coordadjuster.cpp
index 1446888cf4..93dff10382 100644
--- a/engines/sci/graphics/coordadjuster.cpp
+++ b/engines/sci/graphics/coordadjuster.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/sci/graphics/coordadjuster.h b/engines/sci/graphics/coordadjuster.h
index 25279b34b1..cb0227fbe4 100644
--- a/engines/sci/graphics/coordadjuster.h
+++ b/engines/sci/graphics/coordadjuster.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/sci/graphics/cursor.cpp b/engines/sci/graphics/cursor.cpp
index a9c741670f..048ec1e9b9 100644
--- a/engines/sci/graphics/cursor.cpp
+++ b/engines/sci/graphics/cursor.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/sci/graphics/cursor.h b/engines/sci/graphics/cursor.h
index 369bd22a0b..c2d7998eb3 100644
--- a/engines/sci/graphics/cursor.h
+++ b/engines/sci/graphics/cursor.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/sci/graphics/font.cpp b/engines/sci/graphics/font.cpp
index 30184cc091..e4684ff134 100644
--- a/engines/sci/graphics/font.cpp
+++ b/engines/sci/graphics/font.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/sci/graphics/font.h b/engines/sci/graphics/font.h
index 8e5c980e2c..58b2ba4813 100644
--- a/engines/sci/graphics/font.h
+++ b/engines/sci/graphics/font.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/sci/graphics/fontsjis.cpp b/engines/sci/graphics/fontsjis.cpp
index ac58c55423..9c942eadd1 100644
--- a/engines/sci/graphics/fontsjis.cpp
+++ b/engines/sci/graphics/fontsjis.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/sci/graphics/fontsjis.h b/engines/sci/graphics/fontsjis.h
index ae5eaa43f9..57403ad98e 100644
--- a/engines/sci/graphics/fontsjis.h
+++ b/engines/sci/graphics/fontsjis.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/sci/graphics/frameout.cpp b/engines/sci/graphics/frameout.cpp
index 76510fa53b..a322eb8e61 100644
--- a/engines/sci/graphics/frameout.cpp
+++ b/engines/sci/graphics/frameout.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -852,21 +852,21 @@ void GfxFrameout::printPlaneList(Console *con) {
Common::Rect r = p.upscaledPlaneRect;
Common::Rect cr = p.upscaledPlaneClipRect;
- con->DebugPrintf("%04x:%04x (%s): prio %d, lastprio %d, offsetX %d, offsetY %d, pic %d, mirror %d, back %d\n",
+ con->debugPrintf("%04x:%04x (%s): prio %d, lastprio %d, offsetX %d, offsetY %d, pic %d, mirror %d, back %d\n",
PRINT_REG(p.object), curPlaneName.c_str(),
(int16)p.priority, (int16)p.lastPriority,
p.planeOffsetX, p.planeOffsetY, p.pictureId,
p.planePictureMirrored, p.planeBack);
- con->DebugPrintf(" rect: (%d, %d, %d, %d), clip rect: (%d, %d, %d, %d)\n",
+ con->debugPrintf(" rect: (%d, %d, %d, %d), clip rect: (%d, %d, %d, %d)\n",
r.left, r.top, r.right, r.bottom,
cr.left, cr.top, cr.right, cr.bottom);
if (p.pictureId != 0xffff && p.pictureId != 0xfffe) {
- con->DebugPrintf("Pictures:\n");
+ con->debugPrintf("Pictures:\n");
for (PlanePictureList::iterator pictureIt = _planePictures.begin(); pictureIt != _planePictures.end(); pictureIt++) {
if (pictureIt->object == p.object) {
- con->DebugPrintf(" Picture %d: x %d, y %d\n", pictureIt->pictureId, pictureIt->startX, pictureIt->startY);
+ con->debugPrintf(" Picture %d: x %d, y %d\n", pictureIt->pictureId, pictureIt->startX, pictureIt->startY);
}
}
}
@@ -883,7 +883,7 @@ void GfxFrameout::printPlaneItemList(Console *con, reg_t planeObject) {
Common::Rect icr = e->celRect;
GuiResourceId picId = e->picture ? e->picture->getResourceId() : 0;
- con->DebugPrintf("%d: %04x:%04x (%s), view %d, loop %d, cel %d, x %d, y %d, z %d, "
+ con->debugPrintf("%d: %04x:%04x (%s), view %d, loop %d, cel %d, x %d, y %d, z %d, "
"signal %d, scale signal %d, scaleX %d, scaleY %d, rect (%d, %d, %d, %d), "
"pic %d, picX %d, picY %d, visible %d\n",
e->givenOrderNr, PRINT_REG(e->object), curItemName.c_str(),
diff --git a/engines/sci/graphics/frameout.h b/engines/sci/graphics/frameout.h
index 5ef770486f..e0c60f92c1 100644
--- a/engines/sci/graphics/frameout.h
+++ b/engines/sci/graphics/frameout.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/sci/graphics/helpers.h b/engines/sci/graphics/helpers.h
index 773f83a00e..4889f12bd2 100644
--- a/engines/sci/graphics/helpers.h
+++ b/engines/sci/graphics/helpers.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/sci/graphics/maciconbar.cpp b/engines/sci/graphics/maciconbar.cpp
index 4df80b289f..8e2e12b7bd 100644
--- a/engines/sci/graphics/maciconbar.cpp
+++ b/engines/sci/graphics/maciconbar.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -32,7 +32,7 @@
#include "common/memstream.h"
#include "common/system.h"
#include "graphics/surface.h"
-#include "graphics/decoders/pict.h"
+#include "image/pict.h"
namespace Sci {
@@ -201,12 +201,12 @@ void GfxMacIconBar::setInventoryIcon(int16 icon) {
}
Graphics::Surface *GfxMacIconBar::loadPict(ResourceId id) {
- Graphics::PICTDecoder pictDecoder;
Resource *res = g_sci->getResMan()->findResource(id, false);
if (!res || res->size == 0)
return 0;
+ Image::PICTDecoder pictDecoder;
Common::MemoryReadStream stream(res->data, res->size);
if (!pictDecoder.loadStream(stream))
return 0;
diff --git a/engines/sci/graphics/maciconbar.h b/engines/sci/graphics/maciconbar.h
index eca10b804c..86cbc74039 100644
--- a/engines/sci/graphics/maciconbar.h
+++ b/engines/sci/graphics/maciconbar.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/sci/graphics/menu.cpp b/engines/sci/graphics/menu.cpp
index d2416ab4e0..8e8c1d64c2 100644
--- a/engines/sci/graphics/menu.cpp
+++ b/engines/sci/graphics/menu.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/sci/graphics/menu.h b/engines/sci/graphics/menu.h
index aa3550da4e..95fd4f6c20 100644
--- a/engines/sci/graphics/menu.h
+++ b/engines/sci/graphics/menu.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/sci/graphics/paint.cpp b/engines/sci/graphics/paint.cpp
index 7befa99afe..482b81aff1 100644
--- a/engines/sci/graphics/paint.cpp
+++ b/engines/sci/graphics/paint.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/sci/graphics/paint.h b/engines/sci/graphics/paint.h
index 27f7e428b6..b2277131d5 100644
--- a/engines/sci/graphics/paint.h
+++ b/engines/sci/graphics/paint.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/sci/graphics/paint16.cpp b/engines/sci/graphics/paint16.cpp
index 940a1ac3cf..b835eb92ca 100644
--- a/engines/sci/graphics/paint16.cpp
+++ b/engines/sci/graphics/paint16.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/sci/graphics/paint16.h b/engines/sci/graphics/paint16.h
index e06021c3e7..882f311a5b 100644
--- a/engines/sci/graphics/paint16.h
+++ b/engines/sci/graphics/paint16.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/sci/graphics/paint32.cpp b/engines/sci/graphics/paint32.cpp
index a03e77dfa6..7d106b5b02 100644
--- a/engines/sci/graphics/paint32.cpp
+++ b/engines/sci/graphics/paint32.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -43,8 +43,12 @@ GfxPaint32::~GfxPaint32() {
void GfxPaint32::fillRect(Common::Rect rect, byte color) {
int16 y, x;
- for (y = rect.top; y < rect.bottom; y++) {
- for (x = rect.left; x < rect.right; x++) {
+ Common::Rect clipRect = rect;
+
+ clipRect.clip(_screen->getWidth(), _screen->getHeight());
+
+ for (y = clipRect.top; y < clipRect.bottom; y++) {
+ for (x = clipRect.left; x < clipRect.right; x++) {
_screen->putPixel(x, y, GFX_SCREEN_MASK_VISUAL, color, 0, 0);
}
}
diff --git a/engines/sci/graphics/paint32.h b/engines/sci/graphics/paint32.h
index 81e355f77f..e7a3ec256d 100644
--- a/engines/sci/graphics/paint32.h
+++ b/engines/sci/graphics/paint32.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/sci/graphics/palette.cpp b/engines/sci/graphics/palette.cpp
index d8d788b00a..a3624c7959 100644
--- a/engines/sci/graphics/palette.cpp
+++ b/engines/sci/graphics/palette.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/sci/graphics/palette.h b/engines/sci/graphics/palette.h
index e974781d49..347695deb8 100644
--- a/engines/sci/graphics/palette.h
+++ b/engines/sci/graphics/palette.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/sci/graphics/picture.cpp b/engines/sci/graphics/picture.cpp
index 8ad4f535f9..434a490109 100644
--- a/engines/sci/graphics/picture.cpp
+++ b/engines/sci/graphics/picture.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -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, 0);
+ drawCelData(inbuffer, size, cel_headerPos, cel_RlePos, cel_LiteralPos, 0, 0, 0, 0, false);
}
// process vector data
@@ -224,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, pictureY);
+ drawCelData(inbuffer, size, cel_headerPos, cel_RlePos, cel_LiteralPos, drawX, drawY, pictureX, pictureY, false);
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, int16 pictureY) {
+void GfxPicture::drawCelData(byte *inbuffer, int size, int headerPos, int rlePos, int literalPos, int16 drawX, int16 drawY, int16 pictureX, int16 pictureY, bool isEGA) {
byte *celBitmap = NULL;
byte *ptr = NULL;
byte *headerPtr = inbuffer + headerPos;
@@ -239,13 +239,17 @@ void GfxPicture::drawCelData(byte *inbuffer, int size, int headerPos, int rlePos
// displaceX, displaceY fields are ignored, and may contain garbage
// (e.g. pic 261 in Dr. Brain 1 Spanish - bug #3614914)
//int16 displaceX, displaceY;
- byte priority = _addToFlag ? _priority : 0;
+ byte priority = _priority;
byte clearColor;
bool compression = true;
byte curByte;
int16 y, lastY, x, leftX, rightX;
int pixelCount;
uint16 width, height;
+
+ // if the picture is not an overlay and we are also not in EGA mode, use priority 0
+ if (!isEGA && !_addToFlag)
+ priority = 0;
#ifdef ENABLE_SCI32
if (_resourceType != SCI_PICTURE_TYPE_SCI32) {
@@ -279,8 +283,6 @@ void GfxPicture::drawCelData(byte *inbuffer, int size, int headerPos, int rlePos
// That needs to be done cause a mirrored picture may be requested
pixelCount = width * height;
celBitmap = new byte[pixelCount];
- if (!celBitmap)
- error("Unable to allocate temporary memory for picture drawing");
if (g_sci->getPlatform() == Common::kPlatformMacintosh && getSciVersion() >= SCI_VERSION_2) {
// See GfxView::unpackCel() for why this black/white swap is done
@@ -360,37 +362,78 @@ 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;
- while (y < lastY) {
- curByte = *ptr++;
- if ((curByte != clearColor) && (priority >= _screen->getPriority(x, y)))
- _screen->putPixel(x, y, drawMask, curByte, priority, 0);
-
- x++;
-
- if (x >= rightX) {
- ptr += sourcePixelSkipPerRow;
- x = leftX;
- y++;
+
+ if ((!isEGA) || (priority < 16)) {
+ // VGA + EGA, EGA only checks priority, when given priority is below 16
+ if (!_mirroredFlag) {
+ // Draw bitmap to screen
+ x = leftX;
+ while (y < lastY) {
+ curByte = *ptr++;
+ if ((curByte != clearColor) && (priority >= _screen->getPriority(x, y)))
+ _screen->putPixel(x, y, drawMask, curByte, priority, 0);
+
+ x++;
+
+ if (x >= rightX) {
+ ptr += sourcePixelSkipPerRow;
+ x = leftX;
+ y++;
+ }
+ }
+ } else {
+ // Draw bitmap to screen (mirrored)
+ x = rightX - 1;
+ while (y < lastY) {
+ curByte = *ptr++;
+ if ((curByte != clearColor) && (priority >= _screen->getPriority(x, y)))
+ _screen->putPixel(x, y, drawMask, curByte, priority, 0);
+
+ if (x == leftX) {
+ ptr += sourcePixelSkipPerRow;
+ x = rightX;
+ y++;
+ }
+
+ x--;
}
}
} else {
- // Draw bitmap to screen (mirrored)
- x = rightX - 1;
- while (y < lastY) {
- curByte = *ptr++;
- if ((curByte != clearColor) && (priority >= _screen->getPriority(x, y)))
- _screen->putPixel(x, y, drawMask, curByte, priority, 0);
-
- if (x == leftX) {
- ptr += sourcePixelSkipPerRow;
- x = rightX;
- y++;
+ // EGA, when priority is above 15
+ // we don't check priority and also won't set priority at all
+ // fixes picture 48 of kq5 (island overview). Bug #5182
+ if (!_mirroredFlag) {
+ // EGA+priority>15: Draw bitmap to screen
+ x = leftX;
+ while (y < lastY) {
+ curByte = *ptr++;
+ if (curByte != clearColor)
+ _screen->putPixel(x, y, GFX_SCREEN_MASK_VISUAL, curByte, 0, 0);
+
+ x++;
+
+ if (x >= rightX) {
+ ptr += sourcePixelSkipPerRow;
+ x = leftX;
+ y++;
+ }
}
+ } else {
+ // EGA+priority>15: Draw bitmap to screen (mirrored)
+ x = rightX - 1;
+ while (y < lastY) {
+ curByte = *ptr++;
+ if (curByte != clearColor)
+ _screen->putPixel(x, y, GFX_SCREEN_MASK_VISUAL, curByte, 0, 0);
+
+ if (x == leftX) {
+ ptr += sourcePixelSkipPerRow;
+ x = rightX;
+ y++;
+ }
- x--;
+ x--;
+ }
}
}
}
@@ -540,22 +583,6 @@ void GfxPicture::drawVectorData(byte *data, int dataSize) {
if ((_screen->isUnditheringEnabled()) && ((_resourceId >= 53 && _resourceId <= 58) || (_resourceId == 61)))
icemanDrawFix = true;
}
- if (g_sci->getGameId() == GID_KQ5) {
- // WORKAROUND: ignore the seemingly broken priority of picture 48
- // (island overview). Fixes bug #3041044.
- if (_resourceId == 48)
- ignoreBrokenPriority = true;
- }
- if (g_sci->getGameId() == GID_SQ4) {
- // WORKAROUND: ignore the seemingly broken priority of pictures 546
- // and 547 (Vohaul's head and Roger Jr trapped). Fixes bug #3046543.
- if (_resourceId == 546 || _resourceId == 547)
- ignoreBrokenPriority = true;
- // WORKAROUND: ignore the seemingly broken priority of picture 631
- // (SQ1 view from the cockpit). Fixes bug #3046513.
- if (_resourceId == 631)
- ignoreBrokenPriority = true;
- }
}
// Drawing
@@ -740,8 +767,15 @@ void GfxPicture::drawVectorData(byte *data, int dataSize) {
case PIC_OPX_EGA_EMBEDDED_VIEW:
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, 0);
+ // hardcoded in SSCI, 16 for SCI1early excluding Space Quest 4, 0 for anything else
+ // fixes sq4 pictures 546+547 (Vohaul's head and Roger Jr trapped). Bug #5250
+ // fixes sq4 picture 631 (SQ1 view from cockpit). Bug 5249
+ if ((getSciVersion() <= SCI_VERSION_1_EARLY) && (g_sci->getGameId() != GID_SQ4)) {
+ _priority = 16;
+ } else {
+ _priority = 0;
+ }
+ drawCelData(data, _resource->size, curPos, curPos + 8, 0, x, y, 0, 0, true);
curPos += size;
break;
case PIC_OPX_EGA_SET_PRIORITY_TABLE:
@@ -783,8 +817,14 @@ void GfxPicture::drawVectorData(byte *data, int dataSize) {
case PIC_OPX_VGA_EMBEDDED_VIEW: // draw cel
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, 0);
+ if (getSciVersion() <= SCI_VERSION_1_EARLY) {
+ // During SCI1Early sierra always used 0 as priority for cels inside picture resources
+ // fixes Space Quest 4 orange ship lifting off (bug #6446)
+ _priority = 0;
+ } else {
+ _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, 0, false);
curPos += size;
break;
case PIC_OPX_VGA_PRIORITY_TABLE_EQDIST:
@@ -967,6 +1007,12 @@ void GfxPicture::vectorFloodFill(int16 x, int16 y, byte color, byte priority, by
_screen->putPixel(--w, p.y, screenMask, color, priority, control);
while (e < r && (matchedMask = _screen->isFillMatch(e + 1, p.y, matchMask, searchColor, searchPriority, searchControl, isEGA)))
_screen->putPixel(++e, p.y, screenMask, color, priority, control);
+#if 0
+ // debug code for floodfill
+ _screen->copyToScreen();
+ g_system->updateScreen();
+ g_system->delayMillis(100);
+#endif
// checking lines above and below for possible flood targets
a_set = b_set = 0;
while (w <= e) {
diff --git a/engines/sci/graphics/picture.h b/engines/sci/graphics/picture.h
index 4f075a6226..2404f99b41 100644
--- a/engines/sci/graphics/picture.h
+++ b/engines/sci/graphics/picture.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -65,7 +65,7 @@ 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, int16 pictureY);
+ void drawCelData(byte *inbuffer, int size, int headerPos, int rlePos, int literalPos, int16 drawX, int16 drawY, int16 pictureX, int16 pictureY, bool isEGA);
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/portrait.cpp b/engines/sci/graphics/portrait.cpp
index d5227126e2..488450485d 100644
--- a/engines/sci/graphics/portrait.cpp
+++ b/engines/sci/graphics/portrait.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -21,6 +21,7 @@
*/
#include "common/archive.h"
+#include "common/file.h" // for DumpFile
#include "common/system.h"
#include "sci/sci.h"
@@ -39,6 +40,7 @@ Portrait::Portrait(ResourceManager *resMan, EventManager *event, GfxScreen *scre
}
Portrait::~Portrait() {
+ delete[] _lipSyncDataOffsetTable;
delete[] _bitmaps;
delete[] _fileData;
}
@@ -51,7 +53,7 @@ void Portrait::init() {
// 2 bytes main height (should be the same as first bitmap header height)
// 2 bytes animation count
// 2 bytes unknown
- // 2 bytes unknown
+ // 2 bytes lip sync ID count
// 4 bytes paletteSize (base 1)
// -> 17 bytes
// paletteSize bytes paletteData
@@ -81,6 +83,8 @@ void Portrait::init() {
_width = READ_LE_UINT16(_fileData + 3);
_height = READ_LE_UINT16(_fileData + 5);
_bitmapCount = READ_LE_UINT16(_fileData + 7);
+ _lipSyncIDCount = READ_LE_UINT16(_fileData + 11);
+
_bitmaps = new PortraitBitmap[_bitmapCount];
uint16 portraitPaletteSize = READ_LE_UINT16(_fileData + 13);
@@ -128,17 +132,103 @@ void Portrait::init() {
}
data += offsetTableSize;
- // raw lip-sync data follows
+ // raw lip-sync ID table follows
+ uint32 lipSyncIDTableSize;
+
+ lipSyncIDTableSize = READ_LE_UINT32(data);
+ data += 4;
+ assert( lipSyncIDTableSize == (_lipSyncIDCount * 4) );
+ _lipSyncIDTable = data;
+ data += lipSyncIDTableSize;
+
+ // raw lip-sync frame table follows
+ uint32 lipSyncDataTableSize;
+ uint32 lipSyncDataTableLastOffset;
+ byte lipSyncData;
+ uint16 lipSyncDataNr;
+ uint16 lipSyncCurOffset;
+
+ lipSyncDataTableSize = READ_LE_UINT32(data);
+ data += 4;
+ assert( lipSyncDataTableSize == 0x220 ); // always this size, just a safety-check
+
+ _lipSyncData = data;
+ lipSyncDataTableLastOffset = lipSyncDataTableSize - 1;
+ _lipSyncDataOffsetTable = new uint16[ _lipSyncIDCount ];
+
+ lipSyncDataNr = 0;
+ lipSyncCurOffset = 0;
+ while ( (lipSyncCurOffset < lipSyncDataTableSize) && (lipSyncDataNr < _lipSyncIDCount) ) {
+ // We are currently at the start of ID-frame data
+ _lipSyncDataOffsetTable[lipSyncDataNr] = lipSyncCurOffset;
+
+ // Look for end of ID-frame data
+ lipSyncData = *data++; lipSyncCurOffset++;
+ while ( (lipSyncData != 0xFF) && (lipSyncCurOffset < lipSyncDataTableLastOffset) ) {
+ // Either terminator (0xFF) or frame-data (1 byte tick count and 1 byte bitmap ID)
+ data++;
+ lipSyncData = *data++;
+ lipSyncCurOffset += 2;
+ }
+ lipSyncDataNr++;
+ }
+ _lipSyncDataOffsetTableEnd = data;
+ // last 4 bytes seem to be garbage
}
+// use this to print out kPortrait debug data
+//#define DEBUG_PORTRAIT
+// use this to use sync resources instead of rave resources (rave resources are better though)
+//#define DEBUG_PORTRAIT_USE_SYNC_RESOURCES
+
void Portrait::doit(Common::Point position, uint16 resourceId, uint16 noun, uint16 verb, uint16 cond, uint16 seq) {
_position = position;
// Now init audio and sync resource
uint32 audioNumber = ((noun & 0xff) << 24) | ((verb & 0xff) << 16) | ((cond & 0xff) << 8) | (seq & 0xff);
+#ifndef DEBUG_PORTRAIT_USE_SYNC_RESOURCES
+ ResourceId raveResourceId = ResourceId(kResourceTypeRave, resourceId, noun, verb, cond, seq);
+ Resource *raveResource = _resMan->findResource(raveResourceId, true);
+ uint raveOffset = 0;
+#else
ResourceId syncResourceId = ResourceId(kResourceTypeSync36, resourceId, noun, verb, cond, seq);
Resource *syncResource = _resMan->findResource(syncResourceId, true);
uint syncOffset = 0;
+#endif
+
+#ifdef DEBUG_PORTRAIT
+ // prints out the current lip sync ASCII data
+ char debugPrint[4000];
+ if (raveResource->size < 4000) {
+ memcpy(debugPrint, raveResource->data, raveResource->size);
+ debugPrint[raveResource->size] = 0; // set terminating NUL
+ debug("kPortrait (noun %d, verb %d, cond %d, seq %d)", noun, verb, cond, seq);
+ debug("kPortrait: %s", debugPrint);
+ }
+#endif
+
+ // TODO: maybe try to create the missing sync resources for low-res KQ6 out of the rave resources
+
+#ifdef DEBUG_PORTRAIT_USE_SYNC_RESOURCES
+ // Dump the sync resources to disk
+ Common::DumpFile *outFile = new Common::DumpFile();
+ Common::String outName = syncResourceId.toPatchNameBase36() + ".sync36";
+ outFile->open(outName);
+ syncResource->writeToStream(outFile);
+ outFile->finalize();
+ outFile->close();
+
+ ResourceId raveResourceId = ResourceId(kResourceTypeRave, resourceId, noun, verb, cond, seq);
+ Resource *raveResource = _resMan->findResource(raveResourceId, true);
+ outName = raveResourceId.toPatchNameBase36() + ".rave";
+ outFile->open(outName);
+ raveResource->writeToStream(outFile);
+ outFile->finalize();
+ outFile->close();
+ _resMan->unlockResource(raveResource);
+
+ delete outFile;
+#endif
// Set the portrait palette
_palette->set(&_portraitPalette, false, true);
@@ -151,6 +241,90 @@ void Portrait::doit(Common::Point position, uint16 resourceId, uint16 noun, uint
_audio->stopAudio();
_audio->startAudio(resourceId, audioNumber);
+#ifndef DEBUG_PORTRAIT_USE_SYNC_RESOURCES
+ if (!raveResource) {
+ warning("kPortrait: no rave resource %d %X", resourceId, audioNumber);
+ return;
+ }
+
+ // Do animation depending on rave resource till audio is done playing
+ int16 raveTicks;
+ uint16 raveID;
+ byte *raveLipSyncData;
+ byte raveLipSyncTicks;
+ byte raveLipSyncBitmapNr;
+ int timerPosition = 0;
+ int timerPositionWithin = 0;
+ int curPosition;
+ SciEvent curEvent;
+ bool userAbort = false;
+
+ while ((raveOffset < raveResource->size) && (!userAbort)) {
+ // rave string starts with tick count, followed by lipSyncID, tick count and so on
+ raveTicks = raveGetTicks(raveResource, &raveOffset);
+ if (raveTicks < 0)
+ break;
+
+ // get lipSyncID
+ raveID = raveGetID(raveResource, &raveOffset);
+ if (raveID) {
+ raveLipSyncData = raveGetLipSyncData(raveID);
+ } else {
+ raveLipSyncData = NULL;
+ }
+
+ timerPosition += raveTicks;
+
+ // Wait till syncTime passed, then show specific animation bitmap
+ if (timerPosition > 0) {
+ do {
+ g_sci->getEngineState()->wait(1);
+ curEvent = _event->getSciEvent(SCI_EVENT_ANY);
+ if (curEvent.type == SCI_EVENT_MOUSE_PRESS ||
+ (curEvent.type == SCI_EVENT_KEYBOARD && curEvent.data == SCI_KEY_ESC) ||
+ g_sci->getEngineState()->abortScriptProcessing == kAbortQuitGame)
+ userAbort = true;
+ curPosition = _audio->getAudioPosition();
+ } while ((curPosition != -1) && (curPosition < timerPosition) && (!userAbort));
+ }
+
+ if (raveLipSyncData) {
+ // lip sync data is
+ // Tick:Byte, Bitmap-Nr:BYTE
+ // Tick = 0xFF is the terminator for the data
+ timerPositionWithin = timerPosition;
+ raveLipSyncTicks = *raveLipSyncData++;
+ while ( (raveLipSyncData < _lipSyncDataOffsetTableEnd) && (raveLipSyncTicks != 0xFF) ) {
+ timerPositionWithin += raveLipSyncTicks;
+
+ do {
+ g_sci->getEngineState()->wait(1);
+ curEvent = _event->getSciEvent(SCI_EVENT_ANY);
+ if (curEvent.type == SCI_EVENT_MOUSE_PRESS ||
+ (curEvent.type == SCI_EVENT_KEYBOARD && curEvent.data == SCI_KEY_ESC) ||
+ g_sci->getEngineState()->abortScriptProcessing == kAbortQuitGame)
+ userAbort = true;
+ curPosition = _audio->getAudioPosition();
+ } while ((curPosition != -1) && (curPosition < timerPositionWithin) && (!userAbort));
+
+ raveLipSyncBitmapNr = *raveLipSyncData++;
+
+ // bitmap nr within sync data is base 1, we need base 0
+ raveLipSyncBitmapNr--;
+
+ if (raveLipSyncBitmapNr < _bitmapCount) {
+ drawBitmap(0);
+ drawBitmap(raveLipSyncBitmapNr);
+ bitsShow();
+ } else {
+ warning("kPortrait: rave lip sync data tried to draw non-existent bitmap %d", raveLipSyncBitmapNr);
+ }
+
+ raveLipSyncTicks = *raveLipSyncData++;
+ }
+ }
+ }
+#else
if (!syncResource) {
// Getting the book in the book shop calls kPortrait where no sync exists
// TODO: find out what to do then
@@ -197,15 +371,90 @@ void Portrait::doit(Common::Point position, uint16 resourceId, uint16 noun, uint
}
}
}
-
+#endif
+
+ // Reset the portrait bitmap to "closed mouth" state (rave.dll seems to do the same)
+ drawBitmap(0);
+ bitsShow();
if (userAbort) {
- // Reset the portrait bitmap to "closed mouth" state, when skipping dialogs
- drawBitmap(0);
- bitsShow();
_audio->stopAudio();
}
+#ifndef DEBUG_PORTRAIT_USE_SYNC_RESOURCES
+ _resMan->unlockResource(raveResource);
+#else
_resMan->unlockResource(syncResource);
+#endif
+}
+
+// returns ASCII ticks from lip sync string as uint16
+int16 Portrait::raveGetTicks(Resource *resource, uint *offset) {
+ uint curOffset = *offset;
+ byte *curData = resource->data + curOffset;
+ byte curByte;
+ uint16 curValue = 0;
+
+ if (curOffset >= resource->size)
+ return -1;
+
+ while (curOffset < resource->size) {
+ curByte = *curData++; curOffset++;
+ if ( curByte == ' ' )
+ break;
+ if ( (curByte >= '0') && (curByte <= '9') ) {
+ curValue = curValue * 10 + ( curByte - '0' );
+ } else {
+ // no number -> assume there is an ID at current offset
+ return 0;
+ }
+ }
+ *offset = curOffset;
+ return curValue;
+}
+
+// returns ASCII ID from lip sync string as uint16
+uint16 Portrait::raveGetID(Resource *resource, uint *offset) {
+ uint curOffset = *offset;
+ byte *curData = resource->data + curOffset;
+ byte curByte = 0;
+ uint16 curValue = 0;
+
+ while (curOffset < resource->size) {
+ curByte = *curData++; curOffset++;
+ if ( curByte == ' ' )
+ break;
+ if (!curValue) {
+ curValue = curByte << 8;
+ } else {
+ curValue |= curByte;
+ }
+ }
+
+ *offset = curOffset;
+ return curValue;
+}
+
+// Searches for a specific lip sync ID and returns pointer to lip sync data or NULL in case ID was not found
+byte *Portrait::raveGetLipSyncData(uint16 raveID) {
+ uint lipSyncIDNr = 0;
+ byte *lipSyncIDPtr = _lipSyncIDTable;
+ byte lipSyncIDByte1, lipSyncIDByte2;
+ uint16 lipSyncID;
+
+ lipSyncIDPtr++; // skip over first byte
+ while (lipSyncIDNr < _lipSyncIDCount) {
+ lipSyncIDByte1 = *lipSyncIDPtr++;
+ lipSyncIDByte2 = *lipSyncIDPtr++;
+ lipSyncID = ( lipSyncIDByte1 << 8 ) | lipSyncIDByte2;
+
+ if ( lipSyncID == raveID ) {
+ return _lipSyncData + _lipSyncDataOffsetTable[lipSyncIDNr];
+ }
+
+ lipSyncIDNr++;
+ lipSyncIDPtr += 2; // ID is every 4 bytes
+ }
+ return NULL;
}
void Portrait::drawBitmap(uint16 bitmapNr) {
diff --git a/engines/sci/graphics/portrait.h b/engines/sci/graphics/portrait.h
index 75baa9a56b..877b253bcf 100644
--- a/engines/sci/graphics/portrait.h
+++ b/engines/sci/graphics/portrait.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -52,6 +52,10 @@ private:
void drawBitmap(uint16 bitmapNr);
void bitsShow();
+ int16 raveGetTicks(Resource *resource, uint *offset);
+ uint16 raveGetID(Resource *resource, uint *offset);
+ byte *raveGetLipSyncData(uint16 raveID);
+
ResourceManager *_resMan;
EventManager *_event;
GfxPalette *_palette;
@@ -68,6 +72,13 @@ private:
Common::String _resourceName;
byte *_fileData;
+
+ uint32 _lipSyncIDCount;
+ byte *_lipSyncIDTable;
+
+ byte *_lipSyncData;
+ uint16 *_lipSyncDataOffsetTable;
+ byte *_lipSyncDataOffsetTableEnd;
Common::Point _position;
};
diff --git a/engines/sci/graphics/ports.cpp b/engines/sci/graphics/ports.cpp
index 6d9dc03195..56c63a7b12 100644
--- a/engines/sci/graphics/ports.cpp
+++ b/engines/sci/graphics/ports.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -300,11 +300,6 @@ Window *GfxPorts::addWindow(const Common::Rect &dims, const Common::Rect *restor
Window *pwnd = new Window(id);
Common::Rect r;
- if (!pwnd) {
- error("Can't open window");
- return 0;
- }
-
_windowsById[id] = pwnd;
// KQ1sci, KQ4, iceman, QfG2 always add windows to the back of the list.
@@ -753,7 +748,7 @@ void GfxPorts::printWindowList(Console *con) {
for (PortList::const_iterator it = _windowList.begin(); it != _windowList.end(); ++it) {
if ((*it)->isWindow()) {
Window *wnd = ((Window *)*it);
- con->DebugPrintf("%d: '%s' at %d, %d, (%d, %d, %d, %d), drawn: %d, style: %d\n",
+ con->debugPrintf("%d: '%s' at %d, %d, (%d, %d, %d, %d), drawn: %d, style: %d\n",
wnd->id, wnd->title.c_str(), wnd->left, wnd->top,
wnd->rect.left, wnd->rect.top, wnd->rect.right, wnd->rect.bottom,
wnd->bDrawn, wnd->wndStyle);
diff --git a/engines/sci/graphics/ports.h b/engines/sci/graphics/ports.h
index 1818eaddb3..51aca09f54 100644
--- a/engines/sci/graphics/ports.h
+++ b/engines/sci/graphics/ports.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/sci/graphics/screen.cpp b/engines/sci/graphics/screen.cpp
index 0df163dd7b..c5c94d7991 100644
--- a/engines/sci/graphics/screen.cpp
+++ b/engines/sci/graphics/screen.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -50,6 +50,11 @@ GfxScreen::GfxScreen(ResourceManager *resMan) : _resMan(resMan) {
_upscaledHires = GFX_SCREEN_UPSCALED_640x480;
#endif
}
+
+ if (g_sci->getPlatform() == Common::kPlatformMacintosh) {
+ if (getSciVersion() <= SCI_VERSION_01)
+ _upscaledHires = GFX_SCREEN_UPSCALED_480x300;
+ }
#ifdef ENABLE_SCI32
// GK1 Mac uses a 640x480 resolution too
@@ -84,28 +89,48 @@ GfxScreen::GfxScreen(ResourceManager *resMan) : _resMan(resMan) {
_pixels = _pitch * _height;
switch (_upscaledHires) {
+ case GFX_SCREEN_UPSCALED_480x300:
+ // Space Quest 3, Hoyle 1+2 on MAC use this one
+ // TODO: Sierra's upscaling worked differently. We need to figure out the exact algo
+ _displayWidth = 480;
+ _displayHeight = 300;
+ for (int i = 0; i <= _height; i++)
+ _upscaledHeightMapping[i] = (i * 3) >> 1;
+ for (int i = 0; i <= _width; i++)
+ _upscaledWidthMapping[i] = (i * 3) >> 1;
+ break;
case GFX_SCREEN_UPSCALED_640x400:
+ // Police Quest 2 and Quest For Glory on PC9801 (Japanese)
_displayWidth = 640;
_displayHeight = 400;
for (int i = 0; i <= _height; i++)
- _upscaledMapping[i] = i * 2;
+ _upscaledHeightMapping[i] = i * 2;
+ for (int i = 0; i <= _width; i++)
+ _upscaledWidthMapping[i] = i * 2;
break;
case GFX_SCREEN_UPSCALED_640x440:
+ // used by King's Quest 6 on Windows
_displayWidth = 640;
_displayHeight = 440;
for (int i = 0; i <= _height; i++)
- _upscaledMapping[i] = (i * 11) / 5;
+ _upscaledHeightMapping[i] = (i * 11) / 5;
+ for (int i = 0; i <= _width; i++)
+ _upscaledWidthMapping[i] = i * 2;
break;
case GFX_SCREEN_UPSCALED_640x480:
+ // Gabriel Knight 1 (VESA, Mac)
_displayWidth = 640;
_displayHeight = 480;
for (int i = 0; i <= _height; i++)
- _upscaledMapping[i] = (i * 12) / 5;
+ _upscaledHeightMapping[i] = (i * 12) / 5;
+ for (int i = 0; i <= _width; i++)
+ _upscaledWidthMapping[i] = i * 2;
break;
default:
_displayWidth = _pitch;
_displayHeight = _height;
- memset(&_upscaledMapping, 0, sizeof(_upscaledMapping) );
+ memset(&_upscaledHeightMapping, 0, sizeof(_upscaledHeightMapping) );
+ memset(&_upscaledWidthMapping, 0, sizeof(_upscaledWidthMapping) );
break;
}
@@ -185,8 +210,9 @@ void GfxScreen::copyRectToScreen(const Common::Rect &rect) {
if (!_upscaledHires) {
g_system->copyRectToScreen(_activeScreen + rect.top * _displayWidth + rect.left, _displayWidth, rect.left, rect.top, rect.width(), rect.height());
} else {
- int rectHeight = _upscaledMapping[rect.bottom] - _upscaledMapping[rect.top];
- g_system->copyRectToScreen(_activeScreen + _upscaledMapping[rect.top] * _displayWidth + rect.left * 2, _displayWidth, rect.left * 2, _upscaledMapping[rect.top], rect.width() * 2, rectHeight);
+ int rectHeight = _upscaledHeightMapping[rect.bottom] - _upscaledHeightMapping[rect.top];
+ int rectWidth = _upscaledWidthMapping[rect.right] - _upscaledWidthMapping[rect.left];
+ g_system->copyRectToScreen(_activeScreen + _upscaledHeightMapping[rect.top] * _displayWidth + _upscaledWidthMapping[rect.left], _displayWidth, _upscaledWidthMapping[rect.left], _upscaledHeightMapping[rect.top], rectWidth, rectHeight);
}
}
@@ -204,8 +230,10 @@ void GfxScreen::copyRectToScreen(const Common::Rect &rect, int16 x, int16 y) {
if (!_upscaledHires) {
g_system->copyRectToScreen(_activeScreen + rect.top * _displayWidth + rect.left, _displayWidth, x, y, rect.width(), rect.height());
} else {
- int rectHeight = _upscaledMapping[rect.bottom] - _upscaledMapping[rect.top];
- g_system->copyRectToScreen(_activeScreen + _upscaledMapping[rect.top] * _displayWidth + rect.left * 2, _displayWidth, x * 2, _upscaledMapping[y], rect.width() * 2, rectHeight);
+ int rectHeight = _upscaledHeightMapping[rect.bottom] - _upscaledHeightMapping[rect.top];
+ int rectWidth = _upscaledWidthMapping[rect.right] - _upscaledWidthMapping[rect.left];
+
+ g_system->copyRectToScreen(_activeScreen + _upscaledHeightMapping[rect.top] * _displayWidth + _upscaledWidthMapping[rect.left], _displayWidth, _upscaledWidthMapping[x], _upscaledHeightMapping[y], rectWidth, rectHeight);
}
}
@@ -228,14 +256,7 @@ void GfxScreen::putPixel(int x, int y, byte drawMask, byte color, byte priority,
if (!_upscaledHires) {
_displayScreen[offset] = color;
} else {
- int displayOffset = _upscaledMapping[y] * _displayWidth + x * 2;
- int heightOffsetBreak = (_upscaledMapping[y + 1] - _upscaledMapping[y]) * _displayWidth;
- int heightOffset = 0;
- do {
- _displayScreen[displayOffset + heightOffset] = color;
- _displayScreen[displayOffset + heightOffset + 1] = color;
- heightOffset += _displayWidth;
- } while (heightOffset != heightOffsetBreak);
+ putScaledPixelOnDisplay(x, y, color);
}
}
if (drawMask & GFX_SCREEN_MASK_PRIORITY)
@@ -250,22 +271,21 @@ void GfxScreen::putPixel(int x, int y, byte drawMask, byte color, byte priority,
* Sierra SCI didn't do this
*/
void GfxScreen::putFontPixel(int startingY, int x, int y, byte color) {
+ int actualY = startingY + y;
if (_fontIsUpscaled) {
// Do not scale ourselves, but put it on the display directly
- putPixelOnDisplay(x, y + startingY, color);
+ putPixelOnDisplay(x, actualY, color);
} else {
- int offset = (startingY + y) * _pitch + x;
+ int offset = actualY * _pitch + x;
_visualScreen[offset] = color;
- if (!_upscaledHires) {
+ switch (_upscaledHires) {
+ case GFX_SCREEN_UPSCALED_DISABLED:
_displayScreen[offset] = color;
- } else {
- int displayOffset = (_upscaledMapping[startingY] + y * 2) * _displayWidth + x * 2;
- _displayScreen[displayOffset] = color;
- _displayScreen[displayOffset + 1] = color;
- displayOffset += _displayWidth;
- _displayScreen[displayOffset] = color;
- _displayScreen[displayOffset + 1] = color;
+ break;
+ default:
+ putScaledPixelOnDisplay(x, actualY, color);
+ break;
}
}
}
@@ -280,6 +300,21 @@ void GfxScreen::putPixelOnDisplay(int x, int y, byte color) {
_displayScreen[offset] = color;
}
+void GfxScreen::putScaledPixelOnDisplay(int x, int y, byte color) {
+ int displayOffset = _upscaledHeightMapping[y] * _displayWidth + _upscaledWidthMapping[x];
+ int heightOffsetBreak = (_upscaledHeightMapping[y + 1] - _upscaledHeightMapping[y]) * _displayWidth;
+ int heightOffset = 0;
+ int widthOffsetBreak = _upscaledWidthMapping[x + 1] - _upscaledWidthMapping[x];
+ do {
+ int widthOffset = 0;
+ do {
+ _displayScreen[displayOffset + heightOffset + widthOffset] = color;
+ widthOffset++;
+ } while (widthOffset != widthOffsetBreak);
+ heightOffset += _displayWidth;
+ } while (heightOffset != heightOffsetBreak);
+}
+
/**
* Sierra's Bresenham line drawing.
* WARNING: Do not replace this with Graphics::drawLine(), as this causes issues
@@ -409,8 +444,9 @@ int GfxScreen::bitsGetDataSize(Common::Rect rect, byte mask) {
if (!_upscaledHires) {
byteCount += pixels; // _displayScreen
} else {
- int rectHeight = _upscaledMapping[rect.bottom] - _upscaledMapping[rect.top];
- byteCount += rectHeight * rect.width() * 2; // _displayScreen (upscaled hires)
+ int rectHeight = _upscaledHeightMapping[rect.bottom] - _upscaledHeightMapping[rect.top];
+ int rectWidth = _upscaledWidthMapping[rect.right] - _upscaledWidthMapping[rect.left];
+ byteCount += rectHeight * rect.width() * rectWidth; // _displayScreen (upscaled hires)
}
}
if (mask & GFX_SCREEN_MASK_PRIORITY) {
@@ -463,16 +499,17 @@ void GfxScreen::bitsSaveScreen(Common::Rect rect, byte *screen, uint16 screenWid
void GfxScreen::bitsSaveDisplayScreen(Common::Rect rect, byte *&memoryPtr) {
byte *screen = _displayScreen;
- int width = rect.width();
+ int width;
int y;
if (!_upscaledHires) {
+ width = rect.width();
screen += (rect.top * _displayWidth) + rect.left;
} else {
- screen += (_upscaledMapping[rect.top] * _displayWidth) + rect.left * 2;
- width *= 2;
- rect.top = _upscaledMapping[rect.top];
- rect.bottom = _upscaledMapping[rect.bottom];
+ screen += (_upscaledHeightMapping[rect.top] * _displayWidth) + _upscaledWidthMapping[rect.left];
+ width = _upscaledWidthMapping[rect.right] - _upscaledWidthMapping[rect.left];
+ rect.top = _upscaledHeightMapping[rect.top];
+ rect.bottom = _upscaledHeightMapping[rect.bottom];
}
for (y = rect.top; y < rect.bottom; y++) {
@@ -528,16 +565,17 @@ void GfxScreen::bitsRestoreScreen(Common::Rect rect, byte *&memoryPtr, byte *scr
void GfxScreen::bitsRestoreDisplayScreen(Common::Rect rect, byte *&memoryPtr) {
byte *screen = _displayScreen;
- int width = rect.width();
+ int width;
int y;
if (!_upscaledHires) {
screen += (rect.top * _displayWidth) + rect.left;
+ width = rect.width();
} else {
- screen += (_upscaledMapping[rect.top] * _displayWidth) + rect.left * 2;
- width *= 2;
- rect.top = _upscaledMapping[rect.top];
- rect.bottom = _upscaledMapping[rect.bottom];
+ screen += (_upscaledHeightMapping[rect.top] * _displayWidth) + _upscaledWidthMapping[rect.left];
+ width = _upscaledWidthMapping[rect.right] - _upscaledWidthMapping[rect.left];
+ rect.top = _upscaledHeightMapping[rect.top];
+ rect.bottom = _upscaledHeightMapping[rect.bottom];
}
for (y = rect.top; y < rect.bottom; y++) {
@@ -550,7 +588,7 @@ void GfxScreen::setVerticalShakePos(uint16 shakePos) {
if (!_upscaledHires)
g_system->setShakePos(shakePos);
else
- g_system->setShakePos(shakePos * 2);
+ g_system->setShakePos(_upscaledHeightMapping[shakePos]);
}
void GfxScreen::kernelShakeScreen(uint16 shakeCount, uint16 directions) {
@@ -583,20 +621,18 @@ void GfxScreen::dither(bool addToFlag) {
if (color & 0xF0) {
color ^= color << 4;
color = ((x^y) & 1) ? color >> 4 : color & 0x0F;
- *displayPtr = color;
- if (_upscaledHires) {
- *(displayPtr + 1) = color;
- *(displayPtr + _displayWidth) = color;
- *(displayPtr + _displayWidth + 1) = color;
+ switch (_upscaledHires) {
+ case GFX_SCREEN_UPSCALED_DISABLED:
+ *displayPtr = color;
+ break;
+ default:
+ putScaledPixelOnDisplay(x, y, color);
+ break;
}
*visualPtr = color;
}
visualPtr++; displayPtr++;
- if (_upscaledHires)
- displayPtr++;
}
- if (_upscaledHires)
- displayPtr += _displayWidth;
}
} else {
if (!addToFlag)
@@ -616,21 +652,19 @@ void GfxScreen::dither(bool addToFlag) {
} else {
ditheredColor = color << 4;
}
- *displayPtr = ditheredColor;
- if (_upscaledHires) {
- *(displayPtr + 1) = ditheredColor;
- *(displayPtr + _displayWidth) = ditheredColor;
- *(displayPtr + _displayWidth + 1) = ditheredColor;
+ switch (_upscaledHires) {
+ case GFX_SCREEN_UPSCALED_DISABLED:
+ *displayPtr = ditheredColor;
+ break;
+ default:
+ putScaledPixelOnDisplay(x, y, ditheredColor);
+ break;
}
color = ((x^y) & 1) ? color >> 4 : color & 0x0F;
*visualPtr = color;
}
visualPtr++; displayPtr++;
- if (_upscaledHires)
- displayPtr++;
}
- if (_upscaledHires)
- displayPtr += _displayWidth;
}
}
}
@@ -722,8 +756,8 @@ static const UpScaledAdjust s_upscaledAdjustTable[] = {
};
void GfxScreen::adjustToUpscaledCoordinates(int16 &y, int16 &x, Sci32ViewNativeResolution viewNativeRes) {
- x *= 2;
- y = _upscaledMapping[y];
+ x = _upscaledWidthMapping[x];
+ y = _upscaledHeightMapping[y];
for (int i = 0; i < ARRAYSIZE(s_upscaledAdjustTable); i++) {
if (s_upscaledAdjustTable[i].gameHiresMode == _upscaledHires &&
@@ -744,6 +778,10 @@ void GfxScreen::adjustBackUpscaledCoordinates(int16 &y, int16 &x, Sci32ViewNativ
}
switch (_upscaledHires) {
+ case GFX_SCREEN_UPSCALED_480x300:
+ x = (x << 1) / 3;
+ y = (y << 1) / 3;
+ break;
case GFX_SCREEN_UPSCALED_640x400:
x /= 2;
y /= 2;
diff --git a/engines/sci/graphics/screen.h b/engines/sci/graphics/screen.h
index 01fb899edb..e266a4ed16 100644
--- a/engines/sci/graphics/screen.h
+++ b/engines/sci/graphics/screen.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -32,12 +32,14 @@
namespace Sci {
#define SCI_SCREEN_UPSCALEDMAXHEIGHT 200
+#define SCI_SCREEN_UPSCALEDMAXWIDTH 320
enum GfxScreenUpscaledMode {
GFX_SCREEN_UPSCALED_DISABLED = 0,
- GFX_SCREEN_UPSCALED_640x400 = 1,
- GFX_SCREEN_UPSCALED_640x440 = 2,
- GFX_SCREEN_UPSCALED_640x480 = 3
+ GFX_SCREEN_UPSCALED_480x300 = 1,
+ GFX_SCREEN_UPSCALED_640x400 = 2,
+ GFX_SCREEN_UPSCALED_640x440 = 3,
+ GFX_SCREEN_UPSCALED_640x480 = 4
};
enum GfxScreenMasks {
@@ -83,6 +85,7 @@ public:
void putPixel(int x, int y, byte drawMask, byte color, byte prio, byte control);
void putFontPixel(int startingY, int x, int y, byte color);
void putPixelOnDisplay(int x, int y, byte color);
+ void putScaledPixelOnDisplay(int x, int y, byte color);
void drawLine(Common::Point startPoint, Common::Point endPoint, byte color, byte prio, byte control);
void drawLine(int16 left, int16 top, int16 right, int16 bottom, byte color, byte prio, byte control) {
drawLine(Common::Point(left, top), Common::Point(right, bottom), color, prio, control);
@@ -184,10 +187,11 @@ private:
GfxScreenUpscaledMode _upscaledHires;
/**
- * This here holds a translation for vertical coordinates between native
+ * This here holds a translation for vertical+horizontal coordinates between native
* (visual) and actual (display) screen.
*/
- int _upscaledMapping[SCI_SCREEN_UPSCALEDMAXHEIGHT + 1];
+ int _upscaledHeightMapping[SCI_SCREEN_UPSCALEDMAXHEIGHT + 1];
+ int _upscaledWidthMapping[SCI_SCREEN_UPSCALEDMAXWIDTH + 1];
/**
* This defines whether or not the font we're drawing is already scaled
diff --git a/engines/sci/graphics/text16.cpp b/engines/sci/graphics/text16.cpp
index 56e9ea8b69..245d6996cb 100644
--- a/engines/sci/graphics/text16.cpp
+++ b/engines/sci/graphics/text16.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/sci/graphics/text16.h b/engines/sci/graphics/text16.h
index 321c7fc25e..ab0cb13a64 100644
--- a/engines/sci/graphics/text16.h
+++ b/engines/sci/graphics/text16.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/sci/graphics/text32.cpp b/engines/sci/graphics/text32.cpp
index f14ae2ef0b..56ce73e8fa 100644
--- a/engines/sci/graphics/text32.cpp
+++ b/engines/sci/graphics/text32.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/sci/graphics/text32.h b/engines/sci/graphics/text32.h
index ce78003fdf..7ba7df50e4 100644
--- a/engines/sci/graphics/text32.h
+++ b/engines/sci/graphics/text32.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/sci/graphics/transitions.cpp b/engines/sci/graphics/transitions.cpp
index b385c2c1db..5e7dbc6c15 100644
--- a/engines/sci/graphics/transitions.cpp
+++ b/engines/sci/graphics/transitions.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/sci/graphics/transitions.h b/engines/sci/graphics/transitions.h
index 246f681690..ae9ca4b48a 100644
--- a/engines/sci/graphics/transitions.h
+++ b/engines/sci/graphics/transitions.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/sci/graphics/view.cpp b/engines/sci/graphics/view.cpp
index 36aaae9232..f3f352e5b8 100644
--- a/engines/sci/graphics/view.cpp
+++ b/engines/sci/graphics/view.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -55,6 +55,56 @@ static const byte EGAmappingStraight[SCI_VIEW_EGAMAPPING_SIZE] = {
0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15
};
+static const byte ViewInject_LauraBow2_Dual[] = {
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x37,0x37,0x37,0x37,0x37,0x00,0x00,0x37,0x37,0x00,0x00,0x37,0x37,0x00,0x00,0x00,0x37,0x37,0x37,0x00,0x00,0x37,0x37,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x37,0x08,0x08,0x08,0x08,0x37,0x00,0x37,0x08,0x32,0x00,0x37,0x08,0x32,0x00,0x37,0x08,0x08,0x08,0x37,0x00,0x37,0x08,0x32,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x37,0x08,0x33,0x32,0x37,0x08,0x00,0x37,0x08,0x32,0x00,0x37,0x08,0x32,0x37,0x08,0x32,0x32,0x33,0x08,0x32,0x37,0x08,0x32,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x37,0x08,0x32,0x00,0x37,0x08,0x32,0x37,0x08,0x32,0x00,0x37,0x08,0x32,0x37,0x08,0x33,0x37,0x37,0x08,0x32,0x37,0x08,0x32,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x37,0x08,0x32,0x00,0x37,0x08,0x32,0x37,0x08,0x32,0x00,0x37,0x08,0x32,0x37,0x08,0x08,0x08,0x08,0x08,0x32,0x37,0x08,0x32,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x37,0x08,0x32,0x00,0x37,0x08,0x32,0x37,0x08,0x32,0x00,0x37,0x08,0x32,0x37,0x08,0x32,0x32,0x33,0x08,0x32,0x37,0x08,0x32,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x37,0x08,0x33,0x37,0x37,0x08,0x32,0x37,0x08,0x33,0x37,0x37,0x08,0x32,0x37,0x08,0x32,0x00,0x37,0x08,0x32,0x37,0x08,0x33,0x37,0x37,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x37,0x08,0x08,0x08,0x08,0x32,0x00,0x00,0x37,0x08,0x08,0x08,0x32,0x00,0x37,0x08,0x32,0x00,0x37,0x08,0x32,0x37,0x08,0x08,0x08,0x08,0x32,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x32,0x32,0x32,0x32,0x00,0x00,0x00,0x00,0x32,0x32,0x32,0x00,0x00,0x00,0x32,0x32,0x00,0x00,0x32,0x32,0x00,0x32,0x32,0x32,0x32,0x32,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
+};
+
+static const byte ViewInject_KingsQuest6_Dual1[] = {
+ 0x17,0x16,0x16,0x16,0x16,0x16,0x16,0x16,0x16,0x16,0x16,0x16,0x16,0x16,0x16,0x16,0x16,0x16,0x16,0x16,0x16,0x16,0x16,0x16,0x16,0x16,0x16,0x16,0x16,0x16,0x16,0x16,0x16,0x16,0x16,0x16,0x16,0x16,0x16,0x16,0x16,0x16,0x16,0x16,0x16,0x16,0x16,0x16,0x16,0x13,
+ 0x17,0x17,0x16,0x16,0x16,0x16,0x16,0x16,0x16,0x16,0x16,0x16,0x16,0x16,0x16,0x16,0x16,0x16,0x16,0x16,0x16,0x16,0x16,0x16,0x16,0x16,0x16,0x16,0x16,0x16,0x16,0x16,0x16,0x16,0x16,0x16,0x16,0x16,0x16,0x16,0x16,0x16,0x16,0x16,0x16,0x16,0x16,0x16,0x13,0x11,
+ 0x16,0x17,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x11,0x11,
+ 0x16,0x16,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x17,0x16,0x16,0x16,0x16,0x13,0x13,0x17,0x16,0x13,0x13,0x17,0x16,0x13,0x13,0x13,0x17,0x16,0x16,0x13,0x13,0x17,0x16,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x11,0x11,
+ 0x16,0x16,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x16,0x10,0x10,0x10,0x10,0x16,0x13,0x16,0x10,0x11,0x13,0x16,0x10,0x11,0x13,0x16,0x10,0x10,0x10,0x16,0x13,0x16,0x10,0x11,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x11,0x11,
+ 0x16,0x16,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x16,0x10,0x11,0x11,0x16,0x10,0x11,0x16,0x10,0x11,0x13,0x16,0x10,0x11,0x16,0x10,0x11,0x11,0x13,0x10,0x11,0x16,0x10,0x11,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x11,0x11,
+ 0x16,0x16,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x16,0x10,0x11,0x13,0x16,0x10,0x11,0x16,0x10,0x11,0x13,0x16,0x10,0x11,0x16,0x10,0x13,0x16,0x16,0x10,0x11,0x16,0x10,0x11,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x11,0x11,
+ 0x16,0x16,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x16,0x10,0x11,0x13,0x16,0x10,0x11,0x16,0x10,0x11,0x13,0x16,0x10,0x11,0x16,0x10,0x10,0x10,0x10,0x10,0x11,0x16,0x10,0x11,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x11,0x11,
+ 0x16,0x16,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x16,0x10,0x11,0x13,0x16,0x10,0x11,0x16,0x10,0x11,0x13,0x16,0x10,0x11,0x16,0x10,0x11,0x11,0x13,0x10,0x11,0x16,0x10,0x11,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x11,0x11,
+ 0x16,0x16,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x16,0x10,0x13,0x16,0x16,0x10,0x11,0x16,0x10,0x13,0x16,0x16,0x10,0x11,0x16,0x10,0x11,0x13,0x16,0x10,0x11,0x16,0x10,0x13,0x16,0x16,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x11,0x11,
+ 0x16,0x16,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x16,0x10,0x10,0x10,0x10,0x11,0x11,0x13,0x16,0x10,0x10,0x10,0x11,0x13,0x16,0x10,0x11,0x13,0x16,0x10,0x11,0x13,0x10,0x10,0x10,0x10,0x11,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x11,0x11,
+ 0x16,0x16,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x11,0x11,0x11,0x11,0x11,0x13,0x13,0x13,0x11,0x11,0x11,0x13,0x13,0x13,0x11,0x11,0x13,0x13,0x11,0x11,0x13,0x11,0x11,0x11,0x11,0x11,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x11,0x11,
+ 0x16,0x16,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x11,0x11,
+ 0x16,0x13,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,
+ 0x13,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x11
+};
+
+static const byte ViewInject_KingsQuest6_Dual2[] = {
+ 0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,
+ 0x10,0x16,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x11,0x10,
+ 0x10,0x13,0x16,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x11,0x10,0x10,
+ 0x10,0x13,0x13,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x16,0x13,0x13,0x13,0x13,0x11,0x11,0x16,0x13,0x11,0x11,0x16,0x13,0x11,0x11,0x11,0x16,0x13,0x13,0x11,0x11,0x16,0x13,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x10,0x10,
+ 0x10,0x13,0x13,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x13,0x16,0x16,0x16,0x16,0x13,0x11,0x13,0x16,0x10,0x11,0x13,0x16,0x10,0x11,0x13,0x16,0x16,0x16,0x13,0x11,0x13,0x16,0x10,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x10,0x10,
+ 0x10,0x13,0x13,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x13,0x16,0x10,0x10,0x13,0x16,0x10,0x13,0x16,0x10,0x11,0x13,0x16,0x10,0x13,0x16,0x10,0x10,0x11,0x16,0x10,0x13,0x16,0x10,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x10,0x10,
+ 0x10,0x13,0x13,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x13,0x16,0x10,0x11,0x13,0x16,0x10,0x13,0x16,0x10,0x11,0x13,0x16,0x10,0x13,0x16,0x11,0x13,0x13,0x16,0x10,0x13,0x16,0x10,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x10,0x10,
+ 0x10,0x13,0x13,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x13,0x16,0x10,0x11,0x13,0x16,0x10,0x13,0x16,0x10,0x11,0x13,0x16,0x10,0x13,0x16,0x16,0x16,0x16,0x16,0x10,0x13,0x16,0x10,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x10,0x10,
+ 0x10,0x13,0x13,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x13,0x16,0x10,0x11,0x13,0x16,0x10,0x13,0x16,0x10,0x11,0x13,0x16,0x10,0x13,0x16,0x10,0x10,0x11,0x16,0x10,0x13,0x16,0x10,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x10,0x10,
+ 0x10,0x13,0x13,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x13,0x16,0x11,0x13,0x13,0x16,0x10,0x13,0x16,0x11,0x13,0x13,0x16,0x10,0x13,0x16,0x10,0x11,0x13,0x16,0x10,0x13,0x16,0x11,0x13,0x13,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x10,0x10,
+ 0x10,0x13,0x13,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x13,0x16,0x16,0x16,0x16,0x10,0x10,0x11,0x13,0x16,0x16,0x16,0x10,0x11,0x13,0x16,0x10,0x11,0x13,0x16,0x10,0x11,0x16,0x16,0x16,0x16,0x10,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x10,0x10,
+ 0x10,0x13,0x13,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x10,0x10,0x10,0x10,0x10,0x11,0x11,0x11,0x10,0x10,0x10,0x11,0x11,0x11,0x10,0x10,0x11,0x11,0x10,0x10,0x11,0x10,0x10,0x10,0x10,0x10,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x10,0x10,
+ 0x10,0x13,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x10,0x10,
+ 0x10,0x11,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,
+ 0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10
+};
+
void GfxView::initData(GuiResourceId resourceId) {
_resource = _resMan->findResource(ResourceId(kResourceTypeView, resourceId), true);
if (!_resource) {
@@ -316,6 +366,68 @@ void GfxView::initData(GuiResourceId resourceId) {
default:
error("ViewType was not detected, can't continue");
}
+
+ // Inject our own views
+ // Currently only used for Dual mode (speech + text) for games, that do not have a "dual" icon already
+ // Which is Laura Bow 2 + King's Quest 6
+ switch (g_sci->getGameId()) {
+ case GID_LAURABOW2:
+ // View 995, Loop 13, Cel 0 = "TEXT"
+ // View 995, Loop 13, Cel 1 = "SPEECH"
+ // View 995, Loop 13, Cel 2 = "DUAL" (<- our injected view)
+ if ((g_sci->isCD()) && (resourceId == 995)) {
+ // security checks
+ if (_loopCount >= 14) {
+ if ((_loop[13].celCount == 2) && (_loop[13].cel[0].width == 46) && (_loop[13].cel[0].height == 11)) {
+ // copy current cels over
+ CelInfo *newCels = new CelInfo[3];
+ memcpy(newCels, _loop[13].cel, sizeof(CelInfo) * 2);
+ delete[] _loop[13].cel;
+ _loop[13].celCount++;
+ _loop[13].cel = newCels;
+ // Duplicate cel 0 to cel 2
+ memcpy(&_loop[13].cel[2], &_loop[13].cel[0], sizeof(CelInfo));
+ // copy over our data (which is uncompressed bitmap data)
+ _loop[13].cel[2].rawBitmap = new byte[sizeof(ViewInject_LauraBow2_Dual)];
+ memcpy(_loop[13].cel[2].rawBitmap, ViewInject_LauraBow2_Dual, sizeof(ViewInject_LauraBow2_Dual));
+ }
+ }
+ }
+ break;
+ case GID_KQ6:
+ // View 947, Loop 8, Cel 0 = "SPEECH" (not pressed)
+ // View 947, Loop 8, Cel 1 = "SPEECH" (pressed)
+ // View 947, Loop 9, Cel 0 = "TEXT" (not pressed)
+ // View 947, Loop 9, Cel 1 = "TEXT" (pressed)
+ // View 947, Loop 12, Cel 0 = "DUAL" (not pressed) (<- our injected view)
+ // View 947, Loop 12, Cel 1 = "DUAL" (pressed) (<- our injected view)
+ if ((g_sci->isCD()) && (resourceId == 947)) {
+ // security checks
+ if (_loopCount == 12) {
+ if ((_loop[8].celCount == 2) && (_loop[8].cel[0].width == 50) && (_loop[8].cel[0].height == 15)) {
+ // add another loop
+ LoopInfo *newLoops = new LoopInfo[_loopCount + 1];
+ memcpy(newLoops, _loop, sizeof(LoopInfo) * _loopCount);
+ delete[] _loop;
+ _loop = newLoops;
+ _loopCount++;
+ // copy loop 8 to loop 12
+ memcpy(&_loop[12], &_loop[8], sizeof(LoopInfo));
+ _loop[12].cel = new CelInfo[2];
+ // duplicate all cels of loop 8 and into loop 12
+ memcpy(_loop[12].cel, _loop[8].cel, sizeof(CelInfo) * _loop[8].celCount);
+ // copy over our data (which is uncompressed bitmap data)
+ _loop[12].cel[0].rawBitmap = new byte[sizeof(ViewInject_KingsQuest6_Dual1)];
+ memcpy(_loop[12].cel[0].rawBitmap, ViewInject_KingsQuest6_Dual1, sizeof(ViewInject_KingsQuest6_Dual1));
+ _loop[12].cel[1].rawBitmap = new byte[sizeof(ViewInject_KingsQuest6_Dual2)];
+ memcpy(_loop[12].cel[1].rawBitmap, ViewInject_KingsQuest6_Dual2, sizeof(ViewInject_KingsQuest6_Dual2));
+ }
+ }
+ }
+ break;
+ default:
+ break;
+ }
}
GuiResourceId GfxView::getResourceId() const {
diff --git a/engines/sci/graphics/view.h b/engines/sci/graphics/view.h
index d3473f1024..d8803db208 100644
--- a/engines/sci/graphics/view.h
+++ b/engines/sci/graphics/view.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/sci/parser/grammar.cpp b/engines/sci/parser/grammar.cpp
index 26e3ec9238..05764ba0a8 100644
--- a/engines/sci/parser/grammar.cpp
+++ b/engines/sci/parser/grammar.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -397,7 +397,7 @@ ParseRuleList *Vocabulary::buildGNF(bool verbose) {
ntrules_nr = _vocab_rule_list_length(ntlist);
if (verbose)
- con->DebugPrintf("Starting with %d rules\n", ntrules_nr);
+ con->debugPrintf("Starting with %d rules\n", ntrules_nr);
new_tlist = tlist;
tlist = NULL;
@@ -425,17 +425,17 @@ ParseRuleList *Vocabulary::buildGNF(bool verbose) {
termrules = _vocab_rule_list_length(new_new_tlist);
if (verbose)
- con->DebugPrintf("After iteration #%d: %d new term rules\n", ++iterations, termrules);
+ con->debugPrintf("After iteration #%d: %d new term rules\n", ++iterations, termrules);
} while (termrules && (iterations < 30));
freeRuleList(ntlist);
if (verbose) {
- con->DebugPrintf("\nGNF rules:\n");
+ con->debugPrintf("\nGNF rules:\n");
tlist->print();
- con->DebugPrintf("%d allocd rules\n", _allocd_rules);
- con->DebugPrintf("Freeing rule list...\n");
+ con->debugPrintf("%d allocd rules\n", _allocd_rules);
+ con->debugPrintf("Freeing rule list...\n");
freeRuleList(tlist);
return NULL;
}
@@ -548,7 +548,7 @@ int Vocabulary::parseGNF(const ResultWordListList &words, bool verbose) {
ParseRuleList *seeker, *subseeker;
if (verbose)
- con->DebugPrintf("Adding word %d...\n", word);
+ con->debugPrintf("Adding word %d...\n", word);
seeker = work;
while (seeker) {
@@ -562,7 +562,7 @@ int Vocabulary::parseGNF(const ResultWordListList &words, bool verbose) {
if (reduced_rules == NULL) {
freeRuleList(work);
if (verbose)
- con->DebugPrintf("No results.\n");
+ con->debugPrintf("No results.\n");
return 1;
}
@@ -592,10 +592,10 @@ int Vocabulary::parseGNF(const ResultWordListList &words, bool verbose) {
work = new_work;
if (verbose)
- con->DebugPrintf("Now at %d candidates\n", _vocab_rule_list_length(work));
+ con->debugPrintf("Now at %d candidates\n", _vocab_rule_list_length(work));
if (work == NULL) {
if (verbose)
- con->DebugPrintf("No results.\n");
+ con->debugPrintf("No results.\n");
return 1;
}
}
@@ -603,9 +603,9 @@ int Vocabulary::parseGNF(const ResultWordListList &words, bool verbose) {
results = work;
if (verbose) {
- con->DebugPrintf("All results (excluding the surrounding '(141 %03x' and ')'):\n", _parserBranches[0].id);
+ con->debugPrintf("All results (excluding the surrounding '(141 %03x' and ')'):\n", _parserBranches[0].id);
results->print();
- con->DebugPrintf("\n");
+ con->debugPrintf("\n");
}
// now use the first result
diff --git a/engines/sci/parser/said.cpp b/engines/sci/parser/said.cpp
index eff4a29f49..693bbec744 100644
--- a/engines/sci/parser/said.cpp
+++ b/engines/sci/parser/said.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/sci/parser/vocabulary.cpp b/engines/sci/parser/vocabulary.cpp
index f5b79d6c5e..b4a223dcff 100644
--- a/engines/sci/parser/vocabulary.cpp
+++ b/engines/sci/parser/vocabulary.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -577,7 +577,7 @@ void Vocabulary::printSuffixes() const {
strncpy(alt_buf, suf->alt_suffix, suf->alt_suffix_length);
alt_buf[suf->alt_suffix_length] = 0;
- con->DebugPrintf("%4d: (%03x) -%12s => -%12s (%03x)\n", i, suf->class_mask, word_buf, alt_buf, suf->result_class);
+ con->debugPrintf("%4d: (%03x) -%12s => -%12s (%03x)\n", i, suf->class_mask, word_buf, alt_buf, suf->result_class);
++i;
}
}
@@ -588,14 +588,14 @@ void Vocabulary::printParserWords() const {
int n = 0;
for (WordMap::iterator i = _parserWords.begin(); i != _parserWords.end(); ++i) {
for (ResultWordList::iterator j = i->_value.begin(); j != i->_value.end(); ++j) {
- con->DebugPrintf("%4d: %03x [%03x] %20s |", n, j->_class, j->_group, i->_key.c_str());
+ con->debugPrintf("%4d: %03x [%03x] %20s |", n, j->_class, j->_group, i->_key.c_str());
if (n % 3 == 0)
- con->DebugPrintf("\n");
+ con->debugPrintf("\n");
n++;
}
}
- con->DebugPrintf("\n");
+ con->debugPrintf("\n");
}
void _vocab_recursive_ptree_dump(ParseTreeNode *tree, int blanks) {
@@ -665,15 +665,15 @@ void Vocabulary::printParserNodes(int num) {
Console *con = g_sci->getSciDebugger();
for (int i = 0; i < num; i++) {
- con->DebugPrintf(" Node %03x: ", i);
+ con->debugPrintf(" Node %03x: ", i);
if (_parserNodes[i].type == kParseTreeLeafNode)
- con->DebugPrintf("Leaf: %04x\n", _parserNodes[i].value);
+ con->debugPrintf("Leaf: %04x\n", _parserNodes[i].value);
else {
// FIXME: Do we really want to print the *addresses*
// of the left & right child?
// Note that one or both may be zero pointers, so we can't just
// print their values.
- con->DebugPrintf("Branch: ->%p, ->%p\n",
+ con->debugPrintf("Branch: ->%p, ->%p\n",
(const void *)_parserNodes[i].left,
(const void *)_parserNodes[i].right);
}
@@ -694,11 +694,11 @@ int Vocabulary::parseNodes(int *i, int *pos, int type, int nr, int argc, const c
return *pos;
}
if (type == kParseEndOfInput) {
- con->DebugPrintf("Unbalanced parentheses\n");
+ con->debugPrintf("Unbalanced parentheses\n");
return -1;
}
if (type == kParseClosingParenthesis) {
- con->DebugPrintf("Syntax error at token %d\n", *i);
+ con->debugPrintf("Syntax error at token %d\n", *i);
return -1;
}
@@ -724,19 +724,18 @@ int Vocabulary::parseNodes(int *i, int *pos, int type, int nr, int argc, const c
newPos = parseNodes(i, pos, nextToken, nextValue, argc, argv);
+ if (newPos == -1)
+ return -1;
+
if (j == 0)
_parserNodes[oldPos].left = &_parserNodes[newPos];
else
_parserNodes[oldPos].right = &_parserNodes[newPos];
-
-
- if (newPos == -1)
- return -1;
}
const char *token = argv[(*i)++];
if (strcmp(token, ")"))
- con->DebugPrintf("Expected ')' at token %d\n", *i);
+ con->debugPrintf("Expected ')' at token %d\n", *i);
return oldPos;
}
diff --git a/engines/sci/parser/vocabulary.h b/engines/sci/parser/vocabulary.h
index e4a7e41b3c..09499946cb 100644
--- a/engines/sci/parser/vocabulary.h
+++ b/engines/sci/parser/vocabulary.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/sci/resource.cpp b/engines/sci/resource.cpp
index d14c965ebb..17195c14b8 100644
--- a/engines/sci/resource.cpp
+++ b/engines/sci/resource.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -112,11 +112,12 @@ static const char *const s_resourceTypeNames[] = {
"audio", "sync", "message", "map", "heap",
"audio36", "sync36", "xlate", "robot", "vmd",
"chunk", "animation", "etc", "duck", "clut",
- "tga", "zzz", "macibin", "macibis", "macpict"
+ "tga", "zzz", "macibin", "macibis", "macpict",
+ "rave"
};
// Resource type suffixes. Note that the
-// suffic of SCI3 scripts has been changed from
+// suffix of SCI3 scripts has been changed from
// scr to csc
static const char *const s_resourceTypeSuffixes[] = {
"v56", "p56", "scr", "tex", "snd",
@@ -125,7 +126,7 @@ static const char *const s_resourceTypeSuffixes[] = {
"msg", "map", "hep", "", "",
"trn", "rbt", "vmd", "chk", "",
"etc", "duk", "clu", "tga", "zzz",
- "", "", ""
+ "", "", "", ""
};
const char *getResourceTypeName(ResourceType restype) {
@@ -141,7 +142,7 @@ static const ResourceType s_resTypeMapSci0[] = {
kResourceTypeCursor, kResourceTypePatch, kResourceTypeBitmap, kResourceTypePalette, // 0x08-0x0B
kResourceTypeCdAudio, kResourceTypeAudio, kResourceTypeSync, kResourceTypeMessage, // 0x0C-0x0F
kResourceTypeMap, kResourceTypeHeap, kResourceTypeAudio36, kResourceTypeSync36, // 0x10-0x13
- kResourceTypeTranslation // 0x14
+ kResourceTypeTranslation, kResourceTypeRave // 0x14
};
// TODO: 12 should be "Wave", but SCI seems to just store it in Audio resources
@@ -207,7 +208,7 @@ void Resource::unalloc() {
}
void Resource::writeToStream(Common::WriteStream *stream) const {
- stream->writeByte(getType() | 0x80); // 0x80 is required by old sierra sci, otherwise it wont accept the patch file
+ stream->writeByte(getType() | 0x80); // 0x80 is required by old Sierra SCI, otherwise it wont accept the patch file
stream->writeByte(_headerSize);
if (_headerSize > 0)
stream->write(_header, _headerSize);
@@ -383,42 +384,13 @@ void PatchResourceSource::loadResource(ResourceManager *resMan, Resource *res) {
static Common::Array<uint32> resTypeToMacTags(ResourceType type);
-static Common::String intToBase36(uint32 number, int minChar) {
- // Convert from an integer to a base36 string
- Common::String string;
-
- while (minChar--) {
- int character = number % 36;
- string = ((character < 10) ? (character + '0') : (character + 'A' - 10)) + string;
- number /= 36;
- }
-
- return string;
-}
-
-static Common::String constructPatchNameBase36(ResourceId resId) {
- // Convert from a resource ID to a base36 patch name
- Common::String output;
-
- output += (resId.getType() == kResourceTypeAudio36) ? '@' : '#'; // Identifier
- output += intToBase36(resId.getNumber(), 3); // Map
- output += intToBase36(resId.getTuple() >> 24, 2); // Noun
- output += intToBase36((resId.getTuple() >> 16) & 0xff, 2); // Verb
- output += '.'; // Separator
- output += intToBase36((resId.getTuple() >> 8) & 0xff, 2); // Cond
- output += intToBase36(resId.getTuple() & 0xff, 1); // Seq
-
- assert(output.size() == 12); // We should always get 12 characters in the end
- return output;
-}
-
void MacResourceForkResourceSource::loadResource(ResourceManager *resMan, Resource *res) {
ResourceType type = res->getType();
Common::SeekableReadStream *stream = 0;
if (type == kResourceTypeAudio36 || type == kResourceTypeSync36) {
// Handle audio36/sync36, convert back to audio/sync
- stream = _macResMan->getResource(constructPatchNameBase36(res->_id));
+ stream = _macResMan->getResource(res->_id.toPatchNameBase36());
} else {
// Plain resource handling
Common::Array<uint32> tagArray = resTypeToMacTags(type);
@@ -2292,15 +2264,6 @@ void ResourceManager::detectSciVersion() {
s_sciVersion = SCI_VERSION_1_1;
return;
}
- // FIXME: this is really difficult, lsl1 spanish has map/vol sci1late
- // and the only current detection difference is movecounttype which
- // is increment here, but ignore for all the regular sci1late games
- // the problem is, we dont have access to that detection till later
- // so maybe (part of?) that detection should get moved in here
- if (g_sci && (g_sci->getGameId() == GID_LSL1) && (g_sci->getLanguage() == Common::ES_ESP)) {
- s_sciVersion = SCI_VERSION_1_MIDDLE;
- return;
- }
s_sciVersion = SCI_VERSION_1_LATE;
return;
case kResVersionSci11:
diff --git a/engines/sci/resource.h b/engines/sci/resource.h
index 4baf39c67f..e90f52a3ce 100644
--- a/engines/sci/resource.h
+++ b/engines/sci/resource.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -112,6 +112,8 @@ enum ResourceType {
kResourceTypeMacIconBarPictS, // IBIS resources (icon bar, selected)
kResourceTypeMacPict, // PICT resources (inventory)
+ kResourceTypeRave, // KQ6 hires RAVE (special sync) resources
+
kResourceTypeInvalid
};
@@ -143,6 +145,19 @@ class ResourceId {
uint16 _number;
uint32 _tuple; // Only used for audio36 and sync36
+ static Common::String intToBase36(uint32 number, int minChar) {
+ // Convert from an integer to a base36 string
+ Common::String string;
+
+ while (minChar--) {
+ int character = number % 36;
+ string = ((character < 10) ? (character + '0') : (character + 'A' - 10)) + string;
+ number /= 36;
+ }
+
+ return string;
+ }
+
public:
ResourceId() : _type(kResourceTypeInvalid), _number(0), _tuple(0) { }
@@ -169,6 +184,22 @@ public:
return retStr;
}
+ // Convert from a resource ID to a base36 patch name
+ Common::String toPatchNameBase36() {
+ Common::String output;
+
+ output += (getType() == kResourceTypeAudio36) ? '@' : '#'; // Identifier
+ output += intToBase36(getNumber(), 3); // Map
+ output += intToBase36(getTuple() >> 24, 2); // Noun
+ output += intToBase36((getTuple() >> 16) & 0xff, 2); // Verb
+ output += '.'; // Separator
+ output += intToBase36((getTuple() >> 8) & 0xff, 2); // Cond
+ output += intToBase36(getTuple() & 0xff, 1); // Seq
+
+ assert(output.size() == 12); // We should always get 12 characters in the end
+ return output;
+ }
+
inline ResourceType getType() const { return _type; }
inline uint16 getNumber() const { return _number; }
inline uint32 getTuple() const { return _tuple; }
@@ -498,7 +529,7 @@ protected:
void readWaveAudioPatches();
void processWavePatch(ResourceId resourceId, Common::String name);
- /**
+ /**
* Applies to all versions before 0.000.395 (i.e. KQ4 old, XMAS 1988 and LSL2).
* Old SCI versions used two word header for script blocks (first word equal
* to 0x82, meaning of the second one unknown). New SCI versions used one
@@ -523,6 +554,7 @@ class SoundResource {
public:
struct Channel {
byte number;
+ byte flags;
byte poly;
uint16 prio;
uint16 size;
diff --git a/engines/sci/resource_audio.cpp b/engines/sci/resource_audio.cpp
index 744f05f2b9..4c7cd9b84a 100644
--- a/engines/sci/resource_audio.cpp
+++ b/engines/sci/resource_audio.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -101,32 +101,34 @@ bool Resource::loadFromAudioVolumeSCI11(Common::SeekableReadStream *file) {
}
file->seek(-4, SEEK_CUR);
- ResourceType type = _resMan->convertResType(file->readByte());
- if (((getType() == kResourceTypeAudio || getType() == kResourceTypeAudio36) && (type != kResourceTypeAudio))
- || ((getType() == kResourceTypeSync || getType() == kResourceTypeSync36) && (type != kResourceTypeSync))) {
- warning("Resource type mismatch loading %s", _id.toString().c_str());
- unalloc();
- return false;
- }
-
- _headerSize = file->readByte();
-
- if (type == kResourceTypeAudio) {
- if (_headerSize != 7 && _headerSize != 11 && _headerSize != 12) {
- warning("Unsupported audio header");
+ // Rave-resources (King's Quest 6) don't have any header at all
+ if (getType() != kResourceTypeRave) {
+ ResourceType type = _resMan->convertResType(file->readByte());
+ if (((getType() == kResourceTypeAudio || getType() == kResourceTypeAudio36) && (type != kResourceTypeAudio))
+ || ((getType() == kResourceTypeSync || getType() == kResourceTypeSync36) && (type != kResourceTypeSync))) {
+ warning("Resource type mismatch loading %s", _id.toString().c_str());
unalloc();
return false;
}
+
+ _headerSize = file->readByte();
+
+ if (type == kResourceTypeAudio) {
+ if (_headerSize != 7 && _headerSize != 11 && _headerSize != 12) {
+ warning("Unsupported audio header");
+ unalloc();
+ return false;
+ }
- if (_headerSize != 7) { // Size is defined already from the map
- // Load sample size
- file->seek(7, SEEK_CUR);
- size = file->readUint32LE();
- // Adjust offset to point at the header data again
- file->seek(-11, SEEK_CUR);
+ if (_headerSize != 7) { // Size is defined already from the map
+ // Load sample size
+ file->seek(7, SEEK_CUR);
+ size = file->readUint32LE();
+ // Adjust offset to point at the header data again
+ file->seek(-11, SEEK_CUR);
+ }
}
}
-
return loadPatch(file);
}
@@ -395,15 +397,22 @@ int ResourceManager::readAudioMapSCI11(ResourceSource *map) {
syncSize = READ_LE_UINT16(ptr);
ptr += 2;
+ // FIXME: The sync36 resource seems to be two bytes too big in KQ6CD
+ // (bytes taken from the RAVE resource right after it)
if (syncSize > 0)
addResource(ResourceId(kResourceTypeSync36, map->_volumeNumber, n & 0xffffff3f), src, offset, syncSize);
}
if (n & 0x40) {
// This seems to define the size of raw lipsync data (at least
- // in kq6), may also just be general appended data.
- syncSize += READ_LE_UINT16(ptr);
+ // in KQ6 CD Windows).
+ int kq6HiresSyncSize = READ_LE_UINT16(ptr);
ptr += 2;
+
+ if (kq6HiresSyncSize > 0) {
+ addResource(ResourceId(kResourceTypeRave, map->_volumeNumber, n & 0xffffff3f), src, offset + syncSize, kq6HiresSyncSize);
+ syncSize += kq6HiresSyncSize;
+ }
}
addResource(ResourceId(kResourceTypeAudio36, map->_volumeNumber, n & 0xffffff3f), src, offset + syncSize);
@@ -590,6 +599,7 @@ SoundResource::SoundResource(uint32 resourceNr, ResourceManager *resMan, SciVers
_tracks->channels = new Channel[_tracks->channelCount];
memset(_tracks->channels, 0, sizeof(Channel) * _tracks->channelCount);
channel = &_tracks->channels[0];
+ channel->flags |= 2; // don't remap (SCI0 doesn't have remapping)
if (_soundVersion == SCI_VERSION_0_EARLY) {
channel->data = resource->data + 0x11;
channel->size = resource->size - 0x11;
@@ -667,33 +677,52 @@ SoundResource::SoundResource(uint32 resourceNr, ResourceManager *resMan, SciVers
channelNr = 0;
while (channelCount--) {
channel = &_tracks[trackNr].channels[channelNr];
- channel->prio = READ_LE_UINT16(data);
uint dataOffset = READ_LE_UINT16(data + 2);
- if (dataOffset < resource->size) {
- channel->data = resource->data + dataOffset;
- channel->size = READ_LE_UINT16(data + 4);
- channel->curPos = 0;
- // FIXME: number contains (low nibble) channel and (high nibble) flags
- // 0x20 is set on rhythm channels to prevent remapping
- channel->number = *channel->data;
- channel->poly = *(channel->data + 1);
- channel->time = channel->prev = 0;
- channel->data += 2; // skip over header
- channel->size -= 2; // remove header size
- if (channel->number == 0xFE) { // Digital channel
- _tracks[trackNr].digitalChannelNr = channelNr;
- _tracks[trackNr].digitalSampleRate = READ_LE_UINT16(channel->data);
- _tracks[trackNr].digitalSampleSize = READ_LE_UINT16(channel->data + 2);
- _tracks[trackNr].digitalSampleStart = READ_LE_UINT16(channel->data + 4);
- _tracks[trackNr].digitalSampleEnd = READ_LE_UINT16(channel->data + 6);
- channel->data += 8; // Skip over header
- channel->size -= 8;
- }
- _tracks[trackNr].channelCount++;
- channelNr++;
- } else {
+
+ if (dataOffset >= resource->size) {
warning("Invalid offset inside sound resource %d: track %d, channel %d", resourceNr, trackNr, channelNr);
+ data += 6;
+ continue;
+ }
+
+ channel->data = resource->data + dataOffset;
+ channel->size = READ_LE_UINT16(data + 4);
+ channel->curPos = 0;
+ channel->number = *channel->data;
+
+ channel->poly = *(channel->data + 1) & 0x0F;
+ channel->prio = *(channel->data + 1) >> 4;
+ channel->time = channel->prev = 0;
+ channel->data += 2; // skip over header
+ channel->size -= 2; // remove header size
+ if (channel->number == 0xFE) { // Digital channel
+ _tracks[trackNr].digitalChannelNr = channelNr;
+ _tracks[trackNr].digitalSampleRate = READ_LE_UINT16(channel->data);
+ _tracks[trackNr].digitalSampleSize = READ_LE_UINT16(channel->data + 2);
+ _tracks[trackNr].digitalSampleStart = READ_LE_UINT16(channel->data + 4);
+ _tracks[trackNr].digitalSampleEnd = READ_LE_UINT16(channel->data + 6);
+ channel->data += 8; // Skip over header
+ channel->size -= 8;
+ channel->flags = 0;
+ } else {
+ channel->flags = channel->number >> 4;
+ channel->number = channel->number & 0x0F;
+
+ // 0x20 is set on rhythm channels to prevent remapping
+ // CHECKME: Which SCI versions need that set manually?
+ channel->flags = (*channel->data) >> 4;
+ if (channel->number == 9)
+ channel->flags |= 2;
+ // Note: flag 1: channel start offset is 0 instead of 10
+ // (currently: everything 0)
+ // also: don't map the channel to device
+ // flag 2: don't remap
+ // flag 4: start muted
+ // QfG2 lacks flags 2 and 4, and uses (flags >= 1) as
+ // the condition for starting offset 0, without the "don't map"
}
+ _tracks[trackNr].channelCount++;
+ channelNr++;
data += 6;
}
} else {
@@ -856,6 +885,7 @@ void AudioVolumeResourceSource::loadResource(ResourceManager *resMan, Resource *
switch (res->getType()) {
case kResourceTypeSync:
case kResourceTypeSync36:
+ case kResourceTypeRave:
// we should already have a (valid) size
break;
default:
diff --git a/engines/sci/resource_intern.h b/engines/sci/resource_intern.h
index c256c9d156..461d684005 100644
--- a/engines/sci/resource_intern.h
+++ b/engines/sci/resource_intern.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/sci/sci.cpp b/engines/sci/sci.cpp
index c1aadc3622..fc723f18cf 100644
--- a/engines/sci/sci.cpp
+++ b/engines/sci/sci.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -38,6 +38,7 @@
#include "sci/engine/state.h"
#include "sci/engine/kernel.h"
#include "sci/engine/script.h" // for script_adjust_opcode_formats
+#include "sci/engine/script_patches.h"
#include "sci/engine/selector.h" // for SELECTOR
#include "sci/sound/audio.h"
@@ -112,6 +113,7 @@ SciEngine::SciEngine(OSystem *syst, const ADGameDescription *desc, SciGameId gam
DebugMan.addDebugChannel(kDebugLevelDclInflate, "DCL", "DCL inflate debugging");
DebugMan.addDebugChannel(kDebugLevelVM, "VM", "VM debugging");
DebugMan.addDebugChannel(kDebugLevelScripts, "Scripts", "Notifies when scripts are unloaded");
+ DebugMan.addDebugChannel(kDebugLevelScriptPatcher, "ScriptPatcher", "Notifies when scripts are patched");
DebugMan.addDebugChannel(kDebugLevelGC, "GC", "Garbage Collector debugging");
DebugMan.addDebugChannel(kDebugLevelResMan, "ResMan", "Resource manager debugging");
DebugMan.addDebugChannel(kDebugLevelOnStartup, "OnStartup", "Enter debugger at start of game");
@@ -135,7 +137,7 @@ SciEngine::SciEngine(OSystem *syst, const ADGameDescription *desc, SciGameId gam
SearchMan.addSubDirectoryMatching(gameDataDir, "duk"); // Duck movie files in Phantasmagoria 2
SearchMan.addSubDirectoryMatching(gameDataDir, "Robot Folder"); // Mac robot files
SearchMan.addSubDirectoryMatching(gameDataDir, "Sound Folder"); // Mac audio files
- SearchMan.addSubDirectoryMatching(gameDataDir, "Voices Folder"); // Mac audio36 files
+ SearchMan.addSubDirectoryMatching(gameDataDir, "Voices Folder", 0, 2, true); // Mac audio36 files (recursive for Torin)
SearchMan.addSubDirectoryMatching(gameDataDir, "Voices"); // Mac audio36 files
SearchMan.addSubDirectoryMatching(gameDataDir, "VMD Folder"); // Mac VMD files
@@ -183,6 +185,7 @@ SciEngine::~SciEngine() {
delete[] _opcode_formats;
+ delete _scriptPatcher;
delete _resMan; // should be deleted last
g_sci = 0;
}
@@ -216,14 +219,16 @@ Common::Error SciEngine::run() {
// Add the after market GM patches for the specified game, if they exist
_resMan->addNewGMPatch(_gameId);
_gameObjectAddress = _resMan->findGameObject();
-
- SegManager *segMan = new SegManager(_resMan);
+
+ _scriptPatcher = new ScriptPatcher();
+ SegManager *segMan = new SegManager(_resMan, _scriptPatcher);
// Initialize the game screen
_gfxScreen = new GfxScreen(_resMan);
_gfxScreen->enableUndithering(ConfMan.getBool("disable_dithering"));
_kernel = new Kernel(_resMan, segMan);
+ _kernel->init();
_features = new GameFeatures(segMan, _kernel);
// Only SCI0, SCI01 and SCI1 EGA games used a parser
@@ -281,6 +286,11 @@ Common::Error SciEngine::run() {
// We set this, so that the game automatically quit right after init
_gamestate->variables[VAR_GLOBAL][4] = TRUE_REG;
+ // Jones only initializes its menus when restarting/restoring, thus set
+ // the gameIsRestarting flag here before initializing. Fixes bug #6536.
+ if (g_sci->getGameId() == GID_JONES)
+ _gamestate->gameIsRestarting = GAMEISRESTARTING_RESTORE;
+
_gamestate->_executionStackPosChanged = false;
run_vm(_gamestate);
@@ -501,6 +511,7 @@ void SciEngine::patchGameSaveRestore() {
case GID_HOYLE1: // gets confused, although the game doesnt support saving/restoring at all
case GID_HOYLE2: // gets confused, see hoyle1
case GID_JONES: // gets confused, when we patch us in, the game is only able to save to 1 slot, so hooking is not required
+ case GID_MOTHERGOOSE: // mother goose EGA saves/restores directly and has no save/restore dialogs
case GID_MOTHERGOOSE256: // mother goose saves/restores directly and has no save/restore dialogs
case GID_PHANTASMAGORIA: // has custom save/load code
case GID_SHIVERS: // has custom save/load code
@@ -571,7 +582,7 @@ bool SciEngine::initGame() {
// Script 0 should always be at segment 1
if (script0Segment != 1) {
- debug(2, "Failed to instantiate script.000");
+ debug(2, "Failed to instantiate script 0");
return false;
}
@@ -881,8 +892,18 @@ void SciEngine::syncSoundSettings() {
}
}
+// used by Script Patcher. Used to find out, if Laura Bow 2/King's Quest 6 need patching for Speech+Subtitles - or not
+bool SciEngine::speechAndSubtitlesEnabled() {
+ bool subtitlesOn = ConfMan.getBool("subtitles");
+ bool speechOn = !ConfMan.getBool("speech_mute");
+
+ if (isCD() && subtitlesOn && speechOn)
+ return true;
+ return false;
+}
+
void SciEngine::syncIngameAudioOptions() {
- // Now, sync the in-game speech/subtitles settings for SCI1.1 CD games
+ // Sync the in-game speech/subtitles settings for SCI1.1 CD games
if (isCD() && getSciVersion() == SCI_VERSION_1_1) {
bool subtitlesOn = ConfMan.getBool("subtitles");
bool speechOn = !ConfMan.getBool("speech_mute");
@@ -893,16 +914,16 @@ void SciEngine::syncIngameAudioOptions() {
_gamestate->variables[VAR_GLOBAL][90] = make_reg(0, 2); // speech
} else if (subtitlesOn && speechOn) {
// Is it a game that supports simultaneous speech and subtitles?
- if (getGameId() == GID_SQ4
- || getGameId() == GID_FREDDYPHARKAS
- || getGameId() == GID_ECOQUEST
- || getGameId() == GID_LSL6
- // TODO: The following need script patches for simultaneous speech and subtitles
- //|| getGameId() == GID_KQ6
- //|| getGameId() == GID_LAURABOW2
- ) {
+ switch (_gameId) {
+ case GID_SQ4:
+ case GID_FREDDYPHARKAS:
+ case GID_ECOQUEST:
+ case GID_LSL6:
+ case GID_LAURABOW2:
+ case GID_KQ6:
_gamestate->variables[VAR_GLOBAL][90] = make_reg(0, 3); // speech + subtitles
- } else {
+ break;
+ default:
// Game does not support speech and subtitles, set it to speech
_gamestate->variables[VAR_GLOBAL][90] = make_reg(0, 2); // speech
}
@@ -910,6 +931,34 @@ void SciEngine::syncIngameAudioOptions() {
}
}
+void SciEngine::updateScummVMAudioOptions() {
+ // Update ScummVM's speech/subtitles settings for SCI1.1 CD games,
+ // depending on the in-game settings
+ if (isCD() && getSciVersion() == SCI_VERSION_1_1) {
+ uint16 ingameSetting = _gamestate->variables[VAR_GLOBAL][90].getOffset();
+
+ switch (ingameSetting) {
+ case 1:
+ // subtitles
+ ConfMan.setBool("subtitles", true);
+ ConfMan.setBool("speech_mute", true);
+ break;
+ case 2:
+ // speech
+ ConfMan.setBool("subtitles", false);
+ ConfMan.setBool("speech_mute", false);
+ break;
+ case 3:
+ // speech + subtitles
+ ConfMan.setBool("subtitles", true);
+ ConfMan.setBool("speech_mute", false);
+ break;
+ default:
+ break;
+ }
+ }
+}
+
void SciEngine::loadMacExecutable() {
if (getPlatform() != Common::kPlatformMacintosh || getSciVersion() < SCI_VERSION_1_EARLY || getSciVersion() > SCI_VERSION_1_1)
return;
diff --git a/engines/sci/sci.h b/engines/sci/sci.h
index 0a75e115fd..48bc4819d2 100644
--- a/engines/sci/sci.h
+++ b/engines/sci/sci.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -55,6 +55,7 @@ class AudioPlayer;
class SoundCommandParser;
class EventManager;
class SegManager;
+class ScriptPatcher;
class GfxAnimate;
class GfxCache;
@@ -82,28 +83,29 @@ class GfxFrameout;
// our engine debug levels
enum kDebugLevels {
- kDebugLevelError = 1 << 0,
- kDebugLevelNodes = 1 << 1,
- kDebugLevelGraphics = 1 << 2,
- kDebugLevelStrings = 1 << 3,
- kDebugLevelMemory = 1 << 4,
- kDebugLevelFuncCheck = 1 << 5,
- kDebugLevelBresen = 1 << 6,
- kDebugLevelSound = 1 << 7,
- kDebugLevelBaseSetter = 1 << 8,
- kDebugLevelParser = 1 << 9,
- kDebugLevelSaid = 1 << 10,
- kDebugLevelFile = 1 << 11,
- kDebugLevelTime = 1 << 12,
- kDebugLevelRoom = 1 << 13,
- kDebugLevelAvoidPath = 1 << 14,
- kDebugLevelDclInflate = 1 << 15,
- kDebugLevelVM = 1 << 16,
- kDebugLevelScripts = 1 << 17,
- kDebugLevelGC = 1 << 18,
- kDebugLevelResMan = 1 << 19,
- kDebugLevelOnStartup = 1 << 20,
- kDebugLevelDebugMode = 1 << 21
+ kDebugLevelError = 1 << 0,
+ kDebugLevelNodes = 1 << 1,
+ kDebugLevelGraphics = 1 << 2,
+ kDebugLevelStrings = 1 << 3,
+ kDebugLevelMemory = 1 << 4,
+ kDebugLevelFuncCheck = 1 << 5,
+ kDebugLevelBresen = 1 << 6,
+ kDebugLevelSound = 1 << 7,
+ kDebugLevelBaseSetter = 1 << 8,
+ kDebugLevelParser = 1 << 9,
+ kDebugLevelSaid = 1 << 10,
+ kDebugLevelFile = 1 << 11,
+ kDebugLevelTime = 1 << 12,
+ kDebugLevelRoom = 1 << 13,
+ kDebugLevelAvoidPath = 1 << 14,
+ kDebugLevelDclInflate = 1 << 15,
+ kDebugLevelVM = 1 << 16,
+ kDebugLevelScripts = 1 << 17,
+ kDebugLevelGC = 1 << 18,
+ kDebugLevelResMan = 1 << 19,
+ kDebugLevelOnStartup = 1 << 20,
+ kDebugLevelDebugMode = 1 << 21,
+ kDebugLevelScriptPatcher = 1 << 22
};
enum SciGameId {
@@ -244,13 +246,15 @@ public:
* and we add this functionality in ScummVM:
* - Space Quest 4 CD
* - Freddy Pharkas CD
+ * - Laura Bow 2 CD
* SCI1.1 games which don't support simultaneous speech and subtitles,
* and we haven't added any extra functionality in ScummVM because extra
* script patches are needed:
- * - Laura Bow 2 CD
* - King's Quest 6 CD
*/
+ bool speechAndSubtitlesEnabled();
void syncIngameAudioOptions();
+ void updateScummVMAudioOptions();
const SciGameId &getGameId() const { return _gameId; }
const char *getGameIdStr() const;
@@ -266,6 +270,7 @@ public:
bool hasMacIconBar() const;
inline ResourceManager *getResMan() const { return _resMan; }
+ inline ScriptPatcher *getScriptPatcher() const { return _scriptPatcher; }
inline Kernel *getKernel() const { return _kernel; }
inline EngineState *getEngineState() const { return _gamestate; }
inline Vocabulary *getVocabulary() const { return _vocabulary; }
@@ -397,6 +402,7 @@ private:
const ADGameDescription *_gameDescription;
const SciGameId _gameId;
ResourceManager *_resMan; /**< The resource manager */
+ ScriptPatcher *_scriptPatcher; /**< The script patcher */
EngineState *_gamestate;
Kernel *_kernel;
Vocabulary *_vocabulary;
diff --git a/engines/sci/sound/audio.cpp b/engines/sci/sound/audio.cpp
index 8f405b0fa5..8e35d6b055 100644
--- a/engines/sci/sound/audio.cpp
+++ b/engines/sci/sound/audio.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -61,6 +61,62 @@ void AudioPlayer::stopAllAudio() {
audioCdStop();
}
+/**
+ * Handles the sciAudio calls in fanmade games.
+ * sciAudio is an external .NET library for playing MP3 files in fanmade games.
+ * It runs in the background, and obtains sound commands from the
+ * currently running game via text files (called "conductor files").
+ * For further info, check: http://sciprogramming.com/community/index.php?topic=634.0
+ */
+void AudioPlayer::handleFanmadeSciAudio(reg_t sciAudioObject, SegManager *segMan) {
+ // TODO: This is a bare bones implementation. Only the play/playx and stop commands
+ // are handled for now - the other commands haven't been observed in any fanmade game
+ // yet. All the volume related and fading functionality is currently missing.
+
+ Kernel *kernel = g_sci->getKernel();
+
+ reg_t commandReg = readSelector(segMan, sciAudioObject, kernel->findSelector("command"));
+ Common::String command = segMan->getString(commandReg);
+
+ if (command == "play" || command == "playx") {
+#ifdef USE_MAD
+ reg_t fileNameReg = readSelector(segMan, sciAudioObject, kernel->findSelector("fileName"));
+ Common::String fileName = segMan->getString(fileNameReg);
+
+ int16 loopCount = (int16)readSelectorValue(segMan, sciAudioObject, kernel->findSelector("loopCount"));
+ // When loopCount is -1, we treat it as infinite looping, else no looping is done.
+ // This is observed by game scripts, which can set loopCount to all sorts of random values.
+ // Adjust loopCount for ScummVM's LoopingAudioStream semantics
+ loopCount = (loopCount == -1) ? 0 : 1;
+
+ // Determine sound type
+ Audio::Mixer::SoundType soundType = Audio::Mixer::kSFXSoundType;
+ if (fileName.hasPrefix("music"))
+ soundType = Audio::Mixer::kMusicSoundType;
+ else if (fileName.hasPrefix("speech"))
+ soundType = Audio::Mixer::kSpeechSoundType;
+
+ Common::File *sciAudio = new Common::File();
+ // Replace backwards slashes
+ for (uint i = 0; i < fileName.size(); i++) {
+ if (fileName[i] == '\\')
+ fileName.setChar('/', i);
+ }
+ sciAudio->open("sciAudio/" + fileName);
+
+ Audio::SeekableAudioStream *audioStream = Audio::makeMP3Stream(sciAudio, DisposeAfterUse::YES);
+
+ // We only support one audio handle
+ _mixer->playStream(soundType, &_audioHandle,
+ Audio::makeLoopingAudioStream((Audio::RewindableAudioStream *)audioStream, loopCount));
+#endif
+ } else if (command == "stop") {
+ _mixer->stopHandle(_audioHandle);
+ } else {
+ warning("Unhandled sciAudio command: %s", command.c_str());
+ }
+}
+
int AudioPlayer::startAudio(uint16 module, uint32 number) {
int sampleLen;
Audio::AudioStream *audioStream = getAudioStream(number, module, &sampleLen);
diff --git a/engines/sci/sound/audio.h b/engines/sci/sound/audio.h
index e0ba234b12..9e65d6e0c8 100644
--- a/engines/sci/sound/audio.h
+++ b/engines/sci/sound/audio.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -75,6 +75,8 @@ public:
void pauseAudio();
void resumeAudio();
+ void handleFanmadeSciAudio(reg_t sciAudioObject, SegManager *segMan);
+
void setSoundSync(ResourceId id, reg_t syncObjAddr, SegManager *segMan);
void doSoundSync(reg_t syncObjAddr, SegManager *segMan);
void stopSoundSync();
diff --git a/engines/sci/sound/drivers/adlib.cpp b/engines/sci/sound/drivers/adlib.cpp
index 3229fd7071..fcfda2f532 100644
--- a/engines/sci/sound/drivers/adlib.cpp
+++ b/engines/sci/sound/drivers/adlib.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/sci/sound/drivers/amigamac.cpp b/engines/sci/sound/drivers/amigamac.cpp
index 131a85f371..5ce49086ca 100644
--- a/engines/sci/sound/drivers/amigamac.cpp
+++ b/engines/sci/sound/drivers/amigamac.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/sci/sound/drivers/cms.cpp b/engines/sci/sound/drivers/cms.cpp
index fd60863177..a222090fc8 100644
--- a/engines/sci/sound/drivers/cms.cpp
+++ b/engines/sci/sound/drivers/cms.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/sci/sound/drivers/fb01.cpp b/engines/sci/sound/drivers/fb01.cpp
index b16473e62e..db9f7558e2 100644
--- a/engines/sci/sound/drivers/fb01.cpp
+++ b/engines/sci/sound/drivers/fb01.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/sci/sound/drivers/fmtowns.cpp b/engines/sci/sound/drivers/fmtowns.cpp
index 21cb2f1e43..f6dbac2a67 100644
--- a/engines/sci/sound/drivers/fmtowns.cpp
+++ b/engines/sci/sound/drivers/fmtowns.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/sci/sound/drivers/gm_names.h b/engines/sci/sound/drivers/gm_names.h
index fbfa413a4a..791f79777c 100644
--- a/engines/sci/sound/drivers/gm_names.h
+++ b/engines/sci/sound/drivers/gm_names.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/sci/sound/drivers/map-mt32-to-gm.h b/engines/sci/sound/drivers/map-mt32-to-gm.h
index 12a36aa51c..5c90c47777 100644
--- a/engines/sci/sound/drivers/map-mt32-to-gm.h
+++ b/engines/sci/sound/drivers/map-mt32-to-gm.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/sci/sound/drivers/midi.cpp b/engines/sci/sound/drivers/midi.cpp
index a31d5f9a81..31c9d90de8 100644
--- a/engines/sci/sound/drivers/midi.cpp
+++ b/engines/sci/sound/drivers/midi.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/sci/sound/drivers/mididriver.h b/engines/sci/sound/drivers/mididriver.h
index 8938eef62f..fee0154096 100644
--- a/engines/sci/sound/drivers/mididriver.h
+++ b/engines/sci/sound/drivers/mididriver.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/sci/sound/drivers/pcjr.cpp b/engines/sci/sound/drivers/pcjr.cpp
index 1d823b643d..2399c506d4 100644
--- a/engines/sci/sound/drivers/pcjr.cpp
+++ b/engines/sci/sound/drivers/pcjr.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/sci/sound/midiparser_sci.cpp b/engines/sci/sound/midiparser_sci.cpp
index 186fc18a5c..c0b4f3122e 100644
--- a/engines/sci/sound/midiparser_sci.cpp
+++ b/engines/sci/sound/midiparser_sci.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -58,6 +58,10 @@ MidiParser_SCI::MidiParser_SCI(SciVersion soundVersion, SciMusic *music) :
_resetOnPause = false;
_pSnd = 0;
+
+ _mainThreadCalled = false;
+
+ resetStateTracking();
}
MidiParser_SCI::~MidiParser_SCI() {
@@ -68,10 +72,12 @@ MidiParser_SCI::~MidiParser_SCI() {
}
void MidiParser_SCI::mainThreadBegin() {
+ assert(!_mainThreadCalled);
_mainThreadCalled = true;
}
void MidiParser_SCI::mainThreadEnd() {
+ assert(_mainThreadCalled);
_mainThreadCalled = false;
}
@@ -83,12 +89,21 @@ bool MidiParser_SCI::loadMusic(SoundResource::Track *track, MusicEntry *psnd, in
for (int i = 0; i < 16; i++) {
_channelUsed[i] = false;
- _channelRemap[i] = -1;
_channelMuted[i] = false;
_channelVolume[i] = 127;
+
+ if (_soundVersion <= SCI_VERSION_0_LATE)
+ _channelRemap[i] = i;
+ else
+ _channelRemap[i] = -1;
}
- _channelRemap[9] = 9; // never map channel 9, because that's used for percussion
- _channelRemap[15] = 15; // never map channel 15, because thats used by sierra internally
+
+ // FIXME: SSCI does not always start playing a track at the first byte.
+ // By default it skips 10 (or 13?) bytes containing prio/voices, patch,
+ // volume, pan commands in fixed locations, and possibly a signal
+ // in channel 15. We should initialize state tracking to those values
+ // so that they automatically get set up properly when the channels get
+ // mapped. See also the related FIXME in MidiParser_SCI::processEvent.
if (channelFilterMask) {
// SCI0 only has 1 data stream, but we need to filter out channels depending on music hardware selection
@@ -314,31 +329,26 @@ byte *MidiParser_SCI::midiFilterChannels(int channelMask) {
return _mixedData;
}
-// This will get called right before actual playing and will try to own the used channels
-void MidiParser_SCI::tryToOwnChannels() {
- // We don't have SciMusic in case debug command show_instruments is used
- if (!_music)
- return;
- for (int curChannel = 0; curChannel < 15; curChannel++) {
- if (_channelUsed[curChannel]) {
- if (_channelRemap[curChannel] == -1) {
- _channelRemap[curChannel] = _music->tryToOwnChannel(_pSnd, curChannel);
- }
- }
- }
-}
+void MidiParser_SCI::resetStateTracking() {
+ for (int i = 0; i < 16; ++i) {
+ ChannelState &s = _channelState[i];
+ s._modWheel = 0;
+ s._pan = 64;
+ s._patch = 0; // TODO: Initialize properly (from data in LoadMusic?)
+ s._note = -1;
+ s._sustain = false;
+ s._pitchWheel = 0x2000;
+ s._voices = 0;
-void MidiParser_SCI::lostChannels() {
- for (int curChannel = 0; curChannel < 15; curChannel++)
- if ((_channelUsed[curChannel]) && (curChannel != 9))
- _channelRemap[curChannel] = -1;
+ _channelVolume[i] = 127;
+ }
}
void MidiParser_SCI::sendInitCommands() {
- // reset our "global" volume and channel volumes
+ resetStateTracking();
+
+ // reset our "global" volume
_volume = 127;
- for (int i = 0; i < 16; i++)
- _channelVolume[i] = 127;
// Set initial voice count
if (_pSnd) {
@@ -390,53 +400,119 @@ void MidiParser_SCI::sendFromScriptToDriver(uint32 midi) {
// this happens for cmdSendMidi at least in sq1vga right at the start, it's a script issue
return;
}
- if (_channelRemap[midiChannel] == -1) {
- // trying to send to an unmapped channel
- // this happens for cmdSendMidi at least in sq1vga right at the start, scripts are pausing the sound
- // and then sending manually. it's a script issue
- return;
- }
sendToDriver(midi);
}
void MidiParser_SCI::sendToDriver(uint32 midi) {
- byte midiChannel = midi & 0xf;
-
- if ((midi & 0xFFF0) == 0x4EB0) {
- // this is channel mute only for sci1
- // it's velocity control for sci0
- if (_soundVersion >= SCI_VERSION_1_EARLY) {
- _channelMuted[midiChannel] = midi & 0xFF0000 ? true : false;
- return; // don't send this to driver at all
- }
- }
+ // State tracking
+ trackState(midi);
- // Is channel muted? if so, don't send command
- if (_channelMuted[midiChannel])
+ if ((midi & 0xFFF0) == 0x4EB0 && _soundVersion >= SCI_VERSION_1_EARLY) {
+ // Mute. Handled in trackState().
+ // CHECKME: Should we send this on to the driver?
return;
+ }
if ((midi & 0xFFF0) == 0x07B0) {
// someone trying to set channel volume?
int channelVolume = (midi >> 16) & 0xFF;
- // Remember, if we need to set it ourselves
- _channelVolume[midiChannel] = channelVolume;
// Adjust volume accordingly to current local volume
channelVolume = channelVolume * _volume / 127;
- midi = (midi & 0xFFF0) | ((channelVolume & 0xFF) << 16);
+ midi = (midi & 0xFFFF) | ((channelVolume & 0xFF) << 16);
}
+
// Channel remapping
+ byte midiChannel = midi & 0xf;
int16 realChannel = _channelRemap[midiChannel];
if (realChannel == -1)
return;
midi = (midi & 0xFFFFFFF0) | realChannel;
+ sendToDriver_raw(midi);
+}
+
+void MidiParser_SCI::sendToDriver_raw(uint32 midi) {
if (_mainThreadCalled)
_music->putMidiCommandInQueue(midi);
else
_driver->send(midi);
}
+void MidiParser_SCI::trackState(uint32 b) {
+ // We keep track of most of the state of a midi channel, so we can
+ // at any time reset the device to the current state, even if the
+ // channel has been temporarily disabled due to remapping.
+
+ byte command = b & 0xf0;
+ byte channel = b & 0xf;
+ byte op1 = (b >> 8) & 0x7f;
+ byte op2 = (b >> 16) & 0x7f;
+
+ ChannelState &s = _channelState[channel];
+
+ switch (command) {
+ case 0x90:
+ if (op2 != 0) {
+ // note on
+ s._note = op1;
+ break;
+ }
+ // else, fall-through
+ case 0x80:
+ // note off
+ if (s._note == op1)
+ s._note = -1;
+ break;
+ case 0xB0:
+ // control change
+ switch (op1) {
+ case 0x01: // mod wheel
+ s._modWheel = op2;
+ break;
+ case 0x07: // channel volume
+ _channelVolume[channel] = op2;
+ break;
+ case 0x0A: // pan
+ s._pan = op2;
+ break;
+ case 0x40: // sustain
+ s._sustain = (op2 != 0);
+ break;
+ case 0x4B: // voices
+ s._voices = op2;
+ _pSnd->_chan[channel]._voices = op2; // Also sync our MusicEntry
+ break;
+ case 0x4E: // mute
+ // This is channel mute only for sci1.
+ // (It's velocity control for sci0, but we don't need state in sci0)
+ if (_soundVersion >= SCI_VERSION_1_EARLY) {
+ // FIXME: mute is a level, not a bool, in some SCI versions
+ bool m = op2;
+ if (_pSnd->_chan[channel]._mute != m) {
+ _pSnd->_chan[channel]._mute = m;
+ // TODO: If muting/unmuting a channel, remap channels.
+ warning("Mute change without immediate remapping (mainThread = %d)", _mainThreadCalled);
+ }
+ }
+ break;
+ default:
+ break;
+ }
+ break;
+ case 0xC0:
+ // program change
+ s._patch = op1;
+ break;
+ case 0xE0:
+ // pitchwheel
+ s._pitchWheel = (op2 << 7) | op1;
+ break;
+ default:
+ break;
+ }
+}
+
void MidiParser_SCI::parseNextEvent(EventInfo &info) {
info.start = _position._playPos;
info.delta = 0;
@@ -477,8 +553,10 @@ void MidiParser_SCI::parseNextEvent(EventInfo &info) {
case 0xE:
info.basic.param1 = *(_position._playPos++);
info.basic.param2 = *(_position._playPos++);
- if (info.command() == 0x9 && info.basic.param2 == 0)
+ if (info.command() == 0x9 && info.basic.param2 == 0) {
+ // NoteOn with param2==0 is a NoteOff
info.event = info.channel() | 0x80;
+ }
info.length = 0;
break;
@@ -523,11 +601,10 @@ void MidiParser_SCI::parseNextEvent(EventInfo &info) {
}// switch (info.command())
}
-void MidiParser_SCI::processEvent(const EventInfo &info, bool fireEvents) {
+bool MidiParser_SCI::processEvent(const EventInfo &info, bool fireEvents) {
if (!fireEvents) {
// We don't do any processing that should be done while skipping events
- MidiParser::processEvent(info, fireEvents);
- return;
+ return MidiParser::processEvent(info, fireEvents);
}
switch (info.command()) {
@@ -579,7 +656,7 @@ void MidiParser_SCI::processEvent(const EventInfo &info, bool fireEvents) {
}
// Done with this event.
- return;
+ return true;
}
// Break to let parent handle the rest.
@@ -606,7 +683,7 @@ void MidiParser_SCI::processEvent(const EventInfo &info, bool fireEvents) {
switch (info.basic.param1) {
case kSetReverb:
// Already handled above
- return;
+ return true;
case kMidiHold:
// Check if the hold ID marker is the same as the hold ID
// marker set for that song by cmdSetSoundHold.
@@ -614,9 +691,9 @@ void MidiParser_SCI::processEvent(const EventInfo &info, bool fireEvents) {
if (info.basic.param2 == _pSnd->hold) {
jumpToTick(_loopTick, false, false);
// Done with this event.
- return;
+ return true;
}
- return;
+ return true;
case kUpdateCue:
if (!_jumpingToTick) {
int inc;
@@ -637,17 +714,17 @@ void MidiParser_SCI::processEvent(const EventInfo &info, bool fireEvents) {
debugC(4, kDebugLevelSound, "datainc %04x", inc);
}
- return;
+ return true;
case kResetOnPause:
_resetOnPause = info.basic.param2;
- return;
+ return true;
// Unhandled SCI commands
case 0x46: // LSL3 - binoculars
case 0x61: // Iceman (AdLib?)
case 0x73: // Hoyle
case 0xD1: // KQ4, when riding the unicorn
// Obscure SCI commands - ignored
- return;
+ return true;
// Standard MIDI commands
case 0x01: // mod wheel
case 0x04: // foot controller
@@ -662,10 +739,10 @@ void MidiParser_SCI::processEvent(const EventInfo &info, bool fireEvents) {
case 0x4B: // voice mapping
// TODO: is any support for this needed at the MIDI parser level?
warning("Unhanded SCI MIDI command 0x%x - voice mapping (parameter %d)", info.basic.param1, info.basic.param2);
- return;
+ return true;
default:
warning("Unhandled SCI MIDI command 0x%x (parameter %d)", info.basic.param1, info.basic.param2);
- return;
+ return true;
}
}
@@ -684,7 +761,7 @@ void MidiParser_SCI::processEvent(const EventInfo &info, bool fireEvents) {
jumpToTick(_loopTick);
// Done with this event.
- return;
+ return true;
} else {
_pSnd->status = kSoundStopped;
@@ -704,7 +781,7 @@ void MidiParser_SCI::processEvent(const EventInfo &info, bool fireEvents) {
// Let parent handle the rest
- MidiParser::processEvent(info, fireEvents);
+ return MidiParser::processEvent(info, fireEvents);
}
byte MidiParser_SCI::getSongReverb() {
@@ -809,4 +886,44 @@ void MidiParser_SCI::setVolume(byte volume) {
}
}
+void MidiParser_SCI::remapChannel(int channel, int devChannel) {
+ if (_channelRemap[channel] == devChannel)
+ return;
+
+ _channelRemap[channel] = devChannel;
+
+ if (devChannel == -1)
+ return;
+
+// debug(" restoring state: channel %d on devChannel %d", channel, devChannel);
+
+ // restore state
+ ChannelState &s = _channelState[channel];
+
+ int channelVolume = _channelVolume[channel];
+ channelVolume = (channelVolume * _volume / 127) & 0xFF;
+ byte pitch1 = s._pitchWheel & 0x7F;
+ byte pitch2 = (s._pitchWheel >> 7) & 0x7F;
+
+ sendToDriver_raw(0x0040B0 | devChannel); // sustain off
+ sendToDriver_raw(0x004BB0 | devChannel | (s._voices << 16));
+ sendToDriver_raw(0x0000C0 | devChannel | (s._patch << 8));
+ sendToDriver_raw(0x0007B0 | devChannel | (channelVolume << 16));
+ sendToDriver_raw(0x000AB0 | devChannel | (s._pan << 16));
+ sendToDriver_raw(0x0001B0 | devChannel | (s._modWheel << 16));
+ sendToDriver_raw(0x0040B0 | devChannel | (s._sustain ? 0x7F0000 : 0));
+ sendToDriver_raw(0x0000E0 | devChannel | (pitch1 << 8) | (pitch2 << 16));
+
+ // CHECKME: Some SSCI version send a control change 0x4E with s._note as
+ // parameter.
+ // We need to investigate how (and if) drivers should act on this.
+ // Related: controller 0x4E is used for 'mute' in the midiparser.
+ // This could be a bug in SSCI that went unnoticed because few (or no?)
+ // drivers implement controller 0x4E
+
+ // NB: The line below is _not_ valid since s._note can be 0xFF.
+ // SSCI handles this out of band in the driver interface.
+ // sendToDriver_raw(0x004EB0 | devChannel | (s._note << 16);
+}
+
} // End of namespace Sci
diff --git a/engines/sci/sound/midiparser_sci.h b/engines/sci/sound/midiparser_sci.h
index 5784dca1ab..15c01977bd 100644
--- a/engines/sci/sound/midiparser_sci.h
+++ b/engines/sci/sound/midiparser_sci.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -79,20 +79,23 @@ public:
const byte *getMixedData() const { return _mixedData; }
byte getSongReverb();
- void tryToOwnChannels();
- void lostChannels();
void sendFromScriptToDriver(uint32 midi);
void sendToDriver(uint32 midi);
void sendToDriver(byte status, byte firstOp, byte secondOp) {
sendToDriver(status | ((uint32)firstOp << 8) | ((uint32)secondOp << 16));
}
+ void remapChannel(int channel, int devChannel);
+
protected:
void parseNextEvent(EventInfo &info);
- void processEvent(const EventInfo &info, bool fireEvents = true);
+ bool processEvent(const EventInfo &info, bool fireEvents = true);
byte *midiMixChannels();
byte *midiFilterChannels(int channelMask);
byte midiGetNextChannel(long ticker);
+ void resetStateTracking();
+ void trackState(uint32 midi);
+ void sendToDriver_raw(uint32 midi);
SciMusic *_music;
@@ -113,6 +116,19 @@ protected:
int16 _channelRemap[16];
bool _channelMuted[16];
byte _channelVolume[16];
+
+ struct ChannelState {
+ int8 _modWheel;
+ int8 _pan;
+ int8 _patch;
+ int8 _note;
+ bool _sustain;
+ int16 _pitchWheel;
+ int8 _voices;
+ };
+
+ ChannelState _channelState[16];
+
};
} // End of namespace Sci
diff --git a/engines/sci/sound/music.cpp b/engines/sci/sound/music.cpp
index 8c6d0d6431..362cca699d 100644
--- a/engines/sci/sound/music.cpp
+++ b/engines/sci/sound/music.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -33,7 +33,7 @@
#include "sci/sound/midiparser_sci.h"
#include "sci/sound/music.h"
-//#define DISABLE_REMAPPING
+//#define DEBUG_REMAP
namespace Sci {
@@ -47,6 +47,8 @@ SciMusic::SciMusic(SciVersion soundVersion, bool useDigitalSFX)
for (int i = 0; i < 16; i++) {
_usedChannel[i] = 0;
_channelRemap[i] = -1;
+ _channelMap[i]._song = 0;
+ _channelMap[i]._channel = -1;
}
_queuedCommands.reserve(1000);
@@ -140,6 +142,8 @@ void SciMusic::init() {
_driverLastChannel = _pMidiDrv->getLastChannel();
if (getSciVersion() <= SCI_VERSION_0_LATE)
_globalReverb = _pMidiDrv->getReverb(); // Init global reverb for SCI0
+
+ _currentlyPlayingSample = NULL;
}
void SciMusic::miditimerCallback(void *p) {
@@ -291,6 +295,15 @@ void SciMusic::sortPlayList() {
}
void SciMusic::soundInitSnd(MusicEntry *pSnd) {
+ // Remove all currently mapped channels of this MusicEntry first,
+ // since they will no longer be valid.
+ for (int i = 0; i < 16; ++i) {
+ if (_channelMap[i]._song == pSnd) {
+ _channelMap[i]._song = 0;
+ _channelMap[i]._channel = -1;
+ }
+ }
+
int channelFilterMask = 0;
SoundResource::Track *track = pSnd->soundRes->getTrackByType(_pMidiDrv->getPlayId());
@@ -337,6 +350,27 @@ void SciMusic::soundInitSnd(MusicEntry *pSnd) {
// Find out what channels to filter for SCI0
channelFilterMask = pSnd->soundRes->getChannelFilterMask(_pMidiDrv->getPlayId(), _pMidiDrv->hasRhythmChannel());
+ for (int i = 0; i < 16; ++i)
+ pSnd->_usedChannels[i] = 0xFF;
+ for (int i = 0; i < track->channelCount; ++i) {
+ SoundResource::Channel &chan = track->channels[i];
+
+ pSnd->_usedChannels[i] = chan.number;
+ pSnd->_chan[chan.number]._dontRemap = (chan.flags & 2);
+ pSnd->_chan[chan.number]._prio = chan.prio;
+ pSnd->_chan[chan.number]._voices = chan.poly;
+
+ // CHECKME: Some SCI versions use chan.flags & 1 for this:
+ pSnd->_chan[chan.number]._dontMap = false;
+
+ // FIXME: Most MIDI tracks use the first 10 bytes for
+ // fixed MIDI commands. SSCI skips those the first iteration,
+ // but _does_ update channel state (including volume) with
+ // them. Specifically, prio/voices, patch, volume, pan.
+ // This should probably be implemented in
+ // MidiParser_SCI::loadMusic.
+ }
+
pSnd->pMidiParser->mainThreadBegin();
// loadMusic() below calls jumpToTick.
// Disable sound looping and hold before jumpToTick is called,
@@ -358,64 +392,6 @@ void SciMusic::soundInitSnd(MusicEntry *pSnd) {
}
}
-// This one checks, if requested channel is available -> in that case give
-// caller that channel. Otherwise look for an unused one
-int16 SciMusic::tryToOwnChannel(MusicEntry *caller, int16 bestChannel) {
-#ifdef DISABLE_REMAPPING
- return bestChannel;
-#endif
-
- // Don't even try this for SCI0
- if (_soundVersion <= SCI_VERSION_0_LATE)
- return bestChannel;
- if (!_usedChannel[bestChannel]) {
- // currently unused, so give it to caller directly
- _usedChannel[bestChannel] = caller;
- _channelRemap[bestChannel] = bestChannel;
- return bestChannel;
- }
- // otherwise look for unused channel
- for (int channelNr = _driverFirstChannel; channelNr < 15; channelNr++) {
- if (channelNr == 9) // never map to channel 9 (percussion)
- continue;
- if (!_usedChannel[channelNr]) {
- _usedChannel[channelNr] = caller;
- _channelRemap[bestChannel] = channelNr;
- return channelNr;
- }
- }
- // nothing found, don't map channel at all
- // sierra did this as well, although i'm not sure if we act exactly the same way
- // maybe they removed channels from previous playing music
- return -1;
-}
-
-void SciMusic::freeChannels(MusicEntry *caller) {
- // Remove used channels
- for (int i = 0; i < 15; i++) {
- if (_usedChannel[i] == caller) {
- if (_channelRemap[i] != -1) {
- // athrxx: The original handles this differently. It seems to be checking for (and effecting) necessary
- // remaps / resets etc. more or less all the time. There are several more tables to keep track of everything.
- // I don't know whether all of that is needed and to which SCI versions it applies, though.
- // At least it is necessary to release the allocated channels inside the driver. Otherwise these channels
- // won't be available any more (e.g. after half of the KQ5 FM-Towns intro there will be no more music
- // since the driver can't pick up any more channels). The channels also have to be reset to
- // default values, since the original does the same (although in a different manny) and the music will be wrong
- // otherwise (at least KQ5 FM-Towns).
-
- sendMidiCommand(0x4000e0 | _channelRemap[i]); // Reset pitch wheel
- sendMidiCommand(0x0040b0 | _channelRemap[i]); // Release pedal
- sendMidiCommand(0x004bb0 | _channelRemap[i]); // Release assigned driver channels
- }
- _usedChannel[i] = 0;
- _channelRemap[i] = -1;
- }
- }
- // Also tell midiparser, that he lost ownership
- caller->pMidiParser->lostChannels();
-}
-
void SciMusic::soundPlay(MusicEntry *pSnd) {
_mutex.lock();
@@ -458,6 +434,17 @@ void SciMusic::soundPlay(MusicEntry *pSnd) {
if (pSnd->pStreamAud) {
if (!_pMixer->isSoundHandleActive(pSnd->hCurrentAud)) {
+ if ((_currentlyPlayingSample) && (_pMixer->isSoundHandleActive(_currentlyPlayingSample->hCurrentAud))) {
+ // Another sample is already playing, we have to stop that one
+ // SSCI is only able to play 1 sample at a time
+ // In Space Quest 5 room 250 the player is able to open the air-hatch and kill himself.
+ // In that situation the scripts are playing 2 samples at the same time and the first sample
+ // is not supposed to play.
+ // TODO: SSCI actually calls kDoAudio(play) internally, which stops other samples from being played
+ // but such a change isn't trivial, because we also handle Sound resources in here, that contain samples
+ _pMixer->stopHandle(_currentlyPlayingSample->hCurrentAud);
+ warning("kDoSound: sample already playing, old resource %d, new resource %d", _currentlyPlayingSample->resourceId, pSnd->resourceId);
+ }
// Sierra SCI ignores volume set when playing samples via kDoSound
// At least freddy pharkas/CD has a script bug that sets volume to 0
// when playing the "score" sample
@@ -475,34 +462,14 @@ void SciMusic::soundPlay(MusicEntry *pSnd) {
pSnd->pStreamAud, -1, _pMixer->kMaxChannelVolume, 0,
DisposeAfterUse::NO);
}
+ // Remember the sample, that is now playing
+ _currentlyPlayingSample = pSnd;
}
} else {
if (pSnd->pMidiParser) {
Common::StackLock lock(_mutex);
pSnd->pMidiParser->mainThreadBegin();
- if (pSnd->status != kSoundPaused) {
- // Stop any in progress music fading, as that will reset the
- // volume of the sound channels that the faded song occupies..
- // Fixes bug #3266480 and partially fixes bug #3041738.
- // CHECKME: Is this the right thing to do? Are these
- // overlapping channels not a deeper underlying problem?
- for (uint i = 0; i < playListCount; i++) {
- // Is another MIDI song being faded down? If yes, stop it
- // immediately instead
- if (_playList[i]->fadeStep < 0 && _playList[i]->pMidiParser) {
- _playList[i]->status = kSoundStopped;
- if (_soundVersion <= SCI_VERSION_0_LATE)
- _playList[i]->isQueued = false;
- _playList[i]->pMidiParser->stop();
- freeChannels(_playList[i]);
- _playList[i]->fadeStep = 0;
- _playList[i]->fadeCompleted = true;
- }
- }
- }
-
- pSnd->pMidiParser->tryToOwnChannels();
if (pSnd->status != kSoundPaused)
pSnd->pMidiParser->sendInitCommands();
pSnd->pMidiParser->setVolume(pSnd->volume);
@@ -532,6 +499,10 @@ void SciMusic::soundPlay(MusicEntry *pSnd) {
}
pSnd->status = kSoundPlaying;
+
+ _mutex.lock();
+ remapChannels();
+ _mutex.unlock();
}
void SciMusic::soundStop(MusicEntry *pSnd) {
@@ -539,8 +510,11 @@ void SciMusic::soundStop(MusicEntry *pSnd) {
pSnd->status = kSoundStopped;
if (_soundVersion <= SCI_VERSION_0_LATE)
pSnd->isQueued = false;
- if (pSnd->pStreamAud)
+ if (pSnd->pStreamAud) {
+ if (_currentlyPlayingSample == pSnd)
+ _currentlyPlayingSample = NULL;
_pMixer->stopHandle(pSnd->hCurrentAud);
+ }
if (pSnd->pMidiParser) {
Common::StackLock lock(_mutex);
@@ -549,8 +523,8 @@ void SciMusic::soundStop(MusicEntry *pSnd) {
// allNotesOff() again
if (previousStatus == kSoundPlaying)
pSnd->pMidiParser->stop();
- freeChannels(pSnd);
pSnd->pMidiParser->mainThreadEnd();
+ remapChannels();
}
pSnd->fadeStep = 0; // end fading, if fading was in progress
@@ -586,8 +560,10 @@ void SciMusic::soundSetPriority(MusicEntry *pSnd, byte prio) {
void SciMusic::soundKill(MusicEntry *pSnd) {
pSnd->status = kSoundStopped;
+ _mutex.lock();
+ remapChannels();
+
if (pSnd->pMidiParser) {
- Common::StackLock lock(_mutex);
pSnd->pMidiParser->mainThreadBegin();
pSnd->pMidiParser->unloadMusic();
pSnd->pMidiParser->mainThreadEnd();
@@ -595,7 +571,13 @@ void SciMusic::soundKill(MusicEntry *pSnd) {
pSnd->pMidiParser = NULL;
}
+ _mutex.unlock();
+
if (pSnd->pStreamAud) {
+ if (_currentlyPlayingSample == pSnd) {
+ // Forget about this sound, in case it was currently playing
+ _currentlyPlayingSample = NULL;
+ }
_pMixer->stopHandle(pSnd->hCurrentAud);
delete pSnd->pStreamAud;
pSnd->pStreamAud = NULL;
@@ -603,7 +585,7 @@ void SciMusic::soundKill(MusicEntry *pSnd) {
pSnd->pLoopStream = 0;
}
- Common::StackLock lock(_mutex);
+ _mutex.lock();
uint sz = _playList.size(), i;
// Remove sound from playlist
for (i = 0; i < sz; i++) {
@@ -614,6 +596,7 @@ void SciMusic::soundKill(MusicEntry *pSnd) {
break;
}
}
+ _mutex.unlock();
}
void SciMusic::soundPause(MusicEntry *pSnd) {
@@ -639,8 +622,8 @@ void SciMusic::soundPause(MusicEntry *pSnd) {
Common::StackLock lock(_mutex);
pSnd->pMidiParser->mainThreadBegin();
pSnd->pMidiParser->pause();
- freeChannels(pSnd);
pSnd->pMidiParser->mainThreadEnd();
+ remapChannels();
}
}
}
@@ -705,7 +688,7 @@ void SciMusic::printPlayList(Console *con) {
for (uint32 i = 0; i < _playList.size(); i++) {
MusicEntry *song = _playList[i];
- con->DebugPrintf("%d: %04x:%04x (%s), resource id: %d, status: %s, %s type\n",
+ con->debugPrintf("%d: %04x:%04x (%s), resource id: %d, status: %s, %s type\n",
i, PRINT_REG(song->soundObj),
g_sci->getEngineState()->_segMan->getObjectName(song->soundObj),
song->resourceId, musicStatus[song->status],
@@ -722,26 +705,26 @@ void SciMusic::printSongInfo(reg_t obj, Console *con) {
for (MusicList::iterator i = _playList.begin(); i != end; ++i) {
MusicEntry *song = *i;
if (song->soundObj == obj) {
- con->DebugPrintf("Resource id: %d, status: %s\n", song->resourceId, musicStatus[song->status]);
- con->DebugPrintf("dataInc: %d, hold: %d, loop: %d\n", song->dataInc, song->hold, song->loop);
- con->DebugPrintf("signal: %d, priority: %d\n", song->signal, song->priority);
- con->DebugPrintf("ticker: %d, volume: %d\n", song->ticker, song->volume);
+ con->debugPrintf("Resource id: %d, status: %s\n", song->resourceId, musicStatus[song->status]);
+ con->debugPrintf("dataInc: %d, hold: %d, loop: %d\n", song->dataInc, song->hold, song->loop);
+ con->debugPrintf("signal: %d, priority: %d\n", song->signal, song->priority);
+ con->debugPrintf("ticker: %d, volume: %d\n", song->ticker, song->volume);
if (song->pMidiParser) {
- con->DebugPrintf("Type: MIDI\n");
+ con->debugPrintf("Type: MIDI\n");
if (song->soundRes) {
SoundResource::Track *track = song->soundRes->getTrackByType(_pMidiDrv->getPlayId());
- con->DebugPrintf("Channels: %d\n", track->channelCount);
+ con->debugPrintf("Channels: %d\n", track->channelCount);
}
} else if (song->pStreamAud || song->pLoopStream) {
- con->DebugPrintf("Type: digital audio (%s), sound active: %s\n",
+ con->debugPrintf("Type: digital audio (%s), sound active: %s\n",
song->pStreamAud ? "non looping" : "looping",
_pMixer->isSoundHandleActive(song->hCurrentAud) ? "yes" : "no");
if (song->soundRes) {
- con->DebugPrintf("Sound resource information:\n");
+ con->debugPrintf("Sound resource information:\n");
SoundResource::Track *track = song->soundRes->getTrackByType(_pMidiDrv->getPlayId());
if (track && track->digitalChannelNr != -1) {
- con->DebugPrintf("Sample size: %d, sample rate: %d, channels: %d, digital channel number: %d\n",
+ con->debugPrintf("Sample size: %d, sample rate: %d, channels: %d, digital channel number: %d\n",
track->digitalSampleSize, track->digitalSampleRate, track->channelCount, track->digitalChannelNr);
}
}
@@ -751,7 +734,7 @@ void SciMusic::printSongInfo(reg_t obj, Console *con) {
}
}
- con->DebugPrintf("Song object not found in playlist");
+ con->debugPrintf("Song object not found in playlist");
}
MusicEntry::MusicEntry() {
@@ -789,6 +772,14 @@ MusicEntry::MusicEntry() {
pStreamAud = 0;
pLoopStream = 0;
pMidiParser = 0;
+
+ for (int i = 0; i < 16; ++i) {
+ _usedChannels[i] = 0xFF;
+ _chan[i]._prio = 127;
+ _chan[i]._voices = 0;
+ _chan[i]._dontRemap = false;
+ _chan[i]._mute = false;
+ }
}
MusicEntry::~MusicEntry() {
@@ -857,4 +848,453 @@ void MusicEntry::setSignal(int newSignal) {
}
}
+
+void ChannelRemapping::swap(int i, int j) {
+ DeviceChannelUsage t1;
+ int t2;
+ bool t3;
+
+ t1 = _map[i]; _map[i] = _map[j]; _map[j] = t1;
+ t2 = _prio[i]; _prio[i] = _prio[j]; _prio[j] = t2;
+ t2 = _voices[i]; _voices[i] = _voices[j]; _voices[j] = t2;
+ t3 = _dontRemap[i]; _dontRemap[i] = _dontRemap[j]; _dontRemap[j] = t3;
+}
+
+void ChannelRemapping::evict(int i) {
+ _freeVoices += _voices[i];
+
+ _map[i]._song = 0;
+ _map[i]._channel = -1;
+ _prio[i] = 0;
+ _voices[i] = 0;
+ _dontRemap[i] = false;
+}
+
+void ChannelRemapping::clear() {
+ for (int i = 0; i < 16; ++i) {
+ _map[i]._song = 0;
+ _map[i]._channel = -1;
+ _prio[i] = 0;
+ _voices[i] = 0;
+ _dontRemap[i] = false;
+ }
+}
+
+ChannelRemapping& ChannelRemapping::operator=(ChannelRemapping& other) {
+ for (int i = 0; i < 16; ++i) {
+ _map[i] = other._map[i];
+ _prio[i] = other._prio[i];
+ _voices[i] = other._voices[i];
+ _dontRemap[i] = other._dontRemap[i];
+ }
+ _freeVoices = other._freeVoices;
+
+ return *this;
+}
+
+int ChannelRemapping::lowestPrio() const {
+ int max = 0;
+ int channel = -1;
+ for (int i = 0; i < 16; ++i) {
+ if (_prio[i] > max) {
+ max = _prio[i];
+ channel = i;
+ }
+ }
+ return channel;
+}
+
+
+void SciMusic::remapChannels() {
+ if (_soundVersion <= SCI_VERSION_0_LATE)
+ return;
+
+ // NB: This function should only be called from the main thread,
+ // with _mutex locked
+
+
+ ChannelRemapping *map = determineChannelMap();
+
+ DeviceChannelUsage currentMap[16];
+
+#ifdef DEBUG_REMAP
+ debug("Remap results:");
+#endif
+
+ // Save current map, and then start from an empty map
+ for (int i = 0; i < 16; ++i) {
+ currentMap[i] = _channelMap[i];
+ _channelMap[i]._song = 0;
+ _channelMap[i]._channel = -1;
+ }
+
+ // Inform MidiParsers of any unmapped channels
+ const MusicList::iterator end = _playList.end();
+ int songIndex = -1;
+ for (MusicList::iterator i = _playList.begin(); i != end; ++i) {
+ MusicEntry *song = *i;
+ songIndex++;
+
+ if (!song || !song->pMidiParser)
+ continue;
+
+ bool channelMapped[16];
+#ifdef DEBUG_REMAP
+ bool channelUsed[16];
+#endif
+ for (int j = 0; j < 16; ++j) {
+ channelMapped[j] = false;
+#ifdef DEBUG_REMAP
+ channelUsed[j] = false;
+#endif
+ }
+
+ for (int j = 0; j < 16; ++j) {
+ if (map->_map[j]._song == song) {
+ int channel = map->_map[j]._channel;
+ assert(channel >= 0 && channel <= 0x0F);
+ channelMapped[channel] = true;
+ }
+#ifdef DEBUG_REMAP
+ if (song->_usedChannels[j] <= 0x0F)
+ channelUsed[song->_usedChannels[j]] = true;
+#endif
+ }
+
+ for (int j = 0; j < 16; ++j) {
+ if (!channelMapped[j]) {
+ song->pMidiParser->mainThreadBegin();
+ song->pMidiParser->remapChannel(j, -1);
+ song->pMidiParser->mainThreadEnd();
+#ifdef DEBUG_REMAP
+ if (channelUsed[j])
+ debug(" Unmapping song %d, channel %d", songIndex, j);
+#endif
+ }
+ }
+ }
+
+ // Now reshuffle the channels on the device.
+
+ // First, set up any dontRemap channels
+ for (int i = 0; i < 16; ++i) {
+
+ if (!map->_map[i]._song || !map->_map[i]._song->pMidiParser || !map->_dontRemap[i])
+ continue;
+
+ songIndex = -1;
+ for (MusicList::iterator iter = _playList.begin(); iter != end; ++iter) {
+ songIndex++;
+ if (map->_map[i]._song == *iter)
+ break;
+ }
+
+ _channelMap[i] = map->_map[i];
+ map->_map[i]._song = 0; // mark as done
+
+ // If this channel was not yet mapped to the device, reset it
+ if (currentMap[i] != _channelMap[i]) {
+#ifdef DEBUG_REMAP
+ debug(" Mapping (dontRemap) song %d, channel %d to device channel %d", songIndex, _channelMap[i]._channel, i);
+#endif
+ _channelMap[i]._song->pMidiParser->mainThreadBegin();
+ _channelMap[i]._song->pMidiParser->remapChannel(_channelMap[i]._channel, i);
+ _channelMap[i]._song->pMidiParser->mainThreadEnd();
+ }
+
+ }
+
+ // Next, we look for channels which were already playing.
+ // We keep those on the same device channel as before.
+ for (int i = 0; i < 16; ++i) {
+
+ if (!map->_map[i]._song)
+ continue;
+
+ songIndex = -1;
+ for (MusicList::iterator iter = _playList.begin(); iter != end; ++iter) {
+ songIndex++;
+ if (map->_map[i]._song == *iter)
+ break;
+ }
+
+
+ for (int j = 0; j < 16; ++j) {
+ if (map->_map[i] == currentMap[j]) {
+ // found it
+ _channelMap[j] = map->_map[i];
+ map->_map[i]._song = 0; // mark as done
+#ifdef DEBUG_REMAP
+ debug(" Keeping song %d, channel %d on device channel %d", songIndex, _channelMap[j]._channel, j);
+#endif
+ break;
+ }
+ }
+ }
+
+ // Then, remap the rest.
+ for (int i = 0; i < 16; ++i) {
+
+ if (!map->_map[i]._song || !map->_map[i]._song->pMidiParser)
+ continue;
+
+ songIndex = -1;
+ for (MusicList::iterator iter = _playList.begin(); iter != end; ++iter) {
+ songIndex++;
+ if (map->_map[i]._song == *iter)
+ break;
+ }
+
+ for (int j = _driverLastChannel; j >= _driverFirstChannel; --j) {
+ if (_channelMap[j]._song == 0) {
+ _channelMap[j] = map->_map[i];
+ map->_map[i]._song = 0;
+#ifdef DEBUG_REMAP
+ debug(" Mapping song %d, channel %d to device channel %d", songIndex, _channelMap[j]._channel, j);
+#endif
+ _channelMap[j]._song->pMidiParser->mainThreadBegin();
+ _channelMap[j]._song->pMidiParser->remapChannel(_channelMap[j]._channel, j);
+ _channelMap[j]._song->pMidiParser->mainThreadEnd();
+ break;
+ }
+ }
+
+ }
+
+ // And finally, stop any empty channels
+ for (int i = _driverFirstChannel; i <= _driverLastChannel; ++i) {
+ if (!_channelMap[i]._song)
+ resetDeviceChannel(i);
+ }
+
+ delete map;
+}
+
+
+ChannelRemapping *SciMusic::determineChannelMap() {
+#ifdef DEBUG_REMAP
+ debug("Remap: avail chans: %d-%d", _driverFirstChannel, _driverLastChannel);
+#endif
+
+ ChannelRemapping *map = new ChannelRemapping;
+ ChannelRemapping backupMap;
+ map->clear();
+ map->_freeVoices = _pMidiDrv->getPolyphony();
+
+ if (_playList.empty())
+ return map;
+
+ // TODO: set reverb, either from first song, or from global???
+
+ MusicList::iterator songIter;
+ int songIndex = -1;
+ for (songIter = _playList.begin(); songIter != _playList.end(); ++songIter) {
+ songIndex++;
+ MusicEntry *song = *songIter;
+ if (song->status != kSoundPlaying)
+ continue;
+
+ // If song is digital, skip.
+ // CHECKME: Is this condition correct?
+ if (!song->pMidiParser) {
+#ifdef DEBUG_REMAP
+ debug(" Song %d (%p), digital?", songIndex, (void*)song);
+#endif
+ continue;
+ }
+
+
+#ifdef DEBUG_REMAP
+ debug(" Song %d (%p), prio %d", songIndex, (void*)song, song->priority);
+#endif
+
+ // Store backup. If we fail to map this song, we will revert to this.
+ backupMap = *map;
+
+ bool songMapped = true;
+
+ for (int i = 0; i < 16; ++i) {
+ int c = song->_usedChannels[i];
+ if (c == 0xFF || c == 0xFE || c == 0x0F)
+ continue;
+ const MusicEntryChannel &channel = song->_chan[c];
+ if (channel._dontMap)
+ continue;
+ if (channel._mute)
+ continue;
+
+#ifdef DEBUG_REMAP
+ debug(" Channel %d: prio %d, %d voice%s%s", c, channel._prio, channel._voices, channel._voices == 1 ? "" : "s", channel._dontRemap ? ", dontRemap" : "" );
+#endif
+
+ DeviceChannelUsage dc = { song, c };
+
+ // our target
+ int devChannel = -1;
+
+ if (channel._dontRemap && map->_map[c]._song == 0) {
+ // unremappable channel, with channel still free
+ devChannel = c;
+ }
+
+ // try to find a free channel
+ if (devChannel == -1) {
+ for (int j = 0; j < 16; ++j) {
+ if (map->_map[j] == dc) {
+ // already mapped?! (Can this happen?)
+ devChannel = j;
+ break;
+ }
+ if (map->_map[j]._song)
+ continue;
+
+ if (j >= _driverFirstChannel && j <= _driverLastChannel)
+ devChannel = j;
+ }
+ }
+
+ int prio = channel._prio;
+ if (prio > 0) {
+ // prio > 0 means non-essential
+ prio = (16 - prio) + 16*songIndex;
+ }
+
+ if (devChannel == -1 && prio > 0) {
+ // no empty channel, but this isn't an essential channel,
+ // so we just skip it.
+#ifdef DEBUG_REMAP
+ debug(" skipping non-essential");
+#endif
+ continue;
+ }
+
+ // try to empty a previous channel if this is an essential channel
+ if (devChannel == -1) {
+ devChannel = map->lowestPrio();
+ if (devChannel != -1)
+ map->evict(devChannel);
+ }
+
+ if (devChannel == -1) {
+ // failed to map this song.
+#ifdef DEBUG_REMAP
+ debug(" no free (or lower priority) channel found");
+#endif
+ songMapped = false;
+ break;
+ }
+
+ if (map->_map[devChannel] == dc) {
+ // already mapped?! (Can this happen?)
+ continue;
+ }
+
+ int neededVoices = channel._voices;
+ // do we have enough free voices?
+ if (map->_freeVoices < neededVoices) {
+ // We only care for essential channels
+ if (prio > 0) {
+#ifdef DEBUG_REMAP
+ debug(" not enough voices; need %d, have %d. Skipping this channel.", neededVoices, map->_freeVoices);
+#endif
+ continue;
+ }
+ do {
+ int j = map->lowestPrio();
+ if (j == -1) {
+#ifdef DEBUG_REMAP
+ debug(" not enough voices; need %d, have %d", neededVoices, map->_freeVoices);
+#endif
+ // failed to free enough voices.
+ songMapped = false;
+ break;
+ }
+#ifdef DEBUG_REMAP
+ debug(" creating room for voices; evict %d", j);
+#endif
+ map->evict(j);
+ } while (map->_freeVoices < neededVoices);
+
+ if (!songMapped) {
+ // failed to map this song.
+ break;
+ }
+ }
+
+ // We have a channel and enough free voices now.
+#ifdef DEBUG_REMAP
+ debug(" trying to map to %d", devChannel);
+#endif
+
+ map->_map[devChannel] = dc;
+ map->_voices[devChannel] = neededVoices;
+ map->_prio[devChannel] = prio;
+ map->_dontRemap[devChannel] = channel._dontRemap;
+ map->_freeVoices -= neededVoices;
+
+ if (!channel._dontRemap || devChannel == c) {
+ // If this channel fits here, we're done.
+#ifdef DEBUG_REMAP
+ debug(" OK");
+#endif
+ continue;
+ }
+
+ // If this channel can't be remapped, we need to move it or fail.
+
+ if (!map->_dontRemap[c]) {
+ // Target channel can be remapped, so just swap
+ map->swap(devChannel, c);
+ continue;
+ }
+#ifdef DEBUG_REMAP
+ debug(" but %d is already dontRemap", c);
+#endif
+
+ if (prio > 0) {
+ // Channel collision, but this channel is non-essential,
+ // so drop it.
+ // TODO: Maybe we should have checked this before making room?
+ map->evict(devChannel);
+ continue;
+ }
+
+ if (map->_prio[c] > 0) {
+ // Channel collision, but the other channel is non-essential,
+ // so we take its place.
+ map->evict(c);
+ map->swap(devChannel, c);
+ continue;
+ }
+
+ // Otherwise, we have two essential channels claiming the same
+ // device channel.
+ songMapped = false;
+ break;
+ }
+
+ if (!songMapped) {
+ // We failed to map this song, so unmap all its channels.
+#ifdef DEBUG_REMAP
+ debug(" Failed song");
+#endif
+ *map = backupMap;
+ }
+ }
+
+ return map;
+}
+
+void SciMusic::resetDeviceChannel(int devChannel) {
+ // NB: This function should only be called from the main thread
+
+ assert(devChannel >= 0 && devChannel <= 0x0F);
+
+ putMidiCommandInQueue(0x0040B0 | devChannel); // sustain off
+ putMidiCommandInQueue(0x007BB0 | devChannel); // notes off
+ putMidiCommandInQueue(0x004BB0 | devChannel); // release voices
+}
+
+
+
} // End of namespace Sci
diff --git a/engines/sci/sound/music.h b/engines/sci/sound/music.h
index 40236c8445..6149bb799e 100644
--- a/engines/sci/sound/music.h
+++ b/engines/sci/sound/music.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -52,6 +52,17 @@ class SegManager;
typedef Common::Array<uint16> SignalQueue;
+
+struct MusicEntryChannel {
+ // Channel info
+ int8 _prio; // 0 = essential; lower is higher priority
+ int8 _voices;
+ bool _dontRemap;
+ bool _dontMap;
+ bool _mute;
+};
+
+
class MusicEntry : public Common::Serializable {
public:
// Do not get these directly for the sound objects!
@@ -90,6 +101,8 @@ public:
Audio::Mixer::SoundType soundType;
+ int _usedChannels[16];
+ MusicEntryChannel _chan[16];
MidiParser_SCI *pMidiParser;
// this is used for storing signals, when the current signal is not yet
@@ -114,6 +127,27 @@ public:
virtual void saveLoadWithSerializer(Common::Serializer &ser);
};
+struct DeviceChannelUsage {
+ MusicEntry *_song;
+ int _channel;
+ bool operator==(const DeviceChannelUsage& other) const { return _song == other._song && _channel == other._channel; }
+ bool operator!=(const DeviceChannelUsage& other) const { return !(*this == other); }
+};
+
+struct ChannelRemapping {
+ DeviceChannelUsage _map[16];
+ int _prio[16];
+ int _voices[16];
+ bool _dontRemap[16];
+ int _freeVoices;
+
+ void clear();
+ void swap(int i, int j);
+ void evict(int i);
+ ChannelRemapping& operator=(ChannelRemapping& other);
+ int lowestPrio() const;
+};
+
typedef Common::Array<MusicEntry *> MusicList;
typedef Common::Array<uint32> MidiCommandQueue;
@@ -198,9 +232,6 @@ public:
// where a deadlock can occur
Common::Mutex _mutex;
- int16 tryToOwnChannel(MusicEntry *caller, int16 bestChannel);
- void freeChannels(MusicEntry *caller);
-
protected:
void sortPlayList();
@@ -213,6 +244,11 @@ protected:
// If true and a sound has a digital track, the sound from the AdLib track is played
bool _useDigitalSFX;
+ // remapping:
+ void remapChannels();
+ ChannelRemapping *determineChannelMap();
+ void resetDeviceChannel(int devChannel);
+
private:
MusicList _playList;
bool _soundOn;
@@ -221,11 +257,15 @@ private:
int8 _channelRemap[16];
int8 _globalReverb;
+ DeviceChannelUsage _channelMap[16];
+
MidiCommandQueue _queuedCommands;
MusicType _musicType;
int _driverFirstChannel;
int _driverLastChannel;
+
+ MusicEntry *_currentlyPlayingSample;
};
} // End of namespace Sci
diff --git a/engines/sci/sound/soundcmd.cpp b/engines/sci/sound/soundcmd.cpp
index e36c5705ab..73e0a23a6a 100644
--- a/engines/sci/sound/soundcmd.cpp
+++ b/engines/sci/sound/soundcmd.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -61,7 +61,7 @@ reg_t SoundCommandParser::kDoSoundInit(int argc, reg_t *argv, reg_t acc) {
}
int SoundCommandParser::getSoundResourceId(reg_t obj) {
- int resourceId = obj.getSegment() ? readSelectorValue(_segMan, obj, SELECTOR(number)) : -1;
+ int resourceId = obj.getSegment() ? (int)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()) {
// Check if the alternate MIDI song actually exists...
@@ -508,9 +508,19 @@ void SoundCommandParser::processUpdateCues(reg_t obj) {
// fireworks).
// It is also needed in other games, e.g. LSL6 when talking to the
// receptionist (bug #3192166).
- // CHECKME: At least kq5cd/win and kq6 set signal to 0xFE here, but
- // kq5cd/dos does not set signal at all. Needs more investigation.
- writeSelectorValue(_segMan, obj, SELECTOR(signal), SIGNAL_OFFSET);
+ // TODO: More thorougly check the different SCI version:
+ // * SCI1late sets signal to 0xFE here. (With signal 0xFF
+ // duplicate music plays in LauraBow2CD - bug #6462)
+ // SCI1middle LSL1 1.000.510 does not have the 0xFE;
+ // SCI1late CastleDrBrain demo 1.000.005 does have the 0xFE.
+ // * Other SCI1 games seem to rely on processStopSound to set the signal
+ // * Need to check SCI0 behaviour.
+ uint16 sig;
+ if (getSciVersion() >= SCI_VERSION_1_LATE)
+ sig = 0xFFFE;
+ else
+ sig = SIGNAL_OFFSET;
+ writeSelectorValue(_segMan, obj, SELECTOR(signal), sig);
if (_soundVersion <= SCI_VERSION_0_LATE) {
processStopSound(obj, false);
} else {
diff --git a/engines/sci/sound/soundcmd.h b/engines/sci/sound/soundcmd.h
index d76f969c7d..4effda68e4 100644
--- a/engines/sci/sound/soundcmd.h
+++ b/engines/sci/sound/soundcmd.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/sci/util.cpp b/engines/sci/util.cpp
index 4f09bb7a55..3a9ed9ca69 100644
--- a/engines/sci/util.cpp
+++ b/engines/sci/util.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/sci/util.h b/engines/sci/util.h
index 0da5063a69..378030939c 100644
--- a/engines/sci/util.h
+++ b/engines/sci/util.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/sci/video/robot_decoder.cpp b/engines/sci/video/robot_decoder.cpp
index a567ece2ea..a2795d21f9 100644
--- a/engines/sci/video/robot_decoder.cpp
+++ b/engines/sci/video/robot_decoder.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -116,6 +116,10 @@ bool RobotDecoder::load(GuiResourceId id) {
if (g_sci->getGameId() == GID_RAMA && id == 1003)
return false;
+ // Robots for the options in the RAMA menu
+ if (g_sci->getGameId() == GID_RAMA && (id >= 1004 && id <= 1009))
+ return false;
+
// TODO: The robot video in the Lighthouse demo gets stuck
if (g_sci->getGameId() == GID_LIGHTHOUSE && id == 16)
return false;
diff --git a/engines/sci/video/robot_decoder.h b/engines/sci/video/robot_decoder.h
index 437954f7fb..4faea5008a 100644
--- a/engines/sci/video/robot_decoder.h
+++ b/engines/sci/video/robot_decoder.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/sci/video/seq_decoder.cpp b/engines/sci/video/seq_decoder.cpp
index 54603ec1f1..f523a42ca5 100644
--- a/engines/sci/video/seq_decoder.cpp
+++ b/engines/sci/video/seq_decoder.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/sci/video/seq_decoder.h b/engines/sci/video/seq_decoder.h
index 890f349feb..e141f8dee0 100644
--- a/engines/sci/video/seq_decoder.h
+++ b/engines/sci/video/seq_decoder.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/scumm/actor.cpp b/engines/scumm/actor.cpp
index 4e14473921..116a953b0b 100644
--- a/engines/scumm/actor.cpp
+++ b/engines/scumm/actor.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/scumm/actor.h b/engines/scumm/actor.h
index a733fdb4ed..46dc7d0295 100644
--- a/engines/scumm/actor.h
+++ b/engines/scumm/actor.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/scumm/actor_he.h b/engines/scumm/actor_he.h
index 24b632d00e..9bc244945c 100644
--- a/engines/scumm/actor_he.h
+++ b/engines/scumm/actor_he.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/scumm/akos.cpp b/engines/scumm/akos.cpp
index 481c4af432..6d80315ccb 100644
--- a/engines/scumm/akos.cpp
+++ b/engines/scumm/akos.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/scumm/akos.h b/engines/scumm/akos.h
index bd42aedcbd..017989424b 100644
--- a/engines/scumm/akos.h
+++ b/engines/scumm/akos.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/scumm/base-costume.cpp b/engines/scumm/base-costume.cpp
index e1a8688bb9..024520f14b 100644
--- a/engines/scumm/base-costume.cpp
+++ b/engines/scumm/base-costume.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/scumm/base-costume.h b/engines/scumm/base-costume.h
index 652655c24e..1e633bdec6 100644
--- a/engines/scumm/base-costume.h
+++ b/engines/scumm/base-costume.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/scumm/bomp.cpp b/engines/scumm/bomp.cpp
index 5b87f3042c..a0c4e67e4b 100644
--- a/engines/scumm/bomp.cpp
+++ b/engines/scumm/bomp.cpp
@@ -8,11 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/scumm/bomp.h b/engines/scumm/bomp.h
index b2d042daae..eb19cdf1d0 100644
--- a/engines/scumm/bomp.h
+++ b/engines/scumm/bomp.h
@@ -8,11 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/scumm/boxes.cpp b/engines/scumm/boxes.cpp
index f6d2a18f38..70c8f2e032 100644
--- a/engines/scumm/boxes.cpp
+++ b/engines/scumm/boxes.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/scumm/boxes.h b/engines/scumm/boxes.h
index 345d6a9d36..4fd1947848 100644
--- a/engines/scumm/boxes.h
+++ b/engines/scumm/boxes.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/scumm/camera.cpp b/engines/scumm/camera.cpp
index 4b48acfbdb..799fdd7547 100644
--- a/engines/scumm/camera.cpp
+++ b/engines/scumm/camera.cpp
@@ -8,11 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/scumm/charset-fontdata.cpp b/engines/scumm/charset-fontdata.cpp
index 16193f5503..3a0cd15637 100644
--- a/engines/scumm/charset-fontdata.cpp
+++ b/engines/scumm/charset-fontdata.cpp
@@ -17,6 +17,7 @@
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
*/
diff --git a/engines/scumm/charset.cpp b/engines/scumm/charset.cpp
index dd79aff2da..185ebbce6e 100644
--- a/engines/scumm/charset.cpp
+++ b/engines/scumm/charset.cpp
@@ -17,6 +17,7 @@
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
*/
diff --git a/engines/scumm/charset.h b/engines/scumm/charset.h
index 1c1df51921..5a9977b7d6 100644
--- a/engines/scumm/charset.h
+++ b/engines/scumm/charset.h
@@ -17,6 +17,7 @@
* You should have received a copy of the GNU General Public 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_CHARSET_H
diff --git a/engines/scumm/configure.engine b/engines/scumm/configure.engine
new file mode 100644
index 0000000000..e1de788061
--- /dev/null
+++ b/engines/scumm/configure.engine
@@ -0,0 +1,5 @@
+# This file is included from the main "configure" script
+# add_engine [name] [desc] [build-by-default] [subengines] [base games] [deps]
+add_engine scumm "SCUMM" yes "scumm_7_8 he" "v0-v6 games"
+add_engine scumm_7_8 "v7 & v8 games" yes
+add_engine he "HE71+ games" yes
diff --git a/engines/scumm/costume.cpp b/engines/scumm/costume.cpp
index 85c60f9a40..7470f13fa2 100644
--- a/engines/scumm/costume.cpp
+++ b/engines/scumm/costume.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/scumm/costume.h b/engines/scumm/costume.h
index 4a21692ddb..8e4fd41740 100644
--- a/engines/scumm/costume.h
+++ b/engines/scumm/costume.h
@@ -17,6 +17,7 @@
* You should have received a copy of the GNU General Public 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_COSTUME_H
diff --git a/engines/scumm/cursor.cpp b/engines/scumm/cursor.cpp
index 721644b554..6445d257f6 100644
--- a/engines/scumm/cursor.cpp
+++ b/engines/scumm/cursor.cpp
@@ -8,11 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/scumm/debugger.cpp b/engines/scumm/debugger.cpp
index 872293f821..2b718b2cfe 100644
--- a/engines/scumm/debugger.cpp
+++ b/engines/scumm/debugger.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -58,52 +58,63 @@ ScummDebugger::ScummDebugger(ScummEngine *s)
_vm = s;
// Register variables
- DVar_Register("scumm_speed", &_vm->_fastMode, DVAR_BYTE, 0);
- DVar_Register("scumm_room", &_vm->_currentRoom, DVAR_BYTE, 0);
- DVar_Register("scumm_roomresource", &_vm->_roomResource, DVAR_INT, 0);
- DVar_Register("scumm_vars", &_vm->_scummVars, DVAR_INTARRAY, _vm->_numVariables);
+ registerVar("scumm_speed", &_vm->_fastMode);
+ registerVar("scumm_room", &_vm->_currentRoom);
+ registerVar("scumm_roomresource", &_vm->_roomResource);
+ registerVar("scumm_vars", &_vm->_scummVars, _vm->_numVariables);
// Register commands
- DCmd_Register("continue", WRAP_METHOD(ScummDebugger, Cmd_Exit));
- DCmd_Register("restart", WRAP_METHOD(ScummDebugger, Cmd_Restart));
-
- DCmd_Register("actor", WRAP_METHOD(ScummDebugger, Cmd_Actor));
- DCmd_Register("actors", WRAP_METHOD(ScummDebugger, Cmd_PrintActor));
- DCmd_Register("box", WRAP_METHOD(ScummDebugger, Cmd_PrintBox));
- DCmd_Register("matrix", WRAP_METHOD(ScummDebugger, Cmd_PrintBoxMatrix));
- DCmd_Register("camera", WRAP_METHOD(ScummDebugger, Cmd_Camera));
- DCmd_Register("room", WRAP_METHOD(ScummDebugger, Cmd_Room));
- DCmd_Register("objects", WRAP_METHOD(ScummDebugger, Cmd_PrintObjects));
- DCmd_Register("object", WRAP_METHOD(ScummDebugger, Cmd_Object));
- DCmd_Register("script", WRAP_METHOD(ScummDebugger, Cmd_Script));
- DCmd_Register("scr", WRAP_METHOD(ScummDebugger, Cmd_Script));
- DCmd_Register("scripts", WRAP_METHOD(ScummDebugger, Cmd_PrintScript));
- DCmd_Register("importres", WRAP_METHOD(ScummDebugger, Cmd_ImportRes));
+ registerCmd("continue", WRAP_METHOD(ScummDebugger, cmdExit));
+ registerCmd("restart", WRAP_METHOD(ScummDebugger, Cmd_Restart));
+
+ registerCmd("actor", WRAP_METHOD(ScummDebugger, Cmd_Actor));
+ registerCmd("actors", WRAP_METHOD(ScummDebugger, Cmd_PrintActor));
+ registerCmd("box", WRAP_METHOD(ScummDebugger, Cmd_PrintBox));
+ registerCmd("matrix", WRAP_METHOD(ScummDebugger, Cmd_PrintBoxMatrix));
+ registerCmd("camera", WRAP_METHOD(ScummDebugger, Cmd_Camera));
+ registerCmd("room", WRAP_METHOD(ScummDebugger, Cmd_Room));
+ registerCmd("objects", WRAP_METHOD(ScummDebugger, Cmd_PrintObjects));
+ registerCmd("object", WRAP_METHOD(ScummDebugger, Cmd_Object));
+ registerCmd("script", WRAP_METHOD(ScummDebugger, Cmd_Script));
+ registerCmd("scr", WRAP_METHOD(ScummDebugger, Cmd_Script));
+ registerCmd("scripts", WRAP_METHOD(ScummDebugger, Cmd_PrintScript));
+ registerCmd("importres", WRAP_METHOD(ScummDebugger, Cmd_ImportRes));
if (_vm->_game.id == GID_LOOM)
- DCmd_Register("drafts", WRAP_METHOD(ScummDebugger, Cmd_PrintDraft));
+ registerCmd("drafts", WRAP_METHOD(ScummDebugger, Cmd_PrintDraft));
if (_vm->_game.id == GID_MONKEY && _vm->_game.platform == Common::kPlatformSegaCD)
- DCmd_Register("passcode", WRAP_METHOD(ScummDebugger, Cmd_Passcode));
+ registerCmd("passcode", WRAP_METHOD(ScummDebugger, Cmd_Passcode));
- DCmd_Register("loadgame", WRAP_METHOD(ScummDebugger, Cmd_LoadGame));
- DCmd_Register("savegame", WRAP_METHOD(ScummDebugger, Cmd_SaveGame));
+ registerCmd("loadgame", WRAP_METHOD(ScummDebugger, Cmd_LoadGame));
+ registerCmd("savegame", WRAP_METHOD(ScummDebugger, Cmd_SaveGame));
- DCmd_Register("level", WRAP_METHOD(ScummDebugger, Cmd_DebugLevel));
- DCmd_Register("debug", WRAP_METHOD(ScummDebugger, Cmd_Debug));
+ registerCmd("debug", WRAP_METHOD(ScummDebugger, Cmd_Debug));
- DCmd_Register("show", WRAP_METHOD(ScummDebugger, Cmd_Show));
- DCmd_Register("hide", WRAP_METHOD(ScummDebugger, Cmd_Hide));
+ registerCmd("show", WRAP_METHOD(ScummDebugger, Cmd_Show));
+ registerCmd("hide", WRAP_METHOD(ScummDebugger, Cmd_Hide));
- DCmd_Register("imuse", WRAP_METHOD(ScummDebugger, Cmd_IMuse));
+ registerCmd("imuse", WRAP_METHOD(ScummDebugger, Cmd_IMuse));
- DCmd_Register("resetcursors", WRAP_METHOD(ScummDebugger, Cmd_ResetCursors));
+ registerCmd("resetcursors", WRAP_METHOD(ScummDebugger, Cmd_ResetCursors));
}
ScummDebugger::~ScummDebugger() {
// we need this destructor, even if it is empty, for __SYMBIAN32__
}
+void ScummDebugger::preEnter() {
+}
+
+void ScummDebugger::postEnter() {
+ // Runtime debug level change is dealt with by the base class "debuglevel" command
+ // but need to ensure that the _debugMode parameter is updated in sync.
+ _vm->_debugMode = (gDebugLevel >= 0);
+ // Boot params often need debugging switched on to work
+ if (_vm->_bootParam)
+ _vm->_debugMode = true;
+}
+
///////////////////////////////////////////////////
// Now the fun stuff:
@@ -117,51 +128,51 @@ bool ScummDebugger::Cmd_Restart(int argc, const char **argv) {
bool ScummDebugger::Cmd_IMuse(int argc, const char **argv) {
if (!_vm->_imuse && !_vm->_musicEngine) {
- DebugPrintf("No iMuse engine is active.\n");
+ debugPrintf("No iMuse engine is active.\n");
return true;
}
if (argc > 1) {
if (!strcmp(argv[1], "panic")) {
_vm->_musicEngine->stopAllSounds();
- DebugPrintf("AAAIIIEEEEEE!\n");
- DebugPrintf("Shutting down all music tracks\n");
+ debugPrintf("AAAIIIEEEEEE!\n");
+ debugPrintf("Shutting down all music tracks\n");
return true;
} else if (!strcmp(argv[1], "play")) {
if (argc > 2 && (!strcmp(argv[2], "random") || atoi(argv[2]) != 0)) {
int sound = atoi(argv[2]);
if (!strcmp(argv[2], "random")) {
- DebugPrintf("Selecting from %d songs...\n", _vm->_numSounds);
+ debugPrintf("Selecting from %d songs...\n", _vm->_numSounds);
sound = _vm->_rnd.getRandomNumber(_vm->_numSounds);
}
_vm->ensureResourceLoaded(rtSound, sound);
_vm->_musicEngine->startSound(sound);
- DebugPrintf("Attempted to start music %d.\n", sound);
+ debugPrintf("Attempted to start music %d.\n", sound);
} else {
- DebugPrintf("Specify a music resource # from 1-255.\n");
+ debugPrintf("Specify a music resource # from 1-255.\n");
}
return true;
} else if (!strcmp(argv[1], "stop")) {
if (argc > 2 && (!strcmp(argv[2], "all") || atoi(argv[2]) != 0)) {
if (!strcmp(argv[2], "all")) {
_vm->_musicEngine->stopAllSounds();
- DebugPrintf("Shutting down all music tracks.\n");
+ debugPrintf("Shutting down all music tracks.\n");
} else {
_vm->_musicEngine->stopSound(atoi(argv[2]));
- DebugPrintf("Attempted to stop music %d.\n", atoi(argv[2]));
+ debugPrintf("Attempted to stop music %d.\n", atoi(argv[2]));
}
} else {
- DebugPrintf("Specify a music resource # or \"all\".\n");
+ debugPrintf("Specify a music resource # or \"all\".\n");
}
return true;
}
}
- DebugPrintf("Available iMuse commands:\n");
- DebugPrintf(" panic - Stop all music tracks\n");
- DebugPrintf(" play # - Play a music resource\n");
- DebugPrintf(" stop # - Stop a music resource\n");
+ debugPrintf("Available iMuse commands:\n");
+ debugPrintf(" panic - Stop all music tracks\n");
+ debugPrintf(" play # - Play a music resource\n");
+ debugPrintf(" stop # - Stop a music resource\n");
return true;
}
@@ -174,7 +185,7 @@ bool ScummDebugger::Cmd_Room(int argc, const char **argv) {
_vm->_fullRedraw = true;
return false;
} else {
- DebugPrintf("Current room: %d [%d] - use 'room <roomnum>' to switch\n", _vm->_currentRoom, _vm->_roomResource);
+ debugPrintf("Current room: %d [%d] - use 'room <roomnum>' to switch\n", _vm->_currentRoom, _vm->_roomResource);
return true;
}
}
@@ -189,7 +200,7 @@ bool ScummDebugger::Cmd_LoadGame(int argc, const char **argv) {
return false;
}
- DebugPrintf("Syntax: loadgame <slotnum>\n");
+ debugPrintf("Syntax: loadgame <slotnum>\n");
return true;
}
@@ -199,7 +210,7 @@ bool ScummDebugger::Cmd_SaveGame(int argc, const char **argv) {
_vm->requestSave(slot, argv[2]);
} else
- DebugPrintf("Syntax: savegame <slotnum> <name>\n");
+ debugPrintf("Syntax: savegame <slotnum> <name>\n");
return true;
}
@@ -207,18 +218,18 @@ bool ScummDebugger::Cmd_SaveGame(int argc, const char **argv) {
bool ScummDebugger::Cmd_Show(int argc, const char **argv) {
if (argc != 2) {
- DebugPrintf("Syntax: show <parameter>\n");
+ debugPrintf("Syntax: show <parameter>\n");
return true;
}
if (!strcmp(argv[1], "hex")) {
_vm->_hexdumpScripts = true;
- DebugPrintf("Script hex dumping on\n");
+ debugPrintf("Script hex dumping on\n");
} else if (!strncmp(argv[1], "sta", 3)) {
_vm->_showStack = 1;
- DebugPrintf("Stack tracing on\n");
+ debugPrintf("Stack tracing on\n");
} else {
- DebugPrintf("Unknown show parameter '%s'\nParameters are 'hex' for hex dumping and 'sta' for stack tracing\n", argv[1]);
+ debugPrintf("Unknown show parameter '%s'\nParameters are 'hex' for hex dumping and 'sta' for stack tracing\n", argv[1]);
}
return true;
}
@@ -226,18 +237,18 @@ bool ScummDebugger::Cmd_Show(int argc, const char **argv) {
bool ScummDebugger::Cmd_Hide(int argc, const char **argv) {
if (argc != 2) {
- DebugPrintf("Syntax: hide <parameter>\n");
+ debugPrintf("Syntax: hide <parameter>\n");
return true;
}
if (!strcmp(argv[1], "hex")) {
_vm->_hexdumpScripts = false;
- DebugPrintf("Script hex dumping off\n");
+ debugPrintf("Script hex dumping off\n");
} else if (!strncmp(argv[1], "sta", 3)) {
_vm->_showStack = 0;
- DebugPrintf("Stack tracing off\n");
+ debugPrintf("Stack tracing off\n");
} else {
- DebugPrintf("Unknown hide parameter '%s'\nParameters are 'hex' to turn off hex dumping and 'sta' to turn off stack tracing\n", argv[1]);
+ debugPrintf("Unknown hide parameter '%s'\nParameters are 'hex' to turn off hex dumping and 'sta' to turn off stack tracing\n", argv[1]);
}
return true;
}
@@ -246,7 +257,7 @@ bool ScummDebugger::Cmd_Script(int argc, const char** argv) {
int scriptnum;
if (argc < 2) {
- DebugPrintf("Syntax: script <scriptnum> <command>\n");
+ debugPrintf("Syntax: script <scriptnum> <command>\n");
return true;
}
@@ -254,7 +265,7 @@ bool ScummDebugger::Cmd_Script(int argc, const char** argv) {
// FIXME: what is the max range on these?
// if (scriptnum >= _vm->_numScripts) {
- // DebugPrintf("Script number %d is out of range (range: 1 - %d)\n", scriptnum, _vm->_numScripts);
+ // debugPrintf("Script number %d is out of range (range: 1 - %d)\n", scriptnum, _vm->_numScripts);
// return true;
//}
@@ -264,7 +275,7 @@ bool ScummDebugger::Cmd_Script(int argc, const char** argv) {
_vm->runScript(scriptnum, 0, 0, 0);
return false;
} else {
- DebugPrintf("Unknown script command '%s'\nUse <kill/stop | run/start> as command\n", argv[2]);
+ debugPrintf("Unknown script command '%s'\nUse <kill/stop | run/start> as command\n", argv[2]);
}
return true;
@@ -276,7 +287,7 @@ bool ScummDebugger::Cmd_ImportRes(int argc, const char** argv) {
int resnum;
if (argc != 4) {
- DebugPrintf("Syntax: importres <restype> <filename> <resnum>\n");
+ debugPrintf("Syntax: importres <restype> <filename> <resnum>\n");
return true;
}
@@ -286,7 +297,7 @@ bool ScummDebugger::Cmd_ImportRes(int argc, const char** argv) {
if (!strncmp(argv[1], "scr", 3)) {
file.open(argv[2]);
if (file.isOpen() == false) {
- DebugPrintf("Could not open file %s\n", argv[2]);
+ debugPrintf("Could not open file %s\n", argv[2]);
return true;
}
if (_vm->_game.features & GF_SMALL_HEADER) {
@@ -307,25 +318,25 @@ bool ScummDebugger::Cmd_ImportRes(int argc, const char** argv) {
file.read(_vm->_res->createResource(rtScript, resnum, size), size);
} else
- DebugPrintf("Unknown importres type '%s'\n", argv[1]);
+ debugPrintf("Unknown importres type '%s'\n", argv[1]);
return true;
}
bool ScummDebugger::Cmd_PrintScript(int argc, const char **argv) {
int i;
ScriptSlot *ss = _vm->vm.slot;
- DebugPrintf("+-----------------------------------+\n");
- DebugPrintf("|# | num|offst|sta|typ|fr|rec|fc|cut|\n");
- DebugPrintf("+--+----+-----+---+---+--+---+--+---+\n");
+ debugPrintf("+-----------------------------------+\n");
+ debugPrintf("|# | num|offst|sta|typ|fr|rec|fc|cut|\n");
+ debugPrintf("+--+----+-----+---+---+--+---+--+---+\n");
for (i = 0; i < NUM_SCRIPT_SLOT; i++, ss++) {
if (ss->number) {
- DebugPrintf("|%2d|%4d|%05x|%3d|%3d|%2d|%3d|%2d|%3d|\n",
+ debugPrintf("|%2d|%4d|%05x|%3d|%3d|%2d|%3d|%2d|%3d|\n",
i, ss->number, ss->offs, ss->status, ss->where,
ss->freezeResistant, ss->recursive,
ss->freezeCount, ss->cutsceneOverride);
}
}
- DebugPrintf("+-----------------------------------+\n");
+ debugPrintf("+-----------------------------------+\n");
return true;
}
@@ -336,13 +347,13 @@ bool ScummDebugger::Cmd_Actor(int argc, const char **argv) {
int value = 0, value2 = 0;
if (argc < 3) {
- DebugPrintf("Syntax: actor <actornum> <command> <parameter>\n");
+ debugPrintf("Syntax: actor <actornum> <command> <parameter>\n");
return true;
}
actnum = atoi(argv[1]);
if (actnum >= _vm->_numActors) {
- DebugPrintf("Actor %d is out of range (range: 1 - %d)\n", actnum, _vm->_numActors);
+ debugPrintf("Actor %d is out of range (range: 1 - %d)\n", actnum, _vm->_numActors);
return true;
}
@@ -354,43 +365,43 @@ bool ScummDebugger::Cmd_Actor(int argc, const char **argv) {
if (!strcmp(argv[2], "animvar")) {
a->setAnimVar(value, value2);
- DebugPrintf("Actor[%d].animVar[%d] = %d\n", actnum, value, a->getAnimVar(value));
+ debugPrintf("Actor[%d].animVar[%d] = %d\n", actnum, value, a->getAnimVar(value));
} else if (!strcmp(argv[2], "anim")) {
a->animateActor(value);
- DebugPrintf("Actor[%d].animateActor(%d)\n", actnum, value);
+ debugPrintf("Actor[%d].animateActor(%d)\n", actnum, value);
} else if (!strcmp(argv[2], "ignoreboxes")) {
a->_ignoreBoxes = (value > 0);
- DebugPrintf("Actor[%d].ignoreBoxes = %d\n", actnum, a->_ignoreBoxes);
+ debugPrintf("Actor[%d].ignoreBoxes = %d\n", actnum, a->_ignoreBoxes);
} else if (!strcmp(argv[2], "x")) {
a->putActor(value, a->getRealPos().y);
- DebugPrintf("Actor[%d].x = %d\n", actnum, a->getRealPos().x);
+ debugPrintf("Actor[%d].x = %d\n", actnum, a->getRealPos().x);
_vm->_fullRedraw = true;
} else if (!strcmp(argv[2], "y")) {
a->putActor(a->getRealPos().x, value);
- DebugPrintf("Actor[%d].y = %d\n", actnum, a->getRealPos().y);
+ debugPrintf("Actor[%d].y = %d\n", actnum, a->getRealPos().y);
_vm->_fullRedraw = true;
} else if (!strcmp(argv[2], "_elevation")) {
a->setElevation(value);
- DebugPrintf("Actor[%d]._elevation = %d\n", actnum, a->getElevation());
+ debugPrintf("Actor[%d]._elevation = %d\n", actnum, a->getElevation());
_vm->_fullRedraw = true;
} else if (!strcmp(argv[2], "costume")) {
if (value >= (int)_vm->_res->_types[rtCostume].size())
- DebugPrintf("Costume not changed as %d exceeds max of %d\n", value, _vm->_res->_types[rtCostume].size());
+ debugPrintf("Costume not changed as %d exceeds max of %d\n", value, _vm->_res->_types[rtCostume].size());
else {
a->setActorCostume(value);
_vm->_fullRedraw = true;
- DebugPrintf("Actor[%d].costume = %d\n", actnum, a->_costume);
+ debugPrintf("Actor[%d].costume = %d\n", actnum, a->_costume);
}
} else if (!strcmp(argv[2], "name")) {
- DebugPrintf("Name of actor %d: %s\n", actnum,
+ debugPrintf("Name of actor %d: %s\n", actnum,
_vm->getObjOrActorName(_vm->actorToObj(actnum)));
} else if (!strcmp(argv[2], "condmask")) {
if (argc > 3) {
a->_heCondMask = value;
}
- DebugPrintf("Actor[%d]._heCondMask = 0x%X\n", actnum, a->_heCondMask);
+ debugPrintf("Actor[%d]._heCondMask = 0x%X\n", actnum, a->_heCondMask);
} else {
- DebugPrintf("Unknown actor command '%s'\nUse <ignoreboxes |costume> as command\n", argv[2]);
+ debugPrintf("Unknown actor command '%s'\nUse <ignoreboxes |costume> as command\n", argv[2]);
}
return true;
@@ -400,40 +411,40 @@ bool ScummDebugger::Cmd_PrintActor(int argc, const char **argv) {
int i;
Actor *a;
- DebugPrintf("+---------------------------------------------------------------+\n");
- DebugPrintf("|# | x | y | w | h |elev|cos|box|mov| zp|frm|scl|dir| cls |\n");
- DebugPrintf("+--+----+----+---+---+----+---+---+---+---+---+---+---+---------+\n");
+ debugPrintf("+---------------------------------------------------------------+\n");
+ debugPrintf("|# | x | y | w | h |elev|cos|box|mov| zp|frm|scl|dir| cls |\n");
+ debugPrintf("+--+----+----+---+---+----+---+---+---+---+---+---+---+---------+\n");
for (i = 1; i < _vm->_numActors; i++) {
a = _vm->_actors[i];
if (a->_visible)
- DebugPrintf("|%2d|%4d|%4d|%3d|%3d|%4d|%3d|%3d|%3d|%3d|%3d|%3d|%3d|$%08x|\n",
+ debugPrintf("|%2d|%4d|%4d|%3d|%3d|%4d|%3d|%3d|%3d|%3d|%3d|%3d|%3d|$%08x|\n",
a->_number, a->getRealPos().x, a->getRealPos().y, a->_width, a->_bottom - a->_top,
a->getElevation(),
a->_costume, a->_walkbox, a->_moving, a->_forceClip, a->_frame,
a->_scalex, a->getFacing(), _vm->_classData[a->_number]);
}
- DebugPrintf("\n");
+ debugPrintf("\n");
return true;
}
bool ScummDebugger::Cmd_PrintObjects(int argc, const char **argv) {
int i;
ObjectData *o;
- DebugPrintf("Objects in current room\n");
- DebugPrintf("+---------------------------------+------------+\n");
- DebugPrintf("|num | x | y |width|height|state|fl| cls |\n");
- DebugPrintf("+----+----+----+-----+------+-----+--+---------+\n");
+ debugPrintf("Objects in current room\n");
+ debugPrintf("+---------------------------------+------------+\n");
+ debugPrintf("|num | x | y |width|height|state|fl| cls |\n");
+ debugPrintf("+----+----+----+-----+------+-----+--+---------+\n");
for (i = 1; i < _vm->_numLocalObjects; i++) {
o = &(_vm->_objs[i]);
if (o->obj_nr == 0)
continue;
int classData = (_vm->_game.version != 0 ? _vm->_classData[o->obj_nr] : 0);
- DebugPrintf("|%4d|%4d|%4d|%5d|%6d|%5d|%2d|$%08x|\n",
+ debugPrintf("|%4d|%4d|%4d|%5d|%6d|%5d|%2d|$%08x|\n",
o->obj_nr, o->x_pos, o->y_pos, o->width, o->height, o->state,
o->fl_object_index, classData);
}
- DebugPrintf("\n");
+ debugPrintf("\n");
return true;
}
@@ -443,13 +454,13 @@ bool ScummDebugger::Cmd_Object(int argc, const char **argv) {
int obj;
if (argc < 3) {
- DebugPrintf("Syntax: object <objectnum> <command> <parameter>\n");
+ debugPrintf("Syntax: object <objectnum> <command> <parameter>\n");
return true;
}
obj = atoi(argv[1]);
if (_vm->_game.version != 0 && obj >= _vm->_numGlobalObjects) {
- DebugPrintf("Object %d is out of range (range: 1 - %d)\n", obj, _vm->_numGlobalObjects);
+ debugPrintf("Object %d is out of range (range: 1 - %d)\n", obj, _vm->_numGlobalObjects);
return true;
}
@@ -479,12 +490,12 @@ bool ScummDebugger::Cmd_Object(int argc, const char **argv) {
//is BgNeedsRedraw enough?
_vm->_bgNeedsRedraw = true;
} else {
- DebugPrintf("State of object %d: %d\n", obj, _vm->getState(obj));
+ debugPrintf("State of object %d: %d\n", obj, _vm->getState(obj));
}
} else if (!strcmp(argv[2], "name")) {
- DebugPrintf("Name of object %d: %s\n", obj, _vm->getObjOrActorName(obj));
+ debugPrintf("Name of object %d: %s\n", obj, _vm->getObjOrActorName(obj));
} else {
- DebugPrintf("Unknown object command '%s'\nUse <pickup | state | name> as command\n", argv[2]);
+ debugPrintf("Unknown object command '%s'\nUse <pickup | state | name> as command\n", argv[2]);
}
return true;
@@ -495,9 +506,9 @@ bool ScummDebugger::Cmd_Debug(int argc, const char **argv) {
// No parameters given: Print out a list of all channels and their status
if (argc <= 1) {
- DebugPrintf("Available debug channels:\n");
+ debugPrintf("Available debug channels:\n");
for (Common::DebugManager::DebugChannelList::const_iterator i = lvls.begin(); i != lvls.end(); ++i) {
- DebugPrintf("%c%s - %s (%s)\n", i->enabled ? '+' : ' ',
+ debugPrintf("%c%s - %s (%s)\n", i->enabled ? '+' : ' ',
i->name.c_str(), i->description.c_str(),
i->enabled ? "enabled" : "disabled");
}
@@ -513,39 +524,18 @@ bool ScummDebugger::Cmd_Debug(int argc, const char **argv) {
}
if (result) {
- DebugPrintf("%s %s\n", (argv[1][0] == '+') ? "Enabled" : "Disabled", argv[1] + 1);
+ debugPrintf("%s %s\n", (argv[1][0] == '+') ? "Enabled" : "Disabled", argv[1] + 1);
} else {
- DebugPrintf("Usage: debug [+CHANNEL|-CHANNEL]\n");
- DebugPrintf("Enables or disables the given debug channel.\n");
- DebugPrintf("When used without parameters, lists all available debug channels and their status.\n");
- }
-
- return true;
-}
-
-bool ScummDebugger::Cmd_DebugLevel(int argc, const char **argv) {
- if (argc == 1) {
- if (_vm->_debugMode == false)
- DebugPrintf("Debugging is not enabled at this time\n");
- else
- DebugPrintf("Debugging is currently set at level %d\n", gDebugLevel);
- } else { // set level
- gDebugLevel = atoi(argv[1]);
- if (gDebugLevel >= 0) {
- _vm->_debugMode = true;
- DebugPrintf("Debug level set to level %d\n", gDebugLevel);
- } else if (gDebugLevel < 0) {
- _vm->_debugMode = false;
- DebugPrintf("Debugging is now disabled\n");
- } else
- DebugPrintf("Not a valid debug level\n");
+ debugPrintf("Usage: debug [+CHANNEL|-CHANNEL]\n");
+ debugPrintf("Enables or disables the given debug channel.\n");
+ debugPrintf("When used without parameters, lists all available debug channels and their status.\n");
}
return true;
}
bool ScummDebugger::Cmd_Camera(int argc, const char **argv) {
- DebugPrintf("Camera: cur (%d,%d) - dest (%d,%d) - accel (%d,%d) -- last (%d,%d)\n",
+ debugPrintf("Camera: cur (%d,%d) - dest (%d,%d) - accel (%d,%d) -- last (%d,%d)\n",
_vm->camera._cur.x, _vm->camera._cur.y, _vm->camera._dest.x, _vm->camera._dest.y,
_vm->camera._accel.x, _vm->camera._accel.y, _vm->camera._last.x, _vm->camera._last.y);
@@ -560,7 +550,7 @@ bool ScummDebugger::Cmd_PrintBox(int argc, const char **argv) {
printBox(atoi(argv[i]));
} else {
num = _vm->getNumBoxes();
- DebugPrintf("\nWalk boxes:\n");
+ debugPrintf("\nWalk boxes:\n");
for (i = 0; i < num; i++)
printBox(i);
}
@@ -572,29 +562,29 @@ bool ScummDebugger::Cmd_PrintBoxMatrix(int argc, const char **argv) {
int num = _vm->getNumBoxes();
int i, j;
- DebugPrintf("Walk matrix:\n");
+ debugPrintf("Walk matrix:\n");
if (_vm->_game.version <= 2)
boxm += num;
for (i = 0; i < num; i++) {
- DebugPrintf("%d: ", i);
+ debugPrintf("%d: ", i);
if (_vm->_game.version <= 2) {
for (j = 0; j < num; j++)
- DebugPrintf("[%d] ", *boxm++);
+ debugPrintf("[%d] ", *boxm++);
} else {
while (*boxm != 0xFF) {
- DebugPrintf("[%d-%d=>%d] ", boxm[0], boxm[1], boxm[2]);
+ debugPrintf("[%d-%d=>%d] ", boxm[0], boxm[1], boxm[2]);
boxm += 3;
}
boxm++;
}
- DebugPrintf("\n");
+ debugPrintf("\n");
}
return true;
}
void ScummDebugger::printBox(int box) {
if (box < 0 || box >= _vm->getNumBoxes()) {
- DebugPrintf("%d is not a valid box!\n", box);
+ debugPrintf("%d is not a valid box!\n", box);
return;
}
BoxCoords coords;
@@ -605,7 +595,7 @@ void ScummDebugger::printBox(int box) {
coords = _vm->getBoxCoordinates(box);
// Print out coords, flags, zbuffer mask
- DebugPrintf("%d: [%d x %d] [%d x %d] [%d x %d] [%d x %d], flags=0x%02x, mask=%d, scale=%d\n",
+ debugPrintf("%d: [%d x %d] [%d x %d] [%d x %d] [%d x %d], flags=0x%02x, mask=%d, scale=%d\n",
box,
coords.ul.x, coords.ul.y, coords.ll.x, coords.ll.y,
coords.ur.x, coords.ur.y, coords.lr.x, coords.lr.y,
@@ -746,7 +736,7 @@ bool ScummDebugger::Cmd_PrintDraft(int argc, const char **argv) {
int i, base, draft;
if (_vm->_game.id != GID_LOOM) {
- DebugPrintf("Command only works with Loom/LoomCD\n");
+ debugPrintf("Command only works with Loom/LoomCD\n");
return true;
}
@@ -797,7 +787,7 @@ bool ScummDebugger::Cmd_PrintDraft(int argc, const char **argv) {
// the distaff, but I don't know if that's a safe
// thing to do.
- DebugPrintf("Learned all drafts and notes.\n");
+ debugPrintf("Learned all drafts and notes.\n");
return true;
}
}
@@ -806,7 +796,7 @@ bool ScummDebugger::Cmd_PrintDraft(int argc, const char **argv) {
for (i = 0; i < 16; i++) {
draft = _vm->_scummVars[base + i * 2];
- DebugPrintf("%d %-13s %c%c%c%c %c%c\n",
+ debugPrintf("%d %-13s %c%c%c%c %c%c\n",
base + 2 * i,
names[i],
notes[draft & 0x0007],
@@ -830,7 +820,7 @@ bool ScummDebugger::Cmd_Passcode(int argc, const char **argv) {
_vm->runScript(61, 0, 0, args);
if (_vm->_bootParam != _vm->_scummVars[411]){
- DebugPrintf("Invalid Passcode\n");
+ debugPrintf("Invalid Passcode\n");
return true;
}
@@ -838,7 +828,7 @@ bool ScummDebugger::Cmd_Passcode(int argc, const char **argv) {
detach();
} else {
- DebugPrintf("Current Passcode is %d \nUse 'passcode <SEGA CD Passcode>'\n",_vm->_scummVars[411]);
+ debugPrintf("Current Passcode is %d \nUse 'passcode <SEGA CD Passcode>'\n",_vm->_scummVars[411]);
return true;
}
return false;
diff --git a/engines/scumm/debugger.h b/engines/scumm/debugger.h
index b60a1a2f03..657f6be286 100644
--- a/engines/scumm/debugger.h
+++ b/engines/scumm/debugger.h
@@ -17,6 +17,7 @@
* You should have received a copy of the GNU General Public 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_DEBUGGER_H
@@ -36,6 +37,9 @@ public:
private:
ScummEngine *_vm;
+ virtual void preEnter();
+ virtual void postEnter();
+
// Commands
bool Cmd_Room(int argc, const char **argv);
bool Cmd_LoadGame(int argc, const char **argv);
@@ -57,7 +61,6 @@ private:
bool Cmd_Passcode(int argc, const char **argv);
bool Cmd_Debug(int argc, const char **argv);
- bool Cmd_DebugLevel(int argc, const char **argv);
bool Cmd_Show(int argc, const char **argv);
bool Cmd_Hide(int argc, const char **argv);
diff --git a/engines/scumm/detection.cpp b/engines/scumm/detection.cpp
index 170ca0993c..b7a25808a5 100644
--- a/engines/scumm/detection.cpp
+++ b/engines/scumm/detection.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -1223,8 +1223,8 @@ const char *ScummMetaEngine::getOriginalCopyright() const {
}
namespace Scumm {
- extern bool getSavegameName(Common::InSaveFile *in, Common::String &desc, int heversion);
-}
+bool getSavegameName(Common::InSaveFile *in, Common::String &desc, int heversion);
+} // End of namespace Scumm
int ScummMetaEngine::getMaximumSaveSlot() const { return 99; }
@@ -1262,25 +1262,21 @@ void ScummMetaEngine::removeSaveState(const char *target, int slot) const {
}
SaveStateDescriptor ScummMetaEngine::querySaveMetaInfos(const char *target, int slot) const {
- Common::String filename = ScummEngine::makeSavegameName(target, slot, false);
- Common::InSaveFile *in = g_system->getSavefileManager()->openForLoading(filename);
-
- if (!in)
- return SaveStateDescriptor();
-
Common::String saveDesc;
- Scumm::getSavegameName(in, saveDesc, 0); // FIXME: heversion?!?
- delete in;
+ Graphics::Surface *thumbnail = nullptr;
+ SaveStateMetaInfos infos;
+ memset(&infos, 0, sizeof(infos));
+ SaveStateMetaInfos *infoPtr = &infos;
- // TODO: Cleanup
- Graphics::Surface *thumbnail = ScummEngine::loadThumbnailFromSlot(target, slot);
+ // FIXME: heversion?!?
+ if (!ScummEngine::querySaveMetaInfos(target, slot, 0, saveDesc, thumbnail, infoPtr)) {
+ return SaveStateDescriptor();
+ }
SaveStateDescriptor desc(slot, saveDesc);
desc.setThumbnail(thumbnail);
- SaveStateMetaInfos infos;
- memset(&infos, 0, sizeof(infos));
- if (ScummEngine::loadInfosFromSlot(target, slot, &infos)) {
+ if (infoPtr) {
int day = (infos.date >> 24) & 0xFF;
int month = (infos.date >> 16) & 0xFF;
int year = infos.date & 0xFFFF;
diff --git a/engines/scumm/detection.h b/engines/scumm/detection.h
index 5ed6b5aab0..f714812a9c 100644
--- a/engines/scumm/detection.h
+++ b/engines/scumm/detection.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/scumm/detection_tables.h b/engines/scumm/detection_tables.h
index 6717ea9b06..c876af1256 100644
--- a/engines/scumm/detection_tables.h
+++ b/engines/scumm/detection_tables.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/scumm/dialogs.cpp b/engines/scumm/dialogs.cpp
index 945c5b6611..8321daa583 100644
--- a/engines/scumm/dialogs.cpp
+++ b/engines/scumm/dialogs.cpp
@@ -17,6 +17,7 @@
* You should have received a copy of the GNU General Public 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"
diff --git a/engines/scumm/dialogs.h b/engines/scumm/dialogs.h
index 7977f123ed..08222dd8cd 100644
--- a/engines/scumm/dialogs.h
+++ b/engines/scumm/dialogs.h
@@ -17,6 +17,7 @@
* You should have received a copy of the GNU General Public 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_DIALOGS_H
diff --git a/engines/scumm/gfx.cpp b/engines/scumm/gfx.cpp
index 1bb4a28f65..1d1b6b4f13 100644
--- a/engines/scumm/gfx.cpp
+++ b/engines/scumm/gfx.cpp
@@ -8,11 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -379,7 +380,7 @@ void ScummEngine::initVirtScreen(VirtScreenNumber slot, int top, int width, int
int size;
assert(height >= 0);
- assert(slot >= 0 && slot < 4);
+ assert((int)slot >= 0 && (int)slot < 4);
if (_game.version >= 7) {
if (slot == kMainVirtScreen && (_roomHeight != 0))
diff --git a/engines/scumm/gfx.h b/engines/scumm/gfx.h
index 0d81698c50..42844daf30 100644
--- a/engines/scumm/gfx.h
+++ b/engines/scumm/gfx.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/scumm/gfxARM.s b/engines/scumm/gfxARM.s
index 9238888831..5cfe8ba0a4 100644
--- a/engines/scumm/gfxARM.s
+++ b/engines/scumm/gfxARM.s
@@ -41,6 +41,7 @@
@ In addition, we assume that text, src and dst are all word (4 byte)
@ aligned. This is the same assumption that the old 'inline' version
@ made.
+ .align 2
_asmDrawStripToScreen:
@ r0 = height
@ r1 = width
@@ -118,6 +119,7 @@ end:
@ In addition, we assume that src and dst are both word (4 byte)
@ aligned. This is the same assumption that the old 'inline' version
@ made.
+ .align 2
_asmCopy8Col:
@ r0 = dst
@ r1 = dstPitch
diff --git a/engines/scumm/gfx_towns.cpp b/engines/scumm/gfx_towns.cpp
index 0aed181afd..6a558c97b4 100644
--- a/engines/scumm/gfx_towns.cpp
+++ b/engines/scumm/gfx_towns.cpp
@@ -8,11 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/scumm/he/animation_he.cpp b/engines/scumm/he/animation_he.cpp
index d01b456c8b..8483a8a402 100644
--- a/engines/scumm/he/animation_he.cpp
+++ b/engines/scumm/he/animation_he.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -57,7 +57,7 @@ int MoviePlayer::getImageNum() {
return _wizResNum;
}
-int MoviePlayer::load(const char *filename, int flags, int image) {
+int MoviePlayer::load(const Common::String &filename, int flags, int image) {
if (_video->isVideoLoaded())
_video->close();
@@ -65,13 +65,13 @@ int MoviePlayer::load(const char *filename, int flags, int image) {
_video->setDefaultHighColorFormat(g_system->getScreenFormat());
if (!_video->loadFile(filename)) {
- warning("Failed to load video file %s", filename);
+ warning("Failed to load video file %s", filename.c_str());
return -1;
}
_video->start();
- debug(1, "Playing video %s", filename);
+ debug(1, "Playing video %s", filename.c_str());
if (flags & 2)
_vm->_wiz->createWizEmptyImage(image, 0, 0, _video->getWidth(), _video->getHeight());
diff --git a/engines/scumm/he/animation_he.h b/engines/scumm/he/animation_he.h
index e17c1b9a39..677a4b4247 100644
--- a/engines/scumm/he/animation_he.h
+++ b/engines/scumm/he/animation_he.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -25,8 +25,12 @@
#include "audio/mixer.h"
+namespace Common {
+class String;
+}
+
namespace Video {
- class VideoDecoder;
+class VideoDecoder;
}
namespace Scumm {
@@ -39,7 +43,7 @@ public:
~MoviePlayer();
int getImageNum();
- int load(const char *filename, int flags, int image = 0);
+ int load(const Common::String &filename, int flags, int image = 0);
void copyFrameToBuffer(byte *dst, int dstType, uint x, uint y, uint pitch);
void handleNextFrame();
diff --git a/engines/scumm/he/cup_player_he.cpp b/engines/scumm/he/cup_player_he.cpp
index 84562c12d5..c409863804 100644
--- a/engines/scumm/he/cup_player_he.cpp
+++ b/engines/scumm/he/cup_player_he.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/scumm/he/cup_player_he.h b/engines/scumm/he/cup_player_he.h
index 15bc6b46ba..16c8a37f2f 100644
--- a/engines/scumm/he/cup_player_he.h
+++ b/engines/scumm/he/cup_player_he.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/scumm/he/floodfill_he.cpp b/engines/scumm/he/floodfill_he.cpp
index f9d53c6b12..279a8c63c4 100644
--- a/engines/scumm/he/floodfill_he.cpp
+++ b/engines/scumm/he/floodfill_he.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/scumm/he/floodfill_he.h b/engines/scumm/he/floodfill_he.h
index 3f62cc9b81..286bcce4f5 100644
--- a/engines/scumm/he/floodfill_he.h
+++ b/engines/scumm/he/floodfill_he.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/scumm/he/intern_he.h b/engines/scumm/he/intern_he.h
index a674288775..370f54c1d8 100644
--- a/engines/scumm/he/intern_he.h
+++ b/engines/scumm/he/intern_he.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -81,10 +81,23 @@ protected:
int virtScreenSave(byte *dst, int x1, int y1, int x2, int y2);
void virtScreenLoad(int resIdx, int x1, int y1, int x2, int y2);
- int convertFilePath(byte *dst, int dstSize);
virtual void decodeParseString(int a, int b);
void swapObjects(int object1, int object2);
+ Common::String convertFilePath(const byte *src);
+ Common::String convertSavePath(const byte *src);
+ Common::String convertSavePathOld(const byte *src);
+
+ Common::SeekableReadStream *openFileForReading(const byte *fileName);
+ Common::SeekableReadStream *openSaveFileForReading(const byte *fileName);
+ Common::WriteStream *openSaveFileForWriting(const byte *fileName);
+ Common::WriteStream *openSaveFileForAppending(const byte *fileName);
+ void deleteSaveFile(const byte *fileName);
+ void renameSaveFile(const byte *from, const byte *to);
+
+ Common::SeekableReadStream *openSaveFileForReading(int slot, bool compat, Common::String &fileName);
+ Common::WriteStream *openSaveFileForWriting(int slot, bool compat, Common::String &fileName);
+
/* HE version 60 script opcodes */
void o60_setState();
void o60_roomOps();
diff --git a/engines/scumm/he/logic/baseball2001.cpp b/engines/scumm/he/logic/baseball2001.cpp
index 342423fd79..5cbc96a21d 100644
--- a/engines/scumm/he/logic/baseball2001.cpp
+++ b/engines/scumm/he/logic/baseball2001.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/scumm/he/logic/basketball.cpp b/engines/scumm/he/logic/basketball.cpp
index a4da8e05dc..bac15ea24a 100644
--- a/engines/scumm/he/logic/basketball.cpp
+++ b/engines/scumm/he/logic/basketball.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/scumm/he/logic/football.cpp b/engines/scumm/he/logic/football.cpp
index ea990ca86b..bde0c38484 100644
--- a/engines/scumm/he/logic/football.cpp
+++ b/engines/scumm/he/logic/football.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -449,25 +449,26 @@ int LogicHEfootball2002::initScreenTranslations() {
int LogicHEfootball2002::getPlaybookFiles(int32 *args) {
// Get the pattern and then skip over the directory prefix ("*\" or "*:")
- Common::String pattern = (const char *)_vm->getStringAddress(args[0] & ~0x33539000) + 2;
+ // Also prepend the target name
+ Common::String targetName = _vm->getTargetName();
+ Common::String basePattern = ((const char *)_vm->getStringAddress(args[0] & ~0x33539000) + 2);
+ Common::String pattern = targetName + '-' + basePattern;
// Prepare a buffer to hold the file names
- char buffer[1000];
- buffer[0] = 0;
+ Common::String output;
// Get the list of file names that match the pattern and iterate over it
Common::StringArray fileList = _vm->getSaveFileManager()->listSavefiles(pattern);
- for (uint32 i = 0; i < fileList.size() && strlen(buffer) < 970; i++) {
+ for (uint32 i = 0; i < fileList.size(); i++) {
// Isolate the base part of the filename and concatenate it to our buffer
- Common::String fileName = Common::String(fileList[i].c_str(), fileList[i].size() - (pattern.size() - 1));
- strcat(buffer, fileName.c_str());
- strcat(buffer, ">"); // names separated by '>'
+ Common::String fileName(fileList[i].c_str() + targetName.size() + 1, fileList[i].size() - (basePattern.size() - 1) - (targetName.size() + 1));
+ output += fileName + '>'; // names separated by '>'
}
// Now store the result in an array
- int array = _vm->setupStringArray(strlen(buffer));
- strcpy((char *)_vm->getStringAddress(array), buffer);
+ int array = _vm->setupStringArray(output.size());
+ strcpy((char *)_vm->getStringAddress(array), output.c_str());
// And store the array index in variable 108
writeScummVar(108, array);
diff --git a/engines/scumm/he/logic/funshop.cpp b/engines/scumm/he/logic/funshop.cpp
index 8993fedad2..50759cf89e 100644
--- a/engines/scumm/he/logic/funshop.cpp
+++ b/engines/scumm/he/logic/funshop.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/scumm/he/logic/moonbase.cpp b/engines/scumm/he/logic/moonbase.cpp
index 5b4618a4ad..29a0dde7a2 100644
--- a/engines/scumm/he/logic/moonbase.cpp
+++ b/engines/scumm/he/logic/moonbase.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/scumm/he/logic/puttrace.cpp b/engines/scumm/he/logic/puttrace.cpp
index ea4397cd97..1c3317b131 100644
--- a/engines/scumm/he/logic/puttrace.cpp
+++ b/engines/scumm/he/logic/puttrace.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/scumm/he/logic/soccer.cpp b/engines/scumm/he/logic/soccer.cpp
index 2b29f93173..0efe482b5a 100644
--- a/engines/scumm/he/logic/soccer.cpp
+++ b/engines/scumm/he/logic/soccer.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -566,7 +566,7 @@ int LogicHEsoccer::addCollisionTreeChild(int depth, int index, int parent) {
}
int LogicHEsoccer::op_1013(int32 a1, int32 a2, int32 a3) {
- // Initialises _collisionTree, a tree used for collision detection.
+ // Initializes _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];
diff --git a/engines/scumm/he/logic_he.cpp b/engines/scumm/he/logic_he.cpp
index 0f9454ba28..366cd3be26 100644
--- a/engines/scumm/he/logic_he.cpp
+++ b/engines/scumm/he/logic_he.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/scumm/he/logic_he.h b/engines/scumm/he/logic_he.h
index 93c0569a4f..cd547f1616 100644
--- a/engines/scumm/he/logic_he.h
+++ b/engines/scumm/he/logic_he.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/scumm/he/palette_he.cpp b/engines/scumm/he/palette_he.cpp
index 44ba841644..89b9b9bca4 100644
--- a/engines/scumm/he/palette_he.cpp
+++ b/engines/scumm/he/palette_he.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/scumm/he/resource_he.cpp b/engines/scumm/he/resource_he.cpp
index ce4b2239d2..ddde352686 100644
--- a/engines/scumm/he/resource_he.cpp
+++ b/engines/scumm/he/resource_he.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/scumm/he/resource_he.h b/engines/scumm/he/resource_he.h
index 6996ce81eb..49175db8d4 100644
--- a/engines/scumm/he/resource_he.h
+++ b/engines/scumm/he/resource_he.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/scumm/he/script_v100he.cpp b/engines/scumm/he/script_v100he.cpp
index 987f74957c..afc6633ef6 100644
--- a/engines/scumm/he/script_v100he.cpp
+++ b/engines/scumm/he/script_v100he.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -1642,7 +1642,7 @@ void ScummEngine_v100he::o100_roomOps() {
copyScriptString((byte *)buffer, sizeof(buffer));
- _saveLoadFileName = (char *)buffer + convertFilePath(buffer, sizeof(buffer));
+ _saveLoadFileName = (char *)buffer;
debug(1, "o100_roomOps: case 137: filename %s", _saveLoadFileName.c_str());
_saveLoadFlag = pop();
@@ -2263,11 +2263,10 @@ void ScummEngine_v100he::o100_videoOps() {
if (_videoParams.flags == 0)
_videoParams.flags = 4;
- const char *filename = (char *)_videoParams.filename + convertFilePath(_videoParams.filename, sizeof(_videoParams.filename));
if (_videoParams.flags == 2) {
- VAR(119) = _moviePlay->load(filename, _videoParams.flags, _videoParams.wizResNum);
+ VAR(119) = _moviePlay->load(convertFilePath(_videoParams.filename), _videoParams.flags, _videoParams.wizResNum);
} else {
- VAR(119) = _moviePlay->load(filename, _videoParams.flags);
+ VAR(119) = _moviePlay->load(convertFilePath(_videoParams.filename), _videoParams.flags);
}
} else if (_videoParams.status == 19) {
// Stop video
diff --git a/engines/scumm/he/script_v60he.cpp b/engines/scumm/he/script_v60he.cpp
index bbd8725904..0c92fbcac3 100644
--- a/engines/scumm/he/script_v60he.cpp
+++ b/engines/scumm/he/script_v60he.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -90,59 +90,214 @@ void ScummEngine_v60he::setupOpcodes() {
_opcodes[0xed].setProc(0, 0);
}
-int ScummEngine_v60he::convertFilePath(byte *dst, int dstSize) {
- debug(1, "convertFilePath: original filePath is %s", dst);
+Common::String ScummEngine_v60he::convertFilePath(const byte *src) {
+ debug(2, "convertFilePath in: '%s'", (const char *)src);
+
+ int srcSize = resStrLen(src);
+ int start = 0;
+
+ if (srcSize > 2) {
+ if (src[0] == ':') { // Game Data Path (Macintosh)
+ // The default game data path is set to ':' by ScummVM
+ start = 1;
+ } else if (src[0] == '.' && src[1] == '\\') { // Game Data Path (Windows)
+ // The default game data path is set to '.\\' by ScummVM
+ start = 2;
+ } else if (src[0] == '*' && src[1] == '\\') { // Save Game Path (Windows HE72 - HE100)
+ // The default save game path is set to '*\\' by ScummVM
+ start = 2;
+ } else if (src[0] == '*' && src[1] == ':') { // Save Game Path (Macintosh HE72 - HE100)
+ // The default save game path is set to '*:' by ScummVM
+ start = 2;
+ } else if (src[0] == 'c' && src[1] == ':') { // Save Game Path (HE60 - HE71)
+ // The default save path is game path (DOS) or 'c:\\hegames\\' (Windows)
+ for (start = srcSize; start != 0; start--)
+ if (src[start - 1] == '\\')
+ break;
+ } else if (src[0] == 'u' && src[1] == 's') { // Save Game Path (Moonbase Commander)
+ // The default save path is 'user\\'
+ start = 5;
+ }
+ }
+
+ Common::String dst;
+
+ for (int i = start; i < srcSize; i++) {
+ // Convert path separators
+ if (src[i] == '\\' || src[i] == ':')
+ dst += '/';
+ else
+ dst += src[i];
+ }
- int len = resStrLen(dst);
+ // Sanity check
+ if (dst.lastChar() == '/')
+ dst.deleteLastChar();
- // Switch all \ to / for portablity
- for (int i = 0; i < len; i++)
- if (dst[i] == '\\')
- dst[i] = '/';
+ debug(2, "convertFilePath out: '%s'", dst.c_str());
- if (_game.platform == Common::kPlatformMacintosh) {
- // Remove : prefix in HE71 games
- if (dst[0] == ':') {
- len -= 1;
- memmove(dst, dst + 1, len);
- dst[len] = 0;
+ return dst;
+}
+
+Common::String ScummEngine_v60he::convertSavePath(const byte *src) {
+ debug(2, "convertSavePath in: '%s'", (const char *)src);
+
+ Common::String filePath = convertFilePath(src);
+
+ // Strip us down to only the file
+ for (int32 i = filePath.size() - 1; i >= 0; i--) {
+ if (filePath[i] == '/') {
+ filePath = Common::String(filePath.c_str() + i + 1);
+ break;
}
+ }
+
+ // Prepend the target name
+ filePath = _targetName + '-' + filePath;
- // Switch all : to / for portablity
- for (int i = 0; i < len; i++) {
- if (dst[i] == ':')
- dst[i] = '/';
+ debug(2, "convertSavePath out: '%s'", filePath.c_str());
+
+ return filePath;
+}
+
+Common::String ScummEngine_v60he::convertSavePathOld(const byte *src) {
+ // This is provided solely for loading older saved games.
+ // No new saves should go through this function.
+
+ int srcSize = resStrLen(src);
+
+ // Old hacky target name insertion
+ // (This breaks the soccer and football games)
+ if (src[srcSize - 3] == 's' && src[srcSize - 2] == 'g')
+ return _targetName + ".sg" + (char)src[srcSize - 1];
+
+ if (src[0] == 'u' && src[1] == 's') {
+ // Save Game Path (Moonbase Commander)
+ // The default save path is 'user/'
+ return (const char *)src + 5;
+ } else if (src[0] == '*' && (src[1] == '\\' || src[1] == ':')) {
+ // Save Game Path (HE72 - HE100)
+ // The default save game path is set to '*\\' by ScummVM for Windows
+ // and '*:' for Macintosh
+ return (const char *)src + 2;
+ } else if (src[0] == 'c' && src[1] == ':') {
+ // The default save path is game path (DOS) or 'c:\\hegames\\' (Windows)
+ for (int i = srcSize; i > 0; i--)
+ if (src[i] == '\\')
+ return (const char *)src + i + 1;
+ }
+
+ // Can't reach here
+ return "";
+}
+
+Common::SeekableReadStream *ScummEngine_v60he::openFileForReading(const byte *fileName) {
+ Common::SeekableReadStream *saveFile = openSaveFileForReading(fileName);
+
+ if (saveFile)
+ return saveFile;
+
+ return SearchMan.createReadStreamForMember(convertFilePath(fileName));
+}
+
+Common::SeekableReadStream *ScummEngine_v60he::openSaveFileForReading(const byte *fileName) {
+ Common::SeekableReadStream *file = _saveFileMan->openForLoading(convertSavePath(fileName));
+
+ if (file)
+ return file;
+
+ return _saveFileMan->openForLoading(convertSavePathOld(fileName));
+}
+
+Common::WriteStream *ScummEngine_v60he::openSaveFileForWriting(const byte *fileName) {
+ return _saveFileMan->openForSaving(convertSavePath(fileName));
+}
+
+void ScummEngine_v60he::deleteSaveFile(const byte *fileName) {
+ Common::String convertedName = convertSavePath(fileName);
+
+ if (!_saveFileMan->listSavefiles(convertedName).empty()) {
+ _saveFileMan->removeSavefile(convertedName);
+ return;
+ }
+
+ convertedName = convertSavePathOld(fileName);
+
+ if (!_saveFileMan->listSavefiles(convertedName).empty())
+ _saveFileMan->removeSavefile(convertedName);
+}
+
+void ScummEngine_v60he::renameSaveFile(const byte *from, const byte *to) {
+ Common::String toName = convertSavePath(to);
+
+ if (_saveFileMan->renameSavefile(convertSavePathOld(from), toName))
+ return;
+
+ _saveFileMan->renameSavefile(convertSavePath(from), toName);
+}
+
+Common::WriteStream *ScummEngine_v60he::openSaveFileForAppending(const byte *fileName) {
+ Common::SeekableReadStream *initialFile = openSaveFileForReading(fileName);
+ byte *initialData = 0;
+ uint32 initialDataSize = 0;
+
+ if (initialFile) {
+ initialDataSize = initialFile->size();
+
+ if (initialDataSize > 0) {
+ initialData = new byte[initialDataSize];
+ initialFile->read(initialData, initialDataSize);
}
+
+ delete initialFile;
+ }
+
+ Common::WriteStream *output = openSaveFileForWriting(fileName);
+
+ if (!output) {
+ delete[] initialData;
+ return nullptr;
+ }
+
+ if (initialData) {
+ output->write(initialData, initialDataSize);
+ delete[] initialData;
}
- // Strip path
- int r = 0;
- if (dst[len - 3] == 's' && dst[len - 2] == 'g') { // Save Game File
- // Change filename prefix to target name, for save game files.
- const char c = dst[len - 1];
- snprintf((char *)dst, dstSize, "%s.sg%c", _targetName.c_str(), c);
- } else if (dst[0] == '.' && dst[1] == '/') { // Game Data Path
- // The default game data path is set to './' by ScummVM
- r = 2;
- } else if (dst[0] == '*' && dst[1] == '/') { // Save Game Path (Windows HE72 - HE100)
- // The default save game path is set to '*/' by ScummVM
- r = 2;
- } else if (dst[0] == '*' && dst[1] == ':') { // Save Game Path (Macintosh HE72 - HE100)
- // The default save game path is set to ':/' by ScummVM
- r = 2;
- } else if (dst[0] == 'c' && dst[1] == ':') { // Save Game Path (HE60 - HE71)
- // The default save path is game path (DOS) or 'c:/hegames/' (Windows)
- for (r = len; r != 0; r--) {
- if (dst[r - 1] == '/')
- break;
+ return output;
+}
+
+Common::SeekableReadStream *ScummEngine_v60he::openSaveFileForReading(int slot, bool compat, Common::String &fileName) {
+ if (slot == 255) {
+ // HACK: Allow custom filenames for save game system in HE Games
+ fileName = convertSavePath((const byte *)_saveLoadFileName.c_str());
+
+ Common::SeekableReadStream *stream = _saveFileMan->openForLoading(fileName);
+ if (stream)
+ return stream;
+
+ Common::String oldFileName = convertSavePathOld((const byte *)_saveLoadFileName.c_str());
+ stream = _saveFileMan->openForLoading(oldFileName);
+
+ if (stream) {
+ fileName = oldFileName;
+ return stream;
}
- } else if (dst[0] == 'u' && dst[1] == 's') { // Save Game Path (Moonbase Commander)
- // The default save path is 'user/'
- r = 5;
+
+ return 0;
+ }
+
+ return ScummEngine::openSaveFileForReading(slot, compat, fileName);
+}
+
+Common::WriteStream *ScummEngine_v60he::openSaveFileForWriting(int slot, bool compat, Common::String &fileName) {
+ if (slot == 255) {
+ // HACK: Allow custom filenames for save game system in HE Games
+ fileName = convertSavePath((const byte *)_saveLoadFileName.c_str());
+ return _saveFileMan->openForSaving(fileName);
}
- debug(1, "convertFilePath: converted filePath is %s", dst + r);
- return r;
+ return ScummEngine::openSaveFileForWriting(slot, compat, fileName);
}
void ScummEngine_v60he::o60_setState() {
@@ -284,7 +439,7 @@ void ScummEngine_v60he::o60_roomOps() {
len = resStrLen(_scriptPointer);
_scriptPointer += len + 1;
- _saveLoadFileName = (char *)buffer + convertFilePath(buffer, sizeof(buffer));
+ _saveLoadFileName = (char *)buffer;
debug(1, "o60_roomOps: case 221: filename %s", _saveLoadFileName.c_str());
_saveLoadFlag = pop();
@@ -692,14 +847,12 @@ void virtScreenSavePackByte(vsPackCtx *ctx, uint8 *&dst, int len, uint8 b) {
void ScummEngine_v60he::o60_openFile() {
int mode, len, slot, i;
byte buffer[100];
- const char *filename;
convertMessageToString(_scriptPointer, buffer, sizeof(buffer));
len = resStrLen(_scriptPointer);
_scriptPointer += len + 1;
- filename = (char *)buffer + convertFilePath(buffer, sizeof(buffer));
- debug(1, "Final filename to %s", filename);
+ debug(1, "Trying to open file '%s'", (char *)buffer);
mode = pop();
slot = -1;
@@ -713,14 +866,10 @@ void ScummEngine_v60he::o60_openFile() {
if (slot != -1) {
switch (mode) {
case 1:
- // TODO / FIXME: Consider using listSavefiles to avoid unneccessary openForLoading calls
- _hInFileTable[slot] = _saveFileMan->openForLoading(filename);
- if (_hInFileTable[slot] == 0) {
- _hInFileTable[slot] = SearchMan.createReadStreamForMember(filename);
- }
+ _hInFileTable[slot] = openFileForReading(buffer);
break;
case 2:
- _hOutFileTable[slot] = _saveFileMan->openForSaving(filename);
+ _hOutFileTable[slot] = openSaveFileForWriting(buffer);
break;
default:
error("o60_openFile(): wrong open file mode %d", mode);
@@ -750,25 +899,19 @@ void ScummEngine_v60he::o60_closeFile() {
void ScummEngine_v60he::o60_deleteFile() {
int len;
byte buffer[100];
- const char *filename;
convertMessageToString(_scriptPointer, buffer, sizeof(buffer));
len = resStrLen(_scriptPointer);
_scriptPointer += len + 1;
- filename = (char *)buffer + convertFilePath(buffer, sizeof(buffer));
-
- debug(1, "o60_deleteFile (\"%s\")", filename);
+ debug(1, "o60_deleteFile (\"%s\")", (char *)buffer);
- if (!_saveFileMan->listSavefiles(filename).empty()) {
- _saveFileMan->removeSavefile(filename);
- }
+ deleteSaveFile(buffer);
}
void ScummEngine_v60he::o60_rename() {
int len;
byte buffer1[100], buffer2[100];
- const char *newFilename, *oldFilename;
convertMessageToString(_scriptPointer, buffer1, sizeof(buffer1));
len = resStrLen(_scriptPointer);
@@ -778,12 +921,9 @@ void ScummEngine_v60he::o60_rename() {
len = resStrLen(_scriptPointer);
_scriptPointer += len + 1;
- oldFilename = (char *)buffer1 + convertFilePath(buffer1, sizeof(buffer1));
- newFilename = (char *)buffer2 + convertFilePath(buffer2, sizeof(buffer2));
-
- debug(1, "o60_rename (\"%s\" to \"%s\")", oldFilename, newFilename);
+ debug(1, "o60_rename (\"%s\" to \"%s\")", (char *)buffer1, (char *)buffer2);
- _saveFileMan->renameSavefile(oldFilename, newFilename);
+ renameSaveFile(buffer1, buffer2);
}
int ScummEngine_v60he::readFileToArray(int slot, int32 size) {
diff --git a/engines/scumm/he/script_v70he.cpp b/engines/scumm/he/script_v70he.cpp
index 9259e0db2f..a911487738 100644
--- a/engines/scumm/he/script_v70he.cpp
+++ b/engines/scumm/he/script_v70he.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/scumm/he/script_v71he.cpp b/engines/scumm/he/script_v71he.cpp
index 3ad9220ac5..1ef21f1e6e 100644
--- a/engines/scumm/he/script_v71he.cpp
+++ b/engines/scumm/he/script_v71he.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/scumm/he/script_v72he.cpp b/engines/scumm/he/script_v72he.cpp
index 42bf9a4bb6..31b4887d10 100644
--- a/engines/scumm/he/script_v72he.cpp
+++ b/engines/scumm/he/script_v72he.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -710,7 +710,7 @@ void ScummEngine_v72he::o72_roomOps() {
copyScriptString((byte *)buffer, sizeof(buffer));
- _saveLoadFileName = (char *)buffer + convertFilePath(buffer, sizeof(buffer));
+ _saveLoadFileName = (char *)buffer;
debug(1, "o72_roomOps: case 221: filename %s", _saveLoadFileName.c_str());
_saveLoadFlag = pop();
@@ -1390,10 +1390,7 @@ void ScummEngine_v72he::o72_openFile() {
mode = pop();
copyScriptString(buffer, sizeof(buffer));
- debug(1, "Original filename %s", buffer);
-
- const char *filename = (char *)buffer + convertFilePath(buffer, sizeof(buffer));
- debug(1, "Final filename to %s", filename);
+ debug(1, "Trying to open file '%s'", (char *)buffer);
slot = -1;
for (i = 1; i < 17; i++) {
@@ -1406,48 +1403,17 @@ void ScummEngine_v72he::o72_openFile() {
if (slot != -1) {
switch (mode) {
case 1: // Read mode
- if (!_saveFileMan->listSavefiles(filename).empty()) {
- _hInFileTable[slot] = _saveFileMan->openForLoading(filename);
- } else {
- _hInFileTable[slot] = SearchMan.createReadStreamForMember(filename);
- }
+ _hInFileTable[slot] = openFileForReading(buffer);
break;
case 2: // Write mode
- if (!strchr(filename, '/')) {
- _hOutFileTable[slot] = _saveFileMan->openForSaving(filename);
+ if (!strchr((char *)buffer, '/')) {
+ _hOutFileTable[slot] = openSaveFileForWriting(buffer);
}
break;
- case 6: { // Append mode
- if (strchr(filename, '/'))
- break;
-
- // First check if the file already exists
- Common::InSaveFile *initialState = 0;
- if (!_saveFileMan->listSavefiles(filename).empty())
- initialState = _saveFileMan->openForLoading(filename);
- else
- initialState = SearchMan.createReadStreamForMember(filename);
-
- // Read in the data from the initial file
- uint32 initialSize = 0;
- byte *initialData = 0;
- if (initialState) {
- initialSize = initialState->size();
- initialData = new byte[initialSize];
- initialState->read(initialData, initialSize);
- delete initialState;
- }
-
- // Attempt to open a save file
- _hOutFileTable[slot] = _saveFileMan->openForSaving(filename);
-
- // Begin us off with the data from the previous file
- if (_hOutFileTable[slot] && initialData) {
- _hOutFileTable[slot]->write(initialData, initialSize);
- delete[] initialData;
- }
-
- } break;
+ case 6: // Append mode
+ if (!strchr((char *)buffer, '/'))
+ _hOutFileTable[slot] = openSaveFileForAppending(buffer);
+ break;
default:
error("o72_openFile(): wrong open file mode %d", mode);
}
@@ -1565,13 +1531,10 @@ void ScummEngine_v72he::o72_deleteFile() {
byte buffer[256];
copyScriptString(buffer, sizeof(buffer));
- const char *filename = (char *)buffer + convertFilePath(buffer, sizeof(buffer));
- debug(1, "o72_deleteFile(%s)", filename);
+ debug(1, "o72_deleteFile(%s)", (char *)buffer);
- if (!_saveFileMan->listSavefiles(filename).empty()) {
- _saveFileMan->removeSavefile(filename);
- }
+ deleteSaveFile(buffer);
}
void ScummEngine_v72he::o72_rename() {
@@ -1580,12 +1543,9 @@ void ScummEngine_v72he::o72_rename() {
copyScriptString(buffer1, sizeof(buffer1));
copyScriptString(buffer2, sizeof(buffer2));
- const char *newFilename = (char *)buffer1 + convertFilePath(buffer1, sizeof(buffer1));
- const char *oldFilename = (char *)buffer2 + convertFilePath(buffer2, sizeof(buffer2));
-
- _saveFileMan->renameSavefile(oldFilename, newFilename);
+ debug(1, "o72_rename(%s to %s)", (char *)buffer2, (char *)buffer1);
- debug(1, "o72_rename(%s to %s)", oldFilename, newFilename);
+ renameSaveFile(buffer2, buffer1);
}
void ScummEngine_v72he::o72_getPixel() {
diff --git a/engines/scumm/he/script_v80he.cpp b/engines/scumm/he/script_v80he.cpp
index ae43d714ad..f5a193afcc 100644
--- a/engines/scumm/he/script_v80he.cpp
+++ b/engines/scumm/he/script_v80he.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -89,14 +89,8 @@ void ScummEngine_v80he::o80_getFileSize() {
byte buffer[256];
copyScriptString(buffer, sizeof(buffer));
- const char *filename = (char *)buffer + convertFilePath(buffer, sizeof(buffer));
- Common::SeekableReadStream *f = 0;
- if (!_saveFileMan->listSavefiles(filename).empty()) {
- f = _saveFileMan->openForLoading(filename);
- } else {
- f = SearchMan.createReadStreamForMember(filename);
- }
+ Common::SeekableReadStream *f = openFileForReading(buffer);
if (!f) {
push(-1);
@@ -143,14 +137,12 @@ void ScummEngine_v80he::o80_readConfigFile() {
byte option[128], section[128], filename[256];
byte *data;
Common::String entry;
- int len, r;
+ int len;
copyScriptString(option, sizeof(option));
copyScriptString(section, sizeof(section));
copyScriptString(filename, sizeof(filename));
- r = convertFilePath(filename, sizeof(filename));
-
if (_game.id == GID_TREASUREHUNT) {
// WORKAROUND: Remove invalid characters
if (!strcmp((char *)section, "Blue'sTreasureHunt-Disc1"))
@@ -159,13 +151,13 @@ void ScummEngine_v80he::o80_readConfigFile() {
memcpy(section, "BluesTreasureHunt-Disc2\0", 24);
}
- if (!strcmp((const char *)filename, "map (i)")) {
+ if (!strcmp((const char *)filename, ":map (i)")) {
// Mac resource fork config file
// (as used by only mustard mac for map data?)
Common::MacResManager resFork;
- if (!resFork.open((const char *)filename) || !resFork.hasResFork())
- error("Could not open '%s'", filename);
+ if (!resFork.open("map (i)") || !resFork.hasResFork())
+ error("Could not open 'map (i)'");
Common::String prefResName = Common::String::format("Pref:%s.%s", (const char *)section, (const char *)option);
Common::SeekableReadStream *res = resFork.getResource(prefResName);
@@ -180,13 +172,14 @@ void ScummEngine_v80he::o80_readConfigFile() {
}
} else {
// Normal Windows INI files
- Common::INIFile confFile;
- if (!strcmp((char *)filename + r, "map.ini"))
- confFile.loadFromFile((const char *)filename + r);
- else
- confFile.loadFromSaveFile((const char *)filename + r);
+ Common::SeekableReadStream *stream = openFileForReading(filename);
- confFile.getKey((const char *)option, (const char *)section, entry);
+ if (stream) {
+ Common::INIFile iniFile;
+ iniFile.loadFromStream(*stream);
+ iniFile.getKey((const char *)option, (const char *)section, entry);
+ delete stream;
+ }
}
byte subOp = fetchScriptByte();
@@ -216,7 +209,7 @@ void ScummEngine_v80he::o80_readConfigFile() {
void ScummEngine_v80he::o80_writeConfigFile() {
byte filename[256], section[256], option[256], string[1024];
- int r, value;
+ int value;
byte subOp = fetchScriptByte();
@@ -240,8 +233,6 @@ void ScummEngine_v80he::o80_writeConfigFile() {
error("o80_writeConfigFile: default type %d", subOp);
}
- r = convertFilePath(filename, sizeof(filename));
-
if (_game.id == GID_TREASUREHUNT) {
// WORKAROUND: Remove invalid characters
if (!strcmp((char *)section, "Blue'sTreasureHunt-Disc1"))
@@ -250,10 +241,16 @@ void ScummEngine_v80he::o80_writeConfigFile() {
memcpy(section, "BluesTreasureHunt-Disc2\0", 24);
}
- Common::INIFile ConfFile;
- ConfFile.loadFromSaveFile((const char *)filename + r);
- ConfFile.setKey((char *)option, (char *)section, (char *)string);
- ConfFile.saveToSaveFile((const char *)filename + r);
+ Common::INIFile iniFile;
+ Common::SeekableReadStream *iniStream = openSaveFileForReading(filename);
+
+ if (iniStream) {
+ iniFile.loadFromStream(*iniStream);
+ delete iniStream;
+ }
+
+ iniFile.setKey((char *)option, (char *)section, (char *)string);
+ iniFile.saveToSaveFile(convertSavePath(filename));
debug(1,"o80_writeConfigFile: Filename %s Section %s Option %s String %s", filename, section, option, string);
}
diff --git a/engines/scumm/he/script_v90he.cpp b/engines/scumm/he/script_v90he.cpp
index 1ea9960a18..f65d2f6077 100644
--- a/engines/scumm/he/script_v90he.cpp
+++ b/engines/scumm/he/script_v90he.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -1429,11 +1429,10 @@ void ScummEngine_v90he::o90_videoOps() {
if (_videoParams.flags == 0)
_videoParams.flags = 4;
- const char *filename = (char *)_videoParams.filename + convertFilePath(_videoParams.filename, sizeof(_videoParams.filename));
if (_videoParams.flags & 2) {
- VAR(119) = _moviePlay->load(filename, _videoParams.flags, _videoParams.wizResNum);
+ VAR(119) = _moviePlay->load(convertFilePath(_videoParams.filename), _videoParams.flags, _videoParams.wizResNum);
} else {
- VAR(119) = _moviePlay->load(filename, _videoParams.flags);
+ VAR(119) = _moviePlay->load(convertFilePath(_videoParams.filename), _videoParams.flags);
}
} else if (_videoParams.status == 165) {
// Stop video
diff --git a/engines/scumm/he/sound_he.cpp b/engines/scumm/he/sound_he.cpp
index 1afb1b4074..a78aff96f8 100644
--- a/engines/scumm/he/sound_he.cpp
+++ b/engines/scumm/he/sound_he.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/scumm/he/sound_he.h b/engines/scumm/he/sound_he.h
index f487acc7da..323858a7c9 100644
--- a/engines/scumm/he/sound_he.h
+++ b/engines/scumm/he/sound_he.h
@@ -17,6 +17,7 @@
* You should have received a copy of the GNU General Public 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_HE_SOUND_HE_H
diff --git a/engines/scumm/he/sprite_he.cpp b/engines/scumm/he/sprite_he.cpp
index ec69ae11b4..218f2ec59c 100644
--- a/engines/scumm/he/sprite_he.cpp
+++ b/engines/scumm/he/sprite_he.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/scumm/he/sprite_he.h b/engines/scumm/he/sprite_he.h
index be6717faa5..e31ccbf790 100644
--- a/engines/scumm/he/sprite_he.h
+++ b/engines/scumm/he/sprite_he.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/scumm/he/wiz_he.cpp b/engines/scumm/he/wiz_he.cpp
index ca360803bd..9a59609651 100644
--- a/engines/scumm/he/wiz_he.cpp
+++ b/engines/scumm/he/wiz_he.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -2355,8 +2355,6 @@ void Wiz::remapWizImagePal(const WizParameters *params) {
}
void Wiz::processWizImage(const WizParameters *params) {
- byte buffer[260];
-
debug(3, "processWizImage: processMode %d", params->processMode);
switch (params->processMode) {
case 0:
@@ -2370,15 +2368,7 @@ void Wiz::processWizImage(const WizParameters *params) {
break;
case 3:
if (params->processFlags & kWPFUseFile) {
- Common::SeekableReadStream *f = NULL;
- memcpy(buffer, params->filename, 260);
- const char *filename = (char *)buffer + _vm->convertFilePath(buffer, sizeof(buffer));
-
- if (!_vm->_saveFileMan->listSavefiles(filename).empty()) {
- f = _vm->_saveFileMan->openForLoading(filename);
- } else {
- f = SearchMan.createReadStreamForMember(filename);
- }
+ Common::SeekableReadStream *f = _vm->openFileForReading(params->filename);
if (f) {
uint32 id = f->readUint32BE();
@@ -2388,7 +2378,7 @@ void Wiz::processWizImage(const WizParameters *params) {
byte *p = _vm->_res->createResource(rtImage, params->img.resNum, size);
if (f->read(p, size) != size) {
_vm->_res->nukeResource(rtImage, params->img.resNum);
- error("i/o error when reading '%s'", filename);
+ error("i/o error when reading '%s'", params->filename);
_vm->VAR(_vm->VAR_GAME_LOADED) = -2;
_vm->VAR(119) = -2;
} else {
@@ -2404,16 +2394,12 @@ void Wiz::processWizImage(const WizParameters *params) {
} else {
_vm->VAR(_vm->VAR_GAME_LOADED) = -3;
_vm->VAR(119) = -3;
- debug(0, "Unable to open for read '%s'", filename);
+ debug(0, "Unable to open for read '%s'", params->filename);
}
}
break;
case 4:
if (params->processFlags & kWPFUseFile) {
- Common::OutSaveFile *f;
- memcpy(buffer, params->filename, 260);
- const char *filename = (char *)buffer + _vm->convertFilePath(buffer, sizeof(buffer));
-
switch (params->fileWriteMode) {
case 2:
_vm->VAR(119) = -1;
@@ -2421,15 +2407,17 @@ void Wiz::processWizImage(const WizParameters *params) {
case 1:
// TODO Write image to file
break;
- case 0:
- if (!(f = _vm->_saveFileMan->openForSaving(filename))) {
- debug(0, "Unable to open for write '%s'", filename);
+ case 0: {
+ Common::WriteStream *f = _vm->openSaveFileForWriting(params->filename);
+
+ if (!f) {
+ debug(0, "Unable to open for write '%s'", params->filename);
_vm->VAR(119) = -3;
} else {
byte *p = _vm->getResourceAddress(rtImage, params->img.resNum);
uint32 size = READ_BE_UINT32(p + 4);
if (f->write(p, size) != size) {
- error("i/o error when writing '%s'", filename);
+ error("i/o error when writing '%s'", params->filename);
_vm->VAR(119) = -2;
} else {
_vm->VAR(119) = 0;
@@ -2438,6 +2426,7 @@ void Wiz::processWizImage(const WizParameters *params) {
delete f;
}
break;
+ }
default:
error("processWizImage: processMode 4 unhandled fileWriteMode %d", params->fileWriteMode);
}
diff --git a/engines/scumm/he/wiz_he.h b/engines/scumm/he/wiz_he.h
index ce3fbc27c6..8db438a074 100644
--- a/engines/scumm/he/wiz_he.h
+++ b/engines/scumm/he/wiz_he.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/scumm/imuse/imuse.cpp b/engines/scumm/imuse/imuse.cpp
index 0e96952a48..8b892f5fda 100644
--- a/engines/scumm/imuse/imuse.cpp
+++ b/engines/scumm/imuse/imuse.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/scumm/imuse/imuse.h b/engines/scumm/imuse/imuse.h
index cce5309229..35ccc931b5 100644
--- a/engines/scumm/imuse/imuse.h
+++ b/engines/scumm/imuse/imuse.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/scumm/imuse/imuse_internal.h b/engines/scumm/imuse/imuse_internal.h
index d17d4ed28b..fed716e300 100644
--- a/engines/scumm/imuse/imuse_internal.h
+++ b/engines/scumm/imuse/imuse_internal.h
@@ -17,6 +17,7 @@
* You should have received a copy of the GNU General Public 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_INTERNAL
diff --git a/engines/scumm/imuse/imuse_part.cpp b/engines/scumm/imuse/imuse_part.cpp
index 5e928f3d44..937523d275 100644
--- a/engines/scumm/imuse/imuse_part.cpp
+++ b/engines/scumm/imuse/imuse_part.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/scumm/imuse/imuse_player.cpp b/engines/scumm/imuse/imuse_player.cpp
index 3a9c42a920..6714cc00a0 100644
--- a/engines/scumm/imuse/imuse_player.cpp
+++ b/engines/scumm/imuse/imuse_player.cpp
@@ -17,6 +17,7 @@
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
*/
diff --git a/engines/scumm/imuse/instrument.cpp b/engines/scumm/imuse/instrument.cpp
index 61c73b1e2d..6cbe1a5a15 100644
--- a/engines/scumm/imuse/instrument.cpp
+++ b/engines/scumm/imuse/instrument.cpp
@@ -17,6 +17,7 @@
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
*/
diff --git a/engines/scumm/imuse/instrument.h b/engines/scumm/imuse/instrument.h
index 7e09e86fa5..47f556b40b 100644
--- a/engines/scumm/imuse/instrument.h
+++ b/engines/scumm/imuse/instrument.h
@@ -17,6 +17,7 @@
* You should have received a copy of the GNU General Public 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_INSTRUMENT_H
diff --git a/engines/scumm/imuse/mac_m68k.cpp b/engines/scumm/imuse/mac_m68k.cpp
index 0980ef1fd2..8ebd8e4cca 100644
--- a/engines/scumm/imuse/mac_m68k.cpp
+++ b/engines/scumm/imuse/mac_m68k.cpp
@@ -17,6 +17,7 @@
* You should have received a copy of the GNU General Public 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/mac_m68k.h"
diff --git a/engines/scumm/imuse/mac_m68k.h b/engines/scumm/imuse/mac_m68k.h
index 59e2f68b9b..31beaf4e66 100644
--- a/engines/scumm/imuse/mac_m68k.h
+++ b/engines/scumm/imuse/mac_m68k.h
@@ -17,6 +17,7 @@
* You should have received a copy of the GNU General Public 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_MAC_M68K_H
diff --git a/engines/scumm/imuse/pcspk.cpp b/engines/scumm/imuse/pcspk.cpp
index cbf3446f10..856b771990 100644
--- a/engines/scumm/imuse/pcspk.cpp
+++ b/engines/scumm/imuse/pcspk.cpp
@@ -17,6 +17,7 @@
* You should have received a copy of the GNU General Public 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"
diff --git a/engines/scumm/imuse/pcspk.h b/engines/scumm/imuse/pcspk.h
index 195bd34b07..6a107e169a 100644
--- a/engines/scumm/imuse/pcspk.h
+++ b/engines/scumm/imuse/pcspk.h
@@ -17,6 +17,7 @@
* You should have received a copy of the GNU General Public 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
diff --git a/engines/scumm/imuse/sysex.h b/engines/scumm/imuse/sysex.h
index 06ac483afd..f9a1d717d2 100644
--- a/engines/scumm/imuse/sysex.h
+++ b/engines/scumm/imuse/sysex.h
@@ -17,6 +17,7 @@
* You should have received a copy of the GNU General Public 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_SYSEX_H
diff --git a/engines/scumm/imuse/sysex_samnmax.cpp b/engines/scumm/imuse/sysex_samnmax.cpp
index a4f525da56..7a412414fe 100644
--- a/engines/scumm/imuse/sysex_samnmax.cpp
+++ b/engines/scumm/imuse/sysex_samnmax.cpp
@@ -17,6 +17,7 @@
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
*/
diff --git a/engines/scumm/imuse/sysex_scumm.cpp b/engines/scumm/imuse/sysex_scumm.cpp
index 8f230ebac3..d2bf857b7a 100644
--- a/engines/scumm/imuse/sysex_scumm.cpp
+++ b/engines/scumm/imuse/sysex_scumm.cpp
@@ -17,6 +17,7 @@
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
*/
diff --git a/engines/scumm/imuse_digi/dimuse.cpp b/engines/scumm/imuse_digi/dimuse.cpp
index a737539c44..db260dce42 100644
--- a/engines/scumm/imuse_digi/dimuse.cpp
+++ b/engines/scumm/imuse_digi/dimuse.cpp
@@ -17,6 +17,7 @@
* You should have received a copy of the GNU General Public 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/system.h"
diff --git a/engines/scumm/imuse_digi/dimuse.h b/engines/scumm/imuse_digi/dimuse.h
index d940b6897f..f04c2f7826 100644
--- a/engines/scumm/imuse_digi/dimuse.h
+++ b/engines/scumm/imuse_digi/dimuse.h
@@ -17,6 +17,7 @@
* You should have received a copy of the GNU General Public 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(SCUMM_IMUSE_DIGI_H) && defined(ENABLE_SCUMM_7_8)
diff --git a/engines/scumm/imuse_digi/dimuse_bndmgr.cpp b/engines/scumm/imuse_digi/dimuse_bndmgr.cpp
index d6e07bd0ec..bf024aa098 100644
--- a/engines/scumm/imuse_digi/dimuse_bndmgr.cpp
+++ b/engines/scumm/imuse_digi/dimuse_bndmgr.cpp
@@ -17,6 +17,7 @@
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
*/
diff --git a/engines/scumm/imuse_digi/dimuse_bndmgr.h b/engines/scumm/imuse_digi/dimuse_bndmgr.h
index 21d3110f8b..2d04e88246 100644
--- a/engines/scumm/imuse_digi/dimuse_bndmgr.h
+++ b/engines/scumm/imuse_digi/dimuse_bndmgr.h
@@ -17,6 +17,7 @@
* You should have received a copy of the GNU General Public 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_DIGI_BUNDLE_MGR_H
diff --git a/engines/scumm/imuse_digi/dimuse_codecs.cpp b/engines/scumm/imuse_digi/dimuse_codecs.cpp
index 6edfe0bd33..b7468802d5 100644
--- a/engines/scumm/imuse_digi/dimuse_codecs.cpp
+++ b/engines/scumm/imuse_digi/dimuse_codecs.cpp
@@ -17,6 +17,7 @@
* You should have received a copy of the GNU General Public 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"
diff --git a/engines/scumm/imuse_digi/dimuse_codecs.h b/engines/scumm/imuse_digi/dimuse_codecs.h
index a38f7234dd..163d0250fa 100644
--- a/engines/scumm/imuse_digi/dimuse_codecs.h
+++ b/engines/scumm/imuse_digi/dimuse_codecs.h
@@ -17,6 +17,7 @@
* You should have received a copy of the GNU General Public 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_DIGI_CODECS_H
diff --git a/engines/scumm/imuse_digi/dimuse_music.cpp b/engines/scumm/imuse_digi/dimuse_music.cpp
index adf2560142..46c457c864 100644
--- a/engines/scumm/imuse_digi/dimuse_music.cpp
+++ b/engines/scumm/imuse_digi/dimuse_music.cpp
@@ -17,6 +17,7 @@
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
*/
diff --git a/engines/scumm/imuse_digi/dimuse_script.cpp b/engines/scumm/imuse_digi/dimuse_script.cpp
index bc030cc242..f181e5b6db 100644
--- a/engines/scumm/imuse_digi/dimuse_script.cpp
+++ b/engines/scumm/imuse_digi/dimuse_script.cpp
@@ -17,6 +17,7 @@
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
*/
diff --git a/engines/scumm/imuse_digi/dimuse_sndmgr.cpp b/engines/scumm/imuse_digi/dimuse_sndmgr.cpp
index af4f8775f4..78d05c2051 100644
--- a/engines/scumm/imuse_digi/dimuse_sndmgr.cpp
+++ b/engines/scumm/imuse_digi/dimuse_sndmgr.cpp
@@ -17,6 +17,7 @@
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
*/
@@ -443,11 +444,13 @@ ImuseDigiSndMgr::SoundDesc *ImuseDigiSndMgr::openSound(int32 soundId, const char
} else if (soundName[0] == 0) {
if (sound->bundle->decompressSampleByIndex(soundId, 0, 0x2000, &ptr, 0, header_outside) == 0 || ptr == NULL) {
closeSound(sound);
+ free(ptr);
return NULL;
}
} else {
if (sound->bundle->decompressSampleByName(soundName, 0, 0x2000, &ptr, header_outside) == 0 || ptr == NULL) {
closeSound(sound);
+ free(ptr);
return NULL;
}
}
diff --git a/engines/scumm/imuse_digi/dimuse_sndmgr.h b/engines/scumm/imuse_digi/dimuse_sndmgr.h
index ff6281d5e3..aebf4d7f11 100644
--- a/engines/scumm/imuse_digi/dimuse_sndmgr.h
+++ b/engines/scumm/imuse_digi/dimuse_sndmgr.h
@@ -17,6 +17,7 @@
* You should have received a copy of the GNU General Public 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_DIGI_SNDMGR_H
diff --git a/engines/scumm/imuse_digi/dimuse_tables.cpp b/engines/scumm/imuse_digi/dimuse_tables.cpp
index c27138b765..bae081b308 100644
--- a/engines/scumm/imuse_digi/dimuse_tables.cpp
+++ b/engines/scumm/imuse_digi/dimuse_tables.cpp
@@ -17,6 +17,7 @@
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
*/
diff --git a/engines/scumm/imuse_digi/dimuse_tables.h b/engines/scumm/imuse_digi/dimuse_tables.h
index a74941dfea..cb8393d4d7 100644
--- a/engines/scumm/imuse_digi/dimuse_tables.h
+++ b/engines/scumm/imuse_digi/dimuse_tables.h
@@ -17,6 +17,7 @@
* You should have received a copy of the GNU General Public 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(SCUMM_IMUSE_DIGI_TABLES_H) && defined(ENABLE_SCUMM_7_8)
diff --git a/engines/scumm/imuse_digi/dimuse_track.cpp b/engines/scumm/imuse_digi/dimuse_track.cpp
index 0896f9af7d..34926fa34e 100644
--- a/engines/scumm/imuse_digi/dimuse_track.cpp
+++ b/engines/scumm/imuse_digi/dimuse_track.cpp
@@ -17,6 +17,7 @@
* You should have received a copy of the GNU General Public 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"
diff --git a/engines/scumm/imuse_digi/dimuse_track.h b/engines/scumm/imuse_digi/dimuse_track.h
index 420db4bb06..7e360268e5 100644
--- a/engines/scumm/imuse_digi/dimuse_track.h
+++ b/engines/scumm/imuse_digi/dimuse_track.h
@@ -17,6 +17,7 @@
* You should have received a copy of the GNU General Public 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(SCUMM_IMUSE_DIGI_TRACK_H) && defined(ENABLE_SCUMM_7_8)
diff --git a/engines/scumm/input.cpp b/engines/scumm/input.cpp
index d1786dfb60..5e2566dc32 100644
--- a/engines/scumm/input.cpp
+++ b/engines/scumm/input.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/scumm/insane/insane.cpp b/engines/scumm/insane/insane.cpp
index 44528e5bac..b3e9a0e699 100644
--- a/engines/scumm/insane/insane.cpp
+++ b/engines/scumm/insane/insane.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/scumm/insane/insane.h b/engines/scumm/insane/insane.h
index 12d44c57f4..8c5862d20c 100644
--- a/engines/scumm/insane/insane.h
+++ b/engines/scumm/insane/insane.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/scumm/insane/insane_ben.cpp b/engines/scumm/insane/insane_ben.cpp
index a7fa72c417..de904610ee 100644
--- a/engines/scumm/insane/insane_ben.cpp
+++ b/engines/scumm/insane/insane_ben.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/scumm/insane/insane_enemy.cpp b/engines/scumm/insane/insane_enemy.cpp
index d711b63342..40dd453722 100644
--- a/engines/scumm/insane/insane_enemy.cpp
+++ b/engines/scumm/insane/insane_enemy.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/scumm/insane/insane_iact.cpp b/engines/scumm/insane/insane_iact.cpp
index 9c395beea6..e2ed30733b 100644
--- a/engines/scumm/insane/insane_iact.cpp
+++ b/engines/scumm/insane/insane_iact.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/scumm/insane/insane_scenes.cpp b/engines/scumm/insane/insane_scenes.cpp
index 06d5d7ac68..51b4bb33f5 100644
--- a/engines/scumm/insane/insane_scenes.cpp
+++ b/engines/scumm/insane/insane_scenes.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/scumm/midiparser_ro.cpp b/engines/scumm/midiparser_ro.cpp
index 8549a9262d..35eb9f7eb7 100644
--- a/engines/scumm/midiparser_ro.cpp
+++ b/engines/scumm/midiparser_ro.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/scumm/module.mk b/engines/scumm/module.mk
index a377ad3dc4..d43db1e5f1 100644
--- a/engines/scumm/module.mk
+++ b/engines/scumm/module.mk
@@ -35,23 +35,23 @@ MODULE_OBJS := \
midiparser_ro.o \
object.o \
palette.o \
- player_ad.o \
- player_apple2.o \
- player_mac.o \
- player_mod.o \
- player_nes.o \
- player_pce.o \
- player_sid.o \
- player_towns.o \
- player_v1.o \
- player_v2.o \
- player_v2a.o \
- player_v2base.o \
- player_v2cms.o \
- player_v3a.o \
- player_v3m.o \
- player_v4a.o \
- player_v5m.o \
+ players/player_ad.o \
+ players/player_apple2.o \
+ players/player_mac.o \
+ players/player_mod.o \
+ players/player_nes.o \
+ players/player_pce.o \
+ players/player_sid.o \
+ players/player_towns.o \
+ players/player_v1.o \
+ players/player_v2.o \
+ players/player_v2a.o \
+ players/player_v2base.o \
+ players/player_v2cms.o \
+ players/player_v3a.o \
+ players/player_v3m.o \
+ players/player_v4a.o \
+ players/player_v5m.o \
resource_v2.o \
resource_v3.o \
resource_v4.o \
diff --git a/engines/scumm/music.h b/engines/scumm/music.h
index 9fd14d830e..e170647560 100644
--- a/engines/scumm/music.h
+++ b/engines/scumm/music.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -24,10 +24,11 @@
#define SCUMM_MUSIC_H
#include "common/scummsys.h"
-#include "engines/scumm/saveload.h"
namespace Scumm {
+class Serializer;
+
/**
* Pure virtual base class for the various music/sound engines used in Scumm
* games. In particular, the iMuse code provides a subclass of this. There are
diff --git a/engines/scumm/nut_renderer.cpp b/engines/scumm/nut_renderer.cpp
index d9f0b412e1..1d5761ef48 100644
--- a/engines/scumm/nut_renderer.cpp
+++ b/engines/scumm/nut_renderer.cpp
@@ -17,6 +17,7 @@
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
*/
diff --git a/engines/scumm/nut_renderer.h b/engines/scumm/nut_renderer.h
index acccf161fa..47458b9f77 100644
--- a/engines/scumm/nut_renderer.h
+++ b/engines/scumm/nut_renderer.h
@@ -17,6 +17,7 @@
* You should have received a copy of the GNU General Public 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(SCUMM_NUT_RENDERER_H) && defined(ENABLE_SCUMM_7_8)
diff --git a/engines/scumm/object.cpp b/engines/scumm/object.cpp
index d266183f85..7919075d0b 100644
--- a/engines/scumm/object.cpp
+++ b/engines/scumm/object.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/scumm/object.h b/engines/scumm/object.h
index 8212075e43..ef3a267e6a 100644
--- a/engines/scumm/object.h
+++ b/engines/scumm/object.h
@@ -17,6 +17,7 @@
* You should have received a copy of the GNU General Public 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_OBJECT_H
diff --git a/engines/scumm/palette.cpp b/engines/scumm/palette.cpp
index bd085dd4d5..5275f1e942 100644
--- a/engines/scumm/palette.cpp
+++ b/engines/scumm/palette.cpp
@@ -8,11 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/scumm/player_ad.cpp b/engines/scumm/player_ad.cpp
deleted file mode 100644
index ed368afbf6..0000000000
--- a/engines/scumm/player_ad.cpp
+++ /dev/null
@@ -1,959 +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 "scumm/player_ad.h"
-#include "scumm/imuse/imuse.h"
-#include "scumm/scumm.h"
-#include "scumm/resource.h"
-
-#include "audio/fmopl.h"
-
-#include "common/textconsole.h"
-#include "common/config-manager.h"
-
-namespace Scumm {
-
-#define AD_CALLBACK_FREQUENCY 472
-
-Player_AD::Player_AD(ScummEngine *scumm, Audio::Mixer *mixer)
- : _vm(scumm), _mixer(mixer), _rate(mixer->getOutputRate()) {
- _opl2 = OPL::Config::create();
- if (!_opl2->init(_rate)) {
- error("Could not initialize OPL2 emulator");
- }
-
- _samplesPerCallback = _rate / AD_CALLBACK_FREQUENCY;
- _samplesPerCallbackRemainder = _rate % AD_CALLBACK_FREQUENCY;
- _samplesTillCallback = 0;
- _samplesTillCallbackRemainder = 0;
-
- memset(_registerBackUpTable, 0, sizeof(_registerBackUpTable));
- writeReg(0x01, 0x00);
- writeReg(0xBD, 0x00);
- writeReg(0x08, 0x00);
- writeReg(0x01, 0x20);
-
- _mixer->playStream(Audio::Mixer::kPlainSoundType, &_soundHandle, this, -1, Audio::Mixer::kMaxChannelVolume, 0, DisposeAfterUse::NO, true);
-
- _engineMusicTimer = 0;
- _soundPlaying = -1;
-
- _curOffset = 0;
-
- _sfxTimer = 4;
- _rndSeed = 1;
-
- memset(_channels, 0, sizeof(_channels));
- memset(_sfxResource, 0, sizeof(_sfxResource));
- memset(_sfxPriority, 0, sizeof(_sfxPriority));
-}
-
-Player_AD::~Player_AD() {
- _mixer->stopHandle(_soundHandle);
-
- stopAllSounds();
- Common::StackLock lock(_mutex);
- delete _opl2;
- _opl2 = 0;
-}
-
-void Player_AD::setMusicVolume(int vol) {
- // HACK: We ignore the parameter and set up the volume specified in the
- // config manager. This allows us to differentiate between music and sfx
- // volume changes.
- setupVolume();
-}
-
-void Player_AD::startSound(int sound) {
- Common::StackLock lock(_mutex);
-
- // Query the sound resource
- const byte *res = _vm->getResourceAddress(rtSound, sound);
-
- if (res[2] == 0x80) {
- // Stop the current sounds
- stopAllSounds();
-
- // Lock the new music resource
- _soundPlaying = sound;
- _vm->_res->lock(rtSound, _soundPlaying);
-
- // Start the new music resource
- _resource = res;
- startMusic();
- } else {
- // Only try to start a sfx when no music is playing.
- if (_soundPlaying == -1) {
- const byte priority = res[0];
- const byte channel = res[1];
-
- // Check for out of bounds access
- if (channel >= 3) {
- warning("AdLib sfx resource %d uses channel %d", sound, channel);
- return;
- }
-
- // Check whether the channel is free or the priority of the new
- // sfx resource is above the old one.
- if (_channels[channel * 3 + 0].state
- || _channels[channel * 3 + 1].state
- || _channels[channel * 3 + 2].state) {
- if (_sfxPriority[channel] > priority) {
- return;
- }
- }
-
- // Lock the new resource
- _sfxResource[channel] = sound;
- _sfxPriority[channel] = priority;
- _vm->_res->lock(rtSound, sound);
-
- // Start the actual sfx resource
- _resource = res;
- startSfx();
- }
- }
-
- // Setup the sound volume
- setupVolume();
-}
-
-void Player_AD::stopSound(int sound) {
- Common::StackLock lock(_mutex);
-
- if (sound == _soundPlaying) {
- stopAllSounds();
- } else {
- for (int i = 0; i < 3; ++i) {
- if (_sfxResource[i] == sound) {
- if (_channels[i * 3 + 0].state
- || _channels[i * 3 + 1].state
- || _channels[i * 3 + 2].state) {
- // Unlock the sound resource
- _vm->_res->unlock(rtSound, sound);
-
- // Stop the actual sfx playback
- _channels[i * 3 + 0].state = 0;
- _channels[i * 3 + 1].state = 0;
- _channels[i * 3 + 2].state = 0;
- clearChannel(i * 3 + 0);
- clearChannel(i * 3 + 1);
- clearChannel(i * 3 + 2);
- }
- }
- }
- }
-}
-
-void Player_AD::stopAllSounds() {
- Common::StackLock lock(_mutex);
-
- // Unlock the music resource if present
- if (_soundPlaying != -1) {
- _vm->_res->unlock(rtSound, _soundPlaying);
- _soundPlaying = -1;
- }
-
- // Stop the music playback
- _curOffset = 0;
-
- // Unloack all used sfx resources
- for (int i = 0; i < 3; ++i) {
- if (_channels[i * 3 + 0].state || _channels[i * 3 + 1].state || _channels[i * 3 + 2].state) {
- _vm->_res->unlock(rtSound, _sfxResource[i]);
- }
- }
-
- // Reset all the sfx channels
- for (int i = 0; i < 9; ++i) {
- _channels[i].state = 0;
- clearChannel(i);
- }
-
- writeReg(0xBD, 0x00);
-}
-
-int Player_AD::getMusicTimer() {
- return _engineMusicTimer;
-}
-
-int Player_AD::getSoundStatus(int sound) const {
- return (sound == _soundPlaying);
-}
-
-void Player_AD::saveLoadWithSerializer(Serializer *ser) {
- Common::StackLock lock(_mutex);
-
- if (ser->getVersion() < VER(95)) {
- IMuse *dummyImuse = IMuse::create(_vm->_system, NULL, NULL);
- dummyImuse->save_or_load(ser, _vm, false);
- delete dummyImuse;
- return;
- }
-
- // TODO: Be nicer than the original and save the data to continue the
- // currently played sound resources on load?
-}
-
-int Player_AD::readBuffer(int16 *buffer, const int numSamples) {
- Common::StackLock lock(_mutex);
-
- int len = numSamples;
-
- while (len > 0) {
- if (!_samplesTillCallback) {
- // Run the update callback for music or sfx depending on which is
- // active.
- if (_curOffset) {
- updateMusic();
- } else {
- updateSfx();
- }
-
- _samplesTillCallback = _samplesPerCallback;
- _samplesTillCallbackRemainder += _samplesPerCallbackRemainder;
- if (_samplesTillCallbackRemainder >= AD_CALLBACK_FREQUENCY) {
- ++_samplesTillCallback;
- _samplesTillCallbackRemainder -= AD_CALLBACK_FREQUENCY;
- }
- }
-
- const int samplesToRead = MIN(len, _samplesTillCallback);
- _opl2->readBuffer(buffer, samplesToRead);
-
- buffer += samplesToRead;
- len -= samplesToRead;
- _samplesTillCallback -= samplesToRead;
- }
-
- return numSamples;
-}
-
-void Player_AD::setupVolume() {
- // Setup the correct volume
- int soundVolumeMusic = CLIP<int>(ConfMan.getInt("music_volume"), 0, Audio::Mixer::kMaxChannelVolume);
- int soundVolumeSfx = CLIP<int>(ConfMan.getInt("sfx_volume"), 0, Audio::Mixer::kMaxChannelVolume);
- if (ConfMan.hasKey("mute")) {
- if (ConfMan.getBool("mute")) {
- soundVolumeMusic = 0;
- soundVolumeSfx = 0;
- }
- }
-
- // In case a music is being played set the music volume. Set the sfx
- // volume otherwise. This is safe because in the latter case either
- // sfx are playing or there is no sound being played at all.
- if (_soundPlaying != -1) {
- _mixer->setChannelVolume(_soundHandle, soundVolumeMusic);
- } else {
- _mixer->setChannelVolume(_soundHandle, soundVolumeSfx);
- }
-}
-
-void Player_AD::writeReg(int r, int v) {
- if (r >= 0 && r < ARRAYSIZE(_registerBackUpTable)) {
- _registerBackUpTable[r] = v;
- }
- _opl2->writeReg(r, v);
-}
-
-uint8 Player_AD::readReg(int r) const {
- if (r >= 0 && r < ARRAYSIZE(_registerBackUpTable)) {
- return _registerBackUpTable[r];
- } else {
- return 0;
- }
-}
-
-void Player_AD::setupChannel(const uint channel, const byte *instrOffset) {
- instrOffset += 2;
- writeReg(0xC0 + channel, *instrOffset++);
- setupOperator(_operatorOffsetTable[channel * 2 + 0], instrOffset);
- setupOperator(_operatorOffsetTable[channel * 2 + 1], instrOffset);
-}
-
-void Player_AD::setupOperator(const uint opr, const byte *&instrOffset) {
- writeReg(0x20 + opr, *instrOffset++);
- writeReg(0x40 + opr, *instrOffset++);
- writeReg(0x60 + opr, *instrOffset++);
- writeReg(0x80 + opr, *instrOffset++);
- writeReg(0xE0 + opr, *instrOffset++);
-}
-
-const int Player_AD::_operatorOffsetTable[18] = {
- 0, 3, 1, 4,
- 2, 5, 8, 11,
- 9, 12, 10, 13,
- 16, 19, 17, 20,
- 18, 21
-};
-
-// Music
-
-void Player_AD::startMusic() {
- memset(_instrumentOffset, 0, sizeof(_instrumentOffset));
- memset(_channelLastEvent, 0, sizeof(_channelLastEvent));
- memset(_channelFrequency, 0, sizeof(_channelFrequency));
- memset(_channelB0Reg, 0, sizeof(_channelB0Reg));
-
- _voiceChannels = 0;
- uint instruments = _resource[10];
- for (uint i = 0; i < instruments; ++i) {
- const int instrIndex = _resource[11 + i] - 1;
- if (0 <= instrIndex && instrIndex < 16) {
- _instrumentOffset[instrIndex] = i * 16 + 16 + 3;
- _voiceChannels |= _resource[_instrumentOffset[instrIndex] + 13];
- }
- }
-
- if (_voiceChannels) {
- _mdvdrState = 0x20;
- _voiceChannels = 6;
- } else {
- _mdvdrState = 0;
- _voiceChannels = 9;
- }
-
- _curOffset = 0x93;
- // TODO: is this the same for Loom?
- _nextEventTimer = 40;
- _engineMusicTimer = 0;
- _internalMusicTimer = 0;
- _musicTimer = 0;
-
- writeReg(0xBD, _mdvdrState);
-
- const bool isLoom = (_vm->_game.id == GID_LOOM);
- _timerLimit = isLoom ? 473 : 256;
- _musicTicks = _resource[3] * (isLoom ? 2 : 1);
- _loopFlag = (_resource[4] == 0);
- _musicLoopStart = READ_LE_UINT16(_resource + 5);
-}
-
-void Player_AD::updateMusic() {
- _musicTimer += _musicTicks;
- if (_musicTimer < _timerLimit) {
- return;
- }
- _musicTimer -= _timerLimit;
-
- ++_internalMusicTimer;
- if (_internalMusicTimer > 120) {
- _internalMusicTimer = 0;
- ++_engineMusicTimer;
- }
-
- --_nextEventTimer;
- if (_nextEventTimer) {
- return;
- }
-
- while (true) {
- uint command = _resource[_curOffset++];
- if (command == 0xFF) {
- // META EVENT
- // Get the command number.
- command = _resource[_curOffset++];
- if (command == 47) {
- // End of track
- if (_loopFlag) {
- // In case the track is looping jump to the start.
- _curOffset = _musicLoopStart;
- _nextEventTimer = 0;
- } else {
- // Otherwise completely stop playback.
- stopAllSounds();
- }
- return;
- } else if (command == 88) {
- // This is proposedly a debug information insertion. The CMS
- // player code handles this differently, but is still using
- // the same resources...
- _curOffset += 5;
- } else if (command == 81) {
- // Change tempo. This is used exclusively in Loom.
- const uint timing = _resource[_curOffset + 2] | (_resource[_curOffset + 1] << 8);
- _musicTicks = 0x73000 / timing;
- command = _resource[_curOffset++];
- _curOffset += command;
- } else {
- // In case an unknown meta event occurs just skip over the
- // data by using the length supplied.
- command = _resource[_curOffset++];
- _curOffset += command;
- }
- } else {
- if (command >= 0x90) {
- // NOTE ON
- // Extract the channel number and save it in command.
- command -= 0x90;
-
- const uint instrOffset = _instrumentOffset[command];
- if (instrOffset) {
- if (_resource[instrOffset + 13] != 0) {
- setupRhythm(_resource[instrOffset + 13], instrOffset);
- } else {
- int channel = findFreeChannel();
- if (channel != -1) {
- noteOff(channel);
- setupChannel(channel, instrOffset);
- _channelLastEvent[channel] = command + 0x90;
- _channelFrequency[channel] = _resource[_curOffset];
- setupFrequency(channel, _resource[_curOffset]);
- }
- }
- }
- } else {
- // NOTE OFF
- const uint note = _resource[_curOffset];
- command += 0x10;
-
- // Find the output channel which plays the note.
- uint channel = 0xFF;
- for (uint i = 0; i < _voiceChannels; ++i) {
- if (_channelFrequency[i] == note && _channelLastEvent[i] == command) {
- channel = i;
- break;
- }
- }
-
- if (channel != 0xFF) {
- // In case a output channel playing the note was found,
- // stop it.
- noteOff(channel);
- } else {
- // In case there is no such note this will disable the
- // rhythm instrument played on the channel.
- command -= 0x90;
- const uint instrOffset = _instrumentOffset[command];
- if (instrOffset && _resource[instrOffset + 13] != 0) {
- const uint rhythmInstr = _resource[instrOffset + 13];
- if (rhythmInstr < 6) {
- _mdvdrState &= _mdvdrTable[rhythmInstr] ^ 0xFF;
- writeReg(0xBD, _mdvdrState);
- }
- }
- }
- }
-
- _curOffset += 2;
- }
-
- // In case there is a delay till the next event stop handling.
- if (_resource[_curOffset] != 0) {
- break;
- }
- ++_curOffset;
- }
-
- _nextEventTimer = _resource[_curOffset++];
- if (_nextEventTimer & 0x80) {
- _nextEventTimer -= 0x80;
- _nextEventTimer <<= 7;
- _nextEventTimer |= _resource[_curOffset++];
- }
-
- _nextEventTimer >>= (_vm->_game.id == GID_LOOM) ? 2 : 1;
- if (!_nextEventTimer) {
- _nextEventTimer = 1;
- }
-}
-
-void Player_AD::noteOff(uint channel) {
- _channelLastEvent[channel] = 0;
- writeReg(0xB0 + channel, _channelB0Reg[channel] & 0xDF);
-}
-
-int Player_AD::findFreeChannel() {
- for (uint i = 0; i < _voiceChannels; ++i) {
- if (!_channelLastEvent[i]) {
- return i;
- }
- }
-
- return -1;
-}
-
-void Player_AD::setupFrequency(uint channel, int8 frequency) {
- frequency -= 31;
- if (frequency < 0) {
- frequency = 0;
- }
-
- uint octave = 0;
- while (frequency >= 12) {
- frequency -= 12;
- ++octave;
- }
-
- const uint noteFrequency = _noteFrequencies[frequency];
- octave <<= 2;
- octave |= noteFrequency >> 8;
- octave |= 0x20;
- writeReg(0xA0 + channel, noteFrequency & 0xFF);
- _channelB0Reg[channel] = octave;
- writeReg(0xB0 + channel, octave);
-}
-
-void Player_AD::setupRhythm(uint rhythmInstr, uint instrOffset) {
- if (rhythmInstr == 1) {
- setupChannel(6, instrOffset);
- writeReg(0xA6, _resource[instrOffset++]);
- writeReg(0xB6, _resource[instrOffset] & 0xDF);
- _mdvdrState |= 0x10;
- writeReg(0xBD, _mdvdrState);
- } else if (rhythmInstr < 6) {
- const byte *secondOperatorOffset = _resource + instrOffset + 8;
- setupOperator(_rhythmOperatorTable[rhythmInstr], secondOperatorOffset);
- writeReg(0xA0 + _rhythmChannelTable[rhythmInstr], _resource[instrOffset++]);
- writeReg(0xB0 + _rhythmChannelTable[rhythmInstr], _resource[instrOffset++] & 0xDF);
- writeReg(0xC0 + _rhythmChannelTable[rhythmInstr], _resource[instrOffset]);
- _mdvdrState |= _mdvdrTable[rhythmInstr];
- writeReg(0xBD, _mdvdrState);
- }
-}
-
-const uint Player_AD::_noteFrequencies[12] = {
- 0x200, 0x21E, 0x23F, 0x261,
- 0x285, 0x2AB, 0x2D4, 0x300,
- 0x32E, 0x35E, 0x390, 0x3C7
-};
-
-const uint Player_AD::_mdvdrTable[6] = {
- 0x00, 0x10, 0x08, 0x04, 0x02, 0x01
-};
-
-const uint Player_AD::_rhythmOperatorTable[6] = {
- 0x00, 0x00, 0x14, 0x12, 0x15, 0x11
-};
-
-const uint Player_AD::_rhythmChannelTable[6] = {
- 0x00, 0x00, 0x07, 0x08, 0x08, 0x07
-};
-
-// SFX
-
-void Player_AD::startSfx() {
- writeReg(0xBD, 0x00);
-
- // The second byte of the resource defines the logical channel where
- // the sound effect should be played.
- const int startChannel = _resource[1] * 3;
-
- // Clear the channel.
- _channels[startChannel + 0].state = 0;
- _channels[startChannel + 1].state = 0;
- _channels[startChannel + 2].state = 0;
-
- clearChannel(startChannel + 0);
- clearChannel(startChannel + 1);
- clearChannel(startChannel + 2);
-
- // Set up the first channel to pick up playback.
- _channels[startChannel].currentOffset = _channels[startChannel].startOffset = _resource + 2;
- _channels[startChannel].state = 1;
-
- // Scan for the start of the other channels and set them up if required.
- int curChannel = startChannel + 1;
- const byte *bufferPosition = _resource + 2;
- uint8 command = 0;
- while ((command = *bufferPosition) != 0xFF) {
- switch (command) {
- case 1:
- // INSTRUMENT DEFINITION
- bufferPosition += 15;
- break;
-
- case 2:
- // NOTE DEFINITION
- bufferPosition += 11;
- break;
-
- case 0x80:
- // LOOP
- bufferPosition += 1;
- break;
-
- default:
- // START OF CHANNEL
- bufferPosition += 1;
- _channels[curChannel].currentOffset = bufferPosition;
- _channels[curChannel].startOffset = bufferPosition;
- _channels[curChannel].state = 1;
- ++curChannel;
- break;
- }
- }
-}
-
-void Player_AD::updateSfx() {
- if (--_sfxTimer) {
- return;
- }
- _sfxTimer = 4;
-
- for (int i = 0; i <= 9; ++i) {
- if (!_channels[i].state) {
- continue;
- }
-
- updateChannel(i);
- }
-}
-
-void Player_AD::clearChannel(int channel) {
- writeReg(0xA0 + channel, 0x00);
- writeReg(0xB0 + channel, 0x00);
-}
-
-void Player_AD::updateChannel(int channel) {
- if (_channels[channel].state == 1) {
- parseSlot(channel);
- } else {
- updateSlot(channel);
- }
-}
-
-void Player_AD::parseSlot(int channel) {
- while (true) {
- const byte *curOffset = _channels[channel].currentOffset;
-
- switch (*curOffset) {
- case 1:
- // INSTRUMENT DEFINITION
- ++curOffset;
- _channels[channel].instrumentData[0] = *(curOffset + 0);
- _channels[channel].instrumentData[1] = *(curOffset + 2);
- _channels[channel].instrumentData[2] = *(curOffset + 9);
- _channels[channel].instrumentData[3] = *(curOffset + 8);
- _channels[channel].instrumentData[4] = *(curOffset + 4);
- _channels[channel].instrumentData[5] = *(curOffset + 3);
- _channels[channel].instrumentData[6] = 0;
-
- setupChannel(channel, curOffset);
-
- writeReg(0xA0 + channel, *(curOffset + 0));
- writeReg(0xB0 + channel, *(curOffset + 1) & 0xDF);
-
- _channels[channel].currentOffset += 15;
- break;
-
- case 2:
- // NOTE DEFINITION
- ++curOffset;
- _channels[channel].state = 2;
- noteOffOn(channel);
- parseNote(channel, 0, curOffset);
- parseNote(channel, 1, curOffset);
- return;
-
- case 0x80:
- // LOOP
- _channels[channel].currentOffset = _channels[channel].startOffset;
- break;
-
- default:
- // START OF CHANNEL
- // When we encounter a start of another channel while playback
- // it means that the current channel is finished. Thus, we will
- // stop it.
- clearChannel(channel);
- _channels[channel].state = 0;
-
- // If no channel of the sound effect is playing anymore, unlock
- // the resource.
- channel /= 3;
- if (!_channels[channel + 0].state
- && !_channels[channel + 1].state
- && !_channels[channel + 2].state) {
- _vm->_res->unlock(rtSound, _sfxResource[channel]);
- }
- return;
- }
- }
-}
-
-void Player_AD::updateSlot(int channel) {
- const byte *curOffset = _channels[channel].currentOffset + 1;
-
- for (int num = 0; num <= 1; ++num, curOffset += 5) {
- if (!(*curOffset & 0x80)) {
- continue;
- }
-
- const int note = channel * 2 + num;
- bool updateNote = false;
-
- if (_notes[note].state == 2) {
- if (!--_notes[note].sustainTimer) {
- updateNote = true;
- }
- } else {
- updateNote = processNoteEnvelope(note, _notes[note].instrumentValue);
-
- if (_notes[note].bias) {
- writeRegisterSpecial(note, _notes[note].bias - _notes[note].instrumentValue, *curOffset & 0x07);
- } else {
- writeRegisterSpecial(note, _notes[note].instrumentValue, *curOffset & 0x07);
- }
- }
-
- if (updateNote) {
- if (processNote(note, curOffset)) {
- if (!(*curOffset & 0x08)) {
- _channels[channel].currentOffset += 11;
- _channels[channel].state = 1;
- continue;
- } else if (*curOffset & 0x10) {
- noteOffOn(channel);
- }
-
- _notes[note].state = -1;
- processNote(note, curOffset);
- }
- }
-
- if ((*curOffset & 0x20) && !--_notes[note].playTime) {
- _channels[channel].currentOffset += 11;
- _channels[channel].state = 1;
- }
- }
-}
-
-void Player_AD::parseNote(int channel, int num, const byte *offset) {
- if (num) {
- offset += 5;
- }
-
- if (*offset & 0x80) {
- const int note = channel * 2 + num;
- _notes[note].state = -1;
- processNote(note, offset);
- _notes[note].playTime = 0;
-
- if (*offset & 0x20) {
- _notes[note].playTime = (*(offset + 4) >> 4) * 118;
- _notes[note].playTime += (*(offset + 4) & 0x0F) * 8;
- }
- }
-}
-
-bool Player_AD::processNote(int note, const byte *offset) {
- if (++_notes[note].state == 4) {
- return true;
- }
-
- const int instrumentDataOffset = *offset & 0x07;
- _notes[note].bias = _noteBiasTable[instrumentDataOffset];
-
- uint8 instrumentDataValue = 0;
- if (_notes[note].state == 0) {
- instrumentDataValue = _channels[note / 2].instrumentData[instrumentDataOffset];
- }
-
- uint8 noteInstrumentValue = readRegisterSpecial(note, instrumentDataValue, instrumentDataOffset);
- if (_notes[note].bias) {
- noteInstrumentValue = _notes[note].bias - noteInstrumentValue;
- }
- _notes[note].instrumentValue = noteInstrumentValue;
-
- if (_notes[note].state == 2) {
- _notes[note].sustainTimer = _numStepsTable[*(offset + 3) >> 4];
-
- if (*offset & 0x40) {
- _notes[note].sustainTimer = (((getRnd() << 8) * _notes[note].sustainTimer) >> 16) + 1;
- }
- } else {
- int timer1, timer2;
- if (_notes[note].state == 3) {
- timer1 = *(offset + 3) & 0x0F;
- timer2 = 0;
- } else {
- timer1 = *(offset + _notes[note].state + 1) >> 4;
- timer2 = *(offset + _notes[note].state + 1) & 0x0F;
- }
-
- int adjustValue = ((_noteAdjustTable[timer2] * _noteAdjustScaleTable[instrumentDataOffset]) >> 16) - noteInstrumentValue;
- setupNoteEnvelopeState(note, _numStepsTable[timer1], adjustValue);
- }
-
- return false;
-}
-
-void Player_AD::noteOffOn(int channel) {
- const uint8 regValue = readReg(0xB0 | channel);
- writeReg(0xB0 | channel, regValue & 0xDF);
- writeReg(0xB0 | channel, regValue | 0x20);
-}
-
-void Player_AD::writeRegisterSpecial(int note, uint8 value, int offset) {
- if (offset == 6) {
- return;
- }
-
- // Division by 2 extracts the channel number out of the note.
- note /= 2;
-
- uint8 regNum;
- if (_useOperatorTable[offset]) {
- regNum = _operatorOffsetTable[_channelOperatorOffsetTable[offset] + note * 2];
- } else {
- regNum = _channelOffsetTable[note];
- }
-
- regNum += _baseRegisterTable[offset];
-
- uint8 regValue = readReg(regNum) & (~_registerMaskTable[offset]);
- regValue |= value << _registerShiftTable[offset];
-
- writeReg(regNum, regValue);
-}
-
-uint8 Player_AD::readRegisterSpecial(int note, uint8 defaultValue, int offset) {
- if (offset == 6) {
- return 0;
- }
-
- // Division by 2 extracts the channel number out of the note.
- note /= 2;
-
- uint8 regNum;
- if (_useOperatorTable[offset]) {
- regNum = _operatorOffsetTable[_channelOperatorOffsetTable[offset] + note * 2];
- } else {
- regNum = _channelOffsetTable[note];
- }
-
- regNum += _baseRegisterTable[offset];
-
- uint8 regValue;
- if (defaultValue) {
- regValue = defaultValue;
- } else {
- regValue = readReg(regNum);
- }
-
- regValue &= _registerMaskTable[offset];
- regValue >>= _registerShiftTable[offset];
-
- return regValue;
-}
-
-void Player_AD::setupNoteEnvelopeState(int note, int steps, int adjust) {
- _notes[note].preIncrease = 0;
- if (ABS(adjust) > steps) {
- _notes[note].preIncrease = 1;
- _notes[note].adjust = adjust / steps;
- _notes[note].envelope.stepIncrease = ABS(adjust % steps);
- } else {
- _notes[note].adjust = adjust;
- _notes[note].envelope.stepIncrease = ABS(adjust);
- }
-
- _notes[note].envelope.step = steps;
- _notes[note].envelope.stepCounter = 0;
- _notes[note].envelope.timer = steps;
-}
-
-bool Player_AD::processNoteEnvelope(int note, int &instrumentValue) {
- if (_notes[note].preIncrease) {
- instrumentValue += _notes[note].adjust;
- }
-
- _notes[note].envelope.stepCounter += _notes[note].envelope.stepIncrease;
- if (_notes[note].envelope.stepCounter >= _notes[note].envelope.step) {
- _notes[note].envelope.stepCounter -= _notes[note].envelope.step;
-
- if (_notes[note].adjust < 0) {
- --instrumentValue;
- } else {
- ++instrumentValue;
- }
- }
-
- if (--_notes[note].envelope.timer) {
- return false;
- } else {
- return true;
- }
-}
-
-uint8 Player_AD::getRnd() {
- if (_rndSeed & 1) {
- _rndSeed >>= 1;
- _rndSeed ^= 0xB8;
- } else {
- _rndSeed >>= 1;
- }
-
- return _rndSeed;
-}
-
-const uint Player_AD::_noteBiasTable[7] = {
- 0x00, 0x00, 0x3F, 0x00, 0x3F, 0x00, 0x00
-};
-
-const uint Player_AD::_numStepsTable[16] = {
- 1, 4, 6, 8,
- 10, 14, 18, 24,
- 36, 64, 100, 160,
- 240, 340, 600, 1200
-};
-
-const uint Player_AD::_noteAdjustScaleTable[7] = {
- 255, 7, 63, 15, 63, 15, 63
-};
-
-const uint Player_AD::_noteAdjustTable[16] = {
- 0, 4369, 8738, 13107,
- 17476, 21845, 26214, 30583,
- 34952, 39321, 43690, 48059,
- 52428, 46797, 61166, 65535
-};
-
-const bool Player_AD::_useOperatorTable[7] = {
- false, false, true, true, true, true, false
-};
-
-const uint Player_AD::_channelOffsetTable[11] = {
- 0, 1, 2, 3,
- 4, 5, 6, 7,
- 8, 8, 7
-};
-
-const uint Player_AD::_channelOperatorOffsetTable[7] = {
- 0, 0, 1, 1, 0, 0, 0
-};
-
-const uint Player_AD::_baseRegisterTable[7] = {
- 0xA0, 0xC0, 0x40, 0x20, 0x40, 0x20, 0x00
-};
-
-const uint Player_AD::_registerMaskTable[7] = {
- 0xFF, 0x0E, 0x3F, 0x0F, 0x3F, 0x0F, 0x00
-};
-
-const uint Player_AD::_registerShiftTable[7] = {
- 0, 1, 0, 0, 0, 0, 0
-};
-
-} // End of namespace Scumm
diff --git a/engines/scumm/players/player_ad.cpp b/engines/scumm/players/player_ad.cpp
new file mode 100644
index 0000000000..5ed50ab65c
--- /dev/null
+++ b/engines/scumm/players/player_ad.cpp
@@ -0,0 +1,1195 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public 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/players/player_ad.h"
+#include "scumm/imuse/imuse.h"
+#include "scumm/scumm.h"
+#include "scumm/resource.h"
+#include "scumm/saveload.h"
+
+#include "audio/fmopl.h"
+
+#include "common/textconsole.h"
+#include "common/config-manager.h"
+
+namespace Scumm {
+
+#define AD_CALLBACK_FREQUENCY 472
+
+Player_AD::Player_AD(ScummEngine *scumm, Audio::Mixer *mixer)
+ : _vm(scumm), _mixer(mixer), _rate(mixer->getOutputRate()) {
+ _opl2 = OPL::Config::create();
+ if (!_opl2->init(_rate)) {
+ error("Could not initialize OPL2 emulator");
+ }
+
+ _samplesPerCallback = _rate / AD_CALLBACK_FREQUENCY;
+ _samplesPerCallbackRemainder = _rate % AD_CALLBACK_FREQUENCY;
+ _samplesTillCallback = 0;
+ _samplesTillCallbackRemainder = 0;
+
+ memset(_registerBackUpTable, 0, sizeof(_registerBackUpTable));
+ writeReg(0x01, 0x00);
+ writeReg(0xBD, 0x00);
+ writeReg(0x08, 0x00);
+ writeReg(0x01, 0x20);
+
+ _mixer->playStream(Audio::Mixer::kPlainSoundType, &_soundHandle, this, -1, Audio::Mixer::kMaxChannelVolume, 0, DisposeAfterUse::NO, true);
+
+ _engineMusicTimer = 0;
+ _soundPlaying = -1;
+
+ _curOffset = 0;
+
+ _sfxTimer = 4;
+ _rndSeed = 1;
+
+ memset(_sfx, 0, sizeof(_sfx));
+ for (int i = 0; i < ARRAYSIZE(_sfx); ++i) {
+ _sfx[i].resource = -1;
+ for (int j = 0; j < ARRAYSIZE(_sfx[i].channels); ++j) {
+ _sfx[i].channels[j].hardwareChannel = -1;
+ }
+ }
+
+ memset(_hwChannels, 0, sizeof(_hwChannels));
+ _numHWChannels = ARRAYSIZE(_hwChannels);
+
+ memset(_voiceChannels, 0, sizeof(_voiceChannels));
+
+ _musicVolume = _sfxVolume = 255;
+ _isSeeking = false;
+}
+
+Player_AD::~Player_AD() {
+ _mixer->stopHandle(_soundHandle);
+
+ stopAllSounds();
+ Common::StackLock lock(_mutex);
+ delete _opl2;
+ _opl2 = 0;
+}
+
+void Player_AD::setMusicVolume(int vol) {
+ // HACK: We ignore the parameter and set up the volume specified in the
+ // config manager. This allows us to differentiate between music and sfx
+ // volume changes.
+ setupVolume();
+}
+
+void Player_AD::startSound(int sound) {
+ Common::StackLock lock(_mutex);
+
+ // Setup the sound volume
+ setupVolume();
+
+ // Query the sound resource
+ const byte *res = _vm->getResourceAddress(rtSound, sound);
+
+ if (res[2] == 0x80) {
+ // Stop the current sounds
+ stopMusic();
+
+ // Lock the new music resource
+ _soundPlaying = sound;
+ _vm->_res->lock(rtSound, _soundPlaying);
+
+ // Start the new music resource
+ _musicData = res;
+ startMusic();
+ } else {
+ const byte priority = res[0];
+ // The original specified the channel to use in the sound
+ // resource. However, since we play as much as possible we sill
+ // ignore it and simply use the priority value to determine
+ // whether the sfx can be played or not.
+ //const byte channel = res[1];
+
+ // Try to allocate a sfx slot for playback.
+ SfxSlot *sfx = allocateSfxSlot(priority);
+ if (!sfx) {
+ ::debugC(3, DEBUG_SOUND, "AdLib: No free sfx slot for sound %d", sound);
+ return;
+ }
+
+ // Try to start sfx playback
+ sfx->resource = sound;
+ sfx->priority = priority;
+ if (startSfx(sfx, res)) {
+ // Lock the new resource
+ _vm->_res->lock(rtSound, sound);
+ }
+ }
+}
+
+void Player_AD::stopSound(int sound) {
+ Common::StackLock lock(_mutex);
+
+ if (sound == _soundPlaying) {
+ stopMusic();
+ } else {
+ for (int i = 0; i < ARRAYSIZE(_sfx); ++i) {
+ if (_sfx[i].resource == sound) {
+ stopSfx(&_sfx[i]);
+ }
+ }
+ }
+}
+
+void Player_AD::stopAllSounds() {
+ Common::StackLock lock(_mutex);
+
+ // Stop the music
+ stopMusic();
+
+ // Stop all the sfx playback
+ for (int i = 0; i < ARRAYSIZE(_sfx); ++i) {
+ stopSfx(&_sfx[i]);
+ }
+}
+
+int Player_AD::getMusicTimer() {
+ return _engineMusicTimer;
+}
+
+int Player_AD::getSoundStatus(int sound) const {
+ return (sound == _soundPlaying);
+}
+
+void Player_AD::saveLoadWithSerializer(Serializer *ser) {
+ Common::StackLock lock(_mutex);
+
+ if (ser->getVersion() < VER(95)) {
+ IMuse *dummyImuse = IMuse::create(_vm->_system, NULL, NULL);
+ dummyImuse->save_or_load(ser, _vm, false);
+ delete dummyImuse;
+ return;
+ }
+
+ if (ser->getVersion() >= VER(96)) {
+ int32 res[4] = {
+ _soundPlaying, _sfx[0].resource, _sfx[1].resource, _sfx[2].resource
+ };
+
+ // The first thing we save is a list of sound resources being played
+ // at the moment.
+ ser->saveLoadArrayOf(res, 4, sizeof(res[0]), sleInt32);
+
+ // If we are loading start the music again at this point.
+ if (ser->isLoading()) {
+ if (res[0] != -1) {
+ startSound(res[0]);
+ }
+ }
+
+ uint32 musicOffset = _curOffset;
+
+ static const SaveLoadEntry musicData[] = {
+ MKLINE(Player_AD, _engineMusicTimer, sleInt32, VER(96)),
+ MKLINE(Player_AD, _musicTimer, sleUint32, VER(96)),
+ MKLINE(Player_AD, _internalMusicTimer, sleUint32, VER(96)),
+ MKLINE(Player_AD, _curOffset, sleUint32, VER(96)),
+ MKLINE(Player_AD, _nextEventTimer, sleUint32, VER(96)),
+ MKEND()
+ };
+
+ ser->saveLoadEntries(this, musicData);
+
+ // We seek back to the old music position.
+ if (ser->isLoading()) {
+ SWAP(musicOffset, _curOffset);
+ musicSeekTo(musicOffset);
+ }
+
+ // Finally start up the SFX. This makes sure that they are not
+ // accidently stopped while seeking to the old music position.
+ if (ser->isLoading()) {
+ for (int i = 1; i < ARRAYSIZE(res); ++i) {
+ if (res[i] != -1) {
+ startSound(res[i]);
+ }
+ }
+ }
+ }
+}
+
+int Player_AD::readBuffer(int16 *buffer, const int numSamples) {
+ Common::StackLock lock(_mutex);
+
+ int len = numSamples;
+
+ while (len > 0) {
+ if (!_samplesTillCallback) {
+ if (_curOffset) {
+ updateMusic();
+ }
+
+ updateSfx();
+
+ _samplesTillCallback = _samplesPerCallback;
+ _samplesTillCallbackRemainder += _samplesPerCallbackRemainder;
+ if (_samplesTillCallbackRemainder >= AD_CALLBACK_FREQUENCY) {
+ ++_samplesTillCallback;
+ _samplesTillCallbackRemainder -= AD_CALLBACK_FREQUENCY;
+ }
+ }
+
+ const int samplesToRead = MIN(len, _samplesTillCallback);
+ _opl2->readBuffer(buffer, samplesToRead);
+
+ buffer += samplesToRead;
+ len -= samplesToRead;
+ _samplesTillCallback -= samplesToRead;
+ }
+
+ return numSamples;
+}
+
+void Player_AD::setupVolume() {
+ // Setup the correct volume
+ _musicVolume = CLIP<int>(ConfMan.getInt("music_volume"), 0, Audio::Mixer::kMaxChannelVolume);
+ _sfxVolume = CLIP<int>(ConfMan.getInt("sfx_volume"), 0, Audio::Mixer::kMaxChannelVolume);
+
+ if (ConfMan.hasKey("mute")) {
+ if (ConfMan.getBool("mute")) {
+ _musicVolume = 0;
+ _sfxVolume = 0;
+ }
+ }
+
+ // Update current output levels
+ for (int i = 0; i < ARRAYSIZE(_operatorOffsetTable); ++i) {
+ const uint reg = 0x40 + _operatorOffsetTable[i];
+ writeReg(reg, readReg(reg));
+ }
+
+ // Reset note on status
+ for (int i = 0; i < ARRAYSIZE(_hwChannels); ++i) {
+ const uint reg = 0xB0 + i;
+ writeReg(reg, readReg(reg));
+ }
+}
+
+int Player_AD::allocateHWChannel(int priority, SfxSlot *owner) {
+ // First pass: Check whether there's any unallocated channel
+ for (int i = 0; i < _numHWChannels; ++i) {
+ if (!_hwChannels[i].allocated) {
+ _hwChannels[i].allocated = true;
+ _hwChannels[i].priority = priority;
+ _hwChannels[i].sfxOwner = owner;
+ return i;
+ }
+ }
+
+ // Second pass: Reassign channels based on priority
+ for (int i = 0; i < _numHWChannels; ++i) {
+ if (_hwChannels[i].priority <= priority) {
+ // In case the HW channel belongs to a SFX we will completely
+ // stop playback of that SFX.
+ // TODO: Maybe be more fine grained in the future and allow
+ // detachment of individual channels of a SFX?
+ if (_hwChannels[i].sfxOwner) {
+ stopSfx(_hwChannels[i].sfxOwner);
+ }
+ _hwChannels[i].allocated = true;
+ _hwChannels[i].priority = priority;
+ _hwChannels[i].sfxOwner = owner;
+ return i;
+ }
+ }
+
+ return -1;
+}
+
+void Player_AD::freeHWChannel(int channel) {
+ assert(_hwChannels[channel].allocated);
+ _hwChannels[channel].allocated = false;
+ _hwChannels[channel].sfxOwner = nullptr;
+}
+
+void Player_AD::limitHWChannels(int newCount) {
+ for (int i = newCount; i < ARRAYSIZE(_hwChannels); ++i) {
+ if (_hwChannels[i].allocated) {
+ freeHWChannel(i);
+ }
+ }
+ _numHWChannels = newCount;
+}
+
+const int Player_AD::_operatorOffsetToChannel[22] = {
+ 0, 1, 2, 0, 1, 2, -1, -1,
+ 3, 4, 5, 3, 4, 5, -1, -1,
+ 6, 7, 8, 6, 7, 8
+};
+
+void Player_AD::writeReg(int r, int v) {
+ if (r >= 0 && r < ARRAYSIZE(_registerBackUpTable)) {
+ _registerBackUpTable[r] = v;
+ }
+
+ // Handle volume scaling depending on the sound type.
+ if (r >= 0x40 && r <= 0x55) {
+ const int operatorOffset = r - 0x40;
+ const int channel = _operatorOffsetToChannel[operatorOffset];
+ if (channel != -1) {
+ const bool twoOPOutput = (readReg(0xC0 + channel) & 0x01) != 0;
+
+ int scale = Audio::Mixer::kMaxChannelVolume;
+ // We only scale the volume of operator 2 unless both operators
+ // are set to directly produce sound.
+ if (twoOPOutput || operatorOffset == _operatorOffsetTable[channel * 2 + 1]) {
+ if (_hwChannels[channel].sfxOwner) {
+ scale = _sfxVolume;
+ } else {
+ scale = _musicVolume;
+ }
+ }
+
+ int vol = 0x3F - (v & 0x3F);
+ vol = vol * scale / Audio::Mixer::kMaxChannelVolume;
+ v &= 0xC0;
+ v |= (0x3F - vol);
+ }
+ }
+
+ // Since AdLib's lowest volume level does not imply that the sound is
+ // completely silent we ignore key on in such a case.
+ // We also ignore key on for music whenever we do seeking.
+ if (r >= 0xB0 && r <= 0xB8) {
+ const int channel = r - 0xB0;
+ bool mute = false;
+ if (_hwChannels[channel].sfxOwner) {
+ if (!_sfxVolume) {
+ mute = true;
+ }
+ } else {
+ if (!_musicVolume) {
+ mute = true;
+ } else {
+ mute = _isSeeking;
+ }
+ }
+
+ if (mute) {
+ v &= ~0x20;
+ }
+ }
+
+ _opl2->writeReg(r, v);
+}
+
+uint8 Player_AD::readReg(int r) const {
+ if (r >= 0 && r < ARRAYSIZE(_registerBackUpTable)) {
+ return _registerBackUpTable[r];
+ } else {
+ return 0;
+ }
+}
+
+void Player_AD::setupChannel(const uint channel, const byte *instrOffset) {
+ instrOffset += 2;
+ writeReg(0xC0 + channel, *instrOffset++);
+ setupOperator(_operatorOffsetTable[channel * 2 + 0], instrOffset);
+ setupOperator(_operatorOffsetTable[channel * 2 + 1], instrOffset);
+}
+
+void Player_AD::setupOperator(const uint opr, const byte *&instrOffset) {
+ writeReg(0x20 + opr, *instrOffset++);
+ writeReg(0x40 + opr, *instrOffset++);
+ writeReg(0x60 + opr, *instrOffset++);
+ writeReg(0x80 + opr, *instrOffset++);
+ writeReg(0xE0 + opr, *instrOffset++);
+}
+
+const int Player_AD::_operatorOffsetTable[18] = {
+ 0, 3, 1, 4,
+ 2, 5, 8, 11,
+ 9, 12, 10, 13,
+ 16, 19, 17, 20,
+ 18, 21
+};
+
+// Music
+
+void Player_AD::startMusic() {
+ memset(_instrumentOffset, 0, sizeof(_instrumentOffset));
+
+ bool hasRhythmData = false;
+ uint instruments = _musicData[10];
+ for (uint i = 0; i < instruments; ++i) {
+ const int instrIndex = _musicData[11 + i] - 1;
+ if (0 <= instrIndex && instrIndex < 16) {
+ _instrumentOffset[instrIndex] = i * 16 + 16 + 3;
+ hasRhythmData |= (_musicData[_instrumentOffset[instrIndex] + 13] != 0);
+ }
+ }
+
+ if (hasRhythmData) {
+ _mdvdrState = 0x20;
+ limitHWChannels(6);
+ } else {
+ _mdvdrState = 0;
+ limitHWChannels(9);
+ }
+
+ _curOffset = 0x93;
+ // TODO: is this the same for Loom?
+ _nextEventTimer = 40;
+ _engineMusicTimer = 0;
+ _internalMusicTimer = 0;
+ _musicTimer = 0;
+
+ writeReg(0xBD, _mdvdrState);
+
+ const bool isLoom = (_vm->_game.id == GID_LOOM);
+ _timerLimit = isLoom ? 473 : 256;
+ _musicTicks = _musicData[3] * (isLoom ? 2 : 1);
+ _loopFlag = (_musicData[4] == 0);
+ _musicLoopStart = _curOffset + READ_LE_UINT16(_musicData + 5);
+}
+
+void Player_AD::stopMusic() {
+ if (_soundPlaying == -1) {
+ return;
+ }
+
+ // Unlock the music resource if present
+ _vm->_res->unlock(rtSound, _soundPlaying);
+ _soundPlaying = -1;
+
+ // Stop the music playback
+ _curOffset = 0;
+
+ // Stop all music voice channels
+ for (int i = 0; i < ARRAYSIZE(_voiceChannels); ++i) {
+ if (_voiceChannels[i].lastEvent) {
+ noteOff(i);
+ }
+ }
+
+ // Reset rhythm state
+ writeReg(0xBD, 0x00);
+ limitHWChannels(9);
+}
+
+void Player_AD::updateMusic() {
+ _musicTimer += _musicTicks;
+ if (_musicTimer < _timerLimit) {
+ return;
+ }
+ _musicTimer -= _timerLimit;
+
+ ++_internalMusicTimer;
+ if (_internalMusicTimer > 120) {
+ _internalMusicTimer = 0;
+ ++_engineMusicTimer;
+ }
+
+ --_nextEventTimer;
+ if (_nextEventTimer) {
+ return;
+ }
+
+ while (true) {
+ if (parseCommand()) {
+ // We received an EOT command. In case there's no music playing
+ // we know there was no looping enabled. Thus, we stop further
+ // handling. Otherwise we will just continue parsing. It is
+ // important to note that we need to parse a command directly
+ // at the new position, i.e. there is no time value we need to
+ // parse.
+ if (_soundPlaying == -1) {
+ return;
+ } else {
+ continue;
+ }
+ }
+
+ // In case there is a delay till the next event stop handling.
+ if (_musicData[_curOffset] != 0) {
+ break;
+ }
+ ++_curOffset;
+ }
+
+ _nextEventTimer = parseVLQ();
+ _nextEventTimer >>= (_vm->_game.id == GID_LOOM) ? 2 : 1;
+ if (!_nextEventTimer) {
+ _nextEventTimer = 1;
+ }
+}
+
+bool Player_AD::parseCommand() {
+ uint command = _musicData[_curOffset++];
+ if (command == 0xFF) {
+ // META EVENT
+ // Get the command number.
+ command = _musicData[_curOffset++];
+ if (command == 47) {
+ // End of track
+ if (_loopFlag) {
+ // In case the track is looping jump to the start.
+ _curOffset = _musicLoopStart;
+ _nextEventTimer = 0;
+ } else {
+ // Otherwise completely stop playback.
+ stopMusic();
+ }
+ return true;
+ } else if (command == 88) {
+ // This is proposedly a debug information insertion. The CMS
+ // player code handles this differently, but is still using
+ // the same resources...
+ _curOffset += 5;
+ } else if (command == 81) {
+ // Change tempo. This is used exclusively in Loom.
+ const uint timing = _musicData[_curOffset + 2] | (_musicData[_curOffset + 1] << 8);
+ _musicTicks = 0x73000 / timing;
+ command = _musicData[_curOffset++];
+ _curOffset += command;
+ } else {
+ // In case an unknown meta event occurs just skip over the
+ // data by using the length supplied.
+ command = _musicData[_curOffset++];
+ _curOffset += command;
+ }
+ } else {
+ if (command >= 0x90) {
+ // NOTE ON
+ // Extract the channel number and save it in command.
+ command -= 0x90;
+
+ const uint instrOffset = _instrumentOffset[command];
+ if (instrOffset) {
+ if (_musicData[instrOffset + 13] != 0) {
+ setupRhythm(_musicData[instrOffset + 13], instrOffset);
+ } else {
+ // Priority 256 makes sure we always prefer music
+ // channels over SFX channels.
+ int channel = allocateHWChannel(256);
+ if (channel != -1) {
+ setupChannel(channel, _musicData + instrOffset);
+ _voiceChannels[channel].lastEvent = command + 0x90;
+ _voiceChannels[channel].frequency = _musicData[_curOffset];
+ setupFrequency(channel, _musicData[_curOffset]);
+ }
+ }
+ }
+ } else {
+ // NOTE OFF
+ const uint note = _musicData[_curOffset];
+ command += 0x10;
+
+ // Find the output channel which plays the note.
+ uint channel = 0xFF;
+ for (int i = 0; i < ARRAYSIZE(_voiceChannels); ++i) {
+ if (_voiceChannels[i].frequency == note && _voiceChannels[i].lastEvent == command) {
+ channel = i;
+ break;
+ }
+ }
+
+ if (channel != 0xFF) {
+ // In case a output channel playing the note was found,
+ // stop it.
+ noteOff(channel);
+ } else {
+ // In case there is no such note this will disable the
+ // rhythm instrument played on the channel.
+ command -= 0x90;
+ const uint instrOffset = _instrumentOffset[command];
+ if (instrOffset && _musicData[instrOffset + 13] != 0) {
+ const uint rhythmInstr = _musicData[instrOffset + 13];
+ if (rhythmInstr < 6) {
+ _mdvdrState &= _mdvdrTable[rhythmInstr] ^ 0xFF;
+ writeReg(0xBD, _mdvdrState);
+ }
+ }
+ }
+ }
+
+ _curOffset += 2;
+ }
+
+ return false;
+}
+
+uint Player_AD::parseVLQ() {
+ uint vlq = _musicData[_curOffset++];
+ if (vlq & 0x80) {
+ vlq -= 0x80;
+ vlq <<= 7;
+ vlq |= _musicData[_curOffset++];
+ }
+ return vlq;
+}
+
+void Player_AD::noteOff(uint channel) {
+ writeReg(0xB0 + channel, _voiceChannels[channel].b0Reg & 0xDF);
+ freeVoiceChannel(channel);
+}
+
+void Player_AD::setupFrequency(uint channel, int8 frequency) {
+ frequency -= 31;
+ if (frequency < 0) {
+ frequency = 0;
+ }
+
+ uint octave = 0;
+ while (frequency >= 12) {
+ frequency -= 12;
+ ++octave;
+ }
+
+ const uint noteFrequency = _noteFrequencies[frequency];
+ octave <<= 2;
+ octave |= noteFrequency >> 8;
+ octave |= 0x20;
+ writeReg(0xA0 + channel, noteFrequency & 0xFF);
+ _voiceChannels[channel].b0Reg = octave;
+ writeReg(0xB0 + channel, octave);
+}
+
+void Player_AD::setupRhythm(uint rhythmInstr, uint instrOffset) {
+ if (rhythmInstr == 1) {
+ setupChannel(6, _musicData + instrOffset);
+ writeReg(0xA6, _musicData[instrOffset++]);
+ writeReg(0xB6, _musicData[instrOffset] & 0xDF);
+ _mdvdrState |= 0x10;
+ writeReg(0xBD, _mdvdrState);
+ } else if (rhythmInstr < 6) {
+ const byte *secondOperatorOffset = _musicData + instrOffset + 8;
+ setupOperator(_rhythmOperatorTable[rhythmInstr], secondOperatorOffset);
+ writeReg(0xA0 + _rhythmChannelTable[rhythmInstr], _musicData[instrOffset++]);
+ writeReg(0xB0 + _rhythmChannelTable[rhythmInstr], _musicData[instrOffset++] & 0xDF);
+ writeReg(0xC0 + _rhythmChannelTable[rhythmInstr], _musicData[instrOffset]);
+ _mdvdrState |= _mdvdrTable[rhythmInstr];
+ writeReg(0xBD, _mdvdrState);
+ }
+}
+
+void Player_AD::freeVoiceChannel(uint channel) {
+ VoiceChannel &vChannel = _voiceChannels[channel];
+ assert(vChannel.lastEvent);
+
+ freeHWChannel(channel);
+ vChannel.lastEvent = 0;
+ vChannel.b0Reg = 0;
+ vChannel.frequency = 0;
+}
+
+void Player_AD::musicSeekTo(const uint position) {
+ // This method is actually dangerous to use and should only be used for
+ // loading save games because it does not set up anything like the engine
+ // music timer or similar.
+ _isSeeking = true;
+
+ // Seek until the given position.
+ while (_curOffset != position) {
+ if (parseCommand()) {
+ // We encountered an EOT command. This should not happen unless
+ // we try to seek to an illegal position. In this case just abort
+ // seeking.
+ ::debugC(3, DEBUG_SOUND, "AD illegal seek to %u", position);
+ break;
+ }
+ parseVLQ();
+ }
+
+ _isSeeking = false;
+
+ // Turn on all notes.
+ for (int i = 0; i < ARRAYSIZE(_voiceChannels); ++i) {
+ if (_voiceChannels[i].lastEvent != 0) {
+ const int reg = 0xB0 + i;
+ writeReg(reg, readReg(reg));
+ }
+ }
+}
+
+const uint Player_AD::_noteFrequencies[12] = {
+ 0x200, 0x21E, 0x23F, 0x261,
+ 0x285, 0x2AB, 0x2D4, 0x300,
+ 0x32E, 0x35E, 0x390, 0x3C7
+};
+
+const uint Player_AD::_mdvdrTable[6] = {
+ 0x00, 0x10, 0x08, 0x04, 0x02, 0x01
+};
+
+const uint Player_AD::_rhythmOperatorTable[6] = {
+ 0x00, 0x00, 0x14, 0x12, 0x15, 0x11
+};
+
+const uint Player_AD::_rhythmChannelTable[6] = {
+ 0x00, 0x00, 0x07, 0x08, 0x08, 0x07
+};
+
+// SFX
+
+Player_AD::SfxSlot *Player_AD::allocateSfxSlot(int priority) {
+ // First pass: Check whether there's a unused slot
+ for (int i = 0; i < ARRAYSIZE(_sfx); ++i) {
+ if (_sfx[i].resource == -1) {
+ return &_sfx[i];
+ }
+ }
+
+ // Second pass: Look for a slot with lower priority
+ for (int i = 0; i < ARRAYSIZE(_sfx); ++i) {
+ if (_sfx[i].priority <= priority) {
+ // Stop the old sfx
+ stopSfx(&_sfx[i]);
+ return &_sfx[i];
+ }
+ }
+
+ return nullptr;
+}
+
+bool Player_AD::startSfx(SfxSlot *sfx, const byte *resource) {
+ writeReg(0xBD, 0x00);
+
+ // Clear the channels.
+ sfx->channels[0].state = kChannelStateOff;
+ sfx->channels[1].state = kChannelStateOff;
+ sfx->channels[2].state = kChannelStateOff;
+
+ // Set up the first channel to pick up playback.
+ // Try to allocate a hardware channel.
+ sfx->channels[0].hardwareChannel = allocateHWChannel(sfx->priority, sfx);
+ if (sfx->channels[0].hardwareChannel == -1) {
+ ::debugC(3, DEBUG_SOUND, "AD No hardware channel available");
+ return false;
+ }
+ sfx->channels[0].currentOffset = sfx->channels[0].startOffset = resource + 2;
+ sfx->channels[0].state = kChannelStateParse;
+
+ // Scan for the start of the other channels and set them up if required.
+ int curChannel = 1;
+ const byte *bufferPosition = resource + 2;
+ uint8 command = 0;
+ while ((command = *bufferPosition) != 0xFF) {
+ switch (command) {
+ case 1:
+ // INSTRUMENT DEFINITION
+ bufferPosition += 15;
+ break;
+
+ case 2:
+ // NOTE DEFINITION
+ bufferPosition += 11;
+ break;
+
+ case 0x80:
+ // LOOP
+ bufferPosition += 1;
+ break;
+
+ default:
+ // START OF CHANNEL
+ bufferPosition += 1;
+ if (curChannel >= 3) {
+ error("AD SFX resource %d uses more than 3 channels", sfx->resource);
+ }
+ sfx->channels[curChannel].hardwareChannel = allocateHWChannel(sfx->priority, sfx);
+ if (sfx->channels[curChannel].hardwareChannel == -1) {
+ ::debugC(3, DEBUG_SOUND, "AD No hardware channel available");
+ return false;
+ }
+ sfx->channels[curChannel].currentOffset = bufferPosition;
+ sfx->channels[curChannel].startOffset = bufferPosition;
+ sfx->channels[curChannel].state = kChannelStateParse;
+ ++curChannel;
+ break;
+ }
+ }
+
+ return true;
+}
+
+void Player_AD::stopSfx(SfxSlot *sfx) {
+ if (sfx->resource == -1) {
+ return;
+ }
+
+ // 1. step: Clear all the channels.
+ for (int i = 0; i < ARRAYSIZE(sfx->channels); ++i) {
+ if (sfx->channels[i].state) {
+ clearChannel(sfx->channels[i]);
+ sfx->channels[i].state = kChannelStateOff;
+ }
+
+ if (sfx->channels[i].hardwareChannel != -1) {
+ freeHWChannel(sfx->channels[i].hardwareChannel);
+ sfx->channels[i].hardwareChannel = -1;
+ }
+ }
+
+ // 2. step: Unlock the resource.
+ _vm->_res->unlock(rtSound, sfx->resource);
+ sfx->resource = -1;
+}
+
+void Player_AD::updateSfx() {
+ if (--_sfxTimer) {
+ return;
+ }
+ _sfxTimer = 4;
+
+ for (int i = 0; i < ARRAYSIZE(_sfx); ++i) {
+ if (_sfx[i].resource == -1) {
+ continue;
+ }
+
+ bool hasActiveChannel = false;
+ for (int j = 0; j < ARRAYSIZE(_sfx[i].channels); ++j) {
+ if (_sfx[i].channels[j].state) {
+ hasActiveChannel = true;
+ updateChannel(&_sfx[i].channels[j]);
+ }
+ }
+
+ // In case no channel is active we will stop the sfx.
+ if (!hasActiveChannel) {
+ stopSfx(&_sfx[i]);
+ }
+ }
+}
+
+void Player_AD::clearChannel(const Channel &channel) {
+ writeReg(0xA0 + channel.hardwareChannel, 0x00);
+ writeReg(0xB0 + channel.hardwareChannel, 0x00);
+}
+
+void Player_AD::updateChannel(Channel *channel) {
+ if (channel->state == kChannelStateParse) {
+ parseSlot(channel);
+ } else {
+ updateSlot(channel);
+ }
+}
+
+void Player_AD::parseSlot(Channel *channel) {
+ while (true) {
+ const byte *curOffset = channel->currentOffset;
+
+ switch (*curOffset) {
+ case 1:
+ // INSTRUMENT DEFINITION
+ ++curOffset;
+ channel->instrumentData[0] = *(curOffset + 0);
+ channel->instrumentData[1] = *(curOffset + 2);
+ channel->instrumentData[2] = *(curOffset + 9);
+ channel->instrumentData[3] = *(curOffset + 8);
+ channel->instrumentData[4] = *(curOffset + 4);
+ channel->instrumentData[5] = *(curOffset + 3);
+ channel->instrumentData[6] = 0;
+
+ setupChannel(channel->hardwareChannel, curOffset);
+
+ writeReg(0xA0 + channel->hardwareChannel, *(curOffset + 0));
+ writeReg(0xB0 + channel->hardwareChannel, *(curOffset + 1) & 0xDF);
+
+ channel->currentOffset += 15;
+ break;
+
+ case 2:
+ // NOTE DEFINITION
+ ++curOffset;
+ channel->state = kChannelStatePlay;
+ noteOffOn(channel->hardwareChannel);
+ parseNote(&channel->notes[0], *channel, curOffset + 0);
+ parseNote(&channel->notes[1], *channel, curOffset + 5);
+ return;
+
+ case 0x80:
+ // LOOP
+ channel->currentOffset = channel->startOffset;
+ break;
+
+ default:
+ // START OF CHANNEL
+ // When we encounter a start of another channel while playback
+ // it means that the current channel is finished. Thus, we will
+ // stop it.
+ clearChannel(*channel);
+ channel->state = kChannelStateOff;
+ return;
+ }
+ }
+}
+
+void Player_AD::updateSlot(Channel *channel) {
+ const byte *curOffset = channel->currentOffset + 1;
+
+ for (int num = 0; num <= 1; ++num, curOffset += 5) {
+ if (!(*curOffset & 0x80)) {
+ continue;
+ }
+
+ Note *const note = &channel->notes[num];
+ bool updateNote = false;
+
+ if (note->state == kNoteStateSustain) {
+ if (!--note->sustainTimer) {
+ updateNote = true;
+ }
+ } else {
+ updateNote = processNoteEnvelope(note);
+
+ if (note->bias) {
+ writeRegisterSpecial(channel->hardwareChannel, note->bias - note->instrumentValue, *curOffset & 0x07);
+ } else {
+ writeRegisterSpecial(channel->hardwareChannel, note->instrumentValue, *curOffset & 0x07);
+ }
+ }
+
+ if (updateNote) {
+ if (processNote(note, *channel, curOffset)) {
+ if (!(*curOffset & 0x08)) {
+ channel->currentOffset += 11;
+ channel->state = kChannelStateParse;
+ continue;
+ } else if (*curOffset & 0x10) {
+ noteOffOn(channel->hardwareChannel);
+ }
+
+ note->state = kNoteStatePreInit;
+ processNote(note, *channel, curOffset);
+ }
+ }
+
+ if ((*curOffset & 0x20) && !--note->playTime) {
+ channel->currentOffset += 11;
+ channel->state = kChannelStateParse;
+ }
+ }
+}
+
+void Player_AD::parseNote(Note *note, const Channel &channel, const byte *offset) {
+ if (*offset & 0x80) {
+ note->state = kNoteStatePreInit;
+ processNote(note, channel, offset);
+ note->playTime = 0;
+
+ if (*offset & 0x20) {
+ note->playTime = (*(offset + 4) >> 4) * 118;
+ note->playTime += (*(offset + 4) & 0x0F) * 8;
+ }
+ }
+}
+
+bool Player_AD::processNote(Note *note, const Channel &channel, const byte *offset) {
+ if (++note->state == kNoteStateOff) {
+ return true;
+ }
+
+ const int instrumentDataOffset = *offset & 0x07;
+ note->bias = _noteBiasTable[instrumentDataOffset];
+
+ uint8 instrumentDataValue = 0;
+ if (note->state == kNoteStateAttack) {
+ instrumentDataValue = channel.instrumentData[instrumentDataOffset];
+ }
+
+ uint8 noteInstrumentValue = readRegisterSpecial(channel.hardwareChannel, instrumentDataValue, instrumentDataOffset);
+ if (note->bias) {
+ noteInstrumentValue = note->bias - noteInstrumentValue;
+ }
+ note->instrumentValue = noteInstrumentValue;
+
+ if (note->state == kNoteStateSustain) {
+ note->sustainTimer = _numStepsTable[*(offset + 3) >> 4];
+
+ if (*offset & 0x40) {
+ note->sustainTimer = (((getRnd() << 8) * note->sustainTimer) >> 16) + 1;
+ }
+ } else {
+ int timer1, timer2;
+ if (note->state == kNoteStateRelease) {
+ timer1 = *(offset + 3) & 0x0F;
+ timer2 = 0;
+ } else {
+ timer1 = *(offset + note->state + 1) >> 4;
+ timer2 = *(offset + note->state + 1) & 0x0F;
+ }
+
+ int adjustValue = ((_noteAdjustTable[timer2] * _noteAdjustScaleTable[instrumentDataOffset]) >> 16) - noteInstrumentValue;
+ setupNoteEnvelopeState(note, _numStepsTable[timer1], adjustValue);
+ }
+
+ return false;
+}
+
+void Player_AD::noteOffOn(int channel) {
+ const uint8 regValue = readReg(0xB0 | channel);
+ writeReg(0xB0 | channel, regValue & 0xDF);
+ writeReg(0xB0 | channel, regValue | 0x20);
+}
+
+void Player_AD::writeRegisterSpecial(int channel, uint8 value, int offset) {
+ if (offset == 6) {
+ return;
+ }
+
+ uint8 regNum;
+ if (_useOperatorTable[offset]) {
+ regNum = _operatorOffsetTable[_channelOperatorOffsetTable[offset] + channel * 2];
+ } else {
+ regNum = _channelOffsetTable[channel];
+ }
+
+ regNum += _baseRegisterTable[offset];
+
+ uint8 regValue = readReg(regNum) & (~_registerMaskTable[offset]);
+ regValue |= value << _registerShiftTable[offset];
+
+ writeReg(regNum, regValue);
+}
+
+uint8 Player_AD::readRegisterSpecial(int channel, uint8 defaultValue, int offset) {
+ if (offset == 6) {
+ return 0;
+ }
+
+ uint8 regNum;
+ if (_useOperatorTable[offset]) {
+ regNum = _operatorOffsetTable[_channelOperatorOffsetTable[offset] + channel * 2];
+ } else {
+ regNum = _channelOffsetTable[channel];
+ }
+
+ regNum += _baseRegisterTable[offset];
+
+ uint8 regValue;
+ if (defaultValue) {
+ regValue = defaultValue;
+ } else {
+ regValue = readReg(regNum);
+ }
+
+ regValue &= _registerMaskTable[offset];
+ regValue >>= _registerShiftTable[offset];
+
+ return regValue;
+}
+
+void Player_AD::setupNoteEnvelopeState(Note *note, int steps, int adjust) {
+ note->preIncrease = 0;
+ if (ABS(adjust) > steps) {
+ note->preIncrease = 1;
+ note->adjust = adjust / steps;
+ note->envelope.stepIncrease = ABS(adjust % steps);
+ } else {
+ note->adjust = adjust;
+ note->envelope.stepIncrease = ABS(adjust);
+ }
+
+ note->envelope.step = steps;
+ note->envelope.stepCounter = 0;
+ note->envelope.timer = steps;
+}
+
+bool Player_AD::processNoteEnvelope(Note *note) {
+ if (note->preIncrease) {
+ note->instrumentValue += note->adjust;
+ }
+
+ note->envelope.stepCounter += note->envelope.stepIncrease;
+ if (note->envelope.stepCounter >= note->envelope.step) {
+ note->envelope.stepCounter -= note->envelope.step;
+
+ if (note->adjust < 0) {
+ --note->instrumentValue;
+ } else {
+ ++note->instrumentValue;
+ }
+ }
+
+ if (--note->envelope.timer) {
+ return false;
+ } else {
+ return true;
+ }
+}
+
+uint8 Player_AD::getRnd() {
+ if (_rndSeed & 1) {
+ _rndSeed >>= 1;
+ _rndSeed ^= 0xB8;
+ } else {
+ _rndSeed >>= 1;
+ }
+
+ return _rndSeed;
+}
+
+const uint Player_AD::_noteBiasTable[7] = {
+ 0x00, 0x00, 0x3F, 0x00, 0x3F, 0x00, 0x00
+};
+
+const uint Player_AD::_numStepsTable[16] = {
+ 1, 4, 6, 8,
+ 10, 14, 18, 24,
+ 36, 64, 100, 160,
+ 240, 340, 600, 1200
+};
+
+const uint Player_AD::_noteAdjustScaleTable[7] = {
+ 255, 7, 63, 15, 63, 15, 63
+};
+
+const uint Player_AD::_noteAdjustTable[16] = {
+ 0, 4369, 8738, 13107,
+ 17476, 21845, 26214, 30583,
+ 34952, 39321, 43690, 48059,
+ 52428, 46797, 61166, 65535
+};
+
+const bool Player_AD::_useOperatorTable[7] = {
+ false, false, true, true, true, true, false
+};
+
+const uint Player_AD::_channelOffsetTable[11] = {
+ 0, 1, 2, 3,
+ 4, 5, 6, 7,
+ 8, 8, 7
+};
+
+const uint Player_AD::_channelOperatorOffsetTable[7] = {
+ 0, 0, 1, 1, 0, 0, 0
+};
+
+const uint Player_AD::_baseRegisterTable[7] = {
+ 0xA0, 0xC0, 0x40, 0x20, 0x40, 0x20, 0x00
+};
+
+const uint Player_AD::_registerMaskTable[7] = {
+ 0xFF, 0x0E, 0x3F, 0x0F, 0x3F, 0x0F, 0x00
+};
+
+const uint Player_AD::_registerShiftTable[7] = {
+ 0, 1, 0, 0, 0, 0, 0
+};
+
+} // End of namespace Scumm
diff --git a/engines/scumm/player_ad.h b/engines/scumm/players/player_ad.h
index da6c7177ef..63a8503f47 100644
--- a/engines/scumm/player_ad.h
+++ b/engines/scumm/players/player_ad.h
@@ -20,8 +20,8 @@
*
*/
-#ifndef SCUMM_PLAYER_AD_H
-#define SCUMM_PLAYER_AD_H
+#ifndef SCUMM_PLAYERS_PLAYER_AD_H
+#define SCUMM_PLAYERS_PLAYER_AD_H
#include "scumm/music.h"
@@ -68,7 +68,10 @@ private:
Audio::Mixer *const _mixer;
const int _rate;
Audio::SoundHandle _soundHandle;
+
void setupVolume();
+ int _musicVolume;
+ int _sfxVolume;
OPL::OPL *_opl2;
@@ -78,7 +81,21 @@ private:
int _samplesTillCallbackRemainder;
int _soundPlaying;
- int _engineMusicTimer;
+ int32 _engineMusicTimer;
+
+ struct SfxSlot;
+
+ struct HardwareChannel {
+ bool allocated;
+ int priority;
+ SfxSlot *sfxOwner;
+ } _hwChannels[9];
+ int _numHWChannels;
+ static const int _operatorOffsetToChannel[22];
+
+ int allocateHWChannel(int priority, SfxSlot *owner = nullptr);
+ void freeHWChannel(int channel);
+ void limitHWChannels(int newCount);
// AdLib register utilities
uint8 _registerBackUpTable[256];
@@ -86,40 +103,43 @@ private:
uint8 readReg(int r) const;
// Instrument setup
- void setupChannel(const uint channel, uint instrOffset) {
- setupChannel(channel, _resource + instrOffset);
- }
void setupChannel(const uint channel, const byte *instrOffset);
void setupOperator(const uint opr, const byte *&instrOffset);
static const int _operatorOffsetTable[18];
- // Sound data
- const byte *_resource;
-
// Music handling
void startMusic();
+ void stopMusic();
void updateMusic();
+ bool parseCommand();
+ uint parseVLQ();
void noteOff(uint channel);
- int findFreeChannel();
void setupFrequency(uint channel, int8 frequency);
void setupRhythm(uint rhythmInstr, uint instrOffset);
+ const byte *_musicData;
uint _timerLimit;
uint _musicTicks;
- uint _musicTimer;
- uint _internalMusicTimer;
+ uint32 _musicTimer;
+ uint32 _internalMusicTimer;
bool _loopFlag;
uint _musicLoopStart;
uint _instrumentOffset[16];
- uint _channelLastEvent[9];
- uint _channelFrequency[9];
- uint _channelB0Reg[9];
+
+ struct VoiceChannel {
+ uint lastEvent;
+ uint frequency;
+ uint b0Reg;
+ } _voiceChannels[9];
+ void freeVoiceChannel(uint channel);
+
+ void musicSeekTo(const uint position);
+ bool _isSeeking;
uint _mdvdrState;
- uint _voiceChannels;
-
- uint _curOffset;
- uint _nextEventTimer;
+
+ uint32 _curOffset;
+ uint32 _nextEventTimer;
static const uint _noteFrequencies[12];
static const uint _mdvdrTable[6];
@@ -127,34 +147,14 @@ private:
static const uint _rhythmChannelTable[6];
// SFX handling
- void startSfx();
- void updateSfx();
- void clearChannel(int channel);
- void updateChannel(int channel);
- void parseSlot(int channel);
- void updateSlot(int channel);
- void parseNote(int channel, int num, const byte *offset);
- bool processNote(int note, const byte *offset);
- void noteOffOn(int channel);
- void writeRegisterSpecial(int note, uint8 value, int offset);
- uint8 readRegisterSpecial(int note, uint8 defaultValue, int offset);
- void setupNoteEnvelopeState(int note, int steps, int adjust);
- bool processNoteEnvelope(int note, int &instrumentValue);
-
- int _sfxTimer;
-
- int _sfxResource[3];
- int _sfxPriority[3];
-
- struct Channel {
- int state;
- const byte *currentOffset;
- const byte *startOffset;
- uint8 instrumentData[7];
- } _channels[11];
-
- uint8 _rndSeed;
- uint8 getRnd();
+ enum {
+ kNoteStatePreInit = -1,
+ kNoteStateAttack = 0,
+ kNoteStateDecay = 1,
+ kNoteStateSustain = 2,
+ kNoteStateRelease = 3,
+ kNoteStateOff = 4
+ };
struct Note {
int state;
@@ -164,14 +164,60 @@ private:
int bias;
int preIncrease;
int adjust;
-
+
struct Envelope {
int stepIncrease;
int step;
int stepCounter;
int timer;
} envelope;
- } _notes[22];
+ };
+
+ enum {
+ kChannelStateOff = 0,
+ kChannelStateParse = 1,
+ kChannelStatePlay = 2
+ };
+
+ struct Channel {
+ int state;
+ const byte *currentOffset;
+ const byte *startOffset;
+ uint8 instrumentData[7];
+
+ Note notes[2];
+
+ int hardwareChannel;
+ };
+
+ struct SfxSlot {
+ int resource;
+ int priority;
+
+ Channel channels[3];
+ } _sfx[3];
+
+ SfxSlot *allocateSfxSlot(int priority);
+ bool startSfx(SfxSlot *sfx, const byte *resource);
+ void stopSfx(SfxSlot *sfx);
+
+ void updateSfx();
+ void clearChannel(const Channel &channel);
+ void updateChannel(Channel *channel);
+ void parseSlot(Channel *channel);
+ void updateSlot(Channel *channel);
+ void parseNote(Note *note, const Channel &channel, const byte *offset);
+ bool processNote(Note *note, const Channel &channel, const byte *offset);
+ void noteOffOn(int channel);
+ void writeRegisterSpecial(int channel, uint8 value, int offset);
+ uint8 readRegisterSpecial(int channel, uint8 defaultValue, int offset);
+ void setupNoteEnvelopeState(Note *note, int steps, int adjust);
+ bool processNoteEnvelope(Note *note);
+
+ int _sfxTimer;
+
+ uint8 _rndSeed;
+ uint8 getRnd();
static const uint _noteBiasTable[7];
static const uint _numStepsTable[16];
diff --git a/engines/scumm/player_apple2.cpp b/engines/scumm/players/player_apple2.cpp
index 58e4f78a94..cba32bef2c 100644
--- a/engines/scumm/player_apple2.cpp
+++ b/engines/scumm/players/player_apple2.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -21,7 +21,7 @@
*/
#include "engines/engine.h"
-#include "scumm/player_apple2.h"
+#include "scumm/players/player_apple2.h"
#include "scumm/scumm.h"
namespace Scumm {
diff --git a/engines/scumm/player_apple2.h b/engines/scumm/players/player_apple2.h
index e1ec9d8946..8efb951f20 100644
--- a/engines/scumm/player_apple2.h
+++ b/engines/scumm/players/player_apple2.h
@@ -8,20 +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.
*
*/
-#ifndef SCUMM_PLAYER_APPLEII_H
-#define SCUMM_PLAYER_APPLEII_H
+#ifndef SCUMM_PLAYERS_PLAYER_APPLEII_H
+#define SCUMM_PLAYERS_PLAYER_APPLEII_H
#include "common/mutex.h"
#include "common/scummsys.h"
diff --git a/engines/scumm/player_mac.cpp b/engines/scumm/players/player_mac.cpp
index a60736df5e..fe15698494 100644
--- a/engines/scumm/player_mac.cpp
+++ b/engines/scumm/players/player_mac.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -24,7 +24,7 @@
#include "common/translation.h"
#include "engines/engine.h"
#include "gui/message.h"
-#include "scumm/player_mac.h"
+#include "scumm/players/player_mac.h"
#include "scumm/resource.h"
#include "scumm/scumm.h"
#include "scumm/imuse/imuse.h"
diff --git a/engines/scumm/player_mac.h b/engines/scumm/players/player_mac.h
index 09307b4e57..d247ce9883 100644
--- a/engines/scumm/player_mac.h
+++ b/engines/scumm/players/player_mac.h
@@ -8,20 +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.
*
*/
-#ifndef SCUMM_PLAYER_MAC_H
-#define SCUMM_PLAYER_MAC_H
+#ifndef SCUMM_PLAYERS_PLAYER_MAC_H
+#define SCUMM_PLAYERS_PLAYER_MAC_H
#include "common/scummsys.h"
#include "common/util.h"
diff --git a/engines/scumm/player_mod.cpp b/engines/scumm/players/player_mod.cpp
index 6411f0a17a..ced30ff193 100644
--- a/engines/scumm/player_mod.cpp
+++ b/engines/scumm/players/player_mod.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -21,7 +21,7 @@
*/
-#include "scumm/player_mod.h"
+#include "scumm/players/player_mod.h"
#include "audio/mixer.h"
#include "audio/rate.h"
#include "audio/decoders/raw.h"
diff --git a/engines/scumm/player_mod.h b/engines/scumm/players/player_mod.h
index 619d83541d..bb0c422090 100644
--- a/engines/scumm/player_mod.h
+++ b/engines/scumm/players/player_mod.h
@@ -8,20 +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.
*
*/
-#ifndef SCUMM_PLAYER_MOD_H
-#define SCUMM_PLAYER_MOD_H
+#ifndef SCUMM_PLAYERS_PLAYER_MOD_H
+#define SCUMM_PLAYERS_PLAYER_MOD_H
#include "scumm/scumm.h"
#include "audio/audiostream.h"
diff --git a/engines/scumm/player_nes.cpp b/engines/scumm/players/player_nes.cpp
index a6ffc9ed86..3b5adc4550 100644
--- a/engines/scumm/player_nes.cpp
+++ b/engines/scumm/players/player_nes.cpp
@@ -8,14 +8,14 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
- * aint32 with this program; if not, write to the Free Software
+ * along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*
*/
@@ -23,7 +23,7 @@
#ifndef DISABLE_NES_APU
#include "engines/engine.h"
-#include "scumm/player_nes.h"
+#include "scumm/players/player_nes.h"
#include "scumm/scumm.h"
#include "audio/mixer.h"
diff --git a/engines/scumm/player_nes.h b/engines/scumm/players/player_nes.h
index be1617e0f6..6c5efe9d38 100644
--- a/engines/scumm/player_nes.h
+++ b/engines/scumm/players/player_nes.h
@@ -8,20 +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.
*
*/
-#ifndef SCUMM_PLAYER_NES_H
-#define SCUMM_PLAYER_NES_H
+#ifndef SCUMM_PLAYERS_PLAYER_NES_H
+#define SCUMM_PLAYERS_PLAYER_NES_H
#include "common/scummsys.h"
#include "scumm/music.h"
diff --git a/engines/scumm/player_pce.cpp b/engines/scumm/players/player_pce.cpp
index 8d886ee008..89a3b07798 100644
--- a/engines/scumm/player_pce.cpp
+++ b/engines/scumm/players/player_pce.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -29,7 +29,7 @@
*/
#include <math.h>
-#include "player_pce.h"
+#include "scumm/players/player_pce.h"
#include "common/endian.h"
// PCE sound engine is only used by Loom, which requires 16bit color support
diff --git a/engines/scumm/player_pce.h b/engines/scumm/players/player_pce.h
index 427fb1ace6..5c9a2d201c 100644
--- a/engines/scumm/player_pce.h
+++ b/engines/scumm/players/player_pce.h
@@ -8,20 +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.
*
*/
-#ifndef SCUMM_PLAYER_PCE_H
-#define SCUMM_PLAYER_PCE_H
+#ifndef SCUMM_PLAYERS_PLAYER_PCE_H
+#define SCUMM_PLAYERS_PLAYER_PCE_H
#include "common/scummsys.h"
#include "common/mutex.h"
diff --git a/engines/scumm/player_sid.cpp b/engines/scumm/players/player_sid.cpp
index 7a609364e5..c7be112449 100644
--- a/engines/scumm/player_sid.cpp
+++ b/engines/scumm/players/player_sid.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -23,7 +23,7 @@
#ifndef DISABLE_SID
#include "engines/engine.h"
-#include "scumm/player_sid.h"
+#include "scumm/players/player_sid.h"
#include "scumm/scumm.h"
#include "audio/mixer.h"
diff --git a/engines/scumm/player_sid.h b/engines/scumm/players/player_sid.h
index 12e3573575..aa7e6be8c1 100644
--- a/engines/scumm/player_sid.h
+++ b/engines/scumm/players/player_sid.h
@@ -8,20 +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.
*
*/
-#ifndef SCUMM_PLAYER_SID_H
-#define SCUMM_PLAYER_SID_H
+#ifndef SCUMM_PLAYERS_PLAYER_SID_H
+#define SCUMM_PLAYERS_PLAYER_SID_H
#include "common/mutex.h"
#include "common/scummsys.h"
diff --git a/engines/scumm/player_towns.cpp b/engines/scumm/players/player_towns.cpp
index 33e3e40e39..5b8ca04021 100644
--- a/engines/scumm/player_towns.cpp
+++ b/engines/scumm/players/player_towns.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -22,7 +22,7 @@
#include "scumm/sound.h"
-#include "scumm/player_towns.h"
+#include "scumm/players/player_towns.h"
namespace Scumm {
diff --git a/engines/scumm/player_towns.h b/engines/scumm/players/player_towns.h
index 5c76d7c6c7..3736524ee2 100644
--- a/engines/scumm/player_towns.h
+++ b/engines/scumm/players/player_towns.h
@@ -8,20 +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.
*
*/
-#ifndef SCUMM_PLAYER_TOWNS_H
-#define SCUMM_PLAYER_TOWNS_H
+#ifndef SCUMM_PLAYERS_PLAYER_TOWNS_H
+#define SCUMM_PLAYERS_PLAYER_TOWNS_H
#include "scumm/scumm.h"
#include "scumm/imuse/imuse.h"
diff --git a/engines/scumm/player_v1.cpp b/engines/scumm/players/player_v1.cpp
index 8e784e9866..041f556120 100644
--- a/engines/scumm/player_v1.cpp
+++ b/engines/scumm/players/player_v1.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -22,7 +22,7 @@
#include "engines/engine.h"
-#include "scumm/player_v1.h"
+#include "scumm/players/player_v1.h"
#include "scumm/scumm.h"
namespace Scumm {
diff --git a/engines/scumm/player_v1.h b/engines/scumm/players/player_v1.h
index 9e6063adc9..3854922847 100644
--- a/engines/scumm/player_v1.h
+++ b/engines/scumm/players/player_v1.h
@@ -8,22 +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.
*
*/
-#ifndef SCUMM_PLAYER_V1_H
-#define SCUMM_PLAYER_V1_H
+#ifndef SCUMM_PLAYERS_PLAYER_V1_H
+#define SCUMM_PLAYERS_PLAYER_V1_H
-#include "scumm/player_v2.h"
+#include "scumm/players/player_v2.h"
namespace Scumm {
diff --git a/engines/scumm/player_v2.cpp b/engines/scumm/players/player_v2.cpp
index 6910f5e0db..f0aaa4a3be 100644
--- a/engines/scumm/player_v2.cpp
+++ b/engines/scumm/players/player_v2.cpp
@@ -8,19 +8,19 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public 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/player_v2.h"
+#include "scumm/players/player_v2.h"
#include "scumm/scumm.h"
namespace Scumm {
diff --git a/engines/scumm/player_v2.h b/engines/scumm/players/player_v2.h
index d932585b8e..b7a602d3a3 100644
--- a/engines/scumm/player_v2.h
+++ b/engines/scumm/players/player_v2.h
@@ -8,22 +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.
*
*/
-#ifndef SCUMM_PLAYER_V2_H
-#define SCUMM_PLAYER_V2_H
+#ifndef SCUMM_PLAYERS_PLAYER_V2_H
+#define SCUMM_PLAYERS_PLAYER_V2_H
-#include "scumm/player_v2base.h"
+#include "scumm/players/player_v2base.h"
namespace Scumm {
diff --git a/engines/scumm/player_v2a.cpp b/engines/scumm/players/player_v2a.cpp
index 07fc77b301..80a80a5584 100644
--- a/engines/scumm/player_v2a.cpp
+++ b/engines/scumm/players/player_v2a.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -21,7 +21,7 @@
*/
#include "engines/engine.h"
-#include "scumm/player_v2a.h"
+#include "scumm/players/player_v2a.h"
#include "scumm/scumm.h"
namespace Scumm {
diff --git a/engines/scumm/player_v2a.h b/engines/scumm/players/player_v2a.h
index fe20b43846..37333829d8 100644
--- a/engines/scumm/player_v2a.h
+++ b/engines/scumm/players/player_v2a.h
@@ -8,24 +8,24 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public 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_PLAYER_V2A_H
-#define SCUMM_PLAYER_V2A_H
+#ifndef SCUMM_PLAYERS_PLAYER_V2A_H
+#define SCUMM_PLAYERS_PLAYER_V2A_H
#include "common/scummsys.h"
#include "scumm/music.h"
-#include "scumm/player_mod.h"
+#include "scumm/players/player_mod.h"
class Mixer;
diff --git a/engines/scumm/player_v2base.cpp b/engines/scumm/players/player_v2base.cpp
index 0d3ad4b1b3..b1872f3fb3 100644
--- a/engines/scumm/player_v2base.cpp
+++ b/engines/scumm/players/player_v2base.cpp
@@ -8,19 +8,19 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public 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/player_v2base.h"
+#include "scumm/players/player_v2base.h"
#include "scumm/scumm.h"
#define FREQ_HZ 236 // Don't change!
diff --git a/engines/scumm/player_v2base.h b/engines/scumm/players/player_v2base.h
index eb9ed941ca..83b496af67 100644
--- a/engines/scumm/player_v2base.h
+++ b/engines/scumm/players/player_v2base.h
@@ -8,20 +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.
*
*/
-#ifndef SCUMM_PLAYER_V2BASE_H
-#define SCUMM_PLAYER_V2BASE_H
+#ifndef SCUMM_PLAYERS_PLAYER_V2BASE_H
+#define SCUMM_PLAYERS_PLAYER_V2BASE_H
#include "common/scummsys.h"
#include "common/mutex.h"
diff --git a/engines/scumm/player_v2cms.cpp b/engines/scumm/players/player_v2cms.cpp
index c1242e0645..08321932c3 100644
--- a/engines/scumm/player_v2cms.cpp
+++ b/engines/scumm/players/player_v2cms.cpp
@@ -8,19 +8,19 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public 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/player_v2cms.h"
+#include "scumm/players/player_v2cms.h"
#include "scumm/scumm.h"
#include "audio/mididrv.h"
#include "audio/mixer.h"
diff --git a/engines/scumm/player_v2cms.h b/engines/scumm/players/player_v2cms.h
index 905c7c141e..b68fa00198 100644
--- a/engines/scumm/player_v2cms.h
+++ b/engines/scumm/players/player_v2cms.h
@@ -8,22 +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.
*
*/
-#ifndef SCUMM_PLAYER_V2CMS_H
-#define SCUMM_PLAYER_V2CMS_H
+#ifndef SCUMM_PLAYERS_PLAYER_V2CMS_H
+#define SCUMM_PLAYERS_PLAYER_V2CMS_H
-#include "scumm/player_v2base.h" // for channel_data
+#include "scumm/players/player_v2base.h" // for channel_data
class CMSEmulator;
diff --git a/engines/scumm/player_v3a.cpp b/engines/scumm/players/player_v3a.cpp
index 472cd1252b..e6610a87d3 100644
--- a/engines/scumm/player_v3a.cpp
+++ b/engines/scumm/players/player_v3a.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -22,7 +22,7 @@
#include "engines/engine.h"
-#include "scumm/player_v3a.h"
+#include "scumm/players/player_v3a.h"
#include "scumm/scumm.h"
namespace Scumm {
diff --git a/engines/scumm/player_v3a.h b/engines/scumm/players/player_v3a.h
index 9449664e9b..7a4ebec8ab 100644
--- a/engines/scumm/player_v3a.h
+++ b/engines/scumm/players/player_v3a.h
@@ -8,24 +8,24 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public 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_PLAYER_V3A_H
-#define SCUMM_PLAYER_V3A_H
+#ifndef SCUMM_PLAYERS_PLAYER_V3A_H
+#define SCUMM_PLAYERS_PLAYER_V3A_H
#include "common/scummsys.h"
#include "scumm/music.h"
-#include "scumm/player_mod.h"
+#include "scumm/players/player_mod.h"
class Mixer;
diff --git a/engines/scumm/player_v3m.cpp b/engines/scumm/players/player_v3m.cpp
index bf65ec797f..bfe6144b6f 100644
--- a/engines/scumm/player_v3m.cpp
+++ b/engines/scumm/players/player_v3m.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -91,7 +91,7 @@
#include "common/translation.h"
#include "engines/engine.h"
#include "gui/message.h"
-#include "scumm/player_v3m.h"
+#include "scumm/players/player_v3m.h"
#include "scumm/scumm.h"
namespace Scumm {
diff --git a/engines/scumm/player_v3m.h b/engines/scumm/players/player_v3m.h
index 359bab32a9..81dda801fc 100644
--- a/engines/scumm/player_v3m.h
+++ b/engines/scumm/players/player_v3m.h
@@ -8,26 +8,26 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public 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_PLAYER_V3M_H
-#define SCUMM_PLAYER_V3M_H
+#ifndef SCUMM_PLAYERS_PLAYER_V3M_H
+#define SCUMM_PLAYERS_PLAYER_V3M_H
#include "common/scummsys.h"
#include "common/util.h"
#include "common/mutex.h"
#include "scumm/music.h"
-#include "scumm/player_mac.h"
+#include "scumm/players/player_mac.h"
#include "audio/audiostream.h"
#include "audio/mixer.h"
diff --git a/engines/scumm/player_v4a.cpp b/engines/scumm/players/player_v4a.cpp
index e791736f0e..bd8ce3f7ad 100644
--- a/engines/scumm/player_v4a.cpp
+++ b/engines/scumm/players/player_v4a.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -21,7 +21,7 @@
*/
#include "engines/engine.h"
-#include "scumm/player_v4a.h"
+#include "scumm/players/player_v4a.h"
#include "scumm/scumm.h"
#include "common/file.h"
diff --git a/engines/scumm/player_v4a.h b/engines/scumm/players/player_v4a.h
index d01c70f295..a746d59877 100644
--- a/engines/scumm/player_v4a.h
+++ b/engines/scumm/players/player_v4a.h
@@ -8,20 +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.
*
*/
-#ifndef SCUMM_PLAYER_V4A_H
-#define SCUMM_PLAYER_V4A_H
+#ifndef SCUMM_PLAYERS_PLAYER_V4A_H
+#define SCUMM_PLAYERS_PLAYER_V4A_H
#include "common/scummsys.h"
#include "common/util.h"
diff --git a/engines/scumm/player_v5m.cpp b/engines/scumm/players/player_v5m.cpp
index 500f3bbc40..5be92d024b 100644
--- a/engines/scumm/player_v5m.cpp
+++ b/engines/scumm/players/player_v5m.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -76,7 +76,7 @@
#include "common/translation.h"
#include "engines/engine.h"
#include "gui/message.h"
-#include "scumm/player_v5m.h"
+#include "scumm/players/player_v5m.h"
#include "scumm/scumm.h"
namespace Scumm {
diff --git a/engines/scumm/player_v5m.h b/engines/scumm/players/player_v5m.h
index b2079ee331..f60a3f9346 100644
--- a/engines/scumm/player_v5m.h
+++ b/engines/scumm/players/player_v5m.h
@@ -8,26 +8,26 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public 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_PLAYER_V5M_H
-#define SCUMM_PLAYER_V5M_H
+#ifndef SCUMM_PLAYERS_PLAYER_V5M_H
+#define SCUMM_PLAYERS_PLAYER_V5M_H
#include "common/scummsys.h"
#include "common/util.h"
#include "common/mutex.h"
#include "scumm/music.h"
-#include "scumm/player_mac.h"
+#include "scumm/players/player_mac.h"
#include "audio/audiostream.h"
#include "audio/mixer.h"
diff --git a/engines/scumm/proc3ARM.s b/engines/scumm/proc3ARM.s
index 75dd4b4a7f..70892faef2 100644
--- a/engines/scumm/proc3ARM.s
+++ b/engines/scumm/proc3ARM.s
@@ -28,14 +28,6 @@
.set space, 48
-.set _scaleIndexY, store_r14 + 28
-.set _numStrips, store_r14 + 24
-.set _palette, store_r14 + 20
-.set _shadow_table, store_r14 + 16
-.set _scaleIndexX, store_r14 + 12
-.set _scaleX, store_r14 + 8
-.set _height, store_r14 + 4
-
.set store_r14, space + 36
.set store_r11, space + 32
.set store_r10, space + 28
@@ -46,6 +38,14 @@
.set store_r5, space + 8
.set store_r4, space + 4
+.set _scaleIndexY, store_r14 + 28
+.set _numStrips, store_r14 + 24
+.set _palette, store_r14 + 20
+.set _shadow_table, store_r14 + 16
+.set _scaleIndexX, store_r14 + 12
+.set _scaleX, store_r14 + 8
+.set _height, store_r14 + 4
+
.set src, 48
.set height, 44
.set len, 40
@@ -71,6 +71,7 @@
@ <> = _palette
@ <> = _numstrips
@ <> = _scaleIndexY
+ .align 2
_ClassicProc3RendererShadowARM:
@ shadow20 = false
@ shadowed = true
diff --git a/engines/scumm/resource.cpp b/engines/scumm/resource.cpp
index 7c42b40f58..d4e4f43d5c 100644
--- a/engines/scumm/resource.cpp
+++ b/engines/scumm/resource.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/scumm/resource.h b/engines/scumm/resource.h
index aa7f809b76..6ae553901b 100644
--- a/engines/scumm/resource.h
+++ b/engines/scumm/resource.h
@@ -17,6 +17,7 @@
* You should have received a copy of the GNU General Public 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_RESOURCE_H
diff --git a/engines/scumm/resource_v2.cpp b/engines/scumm/resource_v2.cpp
index 927ee676a5..7ccdfa4780 100644
--- a/engines/scumm/resource_v2.cpp
+++ b/engines/scumm/resource_v2.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/scumm/resource_v3.cpp b/engines/scumm/resource_v3.cpp
index 55e42e389c..99e967cef1 100644
--- a/engines/scumm/resource_v3.cpp
+++ b/engines/scumm/resource_v3.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/scumm/resource_v4.cpp b/engines/scumm/resource_v4.cpp
index 6215e86b89..d017514c82 100644
--- a/engines/scumm/resource_v4.cpp
+++ b/engines/scumm/resource_v4.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/scumm/room.cpp b/engines/scumm/room.cpp
index 9ee8fb93a9..3828629997 100644
--- a/engines/scumm/room.cpp
+++ b/engines/scumm/room.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/scumm/saveload.cpp b/engines/scumm/saveload.cpp
index 3453e53a18..0aaff4c094 100644
--- a/engines/scumm/saveload.cpp
+++ b/engines/scumm/saveload.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -30,7 +30,7 @@
#include "scumm/charset.h"
#include "scumm/imuse_digi/dimuse.h"
#include "scumm/imuse/imuse.h"
-#include "scumm/player_towns.h"
+#include "scumm/players/player_towns.h"
#include "scumm/he/intern_he.h"
#include "scumm/object.h"
#include "scumm/resource.h"
@@ -148,7 +148,17 @@ void ScummEngine::requestLoad(int slot) {
_saveLoadFlag = 2; // 2 for load
}
-static bool saveSaveGameHeader(Common::OutSaveFile *out, SaveGameHeader &hdr) {
+Common::SeekableReadStream *ScummEngine::openSaveFileForReading(int slot, bool compat, Common::String &fileName) {
+ fileName = makeSavegameName(slot, compat);
+ return _saveFileMan->openForLoading(fileName);
+}
+
+Common::WriteStream *ScummEngine::openSaveFileForWriting(int slot, bool compat, Common::String &fileName) {
+ fileName = makeSavegameName(slot, compat);
+ return _saveFileMan->openForSaving(fileName);
+}
+
+static bool saveSaveGameHeader(Common::WriteStream *out, SaveGameHeader &hdr) {
hdr.type = MKTAG('S','C','V','M');
hdr.size = 0;
hdr.ver = CURRENT_VER;
@@ -160,7 +170,7 @@ static bool saveSaveGameHeader(Common::OutSaveFile *out, SaveGameHeader &hdr) {
return true;
}
-bool ScummEngine::saveState(Common::OutSaveFile *out, bool writeHeader) {
+bool ScummEngine::saveState(Common::WriteStream *out, bool writeHeader) {
SaveGameHeader hdr;
if (writeHeader) {
@@ -177,40 +187,32 @@ bool ScummEngine::saveState(Common::OutSaveFile *out, bool writeHeader) {
return true;
}
-bool ScummEngine::saveState(int slot, bool compat) {
- bool saveFailed;
- Common::String filename;
- Common::OutSaveFile *out;
+bool ScummEngine::saveState(int slot, bool compat, Common::String &filename) {
+ bool saveFailed = false;
pauseEngine(true);
- if (_saveLoadSlot == 255) {
- // Allow custom filenames for save game system in HE Games
- filename = _saveLoadFileName;
- } else {
- filename = makeSavegameName(slot, compat);
- }
- if (!(out = _saveFileMan->openForSaving(filename)))
- return false;
-
- saveFailed = false;
- if (!saveState(out))
+ Common::WriteStream *out = openSaveFileForWriting(slot, compat, filename);
+ if (!out) {
saveFailed = true;
+ } else {
+ if (!saveState(out))
+ saveFailed = true;
- out->finalize();
- if (out->err())
- saveFailed = true;
- delete out;
+ out->finalize();
+ if (out->err())
+ saveFailed = true;
+ delete out;
+ }
- if (saveFailed) {
+ if (saveFailed)
debug(1, "State save as '%s' FAILED", filename.c_str());
- return false;
- }
- debug(1, "State saved as '%s'", filename.c_str());
+ else
+ debug(1, "State saved as '%s'", filename.c_str());
pauseEngine(false);
- return true;
+ return !saveFailed;
}
@@ -307,18 +309,17 @@ static bool loadSaveGameHeader(Common::SeekableReadStream *in, SaveGameHeader &h
}
bool ScummEngine::loadState(int slot, bool compat) {
+ // Wrapper around the other variant
Common::String filename;
- Common::SeekableReadStream *in;
+ return loadState(slot, compat, filename);
+}
+
+bool ScummEngine::loadState(int slot, bool compat, Common::String &filename) {
SaveGameHeader hdr;
int sb, sh;
- if (_saveLoadSlot == 255) {
- // Allow custom filenames for save game system in HE Games
- filename = _saveLoadFileName;
- } else {
- filename = makeSavegameName(slot, compat);
- }
- if (!(in = _saveFileMan->openForLoading(filename)))
+ Common::SeekableReadStream *in = openSaveFileForReading(slot, compat, filename);
+ if (!in)
return false;
if (!loadSaveGameHeader(in, hdr)) {
@@ -634,100 +635,83 @@ bool ScummEngine::getSavegameName(int slot, Common::String &desc) {
return result;
}
-bool getSavegameName(Common::InSaveFile *in, Common::String &desc, int heversion) {
- SaveGameHeader hdr;
-
+namespace {
+bool loadAndCheckSaveGameHeader(Common::InSaveFile *in, int heversion, SaveGameHeader &hdr, Common::String *error = nullptr) {
if (!loadSaveGameHeader(in, hdr)) {
- desc = "Invalid savegame";
+ if (error) {
+ *error = "Invalid savegame";
+ }
return false;
}
- if (hdr.ver > CURRENT_VER)
+ if (hdr.ver > CURRENT_VER) {
hdr.ver = TO_LE_32(hdr.ver);
+ }
+
if (hdr.ver < VER(7) || hdr.ver > CURRENT_VER) {
- desc = "Invalid version";
+ if (error) {
+ *error = "Invalid version";
+ }
return false;
}
// We (deliberately) broke HE savegame compatibility at some point.
if (hdr.ver < VER(57) && heversion >= 60) {
- desc = "Unsupported version";
+ if (error) {
+ *error = "Unsupported version";
+ }
return false;
}
hdr.name[sizeof(hdr.name) - 1] = 0;
- desc = hdr.name;
return true;
}
+} // End of anonymous namespace
-Graphics::Surface *ScummEngine::loadThumbnailFromSlot(const char *target, int slot) {
- Common::SeekableReadStream *in;
+bool getSavegameName(Common::InSaveFile *in, Common::String &desc, int heversion) {
SaveGameHeader hdr;
- if (slot < 0)
- return 0;
-
- Common::String filename = ScummEngine::makeSavegameName(target, slot, false);
- if (!(in = g_system->getSavefileManager()->openForLoading(filename))) {
- return 0;
- }
-
- if (!loadSaveGameHeader(in, hdr)) {
- delete in;
- return 0;
+ if (!loadAndCheckSaveGameHeader(in, heversion, hdr, &desc)) {
+ return false;
}
- if (hdr.ver > CURRENT_VER)
- hdr.ver = TO_LE_32(hdr.ver);
- if (hdr.ver < VER(52)) {
- delete in;
- return 0;
- }
+ desc = hdr.name;
+ return true;
+}
- Graphics::Surface *thumb = 0;
- if (Graphics::checkThumbnailHeader(*in)) {
- thumb = Graphics::loadThumbnail(*in);
+bool ScummEngine::querySaveMetaInfos(const char *target, int slot, int heversion, Common::String &desc, Graphics::Surface *&thumbnail, SaveStateMetaInfos *&timeInfos) {
+ if (slot < 0) {
+ return false;
}
- delete in;
- return thumb;
-}
-
-bool ScummEngine::loadInfosFromSlot(const char *target, int slot, SaveStateMetaInfos *stuff) {
- Common::SeekableReadStream *in;
SaveGameHeader hdr;
+ const Common::String filename = ScummEngine::makeSavegameName(target, slot, false);
+ Common::ScopedPtr<Common::SeekableReadStream> in(g_system->getSavefileManager()->openForLoading(filename));
- if (slot < 0)
- return 0;
-
- Common::String filename = makeSavegameName(target, slot, false);
- if (!(in = g_system->getSavefileManager()->openForLoading(filename))) {
+ if (!in) {
return false;
}
- if (!loadSaveGameHeader(in, hdr)) {
- delete in;
+ if (!loadAndCheckSaveGameHeader(in.get(), heversion, hdr)) {
return false;
}
- if (hdr.ver > CURRENT_VER)
- hdr.ver = TO_LE_32(hdr.ver);
- if (hdr.ver < VER(56)) {
- delete in;
- return false;
- }
+ desc = hdr.name;
- if (!Graphics::skipThumbnail(*in)) {
- delete in;
- return false;
- }
+ if (hdr.ver > VER(52)) {
+ if (Graphics::checkThumbnailHeader(*in)) {
+ thumbnail = Graphics::loadThumbnail(*in);
+ }
- if (!loadInfos(in, stuff)) {
- delete in;
- return false;
+ if (hdr.ver > VER(57)) {
+ if (!loadInfos(in.get(), timeInfos)) {
+ return false;
+ }
+ } else {
+ timeInfos = nullptr;
+ }
}
- delete in;
return true;
}
@@ -781,7 +765,7 @@ bool ScummEngine::loadInfos(Common::SeekableReadStream *file, SaveStateMetaInfos
return true;
}
-void ScummEngine::saveInfos(Common::WriteStream* file) {
+void ScummEngine::saveInfos(Common::WriteStream *file) {
SaveInfoSection section;
section.type = MKTAG('I','N','F','O');
section.version = INFOSECTION_VERSION;
@@ -1258,7 +1242,9 @@ void ScummEngine::saveOrLoad(Serializer *s) {
}
s->saveUint16(0xFFFF); // End marker
} else {
- while ((type = (ResType)s->loadUint16()) != 0xFFFF) {
+ uint16 tmp;
+ while ((tmp = s->loadUint16()) != 0xFFFF) {
+ type = (ResType)tmp;
while ((idx = s->loadUint16()) != 0xFFFF) {
assert(idx < _res->_types[type].size());
loadResource(s, type, idx);
@@ -1446,7 +1432,9 @@ void ScummEngine::saveOrLoad(Serializer *s) {
}
s->saveByte(0xFF);
} else {
- while ((type = (ResType)s->loadByte()) != 0xFF) {
+ uint8 tmp;
+ while ((tmp = s->loadByte()) != 0xFF) {
+ type = (ResType)tmp;
idx = s->loadUint16();
_res->lock(type, idx);
}
diff --git a/engines/scumm/saveload.h b/engines/scumm/saveload.h
index c34be5816d..01ed21ece5 100644
--- a/engines/scumm/saveload.h
+++ b/engines/scumm/saveload.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -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 95
+#define CURRENT_VER 96
/**
* An auxillary macro, used to specify savegame versions. We use this instead
diff --git a/engines/scumm/script.cpp b/engines/scumm/script.cpp
index c8eabdd61c..2c672ccc89 100644
--- a/engines/scumm/script.cpp
+++ b/engines/scumm/script.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/scumm/script.h b/engines/scumm/script.h
index 74ffaaf426..972909dccc 100644
--- a/engines/scumm/script.h
+++ b/engines/scumm/script.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/scumm/script_v0.cpp b/engines/scumm/script_v0.cpp
index 361287d29f..a7999a2695 100644
--- a/engines/scumm/script_v0.cpp
+++ b/engines/scumm/script_v0.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/scumm/script_v2.cpp b/engines/scumm/script_v2.cpp
index 96d422d5bb..74d0aa2483 100644
--- a/engines/scumm/script_v2.cpp
+++ b/engines/scumm/script_v2.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/scumm/script_v3.cpp b/engines/scumm/script_v3.cpp
index b28d831101..00fc525ab5 100644
--- a/engines/scumm/script_v3.cpp
+++ b/engines/scumm/script_v3.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/scumm/script_v4.cpp b/engines/scumm/script_v4.cpp
index ec3ac4b00f..7ac21fea31 100644
--- a/engines/scumm/script_v4.cpp
+++ b/engines/scumm/script_v4.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/scumm/script_v5.cpp b/engines/scumm/script_v5.cpp
index 2d4c326b68..2cda9898af 100644
--- a/engines/scumm/script_v5.cpp
+++ b/engines/scumm/script_v5.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -27,7 +27,7 @@
#include "scumm/scumm_v3.h"
#include "scumm/scumm_v5.h"
#include "scumm/sound.h"
-#include "scumm/player_towns.h"
+#include "scumm/players/player_towns.h"
#include "scumm/util.h"
#include "scumm/verbs.h"
diff --git a/engines/scumm/script_v6.cpp b/engines/scumm/script_v6.cpp
index 6983c51f30..d2f4133f74 100644
--- a/engines/scumm/script_v6.cpp
+++ b/engines/scumm/script_v6.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/scumm/script_v8.cpp b/engines/scumm/script_v8.cpp
index f6f376f3c9..03a6d13886 100644
--- a/engines/scumm/script_v8.cpp
+++ b/engines/scumm/script_v8.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/scumm/scumm.cpp b/engines/scumm/scumm.cpp
index d1a3de94b8..34c231e5d4 100644
--- a/engines/scumm/scumm.cpp
+++ b/engines/scumm/scumm.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -45,26 +45,26 @@
#include "scumm/imuse_digi/dimuse.h"
#include "scumm/smush/smush_mixer.h"
#include "scumm/smush/smush_player.h"
-#include "scumm/player_towns.h"
+#include "scumm/players/player_towns.h"
#include "scumm/insane/insane.h"
#include "scumm/he/animation_he.h"
#include "scumm/he/intern_he.h"
#include "scumm/he/logic_he.h"
#include "scumm/he/sound_he.h"
#include "scumm/object.h"
-#include "scumm/player_ad.h"
-#include "scumm/player_nes.h"
-#include "scumm/player_sid.h"
-#include "scumm/player_pce.h"
-#include "scumm/player_apple2.h"
-#include "scumm/player_v1.h"
-#include "scumm/player_v2.h"
-#include "scumm/player_v2cms.h"
-#include "scumm/player_v2a.h"
-#include "scumm/player_v3a.h"
-#include "scumm/player_v3m.h"
-#include "scumm/player_v4a.h"
-#include "scumm/player_v5m.h"
+#include "scumm/players/player_ad.h"
+#include "scumm/players/player_nes.h"
+#include "scumm/players/player_sid.h"
+#include "scumm/players/player_pce.h"
+#include "scumm/players/player_apple2.h"
+#include "scumm/players/player_v1.h"
+#include "scumm/players/player_v2.h"
+#include "scumm/players/player_v2cms.h"
+#include "scumm/players/player_v2a.h"
+#include "scumm/players/player_v3a.h"
+#include "scumm/players/player_v3m.h"
+#include "scumm/players/player_v4a.h"
+#include "scumm/players/player_v5m.h"
#include "scumm/resource.h"
#include "scumm/he/resource_he.h"
#include "scumm/scumm_v0.h"
@@ -205,7 +205,7 @@ ScummEngine::ScummEngine(OSystem *syst, const DetectorResult &dr)
_lastInputScriptTime = 0;
_bootParam = 0;
_dumpScripts = false;
- _debugMode = 0;
+ _debugMode = false;
_objectOwnerTable = NULL;
_objectRoomTable = NULL;
_objectStateTable = NULL;
@@ -2281,7 +2281,7 @@ void ScummEngine::scummLoop_updateScummVars() {
VAR(VAR_MOUSE_Y) = _mouse.y;
if (VAR_DEBUGMODE != 0xFF) {
// This is NOT for the Mac version of Indy3/Loom
- VAR(VAR_DEBUGMODE) = _debugMode;
+ VAR(VAR_DEBUGMODE) = (_debugMode ? 1 : 0);
}
} else if (_game.version >= 1) {
// We use shifts below instead of dividing by V12_X_MULTIPLIER resp.
@@ -2307,15 +2307,16 @@ void ScummEngine::scummLoop_handleSaveLoad() {
if (_game.version == 8 && _saveTemporaryState)
VAR(VAR_GAME_LOADED) = 0;
+ Common::String filename;
if (_saveLoadFlag == 1) {
- success = saveState(_saveLoadSlot, _saveTemporaryState);
+ success = saveState(_saveLoadSlot, _saveTemporaryState, filename);
if (!success)
errMsg = _("Failed to save game state to file:\n\n%s");
if (success && _saveTemporaryState && VAR_GAME_LOADED != 0xFF && _game.version <= 7)
VAR(VAR_GAME_LOADED) = 201;
} else {
- success = loadState(_saveLoadSlot, _saveTemporaryState);
+ success = loadState(_saveLoadSlot, _saveTemporaryState, filename);
if (!success)
errMsg = _("Failed to load game state from file:\n\n%s");
@@ -2323,7 +2324,6 @@ void ScummEngine::scummLoop_handleSaveLoad() {
VAR(VAR_GAME_LOADED) = (_game.version == 8) ? 1 : 203;
}
- Common::String filename = makeSavegameName(_saveLoadSlot, _saveTemporaryState);
if (!success) {
displayMessage(0, errMsg, filename.c_str());
} else if (_saveLoadFlag == 1 && _saveLoadSlot != 0 && !_saveTemporaryState) {
diff --git a/engines/scumm/scumm.h b/engines/scumm/scumm.h
index ca05c90936..be5a83d8c9 100644
--- a/engines/scumm/scumm.h
+++ b/engines/scumm/scumm.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -586,7 +586,7 @@ protected:
bool _dumpScripts;
bool _hexdumpScripts;
bool _showStack;
- uint16 _debugMode;
+ bool _debugMode;
// Save/Load class - some of this may be GUI
byte _saveLoadFlag, _saveLoadSlot;
@@ -595,14 +595,18 @@ protected:
Common::String _saveLoadFileName;
Common::String _saveLoadDescription;
- bool saveState(Common::OutSaveFile *out, bool writeHeader = true);
- bool saveState(int slot, bool compat);
+ bool saveState(Common::WriteStream *out, bool writeHeader = true);
+ bool saveState(int slot, bool compat, Common::String &fileName);
bool loadState(int slot, bool compat);
+ bool loadState(int slot, bool compat, Common::String &fileName);
virtual void saveOrLoad(Serializer *s);
void saveResource(Serializer *ser, ResType type, ResId idx);
void loadResource(Serializer *ser, ResType type, ResId idx);
void loadResourceOLD(Serializer *ser, ResType type, ResId idx); // "Obsolete"
+ virtual Common::SeekableReadStream *openSaveFileForReading(int slot, bool compat, Common::String &fileName);
+ virtual Common::WriteStream *openSaveFileForWriting(int slot, bool compat, Common::String &fileName);
+
Common::String makeSavegameName(int slot, bool temporary) const {
return makeSavegameName(_targetName, slot, temporary);
}
@@ -618,17 +622,14 @@ public:
void requestSave(int slot, const Common::String &name);
void requestLoad(int slot);
+ Common::String getTargetName() const { return _targetName; }
+
// thumbnail + info stuff
public:
- Graphics::Surface *loadThumbnailFromSlot(int slot) {
- return loadThumbnailFromSlot(_targetName.c_str(), slot);
- }
- static Graphics::Surface *loadThumbnailFromSlot(const char *target, int slot);
-
- static bool loadInfosFromSlot(const char *target, int slot, SaveStateMetaInfos *stuff);
+ static bool querySaveMetaInfos(const char *target, int slot, int heversion, Common::String &desc, Graphics::Surface *&thumbnail, SaveStateMetaInfos *&timeInfos);
protected:
- void saveInfos(Common::WriteStream* file);
+ void saveInfos(Common::WriteStream *file);
static bool loadInfos(Common::SeekableReadStream *file, SaveStateMetaInfos *stuff);
protected:
diff --git a/engines/scumm/scumm_v0.h b/engines/scumm/scumm_v0.h
index 7f532c04d7..80d047ab9f 100644
--- a/engines/scumm/scumm_v0.h
+++ b/engines/scumm/scumm_v0.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/scumm/scumm_v2.h b/engines/scumm/scumm_v2.h
index 316a08d325..e438008c1e 100644
--- a/engines/scumm/scumm_v2.h
+++ b/engines/scumm/scumm_v2.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/scumm/scumm_v3.h b/engines/scumm/scumm_v3.h
index f11ca16a50..29f170e7ea 100644
--- a/engines/scumm/scumm_v3.h
+++ b/engines/scumm/scumm_v3.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/scumm/scumm_v4.h b/engines/scumm/scumm_v4.h
index e21e4b26ae..28f619ceaa 100644
--- a/engines/scumm/scumm_v4.h
+++ b/engines/scumm/scumm_v4.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/scumm/scumm_v5.h b/engines/scumm/scumm_v5.h
index 0eef04b8de..1bd38d68f2 100644
--- a/engines/scumm/scumm_v5.h
+++ b/engines/scumm/scumm_v5.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/scumm/scumm_v6.h b/engines/scumm/scumm_v6.h
index c42a49a9f5..73268f6f33 100644
--- a/engines/scumm/scumm_v6.h
+++ b/engines/scumm/scumm_v6.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/scumm/scumm_v7.h b/engines/scumm/scumm_v7.h
index 6fb98a0af7..b8830be810 100644
--- a/engines/scumm/scumm_v7.h
+++ b/engines/scumm/scumm_v7.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/scumm/scumm_v8.h b/engines/scumm/scumm_v8.h
index 43bfad1fc9..714a7d2dcb 100644
--- a/engines/scumm/scumm_v8.h
+++ b/engines/scumm/scumm_v8.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/scumm/smush/channel.cpp b/engines/scumm/smush/channel.cpp
index 7f9ca70080..6d86215626 100644
--- a/engines/scumm/smush/channel.cpp
+++ b/engines/scumm/smush/channel.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/scumm/smush/channel.h b/engines/scumm/smush/channel.h
index 839aeaa970..dc2219bbed 100644
--- a/engines/scumm/smush/channel.h
+++ b/engines/scumm/smush/channel.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/scumm/smush/codec1.cpp b/engines/scumm/smush/codec1.cpp
index 79d97d2ce3..0ec34e0266 100644
--- a/engines/scumm/smush/codec1.cpp
+++ b/engines/scumm/smush/codec1.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/scumm/smush/codec37.cpp b/engines/scumm/smush/codec37.cpp
index 344057e3ac..aab70ab876 100644
--- a/engines/scumm/smush/codec37.cpp
+++ b/engines/scumm/smush/codec37.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/scumm/smush/codec37.h b/engines/scumm/smush/codec37.h
index bcb858b0b5..2d34655f24 100644
--- a/engines/scumm/smush/codec37.h
+++ b/engines/scumm/smush/codec37.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/scumm/smush/codec47.cpp b/engines/scumm/smush/codec47.cpp
index 4b503a0a38..5bac85ee82 100644
--- a/engines/scumm/smush/codec47.cpp
+++ b/engines/scumm/smush/codec47.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/scumm/smush/codec47.h b/engines/scumm/smush/codec47.h
index 0e5156db5c..1621db6996 100644
--- a/engines/scumm/smush/codec47.h
+++ b/engines/scumm/smush/codec47.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/scumm/smush/codec47ARM.s b/engines/scumm/smush/codec47ARM.s
index a91f932558..53e9143f39 100644
--- a/engines/scumm/smush/codec47ARM.s
+++ b/engines/scumm/smush/codec47ARM.s
@@ -28,6 +28,7 @@
.global _ARM_Smush_decode2
+ .align 2
_ARM_Smush_decode2:
@ r0 = dst
@ r1 = src
diff --git a/engines/scumm/smush/imuse_channel.cpp b/engines/scumm/smush/imuse_channel.cpp
index f2c4f993e4..461aff962e 100644
--- a/engines/scumm/smush/imuse_channel.cpp
+++ b/engines/scumm/smush/imuse_channel.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/scumm/smush/saud_channel.cpp b/engines/scumm/smush/saud_channel.cpp
index 2f1ca512f0..ca64b38556 100644
--- a/engines/scumm/smush/saud_channel.cpp
+++ b/engines/scumm/smush/saud_channel.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/scumm/smush/smush_font.cpp b/engines/scumm/smush/smush_font.cpp
index 5cfa0ea519..4c04901b42 100644
--- a/engines/scumm/smush/smush_font.cpp
+++ b/engines/scumm/smush/smush_font.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/scumm/smush/smush_font.h b/engines/scumm/smush/smush_font.h
index 5de4a725c6..9cfea5a26d 100644
--- a/engines/scumm/smush/smush_font.h
+++ b/engines/scumm/smush/smush_font.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/scumm/smush/smush_mixer.cpp b/engines/scumm/smush/smush_mixer.cpp
index d2b4b5a482..42e8f645be 100644
--- a/engines/scumm/smush/smush_mixer.cpp
+++ b/engines/scumm/smush/smush_mixer.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/scumm/smush/smush_mixer.h b/engines/scumm/smush/smush_mixer.h
index 75a8889242..18ec7f96fb 100644
--- a/engines/scumm/smush/smush_mixer.h
+++ b/engines/scumm/smush/smush_mixer.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/scumm/smush/smush_player.cpp b/engines/scumm/smush/smush_player.cpp
index ce098f07aa..7617fc541f 100644
--- a/engines/scumm/smush/smush_player.cpp
+++ b/engines/scumm/smush/smush_player.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/scumm/smush/smush_player.h b/engines/scumm/smush/smush_player.h
index 5a2024060e..81c498a516 100644
--- a/engines/scumm/smush/smush_player.h
+++ b/engines/scumm/smush/smush_player.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/scumm/sound.cpp b/engines/scumm/sound.cpp
index aaf7f90aca..01bdefc7c0 100644
--- a/engines/scumm/sound.cpp
+++ b/engines/scumm/sound.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -30,7 +30,7 @@
#include "scumm/file.h"
#include "scumm/imuse/imuse.h"
#include "scumm/imuse_digi/dimuse.h"
-#include "scumm/player_towns.h"
+#include "scumm/players/player_towns.h"
#include "scumm/resource.h"
#include "scumm/scumm.h"
#include "scumm/sound.h"
diff --git a/engines/scumm/sound.h b/engines/scumm/sound.h
index 48f28d51ff..a96d2b8ed5 100644
--- a/engines/scumm/sound.h
+++ b/engines/scumm/sound.h
@@ -17,6 +17,7 @@
* You should have received a copy of the GNU General Public 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_SOUND_H
diff --git a/engines/scumm/string.cpp b/engines/scumm/string.cpp
index 975307d0d0..d60c4c6a50 100644
--- a/engines/scumm/string.cpp
+++ b/engines/scumm/string.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/scumm/vars.cpp b/engines/scumm/vars.cpp
index 9c90d7575d..79d7ed03da 100644
--- a/engines/scumm/vars.cpp
+++ b/engines/scumm/vars.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -805,7 +805,7 @@ void ScummEngine::resetScummVars() {
}
if (VAR_DEBUGMODE != 0xFF) {
- VAR(VAR_DEBUGMODE) = _debugMode;
+ VAR(VAR_DEBUGMODE) = (_debugMode ? 1 : 0);
if (_game.heversion >= 80 && _debugMode)
VAR(85) = 1;
}
diff --git a/engines/scumm/verbs.cpp b/engines/scumm/verbs.cpp
index 0d0f6cdb95..fdb98a8019 100644
--- a/engines/scumm/verbs.cpp
+++ b/engines/scumm/verbs.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/scumm/verbs.h b/engines/scumm/verbs.h
index 0aa008b4de..a0b5f69231 100644
--- a/engines/scumm/verbs.h
+++ b/engines/scumm/verbs.h
@@ -17,6 +17,7 @@
* You should have received a copy of the GNU General Public 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_VERBS_H
diff --git a/engines/sky/autoroute.cpp b/engines/sky/autoroute.cpp
index ab791cb066..877090f6b8 100644
--- a/engines/sky/autoroute.cpp
+++ b/engines/sky/autoroute.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/sky/autoroute.h b/engines/sky/autoroute.h
index 8721ba6c54..91d4846ef8 100644
--- a/engines/sky/autoroute.h
+++ b/engines/sky/autoroute.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/sky/configure.engine b/engines/sky/configure.engine
new file mode 100644
index 0000000000..32b84849cb
--- /dev/null
+++ b/engines/sky/configure.engine
@@ -0,0 +1,3 @@
+# This file is included from the main "configure" script
+# add_engine [name] [desc] [build-by-default] [subengines] [base games] [deps]
+add_engine sky "Beneath a Steel Sky" yes
diff --git a/engines/sky/control.cpp b/engines/sky/control.cpp
index 57c1f6b48b..dfdd765120 100644
--- a/engines/sky/control.cpp
+++ b/engines/sky/control.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/sky/control.h b/engines/sky/control.h
index 1380d29ee2..44591f299d 100644
--- a/engines/sky/control.h
+++ b/engines/sky/control.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/sky/debug.cpp b/engines/sky/debug.cpp
index a417bc2ece..d663bd206d 100644
--- a/engines/sky/debug.cpp
+++ b/engines/sky/debug.cpp
@@ -1087,14 +1087,14 @@ void Debug::mcode(uint32 mcode, uint32 a, uint32 b, uint32 c) {
Debugger::Debugger(Logic *logic, Mouse *mouse, Screen *screen, SkyCompact *skyCompact)
: GUI::Debugger(), _logic(logic), _mouse(mouse), _screen(screen), _skyCompact(skyCompact), _showGrid(false) {
- DCmd_Register("info", WRAP_METHOD(Debugger, Cmd_Info));
- DCmd_Register("showgrid", WRAP_METHOD(Debugger, Cmd_ShowGrid));
- DCmd_Register("reloadgrid", WRAP_METHOD(Debugger, Cmd_ReloadGrid));
- DCmd_Register("compact", WRAP_METHOD(Debugger, Cmd_ShowCompact));
- DCmd_Register("logiccmd", WRAP_METHOD(Debugger, Cmd_LogicCommand));
- DCmd_Register("scriptvar", WRAP_METHOD(Debugger, Cmd_ScriptVar));
- DCmd_Register("section", WRAP_METHOD(Debugger, Cmd_Section));
- DCmd_Register("logiclist", WRAP_METHOD(Debugger, Cmd_LogicList));
+ registerCmd("info", WRAP_METHOD(Debugger, Cmd_Info));
+ registerCmd("showgrid", WRAP_METHOD(Debugger, Cmd_ShowGrid));
+ registerCmd("reloadgrid", WRAP_METHOD(Debugger, Cmd_ReloadGrid));
+ registerCmd("compact", WRAP_METHOD(Debugger, Cmd_ShowCompact));
+ registerCmd("logiccmd", WRAP_METHOD(Debugger, Cmd_LogicCommand));
+ registerCmd("scriptvar", WRAP_METHOD(Debugger, Cmd_ScriptVar));
+ registerCmd("section", WRAP_METHOD(Debugger, Cmd_Section));
+ registerCmd("logiclist", WRAP_METHOD(Debugger, Cmd_LogicList));
}
Debugger::~Debugger() {} // we need this here for __SYMBIAN32__
@@ -1108,16 +1108,25 @@ void Debugger::postEnter() {
_mouse->resetCursor();
}
+static bool isNumeric(const char *arg) {
+ const char *str = arg;
+ bool retVal = true;
+ while (retVal && (*str != '\0')) {
+ retVal = Common::isDigit(*str++);
+ }
+ return retVal;
+}
+
bool Debugger::Cmd_ShowGrid(int argc, const char **argv) {
_showGrid = !_showGrid;
- DebugPrintf("Show grid: %s\n", _showGrid ? "On" : "Off");
+ debugPrintf("Show grid: %s\n", _showGrid ? "On" : "Off");
if (!_showGrid) _screen->forceRefresh();
return true;
}
bool Debugger::Cmd_ReloadGrid(int argc, const char **argv) {
_logic->_skyGrid->loadGrids();
- DebugPrintf("Grid reloaded\n");
+ debugPrintf("Grid reloaded\n");
return true;
}
@@ -1134,35 +1143,35 @@ void Debugger::dumpCompact(uint16 cptId) {
Compact *cpt = _skyCompact->fetchCptInfo(cptId, &size, &type, name);
if (type == COMPACT) {
- DebugPrintf("Compact %s: id = %04X, section %d, id %d\n", name, cptId, cptId >> 12, cptId & 0xFFF);
- DebugPrintf("logic : %04X: %s\n", cpt->logic, (cpt->logic <= 16) ? logicTypes[cpt->logic] : "unknown");
- DebugPrintf("status : %04X\n", cpt->status);
- DebugPrintf(" : background : %s\n", noYes[(cpt->status & ST_BACKGROUND) >> 0]);
- DebugPrintf(" : foreground : %s\n", noYes[(cpt->status & ST_FOREGROUND) >> 1]);
- DebugPrintf(" : sort list : %s\n", noYes[(cpt->status & ST_SORT) >> 2]);
- DebugPrintf(" : recreate : %s\n", noYes[(cpt->status & ST_RECREATE) >> 3]);
- DebugPrintf(" : mouse : %s\n", noYes[(cpt->status & ST_MOUSE) >> 4]);
- DebugPrintf(" : collision : %s\n", noYes[(cpt->status & ST_COLLISION) >> 5]);
- DebugPrintf(" : logic : %s\n", noYes[(cpt->status & ST_LOGIC) >> 6]);
- DebugPrintf(" : on grid : %s\n", noYes[(cpt->status & ST_GRID_PLOT) >> 7]);
- DebugPrintf(" : ar priority : %s\n", noYes[(cpt->status & ST_AR_PRIORITY) >> 8]);
- DebugPrintf("sync : %04X\n", cpt->sync);
- DebugPrintf("screen : %d\n", cpt->screen);
+ debugPrintf("Compact %s: id = %04X, section %d, id %d\n", name, cptId, cptId >> 12, cptId & 0xFFF);
+ debugPrintf("logic : %04X: %s\n", cpt->logic, (cpt->logic <= 16) ? logicTypes[cpt->logic] : "unknown");
+ debugPrintf("status : %04X\n", cpt->status);
+ debugPrintf(" : background : %s\n", noYes[(cpt->status & ST_BACKGROUND) >> 0]);
+ debugPrintf(" : foreground : %s\n", noYes[(cpt->status & ST_FOREGROUND) >> 1]);
+ debugPrintf(" : sort list : %s\n", noYes[(cpt->status & ST_SORT) >> 2]);
+ debugPrintf(" : recreate : %s\n", noYes[(cpt->status & ST_RECREATE) >> 3]);
+ debugPrintf(" : mouse : %s\n", noYes[(cpt->status & ST_MOUSE) >> 4]);
+ debugPrintf(" : collision : %s\n", noYes[(cpt->status & ST_COLLISION) >> 5]);
+ debugPrintf(" : logic : %s\n", noYes[(cpt->status & ST_LOGIC) >> 6]);
+ debugPrintf(" : on grid : %s\n", noYes[(cpt->status & ST_GRID_PLOT) >> 7]);
+ debugPrintf(" : ar priority : %s\n", noYes[(cpt->status & ST_AR_PRIORITY) >> 8]);
+ debugPrintf("sync : %04X\n", cpt->sync);
+ debugPrintf("screen : %d\n", cpt->screen);
_skyCompact->fetchCptInfo(cpt->place, NULL, NULL, name);
- DebugPrintf("place : %04X: %s\n", cpt->place, name);
+ debugPrintf("place : %04X: %s\n", cpt->place, name);
_skyCompact->fetchCptInfo(cpt->getToTableId, NULL, NULL, name);
- DebugPrintf("get to tab : %04X: %s\n", cpt->getToTableId, name);
- DebugPrintf("x/y : %d/%d\n", cpt->xcood, cpt->ycood);
+ debugPrintf("get to tab : %04X: %s\n", cpt->getToTableId, name);
+ debugPrintf("x/y : %d/%d\n", cpt->xcood, cpt->ycood);
} else {
- DebugPrintf("Can't dump binary data\n");
+ debugPrintf("Can't dump binary data\n");
}
}
bool Debugger::Cmd_ShowCompact(int argc, const char **argv) {
if (argc < 2) {
- DebugPrintf("Example: \"%s foster\" dumps compact \"foster\"\n", argv[0]);
- DebugPrintf("Example: \"%s list 1\" lists all compacts from section 1\n", argv[0]);
- DebugPrintf("Example: \"%s list 1 all\" lists all entities from section 1\n", argv[0]);
+ debugPrintf("Example: \"%s foster\" dumps compact \"foster\"\n", argv[0]);
+ debugPrintf("Example: \"%s list 1\" lists all compacts from section 1\n", argv[0]);
+ debugPrintf("Example: \"%s list 1 all\" lists all entities from section 1\n", argv[0]);
return true;
}
@@ -1172,7 +1181,7 @@ bool Debugger::Cmd_ShowCompact(int argc, const char **argv) {
if (argc >= 3) {
sectionNumber = atoi(argv[2]);
if (sectionNumber >= _skyCompact->giveNumDataLists()) {
- DebugPrintf("Section number %d does not exist\n", sectionNumber);
+ debugPrintf("Section number %d does not exist\n", sectionNumber);
return true;
}
if ((argc == 4) && (scumm_stricmp(argv[3], "all") == 0))
@@ -1180,14 +1189,14 @@ bool Debugger::Cmd_ShowCompact(int argc, const char **argv) {
}
for (int sec = 0; sec < _skyCompact->giveNumDataLists(); sec++) {
if ((sectionNumber == -1) || (sectionNumber == sec)) {
- DebugPrintf("Compacts in section %d:\n", sec);
+ debugPrintf("Compacts in section %d:\n", sec);
if (showAll) {
char line[256];
char *linePos = line;
for (int cpt = 0; cpt < _skyCompact->giveDataListLen(sec); cpt++) {
if (cpt != 0) {
if ((cpt % 3) == 0) {
- DebugPrintf("%s\n", line);
+ debugPrintf("%s\n", line);
linePos = line;
} else
linePos += sprintf(linePos, ", ");
@@ -1199,7 +1208,7 @@ bool Debugger::Cmd_ShowCompact(int argc, const char **argv) {
linePos += sprintf(linePos, "%04X: %10s %22s", cptId, _skyCompact->nameForType(type), name);
}
if (linePos != line)
- DebugPrintf("%s\n", line);
+ debugPrintf("%s\n", line);
} else {
for (int cpt = 0; cpt < _skyCompact->giveDataListLen(sec); cpt++) {
uint16 cptId = (uint16)((sec << 12) | cpt);
@@ -1207,7 +1216,7 @@ bool Debugger::Cmd_ShowCompact(int argc, const char **argv) {
char name[256];
_skyCompact->fetchCptInfo(cptId, &size, &type, name);
if (type == COMPACT)
- DebugPrintf("%04X: %s\n", cptId, name);
+ debugPrintf("%04X: %s\n", cptId, name);
}
}
}
@@ -1215,7 +1224,7 @@ bool Debugger::Cmd_ShowCompact(int argc, const char **argv) {
} else {
uint16 cptId = _skyCompact->findCptId(argv[1]);
if (cptId == 0)
- DebugPrintf("Unknown compact: '%s'\n", argv[1]);
+ debugPrintf("Unknown compact: '%s'\n", argv[1]);
else
dumpCompact(cptId);
}
@@ -1224,7 +1233,7 @@ bool Debugger::Cmd_ShowCompact(int argc, const char **argv) {
bool Debugger::Cmd_LogicCommand(int argc, const char **argv) {
if (argc < 2) {
- DebugPrintf("Example: %s fn_printf 42\n", argv[0]);
+ debugPrintf("Example: %s fn_printf 42\n", argv[0]);
return true;
}
@@ -1232,7 +1241,7 @@ bool Debugger::Cmd_LogicCommand(int argc, const char **argv) {
if (0 == strcmp(argv[1], "list")) {
for (int i = 0; i < numMCodes; ++i) {
- DebugPrintf("%s\n", mcodes[i]);
+ debugPrintf("%s\n", mcodes[i]);
}
return true;
}
@@ -1255,21 +1264,21 @@ bool Debugger::Cmd_LogicCommand(int argc, const char **argv) {
}
}
- DebugPrintf("Unknown function: '%s'\n", argv[1]);
+ debugPrintf("Unknown function: '%s'\n", argv[1]);
return true;
}
bool Debugger::Cmd_Info(int argc, const char **argv) {
- DebugPrintf("Beneath a Steel Sky version: 0.0%d\n", SkyEngine::_systemVars.gameVersion);
- DebugPrintf("Speech: %s\n", (SkyEngine::_systemVars.systemFlags & SF_ALLOW_SPEECH) ? "on" : "off");
- DebugPrintf("Text : %s\n", (SkyEngine::_systemVars.systemFlags & SF_ALLOW_TEXT) ? "on" : "off");
+ debugPrintf("Beneath a Steel Sky version: 0.0%d\n", SkyEngine::_systemVars.gameVersion);
+ debugPrintf("Speech: %s\n", (SkyEngine::_systemVars.systemFlags & SF_ALLOW_SPEECH) ? "on" : "off");
+ debugPrintf("Text : %s\n", (SkyEngine::_systemVars.systemFlags & SF_ALLOW_TEXT) ? "on" : "off");
return true;
}
bool Debugger::Cmd_ScriptVar(int argc, const char **argv) {
if (argc < 2) {
- DebugPrintf("Example: %s lamb_friend <value>\n", argv[0]);
+ debugPrintf("Example: %s lamb_friend <value>\n", argv[0]);
return true;
}
@@ -1277,7 +1286,7 @@ bool Debugger::Cmd_ScriptVar(int argc, const char **argv) {
if (0 == strcmp(argv[1], "list")) {
for (int i = 0; i < numScriptVars; ++i) {
- DebugPrintf("%s\n", scriptVars[i]);
+ debugPrintf("%s\n", scriptVars[i]);
}
return true;
}
@@ -1287,53 +1296,51 @@ bool Debugger::Cmd_ScriptVar(int argc, const char **argv) {
if (argc == 3) {
Logic::_scriptVariables[i] = atoi(argv[2]);
}
- DebugPrintf("%s = %d\n", argv[1], Logic::_scriptVariables[i]);
+ debugPrintf("%s = %d\n", argv[1], Logic::_scriptVariables[i]);
return true;
}
}
- DebugPrintf("Unknown ScriptVar: '%s'\n", argv[1]);
+ debugPrintf("Unknown ScriptVar: '%s'\n", argv[1]);
return true;
}
bool Debugger::Cmd_Section(int argc, const char **argv) {
- if (argc < 2) {
- DebugPrintf("Example: %s 4\n", argv[0]);
- return true;
- }
-
- const int baseId[] = { START_ONE, START_S6, START_29, START_SC31, START_SC66, START_SC90, START_SC81 };
- int section = atoi(argv[1]);
+ if (argc == 2 && isNumeric(argv[1])) {
+ const int baseId[] = { START_ONE, START_S6, START_29, START_SC31, START_SC66, START_SC90, START_SC81 };
+ int section = atoi(argv[1]);
- if (section >= 0 && section <= 6) {
- _logic->fnEnterSection(section == 6 ? 4 : section, 0, 0);
- _logic->fnAssignBase(ID_FOSTER, baseId[section], 0);
- _skyCompact->fetchCpt(ID_FOSTER)->megaSet = 0;
+ if (section >= 0 && section <= 6) {
+ _logic->fnEnterSection(section == 6 ? 4 : section, 0, 0);
+ _logic->fnAssignBase(ID_FOSTER, baseId[section], 0);
+ _skyCompact->fetchCpt(ID_FOSTER)->megaSet = 0;
+ } else {
+ debugPrintf("Section %d is out of range (range: %d - %d)\n", section, 0, 6);
+ }
} else {
- DebugPrintf("Unknown section '%s'\n", argv[1]);
+ debugPrintf("Example: %s 4\n", argv[0]);
}
-
return true;
}
bool Debugger::Cmd_LogicList(int argc, const char **argv) {
if (argc != 1)
- DebugPrintf("%s does not expect any parameters\n", argv[0]);
+ debugPrintf("%s does not expect any parameters\n", argv[0]);
char cptName[256];
uint16 numElems, type;
uint16 *logicList = (uint16 *)_skyCompact->fetchCptInfo(Logic::_scriptVariables[LOGIC_LIST_NO], &numElems, &type, cptName);
- DebugPrintf("Current LogicList: %04X (%s)\n", Logic::_scriptVariables[LOGIC_LIST_NO], cptName);
+ debugPrintf("Current LogicList: %04X (%s)\n", Logic::_scriptVariables[LOGIC_LIST_NO], cptName);
while (*logicList != 0) {
if (*logicList == 0xFFFF) {
uint16 newList = logicList[1];
logicList = (uint16 *)_skyCompact->fetchCptInfo(newList, &numElems, &type, cptName);
- DebugPrintf("New List: %04X (%s)\n", newList, cptName);
+ debugPrintf("New List: %04X (%s)\n", newList, cptName);
} else {
_skyCompact->fetchCptInfo(*logicList, &numElems, &type, cptName);
- DebugPrintf(" Cpt %04X (%s) (%s)\n", *logicList, cptName, _skyCompact->nameForType(type));
+ debugPrintf(" Cpt %04X (%s) (%s)\n", *logicList, cptName, _skyCompact->nameForType(type));
logicList++;
}
}
diff --git a/engines/sky/detection.cpp b/engines/sky/detection.cpp
index 8f6c2bb6a2..4c7bb2dc17 100644
--- a/engines/sky/detection.cpp
+++ b/engines/sky/detection.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/sky/disk.cpp b/engines/sky/disk.cpp
index e97aeb01a2..25f4a125f1 100644
--- a/engines/sky/disk.cpp
+++ b/engines/sky/disk.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/sky/disk.h b/engines/sky/disk.h
index 320c38eebd..bd19e465d1 100644
--- a/engines/sky/disk.h
+++ b/engines/sky/disk.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/sky/grid.cpp b/engines/sky/grid.cpp
index 6a9dc502a7..343c2c0415 100644
--- a/engines/sky/grid.cpp
+++ b/engines/sky/grid.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/sky/grid.h b/engines/sky/grid.h
index 6e0e9aabaa..641c96d534 100644
--- a/engines/sky/grid.h
+++ b/engines/sky/grid.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/sky/hufftext.cpp b/engines/sky/hufftext.cpp
index 0592f094d9..ba9ee6c3e2 100644
--- a/engines/sky/hufftext.cpp
+++ b/engines/sky/hufftext.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/sky/intro.cpp b/engines/sky/intro.cpp
index 2f75a19b69..d4476e2916 100644
--- a/engines/sky/intro.cpp
+++ b/engines/sky/intro.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/sky/intro.h b/engines/sky/intro.h
index 98af6e3664..fb6a1ec9cd 100644
--- a/engines/sky/intro.h
+++ b/engines/sky/intro.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/sky/logic.cpp b/engines/sky/logic.cpp
index e92e768272..e1175f9936 100644
--- a/engines/sky/logic.cpp
+++ b/engines/sky/logic.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/sky/logic.h b/engines/sky/logic.h
index 9f8df25870..8507fe7398 100644
--- a/engines/sky/logic.h
+++ b/engines/sky/logic.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/sky/mouse.cpp b/engines/sky/mouse.cpp
index 74a92c8f00..de2d2226bb 100644
--- a/engines/sky/mouse.cpp
+++ b/engines/sky/mouse.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/sky/mouse.h b/engines/sky/mouse.h
index 1ba0167fb5..310b724e4f 100644
--- a/engines/sky/mouse.h
+++ b/engines/sky/mouse.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/sky/music/adlibchannel.cpp b/engines/sky/music/adlibchannel.cpp
index 99509554c7..8400fef6eb 100644
--- a/engines/sky/music/adlibchannel.cpp
+++ b/engines/sky/music/adlibchannel.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/sky/music/adlibchannel.h b/engines/sky/music/adlibchannel.h
index 44ac0d79d0..80dae93b2c 100644
--- a/engines/sky/music/adlibchannel.h
+++ b/engines/sky/music/adlibchannel.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/sky/music/adlibmusic.cpp b/engines/sky/music/adlibmusic.cpp
index a41cd6a81d..dd64c5bc81 100644
--- a/engines/sky/music/adlibmusic.cpp
+++ b/engines/sky/music/adlibmusic.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/sky/music/adlibmusic.h b/engines/sky/music/adlibmusic.h
index 2161795b4c..886eef026e 100644
--- a/engines/sky/music/adlibmusic.h
+++ b/engines/sky/music/adlibmusic.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/sky/music/gmchannel.cpp b/engines/sky/music/gmchannel.cpp
index 215d6490b9..85a381de53 100644
--- a/engines/sky/music/gmchannel.cpp
+++ b/engines/sky/music/gmchannel.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/sky/music/gmchannel.h b/engines/sky/music/gmchannel.h
index f16de401db..b935321f50 100644
--- a/engines/sky/music/gmchannel.h
+++ b/engines/sky/music/gmchannel.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/sky/music/gmmusic.cpp b/engines/sky/music/gmmusic.cpp
index 84f6a654d0..7dc82807d9 100644
--- a/engines/sky/music/gmmusic.cpp
+++ b/engines/sky/music/gmmusic.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/sky/music/gmmusic.h b/engines/sky/music/gmmusic.h
index 068601ba1f..fa2b960404 100644
--- a/engines/sky/music/gmmusic.h
+++ b/engines/sky/music/gmmusic.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/sky/music/mt32music.cpp b/engines/sky/music/mt32music.cpp
index a3fdd42713..9e8886d82a 100644
--- a/engines/sky/music/mt32music.cpp
+++ b/engines/sky/music/mt32music.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/sky/music/mt32music.h b/engines/sky/music/mt32music.h
index 8f8e70f51b..fe68910869 100644
--- a/engines/sky/music/mt32music.h
+++ b/engines/sky/music/mt32music.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/sky/music/musicbase.cpp b/engines/sky/music/musicbase.cpp
index 944edb1fdc..d26b6393de 100644
--- a/engines/sky/music/musicbase.cpp
+++ b/engines/sky/music/musicbase.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/sky/music/musicbase.h b/engines/sky/music/musicbase.h
index 066ebe593c..38a52805b7 100644
--- a/engines/sky/music/musicbase.h
+++ b/engines/sky/music/musicbase.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/sky/rnc_deco.cpp b/engines/sky/rnc_deco.cpp
index 27fae03514..8242b27dee 100644
--- a/engines/sky/rnc_deco.cpp
+++ b/engines/sky/rnc_deco.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/sky/rnc_deco.h b/engines/sky/rnc_deco.h
index 96a75a9750..2046b56371 100644
--- a/engines/sky/rnc_deco.h
+++ b/engines/sky/rnc_deco.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/sky/screen.cpp b/engines/sky/screen.cpp
index 2797ed2fea..c96b449162 100644
--- a/engines/sky/screen.cpp
+++ b/engines/sky/screen.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/sky/screen.h b/engines/sky/screen.h
index bf8b69a95a..fa04cd91c3 100644
--- a/engines/sky/screen.h
+++ b/engines/sky/screen.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/sky/sky.cpp b/engines/sky/sky.cpp
index 4c47dfafc7..40b6959a9b 100644
--- a/engines/sky/sky.cpp
+++ b/engines/sky/sky.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/sky/sky.h b/engines/sky/sky.h
index cd8a650d60..56833004ac 100644
--- a/engines/sky/sky.h
+++ b/engines/sky/sky.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/sky/skydefs.h b/engines/sky/skydefs.h
index 070e185d55..167b7dade2 100644
--- a/engines/sky/skydefs.h
+++ b/engines/sky/skydefs.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/sky/sound.cpp b/engines/sky/sound.cpp
index a60e3d9e38..d9343d10c7 100644
--- a/engines/sky/sound.cpp
+++ b/engines/sky/sound.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/sky/sound.h b/engines/sky/sound.h
index da0d91911b..3c330dae99 100644
--- a/engines/sky/sound.h
+++ b/engines/sky/sound.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/sky/struc.h b/engines/sky/struc.h
index c2ebf1bad0..dd75410283 100644
--- a/engines/sky/struc.h
+++ b/engines/sky/struc.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/sky/text.cpp b/engines/sky/text.cpp
index 38a01116fe..bf7b8e3787 100644
--- a/engines/sky/text.cpp
+++ b/engines/sky/text.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/sky/text.h b/engines/sky/text.h
index cf0d707ce9..e327b6e6b4 100644
--- a/engines/sky/text.h
+++ b/engines/sky/text.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/sword1/animation.cpp b/engines/sword1/animation.cpp
index 742aac1a53..0257a805ff 100644
--- a/engines/sword1/animation.cpp
+++ b/engines/sword1/animation.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/sword1/animation.h b/engines/sword1/animation.h
index 2c51a74f71..462addf70f 100644
--- a/engines/sword1/animation.h
+++ b/engines/sword1/animation.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/sword1/collision.h b/engines/sword1/collision.h
index 9a9eeec429..6cfe50d9d6 100644
--- a/engines/sword1/collision.h
+++ b/engines/sword1/collision.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/sword1/configure.engine b/engines/sword1/configure.engine
new file mode 100644
index 0000000000..0578d176a9
--- /dev/null
+++ b/engines/sword1/configure.engine
@@ -0,0 +1,3 @@
+# This file is included from the main "configure" script
+# add_engine [name] [desc] [build-by-default] [subengines] [base games] [deps]
+add_engine sword1 "Broken Sword" yes
diff --git a/engines/sword1/console.cpp b/engines/sword1/console.cpp
index 4c55f8d990..3eb3b93a19 100644
--- a/engines/sword1/console.cpp
+++ b/engines/sword1/console.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/sword1/console.h b/engines/sword1/console.h
index 260fe95d52..a2bb51f9a4 100644
--- a/engines/sword1/console.h
+++ b/engines/sword1/console.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/sword1/control.cpp b/engines/sword1/control.cpp
index 80d8edc1dd..201c3aa9bd 100644
--- a/engines/sword1/control.cpp
+++ b/engines/sword1/control.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/sword1/control.h b/engines/sword1/control.h
index a80ea05b03..2d15bcdd15 100644
--- a/engines/sword1/control.h
+++ b/engines/sword1/control.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/sword1/debug.cpp b/engines/sword1/debug.cpp
index 6f82d0f49a..cddc7283f0 100644
--- a/engines/sword1/debug.cpp
+++ b/engines/sword1/debug.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/sword1/debug.h b/engines/sword1/debug.h
index 1505ae28dd..f3ebb0b9b2 100644
--- a/engines/sword1/debug.h
+++ b/engines/sword1/debug.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/sword1/detection.cpp b/engines/sword1/detection.cpp
index f3af04c81d..8a1f3dfef9 100644
--- a/engines/sword1/detection.cpp
+++ b/engines/sword1/detection.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/sword1/eventman.cpp b/engines/sword1/eventman.cpp
index 113151bfd5..3b3e696937 100644
--- a/engines/sword1/eventman.cpp
+++ b/engines/sword1/eventman.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/sword1/eventman.h b/engines/sword1/eventman.h
index 25cb886a34..cf32ff7343 100644
--- a/engines/sword1/eventman.h
+++ b/engines/sword1/eventman.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/sword1/logic.cpp b/engines/sword1/logic.cpp
index 757d768780..a0067ffbf5 100644
--- a/engines/sword1/logic.cpp
+++ b/engines/sword1/logic.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/sword1/logic.h b/engines/sword1/logic.h
index a146d340cf..94da2b3a77 100644
--- a/engines/sword1/logic.h
+++ b/engines/sword1/logic.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/sword1/memman.cpp b/engines/sword1/memman.cpp
index 19809249b5..be36684fe5 100644
--- a/engines/sword1/memman.cpp
+++ b/engines/sword1/memman.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/sword1/memman.h b/engines/sword1/memman.h
index 7f84720248..bff5c6a620 100644
--- a/engines/sword1/memman.h
+++ b/engines/sword1/memman.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/sword1/menu.cpp b/engines/sword1/menu.cpp
index f61e10106a..2cf765b65e 100644
--- a/engines/sword1/menu.cpp
+++ b/engines/sword1/menu.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/sword1/menu.h b/engines/sword1/menu.h
index ea062f1a49..66e465cf63 100644
--- a/engines/sword1/menu.h
+++ b/engines/sword1/menu.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/sword1/module.mk b/engines/sword1/module.mk
index a19fcbfab9..cd1b03ee7d 100644
--- a/engines/sword1/module.mk
+++ b/engines/sword1/module.mk
@@ -19,7 +19,7 @@ MODULE_OBJS := \
sound.o \
staticres.o \
sword1.o \
- text.o
+ text.o
# This module can be built as a plugin
ifeq ($(ENABLE_SWORD1), DYNAMIC_PLUGIN)
diff --git a/engines/sword1/mouse.cpp b/engines/sword1/mouse.cpp
index 4a62995d96..88de4001bb 100644
--- a/engines/sword1/mouse.cpp
+++ b/engines/sword1/mouse.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/sword1/mouse.h b/engines/sword1/mouse.h
index b2a844d0a9..924b04c206 100644
--- a/engines/sword1/mouse.h
+++ b/engines/sword1/mouse.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/sword1/music.cpp b/engines/sword1/music.cpp
index c34630aceb..6a0a3d1e70 100644
--- a/engines/sword1/music.cpp
+++ b/engines/sword1/music.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -110,7 +110,7 @@ bool MusicHandle::play(const Common::String &filename, bool loop) {
return true;
}
-bool MusicHandle::playPSX(uint16 id) {
+bool MusicHandle::playPSX(uint16 id, bool loop) {
stop();
if (!_file.isOpen())
@@ -131,7 +131,7 @@ bool MusicHandle::playPSX(uint16 id) {
// not over file size
if ((size != 0) && (size != 0xffffffff) && ((int32)(offset + size) <= _file.size())) {
_file.seek(offset, SEEK_SET);
- _audioSource = Audio::makeXAStream(_file.readStream(size), 11025);
+ _audioSource = Audio::makeLoopingAudioStream(Audio::makeXAStream(_file.readStream(size), 11025), loop ? 0 : 1);
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)) {
+ if (_handles[newStream].playPSX(tuneId, loopFlag != 0)) {
_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 f1366202d7..ec25427ead 100644
--- a/engines/sword1/music.h
+++ b/engines/sword1/music.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -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 playPSX(uint16 id, bool loop);
void stop();
void fadeUp();
void fadeDown();
diff --git a/engines/sword1/object.h b/engines/sword1/object.h
index 0dab5519bd..8ded828b90 100644
--- a/engines/sword1/object.h
+++ b/engines/sword1/object.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/sword1/objectman.cpp b/engines/sword1/objectman.cpp
index 3e70a95699..07f19154a0 100644
--- a/engines/sword1/objectman.cpp
+++ b/engines/sword1/objectman.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/sword1/objectman.h b/engines/sword1/objectman.h
index 197b437c15..fef1a8da3a 100644
--- a/engines/sword1/objectman.h
+++ b/engines/sword1/objectman.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/sword1/resman.cpp b/engines/sword1/resman.cpp
index 7222965c9d..0a0324a67c 100644
--- a/engines/sword1/resman.cpp
+++ b/engines/sword1/resman.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/sword1/resman.h b/engines/sword1/resman.h
index 49d974c1db..ac6aa87065 100644
--- a/engines/sword1/resman.h
+++ b/engines/sword1/resman.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/sword1/router.cpp b/engines/sword1/router.cpp
index ef07a0bf02..72c8440e1c 100644
--- a/engines/sword1/router.cpp
+++ b/engines/sword1/router.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/sword1/router.h b/engines/sword1/router.h
index 82724b1e6e..76ddf53222 100644
--- a/engines/sword1/router.h
+++ b/engines/sword1/router.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/sword1/screen.cpp b/engines/sword1/screen.cpp
index ae128b8c05..507f4f0884 100644
--- a/engines/sword1/screen.cpp
+++ b/engines/sword1/screen.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -57,6 +57,30 @@ Screen::Screen(OSystem *system, ResMan *pResMan, ObjectMan *pObjMan) {
_psxCache.extPlxCache = NULL;
_oldScrollX = 0;
_oldScrollY = 0;
+
+ _textMan = 0;
+
+ for (int i = 0; i < 4; i++)
+ _layerGrid[i] = 0;
+
+ for (int i = 0; i < 4; i++)
+ _layerBlocks[i] = 0;
+
+ _parallax[0] = 0;
+ _parallax[1] = 0;
+
+ _fullRefresh = 0;
+
+ for (int i = 0; i < MAX_SORT; i++) {
+ _sortList[i].id = 0;
+ _sortList[i].y = 0;
+ }
+ _scrnSizeX = 0;
+ _scrnSizeY = 0;
+ _gridSizeX = 0;
+ _gridSizeY = 0;
+ _fadingDirection = 0;
+ _isBlack = 0;
}
Screen::~Screen() {
diff --git a/engines/sword1/screen.h b/engines/sword1/screen.h
index 7586e937a7..6186f64250 100644
--- a/engines/sword1/screen.h
+++ b/engines/sword1/screen.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/sword1/sound.cpp b/engines/sword1/sound.cpp
index 268da74508..0b4d3829d6 100644
--- a/engines/sword1/sound.cpp
+++ b/engines/sword1/sound.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -269,9 +269,8 @@ void Sound::playSample(QueueElement *elem) {
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);
+ Audio::AudioStream *audStream = Audio::makeLoopingAudioStream(Audio::makeXAStream(new Common::MemoryReadStream(sampleData + 4, size - 4), 11025), (_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);
diff --git a/engines/sword1/sound.h b/engines/sword1/sound.h
index b52d89f390..666598dba0 100644
--- a/engines/sword1/sound.h
+++ b/engines/sword1/sound.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/sword1/staticres.cpp b/engines/sword1/staticres.cpp
index 5dabce1301..37ab3c2f6d 100644
--- a/engines/sword1/staticres.cpp
+++ b/engines/sword1/staticres.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -2682,7 +2682,7 @@ const char Music::_tuneList[TOTAL_TUNES][8] = {
"3m10", // DONE 82 After, "A description, perhaps."
"2m13", // DONE 83 Red nose icon at costumier's. Copy 2M13.
"3m12", // DONE 84 Tissue icon. Also, after Nico's "No, I write it (the magazine) 5M19.
- "3m13", // DONE 85 Photo icon over, "Do you recognise this man?"
+ "3m13", // DONE 85 Photo icon over, "Do you recognize this man?"
"3m14", // DONE 86 Exit icon, over, "Thanks for your help, buddy."
"2m9", // DONE 87 Clicking on police station on the map.
"3m17", // DONE 88 Police station on, "I've tracked down the clown's movements."
@@ -2702,7 +2702,7 @@ const char Music::_tuneList[TOTAL_TUNES][8] = {
"3m32", // DONE 100 Source music for Lady Piermont.
"3m33", // DONE 101 More music for Lady P.
"2m13", // DONE 102 Red Nose music Copy 2M13
- "4m3", // DONE 103 On photo, "Do you recognise the man in this photograph"
+ "4m3", // DONE 103 On photo, "Do you recognize the man in this photograph"
"4m4", // DONE 104 With Lady P. After, "Hi there, ma'am."
"4m5", // DONE 105 After, "I think the word you're looking for is...dick"
"4m6", // DONE 106 After, "English arrogance might do the trick." Also for "More English arrogance" (4M27)
@@ -2881,7 +2881,7 @@ const char Music::_tuneList[TOTAL_TUNES][8] = {
"scm1b", // DONE 260 When George passes the trigger point toward the back of the train and he sees Guido.
"spm6b", // DONE 261 The climax of "spm6", which should coincide with the Countess holding up the chalice.
"marquet", // DONE 262 Starts at the fade down when George is asked to leave Jacques' room
- "rm4", // DONE 263 "On crystal stand icon. As George walks to the centre of the cavern." I'd do this on the first LMB on the stump.
+ "rm4", // DONE 263 "On crystal stand icon. As George walks to the center of the cavern." I'd do this on the first LMB on the stump.
"rm5", // DONE 264 "On icon. As George places the crystal on top of the stand." When the player places the gem luggage on the emplaced tripod.
"rm6", // DONE 265 "Chalice reflection. On icon as George places Chalice on floor of Church" i.e. the mosaic in the Baphomet dig. It's over thirty seconds long so it had best start running when the chalice luggage is placed on the mosaic so it runs through the big screen of the reflection.
"rm7", // DONE 266 "Burning candle. On icon as George sets about lighting candle." One minute forty-eight, this one. I've no idea how long the burning candle Smacker is but the cue description seems to indicate it should run from the moment the burning tissue successfully lights the candle, i.e. the window is shut.
diff --git a/engines/sword1/sword1.cpp b/engines/sword1/sword1.cpp
index 2d5452778d..08ea02f32d 100644
--- a/engines/sword1/sword1.cpp
+++ b/engines/sword1/sword1.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -67,6 +67,17 @@ SwordEngine::SwordEngine(OSystem *syst)
SearchMan.addSubDirectoryMatching(gameDataDir, "italian"); // PSX Demo
_console = new SwordConsole(this);
+
+ _mouseState = 0;
+ _resMan = 0;
+ _objectMan = 0;
+ _screen = 0;
+ _mouse = 0;
+ _logic = 0;
+ _sound = 0;
+ _menu = 0;
+ _music = 0;
+ _control = 0;
}
SwordEngine::~SwordEngine() {
diff --git a/engines/sword1/sword1.h b/engines/sword1/sword1.h
index ec6555b4b3..c58e97e353 100644
--- a/engines/sword1/sword1.h
+++ b/engines/sword1/sword1.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/sword1/sworddefs.h b/engines/sword1/sworddefs.h
index db4146f37e..643b17d3e2 100644
--- a/engines/sword1/sworddefs.h
+++ b/engines/sword1/sworddefs.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/sword1/swordres.h b/engines/sword1/swordres.h
index b1fc206b80..284219110d 100644
--- a/engines/sword1/swordres.h
+++ b/engines/sword1/swordres.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/sword1/text.cpp b/engines/sword1/text.cpp
index f23ac5f182..2ef1d95b4e 100644
--- a/engines/sword1/text.cpp
+++ b/engines/sword1/text.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/sword1/text.h b/engines/sword1/text.h
index 4dcb9e26a7..aecd268c00 100644
--- a/engines/sword1/text.h
+++ b/engines/sword1/text.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/sword2/configure.engine b/engines/sword2/configure.engine
new file mode 100644
index 0000000000..7153605433
--- /dev/null
+++ b/engines/sword2/configure.engine
@@ -0,0 +1,3 @@
+# This file is included from the main "configure" script
+# add_engine [name] [desc] [build-by-default] [subengines] [base games] [deps]
+add_engine sword2 "Broken Sword II" yes
diff --git a/engines/sword2/console.cpp b/engines/sword2/console.cpp
index 4838bd15f6..0aa78f552b 100644
--- a/engines/sword2/console.cpp
+++ b/engines/sword2/console.cpp
@@ -82,55 +82,55 @@ Debugger::Debugger(Sword2Engine *vm)
// Register commands
- DCmd_Register("continue", WRAP_METHOD(Debugger, Cmd_Exit));
- DCmd_Register("q", WRAP_METHOD(Debugger, Cmd_Exit));
- DCmd_Register("mem", WRAP_METHOD(Debugger, Cmd_Mem));
- DCmd_Register("tony", WRAP_METHOD(Debugger, Cmd_Tony));
- DCmd_Register("res", WRAP_METHOD(Debugger, Cmd_Res));
- DCmd_Register("reslist", WRAP_METHOD(Debugger, Cmd_ResList));
- DCmd_Register("starts", WRAP_METHOD(Debugger, Cmd_Starts));
- DCmd_Register("start", WRAP_METHOD(Debugger, Cmd_Start));
- DCmd_Register("s", WRAP_METHOD(Debugger, Cmd_Start));
- DCmd_Register("info", WRAP_METHOD(Debugger, Cmd_Info));
- DCmd_Register("walkgrid", WRAP_METHOD(Debugger, Cmd_WalkGrid));
- DCmd_Register("mouse", WRAP_METHOD(Debugger, Cmd_Mouse));
- DCmd_Register("player", WRAP_METHOD(Debugger, Cmd_Player));
- DCmd_Register("reslook", WRAP_METHOD(Debugger, Cmd_ResLook));
- DCmd_Register("cur", WRAP_METHOD(Debugger, Cmd_CurrentInfo));
- DCmd_Register("runlist", WRAP_METHOD(Debugger, Cmd_RunList));
- DCmd_Register("kill", WRAP_METHOD(Debugger, Cmd_Kill));
- DCmd_Register("nuke", WRAP_METHOD(Debugger, Cmd_Nuke));
- DCmd_Register("var", WRAP_METHOD(Debugger, Cmd_Var));
- DCmd_Register("rect", WRAP_METHOD(Debugger, Cmd_Rect));
- DCmd_Register("clear", WRAP_METHOD(Debugger, Cmd_Clear));
- DCmd_Register("debugon", WRAP_METHOD(Debugger, Cmd_DebugOn));
- DCmd_Register("debugoff", WRAP_METHOD(Debugger, Cmd_DebugOff));
- DCmd_Register("saverest", WRAP_METHOD(Debugger, Cmd_SaveRest));
- DCmd_Register("timeon", WRAP_METHOD(Debugger, Cmd_TimeOn));
- DCmd_Register("timeoff", WRAP_METHOD(Debugger, Cmd_TimeOff));
- DCmd_Register("text", WRAP_METHOD(Debugger, Cmd_Text));
- DCmd_Register("showvar", WRAP_METHOD(Debugger, Cmd_ShowVar));
- DCmd_Register("hidevar", WRAP_METHOD(Debugger, Cmd_HideVar));
- DCmd_Register("version", WRAP_METHOD(Debugger, Cmd_Version));
- DCmd_Register("animtest", WRAP_METHOD(Debugger, Cmd_AnimTest));
- DCmd_Register("texttest", WRAP_METHOD(Debugger, Cmd_TextTest));
- DCmd_Register("linetest", WRAP_METHOD(Debugger, Cmd_LineTest));
- DCmd_Register("events", WRAP_METHOD(Debugger, Cmd_Events));
- DCmd_Register("sfx", WRAP_METHOD(Debugger, Cmd_Sfx));
- DCmd_Register("english", WRAP_METHOD(Debugger, Cmd_English));
- DCmd_Register("finnish", WRAP_METHOD(Debugger, Cmd_Finnish));
- DCmd_Register("polish", WRAP_METHOD(Debugger, Cmd_Polish));
- DCmd_Register("fxq", WRAP_METHOD(Debugger, Cmd_FxQueue));
+ registerCmd("continue", WRAP_METHOD(Debugger, cmdExit));
+ registerCmd("q", WRAP_METHOD(Debugger, cmdExit));
+ registerCmd("mem", WRAP_METHOD(Debugger, Cmd_Mem));
+ registerCmd("tony", WRAP_METHOD(Debugger, Cmd_Tony));
+ registerCmd("res", WRAP_METHOD(Debugger, Cmd_Res));
+ registerCmd("reslist", WRAP_METHOD(Debugger, Cmd_ResList));
+ registerCmd("starts", WRAP_METHOD(Debugger, Cmd_Starts));
+ registerCmd("start", WRAP_METHOD(Debugger, Cmd_Start));
+ registerCmd("s", WRAP_METHOD(Debugger, Cmd_Start));
+ registerCmd("info", WRAP_METHOD(Debugger, Cmd_Info));
+ registerCmd("walkgrid", WRAP_METHOD(Debugger, Cmd_WalkGrid));
+ registerCmd("mouse", WRAP_METHOD(Debugger, Cmd_Mouse));
+ registerCmd("player", WRAP_METHOD(Debugger, Cmd_Player));
+ registerCmd("reslook", WRAP_METHOD(Debugger, Cmd_ResLook));
+ registerCmd("cur", WRAP_METHOD(Debugger, Cmd_CurrentInfo));
+ registerCmd("runlist", WRAP_METHOD(Debugger, Cmd_RunList));
+ registerCmd("kill", WRAP_METHOD(Debugger, Cmd_Kill));
+ registerCmd("nuke", WRAP_METHOD(Debugger, Cmd_Nuke));
+ registerCmd("var", WRAP_METHOD(Debugger, Cmd_Var));
+ registerCmd("rect", WRAP_METHOD(Debugger, Cmd_Rect));
+ registerCmd("clear", WRAP_METHOD(Debugger, Cmd_Clear));
+ registerCmd("debugon", WRAP_METHOD(Debugger, Cmd_DebugOn));
+ registerCmd("debugoff", WRAP_METHOD(Debugger, Cmd_DebugOff));
+ registerCmd("saverest", WRAP_METHOD(Debugger, Cmd_SaveRest));
+ registerCmd("timeon", WRAP_METHOD(Debugger, Cmd_TimeOn));
+ registerCmd("timeoff", WRAP_METHOD(Debugger, Cmd_TimeOff));
+ registerCmd("text", WRAP_METHOD(Debugger, Cmd_Text));
+ registerCmd("showvar", WRAP_METHOD(Debugger, Cmd_ShowVar));
+ registerCmd("hidevar", WRAP_METHOD(Debugger, Cmd_HideVar));
+ registerCmd("version", WRAP_METHOD(Debugger, Cmd_Version));
+ registerCmd("animtest", WRAP_METHOD(Debugger, Cmd_AnimTest));
+ registerCmd("texttest", WRAP_METHOD(Debugger, Cmd_TextTest));
+ registerCmd("linetest", WRAP_METHOD(Debugger, Cmd_LineTest));
+ registerCmd("events", WRAP_METHOD(Debugger, Cmd_Events));
+ registerCmd("sfx", WRAP_METHOD(Debugger, Cmd_Sfx));
+ registerCmd("english", WRAP_METHOD(Debugger, Cmd_English));
+ registerCmd("finnish", WRAP_METHOD(Debugger, Cmd_Finnish));
+ registerCmd("polish", WRAP_METHOD(Debugger, Cmd_Polish));
+ registerCmd("fxq", WRAP_METHOD(Debugger, Cmd_FxQueue));
}
void Debugger::varGet(int var) {
- DebugPrintf("%d\n", _vm->_logic->readVar(var));
+ debugPrintf("%d\n", _vm->_logic->readVar(var));
}
void Debugger::varSet(int var, int val) {
- DebugPrintf("was %d, ", _vm->_logic->readVar(var));
+ debugPrintf("was %d, ", _vm->_logic->readVar(var));
_vm->_logic->writeVar(var, val);
- DebugPrintf("now %d\n", _vm->_logic->readVar(var));
+ debugPrintf("now %d\n", _vm->_logic->readVar(var));
}
void Debugger::preEnter() {
@@ -184,8 +184,8 @@ bool Debugger::Cmd_Mem(int argc, const char **argv) {
qsort(blocks, numBlocks, sizeof(MemBlock *), compare_blocks);
- DebugPrintf(" size id res type name\n");
- DebugPrintf("---------------------------------------------------------------------------\n");
+ debugPrintf(" size id res type name\n");
+ debugPrintf("---------------------------------------------------------------------------\n");
for (i = 0; i < numBlocks; i++) {
const char *type;
@@ -235,21 +235,21 @@ bool Debugger::Cmd_Mem(int argc, const char **argv) {
break;
}
- DebugPrintf("%9d %-3d %-4d %-20s %s\n",
+ debugPrintf("%9d %-3d %-4d %-20s %s\n",
blocks[i]->size, blocks[i]->id, blocks[i]->uid,
type, _vm->_resman->fetchName(blocks[i]->ptr));
}
free(blocks);
- DebugPrintf("---------------------------------------------------------------------------\n");
- DebugPrintf("%9d\n", _vm->_memory->getTotAlloc());
+ debugPrintf("---------------------------------------------------------------------------\n");
+ debugPrintf("%9d\n", _vm->_memory->getTotAlloc());
return true;
}
bool Debugger::Cmd_Tony(int argc, const char **argv) {
- DebugPrintf("What about him?\n");
+ debugPrintf("What about him?\n");
return true;
}
@@ -257,7 +257,7 @@ bool Debugger::Cmd_Res(int argc, const char **argv) {
uint32 numClusters = _vm->_resman->getNumClusters();
if (!numClusters) {
- DebugPrintf("Argh! No resources!\n");
+ debugPrintf("Argh! No resources!\n");
return true;
}
@@ -266,10 +266,10 @@ bool Debugger::Cmd_Res(int argc, const char **argv) {
for (uint i = 0; i < numClusters; i++) {
const char *locStr[3] = { "HDD", "CD1", "CD2" };
- DebugPrintf("%-20s %s\n", resFiles[i].fileName, locStr[resFiles[i].cd]);
+ debugPrintf("%-20s %s\n", resFiles[i].fileName, locStr[resFiles[i].cd]);
}
- DebugPrintf("%d resources\n", _vm->_resman->getNumResFiles());
+ debugPrintf("%d resources\n", _vm->_resman->getNumResFiles());
return true;
}
@@ -285,7 +285,7 @@ bool Debugger::Cmd_ResList(int argc, const char **argv) {
for (uint i = 0; i < numResFiles; i++) {
if (resList[i].ptr && resList[i].refCount >= minCount) {
- DebugPrintf("%-4d: %-35s refCount: %-3d\n", i, _vm->_resman->fetchName(resList[i].ptr), resList[i].refCount);
+ debugPrintf("%-4d: %-35s refCount: %-3d\n", i, _vm->_resman->fetchName(resList[i].ptr), resList[i].refCount);
}
}
@@ -296,21 +296,21 @@ bool Debugger::Cmd_Starts(int argc, const char **argv) {
uint32 numStarts = _vm->getNumStarts();
if (!numStarts) {
- DebugPrintf("Sorry - no startup positions registered?\n");
+ debugPrintf("Sorry - no startup positions registered?\n");
uint32 numScreenManagers = _vm->getNumScreenManagers();
if (!numScreenManagers)
- DebugPrintf("There is a problem with startup.inf\n");
+ debugPrintf("There is a problem with startup.inf\n");
else
- DebugPrintf(" (%d screen managers found in startup.inf)\n", numScreenManagers);
+ debugPrintf(" (%d screen managers found in startup.inf)\n", numScreenManagers);
return true;
}
StartUp *startList = _vm->getStartList();
for (uint i = 0; i < numStarts; i++)
- DebugPrintf("%d (%s)\n", i, startList[i].description);
+ debugPrintf("%d (%s)\n", i, startList[i].description);
return true;
}
@@ -319,25 +319,25 @@ bool Debugger::Cmd_Start(int argc, const char **argv) {
uint8 pal[3] = { 255, 255, 255 };
if (argc != 2) {
- DebugPrintf("Usage: %s number\n", argv[0]);
+ debugPrintf("Usage: %s number\n", argv[0]);
return true;
}
uint32 numStarts = _vm->getNumStarts();
if (!numStarts) {
- DebugPrintf("Sorry - there are no startups!\n");
+ debugPrintf("Sorry - there are no startups!\n");
return true;
}
int start = atoi(argv[1]);
if (start < 0 || start >= (int)numStarts) {
- DebugPrintf("Not a legal start position\n");
+ debugPrintf("Not a legal start position\n");
return true;
}
- DebugPrintf("Running start %d\n", start);
+ debugPrintf("Running start %d\n", start);
_vm->runStart(start);
_vm->_screen->setPalette(187, 1, pal, RDPAL_INSTANT);
@@ -348,9 +348,9 @@ bool Debugger::Cmd_Info(int argc, const char **argv) {
_displayDebugText = !_displayDebugText;
if (_displayDebugText)
- DebugPrintf("Info text on\n");
+ debugPrintf("Info text on\n");
else
- DebugPrintf("Info Text off\n");
+ debugPrintf("Info Text off\n");
return true;
}
@@ -359,9 +359,9 @@ bool Debugger::Cmd_WalkGrid(int argc, const char **argv) {
_displayWalkGrid = !_displayWalkGrid;
if (_displayWalkGrid)
- DebugPrintf("Walk-grid display on\n");
+ debugPrintf("Walk-grid display on\n");
else
- DebugPrintf("Walk-grid display off\n");
+ debugPrintf("Walk-grid display off\n");
return true;
}
@@ -370,9 +370,9 @@ bool Debugger::Cmd_Mouse(int argc, const char **argv) {
_displayMouseMarker = !_displayMouseMarker;
if (_displayMouseMarker)
- DebugPrintf("Mouse marker on\n");
+ debugPrintf("Mouse marker on\n");
else
- DebugPrintf("Mouse marker off\n");
+ debugPrintf("Mouse marker off\n");
return true;
}
@@ -381,16 +381,16 @@ bool Debugger::Cmd_Player(int argc, const char **argv) {
_displayPlayerMarker = !_displayPlayerMarker;
if (_displayPlayerMarker)
- DebugPrintf("Player feet marker on\n");
+ debugPrintf("Player feet marker on\n");
else
- DebugPrintf("Player feet marker off\n");
+ debugPrintf("Player feet marker off\n");
return true;
}
bool Debugger::Cmd_ResLook(int argc, const char **argv) {
if (argc != 2) {
- DebugPrintf("Usage: %s number\n", argv[0]);
+ debugPrintf("Usage: %s number\n", argv[0]);
return true;
}
@@ -398,13 +398,13 @@ bool Debugger::Cmd_ResLook(int argc, const char **argv) {
uint32 numResFiles = _vm->_resman->getNumResFiles();
if (res < 0 || res >= (int)numResFiles) {
- DebugPrintf("Illegal resource %d. There are %d resources, 0-%d.\n",
+ debugPrintf("Illegal resource %d. There are %d resources, 0-%d.\n",
res, numResFiles, numResFiles - 1);
return true;
}
if (!_vm->_resman->checkValid(res)) {
- DebugPrintf("%d is a null & void resource number\n", res);
+ debugPrintf("%d is a null & void resource number\n", res);
return true;
}
@@ -413,40 +413,40 @@ bool Debugger::Cmd_ResLook(int argc, const char **argv) {
switch (type) {
case ANIMATION_FILE:
- DebugPrintf("<anim> %s\n", _vm->_resman->fetchName(res));
+ debugPrintf("<anim> %s\n", _vm->_resman->fetchName(res));
break;
case SCREEN_FILE:
- DebugPrintf("<layer> %s\n", _vm->_resman->fetchName(res));
+ debugPrintf("<layer> %s\n", _vm->_resman->fetchName(res));
break;
case GAME_OBJECT:
- DebugPrintf("<game object> %s\n", _vm->_resman->fetchName(res));
+ debugPrintf("<game object> %s\n", _vm->_resman->fetchName(res));
break;
case WALK_GRID_FILE:
- DebugPrintf("<walk grid> %s\n", _vm->_resman->fetchName(res));
+ debugPrintf("<walk grid> %s\n", _vm->_resman->fetchName(res));
break;
case GLOBAL_VAR_FILE:
- DebugPrintf("<global variables> %s\n", _vm->_resman->fetchName(res));
+ debugPrintf("<global variables> %s\n", _vm->_resman->fetchName(res));
break;
case PARALLAX_FILE_null:
- DebugPrintf("<parallax file NOT USED!> %s\n", _vm->_resman->fetchName(res));
+ debugPrintf("<parallax file NOT USED!> %s\n", _vm->_resman->fetchName(res));
break;
case RUN_LIST:
- DebugPrintf("<run list> %s\n", _vm->_resman->fetchName(res));
+ debugPrintf("<run list> %s\n", _vm->_resman->fetchName(res));
break;
case TEXT_FILE:
- DebugPrintf("<text file> %s\n", _vm->_resman->fetchName(res));
+ debugPrintf("<text file> %s\n", _vm->_resman->fetchName(res));
break;
case SCREEN_MANAGER:
- DebugPrintf("<screen manager> %s\n", _vm->_resman->fetchName(res));
+ debugPrintf("<screen manager> %s\n", _vm->_resman->fetchName(res));
break;
case MOUSE_FILE:
- DebugPrintf("<mouse pointer> %s\n", _vm->_resman->fetchName(res));
+ debugPrintf("<mouse pointer> %s\n", _vm->_resman->fetchName(res));
break;
case ICON_FILE:
- DebugPrintf("<menu icon> %s\n", _vm->_resman->fetchName(res));
+ debugPrintf("<menu icon> %s\n", _vm->_resman->fetchName(res));
break;
default:
- DebugPrintf("unrecognized fileType %d\n", type);
+ debugPrintf("unrecognized fileType %d\n", type);
break;
}
@@ -458,13 +458,13 @@ bool Debugger::Cmd_CurrentInfo(int argc, const char **argv) {
ScreenInfo *screenInfo = _vm->_screen->getScreenInfo();
if (screenInfo->background_layer_id) {
- DebugPrintf("background layer id %d\n", screenInfo->background_layer_id);
- DebugPrintf("%d wide, %d high\n", screenInfo->screen_wide, screenInfo->screen_deep);
- DebugPrintf("%d normal layers\n", screenInfo->number_of_layers);
+ debugPrintf("background layer id %d\n", screenInfo->background_layer_id);
+ debugPrintf("%d wide, %d high\n", screenInfo->screen_wide, screenInfo->screen_deep);
+ debugPrintf("%d normal layers\n", screenInfo->number_of_layers);
Cmd_RunList(argc, argv);
} else
- DebugPrintf("No screen\n");
+ debugPrintf("No screen\n");
return true;
}
@@ -476,26 +476,26 @@ bool Debugger::Cmd_RunList(int argc, const char **argv) {
readS.seek(ResHeader::size());
- DebugPrintf("Runlist number %d\n", runList);
+ debugPrintf("Runlist number %d\n", runList);
while (1) {
uint32 res = readS.readUint32LE();
if (!res)
break;
- DebugPrintf("%d %s\n", res, _vm->_resman->fetchName(res));
+ debugPrintf("%d %s\n", res, _vm->_resman->fetchName(res));
}
_vm->_resman->closeResource(runList);
} else
- DebugPrintf("No run list set\n");
+ debugPrintf("No run list set\n");
return true;
}
bool Debugger::Cmd_Kill(int argc, const char **argv) {
if (argc != 2) {
- DebugPrintf("Usage: %s number\n", argv[0]);
+ debugPrintf("Usage: %s number\n", argv[0]);
return true;
}
@@ -503,7 +503,7 @@ bool Debugger::Cmd_Kill(int argc, const char **argv) {
uint32 numResFiles = _vm->_resman->getNumResFiles();
if (res < 0 || res >= (int)numResFiles) {
- DebugPrintf("Illegal resource %d. There are %d resources, 0-%d.\n",
+ debugPrintf("Illegal resource %d. There are %d resources, 0-%d.\n",
res, numResFiles, numResFiles - 1);
return true;
}
@@ -511,22 +511,22 @@ bool Debugger::Cmd_Kill(int argc, const char **argv) {
Resource *resList = _vm->_resman->getResList();
if (!resList[res].ptr) {
- DebugPrintf("Resource %d is not in memory\n", res);
+ debugPrintf("Resource %d is not in memory\n", res);
return true;
}
if (resList[res].refCount) {
- DebugPrintf("Resource %d is open - cannot remove\n", res);
+ debugPrintf("Resource %d is open - cannot remove\n", res);
return true;
}
_vm->_resman->remove(res);
- DebugPrintf("Trashed %d\n", res);
+ debugPrintf("Trashed %d\n", res);
return true;
}
bool Debugger::Cmd_Nuke(int argc, const char **argv) {
- DebugPrintf("Killing all resources except variable file and player object\n");
+ debugPrintf("Killing all resources except variable file and player object\n");
_vm->_resman->killAll(true);
return true;
}
@@ -540,7 +540,7 @@ bool Debugger::Cmd_Var(int argc, const char **argv) {
varSet(atoi(argv[1]), atoi(argv[2]));
break;
default:
- DebugPrintf("Usage: %s number value\n", argv[0]);
+ debugPrintf("Usage: %s number value\n", argv[0]);
break;
}
@@ -554,10 +554,10 @@ bool Debugger::Cmd_Rect(int argc, const char **argv) {
if (_definingRectangles) {
_vm->setInputEventFilter(filter & ~(RD_LEFTBUTTONUP | RD_RIGHTBUTTONUP));
- DebugPrintf("Mouse rectangles enabled\n");
+ debugPrintf("Mouse rectangles enabled\n");
} else {
_vm->setInputEventFilter(filter | RD_LEFTBUTTONUP | RD_RIGHTBUTTONUP);
- DebugPrintf("Mouse rectangles disabled\n");
+ debugPrintf("Mouse rectangles disabled\n");
}
_draggingRectangle = 0;
@@ -575,7 +575,7 @@ bool Debugger::Cmd_DebugOn(int argc, const char **argv) {
_displayMouseMarker = true;
_displayPlayerMarker = true;
_displayTextNumbers = true;
- DebugPrintf("Enabled all on-screen debug info\n");
+ debugPrintf("Enabled all on-screen debug info\n");
return true;
}
@@ -585,7 +585,7 @@ bool Debugger::Cmd_DebugOff(int argc, const char **argv) {
_displayMouseMarker = false;
_displayPlayerMarker = false;
_displayTextNumbers = false;
- DebugPrintf("Disabled all on-screen debug info\n");
+ debugPrintf("Disabled all on-screen debug info\n");
return true;
}
@@ -593,9 +593,9 @@ bool Debugger::Cmd_SaveRest(int argc, const char **argv) {
_testingSnR = !_testingSnR;
if (_testingSnR)
- DebugPrintf("Enabled S&R logic_script stability checking\n");
+ debugPrintf("Enabled S&R logic_script stability checking\n");
else
- DebugPrintf("Disabled S&R logic_script stability checking\n");
+ debugPrintf("Disabled S&R logic_script stability checking\n");
return true;
}
@@ -606,13 +606,13 @@ bool Debugger::Cmd_TimeOn(int argc, const char **argv) {
else if (_startTime == 0)
_startTime = _vm->_system->getMillis();
_displayTime = true;
- DebugPrintf("Timer display on\n");
+ debugPrintf("Timer display on\n");
return true;
}
bool Debugger::Cmd_TimeOff(int argc, const char **argv) {
_displayTime = false;
- DebugPrintf("Timer display off\n");
+ debugPrintf("Timer display off\n");
return true;
}
@@ -620,9 +620,9 @@ bool Debugger::Cmd_Text(int argc, const char **argv) {
_displayTextNumbers = !_displayTextNumbers;
if (_displayTextNumbers)
- DebugPrintf("Text numbers on\n");
+ debugPrintf("Text numbers on\n");
else
- DebugPrintf("Text numbers off\n");
+ debugPrintf("Text numbers off\n");
return true;
}
@@ -632,7 +632,7 @@ bool Debugger::Cmd_ShowVar(int argc, const char **argv) {
int32 varNo;
if (argc != 2) {
- DebugPrintf("Usage: %s number\n", argv[0]);
+ debugPrintf("Usage: %s number\n", argv[0]);
return true;
}
@@ -649,11 +649,11 @@ bool Debugger::Cmd_ShowVar(int argc, const char **argv) {
if (_showVar[showVarNo] == 0) {
// empty slot - add it to the list at this slot
_showVar[showVarNo] = varNo;
- DebugPrintf("var(%d) added to the watch-list\n", varNo);
+ debugPrintf("var(%d) added to the watch-list\n", varNo);
} else
- DebugPrintf("var(%d) already in the watch-list!\n", varNo);
+ debugPrintf("var(%d) already in the watch-list!\n", varNo);
} else
- DebugPrintf("Sorry - no more allowed - hide one or extend the system watch-list\n");
+ debugPrintf("Sorry - no more allowed - hide one or extend the system watch-list\n");
return true;
}
@@ -663,7 +663,7 @@ bool Debugger::Cmd_HideVar(int argc, const char **argv) {
int32 varNo;
if (argc != 2) {
- DebugPrintf("Usage: %s number\n", argv[0]);
+ debugPrintf("Usage: %s number\n", argv[0]);
return true;
}
@@ -676,9 +676,9 @@ bool Debugger::Cmd_HideVar(int argc, const char **argv) {
if (showVarNo < MAX_SHOWVARS) {
// We've found 'varNo' in the list - clear this slot
_showVar[showVarNo] = 0;
- DebugPrintf("var(%d) removed from watch-list\n", varNo);
+ debugPrintf("var(%d) removed from watch-list\n", varNo);
} else
- DebugPrintf("Sorry - can't find var(%d) in the list\n", varNo);
+ debugPrintf("Sorry - can't find var(%d) in the list\n", varNo);
return true;
}
@@ -687,13 +687,13 @@ bool Debugger::Cmd_Version(int argc, const char **argv) {
// This function used to print more information, but nothing we
// particularly care about.
- DebugPrintf("\"Broken Sword II\" (c) Revolution Software 1997.\n");
+ debugPrintf("\"Broken Sword II\" (c) Revolution Software 1997.\n");
return true;
}
bool Debugger::Cmd_AnimTest(int argc, const char **argv) {
if (argc != 2) {
- DebugPrintf("Usage: %s value\n", argv[0]);
+ debugPrintf("Usage: %s value\n", argv[0]);
return true;
}
@@ -703,13 +703,13 @@ bool Debugger::Cmd_AnimTest(int argc, const char **argv) {
// Same as typing "VAR 912 <value>" at the console
varSet(912, atoi(argv[1]));
- DebugPrintf("Setting flag 'system_testing_anims'\n");
+ debugPrintf("Setting flag 'system_testing_anims'\n");
return true;
}
bool Debugger::Cmd_TextTest(int argc, const char **argv) {
if (argc != 2) {
- DebugPrintf("Usage: %s value\n", argv[0]);
+ debugPrintf("Usage: %s value\n", argv[0]);
return true;
}
@@ -721,14 +721,14 @@ bool Debugger::Cmd_TextTest(int argc, const char **argv) {
_displayTextNumbers = true;
- DebugPrintf("Setting flag 'system_testing_text'\n");
- DebugPrintf("Text numbers on\n");
+ debugPrintf("Setting flag 'system_testing_text'\n");
+ debugPrintf("Text numbers on\n");
return true;
}
bool Debugger::Cmd_LineTest(int argc, const char **argv) {
if (argc != 3) {
- DebugPrintf("Usage: %s value1 value2\n", argv[0]);
+ debugPrintf("Usage: %s value1 value2\n", argv[0]);
return true;
}
@@ -743,24 +743,24 @@ bool Debugger::Cmd_LineTest(int argc, const char **argv) {
_displayTextNumbers = true;
- DebugPrintf("Setting flag 'system_testing_text'\n");
- DebugPrintf("Setting flag 'system_test_line_no'\n");
- DebugPrintf("Text numbers on\n");
+ debugPrintf("Setting flag 'system_testing_text'\n");
+ debugPrintf("Setting flag 'system_test_line_no'\n");
+ debugPrintf("Text numbers on\n");
return true;
}
bool Debugger::Cmd_Events(int argc, const char **argv) {
EventUnit *eventList = _vm->_logic->getEventList();
- DebugPrintf("EVENT LIST:\n");
+ debugPrintf("EVENT LIST:\n");
for (uint32 i = 0; i < MAX_events; i++) {
if (eventList[i].id) {
uint32 target = eventList[i].id;
uint32 script = eventList[i].interact_id;
- DebugPrintf("slot %2d: id = %s (%d)\n", i, _vm->_resman->fetchName(target), target);
- DebugPrintf(" script = %s (%d) pos %d\n", _vm->_resman->fetchName(script / 65536), script / 65536, script % 65536);
+ debugPrintf("slot %2d: id = %s (%d)\n", i, _vm->_resman->fetchName(target), target);
+ debugPrintf(" script = %s (%d) pos %d\n", _vm->_resman->fetchName(script / 65536), script / 65536, script % 65536);
}
}
@@ -771,28 +771,28 @@ bool Debugger::Cmd_Sfx(int argc, const char **argv) {
_vm->_wantSfxDebug = !_vm->_wantSfxDebug;
if (_vm->_wantSfxDebug)
- DebugPrintf("SFX logging activated\n");
+ debugPrintf("SFX logging activated\n");
else
- DebugPrintf("SFX logging deactivated\n");
+ debugPrintf("SFX logging deactivated\n");
return true;
}
bool Debugger::Cmd_English(int argc, const char **argv) {
_vm->initializeFontResourceFlags(DEFAULT_TEXT);
- DebugPrintf("Default fonts selected\n");
+ debugPrintf("Default fonts selected\n");
return true;
}
bool Debugger::Cmd_Finnish(int argc, const char **argv) {
_vm->initializeFontResourceFlags(FINNISH_TEXT);
- DebugPrintf("Finnish fonts selected\n");
+ debugPrintf("Finnish fonts selected\n");
return true;
}
bool Debugger::Cmd_Polish(int argc, const char **argv) {
_vm->initializeFontResourceFlags(POLISH_TEXT);
- DebugPrintf("Polish fonts selected\n");
+ debugPrintf("Polish fonts selected\n");
return true;
}
diff --git a/engines/sword2/resman.cpp b/engines/sword2/resman.cpp
index a0561641d7..44027fd281 100644
--- a/engines/sword2/resman.cpp
+++ b/engines/sword2/resman.cpp
@@ -38,7 +38,7 @@
#include "sword2/screen.h"
#include "sword2/sound.h"
-#define Debug_Printf _vm->_debugger->DebugPrintf
+#define Debug_Printf _vm->_debugger->debugPrintf
namespace Sword2 {
diff --git a/engines/sword2/sound.cpp b/engines/sword2/sound.cpp
index aea33e99e3..1e1687b1e6 100644
--- a/engines/sword2/sound.cpp
+++ b/engines/sword2/sound.cpp
@@ -49,7 +49,7 @@
#include "audio/decoders/wave.h"
#include "audio/decoders/xa.h"
-#define Debug_Printf _vm->_debugger->DebugPrintf
+#define Debug_Printf _vm->_debugger->debugPrintf
namespace Sword2 {
diff --git a/engines/sword25/configure.engine b/engines/sword25/configure.engine
new file mode 100644
index 0000000000..1729bbeb33
--- /dev/null
+++ b/engines/sword25/configure.engine
@@ -0,0 +1,3 @@
+# This file is included from the main "configure" script
+# add_engine [name] [desc] [build-by-default] [subengines] [base games] [deps]
+add_engine sword25 "Broken Sword 2.5" no "" "" "png zlib 16bit"
diff --git a/engines/sword25/console.cpp b/engines/sword25/console.cpp
index f1b91d2bc2..d8222e7f6d 100644
--- a/engines/sword25/console.cpp
+++ b/engines/sword25/console.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/sword25/console.h b/engines/sword25/console.h
index 9e2516ccf0..ea955ee139 100644
--- a/engines/sword25/console.h
+++ b/engines/sword25/console.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/sword25/detection.cpp b/engines/sword25/detection.cpp
index 06e4ba2a7d..df68d11609 100644
--- a/engines/sword25/detection.cpp
+++ b/engines/sword25/detection.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/sword25/detection_tables.h b/engines/sword25/detection_tables.h
index 94a5b55fed..a9f263b7d4 100644
--- a/engines/sword25/detection_tables.h
+++ b/engines/sword25/detection_tables.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/sword25/fmv/movieplayer.cpp b/engines/sword25/fmv/movieplayer.cpp
index 3cdce1b493..5d7dcf2506 100644
--- a/engines/sword25/fmv/movieplayer.cpp
+++ b/engines/sword25/fmv/movieplayer.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/sword25/fmv/movieplayer.h b/engines/sword25/fmv/movieplayer.h
index 2f5614b505..95fb05ee60 100644
--- a/engines/sword25/fmv/movieplayer.h
+++ b/engines/sword25/fmv/movieplayer.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/sword25/fmv/movieplayer_script.cpp b/engines/sword25/fmv/movieplayer_script.cpp
index 8359059b85..44353268c7 100644
--- a/engines/sword25/fmv/movieplayer_script.cpp
+++ b/engines/sword25/fmv/movieplayer_script.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/sword25/gfx/animation.cpp b/engines/sword25/gfx/animation.cpp
index 37207c967b..eeb78857ea 100644
--- a/engines/sword25/gfx/animation.cpp
+++ b/engines/sword25/gfx/animation.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/sword25/gfx/animation.h b/engines/sword25/gfx/animation.h
index ced1995ae9..b6f314ea42 100644
--- a/engines/sword25/gfx/animation.h
+++ b/engines/sword25/gfx/animation.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/sword25/gfx/animationdescription.cpp b/engines/sword25/gfx/animationdescription.cpp
index 164206bbc2..983850269d 100644
--- a/engines/sword25/gfx/animationdescription.cpp
+++ b/engines/sword25/gfx/animationdescription.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/sword25/gfx/animationdescription.h b/engines/sword25/gfx/animationdescription.h
index 009d83dcc7..7884e32655 100644
--- a/engines/sword25/gfx/animationdescription.h
+++ b/engines/sword25/gfx/animationdescription.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/sword25/gfx/animationresource.cpp b/engines/sword25/gfx/animationresource.cpp
index 8c09a545a0..431d466658 100644
--- a/engines/sword25/gfx/animationresource.cpp
+++ b/engines/sword25/gfx/animationresource.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/sword25/gfx/animationresource.h b/engines/sword25/gfx/animationresource.h
index 70291f220e..d4b58326cb 100644
--- a/engines/sword25/gfx/animationresource.h
+++ b/engines/sword25/gfx/animationresource.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/sword25/gfx/animationtemplate.cpp b/engines/sword25/gfx/animationtemplate.cpp
index a1d2bf5d1a..7db89be8b2 100644
--- a/engines/sword25/gfx/animationtemplate.cpp
+++ b/engines/sword25/gfx/animationtemplate.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/sword25/gfx/animationtemplate.h b/engines/sword25/gfx/animationtemplate.h
index b61ecfcf54..6968e44183 100644
--- a/engines/sword25/gfx/animationtemplate.h
+++ b/engines/sword25/gfx/animationtemplate.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/sword25/gfx/animationtemplateregistry.cpp b/engines/sword25/gfx/animationtemplateregistry.cpp
index 4cefe24b18..4783a314f4 100644
--- a/engines/sword25/gfx/animationtemplateregistry.cpp
+++ b/engines/sword25/gfx/animationtemplateregistry.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/sword25/gfx/animationtemplateregistry.h b/engines/sword25/gfx/animationtemplateregistry.h
index d3d02b2ac8..cbc6cc0120 100644
--- a/engines/sword25/gfx/animationtemplateregistry.h
+++ b/engines/sword25/gfx/animationtemplateregistry.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/sword25/gfx/bitmap.cpp b/engines/sword25/gfx/bitmap.cpp
index 593a426975..c9a2d8601a 100644
--- a/engines/sword25/gfx/bitmap.cpp
+++ b/engines/sword25/gfx/bitmap.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/sword25/gfx/bitmap.h b/engines/sword25/gfx/bitmap.h
index f22c5d7fc9..71e0f1d306 100644
--- a/engines/sword25/gfx/bitmap.h
+++ b/engines/sword25/gfx/bitmap.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/sword25/gfx/bitmapresource.h b/engines/sword25/gfx/bitmapresource.h
index 72b8a3ea1f..7a4daedd84 100644
--- a/engines/sword25/gfx/bitmapresource.h
+++ b/engines/sword25/gfx/bitmapresource.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/sword25/gfx/dynamicbitmap.cpp b/engines/sword25/gfx/dynamicbitmap.cpp
index 1f3d2d063d..ce9c056d08 100644
--- a/engines/sword25/gfx/dynamicbitmap.cpp
+++ b/engines/sword25/gfx/dynamicbitmap.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/sword25/gfx/dynamicbitmap.h b/engines/sword25/gfx/dynamicbitmap.h
index ed53776577..ddea5238d4 100644
--- a/engines/sword25/gfx/dynamicbitmap.h
+++ b/engines/sword25/gfx/dynamicbitmap.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/sword25/gfx/fontresource.cpp b/engines/sword25/gfx/fontresource.cpp
index 0aeca7c180..c4d4c3c52e 100644
--- a/engines/sword25/gfx/fontresource.cpp
+++ b/engines/sword25/gfx/fontresource.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/sword25/gfx/fontresource.h b/engines/sword25/gfx/fontresource.h
index 511f485658..be10e42876 100644
--- a/engines/sword25/gfx/fontresource.h
+++ b/engines/sword25/gfx/fontresource.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/sword25/gfx/graphicengine.cpp b/engines/sword25/gfx/graphicengine.cpp
index bfdb51481b..2a870c021d 100644
--- a/engines/sword25/gfx/graphicengine.cpp
+++ b/engines/sword25/gfx/graphicengine.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/sword25/gfx/graphicengine.h b/engines/sword25/gfx/graphicengine.h
index 3309763966..cf4289b8bb 100644
--- a/engines/sword25/gfx/graphicengine.h
+++ b/engines/sword25/gfx/graphicengine.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/sword25/gfx/graphicengine_script.cpp b/engines/sword25/gfx/graphicengine_script.cpp
index b4334195a1..14b9de1453 100644
--- a/engines/sword25/gfx/graphicengine_script.cpp
+++ b/engines/sword25/gfx/graphicengine_script.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/sword25/gfx/image/art.cpp b/engines/sword25/gfx/image/art.cpp
index 9c4b9fe8bd..454c7e1047 100644
--- a/engines/sword25/gfx/image/art.cpp
+++ b/engines/sword25/gfx/image/art.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -424,8 +424,7 @@ static void art_vpath_render_bez(ArtVpath **p_vpath, int *pn, int *pn_max,
x_m, y_m, xb1, yb1, xb2, yb2, x3, y3, flatness);
} else {
// don't subdivide
- art_vpath_add_point(p_vpath, pn, pn_max,
- ART_LINETO, x3, y3);
+ art_vpath_add_point(p_vpath, pn, pn_max, ART_LINETO, x3, y3);
}
}
diff --git a/engines/sword25/gfx/image/art.h b/engines/sword25/gfx/image/art.h
index 40bcb55aa7..820520012c 100644
--- a/engines/sword25/gfx/image/art.h
+++ b/engines/sword25/gfx/image/art.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/sword25/gfx/image/image.h b/engines/sword25/gfx/image/image.h
index 8db54e7c54..8fbf802501 100644
--- a/engines/sword25/gfx/image/image.h
+++ b/engines/sword25/gfx/image/image.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/sword25/gfx/image/imgloader.cpp b/engines/sword25/gfx/image/imgloader.cpp
index 9006a596b4..b4b3030de8 100644
--- a/engines/sword25/gfx/image/imgloader.cpp
+++ b/engines/sword25/gfx/image/imgloader.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -33,14 +33,14 @@
#include "sword25/gfx/image/image.h"
#include "sword25/gfx/image/imgloader.h"
#include "graphics/pixelformat.h"
-#include "graphics/decoders/png.h"
+#include "image/png.h"
namespace Sword25 {
bool ImgLoader::decodePNGImage(const byte *fileDataPtr, uint fileSize, byte *&uncompressedDataPtr, int &width, int &height, int &pitch) {
Common::MemoryReadStream *fileStr = new Common::MemoryReadStream(fileDataPtr, fileSize, DisposeAfterUse::NO);
- Graphics::PNGDecoder png;
+ ::Image::PNGDecoder png;
if (!png.loadStream(*fileStr)) // the fileStr pointer, and thus pFileData will be deleted after this is done
error("Error while reading PNG image");
diff --git a/engines/sword25/gfx/image/imgloader.h b/engines/sword25/gfx/image/imgloader.h
index 735ab9203c..b932cdc903 100644
--- a/engines/sword25/gfx/image/imgloader.h
+++ b/engines/sword25/gfx/image/imgloader.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/sword25/gfx/image/renderedimage.cpp b/engines/sword25/gfx/image/renderedimage.cpp
index b359fc6a3e..107b4cd402 100644
--- a/engines/sword25/gfx/image/renderedimage.cpp
+++ b/engines/sword25/gfx/image/renderedimage.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/sword25/gfx/image/renderedimage.h b/engines/sword25/gfx/image/renderedimage.h
index 116f97de26..3cc9725b12 100644
--- a/engines/sword25/gfx/image/renderedimage.h
+++ b/engines/sword25/gfx/image/renderedimage.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/sword25/gfx/image/swimage.cpp b/engines/sword25/gfx/image/swimage.cpp
index 7e4c3143f5..776f8ce8d3 100644
--- a/engines/sword25/gfx/image/swimage.cpp
+++ b/engines/sword25/gfx/image/swimage.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/sword25/gfx/image/swimage.h b/engines/sword25/gfx/image/swimage.h
index a35127a41d..b31c2318ec 100644
--- a/engines/sword25/gfx/image/swimage.h
+++ b/engines/sword25/gfx/image/swimage.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/sword25/gfx/image/vectorimage.cpp b/engines/sword25/gfx/image/vectorimage.cpp
index ab895b5cef..0e5dfb9c53 100644
--- a/engines/sword25/gfx/image/vectorimage.cpp
+++ b/engines/sword25/gfx/image/vectorimage.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/sword25/gfx/image/vectorimage.h b/engines/sword25/gfx/image/vectorimage.h
index d1760a433e..a99d532e75 100644
--- a/engines/sword25/gfx/image/vectorimage.h
+++ b/engines/sword25/gfx/image/vectorimage.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/sword25/gfx/image/vectorimagerenderer.cpp b/engines/sword25/gfx/image/vectorimagerenderer.cpp
index 6d4dc213f2..c7a79fd3c4 100644
--- a/engines/sword25/gfx/image/vectorimagerenderer.cpp
+++ b/engines/sword25/gfx/image/vectorimagerenderer.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/sword25/gfx/microtiles.cpp b/engines/sword25/gfx/microtiles.cpp
index 18e4a9a1fb..792e4ef385 100644
--- a/engines/sword25/gfx/microtiles.cpp
+++ b/engines/sword25/gfx/microtiles.cpp
@@ -8,17 +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.
*
- *
*/
#include "sword25/gfx/microtiles.h"
diff --git a/engines/sword25/gfx/microtiles.h b/engines/sword25/gfx/microtiles.h
index 454fc39f37..8f94b6cfbf 100644
--- a/engines/sword25/gfx/microtiles.h
+++ b/engines/sword25/gfx/microtiles.h
@@ -8,17 +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.
*
- *
*/
#ifndef SWORD25_MICROTILES_H
diff --git a/engines/sword25/gfx/panel.cpp b/engines/sword25/gfx/panel.cpp
index 9b7fe82914..9699db7f6a 100644
--- a/engines/sword25/gfx/panel.cpp
+++ b/engines/sword25/gfx/panel.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/sword25/gfx/panel.h b/engines/sword25/gfx/panel.h
index d372b4e0fc..5010cbaaf0 100644
--- a/engines/sword25/gfx/panel.h
+++ b/engines/sword25/gfx/panel.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/sword25/gfx/renderobject.cpp b/engines/sword25/gfx/renderobject.cpp
index e9e11aae4e..c109e49aa8 100644
--- a/engines/sword25/gfx/renderobject.cpp
+++ b/engines/sword25/gfx/renderobject.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/sword25/gfx/renderobject.h b/engines/sword25/gfx/renderobject.h
index 7fcd3a87a3..8fde17e7a6 100644
--- a/engines/sword25/gfx/renderobject.h
+++ b/engines/sword25/gfx/renderobject.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/sword25/gfx/renderobjectmanager.cpp b/engines/sword25/gfx/renderobjectmanager.cpp
index 57c8ec318f..4927b4c58e 100644
--- a/engines/sword25/gfx/renderobjectmanager.cpp
+++ b/engines/sword25/gfx/renderobjectmanager.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -103,13 +103,16 @@ bool RenderObjectManager::render() {
_uta->clear();
// Add rectangles of objects which don't exist in this frame any more
- for (RenderObjectQueue::iterator it = _prevQueue->begin(); it != _prevQueue->end(); ++it)
- if (!_currQueue->exists(*it))
- _uta->addRect((*it)._bbox);
- // Add rectangles of objects which are different from the previous frame
- for (RenderObjectQueue::iterator it = _currQueue->begin(); it != _currQueue->end(); ++it)
- if (!_prevQueue->exists(*it))
- _uta->addRect((*it)._bbox);
+ for (RenderObjectQueue::iterator it = _prevQueue->begin(); it != _prevQueue->end(); ++it) {
+ if (!_currQueue->exists(*it))
+ _uta->addRect((*it)._bbox);
+ }
+
+ // Add rectangles of objects which are different from the previous frame
+ for (RenderObjectQueue::iterator it = _currQueue->begin(); it != _currQueue->end(); ++it) {
+ if (!_prevQueue->exists(*it))
+ _uta->addRect((*it)._bbox);
+ }
RectangleList *updateRects = _uta->getRectangles();
Common::Array<int> updateRectsMinZ;
diff --git a/engines/sword25/gfx/renderobjectmanager.h b/engines/sword25/gfx/renderobjectmanager.h
index 1db91dfbe6..c56e49aff9 100644
--- a/engines/sword25/gfx/renderobjectmanager.h
+++ b/engines/sword25/gfx/renderobjectmanager.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/sword25/gfx/renderobjectptr.h b/engines/sword25/gfx/renderobjectptr.h
index 7b7f190a01..950fdcfb45 100644
--- a/engines/sword25/gfx/renderobjectptr.h
+++ b/engines/sword25/gfx/renderobjectptr.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/sword25/gfx/renderobjectregistry.h b/engines/sword25/gfx/renderobjectregistry.h
index 92d8c9b830..49ed4e7d5c 100644
--- a/engines/sword25/gfx/renderobjectregistry.h
+++ b/engines/sword25/gfx/renderobjectregistry.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/sword25/gfx/rootrenderobject.h b/engines/sword25/gfx/rootrenderobject.h
index f1b19d6bae..608af8f14c 100644
--- a/engines/sword25/gfx/rootrenderobject.h
+++ b/engines/sword25/gfx/rootrenderobject.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/sword25/gfx/screenshot.cpp b/engines/sword25/gfx/screenshot.cpp
index 7b56a6e9f3..4b4f967f29 100644
--- a/engines/sword25/gfx/screenshot.cpp
+++ b/engines/sword25/gfx/screenshot.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/sword25/gfx/screenshot.h b/engines/sword25/gfx/screenshot.h
index e2e2dfc7f5..fb37dfc9c0 100644
--- a/engines/sword25/gfx/screenshot.h
+++ b/engines/sword25/gfx/screenshot.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/sword25/gfx/staticbitmap.cpp b/engines/sword25/gfx/staticbitmap.cpp
index bb57fa3a03..14e2012d80 100644
--- a/engines/sword25/gfx/staticbitmap.cpp
+++ b/engines/sword25/gfx/staticbitmap.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/sword25/gfx/staticbitmap.h b/engines/sword25/gfx/staticbitmap.h
index 90b92b4331..4ded60aec8 100644
--- a/engines/sword25/gfx/staticbitmap.h
+++ b/engines/sword25/gfx/staticbitmap.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/sword25/gfx/text.cpp b/engines/sword25/gfx/text.cpp
index 8c33fa8d61..b0a9e4ed3f 100644
--- a/engines/sword25/gfx/text.cpp
+++ b/engines/sword25/gfx/text.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/sword25/gfx/text.h b/engines/sword25/gfx/text.h
index 873eb33380..0187643659 100644
--- a/engines/sword25/gfx/text.h
+++ b/engines/sword25/gfx/text.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/sword25/gfx/timedrenderobject.cpp b/engines/sword25/gfx/timedrenderobject.cpp
index e35b0ae95b..bedde83781 100644
--- a/engines/sword25/gfx/timedrenderobject.cpp
+++ b/engines/sword25/gfx/timedrenderobject.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/sword25/gfx/timedrenderobject.h b/engines/sword25/gfx/timedrenderobject.h
index 44c3b40528..387cd21b42 100644
--- a/engines/sword25/gfx/timedrenderobject.h
+++ b/engines/sword25/gfx/timedrenderobject.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/sword25/input/inputengine.cpp b/engines/sword25/input/inputengine.cpp
index 0d1c449805..7157e7242f 100644
--- a/engines/sword25/input/inputengine.cpp
+++ b/engines/sword25/input/inputengine.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/sword25/input/inputengine.h b/engines/sword25/input/inputengine.h
index f79890a9fd..c5ef40cc9e 100644
--- a/engines/sword25/input/inputengine.h
+++ b/engines/sword25/input/inputengine.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/sword25/input/inputengine_script.cpp b/engines/sword25/input/inputengine_script.cpp
index db2619294c..17b0584c2c 100644
--- a/engines/sword25/input/inputengine_script.cpp
+++ b/engines/sword25/input/inputengine_script.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/sword25/kernel/common.h b/engines/sword25/kernel/common.h
index 8cfc81e981..0fc6bf725e 100644
--- a/engines/sword25/kernel/common.h
+++ b/engines/sword25/kernel/common.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/sword25/kernel/filesystemutil.cpp b/engines/sword25/kernel/filesystemutil.cpp
index 281e7986df..a3e3081b8f 100644
--- a/engines/sword25/kernel/filesystemutil.cpp
+++ b/engines/sword25/kernel/filesystemutil.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/sword25/kernel/filesystemutil.h b/engines/sword25/kernel/filesystemutil.h
index bb100123d9..9c20de7696 100644
--- a/engines/sword25/kernel/filesystemutil.h
+++ b/engines/sword25/kernel/filesystemutil.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/sword25/kernel/inputpersistenceblock.cpp b/engines/sword25/kernel/inputpersistenceblock.cpp
index aa3a759756..c38f967506 100644
--- a/engines/sword25/kernel/inputpersistenceblock.cpp
+++ b/engines/sword25/kernel/inputpersistenceblock.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/sword25/kernel/inputpersistenceblock.h b/engines/sword25/kernel/inputpersistenceblock.h
index 02a944ff1b..bcda794a51 100644
--- a/engines/sword25/kernel/inputpersistenceblock.h
+++ b/engines/sword25/kernel/inputpersistenceblock.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/sword25/kernel/kernel.cpp b/engines/sword25/kernel/kernel.cpp
index d6388eee2b..cf972818d2 100644
--- a/engines/sword25/kernel/kernel.cpp
+++ b/engines/sword25/kernel/kernel.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/sword25/kernel/kernel.h b/engines/sword25/kernel/kernel.h
index adf69f92d6..411d0cf3b2 100644
--- a/engines/sword25/kernel/kernel.h
+++ b/engines/sword25/kernel/kernel.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/sword25/kernel/kernel_script.cpp b/engines/sword25/kernel/kernel_script.cpp
index 27a221d45f..1b7c6a6f14 100644
--- a/engines/sword25/kernel/kernel_script.cpp
+++ b/engines/sword25/kernel/kernel_script.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/sword25/kernel/objectregistry.h b/engines/sword25/kernel/objectregistry.h
index 449b1b60a3..9491a2217c 100644
--- a/engines/sword25/kernel/objectregistry.h
+++ b/engines/sword25/kernel/objectregistry.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/sword25/kernel/outputpersistenceblock.cpp b/engines/sword25/kernel/outputpersistenceblock.cpp
index 53fb624767..9003b5d58a 100644
--- a/engines/sword25/kernel/outputpersistenceblock.cpp
+++ b/engines/sword25/kernel/outputpersistenceblock.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/sword25/kernel/outputpersistenceblock.h b/engines/sword25/kernel/outputpersistenceblock.h
index 17f018a106..c7d8dfc6aa 100644
--- a/engines/sword25/kernel/outputpersistenceblock.h
+++ b/engines/sword25/kernel/outputpersistenceblock.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/sword25/kernel/persistable.h b/engines/sword25/kernel/persistable.h
index 1807211847..8df2c45b2e 100644
--- a/engines/sword25/kernel/persistable.h
+++ b/engines/sword25/kernel/persistable.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/sword25/kernel/persistenceblock.h b/engines/sword25/kernel/persistenceblock.h
index 8ac3e84a41..a56c85770c 100644
--- a/engines/sword25/kernel/persistenceblock.h
+++ b/engines/sword25/kernel/persistenceblock.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/sword25/kernel/persistenceservice.cpp b/engines/sword25/kernel/persistenceservice.cpp
index df26da7800..fb83b7f941 100644
--- a/engines/sword25/kernel/persistenceservice.cpp
+++ b/engines/sword25/kernel/persistenceservice.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/sword25/kernel/persistenceservice.h b/engines/sword25/kernel/persistenceservice.h
index 59e0a3661d..bc73ae9f43 100644
--- a/engines/sword25/kernel/persistenceservice.h
+++ b/engines/sword25/kernel/persistenceservice.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/sword25/kernel/resmanager.cpp b/engines/sword25/kernel/resmanager.cpp
index cc3316250a..c0f94ae5c5 100644
--- a/engines/sword25/kernel/resmanager.cpp
+++ b/engines/sword25/kernel/resmanager.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/sword25/kernel/resmanager.h b/engines/sword25/kernel/resmanager.h
index 6b95a45b6e..57a091295a 100644
--- a/engines/sword25/kernel/resmanager.h
+++ b/engines/sword25/kernel/resmanager.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/sword25/kernel/resource.cpp b/engines/sword25/kernel/resource.cpp
index 656355cc17..e0d46a807b 100644
--- a/engines/sword25/kernel/resource.cpp
+++ b/engines/sword25/kernel/resource.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/sword25/kernel/resource.h b/engines/sword25/kernel/resource.h
index 7c8175c9c9..41deb24d88 100644
--- a/engines/sword25/kernel/resource.h
+++ b/engines/sword25/kernel/resource.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/sword25/kernel/resservice.h b/engines/sword25/kernel/resservice.h
index 69b0688e32..11b0b824fb 100644
--- a/engines/sword25/kernel/resservice.h
+++ b/engines/sword25/kernel/resservice.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/sword25/kernel/service.h b/engines/sword25/kernel/service.h
index 576776bb5f..aa40563e06 100644
--- a/engines/sword25/kernel/service.h
+++ b/engines/sword25/kernel/service.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/sword25/math/geometry.h b/engines/sword25/math/geometry.h
index bdbd5b2052..1539a93a31 100644
--- a/engines/sword25/math/geometry.h
+++ b/engines/sword25/math/geometry.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/sword25/math/geometry_script.cpp b/engines/sword25/math/geometry_script.cpp
index 70798f7692..192a6adf54 100644
--- a/engines/sword25/math/geometry_script.cpp
+++ b/engines/sword25/math/geometry_script.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/sword25/math/line.h b/engines/sword25/math/line.h
index 9eaa2d3c8c..9e2a50fac3 100644
--- a/engines/sword25/math/line.h
+++ b/engines/sword25/math/line.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/sword25/math/polygon.cpp b/engines/sword25/math/polygon.cpp
index 99d947df87..ccefa1901e 100644
--- a/engines/sword25/math/polygon.cpp
+++ b/engines/sword25/math/polygon.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/sword25/math/polygon.h b/engines/sword25/math/polygon.h
index f81e165621..3cb2286be1 100644
--- a/engines/sword25/math/polygon.h
+++ b/engines/sword25/math/polygon.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/sword25/math/region.cpp b/engines/sword25/math/region.cpp
index db888e432a..cf422af774 100644
--- a/engines/sword25/math/region.cpp
+++ b/engines/sword25/math/region.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/sword25/math/region.h b/engines/sword25/math/region.h
index 0fd7223631..a61c0c4c94 100644
--- a/engines/sword25/math/region.h
+++ b/engines/sword25/math/region.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/sword25/math/regionregistry.cpp b/engines/sword25/math/regionregistry.cpp
index e4925f7baf..35a5fb4b88 100644
--- a/engines/sword25/math/regionregistry.cpp
+++ b/engines/sword25/math/regionregistry.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/sword25/math/regionregistry.h b/engines/sword25/math/regionregistry.h
index 9e0a28bea7..04a96c52c7 100644
--- a/engines/sword25/math/regionregistry.h
+++ b/engines/sword25/math/regionregistry.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/sword25/math/vertex.cpp b/engines/sword25/math/vertex.cpp
index b486d35e7e..ed0baeeeb3 100644
--- a/engines/sword25/math/vertex.cpp
+++ b/engines/sword25/math/vertex.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/sword25/math/vertex.h b/engines/sword25/math/vertex.h
index 4cb0eaca30..89ad344f6a 100644
--- a/engines/sword25/math/vertex.h
+++ b/engines/sword25/math/vertex.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/sword25/math/walkregion.cpp b/engines/sword25/math/walkregion.cpp
index 0ba7e8ec3d..f7160317c6 100644
--- a/engines/sword25/math/walkregion.cpp
+++ b/engines/sword25/math/walkregion.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/sword25/math/walkregion.h b/engines/sword25/math/walkregion.h
index 7dded1980b..9a3b6e616b 100644
--- a/engines/sword25/math/walkregion.h
+++ b/engines/sword25/math/walkregion.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/sword25/package/packagemanager.cpp b/engines/sword25/package/packagemanager.cpp
index 5549f50c3c..2db4f2da74 100644
--- a/engines/sword25/package/packagemanager.cpp
+++ b/engines/sword25/package/packagemanager.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/sword25/package/packagemanager.h b/engines/sword25/package/packagemanager.h
index b0c6718008..a1806a4046 100644
--- a/engines/sword25/package/packagemanager.h
+++ b/engines/sword25/package/packagemanager.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/sword25/package/packagemanager_script.cpp b/engines/sword25/package/packagemanager_script.cpp
index 229ec37459..4e72ad1934 100644
--- a/engines/sword25/package/packagemanager_script.cpp
+++ b/engines/sword25/package/packagemanager_script.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/sword25/script/lua_extensions.cpp b/engines/sword25/script/lua_extensions.cpp
index bf502d719e..3f828aee46 100644
--- a/engines/sword25/script/lua_extensions.cpp
+++ b/engines/sword25/script/lua_extensions.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/sword25/script/luabindhelper.cpp b/engines/sword25/script/luabindhelper.cpp
index 6900305f5c..1dd84bc36e 100644
--- a/engines/sword25/script/luabindhelper.cpp
+++ b/engines/sword25/script/luabindhelper.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/sword25/script/luabindhelper.h b/engines/sword25/script/luabindhelper.h
index 5223d4440e..85d6570b1b 100644
--- a/engines/sword25/script/luabindhelper.h
+++ b/engines/sword25/script/luabindhelper.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/sword25/script/luacallback.cpp b/engines/sword25/script/luacallback.cpp
index cee0531b8a..72f7e01612 100644
--- a/engines/sword25/script/luacallback.cpp
+++ b/engines/sword25/script/luacallback.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/sword25/script/luacallback.h b/engines/sword25/script/luacallback.h
index 796af8598b..fa5ba9c228 100644
--- a/engines/sword25/script/luacallback.h
+++ b/engines/sword25/script/luacallback.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/sword25/script/luascript.cpp b/engines/sword25/script/luascript.cpp
index 9d394309e6..f62a08005b 100644
--- a/engines/sword25/script/luascript.cpp
+++ b/engines/sword25/script/luascript.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/sword25/script/luascript.h b/engines/sword25/script/luascript.h
index 1a4a38c3be..a13a50749d 100644
--- a/engines/sword25/script/luascript.h
+++ b/engines/sword25/script/luascript.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/sword25/script/script.h b/engines/sword25/script/script.h
index 04f248fe7e..8f9c00a986 100644
--- a/engines/sword25/script/script.h
+++ b/engines/sword25/script/script.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/sword25/sfx/soundengine.cpp b/engines/sword25/sfx/soundengine.cpp
index 8ff1b0cf2a..dcb29cb380 100644
--- a/engines/sword25/sfx/soundengine.cpp
+++ b/engines/sword25/sfx/soundengine.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -114,7 +114,7 @@ float SoundEngine::getVolume(SOUND_TYPES type) {
error("Unknown SOUND_TYPE");
}
- return (float)val / 255.0;
+ return (float)val / 255.0f;
}
void SoundEngine::pauseAll() {
@@ -302,7 +302,7 @@ float SoundEngine::getSoundVolume(uint handle) {
SndHandle* sndHandle = findHandle(handle);
if (sndHandle == NULL)
return 0.f;
- return (float)_mixer->getChannelVolume(sndHandle->handle) / 255.0;
+ return (float)_mixer->getChannelVolume(sndHandle->handle) / 255.0f;
}
float SoundEngine::getSoundPanning(uint handle) {
@@ -311,7 +311,7 @@ float SoundEngine::getSoundPanning(uint handle) {
SndHandle* sndHandle = findHandle(handle);
if (sndHandle == NULL)
return 0.f;
- return (float)_mixer->getChannelBalance(sndHandle->handle) / 127.0;
+ return (float)_mixer->getChannelBalance(sndHandle->handle) / 127.0f;
}
Resource *SoundEngine::loadResource(const Common::String &fileName) {
diff --git a/engines/sword25/sfx/soundengine.h b/engines/sword25/sfx/soundengine.h
index 8974ee69e5..1dd7ba0925 100644
--- a/engines/sword25/sfx/soundengine.h
+++ b/engines/sword25/sfx/soundengine.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/sword25/sfx/soundengine_script.cpp b/engines/sword25/sfx/soundengine_script.cpp
index d7771967a3..48e71de66c 100644
--- a/engines/sword25/sfx/soundengine_script.cpp
+++ b/engines/sword25/sfx/soundengine_script.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/sword25/sword25.cpp b/engines/sword25/sword25.cpp
index 2201188052..259deb2ea8 100644
--- a/engines/sword25/sword25.cpp
+++ b/engines/sword25/sword25.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/sword25/sword25.h b/engines/sword25/sword25.h
index 1254ea177b..72391cf9d8 100644
--- a/engines/sword25/sword25.h
+++ b/engines/sword25/sword25.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/sword25/util/lua/lopcodes.cpp b/engines/sword25/util/lua/lopcodes.cpp
index 9d76862ae2..8b0a3ab330 100644
--- a/engines/sword25/util/lua/lopcodes.cpp
+++ b/engines/sword25/util/lua/lopcodes.cpp
@@ -61,7 +61,7 @@ const char *const luaP_opnames[NUM_OPCODES+1] = {
const lu_byte luaP_opmodes[NUM_OPCODES] = {
/* T A B C mode opcode */
- opmode(0, 1, OpArgR, OpArgN, iABC) /* OP_MOVE */
+ opmode(0, 1, OpArgR, OpArgN, iABC) /* OP_MOVE */
,opmode(0, 1, OpArgK, OpArgN, iABx) /* OP_LOADK */
,opmode(0, 1, OpArgU, OpArgU, iABC) /* OP_LOADBOOL */
,opmode(0, 1, OpArgR, OpArgN, iABC) /* OP_LOADNIL */
diff --git a/engines/sword25/util/lua/loslib.cpp b/engines/sword25/util/lua/loslib.cpp
index 25bfa2d1b5..055dfdf19e 100644
--- a/engines/sword25/util/lua/loslib.cpp
+++ b/engines/sword25/util/lua/loslib.cpp
@@ -113,6 +113,9 @@ static int getfield (lua_State *L, const char *key, int d) {
static int os_date (lua_State *L) {
+ #ifdef __PLAYSTATION2__ // missing: gmtime & strftime
+ lua_pushnil(L);
+ #else
const char *s = luaL_optstring(L, 1, "%c");
// FIXME: Rewrite the code below to use OSystem::getTimeAndDate
// Alternatively, remove it, if sword25 does not use it.
@@ -160,6 +163,7 @@ static int os_date (lua_State *L) {
}
luaL_pushresult(&b);
}
+ #endif
return 1;
}
@@ -167,6 +171,9 @@ static int os_date (lua_State *L) {
static int os_time (lua_State *L) {
// FIXME: Rewrite the code below to use OSystem::getTimeAndDate.
// Alternatively, remove it, if sword25 does not use it.
+ #ifdef __PLAYSTATION2__ // missing: mktime
+ lua_pushnil(L);
+ #else
time_t t;
if (lua_isnoneornil(L, 1)) /* called without args? */
t = time(NULL); /* get current time */
@@ -187,6 +194,7 @@ static int os_time (lua_State *L) {
lua_pushnil(L);
else
lua_pushnumber(L, (lua_Number)t);
+ #endif
return 1;
}
@@ -195,8 +203,10 @@ static int os_difftime (lua_State *L) {
// FIXME: difftime is not portable, unfortunately.
// So we either have to replace this code, or just remove it,
// depending on whether sword25 actually uses it.
+ #ifndef __PLAYSTATION2__ // missing: difftime
lua_pushnumber(L, difftime((time_t)(luaL_checknumber(L, 1)),
(time_t)(luaL_optnumber(L, 2, 0))));
+ #endif
return 1;
}
diff --git a/engines/sword25/util/lua/lua.h b/engines/sword25/util/lua/lua.h
index a3b7573ca5..4f557e462b 100644
--- a/engines/sword25/util/lua/lua.h
+++ b/engines/sword25/util/lua/lua.h
@@ -22,7 +22,7 @@
#define LUA_RELEASE "Lua 5.1.3"
#define LUA_VERSION_NUM 501
#define LUA_COPYRIGHT "Copyright (C) 1994-2008 Lua.org, PUC-Rio"
-#define LUA_AUTHORS "R. Ierusalimschy, L. H. de Figueiredo & W. Celes"
+#define LUA_AUTHORS "R. Ierusalimschy, L. H. de Figueiredo & W. Celes"
/* mark for precompiled code (`<esc>Lua') */
diff --git a/engines/sword25/util/lua/scummvm_file.cpp b/engines/sword25/util/lua/scummvm_file.cpp
index b5f1388129..c38aba004f 100644
--- a/engines/sword25/util/lua/scummvm_file.cpp
+++ b/engines/sword25/util/lua/scummvm_file.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/sword25/util/lua/scummvm_file.h b/engines/sword25/util/lua/scummvm_file.h
index e8c468ee07..72d2690a4d 100644
--- a/engines/sword25/util/lua/scummvm_file.h
+++ b/engines/sword25/util/lua/scummvm_file.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/sword25/util/pluto/pluto.cpp b/engines/sword25/util/pluto/pluto.cpp
index b7a8fd3c8b..fb477c1687 100644
--- a/engines/sword25/util/pluto/pluto.cpp
+++ b/engines/sword25/util/pluto/pluto.cpp
@@ -19,7 +19,6 @@
* for Mobile Lua (http://luaos.net/pages/mobile-lua.php)
*/
-#include "config.h"
#include "sword25/util/lua/lua.h"
#include "pluto.h"
diff --git a/engines/teenagent/actor.cpp b/engines/teenagent/actor.cpp
index d65a367309..5c796c13ab 100644
--- a/engines/teenagent/actor.cpp
+++ b/engines/teenagent/actor.cpp
@@ -17,6 +17,7 @@
* You should have received a copy of the GNU General Public 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 "teenagent/actor.h"
@@ -133,10 +134,6 @@ Common::Rect Actor::render(Graphics::Surface *surface, const Common::Point &posi
default:
return Common::Rect();
}
- if (s == NULL) {
- warning("no surface, skipping");
- return Common::Rect();
- }
Common::Rect dirty;
Common::Rect clip(0, 0, s->w, s->h);
diff --git a/engines/teenagent/actor.h b/engines/teenagent/actor.h
index 942397c636..33ed9e90d0 100644
--- a/engines/teenagent/actor.h
+++ b/engines/teenagent/actor.h
@@ -17,6 +17,7 @@
* You should have received a copy of the GNU General Public 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 "teenagent/animation.h"
diff --git a/engines/teenagent/animation.cpp b/engines/teenagent/animation.cpp
index effafcaac6..5708c101ec 100644
--- a/engines/teenagent/animation.cpp
+++ b/engines/teenagent/animation.cpp
@@ -17,6 +17,7 @@
* You should have received a copy of the GNU General Public 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 "teenagent/teenagent.h"
diff --git a/engines/teenagent/animation.h b/engines/teenagent/animation.h
index 9be21a4c3d..44b1312554 100644
--- a/engines/teenagent/animation.h
+++ b/engines/teenagent/animation.h
@@ -17,6 +17,7 @@
* You should have received a copy of the GNU General Public 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 TEENAGENT_ANIMATION_H
diff --git a/engines/teenagent/callbacks.cpp b/engines/teenagent/callbacks.cpp
index 3e6e40a8fa..74d3d7d56d 100644
--- a/engines/teenagent/callbacks.cpp
+++ b/engines/teenagent/callbacks.cpp
@@ -17,6 +17,7 @@
* You should have received a copy of the GNU General Public 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 "teenagent/teenagent.h"
@@ -1808,6 +1809,10 @@ bool TeenAgentEngine::processCallback(uint16 addr) {
displayMessage(dsAddr_uninterestingHaystackMsg); // "I don't see anything interesting about this haystack"
break;
+ case 0x6663:
+ displayMessage(dsAddr_uninterestingHaystackMsg); // "I don't see anything interesting about this haystack"
+ break;
+
case 0x666a:
displayMessage(dsAddr_moreComplicatedMsg); // "It's more complicated than that"
break;
@@ -2382,6 +2387,10 @@ bool TeenAgentEngine::processCallback(uint16 addr) {
fnEgoDefaultPosition();
break;
+ case 0x5634:
+ displayMessage(dsAddr_pullObjMsg2); // "I can't reach it"
+ break;
+
case 0x563b:
playSound(5, 10);
setOns(1, 0);
@@ -3322,6 +3331,10 @@ bool TeenAgentEngine::processCallback(uint16 addr) {
fnMansionIntrusionAttempt();
break;
+ case 0x830b:
+ displayMessage(dsAddr_noChainsawFuelMsg); // "There's no fuel in the chainsaw"
+ break;
+
case 0x8312: // hedgehog + plastic apple
dialog->showMark(76, scene);
setLan(1, 0);
@@ -4611,7 +4624,7 @@ bool TeenAgentEngine::processCallback(uint16 addr) {
SET_FLAG(dsAddr_mansionVCRPlayedTapeBeforeFlag, 1);
}
} else
- displayMessage(dsAddr_tvOffMsg); // "I just realised that the TV is off"
+ displayMessage(dsAddr_tvOffMsg); // "I just realized that the TV is off"
} else {
SET_FLAG(dsAddr_mansionVCRPlayingTapeFlag, 0);
if (CHECK_FLAG(dsAddr_mansionTVOnFlag, 1)) {
diff --git a/engines/teenagent/configure.engine b/engines/teenagent/configure.engine
new file mode 100644
index 0000000000..223a0e884c
--- /dev/null
+++ b/engines/teenagent/configure.engine
@@ -0,0 +1,3 @@
+# This file is included from the main "configure" script
+# add_engine [name] [desc] [build-by-default] [subengines] [base games] [deps]
+add_engine teenagent "Teen Agent" yes
diff --git a/engines/teenagent/console.cpp b/engines/teenagent/console.cpp
index 9ab6001d54..2304829782 100644
--- a/engines/teenagent/console.cpp
+++ b/engines/teenagent/console.cpp
@@ -17,6 +17,7 @@
* You should have received a copy of the GNU General Public 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 "teenagent/console.h"
@@ -25,24 +26,24 @@
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("animation", WRAP_METHOD(Console, playAnimation));
- DCmd_Register("actor_animation", WRAP_METHOD(Console, playActorAnimation));
- DCmd_Register("call", WRAP_METHOD(Console, call));
+ registerCmd("enable_object", WRAP_METHOD(Console, enableObject));
+ registerCmd("disable_object", WRAP_METHOD(Console, enableObject));
+ registerCmd("set_ons", WRAP_METHOD(Console, setOns));
+ registerCmd("set_music", WRAP_METHOD(Console, setMusic));
+ registerCmd("animation", WRAP_METHOD(Console, playAnimation));
+ registerCmd("actor_animation", WRAP_METHOD(Console, playActorAnimation));
+ registerCmd("call", WRAP_METHOD(Console, call));
}
bool Console::enableObject(int argc, const char **argv) {
if (argc < 2) {
- DebugPrintf("usage: %s object_id [scene_id]\n", argv[0]);
+ debugPrintf("usage: %s object_id [scene_id]\n", argv[0]);
return true;
}
int id = atoi(argv[1]);
if (id < 0) {
- DebugPrintf("object id %d is invalid\n", id);
+ debugPrintf("object id %d is invalid\n", id);
return true;
}
@@ -50,7 +51,7 @@ bool Console::enableObject(int argc, const char **argv) {
if (argc > 2) {
scene_id = atoi(argv[2]);
if (scene_id < 0) {
- DebugPrintf("scene id %d is invalid\n", scene_id);
+ debugPrintf("scene id %d is invalid\n", scene_id);
return true;
}
}
@@ -65,20 +66,20 @@ bool Console::enableObject(int argc, const char **argv) {
bool Console::setOns(int argc, const char **argv) {
if (argc < 3) {
- DebugPrintf("usage: %s index(0-3) value [scene_id]\n", argv[0]);
+ debugPrintf("usage: %s index(0-3) value [scene_id]\n", argv[0]);
return true;
}
int index = atoi(argv[1]);
if (index < 0 || index > 3) {
- DebugPrintf("index %d is invalid\n", index);
+ debugPrintf("index %d is invalid\n", index);
return true;
}
int value = 0;
value = atoi(argv[2]);
if (value < 0) {
- DebugPrintf("invalid value\n");
+ debugPrintf("invalid value\n");
return true;
}
@@ -86,7 +87,7 @@ bool Console::setOns(int argc, const char **argv) {
if (argc > 3) {
scene_id = atoi(argv[3]);
if (scene_id < 0) {
- DebugPrintf("scene id %d is invalid\n", scene_id);
+ debugPrintf("scene id %d is invalid\n", scene_id);
return true;
}
}
@@ -97,13 +98,13 @@ bool Console::setOns(int argc, const char **argv) {
bool Console::setMusic(int argc, const char **argv) {
if (argc < 2) {
- DebugPrintf("usage: %s index(1-11)\n", argv[0]);
+ debugPrintf("usage: %s index(1-11)\n", argv[0]);
return true;
}
int index = atoi(argv[1]);
if (index <= 0 || index > 11) {
- DebugPrintf("invalid value\n");
+ debugPrintf("invalid value\n");
return true;
}
@@ -113,14 +114,14 @@ bool Console::setMusic(int argc, const char **argv) {
bool Console::playAnimation(int argc, const char **argv) {
if (argc < 3) {
- DebugPrintf("usage: %s id slot(0-3)\n", argv[0]);
+ debugPrintf("usage: %s id slot(0-3)\n", argv[0]);
return true;
}
int id = atoi(argv[1]);
int slot = atoi(argv[2]);
if (id < 0 || slot < 0 || slot > 3) {
- DebugPrintf("invalid slot or animation id\n");
+ debugPrintf("invalid slot or animation id\n");
return true;
}
@@ -130,13 +131,13 @@ bool Console::playAnimation(int argc, const char **argv) {
bool Console::playActorAnimation(int argc, const char **argv) {
if (argc < 2) {
- DebugPrintf("usage: %s id\n", argv[0]);
+ debugPrintf("usage: %s id\n", argv[0]);
return true;
}
int id = atoi(argv[1]);
if (id < 0) {
- DebugPrintf("invalid animation id\n");
+ debugPrintf("invalid animation id\n");
return true;
}
@@ -146,18 +147,18 @@ bool Console::playActorAnimation(int argc, const char **argv) {
bool Console::call(int argc, const char **argv) {
if (argc < 2) {
- DebugPrintf("usage: %s 0xHEXADDR\n", argv[0]);
+ debugPrintf("usage: %s 0xHEXADDR\n", argv[0]);
return true;
}
uint addr;
if (sscanf(argv[1], "0x%x", &addr) != 1) {
- DebugPrintf("invalid address\n");
+ debugPrintf("invalid address\n");
return true;
}
if (!_engine->processCallback(addr))
- DebugPrintf("calling callback %04x failed\n", addr);
+ debugPrintf("calling callback %04x failed\n", addr);
return true;
}
diff --git a/engines/teenagent/console.h b/engines/teenagent/console.h
index 4dbdd3fc07..b569f98d8f 100644
--- a/engines/teenagent/console.h
+++ b/engines/teenagent/console.h
@@ -17,6 +17,7 @@
* You should have received a copy of the GNU General Public 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 TEENAGENT_CONSOLE_H
diff --git a/engines/teenagent/detection.cpp b/engines/teenagent/detection.cpp
index f9f5d2f13a..7a53faf98a 100644
--- a/engines/teenagent/detection.cpp
+++ b/engines/teenagent/detection.cpp
@@ -17,6 +17,7 @@
* You should have received a copy of the GNU General Public 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/system.h"
@@ -184,7 +185,7 @@ public:
};
#if PLUGIN_ENABLED_DYNAMIC(TEENAGENT)
-REGISTER_PLUGIN_DYNAMIC(TEENAGENT, PLUGIN_TYPE_ENGINE, TeenAgentMetaEngine);
+ REGISTER_PLUGIN_DYNAMIC(TEENAGENT, PLUGIN_TYPE_ENGINE, TeenAgentMetaEngine);
#else
-REGISTER_PLUGIN_STATIC(TEENAGENT, PLUGIN_TYPE_ENGINE, TeenAgentMetaEngine);
+ REGISTER_PLUGIN_STATIC(TEENAGENT, PLUGIN_TYPE_ENGINE, TeenAgentMetaEngine);
#endif
diff --git a/engines/teenagent/dialog.cpp b/engines/teenagent/dialog.cpp
index 312757a462..0993c26961 100644
--- a/engines/teenagent/dialog.cpp
+++ b/engines/teenagent/dialog.cpp
@@ -17,6 +17,7 @@
* You should have received a copy of the GNU General Public 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 "teenagent/dialog.h"
diff --git a/engines/teenagent/dialog.h b/engines/teenagent/dialog.h
index 6672ce7206..de67b999a2 100644
--- a/engines/teenagent/dialog.h
+++ b/engines/teenagent/dialog.h
@@ -17,6 +17,7 @@
* You should have received a copy of the GNU General Public 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 TEENAGENT_DIALOG_H
diff --git a/engines/teenagent/font.cpp b/engines/teenagent/font.cpp
index 9d85328f20..ab75a45ba7 100644
--- a/engines/teenagent/font.cpp
+++ b/engines/teenagent/font.cpp
@@ -17,6 +17,7 @@
* You should have received a copy of the GNU General Public 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 "teenagent/font.h"
diff --git a/engines/teenagent/font.h b/engines/teenagent/font.h
index a61f145fa6..65931f2084 100644
--- a/engines/teenagent/font.h
+++ b/engines/teenagent/font.h
@@ -17,6 +17,7 @@
* You should have received a copy of the GNU General Public 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 TEENAGENT_FONT_H
diff --git a/engines/teenagent/inventory.cpp b/engines/teenagent/inventory.cpp
index 354371666c..e8544446dc 100644
--- a/engines/teenagent/inventory.cpp
+++ b/engines/teenagent/inventory.cpp
@@ -17,6 +17,7 @@
* You should have received a copy of the GNU General Public 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/memstream.h"
diff --git a/engines/teenagent/inventory.h b/engines/teenagent/inventory.h
index d487848c2c..4a250987ba 100644
--- a/engines/teenagent/inventory.h
+++ b/engines/teenagent/inventory.h
@@ -17,6 +17,7 @@
* You should have received a copy of the GNU General Public 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 TEENAGENT_INVENTORY_H
diff --git a/engines/teenagent/music.cpp b/engines/teenagent/music.cpp
index b06a5f1f5e..5d66c3c90c 100644
--- a/engines/teenagent/music.cpp
+++ b/engines/teenagent/music.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/teenagent/music.h b/engines/teenagent/music.h
index 408436cf3a..e1630cc845 100644
--- a/engines/teenagent/music.h
+++ b/engines/teenagent/music.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/teenagent/objects.cpp b/engines/teenagent/objects.cpp
index 5dad9ab99d..3197a715aa 100644
--- a/engines/teenagent/objects.cpp
+++ b/engines/teenagent/objects.cpp
@@ -17,6 +17,7 @@
* You should have received a copy of the GNU General Public 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/debug.h"
diff --git a/engines/teenagent/objects.h b/engines/teenagent/objects.h
index 6e7955766f..f923ae52ab 100644
--- a/engines/teenagent/objects.h
+++ b/engines/teenagent/objects.h
@@ -17,6 +17,7 @@
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
*/
diff --git a/engines/teenagent/pack.cpp b/engines/teenagent/pack.cpp
index 2e6c913a72..cbf2bfd89e 100644
--- a/engines/teenagent/pack.cpp
+++ b/engines/teenagent/pack.cpp
@@ -17,6 +17,7 @@
* You should have received a copy of the GNU General Public 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 "teenagent/pack.h"
diff --git a/engines/teenagent/pack.h b/engines/teenagent/pack.h
index 1d6c471554..3607bae91d 100644
--- a/engines/teenagent/pack.h
+++ b/engines/teenagent/pack.h
@@ -17,6 +17,7 @@
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
*/
diff --git a/engines/teenagent/resources.cpp b/engines/teenagent/resources.cpp
index cdbdcf9655..8d8f705a24 100644
--- a/engines/teenagent/resources.cpp
+++ b/engines/teenagent/resources.cpp
@@ -17,6 +17,7 @@
* You should have received a copy of the GNU General Public 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 "teenagent/resources.h"
diff --git a/engines/teenagent/resources.h b/engines/teenagent/resources.h
index 7aae2f9ec8..2cdc070a87 100644
--- a/engines/teenagent/resources.h
+++ b/engines/teenagent/resources.h
@@ -17,6 +17,7 @@
* You should have received a copy of the GNU General Public 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 TEENAGENT_RESOURCES_H
@@ -494,7 +495,7 @@ const uint16 dsAddr_noDepraveMsg = 0x4d02; // "Nah, I don't want to deprave the
// No Read Again Message : 0x4d2a to 0x4d5a
const uint16 dsAddr_noReadAgainMsg = 0x4d2a; // "I don't want to read it again. I might like it."
// TV Off Message : 0x4d5b to 0x4d7f
-const uint16 dsAddr_tvOffMsg = 0x4d5b; // "I just realised that the TV is off"
+const uint16 dsAddr_tvOffMsg = 0x4d5b; // "I just realized that the TV is off"
// Not Happen Message : 0x4d80 to 0x4d92
const uint16 dsAddr_NotHappenMsg = 0x4d80; // "Nothing happened"
// Tape Started Message : 0x4d93 to 0x4da5
diff --git a/engines/teenagent/scene.cpp b/engines/teenagent/scene.cpp
index f36a60932c..6e1cef31bc 100644
--- a/engines/teenagent/scene.cpp
+++ b/engines/teenagent/scene.cpp
@@ -17,6 +17,7 @@
* You should have received a copy of the GNU General Public 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"
diff --git a/engines/teenagent/scene.h b/engines/teenagent/scene.h
index 14aefa0cca..07b304ed97 100644
--- a/engines/teenagent/scene.h
+++ b/engines/teenagent/scene.h
@@ -17,6 +17,7 @@
* You should have received a copy of the GNU General Public 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 TEENAGENT_SCENE_H
diff --git a/engines/teenagent/segment.cpp b/engines/teenagent/segment.cpp
index cb17190da7..0e7659d680 100644
--- a/engines/teenagent/segment.cpp
+++ b/engines/teenagent/segment.cpp
@@ -17,6 +17,7 @@
* You should have received a copy of the GNU General Public 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 "teenagent/segment.h"
diff --git a/engines/teenagent/segment.h b/engines/teenagent/segment.h
index 286337d120..14ccb24894 100644
--- a/engines/teenagent/segment.h
+++ b/engines/teenagent/segment.h
@@ -17,6 +17,7 @@
* You should have received a copy of the GNU General Public 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 TEENAGENT_SEGMENT_H
diff --git a/engines/teenagent/surface.cpp b/engines/teenagent/surface.cpp
index 4db25bc749..748874a4c5 100644
--- a/engines/teenagent/surface.cpp
+++ b/engines/teenagent/surface.cpp
@@ -17,6 +17,7 @@
* You should have received a copy of the GNU General Public 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 "teenagent/surface.h"
diff --git a/engines/teenagent/surface.h b/engines/teenagent/surface.h
index 3e591ed3e0..35850cf3aa 100644
--- a/engines/teenagent/surface.h
+++ b/engines/teenagent/surface.h
@@ -17,6 +17,7 @@
* You should have received a copy of the GNU General Public 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 TEENAGENT_SURFACE_H
diff --git a/engines/teenagent/surface_list.cpp b/engines/teenagent/surface_list.cpp
index e293ce6470..444d927294 100644
--- a/engines/teenagent/surface_list.cpp
+++ b/engines/teenagent/surface_list.cpp
@@ -17,6 +17,7 @@
* You should have received a copy of the GNU General Public 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 "teenagent/surface_list.h"
diff --git a/engines/teenagent/surface_list.h b/engines/teenagent/surface_list.h
index 73a41fb5f8..2cca7849df 100644
--- a/engines/teenagent/surface_list.h
+++ b/engines/teenagent/surface_list.h
@@ -17,6 +17,7 @@
* You should have received a copy of the GNU General Public 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 TEENAGENT_SURFACE_LIST_H__
diff --git a/engines/teenagent/teenagent.cpp b/engines/teenagent/teenagent.cpp
index e73f1100d6..d5a8b8e2dc 100644
--- a/engines/teenagent/teenagent.cpp
+++ b/engines/teenagent/teenagent.cpp
@@ -17,6 +17,7 @@
* You should have received a copy of the GNU General Public 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"
diff --git a/engines/teenagent/teenagent.h b/engines/teenagent/teenagent.h
index d6a2c0d3c6..a06f8dbf9b 100644
--- a/engines/teenagent/teenagent.h
+++ b/engines/teenagent/teenagent.h
@@ -17,6 +17,7 @@
* You should have received a copy of the GNU General Public 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 TEENAGENT_ENGINE_H
@@ -31,6 +32,9 @@
#include "common/rect.h"
#include "common/array.h"
+#include "gui/debugger.h"
+
+#include "teenagent/console.h"
#include "teenagent/dialog.h"
struct ADGameDescription;
@@ -50,7 +54,6 @@ struct UseHotspot;
class Scene;
class MusicPlayer;
class Dialog;
-class Console;
class Resources;
class Inventory;
@@ -84,6 +87,8 @@ public:
virtual bool canSaveGameStateCurrently() { return !_sceneBusy; }
virtual bool hasFeature(EngineFeature f) const;
+ GUI::Debugger *getDebugger() { return console; }
+
void init();
enum Action { kActionNone, kActionExamine, kActionUse };
diff --git a/engines/testbed/config-params.cpp b/engines/testbed/config-params.cpp
index 47e5dfa933..1aa97168c1 100644
--- a/engines/testbed/config-params.cpp
+++ b/engines/testbed/config-params.cpp
@@ -17,6 +17,7 @@
* You should have received a copy of the GNU General Public 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"
diff --git a/engines/testbed/config-params.h b/engines/testbed/config-params.h
index 6906d9248e..89aae199b6 100644
--- a/engines/testbed/config-params.h
+++ b/engines/testbed/config-params.h
@@ -17,6 +17,7 @@
* You should have received a copy of the GNU General Public 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 TESTBED_CONFIG_PARAMS_H
diff --git a/engines/testbed/config.cpp b/engines/testbed/config.cpp
index a40d239ebf..efc0d30221 100644
--- a/engines/testbed/config.cpp
+++ b/engines/testbed/config.cpp
@@ -17,6 +17,7 @@
* You should have received a copy of the GNU General Public 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"
diff --git a/engines/testbed/config.h b/engines/testbed/config.h
index 7d479a74fd..db687de261 100644
--- a/engines/testbed/config.h
+++ b/engines/testbed/config.h
@@ -17,6 +17,7 @@
* You should have received a copy of the GNU General Public 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 TESTBED_CONFIG_H
diff --git a/engines/testbed/configure.engine b/engines/testbed/configure.engine
new file mode 100644
index 0000000000..c0a68c8eb8
--- /dev/null
+++ b/engines/testbed/configure.engine
@@ -0,0 +1,3 @@
+# This file is included from the main "configure" script
+# add_engine [name] [desc] [build-by-default] [subengines] [base games] [deps]
+add_engine testbed "TestBed: the Testing framework" no
diff --git a/engines/testbed/detection.cpp b/engines/testbed/detection.cpp
index fd426d3e98..348ade62b0 100644
--- a/engines/testbed/detection.cpp
+++ b/engines/testbed/detection.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/testbed/events.cpp b/engines/testbed/events.cpp
index 4b9ced2a53..3e1b6adf9e 100644
--- a/engines/testbed/events.cpp
+++ b/engines/testbed/events.cpp
@@ -17,6 +17,7 @@
* You should have received a copy of the GNU General Public 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/events.h"
diff --git a/engines/testbed/events.h b/engines/testbed/events.h
index 00a659bd33..f8883ec1d8 100644
--- a/engines/testbed/events.h
+++ b/engines/testbed/events.h
@@ -17,6 +17,7 @@
* You should have received a copy of the GNU General Public 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 TESTBED_EVENTS_H
diff --git a/engines/testbed/fs.cpp b/engines/testbed/fs.cpp
index 62ac616192..07b1c0f2af 100644
--- a/engines/testbed/fs.cpp
+++ b/engines/testbed/fs.cpp
@@ -17,6 +17,7 @@
* You should have received a copy of the GNU General Public 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"
diff --git a/engines/testbed/fs.h b/engines/testbed/fs.h
index 1cb7b3a871..966f138d71 100644
--- a/engines/testbed/fs.h
+++ b/engines/testbed/fs.h
@@ -17,6 +17,7 @@
* You should have received a copy of the GNU General Public 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 TESTBED_FS_H
diff --git a/engines/testbed/graphics.cpp b/engines/testbed/graphics.cpp
index 26e073d407..43580104e7 100644
--- a/engines/testbed/graphics.cpp
+++ b/engines/testbed/graphics.cpp
@@ -17,6 +17,7 @@
* You should have received a copy of the GNU General Public 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/events.h"
diff --git a/engines/testbed/graphics.h b/engines/testbed/graphics.h
index f3013fdf53..139eeb97dd 100644
--- a/engines/testbed/graphics.h
+++ b/engines/testbed/graphics.h
@@ -17,6 +17,7 @@
* You should have received a copy of the GNU General Public 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 TESTBED_GRAPHICS_H
diff --git a/engines/testbed/midi.cpp b/engines/testbed/midi.cpp
index 33fab03a5e..daa5f1cf3c 100644
--- a/engines/testbed/midi.cpp
+++ b/engines/testbed/midi.cpp
@@ -17,6 +17,7 @@
* You should have received a copy of the GNU General Public 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"
diff --git a/engines/testbed/midi.h b/engines/testbed/midi.h
index 02550a6eb2..b9f3e82abd 100644
--- a/engines/testbed/midi.h
+++ b/engines/testbed/midi.h
@@ -17,6 +17,7 @@
* You should have received a copy of the GNU General Public 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 TESTBED_MIDI_H
diff --git a/engines/testbed/misc.cpp b/engines/testbed/misc.cpp
index aee3ccd294..5847a8d2e4 100644
--- a/engines/testbed/misc.cpp
+++ b/engines/testbed/misc.cpp
@@ -17,6 +17,7 @@
* You should have received a copy of the GNU General Public 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 "testbed/misc.h"
diff --git a/engines/testbed/misc.h b/engines/testbed/misc.h
index 3f0772c6e5..23e303d676 100644
--- a/engines/testbed/misc.h
+++ b/engines/testbed/misc.h
@@ -17,6 +17,7 @@
* You should have received a copy of the GNU General Public 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 TESTBED_MISC_H
diff --git a/engines/testbed/savegame.cpp b/engines/testbed/savegame.cpp
index 226e9880a6..e426b9717d 100644
--- a/engines/testbed/savegame.cpp
+++ b/engines/testbed/savegame.cpp
@@ -17,6 +17,7 @@
* You should have received a copy of the GNU General Public 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/savefile.h"
diff --git a/engines/testbed/savegame.h b/engines/testbed/savegame.h
index 2c9ec83470..b242ee5f3b 100644
--- a/engines/testbed/savegame.h
+++ b/engines/testbed/savegame.h
@@ -17,6 +17,7 @@
* You should have received a copy of the GNU General Public 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 TESTBED_SAVEGAME_H
diff --git a/engines/testbed/sound.cpp b/engines/testbed/sound.cpp
index 5af1d8ca31..aebd981826 100644
--- a/engines/testbed/sound.cpp
+++ b/engines/testbed/sound.cpp
@@ -17,6 +17,7 @@
* You should have received a copy of the GNU General Public 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 "audio/softsynth/pcspk.h"
diff --git a/engines/testbed/sound.h b/engines/testbed/sound.h
index fea7d9d45b..893a89b175 100644
--- a/engines/testbed/sound.h
+++ b/engines/testbed/sound.h
@@ -17,6 +17,7 @@
* You should have received a copy of the GNU General Public 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 TESTBED_SOUND_H
diff --git a/engines/testbed/template.h b/engines/testbed/template.h
index 847777f34b..9e6c347e4d 100644
--- a/engines/testbed/template.h
+++ b/engines/testbed/template.h
@@ -17,6 +17,7 @@
* You should have received a copy of the GNU General Public 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 TESTBED_TEMPLATE_H
diff --git a/engines/testbed/testbed.cpp b/engines/testbed/testbed.cpp
index 152764eb27..635fd09bac 100644
--- a/engines/testbed/testbed.cpp
+++ b/engines/testbed/testbed.cpp
@@ -17,6 +17,7 @@
* You should have received a copy of the GNU General Public 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/debug-channels.h"
diff --git a/engines/testbed/testbed.h b/engines/testbed/testbed.h
index 6933efa0f0..0f70e1191f 100644
--- a/engines/testbed/testbed.h
+++ b/engines/testbed/testbed.h
@@ -17,6 +17,7 @@
* You should have received a copy of the GNU General Public 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 TESTBED_H
diff --git a/engines/testbed/testsuite.cpp b/engines/testbed/testsuite.cpp
index 39eeca31bd..7729c4911b 100644
--- a/engines/testbed/testsuite.cpp
+++ b/engines/testbed/testsuite.cpp
@@ -17,6 +17,7 @@
* You should have received a copy of the GNU General Public 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"
diff --git a/engines/testbed/testsuite.h b/engines/testbed/testsuite.h
index dc159ce25f..4f2a23c8bd 100644
--- a/engines/testbed/testsuite.h
+++ b/engines/testbed/testsuite.h
@@ -17,6 +17,7 @@
* You should have received a copy of the GNU General Public 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 TESTBED_TESTSUITE_H
diff --git a/engines/tinsel/actors.cpp b/engines/tinsel/actors.cpp
index 531a8e3d12..1440fb3556 100644
--- a/engines/tinsel/actors.cpp
+++ b/engines/tinsel/actors.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/tinsel/actors.h b/engines/tinsel/actors.h
index 6ebe32505a..4d82e14f6a 100644
--- a/engines/tinsel/actors.h
+++ b/engines/tinsel/actors.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/tinsel/adpcm.cpp b/engines/tinsel/adpcm.cpp
index ca3150ca3d..9de3dff341 100644
--- a/engines/tinsel/adpcm.cpp
+++ b/engines/tinsel/adpcm.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/tinsel/adpcm.h b/engines/tinsel/adpcm.h
index 3e899d94c3..b63e8dcfa7 100644
--- a/engines/tinsel/adpcm.h
+++ b/engines/tinsel/adpcm.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/tinsel/anim.cpp b/engines/tinsel/anim.cpp
index a1ec02186c..19e180b57e 100644
--- a/engines/tinsel/anim.cpp
+++ b/engines/tinsel/anim.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/tinsel/anim.h b/engines/tinsel/anim.h
index 0c60cf84d4..0c0d5e18ae 100644
--- a/engines/tinsel/anim.h
+++ b/engines/tinsel/anim.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/tinsel/background.cpp b/engines/tinsel/background.cpp
index 8e3fc50f12..7913548ed1 100644
--- a/engines/tinsel/background.cpp
+++ b/engines/tinsel/background.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/tinsel/background.h b/engines/tinsel/background.h
index cfa3998eda..418413e200 100644
--- a/engines/tinsel/background.h
+++ b/engines/tinsel/background.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/tinsel/bg.cpp b/engines/tinsel/bg.cpp
index 9f1f2c43f4..a702568164 100644
--- a/engines/tinsel/bg.cpp
+++ b/engines/tinsel/bg.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/tinsel/bmv.cpp b/engines/tinsel/bmv.cpp
index fa66b7ad8e..f28cd684f9 100644
--- a/engines/tinsel/bmv.cpp
+++ b/engines/tinsel/bmv.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/tinsel/bmv.h b/engines/tinsel/bmv.h
index fa254ed26d..e52297f9de 100644
--- a/engines/tinsel/bmv.h
+++ b/engines/tinsel/bmv.h
@@ -8,7 +8,7 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
diff --git a/engines/tinsel/cliprect.cpp b/engines/tinsel/cliprect.cpp
index 76feede83f..6212a1491e 100644
--- a/engines/tinsel/cliprect.cpp
+++ b/engines/tinsel/cliprect.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/tinsel/cliprect.h b/engines/tinsel/cliprect.h
index 101289b837..f55542a170 100644
--- a/engines/tinsel/cliprect.h
+++ b/engines/tinsel/cliprect.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/tinsel/config.cpp b/engines/tinsel/config.cpp
index 050573028a..bd5929f6ef 100644
--- a/engines/tinsel/config.cpp
+++ b/engines/tinsel/config.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/tinsel/config.h b/engines/tinsel/config.h
index 8b6b675766..4f3168622a 100644
--- a/engines/tinsel/config.h
+++ b/engines/tinsel/config.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/tinsel/configure.engine b/engines/tinsel/configure.engine
new file mode 100644
index 0000000000..c0f3e0a18d
--- /dev/null
+++ b/engines/tinsel/configure.engine
@@ -0,0 +1,3 @@
+# This file is included from the main "configure" script
+# add_engine [name] [desc] [build-by-default] [subengines] [base games] [deps]
+add_engine tinsel "Tinsel" yes
diff --git a/engines/tinsel/cursor.cpp b/engines/tinsel/cursor.cpp
index a83e7cd9ca..e69031d572 100644
--- a/engines/tinsel/cursor.cpp
+++ b/engines/tinsel/cursor.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/tinsel/cursor.h b/engines/tinsel/cursor.h
index 4e32aa3a19..997d7ae479 100644
--- a/engines/tinsel/cursor.h
+++ b/engines/tinsel/cursor.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/tinsel/debugger.cpp b/engines/tinsel/debugger.cpp
index 1261326032..1dbb19d383 100644
--- a/engines/tinsel/debugger.cpp
+++ b/engines/tinsel/debugger.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -62,11 +62,11 @@ int strToInt(const char *s) {
//----------------- CONSOLE CLASS ---------------------
Console::Console() : GUI::Debugger() {
- DCmd_Register("item", WRAP_METHOD(Console, cmd_item));
- DCmd_Register("scene", WRAP_METHOD(Console, cmd_scene));
- DCmd_Register("music", WRAP_METHOD(Console, cmd_music));
- DCmd_Register("sound", WRAP_METHOD(Console, cmd_sound));
- DCmd_Register("string", WRAP_METHOD(Console, cmd_string));
+ registerCmd("item", WRAP_METHOD(Console, cmd_item));
+ registerCmd("scene", WRAP_METHOD(Console, cmd_scene));
+ registerCmd("music", WRAP_METHOD(Console, cmd_music));
+ registerCmd("sound", WRAP_METHOD(Console, cmd_sound));
+ registerCmd("string", WRAP_METHOD(Console, cmd_string));
}
Console::~Console() {
@@ -74,8 +74,8 @@ Console::~Console() {
bool Console::cmd_item(int argc, const char **argv) {
if (argc < 2) {
- DebugPrintf("%s item_number\n", argv[0]);
- DebugPrintf("Sets the currently active 'held' item\n");
+ debugPrintf("%s item_number\n", argv[0]);
+ debugPrintf("Sets the currently active 'held' item\n");
return true;
}
@@ -86,14 +86,14 @@ bool Console::cmd_item(int argc, const char **argv) {
bool Console::cmd_scene(int argc, const char **argv) {
if (argc < 1 || argc > 3) {
- DebugPrintf("%s [scene_number [entry number]]\n", argv[0]);
- DebugPrintf("If no parameters are given, prints the current scene.\n");
- DebugPrintf("Otherwise changes to the specified scene number. Entry number defaults to 1 if none provided\n");
+ debugPrintf("%s [scene_number [entry number]]\n", argv[0]);
+ debugPrintf("If no parameters are given, prints the current scene.\n");
+ debugPrintf("Otherwise changes to the specified scene number. Entry number defaults to 1 if none provided\n");
return true;
}
if (argc == 1) {
- DebugPrintf("Current scene is %d\n", GetSceneHandle() >> SCNHANDLE_SHIFT);
+ debugPrintf("Current scene is %d\n", GetSceneHandle() >> SCNHANDLE_SHIFT);
return true;
}
@@ -106,15 +106,15 @@ bool Console::cmd_scene(int argc, const char **argv) {
bool Console::cmd_music(int argc, const char **argv) {
if (argc < 2) {
- DebugPrintf("%s track_number or %s -offset\n", argv[0], argv[0]);
- DebugPrintf("Plays the MIDI track number provided, or the offset inside midi.dat\n");
- DebugPrintf("A positive number signifies a track number, whereas a negative signifies an offset\n");
+ debugPrintf("%s track_number or %s -offset\n", argv[0], argv[0]);
+ debugPrintf("Plays the MIDI track number provided, or the offset inside midi.dat\n");
+ debugPrintf("A positive number signifies a track number, whereas a negative signifies an offset\n");
return true;
}
int param = strToInt(argv[1]);
if (param == 0) {
- DebugPrintf("Track number/offset can't be 0!\n");
+ debugPrintf("Track number/offset can't be 0!\n");
} else if (param > 0) {
// Track provided
PlayMidiSequence(GetTrackOffset(param - 1), false);
@@ -128,8 +128,8 @@ bool Console::cmd_music(int argc, const char **argv) {
bool Console::cmd_sound(int argc, const char **argv) {
if (argc < 2) {
- DebugPrintf("%s id\n", argv[0]);
- DebugPrintf("Plays the sound with the given ID\n");
+ debugPrintf("%s id\n", argv[0]);
+ debugPrintf("Plays the sound with the given ID\n");
return true;
}
@@ -140,7 +140,7 @@ bool Console::cmd_sound(int argc, const char **argv) {
else
_vm->_sound->playSample(id, 0, false, 0, 0, PRIORITY_TALK, Audio::Mixer::kSpeechSoundType);
} else {
- DebugPrintf("Sample %d does not exist!\n", id);
+ debugPrintf("Sample %d does not exist!\n", id);
}
return true;
@@ -148,15 +148,15 @@ bool Console::cmd_sound(int argc, const char **argv) {
bool Console::cmd_string(int argc, const char **argv) {
if (argc < 2) {
- DebugPrintf("%s id\n", argv[0]);
- DebugPrintf("Prints the string with the given ID\n");
+ debugPrintf("%s id\n", argv[0]);
+ debugPrintf("Prints the string with the given ID\n");
return true;
}
char tmp[TBUFSZ];
int id = strToInt(argv[1]);
LoadStringRes(id, tmp, TBUFSZ);
- DebugPrintf("%s\n", tmp);
+ debugPrintf("%s\n", tmp);
return true;
}
diff --git a/engines/tinsel/debugger.h b/engines/tinsel/debugger.h
index ff4ccd519f..7e01c51641 100644
--- a/engines/tinsel/debugger.h
+++ b/engines/tinsel/debugger.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/tinsel/detection.cpp b/engines/tinsel/detection.cpp
index a7ba8b28cb..c7a62dacad 100644
--- a/engines/tinsel/detection.cpp
+++ b/engines/tinsel/detection.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/tinsel/detection_tables.h b/engines/tinsel/detection_tables.h
index cc8166f295..a2ea67b3e6 100644
--- a/engines/tinsel/detection_tables.h
+++ b/engines/tinsel/detection_tables.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -319,7 +319,7 @@ static const TinselGameDescription gameDescriptions[] = {
},
Common::DE_DEU,
Common::kPlatformDOS,
- ADGF_DROPLANGUAGE,
+ ADGF_DROPLANGUAGE | ADGF_CD,
GUIO0()
},
GID_DW1,
diff --git a/engines/tinsel/dialogs.cpp b/engines/tinsel/dialogs.cpp
index e6229ff3a0..a84dad942c 100644
--- a/engines/tinsel/dialogs.cpp
+++ b/engines/tinsel/dialogs.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/tinsel/dialogs.h b/engines/tinsel/dialogs.h
index ab53ba771c..47f831869f 100644
--- a/engines/tinsel/dialogs.h
+++ b/engines/tinsel/dialogs.h
@@ -9,12 +9,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/tinsel/drives.cpp b/engines/tinsel/drives.cpp
index 3ecef83753..1ed659040d 100644
--- a/engines/tinsel/drives.cpp
+++ b/engines/tinsel/drives.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/tinsel/drives.h b/engines/tinsel/drives.h
index 9e97b92fa5..5b80505345 100644
--- a/engines/tinsel/drives.h
+++ b/engines/tinsel/drives.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/tinsel/dw.h b/engines/tinsel/dw.h
index 34f05ab8c2..b0619ad5ad 100644
--- a/engines/tinsel/dw.h
+++ b/engines/tinsel/dw.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/tinsel/effect.cpp b/engines/tinsel/effect.cpp
index f5adb63c2b..11e849e101 100644
--- a/engines/tinsel/effect.cpp
+++ b/engines/tinsel/effect.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/tinsel/events.cpp b/engines/tinsel/events.cpp
index 61d3903f1a..07d3c512b4 100644
--- a/engines/tinsel/events.cpp
+++ b/engines/tinsel/events.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/tinsel/events.h b/engines/tinsel/events.h
index 51669e4680..cfc52c11c0 100644
--- a/engines/tinsel/events.h
+++ b/engines/tinsel/events.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/tinsel/faders.cpp b/engines/tinsel/faders.cpp
index b51b1d6d4f..0a28ea1460 100644
--- a/engines/tinsel/faders.cpp
+++ b/engines/tinsel/faders.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/tinsel/faders.h b/engines/tinsel/faders.h
index f7db902fe5..cb1bb3aa14 100644
--- a/engines/tinsel/faders.h
+++ b/engines/tinsel/faders.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/tinsel/film.h b/engines/tinsel/film.h
index edb8dc268d..f5f48f3067 100644
--- a/engines/tinsel/film.h
+++ b/engines/tinsel/film.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/tinsel/font.cpp b/engines/tinsel/font.cpp
index 3dba56468b..076bfa8e23 100644
--- a/engines/tinsel/font.cpp
+++ b/engines/tinsel/font.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/tinsel/font.h b/engines/tinsel/font.h
index 83bc12354e..d9e25bea2e 100644
--- a/engines/tinsel/font.h
+++ b/engines/tinsel/font.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/tinsel/graphics.cpp b/engines/tinsel/graphics.cpp
index c4f341f6fe..0282aff3cb 100644
--- a/engines/tinsel/graphics.cpp
+++ b/engines/tinsel/graphics.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/tinsel/graphics.h b/engines/tinsel/graphics.h
index d34f069f6a..b2144247c2 100644
--- a/engines/tinsel/graphics.h
+++ b/engines/tinsel/graphics.h
@@ -8,7 +8,7 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
diff --git a/engines/tinsel/handle.cpp b/engines/tinsel/handle.cpp
index 104adf72a2..62d244e449 100644
--- a/engines/tinsel/handle.cpp
+++ b/engines/tinsel/handle.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/tinsel/handle.h b/engines/tinsel/handle.h
index e681bfc131..ccc8f0f9db 100644
--- a/engines/tinsel/handle.h
+++ b/engines/tinsel/handle.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/tinsel/heapmem.cpp b/engines/tinsel/heapmem.cpp
index 597cc69e66..82fc3fd11a 100644
--- a/engines/tinsel/heapmem.cpp
+++ b/engines/tinsel/heapmem.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/tinsel/heapmem.h b/engines/tinsel/heapmem.h
index 7b29a3ecce..2be405d9d7 100644
--- a/engines/tinsel/heapmem.h
+++ b/engines/tinsel/heapmem.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/tinsel/mareels.cpp b/engines/tinsel/mareels.cpp
index 7dd905d0f2..d906709f32 100644
--- a/engines/tinsel/mareels.cpp
+++ b/engines/tinsel/mareels.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/tinsel/mareels.h b/engines/tinsel/mareels.h
index 2ff5ca906e..3ef1cd43ea 100644
--- a/engines/tinsel/mareels.h
+++ b/engines/tinsel/mareels.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/tinsel/move.cpp b/engines/tinsel/move.cpp
index 275b6006f5..32a953b1a2 100644
--- a/engines/tinsel/move.cpp
+++ b/engines/tinsel/move.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/tinsel/move.h b/engines/tinsel/move.h
index a307e5c081..7fb284baed 100644
--- a/engines/tinsel/move.h
+++ b/engines/tinsel/move.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/tinsel/multiobj.cpp b/engines/tinsel/multiobj.cpp
index 37769a7819..75894aea89 100644
--- a/engines/tinsel/multiobj.cpp
+++ b/engines/tinsel/multiobj.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/tinsel/multiobj.h b/engines/tinsel/multiobj.h
index a0f977553a..9968bf3c37 100644
--- a/engines/tinsel/multiobj.h
+++ b/engines/tinsel/multiobj.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/tinsel/music.cpp b/engines/tinsel/music.cpp
index 3144ea7f94..8a7305f63b 100644
--- a/engines/tinsel/music.cpp
+++ b/engines/tinsel/music.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -91,28 +91,29 @@ static const int enhancedAudioGRAVersion[] = {
};
static const int enhancedAudioSCNVersion[] = {
- 301, 302, 2, 1, 1, 301, 302, 3, 3, 4, // 1-10
- 4, 5, 6, 1, 7, 8, 9, 10, 8, 11, // 11-20
- 11, 12, 13, 13, 13, 13, 13, 14, 13, 13, // 21-30
- 15, 16, 17, 15, 18, 19, 20, 338, 21, 21, // 31-40
- 341, 342, 22, 22, 23, 24, 25, 26, 27, 28, // 41-50
- 29, 30, 31, 32, 33, 34, 35, 35, 36, 37, // 51-60
- 38, 39, 39, 39, 39, 40, 39, 41, 41, 42, // 61-70
- 43, 42, 44, 45, 41, 46, 48, 47, 48, 49, // 71-80
- 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, // 81-90
- 60, 61, 62, 63, 61, 64, 65, 66, 67, 68, // 91-100
- 69, 70, 68, 71, 72, 73, 74, 75, 12, 76, // 101-110
- 77, 78, 79, 80, 4, 4, 82, 83, 77, 4, // 111-120
- 84, 85, 86, 3124, 88, 89, 90, 88, 2, 2, // 121-130
- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, // 131-140
- 3142, 91, 92, 93, 94, 94, 95, 96, 52, 4, // 141-150
- 97, 98, 99, 99 // 151-154
+ 301, 302, 2, 1, 1, 301, 302, 3, 3, 4, // 1-10
+ 4, 5, 6, 1, 7, 8, 9, 10, 8, 11, // 11-20
+ 11, 12, 13, 13, 13, 13, 13, 14, 13, 13, // 21-30
+ 15, 16, 17, 15, 18, 19, 20, 338, 21, 21, // 31-40
+ 341, 342, 22, 22, 23, 24, 25, 26, 27, 28, // 41-50
+ 29, 30, 31, 32, 33, 34, 35, 35, 36, 37, // 51-60
+ 38, 39, 39, 39, 39, 40, 39, 41, 41, 42, // 61-70
+ 43, 42, 44, 45, 41, 46, 48, 47, 48, 49, // 71-80
+ 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, // 81-90
+ 60, 61, 62, 63, 61, 64, 65, 66, 67, 68, // 91-100
+ 69, 70, 68, 71, 72, 73, 74, 75, 12, 76, // 101-110
+ 77, 78, 79, 80, 4, 4, 82, 83, 77, 4, // 111-120
+ 84, 85, 86, 3124, 88, 89, 90, 88, 2, 2, // 121-130
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, // 131-140
+ 3142, 91, 92, 93, 94, 94, 95, 96, 52, 4, // 141-150
+ 97, 98, 99, 99 // 151-154
};
int GetTrackNumber(SCNHANDLE hMidi) {
- for (int i = 0; i < ARRAYSIZE(g_midiOffsets); i++)
+ for (int i = 0; i < ARRAYSIZE(g_midiOffsets); i++) {
if (g_midiOffsets[i] == hMidi)
return i;
+ }
return -1;
}
diff --git a/engines/tinsel/music.h b/engines/tinsel/music.h
index 121bf3d79b..0a78c39a76 100644
--- a/engines/tinsel/music.h
+++ b/engines/tinsel/music.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/tinsel/object.cpp b/engines/tinsel/object.cpp
index b70b581bbe..caf41ab81c 100644
--- a/engines/tinsel/object.cpp
+++ b/engines/tinsel/object.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/tinsel/object.h b/engines/tinsel/object.h
index 5644ddf19c..0b6efc3356 100644
--- a/engines/tinsel/object.h
+++ b/engines/tinsel/object.h
@@ -8,7 +8,7 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
diff --git a/engines/tinsel/palette.cpp b/engines/tinsel/palette.cpp
index b72d52cc8d..918894cf6f 100644
--- a/engines/tinsel/palette.cpp
+++ b/engines/tinsel/palette.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/tinsel/palette.h b/engines/tinsel/palette.h
index c57b8df2ba..a91a432149 100644
--- a/engines/tinsel/palette.h
+++ b/engines/tinsel/palette.h
@@ -8,7 +8,7 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
diff --git a/engines/tinsel/pcode.cpp b/engines/tinsel/pcode.cpp
index 7e439e83a9..dc19f39405 100644
--- a/engines/tinsel/pcode.cpp
+++ b/engines/tinsel/pcode.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/tinsel/pcode.h b/engines/tinsel/pcode.h
index 4980fc6ed9..46ba2b10f3 100644
--- a/engines/tinsel/pcode.h
+++ b/engines/tinsel/pcode.h
@@ -8,7 +8,7 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
diff --git a/engines/tinsel/pdisplay.cpp b/engines/tinsel/pdisplay.cpp
index b821c5dee2..545403573d 100644
--- a/engines/tinsel/pdisplay.cpp
+++ b/engines/tinsel/pdisplay.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/tinsel/pdisplay.h b/engines/tinsel/pdisplay.h
index aefaf015bd..f02ef928f3 100644
--- a/engines/tinsel/pdisplay.h
+++ b/engines/tinsel/pdisplay.h
@@ -8,7 +8,7 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
diff --git a/engines/tinsel/pid.h b/engines/tinsel/pid.h
index 4f63045cb4..6c9d7ee7e4 100644
--- a/engines/tinsel/pid.h
+++ b/engines/tinsel/pid.h
@@ -8,7 +8,7 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
diff --git a/engines/tinsel/play.cpp b/engines/tinsel/play.cpp
index e202278953..ef3127233d 100644
--- a/engines/tinsel/play.cpp
+++ b/engines/tinsel/play.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/tinsel/play.h b/engines/tinsel/play.h
index fffa8a9329..01bb10bf21 100644
--- a/engines/tinsel/play.h
+++ b/engines/tinsel/play.h
@@ -8,7 +8,7 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
diff --git a/engines/tinsel/polygons.cpp b/engines/tinsel/polygons.cpp
index 8a984c78f9..767c0b442f 100644
--- a/engines/tinsel/polygons.cpp
+++ b/engines/tinsel/polygons.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/tinsel/polygons.h b/engines/tinsel/polygons.h
index 6d36d555d8..763f009805 100644
--- a/engines/tinsel/polygons.h
+++ b/engines/tinsel/polygons.h
@@ -8,7 +8,7 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
diff --git a/engines/tinsel/rince.cpp b/engines/tinsel/rince.cpp
index 49666c13ca..8ed65af3e4 100644
--- a/engines/tinsel/rince.cpp
+++ b/engines/tinsel/rince.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/tinsel/rince.h b/engines/tinsel/rince.h
index 623f3ee137..db59012a57 100644
--- a/engines/tinsel/rince.h
+++ b/engines/tinsel/rince.h
@@ -8,7 +8,7 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
diff --git a/engines/tinsel/saveload.cpp b/engines/tinsel/saveload.cpp
index acff196916..88cd80b78a 100644
--- a/engines/tinsel/saveload.cpp
+++ b/engines/tinsel/saveload.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/tinsel/savescn.cpp b/engines/tinsel/savescn.cpp
index d2537169f7..32ec774575 100644
--- a/engines/tinsel/savescn.cpp
+++ b/engines/tinsel/savescn.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/tinsel/savescn.h b/engines/tinsel/savescn.h
index 894af0d6b8..b4f74b173a 100644
--- a/engines/tinsel/savescn.h
+++ b/engines/tinsel/savescn.h
@@ -8,7 +8,7 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
diff --git a/engines/tinsel/scene.cpp b/engines/tinsel/scene.cpp
index 043b18b8c5..49a854045d 100644
--- a/engines/tinsel/scene.cpp
+++ b/engines/tinsel/scene.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -130,14 +130,14 @@ const SCENE_STRUC *GetSceneStruc(const byte *pStruc) {
const byte *p = pStruc;
memset(&g_tempStruc, 0, sizeof(SCENE_STRUC));
- g_tempStruc.numEntrance = READ_32(p); p += sizeof(uint32);
- g_tempStruc.numPoly = READ_32(p); p += sizeof(uint32);
- g_tempStruc.numTaggedActor = READ_32(p); p += sizeof(uint32);
- g_tempStruc.defRefer = READ_32(p); p += sizeof(uint32);
- g_tempStruc.hSceneScript = READ_32(p); p += sizeof(uint32);
- g_tempStruc.hEntrance = READ_32(p); p += sizeof(uint32);
- g_tempStruc.hPoly = READ_32(p); p += sizeof(uint32);
- g_tempStruc.hTaggedActor = READ_32(p); p += sizeof(uint32);
+ g_tempStruc.numEntrance = READ_UINT32(p); p += sizeof(uint32);
+ g_tempStruc.numPoly = READ_UINT32(p); p += sizeof(uint32);
+ g_tempStruc.numTaggedActor = READ_UINT32(p); p += sizeof(uint32);
+ g_tempStruc.defRefer = READ_UINT32(p); p += sizeof(uint32);
+ g_tempStruc.hSceneScript = READ_UINT32(p); p += sizeof(uint32);
+ g_tempStruc.hEntrance = READ_UINT32(p); p += sizeof(uint32);
+ g_tempStruc.hPoly = READ_UINT32(p); p += sizeof(uint32);
+ g_tempStruc.hTaggedActor = READ_UINT32(p); p += sizeof(uint32);
return &g_tempStruc;
}
@@ -168,7 +168,7 @@ static void SceneTinselProcess(CORO_PARAM, const void *param) {
assert(_ctx->pInit->hTinselCode); // Must have some code to run
_ctx->pic = InitInterpretContext(GS_SCENE,
- _ctx->pInit->hTinselCode,
+ FROM_32(_ctx->pInit->hTinselCode),
TinselV2 ? _ctx->pInit->event : NOEVENT,
NOPOLY, // No polygon
0, // No actor
@@ -210,7 +210,7 @@ void SendSceneTinselProcess(TINSEL_EVENT event) {
*/
static void LoadScene(SCNHANDLE scene, int entry) {
- int32 i;
+ uint32 i;
TP_INIT init;
const SCENE_STRUC *ss;
const ENTRANCE_STRUC *es;
@@ -239,17 +239,17 @@ static void LoadScene(SCNHANDLE scene, int entry) {
// Music stuff
char *cptr = (char *)FindChunk(scene, CHUNK_MUSIC_FILENAME);
assert(cptr);
- _vm->_pcmMusic->setMusicSceneDetails(ss->hMusicScript, ss->hMusicSegment, cptr);
+ _vm->_pcmMusic->setMusicSceneDetails(FROM_32(ss->hMusicScript), FROM_32(ss->hMusicSegment), cptr);
}
if (entry == NO_ENTRY_NUM) {
// Restoring scene
// Initialize all the polygons for this scene
- InitPolygons(ss->hPoly, ss->numPoly, true);
+ InitPolygons(FROM_32(ss->hPoly), FROM_32(ss->numPoly), true);
// Initialize the actors for this scene
- StartTaggedActors(ss->hTaggedActor, ss->numTaggedActor, false);
+ StartTaggedActors(FROM_32(ss->hTaggedActor), FROM_32(ss->numTaggedActor), false);
if (TinselV2)
// Returning from cutscene
@@ -259,18 +259,18 @@ static void LoadScene(SCNHANDLE scene, int entry) {
// Genuine new scene
// Initialize all the polygons for this scene
- InitPolygons(ss->hPoly, ss->numPoly, false);
+ InitPolygons(FROM_32(ss->hPoly), FROM_32(ss->numPoly), false);
// Initialize the actors for this scene
- StartTaggedActors(ss->hTaggedActor, ss->numTaggedActor, true);
+ StartTaggedActors(FROM_32(ss->hTaggedActor), FROM_32(ss->numTaggedActor), true);
// Run the appropriate entrance code (if any)
- es = (const ENTRANCE_STRUC *)LockMem(ss->hEntrance);
- for (i = 0; i < ss->numEntrance; i++) {
+ es = (const ENTRANCE_STRUC *)LockMem(FROM_32(ss->hEntrance));
+ for (i = 0; i < FROM_32(ss->numEntrance); i++) {
if (FROM_32(es->eNumber) == (uint)entry) {
if (es->hScript) {
init.event = STARTUP;
- init.hTinselCode = FROM_32(es->hScript);
+ init.hTinselCode = es->hScript;
CoroScheduler.createProcess(PID_TCODE, SceneTinselProcess, &init, sizeof(init));
}
@@ -285,7 +285,7 @@ static void LoadScene(SCNHANDLE scene, int entry) {
}
- if (i == ss->numEntrance)
+ if (i == FROM_32(ss->numEntrance))
error("Non-existent scene entry number");
if (ss->hSceneScript) {
@@ -297,10 +297,10 @@ static void LoadScene(SCNHANDLE scene, int entry) {
}
// Default refer type
- SetDefaultRefer(ss->defRefer);
+ SetDefaultRefer(FROM_32(ss->defRefer));
// Scene's processes
- SceneProcesses(ss->numProcess, ss->hProcess);
+ SceneProcesses(FROM_32(ss->numProcess), FROM_32(ss->hProcess));
}
diff --git a/engines/tinsel/scene.h b/engines/tinsel/scene.h
index 06e5c096d9..27aecaa132 100644
--- a/engines/tinsel/scene.h
+++ b/engines/tinsel/scene.h
@@ -8,7 +8,7 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
diff --git a/engines/tinsel/sched.cpp b/engines/tinsel/sched.cpp
index a73b4b9b97..894ffb7f5b 100644
--- a/engines/tinsel/sched.cpp
+++ b/engines/tinsel/sched.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/tinsel/sched.h b/engines/tinsel/sched.h
index 3e791cecd8..da06c545bf 100644
--- a/engines/tinsel/sched.h
+++ b/engines/tinsel/sched.h
@@ -8,7 +8,7 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
diff --git a/engines/tinsel/scn.cpp b/engines/tinsel/scn.cpp
index 70093447ff..db14af27e2 100644
--- a/engines/tinsel/scn.cpp
+++ b/engines/tinsel/scn.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/tinsel/scn.h b/engines/tinsel/scn.h
index 2e3a02cdda..12253d70b2 100644
--- a/engines/tinsel/scn.h
+++ b/engines/tinsel/scn.h
@@ -8,7 +8,7 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
diff --git a/engines/tinsel/scroll.cpp b/engines/tinsel/scroll.cpp
index 0a6a281d35..eafb238ec0 100644
--- a/engines/tinsel/scroll.cpp
+++ b/engines/tinsel/scroll.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/tinsel/scroll.h b/engines/tinsel/scroll.h
index bcdc15cda6..4d3f85dd0f 100644
--- a/engines/tinsel/scroll.h
+++ b/engines/tinsel/scroll.h
@@ -8,7 +8,7 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
diff --git a/engines/tinsel/sound.cpp b/engines/tinsel/sound.cpp
index 416ee74127..3d87a17331 100644
--- a/engines/tinsel/sound.cpp
+++ b/engines/tinsel/sound.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/tinsel/sound.h b/engines/tinsel/sound.h
index c68d9cb71e..6255d7ffe8 100644
--- a/engines/tinsel/sound.h
+++ b/engines/tinsel/sound.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/tinsel/strres.cpp b/engines/tinsel/strres.cpp
index 19a1ee94d6..6ad01a0d35 100644
--- a/engines/tinsel/strres.cpp
+++ b/engines/tinsel/strres.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/tinsel/strres.h b/engines/tinsel/strres.h
index 772896c81f..56d5273153 100644
--- a/engines/tinsel/strres.h
+++ b/engines/tinsel/strres.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/tinsel/sysvar.cpp b/engines/tinsel/sysvar.cpp
index 6ef4f165ab..6244c5c4d5 100644
--- a/engines/tinsel/sysvar.cpp
+++ b/engines/tinsel/sysvar.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/tinsel/sysvar.h b/engines/tinsel/sysvar.h
index 65bf558433..49391cc5cf 100644
--- a/engines/tinsel/sysvar.h
+++ b/engines/tinsel/sysvar.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/tinsel/text.cpp b/engines/tinsel/text.cpp
index 150eb2bdde..1c114fffa1 100644
--- a/engines/tinsel/text.cpp
+++ b/engines/tinsel/text.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/tinsel/text.h b/engines/tinsel/text.h
index 97e82c7a93..5d39540d8f 100644
--- a/engines/tinsel/text.h
+++ b/engines/tinsel/text.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/tinsel/timers.cpp b/engines/tinsel/timers.cpp
index 36986ccb47..d4b20f4bfb 100644
--- a/engines/tinsel/timers.cpp
+++ b/engines/tinsel/timers.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/tinsel/timers.h b/engines/tinsel/timers.h
index 9bf85d9c35..67019bfea3 100644
--- a/engines/tinsel/timers.h
+++ b/engines/tinsel/timers.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/tinsel/tinlib.cpp b/engines/tinsel/tinlib.cpp
index 34aa64a609..0bc83868de 100644
--- a/engines/tinsel/tinlib.cpp
+++ b/engines/tinsel/tinlib.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/tinsel/tinlib.h b/engines/tinsel/tinlib.h
index 7c8c2ffbf6..c1f2269a03 100644
--- a/engines/tinsel/tinlib.h
+++ b/engines/tinsel/tinlib.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/tinsel/tinsel.cpp b/engines/tinsel/tinsel.cpp
index 5d410e62c7..31610a8467 100644
--- a/engines/tinsel/tinsel.cpp
+++ b/engines/tinsel/tinsel.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -835,14 +835,6 @@ TinselEngine::TinselEngine(OSystem *syst, const TinselGameDescription *gameDesc)
// Setup mixer
syncSoundSettings();
- // Add DW2 subfolder to search path in case user is running directly from the CDs
- const Common::FSNode gameDataDir(ConfMan.get("path"));
- SearchMan.addSubDirectoryMatching(gameDataDir, "dw2");
-
- // Add subfolders needed for psx versions of Discworld 1
- if (TinselV1PSX)
- SearchMan.addDirectory(gameDataDir.getPath(), gameDataDir, 0, 3, true);
-
const GameSettings *g;
const char *gameid = ConfMan.get("gameid").c_str();
@@ -892,6 +884,17 @@ Common::String TinselEngine::getSavegameFilename(int16 saveNum) const {
return Common::String::format("%s.%03d", getTargetName().c_str(), saveNum);
}
+void TinselEngine::initializePath(const Common::FSNode &gamePath) {
+ if (TinselV1PSX) {
+ // Add subfolders needed for psx versions of Discworld 1
+ SearchMan.addDirectory(gamePath.getPath(), gamePath, 0, 3, true);
+ } else {
+ // Add DW2 subfolder to search path in case user is running directly from the CDs
+ SearchMan.addSubDirectoryMatching(gamePath, "dw2");
+ Engine::initializePath(gamePath);
+ }
+}
+
Common::Error TinselEngine::run() {
// Initialize backend
if (getGameID() == GID_DW2) {
diff --git a/engines/tinsel/tinsel.h b/engines/tinsel/tinsel.h
index 5eb3b7d7b8..c83bc80ead 100644
--- a/engines/tinsel/tinsel.h
+++ b/engines/tinsel/tinsel.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -32,6 +32,8 @@
#include "common/util.h"
#include "engines/engine.h"
+#include "gui/debugger.h"
+
#include "tinsel/debugger.h"
#include "tinsel/graphics.h"
#include "tinsel/sound.h"
@@ -150,6 +152,7 @@ class TinselEngine : public Engine {
Common::Point _mousePos;
uint8 _dosPlayerDir;
Console *_console;
+ GUI::Debugger *getDebugger() { return _console; }
static const char *const _sampleIndices[][3];
static const char *const _sampleFiles[][3];
@@ -158,6 +161,7 @@ class TinselEngine : public Engine {
protected:
// Engine APIs
+ virtual void initializePath(const Common::FSNode &gamePath);
virtual Common::Error run();
virtual bool hasFeature(EngineFeature f) const;
Common::Error loadGameState(int slot);
diff --git a/engines/tinsel/token.cpp b/engines/tinsel/token.cpp
index 080c005c3c..1e4efe7445 100644
--- a/engines/tinsel/token.cpp
+++ b/engines/tinsel/token.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/tinsel/token.h b/engines/tinsel/token.h
index 8169ef1c7a..7aa8f327b6 100644
--- a/engines/tinsel/token.h
+++ b/engines/tinsel/token.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/toltecs/animation.cpp b/engines/toltecs/animation.cpp
index 084332cf83..1f776bbc02 100644
--- a/engines/toltecs/animation.cpp
+++ b/engines/toltecs/animation.cpp
@@ -8,17 +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.
*
- *
*/
#include "toltecs/toltecs.h"
diff --git a/engines/toltecs/animation.h b/engines/toltecs/animation.h
index 54ec5d8afa..728142cacb 100644
--- a/engines/toltecs/animation.h
+++ b/engines/toltecs/animation.h
@@ -8,17 +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.
*
- *
*/
#ifndef TOLTECS_ANIMATION_H
diff --git a/engines/toltecs/configure.engine b/engines/toltecs/configure.engine
new file mode 100644
index 0000000000..be5533efa2
--- /dev/null
+++ b/engines/toltecs/configure.engine
@@ -0,0 +1,3 @@
+# This file is included from the main "configure" script
+# add_engine [name] [desc] [build-by-default] [subengines] [base games] [deps]
+add_engine toltecs "3 Skulls of the Toltecs" yes
diff --git a/engines/toltecs/console.cpp b/engines/toltecs/console.cpp
index f3394909ed..5a0c66c7b0 100644
--- a/engines/toltecs/console.cpp
+++ b/engines/toltecs/console.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -31,8 +31,8 @@
namespace Toltecs {
Console::Console(ToltecsEngine *vm) : GUI::Debugger(), _vm(vm) {
- DCmd_Register("room", WRAP_METHOD(Console, Cmd_Room));
- DCmd_Register("dump", WRAP_METHOD(Console, Cmd_Dump));
+ registerCmd("room", WRAP_METHOD(Console, Cmd_Room));
+ registerCmd("dump", WRAP_METHOD(Console, Cmd_Dump));
}
Console::~Console() {
@@ -40,10 +40,10 @@ Console::~Console() {
bool Console::Cmd_Room(int argc, const char **argv) {
if (argc < 2) {
- DebugPrintf("Current room number is %d\n", _vm->_sceneResIndex);
+ debugPrintf("Current room number is %d\n", _vm->_sceneResIndex);
#if 0
- DebugPrintf("Calling this command with the room number changes the room\n");
- DebugPrintf("WARNING: It's a bad idea to warp to rooms with this, as the room object scripts are not loaded\n");
+ debugPrintf("Calling this command with the room number changes the room\n");
+ debugPrintf("WARNING: It's a bad idea to warp to rooms with this, as the room object scripts are not loaded\n");
#endif
return true;
#if 0
@@ -65,13 +65,13 @@ bool Console::Cmd_Room(int argc, const char **argv) {
bool Console::Cmd_Dump(int argc, const char **argv) {
if (argc < 2) {
- DebugPrintf("Usage: dump <resource number>\n");
+ debugPrintf("Usage: dump <resource number>\n");
return true;
}
int resNum = atoi(argv[1]);
_vm->_arc->dump(resNum);
- DebugPrintf("Resource %d has been dumped to disk\n", resNum);
+ debugPrintf("Resource %d has been dumped to disk\n", resNum);
return true;
}
diff --git a/engines/toltecs/console.h b/engines/toltecs/console.h
index bcdfd0cf04..5e786d527e 100644
--- a/engines/toltecs/console.h
+++ b/engines/toltecs/console.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/toltecs/detection.cpp b/engines/toltecs/detection.cpp
index 380f4a3a26..b6c7ad3d2b 100644
--- a/engines/toltecs/detection.cpp
+++ b/engines/toltecs/detection.cpp
@@ -8,17 +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.
*
- *
*/
#include "base/plugins.h"
@@ -256,7 +255,7 @@ SaveStateList ToltecsMetaEngine::listSaves(const char *target) const {
Common::sort(filenames.begin(), filenames.end()); // Sort (hopefully ensuring we are sorted numerically..)
SaveStateList saveList;
- for (Common::StringArray::const_iterator file = filenames.begin(); file != filenames.end(); file++) {
+ for (Common::StringArray::const_iterator file = filenames.begin(); file != filenames.end(); ++file) {
// Obtain the last 3 digits of the filename, since they correspond to the save slot
int slotNum = atoi(file->c_str() + file->size() - 3);
diff --git a/engines/toltecs/menu.cpp b/engines/toltecs/menu.cpp
index 0850630c43..a58771433e 100644
--- a/engines/toltecs/menu.cpp
+++ b/engines/toltecs/menu.cpp
@@ -8,17 +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.
*
- *
*/
#include "audio/mixer.h"
@@ -196,7 +195,7 @@ void MenuSystem::handleKeyDown(const Common::KeyState& kbd) {
}
ItemID MenuSystem::findItemAt(int x, int y) {
- for (Common::Array<Item>::iterator iter = _items.begin(); iter != _items.end(); iter++) {
+ for (Common::Array<Item>::iterator iter = _items.begin(); iter != _items.end(); ++iter) {
if ((*iter).enabled && (*iter).rect.contains(x, y - _top))
return (*iter).id;
}
@@ -204,7 +203,7 @@ ItemID MenuSystem::findItemAt(int x, int y) {
}
MenuSystem::Item *MenuSystem::getItem(ItemID id) {
- for (Common::Array<Item>::iterator iter = _items.begin(); iter != _items.end(); iter++) {
+ for (Common::Array<Item>::iterator iter = _items.begin(); iter != _items.end(); ++iter) {
if ((*iter).id == id)
return &(*iter);
}
@@ -225,8 +224,6 @@ void MenuSystem::setItemCaption(Item *item, const char *caption) {
}
void MenuSystem::initMenu(MenuID menuID) {
- int newSlotNum;
-
_items.clear();
memcpy(_vm->_screen->_frontScreen, _background->getPixels(), 640 * 400);
@@ -277,7 +274,7 @@ void MenuSystem::initMenu(MenuID menuID) {
Common::String saveDesc = Common::String::format("SAVEGAME %d", i);
addClickTextItem((ItemID)(kItemIdSavegame1 + i - 1), 0, 116 + 20 * (i - 1), 300, 0, saveDesc.c_str(), 231, 234);
}
- newSlotNum = loadSavegamesList() + 1;
+ int newSlotNum = loadSavegamesList() + 1;
_savegames.push_back(SavegameItem(newSlotNum, Common::String::format("GAME %04d", _savegames.size())));
setSavegameCaptions(true);
} else {
@@ -324,7 +321,7 @@ void MenuSystem::initMenu(MenuID menuID) {
break;
}
- for (Common::Array<Item>::iterator iter = _items.begin(); iter != _items.end(); iter++) {
+ for (Common::Array<Item>::iterator iter = _items.begin(); iter != _items.end(); ++iter) {
if ((*iter).enabled)
drawItem((*iter).id, false);
}
@@ -509,7 +506,7 @@ int MenuSystem::loadSavegamesList() {
filenames = saveFileMan->listSavefiles(pattern.c_str());
Common::sort(filenames.begin(), filenames.end()); // Sort (hopefully ensuring we are sorted numerically..)
- for (Common::StringArray::const_iterator file = filenames.begin(); file != filenames.end(); file++) {
+ for (Common::StringArray::const_iterator file = filenames.begin(); file != filenames.end(); ++file) {
// Obtain the last 3 digits of the filename, since they correspond to the save slot
int slotNum = atoi(file->c_str() + file->size() - 3);
if (slotNum > maxSlotNum)
diff --git a/engines/toltecs/menu.h b/engines/toltecs/menu.h
index a5eca7c8ff..476eefe142 100644
--- a/engines/toltecs/menu.h
+++ b/engines/toltecs/menu.h
@@ -8,17 +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.
*
- *
*/
#ifndef TOLTECS_MENU_H
diff --git a/engines/toltecs/microtiles.cpp b/engines/toltecs/microtiles.cpp
index 9181480351..0ac04905cb 100644
--- a/engines/toltecs/microtiles.cpp
+++ b/engines/toltecs/microtiles.cpp
@@ -8,17 +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.
*
- *
*/
#include "toltecs/microtiles.h"
@@ -119,10 +118,7 @@ Common::Rect * MicroTileArray::getRectangles(int *num_rects, int min_x, int min_
for (y = 0; y < _tilesH; ++y) {
for (x = 0; x < _tilesW; ++x) {
- int finish = 0;
- BoundingBox boundingBox;
-
- boundingBox = _tiles[i];
+ BoundingBox boundingBox = _tiles[i];
if (isBoundingBoxEmpty(boundingBox)) {
++i;
@@ -140,6 +136,7 @@ Common::Rect * MicroTileArray::getRectangles(int *num_rects, int min_x, int min_
// FIXME: Why is the following code in an #if block?
#if 1
if (TileX1(boundingBox) == TileSize - 1 && x != _tilesW - 1) { // check if the tile continues
+ bool finish = false;
while (!finish) {
++x;
++i;
@@ -151,13 +148,12 @@ Common::Rect * MicroTileArray::getRectangles(int *num_rects, int min_x, int min_
{
--x;
--i;
- finish = 1;
+ finish = true;
}
}
}
#endif
x1 = (x * TileSize) + TileX1(_tiles[i]);
-
x1 = CLIP (x1, min_x, max_x);
// FIXME: Why is the following code in an #if block?
diff --git a/engines/toltecs/microtiles.h b/engines/toltecs/microtiles.h
index 53933621a9..3714887fd7 100644
--- a/engines/toltecs/microtiles.h
+++ b/engines/toltecs/microtiles.h
@@ -8,17 +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.
*
- *
*/
#ifndef TOLTECS_MICROTILES_H
diff --git a/engines/toltecs/movie.cpp b/engines/toltecs/movie.cpp
index 341da7e5f3..0aa0a99a36 100644
--- a/engines/toltecs/movie.cpp
+++ b/engines/toltecs/movie.cpp
@@ -8,17 +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.
*
- *
*/
#include "audio/mixer.h"
diff --git a/engines/toltecs/movie.h b/engines/toltecs/movie.h
index aa28c83fef..9404e5f639 100644
--- a/engines/toltecs/movie.h
+++ b/engines/toltecs/movie.h
@@ -8,17 +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.
*
- *
*/
#ifndef TOLTECS_MOVIE_H
diff --git a/engines/toltecs/music.cpp b/engines/toltecs/music.cpp
index 830e4a97da..e4e067de39 100644
--- a/engines/toltecs/music.cpp
+++ b/engines/toltecs/music.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/toltecs/music.h b/engines/toltecs/music.h
index 8d364dbb9f..e6dc3dd146 100644
--- a/engines/toltecs/music.h
+++ b/engines/toltecs/music.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/toltecs/palette.cpp b/engines/toltecs/palette.cpp
index b93bb8b510..ab66e60c9d 100644
--- a/engines/toltecs/palette.cpp
+++ b/engines/toltecs/palette.cpp
@@ -8,17 +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.
*
- *
*/
#include "graphics/palette.h"
@@ -121,7 +120,7 @@ uint16 Palette::findFragment(int16 id) {
debug(0, "Palette::findFragment(%d)", id);
uint16 result = 0;
- for (PaletteFragmentArray::iterator iter = _fragments.begin(); iter != _fragments.end(); iter++) {
+ for (PaletteFragmentArray::iterator iter = _fragments.begin(); iter != _fragments.end(); ++iter) {
PaletteFragment fragment = *iter;
if (fragment.id == id) {
result = (fragment.count << 8) | fragment.index;
@@ -194,7 +193,7 @@ void Palette::saveState(Common::WriteStream *out) {
uint16 fragmentCount = _fragments.size();
out->writeUint16LE(fragmentCount);
- for (PaletteFragmentArray::iterator iter = _fragments.begin(); iter != _fragments.end(); iter++) {
+ for (PaletteFragmentArray::iterator iter = _fragments.begin(); iter != _fragments.end(); ++iter) {
PaletteFragment fragment = *iter;
out->writeUint16LE(fragment.id);
out->writeByte(fragment.index);
diff --git a/engines/toltecs/palette.h b/engines/toltecs/palette.h
index 4777a82699..d16a32b10a 100644
--- a/engines/toltecs/palette.h
+++ b/engines/toltecs/palette.h
@@ -8,17 +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.
*
- *
*/
#ifndef TOLTECS_PALETTE_H
diff --git a/engines/toltecs/render.cpp b/engines/toltecs/render.cpp
index 4c41e6ce00..bf68eee94c 100644
--- a/engines/toltecs/render.cpp
+++ b/engines/toltecs/render.cpp
@@ -8,17 +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.
*
- *
*/
#include "common/system.h"
@@ -65,7 +64,7 @@ void RenderQueue::addSprite(SpriteDrawItem &sprite) {
// Add sprite sorted by priority
RenderQueueArray::iterator iter = _currQueue->begin();
while (iter != _currQueue->end() && (*iter).priority <= item.priority) {
- iter++;
+ ++iter;
}
_currQueue->insert(iter, item);
@@ -104,7 +103,7 @@ void RenderQueue::addMask(SegmapMaskRect &mask) {
if (rectIntersectsItem(item.rect)) {
RenderQueueArray::iterator iter = _currQueue->begin();
while (iter != _currQueue->end() && (*iter).priority <= item.priority) {
- iter++;
+ ++iter;
}
_currQueue->insert(iter, item);
}
@@ -119,7 +118,7 @@ void RenderQueue::update() {
if (!doFullRefresh) {
- for (RenderQueueArray::iterator iter = _currQueue->begin(); iter != _currQueue->end(); iter++) {
+ for (RenderQueueArray::iterator iter = _currQueue->begin(); iter != _currQueue->end(); ++iter) {
RenderQueueItem *item = &(*iter);
RenderQueueItem *prevItem = findItemInQueue(_prevQueue, *item);
if (prevItem) {
@@ -134,7 +133,7 @@ void RenderQueue::update() {
}
}
- for (RenderQueueArray::iterator iter = _prevQueue->begin(); iter != _prevQueue->end(); iter++) {
+ for (RenderQueueArray::iterator iter = _prevQueue->begin(); iter != _prevQueue->end(); ++iter) {
RenderQueueItem *prevItem = &(*iter);
RenderQueueItem *item = findItemInQueue(_currQueue, *prevItem);
if (!item) {
@@ -145,7 +144,7 @@ void RenderQueue::update() {
restoreDirtyBackground();
- for (RenderQueueArray::iterator iter = _currQueue->begin(); iter != _currQueue->end(); iter++) {
+ for (RenderQueueArray::iterator iter = _currQueue->begin(); iter != _currQueue->end(); ++iter) {
RenderQueueItem *item = &(*iter);
if (item->flags != kUnchanged)
invalidateItemsByRect(item->rect, item);
@@ -156,7 +155,7 @@ void RenderQueue::update() {
byte *srcp = _vm->_screen->_backScreen + _vm->_cameraX + _vm->_cameraY * _vm->_sceneWidth;
int16 w = MIN<int16>(640, _vm->_sceneWidth);
int16 h = MIN<int16>(400, _vm->_cameraHeight);
- while (h--) {
+ while (h--) {
memcpy(destp, srcp, w);
destp += 640;
srcp += _vm->_sceneWidth;
@@ -164,7 +163,7 @@ void RenderQueue::update() {
_vm->_screen->_fullRefresh = false;
}
- for (RenderQueueArray::iterator iter = _currQueue->begin(); iter != _currQueue->end(); iter++) {
+ for (RenderQueueArray::iterator iter = _currQueue->begin(); iter != _currQueue->end(); ++iter) {
const RenderQueueItem *item = &(*iter);
if (item->flags == kRefresh || doFullRefresh) {
@@ -209,7 +208,7 @@ void RenderQueue::clear() {
}
bool RenderQueue::rectIntersectsItem(const Common::Rect &rect) {
- for (RenderQueueArray::iterator iter = _currQueue->begin(); iter != _currQueue->end(); iter++) {
+ for (RenderQueueArray::iterator iter = _currQueue->begin(); iter != _currQueue->end(); ++iter) {
const RenderQueueItem *item = &(*iter);
if (rect.intersects(item->rect))
return true;
@@ -221,7 +220,7 @@ RenderQueueItem *RenderQueue::findItemInQueue(RenderQueueArray *queue, const Ren
/* This checks if the given item also exists in the previously drawn frame.
The state of the item (position, color etc) is handled elsewhere.
*/
- for (RenderQueueArray::iterator iter = queue->begin(); iter != queue->end(); iter++) {
+ for (RenderQueueArray::iterator iter = queue->begin(); iter != queue->end(); ++iter) {
RenderQueueItem *prevItem = &(*iter);
if (prevItem->type == item.type) {
switch (item.type) {
@@ -263,7 +262,7 @@ bool RenderQueue::hasItemChanged(const RenderQueueItem &item1, const RenderQueue
}
void RenderQueue::invalidateItemsByRect(const Common::Rect &rect, const RenderQueueItem *item) {
- for (RenderQueueArray::iterator iter = _currQueue->begin(); iter != _currQueue->end(); iter++) {
+ for (RenderQueueArray::iterator iter = _currQueue->begin(); iter != _currQueue->end(); ++iter) {
RenderQueueItem *subItem = &(*iter);
if (item != subItem &&
subItem->flags == kUnchanged &&
diff --git a/engines/toltecs/render.h b/engines/toltecs/render.h
index 59d7a3ddb9..5150903146 100644
--- a/engines/toltecs/render.h
+++ b/engines/toltecs/render.h
@@ -8,17 +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.
*
- *
*/
#ifndef TOLTECS_RENDER_H
diff --git a/engines/toltecs/resource.cpp b/engines/toltecs/resource.cpp
index d66075004b..468ae0272f 100644
--- a/engines/toltecs/resource.cpp
+++ b/engines/toltecs/resource.cpp
@@ -8,17 +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.
*
- *
*/
#include "common/file.h"
diff --git a/engines/toltecs/resource.h b/engines/toltecs/resource.h
index 3d45d9fb1b..d8e8ad9a5d 100644
--- a/engines/toltecs/resource.h
+++ b/engines/toltecs/resource.h
@@ -8,17 +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.
*
- *
*/
#ifndef TOLTECS_RESOURCE_H
diff --git a/engines/toltecs/saveload.cpp b/engines/toltecs/saveload.cpp
index 6c195a34c2..409fc97076 100644
--- a/engines/toltecs/saveload.cpp
+++ b/engines/toltecs/saveload.cpp
@@ -8,17 +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.
*
- *
*/
#include "common/savefile.h"
@@ -183,7 +182,7 @@ void ToltecsEngine::loadgame(const char *filename) {
_mouseDisabled = in->readUint16LE();
_system->warpMouse(_mouseX, _mouseY);
- _system->showMouse(_mouseDisabled == 0);
+ _system->showMouse(_mouseDisabled == 0);
_palette->loadState(in);
_script->loadState(in);
diff --git a/engines/toltecs/screen.cpp b/engines/toltecs/screen.cpp
index 1eb2f41fd2..6bacc5dff7 100644
--- a/engines/toltecs/screen.cpp
+++ b/engines/toltecs/screen.cpp
@@ -8,17 +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.
*
- *
*/
#include "graphics/cursorman.h"
@@ -599,7 +598,7 @@ int16 Screen::drawString(int16 x, int16 y, byte color, uint fontResIndex, const
if (ywobble)
yadd = *ywobble;
- while (len--) {
+ while (len--) {
byte ch = *text++;
if (ch <= 0x20) {
x += font.getWidth();
@@ -634,7 +633,7 @@ void Screen::drawChar(const Font &font, byte *dest, int16 x, int16 y, byte ch, b
byte flags = charData[0] & 0xF0;
charData++;
if ((flags & 0x80) == 0) {
- if (flags & 0x10) {
+ if (flags & 0x10) {
memset(dest, color, count);
} else if (outline) {
memset(dest, 0, count);
diff --git a/engines/toltecs/screen.h b/engines/toltecs/screen.h
index 7b2149fded..980865f65f 100644
--- a/engines/toltecs/screen.h
+++ b/engines/toltecs/screen.h
@@ -8,17 +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.
*
- *
*/
#ifndef TOLTECS_SCREEN_H
diff --git a/engines/toltecs/script.cpp b/engines/toltecs/script.cpp
index 476c3a4fcf..01149a14b7 100644
--- a/engines/toltecs/script.cpp
+++ b/engines/toltecs/script.cpp
@@ -8,17 +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.
*
- *
*/
// TODO: Clean up game variable handling and move it to ToltecsEngine
@@ -65,7 +64,7 @@ ScriptInterpreter::ScriptInterpreter(ToltecsEngine *vm) : _vm(vm) {
_savedSp = 0;
_slots[kMaxScriptSlots - 1].size = 1024;
- _slots[kMaxScriptSlots - 1].data = new byte[_slots[kMaxScriptSlots - 1].size];
+ _slots[kMaxScriptSlots - 1].data = new byte[_slots[kMaxScriptSlots - 1].size];
setupScriptFunctions();
@@ -184,11 +183,11 @@ void ScriptInterpreter::loadScript(uint resIndex, uint slotIndex) {
delete[] _slots[slotIndex].data;
- _slots[slotIndex].resIndex = resIndex;
+ _slots[slotIndex].resIndex = resIndex;
Resource *scriptResource = _vm->_res->load(resIndex);
_slots[slotIndex].size = scriptResource->size;
- _slots[slotIndex].data = new byte[_slots[slotIndex].size];
- memcpy(_slots[slotIndex].data, scriptResource->data, _slots[slotIndex].size);
+ _slots[slotIndex].data = new byte[_slots[slotIndex].size];
+ memcpy(_slots[slotIndex].data, scriptResource->data, _slots[slotIndex].size);
}
void ScriptInterpreter::setMainScript(uint slotIndex) {
@@ -852,7 +851,7 @@ void ScriptInterpreter::sfFindMouseInRectIndex2() {
}
void ScriptInterpreter::sfDrawGuiImage() {
- _vm->_screen->drawGuiImage(arg16(5), arg16(3), arg16(7));
+ _vm->_screen->drawGuiImage(arg16(5), arg16(3), arg16(7));
}
void ScriptInterpreter::sfAddAnimatedSpriteNoLoop() {
diff --git a/engines/toltecs/script.h b/engines/toltecs/script.h
index 4c880dfef5..e77dcf4352 100644
--- a/engines/toltecs/script.h
+++ b/engines/toltecs/script.h
@@ -8,17 +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.
*
- *
*/
#ifndef TOLTECS_SCRIPT_H
diff --git a/engines/toltecs/segmap.cpp b/engines/toltecs/segmap.cpp
index fea40f3277..b27e0c8e11 100644
--- a/engines/toltecs/segmap.cpp
+++ b/engines/toltecs/segmap.cpp
@@ -8,17 +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.
*
- *
*/
#include "toltecs/toltecs.h"
diff --git a/engines/toltecs/segmap.h b/engines/toltecs/segmap.h
index dda0edeb88..c1ad293162 100644
--- a/engines/toltecs/segmap.h
+++ b/engines/toltecs/segmap.h
@@ -8,17 +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.
*
- *
*/
#ifndef TOLTECS_SEGMAP_H
diff --git a/engines/toltecs/sound.cpp b/engines/toltecs/sound.cpp
index 8afc0e7890..fb14dd15ee 100644
--- a/engines/toltecs/sound.cpp
+++ b/engines/toltecs/sound.cpp
@@ -8,17 +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.
*
- *
*/
#include "audio/audiostream.h"
diff --git a/engines/toltecs/sound.h b/engines/toltecs/sound.h
index 48a6cd1318..13e943e9e3 100644
--- a/engines/toltecs/sound.h
+++ b/engines/toltecs/sound.h
@@ -8,17 +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.
*
- *
*/
#ifndef TOLTECS_SOUND_H
diff --git a/engines/toltecs/sprite.cpp b/engines/toltecs/sprite.cpp
index 6101eb7d85..f29f64dcfe 100644
--- a/engines/toltecs/sprite.cpp
+++ b/engines/toltecs/sprite.cpp
@@ -8,17 +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.
*
- *
*/
#include "toltecs/toltecs.h"
diff --git a/engines/toltecs/toltecs.cpp b/engines/toltecs/toltecs.cpp
index 188facd63c..d3b69e7f21 100644
--- a/engines/toltecs/toltecs.cpp
+++ b/engines/toltecs/toltecs.cpp
@@ -8,17 +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.
*
- *
*/
#include "common/config-manager.h"
@@ -235,7 +234,7 @@ void ToltecsEngine::loadScene(uint resIndex) {
byte *source = scene + 392;
byte *destp = _screen->_backScreen;
byte *destEnd = destp + _sceneWidth * _sceneHeight;
- while (destp < destEnd) {
+ while (destp < destEnd) {
int count = 1;
byte pixel = *source++;
if (pixel & 0x80) {
@@ -250,7 +249,7 @@ void ToltecsEngine::loadScene(uint resIndex) {
debug(0, "_sceneWidth = %d; _sceneHeight = %d", _sceneWidth, _sceneHeight);
// Load scene segmap
- _segmap->load(scene + imageSize + 4);
+ _segmap->load(scene + imageSize + 4);
_screen->_fullRefresh = true;
_screen->_renderQueue->clear();
@@ -574,9 +573,9 @@ void ToltecsEngine::walk(byte *walkData) {
if (ydelta > ABS(walkInfo.x1 - walkInfo.x2) * _walkSpeedX) {
v10 = 100 - walkInfo.scaling;
v11 = v8;
- } else {
+ } else {
v10 = v8;
- v11 = 100 - walkInfo.scaling;
+ v11 = 100 - walkInfo.scaling;
}
walkInfo.yerror += walkInfo.mulValue * v10;
diff --git a/engines/toltecs/toltecs.h b/engines/toltecs/toltecs.h
index 0be2d2a646..7a04f6e8da 100644
--- a/engines/toltecs/toltecs.h
+++ b/engines/toltecs/toltecs.h
@@ -8,17 +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.
*
- *
*/
#ifndef TOLTECS_H
@@ -36,13 +35,16 @@
#include "graphics/surface.h"
+#include "gui/debugger.h"
+
+#include "toltecs/console.h"
+
namespace Toltecs {
struct ToltecsGameDescription;
class AnimationPlayer;
class ArchiveReader;
-class Console;
class Input;
class MenuSystem;
class MoviePlayer;
@@ -110,6 +112,8 @@ public:
const Common::String& getTargetName() const { return _targetName; }
void syncSoundSettings();
+ GUI::Debugger *getDebugger() { return _console; }
+
void setupSysStrings();
void requestSavegame(int slotNum, Common::String &description);
void requestLoadgame(int slotNum);
diff --git a/engines/tony/configure.engine b/engines/tony/configure.engine
new file mode 100644
index 0000000000..f85f45d158
--- /dev/null
+++ b/engines/tony/configure.engine
@@ -0,0 +1,3 @@
+# This file is included from the main "configure" script
+# add_engine [name] [desc] [build-by-default] [subengines] [base games] [deps]
+add_engine tony "Tony Tough and the Night of Roasted Moths" yes "" "" "16bit"
diff --git a/engines/tony/custom.cpp b/engines/tony/custom.cpp
index f5c580c8c5..989702cd3c 100644
--- a/engines/tony/custom.cpp
+++ b/engines/tony/custom.cpp
@@ -8,17 +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.
*
- *
*/
/*
diff --git a/engines/tony/custom.h b/engines/tony/custom.h
index 0f1061e8cd..9ba10be28a 100644
--- a/engines/tony/custom.h
+++ b/engines/tony/custom.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/tony/debugger.cpp b/engines/tony/debugger.cpp
index 84f05b0d25..e192c53d2b 100644
--- a/engines/tony/debugger.cpp
+++ b/engines/tony/debugger.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope 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.
@@ -28,9 +28,9 @@
namespace Tony {
Debugger::Debugger() : GUI::Debugger() {
- DCmd_Register("continue", WRAP_METHOD(Debugger, Cmd_Exit));
- DCmd_Register("scene", WRAP_METHOD(Debugger, Cmd_Scene));
- DCmd_Register("dirty_rects", WRAP_METHOD(Debugger, Cmd_DirtyRects));
+ registerCmd("continue", WRAP_METHOD(Debugger, cmdExit));
+ registerCmd("scene", WRAP_METHOD(Debugger, Cmd_Scene));
+ registerCmd("dirty_rects", WRAP_METHOD(Debugger, Cmd_DirtyRects));
}
static int strToInt(const char *s) {
@@ -82,13 +82,13 @@ void DebugChangeScene(CORO_PARAM, const void *param) {
*/
bool Debugger::Cmd_Scene(int argc, const char **argv) {
if (argc < 2) {
- DebugPrintf("Usage: %s <scene number> [<x> <y>]\n", argv[0]);
+ debugPrintf("Usage: %s <scene number> [<x> <y>]\n", argv[0]);
return true;
}
int sceneNumber = strToInt(argv[1]);
if (sceneNumber >= g_vm->_theBoxes.getLocBoxesCount()) {
- DebugPrintf("Invalid scene\n");
+ debugPrintf("Invalid scene\n");
return true;
}
@@ -118,7 +118,7 @@ bool Debugger::Cmd_Scene(int argc, const char **argv) {
*/
bool Debugger::Cmd_DirtyRects(int argc, const char **argv) {
if (argc != 2) {
- DebugPrintf("Usage; %s [on | off]\n", argv[0]);
+ debugPrintf("Usage; %s [on | off]\n", argv[0]);
return true;
} else {
g_vm->_window.showDirtyRects(strcmp(argv[1], "on") == 0);
diff --git a/engines/tony/debugger.h b/engines/tony/debugger.h
index 85ba9d75b6..1db1b460fc 100644
--- a/engines/tony/debugger.h
+++ b/engines/tony/debugger.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope 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.
diff --git a/engines/tony/detection.cpp b/engines/tony/detection.cpp
index d355450153..9bb768d1ed 100644
--- a/engines/tony/detection.cpp
+++ b/engines/tony/detection.cpp
@@ -8,17 +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.
*
- *
*/
#include "base/plugins.h"
@@ -178,7 +177,7 @@ SaveStateDescriptor TonyMetaEngine::querySaveMetaInfos(const char *target, int s
}
#if PLUGIN_ENABLED_DYNAMIC(TONY)
-REGISTER_PLUGIN_DYNAMIC(TONY, PLUGIN_TYPE_ENGINE, TonyMetaEngine);
+ REGISTER_PLUGIN_DYNAMIC(TONY, PLUGIN_TYPE_ENGINE, TonyMetaEngine);
#else
-REGISTER_PLUGIN_STATIC(TONY, PLUGIN_TYPE_ENGINE, TonyMetaEngine);
+ REGISTER_PLUGIN_STATIC(TONY, PLUGIN_TYPE_ENGINE, TonyMetaEngine);
#endif
diff --git a/engines/tony/detection_tables.h b/engines/tony/detection_tables.h
index ca16495903..28dcaac752 100644
--- a/engines/tony/detection_tables.h
+++ b/engines/tony/detection_tables.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -217,7 +217,7 @@ static const TonyGameDescription gameDescriptions[] = {
// Tony Tough German "Shoe Box", reported in bug #3582420
{
"tony",
- 0,
+ 0,
{
{"roasted.mpr", 0, "06203dbbc85fdd1e6dc8fc211c1a6207", 135911071},
{"roasted.mpc", 0, "bc3471f098e591dc509dcad401a8d8a5", 389554},
@@ -230,6 +230,23 @@ static const TonyGameDescription gameDescriptions[] = {
},
},
+ {
+ // Tony Tough Russian, reported in bug #6589
+ {
+ "tony",
+ 0,
+ {
+ {"roasted.mpr", 0, "06203dbbc85fdd1e6dc8fc211c1a6207", 135911071},
+ {"roasted.mpc", 0, "377d6e24adeedc6c5c09c31b92231218", 391536},
+ AD_LISTEND
+ },
+ Common::RU_RUS,
+ Common::kPlatformWindows,
+ ADGF_NO_FLAGS,
+ GUIO1(GUIO_NONE)
+ },
+ },
+
{ AD_TABLE_END_MARKER }
};
diff --git a/engines/tony/font.cpp b/engines/tony/font.cpp
index 1729052d42..850aff17be 100644
--- a/engines/tony/font.cpp
+++ b/engines/tony/font.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/tony/font.h b/engines/tony/font.h
index 9ef50b99ec..d52547a58d 100644
--- a/engines/tony/font.h
+++ b/engines/tony/font.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -347,6 +347,7 @@ public:
virtual ~RMDialogChoice();
// Initialization and closure
+ using RMGfxWoodyBuffer::init;
void init();
void close();
diff --git a/engines/tony/game.cpp b/engines/tony/game.cpp
index ca7c07ad8c..c102242dfd 100644
--- a/engines/tony/game.cpp
+++ b/engines/tony/game.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -140,8 +140,6 @@ void RMOptionButton::setActiveState(bool bState) {
\****************************************************************************/
RMOptionSlide::RMOptionSlide(const RMPoint &pt, int nRange, int nStartValue, int slideSize) {
- RMResRaw *raw;
-
_pos = pt;
_nSlideSize = slideSize;
_nMax = nRange;
@@ -154,6 +152,7 @@ RMOptionSlide::RMOptionSlide(const RMPoint &pt, int nRange, int nStartValue, int
_sliderSingle = NULL;
// Sliders
+ RMResRaw *raw;
INIT_GFX16_FROMRAW(20029, _sliderCenter);
INIT_GFX16_FROMRAW(20030, _sliderLeft);
INIT_GFX16_FROMRAW(20031, _sliderRight);
@@ -966,6 +965,8 @@ void RMOptionScreen::changeState(CORO_PARAM, OptionScreenState newState) {
void RMOptionScreen::doFrame(CORO_PARAM, RMInput *input) {
CORO_BEGIN_CONTEXT;
bool bLeftClick, bRightClick;
+ RMResRaw *raw;
+
RMPoint mousePos;
bool bRefresh;
int i;
diff --git a/engines/tony/game.h b/engines/tony/game.h
index fdf62a2a5d..cda07de889 100644
--- a/engines/tony/game.h
+++ b/engines/tony/game.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -300,6 +300,7 @@ public:
RMOptionScreen();
virtual ~RMOptionScreen();
+ using RMGfxWoodyBuffer::init;
void init(CORO_PARAM, RMGfxTargetBuffer &bigBuf, bool &result);
void initLoadMenuOnly(CORO_PARAM, RMGfxTargetBuffer &bigBuf, bool bAlternateGfx, bool &result);
void initSaveMenuOnly(CORO_PARAM, RMGfxTargetBuffer &bigBuf, bool bAlternateGfx, bool &result);
diff --git a/engines/tony/gfxcore.cpp b/engines/tony/gfxcore.cpp
index 3433ad3024..9254d59df6 100644
--- a/engines/tony/gfxcore.cpp
+++ b/engines/tony/gfxcore.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -821,27 +821,24 @@ void RMGfxSourceBuffer8RLE::setAlreadyCompressed() {
}
void RMGfxSourceBuffer8RLE::compressRLE() {
- byte *startline;
byte *cur;
byte curdata;
byte *src;
- byte *startsrc;
- int rep;
// Perform RLE compression for lines
cur = _megaRLEBuf;
src = _buf;
for (int y = 0; y < _dimy; y++) {
// Save the beginning of the line
- startline = cur;
+ byte *startline = cur;
// Leave space for the length of the line
cur += 2;
// It starts from the empty space
curdata = 0;
- rep = 0;
- startsrc = src;
+ int rep = 0;
+ byte *startsrc = src;
for (int x = 0; x < _dimx;) {
if ((curdata == 0 && *src == 0) || (curdata == 1 && *src == _alphaBlendColor)
|| (curdata == 2 && (*src != _alphaBlendColor && *src != 0))) {
diff --git a/engines/tony/gfxcore.h b/engines/tony/gfxcore.h
index 9e8f5225c0..c9081506d7 100644
--- a/engines/tony/gfxcore.h
+++ b/engines/tony/gfxcore.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -71,7 +71,7 @@ public:
int getDimy();
// Creation
- virtual void create(int dimx, int dimy, int nBpp);
+ void create(int dimx, int dimy, int nBpp);
virtual void destroy();
// These are valid only if the buffer is locked
diff --git a/engines/tony/gfxengine.cpp b/engines/tony/gfxengine.cpp
index 7bb25f59b9..efbf63a6f5 100644
--- a/engines/tony/gfxengine.cpp
+++ b/engines/tony/gfxengine.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -352,11 +352,10 @@ void RMGfxEngine::initCustomDll() {
}
void RMGfxEngine::itemIrq(uint32 dwItem, int nPattern, int nStatus) {
- RMItem *item;
assert(GLOBALS._gfxEngine);
if (GLOBALS._gfxEngine->_bLocationLoaded) {
- item = GLOBALS._gfxEngine->_loc.getItemFromCode(dwItem);
+ RMItem *item = GLOBALS._gfxEngine->_loc.getItemFromCode(dwItem);
if (item != NULL) {
if (nPattern != -1) {
item->setPattern(nPattern, true);
@@ -452,8 +451,8 @@ void RMGfxEngine::unloadLocation(CORO_PARAM, bool bDoOnExit, uint32 *result) {
void RMGfxEngine::init() {
// Screen loading
- RMResRaw *raw;
RMGfxSourceBuffer16 *load = NULL;
+ RMResRaw *raw;
INIT_GFX16_FROMRAW(20038, load);
_bigBuf.addPrim(new RMGfxPrimitive(load));
_bigBuf.drawOT(Common::nullContext);
@@ -722,9 +721,7 @@ void RMGfxEngine::loadState(CORO_PARAM, const Common::String &fn) {
if (_ctx->ver >= 5) {
// Version 5
- bool bStat = false;
-
- bStat = _ctx->f->readByte();
+ bool bStat = _ctx->f->readByte();
_tony.setShepherdess(bStat);
bStat = _ctx->f->readByte();
_inter.setPerorate(bStat);
diff --git a/engines/tony/gfxengine.h b/engines/tony/gfxengine.h
index ab32a01972..927593a5d3 100644
--- a/engines/tony/gfxengine.h
+++ b/engines/tony/gfxengine.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/tony/globals.cpp b/engines/tony/globals.cpp
index 8e4ae240a0..ca2b6e72dc 100644
--- a/engines/tony/globals.cpp
+++ b/engines/tony/globals.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/tony/globals.h b/engines/tony/globals.h
index 0ff243b374..1cff57fd16 100644
--- a/engines/tony/globals.h
+++ b/engines/tony/globals.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/tony/input.cpp b/engines/tony/input.cpp
index e84da04d97..787fb21f21 100644
--- a/engines/tony/input.cpp
+++ b/engines/tony/input.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/tony/input.h b/engines/tony/input.h
index 274aa8c491..31acb68eb6 100644
--- a/engines/tony/input.h
+++ b/engines/tony/input.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/tony/inventory.cpp b/engines/tony/inventory.cpp
index 6b023d5990..974be8b04d 100644
--- a/engines/tony/inventory.cpp
+++ b/engines/tony/inventory.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -457,8 +457,6 @@ bool RMInventory::rightRelease(const RMPoint &mpos, RMTonyAction &curAction) {
#define INVSPEED 20
void RMInventory::doFrame(RMGfxTargetBuffer &bigBuf, RMPointer &ptr, RMPoint mpos, bool bCanOpen) {
- bool bNeedRedraw = false;
-
if (_state != CLOSED) {
// Clean up the OT list
g_system->lockMutex(_csModifyInterface);
@@ -466,6 +464,8 @@ void RMInventory::doFrame(RMGfxTargetBuffer &bigBuf, RMPointer &ptr, RMPoint mpo
// DoFrame makes all the objects currently in the inventory be displayed
// @@@ Maybe we should do all takeable objects? Please does not help
+ bool bNeedRedraw = false;
+
for (int i = 0; i < _nInv; i++) {
if (_items[_inv[i]]._icon.doFrame(this, false) && (i >= _curPos && i <= _curPos + 7))
bNeedRedraw = true;
@@ -698,9 +698,8 @@ int RMInventory::loadState(byte *state) {
state += 4;
}
- int x;
for (int i = 0; i < 256; i++) {
- x = READ_LE_UINT32(state);
+ int x = READ_LE_UINT32(state);
state += 4;
if (i < _nItems) {
diff --git a/engines/tony/inventory.h b/engines/tony/inventory.h
index 1d660d51cd..5528e6589c 100644
--- a/engines/tony/inventory.h
+++ b/engines/tony/inventory.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -101,6 +101,7 @@ public:
/**
* Initialization and closing
*/
+ using RMGfxWoodyBuffer::init;
void init();
void close();
void reset();
@@ -209,6 +210,7 @@ public:
/**
* Initialization
*/
+ using RMGfxSourceBuffer8RLEByte::init;
void init();
void close();
diff --git a/engines/tony/loc.cpp b/engines/tony/loc.cpp
index 5beac842f9..09a00deed1 100644
--- a/engines/tony/loc.cpp
+++ b/engines/tony/loc.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -892,12 +892,12 @@ void RMWipe::draw(CORO_PARAM, RMGfxTargetBuffer &bigBuf, RMGfxPrimitive *prim) {
/* Returns path along the vector path path[] */
/****************************************************************************/
-short RMCharacter::findPath(short source, short destination) {
+bool RMCharacter::findPath(short source, short destination) {
static RMBox box[MAXBOXES]; // Matrix of adjacent boxes
static short nodeCost[MAXBOXES]; // Cost per node
static short valid[MAXBOXES]; // 0:Invalid 1:Valid 2:Saturated
static short nextNode[MAXBOXES]; // Next node
- short minCost, error = 0;
+ bool error = false;
RMBoxLoc *cur;
g_system->lockMutex(_csMove);
@@ -925,13 +925,13 @@ short RMCharacter::findPath(short source, short destination) {
// Find the shortest path
while (!finish) {
- minCost = 32000; // Reset the minimum cost
- error = 1; // Possible error
+ short minCost = 32000; // Reset the minimum cost
+ error = true; // Possible error
// 1st cycle: explore possible new nodes
for (int i = 0; i < cur->_numbBox; i++) {
if (valid[i] == 1) {
- error = 0; // Failure de-bunked
+ error = false; // Failure de-bunked
int j = 0;
while (((box[i]._adj[j]) != 1) && (j < cur->_numbBox))
j++;
@@ -1851,10 +1851,9 @@ void RMGameBoxes::loadState(byte *state) {
assert(nloc <= _nLocBoxes);
- int nbox;
// For each location, read the number of boxes and their status
for (int i = 1; i <= nloc; i++) {
- nbox = READ_LE_UINT32(state);
+ int nbox = READ_LE_UINT32(state);
state += 4;
for (int j = 0; j < nbox ; j++) {
diff --git a/engines/tony/loc.h b/engines/tony/loc.h
index 1306316136..ac65a4a0bd 100644
--- a/engines/tony/loc.h
+++ b/engines/tony/loc.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -395,7 +395,7 @@ private:
private:
int inWhichBox(const RMPoint &pt);
- short findPath(short source, short destination);
+ bool findPath(short source, short destination);
RMPoint searching(char UP, char DOWN, char RIGHT, char LEFT, RMPoint point);
RMPoint nearestPoint(const RMPoint &punto);
diff --git a/engines/tony/mpal/expr.cpp b/engines/tony/mpal/expr.cpp
index 7dc640ba7c..1fdf637062 100644
--- a/engines/tony/mpal/expr.cpp
+++ b/engines/tony/mpal/expr.cpp
@@ -8,17 +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.
*
- *
*/
/*
* This code is based on original Tony Tough source code
diff --git a/engines/tony/mpal/expr.h b/engines/tony/mpal/expr.h
index 256d09bb9b..6ac1963356 100644
--- a/engines/tony/mpal/expr.h
+++ b/engines/tony/mpal/expr.h
@@ -8,17 +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.
*
- *
*/
/*
* This code is based on original Tony Tough source code
diff --git a/engines/tony/mpal/loadmpc.cpp b/engines/tony/mpal/loadmpc.cpp
index 4eb84d1406..8d030f1e52 100644
--- a/engines/tony/mpal/loadmpc.cpp
+++ b/engines/tony/mpal/loadmpc.cpp
@@ -8,17 +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.
*
- *
*/
/*
* This code is based on original Tony Tough source code
@@ -139,8 +138,6 @@ static void FreeScript(LpMpalScript lpmsScript) {
* @returns Pointer to the buffer after the item, or NULL on failure.
*/
static const byte *parseDialog(const byte *lpBuf, LpMpalDialog lpmdDialog) {
- byte *lpLock;
-
lpmdDialog->_nObj = READ_LE_UINT32(lpBuf);
lpBuf += 4;
@@ -156,7 +153,7 @@ static const byte *parseDialog(const byte *lpBuf, LpMpalDialog lpmdDialog) {
lpmdDialog->_periodNums[i] = READ_LE_UINT16(lpBuf);
lpBuf += 2;
lpmdDialog->_periods[i] = globalAllocate(GMEM_MOVEABLE | GMEM_ZEROINIT, *lpBuf + 1);
- lpLock = (byte *)globalLock(lpmdDialog->_periods[i]);
+ byte *lpLock = (byte *)globalLock(lpmdDialog->_periods[i]);
Common::copy(lpBuf + 1, lpBuf + 1 + *lpBuf, lpLock);
globalUnlock(lpmdDialog->_periods[i]);
lpBuf += (*lpBuf) + 1;
diff --git a/engines/tony/mpal/loadmpc.h b/engines/tony/mpal/loadmpc.h
index 20956288aa..479cf5f99b 100644
--- a/engines/tony/mpal/loadmpc.h
+++ b/engines/tony/mpal/loadmpc.h
@@ -8,17 +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.
*
- *
*/
/*
* This code is based on original Tony Tough source code
diff --git a/engines/tony/mpal/lzo.cpp b/engines/tony/mpal/lzo.cpp
index a04a769528..314d6f3ed5 100644
--- a/engines/tony/mpal/lzo.cpp
+++ b/engines/tony/mpal/lzo.cpp
@@ -8,17 +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.
*
- *
*/
/* minilzo.c -- mini subset of the LZO real-time data compression library
@@ -70,15 +69,9 @@ namespace Tony {
namespace MPAL {
#define pd(a, b) ((uint32) ((a) - (b)))
-
#define TEST_IP (ip < ip_end)
-#define TEST_OP 1
-#define NEED_IP(x) ((void) 0)
-#define NEED_OP(x) ((void) 0)
-#define TEST_LB(m_pos) ((void) 0)
#define M2_MAX_OFFSET 0x0800
-#define LZO1X
/**
* Decompresses an LZO compressed resource
@@ -87,425 +80,142 @@ int lzo1x_decompress(const byte *in, uint32 in_len, byte *out, uint32 *out_len)
register byte *op;
register const byte *ip;
register uint32 t = 0;
-#if defined(COPY_DICT)
- uint32 m_off;
- const byte *dict_end;
-#else
register const byte *m_pos;
-#endif
const byte * const ip_end = in + in_len;
-#if defined(HAVE_ANY_OP)
- byte * const op_end = out + *out_len;
-#endif
-#if defined(LZO1Z)
- uint32 last_m_off = 0;
-#endif
-
-#if defined(COPY_DICT)
- if (dict)
- {
- if (dict_len > M4_MAX_OFFSET)
- {
- dict += dict_len - M4_MAX_OFFSET;
- dict_len = M4_MAX_OFFSET;
- }
- dict_end = dict + dict_len;
- }
- else
- {
- dict_len = 0;
- dict_end = NULL;
- }
-#endif
*out_len = 0;
op = out;
ip = in;
- if (*ip > 17)
- {
+ if (*ip > 17) {
t = *ip++ - 17;
if (t < 4)
goto match_next;
- assert(t > 0); NEED_OP(t); NEED_IP(t+1);
- do *op++ = *ip++; while (--t > 0);
+ assert(t > 0);
+ do
+ *op++ = *ip++;
+ while (--t > 0);
goto first_literal_run;
}
- while (TEST_IP && TEST_OP)
- {
+ while (TEST_IP) {
t = *ip++;
if (t >= 16)
goto match;
- if (t == 0)
- {
- NEED_IP(1);
- while (*ip == 0)
- {
+ if (t == 0) {
+ while (*ip == 0) {
t += 255;
ip++;
- NEED_IP(1);
}
t += 15 + *ip++;
}
- assert(t > 0); NEED_OP(t+3); NEED_IP(t+4);
-#if defined(LZO_UNALIGNED_OK_8) && defined(LZO_UNALIGNED_OK_4)
- t += 3;
- if (t >= 8) do
- {
- UA_COPY64(op, ip);
- op += 8; ip += 8; t -= 8;
- } while (t >= 8);
- if (t >= 4)
- {
- UA_COPY32(op, ip);
- op += 4; ip += 4; t -= 4;
- }
- if (t > 0)
- {
+ assert(t > 0);
+
+ *op++ = *ip++;
+ *op++ = *ip++;
+ *op++ = *ip++;
+ do
*op++ = *ip++;
- if (t > 1) { *op++ = *ip++; if (t > 2) { *op++ = *ip++; } }
- }
-#elif defined(LZO_UNALIGNED_OK_4) || defined(LZO_ALIGNED_OK_4)
-#if !defined(LZO_UNALIGNED_OK_4)
- if (PTR_ALIGNED2_4(op, ip))
- {
-#endif
- UA_COPY32(op, ip);
- op += 4; ip += 4;
- if (--t > 0)
- {
- if (t >= 4)
- {
- do {
- UA_COPY32(op, ip);
- op += 4; ip += 4; t -= 4;
- } while (t >= 4);
- if (t > 0) do *op++ = *ip++; while (--t > 0);
- }
- else
- do *op++ = *ip++; while (--t > 0);
- }
-#if !defined(LZO_UNALIGNED_OK_4)
- }
- else
-#endif
-#endif
-#if !defined(LZO_UNALIGNED_OK_4) && !defined(LZO_UNALIGNED_OK_8)
- {
- *op++ = *ip++; *op++ = *ip++; *op++ = *ip++;
- do *op++ = *ip++; while (--t > 0);
- }
-#endif
+ while (--t > 0);
first_literal_run:
-
t = *ip++;
if (t >= 16)
goto match;
-#if defined(COPY_DICT)
-#if defined(LZO1Z)
- m_off = (1 + M2_MAX_OFFSET) + (t << 6) + (*ip++ >> 2);
- last_m_off = m_off;
-#else
- m_off = (1 + M2_MAX_OFFSET) + (t >> 2) + (*ip++ << 2);
-#endif
- NEED_OP(3);
- t = 3; COPY_DICT(t, m_off)
-#else
-#if defined(LZO1Z)
- t = (1 + M2_MAX_OFFSET) + (t << 6) + (*ip++ >> 2);
- m_pos = op - t;
- last_m_off = t;
-#else
+
m_pos = op - (1 + M2_MAX_OFFSET);
m_pos -= t >> 2;
m_pos -= *ip++ << 2;
-#endif
- TEST_LB(m_pos); NEED_OP(3);
- *op++ = *m_pos++; *op++ = *m_pos++; *op++ = *m_pos;
-#endif
+
+ *op++ = *m_pos++;
+ *op++ = *m_pos++;
+ *op++ = *m_pos;
+
goto match_done;
do {
match:
- if (t >= 64)
- {
-#if defined(COPY_DICT)
-#if defined(LZO1X)
- m_off = 1 + ((t >> 2) & 7) + (*ip++ << 3);
- t = (t >> 5) - 1;
-#elif defined(LZO1Y)
- m_off = 1 + ((t >> 2) & 3) + (*ip++ << 2);
- t = (t >> 4) - 3;
-#elif defined(LZO1Z)
- m_off = t & 0x1f;
- if (m_off >= 0x1c)
- m_off = last_m_off;
- else
- {
- m_off = 1 + (m_off << 6) + (*ip++ >> 2);
- last_m_off = m_off;
- }
- t = (t >> 5) - 1;
-#endif
-#else
-#if defined(LZO1X)
+ if (t >= 64) {
m_pos = op - 1;
m_pos -= (t >> 2) & 7;
m_pos -= *ip++ << 3;
t = (t >> 5) - 1;
-#elif defined(LZO1Y)
- m_pos = op - 1;
- m_pos -= (t >> 2) & 3;
- m_pos -= *ip++ << 2;
- t = (t >> 4) - 3;
-#elif defined(LZO1Z)
- {
- uint32 off = t & 0x1f;
- m_pos = op;
- if (off >= 0x1c)
- {
- assert(last_m_off > 0);
- m_pos -= last_m_off;
- }
- else
- {
- off = 1 + (off << 6) + (*ip++ >> 2);
- m_pos -= off;
- last_m_off = off;
- }
- }
- t = (t >> 5) - 1;
-#endif
- TEST_LB(m_pos); assert(t > 0); NEED_OP(t+3-1);
+ assert(t > 0);
goto copy_match;
-#endif
- }
- else if (t >= 32)
- {
+ } else if (t >= 32) {
t &= 31;
- if (t == 0)
- {
- NEED_IP(1);
- while (*ip == 0)
- {
+ if (t == 0) {
+ while (*ip == 0) {
t += 255;
ip++;
- NEED_IP(1);
}
t += 31 + *ip++;
}
-#if defined(COPY_DICT)
-#if defined(LZO1Z)
- m_off = 1 + (ip[0] << 6) + (ip[1] >> 2);
- last_m_off = m_off;
-#else
- m_off = 1 + (ip[0] >> 2) + (ip[1] << 6);
-#endif
-#else
-#if defined(LZO1Z)
- {
- uint32 off = 1 + (ip[0] << 6) + (ip[1] >> 2);
- m_pos = op - off;
- last_m_off = off;
- }
-#elif defined(LZO_UNALIGNED_OK_2) && defined(LZO_ABI_LITTLE_ENDIAN)
- m_pos = op - 1;
- m_pos -= UA_GET16(ip) >> 2;
-#else
m_pos = op - 1;
m_pos -= (ip[0] >> 2) + (ip[1] << 6);
-#endif
-#endif
ip += 2;
- }
- else if (t >= 16)
- {
-#if defined(COPY_DICT)
- m_off = (t & 8) << 11;
-#else
+ } else if (t >= 16) {
m_pos = op;
m_pos -= (t & 8) << 11;
-#endif
t &= 7;
- if (t == 0)
- {
- NEED_IP(1);
- while (*ip == 0)
- {
+ if (t == 0) {
+ while (*ip == 0) {
t += 255;
ip++;
- NEED_IP(1);
}
t += 7 + *ip++;
}
-#if defined(COPY_DICT)
-#if defined(LZO1Z)
- m_off += (ip[0] << 6) + (ip[1] >> 2);
-#else
- m_off += (ip[0] >> 2) + (ip[1] << 6);
-#endif
- ip += 2;
- if (m_off == 0)
- goto eof_found;
- m_off += 0x4000;
-#if defined(LZO1Z)
- last_m_off = m_off;
-#endif
-#else
-#if defined(LZO1Z)
- m_pos -= (ip[0] << 6) + (ip[1] >> 2);
-#elif defined(LZO_UNALIGNED_OK_2) && defined(LZO_ABI_LITTLE_ENDIAN)
- m_pos -= UA_GET16(ip) >> 2;
-#else
m_pos -= (ip[0] >> 2) + (ip[1] << 6);
-#endif
ip += 2;
if (m_pos == op)
goto eof_found;
m_pos -= 0x4000;
-#if defined(LZO1Z)
- last_m_off = pd((const byte *)op, m_pos);
-#endif
-#endif
- }
- else
- {
-#if defined(COPY_DICT)
-#if defined(LZO1Z)
- m_off = 1 + (t << 6) + (*ip++ >> 2);
- last_m_off = m_off;
-#else
- m_off = 1 + (t >> 2) + (*ip++ << 2);
-#endif
- NEED_OP(2);
- t = 2; COPY_DICT(t, m_off)
-#else
-#if defined(LZO1Z)
- t = 1 + (t << 6) + (*ip++ >> 2);
- m_pos = op - t;
- last_m_off = t;
-#else
+ } else {
m_pos = op - 1;
m_pos -= t >> 2;
m_pos -= *ip++ << 2;
-#endif
- TEST_LB(m_pos); NEED_OP(2);
- *op++ = *m_pos++; *op++ = *m_pos;
-#endif
+ *op++ = *m_pos++;
+ *op++ = *m_pos;
goto match_done;
}
-#if defined(COPY_DICT)
-
- NEED_OP(t+3-1);
- t += 3-1; COPY_DICT(t, m_off)
-
-#else
-
- TEST_LB(m_pos); assert(t > 0); NEED_OP(t+3-1);
-#if defined(LZO_UNALIGNED_OK_8) && defined(LZO_UNALIGNED_OK_4)
- if (op - m_pos >= 8)
- {
- t += (3 - 1);
- if (t >= 8) do
- {
- UA_COPY64(op, m_pos);
- op += 8; m_pos += 8; t -= 8;
- } while (t >= 8);
- if (t >= 4)
- {
- UA_COPY32(op, m_pos);
- op += 4; m_pos += 4; t -= 4;
- }
- if (t > 0)
- {
- *op++ = m_pos[0];
- if (t > 1) { *op++ = m_pos[1]; if (t > 2) { *op++ = m_pos[2]; } }
- }
- }
- else
-#elif defined(LZO_UNALIGNED_OK_4) || defined(LZO_ALIGNED_OK_4)
-#if !defined(LZO_UNALIGNED_OK_4)
- if (t >= 2 * 4 - (3 - 1) && PTR_ALIGNED2_4(op, m_pos))
- {
- assert((op - m_pos) >= 4);
-#else
- if (t >= 2 * 4 - (3 - 1) && (op - m_pos) >= 4)
- {
-#endif
- UA_COPY32(op, m_pos);
- op += 4; m_pos += 4; t -= 4 - (3 - 1);
- do {
- UA_COPY32(op, m_pos);
- op += 4; m_pos += 4; t -= 4;
- } while (t >= 4);
- if (t > 0) do *op++ = *m_pos++; while (--t > 0);
- }
- else
-#endif
+ assert(t > 0);
{
copy_match:
- *op++ = *m_pos++; *op++ = *m_pos++;
- do *op++ = *m_pos++; while (--t > 0);
+ *op++ = *m_pos++;
+ *op++ = *m_pos++;
+ do
+ *op++ = *m_pos++;
+ while (--t > 0);
}
-#endif
-
match_done:
-#if defined(LZO1Z)
- t = ip[-1] & 3;
-#else
t = ip[-2] & 3;
-#endif
if (t == 0)
break;
match_next:
- assert(t > 0); assert(t < 4); NEED_OP(t); NEED_IP(t+1);
-#if 0
- do *op++ = *ip++; while (--t > 0);
-#else
+ assert(t > 0);
+ assert(t < 4);
*op++ = *ip++;
- if (t > 1) { *op++ = *ip++; if (t > 2) { *op++ = *ip++; } }
-#endif
+ if (t > 1) {
+ *op++ = *ip++;
+ if (t > 2)
+ *op++ = *ip++;
+ }
t = *ip++;
- } while (TEST_IP && TEST_OP);
+ } while (TEST_IP);
}
-#if defined(HAVE_TEST_IP) || defined(HAVE_TEST_OP)
- *out_len = pd(op, out);
- return LZO_E_EOF_NOT_FOUND;
-#endif
-
eof_found:
assert(t == 1);
*out_len = pd(op, out);
return (ip == ip_end ? LZO_E_OK :
(ip < ip_end ? LZO_E_INPUT_NOT_CONSUMED : LZO_E_INPUT_OVERRUN));
-#if defined(HAVE_NEED_IP)
-input_overrun:
- *out_len = pd(op, out);
- return LZO_E_INPUT_OVERRUN;
-#endif
-
-#if defined(HAVE_NEED_OP)
-output_overrun:
- *out_len = pd(op, out);
- return LZO_E_OUTPUT_OVERRUN;
-#endif
-
-#if defined(LZO_TEST_OVERRUN_LOOKBEHIND)
-lookbehind_overrun:
- *out_len = pd(op, out);
- return LZO_E_LOOKBEHIND_OVERRUN;
-#endif
}
} // end of namespace MPAL
-
} // end of namespace Tony
diff --git a/engines/tony/mpal/lzo.h b/engines/tony/mpal/lzo.h
index ebb1c4b516..172900f053 100644
--- a/engines/tony/mpal/lzo.h
+++ b/engines/tony/mpal/lzo.h
@@ -8,17 +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.
*
- *
*/
/* minilzo.c -- mini subset of the LZO real-time data compression library
@@ -76,36 +75,15 @@ namespace MPAL {
* normal events.
*/
#define LZO_E_OK 0
-#define LZO_E_ERROR (-1)
-#define LZO_E_OUT_OF_MEMORY (-2) /* [lzo_alloc_func_t failure] */
-#define LZO_E_NOT_COMPRESSIBLE (-3) /* [not used right now] */
#define LZO_E_INPUT_OVERRUN (-4)
-#define LZO_E_OUTPUT_OVERRUN (-5)
-#define LZO_E_LOOKBEHIND_OVERRUN (-6)
-#define LZO_E_EOF_NOT_FOUND (-7)
#define LZO_E_INPUT_NOT_CONSUMED (-8)
-#define LZO_E_NOT_YET_IMPLEMENTED (-9) /* [not used right now] */
-#define LZO_E_INVALID_ARGUMENT (-10)
-
-#define LZO1X_999_MEM_COMPRESS ((uint32) (14 * 16384L * sizeof(uint16)))
/**
* Decompresses an LZO compressed resource
*/
int lzo1x_decompress(const byte *src, uint32 src_len, byte *dst, uint32 *dst_len);
-/**
- * Comrpess a data block into an LZO stream
- */
-int lzo1x_1_compress(const byte *src, uint32 src_len, byte *dst, uint32 *dst_len, void *wrkmem);
-
-/**
- * better compression ratio at the cost of more memory and time
- */
-int lzo1x_999_compress(const byte *src, uint32 src_len, byte *dst, uint32 *dst_len, void *wrkmem);
-
} // end of namespace MPAL
-
} // end of namespace Tony
#endif /* already included */
diff --git a/engines/tony/mpal/memory.cpp b/engines/tony/mpal/memory.cpp
index 9737fe0abf..4076f710de 100644
--- a/engines/tony/mpal/memory.cpp
+++ b/engines/tony/mpal/memory.cpp
@@ -8,17 +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.
*
- *
*/
#include "common/algorithm.h"
diff --git a/engines/tony/mpal/memory.h b/engines/tony/mpal/memory.h
index 9c21cc20e6..7739fdfa48 100644
--- a/engines/tony/mpal/memory.h
+++ b/engines/tony/mpal/memory.h
@@ -8,17 +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.
*
- *
*/
#ifndef TONY_MPAL_MEMORY
diff --git a/engines/tony/mpal/mpal.cpp b/engines/tony/mpal/mpal.cpp
index 7010c238b5..c813b354b0 100644
--- a/engines/tony/mpal/mpal.cpp
+++ b/engines/tony/mpal/mpal.cpp
@@ -8,17 +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.
*
- *
*/
/*
* This code is based on original Tony Tough source code
@@ -963,7 +962,7 @@ void LocationPollThread(CORO_PARAM, const void *param) {
// Ok, we can perform the action. For convenience, we do it in a new process
_ctx->newItem = (LpMpalItem)globalAlloc(GMEM_FIXED | GMEM_ZEROINIT, sizeof(MpalItem));
- if (_ctx->newItem == false) {
+ if (!_ctx->newItem) {
globalDestroy(_ctx->myThreads);
globalDestroy(_ctx->myActions);
@@ -1519,13 +1518,12 @@ void mpalFree() {
*
* @param wQueryType Type of query. The list is in the QueryTypes enum.
* @returns 4 bytes depending on the type of query
- * @remarks This is the specialised version of the original single mpalQuery
+ * @remarks This is the specialized version of the original single mpalQuery
* method that returns numeric results.
*/
uint32 mpalQueryDWORD(uint16 wQueryType, ...) {
Common::String buf;
uint32 dwRet = 0;
- char *n;
va_list v;
va_start(v, wQueryType);
@@ -1626,7 +1624,7 @@ uint32 mpalQueryDWORD(uint16 wQueryType, ...) {
*/
lockVar();
int x = GETARG(uint32);
- n = GETARG(char *);
+ char *n = GETARG(char *);
buf = Common::String::format("Status.%u", x);
if (varGetValue(buf.c_str()) <= 0)
n[0]='\0';
@@ -1716,11 +1714,10 @@ uint32 mpalQueryDWORD(uint16 wQueryType, ...) {
*
* @param wQueryType Type of query. The list is in the QueryTypes enum.
* @returns 4 bytes depending on the type of query
- * @remarks This is the specialised version of the original single mpalQuery
+ * @remarks This is the specialized version of the original single mpalQuery
* method that returns a pointer or handle.
*/
MpalHandle mpalQueryHANDLE(uint16 wQueryType, ...) {
- char *n;
Common::String buf;
va_list v;
va_start(v, wQueryType);
@@ -1798,12 +1795,9 @@ MpalHandle mpalQueryHANDLE(uint16 wQueryType, ...) {
error("mpalQuery(MPQ_ITEM_IS_ACTIVE, uint32 nItem) used incorrect variant");
} else if (wQueryType == MPQ_ITEM_NAME) {
- /*
- * uint32 mpalQuery(MPQ_ITEM_NAME, uint32 nItem, char *lpszName);
- */
lockVar();
int x = GETARG(uint32);
- n = GETARG(char *);
+ char *n = GETARG(char *);
buf = Common::String::format("Status.%u", x);
if (varGetValue(buf.c_str()) <= 0)
n[0] = '\0';
@@ -1873,7 +1867,7 @@ MpalHandle mpalQueryHANDLE(uint16 wQueryType, ...) {
*
* @param wQueryType Type of query. The list is in the QueryTypes enum.
* @returns 4 bytes depending on the type of query
- * @remarks This is the specialised version of the original single mpalQuery
+ * @remarks This is the specialized version of the original single mpalQuery
* method that needs to run within a co-routine context.
*/
void mpalQueryCORO(CORO_PARAM, uint16 wQueryType, uint32 *dwRet) {
@@ -1935,7 +1929,7 @@ bool mpalExecuteScript(int nScript) {
// !!! New process management
if (CoroScheduler.createProcess(ScriptThread, &s, sizeof(LpMpalScript)) == CORO_INVALID_PID_VALUE)
- return false;
+ return false;
return true;
}
diff --git a/engines/tony/mpal/mpal.h b/engines/tony/mpal/mpal.h
index 2d22ee8faf..af24c46697 100644
--- a/engines/tony/mpal/mpal.h
+++ b/engines/tony/mpal/mpal.h
@@ -8,17 +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.
*
- *
*/
/*
* This code is based on original Tony Tough source code
@@ -392,7 +391,7 @@ void mpalFree();
*
* @param wQueryType Type of query. The list is in the QueryTypes enum.
* @returns 4 bytes depending on the type of query
- * @remarks This is the specialised version of the original single mpalQuery
+ * @remarks This is the specialized version of the original single mpalQuery
* method that returns numeric results.
*/
uint32 mpalQueryDWORD(uint16 wQueryType, ...);
@@ -403,7 +402,7 @@ uint32 mpalQueryDWORD(uint16 wQueryType, ...);
*
* @param wQueryType Type of query. The list is in the QueryTypes enum.
* @returns 4 bytes depending on the type of query
- * @remarks This is the specialised version of the original single mpalQuery
+ * @remarks This is the specialized version of the original single mpalQuery
* method that returns a pointer or handle.
*/
MpalHandle mpalQueryHANDLE(uint16 wQueryType, ...);
@@ -414,7 +413,7 @@ MpalHandle mpalQueryHANDLE(uint16 wQueryType, ...);
*
* @param wQueryType Type of query. The list is in the QueryTypes enum.
* @returns 4 bytes depending on the type of query
- * @remarks This is the specialised version of the original single mpalQuery
+ * @remarks This is the specialized version of the original single mpalQuery
* method that needs to run within a co-routine context.
*/
void mpalQueryCORO(CORO_PARAM, uint16 wQueryType, uint32 *dwRet);
diff --git a/engines/tony/mpal/mpaldll.h b/engines/tony/mpal/mpaldll.h
index 92ddf8fc5a..68969497c1 100644
--- a/engines/tony/mpal/mpaldll.h
+++ b/engines/tony/mpal/mpaldll.h
@@ -8,17 +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.
*
- *
*/
/*
* This code is based on original Tony Tough source code
diff --git a/engines/tony/mpal/mpalutils.cpp b/engines/tony/mpal/mpalutils.cpp
index 0919aed5ac..84c8a68919 100644
--- a/engines/tony/mpal/mpalutils.cpp
+++ b/engines/tony/mpal/mpalutils.cpp
@@ -8,17 +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.
*
- *
*/
#include "tony/mpal/mpalutils.h"
diff --git a/engines/tony/mpal/mpalutils.h b/engines/tony/mpal/mpalutils.h
index f351f22196..9ef534c632 100644
--- a/engines/tony/mpal/mpalutils.h
+++ b/engines/tony/mpal/mpalutils.h
@@ -8,17 +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.
*
- *
*/
#ifndef TONY_MPAL_MPALUTILS
diff --git a/engines/tony/resid.h b/engines/tony/resid.h
index 0d601b7dd6..93c008144a 100644
--- a/engines/tony/resid.h
+++ b/engines/tony/resid.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/tony/sound.cpp b/engines/tony/sound.cpp
index 547f31906e..2a4eb826f3 100644
--- a/engines/tony/sound.cpp
+++ b/engines/tony/sound.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -88,7 +88,7 @@ FPSound::~FPSound() {
bool FPSound::createStream(FPStream **streamPtr) {
(*streamPtr) = new FPStream(_soundSupported);
- return (*streamPtr != NULL);
+ return true;
}
/**
diff --git a/engines/tony/sound.h b/engines/tony/sound.h
index 7422de02b3..446dc68d80 100644
--- a/engines/tony/sound.h
+++ b/engines/tony/sound.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/tony/tony.cpp b/engines/tony/tony.cpp
index 43a2f639d9..2857bb93f8 100644
--- a/engines/tony/tony.cpp
+++ b/engines/tony/tony.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/tony/tony.h b/engines/tony/tony.h
index 750673061d..40a5184c31 100644
--- a/engines/tony/tony.h
+++ b/engines/tony/tony.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -31,6 +31,7 @@
#include "common/random.h"
#include "common/util.h"
#include "engines/engine.h"
+#include "gui/debugger.h"
#include "tony/mpal/mpal.h"
#include "tony/mpal/memory.h"
@@ -108,6 +109,7 @@ public:
Common::List<FPSfx *> _activeSfx;
Globals _globals;
Debugger *_debugger;
+ GUI::Debugger *getDebugger() { return _debugger; }
int16 _cTableDialog[256];
int16 _lTableDialog[256];
diff --git a/engines/tony/tonychar.cpp b/engines/tony/tonychar.cpp
index 46c018728e..224d923142 100644
--- a/engines/tony/tonychar.cpp
+++ b/engines/tony/tonychar.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/tony/tonychar.h b/engines/tony/tonychar.h
index d9f18f61ec..5c5be9ca4e 100644
--- a/engines/tony/tonychar.h
+++ b/engines/tony/tonychar.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/tony/utils.cpp b/engines/tony/utils.cpp
index 81060146b7..d70073542f 100644
--- a/engines/tony/utils.cpp
+++ b/engines/tony/utils.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/tony/utils.h b/engines/tony/utils.h
index 9f13e5f19b..eb2f3c74d3 100644
--- a/engines/tony/utils.h
+++ b/engines/tony/utils.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/tony/window.cpp b/engines/tony/window.cpp
index a732862854..5c50a50a57 100644
--- a/engines/tony/window.cpp
+++ b/engines/tony/window.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -40,7 +40,7 @@ namespace Tony {
\****************************************************************************/
RMWindow::RMWindow() {
- _showDirtyRects = false;
+ reset();
}
RMWindow::~RMWindow() {
@@ -55,11 +55,21 @@ RMWindow::~RMWindow() {
void RMWindow::init() {
Graphics::PixelFormat pixelFormat(2, 5, 5, 5, 0, 10, 5, 0, 0);
initGraphics(RM_SX, RM_SY, true, &pixelFormat);
+
+ reset();
+}
+/**
+ * Reset the variables
+ */
+void RMWindow::reset() {
+ _showDirtyRects = false;
_bGrabScreenshot = false;
_bGrabThumbnail = false;
_bGrabMovie = false;
_wiping = false;
+
+ _wThumbBuf = nullptr;
}
void RMWindow::copyRectToScreen(const byte *buf, int pitch, int x, int y, int w, int h) {
diff --git a/engines/tony/window.h b/engines/tony/window.h
index 3874652f64..df1932071c 100644
--- a/engines/tony/window.h
+++ b/engines/tony/window.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -72,6 +72,7 @@ public:
* Initialization
*/
void init();
+ void reset();
void close();
/**
diff --git a/engines/toon/anim.cpp b/engines/toon/anim.cpp
index 78d3954325..ec23fea186 100644
--- a/engines/toon/anim.cpp
+++ b/engines/toon/anim.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -41,7 +41,7 @@ bool Animation::loadAnimation(const Common::String &file) {
if (strncmp((char *)fileData, "KevinAguilar", 12))
return false;
- strcpy(_name, file.c_str());
+ Common::strlcpy(_name, file.c_str(), 32);
uint32 headerSize = READ_LE_UINT32(fileData + 16);
uint32 uncompressedBytes = READ_LE_UINT32(fileData + 20);
@@ -52,6 +52,7 @@ bool Animation::loadAnimation(const Common::String &file) {
_x2 = READ_LE_UINT32(fileData + 40);
_y2 = READ_LE_UINT32(fileData + 44);
_paletteEntries = READ_LE_UINT32(fileData + 56);
+ // CHECKME: Useless variable _fps
_fps = READ_LE_UINT32(fileData + 60);
uint32 paletteSize = READ_LE_UINT32(fileData + 64);
@@ -119,6 +120,10 @@ Animation::Animation(ToonEngine *vm) : _vm(vm) {
_palette = NULL;
_numFrames = 0;
_frames = NULL;
+
+ _x1 = _y1 = _x2 = _y2 = 0;
+ _fps = 0;
+ _paletteEntries = 0;
}
Animation::~Animation() {
@@ -448,6 +453,7 @@ AnimationInstance::AnimationInstance(ToonEngine *vm, AnimationInstanceType type)
_y = 0;
_z = 0;
_layerZ = 0;
+ _visible = false;
}
void AnimationInstance::render() {
diff --git a/engines/toon/anim.h b/engines/toon/anim.h
index cd550b2621..ca0d25685b 100644
--- a/engines/toon/anim.h
+++ b/engines/toon/anim.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/toon/audio.cpp b/engines/toon/audio.cpp
index bc0e051057..82544375d5 100644
--- a/engines/toon/audio.cpp
+++ b/engines/toon/audio.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -228,6 +228,7 @@ void AudioManager::stopMusic() {
AudioStreamInstance::AudioStreamInstance(AudioManager *man, Audio::Mixer *mixer, Common::SeekableReadStream *stream , bool looping, bool deleteFileStreamAtEnd) {
_compBufferSize = 0;
_buffer = NULL;
+ _bufferSize = 0;
_bufferMaxSize = 0;
_mixer = mixer;
_compBuffer = NULL;
@@ -255,6 +256,8 @@ AudioStreamInstance::AudioStreamInstance(AudioManager *man, Audio::Mixer *mixer,
} else {
stopNow();
}
+
+ _soundType = Audio::Mixer::kPlainSoundType;
}
AudioStreamInstance::~AudioStreamInstance() {
diff --git a/engines/toon/audio.h b/engines/toon/audio.h
index 25063603eb..afac92d4be 100644
--- a/engines/toon/audio.h
+++ b/engines/toon/audio.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/toon/character.cpp b/engines/toon/character.cpp
index 83c9e3ec70..51e8dee19f 100644
--- a/engines/toon/character.cpp
+++ b/engines/toon/character.cpp
@@ -1,24 +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.
-*
-*/
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public 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/debug.h"
#include "common/system.h"
@@ -65,6 +65,7 @@ Character::Character(ToonEngine *vm) : _vm(vm) {
_numPixelToWalk = 0;
_nextIdleTime = _vm->_system->getMillis() + (_vm->randRange(0, 600) + 300) * _vm->getTickLength();
_lineToSayId = 0;
+ _time = 0;
}
Character::~Character(void) {
@@ -1058,12 +1059,14 @@ void Character::playAnim(int32 animId, int32 unused, int32 flags) {
_specialAnim->loadAnimation(animName);
_animSpecialId = animId;
-
- _animationInstance->setAnimation(_specialAnim);
- _animationInstance->setAnimationRange(0, _specialAnim->_numFrames - 1);
- _animationInstance->reset();
- _animationInstance->stopAnimation();
- _animationInstance->setLooping(false);
+
+ if (_animationInstance) {
+ _animationInstance->setAnimation(_specialAnim);
+ _animationInstance->setAnimationRange(0, _specialAnim->_numFrames - 1);
+ _animationInstance->reset();
+ _animationInstance->stopAnimation();
+ _animationInstance->setLooping(false);
+ }
}
int32 Character::getAnimFlag() {
diff --git a/engines/toon/character.h b/engines/toon/character.h
index b248e7ccf2..1e0ad9c2b7 100644
--- a/engines/toon/character.h
+++ b/engines/toon/character.h
@@ -1,24 +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.
-*
-*/
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public 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 TOON_CHARACTER_H
#define TOON_CHARACTER_H
diff --git a/engines/toon/configure.engine b/engines/toon/configure.engine
new file mode 100644
index 0000000000..00c98f7d8a
--- /dev/null
+++ b/engines/toon/configure.engine
@@ -0,0 +1,3 @@
+# This file is included from the main "configure" script
+# add_engine [name] [desc] [build-by-default] [subengines] [base games] [deps]
+add_engine toon "Toonstruck" yes
diff --git a/engines/toon/console.cpp b/engines/toon/console.cpp
index 18f81e1323..8c01c603fe 100644
--- a/engines/toon/console.cpp
+++ b/engines/toon/console.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/toon/console.h b/engines/toon/console.h
index 25ce7627a1..f545b67404 100644
--- a/engines/toon/console.h
+++ b/engines/toon/console.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/toon/conversation.cpp b/engines/toon/conversation.cpp
index 01ee1efaed..99aa488430 100644
--- a/engines/toon/conversation.cpp
+++ b/engines/toon/conversation.cpp
@@ -1,24 +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.
-*
-*/
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public 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 "toon/conversation.h"
diff --git a/engines/toon/conversation.h b/engines/toon/conversation.h
index 3e459a9734..b03dae606c 100644
--- a/engines/toon/conversation.h
+++ b/engines/toon/conversation.h
@@ -1,24 +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.
-*
-*/
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public 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 TOON_CONVERSATION_H
#define TOON_CONVERSATION_H
diff --git a/engines/toon/detection.cpp b/engines/toon/detection.cpp
index cee7a23796..4f82514213 100644
--- a/engines/toon/detection.cpp
+++ b/engines/toon/detection.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -179,10 +179,9 @@ SaveStateList ToonMetaEngine::listSaves(const char *target) const {
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);
+ int slotNum = atoi(filename->c_str() + filename->size() - 3);
if (slotNum >= 0 && slotNum <= 99) {
Common::InSaveFile *file = saveFileMan->openForLoading(*filename);
diff --git a/engines/toon/drew.cpp b/engines/toon/drew.cpp
index dfd3f515fa..a0569a2d78 100644
--- a/engines/toon/drew.cpp
+++ b/engines/toon/drew.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/toon/drew.h b/engines/toon/drew.h
index ff1b619125..941df473d1 100644
--- a/engines/toon/drew.h
+++ b/engines/toon/drew.h
@@ -1,24 +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.
-*
-*/
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public 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 TOON_DREW_H
#define TOON_DREW_H
diff --git a/engines/toon/flux.cpp b/engines/toon/flux.cpp
index 70aa40fb36..14218ba4ef 100644
--- a/engines/toon/flux.cpp
+++ b/engines/toon/flux.cpp
@@ -1,24 +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.
-*
-*/
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public 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/debug.h"
diff --git a/engines/toon/flux.h b/engines/toon/flux.h
index 1dc0d9c55f..a5778e5466 100644
--- a/engines/toon/flux.h
+++ b/engines/toon/flux.h
@@ -1,24 +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.
-*
-*/
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public 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 TOON_FLUX_H
#define TOON_FLUX_H
diff --git a/engines/toon/font.cpp b/engines/toon/font.cpp
index e26ed92f83..ab941e5de9 100644
--- a/engines/toon/font.cpp
+++ b/engines/toon/font.cpp
@@ -1,24 +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.
-*
-*/
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public 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/debug.h"
#include "common/rect.h"
@@ -32,6 +32,8 @@ FontRenderer::FontRenderer(ToonEngine *vm) : _vm(vm) {
_currentFontColor[1] = 0xc8;
_currentFontColor[2] = 0xcb;
_currentFontColor[3] = 0xce;
+
+ _currentFont = nullptr;
}
FontRenderer::~FontRenderer() {
@@ -195,8 +197,7 @@ void FontRenderer::renderMultiLineText(int16 x, int16 y, const Common::String &o
// divide the text in several lines
// based on number of characters or size of lines.
byte text[1024];
- strncpy((char *)text, origText.c_str(), 1023);
- text[1023] = 0;
+ Common::strlcpy((char *)text, origText.c_str(), 1024);
byte *lines[16];
int32 lineSize[16];
diff --git a/engines/toon/font.h b/engines/toon/font.h
index 2a46ad3559..bbbccd09c8 100644
--- a/engines/toon/font.h
+++ b/engines/toon/font.h
@@ -1,24 +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.
-*
-*/
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public 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 TOON_FONT_H
#define TOON_FONT_H
diff --git a/engines/toon/hotspot.cpp b/engines/toon/hotspot.cpp
index 8b8f0ab577..04368df5ca 100644
--- a/engines/toon/hotspot.cpp
+++ b/engines/toon/hotspot.cpp
@@ -1,24 +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.
-*
-*/
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public 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/debug.h"
diff --git a/engines/toon/hotspot.h b/engines/toon/hotspot.h
index 3852e2e42e..782d06a9fe 100644
--- a/engines/toon/hotspot.h
+++ b/engines/toon/hotspot.h
@@ -1,24 +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.
-*
-*/
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public 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 TOON_HOTSPOT_H
#define TOON_HOTSPOT_H
diff --git a/engines/toon/movie.cpp b/engines/toon/movie.cpp
index f0463a52e1..498e4021e2 100644
--- a/engines/toon/movie.cpp
+++ b/engines/toon/movie.cpp
@@ -1,24 +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.
-*
-*/
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public 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/debug.h"
#include "common/events.h"
@@ -85,7 +85,8 @@ void Movie::play(const Common::String &video, int32 flags) {
_playing = true;
if (flags & 1)
_vm->getAudioManager()->setMusicVolume(0);
- _decoder->loadFile(video.c_str());
+ if (!_decoder->loadFile(video.c_str()))
+ error("Unable to play video %s", video.c_str());
playVideo(isFirstIntroVideo);
_vm->flushPalette(true);
if (flags & 1)
@@ -94,7 +95,7 @@ void Movie::play(const Common::String &video, int32 flags) {
_playing = false;
}
-bool Movie::playVideo(bool isFirstIntroVideo) {
+void Movie::playVideo(bool isFirstIntroVideo) {
debugC(1, kDebugMovie, "playVideo(isFirstIntroVideo: %d)", isFirstIntroVideo);
_decoder->start();
@@ -135,13 +136,13 @@ bool Movie::playVideo(bool isFirstIntroVideo) {
while (_vm->_system->getEventManager()->pollEvent(event))
if ((event.type == Common::EVENT_KEYDOWN && event.kbd.keycode == Common::KEYCODE_ESCAPE)) {
_vm->dirtyAllScreen();
- return false;
+ return;
}
_vm->_system->delayMillis(10);
}
_vm->dirtyAllScreen();
- return !_vm->shouldQuit();
+ return;
}
} // End of namespace Toon
diff --git a/engines/toon/movie.h b/engines/toon/movie.h
index 4dd6583bf6..54d4fd4dc7 100644
--- a/engines/toon/movie.h
+++ b/engines/toon/movie.h
@@ -1,24 +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.
-*
-*/
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public 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 TOON_MOVIE_H
#define TOON_MOVIE_H
@@ -53,9 +53,8 @@ public:
bool isPlaying() { return _playing; }
protected:
- bool playVideo(bool isFirstIntroVideo);
+ void playVideo(bool isFirstIntroVideo);
ToonEngine *_vm;
- Audio::Mixer *_mixer;
ToonstruckSmackerDecoder *_decoder;
bool _playing;
};
diff --git a/engines/toon/path.cpp b/engines/toon/path.cpp
index 7914aed595..fdc35983dc 100644
--- a/engines/toon/path.cpp
+++ b/engines/toon/path.cpp
@@ -1,24 +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.
-*
-*/
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public 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/debug.h"
@@ -152,6 +152,8 @@ PathFinding::PathFinding() {
_heap = new PathFindingHeap();
_sq = NULL;
_numBlockingRects = 0;
+
+ _currentMask = nullptr;
}
PathFinding::~PathFinding(void) {
diff --git a/engines/toon/path.h b/engines/toon/path.h
index 59f74ef286..c69954bded 100644
--- a/engines/toon/path.h
+++ b/engines/toon/path.h
@@ -1,24 +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.
-*
-*/
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public 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 TOON_PATH_H
#define TOON_PATH_H
diff --git a/engines/toon/picture.cpp b/engines/toon/picture.cpp
index 65cc3a70e1..51077c0b17 100644
--- a/engines/toon/picture.cpp
+++ b/engines/toon/picture.cpp
@@ -1,24 +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.
-*
-*/
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public 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 "toon/picture.h"
#include "toon/tools.h"
@@ -134,6 +134,11 @@ bool Picture::loadPicture(const Common::String &file) {
Picture::Picture(ToonEngine *vm) : _vm(vm) {
_data = NULL;
_palette = NULL;
+
+ _width = 0;
+ _height = 0;
+ _paletteEntries = 0;
+ _useFullPalette = false;
}
Picture::~Picture() {
@@ -263,15 +268,14 @@ void Picture::floodFillNotWalkableOnMask(int16 x, int16 y) {
// Stack-based floodFill algorithm based on
// http://student.kuleuven.be/~m0216922/CG/files/floodfill.cpp
Common::Stack<Common::Point> stack;
- bool spanLeft, spanRight;
stack.push(Common::Point(x, y));
while (!stack.empty()) {
Common::Point pt = stack.pop();
while (_data[pt.x + pt.y * _width] & 0x1F && pt.y >= 0)
pt.y--;
pt.y++;
- spanLeft = false;
- spanRight = false;
+ bool spanLeft = false;
+ bool spanRight = false;
while (_data[pt.x + pt.y * _width] & 0x1F && pt.y < _height) {
_data[pt.x + pt.y * _width] &= 0xE0;
if (!spanLeft && pt.x > 0 && _data[pt.x - 1 + pt.y * _width] & 0x1F) {
diff --git a/engines/toon/picture.h b/engines/toon/picture.h
index 5e79612a39..0e853e4ed5 100644
--- a/engines/toon/picture.h
+++ b/engines/toon/picture.h
@@ -1,24 +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.
-*
-*/
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public 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 TOON_PICTURE_H
#define TOON_PICTURE_H
diff --git a/engines/toon/resource.cpp b/engines/toon/resource.cpp
index 2d419ec027..f7c02d5f10 100644
--- a/engines/toon/resource.cpp
+++ b/engines/toon/resource.cpp
@@ -1,24 +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.
-*
-*/
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public 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 "toon/resource.h"
#include "common/debug.h"
@@ -285,6 +285,7 @@ void PakFile::close() {
}
PakFile::PakFile() {
+ _numFiles = 0;
}
PakFile::~PakFile() {
diff --git a/engines/toon/resource.h b/engines/toon/resource.h
index c80ac2216e..6991fae5a7 100644
--- a/engines/toon/resource.h
+++ b/engines/toon/resource.h
@@ -1,24 +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.
-*
-*/
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public 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 TOON_RESOURCE_H
#define TOON_RESOURCE_H
@@ -53,7 +53,6 @@ protected:
uint32 _numFiles;
Common::Array<File> _files;
- Common::File *_fileHandle;
};
class ToonEngine;
diff --git a/engines/toon/script.cpp b/engines/toon/script.cpp
index 69ae727bb5..a99e398200 100644
--- a/engines/toon/script.cpp
+++ b/engines/toon/script.cpp
@@ -1,24 +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.
-*
-*/
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public 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/debug.h"
#include "common/endian.h"
@@ -59,6 +59,8 @@ EMCInterpreter::EMCInterpreter(ToonEngine *vm) : _vm(vm), _scriptData(0), _filen
};
_opcodes = opcodes;
#undef OPCODE
+
+ _parameter = 0;
}
EMCInterpreter::~EMCInterpreter() {
@@ -132,8 +134,7 @@ bool EMCInterpreter::load(const char *filename, EMCData *scriptData, const Commo
_scriptData->sysFuncs = opcodes;
- strncpy(_scriptData->filename, filename, 13);
- _scriptData->filename[12] = 0;
+ Common::strlcpy(_scriptData->filename, filename, 13);
_scriptData = 0;
_filename = 0;
diff --git a/engines/toon/script.h b/engines/toon/script.h
index 8ef085f383..3f1413984d 100644
--- a/engines/toon/script.h
+++ b/engines/toon/script.h
@@ -1,24 +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.
-*
-*/
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public 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 TOON_SCRIPT_H
#define TOON_SCRIPT_H
diff --git a/engines/toon/script_func.cpp b/engines/toon/script_func.cpp
index 1fa4058114..5e8ff09a86 100644
--- a/engines/toon/script_func.cpp
+++ b/engines/toon/script_func.cpp
@@ -1,24 +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.
-*
-*/
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public 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/debug.h"
#include "common/system.h"
@@ -1060,9 +1060,9 @@ int32 ScriptFunc::sys_Cmd_Set_Location_Data(EMCState *state) {
// initial setup of locations
int32 locationId = stackPos(0);
debugC(0, 0, "setlocationdata(%d) %s %x %s %s %d %d", locationId, GetText(1, state), stackPos(2), GetText(3, state), GetText(4, state), stackPos(5), stackPos(6));
- strcpy(_vm->state()->_locations[locationId]._name, GetText(1, state));
- strcpy(_vm->state()->_locations[locationId]._music, GetText(3, state));
- strcpy(_vm->state()->_locations[locationId]._cutaway, GetText(4, state));
+ Common::strlcpy(_vm->state()->_locations[locationId]._name, GetText(1, state), 64);
+ Common::strlcpy(_vm->state()->_locations[locationId]._music, GetText(3, state), 64);
+ Common::strlcpy(_vm->state()->_locations[locationId]._cutaway, GetText(4, state), 64);
_vm->state()->_locations[locationId]._flags = stackPos(2);
_vm->state()->_locations[locationId]._visited = false;
_vm->state()->_locations[locationId]._numSceneAnimations = stackPos(5);
diff --git a/engines/toon/script_func.h b/engines/toon/script_func.h
index e22c4b34fa..bab26d4c28 100644
--- a/engines/toon/script_func.h
+++ b/engines/toon/script_func.h
@@ -1,24 +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.
-*
-*/
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public 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 SCRIPT_FUNC_H
#define SCRIPT_FUNC_H
diff --git a/engines/toon/state.cpp b/engines/toon/state.cpp
index 8e4abbd709..6ac5808219 100644
--- a/engines/toon/state.cpp
+++ b/engines/toon/state.cpp
@@ -1,24 +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.
-*
-*/
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public 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/debug.h"
@@ -115,6 +115,10 @@ State::State(void) {
#endif
memset(_conversationState, 0, sizeof(Conversation) * 60);
+
+ _conversationData = nullptr;
+ _currentConversationId = -1;
+ _exitConversation = true;
}
State::~State(void) {
diff --git a/engines/toon/state.h b/engines/toon/state.h
index 4004b8b4f0..88ec4eb560 100644
--- a/engines/toon/state.h
+++ b/engines/toon/state.h
@@ -1,24 +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.
-*
-*/
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public 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 TOON_STATE_H
#define TOON_STATE_H
diff --git a/engines/toon/text.cpp b/engines/toon/text.cpp
index bd4583d799..75b4d4f021 100644
--- a/engines/toon/text.cpp
+++ b/engines/toon/text.cpp
@@ -1,24 +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.
-*
-*/
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public 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/debug.h"
diff --git a/engines/toon/text.h b/engines/toon/text.h
index cd575736b7..10358a7327 100644
--- a/engines/toon/text.h
+++ b/engines/toon/text.h
@@ -1,24 +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.
-*
-*/
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public 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 TOON_TEXT_H
#define TOON_TEXT_H
diff --git a/engines/toon/tools.cpp b/engines/toon/tools.cpp
index added39940..e224f2708b 100644
--- a/engines/toon/tools.cpp
+++ b/engines/toon/tools.cpp
@@ -1,24 +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.
-*
-*/
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public 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/debug.h"
@@ -136,6 +136,13 @@ uint32 decompressSPCN(byte *src, byte *dst, uint32 dstsize) {
RncDecoder::RncDecoder() {
initCrc();
+
+ _bitBuffl = 0;
+ _bitBuffh = 0;
+ _bitCount = 0;
+ _srcPtr = nullptr;
+ _dstPtr = nullptr;
+ _inputByteLeft = 0;
}
RncDecoder::~RncDecoder() { }
diff --git a/engines/toon/tools.h b/engines/toon/tools.h
index 44c0fc4644..d80ec006b0 100644
--- a/engines/toon/tools.h
+++ b/engines/toon/tools.h
@@ -1,24 +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.
-*
-*/
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public 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 TOON_TOOLS_H
#define TOON_TOOLS_H
diff --git a/engines/toon/toon.cpp b/engines/toon/toon.cpp
index 286bcf1941..14e7d104d2 100644
--- a/engines/toon/toon.cpp
+++ b/engines/toon/toon.cpp
@@ -1,24 +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.
-*
-*/
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public 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/system.h"
#include "common/events.h"
@@ -184,10 +184,10 @@ void ToonEngine::parseInput() {
Common::Event event;
while (_event->pollEvent(event)) {
- bool hasModifier = event.kbd.hasFlags(Common::KBD_ALT|Common::KBD_CTRL|Common::KBD_SHIFT);
+ const bool hasModifier = (event.kbd.flags & Common::KBD_NON_STICKY) != 0;
switch (event.type) {
case Common::EVENT_KEYDOWN:
- if ((event.kbd.ascii == 27 || event.kbd.ascii == 32) && !hasModifier) {
+ if ((event.kbd.keycode == Common::KEYCODE_ESCAPE || event.kbd.keycode == Common::KEYCODE_SPACE) && !hasModifier) {
_audioManager->stopCurrentVoice();
}
if (event.kbd.keycode == Common::KEYCODE_F5 && !hasModifier) {
@@ -198,21 +198,21 @@ void ToonEngine::parseInput() {
if (canLoadGameStateCurrently())
loadGame(-1);
}
- if (event.kbd.ascii == 't' && !hasModifier) {
+ if (event.kbd.keycode == Common::KEYCODE_t && !hasModifier) {
_showConversationText = !_showConversationText;
}
- if (event.kbd.ascii == 'm' && !hasModifier) {
+ if (event.kbd.keycode == Common::KEYCODE_m && !hasModifier) {
_audioManager->muteMusic(!_audioManager->isMusicMuted());
}
- if (event.kbd.ascii == 'd' && !hasModifier) {
+ if (event.kbd.keycode == Common::KEYCODE_d && !hasModifier) {
_audioManager->muteVoice(!_audioManager->isVoiceMuted());
}
- if (event.kbd.ascii == 's' && !hasModifier) {
+ if (event.kbd.keycode == Common::KEYCODE_s && !hasModifier) {
_audioManager->muteSfx(!_audioManager->isSfxMuted());
}
if (event.kbd.flags & Common::KBD_ALT) {
- int slotNum = event.kbd.ascii - '0';
+ int slotNum = event.kbd.keycode - (event.kbd.keycode >= Common::KEYCODE_KP0 ? Common::KEYCODE_KP0 : Common::KEYCODE_0);
if (slotNum >= 0 && slotNum <= 9 && canSaveGameStateCurrently()) {
if (saveGame(slotNum, "")) {
// ok
@@ -229,7 +229,7 @@ void ToonEngine::parseInput() {
}
if (event.kbd.flags & Common::KBD_CTRL) {
- int slotNum = event.kbd.ascii - '0';
+ int slotNum = event.kbd.keycode - (event.kbd.keycode >= Common::KEYCODE_KP0 ? Common::KEYCODE_KP0 : Common::KEYCODE_0);
if (slotNum >= 0 && slotNum <= 9 && canLoadGameStateCurrently()) {
if (loadGame(slotNum)) {
// ok
@@ -634,7 +634,6 @@ bool ToonEngine::showMainmenu(bool &loadedGame) {
bool doExit = false;
bool exitGame = false;
- int clickingOn, clickRelease;
int menuMask = MAINMENUMASK_BASE;
Common::SeekableReadStream *mainmenuMusicFile = NULL;
AudioStreamInstance *mainmenuMusic = NULL;
@@ -644,8 +643,8 @@ bool ToonEngine::showMainmenu(bool &loadedGame) {
dirtyAllScreen();
while (!doExit) {
- clickingOn = MAINMENUHOTSPOT_NONE;
- clickRelease = false;
+ int clickingOn = MAINMENUHOTSPOT_NONE;
+ int clickRelease = false;
if (!musicPlaying) {
mainmenuMusicFile = resources()->openFile("BR091013.MUS");
@@ -922,6 +921,48 @@ ToonEngine::ToonEngine(OSystem *syst, const ADGameDescription *gameDescription)
_gameVariant = 0;
break;
}
+
+ for (int i = 0; i < 64; i++) {
+ _sceneAnimationScripts[i]._lastTimer = 0;
+ _sceneAnimationScripts[i]._frozen = false;
+ _sceneAnimationScripts[i]._frozenForConversation = false;
+ _sceneAnimationScripts[i]._active = false;
+ }
+
+ _lastProcessedSceneScript = 0;
+ _animationSceneScriptRunFlag = false;
+ _updatingSceneScriptRunFlag = false;
+ _dirtyAll = false;
+ _cursorOffsetX = 0;
+ _cursorOffsetY = 0;
+ _currentTextLine = 0;
+ _currentTextLineId = 0;
+ _currentTextLineX = 0;
+ _currentTextLineY = 0;
+ _currentTextLineCharacterId = -1;
+ _oldScrollValue = 0;
+ _drew = nullptr;
+ _flux = nullptr;
+ _currentHotspotItem = 0;
+ _shouldQuit = false;
+ _scriptStep = 0;
+ _oldTimer = 0;
+ _oldTimer2 = 0;
+ _lastRenderTime = 0;
+ _firstFrame = false;
+ _needPaletteFlush = true;
+
+ _numVariant = 0;
+ _currentCutaway = nullptr;
+ for (int i = 0; i < 4; i++) {
+ _scriptState[i].ip = nullptr;
+ _scriptState[i].dataPtr = nullptr;
+ _scriptState[i].retValue = 0;
+ _scriptState[i].bp = 0;
+ _scriptState[i].sp = 0;
+ _scriptState[i].running = false;
+ }
+ _currentScriptRegion = 0;
}
ToonEngine::~ToonEngine() {
@@ -3573,7 +3614,7 @@ int32 ToonEngine::handleInventoryOnInventory(int32 itemDest, int32 itemSrc) {
createMouseItem(21);
rearrangeInventory();
return 1;
- } else if (itemSrc == 0x6b || itemSrc == 0x6c || itemSrc == 0x6f || itemSrc == 108 || itemSrc == 112) {
+ } else if (itemSrc == 0x6b || itemSrc == 0x6c || itemSrc == 0x6f || itemSrc == 0x70) {
sayLines(2, 1292);
return 1;
}
@@ -4575,15 +4616,13 @@ void ToonEngine::unloadToonDat() {
}
char **ToonEngine::loadTextsVariants(Common::File &in) {
- int numTexts;
- int entryLen;
int len;
char **res = 0;
char *pos = 0;
for (int varnt = 0; varnt < _numVariant; varnt++) {
- numTexts = in.readUint16BE();
- entryLen = in.readUint16BE();
+ int numTexts = in.readUint16BE();
+ int entryLen = in.readUint16BE();
pos = (char *)malloc(entryLen);
if (varnt == _gameVariant) {
res = (char **)malloc(sizeof(char *) * numTexts);
diff --git a/engines/toon/toon.h b/engines/toon/toon.h
index 0ff351804f..6903e5de57 100644
--- a/engines/toon/toon.h
+++ b/engines/toon/toon.h
@@ -1,24 +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.
-*
-*/
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public 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 TOON_TOON_H
#define TOON_TOON_H
diff --git a/engines/touche/configure.engine b/engines/touche/configure.engine
new file mode 100644
index 0000000000..777578e623
--- /dev/null
+++ b/engines/touche/configure.engine
@@ -0,0 +1,3 @@
+# This file is included from the main "configure" script
+# add_engine [name] [desc] [build-by-default] [subengines] [base games] [deps]
+add_engine touche "Touche: The Adventures of the Fifth Musketeer" yes
diff --git a/engines/touche/console.cpp b/engines/touche/console.cpp
index 2c4c6a0da1..472863c817 100644
--- a/engines/touche/console.cpp
+++ b/engines/touche/console.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -26,8 +26,8 @@
namespace Touche {
ToucheConsole::ToucheConsole(ToucheEngine *vm) : GUI::Debugger(), _vm(vm) {
- DCmd_Register("startMusic", WRAP_METHOD(ToucheConsole, Cmd_StartMusic));
- DCmd_Register("stopMusic", WRAP_METHOD(ToucheConsole, Cmd_StopMusic));
+ registerCmd("startMusic", WRAP_METHOD(ToucheConsole, Cmd_StartMusic));
+ registerCmd("stopMusic", WRAP_METHOD(ToucheConsole, Cmd_StopMusic));
}
ToucheConsole::~ToucheConsole() {
@@ -35,7 +35,7 @@ ToucheConsole::~ToucheConsole() {
bool ToucheConsole::Cmd_StartMusic(int argc, const char **argv) {
if (argc != 2) {
- DebugPrintf("Usage: startMusic <num>\n");
+ debugPrintf("Usage: startMusic <num>\n");
return true;
}
diff --git a/engines/touche/console.h b/engines/touche/console.h
index 43a303ad77..ed7620a820 100644
--- a/engines/touche/console.h
+++ b/engines/touche/console.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/touche/detection.cpp b/engines/touche/detection.cpp
index 0662e718d5..97a14e5bc1 100644
--- a/engines/touche/detection.cpp
+++ b/engines/touche/detection.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/touche/graphics.cpp b/engines/touche/graphics.cpp
index 6e565327ba..95ef16e9bd 100644
--- a/engines/touche/graphics.cpp
+++ b/engines/touche/graphics.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/touche/graphics.h b/engines/touche/graphics.h
index 5b2ea39a24..3fdbf9b145 100644
--- a/engines/touche/graphics.h
+++ b/engines/touche/graphics.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/touche/menu.cpp b/engines/touche/menu.cpp
index 85ca519f05..b94776eee5 100644
--- a/engines/touche/menu.cpp
+++ b/engines/touche/menu.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -31,96 +31,6 @@
namespace Touche {
-enum ActionId {
- kActionNone,
-
- // settings menu
- kActionLoadMenu,
- kActionSaveMenu,
- kActionRestartGame,
- kActionPlayGame,
- kActionQuitGame,
- kActionTextOnly,
- kActionVoiceOnly,
- kActionTextAndVoice,
- kActionLowerVolume,
- kActionUpperVolume,
-
- // saveLoad menu
- kActionGameState1,
- kActionGameState2,
- kActionGameState3,
- kActionGameState4,
- kActionGameState5,
- kActionGameState6,
- kActionGameState7,
- kActionGameState8,
- kActionGameState9,
- kActionGameState10,
- kActionScrollUpSaves,
- kActionScrollDownSaves,
- kActionPerformSaveLoad,
- kActionCancelSaveLoad
-};
-
-enum MenuMode {
- kMenuSettingsMode = 0,
- kMenuLoadStateMode,
- kMenuSaveStateMode
-};
-
-enum ButtonFlags {
- kButtonBorder = 1 << 0,
- kButtonText = 1 << 1,
- kButtonArrow = 1 << 2
-};
-
-struct Button {
- int x, y;
- int w, h;
- ActionId action;
- int data;
- uint8 flags;
-};
-
-struct MenuData {
- MenuMode mode;
- Button *buttonsTable;
- uint buttonsCount;
- bool quit;
- bool exit;
- char saveLoadDescriptionsTable[kMaxSaveStates][33];
-
- void removeLastCharFromDescription(int slot) {
- char *description = saveLoadDescriptionsTable[slot];
- int descriptionLen = strlen(description);
- if (descriptionLen > 0) {
- --descriptionLen;
- description[descriptionLen] = 0;
- }
- }
-
- void addCharToDescription(int slot, char chr) {
- char *description = saveLoadDescriptionsTable[slot];
- int descriptionLen = strlen(description);
- if (descriptionLen < 32 && Common::isPrint(chr)) {
- description[descriptionLen] = chr;
- description[descriptionLen + 1] = 0;
- }
- }
-
- const Button *findButtonUnderCursor(int cursorX, int cursorY) const {
- for (uint i = 0; i < buttonsCount; ++i) {
- const Button *button = &buttonsTable[i];
- if (cursorX >= button->x && cursorX < button->x + button->w &&
- cursorY >= button->y && cursorY < button->y + button->h) {
- return button;
- }
- }
- return 0;
- }
-};
-
static void drawArrow(uint8 *dst, int dstPitch, int x, int y, int delta, uint8 color) {
static const int8 arrowCoordsTable[7][4] = {
{ 5, 0, 9, 0 },
@@ -140,25 +50,24 @@ static void drawArrow(uint8 *dst, int dstPitch, int x, int y, int delta, uint8 c
}
}
-void ToucheEngine::drawButton(void *button) {
- Button *b = (Button *)button;
- if (b->flags & kButtonBorder) {
- Graphics::drawRect(_offscreenBuffer, kScreenWidth, b->x, b->y, b->w, b->h, 0xF7, 0xF9);
+void ToucheEngine::drawButton(Button *button) {
+ if (button->flags & kButtonBorder) {
+ Graphics::drawRect(_offscreenBuffer, kScreenWidth, button->x, button->y, button->w, button->h, 0xF7, 0xF9);
}
- if (b->flags & kButtonText) {
- if (b->data != 0) {
- const char *str = getString(b->data);
- const int w = getStringWidth(b->data);
+ if (button->flags & kButtonText) {
+ if (button->data != 0) {
+ const char *str = getString(button->data);
+ const int w = getStringWidth(button->data);
const int h = kTextHeight;
- const int x = b->x + (b->w - w) / 2;
- const int y = b->y + (b->h - h) / 2;
+ const int x = button->x + (button->w - w) / 2;
+ const int y = button->y + (button->h - h) / 2;
Graphics::drawString16(_offscreenBuffer, kScreenWidth, 0xFF, x, y, str);
}
}
- if (b->flags & kButtonArrow) {
+ if (button->flags & kButtonArrow) {
int dx = 0;
int dy = 0;
- switch (b->data) {
+ switch (button->data) {
case 2000: // up arrow
dx = 1;
dy = 2;
@@ -168,8 +77,8 @@ void ToucheEngine::drawButton(void *button) {
dy = -2;
break;
}
- const int x = b->x + b->w / 2;
- const int y = b->y + b->h / 2;
+ const int x = button->x + button->w / 2;
+ const int y = button->y + button->h / 2;
drawArrow(_offscreenBuffer, kScreenWidth, x, y + dy + 1, dx, 0xD2);
drawArrow(_offscreenBuffer, kScreenWidth, x, y + dy, dx, 0xFF);
}
@@ -253,49 +162,47 @@ static void setupMenu(MenuMode mode, MenuData *menuData) {
}
}
-void ToucheEngine::redrawMenu(void *menu) {
- MenuData *menuData = (MenuData *)menu;
+void ToucheEngine::redrawMenu(MenuData *menu) {
Graphics::fillRect(_offscreenBuffer, kScreenWidth, 90, 102, 460, 196, 0xF8);
Graphics::drawRect(_offscreenBuffer, kScreenWidth, 90, 102, 460, 196, 0xF7, 0xF9);
Graphics::drawRect(_offscreenBuffer, kScreenWidth, 106, 118, 340, 164, 0xF9, 0xF7);
- switch (menuData->mode) {
+ switch (menu->mode) {
case kMenuSettingsMode:
drawVolumeSlideBar(_offscreenBuffer, kScreenWidth, getMusicVolume());
- menuData->buttonsTable[5].data = 0;
- menuData->buttonsTable[6].data = 0;
- menuData->buttonsTable[7].data = 0;
- menuData->buttonsTable[5 + _talkTextMode].data = -86;
+ menu->buttonsTable[5].data = 0;
+ menu->buttonsTable[6].data = 0;
+ menu->buttonsTable[7].data = 0;
+ menu->buttonsTable[5 + _talkTextMode].data = -86;
break;
case kMenuLoadStateMode:
case kMenuSaveStateMode:
- drawSaveGameStateDescriptions(_offscreenBuffer, kScreenWidth, menuData, _saveLoadCurrentPage, _saveLoadCurrentSlot);
+ drawSaveGameStateDescriptions(_offscreenBuffer, kScreenWidth, menu, _saveLoadCurrentPage, _saveLoadCurrentSlot);
break;
}
- for (uint i = 0; i < menuData->buttonsCount; ++i) {
- drawButton(&menuData->buttonsTable[i]);
+ for (uint i = 0; i < menu->buttonsCount; ++i) {
+ drawButton(&menu->buttonsTable[i]);
}
}
-void ToucheEngine::handleMenuAction(void *menu, int actionId) {
- MenuData *menuData = (MenuData *)menu;
+void ToucheEngine::handleMenuAction(MenuData *menu, int actionId) {
switch (actionId) {
case kActionLoadMenu:
- menuData->mode = kMenuLoadStateMode;
+ menu->mode = kMenuLoadStateMode;
break;
case kActionSaveMenu:
_system->setFeatureState(OSystem::kFeatureVirtualKeyboard, true);
- menuData->mode = kMenuSaveStateMode;
+ menu->mode = kMenuSaveStateMode;
break;
case kActionRestartGame:
restart();
- menuData->quit = true;
+ menu->quit = true;
break;
case kActionPlayGame:
- menuData->quit = true;
+ menu->quit = true;
break;
case kActionQuitGame:
quitGame();
- menuData->quit = true;
+ menu->quit = true;
break;
case kActionTextOnly:
_talkTextMode = kTalkModeTextOnly;
@@ -327,23 +234,23 @@ void ToucheEngine::handleMenuAction(void *menu, int actionId) {
_saveLoadCurrentSlot = _saveLoadCurrentPage * 10 + (_saveLoadCurrentSlot % 10);
break;
case kActionPerformSaveLoad:
- if (menuData->mode == kMenuLoadStateMode) {
+ if (menu->mode == kMenuLoadStateMode) {
if (loadGameState(_saveLoadCurrentSlot).getCode() == Common::kNoError) {
- menuData->quit = true;
+ menu->quit = true;
}
- } else if (menuData->mode == kMenuSaveStateMode) {
+ } else if (menu->mode == kMenuSaveStateMode) {
_system->setFeatureState(OSystem::kFeatureVirtualKeyboard, false);
- const char *description = menuData->saveLoadDescriptionsTable[_saveLoadCurrentSlot];
+ const char *description = menu->saveLoadDescriptionsTable[_saveLoadCurrentSlot];
if (strlen(description) > 0) {
if (saveGameState(_saveLoadCurrentSlot, description).getCode() == Common::kNoError) {
- menuData->quit = true;
+ menu->quit = true;
}
}
}
break;
case kActionCancelSaveLoad:
_system->setFeatureState(OSystem::kFeatureVirtualKeyboard, false);
- menuData->mode = kMenuSettingsMode;
+ menu->mode = kMenuSettingsMode;
break;
default:
if (actionId >= kActionGameState1 && actionId <= kActionGameState10) {
@@ -569,29 +476,29 @@ int ToucheEngine::displayQuitDialog() {
quitLoop = true;
switch (_language) {
case Common::FR_FRA:
- if (event.kbd.ascii == 'o' || event.kbd.ascii == 'O') {
+ if (event.kbd.keycode == Common::KEYCODE_o) {
ret = 1;
}
break;
case Common::DE_DEU:
- if (event.kbd.ascii == 'j' || event.kbd.ascii == 'J') {
+ if (event.kbd.keycode == Common::KEYCODE_j) {
ret = 1;
}
break;
case Common::ES_ESP:
- if (event.kbd.ascii == 's' || event.kbd.ascii == 'S') {
+ if (event.kbd.keycode == Common::KEYCODE_s) {
ret = 1;
}
break;
case Common::PL_POL:
- if (event.kbd.ascii == 's' || event.kbd.ascii == 'S' || event.kbd.ascii == 't' || event.kbd.ascii == 'T') {
+ if (event.kbd.keycode == Common::KEYCODE_s || event.kbd.keycode == Common::KEYCODE_t) {
ret = 1;
}
break;
default:
// According to cyx, the Italian version uses the same
// keys as the English one.
- if (event.kbd.ascii == 'y' || event.kbd.ascii == 'Y') {
+ if (event.kbd.keycode == Common::KEYCODE_y) {
ret = 1;
}
break;
diff --git a/engines/touche/midi.cpp b/engines/touche/midi.cpp
index da14baa484..96813077ce 100644
--- a/engines/touche/midi.cpp
+++ b/engines/touche/midi.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/touche/midi.h b/engines/touche/midi.h
index 24f9da0474..e54d43209c 100644
--- a/engines/touche/midi.h
+++ b/engines/touche/midi.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/touche/opcodes.cpp b/engines/touche/opcodes.cpp
index 18677eae26..ee7f3a9b6b 100644
--- a/engines/touche/opcodes.cpp
+++ b/engines/touche/opcodes.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/touche/resource.cpp b/engines/touche/resource.cpp
index 9625224316..467d2bed90 100644
--- a/engines/touche/resource.cpp
+++ b/engines/touche/resource.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -150,38 +150,38 @@ void ToucheEngine::res_allocateTables() {
void ToucheEngine::res_deallocateTables() {
free(_textData);
- _textData = 0;
+ _textData = nullptr;
free(_backdropBuffer);
- _backdropBuffer = 0;
+ _backdropBuffer = nullptr;
free(_menuKitData);
- _menuKitData = 0;
+ _menuKitData = nullptr;
free(_convKitData);
- _convKitData = 0;
+ _convKitData = nullptr;
for (int i = 0; i < NUM_SEQUENCES; ++i) {
free(_sequenceDataTable[i]);
- _sequenceDataTable[i] = 0;
+ _sequenceDataTable[i] = nullptr;
}
free(_programData);
- _programData = 0;
+ _programData = nullptr;
free(_mouseData);
- _mouseData = 0;
+ _mouseData = nullptr;
free(_iconData);
- _iconData = 0;
+ _iconData = nullptr;
for (int i = 0; i < NUM_SPRITES; ++i) {
free(_spritesTable[i].ptr);
- _spritesTable[i].ptr = 0;
+ _spritesTable[i].ptr = nullptr;
}
free(_offscreenBuffer);
- _offscreenBuffer = 0;
+ _offscreenBuffer = nullptr;
}
uint32 ToucheEngine::res_getDataOffset(ResourceType type, int num, uint32 *size) {
diff --git a/engines/touche/saveload.cpp b/engines/touche/saveload.cpp
index a054299ecd..d44a3d43ff 100644
--- a/engines/touche/saveload.cpp
+++ b/engines/touche/saveload.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/touche/staticres.cpp b/engines/touche/staticres.cpp
index 23b76558e4..d2359dd130 100644
--- a/engines/touche/staticres.cpp
+++ b/engines/touche/staticres.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/touche/touche.cpp b/engines/touche/touche.cpp
index 5c133ccbc6..ff4f41f44d 100644
--- a/engines/touche/touche.cpp
+++ b/engines/touche/touche.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -46,11 +46,33 @@
namespace Touche {
ToucheEngine::ToucheEngine(OSystem *system, Common::Language language)
- : Engine(system), _midiPlayer(0), _language(language), _rnd("touche") {
+ : Engine(system), _midiPlayer(nullptr), _language(language), _rnd("touche") {
_saveLoadCurrentPage = 0;
_saveLoadCurrentSlot = 0;
_hideInventoryTexts = false;
+ _numOpcodes = 0;
+ _compressedSpeechData = 0;
+ _textData = nullptr;
+ _backdropBuffer = nullptr;
+ _menuKitData = nullptr;
+ _convKitData = nullptr;
+
+ for (int i = 0; i < NUM_SEQUENCES; i++)
+ _sequenceDataTable[i] = nullptr;
+
+ _programData = nullptr;
+ _programDataSize = 0;
+ _mouseData = nullptr;
+ _iconData = nullptr;
+ _currentBitmapWidth = 0;
+ _currentBitmapHeight = 0;
+ _currentImageWidth = 0;
+ _currentImageHeight = 0;
+ _roomWidth = 0;
+ _programTextDataPtr = nullptr;
+ _offscreenBuffer = nullptr;
+
_screenRect = Common::Rect(kScreenWidth, kScreenHeight);
_roomAreaRect = Common::Rect(kScreenWidth, kRoomHeight);
@@ -88,6 +110,83 @@ ToucheEngine::ToucheEngine(OSystem *system, Common::Language language)
DebugMan.addDebugChannel(kDebugCharset, "Charset", "Charset debug level");
_console = new ToucheConsole(this);
+
+ _newEpisodeNum = 0;
+ _currentEpisodeNum = 0;
+ _currentAmountOfMoney = 0;
+ _giveItemToKeyCharNum = 0;
+ _giveItemToObjectNum = 0;
+ _giveItemToCounter = 0;
+ _currentRoomNum = 0;
+ _waitingSetKeyCharNum1 = 0;
+ _waitingSetKeyCharNum2 = 0;
+ _waitingSetKeyCharNum3 = 0;
+ _script.opcodeNum = 0;
+ _script.dataOffset = 0;
+ _script.keyCharNum = 0;
+ _script.dataPtr = nullptr;
+ _script.stackDataPtr = nullptr;
+ _script.stackDataBasePtr = nullptr;
+ _script.quitFlag = 0;
+ _opcodesTable = nullptr;
+
+ for (uint i = 0; i < NUM_SPRITES; i++)
+ memset(&_spritesTable[i], 0, sizeof(SpriteData));
+
+ for (uint i = 0; i < NUM_SEQUENCES; i++)
+ memset(&_sequenceEntryTable[i], 0, sizeof(SequenceEntry));
+
+ _talkListEnd = 0;
+ _talkListCurrent = 0;
+ _talkTextRectDefined = false;
+ _talkTextDisplayed = false;
+ _talkTextInitialized = false;
+ _skipTalkText = false;
+ _talkTextSpeed = 0;
+ _keyCharTalkCounter = 0;
+ _talkTableLastTalkingKeyChar = 0;
+ _talkTableLastOtherKeyChar = 0;
+ _talkTableLastStringNum = 0;
+
+ for (uint i = 0; i < NUM_TALK_ENTRIES; i++)
+ memset(&_talkTable[i], 0, sizeof(TalkEntry));
+
+ _conversationChoicesUpdated = false;
+ _conversationReplyNum = 0;
+ _conversationEnded = false;
+ _conversationNum = 0;
+ _scrollConversationChoiceOffset = 0;
+ _currentConversation = 0;
+ _disableConversationScript = false;
+ _conversationAreaCleared = false;
+
+ for (uint i = 0; i < NUM_CONVERSATION_CHOICES; i++)
+ memset(&_conversationChoicesTable[i], 0, sizeof(ConversationChoice));
+
+ for (uint i = 0; i < NUM_KEYCHARS; i++)
+ _sortedKeyCharsTable[i] = 0;
+
+ _currentKeyCharNum = 0;
+ _inp_leftMouseButtonPressed = false;
+ _inp_rightMouseButtonPressed = false;
+ _disabledInputCounter = 0;
+ _gameState = kGameStateNone;
+ _displayQuitDialog = false;
+ _newMusicNum = 0;
+ _currentMusicNum = 0;
+ _newSoundNum = 0;
+ _newSoundDelay = 0;
+ _newSoundPriority = 0;
+ for (int i = 0; i < 3; ++i) {
+ _inventoryStateTable[i].displayOffset = 0;
+ _inventoryStateTable[i].lastItem = 0;
+ _inventoryStateTable[i].itemsPerLine = 0;
+ _inventoryStateTable[i].itemsList = nullptr;
+ }
+ _inventoryVar1 = nullptr;
+ _inventoryVar2 = nullptr;
+ _currentCursorObject = 0;
+ _talkTextMode = 0;
}
ToucheEngine::~ToucheEngine() {
@@ -337,13 +436,13 @@ void ToucheEngine::processEvents(bool handleKeyEvents) {
this->getDebugger()->onFrame();
}
} else {
- if (event.kbd.ascii == 't') {
+ if (event.kbd.keycode == Common::KEYCODE_t) {
++_talkTextMode;
if (_talkTextMode == kTalkModeCount) {
_talkTextMode = 0;
}
displayTextMode(-(92 + _talkTextMode));
- } else if (event.kbd.ascii == ' ') {
+ } else if (event.kbd.keycode == Common::KEYCODE_SPACE) {
updateKeyCharTalk(2);
}
}
@@ -3015,12 +3114,12 @@ void ToucheEngine::buildWalkPath(int dstPosX, int dstPosY, int keyChar) {
for (uint i = 0; i < _programWalkTable.size(); ++i) {
const ProgramWalkData *pwd = &_programWalkTable[i];
if ((pwd->point1 & 0x4000) == 0) {
- int distance = 32000;
ProgramPointData *pts1 = &_programPointsTable[pwd->point1];
ProgramPointData *pts2 = &_programPointsTable[pwd->point2];
if (pts1->order != 0) {
int dx = pts2->x - pts1->x;
int dy = pts2->y - pts1->y;
+ int distance = 32000;
if (dx == 0) {
if (dstPosY > MIN(pts2->y, pts1->y) && dstPosY < MAX(pts2->y, pts1->y)) {
int d = ABS(dstPosX - pts1->x);
diff --git a/engines/touche/touche.h b/engines/touche/touche.h
index 6ac43e7dfe..20bf723553 100644
--- a/engines/touche/touche.h
+++ b/engines/touche/touche.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -102,7 +102,7 @@ struct KeyChar {
int16 zPosPrev;
int16 prevWalkDataNum;
uint16 textColor;
- int16 inventoryItems[4];
+ int16 inventoryItems[5];
int16 money;
int16 pointsDataNum;
int16 currentWalkBox;
@@ -346,16 +346,108 @@ enum StringType {
kStringTypeConversation
};
-void readGameStateDescription(Common::ReadStream *f, char *description, int len);
-Common::String generateGameStateFileName(const char *target, int slot, bool prefixOnly = false);
-int getGameStateFileSlot(const char *filename);
-
enum GameState {
kGameStateGameLoop,
kGameStateOptionsDialog,
- kGameStateQuitDialog
+ kGameStateQuitDialog,
+ kGameStateNone
+};
+
+enum ActionId {
+ kActionNone,
+
+ // settings menu
+ kActionLoadMenu,
+ kActionSaveMenu,
+ kActionRestartGame,
+ kActionPlayGame,
+ kActionQuitGame,
+ kActionTextOnly,
+ kActionVoiceOnly,
+ kActionTextAndVoice,
+ kActionLowerVolume,
+ kActionUpperVolume,
+
+ // saveLoad menu
+ kActionGameState1,
+ kActionGameState2,
+ kActionGameState3,
+ kActionGameState4,
+ kActionGameState5,
+ kActionGameState6,
+ kActionGameState7,
+ kActionGameState8,
+ kActionGameState9,
+ kActionGameState10,
+ kActionScrollUpSaves,
+ kActionScrollDownSaves,
+ kActionPerformSaveLoad,
+ kActionCancelSaveLoad
+};
+
+enum MenuMode {
+ kMenuSettingsMode = 0,
+ kMenuLoadStateMode,
+ kMenuSaveStateMode
+};
+
+enum ButtonFlags {
+ kButtonBorder = 1 << 0,
+ kButtonText = 1 << 1,
+ kButtonArrow = 1 << 2
+};
+
+struct Button {
+ int x, y;
+ int w, h;
+ ActionId action;
+ int data;
+ uint8 flags;
};
+struct MenuData {
+ MenuMode mode;
+ Button *buttonsTable;
+ uint buttonsCount;
+ bool quit;
+ bool exit;
+ char saveLoadDescriptionsTable[kMaxSaveStates][33];
+
+ void removeLastCharFromDescription(int slot) {
+ char *description = saveLoadDescriptionsTable[slot];
+ int descriptionLen = strlen(description);
+ if (descriptionLen > 0) {
+ --descriptionLen;
+ description[descriptionLen] = 0;
+ }
+ }
+
+ void addCharToDescription(int slot, char chr) {
+ char *description = saveLoadDescriptionsTable[slot];
+ int descriptionLen = strlen(description);
+ if (descriptionLen < 32 && Common::isPrint(chr)) {
+ description[descriptionLen] = chr;
+ description[descriptionLen + 1] = 0;
+ }
+ }
+
+ const Button *findButtonUnderCursor(int cursorX, int cursorY) const {
+ for (uint i = 0; i < buttonsCount; ++i) {
+ const Button *button = &buttonsTable[i];
+ if (cursorX >= button->x && cursorX < button->x + button->w &&
+ cursorY >= button->y && cursorY < button->y + button->h) {
+ return button;
+ }
+ }
+ return 0;
+ }
+};
+
+
+void readGameStateDescription(Common::ReadStream *f, char *description, int len);
+Common::String generateGameStateFileName(const char *target, int slot, bool prefixOnly = false);
+int getGameStateFileSlot(const char *filename);
+
class MidiPlayer;
class ToucheEngine: public Engine {
@@ -631,9 +723,9 @@ protected:
void res_loadSpeechSegment(int num);
void res_stopSpeech();
- void drawButton(void *button);
- void redrawMenu(void *menu);
- void handleMenuAction(void *menu, int actionId);
+ void drawButton(Button *button);
+ void redrawMenu(MenuData *menu);
+ void handleMenuAction(MenuData *menu, int actionId);
void handleOptions(int forceDisplay);
void drawActionsPanel(int dstX, int dstY, int deltaX, int deltaY);
void drawConversationPanelBorder(int dstY, int srcX, int srcY);
diff --git a/engines/tsage/blue_force/blueforce_dialogs.cpp b/engines/tsage/blue_force/blueforce_dialogs.cpp
index 23701c9e5b..2f337ac549 100644
--- a/engines/tsage/blue_force/blueforce_dialogs.cpp
+++ b/engines/tsage/blue_force/blueforce_dialogs.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope 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.
diff --git a/engines/tsage/blue_force/blueforce_dialogs.h b/engines/tsage/blue_force/blueforce_dialogs.h
index 76de7d19d9..77017db9d0 100644
--- a/engines/tsage/blue_force/blueforce_dialogs.h
+++ b/engines/tsage/blue_force/blueforce_dialogs.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope 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.
diff --git a/engines/tsage/blue_force/blueforce_logic.cpp b/engines/tsage/blue_force/blueforce_logic.cpp
index 63f84d25e1..e6e71399dc 100644
--- a/engines/tsage/blue_force/blueforce_logic.cpp
+++ b/engines/tsage/blue_force/blueforce_logic.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope 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.
@@ -454,9 +454,10 @@ void Timer::dispatch() {
if (_endFrame) {
uint32 frameNumber = BF_GLOBALS._events.getFrameNumber();
- if (frameNumber > _endFrame)
+ if (frameNumber > _endFrame) {
// Timer has expired
signal();
+ }
}
}
@@ -472,7 +473,8 @@ void Timer::set(uint32 delay, EventHandler *endHandler) {
/*--------------------------------------------------------------------------*/
TimerExt::TimerExt(): Timer() {
- _action = NULL;
+ _action = nullptr;
+ _newAction = nullptr;
}
void TimerExt::set(uint32 delay, EventHandler *endHandler, Action *newAction) {
@@ -646,8 +648,6 @@ void FocusObject::postInit(SceneObjectList *OwnerList) {
_lookLineNum = 43;
_talkLineNum = 44;
_useLineNum = -1;
- _v90 = 0;
- _v92 = 1;
SceneExt *scene = (SceneExt *)BF_GLOBALS._sceneManager._scene;
scene->_focusObject = this;
@@ -656,8 +656,11 @@ void FocusObject::postInit(SceneObjectList *OwnerList) {
void FocusObject::synchronize(Serializer &s) {
NamedObject::synchronize(s);
- s.syncAsSint16LE(_v90);
- s.syncAsSint16LE(_v92);
+ if (s.getVersion() < 12) {
+ int useless = 0;
+ s.syncAsSint16LE(useless);
+ s.syncAsSint16LE(useless);
+ }
}
void FocusObject::remove() {
@@ -703,7 +706,6 @@ SceneExt::SceneExt(): Scene() {
_stripManager._onBegin = SceneExt::startStrip;
_stripManager._onEnd = SceneExt::endStrip;
- _field372 = _field37A = 0;
_savedPlayerEnabled = false;
_savedUiEnabled = false;
_savedCanWalk = false;
@@ -746,6 +748,7 @@ void SceneExt::process(Event &event) {
void SceneExt::dispatch() {
_timerList.dispatch();
+ /*
if (_field37A) {
if ((--_field37A == 0) && BF_GLOBALS._dayNumber) {
if (T2_GLOBALS._uiElements._active && BF_GLOBALS._player._enabled) {
@@ -755,6 +758,7 @@ void SceneExt::dispatch() {
_field37A = 0;
}
}
+ */
Scene::dispatch();
}
@@ -762,8 +766,6 @@ void SceneExt::dispatch() {
void SceneExt::loadScene(int sceneNum) {
Scene::loadScene(sceneNum);
- _v51C34.top = 0;
- _v51C34.bottom = 300;
BF_GLOBALS._sceneHandler->_delayTicks = 1;
}
@@ -831,7 +833,6 @@ void SceneExt::gunDisplay() {
void SceneExt::startStrip() {
SceneExt *scene = (SceneExt *)BF_GLOBALS._sceneManager._scene;
- scene->_field372 = 1;
scene->_savedPlayerEnabled = BF_GLOBALS._player._enabled;
if (scene->_savedPlayerEnabled) {
@@ -839,21 +840,20 @@ void SceneExt::startStrip() {
scene->_savedCanWalk = BF_GLOBALS._player._canWalk;
BF_GLOBALS._player.disableControl();
- if (!BF_GLOBALS._v50696 && T2_GLOBALS._uiElements._active)
+ if (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)
+ if (T2_GLOBALS._uiElements._active)
T2_GLOBALS._uiElements.show();
}
}
@@ -865,38 +865,34 @@ void SceneExt::clearScreen() {
/*--------------------------------------------------------------------------*/
PalettedScene::PalettedScene(): SceneExt() {
- _field794 = 0;
+ _hasFader = false;
}
void PalettedScene::synchronize(Serializer &s) {
SceneExt::synchronize(s);
- s.syncAsSint16LE(_field794);
+ s.syncAsSint16LE(_hasFader);
}
void PalettedScene::postInit(SceneObjectList *OwnerList) {
- _field794 = 0;
- _palette._field412 = 1;
+ _hasFader = false;
SceneExt::postInit(OwnerList);
}
void PalettedScene::remove() {
SceneExt::remove();
- if (_field794 == 1) {
+ if (_hasFader) {
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;
+ _hasFader = true;
return BF_GLOBALS._scenePalette.addFader(arrBufferRGB, 1, step, action);
}
@@ -909,6 +905,7 @@ void PalettedScene::add2Faders(const byte *arrBufferRGB, int step, int paletteNu
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];
+ memset(tmpPalette, 0, 768);
_palette.loadPalette(paletteNum);
_palette.loadPalette(2);
@@ -1260,8 +1257,6 @@ void BlueForceInvObjectList::alterInventory(int mode) {
setObjectScene(INV_TICKET_BOOK, 60);
setObjectScene(INV_MIRANDA_CARD, 60);
- BF_GLOBALS._v4CEC4 = 0;
-
switch (mode) {
case 2:
if (hasPrintout)
diff --git a/engines/tsage/blue_force/blueforce_logic.h b/engines/tsage/blue_force/blueforce_logic.h
index 59bc2b7a51..cb3c62dd3a 100644
--- a/engines/tsage/blue_force/blueforce_logic.h
+++ b/engines/tsage/blue_force/blueforce_logic.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope 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.
@@ -139,14 +139,17 @@ public:
class NamedObject2: public NamedObject {
public:
- int _v1, _v2;
+ int _talkCount;
- NamedObject2() { _v1 = _v2 = 0; }
+ NamedObject2() { _talkCount = 0; }
virtual Common::String getClassName() { return "NamedObject2"; }
virtual void synchronize(Serializer &s) {
NamedObject::synchronize(s);
- s.syncAsSint16LE(_v1);
- s.syncAsSint16LE(_v2);
+ if (s.getVersion() < 12) {
+ int useless = 0;
+ s.syncAsSint16LE(useless);
+ }
+ s.syncAsSint16LE(_talkCount);
}
};
@@ -177,7 +180,6 @@ public:
class FocusObject: public NamedObject {
public:
- int _v90, _v92;
GfxSurface _img;
FocusObject();
@@ -196,16 +198,12 @@ private:
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();
@@ -228,7 +226,7 @@ public:
class PalettedScene: public SceneExt {
public:
ScenePalette _palette;
- int _field794;
+ bool _hasFader;
public:
PalettedScene();
diff --git a/engines/tsage/blue_force/blueforce_scenes0.cpp b/engines/tsage/blue_force/blueforce_scenes0.cpp
index f1f00599e0..1e94e44b74 100644
--- a/engines/tsage/blue_force/blueforce_scenes0.cpp
+++ b/engines/tsage/blue_force/blueforce_scenes0.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope 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.
@@ -343,7 +343,7 @@ void Scene50::synchronize(Serializer &s) {
void Scene50::postInit(SceneObjectList *OwnerList) {
SceneExt::postInit();
- BF_GLOBALS._interfaceY = 200;
+ BF_GLOBALS._interfaceY = SCREEN_HEIGHT;
T2_GLOBALS._uiElements._active = false;
BF_GLOBALS._player.postInit();
BF_GLOBALS._player.setVisage(830);
@@ -419,6 +419,8 @@ void Scene50::postInit(SceneObjectList *OwnerList) {
tooltip = &_location8;
xp = 75;
break;
+ default:
+ error("Unexpected tooltip value %d", selectedTooltip);
}
_timer.set(240, this);
@@ -940,7 +942,6 @@ void Scene60::Action3::signal() {
scene->_stripManager.start(71, this);
break;
case 2:
- scene->_field1222 = true;
BF_GLOBALS._player.enableControl();
remove();
break;
@@ -954,7 +955,6 @@ Scene60::Scene60(): SceneExt() {
_sceneNumber = 0;
_visage = 0;
_cursorId = CURSOR_NONE;
- _field1222 = false;
}
void Scene60::synchronize(Serializer &s) {
@@ -964,7 +964,10 @@ void Scene60::synchronize(Serializer &s) {
s.syncAsSint16LE(_sceneNumber);
s.syncAsSint16LE(_visage);
s.syncAsSint16LE(_cursorId);
- s.syncAsSint16LE(_field1222);
+ if (s.getVersion() < 11) {
+ int useless = 0;
+ s.syncAsSint16LE(useless);
+ }
}
void Scene60::postInit(SceneObjectList *OwnerList) {
diff --git a/engines/tsage/blue_force/blueforce_scenes0.h b/engines/tsage/blue_force/blueforce_scenes0.h
index dd502c5f30..c6f380338d 100644
--- a/engines/tsage/blue_force/blueforce_scenes0.h
+++ b/engines/tsage/blue_force/blueforce_scenes0.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope 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.
@@ -174,8 +174,6 @@ public:
int _sceneNumber;
int _visage;
CursorType _cursorId;
- // TODO: Check if really useless in original
- bool _field1222;
Scene60();
virtual void synchronize(Serializer &s);
diff --git a/engines/tsage/blue_force/blueforce_scenes1.cpp b/engines/tsage/blue_force/blueforce_scenes1.cpp
index d26e34ae23..1cbebd140e 100644
--- a/engines/tsage/blue_force/blueforce_scenes1.cpp
+++ b/engines/tsage/blue_force/blueforce_scenes1.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope 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.
@@ -176,7 +176,6 @@ void Scene100::postInit(SceneObjectList *OwnerList) {
loadScene(101);
}
BF_GLOBALS._scenePalette.loadPalette(2);
- BF_GLOBALS._v51C44 = 1;
BF_GLOBALS._interfaceY = SCREEN_HEIGHT;
g_globals->_player.postInit();
@@ -232,7 +231,6 @@ void Scene109::Action1::signal() {
scene->_text.setup(BF_19840515, this);
break;
case 3:
- BF_GLOBALS._v51C44 = 1;
scene->loadScene(115);
scene->_protaginist2.show();
@@ -246,7 +244,6 @@ void Scene109::Action1::signal() {
scene->_beerSign.show();
scene->_beerSign.setAction(&scene->_action2);
- BF_GLOBALS._v501FC = 170;
setDelay(60);
break;
case 4:
@@ -401,12 +398,10 @@ void Scene110::Action1::signal() {
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: {
@@ -1833,8 +1828,6 @@ void Scene125::Action2::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);
@@ -2311,7 +2304,6 @@ void Scene140::Action1::signal() {
setDelay(60);
// No break on purpose
case 13:
- BF_GLOBALS._v51C44 = 1;
BF_GLOBALS._sceneManager.changeScene(150);
default:
break;
@@ -2337,9 +2329,6 @@ void Scene140::postInit(SceneObjectList *OwnerList) {
_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);
@@ -2640,7 +2629,6 @@ void Scene160::Action2::signal() {
BF_GLOBALS._sound1.stop();
// End of hack
- BF_GLOBALS._v51C44 = 1;
BF_GLOBALS._sceneManager.changeScene(200);
break;
default:
@@ -2788,9 +2776,6 @@ void Scene180::postInit(SceneObjectList *OwnerList) {
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);
@@ -2799,9 +2784,6 @@ void Scene180::postInit(SceneObjectList *OwnerList) {
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);
diff --git a/engines/tsage/blue_force/blueforce_scenes1.h b/engines/tsage/blue_force/blueforce_scenes1.h
index ddde200370..8b65c97bb2 100644
--- a/engines/tsage/blue_force/blueforce_scenes1.h
+++ b/engines/tsage/blue_force/blueforce_scenes1.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope 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.
diff --git a/engines/tsage/blue_force/blueforce_scenes2.cpp b/engines/tsage/blue_force/blueforce_scenes2.cpp
index c992afe620..65ff85155f 100644
--- a/engines/tsage/blue_force/blueforce_scenes2.cpp
+++ b/engines/tsage/blue_force/blueforce_scenes2.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope 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.
@@ -1603,7 +1603,6 @@ void Scene271::signal() {
}
break;
case 12:
- BF_GLOBALS._v51C44 = 0;
BF_GLOBALS._sound1.changeSound(67);
BF_GLOBALS._sceneManager.changeScene(280);
break;
@@ -1617,7 +1616,6 @@ void Scene271::signal() {
_field2E16 = 1;
break;
case 2704:
- BF_GLOBALS._v51C44 = 1;
BF_GLOBALS._sound1.fadeOut2(NULL);
BF_GLOBALS._sceneManager.changeScene(690);
break;
@@ -1649,7 +1647,6 @@ void Scene271::signal() {
addFader((const byte *)&black, 2, this);
break;
case 2712:
- BF_GLOBALS._v51C44 = 1;
BF_GLOBALS._sound1.fadeOut2(NULL);
BF_GLOBALS._sceneManager.changeScene(180);
break;
@@ -1657,7 +1654,6 @@ void Scene271::signal() {
BF_GLOBALS._player.enableControl();
break;
case 2714:
- BF_GLOBALS._v51C44 = 1;
BF_GLOBALS._sceneManager.changeScene(560);
break;
case 2715:
@@ -1752,7 +1748,7 @@ void Scene280::Action1::signal() {
case 1:
scene->_jake.setStrip(2);
scene->_jake.setFrame(1);
- scene->_jake.animate(ANIM_MODE_8, NULL);
+ scene->_jake.animate(ANIM_MODE_8, 0, NULL);
scene->_jake._numFrames = 5;
scene->_stripManager.start(2800, this);
diff --git a/engines/tsage/blue_force/blueforce_scenes2.h b/engines/tsage/blue_force/blueforce_scenes2.h
index 17e749d7a1..6ae324517a 100644
--- a/engines/tsage/blue_force/blueforce_scenes2.h
+++ b/engines/tsage/blue_force/blueforce_scenes2.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope 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.
diff --git a/engines/tsage/blue_force/blueforce_scenes3.cpp b/engines/tsage/blue_force/blueforce_scenes3.cpp
index 81e4af6e97..0f7324f5c8 100644
--- a/engines/tsage/blue_force/blueforce_scenes3.cpp
+++ b/engines/tsage/blue_force/blueforce_scenes3.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope 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.
@@ -564,7 +564,6 @@ void Scene300::dispatch() {
if ((BF_GLOBALS._player._position.y < 59) && (BF_GLOBALS._player._position.x > 137) &&
(_sceneMode != 6308) && (_sceneMode != 7308)) {
- // The original was setting a useless global variable (removed)
_sceneMode = 6308;
BF_GLOBALS._player.disableControl();
ADD_MOVER(BF_GLOBALS._player, BF_GLOBALS._player._position.x + 20,
@@ -967,7 +966,6 @@ void Scene315::Action1::signal() {
/*--------------------------------------------------------------------------*/
Scene315::Scene315() {
- BF_GLOBALS._v51C44 = 1;
_field1B6C = _field139C = 0;
if (BF_GLOBALS._dayNumber == 0)
BF_GLOBALS._dayNumber = 1;
@@ -977,12 +975,19 @@ Scene315::Scene315() {
_doorOpened = false;
_invGreenCount = _bookGreenCount = 0;
_invGangCount = _bookGangCount = 0;
+
+ _stripNumber = 0;
+ _field1398 = 0;
+ _currentCursor = INV_NONE;
}
void Scene315::synchronize(Serializer &s) {
SceneExt::synchronize(s);
- s.syncAsSint16LE(_field1390);
+ if (s.getVersion() < 11) {
+ int useless = 0;
+ s.syncAsSint16LE(useless);
+ }
s.syncAsSint16LE(_stripNumber);
s.syncAsSint16LE(_field1398);
s.syncAsSint16LE(_invGreenCount);
@@ -1399,7 +1404,7 @@ bool Scene325::Item1::startAction(CursorType action, Event &event) {
void Scene325::postInit(SceneObjectList *OwnerList) {
SceneExt::postInit();
loadScene(325);
- BF_GLOBALS._interfaceY = 200;
+ BF_GLOBALS._interfaceY = SCREEN_HEIGHT;
BF_GLOBALS.clearFlag(fCanDrawGun);
if (BF_GLOBALS._dayNumber == 0)
@@ -1973,12 +1978,7 @@ void Scene340::Action8::signal() {
setDelay(6);
break;
- case 4:
- remove();
- break;
default:
- // This is present in the original game
- warning("Bugs");
remove();
break;
}
@@ -2868,9 +2868,9 @@ void Scene350::checkGun() {
void Scene355::Doorway::synchronize(Serializer &s) {
NamedObject::synchronize(s);
- s.syncAsSint16LE(_v1);
- s.syncAsSint16LE(_v2);
- s.syncAsSint16LE(_v3);
+ s.syncAsSint16LE(_mode1356Count);
+ s.syncAsSint16LE(_talkCount);
+ s.syncAsSint16LE(_onDuty);
}
bool Scene355::Doorway::startAction(CursorType action, Event &event) {
@@ -2890,9 +2890,9 @@ bool Scene355::Doorway::startAction(CursorType action, Event &event) {
return true;
case CURSOR_TALK:
if (BF_GLOBALS._dayNumber >= 5) {
- switch (_v2) {
+ switch (_talkCount) {
case 0:
- ++_v2;
+ ++_talkCount;
BF_GLOBALS._sound1.play(109);
BF_GLOBALS._player.disableControl();
scene->_sceneMode = 0;
@@ -2920,7 +2920,7 @@ bool Scene355::Doorway::startAction(CursorType action, Event &event) {
BF_GLOBALS._player.disableControl();
scene->_sceneMode = 3562;
scene->setAction(&scene->_sequenceManager, scene, 3562, &BF_GLOBALS._player, NULL);
- _v3 = !_v3 ? 1 : 0;
+ _onDuty = !_onDuty;
return true;
default:
break;
@@ -3355,14 +3355,14 @@ bool Scene355::Item11::startAction(CursorType action, Event &event) {
return true;
case CURSOR_TALK:
if (BF_GLOBALS._dayNumber == 5) {
- switch (scene->_doorway._v2) {
+ switch (scene->_doorway._talkCount) {
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;
+ scene->_doorway._talkCount = 1;
break;
case 1:
BF_GLOBALS._player.disableControl();
@@ -3534,28 +3534,28 @@ void Scene355::postInit(SceneObjectList *OwnerList) {
_doorway.setVisage(355);
_doorway.setPosition(Common::Point(193, 105));
_doorway.fixPriority(18);
- _doorway._v1 = 0;
- _doorway._v3 = 0;
+ _doorway._mode1356Count = 0;
+ _doorway._onDuty = false;
BF_GLOBALS._sceneItems.push_back(&_doorway);
switch (BF_GLOBALS._dayNumber) {
case 1:
if (!BF_GLOBALS.getFlag(onDuty))
- _doorway._v3 = 1;
+ _doorway._onDuty = true;
else if (BF_INVENTORY.getObjectScene(INV_GREENS_GUN) == 320)
- _doorway._v3 = 1;
+ _doorway._onDuty = true;
break;
case 2:
case 3:
case 4:
- _doorway._v3 = 1;
+ _doorway._onDuty = true;
break;
default:
break;
}
if (BF_GLOBALS._dayNumber == 5)
- _doorway._v2 = BF_GLOBALS.getFlag(fTookTrailerAmmo) ? 1 : 0;
+ _doorway._talkCount = BF_GLOBALS.getFlag(fTookTrailerAmmo) ? 1 : 0;
_object8.postInit();
_object8.setVisage(355);
@@ -3614,8 +3614,8 @@ void Scene355::postInit(SceneObjectList *OwnerList) {
_object11.animate(ANIM_MODE_2);
_doorway.setPosition(Common::Point(146, 107));
- _doorway._v3 = 0;
- _doorway._v2 = 2;
+ _doorway._onDuty = false;
+ _doorway._talkCount = 2;
_lyle._flag = 2;
_green.postInit();
@@ -3713,16 +3713,16 @@ void Scene355::signal() {
_stripManager.start(BF_GLOBALS.getFlag(fBackupIn350) ? 3559 : 3554, this);
break;
case 1356:
- switch (_doorway._v1) {
+ switch (_doorway._mode1356Count) {
case 0:
- ++_doorway._v1;
+ ++_doorway._mode1356Count;
_sceneMode = 9999;
_stripManager.start(3550, this);
break;
case 1:
_sceneMode = 9999;
_stripManager.start(3551, this);
- ++_doorway._v1;
+ ++_doorway._mode1356Count;
break;
default:
break;
@@ -3787,7 +3787,7 @@ void Scene355::signal() {
T2_GLOBALS._uiElements.addScore(10);
}
- SceneItem::display2(355, !_doorway._v3 ? 24 : 25);
+ SceneItem::display2(355, !_doorway._onDuty ? 24 : 25);
BF_GLOBALS._player.enableControl();
break;
case 4550:
@@ -3796,8 +3796,8 @@ void Scene355::signal() {
BF_GLOBALS._sound1.play(90);
BF_GLOBALS._player._regionBitList |= 0x10;
- _doorway._v3 = 0;
- _doorway._v2 = 2;
+ _doorway._onDuty = false;
+ _doorway._talkCount = 2;
_lyle._flag = 2;
BF_GLOBALS._player.enableControl();
break;
@@ -3867,13 +3867,13 @@ void Scene355::signal() {
case 9984:
if (BF_GLOBALS._dayNumber == 5) {
_sceneMode = 0;
- switch (_doorway._v2) {
+ switch (_doorway._talkCount) {
case 0:
BF_GLOBALS._sound1.play(109);
BF_GLOBALS.setFlag(fTookTrailerAmmo);
_stripManager.start(3575, this);
_lyle._flag = 1;
- ++_doorway._v2;
+ ++_doorway._talkCount;
break;
case 1:
_stripManager.start(3573, this);
@@ -3884,7 +3884,7 @@ void Scene355::signal() {
break;
}
} else if (BF_GLOBALS.getFlag(greenTaken) || (BF_GLOBALS._dayNumber > 1)) {
- if (_doorway._v3) {
+ if (_doorway._onDuty) {
SceneItem::display2(355, 23);
_sceneMode = 0;
signal();
@@ -4009,14 +4009,14 @@ void Scene355::signal() {
}
case 9997:
_sceneMode = 9999;
- _doorway._v1 = 2;
+ _doorway._mode1356Count = 2;
_stripManager.start(3562, this);
break;
case 9998:
error("Talkdoor state");
break;
case 9999:
- if (_doorway._v1 != 2) {
+ if (_doorway._mode1356Count != 2) {
BF_GLOBALS._player.enableControl();
BF_GLOBALS._player._canWalk = false;
} else if (BF_GLOBALS.getFlag(gunDrawn)) {
@@ -4438,8 +4438,7 @@ void Scene360::postInit(SceneObjectList *OwnerList) {
BF_GLOBALS._player._moveDiff.y = 4;
BF_GLOBALS._player.enableControl();
- if ((BF_GLOBALS._sceneManager._previousScene == 355) || (BF_GLOBALS._sceneManager._previousScene != 370)) {
- // The original was using there a useless variable (now removed)
+ if (BF_GLOBALS._sceneManager._previousScene != 370) {
BF_GLOBALS._player.setPosition(Common::Point(253, 135));
BF_GLOBALS._player.setStrip(2);
@@ -4527,7 +4526,7 @@ void Scene360::signal() {
BF_GLOBALS._player.enableControl();
break;
case 3608:
- BF_GLOBALS._sceneManager.changeScene(355);
+ BF_GLOBALS._sceneManager.changeScene(355);
break;
case 3610:
BF_GLOBALS._sceneManager.changeScene(666);
@@ -4652,10 +4651,10 @@ bool Scene370::Green::startAction(CursorType action, Event &event) {
switch (action) {
case CURSOR_LOOK:
- SceneItem::display2(370, (_v2 < 3) ? 10 : 0);
+ SceneItem::display2(370, (_talkCount < 3) ? 10 : 0);
return true;
case CURSOR_USE:
- if (_v2 != 3)
+ if (_talkCount != 3)
SceneItem::display2(370, 1);
else if (BF_INVENTORY.getObjectScene(INV_HANDCUFFS) == 1)
SceneItem::display2(370, 26);
@@ -4671,14 +4670,14 @@ bool Scene370::Green::startAction(CursorType action, Event &event) {
return true;
case CURSOR_TALK:
BF_GLOBALS._player.disableControl();
- switch (_v2) {
+ switch (_talkCount) {
case 0:
- ++_v2;
+ ++_talkCount;
scene->_sceneMode = 3706;
scene->setAction(&scene->_sequenceManager, scene, 3706, NULL);
break;
case 1:
- ++_v2;
+ ++_talkCount;
scene->_sceneMode = 3707;
scene->_object5.postInit();
@@ -4690,7 +4689,7 @@ bool Scene370::Green::startAction(CursorType action, Event &event) {
scene->setAction(&scene->_sequenceManager, scene, 3707, &scene->_harrison, &scene->_object5, NULL);
break;
case 2:
- ++_v2;
+ ++_talkCount;
scene->_sceneMode = 3708;
scene->setAction(&scene->_sequenceManager, scene, 3708, this, &scene->_laura, &scene->_harrison,
&scene->_object5, &scene->_greensGun, NULL);
@@ -4716,7 +4715,7 @@ bool Scene370::Green::startAction(CursorType action, Event &event) {
}
return true;
case INV_HANDCUFFS:
- if (_v2 != 3)
+ if (_talkCount != 3)
SceneItem::display2(370, 2);
else {
T2_GLOBALS._uiElements.addScore(50);
@@ -4753,7 +4752,7 @@ bool Scene370::Harrison::startAction(CursorType action, Event &event) {
SceneItem::display2(370, 8);
return true;
case CURSOR_TALK:
- if (scene->_green._v2 != 3) {
+ if (scene->_green._talkCount != 3) {
scene->_sceneMode = 3;
scene->_stripManager.start(3714, scene);
} else if ((BF_INVENTORY.getObjectScene(INV_GREENS_KNIFE) == 1) ||
diff --git a/engines/tsage/blue_force/blueforce_scenes3.h b/engines/tsage/blue_force/blueforce_scenes3.h
index ea9d5f7311..e437fd3a92 100644
--- a/engines/tsage/blue_force/blueforce_scenes3.h
+++ b/engines/tsage/blue_force/blueforce_scenes3.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope 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.
@@ -210,7 +210,6 @@ public:
WestExit _westExit;
SouthWestExit _swExit;
Action1 _action1;
- int _field1390;
int _stripNumber;
int _field1398;
int _invGreenCount, _bookGreenCount, _invGangCount;
@@ -494,9 +493,10 @@ class Scene355: public PalettedScene {
/* Objects */
class Doorway: public NamedObject {
public:
- int _v1, _v2, _v3;
+ int _mode1356Count, _talkCount;
+ bool _onDuty;
- Doorway() { _v1 = _v2 = _v3 = 0; }
+ Doorway() { _mode1356Count = _talkCount = 0; _onDuty = false; }
virtual Common::String getClassName() { return "Scene355_Doorway"; }
virtual void synchronize(Serializer &s);
virtual bool startAction(CursorType action, Event &event);
diff --git a/engines/tsage/blue_force/blueforce_scenes4.cpp b/engines/tsage/blue_force/blueforce_scenes4.cpp
index a10f311791..50f8499b3b 100644
--- a/engines/tsage/blue_force/blueforce_scenes4.cpp
+++ b/engines/tsage/blue_force/blueforce_scenes4.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope 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.
@@ -39,7 +39,7 @@ namespace BlueForce {
void Scene410::Action1::signal() {
Scene410 *scene = (Scene410 *)BF_GLOBALS._sceneManager._scene;
- switch (scene->_field1FB6++) {
+ switch (scene->_action1Count++) {
case 0:
if (BF_GLOBALS.getFlag(fTalkedDriverNoBkup)) {
setDelay(3);
@@ -136,7 +136,7 @@ void Scene410::Action5::signal() {
switch (_actionIndex++) {
case 0:
- if (scene->_field1FC4 == 0) {
+ if (!scene->_harrisonMovedFl) {
ADD_PLAYER_MOVER(114, 133);
} else {
ADD_PLAYER_MOVER(195, 139);
@@ -167,7 +167,7 @@ void Scene410::Action6::signal() {
switch (_actionIndex++) {
case 0:
- if (scene->_field1FC4 == 0) {
+ if (!scene->_harrisonMovedFl) {
ADD_PLAYER_MOVER(114, 133);
} else {
ADD_PLAYER_MOVER(126, 99);
@@ -243,7 +243,7 @@ bool Scene410::Motorcycle::startAction(CursorType action, Event &event) {
} else if (BF_GLOBALS.getFlag(fSearchedTruck) && !BF_GLOBALS._sceneObjects->contains(&scene->_harrison)) {
scene->_sceneMode = 4103;
scene->signal();
- } else if (scene->_field1FBC != 0) {
+ } else if (scene->_cuffedDriverFl) {
SceneItem::display2(410, 12);
} else {
scene->_sceneMode = 4103;
@@ -260,7 +260,7 @@ bool Scene410::TruckFront::startAction(CursorType action, Event &event) {
switch (action) {
case CURSOR_USE:
- if ((BF_GLOBALS._bookmark < bStoppedFrankie) && (!scene->_field1FBC || !scene->_field1FBA))
+ if ((BF_GLOBALS._bookmark < bStoppedFrankie) && (!scene->_cuffedDriverFl || !scene->_harrissonTalkFl))
break;
else if (BF_GLOBALS.getFlag(fSearchedTruck))
SceneItem::display2(410, 13);
@@ -293,11 +293,11 @@ bool Scene410::Driver::startAction(CursorType action, Event &event) {
} else {
SceneItem::display2(410, 7);
}
- } else if (!scene->_field1FBC) {
+ } else if (!scene->_cuffedDriverFl) {
SceneItem::display2(410, 7);
- } else if (!scene->_field1FC0) {
+ } else if (!scene->_getDriverFl) {
scene->_sceneMode = 4124;
- scene->_field1FC0 = 1;
+ scene->_getDriverFl = true;
T2_GLOBALS._uiElements.addScore(30);
scene->signal();
} else {
@@ -309,13 +309,13 @@ bool Scene410::Driver::startAction(CursorType action, Event &event) {
return true;
case INV_HANDCUFFS:
if (BF_GLOBALS.getFlag(fCalledBackup)) {
- if ((scene->_talkCount < 5) || (scene->_field1FB6 < 1) || (scene->_field1FBC != 0))
+ if ((scene->_talkCount < 5) || (scene->_action1Count < 1) || scene->_cuffedDriverFl)
break;
BF_GLOBALS._player.disableControl();
scene->_sceneMode = 4123;
scene->_stripManager.start(4125, scene);
- scene->_field1FBC = 1;
+ scene->_cuffedDriverFl = true;
T2_GLOBALS._uiElements.addScore(30);
} else {
if (BF_GLOBALS.getFlag(fTalkedDriverNoBkup)) {
@@ -328,14 +328,14 @@ bool Scene410::Driver::startAction(CursorType action, Event &event) {
case INV_TICKET_BOOK:
if (!BF_GLOBALS.getFlag(fDriverOutOfTruck)) {
return startAction(CURSOR_TALK, event);
- } else if (!scene->_field1FC4) {
+ } else if (!scene->_harrisonMovedFl) {
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)) {
+ } else if (scene->_cuffedDriverFl || scene->_driverOutOfTruckFl) {
break;
} else {
- scene->_field1FC2 = 1;
+ scene->_driverOutOfTruckFl = true;
T2_GLOBALS._uiElements.addScore(30);
BF_GLOBALS._player.disableControl();
scene->_sceneMode = 4127;
@@ -343,7 +343,7 @@ bool Scene410::Driver::startAction(CursorType action, Event &event) {
}
return true;
case INV_MIRANDA_CARD:
- if (scene->_field1FBC == 0)
+ if (!scene->_cuffedDriverFl)
return false;
if (BF_GLOBALS.getFlag(readFrankRights)) {
@@ -379,15 +379,15 @@ bool Scene410::Passenger::startAction(CursorType action, Event &event) {
SET_Y, GLOBALS._sceneManager._scene->_sceneBounds.top + UI_INTERFACE_Y + 2,
SET_FONT, 4, SET_BG_COLOR, 1, SET_FG_COLOR, 96, SET_EXT_BGCOLOR, 99,
SET_EXT_FGCOLOR, 13, LIST_END);
- } else if (!scene->_field1FBA) {
+ } else if (!scene->_harrissonTalkFl) {
SceneItem::display(410, 5, SET_WIDTH, 300,
SET_X, 10 + 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, 96, SET_EXT_BGCOLOR, 99,
SET_EXT_FGCOLOR, 13, LIST_END);
- } else if (!scene->_field1FBE) {
+ } else if (!scene->_cuffedPassengerFl) {
scene->_sceneMode = 4121;
- scene->_field1FBE = 1;
+ scene->_cuffedPassengerFl = true;
T2_GLOBALS._uiElements.addScore(50);
scene->signal();
} else
@@ -398,7 +398,7 @@ bool Scene410::Passenger::startAction(CursorType action, Event &event) {
return true;
case INV_HANDCUFFS:
if (BF_GLOBALS.getFlag(fCalledBackup)) {
- if ((scene->_talkCount < 5) || (scene->_field1FBA != 0))
+ if ((scene->_talkCount < 5) || (scene->_harrissonTalkFl))
break;
BF_GLOBALS._player.disableControl();
@@ -413,7 +413,7 @@ bool Scene410::Passenger::startAction(CursorType action, Event &event) {
}
return true;
case INV_MIRANDA_CARD:
- if (!scene->_field1FBA)
+ if (!scene->_harrissonTalkFl)
break;
if (BF_GLOBALS.getFlag(readFrankRights)) {
@@ -455,7 +455,7 @@ bool Scene410::Harrison::startAction(CursorType action, Event &event) {
SET_FONT, 4, SET_BG_COLOR, 1, SET_FG_COLOR, 32, SET_EXT_BGCOLOR, 49,
SET_EXT_FGCOLOR, 13, LIST_END);
}
- } else if ((scene->_field1FBA != 0) && (scene->_field1FBC != 0)) {
+ } else if (scene->_harrissonTalkFl && scene->_cuffedDriverFl) {
BF_GLOBALS._player.disableControl();
scene->_sceneMode = 4112;
scene->_stripManager.start(4113, scene);
@@ -463,27 +463,27 @@ bool Scene410::Harrison::startAction(CursorType action, Event &event) {
BF_GLOBALS.set2Flags(f1098Frankie);
BF_GLOBALS.clearFlag(f1098Marina);
} else if ((BF_INVENTORY.getObjectScene(INV_HANDCUFFS) == 1) ||
- (!scene->_field1FBA && (scene->_talkCount < 5))) {
+ (!scene->_harrissonTalkFl && (scene->_talkCount < 5))) {
SceneItem::display(350, 13, SET_WIDTH, 300,
SET_X, 10 + 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, 32, SET_EXT_BGCOLOR, 49,
SET_EXT_FGCOLOR, 13, LIST_END);
- } else if (!scene->_field1FBA) {
+ } else if (!scene->_harrissonTalkFl) {
BF_GLOBALS._player.disableControl();
- scene->_field1FBA = 1;
- scene->_field1FBE = 1;
+ scene->_harrissonTalkFl = true;
+ scene->_cuffedPassengerFl = true;
BF_GLOBALS._walkRegions.enableRegion(22);
scene->_sceneMode = 4122;
scene->_stripManager.start(4112, scene);
- } else if (scene->_field1FB6 < 1) {
+ } else if (scene->_action1Count < 1) {
break;
- } else if (scene->_field1FBC != 0) {
+ } else if (scene->_cuffedDriverFl) {
error("Error - want to cuff driver, but he's cuffed already");
} else {
BF_GLOBALS._player.disableControl();
- scene->_field1FBC = 1;
- scene->_field1FC0 = 1;
+ scene->_cuffedDriverFl = true;
+ scene->_getDriverFl = true;
BF_GLOBALS._walkRegions.enableRegion(22);
scene->_sceneMode = 4109;
scene->_stripManager.start(4112, scene);
@@ -500,20 +500,24 @@ bool Scene410::Harrison::startAction(CursorType action, Event &event) {
/*--------------------------------------------------------------------------*/
Scene410::Scene410(): SceneExt() {
- _field1FB6 = _talkCount = _field1FBA = _field1FBC = 0;
- _field1FBE = _field1FC0 = _field1FC2 = _field1FC4 = 0;
+ _cuffedDriverFl = _harrissonTalkFl = _driverOutOfTruckFl = false;
+ _harrisonMovedFl = false;
+
+ _action1Count = _talkCount = 0;
+ _cuffedPassengerFl = false;
+ _getDriverFl = false;
}
void Scene410::synchronize(Serializer &s) {
SceneExt::synchronize(s);
- s.syncAsSint16LE(_field1FB6);
+ s.syncAsSint16LE(_action1Count);
s.syncAsSint16LE(_talkCount);
- s.syncAsSint16LE(_field1FBA);
- s.syncAsSint16LE(_field1FBC);
- s.syncAsSint16LE(_field1FBE);
- s.syncAsSint16LE(_field1FC0);
- s.syncAsSint16LE(_field1FC2);
- s.syncAsSint16LE(_field1FC4);
+ s.syncAsSint16LE(_harrissonTalkFl);
+ s.syncAsSint16LE(_cuffedDriverFl);
+ s.syncAsSint16LE(_cuffedPassengerFl);
+ s.syncAsSint16LE(_getDriverFl);
+ s.syncAsSint16LE(_driverOutOfTruckFl);
+ s.syncAsSint16LE(_harrisonMovedFl);
}
void Scene410::postInit(SceneObjectList *OwnerList) {
@@ -593,7 +597,7 @@ void Scene410::postInit(SceneObjectList *OwnerList) {
_patrolCar.fixPriority(148);
_patrolCar.setPosition(Common::Point(39, 168));
- _field1FC4 = 1;
+ _harrisonMovedFl = true;
_sceneMode = 0;
signal();
break;
@@ -603,10 +607,10 @@ void Scene410::postInit(SceneObjectList *OwnerList) {
_driver.remove();
_sceneMode = 0;
} else {
- _field1FC4 = BF_GLOBALS._v50CC8;
- _field1FBA = BF_GLOBALS._v50CC2;
- _talkCount = BF_GLOBALS._v50CC6;
- _field1FB6 = BF_GLOBALS._v50CC4;
+ _harrisonMovedFl = BF_GLOBALS._scene410HarrisonMovedFl;
+ _harrissonTalkFl = BF_GLOBALS._scene410HarrisonTalkFl;
+ _talkCount = BF_GLOBALS._scene410TalkCount;
+ _action1Count = BF_GLOBALS._scene410Action1Count;
_passenger.setVisage(418);
_passenger.setStrip(6);
@@ -617,7 +621,7 @@ void Scene410::postInit(SceneObjectList *OwnerList) {
_passenger.setStrip(2);
_passenger.setFrame(5);
}
- if (_field1FBA) {
+ if (_harrissonTalkFl) {
_passenger.setVisage(415);
_passenger.setStrip(6);
_passenger.setFrame(8);
@@ -651,7 +655,7 @@ void Scene410::postInit(SceneObjectList *OwnerList) {
_patrolCar.setDetails(410, 8, 9, 10, 1, (SceneItem *)NULL);
_patrolCar.fixPriority(148);
- if (_field1FC4) {
+ if (_harrisonMovedFl) {
_harrison.setPosition(Common::Point(108, 112));
_patrolCar.fixPriority(148);
_patrolCar.setPosition(Common::Point(39, 168));
@@ -664,7 +668,7 @@ void Scene410::postInit(SceneObjectList *OwnerList) {
_sceneMode = 0;
}
- _field1FC4 = 1;
+ _harrisonMovedFl = true;
}
break;
case 50:
@@ -686,10 +690,10 @@ void Scene410::signal() {
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._scene410HarrisonMovedFl = _harrisonMovedFl;
+ BF_GLOBALS._scene410HarrisonTalkFl = _harrissonTalkFl;
+ BF_GLOBALS._scene410TalkCount = _talkCount;
+ BF_GLOBALS._scene410Action1Count = _action1Count;
BF_GLOBALS._sceneManager.changeScene(60);
break;
case 2:
@@ -730,7 +734,7 @@ void Scene410::signal() {
case 9:
_sceneMode = 4106;
_stripManager.start(4111, this);
- _field1FBA = 1;
+ _harrissonTalkFl = true;
BF_GLOBALS.setFlag(fCuffedFrankie);
T2_GLOBALS._uiElements.addScore(30);
break;
@@ -760,7 +764,7 @@ void Scene410::signal() {
break;
case 4104:
// After call for backup, patrol car is coming
- _field1FC4 = 1;
+ _harrisonMovedFl = true;
BF_GLOBALS._player.disableControl();
_sceneMode = 0;
setAction(&_sequenceManager1, this, 4104, &_patrolCar, &_harrison, NULL);
@@ -1432,21 +1436,21 @@ bool Scene450::Manager::startAction(CursorType action, Event &event) {
} else {
animate(ANIM_MODE_8, 1, NULL);
- if (scene->_field19AC) {
+ if (scene->_managerCallsWeaselFl) {
scene->_sceneMode = 2;
- if (scene->_field19AE) {
+ if (scene->_talkManagerFl) {
scene->_stripManager.start(4521, scene);
} else {
- scene->_field19AE = 1;
+ scene->_talkManagerFl = true;
scene->_stripManager.start(4512, scene);
}
} else {
scene->_sceneMode = 4506;
- if (scene->_field19AE) {
+ if (scene->_talkManagerFl) {
scene->setAction(&scene->_sequenceManager, scene, 4518, &BF_GLOBALS._player, this, NULL);
} else {
scene->_sceneMode = 4506;
- scene->_field19AE = 1;
+ scene->_talkManagerFl = true;
scene->setAction(&scene->_sequenceManager, scene, 4506, &BF_GLOBALS._player, this, NULL);
}
}
@@ -1524,13 +1528,13 @@ bool Scene450::Exit::startAction(CursorType action, Event &event) {
/*--------------------------------------------------------------------------*/
Scene450::Scene450(): SceneExt() {
- _field19AC = _field19AE = 0;
+ _managerCallsWeaselFl = _talkManagerFl = false;
}
void Scene450::synchronize(Serializer &s) {
SceneExt::synchronize(s);
- s.syncAsSint16LE(_field19AC);
- s.syncAsSint16LE(_field19AE);
+ s.syncAsSint16LE(_managerCallsWeaselFl);
+ s.syncAsSint16LE(_talkManagerFl);
}
void Scene450::postInit(SceneObjectList *OwnerList) {
@@ -1654,7 +1658,7 @@ void Scene450::signal() {
case 4510:
case 4511:
BF_GLOBALS.setFlag(fMgrCallsWeasel);
- _field19AC = 1;
+ _managerCallsWeaselFl = true;
_sceneMode = 4503;
setAction(&_sequenceManager, this, 4503, &_weasel, &_door, &_manager, NULL);
break;
diff --git a/engines/tsage/blue_force/blueforce_scenes4.h b/engines/tsage/blue_force/blueforce_scenes4.h
index 937c015a4c..9a6df24add 100644
--- a/engines/tsage/blue_force/blueforce_scenes4.h
+++ b/engines/tsage/blue_force/blueforce_scenes4.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope 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.
@@ -116,9 +116,12 @@ public:
SpeakerDriver _driverSpeaker;
SpeakerShooter _shooterSpeaker;
ASoundExt _sound1;
- int _field1FB6, _talkCount, _field1FBA;
- int _field1FBC, _field1FBE;
- int _field1FC0, _field1FC2, _field1FC4;
+ int _action1Count, _talkCount;
+ bool _harrissonTalkFl;
+ bool _cuffedDriverFl;
+ bool _cuffedPassengerFl;
+ bool _getDriverFl;
+ bool _driverOutOfTruckFl, _harrisonMovedFl;
Scene410();
virtual void postInit(SceneObjectList *OwnerList = NULL);
@@ -254,7 +257,8 @@ public:
NamedObject _door, _counterDoor;
Exit _exit;
NamedHotspot _interior, _shelf, _counter;
- int _field19AC, _field19AE;
+ bool _managerCallsWeaselFl;
+ bool _talkManagerFl;
Scene450();
virtual void synchronize(Serializer &s);
diff --git a/engines/tsage/blue_force/blueforce_scenes5.cpp b/engines/tsage/blue_force/blueforce_scenes5.cpp
index 0cf487daa9..562facd000 100644
--- a/engines/tsage/blue_force/blueforce_scenes5.cpp
+++ b/engines/tsage/blue_force/blueforce_scenes5.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope 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.
@@ -1623,7 +1623,7 @@ void Scene570::PasswordEntry::process(Event &event) {
checkPassword();
remove();
- } else if ((key >= 32) || (key <= 126)) {
+ } else if ((key >= 32) && (key <= 126)) {
// Valid character pressed
if (_entryBuffer.size() < 10)
_entryBuffer += (char)key;
@@ -1772,12 +1772,12 @@ void Scene570::IconManager::refreshList() {
}
void Scene570::IconManager::addItem(Icon *item) {
- item->_mode = _mode;
_list.push_back(item);
}
Scene570::Icon::Icon(): NamedObject() {
_iconId = _folderId = 0;
+ _parentFolderId = 0;
}
void Scene570::Icon::synchronize(Serializer &s) {
@@ -1785,7 +1785,10 @@ void Scene570::Icon::synchronize(Serializer &s) {
s.syncAsSint16LE(_iconId);
s.syncAsSint16LE(_folderId);
s.syncAsSint16LE(_parentFolderId);
- s.syncAsSint16LE(_mode);
+ if (s.getVersion() < 11) {
+ int useless = 0;
+ s.syncAsSint16LE(useless);
+ }
}
void Scene570::Icon::remove() {
@@ -1906,7 +1909,7 @@ bool Scene570::Icon::startAction(CursorType action, Event &event) {
}
}
-void Scene570::Icon::setDetails(int iconId, int folderId, int parentFolderId, int unused, const Common::String &msg) {
+void Scene570::Icon::setDetails(int iconId, int folderId, int parentFolderId, const Common::String &msg) {
Scene570 *scene = (Scene570 *)BF_GLOBALS._sceneManager._scene;
NamedObject::postInit();
@@ -2073,23 +2076,23 @@ void Scene570::signal() {
_printerIcon.setDetails(570, 14, 15, -1, 2, (SceneItem *)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);
+ _folder1.setDetails(1, 1, 0, SCENE570_C_DRIVE);
+ _folder2.setDetails(1, 2, 1, SCENE570_RING);
+ _folder3.setDetails(1, 3, 1, SCENE570_PROTO);
+ _folder4.setDetails(1, 4, 1, SCENE570_WACKY);
if (!BF_GLOBALS.getFlag(fDecryptedBluePrints))
- _icon1.setDetails(3, 5, 0, 2, SCENE570_COBB);
- _icon2.setDetails(2, 7, 0, 2, SCENE570_LETTER);
+ _icon1.setDetails(3, 5, 0, SCENE570_COBB);
+ _icon2.setDetails(2, 7, 0, SCENE570_LETTER);
if (BF_GLOBALS.getFlag(fDecryptedBluePrints))
- _icon3.setDetails(7, 6, 0, 2, SCENE570_COBB);
+ _icon3.setDetails(7, 6, 0, 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);
+ _icon4.setDetails(6, 8, 1, SCENE570_RINGEXE);
+ _icon5.setDetails(5, 9, 1, SCENE570_RINGDATA);
+ _icon6.setDetails(6, 10, 2, SCENE570_PROTOEXE);
+ _icon7.setDetails(5, 11, 2, SCENE570_PROTODATA);
+ _icon8.setDetails(6, 12, 3, SCENE570_WACKYEXE);
+ _icon9.setDetails(5, 13, 3, SCENE570_WACKYDATA);
_iconManager.refreshList();
BF_GLOBALS._player.enableControl();
@@ -2104,7 +2107,7 @@ void Scene570::signal() {
_object3.setFrame(1);
_object3.fixPriority(1);
- _icon3.setDetails(7, 6, 0, 2, SCENE570_COBB);
+ _icon3.setDetails(7, 6, 0, SCENE570_COBB);
_iconManager.refreshList();
T2_GLOBALS._uiElements._active = true;
T2_GLOBALS._uiElements.show();
diff --git a/engines/tsage/blue_force/blueforce_scenes5.h b/engines/tsage/blue_force/blueforce_scenes5.h
index 56bf20c93b..7c5bbb3feb 100644
--- a/engines/tsage/blue_force/blueforce_scenes5.h
+++ b/engines/tsage/blue_force/blueforce_scenes5.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope 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.
@@ -257,7 +257,7 @@ class Scene570: public SceneExt {
class Icon: public NamedObject {
public:
SceneText _sceneText;
- int _iconId, _folderId, _parentFolderId, _mode;
+ int _iconId, _folderId, _parentFolderId;
Common::String _text;
Icon();
@@ -266,7 +266,7 @@ class Scene570: public SceneExt {
virtual void remove();
virtual bool startAction(CursorType action, Event &event);
- void setDetails(int iconId, int folderId, int parentFolderId, int unused, const Common::String &msg);
+ void setDetails(int iconId, int folderId, int parentFolderId, const Common::String &msg);
};
class IconManager: public EventHandler {
public:
diff --git a/engines/tsage/blue_force/blueforce_scenes6.cpp b/engines/tsage/blue_force/blueforce_scenes6.cpp
index 9467df7917..92534d3095 100644
--- a/engines/tsage/blue_force/blueforce_scenes6.cpp
+++ b/engines/tsage/blue_force/blueforce_scenes6.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope 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.
@@ -79,7 +79,6 @@ void Scene600::Action1::signal() {
}
BF_GLOBALS._screenSurface.fillRect(BF_GLOBALS._screenSurface.getBounds(), 0);
- BF_GLOBALS._v51C44 = 1;
scene->loadScene(999);
setDelay(5);
break;
@@ -88,7 +87,6 @@ void Scene600::Action1::signal() {
setDelay(5);
break;
case 7:
- BF_GLOBALS._v51C44 = 0;
remove();
break;
default:
@@ -275,7 +273,7 @@ bool Scene666::Item1::startAction(CursorType action, Event &event) {
void Scene666::postInit(SceneObjectList *OwnerList) {
BF_GLOBALS._sound1.play(27);
SceneExt::postInit();
- BF_GLOBALS._interfaceY = 200;
+ BF_GLOBALS._interfaceY = SCREEN_HEIGHT;
loadScene(999);
BF_GLOBALS._screenSurface.fillRect(BF_GLOBALS._screenSurface.getBounds(), 0);
diff --git a/engines/tsage/blue_force/blueforce_scenes6.h b/engines/tsage/blue_force/blueforce_scenes6.h
index 3f9c14aa11..7ace22f5a6 100644
--- a/engines/tsage/blue_force/blueforce_scenes6.h
+++ b/engines/tsage/blue_force/blueforce_scenes6.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope 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.
diff --git a/engines/tsage/blue_force/blueforce_scenes7.cpp b/engines/tsage/blue_force/blueforce_scenes7.cpp
index 4cdd2f3f15..268c755299 100644
--- a/engines/tsage/blue_force/blueforce_scenes7.cpp
+++ b/engines/tsage/blue_force/blueforce_scenes7.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope 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.
@@ -148,7 +148,7 @@ void Scene710::postInit(SceneObjectList *OwnerList) {
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);
diff --git a/engines/tsage/blue_force/blueforce_scenes7.h b/engines/tsage/blue_force/blueforce_scenes7.h
index 161d94cc2c..91fb4c5ab2 100644
--- a/engines/tsage/blue_force/blueforce_scenes7.h
+++ b/engines/tsage/blue_force/blueforce_scenes7.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope 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.
diff --git a/engines/tsage/blue_force/blueforce_scenes8.cpp b/engines/tsage/blue_force/blueforce_scenes8.cpp
index 9a20788b6a..6855fd41b9 100644
--- a/engines/tsage/blue_force/blueforce_scenes8.cpp
+++ b/engines/tsage/blue_force/blueforce_scenes8.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope 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.
@@ -577,17 +577,15 @@ bool Scene810::Lyle::startAction(CursorType action, Event &event) {
if ((BF_GLOBALS.getFlag(shownLyleRapsheet)) || (BF_GLOBALS.getFlag(shownLyleCrate1))){
scene->_sceneMode = 8141;
} else {
- // Doublecheck on shownLyleCrate1 removed: useless
scene->_sceneMode = 8144;
}
} else {
if ((BF_GLOBALS.getFlag(shownLyleRapsheet)) || (BF_GLOBALS.getFlag(shownLyleCrate1))) {
scene->_sceneMode = 8129;
- } else { // if (BF_GLOBALS.getFlag(shownLyleCrate1)) {
+ } else {
scene->_sceneMode = 8132;
- // doublecheck Present in the original, may hide a bug in the original
- //} else
- // scene->_sceneMode = 8121;
+ // Double check on ShownLyleCrate1 present in the original, may hide a bug in the original
+ // The original was then setting _sceneMode 8121
}
}
}
@@ -1071,7 +1069,6 @@ void Scene810::postInit(SceneObjectList *OwnerList) {
setAction(&_sequenceManager1, this, 8107, &BF_GLOBALS._player, &_lyle, NULL);
break;
case 935:
- BF_GLOBALS._v51C44 = 1;
BF_GLOBALS._scenePalette.loadPalette(2);
_lyle.remove();
@@ -1804,13 +1801,11 @@ void Scene830::signal() {
_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);
@@ -1963,7 +1958,7 @@ void Scene840::BoatKeysInset::postInit(SceneObjectList *OwnerList) {
_waveKeys.setDetails(840, 53, 8, -1, 2, (SceneItem *)NULL);
}
- _v1B4 = _v1B6 = 0;
+ _usedRentalKeys = _usedWaveKeys = false;
}
void Scene840::BoatKeysInset::remove() {
@@ -2072,7 +2067,7 @@ bool Scene840::BoatKeysInset::RentalKeys::startAction(CursorType action, Event &
BF_INVENTORY.setObjectScene(INV_RENTAL_KEYS, 1);
T2_GLOBALS._uiElements.addScore(30);
- scene->_boatKeysInset._v1B4 = 1;
+ scene->_boatKeysInset._usedRentalKeys = true;
remove();
}
return true;
@@ -2090,7 +2085,7 @@ bool Scene840::BoatKeysInset::WaveKeys::startAction(CursorType action, Event &ev
SceneItem::display2(840, 56);
BF_INVENTORY.setObjectScene(INV_WAVE_KEYS, 1);
T2_GLOBALS._uiElements.addScore(50);
- scene->_boatKeysInset._v1B6 = 1;
+ scene->_boatKeysInset._usedWaveKeys = true;
remove();
} else {
SceneItem::display2(840, 9);
@@ -2101,6 +2096,15 @@ bool Scene840::BoatKeysInset::WaveKeys::startAction(CursorType action, Event &ev
}
}
+void Scene840::BoatKeysInset::synchronize(Serializer &s) {
+ FocusObject::synchronize(s);
+
+ if (s.getVersion() >= 12) {
+ s.syncAsSint16LE(_usedWaveKeys);
+ s.syncAsSint16LE(_usedRentalKeys);
+ }
+}
+
bool Scene840::BoatKeys::startAction(CursorType action, Event &event) {
Scene840 *scene = (Scene840 *)BF_GLOBALS._sceneManager._scene;
@@ -2472,10 +2476,10 @@ void Scene840::signal() {
_boatKeysInset.setDetails(840, 50, 8, 51);
break;
case 8412:
- if (_boatKeysInset._v1B6) {
+ if (_boatKeysInset._usedWaveKeys) {
_sceneMode = 8409;
setAction(&_sequenceManager1, this, 8409, &BF_GLOBALS._player, &_carter, &_doors, NULL);
- } else if (!_boatKeysInset._v1B4) {
+ } else if (!_boatKeysInset._usedRentalKeys) {
BF_GLOBALS._player.enableControl();
} else {
_sceneMode = 3;
diff --git a/engines/tsage/blue_force/blueforce_scenes8.h b/engines/tsage/blue_force/blueforce_scenes8.h
index ef5ef81563..140327e85d 100644
--- a/engines/tsage/blue_force/blueforce_scenes8.h
+++ b/engines/tsage/blue_force/blueforce_scenes8.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope 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.
@@ -348,8 +348,9 @@ class Scene840: public PalettedScene {
public:
RentalKeys _rentalKeys;
WaveKeys _waveKeys;
- int _v1B4, _v1B6;
+ bool _usedRentalKeys,_usedWaveKeys;
+ virtual void synchronize(Serializer &s);
virtual void postInit(SceneObjectList *OwnerList = NULL);
virtual void remove();
virtual void process(Event &event);
diff --git a/engines/tsage/blue_force/blueforce_scenes9.cpp b/engines/tsage/blue_force/blueforce_scenes9.cpp
index 52115b95fe..53000d6997 100644
--- a/engines/tsage/blue_force/blueforce_scenes9.cpp
+++ b/engines/tsage/blue_force/blueforce_scenes9.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope 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.
@@ -516,7 +516,7 @@ void Scene900::postInit(SceneObjectList *OwnerList) {
_door.setPosition(Common::Point(847, 45));
_door._flag = 1;
- if ((BF_GLOBALS._sceneManager._previousScene == 880) || (BF_GLOBALS._sceneManager._previousScene != 910)) {
+ if (BF_GLOBALS._sceneManager._previousScene != 910) {
BF_GLOBALS._walkRegions.disableRegion(26);
BF_GLOBALS._player.disableControl();
if (BF_GLOBALS._bookmark == bFinishedWGreen) {
@@ -840,14 +840,14 @@ bool Scene910::Nico::startAction(CursorType action, Event &event) {
if (BF_GLOBALS._nico910State >= 4)
return NamedObject::startAction(action, event);
- if (BF_GLOBALS._v4CEE6 < 4)
- BF_GLOBALS._v4CEE6++;
+ if (BF_GLOBALS._nico910Talk < 4)
+ BF_GLOBALS._nico910Talk++;
- if (BF_GLOBALS._v4CEE6 == 2) {
+ if (BF_GLOBALS._nico910Talk == 2) {
scene->_sceneMode = 13;
scene->_stripManager.start(9105, scene);
} else
- scene->_stripManager.start(9103 + BF_GLOBALS._v4CEE6, &BF_GLOBALS._stripProxy);
+ scene->_stripManager.start(9103 + BF_GLOBALS._nico910Talk, &BF_GLOBALS._stripProxy);
return true;
break;
case INV_COLT45:
@@ -887,14 +887,14 @@ bool Scene910::Nico::startAction(CursorType action, Event &event) {
if (BF_GLOBALS._nico910State >= 4)
return NamedObject::startAction(action, event);
- if (BF_GLOBALS._v4CEE6 < 4)
- BF_GLOBALS._v4CEE6++;
+ if (BF_GLOBALS._nico910Talk < 4)
+ BF_GLOBALS._nico910Talk++;
- if (BF_GLOBALS._v4CEE6 == 2) {
+ if (BF_GLOBALS._nico910Talk == 2) {
scene->_sceneMode = 13;
scene->_stripManager.start(9105, scene);
} else
- scene->_stripManager.start(9103 + BF_GLOBALS._v4CEE6, &BF_GLOBALS._stripProxy);
+ scene->_stripManager.start(9103 + BF_GLOBALS._nico910Talk, &BF_GLOBALS._stripProxy);
return true;
break;
@@ -966,16 +966,16 @@ bool Scene910::Stuart::startAction(CursorType action, Event &event) {
return true;
break;
case CURSOR_TALK:
- if (BF_GLOBALS._v4CEE8 < 3)
- BF_GLOBALS._v4CEE8++;
+ if (BF_GLOBALS._stuart910Talk < 3)
+ BF_GLOBALS._stuart910Talk++;
- scene->_stripManager.start(9107 + BF_GLOBALS._v4CEE8, &BF_GLOBALS._stripProxy);
+ scene->_stripManager.start(9107 + BF_GLOBALS._stuart910Talk, &BF_GLOBALS._stripProxy);
return true;
break;
case INV_COLT45:
if ((BF_GLOBALS.getFlag(gunDrawn)) && (BF_GLOBALS.getFlag(fGunLoaded)) && (BF_GLOBALS.getHasBullets())){
BF_GLOBALS._player.disableControl();
- if (BF_GLOBALS._v4CEE4 == 2) {
+ if (BF_GLOBALS._stuart910State == 2) {
scene->_sceneMode = 9132;
scene->setAction(&scene->_sequenceManager1, scene, 9132, &scene->_stuart, NULL);
return NamedObject::startAction(action, event);
@@ -1422,6 +1422,10 @@ void Scene910::Object13::setupBreaker(int x, int y, int mode, int8 frameNumber)
BF_GLOBALS._sceneItems.push_front(this);
}
+Scene910::Object25::Object25() {
+ _field90 = _field92 = 0;
+}
+
void Scene910::Object25::synchronize(Serializer &s) {
NamedObject::synchronize(s);
s.syncAsSint16LE(_field90);
@@ -1874,7 +1878,7 @@ bool Scene910::Item2::startAction(CursorType action, Event &event) {
bool Scene910::Item3::startAction(CursorType action, Event &event) {
Scene910 *scene = (Scene910 *)BF_GLOBALS._sceneManager._scene;
- if ((action == CURSOR_TALK) && (BF_GLOBALS._nico910State == 4) && (BF_GLOBALS._v4CEE4 == 0)) {
+ if ((action == CURSOR_TALK) && (BF_GLOBALS._nico910State == 4) && (BF_GLOBALS._stuart910State == 0)) {
BF_GLOBALS._player.disableControl();
scene->_sceneMode = 15;
scene->_stripManager.start(9102, scene);
@@ -1962,7 +1966,6 @@ void Scene910::postInit(SceneObjectList *OwnerList) {
loadScene(910);
BF_GLOBALS._sound1.changeSound(99);
- BF_GLOBALS._v51C44 = 0;
_stripManager.addSpeaker(&_gameTextSpeaker);
_stripManager.addSpeaker(&_jakeJacketSpeaker);
@@ -2054,7 +2057,7 @@ void Scene910::postInit(SceneObjectList *OwnerList) {
|| (BF_GLOBALS._sceneManager._previousScene == 300)) {
BF_GLOBALS._sceneManager._previousScene = 900;
BF_GLOBALS._nico910State = 0;
- BF_GLOBALS._v4CEE4 = 0;
+ BF_GLOBALS._stuart910State = 0;
}
_field2DE0 = 0;
@@ -2146,7 +2149,7 @@ void Scene910::postInit(SceneObjectList *OwnerList) {
_nico.setVisage(913);
_nico.setPosition(Common::Point(262, 124));
_nico.setStrip(6);
- BF_GLOBALS._v4CEE6 = 0;
+ BF_GLOBALS._nico910Talk = 0;
BF_GLOBALS._nico910State = 1;
_nico.setDetails(910, 63, 64, 67, 5, &_item4);
BF_GLOBALS._v4CECA = 2;
@@ -2273,7 +2276,6 @@ void Scene910::signal() {
break;
case 10:
BF_GLOBALS._player.disableControl();
- BF_GLOBALS._v51C44 = 0;
BF_GLOBALS._sceneManager.changeScene(935);
break;
case 11:
@@ -2307,12 +2309,11 @@ void Scene910::signal() {
case 15:
_stuart.postInit();
_stuart.setDetails(910, 66, 67, 68, 5, &_nico);
- BF_GLOBALS._v4CEE8 = 0;
+ BF_GLOBALS._stuart910Talk = 0;
_sceneMode = 9121;
setAction(&_sequenceManager1, this, 9121, &_stuart, NULL);
break;
case 14:
- BF_GLOBALS._v51C44 = 1;
BF_GLOBALS._sceneManager.changeScene(940);
break;
case 16:
@@ -2348,7 +2349,7 @@ void Scene910::signal() {
case 18:
BF_GLOBALS._player._strip = 7;
BF_GLOBALS._player._frame = 1;
- if (BF_GLOBALS._v4CEE4 == 3) {
+ if (BF_GLOBALS._stuart910State == 3) {
if (_field2DE4 == 0) {
_field2DE4 = 1;
_sceneMode = 9142;
@@ -2372,7 +2373,6 @@ void Scene910::signal() {
break;
case 19:
BF_GLOBALS._deathReason = 14;
- BF_GLOBALS._v51C44 = 1;
BF_GLOBALS._sceneManager.changeScene(666);
break;
case 20:
@@ -2388,7 +2388,6 @@ void Scene910::signal() {
BF_GLOBALS.clearFlag(fGotPointsForSearchingDA);
else
BF_GLOBALS.setFlag(fGotPointsForSearchingDA);
- BF_GLOBALS._v51C44 = 1;
BF_GLOBALS._sceneManager.changeScene(900);
break;
case 9102:
@@ -2461,7 +2460,7 @@ void Scene910::signal() {
BF_GLOBALS._player.disableControl();
_nico.postInit();
_nico.setDetails(910, 63, 64, 65, 5, &_item4);
- BF_GLOBALS._v4CEE6 = 0;
+ BF_GLOBALS._nico910Talk = 0;
_shadow.postInit();
_action2.remove();
_sceneMode = 9116;
@@ -2482,7 +2481,6 @@ void Scene910::signal() {
// No break on purpose
case 9137:
BF_GLOBALS._deathReason = 16;
- BF_GLOBALS._v51C44 = 1;
BF_GLOBALS._sceneManager.changeScene(666);
break;
case 9119:
@@ -2500,7 +2498,7 @@ void Scene910::signal() {
break;
case 9121:
_item3.setDetails(7, 910, 96, 60, 61, 3);
- BF_GLOBALS._v4CEE4 = 2;
+ BF_GLOBALS._stuart910State = 2;
if (BF_GLOBALS._nico910State == 4) {
_sceneMode = 20;
_stripManager.start(9115, this);
@@ -2584,7 +2582,7 @@ void Scene910::signal() {
_yellowCord.hide();
_sceneMode = 9136;
setAction(&_sequenceManager1, this, 9136, &BF_GLOBALS._player, &_stuart, &_yellowCord, NULL);
- BF_GLOBALS._v4CEE4 = 3;
+ BF_GLOBALS._stuart910State = 3;
break;
case 11:
_sceneMode = 9137;
@@ -2607,13 +2605,13 @@ void Scene910::signal() {
_stuart.postInit();
_nico.setDetails(910, 72, 73, 74, 3, (SceneItem *)NULL);
_stuart.setDetails(910, 66, 67, 68, 5, &_nico);
- BF_GLOBALS._v4CEE8 = 0;
+ BF_GLOBALS._stuart910Talk = 0;
_sceneMode = 9121;
setAction(&_sequenceManager1, this, 9121, &_stuart, NULL);
break;
case 9126:
_sceneMode = 19;
- if (BF_GLOBALS._v4CEE4 == 0)
+ if (BF_GLOBALS._stuart910State == 0)
signal();
else
_stripManager.start(9115, this);
@@ -2622,7 +2620,6 @@ void Scene910::signal() {
// No break on purpose
case 9134:
BF_GLOBALS._deathReason = 17;
- BF_GLOBALS._v51C44 = 1;
BF_GLOBALS._sceneManager.changeScene(666);
break;
case 9130:
@@ -2633,14 +2630,12 @@ void Scene910::signal() {
break;
case 9132:
BF_GLOBALS._player.enableControl();
- BF_GLOBALS._v4CEE4 = 4;
+ BF_GLOBALS._stuart910State = 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:
@@ -2685,7 +2680,6 @@ void Scene910::signal() {
break;
case 9143:
if (BF_GLOBALS._nico910State == 0) {
- BF_GLOBALS._v51C44 = 1;
BF_GLOBALS._sceneManager.changeScene(920);
} else {
SceneItem::display(910, 89, SET_WIDTH, 312,
@@ -2704,7 +2698,6 @@ void Scene910::signal() {
break;
case 9148:
BF_GLOBALS._deathReason = 23;
- BF_GLOBALS._v51C44 = 1;
BF_GLOBALS._sceneManager.changeScene(666);
break;
case 9149:
@@ -2984,7 +2977,6 @@ bool Scene920::Item8::startAction(CursorType action, Event &event) {
// 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);
@@ -3577,7 +3569,7 @@ void Scene935::postInit(SceneObjectList *OwnerList) {
PalettedScene::postInit();
loadScene(935);
- BF_GLOBALS._interfaceY = 200;
+ BF_GLOBALS._interfaceY = SCREEN_HEIGHT;
BF_GLOBALS._player.disableControl();
_visualSpeaker._textMode = ALIGN_CENTER;
_visualSpeaker._hideObjects = false;
@@ -3812,7 +3804,7 @@ void Scene940::postInit(SceneObjectList *OwnerList) {
BF_GLOBALS._sound1.play(115);
BF_GLOBALS._dayNumber = 6;
- BF_GLOBALS._interfaceY = 200;
+ BF_GLOBALS._interfaceY = SCREEN_HEIGHT;
T2_GLOBALS._uiElements._active = false;
_gameTextSpeaker2._speakerName = "SENTTEXT";
diff --git a/engines/tsage/blue_force/blueforce_scenes9.h b/engines/tsage/blue_force/blueforce_scenes9.h
index 74708b94de..52935debd4 100644
--- a/engines/tsage/blue_force/blueforce_scenes9.h
+++ b/engines/tsage/blue_force/blueforce_scenes9.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope 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.
@@ -188,6 +188,7 @@ class Scene910: public PalettedScene {
class Object25: public NamedObject {
int _field90, _field92;
public:
+ Object25();
void setupHiddenSwitch(int x, int y, int arg8, int argA);
virtual void synchronize(Serializer &s);
virtual bool startAction(CursorType action, Event &event);
diff --git a/engines/tsage/blue_force/blueforce_speakers.cpp b/engines/tsage/blue_force/blueforce_speakers.cpp
index 2a57616640..ea73cc9d7f 100644
--- a/engines/tsage/blue_force/blueforce_speakers.cpp
+++ b/engines/tsage/blue_force/blueforce_speakers.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope 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.
@@ -63,8 +63,8 @@ void VisualSpeaker::synchronize(Serializer &s) {
s.syncAsSint16LE(_offsetPos.y);
}
-void VisualSpeaker::proc12(Action *action) {
- Speaker::proc12(action);
+void VisualSpeaker::startSpeaking(Action *action) {
+ Speaker::startSpeaking(action);
_textPos = Common::Point(_offsetPos.x + BF_GLOBALS._sceneManager._scene->_sceneBounds.left,
_offsetPos.y + BF_GLOBALS._sceneManager._scene->_sceneBounds.top);
_numFrames = 0;
diff --git a/engines/tsage/blue_force/blueforce_speakers.h b/engines/tsage/blue_force/blueforce_speakers.h
index e406a50fbe..dfe6f51039 100644
--- a/engines/tsage/blue_force/blueforce_speakers.h
+++ b/engines/tsage/blue_force/blueforce_speakers.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope 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.
@@ -51,7 +51,7 @@ public:
virtual Common::String getClassName() { return "VisualSpeaker"; }
virtual void synchronize(Serializer &s);
virtual void remove();
- virtual void proc12(Action *action);
+ virtual void startSpeaking(Action *action);
virtual void setText(const Common::String &msg);
};
diff --git a/engines/tsage/configure.engine b/engines/tsage/configure.engine
new file mode 100644
index 0000000000..2b8edf8266
--- /dev/null
+++ b/engines/tsage/configure.engine
@@ -0,0 +1,3 @@
+# This file is included from the main "configure" script
+# add_engine [name] [desc] [build-by-default] [subengines] [base games] [deps]
+add_engine tsage "TsAGE" yes
diff --git a/engines/tsage/converse.cpp b/engines/tsage/converse.cpp
index 9e7d84105a..d1faca5dac 100644
--- a/engines/tsage/converse.cpp
+++ b/engines/tsage/converse.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope 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.
@@ -449,8 +449,20 @@ int ConversationChoiceDialog::execute(const Common::StringArray &choiceList) {
// Draw the dialog
draw();
+
g_globals->_events.showCursor();
+ // Force the display of an arrow cursor during discussions in R2R
+ if (g_vm->getGameID() == GType_Ringworld2)
+ R2_GLOBALS._events.setCursor(CURSOR_ARROW);
+
+ // WORKAROUND: On-screen dialogs are really meant to use a GfxManager instance
+ // for their lifetime, which prevents saving or loading. Since I don't want to spend a lot
+ // of time refactoring this already working dialog, fake it by putting a dummy gfxmanager at
+ // the end of the gfx manager list so as to prevent saving or loading
+ GfxManager gfxManager;
+ GLOBALS._gfxManagers.push_back(&gfxManager);
+
// Event handling loop
Event event;
while (!g_vm->shouldQuit()) {
@@ -502,6 +514,7 @@ int ConversationChoiceDialog::execute(const Common::StringArray &choiceList) {
// Remove the dialog
remove();
+ GLOBALS._gfxManagers.remove(&gfxManager);
return _selectedIndex;
}
@@ -640,11 +653,11 @@ void StripManager::reset() {
_delayFrames = 0;
_owner = NULL;
_endHandler = NULL;
- _field2E6 = false;
+ _uselessFl = false;
_stripNum = -1;
- _obj44Index = 0;
- _field2E8 = 0;
- _field20 = 0;
+ _obj44ListIndex = 0;
+ _currObj44Id = 0;
+ _useless = 0;
_activeSpeaker = NULL;
_textShown = false;
_callbackObject = NULL;
@@ -688,14 +701,14 @@ void StripManager::synchronize(Serializer &s) {
Action::synchronize(s);
s.syncAsSint32LE(_stripNum);
- s.syncAsSint32LE(_obj44Index);
- s.syncAsSint32LE(_field20);
+ s.syncAsSint32LE(_obj44ListIndex);
+ s.syncAsSint32LE(_useless);
s.syncAsSint32LE(_sceneNumber);
_sceneBounds.synchronize(s);
SYNC_POINTER(_activeSpeaker);
s.syncAsByte(_textShown);
- s.syncAsByte(_field2E6);
- s.syncAsSint32LE(_field2E8);
+ s.syncAsByte(_uselessFl);
+ s.syncAsSint32LE(_currObj44Id);
if (g_vm->getGameID() == GType_Ringworld2)
s.syncAsSint16LE(_exitMode);
@@ -727,10 +740,10 @@ void StripManager::synchronize(Serializer &s) {
}
void StripManager::remove() {
- if (g_vm->getGameID() == GType_Ringworld2) {
+ if (g_vm->getGameID() == GType_Ringworld2) {
for (uint i = 0; i < _speakerList.size(); ++i) {
if (_activeSpeaker != _speakerList[i])
- _speakerList[i]->proc16();
+ _speakerList[i]->stopSpeaking();
}
}
@@ -741,7 +754,7 @@ void StripManager::remove() {
}
if (_activeSpeaker) {
- if (g_vm->getGameID() == GType_Ringworld2)
+ if (g_vm->getGameID() == GType_Ringworld2)
static_cast<Ringworld2::VisualSpeaker *>(_activeSpeaker)->_speakerMode = 0xff;
_activeSpeaker->remove();
}
@@ -760,6 +773,15 @@ void StripManager::remove() {
Action::remove();
}
+void StripManager::dispatch() {
+ if (g_vm->getGameID() == GType_Ringworld2) {
+ if (_activeSpeaker)
+ _activeSpeaker->dispatch();
+ }
+
+ Action::dispatch();
+}
+
void StripManager::signal() {
int strIndex = 0;
@@ -768,14 +790,14 @@ void StripManager::signal() {
_textShown = false;
}
- if (_obj44Index < 0) {
+ if (_obj44ListIndex < 0) {
EventHandler *owner = _endHandler;
- int stripNum = ABS(_obj44Index);
+ int stripNum = ABS(_obj44ListIndex);
remove();
start(stripNum, owner);
return;
- } else if (_obj44Index == 10000) {
+ } else if (_obj44ListIndex == 10000) {
// Reached end of strip
EventHandler *endHandler = _endHandler;
remove();
@@ -792,7 +814,7 @@ void StripManager::signal() {
// Load the data for the strip
load();
- Obj44 &obj44 = _obj44List[_obj44Index];
+ Obj44 &obj44 = _obj44List[_obj44ListIndex];
if (g_vm->getGameID() == GType_Ringworld2) {
// Return to Ringworld specific handling
@@ -813,8 +835,8 @@ void StripManager::signal() {
break;
}
}
-
- _field2E8 = obj44._id;
+
+ _currObj44Id = obj44._id;
Common::StringArray choiceList;
// Build up a list of script entries
@@ -827,7 +849,7 @@ void StripManager::signal() {
int f16Index = _lookupList[obj44._field16[0] - 1];
int entryId = obj44._field16[f16Index];
- Obj0A &entry = obj44._list[idx];
+ Obj0A &entry = obj44._list[idx];
if (entry._id == entryId) {
// Get the next one
choiceList.push_back((const char *)&_script[0] + entry._scriptOffset);
@@ -855,7 +877,7 @@ void StripManager::signal() {
// Get the next one
const char *choiceStr = (const char *)&_script[0] + obj44._list[idx]._scriptOffset;
-
+
if (!*choiceStr) {
// Choice is empty
assert(g_vm->getGameID() == GType_Ringworld2);
@@ -863,7 +885,7 @@ void StripManager::signal() {
if (obj44._list[1]._id) {
// it's a reference to another list slot
int listId = obj44._list[idx]._id;
-
+
int obj44Idx = 0;
while (_obj44List[obj44Idx]._id != listId)
++obj44Idx;
@@ -873,7 +895,7 @@ void StripManager::signal() {
// seems to be set to the R2_GLOBALS._stripManager_lookupList, so manually set it
if (!_lookupList)
_lookupList = R2_GLOBALS._stripManager_lookupList;
-
+
int f16Index = _lookupList[_obj44List[obj44Idx]._field16[0] - 1];
listId = _obj44List[obj44Idx]._field16[f16Index];
@@ -908,7 +930,7 @@ void StripManager::signal() {
// Get the user to select a conversation option
strIndex = _choiceDialog.execute(choiceList);
- if ((delayFlag || choiceList.size() != 1) && !_field2E6)
+ if ((delayFlag || choiceList.size() != 1) && !_uselessFl)
_delayFrames = 1;
else {
Speaker *speakerP = getSpeaker((const char *)&_script[0] + obj44._speakerOffset);
@@ -925,7 +947,7 @@ void StripManager::signal() {
g_globals->_sceneManager._scene->loadScene(_sceneNumber);
}
- _activeSpeaker->proc12(this);
+ _activeSpeaker->startSpeaking(this);
}
if (_callbackObject) {
@@ -939,11 +961,11 @@ void StripManager::signal() {
if (g_vm->getGameID() == GType_Ringworld2) {
Ringworld2::VisualSpeaker *speaker = static_cast<Ringworld2::VisualSpeaker *>(_activeSpeaker);
-
+
if (speaker) {
speaker->_speakerMode = obj44._speakerMode;
if (!choiceList[strIndex].empty())
- speaker->proc15();
+ speaker->animateSpeaker();
}
if (!choiceList[strIndex].empty()) {
@@ -953,7 +975,7 @@ void StripManager::signal() {
_delayFrames = 1;
} else {
_delayFrames = 0;
- speaker->proc15();
+ speaker->animateSpeaker();
}
} else {
_textShown = true;
@@ -961,10 +983,10 @@ void StripManager::signal() {
}
}
- _obj44Index = getNewIndex(obj44._list[strIndex]._id);
- if (_obj44Index == 10001) {
+ _obj44ListIndex = getNewIndex(obj44._list[strIndex]._id);
+ if (_obj44ListIndex == 10001) {
MessageDialog::show("Strip Failure: Node not found", OK_BTN_STRING);
- _obj44Index = 0;
+ _obj44ListIndex = 0;
}
}
@@ -974,16 +996,16 @@ void StripManager::process(Event &event) {
return;
if ((event.eventType == EVENT_KEYPRESS) && (event.kbd.keycode == Common::KEYCODE_ESCAPE)) {
- if (_obj44Index != 10000) {
- int currIndex = _obj44Index;
- while (!_obj44List[_obj44Index]._list[1]._id) {
- _obj44Index = getNewIndex(_obj44List[_obj44Index]._list[0]._id);
- if ((_obj44Index < 0) || (_obj44Index == 10000))
+ if (_obj44ListIndex != 10000) {
+ int currIndex = _obj44ListIndex;
+ while (!_obj44List[_obj44ListIndex]._list[1]._id) {
+ _obj44ListIndex = getNewIndex(_obj44List[_obj44ListIndex]._list[0]._id);
+ if ((_obj44ListIndex < 0) || (_obj44ListIndex == 10000))
break;
- currIndex = _obj44Index;
+ currIndex = _obj44ListIndex;
}
- _field2E8 = _obj44List[currIndex]._id;
+ _currObj44Id = _obj44List[currIndex]._id;
}
// Signal the end of the strip
@@ -1079,7 +1101,7 @@ void Speaker::remove() {
SceneObjectList::deactivate();
}
-void Speaker::proc12(Action *action) {
+void Speaker::startSpeaking(Action *action) {
_action = action;
if (_newSceneNumber != -1) {
_oldSceneNumber = g_globals->_sceneManager._sceneNumber;
diff --git a/engines/tsage/converse.h b/engines/tsage/converse.h
index 5aef0d8a7f..3f4d14f785 100644
--- a/engines/tsage/converse.h
+++ b/engines/tsage/converse.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope 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.
@@ -91,10 +91,10 @@ public:
virtual Common::String getClassName() { return "Speaker"; }
virtual void synchronize(Serializer &s);
virtual void remove();
- virtual void proc12(Action *action);
+ virtual void startSpeaking(Action *action);
virtual void setText(const Common::String &msg);
virtual void removeText();
- virtual void proc16() {}
+ virtual void stopSpeaking() {}
void setTextPos(const Common::Point &pt) { _textPos = pt; }
};
@@ -212,8 +212,8 @@ private:
int getNewIndex(int newId);
public:
int _stripNum;
- int _obj44Index;
- int _field20;
+ int _obj44ListIndex;
+ int _useless;
int _sceneNumber;
Rect _sceneBounds;
ConversationChoiceDialog _choiceDialog;
@@ -221,8 +221,8 @@ public:
StripCallback *_callbackObject;
Speaker *_activeSpeaker;
bool _textShown;
- bool _field2E6;
- int _field2E8;
+ bool _uselessFl;
+ int _currObj44Id;
int _exitMode;
Common::Array<Obj44> _obj44List;
Common::Array<byte> _script;
@@ -237,6 +237,7 @@ public:
virtual void synchronize(Serializer &s);
virtual void remove();
+ virtual void dispatch();
virtual void signal();
virtual void process(Event &event);
diff --git a/engines/tsage/core.cpp b/engines/tsage/core.cpp
index 3332b12cf6..f35aa583e2 100644
--- a/engines/tsage/core.cpp
+++ b/engines/tsage/core.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope 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.
@@ -860,6 +860,8 @@ void PlayerMover::doStepsOfNpcMovement(const Common::Point &srcPos, const Common
int PlayerMover::calculateRestOfRoute(int *routeList, int srcRegion, int destRegion, bool &foundRoute) {
// Make a copy of the provided route. The first entry is the size.
int tempList[REGION_LIST_SIZE + 1];
+ memset(tempList, 0, sizeof(tempList));
+
foundRoute = false;
for (int idx = 0; idx <= *routeList; ++idx)
tempList[idx] = routeList[idx];
@@ -1151,6 +1153,13 @@ void PaletteRotation::signal() {
if (flag)
_currIndex = _start;
}
+
+ // Added in Return to Ringworld
+ if (_currIndex < _start) {
+ flag = decDuration();
+ if (flag)
+ _currIndex = _end;
+ }
break;
case 2:
_currIndex += _idxChange;
@@ -1292,7 +1301,6 @@ ScenePalette::ScenePalette() {
*palData++ = idx;
}
- _field412 = 0;
_redColor = _greenColor = _blueColor = 0;
_aquaColor = 0;
_purpleColor = 0;
@@ -1304,7 +1312,6 @@ ScenePalette::~ScenePalette() {
}
ScenePalette::ScenePalette(int paletteNum) {
- _field412 = 0;
_redColor = _greenColor = _blueColor = 0;
_aquaColor = 0;
_purpleColor = 0;
@@ -1536,7 +1543,11 @@ void ScenePalette::synchronize(Serializer &s) {
s.syncAsSint32LE(_colors.foreground);
s.syncAsSint32LE(_colors.background);
- s.syncAsSint32LE(_field412);
+ if (s.getVersion() < 12) {
+ int useless = 0;
+ s.syncAsSint32LE(useless);
+ }
+
s.syncAsByte(_redColor);
s.syncAsByte(_greenColor);
s.syncAsByte(_blueColor);
@@ -1552,8 +1563,13 @@ void SceneItem::synchronize(Serializer &s) {
_bounds.synchronize(s);
s.syncString(_msg);
- s.syncAsSint32LE(_fieldE);
- s.syncAsSint32LE(_field10);
+
+ if (s.getVersion() < 15) {
+ int useless = 0;
+ s.syncAsSint32LE(useless);
+ s.syncAsSint32LE(useless);
+ }
+
s.syncAsSint16LE(_position.x); s.syncAsSint32LE(_position.y);
s.syncAsSint16LE(_yDiff);
s.syncAsSint32LE(_sceneRegionId);
@@ -1577,12 +1593,12 @@ bool SceneItem::startAction(CursorType action, Event &event) {
}
void SceneItem::doAction(int action) {
- const char *msg = NULL;
-
if (g_vm->getGameID() == GType_Ringworld2) {
Event dummyEvent;
((Ringworld2::SceneExt *)GLOBALS._sceneManager._scene)->display((CursorType)action, dummyEvent);
} else {
+ const char *msg = NULL;
+
switch ((int)action) {
case CURSOR_LOOK:
msg = LOOK_SCENE_HOTSPOT;
@@ -1619,7 +1635,8 @@ void SceneItem::display(int resNum, int lineNum, ...) {
Common::String msg = (!resNum || (resNum == -1)) ? Common::String() :
g_resourceManager->getMessage(resNum, lineNum);
- if ((g_vm->getGameID() != GType_Ringworld) && T2_GLOBALS._uiElements._active)
+ if ((g_vm->getGameID() != GType_Ringworld) && (g_vm->getGameID() != GType_Ringworld2)
+ && T2_GLOBALS._uiElements._active)
T2_GLOBALS._uiElements.hide();
if (g_globals->_sceneObjects->contains(&g_globals->_sceneText)) {
@@ -1729,9 +1746,13 @@ void SceneItem::display(int resNum, int lineNum, ...) {
font.setFontNumber(g_globals->_sceneText._fontNumber);
font.getStringBounds(msg.c_str(), textRect, maxWidth);
+ Rect screenBounds = g_globals->gfxManager()._bounds;
+ if (g_vm->getGameID() == GType_Ringworld2)
+ screenBounds.collapse(20, 15);
+
// Center the text at the specified position, and then constrain it to be-
textRect.center(pos.x, pos.y);
- textRect.contain(g_globals->gfxManager()._bounds);
+ textRect.contain(screenBounds);
if (centerText) {
g_globals->_sceneText._color1 = g_globals->_sceneText._color2;
@@ -1783,6 +1804,9 @@ void SceneItem::display(int resNum, int lineNum, ...) {
if (!playList.empty()) {
R2_GLOBALS._playStream.play(*playList.begin(), NULL);
playList.pop_front();
+ } else if (!(R2_GLOBALS._speechSubtitles & SPEECH_TEXT)) {
+ // If not showing text, don't both waiting for a click to end
+ break;
}
}
}
@@ -1794,7 +1818,8 @@ void SceneItem::display(int resNum, int lineNum, ...) {
g_globals->_sceneText.remove();
}
- if ((g_vm->getGameID() != GType_Ringworld) && T2_GLOBALS._uiElements._active) {
+ if ((g_vm->getGameID() != GType_Ringworld) && (g_vm->getGameID() != GType_Ringworld2)
+ && T2_GLOBALS._uiElements._active) {
// Show user interface
T2_GLOBALS._uiElements.show();
@@ -2092,14 +2117,14 @@ SceneObject::SceneObject() : SceneHotspot() {
_shade = _oldShade = 0;
_linkedActor = NULL;
- _field8A = Common::Point(0, 0);
+ _actorDestPos = Common::Point(0, 0);
_angle = 0;
_xs = 0;
_xe = 0;
_endFrame = 0;
- _field68 = 0;
+ _loopCount = 0;
_regionIndex = 0;
- _field9C = NULL;
+ _shadowMap = NULL;
}
SceneObject::SceneObject(const SceneObject &so) : SceneHotspot() {
@@ -2346,7 +2371,7 @@ void SceneObject::animate(AnimateMode animMode, ...) {
case ANIM_MODE_1:
_frameChange = 1;
- _field2E = _position;
+ _oldPosition = _position;
_endAction = 0;
break;
@@ -2394,9 +2419,9 @@ void SceneObject::animate(AnimateMode animMode, ...) {
case ANIM_MODE_9:
if (_animateMode == ANIM_MODE_9 && g_vm->getGameID() == GType_Ringworld2) {
_frameChange = -1;
- _field2E = _position;
+ _oldPosition = _position;
} else {
- _field68 = va_arg(va, int);
+ _loopCount = va_arg(va, int);
_endAction = va_arg(va, Action *);
_frameChange = 1;
_endFrame = getFrameCount();
@@ -2463,7 +2488,7 @@ void SceneObject::synchronize(Serializer &s) {
s.syncAsUint32LE(_updateStartFrame);
s.syncAsUint32LE(_walkStartFrame);
- s.syncAsSint16LE(_field2E.x); s.syncAsSint16LE(_field2E.y);
+ s.syncAsSint16LE(_oldPosition.x); s.syncAsSint16LE(_oldPosition.y);
s.syncAsSint16LE(_percent);
s.syncAsSint16LE(_priority);
s.syncAsSint16LE(_angle);
@@ -2478,7 +2503,7 @@ void SceneObject::synchronize(Serializer &s) {
SYNC_ENUM(_animateMode, AnimateMode);
s.syncAsSint32LE(_frame);
s.syncAsSint32LE(_endFrame);
- s.syncAsSint32LE(_field68);
+ s.syncAsSint32LE(_loopCount);
s.syncAsSint32LE(_frameChange);
s.syncAsSint32LE(_numFrames);
s.syncAsSint32LE(_regionIndex);
@@ -2486,8 +2511,8 @@ void SceneObject::synchronize(Serializer &s) {
s.syncAsSint16LE(_moveDiff.x); s.syncAsSint16LE(_moveDiff.y);
s.syncAsSint32LE(_moveRate);
if (g_vm->getGameID() == GType_Ringworld2) {
- s.syncAsSint16LE(_field8A.x);
- s.syncAsSint16LE(_field8A.y);
+ s.syncAsSint16LE(_actorDestPos.x);
+ s.syncAsSint16LE(_actorDestPos.y);
}
SYNC_POINTER(_endAction);
s.syncAsUint32LE(_regionBitList);
@@ -2504,7 +2529,7 @@ void SceneObject::postInit(SceneObjectList *OwnerList) {
if (!OwnerList)
OwnerList = g_globals->_sceneObjects;
- bool isExisting = OwnerList->contains(this);
+ bool isExisting = OwnerList->contains(this);
if (!isExisting || ((_flags & OBJFLAG_REMOVE) != 0)) {
_percent = 100;
_priority = 255;
@@ -2565,9 +2590,9 @@ void SceneObject::dispatch() {
case ANIM_MODE_1:
if (isNoMover())
setFrame(1);
- else if ((_field2E.x != _position.x) || (_field2E.y != _position.y)) {
+ else if ((_oldPosition.x != _position.x) || (_oldPosition.y != _position.y)) {
setFrame(changeFrame());
- _field2E = _position;
+ _oldPosition = _position;
}
break;
@@ -2610,7 +2635,7 @@ void SceneObject::dispatch() {
_endFrame = 1;
setFrame(changeFrame());
- } else if (!_field68 || (--_field68 > 0)) {
+ } else if (!_loopCount || (--_loopCount > 0)) {
_frameChange = 1;
_endFrame = getFrameCount();
@@ -2629,7 +2654,7 @@ void SceneObject::dispatch() {
_frameChange = -1;
_strip = ((_strip - 1) ^ 1) + 1;
_endFrame = 1;
- } else if ((_field68 == 0) || (--_field68 != 0)) {
+ } else if (!_loopCount || (--_loopCount > 0)) {
_frameChange = 1;
_endFrame = getFrameCount();
@@ -2696,12 +2721,23 @@ GfxSurface SceneObject::getFrame() {
_visageImages.setVisage(_visage, _strip);
GfxSurface frame = _visageImages.getFrame(_frame);
+ // Reset any centroid adjustment flags, in
+ frame._flags &= ~(FRAME_FLIP_CENTROID_X | FRAME_FLIP_CENTROID_Y);
+
+ // For later games, check whether the appropriate object flags are set for flipping
+ if (g_vm->getGameID() != GType_Ringworld) {
+ if ((_flags & OBJFLAG_FLIP_CENTROID_X) || _visageImages._flipHoriz)
+ frame._flags |= FRAME_FLIP_CENTROID_X;
+ if ((_flags & OBJFLAG_FLIP_CENTROID_Y) || _visageImages._flipVert)
+ frame._flags |= FRAME_FLIP_CENTROID_Y;
+ }
+
// If shading is needed, post apply the shadiing onto the frame
if ((g_vm->getGameID() == GType_Ringworld2) && (_shade >= 1)) {
Graphics::Surface s = frame.lockSurface();
byte *p = (byte *)s.getPixels();
byte *endP = p + s.w * s.h;
-
+
while (p < endP) {
if (*p != frame._transColor)
*p = R2_GLOBALS._fadePaletteMap[_shade - 1][*p];
@@ -2715,7 +2751,14 @@ GfxSurface SceneObject::getFrame() {
}
void SceneObject::reposition() {
+ if (g_vm->getGameID() == GType_Ringworld2) {
+ if (!(_flags & OBJFLAG_ZOOMED)) {
+ setZoom(g_globals->_sceneManager._scene->_zoomPercents[MIN(_position.y, (int16)255)]);
+ }
+ }
+
GfxSurface frame = getFrame();
+
_bounds.resize(frame, _position.x, _position.y - _yDiff, _percent);
_xs = _bounds.left;
_xe = _bounds.right;
@@ -2726,11 +2769,27 @@ void SceneObject::reposition() {
*/
void SceneObject::draw() {
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);
+ Scene *scene = g_globals->_sceneManager._scene;
+ destRect.translate(-scene->_sceneBounds.left, -scene->_sceneBounds.top);
GfxSurface frame = getFrame();
- g_globals->gfxManager().copyFrom(frame, destRect, priorityRegion);
+ Region *priorityRegion = scene->_priorities.find(_priority);
+
+ if (g_vm->getGameID() == GType_Ringworld2) {
+ switch (_effect) {
+ case EFFECT_SHADOW_MAP: {
+ if (!_shadowMap)
+ _shadowMap = static_cast<Ringworld2::SceneExt *>(scene)->_shadowPaletteMap;
+
+ GLOBALS.gfxManager().getSurface().copyFrom(frame, frame.getBounds(),
+ destRect, priorityRegion, _shadowMap);
+ return;
+ }
+ default:
+ break;
+ }
+ }
+
+ GLOBALS.gfxManager().copyFrom(frame, destRect, priorityRegion);
}
/**
@@ -2832,12 +2891,14 @@ void BackgroundSceneObject::setup2(int visage, int stripFrameNum, int frameNum,
setFrame(frameNum);
setPosition(Common::Point(posX, posY));
fixPriority(priority);
+
+ _effect = effect;
}
void BackgroundSceneObject::copySceneToBackground() {
GLOBALS._sceneManager._scene->_backSurface.copyFrom(g_globals->gfxManager().getSurface(), 0, 0);
- // WORKAROUND: Since savegames don't store the active screen data, once we copy the
+ // WORKAROUND: Since savegames don't store the active screen data, once we copy the
// foreground objects to the background, we have to prevent the scene being saved.
if (g_vm->getGameID() == GType_Ringworld2)
((Ringworld2::SceneExt *)GLOBALS._sceneManager._scene)->_preventSaving = true;
@@ -2848,7 +2909,6 @@ void BackgroundSceneObject::copySceneToBackground() {
void SceneObjectList::draw() {
Common::Array<SceneObject *> objList;
int paneNum = 0;
- int xAmount = 0, yAmount = 0;
if (_objList.size() == 0) {
// Alternate draw mode
@@ -2875,6 +2935,7 @@ void SceneObjectList::draw() {
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;
+ int xAmount = 0, yAmount = 0;
if (objPos.x >= scrollerRect.right) {
xAmount = 8;
@@ -2903,8 +2964,9 @@ void SceneObjectList::draw() {
g_globals->_sceneManager._sceneBgOffset.y);
}
- // Set up the flag mask
- uint32 flagMask = (paneNum == 0) ? OBJFLAG_PANE_0 : OBJFLAG_PANE_1;
+ // Set up the flag mask. Currently, paneNum is always set to 0, so the check is meaningless
+ // uint32 flagMask = (paneNum == 0) ? OBJFLAG_PANE_0 : OBJFLAG_PANE_1;
+ uint32 flagMask = OBJFLAG_PANE_0;
// Initial loop to set up object list and update object position, priority, and flags
for (SynchronizedList<SceneObject *>::iterator i = g_globals->_sceneObjects->begin();
@@ -3307,7 +3369,6 @@ Player::Player(): SceneObject() {
_canWalk = false;
_enabled = false;
_uiEnabled = false;
- _field8C = 0;
// Return to Ringworld specific fields
_characterIndex = R2_NONE;
@@ -3326,15 +3387,11 @@ void Player::postInit(SceneObjectList *OwnerList) {
_canWalk = true;
_uiEnabled = true;
_percent = 100;
- _field8C = 10;
- if (g_vm->getGameID() != GType_Ringworld2)
- {
+ if (g_vm->getGameID() != GType_Ringworld2) {
_moveDiff.x = 4;
_moveDiff.y = 2;
- }
- else
- {
+ } else {
_moveDiff.x = 3;
_moveDiff.y = 2;
_effect = EFFECT_SHADED;
@@ -3442,7 +3499,10 @@ void Player::synchronize(Serializer &s) {
s.syncAsByte(_canWalk);
s.syncAsByte(_uiEnabled);
- s.syncAsSint16LE(_field8C);
+ if (s.getVersion() < 15) {
+ int useless = 0;
+ s.syncAsSint16LE(useless);
+ }
if (g_vm->getGameID() != GType_Ringworld)
s.syncAsByte(_enabled);
@@ -4190,7 +4250,6 @@ double FloatSet::sqrt(FloatSet &floatSet) {
GameHandler::GameHandler() : EventHandler() {
_nextWaitCtr = 1;
_waitCtr.setCtr(1);
- _field14 = 10;
}
GameHandler::~GameHandler() {
@@ -4212,7 +4271,11 @@ void GameHandler::synchronize(Serializer &s) {
_lockCtr.synchronize(s);
_waitCtr.synchronize(s);
s.syncAsSint16LE(_nextWaitCtr);
- s.syncAsSint16LE(_field14);
+
+ if (s.getVersion() < 14) {
+ int useless = 0;
+ s.syncAsSint16LE(useless);
+ }
}
/*--------------------------------------------------------------------------*/
@@ -4324,7 +4387,7 @@ void SceneHandler::process(Event &event) {
// Scan the item list to find one the mouse is within
SynchronizedList<SceneItem *>::iterator i;
for (i = g_globals->_sceneItems.begin(); i != g_globals->_sceneItems.end(); ++i) {
- SceneItem *item = *i;
+ SceneItem *item = *i;
if (item->contains(event.mousePos)) {
// Pass the action to the item
bool handled = item->startAction(g_globals->_events.getCursor(), event);
diff --git a/engines/tsage/core.h b/engines/tsage/core.h
index 2c88f6be79..8b1deadaeb 100644
--- a/engines/tsage/core.h
+++ b/engines/tsage/core.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope 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.
@@ -358,7 +358,6 @@ public:
byte _palette[256 * 3];
GfxColors _colors;
SynchronizedList<PaletteModifier *> _listeners;
- int _field412;
uint8 _redColor;
uint8 _greenColor;
@@ -410,12 +409,11 @@ class SceneItem : public EventHandler {
public:
Rect _bounds;
Common::String _msg;
- int _fieldE, _field10;
Common::Point _position;
int _yDiff;
int _sceneRegionId;
public:
- SceneItem() : EventHandler() { _msg = "Feature"; _action = NULL; _sceneRegionId = 0; _yDiff = 0; _fieldE = _field10 = 0;}
+ SceneItem() : EventHandler() { _msg = "Feature"; _action = NULL; _sceneRegionId = 0; _yDiff = 0;}
virtual void synchronize(Serializer &s);
virtual Common::String getClassName() { return "SceneItem"; }
@@ -466,8 +464,9 @@ enum AnimateMode {ANIM_MODE_NONE = 0, ANIM_MODE_1 = 1, ANIM_MODE_2 = 2, ANIM_MOD
ANIM_MODE_9 = 9
};
-enum Effect { EFFECT_NONE = 0, EFFECT_SHADED = 1, EFFECT_2 = 2, EFFECT_3 = 3,
- EFFECT_4 = 4, EFFECT_5 = 5 };
+// Actor effect enumeration used in Return to Ringworld 2
+enum Effect { EFFECT_NONE = 0, EFFECT_SHADED = 1, EFFECT_SMOKE = 3,
+ EFFECT_SHADOW_MAP = 5, EFFECT_SHADED2 = 6 };
class SceneObject;
@@ -514,7 +513,8 @@ public:
enum ObjectFlags {OBJFLAG_FIXED_PRIORITY = 1, OBJFLAG_NO_UPDATES = 2, OBJFLAG_ZOOMED = 4,
OBJFLAG_SUPPRESS_DISPATCH = 8, OBJFLAG_HIDE = 0x100, OBJFLAG_HIDING = 0x200, OBJFLAG_REMOVE = 0x400,
OBJFLAG_CLONED = 0x800, OBJFLAG_CHECK_REGION = 0x1000, OBJFLAG_PANE_0 = 0x4000, OBJFLAG_PANE_1 = 0x8000,
- OBJFLAG_PANES = OBJFLAG_PANE_0 | OBJFLAG_PANE_1
+ OBJFLAG_PANES = OBJFLAG_PANE_0 | OBJFLAG_PANE_1,
+ OBJFLAG_FLIP_CENTROID_X = 0x10000, OBJFLAG_FLIP_CENTROID_Y = 0x20000
};
class SceneObject : public SceneHotspot {
@@ -527,7 +527,7 @@ public:
int changeFrame();
uint32 _updateStartFrame;
uint32 _walkStartFrame;
- Common::Point _field2E;
+ Common::Point _oldPosition;
int _percent;
int _priority;
int _angle;
@@ -540,19 +540,19 @@ public:
AnimateMode _animateMode;
int _frame;
int _endFrame;
- int _field68;
+ int _loopCount;
int _frameChange;
int _numFrames;
int _regionIndex;
EventHandler *_mover;
Common::Point _moveDiff;
int _moveRate;
- Common::Point _field8A;
+ Common::Point _actorDestPos;
Action *_endAction;
uint32 _regionBitList;
// Ringworld 2 specific fields
- byte *_field9C;
+ byte *_shadowMap;
int _shade, _oldShade;
int _effect;
SceneObject *_linkedActor;
@@ -649,7 +649,6 @@ class Player : public SceneObject {
public:
bool _canWalk;
bool _uiEnabled;
- int _field8C;
bool _enabled;
// Return to Ringworld specific fields
@@ -776,8 +775,6 @@ public:
class ScenePriorities : public Common::List<Region> {
public:
int _resNum;
- int _field14;
- int _field16;
Region _defaultPriorityRegion;
public:
void load(int resNum);
@@ -883,7 +880,6 @@ public:
RefCounter _lockCtr;
RefCounter _waitCtr;
int _nextWaitCtr;
- int _field14;
public:
GameHandler();
virtual ~GameHandler();
diff --git a/engines/tsage/debugger.cpp b/engines/tsage/debugger.cpp
index 82645f2d62..b647807f8a 100644
--- a/engines/tsage/debugger.cpp
+++ b/engines/tsage/debugger.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope 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.
@@ -30,18 +30,19 @@
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));
+ registerCmd("continue", WRAP_METHOD(Debugger, cmdExit));
+ registerCmd("scene", WRAP_METHOD(Debugger, Cmd_Scene));
+ registerCmd("walk_regions", WRAP_METHOD(Debugger, Cmd_WalkRegions));
+ registerCmd("priority_regions", WRAP_METHOD(Debugger, Cmd_PriorityRegions));
+ registerCmd("scene_regions", WRAP_METHOD(Debugger, Cmd_SceneRegions));
+ registerCmd("setflag", WRAP_METHOD(Debugger, Cmd_SetFlag));
+ registerCmd("getflag", WRAP_METHOD(Debugger, Cmd_GetFlag));
+ registerCmd("clearflag", WRAP_METHOD(Debugger, Cmd_ClearFlag));
+ registerCmd("listobjects", WRAP_METHOD(Debugger, Cmd_ListObjects));
+ registerCmd("moveobject", WRAP_METHOD(Debugger, Cmd_MoveObject));
+ registerCmd("hotspots", WRAP_METHOD(Debugger, Cmd_Hotspots));
+ registerCmd("sound", WRAP_METHOD(Debugger, Cmd_Sound));
+ registerCmd("setdebug", WRAP_METHOD(Debugger, Cmd_SetDebug));
}
static int strToInt(const char *s) {
@@ -65,7 +66,7 @@ static int strToInt(const char *s) {
*/
bool Debugger::Cmd_Scene(int argc, const char **argv) {
if (argc < 2) {
- DebugPrintf("Usage: %s <scene number> [prior scene #]\n", argv[0]);
+ debugPrintf("Usage: %s <scene number> [prior scene #]\n", argv[0]);
return true;
}
@@ -81,7 +82,7 @@ bool Debugger::Cmd_Scene(int argc, const char **argv) {
*/
bool Debugger::Cmd_WalkRegions(int argc, const char **argv) {
if (argc != 1) {
- DebugPrintf("Usage: %s\n", argv[0]);
+ debugPrintf("Usage: %s\n", argv[0]);
return true;
}
@@ -119,8 +120,8 @@ bool Debugger::Cmd_WalkRegions(int argc, const char **argv) {
// Mark the scene as requiring a full redraw
g_globals->_paneRefreshFlag[0] = 2;
- DebugPrintf("Total regions = %d\n", g_globals->_walkRegions._regionList.size());
- DebugPrintf("%s\n", regionsDesc.c_str());
+ debugPrintf("Total regions = %d\n", g_globals->_walkRegions._regionList.size());
+ debugPrintf("%s\n", regionsDesc.c_str());
return false;
}
@@ -171,8 +172,8 @@ bool Debugger::Cmd_PriorityRegions(int argc, const char **argv) {
// Mark the scene as requiring a full redraw
g_globals->_paneRefreshFlag[0] = 2;
- DebugPrintf("Total regions = %d\n", count);
- DebugPrintf("%s", regionsDesc.c_str());
+ debugPrintf("Total regions = %d\n", count);
+ debugPrintf("%s", regionsDesc.c_str());
return true;
}
@@ -224,8 +225,8 @@ bool Debugger::Cmd_SceneRegions(int argc, const char **argv) {
// Mark the scene as requiring a full redraw
g_globals->_paneRefreshFlag[0] = 2;
- DebugPrintf("Total regions = %d\n", count);
- DebugPrintf("%s", regionsDesc.c_str());
+ debugPrintf("Total regions = %d\n", count);
+ debugPrintf("%s", regionsDesc.c_str());
return true;
}
@@ -236,7 +237,7 @@ bool Debugger::Cmd_SceneRegions(int argc, const char **argv) {
bool Debugger::Cmd_SetFlag(int argc, const char **argv) {
// Check for a flag to set
if (argc != 2) {
- DebugPrintf("Usage: %s <flag number>\n", argv[0]);
+ debugPrintf("Usage: %s <flag number>\n", argv[0]);
return true;
}
@@ -251,12 +252,12 @@ bool Debugger::Cmd_SetFlag(int argc, const char **argv) {
bool Debugger::Cmd_GetFlag(int argc, const char **argv) {
// Check for an flag to display
if (argc != 2) {
- DebugPrintf("Usage: %s <flag number>\n", argv[0]);
+ debugPrintf("Usage: %s <flag number>\n", argv[0]);
return true;
}
int flagNum = strToInt(argv[1]);
- DebugPrintf("Value: %d\n", g_globals->getFlag(flagNum));
+ debugPrintf("Value: %d\n", g_globals->getFlag(flagNum));
return true;
}
@@ -266,7 +267,7 @@ bool Debugger::Cmd_GetFlag(int argc, const char **argv) {
bool Debugger::Cmd_ClearFlag(int argc, const char **argv) {
// Check for a flag to clear
if (argc != 2) {
- DebugPrintf("Usage: %s <flag number>\n", argv[0]);
+ debugPrintf("Usage: %s <flag number>\n", argv[0]);
return true;
}
@@ -331,7 +332,7 @@ bool Debugger::Cmd_Hotspots(int argc, const char **argv) {
*/
bool Debugger::Cmd_Sound(int argc, const char **argv) {
if (argc != 2) {
- DebugPrintf("Usage: %s <sound number>\n", argv[0]);
+ debugPrintf("Usage: %s <sound number>\n", argv[0]);
return true;
}
@@ -340,16 +341,24 @@ bool Debugger::Cmd_Sound(int argc, const char **argv) {
return false;
}
+/**
+ * Activate internal debugger, when available
+ */
+bool Debugger::Cmd_SetDebug(int argc, const char **argv) {
+ debugPrintf("Not available in this game\n");
+ return true;
+}
+
/*
* This command lists the objects available, and their ID
*/
bool DemoDebugger::Cmd_ListObjects(int argc, const char **argv) {
- DebugPrintf("Not available in Demo\n");
+ debugPrintf("Not available in Demo\n");
return true;
}
bool DemoDebugger::Cmd_MoveObject(int argc, const char **argv) {
- DebugPrintf("Not available in Demo\n");
+ debugPrintf("Not available in Demo\n");
return true;
}
@@ -358,44 +367,44 @@ bool DemoDebugger::Cmd_MoveObject(int argc, const char **argv) {
*/
bool RingworldDebugger::Cmd_ListObjects(int argc, const char **argv) {
if (argc != 1) {
- DebugPrintf("Usage: %s\n", argv[0]);
+ debugPrintf("Usage: %s\n", argv[0]);
return true;
}
- DebugPrintf("Available objects for this game are:\n");
- DebugPrintf("0 - Stunner\n");
- DebugPrintf("1 - Scanner\n");
- DebugPrintf("2 - Stasis Box\n");
- DebugPrintf("3 - Info Disk\n");
- DebugPrintf("4 - Stasis Negator\n");
- DebugPrintf("5 - Key Device\n");
- DebugPrintf("6 - Medkit\n");
- DebugPrintf("7 - Ladder\n");
- DebugPrintf("8 - Rope\n");
- DebugPrintf("9 - Key\n");
- DebugPrintf("10 - Translator\n");
- DebugPrintf("11 - Ale\n");
- DebugPrintf("12 - Paper\n");
- DebugPrintf("13 - Waldos\n");
- DebugPrintf("14 - Stasis Box 2\n");
- DebugPrintf("15 - Ring\n");
- DebugPrintf("16 - Cloak\n");
- DebugPrintf("17 - Tunic\n");
- DebugPrintf("18 - Candle\n");
- DebugPrintf("19 - Straw\n");
- DebugPrintf("20 - Scimitar\n");
- DebugPrintf("21 - Sword\n");
- DebugPrintf("22 - Helmet\n");
- DebugPrintf("23 - Items\n");
- DebugPrintf("24 - Concentrator\n");
- DebugPrintf("25 - Nullifier\n");
- DebugPrintf("26 - Peg\n");
- DebugPrintf("27 - Vial\n");
- DebugPrintf("28 - Jacket\n");
- DebugPrintf("29 - Tunic 2\n");
- DebugPrintf("30 - Bone\n");
- DebugPrintf("31 - Empty Jar\n");
- DebugPrintf("32 - Jar\n");
+ debugPrintf("Available objects for this game are:\n");
+ debugPrintf("0 - Stunner\n");
+ debugPrintf("1 - Scanner\n");
+ debugPrintf("2 - Stasis Box\n");
+ debugPrintf("3 - Info Disk\n");
+ debugPrintf("4 - Stasis Negator\n");
+ debugPrintf("5 - Key Device\n");
+ debugPrintf("6 - Medkit\n");
+ debugPrintf("7 - Ladder\n");
+ debugPrintf("8 - Rope\n");
+ debugPrintf("9 - Key\n");
+ debugPrintf("10 - Translator\n");
+ debugPrintf("11 - Ale\n");
+ debugPrintf("12 - Paper\n");
+ debugPrintf("13 - Waldos\n");
+ debugPrintf("14 - Stasis Box 2\n");
+ debugPrintf("15 - Ring\n");
+ debugPrintf("16 - Cloak\n");
+ debugPrintf("17 - Tunic\n");
+ debugPrintf("18 - Candle\n");
+ debugPrintf("19 - Straw\n");
+ debugPrintf("20 - Scimitar\n");
+ debugPrintf("21 - Sword\n");
+ debugPrintf("22 - Helmet\n");
+ debugPrintf("23 - Items\n");
+ debugPrintf("24 - Concentrator\n");
+ debugPrintf("25 - Nullifier\n");
+ debugPrintf("26 - Peg\n");
+ debugPrintf("27 - Vial\n");
+ debugPrintf("28 - Jacket\n");
+ debugPrintf("29 - Tunic 2\n");
+ debugPrintf("30 - Bone\n");
+ debugPrintf("31 - Empty Jar\n");
+ debugPrintf("32 - Jar\n");
return true;
}
@@ -405,8 +414,8 @@ bool RingworldDebugger::Cmd_ListObjects(int argc, const char **argv) {
bool RingworldDebugger::Cmd_MoveObject(int argc, const char **argv) {
// Check for a flag to clear
if ((argc < 2) || (argc > 3)){
- DebugPrintf("Usage: %s <object number> [<scene number>]\n", argv[0]);
- DebugPrintf("If no scene is specified, the object will be added to inventory\n");
+ debugPrintf("Usage: %s <object number> [<scene number>]\n", argv[0]);
+ debugPrintf("If no scene is specified, the object will be added to inventory\n");
return true;
}
@@ -516,7 +525,7 @@ bool RingworldDebugger::Cmd_MoveObject(int argc, const char **argv) {
RING_INVENTORY._jar._sceneNumber = sceneNum;
break;
default:
- DebugPrintf("Invalid object Id %s\n", argv[1]);
+ debugPrintf("Invalid object Id %s\n", argv[1]);
break;
}
@@ -528,83 +537,83 @@ bool RingworldDebugger::Cmd_MoveObject(int argc, const char **argv) {
*/
bool BlueForceDebugger::Cmd_ListObjects(int argc, const char **argv) {
if (argc != 1) {
- DebugPrintf("Usage: %s\n", argv[0]);
+ debugPrintf("Usage: %s\n", argv[0]);
return true;
}
- DebugPrintf("Available objects for this game are:\n");
- DebugPrintf("1 - INV_COLT45\n");
- DebugPrintf("2 - INV_AMMO_CLIP\n");
- DebugPrintf("3 - INV_SPARE_CLIP\n");
- DebugPrintf("4 - INV_HANDCUFFS\n");
- DebugPrintf("5 - INV_GREENS_GUN\n");
- DebugPrintf("6 - INV_TICKET_BOOK\n");
- DebugPrintf("7 - INV_MIRANDA_CARD\n");
- DebugPrintf("8 - INV_FOREST_RAP\n");
- DebugPrintf("9 - INV_GREEN_ID\n");
- DebugPrintf("10 - INV_BASEBALL_CARD\n");
- DebugPrintf("11 - INV_BOOKING_GREEN\n");
- DebugPrintf("12 - INV_FLARE\n");
- DebugPrintf("13 - INV_COBB_RAP\n");
- DebugPrintf("14 - INV_22_BULLET\n");
- DebugPrintf("15 - INV_AUTO_RIFLE\n");
- DebugPrintf("16 - INV_WIG\n");
- DebugPrintf("17 - INV_FRANKIE_ID\n");
- DebugPrintf("18 - INV_TYRONE_ID\n");
- DebugPrintf("19 - INV_22_SNUB\n");
- DebugPrintf("20 - INV_BOOKING_FRANKIE\n");
- DebugPrintf("21 - INV_BOOKING_GANG\n");
- DebugPrintf("22 - INV_FBI_TELETYPE\n");
- DebugPrintf("23 - INV_DA_NOTE\n");
- DebugPrintf("24 - INV_PRINT_OUT\n");
- DebugPrintf("25 - INV_WAREHOUSE_KEYS\n");
- DebugPrintf("26 - INV_CENTER_PUNCH\n");
- DebugPrintf("27 - INV_TRANQ_GUN\n");
- DebugPrintf("28 - INV_HOOK\n");
- DebugPrintf("29 - INV_RAGS\n");
- DebugPrintf("30 - INV_JAR\n");
- DebugPrintf("31 - INV_SCREWDRIVER\n");
- DebugPrintf("32 - INV_D_FLOPPY\n");
- DebugPrintf("33 - INV_BLANK_DISK\n");
- DebugPrintf("34 - INV_STICK\n");
- DebugPrintf("35 - INV_CRATE1\n");
- DebugPrintf("36 - INV_CRATE2\n");
- DebugPrintf("37 - INV_SHOEBOX\n");
- DebugPrintf("38 - INV_BADGE\n");
- DebugPrintf("39 - INV_RENTAL_COUPON\n");
- DebugPrintf("40 - INV_NICKEL\n");
- DebugPrintf("41 - INV_LYLE_CARD\n");
- DebugPrintf("42 - INV_CARTER_NOTE\n");
- DebugPrintf("43 - INV_MUG_SHOT\n");
- DebugPrintf("44 - INV_CLIPPING\n");
- DebugPrintf("45 - INV_MICROFILM \n");
- DebugPrintf("46 - INV_WAVE_KEYS\n");
- DebugPrintf("47 - INV_RENTAL_KEYS\n");
- DebugPrintf("48 - INV_NAPKIN\n");
- DebugPrintf("49 - INV_DMV_PRINTOUT\n");
- DebugPrintf("50 - INV_FISHING_NET\n");
- DebugPrintf("51 - INV_ID\n");
- DebugPrintf("52 - INV_9MM_BULLETS\n");
- DebugPrintf("53 - INV_SCHEDULE\n");
- DebugPrintf("54 - INV_GRENADES\n");
- DebugPrintf("55 - INV_YELLOW_CORD\n");
- DebugPrintf("56 - INV_HALF_YELLOW_CORD\n");
- DebugPrintf("57 - INV_BLACK_CORD\n");
- DebugPrintf("58 - INV_HALF_BLACK_CORD\n");
- DebugPrintf("59 - INV_WARRANT\n");
- DebugPrintf("60 - INV_JACKET\n");
- DebugPrintf("61 - INV_GREENS_KNIFE\n");
- DebugPrintf("62 - INV_DOG_WHISTLE\n");
- DebugPrintf("63 - INV_AMMO_BELT\n");
- DebugPrintf("64 - INV_CARAVAN_KEY\n");
+ debugPrintf("Available objects for this game are:\n");
+ debugPrintf("1 - INV_COLT45\n");
+ debugPrintf("2 - INV_AMMO_CLIP\n");
+ debugPrintf("3 - INV_SPARE_CLIP\n");
+ debugPrintf("4 - INV_HANDCUFFS\n");
+ debugPrintf("5 - INV_GREENS_GUN\n");
+ debugPrintf("6 - INV_TICKET_BOOK\n");
+ debugPrintf("7 - INV_MIRANDA_CARD\n");
+ debugPrintf("8 - INV_FOREST_RAP\n");
+ debugPrintf("9 - INV_GREEN_ID\n");
+ debugPrintf("10 - INV_BASEBALL_CARD\n");
+ debugPrintf("11 - INV_BOOKING_GREEN\n");
+ debugPrintf("12 - INV_FLARE\n");
+ debugPrintf("13 - INV_COBB_RAP\n");
+ debugPrintf("14 - INV_22_BULLET\n");
+ debugPrintf("15 - INV_AUTO_RIFLE\n");
+ debugPrintf("16 - INV_WIG\n");
+ debugPrintf("17 - INV_FRANKIE_ID\n");
+ debugPrintf("18 - INV_TYRONE_ID\n");
+ debugPrintf("19 - INV_22_SNUB\n");
+ debugPrintf("20 - INV_BOOKING_FRANKIE\n");
+ debugPrintf("21 - INV_BOOKING_GANG\n");
+ debugPrintf("22 - INV_FBI_TELETYPE\n");
+ debugPrintf("23 - INV_DA_NOTE\n");
+ debugPrintf("24 - INV_PRINT_OUT\n");
+ debugPrintf("25 - INV_WAREHOUSE_KEYS\n");
+ debugPrintf("26 - INV_CENTER_PUNCH\n");
+ debugPrintf("27 - INV_TRANQ_GUN\n");
+ debugPrintf("28 - INV_HOOK\n");
+ debugPrintf("29 - INV_RAGS\n");
+ debugPrintf("30 - INV_JAR\n");
+ debugPrintf("31 - INV_SCREWDRIVER\n");
+ debugPrintf("32 - INV_D_FLOPPY\n");
+ debugPrintf("33 - INV_BLANK_DISK\n");
+ debugPrintf("34 - INV_STICK\n");
+ debugPrintf("35 - INV_CRATE1\n");
+ debugPrintf("36 - INV_CRATE2\n");
+ debugPrintf("37 - INV_SHOEBOX\n");
+ debugPrintf("38 - INV_BADGE\n");
+ debugPrintf("39 - INV_RENTAL_COUPON\n");
+ debugPrintf("40 - INV_NICKEL\n");
+ debugPrintf("41 - INV_LYLE_CARD\n");
+ debugPrintf("42 - INV_CARTER_NOTE\n");
+ debugPrintf("43 - INV_MUG_SHOT\n");
+ debugPrintf("44 - INV_CLIPPING\n");
+ debugPrintf("45 - INV_MICROFILM \n");
+ debugPrintf("46 - INV_WAVE_KEYS\n");
+ debugPrintf("47 - INV_RENTAL_KEYS\n");
+ debugPrintf("48 - INV_NAPKIN\n");
+ debugPrintf("49 - INV_DMV_PRINTOUT\n");
+ debugPrintf("50 - INV_FISHING_NET\n");
+ debugPrintf("51 - INV_ID\n");
+ debugPrintf("52 - INV_9MM_BULLETS\n");
+ debugPrintf("53 - INV_SCHEDULE\n");
+ debugPrintf("54 - INV_GRENADES\n");
+ debugPrintf("55 - INV_YELLOW_CORD\n");
+ debugPrintf("56 - INV_HALF_YELLOW_CORD\n");
+ debugPrintf("57 - INV_BLACK_CORD\n");
+ debugPrintf("58 - INV_HALF_BLACK_CORD\n");
+ debugPrintf("59 - INV_WARRANT\n");
+ debugPrintf("60 - INV_JACKET\n");
+ debugPrintf("61 - INV_GREENS_KNIFE\n");
+ debugPrintf("62 - INV_DOG_WHISTLE\n");
+ debugPrintf("63 - INV_AMMO_BELT\n");
+ debugPrintf("64 - INV_CARAVAN_KEY\n");
return true;
}
bool BlueForceDebugger::Cmd_MoveObject(int argc, const char **argv) {
// Check for a flag to clear
if ((argc < 2) || (argc > 3)){
- DebugPrintf("Usage: %s <object number> [<scene number>]\n", argv[0]);
- DebugPrintf("If no scene is specified, the object will be added to inventory\n");
+ debugPrintf("Usage: %s <object number> [<scene number>]\n", argv[0]);
+ debugPrintf("If no scene is specified, the object will be added to inventory\n");
return true;
}
@@ -616,7 +625,7 @@ bool BlueForceDebugger::Cmd_MoveObject(int argc, const char **argv) {
if ((objNum > 0) && (objNum < 65))
BF_INVENTORY.setObjectScene(objNum, sceneNum);
else
- DebugPrintf("Invalid object Id %s\n", argv[1]);
+ debugPrintf("Invalid object Id %s\n", argv[1]);
return true;
}
@@ -626,63 +635,63 @@ bool BlueForceDebugger::Cmd_MoveObject(int argc, const char **argv) {
*/
bool Ringworld2Debugger::Cmd_ListObjects(int argc, const char **argv) {
if (argc != 1) {
- DebugPrintf("Usage: %s\n", argv[0]);
+ debugPrintf("Usage: %s\n", argv[0]);
return true;
}
- DebugPrintf("Available objects for this game are:\n");
- DebugPrintf("1 - R2_OPTO_DISK\n");
- DebugPrintf("2 - R2_2\n");
- DebugPrintf("3 - R2_NEGATOR_GUN\n");
- DebugPrintf("4 - R2_STEPPING_DISKS\n");
- DebugPrintf("5 - R2_5\n");
- DebugPrintf("6 - R2_6\n");
- DebugPrintf("7 - R2_7\n");
- DebugPrintf("8 - R2_8\n");
- DebugPrintf("9 - R2_9\n");
- DebugPrintf("10 - R2_10\n");
- DebugPrintf("11 - R2_11\n");
- DebugPrintf("12 - R2_12\n");
- DebugPrintf("13 - R2_13\n");
- DebugPrintf("14 - R2_14\n");
- DebugPrintf("15 - R2_15\n");
- DebugPrintf("16 - R2_16\n");
- DebugPrintf("17 - R2_17\n");
- DebugPrintf("18 - R2_18\n");
- DebugPrintf("19 - R2_19\n");
- DebugPrintf("20 - R2_20\n");
- DebugPrintf("21 - R2_21\n");
- DebugPrintf("22 - R2_22\n");
- DebugPrintf("23 - R2_23\n");
- DebugPrintf("24 - R2_24\n");
- DebugPrintf("25 - R2_25\n");
- DebugPrintf("26 - R2_26\n");
- DebugPrintf("27 - R2_27\n");
- DebugPrintf("28 - R2_28\n");
- DebugPrintf("29 - R2_29\n");
- DebugPrintf("30 - R2_30\n");
- DebugPrintf("31 - R2_31\n");
- DebugPrintf("32 - R2_32\n");
- DebugPrintf("33 - R2_33\n");
- DebugPrintf("34 - R2_34\n");
- DebugPrintf("35 - R2_35\n");
- DebugPrintf("36 - R2_36\n");
- DebugPrintf("37 - R2_37\n");
- DebugPrintf("38 - R2_38\n");
- DebugPrintf("39 - R2_39\n");
- DebugPrintf("40 - R2_40\n");
- DebugPrintf("41 - R2_41\n");
- DebugPrintf("42 - R2_42\n");
- DebugPrintf("43 - R2_43\n");
- DebugPrintf("44 - R2_44\n");
- DebugPrintf("45 - R2_45\n");
- DebugPrintf("46 - R2_46\n");
- DebugPrintf("47 - R2_47\n");
- DebugPrintf("48 - R2_48\n");
- DebugPrintf("49 - R2_49\n");
- DebugPrintf("50 - R2_50\n");
- DebugPrintf("51 - R2_51\n");
- DebugPrintf("52 - R2_52\n");
+ debugPrintf("Available objects for this game are:\n");
+ debugPrintf("1 - Scene %d - R2_OPTO_DISK\n", BF_INVENTORY.getObjectScene(1));
+ debugPrintf("2 - Scene %d - R2_READER\n", BF_INVENTORY.getObjectScene(2));
+ debugPrintf("3 - Scene %d - R2_NEGATOR_GUN\n", BF_INVENTORY.getObjectScene(3));
+ debugPrintf("4 - Scene %d - R2_STEPPING_DISKS\n", BF_INVENTORY.getObjectScene(4));
+ debugPrintf("5 - Scene %d - R2_ATTRACTOR_UNIT\n", BF_INVENTORY.getObjectScene(5));
+ debugPrintf("6 - Scene %d - R2_SENSOR_PROBE\n", BF_INVENTORY.getObjectScene(6));
+ debugPrintf("7 - Scene %d - R2_SONIC_STUNNER\n", BF_INVENTORY.getObjectScene(7));
+ debugPrintf("8 - Scene %d - R2_CABLE_HARNESS\n", BF_INVENTORY.getObjectScene(8));
+ debugPrintf("9 - Scene %d - R2_COM_SCANNER\n", BF_INVENTORY.getObjectScene(9));
+ debugPrintf("10 - Scene %d - R2_SPENT_POWER_CAPSULE\n", BF_INVENTORY.getObjectScene(10));
+ debugPrintf("11 - Scene %d - R2_CHARGED_POWER_CAPSULE\n", BF_INVENTORY.getObjectScene(11));
+ debugPrintf("12 - Scene %d - R2_AEROSOL\n", BF_INVENTORY.getObjectScene(12));
+ debugPrintf("13 - Scene %d - R2_REMOTE_CONTROL\n", BF_INVENTORY.getObjectScene(13));
+ debugPrintf("14 - Scene %d - R2_OPTICAL_FIBER\n", BF_INVENTORY.getObjectScene(14));
+ debugPrintf("15 - Scene %d - R2_CLAMP\n", BF_INVENTORY.getObjectScene(15));
+ debugPrintf("16 - Scene %d - R2_ATTRACTOR_CABLE_HARNESS\n", BF_INVENTORY.getObjectScene(16));
+ debugPrintf("17 - Scene %d - R2_FUEL_CELL\n", BF_INVENTORY.getObjectScene(17));
+ debugPrintf("18 - Scene %d - R2_GYROSCOPE\n", BF_INVENTORY.getObjectScene(18));
+ debugPrintf("19 - Scene %d - R2_AIRBAG\n", BF_INVENTORY.getObjectScene(19));
+ debugPrintf("20 - Scene %d - R2_REBREATHER_TANK\n", BF_INVENTORY.getObjectScene(20));
+ debugPrintf("21 - Scene %d - R2_RESERVE_REBREATHER_TANK\n", BF_INVENTORY.getObjectScene(21));
+ debugPrintf("22 - Scene %d - R2_GUIDANCE_MODULE\n", BF_INVENTORY.getObjectScene(22));
+ debugPrintf("23 - Scene %d - R2_THRUSTER_VALVE\n", BF_INVENTORY.getObjectScene(23));
+ debugPrintf("24 - Scene %d - R2_BALLOON_BACKPACK\n", BF_INVENTORY.getObjectScene(24));
+ debugPrintf("25 - Scene %d - R2_RADAR_MECHANISM\n", BF_INVENTORY.getObjectScene(25));
+ debugPrintf("26 - Scene %d - R2_JOYSTICK\n", BF_INVENTORY.getObjectScene(26));
+ debugPrintf("27 - Scene %d - R2_IGNITOR\n", BF_INVENTORY.getObjectScene(27));
+ debugPrintf("28 - Scene %d - R2_DIAGNOSTICS_DISPLAY\n", BF_INVENTORY.getObjectScene(28));
+ debugPrintf("29 - Scene %d - R2_GLASS_DOME\n", BF_INVENTORY.getObjectScene(29));
+ debugPrintf("30 - Scene %d - R2_WICK_LAMP\n", BF_INVENTORY.getObjectScene(30));
+ debugPrintf("31 - Scene %d - R2_SCRITH_KEY\n", BF_INVENTORY.getObjectScene(31));
+ debugPrintf("32 - Scene %d - R2_TANNER_MASK\n", BF_INVENTORY.getObjectScene(32));
+ debugPrintf("33 - Scene %d - R2_PURE_GRAIN_ALCOHOL\n", BF_INVENTORY.getObjectScene(33));
+ debugPrintf("34 - Scene %d - R2_SAPPHIRE_BLUE\n", BF_INVENTORY.getObjectScene(34));
+ debugPrintf("35 - Scene %d - R2_ANCIENT_SCROLLS\n", BF_INVENTORY.getObjectScene(35));
+ debugPrintf("36 - Scene %d - R2_FLUTE\n", BF_INVENTORY.getObjectScene(36));
+ debugPrintf("37 - Scene %d - R2_GUNPOWDER\n", BF_INVENTORY.getObjectScene(37));
+ debugPrintf("38 - Scene %d - R2_NONAME\n", BF_INVENTORY.getObjectScene(38));
+ debugPrintf("39 - Scene %d - R2_COM_SCANNER_2\n", BF_INVENTORY.getObjectScene(39));
+ debugPrintf("40 - Scene %d - R2_SUPERCONDUCTOR_WIRE\n", BF_INVENTORY.getObjectScene(40));
+ debugPrintf("41 - Scene %d - R2_PILLOW\n", BF_INVENTORY.getObjectScene(41));
+ debugPrintf("42 - Scene %d - R2_FOOD_TRAY\n", BF_INVENTORY.getObjectScene(42));
+ debugPrintf("43 - Scene %d - R2_LASER_HACKSAW\n", BF_INVENTORY.getObjectScene(43));
+ debugPrintf("44 - Scene %d - R2_PHOTON_STUNNER\n", BF_INVENTORY.getObjectScene(44));
+ debugPrintf("45 - Scene %d - R2_BATTERY\n", BF_INVENTORY.getObjectScene(45));
+ debugPrintf("46 - Scene %d - R2_SOAKED_FACEMASK\n", BF_INVENTORY.getObjectScene(46));
+ debugPrintf("47 - Scene %d - R2_LIGHT_BULB\n", BF_INVENTORY.getObjectScene(47));
+ debugPrintf("48 - Scene %d - R2_ALCOHOL_LAMP\n", BF_INVENTORY.getObjectScene(48));
+ debugPrintf("49 - Scene %d - R2_ALCOHOL_LAMP_2\n", BF_INVENTORY.getObjectScene(49));
+ debugPrintf("50 - Scene %d - R2_ALCOHOL_LAMP_3\n", BF_INVENTORY.getObjectScene(50));
+ debugPrintf("51 - Scene %d - R2_BROKEN_DISPLAY\n", BF_INVENTORY.getObjectScene(51));
+ debugPrintf("52 - Scene %d - R2_TOOLBOX\n", BF_INVENTORY.getObjectScene(52));
return true;
}
@@ -690,8 +699,8 @@ bool Ringworld2Debugger::Cmd_ListObjects(int argc, const char **argv) {
bool Ringworld2Debugger::Cmd_MoveObject(int argc, const char **argv) {
// Check for a flag to clear
if ((argc < 2) || (argc > 3)){
- DebugPrintf("Usage: %s <object number> [<scene number>]\n", argv[0]);
- DebugPrintf("If no scene is specified, the object will be added to inventory\n");
+ debugPrintf("Usage: %s <object number> [<scene number>]\n", argv[0]);
+ debugPrintf("If no scene is specified, the object will be added to inventory\n");
return true;
}
@@ -703,8 +712,23 @@ bool Ringworld2Debugger::Cmd_MoveObject(int argc, const char **argv) {
if ((objNum > 0) && (objNum < 53))
R2_INVENTORY.setObjectScene(objNum, sceneNum);
else
- DebugPrintf("Invalid object Id %s\n", argv[1]);
+ debugPrintf("Invalid object Id %s\n", argv[1]);
+
+ return true;
+}
+
+/**
+ * Activate internal debugger, when available
+ */
+bool Ringworld2Debugger::Cmd_SetDebug(int argc, const char **argv) {
+ if (argc != 1) {
+ debugPrintf("Usage: %s\n", argv[0]);
+ return true;
+ }
+ // Set the internal debugger flag(s?) to true
+ // _debugCardGame is reset by scene1337::subPostInit()
+ R2_GLOBALS._debugCardGame = true;
return true;
}
} // End of namespace TsAGE
diff --git a/engines/tsage/debugger.h b/engines/tsage/debugger.h
index bf826a3f77..610f45de64 100644
--- a/engines/tsage/debugger.h
+++ b/engines/tsage/debugger.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope 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.
@@ -45,6 +45,7 @@ protected:
bool Cmd_Sound(int argc, const char **argv);
virtual bool Cmd_ListObjects(int argc, const char **argv) = 0;
virtual bool Cmd_MoveObject(int argc, const char **argv) = 0;
+ virtual bool Cmd_SetDebug(int argc, const char **argv);
};
class DemoDebugger : public Debugger {
@@ -69,6 +70,7 @@ class Ringworld2Debugger : public Debugger {
protected:
virtual bool Cmd_ListObjects(int argc, const char **argv);
virtual bool Cmd_MoveObject(int argc, const char **argv);
+ virtual bool Cmd_SetDebug(int argc, const char **argv);
};
} // End of namespace TsAGE
diff --git a/engines/tsage/detection.cpp b/engines/tsage/detection.cpp
index a35d663b93..9d61b4d182 100644
--- a/engines/tsage/detection.cpp
+++ b/engines/tsage/detection.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope 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.
@@ -75,7 +75,6 @@ class TSageMetaEngine : public AdvancedMetaEngine {
public:
TSageMetaEngine() : AdvancedMetaEngine(TsAGE::gameDescriptions, sizeof(TsAGE::tSageGameDescription), tSageGameTitles) {
_singleid = "tsage";
- _guioptions = GUIO1(GUIO_NOSPEECH);
}
virtual const char *getName() const {
@@ -130,10 +129,10 @@ public:
if (in) {
if (TsAGE::Saver::readSavegameHeader(in, header)) {
- saveList.push_back(SaveStateDescriptor(slot, header.saveName));
+ saveList.push_back(SaveStateDescriptor(slot, header._saveName));
- header.thumbnail->free();
- delete header.thumbnail;
+ header._thumbnail->free();
+ delete header._thumbnail;
}
delete in;
@@ -163,11 +162,11 @@ public:
delete f;
// Create the return descriptor
- SaveStateDescriptor desc(slot, header.saveName);
- 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);
+ SaveStateDescriptor desc(slot, header._saveName);
+ 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;
}
@@ -177,7 +176,7 @@ public:
};
#if PLUGIN_ENABLED_DYNAMIC(TSAGE)
-REGISTER_PLUGIN_DYNAMIC(TSAGE, PLUGIN_TYPE_ENGINE, TSageMetaEngine);
+ REGISTER_PLUGIN_DYNAMIC(TSAGE, PLUGIN_TYPE_ENGINE, TSageMetaEngine);
#else
-REGISTER_PLUGIN_STATIC(TSAGE, PLUGIN_TYPE_ENGINE, TSageMetaEngine);
+ REGISTER_PLUGIN_STATIC(TSAGE, PLUGIN_TYPE_ENGINE, TSageMetaEngine);
#endif
diff --git a/engines/tsage/detection_tables.h b/engines/tsage/detection_tables.h
index b374dbc98b..da283a27e7 100644
--- a/engines/tsage/detection_tables.h
+++ b/engines/tsage/detection_tables.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope 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.
@@ -165,13 +165,26 @@ static const tSageGameDescription gameDescriptions[] = {
AD_ENTRY1s("r2rw.rlb", "df6c25622387007788ca36d99362c1f0", 47586928),
Common::EN_ANY,
Common::kPlatformDOS,
- ADGF_CD | ADGF_UNSTABLE,
+ ADGF_CD | ADGF_TESTING,
GUIO0()
},
GType_Ringworld2,
GF_CD | GF_ALT_REGIONS
},
-
+ // Return to Ringworld - Demo
+ {
+ {
+ "ringworld2",
+ "CD Demo",
+ AD_ENTRY1s("r2rw.rlb", "c8e1a82c67c3caf57368eadde13dc15f", 32384464),
+ Common::EN_ANY,
+ Common::kPlatformDOS,
+ ADGF_CD | ADGF_TESTING,
+ GUIO0()
+ },
+ GType_Ringworld2,
+ GF_CD | GF_ALT_REGIONS | GF_DEMO
+ },
{ AD_TABLE_END_MARKER, 0, 0 }
};
diff --git a/engines/tsage/dialogs.cpp b/engines/tsage/dialogs.cpp
index 43833f53b9..dd4bc6aa86 100644
--- a/engines/tsage/dialogs.cpp
+++ b/engines/tsage/dialogs.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope 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.
diff --git a/engines/tsage/dialogs.h b/engines/tsage/dialogs.h
index 33b55093d0..8ab37f6c93 100644
--- a/engines/tsage/dialogs.h
+++ b/engines/tsage/dialogs.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope 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.
diff --git a/engines/tsage/events.cpp b/engines/tsage/events.cpp
index d2d8464763..0491c043a4 100644
--- a/engines/tsage/events.cpp
+++ b/engines/tsage/events.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope 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.
@@ -71,7 +71,7 @@ bool EventsClass::pollEvent() {
break;
default:
- break;
+ break;
}
return true;
@@ -156,7 +156,7 @@ void EventsClass::setCursor(CursorType cursorType) {
// No cursor
g_globals->setFlag(122);
- if ((g_vm->getFeatures() & GF_DEMO) || (g_vm->getGameID() != GType_Ringworld)) {
+ if ((g_vm->getGameID() != GType_Ringworld) || ((g_vm->getGameID() == GType_Ringworld) && (g_vm->getFeatures() & GF_DEMO))) {
CursorMan.showMouse(false);
return;
}
diff --git a/engines/tsage/events.h b/engines/tsage/events.h
index 9ef4813e47..a3d96abef4 100644
--- a/engines/tsage/events.h
+++ b/engines/tsage/events.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope 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.
@@ -90,7 +90,7 @@ enum CursorType {
R2_ATTRACTOR_UNIT = 5, R2_SENSOR_PROBE = 6, R2_SONIC_STUNNER = 7,
R2_CABLE_HARNESS = 8, R2_COM_SCANNER = 9, R2_SPENT_POWER_CAPSULE = 10,
R2_CHARGED_POWER_CAPSULE = 11, R2_AEROSOL = 12, R2_REMOTE_CONTROL = 13,
- R2_OPTICAL_FIBRE = 14, R2_CLAMP = 15, R2_ATTRACTOR_CABLE_HARNESS = 16,
+ R2_OPTICAL_FIBER = 14, R2_CLAMP = 15, R2_ATTRACTOR_CABLE_HARNESS = 16,
R2_FUEL_CELL = 17, R2_GYROSCOPE = 18, R2_AIRBAG = 19, R2_REBREATHER_TANK = 20,
R2_RESERVE_REBREATHER_TANK = 21, R2_GUIDANCE_MODULE = 22, R2_THRUSTER_VALVE = 23,
R2_BALLOON_BACKPACK = 24, R2_RADAR_MECHANISM = 25, R2_JOYSTICK = 26,
diff --git a/engines/tsage/globals.cpp b/engines/tsage/globals.cpp
index ece6ae3eda..e75febfdbc 100644
--- a/engines/tsage/globals.cpp
+++ b/engines/tsage/globals.cpp
@@ -3,17 +3,17 @@
* ScummVM is the legal property of its developers, whose names
* are too numerous to list here. Please refer to the COPYRIGHT
* file distributed with this source distribution.
- *
+ *
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope 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.
@@ -26,6 +26,7 @@
#include "tsage/ringworld/ringworld_demo.h"
#include "tsage/ringworld/ringworld_logic.h"
#include "tsage/ringworld2/ringworld2_logic.h"
+#include "tsage/ringworld2/ringworld2_scenes0.h"
#include "tsage/staticres.h"
namespace TsAGE {
@@ -47,6 +48,11 @@ static SavedObject *classFactoryProc(const Common::String &className) {
if (className == "SceneObjectWrapper") return new SceneObjectWrapper();
if (className == "PaletteRotation") return new PaletteRotation();
if (className == "PaletteFader") return new PaletteFader();
+ if (className == "SceneText") return new SceneText();
+
+ // Return to Ringworld specific classes
+ if (className == "Scene205_Star") return new Ringworld2::Star();
+
return NULL;
}
@@ -57,18 +63,41 @@ Globals::Globals() : _dialogCenter(160, 140), _gfxManagerInstance(_screenSurface
reset();
_stripNum = 0;
_gfxEdgeAdjust = 3;
-
- if (g_vm->getFeatures() & GF_DEMO) {
- _gfxFontNumber = 0;
- _gfxColors.background = 6;
- _gfxColors.foreground = 0;
- _fontColors.background = 255;
- _fontColors.foreground = 6;
- _dialogCenter.y = 80;
- // Workaround in order to use later version of the engine
- _color1 = _gfxColors.foreground;
- _color2 = _gfxColors.foreground;
- _color3 = _gfxColors.foreground;
+ _gfxFontNumber = 0;
+
+ if (g_vm->getGameID() == GType_Ringworld) {
+ if (g_vm->getFeatures() & GF_DEMO) {
+ _gfxFontNumber = 0;
+ _gfxColors.background = 6;
+ _gfxColors.foreground = 0;
+ _fontColors.background = 255;
+ _fontColors.foreground = 6;
+ _dialogCenter.y = 80;
+ // Workaround in order to use later version of the engine
+ _color1 = _gfxColors.foreground;
+ _color2 = _gfxColors.foreground;
+ _color3 = _gfxColors.foreground;
+ } else if (g_vm->getFeatures() & GF_CD) {
+ _gfxFontNumber = 50;
+ _gfxColors.background = 53;
+ _gfxColors.foreground = 0;
+ _fontColors.background = 51;
+ _fontColors.foreground = 54;
+ _color1 = 18;
+ _color2 = 18;
+ _color3 = 18;
+ } else {
+ // Floppy version
+ _gfxFontNumber = 50;
+ _gfxColors.background = 53;
+ _gfxColors.foreground = 18;
+ _fontColors.background = 51;
+ _fontColors.foreground = 54;
+ // Workaround in order to use later version of the engine
+ _color1 = _gfxColors.foreground;
+ _color2 = _gfxColors.foreground;
+ _color3 = _gfxColors.foreground;
+ }
} else if (g_vm->getGameID() == GType_BlueForce) {
// Blue Force
_gfxFontNumber = 0;
@@ -88,26 +117,6 @@ Globals::Globals() : _dialogCenter(160, 140), _gfxManagerInstance(_screenSurface
_color2 = 15;
_color3 = 4;
_dialogCenter.y = 100;
- } 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;
- _color1 = 18;
- _color2 = 18;
- _color3 = 18;
- } else {
- // Ringworld
- _gfxFontNumber = 50;
- _gfxColors.background = 53;
- _gfxColors.foreground = 18;
- _fontColors.background = 51;
- _fontColors.foreground = 54;
- // Workaround in order to use later version of the engine
- _color1 = _gfxColors.foreground;
- _color2 = _gfxColors.foreground;
- _color3 = _gfxColors.foreground;
}
_screenSurface.setScreenSurface();
_gfxManagers.push_back(&_gfxManagerInstance);
@@ -119,8 +128,11 @@ Globals::Globals() : _dialogCenter(160, 140), _gfxManagerInstance(_screenSurface
_sounds.push_back(&_soundHandler);
_sounds.push_back(&_sequenceManager._soundHandler);
- _scrollFollower = NULL;
- _inventory = NULL;
+ _scrollFollower = nullptr;
+
+ _inventory = nullptr;
+ _game = nullptr;
+ _sceneHandler = nullptr;
switch (g_vm->getGameID()) {
case GType_Ringworld:
@@ -145,6 +157,7 @@ Globals::Globals() : _dialogCenter(160, 140), _gfxManagerInstance(_screenSurface
_sceneHandler = new Ringworld2::SceneHandlerExt();
break;
}
+
}
Globals::~Globals() {
@@ -204,6 +217,11 @@ void Globals::dispatchSounds() {
/*--------------------------------------------------------------------------*/
+TsAGE2Globals::TsAGE2Globals() {
+ _onSelectItem = NULL;
+ _interfaceY = 0;
+}
+
void TsAGE2Globals::reset() {
Globals::reset();
@@ -224,15 +242,46 @@ void TsAGE2Globals::synchronize(Serializer &s) {
namespace BlueForce {
BlueForceGlobals::BlueForceGlobals(): TsAGE2Globals() {
+ _hiddenDoorStatus = 0;
+ _nico910State = 0;
+ _stuart910State = 0;
+ _nico910Talk = 0;
+ _stuart910Talk = 0;
+ _deziTopic = 0;
+ _deathReason = 0;
+ _driveFromScene = 300;
+ _driveToScene = 0;
+ _subFlagBitArr1 = 0;
+ _subFlagBitArr2 = 0;
+ _scene410HarrisonTalkFl = false;
+ _scene410Action1Count = 0;
+ _scene410TalkCount = 0;
+ _scene410HarrisonMovedFl = false;
+ _bookmark = bNone;
+ _mapLocationId = 1;
+ _clip1Bullets = 8;
+ _clip2Bullets = 8;
+
+ _dayNumber = 0;
+ _tonyDialogCtr = 0;
+ _marinaWomanCtr = 0;
+ _kateDialogCtr = 0;
+ _v4CEB6 = 0;
+ _safeCombination = 0;
+ _gateStatus = 0;
+ _greenDay5TalkCtr = 0;
+ _v4CEC8 = 1;
+ _v4CECA = 0;
+ _v4CECC = 0;
}
void BlueForceGlobals::synchronize(Serializer &s) {
TsAGE2Globals::synchronize(s);
+ int16 useless = 0;
s.syncAsSint16LE(_dayNumber);
if (s.getVersion() < 9) {
- int tmpVar = 0;
- s.syncAsSint16LE(tmpVar);
+ s.syncAsSint16LE(useless);
}
s.syncAsSint16LE(_tonyDialogCtr);
s.syncAsSint16LE(_marinaWomanCtr);
@@ -241,7 +290,8 @@ void BlueForceGlobals::synchronize(Serializer &s) {
s.syncAsSint16LE(_safeCombination);
s.syncAsSint16LE(_gateStatus);
s.syncAsSint16LE(_greenDay5TalkCtr);
- s.syncAsSint16LE(_v4CEC4);
+ if (s.getVersion() < 11)
+ s.syncAsSint16LE(useless);
s.syncAsSint16LE(_v4CEC8);
s.syncAsSint16LE(_v4CECA);
s.syncAsSint16LE(_v4CECC);
@@ -249,26 +299,30 @@ void BlueForceGlobals::synchronize(Serializer &s) {
s.syncAsByte(_breakerBoxStatusArr[i]);
s.syncAsSint16LE(_hiddenDoorStatus);
s.syncAsSint16LE(_nico910State);
- s.syncAsSint16LE(_v4CEE4);
- s.syncAsSint16LE(_v4CEE6);
- s.syncAsSint16LE(_v4CEE8);
+ s.syncAsSint16LE(_stuart910State);
+ s.syncAsSint16LE(_nico910Talk);
+ s.syncAsSint16LE(_stuart910Talk);
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);
+ if (s.getVersion() < 11) {
+ s.syncAsSint16LE(useless);
+ s.syncAsSint16LE(useless);
+ s.syncAsSint16LE(useless);
+ s.syncAsSint16LE(useless);
+ s.syncAsSint16LE(useless);
+ }
s.syncAsSint16LE(_subFlagBitArr1);
s.syncAsSint16LE(_subFlagBitArr2);
- s.syncAsSint16LE(_v50CC2);
- s.syncAsSint16LE(_v50CC4);
- s.syncAsSint16LE(_v50CC6);
- s.syncAsSint16LE(_v50CC8);
- s.syncAsSint16LE(_v51C42);
- s.syncAsSint16LE(_v51C44);
+ s.syncAsSint16LE(_scene410HarrisonTalkFl);
+ s.syncAsSint16LE(_scene410Action1Count);
+ s.syncAsSint16LE(_scene410TalkCount);
+ s.syncAsSint16LE(_scene410HarrisonMovedFl);
+ if (s.getVersion() < 11) {
+ s.syncAsSint16LE(useless);
+ s.syncAsSint16LE(useless);
+ }
s.syncAsSint16LE(_bookmark);
s.syncAsSint16LE(_mapLocationId);
s.syncAsSint16LE(_clip1Bullets);
@@ -298,7 +352,6 @@ void BlueForceGlobals::reset() {
_safeCombination = 0;
_gateStatus = 0;
_greenDay5TalkCtr = 0;
- _v4CEC4 = 0;
_v4CEC8 = 1;
_v4CECA = 0;
_v4CECC = 0;
@@ -322,24 +375,17 @@ void BlueForceGlobals::reset() {
_breakerBoxStatusArr[17] = 0;
_hiddenDoorStatus = 0;
_nico910State = 0;
- _v4CEE4 = 0;
- _v4CEE6 = 0;
- _v4CEE8 = 0;
+ _stuart910State = 0;
+ _nico910Talk = 0;
+ _stuart910Talk = 0;
_deziTopic = 0;
_deathReason = 0;
- _v501F8 = 0;
- _v501FA = 0;
- _v501FC = 0;
- _v5020C = 0;
- _v50696 = 0;
_subFlagBitArr1 = 0;
_subFlagBitArr2 = 0;
- _v50CC2 = 0;
- _v50CC4 = 0;
- _v50CC6 = 0;
- _v50CC8 = 0;
- _v51C42 = 0;
- _v51C44 = 1;
+ _scene410HarrisonTalkFl = false;
+ _scene410Action1Count = 0;
+ _scene410TalkCount = 0;
+ _scene410HarrisonMovedFl = false;
_clip1Bullets = 8;
_clip2Bullets = 8;
}
@@ -369,6 +415,53 @@ namespace Ringworld2 {
Ringworld2Globals::Ringworld2Globals() {
_scannerDialog = new ScannerDialog();
+ _speechSubtitles = SPEECH_TEXT;
+
+ // Register the inner sound objects for each of the global ASoundExt fields.
+ // Normally the ASound constructor would do this, but because they're fields
+ // of the globals, the g_globals reference isn't ready for them to use
+ _sounds.push_back(&_sound1);
+ _sounds.push_back(&_sound2);
+ _sounds.push_back(&_sound3);
+ _sounds.push_back(&_sound4);
+
+ // Initialize fields
+ _stripModifier = 0;
+ _flubMazeArea = 1;
+ _flubMazeEntryDirection = 0;
+ _maze3800SceneNumb = 3800;
+ _landerSuitNumber = 2;
+ _desertStepsRemaining = 5;
+ _desertCorrectDirection = 0;
+ _desertPreviousDirection = 0;
+ _desertWrongDirCtr = -1;
+ _balloonAltitude = 5;
+ _scene1925CurrLevel = 0;
+ _walkwaySceneNumber = 0;
+ _mirandaJailState = 0;
+ _scientistConvIndex = 0;
+ _ductMazePanel1State = 1;
+ _ductMazePanel2State = 1;
+ _ductMazePanel3State = 1;
+ _scene180Mode = -1;
+ _v57709 = 0;
+ _v5780C = 0;
+ _mouseCursorId = 0;
+ _v57810 = 0;
+
+ _fadePaletteFlag = false;
+ _insetUp = 0;
+ _frameEdgeColor = 2;
+ _animationCtr = 0;
+ _electromagnetChangeAmount = 0;
+ _electromagnetZoom = 0;
+ _tractorField = false;
+ _cableAttached = 0;
+ _foodCount = 0;
+ _rimLocation = 0;
+ _rimTransportLocation = 0;
+
+ _debugCardGame = false;
}
Ringworld2Globals::~Ringworld2Globals() {
@@ -397,21 +490,15 @@ void Ringworld2Globals::reset() {
Common::fill(&_paletteMap[0], &_paletteMap[4096], 0);
_fadePaletteFlag = false;
- _v5589E.set(0, 0, 0, 0);
- _v558B6.set(0, 0, 0, 0);
- _v558C2 = 0;
_animationCtr = 0;
- _v5657C = 0;
_electromagnetChangeAmount = 0;
_electromagnetZoom = 0;
- _v565E5 = 0;
- _v565E7 = 0;
- _v565E9 = -5;
- _v565EB = 26;
+ _tractorField = false;
+ _cableAttached = 0;
_foodCount = 0;
_rimLocation = 0;
_rimTransportLocation = 0;
- _v565AE = 0;
+ _stripModifier = 0;
_spillLocation[0] = 0;
_spillLocation[1] = 3;
_spillLocation[R2_SEEKER] = 5;
@@ -427,7 +514,7 @@ void Ringworld2Globals::reset() {
_spillLocation[12] = 27;
_spillLocation[13] = 31;
- // Initialise the vampire data within the Flub maze
+ // Initialize the vampire data within the Flub maze
for (int i = 0; i < 18; i++) {
_vampireData[i]._isAlive = true;
_vampireData[i]._position = Common::Point();
@@ -451,7 +538,7 @@ void Ringworld2Globals::reset() {
_vampireData[16]._shotsRequired = 1;
_vampireData[17]._shotsRequired = 1;
- _v566A6 = 3800;
+ _maze3800SceneNumb = 3800;
_landerSuitNumber = 2;
_flubMazeArea = 1;
_flubMazeEntryDirection = 0;
@@ -464,23 +551,20 @@ void Ringworld2Globals::reset() {
_balloonAltitude = 5;
_scene1925CurrLevel = 0; //_v56A9C
_walkwaySceneNumber = 0;
- _v56AA0 = 0;
+ _mirandaJailState = 0;
_scientistConvIndex = 0;
_ventCellPos = Common::Point(60, 660);
- _v56AA6 = 1;
- _v56AA7 = 1;
- _v56AA8 = 1;
- _v56AAB = 0;
+ _ductMazePanel1State = 1;
+ _ductMazePanel2State = 1;
+ _ductMazePanel3State = 1;
_scene180Mode = -1;
_v57709 = 0;
_v5780C = 0;
- _v5780E = 0;
+ _mouseCursorId = 0;
_v57810 = 0;
- _v57C2C = 0;
_s1550PlayerArea[R2_QUINN] = Common::Point(27, 4);
_s1550PlayerArea[R2_SEEKER] = Common::Point(27, 4);
Common::fill(&_scannerFrequencies[0], &_scannerFrequencies[MAX_CHARACTERS], 1);
- _speechSubtitles = SPEECH_VOICE | SPEECH_TEXT;
_insetUp = 0;
_frameEdgeColor = 2;
Common::fill(&_stripManager_lookupList[0], &_stripManager_lookupList[12], 0);
@@ -504,45 +588,35 @@ void Ringworld2Globals::reset() {
_player._characterScene[R2_QUINN] = 100;
_player._characterScene[R2_SEEKER] = 300;
_player._characterScene[R2_MIRANDA] = 300;
+
+ _debugCardGame = false;
}
void Ringworld2Globals::synchronize(Serializer &s) {
TsAGE2Globals::synchronize(s);
int i;
- _v5589E.synchronize(s);
- _v558B6.synchronize(s);
-
- s.syncAsSint16LE(_v558C2);
s.syncAsSint16LE(_animationCtr);
- s.syncAsSint16LE(_v5657C);
s.syncAsSint16LE(_electromagnetChangeAmount);
s.syncAsSint16LE(_electromagnetZoom);
- s.syncAsSint16LE(_v565E5);
- s.syncAsSint16LE(_v565E7);
- s.syncAsSint16LE(_v565E9);
- s.syncAsSint16LE(_v565EB);
+ s.syncAsSint16LE(_tractorField);
+ s.syncAsSint16LE(_cableAttached);
s.syncAsSint16LE(_foodCount);
s.syncAsSint32LE(_rimLocation);
s.syncAsSint16LE(_rimTransportLocation);
s.syncAsSint16LE(_landerSuitNumber);
- s.syncAsSint16LE(_v566A6);
+ s.syncAsSint16LE(_maze3800SceneNumb);
s.syncAsSint16LE(_desertWrongDirCtr);
s.syncAsSint16LE(_scene1925CurrLevel); // _v56A9C
s.syncAsSint16LE(_walkwaySceneNumber);
s.syncAsSint16LE(_ventCellPos.x);
s.syncAsSint16LE(_ventCellPos.y);
- s.syncAsSint16LE(_v56AAB);
s.syncAsSint16LE(_scene180Mode);
s.syncAsSint16LE(_v57709);
s.syncAsSint16LE(_v5780C);
- s.syncAsSint16LE(_v5780E);
+ s.syncAsSint16LE(_mouseCursorId);
s.syncAsSint16LE(_v57810);
- s.syncAsSint16LE(_v57C2C);
- s.syncAsSint16LE(_speechSubtitles);
- byte temp = 0;
- s.syncAsByte(temp);
s.syncAsByte(_s1550PlayerArea[R2_QUINN].x);
s.syncAsByte(_s1550PlayerArea[R2_SEEKER].x);
s.syncAsByte(_s1550PlayerArea[R2_QUINN].y);
@@ -551,17 +625,17 @@ void Ringworld2Globals::synchronize(Serializer &s) {
for (i = 0; i < MAX_CHARACTERS; ++i)
s.syncAsByte(_scannerFrequencies[i]);
- s.syncAsByte(_v565AE);
+ s.syncAsByte(_stripModifier);
s.syncAsByte(_flubMazeArea);
s.syncAsByte(_flubMazeEntryDirection);
s.syncAsByte(_desertStepsRemaining);
s.syncAsByte(_desertCorrectDirection);
s.syncAsByte(_desertPreviousDirection);
- s.syncAsByte(_v56AA0);
+ s.syncAsByte(_mirandaJailState);
s.syncAsByte(_scientistConvIndex);
- s.syncAsByte(_v56AA6);
- s.syncAsByte(_v56AA7);
- s.syncAsByte(_v56AA8);
+ s.syncAsByte(_ductMazePanel1State);
+ s.syncAsByte(_ductMazePanel2State);
+ s.syncAsByte(_ductMazePanel3State);
for (i = 0; i < 14; ++i)
s.syncAsByte(_spillLocation[i]);
@@ -580,7 +654,7 @@ void Ringworld2Globals::synchronize(Serializer &s) {
s.syncAsSint16LE(_balloonPosition.x);
s.syncAsSint16LE(_balloonPosition.y);
- // Synchronise Flub maze vampire data
+ // Synchronize Flub maze vampire data
for (i = 0; i < 18; ++i) {
s.syncAsSint16LE(_vampireData[i]._isAlive);
s.syncAsSint16LE(_vampireData[i]._shotsRequired);
diff --git a/engines/tsage/globals.h b/engines/tsage/globals.h
index ad47f7f620..1194fe8b9c 100644
--- a/engines/tsage/globals.h
+++ b/engines/tsage/globals.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope 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.
@@ -110,7 +110,7 @@ public:
int _interfaceY;
ASoundExt _inventorySound;
- TsAGE2Globals() { _onSelectItem = NULL; }
+ TsAGE2Globals();
virtual void reset();
virtual void synchronize(Serializer &s);
};
@@ -194,33 +194,25 @@ public:
int _safeCombination;
int _gateStatus;
int _greenDay5TalkCtr;
- int _v4CEC4;
int _v4CEC8;
int _v4CECA;
int _v4CECC;
int8 _breakerBoxStatusArr[18];
int _hiddenDoorStatus;
int _nico910State;
- int _v4CEE4;
- int _v4CEE6;
- int _v4CEE8;
+ int _stuart910State;
+ int _nico910Talk;
+ int _stuart910Talk;
int _deziTopic;
int _deathReason;
int _driveFromScene;
int _driveToScene;
- int _v501F8;
- int _v501FA;
- int _v501FC;
- int _v5020C;
- int _v50696;
uint8 _subFlagBitArr1;
uint8 _subFlagBitArr2;
- int _v50CC2;
- int _v50CC4;
- int _v50CC6;
- int _v50CC8;
- int _v51C42;
- int _v51C44;
+ bool _scene410HarrisonTalkFl;
+ int _scene410Action1Count;
+ int _scene410TalkCount;
+ bool _scene410HarrisonMovedFl;
Bookmark _bookmark;
int _mapLocationId;
int _clip1Bullets, _clip2Bullets;
@@ -259,27 +251,21 @@ public:
byte _fadePaletteMap[10][256];
byte _paletteMap[4096];
int _insetUp;
- int _frameEdgeColor; // _v421e
- Rect _v5589E;
- Rect _v558B6;
- int _v558C2;
+ int _frameEdgeColor;
int _animationCtr;
int _electromagnetChangeAmount;
int _electromagnetZoom;
- int _v565E5;
- int _v565E7;
- int _v565E9;
- int _v565EB;
+ bool _tractorField;
+ bool _cableAttached;
int _foodCount;
int _rimLocation;
int _rimTransportLocation;
- int _v5657C;
- byte _v565AE;
+ byte _stripModifier;
byte _spillLocation[14];
VampireData _vampireData[18];
byte _flubMazeArea;
byte _flubMazeEntryDirection;
- int _v566A6;
+ int _maze3800SceneNumb;
byte _landerSuitNumber;
byte _desertStepsRemaining;
byte _desertCorrectDirection;
@@ -289,26 +275,24 @@ public:
byte _balloonAltitude;
int _scene1925CurrLevel; //_v56A9C
int _walkwaySceneNumber;
- byte _v56AA0;
+ byte _mirandaJailState;
byte _scientistConvIndex;
Common::Point _ventCellPos;
- int _v56AA4;
- byte _v56AA6;
- byte _v56AA7;
- byte _v56AA8;
- int _v56AAB;
+ byte _ductMazePanel1State;
+ byte _ductMazePanel2State;
+ byte _ductMazePanel3State;
int _scene180Mode; // _v575f7
int _v57709;
int _v5780C;
- int _v5780E;
+ int _mouseCursorId;
int _v57810;
- int _v57C2C;
int _speechSubtitles;
Common::Point _s1550PlayerArea[3]; // only used for Quinn and Seeker
byte _scannerFrequencies[4];
byte _stripManager_lookupList[12];
byte _scene1550JunkLocations[508];
Common::Point _balloonPosition;
+ bool _debugCardGame; // moved from scene 1337 so it can be easily set in the debugger
ScannerDialog *_scannerDialog;
diff --git a/engines/tsage/graphics.cpp b/engines/tsage/graphics.cpp
index 2395cc67ed..ce24c76290 100644
--- a/engines/tsage/graphics.cpp
+++ b/engines/tsage/graphics.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope 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.
@@ -68,11 +68,16 @@ GfxSurface surfaceFromRes(const byte *imgData) {
Rect r(0, 0, READ_LE_UINT16(imgData), READ_LE_UINT16(imgData + 2));
GfxSurface s;
s.create(r.width(), r.height());
- s._centroid.x = READ_LE_UINT16(imgData + 4);
- s._centroid.y = READ_LE_UINT16(imgData + 6);
s._transColor = *(imgData + 8);
- bool rleEncoded = (imgData[9] & 2) != 0;
+ byte flags = imgData[9];
+ s._flags = (g_vm->getGameID() != GType_Ringworld) ? flags : 0;
+
+ bool rleEncoded = (flags & 2) != 0;
+
+ // Figure out the centroid
+ s._centroid.x = READ_LE_UINT16(imgData + 4);
+ s._centroid.y = READ_LE_UINT16(imgData + 6);
const byte *srcP = imgData + 10;
Graphics::Surface destSurface = s.lockSurface();
@@ -184,8 +189,9 @@ void Rect::contain(const Rect &r) {
* @percent Scaling percentage
*/
void Rect::resize(const GfxSurface &surface, int xp, int yp, int percent) {
- int xe = surface.getBounds().width() * percent / 100;
- int ye = surface.getBounds().height() * percent / 100;
+ const Rect &bounds = surface.getBounds();
+ int xe = bounds.width() * percent / 100;
+ int ye = bounds.height() * percent / 100;
this->set(0, 0, xe, ye);
if (!right) ++right;
@@ -193,8 +199,13 @@ void Rect::resize(const GfxSurface &surface, int xp, int yp, int percent) {
this->moveTo(xp, yp);
- int xd = surface._centroid.x * percent / 100;
- int yd = surface._centroid.y * percent / 100;
+ int xa = (surface._flags & FRAME_FLIP_CENTROID_X) == 0 ? surface._centroid.x :
+ bounds.width() - (surface._centroid.x + 1);
+ int ya = (surface._flags & FRAME_FLIP_CENTROID_Y) == 0 ? surface._centroid.y :
+ bounds.height() - (surface._centroid.y + 1);
+
+ int xd = xa * percent / 100;
+ int yd = ya * percent / 100;
this->translate(-xd, -yd);
}
@@ -224,6 +235,7 @@ GfxSurface::GfxSurface() : _bounds(0, 0, SCREEN_WIDTH, SCREEN_HEIGHT) {
_customSurface = NULL;
_transColor = -1;
_trackDirtyRects = false;
+ _flags = 0;
}
GfxSurface::GfxSurface(const GfxSurface &s) {
@@ -407,6 +419,7 @@ GfxSurface &GfxSurface::operator=(const GfxSurface &s) {
_bounds = s._bounds;
_centroid = s._centroid;
_transColor = s._transColor;
+ _flags = s._flags;
if (_customSurface) {
// Surface owns the internal data, so replicate it so new surface owns it's own
@@ -559,9 +572,11 @@ static GfxSurface ResizeSurface(GfxSurface &src, int xSize, int ySize, int trans
}
/**
- * Copys an area from one GfxSurface to another
+ * Copys an area from one GfxSurface to another.
+ *
*/
-void GfxSurface::copyFrom(GfxSurface &src, Rect srcBounds, Rect destBounds, Region *priorityRegion) {
+void GfxSurface::copyFrom(GfxSurface &src, Rect srcBounds, Rect destBounds,
+ Region *priorityRegion, const byte *shadowMap) {
GfxSurface srcImage;
if (srcBounds.isEmpty())
return;
@@ -591,20 +606,24 @@ void GfxSurface::copyFrom(GfxSurface &src, Rect srcBounds, Rect destBounds, Regi
Graphics::Surface srcSurface = srcImage.lockSurface();
Graphics::Surface destSurface = lockSurface();
+ // Get clipping area
+ Rect clipRect = !_clipRect.isEmpty() ? _clipRect :
+ Rect(0, 0, destSurface.w, destSurface.h);
+
// Adjust bounds to ensure destination will be on-screen
int srcX = 0, srcY = 0;
- if (destBounds.left < 0) {
- srcX = -destBounds.left;
- destBounds.left = 0;
+ if (destBounds.left < clipRect.left) {
+ srcX = clipRect.left - destBounds.left;
+ destBounds.left = clipRect.left;
}
- if (destBounds.top < 0) {
- srcY = -destBounds.top;
- destBounds.top = 0;
+ if (destBounds.top < clipRect.top) {
+ srcY = clipRect.top - destBounds.top;
+ destBounds.top = clipRect.top;
}
- if (destBounds.right > destSurface.w)
- destBounds.right = destSurface.w;
- if (destBounds.bottom > destSurface.h)
- destBounds.bottom = destSurface.h;
+ if (destBounds.right > clipRect.right)
+ destBounds.right = clipRect.right;
+ if (destBounds.bottom > clipRect.bottom)
+ destBounds.bottom = clipRect.bottom;
if (destBounds.isValidRect() && !((destBounds.right < 0) || (destBounds.bottom < 0)
|| (destBounds.left >= destSurface.w) || (destBounds.top >= destSurface.h))) {
@@ -627,8 +646,15 @@ void GfxSurface::copyFrom(GfxSurface &src, Rect srcBounds, Rect destBounds, Regi
if (!priorityRegion || !priorityRegion->contains(Common::Point(
xp + g_globals->_sceneManager._scene->_sceneBounds.left,
destBounds.top + y + g_globals->_sceneManager._scene->_sceneBounds.top))) {
- if (*tempSrc != src._transColor)
- *tempDest = *tempSrc;
+ if (*tempSrc != src._transColor) {
+ if (shadowMap) {
+ // Using a shadow map, so translate the dest pixel using the mapping array
+ *tempDest = shadowMap[*tempDest];
+ } else {
+ // Otherwise, it's a standard pixel copy
+ *tempDest = *tempSrc;
+ }
+ }
}
++tempSrc;
++tempDest;
@@ -706,6 +732,11 @@ GfxElement::GfxElement() {
_owner = NULL;
_keycode = 0;
_flags = 0;
+
+ _fontNumber = 0;
+ _color1 = 0;
+ _color2 = 0;
+ _color3 = 0;
}
void GfxElement::setDefaults() {
@@ -796,8 +827,8 @@ void GfxElement::drawFrame() {
// Draw the edge frame
// Outer frame border
- surface.hLine(tempRect.left + 2, tempRect.top, tempRect.right - 2, 0);
- surface.hLine(tempRect.left + 2, tempRect.bottom, tempRect.right - 2, 0);
+ surface.hLine(tempRect.left + 2, tempRect.top, tempRect.right - 2, 0);
+ surface.hLine(tempRect.left + 2, tempRect.bottom, tempRect.right - 2, 0);
surface.vLine(tempRect.left, tempRect.top + 2, tempRect.bottom - 2, 0);
surface.vLine(tempRect.right, tempRect.top + 2, tempRect.bottom - 2, 0);
*((byte *)surface.getBasePtr(tempRect.left + 1, tempRect.top + 1)) = 0;
@@ -806,8 +837,8 @@ void GfxElement::drawFrame() {
*((byte *)surface.getBasePtr(tempRect.right - 1, tempRect.bottom - 1)) = 0;
// Inner frame border
- surface.hLine(tempRect.left + 2, tempRect.top + 1, tempRect.right - 2, R2_GLOBALS._frameEdgeColor);
- surface.hLine(tempRect.left + 2, tempRect.bottom - 1, tempRect.right - 2, R2_GLOBALS._frameEdgeColor);
+ surface.hLine(tempRect.left + 2, tempRect.top + 1, tempRect.right - 2, R2_GLOBALS._frameEdgeColor);
+ surface.hLine(tempRect.left + 2, tempRect.bottom - 1, tempRect.right - 2, R2_GLOBALS._frameEdgeColor);
surface.vLine(tempRect.left + 1, tempRect.top + 2, tempRect.bottom - 2, R2_GLOBALS._frameEdgeColor);
surface.vLine(tempRect.right - 1, tempRect.top + 2, tempRect.bottom - 2, R2_GLOBALS._frameEdgeColor);
*((byte *)surface.getBasePtr(tempRect.left + 2, tempRect.top + 2)) = R2_GLOBALS._frameEdgeColor;
@@ -1198,6 +1229,8 @@ GfxButton *GfxDialog::execute(GfxButton *defaultButton) {
selectedButton = defaultButton;
breakFlag = true;
break;
+ } else if (event.eventType == EVENT_KEYPRESS && handleKeypress(event, selectedButton)) {
+ breakFlag = true;
}
}
}
@@ -1214,8 +1247,9 @@ GfxButton *GfxDialog::execute(GfxButton *defaultButton) {
}
void GfxDialog::setPalette() {
- if (g_vm->getGameID() == GType_BlueForce) {
- g_globals->_scenePalette.loadPalette(2);
+ if (g_vm->getGameID() != GType_Ringworld) {
+ 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);
@@ -1358,11 +1392,16 @@ void GfxManager::copyFrom(GfxSurface &src, const Rect &srcBounds, const Rect &de
GfxFont::GfxFont() {
- _fontNumber = (g_vm->getFeatures() & GF_DEMO) ? 0 : 50;
+ if ((g_vm->getGameID() == GType_Ringworld) && (g_vm->getFeatures() & GF_DEMO))
+ _fontNumber = 0;
+ else
+ _fontNumber = 50;
_numChars = 0;
_bpp = 0;
_fontData = NULL;
_fillFlag = false;
+
+ _gfxManager = nullptr;
}
GfxFont::~GfxFont() {
@@ -1446,7 +1485,6 @@ int GfxFont::getStringFit(const char *&s, int maxWidth) {
const char *nextWord = NULL;
const char *sStart = s;
int numChars = 1;
- int strWidth = 1;
char nextChar;
for (;;) {
@@ -1460,7 +1498,7 @@ int GfxFont::getStringFit(const char *&s, int maxWidth) {
nextWord = s;
}
- strWidth = getStringWidth(sStart, numChars);
+ int strWidth = getStringWidth(sStart, numChars);
if (strWidth > maxWidth) {
if (nextWord) {
s = nextWord;
diff --git a/engines/tsage/graphics.h b/engines/tsage/graphics.h
index 7239a99a68..d65d0bcf8b 100644
--- a/engines/tsage/graphics.h
+++ b/engines/tsage/graphics.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope 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.
@@ -71,6 +71,8 @@ public:
LineSlice(int xStart, int xEnd) { xs = xStart; xe = xEnd; }
};
+enum FrameFlag { FRAME_FLIP_CENTROID_X = 4, FRAME_FLIP_CENTROID_Y = 8 };
+
class GfxSurface {
private:
Graphics::Surface *_customSurface;
@@ -88,6 +90,8 @@ private:
public:
Common::Point _centroid;
int _transColor;
+ Rect _clipRect;
+ byte _flags;
public:
GfxSurface();
GfxSurface(const GfxSurface &s);
@@ -104,7 +108,8 @@ public:
void setBounds(const Rect &bounds) { _bounds = bounds; }
const Rect &getBounds() const { return _bounds; }
- void copyFrom(GfxSurface &src, Rect srcBounds, Rect destBounds, Region *priorityRegion = NULL);
+ void copyFrom(GfxSurface &src, Rect srcBounds, Rect destBounds,
+ Region *priorityRegion = NULL, const byte *shadowMap = NULL);
void copyFrom(GfxSurface &src, Rect destBounds, Region *priorityRegion = NULL) {
copyFrom(src, src.getBounds(), destBounds, priorityRegion);
}
@@ -338,6 +343,8 @@ public:
virtual void draw();
static void setPalette();
+
+ virtual bool handleKeypress(Event &evt, GfxButton *&btn) { return false; }
};
GfxSurface *surfaceGetArea(GfxSurface &src, const Rect &bounds);
diff --git a/engines/tsage/resources.cpp b/engines/tsage/resources.cpp
index 5987d78067..d4b922a1c3 100644
--- a/engines/tsage/resources.cpp
+++ b/engines/tsage/resources.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope 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.
diff --git a/engines/tsage/resources.h b/engines/tsage/resources.h
index 45cecf8521..a7536a3c2d 100644
--- a/engines/tsage/resources.h
+++ b/engines/tsage/resources.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope 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.
diff --git a/engines/tsage/ringworld/ringworld_demo.cpp b/engines/tsage/ringworld/ringworld_demo.cpp
index fedb19c804..cd2ab07a50 100644
--- a/engines/tsage/ringworld/ringworld_demo.cpp
+++ b/engines/tsage/ringworld/ringworld_demo.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope 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.
diff --git a/engines/tsage/ringworld/ringworld_demo.h b/engines/tsage/ringworld/ringworld_demo.h
index 7c0ac39285..2b93a40049 100644
--- a/engines/tsage/ringworld/ringworld_demo.h
+++ b/engines/tsage/ringworld/ringworld_demo.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope 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.
diff --git a/engines/tsage/ringworld/ringworld_dialogs.cpp b/engines/tsage/ringworld/ringworld_dialogs.cpp
index 4728e66cd9..226a943f08 100644
--- a/engines/tsage/ringworld/ringworld_dialogs.cpp
+++ b/engines/tsage/ringworld/ringworld_dialogs.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope 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.
@@ -385,7 +385,6 @@ void InventoryDialog::execute() {
if ((RING_INVENTORY._selectedItem) && RING_INVENTORY._selectedItem->inInventory())
RING_INVENTORY._selectedItem->setCursor();
- GfxElement *hiliteObj;
bool lookFlag = false;
_gfxManager.activate();
@@ -399,7 +398,7 @@ void InventoryDialog::execute() {
if (g_vm->shouldQuit())
break;
- hiliteObj = NULL;
+ GfxElement *hiliteObj = nullptr;
if ((event.eventType == EVENT_BUTTON_DOWN) && !_bounds.contains(event.mousePos))
break;
diff --git a/engines/tsage/ringworld/ringworld_dialogs.h b/engines/tsage/ringworld/ringworld_dialogs.h
index b14b3f6d78..68ac0a05f9 100644
--- a/engines/tsage/ringworld/ringworld_dialogs.h
+++ b/engines/tsage/ringworld/ringworld_dialogs.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope 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.
diff --git a/engines/tsage/ringworld/ringworld_logic.cpp b/engines/tsage/ringworld/ringworld_logic.cpp
index 0584570ac2..1d8293cffd 100644
--- a/engines/tsage/ringworld/ringworld_logic.cpp
+++ b/engines/tsage/ringworld/ringworld_logic.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope 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.
@@ -270,6 +270,11 @@ bool DisplayObject::performAction(int action) {
SceneArea::SceneArea() {
_savedArea = NULL;
_pt.x = _pt.y = 0;
+
+ _resNum = 0;
+ _rlbNum = 0;
+ _subNum = 0;
+ _actionId = 0;
}
SceneArea::~SceneArea() {
diff --git a/engines/tsage/ringworld/ringworld_logic.h b/engines/tsage/ringworld/ringworld_logic.h
index e902ac127f..d384593989 100644
--- a/engines/tsage/ringworld/ringworld_logic.h
+++ b/engines/tsage/ringworld/ringworld_logic.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope 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.
diff --git a/engines/tsage/ringworld/ringworld_scenes1.cpp b/engines/tsage/ringworld/ringworld_scenes1.cpp
index 89c07273fc..9eacc5ff10 100644
--- a/engines/tsage/ringworld/ringworld_scenes1.cpp
+++ b/engines/tsage/ringworld/ringworld_scenes1.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope 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.
@@ -52,52 +52,52 @@ void Scene10::Action1::signal() {
scene->_stripManager.start(11, this, scene);
break;
case 3:
- scene->_object2.hide();
- scene->_object3.hide();
- scene->_object3.setAction(NULL);
- scene->_object4.animate(ANIM_MODE_5, this);
+ scene->_veeshkaHead.hide();
+ scene->_veeshkaRightArm.hide();
+ scene->_veeshkaRightArm.setAction(NULL);
+ scene->_centurion.animate(ANIM_MODE_5, this);
break;
case 4:
case 9:
- scene->_object1.animate(ANIM_MODE_5, this);
+ scene->_veeshkaBody.animate(ANIM_MODE_5, this);
break;
case 5:
- scene->_object2.setStrip(3);
- scene->_object2.setFrame(1);
- scene->_object2.setPosition(Common::Point(240, 51));
- scene->_object2.show();
+ scene->_veeshkaHead.setStrip(3);
+ scene->_veeshkaHead.setFrame(1);
+ scene->_veeshkaHead.setPosition(Common::Point(240, 51));
+ scene->_veeshkaHead.show();
- scene->_object3.setStrip(6);
- scene->_object3.setFrame(1);
- scene->_object3.setPosition(Common::Point(200, 76));
- scene->_object3._numFrames = 20;
- scene->_object3.show();
+ scene->_veeshkaRightArm.setStrip(6);
+ scene->_veeshkaRightArm.setFrame(1);
+ scene->_veeshkaRightArm.setPosition(Common::Point(200, 76));
+ scene->_veeshkaRightArm._numFrames = 20;
+ scene->_veeshkaRightArm.show();
scene->_stripManager.start(12, this, scene);
break;
case 6:
- scene->_object2.hide();
- scene->_object3.hide();
- scene->_object1.animate(ANIM_MODE_6, this);
+ scene->_veeshkaHead.hide();
+ scene->_veeshkaRightArm.hide();
+ scene->_veeshkaBody.animate(ANIM_MODE_6, this);
break;
case 7:
- scene->_object3.show();
- scene->_object3.setStrip2(5);
- scene->_object3._numFrames = 10;
- scene->_object3.setPosition(Common::Point(180, 87));
- scene->_object3.setAction(&scene->_action2);
+ scene->_veeshkaRightArm.show();
+ scene->_veeshkaRightArm.setStrip2(5);
+ scene->_veeshkaRightArm._numFrames = 10;
+ scene->_veeshkaRightArm.setPosition(Common::Point(180, 87));
+ scene->_veeshkaRightArm.setAction(&scene->_action2);
- scene->_object2.setStrip(4);
- scene->_object2.setFrame(1);
- scene->_object2.setPosition(Common::Point(204, 59));
- scene->_object2.show();
+ scene->_veeshkaHead.setStrip(4);
+ scene->_veeshkaHead.setFrame(1);
+ scene->_veeshkaHead.setPosition(Common::Point(204, 59));
+ scene->_veeshkaHead.show();
scene->_stripManager.start(13, this, scene);
break;
case 8:
- scene->_object2.hide();
- scene->_object3.hide();
- scene->_object4.animate(ANIM_MODE_6, this);
+ scene->_veeshkaHead.hide();
+ scene->_veeshkaRightArm.hide();
+ scene->_centurion.animate(ANIM_MODE_6, this);
break;
case 10:
g_globals->_soundHandler.fadeOut(this);
@@ -109,6 +109,7 @@ void Scene10::Action1::signal() {
}
}
+// Move Veeshka's fingers
void Scene10::Action2::signal() {
Scene10 *scene = (Scene10 *)g_globals->_sceneManager._scene;
@@ -117,8 +118,8 @@ void Scene10::Action2::signal() {
setDelay(g_globals->_randomSource.getRandomNumber(179));
break;
case 1:
- scene->_object3.setFrame(1);
- scene->_object3.animate(ANIM_MODE_5, this);
+ scene->_veeshkaRightArm.setFrame(1);
+ scene->_veeshkaRightArm.animate(ANIM_MODE_5, this);
_actionIndex = 0;
break;
}
@@ -145,43 +146,43 @@ void Scene10::postInit(SceneObjectList *OwnerList) {
_stripManager.setCallback(this);
- _object1.postInit();
- _object1.setVisage(10);
- _object1.setPosition(Common::Point(232, 90));
- _object1.fixPriority(1);
-
- _object2.postInit();
- _object2.setVisage(10);
- _object2.setStrip(4);
- _object2.setFrame(1);
- _object2.setPosition(Common::Point(204, 59));
- _object2.fixPriority(198);
-
- _object3.postInit();
- _object3.setVisage(10);
- _object3.setStrip2(5);
- _object3.setPosition(Common::Point(180, 87));
- _object3.fixPriority(196);
- _object3.setAction(&_action2);
-
- _object4.postInit();
- _object4.setVisage(10);
- _object4.setStrip(2);
- _object4.setPosition(Common::Point(0, 209));
- _object4.animate(ANIM_MODE_1, NULL);
-
- _object5.postInit();
- _object5.setVisage(11);
- _object5.setPosition(Common::Point(107, 146));
- _object5.animate(ANIM_MODE_2, NULL);
- _object5._numFrames = 5;
-
- _object6.postInit();
- _object6.setVisage(11);
- _object6.setStrip(2);
- _object6.setPosition(Common::Point(287, 149));
- _object6.animate(ANIM_MODE_2, NULL);
- _object6._numFrames = 5;
+ _veeshkaBody.postInit();
+ _veeshkaBody.setVisage(10);
+ _veeshkaBody.setPosition(Common::Point(232, 90));
+ _veeshkaBody.fixPriority(1);
+
+ _veeshkaHead.postInit();
+ _veeshkaHead.setVisage(10);
+ _veeshkaHead.setStrip(4);
+ _veeshkaHead.setFrame(1);
+ _veeshkaHead.setPosition(Common::Point(204, 59));
+ _veeshkaHead.fixPriority(198);
+
+ _veeshkaRightArm.postInit();
+ _veeshkaRightArm.setVisage(10);
+ _veeshkaRightArm.setStrip2(5);
+ _veeshkaRightArm.setPosition(Common::Point(180, 87));
+ _veeshkaRightArm.fixPriority(196);
+ _veeshkaRightArm.setAction(&_action2);
+
+ _centurion.postInit();
+ _centurion.setVisage(10);
+ _centurion.setStrip(2);
+ _centurion.setPosition(Common::Point(0, 209));
+ _centurion.animate(ANIM_MODE_1, NULL);
+
+ _leftSmoke.postInit();
+ _leftSmoke.setVisage(11);
+ _leftSmoke.setPosition(Common::Point(107, 146));
+ _leftSmoke.animate(ANIM_MODE_2, NULL);
+ _leftSmoke._numFrames = 5;
+
+ _rightSmoke.postInit();
+ _rightSmoke.setVisage(11);
+ _rightSmoke.setStrip(2);
+ _rightSmoke.setPosition(Common::Point(287, 149));
+ _rightSmoke.animate(ANIM_MODE_2, NULL);
+ _rightSmoke._numFrames = 5;
g_globals->_sceneManager._scene->_sceneBounds.contain(g_globals->_sceneManager._scene->_backgroundBounds);
g_globals->_sceneOffset.x = (g_globals->_sceneManager._scene->_sceneBounds.left / 160) * 160;
@@ -193,14 +194,14 @@ void Scene10::postInit(SceneObjectList *OwnerList) {
void Scene10::stripCallback(int v) {
switch (v) {
case 1:
- _object2.animate(ANIM_MODE_7, -1, NULL);
+ _veeshkaHead.animate(ANIM_MODE_7, -1, NULL);
break;
case 2:
- _object2.animate(ANIM_MODE_NONE);
+ _veeshkaHead.animate(ANIM_MODE_NONE);
break;
case 3:
- _object2.animate(ANIM_MODE_7, -1, NULL);
- _object3.animate(ANIM_MODE_5, NULL);
+ _veeshkaHead.animate(ANIM_MODE_7, -1, NULL);
+ _veeshkaRightArm.animate(ANIM_MODE_5, NULL);
break;
default:
break;
@@ -227,13 +228,13 @@ void Scene15::Action1::signal() {
case 2: {
SceneItem::display(15, 1, SET_Y, 20, SET_FONT, 2, SET_BG_COLOR, -1, SET_EXT_BGCOLOR, 7,
SET_WIDTH, 320, SET_KEEP_ONSCREEN, 1, LIST_END);
- scene->_object1.postInit();
- scene->_object1.setVisage(15);
- scene->_object1.setPosition(Common::Point(160, -10));
- scene->_object1.animate(ANIM_MODE_2, NULL);
+ scene->_ship.postInit();
+ scene->_ship.setVisage(15);
+ scene->_ship.setPosition(Common::Point(160, -10));
+ scene->_ship.animate(ANIM_MODE_2, NULL);
Common::Point pt(160, 100);
NpcMover *mover = new NpcMover();
- scene->_object1.addMover(mover, &pt, this);
+ scene->_ship.addMover(mover, &pt, this);
scene->_soundHandler.play(7);
break;
}
@@ -247,8 +248,8 @@ void Scene15::Action1::signal() {
void Scene15::Action1::dispatch() {
Scene15 *scene = (Scene15 *)g_globals->_sceneManager._scene;
- if (scene->_object1._position.y < 100)
- scene->_object1.changeZoom(100 - scene->_object1._position.y);
+ if (scene->_ship._position.y < 100)
+ scene->_ship.changeZoom(100 - scene->_ship._position.y);
Action::dispatch();
}
@@ -307,9 +308,9 @@ void Scene20::Action2::signal() {
Common::Point pt(455, 77);
g_globals->_player.addMover(mover, &pt, this);
ObjectMover2 *mover2 = new ObjectMover2();
- scene->_SceneObjectExt.addMover(mover2, 5, 10, &g_globals->_player);
+ scene->_assassinShip1.addMover(mover2, 5, 10, &g_globals->_player);
ObjectMover2 *mover3 = new ObjectMover2();
- scene->_sceneObject3.addMover(mover3, 10, 15, &g_globals->_player);
+ scene->_assassinShip2.addMover(mover3, 10, 15, &g_globals->_player);
break;
}
case 3: {
@@ -369,9 +370,9 @@ void Scene20::Action3::signal() {
Common::Point pt(615, 81);
g_globals->_player.addMover(npcMover, &pt, this);
ObjectMover2 *mover1 = new ObjectMover2();
- scene->_SceneObjectExt.addMover(mover1, 5, 10, &g_globals->_player);
+ scene->_assassinShip1.addMover(mover1, 5, 10, &g_globals->_player);
ObjectMover2 *mover2 = new ObjectMover2();
- scene->_sceneObject3.addMover(mover2, 20, 25, &g_globals->_player);
+ scene->_assassinShip2.addMover(mover2, 20, 25, &g_globals->_player);
break;
}
case 2: {
@@ -382,8 +383,8 @@ void Scene20::Action3::signal() {
}
case 3: {
g_globals->_player._moveDiff = Common::Point(10, 10);
- scene->_SceneObjectExt._moveDiff = Common::Point(10, 10);
- scene->_sceneObject3._moveDiff = Common::Point(10, 10);
+ scene->_assassinShip1._moveDiff = Common::Point(10, 10);
+ scene->_assassinShip2._moveDiff = Common::Point(10, 10);
npcMover = new NpcMover();
Common::Point pt(445, 132);
g_globals->_player.addMover(npcMover, &pt, this);
@@ -427,73 +428,73 @@ void Scene20::Action4::signal() {
Common::Point pt(486, 134);
g_globals->_player.addMover(npcMover, &pt, this);
ObjectMover2 *mover1 = new ObjectMover2();
- scene->_SceneObjectExt.addMover(mover1, 20, 35, &g_globals->_player);
+ scene->_assassinShip1.addMover(mover1, 20, 35, &g_globals->_player);
break;
}
case 2: {
g_globals->_player._moveDiff = Common::Point(12, 12);
- scene->_SceneObjectExt._moveDiff = Common::Point(12, 12);
+ scene->_assassinShip1._moveDiff = Common::Point(12, 12);
NpcMover *mover1 = new NpcMover();
Common::Point pt(486, 134);
- scene->_sceneObject3.addMover(mover1, &pt, this);
+ scene->_assassinShip2.addMover(mover1, &pt, this);
NpcMover *mover2 = new NpcMover();
pt = Common::Point(-15, 134);
g_globals->_player.addMover(mover2, &pt, NULL);
NpcMover *mover3 = new NpcMover();
pt = Common::Point(-15, 134);
- scene->_SceneObjectExt.addMover(mover3, &pt, NULL);
+ scene->_assassinShip1.addMover(mover3, &pt, NULL);
break;
}
case 3: {
- scene->_sceneObject3._moveDiff = Common::Point(20, 20);
+ scene->_assassinShip2._moveDiff = Common::Point(20, 20);
npcMover = new NpcMover();
Common::Point pt(320, 134);
- scene->_sceneObject3.addMover(npcMover, &pt, this);
+ scene->_assassinShip2.addMover(npcMover, &pt, this);
break;
}
case 4: {
scene->_sound.play(28);
- scene->_sceneObject4.postInit();
- scene->_sceneObject4.setVisage(21);
- scene->_sceneObject4.setStrip(3);
- scene->_sceneObject4.setPosition(Common::Point(scene->_sceneObject3._position.x - 36,
- scene->_sceneObject3._position.y - 1));
- scene->_sceneObject4._moveDiff.x = 48;
+ scene->_laserShot1.postInit();
+ scene->_laserShot1.setVisage(21);
+ scene->_laserShot1.setStrip(3);
+ Common::Point pt = Common::Point(scene->_assassinShip2._position.x - 36, scene->_assassinShip2._position.y - 1);
+ scene->_laserShot1.setPosition(pt);
+ scene->_laserShot1._moveDiff.x = 48;
ObjectMover3 *mover = new ObjectMover3();
- scene->_sceneObject4.addMover(mover, &scene->_SceneObjectExt, 4, this);
+ scene->_laserShot1.addMover(mover, &scene->_assassinShip1, 4, this);
break;
}
case 5: {
scene->_sound.play(42);
- scene->_sceneObject4.remove();
- scene->_SceneObjectExt.setVisage(21);
- scene->_SceneObjectExt.setStrip(1);
- scene->_SceneObjectExt.setFrame(1);
- scene->_SceneObjectExt.animate(ANIM_MODE_5, NULL);
+ scene->_laserShot1.remove();
+ scene->_assassinShip1.setVisage(21);
+ scene->_assassinShip1.setStrip(1);
+ scene->_assassinShip1.setFrame(1);
+ scene->_assassinShip1.animate(ANIM_MODE_5, NULL);
- scene->_SceneObjectExt._moveDiff.x = 4;
+ scene->_assassinShip1._moveDiff.x = 4;
NpcMover *mover1 = new NpcMover();
- Common::Point pt(scene->_SceneObjectExt._position.x - 12, scene->_SceneObjectExt._position.y + 5);
- scene->_SceneObjectExt.addMover(mover1, &pt, NULL);
+ Common::Point pt(scene->_assassinShip1._position.x - 12, scene->_assassinShip1._position.y + 5);
+ scene->_assassinShip1.addMover(mover1, &pt, NULL);
- scene->_sceneObject5.postInit();
- scene->_sceneObject5.setVisage(21);
- scene->_sceneObject5.setStrip(3);
- scene->_sceneObject5.setPosition(Common::Point(scene->_sceneObject3._position.x - 36,
- scene->_sceneObject3._position.y - 1));
- scene->_sceneObject5._moveDiff.x = 48;
+ scene->_laserShot2.postInit();
+ scene->_laserShot2.setVisage(21);
+ scene->_laserShot2.setStrip(3);
+ pt = Common::Point(scene->_assassinShip2._position.x - 36, scene->_assassinShip2._position.y - 1);
+ scene->_laserShot2.setPosition(pt);
+ scene->_laserShot2._moveDiff.x = 48;
ObjectMover3 *mover = new ObjectMover3();
- scene->_sceneObject5.addMover(mover, &g_globals->_player, 4, this);
+ scene->_laserShot2.addMover(mover, &g_globals->_player, 4, this);
break;
}
case 6: {
scene->_sound.play(42);
- scene->_SceneObjectExt.setStrip(2);
- scene->_SceneObjectExt.animate(ANIM_MODE_2, NULL);
+ scene->_assassinShip1.setStrip(2);
+ scene->_assassinShip1.animate(ANIM_MODE_2, NULL);
- scene->_sceneObject5.remove();
+ scene->_laserShot2.remove();
g_globals->_player.setVisage(21);
g_globals->_player.setStrip(1);
g_globals->_player.setFrame(1);
@@ -539,18 +540,18 @@ void Scene20::postInit(SceneObjectList *OwnerList) {
g_globals->_player._moveDiff = Common::Point(10, 10);
g_globals->_player.animate(ANIM_MODE_1, NULL);
- _SceneObjectExt.postInit();
- _SceneObjectExt.setVisage(20);
- _SceneObjectExt.setPosition(Common::Point(400, 69));
- _SceneObjectExt.animate(ANIM_MODE_1, NULL);
+ _assassinShip1.postInit();
+ _assassinShip1.setVisage(20);
+ _assassinShip1.setPosition(Common::Point(400, 69));
+ _assassinShip1.animate(ANIM_MODE_1, NULL);
- _sceneObject3.postInit();
- _sceneObject3.setVisage(20);
- _sceneObject3.setPosition(Common::Point(395, 69));
- _sceneObject3.animate(ANIM_MODE_1, NULL);
+ _assassinShip2.postInit();
+ _assassinShip2.setVisage(20);
+ _assassinShip2.setPosition(Common::Point(395, 69));
+ _assassinShip2.animate(ANIM_MODE_1, NULL);
- _SceneObjectExt._moveDiff = Common::Point(10, 10);
- _sceneObject3._moveDiff = Common::Point(10, 10);
+ _assassinShip1._moveDiff = Common::Point(10, 10);
+ _assassinShip2._moveDiff = Common::Point(10, 10);
g_globals->_soundHandler.play(20);
_sound.play(21);
_sound.holdAt(true);
@@ -567,16 +568,16 @@ void Scene20::postInit(SceneObjectList *OwnerList) {
g_globals->_player.fixPriority(50);
g_globals->_player.animate(ANIM_MODE_1, NULL);
- _SceneObjectExt.postInit();
- _SceneObjectExt.setVisage(20);
- _SceneObjectExt.setPosition(Common::Point(583, 79));
- _SceneObjectExt.animate(ANIM_MODE_1, NULL);
+ _assassinShip1.postInit();
+ _assassinShip1.setVisage(20);
+ _assassinShip1.setPosition(Common::Point(583, 79));
+ _assassinShip1.animate(ANIM_MODE_1, NULL);
- _sceneObject3.postInit();
- _sceneObject3.setVisage(20);
- _sceneObject3.setStrip2(2);
- _sceneObject3.setPosition(Common::Point(595, 79));
- _sceneObject3.animate(ANIM_MODE_1, NULL);
+ _assassinShip2.postInit();
+ _assassinShip2.setVisage(20);
+ _assassinShip2.setStrip2(2);
+ _assassinShip2.setPosition(Common::Point(595, 79));
+ _assassinShip2.animate(ANIM_MODE_1, NULL);
if ((g_globals->getFlag(120) && g_globals->getFlag(116)) ||
(g_globals->getFlag(117) && g_globals->getFlag(119))) {
@@ -584,10 +585,10 @@ void Scene20::postInit(SceneObjectList *OwnerList) {
setAction(&_action3);
} else if (g_globals->getFlag(104)) {
_sceneMode = 21;
- setAction(&_sequenceManager, this, 21, &g_globals->_player, &_SceneObjectExt, NULL);
+ setAction(&_sequenceManager, this, 21, &g_globals->_player, &_assassinShip1, NULL);
} else {
// Failed evasion
- _sceneObject3._moveDiff = Common::Point(8, 8);
+ _assassinShip2._moveDiff = Common::Point(8, 8);
setAction(&_action4);
}
_sceneBounds.center(g_globals->_player._position.x, g_globals->_player._position.y);
@@ -626,26 +627,37 @@ void Scene20::signal() {
*--------------------------------------------------------------------------*/
void Scene30::BeamObject::doAction(int action) {
- if (action == OBJECT_SCANNER)
+ switch (action) {
+ case OBJECT_SCANNER:
display2(30, 14);
- else if (action == CURSOR_LOOK)
+ break;
+ case CURSOR_LOOK:
display2(30, 2);
- else if (action == CURSOR_USE) {
+ break;
+ case CURSOR_USE: {
Scene30 *parent = (Scene30 *)g_globals->_sceneManager._scene;
parent->setAction(&parent->_beamAction);
- } else
+ }
+ break;
+ default:
SceneObject::doAction(action);
+ }
}
void Scene30::DoorObject::doAction(int action) {
- if (action == OBJECT_SCANNER)
+ switch (action) {
+ case OBJECT_SCANNER:
display2(30, 13);
- else if (action == CURSOR_LOOK)
+ break;
+ case CURSOR_LOOK:
display2(30, 1);
- else if (action == CURSOR_USE)
+ break;
+ case CURSOR_USE:
display2(30, 7);
- else
+ break;
+ default:
SceneObject::doAction(action);
+ }
}
void Scene30::BeamAction::signal() {
@@ -963,16 +975,16 @@ void Scene40::Action1::signal() {
scene->_doorway.hide();
scene->_dyingKzin.setPosition(Common::Point(296, 62));
g_globals->_player.animate(ANIM_MODE_5, NULL);
- scene->_object1.setVisage(43);
- scene->_object1.setStrip(3);
- scene->_object1.animate(ANIM_MODE_5, NULL);
- scene->_object2.hide();
- scene->_object3.hide();
+ scene->_seeker.setVisage(43);
+ scene->_seeker.setStrip(3);
+ scene->_seeker.animate(ANIM_MODE_5, NULL);
+ scene->_seekerTail.hide();
+ scene->_seekerHand.hide();
scene->_stripManager.start(45, this);
break;
case 4:
- scene->_object2.remove();
- scene->_object3.remove();
+ scene->_seekerTail.remove();
+ scene->_seekerHand.remove();
scene->_assassin.setVisage(42);
scene->_assassin.setStrip(2);
scene->_assassin.setFrame(1);
@@ -1049,10 +1061,10 @@ void Scene40::Action1::signal() {
break;
case 15:
g_globals->_player.disableControl();
- scene->_object1.setVisage(40);
- scene->_object1.setStrip(4);
- scene->_object1.setFrame(1);
- scene->_object1.animate(ANIM_MODE_5, NULL);
+ scene->_seeker.setVisage(40);
+ scene->_seeker.setStrip(4);
+ scene->_seeker.setFrame(1);
+ scene->_seeker.animate(ANIM_MODE_5, NULL);
g_globals->_player.setVisage(40);
g_globals->_player.setStrip(2);
g_globals->_player.setFrame(1);
@@ -1122,13 +1134,13 @@ void Scene40::Action2::signal() {
}
case 6: {
g_globals->_player.setStrip(7);
- scene->_object1.setVisage(2806);
- scene->_object1.animate(ANIM_MODE_1, NULL);
+ scene->_seeker.setVisage(2806);
+ scene->_seeker.animate(ANIM_MODE_1, NULL);
SceneObjectWrapper *wrapper = new SceneObjectWrapper();
- scene->_object1.setObjectWrapper(wrapper);
+ scene->_seeker.setObjectWrapper(wrapper);
Common::Point pt(200, 190);
NpcMover *mover = new NpcMover();
- scene->_object1.addMover(mover, &pt, this);
+ scene->_seeker.addMover(mover, &pt, this);
break;
}
case 7:
@@ -1137,12 +1149,12 @@ void Scene40::Action2::signal() {
case 8: {
Common::Point pt(170, 260);
NpcMover *mover = new NpcMover();
- scene->_object1.addMover(mover, &pt, this);
+ scene->_seeker.addMover(mover, &pt, this);
break;
}
case 9:
scene->_dyingKzin.setAction(&scene->_action7);
- scene->_object1.remove();
+ scene->_seeker.remove();
g_globals->_stripNum = 88;
g_globals->_events.setCursor(CURSOR_WALK);
g_globals->_player.enableControl();
@@ -1202,6 +1214,7 @@ void Scene40::Action4::signal() {
}
}
+// Animate the tail of Seeker, with random pauses
void Scene40::Action5::signal() {
Scene40 *scene = (Scene40 *)g_globals->_sceneManager._scene;
@@ -1210,7 +1223,7 @@ void Scene40::Action5::signal() {
setDelay(g_globals->_randomSource.getRandomNumber(119) + 120);
break;
case 1:
- scene->_object2.animate(ANIM_MODE_8, 1, this);
+ scene->_seekerTail.animate(ANIM_MODE_8, 1, this);
_actionIndex = 0;
}
}
@@ -1220,17 +1233,17 @@ void Scene40::Action6::signal() {
switch (_actionIndex++) {
case 0: {
- scene->_object1.postInit();
- scene->_object1.setVisage(16);
- scene->_object1.setStrip2(6);
- scene->_object1._moveDiff = Common::Point(40, 40);
- scene->_object1.setPosition(Common::Point(313, 53));
- scene->_object1._moveRate = 60;
+ scene->_seeker.postInit();
+ scene->_seeker.setVisage(16);
+ scene->_seeker.setStrip2(6);
+ scene->_seeker._moveDiff = Common::Point(40, 40);
+ scene->_seeker.setPosition(Common::Point(313, 53));
+ scene->_seeker._moveRate = 60;
Common::Point pt(141, 194);
NpcMover *mover = new NpcMover();
- scene->_object1.addMover(mover, &pt, NULL);
- scene->_object1.animate(ANIM_MODE_5, NULL);
+ scene->_seeker.addMover(mover, &pt, NULL);
+ scene->_seeker.animate(ANIM_MODE_5, NULL);
scene->_doorway.postInit();
scene->_doorway.setVisage(46);
@@ -1260,21 +1273,21 @@ void Scene40::Action7::signal() {
setDelay(g_globals->_randomSource.getRandomNumber(499) + 500);
break;
case 1:
- scene->_object7.postInit();
- scene->_object7.setVisage(46);
+ scene->_leftEntrance.postInit();
+ scene->_leftEntrance.setVisage(46);
if (g_globals->_randomSource.getRandomNumber(32767) >= 16384) {
- scene->_object7.setStrip(3);
- scene->_object7.setPosition(Common::Point(15, 185));
+ scene->_leftEntrance.setStrip(3);
+ scene->_leftEntrance.setPosition(Common::Point(15, 185));
} else {
- scene->_object7.setPosition(Common::Point(305, 61));
- scene->_object7.setFrame(15);
+ scene->_leftEntrance.setPosition(Common::Point(305, 61));
+ scene->_leftEntrance.setFrame(15);
}
- scene->_object7.animate(ANIM_MODE_5, this);
+ scene->_leftEntrance.animate(ANIM_MODE_5, this);
scene->_soundHandler.play(25);
break;
case 2:
- scene->_object7.remove();
+ scene->_leftEntrance.remove();
_actionIndex = 0;
setDelay(60);
break;
@@ -1465,12 +1478,12 @@ 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, 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),
- _item8(8, OBJECT_SCANNER, 40, 39, OBJECT_STUNNER, 40, 40, CURSOR_LOOK, 40, 3, CURSOR_USE, 40, 41, LIST_END) {
+ _ball(2, OBJECT_SCANNER, 40, 24, OBJECT_STUNNER, 40, 25, CURSOR_LOOK, 40, 7, CURSOR_USE, 40, 16, LIST_END),
+ _window(5, OBJECT_SCANNER, 40, 28, OBJECT_STUNNER, 40, 27, CURSOR_LOOK, 40, 2, CURSOR_USE, 40, 30, LIST_END),
+ _entrance(6, OBJECT_SCANNER, 40, 31, OBJECT_STUNNER, 40, 32, CURSOR_LOOK, 40, 5, CURSOR_USE, 40, 33, LIST_END),
+ _background(0, CURSOR_LOOK, 40, 11, LIST_END),
+ _emerald(4, OBJECT_SCANNER, 40, 26, OBJECT_STUNNER, 40, 27, CURSOR_LOOK, 40, 9, CURSOR_USE, 40, 17, LIST_END),
+ _tree(8, OBJECT_SCANNER, 40, 39, OBJECT_STUNNER, 40, 40, CURSOR_LOOK, 40, 3, CURSOR_USE, 40, 41, LIST_END) {
}
void Scene40::postInit(SceneObjectList *OwnerList) {
@@ -1489,7 +1502,7 @@ void Scene40::postInit(SceneObjectList *OwnerList) {
_speakerGameText._color1 = 9;
_speakerGameText.setTextPos(Common::Point(160, 30));
_speakerQText._npc = &g_globals->_player;
- _speakerSText._npc = &_object1;
+ _speakerSText._npc = &_seeker;
g_globals->_player.postInit();
g_globals->_player.setVisage(0);
@@ -1502,23 +1515,24 @@ void Scene40::postInit(SceneObjectList *OwnerList) {
g_globals->_soundHandler.play(24);
g_globals->_player.setVisage(43);
- _object1.postInit();
- _object1.setVisage(41);
- _object1.setPosition(Common::Point(105, 220));
- _object2.postInit();
- _object2.setVisage(41);
- _object2.setStrip(6);
- _object2.fixPriority(200);
- _object2.setPosition(Common::Point(94, 189));
- _object2.setAction(&_action5);
-
- _object3.postInit();
- _object3.setVisage(41);
- _object3.setStrip(5);
- _object3.fixPriority(205);
- _object3.setPosition(Common::Point(110, 186));
- _object3._numFrames = 2;
- _object3.animate(ANIM_MODE_8, NULL, NULL);
+ _seeker.postInit();
+ _seeker.setVisage(41);
+ _seeker.setPosition(Common::Point(105, 220));
+
+ _seekerTail.postInit();
+ _seekerTail.setVisage(41);
+ _seekerTail.setStrip(6);
+ _seekerTail.fixPriority(200);
+ _seekerTail.setPosition(Common::Point(94, 189));
+ _seekerTail.setAction(&_action5);
+
+ _seekerHand.postInit();
+ _seekerHand.setVisage(41);
+ _seekerHand.setStrip(5);
+ _seekerHand.fixPriority(205);
+ _seekerHand.setPosition(Common::Point(110, 186));
+ _seekerHand._numFrames = 2;
+ _seekerHand.animate(ANIM_MODE_8, NULL, NULL);
_assassin.postInit();
_assassin.setPosition(Common::Point(-40, 191));
@@ -1563,12 +1577,12 @@ void Scene40::postInit(SceneObjectList *OwnerList) {
setAction(&_action4);
}
- _item5.setBounds(Rect(0, 0, SCREEN_WIDTH, SCREEN_HEIGHT));
- _item6._sceneRegionId = 3;
- _item2._sceneRegionId = 7;
+ _background.setBounds(Rect(0, 0, SCREEN_WIDTH, SCREEN_HEIGHT));
+ _pedestal._sceneRegionId = 3;
+ _statue._sceneRegionId = 7;
- g_globals->_sceneItems.addItems(&_dyingKzin, &_item8, &_item1, &_item2, &_item3, &_item4,
- &_item6, &_item7, &_item5, NULL);
+ g_globals->_sceneItems.addItems(&_dyingKzin, &_tree, &_ball, &_statue, &_window, &_entrance,
+ &_pedestal, &_emerald, &_background, NULL);
}
void Scene40::signal() {
@@ -1609,7 +1623,7 @@ void Scene50::Action1::signal() {
scene->_stripManager.start(63, this);
break;
case 2:
- if (scene->_stripManager._field2E8 != 107) {
+ if (scene->_stripManager._currObj44Id != 107) {
g_globals->_player.enableControl();
remove();
} else {
@@ -1691,7 +1705,7 @@ void Scene50::Object1::doAction(int action) {
}
}
-void Scene50::Object2::doAction(int action) {
+void Scene50::LeftFlyCycle::doAction(int action) {
Scene50 *scene = (Scene50 *)g_globals->_sceneManager._scene;
switch (action) {
@@ -1715,7 +1729,7 @@ void Scene50::Object2::doAction(int action) {
}
}
-void Scene50::Object3::doAction(int action) {
+void Scene50::CenterFlyCycle::doAction(int action) {
Scene50 *scene = (Scene50 *)g_globals->_sceneManager._scene;
switch (action) {
@@ -1743,7 +1757,7 @@ void Scene50::Object3::doAction(int action) {
}
}
-void Scene50::Object4::doAction(int action) {
+void Scene50::RightFlyCycle::doAction(int action) {
Scene50 *scene = (Scene50 *)g_globals->_sceneManager._scene;
switch (action) {
@@ -1772,12 +1786,13 @@ void Scene50::Object4::doAction(int action) {
/*--------------------------------------------------------------------------*/
Scene50::Scene50() :
- _item0(0, CURSOR_LOOK, 50, 3, LIST_END),
+ _background(0, CURSOR_LOOK, 50, 3, LIST_END),
_item1(0, OBJECT_SCANNER, 50, 15, CURSOR_USE, 50, 16, CURSOR_LOOK, 50, 3, LIST_END),
- _item2(0, CURSOR_LOOK, 50, 7, LIST_END),
- _item3(8, OBJECT_STUNNER, 50, 14, OBJECT_SCANNER, 50, 13, CURSOR_LOOK, 50, 3, LIST_END),
- _item4(9, OBJECT_SCANNER, 40, 39, OBJECT_STUNNER, 40, 40, CURSOR_USE, 40, 41, CURSOR_LOOK, 50, 5, LIST_END),
- _item5(10, OBJECT_SCANNER, 50, 17, OBJECT_STUNNER, 50, 18, CURSOR_LOOK, 50, 6, CURSOR_USE, 30, 8, LIST_END) {
+ _entrance(0, CURSOR_LOOK, 50, 7, LIST_END),
+ // The original was using dialog 50/3 for CURSOR_LOOK, which is too generic.
+ _bulwark(8, OBJECT_STUNNER, 50, 14, OBJECT_SCANNER, 50, 13, CURSOR_LOOK, 30, 0, LIST_END),
+ _tree(9, OBJECT_SCANNER, 40, 39, OBJECT_STUNNER, 40, 40, CURSOR_USE, 40, 41, CURSOR_LOOK, 50, 5, LIST_END),
+ _flagstones(10, OBJECT_SCANNER, 50, 17, OBJECT_STUNNER, 50, 18, CURSOR_LOOK, 50, 6, CURSOR_USE, 30, 8, LIST_END) {
_doorwayRect = Rect(80, 108, 160, 112);
}
@@ -1806,25 +1821,25 @@ void Scene50::postInit(SceneObjectList *OwnerList) {
g_globals->_player.setPosition(Common::Point(270, 143));
}
- _object2.postInit();
- _object2.setVisage(2331);
- _object2.setStrip(6);
- _object2.setPosition(Common::Point(136, 192));
- _object2.fixPriority(200);
+ _leftFlyCycle.postInit();
+ _leftFlyCycle.setVisage(2331);
+ _leftFlyCycle.setStrip(6);
+ _leftFlyCycle.setPosition(Common::Point(136, 192));
+ _leftFlyCycle.fixPriority(200);
- _object3.postInit();
- _object3.setVisage(2337);
- _object3.setStrip(6);
- _object3.setPosition(Common::Point(260, 180));
- _object3.fixPriority(200);
+ _centerFlyCycle.postInit();
+ _centerFlyCycle.setVisage(2337);
+ _centerFlyCycle.setStrip(6);
+ _centerFlyCycle.setPosition(Common::Point(260, 180));
+ _centerFlyCycle.fixPriority(200);
- _object4.postInit();
- _object4.setVisage(2331);
- _object4.setStrip(6);
- _object4.setPosition(Common::Point(295, 144));
- _object4.fixPriority(178);
+ _rightFlyCycle.postInit();
+ _rightFlyCycle.setVisage(2331);
+ _rightFlyCycle.setStrip(6);
+ _rightFlyCycle.setPosition(Common::Point(295, 144));
+ _rightFlyCycle.fixPriority(178);
- g_globals->_sceneItems.addItems(&_object2, &_object3, &_object4, NULL);
+ g_globals->_sceneItems.addItems(&_leftFlyCycle, &_centerFlyCycle, &_rightFlyCycle, NULL);
if (!g_globals->getFlag(101)) {
g_globals->_player.disableControl();
@@ -1840,8 +1855,8 @@ void Scene50::postInit(SceneObjectList *OwnerList) {
}
}
- _item0.setBounds(Rect(200, 0, 320, 200));
- g_globals->_sceneItems.addItems(&_item3, &_item4, &_item5, &_item0, NULL);
+ _background.setBounds(Rect(0, 0, 320, 200));
+ g_globals->_sceneItems.addItems(&_bulwark, &_tree, &_flagstones, &_background, NULL);
}
void Scene50::signal() {
@@ -1928,8 +1943,8 @@ void Scene60::Action1::signal() {
scene->_controlButton.remove();
scene->_slaveButton.remove();
scene->_masterButton.remove();
- scene->_item1.remove();
- scene->_item2.remove();
+ scene->_diskDrive.remove();
+ scene->_dashboard.remove();
scene->_nextButton.postInit();
scene->_nextButton.setVisage(65);
@@ -2030,11 +2045,11 @@ void Scene60::Action2::signal() {
/*--------------------------------------------------------------------------*/
void Scene60::PrevObject::doAction(int action) {
- Scene60 *scene = (Scene60 *)g_globals->_sceneManager._scene;
-
if (action == CURSOR_LOOK) {
SceneItem::display2(60, 16);
} else if (action == CURSOR_USE) {
+ Scene60 *scene = (Scene60 *)g_globals->_sceneManager._scene;
+
animate(ANIM_MODE_8, 1, NULL);
if (scene->_action1.getActionIndex() > 5) {
@@ -2048,11 +2063,11 @@ void Scene60::PrevObject::doAction(int action) {
}
void Scene60::NextObject::doAction(int action) {
- Scene60 *scene = (Scene60 *)g_globals->_sceneManager._scene;
-
if (action == CURSOR_LOOK) {
SceneItem::display2(60, 17);
} else if (action == CURSOR_USE) {
+ Scene60 *scene = (Scene60 *)g_globals->_sceneManager._scene;
+
animate(ANIM_MODE_8, 1, NULL);
if (scene->_action1.getActionIndex() < 8) {
@@ -2065,11 +2080,11 @@ void Scene60::NextObject::doAction(int action) {
}
void Scene60::ExitObject::doAction(int action) {
- Scene60 *scene = (Scene60 *)g_globals->_sceneManager._scene;
-
if (action == CURSOR_LOOK) {
SceneItem::display2(60, 18);
} else if (action == CURSOR_USE) {
+ Scene60 *scene = (Scene60 *)g_globals->_sceneManager._scene;
+
scene->_soundHandler3.play(36);
animate(ANIM_MODE_8, 1, NULL);
scene->_nextButton.remove();
@@ -2111,11 +2126,11 @@ void Scene60::ExitObject::doAction(int action) {
if (scene->_masterButton._state)
scene->_masterButton.setFrame(2);
- g_globals->_sceneItems.push_front(&scene->_item1);
+ g_globals->_sceneItems.push_front(&scene->_diskDrive);
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);
+ g_globals->_sceneItems.push_back(&scene->_dashboard);
g_globals->gfxManager()._font.setFontNumber(2);
g_globals->_sceneText._fontNumber = 2;
@@ -2130,11 +2145,11 @@ void Scene60::ExitObject::doAction(int action) {
}
void Scene60::MessageObject::doAction(int action) {
- Scene60 *scene = (Scene60 *)g_globals->_sceneManager._scene;
-
if (action == CURSOR_LOOK) {
SceneItem::display2(60, 9);
} else if (action == CURSOR_USE) {
+ Scene60 *scene = (Scene60 *)g_globals->_sceneManager._scene;
+
scene->_action1.setDelay(1);
g_globals->setFlag(83);
} else {
@@ -2143,11 +2158,11 @@ void Scene60::MessageObject::doAction(int action) {
}
void Scene60::ControlObject::doAction(int action) {
- Scene60 *scene = (Scene60 *)g_globals->_sceneManager._scene;
-
if (action == CURSOR_LOOK) {
SceneItem::display2(60, 11);
} else if (action == CURSOR_USE) {
+ Scene60 *scene = (Scene60 *)g_globals->_sceneManager._scene;
+
if (_animateMode == ANIM_MODE_NONE)
SceneItem::display2(60, 14);
else if (!scene->_slaveButton._state) {
@@ -2164,11 +2179,11 @@ void Scene60::ControlObject::doAction(int action) {
}
void Scene60::SlaveObject::doAction(int action) {
- Scene60 *scene = (Scene60 *)g_globals->_sceneManager._scene;
-
if (action == CURSOR_LOOK) {
SceneItem::display2(60, 8);
} else if (action == CURSOR_USE) {
+ Scene60 *scene = (Scene60 *)g_globals->_sceneManager._scene;
+
if (scene->_masterButton._state)
scene->_sceneMode = 19;
else if (_state) {
@@ -2194,11 +2209,11 @@ void Scene60::SlaveObject::doAction(int action) {
}
void Scene60::MasterObject::doAction(int action) {
- Scene60 *scene = (Scene60 *)g_globals->_sceneManager._scene;
-
if (action == CURSOR_LOOK) {
SceneItem::display2(60, 7);
} else if (action == CURSOR_USE) {
+ Scene60 *scene = (Scene60 *)g_globals->_sceneManager._scene;
+
if (!scene->_controlButton._animateMode)
scene->_sceneMode = 14;
else if (scene->_slaveButton._state)
@@ -2226,11 +2241,11 @@ void Scene60::MasterObject::doAction(int action) {
}
void Scene60::FloppyDrive::doAction(int action) {
- Scene60 *scene = (Scene60 *)g_globals->_sceneManager._scene;
-
if (action == CURSOR_LOOK) {
SceneItem::display2(60, 13);
} else if (action == CURSOR_USE) {
+ Scene60 *scene = (Scene60 *)g_globals->_sceneManager._scene;
+
g_globals->setFlag(!g_globals->_stripNum ? 118 : 121);
scene->setAction(&scene->_action1);
} else {
@@ -2300,11 +2315,11 @@ void Scene60::Item::doAction(int action) {
/*--------------------------------------------------------------------------*/
Scene60::Scene60() :
- _item2(0, 12, 12),
- _item3(8, 22, 23),
- _item4(9, 24, 25),
- _item5(10, 26, 27),
- _item6(11, 28, 29) {
+ _dashboard(0, 12, 12),
+ _intercomm(8, 22, 23),
+ _viewScreen(9, 24, 25),
+ _speedControl(10, 26, 27),
+ _speaker(11, 28, 29) {
}
void Scene60::postInit(SceneObjectList *OwnerList) {
@@ -2345,8 +2360,8 @@ void Scene60::postInit(SceneObjectList *OwnerList) {
setAction(&_sequenceManager, this, 61, NULL);
}
- _item1.setBounds(Rect(130, 55, 174, 70));
- _item2.setBounds(Rect(0, 0, SCREEN_WIDTH, SCREEN_HEIGHT));
+ _diskDrive.setBounds(Rect(130, 55, 174, 70));
+ _dashboard.setBounds(Rect(0, 0, SCREEN_WIDTH, SCREEN_HEIGHT));
if (g_globals->_stripNum == 0) {
if (g_globals->getFlag(117)) {
@@ -2419,8 +2434,7 @@ void Scene60::postInit(SceneObjectList *OwnerList) {
}
}
- g_globals->_sceneItems.addItems(&_item3, &_item4, &_item5, &_item6,
- &_item1, &_item2, NULL);
+ g_globals->_sceneItems.addItems(&_intercomm, &_viewScreen, &_speedControl, &_speaker, &_diskDrive, &_dashboard, NULL);
}
void Scene60::signal() {
@@ -2474,17 +2488,17 @@ void Scene90::Action1::signal() {
case 3: {
Common::Point pt(278, 191);
NpcMover *mover = new NpcMover();
- scene->_object2.addMover(mover, &pt, this);
+ scene->_guard.addMover(mover, &pt, this);
break;
}
case 4:
- scene->_object2.setStrip(3);
+ scene->_guard.setStrip(3);
setDelay(2);
break;
case 5:
scene->_soundHandler2.play(58);
- if (scene->_stripManager._field2E8 == 220)
+ if (scene->_stripManager._currObj44Id == 220)
scene->_stripManager.start(91, this, scene);
else {
scene->_stripManager.start(g_globals->getFlag(104) ? 93 : 92, this, scene);
@@ -2492,36 +2506,36 @@ void Scene90::Action1::signal() {
}
break;
case 6:
- scene->_object2.animate(ANIM_MODE_NONE);
+ scene->_guard.animate(ANIM_MODE_NONE);
g_globals->_player._uiEnabled = true;
break;
case 7:
- scene->_object2.animate(ANIM_MODE_NONE);
+ scene->_guard.animate(ANIM_MODE_NONE);
g_globals->_soundHandler.play(56);
- scene->_object3.animate(ANIM_MODE_5, this);
+ scene->_headGate.animate(ANIM_MODE_5, this);
break;
case 8: {
Common::Point pt(215, 127);
PlayerMover *mover = new PlayerMover();
- scene->_object5.addMover(mover, &pt, this);
+ scene->_quinnShip.addMover(mover, &pt, this);
break;
}
case 9: {
Common::Point pt1(215, 127);
PlayerMover *mover1 = new PlayerMover();
- scene->_object1.addMover(mover1, &pt1, this);
+ scene->_seekerShip.addMover(mover1, &pt1, this);
Common::Point pt2(86, 62);
PlayerMover *mover2 = new PlayerMover();
- scene->_object5.addMover(mover2, &pt2, this);
+ scene->_quinnShip.addMover(mover2, &pt2, this);
break;
}
case 10: {
PlayerMover2 *mover = new PlayerMover2();
- scene->_object1.addMover(mover, 10, 15, &scene->_object5);
+ scene->_seekerShip.addMover(mover, 10, 15, &scene->_quinnShip);
if (!g_globals->getFlag(104)) {
mover = new PlayerMover2();
- scene->_object4.addMover(mover, 10, 15, &scene->_object1);
+ scene->_emptyShip.addMover(mover, 10, 15, &scene->_seekerShip);
}
setDelay(60);
break;
@@ -2529,7 +2543,7 @@ void Scene90::Action1::signal() {
case 11:
g_globals->_soundHandler.play(57);
g_globals->_soundHandler.play(68);
- scene->_object3.animate(ANIM_MODE_6, NULL);
+ scene->_headGate.animate(ANIM_MODE_6, NULL);
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);
@@ -2544,7 +2558,7 @@ void Scene90::Action1::signal() {
/*--------------------------------------------------------------------------*/
-void Scene90::Object1::doAction(int action) {
+void Scene90::SeekerShip::doAction(int action) {
Scene90 *scene = (Scene90 *)g_globals->_sceneManager._scene;
switch (action) {
@@ -2562,23 +2576,23 @@ void Scene90::Object1::doAction(int action) {
}
}
-void Scene90::Object2::doAction(int action) {
+void Scene90::Guard::doAction(int action) {
Scene90 *scene = (Scene90 *)g_globals->_sceneManager._scene;
switch (action) {
case OBJECT_STUNNER:
case CURSOR_USE:
g_globals->_player.disableControl();
- scene->_object6.postInit();
- scene->_object6.setVisage(90);
- scene->_object6.setStrip(6);
- scene->_object6.setPosition(Common::Point(184, 210));
- scene->_object6.hide();
+ scene->_bubble.postInit();
+ scene->_bubble.setVisage(90);
+ scene->_bubble.setStrip(6);
+ scene->_bubble.setPosition(Common::Point(184, 210));
+ scene->_bubble.hide();
scene->_sceneMode = 91;
scene->_soundHandler1.play(59);
scene->_soundHandler1.holdAt(true);
- scene->setAction(&scene->_sequenceManager, scene, 91, this, &scene->_object6, NULL);
+ scene->setAction(&scene->_sequenceManager, scene, 91, this, &scene->_bubble, NULL);
break;
case CURSOR_LOOK:
SceneItem::display2(90, 8);
@@ -2596,21 +2610,21 @@ void Scene90::Object2::doAction(int action) {
/*--------------------------------------------------------------------------*/
Scene90::Scene90() :
- _item1(0, CURSOR_LOOK, 90, 9, LIST_END),
- _item2(0, CURSOR_LOOK, 90, 10, LIST_END),
- _item3(0, CURSOR_LOOK, 90, 11, LIST_END),
- _object3(OBJECT_STUNNER, 90, 13, CURSOR_LOOK, 90, 12, CURSOR_USE, 90, 16, LIST_END),
- _object4(CURSOR_LOOK, 90, 17, LIST_END),
- _object5(CURSOR_LOOK, 90, 18, CURSOR_USE, 90, 19, LIST_END) {
+ _guardShack(0, CURSOR_LOOK, 90, 9, LIST_END),
+ _shed(0, CURSOR_LOOK, 90, 10, LIST_END),
+ _background(0, CURSOR_LOOK, 90, 11, LIST_END),
+ _headGate(OBJECT_STUNNER, 90, 13, CURSOR_LOOK, 90, 12, CURSOR_USE, 90, 16, LIST_END),
+ _emptyShip(CURSOR_LOOK, 90, 17, LIST_END),
+ _quinnShip(CURSOR_LOOK, 90, 18, CURSOR_USE, 90, 19, LIST_END) {
}
void Scene90::stripCallback(int v) {
Scene90 *scene = (Scene90 *)g_globals->_sceneManager._scene;
if (v == 1)
- scene->_object2.animate(ANIM_MODE_7, 0, NULL);
+ scene->_guard.animate(ANIM_MODE_7, 0, NULL);
else if (v == 2)
- scene->_object2.animate(ANIM_MODE_NONE);
+ scene->_guard.animate(ANIM_MODE_NONE);
}
void Scene90::postInit(SceneObjectList *OwnerList) {
@@ -2624,53 +2638,53 @@ void Scene90::postInit(SceneObjectList *OwnerList) {
_stripManager.addSpeaker(&_speakerQL);
_stripManager.addSpeaker(&_speakerSR);
- _speakerMText._npc = &_object2;
+ _speakerMText._npc = &_guard;
_speakerQText._textWidth = 160;
- _speakerQText._npc = &_object5;
- _speakerSText._npc = &_object1;
-
- _object5.postInit();
- _object5.setVisage(2333);
- _object5.setObjectWrapper(new SceneObjectWrapper());
- _object5._strip = 7;
- _object5._moveDiff = Common::Point(22, 22);
- _object5.setPosition(Common::Point(151, 177));
- _object5.changeZoom(-1);
- g_globals->_sceneItems.push_back(&_object5);
-
- _object1.postInit();
- _object1.setVisage(2337);
- _object1.setObjectWrapper(new SceneObjectWrapper());
- _object1._strip = 4;
- _object1._moveDiff = Common::Point(20, 20);
- _object1.setPosition(Common::Point(212, 183));
- _object1.changeZoom(-1);
- g_globals->_sceneItems.push_back(&_object1);
+ _speakerQText._npc = &_quinnShip;
+ _speakerSText._npc = &_seekerShip;
+
+ _quinnShip.postInit();
+ _quinnShip.setVisage(2333);
+ _quinnShip.setObjectWrapper(new SceneObjectWrapper());
+ _quinnShip._strip = 7;
+ _quinnShip._moveDiff = Common::Point(22, 22);
+ _quinnShip.setPosition(Common::Point(151, 177));
+ _quinnShip.changeZoom(-1);
+ g_globals->_sceneItems.push_back(&_quinnShip);
+
+ _seekerShip.postInit();
+ _seekerShip.setVisage(2337);
+ _seekerShip.setObjectWrapper(new SceneObjectWrapper());
+ _seekerShip._strip = 4;
+ _seekerShip._moveDiff = Common::Point(20, 20);
+ _seekerShip.setPosition(Common::Point(212, 183));
+ _seekerShip.changeZoom(-1);
+ g_globals->_sceneItems.push_back(&_seekerShip);
if (!g_globals->getFlag(104)) {
- _object4.postInit();
- _object4.setVisage(2331);
- _object4.setObjectWrapper(new SceneObjectWrapper());
- _object4._strip = 4;
- _object4._moveDiff = Common::Point(20, 20);
- _object4.setPosition(Common::Point(251, 207));
- _object4.changeZoom(-1);
- g_globals->_sceneItems.push_back(&_object4);
- }
-
- _object2.postInit();
- _object2.setVisage(90);
- _object2.animate(ANIM_MODE_1, NULL);
- _object2.setPosition(Common::Point(315, 185));
- _object2._strip = 2;
- 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);
- g_globals->_sceneItems.push_back(&_object3);
+ _emptyShip.postInit();
+ _emptyShip.setVisage(2331);
+ _emptyShip.setObjectWrapper(new SceneObjectWrapper());
+ _emptyShip._strip = 4;
+ _emptyShip._moveDiff = Common::Point(20, 20);
+ _emptyShip.setPosition(Common::Point(251, 207));
+ _emptyShip.changeZoom(-1);
+ g_globals->_sceneItems.push_back(&_emptyShip);
+ }
+
+ _guard.postInit();
+ _guard.setVisage(90);
+ _guard.animate(ANIM_MODE_1, NULL);
+ _guard.setPosition(Common::Point(315, 185));
+ _guard._strip = 2;
+ g_globals->_sceneItems.push_back(&_guard);
+
+ _headGate.postInit();
+ _headGate.setVisage(90);
+ _headGate.animate(ANIM_MODE_1, NULL);
+ _headGate.setPosition(Common::Point(196, 181));
+ _headGate.fixPriority(175);
+ g_globals->_sceneItems.push_back(&_headGate);
g_globals->_player.disableControl();
g_globals->_soundHandler.play(55);
@@ -2679,11 +2693,11 @@ void Scene90::postInit(SceneObjectList *OwnerList) {
setAction(&_action1);
- _item3.setBounds(Rect(0, 0, SCREEN_WIDTH, SCREEN_HEIGHT));
- _item1.setBounds(Rect(271, 65, 271, 186));
- _item2.setBounds(Rect(0, 17, 124, 77));
+ _background.setBounds(Rect(0, 0, SCREEN_WIDTH, SCREEN_HEIGHT));
+ _guardShack.setBounds(Rect(271, 65, 271, 186));
+ _shed.setBounds(Rect(0, 17, 124, 77));
- g_globals->_sceneItems.addItems(&_item1, &_item2, &_item3, NULL);
+ g_globals->_sceneItems.addItems(&_guardShack, &_shed, &_background, NULL);
}
void Scene90::signal() {
@@ -2700,7 +2714,7 @@ void Scene90::signal() {
g_globals->_player.enableControl();
break;
case 97:
- _stripManager._field2E8 = 0;
+ _stripManager._currObj44Id = 0;
_action1.setActionIndex(5);
_action1.setDelay(1);
break;
@@ -2925,7 +2939,7 @@ void Scene6100::Action3::signal() {
case 4:
g_globals->setFlag(76);
g_globals->_sceneManager.changeScene(
- (scene->_stripManager._field2E8 == 135) ? 6100 : 2320);
+ (scene->_stripManager._currObj44Id == 135) ? 6100 : 2320);
remove();
break;
}
diff --git a/engines/tsage/ringworld/ringworld_scenes1.h b/engines/tsage/ringworld/ringworld_scenes1.h
index bb98c89a8c..9f6de58e30 100644
--- a/engines/tsage/ringworld/ringworld_scenes1.h
+++ b/engines/tsage/ringworld/ringworld_scenes1.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope 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.
@@ -54,8 +54,12 @@ public:
Speaker _speakerQText;
Action1 _action1;
Action2 _action2;
- SceneObject _object1, _object2, _object3;
- SceneObject _object4, _object5, _object6;
+ SceneObject _veeshkaBody;
+ SceneObject _veeshkaHead;
+ SceneObject _veeshkaRightArm;
+ SceneObject _centurion;
+ SceneObject _leftSmoke;
+ SceneObject _rightSmoke;
virtual void stripCallback(int v);
virtual void postInit(SceneObjectList *OwnerList = NULL);
@@ -70,7 +74,7 @@ class Scene15 : public Scene {
};
public:
Action1 _action1;
- SceneObject _object1;
+ SceneObject _ship;
ASound _soundHandler;
virtual void postInit(SceneObjectList *OwnerList = NULL);
@@ -102,7 +106,10 @@ public:
Action2 _action2;
Action3 _action3;
Action4 _action4;
- SceneObject _sceneObject1, _SceneObjectExt, _sceneObject3, _sceneObject4, _sceneObject5;
+ SceneObject _assassinShip1;
+ SceneObject _assassinShip2;
+ SceneObject _laserShot1;
+ SceneObject _laserShot2;
ASound _sound;
public:
Scene20();
@@ -248,15 +255,21 @@ public:
Action6 _action6;
Action7 _action7;
Action8 _action8;
- SceneObject _object1, _object2, _object3;
+ SceneObject _seeker;
+ SceneObject _seekerTail;
+ SceneObject _seekerHand;
DyingKzin _dyingKzin;
Assassin _assassin;
- SceneObject _doorway, _object7, _object8;
- DisplayHotspot _item1;
- Item2 _item2;
- DisplayHotspot _item3, _item4, _item5;
- Item6 _item6;
- DisplayHotspot _item7, _item8;
+ SceneObject _doorway;
+ SceneObject _leftEntrance;
+ DisplayHotspot _ball;
+ Item2 _statue;
+ DisplayHotspot _window;
+ DisplayHotspot _entrance;
+ DisplayHotspot _background;
+ Item6 _pedestal;
+ DisplayHotspot _emerald;
+ DisplayHotspot _tree;
Scene40();
virtual void postInit(SceneObjectList *OwnerList = NULL);
@@ -284,15 +297,15 @@ class Scene50 : public Scene {
public:
virtual void doAction(int action);
};
- class Object2 : public SceneObject {
+ class LeftFlyCycle : public SceneObject {
public:
virtual void doAction(int action);
};
- class Object3 : public SceneObject {
+ class CenterFlyCycle : public SceneObject {
public:
virtual void doAction(int action);
};
- class Object4 : public SceneObject {
+ class RightFlyCycle : public SceneObject {
public:
virtual void doAction(int action);
};
@@ -302,15 +315,18 @@ public:
Action1 _action1;
Action2 _action2;
Action3 _action3;
- Object1 _object1;
- Object2 _object2;
- Object3 _object3;
- Object4 _object4;
+ LeftFlyCycle _leftFlyCycle;
+ CenterFlyCycle _centerFlyCycle;
+ RightFlyCycle _rightFlyCycle;
Rect _doorwayRect;
SpeakerSText _speakerSText;
SpeakerQText _speakerQText;
- DisplayHotspot _item0, _item1, _item2;
- DisplayHotspot _item3, _item4, _item5;
+ DisplayHotspot _background;
+ DisplayHotspot _item1;
+ DisplayHotspot _entrance;
+ DisplayHotspot _bulwark;
+ DisplayHotspot _tree;
+ DisplayHotspot _flagstones;
Scene50();
virtual void postInit(SceneObjectList *OwnerList = NULL);
@@ -392,8 +408,12 @@ public:
MasterObject _masterButton;
FloppyDrive _floppyDrive;
SceneObject _redLights;
- Item1 _item1;
- Item _item2, _item3, _item4, _item5, _item6;
+ Item1 _diskDrive;
+ Item _dashboard;
+ Item _intercomm;
+ Item _viewScreen;
+ Item _speedControl;
+ Item _speaker;
ASound _soundHandler1;
ASound _soundHandler2;
ASound _soundHandler3;
@@ -409,11 +429,11 @@ class Scene90 : public Scene {
public:
virtual void signal();
};
- class Object1 : public SceneObject {
+ class SeekerShip : public SceneObject {
public:
virtual void doAction(int action);
};
- class Object2 : public SceneObject {
+ class Guard : public SceneObject {
public:
virtual void doAction(int action);
};
@@ -425,11 +445,15 @@ public:
SpeakerSR _speakerSR;
SpeakerMText _speakerMText;
Action1 _action1;
- Object1 _object1;
- Object2 _object2;
- DisplayObject _object3, _object4, _object5;
- SceneObject _object6;
- DisplayHotspot _item1, _item2, _item3;
+ SeekerShip _seekerShip;
+ Guard _guard;
+ DisplayObject _headGate;
+ DisplayObject _emptyShip;
+ DisplayObject _quinnShip;
+ SceneObject _bubble;
+ DisplayHotspot _guardShack;
+ DisplayHotspot _shed;
+ DisplayHotspot _background;
ASound _soundHandler1, _soundHandler2;
Scene90();
diff --git a/engines/tsage/ringworld/ringworld_scenes10.cpp b/engines/tsage/ringworld/ringworld_scenes10.cpp
index f9a8e7996a..c4874c0f59 100644
--- a/engines/tsage/ringworld/ringworld_scenes10.cpp
+++ b/engines/tsage/ringworld/ringworld_scenes10.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope 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.
@@ -1217,7 +1217,7 @@ void Scene9500::postInit(SceneObjectList *OwnerList) {
g_globals->_events.setCursor(CURSOR_WALK);
g_globals->_player.disableControl();
- if ((g_globals->_sceneManager._previousScene == 9200) || (g_globals->_sceneManager._previousScene != 9850)) {
+ if (g_globals->_sceneManager._previousScene != 9850) {
_sceneMode = 0;
if (RING_INVENTORY._helmet._sceneNumber != 1) {
setAction(&_sequenceManager, this, 9501, &g_globals->_player, &_candle, NULL);
@@ -1870,7 +1870,7 @@ void Scene9900::signal() {
setAction(&_sequenceManager, this, 9908, &_object1, &_object2, &_object3, &_object4, &_object5, &_object6);
break;
case 162:
- warning("TBC: shutdown();");
+ // shutdown();
g_globals->_game->quitGame();
break;
case 9901:
diff --git a/engines/tsage/ringworld/ringworld_scenes10.h b/engines/tsage/ringworld/ringworld_scenes10.h
index 48859ab454..ff1a6e9070 100644
--- a/engines/tsage/ringworld/ringworld_scenes10.h
+++ b/engines/tsage/ringworld/ringworld_scenes10.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope 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.
diff --git a/engines/tsage/ringworld/ringworld_scenes2.cpp b/engines/tsage/ringworld/ringworld_scenes2.cpp
index e07c9253e6..1140f6f3d1 100644
--- a/engines/tsage/ringworld/ringworld_scenes2.cpp
+++ b/engines/tsage/ringworld/ringworld_scenes2.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope 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.
diff --git a/engines/tsage/ringworld/ringworld_scenes2.h b/engines/tsage/ringworld/ringworld_scenes2.h
index 382d9d4157..825cd04c17 100644
--- a/engines/tsage/ringworld/ringworld_scenes2.h
+++ b/engines/tsage/ringworld/ringworld_scenes2.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope 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.
diff --git a/engines/tsage/ringworld/ringworld_scenes3.cpp b/engines/tsage/ringworld/ringworld_scenes3.cpp
index b2ed986331..d8556c691e 100644
--- a/engines/tsage/ringworld/ringworld_scenes3.cpp
+++ b/engines/tsage/ringworld/ringworld_scenes3.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope 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.
@@ -799,7 +799,7 @@ void Scene2100::Action9::signal() {
scene->_stripManager.start(6010, this);
break;
case 6:
- if (scene->_stripManager._field2E8 != 165)
+ if (scene->_stripManager._currObj44Id != 165)
setAction(&scene->_action10);
else
setAction(&scene->_action11);
@@ -1010,7 +1010,7 @@ void Scene2100::Action12::signal() {
scene->_stripManager.start(6052, this);
break;
case 8:
- if (scene->_stripManager._field2E8 == 320)
+ if (scene->_stripManager._currObj44Id == 320)
g_globals->setFlag(74);
setDelay(30);
break;
@@ -2352,11 +2352,11 @@ void Scene2150::Action2::signal() {
scene->_hotspot14.setStrip(6);
scene->_hotspot14.setPosition(Common::Point(59, 54));
- if (scene->_stripManager._field2E8 == 15) {
+ if (scene->_stripManager._currObj44Id == 15) {
scene->_hotspot14.setFrame(5);
RING_INVENTORY._ale._sceneNumber = 1;
} else {
- scene->_hotspot14.setFrame(scene->_stripManager._field2E8 - 5);
+ scene->_hotspot14.setFrame(scene->_stripManager._currObj44Id - 5);
}
g_globals->_player.setFrame(1);
@@ -3160,7 +3160,7 @@ void Scene2230::Action1::signal() {
switch (_actionIndex++) {
case 0:
- switch (scene->_field30A) {
+ switch (scene->_sceneMode) {
case 1:
scene->setAction(&scene->_action3);
break;
@@ -3201,7 +3201,7 @@ void Scene2230::Action2::signal() {
switch (_actionIndex++) {
case 0:
- switch (scene->_field30A) {
+ switch (scene->_sceneMode) {
case 2:
scene->setAction(&scene->_action6, this);
break;
@@ -3212,7 +3212,7 @@ void Scene2230::Action2::signal() {
break;
case 1: {
g_globals->_player.disableControl();
- scene->_field30A = 1;
+ scene->_sceneMode = 1;
g_globals->_player._regionBitList |= ~0x80;
Common::Point pt(160, 96);
NpcMover *mover = new NpcMover();
@@ -3262,7 +3262,7 @@ void Scene2230::Action3::signal() {
break;
case 2:
g_globals->_player._regionBitList |= 0x80;
- scene->_field30A = 0;
+ scene->_sceneMode = 0;
g_globals->_player.setVisage(0);
g_globals->_player.setStrip2(-1);
@@ -3292,7 +3292,7 @@ void Scene2230::Action5::signal() {
switch (_actionIndex++) {
case 0:
- switch (scene->_field30A) {
+ switch (scene->_sceneMode) {
case 2:
scene->setAction(&scene->_action3, this);
break;
@@ -3318,7 +3318,7 @@ void Scene2230::Action5::signal() {
case 3:
g_globals->_events.setCursor(CURSOR_USE);
g_globals->_player._uiEnabled = true;
- scene->_field30A = 2;
+ scene->_sceneMode = 2;
remove();
break;
}
@@ -3335,7 +3335,7 @@ void Scene2230::Action6::signal() {
g_globals->_player.animate(ANIM_MODE_5, this);
break;
case 1:
- scene->_field30A = 0;
+ scene->_sceneMode = 0;
g_globals->_player.setVisage(0);
g_globals->_player._strip = 1;
g_globals->_player._canWalk = true;
@@ -3352,7 +3352,7 @@ void Scene2230::Action7::signal() {
case 0:
g_globals->_player.disableControl();
- switch (scene->_field30A) {
+ switch (scene->_sceneMode) {
case 1:
scene->setAction(&scene->_action3, this);
break;
@@ -3408,7 +3408,7 @@ void Scene2230::Action8::signal() {
case 0:
g_globals->_player.disableControl();
- switch (scene->_field30A) {
+ switch (scene->_sceneMode) {
case 1:
scene->setAction(&scene->_action3, this);
break;
@@ -3431,7 +3431,7 @@ void Scene2230::Action8::signal() {
g_globals->_sceneItems.remove(&scene->_hotspot11);
g_globals->_sceneItems.remove(&scene->_hotspot12);
- switch (scene->_field30A) {
+ switch (scene->_sceneMode) {
case 1:
scene->setAction(&scene->_action3, this);
break;
@@ -3560,7 +3560,7 @@ void Scene2230::Hotspot6::doAction(int action) {
}
break;
case CURSOR_USE:
- if (scene->_field30A == 1)
+ if (scene->_sceneMode == 1)
scene->setAction(&scene->_action3);
else if (g_globals->getFlag(13))
SceneItem::display2(2230, 28);
@@ -3586,7 +3586,7 @@ void Scene2230::Hotspot7::doAction(int action) {
}
break;
case CURSOR_USE:
- if (scene->_field30A == 2)
+ if (scene->_sceneMode == 2)
scene->setAction(&scene->_action6);
else if (g_globals->getFlag(13))
SceneItem::display2(2230, 29);
@@ -3692,7 +3692,7 @@ void Scene2230::Hotspot12::doAction(int action) {
/*--------------------------------------------------------------------------*/
Scene2230::Scene2230() : _hotspot9(0, CURSOR_LOOK, 2230, 16, CURSOR_USE, 2230, 18, LIST_END) {
- _field30A = 0;
+ _sceneMode = 0;
}
void Scene2230::postInit(SceneObjectList *OwnerList) {
@@ -3726,7 +3726,7 @@ void Scene2230::postInit(SceneObjectList *OwnerList) {
g_globals->_player._regionBitList |= 0x80;
g_globals->_player.changeZoom(-1);
- _field30A = 0;
+ _sceneMode = 0;
g_globals->_player.enableControl();
_hotspot5.setBounds(Rect(108, 34, 142, 76));
@@ -3748,7 +3748,7 @@ void Scene2230::postInit(SceneObjectList *OwnerList) {
void Scene2230::synchronize(Serializer &s) {
Scene::synchronize(s);
_rect1.synchronize(s);
- s.syncAsSint16LE(_field30A);
+ s.syncAsSint16LE(_sceneMode);
}
void Scene2230::dispatch() {
@@ -4946,8 +4946,6 @@ void Scene2310::synchronize(Serializer &s) {
}
void Scene2310::process(Event &event) {
- int frameNum = 0;
-
if (!event.handled && (event.eventType == EVENT_BUTTON_DOWN)) {
int idx = 0;
while (idx < 5) {
@@ -4961,7 +4959,7 @@ void Scene2310::process(Event &event) {
if (_wireIndex == 5) {
// No wire is currently active, so start moving designated wire
_wireIndex = idx;
- frameNum = idx + 2;
+ int frameNum = idx + 2;
if (event.mousePos.y > 105)
idx = findObject(idx);
diff --git a/engines/tsage/ringworld/ringworld_scenes3.h b/engines/tsage/ringworld/ringworld_scenes3.h
index 682ef44fc6..a371f800b9 100644
--- a/engines/tsage/ringworld/ringworld_scenes3.h
+++ b/engines/tsage/ringworld/ringworld_scenes3.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope 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.
@@ -579,7 +579,7 @@ public:
Hotspot11 _hotspot11;
Hotspot12 _hotspot12;
Rect _rect1;
- int _field30A;
+ int _sceneMode;
Scene2230();
virtual void postInit(SceneObjectList *OwnerList = NULL);
diff --git a/engines/tsage/ringworld/ringworld_scenes4.cpp b/engines/tsage/ringworld/ringworld_scenes4.cpp
index 98bf0158e7..4d40b34eea 100644
--- a/engines/tsage/ringworld/ringworld_scenes4.cpp
+++ b/engines/tsage/ringworld/ringworld_scenes4.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope 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.
diff --git a/engines/tsage/ringworld/ringworld_scenes4.h b/engines/tsage/ringworld/ringworld_scenes4.h
index 64706805bc..72913ea8f2 100644
--- a/engines/tsage/ringworld/ringworld_scenes4.h
+++ b/engines/tsage/ringworld/ringworld_scenes4.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope 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.
diff --git a/engines/tsage/ringworld/ringworld_scenes5.cpp b/engines/tsage/ringworld/ringworld_scenes5.cpp
index 004ccbbb6d..cb8a89de80 100644
--- a/engines/tsage/ringworld/ringworld_scenes5.cpp
+++ b/engines/tsage/ringworld/ringworld_scenes5.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope 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.
@@ -34,6 +34,9 @@ namespace Ringworld {
* Scene 4000 - Village
*
*--------------------------------------------------------------------------*/
+Scene4000::Hotspot8::Hotspot8() : SceneObject() {
+ _ctr = 0;
+}
void Scene4000::Action1::signal() {
// Quinn has the peg. Everybody enter the screen.
@@ -459,7 +462,7 @@ void Scene4000::Action12::signal() {
break;
case 2:
g_globals->setFlag(32);
- if (scene->_stripManager._field2E8 == 275) {
+ if (scene->_stripManager._currObj44Id == 275) {
g_globals->setFlag(82);
ADD_MOVER_NULL(scene->_guardRock, 292, 138);
ADD_PLAYER_MOVER(283, 147);
@@ -468,7 +471,7 @@ void Scene4000::Action12::signal() {
}
break;
case 3:
- if (scene->_stripManager._field2E8 == 275) {
+ if (scene->_stripManager._currObj44Id == 275) {
g_globals->_sceneManager.changeScene(4100);
} else {
ADD_PLAYER_MOVER_THIS(scene->_guardRock, 300, 132);
@@ -4219,7 +4222,12 @@ void Scene4300::process(Event &event) {
void Scene4301::Action1::synchronize(Serializer &s) {
Action::synchronize(s);
- s.syncAsSint16LE(_field34E);
+
+ if (s.getVersion() < 14) {
+ int useless = 0;
+ s.syncAsSint16LE(useless);
+ }
+
for (int idx = 0; idx < 6; ++idx)
s.syncAsSint16LE(_indexList[idx]);
}
@@ -4265,7 +4273,6 @@ void Scene4301::Action1::signal() {
scene->_hotspot3.fixPriority(255);
scene->_hotspot3.hide();
- _field34E = 0;
_state = 0;
_actionIndex = 2;
break;
diff --git a/engines/tsage/ringworld/ringworld_scenes5.h b/engines/tsage/ringworld/ringworld_scenes5.h
index c93df2a1d8..3010c7b401 100644
--- a/engines/tsage/ringworld/ringworld_scenes5.h
+++ b/engines/tsage/ringworld/ringworld_scenes5.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope 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.
@@ -99,6 +99,7 @@ class Scene4000 : public Scene {
private:
int _ctr;
public:
+ Hotspot8();
virtual void synchronize(Serializer &s) {
SceneObject::synchronize(s);
s.syncAsUint16LE(_ctr);
@@ -655,7 +656,6 @@ class Scene4301 : public Scene {
class Action1 : public ActionExt {
public:
SceneObject _buttonList[6];
- int _field34E;
int _indexList[6];
virtual void synchronize(Serializer &s);
diff --git a/engines/tsage/ringworld/ringworld_scenes6.cpp b/engines/tsage/ringworld/ringworld_scenes6.cpp
index 30a91b57aa..74f834c64f 100644
--- a/engines/tsage/ringworld/ringworld_scenes6.cpp
+++ b/engines/tsage/ringworld/ringworld_scenes6.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope 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.
@@ -1608,8 +1608,6 @@ Scene5200::Scene5200() :
void Scene5200::postInit(SceneObjectList *OwnerList) {
Scene::postInit();
setZoomPercents(0, 150, 199, 150);
- _fieldA = 5600;
- _fieldE = 5100;
_hotspot9._state = 0;
_hotspot10._state = 0;
@@ -2032,7 +2030,15 @@ void Scene5300::Hotspot8::doAction(int action) {
/*--------------------------------------------------------------------------*/
Scene5300::Scene5300() :
- _hotspot3(0, CURSOR_LOOK, 5300, 3, CURSOR_USE, 5300, 16, LIST_END) {
+ _hotspot3(0, CURSOR_LOOK, 5300, 3, CURSOR_USE, 5300, 16, LIST_END) {
+}
+
+void Scene5300::synchronize(Serializer &s) {
+ Scene::synchronize(s);
+ if (s.getVersion() < 11) {
+ int useless = 0;
+ s.syncAsSint16LE(useless);
+ }
}
void Scene5300::postInit(SceneObjectList *OwnerList) {
@@ -2119,7 +2125,6 @@ void Scene5300::postInit(SceneObjectList *OwnerList) {
setAction(&_sequenceManager, this, 5306, &g_globals->_player, &_hotspot3, NULL);
}
- _field1B0A = 1;
if (RING_INVENTORY._bone._sceneNumber == 5300) {
_hotspot5.postInit();
_hotspot5.setVisage(5301);
diff --git a/engines/tsage/ringworld/ringworld_scenes6.h b/engines/tsage/ringworld/ringworld_scenes6.h
index bf353de415..fcc7f900ce 100644
--- a/engines/tsage/ringworld/ringworld_scenes6.h
+++ b/engines/tsage/ringworld/ringworld_scenes6.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope 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.
@@ -318,15 +318,11 @@ public:
Hotspot6 _hotspot6;
Hotspot7 _hotspot7;
Hotspot8 _hotspot8;
- int _field1B0A;
Scene5300();
virtual void postInit(SceneObjectList *OwnerList = NULL);
virtual void signal();
- virtual void synchronize(Serializer &s) {
- Scene::synchronize(s);
- s.syncAsSint16LE(_field1B0A);
- }
+ virtual void synchronize(Serializer &s);
};
} // End of namespace Ringworld
diff --git a/engines/tsage/ringworld/ringworld_scenes8.cpp b/engines/tsage/ringworld/ringworld_scenes8.cpp
index 9cb85a6930..60bd72e1ef 100644
--- a/engines/tsage/ringworld/ringworld_scenes8.cpp
+++ b/engines/tsage/ringworld/ringworld_scenes8.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope 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.
@@ -30,6 +30,10 @@ namespace TsAGE {
namespace Ringworld {
+NamedHotspotMult::NamedHotspotMult() : SceneHotspot() {
+ _useLineNum = _lookLineNum = 0;
+}
+
void NamedHotspotMult::synchronize(Serializer &s) {
SceneHotspot::synchronize(s);
s.syncAsSint16LE(_useLineNum);
@@ -2533,6 +2537,10 @@ Scene7700::Scene7700() {
_object5._state = 0;
_object6._state = 0;
_prof._state = 0;
+
+ _seatCountLeft1 = 0;
+ _seatCountLeft2 = 0;
+ _seatCountRight = 0;
}
void Scene7700::synchronize(Serializer &s) {
diff --git a/engines/tsage/ringworld/ringworld_scenes8.h b/engines/tsage/ringworld/ringworld_scenes8.h
index b24f220f8c..ad5a91514e 100644
--- a/engines/tsage/ringworld/ringworld_scenes8.h
+++ b/engines/tsage/ringworld/ringworld_scenes8.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope 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.
@@ -40,7 +40,7 @@ using namespace TsAGE;
class NamedHotspotMult : public SceneHotspot {
public:
int _useLineNum, _lookLineNum;
- NamedHotspotMult() : SceneHotspot() {}
+ NamedHotspotMult();
virtual Common::String getClassName() { return "NamedHotspotMult"; }
virtual void synchronize(Serializer &s);
diff --git a/engines/tsage/ringworld/ringworld_speakers.cpp b/engines/tsage/ringworld/ringworld_speakers.cpp
index dc80df40a3..a4ce95928c 100644
--- a/engines/tsage/ringworld/ringworld_speakers.cpp
+++ b/engines/tsage/ringworld/ringworld_speakers.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope 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.
diff --git a/engines/tsage/ringworld/ringworld_speakers.h b/engines/tsage/ringworld/ringworld_speakers.h
index 305984a184..59e25dc166 100644
--- a/engines/tsage/ringworld/ringworld_speakers.h
+++ b/engines/tsage/ringworld/ringworld_speakers.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope 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.
diff --git a/engines/tsage/ringworld2/ringworld2_dialogs.cpp b/engines/tsage/ringworld2/ringworld2_dialogs.cpp
index 4ebbdd602d..99f88a1687 100644
--- a/engines/tsage/ringworld2/ringworld2_dialogs.cpp
+++ b/engines/tsage/ringworld2/ringworld2_dialogs.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope 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.
@@ -50,6 +50,7 @@ RightClickDialog::RightClickDialog() : GfxDialog() {
_btnList[5] = Common::Point(83, 47);
// Set the palette and change the cursor
+ _previousCursor = R2_GLOBALS._events.getCursor();
R2_GLOBALS._events.setCursor(CURSOR_ARROW);
setPalette();
@@ -136,7 +137,7 @@ bool RightClickDialog::process(Event &event) {
return false;
}
-void RightClickDialog::execute() {
+int RightClickDialog::execute() {
// Draw the dialog
draw();
@@ -157,7 +158,8 @@ void RightClickDialog::execute() {
}
// Execute the specified action
- CursorType cursorNum = CURSOR_NONE;
+ CursorType cursorNum = _previousCursor;
+ int result = -1;
switch (_selectedAction) {
case 0:
// Look action
@@ -177,36 +179,42 @@ void RightClickDialog::execute() {
break;
case 4:
// Change player
- CharacterDialog::show();
+ result = 0;
break;
case 5:
// Options dialog
+ result = 1;
break;
}
- if (cursorNum != CURSOR_NONE)
- R2_GLOBALS._events.setCursor(cursorNum);
-
+ R2_GLOBALS._events.setCursor(cursorNum);
_gfxManager.deactivate();
+
+ return result;
}
/*--------------------------------------------------------------------------*/
void CharacterDialog::show() {
CharacterDialog *dlg = new CharacterDialog();
+ CursorType cursorNum = R2_GLOBALS._events.getCursor();
+
+ // Reset the current cursor
+ R2_GLOBALS._events.setCursor(CURSOR_ARROW);
+
dlg->draw();
// Make the default button the currently active character
GfxButton *btn = NULL;
int oldCharacter = R2_GLOBALS._player._characterIndex;
switch (oldCharacter) {
- case 1:
+ case R2_QUINN:
btn = &dlg->_btnQuinn;
break;
- case 2:
+ case R2_SEEKER:
btn = &dlg->_btnSeeker;
break;
- case 3:
+ case R2_MIRANDA:
btn = &dlg->_btnMiranda;
break;
default:
@@ -234,7 +242,7 @@ void CharacterDialog::show() {
SceneExt *scene = (SceneExt *)R2_GLOBALS._sceneManager._scene;
scene->saveCharacter(oldCharacter);
- // Play the correctfrequency, if any, of the character being switched to's scanner device
+ // Play the correctfrequency, if any, of the character being switched to's scanner device
if (R2_GLOBALS._player._characterScene[R2_NONE] != 300) {
switch (R2_GLOBALS._scannerFrequencies[R2_GLOBALS._player._characterIndex] - 1) {
case 0:
@@ -314,7 +322,13 @@ void CharacterDialog::show() {
// Change to whichever scene the newly selected character is in
R2_GLOBALS._sceneManager.changeScene(R2_GLOBALS._player._characterScene[R2_GLOBALS._player._characterIndex]);
- }
+
+ // Force the reset the current cursor
+ R2_GLOBALS._events.setCursor(CURSOR_USE);
+
+ } else
+ // Restore previous cursor
+ R2_GLOBALS._events.setCursor(cursorNum);
}
CharacterDialog::CharacterDialog() {
@@ -344,14 +358,14 @@ CharacterDialog::CharacterDialog() {
/*--------------------------------------------------------------------------*/
void HelpDialog::show() {
- // Set the palette and change the cursor
+ // change the cursor
R2_GLOBALS._events.setCursor(CURSOR_ARROW);
// Create the dialog and draw it
HelpDialog *dlg = new HelpDialog();
dlg->draw();
- // Show the character selection dialog
+ // Show the help dialog
GfxButton *btn = dlg->execute(&dlg->_btnResume);
// If a function button was selected, take care of it
@@ -381,6 +395,8 @@ void HelpDialog::show() {
// If a action button was selected, dispatch to handle it
if (evt.kbd.keycode != Common::KEYCODE_INVALID)
R2_GLOBALS._game->processEvent(evt);
+ else
+ R2_GLOBALS._events.setCursorFromFlag();
}
HelpDialog::HelpDialog() {
@@ -442,6 +458,36 @@ HelpDialog::HelpDialog() {
setCenter(160, 100);
}
+bool HelpDialog::handleKeypress(Event &event, GfxButton *&btn) {
+ switch (event.kbd.keycode) {
+ case Common::KEYCODE_F2:
+ btn = &_btnList[0];
+ break;
+ case Common::KEYCODE_F3:
+ btn = &_btnList[1];
+ break;
+ case Common::KEYCODE_F4:
+ btn = &_btnList[2];
+ break;
+ case Common::KEYCODE_F5:
+ btn = &_btnList[3];
+ break;
+ case Common::KEYCODE_F7:
+ btn = &_btnList[4];
+ break;
+ case Common::KEYCODE_F8:
+ btn = &_btnList[5];
+ break;
+ case Common::KEYCODE_F10:
+ btn = &_btnList[6];
+ break;
+ default:
+ return false;
+ }
+
+ return true;
+}
+
} // End of namespace Ringworld2
} // End of namespace TsAGE
diff --git a/engines/tsage/ringworld2/ringworld2_dialogs.h b/engines/tsage/ringworld2/ringworld2_dialogs.h
index 02a1aed81c..3d1e1ad48c 100644
--- a/engines/tsage/ringworld2/ringworld2_dialogs.h
+++ b/engines/tsage/ringworld2/ringworld2_dialogs.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope 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.
@@ -50,13 +50,14 @@ private:
int _highlightedAction;
int _selectedAction;
+ CursorType _previousCursor;
public:
RightClickDialog();
~RightClickDialog();
virtual void draw();
virtual bool process(Event &event);
- void execute();
+ int execute();
};
class CharacterDialog: public GfxDialog {
@@ -82,6 +83,8 @@ public:
virtual ~HelpDialog() {}
static void show();
+
+ virtual bool handleKeypress(Event &event, GfxButton *&btn);
};
} // End of namespace Ringworld2
diff --git a/engines/tsage/ringworld2/ringworld2_logic.cpp b/engines/tsage/ringworld2/ringworld2_logic.cpp
index 90df72ab32..99188c1ab6 100644
--- a/engines/tsage/ringworld2/ringworld2_logic.cpp
+++ b/engines/tsage/ringworld2/ringworld2_logic.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope 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.
@@ -65,8 +65,12 @@ Scene *Ringworld2Game::createScene(int sceneNumber) {
// Deck #2 - By Lift
return new Scene200();
case 205:
- // Star-field Credits
- return new Scene205();
+ if (g_vm->getFeatures() & GF_DEMO)
+ // End of Demo
+ return new Scene205Demo();
+ else
+ // Star-field Credits
+ return new Scene205();
case 250:
// Lift
return new Scene250();
@@ -131,12 +135,13 @@ Scene *Ringworld2Game::createScene(int sceneNumber) {
// Cutscene - Ship
return new Scene1525();
case 1530:
- // Cutscene - Elevator
+ // Cutscene - Crashing on Rimwall
return new Scene1530();
case 1550:
// Spaceport
return new Scene1550();
case 1575:
+ // Spaceport - unused ship scene
return new Scene1575();
case 1580:
// Inside wreck
@@ -179,7 +184,7 @@ Scene *Ringworld2Game::createScene(int sceneNumber) {
// Spill Mountains: Balloon Launch Platform
return new Scene2350();
case 2400:
- // Spill Mountains: Large empty room
+ // Spill Mountains: Unused large empty room
return new Scene2400();
case 2425:
// Spill Mountains: The Hall of Records
@@ -203,7 +208,7 @@ Scene *Ringworld2Game::createScene(int sceneNumber) {
// Spill Mountains: Inside crevasse
return new Scene2455();
case 2500:
- // Spill Mountains: Large Cave
+ // Spill Mountains: Large Ledge
return new Scene2500();
case 2525:
// Spill Mountains: Furnace room
@@ -289,7 +294,7 @@ Scene *Ringworld2Game::createScene(int sceneNumber) {
// Confrontation
return new Scene3400();
case 3500:
- // Maze action sequencec
+ // Flub tube maze
return new Scene3500();
case 3600:
// Cutscene - walking at gunpoint
@@ -335,13 +340,16 @@ SceneExt::SceneExt(): Scene() {
_stripManager._onEnd = SceneExt::endStrip;
for (int i = 0; i < 256; i++)
- _field312[i] = 0;
+ _shadowPaletteMap[i] = 0;
_savedPlayerEnabled = false;
_savedUiEnabled = false;
_savedCanWalk = false;
_preventSaving = false;
+ // Reset screen clipping area
+ R2_GLOBALS._screenSurface._clipRect = Rect();
+
// WORKAROUND: In the original, playing animations don't reset the global _animationCtr
// counter as scene changes unless the playing animation explicitly finishes. For now,
// to make inter-scene debugging easier, I'm explicitly resetting the _animationCtr
@@ -352,7 +360,7 @@ SceneExt::SceneExt(): Scene() {
void SceneExt::synchronize(Serializer &s) {
Scene::synchronize(s);
- s.syncBytes(&_field312[0], 256);
+ s.syncBytes(&_shadowPaletteMap[0], 256);
_sceneAreas.synchronize(s);
}
@@ -364,15 +372,24 @@ void SceneExt::postInit(SceneObjectList *OwnerList) {
// Initialize fields
_action = NULL;
- _field12 = 0;
_sceneMode = 0;
+ static_cast<SceneHandlerExt *>(R2_GLOBALS._sceneHandler)->setupPaletteMaps();
+
int prevScene = R2_GLOBALS._sceneManager._previousScene;
int sceneNumber = R2_GLOBALS._sceneManager._sceneNumber;
- if (((prevScene == -1) && (sceneNumber != 180) && (sceneNumber != 205) && (sceneNumber != 50))
+ if (g_vm->getFeatures() & GF_DEMO) {
+ if (((prevScene == -1) && (sceneNumber != 180) && (sceneNumber != 205) && (sceneNumber != 50))
+ || (prevScene == 0) || (sceneNumber == 600)
+ || ((prevScene == 205 || prevScene == 180) && (sceneNumber == 100))) {
+ R2_GLOBALS._uiElements._active = true;
+ R2_GLOBALS._uiElements.show();
+ } else {
+ R2_GLOBALS._uiElements.updateInventory();
+ }
+ } else if (((prevScene == -1) && (sceneNumber != 180) && (sceneNumber != 205) && (sceneNumber != 50))
|| (sceneNumber == 50)
|| ((sceneNumber == 100) && (prevScene == 0 || prevScene == 180 || prevScene == 205))) {
- static_cast<SceneHandlerExt *>(R2_GLOBALS._sceneHandler)->setupPaletteMaps();
R2_GLOBALS._uiElements._active = true;
R2_GLOBALS._uiElements.show();
} else {
@@ -385,7 +402,7 @@ void SceneExt::remove() {
Scene::remove();
R2_GLOBALS._uiElements._active = true;
- if (R2_GLOBALS._events.getCursor() >= EXITCURSOR_N &&
+ if (R2_GLOBALS._events.getCursor() >= EXITCURSOR_N &&
R2_GLOBALS._events.getCursor() <= SHADECURSOR_DOWN)
R2_GLOBALS._events.setCursor(CURSOR_WALK);
}
@@ -396,19 +413,6 @@ void SceneExt::process(Event &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();
}
@@ -433,9 +437,9 @@ bool SceneExt::display(CursorType action, Event &event) {
SceneItem::display2(5, 0);
break;
case R2_SONIC_STUNNER:
- if ((R2_GLOBALS._scannerFrequencies[R2_QUINN] == 2)
+ if ((R2_GLOBALS._scannerFrequencies[R2_QUINN] == 2)
|| ((R2_GLOBALS._scannerFrequencies[R2_QUINN] == 1) &&
- (R2_GLOBALS._scannerFrequencies[R2_SEEKER] == 2) &&
+ (R2_GLOBALS._scannerFrequencies[R2_SEEKER] == 2) &&
(R2_GLOBALS._sceneManager._previousScene == 300))) {
R2_GLOBALS._sound4.stop();
R2_GLOBALS._sound3.play(46);
@@ -557,14 +561,14 @@ void SceneExt::saveCharacter(int characterIndex) {
void SceneExt::scalePalette(int RFactor, int GFactor, int BFactor) {
byte *tmpPal = R2_GLOBALS._scenePalette._palette;
byte newR, newG, newB;
- int tmp, varC, varD = 0;
+ int tmp, varD = 0;
for (int i = 0; i < 256; i++) {
newR = (RFactor * tmpPal[(3 * i)]) / 100;
newG = (GFactor * tmpPal[(3 * i) + 1]) / 100;
newB = (BFactor * tmpPal[(3 * i) + 2]) / 100;
- varC = 769;
+ int varC = 769;
for (int j = 255; j >= 0; j--) {
tmp = abs(tmpPal[(3 * j)] - newR);
if (tmp >= varC)
@@ -581,7 +585,7 @@ void SceneExt::scalePalette(int RFactor, int GFactor, int BFactor) {
varC = tmp;
varD = j;
}
- this->_field312[i] = varD;
+ this->_shadowPaletteMap[i] = varD;
}
}
@@ -621,10 +625,14 @@ void SceneHandlerExt::process(Event &event) {
SceneHandler::process(event);
}
+void SceneHandlerExt::dispatch() {
+ R2_GLOBALS._playStream.dispatch();
+ SceneHandler::dispatch();
+}
+
void SceneHandlerExt::postLoad(int priorSceneBeforeLoad, int currentSceneBeforeLoad) {
- if (priorSceneBeforeLoad == -1 || priorSceneBeforeLoad == 50
- || currentSceneBeforeLoad == 180 || priorSceneBeforeLoad == 205)
- setupPaletteMaps();
+ // Set up the shading maps used for showing the player in shadows
+ setupPaletteMaps();
if (currentSceneBeforeLoad == 2900) {
R2_GLOBALS._gfxFontNumber = 50;
@@ -806,7 +814,7 @@ Ringworld2InvObjectList::Ringworld2InvObjectList():
_chargedPowerCapsule(1, 12),
_aerosol(1, 13),
_remoteControl(1, 14),
- _opticalFibre(1, 15),
+ _opticalFiber(1, 15),
_clamp(1, 16),
_attractorHarness(1, 17),
_fuelCell(2, 2),
@@ -861,7 +869,7 @@ Ringworld2InvObjectList::Ringworld2InvObjectList():
_itemList.push_back(&_chargedPowerCapsule);
_itemList.push_back(&_aerosol);
_itemList.push_back(&_remoteControl);
- _itemList.push_back(&_opticalFibre);
+ _itemList.push_back(&_opticalFiber);
_itemList.push_back(&_clamp);
_itemList.push_back(&_attractorHarness);
_itemList.push_back(&_fuelCell);
@@ -925,7 +933,7 @@ void Ringworld2InvObjectList::reset() {
setObjectScene(R2_CHARGED_POWER_CAPSULE, 400);
setObjectScene(R2_AEROSOL, 500);
setObjectScene(R2_REMOTE_CONTROL, 1550);
- setObjectScene(R2_OPTICAL_FIBRE, 850);
+ setObjectScene(R2_OPTICAL_FIBER, 850);
setObjectScene(R2_CLAMP, 850);
setObjectScene(R2_ATTRACTOR_CABLE_HARNESS, 0);
setObjectScene(R2_FUEL_CELL, 1550);
@@ -1096,7 +1104,7 @@ void Ringworld2InvObjectList::selectDefault(int objectNumber) {
Common::String line = Common::String::format("%.5s%.5s%.5s%.5s%s %s %s %s.",
msg1.c_str(), msg2.c_str(), msg3.c_str(), msg4.c_str(),
msg1.c_str() + 5, msg2.c_str() + 5, msg3.c_str() + 5, msg4.c_str() + 5);
-
+
SceneItem::display(-1, -1, line.c_str(),
SET_WIDTH, 280,
SET_X, 160,
@@ -1125,7 +1133,6 @@ void Ringworld2Game::start() {
R2_GLOBALS._sceneHandler->_loadGameSlot = slot;
else {
// Switch to the first title screen
- R2_GLOBALS._events.setCursor(CURSOR_WALK);
R2_GLOBALS._uiElements._active = true;
R2_GLOBALS._sceneManager.setNewScene(180);
}
@@ -1205,25 +1212,25 @@ void Ringworld2Game::processEvent(Event &event) {
case Common::KEYCODE_F4:
// F4 - Restart
restartGame();
- g_globals->_events.setCursorFromFlag();
+ R2_GLOBALS._events.setCursorFromFlag();
break;
case Common::KEYCODE_F7:
// F7 - Restore
restoreGame();
- g_globals->_events.setCursorFromFlag();
+ R2_GLOBALS._events.setCursorFromFlag();
break;
case Common::KEYCODE_F8:
// F8 - Credits
- warning("TODO: Show Credits");
+ R2_GLOBALS._sceneManager.changeScene(205);
break;
case Common::KEYCODE_F10:
// F10 - Pause
GfxDialog::setPalette();
MessageDialog::show(GAME_PAUSED_MSG, OK_BTN_STRING);
- g_globals->_events.setCursorFromFlag();
+ R2_GLOBALS._events.setCursorFromFlag();
break;
default:
@@ -1234,8 +1241,13 @@ void Ringworld2Game::processEvent(Event &event) {
void Ringworld2Game::rightClick() {
RightClickDialog *dlg = new RightClickDialog();
- dlg->execute();
+ int option = dlg->execute();
delete dlg;
+
+ if (option == 0)
+ CharacterDialog::show();
+ else if (option == 1)
+ HelpDialog::show();
}
/*--------------------------------------------------------------------------*/
@@ -1282,7 +1294,7 @@ void SceneActor::postInit(SceneObjectList *OwnerList) {
void SceneActor::remove() {
R2_GLOBALS._sceneItems.remove(this);
- _field9C = NULL;
+ _shadowMap = NULL;
_linkedActor = NULL;
SceneObject::remove();
@@ -1323,26 +1335,6 @@ bool SceneActor::startAction(CursorType action, Event &event) {
GfxSurface SceneActor::getFrame() {
GfxSurface frame = SceneObject::getFrame();
- // TODO: Proper effects handling
- switch (_effect) {
- case EFFECT_NONE:
- case EFFECT_5:
- // TODO: Figure out purpose of setting image flags to 64, and getting
- // scene priorities -1 or _shade
- break;
- case EFFECT_SHADED:
- // TODO: Transposing using R2_GLOBALS._pixelArrayMap
- break;
- case EFFECT_2:
- // No effect
- break;
- case EFFECT_4:
- break;
- default:
- // TODO: Default effect
- break;
- }
-
return frame;
}
@@ -1353,6 +1345,7 @@ SceneArea::SceneArea(): SceneItem() {
_insideArea = false;
_savedCursorNum = CURSOR_NONE;
_cursorState = 0;
+ _cursorNum = CURSOR_NONE;
}
void SceneArea::synchronize(Serializer &s) {
@@ -1405,6 +1398,8 @@ void SceneArea::setDetails(const Rect &bounds, CursorType cursor) {
SceneExit::SceneExit(): SceneArea() {
_moving = false;
_destPos = Common::Point(-1, -1);
+
+ _sceneNumber = 0;
}
void SceneExit::synchronize(Serializer &s) {
@@ -1431,7 +1426,7 @@ void SceneExit::process(Event &event) {
if (!R2_GLOBALS._insetUp) {
SceneArea::process(event);
- if (_enabled) {
+ if (_enabled && R2_GLOBALS._player._enabled) {
if (event.eventType == EVENT_BUTTON_DOWN) {
if (!_bounds.contains(mousePos))
_moving = false;
@@ -1479,7 +1474,7 @@ void SceneAreaObject::process(Event &event) {
_savedCursorNum = R2_GLOBALS._events.getCursor();
R2_GLOBALS._events.setCursor(CURSOR_INVALID);
}
-
+
if (event.eventType == EVENT_BUTTON_DOWN) {
event.handled = true;
R2_GLOBALS._events.setCursor(_savedCursorNum);
@@ -1516,7 +1511,7 @@ MazeUI::MazeUI() {
_cellSize.x = _cellSize.y = 0;
_mapOffset.x = _mapOffset.y = 0;
_resNum = _cellsResNum = 0;
- _frameCount = _resCount = _mapImagePitch = _unused = 0;
+ _frameCount = _resCount = _mapImagePitch = 0;
}
MazeUI::~MazeUI() {
@@ -1532,7 +1527,9 @@ void MazeUI::synchronize(Serializer &s) {
s.syncAsSint16LE(_mapOffset.x);
s.syncAsSint16LE(_mapOffset.y);
- s.syncAsSint16LE(_unused);
+
+ int dummy = 0;
+ s.syncAsSint16LE(dummy);
}
void MazeUI::load(int resNum) {
@@ -1617,12 +1614,13 @@ void MazeUI::draw() {
(_cellSize.y - 1)) / _cellSize.y;
// Loop to handle the cell rows of the visible display area one at a time
- for (int yCtr = 0; yCtr < _cellsVisible.y; ++yCtr, yPos += ySize) {
+ for (int yCtr = 0; yCtr <= _cellsVisible.y; ++yCtr, yPos += ySize) {
int cellY = _mapOffset.y / _cellSize.y + yCtr;
// Loop to iterate through the horizontal visible cells to build up
- // an entire cell high horizontal slice of the map
- for (int xCtr = 0; xCtr < _cellsVisible.x; ++xCtr) {
+ // an entire cell high horizontal slice of the map, plus one extra cell
+ // to allow for partial cell scrolling on-screen on the left/right sides
+ for (int xCtr = 0; xCtr <= _cellsVisible.x; ++xCtr) {
int cellX = _mapOffset.x / _cellSize.x + xCtr;
// Get the type of content to display in the cell
@@ -1722,6 +1720,12 @@ void AnimationSlice::load(Common::File &f) {
AnimationSlices::AnimationSlices() {
_pixelData = NULL;
+
+ _dataSize = 0;
+ _dataSize2 = 0;
+ _slices->_sliceOffset = 0;
+ _slices->_drawMode = 0;
+ _slices->_secondaryIndex = 0;
}
AnimationSlices::~AnimationSlices() {
@@ -1783,10 +1787,21 @@ AnimationPlayer::AnimationPlayer(): EventHandler() {
_screenBounds = R2_GLOBALS._gfxManagerInstance._bounds;
_rect1 = R2_GLOBALS._gfxManagerInstance._bounds;
_paletteMode = ANIMPALMODE_REPLACE_PALETTE;
- _field3A = 1;
+ _canSkip = true;
_sliceHeight = 1;
- _field58 = 1;
_endAction = NULL;
+
+ _sliceCurrent = nullptr;
+ _sliceNext = nullptr;
+ _animLoaded = false;
+ _objectMode = ANIMOBJMODE_1;
+ _dataNeeded = 0;
+ _playbackTick = 0;
+ _playbackTickPrior = 0;
+ _position = 0;
+ _nextSlicesPosition = 0;
+ _frameDelay = 0;
+ _gameFrame = 0;
}
AnimationPlayer::~AnimationPlayer() {
@@ -1796,9 +1811,9 @@ AnimationPlayer::~AnimationPlayer() {
void AnimationPlayer::synchronize(Serializer &s) {
EventHandler::synchronize(s);
-
- // TODO: Implement saving for animation player state. Currently, I disable saving
- // when an animation is active, so saving it's state would a "nice to have".
+
+ // TODO: Implement saving for animation player state. Currently, I disable saving
+ // when an animation is active, so saving it's state would a "nice to have".
}
void AnimationPlayer::remove() {
@@ -1809,8 +1824,7 @@ void AnimationPlayer::remove() {
}
void AnimationPlayer::process(Event &event) {
- if ((event.eventType == EVENT_KEYPRESS) && (event.kbd.keycode == Common::KEYCODE_ESCAPE) &&
- (_field3A)) {
+ if ((event.eventType == EVENT_KEYPRESS) && (event.kbd.keycode == Common::KEYCODE_ESCAPE) && _canSkip) {
// Move the current position to the end
_position = _subData._duration;
}
@@ -1856,11 +1870,13 @@ bool AnimationPlayer::load(int animId, Action *endAction) {
_playbackTickPrior = -1;
_playbackTick = 0;
- // The final multiplication is used to deliberately slow down playback, since the original
- // was slowed down by the amount of time spent to decode and display the frames
- _frameDelay = (60 / _subData._frameRate) * 8;
+ _frameDelay = (60 / _subData._frameRate);
_gameFrame = R2_GLOBALS._events.getFrameNumber();
+ // WORKAROUND: Slow down the title sequences to better match the original
+ if (animId <= 4 || animId == 15)
+ _frameDelay *= 8;
+
if (_subData._totalSize) {
_dataNeeded = _subData._totalSize;
} else {
@@ -1929,7 +1945,7 @@ bool AnimationPlayer::load(int animId, Action *endAction) {
}
++R2_GLOBALS._animationCtr;
- _field38 = 1;
+ _animLoaded = true;
return true;
}
@@ -2026,7 +2042,7 @@ void AnimationPlayer::drawFrame(int sliceIndex) {
// Unlock the screen surface
R2_GLOBALS._screenSurface.unlockSurface();
- if (_objectMode == 42) {
+ if (_objectMode == ANIMOBJMODE_42) {
_screenBounds.expandPanes();
// Copy the drawn frame to the back surface
@@ -2076,7 +2092,7 @@ bool AnimationPlayer::isCompleted() {
}
void AnimationPlayer::close() {
- if (_field38) {
+ if (_animLoaded) {
switch (_paletteMode) {
case 0:
R2_GLOBALS._scenePalette.replace(&_palette);
@@ -2095,7 +2111,7 @@ void AnimationPlayer::close() {
// Close the resource file
_resourceFile.close();
- if (_objectMode != 42) {
+ if (_objectMode != ANIMOBJMODE_42) {
// flip screen in original
}
@@ -2105,7 +2121,7 @@ void AnimationPlayer::close() {
_animData1 = NULL;
_animData2 = NULL;
- _field38 = 0;
+ _animLoaded = false;
if (g_globals != NULL)
R2_GLOBALS._animationCtr = MAX(R2_GLOBALS._animationCtr - 1, 0);
}
@@ -2154,7 +2170,7 @@ void AnimationPlayer::getSlices() {
AnimationPlayerExt::AnimationPlayerExt(): AnimationPlayer() {
_isActive = false;
- _field3A = 0;
+ _canSkip = false;
}
void AnimationPlayerExt::synchronize(Serializer &s) {
@@ -2206,7 +2222,7 @@ void ModalWindow::process(Event &event) {
}
}
-void ModalWindow::proc12(int visage, int stripFrameNum, int frameNum, int posX, int posY) {
+void ModalWindow::setup2(int visage, int stripFrameNum, int frameNum, int posX, int posY) {
Scene1200 *scene = (Scene1200 *)R2_GLOBALS._sceneManager._scene;
_object1.postInit();
@@ -2219,7 +2235,7 @@ void ModalWindow::proc12(int visage, int stripFrameNum, int frameNum, int posX,
_insetCount = R2_GLOBALS._insetUp;
}
-void ModalWindow::proc13(int resNum, int lookLineNum, int talkLineNum, int useLineNum) {
+void ModalWindow::setup3(int resNum, int lookLineNum, int talkLineNum, int useLineNum) {
_object1.setDetails(resNum, lookLineNum, talkLineNum, useLineNum, 2, (SceneItem *) NULL);
}
@@ -2263,7 +2279,7 @@ void ScannerDialog::Button::process(Event &event) {
setFrame(2);
_buttonDown = false;
event.handled = true;
-
+
reset();
}
}
@@ -2318,7 +2334,7 @@ void ScannerDialog::Button::reset() {
case 1800:
if (R2_GLOBALS._rimLocation < 1201)
scanner._obj4.setup(4, 3, 3);
- else if (R2_GLOBALS._rimLocation < 1201)
+ else if (R2_GLOBALS._rimLocation > 1201)
scanner._obj4.setup(4, 3, 4);
else
scanner._obj4.setup(4, 3, 5);
@@ -2478,15 +2494,15 @@ void ScannerDialog::remove() {
ModalWindow::remove();
}
-void ScannerDialog::proc12(int visage, int stripFrameNum, int frameNum, int posX, int posY) {
+void ScannerDialog::setup2(int visage, int stripFrameNum, int frameNum, int posX, int posY) {
// Stop player moving if currently doing so
if (R2_GLOBALS._player._mover)
R2_GLOBALS._player.addMover(NULL);
R2_GLOBALS._events.setCursor(CURSOR_USE);
- ModalWindow::proc12(visage, stripFrameNum, frameNum, posX, posY);
+ ModalWindow::setup2(visage, stripFrameNum, frameNum, posX, posY);
- proc13(100, -1, -1, -1);
+ setup3(100, -1, -1, -1);
_talkButton.setup(1);
_scanButton.setup(2);
_slider.setup(R2_GLOBALS._scannerFrequencies[R2_GLOBALS._player._characterIndex], 142, 124, 35, 5);
diff --git a/engines/tsage/ringworld2/ringworld2_logic.h b/engines/tsage/ringworld2/ringworld2_logic.h
index 5c8af8d884..31d801fa55 100644
--- a/engines/tsage/ringworld2/ringworld2_logic.h
+++ b/engines/tsage/ringworld2/ringworld2_logic.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope 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.
@@ -81,7 +81,7 @@ private:
static void startStrip();
static void endStrip();
public:
- byte _field312[256];
+ byte _shadowPaletteMap[256];
bool _savedPlayerEnabled;
bool _savedUiEnabled;
bool _savedCanWalk;
@@ -114,6 +114,7 @@ public:
virtual void postInit(SceneObjectList *OwnerList = NULL);
virtual void process(Event &event);
virtual void postLoad(int priorSceneBeforeLoad, int currentSceneBeforeLoad);
+ virtual void dispatch();
void setupPaletteMaps();
};
@@ -177,7 +178,7 @@ public:
InvObject _chargedPowerCapsule;
InvObject _aerosol;
InvObject _remoteControl;
- InvObject _opticalFibre;
+ InvObject _opticalFiber;
InvObject _clamp;
InvObject _attractorHarness;
InvObject _fuelCell;
@@ -307,7 +308,6 @@ public:
int _frameCount;
int _resCount;
int _mapImagePitch;
- int _unused;
public:
MazeUI();
virtual ~MazeUI();
@@ -407,11 +407,11 @@ public:
AnimationData *_sliceNext;
Common::File _resourceFile;
Rect _rect1, _screenBounds;
- int _field38;
- int _field3A;
+ bool _animLoaded;
+ bool _canSkip;
AnimationPaletteMode _paletteMode;
AnimationObjectMode _objectMode;
- int _field58, _sliceHeight;
+ int _sliceHeight;
byte _palIndexes[256];
ScenePalette _palette;
AnimationPlayerSubData _subData;
@@ -461,8 +461,8 @@ public:
virtual void synchronize(Serializer &s);
virtual Common::String getClassName() { return "ModalWindow"; }
virtual void process(Event &event);
- virtual void proc12(int visage, int stripFrameNum, int frameNum, int posX, int posY);
- virtual void proc13(int resNum, int lookLineNum, int talkLineNum, int useLineNum);
+ virtual void setup2(int visage, int stripFrameNum, int frameNum, int posX, int posY);
+ virtual void setup3(int resNum, int lookLineNum, int talkLineNum, int useLineNum);
};
class ScannerDialog: public ModalWindow {
@@ -515,7 +515,7 @@ public:
virtual Common::String getClassName() { return "ScannerDialog"; }
virtual void remove();
- void proc12(int visage, int stripFrameNum, int frameNum, int posX, int posY);
+ virtual void setup2(int visage, int stripFrameNum, int frameNum, int posX, int posY);
};
} // End of namespace Ringworld2
diff --git a/engines/tsage/ringworld2/ringworld2_scenes0.cpp b/engines/tsage/ringworld2/ringworld2_scenes0.cpp
index 5e4b4e4191..b82565332a 100644
--- a/engines/tsage/ringworld2/ringworld2_scenes0.cpp
+++ b/engines/tsage/ringworld2/ringworld2_scenes0.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope 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.
@@ -116,7 +116,7 @@ bool Scene100::Table::startAction(CursorType action, Event &event) {
R2_GLOBALS._player.disableControl();
if (_strip == 2) {
scene->_sceneMode = 108;
- scene->_object3.postInit();
+ scene->_tableLocker.postInit();
scene->_stasisNegator.postInit();
if (R2_INVENTORY.getObjectScene(R2_NEGATOR_GUN) == 1) {
@@ -126,11 +126,13 @@ bool Scene100::Table::startAction(CursorType action, Event &event) {
scene->_stasisNegator.setDetails(100, 21, 22, 23, 2, (SceneItem *)NULL);
}
- scene->setAction(&scene->_sequenceManager2, scene, 108, this, &scene->_object3,
+ // Open table locker
+ scene->setAction(&scene->_sequenceManager2, scene, 108, this, &scene->_tableLocker,
&scene->_stasisNegator, &R2_GLOBALS._player, NULL);
} else {
scene->_sceneMode = 109;
- scene->setAction(&scene->_sequenceManager2, scene, 109, this, &scene->_object3,
+ // Close table locker
+ scene->setAction(&scene->_sequenceManager2, scene, 109, this, &scene->_tableLocker,
&scene->_stasisNegator, &R2_GLOBALS._player, NULL);
}
return true;
@@ -140,7 +142,7 @@ bool Scene100::Table::startAction(CursorType action, Event &event) {
if (_strip == 2) {
SceneItem::display2(100, 18);
scene->_sceneMode = 102;
- scene->_object3.postInit();
+ scene->_tableLocker.postInit();
scene->_stasisNegator.postInit();
if (R2_INVENTORY.getObjectScene(R2_NEGATOR_GUN) == 1) {
@@ -150,12 +152,12 @@ bool Scene100::Table::startAction(CursorType action, Event &event) {
scene->_stasisNegator.setDetails(100, 21, 22, 23, 2, (SceneItem *)NULL);
}
- scene->setAction(&scene->_sequenceManager2, scene, 102, this, &scene->_object3,
+ scene->setAction(&scene->_sequenceManager2, scene, 102, this, &scene->_tableLocker,
&scene->_stasisNegator, NULL);
} else {
SceneItem::display2(100, 19);
scene->_sceneMode = 103;
- scene->setAction(&scene->_sequenceManager2, scene, 103, this, &scene->_object3,
+ scene->setAction(&scene->_sequenceManager2, scene, 103, this, &scene->_tableLocker,
&scene->_stasisNegator, NULL);
}
return true;
@@ -165,22 +167,21 @@ bool Scene100::Table::startAction(CursorType action, Event &event) {
}
bool Scene100::StasisNegator::startAction(CursorType action, Event &event) {
- Scene100 *scene = (Scene100 *)R2_GLOBALS._sceneManager._scene;
-
switch (action) {
- case CURSOR_USE:
+ case CURSOR_USE: {
+ Scene100 *scene = (Scene100 *)R2_GLOBALS._sceneManager._scene;
+
R2_GLOBALS._player.disableControl();
scene->_sceneMode = 107;
scene->setAction(&scene->_sequenceManager1, scene, 107, &R2_GLOBALS._player, &scene->_stasisNegator, NULL);
return true;
+ }
default:
return SceneActor::startAction(action, event);
}
}
bool Scene100::DoorDisplay::startAction(CursorType action, Event &event) {
- Scene100 *scene = (Scene100 *)R2_GLOBALS._sceneManager._scene;
-
switch (action) {
case CURSOR_LOOK:
SceneItem::display2(100, _state ? 24 : 25);
@@ -188,25 +189,29 @@ bool Scene100::DoorDisplay::startAction(CursorType action, Event &event) {
case CURSOR_TALK:
SceneItem::display2(100, _state ? 26 : 27);
return true;
- case CURSOR_USE:
+ case CURSOR_USE: {
+ Scene100 *scene = (Scene100 *)R2_GLOBALS._sceneManager._scene;
+
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:
+ case CURSOR_USE: {
+ Scene100 *scene = (Scene100 *)R2_GLOBALS._sceneManager._scene;
+
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);
}
@@ -215,14 +220,15 @@ bool Scene100::SteppingDisks::startAction(CursorType action, Event &event) {
/*--------------------------------------------------------------------------*/
bool Scene100::Terminal::startAction(CursorType action, Event &event) {
- Scene100 *scene = (Scene100 *)R2_GLOBALS._sceneManager._scene;
-
switch (action) {
- case CURSOR_USE:
+ case CURSOR_USE: {
+ Scene100 *scene = (Scene100 *)R2_GLOBALS._sceneManager._scene;
+
R2_GLOBALS._player.disableControl();
scene->_sceneMode = 105;
scene->setAction(&scene->_sequenceManager1, scene, 105, &R2_GLOBALS._player, this, NULL);
return true;
+ }
default:
return NamedHotspot::startAction(action, event);
}
@@ -295,10 +301,10 @@ void Scene100::postInit(SceneObjectList *OwnerList) {
switch (R2_GLOBALS._sceneManager._previousScene) {
case 50:
case 180:
- _object5.postInit();
- _object4.postInit();
+ _wardrobeColorAnim.postInit();
+ _wardrobeTopAnim.postInit();
_sceneMode = 104;
- setAction(&_sequenceManager1, this, 104, &R2_GLOBALS._player, &_wardrobe, &_object4, &_object5, NULL);
+ setAction(&_sequenceManager1, this, 104, &R2_GLOBALS._player, &_wardrobe, &_wardrobeTopAnim, &_wardrobeColorAnim, NULL);
break;
case 125:
_sceneMode = 100;
@@ -331,14 +337,14 @@ void Scene100::signal() {
_table.setStrip(2);
_table.setFrame(3);
- _object3.remove();
+ _tableLocker.remove();
_stasisNegator.remove();
R2_GLOBALS._player.enableControl();
break;
case 104:
_sceneMode = 0;
- _object5.remove();
- _object4.remove();
+ _wardrobeColorAnim.remove();
+ _wardrobeTopAnim.remove();
R2_GLOBALS._player.animate(ANIM_MODE_1, NULL);
R2_GLOBALS._player._numFrames = 10;
@@ -387,7 +393,7 @@ void Scene100::dispatch() {
SceneExt::dispatch();
if ((_sceneMode == 101) && (_door._frame == 2) && (_table._strip == 5)) {
- _table.setAction(&_sequenceManager2, NULL, 103, &_table, &_object3, &_stasisNegator, NULL);
+ _table.setAction(&_sequenceManager2, NULL, 103, &_table, &_tableLocker, &_stasisNegator, NULL);
}
}
@@ -414,9 +420,9 @@ Scene125::Icon::Icon(): SceneActor() {
void Scene125::Icon::postInit(SceneObjectList *OwnerList) {
SceneObject::postInit();
- _object1.postInit();
- _object1.fixPriority(255);
- _object1.hide();
+ _glyph.postInit();
+ _glyph.fixPriority(255);
+ _glyph.hide();
_sceneText1._color1 = 92;
_sceneText1._color2 = 0;
@@ -459,15 +465,15 @@ void Scene125::Icon::process(Event &event) {
scene->_sound1.play(14);
setFrame(2);
- switch (_object1._strip) {
+ switch (_glyph._strip) {
case 1:
- _object1.setStrip(2);
+ _glyph.setStrip(2);
break;
case 3:
- _object1.setStrip(4);
+ _glyph.setStrip(4);
break;
case 5:
- _object1.setStrip(6);
+ _glyph.setStrip(6);
break;
default:
break;
@@ -486,15 +492,15 @@ void Scene125::Icon::process(Event &event) {
if ((event.eventType == EVENT_BUTTON_UP) && _pressed) {
setFrame(1);
- switch (_object1._strip) {
+ switch (_glyph._strip) {
case 2:
- _object1.setStrip(1);
+ _glyph.setStrip(1);
break;
case 4:
- _object1.setStrip(3);
+ _glyph.setStrip(3);
break;
case 6:
- _object1.setStrip(5);
+ _glyph.setStrip(5);
break;
default:
break;
@@ -508,8 +514,6 @@ void Scene125::Icon::process(Event &event) {
}
void Scene125::Icon::setIcon(int id) {
- Scene125 *scene = (Scene125 *)R2_GLOBALS._sceneManager._scene;
-
_lookLineNum = _iconId = id;
SceneActor::_lookLineNum = id;
@@ -517,9 +521,11 @@ void Scene125::Icon::setIcon(int id) {
_sceneText2.remove();
if (_lookLineNum) {
+ Scene125 *scene = (Scene125 *)R2_GLOBALS._sceneManager._scene;
+
showIcon();
- _object1.setup(161, ((id - 1) / 10) * 2 + 1, ((id - 1) % 10) + 1);
- _object1.setPosition(_position);
+ _glyph.setup(161, ((id - 1) / 10) * 2 + 1, ((id - 1) % 10) + 1);
+ _glyph.setPosition(_position);
_sceneText1._fontNumber = scene->_iconFontNumber;
_sceneText1.setup(CONSOLE125_MESSAGES[id]);
@@ -562,16 +568,16 @@ void Scene125::Icon::setIcon(int id) {
void Scene125::Icon::showIcon() {
_sceneText1.show();
_sceneText2.show();
- _object1.show();
- _object2.show();
+ _glyph.show();
+ _horizLine.show();
show();
}
void Scene125::Icon::hideIcon() {
_sceneText1.hide();
_sceneText2.hide();
- _object1.hide();
- _object2.hide();
+ _glyph.hide();
+ _horizLine.hide();
hide();
}
@@ -666,28 +672,28 @@ void Scene125::signal() {
case 2:
_icon1.setup(160, 1, 1);
_icon1.setPosition(Common::Point(65, 17));
- _icon1._object2.postInit();
- _icon1._object2.setup(160, 7, 1);
- _icon1._object2.setPosition(Common::Point(106, 41));
+ _icon1._horizLine.postInit();
+ _icon1._horizLine.setup(160, 7, 1);
+ _icon1._horizLine.setPosition(Common::Point(106, 41));
_icon2.setup(160, 1, 1);
_icon2.setPosition(Common::Point(80, 32));
- _icon2._object2.postInit();
- _icon2._object2.setup(160, 7, 2);
- _icon2._object2.setPosition(Common::Point(106, 56));
+ _icon2._horizLine.postInit();
+ _icon2._horizLine.setup(160, 7, 2);
+ _icon2._horizLine.setPosition(Common::Point(106, 56));
_icon3.setup(160, 1, 1);
_icon3.setPosition(Common::Point(65, 47));
- _icon3._object2.postInit();
- _icon3._object2.setup(160, 7, 1);
- _icon3._object2.setPosition(Common::Point(106, 71));
+ _icon3._horizLine.postInit();
+ _icon3._horizLine.setup(160, 7, 1);
+ _icon3._horizLine.setPosition(Common::Point(106, 71));
_icon4.setup(160, 1, 1);
_icon4.setPosition(Common::Point(80, 62));
_icon4._sceneRegionId = 5;
- _icon4._object2.postInit();
- _icon4._object2.setup(160, 7, 2);
- _icon4._object2.setPosition(Common::Point(106, 86));
+ _icon4._horizLine.postInit();
+ _icon4._horizLine.setup(160, 7, 2);
+ _icon4._horizLine.setPosition(Common::Point(106, 86));
_icon5.postInit();
_icon5.setup(160, 1, 1);
@@ -706,20 +712,23 @@ void Scene125::signal() {
R2_GLOBALS._player._canWalk = false;
break;
case 10:
- switch (_consoleMode) {
+ switch (_consoleMode) {
case 12:
_sceneMode = 129;
- _object1.postInit();
- _object2.postInit();
- _object3.postInit();
+ _starchart1.postInit();
+ _starchart2.postInit();
+ _starchart3.postInit();
if (R2_GLOBALS.getFlag(13)) {
- _object4.postInit();
- setAction(&_sequenceManager, this, 130, &R2_GLOBALS._player, &_object1, &_object2,
- &_object3, &_object4, NULL);
+ // Show starchart with Ringworld present
+ _starchart4.postInit();
+ setAction(&_sequenceManager, this, 130, &R2_GLOBALS._player, &_starchart1, &_starchart2,
+ &_starchart3, &_starchart4, NULL);
} else {
- setAction(&_sequenceManager, this, 129, &R2_GLOBALS._player, &_object1, &_object2, &_object3, NULL);
+ // Show starchart without Ringworld
+ setAction(&_sequenceManager, this, 129, &R2_GLOBALS._player, &_starchart1, &_starchart2,
+ &_starchart3, NULL);
}
break;
case 13:
@@ -776,7 +785,7 @@ void Scene125::signal() {
case 12:
if (_soundCount > 0)
--_soundCount;
- if (!_soundCount || (R2_GLOBALS._speechSubtitles & SPEECH_VOICE)) {
+ if (!_soundCount || !(R2_GLOBALS._speechSubtitles & SPEECH_VOICE)) {
_soundIndex = 0;
R2_GLOBALS._playStream.stop();
} else {
@@ -920,7 +929,7 @@ void Scene125::consoleAction(int id) {
_icon4.setPosition(Common::Point(52, 107));
_icon4._sceneRegionId = 9;
_icon4.setIcon(25);
- _icon4._object2.hide();
+ _icon4._horizLine.hide();
_icon6.setIcon(26);
_sceneMode = 10;
@@ -963,7 +972,7 @@ void Scene125::consoleAction(int id) {
_icon4.setPosition(Common::Point(52, 107));
_icon4._sceneRegionId = 9;
_icon4.setIcon(25);
- _icon4._object2.hide();
+ _icon4._horizLine.hide();
_icon6.setIcon(26);
_sceneMode = 10;
@@ -1047,7 +1056,7 @@ void Scene125::consoleAction(int id) {
break;
case 24:
_icon4.setIcon(25);
- _icon4._object2.hide();
+ _icon4._horizLine.hide();
if (_consoleMode == 10) {
setDetails(127, --_logIndex);
@@ -1059,7 +1068,7 @@ void Scene125::consoleAction(int id) {
break;
case 25:
_icon4.setIcon(25);
- _icon4._object2.hide();
+ _icon4._horizLine.hide();
if (_consoleMode == 10) {
setDetails(127, ++_logIndex);
@@ -1077,10 +1086,10 @@ void Scene125::consoleAction(int id) {
_icon4.hideIcon();
R2_GLOBALS._player.hide();
- _object1.hide();
- _object2.hide();
- _object3.hide();
- _object4.hide();
+ _starchart1.hide();
+ _starchart2.hide();
+ _starchart3.hide();
+ _starchart4.hide();
_sceneMode = 11;
_palette.loadPalette(160);
@@ -1103,7 +1112,7 @@ void Scene125::consoleAction(int id) {
_icon4.setPosition(Common::Point(52, 107));
_icon4._sceneRegionId = 9;
_icon4.setIcon(25);
- _icon4._object2.hide();
+ _icon4._horizLine.hide();
_icon6.setIcon(26);
_sceneMode = 10;
@@ -1163,7 +1172,7 @@ void Scene125::setDetails(int resNum, int lineNum) {
if ((_soundCount > 0) && (R2_GLOBALS._speechSubtitles & SPEECH_VOICE)) {
_sceneMode = 12;
- R2_GLOBALS._playStream.play(_soundIndexes[_soundIndex], this);
+ R2_GLOBALS._playStream.play(_soundIndexes[_soundIndex++], this);
}
} else {
// Passed the start or end of the message set, so return to the menu
@@ -1425,6 +1434,7 @@ Scene160::Scene160(): SceneExt() {
void Scene160::postInit(SceneObjectList *OwnerList) {
loadScene(4001);
+ R2_GLOBALS._uiElements._active = false;
SceneExt::postInit();
R2_GLOBALS._player._uiEnabled = false;
@@ -1446,6 +1456,8 @@ void Scene160::synchronize(Serializer &s) {
s.syncAsSint16LE(_frameNumber);
s.syncAsSint16LE(_yChange);
s.syncAsSint16LE(_lineNum);
+
+ _creditsList.synchronize(s);
}
void Scene160::remove() {
@@ -1500,11 +1512,9 @@ void Scene180::Action1::signal() {
/*--------------------------------------------------------------------------*/
Scene180::Scene180(): SceneExt() {
- _field412 = 0;
+ _helpEnabled = false;
_frameInc = 0;
_frameNumber = R2_GLOBALS._events.getFrameNumber();
- _field480 = 1;
- _field482 = -1;
_fontNumber = R2_GLOBALS.gfxManager()._font._fontNumber;
GfxFont font;
@@ -1531,7 +1541,7 @@ void Scene180::postInit(SceneObjectList *OwnerList) {
}
void Scene180::remove() {
- _stripManager._field2E8 = -1;
+ _stripManager._currObj44Id = -1;
// _stripManager._field2EA = -1;
SceneExt::remove();
@@ -1549,9 +1559,7 @@ void Scene180::synchronize(Serializer &s) {
SceneExt::synchronize(s);
s.syncAsSint16LE(_frameNumber);
- s.syncAsSint16LE(_field412);
- s.syncAsSint16LE(_field480);
- s.syncAsSint16LE(_field482);
+ s.syncAsSint16LE(_helpEnabled);
s.syncAsSint16LE(_frameInc);
s.syncAsSint16LE(_fontNumber);
s.syncAsSint16LE(_fontHeight);
@@ -1566,7 +1574,7 @@ void Scene180::signal() {
break;
case 1:
- _field412 = 1;
+ _helpEnabled = true;
R2_GLOBALS._sceneManager._hasPalette = true;
_animationPlayer._paletteMode = ANIMPALMODE_NONE;
_animationPlayer._isActive = true;
@@ -1604,7 +1612,8 @@ void Scene180::signal() {
case 30:
case 43:
case 47:
- _field412 = 0;
+ _helpEnabled = false;
+ R2_GLOBALS._screenSurface.fillRect(Rect(0, 0, SCREEN_WIDTH, SCREEN_HEIGHT), 0);
_palette.loadPalette(0);
_palette.loadPalette(9998);
R2_GLOBALS._scenePalette.addFader(_palette._palette, 256, 8, this);
@@ -1617,7 +1626,7 @@ void Scene180::signal() {
R2_GLOBALS._scene180Mode = 2;
_animationPlayer.load(2);
- _field412 = 1;
+ _helpEnabled = true;
R2_GLOBALS._scenePalette.addFader(_animationPlayer._subData._palData, 256, 6, NULL);
R2_GLOBALS._sound1.play(2);
break;
@@ -1654,7 +1663,7 @@ void Scene180::signal() {
break;
case 11:
- _field412 = 1;
+ _helpEnabled = true;
_door.postInit();
_shipDisplay.postInit();
setAction(&_sequenceManager, this, 4000, &_door, &_shipDisplay, NULL);
@@ -1669,7 +1678,7 @@ void Scene180::signal() {
case 24:
case 26:
case 46:
- setSceneDelay((R2_GLOBALS._speechSubtitles & 1) ? 1 : 18);
+ setSceneDelay((R2_GLOBALS._speechSubtitles & SPEECH_TEXT) ? 1 : 18);
break;
case 13:
@@ -1701,21 +1710,21 @@ void Scene180::signal() {
break;
case 27:
- _field412 = 0;
+ _helpEnabled = false;
_door.remove();
_shipDisplay.remove();
setSceneDelay(2);
break;
case 28:
- _field412 = 0;
+ _helpEnabled = false;
_palette.loadPalette(0);
_palette.loadPalette(9998);
R2_GLOBALS._scenePalette.addFader(_palette._palette, 256, 100, this);
break;
case 29:
- _field412 = 1;
+ _helpEnabled = true;
_animationPlayer._paletteMode = ANIMPALMODE_REPLACE_PALETTE;
_animationPlayer._isActive = true;
_animationPlayer._objectMode = ANIMOBJMODE_42;
@@ -1744,23 +1753,23 @@ void Scene180::signal() {
break;
case 32:
- _field412 = 1;
+ _helpEnabled = true;
_teal.postInit();
_teal.setPosition(Common::Point(161, 97));
_teal.hide();
- _webbser.postInit();
- _webbser.setPosition(Common::Point(60, 96));
- _webbser.hide();
+ _webbster.postInit();
+ _webbster.setPosition(Common::Point(60, 96));
+ _webbster.hide();
_stripManager.start(11, this);
break;
case 33:
_teal.hide();
- _webbser.setup(76, 4, 1);
- _webbser.setFrame(_webbser.getFrameCount());
+ _webbster.setup(76, 4, 1);
+ _webbster.setFrame(_webbster.getFrameCount());
_shipDisplay.postInit();
_shipDisplay.setup(75, 1, 1);
@@ -1772,7 +1781,7 @@ void Scene180::signal() {
case 34:
_teal.hide();
- _webbser.hide();
+ _webbster.remove();
_dutyOfficer.postInit();
_dutyOfficer.setup(76, 2, 1);
@@ -1794,7 +1803,7 @@ void Scene180::signal() {
break;
case 37:
- _field412 = 0;
+ _helpEnabled = false;
_dutyOfficer.remove();
_palette.loadPalette(9998);
R2_GLOBALS._scenePalette.addFader(_palette._palette, 256, 8, this);
@@ -1805,12 +1814,10 @@ void Scene180::signal() {
_shipDisplay.setAction(NULL);
_shipDisplay.remove();
- // TODO: Figure out why end action on sounds aren't firing. For now, I'm
- // simply setting up a scene delay to ensure the signal() method gets
- // called again after a brief delay
- setSceneDelay(10);
+ _backSurface.fillRect(Rect(0, 0, SCREEN_WIDTH, SCREEN_HEIGHT), 0);
+ R2_GLOBALS._screenSurface.fillRect(Rect(0, 0, SCREEN_WIDTH, SCREEN_HEIGHT), 0);
R2_GLOBALS._sound2.fadeOut2(NULL);
- R2_GLOBALS._sound1.fadeOut2(NULL /* this */);
+ R2_GLOBALS._sound1.fadeOut2(this);
break;
case 39:
@@ -1832,7 +1839,7 @@ void Scene180::signal() {
break;
case 41:
- _field412 = 1;
+ _helpEnabled = true;
_animationPlayer._isActive = true;
break;
@@ -1852,12 +1859,12 @@ void Scene180::signal() {
break;
case 45:
- _field412 = 1;
+ _helpEnabled = true;
_stripManager.start(28, this);
break;
case 48:
- _field412 = 1;
+ _helpEnabled = true;
_animationPlayer._paletteMode = ANIMPALMODE_NONE;
_animationPlayer._isActive = true;
_animationPlayer._objectMode = ANIMOBJMODE_1;
@@ -1871,13 +1878,21 @@ void Scene180::signal() {
case 49:
R2_GLOBALS._scene180Mode = 15;
R2_GLOBALS._paneRefreshFlag[0] = 3;
+
+ _backSurface.fillRect(Rect(0, 0, SCREEN_WIDTH, SCREEN_HEIGHT), 0);
+ R2_GLOBALS._screenSurface.fillRect(Rect(0, 0, SCREEN_WIDTH, SCREEN_HEIGHT), 0);
+
setSceneDelay(1);
break;
case 50:
R2_GLOBALS._scene180Mode = 0;
- _field412 = 0;
- R2_GLOBALS._sceneManager.changeScene(100);
+ _helpEnabled = false;
+
+ // WORKAROUND: The original changed to scene 100 here, Quinn's Bedroom,
+ // but instead we're changing to the previously unused scene 50, which shows
+ // a closeup of Quinn in the floatation bed first
+ R2_GLOBALS._sceneManager.changeScene(50);
break;
}
}
@@ -1889,11 +1904,10 @@ void Scene180::setSceneDelay(int v) {
void Scene180::process(Event &event) {
if ((event.eventType == EVENT_KEYPRESS) && (event.kbd.keycode == Common::KEYCODE_ESCAPE)) {
- event.handled = 1;
- if (!_field412) {
- if (R2_GLOBALS._scenePalette._listeners.size() == 0) {
+ event.handled = true;
+ if (_helpEnabled) {
+ if (R2_GLOBALS._scenePalette._listeners.size() == 0)
HelpDialog::show();
- }
}
}
@@ -2002,9 +2016,9 @@ void Scene180::restore() {
*--------------------------------------------------------------------------*/
bool Scene200::NorthDoor::startAction(CursorType action, Event &event) {
- Scene200 *scene = (Scene200 *)R2_GLOBALS._sceneManager._scene;
-
if (action == CURSOR_USE) {
+ Scene200 *scene = (Scene200 *)R2_GLOBALS._sceneManager._scene;
+
R2_GLOBALS._player.disableControl();
scene->_sceneMode = 202;
scene->setAction(&scene->_sequenceManager, scene, 202, &R2_GLOBALS._player, this, NULL);
@@ -2015,9 +2029,9 @@ bool Scene200::NorthDoor::startAction(CursorType action, Event &event) {
}
bool Scene200::EastDoor::startAction(CursorType action, Event &event) {
- Scene200 *scene = (Scene200 *)R2_GLOBALS._sceneManager._scene;
-
if (action == CURSOR_USE) {
+ Scene200 *scene = (Scene200 *)R2_GLOBALS._sceneManager._scene;
+
R2_GLOBALS._player.disableControl();
scene->_sceneMode = 200;
scene->setAction(&scene->_sequenceManager, scene, 200, &R2_GLOBALS._player, this, NULL);
@@ -2028,9 +2042,9 @@ bool Scene200::EastDoor::startAction(CursorType action, Event &event) {
}
bool Scene200::WestDoor::startAction(CursorType action, Event &event) {
- Scene200 *scene = (Scene200 *)R2_GLOBALS._sceneManager._scene;
-
if (action == CURSOR_USE) {
+ Scene200 *scene = (Scene200 *)R2_GLOBALS._sceneManager._scene;
+
R2_GLOBALS._player.disableControl();
scene->_sceneMode = 204;
scene->setAction(&scene->_sequenceManager, scene, 204, &R2_GLOBALS._player, this, NULL);
@@ -2340,12 +2354,21 @@ Scene205::Scene205(): SceneExt() {
GfxFont font;
font.setFontNumber(4);
_fontHeight = font.getHeight();
+
+ for (int i = 0; i < 3; i++) {
+ _starList1[i] = nullptr;
+ _starList2[i] = nullptr;
+ }
+
+ for (int i = 0; i < 4; i++)
+ _starList3[i] = nullptr;
}
void Scene205::postInit(SceneObjectList *OwnerList) {
loadScene(4000);
+ R2_GLOBALS._uiElements._active = false;
SceneExt::postInit();
- BF_GLOBALS._interfaceY = 200;
+ R2_GLOBALS._interfaceY = SCREEN_HEIGHT;
R2_GLOBALS._player._uiEnabled = false;
R2_GLOBALS._sound1.play(337);
@@ -2360,11 +2383,11 @@ void Scene205::synchronize(Serializer &s) {
SceneExt::synchronize(s);
for (int idx = 0; idx < 3; ++idx)
- SYNC_POINTER(_objList1[idx]);
+ SYNC_POINTER(_starList1[idx]);
for (int idx = 0; idx < 3; ++idx)
- SYNC_POINTER(_objList2[idx]);
+ SYNC_POINTER(_starList2[idx]);
for (int idx = 0; idx < 4; ++idx)
- SYNC_POINTER(_objList3[idx]);
+ SYNC_POINTER(_starList3[idx]);
s.syncAsSint16LE(_textIndex);
s.syncAsSint16LE(_lineNum);
@@ -2386,9 +2409,9 @@ void Scene205::process(Event &event) {
}
void Scene205::dispatch() {
- processList(_objList3, 4, Common::Rect(0, 0, 319, 200), 1, 1, 160, 100);
- processList(_objList2, 3, Common::Rect(0, 0, 319, 200), 2, 2, 160, 100);
- processList(_objList1, 3, Common::Rect(0, 0, 319, 200), 4, 3, 160, 100);
+ processList(_starList3, 4, Common::Rect(0, 0, 319, 200), 1, 1, 160, 100);
+ processList(_starList2, 3, Common::Rect(0, 0, 319, 200), 2, 2, 160, 100);
+ processList(_starList1, 3, Common::Rect(0, 0, 319, 200), 4, 3, 160, 100);
Scene::dispatch();
}
@@ -2400,10 +2423,10 @@ void Scene205::setup() {
Common::Point(140, 149), Common::Point(91, 166), Common::Point(299, 46), Common::Point(314, 10)
};
- // Set up the first object list
+ // Set up the first star list
for (int idx = 0; idx < 3; ++idx) {
- Object *obj = new Object();
- _objList1[idx] = obj;
+ Star *obj = new Star();
+ _starList1[idx] = obj;
obj->postInit();
obj->_flags |= OBJFLAG_CLONED;
@@ -2416,10 +2439,10 @@ void Scene205::setup() {
obj->fixPriority(12);
}
- // Setup the second object list
+ // Setup the second star list
for (int idx = 0; idx < 3; ++idx) {
- Object *obj = new Object();
- _objList2[idx] = obj;
+ Star *obj = new Star();
+ _starList2[idx] = obj;
obj->postInit();
obj->_flags |= OBJFLAG_CLONED;
@@ -2432,10 +2455,10 @@ void Scene205::setup() {
obj->fixPriority(11);
}
- // Setup the third object list
+ // Setup the third star list
for (int idx = 0; idx < 4; ++idx) {
- Object *obj = new Object();
- _objList3[idx] = obj;
+ Star *obj = new Star();
+ _starList3[idx] = obj;
obj->postInit();
obj->_flags |= OBJFLAG_CLONED;
@@ -2452,10 +2475,10 @@ void Scene205::setup() {
/**
* Handles moving a group of stars in the scene background
*/
-void Scene205::processList(Object **ObjList, int count, const Common::Rect &bounds,
+void Scene205::processList(Star **ObjList, int count, const Common::Rect &bounds,
int xMultiply, int yMultiply, int xCenter, int yCenter) {
for (int idx = 0; idx < count; ++idx) {
- Object *obj = ObjList[idx];
+ Star *obj = ObjList[idx];
Common::Point pt(obj->_position.x - xCenter, obj->_position.y - yCenter);
if ((obj->_position.x <= 319) && (obj->_position.x >= 0) &&
@@ -2496,6 +2519,72 @@ void Scene205::handleText() {
}
/*--------------------------------------------------------------------------
+ * Scene 205 Demo - End of Demo
+ *
+ *--------------------------------------------------------------------------*/
+
+void Scene205Demo::Action1::signal() {
+ Scene205Demo *scene = (Scene205Demo *)R2_GLOBALS._sceneManager._scene;
+
+ switch (_actionIndex++) {
+ case 0:
+ setDelay(2);
+ break;
+ case 1:
+ MessageDialog::show2(BUY_FULL_GAME_MSG, OK_BTN_STRING);
+ setDelay(1);
+ break;
+ case 2:
+ scene->leaveScene();
+ break;
+ default:
+ break;
+ }
+}
+
+/*--------------------------------------------------------------------------*/
+
+void Scene205Demo::leaveScene() {
+ if (g_globals->getFlag(85))
+ R2_GLOBALS._sceneManager.changeScene(160);
+ else
+ R2_GLOBALS._sceneManager.changeScene(R2_GLOBALS._sceneManager._previousScene);
+
+ BF_GLOBALS._scenePalette.loadPalette(0);
+ BF_GLOBALS._scenePalette.refresh();
+}
+
+void Scene205Demo::postInit(SceneObjectList *OwnerList) {
+ R2_GLOBALS._sceneManager._hasPalette = true;
+ R2_GLOBALS._scenePalette.loadPalette(0);
+
+ loadScene(1000);
+ R2_GLOBALS._uiElements._active = false;
+ R2_GLOBALS._player.enableControl();
+
+ SceneExt::postInit();
+
+ _sound1.play(337);
+ _stripManager.addSpeaker(&_animationPlayer);
+
+ setAction(&_action1);
+}
+
+void Scene205Demo::remove() {
+ R2_GLOBALS._sound1.fadeOut2(NULL);
+ SceneExt::remove();
+}
+
+void Scene205Demo::process(Event &event) {
+ if ((event.eventType == EVENT_KEYPRESS) && (event.kbd.keycode == Common::KEYCODE_ESCAPE)) {
+ event.handled = true;
+ leaveScene();
+ } else {
+ Scene::process(event);
+ }
+}
+
+/*--------------------------------------------------------------------------
* Scene 250 - Lift
*
*--------------------------------------------------------------------------*/
@@ -2511,10 +2600,10 @@ void Scene250::Button::synchronize(Serializer &s) {
}
bool Scene250::Button::startAction(CursorType action, Event &event) {
- Scene250 *scene = (Scene250 *)R2_GLOBALS._sceneManager._scene;
-
switch (action) {
- case CURSOR_USE:
+ case CURSOR_USE: {
+ Scene250 *scene = (Scene250 *)R2_GLOBALS._sceneManager._scene;
+
if (scene->_destButtonY) {
SceneItem::display2(250, 15);
} else {
@@ -2537,6 +2626,7 @@ bool Scene250::Button::startAction(CursorType action, Event &event) {
}
}
return true;
+ }
case CURSOR_LOOK:
switch (_floorNumber) {
@@ -2606,11 +2696,11 @@ void Scene250::synchronize(Serializer &s) {
void Scene250::postInit(SceneObjectList *OwnerList) {
loadScene(250);
+ R2_GLOBALS._uiElements._active = false;
SceneExt::postInit();
- BF_GLOBALS._interfaceY = 200;
+ R2_GLOBALS._interfaceY = SCREEN_HEIGHT;
R2_GLOBALS._player.postInit();
- R2_GLOBALS._uiElements._active = false;
R2_GLOBALS._player.setVisage(10);
R2_GLOBALS._player.hide();
R2_GLOBALS._player.enableControl();
@@ -2683,7 +2773,7 @@ void Scene250::signal() {
case 2:
if (_destButtonY - 12 == _currButtonY)
_sceneMode = 4;
- else
+ else
_sceneMode = 3;
signal();
@@ -2885,14 +2975,14 @@ void Scene300::Action3::signal() {
void Scene300::Action4::signal() {
- Scene300 *scene = (Scene300 *)R2_GLOBALS._sceneManager._scene;
-
if (!R2_GLOBALS._playStream.isPlaying()) {
- scene->_object7.setStrip2(R2_GLOBALS._randomSource.getRandomNumber(2));
- scene->_object7.setFrame(1);
+ Scene300 *scene = (Scene300 *)R2_GLOBALS._sceneManager._scene;
+
+ scene->_mirandaScreen.setStrip2(R2_GLOBALS._randomSource.getRandomNumber(2));
+ scene->_mirandaScreen.setFrame(1);
- scene->_object9.setStrip2(3);
- scene->_object9.setFrame(1);
+ scene->_quinnScreen.setStrip2(3);
+ scene->_quinnScreen.setFrame(1);
}
setDelay(60 + R2_GLOBALS._randomSource.getRandomNumber(479));
@@ -2901,16 +2991,16 @@ void Scene300::Action4::signal() {
/*--------------------------------------------------------------------------*/
bool Scene300::QuinnWorkstation::startAction(CursorType action, Event &event) {
- Scene300 *scene = (Scene300 *)R2_GLOBALS._sceneManager._scene;
-
switch (action) {
case CURSOR_USE:
- if (R2_GLOBALS._player._characterIndex != 1)
+ if (R2_GLOBALS._player._characterIndex != R2_QUINN)
SceneItem::display2(300, 46);
else if (R2_GLOBALS.getFlag(44)) {
R2_GLOBALS._player.setAction(NULL);
R2_GLOBALS._sceneManager.changeScene(325);
} else {
+ Scene300 *scene = (Scene300 *)R2_GLOBALS._sceneManager._scene;
+
R2_GLOBALS._player.disableControl();
scene->_sceneMode = 306;
scene->setAction(&scene->_sequenceManager1, scene, 306, &R2_GLOBALS._player, NULL);
@@ -2934,7 +3024,7 @@ bool Scene300::QuinnWorkstation::startAction(CursorType action, Event &event) {
bool Scene300::MirandaWorkstation::startAction(CursorType action, Event &event) {
switch (action) {
case CURSOR_USE:
- if (R2_GLOBALS._player._characterIndex != 3)
+ if (R2_GLOBALS._player._characterIndex != R2_MIRANDA)
SceneItem::display2(300, 49);
else
R2_GLOBALS._sceneManager.changeScene(325);
@@ -2964,7 +3054,7 @@ bool Scene300::SeekerWorkstation::startAction(CursorType action, Event &event) {
break;
case CURSOR_USE:
- if (R2_GLOBALS._player._characterIndex != 2)
+ if (R2_GLOBALS._player._characterIndex != R2_SEEKER)
SceneItem::display2(300, 48);
else
R2_GLOBALS._sceneManager.changeScene(325);
@@ -3131,10 +3221,10 @@ bool Scene300::Seeker::startAction(CursorType action, Event &event) {
}
bool Scene300::Quinn::startAction(CursorType action, Event &event) {
- Scene300 *scene = (Scene300 *)R2_GLOBALS._sceneManager._scene;
-
switch (action) {
- case CURSOR_TALK:
+ case CURSOR_TALK: {
+ Scene300 *scene = (Scene300 *)R2_GLOBALS._sceneManager._scene;
+
R2_GLOBALS._player.disableControl();
R2_GLOBALS._events.setCursor(CURSOR_ARROW);
scene->_sceneMode = 10;
@@ -3156,18 +3246,18 @@ bool Scene300::Quinn::startAction(CursorType action, Event &event) {
scene->_stripManager.start3(scene->_stripId, scene, R2_GLOBALS._stripManager_lookupList);
return true;
-
+ }
default:
return SceneActor::startAction(action, event);
}
}
bool Scene300::Doorway::startAction(CursorType action, Event &event) {
- Scene300 *scene = (Scene300 *)R2_GLOBALS._sceneManager._scene;
-
if (action == CURSOR_USE) {
if ((R2_GLOBALS._player._characterIndex == R2_QUINN) &&
(!R2_GLOBALS.getFlag(44) || R2_GLOBALS._player._characterScene[R2_SEEKER] == 500)) {
+ Scene300 *scene = (Scene300 *)R2_GLOBALS._sceneManager._scene;
+
R2_GLOBALS._player.disableControl();
scene->_sceneMode = 301;
scene->setAction(&scene->_sequenceManager1, scene, 301, &R2_GLOBALS._player, this, NULL);
@@ -3223,29 +3313,29 @@ void Scene300::postInit(SceneObjectList *OwnerList) {
_rotation->_countdown = 1;
if (R2_GLOBALS.getFlag(51) && !R2_GLOBALS.getFlag(25)) {
- _object1.postInit();
- _object1.setup(301, 7, 2);
- _object1.setPosition(Common::Point(65, 24));
+ _atmosphereLeftWindow.postInit();
+ _atmosphereLeftWindow.setup(301, 7, 2);
+ _atmosphereLeftWindow.setPosition(Common::Point(65, 24));
- _object2.postInit();
- _object2.setup(301, 8, 2);
- _object2.setPosition(Common::Point(254, 24));
+ _atmosphereRightWindow.postInit();
+ _atmosphereRightWindow.setup(301, 8, 2);
+ _atmosphereRightWindow.setPosition(Common::Point(254, 24));
}
_doorway.postInit();
_doorway.setVisage(300);
_doorway.setPosition(Common::Point(159, 79));
- _object3.postInit();
- _object3.setup(300, 4, 1);
- _object3.setPosition(Common::Point(84, 48));
- _object3.animate(ANIM_MODE_2, NULL);
- _object3._numFrames = 5;
+ _leftVerticalBarsAnim.postInit();
+ _leftVerticalBarsAnim.setup(300, 4, 1);
+ _leftVerticalBarsAnim.setPosition(Common::Point(84, 48));
+ _leftVerticalBarsAnim.animate(ANIM_MODE_2, NULL);
+ _leftVerticalBarsAnim._numFrames = 5;
- _object4.postInit();
- _object4.setup(300, 5, 1);
- _object4.setPosition(Common::Point(236, 48));
- _object4.animate(ANIM_MODE_2, NULL);
+ _rightVerticalBarsAnim.postInit();
+ _rightVerticalBarsAnim.setup(300, 5, 1);
+ _rightVerticalBarsAnim.setPosition(Common::Point(236, 48));
+ _rightVerticalBarsAnim.animate(ANIM_MODE_2, NULL);
_protocolDisplay.postInit();
_protocolDisplay.setup(300, 6, 1);
@@ -3253,32 +3343,32 @@ void Scene300::postInit(SceneObjectList *OwnerList) {
_protocolDisplay.animate(ANIM_MODE_7, 0, NULL);
_protocolDisplay._numFrames = 5;
- _object6.postInit();
- _object6.setup(300, 7, 1);
- _object6.setPosition(Common::Point(214, 37));
- _object6.animate(ANIM_MODE_2, NULL);
- _object6._numFrames = 3;
-
- _object7.postInit();
- _object7.setup(301, 1, 1);
- _object7.setPosition(Common::Point(39, 97));
- _object7.fixPriority(124);
- _object7.animate(ANIM_MODE_2, NULL);
- _object7._numFrames = 5;
- _object7.setAction(&_action4);
-
- _object8.postInit();
- _object8.setup(300, 8, 1);
- _object8.setPosition(Common::Point(105, 37));
- _object8.animate(ANIM_MODE_2, NULL);
- _object8._numFrames = 5;
-
- _object9.postInit();
- _object9.setup(301, 6, 1);
- _object9.setPosition(Common::Point(274, 116));
- _object9.fixPriority(143);
- _object9.animate(ANIM_MODE_2, NULL);
- _object9._numFrames = 5;
+ _rightTextDisplay.postInit();
+ _rightTextDisplay.setup(300, 7, 1);
+ _rightTextDisplay.setPosition(Common::Point(214, 37));
+ _rightTextDisplay.animate(ANIM_MODE_2, NULL);
+ _rightTextDisplay._numFrames = 3;
+
+ _mirandaScreen.postInit();
+ _mirandaScreen.setup(301, 1, 1);
+ _mirandaScreen.setPosition(Common::Point(39, 97));
+ _mirandaScreen.fixPriority(124);
+ _mirandaScreen.animate(ANIM_MODE_2, NULL);
+ _mirandaScreen._numFrames = 5;
+ _mirandaScreen.setAction(&_action4);
+
+ _leftTextDisplay.postInit();
+ _leftTextDisplay.setup(300, 8, 1);
+ _leftTextDisplay.setPosition(Common::Point(105, 37));
+ _leftTextDisplay.animate(ANIM_MODE_2, NULL);
+ _leftTextDisplay._numFrames = 5;
+
+ _quinnScreen.postInit();
+ _quinnScreen.setup(301, 6, 1);
+ _quinnScreen.setPosition(Common::Point(274, 116));
+ _quinnScreen.fixPriority(143);
+ _quinnScreen.animate(ANIM_MODE_2, NULL);
+ _quinnScreen._numFrames = 5;
_quinnWorkstation1.setDetails(Rect(243, 148, 315, 167), 300, 30, 31, 32, 1, NULL);
_mirandaWorkstation1.setDetails(Rect(4, 128, 69, 167), 300, 33, 31, 35, 1, NULL);
@@ -3375,7 +3465,7 @@ void Scene300::postInit(SceneObjectList *OwnerList) {
_background.setDetails(Rect(0, 0, SCREEN_WIDTH, SCREEN_HEIGHT), 300, 0, -1, -1, 1, NULL);
switch (R2_GLOBALS._player._characterIndex) {
- case 1:
+ case R2_QUINN:
_sceneMode = 300;
switch (R2_GLOBALS._sceneManager._previousScene) {
@@ -3393,10 +3483,13 @@ void Scene300::postInit(SceneObjectList *OwnerList) {
if (R2_GLOBALS.getFlag(55)) {
if (R2_GLOBALS.getFlag(57)) {
+ // Little hack to get the correct sentence order
+ R2_GLOBALS._stripManager_lookupList[8] = 2;
+
R2_GLOBALS.clearFlag(60);
R2_GLOBALS._events.setCursor(CURSOR_ARROW);
_sceneMode = 16;
- _stripManager.start(404, this);
+ _stripManager.start3(404, this, R2_GLOBALS._stripManager_lookupList);
} else {
R2_GLOBALS._player.enableControl();
R2_GLOBALS._player._canWalk = false;
@@ -3464,11 +3557,11 @@ void Scene300::postInit(SceneObjectList *OwnerList) {
}
break;
- case 3:
+ case R2_MIRANDA:
if (R2_GLOBALS._sceneManager._previousScene == 1500) {
R2_GLOBALS._player._oldCharacterScene[R2_MIRANDA] = 3150;
R2_GLOBALS._player._characterScene[R2_MIRANDA] = 3150;
- R2_GLOBALS._player._effect = 0;
+ R2_GLOBALS._player._effect = EFFECT_NONE;
R2_GLOBALS._player.setAction(NULL);
R2_GLOBALS._player.disableControl();
@@ -3526,13 +3619,17 @@ void Scene300::signal() {
R2_GLOBALS.setFlag(40);
break;
case 6:
- R2_GLOBALS._sceneManager.changeScene(1000);
+ if (g_vm->getFeatures() & GF_DEMO) {
+ R2_GLOBALS.setFlag(85);
+ R2_GLOBALS._sceneManager.changeScene(205);
+ } else
+ R2_GLOBALS._sceneManager.changeScene(1000);
break;
default:
break;
}
- _stripManager._field2E8 = 0;
+ _stripManager._currObj44Id = 0;
switch (_stripId) {
case 400:
R2_GLOBALS._player.disableControl();
@@ -3545,7 +3642,7 @@ void Scene300::signal() {
default:
R2_GLOBALS._player.enableControl(CURSOR_TALK);
- if ((R2_GLOBALS._player._characterIndex != 1) || R2_GLOBALS.getFlag(44))
+ if ((R2_GLOBALS._player._characterIndex != R2_QUINN) || R2_GLOBALS.getFlag(44))
R2_GLOBALS._player._canWalk = false;
break;
}
@@ -3587,8 +3684,14 @@ void Scene300::signal() {
case 16:
if (_stripManager._exitMode == 1) {
- R2_GLOBALS._player.setAction(NULL);
- R2_GLOBALS._sceneManager.changeScene(1000);
+ if (g_vm->getFeatures() & GF_DEMO) {
+ R2_GLOBALS._player.setAction(NULL);
+ R2_GLOBALS.setFlag(85);
+ R2_GLOBALS._sceneManager.changeScene(205);
+ } else {
+ R2_GLOBALS._player.setAction(NULL);
+ R2_GLOBALS._sceneManager.changeScene(1000);
+ }
} else {
R2_GLOBALS._player.setAction(&_action1);
R2_GLOBALS._player.enableControl(CURSOR_TALK);
@@ -3653,7 +3756,7 @@ void Scene300::signal() {
case 313:
_sceneMode = 14;
- R2_GLOBALS._player._effect = 0;
+ R2_GLOBALS._player._effect = EFFECT_NONE;
_seeker.setAction(&_sequenceManager3, this, 314, &_seeker, &_doorway, NULL);
R2_GLOBALS._events.setCursor(CURSOR_ARROW);
_stripManager.start(301, this);
@@ -3662,7 +3765,7 @@ void Scene300::signal() {
case 314:
R2_GLOBALS._player.disableControl();
_sceneMode = 315;
- R2_GLOBALS._player._effect = 1;
+ R2_GLOBALS._player._effect = EFFECT_SHADED;
setAction(&_sequenceManager1, this, 315, &R2_GLOBALS._player, &_doorway, NULL);
break;
@@ -3673,7 +3776,7 @@ void Scene300::signal() {
case 316:
R2_GLOBALS._player._characterScene[R2_SEEKER] = 500;
_seeker.remove();
- R2_GLOBALS._player.enableControl(CURSOR_CROSSHAIRS);
+ R2_GLOBALS._player.enableControl(CURSOR_WALK);
break;
case 317:
@@ -3752,9 +3855,9 @@ Scene325::Icon::Icon(): SceneActor() {
void Scene325::Icon::postInit(SceneObjectList *OwnerList) {
SceneObject::postInit();
- _object1.postInit();
- _object1.fixPriority(21);
- _object1.hide();
+ _glyph.postInit();
+ _glyph.fixPriority(21);
+ _glyph.hide();
_sceneText1._color1 = 92;
_sceneText1._color2 = 0;
@@ -3793,18 +3896,18 @@ void Scene325::Icon::process(Event &event) {
scene->_sound1.play(14);
setFrame(2);
- switch (_object1._strip) {
+ switch (_glyph._strip) {
case 1:
- _object1.setStrip(2);
+ _glyph.setStrip(2);
break;
case 3:
- _object1.setStrip(4);
+ _glyph.setStrip(4);
break;
case 5:
- _object1.setStrip(6);
+ _glyph.setStrip(6);
break;
case 7:
- _object1.setStrip(8);
+ _glyph.setStrip(8);
break;
default:
break;
@@ -3823,15 +3926,15 @@ void Scene325::Icon::process(Event &event) {
if ((event.eventType == EVENT_BUTTON_UP) && _pressed) {
setFrame(1);
- switch (_object1._strip) {
+ switch (_glyph._strip) {
case 2:
- _object1.setStrip(1);
+ _glyph.setStrip(1);
break;
case 4:
- _object1.setStrip(3);
+ _glyph.setStrip(3);
break;
case 6:
- _object1.setStrip(5);
+ _glyph.setStrip(5);
break;
default:
break;
@@ -3845,8 +3948,6 @@ void Scene325::Icon::process(Event &event) {
}
void Scene325::Icon::setIcon(int id) {
- Scene325 *scene = (Scene325 *)R2_GLOBALS._sceneManager._scene;
-
_lookLineNum = _iconId = id;
SceneActor::_lookLineNum = id;
@@ -3854,9 +3955,11 @@ void Scene325::Icon::setIcon(int id) {
_sceneText2.remove();
if (_lookLineNum) {
+ Scene325 *scene = (Scene325 *)R2_GLOBALS._sceneManager._scene;
+
showIcon();
- _object1.setup(325, ((id - 1) / 10) * 2 + 1, ((id - 1) % 10) + 1);
- _object1.setPosition(_position);
+ _glyph.setup(325, ((id - 1) / 10) * 2 + 1, ((id - 1) % 10) + 1);
+ _glyph.setPosition(_position);
_sceneText1._fontNumber = scene->_iconFontNumber;
_sceneText1.setup(CONSOLE325_MESSAGES[id]);
@@ -3897,26 +4000,26 @@ void Scene325::Icon::setIcon(int id) {
void Scene325::Icon::showIcon() {
_sceneText1.show();
_sceneText2.show();
- _object1.show();
- _object2.show();
+ _glyph.show();
+ _horizLine.show();
show();
}
void Scene325::Icon::hideIcon() {
_sceneText1.hide();
_sceneText2.hide();
- _object1.hide();
- _object2.hide();
+ _glyph.hide();
+ _horizLine.hide();
hide();
}
/*--------------------------------------------------------------------------*/
Scene325::Scene325(): SceneExt() {
- _field412 = 7;
+ _consoleAction = 7;
_iconFontNumber = 50;
- _field416 = _field418 = 0;
- _field41A = _field41C = _field41E = _scannerLocation = 0;
+ _databasePage = _priorConsoleAction = 0;
+ _moveCounter = _yChange = _yDirection = _scannerLocation = 0;
_soundCount = _soundIndex = 0;
for (int idx = 0; idx < 10; ++idx)
@@ -3944,13 +4047,13 @@ void Scene325::postInit(SceneObjectList *OwnerList) {
void Scene325::synchronize(Serializer &s) {
SceneExt::synchronize(s);
- s.syncAsSint16LE(_field412);
+ s.syncAsSint16LE(_consoleAction);
s.syncAsSint16LE(_iconFontNumber);
- s.syncAsSint16LE(_field416);
- s.syncAsSint16LE(_field418);
- s.syncAsSint16LE(_field41A);
- s.syncAsSint16LE(_field41C);
- s.syncAsSint16LE(_field41E);
+ s.syncAsSint16LE(_databasePage);
+ s.syncAsSint16LE(_priorConsoleAction);
+ s.syncAsSint16LE(_moveCounter);
+ s.syncAsSint16LE(_yChange);
+ s.syncAsSint16LE(_yDirection);
s.syncAsSint16LE(_scannerLocation);
s.syncAsSint16LE(_soundCount);
s.syncAsSint16LE(_soundIndex);
@@ -3983,28 +4086,28 @@ void Scene325::signal() {
case 1:
_icon1.setup(160, 1, 1);
_icon1.setPosition(Common::Point(65, 17));
- _icon1._object2.postInit();
- _icon1._object2.setup(160, 7, 1);
- _icon1._object2.setPosition(Common::Point(106, 41));
+ _icon1._horizLine.postInit();
+ _icon1._horizLine.setup(160, 7, 1);
+ _icon1._horizLine.setPosition(Common::Point(106, 41));
_icon2.setup(160, 1, 1);
_icon2.setPosition(Common::Point(80, 32));
- _icon2._object2.postInit();
- _icon2._object2.setup(160, 7, 2);
- _icon2._object2.setPosition(Common::Point(106, 56));
+ _icon2._horizLine.postInit();
+ _icon2._horizLine.setup(160, 7, 2);
+ _icon2._horizLine.setPosition(Common::Point(106, 56));
_icon3.setup(160, 1, 1);
_icon3.setPosition(Common::Point(65, 47));
- _icon3._object2.postInit();
- _icon3._object2.setup(160, 7, 1);
- _icon3._object2.setPosition(Common::Point(106, 71));
+ _icon3._horizLine.postInit();
+ _icon3._horizLine.setup(160, 7, 1);
+ _icon3._horizLine.setPosition(Common::Point(106, 71));
_icon4.setup(160, 1, 1);
_icon4.setPosition(Common::Point(80, 62));
_icon4._sceneRegionId = 5;
- _icon4._object2.postInit();
- _icon4._object2.setup(160, 7, 2);
- _icon4._object2.setPosition(Common::Point(106, 86));
+ _icon4._horizLine.postInit();
+ _icon4._horizLine.setup(160, 7, 2);
+ _icon4._horizLine.setPosition(Common::Point(106, 86));
_icon5.postInit();
_icon5.setup(160, 1, 1);
@@ -4023,103 +4126,118 @@ void Scene325::signal() {
R2_GLOBALS._player._canWalk = false;
break;
case 9:
- switch (_field412) {
+ // Fade to black for console sub-section: database, or starchart
+ switch (_consoleAction) {
case 3:
+ // Starchart
_sceneMode = 129;
- _object1.postInit();
- _object2.postInit();
- _object3.postInit();
+ _starGrid1.postInit();
+ _starGrid2.postInit();
+ _starGrid3.postInit();
if (R2_GLOBALS.getFlag(13)) {
- _object4.postInit();
- setAction(&_sequenceManager1, this, 130, &R2_GLOBALS._player, &_object1,
- &_object2, &_object3, &_object4, NULL);
+ // Show starchart with Ringworld present
+ _starGrid4.postInit();
+ setAction(&_sequenceManager1, this, 130, &R2_GLOBALS._player, &_starGrid1,
+ &_starGrid2, &_starGrid3, &_starGrid4, NULL);
} else {
- setAction(&_sequenceManager1, this, 129, &R2_GLOBALS._player, &_object1,
- &_object2, &_object3, NULL);
+ // Show starchart without Ringworld
+ setAction(&_sequenceManager1, this, 129, &R2_GLOBALS._player, &_starGrid1,
+ &_starGrid2, &_starGrid3, NULL);
}
break;
case 17:
case 18:
case 19:
case 20: {
- int v = 10 - ((21 - _field412) * 2);
+ int v = 10 - ((21 - _consoleAction) * 2);
if (R2_GLOBALS.getFlag(50))
--v;
- if (_field418 == 5)
+ if (_priorConsoleAction == 5)
v += 8;
+
if (R2_GLOBALS.getFlag(51) && (v == 2))
R2_GLOBALS.setFlag(57);
if (R2_GLOBALS.getFlag(44) && !R2_GLOBALS.getFlag(51)) {
if (v != 13) {
+ if (_priorConsoleAction == 6) {
+ // Fix for original game bug.
+ // The passive short scan geographical and astronomical sentences
+ // are inverted in the original game.
+ if (v == 6)
+ v = 8;
+ else if (v == 8)
+ v = 6;
+ }
+
setMessage(328, v);
} else {
_scannerLocation = 864;
- _object12.postInit();
- _object12.setup(326, 4, 1);
- _object12.setPosition(Common::Point(149, 128));
- _object12.fixPriority(20);
-
- _scannerTab.postInit();
- _scannerTab.setup(326, 4, 2);
- _scannerTab.setPosition(Common::Point(149, 22 + (int)(_scannerLocation * ADJUST_FACTOR)));
- _scannerTab.fixPriority(21);
-
- _object10.postInit();
- _object10.setup(326, 1, 1);
- _object10.setPosition(Common::Point(210, 20));
- _object10.fixPriority(10);
-
- _object1.postInit();
- _object1.setup(326, 1, 1);
- _object1.setPosition(Common::Point(210, 32));
- _object1.fixPriority(10);
-
- _object2.postInit();
- _object2.setup(326, 1, 1);
- _object2.setPosition(Common::Point(210, 44));
- _object2.fixPriority(10);
-
- _object3.postInit();
- _object3.setup(326, 1, 1);
- _object3.setPosition(Common::Point(210, 56));
- _object3.fixPriority(10);
-
- _object4.postInit();
- _object4.setup(326, 1, 1);
- _object4.setPosition(Common::Point(210, 68));
- _object4.fixPriority(10);
-
- _object5.postInit();
- _object5.setup(326, 1, 1);
- _object5.setPosition(Common::Point(210, 80));
- _object5.fixPriority(10);
-
- _object6.postInit();
- _object6.setup(326, 1, 1);
- _object6.setPosition(Common::Point(210, 92));
- _object6.fixPriority(10);
-
- _object7.postInit();
- _object7.setup(326, 1, 1);
- _object7.setPosition(Common::Point(210, 104));
- _object7.fixPriority(10);
-
- _object8.postInit();
- _object8.setup(326, 1, 1);
- _object8.setPosition(Common::Point(210, 116));
- _object8.fixPriority(10);
-
- _object9.postInit();
- _object9.setup(326, 1, 1);
- _object9.setPosition(Common::Point(210, 128));
- _object9.fixPriority(10);
-
- _object11.postInit();
- _object11.setup(326, 1, 1);
- _object11.setPosition(Common::Point(210, 150));
- _object11.fixPriority(10);
+ _starGrid12.postInit();
+ _starGrid12.setup(326, 4, 1);
+ _starGrid12.setPosition(Common::Point(149, 128));
+ _starGrid12.fixPriority(20);
+
+ _starGrid13.postInit();
+ _starGrid13.setup(326, 4, 2);
+ _starGrid13.setPosition(Common::Point(149, 22 + (int)(_scannerLocation * ADJUST_FACTOR)));
+ _starGrid13.fixPriority(21);
+
+ _starGrid10.postInit();
+ _starGrid10.setup(326, 1, 1);
+ _starGrid10.setPosition(Common::Point(210, 20));
+ _starGrid10.fixPriority(10);
+
+ _starGrid1.postInit();
+ _starGrid1.setup(326, 1, 1);
+ _starGrid1.setPosition(Common::Point(210, 32));
+ _starGrid1.fixPriority(10);
+
+ _starGrid2.postInit();
+ _starGrid2.setup(326, 1, 1);
+ _starGrid2.setPosition(Common::Point(210, 44));
+ _starGrid2.fixPriority(10);
+
+ _starGrid3.postInit();
+ _starGrid3.setup(326, 1, 1);
+ _starGrid3.setPosition(Common::Point(210, 56));
+ _starGrid3.fixPriority(10);
+
+ _starGrid4.postInit();
+ _starGrid4.setup(326, 1, 1);
+ _starGrid4.setPosition(Common::Point(210, 68));
+ _starGrid4.fixPriority(10);
+
+ _starGrid5.postInit();
+ _starGrid5.setup(326, 1, 1);
+ _starGrid5.setPosition(Common::Point(210, 80));
+ _starGrid5.fixPriority(10);
+
+ _starGrid6.postInit();
+ _starGrid6.setup(326, 1, 1);
+ _starGrid6.setPosition(Common::Point(210, 92));
+ _starGrid6.fixPriority(10);
+
+ _starGrid7.postInit();
+ _starGrid7.setup(326, 1, 1);
+ _starGrid7.setPosition(Common::Point(210, 104));
+ _starGrid7.fixPriority(10);
+
+ _starGrid8.postInit();
+ _starGrid8.setup(326, 1, 1);
+ _starGrid8.setPosition(Common::Point(210, 116));
+ _starGrid8.fixPriority(10);
+
+ _starGrid9.postInit();
+ _starGrid9.setup(326, 1, 1);
+ _starGrid9.setPosition(Common::Point(210, 128));
+ _starGrid9.fixPriority(10);
+
+ _starGrid11.postInit();
+ _starGrid11.setup(326, 1, 1);
+ _starGrid11.setPosition(Common::Point(210, 150));
+ _starGrid11.fixPriority(10);
}
} else if (R2_GLOBALS.getFlag(51)) {
setMessage(329, (v == 12) ? 10 : v);
@@ -4131,41 +4249,42 @@ void Scene325::signal() {
case 21:
_sceneMode = 129;
- _object1.postInit();
- _object1.setup(327, 1, 1);
- _object1.setPosition(Common::Point(170, 80));
- _object1.fixPriority(10);
- _object1.animate(ANIM_MODE_5, NULL);
+ _starGrid1.postInit();
+ _starGrid1.setup(327, 1, 1);
+ _starGrid1.setPosition(Common::Point(170, 80));
+ _starGrid1.fixPriority(10);
+ _starGrid1.animate(ANIM_MODE_5, NULL);
break;
case 22:
_sceneMode = 129;
- _object1.postInit();
- _object1.setup(327, 2, 1);
- _object1.setPosition(Common::Point(160, 80));
- _object1.fixPriority(10);
- _object1.animate(ANIM_MODE_5, NULL);
+ _starGrid1.postInit();
+ _starGrid1.setup(327, 2, 1);
+ _starGrid1.setPosition(Common::Point(160, 80));
+ _starGrid1.fixPriority(10);
+ _starGrid1.animate(ANIM_MODE_5, NULL);
break;
case 24:
R2_GLOBALS._player.enableControl();
R2_GLOBALS._player._canWalk = false;
- _field416 = 37;
- setMessage(128, _field416);
+ _databasePage = 37;
+ setMessage(128, _databasePage);
break;
case 25:
R2_GLOBALS._player.enableControl();
R2_GLOBALS._player._canWalk = false;
- _field416 = 68;
- setMessage(128, _field416);
+ _databasePage = 68;
+ setMessage(128, _databasePage);
break;
case 26:
R2_GLOBALS._player.enableControl();
R2_GLOBALS._player._canWalk = false;
- _field416 = 105;
- setMessage(128, _field416);
+ _databasePage = 105;
+ setMessage(128, _databasePage);
break;
default:
- _field416 = 0;
+ _databasePage = 0;
+ setMessage(128, _databasePage);
break;
}
@@ -4176,7 +4295,7 @@ void Scene325::signal() {
R2_GLOBALS._player.enableControl();
R2_GLOBALS._player._canWalk = false;
- if ((_field412 >= 17) && (_field412 <= 20)) {
+ if ((_consoleAction >= 17) && (_consoleAction <= 20)) {
_icon5.setIcon(8);
consoleAction(4);
} else {
@@ -4197,12 +4316,12 @@ void Scene325::signal() {
if (_soundCount)
--_soundCount;
- if (!_soundCount || (R2_GLOBALS._speechSubtitles == 2)) {
+ if (!_soundCount || !(R2_GLOBALS._speechSubtitles & SPEECH_VOICE)) {
_soundIndex = 0;
R2_GLOBALS._playStream.stop();
} else {
_sceneMode = 15;
- R2_GLOBALS._playStream.play(_soundQueue[_soundIndex], this);
+ R2_GLOBALS._playStream.play(_soundQueue[_soundIndex++], this);
}
break;
default:
@@ -4227,7 +4346,7 @@ void Scene325::consoleAction(int id) {
if (id == 7)
_icon5.setIcon(9);
- else if ((_field412 != 3) && ((_field412 < 17) || (_field412 > 26)))
+ else if ((_consoleAction != 3) && ((_consoleAction < 17) || (_consoleAction > 26)))
_icon5.setIcon(8);
switch (id - 1) {
@@ -4236,10 +4355,12 @@ void Scene325::consoleAction(int id) {
_icon2.setIcon(11);
break;
case 1:
+ // Database screen
_icon1.setIcon(23);
_icon2.setIcon(24);
_icon3.setIcon(25);
_icon4.setIcon(26);
+ break;
case 2:
case 16:
case 17:
@@ -4253,13 +4374,13 @@ void Scene325::consoleAction(int id) {
_icon2.hideIcon();
_icon3.hideIcon();
- if (id == 2 || (id == 19 && _field418 == 5 && R2_GLOBALS.getFlag(50) &&
+ if (id == 2 || (id == 19 && _priorConsoleAction == 5 && R2_GLOBALS.getFlag(50) &&
R2_GLOBALS.getFlag(44) && !R2_GLOBALS.getFlag(51))) {
_icon5.setIcon(13);
_icon4.setPosition(Common::Point(52, 107));
_icon4._sceneRegionId = 9;
_icon4.setIcon(14);
- _icon4._object2.hide();
+ _icon4._horizLine.hide();
} else {
_icon4.hideIcon();
@@ -4269,16 +4390,17 @@ void Scene325::consoleAction(int id) {
_icon6.setIcon(12);
_sceneMode = 10;
_palette.loadPalette(161);
- BF_GLOBALS._scenePalette.addFader(&_palette._palette[0], 256, 5, this);
+ R2_GLOBALS._scenePalette.addFader(&_palette._palette[0], 256, 5, this);
break;
case 22:
case 23:
case 24:
case 25:
+ // Database sub-sections: A-G, N-O, P-S, T-Z
R2_GLOBALS._player.disableControl();
consoleAction(2);
- _field412 = id;
+ _consoleAction = id;
_icon1.hideIcon();
_icon2.hideIcon();
_icon3.hideIcon();
@@ -4288,12 +4410,12 @@ void Scene325::consoleAction(int id) {
_icon4.setPosition(Common::Point(52, 107));
_icon4._sceneRegionId = 9;
_icon4.setIcon(14);
- _icon4._object2.hide();
+ _icon4._horizLine.hide();
_icon6.setIcon(12);
_sceneMode = 10;
_palette.loadPalette(161);
- BF_GLOBALS._scenePalette.addFader(&_palette._palette[0], 256, 5, this);
+ R2_GLOBALS._scenePalette.addFader(&_palette._palette[0], 256, 5, this);
break;
case 11:
@@ -4311,24 +4433,25 @@ void Scene325::consoleAction(int id) {
_icon4._sceneRegionId = 5;
_icon4.hideIcon();
- _object12.remove();
- _scannerTab.remove();
- _object10.remove();
- _object1.remove();
- _object2.remove();
- _object3.remove();
- _object4.remove();
- _object5.remove();
- _object6.remove();
- _object7.remove();
- _object8.remove();
- _object9.remove();
- _object11.remove();
+ R2_GLOBALS._player.hide();
+ _starGrid1.remove();
+ _starGrid2.remove();
+ _starGrid3.remove();
+ _starGrid4.remove();
+ _starGrid5.remove();
+ _starGrid6.remove();
+ _starGrid7.remove();
+ _starGrid8.remove();
+ _starGrid9.remove();
+ _starGrid10.remove();
+ _starGrid11.remove();
+ _starGrid12.remove();
+ _starGrid13.remove();
_palette.loadPalette(160);
_sceneMode = 11;
- BF_GLOBALS._scenePalette.addFader(&_palette._palette[0], 256, 5, this);
+ R2_GLOBALS._scenePalette.addFader(&_palette._palette[0], 256, 5, this);
}
break;
@@ -4339,63 +4462,74 @@ void Scene325::consoleAction(int id) {
break;
case 4:
case 5:
- _field418 = id;
+ _priorConsoleAction = id;
_icon1.setIcon(17);
_icon2.setIcon(18);
_icon3.setIcon(19);
_icon4.setIcon(20);
break;
case 7:
- consoleAction(((_field412 == 5) || (_field412 == 6) || (_field412 == 15)) ? 4 : 7);
+ consoleAction(((_consoleAction == 5) || (_consoleAction == 6) || (_consoleAction == 15)) ? 4 : 7);
break;
case 8:
R2_GLOBALS._sceneManager.changeScene(300);
+ break;
case 9:
case 10:
+ // Set language: Interworld or Hero's Tongue
_iconFontNumber = (id - 1) == 9 ? 50 : 52;
_text1.remove();
_icon6.setIcon(7);
+ consoleAction(1);
break;
case 12:
+ // Page up button
_icon4.setIcon(14);
- _icon4._object2.hide();
+ _icon4._horizLine.hide();
- switch (_field412) {
+ switch (_consoleAction) {
case 17:
case 18:
case 19:
case 20:
if (_scannerLocation) {
R2_GLOBALS._player.disableControl();
- _field41A = 1296;
- _field41E = 1;
+ _moveCounter = 1296;
+ _yDirection = 1;
}
break;
default:
- setMessage(128, --_field416);
+ setMessage(128, --_databasePage);
break;
}
return;
case 13:
+ // Page down button
_icon4.setIcon(14);
- _icon4._object2.hide();
+ _icon4._horizLine.hide();
- switch (_field412) {
+ switch (_consoleAction) {
case 17:
case 18:
case 19:
case 20:
if (_scannerLocation < 1620) {
R2_GLOBALS._player.disableControl();
- _field41A = 1296;
- _field41E = -1;
+ _moveCounter = 1296;
+ _yDirection = -1;
}
break;
+ default:
+ setMessage(128, ++_databasePage);
+ break;
}
return;
case 14:
if (R2_GLOBALS.getFlag(55)) {
- SceneItem::display2(329, 17);
+ consoleAction(4);
+ // Workaround for original game bug.
+ // Empty message crashing the game. It should be a warning message forbidding to switch to active scan
+ // SceneItem::display2(329, 17);
} else {
R2_GLOBALS.setFlag(50);
consoleAction(4);
@@ -4409,6 +4543,7 @@ void Scene325::consoleAction(int id) {
break;
case 6:
default:
+ // Initial starting screen
_icon1.setIcon(1);
_icon2.setIcon(2);
_icon3.setIcon(3);
@@ -4418,7 +4553,7 @@ void Scene325::consoleAction(int id) {
}
if (id != 8)
- _field412 = id;
+ _consoleAction = id;
}
void Scene325::process(Event &event) {
@@ -4435,48 +4570,48 @@ void Scene325::process(Event &event) {
}
void Scene325::dispatch() {
- if (_field41A) {
- switch (_field41A) {
+ if (_moveCounter) {
+ switch (_moveCounter) {
case 13:
- _field41C = 1;
+ _yChange = 1;
break;
case 1296:
R2_GLOBALS._sound3.play(87);
- _field41C = 1;
+ _yChange = 1;
break;
case 33:
case 1283:
- _field41C = 2;
+ _yChange = 2;
break;
case 63:
case 1263:
- _field41C = 3;
+ _yChange = 3;
break;
case 103:
case 1233:
- _field41C = 4;
+ _yChange = 4;
break;
case 153:
case 1193:
- _field41C = 5;
+ _yChange = 5;
break;
case 213:
case 1143:
- _field41C = 6;
+ _yChange = 6;
break;
case 283:
case 1083:
- _field41C = 7;
+ _yChange = 7;
break;
case 1013:
- _field41C = 8;
+ _yChange = 8;
break;
default:
break;
}
- _field41A -= _field41C;
- int yp = _field41E * _field41C + _object10._position.y;
+ _moveCounter -= _yChange;
+ int yp = _yDirection * _yChange + _starGrid10._position.y;
bool flag = false;
if (yp >= 30) {
@@ -4489,51 +4624,51 @@ void Scene325::dispatch() {
++_scannerLocation;
flag = true;
}
- _scannerTab.setPosition(Common::Point(149, 22 + (int)(_scannerLocation * ADJUST_FACTOR)));
+ _starGrid13.setPosition(Common::Point(149, 22 + (int)(_scannerLocation * ADJUST_FACTOR)));
for (int idx = 0; idx < 4; ++idx)
_objList[idx].remove();
if (flag) {
int v = _scannerLocation - 758;
- _object10.setFrame((v++ <= 0) ? 1 : v);
- _object1.setFrame((v++ <= 0) ? 1 : v);
- _object2.setFrame((v++ <= 0) ? 1 : v);
- _object3.setFrame((v++ <= 0) ? 1 : v);
- _object4.setFrame((v++ <= 0) ? 1 : v);
- _object5.setFrame((v++ <= 0) ? 1 : v);
- _object6.setFrame((v++ <= 0) ? 1 : v);
- _object7.setFrame((v++ <= 0) ? 1 : v);
- _object8.setFrame((v++ <= 0) ? 1 : v);
- _object9.setFrame((v++ <= 0) ? 1 : v);
- _object11.setFrame((v++ <= 0) ? 1 : v);
- }
-
- _object10.setPosition(Common::Point(210, yp));
+ _starGrid10.setFrame((v++ <= 0) ? 1 : v);
+ _starGrid1.setFrame((v++ <= 0) ? 1 : v);
+ _starGrid2.setFrame((v++ <= 0) ? 1 : v);
+ _starGrid3.setFrame((v++ <= 0) ? 1 : v);
+ _starGrid4.setFrame((v++ <= 0) ? 1 : v);
+ _starGrid5.setFrame((v++ <= 0) ? 1 : v);
+ _starGrid6.setFrame((v++ <= 0) ? 1 : v);
+ _starGrid7.setFrame((v++ <= 0) ? 1 : v);
+ _starGrid8.setFrame((v++ <= 0) ? 1 : v);
+ _starGrid9.setFrame((v++ <= 0) ? 1 : v);
+ _starGrid11.setFrame((v++ <= 0) ? 1 : v);
+ }
+
+ _starGrid10.setPosition(Common::Point(210, yp));
yp += 12;
- _object1.setPosition(Common::Point(210, yp));
+ _starGrid1.setPosition(Common::Point(210, yp));
yp += 12;
- _object2.setPosition(Common::Point(210, yp));
+ _starGrid2.setPosition(Common::Point(210, yp));
yp += 12;
- _object3.setPosition(Common::Point(210, yp));
+ _starGrid3.setPosition(Common::Point(210, yp));
yp += 12;
- _object4.setPosition(Common::Point(210, yp));
+ _starGrid4.setPosition(Common::Point(210, yp));
yp += 12;
- _object5.setPosition(Common::Point(210, yp));
+ _starGrid5.setPosition(Common::Point(210, yp));
yp += 12;
- _object6.setPosition(Common::Point(210, yp));
+ _starGrid6.setPosition(Common::Point(210, yp));
yp += 12;
- _object7.setPosition(Common::Point(210, yp));
+ _starGrid7.setPosition(Common::Point(210, yp));
yp += 12;
- _object8.setPosition(Common::Point(210, yp));
+ _starGrid8.setPosition(Common::Point(210, yp));
yp += 12;
- _object9.setPosition(Common::Point(210, yp));
+ _starGrid9.setPosition(Common::Point(210, yp));
yp += 12;
- _object11.setPosition(Common::Point(210, yp));
+ _starGrid11.setPosition(Common::Point(210, yp));
- if (!_field41A) {
+ if (!_moveCounter) {
R2_GLOBALS._sound3.stop();
- _field41C = 0;
+ _yChange = 0;
if (_scannerLocation == 756) {
R2_GLOBALS._player.disableControl();
@@ -4551,9 +4686,11 @@ void Scene325::dispatch() {
}
void Scene325::setMessage(int resNum, int lineNum) {
- Common::String msg = g_resourceManager->getMessage(resNum, lineNum);
+ removeText();
+ Common::String msg = g_resourceManager->getMessage(resNum, lineNum, true);
if (!msg.empty()) {
+ // Found valid database entry to display
Common::String msgText = parseMessage(msg);
_text1._fontNumber = _iconFontNumber;
@@ -4566,12 +4703,14 @@ void Scene325::setMessage(int resNum, int lineNum) {
R2_GLOBALS._sceneObjects->draw();
- if ((_soundCount != 0) && (R2_GLOBALS._speechSubtitles != 2)) {
+ if ((_soundCount != 0) && (R2_GLOBALS._speechSubtitles & SPEECH_VOICE)) {
_sceneMode = 15;
R2_GLOBALS._playStream.play(_soundQueue[_soundIndex++], this);
}
} else {
- _field412 = 13;
+ // No message for given database index, so we must have passed beyond
+ // the start or end of the database
+ _consoleAction = 13;
R2_GLOBALS._player.disableControl();
R2_GLOBALS._player.hide();
@@ -4581,7 +4720,7 @@ void Scene325::setMessage(int resNum, int lineNum) {
_palette.loadPalette(160);
_sceneMode = 11;
- BF_GLOBALS._scenePalette.addFader(&_palette._palette[0], 256, 5, this);
+ R2_GLOBALS._scenePalette.addFader(&_palette._palette[0], 256, 5, this);
}
}
@@ -4603,15 +4742,16 @@ Common::String Scene325::parseMessage(const Common::String &msg) {
return Common::String(msgP);
}
+
/*--------------------------------------------------------------------------
* Scene 400 - Science Lab
*
*--------------------------------------------------------------------------*/
bool Scene400::Terminal::startAction(CursorType action, Event &event) {
- Scene400 *scene = (Scene400 *)R2_GLOBALS._sceneManager._scene;
-
if (action == CURSOR_USE) {
+ Scene400 *scene = (Scene400 *)R2_GLOBALS._sceneManager._scene;
+
R2_GLOBALS._player.disableControl();
scene->_sceneMode = 402;
scene->setAction(&scene->_sequenceManager1, scene, 402, &R2_GLOBALS._player, this, NULL);
@@ -4625,9 +4765,9 @@ bool Scene400::Terminal::startAction(CursorType action, Event &event) {
/*--------------------------------------------------------------------------*/
bool Scene400::Door::startAction(CursorType action, Event &event) {
- Scene400 *scene = (Scene400 *)R2_GLOBALS._sceneManager._scene;
-
if (action == CURSOR_USE) {
+ Scene400 *scene = (Scene400 *)R2_GLOBALS._sceneManager._scene;
+
R2_GLOBALS._player.disableControl();
scene->_sceneMode = 401;
scene->setAction(&scene->_sequenceManager1, scene, 401, &R2_GLOBALS._player, this, NULL);
@@ -4639,9 +4779,9 @@ bool Scene400::Door::startAction(CursorType action, Event &event) {
}
bool Scene400::Reader::startAction(CursorType action, Event &event) {
- Scene400 *scene = (Scene400 *)R2_GLOBALS._sceneManager._scene;
-
if (action == CURSOR_USE) {
+ Scene400 *scene = (Scene400 *)R2_GLOBALS._sceneManager._scene;
+
R2_GLOBALS._player.disableControl();
scene->_sceneMode = 405;
scene->setAction(&scene->_sequenceManager1, scene, 405, &R2_GLOBALS._player, this, NULL);
@@ -4653,9 +4793,9 @@ bool Scene400::Reader::startAction(CursorType action, Event &event) {
}
bool Scene400::SensorProbe::startAction(CursorType action, Event &event) {
- Scene400 *scene = (Scene400 *)R2_GLOBALS._sceneManager._scene;
-
if (action == CURSOR_USE) {
+ Scene400 *scene = (Scene400 *)R2_GLOBALS._sceneManager._scene;
+
R2_GLOBALS._player.disableControl();
scene->_sceneMode = 404;
scene->setAction(&scene->_sequenceManager1, scene, 404, &R2_GLOBALS._player, this, NULL);
@@ -4667,9 +4807,9 @@ bool Scene400::SensorProbe::startAction(CursorType action, Event &event) {
}
bool Scene400::AttractorUnit::startAction(CursorType action, Event &event) {
- Scene400 *scene = (Scene400 *)R2_GLOBALS._sceneManager._scene;
-
if (action == CURSOR_USE) {
+ Scene400 *scene = (Scene400 *)R2_GLOBALS._sceneManager._scene;
+
R2_GLOBALS._player.disableControl();
scene->_sceneMode = 406;
scene->setAction(&scene->_sequenceManager1, scene, 406, &R2_GLOBALS._player, this, NULL);
@@ -4849,9 +4989,9 @@ Scene500::PanelDialog::Button::Button() {
}
bool Scene500::ControlPanel::startAction(CursorType action, Event &event) {
- Scene500 *scene = (Scene500 *)R2_GLOBALS._sceneManager._scene;
-
if ((action == CURSOR_USE) && (R2_GLOBALS._player._characterIndex == R2_QUINN)) {
+ Scene500 *scene = (Scene500 *)R2_GLOBALS._sceneManager._scene;
+
R2_GLOBALS._player.disableControl();
if (R2_GLOBALS.getFlag(26)) {
@@ -4871,9 +5011,9 @@ bool Scene500::ControlPanel::startAction(CursorType action, Event &event) {
/*--------------------------------------------------------------------------*/
bool Scene500::Seeker::startAction(CursorType action, Event &event) {
- Scene500 *scene = (Scene500 *)R2_GLOBALS._sceneManager._scene;
-
if (action == CURSOR_TALK) {
+ Scene500 *scene = (Scene500 *)R2_GLOBALS._sceneManager._scene;
+
R2_GLOBALS._player.disableControl();
if (R2_GLOBALS._player._characterIndex == R2_QUINN) {
scene->_stripNumber = R2_GLOBALS.getFlag(26) ? 1101 : 1103;
@@ -4944,9 +5084,9 @@ bool Scene500::Suit::startAction(CursorType action, Event &event) {
}
bool Scene500::Doorway::startAction(CursorType action, Event &event) {
- Scene500 *scene = (Scene500 *)R2_GLOBALS._sceneManager._scene;
-
if ((action == CURSOR_USE) && (R2_GLOBALS._player._characterIndex == R2_QUINN)) {
+ Scene500 *scene = (Scene500 *)R2_GLOBALS._sceneManager._scene;
+
R2_GLOBALS._player.disableControl();
if (R2_GLOBALS.getFlag(26)) {
@@ -4965,8 +5105,6 @@ bool Scene500::Doorway::startAction(CursorType action, Event &event) {
}
bool Scene500::OxygenTanks::startAction(CursorType action, Event &event) {
- Scene500 *scene = (Scene500 *)R2_GLOBALS._sceneManager._scene;
-
switch (action) {
case CURSOR_LOOK:
SceneItem::display2(500, R2_INVENTORY.getObjectScene(R2_REBREATHER_TANK) ? 50 : 49);
@@ -4978,6 +5116,8 @@ bool Scene500::OxygenTanks::startAction(CursorType action, Event &event) {
return true;
} else if ((R2_INVENTORY.getObjectScene(R2_REBREATHER_TANK) != 1) &&
(R2_GLOBALS._player._characterIndex != R2_SEEKER) && !R2_GLOBALS.getFlag(28)) {
+ Scene500 *scene = (Scene500 *)R2_GLOBALS._sceneManager._scene;
+
R2_GLOBALS._player.disableControl();
if (_position.y == 120) {
@@ -5001,9 +5141,9 @@ bool Scene500::OxygenTanks::startAction(CursorType action, Event &event) {
}
bool Scene500::AirLock::startAction(CursorType action, Event &event) {
- Scene500 *scene = (Scene500 *)R2_GLOBALS._sceneManager._scene;
-
if ((action == CURSOR_USE) && R2_GLOBALS.getFlag(26)) {
+ Scene500 *scene = (Scene500 *)R2_GLOBALS._sceneManager._scene;
+
R2_GLOBALS._player.disableControl();
scene->_sceneMode = (R2_GLOBALS._player._characterIndex == R2_QUINN) ? 521 : 522;
scene->setAction(&scene->_sequenceManager1, scene, scene->_sceneMode, &R2_GLOBALS._player,
@@ -5048,9 +5188,9 @@ void Scene500::TransparentDoor::draw() {
}
bool Scene500::Aerosol::startAction(CursorType action, Event &event) {
- Scene500 *scene = (Scene500 *)R2_GLOBALS._sceneManager._scene;
-
if (action == CURSOR_USE) {
+ Scene500 *scene = (Scene500 *)R2_GLOBALS._sceneManager._scene;
+
R2_GLOBALS._player.disableControl();
scene->_sceneMode = 503;
scene->setAction(&scene->_sequenceManager1, scene, 503, &R2_GLOBALS._player, this, NULL);
@@ -5061,9 +5201,9 @@ bool Scene500::Aerosol::startAction(CursorType action, Event &event) {
}
bool Scene500::SonicStunner::startAction(CursorType action, Event &event) {
- Scene500 *scene = (Scene500 *)R2_GLOBALS._sceneManager._scene;
-
if ((action == CURSOR_USE) && (R2_GLOBALS._player._characterIndex == R2_QUINN)) {
+ Scene500 *scene = (Scene500 *)R2_GLOBALS._sceneManager._scene;
+
R2_GLOBALS._player.disableControl();
scene->_sceneMode = R2_GLOBALS.getFlag(26) ? 520 : 502;
scene->setAction(&scene->_sequenceManager1, scene, scene->_sceneMode, &R2_GLOBALS._player, this, NULL);
@@ -5074,9 +5214,9 @@ bool Scene500::SonicStunner::startAction(CursorType action, Event &event) {
}
bool Scene500::Locker1::startAction(CursorType action, Event &event) {
- Scene500 *scene = (Scene500 *)R2_GLOBALS._sceneManager._scene;
-
if ((action == CURSOR_USE) && (R2_GLOBALS._player._characterIndex == R2_QUINN)) {
+ Scene500 *scene = (Scene500 *)R2_GLOBALS._sceneManager._scene;
+
R2_GLOBALS._player.disableControl();
if (R2_GLOBALS.getFlag(11))
@@ -5092,9 +5232,9 @@ bool Scene500::Locker1::startAction(CursorType action, Event &event) {
}
bool Scene500::Locker2::startAction(CursorType action, Event &event) {
- Scene500 *scene = (Scene500 *)R2_GLOBALS._sceneManager._scene;
-
if ((action == CURSOR_USE) && (R2_GLOBALS._player._characterIndex == R2_QUINN)) {
+ Scene500 *scene = (Scene500 *)R2_GLOBALS._sceneManager._scene;
+
R2_GLOBALS._player.disableControl();
if (R2_GLOBALS.getFlag(12))
@@ -5111,7 +5251,7 @@ bool Scene500::Locker2::startAction(CursorType action, Event &event) {
/*--------------------------------------------------------------------------*/
-void Scene500::PanelDialog::setDetails(int visage, int strip, int frameNumber,
+void Scene500::PanelDialog::setDetails(int visage, int strip, int frameNumber,
const Common::Point &pt) {
SceneAreaObject::setDetails(visage, strip, frameNumber, pt);
SceneAreaObject::setDetails(500, 43, 32, 45);
@@ -5122,7 +5262,7 @@ void Scene500::PanelDialog::setDetails(int visage, int strip, int frameNumber,
}
void Scene500::PanelDialog::remove() {
- Scene500 *scene = (Scene500 *)BF_GLOBALS._sceneManager._scene;
+ Scene500 *scene = (Scene500 *)R2_GLOBALS._sceneManager._scene;
scene->_sceneAreas.remove(&_button1);
scene->_sceneAreas.remove(&_button2);
scene->_sceneAreas.remove(&_button3);
@@ -5167,7 +5307,7 @@ void Scene500::PanelDialog::Button::setupButton(int buttonId) {
break;
}
- Scene500 *scene = (Scene500 *)BF_GLOBALS._sceneManager._scene;
+ Scene500 *scene = (Scene500 *)R2_GLOBALS._sceneManager._scene;
scene->_sceneAreas.push_front(this);
}
@@ -5179,7 +5319,7 @@ void Scene500::PanelDialog::Button::synchronize(Serializer &s) {
}
void Scene500::PanelDialog::Button::process(Event &event) {
- if ((event.eventType == EVENT_BUTTON_DOWN) &&
+ if ((event.eventType == EVENT_BUTTON_DOWN) &&
(R2_GLOBALS._events.getCursor() == CURSOR_USE) &&
_bounds.contains(event.mousePos) && !_buttonDown) {
_buttonDown = true;
@@ -5197,11 +5337,11 @@ void Scene500::PanelDialog::Button::process(Event &event) {
}
void Scene500::PanelDialog::Button::doButtonPress() {
- Scene500 *scene = (Scene500 *)R2_GLOBALS._sceneManager._scene;
-
if (R2_GLOBALS.getFlag(28)) {
SceneItem::display2(500, 48);
} else {
+ Scene500 *scene = (Scene500 *)R2_GLOBALS._sceneManager._scene;
+
R2_GLOBALS._player.disableControl();
scene->_sceneMode = _buttonId;
@@ -5232,10 +5372,10 @@ void Scene500::PanelDialog::Button::doButtonPress() {
&scene->_suit, &scene->_transparentDoor, NULL);
} else {
scene->_sound1.play(127);
- scene->_suits.animate(ANIM_MODE_6, scene);
+ scene->_suits.animate(ANIM_MODE_5, scene);
}
break;
-
+
case 3:
if (R2_GLOBALS.getFlag(35)) {
scene->_sceneMode = 509;
@@ -5244,12 +5384,12 @@ void Scene500::PanelDialog::Button::doButtonPress() {
} else {
scene->_suit.postInit();
scene->_suit.hide();
- scene->_suit._effect = 1;
+ scene->_suit._effect = EFFECT_SHADED;
scene->_suit.setDetails(500, -1, -1, -1, 2, (SceneItem *)NULL);
scene->_suit.setup(502, R2_GLOBALS._landerSuitNumber + 2, 1);
scene->setAction(&scene->_sequenceManager1, scene, 508,
- &R2_GLOBALS._player, &scene->_suits, &scene->_suit,
+ &R2_GLOBALS._player, &scene->_suits, &scene->_suit,
&scene->_transparentDoor, NULL);
R2_GLOBALS.setFlag(35);
}
@@ -5279,14 +5419,14 @@ void Scene500::postInit(SceneObjectList *OwnerList) {
R2_GLOBALS._walkRegions.enableRegion(1);
_seeker.postInit();
- _seeker._effect = 1;
+ _seeker._effect = EFFECT_SHADED;
_seeker.setup(1505, 1, 1);
_seeker._moveDiff.x = 5;
_seeker.setPosition(Common::Point(42, 151));
_seeker.setDetails(500, 34, 35, 36, 1, (SceneItem *)NULL);
} else if (R2_GLOBALS._player._characterScene[R2_QUINN] == 500) {
_seeker.postInit();
- _seeker._effect = 1;
+ _seeker._effect = EFFECT_SHADED;
_seeker.setup(R2_GLOBALS.getFlag(26) ? 1500 : 10, 1, 1);
_seeker.setPosition(Common::Point(42, 151));
@@ -5361,7 +5501,7 @@ void Scene500::postInit(SceneObjectList *OwnerList) {
}
_suits.postInit();
- _suits._effect = 1;
+ _suits._effect = EFFECT_SHADED;
_suits.setup(502, 1, 1);
_suits.setPosition(Common::Point(258, 99));
_suits.fixPriority(50);
@@ -5375,7 +5515,7 @@ void Scene500::postInit(SceneObjectList *OwnerList) {
_transparentDoor.setup(500, 8, 7);
_suit.postInit();
- _suit._effect = 1;
+ _suit._effect = EFFECT_SHADED;
_suit.setPosition(Common::Point(247, 52));
_suit.setDetails(500, -1, -1, -1, 2, (SceneItem *)NULL);
@@ -5548,7 +5688,7 @@ void Scene525::postInit(SceneObjectList *OwnerList) {
R2_GLOBALS._sound1.play(105);
_actor1.postInit();
- _actor1._effect = 1;
+ _actor1._effect = EFFECT_SHADED;
R2_GLOBALS._player.postInit();
R2_GLOBALS._player.animate(ANIM_MODE_1, NULL);
@@ -5570,7 +5710,7 @@ bool Scene600::CompartmentHotspot::startAction(CursorType action, Event &event)
if ((action != R2_NEGATOR_GUN) || (!R2_GLOBALS.getFlag(5)) || (R2_GLOBALS.getFlag(8)))
return SceneHotspot::startAction(action, event);
- SceneItem::display(600, 32, SET_WIDTH, 280, SET_X, 160, SET_POS_MODE, ALIGN_CENTER,
+ SceneItem::display(600, 32, SET_WIDTH, 280, SET_X, 160, SET_POS_MODE, ALIGN_CENTER,
SET_Y, 20, SET_EXT_BGCOLOR, 7, LIST_END);
return true;
}
@@ -5580,13 +5720,13 @@ bool Scene600::EngineCompartment::startAction(CursorType action, Event &event) {
return SceneHotspot::startAction(action, event);
if ((R2_GLOBALS.getFlag(5)) && (!R2_GLOBALS.getFlag(8))) {
- SceneItem::display(600, 32, SET_WIDTH, 280, SET_X, 160, SET_POS_MODE, ALIGN_CENTER,
+ SceneItem::display(600, 32, SET_WIDTH, 280, SET_X, 160, SET_POS_MODE, ALIGN_CENTER,
SET_Y, 20, SET_EXT_BGCOLOR, 7, LIST_END);
return true;
}
if (!R2_GLOBALS.getFlag(5)) {
- SceneItem::display(600, 30, SET_WIDTH, 280, SET_X, 160, SET_POS_MODE, ALIGN_CENTER,
+ SceneItem::display(600, 30, SET_WIDTH, 280, SET_X, 160, SET_POS_MODE, ALIGN_CENTER,
SET_Y, 20, SET_EXT_BGCOLOR, 7, LIST_END);
return true;
}
@@ -5597,19 +5737,19 @@ bool Scene600::EngineCompartment::startAction(CursorType action, Event &event) {
R2_GLOBALS._player.disableControl();
Scene600 *scene = (Scene600 *)R2_GLOBALS._sceneManager._scene;
-
+
scene->_stasisArea.setup(603, 3, 1, 239, 54, 10);
scene->_stasisField.postInit();
scene->_computer.postInit();
scene->_sceneMode = 612;
scene->setAction(&scene->_sequenceManager1, scene, 612, &scene->_stasisField, &scene->_computer, &R2_GLOBALS._player, NULL);
-
+
// WORKAROUND: For ScummVM, we use a SceneActor rather than BackgroundSceneObject
// for the stasis field since it doesn't work properly. We override the priority for
// the stasis field here so that the stasis field dissolve will show up
scene->_stasisField.fixPriority(12);
-
+
return true;
}
@@ -5628,24 +5768,47 @@ bool Scene600::Smoke::startAction(CursorType action, Event &event) {
return false;
}
-GfxSurface Scene600::Smoke::getFrame() {
- GfxSurface frame = SceneActor::getFrame();
+void Scene600::Smoke::draw() {
+ // Effect should always be active on smoke, but since the original had this
+ // check, include it here too
+ if (_effect == EFFECT_NONE) {
+ SceneActor::draw();
+ return;
+ }
- if (_effect) {
- // Translate the frame using the scene's pixel map
- byte *pixelMap = static_cast<Scene600 *>(R2_GLOBALS._sceneManager._scene)->_pixelMap;
- Graphics::Surface surface = frame.lockSurface();
- byte *srcP = (byte *)surface.getPixels();
+ // Determine the area of the screen to be updated
+ Rect destRect = _bounds;
+ destRect.translate(-g_globals->_sceneManager._scene->_sceneBounds.left,
+ -g_globals->_sceneManager._scene->_sceneBounds.top);
- while (srcP < ((byte *)surface.getBasePtr(0, surface.h))) {
- *srcP = pixelMap[*srcP];
- srcP++;
- }
+ // Get the smoke frame, screen reference, and pixel palette translation map
+ GfxSurface frame = getFrame();
+ Graphics::Surface s = frame.lockSurface();
+ Graphics::Surface screen = g_globals->gfxManager().getSurface().lockSurface();
+ byte *pixelMap = static_cast<Scene600 *>(R2_GLOBALS._sceneManager._scene)->_pixelMap;
- frame.unlockSurface();
+ // Loop through every pixel of the frame. Any pixel of the frame that's not a
+ // tranparency, get the same pixel from the screen background, and shade it using
+ // the scene's pixel translation map
+ for (int yp = 0; yp < s.h; ++yp) {
+ byte *frameSrcP = (byte *)s.getBasePtr(0, yp);
+ byte *screenP = (byte *)screen.getBasePtr(destRect.left, destRect.top + yp);
+
+ for (int xp = 0; xp < s.w; ++xp, ++frameSrcP, ++screenP) {
+ if (*frameSrcP != frame._transColor) {
+ *frameSrcP = pixelMap[*screenP];
+ }
+ }
}
- return frame;
+ // Finished updating the frame
+ frame.unlockSurface();
+ g_globals->gfxManager().getSurface().unlockSurface();
+
+ // Draw the processed frame
+ Region *priorityRegion = g_globals->_sceneManager._scene->_priorities.find(_priority);
+ g_globals->gfxManager().copyFrom(frame, destRect, priorityRegion);
+
}
bool Scene600::Doorway::startAction(CursorType action, Event &event) {
@@ -5678,7 +5841,7 @@ bool Scene600::Doorway::startAction(CursorType action, Event &event) {
}
if ((R2_GLOBALS.getFlag(9)) && (R2_INVENTORY.getObjectScene(R2_COM_SCANNER) == 600))
- SceneItem::display(600, 31, 0, 280, 1, 160, 9, 1, 2, 20, 7, 7, -999);
+ SceneItem::display(600, 31, 0, 280, 1, 160, 9, 1, 2, 20, 7, 7, LIST_END);
else {
R2_GLOBALS._player.disableControl();
scene->_sceneMode = 601;
@@ -5696,7 +5859,7 @@ bool Scene600::Laser::startAction(CursorType action, Event &event) {
// If laser is destroyed
if (R2_GLOBALS.getFlag(6)) {
if (R2_GLOBALS.getFlag(8)) {
- SceneItem::display(600, 29, 0, 280, 1, 160, 9, 1, 2, 20, 7, 7, -999);
+ SceneItem::display(600, 29, 0, 280, 1, 160, 9, 1, 2, 20, 7, 7, LIST_END);
return true;
} else {
R2_GLOBALS._player.disableControl();
@@ -5712,7 +5875,7 @@ bool Scene600::Laser::startAction(CursorType action, Event &event) {
break;
case R2_AEROSOL:
if (R2_GLOBALS.getFlag(5)) {
- SceneItem::display(600, 28, 0, 280, 1, 160, 9, 1, 2, 20, 7, 7, -999);
+ SceneItem::display(600, 28, 0, 280, 1, 160, 9, 1, 2, 20, 7, 7, LIST_END);
return true;
} else {
R2_GLOBALS._player.disableControl();
@@ -5721,7 +5884,7 @@ bool Scene600::Laser::startAction(CursorType action, Event &event) {
scene->_smoke.postInit();
scene->_smoke.setup(601, 3, 1);
- scene->_smoke._effect = 3;
+ scene->_smoke._effect = EFFECT_SMOKE;
scene->_smoke._moveDiff = Common::Point(1, 1);
scene->_smoke._moveRate = 2;
scene->_smoke._numFrames = 3;
@@ -5762,13 +5925,13 @@ bool Scene600::Laser::startAction(CursorType action, Event &event) {
}
bool Scene600::Aerosol::startAction(CursorType action, Event &event) {
- Scene600 *scene = (Scene600 *)R2_GLOBALS._sceneManager._scene;
-
// Only action cursors
if (action < CURSOR_WALK)
return false;
if (action == CURSOR_USE) {
+ Scene600 *scene = (Scene600 *)R2_GLOBALS._sceneManager._scene;
+
R2_GLOBALS._player.disableControl();
scene->_sceneMode = 614;
scene->setAction(&scene->_sequenceManager1, scene, 614, &R2_GLOBALS._player, &scene->_aerosol, NULL);
@@ -5902,7 +6065,7 @@ void Scene600::postInit(SceneObjectList *OwnerList) {
_smoke._numFrames = 3;
_smoke.animate(ANIM_MODE_2, NULL);
_smoke.fixPriority(130);
- _smoke._effect = 3;
+ _smoke._effect = EFFECT_SMOKE;
_smoke.setDetails(600, 24, 25, 26, 1, (SceneItem *) NULL);
_smoke.signal();
}
@@ -5973,7 +6136,7 @@ void Scene600::signal() {
R2_INVENTORY.setObjectScene(R2_AEROSOL, 600);
R2_GLOBALS.setFlag(5);
- _smoke._effect = 3;
+ _smoke._effect = EFFECT_SMOKE;
_smoke.signal();
break;
case 606:
@@ -6002,6 +6165,7 @@ void Scene600::signal() {
R2_GLOBALS._sceneItems.remove(&_engineCompartment);
_computer.setDetails(600, 21, -1, 23, 4, &_engineCompartment);
_engineCompartment.setDetails(600, 7, -1, -1, 3, (SceneItem *) NULL);
+ _quantumDrive._lookLineNum = 7;
R2_GLOBALS._player.enableControl(CURSOR_USE);
break;
case 614:
@@ -6026,7 +6190,7 @@ void Scene600::signal() {
}
void Scene600::process(Event &event) {
- if (R2_GLOBALS._player._canWalk && (!R2_GLOBALS.getFlag(6)) && (event.eventType == EVENT_BUTTON_DOWN)
+ if (R2_GLOBALS._player._canWalk && (!R2_GLOBALS.getFlag(6)) && (event.eventType == EVENT_BUTTON_DOWN)
&& (R2_GLOBALS._events.getCursor() == CURSOR_WALK)) {
if (!_doorway.contains(event.mousePos) || (_doorway._frame <= 1)) {
if (R2_GLOBALS.getFlag(5)) {
@@ -6081,6 +6245,9 @@ void Scene600::dispatch() {
*
*--------------------------------------------------------------------------*/
+#define CABLE700_X 26
+#define CABLE700_Y -5
+
Scene700::Scene700() {
_rotation = NULL;
}
@@ -6129,14 +6296,14 @@ bool Scene700::HandGrip::startAction(CursorType action, Event &event) {
}
bool Scene700::LiftDoor::startAction(CursorType action, Event &event) {
- Scene700 *scene = (Scene700 *)R2_GLOBALS._sceneManager._scene;
-
if (action != CURSOR_USE)
return SceneActor::startAction(action, event);
if (R2_GLOBALS._player._position.y <= 100)
return false;
+ Scene700 *scene = (Scene700 *)R2_GLOBALS._sceneManager._scene;
+
R2_GLOBALS._player.disableControl();
scene->_sceneMode = 701;
scene->setAction(&scene->_sequenceManager, scene, 701, &R2_GLOBALS._player, this, NULL);
@@ -6145,14 +6312,14 @@ bool Scene700::LiftDoor::startAction(CursorType action, Event &event) {
}
bool Scene700::SuitRoomDoor::startAction(CursorType action, Event &event) {
- Scene700 *scene = (Scene700 *)R2_GLOBALS._sceneManager._scene;
-
if (action != CURSOR_USE)
return SceneActor::startAction(action, event);
if (R2_GLOBALS._player._position.y <= 100)
return false;
+ Scene700 *scene = (Scene700 *)R2_GLOBALS._sceneManager._scene;
+
R2_GLOBALS._player.disableControl();
scene->_sceneMode = 702;
scene->setAction(&scene->_sequenceManager, scene, 702, &R2_GLOBALS._player, this, NULL);
@@ -6161,14 +6328,14 @@ bool Scene700::SuitRoomDoor::startAction(CursorType action, Event &event) {
}
bool Scene700::ControlPanel::startAction(CursorType action, Event &event) {
- Scene700 *scene = (Scene700 *)R2_GLOBALS._sceneManager._scene;
-
if (action != CURSOR_USE)
return SceneActor::startAction(action, event);
if (R2_GLOBALS._player._position.y <= 100)
return false;
+ Scene700 *scene = (Scene700 *)R2_GLOBALS._sceneManager._scene;
+
R2_GLOBALS._player.disableControl();
scene->_sceneMode = 704;
scene->setAction(&scene->_sequenceManager, scene, 704, &R2_GLOBALS._player, this, NULL);
@@ -6229,11 +6396,11 @@ bool Scene700::Cable::startAction(CursorType action, Event &event) {
}
bool Scene700::LoftDoor::startAction(CursorType action, Event &event) {
- Scene700 *scene = (Scene700 *)R2_GLOBALS._sceneManager._scene;
-
if ((action != CURSOR_USE) || (R2_GLOBALS._player._position.y >= 100))
return SceneActor::startAction(action, event);
+ Scene700 *scene = (Scene700 *)R2_GLOBALS._sceneManager._scene;
+
R2_GLOBALS._player.disableControl();
scene->_sceneMode = 1;
Common::Point pt(_position.x, 69);
@@ -6247,8 +6414,6 @@ void Scene700::postInit(SceneObjectList *OwnerList) {
loadScene(700);
if (R2_GLOBALS._sceneManager._previousScene == 900)
_sceneBounds = Rect(160, 0, 480, 200);
-
- R2_GLOBALS._v558B6.set(60, 0, 260, 200);
SceneExt::postInit();
_rotation = R2_GLOBALS._scenePalette.addRotation(237, 246, -1);
@@ -6306,7 +6471,7 @@ void Scene700::postInit(SceneObjectList *OwnerList) {
break;
case 700:
_cable.setup(701, 3, 1);
- _cable.setPosition(Common::Point(356 - (R2_GLOBALS._v565EB * 8), 148 - (((R2_GLOBALS._v565E9 + 10) / 5) * 4)));
+ _cable.setPosition(Common::Point(356 - (CABLE700_X * 8), 148 - (((CABLE700_Y + 10) / 5) * 4)));
_cable.setDetails(700, 37, -1, -1, 1, (SceneItem *) NULL);
break;
default:
@@ -6316,7 +6481,7 @@ void Scene700::postInit(SceneObjectList *OwnerList) {
case 700:
switch (R2_INVENTORY.getObjectScene(R2_CABLE_HARNESS)) {
case 0:
- if ((R2_GLOBALS._v565E5 != 0) && (R2_GLOBALS._electromagnetChangeAmount == 20) && (R2_GLOBALS._electromagnetZoom == 70))
+ if (R2_GLOBALS._tractorField && (R2_GLOBALS._electromagnetChangeAmount == 20) && (R2_GLOBALS._electromagnetZoom == 70))
_cable.setup(701, 2, 1);
else
_cable.setup(701, 2, 8);
@@ -6326,8 +6491,8 @@ void Scene700::postInit(SceneObjectList *OwnerList) {
break;
case 700:
_cable.setup(701, 1, 8);
- if (R2_GLOBALS._v565E7 == 0) {
- _cable.setPosition(Common::Point(356 - (R2_GLOBALS._v565EB * 8), 148 - (((R2_GLOBALS._v565E9 + 10) / 5) * 4)));
+ if (!R2_GLOBALS._cableAttached) {
+ _cable.setPosition(Common::Point(356 - (CABLE700_X * 8), 148 - (((CABLE700_Y + 10) / 5) * 4)));
} else {
_cable.setup(701, 1, 1);
_cable.setPosition(Common::Point(_electromagnet._position.x + 1, _electromagnet._position.y + 120));
@@ -6413,7 +6578,7 @@ void Scene700::signal() {
_sceneMode = 2;
R2_GLOBALS._player.setStrip(4);
if (R2_GLOBALS._player._position.x != 164) {
- SceneItem::display(700, 36, 0, 280, 1, 160, 9, 1, 2, 20, 7, 7, -999);
+ SceneItem::display(700, 36, 0, 280, 1, 160, 9, 1, 2, 20, 7, 7, LIST_END);
R2_GLOBALS._player.enableControl();
} else {
R2_GLOBALS._sound2.play(19);
@@ -6475,12 +6640,12 @@ void Scene700::signal() {
_sceneMode = 17;
_cable.setup(701, 1, 8);
_cable.setDetails(700, 38, -1, -1, 3, (SceneItem *) NULL);
- if ((R2_GLOBALS._v565E5 != 0) && (_cable._position.x == _electromagnet._position.x + 1) && (_cable._position.x == 148 - (((R2_GLOBALS._electromagnetChangeAmount + 10) / 5) * 4))) {
+ if (R2_GLOBALS._tractorField && (_cable._position.x == _electromagnet._position.x + 1) && (_cable._position.x == 148 - (((R2_GLOBALS._electromagnetChangeAmount + 10) / 5) * 4))) {
_cable.animate(ANIM_MODE_6, NULL);
Common::Point pt(_cable._position.x, _electromagnet._position.y + 120);
NpcMover *mover = new NpcMover();
_cable.addMover(mover, &pt, NULL);
- R2_GLOBALS._v565E7 = 1;
+ R2_GLOBALS._cableAttached = true;
}
R2_GLOBALS._player.animate(ANIM_MODE_6, this);
break;
@@ -6500,7 +6665,7 @@ void Scene700::signal() {
break;
case 21:
_cable.fixPriority(77);
- if ((R2_GLOBALS._v565E5 != 0) && (R2_GLOBALS._electromagnetChangeAmount == 20) && (R2_GLOBALS._electromagnetZoom == 70))
+ if (R2_GLOBALS._tractorField && (R2_GLOBALS._electromagnetChangeAmount == 20) && (R2_GLOBALS._electromagnetZoom == 70))
_cable.animate(ANIM_MODE_6, NULL);
R2_INVENTORY.setObjectScene(R2_ATTRACTOR_CABLE_HARNESS, 700);
@@ -6518,7 +6683,7 @@ void Scene700::signal() {
case 706:
_cable.setDetails(700, 38, -1, -1, 3, (SceneItem *) NULL);
_cable.fixPriority(77);
- if ((R2_GLOBALS._v565E5 != 0) && (R2_GLOBALS._electromagnetChangeAmount == 20) && (R2_GLOBALS._electromagnetZoom == 70))
+ if (R2_GLOBALS._tractorField && (R2_GLOBALS._electromagnetChangeAmount == 20) && (R2_GLOBALS._electromagnetZoom == 70))
_cable.animate(ANIM_MODE_6, NULL);
R2_INVENTORY.setObjectScene(R2_ATTRACTOR_UNIT, 0);
R2_INVENTORY.setObjectScene(R2_ATTRACTOR_CABLE_HARNESS, 700);
@@ -6546,11 +6711,11 @@ void Scene700::signal() {
*--------------------------------------------------------------------------*/
bool Scene800::Button::startAction(CursorType action, Event &event) {
- Scene800 *scene = (Scene800 *)R2_GLOBALS._sceneManager._scene;
-
if (action != CURSOR_USE) {
return NamedHotspot::startAction(action, event);
} else {
+ Scene800 *scene = (Scene800 *)R2_GLOBALS._sceneManager._scene;
+
R2_GLOBALS._player.disableControl();
scene->_sceneMode = 802;
scene->setAction(&scene->_sequenceManager1, scene, 802, &R2_GLOBALS._player, &scene->_autodocCover, NULL);
@@ -6559,19 +6724,19 @@ bool Scene800::Button::startAction(CursorType action, Event &event) {
}
bool Scene800::CableJunction::startAction(CursorType action, Event &event) {
- Scene800 *scene = (Scene800 *)R2_GLOBALS._sceneManager._scene;
-
- if (action != R2_OPTICAL_FIBRE) {
+ if (action != R2_OPTICAL_FIBER) {
return NamedHotspot::startAction(action, event);
} else {
+ Scene800 *scene = (Scene800 *)R2_GLOBALS._sceneManager._scene;
+
R2_GLOBALS._player.disableControl();
- scene->_opticalFibre.postInit();
+ scene->_opticalFiber.postInit();
scene->_sceneMode = 803;
if (R2_INVENTORY.getObjectScene(R2_READER) == 800)
- scene->setAction(&scene->_sequenceManager1, scene, 813, &R2_GLOBALS._player, &scene->_opticalFibre, &scene->_reader, NULL);
+ scene->setAction(&scene->_sequenceManager1, scene, 813, &R2_GLOBALS._player, &scene->_opticalFiber, &scene->_reader, NULL);
else
- scene->setAction(&scene->_sequenceManager1, scene, 803, &R2_GLOBALS._player, &scene->_opticalFibre, NULL);
+ scene->setAction(&scene->_sequenceManager1, scene, 803, &R2_GLOBALS._player, &scene->_opticalFiber, NULL);
return true;
}
@@ -6589,8 +6754,8 @@ bool Scene800::DeviceSlot::startAction(CursorType action, Event &event) {
_lookLineNum = 27;
scene->_sceneMode = 809;
- if (R2_INVENTORY.getObjectScene(R2_OPTICAL_FIBRE) == 800)
- scene->setAction(&scene->_sequenceManager1, scene, 815, &R2_GLOBALS._player, &scene->_reader, &scene->_opticalFibre, NULL);
+ if (R2_INVENTORY.getObjectScene(R2_OPTICAL_FIBER) == 800)
+ scene->setAction(&scene->_sequenceManager1, scene, 815, &R2_GLOBALS._player, &scene->_reader, &scene->_opticalFiber, NULL);
else
scene->setAction(&scene->_sequenceManager1, scene, 809, &R2_GLOBALS._player, &scene->_reader, NULL);
return true;
@@ -6599,11 +6764,11 @@ bool Scene800::DeviceSlot::startAction(CursorType action, Event &event) {
scene->_reader.postInit();
scene->_sceneMode = 804;
- if (R2_INVENTORY.getObjectScene(R2_OPTICAL_FIBRE) == 800) {
- scene->setAction(&scene->_sequenceManager1, scene, 814, &R2_GLOBALS._player,
- &scene->_reader, &scene->_opticalFibre, NULL);
+ if (R2_INVENTORY.getObjectScene(R2_OPTICAL_FIBER) == 800) {
+ scene->setAction(&scene->_sequenceManager1, scene, 814, &R2_GLOBALS._player,
+ &scene->_reader, &scene->_opticalFiber, NULL);
} else {
- scene->setAction(&scene->_sequenceManager1, scene, 804, &R2_GLOBALS._player,
+ scene->setAction(&scene->_sequenceManager1, scene, 804, &R2_GLOBALS._player,
&scene->_reader, NULL);
}
return true;
@@ -6617,24 +6782,25 @@ bool Scene800::DeviceSlot::startAction(CursorType action, Event &event) {
/*--------------------------------------------------------------------------*/
bool Scene800::Door::startAction(CursorType action, Event &event) {
- Scene800 *scene = (Scene800 *)R2_GLOBALS._sceneManager._scene;
-
switch (action) {
- case CURSOR_USE:
+ case CURSOR_USE: {
+ Scene800 *scene = (Scene800 *)R2_GLOBALS._sceneManager._scene;
+
R2_GLOBALS._player.disableControl();
scene->_sceneMode = 801;
scene->setAction(&scene->_sequenceManager1, scene, 801, &R2_GLOBALS._player, &scene->_door, NULL);
return true;
+ }
default:
return SceneActor::startAction(action, event);
}
}
bool Scene800::Tray::startAction(CursorType action, Event &event) {
- Scene800 *scene = (Scene800 *)R2_GLOBALS._sceneManager._scene;
-
switch (action) {
- case CURSOR_USE:
+ case CURSOR_USE: {
+ Scene800 *scene = (Scene800 *)R2_GLOBALS._sceneManager._scene;
+
if (!R2_GLOBALS.getFlag(10)) {
R2_GLOBALS._player.disableControl();
scene->_sceneMode = 806;
@@ -6649,16 +6815,17 @@ bool Scene800::Tray::startAction(CursorType action, Event &event) {
scene->setAction(&scene->_sequenceManager1, scene, 807, &R2_GLOBALS._player, &scene->_tray, NULL);
}
return true;
+ }
default:
return SceneActor::startAction(action, event);
}
}
bool Scene800::ComScanner::startAction(CursorType action, Event &event) {
- Scene800 *scene = (Scene800 *)R2_GLOBALS._sceneManager._scene;
-
switch (action) {
- case CURSOR_USE:
+ case CURSOR_USE: {
+ Scene800 *scene = (Scene800 *)R2_GLOBALS._sceneManager._scene;
+
if (scene->_cabinet._frame == 1)
return false;
@@ -6666,6 +6833,7 @@ bool Scene800::ComScanner::startAction(CursorType action, Event &event) {
scene->_sceneMode = 811;
scene->setAction(&scene->_sequenceManager1, scene, 811, &R2_GLOBALS._player, &scene->_comScanner, NULL);
return true;
+ }
case CURSOR_TALK:
SceneItem::display2(800, 35);
return true;
@@ -6675,10 +6843,10 @@ bool Scene800::ComScanner::startAction(CursorType action, Event &event) {
}
bool Scene800::Cabinet::startAction(CursorType action, Event &event) {
- Scene800 *scene = (Scene800 *)R2_GLOBALS._sceneManager._scene;
-
switch (action) {
- case CURSOR_USE:
+ case CURSOR_USE: {
+ Scene800 *scene = (Scene800 *)R2_GLOBALS._sceneManager._scene;
+
R2_GLOBALS._player.disableControl();
if (scene->_cabinet._frame == 1) {
@@ -6691,6 +6859,7 @@ bool Scene800::Cabinet::startAction(CursorType action, Event &event) {
R2_GLOBALS.clearFlag(56);
}
return true;
+ }
default:
return SceneActor::startAction(action, event);
}
@@ -6713,22 +6882,22 @@ void Scene800::postInit(SceneObjectList *OwnerList) {
_autodocCover.setPosition(Common::Point(119, 161));
_autodocCover.setDetails(800, 6, 7, -1, 1, (SceneItem *)NULL);
- if (R2_INVENTORY.getObjectScene(R2_OPTICAL_FIBRE) == 800) {
- _opticalFibre.postInit();
+ if (R2_INVENTORY.getObjectScene(R2_OPTICAL_FIBER) == 800) {
+ _opticalFiber.postInit();
if (R2_INVENTORY.getObjectScene(R2_READER) == 800)
- _opticalFibre.setup(800, 4, 1);
+ _opticalFiber.setup(800, 4, 1);
else
- _opticalFibre.setup(800, 7, 2);
+ _opticalFiber.setup(800, 7, 2);
- _opticalFibre.setPosition(Common::Point(220, 124));
- _opticalFibre.fixPriority(140);
+ _opticalFiber.setPosition(Common::Point(220, 124));
+ _opticalFiber.fixPriority(140);
}
if (R2_INVENTORY.getObjectScene(R2_READER) == 800) {
_reader.postInit();
- if (R2_INVENTORY.getObjectScene(R2_OPTICAL_FIBRE) == 800) {
- _opticalFibre.setup(800, 4, 1);
+ if (R2_INVENTORY.getObjectScene(R2_OPTICAL_FIBER) == 800) {
+ _opticalFiber.setup(800, 4, 1);
_reader.hide();
} else {
_reader.setup(800, 7, 1);
@@ -6803,7 +6972,7 @@ void Scene800::signal() {
break;
case 803:
R2_GLOBALS._player.enableControl();
- R2_INVENTORY.setObjectScene(R2_OPTICAL_FIBRE, 800);
+ R2_INVENTORY.setObjectScene(R2_OPTICAL_FIBER, 800);
break;
case 804:
R2_GLOBALS._player.enableControl();
@@ -6844,21 +7013,19 @@ void Scene800::signal() {
Scene825::Button::Button(): SceneObject() {
_buttonId = 0;
- _v2 = 0;
_buttonDown = false;
}
void Scene825::Button::synchronize(Serializer &s) {
SceneObject::synchronize(s);
s.syncAsSint16LE(_buttonId);
- s.syncAsSint16LE(_v2);
s.syncAsSint16LE(_buttonDown);
}
void Scene825::Button::process(Event &event) {
- Scene825 *scene = (Scene825 *)R2_GLOBALS._sceneManager._scene;
-
if (!event.handled) {
+ Scene825 *scene = (Scene825 *)R2_GLOBALS._sceneManager._scene;
+
if ((event.eventType == EVENT_BUTTON_DOWN) && _bounds.contains(event.mousePos) && !_buttonDown) {
scene->_sound1.play(14);
setFrame(2);
@@ -6885,7 +7052,6 @@ bool Scene825::Button::startAction(CursorType action, Event &event) {
void Scene825::Button::setButton(int buttonId) {
SceneObject::postInit();
- _v2 = buttonId;
_buttonDown = 0;
_sceneText._color1 = 92;
_sceneText._color2 = 0;
@@ -6923,14 +7089,14 @@ void Scene825::Button::setButton(int buttonId) {
}
void Scene825::Button::setText(int textId) {
- Scene825 *scene = (Scene825 *)R2_GLOBALS._sceneManager._scene;
-
_buttonId = textId;
_lookLineNum = textId;
_sceneText.remove();
- if (_buttonId != 0)
+ if (_buttonId != 0) {
+ Scene825 *scene = (Scene825 *)R2_GLOBALS._sceneManager._scene;
_sceneText.setup(scene->_autodocItems[textId - 1]);
+ }
}
/*--------------------------------------------------------------------------*/
@@ -6954,12 +7120,12 @@ Scene825::Scene825(): SceneExt() {
void Scene825::postInit(SceneObjectList *OwnerList) {
loadScene(825);
+ R2_GLOBALS._uiElements._active = false;
SceneExt::postInit();
- BF_GLOBALS._interfaceY = 200;
+ R2_GLOBALS._interfaceY = SCREEN_HEIGHT;
R2_GLOBALS._player.postInit();
- R2_GLOBALS._uiElements._active = false;
- R2_GLOBALS._player._effect = 0;
+ R2_GLOBALS._player._effect = EFFECT_NONE;
R2_GLOBALS._player.setVisage(10);
R2_GLOBALS._player.hide();
R2_GLOBALS._player.disableControl();
@@ -7102,7 +7268,7 @@ void Scene825::doButtonPress(int buttonId) {
if (R2_GLOBALS.getFlag(4)) {
if ((R2_INVENTORY.getObjectScene(R2_READER) != 800) ||
- (R2_INVENTORY.getObjectScene(R2_OPTICAL_FIBRE) != 800)) {
+ (R2_INVENTORY.getObjectScene(R2_OPTICAL_FIBER) != 800)) {
_sceneText.setPosition(Common::Point(116, 75));
_sceneText.setup(ACCESS_CODE_REQUIRED);
} else if (R2_INVENTORY.getObjectScene(R2_OPTO_DISK) != 800) {
@@ -7119,7 +7285,7 @@ void Scene825::doButtonPress(int buttonId) {
R2_GLOBALS.setFlag(2);
if ((R2_INVENTORY.getObjectScene(R2_READER) != 800) ||
- (R2_INVENTORY.getObjectScene(R2_OPTICAL_FIBRE) != 800)) {
+ (R2_INVENTORY.getObjectScene(R2_OPTICAL_FIBER) != 800)) {
_sceneText.setPosition(Common::Point(116, 75));
_sceneText.setup(ACCESS_CODE_REQUIRED);
} else {
@@ -7219,14 +7385,14 @@ void Scene825::doButtonPress(int buttonId) {
*--------------------------------------------------------------------------*/
bool Scene850::Indicator::startAction(CursorType action, Event &event) {
- Scene850 *scene = (Scene850 *)R2_GLOBALS._sceneManager._scene;
-
- if ((action != CURSOR_USE) || (R2_INVENTORY.getObjectScene(R2_OPTICAL_FIBRE) != 850))
+ if ((action != CURSOR_USE) || (R2_INVENTORY.getObjectScene(R2_OPTICAL_FIBER) != 850))
return NamedHotspot::startAction(action, event);
else {
+ Scene850 *scene = (Scene850 *)R2_GLOBALS._sceneManager._scene;
+
R2_GLOBALS._player.disableControl();
scene->_sceneMode = 851;
- scene->setAction(&scene->_sequenceManager1, scene, 851, &R2_GLOBALS._player, &scene->_fibre, NULL);
+ scene->setAction(&scene->_sequenceManager1, scene, 851, &R2_GLOBALS._player, &scene->_fiber, NULL);
return true;
}
}
@@ -7234,11 +7400,11 @@ bool Scene850::Indicator::startAction(CursorType action, Event &event) {
/*--------------------------------------------------------------------------*/
bool Scene850::LiftDoor::startAction(CursorType action, Event &event) {
- Scene850 *scene = (Scene850 *)R2_GLOBALS._sceneManager._scene;
-
if (action != CURSOR_USE)
return SceneActor::startAction(action, event);
else {
+ Scene850 *scene = (Scene850 *)R2_GLOBALS._sceneManager._scene;
+
R2_GLOBALS._player.disableControl();
scene->_sceneMode = 202;
scene->setAction(&scene->_sequenceManager1, scene, 202, &R2_GLOBALS._player, this, NULL);
@@ -7247,11 +7413,11 @@ bool Scene850::LiftDoor::startAction(CursorType action, Event &event) {
}
bool Scene850::SickBayDoor::startAction(CursorType action, Event &event) {
- Scene850 *scene = (Scene850 *)R2_GLOBALS._sceneManager._scene;
-
if (action != CURSOR_USE)
return SceneActor::startAction(action, event);
else {
+ Scene850 *scene = (Scene850 *)R2_GLOBALS._sceneManager._scene;
+
R2_GLOBALS._player.disableControl();
scene->_sceneMode = 204;
scene->setAction(&scene->_sequenceManager1, scene, 204, &R2_GLOBALS._player, this, NULL);
@@ -7260,31 +7426,31 @@ bool Scene850::SickBayDoor::startAction(CursorType action, Event &event) {
}
bool Scene850::Clamp::startAction(CursorType action, Event &event) {
- Scene850 *scene = (Scene850 *)R2_GLOBALS._sceneManager._scene;
-
if (!R2_GLOBALS.getFlag(7))
return false;
else if (action != CURSOR_USE)
return SceneActor::startAction(action, event);
else {
+ Scene850 *scene = (Scene850 *)R2_GLOBALS._sceneManager._scene;
+
R2_GLOBALS._player.disableControl();
scene->_spark.postInit();
scene->_sceneMode = 850;
- scene->setAction(&scene->_sequenceManager1, scene, 850, &R2_GLOBALS._player, this,
+ scene->setAction(&scene->_sequenceManager1, scene, 850, &R2_GLOBALS._player, this,
&scene->_spark, NULL);
return true;
}
}
bool Scene850::Panel::startAction(CursorType action, Event &event) {
- Scene850 *scene = (Scene850 *)R2_GLOBALS._sceneManager._scene;
-
if ((action != CURSOR_USE) || R2_GLOBALS.getFlag(7))
return SceneActor::startAction(action, event);
else {
+ Scene850 *scene = (Scene850 *)R2_GLOBALS._sceneManager._scene;
+
R2_GLOBALS._player.disableControl();
scene->_sceneMode = 852;
- scene->setAction(&scene->_sequenceManager1, scene, 852, &R2_GLOBALS._player,
+ scene->setAction(&scene->_sequenceManager1, scene, 852, &R2_GLOBALS._player,
this, &scene->_spark, NULL);
return true;
}
@@ -7325,10 +7491,10 @@ void Scene850::postInit(SceneObjectList *OwnerList) {
_panel.fixPriority(82);
_panel.setDetails(850, 24, -1, -1, 1, (SceneItem *)NULL);
- if (R2_INVENTORY.getObjectScene(R2_OPTICAL_FIBRE) == 850) {
- _fibre.postInit();
- _fibre.setup(850, 6, 1);
- _fibre.setPosition(Common::Point(280, 87));
+ if (R2_INVENTORY.getObjectScene(R2_OPTICAL_FIBER) == 850) {
+ _fiber.postInit();
+ _fiber.setup(850, 6, 1);
+ _fiber.setPosition(Common::Point(280, 87));
}
R2_GLOBALS._player.postInit();
@@ -7375,8 +7541,8 @@ void Scene850::signal() {
R2_GLOBALS._player.enableControl();
break;
case 851:
- R2_INVENTORY.setObjectScene(R2_OPTICAL_FIBRE, 1);
- _fibre.remove();
+ R2_INVENTORY.setObjectScene(R2_OPTICAL_FIBER, 1);
+ _fiber.remove();
R2_GLOBALS._player.enableControl();
break;
case 852:
@@ -7436,10 +7602,10 @@ bool Scene900::Button::startAction(CursorType action, Event &event) {
scene->_sceneMode = 2;
scene->signal();
} else if (scene->_controlsScreenNumber == 2) {
- if (R2_GLOBALS._v565E5 == 0) {
+ if (!R2_GLOBALS._tractorField) {
scene->_aSound1.play(30);
setup(900, 3, 11);
- R2_GLOBALS._v565E5 = 1;
+ R2_GLOBALS._tractorField = true;
if ((R2_INVENTORY.getObjectScene(R2_CABLE_HARNESS) == 0) && (R2_INVENTORY.getObjectScene(R2_ATTRACTOR_CABLE_HARNESS == 700)) && (R2_GLOBALS._electromagnetChangeAmount == 20) && (R2_GLOBALS._electromagnetZoom == 70) && (scene->_cable._animateMode != ANIM_MODE_6)) {
scene->_cable.animate(ANIM_MODE_6, NULL);
} else {
@@ -7458,12 +7624,12 @@ bool Scene900::Button::startAction(CursorType action, Event &event) {
} else {
scene->_aSound1.play(53);
setup(900, 3, 9);
- R2_GLOBALS._v565E5 = 0;
+ R2_GLOBALS._tractorField = false;
if ((R2_INVENTORY.getObjectScene(R2_CABLE_HARNESS) == 0) && (R2_INVENTORY.getObjectScene(R2_ATTRACTOR_CABLE_HARNESS) == 700) && (scene->_cable._frame < 8) && (scene->_cable._animateMode != ANIM_MODE_5)) {
scene->_cable.animate(ANIM_MODE_5, NULL);
} else if ((R2_INVENTORY.getObjectScene(R2_CABLE_HARNESS) == 700) && (R2_INVENTORY.getObjectScene(R2_ATTRACTOR_CABLE_HARNESS) == 700) && (scene->_cable._frame < 8)) {
- R2_GLOBALS._v565E7 = 0;
+ R2_GLOBALS._cableAttached = false;
if (scene->_cable._animateMode != 5) {
R2_GLOBALS._player.disableControl();
scene->_sceneMode = 5;
@@ -7514,11 +7680,11 @@ bool Scene900::Button::startAction(CursorType action, Event &event) {
return true;
break;
case 8:
- SceneItem::display(5, 11, 0, 280, 1, 160, 9, 1, 2, 20, 7, 7, -999);
+ SceneItem::display(5, 11, 0, 280, 1, 160, 9, 1, 2, 20, 7, 7, LIST_END);
return true;
break;
case 9:
- SceneItem::display(5, 12, 0, 280, 1, 160, 9, 1, 2, 20, 7, 7, -999);
+ SceneItem::display(5, 12, 0, 280, 1, 160, 9, 1, 2, 20, 7, 7, LIST_END);
return true;
break;
default:
@@ -7543,7 +7709,7 @@ bool Scene900::Button::startAction(CursorType action, Event &event) {
}
} else if (action == CURSOR_LOOK) {
SceneItem::display(900, ((_buttonId == 2) && (scene->_controlsScreenNumber == 2)) ? 21 : _buttonId + 11,
- SET_WIDTH, 280, SET_X, 160, SET_POS_MODE, 1, SET_Y, 20, SET_EXT_BGCOLOR, 7, -999);
+ SET_WIDTH, 280, SET_X, 160, SET_POS_MODE, 1, SET_Y, 20, SET_EXT_BGCOLOR, 7, LIST_END);
return true;
} else {
return SceneActor::startAction(action, event);
@@ -7570,7 +7736,7 @@ void Scene900::postInit(SceneObjectList *OwnerList) {
_electromagnet.fixPriority(1);
_electromagnet.setup(900, 1, 2);
_electromagnet.setPosition(Common::Point(89, 0));
- _electromagnet._effect = 1;
+ _electromagnet._effect = EFFECT_SHADED;
_electromagnet.setDetails(900, 6, -1, 8, 1, (SceneItem *) NULL);
if ((R2_INVENTORY.getObjectScene(R2_CABLE_HARNESS) != 1) && (R2_INVENTORY.getObjectScene(R2_ATTRACTOR_CABLE_HARNESS) != 1)) {
@@ -7581,7 +7747,7 @@ void Scene900::postInit(SceneObjectList *OwnerList) {
if (R2_INVENTORY.getObjectScene(R2_CABLE_HARNESS) == 0) {
if (R2_INVENTORY.getObjectScene(R2_ATTRACTOR_CABLE_HARNESS) != 700) {
_cable.setup(901, 3, 2);
- } else if ((R2_GLOBALS._v565E5 != 0) && (R2_GLOBALS._electromagnetChangeAmount == 20) && (R2_GLOBALS._electromagnetZoom == 70)) {
+ } else if (R2_GLOBALS._tractorField && (R2_GLOBALS._electromagnetChangeAmount == 20) && (R2_GLOBALS._electromagnetZoom == 70)) {
_cable.setup(901, 2, 1);
} else {
_cable.setup(901, 2, 8);
@@ -7590,11 +7756,11 @@ void Scene900::postInit(SceneObjectList *OwnerList) {
_cable.setDetails(700, -1, -1, -1, 1, (SceneItem *) NULL);
} else {
_cable.setDetails(700, -1, -1, -1, 1, (SceneItem *) NULL);
- if (R2_GLOBALS._v565E7 == 0) {
+ if (!R2_GLOBALS._cableAttached) {
_cable.setup(901, 1, 8);
// Original set two times the same values: skipped
- _cable.setPosition(Common::Point((((100 - ((R2_GLOBALS._v565EB * 350) / 100)) * 49) / 100) + ((R2_GLOBALS._v565E9 * _electromagnet._percent * 6) / 100) + 89, 166 - (R2_GLOBALS._v565EB / 3)));
- _cable.changeZoom(((100 - ((R2_GLOBALS._v565EB * 350) / 100) + 52) / 10) * 10);
+ _cable.setPosition(Common::Point((((100 - ((CABLE700_X * 350) / 100)) * 49) / 100) + ((CABLE700_Y * _electromagnet._percent * 6) / 100) + 89, 166 - (CABLE700_X / 3)));
+ _cable.changeZoom(((100 - ((CABLE700_X * 350) / 100) + 52) / 10) * 10);
}
}
}
@@ -7639,7 +7805,7 @@ void Scene900::signal() {
_button3.remove();
_button2.initButton(2);
- if (R2_GLOBALS._v565E5 == 0)
+ if (!R2_GLOBALS._tractorField)
_button2.setup(900, 3, 9);
else
_button2.setup(900, 3, 11);
@@ -7684,7 +7850,7 @@ void Scene900::signal() {
_sceneMode = 0;
R2_GLOBALS._player.enableControl();
R2_GLOBALS._player._canWalk = false;
- R2_GLOBALS._v565E7 = 1;
+ R2_GLOBALS._cableAttached = true;
break;
case 900:
R2_GLOBALS._player.enableControl(CURSOR_USE);
@@ -7734,11 +7900,11 @@ void Scene900::dispatch() {
}
if (R2_GLOBALS._sceneObjects->contains(&_cable)) {
- if ((R2_GLOBALS._v565E5 != 0) && (R2_INVENTORY.getObjectScene(R2_CABLE_HARNESS) == 0) && (R2_INVENTORY.getObjectScene(R2_ATTRACTOR_CABLE_HARNESS) == 700) && (R2_GLOBALS._electromagnetChangeAmount == 20) && (R2_GLOBALS._electromagnetZoom == 70)) {
+ if (R2_GLOBALS._tractorField && (R2_INVENTORY.getObjectScene(R2_CABLE_HARNESS) == 0) && (R2_INVENTORY.getObjectScene(R2_ATTRACTOR_CABLE_HARNESS) == 700) && (R2_GLOBALS._electromagnetChangeAmount == 20) && (R2_GLOBALS._electromagnetZoom == 70)) {
if ((_cable._frame > 1) && (_cable._animateMode != ANIM_MODE_6))
_cable.animate(ANIM_MODE_6, NULL);
} else {
- if ((_cable._frame < 8) && (_cable._animateMode != ANIM_MODE_5) && (R2_GLOBALS._v565E7 == 0) && (R2_INVENTORY.getObjectScene(R2_CABLE_HARNESS) == 0) && (R2_INVENTORY.getObjectScene(R2_ATTRACTOR_CABLE_HARNESS) == 700) && (_sceneMode != 4))
+ if ((_cable._frame < 8) && (_cable._animateMode != ANIM_MODE_5) && !R2_GLOBALS._cableAttached && (R2_INVENTORY.getObjectScene(R2_CABLE_HARNESS) == 0) && (R2_INVENTORY.getObjectScene(R2_ATTRACTOR_CABLE_HARNESS) == 700) && (_sceneMode != 4))
_cable.animate(ANIM_MODE_5, NULL);
}
}
@@ -7746,7 +7912,7 @@ void Scene900::dispatch() {
_electromagnet.changeZoom(100 - ((R2_GLOBALS._electromagnetZoom * 70) / 100));
_electromagnet.setPosition(Common::Point(((_electromagnet._percent * R2_GLOBALS._electromagnetChangeAmount * 6) / 100) + 89, R2_GLOBALS._electromagnetZoom));
- if ((R2_GLOBALS._sceneObjects->contains(&_cable)) && (R2_GLOBALS._v565E7 != 0) && (!_cable._mover) && (_cable._animateMode == ANIM_MODE_NONE)) {
+ if ((R2_GLOBALS._sceneObjects->contains(&_cable)) && R2_GLOBALS._cableAttached && (!_cable._mover) && (_cable._animateMode == ANIM_MODE_NONE)) {
_cable.setPosition(Common::Point(_electromagnet._position.x + ((_electromagnet._percent * 49) / 100), _electromagnet._position.y + ((_electromagnet._percent * 3) / 10)));
if (R2_GLOBALS._electromagnetZoom >= 75) {
_cable.setup(901, 1, 1);
diff --git a/engines/tsage/ringworld2/ringworld2_scenes0.h b/engines/tsage/ringworld2/ringworld2_scenes0.h
index fe42f1e33e..f50c9a92a2 100644
--- a/engines/tsage/ringworld2/ringworld2_scenes0.h
+++ b/engines/tsage/ringworld2/ringworld2_scenes0.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope 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.
@@ -85,7 +85,7 @@ class Scene100: public SceneExt {
public:
NamedHotspot _background, _duct, _bed, _desk;
Terminal _terminal;
- SceneActor _bedLights1, _bedLights2, _object3, _object4, _object5;
+ SceneActor _bedLights1, _bedLights2, _tableLocker, _wardrobeTopAnim, _wardrobeColorAnim;
SceneActor _wardrobe;
Door _door;
Table _table;
@@ -111,7 +111,7 @@ class Scene125: public SceneExt {
public:
int _lookLineNum, _iconId;
bool _pressed;
- SceneObject _object1, _object2;
+ SceneObject _glyph, _horizLine;
SceneText _sceneText1, _sceneText2;
Icon();
@@ -136,7 +136,8 @@ public:
ASoundExt _sound1;
NamedHotspot _background, _item2, _item3;
DiskSlot _diskSlot;
- SceneActor _object1, _object2, _object3, _object4, _food, _foodDispenser, _infoDisk;
+ SceneActor _starchart1, _starchart2, _starchart3, _starchart4;
+ SceneActor _food, _foodDispenser, _infoDisk;
Icon _icon1, _icon2, _icon3, _icon4, _icon5, _icon6;
SequenceManager _sequenceManager;
SceneText _sceneText;
@@ -175,7 +176,6 @@ public:
ASound _sound1;
Action1 _action1;
int _frameNumber, _yChange;
- SceneObject _object1, _object2, _object3;
int _lineNum;
SynchronizedList<SceneText *> _creditsList;
public:
@@ -201,7 +201,7 @@ public:
SpeakerDutyOfficer180 _dutyOfficerSpeaker;
SpeakerTeal180 _tealSpeaker;
SpeakerGameText _gameTextSpeaker;
- SceneActor _dutyOfficer, _teal, _webbser, _door, _shipDisplay;
+ SceneActor _dutyOfficer, _teal, _webbster, _door, _shipDisplay;
ScenePalette _palette;
SceneText _textList[20];
AnimationPlayerExt _animationPlayer;
@@ -210,10 +210,9 @@ public:
ASoundExt _sound1;
int _frameNumber;
- int _field412, _field480;
- int _field482, _frameInc;
+ bool _helpEnabled;
+ int _frameInc;
int _fontNumber, _fontHeight;
- int _scene180Mode;
public:
Scene180();
@@ -263,6 +262,13 @@ public:
virtual void signal();
};
+class Star: public SceneObject {
+public:
+ int _x100, _y100;
+public:
+ virtual Common::String getClassName() { return "Scene205_Star"; }
+};
+
class Scene205: public SceneExt {
/* Actions */
class Action1: public Action {
@@ -271,26 +277,18 @@ class Scene205: public SceneExt {
public:
virtual void signal();
};
-
- /* Objects */
- class Object: public SceneObject {
- public:
- int _x100, _y100;
- public:
- // TODO: Check if this derives from DataManager? and flesh out
- };
private:
void setup();
- void processList(Object **ObjList, int count, const Common::Rect &bounds,
+ void processList(Star **ObjList, int count, const Common::Rect &bounds,
int xMultiply, int yMultiply, int xCenter, int yCenter);
void handleText();
public:
AnimationPlayer _animationPlayer;
int _fontHeight;
SceneText _textList[15];
- Object *_objList1[3];
- Object *_objList2[3];
- Object *_objList3[4];
+ Star *_starList1[3];
+ Star *_starList2[3];
+ Star *_starList3[4];
ASound _sound1;
Action1 _action1;
int _yp;
@@ -306,6 +304,24 @@ public:
virtual void dispatch();
};
+class Scene205Demo: public SceneExt {
+ /* Actions */
+ class Action1: public Action {
+ public:
+ virtual void signal();
+ };
+private:
+ void leaveScene();
+public:
+ VisualSpeaker _animationPlayer;
+ ASound _sound1;
+ Action1 _action1;
+public:
+ virtual void postInit(SceneObjectList *OwnerList = NULL);
+ virtual void remove();
+ virtual void process(Event &event);
+};
+
class Scene250: public SceneExt {
class Button: public SceneActor {
public:
@@ -402,8 +418,8 @@ public:
QuinnWorkstation _quinnWorkstation1, _quinnWorkstation2;
SeekerWorkstation _seekerWorkstation;
MirandaWorkstation _mirandaWorkstation1, _mirandaWorkstation2;
- SceneActor _object1, _object2, _object3, _object4, _protocolDisplay;
- SceneActor _object6, _object7, _object8, _object9;
+ SceneActor _atmosphereLeftWindow, _atmosphereRightWindow, _leftVerticalBarsAnim, _rightVerticalBarsAnim, _protocolDisplay;
+ SceneActor _rightTextDisplay, _mirandaScreen, _leftTextDisplay, _quinnScreen;
SceneActor _teal, _soldier, _object12;
Doorway _doorway;
Miranda _miranda;
@@ -430,7 +446,7 @@ class Scene325: public SceneExt {
public:
int _lookLineNum, _iconId;
bool _pressed;
- SceneObject _object1, _object2;
+ SceneObject _glyph, _horizLine;
SceneText _sceneText1, _sceneText2;
Icon();
@@ -450,16 +466,17 @@ private:
void setMessage(int resNum, int lineNum);
Common::String parseMessage(const Common::String &msg);
public:
- int _field412, _iconFontNumber, _field416, _field418;
- int _field41A, _field41C, _field41E, _scannerLocation;
+ int _consoleAction, _iconFontNumber, _databasePage, _priorConsoleAction;
+ int _moveCounter, _yChange, _yDirection, _scannerLocation;
int _soundCount, _soundIndex;
int _soundQueue[10];
SpeakerQuinn _quinnSpeaker;
ScenePalette _palette;
SceneHotspot _background, _terminal;
- SceneObject _object1, _object2, _object3, _object4, _object5;
- SceneObject _object6, _object7, _object8, _object9, _object10;
- SceneObject _object11, _object12, _scannerTab;
+ SceneObject _starGrid1, _starGrid2, _starGrid3; // Both starchart & scan grid objects
+ SceneObject _starGrid4, _starGrid5, _starGrid6, _starGrid7;
+ SceneObject _starGrid8, _starGrid9, _starGrid10, _starGrid11;
+ SceneObject _starGrid12, _starGrid13;
SceneObject _objList[4];
Icon _icon1, _icon2, _icon3, _icon4, _icon5, _icon6;
ASoundExt _sound1;
@@ -530,7 +547,7 @@ class Scene500: public SceneExt {
int _buttonId;
bool _buttonDown;
- void doButtonPress();
+ void doButtonPress();
public:
Button();
virtual Common::String getClassName() { return "Scene500_Button"; }
@@ -628,7 +645,6 @@ public:
virtual void postInit(SceneObjectList *OwnerList = NULL);
virtual void signal();
-
};
class Scene600 : public SceneExt {
@@ -645,7 +661,7 @@ class Scene600 : public SceneExt {
public:
virtual void signal();
virtual bool startAction(CursorType action, Event &event);
- virtual GfxSurface getFrame();
+ virtual void draw();
};
class Doorway : public SceneActor {
public:
@@ -793,7 +809,7 @@ public:
Button _button;
CableJunction _cableJunction;
DeviceSlot _deviceSlot;
- SceneActor _autodocCover, _opticalFibre, _reader;
+ SceneActor _autodocCover, _opticalFiber, _reader;
Door _door;
Tray _tray;
ComScanner _comScanner;
@@ -808,7 +824,7 @@ class Scene825: public SceneExt {
/* Objects */
class Button: public SceneObject {
public:
- int _buttonId, _v2;
+ int _buttonId;
bool _buttonDown;
SceneText _sceneText;
public:
@@ -869,7 +885,7 @@ public:
NamedHotspot _background, _eastDoor, _compartment, _sickBayIndicator;
NamedHotspot _liftControls;
Indicator _indicator;
- SceneActor _spark, _fibre;
+ SceneActor _spark, _fiber;
LiftDoor _liftDoor;
SickBayDoor _sickBayDoor;
Clamp _clamp;
diff --git a/engines/tsage/ringworld2/ringworld2_scenes1.cpp b/engines/tsage/ringworld2/ringworld2_scenes1.cpp
index 0932c70f04..29646d1612 100644
--- a/engines/tsage/ringworld2/ringworld2_scenes1.cpp
+++ b/engines/tsage/ringworld2/ringworld2_scenes1.cpp
@@ -5,21 +5,23 @@
* file distributed with this source distribution.
*
* This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU GenWeral Public License
+ * modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope 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.
*
*/
+#include "graphics/cursorman.h"
+
#include "tsage/scenes.h"
#include "tsage/tsage.h"
#include "tsage/staticres.h"
@@ -100,10 +102,10 @@ void Scene1000::remove() {
void Scene1000::signal() {
ScenePalette scenePalette1, scenePalette2;
uint32 black = 0;
-
+
switch (_sceneMode++) {
case 0:
- // TODO: Sort out values
+ // TODO: Determine correct colors
R2_GLOBALS._gfxColors.foreground = 191;
R2_GLOBALS._gfxColors.background = 144;
R2_GLOBALS._fontColors.background = 224;
@@ -117,7 +119,7 @@ void Scene1000::signal() {
_animationPlayer.dispatch();
_forceCheckAnimationFl = true;
-
+
R2_GLOBALS._scenePalette.fade((const byte *)&black, true, 0);
for (int percent = 0; percent < 100; percent += 5)
R2_GLOBALS._scenePalette.fade((const byte *)&black, true, percent);
@@ -128,7 +130,7 @@ void Scene1000::signal() {
case 1:
R2_GLOBALS._sound1.fadeOut2(NULL);
- // TODO: Sort out values
+ // TODO: Determine correct colors
R2_GLOBALS._gfxColors.foreground = 191;
R2_GLOBALS._gfxColors.background = 144;
R2_GLOBALS._fontColors.background = 224;
@@ -146,9 +148,9 @@ void Scene1000::signal() {
break;
case 2:
- if (R2_GLOBALS._speechSubtitles & SPEECH_TEXT) {
+ if (R2_GLOBALS._speechSubtitles & SPEECH_TEXT)
setAction(&_sequenceManager1, this, 1, &R2_GLOBALS._player, NULL);
- } else {
+ else {
if (++_animCounter < 3)
_sceneMode = 2;
@@ -157,7 +159,7 @@ void Scene1000::signal() {
break;
case 3:
- // TODO: Sort out values
+ // TODO: Determine correct colors
R2_GLOBALS._gfxColors.foreground = 191;
R2_GLOBALS._gfxColors.background = 144;
R2_GLOBALS._fontColors.background = 224;
@@ -184,7 +186,7 @@ void Scene1000::signal() {
break;
case 4:
- // TODO: Sort out values
+ // TODO: Determine correct colors
R2_GLOBALS._gfxColors.foreground = 191;
R2_GLOBALS._gfxColors.background = 144;
R2_GLOBALS._fontColors.background = 224;
@@ -334,7 +336,7 @@ void Scene1000::signal() {
case 60:
R2_GLOBALS._sound1.play(333);
-
+
for (int percent = 100; percent >= 0; percent -= 5)
R2_GLOBALS._scenePalette.fade((const byte *)&black, true, percent);
@@ -443,7 +445,7 @@ void Scene1000::signal() {
R2_GLOBALS._scenePalette.fade((const byte *)&black, 1, 0);
for (int percent = 0; percent < 100; percent += 5)
R2_GLOBALS._scenePalette.fade((const byte *)&black, true, percent);
- break;
+ break;
case 101:
R2_GLOBALS._sound1.fadeOut2(NULL);
@@ -463,9 +465,8 @@ void Scene1000::dispatch() {
if (_sceneMode == 52)
_animationPlayer._endAction = this;
- } else {
+ } else
_animationPlayer.dispatch();
- }
}
Scene::dispatch();
@@ -479,9 +480,9 @@ void Scene1000::dispatch() {
void Scene1010::postInit(SceneObjectList *OwnerList) {
loadScene(1010);
- SceneExt::postInit();
- R2_GLOBALS._interfaceY = 200;
R2_GLOBALS._uiElements._active = false;
+ SceneExt::postInit();
+ R2_GLOBALS._interfaceY = SCREEN_HEIGHT;
setZoomPercents(100, 1, 160, 100);
R2_GLOBALS._player.postInit();
@@ -540,14 +541,13 @@ void Scene1010::signal() {
void Scene1020::postInit(SceneObjectList *OwnerList) {
loadScene(1020);
+ R2_GLOBALS._uiElements._active = false;
SceneExt::postInit();
if (R2_GLOBALS._sceneManager._previousScene == 1010)
_sceneBounds = Rect(160, 0, SCREEN_WIDTH + 160, 200);
- R2_GLOBALS._interfaceY = 200;
- R2_GLOBALS._v558B6.set(160, 0, 160, 161);
- R2_GLOBALS._uiElements._active = false;
+ R2_GLOBALS._interfaceY = SCREEN_HEIGHT;
R2_GLOBALS._player.postInit();
if (R2_GLOBALS._sceneManager._previousScene == 1010) {
@@ -678,12 +678,13 @@ void Scene1100::synchronize(Serializer &s) {
}
bool Scene1100::Seeker::startAction(CursorType action, Event &event) {
- Scene1100 *scene = (Scene1100 *)R2_GLOBALS._sceneManager._scene;
-
if (action != CURSOR_TALK)
return SceneActor::startAction(action, event);
+ Scene1100 *scene = (Scene1100 *)R2_GLOBALS._sceneManager._scene;
+
if (R2_GLOBALS.getFlag(52)) {
+ // The trouper is dead
R2_GLOBALS._player.disableControl();
if (R2_GLOBALS._player._characterIndex == R2_QUINN)
scene->_nextStripNum = 327;
@@ -692,15 +693,16 @@ bool Scene1100::Seeker::startAction(CursorType action, Event &event) {
scene->_sceneMode = 53;
scene->setAction(&scene->_sequenceManager1, scene, 1122, &R2_GLOBALS._player, NULL);
} else {
+ // The trouper is not dead
R2_GLOBALS._player.disableControl();
scene->_sceneMode = 55;
- if (R2_GLOBALS._v565AE >= 3) {
+ if (R2_GLOBALS._stripModifier >= 3) {
if (R2_GLOBALS._player._characterIndex == R2_QUINN)
scene->_stripManager.start3(329, scene, R2_GLOBALS._stripManager_lookupList);
else
scene->_stripManager.start3(330, scene, R2_GLOBALS._stripManager_lookupList);
} else {
- ++R2_GLOBALS._v565AE;
+ ++R2_GLOBALS._stripModifier;
R2_GLOBALS._events.setCursor(CURSOR_CROSSHAIRS);
if (R2_GLOBALS._player._characterIndex == R2_QUINN)
scene->_stripManager.start3(304, scene, R2_GLOBALS._stripManager_lookupList);
@@ -717,18 +719,19 @@ bool Scene1100::Trooper::startAction(CursorType action, Event &event) {
switch (action) {
case R2_NEGATOR_GUN:
if (_visage == 1105) {
+ // Trooper wears the stasis shield
R2_GLOBALS._player.disableControl();
scene->_sceneMode = 1114;
scene->setAction(&scene->_sequenceManager1, scene, 1114, &R2_GLOBALS._player, &scene->_trooper, NULL);
return true;
- } else {
+ } else
return SceneActor::startAction(action, event);
- }
break;
case R2_SONIC_STUNNER:
// No break on purpose
case R2_PHOTON_STUNNER:
if (_visage == 1105) {
+ // If trooper wears the stasis shield
R2_GLOBALS._player.disableControl();
if (R2_GLOBALS._player._characterIndex == R2_QUINN) {
scene->_sceneMode = 1112;
@@ -739,17 +742,16 @@ bool Scene1100::Trooper::startAction(CursorType action, Event &event) {
}
return true;
} else if (_strip == 2) {
+ // Trooper wears his black uniform
R2_GLOBALS._player.disableControl();
scene->_sceneMode = 1113;
- if (R2_GLOBALS._player._characterIndex == R2_QUINN) {
+ if (R2_GLOBALS._player._characterIndex == R2_QUINN)
scene->setAction(&scene->_sequenceManager1, scene, 1113, &R2_GLOBALS._player, &scene->_trooper, NULL);
- } else {
+ else
scene->setAction(&scene->_sequenceManager1, scene, 1118, &R2_GLOBALS._player, &scene->_trooper, NULL);
- }
return true;
- } else {
+ } else
return SceneActor::startAction(action, event);
- }
break;
default:
return SceneActor::startAction(action, event);
@@ -758,9 +760,11 @@ bool Scene1100::Trooper::startAction(CursorType action, Event &event) {
}
bool Scene1100::Chief::startAction(CursorType action, Event &event) {
- Scene1100 *scene = (Scene1100 *)R2_GLOBALS._sceneManager._scene;
-
+ // CHECKME: Flag 54 is never set. Guess: the flag means "Chief is dead"
if ((action == CURSOR_TALK) && (!R2_GLOBALS.getFlag(54)) && (R2_GLOBALS.getFlag(52))) {
+ // Talk to chief after the trooper dies
+ Scene1100 *scene = (Scene1100 *)R2_GLOBALS._sceneManager._scene;
+
scene->_nextStripNum = 0;
R2_GLOBALS._player.disableControl();
scene->_sceneMode = 53;
@@ -777,20 +781,14 @@ void Scene1100::postInit(SceneObjectList *OwnerList) {
else
loadScene(1100);
- if ((R2_GLOBALS._sceneManager._previousScene == 1000) && (!R2_GLOBALS.getFlag(44))) {
+ if ((R2_GLOBALS._sceneManager._previousScene == 1000) && (!R2_GLOBALS.getFlag(44)))
R2_GLOBALS._uiElements._active = false;
- R2_GLOBALS._v5589E.left = 0;
- R2_GLOBALS._v5589E.right = 200;
- }
if (R2_GLOBALS._player._characterScene[R2_QUINN] == 1100)
R2_GLOBALS._sceneManager._previousScene = 1100;
- if (R2_GLOBALS._sceneManager._previousScene == -1) {
+ if (R2_GLOBALS._sceneManager._previousScene == -1)
R2_GLOBALS._uiElements._active = false;
- R2_GLOBALS._v5589E.left = 0;
- R2_GLOBALS._v5589E.right = 200;
- }
SceneExt::postInit();
@@ -847,6 +845,7 @@ void Scene1100::postInit(SceneObjectList *OwnerList) {
_chief.setDetails(1100, 3, -1, -1, 1, (SceneItem *) NULL);
_trooper.postInit();
+ // Trooper wears his stasis shield
_trooper.setup(1105, 3, 1);
_trooper.setPosition(Common::Point(312, 165));
_trooper._numFrames = 5;
@@ -868,8 +867,8 @@ void Scene1100::postInit(SceneObjectList *OwnerList) {
_palette1.loadPalette(1101);
R2_GLOBALS._player.postInit();
R2_GLOBALS._player.disableControl();
- R2_GLOBALS._player._effect = 5;
- R2_GLOBALS._player._field9C = _field312;
+ R2_GLOBALS._player._effect = EFFECT_SHADOW_MAP;
+ R2_GLOBALS._player._shadowMap = _shadowPaletteMap;
R2_GLOBALS._player.setup(1102, 3, 2);
R2_GLOBALS._player.setObjectWrapper(NULL);
R2_GLOBALS._player.setPosition(Common::Point(111,-20));
@@ -877,8 +876,8 @@ void Scene1100::postInit(SceneObjectList *OwnerList) {
R2_GLOBALS._player._moveRate = 30;
R2_GLOBALS._player._moveDiff = Common::Point(16, 2);
- _rightLandslide.setup2(1104, 2, 1, 175, 125, 102, 1);
- _object2.setup2(1102, 5, 1, 216, 167, 1, 0);
+ _rightLandslide.setup2(1104, 2, 1, 175, 125, 102, EFFECT_SHADED);
+ _purplePlant.setup2(1102, 5, 1, 216, 167, 1, EFFECT_NONE);
_leftImpacts.postInit();
_leftImpacts.setup(1113, 2, 1);
@@ -894,8 +893,8 @@ void Scene1100::postInit(SceneObjectList *OwnerList) {
_shipFormationShadow.setup(1102, 6, 2);
_shipFormationShadow._moveRate = 30;
_shipFormationShadow._moveDiff.x = 2;
- _shipFormationShadow._effect = 5;
- _shipFormationShadow._field9C = _field312;
+ _shipFormationShadow._effect = EFFECT_SHADOW_MAP;
+ _shipFormationShadow._shadowMap = _shadowPaletteMap;
R2_GLOBALS._sound1.play(86);
@@ -905,8 +904,10 @@ void Scene1100::postInit(SceneObjectList *OwnerList) {
} else {
_cloud.setPosition(Common::Point(180, 30));
if (R2_GLOBALS.getFlag(52))
+ // Trooper is dead
R2_GLOBALS._sound1.play(98);
else
+ // Trooper is alive
R2_GLOBALS._sound1.play(95);
R2_GLOBALS._player.postInit();
@@ -915,6 +916,7 @@ void Scene1100::postInit(SceneObjectList *OwnerList) {
_seeker.postInit();
if (R2_GLOBALS.getFlag(52)) {
+ // Trooper is dead
if (R2_GLOBALS._player._characterIndex == R2_QUINN) {
R2_GLOBALS._player.setup(19, 7, 1);
_seeker.setup(29, 6, 1);
@@ -926,6 +928,7 @@ void Scene1100::postInit(SceneObjectList *OwnerList) {
_seeker.setPosition(Common::Point(237, 134));
R2_GLOBALS._player.enableControl();
} else {
+ // Trooper is alive
if (R2_GLOBALS._player._characterIndex == R2_QUINN) {
R2_GLOBALS._player.setup(1107, 2, 1);
_seeker.setup(1107, 4, 1);
@@ -957,16 +960,20 @@ void Scene1100::postInit(SceneObjectList *OwnerList) {
_chief.setDetails(1100, 3, -1, -1, 1, (SceneItem *) NULL);
if (!R2_GLOBALS.getFlag(52)) {
+ // If trooper is alive, initialize him
_trooper.postInit();
if (R2_GLOBALS.getFlag(53))
+ // Trooper wears his black uniform
_trooper.setup(1106, 2, 4);
else
+ // Trooper wears a stasis shield
_trooper.setup(1105, 4, 4);
_trooper.setPosition(Common::Point(17, 54));
_trooper._numFrames = 5;
if (R2_GLOBALS.getFlag(53))
+ // Trooper isn't wearing the stasis shield
_trooper.setDetails(1100, 28, -1, -1, 1, (SceneItem *) NULL);
else
_trooper.setDetails(1100, 22, 23, 24, 1, (SceneItem *) NULL);
@@ -1038,12 +1045,12 @@ void Scene1100::signal() {
break;
case 5:
_runningGuy1.postInit();
- _runningGuy1._effect = 6;
+ _runningGuy1._effect = EFFECT_SHADED2;
_runningGuy1.setup(1103, 3, 1);
_runningGuy1._moveRate = 30;
_runningGuy2.postInit();
- _runningGuy2._effect = 6;
+ _runningGuy2._effect = EFFECT_SHADED2;
_runningGuy2.setup(1103, 4, 1);
_runningGuy2._moveRate = 25;
@@ -1063,7 +1070,7 @@ void Scene1100::signal() {
setAction(&_sequenceManager1, this, 1103, &_chief, &_laserShot, NULL);
break;
case 8:
- R2_GLOBALS._player._effect = 0;
+ R2_GLOBALS._player._effect = EFFECT_NONE;
_animation.postInit();
setAction(&_sequenceManager1, this, 1105, &R2_GLOBALS._player, &_laserShot, &_animation, &_chief, NULL);
break;
@@ -1084,7 +1091,7 @@ void Scene1100::signal() {
case 11: {
setAction(&_sequenceManager1, this, 1106, &_animation, &_laserShot, &_leftImpacts, NULL);
- R2_GLOBALS._player._effect = 5;
+ R2_GLOBALS._player._effect = EFFECT_SHADOW_MAP;
R2_GLOBALS._player.setup(1102, 3, 2);
R2_GLOBALS._player.setPosition(Common::Point(-50, 131));
R2_GLOBALS._sound2.play(84);
@@ -1169,6 +1176,7 @@ void Scene1100::signal() {
R2_GLOBALS._player._canWalk = false;
break;
case 51:
+ // Trooper no longer wears a statis shield
R2_GLOBALS.setFlag(53);
_trooper.setDetails(1100, 28, -1, -1, 3, (SceneItem *) NULL);
@@ -1176,6 +1184,7 @@ void Scene1100::signal() {
R2_GLOBALS._player._canWalk = false;
break;
case 52:
+ // Trooper is shot to death
R2_GLOBALS._sound1.play(98);
R2_GLOBALS.setFlag(52);
R2_GLOBALS._player.disableControl();
@@ -1193,21 +1202,13 @@ void Scene1100::signal() {
R2_GLOBALS._events.setCursor(CURSOR_CROSSHAIRS);
if (_nextStripNum == 0) {
R2_GLOBALS.setFlag(55);
- if (R2_GLOBALS.getFlag(55)) {
- if (R2_GLOBALS._player._characterIndex == R2_QUINN)
- _stripManager.start(318, this);
- else
- _stripManager.start(323, this);
- } else {
- // This part is totally useless as flag 55 has been set right before the check
- if (R2_GLOBALS._player._characterIndex == R2_QUINN)
- _stripManager.start(317, this);
- else
- _stripManager.start(322, this);
- }
- } else {
+ if (R2_GLOBALS._player._characterIndex == R2_QUINN)
+ _stripManager.start(318, this);
+ else
+ _stripManager.start(323, this);
+ } else
_stripManager.start3(_nextStripNum, this, _stripManager._lookupList);
- }
+
break;
case 54:
if (_stripManager._exitMode == 1) {
@@ -1356,7 +1357,7 @@ void Scene1200::LaserPanel::Jumper::init(int state) {
switch (_state) {
case 1:
- switch (R2_GLOBALS._v56AA6) {
+ switch (R2_GLOBALS._ductMazePanel1State) {
case 1:
setFrame2(2);
setPosition(Common::Point(129, 101));
@@ -1370,7 +1371,7 @@ void Scene1200::LaserPanel::Jumper::init(int state) {
}
break;
case 2:
- switch (R2_GLOBALS._v56AA7) {
+ switch (R2_GLOBALS._ductMazePanel2State) {
case 1:
setFrame2(2);
setPosition(Common::Point(152, 101));
@@ -1388,7 +1389,7 @@ void Scene1200::LaserPanel::Jumper::init(int state) {
}
break;
case 3:
- switch (R2_GLOBALS._v56AA8) {
+ switch (R2_GLOBALS._ductMazePanel3State) {
case 1:
setFrame2(3);
setPosition(Common::Point(158, 95));
@@ -1415,22 +1416,22 @@ bool Scene1200::LaserPanel::Jumper::startAction(CursorType action, Event &event)
R2_GLOBALS._sound2.play(260);
switch (_state) {
case 1:
- if (R2_GLOBALS._v56AA6 == 1) {
- R2_GLOBALS._v56AA6 = 2;
+ if (R2_GLOBALS._ductMazePanel1State == 1) {
+ R2_GLOBALS._ductMazePanel1State = 2;
setFrame2(3);
setPosition(Common::Point(135, 95));
} else {
- R2_GLOBALS._v56AA6 = 1;
+ R2_GLOBALS._ductMazePanel1State = 1;
setFrame2(2);
setPosition(Common::Point(129, 101));
}
break;
case 2:
- ++R2_GLOBALS._v56AA7;
- if (R2_GLOBALS._v56AA7 == 4)
- R2_GLOBALS._v56AA7 = 1;
+ ++R2_GLOBALS._ductMazePanel2State;
+ if (R2_GLOBALS._ductMazePanel2State == 4)
+ R2_GLOBALS._ductMazePanel2State = 1;
- switch (R2_GLOBALS._v56AA7) {
+ switch (R2_GLOBALS._ductMazePanel2State) {
case 1:
setFrame2(2);
setPosition(Common::Point(152, 101));
@@ -1448,12 +1449,12 @@ bool Scene1200::LaserPanel::Jumper::startAction(CursorType action, Event &event)
}
break;
case 3:
- if (R2_GLOBALS._v56AA8 == 1) {
- R2_GLOBALS._v56AA8 = 2;
+ if (R2_GLOBALS._ductMazePanel3State == 1) {
+ R2_GLOBALS._ductMazePanel3State = 2;
setFrame2(2);
setPosition(Common::Point(175, 101));
} else {
- R2_GLOBALS._v56AA8 = 1;
+ R2_GLOBALS._ductMazePanel3State = 1;
setFrame2(3);
setPosition(Common::Point(158, 95));
}
@@ -1465,13 +1466,13 @@ bool Scene1200::LaserPanel::Jumper::startAction(CursorType action, Event &event)
Scene1200 *scene = (Scene1200 *)R2_GLOBALS._sceneManager._scene;
scene->_field418 = 0;
- if ((R2_GLOBALS._v56AA6 == 1) && (R2_GLOBALS._v56AA7 == 1) && (R2_GLOBALS._v56AA8 == 1))
+ if ((R2_GLOBALS._ductMazePanel1State == 1) && (R2_GLOBALS._ductMazePanel2State == 1) && (R2_GLOBALS._ductMazePanel3State == 1))
scene->_field418 = 1;
- else if ((R2_GLOBALS._v56AA6 == 2) && (R2_GLOBALS._v56AA7 == 1) && (R2_GLOBALS._v56AA8 == 1))
+ else if ((R2_GLOBALS._ductMazePanel1State == 2) && (R2_GLOBALS._ductMazePanel2State == 1) && (R2_GLOBALS._ductMazePanel3State == 1))
scene->_field418 = 2;
- else if ((R2_GLOBALS._v56AA6 == 2) && (R2_GLOBALS._v56AA7 == 1) && (R2_GLOBALS._v56AA8 == 2))
+ else if ((R2_GLOBALS._ductMazePanel1State == 2) && (R2_GLOBALS._ductMazePanel2State == 1) && (R2_GLOBALS._ductMazePanel3State == 2))
scene->_field418 = 3;
- else if ((R2_GLOBALS._v56AA6 == 2) && (R2_GLOBALS._v56AA7 == 3) && (R2_GLOBALS._v56AA8 == 1))
+ else if ((R2_GLOBALS._ductMazePanel1State == 2) && (R2_GLOBALS._ductMazePanel2State == 3) && (R2_GLOBALS._ductMazePanel3State == 1))
scene->_field418 = 4;
return true;
@@ -1482,8 +1483,8 @@ void Scene1200::LaserPanel::postInit(SceneObjectList *OwnerList) {
scene->_field41A = 1;
R2_GLOBALS._events.setCursor(CURSOR_USE);
- proc12(1003, 1, 1, 100, 40);
- proc13(1200, 11, -1, -1);
+ setup2(1003, 1, 1, 100, 40);
+ setup3(1200, 11, -1, -1);
R2_GLOBALS._sound2.play(259);
_jumper1.init(1);
_jumper2.init(2);
@@ -1520,13 +1521,13 @@ void Scene1200::postInit(SceneObjectList *OwnerList) {
_field418 = 0;
_field41A = 0;
- if ((R2_GLOBALS._v56AA6 == 1) && (R2_GLOBALS._v56AA7 == 1) && (R2_GLOBALS._v56AA8 == 1))
+ if ((R2_GLOBALS._ductMazePanel1State == 1) && (R2_GLOBALS._ductMazePanel2State == 1) && (R2_GLOBALS._ductMazePanel3State == 1))
_field418 = 1;
- else if ((R2_GLOBALS._v56AA6 == 2) && (R2_GLOBALS._v56AA7 == 1) && (R2_GLOBALS._v56AA8 == 1))
+ else if ((R2_GLOBALS._ductMazePanel1State == 2) && (R2_GLOBALS._ductMazePanel2State == 1) && (R2_GLOBALS._ductMazePanel3State == 1))
_field418 = 2;
- else if ((R2_GLOBALS._v56AA6 == 2) && (R2_GLOBALS._v56AA7 == 1) && (R2_GLOBALS._v56AA8 == 2))
+ else if ((R2_GLOBALS._ductMazePanel1State == 2) && (R2_GLOBALS._ductMazePanel2State == 1) && (R2_GLOBALS._ductMazePanel3State == 2))
_field418 = 3;
- else if ((R2_GLOBALS._v56AA6 == 2) && (R2_GLOBALS._v56AA7 == 3) && (R2_GLOBALS._v56AA8 == 1))
+ else if ((R2_GLOBALS._ductMazePanel1State == 2) && (R2_GLOBALS._ductMazePanel2State == 3) && (R2_GLOBALS._ductMazePanel3State == 1))
_field418 = 4;
R2_GLOBALS._player.postInit();
@@ -1561,7 +1562,7 @@ void Scene1200::signal() {
// No break on purpose
case 1203:
R2_GLOBALS._player.enableControl();
- warning("_eventManager.waitEvent()");
+ // CHECKME: The original is calling _eventManager.waitEvent();
_sceneMode = 2;
break;
case 10:
@@ -1783,7 +1784,7 @@ void Scene1200::signal() {
R2_GLOBALS._player.animate(ANIM_MODE_6, this);
break;
default:
- warning("_eventManager.waitEvent()");
+ // CHECKME: The original is walling _eventManager.waitEvent();
_sceneMode = 2;
break;
}
@@ -1852,10 +1853,10 @@ void Scene1200::process(Event &event) {
if (R2_GLOBALS._scientistConvIndex >= 4)
R2_GLOBALS._sceneManager.changeScene(3250);
else
- SceneItem::display(1200, 6, 0, 280, 1, 160, 9, 1, 2, 20, 7, 154, -999);
+ SceneItem::display(1200, 6, 0, 280, 1, 160, 9, 1, 2, 20, 7, 154, LIST_END);
break;
default:
- SceneItem::display(1200, 5, 0, 280, 1, 160, 9, 1, 2, 20, 7, 154, -999);
+ SceneItem::display(1200, 5, 0, 280, 1, 160, 9, 1, 2, 20, 7, 154, LIST_END);
break;
}
event.handled = true;
@@ -1868,7 +1869,7 @@ void Scene1200::process(Event &event) {
switch (cellPos.x) {
case 3:
// It was your cell.
- SceneItem::display(1200, 8, 0, 280, 1, 160, 9, 1, 2, 20, 7, 7, -999);
+ SceneItem::display(1200, 8, 0, 280, 1, 160, 9, 1, 2, 20, 7, 7, LIST_END);
break;
case 9:
R2_GLOBALS._sceneManager.changeScene(3240);
@@ -1878,7 +1879,7 @@ void Scene1200::process(Event &event) {
R2_GLOBALS._sceneManager.changeScene(3210);
else
// A vent grill
- SceneItem::display(1200, 10, 0, 280, 1, 160, 9, 1, 2, 20, 7, 7, -999);
+ SceneItem::display(1200, 10, 0, 280, 1, 160, 9, 1, 2, 20, 7, 7, LIST_END);
break;
case 17:
switch (cellPos.y) {
@@ -1893,21 +1894,22 @@ void Scene1200::process(Event &event) {
break;
default:
// A vent grill
- SceneItem::display(1200, 10, 0, 280, 1, 160, 9, 1, 2, 20, 7, 7, -999);
+ SceneItem::display(1200, 10, 0, 280, 1, 160, 9, 1, 2, 20, 7, 7, LIST_END);
break;
}
+ break;
case 33:
R2_GLOBALS._sceneManager.changeScene(3245);
break;
default:
- SceneItem::display(1200, 10, 0, 280, 1, 160, 9, 1, 2, 20, 7, 7, -999);
+ SceneItem::display(1200, 10, 0, 280, 1, 160, 9, 1, 2, 20, 7, 7, LIST_END);
break;
}
}
if (cellId > 36) {
// "An anti-pest laser"
event.handled = true;
- SceneItem::display(1200, 9, 0, 280, 1, 160, 9, 1, 2, 20, 7, 7, -999);
+ SceneItem::display(1200, 9, 0, 280, 1, 160, 9, 1, 2, 20, 7, 7, LIST_END);
}
break;
case CURSOR_TALK:
@@ -1944,9 +1946,8 @@ void Scene1200::process(Event &event) {
return;
break;
}
- } else {
+ } else
return;
- }
}
void Scene1200::dispatch() {
@@ -2203,65 +2204,86 @@ void Scene1200::startCrawling(CrawlDirection dir) {
*
*--------------------------------------------------------------------------*/
-Scene1337::unkObj1337sub1::unkObj1337sub1() {
- _field34 = 0;
- _field36 = Common::Point(0, 0);
+Scene1337::Card::Card() {
+ _cardId = 0;
+ _stationPos = Common::Point(0, 0);
}
-void Scene1337::unkObj1337sub1::synchronize(Serializer &s) {
- warning("STUBBED: unkObj1337sub1::synchronize()");
+void Scene1337::Card::synchronize(Serializer &s) {
+ warning("STUBBED: Card::synchronize()");
}
-Scene1337::unkObj1337_1::unkObj1337_1() {
- _fieldB94 = Common::Point(0, 0);
- _fieldB98 = Common::Point(0, 0);
- _fieldB9C = Common::Point(0, 0);
- _fieldBA0 = Common::Point(0, 0);
- _fieldBA4 = 0;
+bool Scene1337::Card::isIn(Common::Point pt) {
+ if ((_stationPos.x > pt.x) || (_stationPos.x + 24 < pt.x))
+ return false;
+
+ if ((_stationPos.y > pt.y) || (_stationPos.y + 24 < pt.y))
+ return false;
+
+ return true;
}
-void Scene1337::unkObj1337_1::synchronize(Serializer &s) {
- warning("STUBBED: unkObj1337_1::synchronize()");
+Scene1337::GameBoardSide::GameBoardSide() {
+ _card1Pos = Common::Point(0, 0);
+ _card2Pos = Common::Point(0, 0);
+ _card3Pos = Common::Point(0, 0);
+ _card4Pos = Common::Point(0, 0);
+ _frameNum = 0;
+}
+
+void Scene1337::GameBoardSide::synchronize(Serializer &s) {
+ warning("STUBBED: GameBoardSide::synchronize()");
}
Scene1337::Scene1337() {
_autoplay = false;
- _field3E24 = 0;
- _field3E26 = 0;
+ _cardsAvailableNumb = 0;
+ _currentDiscardIndex = 0;
for (int i = 0; i < 100; i++)
- _field3E28[i] = 0;
+ _availableCardsPile[i] = 0;
+
+ _shuffleEndedFl = false;
+ _currentPlayerNumb = 0;
+ _actionIdx1 = 0;
+ _actionIdx2 = 0;
+ _showPlayerTurn = false;
+ _displayHelpFl = false;
+ _winnerId = -1;
+ _instructionsDisplayedFl = false;
+ _instructionsWaitCount = 0;
- _field423C = 0;
- _field423E = 0;
- _field4240 = 0;
- _field4242 = 0;
- _field4244 = 0;
- _field4246 = 0;
- _field4248 = 0;
- _field424A = 0;
- _field424C = 0;
- _field424E = 0;
+ _delayedFunction = nullptr;
+ _actionCard1 = nullptr;
+ _actionCard2 = nullptr;
+ _actionCard3 = nullptr;
+
+ _cursorCurRes = 0;
+ _cursorCurStrip = 0;
+ _cursorCurFrame = 0;
}
void Scene1337::synchronize(Serializer &s) {
warning("STUBBED: Scene1337::synchronize()");
}
-void Scene1337::Action1337::subD18B5(int resNum, int stripNum, int frameNum) {
- warning("STUBBED: Action1337::subD18B5()");
-}
-
-void Scene1337::Action1337::skipFrames(int32 skipCount) {
+void Scene1337::Action1337::waitFrames(int32 frameCount) {
uint32 firstFrameNumber = g_globals->_events.getFrameNumber();
- uint32 tmpFrameNumber = firstFrameNumber;
+ uint32 curFrame = firstFrameNumber;
+ uint32 destFrame = firstFrameNumber + frameCount;
- while (tmpFrameNumber < firstFrameNumber + skipCount)
- tmpFrameNumber = g_globals->_events.getFrameNumber();
+ while ((curFrame < destFrame) && !g_vm->shouldQuit()) {
+ TsAGE::Event event;
+ g_globals->_events.getEvent(event);
+ curFrame = g_globals->_events.getFrameNumber();
+ }
- warning("_eventManager.waitEvent(-1)");
+ // CHECKME: The original is calling _eventManager.waitEvent();
}
+/**
+ * Display instructions
+ */
void Scene1337::Action1::signal() {
Scene1337 *scene = (Scene1337 *)R2_GLOBALS._sceneManager._scene;
@@ -2272,393 +2294,396 @@ void Scene1337::Action1::signal() {
scene->actionDisplay(1331, 7, 159, 10, 1, 200, 0, 7, 0, 154, 154);
scene->actionDisplay(1331, 8, 159, 10, 1, 200, 0, 7, 0, 154, 154);
- scene->_arrunkObj1337[1]._arr2[0]._field34 = 2;
- scene->_arrunkObj1337[1]._arr2[0]._object1.postInit();
- scene->_arrunkObj1337[1]._arr2[0]._object1.setVisage(1332);
- scene->_arrunkObj1337[1]._arr2[0]._object1.setPosition(scene->_arrunkObj1337[1]._arr2[0]._field36, 0);
- scene->_arrunkObj1337[1]._arr2[0]._object1.setStrip(2);
- scene->_arrunkObj1337[1]._arr2[0]._object1.setFrame(scene->_arrunkObj1337[1]._arr2[0]._field34);
- scene->_arrunkObj1337[1]._arr2[0]._object1.fixPriority(170);
- scene->setAnimationInfo(&scene->_arrunkObj1337[1]._arr2[0]);
-
- scene->_arrunkObj1337[1]._arr2[1]._field34 = 3;
- scene->_arrunkObj1337[1]._arr2[1]._object1.postInit();
- scene->_arrunkObj1337[1]._arr2[1]._object1.setVisage(1332);
- scene->_arrunkObj1337[1]._arr2[1]._object1.setPosition(scene->_arrunkObj1337[1]._arr2[1]._field36, 0);
- scene->_arrunkObj1337[1]._arr2[1]._object1.setStrip(2);
- scene->_arrunkObj1337[1]._arr2[1]._object1.setFrame(scene->_arrunkObj1337[1]._arr2[1]._field34);
- scene->_arrunkObj1337[1]._arr2[1]._object1.fixPriority(170);
- scene->setAnimationInfo(&scene->_arrunkObj1337[1]._arr2[1]);
-
- scene->_arrunkObj1337[2]._arr2[0]._field34 = 4;
- scene->_arrunkObj1337[2]._arr2[0]._object1.postInit();
- scene->_arrunkObj1337[2]._arr2[0]._object1.setVisage(1332);
- scene->_arrunkObj1337[2]._arr2[0]._object1.setPosition(scene->_arrunkObj1337[2]._arr2[0]._field36, 0);
- scene->_arrunkObj1337[2]._arr2[0]._object1.setStrip(2);
- scene->_arrunkObj1337[2]._arr2[0]._object1.setFrame(scene->_arrunkObj1337[2]._arr2[0]._field34);
- scene->_arrunkObj1337[2]._arr2[0]._object1.fixPriority(170);
- scene->setAnimationInfo(&scene->_arrunkObj1337[2]._arr2[0]);
-
- scene->_arrunkObj1337[3]._arr2[0]._field34 = 5;
- scene->_arrunkObj1337[3]._arr2[0]._object1.postInit();
- scene->_arrunkObj1337[3]._arr2[0]._object1.setVisage(1332);
- scene->_arrunkObj1337[3]._arr2[0]._object1.setPosition(scene->_arrunkObj1337[3]._arr2[0]._field36, 0);
- scene->_arrunkObj1337[3]._arr2[0]._object1.setStrip(2);
- scene->_arrunkObj1337[3]._arr2[0]._object1.setFrame(scene->_arrunkObj1337[3]._arr2[0]._field34);
- scene->_arrunkObj1337[3]._arr2[0]._object1.fixPriority(170);
- scene->setAnimationInfo(&scene->_arrunkObj1337[3]._arr2[0]);
-
- scene->_arrunkObj1337[3]._arr2[1]._field34 = 6;
- scene->_arrunkObj1337[3]._arr2[1]._object1.postInit();
- scene->_arrunkObj1337[3]._arr2[1]._object1.setVisage(1332);
- scene->_arrunkObj1337[3]._arr2[1]._object1.setPosition(scene->_arrunkObj1337[3]._arr2[1]._field36, 0);
- scene->_arrunkObj1337[3]._arr2[1]._object1.setStrip(2);
- scene->_arrunkObj1337[3]._arr2[1]._object1.setFrame(scene->_arrunkObj1337[3]._arr2[1]._field34);
- scene->_arrunkObj1337[3]._arr2[1]._object1.fixPriority(170);
- scene->setAnimationInfo(&scene->_arrunkObj1337[3]._arr2[1]);
-
- scene->_arrunkObj1337[3]._arr2[2]._field34 = 7;
- scene->_arrunkObj1337[3]._arr2[2]._object1.postInit();
- scene->_arrunkObj1337[3]._arr2[2]._object1.setVisage(1332);
- scene->_arrunkObj1337[3]._arr2[2]._object1.setPosition(scene->_arrunkObj1337[3]._arr2[2]._field36, 0);
- scene->_arrunkObj1337[3]._arr2[2]._object1.setStrip(2);
- scene->_arrunkObj1337[3]._arr2[2]._object1.setFrame(scene->_arrunkObj1337[3]._arr2[2]._field34);
- scene->_arrunkObj1337[3]._arr2[2]._object1.fixPriority(170);
- scene->setAnimationInfo(&scene->_arrunkObj1337[3]._arr2[2]);
-
- scene->_arrunkObj1337[0]._arr2[0]._field34 = 8;
- scene->_arrunkObj1337[0]._arr2[0]._object1.postInit();
- scene->_arrunkObj1337[0]._arr2[0]._object1.setVisage(1332);
- scene->_arrunkObj1337[0]._arr2[0]._object1.setPosition(scene->_arrunkObj1337[0]._arr2[0]._field36, 0);
- scene->_arrunkObj1337[0]._arr2[0]._object1.setStrip(2);
- scene->_arrunkObj1337[0]._arr2[0]._object1.setFrame(scene->_arrunkObj1337[0]._arr2[0]._field34);
- scene->_arrunkObj1337[0]._arr2[0]._object1.fixPriority(170);
- scene->setAnimationInfo(&scene->_arrunkObj1337[0]._arr2[0]);
-
- scene->_arrunkObj1337[0]._arr2[1]._field34 = 9;
- scene->_arrunkObj1337[0]._arr2[1]._object1.postInit();
- scene->_arrunkObj1337[0]._arr2[1]._object1.setVisage(1332);
- scene->_arrunkObj1337[0]._arr2[1]._object1.setPosition(scene->_arrunkObj1337[0]._arr2[1]._field36, 0);
- scene->_arrunkObj1337[0]._arr2[1]._object1.setStrip(2);
- scene->_arrunkObj1337[0]._arr2[1]._object1.setFrame(scene->_arrunkObj1337[0]._arr2[1]._field34);
- scene->_arrunkObj1337[0]._arr2[1]._object1.fixPriority(170);
- scene->setAnimationInfo(&scene->_arrunkObj1337[0]._arr2[1]);
+ scene->_gameBoardSide[1]._outpostStation[0]._cardId = 2;
+ scene->_gameBoardSide[1]._outpostStation[0]._card.postInit();
+ scene->_gameBoardSide[1]._outpostStation[0]._card.setVisage(1332);
+ scene->_gameBoardSide[1]._outpostStation[0]._card.setPosition(scene->_gameBoardSide[1]._outpostStation[0]._stationPos, 0);
+ scene->_gameBoardSide[1]._outpostStation[0]._card.setStrip(2);
+ scene->_gameBoardSide[1]._outpostStation[0]._card.setFrame(scene->_gameBoardSide[1]._outpostStation[0]._cardId);
+ scene->_gameBoardSide[1]._outpostStation[0]._card.fixPriority(170);
+ scene->setAnimationInfo(&scene->_gameBoardSide[1]._outpostStation[0]);
+
+ scene->_gameBoardSide[1]._outpostStation[1]._cardId = 3;
+ scene->_gameBoardSide[1]._outpostStation[1]._card.postInit();
+ scene->_gameBoardSide[1]._outpostStation[1]._card.setVisage(1332);
+ scene->_gameBoardSide[1]._outpostStation[1]._card.setPosition(scene->_gameBoardSide[1]._outpostStation[1]._stationPos, 0);
+ scene->_gameBoardSide[1]._outpostStation[1]._card.setStrip(2);
+ scene->_gameBoardSide[1]._outpostStation[1]._card.setFrame(scene->_gameBoardSide[1]._outpostStation[1]._cardId);
+ scene->_gameBoardSide[1]._outpostStation[1]._card.fixPriority(170);
+ scene->setAnimationInfo(&scene->_gameBoardSide[1]._outpostStation[1]);
+
+ scene->_gameBoardSide[2]._outpostStation[0]._cardId = 4;
+ scene->_gameBoardSide[2]._outpostStation[0]._card.postInit();
+ scene->_gameBoardSide[2]._outpostStation[0]._card.setVisage(1332);
+ scene->_gameBoardSide[2]._outpostStation[0]._card.setPosition(scene->_gameBoardSide[2]._outpostStation[0]._stationPos, 0);
+ scene->_gameBoardSide[2]._outpostStation[0]._card.setStrip(2);
+ scene->_gameBoardSide[2]._outpostStation[0]._card.setFrame(scene->_gameBoardSide[2]._outpostStation[0]._cardId);
+ scene->setAnimationInfo(&scene->_gameBoardSide[2]._outpostStation[0]);
+
+ scene->_gameBoardSide[3]._outpostStation[0]._cardId = 5;
+ scene->_gameBoardSide[3]._outpostStation[0]._card.postInit();
+ scene->_gameBoardSide[3]._outpostStation[0]._card.setVisage(1332);
+ scene->_gameBoardSide[3]._outpostStation[0]._card.setPosition(scene->_gameBoardSide[3]._outpostStation[0]._stationPos, 0);
+ scene->_gameBoardSide[3]._outpostStation[0]._card.setStrip(2);
+ scene->_gameBoardSide[3]._outpostStation[0]._card.setFrame(scene->_gameBoardSide[3]._outpostStation[0]._cardId);
+ scene->_gameBoardSide[3]._outpostStation[0]._card.fixPriority(170);
+ scene->setAnimationInfo(&scene->_gameBoardSide[3]._outpostStation[0]);
+
+ scene->_gameBoardSide[3]._outpostStation[1]._cardId = 6;
+ scene->_gameBoardSide[3]._outpostStation[1]._card.postInit();
+ scene->_gameBoardSide[3]._outpostStation[1]._card.setVisage(1332);
+ scene->_gameBoardSide[3]._outpostStation[1]._card.setPosition(scene->_gameBoardSide[3]._outpostStation[1]._stationPos, 0);
+ scene->_gameBoardSide[3]._outpostStation[1]._card.setStrip(2);
+ scene->_gameBoardSide[3]._outpostStation[1]._card.setFrame(scene->_gameBoardSide[3]._outpostStation[1]._cardId);
+ scene->_gameBoardSide[3]._outpostStation[1]._card.fixPriority(170);
+ scene->setAnimationInfo(&scene->_gameBoardSide[3]._outpostStation[1]);
+
+ scene->_gameBoardSide[3]._outpostStation[2]._cardId = 7;
+ scene->_gameBoardSide[3]._outpostStation[2]._card.postInit();
+ scene->_gameBoardSide[3]._outpostStation[2]._card.setVisage(1332);
+ scene->_gameBoardSide[3]._outpostStation[2]._card.setPosition(scene->_gameBoardSide[3]._outpostStation[2]._stationPos, 0);
+ scene->_gameBoardSide[3]._outpostStation[2]._card.setStrip(2);
+ scene->_gameBoardSide[3]._outpostStation[2]._card.setFrame(scene->_gameBoardSide[3]._outpostStation[2]._cardId);
+ scene->_gameBoardSide[3]._outpostStation[2]._card.fixPriority(170);
+ scene->setAnimationInfo(&scene->_gameBoardSide[3]._outpostStation[2]);
+
+ scene->_gameBoardSide[0]._outpostStation[0]._cardId = 8;
+ scene->_gameBoardSide[0]._outpostStation[0]._card.postInit();
+ scene->_gameBoardSide[0]._outpostStation[0]._card.setVisage(1332);
+ scene->_gameBoardSide[0]._outpostStation[0]._card.setPosition(scene->_gameBoardSide[0]._outpostStation[0]._stationPos, 0);
+ scene->_gameBoardSide[0]._outpostStation[0]._card.setStrip(2);
+ scene->_gameBoardSide[0]._outpostStation[0]._card.setFrame(scene->_gameBoardSide[0]._outpostStation[0]._cardId);
+ scene->_gameBoardSide[0]._outpostStation[0]._card.fixPriority(170);
+ scene->setAnimationInfo(&scene->_gameBoardSide[0]._outpostStation[0]);
+
+ scene->_gameBoardSide[0]._outpostStation[1]._cardId = 9;
+ scene->_gameBoardSide[0]._outpostStation[1]._card.postInit();
+ scene->_gameBoardSide[0]._outpostStation[1]._card.setVisage(1332);
+ scene->_gameBoardSide[0]._outpostStation[1]._card.setPosition(scene->_gameBoardSide[0]._outpostStation[1]._stationPos, 0);
+ scene->_gameBoardSide[0]._outpostStation[1]._card.setStrip(2);
+ scene->_gameBoardSide[0]._outpostStation[1]._card.setFrame(scene->_gameBoardSide[0]._outpostStation[1]._cardId);
+ scene->_gameBoardSide[0]._outpostStation[1]._card.fixPriority(170);
+ scene->setAnimationInfo(&scene->_gameBoardSide[0]._outpostStation[1]);
R2_GLOBALS._sceneObjects->draw();
- skipFrames(60);
+ waitFrames(60);
scene->actionDisplay(1331, 9, 159, 10, 1, 200, 0, 7, 0, 154, 154);
- scene->_arrunkObj1337[2]._arr2[1]._field34 = 2;
- scene->_arrunkObj1337[2]._arr2[1]._object1.postInit();
- scene->_arrunkObj1337[2]._arr2[1]._object1.setVisage(1332);
- scene->_arrunkObj1337[2]._arr2[1]._object1.setPosition(scene->_arrunkObj1337[2]._arr2[1]._field36, 0);
- scene->_arrunkObj1337[2]._arr2[1]._object1.setStrip(2);
- scene->_arrunkObj1337[2]._arr2[1]._object1.setFrame(scene->_arrunkObj1337[2]._arr2[1]._field34);
- scene->_arrunkObj1337[2]._arr2[1]._object1.fixPriority(170);
- scene->setAnimationInfo(&scene->_arrunkObj1337[2]._arr2[1]);
-
- scene->_arrunkObj1337[2]._arr2[2]._field34 = 3;
- scene->_arrunkObj1337[2]._arr2[2]._object1.postInit();
- scene->_arrunkObj1337[2]._arr2[2]._object1.setVisage(1332);
- scene->_arrunkObj1337[2]._arr2[2]._object1.setPosition(scene->_arrunkObj1337[2]._arr2[2]._field36, 0);
- scene->_arrunkObj1337[2]._arr2[2]._object1.setStrip(2);
- scene->_arrunkObj1337[2]._arr2[2]._object1.setFrame(scene->_arrunkObj1337[2]._arr2[2]._field34);
- scene->_arrunkObj1337[2]._arr2[2]._object1.fixPriority(170);
- scene->setAnimationInfo(&scene->_arrunkObj1337[2]._arr2[2]);
-
- scene->_arrunkObj1337[2]._arr2[3]._field34 = 5;
- scene->_arrunkObj1337[2]._arr2[3]._object1.postInit();
- scene->_arrunkObj1337[2]._arr2[3]._object1.setVisage(1332);
- scene->_arrunkObj1337[2]._arr2[3]._object1.setPosition(scene->_arrunkObj1337[2]._arr2[3]._field36, 0);
- scene->_arrunkObj1337[2]._arr2[3]._object1.setStrip(2);
- scene->_arrunkObj1337[2]._arr2[3]._object1.setFrame(scene->_arrunkObj1337[2]._arr2[3]._field34);
- scene->_arrunkObj1337[2]._arr2[3]._object1.fixPriority(170);
- scene->setAnimationInfo(&scene->_arrunkObj1337[2]._arr2[3]);
-
- scene->_arrunkObj1337[2]._arr2[4]._field34 = 6;
- scene->_arrunkObj1337[2]._arr2[4]._object1.postInit();
- scene->_arrunkObj1337[2]._arr2[4]._object1.setVisage(1332);
- scene->_arrunkObj1337[2]._arr2[4]._object1.setPosition(scene->_arrunkObj1337[2]._arr2[4]._field36, 0);
- scene->_arrunkObj1337[2]._arr2[4]._object1.setStrip(2);
- scene->_arrunkObj1337[2]._arr2[4]._object1.setFrame(scene->_arrunkObj1337[2]._arr2[4]._field34);
- scene->_arrunkObj1337[2]._arr2[4]._object1.fixPriority(170);
- scene->setAnimationInfo(&scene->_arrunkObj1337[2]._arr2[4]);
-
- scene->_arrunkObj1337[2]._arr2[5]._field34 = 7;
- scene->_arrunkObj1337[2]._arr2[5]._object1.postInit();
- scene->_arrunkObj1337[2]._arr2[5]._object1.setVisage(1332);
- scene->_arrunkObj1337[2]._arr2[5]._object1.setPosition(scene->_arrunkObj1337[2]._arr2[5]._field36, 0);
- scene->_arrunkObj1337[2]._arr2[5]._object1.setStrip(2);
- scene->_arrunkObj1337[2]._arr2[5]._object1.setFrame(scene->_arrunkObj1337[2]._arr2[5]._field34);
- scene->_arrunkObj1337[2]._arr2[5]._object1.fixPriority(170);
- scene->setAnimationInfo(&scene->_arrunkObj1337[2]._arr2[5]);
-
- scene->_arrunkObj1337[2]._arr2[6]._field34 = 8;
- scene->_arrunkObj1337[2]._arr2[6]._object1.postInit();
- scene->_arrunkObj1337[2]._arr2[6]._object1.setVisage(1332);
- scene->_arrunkObj1337[2]._arr2[6]._object1.setPosition(scene->_arrunkObj1337[2]._arr2[6]._field36, 0);
- scene->_arrunkObj1337[2]._arr2[6]._object1.setStrip(2);
- scene->_arrunkObj1337[2]._arr2[6]._object1.setFrame(scene->_arrunkObj1337[2]._arr2[6]._field34);
- scene->_arrunkObj1337[2]._arr2[6]._object1.fixPriority(170);
- scene->setAnimationInfo(&scene->_arrunkObj1337[2]._arr2[6]);
-
- scene->_arrunkObj1337[2]._arr2[7]._field34 = 9;
- scene->_arrunkObj1337[2]._arr2[7]._object1.postInit();
- scene->_arrunkObj1337[2]._arr2[7]._object1.setVisage(1332);
- scene->_arrunkObj1337[2]._arr2[7]._object1.setPosition(scene->_arrunkObj1337[2]._arr2[7]._field36, 0);
- scene->_arrunkObj1337[2]._arr2[7]._object1.setStrip(2);
- scene->_arrunkObj1337[2]._arr2[7]._object1.setFrame(scene->_arrunkObj1337[2]._arr2[7]._field34);
- scene->_arrunkObj1337[2]._arr2[7]._object1.fixPriority(170);
- scene->setAnimationInfo(&scene->_arrunkObj1337[2]._arr2[7]);
+ scene->_gameBoardSide[2]._outpostStation[1]._cardId = 2;
+ scene->_gameBoardSide[2]._outpostStation[1]._card.postInit();
+ scene->_gameBoardSide[2]._outpostStation[1]._card.setVisage(1332);
+ scene->_gameBoardSide[2]._outpostStation[1]._card.setPosition(scene->_gameBoardSide[2]._outpostStation[1]._stationPos, 0);
+ scene->_gameBoardSide[2]._outpostStation[1]._card.setStrip(2);
+ scene->_gameBoardSide[2]._outpostStation[1]._card.setFrame(scene->_gameBoardSide[2]._outpostStation[1]._cardId);
+ scene->_gameBoardSide[2]._outpostStation[1]._card.fixPriority(170);
+ scene->setAnimationInfo(&scene->_gameBoardSide[2]._outpostStation[1]);
+
+ scene->_gameBoardSide[2]._outpostStation[2]._cardId = 3;
+ scene->_gameBoardSide[2]._outpostStation[2]._card.postInit();
+ scene->_gameBoardSide[2]._outpostStation[2]._card.setVisage(1332);
+ scene->_gameBoardSide[2]._outpostStation[2]._card.setPosition(scene->_gameBoardSide[2]._outpostStation[2]._stationPos, 0);
+ scene->_gameBoardSide[2]._outpostStation[2]._card.setStrip(2);
+ scene->_gameBoardSide[2]._outpostStation[2]._card.setFrame(scene->_gameBoardSide[2]._outpostStation[2]._cardId);
+ scene->_gameBoardSide[2]._outpostStation[2]._card.fixPriority(170);
+ scene->setAnimationInfo(&scene->_gameBoardSide[2]._outpostStation[2]);
+
+ scene->_gameBoardSide[2]._outpostStation[3]._cardId = 5;
+ scene->_gameBoardSide[2]._outpostStation[3]._card.postInit();
+ scene->_gameBoardSide[2]._outpostStation[3]._card.setVisage(1332);
+ scene->_gameBoardSide[2]._outpostStation[3]._card.setPosition(scene->_gameBoardSide[2]._outpostStation[3]._stationPos, 0);
+ scene->_gameBoardSide[2]._outpostStation[3]._card.setStrip(2);
+ scene->_gameBoardSide[2]._outpostStation[3]._card.setFrame(scene->_gameBoardSide[2]._outpostStation[3]._cardId);
+ scene->_gameBoardSide[2]._outpostStation[3]._card.fixPriority(170);
+ scene->setAnimationInfo(&scene->_gameBoardSide[2]._outpostStation[3]);
+
+ scene->_gameBoardSide[2]._outpostStation[4]._cardId = 6;
+ scene->_gameBoardSide[2]._outpostStation[4]._card.postInit();
+ scene->_gameBoardSide[2]._outpostStation[4]._card.setVisage(1332);
+ scene->_gameBoardSide[2]._outpostStation[4]._card.setPosition(scene->_gameBoardSide[2]._outpostStation[4]._stationPos, 0);
+ scene->_gameBoardSide[2]._outpostStation[4]._card.setStrip(2);
+ scene->_gameBoardSide[2]._outpostStation[4]._card.setFrame(scene->_gameBoardSide[2]._outpostStation[4]._cardId);
+ scene->_gameBoardSide[2]._outpostStation[4]._card.fixPriority(170);
+ scene->setAnimationInfo(&scene->_gameBoardSide[2]._outpostStation[4]);
+
+ scene->_gameBoardSide[2]._outpostStation[5]._cardId = 7;
+ scene->_gameBoardSide[2]._outpostStation[5]._card.postInit();
+ scene->_gameBoardSide[2]._outpostStation[5]._card.setVisage(1332);
+ scene->_gameBoardSide[2]._outpostStation[5]._card.setPosition(scene->_gameBoardSide[2]._outpostStation[5]._stationPos, 0);
+ scene->_gameBoardSide[2]._outpostStation[5]._card.setStrip(2);
+ scene->_gameBoardSide[2]._outpostStation[5]._card.setFrame(scene->_gameBoardSide[2]._outpostStation[5]._cardId);
+ scene->_gameBoardSide[2]._outpostStation[5]._card.fixPriority(170);
+ scene->setAnimationInfo(&scene->_gameBoardSide[2]._outpostStation[5]);
+
+ scene->_gameBoardSide[2]._outpostStation[6]._cardId = 8;
+ scene->_gameBoardSide[2]._outpostStation[6]._card.postInit();
+ scene->_gameBoardSide[2]._outpostStation[6]._card.setVisage(1332);
+ scene->_gameBoardSide[2]._outpostStation[6]._card.setPosition(scene->_gameBoardSide[2]._outpostStation[6]._stationPos, 0);
+ scene->_gameBoardSide[2]._outpostStation[6]._card.setStrip(2);
+ scene->_gameBoardSide[2]._outpostStation[6]._card.setFrame(scene->_gameBoardSide[2]._outpostStation[6]._cardId);
+ scene->_gameBoardSide[2]._outpostStation[6]._card.fixPriority(170);
+ scene->setAnimationInfo(&scene->_gameBoardSide[2]._outpostStation[6]);
+
+ scene->_gameBoardSide[2]._outpostStation[7]._cardId = 9;
+ scene->_gameBoardSide[2]._outpostStation[7]._card.postInit();
+ scene->_gameBoardSide[2]._outpostStation[7]._card.setVisage(1332);
+ scene->_gameBoardSide[2]._outpostStation[7]._card.setPosition(scene->_gameBoardSide[2]._outpostStation[7]._stationPos, 0);
+ scene->_gameBoardSide[2]._outpostStation[7]._card.setStrip(2);
+ scene->_gameBoardSide[2]._outpostStation[7]._card.setFrame(scene->_gameBoardSide[2]._outpostStation[7]._cardId);
+ scene->_gameBoardSide[2]._outpostStation[7]._card.fixPriority(170);
+ scene->setAnimationInfo(&scene->_gameBoardSide[2]._outpostStation[7]);
scene->_aSound1.play(62);
R2_GLOBALS._sceneObjects->draw();
- skipFrames(120);
- scene->_arrunkObj1337[2]._arr2[0]._object1.remove();
- scene->_arrunkObj1337[2]._arr2[1]._object1.remove();
- scene->_arrunkObj1337[2]._arr2[2]._object1.remove();
- scene->_arrunkObj1337[2]._arr2[3]._object1.remove();
- scene->_arrunkObj1337[2]._arr2[4]._object1.remove();
- scene->_arrunkObj1337[2]._arr2[5]._object1.remove();
- scene->_arrunkObj1337[2]._arr2[6]._object1.remove();
- scene->_arrunkObj1337[2]._arr2[7]._object1.remove();
-
- scene->_arrunkObj1337[1]._arr2[0]._object1.remove();
- scene->_arrunkObj1337[1]._arr2[1]._object1.remove();
-
- scene->_arrunkObj1337[3]._arr2[0]._object1.remove();
- scene->_arrunkObj1337[3]._arr2[1]._object1.remove();
- scene->_arrunkObj1337[3]._arr2[2]._object1.remove();
-
- scene->_arrunkObj1337[0]._arr2[0]._object1.remove();
- scene->_arrunkObj1337[0]._arr2[1]._object1.remove();
-
- scene->_background2.setup2(1332, 5, 1, 165, 95, 110, 1);
-
- scene->_arrunkObj1337[1]._arr1[0]._object1.postInit();
- scene->_arrunkObj1337[1]._arr1[0]._object1.setVisage(1332);
- scene->_arrunkObj1337[1]._arr1[0]._object1.setPosition(scene->_arrunkObj1337[1]._arr1[0]._field36, 0);
- scene->_arrunkObj1337[1]._arr1[0]._object1.setStrip(1);
- scene->_arrunkObj1337[1]._arr1[0]._object1.setFrame(4);
- scene->_arrunkObj1337[1]._arr1[0]._object1.fixPriority(170);
-
- scene->_arrunkObj1337[1]._arr1[1]._object1.postInit();
- scene->_arrunkObj1337[1]._arr1[1]._object1.setVisage(1332);
- scene->_arrunkObj1337[1]._arr1[1]._object1.setPosition(scene->_arrunkObj1337[1]._arr1[1]._field36, 0);
- scene->_arrunkObj1337[1]._arr1[1]._object1.setStrip(1);
- scene->_arrunkObj1337[1]._arr1[1]._object1.setFrame(4);
- scene->_arrunkObj1337[1]._arr1[1]._object1.fixPriority(170);
-
- scene->_arrunkObj1337[1]._arr1[2]._object1.postInit();
- scene->_arrunkObj1337[1]._arr1[2]._object1.setVisage(1332);
- scene->_arrunkObj1337[1]._arr1[2]._object1.setPosition(scene->_arrunkObj1337[1]._arr1[2]._field36, 0);
- scene->_arrunkObj1337[1]._arr1[2]._object1.setStrip(1);
- scene->_arrunkObj1337[1]._arr1[2]._object1.setFrame(4);
- scene->_arrunkObj1337[1]._arr1[2]._object1.fixPriority(170);
-
- scene->_arrunkObj1337[2]._arr1[0]._field34 = 30;
- scene->_arrunkObj1337[2]._arr1[0]._object1.postInit();
- scene->_arrunkObj1337[2]._arr1[0]._object1.setVisage(1332);
- scene->_arrunkObj1337[2]._arr1[0]._object1.setPosition(scene->_arrunkObj1337[2]._arr1[0]._field36, 0);
- scene->_arrunkObj1337[2]._arr1[0]._object1.setStrip(1);
- scene->_arrunkObj1337[2]._arr1[0]._object1.setFrame(2);
- scene->_arrunkObj1337[2]._arr1[0]._object1.fixPriority(170);
- scene->setAnimationInfo(&scene->_arrunkObj1337[2]._arr1[0]);
-
- scene->_arrunkObj1337[2]._arr1[1]._field34 = 16;
- scene->_arrunkObj1337[2]._arr1[1]._object1.postInit();
- scene->_arrunkObj1337[2]._arr1[1]._object1.setVisage(1332);
- scene->_arrunkObj1337[2]._arr1[1]._object1.setPosition(scene->_arrunkObj1337[2]._arr1[1]._field36, 0);
- scene->_arrunkObj1337[2]._arr1[1]._object1.setStrip(1);
- scene->_arrunkObj1337[2]._arr1[1]._object1.setFrame(2);
- scene->_arrunkObj1337[2]._arr1[1]._object1.fixPriority(170);
- scene->setAnimationInfo(&scene->_arrunkObj1337[2]._arr1[1]);
-
- scene->_arrunkObj1337[2]._arr1[2]._field34 = 1;
- scene->_arrunkObj1337[2]._arr1[2]._object1.postInit();
- scene->_arrunkObj1337[2]._arr1[2]._object1.setVisage(1332);
- scene->_arrunkObj1337[2]._arr1[2]._object1.setPosition(scene->_arrunkObj1337[2]._arr1[2]._field36, 0);
- scene->_arrunkObj1337[2]._arr1[2]._object1.setStrip(1);
- scene->_arrunkObj1337[2]._arr1[2]._object1.setFrame(2);
- scene->_arrunkObj1337[2]._arr1[2]._object1.fixPriority(170);
- scene->setAnimationInfo(&scene->_arrunkObj1337[2]._arr1[2]);
-
- scene->_arrunkObj1337[3]._arr1[0]._object1.postInit();
- scene->_arrunkObj1337[3]._arr1[0]._object1.setVisage(1332);
- scene->_arrunkObj1337[3]._arr1[0]._object1.setPosition(scene->_arrunkObj1337[3]._arr1[0]._field36, 0);
- scene->_arrunkObj1337[3]._arr1[0]._object1.setStrip(1);
- scene->_arrunkObj1337[3]._arr1[0]._object1.setFrame(3);
- scene->_arrunkObj1337[3]._arr1[0]._object1.fixPriority(170);
-
- scene->_arrunkObj1337[3]._arr1[1]._object1.postInit();
- scene->_arrunkObj1337[3]._arr1[1]._object1.setVisage(1332);
- scene->_arrunkObj1337[3]._arr1[1]._object1.setPosition(scene->_arrunkObj1337[3]._arr1[1]._field36, 0);
- scene->_arrunkObj1337[3]._arr1[1]._object1.setStrip(1);
- scene->_arrunkObj1337[3]._arr1[1]._object1.setFrame(3);
- scene->_arrunkObj1337[3]._arr1[1]._object1.fixPriority(170);
-
- scene->_arrunkObj1337[3]._arr1[2]._object1.postInit();
- scene->_arrunkObj1337[3]._arr1[2]._object1.setVisage(1332);
- scene->_arrunkObj1337[3]._arr1[2]._object1.setPosition(scene->_arrunkObj1337[3]._arr1[2]._field36, 0);
- scene->_arrunkObj1337[3]._arr1[2]._object1.setStrip(1);
- scene->_arrunkObj1337[3]._arr1[2]._object1.setFrame(3);
- scene->_arrunkObj1337[3]._arr1[2]._object1.fixPriority(170);
-
- scene->_arrunkObj1337[0]._arr1[0]._object1.postInit();
- scene->_arrunkObj1337[0]._arr1[0]._object1.setVisage(1332);
- scene->_arrunkObj1337[0]._arr1[0]._object1.setPosition(scene->_arrunkObj1337[0]._arr1[0]._field36, 0);
- scene->_arrunkObj1337[0]._arr1[0]._object1.setStrip(1);
- scene->_arrunkObj1337[0]._arr1[0]._object1.setFrame(2);
- scene->_arrunkObj1337[0]._arr1[0]._object1.fixPriority(170);
-
- scene->_arrunkObj1337[0]._arr1[1]._object1.postInit();
- scene->_arrunkObj1337[0]._arr1[1]._object1.setVisage(1332);
- scene->_arrunkObj1337[0]._arr1[1]._object1.setPosition(scene->_arrunkObj1337[0]._arr1[1]._field36, 0);
- scene->_arrunkObj1337[0]._arr1[1]._object1.setStrip(1);
- scene->_arrunkObj1337[0]._arr1[1]._object1.setFrame(2);
- scene->_arrunkObj1337[0]._arr1[1]._object1.fixPriority(170);
-
- scene->_arrunkObj1337[0]._arr1[2]._object1.postInit();
- scene->_arrunkObj1337[0]._arr1[2]._object1.setVisage(1332);
- scene->_arrunkObj1337[0]._arr1[2]._object1.setPosition(scene->_arrunkObj1337[0]._arr1[2]._field36, 0);
- scene->_arrunkObj1337[0]._arr1[2]._object1.setStrip(1);
- scene->_arrunkObj1337[0]._arr1[2]._object1.setFrame(2);
- scene->_arrunkObj1337[0]._arr1[2]._object1.fixPriority(170);
+ waitFrames(120);
+ scene->_gameBoardSide[2]._outpostStation[0]._card.remove();
+ scene->_gameBoardSide[2]._outpostStation[1]._card.remove();
+ scene->_gameBoardSide[2]._outpostStation[2]._card.remove();
+ scene->_gameBoardSide[2]._outpostStation[3]._card.remove();
+ scene->_gameBoardSide[2]._outpostStation[4]._card.remove();
+ scene->_gameBoardSide[2]._outpostStation[5]._card.remove();
+ scene->_gameBoardSide[2]._outpostStation[6]._card.remove();
+ scene->_gameBoardSide[2]._outpostStation[7]._card.remove();
+
+ scene->_gameBoardSide[1]._outpostStation[0]._card.remove();
+ scene->_gameBoardSide[1]._outpostStation[1]._card.remove();
+
+ scene->_gameBoardSide[3]._outpostStation[0]._card.remove();
+ scene->_gameBoardSide[3]._outpostStation[1]._card.remove();
+ scene->_gameBoardSide[3]._outpostStation[2]._card.remove();
+
+ scene->_gameBoardSide[0]._outpostStation[0]._card.remove();
+ scene->_gameBoardSide[0]._outpostStation[1]._card.remove();
+
+ scene->_stockPile.setup(1332, 5, 1);
+ scene->_stockPile.setPosition(Common::Point(165, 95));
+ scene->_stockPile.setPriority(110);
+ scene->_stockPile._effect = EFFECT_SHADED;
+ scene->_stockPile.show();
+
+ scene->_gameBoardSide[1]._handCard[0]._card.postInit();
+ scene->_gameBoardSide[1]._handCard[0]._card.setVisage(1332);
+ scene->_gameBoardSide[1]._handCard[0]._card.setPosition(scene->_gameBoardSide[1]._handCard[0]._stationPos, 0);
+ scene->_gameBoardSide[1]._handCard[0]._card.setStrip(1);
+ scene->_gameBoardSide[1]._handCard[0]._card.setFrame(4);
+ scene->_gameBoardSide[1]._handCard[0]._card.fixPriority(170);
+
+ scene->_gameBoardSide[1]._handCard[1]._card.postInit();
+ scene->_gameBoardSide[1]._handCard[1]._card.setVisage(1332);
+ scene->_gameBoardSide[1]._handCard[1]._card.setPosition(scene->_gameBoardSide[1]._handCard[1]._stationPos, 0);
+ scene->_gameBoardSide[1]._handCard[1]._card.setStrip(1);
+ scene->_gameBoardSide[1]._handCard[1]._card.setFrame(4);
+ scene->_gameBoardSide[1]._handCard[1]._card.fixPriority(170);
+
+ scene->_gameBoardSide[1]._handCard[2]._card.postInit();
+ scene->_gameBoardSide[1]._handCard[2]._card.setVisage(1332);
+ scene->_gameBoardSide[1]._handCard[2]._card.setPosition(scene->_gameBoardSide[1]._handCard[2]._stationPos, 0);
+ scene->_gameBoardSide[1]._handCard[2]._card.setStrip(1);
+ scene->_gameBoardSide[1]._handCard[2]._card.setFrame(4);
+ scene->_gameBoardSide[1]._handCard[2]._card.fixPriority(170);
+
+ scene->_gameBoardSide[2]._handCard[0]._cardId = 30;
+ scene->_gameBoardSide[2]._handCard[0]._card.postInit();
+ scene->_gameBoardSide[2]._handCard[0]._card.setVisage(1332);
+ scene->_gameBoardSide[2]._handCard[0]._card.setPosition(scene->_gameBoardSide[2]._handCard[0]._stationPos, 0);
+ scene->_gameBoardSide[2]._handCard[0]._card.setStrip(1);
+ scene->_gameBoardSide[2]._handCard[0]._card.setFrame(2);
+ scene->_gameBoardSide[2]._handCard[0]._card.fixPriority(170);
+ scene->setAnimationInfo(&scene->_gameBoardSide[2]._handCard[0]);
+
+ scene->_gameBoardSide[2]._handCard[1]._cardId = 16;
+ scene->_gameBoardSide[2]._handCard[1]._card.postInit();
+ scene->_gameBoardSide[2]._handCard[1]._card.setVisage(1332);
+ scene->_gameBoardSide[2]._handCard[1]._card.setPosition(scene->_gameBoardSide[2]._handCard[1]._stationPos, 0);
+ scene->_gameBoardSide[2]._handCard[1]._card.setStrip(1);
+ scene->_gameBoardSide[2]._handCard[1]._card.setFrame(2);
+ scene->_gameBoardSide[2]._handCard[1]._card.fixPriority(170);
+ scene->setAnimationInfo(&scene->_gameBoardSide[2]._handCard[1]);
+
+ scene->_gameBoardSide[2]._handCard[2]._cardId = 1;
+ scene->_gameBoardSide[2]._handCard[2]._card.postInit();
+ scene->_gameBoardSide[2]._handCard[2]._card.setVisage(1332);
+ scene->_gameBoardSide[2]._handCard[2]._card.setPosition(scene->_gameBoardSide[2]._handCard[2]._stationPos, 0);
+ scene->_gameBoardSide[2]._handCard[2]._card.setStrip(1);
+ scene->_gameBoardSide[2]._handCard[2]._card.setFrame(2);
+ scene->_gameBoardSide[2]._handCard[2]._card.fixPriority(170);
+ scene->setAnimationInfo(&scene->_gameBoardSide[2]._handCard[2]);
+
+ scene->_gameBoardSide[3]._handCard[0]._card.postInit();
+ scene->_gameBoardSide[3]._handCard[0]._card.setVisage(1332);
+ scene->_gameBoardSide[3]._handCard[0]._card.setPosition(scene->_gameBoardSide[3]._handCard[0]._stationPos, 0);
+ scene->_gameBoardSide[3]._handCard[0]._card.setStrip(1);
+ scene->_gameBoardSide[3]._handCard[0]._card.setFrame(3);
+ scene->_gameBoardSide[3]._handCard[0]._card.fixPriority(170);
+
+ scene->_gameBoardSide[3]._handCard[1]._card.postInit();
+ scene->_gameBoardSide[3]._handCard[1]._card.setVisage(1332);
+ scene->_gameBoardSide[3]._handCard[1]._card.setPosition(scene->_gameBoardSide[3]._handCard[1]._stationPos, 0);
+ scene->_gameBoardSide[3]._handCard[1]._card.setStrip(1);
+ scene->_gameBoardSide[3]._handCard[1]._card.setFrame(3);
+ scene->_gameBoardSide[3]._handCard[1]._card.fixPriority(170);
+
+ scene->_gameBoardSide[3]._handCard[2]._card.postInit();
+ scene->_gameBoardSide[3]._handCard[2]._card.setVisage(1332);
+ scene->_gameBoardSide[3]._handCard[2]._card.setPosition(scene->_gameBoardSide[3]._handCard[2]._stationPos, 0);
+ scene->_gameBoardSide[3]._handCard[2]._card.setStrip(1);
+ scene->_gameBoardSide[3]._handCard[2]._card.setFrame(3);
+ scene->_gameBoardSide[3]._handCard[2]._card.fixPriority(170);
+
+ scene->_gameBoardSide[0]._handCard[0]._card.postInit();
+ scene->_gameBoardSide[0]._handCard[0]._card.setVisage(1332);
+ scene->_gameBoardSide[0]._handCard[0]._card.setPosition(scene->_gameBoardSide[0]._handCard[0]._stationPos, 0);
+ scene->_gameBoardSide[0]._handCard[0]._card.setStrip(1);
+ scene->_gameBoardSide[0]._handCard[0]._card.setFrame(2);
+ scene->_gameBoardSide[0]._handCard[0]._card.fixPriority(170);
+
+ scene->_gameBoardSide[0]._handCard[1]._card.postInit();
+ scene->_gameBoardSide[0]._handCard[1]._card.setVisage(1332);
+ scene->_gameBoardSide[0]._handCard[1]._card.setPosition(scene->_gameBoardSide[0]._handCard[1]._stationPos, 0);
+ scene->_gameBoardSide[0]._handCard[1]._card.setStrip(1);
+ scene->_gameBoardSide[0]._handCard[1]._card.setFrame(2);
+ scene->_gameBoardSide[0]._handCard[1]._card.fixPriority(170);
+
+ scene->_gameBoardSide[0]._handCard[2]._card.postInit();
+ scene->_gameBoardSide[0]._handCard[2]._card.setVisage(1332);
+ scene->_gameBoardSide[0]._handCard[2]._card.setPosition(scene->_gameBoardSide[0]._handCard[2]._stationPos, 0);
+ scene->_gameBoardSide[0]._handCard[2]._card.setStrip(1);
+ scene->_gameBoardSide[0]._handCard[2]._card.setFrame(2);
+ scene->_gameBoardSide[0]._handCard[2]._card.fixPriority(170);
R2_GLOBALS._sceneObjects->draw();
scene->actionDisplay(1331, 10, 159, 10, 1, 200, 0, 7, 0, 154, 154);
- scene->_item2._object1.setPosition(Common::Point(162, 95), 0);
- scene->_item2._object1.show();
+ scene->_animatedCard._card.setPosition(Common::Point(162, 95), 0);
+ scene->_animatedCard._card.show();
scene->_aSound2.play(61);
Common::Point pt(91, 174);
NpcMover *mover = new NpcMover();
- scene->_item2._object1.addMover(mover, &pt, this);
+ scene->_animatedCard._card.addMover(mover, &pt, this);
}
break;
case 2: {
- scene->_arrunkObj1337[2]._arr1[3]._field34 = 2;
- scene->_arrunkObj1337[2]._arr1[3]._object1.postInit();
- scene->_arrunkObj1337[2]._arr1[3]._object1.setVisage(1332);
- scene->_arrunkObj1337[2]._arr1[3]._object1.setPosition(scene->_arrunkObj1337[2]._arr1[3]._field36, 0);
- scene->_arrunkObj1337[2]._arr1[3]._object1.setStrip(1);
- scene->_arrunkObj1337[2]._arr1[3]._object1.setFrame(2);
- scene->_arrunkObj1337[2]._arr1[3]._object1.fixPriority(170);
+ scene->_gameBoardSide[2]._handCard[3]._cardId = 2;
+ scene->_gameBoardSide[2]._handCard[3]._card.postInit();
+ scene->_gameBoardSide[2]._handCard[3]._card.setVisage(1332);
+ scene->_gameBoardSide[2]._handCard[3]._card.setPosition(scene->_gameBoardSide[2]._handCard[3]._stationPos, 0);
+ scene->_gameBoardSide[2]._handCard[3]._card.setStrip(1);
+ scene->_gameBoardSide[2]._handCard[3]._card.setFrame(2);
+ scene->_gameBoardSide[2]._handCard[3]._card.fixPriority(170);
- scene->_item2._object1.hide();
- scene->setAnimationInfo(&scene->_arrunkObj1337[2]._arr1[3]);
+ scene->_animatedCard._card.hide();
+ scene->setAnimationInfo(&scene->_gameBoardSide[2]._handCard[3]);
R2_GLOBALS._sceneObjects->draw();
- skipFrames(60);
+ waitFrames(60);
scene->actionDisplay(1331, 11, 159, 10, 1, 200, 0, 7, 0, 154, 154);
scene->actionDisplay(1331, 12, 159, 10, 1, 200, 0, 7, 0, 154, 154);
- scene->_arrunkObj1337[2]._arr2[1]._field34 = 1;
- scene->_arrunkObj1337[2]._arr2[1]._object1.postInit();
- scene->_arrunkObj1337[2]._arr2[1]._object1.setVisage(1332);
- scene->_arrunkObj1337[2]._arr2[1]._object1.setPosition(scene->_arrunkObj1337[2]._arr2[1]._field36, 0);
- scene->_arrunkObj1337[2]._arr2[1]._object1.hide();
+ scene->_gameBoardSide[2]._outpostStation[1]._cardId = 1;
+ scene->_gameBoardSide[2]._outpostStation[1]._card.postInit();
+ scene->_gameBoardSide[2]._outpostStation[1]._card.setVisage(1332);
+ scene->_gameBoardSide[2]._outpostStation[1]._card.setPosition(scene->_gameBoardSide[2]._outpostStation[1]._stationPos, 0);
+ scene->_gameBoardSide[2]._outpostStation[1]._card.hide();
- scene->_item2._object1.setStrip(scene->_arrunkObj1337[2]._arr1[2]._object1._strip);
- scene->_item2._object1.setFrame(scene->_arrunkObj1337[2]._arr1[2]._object1._frame);
- scene->_item2._object1.animate(ANIM_MODE_NONE, NULL);
+ scene->_animatedCard._card.setStrip(scene->_gameBoardSide[2]._handCard[2]._card._strip);
+ scene->_animatedCard._card.setFrame(scene->_gameBoardSide[2]._handCard[2]._card._frame);
+ scene->_animatedCard._card.animate(ANIM_MODE_NONE, NULL);
- scene->_arrunkObj1337[2]._arr1[2]._field34 = 0;
- scene->_arrunkObj1337[2]._arr1[2]._object1.remove();
+ scene->_gameBoardSide[2]._handCard[2]._cardId = 0;
+ scene->_gameBoardSide[2]._handCard[2]._card.remove();
- scene->_item2._object1.setPosition(scene->_arrunkObj1337[2]._arr1[2]._field36, 0);
- scene->_item2._object1.show();
+ scene->_animatedCard._card.setPosition(scene->_gameBoardSide[2]._handCard[2]._stationPos, 0);
+ scene->_animatedCard._card.show();
NpcMover *mover = new NpcMover();
- scene->_item2._object1.addMover(mover, &scene->_arrunkObj1337[2]._arr2[1]._field36, this);
+ scene->_animatedCard._card.addMover(mover, &scene->_gameBoardSide[2]._outpostStation[1]._stationPos, this);
}
break;
case 3: {
- scene->_item2._object1.hide();
- scene->setAnimationInfo(&scene->_arrunkObj1337[2]._arr2[1]);
+ scene->_animatedCard._card.hide();
+ scene->setAnimationInfo(&scene->_gameBoardSide[2]._outpostStation[1]);
scene->_aSound1.play(59);
R2_GLOBALS._sceneObjects->draw();
- skipFrames(60);
+ waitFrames(60);
scene->actionDisplay(1331, 13, 159, 10, 1, 200, 0, 7, 0, 154, 154);
- scene->_arrunkObj1337[2]._arr2[1]._field34 = scene->_arrunkObj1337[2]._arr1[3]._field34;
+ scene->_gameBoardSide[2]._outpostStation[1]._cardId = scene->_gameBoardSide[2]._handCard[3]._cardId;
- scene->_item2._object1.setStrip(scene->_arrunkObj1337[2]._arr1[3]._object1._strip);
- scene->_item2._object1.setFrame(scene->_arrunkObj1337[2]._arr1[3]._object1._frame);
+ scene->_animatedCard._card.setStrip(scene->_gameBoardSide[2]._handCard[3]._card._strip);
+ scene->_animatedCard._card.setFrame(scene->_gameBoardSide[2]._handCard[3]._card._frame);
- scene->_arrunkObj1337[2]._arr1[3]._field34 = 0;
- scene->_arrunkObj1337[2]._arr1[3]._object1.remove();
+ scene->_gameBoardSide[2]._handCard[3]._cardId = 0;
+ scene->_gameBoardSide[2]._handCard[3]._card.remove();
- scene->_item2._object1.setPosition(scene->_arrunkObj1337[2]._arr1[3]._field36, 0);
- scene->_item2._object1.show();
+ scene->_animatedCard._card.setPosition(scene->_gameBoardSide[2]._handCard[3]._stationPos, 0);
+ scene->_animatedCard._card.show();
NpcMover *mover = new NpcMover();
- scene->_item2._object1.addMover(mover, &scene->_arrunkObj1337[2]._arr2[1]._field36, this);
+ scene->_animatedCard._card.addMover(mover, &scene->_gameBoardSide[2]._outpostStation[1]._stationPos, this);
}
break;
case 4: {
- scene->_item2._object1.hide();
- scene->setAnimationInfo(&scene->_arrunkObj1337[2]._arr2[1]);
+ scene->_animatedCard._card.hide();
+ scene->setAnimationInfo(&scene->_gameBoardSide[2]._outpostStation[1]);
scene->_aSound1.play(59);
- scene->_item7._field34 = 1;
- scene->_item7._object1.hide();
+ scene->_discardPile._cardId = 1;
+ scene->_discardPile._card.hide();
- scene->_item2._object1.setStrip(5);
- scene->_item2._object1.setFrame(1);
- scene->_item2._object1.animate(ANIM_MODE_2, NULL);
- scene->_item2._object1.setPosition(scene->_arrunkObj1337[2]._arr2[1]._field36, 0);
- scene->_item2._object1.show();
+ scene->_animatedCard._card.setStrip(5);
+ scene->_animatedCard._card.setFrame(1);
+ scene->_animatedCard._card.animate(ANIM_MODE_2, NULL);
+ scene->_animatedCard._card.setPosition(scene->_gameBoardSide[2]._outpostStation[1]._stationPos, 0);
+ scene->_animatedCard._card.show();
NpcMover *mover = new NpcMover();
- scene->_item2._object1.addMover(mover, &scene->_item7._field36, this);
+ scene->_animatedCard._card.addMover(mover, &scene->_discardPile._stationPos, this);
}
break;
case 5: {
- scene->_item2._object1.hide();
+ scene->_animatedCard._card.hide();
- scene->_item7._object1.postInit();
- scene->_item7._object1.setVisage(1332);
- scene->_item7._object1.setPosition(scene->_item7._field36, 0);
- scene->setAnimationInfo(&scene->_item7);
+ scene->_discardPile._card.postInit();
+ scene->_discardPile._card.setVisage(1332);
+ scene->_discardPile._card.setPosition(scene->_discardPile._stationPos, 0);
+ scene->setAnimationInfo(&scene->_discardPile);
scene->_aSound2.play(61);
R2_GLOBALS._sceneObjects->draw();
- skipFrames(60);
+ waitFrames(60);
scene->actionDisplay(1331, 14, 159, 10, 1, 200, 0, 7, 0, 154, 154);
- scene->_arrunkObj1337[2]._arr3[0]._object1.postInit();
- scene->_arrunkObj1337[2]._arr3[0]._object1.setVisage(1332);
- scene->_arrunkObj1337[2]._arr3[0]._object1.setPosition(scene->_arrunkObj1337[2]._arr3[0]._field36, 0);
- scene->_arrunkObj1337[2]._arr3[0]._object1.hide();
+ scene->_gameBoardSide[2]._delayCard._card.postInit();
+ scene->_gameBoardSide[2]._delayCard._card.setVisage(1332);
+ scene->_gameBoardSide[2]._delayCard._card.setPosition(scene->_gameBoardSide[2]._delayCard._stationPos, 0);
+ scene->_gameBoardSide[2]._delayCard._card.hide();
- scene->_arrunkObj1337[3]._arr1[2]._field34 = 0;
- scene->_arrunkObj1337[3]._arr1[2].remove();
+ scene->_gameBoardSide[3]._handCard[2]._cardId = 0;
+ scene->_gameBoardSide[3]._handCard[2].remove();
- scene->_item2._object1.setPosition(scene->_arrunkObj1337[3]._arr1[2]._field36, 0);
- scene->_item2._object1.show();
+ scene->_animatedCard._card.setPosition(scene->_gameBoardSide[3]._handCard[2]._stationPos, 0);
+ scene->_animatedCard._card.show();
NpcMover *mover = new NpcMover();
- scene->_item2._object1.addMover(mover, &scene->_arrunkObj1337[2]._arr3[0]._field36, this);
+ scene->_animatedCard._card.addMover(mover, &scene->_gameBoardSide[2]._delayCard._stationPos, this);
}
break;
case 6: {
- scene->_item2._object1.hide();
- scene->_arrunkObj1337[2]._arr3[0]._field34 = 21;
- scene->setAnimationInfo(&scene->_arrunkObj1337[2]._arr3[0]);
+ scene->_animatedCard._card.hide();
+ scene->_gameBoardSide[2]._delayCard._cardId = 21;
+ scene->setAnimationInfo(&scene->_gameBoardSide[2]._delayCard);
scene->_aSound1.play(57);
R2_GLOBALS._sceneObjects->draw();
- skipFrames(60);
+ waitFrames(60);
scene->actionDisplay(1331, 15, 159, 10, 1, 200, 0, 7, 0, 154, 154);
int tmpVal = 15;
@@ -2667,89 +2692,89 @@ void Scene1337::Action1::signal() {
for (i = 0; i <= 7; i++) {
tmpVal += 29;
- scene->_arrObject1[i].postInit();
- scene->_arrObject1[i].setVisage(1332);
- scene->_arrObject1[i].setPosition(Common::Point(tmpVal, 90), 0);
- scene->_arrObject1[i].setStrip(3);
- scene->_arrObject1[i].fixPriority(190);
-
- scene->_arrObject2[i].postInit();
- scene->_arrObject2[i].setVisage(1332);
- scene->_arrObject2[i].setPosition(Common::Point(tmpVal, 90), 0);
- scene->_arrObject2[i].setStrip(7);
- scene->_arrObject2[i].setFrame(1);
- scene->_arrObject2[i].fixPriority(180);
- }
-
- scene->_arrObject1[0].setFrame(1);
- scene->_arrObject1[1].setFrame(3);
- scene->_arrObject1[2].setFrame(6);
- scene->_arrObject1[3].setFrame(8);
- scene->_arrObject1[4].setFrame(9);
- scene->_arrObject1[5].setFrame(10);
- scene->_arrObject1[6].setFrame(11);
- scene->_arrObject1[7].setFrame(12);
+ scene->_upperDisplayCard[i].postInit();
+ scene->_upperDisplayCard[i].setVisage(1332);
+ scene->_upperDisplayCard[i].setPosition(Common::Point(tmpVal, 90), 0);
+ scene->_upperDisplayCard[i].setStrip(3);
+ scene->_upperDisplayCard[i].fixPriority(190);
+
+ scene->_lowerDisplayCard[i].postInit();
+ scene->_lowerDisplayCard[i].setVisage(1332);
+ scene->_lowerDisplayCard[i].setPosition(Common::Point(tmpVal, 90), 0);
+ scene->_lowerDisplayCard[i].setStrip(7);
+ scene->_lowerDisplayCard[i].setFrame(1);
+ scene->_lowerDisplayCard[i].fixPriority(180);
+ }
+
+ scene->_upperDisplayCard[0].setFrame(1);
+ scene->_upperDisplayCard[1].setFrame(3);
+ scene->_upperDisplayCard[2].setFrame(6);
+ scene->_upperDisplayCard[3].setFrame(8);
+ scene->_upperDisplayCard[4].setFrame(9);
+ scene->_upperDisplayCard[5].setFrame(10);
+ scene->_upperDisplayCard[6].setFrame(11);
+ scene->_upperDisplayCard[7].setFrame(12);
R2_GLOBALS._sceneObjects->draw();
- skipFrames(240);
+ waitFrames(240);
- scene->_arrObject1[0].remove();
- scene->_arrObject1[1].remove();
- scene->_arrObject1[2].remove();
- scene->_arrObject1[3].remove();
- scene->_arrObject1[4].remove();
- scene->_arrObject1[5].remove();
- scene->_arrObject1[6].remove();
- scene->_arrObject1[7].remove();
+ scene->_upperDisplayCard[0].remove();
+ scene->_upperDisplayCard[1].remove();
+ scene->_upperDisplayCard[2].remove();
+ scene->_upperDisplayCard[3].remove();
+ scene->_upperDisplayCard[4].remove();
+ scene->_upperDisplayCard[5].remove();
+ scene->_upperDisplayCard[6].remove();
+ scene->_upperDisplayCard[7].remove();
- scene->_arrObject2[0].remove();
- scene->_arrObject2[1].remove();
- scene->_arrObject2[2].remove();
- scene->_arrObject2[3].remove();
- scene->_arrObject2[4].remove();
- scene->_arrObject2[5].remove();
- scene->_arrObject2[6].remove();
- scene->_arrObject2[7].remove();
+ scene->_lowerDisplayCard[0].remove();
+ scene->_lowerDisplayCard[1].remove();
+ scene->_lowerDisplayCard[2].remove();
+ scene->_lowerDisplayCard[3].remove();
+ scene->_lowerDisplayCard[4].remove();
+ scene->_lowerDisplayCard[5].remove();
+ scene->_lowerDisplayCard[6].remove();
+ scene->_lowerDisplayCard[7].remove();
- scene->_item7._field34 = scene->_arrunkObj1337[2]._arr3[0]._field34;
+ scene->_discardPile._cardId = scene->_gameBoardSide[2]._delayCard._cardId;
- scene->_arrunkObj1337[2]._arr3[0]._field34 = 0;
- scene->_arrunkObj1337[2]._arr3[0]._object1.remove();
+ scene->_gameBoardSide[2]._delayCard._cardId = 0;
+ scene->_gameBoardSide[2]._delayCard._card.remove();
- scene->_item2._object1.setPosition(scene->_arrunkObj1337[2]._arr3[0]._field36, 0);
- scene->_item2._object1.show();
+ scene->_animatedCard._card.setPosition(scene->_gameBoardSide[2]._delayCard._stationPos, 0);
+ scene->_animatedCard._card.show();
NpcMover *mover = new NpcMover();
- scene->_item2._object1.addMover(mover, &scene->_item7._field36, this);
+ scene->_animatedCard._card.addMover(mover, &scene->_discardPile._stationPos, this);
}
break;
case 7: {
- scene->_item2._object1.hide();
- scene->setAnimationInfo(&scene->_item7);
+ scene->_animatedCard._card.hide();
+ scene->setAnimationInfo(&scene->_discardPile);
scene->_aSound2.play(61);
R2_GLOBALS._sceneObjects->draw();
- scene->_arrunkObj1337[2]._arr3[0]._object1.postInit();
- scene->_arrunkObj1337[2]._arr3[0]._object1.setVisage(1332);
- scene->_arrunkObj1337[2]._arr3[0]._object1.setPosition(scene->_arrunkObj1337[2]._arr3[0]._field36, 0);
- scene->_arrunkObj1337[2]._arr3[0]._object1.hide();
+ scene->_gameBoardSide[2]._delayCard._card.postInit();
+ scene->_gameBoardSide[2]._delayCard._card.setVisage(1332);
+ scene->_gameBoardSide[2]._delayCard._card.setPosition(scene->_gameBoardSide[2]._delayCard._stationPos, 0);
+ scene->_gameBoardSide[2]._delayCard._card.hide();
- scene->_arrunkObj1337[3]._arr1[1]._field34 = 0;
- scene->_arrunkObj1337[3]._arr1[1].remove();
+ scene->_gameBoardSide[3]._handCard[1]._cardId = 0;
+ scene->_gameBoardSide[3]._handCard[1].remove();
- scene->_item2._object1.setPosition(scene->_arrunkObj1337[3]._arr1[1]._field36, 0);
- scene->_item2._object1.show();
+ scene->_animatedCard._card.setPosition(scene->_gameBoardSide[3]._handCard[1]._stationPos, 0);
+ scene->_animatedCard._card.show();
NpcMover *mover = new NpcMover();
- scene->_item2._object1.addMover(mover, &scene->_arrunkObj1337[2]._arr3[0]._field36, this);
+ scene->_animatedCard._card.addMover(mover, &scene->_gameBoardSide[2]._delayCard._stationPos, this);
}
break;
case 8: {
- scene->_item2._object1.hide();
- scene->_arrunkObj1337[2]._arr3[0]._field34 = 14;
- scene->setAnimationInfo(&scene->_arrunkObj1337[2]._arr3[0]);
+ scene->_animatedCard._card.hide();
+ scene->_gameBoardSide[2]._delayCard._cardId = 14;
+ scene->setAnimationInfo(&scene->_gameBoardSide[2]._delayCard);
scene->_aSound1.play(57);
R2_GLOBALS._sceneObjects->draw();
@@ -2760,219 +2785,219 @@ void Scene1337::Action1::signal() {
for (i = 0; i <= 3; i++) {
tmpVal += 29;
- scene->_arrObject1[i].postInit();
- scene->_arrObject1[i].setVisage(1332);
- scene->_arrObject1[i].setPosition(Common::Point(tmpVal, 71), 0);
- scene->_arrObject1[i].setStrip(3);
- scene->_arrObject1[i].fixPriority(190);
+ scene->_upperDisplayCard[i].postInit();
+ scene->_upperDisplayCard[i].setVisage(1332);
+ scene->_upperDisplayCard[i].setPosition(Common::Point(tmpVal, 71), 0);
+ scene->_upperDisplayCard[i].setStrip(3);
+ scene->_upperDisplayCard[i].fixPriority(190);
- scene->_arrObject2[i].postInit();
- scene->_arrObject2[i].setVisage(1332);
- scene->_arrObject2[i].setPosition(Common::Point(tmpVal, 71), 0);
- scene->_arrObject2[i].setStrip(7);
- scene->_arrObject2[i].setFrame(1);
- scene->_arrObject2[i].fixPriority(180);
+ scene->_lowerDisplayCard[i].postInit();
+ scene->_lowerDisplayCard[i].setVisage(1332);
+ scene->_lowerDisplayCard[i].setPosition(Common::Point(tmpVal, 71), 0);
+ scene->_lowerDisplayCard[i].setStrip(7);
+ scene->_lowerDisplayCard[i].setFrame(1);
+ scene->_lowerDisplayCard[i].fixPriority(180);
}
- scene->_arrObject1[0].setFrame(2);
- scene->_arrObject1[1].setFrame(5);
- scene->_arrObject1[2].setFrame(7);
- scene->_arrObject1[3].setFrame(15);
+ scene->_upperDisplayCard[0].setFrame(2);
+ scene->_upperDisplayCard[1].setFrame(5);
+ scene->_upperDisplayCard[2].setFrame(7);
+ scene->_upperDisplayCard[3].setFrame(15);
R2_GLOBALS._sceneObjects->draw();
- skipFrames(240);
+ waitFrames(240);
scene->actionDisplay(1331, 17, 159, 10, 1, 200, 0, 7, 0, 154, 154);
tmpVal = 72;
for (i = 4; i <= 7; i++) {
tmpVal += 29;
- scene->_arrObject1[i].postInit();
- scene->_arrObject1[i].setVisage(1332);
- scene->_arrObject1[i].setPosition(Common::Point(tmpVal, 100), 0);
- scene->_arrObject1[i].setStrip(4);
- scene->_arrObject1[i].fixPriority(190);
+ scene->_upperDisplayCard[i].postInit();
+ scene->_upperDisplayCard[i].setVisage(1332);
+ scene->_upperDisplayCard[i].setPosition(Common::Point(tmpVal, 100), 0);
+ scene->_upperDisplayCard[i].setStrip(4);
+ scene->_upperDisplayCard[i].fixPriority(190);
- scene->_arrObject2[i].postInit();
- scene->_arrObject2[i].setVisage(1332);
- scene->_arrObject2[i].setPosition(Common::Point(tmpVal, 100), 0);
- scene->_arrObject2[i].setStrip(7);
- scene->_arrObject2[i].setFrame(1);
- scene->_arrObject2[i].fixPriority(180);
+ scene->_lowerDisplayCard[i].postInit();
+ scene->_lowerDisplayCard[i].setVisage(1332);
+ scene->_lowerDisplayCard[i].setPosition(Common::Point(tmpVal, 100), 0);
+ scene->_lowerDisplayCard[i].setStrip(7);
+ scene->_lowerDisplayCard[i].setFrame(1);
+ scene->_lowerDisplayCard[i].fixPriority(180);
}
- scene->_arrObject1[4].setFrame(1);
- scene->_arrObject1[5].setFrame(5);
- scene->_arrObject1[6].setFrame(7);
- scene->_arrObject1[7].setFrame(3);
+ scene->_upperDisplayCard[4].setFrame(1);
+ scene->_upperDisplayCard[5].setFrame(5);
+ scene->_upperDisplayCard[6].setFrame(7);
+ scene->_upperDisplayCard[7].setFrame(3);
R2_GLOBALS._sceneObjects->draw();
- skipFrames(240);
+ waitFrames(240);
- scene->_arrObject1[0].remove();
- scene->_arrObject1[1].remove();
- scene->_arrObject1[2].remove();
- scene->_arrObject1[3].remove();
- scene->_arrObject1[4].remove();
- scene->_arrObject1[5].remove();
- scene->_arrObject1[6].remove();
- scene->_arrObject1[7].remove();
+ scene->_upperDisplayCard[0].remove();
+ scene->_upperDisplayCard[1].remove();
+ scene->_upperDisplayCard[2].remove();
+ scene->_upperDisplayCard[3].remove();
+ scene->_upperDisplayCard[4].remove();
+ scene->_upperDisplayCard[5].remove();
+ scene->_upperDisplayCard[6].remove();
+ scene->_upperDisplayCard[7].remove();
- scene->_arrObject2[0].remove();
- scene->_arrObject2[1].remove();
- scene->_arrObject2[2].remove();
- scene->_arrObject2[3].remove();
- scene->_arrObject2[4].remove();
- scene->_arrObject2[5].remove();
- scene->_arrObject2[6].remove();
- scene->_arrObject2[7].remove();
+ scene->_lowerDisplayCard[0].remove();
+ scene->_lowerDisplayCard[1].remove();
+ scene->_lowerDisplayCard[2].remove();
+ scene->_lowerDisplayCard[3].remove();
+ scene->_lowerDisplayCard[4].remove();
+ scene->_lowerDisplayCard[5].remove();
+ scene->_lowerDisplayCard[6].remove();
+ scene->_lowerDisplayCard[7].remove();
- scene->_item7._field34 = scene->_arrunkObj1337[2]._arr1[0]._field34;
+ scene->_discardPile._cardId = scene->_gameBoardSide[2]._handCard[0]._cardId;
- scene->_item2._object1.setStrip(scene->_arrunkObj1337[2]._arr1[0]._object1._strip);
- scene->_item2._object1.setFrame(scene->_arrunkObj1337[2]._arr1[0]._object1._frame);
- scene->_item2._object1.animate(ANIM_MODE_NONE, NULL);
+ scene->_animatedCard._card.setStrip(scene->_gameBoardSide[2]._handCard[0]._card._strip);
+ scene->_animatedCard._card.setFrame(scene->_gameBoardSide[2]._handCard[0]._card._frame);
+ scene->_animatedCard._card.animate(ANIM_MODE_NONE, NULL);
- scene->_arrunkObj1337[2]._arr1[0]._field34 = 0;
- scene->_arrunkObj1337[2]._arr1[0]._object1.remove();
+ scene->_gameBoardSide[2]._handCard[0]._cardId = 0;
+ scene->_gameBoardSide[2]._handCard[0]._card.remove();
- scene->_item2._object1.setPosition(scene->_arrunkObj1337[2]._arr1[0]._field36, 0);
- scene->_item2._object1.show();
+ scene->_animatedCard._card.setPosition(scene->_gameBoardSide[2]._handCard[0]._stationPos, 0);
+ scene->_animatedCard._card.show();
NpcMover *mover = new NpcMover();
- scene->_item2._object1.addMover(mover, &scene->_arrunkObj1337[2]._arr3[0]._field36, this);
+ scene->_animatedCard._card.addMover(mover, &scene->_gameBoardSide[2]._delayCard._stationPos, this);
}
break;
case 9: {
scene->_aSound1.play(58);
- scene->_arrunkObj1337[2]._arr3[0]._field34 = 0;
- scene->_arrunkObj1337[2]._arr3[0].remove();
- scene->_item2._object1.setStrip(5);
- scene->_item2._object1.setFrame(1);
- scene->_item2._object1.animate(ANIM_MODE_2, NULL);
- scene->_item2._object1.setPosition(scene->_arrunkObj1337[2]._arr3[0]._field36, 0);
- scene->_item2._object1.show();
+ scene->_gameBoardSide[2]._delayCard._cardId = 0;
+ scene->_gameBoardSide[2]._delayCard.remove();
+ scene->_animatedCard._card.setStrip(5);
+ scene->_animatedCard._card.setFrame(1);
+ scene->_animatedCard._card.animate(ANIM_MODE_2, NULL);
+ scene->_animatedCard._card.setPosition(scene->_gameBoardSide[2]._delayCard._stationPos, 0);
+ scene->_animatedCard._card.show();
NpcMover *mover = new NpcMover();
- scene->_item2._object1.addMover(mover, &scene->_item7._field36, this);
+ scene->_animatedCard._card.addMover(mover, &scene->_discardPile._stationPos, this);
}
break;
case 10: {
- scene->_item2._object1.hide();
- scene->setAnimationInfo(&scene->_item7);
+ scene->_animatedCard._card.hide();
+ scene->setAnimationInfo(&scene->_discardPile);
scene->_aSound2.play(61);
R2_GLOBALS._sceneObjects->draw();
scene->actionDisplay(1331, 18, 159, 10, 1, 200, 0, 7, 0, 154, 154);
- scene->_arrObject1[0].postInit();
- scene->_arrObject1[0].setVisage(1332);
- scene->_arrObject1[0].setPosition(Common::Point(131, 71), 0);
- scene->_arrObject1[0].fixPriority(190);
- scene->_arrObject1[0].setStrip(3);
- scene->_arrObject1[0].setFrame(4);
-
- scene->_arrObject2[0].postInit();
- scene->_arrObject2[0].setVisage(1332);
- scene->_arrObject2[0].setPosition(Common::Point(131, 71), 0);
- scene->_arrObject2[0].setStrip(7);
- scene->_arrObject2[0].setFrame(1);
- scene->_arrObject2[0].fixPriority(180);
-
- scene->_arrObject1[1].postInit();
- scene->_arrObject1[1].setVisage(1332);
- scene->_arrObject1[1].setPosition(Common::Point(160, 71), 0);
- scene->_arrObject1[1].fixPriority(190);
- scene->_arrObject1[1].setStrip(3);
- scene->_arrObject1[1].setFrame(16);
-
- scene->_arrObject2[1].postInit();
- scene->_arrObject2[1].setVisage(1332);
- scene->_arrObject2[1].setPosition(Common::Point(160, 71), 0);
- scene->_arrObject2[1].setStrip(7);
- scene->_arrObject2[1].setFrame(1);
- scene->_arrObject2[1].fixPriority(180);
-
- scene->_arrObject1[2].postInit();
- scene->_arrObject1[2].setVisage(1332);
- scene->_arrObject1[2].setPosition(Common::Point(131, 100), 0);
- scene->_arrObject1[2].fixPriority(190);
- scene->_arrObject1[2].setStrip(4);
- scene->_arrObject1[2].setFrame(4);
-
- scene->_arrObject2[2].postInit();
- scene->_arrObject2[2].setVisage(1332);
- scene->_arrObject2[2].setPosition(Common::Point(131, 100), 0);
- scene->_arrObject2[2].setStrip(7);
- scene->_arrObject2[2].setFrame(1);
- scene->_arrObject2[2].fixPriority(180);
-
- scene->_arrObject1[3].postInit();
- scene->_arrObject1[3].setVisage(1332);
- scene->_arrObject1[3].setPosition(Common::Point(160, 100), 0);
- scene->_arrObject1[3].fixPriority(190);
- scene->_arrObject1[3].setStrip(4);
- scene->_arrObject1[3].setFrame(2);
-
- scene->_arrObject2[3].postInit();
- scene->_arrObject2[3].setVisage(1332);
- scene->_arrObject2[3].setPosition(Common::Point(160, 100), 0);
- scene->_arrObject2[3].setStrip(7);
- scene->_arrObject2[3].setFrame(1);
- scene->_arrObject2[3].fixPriority(180);
+ scene->_upperDisplayCard[0].postInit();
+ scene->_upperDisplayCard[0].setVisage(1332);
+ scene->_upperDisplayCard[0].setPosition(Common::Point(131, 71), 0);
+ scene->_upperDisplayCard[0].fixPriority(190);
+ scene->_upperDisplayCard[0].setStrip(3);
+ scene->_upperDisplayCard[0].setFrame(4);
+
+ scene->_lowerDisplayCard[0].postInit();
+ scene->_lowerDisplayCard[0].setVisage(1332);
+ scene->_lowerDisplayCard[0].setPosition(Common::Point(131, 71), 0);
+ scene->_lowerDisplayCard[0].setStrip(7);
+ scene->_lowerDisplayCard[0].setFrame(1);
+ scene->_lowerDisplayCard[0].fixPriority(180);
+
+ scene->_upperDisplayCard[1].postInit();
+ scene->_upperDisplayCard[1].setVisage(1332);
+ scene->_upperDisplayCard[1].setPosition(Common::Point(160, 71), 0);
+ scene->_upperDisplayCard[1].fixPriority(190);
+ scene->_upperDisplayCard[1].setStrip(3);
+ scene->_upperDisplayCard[1].setFrame(16);
+
+ scene->_lowerDisplayCard[1].postInit();
+ scene->_lowerDisplayCard[1].setVisage(1332);
+ scene->_lowerDisplayCard[1].setPosition(Common::Point(160, 71), 0);
+ scene->_lowerDisplayCard[1].setStrip(7);
+ scene->_lowerDisplayCard[1].setFrame(1);
+ scene->_lowerDisplayCard[1].fixPriority(180);
+
+ scene->_upperDisplayCard[2].postInit();
+ scene->_upperDisplayCard[2].setVisage(1332);
+ scene->_upperDisplayCard[2].setPosition(Common::Point(131, 100), 0);
+ scene->_upperDisplayCard[2].fixPriority(190);
+ scene->_upperDisplayCard[2].setStrip(4);
+ scene->_upperDisplayCard[2].setFrame(4);
+
+ scene->_lowerDisplayCard[2].postInit();
+ scene->_lowerDisplayCard[2].setVisage(1332);
+ scene->_lowerDisplayCard[2].setPosition(Common::Point(131, 100), 0);
+ scene->_lowerDisplayCard[2].setStrip(7);
+ scene->_lowerDisplayCard[2].setFrame(1);
+ scene->_lowerDisplayCard[2].fixPriority(180);
+
+ scene->_upperDisplayCard[3].postInit();
+ scene->_upperDisplayCard[3].setVisage(1332);
+ scene->_upperDisplayCard[3].setPosition(Common::Point(160, 100), 0);
+ scene->_upperDisplayCard[3].fixPriority(190);
+ scene->_upperDisplayCard[3].setStrip(4);
+ scene->_upperDisplayCard[3].setFrame(2);
+
+ scene->_lowerDisplayCard[3].postInit();
+ scene->_lowerDisplayCard[3].setVisage(1332);
+ scene->_lowerDisplayCard[3].setPosition(Common::Point(160, 100), 0);
+ scene->_lowerDisplayCard[3].setStrip(7);
+ scene->_lowerDisplayCard[3].setFrame(1);
+ scene->_lowerDisplayCard[3].fixPriority(180);
R2_GLOBALS._sceneObjects->draw();
- skipFrames(240);
+ waitFrames(240);
- scene->_arrObject1[0].remove();
- scene->_arrObject1[1].remove();
- scene->_arrObject1[2].remove();
- scene->_arrObject1[3].remove();
+ scene->_upperDisplayCard[0].remove();
+ scene->_upperDisplayCard[1].remove();
+ scene->_upperDisplayCard[2].remove();
+ scene->_upperDisplayCard[3].remove();
- scene->_arrObject2[0].remove();
- scene->_arrObject2[1].remove();
- scene->_arrObject2[2].remove();
- scene->_arrObject2[3].remove();
+ scene->_lowerDisplayCard[0].remove();
+ scene->_lowerDisplayCard[1].remove();
+ scene->_lowerDisplayCard[2].remove();
+ scene->_lowerDisplayCard[3].remove();
- scene->_object1.setFrame(1);
- scene->_object1.show();
- scene->_object1.animate(ANIM_MODE_2, NULL);
+ scene->_currentPlayerArrow.setFrame(1);
+ scene->_currentPlayerArrow.show();
+ scene->_currentPlayerArrow.animate(ANIM_MODE_2, NULL);
R2_GLOBALS._sceneObjects->draw();
scene->actionDisplay(1331, 19, 159, 10, 1, 220, 0, 7, 0, 154, 154);
- scene->_object1.hide();
+ scene->_currentPlayerArrow.hide();
scene->actionDisplay(1331, 20, 159, 10, 1, 220, 0, 7, 0, 154, 154);
scene->actionDisplay(1331, 21, 159, 10, 1, 220, 0, 7, 0, 154, 154);
- scene->_item7._field34 = scene->_arrunkObj1337[2]._arr1[1]._field34;
+ scene->_discardPile._cardId = scene->_gameBoardSide[2]._handCard[1]._cardId;
- scene->_item2._object1.setStrip(scene->_arrunkObj1337[2]._arr1[1]._object1._strip);
- scene->_item2._object1.setFrame(scene->_arrunkObj1337[2]._arr1[1]._object1._frame);
- scene->_item2._object1.animate(ANIM_MODE_NONE, NULL);
+ scene->_animatedCard._card.setStrip(scene->_gameBoardSide[2]._handCard[1]._card._strip);
+ scene->_animatedCard._card.setFrame(scene->_gameBoardSide[2]._handCard[1]._card._frame);
+ scene->_animatedCard._card.animate(ANIM_MODE_NONE, NULL);
- scene->_arrunkObj1337[2]._arr1[1]._field34 = 0;
- scene->_arrunkObj1337[2]._arr1[1]._object1.remove();
+ scene->_gameBoardSide[2]._handCard[1]._cardId = 0;
+ scene->_gameBoardSide[2]._handCard[1]._card.remove();
- scene->_item2._object1.setPosition(scene->_arrunkObj1337[2]._arr1[1]._field36, 0);
- scene->_item2._object1.show();
+ scene->_animatedCard._card.setPosition(scene->_gameBoardSide[2]._handCard[1]._stationPos, 0);
+ scene->_animatedCard._card.show();
NpcMover *mover = new NpcMover();
- scene->_item2._object1.addMover(mover, &scene->_item7._field36, this);
+ scene->_animatedCard._card.addMover(mover, &scene->_discardPile._stationPos, this);
}
break;
case 11: {
- scene->_item2._object1.hide();
- scene->setAnimationInfo(&scene->_item7);
+ scene->_animatedCard._card.hide();
+ scene->setAnimationInfo(&scene->_discardPile);
scene->_aSound2.play(61);
- scene->_item2._object1.setStrip(5);
- scene->_item2._object1.setFrame(1);
- scene->_item2._object1.animate(ANIM_MODE_2, NULL);
+ scene->_animatedCard._card.setStrip(5);
+ scene->_animatedCard._card.setFrame(1);
+ scene->_animatedCard._card.animate(ANIM_MODE_2, NULL);
R2_GLOBALS._sceneObjects->draw();
@@ -2980,40 +3005,40 @@ void Scene1337::Action1::signal() {
int i = -1;
for (i = 0; i <= 3; i ++) {
- scene->_arrunkObj1337[3]._arr1[i]._field34 = 0;
- scene->_arrunkObj1337[3]._arr1[i]._object1.remove();
+ scene->_gameBoardSide[3]._handCard[i]._cardId = 0;
+ scene->_gameBoardSide[3]._handCard[i]._card.remove();
- scene->_arrunkObj1337[2]._arr1[i]._field34 = 0;
- scene->_arrunkObj1337[2]._arr1[i]._object1.remove();
+ scene->_gameBoardSide[2]._handCard[i]._cardId = 0;
+ scene->_gameBoardSide[2]._handCard[i]._card.remove();
- scene->_arrunkObj1337[0]._arr1[i]._field34 = 0;
- scene->_arrunkObj1337[0]._arr1[i]._object1.remove();
+ scene->_gameBoardSide[0]._handCard[i]._cardId = 0;
+ scene->_gameBoardSide[0]._handCard[i]._card.remove();
- scene->_arrunkObj1337[1]._arr1[i]._field34 = 0;
- scene->_arrunkObj1337[1]._arr1[i]._object1.remove();
+ scene->_gameBoardSide[1]._handCard[i]._cardId = 0;
+ scene->_gameBoardSide[1]._handCard[i]._card.remove();
}
for (i = 0; i <= 7; i++) {
- scene->_arrunkObj1337[3]._arr2[i]._field34 = 0;
- scene->_arrunkObj1337[3]._arr2[i]._object1.remove();
+ scene->_gameBoardSide[3]._outpostStation[i]._cardId = 0;
+ scene->_gameBoardSide[3]._outpostStation[i]._card.remove();
- scene->_arrunkObj1337[2]._arr2[i]._field34 = 0;
- scene->_arrunkObj1337[2]._arr2[i]._object1.remove();
+ scene->_gameBoardSide[2]._outpostStation[i]._cardId = 0;
+ scene->_gameBoardSide[2]._outpostStation[i]._card.remove();
- scene->_arrunkObj1337[0]._arr2[i]._field34 = 0;
- scene->_arrunkObj1337[0]._arr2[i]._object1.remove();
+ scene->_gameBoardSide[0]._outpostStation[i]._cardId = 0;
+ scene->_gameBoardSide[0]._outpostStation[i]._card.remove();
- scene->_arrunkObj1337[1]._arr2[i]._field34 = 0;
- scene->_arrunkObj1337[1]._arr2[i]._object1.remove();
+ scene->_gameBoardSide[1]._outpostStation[i]._cardId = 0;
+ scene->_gameBoardSide[1]._outpostStation[i]._card.remove();
}
- scene->_arrunkObj1337[2]._arr3[0]._field34 = 0;
- scene->_arrunkObj1337[2]._arr3[0]._object1.remove();
+ scene->_gameBoardSide[2]._delayCard._cardId = 0;
+ scene->_gameBoardSide[2]._delayCard._card.remove();
- scene->_item7._field34 = 0;
- scene->_item7._object1.remove();
+ scene->_discardPile._cardId = 0;
+ scene->_discardPile._card.remove();
- scene->_background2.remove();
+ scene->_stockPile.remove();
}
// No break on purpose
case 0:
@@ -3029,473 +3054,484 @@ void Scene1337::Action1::signal() {
}
}
+/**
+ * Shuffle cards animation
+ */
void Scene1337::Action2::signal() {
Scene1337 *scene = (Scene1337 *)R2_GLOBALS._sceneManager._scene;
switch (_actionIndex++) {
case 0:
- scene->_item3._object1.postInit();
- scene->_item3._object1.setVisage(1332);
- scene->_item3._object1.setStrip(8);
- scene->_item3._object1.setFrame(1);
- scene->_item3._object1.fixPriority(300);
- scene->_item3._object1.setPosition(Common::Point(156, 108));
+ scene->_shuffleAnimation._card.postInit();
+ scene->_shuffleAnimation._card.setVisage(1332);
+ scene->_shuffleAnimation._card.setStrip(8);
+ scene->_shuffleAnimation._card.setFrame(1);
+ scene->_shuffleAnimation._card.fixPriority(300);
+ scene->_shuffleAnimation._card.setPosition(Common::Point(156, 108));
- scene->_item7._object1.remove();
- scene->_item7._field34 = 0;
+ scene->_discardPile._card.remove();
+ scene->_discardPile._cardId = 0;
scene->_aSound1.play(60);
- scene->_item3._object1.animate(ANIM_MODE_5, this);
+ scene->_shuffleAnimation._card.animate(ANIM_MODE_5, this);
break;
case 1:
- scene->_item3._object1.setFrame(1);
+ scene->_shuffleAnimation._card.setFrame(1);
scene->_aSound1.play(60);
- scene->_item3._object1.animate(ANIM_MODE_5, this);
+ scene->_shuffleAnimation._card.animate(ANIM_MODE_5, this);
break;
case 2: {
Common::Point pt(156, 108);
NpcMover *mover = new NpcMover();
- scene->_item3._object1.addMover(mover, &pt, this);
+ scene->_shuffleAnimation._card.addMover(mover, &pt, this);
}
break;
case 3:
- scene->_item3._object1.remove();
- scene->_background2.setup2(1332, 5, 1, 162, 95, 110, 1);
- scene->_field423C = 1;
+ scene->_shuffleAnimation._card.remove();
+ scene->_stockPile.setup(1332, 5, 1);
+ scene->_stockPile.setPosition(Common::Point(162, 95));
+ scene->_stockPile.setPriority(110);
+ scene->_stockPile._effect = EFFECT_SHADED;
+ scene->_stockPile.show();
+ scene->_shuffleEndedFl = true;
break;
default:
break;
}
}
+/**
+ * Deal cards
+ */
void Scene1337::Action3::signal() {
Scene1337 *scene = (Scene1337 *)R2_GLOBALS._sceneManager._scene;
- scene->_item2._object1.setPosition(Common::Point(162, 95), 0);
+ scene->_animatedCard._card.setPosition(Common::Point(162, 95), 0);
switch (_actionIndex++) {
case 0: {
- scene->_item2._object1._moveDiff = Common::Point(30, 30);
- scene->_item2._object1.setVisage(1332);
- scene->_item2._object1.setStrip(5);
- scene->_item2._object1.setFrame(1);
- scene->_item2._object1.fixPriority(400);
- scene->_item2._object1.animate(ANIM_MODE_2, NULL);
+ scene->_animatedCard._card._moveDiff = Common::Point(30, 30);
+ scene->_animatedCard._card.setVisage(1332);
+ scene->_animatedCard._card.setStrip(5);
+ scene->_animatedCard._card.setFrame(1);
+ scene->_animatedCard._card.fixPriority(400);
+ scene->_animatedCard._card.animate(ANIM_MODE_2, NULL);
scene->_aSound2.play(61);
Common::Point pt(283, 146);
NpcMover *mover = new NpcMover();
- scene->_item2._object1.addMover(mover, &pt, this);
+ scene->_animatedCard._card.addMover(mover, &pt, this);
- scene->_item2._object1.show();
- scene->_arrunkObj1337[1]._arr1[0]._field34 = scene->_field3E28[scene->_field3E24];
+ scene->_animatedCard._card.show();
+ scene->_gameBoardSide[1]._handCard[0]._cardId = scene->_availableCardsPile[scene->_cardsAvailableNumb];
}
break;
case 1: {
- scene->_arrunkObj1337[1]._arr1[0]._object1.postInit();
- scene->_arrunkObj1337[1]._arr1[0]._object1._moveDiff = Common::Point(30, 30);
- scene->_arrunkObj1337[1]._arr1[0]._object1.setVisage(1332);
- scene->_arrunkObj1337[1]._arr1[0]._object1.setPosition(scene->_arrunkObj1337[1]._arr1[0]._field36, 0);
- scene->_arrunkObj1337[1]._arr1[0]._object1.setStrip(1);
- scene->_arrunkObj1337[1]._arr1[0]._object1.setFrame(4);
- scene->_arrunkObj1337[1]._arr1[0]._object1.fixPriority(170);
+ scene->_gameBoardSide[1]._handCard[0]._card.postInit();
+ scene->_gameBoardSide[1]._handCard[0]._card._moveDiff = Common::Point(30, 30);
+ scene->_gameBoardSide[1]._handCard[0]._card.setVisage(1332);
+ scene->_gameBoardSide[1]._handCard[0]._card.setPosition(scene->_gameBoardSide[1]._handCard[0]._stationPos, 0);
+ scene->_gameBoardSide[1]._handCard[0]._card.setStrip(1);
+ scene->_gameBoardSide[1]._handCard[0]._card.setFrame(4);
+ scene->_gameBoardSide[1]._handCard[0]._card.fixPriority(170);
scene->_aSound2.play(61);
Common::Point pt(10, 174);
NpcMover *mover = new NpcMover();
- scene->_item2._object1.addMover(mover, &pt, this);
+ scene->_animatedCard._card.addMover(mover, &pt, this);
- scene->_arrunkObj1337[2]._arr1[0]._field34 = scene->_field3E28[scene->_field3E24];
+ scene->_gameBoardSide[2]._handCard[0]._cardId = scene->_availableCardsPile[scene->_cardsAvailableNumb];
}
break;
case 2: {
- scene->_arrunkObj1337[2]._arr1[0]._object1.postInit();
- scene->_arrunkObj1337[2]._arr1[0]._object1._moveDiff = Common::Point(30, 30);
- scene->_arrunkObj1337[2]._arr1[0]._object1.setVisage(1332);
- scene->_arrunkObj1337[2]._arr1[0]._object1.setPosition(scene->_arrunkObj1337[2]._arr1[0]._field36, 0);
- scene->_arrunkObj1337[2]._arr1[0]._object1.fixPriority(170);
- if (scene->_arrunkObj1337[2]._arr1[0]._field34 > 9) {
- if (scene->_arrunkObj1337[2]._arr1[0]._field34 > 25) {
- scene->_arrunkObj1337[2]._arr1[0]._object1.setStrip(4);
- scene->_arrunkObj1337[2]._arr1[0]._object1.setFrame(scene->_arrunkObj1337[2]._arr1[0]._field34 - 25);
- } else {
- scene->_arrunkObj1337[2]._arr1[0]._object1.setStrip(3);
- scene->_arrunkObj1337[2]._arr1[0]._object1.setFrame(scene->_arrunkObj1337[2]._arr1[0]._field34 - 9);
- }
+ scene->_gameBoardSide[2]._handCard[0]._card.postInit();
+ scene->_gameBoardSide[2]._handCard[0]._card._moveDiff = Common::Point(30, 30);
+ scene->_gameBoardSide[2]._handCard[0]._card.setVisage(1332);
+ scene->_gameBoardSide[2]._handCard[0]._card.setPosition(scene->_gameBoardSide[2]._handCard[0]._stationPos, 0);
+ scene->_gameBoardSide[2]._handCard[0]._card.fixPriority(170);
+ if (scene->_gameBoardSide[2]._handCard[0]._cardId > 25) {
+ scene->_gameBoardSide[2]._handCard[0]._card.setStrip(4);
+ scene->_gameBoardSide[2]._handCard[0]._card.setFrame(scene->_gameBoardSide[2]._handCard[0]._cardId - 25);
+ } else if (scene->_gameBoardSide[2]._handCard[0]._cardId > 9) {
+ scene->_gameBoardSide[2]._handCard[0]._card.setStrip(3);
+ scene->_gameBoardSide[2]._handCard[0]._card.setFrame(scene->_gameBoardSide[2]._handCard[0]._cardId - 9);
} else {
- scene->_arrunkObj1337[2]._arr1[0]._object1.setStrip(2);
- scene->_arrunkObj1337[2]._arr1[0]._object1.setFrame(scene->_arrunkObj1337[2]._arr1[0]._field34);
+ scene->_gameBoardSide[2]._handCard[0]._card.setStrip(2);
+ scene->_gameBoardSide[2]._handCard[0]._card.setFrame(scene->_gameBoardSide[2]._handCard[0]._cardId);
}
scene->_aSound2.play(61);
Common::Point pt(14, 14);
NpcMover *mover = new NpcMover();
- scene->_item2._object1.addMover(mover, &pt, this);
+ scene->_animatedCard._card.addMover(mover, &pt, this);
- scene->_arrunkObj1337[3]._arr1[0]._field34 = scene->_field3E28[scene->_field3E24];
+ scene->_gameBoardSide[3]._handCard[0]._cardId = scene->_availableCardsPile[scene->_cardsAvailableNumb];
}
break;
case 3: {
- scene->_arrunkObj1337[3]._arr1[0]._object1.postInit();
- scene->_arrunkObj1337[3]._arr1[0]._object1._moveDiff = Common::Point(30, 30);
- scene->_arrunkObj1337[3]._arr1[0]._object1.setVisage(1332);
- scene->_arrunkObj1337[3]._arr1[0]._object1.setPosition(scene->_arrunkObj1337[3]._arr1[0]._field36, 0);
- scene->_arrunkObj1337[3]._arr1[0]._object1.setStrip(1);
- scene->_arrunkObj1337[3]._arr1[0]._object1.setFrame(3);
- scene->_arrunkObj1337[3]._arr1[0]._object1.fixPriority(170);
+ scene->_gameBoardSide[3]._handCard[0]._card.postInit();
+ scene->_gameBoardSide[3]._handCard[0]._card._moveDiff = Common::Point(30, 30);
+ scene->_gameBoardSide[3]._handCard[0]._card.setVisage(1332);
+ scene->_gameBoardSide[3]._handCard[0]._card.setPosition(scene->_gameBoardSide[3]._handCard[0]._stationPos, 0);
+ scene->_gameBoardSide[3]._handCard[0]._card.setStrip(1);
+ scene->_gameBoardSide[3]._handCard[0]._card.setFrame(3);
+ scene->_gameBoardSide[3]._handCard[0]._card.fixPriority(170);
scene->_aSound2.play(61);
Common::Point pt(280, 5);
NpcMover *mover = new NpcMover();
- scene->_item2._object1.addMover(mover, &pt, this);
+ scene->_animatedCard._card.addMover(mover, &pt, this);
- scene->_arrunkObj1337[0]._arr1[0]._field34 = scene->_field3E28[scene->_field3E24];
+ scene->_gameBoardSide[0]._handCard[0]._cardId = scene->_availableCardsPile[scene->_cardsAvailableNumb];
}
break;
case 4: {
- scene->_arrunkObj1337[0]._arr1[0]._object1.postInit();
- scene->_arrunkObj1337[0]._arr1[0]._object1._moveDiff = Common::Point(30,30);
- scene->_arrunkObj1337[0]._arr1[0]._object1.setVisage(1332);
- scene->_arrunkObj1337[0]._arr1[0]._object1.setPosition(scene->_arrunkObj1337[0]._arr1[0]._field36, 0);
- scene->_arrunkObj1337[0]._arr1[0]._object1.setStrip(5);
- scene->_arrunkObj1337[0]._arr1[0]._object1.setFrame(1);
- scene->_arrunkObj1337[0]._arr1[0]._object1.fixPriority(170);
+ scene->_gameBoardSide[0]._handCard[0]._card.postInit();
+ scene->_gameBoardSide[0]._handCard[0]._card._moveDiff = Common::Point(30,30);
+ scene->_gameBoardSide[0]._handCard[0]._card.setVisage(1332);
+ scene->_gameBoardSide[0]._handCard[0]._card.setPosition(scene->_gameBoardSide[0]._handCard[0]._stationPos, 0);
+ scene->_gameBoardSide[0]._handCard[0]._card.setStrip(5);
+ scene->_gameBoardSide[0]._handCard[0]._card.setFrame(1);
+ scene->_gameBoardSide[0]._handCard[0]._card.fixPriority(170);
scene->_aSound2.play(61);
Common::Point pt(283, 124);
NpcMover *mover = new NpcMover();
- scene->_item2._object1.addMover(mover, &pt, this);
+ scene->_animatedCard._card.addMover(mover, &pt, this);
- scene->_arrunkObj1337[1]._arr1[1]._field34 = scene->_field3E28[scene->_field3E24];
+ scene->_gameBoardSide[1]._handCard[1]._cardId = scene->_availableCardsPile[scene->_cardsAvailableNumb];
}
break;
case 5: {
- scene->_arrunkObj1337[1]._arr1[1]._object1.postInit();
- scene->_arrunkObj1337[1]._arr1[1]._object1._moveDiff = Common::Point(30, 30);
- scene->_arrunkObj1337[1]._arr1[1]._object1.setVisage(1332);
- scene->_arrunkObj1337[1]._arr1[1]._object1.setPosition(scene->_arrunkObj1337[1]._arr1[1]._field36, 0);
- scene->_arrunkObj1337[1]._arr1[1]._object1.setStrip(1);
- scene->_arrunkObj1337[1]._arr1[1]._object1.setFrame(4);
- scene->_arrunkObj1337[1]._arr1[1]._object1.fixPriority(170);
+ scene->_gameBoardSide[1]._handCard[1]._card.postInit();
+ scene->_gameBoardSide[1]._handCard[1]._card._moveDiff = Common::Point(30, 30);
+ scene->_gameBoardSide[1]._handCard[1]._card.setVisage(1332);
+ scene->_gameBoardSide[1]._handCard[1]._card.setPosition(scene->_gameBoardSide[1]._handCard[1]._stationPos, 0);
+ scene->_gameBoardSide[1]._handCard[1]._card.setStrip(1);
+ scene->_gameBoardSide[1]._handCard[1]._card.setFrame(4);
+ scene->_gameBoardSide[1]._handCard[1]._card.fixPriority(170);
scene->_aSound2.play(61);
Common::Point pt(37, 174);
NpcMover *mover = new NpcMover();
- scene->_item2._object1.addMover(mover, &pt, this);
+ scene->_animatedCard._card.addMover(mover, &pt, this);
- scene->_arrunkObj1337[2]._arr1[1]._field34 = scene->_field3E28[scene->_field3E24];
+ scene->_gameBoardSide[2]._handCard[1]._cardId = scene->_availableCardsPile[scene->_cardsAvailableNumb];
}
break;
case 6: {
- scene->_arrunkObj1337[2]._arr1[1]._object1.postInit();
- scene->_arrunkObj1337[2]._arr1[1]._object1._moveDiff = Common::Point(30, 30);
- scene->_arrunkObj1337[2]._arr1[1]._object1.setVisage(1332);
- scene->_arrunkObj1337[2]._arr1[1]._object1.setPosition(scene->_arrunkObj1337[2]._arr1[1]._field36, 0);
- scene->_arrunkObj1337[2]._arr1[1]._object1.fixPriority(170);
-
- if (scene->_arrunkObj1337[2]._arr1[1]._field34 > 9) {
- if (scene->_arrunkObj1337[2]._arr1[1]._field34 > 25) {
- scene->_arrunkObj1337[2]._arr1[1]._object1.setStrip(4);
- scene->_arrunkObj1337[2]._arr1[1]._object1.setFrame(scene->_arrunkObj1337[2]._arr1[1]._field34 - 25);
- } else {
- scene->_arrunkObj1337[2]._arr1[1]._object1.setStrip(3);
- scene->_arrunkObj1337[2]._arr1[1]._object1.setFrame(scene->_arrunkObj1337[2]._arr1[1]._field34 - 9);
- }
+ scene->_gameBoardSide[2]._handCard[1]._card.postInit();
+ scene->_gameBoardSide[2]._handCard[1]._card._moveDiff = Common::Point(30, 30);
+ scene->_gameBoardSide[2]._handCard[1]._card.setVisage(1332);
+ scene->_gameBoardSide[2]._handCard[1]._card.setPosition(scene->_gameBoardSide[2]._handCard[1]._stationPos, 0);
+ scene->_gameBoardSide[2]._handCard[1]._card.fixPriority(170);
+
+ if (scene->_gameBoardSide[2]._handCard[1]._cardId > 25) {
+ scene->_gameBoardSide[2]._handCard[1]._card.setStrip(4);
+ scene->_gameBoardSide[2]._handCard[1]._card.setFrame(scene->_gameBoardSide[2]._handCard[1]._cardId - 25);
+ } else if (scene->_gameBoardSide[2]._handCard[1]._cardId > 9) {
+ scene->_gameBoardSide[2]._handCard[1]._card.setStrip(3);
+ scene->_gameBoardSide[2]._handCard[1]._card.setFrame(scene->_gameBoardSide[2]._handCard[1]._cardId - 9);
} else {
- scene->_arrunkObj1337[2]._arr1[1]._object1.setStrip(2);
- scene->_arrunkObj1337[2]._arr1[1]._object1.setFrame(scene->_arrunkObj1337[2]._arr1[1]._field34);
+ scene->_gameBoardSide[2]._handCard[1]._card.setStrip(2);
+ scene->_gameBoardSide[2]._handCard[1]._card.setFrame(scene->_gameBoardSide[2]._handCard[1]._cardId);
}
scene->_aSound2.play(61);
Common::Point pt(14, 36);
NpcMover *mover = new NpcMover();
- scene->_item2._object1.addMover(mover, &pt, this);
+ scene->_animatedCard._card.addMover(mover, &pt, this);
- scene->_arrunkObj1337[3]._arr1[1]._field34 = scene->_field3E28[scene->_field3E24];
+ scene->_gameBoardSide[3]._handCard[1]._cardId = scene->_availableCardsPile[scene->_cardsAvailableNumb];
}
break;
case 7: {
- scene->_arrunkObj1337[3]._arr1[1]._object1.postInit();
- scene->_arrunkObj1337[3]._arr1[1]._object1._moveDiff = Common::Point(30, 30);
- scene->_arrunkObj1337[3]._arr1[1]._object1.setVisage(1332);
- scene->_arrunkObj1337[3]._arr1[1]._object1.setPosition(scene->_arrunkObj1337[3]._arr1[1]._field36);
- scene->_arrunkObj1337[3]._arr1[1]._object1.setStrip(1);
- scene->_arrunkObj1337[3]._arr1[1]._object1.setFrame(3);
- scene->_arrunkObj1337[3]._arr1[1]._object1.fixPriority(170);
+ scene->_gameBoardSide[3]._handCard[1]._card.postInit();
+ scene->_gameBoardSide[3]._handCard[1]._card._moveDiff = Common::Point(30, 30);
+ scene->_gameBoardSide[3]._handCard[1]._card.setVisage(1332);
+ scene->_gameBoardSide[3]._handCard[1]._card.setPosition(scene->_gameBoardSide[3]._handCard[1]._stationPos);
+ scene->_gameBoardSide[3]._handCard[1]._card.setStrip(1);
+ scene->_gameBoardSide[3]._handCard[1]._card.setFrame(3);
+ scene->_gameBoardSide[3]._handCard[1]._card.fixPriority(170);
scene->_aSound2.play(61);
Common::Point pt(253, 5);
NpcMover *mover = new NpcMover();
- scene->_item2._object1.addMover(mover, &pt, this);
+ scene->_animatedCard._card.addMover(mover, &pt, this);
- scene->_arrunkObj1337[0]._arr1[1]._field34 = scene->_field3E28[scene->_field3E24];
+ scene->_gameBoardSide[0]._handCard[1]._cardId = scene->_availableCardsPile[scene->_cardsAvailableNumb];
}
break;
case 8: {
- scene->_arrunkObj1337[0]._arr1[1]._object1.postInit();
- scene->_arrunkObj1337[0]._arr1[1]._object1._moveDiff = Common::Point(30, 30);
- scene->_arrunkObj1337[0]._arr1[1]._object1.setVisage(1332);
- scene->_arrunkObj1337[0]._arr1[1]._object1.setPosition(scene->_arrunkObj1337[0]._arr1[1]._field36, 0);
- scene->_arrunkObj1337[0]._arr1[1]._object1.setStrip(5);
- scene->_arrunkObj1337[0]._arr1[1]._object1.setFrame(1);
- scene->_arrunkObj1337[0]._arr1[1]._object1.fixPriority(170);
+ scene->_gameBoardSide[0]._handCard[1]._card.postInit();
+ scene->_gameBoardSide[0]._handCard[1]._card._moveDiff = Common::Point(30, 30);
+ scene->_gameBoardSide[0]._handCard[1]._card.setVisage(1332);
+ scene->_gameBoardSide[0]._handCard[1]._card.setPosition(scene->_gameBoardSide[0]._handCard[1]._stationPos, 0);
+ scene->_gameBoardSide[0]._handCard[1]._card.setStrip(5);
+ scene->_gameBoardSide[0]._handCard[1]._card.setFrame(1);
+ scene->_gameBoardSide[0]._handCard[1]._card.fixPriority(170);
scene->_aSound2.play(61);
Common::Point pt(283, 102);
NpcMover *mover = new NpcMover();
- scene->_item2._object1.addMover(mover, &pt, this);
+ scene->_animatedCard._card.addMover(mover, &pt, this);
- scene->_arrunkObj1337[1]._arr1[2]._field34 = scene->_field3E28[scene->_field3E24];
+ scene->_gameBoardSide[1]._handCard[2]._cardId = scene->_availableCardsPile[scene->_cardsAvailableNumb];
}
break;
case 9: {
- scene->_arrunkObj1337[1]._arr1[2]._object1.postInit();
- scene->_arrunkObj1337[1]._arr1[2]._object1._moveDiff = Common::Point(30, 30);
- scene->_arrunkObj1337[1]._arr1[2]._object1.setVisage(1332);
- scene->_arrunkObj1337[1]._arr1[2]._object1.setPosition(scene->_arrunkObj1337[1]._arr1[2]._field36, 0);
- scene->_arrunkObj1337[1]._arr1[2]._object1.setStrip(1);
- scene->_arrunkObj1337[1]._arr1[2]._object1.setFrame(4);
- scene->_arrunkObj1337[1]._arr1[2]._object1.fixPriority(170);
+ scene->_gameBoardSide[1]._handCard[2]._card.postInit();
+ scene->_gameBoardSide[1]._handCard[2]._card._moveDiff = Common::Point(30, 30);
+ scene->_gameBoardSide[1]._handCard[2]._card.setVisage(1332);
+ scene->_gameBoardSide[1]._handCard[2]._card.setPosition(scene->_gameBoardSide[1]._handCard[2]._stationPos, 0);
+ scene->_gameBoardSide[1]._handCard[2]._card.setStrip(1);
+ scene->_gameBoardSide[1]._handCard[2]._card.setFrame(4);
+ scene->_gameBoardSide[1]._handCard[2]._card.fixPriority(170);
scene->_aSound2.play(61);
Common::Point pt(64, 174);
NpcMover *mover = new NpcMover();
- scene->_item2._object1.addMover(mover, &pt, this);
+ scene->_animatedCard._card.addMover(mover, &pt, this);
- scene->_arrunkObj1337[2]._arr1[2]._field34 = scene->_field3E28[scene->_field3E24];
+ scene->_gameBoardSide[2]._handCard[2]._cardId = scene->_availableCardsPile[scene->_cardsAvailableNumb];
}
break;
case 10: {
- scene->_arrunkObj1337[2]._arr1[2]._object1.postInit();
- scene->_arrunkObj1337[2]._arr1[2]._object1._moveDiff = Common::Point(30, 30);
- scene->_arrunkObj1337[2]._arr1[2]._object1.setVisage(1332);
- scene->_arrunkObj1337[2]._arr1[2]._object1.setPosition(scene->_arrunkObj1337[2]._arr1[2]._field36, 0);
- scene->_arrunkObj1337[2]._arr1[2]._object1.fixPriority(170);
-
- if (scene->_arrunkObj1337[2]._arr1[2]._field34 > 9) {
- if (scene->_arrunkObj1337[2]._arr1[2]._field34 > 25) {
- scene->_arrunkObj1337[2]._arr1[2]._object1.setStrip(4);
- scene->_arrunkObj1337[2]._arr1[2]._object1.setFrame(scene->_arrunkObj1337[2]._arr1[2]._field34 - 25);
- } else {
- scene->_arrunkObj1337[2]._arr1[2]._object1.setStrip(3);
- scene->_arrunkObj1337[2]._arr1[2]._object1.setFrame(scene->_arrunkObj1337[2]._arr1[2]._field34 - 9);
- }
+ scene->_gameBoardSide[2]._handCard[2]._card.postInit();
+ scene->_gameBoardSide[2]._handCard[2]._card._moveDiff = Common::Point(30, 30);
+ scene->_gameBoardSide[2]._handCard[2]._card.setVisage(1332);
+ scene->_gameBoardSide[2]._handCard[2]._card.setPosition(scene->_gameBoardSide[2]._handCard[2]._stationPos, 0);
+ scene->_gameBoardSide[2]._handCard[2]._card.fixPriority(170);
+
+ if (scene->_gameBoardSide[2]._handCard[2]._cardId > 25) {
+ scene->_gameBoardSide[2]._handCard[2]._card.setStrip(4);
+ scene->_gameBoardSide[2]._handCard[2]._card.setFrame(scene->_gameBoardSide[2]._handCard[2]._cardId - 25);
+ } else if (scene->_gameBoardSide[2]._handCard[2]._cardId > 9) {
+ scene->_gameBoardSide[2]._handCard[2]._card.setStrip(3);
+ scene->_gameBoardSide[2]._handCard[2]._card.setFrame(scene->_gameBoardSide[2]._handCard[2]._cardId - 9);
} else {
- scene->_arrunkObj1337[2]._arr1[2]._object1.setStrip(2);
- scene->_arrunkObj1337[2]._arr1[2]._object1.setFrame(scene->_arrunkObj1337[2]._arr1[2]._field34);
+ scene->_gameBoardSide[2]._handCard[2]._card.setStrip(2);
+ scene->_gameBoardSide[2]._handCard[2]._card.setFrame(scene->_gameBoardSide[2]._handCard[2]._cardId);
}
scene->_aSound2.play(61);
Common::Point pt(14, 58);
NpcMover *mover = new NpcMover();
- scene->_item2._object1.addMover(mover, &pt, this);
+ scene->_animatedCard._card.addMover(mover, &pt, this);
- scene->_arrunkObj1337[3]._arr1[2]._field34 = scene->_field3E28[scene->_field3E24];
+ scene->_gameBoardSide[3]._handCard[2]._cardId = scene->_availableCardsPile[scene->_cardsAvailableNumb];
}
break;
case 11: {
- scene->_arrunkObj1337[3]._arr1[2]._object1.postInit();
- scene->_arrunkObj1337[3]._arr1[2]._object1._moveDiff = Common::Point(30, 30);
- scene->_arrunkObj1337[3]._arr1[2]._object1.setVisage(1332);
- scene->_arrunkObj1337[3]._arr1[2]._object1.setPosition(scene->_arrunkObj1337[3]._arr1[2]._field36, 0);
- scene->_arrunkObj1337[3]._arr1[2]._object1.setStrip(1);
- scene->_arrunkObj1337[3]._arr1[2]._object1.setFrame(3);
- scene->_arrunkObj1337[3]._arr1[2]._object1.fixPriority(170);
+ scene->_gameBoardSide[3]._handCard[2]._card.postInit();
+ scene->_gameBoardSide[3]._handCard[2]._card._moveDiff = Common::Point(30, 30);
+ scene->_gameBoardSide[3]._handCard[2]._card.setVisage(1332);
+ scene->_gameBoardSide[3]._handCard[2]._card.setPosition(scene->_gameBoardSide[3]._handCard[2]._stationPos, 0);
+ scene->_gameBoardSide[3]._handCard[2]._card.setStrip(1);
+ scene->_gameBoardSide[3]._handCard[2]._card.setFrame(3);
+ scene->_gameBoardSide[3]._handCard[2]._card.fixPriority(170);
scene->_aSound2.play(61);
Common::Point pt(226, 5);
NpcMover *mover = new NpcMover();
- scene->_item2._object1.addMover(mover, &pt, this);
+ scene->_animatedCard._card.addMover(mover, &pt, this);
- scene->_arrunkObj1337[0]._arr1[2]._field34 = scene->_field3E28[scene->_field3E24];
+ scene->_gameBoardSide[0]._handCard[2]._cardId = scene->_availableCardsPile[scene->_cardsAvailableNumb];
}
break;
case 12:
- scene->_arrunkObj1337[0]._arr1[2]._object1.postInit();
- scene->_arrunkObj1337[0]._arr1[2]._object1._moveDiff = Common::Point(30, 30);
- scene->_arrunkObj1337[0]._arr1[2]._object1.setVisage(1332);
- scene->_arrunkObj1337[0]._arr1[2]._object1.setPosition(scene->_arrunkObj1337[0]._arr1[2]._field36, 0);
- scene->_arrunkObj1337[0]._arr1[2]._object1.setStrip(5);
- scene->_arrunkObj1337[0]._arr1[2]._object1.setFrame(1);
- scene->_arrunkObj1337[0]._arr1[2]._object1.fixPriority(170);
- scene->_arrunkObj1337[0]._arr1[2]._object1.hide();
+ scene->_gameBoardSide[0]._handCard[2]._card.postInit();
+ scene->_gameBoardSide[0]._handCard[2]._card._moveDiff = Common::Point(30, 30);
+ scene->_gameBoardSide[0]._handCard[2]._card.setVisage(1332);
+ scene->_gameBoardSide[0]._handCard[2]._card.setPosition(scene->_gameBoardSide[0]._handCard[2]._stationPos, 0);
+ scene->_gameBoardSide[0]._handCard[2]._card.setStrip(5);
+ scene->_gameBoardSide[0]._handCard[2]._card.setFrame(1);
+ scene->_gameBoardSide[0]._handCard[2]._card.fixPriority(170);
+ scene->_animatedCard._card.hide();
default:
break;
}
if (_actionIndex > 12) {
- scene->_field423E = 0;
+ scene->_currentPlayerNumb = 0;
R2_GLOBALS._sceneObjects->draw();
scene->actionDisplay(1330, 0, 159, 10, 1, 200, 0, 7, 0, 154, 154);
- scene->subC20F9();
+ scene->handleNextTurn();
} else if (_actionIndex >= 1) {
- scene->_field3E28[scene->_field3E24] = 0;
- scene->_field3E24--;
+ scene->_availableCardsPile[scene->_cardsAvailableNumb] = 0;
+ scene->_cardsAvailableNumb--;
}
}
+/**
+ * Action used to handle the other players' turn
+ */
void Scene1337::Action4::signal() {
Scene1337 *scene = (Scene1337 *)R2_GLOBALS._sceneManager._scene;
switch (_actionIndex++) {
case 0:
- if ((scene->_arrunkObj1337[scene->_field423E]._arr1[0]._field34 == 0) && (scene->subC264B(scene->_arrunkObj1337[scene->_field423E]._arr3[0]._field34))) {
- if (scene->_field3E24 < 0)
- scene->subC264B(scene->_arrunkObj1337[scene->_field423E]._arr3[0]._field34);
- scene->_item2._object1.setPosition(Common::Point(162, 95), 0);
- scene->_item2._object1.show();
+ if ( (scene->_gameBoardSide[scene->_currentPlayerNumb]._handCard[0]._cardId == 0)
+ && (!scene->isStationCard(scene->_gameBoardSide[scene->_currentPlayerNumb]._delayCard._cardId))) {
+ if (scene->_cardsAvailableNumb < 0)
+ scene->shuffleCards();
+ scene->_animatedCard._card.setPosition(Common::Point(162, 95), 0);
+ scene->_animatedCard._card.show();
scene->_aSound2.play(61);
NpcMover *mover = new NpcMover();
- scene->_item2._object1.addMover(mover, &scene->_arrunkObj1337[scene->_field423E]._fieldB94, this);
+ scene->_animatedCard._card.addMover(mover, &scene->_gameBoardSide[scene->_currentPlayerNumb]._card1Pos, this);
- scene->_arrunkObj1337[scene->_field423E]._arr1[0]._field34 = scene->_field3E28[scene->_field3E24];
- scene->_field3E28[scene->_field3E24] = 0;
- scene->_field3E24--;
+ scene->_gameBoardSide[scene->_currentPlayerNumb]._handCard[0]._cardId = scene->_availableCardsPile[scene->_cardsAvailableNumb];
+ scene->_availableCardsPile[scene->_cardsAvailableNumb] = 0;
+ scene->_cardsAvailableNumb--;
- if (scene->_field3E24 < 0)
- scene->_background2.remove();
+ if (scene->_cardsAvailableNumb < 0)
+ scene->_stockPile.remove();
} else {
// Self call, forcing next actionIndex
signal();
}
break;
case 1:
- if ( ( scene->_item2._object1._position.x == scene->_arrunkObj1337[scene->_field423E]._fieldB94.x)
- && ( scene->_item2._object1._position.y == scene->_arrunkObj1337[scene->_field423E]._fieldB94.y) ) {
- scene->_arrunkObj1337[scene->_field423E]._arr1[0]._object1.postInit();
- scene->_arrunkObj1337[scene->_field423E]._arr1[0]._object1._moveDiff = Common::Point(30, 30);
- scene->_arrunkObj1337[scene->_field423E]._arr1[0]._object1.setVisage(1332);
- scene->_arrunkObj1337[scene->_field423E]._arr1[0]._object1.setPosition(scene->_arrunkObj1337[scene->_field423E]._arr1[0]._field36, 0);
- scene->_arrunkObj1337[scene->_field423E]._arr1[0]._object1.setStrip(1);
- scene->_arrunkObj1337[scene->_field423E]._arr1[0]._object1.setFrame(scene->_arrunkObj1337[scene->_field423E]._fieldBA4);
- scene->_arrunkObj1337[scene->_field423E]._arr1[0]._object1.fixPriority(170);
- }
-
- if ((scene->_field4248 == 1) || (scene->_field423E == 2))
- scene->setAnimationInfo(&scene->_arrunkObj1337[scene->_field423E]._arr1[0]);
-
- scene->_item2._object1.hide();
- if ((scene->_arrunkObj1337[scene->_field423E]._arr1[0]._field34 == 0) && (scene->subC264B(scene->_arrunkObj1337[scene->_field423E]._arr3[0]._field34 == 0))) {
- if (scene->_field3E24 < 0)
+ if ( (scene->_animatedCard._card._position.x == scene->_gameBoardSide[scene->_currentPlayerNumb]._card1Pos.x)
+ && (scene->_animatedCard._card._position.y == scene->_gameBoardSide[scene->_currentPlayerNumb]._card1Pos.y) ) {
+ scene->_gameBoardSide[scene->_currentPlayerNumb]._handCard[0]._card.postInit();
+ scene->_gameBoardSide[scene->_currentPlayerNumb]._handCard[0]._card._moveDiff = Common::Point(30, 30);
+ scene->_gameBoardSide[scene->_currentPlayerNumb]._handCard[0]._card.setVisage(1332);
+ scene->_gameBoardSide[scene->_currentPlayerNumb]._handCard[0]._card.setPosition(scene->_gameBoardSide[scene->_currentPlayerNumb]._handCard[0]._stationPos, 0);
+ scene->_gameBoardSide[scene->_currentPlayerNumb]._handCard[0]._card.setStrip(1);
+ scene->_gameBoardSide[scene->_currentPlayerNumb]._handCard[0]._card.setFrame(scene->_gameBoardSide[scene->_currentPlayerNumb]._frameNum);
+ scene->_gameBoardSide[scene->_currentPlayerNumb]._handCard[0]._card.fixPriority(170);
+ }
+
+ if ((R2_GLOBALS._debugCardGame) || (scene->_currentPlayerNumb == 2))
+ scene->setAnimationInfo(&scene->_gameBoardSide[scene->_currentPlayerNumb]._handCard[0]);
+
+ scene->_animatedCard._card.hide();
+ if ( (scene->_gameBoardSide[scene->_currentPlayerNumb]._handCard[0]._cardId == 0)
+ && (!scene->isStationCard(scene->_gameBoardSide[scene->_currentPlayerNumb]._delayCard._cardId))) {
+ if (scene->_cardsAvailableNumb < 0)
scene->shuffleCards();
- scene->_item2._object1.setPosition(Common::Point(162, 95));
- scene->_item2._object1.show();
+ scene->_animatedCard._card.setPosition(Common::Point(162, 95));
+ scene->_animatedCard._card.show();
scene->_aSound2.play(61);
NpcMover *mover = new NpcMover();
- scene->_item2._object1.addMover(mover, &scene->_arrunkObj1337[scene->_field423E]._fieldB98, this);
+ scene->_animatedCard._card.addMover(mover, &scene->_gameBoardSide[scene->_currentPlayerNumb]._card2Pos, this);
- scene->_arrunkObj1337[scene->_field423E]._arr1[1]._field34 = scene->_field3E28[scene->_field3E24];
- scene->_field3E28[scene->_field3E24] = 0;
- scene->_field3E24--;
- if (scene->_field3E24 < 0)
- scene->_background2.remove();
+ scene->_gameBoardSide[scene->_currentPlayerNumb]._handCard[1]._cardId = scene->_availableCardsPile[scene->_cardsAvailableNumb];
+ scene->_availableCardsPile[scene->_cardsAvailableNumb] = 0;
+ scene->_cardsAvailableNumb--;
+ if (scene->_cardsAvailableNumb < 0)
+ scene->_stockPile.remove();
} else
signal();
break;
case 2:
- if ( ( scene->_item2._object1._position.x == scene->_arrunkObj1337[scene->_field423E]._fieldB98.x)
- && ( scene->_item2._object1._position.y == scene->_arrunkObj1337[scene->_field423E]._fieldB98.y) ) {
- scene->_arrunkObj1337[scene->_field423E]._arr1[1]._object1.postInit();
- scene->_arrunkObj1337[scene->_field423E]._arr1[1]._object1._moveDiff = Common::Point(30, 30);
- scene->_arrunkObj1337[scene->_field423E]._arr1[1]._object1.setVisage(1332);
- scene->_arrunkObj1337[scene->_field423E]._arr1[1]._object1.setPosition(scene->_arrunkObj1337[scene->_field423E]._arr1[1]._field36, 0);
- scene->_arrunkObj1337[scene->_field423E]._arr1[1]._object1.setStrip(1);
- scene->_arrunkObj1337[scene->_field423E]._arr1[1]._object1.setFrame(scene->_arrunkObj1337[scene->_field423E]._fieldBA4);
- scene->_arrunkObj1337[scene->_field423E]._arr1[1]._object1.fixPriority(170);
- }
-
- if ((scene->_field4248 == 1) || (scene->_field423E == 2))
- scene->setAnimationInfo(&scene->_arrunkObj1337[scene->_field423E]._arr1[1]);
-
- scene->_item2._object1.hide();
- if ((scene->_arrunkObj1337[scene->_field423E]._arr1[2]._field34 == 0) && (scene->subC264B(scene->_arrunkObj1337[scene->_field423E]._arr3[0]._field34 == 0))) {
- if (scene->_field3E24 < 0)
+ if ( (scene->_animatedCard._card._position.x == scene->_gameBoardSide[scene->_currentPlayerNumb]._card2Pos.x)
+ && (scene->_animatedCard._card._position.y == scene->_gameBoardSide[scene->_currentPlayerNumb]._card2Pos.y) ) {
+ scene->_gameBoardSide[scene->_currentPlayerNumb]._handCard[1]._card.postInit();
+ scene->_gameBoardSide[scene->_currentPlayerNumb]._handCard[1]._card._moveDiff = Common::Point(30, 30);
+ scene->_gameBoardSide[scene->_currentPlayerNumb]._handCard[1]._card.setVisage(1332);
+ scene->_gameBoardSide[scene->_currentPlayerNumb]._handCard[1]._card.setPosition(scene->_gameBoardSide[scene->_currentPlayerNumb]._handCard[1]._stationPos, 0);
+ scene->_gameBoardSide[scene->_currentPlayerNumb]._handCard[1]._card.setStrip(1);
+ scene->_gameBoardSide[scene->_currentPlayerNumb]._handCard[1]._card.setFrame(scene->_gameBoardSide[scene->_currentPlayerNumb]._frameNum);
+ scene->_gameBoardSide[scene->_currentPlayerNumb]._handCard[1]._card.fixPriority(170);
+ }
+
+ if ((R2_GLOBALS._debugCardGame) || (scene->_currentPlayerNumb == 2))
+ scene->setAnimationInfo(&scene->_gameBoardSide[scene->_currentPlayerNumb]._handCard[1]);
+
+ scene->_animatedCard._card.hide();
+ if ( (scene->_gameBoardSide[scene->_currentPlayerNumb]._handCard[2]._cardId == 0)
+ && (!scene->isStationCard(scene->_gameBoardSide[scene->_currentPlayerNumb]._delayCard._cardId))) {
+ if (scene->_cardsAvailableNumb < 0)
scene->shuffleCards();
- scene->_item2._object1.setPosition(Common::Point(162, 95));
- scene->_item2._object1.show();
+ scene->_animatedCard._card.setPosition(Common::Point(162, 95));
+ scene->_animatedCard._card.show();
scene->_aSound2.play(61);
NpcMover *mover = new NpcMover();
- scene->_item2._object1.addMover(mover, &scene->_arrunkObj1337[scene->_field423E]._fieldB9C, this);
+ scene->_animatedCard._card.addMover(mover, &scene->_gameBoardSide[scene->_currentPlayerNumb]._card3Pos, this);
- scene->_arrunkObj1337[scene->_field423E]._arr1[2]._field34 = scene->_field3E28[scene->_field3E24];
- scene->_field3E28[scene->_field3E24] = 0;
- scene->_field3E24--;
- if (scene->_field3E24 < 0)
- scene->_background2.remove();
+ scene->_gameBoardSide[scene->_currentPlayerNumb]._handCard[2]._cardId = scene->_availableCardsPile[scene->_cardsAvailableNumb];
+ scene->_availableCardsPile[scene->_cardsAvailableNumb] = 0;
+ scene->_cardsAvailableNumb--;
+ if (scene->_cardsAvailableNumb < 0)
+ scene->_stockPile.remove();
} else
signal();
break;
case 3:
- if ( ( scene->_item2._object1._position.x == scene->_arrunkObj1337[scene->_field423E]._fieldB9C.x)
- && ( scene->_item2._object1._position.y == scene->_arrunkObj1337[scene->_field423E]._fieldB9C.y) ) {
- scene->_arrunkObj1337[scene->_field423E]._arr1[2]._object1.postInit();
- scene->_arrunkObj1337[scene->_field423E]._arr1[2]._object1._moveDiff = Common::Point(30, 30);
- scene->_arrunkObj1337[scene->_field423E]._arr1[2]._object1.setVisage(1332);
- scene->_arrunkObj1337[scene->_field423E]._arr1[2]._object1.setPosition(scene->_arrunkObj1337[scene->_field423E]._arr1[2]._field36, 0);
- scene->_arrunkObj1337[scene->_field423E]._arr1[2]._object1.setStrip(1);
- scene->_arrunkObj1337[scene->_field423E]._arr1[2]._object1.setFrame(scene->_arrunkObj1337[scene->_field423E]._fieldBA4);
- scene->_arrunkObj1337[scene->_field423E]._arr1[2]._object1.fixPriority(170);
- }
-
- if ((scene->_field4248 == 1) || (scene->_field423E == 2))
- scene->setAnimationInfo(&scene->_arrunkObj1337[scene->_field423E]._arr1[2]);
-
- scene->_item2._object1.hide();
- if ((scene->_arrunkObj1337[scene->_field423E]._arr1[3]._field34 == 0) && (scene->subC264B(scene->_arrunkObj1337[scene->_field423E]._arr3[0]._field34 == 0))) {
- if (scene->_field3E24 < 0)
+ if ( (scene->_animatedCard._card._position.x == scene->_gameBoardSide[scene->_currentPlayerNumb]._card3Pos.x)
+ && (scene->_animatedCard._card._position.y == scene->_gameBoardSide[scene->_currentPlayerNumb]._card3Pos.y) ) {
+ scene->_gameBoardSide[scene->_currentPlayerNumb]._handCard[2]._card.postInit();
+ scene->_gameBoardSide[scene->_currentPlayerNumb]._handCard[2]._card._moveDiff = Common::Point(30, 30);
+ scene->_gameBoardSide[scene->_currentPlayerNumb]._handCard[2]._card.setVisage(1332);
+ scene->_gameBoardSide[scene->_currentPlayerNumb]._handCard[2]._card.setPosition(scene->_gameBoardSide[scene->_currentPlayerNumb]._handCard[2]._stationPos, 0);
+ scene->_gameBoardSide[scene->_currentPlayerNumb]._handCard[2]._card.setStrip(1);
+ scene->_gameBoardSide[scene->_currentPlayerNumb]._handCard[2]._card.setFrame(scene->_gameBoardSide[scene->_currentPlayerNumb]._frameNum);
+ scene->_gameBoardSide[scene->_currentPlayerNumb]._handCard[2]._card.fixPriority(170);
+ }
+
+ if ((R2_GLOBALS._debugCardGame) || (scene->_currentPlayerNumb == 2))
+ scene->setAnimationInfo(&scene->_gameBoardSide[scene->_currentPlayerNumb]._handCard[2]);
+
+ scene->_animatedCard._card.hide();
+ if ( (scene->_gameBoardSide[scene->_currentPlayerNumb]._handCard[3]._cardId == 0)
+ && (!scene->isStationCard(scene->_gameBoardSide[scene->_currentPlayerNumb]._delayCard._cardId))) {
+ if (scene->_cardsAvailableNumb < 0)
scene->shuffleCards();
- scene->_item2._object1.setPosition(Common::Point(162, 95));
- scene->_item2._object1.show();
+ scene->_animatedCard._card.setPosition(Common::Point(162, 95));
+ scene->_animatedCard._card.show();
scene->_aSound2.play(61);
NpcMover *mover = new NpcMover();
- scene->_item2._object1.addMover(mover, &scene->_arrunkObj1337[scene->_field423E]._fieldBA0, this);
+ scene->_animatedCard._card.addMover(mover, &scene->_gameBoardSide[scene->_currentPlayerNumb]._card4Pos, this);
- scene->_arrunkObj1337[scene->_field423E]._arr1[3]._field34 = scene->_field3E28[scene->_field3E24];
- scene->_field3E28[scene->_field3E24] = 0;
- scene->_field3E24--;
- if (scene->_field3E24 < 0)
- scene->_background2.remove();
+ scene->_gameBoardSide[scene->_currentPlayerNumb]._handCard[3]._cardId = scene->_availableCardsPile[scene->_cardsAvailableNumb];
+ scene->_availableCardsPile[scene->_cardsAvailableNumb] = 0;
+ scene->_cardsAvailableNumb--;
+ if (scene->_cardsAvailableNumb < 0)
+ scene->_stockPile.remove();
} else
signal();
break;
case 4:
- if ( ( scene->_item2._object1._position.x == scene->_arrunkObj1337[scene->_field423E]._fieldBA0.x)
- && ( scene->_item2._object1._position.y == scene->_arrunkObj1337[scene->_field423E]._fieldBA0.y) ) {
- scene->_arrunkObj1337[scene->_field423E]._arr1[3]._object1.postInit();
- scene->_arrunkObj1337[scene->_field423E]._arr1[3]._object1._moveDiff = Common::Point(30, 30);
- scene->_arrunkObj1337[scene->_field423E]._arr1[3]._object1.setVisage(1332);
- scene->_arrunkObj1337[scene->_field423E]._arr1[3]._object1.setPosition(scene->_arrunkObj1337[scene->_field423E]._arr1[3]._field36, 0);
- scene->_arrunkObj1337[scene->_field423E]._arr1[3]._object1.setStrip(1);
- scene->_arrunkObj1337[scene->_field423E]._arr1[3]._object1.setFrame(scene->_arrunkObj1337[scene->_field423E]._fieldBA4);
- scene->_arrunkObj1337[scene->_field423E]._arr1[3]._object1.fixPriority(170);
- }
-
- if ((scene->_field4248 == 1) || (scene->_field423E == 2))
- scene->setAnimationInfo(&scene->_arrunkObj1337[scene->_field423E]._arr1[3]);
-
- scene->_item2._object1.hide();
- switch (scene->_field423E) {
+ if ( (scene->_animatedCard._card._position.x == scene->_gameBoardSide[scene->_currentPlayerNumb]._card4Pos.x)
+ && (scene->_animatedCard._card._position.y == scene->_gameBoardSide[scene->_currentPlayerNumb]._card4Pos.y) ) {
+ scene->_gameBoardSide[scene->_currentPlayerNumb]._handCard[3]._card.postInit();
+ scene->_gameBoardSide[scene->_currentPlayerNumb]._handCard[3]._card._moveDiff = Common::Point(30, 30);
+ scene->_gameBoardSide[scene->_currentPlayerNumb]._handCard[3]._card.setVisage(1332);
+ scene->_gameBoardSide[scene->_currentPlayerNumb]._handCard[3]._card.setPosition(scene->_gameBoardSide[scene->_currentPlayerNumb]._handCard[3]._stationPos, 0);
+ scene->_gameBoardSide[scene->_currentPlayerNumb]._handCard[3]._card.setStrip(1);
+ scene->_gameBoardSide[scene->_currentPlayerNumb]._handCard[3]._card.setFrame(scene->_gameBoardSide[scene->_currentPlayerNumb]._frameNum);
+ scene->_gameBoardSide[scene->_currentPlayerNumb]._handCard[3]._card.fixPriority(170);
+ }
+
+ if ((R2_GLOBALS._debugCardGame) || (scene->_currentPlayerNumb == 2))
+ scene->setAnimationInfo(&scene->_gameBoardSide[scene->_currentPlayerNumb]._handCard[3]);
+
+ scene->_animatedCard._card.hide();
+ switch (scene->_currentPlayerNumb) {
case 0:
- scene->subCF979();
+ scene->handlePlayer0();
break;
case 1:
- scene->subCF31D();
+ scene->handlePlayer1();
break;
case 2:
- scene->subD0281();
+ scene->handleAutoplayPlayer2();
break;
case 3:
- scene->subC2C2F();
+ scene->handlePlayer3();
break;
default:
break;
@@ -3506,115 +3542,124 @@ void Scene1337::Action4::signal() {
}
}
+/**
+ * Animations for discarding a card
+ */
void Scene1337::Action5::signal() {
Scene1337 *scene = (Scene1337 *)R2_GLOBALS._sceneManager._scene;
switch (_actionIndex++) {
case 0: {
- scene->_field3E28[scene->_field3E26] = scene->_field3EF0->_field34;
- scene->_field3E26--;
- if (!g_globals->_sceneObjects->contains(&scene->_item7._object1)) {
- scene->_item7._object1.postInit();
- scene->_item7._object1.hide();
- scene->_item7._object1.setVisage(1332);
- scene->_item7._object1.setPosition(scene->_item7._field36, 0);
- scene->_item7._object1.fixPriority(170);
- }
-
- scene->_item7._field34 = scene->_field3EF0->_field34;
- scene->_field3EF0->_field34 = 0;
- scene->_field3EF0->_object1.remove();
-
- if (scene->_field3EF0 == &scene->_item6) {
- subD18B5(5, 1, 4);
+ scene->_availableCardsPile[scene->_currentDiscardIndex] = scene->_actionCard1->_cardId;
+ scene->_currentDiscardIndex--;
+ if (!g_globals->_sceneObjects->contains(&scene->_discardPile._card)) {
+ // The first discarded card makes the pile appear
+ scene->_discardPile._card.postInit();
+ scene->_discardPile._card.hide();
+ scene->_discardPile._card.setVisage(1332);
+ scene->_discardPile._card.setPosition(scene->_discardPile._stationPos, 0);
+ scene->_discardPile._card.fixPriority(170);
+ }
+
+ scene->_discardPile._cardId = scene->_actionCard1->_cardId;
+ scene->_actionCard1->_cardId = 0;
+ scene->_actionCard1->_card.remove();
+
+ if (scene->_actionCard1 == &scene->_selectedCard) {
+ scene->setCursorData(5, 1, 4);
scene->subC4CEC();
}
- scene->_item2._object1.setPosition(scene->_field3EF0->_field36, 0);
- scene->_item2._object1.show();
+ scene->_animatedCard._card.setPosition(scene->_actionCard1->_stationPos, 0);
+ scene->_animatedCard._card.show();
Common::Point pt(128, 95);
NpcMover *mover = new NpcMover();
- scene->_item2._object1.addMover(mover, &pt, this);
+ scene->_animatedCard._card.addMover(mover, &pt, this);
}
break;
case 1:
- scene->_item2._object1.hide();
- scene->setAnimationInfo(&scene->_item7);
+ scene->_animatedCard._card.hide();
+ scene->setAnimationInfo(&scene->_discardPile);
scene->_aSound2.play(61);
- scene->subC20F9();
+ scene->handleNextTurn();
break;
default:
break;
}
}
+/**
+ * Animations for playing a platform card
+ */
void Scene1337::Action6::signal() {
Scene1337 *scene = (Scene1337 *)R2_GLOBALS._sceneManager._scene;
switch (_actionIndex++) {
case 0: {
- scene->_field3EF4->_field34 = 1;
- scene->_field3EF4->_object1.postInit();
- scene->_field3EF4->_object1.hide();
- scene->_field3EF4->_object1.setVisage(1332);
- scene->_field3EF4->_object1.setPosition(scene->_field3EF4->_field36);
- scene->_field3EF4->_object1.fixPriority(170);
+ scene->_actionCard2->_cardId = 1;
+ scene->_actionCard2->_card.postInit();
+ scene->_actionCard2->_card.hide();
+ scene->_actionCard2->_card.setVisage(1332);
+ scene->_actionCard2->_card.setPosition(scene->_actionCard2->_stationPos);
+ scene->_actionCard2->_card.fixPriority(170);
- scene->_field3EF0->_field34 = 0;
- scene->_field3EF0->_object1.remove();
+ scene->_actionCard1->_cardId = 0;
+ scene->_actionCard1->_card.remove();
- scene->_item2._object1.setPosition(scene->_field3EF0->_field36);
- scene->_item2._object1.show();
+ scene->_animatedCard._card.setPosition(scene->_actionCard1->_stationPos);
+ scene->_animatedCard._card.show();
NpcMover *mover = new NpcMover();
- scene->_item2._object1.addMover(mover, &scene->_field3EF4->_field36, this);
+ scene->_animatedCard._card.addMover(mover, &scene->_actionCard2->_stationPos, this);
}
break;
case 1:
- scene->_item2._object1.hide();
- scene->setAnimationInfo(scene->_field3EF4);
+ scene->_animatedCard._card.hide();
+ scene->setAnimationInfo(scene->_actionCard2);
scene->_aSound1.play(59);
- if (scene->_field3EF0 == &scene->_item6) {
- subD18B5(5, 1, 4);
+ if (scene->_actionCard1 == &scene->_selectedCard) {
+ scene->setCursorData(5, 1, 4);
scene->subC4CEC();
}
- scene->subC20F9();
+ scene->handleNextTurn();
break;
default:
break;
}
}
+/**
+ * Upgrade platform to station by playing a station card on top of it
+ */
void Scene1337::Action7::signal() {
Scene1337 *scene = (Scene1337 *)R2_GLOBALS._sceneManager._scene;
switch (_actionIndex++) {
case 0: {
- scene->_field3EF4->_field34 = scene->_field3EF0->_field34;
+ scene->_actionCard2->_cardId = scene->_actionCard1->_cardId;
- scene->_field3EF0->_field34 = 0;
- scene->_field3EF0->_object1.remove();
+ scene->_actionCard1->_cardId = 0;
+ scene->_actionCard1->_card.remove();
- scene->_item2._object1.setPosition(scene->_field3EF0->_field36, 0);
- scene->_item2._object1.show();
+ scene->_animatedCard._card.setPosition(scene->_actionCard1->_stationPos, 0);
+ scene->_animatedCard._card.show();
NpcMover *mover = new NpcMover();
- scene->_item2._object1.addMover(mover, &scene->_field3EF4->_field36, this);
+ scene->_animatedCard._card.addMover(mover, &scene->_actionCard2->_stationPos, this);
}
break;
case 1:
- if (scene->_field3EF0 == &scene->_item6) {
- subD18B5(5, 1, 4);
+ if (scene->_actionCard1 == &scene->_selectedCard) {
+ scene->setCursorData(5, 1, 4);
scene->subC4CEC();
}
- scene->setAnimationInfo(scene->_field3EF4);
+ scene->setAnimationInfo(scene->_actionCard2);
scene->_aSound1.play(59);
- scene->_item5._field34 = 1;
- scene->_item5._field36.x = scene->_field3EF4->_field36.x;
- scene->_item5._field36.y = scene->_field3EF4->_field36.y;
- scene->_item5._object1.postInit();
- scene->_item5._object1.hide();
- scene->_item5._object1._flags = 0x200;
+ scene->_discardedPlatformCard._cardId = 1;
+ scene->_discardedPlatformCard._stationPos = scene->_actionCard2->_stationPos;
+ scene->_discardedPlatformCard._card.postInit();
+ scene->_discardedPlatformCard._card.hide();
+ scene->_discardedPlatformCard._card._flags = OBJFLAG_HIDING;
- scene->subC4A39(&scene->_item5);
+ scene->discardCard(&scene->_discardedPlatformCard);
break;
default:
break;
@@ -3626,112 +3671,114 @@ void Scene1337::Action8::signal() {
switch (_actionIndex++) {
case 0: {
- scene->_field3E28[scene->_field3E26] = scene->_field3EF4->_field34;
- scene->_field3E26--;
+ scene->_availableCardsPile[scene->_currentDiscardIndex] = scene->_actionCard2->_cardId;
+ scene->_currentDiscardIndex--;
- scene->_field3EF4->_field34 = scene->_field3EF0->_field34;
- scene->_field3EF0->_object1.remove();
+ scene->_actionCard2->_cardId = scene->_actionCard1->_cardId;
+ scene->_actionCard1->_card.remove();
- scene->_item2._object1.setPosition(scene->_field3EF0->_field36, 0);
- scene->_item2._object1.show();
+ scene->_animatedCard._card.setPosition(scene->_actionCard1->_stationPos, 0);
+ scene->_animatedCard._card.show();
NpcMover *mover = new NpcMover();
- scene->_item2._object1.addMover(mover, &scene->_field3EF4->_field36, this);
+ scene->_animatedCard._card.addMover(mover, &scene->_actionCard2->_stationPos, this);
}
break;
case 1:
- scene->_item2._object1.hide();
+ scene->_animatedCard._card.hide();
- if (scene->_field3EF0 == &scene->_item6) {
- subD18B5(5, 1, 4);
+ if (scene->_actionCard1 == &scene->_selectedCard) {
+ scene->setCursorData(5, 1, 4);
scene->subC4CEC();
}
- scene->setAnimationInfo(scene->_field3EF4);
+ scene->setAnimationInfo(scene->_actionCard2);
scene->_aSound1.play(58);
- scene->subC4A39(scene->_field3EF4);
+ scene->discardCard(scene->_actionCard2);
break;
default:
break;
}
}
+// Play delay card
void Scene1337::Action9::signal() {
Scene1337 *scene = (Scene1337 *)R2_GLOBALS._sceneManager._scene;
switch (_actionIndex++) {
case 0: {
- scene->_field3EF4->_field34 = scene->_field3EF0->_field34;
- scene->_field3EF4->_object1.postInit();
- scene->_field3EF4->_object1.hide();
- scene->_field3EF4->_object1.setVisage(1332);
- scene->_field3EF4->_object1.setPosition(scene->_field3EF4->_field36, 0);
- scene->_field3EF4->_object1.fixPriority(170);
+ scene->_actionCard2->_cardId = scene->_actionCard1->_cardId;
+ scene->_actionCard2->_card.postInit();
+ scene->_actionCard2->_card.hide();
+ scene->_actionCard2->_card.setVisage(1332);
+ scene->_actionCard2->_card.setPosition(scene->_actionCard2->_stationPos, 0);
+ scene->_actionCard2->_card.fixPriority(170);
- scene->_field3EF0->_field34 = 0;
- scene->_field3EF0->_object1.remove();
+ scene->_actionCard1->_cardId = 0;
+ scene->_actionCard1->_card.remove();
- scene->_item2._object1.setPosition(scene->_field3EF0->_field36, 0);
- scene->_item2._object1.show();
+ scene->_animatedCard._card.setPosition(scene->_actionCard1->_stationPos, 0);
+ scene->_animatedCard._card.show();
NpcMover *mover = new NpcMover();
- scene->_item2._object1.addMover(mover, &scene->_field3EF4->_field36, this);
+ scene->_animatedCard._card.addMover(mover, &scene->_actionCard2->_stationPos, this);
}
break;
case 1:
- scene->_item2._object1.hide();
- scene->setAnimationInfo(scene->_field3EF4);
+ scene->_animatedCard._card.hide();
+ scene->setAnimationInfo(scene->_actionCard2);
scene->_aSound1.play(57);
- if (scene->_field3EF0 == &scene->_item6) {
- subD18B5(5, 1, 4);
+ if (scene->_actionCard1 == &scene->_selectedCard) {
+ scene->setCursorData(5, 1, 4);
scene->subC4CEC();
}
- scene->subC20F9();
+ scene->handleNextTurn();
break;
default:
break;
}
}
+// Counter a trick with a card
void Scene1337::Action10::signal() {
Scene1337 *scene = (Scene1337 *)R2_GLOBALS._sceneManager._scene;
switch (_actionIndex++) {
case 0: {
- scene->_field3EF8->_object1.postInit();
- scene->_field3EF8->_object1.hide();
- scene->_field3EF8->_object1.setVisage(1332);
- scene->_field3EF8->_object1.setPosition(scene->_field3EF8->_field36, 0);
- scene->_field3EF8->_object1.fixPriority(170);
- scene->_field3EF8->_field34 = scene->_field3EF0->_field34;
-
- scene->_field3EF0->_field34 = 0;
- scene->_field3EF0->_object1.remove();
-
- if (scene->_field3EF0 == &scene->_item6) {
- subD18B5(5, 1, 4);
+ scene->_actionCard3->_card.postInit();
+ scene->_actionCard3->_card.hide();
+ scene->_actionCard3->_card.setVisage(1332);
+ scene->_actionCard3->_card.setPosition(scene->_actionCard3->_stationPos, 0);
+ scene->_actionCard3->_card.fixPriority(170);
+ scene->_actionCard3->_cardId = scene->_actionCard1->_cardId;
+
+ scene->_actionCard1->_cardId = 0;
+ scene->_actionCard1->_card.remove();
+
+ if (scene->_actionCard1 == &scene->_selectedCard) {
+ scene->setCursorData(5, 1, 4);
scene->subC4CEC();
}
- scene->_item2._object1.setPosition(scene->_field3EF0->_field36, 0);
- scene->_item2._object1.show();
+ scene->_animatedCard._card.setPosition(scene->_actionCard1->_stationPos, 0);
+ scene->_animatedCard._card.show();
NpcMover *mover = new NpcMover();
- scene->_item2._object1.addMover(mover, &scene->_field3EF8->_field36, this);
+ scene->_animatedCard._card.addMover(mover, &scene->_actionCard3->_stationPos, this);
}
break;
case 1: {
- scene->_item2._object1.hide();
- scene->setAnimationInfo(scene->_field3EF8);
+ scene->_animatedCard._card.hide();
+ scene->setAnimationInfo(scene->_actionCard3);
scene->_aSound1.play(57);
bool found = false;
int indexFound = -1;
- switch (scene->_field4240) {
+ switch (scene->_actionIdx1) {
case 0:
for (indexFound = 0; indexFound < 3; indexFound++) {
- if (scene->_arrunkObj1337[0]._arr1[indexFound]._field34 == 29) {
+ if (scene->_gameBoardSide[0]._handCard[indexFound]._cardId == 29) {
found = true;
break;
}
@@ -3739,7 +3786,7 @@ void Scene1337::Action10::signal() {
break;
case 1:
for (indexFound = 0; indexFound < 3; indexFound++) {
- if (scene->_arrunkObj1337[1]._arr1[indexFound]._field34 == 29) {
+ if (scene->_gameBoardSide[1]._handCard[indexFound]._cardId == 29) {
found = true;
break;
}
@@ -3747,7 +3794,7 @@ void Scene1337::Action10::signal() {
break;
case 2:
for (indexFound = 0; indexFound < 3; indexFound++) {
- if (scene->_arrunkObj1337[2]._arr1[indexFound]._field34 == 29) {
+ if (scene->_gameBoardSide[2]._handCard[indexFound]._cardId == 29) {
found = true;
break;
}
@@ -3755,7 +3802,7 @@ void Scene1337::Action10::signal() {
break;
case 3:
for (indexFound = 0; indexFound < 3; indexFound++) {
- if (scene->_arrunkObj1337[3]._arr1[indexFound]._field34 == 29) {
+ if (scene->_gameBoardSide[3]._handCard[indexFound]._cardId == 29) {
found = true;
break;
}
@@ -3768,13 +3815,13 @@ void Scene1337::Action10::signal() {
bool found2 = false;
if (found) {
- switch (scene->_field4240) {
+ switch (scene->_actionIdx1) {
case 0:
- scene->subC51A0(&scene->_arrunkObj1337[0]._arr1[indexFound], scene->_field3EF8);
+ scene->subC51A0(&scene->_gameBoardSide[0]._handCard[indexFound], scene->_actionCard3);
found2 = true;
break;
case 1:
- scene->subC51A0(&scene->_arrunkObj1337[1]._arr1[indexFound], scene->_field3EF8);
+ scene->subC51A0(&scene->_gameBoardSide[1]._handCard[indexFound], scene->_actionCard3);
found2 = true;
break;
case 2:
@@ -3782,12 +3829,12 @@ void Scene1337::Action10::signal() {
if (MessageDialog::show(USE_INTERCEPTOR, NO_MSG, YES_MSG) == 0)
scene->subC4CEC();
else {
- scene->subC51A0(&scene->_arrunkObj1337[2]._arr1[indexFound], scene->_field3EF8);
+ scene->subC51A0(&scene->_gameBoardSide[2]._handCard[indexFound], scene->_actionCard3);
found2 = true;
}
break;
case 3:
- scene->subC51A0(&scene->_arrunkObj1337[3]._arr1[indexFound], scene->_field3EF8);
+ scene->subC51A0(&scene->_gameBoardSide[3]._handCard[indexFound], scene->_actionCard3);
found2 = true;
break;
default:
@@ -3798,17 +3845,17 @@ void Scene1337::Action10::signal() {
if (!found2)
break;
- if (scene->_field4240 == 2) {
+ if (scene->_actionIdx1 == 2) {
int j = 0;
for (int i = 0; i <= 7; i++) {
- if (scene->_arrunkObj1337[2]._arr2[i]._field34 != 0)
+ if (scene->_gameBoardSide[2]._outpostStation[i]._cardId != 0)
++j;
}
if (j <= 1) {
for (int i = 0; i <= 7; i++) {
- if (scene->_arrunkObj1337[2]._arr2[i]._field34 != 0) {
- scene->_field3EF4 = &scene->_arrunkObj1337[2]._arr2[i];
+ if (scene->_gameBoardSide[2]._outpostStation[i]._cardId != 0) {
+ scene->_actionCard2 = &scene->_gameBoardSide[2]._outpostStation[i];
break;
}
}
@@ -3827,11 +3874,11 @@ void Scene1337::Action10::signal() {
g_globals->_events.delay(g_globals->_sceneHandler->_delayTicks);
}
- scene->_item6._field36 = event.mousePos;
+ scene->_selectedCard._stationPos = event.mousePos;
for (int i = 0; i <= 7; i++) {
- if ((scene->subC2BF8(&scene->_arrunkObj1337[2]._arr2[i], scene->_item6._field36) != 0) && (scene->_arrunkObj1337[2]._arr2[i]._field34 != 0)) {
- scene->_field3EF4 = &scene->_arrunkObj1337[2]._arr2[0];
+ if (scene->_gameBoardSide[2]._outpostStation[i].isIn(scene->_selectedCard._stationPos) && (scene->_gameBoardSide[2]._outpostStation[i]._cardId != 0)) {
+ scene->_actionCard2 = &scene->_gameBoardSide[2]._outpostStation[0];
found2 = true;
break;
}
@@ -3841,143 +3888,144 @@ void Scene1337::Action10::signal() {
}
}
- scene->_field3E28[scene->_field3E26] = scene->_field3EF4->_field34;
- scene->_field3E26--;
- scene->_field3EF4->_field34 = 0;
- scene->_field3EF4->_object1.remove();
+ scene->_availableCardsPile[scene->_currentDiscardIndex] = scene->_actionCard2->_cardId;
+ scene->_currentDiscardIndex--;
+ scene->_actionCard2->_cardId = 0;
+ scene->_actionCard2->_card.remove();
- scene->_item2._object1.setPosition(scene->_field3EF4->_field36, 0);
- scene->_item2._object1.show();
+ scene->_animatedCard._card.setPosition(scene->_actionCard2->_stationPos, 0);
+ scene->_animatedCard._card.show();
NpcMover *mover = new NpcMover();
- scene->_item2._object1.addMover(mover, &scene->_field3EF8->_field36, this);
+ scene->_animatedCard._card.addMover(mover, &scene->_actionCard3->_stationPos, this);
}
break;
case 2:
- scene->_item2._object1.hide();
- scene->subC4A39(scene->_field3EF8);
+ scene->_animatedCard._card.hide();
+ scene->discardCard(scene->_actionCard3);
break;
default:
break;
}
}
+// Use trick (card #25 - thieft ?) and pick a card from the opponent
void Scene1337::Action11::signal() {
Scene1337 *scene = (Scene1337 *)R2_GLOBALS._sceneManager._scene;
- bool noAction = true;
-
switch (_actionIndex++) {
case 0: {
- scene->_field3EF4->_object1.postInit();
- scene->_field3EF4->_object1.hide();
- scene->_field3EF4->_object1.setVisage(1332);
- scene->_field3EF4->_object1.setPosition(scene->_field3EF4->_field36, 0);
- scene->_field3EF4->_object1.fixPriority(170);
- scene->_field3EF4->_field34 = 25;
-
- if (scene->_field4240 == 2) {
- scene->_item2._object1.setPosition(scene->_field3EF4->_field36, 0);
- subD18B5(5, 1, 4);
+ scene->_actionCard2->_card.postInit();
+ scene->_actionCard2->_card.hide();
+ scene->_actionCard2->_card.setVisage(1332);
+ scene->_actionCard2->_card.setPosition(scene->_actionCard2->_stationPos, 0);
+ scene->_actionCard2->_card.fixPriority(170);
+ scene->_actionCard2->_cardId = 25;
+
+ if (scene->_actionIdx1 == 2) {
+ scene->_animatedCard._card.setPosition(scene->_actionCard2->_stationPos, 0);
+ scene->setCursorData(5, 1, 4);
} else {
- scene->_field3EF0->_field34 = 0;
- scene->_field3EF0->_object1.remove();
- scene->_item2._object1.setPosition(scene->_field3EF0->_field36, 0);
+ scene->_actionCard1->_cardId = 0;
+ scene->_actionCard1->_card.remove();
+ scene->_animatedCard._card.setPosition(scene->_actionCard1->_stationPos, 0);
}
- scene->_item2._object1.show();
+ scene->_animatedCard._card.show();
NpcMover *mover = new NpcMover();
- scene->_item2._object1.addMover(mover, &scene->_field3EF4->_field36, this);
+ scene->_animatedCard._card.addMover(mover, &scene->_actionCard2->_stationPos, this);
}
break;
case 1: {
- scene->_item2._object1.hide();
- scene->setAnimationInfo(scene->_field3EF4);
+ scene->_animatedCard._card.hide();
+ scene->setAnimationInfo(scene->_actionCard2);
scene->_aSound1.play(57);
bool found = false;
+ bool noAction = true;
+
int i = -1;
- switch (scene->_field4242) {
+ switch (scene->_actionIdx2) {
case 0:
for (i = 0; i <= 3; i++) {
- if (scene->_arrunkObj1337[0]._arr1[i]._field34 == 27) {
+ if (scene->_gameBoardSide[0]._handCard[i]._cardId == 27) {
found = true;
break;
}
}
- if ((found) && (scene->subC3E92(scene->_field4240) != -1)) {
- scene->_field3EF0 = &scene->_arrunkObj1337[0]._arr1[i];
- scene->_field3EF4 = &scene->_arrunkObj1337[0]._arr4[0];
- if (scene->_field4240 != 0) {
- int tmpVal = scene->subC3E92(scene->_field4240);
- scene->_field3EF8 = &scene->_arrunkObj1337[scene->_field4240]._arr1[tmpVal];
+ if ((found) && (scene->getFreeHandCard(scene->_actionIdx1) != -1)) {
+ scene->_actionCard1 = &scene->_gameBoardSide[0]._handCard[i];
+ scene->_actionCard2 = &scene->_gameBoardSide[0]._emptyStationPos;
+ if (scene->_actionIdx1 != 0) {
+ int tmpVal = scene->getFreeHandCard(scene->_actionIdx1);
+ scene->_actionCard3 = &scene->_gameBoardSide[scene->_actionIdx1]._handCard[tmpVal];
}
- scene->_item1.setAction(&scene->_action12);
+ scene->_actionItem.setAction(&scene->_action12);
noAction = false;
}
break;
case 1:
for (i = 0; i <= 3; i++) {
- if (scene->_arrunkObj1337[1]._arr1[i]._field34 == 27) {
+ if (scene->_gameBoardSide[1]._handCard[i]._cardId == 27) {
found = true;
break;
}
}
- if ((found) && (scene->subC3E92(scene->_field4240) != -1)) {
- scene->_field3EF0 = &scene->_arrunkObj1337[1]._arr1[i];
- scene->_field3EF4 = &scene->_arrunkObj1337[1]._arr4[0];
- if (scene->_field4240 != 1) {
- int tmpVal = scene->subC3E92(scene->_field4240);
- scene->_field3EF8 = &scene->_arrunkObj1337[scene->_field4240]._arr1[tmpVal];
+ if ((found) && (scene->getFreeHandCard(scene->_actionIdx1) != -1)) {
+ scene->_actionCard1 = &scene->_gameBoardSide[1]._handCard[i];
+ scene->_actionCard2 = &scene->_gameBoardSide[1]._emptyStationPos;
+ if (scene->_actionIdx1 != 1) {
+ int tmpVal = scene->getFreeHandCard(scene->_actionIdx1);
+ scene->_actionCard3 = &scene->_gameBoardSide[scene->_actionIdx1]._handCard[tmpVal];
}
- scene->_item1.setAction(&scene->_action12);
+ scene->_actionItem.setAction(&scene->_action12);
noAction = false;
}
break;
case 2:
for (i = 0; i <= 3; i++) {
- if (scene->_arrunkObj1337[2]._arr1[i]._field34 == 27) {
+ if (scene->_gameBoardSide[2]._handCard[i]._cardId == 27) {
found = true;
break;
}
}
- if ((found) && (scene->subC3E92(scene->_field4240) != -1)) {
+ if ((found) && (scene->getFreeHandCard(scene->_actionIdx1) != -1)) {
scene->subC4CD2();
if (MessageDialog::show(USE_DOUBLE_AGENT, NO_MSG, YES_MSG) == 0)
scene->subC4CEC();
else {
scene->subC4CEC();
- scene->_field3EF0 = &scene->_arrunkObj1337[2]._arr1[i];
- scene->_field3EF4 = &scene->_arrunkObj1337[2]._arr4[0];
- if (scene->_field4240 != 2) {
- int tmpVal = scene->subC3E92(scene->_field4240);
- scene->_field3EF8 = &scene->_arrunkObj1337[scene->_field4240]._arr1[tmpVal];
+ scene->_actionCard1 = &scene->_gameBoardSide[2]._handCard[i];
+ scene->_actionCard2 = &scene->_gameBoardSide[2]._emptyStationPos;
+ if (scene->_actionIdx1 != 2) {
+ int tmpVal = scene->getFreeHandCard(scene->_actionIdx1);
+ scene->_actionCard3 = &scene->_gameBoardSide[scene->_actionIdx1]._handCard[tmpVal];
}
- scene->_item1.setAction(&scene->_action12);
+ scene->_actionItem.setAction(&scene->_action12);
noAction = false;
}
}
break;
case 3:
for (i = 0; i <= 3; i++) {
- if (scene->_arrunkObj1337[3]._arr1[i]._field34 == 27) {
+ if (scene->_gameBoardSide[3]._handCard[i]._cardId == 27) {
found = true;
break;
}
}
- if ((found) && (scene->subC3E92(scene->_field4240) != -1)) {
- scene->_field3EF0 = &scene->_arrunkObj1337[3]._arr1[i];
- scene->_field3EF4 = &scene->_arrunkObj1337[3]._arr4[0];
- if (scene->_field4240 != 3) {
- int tmpVal = scene->subC3E92(scene->_field4240);
- scene->_field3EF8 = &scene->_arrunkObj1337[scene->_field4240]._arr1[tmpVal];
+ if ((found) && (scene->getFreeHandCard(scene->_actionIdx1) != -1)) {
+ scene->_actionCard1 = &scene->_gameBoardSide[3]._handCard[i];
+ scene->_actionCard2 = &scene->_gameBoardSide[3]._emptyStationPos;
+ if (scene->_actionIdx1 != 3) {
+ int tmpVal = scene->getFreeHandCard(scene->_actionIdx1);
+ scene->_actionCard3 = &scene->_gameBoardSide[scene->_actionIdx1]._handCard[tmpVal];
}
- scene->_item1.setAction(&scene->_action12);
+ scene->_actionItem.setAction(&scene->_action12);
noAction = false;
}
break;
@@ -3988,11 +4036,11 @@ void Scene1337::Action11::signal() {
if (!noAction)
return;
- if (scene->_field4240 == 2) {
+ if (scene->_actionIdx1 == 2) {
int count = 0;
- if (scene->_field4242 != 2) {
+ if (scene->_actionIdx2 != 2) {
for (i = 0; i <= 3; i++) {
- if (scene->_arrunkObj1337[scene->_field4242]._arr1[i]._field34 == 0)
+ if (scene->_gameBoardSide[scene->_actionIdx2]._handCard[i]._cardId == 0)
++count;
}
}
@@ -4002,7 +4050,7 @@ void Scene1337::Action11::signal() {
found = false;
while (!found) {
- switch (scene->_field4242) {
+ switch (scene->_actionIdx2) {
case 0:
scene->actionDisplay(1330, 131, 159, 10, 1, 200, 0, 7, 0, 154, 154);
break;
@@ -4023,81 +4071,76 @@ void Scene1337::Action11::signal() {
g_globals->_events.delay(g_globals->_sceneHandler->_delayTicks);
}
- scene->_item6._field36 = event.mousePos;
+ scene->_selectedCard._stationPos = event.mousePos;
found = false;
- if (scene->_field4242 != 2) {
+ if (scene->_actionIdx2 != 2) {
for (i = 0; i <= 3; i++) {
- if ((scene->subC2BF8(&scene->_arrunkObj1337[scene->_field4242]._arr1[i], scene->_item6._field36) != 0) && (scene->_arrunkObj1337[scene->_field4242]._arr1[i]._field34 != 0)) {
- scene->_field3EF8 = &scene->_arrunkObj1337[scene->_field4242]._arr1[i];
+ if (scene->_gameBoardSide[scene->_actionIdx2]._handCard[i].isIn(scene->_selectedCard._stationPos) && (scene->_gameBoardSide[scene->_actionIdx2]._handCard[i]._cardId != 0)) {
+ scene->_actionCard3 = &scene->_gameBoardSide[scene->_actionIdx2]._handCard[i];
found = true;
break;
}
}
}
} // while
- scene->_field4246 = 1;
+ scene->_displayHelpFl = true;
scene->subC4CEC();
- } else {
- if (scene->_field4242 != 2) {
- int tmpVal = scene->subC3E92(scene->_field4242);
- scene->_field3EF8 = &scene->_arrunkObj1337[scene->_field4242]._arr1[tmpVal];
- }
+ } else if (scene->_actionIdx2 != 2) {
+ int tmpVal = scene->getFreeHandCard(scene->_actionIdx2);
+ scene->_actionCard3 = &scene->_gameBoardSide[scene->_actionIdx2]._handCard[tmpVal];
}
}
- scene->_field3EF0->_object1.postInit();
- scene->_field3EF0->_object1.hide();
- scene->_field3EF0->_object1.setVisage(1332);
- scene->_field3EF0->_object1.setPosition(scene->_field3EF0->_field36, 0);
- scene->_field3EF0->_object1.fixPriority(170);
- scene->_field3EF0->_object1.setStrip2(1);
- scene->_field3EF0->_field34 = scene->_field3EF8->_field34;
+ scene->_actionCard1->_card.postInit();
+ scene->_actionCard1->_card.hide();
+ scene->_actionCard1->_card.setVisage(1332);
+ scene->_actionCard1->_card.setPosition(scene->_actionCard1->_stationPos, 0);
+ scene->_actionCard1->_card.fixPriority(170);
+ scene->_actionCard1->_card.setStrip2(1);
+ scene->_actionCard1->_cardId = scene->_actionCard3->_cardId;
- scene->_field3EF8->_field34 = 0;
- scene->_field3EF8->_object1.remove();
+ scene->_actionCard3->_cardId = 0;
+ scene->_actionCard3->_card.remove();
- scene->_item2._object1.setPosition(scene->_field3EF8->_field36, 0);
- scene->_item2._object1.show();
+ scene->_animatedCard._card.setPosition(scene->_actionCard3->_stationPos, 0);
+ scene->_animatedCard._card.show();
NpcMover *mover = new NpcMover();
- scene->_item2._object1.addMover(mover, &scene->_field3EF0->_field36, this);
+ scene->_animatedCard._card.addMover(mover, &scene->_actionCard1->_stationPos, this);
}
break;
case 2:
- scene->_item2._object1.hide();
- switch (scene->_field4240) {
+ scene->_animatedCard._card.hide();
+ switch (scene->_actionIdx1) {
case 0:
- scene->_field3EF0->_object1.setFrame(2);
- scene->_field3EF0->_object1.show();
- scene->_field423E--;
- scene->_field4244 = 0;
+ scene->_actionCard1->_card.setFrame2(2);
+ scene->_actionCard1->_card.show();
break;
case 1:
- scene->_field3EF0->_object1.setFrame(4);
- scene->_field3EF0->_object1.show();
- scene->_field423E--;
- scene->_field4244 = 0;
+ scene->_actionCard1->_card.setFrame2(4);
+ scene->_actionCard1->_card.show();
break;
case 3:
- scene->_field3EF0->_object1.setFrame(3);
- scene->_field3EF0->_object1.show();
- scene->_field423E--;
- scene->_field4244 = 0;
+ scene->_actionCard1->_card.setFrame2(3);
+ scene->_actionCard1->_card.show();
break;
default:
- scene->setAnimationInfo(scene->_field3EF0);
+ scene->setAnimationInfo(scene->_actionCard1);
break;
}
- scene->subC4A39(scene->_field3EF4);
+ scene->_currentPlayerNumb--;
+ scene->_showPlayerTurn = false;
+ scene->discardCard(scene->_actionCard2);
break;
default:
break;
}
}
+// Pick a card in opponent hand
void Scene1337::Action12::signal() {
Scene1337 *scene = (Scene1337 *)R2_GLOBALS._sceneManager._scene;
@@ -4106,40 +4149,42 @@ void Scene1337::Action12::signal() {
signal();
break;
case 1: {
- scene->_field3E28[scene->_field3E26] = scene->_field3EF4->_field34;
- scene->_field3EF4->_field34 = scene->_field3EF0->_field34;
- scene->_field3EF0->_field34 = 0;
- scene->_field3EF0->_object1.remove();
- scene->_item2._object1.setPosition(scene->_field3EF0->_field36, 0);
- scene->_item2._object1.show();
+ scene->_availableCardsPile[scene->_currentDiscardIndex] = scene->_actionCard2->_cardId;
+ scene->_currentDiscardIndex++;
+ scene->_actionCard2->_cardId = scene->_actionCard1->_cardId;
+ scene->_actionCard1->_cardId = 0;
+ scene->_actionCard1->_card.remove();
+ scene->_animatedCard._card.setPosition(scene->_actionCard1->_stationPos, 0);
+ scene->_animatedCard._card.show();
NpcMover *mover = new NpcMover();
- scene->_item2._object1.addMover(mover, &scene->_field3EF4->_field36, this);
+ scene->_animatedCard._card.addMover(mover, &scene->_actionCard2->_stationPos, this);
}
break;
case 2:
- scene->_item2._object1.hide();
- scene->setAnimationInfo(scene->_field3EF4);
+ scene->_animatedCard._card.hide();
+ scene->setAnimationInfo(scene->_actionCard2);
scene->_aSound1.play(58);
- if (scene->_field4242 == 2) {
+ if (scene->_actionIdx2 == 2) {
int count = 0;
int i = -1;
- switch (scene->_field4240) {
+ switch (scene->_actionIdx1) {
case 0:
for (i = 0; i <= 3; i++) {
- if (scene->_arrunkObj1337[0]._arr1[i]._field34 != 0)
+ if (scene->_gameBoardSide[0]._handCard[i]._cardId != 0)
++count;
}
break;
case 1:
for (i = 0; i <= 3; i++) {
- if (scene->_arrunkObj1337[3]._arr1[i]._field34 != 0)
+ // The original game was counting in the hand of player 3, which is obviously wrong
+ if (scene->_gameBoardSide[1]._handCard[i]._cardId != 0)
++count;
}
break;
case 3:
for (i = 0; i <= 3; i++) {
- if (scene->_arrunkObj1337[3]._arr1[i]._field34 != 0)
+ if (scene->_gameBoardSide[3]._handCard[i]._cardId != 0)
++count;
}
break;
@@ -4153,7 +4198,7 @@ void Scene1337::Action12::signal() {
bool found = false;
while (!found) {
- switch (scene->_field4240) {
+ switch (scene->_actionIdx1) {
case 0:
scene->actionDisplay(1330, 131, 159, 10, 1, 200, 0, 7, 0, 154, 154);
break;
@@ -4174,95 +4219,94 @@ void Scene1337::Action12::signal() {
g_globals->_events.delay(g_globals->_sceneHandler->_delayTicks);
}
- scene->_item6._field36 = event.mousePos;
+ scene->_selectedCard._stationPos = event.mousePos;
- if (scene->_field4240 == 0) {
+ if (scene->_actionIdx1 == 0) {
for (i = 0; i <= 3; i++) {
- if ((scene->subC2BF8(&scene->_arrunkObj1337[0]._arr1[i], scene->_item6._field36) != 0) && (scene->_arrunkObj1337[0]._arr1[i]._field34 != 0)) {
+ if (scene->_gameBoardSide[0]._handCard[i].isIn(scene->_selectedCard._stationPos) && (scene->_gameBoardSide[0]._handCard[i]._cardId != 0)) {
found = true;
- scene->_field3EF8 = &scene->_arrunkObj1337[0]._arr1[i];
+ scene->_actionCard3 = &scene->_gameBoardSide[0]._handCard[i];
break;
}
}
}
- if (scene->_field4240 == 3) {
+ if (scene->_actionIdx1 == 3) {
for (i = 0; i <= 3; i++) {
- if ((scene->subC2BF8(&scene->_arrunkObj1337[3]._arr1[i], scene->_item6._field36) != 0) && (scene->_arrunkObj1337[3]._arr1[i]._field34 != 0)) {
+ if (scene->_gameBoardSide[3]._handCard[i].isIn(scene->_selectedCard._stationPos) && (scene->_gameBoardSide[3]._handCard[i]._cardId != 0)) {
found = true;
- scene->_field3EF8 = &scene->_arrunkObj1337[3]._arr1[i];
+ scene->_actionCard3 = &scene->_gameBoardSide[3]._handCard[i];
break;
}
}
}
- if (scene->_field4240 == 1) {
+ if (scene->_actionIdx1 == 1) {
for (i = 0; i <= 3; i++) {
- if ((scene->subC2BF8(&scene->_arrunkObj1337[1]._arr1[i], scene->_item6._field36) != 0) && (scene->_arrunkObj1337[1]._arr1[i]._field34 != 0)) {
+ if (scene->_gameBoardSide[1]._handCard[i].isIn(scene->_selectedCard._stationPos) && (scene->_gameBoardSide[1]._handCard[i]._cardId != 0)) {
found = true;
- scene->_field3EF8 = &scene->_arrunkObj1337[1]._arr1[i];
+ scene->_actionCard3 = &scene->_gameBoardSide[1]._handCard[i];
break;
}
}
}
}
scene->subC4CEC();
- } else {
- if (scene->_field4240 != 1) {
- switch (scene->_field4240) {
- case 0:
- scene->_field3EF8 = &scene->_arrunkObj1337[0]._arr1[scene->subC3E92(0)];
- break;
- case 3:
- scene->_field3EF8 = &scene->_arrunkObj1337[3]._arr1[scene->subC3E92(3)];
- break;
- default:
- break;
- }
- } else {
- scene->_field3EF8 = &scene->_arrunkObj1337[1]._arr1[scene->subC3E92(1)];
+ } else if (scene->_actionIdx1 != 1) {
+ switch (scene->_actionIdx1) {
+ case 0:
+ scene->_actionCard3 = &scene->_gameBoardSide[0]._handCard[scene->getFreeHandCard(0)];
+ break;
+ case 3:
+ scene->_actionCard3 = &scene->_gameBoardSide[3]._handCard[scene->getFreeHandCard(3)];
+ break;
+ default:
+ break;
}
+ } else {
+ scene->_actionCard3 = &scene->_gameBoardSide[1]._handCard[scene->getFreeHandCard(1)];
}
- scene->_field3EF0->_object1.postInit();
- scene->_field3EF0->_object1.hide();
- scene->_field3EF0->_object1.setVisage(1332);
- scene->_field3EF0->_object1.setPosition(scene->_field3EF0->_field36);
- scene->_field3EF0->_object1.fixPriority(170);
- scene->_field3EF0->_object1.setStrip2(1);
- scene->_field3EF0->_field34 = scene->_field3EF8->_field34;
+ scene->_actionCard1->_card.postInit();
+ scene->_actionCard1->_card.hide();
+ scene->_actionCard1->_card.setVisage(1332);
+ scene->_actionCard1->_card.setPosition(scene->_actionCard1->_stationPos);
+ scene->_actionCard1->_card.fixPriority(170);
+ scene->_actionCard1->_card.setStrip2(1);
+ scene->_actionCard1->_cardId = scene->_actionCard3->_cardId;
- scene->_field3EF8->_field34 = 0;
- scene->_field3EF8->_object1.remove();
+ scene->_actionCard3->_cardId = 0;
+ scene->_actionCard3->_card.remove();
- scene->_item2._object1.setPosition(scene->_field3EF8->_field36);
- scene->_item2._object1.show();
+ scene->_animatedCard._card.setPosition(scene->_actionCard3->_stationPos);
+ scene->_animatedCard._card.show();
scene->_aSound1.play(57);
NpcMover *mover = new NpcMover();
- scene->_item2._object1.addMover(mover, &scene->_field3EF0->_field36, this);
+ scene->_animatedCard._card.addMover(mover, &scene->_actionCard1->_stationPos, this);
}
break;
case 3:
- scene->_item2._object1.hide();
- switch (scene->_field4242) {
+ scene->_animatedCard._card.hide();
+ switch (scene->_actionIdx2) {
case 0:
- scene->_field3EF0->_object1.setFrame2(2);
- scene->_field3EF0->_object1.show();
+ scene->_actionCard1->_card.setFrame2(2);
+ scene->_actionCard1->_card.show();
break;
case 1:
- scene->_field3EF0->_object1.setFrame2(4);
- scene->_field3EF0->_object1.show();
+ scene->_actionCard1->_card.setFrame2(4);
+ scene->_actionCard1->_card.show();
break;
case 3:
- scene->_field3EF0->_object1.setFrame2(3);
- scene->_field3EF0->_object1.show();
+ scene->_actionCard1->_card.setFrame2(3);
+ scene->_actionCard1->_card.show();
break;
default:
- scene->setAnimationInfo(scene->_field3EF0);
+ scene->setAnimationInfo(scene->_actionCard1);
break;
}
- scene->subC4A39(scene->_field3EF4);
+ scene->discardCard(scene->_actionCard2);
+ scene->handleNextTurn();
break;
default:
break;
@@ -4274,29 +4318,29 @@ void Scene1337::Action13::signal() {
switch (_actionIndex++) {
case 0: {
- scene->_field3E28[scene->_field3E26] = scene->_field3EF4->_field34;
- scene->_field3E26--;
+ scene->_availableCardsPile[scene->_currentDiscardIndex] = scene->_actionCard2->_cardId;
+ scene->_currentDiscardIndex--;
- scene->_field3EF4->_field34 = scene->_field3EF0->_field34;
+ scene->_actionCard2->_cardId = scene->_actionCard1->_cardId;
- scene->_field3EF0->_field34 = 0;
- scene->_field3EF0->_object1.remove();
+ scene->_actionCard1->_cardId = 0;
+ scene->_actionCard1->_card.remove();
- scene->_item2._object1.setPosition(scene->_field3EF0->_field36, 0);
- scene->_item2._object1.show();
+ scene->_animatedCard._card.setPosition(scene->_actionCard1->_stationPos, 0);
+ scene->_animatedCard._card.show();
NpcMover *mover = new NpcMover();
- scene->_item2._object1.addMover(mover, &scene->_field3EF4->_field36, this);
+ scene->_animatedCard._card.addMover(mover, &scene->_actionCard2->_stationPos, this);
}
break;
case 1:
- scene->_item2._object1.hide();
- scene->setAnimationInfo(scene->_field3EF4);
+ scene->_animatedCard._card.hide();
+ scene->setAnimationInfo(scene->_actionCard2);
scene->_aSound1.play(58);
signal();
break;
case 2:
- scene->subC4A39(scene->_field3EF4);
+ scene->discardCard(scene->_actionCard2);
break;
default:
break;
@@ -4307,119 +4351,123 @@ void Scene1337::postInit(SceneObjectList *OwnerList) {
// In the original, may be found in subPostInit.
// Without it, enableControl asserts
loadScene(1330);
+ R2_GLOBALS._uiElements._active = false;
SceneExt::postInit();
//
// Hide the user interface
- R2_GLOBALS._uiElements._active = false;
- BF_GLOBALS._interfaceY = 200;
+ BF_GLOBALS._interfaceY = SCREEN_HEIGHT;
+ R2_GLOBALS._uiElements._visible = false;
R2_GLOBALS._player.enableControl();
R2_GLOBALS._player._canWalk = false;
-
- _unkFctPtr412 = NULL;
-
- _field3EF0 = NULL;
- _field3EF4 = NULL;
- _field3EF8 = NULL;
-
- _arrunkObj1337[2]._arr1[0]._field36 = Common::Point(10, 174);
- _arrunkObj1337[2]._arr1[1]._field36 = Common::Point(37, 174);
- _arrunkObj1337[2]._arr1[2]._field36 = Common::Point(64, 174);
- _arrunkObj1337[2]._arr1[3]._field36 = Common::Point(91, 174);
-
- _arrunkObj1337[2]._arr2[0]._field36 = Common::Point(119, 174);
- _arrunkObj1337[2]._arr2[1]._field36 = Common::Point(119, 148);
- _arrunkObj1337[2]._arr2[2]._field36 = Common::Point(119, 122);
- _arrunkObj1337[2]._arr2[3]._field36 = Common::Point(145, 122);
- _arrunkObj1337[2]._arr2[4]._field36 = Common::Point(171, 122);
- _arrunkObj1337[2]._arr2[5]._field36 = Common::Point(171, 148);
- _arrunkObj1337[2]._arr2[6]._field36 = Common::Point(171, 174);
- _arrunkObj1337[2]._arr2[7]._field36 = Common::Point(145, 174);
-
- _arrunkObj1337[2]._arr3[0]._field36 = Common::Point(199, 174);
-
- _arrunkObj1337[2]._arr4[0]._field36 = Common::Point(145, 148);
-
- _arrunkObj1337[2]._fieldB94 = Common::Point(10, 174);
- _arrunkObj1337[2]._fieldB98 = Common::Point(37, 174);
- _arrunkObj1337[2]._fieldB9C = Common::Point(64, 174);
- _arrunkObj1337[2]._fieldBA0 = Common::Point(91, 174);
- _arrunkObj1337[2]._fieldBA4 = 2;
-
- _arrunkObj1337[3]._arr1[0]._field36 = Common::Point(14, 14);
- _arrunkObj1337[3]._arr1[1]._field36 = Common::Point(14, 36);
- _arrunkObj1337[3]._arr1[2]._field36 = Common::Point(14, 58);
- _arrunkObj1337[3]._arr1[3]._field36 = Common::Point(14, 80);
-
- _arrunkObj1337[3]._arr2[0]._field36 = Common::Point(37, 66);
- _arrunkObj1337[3]._arr2[1]._field36 = Common::Point(63, 66);
- _arrunkObj1337[3]._arr2[2]._field36 = Common::Point(89, 66);
- _arrunkObj1337[3]._arr2[3]._field36 = Common::Point(89, 92);
- _arrunkObj1337[3]._arr2[4]._field36 = Common::Point(89, 118);
- _arrunkObj1337[3]._arr2[5]._field36 = Common::Point(63, 118);
- _arrunkObj1337[3]._arr2[6]._field36 = Common::Point(37, 118);
- _arrunkObj1337[3]._arr2[7]._field36 = Common::Point(37, 92);
-
- _arrunkObj1337[3]._arr3[0]._field36 = Common::Point(37, 145);
-
- _arrunkObj1337[3]._arr4[0]._field36 = Common::Point(63, 92);
-
- _arrunkObj1337[3]._fieldB94 = Common::Point(14, 14);
- _arrunkObj1337[3]._fieldB98 = Common::Point(14, 36);
- _arrunkObj1337[3]._fieldB9C = Common::Point(14, 58);
- _arrunkObj1337[3]._fieldBA0 = Common::Point(14, 80);
- _arrunkObj1337[3]._fieldBA4 = 3;
-
- _arrunkObj1337[0]._arr1[0]._field36 = Common::Point(280, 5);
- _arrunkObj1337[0]._arr1[1]._field36 = Common::Point(253, 5);
- _arrunkObj1337[0]._arr1[2]._field36 = Common::Point(226, 5);
- _arrunkObj1337[0]._arr1[3]._field36 = Common::Point(199, 5);
-
- _arrunkObj1337[0]._arr2[0]._field36 = Common::Point(171, 16);
- _arrunkObj1337[0]._arr2[1]._field36 = Common::Point(171, 42);
- _arrunkObj1337[0]._arr2[2]._field36 = Common::Point(171, 68);
- _arrunkObj1337[0]._arr2[3]._field36 = Common::Point(145, 68);
- _arrunkObj1337[0]._arr2[4]._field36 = Common::Point(119, 68);
- _arrunkObj1337[0]._arr2[5]._field36 = Common::Point(119, 42);
- _arrunkObj1337[0]._arr2[6]._field36 = Common::Point(119, 16);
- _arrunkObj1337[0]._arr2[7]._field36 = Common::Point(145, 16);
-
- _arrunkObj1337[0]._arr3[0]._field36 = Common::Point(91, 16);
-
- _arrunkObj1337[0]._arr4[0]._field36 = Common::Point(145, 42);
-
- _arrunkObj1337[0]._fieldB94 = Common::Point(280, 5);
- _arrunkObj1337[0]._fieldB98 = Common::Point(253, 5);
- _arrunkObj1337[0]._fieldB9C = Common::Point(226, 5);
- _arrunkObj1337[0]._fieldBA0 = Common::Point(199, 5);
- _arrunkObj1337[0]._fieldBA4 = 2;
-
- _arrunkObj1337[1]._arr1[0]._field36 = Common::Point(283, 146);
- _arrunkObj1337[1]._arr1[1]._field36 = Common::Point(283, 124);
- _arrunkObj1337[1]._arr1[2]._field36 = Common::Point(283, 102);
- _arrunkObj1337[1]._arr1[3]._field36 = Common::Point(283, 80);
-
- _arrunkObj1337[1]._arr2[0]._field36 = Common::Point(253, 122);
- _arrunkObj1337[1]._arr2[1]._field36 = Common::Point(227, 122);
- _arrunkObj1337[1]._arr2[2]._field36 = Common::Point(201, 122);
- _arrunkObj1337[1]._arr2[3]._field36 = Common::Point(201, 96);
- _arrunkObj1337[1]._arr2[4]._field36 = Common::Point(201, 70);
- _arrunkObj1337[1]._arr2[5]._field36 = Common::Point(227, 70);
- _arrunkObj1337[1]._arr2[6]._field36 = Common::Point(253, 70);
- _arrunkObj1337[1]._arr2[7]._field36 = Common::Point(253, 96);
-
- _arrunkObj1337[1]._arr3[0]._field36 = Common::Point(253, 43);
-
- _arrunkObj1337[1]._arr4[0]._field36 = Common::Point(227, 96);
-
- _arrunkObj1337[1]._fieldB94 = Common::Point(283, 146);
- _arrunkObj1337[1]._fieldB98 = Common::Point(283, 124);
- _arrunkObj1337[1]._fieldB9C = Common::Point(283, 102);
- _arrunkObj1337[1]._fieldBA0 = Common::Point(283, 80);
- _arrunkObj1337[1]._fieldBA4 = 4;
+ R2_GLOBALS._player._uiEnabled = false;
+
+ _delayedFunction = nullptr;
+
+ _actionCard1 = nullptr;
+ _actionCard2 = nullptr;
+ _actionCard3 = nullptr;
+
+ _gameBoardSide[2]._handCard[0]._stationPos = Common::Point(10, 174);
+ _gameBoardSide[2]._handCard[1]._stationPos = Common::Point(37, 174);
+ _gameBoardSide[2]._handCard[2]._stationPos = Common::Point(64, 174);
+ _gameBoardSide[2]._handCard[3]._stationPos = Common::Point(91, 174);
+
+ _gameBoardSide[2]._outpostStation[0]._stationPos = Common::Point(119, 174);
+ _gameBoardSide[2]._outpostStation[1]._stationPos = Common::Point(119, 148);
+ _gameBoardSide[2]._outpostStation[2]._stationPos = Common::Point(119, 122);
+ _gameBoardSide[2]._outpostStation[3]._stationPos = Common::Point(145, 122);
+ _gameBoardSide[2]._outpostStation[4]._stationPos = Common::Point(171, 122);
+ _gameBoardSide[2]._outpostStation[5]._stationPos = Common::Point(171, 148);
+ _gameBoardSide[2]._outpostStation[6]._stationPos = Common::Point(171, 174);
+ _gameBoardSide[2]._outpostStation[7]._stationPos = Common::Point(145, 174);
+
+ _gameBoardSide[2]._delayCard._stationPos = Common::Point(199, 174);
+
+ _gameBoardSide[2]._emptyStationPos._stationPos = Common::Point(145, 148);
+
+ _gameBoardSide[2]._card1Pos = Common::Point(10, 174);
+ _gameBoardSide[2]._card2Pos = Common::Point(37, 174);
+ _gameBoardSide[2]._card3Pos = Common::Point(64, 174);
+ _gameBoardSide[2]._card4Pos = Common::Point(91, 174);
+ _gameBoardSide[2]._frameNum = 2;
+
+ _gameBoardSide[3]._handCard[0]._stationPos = Common::Point(14, 14);
+ _gameBoardSide[3]._handCard[1]._stationPos = Common::Point(14, 36);
+ _gameBoardSide[3]._handCard[2]._stationPos = Common::Point(14, 58);
+ _gameBoardSide[3]._handCard[3]._stationPos = Common::Point(14, 80);
+
+ _gameBoardSide[3]._outpostStation[0]._stationPos = Common::Point(37, 66);
+ _gameBoardSide[3]._outpostStation[1]._stationPos = Common::Point(63, 66);
+ _gameBoardSide[3]._outpostStation[2]._stationPos = Common::Point(89, 66);
+ _gameBoardSide[3]._outpostStation[3]._stationPos = Common::Point(89, 92);
+ _gameBoardSide[3]._outpostStation[4]._stationPos = Common::Point(89, 118);
+ _gameBoardSide[3]._outpostStation[5]._stationPos = Common::Point(63, 118);
+ _gameBoardSide[3]._outpostStation[6]._stationPos = Common::Point(37, 118);
+ _gameBoardSide[3]._outpostStation[7]._stationPos = Common::Point(37, 92);
+
+ _gameBoardSide[3]._delayCard._stationPos = Common::Point(37, 145);
+
+ _gameBoardSide[3]._emptyStationPos._stationPos = Common::Point(63, 92);
+
+ _gameBoardSide[3]._card1Pos = Common::Point(14, 14);
+ _gameBoardSide[3]._card2Pos = Common::Point(14, 36);
+ _gameBoardSide[3]._card3Pos = Common::Point(14, 58);
+ _gameBoardSide[3]._card4Pos = Common::Point(14, 80);
+ _gameBoardSide[3]._frameNum = 3;
+
+ _gameBoardSide[0]._handCard[0]._stationPos = Common::Point(280, 5);
+ _gameBoardSide[0]._handCard[1]._stationPos = Common::Point(253, 5);
+ _gameBoardSide[0]._handCard[2]._stationPos = Common::Point(226, 5);
+ _gameBoardSide[0]._handCard[3]._stationPos = Common::Point(199, 5);
+
+ _gameBoardSide[0]._outpostStation[0]._stationPos = Common::Point(171, 16);
+ _gameBoardSide[0]._outpostStation[1]._stationPos = Common::Point(171, 42);
+ _gameBoardSide[0]._outpostStation[2]._stationPos = Common::Point(171, 68);
+ _gameBoardSide[0]._outpostStation[3]._stationPos = Common::Point(145, 68);
+ _gameBoardSide[0]._outpostStation[4]._stationPos = Common::Point(119, 68);
+ _gameBoardSide[0]._outpostStation[5]._stationPos = Common::Point(119, 42);
+ _gameBoardSide[0]._outpostStation[6]._stationPos = Common::Point(119, 16);
+ _gameBoardSide[0]._outpostStation[7]._stationPos = Common::Point(145, 16);
+
+ _gameBoardSide[0]._delayCard._stationPos = Common::Point(91, 16);
+
+ _gameBoardSide[0]._emptyStationPos._stationPos = Common::Point(145, 42);
+
+ _gameBoardSide[0]._card1Pos = Common::Point(280, 5);
+ _gameBoardSide[0]._card2Pos = Common::Point(253, 5);
+ _gameBoardSide[0]._card3Pos = Common::Point(226, 5);
+ _gameBoardSide[0]._card4Pos = Common::Point(199, 5);
+ _gameBoardSide[0]._frameNum = 2;
+
+ _gameBoardSide[1]._handCard[0]._stationPos = Common::Point(283, 146);
+ _gameBoardSide[1]._handCard[1]._stationPos = Common::Point(283, 124);
+ _gameBoardSide[1]._handCard[2]._stationPos = Common::Point(283, 102);
+ _gameBoardSide[1]._handCard[3]._stationPos = Common::Point(283, 80);
+
+ _gameBoardSide[1]._outpostStation[0]._stationPos = Common::Point(253, 122);
+ _gameBoardSide[1]._outpostStation[1]._stationPos = Common::Point(227, 122);
+ _gameBoardSide[1]._outpostStation[2]._stationPos = Common::Point(201, 122);
+ _gameBoardSide[1]._outpostStation[3]._stationPos = Common::Point(201, 96);
+ _gameBoardSide[1]._outpostStation[4]._stationPos = Common::Point(201, 70);
+ _gameBoardSide[1]._outpostStation[5]._stationPos = Common::Point(227, 70);
+ _gameBoardSide[1]._outpostStation[6]._stationPos = Common::Point(253, 70);
+ _gameBoardSide[1]._outpostStation[7]._stationPos = Common::Point(253, 96);
+
+ _gameBoardSide[1]._delayCard._stationPos = Common::Point(253, 43);
+
+ _gameBoardSide[1]._emptyStationPos._stationPos = Common::Point(227, 96);
+
+ _gameBoardSide[1]._card1Pos = Common::Point(283, 146);
+ _gameBoardSide[1]._card2Pos = Common::Point(283, 124);
+ _gameBoardSide[1]._card3Pos = Common::Point(283, 102);
+ _gameBoardSide[1]._card4Pos = Common::Point(283, 80);
+ _gameBoardSide[1]._frameNum = 4;
subPostInit();
+
+ _stockPile.postInit();
}
void Scene1337::remove() {
@@ -4429,25 +4477,26 @@ void Scene1337::remove() {
}
R2_GLOBALS._uiElements._active = true;
+ R2_GLOBALS._uiElements._visible = true;
SceneExt::remove();
}
void Scene1337::process(Event &event) {
if (event.eventType == EVENT_BUTTON_DOWN) {
- if (event.btnState != BTNSHIFT_RIGHT) {
- subD183F(R2_GLOBALS._v5780E, 1);
+ if (event.btnState == BTNSHIFT_RIGHT) {
+ updateCursorId(R2_GLOBALS._mouseCursorId, true);
event.handled = true;
- } else if (_unkFctPtr412) {
- FunctionPtrType tmpFctPtr = _unkFctPtr412;
- _unkFctPtr412 = NULL;
+ } else if (_delayedFunction) {
+ FunctionPtrType tmpFctPtr = _delayedFunction;
+ _delayedFunction = nullptr;
(this->*tmpFctPtr)();
event.handled = true;
}
} else if (event.eventType == EVENT_KEYPRESS) {
if (event.kbd.keycode == Common::KEYCODE_SPACE) {
- if (_unkFctPtr412) {
- FunctionPtrType tmpFctPtr = _unkFctPtr412;
- _unkFctPtr412 = NULL;
+ if (_delayedFunction) {
+ FunctionPtrType tmpFctPtr = _delayedFunction;
+ _delayedFunction = nullptr;
(this->*tmpFctPtr)();
event.handled = true;
}
@@ -4460,82 +4509,85 @@ void Scene1337::process(Event &event) {
}
void Scene1337::dispatch() {
- if (_field424C == 0) {
- ++_field424E;
- if (_field424E == 4) {
- _field424C = 1;
+ if (!_instructionsDisplayedFl) {
+ ++_instructionsWaitCount;
+ if (_instructionsWaitCount == 4) {
+ _instructionsDisplayedFl = true;
suggestInstructions();
}
}
+
+ // The following code is in the original in sceneHandler::process(),
+ // which is terrible as it's checked in every scene of the game.
+ setCursorData(5, _cursorCurStrip, _cursorCurFrame);
+ //
+
Scene::dispatch();
}
-void Scene1337::actionDisplay(int resNum, int lineNum, int x, int y, int arg5, int width, int textMode, int fontNum, int colFG, int colBGExt, int colFGExt) {
+void Scene1337::actionDisplay(int resNum, int lineNum, int x, int y, int keepOnScreen, int width, int textMode, int fontNum, int colFG, int colBGExt, int colFGExt) {
// TODO: Check if it's normal that arg5 is unused and replaced by an hardcoded 0 value
// May hide an original bug
- SceneItem::display(resNum, lineNum, SET_X, x, SET_Y, y, SET_KEEP_ONSCREEN, 0, SET_WIDTH, width, SET_POS_MODE, -1, SET_TEXT_MODE, textMode, SET_FONT, fontNum, SET_FG_COLOR, colFG, SET_EXT_BGCOLOR, colBGExt, SET_EXT_FGCOLOR, colFGExt, LIST_END);
+ SceneItem::display(resNum, lineNum, SET_X, x, SET_Y, y, SET_KEEP_ONSCREEN, 0,
+ SET_WIDTH, width, SET_POS_MODE, -1, SET_TEXT_MODE, textMode,
+ SET_FONT, fontNum, SET_FG_COLOR, colFG, SET_EXT_BGCOLOR, colBGExt,
+ SET_EXT_FGCOLOR, colFGExt, LIST_END);
}
-void Scene1337::setAnimationInfo(unkObj1337sub1 *subObj) {
- if (!subObj)
+void Scene1337::setAnimationInfo(Card *card) {
+ if (!card)
return;
- if (subObj->_field34 > 9) {
- if (subObj->_field34 > 25) {
- subObj->_object1.setStrip2(4);
- subObj->_object1.setFrame(subObj->_field34 - 25);
- } else {
- subObj->_object1.setStrip2(3);
- subObj->_object1.setFrame(subObj->_field34 - 9);
- }
+ if (card->_cardId > 25) {
+ card->_card.setStrip2(4);
+ card->_card.setFrame(card->_cardId - 25);
+ } else if (card->_cardId > 9) {
+ card->_card.setStrip2(3);
+ card->_card.setFrame(card->_cardId - 9);
} else {
- subObj->_object1.setStrip2(2);
- subObj->_object1.setFrame(subObj->_field34);
+ card->_card.setStrip2(2);
+ card->_card.setFrame(card->_cardId);
}
- subObj->_object1.show();
+ card->_card.show();
R2_GLOBALS._sceneObjects->draw();
}
-void Scene1337::subC20E5() {
- subC2586();
-}
-
-void Scene1337::subC20F9() {
- switch (_field424A) {
+void Scene1337::handleNextTurn() {
+ switch (_winnerId) {
case -1:
- ++_field423E;
- if (_field423E == 3)
- _field423E = 0;
+ ++_currentPlayerNumb;
+ if (_currentPlayerNumb > 3)
+ _currentPlayerNumb = 0;
- if (_field4244 == 1) {
- _object1.show();
- switch (_field423E) {
+ if (_showPlayerTurn) {
+ _currentPlayerArrow.show();
+ switch (_currentPlayerNumb) {
case 0:
- _object1.setStrip(3);
+ _currentPlayerArrow.setStrip(3);
break;
case 1:
- _object1.setStrip(4);
+ _currentPlayerArrow.setStrip(4);
break;
case 2:
subD1975(174, 107);
- _object1.setStrip(1);
+ _currentPlayerArrow.setStrip(1);
break;
case 3:
subC4CEC();
- _object1.setStrip(2);
+ _currentPlayerArrow.setStrip(2);
break;
default:
break;
}
if (!_autoplay)
- _unkFctPtr412 = &Scene1337::subC20E5;
+ _delayedFunction = &Scene1337::handlePlayerTurn;
else
- subC20E5();
+ handlePlayerTurn();
} else {
- subC20E5();
+ handlePlayerTurn();
}
break;
case 0:
@@ -4574,38 +4626,38 @@ void Scene1337::subC20F9() {
break;
}
- if (_field424A != -1)
+ if (_winnerId != -1)
R2_GLOBALS._sceneManager.changeScene(125);
}
-void Scene1337::subC2586() {
- if (_field4244 != 0)
- _object1.hide();
+void Scene1337::handlePlayerTurn() {
+ if (_showPlayerTurn)
+ _currentPlayerArrow.hide();
- switch (_field423E) {
+ switch (_currentPlayerNumb) {
case 2:
subC4CD2();
- if (_field4246 == 1)
+ if (_displayHelpFl)
actionDisplay(1330, 114, 159, 10, 1, 200, 0, 7, 0, 154, 154);
- _field4246 = 0;
+ _displayHelpFl = false;
// No break on purpose
case 0:
// No break on purpose
case 1:
// No break on purpose
case 3:
- _item1.setAction(&_action4);
+ _actionItem.setAction(&_action4);
default:
break;
}
- _field4244 = 1;
+ _showPlayerTurn = true;
}
-bool Scene1337::subC264B(int arg1) {
- switch (arg1) {
+bool Scene1337::isStationCard(int cardId) {
+ switch (cardId) {
case 10:
// No break on purpose
case 12:
@@ -4627,8 +4679,8 @@ bool Scene1337::subC264B(int arg1) {
}
}
-bool Scene1337::subC2687(int arg1) {
- switch (arg1) {
+bool Scene1337::isStopConstructionCard(int cardId) {
+ switch (cardId) {
case 11:
// No break on purpose
case 14:
@@ -4642,43 +4694,42 @@ bool Scene1337::subC2687(int arg1) {
}
}
-int Scene1337::subC26CB(int arg1, int arg2) {
- if ((_arrunkObj1337[arg1]._arr1[arg2]._field34 > 1) && (_arrunkObj1337[arg1]._arr1[arg2]._field34 <= 9)) {
- return arg2;
- }
+int Scene1337::getStationId(int playerId, int handCardId) {
+ if ((_gameBoardSide[playerId]._handCard[handCardId]._cardId > 1) && (_gameBoardSide[playerId]._handCard[handCardId]._cardId <= 9))
+ return handCardId;
return -1;
}
-int Scene1337::subC2719(int arg1) {
+int Scene1337::findPlatformCardInHand(int playerId) {
for (int i = 0; i <= 3; i++) {
- if (_arrunkObj1337[arg1]._arr1[i]._field34 == 1)
+ if (_gameBoardSide[playerId]._handCard[i]._cardId == 1)
return i;
}
return -1;
}
-int Scene1337::subC274D(int arg1) {
+int Scene1337::findCard13InHand(int playerId) {
for (int i = 0; i <= 3; i++) {
- if (_arrunkObj1337[arg1]._arr1[i]._field34 == 13)
+ if (_gameBoardSide[playerId]._handCard[i]._cardId == 13)
return i;
}
return -1;
}
-int Scene1337::subC2781(int arg1) {
+int Scene1337::checkThieftCard(int playerId) {
for (int i = 0; i <= 3; i++) {
- if (_arrunkObj1337[arg1]._arr1[i]._field34 == 25)
+ if (_gameBoardSide[playerId]._handCard[i]._cardId == 25)
return i;
}
return -1;
}
-int Scene1337::subC27B5(int arg1) {
- switch (arg1) {
+int Scene1337::isDelayCard(int cardId) {
+ switch (cardId) {
case 11:
// No break on purpose
case 14:
@@ -4686,7 +4737,7 @@ int Scene1337::subC27B5(int arg1) {
case 16:
// No break on purpose
case 24:
- return arg1;
+ return cardId;
break;
default:
return -1;
@@ -4694,8 +4745,8 @@ int Scene1337::subC27B5(int arg1) {
}
}
-int Scene1337::subC27F9(int arg1) {
- switch (arg1) {
+int Scene1337::getStationCardId(int cardId) {
+ switch (cardId) {
case 10:
// No break on purpose
case 12:
@@ -4711,377 +4762,143 @@ int Scene1337::subC27F9(int arg1) {
case 20:
// No break on purpose
case 21:
- return arg1;
+ return cardId;
default:
return -1;
}
}
-void Scene1337::subC2835(int arg1) {
- int i;
- bool found = false;
- switch (arg1) {
+void Scene1337::handlePlayer01Discard(int playerId) {
+ switch (playerId) {
case 0:
- for (i = 0; i <= 3; i++) {
- if (subC27F9(_arrunkObj1337[arg1]._arr1[i]._field34) != -1) {
- found = true;
- break;
+ for (int i = 0; i <= 3; i++) {
+ if (getStationCardId(_gameBoardSide[playerId]._handCard[i]._cardId) != -1) {
+ discardCard(&_gameBoardSide[playerId]._handCard[i]);
+ return;
}
}
- if (found)
- break;
-
- for (i = 0; i <= 3; i++) {
- if (subC27B5(_arrunkObj1337[arg1]._arr1[i]._field34) != -1) {
- found = true;
- break;
+ for (int i = 0; i <= 3; i++) {
+ if (isDelayCard(_gameBoardSide[playerId]._handCard[i]._cardId) != -1) {
+ discardCard(&_gameBoardSide[playerId]._handCard[i]);
+ return;
}
}
- if (found)
- break;
-
- for (i = 0; i <= 3; i++) {
- if ((_arrunkObj1337[arg1]._arr1[i]._field34 > 1) && (_arrunkObj1337[arg1]._arr1[i]._field34 <= 9)) {
- found = true;
- break;
+ for (int i = 0; i <= 3; i++) {
+ if ((_gameBoardSide[playerId]._handCard[i]._cardId > 1) && (_gameBoardSide[playerId]._handCard[i]._cardId <= 9)) {
+ discardCard(&_gameBoardSide[playerId]._handCard[i]);
+ return;
}
}
- if (found)
- break;
-
- for (i = 0; i <= 3; i++) {
- if ((_arrunkObj1337[arg1]._arr1[i]._field34 >= 26) && (_arrunkObj1337[arg1]._arr1[i]._field34 <= 33)) {
- found = true;
- break;
+ for (int i = 0; i <= 3; i++) {
+ if ((_gameBoardSide[playerId]._handCard[i]._cardId >= 26) && (_gameBoardSide[playerId]._handCard[i]._cardId <= 33)) {
+ discardCard(&_gameBoardSide[playerId]._handCard[i]);
+ return;
}
}
- if (found)
- break;
-
- for (i = 0; i <= 3; i++) {
- if (_arrunkObj1337[arg1]._arr1[i]._field34 == 1) {
- found = true;
- break;
+ for (int i = 0; i <= 3; i++) {
+ if (_gameBoardSide[playerId]._handCard[i]._cardId == 1) {
+ discardCard(&_gameBoardSide[playerId]._handCard[i]);
+ return;
}
}
- if (found)
- break;
-
- for (i = 0; i <= 3; i++) {
- if (_arrunkObj1337[arg1]._arr1[i]._field34 == 25) {
- found = true;
- break;
+ for (int i = 0; i <= 3; i++) {
+ if (_gameBoardSide[playerId]._handCard[i]._cardId == 25) {
+ discardCard(&_gameBoardSide[playerId]._handCard[i]);
+ return;
}
}
- if (found)
- break;
-
- for (i = 0; i <= 3; i++) {
- if (_arrunkObj1337[arg1]._arr1[i]._field34 == 13) {
- found = true;
- break;
+ for (int i = 0; i <= 3; i++) {
+ if (_gameBoardSide[playerId]._handCard[i]._cardId == 13) {
+ discardCard(&_gameBoardSide[playerId]._handCard[i]);
+ return;
}
}
break;
case 1:
- for (i = 0; i <= 3; i++) {
- if ((_arrunkObj1337[arg1]._arr1[i]._field34 >= 26) && (_arrunkObj1337[arg1]._arr1[i]._field34 <= 33)) {
- found = true;
- break;
+ for (int i = 0; i <= 3; i++) {
+ if ((_gameBoardSide[playerId]._handCard[i]._cardId >= 26) && (_gameBoardSide[playerId]._handCard[i]._cardId <= 33)) {
+ discardCard(&_gameBoardSide[playerId]._handCard[i]);
+ return;
}
}
- if (found)
- break;
-
- for (i = 0; i <= 3; i++) {
- if (_arrunkObj1337[arg1]._arr1[i]._field34 == 1) {
- found = true;
- break;
+ for (int i = 0; i <= 3; i++) {
+ if (_gameBoardSide[playerId]._handCard[i]._cardId == 1) {
+ discardCard(&_gameBoardSide[playerId]._handCard[i]);
+ return;
}
}
- if (found)
- break;
-
- for (i = 0; i <= 3; i++) {
- if ((_arrunkObj1337[arg1]._arr1[i]._field34 > 1) && (_arrunkObj1337[arg1]._arr1[i]._field34 <= 9)) {
- found = true;
- break;
+ for (int i = 0; i <= 3; i++) {
+ if ((_gameBoardSide[playerId]._handCard[i]._cardId > 1) && (_gameBoardSide[playerId]._handCard[i]._cardId <= 9)) {
+ discardCard(&_gameBoardSide[playerId]._handCard[i]);
+ return;
}
}
- if (found)
- break;
-
- for (i = 0; i <= 3; i++) {
- if (subC27F9(_arrunkObj1337[arg1]._arr1[i]._field34) != -1) {
- found = true;
- break;
+ for (int i = 0; i <= 3; i++) {
+ if (getStationCardId(_gameBoardSide[playerId]._handCard[i]._cardId) != -1) {
+ discardCard(&_gameBoardSide[playerId]._handCard[i]);
+ return;
}
}
- if (found)
- break;
-
- for (i = 0; i <= 3; i++) {
- if (subC27B5(_arrunkObj1337[arg1]._arr1[i]._field34) != -1) {
- found = true;
- break;
+ for (int i = 0; i <= 3; i++) {
+ if (isDelayCard(_gameBoardSide[playerId]._handCard[i]._cardId) != -1) {
+ discardCard(&_gameBoardSide[playerId]._handCard[i]);
+ return;
}
}
- if (found)
- break;
-
- for (i = 0; i <= 3; i++) {
- if (_arrunkObj1337[arg1]._arr1[i]._field34 == 25) {
- found = true;
- break;
+ for (int i = 0; i <= 3; i++) {
+ if (_gameBoardSide[playerId]._handCard[i]._cardId == 25) {
+ discardCard(&_gameBoardSide[playerId]._handCard[i]);
+ return;
}
}
- if (found)
- break;
-
- for (i = 0; i <= 3; i++) {
- if (_arrunkObj1337[arg1]._arr1[i]._field34 == 13) {
- found = true;
- break;
+ for (int i = 0; i <= 3; i++) {
+ if (_gameBoardSide[playerId]._handCard[i]._cardId == 13) {
+ discardCard(&_gameBoardSide[playerId]._handCard[i]);
+ return;
}
}
break;
default:
- return;
- }
-
- subC4A39(&_arrunkObj1337[arg1]._arr1[i]);
-}
-
-bool Scene1337::subC2BF8(unkObj1337sub1 *subObj1, Common::Point pt) {
- if ((subObj1->_field36.x > pt.x) || (subObj1->_field36.x + 24 < pt.x))
- return false;
-
- if ((subObj1->_field36.y > pt.y) || (subObj1->_field36.y + 24 < pt.y))
- return false;
-
- return true;
-}
-
-void Scene1337::subC2C2F() {
- bool found = true;
-
- if (_arrunkObj1337[3]._arr3[0]._field34 != 0) {
- switch (_arrunkObj1337[3]._arr3[0]._field34) {
- case 10:
- // No break on purpose
- case 12:
- // No break on purpose
- case 15:
- // No break on purpose
- case 17:
- // No break on purpose
- case 18:
- // No break on purpose
- case 19:
- // No break on purpose
- case 20:
- // No break on purpose
- case 21:
- subC4A39(&_arrunkObj1337[3]._arr3[0]);
- found = false;
- break;
- default:
- found = false;
- int i;
- for (i = 0; i <= 3; i++) {
- if (subC3386(_arrunkObj1337[3]._arr3[0]._field34, _arrunkObj1337[3]._arr1[i]._field34)) {
- found = true;
- break;
- }
- }
-
- if (found) {
- found = false;
- subC34A1(&_arrunkObj1337[3]._arr1[i], &_arrunkObj1337[3]._arr3[0]);
- }
- break;
- }
- }
-
- if (!found)
- return;
-
- int randIndx = R2_GLOBALS._randomSource.getRandomNumber(3);
-
- if (_arrunkObj1337[3]._arr1[randIndx]._field34 == 1) {
- found = false;
-
- for (int i = 0; i <= 7; i++) {
- if ((_arrunkObj1337[3]._arr2[i]._field34 == 0) && (!subC2687(_arrunkObj1337[3]._arr3[0]._field34))) {
- subC340B(&_arrunkObj1337[3]._arr1[randIndx], &_arrunkObj1337[3]._arr2[i]);
- found = true;
- break;
- }
- }
-
- if (found) {
- return;
- }
- } else if (_arrunkObj1337[3]._arr1[randIndx]._field34 <= 9) {
- found = false;
-
- for (int i = 0; i <= 7; i++) {
- if (_arrunkObj1337[3]._arr2[i]._field34 == _arrunkObj1337[3]._arr1[randIndx]._field34) {
- found = true;
- break;
- }
- }
-
- if (!found) {
- for (int i = 0; i <= 7; i++) {
- if ((_arrunkObj1337[3]._arr2[i]._field34 == 1) && (!subC2687(_arrunkObj1337[3]._arr3[i]._field34))) {
- int tmpVal = 0;
-
- for (int j = 0; j <= 7; j++) {
- if ((_arrunkObj1337[3]._arr2[j]._field34 > 1) && (_arrunkObj1337[3]._arr2[j]._field34 <= 9))
- ++tmpVal;
- }
-
- if (tmpVal == 7)
- _field424A = 3;
-
- subC33C0(&_arrunkObj1337[3]._arr1[randIndx], &_arrunkObj1337[3]._arr2[i]);
- found = true;
- break;
- }
- }
- if (found)
- return;
- }
- } else if (_arrunkObj1337[3]._arr1[randIndx]._field34 == 13) {
- int tmpVal = subC331B(3);
-
- if (tmpVal != -1) {
- subC358E(&_arrunkObj1337[3]._arr1[randIndx], tmpVal);
- return;
- }
- } else if (_arrunkObj1337[3]._arr1[randIndx]._field34 == 25) {
- int tmpVal = -1;
- found = false;
- int tmpRandIndx = R2_GLOBALS._randomSource.getRandomNumber(3);
-
- for (int i = 0; i <= 3; i++) {
- if ( (tmpRandIndx != 3)
- && ( (_arrunkObj1337[tmpRandIndx]._arr1[0]._field34 != 0)
- || (_arrunkObj1337[tmpRandIndx]._arr1[1]._field34 != 0)
- || (_arrunkObj1337[tmpRandIndx]._arr1[2]._field34 != 0)
- || (_arrunkObj1337[tmpRandIndx]._arr1[3]._field34 != 0) )) {
- tmpVal = tmpRandIndx;
- break;
- }
-
- ++tmpRandIndx;
- if (tmpRandIndx > 3)
- tmpRandIndx = 0;
- }
-
- if (tmpVal != -1) {
- subC318B(3, &_arrunkObj1337[3]._arr1[randIndx], tmpVal);
- return;
- }
- } else {
- switch (_arrunkObj1337[3]._arr1[randIndx]._field34) {
- case 10:
- // No break on purpose
- case 11:
- // No break on purpose
- case 12:
- // No break on purpose
- case 14:
- // No break on purpose
- case 15:
- // No break on purpose
- case 16:
- // No break on purpose
- case 17:
- // No break on purpose
- case 18:
- // No break on purpose
- case 19:
- // No break on purpose
- case 20:
- // No break on purpose
- case 21:
- // No break on purpose
- case 24: {
- int tmpVal = -1;
- int tmpRandIndx = R2_GLOBALS._randomSource.getRandomNumber(3);
-
- for (int i = 0; i <= 3; i++) {
- if (tmpRandIndx != 3) {
- // The variables 'i' and 'j' are not used in the inner code of the loop.
- // It's understandable for 'i', which helps making sure that tmpVal is used properly,
- // but it's suspect for j
- for (int j = 0; j <= 7; j++) {
- if ((_arrunkObj1337[tmpRandIndx]._arr3[0]._field34 == 0) && (subC32B1(tmpRandIndx, _arrunkObj1337[3]._arr1[randIndx]._field34))) {
- tmpVal = j;
- }
- }
- }
-
- ++tmpRandIndx;
- if (tmpRandIndx > 3)
- tmpRandIndx = 0;
-
- if (tmpVal != -1)
- break;
- }
-
- if (tmpVal != -1) {
- // Useless second identical check skipped
- subC3456(&_arrunkObj1337[3]._arr1[randIndx], &_arrunkObj1337[tmpVal]._arr3[0]);
- return;
- }
- }
- default:
- break;
- }
+ break;
}
-
- subC4A39(&_arrunkObj1337[3]._arr1[randIndx]);
}
-void Scene1337::subC318B(int arg1, unkObj1337sub1 *subObj1, int arg3) {
- _field4240 = arg1;
- _field4242 = arg3;
+void Scene1337::playThieftCard(int playerId, Card *card, int victimId) {
+ _actionIdx1 = playerId;
+ _actionIdx2 = victimId;
int randIndx;
for (;;) {
randIndx = R2_GLOBALS._randomSource.getRandomNumber(3);
- if (_arrunkObj1337[arg3]._arr1[randIndx]._field34 != 0)
+ if (_gameBoardSide[victimId]._handCard[randIndx]._cardId != 0)
break;
}
- _field3EF0 = subObj1;
- _field3EF4 = &_arrunkObj1337[arg3]._arr4[0];
- _field3EF8 = &_arrunkObj1337[arg3]._arr1[randIndx];
+ _actionCard1 = card;
+ _actionCard2 = &_gameBoardSide[victimId]._emptyStationPos;
+ _actionCard3 = &_gameBoardSide[victimId]._handCard[randIndx];
- _item1.setAction(&_action11);
+ _actionItem.setAction(&_action11);
}
-int Scene1337::subC3257(int arg1) {
+int Scene1337::getPreventionCardId(int cardId) {
int retVal;
- switch (arg1) {
+ switch (cardId) {
case 10:
retVal = 2;
break;
@@ -5113,152 +4930,150 @@ int Scene1337::subC3257(int arg1) {
return retVal;
}
-bool Scene1337::subC32B1(int arg1, int arg2) {
+bool Scene1337::isAttackPossible(int victimId, int cardId) {
+ if (victimId < 0 || victimId >= ARRAYSIZE(_gameBoardSide))
+ error("Scene1337::isAttackPossible() victimId:%d out of range 0 to %d", victimId, ARRAYSIZE(_gameBoardSide)-1);
+
for (int i = 0; i <= 7; i++) {
- if (_arrunkObj1337[arg1]._arr2[i]._field34 != 0) {
- int tmpVal = subC3257(arg2);
- if (tmpVal == _arrunkObj1337[arg1]._arr2[i]._field34)
+ if (_gameBoardSide[victimId]._outpostStation[i]._cardId != 0) {
+ if (getPreventionCardId(cardId) == _gameBoardSide[victimId]._outpostStation[i]._cardId)
return false;
}
}
return true;
}
-int Scene1337::subC331B(int arg1) {
- int randIndx = R2_GLOBALS._randomSource.getRandomNumber(3);
+int Scene1337::getPlayerWithOutpost(int playerId) {
+ int randPlayerId = R2_GLOBALS._randomSource.getRandomNumber(3);
for (int i = 0; i <= 3; i++) {
- if (randIndx != arg1) {
+ if (randPlayerId != playerId) {
for (int j = 0; j <= 7; j++) {
- if (_arrunkObj1337[randIndx]._arr2[j]._field34 != 0)
- return randIndx;
+ if (_gameBoardSide[randPlayerId]._outpostStation[j]._cardId != 0)
+ return randPlayerId;
}
}
- if (arg1 == 1) {
- randIndx--;
- if (randIndx < 0)
- randIndx = 3;
+ if (playerId == 1) {
+ randPlayerId--;
+ if (randPlayerId < 0)
+ randPlayerId = 3;
} else {
- ++randIndx;
- if (randIndx > 3)
- randIndx = 0;
+ ++randPlayerId;
+ if (randPlayerId > 3)
+ randPlayerId = 0;
}
}
return -1;
}
-bool Scene1337::subC3386(int arg1, int arg2) {
- if ((arg1 == 11) && (arg2 == 26))
+bool Scene1337::checkAntiDelayCard(int delayCardId, int cardId) {
+ if ((delayCardId == 11) && (cardId == 26))
return true;
- if ((arg1 == 14) && (arg2 == 30))
+ if ((delayCardId == 14) && (cardId == 30))
return true;
- if ((arg1 == 16) && (arg2 == 32))
+ if ((delayCardId == 16) && (cardId == 32))
return true;
- if ((arg1 == 24) && (arg2 == 28))
+ if ((delayCardId == 24) && (cardId == 28))
return true;
return false;
}
-void Scene1337::subC33C0(unkObj1337sub1 *subObj1, unkObj1337sub1 *subObj2) {
- _field3EF4 = subObj2;
- _field3EF0 = subObj1;
- _item1.setAction(&_action7);
+void Scene1337::playStationCard(Card *station, Card *platform) {
+ _actionCard1 = station;
+ _actionCard2 = platform;
+ _actionItem.setAction(&_action7);
}
-int Scene1337::subC3E92(int arg1) {
- if ( (_arrunkObj1337[arg1]._arr1[0]._field34 == 0)
- && (_arrunkObj1337[arg1]._arr1[1]._field34 == 0)
- && (_arrunkObj1337[arg1]._arr1[2]._field34 == 0)
- && (_arrunkObj1337[arg1]._arr1[3]._field34 == 0))
+int Scene1337::getFreeHandCard(int playerId) {
+ if ( (_gameBoardSide[playerId]._handCard[0]._cardId == 0)
+ && (_gameBoardSide[playerId]._handCard[1]._cardId == 0)
+ && (_gameBoardSide[playerId]._handCard[2]._cardId == 0)
+ && (_gameBoardSide[playerId]._handCard[3]._cardId == 0))
return -1;
int randIndx;
for (;;) {
randIndx = R2_GLOBALS._randomSource.getRandomNumber(3);
- if (_arrunkObj1337[arg1]._arr1[randIndx]._field34 == 0)
+ if (_gameBoardSide[playerId]._handCard[randIndx]._cardId == 0)
break;
}
return randIndx;
}
-void Scene1337::subC340B(unkObj1337sub1 *subObj1, unkObj1337sub1 *subObj2) {
- _field3EF0 = subObj1;
- _field3EF4 = subObj2;
+void Scene1337::playPlatformCard(Card *card, Card *dest) {
+ _actionCard1 = card;
+ _actionCard2 = dest;
- _item1.setAction(&_action6);
+ _actionItem.setAction(&_action6);
}
-void Scene1337::subC3456(unkObj1337sub1 *subObj1, unkObj1337sub1 *subObj2) {
- _field3EF0 = subObj1;
- _field3EF4 = subObj2;
+void Scene1337::playDelayCard(Card *card, Card *dest) {
+ _actionCard1 = card;
+ _actionCard2 = dest;
- _item1.setAction(&_action9);
+ _actionItem.setAction(&_action9);
}
-void Scene1337::subC34A1(unkObj1337sub1 *subObj1, unkObj1337sub1 *subObj2) {
- _field3EF0 = subObj1;
- _field3EF4 = subObj2;
+void Scene1337::playAntiDelayCard(Card *card, Card *dest) {
+ _actionCard1 = card;
+ _actionCard2 = dest;
- _item1.setAction(&_action8);
+ _actionItem.setAction(&_action8);
+
+ handleNextTurn();
}
-Scene1337::unkObj1337sub1 *Scene1337::subC34EC(int arg1) {
- for (int i = 0; i <= 7; i++) {
- if (_arrunkObj1337[arg1]._arr2[i]._field34 == 1) {
- return &_arrunkObj1337[arg1]._arr2[i];
- }
- }
+Scene1337::Card *Scene1337::getStationCard(int playerId) {
for (int i = 0; i <= 7; i++) {
- if ((_arrunkObj1337[arg1]._arr2[i]._field34 != 0) && (_arrunkObj1337[arg1]._arr2[i]._field34 < 10)) {
- return &_arrunkObj1337[arg1]._arr2[i];
- }
+ if ((_gameBoardSide[playerId]._outpostStation[i]._cardId >= 1) && (_gameBoardSide[playerId]._outpostStation[i]._cardId <= 9))
+ return &_gameBoardSide[playerId]._outpostStation[i];
}
- return NULL;
+ return nullptr;
}
-void Scene1337::subC358E(unkObj1337sub1 *subObj1, int arg2) {
- _field3EF0 = subObj1;
- _field3EF4 = subC34EC(arg2);
- _field3EF8 = &_arrunkObj1337[arg2]._arr4[0];
- _field4240 = arg2;
- _item1.setAction(&_action10);
+void Scene1337::playCounterTrickCard(Card *card, int playerId) {
+ _actionCard1 = card;
+ _actionCard2 = getStationCard(playerId);
+ _actionCard3 = &_gameBoardSide[playerId]._emptyStationPos;
+ _actionIdx1 = playerId;
+ _actionItem.setAction(&_action10);
+ handleNextTurn();
}
-void Scene1337::subC4A39(unkObj1337sub1 *subObj) {
- _field3EF0 = subObj;
+void Scene1337::discardCard(Card *card) {
+ _actionCard1 = card;
- _item1.setAction(&_action5);
+ _actionItem.setAction(&_action5);
}
void Scene1337::subC4CD2() {
if (R2_GLOBALS._v57709 > 0) {
subD1917();
- subD1940(false);
+ subD1940(false); // _v5780C--
}
}
void Scene1337::subC4CEC() {
- if (R2_GLOBALS._v57709 != 0)
- return;
-
- subD18F5();
- subD1940(1);
+ if (R2_GLOBALS._v57709 == 0) {
+ subD18F5();
+ subD1940(true); // _v5780C++
+ }
}
-void Scene1337::subC51A0(unkObj1337sub1 *subObj1, unkObj1337sub1 *subObj2) {
- _field3EF0 = subObj1;
- _field3EF4 = subObj2;
+void Scene1337::subC51A0(Card *subObj1, Card *subObj2) {
+ _actionCard1 = subObj1;
+ _actionCard2 = subObj2;
- _item1.setAction(&_action13);
+ _actionItem.setAction(&_action13);
}
void Scene1337::displayDialog(int dialogNumb) {
@@ -5362,8 +5177,8 @@ void Scene1337::displayDialog(int dialogNumb) {
void Scene1337::subPostInit() {
R2_GLOBALS._v57709 = 0;
R2_GLOBALS._v5780C = 0;
- subD183F(1, 0);
- subD1940(true);
+ updateCursorId(1, false);
+ subD1940(true); // _v5780C++
subD18F5();
// loadScene(1330);
@@ -5371,237 +5186,244 @@ void Scene1337::subPostInit() {
R2_GLOBALS._scenePalette.addRotation(224, 235, 1);
- _field3E28[0] = 1;
- _field3E28[1] = 1;
- _field3E28[2] = 1;
- _field3E28[3] = 1;
- _field3E28[4] = 1;
- _field3E28[5] = 1;
- _field3E28[6] = 1;
- _field3E28[7] = 1;
- _field3E28[8] = 26;
- _field3E28[9] = 2;
- _field3E28[10] = 2;
- _field3E28[11] = 2;
- _field3E28[12] = 2;
- _field3E28[13] = 2;
- _field3E28[14] = 26;
- _field3E28[15] = 3;
- _field3E28[16] = 3;
- _field3E28[17] = 3;
- _field3E28[18] = 3;
- _field3E28[19] = 3;
- _field3E28[20] = 28;
- _field3E28[21] = 4;
- _field3E28[22] = 4;
- _field3E28[23] = 4;
- _field3E28[24] = 4;
- _field3E28[25] = 4;
- _field3E28[26] = 28;
- _field3E28[27] = 5;
- _field3E28[28] = 5;
- _field3E28[29] = 5;
- _field3E28[30] = 5;
- _field3E28[31] = 5;
- _field3E28[32] = 30;
- _field3E28[33] = 6;
- _field3E28[34] = 6;
- _field3E28[35] = 6;
- _field3E28[36] = 6;
- _field3E28[37] = 6;
- _field3E28[38] = 30;
- _field3E28[39] = 7;
- _field3E28[40] = 7;
- _field3E28[41] = 7;
- _field3E28[42] = 7;
- _field3E28[43] = 7;
- _field3E28[44] = 32;
- _field3E28[45] = 8;
- _field3E28[46] = 8;
- _field3E28[47] = 8;
- _field3E28[48] = 8;
- _field3E28[49] = 8;
- _field3E28[50] = 32;
- _field3E28[51] = 9;
- _field3E28[52] = 9;
- _field3E28[53] = 9;
- _field3E28[54] = 9;
- _field3E28[55] = 9;
- _field3E28[56] = 10;
- _field3E28[57] = 11;
- _field3E28[58] = 12;
- _field3E28[59] = 13;
- _field3E28[60] = 13;
- _field3E28[61] = 14;
- _field3E28[62] = 15;
- _field3E28[63] = 16;
- _field3E28[64] = 17;
- _field3E28[65] = 18;
- _field3E28[66] = 19;
- _field3E28[67] = 20;
- _field3E28[68] = 21;
- _field3E28[69] = 26;
- _field3E28[70] = 28;
- _field3E28[71] = 24;
- _field3E28[72] = 25;
- _field3E28[73] = 25;
- _field3E28[74] = 25;
- _field3E28[75] = 25;
- _field3E28[76] = 26;
- _field3E28[77] = 26;
- _field3E28[78] = 26;
- _field3E28[79] = 27;
- _field3E28[80] = 27;
- _field3E28[81] = 28;
- _field3E28[82] = 28;
- _field3E28[83] = 28;
- _field3E28[84] = 29;
- _field3E28[85] = 29;
- _field3E28[86] = 29;
- _field3E28[87] = 30;
- _field3E28[88] = 30;
- _field3E28[89] = 30;
- _field3E28[90] = 30;
- _field3E28[91] = 32;
- _field3E28[92] = 1;
- _field3E28[93] = 32;
- _field3E28[94] = 32;
- _field3E28[95] = 32;
- _field3E28[96] = 1;
- _field3E28[97] = 1;
- _field3E28[98] = 1;
- _field3E28[99] = 0;
-
- _field3E24 = 98;
- _field3E26 = 98;
-
- _item7._field34 = 0;
- _item7._field36 = Common::Point(128, 95);
-
- _item8._field34 = 0;
- _item8._field36 = Common::Point(162, 95);
-
- _item6._field34 = 0;
-
- _item2._object1.postInit();
- _item2._object1.setVisage(1332);
- _item2._object1.setStrip(5);
- _item2._object1.setFrame(1);
- _item2._object1._moveDiff = Common::Point(10, 10);
- _item2._object1.fixPriority(400);
- _item2._object1.setPosition(Common::Point(128, 95), 0);
- _item2._object1.animate(ANIM_MODE_2, NULL);
- _item2._object1.hide();
-
- _object1.postInit();
- _object1.setVisage(1334);
- _object1.setStrip(1);
- _object1.setFrame(1);
- _object1._numFrames = 12;
- _object1.fixPriority(500);
- _object1.setPosition(Common::Point(174, 107), 0);
- _object1.animate(ANIM_MODE_2, NULL);
- _object1.hide();
-
- _field4244 = 1;
- _field4246 = 0;
- _field4248 = 0;
- _field424A = -1;
-
- _background1.setup2(9531, 1, 1, 249, 168, 155, 0);
+ _availableCardsPile[0] = 1;
+ _availableCardsPile[1] = 1;
+ _availableCardsPile[2] = 1;
+ _availableCardsPile[3] = 1;
+ _availableCardsPile[4] = 1;
+ _availableCardsPile[5] = 1;
+ _availableCardsPile[6] = 1;
+ _availableCardsPile[7] = 1;
+ _availableCardsPile[8] = 26;
+ _availableCardsPile[9] = 2;
+ _availableCardsPile[10] = 2;
+ _availableCardsPile[11] = 2;
+ _availableCardsPile[12] = 2;
+ _availableCardsPile[13] = 2;
+ _availableCardsPile[14] = 26;
+ _availableCardsPile[15] = 3;
+ _availableCardsPile[16] = 3;
+ _availableCardsPile[17] = 3;
+ _availableCardsPile[18] = 3;
+ _availableCardsPile[19] = 3;
+ _availableCardsPile[20] = 28;
+ _availableCardsPile[21] = 4;
+ _availableCardsPile[22] = 4;
+ _availableCardsPile[23] = 4;
+ _availableCardsPile[24] = 4;
+ _availableCardsPile[25] = 4;
+ _availableCardsPile[26] = 28;
+ _availableCardsPile[27] = 5;
+ _availableCardsPile[28] = 5;
+ _availableCardsPile[29] = 5;
+ _availableCardsPile[30] = 5;
+ _availableCardsPile[31] = 5;
+ _availableCardsPile[32] = 30;
+ _availableCardsPile[33] = 6;
+ _availableCardsPile[34] = 6;
+ _availableCardsPile[35] = 6;
+ _availableCardsPile[36] = 6;
+ _availableCardsPile[37] = 6;
+ _availableCardsPile[38] = 30;
+ _availableCardsPile[39] = 7;
+ _availableCardsPile[40] = 7;
+ _availableCardsPile[41] = 7;
+ _availableCardsPile[42] = 7;
+ _availableCardsPile[43] = 7;
+ _availableCardsPile[44] = 32;
+ _availableCardsPile[45] = 8;
+ _availableCardsPile[46] = 8;
+ _availableCardsPile[47] = 8;
+ _availableCardsPile[48] = 8;
+ _availableCardsPile[49] = 8;
+ _availableCardsPile[50] = 32;
+ _availableCardsPile[51] = 9;
+ _availableCardsPile[52] = 9;
+ _availableCardsPile[53] = 9;
+ _availableCardsPile[54] = 9;
+ _availableCardsPile[55] = 9;
+ _availableCardsPile[56] = 10;
+ _availableCardsPile[57] = 11;
+ _availableCardsPile[58] = 12;
+ _availableCardsPile[59] = 13;
+ _availableCardsPile[60] = 13;
+ _availableCardsPile[61] = 14;
+ _availableCardsPile[62] = 15;
+ _availableCardsPile[63] = 16;
+ _availableCardsPile[64] = 17;
+ _availableCardsPile[65] = 18;
+ _availableCardsPile[66] = 19;
+ _availableCardsPile[67] = 20;
+ _availableCardsPile[68] = 21;
+ _availableCardsPile[69] = 26;
+ _availableCardsPile[70] = 28;
+ _availableCardsPile[71] = 24;
+ _availableCardsPile[72] = 25;
+ _availableCardsPile[73] = 25;
+ _availableCardsPile[74] = 25;
+ _availableCardsPile[75] = 25;
+ _availableCardsPile[76] = 26;
+ _availableCardsPile[77] = 26;
+ _availableCardsPile[78] = 26;
+ _availableCardsPile[79] = 27;
+ _availableCardsPile[80] = 27;
+ _availableCardsPile[81] = 28;
+ _availableCardsPile[82] = 28;
+ _availableCardsPile[83] = 28;
+ _availableCardsPile[84] = 29;
+ _availableCardsPile[85] = 29;
+ _availableCardsPile[86] = 29;
+ _availableCardsPile[87] = 30;
+ _availableCardsPile[88] = 30;
+ _availableCardsPile[89] = 30;
+ _availableCardsPile[90] = 30;
+ _availableCardsPile[91] = 32;
+ _availableCardsPile[92] = 1;
+ _availableCardsPile[93] = 32;
+ _availableCardsPile[94] = 32;
+ _availableCardsPile[95] = 32;
+ _availableCardsPile[96] = 1;
+ _availableCardsPile[97] = 1;
+ _availableCardsPile[98] = 1;
+ _availableCardsPile[99] = 0;
+
+ _cardsAvailableNumb = 98;
+ _currentDiscardIndex = 98; // CHECKME: Would make more sense at pos 99
+
+ _discardPile._cardId = 0;
+ _discardPile._stationPos = Common::Point(128, 95);
+
+ _stockCard._cardId = 0;
+ _stockCard._stationPos = Common::Point(162, 95);
+
+ _selectedCard._cardId = 0;
+
+ _animatedCard._card.postInit();
+ _animatedCard._card.setVisage(1332);
+ _animatedCard._card.setStrip(5);
+ _animatedCard._card.setFrame(1);
+ _animatedCard._card._moveDiff = Common::Point(10, 10);
+ _animatedCard._card.fixPriority(400);
+ _animatedCard._card.setPosition(Common::Point(128, 95), 0);
+ _animatedCard._card.animate(ANIM_MODE_2, NULL);
+ _animatedCard._card.hide();
+
+ _currentPlayerArrow.postInit();
+ _currentPlayerArrow.setVisage(1334);
+ _currentPlayerArrow.setStrip(1);
+ _currentPlayerArrow.setFrame(1);
+ _currentPlayerArrow._numFrames = 12;
+ _currentPlayerArrow.fixPriority(500);
+ _currentPlayerArrow.setPosition(Common::Point(174, 107), 0);
+ _currentPlayerArrow.animate(ANIM_MODE_2, NULL);
+ _currentPlayerArrow.hide();
+
+ _showPlayerTurn = true;
+ _displayHelpFl = false;
+ _winnerId = -1;
+
+ _helpIcon.postInit();
+ _helpIcon.setup(9531, 1, 1);
+ _helpIcon.setPosition(Common::Point(249, 168));
+ _helpIcon.setPriority(155);
+ _helpIcon._effect = EFFECT_NONE;
+ _helpIcon.show();
_autoplay = false;
- _field424C = 0;
- _field424E = 0;
+ _instructionsDisplayedFl = false;
+ _instructionsWaitCount = 0;
}
void Scene1337::suggestInstructions() {
if (R2_GLOBALS._v57709 > 0)
subD1917();
+
if (MessageDialog::show(NEED_INSTRUCTIONS, NO_MSG, YES_MSG) == 0) {
if (R2_GLOBALS._v57709 == 0)
subD18F5();
- subCCF26();
+ dealCards();
} else {
if (R2_GLOBALS._v57709 == 0)
subD18F5();
- subCB59B();
+ displayInstructions();
}
}
-void Scene1337::subCB59B() {
- _item1.setAction(&_action1);
+void Scene1337::displayInstructions() {
+ _actionItem.setAction(&_action1);
}
void Scene1337::shuffleCards() {
R2_GLOBALS._sceneObjects->draw();
+ // Remove holes in card pile
for (int i = 0; i <= 98; i++) {
- if (_field3E28[i] == 0) {
+ if (_availableCardsPile[i] == 0) {
for (int j = i + 1; j <= 98; j ++) {
- if (_field3E28[j] != 0) {
- _field3E28[i] = _field3E28[j];
- _field3E28[j] = 0;
+ if (_availableCardsPile[j] != 0) {
+ _availableCardsPile[i] = _availableCardsPile[j];
+ _availableCardsPile[j] = 0;
break;
}
}
}
}
+ // Compute the number of available cards
for (int i = 0; i <= 99; i ++) {
- if (_field3E28[i] == 0) {
- _field3E24 = i - 1;
- _field3E26 = 98;
+ if (_availableCardsPile[i] == 0) {
+ // CHECKME: This will fail if i == 0, which shouldn't happen
+ // as we don't shuffle cards when no card is available.
+ _cardsAvailableNumb = i - 1;
+ _currentDiscardIndex = 98; // CHECKME: Would make more sense at pos 99
break;
}
}
- // tmpVal is never modified in the original. It looks weird but it works: at the end, the cards are suffled!
- int tmpVal = 0;
- int randIndx;
- int swap;
for (int i = 0; i < 2000; i ++) {
- randIndx = R2_GLOBALS._randomSource.getRandomNumber(_field3E24);
- swap = _field3E28[tmpVal];
- _field3E28[tmpVal] = _field3E28[randIndx];
- _field3E28[randIndx] = swap;
+ int randIndx = R2_GLOBALS._randomSource.getRandomNumber(_cardsAvailableNumb);
+ int swap = _availableCardsPile[0];
+ _availableCardsPile[0] = _availableCardsPile[randIndx];
+ _availableCardsPile[randIndx] = swap;
}
- _field423C = 0;
- _item2._object1.setAction(&_action2);
+ _shuffleEndedFl = false;
+
+ // Shuffle cards
+ _animatedCard._card.setAction(&_action2);
- while(_field423C == 0) {
+ while(!_shuffleEndedFl && !g_vm->shouldQuit()) {
+ g_globals->_sceneObjects->recurse(SceneHandler::dispatchObject);
g_globals->_scenePalette.signalListeners();
R2_GLOBALS._sceneObjects->draw();
- warning("TODO: recurse on draw() and on signalListeners()?");
g_globals->_events.delay(g_globals->_sceneHandler->_delayTicks);
-
- // Hack to avoid eternal loop
- // To be removed when the recurse is working properly
- _field423C = 1;
}
}
-void Scene1337::subCCF26() {
- _item2._object1._moveDiff = Common::Point(30, 30);
+void Scene1337::dealCards() {
+ _animatedCard._card._moveDiff = Common::Point(30, 30);
shuffleCards();
- _item1.setAction(&_action3);
+
+ // Deal cards
+ _actionItem.setAction(&_action3);
}
-void Scene1337::subCD193() {
- warning("STUBBED: subCD193()");
+
+void Scene1337::showOptionsDialog() {
+ // Display menu with "Auto Play", "New Game", "Quit" and "Continue"
+ OptionsDialog::show();
}
-void Scene1337::subCDB90(int arg1, Common::Point pt) {
- bool found = false;
+void Scene1337::handleClick(int arg1, Common::Point pt) {
int curReg = R2_GLOBALS._sceneRegions.indexOf(g_globals->_events._mousePos);
if (arg1 == 3) {
+ bool found = false;
int i;
for (i = 0; i <= 7; i++) {
- if ( (subC2BF8(&_arrunkObj1337[2]._arr2[i], pt))
- || (subC2BF8(&_arrunkObj1337[0]._arr2[i], pt))
- || (subC2BF8(&_arrunkObj1337[1]._arr2[i], pt))
- || (subC2BF8(&_arrunkObj1337[3]._arr2[i], pt)) ) {
+ if ( _gameBoardSide[2]._outpostStation[i].isIn(pt)
+ || _gameBoardSide[0]._outpostStation[i].isIn(pt)
+ || _gameBoardSide[1]._outpostStation[i].isIn(pt)
+ || _gameBoardSide[3]._outpostStation[i].isIn(pt) ) {
found = true;
break;
}
@@ -5610,124 +5432,114 @@ void Scene1337::subCDB90(int arg1, Common::Point pt) {
if (found) {
switch (curReg) {
case 5:
- if (_arrunkObj1337[2]._arr2[i]._field34 != 0)
- displayDialog(_arrunkObj1337[2]._arr2[i]._field34);
+ if (_gameBoardSide[2]._outpostStation[i]._cardId != 0)
+ displayDialog(_gameBoardSide[2]._outpostStation[i]._cardId);
else
actionDisplay(1330, 20, 159, 10, 1, 200, 0, 7, 0, 154, 154);
break;
case 10:
- if (_arrunkObj1337[3]._arr2[i]._field34 != 0)
- displayDialog(_arrunkObj1337[3]._arr2[i]._field34);
+ if (_gameBoardSide[3]._outpostStation[i]._cardId != 0)
+ displayDialog(_gameBoardSide[3]._outpostStation[i]._cardId);
else
actionDisplay(1330, 22, 159, 10, 1, 200, 0, 7, 0, 154, 154);
break;
case 15:
- if (_arrunkObj1337[0]._arr2[i]._field34 != 0)
- displayDialog(_arrunkObj1337[0]._arr2[i]._field34);
+ if (_gameBoardSide[0]._outpostStation[i]._cardId != 0)
+ displayDialog(_gameBoardSide[0]._outpostStation[i]._cardId);
else
actionDisplay(1330, 21, 159, 10, 1, 200, 0, 7, 0, 154, 154);
break;
case 20:
- if (_arrunkObj1337[1]._arr2[i]._field34 != 0)
- displayDialog(_arrunkObj1337[1]._arr2[i]._field34);
+ if (_gameBoardSide[1]._outpostStation[i]._cardId != 0)
+ displayDialog(_gameBoardSide[1]._outpostStation[i]._cardId);
else
actionDisplay(1330, 23, 159, 10, 1, 200, 0, 7, 0, 154, 154);
break;
default:
break;
}
- } else {
- if ( (subC2BF8(&_arrunkObj1337[2]._arr3[0], pt))
- || (subC2BF8(&_arrunkObj1337[0]._arr3[0], pt))
- || (subC2BF8(&_arrunkObj1337[1]._arr3[0], pt))
- || (subC2BF8(&_arrunkObj1337[3]._arr3[0], pt)) ) {
- found = true;
+ } else if ( _gameBoardSide[2]._delayCard.isIn(pt)
+ || _gameBoardSide[0]._delayCard.isIn(pt)
+ || _gameBoardSide[1]._delayCard.isIn(pt)
+ || _gameBoardSide[3]._delayCard.isIn(pt) ) {
+ switch (curReg) {
+ case 5:
+ if (_gameBoardSide[2]._delayCard._cardId != 0)
+ displayDialog(_gameBoardSide[2]._delayCard._cardId);
+ else
+ actionDisplay(1330, 10, 159, 10, 1, 200, 0, 7, 0, 154, 154);
+ break;
+ case 10:
+ if (_gameBoardSide[3]._delayCard._cardId != 0)
+ displayDialog(_gameBoardSide[3]._delayCard._cardId);
+ else
+ actionDisplay(1330, 16, 159, 10, 1, 200, 0, 7, 0, 154, 154);
+ break;
+ case 15:
+ if (_gameBoardSide[0]._delayCard._cardId != 0)
+ displayDialog(_gameBoardSide[0]._delayCard._cardId);
+ else
+ actionDisplay(1330, 13, 159, 10, 1, 200, 0, 7, 0, 154, 154);
+ break;
+ case 20:
+ if (_gameBoardSide[1]._delayCard._cardId != 0)
+ displayDialog(_gameBoardSide[1]._delayCard._cardId);
+ else
+ actionDisplay(1330, 18, 159, 10, 1, 200, 0, 7, 0, 154, 154);
+ break;
+ default:
+ break;
}
-
- if (found) {
- switch (curReg) {
- case 5:
- if (_arrunkObj1337[2]._arr3[0]._field34 != 0)
- displayDialog(_arrunkObj1337[2]._arr3[0]._field34);
- else
- actionDisplay(1330, 10, 159, 10, 1, 200, 0, 7, 0, 154, 154);
- break;
- case 10:
- if (_arrunkObj1337[3]._arr3[0]._field34 != 0)
- displayDialog(_arrunkObj1337[3]._arr3[0]._field34);
- else
- actionDisplay(1330, 16, 159, 10, 1, 200, 0, 7, 0, 154, 154);
- break;
- case 15:
- if (_arrunkObj1337[0]._arr3[0]._field34 != 0)
- displayDialog(_arrunkObj1337[3]._arr3[0]._field34);
- else
- actionDisplay(1330, 13, 159, 10, 1, 200, 0, 7, 0, 154, 154);
- break;
- case 20:
- if (_arrunkObj1337[1]._arr3[0]._field34 != 0)
- displayDialog(_arrunkObj1337[1]._arr3[0]._field34);
- else
- actionDisplay(1330, 18, 159, 10, 1, 200, 0, 7, 0, 154, 154);
- break;
- default:
- break;
- }
- } else {
- if (subC2BF8(&_item7, pt)) {
- if (_item7._field34 != 0)
- displayDialog(_item7._field34);
- else
- actionDisplay(1330, 7, 159, 10, 1, 200, 0, 7, 0, 154, 154);
- } else if (_background1._bounds.contains(pt)) {
- actionDisplay(1330, 43, 159, 10, 1, 200, 0, 7, 0, 154, 154);
- } else if (subC2BF8(&_item8, pt)) {
- actionDisplay(1330, 4, 159, 10, 1, 200, 0, 7, 0, 154, 154);
- } else if ( (subC2BF8(&_arrunkObj1337[2]._arr4[0], pt))
- || (subC2BF8(&_arrunkObj1337[3]._arr4[0], pt))
- || (subC2BF8(&_arrunkObj1337[0]._arr4[0], pt))
- || (subC2BF8(&_arrunkObj1337[1]._arr4[0], pt)) ) {
- actionDisplay(1330, 32, 159, 10, 1, 200, 0, 7, 0, 154, 154);
- } else {
- if (subC2BF8(&_arrunkObj1337[2]._arr1[0], pt))
- displayDialog(_arrunkObj1337[2]._arr1[0]._field34);
- else if (subC2BF8(&_arrunkObj1337[2]._arr1[1], pt))
- displayDialog(_arrunkObj1337[2]._arr1[1]._field34);
- else if (subC2BF8(&_arrunkObj1337[2]._arr1[2], pt))
- displayDialog(_arrunkObj1337[2]._arr1[2]._field34);
- else if (subC2BF8(&_arrunkObj1337[2]._arr1[3], pt))
- displayDialog(_arrunkObj1337[2]._arr1[3]._field34);
- else if ((curReg >= 6) && (curReg <= 9))
- actionDisplay(1330, 29, 159, 10, 1, 200, 0, 7, 0, 154, 154);
- else if ((curReg >= 11) && (curReg <= 14))
- actionDisplay(1330, 31, 159, 10, 1, 200, 0, 7, 0, 154, 154);
- else if ((curReg >= 16) && (curReg <= 19))
- actionDisplay(1330, 30, 159, 10, 1, 200, 0, 7, 0, 154, 154);
- else {
- switch (curReg) {
- case 0:
- actionDisplay(1330, 2, 159, 134, 1, 200, 0, 7, 0, 105, 105);
- break;
- case 5:
- actionDisplay(1330, 25, 159, 10, 1, 200, 0, 7, 0, 154, 154);
- break;
- case 10:
- actionDisplay(1330, 27, 159, 10, 1, 200, 0, 7, 0, 154, 154);
- break;
- case 15:
- actionDisplay(1330, 26, 159, 10, 1, 200, 0, 7, 0, 154, 154);
- break;
- case 20:
- actionDisplay(1330, 28, 159, 10, 1, 200, 0, 7, 0, 154, 154);
- break;
- case 21:
- actionDisplay(1330, 24, 159, 10, 1, 200, 0, 7, 0, 154, 154);
- break;
- default:
- break;
- }
- }
- }
+ } else if (_discardPile.isIn(pt)) {
+ if (_discardPile._cardId != 0)
+ displayDialog(_discardPile._cardId);
+ else
+ actionDisplay(1330, 7, 159, 10, 1, 200, 0, 7, 0, 154, 154);
+ } else if (_helpIcon._bounds.contains(pt))
+ actionDisplay(1330, 43, 159, 10, 1, 200, 0, 7, 0, 154, 154);
+ else if (_stockCard.isIn(pt))
+ actionDisplay(1330, 4, 159, 10, 1, 200, 0, 7, 0, 154, 154);
+ else if ( (_gameBoardSide[2]._emptyStationPos.isIn(pt))
+ || (_gameBoardSide[3]._emptyStationPos.isIn(pt))
+ || (_gameBoardSide[0]._emptyStationPos.isIn(pt))
+ || (_gameBoardSide[1]._emptyStationPos.isIn(pt)) )
+ actionDisplay(1330, 32, 159, 10, 1, 200, 0, 7, 0, 154, 154);
+ else if (_gameBoardSide[2]._handCard[0].isIn(pt))
+ displayDialog(_gameBoardSide[2]._handCard[0]._cardId);
+ else if (_gameBoardSide[2]._handCard[1].isIn(pt))
+ displayDialog(_gameBoardSide[2]._handCard[1]._cardId);
+ else if (_gameBoardSide[2]._handCard[2].isIn(pt))
+ displayDialog(_gameBoardSide[2]._handCard[2]._cardId);
+ else if (_gameBoardSide[2]._handCard[3].isIn(pt))
+ displayDialog(_gameBoardSide[2]._handCard[3]._cardId);
+ else if ((curReg >= 6) && (curReg <= 9))
+ actionDisplay(1330, 29, 159, 10, 1, 200, 0, 7, 0, 154, 154);
+ else if ((curReg >= 11) && (curReg <= 14))
+ actionDisplay(1330, 31, 159, 10, 1, 200, 0, 7, 0, 154, 154);
+ else if ((curReg >= 16) && (curReg <= 19))
+ actionDisplay(1330, 30, 159, 10, 1, 200, 0, 7, 0, 154, 154);
+ else {
+ switch (curReg) {
+ case 0:
+ actionDisplay(1330, 2, 159, 134, 1, 200, 0, 7, 0, 105, 105);
+ break;
+ case 5:
+ actionDisplay(1330, 25, 159, 10, 1, 200, 0, 7, 0, 154, 154);
+ break;
+ case 10:
+ actionDisplay(1330, 27, 159, 10, 1, 200, 0, 7, 0, 154, 154);
+ break;
+ case 15:
+ actionDisplay(1330, 26, 159, 10, 1, 200, 0, 7, 0, 154, 154);
+ break;
+ case 20:
+ actionDisplay(1330, 28, 159, 10, 1, 200, 0, 7, 0, 154, 154);
+ break;
+ case 21:
+ actionDisplay(1330, 24, 159, 10, 1, 200, 0, 7, 0, 154, 154);
+ break;
+ default:
+ break;
}
}
}
@@ -5736,8 +5548,8 @@ void Scene1337::subCDB90(int arg1, Common::Point pt) {
return;
for (int i = 0; i <= 7; i++) {
- if (subC2BF8(&_arrunkObj1337[2]._arr2[i], pt)) {
- switch (_arrunkObj1337[2]._arr2[i]._field34) {
+ if (_gameBoardSide[2]._outpostStation[i].isIn(pt)) {
+ switch (_gameBoardSide[2]._outpostStation[i]._cardId) {
case 0:
actionDisplay(1330, 11, 159, 10, 1, 200, 0, 7, 0, 154, 154);
break;
@@ -5748,10 +5560,10 @@ void Scene1337::subCDB90(int arg1, Common::Point pt) {
actionDisplay(1330, 34, 159, 10, 1, 200, 0, 7, 0, 154, 154);
break;
}
- found = true;
- break;
- } else if (subC2BF8(&_arrunkObj1337[0]._arr2[i], pt)) {
- switch (_arrunkObj1337[0]._arr2[i]._field34) {
+ return;
+ }
+ if (_gameBoardSide[0]._outpostStation[i].isIn(pt)) {
+ switch (_gameBoardSide[0]._outpostStation[i]._cardId) {
case 0:
actionDisplay(1330, 11, 159, 10, 1, 200, 0, 7, 0, 154, 154);
break;
@@ -5759,10 +5571,10 @@ void Scene1337::subCDB90(int arg1, Common::Point pt) {
actionDisplay(1330, 1, 159, 10, 1, 200, 0, 7, 0, 154, 154);
break;
}
- found = true;
- break;
- } else if (subC2BF8(&_arrunkObj1337[1]._arr2[i], pt)) {
- switch (_arrunkObj1337[1]._arr2[i]._field34) {
+ return;
+ }
+ if (_gameBoardSide[1]._outpostStation[i].isIn(pt)) {
+ switch (_gameBoardSide[1]._outpostStation[i]._cardId) {
case 0:
actionDisplay(1330, 146, 300, 99, 1, 136, 0, 7, 0, 117, 117);
break;
@@ -5770,10 +5582,10 @@ void Scene1337::subCDB90(int arg1, Common::Point pt) {
actionDisplay(1330, 144, 300, 99, 1, 136, 0, 7, 0, 117, 117);
break;
}
- found = true;
- break;
- } else if (subC2BF8(&_arrunkObj1337[3]._arr2[i], pt)) {
- switch (_arrunkObj1337[3]._arr2[i]._field34) {
+ return;
+ }
+ if (_gameBoardSide[3]._outpostStation[i].isIn(pt)) {
+ switch (_gameBoardSide[3]._outpostStation[i]._cardId) {
case 0:
actionDisplay(1330, 147, 20, 99, 1, 136, 0, 7, 0, 172, 172);
break;
@@ -5781,73 +5593,64 @@ void Scene1337::subCDB90(int arg1, Common::Point pt) {
actionDisplay(1330, 145, 20, 99, 1, 136, 0, 7, 0, 172, 172);
break;
}
- found = true;
- break;
+ return;
}
}
- if (subC2BF8(&_arrunkObj1337[2]._arr3[0], pt)) {
- if (_arrunkObj1337[0]._arr3[0]._field34 != 0) {
+ if (_gameBoardSide[2]._delayCard.isIn(pt)) {
+ // The original uses _gameBoardSide[0], which is obviously a bug.
+ if (_gameBoardSide[2]._delayCard._cardId != 0)
actionDisplay(1330, 39, 159, 10, 1, 200, 0, 7, 0, 154, 154);
- } else {
+ else
actionDisplay(1330, 11, 159, 10, 1, 200, 0, 7, 0, 154, 154);
- }
- found = true;
- }
- if (subC2BF8(&_arrunkObj1337[3]._arr3[0], pt)) {
- if (_arrunkObj1337[3]._arr3[0]._field34 != 0) {
+ return;
+ }
+ if (_gameBoardSide[3]._delayCard.isIn(pt)) {
+ if (_gameBoardSide[3]._delayCard._cardId != 0)
actionDisplay(1330, 145, 20, 99, 1, 136, 0, 7, 0, 172, 172);
- } else {
+ else
actionDisplay(1330, 147, 20, 99, 1, 136, 0, 7, 0, 172, 172);
- }
- found = true;
- }
- if (subC2BF8(&_arrunkObj1337[1]._arr3[0], pt)) {
- if (_arrunkObj1337[1]._arr3[0]._field34 != 0) {
+ return;
+ }
+ if (_gameBoardSide[1]._delayCard.isIn(pt)) {
+ if (_gameBoardSide[1]._delayCard._cardId != 0)
actionDisplay(1330, 144, 300, 99, 1, 136, 0, 7, 0, 117, 117);
- } else {
+ else
actionDisplay(1330, 146, 300, 99, 1, 136, 0, 7, 0, 117, 117);
- }
- found = true;
- }
- if (subC2BF8(&_arrunkObj1337[0]._arr3[0], pt)) {
- if (_arrunkObj1337[0]._arr3[0]._field34 != 0) {
+ return;
+ }
+ if (_gameBoardSide[0]._delayCard.isIn(pt)) {
+ if (_gameBoardSide[0]._delayCard._cardId != 0)
actionDisplay(1330, 1, 159, 10, 1, 200, 0, 7, 0, 154, 154);
- } else {
+ else
actionDisplay(1330, 11, 159, 10, 1, 200, 0, 7, 0, 154, 154);
- }
- found = true;
- }
- if (subC2BF8(&_arrunkObj1337[3]._arr4[0], pt)) {
+ return;
+ }
+ if (_gameBoardSide[3]._emptyStationPos.isIn(pt)) {
actionDisplay(1330, 147, 20, 99, 1, 136, 0, 7, 0, 172, 172);
- found = true;
+ return;
}
-
- if (subC2BF8(&_arrunkObj1337[1]._arr4[0], pt)) {
+ if (_gameBoardSide[1]._emptyStationPos.isIn(pt)) {
actionDisplay(1330, 146, 300, 99, 1, 136, 0, 7, 0, 117, 117);
- found = true;
+ return;
}
-
- if (subC2BF8(&_arrunkObj1337[0]._arr4[0], pt)) {
+ if (_gameBoardSide[0]._emptyStationPos.isIn(pt)) {
actionDisplay(1330, 11, 159, 10, 1, 200, 0, 7, 0, 154, 154);
- found = true;
- }
-
- if (found)
return;
+ }
- if (_background1._bounds.contains(pt)) {
- subCD193();
+ if (_helpIcon._bounds.contains(pt)) {
+ showOptionsDialog();
return;
}
- if (subC2BF8(&_item7, pt))
+ if (_discardPile.isIn(pt))
actionDisplay(1330, 9, 159, 10, 1, 200, 0, 7, 0, 154, 154);
- else if (subC2BF8(&_item8, pt))
+ else if (_stockCard.isIn(pt))
actionDisplay(1330, 5, 159, 10, 1, 200, 0, 7, 0, 154, 154);
else {
switch (curReg) {
@@ -5894,992 +5697,1090 @@ void Scene1337::subCDB90(int arg1, Common::Point pt) {
}
}
-void Scene1337::subCF31D() {
- int tmpVal = 1;
- bool found;
- int count;
-
- if (this->_arrunkObj1337[1]._arr3[0]._field34 != 0) {
- switch (_arrunkObj1337[1]._arr3[0]._field34) {
+void Scene1337::handlePlayer0() {
+ if (_gameBoardSide[0]._delayCard._cardId != 0) {
+ switch (_gameBoardSide[0]._delayCard._cardId) {
case 10:
- // No break on purpose
+ //No break on purpose
case 12:
- // No break on purpose
+ //No break on purpose
case 15:
- // No break on purpose
+ //No break on purpose
case 17:
- // No break on purpose
+ //No break on purpose
case 18:
- // No break on purpose
+ //No break on purpose
case 19:
- // No break on purpose
+ //No break on purpose
case 20:
- // No break on purpose
+ //No break on purpose
case 21:
- tmpVal = 0;
- subC4A39(&_arrunkObj1337[1]._arr3[0]);
+ discardCard(&_gameBoardSide[0]._delayCard);
break;
default:
- found = false;
- int i;
- for (i = 0; i <= 3; i++) {
- if (subC3386(_arrunkObj1337[1]._arr3[0]._field34, _arrunkObj1337[1]._arr1[i]._field34)) {
- found = true;
- break;
+ for (int i = 0; i <= 3; i++) {
+ if (checkAntiDelayCard(_gameBoardSide[0]._delayCard._cardId, _gameBoardSide[0]._handCard[i]._cardId)) {
+ playAntiDelayCard(&_gameBoardSide[0]._handCard[i], &_gameBoardSide[0]._delayCard);
+ return;
}
}
- if (found) {
- tmpVal = 0;
- subC34A1(&_arrunkObj1337[1]._arr1[i], &_arrunkObj1337[1]._arr3[0]);
- }
+ break;
}
}
- if (tmpVal != 1)
- return;
-
- found = false;
for (int i = 0; i <= 3; i++) {
- int tmpIndx = subC26CB(1, i);
- if (tmpIndx == -1)
- break;
+ int tmpVal = getStationId(0, i);
- tmpVal = 0;
- for (int j = 0; j <= 7; j++) {
- if (_arrunkObj1337[1]._arr2[j]._field34 == _arrunkObj1337[1]._arr1[tmpIndx]._field34) {
- tmpVal = 1;
- break;
+ if (tmpVal != -1) {
+ bool stationAlreadyPresentFl = false;
+ for (int j = 0; j <= 7; j++) {
+ if (_gameBoardSide[0]._outpostStation[j]._cardId == _gameBoardSide[0]._handCard[tmpVal]._cardId) {
+ stationAlreadyPresentFl = true;
+ break;
+ }
}
- }
- if (tmpVal == 0)
- break;
-
- for (int j = 0; j <= 7; j++) {
- if (_arrunkObj1337[1]._arr2[j]._field34 == 1) {
- if (!subC2687(_arrunkObj1337[1]._arr3[0]._field34)) {
- count = 0;
- for (int k = 0; k <= 7; k++) {
- if ((_arrunkObj1337[1]._arr2[k]._field34 > 1) && (_arrunkObj1337[1]._arr2[k]._field34 <= 9))
- ++count;
- }
+ if (!stationAlreadyPresentFl) {
+ for (int j = 0; j <= 7; j++) {
+ if ((_gameBoardSide[0]._outpostStation[j]._cardId == 1) && !isStopConstructionCard(_gameBoardSide[0]._delayCard._cardId)) {
+ int stationCount = 0;
+ for (int k = 0; k <= 7; k++) {
+ if ((_gameBoardSide[0]._outpostStation[k]._cardId > 1) && (_gameBoardSide[0]._outpostStation[k]._cardId <= 9)) {
+ ++stationCount;
+ }
+ }
- if (count == 7)
- _field424A = 1;
+ if (stationCount == 7)
+ _winnerId = 0;
- subC33C0(&_arrunkObj1337[1]._arr1[tmpIndx], &_arrunkObj1337[1]._arr2[j]);
- found = true;
- break;
+ playStationCard(&_gameBoardSide[0]._handCard[tmpVal], &_gameBoardSide[0]._outpostStation[j]);
+ return;
+ }
}
}
}
}
- if (found)
- return;
+ int tmpVal = findPlatformCardInHand(0);
- tmpVal = subC2719(1);
if (tmpVal != -1) {
for (int i = 0; i <= 7; i++) {
- if ((_arrunkObj1337[1]._arr2[i]._field34 == 0) && (!subC2687(_arrunkObj1337[1]._arr3[0]._field34))) {
- subC340B(&_arrunkObj1337[1]._arr1[tmpVal], &_arrunkObj1337[1]._arr2[i]);
- found = true;
- break;
- }
+ if ((_gameBoardSide[0]._outpostStation[i]._cardId == 0) && !isStopConstructionCard(_gameBoardSide[0]._delayCard._cardId)) {
+ playPlatformCard(&_gameBoardSide[0]._handCard[tmpVal], &_gameBoardSide[0]._outpostStation[i]);
+ return;
+ }
}
}
- if (found)
- return;
-
- tmpVal = subC274D(1);
- int tmpVal2 = subC331B(1);
-
- if ((tmpVal != -1) && ( tmpVal2 != -1)) {
- subC358E(&_arrunkObj1337[1]._arr1[tmpVal], tmpVal2);
- found = true;
- }
-
- if (found)
- return;
-
- tmpVal = subC2781(1);
- if (tmpVal != -1) {
- count = -1;
- int rndVal = R2_GLOBALS._randomSource.getRandomNumber(3);
- for (int i = 0; i <= 3; i++) {
- if (rndVal != 1) {
- if ( (_arrunkObj1337[rndVal]._arr1[0]._field34 != 0)
- || (_arrunkObj1337[rndVal]._arr1[1]._field34 != 0)
- || (_arrunkObj1337[rndVal]._arr1[2]._field34 != 0)
- || (_arrunkObj1337[rndVal]._arr1[3]._field34 == 0)) {
- count = rndVal;
- break;
- }
-
- rndVal--;
- if (rndVal < 0)
- rndVal = 3;
+ int card13Id = findCard13InHand(0);
+ if (card13Id != -1) {
+ for (int i = 0; i <= 7; i++) {
+ if (_gameBoardSide[2]._outpostStation[i]._cardId != 0) {
+ playCounterTrickCard(&_gameBoardSide[0]._handCard[card13Id], 2);
+ return;
}
}
+ }
- if (count != -1) {
- subC318B(1, &_arrunkObj1337[1]._arr1[tmpVal], count);
- found = true;
+ int thieftId = checkThieftCard(0);
+ if (thieftId != -1) {
+ if ( (_gameBoardSide[2]._handCard[0]._cardId != 0)
+ || (_gameBoardSide[2]._handCard[1]._cardId != 0)
+ || (_gameBoardSide[2]._handCard[2]._cardId != 0)
+ || (_gameBoardSide[2]._handCard[3]._cardId != 0) ) {
+ playThieftCard(0, &_gameBoardSide[0]._handCard[thieftId], 2);
+ return;
}
}
- if (found)
- return;
+ for (int i = 0; i <= 3; i++) {
+ if ((isDelayCard(_gameBoardSide[0]._handCard[i]._cardId) != -1)
+ && (_gameBoardSide[2]._delayCard._cardId == 0)
+ && isAttackPossible(2, _gameBoardSide[0]._handCard[i]._cardId)) {
+ playDelayCard(&_gameBoardSide[0]._handCard[i], &_gameBoardSide[2]._delayCard);
+ return;
+ }
+ }
- count = -1;
- int i;
- for (i = 0; i <= 3; i++) {
- tmpVal = subC27B5(_arrunkObj1337[1]._arr1[i]._field34);
- if (tmpVal != -1) {
- int rndVal = R2_GLOBALS._randomSource.getRandomNumber(3);
+ for (int i = 0; i <= 3; i++) {
+ if ((getStationCardId(_gameBoardSide[0]._handCard[i]._cardId) != -1)
+ && (_gameBoardSide[2]._delayCard._cardId == 0)
+ && isAttackPossible(2, _gameBoardSide[0]._handCard[i]._cardId)) {
+ playDelayCard(&_gameBoardSide[0]._handCard[i], &_gameBoardSide[2]._delayCard);
+ return;
+ }
+ }
- for (int j = 0; j <= 3; j++) {
- if (tmpVal != 1) {
- for (int k = 0; k <= 7; k++) {
- // 'k' is not used in that loop.
- // It looks suspicious.
- if ((_arrunkObj1337[tmpVal]._arr3[0]._field34 == 0) && (subC32B1(tmpVal, _arrunkObj1337[1]._arr1[i]._field34))) {
- count = tmpVal;
- break;
- }
- }
- }
+ card13Id = findCard13InHand(0);
+ int victimPlayerId = getPlayerWithOutpost(0);
- if (count != -1) {
- found = true;
- break;
- } else {
- rndVal--;
- if (rndVal < 0)
- rndVal = 3;
- }
- }
+ if ((card13Id != -1) && (victimPlayerId != -1)) {
+ playCounterTrickCard(&_gameBoardSide[0]._handCard[card13Id], victimPlayerId);
+ return;
+ }
- if (found)
- break;
+ thieftId = checkThieftCard(0);
+ if (thieftId != -1) {
+ if ( (_gameBoardSide[1]._handCard[0]._cardId != 0)
+ || (_gameBoardSide[1]._handCard[1]._cardId != 0)
+ || (_gameBoardSide[1]._handCard[2]._cardId != 0)
+ || (_gameBoardSide[1]._handCard[3]._cardId != 0) ) {
+ playThieftCard(0, &_gameBoardSide[0]._handCard[thieftId], 1);
+ return;
}
}
- if (found) {
- if (count == -1)
- return;
+ for (int i = 0; i <= 3; i++) {
+ if (getStationCardId(_gameBoardSide[0]._handCard[i]._cardId) != -1) {
+ if ((_gameBoardSide[1]._delayCard._cardId == 0) && isAttackPossible(1, _gameBoardSide[0]._handCard[i]._cardId)) {
+ playDelayCard(&_gameBoardSide[0]._handCard[i], &_gameBoardSide[1]._delayCard);
+ return;
+ }
- subC3456(&_arrunkObj1337[1]._arr1[i], &_arrunkObj1337[count]._arr3[0]);
- } else {
- int j;
- for (j = 0; j <= 3; j++) {
- if (subC27F9(_arrunkObj1337[1]._arr1[j]._field34) != -1) {
- count = -1;
- int rndVal = R2_GLOBALS._randomSource.getRandomNumber(3);
- for (int l = 0; l <= 3; l++) {
- if (rndVal != 1) {
- for (int m = 0; m <= 7; m++) {
- // 'm' is not used in that loop. It looks suspicious.
- if ((_arrunkObj1337[rndVal]._arr3[0]._field34 == 0) && (_arrunkObj1337[1]._arr1[j]._field34 == 1)) {
- count = rndVal;
- break;
- }
- }
- }
- if (count != -1) {
- found = true;
- break;
- } else {
- rndVal--;
- if (rndVal < 0)
- rndVal = 3;
- }
- }
- if (found)
- break;
+ if ((_gameBoardSide[3]._delayCard._cardId == 0) && isAttackPossible(3, _gameBoardSide[0]._handCard[i]._cardId)) {
+ playDelayCard(&_gameBoardSide[0]._handCard[i], &_gameBoardSide[3]._delayCard);
+ return;
}
}
+ }
- if (found) {
- if (count == -1)
+ for (int i = 0; i <= 3; i++) {
+ tmpVal = isDelayCard(_gameBoardSide[0]._handCard[i]._cardId);
+ if (tmpVal != -1) {
+ if ((_gameBoardSide[1]._delayCard._cardId == 0) && isAttackPossible(1, _gameBoardSide[0]._handCard[i]._cardId)) {
+ playDelayCard(&_gameBoardSide[0]._handCard[i], &_gameBoardSide[1]._delayCard);
return;
+ }
- subC3456(&_arrunkObj1337[1]._arr1[j], &_arrunkObj1337[count]._arr3[0]);
- } else {
- subC2835(1);
+ if ((_gameBoardSide[3]._delayCard._cardId == 0) && isAttackPossible(3, _gameBoardSide[0]._handCard[i]._cardId)) {
+ playDelayCard(&_gameBoardSide[0]._handCard[i], &_gameBoardSide[3]._delayCard);
+ return;
+ }
}
}
+ handlePlayer01Discard(0);
}
-void Scene1337::subCF979() {
- bool found = true;
-
- if (_arrunkObj1337[0]._arr3[0]._field34 != 0) {
- switch (_arrunkObj1337[0]._arr3[0]._field34) {
+void Scene1337::handlePlayer1() {
+ if (this->_gameBoardSide[1]._delayCard._cardId != 0) {
+ switch (_gameBoardSide[1]._delayCard._cardId) {
case 10:
- //No break on purpose
+ // No break on purpose
case 12:
- //No break on purpose
+ // No break on purpose
case 15:
- //No break on purpose
+ // No break on purpose
case 17:
- //No break on purpose
+ // No break on purpose
case 18:
- //No break on purpose
+ // No break on purpose
case 19:
- //No break on purpose
+ // No break on purpose
case 20:
- //No break on purpose
+ // No break on purpose
case 21:
- subC4A39(&_arrunkObj1337[0]._arr3[0]);
- found = false;
- break;
+ discardCard(&_gameBoardSide[1]._delayCard);
+ return;
default:
- int i;
- found = false;
-
- for (i = 0; i <= 3; i++) {
- if (subC3386(_arrunkObj1337[0]._arr3[0]._field34, _arrunkObj1337[0]._arr1[i]._field34)) {
- found = true;
- break;
+ for (int i = 0; i <= 3; i++) {
+ if (checkAntiDelayCard(_gameBoardSide[1]._delayCard._cardId, _gameBoardSide[1]._handCard[i]._cardId)) {
+ playAntiDelayCard(&_gameBoardSide[1]._handCard[i], &_gameBoardSide[1]._delayCard);
+ return;
}
}
-
- if (found) {
- found = false;
- subC34A1(&_arrunkObj1337[0]._arr1[i], &_arrunkObj1337[0]._arr3[0]);
- }
break;
}
}
- if (found)
- return;
-
- int tmpVal;
- found = false;
for (int i = 0; i <= 3; i++) {
- tmpVal = subC26CB(0, i);
-
- if (tmpVal != -1) {
- bool flag = false;
- for (int j = 0; j <= 7; j++) {
- if (_arrunkObj1337[0]._arr2[j]._field34 == _arrunkObj1337[0]._arr1[tmpVal]._field34) {
- flag = true;
- break;
- }
- }
-
- if (!flag) {
- for (int j = 0; j <= 7; j++) {
- if ((_arrunkObj1337[0]._arr2[j]._field34 == 1) && (!subC2687(_arrunkObj1337[0]._arr3[0]._field34))) {
- int count = 0;
- for (int k = 0; k <= 7; k++) {
- if ((_arrunkObj1337[0]._arr2[k]._field34 > 1) && (_arrunkObj1337[0]._arr2[k]._field34 <= 9)) {
- ++count;
- }
- }
-
- if (count == 7)
- _field424A = 0;
+ int tmpIndx = getStationId(1, i);
+ if (tmpIndx == -1)
+ break;
- subC33C0(&_arrunkObj1337[0]._arr1[tmpVal], &_arrunkObj1337[0]._arr2[j]);
- found = true;
- }
- }
+ int tmpVal = 0;
+ for (int j = 0; j <= 7; j++) {
+ if (_gameBoardSide[1]._outpostStation[j]._cardId == _gameBoardSide[1]._handCard[tmpIndx]._cardId) {
+ tmpVal = 1;
+ break;
}
}
- if (found)
+ if (tmpVal == 0)
break;
- }
- if (found)
- return;
+ for (int j = 0; j <= 7; j++) {
+ if ((_gameBoardSide[1]._outpostStation[j]._cardId == 1) && !isStopConstructionCard(_gameBoardSide[1]._delayCard._cardId)) {
+ int stationCount = 0;
+ for (int k = 0; k <= 7; k++) {
+ if ((_gameBoardSide[1]._outpostStation[k]._cardId > 1) && (_gameBoardSide[1]._outpostStation[k]._cardId <= 9))
+ ++stationCount;
+ }
- found = false;
- tmpVal = subC2719(0);
+ if (stationCount == 7)
+ _winnerId = 1;
- if (tmpVal != -1) {
- for (int i = 0; i <= 7; i++) {
- if ((_arrunkObj1337[0]._arr2[i]._field34 == 0) && (!subC2687(_arrunkObj1337[0]._arr3[0]._field34))) {
- subC340B(&_arrunkObj1337[0]._arr1[tmpVal], &_arrunkObj1337[0]._arr2[i]);
- found = true;
- break;
+ playStationCard(&_gameBoardSide[1]._handCard[tmpIndx], &_gameBoardSide[1]._outpostStation[j]);
+ return;
}
}
}
- if (found)
- return;
-
- tmpVal = subC274D(0);
- if (tmpVal != -1) {
+ int normalCardId = findPlatformCardInHand(1);
+ if (normalCardId != -1) {
for (int i = 0; i <= 7; i++) {
- if (_arrunkObj1337[2]._arr2[i]._field34 != 0) {
- subC358E(&_arrunkObj1337[0]._arr1[tmpVal], 2);
- found = true;
- break;
+ if ((_gameBoardSide[1]._outpostStation[i]._cardId == 0) && !isStopConstructionCard(_gameBoardSide[1]._delayCard._cardId)) {
+ playPlatformCard(&_gameBoardSide[1]._handCard[normalCardId], &_gameBoardSide[1]._outpostStation[i]);
+ return;
}
}
}
- if (found)
- return;
-
- tmpVal = subC2781(0);
- if (tmpVal != -1) {
- if ( (_arrunkObj1337[2]._arr1[0]._field34 != 0)
- || (_arrunkObj1337[2]._arr1[1]._field34 != 0)
- || (_arrunkObj1337[2]._arr1[2]._field34 != 0)
- || (_arrunkObj1337[2]._arr1[3]._field34 != 0) ) {
- subC318B(0, &_arrunkObj1337[0]._arr1[tmpVal], 2);
- found = true;
- }
- }
+ int card13Id = findCard13InHand(1);
+ int tmpVal2 = getPlayerWithOutpost(1);
- if (found)
+ if ((card13Id != -1) && (tmpVal2 != -1)) {
+ playCounterTrickCard(&_gameBoardSide[1]._handCard[card13Id], tmpVal2);
return;
+ }
- for (int i = 0; i <= 3; i++) {
- if (subC27B5(_arrunkObj1337[0]._arr1[i]._field34) != -1) {
- // The variable 'j' is not used in the inner code of the loop. It's suspect
- for (int j = 0; j <= 7; j++) {
- if ((_arrunkObj1337[2]._arr3[0]._field34 == 0) && (subC32B1(2, _arrunkObj1337[0]._arr1[i]._field34))) {
- subC3456(&_arrunkObj1337[0]._arr1[i], &_arrunkObj1337[2]._arr3[0]);
- found = true;
- break;
+ int thieftId = checkThieftCard(1);
+ if (thieftId != -1) {
+ int playerIdFound = -1;
+ int rndVal = R2_GLOBALS._randomSource.getRandomNumber(3);
+ for (int i = 0; i <= 3; i++) {
+ if (rndVal != 1) {
+ if ( (_gameBoardSide[rndVal]._handCard[0]._cardId != 0)
+ || (_gameBoardSide[rndVal]._handCard[1]._cardId != 0)
+ || (_gameBoardSide[rndVal]._handCard[2]._cardId != 0)
+ || (_gameBoardSide[rndVal]._handCard[3]._cardId == 0)) {
+ playerIdFound = rndVal;
+ break;
}
}
+ // The original was only updating in the rndVal block,
+ // which was a bug as the checks were stopping at this point
+ rndVal--;
+ if (rndVal < 0)
+ rndVal = 3;
+ }
- if (found)
- break;
+ if (playerIdFound != -1) {
+ playThieftCard(1, &_gameBoardSide[1]._handCard[thieftId], playerIdFound);
+ return;
}
}
- if (found)
- return;
+ int count = -1;
+ int i;
+ for (i = 0; i <= 3; i++) {
+ int tmpVal = isDelayCard(_gameBoardSide[1]._handCard[i]._cardId);
+ if (tmpVal != -1) {
+ int rndVal = R2_GLOBALS._randomSource.getRandomNumber(3);
- for (int i = 0; i <= 3; i++) {
- if (subC27F9(_arrunkObj1337[0]._arr1[i]._field34) != -1) {
- // The variable 'j' is not used in the inner code of the loop. It's suspect
- for (int j = 0; j <= 7; j++) {
- if ((_arrunkObj1337[2]._arr3[0]._field34 == 0) && (subC32B1(2, _arrunkObj1337[0]._arr1[i]._field34))) {
- subC3456(&_arrunkObj1337[0]._arr1[i], &_arrunkObj1337[2]._arr3[0]);
- found = true;
+ for (int j = 0; j <= 3; j++) {
+ //CHECKME: tmpVal or rndVal?
+ // FIXME: This is probably meant to be rndVal, but not clear...
+ if (tmpVal < 0 || tmpVal >= ARRAYSIZE(_gameBoardSide))
+ error("Scene1337::handlePlayer1() tmpVal:%d out of range 0 to %d", tmpVal, ARRAYSIZE(_gameBoardSide)-1);
+
+ if (tmpVal != 1) {
+ if ((_gameBoardSide[tmpVal]._delayCard._cardId == 0) && isAttackPossible(tmpVal, _gameBoardSide[1]._handCard[i]._cardId))
+ count = tmpVal;
}
- }
- if (found)
- break;
+ if (count < 0 || count >= ARRAYSIZE(_gameBoardSide))
+ error("Scene1337::handlePlayer1() count:%d out of range 0 to %d", count, ARRAYSIZE(_gameBoardSide)-1);
+
+ if (count != -1) {
+ playDelayCard(&_gameBoardSide[1]._handCard[i], &_gameBoardSide[count]._delayCard);
+ return;
+ } else {
+ rndVal--;
+ if (rndVal < 0)
+ rndVal = 3;
+ }
+ }
}
}
- if (found)
- return;
-
- tmpVal = subC274D(0);
- int tmpVal2 = subC331B(0);
-
- if ((tmpVal != -1) && (tmpVal2 != -1)) {
- subC358E(&_arrunkObj1337[0]._arr1[tmpVal], tmpVal2);
- found = true;
+ int j;
+ for (j = 0; j <= 3; j++) {
+ if (getStationCardId(_gameBoardSide[1]._handCard[j]._cardId) != -1) {
+ count = -1;
+ int rndVal = R2_GLOBALS._randomSource.getRandomNumber(3);
+ for (int l = 0; l <= 3; l++) {
+ if (rndVal != 1) {
+ if ((_gameBoardSide[rndVal]._delayCard._cardId == 0) && (_gameBoardSide[1]._handCard[j]._cardId == 1))
+ count = rndVal;
+ }
+ if (count != -1) {
+ playDelayCard(&_gameBoardSide[1]._handCard[j], &_gameBoardSide[count]._delayCard);
+ return;
+ } else {
+ rndVal--;
+ if (rndVal < 0)
+ rndVal = 3;
+ }
+ }
+ }
}
- if (found)
- return;
+ handlePlayer01Discard(1);
+}
- tmpVal = subC2781(0);
- if (tmpVal != -1) {
- if ( (_arrunkObj1337[1]._arr1[0]._field34 != 0)
- || (_arrunkObj1337[1]._arr1[1]._field34 != 0)
- || (_arrunkObj1337[1]._arr1[2]._field34 != 0)
- || (_arrunkObj1337[1]._arr1[3]._field34 != 0) ) {
- subC318B(0, &_arrunkObj1337[0]._arr1[tmpVal], 1);
- found = true;
+void Scene1337::handlePlayer3() {
+ if (_gameBoardSide[3]._delayCard._cardId != 0) {
+ switch (_gameBoardSide[3]._delayCard._cardId) {
+ case 10:
+ // No break on purpose
+ case 12:
+ // No break on purpose
+ case 15:
+ // No break on purpose
+ case 17:
+ // No break on purpose
+ case 18:
+ // No break on purpose
+ case 19:
+ // No break on purpose
+ case 20:
+ // No break on purpose
+ case 21:
+ discardCard(&_gameBoardSide[3]._delayCard);
+ return;
+ default:
+ for (int i = 0; i <= 3; i++) {
+ if (checkAntiDelayCard(_gameBoardSide[3]._delayCard._cardId, _gameBoardSide[3]._handCard[i]._cardId)) {
+ playAntiDelayCard(&_gameBoardSide[3]._handCard[i], &_gameBoardSide[3]._delayCard);
+ return;
+ }
+ }
+ break;
}
}
- if (found)
- return;
+ int randIndx = R2_GLOBALS._randomSource.getRandomNumber(3);
- for (int i = 0; i <= 3; i++) {
- tmpVal = subC27F9(_arrunkObj1337[0]._arr1[i]._field34);
- if (tmpVal != -1) {
- // The variable 'j' is not used in the inner code of the loop. It's suspect.
- for (int j = 0; j <= 7; j++) {
- if ((_arrunkObj1337[1]._arr3[0]._field34 == 0) && (subC32B1(1, _arrunkObj1337[0]._arr1[i]._field34))) {
- subC3456(&_arrunkObj1337[0]._arr1[i], &_arrunkObj1337[1]._arr3[0]);
- found = true;
- }
+ if (_gameBoardSide[3]._handCard[randIndx]._cardId == 1) {
+ for (int i = 0; i <= 7; i++) {
+ if ((_gameBoardSide[3]._outpostStation[i]._cardId == 0) && !isStopConstructionCard(_gameBoardSide[3]._delayCard._cardId)) {
+ playPlatformCard(&_gameBoardSide[3]._handCard[randIndx], &_gameBoardSide[3]._outpostStation[i]);
+ return;
}
+ }
+ } else if (_gameBoardSide[3]._handCard[randIndx]._cardId <= 9) {
+ for (int i = 0; i <= 7; i++) {
+ if (_gameBoardSide[3]._outpostStation[i]._cardId == _gameBoardSide[3]._handCard[randIndx]._cardId) {
+ discardCard(&_gameBoardSide[3]._handCard[randIndx]);
+ return;
+ }
+ }
- if (!found) {
- // The variable 'j' is not used in the inner code of the loop. It's suspect.
+ for (int i = 0; i <= 7; i++) {
+ if ((_gameBoardSide[3]._outpostStation[i]._cardId == 1) && !isStopConstructionCard(_gameBoardSide[3]._delayCard._cardId)) {
+ int stationCount = 0;
for (int j = 0; j <= 7; j++) {
- if ((_arrunkObj1337[3]._arr3[0]._field34 == 0) && (subC32B1(3, _arrunkObj1337[0]._arr1[i]._field34))) {
- subC3456(&_arrunkObj1337[0]._arr1[i], &_arrunkObj1337[3]._arr3[0]);
- found = true;
- }
+ if ((_gameBoardSide[3]._outpostStation[j]._cardId > 1) && (_gameBoardSide[3]._outpostStation[j]._cardId <= 9))
+ ++stationCount;
}
- }
- if (found)
- break;
+ if (stationCount == 7)
+ _winnerId = 3;
+
+ playStationCard(&_gameBoardSide[3]._handCard[randIndx], &_gameBoardSide[3]._outpostStation[i]);
+ return;
+ }
}
- }
+ } else if (_gameBoardSide[3]._handCard[randIndx]._cardId == 13) {
+ int victimId = getPlayerWithOutpost(3);
- if (found)
- return;
+ if (victimId != -1) {
+ playCounterTrickCard(&_gameBoardSide[3]._handCard[randIndx], victimId);
+ return;
+ }
+ } else if (_gameBoardSide[3]._handCard[randIndx]._cardId == 25) {
+ int victimId = -1;
+ int tmpRandIndx = R2_GLOBALS._randomSource.getRandomNumber(3);
- for (int i = 0; i <= 3; i++) {
- tmpVal = subC27B5(_arrunkObj1337[0]._arr1[i]._field34);
- if (tmpVal != -1) {
- // The variable 'j' is not used in the inner code of the loop. It's suspect.
- for (int j = 0; j <= 7; j++) {
- if ((_arrunkObj1337[1]._arr3[0]._field34 == 0) && (subC32B1(1, _arrunkObj1337[0]._arr1[i]._field34))) {
- subC3456(&_arrunkObj1337[0]._arr1[i], &_arrunkObj1337[1]._arr3[0]);
- found = true;
- }
+ for (int i = 0; i <= 3; i++) {
+ if ( (tmpRandIndx != 3)
+ && ( (_gameBoardSide[tmpRandIndx]._handCard[0]._cardId != 0)
+ || (_gameBoardSide[tmpRandIndx]._handCard[1]._cardId != 0)
+ || (_gameBoardSide[tmpRandIndx]._handCard[2]._cardId != 0)
+ || (_gameBoardSide[tmpRandIndx]._handCard[3]._cardId != 0) )) {
+ victimId = tmpRandIndx;
+ break;
}
- if (!found) {
- // The variable 'j' is not used in the inner code of the loop. It's suspect.
- for (int j = 0; j <= 7; j++) {
- if ((_arrunkObj1337[3]._arr3[0]._field34 == 0) && (subC32B1(3, _arrunkObj1337[0]._arr1[i]._field34))) {
- subC3456(&_arrunkObj1337[0]._arr1[i], &_arrunkObj1337[3]._arr3[0]);
- found = true;
- }
+ ++tmpRandIndx;
+ if (tmpRandIndx > 3)
+ tmpRandIndx = 0;
+ }
+
+ if (victimId != -1) {
+ playThieftCard(3, &_gameBoardSide[3]._handCard[randIndx], victimId);
+ return;
+ }
+ } else {
+ switch (_gameBoardSide[3]._handCard[randIndx]._cardId) {
+ case 10:
+ // No break on purpose
+ case 11:
+ // No break on purpose
+ case 12:
+ // No break on purpose
+ case 14:
+ // No break on purpose
+ case 15:
+ // No break on purpose
+ case 16:
+ // No break on purpose
+ case 17:
+ // No break on purpose
+ case 18:
+ // No break on purpose
+ case 19:
+ // No break on purpose
+ case 20:
+ // No break on purpose
+ case 21:
+ // No break on purpose
+ case 24: {
+ int victimId = -1;
+ int tmpRandIndx = R2_GLOBALS._randomSource.getRandomNumber(3);
+
+ for (int i = 0; i <= 3; i++) {
+ if (tmpRandIndx != 3) {
+ if ((_gameBoardSide[tmpRandIndx]._delayCard._cardId == 0)
+ && isAttackPossible(tmpRandIndx, _gameBoardSide[3]._handCard[randIndx]._cardId))
+ victimId = tmpRandIndx;
}
+
+ ++tmpRandIndx;
+ if (tmpRandIndx > 3)
+ tmpRandIndx = 0;
+
+ if (victimId != -1)
+ break;
}
- if (found)
- break;
+ if (victimId != -1) {
+ // Useless second identical check skipped
+ playDelayCard(&_gameBoardSide[3]._handCard[randIndx], &_gameBoardSide[victimId]._delayCard);
+ return;
+ }
+ }
+ default:
+ break;
}
}
- if (found)
- return;
-
- subC2835(0);
-}
-
-void Scene1337::subD026D() {
- subD02CA();
+ discardCard(&_gameBoardSide[3]._handCard[randIndx]);
}
-void Scene1337::subD0281() {
- if (subC27F9(this->_arrunkObj1337[2]._arr3[0]._field34) == -1)
- _unkFctPtr412 = &Scene1337::subD026D;
+void Scene1337::handleAutoplayPlayer2() {
+ if (getStationCardId(this->_gameBoardSide[2]._delayCard._cardId) == -1)
+ _delayedFunction = &Scene1337::handlePlayer2;
else
- subC4A39(&_arrunkObj1337[2]._arr3[0]);
+ discardCard(&_gameBoardSide[2]._delayCard);
}
-void Scene1337::subD02CA() {
- _item6._field36 = g_globals->_events._mousePos;
+void Scene1337::handlePlayer2() {
+ _selectedCard._stationPos = g_globals->_events._mousePos;
if (R2_GLOBALS._v57810 == 200) {
- int di;
- for (di = 0; di < 4; di++) {
- if ((subC2BF8(&_arrunkObj1337[2]._arr1[di], _item6._field36) != 0) && (_arrunkObj1337[2]._arr1[di]._field34 != 0)) {
- _item6._field34 = _arrunkObj1337[2]._arr1[di]._field34;
- _item6._field36 = _arrunkObj1337[2]._arr1[di]._field36;
- // _item6._actorName = _arrunkObj1337[2]._arr1[di]._actorName;
- _item6._fieldE = _arrunkObj1337[2]._arr1[di]._fieldE;
- _item6._field10 = _arrunkObj1337[2]._arr1[di]._field10;
- warning("_item6._field12 = _arrunkObj1337[2]._arr1[di]._field12;");
- warning("_item6._field14 = _arrunkObj1337[2]._arr1[di]._field14;");
- warning("_item6._field16 = _arrunkObj1337[2]._arr1[di]._field16;");
- _item6._sceneRegionId = _arrunkObj1337[2]._arr1[di]._sceneRegionId;
- _item6._position = _arrunkObj1337[2]._arr1[di]._position;
- _item6._yDiff = _arrunkObj1337[2]._arr1[di]._yDiff;
- _item6._bounds = _arrunkObj1337[2]._arr1[di]._bounds;
- _item6._resNum = _arrunkObj1337[2]._arr1[di]._resNum;
- _item6._lookLineNum = _arrunkObj1337[2]._arr1[di]._lookLineNum;
- _item6._talkLineNum = _arrunkObj1337[2]._arr1[di]._talkLineNum;
- _item6._useLineNum = _arrunkObj1337[2]._arr1[di]._useLineNum;
- _item6._action = _arrunkObj1337[2]._arr1[di]._action;
- warning("_item6._field0 = _arrunkObj1337[2]._arr1[di]._field0;");
- _item6._object1._updateStartFrame = _arrunkObj1337[2]._arr1[di]._object1._updateStartFrame;
- _item6._object1._walkStartFrame = _arrunkObj1337[2]._arr1[di]._object1._walkStartFrame;
+ // Hand
+ int i;
+ for (i = 0; i < 4; i++) {
+ if ((_gameBoardSide[2]._handCard[i].isIn(_selectedCard._stationPos)) && (_gameBoardSide[2]._handCard[i]._cardId != 0)) {
+ Card *handcard = &_gameBoardSide[2]._handCard[i];
+ _selectedCard._cardId = handcard->_cardId;
+ _selectedCard._stationPos = handcard->_stationPos;
+ //warning("_selectedCard._actorName = handcard->_actorName;");
+ //warning("_selectedCard._fieldE = handcard->_fieldE;");
+ //warning("_selectedCard._field10 = handcard->_field10;");
+ //warning("_selectedCard._field12 = handcard->_field12;");
+ //warning("_selectedCard._field14 = handcard->_field14;");
+ //warning("_selectedCard._field16 = handcard->_field16;");
+ _selectedCard._sceneRegionId = handcard->_sceneRegionId;
+ _selectedCard._position = handcard->_position;
+ _selectedCard._yDiff = handcard->_yDiff;
+ _selectedCard._bounds = handcard->_bounds;
+ _selectedCard._resNum = handcard->_resNum;
+ _selectedCard._lookLineNum = handcard->_lookLineNum;
+ _selectedCard._talkLineNum = handcard->_talkLineNum;
+ _selectedCard._useLineNum = handcard->_useLineNum;
+ _selectedCard._action = handcard->_action;
+ //warning("_selectedCard._field0 = handcard->_field0;");
+ _selectedCard._card._updateStartFrame = handcard->_card._updateStartFrame;
+ _selectedCard._card._walkStartFrame = handcard->_card._walkStartFrame;
// _field2E is named _field3C in R2R
- _item6._object1._field2E = _arrunkObj1337[2]._arr1[di]._object1._field2E;
- _item6._object1._percent = _arrunkObj1337[2]._arr1[di]._object1._percent;
- _item6._object1._priority = _arrunkObj1337[2]._arr1[di]._object1._priority;
- _item6._object1._angle = _arrunkObj1337[2]._arr1[di]._object1._angle;
- _item6._object1._flags = _arrunkObj1337[2]._arr1[di]._object1._flags;
- _item6._object1._xe = _arrunkObj1337[2]._arr1[di]._object1._xe;
- _item6._object1._xs = _arrunkObj1337[2]._arr1[di]._object1._xs;
- _item6._object1._paneRects[0] = _arrunkObj1337[2]._arr1[di]._object1._paneRects[0];
- _item6._object1._paneRects[1] = _arrunkObj1337[2]._arr1[di]._object1._paneRects[1];
- _item6._object1._visage = _arrunkObj1337[2]._arr1[di]._object1._visage;
- _item6._object1._objectWrapper = _arrunkObj1337[2]._arr1[di]._object1._objectWrapper;
- _item6._object1._strip = _arrunkObj1337[2]._arr1[di]._object1._strip;
- _item6._object1._animateMode = _arrunkObj1337[2]._arr1[di]._object1._animateMode;
- _item6._object1._frame = _arrunkObj1337[2]._arr1[di]._object1._frame;
- _item6._object1._endFrame = _arrunkObj1337[2]._arr1[di]._object1._endFrame;
+ _selectedCard._card._oldPosition = handcard->_card._oldPosition;
+ _selectedCard._card._percent = handcard->_card._percent;
+ _selectedCard._card._priority = handcard->_card._priority;
+ _selectedCard._card._angle = handcard->_card._angle;
+ _selectedCard._card._flags = handcard->_card._flags;
+ _selectedCard._card._xe = handcard->_card._xe;
+ _selectedCard._card._xs = handcard->_card._xs;
+ _selectedCard._card._paneRects[0] = handcard->_card._paneRects[0];
+ _selectedCard._card._paneRects[1] = handcard->_card._paneRects[1];
+ _selectedCard._card._visage = handcard->_card._visage;
+ _selectedCard._card._objectWrapper = handcard->_card._objectWrapper;
+ _selectedCard._card._strip = handcard->_card._strip;
+ _selectedCard._card._animateMode = handcard->_card._animateMode;
+ _selectedCard._card._frame = handcard->_card._frame;
+ _selectedCard._card._endFrame = handcard->_card._endFrame;
// _field68 is named _field76 in R2R
- _item6._object1._field68 = _arrunkObj1337[2]._arr1[di]._object1._field68;
- _item6._object1._frameChange = _arrunkObj1337[2]._arr1[di]._object1._frameChange;
- _item6._object1._numFrames = _arrunkObj1337[2]._arr1[di]._object1._numFrames;
- _item6._object1._regionIndex = _arrunkObj1337[2]._arr1[di]._object1._regionIndex;
- _item6._object1._mover = _arrunkObj1337[2]._arr1[di]._object1._mover;
- _item6._object1._moveDiff = _arrunkObj1337[2]._arr1[di]._object1._moveDiff;
- _item6._object1._moveRate = _arrunkObj1337[2]._arr1[di]._object1._moveRate;
- _item6._object1._field8A = _arrunkObj1337[2]._arr1[di]._object1._field8A;
- _item6._object1._endAction = _arrunkObj1337[2]._arr1[di]._object1._endAction;
- _item6._object1._regionBitList = _arrunkObj1337[2]._arr1[di]._object1._regionBitList;
- // _item6._object1._actorName = _arrunkObj1337[2]._arr1[di]._object1._actorName;
- _item6._object1._fieldE = _arrunkObj1337[2]._arr1[di]._object1._fieldE;
- _item6._object1._field10 = _arrunkObj1337[2]._arr1[di]._object1._field10;
- warning("_item6._object1._field12 = _arrunkObj1337[2]._arr1[di]._object1._field12;");
- warning("_item6._object1._field14 = _arrunkObj1337[2]._arr1[di]._object1._field14;");
- warning("_item6._object1._field16 = _arrunkObj1337[2]._arr1[di]._object1._field16;");
- _item6._object1 = _arrunkObj1337[2]._arr1[di]._object1;
- }
- }
-
- if (di == 4) {
- subCDB90(1, _item6._field36);
- subD0281();
+ _selectedCard._card._loopCount = handcard->_card._loopCount;
+ _selectedCard._card._frameChange = handcard->_card._frameChange;
+ _selectedCard._card._numFrames = handcard->_card._numFrames;
+ _selectedCard._card._regionIndex = handcard->_card._regionIndex;
+ _selectedCard._card._mover = handcard->_card._mover;
+ _selectedCard._card._moveDiff = handcard->_card._moveDiff;
+ _selectedCard._card._moveRate = handcard->_card._moveRate;
+ _selectedCard._card._actorDestPos = handcard->_card._actorDestPos;
+ _selectedCard._card._endAction = handcard->_card._endAction;
+ _selectedCard._card._regionBitList = handcard->_card._regionBitList;
+ // _selectedCard._object1._actorName = handcard->_object1._actorName;
+ //warning("_selectedCard._card._fieldE = handcard->_card._fieldE;");
+ //warning("_selectedCard._card._field10 = handcard->_card._field10;");
+ //warning("_selectedCard._card._field12 = handcard->_card._field12;");
+ //warning("_selectedCard._card._field14 = handcard->_card._field14;");
+ //warning("_selectedCard._card._field16 = handcard->_card._field16;");
+
+ _gameBoardSide[2]._handCard[i]._cardId = 0;
+ _gameBoardSide[2]._handCard[i]._card.remove();
+ break;
+ }
+ }
+
+ if (i == 4) {
+ handleClick(1, _selectedCard._stationPos);
+ handleAutoplayPlayer2();
return;
+ } else {
+ setCursorData(1332, _selectedCard._card._strip, _selectedCard._card._frame);
+ R2_GLOBALS._sceneObjects->draw();
}
} else if (R2_GLOBALS._v57810 == 300) {
- subCDB90(3, _item6._field36);
- subD0281();
+ // Eye
+ handleClick(3, _selectedCard._stationPos);
+ handleAutoplayPlayer2();
return;
} else {
- subD1A48(R2_GLOBALS._v57810);
- subD0281();
+ // The original code is calling a function full of dead code.
+ // Only this message remains after a cleanup.
+ MessageDialog::show(WRONG_ANSWER_MSG, OK_BTN_STRING);
+ //
+ handleAutoplayPlayer2();
return;
}
- // That continues the block when R2_GLOBALS._v57810 == 200 and di != 4
- subD18B5(1332, _item6._object1._strip, _item6._object1._frame);
- R2_GLOBALS._sceneObjects->draw();
Event event;
- bool found = false;
- bool found_di;
+ bool found;
for (;;) {
if ( ((g_globals->_events.getEvent(event, EVENT_BUTTON_DOWN)) && (event.btnState == BTNSHIFT_RIGHT))
|| (g_globals->_events.getEvent(event, EVENT_KEYPRESS)) ){
- _item6._field36 = g_globals->_events._mousePos;
- found_di = false;
+ _selectedCard._stationPos = g_globals->_events._mousePos;
+ found = false;
for (int i = 0; i <= 3; i ++) {
- if (subC2BF8(&_arrunkObj1337[2]._arr1[i], Common::Point(_item6._field36.x + 12, _item6._field36.y + 12)) != 0) {
- if (_arrunkObj1337[2]._arr1[i]._field34 == 0) {
- _arrunkObj1337[2]._arr1[i]._field34 = _item6._field34;
- _arrunkObj1337[2]._arr1[i]._object1.postInit();
- _arrunkObj1337[2]._arr1[i]._object1.hide();
- _arrunkObj1337[2]._arr1[i]._object1.setVisage(1332);
- _arrunkObj1337[2]._arr1[i]._object1.setPosition(_arrunkObj1337[2]._arr1[i]._field36, 0);
- _arrunkObj1337[2]._arr1[i]._object1.fixPriority(170);
- setAnimationInfo(&_arrunkObj1337[2]._arr1[i]);
- subD18B5(5, 1, 4);
- found = true;
- _field423E--;
- _field4244 = 0;
- subC20F9();
+ if (_gameBoardSide[2]._handCard[i].isIn(Common::Point(_selectedCard._stationPos.x + 12, _selectedCard._stationPos.y + 12))) {
+ if (_gameBoardSide[2]._handCard[i]._cardId == 0) {
+ _gameBoardSide[2]._handCard[i]._cardId = _selectedCard._cardId;
+ _gameBoardSide[2]._handCard[i]._card.postInit();
+ _gameBoardSide[2]._handCard[i]._card.hide();
+ _gameBoardSide[2]._handCard[i]._card.setVisage(1332);
+ _gameBoardSide[2]._handCard[i]._card.setPosition(_gameBoardSide[2]._handCard[i]._stationPos, 0);
+ _gameBoardSide[2]._handCard[i]._card.fixPriority(170);
+ setAnimationInfo(&_gameBoardSide[2]._handCard[i]);
+ setCursorData(5, 1, 4);
+ _currentPlayerNumb--;
+ _showPlayerTurn = false;
+ handleNextTurn();
+ return;
} else {
actionDisplay(1330, 127, 159, 10, 1, 200, 0, 7, 0, 154, 154);
- found_di = true;
+ found = true;
}
break;
}
}
- if ((!found) && (!found_di)) {
- if (subC2BF8(&_item7, Common::Point(_item6._field36.x + 12, _item6._field36.y + 12)) != 0) {
- subC4A39(&_item6);
- } else if (!found) {
- bool foundVar4;
+ if (!found) {
+ if (_discardPile.isIn(Common::Point(_selectedCard._stationPos.x + 12, _selectedCard._stationPos.y + 12))) {
+ discardCard(&_selectedCard);
+ return;
+ } else if (_selectedCard._cardId == 1) {
+ bool isInCardFl = false;
int i;
- if (_item6._field34 == 1) {
- foundVar4 = false;
- for (i = 0; i <= 7; i++) {
- if (subC2BF8(&_arrunkObj1337[2]._arr2[i], Common::Point(_item6._field36.x + 12, _item6._field36.y + 12)) != 0) {
- foundVar4 = true;
- break;
- }
+ for (i = 0; i <= 7; i++) {
+ if (_gameBoardSide[2]._outpostStation[i].isIn(Common::Point(_selectedCard._stationPos.x + 12, _selectedCard._stationPos.y + 12))) {
+ isInCardFl = true;
+ break;
}
+ }
- if ((foundVar4) && (_arrunkObj1337[2]._arr2[i]._field34 == 0)) {
- if (subC27B5(_arrunkObj1337[2]._arr3[0]._field34) != -1) {
- actionDisplay(1330, 55, 159, 10, 1, 200, 0, 7, 0, 154, 154);
- } else {
- subC340B(&_item6, &_arrunkObj1337[2]._arr2[i]);
- return;
- }
+ if ((isInCardFl) && (_gameBoardSide[2]._outpostStation[i]._cardId == 0)) {
+ if (isDelayCard(_gameBoardSide[2]._delayCard._cardId) != -1) {
+ actionDisplay(1330, 55, 159, 10, 1, 200, 0, 7, 0, 154, 154);
} else {
- actionDisplay(1330, 56, 159, 10, 1, 200, 0, 7, 0, 154, 154);
+ playPlatformCard(&_selectedCard, &_gameBoardSide[2]._outpostStation[i]);
+ return;
+ }
+ } else {
+ actionDisplay(1330, 56, 159, 10, 1, 200, 0, 7, 0, 154, 154);
+ }
+ } else if (_selectedCard._cardId <= 9) {
+ bool isInCardFl = false;
+ int i;
+ for (i = 0; i <= 7; i++) {
+ if (_gameBoardSide[2]._outpostStation[i].isIn(Common::Point(_selectedCard._stationPos.x + 12, _selectedCard._stationPos.y + 12))) {
+ isInCardFl = true;
+ break;
}
- } else if (_item6._field34 <= 9) {
- foundVar4 = false;
- for (i = 0; i <= 7; i++) {
- if (subC2BF8(&_arrunkObj1337[2]._arr2[i], Common::Point(_item6._field36.x + 12, _item6._field36.y + 12)) != 0) {
- foundVar4 = true;
+ }
+ if ((isInCardFl) && (_gameBoardSide[2]._outpostStation[i]._cardId == 1)) {
+ isInCardFl = false;
+ for (int j = 0; j <= 7; j++) {
+ if (_selectedCard._cardId == _gameBoardSide[2]._outpostStation[j]._cardId) {
+ isInCardFl = true;
break;
}
}
- if ((foundVar4) && (_arrunkObj1337[2]._arr2[i]._field34 == 1)) {
- foundVar4 = false;
- int j;
- for (j = 0; j <= 7; j++) {
- if (_item6._field34 == _arrunkObj1337[2]._arr2[j]._field34) {
- foundVar4 = true;
- break;
- }
+ if (isInCardFl) {
+ // This station is already in place
+ actionDisplay(1330, 34, 159, 10, 1, 200, 0, 7, 0, 154, 154);
+ } else if (isDelayCard(_gameBoardSide[2]._delayCard._cardId) != -1) {
+ // You must eliminate your delay before you can play a station
+ actionDisplay(1330, 35, 159, 10, 1, 200, 0, 7, 0, 154, 154);
+ } else {
+ int stationCount = 0;
+ for (int k = 0; k <= 7; k++) {
+ if ((_gameBoardSide[2]._outpostStation[k]._cardId > 1) && (_gameBoardSide[2]._outpostStation[k]._cardId <= 9))
+ ++stationCount;
}
- if (foundVar4) {
- actionDisplay(1330, 34, 159, 10, 1, 200, 0, 7, 0, 154, 154);
- } else if (subC27B5(_arrunkObj1337[2]._arr3[0]._field34) != -1) {
- actionDisplay(1330, 35, 159, 10, 1, 200, 0, 7, 0, 154, 154);
- } else {
- if (j == 7)
- _field424A = 2;
- subC33C0(&_item6, &_arrunkObj1337[2]._arr2[i]);
- return;
+ if (stationCount == 7)
+ _winnerId = 2;
+
+ playStationCard(&_selectedCard, &_gameBoardSide[2]._outpostStation[i]);
+ return;
+ }
+ } else {
+ actionDisplay(1330, 37, 159, 10, 1, 200, 0, 7, 0, 154, 154);
+ }
+ } else if ((_selectedCard._cardId == 26) || (_selectedCard._cardId == 30) ||(_selectedCard._cardId == 32) || (_selectedCard._cardId == 28)) {
+ // Check anti-delay card
+ if (_gameBoardSide[2]._delayCard.isIn(Common::Point(_selectedCard._stationPos.x + 12, _selectedCard._stationPos.y + 12))) {
+ actionDisplay(1330, 42, 159, 10, 1, 200, 0, 7, 0, 154, 154);
+ } else if (checkAntiDelayCard(_gameBoardSide[2]._delayCard._cardId, _selectedCard._cardId)) {
+ playAntiDelayCard(&_selectedCard, &_gameBoardSide[2]._delayCard);
+ return;
+ } else {
+ if (_gameBoardSide[2]._delayCard._cardId != 0) {
+ switch (_gameBoardSide[2]._delayCard._cardId) {
+ case 11:
+ actionDisplay(1330, 68, 159, 10, 1, 200, 0, 7, 0, 154, 154);
+ break;
+ case 14:
+ actionDisplay(1330, 80, 159, 10, 1, 200, 0, 7, 0, 154, 154);
+ break;
+ case 16:
+ actionDisplay(1330, 84, 159, 10, 1, 200, 0, 7, 0, 154, 154);
+ break;
+ case 24:
+ actionDisplay(1330, 96, 159, 10, 1, 200, 0, 7, 0, 154, 154);
+ break;
+ default:
+ break;
}
} else {
- actionDisplay(1330, 37, 159, 10, 1, 200, 0, 7, 0, 154, 154);
+ actionDisplay(1330, 41, 159, 10, 1, 200, 0, 7, 0, 154, 154);
}
- } else {
- if ((_item6._field34 == 26) || (_item6._field34 == 30) ||(_item6._field34 == 32) || (_item6._field34 == 28)) {
- if (subC2BF8(&_arrunkObj1337[2]._arr3[0], Common::Point(_item6._field36.x + 12, _item6._field36.y + 12)) != 0) {
- actionDisplay(1330, 42, 159, 10, 1, 200, 0, 7, 0, 154, 154);
- } else if (!subC3386(_arrunkObj1337[2]._arr3[0]._field34, _item6._field34)) {
- if (_arrunkObj1337[2]._arr3[0]._field34 != 0) {
- switch (_arrunkObj1337[2]._arr3[0]._field34) {
- case 11:
- actionDisplay(1330, 68, 159, 10, 1, 200, 0, 7, 0, 154, 154);
- break;
- case 14:
- actionDisplay(1330, 80, 159, 10, 1, 200, 0, 7, 0, 154, 154);
- break;
- case 16:
- actionDisplay(1330, 84, 159, 10, 1, 200, 0, 7, 0, 154, 154);
- break;
- case 24:
- actionDisplay(1330, 96, 159, 10, 1, 200, 0, 7, 0, 154, 154);
- break;
- default:
- break;
- }
- } else {
- actionDisplay(1330, 41, 159, 10, 1, 200, 0, 7, 0, 154, 154);
+ }
+ } else if ((getStationCardId(_selectedCard._cardId) == -1) && (isDelayCard(_selectedCard._cardId) == -1)) {
+ if (_selectedCard._cardId == 13) {
+ if (_gameBoardSide[0]._emptyStationPos.isIn(Common::Point(_selectedCard._stationPos.x + 12, _selectedCard._stationPos.y + 12))) {
+ for (int k = 0; k <= 7; k++) {
+ if (_gameBoardSide[0]._outpostStation[k]._cardId != 0) {
+ playCounterTrickCard(&_selectedCard, 0);
+ return;
}
- } else {
- subC34A1(&_item6, &_arrunkObj1337[2]._arr3[0]);
- return;
}
+ actionDisplay(1330, 74, 159, 10, 1, 200, 0, 7, 0, 154, 154);
+ } else if (_gameBoardSide[3]._emptyStationPos.isIn(Common::Point(_selectedCard._stationPos.x + 12, _selectedCard._stationPos.y + 12))) {
+ for (int k = 0; k <= 7; k++) {
+ if (_gameBoardSide[3]._outpostStation[k]._cardId != 0) {
+ playCounterTrickCard(&_selectedCard, 3);
+ return;
+ }
+ }
+ actionDisplay(1330, 74, 159, 10, 1, 200, 0, 7, 0, 154, 154);
+ } else if (_gameBoardSide[1]._emptyStationPos.isIn(Common::Point(_selectedCard._stationPos.x + 12, _selectedCard._stationPos.y + 12))) {
+ for (int k = 0; k <= 7; k++) {
+ if (_gameBoardSide[1]._outpostStation[k]._cardId == 0) {
+ playCounterTrickCard(&_selectedCard, 1);
+ return;
+ }
+ }
+ actionDisplay(1330, 74, 159, 10, 1, 200, 0, 7, 0, 154, 154);
} else {
- if ((subC27F9(_item6._field34) == -1) && (subC27B5(_item6._field34) == -1)) {
- if (_item6._field34 == 13) {
- if (subC2BF8(&_arrunkObj1337[0]._arr4[0], Common::Point(_item6._field36.x + 12, _item6._field36.y + 12)) != 0) {
- for (int k = 0; k <= 7; k++) {
- if (_arrunkObj1337[0]._arr2[k]._field34 != 0) {
- found = true;
- subC358E(&_item6, 0);
- }
- }
-
- if (!found)
- actionDisplay(1330, 74, 159, 10, 1, 200, 0, 7, 0, 154, 154);
- } else if (subC2BF8(&_arrunkObj1337[3]._arr4[0], Common::Point(_item6._field36.x + 12, _item6._field36.y + 12)) != 0) {
- for (int k = 0; k <= 7; k++) {
- if (_arrunkObj1337[3]._arr2[k]._field34 != 0) {
- found = true;
- subC358E(&_item6, 3);
- }
- }
- if (!found)
- actionDisplay(1330, 74, 159, 10, 1, 200, 0, 7, 0, 154, 154);
- } else if (subC2BF8(&_arrunkObj1337[1]._arr4[0], Common::Point(_item6._field36.x + 12, _item6._field36.y + 12)) != 0) {
- for (int k = 0; k <= 7; k++) {
- if (_arrunkObj1337[1]._arr2[k]._field34 == 0) {
- found = true;
- subC358E(&_item6, 1);
- }
- }
- if (!found)
- actionDisplay(1330, 74, 159, 10, 1, 200, 0, 7, 0, 154, 154);
- } else {
- actionDisplay(1330, 128, 159, 10, 1, 200, 0, 7, 0, 154, 154);
- }
- } else if (_item6._field34 == 25) {
+ actionDisplay(1330, 128, 159, 10, 1, 200, 0, 7, 0, 154, 154);
+ }
+ } else if (_selectedCard._cardId == 25) {
+ if (_gameBoardSide[0]._emptyStationPos.isIn(Common::Point(_selectedCard._stationPos.x + 12, _selectedCard._stationPos.y + 12))) {
+ if ( (_gameBoardSide[0]._handCard[0]._cardId != 0)
+ || (_gameBoardSide[0]._handCard[1]._cardId != 0)
+ || (_gameBoardSide[0]._handCard[2]._cardId != 0)
+ || (_gameBoardSide[0]._handCard[3]._cardId != 0) ) {
int k;
- if (subC2BF8(&_arrunkObj1337[0]._arr4[0], Common::Point(_item6._field36.x + 12, _item6._field36.y + 12)) != 0) {
- if ( (_arrunkObj1337[0]._arr1[0]._field34 != 0)
- || (_arrunkObj1337[0]._arr1[1]._field34 != 0)
- || (_arrunkObj1337[0]._arr1[2]._field34 != 0)
- || (_arrunkObj1337[0]._arr1[3]._field34 != 0) ) {
- for (k = 0; k <= 3; k++){
- if (_arrunkObj1337[2]._arr1[k]._field34 == 0)
- break;
- }
- subC318B(2, &_arrunkObj1337[2]._arr1[k], 0);
- return;
- } else {
- actionDisplay(1330, 99, 159, 10, 1, 200, 0, 7, 0, 154, 154);
- }
- } else if (subC2BF8(&_arrunkObj1337[1]._arr4[0], Common::Point(_item6._field36.x + 12, _item6._field36.y + 12)) != 0) {
- if ( (_arrunkObj1337[1]._arr1[0]._field34 != 0)
- || (_arrunkObj1337[1]._arr1[1]._field34 != 0)
- || (_arrunkObj1337[1]._arr1[2]._field34 != 0)
- || (_arrunkObj1337[1]._arr1[3]._field34 != 0) ) {
- for (k = 0; k <= 3; k++){
- if (_arrunkObj1337[2]._arr1[k]._field34 == 0)
- break;
- }
- subC318B(2, &_arrunkObj1337[2]._arr1[k], 1);
- return;
- } else {
- actionDisplay(1330, 99, 159, 10, 1, 200, 0, 7, 0, 154, 154);
- }
- }
-
- if (subC2BF8(&_arrunkObj1337[3]._arr4[0], Common::Point(_item6._field36.x + 12, _item6._field36.y + 12)) != 0) {
- if ( (_arrunkObj1337[3]._arr1[0]._field34 != 0)
- || (_arrunkObj1337[3]._arr1[1]._field34 != 0)
- || (_arrunkObj1337[3]._arr1[2]._field34 != 0)
- || (_arrunkObj1337[3]._arr1[3]._field34 != 0) ) {
- for (k = 0; k <= 3; k++){
- if (_arrunkObj1337[2]._arr1[k]._field34 == 0)
- break;
- }
- subC318B(2, &_arrunkObj1337[2]._arr1[k], 3);
- return;
- } else {
- actionDisplay(1330, 99, 159, 10, 1, 200, 0, 7, 0, 154, 154);
- }
- } else {
- actionDisplay(1330, 129, 159, 10, 1, 200, 0, 7, 0, 154, 154);
- }
- } else if (_item6._field34 == 29) {
- actionDisplay(1330, 136, 159, 10, 1, 200, 0, 7, 0, 154, 154);
- } else if (_item6._field34 == 27) {
- actionDisplay(1330, 137, 159, 10, 1, 200, 0, 7, 0, 154, 154);
- }
- } else {
- if (subC2BF8(&_arrunkObj1337[0]._arr3[0], Common::Point(_item6._field36.x + 12, _item6._field36.y + 12)) != 0) {
- if (_arrunkObj1337[0]._arr3[0]._field34 != 0) {
- actionDisplay(1330, 15, 159, 10, 1, 200, 0, 7, 0, 154, 154);
- } else if (!subC32B1(0, _item6._field34)) {
- switch (_item6._field34) {
- case 10:
- actionDisplay(1330, 66, 159, 10, 1, 200, 0, 7, 0, 154, 154);
- break;
- case 12:
- actionDisplay(1330, 70, 159, 10, 1, 200, 0, 7, 0, 154, 154);
+ for (k = 0; k <= 3; k++){
+ if (_gameBoardSide[2]._handCard[k]._cardId == 0)
break;
- case 15:
- actionDisplay(1330, 82, 159, 10, 1, 200, 0, 7, 0, 154, 154);
- break;
- case 17:
- actionDisplay(1330, 86, 159, 10, 1, 200, 0, 7, 0, 154, 154);
- break;
- case 18:
- actionDisplay(1330, 88, 159, 10, 1, 200, 0, 7, 0, 154, 154);
- break;
- case 19:
- actionDisplay(1330, 90, 159, 10, 1, 200, 0, 7, 0, 154, 154);
- break;
- case 20:
- actionDisplay(1330, 92, 159, 10, 1, 200, 0, 7, 0, 154, 154);
- break;
- case 21:
- actionDisplay(1330, 94, 159, 10, 1, 200, 0, 7, 0, 154, 154);
- break;
- default:
- break;
- }
- } else {
- subC3456(&_item6, &_arrunkObj1337[0]._arr3[0]);
- found = true;
}
- } else if (subC2BF8(&_arrunkObj1337[3]._arr3[0], Common::Point(_item6._field36.x + 12, _item6._field36.y + 12)) != 0) {
- if (_arrunkObj1337[3]._arr3[0]._field34 != 0) {
- actionDisplay(1330, 17, 159, 10, 1, 200, 0, 7, 0, 154, 154);
- } else if (!subC32B1(3, _item6._field34)) {
- switch (_item6._field34) {
- case 10:
- actionDisplay(1330, 66, 159, 10, 1, 200, 0, 7, 0, 154, 154);
- break;
- case 12:
- actionDisplay(1330, 70, 159, 10, 1, 200, 0, 7, 0, 154, 154);
- break;
- case 15:
- actionDisplay(1330, 82, 159, 10, 1, 200, 0, 7, 0, 154, 154);
- break;
- case 17:
- actionDisplay(1330, 86, 159, 10, 1, 200, 0, 7, 0, 154, 154);
- break;
- case 18:
- actionDisplay(1330, 88, 159, 10, 1, 200, 0, 7, 0, 154, 154);
- break;
- case 19:
- actionDisplay(1330, 90, 159, 10, 1, 200, 0, 7, 0, 154, 154);
- break;
- case 20:
- actionDisplay(1330, 92, 159, 10, 1, 200, 0, 7, 0, 154, 154);
- break;
- case 21:
- actionDisplay(1330, 94, 159, 10, 1, 200, 0, 7, 0, 154, 154);
- break;
- default:
+ playThieftCard(2, &_gameBoardSide[2]._handCard[k], 0);
+ return;
+ } else {
+ actionDisplay(1330, 99, 159, 10, 1, 200, 0, 7, 0, 154, 154);
+ }
+ } else if (_gameBoardSide[1]._emptyStationPos.isIn(Common::Point(_selectedCard._stationPos.x + 12, _selectedCard._stationPos.y + 12))) {
+ if ( (_gameBoardSide[1]._handCard[0]._cardId != 0)
+ || (_gameBoardSide[1]._handCard[1]._cardId != 0)
+ || (_gameBoardSide[1]._handCard[2]._cardId != 0)
+ || (_gameBoardSide[1]._handCard[3]._cardId != 0) ) {
+ int k;
+ for (k = 0; k <= 3; k++){
+ if (_gameBoardSide[2]._handCard[k]._cardId == 0)
break;
- }
- } else {
- subC3456(&_item6, &_arrunkObj1337[3]._arr3[0]);
- found = true;
}
- } else if (subC2BF8(&_arrunkObj1337[1]._arr3[0], Common::Point(_item6._field36.x + 12, _item6._field36.y + 12)) != 0) {
- if (_arrunkObj1337[1]._arr3[0]._field34 != 0) {
- actionDisplay(1330, 19, 159, 10, 1, 200, 0, 7, 0, 154, 154);
- } else if (!subC32B1(1, _item6._field34)) {
- switch (_item6._field34) {
- case 10:
- actionDisplay(1330, 66, 159, 10, 1, 200, 0, 7, 0, 154, 154);
- break;
- case 12:
- actionDisplay(1330, 70, 159, 10, 1, 200, 0, 7, 0, 154, 154);
- break;
- case 15:
- actionDisplay(1330, 82, 159, 10, 1, 200, 0, 7, 0, 154, 154);
- break;
- case 17:
- actionDisplay(1330, 86, 159, 10, 1, 200, 0, 7, 0, 154, 154);
- break;
- case 18:
- actionDisplay(1330, 88, 159, 10, 1, 200, 0, 7, 0, 154, 154);
- break;
- case 19:
- actionDisplay(1330, 90, 159, 10, 1, 200, 0, 7, 0, 154, 154);
- break;
- case 20:
- actionDisplay(1330, 92, 159, 10, 1, 200, 0, 7, 0, 154, 154);
- break;
- case 21:
- actionDisplay(1330, 94, 159, 10, 1, 200, 0, 7, 0, 154, 154);
- break;
- default:
+ playThieftCard(2, &_gameBoardSide[2]._handCard[k], 1);
+ return;
+ } else {
+ actionDisplay(1330, 99, 159, 10, 1, 200, 0, 7, 0, 154, 154);
+ }
+ }
+
+ if (_gameBoardSide[3]._emptyStationPos.isIn(Common::Point(_selectedCard._stationPos.x + 12, _selectedCard._stationPos.y + 12))) {
+ if ( (_gameBoardSide[3]._handCard[0]._cardId != 0)
+ || (_gameBoardSide[3]._handCard[1]._cardId != 0)
+ || (_gameBoardSide[3]._handCard[2]._cardId != 0)
+ || (_gameBoardSide[3]._handCard[3]._cardId != 0) ) {
+ int k;
+ for (k = 0; k <= 3; k++){
+ if (_gameBoardSide[2]._handCard[k]._cardId == 0)
break;
- }
- } else {
- subC3456(&_item6, &_arrunkObj1337[1]._arr3[0]);
- found = true;
}
- } else {
- actionDisplay(1330, 38, 159, 10, 1, 200, 0, 7, 0, 154, 154);
- }
+ playThieftCard(2, &_gameBoardSide[2]._handCard[k], 3);
+ return;
+ } else {
+ actionDisplay(1330, 99, 159, 10, 1, 200, 0, 7, 0, 154, 154);
}
+ } else {
+ actionDisplay(1330, 129, 159, 10, 1, 200, 0, 7, 0, 154, 154);
+ }
+ } else if (_selectedCard._cardId == 29) {
+ // Interceptor cards are used to prevent collision
+ actionDisplay(1330, 136, 159, 10, 1, 200, 0, 7, 0, 154, 154);
+ } else if (_selectedCard._cardId == 27) {
+ actionDisplay(1330, 137, 159, 10, 1, 200, 0, 7, 0, 154, 154);
+ }
+ } else if (_gameBoardSide[0]._delayCard.isIn(Common::Point(_selectedCard._stationPos.x + 12, _selectedCard._stationPos.y + 12))) {
+ if (_gameBoardSide[0]._delayCard._cardId != 0) {
+ actionDisplay(1330, 15, 159, 10, 1, 200, 0, 7, 0, 154, 154);
+ } else if (!isAttackPossible(0, _selectedCard._cardId)) {
+ switch (_selectedCard._cardId) {
+ case 10:
+ actionDisplay(1330, 66, 159, 10, 1, 200, 0, 7, 0, 154, 154);
+ break;
+ case 12:
+ actionDisplay(1330, 70, 159, 10, 1, 200, 0, 7, 0, 154, 154);
+ break;
+ case 15:
+ actionDisplay(1330, 82, 159, 10, 1, 200, 0, 7, 0, 154, 154);
+ break;
+ case 17:
+ actionDisplay(1330, 86, 159, 10, 1, 200, 0, 7, 0, 154, 154);
+ break;
+ case 18:
+ actionDisplay(1330, 88, 159, 10, 1, 200, 0, 7, 0, 154, 154);
+ break;
+ case 19:
+ actionDisplay(1330, 90, 159, 10, 1, 200, 0, 7, 0, 154, 154);
+ break;
+ case 20:
+ actionDisplay(1330, 92, 159, 10, 1, 200, 0, 7, 0, 154, 154);
+ break;
+ case 21:
+ actionDisplay(1330, 94, 159, 10, 1, 200, 0, 7, 0, 154, 154);
+ break;
+ default:
+ break;
+ }
+ } else {
+ playDelayCard(&_selectedCard, &_gameBoardSide[0]._delayCard);
+ return;
+ }
+ } else if (_gameBoardSide[3]._delayCard.isIn(Common::Point(_selectedCard._stationPos.x + 12, _selectedCard._stationPos.y + 12))) {
+ if (_gameBoardSide[3]._delayCard._cardId != 0) {
+ actionDisplay(1330, 17, 159, 10, 1, 200, 0, 7, 0, 154, 154);
+ } else if (!isAttackPossible(3, _selectedCard._cardId)) {
+ switch (_selectedCard._cardId) {
+ case 10:
+ actionDisplay(1330, 66, 159, 10, 1, 200, 0, 7, 0, 154, 154);
+ break;
+ case 12:
+ actionDisplay(1330, 70, 159, 10, 1, 200, 0, 7, 0, 154, 154);
+ break;
+ case 15:
+ actionDisplay(1330, 82, 159, 10, 1, 200, 0, 7, 0, 154, 154);
+ break;
+ case 17:
+ actionDisplay(1330, 86, 159, 10, 1, 200, 0, 7, 0, 154, 154);
+ break;
+ case 18:
+ actionDisplay(1330, 88, 159, 10, 1, 200, 0, 7, 0, 154, 154);
+ break;
+ case 19:
+ actionDisplay(1330, 90, 159, 10, 1, 200, 0, 7, 0, 154, 154);
+ break;
+ case 20:
+ actionDisplay(1330, 92, 159, 10, 1, 200, 0, 7, 0, 154, 154);
+ break;
+ case 21:
+ actionDisplay(1330, 94, 159, 10, 1, 200, 0, 7, 0, 154, 154);
+ break;
+ default:
+ break;
}
+ } else {
+ playDelayCard(&_selectedCard, &_gameBoardSide[3]._delayCard);
+ return;
}
+ } else if (_gameBoardSide[1]._delayCard.isIn(Common::Point(_selectedCard._stationPos.x + 12, _selectedCard._stationPos.y + 12))) {
+ if (_gameBoardSide[1]._delayCard._cardId != 0) {
+ actionDisplay(1330, 19, 159, 10, 1, 200, 0, 7, 0, 154, 154);
+ } else if (!isAttackPossible(1, _selectedCard._cardId)) {
+ switch (_selectedCard._cardId) {
+ case 10:
+ actionDisplay(1330, 66, 159, 10, 1, 200, 0, 7, 0, 154, 154);
+ break;
+ case 12:
+ actionDisplay(1330, 70, 159, 10, 1, 200, 0, 7, 0, 154, 154);
+ break;
+ case 15:
+ actionDisplay(1330, 82, 159, 10, 1, 200, 0, 7, 0, 154, 154);
+ break;
+ case 17:
+ actionDisplay(1330, 86, 159, 10, 1, 200, 0, 7, 0, 154, 154);
+ break;
+ case 18:
+ actionDisplay(1330, 88, 159, 10, 1, 200, 0, 7, 0, 154, 154);
+ break;
+ case 19:
+ actionDisplay(1330, 90, 159, 10, 1, 200, 0, 7, 0, 154, 154);
+ break;
+ case 20:
+ actionDisplay(1330, 92, 159, 10, 1, 200, 0, 7, 0, 154, 154);
+ break;
+ case 21:
+ actionDisplay(1330, 94, 159, 10, 1, 200, 0, 7, 0, 154, 154);
+ break;
+ default:
+ break;
+ }
+ } else {
+ playDelayCard(&_selectedCard, &_gameBoardSide[1]._delayCard);
+ return;
+ }
+ } else {
+ actionDisplay(1330, 38, 159, 10, 1, 200, 0, 7, 0, 154, 154);
}
}
-
- if (found)
- return;
} else {
g_globals->_scenePalette.signalListeners();
R2_GLOBALS._sceneObjects->draw();
g_globals->_events.delay(g_globals->_sceneHandler->_delayTicks);
}
+
+ g_globals->_sceneObjects->recurse(SceneHandler::dispatchObject);
}
}
-void Scene1337::subD183F(int arg1, int arg2) {
+void Scene1337::updateCursorId(int cursorId, bool updateFl) {
if ((R2_GLOBALS._v57709 != 0) || (R2_GLOBALS._v5780C != 0))
return;
- R2_GLOBALS._v5780E = arg1 + arg2;
+ R2_GLOBALS._mouseCursorId = cursorId;
+
+ if (updateFl) {
+ R2_GLOBALS._mouseCursorId++;
- if (arg2 != 0) {
- if (R2_GLOBALS._v5780E < 1)
- R2_GLOBALS._v5780E = 2;
+ if (R2_GLOBALS._mouseCursorId < 1)
+ R2_GLOBALS._mouseCursorId = 2;
- if (R2_GLOBALS._v5780E > 2)
- R2_GLOBALS._v5780E = 1;
+ if (R2_GLOBALS._mouseCursorId > 2)
+ R2_GLOBALS._mouseCursorId = 1;
}
- if (R2_GLOBALS._v5780E == 1) {
+ // The original was using an intermediate function to call setCursorData.
+ // It has been removed to improve readability
+ if (R2_GLOBALS._mouseCursorId == 1) {
R2_GLOBALS._v57810 = 200;
- subD195F(1, 4);
- } else if (R2_GLOBALS._v5780E == 2) {
+ setCursorData(5, 1, 4);
+ } else if (R2_GLOBALS._mouseCursorId == 2) {
R2_GLOBALS._v57810 = 300;
- subD195F(1, 5);
+ setCursorData(5, 1, 5);
} else {
R2_GLOBALS._v57810 = 0;
- subD195F(0, 0);
+ setCursorData(5, 0, 0);
}
}
-void Scene1337::subD18B5(int resNum, int rlbNum, int arg3) {
- warning("STUBBED lvl3 Scene1337::subD18B5()");
+void Scene1337::setCursorData(int resNum, int rlbNum, int frameNum) {
+ _cursorCurRes = resNum;
+ _cursorCurStrip = rlbNum;
+ _cursorCurFrame = frameNum;
+
+ if (!frameNum) {
+ // Should be a hardcoded cursor displaying only a dot.
+ // FIXME: Use another cursor when possible
+ R2_GLOBALS._events.setCursor(CURSOR_CROSSHAIRS);
+ } else {
+ // TODO: The original was using some ressource caching, which was useless and complex
+ // and which has been removed. This cursor behavior clearly made intensive use of this caching...
+ // We now have to find a way to cache these cursor pointers and avoid loading them multiple times per seconds
+ uint size;
+ byte *cursor = g_resourceManager->getSubResource(resNum, rlbNum, frameNum, &size);
+ // Decode the cursor
+ GfxSurface s = surfaceFromRes(cursor);
+
+ Graphics::Surface surface = s.lockSurface();
+ const byte *cursorData = (const byte *)surface.getPixels();
+ CursorMan.replaceCursor(cursorData, surface.w, surface.h, s._centroid.x, s._centroid.y, s._transColor);
+ s.unlockSurface();
+
+ DEALLOCATE(cursor);
+ }
}
-int Scene1337::subD18F5() {
+void Scene1337::subD18F5() {
if (R2_GLOBALS._v57709 == 0)
- // The cursor looks... very dummy
- // To be checked
- warning("TODO: CursorManager.setData(R2_GLOBALS.off_57705)");
+ R2_GLOBALS._events.setCursor(CURSOR_CROSSHAIRS);
++R2_GLOBALS._v57709;
-
- return R2_GLOBALS._v57709;
}
-int Scene1337::subD1917() {
+void Scene1337::subD1917() {
if (R2_GLOBALS._v57709 != 0) {
R2_GLOBALS._v57709--;
- if (R2_GLOBALS._v57709 != 0)
- warning("FIXME: subD195F(_width, _data);");
+ if (R2_GLOBALS._v57709 != 0) {
+ // The original was using an intermediate function to call setCursorData.
+ // It has been removed to improve readability
+ setCursorData(5, _cursorCurStrip, _cursorCurFrame);
+ }
}
-
- return R2_GLOBALS._v57709;
}
-int Scene1337::subD1940(bool flag) {
+void Scene1337::subD1940(bool flag) {
if (flag)
++R2_GLOBALS._v5780C;
else if (R2_GLOBALS._v5780C != 0)
--R2_GLOBALS._v5780C;
-
- return R2_GLOBALS._v5780C;
-}
-
-void Scene1337::subD195F(int arg1, int arg2) {
- subD18B5(5, arg1, arg2);
}
void Scene1337::subD1975(int arg1, int arg2) {
warning("STUBBED lvl2 Scene1337::subD1975()");
}
-void Scene1337::subD1A48(int arg1) {
- int tmpVal = -1;
+void Scene1337::OptionsDialog::show() {
+ OptionsDialog *dlg = new OptionsDialog();
+ dlg->draw();
- switch (arg1) {
- case 200:
- tmpVal = 141;
- break;
- case 300:
- tmpVal = 142;
- break;
- default:
- MessageDialog::show(WRONG_ANSWER_MSG, OK_BTN_STRING);
- break;
- }
+ // Show the dialog
+ GfxButton *btn = dlg->execute(NULL);
- if (tmpVal == -1)
- return;
+ // Figure out the new selected character
+ if (btn == &dlg->_quitGame)
+ R2_GLOBALS._sceneManager.changeScene(125);
+ else if (btn == &dlg->_restartGame)
+ R2_GLOBALS._sceneManager.changeScene(1330);
- actionDisplay(1330, tmpVal, -1, -1, 1, 220, 1, 5, 0, 105, 0);
+ // Remove the dialog
+ dlg->remove();
+ delete dlg;
+}
+
+Scene1337::OptionsDialog::OptionsDialog() {
+ // Set the elements text
+ Scene1337 *scene = (Scene1337 *)R2_GLOBALS._sceneManager._scene;
+ _autoplay.setText(scene->_autoplay ? AUTO_PLAY_ON : AUTO_PLAY_OFF);
+ _restartGame.setText(START_NEW_CARD_GAME);
+ _quitGame.setText(QUIT_CARD_GAME);
+ _continueGame.setText(CONTINUE_CARD_GAME);
+
+ // Set position of the elements
+ _autoplay._bounds.moveTo(5, 2);
+ _restartGame._bounds.moveTo(5, _autoplay._bounds.bottom + 2);
+ _quitGame._bounds.moveTo(5, _restartGame._bounds.bottom + 2);
+ _continueGame._bounds.moveTo(5, _quitGame._bounds.bottom + 2);
+
+ // Add the items to the dialog
+ addElements(&_autoplay, &_restartGame, &_quitGame, &_continueGame, NULL);
+
+ // Set the dialog size and position
+ frame();
+ _bounds.collapse(-6, -6);
+ setCenter(160, 100);
+}
+
+GfxButton *Scene1337::OptionsDialog::execute(GfxButton *defaultButton) {
+ _gfxManager.activate();
+
+ // Event loop
+ GfxButton *selectedButton = NULL;
+
+ bool breakFlag = false;
+ while (!g_vm->shouldQuit() && !breakFlag) {
+ Event event;
+ 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;
+
+ for (GfxElementList::iterator i = _elements.begin(); i != _elements.end(); ++i) {
+ if ((*i)->process(event))
+ selectedButton = static_cast<GfxButton *>(*i);
+ }
+
+ if (selectedButton == &_autoplay) {
+ // Toggle Autoplay
+ selectedButton = NULL;
+ Scene1337 *scene = (Scene1337 *)R2_GLOBALS._sceneManager._scene;
+ scene->_autoplay = !scene->_autoplay;
+
+ _autoplay.setText(scene->_autoplay ? AUTO_PLAY_ON : AUTO_PLAY_OFF);
+ _autoplay.draw();
+ } else if (selectedButton) {
+ breakFlag = true;
+ break;
+ } else if (!event.handled) {
+ if ((event.eventType == EVENT_KEYPRESS) && (event.kbd.keycode == Common::KEYCODE_ESCAPE)) {
+ selectedButton = NULL;
+ breakFlag = true;
+ break;
+ }
+ }
+ }
+
+ g_system->delayMillis(10);
+ GLOBALS._screenSurface.updateScreen();
+ }
+
+ _gfxManager.deactivate();
+ return selectedButton;
}
/*--------------------------------------------------------------------------
@@ -6890,69 +6791,69 @@ void Scene1337::subD1A48(int arg1) {
void Scene1500::postInit(SceneObjectList *OwnerList) {
loadScene(1500);
R2_GLOBALS._uiElements._active = false;
- R2_GLOBALS._v5589E.top = 0;
- R2_GLOBALS._v5589E.bottom = 200;
setZoomPercents(170, 13, 240, 100);
SceneExt::postInit();
+ R2_GLOBALS._interfaceY = SCREEN_HEIGHT;
+
scalePalette(65, 65, 65);
R2_GLOBALS._player.postInit();
R2_GLOBALS._player.hide();
R2_GLOBALS._player.disableControl();
- _actor2.postInit();
- _actor2.setup(1401, 1, 1);
- _actor2._effect = 5;
- _actor2.fixPriority(10);
- _actor2._field9C = _field312;
+ _starshipShadow.postInit();
+ _starshipShadow.setup(1401, 1, 1);
+ _starshipShadow._effect = EFFECT_SHADOW_MAP;
+ _starshipShadow.fixPriority(10);
+ _starshipShadow._shadowMap = _shadowPaletteMap;
- _actor1.postInit();
- _actor1.setup(1400, 1, 1);
- _actor1._moveDiff = Common::Point(1, 1);
- _actor1._linkedActor = &_actor2;
+ _starship.postInit();
+ _starship.setup(1400, 1, 1);
+ _starship._moveDiff = Common::Point(1, 1);
+ _starship._linkedActor = &_starshipShadow;
if (R2_GLOBALS._sceneManager._previousScene != 1010) {
- _actor4.postInit();
- _actor4.setup(1401, 2, 1);
- _actor4._effect = 5;
- _actor4.fixPriority(10);
- _actor4._field9C = _field312;
+ _smallShipShadow.postInit();
+ _smallShipShadow.setup(1401, 2, 1);
+ _smallShipShadow._effect = EFFECT_SHADOW_MAP;
+ _smallShipShadow.fixPriority(10);
+ _smallShipShadow._shadowMap = _shadowPaletteMap;
- _actor3.postInit();
- _actor3._moveRate = 30;
- _actor3._moveDiff = Common::Point(1, 1);
- _actor3._linkedActor = &_actor4;
+ _smallShip.postInit();
+ _smallShip._moveRate = 30;
+ _smallShip._moveDiff = Common::Point(1, 1);
+ _smallShip._linkedActor = &_smallShipShadow;
}
if (R2_GLOBALS._sceneManager._previousScene == 300) {
- _actor1.setPosition(Common::Point(189, 139), 5);
+ _starship.setPosition(Common::Point(189, 139), 5);
- _actor3.setup(1400, 1, 2);
- _actor3.setPosition(Common::Point(148, 108), 0);
+ _smallShip.setup(1400, 1, 2);
+ _smallShip.setPosition(Common::Point(148, 108), 0);
_sceneMode = 20;
R2_GLOBALS._sound1.play(110);
} else if (R2_GLOBALS._sceneManager._previousScene == 1550) {
- _actor1.setPosition(Common::Point(189, 139), 5);
+ _starship.setPosition(Common::Point(189, 139), 5);
- _actor3.setup(1400, 2, 1);
- _actor3.changeZoom(-1);
- _actor3.setPosition(Common::Point(298, 258), 5);
+ _smallShip.setup(1400, 2, 1);
+ _smallShip.changeZoom(-1);
+ _smallShip.setPosition(Common::Point(298, 258), 5);
_sceneMode = 10;
R2_GLOBALS._sound1.play(106);
} else {
- _actor1.setPosition(Common::Point(289, 239), -30);
+ _starship.setPosition(Common::Point(289, 239), -30);
_sceneMode = 0;
R2_GLOBALS._sound1.play(102);
}
+
signal();
}
void Scene1500::remove() {
- R2_GLOBALS._v5589E.top = 3;
- R2_GLOBALS._v5589E.bottom = 168;
R2_GLOBALS._uiElements._active = true;
+ R2_GLOBALS._uiElements._visible = true;
SceneExt::remove();
}
@@ -6964,8 +6865,8 @@ void Scene1500::signal() {
setAction(&_sequenceManager, this, 1, &R2_GLOBALS._player, NULL);
// No break on purpose
case 1:
- if (_actor1._yDiff < 50) {
- _actor1.setPosition(Common::Point(289, 239), _actor1._yDiff + 1);
+ if (_starship._yDiff < 50) {
+ _starship.setPosition(Common::Point(289, 239), _starship._yDiff + 1);
_sceneMode = 1;
}
setAction(&_sequenceManager, this, 1, &R2_GLOBALS._player, NULL);
@@ -6973,12 +6874,12 @@ void Scene1500::signal() {
case 2: {
Common::Point pt(189, 139);
NpcMover *mover = new NpcMover();
- _actor1.addMover(mover, &pt, this);
+ _starship.addMover(mover, &pt, this);
}
break;
case 3:
- if (_actor1._yDiff > 5) {
- _actor1.setPosition(Common::Point(189, 139), _actor1._yDiff - 1);
+ if (_starship._yDiff > 5) {
+ _starship.setPosition(Common::Point(189, 139), _starship._yDiff - 1);
_sceneMode = 3;
}
setAction(&_sequenceManager, this, 1, &R2_GLOBALS._player, NULL);
@@ -6997,7 +6898,7 @@ void Scene1500::signal() {
case 11: {
Common::Point pt(148, 108);
NpcMover *mover = new NpcMover();
- _actor3.addMover(mover, &pt, this);
+ _smallShip.addMover(mover, &pt, this);
}
break;
case 12:
@@ -7006,13 +6907,13 @@ void Scene1500::signal() {
case 21: {
Common::Point pt(-2, -42);
NpcMover *mover = new NpcMover();
- _actor3.addMover(mover, &pt, NULL);
+ _smallShip.addMover(mover, &pt, NULL);
signal();
}
break;
case 22:
- if (_actor1._yDiff < 50) {
- _actor1.setPosition(Common::Point(189, 139), _actor1._yDiff + 1);
+ if (_starship._yDiff < 50) {
+ _starship.setPosition(Common::Point(189, 139), _starship._yDiff + 1);
_sceneMode = 22;
}
setAction(&_sequenceManager, this, 1, &R2_GLOBALS._player, NULL);
@@ -7020,7 +6921,7 @@ void Scene1500::signal() {
case 23: {
Common::Point pt(-13, -61);
NpcMover *mover = new NpcMover();
- _actor1.addMover(mover, &pt, this);
+ _starship.addMover(mover, &pt, this);
}
break;
case 24:
@@ -7033,9 +6934,9 @@ void Scene1500::signal() {
void Scene1500::dispatch() {
if (_sceneMode > 10) {
- float yDiff = sqrt((float) (_actor3._position.x * _actor3._position.x) + (_actor3._position.y * _actor3._position.y));
+ float yDiff = sqrt((float) (_smallShip._position.x * _smallShip._position.x) + (_smallShip._position.y * _smallShip._position.y));
if (yDiff > 6)
- _actor3.setPosition(_actor3._position, (int) yDiff);
+ _smallShip.setPosition(_smallShip._position, (int) yDiff);
}
Scene::dispatch();
@@ -7085,7 +6986,7 @@ void Scene1525::signal() {
}
/*--------------------------------------------------------------------------
- * Scene 1530 - Cutscene - Elevator
+ * Scene 1530 - Cutscene - Crashing on Rimwall
*
*--------------------------------------------------------------------------*/
@@ -7099,6 +7000,7 @@ void Scene1530::postInit(SceneObjectList *OwnerList) {
R2_GLOBALS._uiElements._active = false;
SceneExt::postInit();
+ R2_GLOBALS._interfaceY = SCREEN_HEIGHT;
_stripManager.addSpeaker(&_quinnSpeaker);
_stripManager.addSpeaker(&_seekerSpeaker);
@@ -7122,15 +7024,15 @@ void Scene1530::postInit(SceneObjectList *OwnerList) {
R2_GLOBALS._player._moveRate = 30;
R2_GLOBALS._player._moveDiff = Common::Point(4, 1);
- _actor2.postInit();
- _actor2.setup(1516, 7, 1);
- _actor2.setPosition(Common::Point(121, 41));
- _actor2.animate(ANIM_MODE_2, NULL);
+ _leftReactor.postInit();
+ _leftReactor.setup(1516, 7, 1);
+ _leftReactor.setPosition(Common::Point(121, 41));
+ _leftReactor.animate(ANIM_MODE_2, NULL);
- _actor3.postInit();
- _actor3.setup(1516, 8, 1);
- _actor3.setPosition(Common::Point(107, 116));
- _actor3.animate(ANIM_MODE_2, NULL);
+ _rightReactor.postInit();
+ _rightReactor.setup(1516, 8, 1);
+ _rightReactor.setPosition(Common::Point(107, 116));
+ _rightReactor.animate(ANIM_MODE_2, NULL);
R2_GLOBALS._player.disableControl();
Common::Point pt(480, 75);
@@ -7140,14 +7042,14 @@ void Scene1530::postInit(SceneObjectList *OwnerList) {
_sceneMode = 1;
} else {
- _actor1.postInit();
- _actor1._effect = 1;
+ _seeker.postInit();
+ _seeker._effect = EFFECT_SHADED;
R2_GLOBALS._player.postInit();
R2_GLOBALS._player.animate(ANIM_MODE_1, NULL);
R2_GLOBALS._player.disableControl();
- setAction(&_sequenceManager, this, 1530, &R2_GLOBALS._player, &_actor1, NULL);
+ setAction(&_sequenceManager, this, 1530, &R2_GLOBALS._player, &_seeker, NULL);
_sceneMode = 2;
}
@@ -7180,8 +7082,8 @@ void Scene1530::dispatch() {
int16 x = R2_GLOBALS._player._position.x;
int16 y = R2_GLOBALS._player._position.y;
- _actor2.setPosition(Common::Point(x - 39, y - 85));
- _actor3.setPosition(Common::Point(x - 53, y - 9));
+ _leftReactor.setPosition(Common::Point(x - 39, y - 85));
+ _rightReactor.setPosition(Common::Point(x - 53, y - 9));
Scene::dispatch();
}
@@ -7192,13 +7094,12 @@ void Scene1530::dispatch() {
*--------------------------------------------------------------------------*/
Scene1550::Junk::Junk() {
- _fieldA4 = _junkNumber = 0;
+ _junkNumber = 0;
}
void Scene1550::Junk::synchronize(Serializer &s) {
SceneActor::synchronize(s);
- s.syncAsSint16LE(_fieldA4);
s.syncAsSint16LE(_junkNumber);
}
@@ -7221,13 +7122,13 @@ bool Scene1550::Junk::startAction(CursorType action, Event &event) {
if (_visage == 1561) {
switch (_frame) {
case 2:
- SceneItem::display(1550, 23, 0, 280, 1, 160, 9, 1, 2, 20, 7, 7, -999);
+ SceneItem::display(1550, 23, 0, 280, 1, 160, 9, 1, 2, 20, 7, 7, LIST_END);
break;
case 3:
- SceneItem::display(1550, 26, 0, 280, 1, 160, 9, 1, 2, 20, 7, 7, -999);
+ SceneItem::display(1550, 26, 0, 280, 1, 160, 9, 1, 2, 20, 7, 7, LIST_END);
break;
case 4:
- SceneItem::display(1550, 35, 0, 280, 1, 160, 9, 1, 2, 20, 7, 7, -999);
+ SceneItem::display(1550, 35, 0, 280, 1, 160, 9, 1, 2, 20, 7, 7, LIST_END);
break;
default:
break;
@@ -7235,13 +7136,13 @@ bool Scene1550::Junk::startAction(CursorType action, Event &event) {
} else {
switch ((((_strip - 1) * 5) + _frame) % 3) {
case 0:
- SceneItem::display(1550, 62, 0, 280, 1, 160, 9, 1, 2, 20, 7, 7, -999);
+ SceneItem::display(1550, 62, 0, 280, 1, 160, 9, 1, 2, 20, 7, 7, LIST_END);
break;
case 1:
- SceneItem::display(1550, 53, 0, 280, 1, 160, 9, 1, 2, 20, 7, 7, -999);
+ SceneItem::display(1550, 53, 0, 280, 1, 160, 9, 1, 2, 20, 7, 7, LIST_END);
break;
case 2:
- SceneItem::display(1550, 76, 0, 280, 1, 160, 9, 1, 2, 20, 7, 7, -999);
+ SceneItem::display(1550, 76, 0, 280, 1, 160, 9, 1, 2, 20, 7, 7, LIST_END);
break;
default:
break;
@@ -7271,7 +7172,7 @@ bool Scene1550::ShipComponent::startAction(CursorType action, Event &event) {
switch (action) {
case CURSOR_USE:
if (_componentId == 8) {
- scene->_field412 = 1;
+ scene->_dontExit = true;
R2_GLOBALS._player.disableControl();
if (R2_GLOBALS._player._characterIndex == R2_QUINN)
scene->_sceneMode = 1576;
@@ -7285,101 +7186,101 @@ bool Scene1550::ShipComponent::startAction(CursorType action, Event &event) {
break;
case CURSOR_LOOK:
if (_componentId == 8)
- SceneItem::display(1550, 75, 0, 280, 1, 160, 9, 1, 2, 20, 7, 7, -999);
+ SceneItem::display(1550, 75, 0, 280, 1, 160, 9, 1, 2, 20, 7, 7, LIST_END);
else if (_frame == 1)
- SceneItem::display(1550, 70, 0, 280, 1, 160, 9, 1, 2, 20, 7, 7, -999);
+ SceneItem::display(1550, 70, 0, 280, 1, 160, 9, 1, 2, 20, 7, 7, LIST_END);
else
- SceneItem::display(1550, 71, 0, 280, 1, 160, 9, 1, 2, 20, 7, 7, -999);
+ SceneItem::display(1550, 71, 0, 280, 1, 160, 9, 1, 2, 20, 7, 7, LIST_END);
return true;
break;
case R2_FUEL_CELL:
- scene->_field412 = 1;
+ scene->_dontExit = true;
if (_componentId == 6) {
R2_GLOBALS._player.disableControl();
- scene->_landingStrut.postInit();
+ scene->_wreckage2.postInit();
if (R2_GLOBALS._player._characterIndex == R2_QUINN)
scene->_sceneMode = 1574;
else
scene->_sceneMode = 1582;
- scene->setAction(&scene->_sequenceManager1, scene, scene->_sceneMode, &R2_GLOBALS._player, &scene->_shipComponents[5], &scene->_landingStrut, NULL);
+ scene->setAction(&scene->_sequenceManager1, scene, scene->_sceneMode, &R2_GLOBALS._player, &scene->_shipComponents[5], &scene->_wreckage2, NULL);
return true;
}
return SceneActor::startAction(action, event);
break;
case R2_GYROSCOPE:
- scene->_field412 = 1;
+ scene->_dontExit = true;
if (_componentId == 3) {
R2_GLOBALS._player.disableControl();
- scene->_landingStrut.postInit();
+ scene->_wreckage2.postInit();
if (R2_GLOBALS._player._characterIndex == R2_QUINN)
scene->_sceneMode = 1571;
else
scene->_sceneMode = 1581;
- scene->setAction(&scene->_sequenceManager1, scene, scene->_sceneMode, &R2_GLOBALS._player, &scene->_shipComponents[2], &scene->_landingStrut, NULL);
+ scene->setAction(&scene->_sequenceManager1, scene, scene->_sceneMode, &R2_GLOBALS._player, &scene->_shipComponents[2], &scene->_wreckage2, NULL);
return true;
}
return SceneActor::startAction(action, event);
break;
case R2_GUIDANCE_MODULE:
- scene->_field412 = 1;
+ scene->_dontExit = true;
if (_componentId == 1) {
R2_GLOBALS._player.disableControl();
- scene->_landingStrut.postInit();
+ scene->_wreckage2.postInit();
if (R2_GLOBALS._player._characterIndex == R2_QUINN)
scene->_sceneMode = 1569;
else
scene->_sceneMode = 1579;
- scene->setAction(&scene->_sequenceManager1, scene, scene->_sceneMode, &R2_GLOBALS._player, &scene->_shipComponents[0], &scene->_landingStrut, NULL);
+ scene->setAction(&scene->_sequenceManager1, scene, scene->_sceneMode, &R2_GLOBALS._player, &scene->_shipComponents[0], &scene->_wreckage2, NULL);
return true;
}
return SceneActor::startAction(action, event);
break;
case R2_THRUSTER_VALVE:
- scene->_field412 = 1;
+ scene->_dontExit = true;
if (_componentId == 4) {
R2_GLOBALS._player.disableControl();
scene->_sceneMode = 1572;
- scene->_landingStrut.postInit();
- scene->setAction(&scene->_sequenceManager1, scene, scene->_sceneMode, &R2_GLOBALS._player, &scene->_shipComponents[3], &scene->_landingStrut, NULL);
+ scene->_wreckage2.postInit();
+ scene->setAction(&scene->_sequenceManager1, scene, scene->_sceneMode, &R2_GLOBALS._player, &scene->_shipComponents[3], &scene->_wreckage2, NULL);
return true;
}
return SceneActor::startAction(action, event);
break;
case R2_RADAR_MECHANISM:
- scene->_field412 = 1;
+ scene->_dontExit = true;
if (_componentId == 2) {
R2_GLOBALS._player.disableControl();
- scene->_landingStrut.postInit();
+ scene->_wreckage2.postInit();
if (R2_GLOBALS._player._characterIndex == R2_QUINN)
scene->_sceneMode = 1570;
else
scene->_sceneMode = 1580;
- scene->setAction(&scene->_sequenceManager1, scene, scene->_sceneMode, &R2_GLOBALS._player, &scene->_shipComponents[1], &scene->_landingStrut, NULL);
+ scene->setAction(&scene->_sequenceManager1, scene, scene->_sceneMode, &R2_GLOBALS._player, &scene->_shipComponents[1], &scene->_wreckage2, NULL);
return true;
}
return SceneActor::startAction(action, event);
break;
case R2_IGNITOR:
- scene->_field412 = 1;
+ scene->_dontExit = true;
if (_componentId == 5) {
R2_GLOBALS._player.disableControl();
scene->_sceneMode = 1573;
- scene->_landingStrut.postInit();
- scene->setAction(&scene->_sequenceManager1, scene, scene->_sceneMode, &R2_GLOBALS._player, &scene->_shipComponents[4], &scene->_landingStrut, NULL);
+ scene->_wreckage2.postInit();
+ scene->setAction(&scene->_sequenceManager1, scene, scene->_sceneMode, &R2_GLOBALS._player, &scene->_shipComponents[4], &scene->_wreckage2, NULL);
return true;
}
return SceneActor::startAction(action, event);
break;
case R2_BATTERY:
- scene->_field412 = 1;
+ scene->_dontExit = true;
if (_componentId == 7) {
R2_GLOBALS._player.disableControl();
- scene->_landingStrut.postInit();
+ scene->_wreckage2.postInit();
if (R2_GLOBALS._player._characterIndex == R2_QUINN)
scene->_sceneMode = 1575;
else
scene->_sceneMode = 1583;
- scene->setAction(&scene->_sequenceManager1, scene, scene->_sceneMode, &R2_GLOBALS._player, &scene->_shipComponents[6], &scene->_landingStrut, NULL);
+ scene->setAction(&scene->_sequenceManager1, scene, scene->_sceneMode, &R2_GLOBALS._player, &scene->_shipComponents[6], &scene->_wreckage2, NULL);
return true;
}
return SceneActor::startAction(action, event);
@@ -7449,45 +7350,48 @@ void Scene1550::ShipComponent::setupShipComponent(int componentId) {
setDetails(1550, 70, -1, -1, 2, (SceneItem *)NULL);
}
-Scene1550::UnkObj15503::UnkObj15503() {
- _fieldA4 = 0;
+Scene1550::DishControlsWindow::DishControl::DishControl() {
+ _controlId = 0;
}
-void Scene1550::UnkObj15503::synchronize(Serializer &s) {
+void Scene1550::DishControlsWindow::DishControl::synchronize(Serializer &s) {
SceneActor::synchronize(s);
- s.syncAsSint16LE(_fieldA4);
+ s.syncAsSint16LE(_controlId);
}
-bool Scene1550::UnkObj15503::startAction(CursorType action, Event &event) {
- Scene1550 *scene = (Scene1550 *)R2_GLOBALS._sceneManager._scene;
-
+bool Scene1550::DishControlsWindow::DishControl::startAction(CursorType action, Event &event) {
if (action != CURSOR_USE)
return SceneActor::startAction(action, event);
- switch (_fieldA4) {
+
+ Scene1550 *scene = (Scene1550 *)R2_GLOBALS._sceneManager._scene;
+
+ switch (_controlId) {
case 1:
- if (scene->_actor13._frame == 5) {
+ // Button control
+ if (scene->_dish._frame == 5) {
R2_GLOBALS._player.disableControl();
scene->_sceneMode = 25;
- if (scene->_actor4._frame == 1) {
- scene->setAction(&scene->_sequenceManager1, scene, 1560, &scene->_actor4, NULL);
+ if (scene->_walkway._frame == 1) {
+ scene->setAction(&scene->_sequenceManager1, scene, 1560, &scene->_walkway, NULL);
R2_GLOBALS.setFlag(20);
setFrame(2);
} else {
- scene->setAction(&scene->_sequenceManager1, scene, 1561, &scene->_actor4, NULL);
+ scene->setAction(&scene->_sequenceManager1, scene, 1561, &scene->_walkway, NULL);
R2_GLOBALS.clearFlag(20);
setFrame(1);
}
- scene->_unkArea1.remove();
+ scene->_dishControlsWindow.remove();
}
break;
case 2:
+ // Lever control
R2_GLOBALS._player.disableControl();
- if (scene->_actor13._frame == 1) {
+ if (scene->_dish._frame == 1) {
scene->_sceneMode = 23;
scene->setAction(&scene->_sequenceManager1, scene, 1560, this, NULL);
} else {
- if (scene->_actor4._frame == 1)
+ if (scene->_walkway._frame == 1)
scene->_sceneMode = 24;
else
scene->_sceneMode = 22;
@@ -7500,22 +7404,19 @@ bool Scene1550::UnkObj15503::startAction(CursorType action, Event &event) {
return true;
}
-void Scene1550::UnkArea1550::remove() {
+void Scene1550::DishControlsWindow::remove() {
Scene1550 *scene = (Scene1550 *)R2_GLOBALS._sceneManager._scene;
- _unkObj155031.remove();
- _unkObj155032.remove();
- // sub201EA is a common part with UnkArea1200
- R2_GLOBALS._sceneItems.remove((SceneItem *)this);
- _areaActor.remove();
- SceneArea::remove();
- R2_GLOBALS._insetUp--;
- //
+ _button.remove();
+ _lever.remove();
+
+ ModalWindow::remove();
+
if ((scene->_sceneMode >= 20) && (scene->_sceneMode <= 29))
return;
R2_GLOBALS._player.disableControl();
- if (scene->_actor4._frame == 1) {
+ if (scene->_walkway._frame == 1) {
scene->_sceneMode = 1559;
scene->setAction(&scene->_sequenceManager1, scene, 1559, &R2_GLOBALS._player, NULL);
} else {
@@ -7524,91 +7425,40 @@ void Scene1550::UnkArea1550::remove() {
}
}
-void Scene1550::UnkArea1550::process(Event &event) {
-// This is a copy of Scene1200::LaserPanel::process
- if (_field20 != R2_GLOBALS._insetUp)
- return;
+void Scene1550::DishControlsWindow::setup2(int visage, int stripFrameNum, int frameNum,
+ int posX, int posY) {
+ // Call inherited setup
+ ModalWindow::setup2(visage, stripFrameNum, frameNum, posX, posY);
- CursorType cursor = R2_GLOBALS._events.getCursor();
-
- if (_areaActor._bounds.contains(event.mousePos.x + g_globals->gfxManager()._bounds.left , event.mousePos.y)) {
- if (cursor == _cursorNum) {
- R2_GLOBALS._events.setCursor(_savedCursorNum);
- }
- } else if (event.mousePos.y < 168) {
- if (cursor != _cursorNum) {
- _savedCursorNum = cursor;
- R2_GLOBALS._events.setCursor(CURSOR_INVALID);
- }
- if (event.eventType == EVENT_BUTTON_DOWN) {
- event.handled = true;
- R2_GLOBALS._events.setCursor(_savedCursorNum);
- remove();
- }
- }
-}
-
-void Scene1550::UnkArea1550::proc12(int visage, int stripFrameNum, int frameNum, int posX, int posY) {
- // UnkArea1200::proc12();
+ // Further setup
Scene1550 *scene = (Scene1550 *)R2_GLOBALS._sceneManager._scene;
-
- _areaActor.postInit();
- _areaActor.setup(visage, stripFrameNum, frameNum);
- _areaActor.setPosition(Common::Point(posX, posY));
- _areaActor.fixPriority(250);
- _cursorNum = CURSOR_INVALID;
- scene->_sceneAreas.push_front(this);
- ++R2_GLOBALS._insetUp;
- _field20 = R2_GLOBALS._insetUp;
- //
-
- proc13(1550, 67, -1, -1);
- _unkObj155031.postInit();
- _unkObj155031._fieldA4 = 1;
- if (scene->_actor4._frame == 1)
- _unkObj155031.setup(1559, 3, 1);
+ setup3(1550, 67, -1, -1);
+ _button.postInit();
+ _button._controlId = 1;
+ if (scene->_walkway._frame == 1)
+ _button.setup(1559, 3, 1);
else
- _unkObj155031.setup(1559, 3, 2);
- _unkObj155031.setPosition(Common::Point(142, 79));
- _unkObj155031.fixPriority(251);
- _unkObj155031.setDetails(1550, 68, -1, -1, 2, (SceneItem *) NULL);
-
- _unkObj155032.postInit();
- _unkObj155032._numFrames = 5;
- _unkObj155032._fieldA4 = 2;
- if (scene->_actor13._frame == 1)
- _unkObj155032.setup(1559, 2, 1);
- else
- _unkObj155032.setup(1559, 2, 2);
- _unkObj155032.setPosition(Common::Point(156, 103));
- _unkObj155032.fixPriority(251);
- _unkObj155032.setDetails(1550, 69, -1, -1, 2, (SceneItem *) NULL);
-}
+ _button.setup(1559, 3, 2);
+ _button.setPosition(Common::Point(142, 79));
+ _button.fixPriority(251);
+ _button.setDetails(1550, 68, -1, -1, 2, (SceneItem *) NULL);
-void Scene1550::UnkArea1550::proc13(int resNum, int lookLineNum, int talkLineNum, int useLineNum) {
- // Copy of Scene1200::LaserPanel::proc13
- _areaActor.setDetails(resNum, lookLineNum, talkLineNum, useLineNum, 2, (SceneItem *) NULL);
+ _lever.postInit();
+ _lever._numFrames = 5;
+ _lever._controlId = 2;
+ if (scene->_dish._frame == 1)
+ _lever.setup(1559, 2, 1);
+ else
+ _lever.setup(1559, 2, 5);
+ _lever.setPosition(Common::Point(156, 103));
+ _lever.fixPriority(251);
+ _lever.setDetails(1550, 69, -1, -1, 2, (SceneItem *) NULL);
}
bool Scene1550::WorkingShip::startAction(CursorType action, Event &event) {
return SceneHotspot::startAction(action, event);
}
-bool Scene1550::Hotspot3::startAction(CursorType action, Event &event) {
- // Arrays related to this scene are all hacky in the origina: they are based on the impossibility to use Miranda
- assert ((R2_GLOBALS._player._characterIndex == R2_QUINN) || (R2_GLOBALS._player._characterIndex == R2_SEEKER));
- // The original contains a debug message when CURSOR_TALK is used.
- // This part is totally useless, we could remove it (and the entire function as well)
- if (action == CURSOR_TALK)
- warning("Location: %d/%d - %d",
- R2_GLOBALS._s1550PlayerArea[R2_GLOBALS._player._characterIndex].x,
- R2_GLOBALS._s1550PlayerArea[R2_GLOBALS._player._characterIndex].y,
- scene1550AreaMap[(R2_GLOBALS._s1550PlayerArea[R2_GLOBALS._player._characterIndex].y * 30)] +
- R2_GLOBALS._s1550PlayerArea[R2_GLOBALS._player._characterIndex].x);
-
- return SceneHotspot::startAction(action, event);
-}
-
bool Scene1550::Wreckage::startAction(CursorType action, Event &event) {
return SceneActor::startAction(action, event);
}
@@ -7624,23 +7474,23 @@ bool Scene1550::Companion::startAction(CursorType action, Event &event) {
return true;
}
-bool Scene1550::Actor8::startAction(CursorType action, Event &event) {
+bool Scene1550::AirBag::startAction(CursorType action, Event &event) {
if (action != CURSOR_USE)
return SceneActor::startAction(action, event);
R2_GLOBALS._player.disableControl();
Scene1550 *scene = (Scene1550 *)R2_GLOBALS._sceneManager._scene;
- scene->_field412 = 1;
+ scene->_dontExit = true;
if (R2_GLOBALS._player._characterIndex == R2_QUINN)
scene->_sceneMode = 1552;
else
scene->_sceneMode = 1588;
- scene->setAction(&scene->_sequenceManager1, scene, scene->_sceneMode, &R2_GLOBALS._player, &scene->_actor8, NULL);
+ scene->setAction(&scene->_sequenceManager1, scene, scene->_sceneMode, &R2_GLOBALS._player, &scene->_airbag, NULL);
return true;
}
-bool Scene1550::Actor9::startAction(CursorType action, Event &event) {
+bool Scene1550::Joystick::startAction(CursorType action, Event &event) {
Scene1550 *scene = (Scene1550 *)R2_GLOBALS._sceneManager._scene;
switch (action) {
@@ -7655,7 +7505,7 @@ bool Scene1550::Actor9::startAction(CursorType action, Event &event) {
return true;
break;
case CURSOR_LOOK:
- SceneItem::display(1550, 41, 0, 280, 1, 160, 9, 1, 2, 20, 7, 7, -999);
+ SceneItem::display(1550, 41, 0, 280, 1, 160, 9, 1, 2, 20, 7, 7, LIST_END);
return true;
break;
default:
@@ -7663,7 +7513,7 @@ bool Scene1550::Actor9::startAction(CursorType action, Event &event) {
}
}
-bool Scene1550::Actor10::startAction(CursorType action, Event &event) {
+bool Scene1550::Gyroscope::startAction(CursorType action, Event &event) {
if (action != CURSOR_USE)
return SceneActor::startAction(action, event);
@@ -7674,27 +7524,29 @@ bool Scene1550::Actor10::startAction(CursorType action, Event &event) {
else
scene->_sceneMode = 1589;
- scene->setAction(&scene->_sequenceManager1, scene, scene->_sceneMode, &R2_GLOBALS._player, &scene->_actor10, NULL);
+ scene->setAction(&scene->_sequenceManager1, scene, scene->_sceneMode, &R2_GLOBALS._player,
+ &scene->_gyroscope, NULL);
return true;
}
-bool Scene1550::Actor11::startAction(CursorType action, Event &event) {
+bool Scene1550::DiagnosticsDisplay::startAction(CursorType action, Event &event) {
if (action != CURSOR_USE)
return SceneActor::startAction(action, event);
Scene1550 *scene = (Scene1550 *)R2_GLOBALS._sceneManager._scene;
R2_GLOBALS._player.disableControl();
- scene->_field412 = 1;
+ scene->_dontExit = true;
if (R2_GLOBALS._player._characterIndex == R2_QUINN)
scene->_sceneMode = 1586;
else
scene->_sceneMode = 1587;
- scene->setAction(&scene->_sequenceManager1, scene, scene->_sceneMode, &R2_GLOBALS._player, &scene->_actor11, NULL);
+ scene->setAction(&scene->_sequenceManager1, scene, scene->_sceneMode, &R2_GLOBALS._player,
+ &scene->_diagnosticsDisplay, NULL);
return true;
}
-bool Scene1550::Actor12::startAction(CursorType action, Event &event) {
+bool Scene1550::DishTower::startAction(CursorType action, Event &event) {
if (action != CURSOR_USE)
return SceneActor::startAction(action, event);
@@ -7706,10 +7558,10 @@ bool Scene1550::Actor12::startAction(CursorType action, Event &event) {
scene->setAction(&scene->_sequenceManager1, scene, 1585, &R2_GLOBALS._player, NULL);
} else {
R2_GLOBALS._player.disableControl();
- switch(scene->_field415) {
+ switch(scene->_dishMode) {
case 0:
- scene->_actor13.fixPriority(168);
- scene->_actor4.fixPriority(125);
+ scene->_dish.fixPriority(168);
+ scene->_walkway.fixPriority(125);
scene->_sceneMode = 1558;
scene->setAction(&scene->_sequenceManager1, scene, 1558, &R2_GLOBALS._player, NULL);
break;
@@ -7717,9 +7569,9 @@ bool Scene1550::Actor12::startAction(CursorType action, Event &event) {
return SceneActor::startAction(action, event);
break;
case 2:
- scene->_field415 = 1;
+ scene->_dishMode = 1;
scene->_sceneMode = 1563;
- scene->setAction(&scene->_sequenceManager1, scene, 1563, &R2_GLOBALS._player, &scene->_actor4, NULL);
+ scene->setAction(&scene->_sequenceManager1, scene, 1563, &R2_GLOBALS._player, &scene->_walkway, NULL);
break;
default:
break;
@@ -7729,12 +7581,12 @@ bool Scene1550::Actor12::startAction(CursorType action, Event &event) {
}
-bool Scene1550::Actor13::startAction(CursorType action, Event &event) {
+bool Scene1550::Dish::startAction(CursorType action, Event &event) {
Scene1550 *scene = (Scene1550 *)R2_GLOBALS._sceneManager._scene;
switch (action) {
case CURSOR_USE:
- if (scene->_field415 != 2)
+ if (scene->_dishMode != 2)
return SceneActor::startAction(action, event);
if (R2_INVENTORY.getObjectScene(R2_BATTERY) == 1550) {
@@ -7742,17 +7594,17 @@ bool Scene1550::Actor13::startAction(CursorType action, Event &event) {
scene->_sceneMode = 1564;
scene->setAction(&scene->_sequenceManager1, scene, 1564, &R2_GLOBALS._player, NULL);
} else
- SceneItem::display(1550, 64, 0, 280, 1, 160, 9, 1, 2, 20, 7, 7, -999);
+ SceneItem::display(1550, 64, 0, 280, 1, 160, 9, 1, 2, 20, 7, 7, LIST_END);
return true;
break;
case CURSOR_LOOK:
- if (scene->_field415 != 2)
+ if (scene->_dishMode != 2)
return SceneActor::startAction(action, event);
if (R2_INVENTORY.getObjectScene(R2_BATTERY) == 1550) {
- SceneItem::display(1550, 74, 0, 280, 1, 160, 9, 1, 2, 20, 7, 7, -999);
+ SceneItem::display(1550, 74, 0, 280, 1, 160, 9, 1, 2, 20, 7, 7, LIST_END);
} else
- SceneItem::display(1550, 64, 0, 280, 1, 160, 9, 1, 2, 20, 7, 7, -999);
+ SceneItem::display(1550, 64, 0, 280, 1, 160, 9, 1, 2, 20, 7, 7, LIST_END);
return true;
break;
default:
@@ -7761,26 +7613,28 @@ bool Scene1550::Actor13::startAction(CursorType action, Event &event) {
}
}
+/*--------------------------------------------------------------------------*/
+
Scene1550::Scene1550() {
- _field412 = 0;
- _field414 = 0;
- _field415 = 0;
- _field417 = 0;
- _field419 = 0;
+ _dontExit = false;
+ _wallType = 0;
+ _dishMode = 0;
+ _sceneResourceId = 0;
+ _walkRegionsId = 0;
}
void Scene1550::synchronize(Serializer &s) {
SceneExt::synchronize(s);
- s.syncAsSint16LE(_field412);
- s.syncAsByte(_field414);
- s.syncAsSint16LE(_field415);
- s.syncAsSint16LE(_field417);
- s.syncAsSint16LE(_field419);
+ s.syncAsSint16LE(_dontExit);
+ s.syncAsByte(_wallType);
+ s.syncAsSint16LE(_dishMode);
+ s.syncAsSint16LE(_sceneResourceId);
+ s.syncAsSint16LE(_walkRegionsId);
}
void Scene1550::postInit(SceneObjectList *OwnerList) {
- if ((R2_GLOBALS._s1550PlayerArea[R2_GLOBALS._player._characterIndex].x == 9) &&
+ if ((R2_GLOBALS._s1550PlayerArea[R2_GLOBALS._player._characterIndex].x == 9) &&
(R2_GLOBALS._s1550PlayerArea[R2_GLOBALS._player._characterIndex].y == 11))
// Exiting the intact spaceship
loadScene(1234);
@@ -7791,8 +7645,8 @@ void Scene1550::postInit(SceneObjectList *OwnerList) {
scalePalette(65, 65, 65);
setZoomPercents(30, 75, 170, 100);
- _field417 = 1550;
- _field419 = 0;
+ _sceneResourceId = 1550;
+ _walkRegionsId = 0;
if (R2_GLOBALS._sceneManager._previousScene == -1)
R2_GLOBALS.setFlag(16);
@@ -7808,7 +7662,7 @@ void Scene1550::postInit(SceneObjectList *OwnerList) {
_stripManager.addSpeaker(&_seekerSpeaker);
R2_GLOBALS._player.postInit();
- R2_GLOBALS._player._effect = 6;
+ R2_GLOBALS._player._effect = EFFECT_SHADED2;
if (R2_GLOBALS._player._characterIndex == R2_QUINN)
R2_GLOBALS._player.setup(1500, 3, 1);
@@ -7817,7 +7671,7 @@ void Scene1550::postInit(SceneObjectList *OwnerList) {
R2_GLOBALS._player._moveDiff = Common::Point(5, 3);
- if ((R2_GLOBALS._s1550PlayerArea[R2_GLOBALS._player._characterIndex].x == 9) &&
+ if ((R2_GLOBALS._s1550PlayerArea[R2_GLOBALS._player._characterIndex].x == 9) &&
(R2_GLOBALS._s1550PlayerArea[R2_GLOBALS._player._characterIndex].y == 11))
R2_GLOBALS._player.setPosition(Common::Point(157, 135));
else
@@ -7826,13 +7680,13 @@ void Scene1550::postInit(SceneObjectList *OwnerList) {
R2_GLOBALS._player.animate(ANIM_MODE_1, NULL);
R2_GLOBALS._player.disableControl();
- _field414 = 0;
+ _wallType = 0;
_companion.changeZoom(-1);
R2_GLOBALS._player.changeZoom(-1);
switch (R2_GLOBALS._sceneManager._previousScene) {
case 1530:
- R2_GLOBALS._v565AE = 0;
+ R2_GLOBALS._stripModifier = 0;
// No break on purpose
case 300:
// No break on purpose
@@ -7847,9 +7701,9 @@ void Scene1550::postInit(SceneObjectList *OwnerList) {
R2_GLOBALS._player.disableControl();
R2_GLOBALS._player.animate(ANIM_MODE_NONE, NULL);
- _field412 = 1;
+ _dontExit = true;
- _landingStrut.postInit();
+ _wreckage2.postInit();
_shipComponents[7].setupShipComponent(8);
_shipComponents[7].hide();
if (R2_GLOBALS._player._characterIndex == R2_QUINN)
@@ -7857,7 +7711,7 @@ void Scene1550::postInit(SceneObjectList *OwnerList) {
else
_sceneMode = 1578;
- setAction(&_sequenceManager1, this, _sceneMode, &R2_GLOBALS._player, &_landingStrut, &_shipComponents[7], NULL);
+ setAction(&_sequenceManager1, this, _sceneMode, &R2_GLOBALS._player, &_wreckage2, &_shipComponents[7], NULL);
R2_GLOBALS._player._oldCharacterScene[R2_GLOBALS._player._characterIndex] = 1550;
} else {
R2_GLOBALS._player.enableControl();
@@ -7869,9 +7723,9 @@ void Scene1550::postInit(SceneObjectList *OwnerList) {
enterArea();
- _shipHull.setDetails(16, 1550, 10, -1, -1);
- _item2.setDetails(24, 1550, 10, -1, -1);
- _item3.setDetails(Rect(0, 0, 320, 200), 1550, 0, 1, -1, 1, NULL);
+ _intactHull1.setDetails(16, 1550, 10, -1, -1);
+ _intactHull2.setDetails(24, 1550, 10, -1, -1);
+ _background.setDetails(Rect(0, 0, 320, 200), 1550, 0, 1, -1, 1, NULL);
if ((R2_GLOBALS._sceneManager._previousScene == 1500) && (R2_GLOBALS.getFlag(16))) {
_sceneMode = 70;
@@ -7886,8 +7740,8 @@ void Scene1550::postInit(SceneObjectList *OwnerList) {
_companion.changeZoom(77);
_companion.setDetails(1550, -1, -1, -1, 2, (SceneItem *) NULL);
- assert(_field419 >= 1550);
- R2_GLOBALS._walkRegions.disableRegion(k5A750[_field419 - 1550]);
+ assert(_walkRegionsId >= 1550);
+ R2_GLOBALS._walkRegions.disableRegion(k5A750[_walkRegionsId - 1550]);
setAction(&_sequenceManager1, this, 1590, &_companion, NULL);
} else if ((_sceneMode != 1577) && (_sceneMode != 1578))
@@ -7903,8 +7757,7 @@ void Scene1550::signal() {
case 5:
// No break on purpose
case 7:
- _field412 = 0;
- R2_GLOBALS._v56AAB = 0;
+ _dontExit = false;
R2_GLOBALS._player.enableControl(CURSOR_WALK);
break;
case 20:
@@ -7914,27 +7767,28 @@ void Scene1550::signal() {
case 25:
// No break on purpose
case 1563:
+ // Show the communication dish controls window
R2_GLOBALS.clearFlag(20);
- _unkArea1.proc12(1559, 1, 1, 160, 125);
+ _dishControlsWindow.setup2(1559, 1, 1, 160, 125);
R2_GLOBALS._player.enableControl();
_sceneMode = 0;
break;
case 22:
- _unkArea1.remove();
+ _dishControlsWindow.remove();
_sceneMode = 24;
- setAction(&_sequenceManager1, this, 1561, &_actor4, NULL);
+ setAction(&_sequenceManager1, this, 1561, &_walkway, NULL);
R2_GLOBALS.clearFlag(20);
break;
case 23:
- _unkArea1.remove();
+ _dishControlsWindow.remove();
_sceneMode = 20;
- setAction(&_sequenceManager1, this, 1566, &_actor13, &_actor5, NULL);
- R2_GLOBALS.setFlag(21);
+ setAction(&_sequenceManager1, this, 1566, &_dish, &_dishTowerShadow, NULL);
+ R2_GLOBALS.setFlag(19);
break;
case 24:
- _unkArea1.remove();
+ _dishControlsWindow.remove();
_sceneMode = 21;
- setAction(&_sequenceManager1, this, 1567, &_actor13, &_actor5, NULL);
+ setAction(&_sequenceManager1, this, 1567, &_dish, &_dishTowerShadow, NULL);
R2_GLOBALS.clearFlag(19);
break;
case 30:
@@ -8007,7 +7861,7 @@ void Scene1550::signal() {
R2_GLOBALS._player.enableControl();
break;
case 50:
- warning("STUB: sub_1D227()");
+ // Removed (useless ?) call to sub_1D227
++_sceneMode;
setAction(&_sequenceManager1, this, 1591, &R2_GLOBALS._player, NULL);
if (g_globals->_sceneObjects->contains(&_companion))
@@ -8030,18 +7884,20 @@ void Scene1550::signal() {
_companion.changeZoom(-1);
_sceneMode = 1592;
if (R2_GLOBALS._player._characterIndex == R2_QUINN)
- setAction(&_sequenceManager1, this, 1592, &R2_GLOBALS._player, &_companion, &_junk[0], &_actor9, NULL);
+ setAction(&_sequenceManager1, this, 1592, &R2_GLOBALS._player, &_companion,
+ &_junk[0], &_joystick, NULL);
else
- setAction(&_sequenceManager1, this, 1593, &R2_GLOBALS._player, &_companion, &_junk[0], &_actor9, NULL);
+ setAction(&_sequenceManager1, this, 1593, &R2_GLOBALS._player, &_companion,
+ &_junk[0], &_joystick, NULL);
break;
case 61:
R2_GLOBALS._player.enableControl(CURSOR_USE);
R2_GLOBALS._player._canWalk = false;
- _field415 = 2;
+ _dishMode = 2;
break;
case 62:
R2_GLOBALS._player.enableControl(CURSOR_TALK);
- if (_field415 == 2) {
+ if (_dishMode == 2) {
R2_GLOBALS._player.enableControl(CURSOR_USE);
R2_GLOBALS._player._canWalk = false;
}
@@ -8058,33 +7914,33 @@ void Scene1550::signal() {
_sceneMode = 60;
R2_GLOBALS._player.disableControl();
R2_GLOBALS._events.setCursor(CURSOR_CROSSHAIRS);
- if (R2_GLOBALS._v565AE >= 3) {
+ if (R2_GLOBALS._stripModifier >= 3) {
if (R2_GLOBALS._player._characterIndex == R2_QUINN)
_stripManager.start(572, this);
else
_stripManager.start(573, this);
} else {
- ++R2_GLOBALS._v565AE;
+ ++R2_GLOBALS._stripModifier;
if (R2_GLOBALS._player._characterIndex == R2_QUINN)
- _stripManager.start(499 + R2_GLOBALS._v565AE, this);
+ _stripManager.start(499 + R2_GLOBALS._stripModifier, this);
else
- _stripManager.start(502 + R2_GLOBALS._v565AE, this);
+ _stripManager.start(502 + R2_GLOBALS._stripModifier, this);
}
} else {
_sceneMode = 60;
R2_GLOBALS._player.disableControl();
R2_GLOBALS._events.setCursor(CURSOR_CROSSHAIRS);
- if (R2_GLOBALS._v565AE >= 4) {
+ if (R2_GLOBALS._stripModifier >= 4) {
if (R2_GLOBALS._player._characterIndex == R2_QUINN)
_stripManager.start(572, this);
else
_stripManager.start(573, this);
} else {
- ++R2_GLOBALS._v565AE;
+ ++R2_GLOBALS._stripModifier;
if (R2_GLOBALS._player._characterIndex == R2_QUINN)
- _stripManager.start(563 + R2_GLOBALS._v565AE, this);
+ _stripManager.start(563 + R2_GLOBALS._stripModifier, this);
else
- _stripManager.start(567 + R2_GLOBALS._v565AE, this);
+ _stripManager.start(567 + R2_GLOBALS._stripModifier, this);
}
}
break;
@@ -8095,8 +7951,8 @@ void Scene1550::signal() {
// No break on purpose
case 1588:
R2_INVENTORY.setObjectScene(R2_AIRBAG, R2_GLOBALS._player._characterIndex);
- _actor8.remove();
- _field412 = 0;
+ _airbag.remove();
+ _dontExit = false;
R2_GLOBALS._player.enableControl();
break;
case 1553:
@@ -8104,33 +7960,33 @@ void Scene1550::signal() {
break;
case 1554:
R2_GLOBALS._player.enableControl();
- _field412 = 0;
+ _dontExit = false;
break;
case 1555:
// No break on purpose
case 1589:
R2_INVENTORY.setObjectScene(R2_GYROSCOPE, R2_GLOBALS._player._characterIndex);
- _actor10.remove();
+ _gyroscope.remove();
R2_GLOBALS._player.enableControl();
break;
case 1558:
- _actor13.fixPriority(124);
- _field415 = 1;
- _unkArea1.proc12(1559, 1, 1, 160, 125);
+ _dish.fixPriority(124);
+ _dishMode = 1;
+ _dishControlsWindow.setup2(1559, 1, 1, 160, 125);
R2_GLOBALS._player.enableControl();
break;
case 1559:
- _actor13.fixPriority(168);
- _actor4.fixPriority(169);
+ _dish.fixPriority(168);
+ _walkway.fixPriority(169);
R2_GLOBALS._player.fixPriority(-1);
R2_GLOBALS._player.changeZoom(-1);
- _field415 = 0;
+ _dishMode = 0;
R2_GLOBALS._player.enableControl();
break;
case 1562:
R2_GLOBALS._player.enableControl();
R2_GLOBALS._player._canWalk = false;
- _field415 = 2;
+ _dishMode = 2;
break;
case 1564:
R2_INVENTORY.setObjectScene(R2_BATTERY, 1);
@@ -8144,52 +8000,52 @@ void Scene1550::signal() {
case 1569:
// No break on purpose
case 1579:
- _field412 = 0;
- _landingStrut.remove();
+ _dontExit = false;
+ _wreckage2.remove();
R2_INVENTORY.setObjectScene(R2_GUIDANCE_MODULE, 0);
R2_GLOBALS._player.enableControl();
break;
case 1570:
// No break on purpose
case 1580:
- _field412 = 0;
- _landingStrut.remove();
+ _dontExit = false;
+ _wreckage2.remove();
R2_INVENTORY.setObjectScene(R2_RADAR_MECHANISM, 0);
R2_GLOBALS._player.enableControl();
break;
case 1571:
// No break on purpose
case 1581:
- _field412 = 0;
- _landingStrut.remove();
+ _dontExit = false;
+ _wreckage2.remove();
R2_INVENTORY.setObjectScene(R2_GYROSCOPE, 0);
R2_GLOBALS._player.enableControl();
break;
case 1572:
- _field412 = 0;
- _landingStrut.remove();
+ _dontExit = false;
+ _wreckage2.remove();
R2_INVENTORY.setObjectScene(R2_THRUSTER_VALVE, 0);
R2_GLOBALS._player.enableControl();
break;
case 1573:
- _field412 = 0;
- _landingStrut.remove();
+ _dontExit = false;
+ _wreckage2.remove();
R2_INVENTORY.setObjectScene(R2_IGNITOR, 0);
R2_GLOBALS._player.enableControl();
break;
case 1574:
// No break on purpose
case 1582:
- _field412 = 0;
- _landingStrut.remove();
+ _dontExit = false;
+ _wreckage2.remove();
R2_INVENTORY.setObjectScene(R2_FUEL_CELL, 0);
R2_GLOBALS._player.enableControl();
break;
case 1575:
// No break on purpose
case 1583:
- _field412 = 0;
- _landingStrut.remove();
+ _dontExit = false;
+ _wreckage2.remove();
R2_INVENTORY.setObjectScene(R2_BATTERY, 0);
R2_GLOBALS._player.enableControl();
break;
@@ -8203,32 +8059,32 @@ void Scene1550::signal() {
// No break on purpose
case 1578:
_sceneMode = 0;
- _landingStrut.remove();
- _field412 = 0;
+ _wreckage2.remove();
+ _dontExit = false;
R2_GLOBALS._player.fixPriority(-1);
R2_GLOBALS._player.enableControl();
break;
case 1585:
- SceneItem::display(1550, 66, 0, 280, 1, 160, 9, 1, 2, 20, 7, 7, -999);
+ SceneItem::display(1550, 66, 0, 280, 1, 160, 9, 1, 2, 20, 7, 7, LIST_END);
R2_GLOBALS._player.enableControl();
break;
case 1586:
// No break on purpose
case 1587:
R2_INVENTORY.setObjectScene(R2_DIAGNOSTICS_DISPLAY, R2_GLOBALS._player._characterIndex);
- _landingStrut.remove();
- _field412 = 0;
+ _diagnosticsDisplay.remove();
+ _dontExit = false;
R2_GLOBALS._player.enableControl();
break;
case 1592:
- _actor9.remove();
+ _joystick.remove();
R2_INVENTORY.setObjectScene(R2_JOYSTICK, 1);
if (R2_GLOBALS._player._characterIndex == R2_QUINN) {
R2_GLOBALS._s1550PlayerArea[R2_SEEKER] = R2_GLOBALS._s1550PlayerArea[R2_QUINN];
} else {
R2_GLOBALS._s1550PlayerArea[R2_QUINN] = R2_GLOBALS._s1550PlayerArea[R2_SEEKER];
}
- R2_GLOBALS._player.enableControl();
+ R2_GLOBALS._player.enableControl(CURSOR_WALK);
break;
default:
_sceneMode = 62;
@@ -8241,14 +8097,14 @@ void Scene1550::process(Event &event) {
if ((!R2_GLOBALS._player._canWalk) && (R2_GLOBALS._events.getCursor() == R2_NEGATOR_GUN) && (event.eventType == EVENT_BUTTON_DOWN) && (this->_screenNumber == 1234)) {
int curReg = R2_GLOBALS._sceneRegions.indexOf(event.mousePos);
if (curReg == 0)
- _field412 = 1;
+ _dontExit = true;
else if (((R2_GLOBALS._player._position.y < 90) && (event.mousePos.y > 90)) || ((R2_GLOBALS._player._position.y > 90) && (event.mousePos.y < 90)))
- _field412 = 1;
+ _dontExit = true;
else
- _field412 = 0;
+ _dontExit = false;
if ((curReg == 13) || (curReg == 14))
- _field412 = 0;
+ _dontExit = false;
}
Scene::process(event);
@@ -8262,20 +8118,23 @@ void Scene1550::dispatch() {
if ((R2_GLOBALS._s1550PlayerArea[R2_GLOBALS._player._characterIndex].x == 15) && (R2_GLOBALS._s1550PlayerArea[R2_GLOBALS._player._characterIndex].y == 16)) {
R2_GLOBALS._player._shade = 0;
- // Original game contains a switch based on an uninitialized variable.
- // Until we understand what should really happen there, this code is unused on purpose
+
+ // NOTE: Original game contains a switch based on an uninitialized variable.
+ // We're leaving this code here, but ifdef'ed out, in case we can ever figure out
+ // what the original programmers intended the value to come from
+#if 0
int missingVariable = 0;
switch (missingVariable) {
case 144:
// No break on purpose
case 146:
- _actor13._frame = 5;
+ _dish._frame = 5;
R2_GLOBALS._player._shade = 3;
break;
case 148:
// No break on purpose
case 149:
- _actor13._frame = 1;
+ _dish._frame = 1;
// No break on purpose
case 147:
// No break on purpose
@@ -8285,9 +8144,10 @@ void Scene1550::dispatch() {
default:
break;
}
+#endif
}
- if (_field412 != 0)
+ if (_dontExit)
return;
switch (R2_GLOBALS._player.getRegionIndex() - 11) {
@@ -8297,7 +8157,7 @@ void Scene1550::dispatch() {
// Exiting the top of the screen
R2_GLOBALS._player.disableControl();
_sceneMode = 1;
- _field412 = 1;
+ _dontExit = true;
--R2_GLOBALS._s1550PlayerArea[R2_GLOBALS._player._characterIndex].y;
enterArea();
@@ -8321,7 +8181,7 @@ void Scene1550::dispatch() {
// Exiting the bottom of the screen
R2_GLOBALS._player.disableControl();
_sceneMode = 3;
- _field412 = 1;
+ _dontExit = true;
++R2_GLOBALS._s1550PlayerArea[R2_GLOBALS._player._characterIndex].y;
enterArea();
@@ -8345,7 +8205,7 @@ void Scene1550::dispatch() {
// Exiting the right of the screen
R2_GLOBALS._player.disableControl();
_sceneMode = 5;
- _field412 = 1;
+ _dontExit = true;
++R2_GLOBALS._s1550PlayerArea[R2_GLOBALS._player._characterIndex].x;
enterArea();
@@ -8373,7 +8233,7 @@ void Scene1550::dispatch() {
// Exiting to the left of the screen
R2_GLOBALS._player.disableControl();
_sceneMode = 7;
- _field412 = 1;
+ _dontExit = true;
--R2_GLOBALS._s1550PlayerArea[R2_GLOBALS._player._characterIndex].x;
enterArea();
@@ -8414,11 +8274,11 @@ void Scene1550::saveCharacter(int characterIndex) {
SceneExt::saveCharacter(characterIndex);
}
-void Scene1550::SceneActor1550::subA4D14(int frameNumber, int strip) {
+void Scene1550::Wall::setupWall(int frameNumber, int strip) {
Scene1550 *scene = (Scene1550 *)R2_GLOBALS._sceneManager._scene;
postInit();
- if (scene->_field414 == 2)
+ if (scene->_wallType == 2)
setup(1551, strip, frameNumber);
else
setup(1554, strip, frameNumber);
@@ -8529,7 +8389,7 @@ void Scene1550::SceneActor1550::subA4D14(int frameNumber, int strip) {
switch (frameNumber) {
case 2:
fixPriority(2);
- if (scene->_field414 == 2)
+ if (scene->_wallType == 2)
setup(1553, 2, 1);
else
setup(1556, 2, 1);
@@ -8554,7 +8414,7 @@ void Scene1550::SceneActor1550::subA4D14(int frameNumber, int strip) {
case 4:
if (frameNumber == 2) {
fixPriority(250);
- if (scene->_field414 == 2)
+ if (scene->_wallType == 2)
setup(1553, 1, 1);
else
setup(1556, 1, 1);
@@ -8599,17 +8459,14 @@ void Scene1550::SceneActor1550::subA4D14(int frameNumber, int strip) {
}
void Scene1550::enterArea() {
- Rect tmpRect;
- _field419 = 0;
- _field415 = 0;
+ _walkRegionsId = 0;
+ _dishMode = 0;
- tmpRect = R2_GLOBALS._v5589E;
-
- _actor14.remove();
+ _wallCorner1.remove();
_westWall.remove();
_northWall.remove();
_southWall.remove();
- _actor16.remove();
+ _wallCorner2.remove();
_eastWall.remove();
for (int i = 0; i < 8; ++i)
@@ -8620,21 +8477,21 @@ void Scene1550::enterArea() {
for (int i = 0; i < 8; ++i)
_shipComponents[i].remove();
- _actor8.remove();
- _actor9.remove();
- _actor10.remove();
- _actor3.remove();
- _actor11.remove();
+ _airbag.remove();
+ _joystick.remove();
+ _gyroscope.remove();
+ _wreckage4.remove();
+ _diagnosticsDisplay.remove();
if ((_sceneMode != 1577) && (_sceneMode != 1578))
- _landingStrut.remove();
+ _wreckage2.remove();
- _actor2.remove();
+ _wreckage3.remove();
_companion.remove();
- _actor13.remove();
- _actor5.remove();
- _actor12.remove();
- _actor4.remove();
+ _dish.remove();
+ _dishTowerShadow.remove();
+ _dishTower.remove();
+ _walkway.remove();
// Set up of special walk regions for certain areas
switch (R2_GLOBALS._s1550PlayerArea[R2_GLOBALS._player._characterIndex].y) {
@@ -8642,11 +8499,11 @@ void Scene1550::enterArea() {
switch (R2_GLOBALS._s1550PlayerArea[R2_GLOBALS._player._characterIndex].x) {
case 3:
R2_GLOBALS._walkRegions.load(1554);
- _field419 = 1554;
+ _walkRegionsId = 1554;
break;
case 4:
R2_GLOBALS._walkRegions.load(1553);
- _field419 = 1553;
+ _walkRegionsId = 1553;
break;
default:
break;
@@ -8658,7 +8515,7 @@ void Scene1550::enterArea() {
if ((R2_GLOBALS._s1550PlayerArea[R2_GLOBALS._player._characterIndex].x == 23) || (R2_GLOBALS._s1550PlayerArea[R2_GLOBALS._player._characterIndex].x)) {
if (!R2_GLOBALS.getFlag(16)) {
R2_GLOBALS._walkRegions.load(1559);
- _field419 = 1559;
+ _walkRegionsId = 1559;
}
}
break;
@@ -8666,11 +8523,11 @@ void Scene1550::enterArea() {
switch (R2_GLOBALS._s1550PlayerArea[R2_GLOBALS._player._characterIndex].x) {
case 10:
R2_GLOBALS._walkRegions.load(1555);
- _field419 = 1555;
+ _walkRegionsId = 1555;
break;
case 11:
R2_GLOBALS._walkRegions.load(1556);
- _field419 = 1556;
+ _walkRegionsId = 1556;
break;
default:
break;
@@ -8680,11 +8537,11 @@ void Scene1550::enterArea() {
switch (R2_GLOBALS._s1550PlayerArea[R2_GLOBALS._player._characterIndex].x) {
case 24:
R2_GLOBALS._walkRegions.load(1558);
- _field419 = 1558;
+ _walkRegionsId = 1558;
break;
case 25:
R2_GLOBALS._walkRegions.load(1557);
- _field419 = 1557;
+ _walkRegionsId = 1557;
break;
default:
break;
@@ -8694,15 +8551,15 @@ void Scene1550::enterArea() {
switch (R2_GLOBALS._s1550PlayerArea[R2_GLOBALS._player._characterIndex].x) {
case 2:
R2_GLOBALS._walkRegions.load(1552);
- _field419 = 1552;
+ _walkRegionsId = 1552;
break;
case 3:
R2_GLOBALS._walkRegions.load(1551);
- _field419 = 1551;
+ _walkRegionsId = 1551;
break;
case 15:
R2_GLOBALS._walkRegions.load(1575);
- _field419 = 1575;
+ _walkRegionsId = 1575;
default:
break;
}
@@ -8713,13 +8570,15 @@ void Scene1550::enterArea() {
int varA = 0;
+ // This section handles checks if the ARM spacecraft have not yet seized
+ // control of Lance of Truth.
if (!R2_GLOBALS.getFlag(16)) {
switch (R2_GLOBALS._s1550PlayerArea[R2_GLOBALS._player._characterIndex].y - 2) {
case 0:
switch (R2_GLOBALS._s1550PlayerArea[R2_GLOBALS._player._characterIndex].x - 22) {
case 0:
varA = 1553;
- _northWall.subA4D14(6, 0);
+ _northWall.setupWall(6, 0);
break;
case 1:
// No break on purpose
@@ -8732,7 +8591,7 @@ void Scene1550::enterArea() {
break;
case 5:
varA = 1553;
- _northWall.subA4D14(6, 0);
+ _northWall.setupWall(6, 0);
break;
default:
break;
@@ -8744,11 +8603,11 @@ void Scene1550::enterArea() {
switch (R2_GLOBALS._s1550PlayerArea[R2_GLOBALS._player._characterIndex].x - 21) {
case 0:
varA = 1550;
- _northWall.subA4D14(9, 0);
+ _northWall.setupWall(9, 0);
break;
case 1:
varA = 1552;
- _northWall.subA4D14(10, 0);
+ _northWall.setupWall(10, 0);
break;
case 2:
// No break on purpose
@@ -8761,11 +8620,11 @@ void Scene1550::enterArea() {
break;
case 6:
varA = 1552;
- _northWall.subA4D14(7, 0);
+ _northWall.setupWall(7, 0);
break;
case 7:
varA = 1550;
- _northWall.subA4D14(8, 0);
+ _northWall.setupWall(8, 0);
break;
default:
break;
@@ -8775,11 +8634,11 @@ void Scene1550::enterArea() {
switch (R2_GLOBALS._s1550PlayerArea[R2_GLOBALS._player._characterIndex].x - 21) {
case 0:
varA = 1550;
- _northWall.subA4D14(4, 0);
+ _northWall.setupWall(4, 0);
break;
case 1:
varA = 1550;
- _northWall.subA4D14(3, 0);
+ _northWall.setupWall(3, 0);
break;
case 2:
// No break on purpose
@@ -8792,11 +8651,11 @@ void Scene1550::enterArea() {
break;
case 6:
varA = 1550;
- _northWall.subA4D14(2, 0);
+ _northWall.setupWall(2, 0);
break;
case 7:
varA = 1550;
- _northWall.subA4D14(1, 0);
+ _northWall.setupWall(1, 0);
break;
default:
break;
@@ -8805,41 +8664,44 @@ void Scene1550::enterArea() {
default:
break;
}
- if ((R2_GLOBALS._s1550PlayerArea[R2_GLOBALS._player._characterIndex].y > 0) && (R2_GLOBALS._s1550PlayerArea[R2_GLOBALS._player._characterIndex].x <= 29) && (R2_GLOBALS._s1550PlayerArea[R2_GLOBALS._player._characterIndex].x >= 20) && (R2_GLOBALS._s1550PlayerArea[R2_GLOBALS._player._characterIndex].y > 7)) {
+ if ((R2_GLOBALS._s1550PlayerArea[R2_GLOBALS._player._characterIndex].y > 0) &&
+ (R2_GLOBALS._s1550PlayerArea[R2_GLOBALS._player._characterIndex].x <= 29) &&
+ ((R2_GLOBALS._s1550PlayerArea[R2_GLOBALS._player._characterIndex].x < 20) ||
+ (R2_GLOBALS._s1550PlayerArea[R2_GLOBALS._player._characterIndex].y > 7))) {
+ // In an area where the cutscene can be triggered, so start it
R2_GLOBALS.setFlag(16);
R2_GLOBALS._sceneManager.changeScene(1500);
}
}
- if ((R2_GLOBALS._s1550PlayerArea[R2_GLOBALS._player._characterIndex].x == 9) &&
+ if ((R2_GLOBALS._s1550PlayerArea[R2_GLOBALS._player._characterIndex].x == 9) &&
(R2_GLOBALS._s1550PlayerArea[R2_GLOBALS._player._characterIndex].y == 11)) {
if (_screenNumber != 1234) {
R2_GLOBALS._sceneManager._fadeMode = FADEMODE_IMMEDIATE;
loadScene(1234);
R2_GLOBALS._sceneManager._hasPalette = false;
- _field414 = 0;
- }
- } else {
- if (_screenNumber == 1234) {
- R2_GLOBALS._sceneManager._fadeMode = FADEMODE_IMMEDIATE;
- loadScene(1550);
- R2_GLOBALS._sceneManager._hasPalette = false;
+ _wallType = 0;
}
+ } else if (_screenNumber == 1234) {
+ R2_GLOBALS._sceneManager._fadeMode = FADEMODE_IMMEDIATE;
+ loadScene(1550);
+ R2_GLOBALS._sceneManager._hasPalette = false;
}
- if (R2_GLOBALS._sceneManager._sceneNumber == 1234)
- _field419 = 1576;
+ if (_screenNumber == 1234)
+ _walkRegionsId = 1576;
- if (_field414 == 0) {
- _field414 = 1;
+ if (_wallType == 0) {
+ _wallType = 1;
} else {
- if (_field414 == 2) {
- _field414 = 3;
+ if (_wallType == 2) {
+ _wallType = 3;
} else {
- _field414 = 2;
+ _wallType = 2;
}
if (R2_GLOBALS._sceneManager._sceneNumber == 1550){
+#if 0
warning("Mouse_hideIfNeeded()");
warning("gfx_set_pane_p");
for (int i = 3; i != 168; ++i) {
@@ -8847,12 +8709,13 @@ void Scene1550::enterArea() {
warning("missing for loop, to be implemented");
warning("gfx_draw_slice");
}
- warning("Missing sub2957D()");
+ warning("gfx_flip_screen()");
warning("gfx_set_pane_p()");
+#endif
R2_GLOBALS._sceneManager._fadeMode = FADEMODE_IMMEDIATE;
if (varA == 0) {
- if (_field417 != 1550) {
+ if (_sceneResourceId != 1550) {
g_globals->_scenePalette.loadPalette(1550);
R2_GLOBALS._sceneManager._hasPalette = true;
}
@@ -8862,142 +8725,142 @@ void Scene1550::enterArea() {
}
if (R2_GLOBALS._sceneManager._hasPalette)
- _field417 = varA;
+ _sceneResourceId = varA;
- warning("sub_2C429()");
+// warning("sub_2C429()");
}
}
// Scene setup dependent on the type of cell specified in the scene map
- switch (scene1550AreaMap[(R2_GLOBALS._s1550PlayerArea[R2_GLOBALS._player._characterIndex].y * 30) +
+ switch (scene1550AreaMap[(R2_GLOBALS._s1550PlayerArea[R2_GLOBALS._player._characterIndex].y * 30) +
R2_GLOBALS._s1550PlayerArea[R2_GLOBALS._player._characterIndex].x]) {
case 0:
// Standard cell
- if (_field419 == 0) {
+ if (_walkRegionsId == 0) {
R2_GLOBALS._walkRegions.load(1550);
- _field419 = 1550;
+ _walkRegionsId = 1550;
}
break;
case 1:
// North end of the spaceport
- if (_field419 == 0) {
+ if (_walkRegionsId == 0) {
R2_GLOBALS._walkRegions.load(1560);
- _field419 = 1560;
+ _walkRegionsId = 1560;
}
- _actor14.subA4D14(2, 1);
- _northWall.subA4D14(1, 3);
- _actor16.subA4D14(2, 5);
+ _wallCorner1.setupWall(2, 1);
+ _northWall.setupWall(1, 3);
+ _wallCorner2.setupWall(2, 5);
break;
case 2:
R2_GLOBALS._walkRegions.load(1561);
- _field419 = 1561;
- _actor14.subA4D14(2, 1);
- _westWall.subA4D14(2, 2);
- _northWall.subA4D14(1, 3);
- _actor16.subA4D14(2, 5);
+ _walkRegionsId = 1561;
+ _wallCorner1.setupWall(2, 1);
+ _westWall.setupWall(2, 2);
+ _northWall.setupWall(1, 3);
+ _wallCorner2.setupWall(2, 5);
break;
case 3:
R2_GLOBALS._walkRegions.load(1562);
- _field419 = 1562;
- _actor14.subA4D14(2, 1);
- _northWall.subA4D14(1, 3);
- _actor16.subA4D14(2, 5);
- _eastWall.subA4D14(2, 6);
+ _walkRegionsId = 1562;
+ _wallCorner1.setupWall(2, 1);
+ _northWall.setupWall(1, 3);
+ _wallCorner2.setupWall(2, 5);
+ _eastWall.setupWall(2, 6);
break;
case 4:
R2_GLOBALS._walkRegions.load(1563);
- _field419 = 1563;
- _northWall.subA4D14(2, 3);
+ _walkRegionsId = 1563;
+ _northWall.setupWall(2, 3);
break;
case 5:
R2_GLOBALS._walkRegions.load(1564);
- _field419 = 1564;
- _southWall.subA4D14(2, 4);
+ _walkRegionsId = 1564;
+ _southWall.setupWall(2, 4);
break;
case 6:
R2_GLOBALS._walkRegions.load(1565);
- _field419 = 1565;
- _actor14.subA4D14(1, 1);
- _westWall.subA4D14(1, 2);
- _northWall.subA4D14(3, 3);
+ _walkRegionsId = 1565;
+ _wallCorner1.setupWall(1, 1);
+ _westWall.setupWall(1, 2);
+ _northWall.setupWall(3, 3);
break;
case 7:
R2_GLOBALS._walkRegions.load(1566);
- _field419 = 1566;
- _actor14.subA4D14(1, 1);
- _westWall.subA4D14(1, 2);
- _northWall.subA4D14(2, 4);
+ _walkRegionsId = 1566;
+ _wallCorner1.setupWall(1, 1);
+ _westWall.setupWall(1, 2);
+ _northWall.setupWall(2, 4);
break;
case 8:
R2_GLOBALS._walkRegions.load(1567);
- _field419 = 1567;
- _westWall.subA4D14(5, 2);
+ _walkRegionsId = 1567;
+ _westWall.setupWall(5, 2);
break;
case 9:
R2_GLOBALS._walkRegions.load(1568);
- _field419 = 1568;
- _westWall.subA4D14(4, 2);
+ _walkRegionsId = 1568;
+ _westWall.setupWall(4, 2);
break;
case 10:
R2_GLOBALS._walkRegions.load(1569);
- _field419 = 1569;
- _actor14.subA4D14(3, 1);
+ _walkRegionsId = 1569;
+ _wallCorner1.setupWall(3, 1);
break;
case 11:
R2_GLOBALS._walkRegions.load(1570);
- _field419 = 1570;
- _actor14.subA4D14(1, 1);
- _westWall.subA4D14(1, 2);
+ _walkRegionsId = 1570;
+ _wallCorner1.setupWall(1, 1);
+ _westWall.setupWall(1, 2);
break;
case 12:
R2_GLOBALS._walkRegions.load(1571);
- _field419 = 1571;
- _actor16.subA4D14(1, 5);
- _eastWall.subA4D14(1, 6);
+ _walkRegionsId = 1571;
+ _wallCorner2.setupWall(1, 5);
+ _eastWall.setupWall(1, 6);
break;
case 13:
R2_GLOBALS._walkRegions.load(1572);
- _field419 = 1572;
- _actor14.subA4D14(1, 1);
- _westWall.subA4D14(1, 2);
- _southWall.subA4D14(1, 4);
+ _walkRegionsId = 1572;
+ _wallCorner1.setupWall(1, 1);
+ _westWall.setupWall(1, 2);
+ _southWall.setupWall(1, 4);
break;
case 14:
R2_GLOBALS._walkRegions.load(1573);
- _field419 = 1573;
- _southWall.subA4D14(1, 4);
- _actor16.subA4D14(1, 5);
- _eastWall.subA4D14(1, 6);
+ _walkRegionsId = 1573;
+ _southWall.setupWall(1, 4);
+ _wallCorner2.setupWall(1, 5);
+ _eastWall.setupWall(1, 6);
break;
case 15:
// South wall
R2_GLOBALS._walkRegions.load(1574);
- _field419 = 1574;
- _southWall.subA4D14(1, 4);
+ _walkRegionsId = 1574;
+ _southWall.setupWall(1, 4);
break;
case 16:
R2_GLOBALS._walkRegions.load(1570);
- _field419 = 1570;
- _actor14.subA4D14(2, 1);
- _westWall.subA4D14(2, 2);
+ _walkRegionsId = 1570;
+ _wallCorner1.setupWall(2, 1);
+ _westWall.setupWall(2, 2);
break;
case 17:
R2_GLOBALS._walkRegions.load(1570);
- _field419 = 1570;
- _actor14.subA4D14(2, 1);
- _westWall.subA4D14(3, 2);
+ _walkRegionsId = 1570;
+ _wallCorner1.setupWall(2, 1);
+ _westWall.setupWall(3, 2);
break;
case 18:
R2_GLOBALS._walkRegions.load(1571);
- _field419 = 1571;
- _actor16.subA4D14(2, 5);
- _eastWall.subA4D14(2, 6);
+ _walkRegionsId = 1571;
+ _wallCorner2.setupWall(2, 5);
+ _eastWall.setupWall(2, 6);
break;
case 19:
R2_GLOBALS._walkRegions.load(1571);
- _field419 = 1571;
- _actor16.subA4D14(2, 5);
- _eastWall.subA4D14(3, 6);
+ _walkRegionsId = 1571;
+ _wallCorner2.setupWall(2, 5);
+ _eastWall.setupWall(3, 6);
break;
default:
break;
@@ -9006,14 +8869,14 @@ void Scene1550::enterArea() {
int di = 0;
int tmpIdx = 0;
for (int i = 0; i < 127 * 4; i += 4) {
- if ((R2_GLOBALS._s1550PlayerArea[R2_GLOBALS._player._characterIndex].x == R2_GLOBALS._scene1550JunkLocations[i]) &&
- (R2_GLOBALS._s1550PlayerArea[R2_GLOBALS._player._characterIndex].y == R2_GLOBALS._scene1550JunkLocations[i + 1]) &&
+ if ((R2_GLOBALS._s1550PlayerArea[R2_GLOBALS._player._characterIndex].x == R2_GLOBALS._scene1550JunkLocations[i]) &&
+ (R2_GLOBALS._s1550PlayerArea[R2_GLOBALS._player._characterIndex].y == R2_GLOBALS._scene1550JunkLocations[i + 1]) &&
(R2_GLOBALS._scene1550JunkLocations[i + 2] != 0)) {
tmpIdx = R2_GLOBALS._scene1550JunkLocations[i + 3];
_junk[di].postInit();
- _junk[di]._effect = 6;
+ _junk[di]._effect = EFFECT_SHADED2;
_junk[di]._shade = 0;
- _junk[di]._fieldA4 = tmpIdx;
+ //_junk[di]._junkState = tmpIdx;
_junk[di]._junkNumber = i;
_junk[di].setDetails(1550, 62, -1, 63, 2, (SceneItem *) NULL);
if (R2_GLOBALS._scene1550JunkLocations[i + 2] == 41) {
@@ -9027,11 +8890,11 @@ void Scene1550::enterArea() {
R2_GLOBALS._walkRegions.disableRegion(scene1550JunkRegions[7]);
if (R2_INVENTORY.getObjectScene(R2_JOYSTICK) == 1550) {
- _actor9.postInit();
- _actor9.setup(1562, 3, 1);
- _actor9.setPosition(Common::Point(150, 70));
- _actor9.fixPriority(10);
- _actor9.setDetails(1550, 41, -1, 42, 2, (SceneItem *) NULL);
+ _joystick.postInit();
+ _joystick.setup(1562, 3, 1);
+ _joystick.setPosition(Common::Point(150, 70));
+ _joystick.fixPriority(10);
+ _joystick.setDetails(1550, 41, -1, 42, 2, (SceneItem *) NULL);
}
} else {
if (R2_GLOBALS._scene1550JunkLocations[i + 2] > 40) {
@@ -9041,7 +8904,7 @@ void Scene1550::enterArea() {
_junk[di].changeZoom(-1);
_junk[di].setup(1552, ((R2_GLOBALS._scene1550JunkLocations[i + 2] - 1) / 5) + 1, ((R2_GLOBALS._scene1550JunkLocations[i + 2] - 1) % 5) + 1);
}
- _junk[di].setPosition(Common::Point(k5A72E[tmpIdx], k5A73F[tmpIdx]));
+ _junk[di].setPosition(Common::Point(scene1550JunkX[tmpIdx], scene1550JunkY[tmpIdx]));
if (scene1550JunkRegions[tmpIdx] != 0)
R2_GLOBALS._walkRegions.disableRegion(scene1550JunkRegions[tmpIdx]);
di++;
@@ -9049,195 +8912,195 @@ void Scene1550::enterArea() {
}
}
- for (int i = 0; i < 15 * 3; i++) {
- if ((R2_GLOBALS._s1550PlayerArea[R2_GLOBALS._player._characterIndex].x == k5A79B[i])
- && (R2_GLOBALS._s1550PlayerArea[R2_GLOBALS._player._characterIndex].y == k5A79B[i + 1])) {
- tmpIdx = k5A79B[i + 2];
- switch (tmpIdx - 1) {
- case 0:
+ // Loop for detecting and setting up certain special areas within the map
+ for (int i = 0; i < 15 * 3; i += 3) {
+ if ((R2_GLOBALS._s1550PlayerArea[R2_GLOBALS._player._characterIndex].x == scene1550SpecialAreas[i])
+ && (R2_GLOBALS._s1550PlayerArea[R2_GLOBALS._player._characterIndex].y == scene1550SpecialAreas[i + 1])) {
+ int areaType = scene1550SpecialAreas[i + 2];
+ switch (areaType) {
+ case 1:
if (!R2_GLOBALS.getFlag(16)) {
- _landingStrut.postInit();
+ _wreckage2.postInit();
if (R2_GLOBALS._s1550PlayerArea[R2_GLOBALS._player._characterIndex].y == 3)
- _landingStrut.setup(1555, 2, 1);
+ _wreckage2.setup(1555, 2, 1);
else
- _landingStrut.setup(1555, 1, 1);
- _landingStrut.setPosition(Common::Point(150, 100));
- _landingStrut.fixPriority(92);
- _landingStrut.setDetails(1550, 73, -1, -1, 2, (SceneItem *) NULL);
+ _wreckage2.setup(1555, 1, 1);
+ _wreckage2.setPosition(Common::Point(150, 100));
+ _wreckage2.fixPriority(92);
+ _wreckage2.setDetails(1550, 73, -1, -1, 2, (SceneItem *) NULL);
}
break;
- case 1:
- _actor13.postInit();
- warning("_actor13._actorName = \"dish\";");
+ case 2:
+ _dish.postInit();
if (R2_GLOBALS.getFlag(19))
- _actor13.setup(1556, 3, 5);
+ _dish.setup(1556, 3, 5);
else
- _actor13.setup(1556, 3, 1);
- _actor13.changeZoom(95);
- _actor13.setPosition(Common::Point(165, 83));
- _actor13.fixPriority(168);
- _actor13.setDetails(1550, 17, -1, 19, 2, (SceneItem *) NULL);
-
- _actor12.postInit();
- _actor12.setup(1556, 4, 1);
- _actor12.setPosition(Common::Point(191, 123));
- _actor12.changeZoom(95);
- _actor12.setDetails(1550, 65, -1, 66, 2, (SceneItem *) NULL);
-
- _actor5.postInit();
- _actor5._numFrames = 5;
+ _dish.setup(1556, 3, 1);
+ _dish.changeZoom(95);
+ _dish.setPosition(Common::Point(165, 83));
+ _dish.fixPriority(168);
+ _dish.setDetails(1550, 17, -1, 19, 2, (SceneItem *) NULL);
+
+ _dishTower.postInit();
+ _dishTower.setup(1556, 4, 1);
+ _dishTower.setPosition(Common::Point(191, 123));
+ _dishTower.changeZoom(95);
+ _dishTower.setDetails(1550, 65, -1, 66, 2, (SceneItem *) NULL);
+
+ _dishTowerShadow.postInit();
+ _dishTowerShadow._numFrames = 5;
if (R2_GLOBALS.getFlag(19))
- _actor5.setup(1556, 8, 5);
+ _dishTowerShadow.setup(1556, 8, 5);
else
- _actor5.setup(1556, 8, 1);
+ _dishTowerShadow.setup(1556, 8, 1);
- _actor5.setPosition(Common::Point(156, 151));
- _actor5.fixPriority(10);
+ _dishTowerShadow.setPosition(Common::Point(156, 151));
+ _dishTowerShadow.fixPriority(10);
- _actor4.postInit();
+ _walkway.postInit();
if (R2_GLOBALS.getFlag(20))
- _actor4.setup(1558, 3, 10);
+ _walkway.setup(1558, 3, 10);
else
- _actor4.setup(1558, 3, 1);
+ _walkway.setup(1558, 3, 1);
- _actor4.setPosition(Common::Point(172, 48));
- _actor4.fixPriority(169);
+ _walkway.setPosition(Common::Point(172, 48));
+ _walkway.fixPriority(169);
R2_GLOBALS._walkRegions.disableRegion(scene1550JunkRegions[15]);
break;
- case 2:
+ case 3:
_wreckage.postInit();
_wreckage.setup(1550, 1, 1);
_wreckage.setPosition(Common::Point(259, 55));
_wreckage.fixPriority(133);
_wreckage.setDetails(1550, 9, -1, -1, 2, (SceneItem *) NULL);
- _landingStrut.postInit();
- _landingStrut.setup(1550, 1, 2);
- _landingStrut.setPosition(Common::Point(259, 133));
- _landingStrut.fixPriority(105);
- _landingStrut.setDetails(1550, 9, -1, -1, 2, (SceneItem *) NULL);
+ _wreckage2.postInit();
+ _wreckage2.setup(1550, 1, 2);
+ _wreckage2.setPosition(Common::Point(259, 133));
+ _wreckage2.fixPriority(105);
+ _wreckage2.setDetails(1550, 9, -1, -1, 2, (SceneItem *) NULL);
if (R2_INVENTORY.getObjectScene(R2_GYROSCOPE) == 1550) {
- _actor10.postInit();
- _actor10.setup(1550, 7, 2);
- _actor10.setPosition(Common::Point(227, 30));
- _actor10.fixPriority(130);
- _actor10.setDetails(1550, 29, -1, 63, 2, (SceneItem *) NULL);
+ _gyroscope.postInit();
+ _gyroscope.setup(1550, 7, 2);
+ _gyroscope.setPosition(Common::Point(227, 30));
+ _gyroscope.fixPriority(130);
+ _gyroscope.setDetails(1550, 29, -1, 63, 2, (SceneItem *) NULL);
}
break;
- case 3:
+ case 4:
_wreckage.postInit();
_wreckage.setup(1550, 1, 4);
_wreckage.setPosition(Common::Point(76, 131));
_wreckage.fixPriority(10);
_wreckage.setDetails(1550, 9, -1, -1, 2, (SceneItem *) NULL);
- _landingStrut.postInit();
- _landingStrut.setup(1550, 1, 3);
- _landingStrut.setPosition(Common::Point(76, 64));
- _landingStrut.setDetails(1550, 9, -1, -1, 2, (SceneItem *) NULL);
+ _wreckage2.postInit();
+ _wreckage2.setup(1550, 1, 3);
+ _wreckage2.setPosition(Common::Point(76, 64));
+ _wreckage2.setDetails(1550, 9, -1, -1, 2, (SceneItem *) NULL);
if (R2_INVENTORY.getObjectScene(R2_DIAGNOSTICS_DISPLAY) == 1550) {
- _actor11.postInit();
- _actor11.setup(1504, 4, 1);
- _actor11.setPosition(Common::Point(49, 35));
- _actor11.animate(ANIM_MODE_2, NULL);
- _actor11._numFrames = 4;
- _actor11.fixPriority(65);
- _actor11.setDetails(1550, 14, 15, 63, 2, (SceneItem *) NULL);
+ _diagnosticsDisplay.postInit();
+ _diagnosticsDisplay.setup(1504, 4, 1);
+ _diagnosticsDisplay.setPosition(Common::Point(49, 35));
+ _diagnosticsDisplay.animate(ANIM_MODE_2, NULL);
+ _diagnosticsDisplay._numFrames = 4;
+ _diagnosticsDisplay.fixPriority(65);
+ _diagnosticsDisplay.setDetails(1550, 14, 15, 63, 2, (SceneItem *) NULL);
}
if (R2_INVENTORY.getObjectScene(R2_AIRBAG) == 1550) {
- _actor8.postInit();
- _actor8.setup(1550, 7, 1);
- _actor8.setPosition(Common::Point(45, 44));
- _actor8.fixPriority(150);
- _actor8.setDetails(1550, 44, -1, 63, 2, (SceneItem *) NULL);
+ _airbag.postInit();
+ _airbag.setup(1550, 7, 1);
+ _airbag.setPosition(Common::Point(45, 44));
+ _airbag.fixPriority(150);
+ _airbag.setDetails(1550, 44, -1, 63, 2, (SceneItem *) NULL);
}
break;
- case 4:
+ case 5:
_wreckage.postInit();
_wreckage.setup(1550, 2, 4);
_wreckage.setPosition(Common::Point(243, 131));
_wreckage.fixPriority(10);
_wreckage.setDetails(1550, 9, -1, -1, 2, (SceneItem *) NULL);
- _landingStrut.postInit();
- _landingStrut.setup(1550, 2, 3);
- _landingStrut.setPosition(Common::Point(243, 64));
- _landingStrut.setDetails(1550, 9, -1, -1, 2, (SceneItem *) NULL);
+ _wreckage2.postInit();
+ _wreckage2.setup(1550, 2, 3);
+ _wreckage2.setPosition(Common::Point(243, 64));
+ _wreckage2.setDetails(1550, 9, -1, -1, 2, (SceneItem *) NULL);
break;
- case 5:
+ case 6:
_wreckage.postInit();
_wreckage.setup(1550, 2, 1);
_wreckage.setPosition(Common::Point(60, 55));
_wreckage.fixPriority(133);
_wreckage.setDetails(1550, 9, -1, -1, 2, (SceneItem *) NULL);
- _landingStrut.postInit();
- _landingStrut.setup(1550, 2, 2);
- _landingStrut.setPosition(Common::Point(60, 133));
- _landingStrut.fixPriority(106);
- _landingStrut.setDetails(1550, 9, -1, -1, 2, (SceneItem *) NULL);
+ _wreckage2.postInit();
+ _wreckage2.setup(1550, 2, 2);
+ _wreckage2.setPosition(Common::Point(60, 133));
+ _wreckage2.fixPriority(106);
+ _wreckage2.setDetails(1550, 9, -1, -1, 2, (SceneItem *) NULL);
break;
- case 6:
+ case 7:
_wreckage.postInit();
_wreckage.setup(1550, 3, 1);
_wreckage.setPosition(Common::Point(281, 132));
_wreckage.setDetails(1550, 56, -1, -1, 2, (SceneItem *) NULL);
break;
- case 7:
+ case 8:
_wreckage.postInit();
_wreckage.setup(1550, 3, 2);
_wreckage.setPosition(Common::Point(57, 96));
_wreckage.fixPriority(70);
_wreckage.setDetails(1550, 56, -1, -1, 2, (SceneItem *) NULL);
- _landingStrut.postInit();
- _landingStrut.setup(1550, 3, 3);
- _landingStrut.setPosition(Common::Point(145, 88));
- _landingStrut.fixPriority(55);
- _landingStrut.setDetails(1550, 56, -1, -1, 2, (SceneItem *) NULL);
-
- _actor2.postInit();
- _actor2.setup(1550, 3, 4);
- _actor2.setPosition(Common::Point(64, 137));
- _actor2.fixPriority(115);
- _actor2.setDetails(1550, 56, -1, -1, 2, (SceneItem *) NULL);
-
- _actor3.postInit();
- _actor3.setup(1550, 5, 1);
- _actor3.setPosition(Common::Point(60, 90));
- _actor3.fixPriority(45);
+ _wreckage2.postInit();
+ _wreckage2.setup(1550, 3, 3);
+ _wreckage2.setPosition(Common::Point(145, 88));
+ _wreckage2.fixPriority(55);
+ _wreckage2.setDetails(1550, 56, -1, -1, 2, (SceneItem *) NULL);
+
+ _wreckage3.postInit();
+ _wreckage3.setup(1550, 3, 4);
+ _wreckage3.setPosition(Common::Point(64, 137));
+ _wreckage3.fixPriority(115);
+ _wreckage3.setDetails(1550, 56, -1, -1, 2, (SceneItem *) NULL);
+
+ _wreckage4.postInit();
+ _wreckage4.setup(1550, 5, 1);
+ _wreckage4.setPosition(Common::Point(60, 90));
+ _wreckage4.fixPriority(45);
break;
- case 8:
+ case 9:
_wreckage.postInit();
_wreckage.setup(1550, 4, 2);
_wreckage.setPosition(Common::Point(262, 96));
_wreckage.fixPriority(70);
_wreckage.setDetails(1550, 56, -1, -1, 2, (SceneItem *) NULL);
- _landingStrut.postInit();
- _landingStrut.setup(1550, 4, 3);
- _landingStrut.setPosition(Common::Point(174, 88));
- _landingStrut.fixPriority(55);
- _landingStrut.setDetails(1550, 56, -1, -1, 2, (SceneItem *) NULL);
-
- _actor2.postInit();
- _actor2.setup(1550, 4, 4);
- _actor2.setPosition(Common::Point(255, 137));
- _actor2.fixPriority(115);
- _actor2.setDetails(1550, 56, -1, -1, 2, (SceneItem *) NULL);
-
- _actor3.postInit();
- _actor3.setup(1550, 6, 1);
- _actor3.setPosition(Common::Point(259, 90));
- _actor3.fixPriority(45);
+ _wreckage2.postInit();
+ _wreckage2.setup(1550, 4, 3);
+ _wreckage2.setPosition(Common::Point(174, 88));
+ _wreckage2.fixPriority(55);
+ _wreckage2.setDetails(1550, 56, -1, -1, 2, (SceneItem *) NULL);
+
+ _wreckage3.postInit();
+ _wreckage3.setup(1550, 4, 4);
+ _wreckage3.setPosition(Common::Point(255, 137));
+ _wreckage3.fixPriority(115);
+ _wreckage3.setDetails(1550, 56, -1, -1, 2, (SceneItem *) NULL);
+
+ _wreckage4.postInit();
+ _wreckage4.setup(1550, 6, 1);
+ _wreckage4.setPosition(Common::Point(259, 90));
+ _wreckage4.fixPriority(45);
break;
- case 9:
+ case 10:
_wreckage.postInit();
_wreckage.setup(1550, 4, 1);
_wreckage.setPosition(Common::Point(38, 132));
_wreckage.setDetails(1550, 56, -1, -1, 2, (SceneItem *) NULL);
break;
- case 11:
+ case 12:
// Intact ship
_shipComponents[7].setupShipComponent(8);
_shipComponents[0].setupShipComponent(1);
@@ -9247,6 +9110,7 @@ void Scene1550::enterArea() {
_shipComponents[4].setupShipComponent(5);
_shipComponents[5].setupShipComponent(6);
_shipComponents[6].setupShipComponent(7);
+ break;
default:
break;
}
@@ -9255,12 +9119,12 @@ void Scene1550::enterArea() {
if (R2_GLOBALS._s1550PlayerArea[R2_QUINN] == R2_GLOBALS._s1550PlayerArea[R2_SEEKER]) {
_companion.postInit();
- _companion._effect = 7;
+ _companion._effect = EFFECT_SHADED2;
_companion.changeZoom(-1);
- assert((_field419 >= 1550) && (_field419 <= 2008));
- R2_GLOBALS._walkRegions.disableRegion(k5A750[_field419 - 1550]);
- _companion.setPosition(Common::Point(k5A72E[k5A76D[_field419 - 1550]], k5A73F[k5A76D[_field419 - 1550]] + 8));
+ assert((_walkRegionsId >= 1550) && (_walkRegionsId <= 2008));
+ R2_GLOBALS._walkRegions.disableRegion(k5A750[_walkRegionsId - 1550]);
+ _companion.setPosition(Common::Point(scene1550JunkX[k5A76D[_walkRegionsId - 1550]], scene1550JunkY[k5A76D[_walkRegionsId - 1550]] + 8));
if (R2_GLOBALS._player._characterIndex == R2_QUINN) {
if (R2_GLOBALS._player._characterScene[R2_SEEKER] == 1580) {
_companion.setup(1516, 3, 17);
@@ -9289,178 +9153,206 @@ void Scene1550::enterArea() {
}
/*--------------------------------------------------------------------------
- * Scene 1575 -
+ * Scene 1575 - Spaceport - unused ship scene
*
*--------------------------------------------------------------------------*/
-Scene1575::Scene1575() {
- _field412 = 0;
- _field414 = 0;
- _field416 = 0;
- _field418 = 0;
- _field41A = 0;
+Scene1575::Button::Button() {
+ _buttonId = 0;
+ _pressed = false;
}
-void Scene1575::synchronize(Serializer &s) {
- SceneExt::synchronize(s);
+void Scene1575::Button::synchronize(Serializer &s) {
+ NamedHotspot::synchronize(s);
- s.syncAsSint16LE(_field412);
- s.syncAsSint16LE(_field414);
- s.syncAsSint16LE(_field416);
- s.syncAsSint16LE(_field418);
- s.syncAsSint16LE(_field41A);
+ s.syncAsSint16LE(_buttonId);
+ s.syncAsSint16LE(_pressed);
}
-Scene1575::Hotspot1::Hotspot1() {
- _field34 = 0;
- _field36 = 0;
-}
+void Scene1575::Button::process(Event &event) {
+ Scene1575 *scene = (Scene1575 *)R2_GLOBALS._sceneManager._scene;
+ bool isInBounds = _bounds.contains(event.mousePos);
+ CursorType cursor = R2_GLOBALS._events.getCursor();
-void Scene1575::Hotspot1::synchronize(Serializer &s) {
- NamedHotspot::synchronize(s);
+ if ((event.eventType == EVENT_BUTTON_DOWN && cursor == CURSOR_USE && isInBounds) ||
+ (_pressed && _buttonId != 1 && event.eventType == EVENT_BUTTON_UP && isInBounds)) {
+ // Button pressed
+ _pressed = true;
+ Common::Point pos = scene->_actor1._position;
+ event.handled = true;
- s.syncAsSint16LE(_field34);
- s.syncAsSint16LE(_field36);
-}
+ if (!R2_GLOBALS.getFlag(18) || _buttonId <= 1 || _buttonId >= 6) {
+ switch (_buttonId) {
+ case 1:
+ if (R2_GLOBALS.getFlag(18)) {
+ scene->_actor14.hide();
+ scene->_actor15.hide();
+ R2_GLOBALS.clearFlag(18);
+ } else if ((scene->_actor12._position.x == 85) && (scene->_actor12._position.y == 123)) {
+ scene->_actor14.show();
+ scene->_actor15.show();
+ R2_GLOBALS.setFlag(18);
+ } else {
+ SceneItem::display("That's probably not a good thing, ya know!");
+ }
+ break;
+ case 2:
+ if (scene->_field41A < 780) {
+ if (pos.x > 54)
+ pos.x -= 65;
+ pos.x += 2;
+ scene->_field41A += 2;
+
+ for (int i = 0; i < 17; i++)
+ scene->_arrActor[i].setPosition(Common::Point(scene->_arrActor[i]._position.x + 2, scene->_arrActor[i]._position.y));
+
+ scene->_actor13.setPosition(Common::Point(scene->_actor13._position.x + 2, scene->_actor13._position.y));
+ scene->_actor12.setPosition(Common::Point(scene->_actor12._position.x + 2, scene->_actor12._position.y));
+ scene->_actor1.setPosition(Common::Point(pos.x, pos.y));
+ scene->_actor2.setPosition(Common::Point(pos.x + 65, pos.y));
+ scene->_actor3.setPosition(Common::Point(pos.x + 130, pos.y));
+ }
+ break;
+ case 3:
+ if (scene->_field41A > 0) {
+ if (pos.x < -8)
+ pos.x += 65;
+
+ pos.x -= 2;
+ scene->_field41A -= 2;
+ for (int i = 0; i < 17; i++)
+ scene->_arrActor[i].setPosition(Common::Point(scene->_arrActor[i]._position.x - 2, scene->_arrActor[i]._position.y));
+
+ scene->_actor13.setPosition(Common::Point(scene->_actor13._position.x - 2, scene->_actor13._position.y));
+ scene->_actor12.setPosition(Common::Point(scene->_actor12._position.x - 2, scene->_actor12._position.y));
+ scene->_actor1.setPosition(Common::Point(pos.x, pos.y));
+ scene->_actor2.setPosition(Common::Point(pos.x + 65, pos.y));
+ scene->_actor3.setPosition(Common::Point(pos.x + 130, pos.y));
+ }
+ break;
+ case 4: {
+ if (pos.y < 176) {
+ ++pos.y;
+ for (int i = 0; i < 17; ++i)
+ scene->_arrActor[i].setPosition(Common::Point(scene->_arrActor[i]._position.x, scene->_arrActor[i]._position.y + 1));
+
+ scene->_actor13.setPosition(Common::Point(scene->_actor13._position.x, scene->_actor13._position.y + 1));
+ scene->_actor12.setPosition(Common::Point(scene->_actor12._position.x, scene->_actor12._position.y + 1));
+ scene->_actor1.setPosition(Common::Point(pos.x, pos.y));
+ scene->_actor2.setPosition(Common::Point(pos.x + 65, pos.y));
+ scene->_actor3.setPosition(Common::Point(pos.x + 130, pos.y));
+ }
+ }
+ break;
+ case 5: {
+ if (pos.y > 145) {
+ --pos.y;
+ for (int i = 0; i < 17; ++i)
+ scene->_arrActor[i].setPosition(Common::Point(scene->_arrActor[i]._position.x, scene->_arrActor[i]._position.y - 1));
+
+ scene->_actor13.setPosition(Common::Point(scene->_actor13._position.x, scene->_actor13._position.y - 1));
+ scene->_actor12.setPosition(Common::Point(scene->_actor12._position.x, scene->_actor12._position.y - 1));
+ scene->_actor1.setPosition(Common::Point(pos.x, pos.y));
+ scene->_actor2.setPosition(Common::Point(pos.x + 65, pos.y));
+ scene->_actor3.setPosition(Common::Point(pos.x + 130, pos.y));
+ }
+ }
+ break;
+ case 6:
+ R2_GLOBALS._sceneManager.changeScene(1550);
+ break;
+ default:
+ break;
+ }
-void Scene1575::Hotspot1::process(Event &event) {
- if ((event.eventType != EVENT_BUTTON_DOWN) || (R2_GLOBALS._events.getCursor() != R2_STEPPING_DISKS) || (!_bounds.contains(event.mousePos))) {
- if (_field36 == 0)
- return;
- if ((_field34 == 1) || (event.eventType == EVENT_BUTTON_UP) || (!_bounds.contains(event.mousePos))) {
- _field36 = 0;
- return;
- }
- }
- _field36 = 1;
- Scene1575 *scene = (Scene1575 *)R2_GLOBALS._sceneManager._scene;
+ int j = 0;
+ for (int i = 0; i < 17; i++) {
+ if (scene->_arrActor[i]._bounds.contains(85, 116))
+ j = i;
+ }
- event.handled = true;
- if (R2_GLOBALS.getFlag(18) && (_field34 > 1) && (_field34 < 6)) {
- warning("sub1A03B(\"Better not move the laser while it\'s firing!\", 0, 280, 1, 160, 9, 1, 2, 20, 7, 7, -999);");
- return;
- }
- int di = scene->_actor1._position.x;
+ if (scene->_actor13._bounds.contains(85, 116))
+ j = 18;
- switch (_field34 - 1) {
- case 0:
- if (R2_GLOBALS.getFlag(18)) {
- scene->_actor14.hide();
- scene->_actor15.hide();
- R2_GLOBALS.clearFlag(18);
- } else if ((scene->_actor12._position.x == 85) && (scene->_actor12._position.y == 123)) {
- scene->_actor14.show();
- scene->_actor15.show();
- R2_GLOBALS.setFlag(18);
+ if (scene->_actor12._bounds.contains(85, 116))
+ j = 19;
+
+ if (j)
+ scene->_actor11.show();
+ else
+ scene->_actor11.hide();
} else {
- warning("sub1A03B(\"That\'s probably not a good thing, ya know!\", 0, 280, 1, 160, 9, 1, 2, 20, 7, 7, -999);");
+ SceneItem::display("Better not move the laser while it's firing!");
}
- break;
- case 1:
- if (scene->_field41A < 780) {
- if (di > 54)
- di -= 65;
- di += 2;
- scene->_field41A += 2;
+ } else {
+ _pressed = false;
+ }
+}
- for (int i = 0; i < 17; i++)
- scene->_arrActor[i].setPosition(Common::Point(scene->_arrActor[i]._position.x + 2, scene->_arrActor[i]._position.y));
+bool Scene1575::Button::startAction(CursorType action, Event &event) {
+ if (action == CURSOR_USE)
+ return false;
+ return SceneHotspot::startAction(action, event);
+}
- scene->_actor13.setPosition(Common::Point(scene->_actor13._position.x + 2, scene->_actor13._position.y));
- scene->_actor12.setPosition(Common::Point(scene->_actor12._position.x + 2, scene->_actor12._position.y));
- scene->_actor1.setPosition(Common::Point(di, scene->_actor1._position.y));
- scene->_actor2.setPosition(Common::Point(di + 65, scene->_actor1._position.y));
- scene->_actor3.setPosition(Common::Point(di + 130, scene->_actor1._position.y));
- }
+void Scene1575::Button::initButton(int buttonId) {
+ _buttonId = buttonId;
+ _pressed = false;
+ EventHandler::postInit();
+
+ switch (_buttonId) {
+ case 1:
+ setDetails(Rect(53, 165, 117, 190), -1, -1, -1, 2, 1, NULL);
break;
case 2:
- if (scene->_field41A > 0) {
- if (di < -8)
- di += 65;
-
- di -= 2;
- scene->_field41A -= 2;
- for (int i = 0; i < 17; i++)
- scene->_arrActor[i].setPosition(Common::Point(scene->_arrActor[i]._position.x - 2, scene->_arrActor[i]._position.y));
-
- scene->_actor13.setPosition(Common::Point(scene->_actor13._position.x - 2, scene->_actor13._position.y));
- scene->_actor12.setPosition(Common::Point(scene->_actor12._position.x - 2, scene->_actor12._position.y));
- scene->_actor1.setPosition(Common::Point(di, scene->_actor1._position.y));
- scene->_actor2.setPosition(Common::Point(di + 65, scene->_actor1._position.y));
- scene->_actor3.setPosition(Common::Point(di + 130, scene->_actor1._position.y));
- }
+ setDetails(Rect(151, 142, 189, 161), -1, -1, -1, 2, 1, NULL);
break;
- case 3: {
- int tmpPosY = scene->_actor1._position.y;
- if (tmpPosY < 176) {
- ++tmpPosY;
- for (int i = 0; i < 17; ++i)
- scene->_arrActor[i].setPosition(Common::Point(scene->_arrActor[i]._position.x, scene->_arrActor[i]._position.y + 1));
-
- scene->_actor13.setPosition(Common::Point(scene->_actor13._position.x, scene->_actor13._position.y + 1));
- scene->_actor12.setPosition(Common::Point(scene->_actor12._position.x, scene->_actor12._position.y + 1));
- scene->_actor1.setPosition(Common::Point(di, scene->_actor1._position.y));
- scene->_actor2.setPosition(Common::Point(di + 65, scene->_actor1._position.y));
- scene->_actor3.setPosition(Common::Point(di + 130, scene->_actor1._position.y));
- }
- }
+ case 3:
+ setDetails(Rect(225, 142, 263, 161), -1, -1, -1, 2, 1, NULL);
break;
- case 4: {
- int tmpPosY = scene->_actor1._position.y;
- if (tmpPosY > 145) {
- tmpPosY--;
- for (int i = 0; i < 17; ++i)
- scene->_arrActor[i].setPosition(Common::Point(scene->_arrActor[i]._position.x, scene->_arrActor[i]._position.y - 1));
-
- scene->_actor13.setPosition(Common::Point(scene->_actor13._position.x, scene->_actor13._position.y - 1));
- scene->_actor12.setPosition(Common::Point(scene->_actor12._position.x, scene->_actor12._position.y - 1));
- scene->_actor1.setPosition(Common::Point(di, scene->_actor1._position.y));
- scene->_actor2.setPosition(Common::Point(di + 65, scene->_actor1._position.y));
- scene->_actor3.setPosition(Common::Point(di + 130, scene->_actor1._position.y));
- }
- }
+ case 4:
+ setDetails(Rect(188, 122, 226, 140), -1, -1, -1, 2, 1, NULL);
break;
case 5:
- R2_GLOBALS._sceneManager.changeScene(1550);
+ setDetails(Rect(188, 162, 226, 180), -1, -1, -1, 2, 1, NULL);
+ break;
+ case 6:
+ setDetails(Rect(269, 169, 301, 185), -1, -1, -1, 2, 1, NULL);
break;
default:
break;
}
+}
- int j = 0;
- for (int i = 0; i < 17; i++) {
- if (scene->_arrActor[i]._bounds.contains(85, 116))
- j = i;
- }
-
- if (scene->_actor13._bounds.contains(85, 116))
- j = 18;
-
- if (scene->_actor12._bounds.contains(85, 116))
- j = 19;
+/*--------------------------------------------------------------------------*/
- if (j)
- scene->_actor11.show();
- else
- scene->_actor11.hide();
+Scene1575::Scene1575() {
+ _field412 = 0;
+ _field414 = 390;
+ _field416 = 0;
+ _field418 = 0;
+ _field41A = 0;
}
-bool Scene1575::Hotspot1::startAction(CursorType action, Event &event) {
- if (action == CURSOR_USE)
- return false;
- return SceneHotspot::startAction(action, event);
+void Scene1575::synchronize(Serializer &s) {
+ SceneExt::synchronize(s);
+
+ s.syncAsSint16LE(_field412);
+ s.syncAsSint16LE(_field414);
+ s.syncAsSint16LE(_field416);
+ s.syncAsSint16LE(_field418);
+ s.syncAsSint16LE(_field41A);
}
-void Scene1575::Hotspot1::subA910D(int indx) {
- warning("STUB: Scene1575:Hotspot1::subA910D(%d)", indx);
+double hypotenuse(double v1, double v2) {
+ return sqrt(v1 * v1 + v2 * v2);
}
void Scene1575::postInit(SceneObjectList *OwnerList) {
loadScene(1575);
R2_GLOBALS._uiElements._active = false;
- R2_GLOBALS._v5589E = Rect(0, 0, 320, 200);
SceneExt::postInit();
- _field414 = 390;
+ R2_GLOBALS._interfaceY = SCREEN_HEIGHT;
_actor1.postInit();
_actor1.setup(1575, 1, 1);
@@ -9479,8 +9371,17 @@ void Scene1575::postInit(SceneObjectList *OwnerList) {
for (int i = 0; i < 17; i++) {
_arrActor[i].postInit();
- _arrActor[i].setup(1575, 2, k5A7F6[(3 * i) + 2]);
- warning("TODO: immense pile of floating operations");
+ _arrActor[i].setup(1575, 2, k5A7F6[3 * i + 2]);
+
+ double v1 = hypotenuse(2.0, 3 - k5A7F6[3 * i]);
+ v1 += hypotenuse(2.0, 3 - k5A7F6[3 * i + 1]);
+ int yp = (int)(sqrt(v1) * 75.0 / 17.0 - 161.0);
+
+ int angle = R2_GLOBALS._gfxManagerInstance.getAngle(
+ Common::Point(3, 16), Common::Point(k5A7F6[3 * i], k5A7F6[3 * i + 1]));
+ int xp = angle * 78 / 9 - 319;
+
+ _arrActor[i].setPosition(Common::Point(xp, yp));
_arrActor[i].fixPriority(6);
}
@@ -9512,12 +9413,13 @@ void Scene1575::postInit(SceneObjectList *OwnerList) {
_actor10.setup(1575, 3, 2);
_actor10.setPosition(Common::Point(287, 91));
- _item1.subA910D(1);
- _item1.subA910D(2);
- _item1.subA910D(3);
- _item1.subA910D(4);
- _item1.subA910D(5);
- _item1.subA910D(6);
+ // Initialize buttons
+ _button1.initButton(1);
+ _button2.initButton(2);
+ _button3.initButton(3);
+ _button4.initButton(4);
+ _button5.initButton(5);
+ _button6.initButton(6);
_actor11.postInit();
_actor11.setup(1575, 4, 2);
@@ -9545,6 +9447,7 @@ void Scene1575::postInit(SceneObjectList *OwnerList) {
_actor13.postInit();
_actor13.setup(1575, 2, 4);
+ // TODO
warning("TODO: another immense pile of floating operations");
_actor12.postInit();
@@ -9570,8 +9473,6 @@ void Scene1575::postInit(SceneObjectList *OwnerList) {
void Scene1575::remove() {
SceneExt::remove();
- R2_GLOBALS._v5589E.top = 3;
- R2_GLOBALS._v5589E.bottom = 168;
R2_GLOBALS._uiElements._active = true;
}
@@ -9583,7 +9484,6 @@ void Scene1575::process(Event &event) {
Scene::process(event);
g_globals->_sceneObjects->recurse(SceneHandler::dispatchObject);
- warning("TODO: check Scene1575::process");
}
void Scene1575::dispatch() {
@@ -9675,25 +9575,22 @@ void Scene1575::dispatch() {
*--------------------------------------------------------------------------*/
Scene1580::Scene1580() {
- _field412 = 0;
}
void Scene1580::synchronize(Serializer &s) {
SceneExt::synchronize(s);
-
- s.syncAsSint16LE(_field412);
}
-bool Scene1580::Hotspot1::startAction(CursorType action, Event &event) {
- Scene1580 *scene = (Scene1580 *)R2_GLOBALS._sceneManager._scene;
-
+bool Scene1580::JoystickPlug::startAction(CursorType action, Event &event) {
if (action == R2_JOYSTICK) {
+ Scene1580 *scene = (Scene1580 *)R2_GLOBALS._sceneManager._scene;
+
R2_INVENTORY.setObjectScene(R2_JOYSTICK, 1580);
- R2_GLOBALS._sceneItems.remove(&scene->_item1);
- scene->_actor2.postInit();
- scene->_actor2.setup(1580, 1, 4);
- scene->_actor2.setPosition(Common::Point(159, 163));
- scene->_actor2.setDetails(1550, 78, -1, -1, 2, (SceneItem *) NULL);
+ R2_GLOBALS._sceneItems.remove(&scene->_joystickPlug);
+ scene->_joystick.postInit();
+ scene->_joystick.setup(1580, 1, 4);
+ scene->_joystick.setPosition(Common::Point(159, 163));
+ scene->_joystick.setDetails(1550, 78, -1, -1, 2, (SceneItem *) NULL);
scene->_arrActor[5].remove();
@@ -9703,29 +9600,29 @@ bool Scene1580::Hotspot1::startAction(CursorType action, Event &event) {
return SceneHotspot::startAction(action, event);
}
-bool Scene1580::Hotspot2::startAction(CursorType action, Event &event) {
- Scene1580 *scene = (Scene1580 *)R2_GLOBALS._sceneManager._scene;
-
+bool Scene1580::ScreenSlot::startAction(CursorType action, Event &event) {
if (action == R2_DIAGNOSTICS_DISPLAY) {
+ Scene1580 *scene = (Scene1580 *)R2_GLOBALS._sceneManager._scene;
+
R2_INVENTORY.setObjectScene(R2_DIAGNOSTICS_DISPLAY, 1580);
R2_GLOBALS._player.disableControl();
- R2_GLOBALS._sceneItems.remove(&scene->_item2);
+ R2_GLOBALS._sceneItems.remove(&scene->_screenSlot);
- scene->_actor3.postInit();
- scene->_actor3.setup(1580, 1, 1);
- scene->_actor3.setPosition(Common::Point(124, 108));
- scene->_actor3.fixPriority(10);
+ scene->_screen.postInit();
+ scene->_screen.setup(1580, 1, 1);
+ scene->_screen.setPosition(Common::Point(124, 108));
+ scene->_screen.fixPriority(10);
if (R2_INVENTORY.getObjectScene(R2_JOYSTICK) == 1580)
- scene->_actor3.setDetails(1550, 14, -1, -1, 5, &scene->_actor2);
+ scene->_screen.setDetails(1550, 14, -1, -1, 5, &scene->_joystick);
else
- scene->_actor3.setDetails(1550, 14, -1, -1, 2, (SceneItem *)NULL);
+ scene->_screen.setDetails(1550, 14, -1, -1, 2, (SceneItem *)NULL);
- scene->_actor1.postInit();
- scene->_actor1.setup(1580, 3, 1);
- scene->_actor1.setPosition(Common::Point(124, 109));
- scene->_actor1.fixPriority(20);
- scene->_field412 = 1;
+ scene->_screenDisplay.postInit();
+ scene->_screenDisplay.setup(1580, 3, 1);
+ scene->_screenDisplay.setPosition(Common::Point(124, 109));
+ scene->_screenDisplay.fixPriority(20);
+ //scene->_field412 = 1;
scene->_sceneMode = 10;
scene->setAction(&scene->_sequenceManager, scene, 1, &R2_GLOBALS._player, NULL);
@@ -9735,7 +9632,7 @@ bool Scene1580::Hotspot2::startAction(CursorType action, Event &event) {
return SceneHotspot::startAction(action, event);
}
-bool Scene1580::Actor2::startAction(CursorType action, Event &event) {
+bool Scene1580::Joystick::startAction(CursorType action, Event &event) {
if ( (action == CURSOR_USE) && (R2_INVENTORY.getObjectScene(R2_DIAGNOSTICS_DISPLAY) == 1580)
&& (R2_INVENTORY.getObjectScene(R2_FUEL_CELL) == 0) && (R2_INVENTORY.getObjectScene(R2_GUIDANCE_MODULE) == 0)
&& (R2_INVENTORY.getObjectScene(R2_RADAR_MECHANISM) == 0) && (R2_INVENTORY.getObjectScene(R2_GYROSCOPE) == 0)
@@ -9755,13 +9652,13 @@ bool Scene1580::Actor2::startAction(CursorType action, Event &event) {
return SceneActor::startAction(action, event);
}
-bool Scene1580::Actor3::startAction(CursorType action, Event &event) {
+bool Scene1580::Screen::startAction(CursorType action, Event &event) {
if ((action == CURSOR_USE) && (R2_INVENTORY.getObjectScene(R2_BROKEN_DISPLAY) == 1580)) {
Scene1580 *scene = (Scene1580 *)R2_GLOBALS._sceneManager._scene;
R2_INVENTORY.setObjectScene(R2_BROKEN_DISPLAY, R2_GLOBALS._player._characterIndex);
- scene->_item2.setDetails(Rect(69, 29, 177, 108), 1550, 82, -1, -1, 2, NULL);
- scene->_actor1.remove();
+ scene->_screenSlot.setDetails(Rect(69, 29, 177, 108), 1550, 82, -1, -1, 2, NULL);
+ scene->_screenDisplay.remove();
remove();
return true;
}
@@ -9769,21 +9666,21 @@ bool Scene1580::Actor3::startAction(CursorType action, Event &event) {
return SceneActor::startAction(action, event);
}
-bool Scene1580::Actor4::startAction(CursorType action, Event &event) {
+bool Scene1580::StorageCompartment::startAction(CursorType action, Event &event) {
if (action != CURSOR_USE)
return SceneActor::startAction(action, event);
Scene1580 *scene = (Scene1580 *)R2_GLOBALS._sceneManager._scene;
R2_GLOBALS._player.disableControl();
- R2_GLOBALS._sceneItems.remove(&scene->_actor4);
+ R2_GLOBALS._sceneItems.remove(&scene->_storageCompartment);
scene->_sceneMode = 0;
animate(ANIM_MODE_5, scene);
return true;
}
-bool Scene1580::Actor5::startAction(CursorType action, Event &event) {
+bool Scene1580::HatchButton::startAction(CursorType action, Event &event) {
if (action != CURSOR_USE)
return SceneActor::startAction(action, event);
@@ -9797,7 +9694,7 @@ bool Scene1580::Actor5::startAction(CursorType action, Event &event) {
return true;
}
-bool Scene1580::Actor6::startAction(CursorType action, Event &event) {
+bool Scene1580::ThrusterValve::startAction(CursorType action, Event &event) {
Scene1580 *scene = (Scene1580 *)R2_GLOBALS._sceneManager._scene;
switch (action) {
@@ -9829,7 +9726,7 @@ bool Scene1580::Actor6::startAction(CursorType action, Event &event) {
return SceneActor::startAction(action, event);
}
-bool Scene1580::Actor7::startAction(CursorType action, Event &event) {
+bool Scene1580::Ignitor::startAction(CursorType action, Event &event) {
Scene1580 *scene = (Scene1580 *)R2_GLOBALS._sceneManager._scene;
switch (action) {
@@ -9865,7 +9762,6 @@ void Scene1580::postInit(SceneObjectList *OwnerList) {
loadScene(1580);
R2_GLOBALS._sceneManager._fadeMode = FADEMODE_GRADUAL;
SceneExt::postInit();
- _field412 = 0;
_stripManager.setColors(60, 255);
_stripManager.setFontNumber(3);
@@ -9876,89 +9772,89 @@ void Scene1580::postInit(SceneObjectList *OwnerList) {
R2_GLOBALS._player.disableControl();
if (R2_INVENTORY.getObjectScene(R2_JOYSTICK) == 1580) {
- _actor2.postInit();
- _actor2.setup(1580, 1, 4);
- _actor2.setPosition(Common::Point(159, 163));
- _actor2.setDetails(1550, 78, -1, -1, 1, (SceneItem *) NULL);
+ _joystick.postInit();
+ _joystick.setup(1580, 1, 4);
+ _joystick.setPosition(Common::Point(159, 163));
+ _joystick.setDetails(1550, 78, -1, -1, 1, (SceneItem *) NULL);
} else {
- _item1.setDetails(Rect(141, 148, 179, 167), 1550, 79, -1, -1, 1, NULL);
+ _joystickPlug.setDetails(Rect(141, 148, 179, 167), 1550, 79, -1, -1, 1, NULL);
}
if (R2_INVENTORY.getObjectScene(R2_BROKEN_DISPLAY) == 1580) {
- _actor3.postInit();
- _actor3.setup(1580, 1, 1);
- _actor3.setPosition(Common::Point(124, 108));
- _actor3.fixPriority(10);
- _actor3.setDetails(1550, 13, -1, -1, 1, (SceneItem *) NULL);
-
- _actor1.postInit();
- _actor1.setup(1580, 1, 3);
- _actor1.setPosition(Common::Point(124, 96));
- _actor1.fixPriority(20);
+ _screen.postInit();
+ _screen.setup(1580, 1, 1);
+ _screen.setPosition(Common::Point(124, 108));
+ _screen.fixPriority(10);
+ _screen.setDetails(1550, 13, -1, -1, 1, (SceneItem *) NULL);
+
+ _screenDisplay.postInit();
+ _screenDisplay.setup(1580, 1, 3);
+ _screenDisplay.setPosition(Common::Point(124, 96));
+ _screenDisplay.fixPriority(20);
} else if (R2_INVENTORY.getObjectScene(R2_DIAGNOSTICS_DISPLAY) == 1580) {
- _actor3.postInit();
- _actor3.setup(1580, 1, 1);
- _actor3.setPosition(Common::Point(124, 108));
- _actor3.fixPriority(10);
- _actor3.setDetails(1550, 14, -1, -1, 1, (SceneItem *) NULL);
+ _screen.postInit();
+ _screen.setup(1580, 1, 1);
+ _screen.setPosition(Common::Point(124, 108));
+ _screen.fixPriority(10);
+ _screen.setDetails(1550, 14, -1, -1, 1, (SceneItem *) NULL);
- _actor1.postInit();
- _actor1.setup(1580, 3, 1);
- _actor1.setPosition(Common::Point(124, 109));
- _actor1.fixPriority(20);
+ _screenDisplay.postInit();
+ _screenDisplay.setup(1580, 3, 1);
+ _screenDisplay.setPosition(Common::Point(124, 109));
+ _screenDisplay.fixPriority(20);
_sceneMode = 10;
} else {
- _item2.setDetails(Rect(69, 29, 177, 108), 1550, 82, -1, -1, 1, NULL);
+ _screenSlot.setDetails(Rect(69, 29, 177, 108), 1550, 82, -1, -1, 1, NULL);
}
- _actor4.postInit();
+ _storageCompartment.postInit();
if (R2_GLOBALS.getFlag(58) == 0) {
- _actor4.setup(1580, 5, 1);
- _actor4.setDetails(1550, 80, -1, -1, 1, (SceneItem *) NULL);
+ _storageCompartment.setup(1580, 5, 1);
+ _storageCompartment.setDetails(1550, 80, -1, -1, 1, (SceneItem *) NULL);
} else {
- _actor4.setup(1580, 5, 6);
+ _storageCompartment.setup(1580, 5, 6);
}
- _actor4.setPosition(Common::Point(216, 108));
- _actor4.fixPriority(100);
+ _storageCompartment.setPosition(Common::Point(216, 108));
+ _storageCompartment.fixPriority(100);
+
+ _hatchButton.postInit();
+ _hatchButton.setup(1580, 4, 1);
+ _hatchButton.setPosition(Common::Point(291, 147));
+ _hatchButton.fixPriority(100);
+ _hatchButton.setDetails(1550, 81, -1, -1, 1, (SceneItem *) NULL);
- _actor5.postInit();
- _actor5.setup(1580, 4, 1);
- _actor5.setPosition(Common::Point(291, 147));
- _actor5.fixPriority(100);
- _actor5.setDetails(1550, 81, -1, -1, 1, (SceneItem *) NULL);
-
if (R2_INVENTORY.getObjectScene(R2_THRUSTER_VALVE) == 1580) {
- _actor6.postInit();
- _actor6.setup(1580, 6, 2);
- _actor6.setPosition(Common::Point(222, 108));
- _actor6.fixPriority(50);
- _actor6.setDetails(1550, 32, -1, 34, 1, (SceneItem *) NULL);
+ _thrusterValve.postInit();
+ _thrusterValve.setup(1580, 6, 2);
+ _thrusterValve.setPosition(Common::Point(222, 108));
+ _thrusterValve.fixPriority(50);
+ _thrusterValve.setDetails(1550, 32, -1, 34, 1, (SceneItem *) NULL);
}
if (R2_INVENTORY.getObjectScene(R2_IGNITOR) == 1580) {
- _actor7.postInit();
- _actor7.setup(1580, 6, 1);
- _actor7.setPosition(Common::Point(195, 108));
- _actor7.fixPriority(50);
- _actor7.setDetails(1550, 38, -1, 34, 1, (SceneItem *) NULL);
+ _ignitor.postInit();
+ _ignitor.setup(1580, 6, 1);
+ _ignitor.setPosition(Common::Point(195, 108));
+ _ignitor.fixPriority(50);
+ _ignitor.setDetails(1550, 38, -1, 34, 1, (SceneItem *) NULL);
}
R2_GLOBALS._player.postInit();
R2_GLOBALS._player.hide();
setAction(&_sequenceManager, this, 1, &R2_GLOBALS._player, NULL);
- _item3.setDetails(Rect(0, 0, 320, 200), 1550, 50, -1, -1, 1, NULL);
+ _background.setDetails(Rect(0, 0, 320, 200), 1550, 50, -1, -1, 1, NULL);
}
void Scene1580::signal() {
switch (_sceneMode++) {
case 10:
- _actor1.animate(ANIM_MODE_5, this);
+ _screenDisplay.animate(ANIM_MODE_5, this);
break;
case 11:
- _actor1.setup(1580, 1, 2);
- _actor1.setPosition(Common::Point(124, 94));
+ _screenDisplay.setup(1580, 1, 2);
+ _screenDisplay.setPosition(Common::Point(124, 94));
if (R2_INVENTORY.getObjectScene(R2_GYROSCOPE) != 0) {
_arrActor[0].postInit();
@@ -10037,19 +9933,16 @@ bool Scene1625::Wire::startAction(CursorType action, Event &event) {
R2_GLOBALS._player.disableControl();
scene->_sceneMode = 1631;
- scene->_actor3.postInit();
- scene->setAction(&scene->_sequenceManager, scene, 1631, &scene->_actor3, &scene->_wire, NULL);
+ scene->_mirandaMouth.postInit();
+ scene->setAction(&scene->_sequenceManager, scene, 1631, &scene->_mirandaMouth, &scene->_wire, NULL);
return true;
}
Scene1625::Scene1625() {
- _field412 = 0;
}
void Scene1625::synchronize(Serializer &s) {
SceneExt::synchronize(s);
-
- s.syncAsSint16LE(_field412);
}
void Scene1625::postInit(SceneObjectList *OwnerList) {
@@ -10069,10 +9962,10 @@ void Scene1625::postInit(SceneObjectList *OwnerList) {
_wire.setPosition(Common::Point(206, 133));
_wire.setDetails(1625, 0, -1, -1, 1, (SceneItem *) NULL);
- _actor5.postInit();
- _actor5.setup(1625, 8, 1);
- _actor5.setPosition(Common::Point(190, 131));
- _actor5.setDetails(1625, 6, -1, 2, 1, (SceneItem *) NULL);
+ _wristRestraints.postInit();
+ _wristRestraints.setup(1625, 8, 1);
+ _wristRestraints.setPosition(Common::Point(190, 131));
+ _wristRestraints.setDetails(1625, 6, -1, 2, 1, (SceneItem *) NULL);
if (R2_GLOBALS._player._oldCharacterScene[R2_MIRANDA] == 1625) {
if (!R2_GLOBALS.getFlag(83)) {
@@ -10084,18 +9977,18 @@ void Scene1625::postInit(SceneObjectList *OwnerList) {
R2_GLOBALS._player.enableControl();
R2_GLOBALS._player._canWalk = false;
} else {
- _actor1.postInit();
- _actor1.fixPriority(10);
+ _teal.postInit();
+ _teal.fixPriority(10);
- _actor6.postInit();
+ _tealRightArm.postInit();
R2_GLOBALS._player.disableControl();
_sceneMode = 1625;
- setAction(&_sequenceManager, this, 1625, &_actor1, &_actor6, NULL);
+ setAction(&_sequenceManager, this, 1625, &_teal, &_tealRightArm, NULL);
}
R2_GLOBALS._sound1.play(245);
- _item1.setDetails(Rect(0, 0, 320, 200), 1625, 12, -1, -1, 1, NULL);
+ _background.setDetails(Rect(0, 0, 320, 200), 1625, 12, -1, -1, 1, NULL);
R2_GLOBALS._player._oldCharacterScene[R2_MIRANDA] = 1625;
R2_GLOBALS._player._characterScene[R2_MIRANDA] = 1625;
}
@@ -10130,11 +10023,11 @@ void Scene1625::signal() {
switch (_stripManager._exitMode) {
case 1:
_sceneMode = 1627;
- setAction(&_sequenceManager, this, 1627, &_actor3, &_glass, NULL);
+ setAction(&_sequenceManager, this, 1627, &_mirandaMouth, &_glass, NULL);
break;
case 2:
_sceneMode = 1629;
- setAction(&_sequenceManager, this, 1629, &_tealHead, &_actor5, NULL);
+ setAction(&_sequenceManager, this, 1629, &_tealHead, &_wristRestraints, NULL);
break;
case 4:
R2_GLOBALS._player._oldCharacterScene[R2_MIRANDA] = 3150;
@@ -10145,7 +10038,7 @@ void Scene1625::signal() {
case 5:
_sceneMode = 1628;
_tealHead.remove();
- setAction(&_sequenceManager, this, 1628, &_actor3, &_glass, NULL);
+ setAction(&_sequenceManager, this, 1628, &_mirandaMouth, &_glass, NULL);
break;
case 6:
_glass.postInit();
@@ -10159,24 +10052,24 @@ void Scene1625::signal() {
break;
case 8:
_sceneMode = 1635;
- setAction(&_sequenceManager, this, 1635, &_actor3, &_actor5, NULL);
+ setAction(&_sequenceManager, this, 1635, &_mirandaMouth, &_wristRestraints, NULL);
break;
case 9:
_glass.postInit();
_glass.setDetails(1625, -1, -1, -1, 2, (SceneItem *) NULL);
_sceneMode = 1634;
- setAction(&_sequenceManager, this, 1634, &_actor3, &_actor5, NULL);
+ setAction(&_sequenceManager, this, 1634, &_mirandaMouth, &_wristRestraints, NULL);
break;
case 3:
// No break on purpose
default:
_sceneMode = 1630;
_tealHead.remove();
- setAction(&_sequenceManager, this, 1630, &_actor1, &_actor6, NULL);
+ setAction(&_sequenceManager, this, 1630, &_teal, &_tealRightArm, NULL);
break;
}
- _field412 = _stripManager._field2E8;
- _stripManager._field2E8 = 0;
+ //_field412 = _stripManager._field2E8;
+ _stripManager._currObj44Id = 0;
break;
case 1625:
_tealHead.postInit();
@@ -10191,18 +10084,18 @@ void Scene1625::signal() {
_tealHead.setPosition(Common::Point(68, 68));
_tealHead.show();
- _actor3.postInit();
- _actor3.setup(1627, 3, 1);
- _actor3.setPosition(Common::Point(196, 65));
+ _mirandaMouth.postInit();
+ _mirandaMouth.setup(1627, 3, 1);
+ _mirandaMouth.setPosition(Common::Point(196, 65));
_sceneMode = 99;
R2_GLOBALS._events.setCursor(CURSOR_CROSSHAIRS);
_stripManager.start(832, this);
break;
case 1627:
- _actor3.setup(1627, 3, 1);
- _actor3.setPosition(Common::Point(196, 65));
- _actor3.show();
+ _mirandaMouth.setup(1627, 3, 1);
+ _mirandaMouth.setPosition(Common::Point(196, 65));
+ _mirandaMouth.show();
_sceneMode = 99;
R2_GLOBALS._events.setCursor(CURSOR_CROSSHAIRS);
@@ -10214,9 +10107,9 @@ void Scene1625::signal() {
_tealHead.setup(1627, 1, 1);
_tealHead.setPosition(Common::Point(68, 68));
- _actor3.setup(1627, 3, 1);
- _actor3.setPosition(Common::Point(196, 65));
- _actor3.show();
+ _mirandaMouth.setup(1627, 3, 1);
+ _mirandaMouth.setPosition(Common::Point(196, 65));
+ _mirandaMouth.show();
_sceneMode = 99;
R2_GLOBALS._events.setCursor(CURSOR_CROSSHAIRS);
@@ -10236,21 +10129,21 @@ void Scene1625::signal() {
R2_GLOBALS._player._canWalk = true;
break;
case 1631:
- _actor3.setup(1627, 3, 1);
- _actor3.setPosition(Common::Point(196, 65));
- _actor3.show();
+ _mirandaMouth.setup(1627, 3, 1);
+ _mirandaMouth.setPosition(Common::Point(196, 65));
+ _mirandaMouth.show();
_wire.remove();
- _actor1.postInit();
- _actor1.fixPriority(10);
+ _teal.postInit();
+ _teal.fixPriority(10);
- _actor6.postInit();
+ _tealRightArm.postInit();
R2_INVENTORY.setObjectScene(R2_SUPERCONDUCTOR_WIRE, 3);
_sceneMode = 14;
- setAction(&_sequenceManager, this, 1625, &_actor1, &_actor6, NULL);
+ setAction(&_sequenceManager, this, 1625, &_teal, &_tealRightArm, NULL);
break;
case 1632:
_tealHead.setup(1627, 1, 1);
@@ -10273,9 +10166,9 @@ void Scene1625::signal() {
_stripManager.start(836, this);
break;
case 1635:
- _actor3.setup(1627, 3, 1);
- _actor3.setPosition(Common::Point(196, 65));
- _actor3.show();
+ _mirandaMouth.setup(1627, 3, 1);
+ _mirandaMouth.setPosition(Common::Point(196, 65));
+ _mirandaMouth.show();
_sceneMode = 99;
R2_GLOBALS._events.setCursor(CURSOR_CROSSHAIRS);
@@ -10299,21 +10192,13 @@ void Scene1625::process(Event &event) {
*--------------------------------------------------------------------------*/
Scene1700::Scene1700() {
- _field77A = 0;
- _field77C = 0;
+ _walkFlag = 0;
}
void Scene1700::synchronize(Serializer &s) {
SceneExt::synchronize(s);
- s.syncAsSint16LE(_field77A);
- s.syncAsSint16LE(_field77C);
-}
-
-bool Scene1700::Item2::startAction(CursorType action, Event &event) {
- // The original contains a debug trace. It's currently skipped.
- // TODO: either add the debug trace, or remove this function and associated class
- return SceneHotspot::startAction(action, event);
+ s.syncAsSint16LE(_walkFlag);
}
bool Scene1700::RimTransport::startAction(CursorType action, Event &event) {
@@ -10323,7 +10208,6 @@ bool Scene1700::RimTransport::startAction(CursorType action, Event &event) {
Scene1700 *scene = (Scene1700 *)R2_GLOBALS._sceneManager._scene;
R2_GLOBALS._player.disableControl();
- R2_GLOBALS._v558B6.set(80, 0, 240, 200);
scene->_sceneMode = 4;
Common::Point pt(271, 90);
@@ -10333,7 +10217,7 @@ bool Scene1700::RimTransport::startAction(CursorType action, Event &event) {
return true;
}
-bool Scene1700::Actor12::startAction(CursorType action, Event &event) {
+bool Scene1700::Companion::startAction(CursorType action, Event &event) {
if (action != CURSOR_TALK)
return SceneActor::startAction(action, event);
@@ -10391,23 +10275,14 @@ void Scene1700::enterArea() {
_westPlatform.remove();
_rimTransportDoor.remove();
_rimTransport.remove();
-
+
if (_sceneMode != 40) {
_ledgeHopper.remove();
- _actor10.remove();
+ _hatch.remove();
}
- warning("tmpRect = _v5589E;");
- warning("Mouse_hideIfNeeded");
- warning("set_pane_p(_paneNumber);");
- warning("Big loop calling gfx_draw_slice_p");
-
- if (_field77A == 0)
- _field77A = 1;
- else
- _field77A = 0;
-
- warning("set_pane_p(_paneNumber);");
+ // The original had manual code here to redraw the background manually when
+ // changing areas within the scene. Which seems to be totally redundant.
if (_sceneMode != 40 && R2_GLOBALS._rimLocation == 0) {
// Crashed ledge hopper
@@ -10463,7 +10338,7 @@ void Scene1700::enterArea() {
// Rim transport vechile located
R2_GLOBALS._rimTransportLocation = R2_GLOBALS._rimLocation;
if (!R2_GLOBALS.getFlag(15))
- _field77C = 1;
+ _walkFlag = true;
_rimTransport.postInit();
_rimTransport.setup(1700, 3, 1);
@@ -10503,44 +10378,44 @@ void Scene1700::postInit(SceneObjectList *OwnerList) {
R2_GLOBALS._player._moveDiff = Common::Point(3, 1);
}
- _actor12.postInit();
- _actor12.animate(ANIM_MODE_1, NULL);
- _actor12.setObjectWrapper(new SceneObjectWrapper());
+ _companion.postInit();
+ _companion.animate(ANIM_MODE_1, NULL);
+ _companion.setObjectWrapper(new SceneObjectWrapper());
if (R2_GLOBALS._player._characterIndex == R2_QUINN) {
- _actor12.setVisage(1506);
- _actor12._moveDiff = Common::Point(3, 1);
- _actor12.setDetails(9002, 1, -1, -1, 1, (SceneItem *) NULL);
+ _companion.setVisage(1506);
+ _companion._moveDiff = Common::Point(3, 1);
+ _companion.setDetails(9002, 1, -1, -1, 1, (SceneItem *) NULL);
} else {
- _actor12.setVisage(1501);
- _actor12._moveDiff = Common::Point(2, 1);
- _actor12.setDetails(9001, 1, -1, -1, 1, (SceneItem *) NULL);
+ _companion.setVisage(1501);
+ _companion._moveDiff = Common::Point(2, 1);
+ _companion.setDetails(9001, 1, -1, -1, 1, (SceneItem *) NULL);
}
R2_GLOBALS._sound1.play(134);
- _actor1.postInit();
- _actor1.fixPriority(10);
+ _playerShadow.postInit();
+ _playerShadow.fixPriority(10);
if (R2_GLOBALS._player._characterIndex == R2_QUINN)
- _actor1.setVisage(1112);
+ _playerShadow.setVisage(1112);
else
- _actor1.setVisage(1111);
+ _playerShadow.setVisage(1111);
- _actor1._effect = 5;
- _actor1._field9C = _field312;
- R2_GLOBALS._player._linkedActor = &_actor1;
+ _playerShadow._effect = EFFECT_SHADOW_MAP;
+ _playerShadow._shadowMap = _shadowPaletteMap;
+ R2_GLOBALS._player._linkedActor = &_playerShadow;
- _actor2.postInit();
- _actor2.fixPriority(10);
+ _companionShadow.postInit();
+ _companionShadow.fixPriority(10);
if (R2_GLOBALS._player._characterIndex == R2_QUINN)
- _actor2.setVisage(1111);
+ _companionShadow.setVisage(1111);
else
- _actor2.setVisage(1112);
+ _companionShadow.setVisage(1112);
- _actor2._effect = 5;
- _actor2._field9C = _field312;
- _actor12._linkedActor = &_actor2;
+ _companionShadow._effect = EFFECT_SHADOW_MAP;
+ _companionShadow._shadowMap = _shadowPaletteMap;
+ _companion._linkedActor = &_companionShadow;
R2_GLOBALS._sound1.play(134);
@@ -10549,60 +10424,59 @@ void Scene1700::postInit(SceneObjectList *OwnerList) {
R2_GLOBALS._player._characterIndex = R2_QUINN;
R2_GLOBALS._player.disableControl();
R2_GLOBALS._player.hide();
- _actor12.hide();
+ _companion.hide();
- _actor10.postInit();
- warning("_actor10._actorName = \"hatch\";");
- _actor10.hide();
+ _hatch.postInit();
+ _hatch.hide();
_ledgeHopper.postInit();
_ledgeHopper.setup(1701, 1, 1);
_ledgeHopper.setPosition(Common::Point(220, 137));
_ledgeHopper.setDetails(1700, 6, -1, -1, 1, (SceneItem *) NULL);
- _actor1.hide();
- _actor2.hide();
+ _playerShadow.hide();
+ _companionShadow.hide();
R2_GLOBALS._events.setCursor(CURSOR_WALK);
_stripManager.start(539, this);
_sceneMode = 40;
break;
case 1750: {
R2_GLOBALS._player.setPosition(Common::Point(282, 121));
- _actor12.setPosition(Common::Point(282, 139));
+ _companion.setPosition(Common::Point(282, 139));
_sceneMode = 8;
Common::Point pt(262, 101);
NpcMover *mover = new NpcMover();
R2_GLOBALS._player.addMover(mover, &pt, this);
Common::Point pt2(262, 119);
NpcMover *mover2 = new NpcMover();
- _actor12.addMover(mover2, &pt2, this);
+ _companion.addMover(mover2, &pt2, this);
}
break;
case 1800: {
R2_GLOBALS._player.disableControl();
R2_GLOBALS._player.setPosition(Common::Point(0, 86));
- _actor12.setPosition(Common::Point(0, 64));
+ _companion.setPosition(Common::Point(0, 64));
_sceneMode = 7;
R2_GLOBALS._player.setObjectWrapper(NULL);
R2_GLOBALS._player._strip = 1;
Common::Point pt(64, 86);
NpcMover *mover = new NpcMover();
R2_GLOBALS._player.addMover(mover, &pt, this);
- _actor12.setObjectWrapper(NULL);
- _actor12._strip = 1;
+ _companion.setObjectWrapper(NULL);
+ _companion._strip = 1;
Common::Point pt2(77, 64);
NpcMover *mover2 = new NpcMover();
- _actor12.addMover(mover2, &pt2, NULL);
+ _companion.addMover(mover2, &pt2, NULL);
}
break;
default:
if (R2_GLOBALS._player._characterIndex == R2_QUINN) {
R2_GLOBALS._player.setPosition(Common::Point(109, 160));
- _actor12.setPosition(Common::Point(156, 160));
+ _companion.setPosition(Common::Point(156, 160));
R2_GLOBALS._walkRegions.disableRegion(15);
} else {
R2_GLOBALS._player.setPosition(Common::Point(156, 160));
- _actor12.setPosition(Common::Point(109, 160));
+ _companion.setPosition(Common::Point(109, 160));
R2_GLOBALS._walkRegions.disableRegion(17);
}
_sceneMode = 50;
@@ -10614,10 +10488,10 @@ void Scene1700::postInit(SceneObjectList *OwnerList) {
R2_GLOBALS._player._oldCharacterScene[R2_QUINN] = 1700;
R2_GLOBALS._player._oldCharacterScene[R2_SEEKER] = 1700;
- R2_GLOBALS._v558B6.set(20, 0, 320, 200);
enterArea();
- _item1.setDetails(1, 1700, 3, -1, -1);
- _item2.setDetails(Rect(0, 0, 480, 200), 1700, 0, -1, -1, 1, NULL);
+
+ _surface.setDetails(1, 1700, 3, -1, -1);
+ _background.setDetails(Rect(0, 0, 480, 200), 1700, 0, -1, -1, 1, NULL);
}
void Scene1700::remove() {
@@ -10638,16 +10512,16 @@ void Scene1700::signal() {
R2_GLOBALS._player.addMover(mover, &pt, this);
if (R2_GLOBALS._player._position.x < 132) {
- _actor12.setPosition(Common::Point(156, 170));
+ _companion.setPosition(Common::Point(156, 170));
Common::Point pt2(156, 160);
NpcMover *mover2 = new NpcMover();
- _actor12.addMover(mover2, &pt2, NULL);
+ _companion.addMover(mover2, &pt2, NULL);
R2_GLOBALS._walkRegions.disableRegion(15);
} else {
- _actor12.setPosition(Common::Point(109, 170));
+ _companion.setPosition(Common::Point(109, 170));
Common::Point pt3(109, 160);
NpcMover *mover3 = new NpcMover();
- _actor12.addMover(mover3, &pt3, NULL);
+ _companion.addMover(mover3, &pt3, NULL);
R2_GLOBALS._walkRegions.disableRegion(17);
}
}
@@ -10663,26 +10537,26 @@ void Scene1700::signal() {
R2_GLOBALS._player.addMover(mover, &pt, this);
if (R2_GLOBALS._player._position.x >= 171) {
- _actor12.setPosition(Common::Point(155, 0));
+ _companion.setPosition(Common::Point(155, 0));
Common::Point pt2(155, 10);
NpcMover *mover2 = new NpcMover();
- _actor12.addMover(mover2, &pt2, NULL);
+ _companion.addMover(mover2, &pt2, NULL);
R2_GLOBALS._walkRegions.disableRegion(15);
} else {
- _actor12.setPosition(Common::Point(188, 0));
+ _companion.setPosition(Common::Point(188, 0));
Common::Point pt3(188, 10);
NpcMover *mover3 = new NpcMover();
- _actor12.addMover(mover3, &pt3, NULL);
+ _companion.addMover(mover3, &pt3, NULL);
R2_GLOBALS._walkRegions.disableRegion(17);
}
}
break;
case 3:
- if (_field77C == 0) {
+ if (!_walkFlag) {
R2_GLOBALS._player.enableControl(CURSOR_WALK);
} else {
R2_GLOBALS.setFlag(15);
- _field77C = 0;
+ _walkFlag = false;
_sceneMode = 31;
R2_GLOBALS._events.setCursor(CURSOR_WALK);
if (R2_GLOBALS._player._characterIndex == R2_QUINN)
@@ -10695,7 +10569,7 @@ void Scene1700::signal() {
_sceneMode = 5;
Common::Point pt(271, 90);
PlayerMover *mover = new PlayerMover();
- _actor12.addMover(mover, &pt, NULL);
+ _companion.addMover(mover, &pt, NULL);
if (R2_GLOBALS._player._characterIndex == R2_QUINN)
setAction(&_sequenceManager, this, 1700, &R2_GLOBALS._player, &_rimTransportDoor, NULL);
else
@@ -10711,14 +10585,14 @@ void Scene1700::signal() {
case 7:
R2_GLOBALS._player.setObjectWrapper(new SceneObjectWrapper());
R2_GLOBALS._player._strip = 1;
- _actor12.setObjectWrapper(new SceneObjectWrapper());
- _actor12._strip = 1;
+ _companion.setObjectWrapper(new SceneObjectWrapper());
+ _companion._strip = 1;
R2_GLOBALS._player.enableControl(CURSOR_WALK);
R2_GLOBALS._walkRegions.disableRegion(14);
break;
case 8:
R2_GLOBALS._player._strip = 2;
- _actor12._strip = 1;
+ _companion._strip = 1;
R2_GLOBALS._player.enableControl(CURSOR_WALK);
R2_GLOBALS._walkRegions.disableRegion(12);
break;
@@ -10732,13 +10606,13 @@ void Scene1700::signal() {
_stripManager.start(541, this);
break;
case 31:
- R2_GLOBALS._v56AAB = 0;
R2_GLOBALS._player.enableControl(CURSOR_TALK);
break;
case 40:
R2_GLOBALS._player.disableControl();
_sceneMode = 1704;
- setAction(&_sequenceManager, this, 1704, &R2_GLOBALS._player, &_actor12, &_actor10, &_ledgeHopper, &_actor1, &_actor2, NULL);
+ setAction(&_sequenceManager, this, 1704, &R2_GLOBALS._player, &_companion,
+ &_hatch, &_ledgeHopper, &_playerShadow, &_companionShadow, NULL);
break;
case 50:
if (R2_GLOBALS._player._characterIndex == R2_QUINN)
@@ -10866,13 +10740,8 @@ void Scene1750::SpeedSlider::calculateSlider() {
scene->_speed = scene->_direction * tmpVar2;
}
-void Scene1750::SpeedSlider::remove() {
- // Function kept to match IDA. Could be removed.
- SceneActor::remove();
-}
-
void Scene1750::SpeedSlider::process(Event &event) {
- if ((event.eventType == EVENT_BUTTON_DOWN) && (R2_GLOBALS._events.getCursor() == CURSOR_USE) &&
+ if ((event.eventType == EVENT_BUTTON_DOWN) && (R2_GLOBALS._events.getCursor() == CURSOR_USE) &&
(_bounds.contains(event.mousePos))) {
_mouseDown = true;
event.eventType = EVENT_NONE;
@@ -10909,12 +10778,14 @@ bool Scene1750::SpeedSlider::startAction(CursorType action, Event &event) {
Scene1750::Scene1750() {
_direction = 0;
- _field413 = 0;
+ _speedCurrent = 0;
_speed = 0;
- _field417 = 0;
- _field419 = 0;
- _field41B = 0;
- _field41D = 0;
+ _speedDelta = 0;
+ _rotationSegment = 0;
+ _rotationSegCurrent = 0;
+ _newRotation = 0;
+
+ _rotation = nullptr;
}
void Scene1750::synchronize(Serializer &s) {
@@ -10922,20 +10793,21 @@ void Scene1750::synchronize(Serializer &s) {
SYNC_POINTER(_rotation);
s.syncAsSint16LE(_direction);
- s.syncAsSint16LE(_field413);
+ s.syncAsSint16LE(_speedCurrent);
s.syncAsSint16LE(_speed);
- s.syncAsSint16LE(_field417);
- s.syncAsSint16LE(_field419);
- s.syncAsSint16LE(_field41B);
- s.syncAsSint16LE(_field41D);
+ s.syncAsSint16LE(_speedDelta);
+ s.syncAsSint16LE(_rotationSegment);
+ s.syncAsSint16LE(_rotationSegCurrent);
+ s.syncAsSint16LE(_newRotation);
}
void Scene1750::postInit(SceneObjectList *OwnerList) {
loadScene(1750);
R2_GLOBALS._sound1.play(115);
R2_GLOBALS._uiElements._active = false;
- R2_GLOBALS._v5589E.set(0, 0, 320, 200);
+
SceneExt::postInit();
+ R2_GLOBALS._interfaceY = SCREEN_HEIGHT;
R2_GLOBALS._player._characterScene[R2_QUINN] = 1750;
R2_GLOBALS._player._characterScene[R2_SEEKER] = 1750;
@@ -10985,28 +10857,28 @@ void Scene1750::postInit(SceneObjectList *OwnerList) {
R2_GLOBALS._player.hide();
R2_GLOBALS._player.enableControl();
- _actor3.postInit();
- _actor3.setup(1750, 3, 1);
- _actor3.setPosition(Common::Point(49, 185));
- _actor3.fixPriority(7);
- _actor3.setDetails(1750, 30, -1, -1, 1, (SceneItem *) NULL);
+ _radarSweep.postInit();
+ _radarSweep.setup(1750, 3, 1);
+ _radarSweep.setPosition(Common::Point(49, 185));
+ _radarSweep.fixPriority(7);
+ _radarSweep.setDetails(1750, 30, -1, -1, 1, (SceneItem *) NULL);
- _actor1.postInit();
- _actor1.setup(1750, 2, 1);
- _actor1.setPosition(Common::Point(35, ((_rotation->_currIndex - 218) % 4) + ((R2_GLOBALS._rimLocation % 800) * 4) - 1440));
- _actor1.fixPriority(8);
+ _scannerIcon.postInit();
+ _scannerIcon.setup(1750, 2, 1);
+ _scannerIcon.setPosition(Common::Point(35, ((_rotation->_currIndex - 218) % 4) + ((R2_GLOBALS._rimLocation % 800) * 4) - 1440));
+ _scannerIcon.fixPriority(8);
- _actor2.postInit();
- _actor2.setup(1750, 1, 4);
+ _redLights.postInit();
+ _redLights.setup(1750, 1, 4);
- int tmpVar = abs(_actor1._position.y - 158) / 100;
+ int tmpVar = ABS(_scannerIcon._position.y - 158) / 100;
if (tmpVar >= 8)
- _actor2.hide();
- else if (_actor1._position.y <= 158)
- _actor2.setPosition(Common::Point(137, (tmpVar * 7) + 122));
+ _redLights.hide();
+ else if (_scannerIcon._position.y <= 158)
+ _redLights.setPosition(Common::Point(137, (tmpVar * 7) + 122));
else
- _actor2.setPosition(Common::Point(148, (tmpVar * 7) + 122));
+ _redLights.setPosition(Common::Point(148, (tmpVar * 7) + 122));
_speedSlider.setupSlider(1, 286, 143, 41, 15);
_speedSlider.setDetails(1750, 24, 1, -1, 1, (SceneItem *) NULL);
@@ -11031,12 +10903,12 @@ void Scene1750::postInit(SceneObjectList *OwnerList) {
_exitButton.setDetails(1750, 27, 1, -1, 1, (SceneItem *) NULL);
_direction = 1; // Forward by default
- _field417 = 0;
- _field413 = 0;
+ _speedDelta = 0;
+ _speedCurrent = 0;
_speed = 0;
- _field419 = ((_rotation->_currIndex - 218) / 4) % 4;
+ _rotationSegment = ((_rotation->_currIndex - 218) / 4) % 4;
- _redLights.setDetails(Rect(129, 112, 155, 175), 1750, 21, -1, -1, 1, NULL);
+ _redLightsDescr.setDetails(Rect(129, 112, 155, 175), 1750, 21, -1, -1, 1, NULL);
_greenLights.setDetails(Rect(93, 122, 126, 172), 1750, 15, -1, -1, 1, NULL);
_frontView.setDetails(Rect(3, 3, 157, 99), 1750, 9, -1, -1, 1, NULL);
_rearView.setDetails(Rect(162, 3, 316, 99), 1750, 12, -1, -1, 1, NULL);
@@ -11054,8 +10926,6 @@ void Scene1750::remove() {
SceneExt::remove();
R2_GLOBALS._sound1.fadeOut2(NULL);
- R2_GLOBALS._v5589E.top = 3;
- R2_GLOBALS._v5589E.bottom = 168;
R2_GLOBALS._uiElements._active = true;
}
@@ -11071,71 +10941,73 @@ void Scene1750::process(Event &event) {
void Scene1750::dispatch() {
if (_rotation) {
- if (!_field417 && (_speed != _field413)) {
- if (_field413 >= _speed)
- --_field413;
+ if (!_speedDelta && (_speed != _speedCurrent)) {
+ if (_speedCurrent >= _speed)
+ --_speedCurrent;
else
- ++_field413;
+ ++_speedCurrent;
- _field417 = 21 - ABS(_field413);
+ _speedDelta = 21 - ABS(_speedCurrent);
}
- if (_field417 == 1) {
- if (_field413 == 0) {
- _actor3.show();
+ if (_speedDelta == 1) {
+ if (_speedCurrent == 0) {
+ _radarSweep.show();
_rotation->_idxChange = 0;
} else {
if (_rotation->_idxChange == 0)
- _actor3.hide();
+ _radarSweep.hide();
- if (_field413 < -12) {
- _rotation->setDelay(15 - ABS(_field413));
+ if (_speedCurrent < -12) {
+ _rotation->setDelay(15 - ABS(_speedCurrent));
_rotation->_idxChange = -2;
- } else if (_field413 < 0) {
- _rotation->setDelay(10 - ABS(_field413));
+ } else if (_speedCurrent < 0) {
+ _rotation->setDelay(10 - ABS(_speedCurrent));
_rotation->_idxChange = -1;
- } else if (_field413 < 11) {
- _rotation->setDelay(10 - _field413);
+ } else if (_speedCurrent < 11) {
+ _rotation->setDelay(10 - _speedCurrent);
_rotation->_idxChange = 1;
} else {
- _rotation->setDelay(15 - _field413);
+ _rotation->setDelay(15 - _speedCurrent);
_rotation->_idxChange = 2;
}
- }
+ }
}
- if (_field417)
- --_field417;
+ if (_speedDelta)
+ --_speedDelta;
- _field41B = _field419;
- _field419 = ((_rotation->_currIndex - 218) / 4) / 4;
+ _rotationSegCurrent = _rotationSegment;
+ _rotationSegment = ((_rotation->_currIndex - 218) / 4) % 4;
- if ((_field41B + 1) == _field419 || (_field41B - 3) == _field419) {
+ if ((_rotationSegCurrent + 1) == _rotationSegment || (_rotationSegCurrent - 3) == _rotationSegment) {
if (R2_GLOBALS._rimLocation < 2400) {
++R2_GLOBALS._rimLocation;
}
}
- if ((_field41B - 1) == _field419 || (_field41B + 3) == _field419) {
+ if ((_rotationSegCurrent - 1) == _rotationSegment || (_rotationSegCurrent + 3) == _rotationSegment) {
if (R2_GLOBALS._rimLocation > -2400) {
--R2_GLOBALS._rimLocation;
}
}
- if (_rotation->_currIndex != _field41D) {
- _field41D = _rotation->_currIndex;
- _actor1.setPosition(Common::Point(35, ((_rotation->_currIndex - 218) % 4) +
+ if (_rotation->_currIndex != _newRotation) {
+ // Handle setting the position of the lift icon in the scanner display
+ _newRotation = _rotation->_currIndex;
+ _scannerIcon.setPosition(Common::Point(35, ((_rotation->_currIndex - 218) % 4) +
((R2_GLOBALS._rimLocation % 800) * 4) - 1440));
}
}
- int v = ABS(_actor1._position.y - 158) / 100;
+ int v = ABS(_scannerIcon._position.y - 158) / 100;
if (v < 8) {
- _actor2.show();
- _actor2.setPosition(Common::Point((_actor1._position.y <= 158) ? 137 : 148,
+ // Show how close the user is to the lift on the second column of lights
+ _redLights.show();
+ _redLights.setPosition(Common::Point((_scannerIcon._position.y <= 158) ? 137 : 148,
v * 7 + 122));
} else {
- _actor2.hide();
+ _redLights.hide();
}
}
@@ -11231,8 +11103,11 @@ bool Scene1800::Doors::startAction(CursorType action, Event &event) {
R2_GLOBALS.setFlag(14);
}
} else {
+ // Seeker failing to force open doors
scene->_sceneMode = 1813;
- scene->setAction(&scene->_sequenceManager, scene, 1813, &R2_GLOBALS._player, NULL);
+ // Original was using 1813 in setAction too, but it somewhat broken.
+ // Seeker goes 2 pixels to high, hiding behind the door
+ scene->setAction(&scene->_sequenceManager, scene, 1808, &R2_GLOBALS._player, &scene->_doors, NULL);
}
} else if (R2_GLOBALS.getFlag(14)) {
return SceneActor::startAction(action, event);
@@ -11278,30 +11153,28 @@ bool Scene1800::PassengerDoor::startAction(CursorType action, Event &event) {
}
}
}
+ } else if (scene->_leftStaircase._frame == 1) {
+ return SceneActor::startAction(action, event);
} else {
- if (scene->_leftStaircase._frame == 1) {
- return SceneActor::startAction(action, event);
+ R2_GLOBALS.clearFlag(29);
+ R2_GLOBALS._player.disableControl();
+ if (R2_GLOBALS._player._characterIndex == R2_QUINN) {
+ if (R2_GLOBALS.getFlag(14)) {
+ scene->_sceneMode = 2;
+ scene->setAction(&scene->_sequenceManager, scene, 1809, &scene->_companion, &scene->_doors, NULL);
+ R2_GLOBALS.clearFlag(14);
+ } else {
+ scene->_sceneMode = 1806;
+ scene->setAction(&scene->_sequenceManager, scene, 1806, &R2_GLOBALS._player, &scene->_companion, &scene->_rightDoor, NULL);
+ }
} else {
- R2_GLOBALS.clearFlag(29);
- R2_GLOBALS._player.disableControl();
- if (R2_GLOBALS._player._characterIndex == R2_QUINN) {
- if (R2_GLOBALS.getFlag(14)) {
- scene->_sceneMode = 2;
- scene->setAction(&scene->_sequenceManager, scene, 1809, &scene->_companion, &scene->_doors, NULL);
- R2_GLOBALS.clearFlag(14);
- } else {
- scene->_sceneMode = 1806;
- scene->setAction(&scene->_sequenceManager, scene, 1806, &R2_GLOBALS._player, &scene->_companion, &scene->_rightDoor, NULL);
- }
+ if (R2_GLOBALS.getFlag(14)) {
+ scene->_sceneMode = 2;
+ scene->setAction(&scene->_sequenceManager, scene, 1809, &R2_GLOBALS._player, &scene->_doors, NULL);
+ R2_GLOBALS.clearFlag(14);
} else {
- if (R2_GLOBALS.getFlag(14)) {
- scene->_sceneMode = 2;
- scene->setAction(&scene->_sequenceManager, scene, 1809, &R2_GLOBALS._player, &scene->_doors, NULL);
- R2_GLOBALS.clearFlag(14);
- } else {
- scene->_sceneMode = 1807;
- scene->setAction(&scene->_sequenceManager, scene, 1807, &R2_GLOBALS._player, &scene->_companion, &scene->_rightDoor, NULL);
- }
+ scene->_sceneMode = 1807;
+ scene->setAction(&scene->_sequenceManager, scene, 1807, &R2_GLOBALS._player, &scene->_companion, &scene->_rightDoor, NULL);
}
}
}
@@ -11309,7 +11182,7 @@ bool Scene1800::PassengerDoor::startAction(CursorType action, Event &event) {
return true;
}
-void Scene1800::Exit1::changeScene() {
+void Scene1800::SouthExit::changeScene() {
Scene1800 *scene = (Scene1800 *)R2_GLOBALS._sceneManager._scene;
_enabled = false;
@@ -11327,7 +11200,7 @@ void Scene1800::Exit1::changeScene() {
if (R2_GLOBALS._player._characterIndex == R2_QUINN)
scene->setAction(&scene->_sequenceManager, scene, 1802, &R2_GLOBALS._player, &scene->_companion, NULL);
else
- scene->setAction(&scene->_sequenceManager, scene, 1802, &R2_GLOBALS._player, &scene->_companion, NULL);
+ scene->setAction(&scene->_sequenceManager, scene, 1803, &R2_GLOBALS._player, &scene->_companion, NULL);
}
}
@@ -11348,7 +11221,7 @@ void Scene1800::postInit(SceneObjectList *OwnerList) {
_locationMode = 0;
scalePalette(65, 65, 65);
- _exit1.setDetails(Rect(0, 160, 319, 168), EXITCURSOR_S, 1800);
+ _southExit.setDetails(Rect(0, 160, 319, 168), EXITCURSOR_S, 1800);
_background.setDetails(Rect(0, 0, 320, 200), -1, -1, -1, -1, 1, NULL);
_lever.postInit();
@@ -11458,50 +11331,48 @@ void Scene1800::postInit(SceneObjectList *OwnerList) {
R2_GLOBALS._walkRegions.disableRegion(10);
R2_GLOBALS._walkRegions.disableRegion(11);
}
+ } else if (R2_GLOBALS._player._characterIndex == R2_QUINN) {
+ R2_GLOBALS._player.setPosition(Common::Point(140, 160));
+ _companion.setPosition(Common::Point(180, 160));
} else {
- if (R2_GLOBALS._player._characterIndex == R2_QUINN) {
- R2_GLOBALS._player.setPosition(Common::Point(140, 160));
- _companion.setPosition(Common::Point(180, 160));
- } else {
- R2_GLOBALS._player.setPosition(Common::Point(180, 160));
- _companion.setPosition(Common::Point(140, 160));
- }
+ R2_GLOBALS._player.setPosition(Common::Point(180, 160));
+ _companion.setPosition(Common::Point(140, 160));
}
- _actor1.postInit();
- _actor1.fixPriority(10);
+ _playerShadow.postInit();
+ _playerShadow.fixPriority(10);
if (R2_GLOBALS._player._characterIndex == R2_QUINN)
- _actor1.setVisage(1111);
+ _playerShadow.setVisage(1111);
else
- _actor1.setVisage(1110);
+ _playerShadow.setVisage(1110);
- _actor1._effect = 5;
- _actor1._field9C = _field312;
+ _playerShadow._effect = EFFECT_SHADOW_MAP;
+ _playerShadow._shadowMap = _shadowPaletteMap;
- R2_GLOBALS._player._linkedActor = &_actor1;
+ R2_GLOBALS._player._linkedActor = &_playerShadow;
- _actor3.postInit();
- _actor3.fixPriority(10);
+ _companionShadow.postInit();
+ _companionShadow.fixPriority(10);
if (R2_GLOBALS._player._characterIndex == R2_QUINN)
- _actor3.setVisage(1110);
+ _companionShadow.setVisage(1110);
else
- _actor3.setVisage(1111);
+ _companionShadow.setVisage(1111);
- _actor3._effect = 5;
- _actor3._field9C = _field312;
+ _companionShadow._effect = EFFECT_SHADOW_MAP;
+ _companionShadow._shadowMap = _shadowPaletteMap;
- _companion._linkedActor = &_actor3;
+ _companion._linkedActor = &_companionShadow;
R2_GLOBALS._player._characterScene[R2_QUINN] = 1800;
R2_GLOBALS._player._characterScene[R2_SEEKER] = 1800;
- _item2.setDetails(Rect(128, 95, 190, 135), 1800, 10, -1, -1, 1, NULL);
- _item1.setDetails(Rect(95, 3, 223, 135), 1800, 0, -1, -1, 1, NULL);
+ _elevatorContents.setDetails(Rect(128, 95, 190, 135), 1800, 10, -1, -1, 1, NULL);
+ _elevator.setDetails(Rect(95, 3, 223, 135), 1800, 0, -1, -1, 1, NULL);
// Original was calling _item3.setDetails(Rect(1800, 11, 24, 23), 25, -1, -1, -1, 1, NULL);
// This is *wrong*. The following statement is a wild guess based on good common sense
- _item3.setDetails(11, 1800, 23, 24, 25);
- _item4.setDetails(Rect(0, 0, 320, 200), 1800, 17, -1, 19, 1, NULL);
+ _surface.setDetails(11, 1800, 23, 24, 25);
+ _secBackground.setDetails(Rect(0, 0, 320, 200), 1800, 17, -1, 19, 1, NULL);
R2_GLOBALS._player.disableControl();
if (R2_GLOBALS._player._oldCharacterScene[R2_GLOBALS._player._characterIndex] == 1800) {
@@ -11520,23 +11391,19 @@ void Scene1800::postInit(SceneObjectList *OwnerList) {
_sceneMode = 1815;
setAction(&_sequenceManager, this, 1815, &R2_GLOBALS._player, &_companion, &_leftDoor, NULL);
}
+ } else if (R2_GLOBALS._player._characterIndex == R2_QUINN) {
+ _sceneMode = 1816;
+ setAction(&_sequenceManager, this, 1816, &R2_GLOBALS._player, &_companion, &_rightDoor, NULL);
} else {
- if (R2_GLOBALS._player._characterIndex == R2_QUINN) {
- _sceneMode = 1816;
- setAction(&_sequenceManager, this, 1816, &R2_GLOBALS._player, &_companion, &_rightDoor, NULL);
- } else {
- _sceneMode = 1817;
- setAction(&_sequenceManager, this, 1817, &R2_GLOBALS._player, &_companion, &_rightDoor, NULL);
- }
+ _sceneMode = 1817;
+ setAction(&_sequenceManager, this, 1817, &R2_GLOBALS._player, &_companion, &_rightDoor, NULL);
}
+ } else if (R2_GLOBALS._player._characterIndex == R2_QUINN) {
+ _sceneMode = 1800;
+ setAction(&_sequenceManager, this, 1800, &R2_GLOBALS._player, &_companion, NULL);
} else {
- if (R2_GLOBALS._player._characterIndex == R2_QUINN) {
- _sceneMode = 1800;
- setAction(&_sequenceManager, this, 1800, &R2_GLOBALS._player, &_companion, NULL);
- } else {
- _sceneMode = 1801;
- setAction(&_sequenceManager, this, 1801, &R2_GLOBALS._player, &_companion, NULL);
- }
+ _sceneMode = 1801;
+ setAction(&_sequenceManager, this, 1801, &R2_GLOBALS._player, &_companion, NULL);
}
R2_GLOBALS._player._oldCharacterScene[R2_QUINN] = 1800;
@@ -11583,7 +11450,7 @@ void Scene1800::signal() {
_sceneMode = 14;
R2_GLOBALS._events.setCursor(CURSOR_CROSSHAIRS);
R2_GLOBALS._player.setup(1801, 7, 1);
- R2_GLOBALS._player.animate(ANIM_MODE_8, NULL);
+ R2_GLOBALS._player.animate(ANIM_MODE_8, 0, NULL);
_stripManager.start(550, this);
break;
case 14:
@@ -11597,6 +11464,29 @@ void Scene1800::signal() {
R2_GLOBALS._player.animate(ANIM_MODE_1, NULL);
R2_GLOBALS._player.enableControl(CURSOR_USE);
break;
+ // Cases 23 and 24 have been added to fix missing hardcoded logic in the original,
+ // when Seeker tries to open the door
+ case 23:
+ _sceneMode = 24;
+ R2_GLOBALS._events.setCursor(CURSOR_CROSSHAIRS);
+ R2_GLOBALS._player.setup(1801, 5, 1);
+ R2_GLOBALS._player.animate(ANIM_MODE_8, 0, NULL);
+ _stripManager.start(550, this);
+ break;
+ case 24:
+ R2_GLOBALS._player.disableControl();
+ R2_GLOBALS._player.setup(1507, 4, 1);
+ R2_GLOBALS._player.animate(ANIM_MODE_1, NULL);
+ R2_GLOBALS._player.enableControl(CURSOR_USE);
+
+ _doors.setup(1801, 3, 1);
+ _doors.setPosition(Common::Point(160, 139));
+ _doors.setDetails(1800, 6, -1, -1, 1, (SceneItem *) NULL);
+ _doors.show();
+
+ R2_GLOBALS._player._position.y += 2;
+ R2_GLOBALS._player.show();
+ break;
case 1800:
R2_GLOBALS._walkRegions.disableRegion(8);
if (R2_GLOBALS.getFlag(63))
@@ -11611,16 +11501,7 @@ void Scene1800::signal() {
R2_GLOBALS._walkRegions.disableRegion(10);
R2_GLOBALS._walkRegions.disableRegion(11);
R2_GLOBALS.setFlag(63);
-
- // The following check is completely dumb.
- // Either an original bug, or dead code.
- if (R2_GLOBALS.getFlag(63)) {
- R2_GLOBALS._player.enableControl(CURSOR_WALK);
- } else {
- _sceneMode = 10;
- R2_GLOBALS._events.setCursor(CURSOR_CROSSHAIRS);
- _stripManager.start(545, this);
- }
+ R2_GLOBALS._player.enableControl(CURSOR_WALK);
break;
case 1802:
R2_GLOBALS.clearFlag(14);
@@ -11645,6 +11526,11 @@ void Scene1800::signal() {
_sceneMode = 13;
R2_GLOBALS._player.animate(ANIM_MODE_5, this);
break;
+ // Case 1813 has been added to fix Seeker missing animation in the original game
+ case 1813:
+ _sceneMode = 23;
+ R2_GLOBALS._player.animate(ANIM_MODE_5, this);
+ break;
case 1814:
// No break on purpose
case 1815:
@@ -11690,7 +11576,7 @@ bool Scene1850::Button::startAction(CursorType action, Event &event) {
else
scene->setAction(&scene->_sequenceManager1, scene, 1852, &R2_GLOBALS._player, NULL);
} else if (R2_GLOBALS.getFlag(30)) {
- scene->_field41E = 1;
+ scene->_seqNumber = 1;
scene->_sceneMode = 1860;
if (R2_GLOBALS.getFlag(32))
@@ -11732,9 +11618,9 @@ bool Scene1850::Robot::startAction(CursorType action, Event &event) {
break;
case CURSOR_LOOK:
if (R2_GLOBALS.getFlag(34))
- SceneItem::display(1850, 2, 0, 280, 1, 160, 9, 1, 2, 20, 7, 7, -999);
+ SceneItem::display(1850, 2, 0, 280, 1, 160, 9, 1, 2, 20, 7, 7, LIST_END);
else
- SceneItem::display(1850, 1, 0, 280, 1, 160, 9, 1, 2, 20, 7, 7, -999);
+ SceneItem::display(1850, 1, 0, 280, 1, 160, 9, 1, 2, 20, 7, 7, LIST_END);
return true;
break;
@@ -11754,12 +11640,14 @@ bool Scene1850::Robot::startAction(CursorType action, Event &event) {
} else if (R2_GLOBALS.getFlag(30)) {
R2_GLOBALS._player.disableControl();
scene->_sceneMode = 1875;
- scene->_actor2.postInit();
+ scene->_airbag.postInit();
if (R2_GLOBALS.getFlag(32))
- scene->setAction(&scene->_sequenceManager1, scene, 1876, &R2_GLOBALS._player, &scene->_actor2, NULL);
+ scene->setAction(&scene->_sequenceManager1, scene, 1876,
+ &R2_GLOBALS._player, &scene->_airbag, NULL);
else
- scene->setAction(&scene->_sequenceManager1, scene, 1875, &R2_GLOBALS._player, &scene->_actor2, NULL);
+ scene->setAction(&scene->_sequenceManager1, scene, 1875,
+ &R2_GLOBALS._player, &scene->_airbag, NULL);
return true;
} else if (R2_GLOBALS.getFlag(70)) {
@@ -11781,7 +11669,8 @@ bool Scene1850::Robot::startAction(CursorType action, Event &event) {
R2_GLOBALS._player.disableControl();
scene->_sceneMode = 1878;
- scene->setAction(&scene->_sequenceManager1, scene, 1878, &R2_GLOBALS._player, &scene->_robot, &scene->_actor2, NULL);
+ scene->setAction(&scene->_sequenceManager1, scene, 1878, &R2_GLOBALS._player,
+ &scene->_robot, &scene->_airbag, NULL);
}
return true;
@@ -11792,20 +11681,20 @@ bool Scene1850::Robot::startAction(CursorType action, Event &event) {
}
}
-bool Scene1850::Actor6::startAction(CursorType action, Event &event) {
+bool Scene1850::Door::startAction(CursorType action, Event &event) {
if (action != CURSOR_USE)
return SceneHotspot::startAction(action, event);
- Scene1850 *scene = (Scene1850 *)R2_GLOBALS._sceneManager._scene;
-
if (R2_GLOBALS.getFlag(32)) {
- SceneItem::display(3240, 4, 0, 280, 1, 160, 9, 1, 2, 20, 7, 7, -999);
+ SceneItem::display(3240, 4, 0, 280, 1, 160, 9, 1, 2, 20, 7, 7, LIST_END);
return true;
}
+ Scene1850 *scene = (Scene1850 *)R2_GLOBALS._sceneManager._scene;
+
R2_GLOBALS._player.disableControl();
- if (scene->_field412 == 1851)
- R2_GLOBALS._player._effect = 1;
+ if (scene->_sceneMode == 1851)
+ R2_GLOBALS._player._effect = EFFECT_SHADED;
if (_position.x >= 160)
R2_GLOBALS.setFlag(29);
@@ -11814,9 +11703,9 @@ bool Scene1850::Actor6::startAction(CursorType action, Event &event) {
if ((R2_GLOBALS._player._characterIndex == R2_SEEKER) && (R2_GLOBALS.getFlag(30))) {
if (_position.x >= 160)
- scene->_field41E = 3;
+ scene->_seqNumber = 3;
else
- scene->_field41E = 2;
+ scene->_seqNumber = 2;
scene->_sceneMode = 1860;
@@ -11858,23 +11747,23 @@ bool Scene1850::DisplayScreen::startAction(CursorType action, Event &event) {
/*------------------------------------------------------------------------*/
Scene1850::Scene1850() {
- _field412 = 0;
- _field414 = 0;
- _field416 = 0;
- _field418 = 0;
- _field41E = 0;
+ _sceneMode = 0;
+ _shadeCountdown = 0;
+ _shadeDirection = 0;
+ _shadeChanging = false;
+ _seqNumber = 0;
}
void Scene1850::synchronize(Serializer &s) {
SceneExt::synchronize(s);
- s.syncAsSint16LE(_field412);
- s.syncAsSint16LE(_field414);
- s.syncAsSint16LE(_field416);
- s.syncAsSint16LE(_field418);
- s.syncAsSint16LE(_field41E);
- s.syncAsSint16LE(_field41A.x);
- s.syncAsSint16LE(_field41A.y);
+ s.syncAsSint16LE(_sceneMode);
+ s.syncAsSint16LE(_shadeCountdown);
+ s.syncAsSint16LE(_shadeDirection);
+ s.syncAsSint16LE(_shadeChanging);
+ s.syncAsSint16LE(_seqNumber);
+ s.syncAsSint16LE(_playerDest.x);
+ s.syncAsSint16LE(_playerDest.y);
}
void Scene1850::postInit(SceneObjectList *OwnerList) {
@@ -11886,10 +11775,10 @@ void Scene1850::postInit(SceneObjectList *OwnerList) {
_palette1.loadPalette(0);
if (R2_GLOBALS.getFlag(31)) {
- _field412 = 1850;
+ _sceneMode = 1850;
g_globals->_scenePalette.loadPalette(1850);
} else {
- _field412 = 1851;
+ _sceneMode = 1851;
g_globals->_scenePalette.loadPalette(1851);
}
@@ -11901,9 +11790,9 @@ void Scene1850::postInit(SceneObjectList *OwnerList) {
_stripManager.addSpeaker(&_quinnSpeaker);
_stripManager.addSpeaker(&_seekerSpeaker);
- _field418 = 0;
- _field41E = 0;
- _field41A = Common::Point(0, 0);
+ _shadeChanging = false;
+ _seqNumber = 0;
+ _playerDest = Common::Point(0, 0);
R2_GLOBALS._player._characterScene[R2_QUINN] = 1850;
R2_GLOBALS._player._characterScene[R2_SEEKER] = 1850;
@@ -11953,8 +11842,8 @@ void Scene1850::postInit(SceneObjectList *OwnerList) {
}
if (R2_GLOBALS._player._oldCharacterScene[R2_GLOBALS._player._characterIndex] == 1850) {
- R2_GLOBALS._player._effect = 6;
- _companion._effect = 6;
+ R2_GLOBALS._player._effect = EFFECT_SHADED2;
+ _companion._effect = EFFECT_SHADED2;
if (R2_GLOBALS.getFlag(31)) {
R2_GLOBALS._player._shade = 0;
_companion._shade = 0;
@@ -11964,21 +11853,21 @@ void Scene1850::postInit(SceneObjectList *OwnerList) {
}
if (R2_INVENTORY.getObjectScene(R2_AIRBAG) == 1850) {
- _actor2.postInit();
+ _airbag.postInit();
if (R2_GLOBALS.getFlag(34)) {
- _actor2.setup(1851, 4, 2);
- _actor2.fixPriority(114);
+ _airbag.setup(1851, 4, 2);
+ _airbag.fixPriority(114);
} else {
- _actor2.setup(1851, 4, 1);
+ _airbag.setup(1851, 4, 1);
}
- _actor2.setPosition(Common::Point(179, 113));
+ _airbag.setPosition(Common::Point(179, 113));
if ((_robot._strip == 1) && (_robot._frame == 3)){
- _actor2.hide();
+ _airbag.hide();
}
- _actor2.setDetails(1850, 6, -1, -1, 1, (SceneItem *) NULL);
+ _airbag.setDetails(1850, 6, -1, -1, 1, (SceneItem *) NULL);
}
if (R2_GLOBALS._player._characterIndex == R2_QUINN) {
@@ -11986,89 +11875,61 @@ void Scene1850::postInit(SceneObjectList *OwnerList) {
R2_GLOBALS._player.setVisage(1511);
_companion.setVisage(1508);
- _actor3.postInit();
- _actor3.setup(1853, 3, 1);
- _actor3.setPosition(Common::Point(122, 113));
- _actor3.fixPriority(114);
- _actor3._effect = 6;
-
- // Totally useless test
- if (R2_GLOBALS._player._characterIndex == R2_QUINN) {
- _actor3.setDetails(1850, 28, -1, -1, 2, (SceneItem *) NULL);
- } else {
- // And the associated dead code
- _actor3.setDetails(1850, 30, -1, -1, 2, (SceneItem *) NULL);
- }
+ _screen.postInit();
+ _screen.setup(1853, 3, 1);
+ _screen.setPosition(Common::Point(122, 113));
+ _screen.fixPriority(114);
+ _screen._effect = EFFECT_SHADED2;
+ _screen.setDetails(1850, 28, -1, -1, 2, (SceneItem *) NULL);
- _actor4.postInit();
- _actor4.setup(1853, 3, 2);
- _actor4.setPosition(Common::Point(139, 111));
- _actor4.fixPriority(114);
- _actor4._effect = 6;
-
- // Still totally useless test
- if (R2_GLOBALS._player._characterIndex == R2_QUINN) {
- _actor4.setDetails(1850, 29, -1, -1, 2, (SceneItem *) NULL);
- } else {
- // Another piece of dead code
- _actor4.setDetails(1850, 28, -1, -1, 2, (SceneItem *) NULL);
- }
+ _helmet.postInit();
+ _helmet.setup(1853, 3, 2);
+ _helmet.setPosition(Common::Point(139, 111));
+ _helmet.fixPriority(114);
+ _helmet._effect = EFFECT_SHADED2;
+ _helmet.setDetails(1850, 29, -1, -1, 2, (SceneItem *) NULL);
if (R2_GLOBALS.getFlag(31)) {
- _actor3._shade = 0;
- _actor4._shade = 0;
+ _screen._shade = 0;
+ _helmet._shade = 0;
} else {
- _actor3._shade = 6;
- _actor4._shade = 6;
+ _screen._shade = 6;
+ _helmet._shade = 6;
}
} else {
R2_GLOBALS._player.setVisage(1500);
_companion.setVisage(1505);
}
- } else { // Not Quinn
- if (R2_GLOBALS.getFlag(32)) {
- R2_GLOBALS._player.setVisage(1508);
- _companion.setVisage(1511);
-
- _actor3.postInit();
- _actor3.setup(1853, 3, 1);
- _actor3.setPosition(Common::Point(122, 113));
- _actor3.fixPriority(114);
- _actor3._effect = 6;
-
- // Totally useless test
- if (R2_GLOBALS._player._characterIndex == R2_QUINN) {
- // Dead code
- _actor3.setDetails(1850, 28, -1, -1, 2, (SceneItem *) NULL);
- } else {
- _actor3.setDetails(1850, 30, -1, -1, 2, (SceneItem *) NULL);
- }
-
- _actor4.postInit();
- _actor4.setup(1853, 3, 2);
- _actor4.setPosition(Common::Point(139, 111));
- _actor4.fixPriority(114);
- _actor4._effect = 6;
-
- // Again, useless test
- if (R2_GLOBALS._player._characterIndex == R2_QUINN) {
- // and dead code
- _actor4.setDetails(1850, 29, -1, -1, 1, (SceneItem *) NULL);
- } else {
- _actor4.setDetails(1850, 28, -1, -1, 1, (SceneItem *) NULL);
- }
-
- if (R2_GLOBALS.getFlag(31)) {
- _actor3._shade = 0;
- _actor4._shade = 0;
- } else {
- _actor3._shade = 6;
- _actor4._shade = 6;
- }
+ } else if (R2_GLOBALS.getFlag(32)) {
+ // Not Quinn, flag 32
+ R2_GLOBALS._player.setVisage(1508);
+ _companion.setVisage(1511);
+
+ _screen.postInit();
+ _screen.setup(1853, 3, 1);
+ _screen.setPosition(Common::Point(122, 113));
+ _screen.fixPriority(114);
+ _screen._effect = EFFECT_SHADED2;
+ _screen.setDetails(1850, 30, -1, -1, 2, (SceneItem *) NULL);
+
+ _helmet.postInit();
+ _helmet.setup(1853, 3, 2);
+ _helmet.setPosition(Common::Point(139, 111));
+ _helmet.fixPriority(114);
+ _helmet._effect = EFFECT_SHADED2;
+ _helmet.setDetails(1850, 28, -1, -1, 1, (SceneItem *) NULL);
+
+ if (R2_GLOBALS.getFlag(31)) {
+ _screen._shade = 0;
+ _helmet._shade = 0;
} else {
- R2_GLOBALS._player.setVisage(1505);
- _companion.setVisage(1500);
+ _screen._shade = 6;
+ _helmet._shade = 6;
}
+ } else {
+ // Not Quinn, nor flag 32
+ R2_GLOBALS._player.setVisage(1505);
+ _companion.setVisage(1500);
}
R2_GLOBALS._player.animate(ANIM_MODE_1, NULL);
@@ -12106,8 +11967,8 @@ void Scene1850::postInit(SceneObjectList *OwnerList) {
R2_GLOBALS._player.enableControl();
} else { // R2_GLOBALS._player._oldCharacterScene[R2_GLOBALS._player._characterIndex] != 1850
- R2_GLOBALS._player._effect = 1;
- _companion._effect = 1;
+ R2_GLOBALS._player._effect = EFFECT_SHADED;
+ _companion._effect = EFFECT_SHADED;
R2_GLOBALS._player.disableControl();
_sceneMode = 10;
if (R2_GLOBALS._player._characterIndex == R2_QUINN) {
@@ -12173,10 +12034,10 @@ void Scene1850::remove() {
void Scene1850::signal() {
switch (_sceneMode) {
case 10:
- R2_GLOBALS._player._effect = 6;
+ R2_GLOBALS._player._effect = EFFECT_SHADED2;
R2_GLOBALS._player._shade = 6;
- _companion._effect = 6;
+ _companion._effect = EFFECT_SHADED2;
_companion._shade = 6;
R2_GLOBALS._walkRegions.disableRegion(5);
@@ -12199,7 +12060,8 @@ void Scene1850::signal() {
break;
case 16:
_sceneMode = 1870;
- setAction(&_sequenceManager1, this, 1870, &R2_GLOBALS._player, &_companion, &_actor3, &_actor4, NULL);
+ setAction(&_sequenceManager1, this, 1870, &R2_GLOBALS._player, &_companion,
+ &_screen, &_helmet, NULL);
break;
case 20:
R2_GLOBALS._player.enableControl(CURSOR_TALK);
@@ -12207,7 +12069,8 @@ void Scene1850::signal() {
case 21:
R2_GLOBALS._player.disableControl();
_sceneMode = 1877;
- setAction(&_sequenceManager1, this, 1877, &R2_GLOBALS._player, &_companion, &_robot, NULL);
+ setAction(&_sequenceManager1, this, 1877, &R2_GLOBALS._player, &_companion,
+ &_robot, NULL);
break;
case 30:
R2_GLOBALS._player.disableControl();
@@ -12217,17 +12080,17 @@ void Scene1850::signal() {
case 1852:
// No break on purpose:
case 1853:
- if (_field412 == 1851) {
+ if (_sceneMode == 1851) { // At this point, SceneMode can't be equal to 1851 => dead code
R2_GLOBALS.setFlag(31);
_palette1.loadPalette(1850);
- _field412 = 1850;
+ _sceneMode = 1850;
} else {
R2_GLOBALS.clearFlag(31);
_palette1.loadPalette(1851);
- _field412 = 1851;
+ _sceneMode = 1851;
}
- _field418 = 1;
+ _shadeChanging = true;
if (R2_GLOBALS.getFlag(30)) {
_displayScreen.setAction(&_sequenceManager2, NULL, 1867, &_displayScreen, NULL);
} else if (R2_GLOBALS.getFlag(34)) {
@@ -12243,12 +12106,13 @@ void Scene1850::signal() {
R2_GLOBALS.setFlag(34);
R2_GLOBALS._walkRegions.disableRegion(2);
- _actor2.postInit();
- _actor2.setDetails(1850, 6, -1, -1, 5, &_robot);
+ _airbag.postInit();
+ _airbag.setDetails(1850, 6, -1, -1, 5, &_robot);
_sceneMode = 1879;
- _displayScreen.setAction(&_sequenceManager2, this, 1879, &_robot, &_displayScreen, &_actor2, NULL);
+ _displayScreen.setAction(&_sequenceManager2, this, 1879, &_robot,
+ &_displayScreen, &_airbag, NULL);
} else {
_displayScreen.setAction(&_sequenceManager2, NULL, 1867, &_displayScreen, NULL);
}
@@ -12258,12 +12122,12 @@ void Scene1850::signal() {
else
R2_GLOBALS._scenePalette.addFader(_palette1._palette, 256, 5, this);
- if (_field412 == 1851)
- _field416 = -20;
+ if (_sceneMode == 1851)
+ _shadeDirection = -20;
else
- _field416 = 20;
+ _shadeDirection = 20;
- _field414 = 20;
+ _shadeCountdown = 20;
if (R2_GLOBALS._player._characterIndex == R2_QUINN) {
if (_sceneMode == 1879)
@@ -12309,16 +12173,16 @@ void Scene1850::signal() {
_stripManager.start(575, this);
break;
case 1860:
- if (_field41A.x != 0) {
+ if (_playerDest.x != 0) {
R2_GLOBALS._player.enableControl();
PlayerMover *mover = new PlayerMover();
- R2_GLOBALS._player.addMover(mover, &_field41A, this);
+ R2_GLOBALS._player.addMover(mover, &_playerDest, this);
- _field41A = Common::Point(0, 0);
+ _playerDest = Common::Point(0, 0);
}
- switch (_field41E) {
+ switch (_seqNumber) {
case 1:
_sceneMode = 1853;
if (R2_GLOBALS.getFlag(32)) {
@@ -12339,7 +12203,7 @@ void Scene1850::signal() {
break;
}
- _field41E = 0;
+ _seqNumber = 0;
break;
case 1870:
R2_GLOBALS._walkRegions.disableRegion(5);
@@ -12354,36 +12218,36 @@ void Scene1850::signal() {
_stripManager.start(561, this);
break;
case 1877:
- _actor3.postInit();
- _actor3._effect = 6;
+ _screen.postInit();
+ _screen._effect = EFFECT_SHADED2;
if (R2_GLOBALS._player._characterIndex == R2_QUINN) {
- _actor3.setDetails(1850, 28, -1, -1, 2, (SceneItem *)NULL);
+ _screen.setDetails(1850, 28, -1, -1, 2, (SceneItem *)NULL);
} else {
- _actor3.setDetails(1850, 30, -1, -1, 2, (SceneItem *)NULL);
+ _screen.setDetails(1850, 30, -1, -1, 2, (SceneItem *)NULL);
}
- _actor4.postInit();
- _actor4._effect = 6;
+ _helmet.postInit();
+ _helmet._effect = EFFECT_SHADED2;
if (R2_GLOBALS._player._characterIndex == R2_QUINN) {
- _actor4.setDetails(1850, 29, -1, -1, 2, (SceneItem *)NULL);
+ _helmet.setDetails(1850, 29, -1, -1, 2, (SceneItem *)NULL);
} else {
- _actor4.setDetails(1850, 28, -1, -1, 2, (SceneItem *)NULL);
+ _helmet.setDetails(1850, 28, -1, -1, 2, (SceneItem *)NULL);
}
if (R2_GLOBALS.getFlag(31)) {
- _actor3._shade = 0;
- _actor4._shade = 0;
+ _screen._shade = 0;
+ _helmet._shade = 0;
} else {
- _actor3._shade = 6;
- _actor4._shade = 6;
+ _screen._shade = 6;
+ _helmet._shade = 6;
}
R2_GLOBALS.clearFlag(30);
_sceneMode = 15;
- setAction(&_sequenceManager1, this, 1869, &R2_GLOBALS._player, &_actor3, NULL);
- _companion.setAction(&_sequenceManager2, this, 1868, &_companion, &_actor4, NULL);
+ setAction(&_sequenceManager1, this, 1869, &R2_GLOBALS._player, &_screen, NULL);
+ _companion.setAction(&_sequenceManager2, this, 1868, &_companion, &_helmet, NULL);
break;
case 1878:
R2_INVENTORY.setObjectScene(R2_REBREATHER_TANK, 1850);
@@ -12409,8 +12273,8 @@ void Scene1850::signal() {
void Scene1850::process(Event &event) {
if ( (event.eventType == EVENT_BUTTON_DOWN) && (R2_GLOBALS._events.getCursor() == CURSOR_WALK)
- && (R2_GLOBALS._player._characterIndex == R2_SEEKER) && (R2_GLOBALS.getFlag(30))) {
- _field41A = event.mousePos;
+ && (R2_GLOBALS._player._characterIndex == R2_SEEKER) && (R2_GLOBALS.getFlag(30))) {
+ _playerDest = event.mousePos;
R2_GLOBALS._player.disableControl();
_sceneMode = 1860;
if (R2_GLOBALS.getFlag(32)) {
@@ -12418,7 +12282,7 @@ void Scene1850::process(Event &event) {
} else {
setAction(&_sequenceManager1, this, 1859, &R2_GLOBALS._player, &_robot, NULL);
}
- R2_GLOBALS.clearFlag(32);
+ R2_GLOBALS.clearFlag(30);
event.handled = true;
}
@@ -12426,35 +12290,35 @@ void Scene1850::process(Event &event) {
}
void Scene1850::dispatch() {
- if (_field418 != 0) {
- _field414--;
- if (_field414 == 0)
- _field418 = 0;
+ if (_shadeChanging) {
+ _shadeCountdown--;
+ if (_shadeCountdown == 0)
+ _shadeChanging = false;
- if (_field416 >= 0) {
- R2_GLOBALS._player._shade = (_field414 * 6) / _field416;
+ if (_shadeDirection >= 0) {
+ R2_GLOBALS._player._shade = (_shadeCountdown * 6) / _shadeDirection;
} else {
- R2_GLOBALS._player._shade = ((_field414 * 6) / _field416) + 6;
+ R2_GLOBALS._player._shade = ((_shadeCountdown * 6) / _shadeDirection) + 6;
}
R2_GLOBALS._player._flags |= OBJFLAG_PANES;
_companion._shade = R2_GLOBALS._player._shade;
_companion._flags |= OBJFLAG_PANES;
- _actor3._shade = R2_GLOBALS._player._shade;
- _actor3._flags |= OBJFLAG_PANES;
+ _screen._shade = R2_GLOBALS._player._shade;
+ _screen._flags |= OBJFLAG_PANES;
- _actor4._shade = R2_GLOBALS._player._shade;
- _actor4._flags |= OBJFLAG_PANES;
+ _helmet._shade = R2_GLOBALS._player._shade;
+ _helmet._flags |= OBJFLAG_PANES;
}
if (R2_GLOBALS.getFlag(32)) {
- _actor3.setPosition(Common::Point(_displayScreen._position.x - 37, _displayScreen._position.y - 71));
- _actor4.setPosition(Common::Point(_displayScreen._position.x - 20, _displayScreen._position.y - 73));
+ _screen.setPosition(Common::Point(_displayScreen._position.x - 37, _displayScreen._position.y - 71));
+ _helmet.setPosition(Common::Point(_displayScreen._position.x - 20, _displayScreen._position.y - 73));
}
if (R2_INVENTORY.getObjectScene(R2_AIRBAG) == 1850) {
- _actor2.setPosition(Common::Point(_displayScreen._position.x + 20, _displayScreen._position.y - 71));
+ _airbag.setPosition(Common::Point(_displayScreen._position.x + 20, _displayScreen._position.y - 71));
}
Scene::dispatch();
@@ -12485,7 +12349,7 @@ void Scene1875::Button::doButtonPress() {
int newFrameNumber;
switch (_buttonId) {
case 3:
- if ((scene->_actor1._frame == 1) && (scene->_button1._strip == 2)) {
+ if ((scene->_map._frame == 1) && (scene->_button1._strip == 2)) {
R2_GLOBALS._player.disableControl();
R2_GLOBALS._events.setCursor(CURSOR_CROSSHAIRS);
scene->_sceneMode = 10;
@@ -12493,21 +12357,21 @@ void Scene1875::Button::doButtonPress() {
} else {
R2_GLOBALS._player.disableControl();
scene->_sceneMode = 1890;
- scene->_actor2.postInit();
- scene->setAction(&scene->_sequenceManager, scene, 1890, &scene->_actor2, NULL);
+ scene->_rimPosition.postInit();
+ scene->setAction(&scene->_sequenceManager, scene, 1890, &scene->_rimPosition, NULL);
}
break;
case 4:
- newFrameNumber = scene->_actor1._frame + 1;
+ newFrameNumber = scene->_map._frame + 1;
if (newFrameNumber > 6)
newFrameNumber = 1;
- scene->_actor1.setFrame(newFrameNumber);
+ scene->_map.setFrame(newFrameNumber);
break;
case 5:
- newFrameNumber = scene->_actor1._frame - 1;
+ newFrameNumber = scene->_map._frame - 1;
if (newFrameNumber < 1)
newFrameNumber = 6;
- scene->_actor1.setFrame(newFrameNumber);
+ scene->_map.setFrame(newFrameNumber);
break;
default:
break;
@@ -12555,7 +12419,7 @@ void Scene1875::Button::process(Event &event) {
Scene1875 *scene = (Scene1875 *)R2_GLOBALS._sceneManager._scene;
- if ((event.eventType == EVENT_BUTTON_DOWN) && (R2_GLOBALS._events.getCursor() == CURSOR_USE)
+ if ((event.eventType == EVENT_BUTTON_DOWN) && (R2_GLOBALS._events.getCursor() == CURSOR_USE)
&& (_bounds.contains(event.mousePos)) && !_buttonDown) {
setStrip(2);
switch (_buttonId) {
@@ -12600,9 +12464,9 @@ void Scene1875::postInit(SceneObjectList *OwnerList) {
_button4.initButton(4);
_button5.initButton(5);
- _actor1.postInit();
- _actor1.setup(1855, 4, 1);
- _actor1.setPosition(Common::Point(160, 116));
+ _map.postInit();
+ _map.setup(1855, 4, 1);
+ _map.setPosition(Common::Point(160, 116));
R2_GLOBALS._player.postInit();
R2_GLOBALS._player.hide();
@@ -12611,19 +12475,19 @@ void Scene1875::postInit(SceneObjectList *OwnerList) {
R2_GLOBALS._sound1.play(122);
R2_GLOBALS._player.disableControl();
_sceneMode = 11;
- _actor2.postInit();
- setAction(&_sequenceManager, this, 1892, &_actor2, NULL);
+ _rimPosition.postInit();
+ setAction(&_sequenceManager, this, 1892, &_rimPosition, NULL);
} else {
if (R2_GLOBALS._sceneManager._previousScene == 3150) {
R2_GLOBALS._sound1.play(116);
- }
+ }
R2_GLOBALS._player.enableControl();
R2_GLOBALS._player._canWalk = false;
}
- _item2.setDetails(Rect(43, 14, 275, 122), 1875, 9, 1, -1, 1, NULL);
- _item1.setDetails(Rect(0, 0, 320, 200), 1875, 3, -1, -1, 1, NULL);
+ _screen.setDetails(Rect(43, 14, 275, 122), 1875, 9, 1, -1, 1, NULL);
+ _background.setDetails(Rect(0, 0, 320, 200), 1875, 3, -1, -1, 1, NULL);
R2_GLOBALS._player._characterScene[R2_QUINN] = 1875;
R2_GLOBALS._player._characterScene[R2_SEEKER] = 1875;
@@ -12636,8 +12500,8 @@ void Scene1875::signal() {
case 10:
R2_GLOBALS._player.disableControl();
_sceneMode = 1891;
- _actor2.postInit();
- setAction(&_sequenceManager, this, 1891, &_actor2, NULL);
+ _rimPosition.postInit();
+ setAction(&_sequenceManager, this, 1891, &_rimPosition, NULL);
break;
case 11:
R2_GLOBALS._events.setCursor(CURSOR_CROSSHAIRS);
@@ -12645,7 +12509,7 @@ void Scene1875::signal() {
_stripManager.start(577, this);
break;
case 1890:
- _actor2.remove();
+ _rimPosition.remove();
R2_GLOBALS._player.enableControl();
R2_GLOBALS._player._canWalk = false;
break;
@@ -12680,8 +12544,6 @@ void Scene1875::process(Event &event) {
*--------------------------------------------------------------------------*/
bool Scene1900::LiftDoor::startAction(CursorType action, Event &event) {
- Scene1900 *scene = (Scene1900 *)R2_GLOBALS._sceneManager._scene;
-
if (action != CURSOR_USE)
return SceneActor::startAction(action, event);
@@ -12692,6 +12554,8 @@ bool Scene1900::LiftDoor::startAction(CursorType action, Event &event) {
return true;
}
+ Scene1900 *scene = (Scene1900 *)R2_GLOBALS._sceneManager._scene;
+
R2_GLOBALS._player.enableControl(CURSOR_USE);
if (_position.x >= 160) {
@@ -12788,23 +12652,23 @@ void Scene1900::postInit(SceneObjectList *OwnerList) {
_rightDoor.setDetails(1900, 0, 1, -1, 1, (SceneItem *) NULL);
if (R2_GLOBALS._sceneManager._previousScene != 1875) {
- _object1.postInit();
- _object1.setup(1945, 6, 1);
- _object1.setPosition(Common::Point(96, 109));
- _object1.fixPriority(80);
+ _leftDoorFrame.postInit();
+ _leftDoorFrame.setup(1945, 6, 1);
+ _leftDoorFrame.setPosition(Common::Point(96, 109));
+ _leftDoorFrame.fixPriority(80);
- _object2.postInit();
- _object2.setup(1945, 6, 2);
- _object2.setPosition(Common::Point(223, 109));
- _object2.fixPriority(80);
+ _rightDoorFrame.postInit();
+ _rightDoorFrame.setup(1945, 6, 2);
+ _rightDoorFrame.setPosition(Common::Point(223, 109));
+ _rightDoorFrame.fixPriority(80);
}
if (R2_GLOBALS._player._oldCharacterScene[R2_GLOBALS._player._characterIndex] == 1875) {
R2_GLOBALS._player._characterIndex = R2_QUINN;
- _actor1.postInit();
+ _companion.postInit();
_sceneMode = 20;
R2_GLOBALS._player.setAction(&_sequenceManager1, NULL, 1901, &R2_GLOBALS._player, &_leftDoor, NULL);
- _actor1.setAction(&_sequenceManager2, this, 1900, &_actor1, &_rightDoor, NULL);
+ _companion.setAction(&_sequenceManager2, this, 1900, &_companion, &_rightDoor, NULL);
} else if (R2_GLOBALS._player._oldCharacterScene[R2_GLOBALS._player._characterIndex] == 1925) {
if (R2_GLOBALS.getFlag(29)) {
R2_GLOBALS.clearFlag(29);
@@ -12823,24 +12687,24 @@ void Scene1900::postInit(SceneObjectList *OwnerList) {
}
if (R2_GLOBALS._player._characterScene[R2_QUINN] == R2_GLOBALS._player._characterScene[R2_SEEKER]) {
- _actor1.postInit();
- _actor1.setPosition(Common::Point(30, 110));
+ _companion.postInit();
+ _companion.setPosition(Common::Point(30, 110));
R2_GLOBALS._walkRegions.disableRegion(1);
- _actor1.setup(2008, 3, 1);
- _actor1.setDetails(9001, 0, -1, -1, 1, (SceneItem *) NULL);
+ _companion.setup(2008, 3, 1);
+ _companion.setDetails(9001, 0, -1, -1, 1, (SceneItem *) NULL);
}
R2_GLOBALS._player._oldCharacterScene[R2_GLOBALS._player._characterIndex] = 1900;
} else {
if (R2_GLOBALS._player._characterScene[R2_QUINN] == R2_GLOBALS._player._characterScene[R2_SEEKER]) {
- _actor1.postInit();
- _actor1.setPosition(Common::Point(30, 110));
+ _companion.postInit();
+ _companion.setPosition(Common::Point(30, 110));
R2_GLOBALS._walkRegions.disableRegion(1);
if (R2_GLOBALS._player._characterIndex == R2_QUINN) {
- _actor1.setup(20, 3, 1);
- _actor1.setDetails(9002, 1, -1, -1, 1, (SceneItem *) NULL);
+ _companion.setup(20, 3, 1);
+ _companion.setDetails(9002, 1, -1, -1, 1, (SceneItem *) NULL);
} else {
- _actor1.setup(2008, 3, 1);
- _actor1.setDetails(9001, 0, -1, -1, 1, (SceneItem *) NULL);
+ _companion.setup(2008, 3, 1);
+ _companion.setDetails(9001, 0, -1, -1, 1, (SceneItem *) NULL);
}
}
@@ -12903,7 +12767,7 @@ void Scene1900::signal() {
break;
case 22:
_sceneMode = 1910;
- _actor1.setAction(&_sequenceManager2, this, 1910, &_actor1, NULL);
+ _companion.setAction(&_sequenceManager2, this, 1910, &_companion, NULL);
break;
case 1904:
R2_GLOBALS._scene1925CurrLevel = -3;
@@ -12934,7 +12798,7 @@ void Scene1900::signal() {
*--------------------------------------------------------------------------*/
Scene1925::Scene1925() {
- _field9B8 = 0;
+ _newSceneMode = 0;
for (int i = 0; i < 5; i++)
_levelResNum[i] = 0;
}
@@ -12942,20 +12806,20 @@ Scene1925::Scene1925() {
void Scene1925::synchronize(Serializer &s) {
SceneExt::synchronize(s);
- s.syncAsSint16LE(_field9B8);
+ s.syncAsSint16LE(_newSceneMode);
for (int i = 0; i < 5; i++)
s.syncAsSint16LE(_levelResNum[i]);
}
bool Scene1925::Button::startAction(CursorType action, Event &event) {
- Scene1925 *scene = (Scene1925 *)R2_GLOBALS._sceneManager._scene;
-
if (action != CURSOR_USE)
return SceneHotspot::startAction(action, event);
if ((R2_GLOBALS._player._position.x == 110) && (R2_GLOBALS._player._position.y == 100))
return SceneHotspot::startAction(action, event);
+ Scene1925 *scene = (Scene1925 *)R2_GLOBALS._sceneManager._scene;
+
if ((R2_GLOBALS._player._position.x == 154) && (R2_GLOBALS._player._position.y == 20))
scene->_sceneMode = 1928;
else if ((R2_GLOBALS._player._position.x == 154) && (R2_GLOBALS._player._position.y == 200))
@@ -12964,7 +12828,8 @@ bool Scene1925::Button::startAction(CursorType action, Event &event) {
scene->_sceneMode = 1930;
R2_GLOBALS._player.disableControl(CURSOR_WALK);
- scene->setAction(&scene->_sequenceManager, scene, scene->_sceneMode, &R2_GLOBALS._player, &scene->_actor1, NULL);
+ scene->setAction(&scene->_sequenceManager, scene, scene->_sceneMode, &R2_GLOBALS._player,
+ &scene->_door, NULL);
return true;
}
@@ -12978,9 +12843,10 @@ bool Scene1925::Ladder::startAction(CursorType action, Event &event) {
scene->_sceneMode = 0;
if ((R2_GLOBALS._player._position.x == 110) && (R2_GLOBALS._player._position.y == 100)) {
- scene->_exit3._enabled = false;
+ scene->_westExit._enabled = false;
scene->_sceneMode = 1925;
- scene->setAction(&scene->_sequenceManager, scene, scene->_sceneMode, &R2_GLOBALS._player, &scene->_actor1, NULL);
+ scene->setAction(&scene->_sequenceManager, scene, scene->_sceneMode,
+ &R2_GLOBALS._player, &scene->_door, NULL);
return true;
}
@@ -13015,10 +12881,11 @@ void Scene1925::ExitUp::changeScene() {
scene->_sceneMode = 0;
if ((R2_GLOBALS._player._position.x == 110) && (R2_GLOBALS._player._position.y == 100)) {
- scene->_exit3._enabled = false;
- scene->_field9B8 = 1927;
+ scene->_westExit._enabled = false;
+ scene->_newSceneMode = 1927;
scene->_sceneMode = 1925;
- scene->setAction(&scene->_sequenceManager, scene, scene->_sceneMode, &R2_GLOBALS._player, &scene->_actor1, NULL);
+ scene->setAction(&scene->_sequenceManager, scene, scene->_sceneMode,
+ &R2_GLOBALS._player, &scene->_door, NULL);
return;
}
@@ -13037,7 +12904,7 @@ void Scene1925::ExitUp::changeScene() {
}
}
-void Scene1925::Exit2::changeScene() {
+void Scene1925::ExitDown::changeScene() {
Scene1925 *scene = (Scene1925 *)R2_GLOBALS._sceneManager._scene;
_moving = false;
@@ -13045,10 +12912,11 @@ void Scene1925::Exit2::changeScene() {
scene->_sceneMode = 0;
if ((R2_GLOBALS._player._position.x == 110) && (R2_GLOBALS._player._position.y == 100)) {
- scene->_exit3._enabled = false;
- scene->_field9B8 = 1926;
+ scene->_westExit._enabled = false;
+ scene->_newSceneMode = 1926;
scene->_sceneMode = 1925;
- scene->setAction(&scene->_sequenceManager, scene, scene->_sceneMode, &R2_GLOBALS._player, &scene->_actor1, NULL);
+ scene->setAction(&scene->_sequenceManager, scene, scene->_sceneMode,
+ &R2_GLOBALS._player, &scene->_door, NULL);
return;
}
@@ -13066,7 +12934,7 @@ void Scene1925::Exit2::changeScene() {
scene->setAction(&scene->_sequenceManager, scene, scene->_sceneMode, &R2_GLOBALS._player, NULL);
}
-void Scene1925::Exit3::changeScene() {
+void Scene1925::WestExit::changeScene() {
Scene1925 *scene = (Scene1925 *)R2_GLOBALS._sceneManager._scene;
_moving = false;
@@ -13075,7 +12943,7 @@ void Scene1925::Exit3::changeScene() {
scene->setAction(&scene->_sequenceManager, scene, scene->_sceneMode, &R2_GLOBALS._player, NULL);
}
-void Scene1925::Exit4::changeScene() {
+void Scene1925::EastExit::changeScene() {
Scene1925 *scene = (Scene1925 *)R2_GLOBALS._sceneManager._scene;
_moving = false;
@@ -13106,8 +12974,8 @@ void Scene1925::changeLevel(bool upFlag) {
case 3:
loadScene(_levelResNum[4]);
_button.setDetails(Rect(133, 68, 140, 77), 1925, 3, -1, 5, 2, NULL);
- _actor1.setDetails(1925, 0, 1, 2, 2, (SceneItem *) NULL);
- _actor1.show();
+ _door.setDetails(1925, 0, 1, 2, 2, (SceneItem *) NULL);
+ _door.show();
break;
case 512:
R2_GLOBALS._scene1925CurrLevel = 508;
@@ -13115,8 +12983,8 @@ void Scene1925::changeLevel(bool upFlag) {
default:
loadScene(_levelResNum[(R2_GLOBALS._scene1925CurrLevel % 4)]);
R2_GLOBALS._sceneItems.remove(&_button);
- R2_GLOBALS._sceneItems.remove(&_actor1);
- _actor1.hide();
+ R2_GLOBALS._sceneItems.remove(&_door);
+ _door.hide();
break;
}
@@ -13146,32 +13014,33 @@ void Scene1925::postInit(SceneObjectList *OwnerList) {
R2_GLOBALS._player.disableControl();
R2_GLOBALS._player._characterScene[R2_SEEKER] = 1925;
R2_GLOBALS._player._characterIndex = R2_SEEKER;
+
switch (R2_GLOBALS._scene1925CurrLevel) {
case -2:
- _exit4.setDetails(Rect(203, 44, 247, 111), EXITCURSOR_E, 1925);
+ _eastExit.setDetails(Rect(203, 44, 247, 111), EXITCURSOR_E, 1925);
_ladder.setDetails(Rect(31, 3, 45, 167), 1925, 6, -1, 8, 1, NULL);
break;
case 3:
- _actor1.setDetails(1925, 0, 1, 2, 1, (SceneItem *) NULL);
+ _door.setDetails(1925, 0, 1, 2, 1, (SceneItem *) NULL);
_button.setDetails(Rect(133, 68, 140, 77), 1925, 3, -1, 5, 1, NULL);
// No break on purpose
case -3:
- _exit3.setDetails(Rect(83, 38, 128, 101), EXITCURSOR_W, 1925);
+ _westExit.setDetails(Rect(83, 38, 128, 101), EXITCURSOR_W, 1925);
// No break on purpose
default:
_exitUp.setDetails(Rect(128, 0, 186, 10), EXITCURSOR_N, 1925);
- _exit2.setDetails(Rect(128, 160, 190, 167), EXITCURSOR_S, 1925);
+ _exitDown.setDetails(Rect(128, 160, 190, 167), EXITCURSOR_S, 1925);
_ladder.setDetails(Rect(141, 11, 167, 159), 1925, 6, -1, -1, 1, NULL);
break;
}
- _actor1.postInit();
- _actor1.setup(1925, 5, 1);
- _actor1.setPosition(Common::Point(128, 35));
- _actor1.hide();
+ _door.postInit();
+ _door.setup(1925, 5, 1);
+ _door.setPosition(Common::Point(128, 35));
+ _door.hide();
if (R2_GLOBALS._scene1925CurrLevel == 3)
- _actor1.show();
+ _door.show();
R2_GLOBALS._player.enableControl(CURSOR_USE);
switch (R2_GLOBALS._scene1925CurrLevel) {
@@ -13181,7 +13050,7 @@ void Scene1925::postInit(SceneObjectList *OwnerList) {
R2_GLOBALS._player.setPosition(Common::Point(224, 109));
break;
case -3:
- _actor1.hide();
+ _door.hide();
R2_GLOBALS._player.setup(20, 5, 1);
R2_GLOBALS._player.setPosition(Common::Point(110, 100));
break;
@@ -13196,9 +13065,9 @@ void Scene1925::postInit(SceneObjectList *OwnerList) {
}
R2_GLOBALS._player._canWalk = false;
- _field9B8 = 0;
+ _newSceneMode = 0;
R2_GLOBALS._sceneManager._previousScene = 1925;
- _item1.setDetails(Rect(27, 0, 292, 200), 1925, 9, -1, -1, 1, NULL);
+ _background.setDetails(Rect(27, 0, 292, 200), 1925, 9, -1, -1, 1, NULL);
}
void Scene1925::remove() {
@@ -13234,10 +13103,10 @@ void Scene1925::signal() {
changeLevel(true);
break;
case 1925:
- _exit3._enabled = false;
- if (_field9B8 != 0) {
- _sceneMode = _field9B8;
- _field9B8 = 0;
+ _westExit._enabled = false;
+ if (_newSceneMode != 0) {
+ _sceneMode = _newSceneMode;
+ _newSceneMode = 0;
setAction(&_sequenceManager, this, _sceneMode, &R2_GLOBALS._player, NULL);
}
// No break on purpose
@@ -13309,11 +13178,11 @@ bool Scene1945::Ice::startAction(CursorType action, Event &event) {
}
bool Scene1945::Ladder::startAction(CursorType action, Event &event) {
- Scene1945 *scene = (Scene1945 *)R2_GLOBALS._sceneManager._scene;
-
if (action != CURSOR_USE)
return SceneHotspot::startAction(action, event);
+ Scene1945 *scene = (Scene1945 *)R2_GLOBALS._sceneManager._scene;
+
R2_GLOBALS._player.disableControl(CURSOR_USE);
scene->_sceneMode = 0;
@@ -13323,7 +13192,8 @@ bool Scene1945::Ladder::startAction(CursorType action, Event &event) {
} else if ( ((R2_GLOBALS._player._position.x == 197) && (R2_GLOBALS._player._position.y == 158))
|| ((R2_GLOBALS._player._position.x == 191) && (R2_GLOBALS._player._position.y == 142)) ) {
scene->_sceneMode = 1947;
- } else if ((R2_GLOBALS._player._position.x == 221) && (R2_GLOBALS._player._position.y == 142) && (event.mousePos.y >= 30)) {
+ } else if ((R2_GLOBALS._player._position.x == 154) && (R2_GLOBALS._player._position.y == 50)
+ && (event.mousePos.y >= 30)) {
scene->_sceneMode = 1940;
} else {
R2_GLOBALS._player.enableControl(CURSOR_USE);
@@ -13432,14 +13302,14 @@ void Scene1945::postInit(SceneObjectList *OwnerList) {
else
_gunpowder.hide();
- _actor1.postInit();
- _actor1.setup(1945, 8, 1);
- _actor1.setPosition(Common::Point(253, 169));
- _actor1.fixPriority(130);
+ _coveringIce.postInit();
+ _coveringIce.setup(1945, 8, 1);
+ _coveringIce.setPosition(Common::Point(253, 169));
+ _coveringIce.fixPriority(130);
- _actor2.postInit();
- _actor2.setup(1945, 3, 1);
- _actor2.hide();
+ _alcoholLamp.postInit();
+ _alcoholLamp.setup(1945, 3, 1);
+ _alcoholLamp.hide();
} else {
_corridorExit._enabled = true;
}
@@ -13468,8 +13338,8 @@ void Scene1945::postInit(SceneObjectList *OwnerList) {
_nextSceneMode2 = 0;
_ice.setDetails(11, 1945, 3, -1, 5);
- _item1.setDetails(Rect(238, 144, 274, 167), 1945, 0, -1, 2, 1, NULL);
- _item2.setDetails(Rect(27, 3, 292, 167), 1945, 3, -1, -1, 1, NULL);
+ _hole.setDetails(Rect(238, 144, 274, 167), 1945, 0, -1, 2, 1, NULL);
+ _ice2.setDetails(Rect(27, 3, 292, 167), 1945, 3, -1, -1, 1, NULL);
}
void Scene1945::remove() {
@@ -13482,7 +13352,7 @@ void Scene1945::signal() {
case 1940:
if (_nextSceneMode1 == 1943) {
_sceneMode = _nextSceneMode1;
- setAction(&_sequenceManager1, this, _sceneMode, &R2_GLOBALS._player, &_actor2, NULL);
+ setAction(&_sequenceManager1, this, _sceneMode, &R2_GLOBALS._player, &_alcoholLamp, NULL);
} else {
_sceneMode = 1946;
setAction(&_sequenceManager1, this, _sceneMode, &R2_GLOBALS._player, NULL);
@@ -13509,7 +13379,7 @@ void Scene1945::signal() {
R2_GLOBALS._sound1.fadeOut2(NULL);
R2_INVENTORY.setObjectScene(_lampUsed, 0);
_sceneMode = 1948;
- setAction(&_sequenceManager1, this, _sceneMode, &_gunpowder, &_actor2, &_actor1, NULL);
+ setAction(&_sequenceManager1, this, _sceneMode, &_gunpowder, &_alcoholLamp, &_coveringIce, NULL);
R2_GLOBALS._player.setAction(&_sequenceManager2, NULL, 1941, &R2_GLOBALS._player, NULL);
return;
case 1944:
@@ -13524,12 +13394,13 @@ void Scene1945::signal() {
setAction(&_sequenceManager1, this, _sceneMode, &R2_GLOBALS._player, &_gunpowder, NULL);
return;
}
+ _sceneMode = 0;
break;
case 1947:
if (_nextSceneMode1 == 1943) {
_sceneMode = _nextSceneMode1;
_nextSceneMode1 = 1948;
- setAction(&_sequenceManager1, this, _sceneMode, &R2_GLOBALS._player, &_actor2, NULL);
+ setAction(&_sequenceManager1, this, _sceneMode, &R2_GLOBALS._player, &_alcoholLamp, NULL);
} else {
_sceneMode = 1941;
setAction(&_sequenceManager1, this, _sceneMode, &R2_GLOBALS._player, NULL);
@@ -13548,7 +13419,7 @@ void Scene1945::signal() {
if (_nextSceneMode2 == 1943) {
_nextSceneMode1 = _nextSceneMode2;
_nextSceneMode2 = 0;
- setAction(&_sequenceManager1, this, _sceneMode, &R2_GLOBALS._player, &_actor2, NULL);
+ setAction(&_sequenceManager1, this, _sceneMode, &R2_GLOBALS._player, &_alcoholLamp, NULL);
} else {
_nextSceneMode1 = 0;
setAction(&_sequenceManager1, this, _sceneMode, &R2_GLOBALS._player, NULL);
@@ -13568,14 +13439,12 @@ void Scene1945::signal() {
*--------------------------------------------------------------------------*/
Scene1950::KeypadWindow::KeypadWindow() {
- _field20 = 0;
_buttonIndex = 0;
}
void Scene1950::KeypadWindow::synchronize(Serializer &s) {
SceneArea::synchronize(s);
- s.syncAsByte(_field20);
s.syncAsSint16LE(_buttonIndex);
}
@@ -13608,7 +13477,7 @@ void Scene1950::KeypadWindow::KeypadButton::init(int indx) {
}
void Scene1950::KeypadWindow::KeypadButton::process(Event &event) {
- if ((event.eventType == EVENT_BUTTON_DOWN) && (R2_GLOBALS._events.getCursor() == CURSOR_USE)
+ if ((event.eventType == EVENT_BUTTON_DOWN) && (R2_GLOBALS._events.getCursor() == CURSOR_USE)
&& (_bounds.contains(event.mousePos)) && !_pressed) {
R2_GLOBALS._sound2.play(227);
if (!_toggled) {
@@ -13662,24 +13531,24 @@ void Scene1950::KeypadWindow::remove() {
}
}
-void Scene1950::KeypadWindow::proc12(int visage, int stripFrameNum, int frameNum, int posX, int posY) {
+void Scene1950::KeypadWindow::setup2(int visage, int stripFrameNum, int frameNum, int posX, int posY) {
Scene1950 *scene = (Scene1950 *)R2_GLOBALS._sceneManager._scene;
if (R2_GLOBALS._player._mover)
R2_GLOBALS._player.addMover(NULL);
R2_GLOBALS._player._canWalk = false;
- ModalWindow::proc12(visage, stripFrameNum, frameNum, posX, posY);
+ ModalWindow::setup2(visage, stripFrameNum, frameNum, posX, posY);
_object1.fixPriority(248);
scene->_eastExit._enabled = false;
- proc13(1950, 27, 28, 27);
+ setup3(1950, 27, 28, 27);
for (_buttonIndex = 0; _buttonIndex < 16; _buttonIndex++)
_buttons[_buttonIndex].init(_buttonIndex);
}
-void Scene1950::KeypadWindow::proc13(int resNum, int lookLineNum, int talkLineNum, int useLineNum) {
+void Scene1950::KeypadWindow::setup3(int resNum, int lookLineNum, int talkLineNum, int useLineNum) {
// Copy of Scene1200::LaserPanel::proc13()
_areaActor.setDetails(resNum, lookLineNum, talkLineNum, useLineNum, 2, (SceneItem *) NULL);
}
@@ -13745,11 +13614,10 @@ bool Scene1950::Gem::startAction(CursorType action, Event &event) {
/*--------------------------------------------------------------------------*/
Scene1950::Vampire::Vampire() {
- _fieldA8 = 0;
- _fieldAA = 0;
+ _deadPosition = Common::Point(0, 0);
+ _deltaX = 0;
+ _deltaY = 0;
_vampireMode = 0;
- _fieldAE = 0;
- _fieldAF = 0;
}
void Scene1950::Vampire::synchronize(Serializer &s) {
@@ -13757,11 +13625,9 @@ void Scene1950::Vampire::synchronize(Serializer &s) {
s.syncAsSint16LE(_deadPosition.x);
s.syncAsSint16LE(_deadPosition.y);
- s.syncAsSint16LE(_fieldA8);
- s.syncAsSint16LE(_fieldAA);
+ s.syncAsSint16LE(_deltaX);
+ s.syncAsSint16LE(_deltaY);
s.syncAsSint16LE(_vampireMode);
- s.syncAsByte(_fieldAE);
- s.syncAsByte(_fieldAF);
}
void Scene1950::Vampire::signal() {
@@ -13777,7 +13643,7 @@ void Scene1950::Vampire::signal() {
setStrip(1);
NpcMover *mover = new NpcMover();
- addMover(mover, &scene->_field418, scene);
+ addMover(mover, &scene->_vampireDestPos, scene);
}
break;
case 20: {
@@ -13812,7 +13678,7 @@ void Scene1950::Vampire::signal() {
R2_GLOBALS._player.enableControl();
}
break;
- case 21:
+ case 21: {
// Fatal shot
R2_GLOBALS._player.setVisage(22);
if (R2_GLOBALS._flubMazeEntryDirection == 3)
@@ -13836,23 +13702,24 @@ void Scene1950::Vampire::signal() {
R2_GLOBALS._vampireData[scene->_vampireIndex - 1]._isAlive = false;
R2_GLOBALS._vampireData[scene->_vampireIndex - 1]._shotsRequired--;
R2_GLOBALS._vampireData[scene->_vampireIndex - 1]._position = _position;
- _fieldA8 = (_position.x - R2_GLOBALS._player._position.x) / 2;
- _fieldAA = (_position.y - R2_GLOBALS._player._position.y) / 2;
+ _deltaX = (_position.x - R2_GLOBALS._player._position.x) / 2;
+ _deltaY = (_position.y - R2_GLOBALS._player._position.y) / 2;
- _fieldAE = 0;
- for (_fieldAF = 0; _fieldAF < 18; ++_fieldAF)
- if (!R2_GLOBALS._vampireData[_fieldAF]._isAlive)
- ++_fieldAE;
+ byte vampireCount = 0;
+ for (byte i = 0; i < 18; ++i) {
+ if (!R2_GLOBALS._vampireData[i]._isAlive)
+ ++vampireCount;
+ }
- if (_fieldAE == 18) {
+ if (vampireCount == 18) {
R2_GLOBALS.setFlag(36);
_vampireMode = 23;
- Common::Point pt(R2_GLOBALS._player._position.x + _fieldA8, R2_GLOBALS._player._position.y + _fieldAA);
+ Common::Point pt(R2_GLOBALS._player._position.x + _deltaX, R2_GLOBALS._player._position.y + _deltaY);
NpcMover *mover = new NpcMover();
R2_GLOBALS._player.addMover(mover, &pt, this);
- } else if (_fieldAE == 1) {
+ } else if (vampireCount == 1) {
_vampireMode = 22;
- Common::Point pt(R2_GLOBALS._player._position.x + _fieldA8, R2_GLOBALS._player._position.y + _fieldAA);
+ Common::Point pt(R2_GLOBALS._player._position.x + _deltaX, R2_GLOBALS._player._position.y + _deltaY);
NpcMover *mover = new NpcMover();
R2_GLOBALS._player.addMover(mover, &pt, this);
} else {
@@ -13864,14 +13731,15 @@ void Scene1950::Vampire::signal() {
else
scene->_westExit._enabled = true;
- scene->_field416 = 0;
+ scene->_vampireActive = false;
+ }
break;
case 22:
- SceneItem::display(1950, 18, 0, 280, 1, 160, 9, 1, 2, 20, 7, 7, -999);
+ SceneItem::display(1950, 18, 0, 280, 1, 160, 9, 1, 2, 20, 7, 7, LIST_END);
R2_GLOBALS._player.enableControl(CURSOR_WALK);
break;
case 23:
- SceneItem::display(1950, 25, 0, 280, 1, 160, 9, 1, 2, 20, 7, 7, -999);
+ SceneItem::display(1950, 25, 0, 280, 1, 160, 9, 1, 2, 20, 7, 7, LIST_END);
scene->_sceneMode = R2_GLOBALS._flubMazeEntryDirection;
scene->setAction(&scene->_sequenceManager, scene, 1960, &R2_GLOBALS._player, NULL);
break;
@@ -13883,7 +13751,7 @@ void Scene1950::Vampire::signal() {
bool Scene1950::Vampire::startAction(CursorType action, Event &event) {
Scene1950 *scene = (Scene1950 *)R2_GLOBALS._sceneManager._scene;
- if (!R2_GLOBALS._vampireData[scene->_vampireIndex - 1]._isAlive ||
+ if (!R2_GLOBALS._vampireData[scene->_vampireIndex - 1]._isAlive ||
(action != R2_PHOTON_STUNNER))
return SceneActor::startAction(action, event);
@@ -13928,7 +13796,7 @@ void Scene1950::UpExit::changeScene() {
R2_GLOBALS._flubMazeEntryDirection = 2;
scene->_sceneMode = 12;
- if (scene->_field412 == 0) {
+ if (!scene->_upExitStyle) {
if (R2_GLOBALS.getFlag(36))
scene->setAction(&scene->_sequenceManager, scene, 1953, &R2_GLOBALS._player, NULL);
else
@@ -13949,7 +13817,7 @@ void Scene1950::EastExit::changeScene() {
R2_GLOBALS._flubMazeEntryDirection = 3;
scene->_sceneMode = 13;
- if (scene->_field416 != 0)
+ if (scene->_vampireActive)
R2_GLOBALS._player.animate(ANIM_MODE_9);
Common::Point pt(340, 160);
@@ -14000,16 +13868,16 @@ void Scene1950::WestExit::changeScene() {
R2_GLOBALS._player.addMover(mover, &pt, scene);
} else {
if (!R2_GLOBALS.getFlag(36))
- SceneItem::display(1950, 33, 0, 280, 1, 160, 9, 1, 2, 20, 7, 7, -999);
+ SceneItem::display(1950, 33, 0, 280, 1, 160, 9, 1, 2, 20, 7, 7, LIST_END);
if ((R2_INVENTORY.getObjectScene(R2_SAPPHIRE_BLUE) == 1950) || (R2_INVENTORY.getObjectScene(R2_ANCIENT_SCROLLS) == 1950))
- SceneItem::display(1950, 34, 0, 280, 1, 160, 9, 1, 2, 20, 7, 7, -999);
+ SceneItem::display(1950, 34, 0, 280, 1, 160, 9, 1, 2, 20, 7, 7, LIST_END);
scene->_sceneMode = 0;
Common::Point pt(30, 160);
NpcMover *mover = new NpcMover();
R2_GLOBALS._player.addMover(mover, &pt, scene);
}
} else {
- if (scene->_field416 != 0)
+ if (scene->_vampireActive)
R2_GLOBALS._player.animate(ANIM_MODE_9);
scene->_sceneMode = 16;
@@ -14039,7 +13907,7 @@ void Scene1950::DoorExit::changeScene() {
scene->_sceneMode = 1975;
scene->setAction(&scene->_sequenceManager, scene, 1975, &R2_GLOBALS._player, NULL);
} else {
- SceneItem::display(1950, 22, 0, 280, 1, 160, 9, 1, 2, 20, 7, 7, -999);
+ SceneItem::display(1950, 22, 0, 280, 1, 160, 9, 1, 2, 20, 7, 7, LIST_END);
R2_GLOBALS._flubMazeEntryDirection = 0;
scene->_sceneMode = 0;
Common::Point pt(250, 150);
@@ -14052,21 +13920,21 @@ void Scene1950::DoorExit::changeScene() {
/*--------------------------------------------------------------------------*/
Scene1950::Scene1950() {
- _field412 = 0;
- _field414 = 0;
- _field416 = 0;
- _field418 = Common::Point(0, 0);
+ _upExitStyle = false;
+ _removeFlag = false;
+ _vampireActive = false;
+ _vampireDestPos = Common::Point(0, 0);
_vampireIndex = 0;
}
void Scene1950::synchronize(Serializer &s) {
SceneExt::synchronize(s);
- s.syncAsSint16LE(_field412);
- s.syncAsSint16LE(_field414);
- s.syncAsSint16LE(_field416);
- s.syncAsSint16LE(_field418.x);
- s.syncAsSint16LE(_field418.y);
+ s.syncAsSint16LE(_upExitStyle);
+ s.syncAsSint16LE(_removeFlag);
+ s.syncAsSint16LE(_vampireActive);
+ s.syncAsSint16LE(_vampireDestPos.x);
+ s.syncAsSint16LE(_vampireDestPos.y);
s.syncAsSint16LE(_vampireIndex);
}
@@ -14095,7 +13963,7 @@ void Scene1950::initArea() {
_westExit._moving = false;
_shaftExit._moving = false;
_doorExit._moving = false;
- _field412 = 0;
+ _upExitStyle = false;
switch (R2_GLOBALS._flubMazeArea - 1) {
case 0:
@@ -14322,7 +14190,7 @@ void Scene1950::initArea() {
// No break on purpose
case 67:
loadScene(1985);
- _field412 = 1;
+ _upExitStyle = true;
break;
default:
break;
@@ -14769,7 +14637,7 @@ void Scene1950::enterArea() {
_door.remove();
_scrolls.remove();
- _field416 = 0;
+ _vampireActive = false;
_vampireIndex = 0;
// Certain areas have a vampire in them
@@ -14778,7 +14646,7 @@ void Scene1950::enterArea() {
_vampireIndex = 1;
break;
case 13:
- _vampireIndex = 2;
+ _vampireIndex = 2;
break;
case 16:
_vampireIndex = 3;
@@ -14837,7 +14705,7 @@ void Scene1950::enterArea() {
_vampire._numFrames = 6;
_vampire._moveRate = 6;
_vampire._moveDiff = Common::Point(3, 2);
- _vampire._effect = 1;
+ _vampire._effect = EFFECT_SHADED;
if (!R2_GLOBALS._vampireData[_vampireIndex - 1]._isAlive) {
// Show vampire ashes
@@ -14855,7 +14723,7 @@ void Scene1950::enterArea() {
_vampire.setPosition(Common::Point(160, 130));
_vampire.animate(ANIM_MODE_2, NULL);
_vampire.setDetails(1950, 12, -1, 14, 2, (SceneItem *) NULL);
- _field416 = 1;
+ _vampireActive = true;
}
}
if ((R2_GLOBALS._flubMazeArea == 1) && (R2_INVENTORY.getObjectScene(R2_SCRITH_KEY) != 0)) {
@@ -14885,13 +14753,13 @@ void Scene1950::enterArea() {
_cube.setPosition(Common::Point(193, 158));
_cube.setDetails(1950, 3, 4, 5, 2, (SceneItem *) NULL);
- _actor7.postInit();
- _actor7.setVisage(1970);
- _actor7.setStrip(3);
- _actor7.animate(ANIM_MODE_2, NULL);
- _actor7._numFrames = 6;
- _actor7.setPosition(Common::Point(194, 158));
- _actor7.fixPriority(159);
+ _pulsingLights.postInit();
+ _pulsingLights.setVisage(1970);
+ _pulsingLights.setStrip(3);
+ _pulsingLights.animate(ANIM_MODE_2, NULL);
+ _pulsingLights._numFrames = 6;
+ _pulsingLights.setPosition(Common::Point(194, 158));
+ _pulsingLights.fixPriority(159);
_keypad.setDetails(Rect(188, 124, 199, 133), 1950, 27, 28, -1, 2, NULL);
@@ -14931,27 +14799,29 @@ void Scene1950::enterArea() {
else
_scrolls.setFrame(1);
- _field414 = 1;
- } else if (_field414 != 0) {
+ _removeFlag = true;
+ } else if (_removeFlag) {
_cube.remove();
_containmentField.remove();
_gem.remove();
- _actor7.remove();
+ _pulsingLights.remove();
_scrolls.remove();
R2_GLOBALS._sceneItems.remove(&_background);
_background.setDetails(Rect(0, 0, 320, 200), 1950, 0, 1, 2, 2, NULL);
+
+ _removeFlag = false;
}
switch (R2_GLOBALS._flubMazeEntryDirection) {
case 0:
_sceneMode = 1950;
- if (R2_INVENTORY.getObjectScene(R2_SCRITH_KEY) == 0) {
- R2_GLOBALS._v56AAB = 0;
+ if (R2_INVENTORY.getObjectScene(R2_SCRITH_KEY) == 0)
+ // The original uses CURSOR_ARROW. CURSOR_WALK is much more coherent
R2_GLOBALS._player.enableControl(CURSOR_WALK);
- } else {
+ else
setAction(&_sequenceManager, this, 1950, &R2_GLOBALS._player, NULL);
- }
+
break;
case 1: {
_sceneMode = R2_GLOBALS._flubMazeEntryDirection;
@@ -14970,7 +14840,7 @@ void Scene1950::enterArea() {
break;
case 3:
// Entering from the left
- if (_field416 == 0) {
+ if (!_vampireActive) {
_sceneMode = R2_GLOBALS._flubMazeEntryDirection;
R2_GLOBALS._player.setPosition(Common::Point(-20, 160));
Common::Point pt(30, 160);
@@ -14979,14 +14849,13 @@ void Scene1950::enterArea() {
} else {
_sceneMode = 18;
_eastExit._enabled = false;
- _field418 = Common::Point(60, 152);
- R2_GLOBALS._v56AAB = 0;
+ _vampireDestPos = Common::Point(60, 152);
R2_GLOBALS._player.enableControl(CURSOR_USE);
R2_GLOBALS._player._canWalk = false;
_vampire.setStrip(2);
NpcMover *mover = new NpcMover();
- _vampire.addMover(mover, &_field418, this);
+ _vampire.addMover(mover, &_vampireDestPos, this);
R2_GLOBALS._player.setPosition(Common::Point(-20, 160));
Common::Point pt2(30, 160);
@@ -14996,7 +14865,7 @@ void Scene1950::enterArea() {
break;
case 4:
_sceneMode = R2_GLOBALS._flubMazeEntryDirection;
- if (_field412 == 0) {
+ if (!_upExitStyle) {
if (R2_GLOBALS.getFlag(36))
setAction(&_sequenceManager, this, 1955, &R2_GLOBALS._player, NULL);
else
@@ -15018,7 +14887,7 @@ void Scene1950::enterArea() {
break;
case 6:
// Entering from the right
- if (_field416 == 0) {
+ if (!_vampireActive) {
_sceneMode = R2_GLOBALS._flubMazeEntryDirection;
if (R2_GLOBALS._flubMazeArea == 1) {
setAction(&_sequenceManager, this, 1961, &R2_GLOBALS._player, NULL);
@@ -15031,15 +14900,14 @@ void Scene1950::enterArea() {
} else {
_sceneMode = 17;
_westExit._enabled = false;
- _field418 = Common::Point(259, 152);
+ _vampireDestPos = Common::Point(259, 152);
- R2_GLOBALS._v56AAB = 0;
R2_GLOBALS._player.enableControl(CURSOR_USE);
R2_GLOBALS._player._canWalk = false;
_vampire.setStrip(1);
NpcMover *mover = new NpcMover();
- _vampire.addMover(mover, &_field418, this);
+ _vampire.addMover(mover, &_vampireDestPos, this);
R2_GLOBALS._player.setPosition(Common::Point(340, 160));
Common::Point pt2(289, 160);
@@ -15134,9 +15002,9 @@ void Scene1950::doButtonPress(int indx) {
}
void Scene1950::postInit(SceneObjectList *OwnerList) {
- _field412 = 0;
- _field414 = 0;
- _field416 = 0;
+ _upExitStyle = false;
+ _removeFlag = false;
+ _vampireActive = false;
_vampireIndex = 0;
if (R2_GLOBALS._sceneManager._previousScene == 300)
R2_GLOBALS._flubMazeArea = 103;
@@ -15202,7 +15070,7 @@ void Scene1950::signal() {
enterArea();
break;
case 1975:
- SceneItem::display(1950, 21, SET_WIDTH, 280, SET_X, 160, SET_POS_MODE, 1,
+ SceneItem::display(1950, 21, SET_WIDTH, 280, SET_X, 160, SET_POS_MODE, 1,
SET_Y, 20, SET_EXT_BGCOLOR, 7, LIST_END);
// No break on purpose
case 13:
@@ -15233,11 +15101,11 @@ void Scene1950::signal() {
case 17: {
_sceneMode = 13;
R2_GLOBALS._flubMazeEntryDirection = 3;
- _field416 = 0;
+ _vampireActive = false;
R2_GLOBALS._player.disableControl(CURSOR_WALK);
R2_GLOBALS._player._canWalk = true;
R2_GLOBALS._player.setVisage(22);
- R2_GLOBALS._player.animate(ANIM_MODE_9, NULL);
+ R2_GLOBALS._player.animate(ANIM_MODE_9);
Common::Point pt(340, 160);
NpcMover *mover = new NpcMover();
R2_GLOBALS._player.addMover(mover, &pt, this);
@@ -15249,11 +15117,11 @@ void Scene1950::signal() {
case 18: {
_sceneMode = 16;
R2_GLOBALS._flubMazeEntryDirection = 6;
- _field416 = 0;
+ _vampireActive = false;
R2_GLOBALS._player.disableControl(CURSOR_WALK);
R2_GLOBALS._player._canWalk = true;
R2_GLOBALS._player.setVisage(22);
- R2_GLOBALS._player.animate(ANIM_MODE_9, NULL);
+ R2_GLOBALS._player.animate(ANIM_MODE_9);
Common::Point pt(-20, 160);
NpcMover *mover = new NpcMover();
R2_GLOBALS._player.addMover(mover, &pt, this);
@@ -15273,14 +15141,12 @@ void Scene1950::signal() {
R2_GLOBALS._sceneManager.changeScene(1945);
break;
case 1958:
- SceneItem::display(1950, 24, 0, 280, 1, 160, 9, 1, 2, 20, 7, 7, -999);
- R2_GLOBALS._v56AAB = 0;
+ SceneItem::display(1950, 24, 0, 280, 1, 160, 9, 1, 2, 20, 7, 7, LIST_END);
R2_GLOBALS._player.enableControl(CURSOR_WALK);
_doorExit._enabled = true;
break;
case 1959:
R2_INVENTORY.setObjectScene(R2_SOAKED_FACEMASK, 0);
- R2_GLOBALS._v56AAB = 0;
R2_GLOBALS._player.enableControl(CURSOR_WALK);
_doorExit._enabled = true;
break;
@@ -15288,14 +15154,14 @@ void Scene1950::signal() {
// No break on purpose
case 1963:
R2_GLOBALS._player.enableControl();
- _KeypadWindow.proc12(1971, 1, 1, 160, 135);
+ _KeypadWindow.setup2(1971, 1, 1, 160, 135);
break;
case 1964:
// No break on purpose
case 1965:
- if (!R2_GLOBALS.getFlag(37)) {
- SceneItem::display(1950, 26, 0, 280, 1, 160, 9, 1, 2, 20, 7, 7, -999);
- }
+ if (!R2_GLOBALS.getFlag(37))
+ SceneItem::display(1950, 26, 0, 280, 1, 160, 9, 1, 2, 20, 7, 7, LIST_END);
+
R2_GLOBALS._player.enableControl();
break;
case 1966:
@@ -15319,7 +15185,8 @@ void Scene1950::signal() {
R2_GLOBALS._player.setVisage(22);
R2_GLOBALS._player.animate(ANIM_MODE_1, NULL);
- Common::Point pt(218, 165);
+ // This is a hack to work around a pathfinding issue. original destination is (218, 165)
+ Common::Point pt(128, 165);
NpcMover *mover = new NpcMover();
R2_GLOBALS._player.addMover(mover, &pt, this);
}
@@ -15335,7 +15202,6 @@ void Scene1950::signal() {
R2_GLOBALS._player.animate(ANIM_MODE_1, NULL);
break;
default:
- R2_GLOBALS._v56AAB = 0;
R2_GLOBALS._player.enableControl(CURSOR_WALK);
break;
}
diff --git a/engines/tsage/ringworld2/ringworld2_scenes1.h b/engines/tsage/ringworld2/ringworld2_scenes1.h
index c0088236b4..91c4b88391 100644
--- a/engines/tsage/ringworld2/ringworld2_scenes1.h
+++ b/engines/tsage/ringworld2/ringworld2_scenes1.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope 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.
@@ -111,13 +111,13 @@ public:
SceneActor _shotImpact4;
SceneActor _shotImpact5;
SceneActor _laserShot;
- SceneActor _animation; // Used for cliff collapse and ship theft
+ SceneActor _animation; // Used for cliff collapse and ship theft
SceneActor _leftImpacts;
SceneActor _runningGuy1;
SceneActor _runningGuy2;
SceneActor _runningGuy3;
BackgroundSceneObject _rightLandslide;
- BackgroundSceneObject _object2;
+ BackgroundSceneObject _purplePlant;
Seeker _seeker;
Trooper _trooper;
Chief _chief;
@@ -183,38 +183,52 @@ public:
};
class Scene1337 : public SceneExt {
- class unkObj1337sub1: public SceneHotspot {
+ class OptionsDialog: public GfxDialog {
+ private:
+ GfxButton _autoplay;
+ GfxButton _restartGame;
+ GfxButton _quitGame;
+ GfxButton _continueGame;
+
+ OptionsDialog();
+ virtual ~OptionsDialog() {}
+ virtual GfxButton *execute(GfxButton *defaultButton);
+ public:
+ static void show();
+ };
+
+ class Card: public SceneHotspot {
public:
- SceneObject _object1;
+ SceneObject _card;
- int _field34;
- Common::Point _field36;
+ int _cardId;
+ Common::Point _stationPos;
- unkObj1337sub1();
+ Card();
void synchronize(Serializer &s);
+ bool isIn(Common::Point pt);
};
- class unkObj1337_1: public SceneHotspot {
+ class GameBoardSide: public SceneHotspot {
public:
- unkObj1337sub1 _arr1[4];
- unkObj1337sub1 _arr2[8];
- unkObj1337sub1 _arr3[1];
- unkObj1337sub1 _arr4[1];
+ Card _handCard[4];
+ Card _outpostStation[8];
+ Card _delayCard;
+ Card _emptyStationPos;
- Common::Point _fieldB94;
- Common::Point _fieldB98;
- Common::Point _fieldB9C;
- Common::Point _fieldBA0;
- int _fieldBA4;
+ Common::Point _card1Pos;
+ Common::Point _card2Pos;
+ Common::Point _card3Pos;
+ Common::Point _card4Pos;
+ int _frameNum;
- unkObj1337_1();
+ GameBoardSide();
void synchronize(Serializer &s);
};
class Action1337: public Action {
public:
- void subD18B5(int resNum, int stripNum, int frameNum);
- void skipFrames(int32 skipCount);
+ void waitFrames(int32 frameCount);
};
class Action1: public Action1337 {
@@ -270,16 +284,6 @@ class Scene1337 : public SceneExt {
void signal();
};
public:
- typedef void (Scene1337::*FunctionPtrType)();
- FunctionPtrType _unkFctPtr412;
-
- ASound _aSound1;
- ASound _aSound2;
- BackgroundSceneObject _background1;
- bool _autoplay;
- unkObj1337_1 _arrunkObj1337[4];
- SceneItem _item1;
- SceneObject _object1;
Action1 _action1;
Action2 _action2;
Action3 _action3;
@@ -293,90 +297,101 @@ public:
Action11 _action11;
Action12 _action12;
Action13 _action13;
- unkObj1337sub1 _item2;
- unkObj1337sub1 _item3;
- unkObj1337sub1 _item4;
- BackgroundSceneObject _background2;
- int _field3E24;
- int _field3E26;
- int _field3E28[100];
- unkObj1337sub1 *_field3EF0;
- unkObj1337sub1 *_field3EF4;
- unkObj1337sub1 *_field3EF8;
- unkObj1337sub1 _item5;
- unkObj1337sub1 _item6;
- unkObj1337sub1 _item7;
- unkObj1337sub1 _item8;
- int _field423C;
- int _field423E;
- int _field4240;
- int _field4242;
- int _field4244;
- int _field4246;
- int _field4248;
- int _field424A;
- int _field424C;
- int _field424E;
-
- SceneObject _arrObject1[8];
- SceneObject _arrObject2[8];
+
+ typedef void (Scene1337::*FunctionPtrType)();
+ FunctionPtrType _delayedFunction;
+
+ bool _autoplay;
+ bool _shuffleEndedFl;
+ bool _showPlayerTurn;
+ bool _displayHelpFl;
+ bool _instructionsDisplayedFl;
+
+ // Discarded cards are put in the available cards pile, with an higher index so there no conflict
+ int _currentDiscardIndex;
+ int _availableCardsPile[100];
+ int _cardsAvailableNumb;
+ int _currentPlayerNumb;
+ int _actionIdx1;
+ int _actionIdx2;
+ int _winnerId;
+ int _instructionsWaitCount;
+ int _cursorCurRes;
+ int _cursorCurStrip;
+ int _cursorCurFrame;
+
+ ASound _aSound1;
+ ASound _aSound2;
+ GameBoardSide _gameBoardSide[4];
+ SceneActor _helpIcon;
+ SceneActor _stockPile;
+ SceneItem _actionItem;
+ SceneObject _currentPlayerArrow;
+
+ Card *_actionCard1;
+ Card *_actionCard2;
+ Card *_actionCard3;
+ Card _animatedCard;
+ Card _shuffleAnimation;
+ Card _discardedPlatformCard;
+ Card _selectedCard;
+ Card _discardPile;
+ Card _stockCard;
+
+ SceneObject _upperDisplayCard[8];
+ SceneObject _lowerDisplayCard[8];
Scene1337();
virtual void synchronize(Serializer &s);
- void actionDisplay(int resNum, int lineNum, int x, int y, int arg5, int width, int textMode, int fontNum, int colFG, int colBGExt, int colFGExt);
- void setAnimationInfo(unkObj1337sub1 *subObj);
- void subC20E5();
- void subC20F9();
- void subC2586();
- bool subC264B(int arg1);
- bool subC2687(int arg1);
- int subC26CB(int arg1, int arg2);
- int subC2719(int arg1);
- int subC274D(int arg1);
- int subC2781(int arg1);
- int subC27B5(int arg1);
- int subC27F9(int arg1);
- void subC2835(int arg1);
- bool subC2BF8(unkObj1337sub1 *subObj1, Common::Point pt);
- void subC2C2F();
- void subC318B(int arg1, unkObj1337sub1 *subObj2, int arg3);
- int subC3257(int arg1);
- bool subC32B1(int arg1, int arg2);
- int subC331B(int arg1);
- bool subC3386(int arg1, int arg2);
- void subC33C0(unkObj1337sub1 *subObj1, unkObj1337sub1 *subObj2);
- void subC3456(unkObj1337sub1 *subObj1, unkObj1337sub1 *subObj2);
- void subC340B(unkObj1337sub1 *subObj1, unkObj1337sub1 *subObj2);
- void subC34A1(unkObj1337sub1 *subObj1, unkObj1337sub1 *subObj2);
- unkObj1337sub1 *subC34EC(int arg1);
- void subC358E(unkObj1337sub1 *subObj1, int arg2);
- int subC3E92(int arg1);
- void subC4A39(unkObj1337sub1 *subObj);
+ void actionDisplay(int resNum, int lineNum, int x, int y, int keepOnScreen, int width, int textMode, int fontNum, int colFG, int colBGExt, int colFGExt);
+ void setAnimationInfo(Card *card);
+ void handleNextTurn();
+ void handlePlayerTurn();
+ bool isStationCard(int cardId);
+ bool isStopConstructionCard(int cardId);
+ int getStationId(int playerId, int handCardId);
+ int findPlatformCardInHand(int playerId);
+ int findCard13InHand(int playerId);
+ int checkThieftCard(int playerId);
+ int isDelayCard(int cardId);
+ int getStationCardId(int cardId);
+ void handlePlayer01Discard(int playerId);
+ void playThieftCard(int playerId, Card *card, int victimId);
+ int getPreventionCardId(int cardId);
+ bool isAttackPossible(int victimId, int cardId);
+ int getPlayerWithOutpost(int playerId);
+ bool checkAntiDelayCard(int delayCardId, int cardId);
+ void playStationCard(Card *station, Card *platform);
+ void playDelayCard(Card *card, Card *dest);
+ void playPlatformCard(Card *card, Card *dest);
+ void playAntiDelayCard(Card *card, Card *dest);
+ Card *getStationCard(int arg1);
+ void playCounterTrickCard(Card *card, int playerId);
+ int getFreeHandCard(int playerId);
+ void discardCard(Card *card);
void subC4CD2();
void subC4CEC();
- void subC51A0(unkObj1337sub1 *subObj1, unkObj1337sub1 *subObj2);
+ void subC51A0(Card *subObj1, Card *subObj2);
void displayDialog(int dialogNumb);
void subPostInit();
- void subCB59B();
+ void displayInstructions();
void suggestInstructions();
void shuffleCards();
- void subCCF26();
- void subCD193();
- void subCDB90(int arg1, Common::Point pt);
- void subCF31D();
- void subCF979();
- void subD026D();
- void subD0281();
- void subD02CA();
- void subD183F(int arg1, int arg2);
- void subD18B5(int resNum, int rlbNum, int arg3);
- int subD18F5();
- int subD1917();
- int subD1940(bool flag);
- void subD195F(int arg1, int arg2);
+ void dealCards();
+ void showOptionsDialog();
+ void handleClick(int arg1, Common::Point pt);
+ void handlePlayer0();
+ void handlePlayer1();
+ void handlePlayer2();
+ void handlePlayer3();
+ void handleAutoplayPlayer2();
+ void updateCursorId(int arg1, bool arg2);
+ void setCursorData(int resNum, int rlbNum, int frameNum);
+ void subD18F5();
+ void subD1917();
+ void subD1940(bool flag);
void subD1975(int arg1, int arg2);
- void subD1A48(int arg1);
virtual void postInit(SceneObjectList *OwnerList = NULL);
virtual void remove();
@@ -386,10 +401,10 @@ public:
class Scene1500 : public SceneExt {
public:
- SceneActor _actor1;
- SceneActor _actor2;
- SceneActor _actor3;
- SceneActor _actor4;
+ SceneActor _starship;
+ SceneActor _starshipShadow;
+ SceneActor _smallShip;
+ SceneActor _smallShipShadow;
SequenceManager _sequenceManager;
virtual void postInit(SceneObjectList *OwnerList = NULL);
@@ -410,9 +425,9 @@ class Scene1530 : public SceneExt {
public:
SpeakerQuinn _quinnSpeaker;
SpeakerSeeker _seekerSpeaker;
- SceneActor _actor1;
- SceneActor _actor2;
- SceneActor _actor3;
+ SceneActor _seeker;
+ SceneActor _leftReactor;
+ SceneActor _rightReactor;
SequenceManager _sequenceManager;
@@ -422,14 +437,13 @@ public:
};
class Scene1550 : public SceneExt {
- class SceneActor1550 : public SceneActor {
+ class Wall : public SceneActor {
public:
- void subA4D14(int frameNumber, int strip);
+ void setupWall(int frameNumber, int strip);
};
class Junk : public SceneActor {
public:
- int _fieldA4;
int _junkNumber;
Junk();
@@ -449,27 +463,24 @@ class Scene1550 : public SceneExt {
void setupShipComponent(int componentId);
};
- class UnkObj15503 : public SceneActor {
- public:
- int _fieldA4;
-
- UnkObj15503();
- void synchronize(Serializer &s);
+ class DishControlsWindow : public ModalWindow {
+ class DishControl : public SceneActor {
+ public:
+ int _controlId;
- virtual bool startAction(CursorType action, Event &event);
- };
+ DishControl();
+ void synchronize(Serializer &s);
- class UnkArea1550 : public SceneArea {
+ virtual bool startAction(CursorType action, Event &event);
+ };
public:
byte _field20;
SceneActor _areaActor;
- UnkObj15503 _unkObj155031;
- UnkObj15503 _unkObj155032;
+ DishControl _button;
+ DishControl _lever;
virtual void remove();
- virtual void process(Event &event);
- virtual void proc12(int visage, int stripFrameNum, int frameNum, int posX, int posY);
- virtual void proc13(int resNum, int lookLineNum, int talkLineNum, int useLineNum);
+ virtual void setup2(int visage, int stripFrameNum, int frameNum, int posX, int posY);
};
class WorkingShip : public NamedHotspot {
@@ -477,11 +488,6 @@ class Scene1550 : public SceneExt {
virtual bool startAction(CursorType action, Event &event);
};
- class Hotspot3 : public NamedHotspot {
- public:
- virtual bool startAction(CursorType action, Event &event);
- };
-
class Wreckage : public SceneActor {
public:
virtual bool startAction(CursorType action, Event &event);
@@ -492,77 +498,71 @@ class Scene1550 : public SceneExt {
virtual bool startAction(CursorType action, Event &event);
};
- class Actor8 : public SceneActor {
+ class AirBag : public SceneActor {
public:
virtual bool startAction(CursorType action, Event &event);
};
- class Actor9 : public SceneActor {
+ class Joystick : public SceneActor {
public:
virtual bool startAction(CursorType action, Event &event);
};
- class Actor10 : public SceneActor {
+ class Gyroscope : public SceneActor {
public:
virtual bool startAction(CursorType action, Event &event);
};
- class Actor11 : public SceneActor {
+ class DiagnosticsDisplay : public SceneActor {
public:
virtual bool startAction(CursorType action, Event &event);
};
- class Actor12 : public SceneActor {
+ class DishTower : public SceneActor {
public:
virtual bool startAction(CursorType action, Event &event);
};
- class Actor13 : public SceneActor {
+ class Dish : public SceneActor {
public:
virtual bool startAction(CursorType action, Event &event);
};
- class Wall : public SceneActor1550 {
- // Nothing specific found in the original
- // TODO: check if it's an useless class
- };
-
public:
SpeakerQuinn _quinnSpeaker;
SpeakerSeeker _seekerSpeaker;
- WorkingShip _shipHull;
- WorkingShip _item2;
- Hotspot3 _item3;
- SceneActor _landingStrut;
- SceneActor _actor2;
- SceneActor _actor3;
- SceneActor _actor4;
- SceneActor _actor5;
+ WorkingShip _intactHull1, _intactHull2;
+ SceneHotspot _background;
+ SceneActor _wreckage2; // also used for Lance of Truth landing strut
+ SceneActor _wreckage3;
+ SceneActor _wreckage4;
+ SceneActor _walkway;
+ SceneActor _dishTowerShadow;
Wreckage _wreckage;
Companion _companion;
- Actor8 _actor8;
- Actor9 _actor9;
- Actor10 _actor10;
- Actor11 _actor11;
- Actor12 _actor12;
- Actor13 _actor13;
+ AirBag _airbag;
+ Joystick _joystick;
+ Gyroscope _gyroscope;
+ DiagnosticsDisplay _diagnosticsDisplay;
+ DishTower _dishTower;
+ Dish _dish;
Junk _junk[8];
- Wall _actor14;
+ Wall _wallCorner1;
Wall _northWall; // Is also reused for landing strip
- Wall _actor16;
+ Wall _wallCorner2;
Wall _westWall; // Is also reused for left hand space
Wall _eastWall;
Wall _southWall;
ShipComponent _shipComponents[8];
- UnkArea1550 _unkArea1;
+ DishControlsWindow _dishControlsWindow;
SequenceManager _sequenceManager1;
SequenceManager _sequenceManager2;
- int _field412;
- byte _field414;
- int _field415;
- int _field417;
- int _field419;
+ bool _dontExit;
+ int _wallType;
+ int _dishMode;
+ int _sceneResourceId;
+ int _walkRegionsId;
Scene1550();
void synchronize(Serializer &s);
@@ -576,14 +576,14 @@ public:
};
class Scene1575 : public SceneExt {
- class Hotspot1 : public NamedHotspot {
+ class Button : public NamedHotspot {
public:
- int _field34;
- int _field36;
+ int _buttonId;
+ bool _pressed;
- Hotspot1();
+ Button();
void synchronize(Serializer &s);
- void subA910D(int indx);
+ void initButton(int buttonId);
virtual void process(Event &event);
virtual bool startAction(CursorType action, Event &event);
@@ -594,12 +594,12 @@ public:
int _field416;
int _field418;
int _field41A;
- Hotspot1 _item1;
- Hotspot1 _item2;
- Hotspot1 _item3;
- Hotspot1 _item4;
- Hotspot1 _item5;
- Hotspot1 _item6;
+ Button _button1;
+ Button _button2;
+ Button _button3;
+ Button _button4;
+ Button _button5;
+ Button _button6;
SceneActor _actor1;
SceneActor _actor2;
SceneActor _actor3;
@@ -629,54 +629,53 @@ public:
};
class Scene1580 : public SceneExt {
- class Hotspot1 : public NamedHotspot {
+ class JoystickPlug : public NamedHotspot {
public:
virtual bool startAction(CursorType action, Event &event);
};
- class Hotspot2 : public NamedHotspot {
+ class ScreenSlot : public NamedHotspot {
public:
virtual bool startAction(CursorType action, Event &event);
};
- class Actor2 : public SceneActor {
+ class Joystick : public SceneActor {
public:
virtual bool startAction(CursorType action, Event &event);
};
- class Actor3 : public SceneActor {
+ class Screen : public SceneActor {
public:
virtual bool startAction(CursorType action, Event &event);
};
- class Actor4 : public SceneActor {
+ class StorageCompartment : public SceneActor {
public:
virtual bool startAction(CursorType action, Event &event);
};
- class Actor5 : public SceneActor {
+ class HatchButton : public SceneActor {
public:
virtual bool startAction(CursorType action, Event &event);
};
- class Actor6 : public SceneActor {
+ class ThrusterValve : public SceneActor {
public:
virtual bool startAction(CursorType action, Event &event);
};
- class Actor7 : public SceneActor {
+ class Ignitor : public SceneActor {
public:
virtual bool startAction(CursorType action, Event &event);
};
public:
- int _field412;
SpeakerQuinn _quinnSpeaker;
SpeakerSeeker _seekerSpeaker;
- Hotspot1 _item1;
- Hotspot2 _item2;
- NamedHotspot _item3;
- SceneActor _actor1;
+ JoystickPlug _joystickPlug;
+ ScreenSlot _screenSlot;
+ NamedHotspot _background;
+ SceneActor _screenDisplay;
SceneActor _arrActor[8];
- Actor2 _actor2;
- Actor3 _actor3;
- Actor4 _actor4;
- Actor5 _actor5;
- Actor6 _actor6;
- Actor7 _actor7;
+ Joystick _joystick;
+ Screen _screen;
+ StorageCompartment _storageCompartment;
+ HatchButton _hatchButton;
+ ThrusterValve _thrusterValve;
+ Ignitor _ignitor;
SequenceManager _sequenceManager;
Scene1580();
@@ -692,17 +691,16 @@ class Scene1625 : public SceneExt {
virtual bool startAction(CursorType action, Event &event);
};
public:
- int _field412;
SpeakerMiranda1625 _mirandaSpeaker;
SpeakerTeal1625 _tealSpeaker;
SpeakerSoldier1625 _soldierSpeaker;
- NamedHotspot _item1;
- SceneActor _actor1;
+ NamedHotspot _background;
+ SceneActor _teal;
SceneActor _tealHead;
- SceneActor _actor3;
+ SceneActor _mirandaMouth;
SceneActor _glass;
- SceneActor _actor5;
- SceneActor _actor6;
+ SceneActor _wristRestraints;
+ SceneActor _tealRightArm;
Wire _wire;
SequenceManager _sequenceManager;
@@ -716,16 +714,11 @@ public:
};
class Scene1700 : public SceneExt {
- class Item2 : public NamedHotspot {
- public:
- virtual bool startAction(CursorType action, Event &event);
- };
-
class RimTransport : public SceneActor {
public:
virtual bool startAction(CursorType action, Event &event);
};
- class Actor12 : public SceneActor {
+ class Companion : public SceneActor {
public:
virtual bool startAction(CursorType action, Event &event);
};
@@ -745,10 +738,10 @@ class Scene1700 : public SceneExt {
public:
SpeakerQuinn _quinnSpeaker;
SpeakerSeeker _seekerSpeaker;
- NamedHotspot _item1;
- Item2 _item2;
- SceneActor _actor1;
- SceneActor _actor2;
+ NamedHotspot _surface;
+ NamedHotspot _background;
+ SceneActor _playerShadow;
+ SceneActor _companionShadow;
SceneActor _slabWest;
SceneActor _slabEast;
SceneActor _slabShadowWest;
@@ -756,16 +749,15 @@ public:
SceneActor _westPlatform;
SceneActor _rimTransportDoor;
SceneActor _ledgeHopper;
- SceneActor _actor10;
+ SceneActor _hatch;
RimTransport _rimTransport;
- Actor12 _actor12;
+ Companion _companion;
NorthExit _northExit;
SouthExit _southExit;
WestExit _westExit;
SequenceManager _sequenceManager;
- int _field77A;
- int _field77C;
+ bool _walkFlag;
Scene1700();
void synchronize(Serializer &s);
@@ -791,7 +783,6 @@ class Scene1750 : public SceneExt {
void setupSlider(int incrAmount, int xp, int ys, int height, int thumbHeight);
void calculateSlider();
- virtual void remove();
virtual void process(Event &event);
virtual bool startAction(CursorType action, Event &event);
};
@@ -808,13 +799,13 @@ class Scene1750 : public SceneExt {
public:
NamedHotspot _background;
- NamedHotspot _redLights;
+ NamedHotspot _redLightsDescr;
NamedHotspot _greenLights;
NamedHotspot _frontView;
NamedHotspot _rearView;
- SceneActor _actor1;
- SceneActor _actor2;
- SceneActor _actor3;
+ SceneActor _scannerIcon;
+ SceneActor _redLights;
+ SceneActor _radarSweep;
SpeedSlider _speedSlider;
Button _forwardButton;
Button _backwardButton;
@@ -823,12 +814,12 @@ public:
PaletteRotation *_rotation;
int _direction;
- int _field413;
+ int _speedCurrent;
int _speed;
- int _field417;
- int _field419;
- int _field41B;
- int _field41D;
+ int _speedDelta;
+ int _rotationSegment;
+ int _rotationSegCurrent;
+ int _newRotation;
Scene1750();
virtual void synchronize(Serializer &s);
@@ -859,7 +850,7 @@ class Scene1800 : public SceneExt {
virtual bool startAction(CursorType action, Event &event);
};
- class Exit1 : public SceneExit {
+ class SouthExit : public SceneExit {
public:
virtual void changeScene();
};
@@ -867,21 +858,21 @@ public:
int _locationMode;
SpeakerQuinn _quinnSpeaker;
SpeakerSeeker _seekerSpeaker;
- NamedHotspot _item1;
- NamedHotspot _item2;
- NamedHotspot _item3;
- NamedHotspot _item4;
+ NamedHotspot _elevator;
+ NamedHotspot _elevatorContents;
+ NamedHotspot _surface;
+ NamedHotspot _secBackground;
Background _background;
- SceneActor _actor1;
+ SceneActor _playerShadow;
SceneActor _companion;
- SceneActor _actor3;
+ SceneActor _companionShadow;
SceneActor _leftStaircase;
SceneActor _rightStaircase;
Lever _lever;
Doors _doors;
PassengerDoor _leftDoor;
PassengerDoor _rightDoor;
- Exit1 _exit1;
+ SouthExit _southExit;
SequenceManager _sequenceManager;
Scene1800();
@@ -902,7 +893,7 @@ class Scene1850 : public SceneExt {
public:
virtual bool startAction(CursorType action, Event &event);
};
- class Actor6 : public SceneActor {
+ class Door : public SceneActor {
public:
virtual bool startAction(CursorType action, Event &event);
};
@@ -912,24 +903,24 @@ class Scene1850 : public SceneExt {
};
public:
- int _field412;
- int _field414;
- int _field416;
- int _field418;
- Common::Point _field41A;
- int _field41E;
+ int _sceneMode;
+ int _shadeCountdown;
+ int _shadeDirection;
+ bool _shadeChanging;
+ Common::Point _playerDest;
+ int _seqNumber;
ScenePalette _palette1;
SpeakerQuinn _quinnSpeaker;
SpeakerSeeker _seekerSpeaker;
NamedHotspot _background;
Button _button;
SceneActor _companion;
- SceneActor _actor2;
- SceneActor _actor3;
- SceneActor _actor4;
+ SceneActor _airbag;
+ SceneActor _screen;
+ SceneActor _helmet;
Robot _robot;
- Actor6 _leftDoor;
- Actor6 _rightDoor;
+ Door _leftDoor;
+ Door _rightDoor;
DisplayScreen _displayScreen;
SequenceManager _sequenceManager1;
SequenceManager _sequenceManager2;
@@ -961,11 +952,10 @@ class Scene1875 : public SceneExt {
public:
SpeakerQuinn _quinnSpeaker;
SpeakerSeeker _seekerSpeaker;
- NamedHotspot _item1;
- NamedHotspot _item2;
- SceneActor _actor1;
- SceneActor _actor2;
- SceneActor _actor3;
+ NamedHotspot _background;
+ NamedHotspot _screen;
+ SceneActor _map;
+ SceneActor _rimPosition;
Button _button1;
Button _button2;
Button _button3;
@@ -996,9 +986,9 @@ public:
SpeakerSeeker1900 _seekerSpeaker;
NamedHotspot _background;
NamedHotspot _elevator;
- SceneActor _actor1;
- BackgroundSceneObject _object1;
- BackgroundSceneObject _object2;
+ SceneActor _companion;
+ BackgroundSceneObject _leftDoorFrame;
+ BackgroundSceneObject _rightDoorFrame;
LiftDoor _leftDoor, _rightDoor;
WestExit _westExit;
EastExit _eastExit;
@@ -1024,30 +1014,30 @@ class Scene1925 : public SceneExt {
public:
virtual void changeScene();
};
- class Exit2 : public SceneExit {
+ class ExitDown : public SceneExit {
public:
virtual void changeScene();
};
- class Exit3 : public SceneExit {
+ class WestExit : public SceneExit {
public:
virtual void changeScene();
};
- class Exit4 : public SceneExit {
+ class EastExit : public SceneExit {
public:
virtual void changeScene();
};
public:
- NamedHotspot _item1;
+ NamedHotspot _background;
Button _button;
Ladder _ladder;
- SceneActor _actor1;
+ SceneActor _door;
ExitUp _exitUp;
- Exit2 _exit2;
- Exit3 _exit3;
- Exit4 _exit4;
+ ExitDown _exitDown;
+ WestExit _westExit;
+ EastExit _eastExit;
SequenceManager _sequenceManager;
- int _field9B8;
+ int _newSceneMode;
int _levelResNum[5];
Scene1925();
@@ -1083,12 +1073,12 @@ class Scene1945 : public SceneExt {
virtual void changeScene();
};
public:
- NamedHotspot _item1;
- NamedHotspot _item2;
+ NamedHotspot _hole;
+ NamedHotspot _ice2;
Ice _ice;
Ladder _ladder;
- SceneActor _actor1;
- SceneActor _actor2;
+ SceneActor _coveringIce;
+ SceneActor _alcoholLamp;
Gunpowder _gunpowder;
ExitUp _exitUp;
CorridorExit _corridorExit;
@@ -1128,14 +1118,13 @@ class Scene1950 : public SceneExt {
SceneActor _areaActor;
KeypadButton _buttons[16];
- byte _field20;
int _buttonIndex;
KeypadWindow();
virtual void synchronize(Serializer &s);
virtual void remove();
- virtual void proc12(int visage, int stripFrameNum, int frameNum, int posX, int posY);
- virtual void proc13(int resNum, int lookLineNum, int talkLineNum, int useLineNum);
+ virtual void setup2(int visage, int stripFrameNum, int frameNum, int posX, int posY);
+ virtual void setup3(int resNum, int lookLineNum, int talkLineNum, int useLineNum);
};
class Keypad : public NamedHotspot {
@@ -1152,10 +1141,6 @@ class Scene1950 : public SceneExt {
public:
virtual bool startAction(CursorType action, Event &event);
};
- class Actor4 : public SceneActor {
- public:
- virtual bool startAction(CursorType action, Event &event);
- };
class Gem : public SceneActor {
public:
virtual bool startAction(CursorType action, Event &event);
@@ -1163,11 +1148,9 @@ class Scene1950 : public SceneExt {
class Vampire : public SceneActor {
public:
Common::Point _deadPosition;
- int _fieldA8;
- int _fieldAA;
+ int _deltaX;
+ int _deltaY;
int _vampireMode;
- byte _fieldAE;
- byte _fieldAF;
Vampire();
void synchronize(Serializer &s);
@@ -1223,7 +1206,7 @@ public:
SceneActor _containmentField;
Gem _gem;
SceneActor _cube;
- SceneActor _actor7;
+ SceneActor _pulsingLights;
Vampire _vampire;
KeypadWindow _KeypadWindow;
NorthExit _northExit;
@@ -1236,10 +1219,10 @@ public:
DoorExit _doorExit;
SequenceManager _sequenceManager;
- int _field412;
- int _field414;
- int _field416;
- Common::Point _field418;
+ bool _upExitStyle;
+ bool _removeFlag;
+ bool _vampireActive;
+ Common::Point _vampireDestPos;
int _vampireIndex;
Scene1950();
@@ -1250,6 +1233,7 @@ public:
virtual void signal();
virtual void process(Event &event);
};
+
} // End of namespace Ringworld2
} // End of namespace TsAGE
diff --git a/engines/tsage/ringworld2/ringworld2_scenes2.cpp b/engines/tsage/ringworld2/ringworld2_scenes2.cpp
index 510855b162..bd8a0cdd0d 100644
--- a/engines/tsage/ringworld2/ringworld2_scenes2.cpp
+++ b/engines/tsage/ringworld2/ringworld2_scenes2.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope 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.
@@ -132,25 +132,28 @@ void Scene2000::initPlayer() {
}
for (int i = 0; i < 11; i++) {
if (R2_GLOBALS._spillLocation[R2_GLOBALS._player._characterIndex] == R2_GLOBALS._spillLocation[3 + i])
- _objList1[i].show();
+ _persons[i].show();
}
- if ((R2_GLOBALS._player._characterScene[R2_QUINN] == R2_GLOBALS._player._characterScene[R2_SEEKER]) && (R2_GLOBALS._spillLocation[R2_QUINN] == R2_GLOBALS._spillLocation[R2_SEEKER])) {
- _object1.postInit();
+ if ((R2_GLOBALS._player._characterScene[R2_QUINN] == R2_GLOBALS._player._characterScene[R2_SEEKER])
+ && (R2_GLOBALS._spillLocation[R2_QUINN] == R2_GLOBALS._spillLocation[R2_SEEKER])) {
+ _companion.postInit();
if (R2_GLOBALS._player._characterIndex == R2_QUINN) {
- _object1.setup(20, 5, 1);
- _object1.setDetails(9002, 0, 4, 3, 1, (SceneItem *)NULL);
+ // Seeker is in room with Quinn
+ _companion.setup(20, 5, 1);
+ _companion.setDetails(9002, 0, 4, 3, 1, (SceneItem *)NULL);
} else {
- _object1.setup(2008, 5, 1);
- _object1.setDetails(9001, 0, 5, 3, 1, (SceneItem *)NULL);
+ // Quinn is in room with Seeker
+ _companion.setup(2008, 5, 1);
+ _companion.setDetails(9001, 0, 5, 3, 1, (SceneItem *)NULL);
}
if (_westExit._enabled) {
if (_eastExit._enabled)
- _object1.setPosition(Common::Point(180, 128));
+ _companion.setPosition(Common::Point(180, 128));
else
- _object1.setPosition(Common::Point(75, 128));
+ _companion.setPosition(Common::Point(75, 128));
} else
- _object1.setPosition(Common::Point(300, 128));
+ _companion.setPosition(Common::Point(300, 128));
}
}
@@ -174,9 +177,9 @@ void Scene2000::initExits() {
_doorExit._moving = false;
for (int i = 0; i < 11; i++)
- _objList1[i].hide();
+ _persons[i].hide();
- _object1.remove();
+ _companion.remove();
switch (R2_GLOBALS._spillLocation[R2_GLOBALS._player._characterIndex]) {
case 3:
@@ -393,11 +396,11 @@ void Scene2000::Action1::signal() {
_actionIndex = 1;
Common::Point pt(-20, 127);
NpcMover *mover = new NpcMover();
- scene->_objList1[_state].addMover(mover, &pt, scene);
+ scene->_persons[_state].addMover(mover, &pt, scene);
break;
}
case 1:
- scene->_objList1[_state].setPosition(Common::Point(340, 127));
+ scene->_persons[_state].setPosition(Common::Point(340, 127));
--R2_GLOBALS._spillLocation[4 + _state];
_actionIndex = 0;
switch (_state - 1) {
@@ -426,9 +429,9 @@ void Scene2000::Action1::signal() {
}
if (R2_GLOBALS._spillLocation[3 + _state] == R2_GLOBALS._spillLocation[R2_GLOBALS._player._characterIndex])
- scene->_objList1[_state].show();
+ scene->_persons[_state].show();
else
- scene->_objList1[_state].hide();
+ scene->_persons[_state].hide();
signal();
break;
@@ -436,11 +439,11 @@ void Scene2000::Action1::signal() {
_actionIndex = 6;
Common::Point pt(340, 127);
NpcMover *mover = new NpcMover();
- scene->_objList1[_state].addMover(mover, &pt, this);
+ scene->_persons[_state].addMover(mover, &pt, this);
break;
}
case 6:
- scene->_objList1[_state].setPosition(Common::Point(-20, 127));
+ scene->_persons[_state].setPosition(Common::Point(-20, 127));
++R2_GLOBALS._spillLocation[3 + _state];
_actionIndex = 5;
switch (_state - 1) {
@@ -469,33 +472,33 @@ void Scene2000::Action1::signal() {
}
if (R2_GLOBALS._spillLocation[3 + _state] == R2_GLOBALS._spillLocation[R2_GLOBALS._player._characterIndex])
- scene->_objList1[_state].show();
+ scene->_persons[_state].show();
else
- scene->_objList1[_state].hide();
+ scene->_persons[_state].hide();
signal();
break;
case 10: {
Common::Point pt(290, 127);
NpcMover *mover = new NpcMover();
- scene->_objList1[_state].addMover(mover, &pt, this);
+ scene->_persons[_state].addMover(mover, &pt, this);
_actionIndex = 11;
break;
}
case 11:
if (_state == 1)
- scene->_objList1[0].setStrip(1);
+ scene->_persons[0].setStrip(1);
else if (_state == 5)
- scene->_objList1[4].setStrip(1);
+ scene->_persons[4].setStrip(1);
setDelay(600);
_actionIndex = 12;
break;
case 12:
if (_state == 1)
- scene->_objList1[0].setStrip(2);
+ scene->_persons[0].setStrip(2);
else if (_state == 5)
- scene->_objList1[4].setStrip(2);
- scene->_objList1[_state].setStrip(1);
+ scene->_persons[4].setStrip(2);
+ scene->_persons[_state].setStrip(1);
_actionIndex = 5;
signal();
break;
@@ -503,29 +506,29 @@ void Scene2000::Action1::signal() {
if ((R2_GLOBALS._spillLocation[3 + _state] == 13) || (R2_GLOBALS._spillLocation[3 + _state] == 22) || (R2_GLOBALS._spillLocation[3 + _state] == 27)) {
Common::Point pt(30, 127);
NpcMover *mover = new NpcMover();
- scene->_objList1[_state].addMover(mover, &pt, this);
+ scene->_persons[_state].addMover(mover, &pt, this);
_actionIndex = 16;
} else {
Common::Point pt(120, 127);
NpcMover *mover = new NpcMover();
- scene->_objList1[_state].addMover(mover, &pt, this);
+ scene->_persons[_state].addMover(mover, &pt, this);
_actionIndex = 16;
}
break;
case 16:
if (_state == 1)
- scene->_objList1[2].setStrip(2);
+ scene->_persons[2].setStrip(2);
else if (_state == 8)
- scene->_objList1[9].setStrip(2);
+ scene->_persons[9].setStrip(2);
setDelay(600);
_actionIndex = 17;
break;
case 17:
if (_state == 1)
- scene->_objList1[2].setStrip(1);
+ scene->_persons[2].setStrip(1);
else if (_state == 8)
- scene->_objList1[9].setStrip(1);
- scene->_objList1[_state].setStrip(2);
+ scene->_persons[9].setStrip(1);
+ scene->_persons[_state].setStrip(2);
_actionIndex = 0;
break;
case 99:
@@ -806,57 +809,57 @@ void Scene2000::postInit(SceneObjectList *OwnerList) {
_action5._state = 3;
for (int i = 0; i < 11; i++)
- _objList1[i].postInit();
+ _persons[i].postInit();
- _objList1[0].setVisage(2000);
- _objList1[0].setStrip(2);
- _objList1[0].setDetails(2001, 0, -1, -1, 1, (SceneItem *)NULL);
+ _persons[0].setVisage(2000);
+ _persons[0].setStrip(2);
+ _persons[0].setDetails(2001, 0, -1, -1, 1, (SceneItem *)NULL);
- _objList1[1].setVisage(2001);
- _objList1[1].setStrip(2);
- _objList1[1].setDetails(2001, 0, -1, -1, 1, (SceneItem *)NULL);
+ _persons[1].setVisage(2001);
+ _persons[1].setStrip(2);
+ _persons[1].setDetails(2001, 0, -1, -1, 1, (SceneItem *)NULL);
- _objList1[2].setVisage(2003);
- _objList1[2].setStrip(1);
- _objList1[2].setDetails(2001, 0, -1, -1, 1, (SceneItem *)NULL);
+ _persons[2].setVisage(2003);
+ _persons[2].setStrip(1);
+ _persons[2].setDetails(2001, 0, -1, -1, 1, (SceneItem *)NULL);
- _objList1[3].setVisage(2007);
- _objList1[3].setStrip(2);
- _objList1[3].setDetails(2001, 12, -1, -1, 1, (SceneItem *)NULL);
+ _persons[3].setVisage(2007);
+ _persons[3].setStrip(2);
+ _persons[3].setDetails(2001, 12, -1, -1, 1, (SceneItem *)NULL);
- _objList1[4].setVisage(2004);
- _objList1[4].setStrip(2);
- _objList1[4].setDetails(2001, 19, -1, -1, 1, (SceneItem *)NULL);
+ _persons[4].setVisage(2004);
+ _persons[4].setStrip(2);
+ _persons[4].setDetails(2001, 19, -1, -1, 1, (SceneItem *)NULL);
- _objList1[5].setVisage(2003);
- _objList1[5].setStrip(2);
- _objList1[5].setDetails(2001, 0, -1, -1, 1, (SceneItem *)NULL);
+ _persons[5].setVisage(2003);
+ _persons[5].setStrip(2);
+ _persons[5].setDetails(2001, 0, -1, -1, 1, (SceneItem *)NULL);
- _objList1[6].setVisage(2000);
- _objList1[6].setStrip(1);
- _objList1[6].setDetails(2001, 0, -1, -1, 1, (SceneItem *)NULL);
+ _persons[6].setVisage(2000);
+ _persons[6].setStrip(1);
+ _persons[6].setDetails(2001, 0, -1, -1, 1, (SceneItem *)NULL);
- _objList1[7].setVisage(2000);
- _objList1[7].setStrip(2);
- _objList1[7].setDetails(2001, 0, -1, -1, 1, (SceneItem *)NULL);
+ _persons[7].setVisage(2000);
+ _persons[7].setStrip(2);
+ _persons[7].setDetails(2001, 0, -1, -1, 1, (SceneItem *)NULL);
- _objList1[8].setVisage(2000);
- _objList1[8].setStrip(2);
- _objList1[8].setDetails(2001, 0, -1, -1, 1, (SceneItem *)NULL);
+ _persons[8].setVisage(2000);
+ _persons[8].setStrip(2);
+ _persons[8].setDetails(2001, 0, -1, -1, 1, (SceneItem *)NULL);
- _objList1[9].setVisage(2006);
- _objList1[9].setStrip(1);
- _objList1[9].setDetails(2001, 6, -1, -1, 1, (SceneItem *)NULL);
+ _persons[9].setVisage(2006);
+ _persons[9].setStrip(1);
+ _persons[9].setDetails(2001, 6, -1, -1, 1, (SceneItem *)NULL);
- _objList1[10].setVisage(2007);
- _objList1[10].setStrip(1);
- _objList1[10].setDetails(2001, 12, -1, -1, 1, (SceneItem *)NULL);
+ _persons[10].setVisage(2007);
+ _persons[10].setStrip(1);
+ _persons[10].setDetails(2001, 12, -1, -1, 1, (SceneItem *)NULL);
for (int i = 0; i < 11; i++) {
- _objList1[i].animate(ANIM_MODE_1, NULL);
- _objList1[i]._moveDiff.x = 3;
- _objList1[i]._moveRate = 8;
- _objList1[i].hide();
+ _persons[i].animate(ANIM_MODE_1, NULL);
+ _persons[i]._moveDiff.x = 3;
+ _persons[i]._moveRate = 8;
+ _persons[i].hide();
switch (i - 1) {
case 0:
if (R2_GLOBALS._spillLocation[3 + i] == 1)
@@ -899,28 +902,28 @@ void Scene2000::postInit(SceneObjectList *OwnerList) {
case 22:
case 27:
case 30:
- _objList1[i].setPosition(Common::Point(265, 127));
+ _persons[i].setPosition(Common::Point(265, 127));
break;
case 5:
case 12:
case 17:
case 21:
case 26:
- _objList1[i].setPosition(Common::Point(55, 127));
+ _persons[i].setPosition(Common::Point(55, 127));
break;
default:
- _objList1[i].setPosition(Common::Point(160, 127));
+ _persons[i].setPosition(Common::Point(160, 127));
break;
}
}
- _objList1[1].setAction(&_action2);
- _objList1[3].setAction(&_action5);
- _objList1[5].setAction(&_action4);
- _objList1[8].setAction(&_action1);
+ _persons[1].setAction(&_action2);
+ _persons[3].setAction(&_action5);
+ _persons[5].setAction(&_action4);
+ _persons[8].setAction(&_action1);
initPlayer();
- _item1.setDetails(Rect(0, 0, 320, 200), 2000, 0, -1, 23, 1, NULL);
+ _background.setDetails(Rect(0, 0, 320, 200), 2000, 0, -1, 23, 1, NULL);
SceneExt::postInit();
}
@@ -997,8 +1000,6 @@ void Scene2000::signal() {
g_globals->_sceneManager.changeScene(2535);
break;
default:
- if (R2_GLOBALS._v56AAB != 0)
- R2_GLOBALS._v56AAB = 0;
R2_GLOBALS._player.enableControl(CURSOR_WALK);
break;
}
@@ -1008,7 +1009,6 @@ void Scene2000::signal() {
g_globals->_sceneManager.changeScene(2350);
break;
default:
- R2_GLOBALS._v56AAB = 0;
R2_GLOBALS._player.enableControl();
break;
}
@@ -1039,20 +1039,20 @@ void Scene2000::synchronize(Serializer &s) {
*
*--------------------------------------------------------------------------*/
-bool Scene2350::Actor2::startAction(CursorType action, Event &event) {
+bool Scene2350::Companion::startAction(CursorType action, Event &event) {
if (action != R2_SENSOR_PROBE)
return(SceneActor::startAction(action, event));
return true;
}
-bool Scene2350::Actor3::startAction(CursorType action, Event &event) {
- Scene2350 *scene = (Scene2350 *)R2_GLOBALS._sceneManager._scene;
-
+bool Scene2350::Balloon::startAction(CursorType action, Event &event) {
if ((action == R2_REBREATHER_TANK) && (R2_GLOBALS.getFlag(74))) {
+ Scene2350 *scene = (Scene2350 *)R2_GLOBALS._sceneManager._scene;
+
R2_GLOBALS._player.disableControl();
- scene->_actor1.postInit();
+ scene->_person.postInit();
scene->_sceneMode = 2355;
- scene->setAction(&scene->_sequenceManager, scene, 2355, &R2_GLOBALS._player, &scene->_actor1, NULL);
+ scene->setAction(&scene->_sequenceManager, scene, 2355, &R2_GLOBALS._player, &scene->_person, NULL);
return true;
}
@@ -1061,8 +1061,9 @@ bool Scene2350::Actor3::startAction(CursorType action, Event &event) {
void Scene2350::ExitUp::changeScene() {
Scene2350 *scene = (Scene2350 *)R2_GLOBALS._sceneManager._scene;
+ _enabled = false;
- R2_GLOBALS._player.disableControl(CURSOR_CROSSHAIRS);
+ R2_GLOBALS._player.disableControl(CURSOR_WALK);
scene->_sceneMode = 12;
if (R2_GLOBALS._player._characterIndex == R2_QUINN)
scene->setAction(&scene->_sequenceManager, scene, 2350, &R2_GLOBALS._player, NULL);
@@ -1109,37 +1110,37 @@ void Scene2350::postInit(SceneObjectList *OwnerList) {
}
if (R2_GLOBALS._player._characterScene[R2_QUINN] == R2_GLOBALS._player._characterScene[R2_SEEKER]) {
- _actor2.postInit();
+ _companion.postInit();
if (R2_GLOBALS._player._characterIndex == R2_QUINN) {
- _actor2.setup(20, 5, 1);
- _actor2.setDetails(9002, 0, 4, 3, 1, (SceneItem *)NULL);
+ _companion.setup(20, 5, 1);
+ _companion.setDetails(9002, 0, 4, 3, 1, (SceneItem *)NULL);
} else {
- _actor2.setup(2008, 5, 1);
- _actor2.setDetails(9001, 0, 5, 3, 1, (SceneItem *)NULL);
+ _companion.setup(2008, 5, 1);
+ _companion.setDetails(9001, 0, 5, 3, 1, (SceneItem *)NULL);
}
- _actor2.setPosition(Common::Point(135, 128));
+ _companion.setPosition(Common::Point(135, 128));
}
- _actor3.postInit();
- _actor4.postInit();
+ _balloon.postInit();
+ _harness.postInit();
if (R2_INVENTORY.getObjectScene(R2_REBREATHER_TANK) == 2350) {
- _actor3.hide();
- _actor4.hide();
+ _balloon.hide();
+ _harness.hide();
} else {
- _actor3.setup(2350, 0, 1);
- _actor3.setPosition(Common::Point(197, 101));
- _actor3.setDetails(2000, 12, -1, -1, 1, (SceneItem *)NULL);
- _actor3.fixPriority(10);
- _actor4.setup(2350, 1, 2);
- _actor4.setPosition(Common::Point(199, 129));
- _actor4.setDetails(2000, 12, -1, -1, 1, (SceneItem *)NULL);
- _actor4.fixPriority(10);
- }
- _item1.setDetails(Rect(0, 0, 320, 200), 2000, 9, -1, -1, 1, NULL);
+ _balloon.setup(2350, 0, 1);
+ _balloon.setPosition(Common::Point(197, 101));
+ _balloon.setDetails(2000, 12, -1, -1, 1, (SceneItem *)NULL);
+ _balloon.fixPriority(10);
+ _harness.setup(2350, 1, 2);
+ _harness.setPosition(Common::Point(199, 129));
+ _harness.setDetails(2000, 12, -1, -1, 1, (SceneItem *)NULL);
+ _harness.fixPriority(10);
+ }
+ _background.setDetails(Rect(0, 0, 320, 200), 2000, 9, -1, -1, 1, NULL);
R2_GLOBALS._player.disableControl();
if (R2_GLOBALS._player._oldCharacterScene[R2_GLOBALS._player._characterIndex] == 2000) {
- if (R2_GLOBALS._spillLocation[R2_GLOBALS._player._characterIndex] == 34) {
+ if (R2_GLOBALS._spillLocation[R2_GLOBALS._player._characterIndex] != 34) {
if (R2_GLOBALS._player._characterIndex == R2_QUINN)
_sceneMode = 2351;
else
@@ -1201,23 +1202,12 @@ void Scene2350::signal() {
}
}
-void Scene2350::process(Event &event) {
- if ((R2_GLOBALS._player._canWalk) && (event.eventType != EVENT_BUTTON_DOWN) &&
- (R2_GLOBALS._events.getCursor() == CURSOR_CROSSHAIRS)){
- Common::Point pt(event.mousePos.x, 129);
- PlayerMover *mover = new PlayerMover();
- R2_GLOBALS._player.addMover(mover, &pt);
- event.handled = true;
- }
- Scene::process(event);
-}
-
/*--------------------------------------------------------------------------
* Scene 2400 - Spill Mountains: Large empty room
*
*--------------------------------------------------------------------------*/
-void Scene2400::Exit1::changeScene() {
+void Scene2400::WestExit::changeScene() {
Scene2400 *scene = (Scene2400 *)R2_GLOBALS._sceneManager._scene;
R2_GLOBALS._player.disableControl();
@@ -1229,7 +1219,7 @@ void Scene2400::Exit1::changeScene() {
}
-void Scene2400::Exit2::changeScene() {
+void Scene2400::EastExit::changeScene() {
Scene2400 *scene = (Scene2400 *)R2_GLOBALS._sceneManager._scene;
R2_GLOBALS._player.disableControl();
@@ -1243,10 +1233,10 @@ void Scene2400::Exit2::changeScene() {
void Scene2400::postInit(SceneObjectList *OwnerList) {
loadScene(2400);
SceneExt::postInit();
- _exit1.setDetails(Rect(0, 125, 14, 165), EXITCURSOR_W, 2000);
- _exit1.setDest(Common::Point(14, 150));
- _exit2.setDetails(Rect(305, 125, 320, 165), EXITCURSOR_E, 2000);
- _exit2.setDest(Common::Point(315, 150));
+ _westExit.setDetails(Rect(0, 125, 14, 165), EXITCURSOR_W, 2000);
+ _westExit.setDest(Common::Point(14, 150));
+ _eastExit.setDetails(Rect(305, 125, 320, 165), EXITCURSOR_E, 2000);
+ _eastExit.setDest(Common::Point(315, 150));
R2_GLOBALS._player.postInit();
R2_GLOBALS._player.disableControl();
@@ -1281,9 +1271,9 @@ void Scene2400::signal() {
*--------------------------------------------------------------------------*/
bool Scene2425::RopeDest1::startAction(CursorType action, Event &event) {
- Scene2425 *scene = (Scene2425 *)R2_GLOBALS._sceneManager._scene;
-
if ((action == R2_CURSOR_ROPE) && (!R2_GLOBALS.getFlag(84))) {
+ Scene2425 *scene = (Scene2425 *)R2_GLOBALS._sceneManager._scene;
+
R2_GLOBALS._player.disableControl();
scene->_sceneMode = 2426;
scene->setAction(&scene->_sequenceManager, scene, 2426, &R2_GLOBALS._player, &scene->_rope, NULL);
@@ -1298,9 +1288,9 @@ bool Scene2425::RopeDest1::startAction(CursorType action, Event &event) {
}
bool Scene2425::RopeDest2::startAction(CursorType action, Event &event) {
- Scene2425 *scene = (Scene2425 *)R2_GLOBALS._sceneManager._scene;
-
if ((action == R2_CURSOR_ROPE) && (R2_GLOBALS.getFlag(84))) {
+ Scene2425 *scene = (Scene2425 *)R2_GLOBALS._sceneManager._scene;
+
R2_GLOBALS._player.disableControl();
scene->_sceneMode = 2427;
scene->setAction(&scene->_sequenceManager, scene, 2427, &R2_GLOBALS._player, &scene->_rope, NULL);
@@ -1315,11 +1305,11 @@ bool Scene2425::RopeDest2::startAction(CursorType action, Event &event) {
}
bool Scene2425::Crevasse::startAction(CursorType action, Event &event) {
- Scene2425 *scene = (Scene2425 *)R2_GLOBALS._sceneManager._scene;
-
if (action != R2_CURSOR_ROPE)
return NamedHotspot::startAction(action, event);
else {
+ Scene2425 *scene = (Scene2425 *)R2_GLOBALS._sceneManager._scene;
+
R2_GLOBALS._player.disableControl();
if (R2_GLOBALS.getFlag(84)) {
scene->_sceneMode = 20;
@@ -1333,7 +1323,7 @@ bool Scene2425::Crevasse::startAction(CursorType action, Event &event) {
}
}
-bool Scene2425::Item4::startAction(CursorType action, Event &event) {
+bool Scene2425::Background::startAction(CursorType action, Event &event) {
if (action != R2_CURSOR_ROPE)
return NamedHotspot::startAction(action, event);
else {
@@ -1367,7 +1357,7 @@ bool Scene2425::Pictographs::startAction(CursorType action, Event &event) {
}
}
-void Scene2425::Exit1::changeScene() {
+void Scene2425::SouthEastExit::changeScene() {
Scene2425 *scene = (Scene2425 *)R2_GLOBALS._sceneManager._scene;
_enabled = false;
@@ -1390,7 +1380,7 @@ void Scene2425::postInit(SceneObjectList *OwnerList) {
}
R2_GLOBALS._sound1.play(200);
- _exit1.setDetails(Rect(270, 136, 319, 168), EXITCURSOR_SE, 2000);
+ _southEastExit.setDetails(Rect(270, 136, 319, 168), EXITCURSOR_SE, 2000);
R2_GLOBALS._player.postInit();
R2_GLOBALS._player.animate(ANIM_MODE_1, NULL);
@@ -1426,8 +1416,6 @@ void Scene2425::postInit(SceneObjectList *OwnerList) {
_ropeDest1.setDetails(Rect(225, 52, 248, 65), 2425, -1, -1, -1, 1, NULL);
_ropeDest2.setDetails(Rect(292, 81, 316, 94), 2425, -1, -1, -1, 1, NULL);
-// CHECKME: SceneActor using a SceneItem function??
-// _pictographs2.setDetails(11, 2425, 3, -1, 6);
_pictographs2._sceneRegionId = 11;
_pictographs2._resNum = 2425;
_pictographs2._lookLineNum = 3;
@@ -1436,7 +1424,7 @@ void Scene2425::postInit(SceneObjectList *OwnerList) {
g_globals->_sceneItems.push_back(&_pictographs2);
_crevasse.setDetails(12, 2425, 7, -1, 9);
- _item4.setDetails(Rect(0, 0, 320, 200), 2425, 0, -1, -1, 1, NULL);
+ _background.setDetails(Rect(0, 0, 320, 200), 2425, 0, -1, -1, 1, NULL);
R2_GLOBALS._player.disableControl();
switch (R2_GLOBALS._player._oldCharacterScene[R2_GLOBALS._player._characterIndex]) {
@@ -1495,16 +1483,16 @@ void Scene2425::signal() {
*
*--------------------------------------------------------------------------*/
-bool Scene2430::Actor1::startAction(CursorType action, Event &event) {
+bool Scene2430::Companion::startAction(CursorType action, Event &event) {
return SceneActor::startAction(action, event);
}
bool Scene2430::GunPowder::startAction(CursorType action, Event &event) {
- Scene2430 *scene = (Scene2430 *)R2_GLOBALS._sceneManager._scene;
-
if ((action != CURSOR_USE) || (R2_GLOBALS._player._characterIndex != 2))
return SceneActor::startAction(action, event);
+ Scene2430 *scene = (Scene2430 *)R2_GLOBALS._sceneManager._scene;
+
R2_GLOBALS._player.disableControl();
scene->_sceneMode = 2430;
scene->setAction(&scene->_sequenceManager, scene, 2430, &R2_GLOBALS._player, &scene->_gunPowder, NULL);
@@ -1512,18 +1500,18 @@ bool Scene2430::GunPowder::startAction(CursorType action, Event &event) {
}
bool Scene2430::OilLamp::startAction(CursorType action, Event &event) {
- Scene2430 *scene = (Scene2430 *)R2_GLOBALS._sceneManager._scene;
-
if ((action != CURSOR_USE) || (R2_GLOBALS._player._characterIndex != 2))
return SceneActor::startAction(action, event);
+ Scene2430 *scene = (Scene2430 *)R2_GLOBALS._sceneManager._scene;
+
R2_GLOBALS._player.disableControl();
scene->_sceneMode = 2435;
scene->setAction(&scene->_sequenceManager, scene, 2435, &R2_GLOBALS._player, &scene->_oilLamp, NULL);
return true;
}
-void Scene2430::Exit1::changeScene() {
+void Scene2430::SouthExit::changeScene() {
Scene2430 *scene = (Scene2430 *)R2_GLOBALS._sceneManager._scene;
scene->_sceneMode = 0;
@@ -1538,8 +1526,8 @@ void Scene2430::Exit1::changeScene() {
void Scene2430::postInit(SceneObjectList *OwnerList) {
loadScene(2430);
SceneExt::postInit();
- _exit1.setDetails(Rect(68, 155, 147, 168), EXITCURSOR_S, 2000);
- _exit1.setDest(Common::Point(108, 160));
+ _southExit.setDetails(Rect(68, 155, 147, 168), EXITCURSOR_S, 2000);
+ _southExit.setDest(Common::Point(108, 160));
if (R2_INVENTORY.getObjectScene(R2_GUNPOWDER) == 2430) {
_gunPowder.postInit();
@@ -1568,33 +1556,31 @@ void Scene2430::postInit(SceneObjectList *OwnerList) {
R2_GLOBALS._player.setPosition(Common::Point(100, 200));
if (R2_GLOBALS._player._characterScene[R2_QUINN] == R2_GLOBALS._player._characterScene[R2_SEEKER]) {
- _actor1.postInit();
+ _companion.postInit();
if (R2_GLOBALS._player._characterIndex == R2_QUINN) {
- _actor1.setup(20, 5, 1);
- _actor1.setDetails(9002, 0, 4, 3, 1, (SceneItem *)NULL);
+ _companion.setup(20, 5, 1);
+ _companion.setDetails(9002, 0, 4, 3, 1, (SceneItem *)NULL);
} else {
- _actor1.setup(2008, 5, 1);
- _actor1.setDetails(9001, 0, 5, 3, 1, (SceneItem *)NULL);
+ _companion.setup(2008, 5, 1);
+ _companion.setDetails(9001, 0, 5, 3, 1, (SceneItem *)NULL);
}
- _actor1.setPosition(Common::Point(189, 137));
+ _companion.setPosition(Common::Point(189, 137));
R2_GLOBALS._walkRegions.disableRegion(4);
}
- _item2.setDetails(Rect(11, 30, 37, 45), 2430, 3, -1, 5, 1, NULL);
- _item3.setDetails(Rect(9, 58, 63, 92), 2430, 6, -1, -1, 1, NULL);
- _item4.setDetails(Rect(20, 89, 127, 107), 2430, 9, -1, 11, 1, NULL);
- _item5.setDetails(Rect(49, 7, 60, 27), 2430, 12, 13, 14, 1, NULL);
- _item6.setDetails(Rect(69, 10, 95, 72), 2430, 15, -1, 14, 1, NULL);
- _item10.setDetails(Rect(198, 4, 222, 146), 2430, 30, 31, 32, 1, NULL);
- _item7.setDetails(Rect(155, 40, 304, 120), 2430, 21, -1, 23, 1, NULL);
- _item8.setDetails(Rect(249, 3, 261, 39), 2430, 24, 25, -1, 1, NULL);
- _item9.setDetails(Rect(279, 13, 305, 34), 2430, 33, -1, 18, 1, NULL);
- // CHECKME: initialized for the 2nd time??
- _item2.setDetails(Rect(11, 30, 37, 45), 2430, 33, -1, 18, 1, NULL);
- _item11.setDetails(Rect(116, 104, 148, 111), 2430, 39, -1, -1, 1, NULL);
- _item12.setDetails(Rect(66, 77, 84, 83), 2430, 39, -1, -1, 1, NULL);
- _item13.setDetails(Rect(117, 118, 201, 141), 2430, 9, -1, 11, 1, NULL);
- _item1.setDetails(Rect(0, 0, 320, 200), 2430, 0, -1, -1, 1, NULL);
+ _furnishings.setDetails(Rect(9, 58, 63, 92), 2430, 6, -1, -1, 1, NULL);
+ _rug1.setDetails(Rect(20, 89, 127, 107), 2430, 9, -1, 11, 1, NULL);
+ _mirror.setDetails(Rect(49, 7, 60, 27), 2430, 12, 13, 14, 1, NULL);
+ _garments.setDetails(Rect(69, 10, 95, 72), 2430, 15, -1, 14, 1, NULL);
+ _post.setDetails(Rect(198, 4, 222, 146), 2430, 30, 31, 32, 1, NULL);
+ _bed.setDetails(Rect(155, 40, 304, 120), 2430, 21, -1, 23, 1, NULL);
+ _towel.setDetails(Rect(249, 3, 261, 39), 2430, 24, 25, -1, 1, NULL);
+ _bottles1.setDetails(Rect(279, 13, 305, 34), 2430, 33, -1, 18, 1, NULL);
+ _bottles2.setDetails(Rect(11, 30, 37, 45), 2430, 33, -1, 18, 1, NULL);
+ _clothesPile1.setDetails(Rect(116, 104, 148, 111), 2430, 39, -1, -1, 1, NULL);
+ _clothesPile2.setDetails(Rect(66, 77, 84, 83), 2430, 39, -1, -1, 1, NULL);
+ _rug2.setDetails(Rect(117, 118, 201, 141), 2430, 9, -1, 11, 1, NULL);
+ _background.setDetails(Rect(0, 0, 320, 200), 2430, 0, -1, -1, 1, NULL);
if (R2_GLOBALS._player._oldCharacterScene[R2_GLOBALS._player._characterIndex] == 2000) {
R2_GLOBALS._player._oldCharacterScene[R2_GLOBALS._player._characterIndex] = 2430;
@@ -1675,7 +1661,7 @@ bool Scene2435::Astor::startAction(CursorType action, Event &event) {
}
}
-void Scene2435::Exit1::changeScene() {
+void Scene2435::SouthExit::changeScene() {
Scene2435 *scene = (Scene2435 *)R2_GLOBALS._sceneManager._scene;
_enabled = false;
@@ -1695,8 +1681,8 @@ void Scene2435::postInit(SceneObjectList *OwnerList) {
_stripManager.addSpeaker(&_quinnSpeaker);
_stripManager.addSpeaker(&_seekerSpeaker);
_stripManager.addSpeaker(&_pharishaSpeaker);
- _exit1.setDetails(Rect(142, 155, 207, 167), EXITCURSOR_S, 2000);
- _exit1.setDest(Common::Point(175, 160));
+ _southExit.setDetails(Rect(142, 155, 207, 167), EXITCURSOR_S, 2000);
+ _southExit.setDest(Common::Point(175, 160));
_astor.postInit();
_astor.setup(2005, 3, 1);
_astor.setPosition(Common::Point(219, 106));
@@ -1784,6 +1770,7 @@ void Scene2435::signal() {
_sceneMode = 20;
R2_GLOBALS._events.setCursor(CURSOR_ARROW);
_stripManager.start(709, this);
+ break;
default:
R2_GLOBALS._player.enableControl();
break;
@@ -1795,14 +1782,14 @@ void Scene2435::signal() {
*
*--------------------------------------------------------------------------*/
-bool Scene2440::Actor1::startAction(CursorType action, Event &event) {
+bool Scene2440::Companion::startAction(CursorType action, Event &event) {
return SceneActor::startAction(action, event);
}
bool Scene2440::OilLamp::startAction(CursorType action, Event &event) {
- Scene2440 *scene = (Scene2440 *)R2_GLOBALS._sceneManager._scene;
-
if ((action == CURSOR_USE) && (R2_GLOBALS._player._characterIndex == R2_SEEKER)) {
+ Scene2440 *scene = (Scene2440 *)R2_GLOBALS._sceneManager._scene;
+
R2_GLOBALS._player.disableControl();
scene->_sceneMode = 2440;
scene->setAction(&scene->_sequenceManager, scene, 2440, &R2_GLOBALS._player, &scene->_oilLamp, NULL);
@@ -1812,7 +1799,7 @@ bool Scene2440::OilLamp::startAction(CursorType action, Event &event) {
return SceneActor::startAction(action, event);
}
-void Scene2440::Exit1::changeScene() {
+void Scene2440::SouthEastExit::changeScene() {
Scene2440 *scene = (Scene2440 *)R2_GLOBALS._sceneManager._scene;
_enabled = false;
@@ -1828,8 +1815,8 @@ void Scene2440::postInit(SceneObjectList *OwnerList) {
SceneExt::postInit();
R2_GLOBALS._sound1.play(200);
// Fix exit cursor, the original was using NW
- _exit1.setDetails(Rect(172, 155, 250, 167), EXITCURSOR_SE, 2000);
- _exit1.setDest(Common::Point(210, 160));
+ _southEastExit.setDetails(Rect(172, 155, 250, 167), EXITCURSOR_SE, 2000);
+ _southEastExit.setDest(Common::Point(210, 160));
if (R2_INVENTORY.getObjectScene(R2_ALCOHOL_LAMP_2) == 2440) {
_oilLamp.postInit();
_oilLamp.setup(2435, 1, 1);
@@ -1850,24 +1837,24 @@ void Scene2440::postInit(SceneObjectList *OwnerList) {
}
R2_GLOBALS._player.setPosition(Common::Point(210, 200));
if (R2_GLOBALS._player._characterScene[R2_QUINN] == R2_GLOBALS._player._characterScene[R2_SEEKER]) {
- _actor1.postInit();
+ _companion.postInit();
if (R2_GLOBALS._player._characterIndex == R2_QUINN) {
- _actor1.setup(20, 5, 1);
- _actor1.setDetails(9002, 0, 4, 3, 1, (SceneItem *)NULL);
+ _companion.setup(20, 5, 1);
+ _companion.setDetails(9002, 0, 4, 3, 1, (SceneItem *)NULL);
} else {
- _actor1.setup(2008, 5, 1);
- _actor1.setDetails(9002, 0, 5, 3, 1, (SceneItem *)NULL);
+ _companion.setup(2008, 5, 1);
+ _companion.setDetails(9002, 0, 5, 3, 1, (SceneItem *)NULL);
}
- _actor1.setPosition(Common::Point(38, 119));
+ _companion.setPosition(Common::Point(38, 119));
}
- _item2.setDetails(Rect(125, 25, 142, 73), 2430, 15, -1, 14, 1, NULL);
- _item3.setDetails(Rect(124, 78, 237, 120), 2430, 36, -1, 38, 1, NULL);
- _item4.setDetails(Rect(250, 3, 265, 133), 2430, 30, 31, 32, 1, NULL);
- _item5.setDetails(Rect(91, 117, 203, 140), 2430, 9, -1, 11, 1, NULL);
- _item6.setDetails(Rect(48, 78, 103, 112), 2430, 6, -1, -1, 1, NULL);
- _item7.setDetails(Rect(48, 31, 73, 52), 2430, 33, -1, 18, 1, NULL);
- _item1.setDetails(Rect(0, 0, 320, 200), 2430, 0, -1, -1, 1, NULL);
+ _garments.setDetails(Rect(125, 25, 142, 73), 2430, 15, -1, 14, 1, NULL);
+ _bedspread.setDetails(Rect(124, 78, 237, 120), 2430, 36, -1, 38, 1, NULL);
+ _post.setDetails(Rect(250, 3, 265, 133), 2430, 30, 31, 32, 1, NULL);
+ _rug.setDetails(Rect(91, 117, 203, 140), 2430, 9, -1, 11, 1, NULL);
+ _furnishings.setDetails(Rect(48, 78, 103, 112), 2430, 6, -1, -1, 1, NULL);
+ _bottles.setDetails(Rect(48, 31, 73, 52), 2430, 33, -1, 18, 1, NULL);
+ _background.setDetails(Rect(0, 0, 320, 200), 2430, 0, -1, -1, 1, NULL);
R2_GLOBALS._player.disableControl();
@@ -1928,9 +1915,9 @@ void Scene2445::signal() {
*--------------------------------------------------------------------------*/
bool Scene2450::Parker::startAction(CursorType action, Event &event) {
- Scene2450 *scene = (Scene2450 *)R2_GLOBALS._sceneManager._scene;
-
if ((action == CURSOR_USE) && (R2_GLOBALS._player._characterIndex == R2_QUINN)) {
+ Scene2450 *scene = (Scene2450 *)R2_GLOBALS._sceneManager._scene;
+
R2_GLOBALS._player.disableControl();
scene->_sceneMode = 2452;
scene->setAction(&scene->_sequenceManager, scene, 2452, &R2_GLOBALS._player, &scene->_parker, NULL);
@@ -1940,18 +1927,18 @@ bool Scene2450::Parker::startAction(CursorType action, Event &event) {
}
bool Scene2450::CareTaker::startAction(CursorType action, Event &event) {
- Scene2450 *scene = (Scene2450 *)R2_GLOBALS._sceneManager._scene;
-
if (action == CURSOR_TALK) {
R2_GLOBALS._player.disableControl();
- if (R2_GLOBALS._v565AE < 3) {
- ++R2_GLOBALS._v565AE;
+ if (R2_GLOBALS._stripModifier < 3) {
+ Scene2450 *scene = (Scene2450 *)R2_GLOBALS._sceneManager._scene;
+
+ ++R2_GLOBALS._stripModifier;
scene->_sceneMode = 20;
R2_GLOBALS._events.setCursor(CURSOR_CROSSHAIRS);
if (R2_GLOBALS._player._characterIndex == R2_QUINN)
- scene->_stripManager.start(699 + (R2_GLOBALS._v565AE * 2), scene);
+ scene->_stripManager.start(699 + (R2_GLOBALS._stripModifier * 2), scene);
else
- scene->_stripManager.start(700 + (R2_GLOBALS._v565AE * 2), scene);
+ scene->_stripManager.start(700 + (R2_GLOBALS._stripModifier * 2), scene);
}
return true;
} else {
@@ -1959,10 +1946,10 @@ bool Scene2450::CareTaker::startAction(CursorType action, Event &event) {
}
}
-void Scene2450::Exit1::changeScene() {
- Scene2450 *scene = (Scene2450 *)R2_GLOBALS._sceneManager._scene;
-
+void Scene2450::SouthWestExit::changeScene() {
if ((R2_GLOBALS._player._characterIndex == R2_SEEKER) || (R2_GLOBALS.getFlag(61))) {
+ Scene2450 *scene = (Scene2450 *)R2_GLOBALS._sceneManager._scene;
+
_enabled = false;
R2_GLOBALS._events.setCursor(CURSOR_ARROW);
R2_GLOBALS._player.disableControl();
@@ -1972,7 +1959,7 @@ void Scene2450::Exit1::changeScene() {
R2_GLOBALS._player.addMover(mover, &pt, scene);
} else {
_moving = false;
- SceneItem::display(2450, 3, 0, 280, 1, 160, 9, 1, 2, 20, 7, 7, -999);
+ SceneItem::display(2450, 3, 0, 280, 1, 160, 9, 1, 2, 20, 7, 7, LIST_END);
Common::Point pt(60, 140);
NpcMover *mover = new NpcMover();
R2_GLOBALS._player.addMover(mover, &pt, NULL);
@@ -1993,8 +1980,8 @@ void Scene2450::postInit(SceneObjectList *OwnerList) {
_stripManager.addSpeaker(&_caretakerSpeaker);
if (R2_GLOBALS.getFlag(72)) {
- _exit1.setDetails(Rect(0, 143, 47, 168), EXITCURSOR_SW, 2000);
- _exit1.setDest(Common::Point(10, 160));
+ _southWestExit.setDetails(Rect(0, 143, 47, 168), EXITCURSOR_SW, 2000);
+ _southWestExit.setDest(Common::Point(10, 160));
}
if (!R2_GLOBALS.getFlag(61)) {
@@ -2009,7 +1996,7 @@ void Scene2450::postInit(SceneObjectList *OwnerList) {
R2_GLOBALS._player.disableControl();
switch (R2_GLOBALS._player._oldCharacterScene[R2_GLOBALS._player._characterIndex]) {
case 1900:
- R2_GLOBALS._v565AE = 0;
+ R2_GLOBALS._stripModifier = 0;
R2_GLOBALS._player._characterScene[R2_QUINN] = 2450;
R2_GLOBALS._player._characterScene[R2_SEEKER] = 2450;
R2_GLOBALS._player._oldCharacterScene[R2_QUINN] = 2450;
@@ -2071,7 +2058,7 @@ void Scene2450::postInit(SceneObjectList *OwnerList) {
_careTaker.setPosition(Common::Point(34, 153));
_careTaker.setDetails(2001, 40, -1, -1, 1, (SceneItem *)NULL);
- _exit1._enabled = false;
+ _southWestExit._enabled = false;
}
} else {
R2_GLOBALS._player.postInit();
@@ -2104,7 +2091,7 @@ void Scene2450::postInit(SceneObjectList *OwnerList) {
_careTaker.setPosition(Common::Point(34, 153));
_careTaker.setDetails(2001, 40, -1, -1, 1, (SceneItem *)NULL);
- _exit1._enabled = false;
+ _southWestExit._enabled = false;
}
}
R2_GLOBALS._player.enableControl();
@@ -2145,14 +2132,14 @@ void Scene2450::signal() {
g_globals->_sceneManager.changeScene(2000);
break;
case 20:
- if (R2_GLOBALS._v565AE == 3) {
+ if (R2_GLOBALS._stripModifier == 3) {
R2_GLOBALS._player.disableControl();
- R2_GLOBALS._v565AE = 4;
+ R2_GLOBALS._stripModifier = 4;
_sceneMode = 2454;
setAction(&_sequenceManager, this, 2454, &_careTaker, NULL);
} else {
R2_GLOBALS._player.enableControl(CURSOR_TALK);
- if (R2_GLOBALS._v565AE < 4)
+ if (R2_GLOBALS._stripModifier < 4)
R2_GLOBALS._player._canWalk = false;
}
break;
@@ -2183,7 +2170,7 @@ void Scene2450::signal() {
_stripManager.start(700, this);
break;
case 2454:
- _exit1._enabled = true;
+ _southWestExit._enabled = true;
R2_GLOBALS.setFlag(72);
_careTaker.remove();
if (R2_GLOBALS.getFlag(61)) {
@@ -2221,10 +2208,10 @@ void Scene2450::signal() {
*--------------------------------------------------------------------------*/
bool Scene2455::Lamp::startAction(CursorType action, Event &event) {
- Scene2455 *scene = (Scene2455 *)R2_GLOBALS._sceneManager._scene;
-
if (action == R2_GLASS_DOME) {
if ((R2_INVENTORY.getObjectScene(R2_ALCOHOL_LAMP_2) == 2455) || (R2_INVENTORY.getObjectScene(R2_ALCOHOL_LAMP_3) == 2455)) {
+ Scene2455 *scene = (Scene2455 *)R2_GLOBALS._sceneManager._scene;
+
R2_GLOBALS._player.disableControl();
scene->_sceneMode = 2458;
scene->_pool._lookLineNum = 9;
@@ -2275,9 +2262,9 @@ bool Scene2455::Pool::startAction(CursorType action, Event &event) {
}
bool Scene2455::ScrithKey::startAction(CursorType action, Event &event) {
- Scene2455 *scene = (Scene2455 *)R2_GLOBALS._sceneManager._scene;
-
if (action == CURSOR_USE) {
+ Scene2455 *scene = (Scene2455 *)R2_GLOBALS._sceneManager._scene;
+
R2_GLOBALS._player.disableControl();
scene->_sceneMode = 2459;
scene->setAction(&scene->_sequenceManager, scene, 2459, &R2_GLOBALS._player, &scene->_scrithKey, NULL);
@@ -2287,7 +2274,7 @@ bool Scene2455::ScrithKey::startAction(CursorType action, Event &event) {
return SceneActor::startAction(action, event);
}
-void Scene2455::Exit1::changeScene() {
+void Scene2455::NorthExit::changeScene() {
Scene2455 *scene = (Scene2455 *)R2_GLOBALS._sceneManager._scene;
_enabled = false;
@@ -2307,14 +2294,14 @@ void Scene2455::postInit(SceneObjectList *OwnerList) {
}
R2_GLOBALS._sound1.play(200);
- _exit1.setDetails(Rect(0, 0, 320, 15), EXITCURSOR_N, 2425);
+ _northExit.setDetails(Rect(0, 0, 320, 15), EXITCURSOR_N, 2425);
if (R2_INVENTORY.getObjectScene(R2_GLASS_DOME) == 2455) {
_scrithKey.postInit();
_scrithKey.setup(2456, 3, 1);
_scrithKey.setPosition(Common::Point(176, 165));
_scrithKey.setDetails(2455, 16, 1, -1, 1, (SceneItem *)NULL);
- } else if ((R2_INVENTORY.getObjectScene(R2_ALCOHOL_LAMP_3) == 2455) ||
+ } else if ((R2_INVENTORY.getObjectScene(R2_ALCOHOL_LAMP_3) == 2455) ||
(R2_INVENTORY.getObjectScene(R2_ALCOHOL_LAMP_2) == 2455)) {
_lamp.postInit();
_lamp.setup(2456, 3, 3);
@@ -2395,11 +2382,11 @@ void Scene2455::signal() {
}
/*--------------------------------------------------------------------------
- * Scene 2500 - Spill Mountains: Large Cave
+ * Scene 2500 - Spill Mountains: Large Ledge
*
*--------------------------------------------------------------------------*/
-void Scene2500::Exit1::changeScene() {
+void Scene2500::WestExit::changeScene() {
Scene2500 *scene = (Scene2500 *)R2_GLOBALS._sceneManager._scene;
_enabled = false;
@@ -2427,8 +2414,8 @@ void Scene2500::postInit(SceneObjectList *OwnerList) {
if (R2_GLOBALS._sceneManager._previousScene == -1)
R2_GLOBALS._sceneManager._previousScene = 2000;
- _exit1.setDetails(Rect(30, 50, 85, 105), EXITCURSOR_W, 2000);
- _exit1.setDest(Common::Point(84, 104));
+ _westExit.setDetails(Rect(30, 50, 85, 105), EXITCURSOR_W, 2000);
+ _westExit.setDest(Common::Point(84, 104));
R2_GLOBALS._player.postInit();
R2_GLOBALS._player.animate(ANIM_MODE_1, NULL);
@@ -2441,19 +2428,19 @@ void Scene2500::postInit(SceneObjectList *OwnerList) {
}
if (R2_GLOBALS._player._characterScene[R2_QUINN] == R2_GLOBALS._player._characterScene[R2_SEEKER]) {
- _actor1.postInit();
+ _companion.postInit();
if (R2_GLOBALS._player._characterIndex == R2_QUINN) {
- _actor1.setup(21, 3, 1);
- _actor1.setDetails(9002, 1, -1, -1, 1, (SceneItem *)NULL);
+ _companion.setup(21, 3, 1);
+ _companion.setDetails(9002, 1, -1, -1, 1, (SceneItem *)NULL);
} else {
- _actor1.setup(2008, 3, 1);
- _actor1.changeZoom(50);
- _actor1.setDetails(9001, 0, -1, -1, 1, (SceneItem *)NULL);
+ _companion.setup(2008, 3, 1);
+ _companion.changeZoom(50);
+ _companion.setDetails(9001, 0, -1, -1, 1, (SceneItem *)NULL);
}
- _actor1.setPosition(Common::Point(141, 94));
+ _companion.setPosition(Common::Point(141, 94));
}
- _item1.setDetails(Rect(0, 0, 320, 200), 2430, 0, -1, -1, 1, NULL);
+ _background.setDetails(Rect(0, 0, 320, 200), 2430, 0, -1, -1, 1, NULL);
R2_GLOBALS._player.disableControl();
if (R2_GLOBALS._player._oldCharacterScene[R2_GLOBALS._player._characterIndex] == 2000) {
@@ -2464,9 +2451,9 @@ void Scene2500::postInit(SceneObjectList *OwnerList) {
R2_GLOBALS._player.addMover(mover, &pt, this);
} else if (R2_GLOBALS._player._oldCharacterScene[R2_GLOBALS._player._characterIndex] == 3100) {
_sceneMode = 2500;
- _actor2.postInit();
- _actor3.postInit();
- setAction(&_sequenceManager, this, 2500, &R2_GLOBALS._player, &_actor2, &_actor3, NULL);
+ _quinn.postInit();
+ _ship.postInit();
+ setAction(&_sequenceManager, this, 2500, &R2_GLOBALS._player, &_quinn, &_ship, NULL);
} else {
R2_GLOBALS._player.setPosition(Common::Point(160, 150));
R2_GLOBALS._player.setStrip(3);
@@ -2483,7 +2470,7 @@ void Scene2500::signal() {
case 20:
R2_GLOBALS._player.disableControl();
_sceneMode = 2501;
- setAction(&_sequenceManager, this, 2501, &R2_GLOBALS._player, &_actor2, &_actor3, NULL);
+ setAction(&_sequenceManager, this, 2501, &R2_GLOBALS._player, &_quinn, &_ship, NULL);
break;
case 2500:
_sceneMode = 20;
@@ -2504,10 +2491,10 @@ void Scene2500::signal() {
*
*--------------------------------------------------------------------------*/
-bool Scene2525::Item5::startAction(CursorType action, Event &event) {
- Scene2525 *scene = (Scene2525 *)R2_GLOBALS._sceneManager._scene;
-
+bool Scene2525::StopCock::startAction(CursorType action, Event &event) {
if ((action == R2_REBREATHER_TANK) && (!R2_GLOBALS.getFlag(74))) {
+ Scene2525 *scene = (Scene2525 *)R2_GLOBALS._sceneManager._scene;
+
R2_GLOBALS._player.disableControl();
scene->_sceneMode = 2526;
scene->setAction(&scene->_sequenceManager, scene, 2526, &R2_GLOBALS._player, NULL);
@@ -2518,22 +2505,22 @@ bool Scene2525::Item5::startAction(CursorType action, Event &event) {
}
bool Scene2525::GlassDome::startAction(CursorType action, Event &event) {
- Scene2525 *scene = (Scene2525 *)R2_GLOBALS._sceneManager._scene;
-
if (action != CURSOR_USE)
return SceneActor::startAction(action, event);
if (R2_GLOBALS._player._characterIndex == R2_SEEKER) {
+ Scene2525 *scene = (Scene2525 *)R2_GLOBALS._sceneManager._scene;
+
R2_GLOBALS._player.disableControl();
scene->_sceneMode = 2525;
scene->setAction(&scene->_sequenceManager, scene, 2525, &R2_GLOBALS._player, &scene->_glassDome, NULL);
} else {
- SceneItem::display(2530, 33, 0, 280, 1, 160, 9, 1, 2, 20, 7, 7, -999);
+ SceneItem::display(2530, 33, 0, 280, 1, 160, 9, 1, 2, 20, 7, 7, LIST_END);
}
return true;
}
-void Scene2525::Exit1::changeScene() {
+void Scene2525::SouthExit::changeScene() {
Scene2525 *scene = (Scene2525 *)R2_GLOBALS._sceneManager._scene;
_enabled = false;
@@ -2552,7 +2539,7 @@ void Scene2525::postInit(SceneObjectList *OwnerList) {
R2_GLOBALS._sound1.play(200);
R2_GLOBALS._sound2.play(207);
- _exit1.setDetails(Rect(86, 155, 228, 168), EXITCURSOR_S, 2000);
+ _southExit.setDetails(Rect(86, 155, 228, 168), EXITCURSOR_S, 2000);
if (R2_INVENTORY.getObjectScene(R2_GLASS_DOME) == 2525) {
_glassDome.postInit();
@@ -2562,12 +2549,12 @@ void Scene2525::postInit(SceneObjectList *OwnerList) {
_glassDome.setDetails(2525, 27, -1, -1, 1, (SceneItem *)NULL);
}
- _actor2.postInit();
- _actor2.setup(2525, 1, 1);
- _actor2.setPosition(Common::Point(183, 114));
- _actor2.setDetails(2525, 15, -1, -1, 1, (SceneItem *)NULL);
- _actor2.animate(ANIM_MODE_2, NULL);
- _actor2._numFrames = 3;
+ _compressor.postInit();
+ _compressor.setup(2525, 1, 1);
+ _compressor.setPosition(Common::Point(183, 114));
+ _compressor.setDetails(2525, 15, -1, -1, 1, (SceneItem *)NULL);
+ _compressor.animate(ANIM_MODE_2, NULL);
+ _compressor._numFrames = 3;
R2_GLOBALS._player.postInit();
R2_GLOBALS._player.animate(ANIM_MODE_1, NULL);
@@ -2580,24 +2567,24 @@ void Scene2525::postInit(SceneObjectList *OwnerList) {
}
if (R2_GLOBALS._player._characterScene[R2_QUINN] == R2_GLOBALS._player._characterScene[R2_SEEKER]) {
- _actor1.postInit();
+ _companion.postInit();
if (R2_GLOBALS._player._characterIndex == R2_QUINN) {
- _actor1.setup(20, 5, 1);
- _actor1.setDetails(9002, 0, 4, 3, 1, (SceneItem *)NULL);
+ _companion.setup(20, 5, 1);
+ _companion.setDetails(9002, 0, 4, 3, 1, (SceneItem *)NULL);
} else {
- _actor1.setup(2008, 5, 1);
- _actor1.setDetails(9001, 0, 5, 3, 1, (SceneItem *)NULL);
+ _companion.setup(2008, 5, 1);
+ _companion.setDetails(9001, 0, 5, 3, 1, (SceneItem *)NULL);
}
- _actor1.setPosition(Common::Point(209, 162));
+ _companion.setPosition(Common::Point(209, 162));
R2_GLOBALS._walkRegions.disableRegion(4);
}
- _item5.setDetails(Rect(125, 73, 140, 86), 2525, 6, -1, -1, 1, NULL);
- _item3.setDetails(Rect(137, 11, 163, 72), 2525, 12, -1, -1, 1, NULL);
- _item4.setDetails(Rect(204, 20, 234, 78), 2525, 12, -1, -1, 1, NULL);
- _item2.setDetails(Rect(102, 62, 230, 134), 2525, 0, -1, -1, 1, NULL);
- _item1.setDetails(Rect(0, 0, 320, 200), 2525, 24, -1, -1, 1, NULL);
+ _stopcock.setDetails(Rect(125, 73, 140, 86), 2525, 6, -1, -1, 1, NULL);
+ _pipes1.setDetails(Rect(137, 11, 163, 72), 2525, 12, -1, -1, 1, NULL);
+ _pipes2.setDetails(Rect(204, 20, 234, 78), 2525, 12, -1, -1, 1, NULL);
+ _machine.setDetails(Rect(102, 62, 230, 134), 2525, 0, -1, -1, 1, NULL);
+ _background.setDetails(Rect(0, 0, 320, 200), 2525, 24, -1, -1, 1, NULL);
R2_GLOBALS._player.disableControl();
@@ -2646,31 +2633,31 @@ void Scene2525::signal() {
*--------------------------------------------------------------------------*/
bool Scene2530::Flask::startAction(CursorType action, Event &event) {
- Scene2530 *scene = (Scene2530 *)R2_GLOBALS._sceneManager._scene;
-
if (action != CURSOR_USE)
return SceneActor::startAction(action, event);
if (R2_GLOBALS._player._characterIndex == R2_SEEKER) {
+ Scene2530 *scene = (Scene2530 *)R2_GLOBALS._sceneManager._scene;
+
R2_GLOBALS._player.disableControl();
scene->_sceneMode = 2530;
scene->setAction(&scene->_sequenceManager, scene, 2530, &R2_GLOBALS._player, &scene->_flask, NULL);
} else {
- SceneItem::display(2530, 33, 0, 280, 1, 160, 9, 1, 2, 20, 7, 7, -999);
+ SceneItem::display(2530, 33, 0, 280, 1, 160, 9, 1, 2, 20, 7, 7, LIST_END);
}
return true;
}
bool Scene2530::Crank::startAction(CursorType action, Event &event) {
- Scene2530 *scene = (Scene2530 *)R2_GLOBALS._sceneManager._scene;
-
if (action != CURSOR_USE)
return SceneActor::startAction(action, event);
+ Scene2530 *scene = (Scene2530 *)R2_GLOBALS._sceneManager._scene;
+
if (R2_GLOBALS._player._characterIndex == R2_QUINN) {
if (R2_GLOBALS.getFlag(73))
- SceneItem::display(2530, 35, 0, 280, 1, 160, 9, 1, 2, 20, 7, 7, -999);
+ SceneItem::display(2530, 35, 0, 280, 1, 160, 9, 1, 2, 20, 7, 7, LIST_END);
else {
R2_GLOBALS._player.disableControl();
scene->_sceneMode = 2532;
@@ -2691,7 +2678,7 @@ bool Scene2530::Crank::startAction(CursorType action, Event &event) {
return true;
}
-void Scene2530::Exit1::changeScene() {
+void Scene2530::SouthExit::changeScene() {
Scene2530 *scene = (Scene2530 *)R2_GLOBALS._sceneManager._scene;
_enabled = false;
@@ -2708,8 +2695,8 @@ void Scene2530::postInit(SceneObjectList *OwnerList) {
loadScene(2530);
SceneExt::postInit();
- _exit1.setDetails(Rect(68, 155, 147, 168), EXITCURSOR_S, 2000);
- _exit1.setDest(Common::Point(108, 160));
+ _southExit.setDetails(Rect(68, 155, 147, 168), EXITCURSOR_S, 2000);
+ _southExit.setDest(Common::Point(108, 160));
if (R2_INVENTORY.getObjectScene(R2_PURE_GRAIN_ALCOHOL) == 2530) {
_flask.postInit();
@@ -2742,20 +2729,20 @@ void Scene2530::postInit(SceneObjectList *OwnerList) {
R2_GLOBALS._player.setPosition(Common::Point(100, 200));
if (R2_GLOBALS._player._characterScene[R2_QUINN] == R2_GLOBALS._player._characterScene[R2_SEEKER]) {
- _actor1.postInit();
+ _companion.postInit();
if (R2_GLOBALS._player._characterIndex == R2_QUINN) {
- _actor1.setup(20, 5, 1);
- _actor1.setDetails(9002, 0, 4, 3, 1, (SceneItem *)NULL);
+ _companion.setup(20, 5, 1);
+ _companion.setDetails(9002, 0, 4, 3, 1, (SceneItem *)NULL);
} else {
- _actor1.setup(2008, 5, 1);
- _actor1.setDetails(9001, 0, 5, 3, 1, (SceneItem *)NULL);
+ _companion.setup(2008, 5, 1);
+ _companion.setDetails(9001, 0, 5, 3, 1, (SceneItem *)NULL);
}
- _actor1.setPosition(Common::Point(20, 130));
+ _companion.setPosition(Common::Point(20, 130));
R2_GLOBALS._walkRegions.disableRegion(1);
}
- _item2.setDetails(Rect(108, 90, 135, 205), 2530, 22, -1, -1, 1, NULL);
- _item5.setDetails(Rect(115, 112, 206, 130), 2530, 25, -1, 27, 1, NULL);
+ _crank2.setDetails(Rect(108, 90, 135, 205), 2530, 22, -1, -1, 1, NULL);
+ _rope.setDetails(Rect(115, 112, 206, 130), 2530, 25, -1, 27, 1, NULL);
_shelf.setDetails(Rect(256, 64, 311, 85), 2530, 31, -1, 33, 1, NULL);
_background.setDetails(Rect(0, 0, 320, 200), 2530, 0, 1, -1, 1, NULL);
@@ -2805,42 +2792,42 @@ void Scene2530::signal() {
*--------------------------------------------------------------------------*/
bool Scene2535::RebreatherTank::startAction(CursorType action, Event &event) {
- Scene2535 *scene = (Scene2535 *)R2_GLOBALS._sceneManager._scene;
-
if (action != CURSOR_USE)
return SceneActor::startAction(action, event);
if (R2_GLOBALS._player._characterIndex == R2_QUINN) {
+ Scene2535 *scene = (Scene2535 *)R2_GLOBALS._sceneManager._scene;
+
R2_GLOBALS._player.disableControl();
-
+
scene->_sceneMode = (R2_INVENTORY.getObjectScene(R2_REBREATHER_TANK) == 2535) ? 2536 : 2537;
- scene->setAction(&scene->_sequenceManager, scene, scene->_sceneMode,
+ scene->setAction(&scene->_sequenceManager, scene, scene->_sceneMode,
&R2_GLOBALS._player, &scene->_rebreatherTank, NULL);
} else {
- SceneItem::display(2530, 33, 0, 280, 1, 160, 9, 1, 2, 20, 7, 7, -999);
+ SceneItem::display(2530, 33, 0, 280, 1, 160, 9, 1, 2, 20, 7, 7, LIST_END);
}
return true;
}
bool Scene2535::TannerMask::startAction(CursorType action, Event &event) {
- Scene2535 *scene = (Scene2535 *)R2_GLOBALS._sceneManager._scene;
-
if (action != CURSOR_USE)
return SceneActor::startAction(action, event);
if (R2_GLOBALS._player._characterIndex == R2_SEEKER) {
+ Scene2535 *scene = (Scene2535 *)R2_GLOBALS._sceneManager._scene;
+
R2_GLOBALS._player.disableControl();
scene->_sceneMode = 2535;
scene->setAction(&scene->_sequenceManager, scene, 2535, &R2_GLOBALS._player, &scene->_tannerMask, NULL);
} else {
- SceneItem::display(2530, 33, 0, 280, 1, 160, 9, 1, 2, 20, 7, 7, -999);
+ SceneItem::display(2530, 33, 0, 280, 1, 160, 9, 1, 2, 20, 7, 7, LIST_END);
}
return true;
}
-void Scene2535::Exit1::changeScene() {
+void Scene2535::SouthExit::changeScene() {
Scene2535 *scene = (Scene2535 *)R2_GLOBALS._sceneManager._scene;
_enabled = false;
@@ -2859,8 +2846,8 @@ void Scene2535::postInit(SceneObjectList *OwnerList) {
R2_GLOBALS.setFlag(73);
R2_INVENTORY.setObjectScene(R2_REBREATHER_TANK, 2535);
}
- _exit1.setDetails(Rect(172, 155, 250, 167), EXITCURSOR_S, 2000);
- _exit1.setDest(Common::Point(210, 160));
+ _southExit.setDetails(Rect(172, 155, 250, 167), EXITCURSOR_S, 2000);
+ _southExit.setDest(Common::Point(210, 160));
if (R2_INVENTORY.getObjectScene(R2_TANNER_MASK) == 2535) {
_tannerMask.postInit();
@@ -2998,6 +2985,8 @@ void Scene2600::postInit(SceneObjectList *OwnerList) {
loadScene(2600);
R2_GLOBALS._uiElements._active = false;
SceneExt::postInit();
+ R2_GLOBALS._interfaceY = SCREEN_HEIGHT;
+
R2_GLOBALS._sound1.fadeSound(214);
R2_GLOBALS._sound2.play(215);
_rotation = R2_GLOBALS._scenePalette.addRotation(176, 191, 1);
@@ -3012,6 +3001,7 @@ void Scene2600::postInit(SceneObjectList *OwnerList) {
void Scene2600::remove() {
R2_GLOBALS._sound1.fadeOut2(NULL);
R2_GLOBALS._sound2.fadeOut2(NULL);
+ R2_GLOBALS._uiElements._visible = true;
// _rotation->remove();
SceneExt::remove();
}
@@ -3027,7 +3017,7 @@ void Scene2600::signal() {
*--------------------------------------------------------------------------*/
Scene2700::Scene2700(): SceneExt() {
- _field412 = _field414 = _field416 = 0;
+ _areaMode = _moveMode = _stripNumber = 0;
_walkRect1.set(70, 122, 90, 132);
_walkRect2.set(150, 122, 160, 132);
@@ -3040,9 +3030,9 @@ Scene2700::Scene2700(): SceneExt() {
void Scene2700::synchronize(Serializer &s) {
SceneExt::synchronize(s);
- s.syncAsSint16LE(_field412);
- s.syncAsSint16LE(_field414);
- s.syncAsSint16LE(_field416);
+ s.syncAsSint16LE(_areaMode);
+ s.syncAsSint16LE(_moveMode);
+ s.syncAsSint16LE(_stripNumber);
}
void Scene2700::Action1::signal() {
@@ -3073,14 +3063,14 @@ void Scene2700::Action4::signal() {
scene->_ghoulHome9.animate(ANIM_MODE_8, 1, NULL);
}
-void Scene2700::Area1::process(Event &event) {
+void Scene2700::SouthExit::process(Event &event) {
SceneArea::process(event);
if ((event.eventType == EVENT_BUTTON_DOWN) && (R2_GLOBALS._player._canWalk) && (_bounds.contains(event.mousePos))) {
Scene2700 *scene = (Scene2700 *)R2_GLOBALS._sceneManager._scene;
R2_GLOBALS._player.disableControl();
scene->_sceneMode = 10;
- scene->_field414 = 2703;
- switch (scene->_field412) {
+ scene->_moveMode = 2703;
+ switch (scene->_areaMode) {
case 0:
// No break on purpose
case 6:
@@ -3123,14 +3113,14 @@ void Scene2700::Area1::process(Event &event) {
}
}
-void Scene2700::Area2::process(Event &event) {
+void Scene2700::EastExit::process(Event &event) {
SceneArea::process(event);
if ((event.eventType == EVENT_BUTTON_DOWN) && (R2_GLOBALS._player._canWalk) && (_bounds.contains(event.mousePos))) {
Scene2700 *scene = (Scene2700 *)R2_GLOBALS._sceneManager._scene;
R2_GLOBALS._player.disableControl();
scene->_sceneMode = 10;
- scene->_field414 = 2704;
- switch (scene->_field412) {
+ scene->_moveMode = 2704;
+ switch (scene->_areaMode) {
case 0: {
Common::Point pt(140, 162);
NpcMover *mover = new NpcMover();
@@ -3183,8 +3173,8 @@ void Scene2700::postInit(SceneObjectList *OwnerList) {
R2_GLOBALS._sound1.stop();
R2_GLOBALS._sound2.stop();
- _area1.setDetails(Rect(135, 160, 185, 168), SHADECURSOR_DOWN);
- _area2.setDetails(Rect(300, 90, 320, 135), EXITCURSOR_E);
+ _southExit.setDetails(Rect(135, 160, 185, 168), SHADECURSOR_DOWN);
+ _eastExit.setDetails(Rect(300, 90, 320, 135), EXITCURSOR_E);
_ghoulHome6.postInit();
_ghoulHome6.setup(2700, 1, 1);
@@ -3229,10 +3219,10 @@ void Scene2700::postInit(SceneObjectList *OwnerList) {
if (R2_GLOBALS._sceneManager._previousScene == 2750) {
_sceneMode = 2702;
- _field412 = 5;
+ _areaMode = 5;
setAction(&_sequenceManager, this, 2702, &R2_GLOBALS._player, NULL);
} else {
- _field412 = 0;
+ _areaMode = 0;
if (R2_GLOBALS._sceneManager._previousScene == 3900) {
_sceneMode = 2701;
setAction(&_sequenceManager, this, 2701, &R2_GLOBALS._player, NULL);
@@ -3247,26 +3237,26 @@ void Scene2700::postInit(SceneObjectList *OwnerList) {
void Scene2700::signal() {
switch (_sceneMode) {
case 10:
- switch (_field414) {
+ switch (_moveMode) {
case 1:
- switch (_field412) {
+ switch (_areaMode) {
case 0:
case 2:
case 4:
case 6:
- _field412 = 3;
+ _areaMode = 3;
R2_GLOBALS._player.setAction(&_sequenceManager, this, 2705, &R2_GLOBALS._player, NULL);
break;
case 3: {
- _sceneMode = _field414;
- _field412 = 1;
+ _sceneMode = _moveMode;
+ _areaMode = 1;
Common::Point pt(80, 127);
NpcMover *mover = new NpcMover();
R2_GLOBALS._player.addMover(mover, &pt, this);
break;
}
case 5:
- _field412 = 4;
+ _areaMode = 4;
R2_GLOBALS._player.setAction(&_sequenceManager, this, 2708, &R2_GLOBALS._player, NULL);
break;
default: // includes case 1
@@ -3274,24 +3264,24 @@ void Scene2700::signal() {
}
break;
case 2:
- switch (_field412) {
+ switch (_areaMode) {
case 0:
case 1:
case 6:
- _field412 = 3;
+ _areaMode = 3;
R2_GLOBALS._player.setAction(&_sequenceManager, this, 2706, &R2_GLOBALS._player, NULL);
break;
case 3:
case 4: {
- _sceneMode = _field414;
- _field412 = 2;
+ _sceneMode = _moveMode;
+ _areaMode = 2;
Common::Point pt(155, 127);
NpcMover *mover = new NpcMover();
R2_GLOBALS._player.addMover(mover, &pt, this);
break;
}
case 5:
- _field412 = 4;
+ _areaMode = 4;
R2_GLOBALS._player.setAction(&_sequenceManager, this, 2708, &R2_GLOBALS._player, NULL);
break;
default: // includes case 2
@@ -3299,21 +3289,21 @@ void Scene2700::signal() {
}
break;
case 3:
- switch (_field412) {
+ switch (_areaMode) {
case 0:
case 1:
case 2:
case 4:
case 6: {
- _sceneMode = _field414;
- _field412 = 3;
+ _sceneMode = _moveMode;
+ _areaMode = 3;
Common::Point pt(115, 152);
NpcMover *mover = new NpcMover();
R2_GLOBALS._player.addMover(mover, &pt, this);
break;
}
case 5:
- _field412 = 4;
+ _areaMode = 4;
R2_GLOBALS._player.setAction(&_sequenceManager, this, 2708, &R2_GLOBALS._player, NULL);
break;
default: // includes case 3
@@ -3321,21 +3311,21 @@ void Scene2700::signal() {
}
break;
case 4:
- switch (_field412) {
+ switch (_areaMode) {
case 0:
case 1:
case 6:
- _field412 = 3;
+ _areaMode = 3;
R2_GLOBALS._player.setAction(&_sequenceManager, this, 2706, &R2_GLOBALS._player, NULL);
break;
case 2:
case 3:
- _field412 = 4;
+ _areaMode = 4;
R2_GLOBALS._player.setAction(&_sequenceManager, this, 2709, &R2_GLOBALS._player, NULL);
break;
case 4:
case 5:
- _sceneMode = _field414;
+ _sceneMode = _moveMode;
R2_GLOBALS._player.setAction(&_sequenceManager, this, 2704, &R2_GLOBALS._player, NULL);
break;
default:
@@ -3343,21 +3333,21 @@ void Scene2700::signal() {
}
break;
case 5:
- switch (_field412) {
+ switch (_areaMode) {
case 0:
case 1:
case 6:
- _field412 = 3;
+ _areaMode = 3;
R2_GLOBALS._player.setAction(&_sequenceManager, this, 2706, &R2_GLOBALS._player, NULL);
break;
case 2:
case 3:
- _field412 = 4;
+ _areaMode = 4;
R2_GLOBALS._player.setAction(&_sequenceManager, this, 2709, &R2_GLOBALS._player, NULL);
break;
case 4: {
- _sceneMode = _field414;
- _field412 = 5;
+ _sceneMode = _moveMode;
+ _areaMode = 5;
Common::Point pt(285, 132);
NpcMover *mover = new NpcMover();
R2_GLOBALS._player.addMover(mover, &pt, this);
@@ -3368,11 +3358,11 @@ void Scene2700::signal() {
}
break;
case 6:
- switch (_field412) {
+ switch (_areaMode) {
case 0:
case 3: {
- _sceneMode = _field414;
- _field412 = 6;
+ _sceneMode = _moveMode;
+ _areaMode = 6;
Common::Point pt(250, 162);
NpcMover *mover = new NpcMover();
R2_GLOBALS._player.addMover(mover, &pt, this);
@@ -3381,11 +3371,11 @@ void Scene2700::signal() {
case 1:
case 2:
case 4:
- _field412 = 3;
+ _areaMode = 3;
R2_GLOBALS._player.setAction(&_sequenceManager, this, 2707, &R2_GLOBALS._player, NULL);
break;
case 5:
- _field412 = 4;
+ _areaMode = 4;
R2_GLOBALS._player.setAction(&_sequenceManager, this, 2708, &R2_GLOBALS._player, NULL);
break;
default:
@@ -3393,21 +3383,21 @@ void Scene2700::signal() {
}
break;
case 2703:
- switch (_field412) {
+ switch (_areaMode) {
case 0:
case 3:
case 6:
- _sceneMode = _field414;
+ _sceneMode = _moveMode;
setAction(&_sequenceManager, this, 2703, &R2_GLOBALS._player, NULL);
break;
case 1:
case 2:
case 4:
- _field412 = 3;
+ _areaMode = 3;
R2_GLOBALS._player.setAction(&_sequenceManager, this, 2707, &R2_GLOBALS._player, NULL);
break;
case 5:
- _field412 = 4;
+ _areaMode = 4;
R2_GLOBALS._player.setAction(&_sequenceManager, this, 2708, &R2_GLOBALS._player, NULL);
break;
default:
@@ -3415,21 +3405,21 @@ void Scene2700::signal() {
}
break;
case 2704:
- switch (_field412) {
+ switch (_areaMode) {
case 0:
case 1:
case 6:
- _field412 = 3;
+ _areaMode = 3;
R2_GLOBALS._player.setAction(&_sequenceManager, this, 2706, &R2_GLOBALS._player, NULL);
break;
case 2:
case 3:
- _field412 = 4;
+ _areaMode = 4;
R2_GLOBALS._player.setAction(&_sequenceManager, this, 2709, &R2_GLOBALS._player, NULL);
break;
case 4:
case 5:
- _sceneMode = _field414;
+ _sceneMode = _moveMode;
R2_GLOBALS._player.setAction(&_sequenceManager, this, 2704, &R2_GLOBALS._player, NULL);
break;
default:
@@ -3437,23 +3427,23 @@ void Scene2700::signal() {
}
break;
case 2710:
- switch (_field412) {
+ switch (_areaMode) {
case 0:
case 1:
case 3:
- _field412 = 3;
+ _areaMode = 3;
R2_GLOBALS._player.setAction(&_sequenceManager, this, 2707, &R2_GLOBALS._player, NULL);
break;
case 2:
case 5: {
- _sceneMode = _field414;
+ _sceneMode = _moveMode;
Common::Point pt(164, 160);
NpcMover *mover = new NpcMover();
R2_GLOBALS._player.addMover(mover, &pt, this);
break;
}
case 4:
- _field412 = 4;
+ _areaMode = 4;
R2_GLOBALS._player.setAction(&_sequenceManager, this, 2708, &R2_GLOBALS._player, NULL);
break;
default:
@@ -3467,7 +3457,7 @@ void Scene2700::signal() {
case 11:
R2_INVENTORY.setObjectScene(R2_FLUTE, 0);
R2_GLOBALS._player.disableControl();
- _field412 = 0;
+ _areaMode = 0;
_sceneMode = 2700;
setAction(&_sequenceManager, this, 2700, &_nej, NULL);
break;
@@ -3475,22 +3465,22 @@ void Scene2700::signal() {
R2_GLOBALS._sound1.play(234);
R2_GLOBALS._events.setCursor(CURSOR_WALK);
_sceneMode = 2711;
- _stripManager.start(_field416, this);
+ _stripManager.start(_stripNumber, this);
break;
case 13:
R2_GLOBALS._events.setCursor(CURSOR_WALK);
_sceneMode = 2712;
- _stripManager.start(_field416, this);
+ _stripManager.start(_stripNumber, this);
break;
case 14:
R2_GLOBALS._events.setCursor(CURSOR_WALK);
_sceneMode = 2713;
- _stripManager.start(_field416, this);
+ _stripManager.start(_stripNumber, this);
break;
case 15:
R2_GLOBALS._events.setCursor(CURSOR_WALK);
_sceneMode = 11;
- _stripManager.start(_field416, this);
+ _stripManager.start(_stripNumber, this);
break;
case 2700:
_nej.remove();
@@ -3504,26 +3494,26 @@ void Scene2700::signal() {
break;
case 2710:
// Start of Nej assault
- _field416 = 1200;
+ _stripNumber = 1200;
_sceneMode = 12;
_nej.postInit();
setAction(&_sequenceManager, this, 2710, &R2_GLOBALS._player, &_nej, NULL);
break;
case 2711:
R2_GLOBALS._player.disableControl();
- _field416 = 1201;
+ _stripNumber = 1201;
_sceneMode = 13;
setAction(&_sequenceManager, this, 2711, &R2_GLOBALS._player, &_nej, NULL);
break;
case 2712:
R2_GLOBALS._player.disableControl();
- _field416 = 1202;
+ _stripNumber = 1202;
_sceneMode = 14;
setAction(&_sequenceManager, this, 2712, &R2_GLOBALS._player, &_nej, NULL);
break;
case 2713:
R2_GLOBALS._player.disableControl();
- _field416 = 1203;
+ _stripNumber = 1203;
_sceneMode = 15;
setAction(&_sequenceManager, this, 2713, &R2_GLOBALS._player, &_nej, NULL);
break;
@@ -3537,11 +3527,11 @@ void Scene2700::process(Event &event) {
if (R2_GLOBALS._events.getCursor() == R2_FLUTE) {
if (R2_GLOBALS._player._bounds.contains(event.mousePos)) {
_sceneMode = 10;
- _field414 = 2710;
+ _moveMode = 2710;
R2_GLOBALS._player.disableControl();
R2_GLOBALS._events.setCursor(CURSOR_WALK);
- switch (_field412) {
+ switch (_areaMode) {
case 0: {
_sceneMode = 2710;
Common::Point pt(164, 160);
@@ -3589,7 +3579,7 @@ void Scene2700::process(Event &event) {
break;
}
} else {
- SceneItem::display(2700, 3, 0, 280, 1, 160, 9, 1, 2, 20, 7, 7, -999);
+ SceneItem::display(2700, 3, 0, 280, 1, 160, 9, 1, 2, 20, 7, 7, LIST_END);
}
event.handled = true;
@@ -3598,37 +3588,37 @@ void Scene2700::process(Event &event) {
if (!_walkRect1.contains(R2_GLOBALS._player._position)) {
event.handled = true;
_sceneMode = 10;
- _field414 = 1;
+ _moveMode = 1;
}
} else if (_walkRect2.contains(event.mousePos)) {
if (!_walkRect2.contains(R2_GLOBALS._player._position)) {
event.handled = true;
_sceneMode = 10;
- _field414 = 2;
+ _moveMode = 2;
}
} else if (_walkRect3.contains(event.mousePos)) {
if (!_walkRect3.contains(R2_GLOBALS._player._position)) {
event.handled = true;
_sceneMode = 10;
- _field414 = 3;
+ _moveMode = 3;
}
} else if (_walkRect4.contains(event.mousePos)) {
if (!_walkRect4.contains(R2_GLOBALS._player._position)) {
event.handled = true;
_sceneMode = 10;
- _field414 = 4;
+ _moveMode = 4;
}
} else if (_walkRect5.contains(event.mousePos)) {
if (!_walkRect5.contains(R2_GLOBALS._player._position)) {
event.handled = true;
_sceneMode = 10;
- _field414 = 5;
+ _moveMode = 5;
}
} else if (_walkRect6.contains(event.mousePos)) {
if (!_walkRect6.contains(R2_GLOBALS._player._position)) {
event.handled = true;
_sceneMode = 10;
- _field414 = 6;
+ _moveMode = 6;
}
} else {
event.handled = true;
@@ -3636,9 +3626,9 @@ void Scene2700::process(Event &event) {
}
if (_sceneMode == 10) {
R2_GLOBALS._player.disableControl();
- switch (_field412) {
+ switch (_areaMode) {
case 0:
- if (_field414 >= 6) {
+ if (_moveMode >= 6) {
Common::Point pt(205, 162);
NpcMover *mover = new NpcMover();
R2_GLOBALS._player.addMover(mover, &pt, this);
@@ -3661,11 +3651,11 @@ void Scene2700::process(Event &event) {
break;
}
case 3:
- if (_field414 == 1) {
+ if (_moveMode == 1) {
Common::Point pt(80, 137);
NpcMover *mover = new NpcMover();
R2_GLOBALS._player.addMover(mover, &pt, this);
- } else if (_field414 == 6) {
+ } else if (_moveMode == 6) {
Common::Point pt(140, 162);
NpcMover *mover = new NpcMover();
R2_GLOBALS._player.addMover(mover, &pt, this);
@@ -3676,7 +3666,7 @@ void Scene2700::process(Event &event) {
}
break;
case 4:
- if (_field414 == 5) {
+ if (_moveMode == 5) {
Common::Point pt(235, 132);
NpcMover *mover = new NpcMover();
R2_GLOBALS._player.addMover(mover, &pt, this);
@@ -3713,15 +3703,15 @@ void Scene2700::process(Event &event) {
*--------------------------------------------------------------------------*/
Scene2750::Scene2750(): SceneExt() {
- _field412 = _field414 = _field416 = 0;
+ _areaMode = _moveMode = _stripNumber = 0;
}
void Scene2750::synchronize(Serializer &s) {
SceneExt::synchronize(s);
- s.syncAsSint16LE(_field412);
- s.syncAsSint16LE(_field414);
- s.syncAsSint16LE(_field416);
+ s.syncAsSint16LE(_areaMode);
+ s.syncAsSint16LE(_moveMode);
+ s.syncAsSint16LE(_stripNumber);
}
void Scene2750::Action1::signal() {
@@ -3731,20 +3721,20 @@ void Scene2750::Action1::signal() {
case 1:
setDelay(60 + R2_GLOBALS._randomSource.getRandomNumber(240));
_actionIndex = 2;
- scene->_actor5.show();
- scene->_actor5.animate(ANIM_MODE_8, 1, NULL);
+ scene->_bird2.show();
+ scene->_bird2.animate(ANIM_MODE_8, 1, NULL);
break;
case 2:
setDelay(600 + R2_GLOBALS._randomSource.getRandomNumber(600));
_actionIndex = 0;
- scene->_actor5.show();
- scene->_actor3.animate(ANIM_MODE_2, NULL);
+ scene->_bird2.show();
+ scene->_bird1.animate(ANIM_MODE_2, NULL);
break;
default:
setDelay(30);
_actionIndex = 1;
- scene->_actor3.animate(ANIM_MODE_6, NULL);
- scene->_actor4.animate(ANIM_MODE_8, 1, NULL);
+ scene->_bird1.animate(ANIM_MODE_6, NULL);
+ scene->_folliage1.animate(ANIM_MODE_8, 1, NULL);
break;
}
}
@@ -3753,20 +3743,20 @@ void Scene2750::Action2::signal() {
Scene2750 *scene = (Scene2750 *)R2_GLOBALS._sceneManager._scene;
setDelay(600 + R2_GLOBALS._randomSource.getRandomNumber(300));
- scene->_actor6.animate(ANIM_MODE_8, 1, NULL);
+ scene->_folliage2.animate(ANIM_MODE_8, 1, NULL);
}
void Scene2750::Action3::signal() {
Scene2750 *scene = (Scene2750 *)R2_GLOBALS._sceneManager._scene;
- if (scene->_actor7._position.x <= 320) {
+ if (scene->_folliage3._position.x <= 320) {
setDelay(1800 + R2_GLOBALS._randomSource.getRandomNumber(600));
} else {
setDelay(60);
- scene->_actor7.setPosition(Common::Point(-10, 25));
+ scene->_folliage3.setPosition(Common::Point(-10, 25));
Common::Point pt(330, 45);
NpcMover *mover = new NpcMover();
- scene->_actor7.addMover(mover, &pt, NULL);
+ scene->_folliage3.addMover(mover, &pt, NULL);
}
}
@@ -3774,38 +3764,38 @@ void Scene2750::Action4::signal() {
Scene2750 *scene = (Scene2750 *)R2_GLOBALS._sceneManager._scene;
setDelay(600 + R2_GLOBALS._randomSource.getRandomNumber(300));
- scene->_actor8.animate(ANIM_MODE_8, 1, NULL);
+ scene->_folliage4.animate(ANIM_MODE_8, 1, NULL);
}
void Scene2750::Action5::signal() {
Scene2750 *scene = (Scene2750 *)R2_GLOBALS._sceneManager._scene;
setDelay(600 + R2_GLOBALS._randomSource.getRandomNumber(300));
- scene->_actor9.animate(ANIM_MODE_8, 1, NULL);
+ scene->_folliage5.animate(ANIM_MODE_8, 1, NULL);
}
void Scene2750::Action6::signal() {
Scene2750 *scene = (Scene2750 *)R2_GLOBALS._sceneManager._scene;
setDelay(600 + R2_GLOBALS._randomSource.getRandomNumber(300));
- scene->_actor10.animate(ANIM_MODE_8, 1, NULL);
+ scene->_folliage6.animate(ANIM_MODE_8, 1, NULL);
}
void Scene2750::Action7::signal() {
Scene2750 *scene = (Scene2750 *)R2_GLOBALS._sceneManager._scene;
setDelay(600 + R2_GLOBALS._randomSource.getRandomNumber(300));
- scene->_actor11.animate(ANIM_MODE_8, 1, NULL);
+ scene->_folliage7.animate(ANIM_MODE_8, 1, NULL);
}
-void Scene2750::Area1::process(Event &event) {
+void Scene2750::WestExit::process(Event &event) {
SceneArea::process(event);
if ((event.eventType == EVENT_BUTTON_DOWN) && (R2_GLOBALS._player._canWalk) && (_bounds.contains(event.mousePos))) {
Scene2750 *scene = (Scene2750 *)R2_GLOBALS._sceneManager._scene;
R2_GLOBALS._player.disableControl();
scene->_sceneMode = 10;
- scene->_field414 = 2752;
- switch (scene->_field412) {
+ scene->_moveMode = 2752;
+ switch (scene->_areaMode) {
case 1: {
scene->_sceneMode = 2752;
scene->setAction(&scene->_sequenceManager, scene, 2752, &R2_GLOBALS._player, NULL);
@@ -3829,14 +3819,14 @@ void Scene2750::Area1::process(Event &event) {
}
}
-void Scene2750::Area2::process(Event &event) {
+void Scene2750::EastExit::process(Event &event) {
SceneArea::process(event);
if ((event.eventType == EVENT_BUTTON_DOWN) && (R2_GLOBALS._player._canWalk) && (_bounds.contains(event.mousePos))) {
Scene2750 *scene = (Scene2750 *)R2_GLOBALS._sceneManager._scene;
R2_GLOBALS._player.disableControl();
scene->_sceneMode = 10;
- scene->_field414 = 2753;
- switch (scene->_field412) {
+ scene->_moveMode = 2753;
+ switch (scene->_areaMode) {
case 1: {
Common::Point pt(140, 142);
NpcMover *mover = new NpcMover();
@@ -3864,76 +3854,76 @@ void Scene2750::postInit(SceneObjectList *OwnerList) {
loadScene(2750);
R2_GLOBALS._sound2.stop();
SceneExt::postInit();
- _area1.setDetails(Rect(0, 90, 20, 135), EXITCURSOR_W);
- _area2.setDetails(Rect(300, 90, 320, 135), EXITCURSOR_E);
+ _westExit.setDetails(Rect(0, 90, 20, 135), EXITCURSOR_W);
+ _eastExit.setDetails(Rect(300, 90, 320, 135), EXITCURSOR_E);
- _rect1.set(30, 127, 155, 147);
- _rect2.set(130, 142, 210, 167);
- _rect3.set(-1, 137, 290, 147);
+ _walkRect1.set(30, 127, 155, 147);
+ _walkRect2.set(130, 142, 210, 167);
+ _walkRect3.set(-1, 137, 290, 147);
if (R2_INVENTORY.getObjectScene(R2_FLUTE) == 0) {
R2_GLOBALS._sound1.changeSound(235);
- _actor2.postInit();
- _actor2.setup(2751, 1, 1);
- _actor2.setPosition(Common::Point(104, 158));
- _actor2.animate(ANIM_MODE_2, NULL);
- }
-
- _actor3.postInit();
- _actor3.setup(2750, 1, 1);
- _actor3.setPosition(Common::Point(188, 34));
- _actor3.animate(ANIM_MODE_2, NULL);
- _actor3._numFrames = 16;
-
- _actor4.postInit();
- _actor4.setup(2700, 4, 1);
- _actor4.setPosition(Common::Point(188, 37));
- _actor4.fixPriority(26);
-
- _actor5.postInit();
- _actor5.setup(2750, 2, 1);
- _actor5.setPosition(Common::Point(188, 34));
- _actor5.hide();
-
- _actor3.setAction(&_action1);
-
- _actor6.postInit();
- _actor6.setup(2750, 3, 1);
- _actor6.setPosition(Common::Point(9, 167));
- _actor6.fixPriority(252);
- _actor6.setAction(&_action2);
-
- _actor7.postInit();
- _actor7.setup(2750, 4, 1);
- _actor7.setPosition(Common::Point(-10, 25));
- _actor7.animate(ANIM_MODE_1, NULL);
- _actor7.setStrip2(4);
- _actor7._moveRate = 20;
- _actor7.setAction(&_action3);
-
- _actor8.postInit();
- _actor8.fixPriority(26);
- _actor8.setup(2750, 5, 1);
- _actor8.setPosition(Common::Point(258, 33));
- _actor8.setAction(&_action4);
-
- _actor9.postInit();
- _actor9.fixPriority(26);
- _actor9.setup(2750, 6, 1);
- _actor9.setPosition(Common::Point(61, 38));
- _actor9.setAction(&_action5);
-
- _actor10.postInit();
- _actor10.fixPriority(26);
- _actor10.setup(2750, 7, 1);
- _actor10.setPosition(Common::Point(69, 37));
- _actor10.setAction(&_action6);
-
- _actor11.postInit();
- _actor11.fixPriority(26);
- _actor11.setup(2750, 8, 1);
- _actor11.setPosition(Common::Point(80, 35));
- _actor11.setAction(&_action7);
+ _fire.postInit();
+ _fire.setup(2751, 1, 1);
+ _fire.setPosition(Common::Point(104, 158));
+ _fire.animate(ANIM_MODE_2, NULL);
+ }
+
+ _bird1.postInit();
+ _bird1.setup(2750, 1, 1);
+ _bird1.setPosition(Common::Point(188, 34));
+ _bird1.animate(ANIM_MODE_2, NULL);
+ _bird1._numFrames = 16;
+
+ _folliage1.postInit();
+ _folliage1.setup(2700, 4, 1);
+ _folliage1.setPosition(Common::Point(188, 37));
+ _folliage1.fixPriority(26);
+
+ _bird2.postInit();
+ _bird2.setup(2750, 2, 1);
+ _bird2.setPosition(Common::Point(188, 34));
+ _bird2.hide();
+
+ _bird1.setAction(&_action1);
+
+ _folliage2.postInit();
+ _folliage2.setup(2750, 3, 1);
+ _folliage2.setPosition(Common::Point(9, 167));
+ _folliage2.fixPriority(252);
+ _folliage2.setAction(&_action2);
+
+ _folliage3.postInit();
+ _folliage3.setup(2750, 4, 1);
+ _folliage3.setPosition(Common::Point(-10, 25));
+ _folliage3.animate(ANIM_MODE_1, NULL);
+ _folliage3.setStrip2(4);
+ _folliage3._moveRate = 20;
+ _folliage3.setAction(&_action3);
+
+ _folliage4.postInit();
+ _folliage4.fixPriority(26);
+ _folliage4.setup(2750, 5, 1);
+ _folliage4.setPosition(Common::Point(258, 33));
+ _folliage4.setAction(&_action4);
+
+ _folliage5.postInit();
+ _folliage5.fixPriority(26);
+ _folliage5.setup(2750, 6, 1);
+ _folliage5.setPosition(Common::Point(61, 38));
+ _folliage5.setAction(&_action5);
+
+ _folliage6.postInit();
+ _folliage6.fixPriority(26);
+ _folliage6.setup(2750, 7, 1);
+ _folliage6.setPosition(Common::Point(69, 37));
+ _folliage6.setAction(&_action6);
+
+ _folliage7.postInit();
+ _folliage7.fixPriority(26);
+ _folliage7.setup(2750, 8, 1);
+ _folliage7.setPosition(Common::Point(80, 35));
+ _folliage7.setAction(&_action7);
_ghoulHome1.setDetails(Rect(29, 50, 35, 56), 2750, 3, -1, 5, 1, NULL);
_ghoulHome2.setDetails(Rect(47, 36, 54, 42), 2750, 3, -1, 5, 1, NULL);
@@ -3965,42 +3955,44 @@ void Scene2750::postInit(SceneObjectList *OwnerList) {
R2_GLOBALS._player.setStrip(6);
R2_GLOBALS._player.animate(ANIM_MODE_NONE, NULL);
R2_GLOBALS._player.setPosition(Common::Point(81, 165));
- R2_GLOBALS._events.setCursor(CURSOR_WALK);
- _field416 = 1204;
+
+ R2_GLOBALS._events.setCursor(CURSOR_ARROW);
+ _stripNumber = 1204;
_sceneMode = 11;
- _stripManager.start(_field416, this);
+ _stripManager.start(_stripNumber, this);
} else {
_sceneMode = 2750;
- _field412 = 1;
+ _areaMode = 1;
R2_GLOBALS._player.setAction(&_sequenceManager, this, 2750, &R2_GLOBALS._player, NULL);
}
} else if (R2_GLOBALS._sceneManager._previousScene == 2800) {
_sceneMode = 2751;
- _field412 = 3;
+ _areaMode = 3;
R2_GLOBALS._player.setAction(&_sequenceManager, this, 2751, &R2_GLOBALS._player, NULL);
} else {
- _field412 = 1;
+ _areaMode = 1;
R2_GLOBALS._player.setPosition(Common::Point(90, 137));
R2_GLOBALS._player.setStrip(3);
R2_GLOBALS._player.enableControl();
}
}
+
void Scene2750::signal() {
switch (_sceneMode) {
case 10:
- switch (_field414) {
+ switch (_moveMode) {
case 1:
- switch (_field412) {
+ switch (_areaMode) {
case 2: {
- _sceneMode = _field414;
- _field412 = 1;
+ _sceneMode = _moveMode;
+ _areaMode = 1;
Common::Point pt(90, 137);
NpcMover *mover = new NpcMover();
R2_GLOBALS._player.addMover(mover, &pt, this);
}
break;
case 3: {
- _field412 = 2;
+ _areaMode = 2;
Common::Point pt(140, 142);
NpcMover *mover = new NpcMover();
R2_GLOBALS._player.addMover(mover, &pt, this);
@@ -4011,25 +4003,25 @@ void Scene2750::signal() {
}
break;
case 2: {
- _sceneMode = _field414;
- _field412 = 2;
+ _sceneMode = _moveMode;
+ _areaMode = 2;
Common::Point pt(170, 162);
NpcMover *mover = new NpcMover();
R2_GLOBALS._player.addMover(mover, &pt, this);
}
break;
case 3:
- switch (_field412) {
+ switch (_areaMode) {
case 1: {
- _field412 = 2;
+ _areaMode = 2;
Common::Point pt(210, 142);
NpcMover *mover = new NpcMover();
R2_GLOBALS._player.addMover(mover, &pt, this);
}
break;
case 2: {
- _sceneMode = _field414;
- _field412 = 3;
+ _sceneMode = _moveMode;
+ _areaMode = 3;
Common::Point pt(270, 142);
NpcMover *mover = new NpcMover();
R2_GLOBALS._player.addMover(mover, &pt, this);
@@ -4040,20 +4032,20 @@ void Scene2750::signal() {
}
break;
case 2752:
- switch (_field412) {
+ switch (_areaMode) {
case 1:
- _sceneMode = _field414;
+ _sceneMode = _moveMode;
setAction(&_sequenceManager, this, 2752, &R2_GLOBALS._player, NULL);
break;
case 2: {
- _field412 = 1;
+ _areaMode = 1;
Common::Point pt(20, 132);
NpcMover *mover = new NpcMover();
R2_GLOBALS._player.addMover(mover, &pt, this);
}
break;
case 3: {
- _field412 = 2;
+ _areaMode = 2;
Common::Point pt(140, 142);
NpcMover *mover = new NpcMover();
R2_GLOBALS._player.addMover(mover, &pt, this);
@@ -4064,23 +4056,23 @@ void Scene2750::signal() {
}
break;
case 2753:
- switch (_field412) {
+ switch (_areaMode) {
case 1: {
- _field412 = 2;
+ _areaMode = 2;
Common::Point pt(210, 142);
NpcMover *mover = new NpcMover();
R2_GLOBALS._player.addMover(mover, &pt, this);
}
break;
case 2: {
- _field412 = 3;
+ _areaMode = 3;
Common::Point pt(300, 132);
NpcMover *mover = new NpcMover();
R2_GLOBALS._player.addMover(mover, &pt, this);
}
break;
case 3:
- _sceneMode = _field414;
+ _sceneMode = _moveMode;
setAction(&_sequenceManager, this, 2753, &R2_GLOBALS._player, NULL);
break;
default:
@@ -4106,24 +4098,25 @@ void Scene2750::signal() {
}
void Scene2750::process(Event &event) {
- if ((R2_GLOBALS._player._canWalk) && (event.eventType == EVENT_BUTTON_DOWN) && (R2_GLOBALS._events.getCursor() == R2_NEGATOR_GUN)) {
- if (_rect1.contains(event.mousePos)) {
- if (!_rect1.contains(R2_GLOBALS._player._position)) {
+ if ((R2_GLOBALS._player._canWalk) && (event.eventType == EVENT_BUTTON_DOWN)
+ && (R2_GLOBALS._events.getCursor() == R2_NEGATOR_GUN)) {
+ if (_walkRect1.contains(event.mousePos)) {
+ if (!_walkRect1.contains(R2_GLOBALS._player._position)) {
event.handled = true;
_sceneMode = 10;
- _field414 = 1;
+ _moveMode = 1;
}
- } else if (_rect2.contains(event.mousePos)) {
- if (!_rect2.contains(R2_GLOBALS._player._position)) {
+ } else if (_walkRect2.contains(event.mousePos)) {
+ if (!_walkRect2.contains(R2_GLOBALS._player._position)) {
event.handled = true;
_sceneMode = 10;
- _field414 = 2;
+ _moveMode = 2;
}
- } else if (_rect3.contains(event.mousePos)) {
- if (!_rect3.contains(R2_GLOBALS._player._position)) {
+ } else if (_walkRect3.contains(event.mousePos)) {
+ if (!_walkRect3.contains(R2_GLOBALS._player._position)) {
event.handled = true;
_sceneMode = 10;
- _field414 = 3;
+ _moveMode = 3;
}
} else {
event.handled = true;
@@ -4132,7 +4125,7 @@ void Scene2750::process(Event &event) {
if (_sceneMode == 10) {
R2_GLOBALS._player.disableControl();
- switch (_field412) {
+ switch (_areaMode) {
case 1: {
Common::Point pt(140, 142);
NpcMover *mover = new NpcMover();
@@ -4140,7 +4133,7 @@ void Scene2750::process(Event &event) {
}
break;
case 2:
- if (_field414 == 1) {
+ if (_moveMode == 1) {
Common::Point pt(140, 142);
NpcMover *mover = new NpcMover();
R2_GLOBALS._player.addMover(mover, &pt, this);
@@ -4170,19 +4163,19 @@ void Scene2750::process(Event &event) {
*--------------------------------------------------------------------------*/
Scene2800::Scene2800(): SceneExt() {
- _field412 = 0;
+ _stripNumber = 0;
}
void Scene2800::synchronize(Serializer &s) {
SceneExt::synchronize(s);
- s.syncAsSint16LE(_field412);
+ s.syncAsSint16LE(_stripNumber);
}
bool Scene2800::Outpost::startAction(CursorType action, Event &event) {
- Scene2800 *scene = (Scene2800 *)R2_GLOBALS._sceneManager._scene;
-
if ((action == CURSOR_USE) && (R2_GLOBALS.getFlag(47))) {
+ Scene2800 *scene = (Scene2800 *)R2_GLOBALS._sceneManager._scene;
+
R2_GLOBALS._player.disableControl();
scene->_sceneMode = 2805;
scene->setAction(&scene->_sequenceManager, scene, 2805, &R2_GLOBALS._player, NULL);
@@ -4198,16 +4191,16 @@ bool Scene2800::Guard::startAction(CursorType action, Event &event) {
R2_GLOBALS._player.disableControl();
R2_GLOBALS._events.setCursor(CURSOR_WALK);
R2_GLOBALS.setFlag(47);
- scene->_field412 = 1205;
+ scene->_stripNumber = 1205;
scene->_sceneMode = 2803;
- scene->_stripManager.start(scene->_field412, scene);
+ scene->_stripManager.start(scene->_stripNumber, scene);
return true;
} else if (action == R2_SONIC_STUNNER) {
R2_GLOBALS._events.setCursor(CURSOR_ARROW);
R2_GLOBALS._player.disableControl();
R2_GLOBALS.setFlag(47);
scene->_sceneMode = 10;
- scene->setAction(&scene->_sequenceManager, scene, 2802, &R2_GLOBALS._player, &scene->_actor2, &scene->_guard, NULL);
+ scene->setAction(&scene->_sequenceManager, scene, 2802, &R2_GLOBALS._player, &scene->_nej, &scene->_guard, NULL);
return true;
} else
return SceneActor::startAction(action, event);
@@ -4220,10 +4213,10 @@ void Scene2800::Action1::signal() {
setDelay(120);
Common::Point pt(330, 25);
NpcMover *mover = new NpcMover();
- scene->_object1.addMover(mover, &pt, NULL);
+ scene->_bird.addMover(mover, &pt, NULL);
} else {
setDelay(1800 + R2_GLOBALS._randomSource.getRandomNumber(600));
- scene->_object1.setPosition(Common::Point(-10, 45));
+ scene->_bird.setPosition(Common::Point(-10, 45));
}
}
@@ -4334,7 +4327,7 @@ void Scene2800::Action2::signal() {
R2_GLOBALS._player.animate(ANIM_MODE_1, NULL);
R2_GLOBALS._player.setObjectWrapper(new SceneObjectWrapper());
- Common::Point pt(100, 64);
+ Common::Point pt(64, 100);
NpcMover *mover = new NpcMover();
R2_GLOBALS._player.addMover(mover, &pt, this);
break;
@@ -4364,8 +4357,8 @@ void Scene2800::Action2::signal() {
}
case 13:
R2_GLOBALS._events.setCursor(CURSOR_WALK);
- scene->_field412 = 1207;
- scene->_stripManager.start(scene->_field412, this);
+ scene->_stripNumber = 1207;
+ scene->_stripManager.start(scene->_stripNumber, this);
break;
case 14: {
R2_GLOBALS._player.disableControl();
@@ -4431,20 +4424,20 @@ void Scene2800::postInit(SceneObjectList *OwnerList) {
R2_GLOBALS._sound2.stop();
SceneExt::postInit();
- _object1.postInit();
- _object1.setup(2750, 4, 1);
- _object1.setPosition(Common::Point(-10, 25));
- _object1.animate(ANIM_MODE_1, NULL);
- _object1.setStrip2(4);
- _object1._moveRate = 20;
- _object1.setAction(&_action1);
-
- _actor3.postInit();
- _actor3.setup(2802, 1, 1);
- _actor3.setPosition(Common::Point(116, 80));
- _actor3.fixPriority(111);
- _actor3.animate(ANIM_MODE_2, NULL);
- _actor3._numFrames = 6;
+ _bird.postInit();
+ _bird.setup(2750, 4, 1);
+ _bird.setPosition(Common::Point(-10, 25));
+ _bird.animate(ANIM_MODE_1, NULL);
+ _bird.setStrip2(4);
+ _bird._moveRate = 20;
+ _bird.setAction(&_action1);
+
+ _lightBar.postInit();
+ _lightBar.setup(2802, 1, 1);
+ _lightBar.setPosition(Common::Point(116, 80));
+ _lightBar.fixPriority(111);
+ _lightBar.animate(ANIM_MODE_2, NULL);
+ _lightBar._numFrames = 6;
if (!R2_GLOBALS.getFlag(47)) {
_guard.postInit();
@@ -4458,7 +4451,7 @@ void Scene2800::postInit(SceneObjectList *OwnerList) {
_guard.setDetails(2800, -1, -1, -1, 1, (SceneItem *)NULL);
}
- _item1.setDetails(Rect(0, 0, 320, 200), 2800, -1, -1, -1, 1, NULL);
+ _background.setDetails(Rect(0, 0, 320, 200), 2800, -1, -1, -1, 1, NULL);
_stripManager.setColors(60, 255);
_stripManager.setFontNumber(3);
@@ -4471,12 +4464,12 @@ void Scene2800::postInit(SceneObjectList *OwnerList) {
if (R2_GLOBALS.getFlag(47)) {
_outpost.setDetails(Rect(76, 45, 155, 90), 2800, 3, -1, -1, 2, NULL);
} else {
- _actor2.postInit();
- _actor2.setup(2752, 5, 1);
- _actor2.animate(ANIM_MODE_NONE, NULL);
- _actor2.changeZoom(100);
- _actor2._moveDiff = Common::Point(2, 1);
- _actor2.setPosition(Common::Point(101, 148));
+ _nej.postInit();
+ _nej.setup(2752, 5, 1);
+ _nej.animate(ANIM_MODE_NONE, NULL);
+ _nej.changeZoom(100);
+ _nej._moveDiff = Common::Point(2, 1);
+ _nej.setPosition(Common::Point(101, 148));
}
}
@@ -4498,7 +4491,8 @@ void Scene2800::postInit(SceneObjectList *OwnerList) {
R2_GLOBALS._player.enableControl();
} else {
_sceneMode = 2801;
- R2_GLOBALS._player.setAction(&_sequenceManager, this, 2801, &R2_GLOBALS._player, &_actor2, &_guard, NULL);
+ R2_GLOBALS._player.setAction(&_sequenceManager, this, 2801, &R2_GLOBALS._player,
+ &_nej, &_guard, NULL);
}
}
@@ -4507,13 +4501,13 @@ void Scene2800::signal() {
case 10:
R2_GLOBALS._sound1.play(238);
R2_GLOBALS._events.setCursor(CURSOR_WALK);
- _field412 = 1206;
+ _stripNumber = 1206;
_sceneMode = 2804;
- _stripManager.start(_field412, this);
+ _stripManager.start(_stripNumber, this);
break;
case 11:
- _actor2.remove();
- _object1.setAction(NULL);
+ _nej.remove();
+ _bird.setAction(NULL);
R2_GLOBALS._player.enableControl(CURSOR_WALK);
R2_GLOBALS._player._moveDiff = Common::Point(3, 2);
_outpost.setDetails(Rect(76, 45, 155, 90), 2800, 3, -1, -1, 2, NULL);
@@ -4533,15 +4527,15 @@ void Scene2800::signal() {
case 2803:
R2_GLOBALS._player.disableControl();
_sceneMode = 10;
- setAction(&_sequenceManager, this, 2803, &R2_GLOBALS._player, &_actor2, &_guard, NULL);
+ setAction(&_sequenceManager, this, 2803, &R2_GLOBALS._player, &_nej, &_guard, NULL);
break;
case 2804:
R2_GLOBALS._player.disableControl();
_sceneMode = 11;
- setAction(&_sequenceManager, this, 2804, &R2_GLOBALS._player, &_actor2, NULL);
+ setAction(&_sequenceManager, this, 2804, &R2_GLOBALS._player, &_nej, NULL);
break;
case 2805:
- _object1.remove();
+ _bird.remove();
setAction(&_action2);
break;
default:
@@ -4616,8 +4610,8 @@ bool Scene2900::KnobLeft::startAction(CursorType action, Event &event) {
switch (action) {
case CURSOR_USE:
- if (scene->_field416 || scene->_altitudeChanging ||
- scene->_field425 != scene->_field426) {
+ if (scene->_majorMinorFlag || scene->_altitudeChanging ||
+ scene->_xAmount != scene->_xComparison) {
// Let your altitude stablize first
SceneItem::display2(2900, 17);
} else if (R2_GLOBALS._balloonAltitude / 48 == 0) {
@@ -4628,7 +4622,7 @@ bool Scene2900::KnobLeft::startAction(CursorType action, Event &event) {
R2_GLOBALS._sound2.fadeSound(282);
scene->_altitudeChanging = true;
scene->_altitudeMajorChange = -1;
- scene->_field426 = 100 - ((R2_GLOBALS._balloonAltitude / 48) - 1) * 25;
+ scene->_xComparison = 100 - ((R2_GLOBALS._balloonAltitude / 48) - 1) * 25;
}
break;
@@ -4649,12 +4643,12 @@ bool Scene2900::KnobLeft::startAction(CursorType action, Event &event) {
}
bool Scene2900::KnobRight::startAction(CursorType action, Event &event) {
- Scene2900 *scene = (Scene2900 *)R2_GLOBALS._sceneManager._scene;
-
switch (action) {
- case CURSOR_USE:
- if (scene->_field416 || scene->_altitudeChanging ||
- scene->_field425 != scene->_field426) {
+ case CURSOR_USE: {
+ Scene2900 *scene = (Scene2900 *)R2_GLOBALS._sceneManager._scene;
+
+ if (scene->_majorMinorFlag || scene->_altitudeChanging ||
+ scene->_xAmount != scene->_xComparison) {
// Let your altitude stablize first
SceneItem::display2(2900, 17);
} else if (R2_GLOBALS._balloonAltitude / 48 >= 3) {
@@ -4665,9 +4659,10 @@ bool Scene2900::KnobRight::startAction(CursorType action, Event &event) {
R2_GLOBALS._sound2.fadeSound(212);
scene->_altitudeChanging = true;
scene->_altitudeMajorChange = 1;
- scene->_field426 = 100 - ((R2_GLOBALS._balloonAltitude / 48) + 1) * 25;
+ scene->_xComparison = 100 - ((R2_GLOBALS._balloonAltitude / 48) + 1) * 25;
}
break;
+ }
case CURSOR_LOOK:
SceneItem::display2(2900, 12);
@@ -4686,9 +4681,9 @@ bool Scene2900::KnobRight::startAction(CursorType action, Event &event) {
}
bool Scene2900::Skip::startAction(CursorType action, Event &event) {
- Scene2900 *scene = (Scene2900 *)R2_GLOBALS._sceneManager._scene;
-
if (action == CURSOR_USE) {
+ Scene2900 *scene = (Scene2900 *)R2_GLOBALS._sceneManager._scene;
+
R2_GLOBALS._player.disableControl();
scene->_sceneMode = 12;
scene->signal();
@@ -4703,22 +4698,22 @@ void Scene2900::Action1::signal() {
Scene2900 *scene = (Scene2900 *)R2_GLOBALS._sceneManager._scene;
setDelay(3);
- if (!scene->_field416 && !scene->_altitudeChanging) {
- scene->_field427 = 2;
- scene->_field412 = 0;
- } else if (scene->_field416) {
+ if (!scene->_majorMinorFlag && !scene->_altitudeChanging) {
+ scene->_fadeCounter = 2;
+ scene->_controlsActiveChanging = false;
+ } else if (scene->_majorMinorFlag) {
R2_GLOBALS._sound2.fadeOut2(NULL);
- } else if (scene->_field427 == 0) {
+ } else if (scene->_fadeCounter == 0) {
R2_GLOBALS._sound2.fadeOut2(NULL);
- } else if (scene->_field412 == 0) {
+ } else if (!scene->_controlsActiveChanging) {
scene->_knobLeftContent.hide();
scene->_knobRightContent.hide();
- scene->_field412 = 1;
+ scene->_controlsActiveChanging = true;
} else {
- --scene->_field427;
+ --scene->_fadeCounter;
scene->_knobLeftContent.show();
scene->_knobRightContent.show();
- scene->_field412 = 0;
+ scene->_controlsActiveChanging = false;
}
}
@@ -4726,10 +4721,6 @@ void Scene2900::Action1::signal() {
Scene2900::Map::Map() {
_mapWidth = _mapHeight = 0;
- _field4 = 0;
- _field6 = 0;
- _field8 = 0;
- _fieldA = 0;
_resNum = 0;
_xV = _yV = 0;
_bounds = Rect(40, 0, 280, 150);
@@ -4851,7 +4842,7 @@ int Scene2900::Map::adjustRect(Common::Rect &r1, const Common::Rect &r2) {
return -1;
}
-void Scene2900::Map::drawBlock(const byte *data, int xp, int yp,
+void Scene2900::Map::drawBlock(const byte *data, int xp, int yp,
const Rect &bounds, const Rect &updateRect) {
Rect blockRect(xp, yp, xp + 160, yp + 100);
const byte *src = data;
@@ -4881,10 +4872,10 @@ void Scene2900::Map::drawBlock(const byte *data, int xp, int yp,
void Scene2900::Map::moveArea(Rect &r, int xAmt, int yAmt) {
Rect tempRect = r;
tempRect.translate(xAmt, yAmt);
- int xpSrc, xpDest, width;
- int ypSrc, ypDest, height;
if (tempRect.intersects(r)) {
+ int xpSrc, xpDest, width;
+ int ypSrc, ypDest, height;
if (xAmt >= 0) {
xpSrc = tempRect.left;
width = tempRect.width() - xAmt;
@@ -4935,48 +4926,48 @@ void Scene2900::Map::moveLine(int xpSrc, int ypSrc, int xpDest, int ypDest, int
/*------------------------------------------------------------------------*/
Scene2900::Scene2900(): SceneExt() {
- _field412 = 0;
+ _controlsActiveChanging = false;
_altitudeChanging = false;
- _field416 = false;
+ _majorMinorFlag = false;
_balloonLocation = Common::Point(550, 550);
- _field41C = 0;
+ _altitudeMinorChange = 0;
_altitudeMajorChange = 0;
_balloonScreenPos = Common::Point(160, 100);
_newAltitude = 0;
- _field425 = 100;
- _field426 = 100;
- _field427 = 0;
- _field8F8 = false;
+ _xAmount = 100;
+ _xComparison = 100;
+ _fadeCounter = 0;
+ _paletteReloadNeeded = false;
}
void Scene2900::synchronize(Serializer &s) {
SceneExt::synchronize(s);
- s.syncAsSint16LE(_field412);
+ s.syncAsSint16LE(_controlsActiveChanging);
s.syncAsSint16LE(_altitudeChanging);
- s.syncAsSint16LE(_field416);
- s.syncAsSint16LE(_field41C);
+ s.syncAsSint16LE(_majorMinorFlag);
+ s.syncAsSint16LE(_altitudeMinorChange);
s.syncAsSint16LE(_altitudeMajorChange);
s.syncAsSint16LE(_balloonLocation.x);
s.syncAsSint16LE(_balloonLocation.y);
s.syncAsSint16LE(_balloonScreenPos.x);
s.syncAsSint16LE(_balloonScreenPos.y);
s.syncAsSint16LE(_newAltitude);
- s.syncAsSint16LE(_field425);
- s.syncAsSint16LE(_field426);
- s.syncAsSint16LE(_field427);
- s.syncAsSint16LE(_field8F8);
+ s.syncAsSint16LE(_xAmount);
+ s.syncAsSint16LE(_xComparison);
+ s.syncAsSint16LE(_fadeCounter);
+ s.syncAsSint16LE(_paletteReloadNeeded);
_map.synchronize(s);
}
void Scene2900::postInit(SceneObjectList *OwnerList) {
R2_GLOBALS._uiElements._active = false;
- // TODO: Determine correct colours
+ // TODO: Determine correct colors
R2_GLOBALS._gfxColors.foreground = 228;
R2_GLOBALS._fontColors.background = 12;
R2_GLOBALS._fontColors.foreground = 22;
-
+
_map.load(2950);
loadScene(2900);
@@ -4986,7 +4977,7 @@ void Scene2900::postInit(SceneObjectList *OwnerList) {
_leftEdge.setup(2900, 6, 1, 22, 0, 25);
_rightEdge.setup(2900, 6, 1, 280, 0, 25);
_knob.setup(2900, 1, 3, 228, 199, 25);
-
+
_altimeterContent.postInit();
_altimeterContent.setVisage(2900);
_altimeterContent.setStrip(2);
@@ -4999,7 +4990,7 @@ void Scene2900::postInit(SceneObjectList *OwnerList) {
_knobLeftContent.setFrame(1);
_knobLeftContent.setPosition(Common::Point(209, 199));
_knobLeftContent.fixPriority(200);
-
+
_knobRightContent.postInit();
_knobRightContent.setVisage(2900);
_knobRightContent.setStrip(1);
@@ -5032,7 +5023,7 @@ void Scene2900::postInit(SceneObjectList *OwnerList) {
R2_GLOBALS._player._moveDiff = Common::Point(2, 2);
R2_GLOBALS._player.disableControl();
- if (R2_GLOBALS._sceneManager._previousScene == 2350 &&
+ if (R2_GLOBALS._sceneManager._previousScene == 2350 &&
R2_GLOBALS._balloonPosition.x == 0 && R2_GLOBALS._balloonPosition.y == 0) {
R2_GLOBALS._balloonAltitude = 5;
_map.setPosition(Common::Point(_balloonLocation.x - 120, _balloonLocation.y - 100));
@@ -5051,7 +5042,7 @@ void Scene2900::postInit(SceneObjectList *OwnerList) {
_balloonLocation.x -= 70;
else if ((R2_GLOBALS._balloonAltitude % 8) == 7)
_balloonLocation.x += 70;
-
+
if (_balloonLocation.x <= 120)
_balloonScreenPos.x = _balloonLocation.x + 40;
else if (_balloonLocation.x >= 680)
@@ -5062,23 +5053,23 @@ void Scene2900::postInit(SceneObjectList *OwnerList) {
if (_balloonLocation.y <= 100)
_balloonScreenPos.y = _balloonLocation.y;
- _field425 = _field426 = 100 - (R2_GLOBALS._balloonAltitude / 48) * 25;
+ _xAmount = _xComparison = 100 - (R2_GLOBALS._balloonAltitude / 48) * 25;
_map.setPosition(Common::Point(_balloonLocation.x - 120, _balloonLocation.y - 100));
_sceneMode = 11;
- R2_GLOBALS._player.changeZoom(_field425);
+ R2_GLOBALS._player.changeZoom(_xAmount);
R2_GLOBALS._player.setPosition(_balloonScreenPos);
R2_GLOBALS._player.enableControl();
R2_GLOBALS._player._canWalk = false;
- _altimeterContent.setPosition(Common::Point(109 - _field425, 189));
+ _altimeterContent.setPosition(Common::Point(109 - _xAmount, 189));
}
R2_GLOBALS._sound1.play(211);
}
void Scene2900::remove() {
- // TODO: Figure out correct colours
+ // TODO: Figure out correct colors
R2_GLOBALS._gfxColors.foreground = 59;
R2_GLOBALS._fontColors.background = 4;
R2_GLOBALS._fontColors.foreground = 15;
@@ -5088,7 +5079,7 @@ void Scene2900::remove() {
R2_GLOBALS._sound1.fadeOut2(NULL);
R2_GLOBALS._sound2.stop();
-
+
R2_GLOBALS._interfaceY = UI_INTERFACE_Y;
SceneExt::remove();
}
@@ -5112,51 +5103,51 @@ void Scene2900::dispatch() {
if (_sceneMode == 11) {
_balloonLocation.x += balloonData[R2_GLOBALS._balloonAltitude].x;
_balloonLocation.y += balloonData[R2_GLOBALS._balloonAltitude].y;
- _field41C = balloonData[R2_GLOBALS._balloonAltitude].v3;
+ _altitudeMinorChange = balloonData[R2_GLOBALS._balloonAltitude].v3;
- if (_field41C == 0) {
- _field416 = false;
+ if (_altitudeMinorChange == 0) {
+ _majorMinorFlag = false;
} else {
- _field416 = true;
+ _majorMinorFlag = true;
_altitudeChanging = false;
- _field426 = 100 - ((R2_GLOBALS._balloonAltitude / 48) + _field41C) * 25;
+ _xComparison = 100 - ((R2_GLOBALS._balloonAltitude / 48) + _altitudeMinorChange) * 25;
}
// Zooming/altitude balloon change
- if (_field425 == _field426) {
- _field416 = false;
+ if (_xAmount == _xComparison) {
+ _majorMinorFlag = false;
} else {
- if (!_field416) {
- _field425 = _field425 - _altitudeMajorChange;
+ if (!_majorMinorFlag) {
+ _xAmount = _xAmount - _altitudeMajorChange;
} else {
- _field425 = _field425 - _field41C;
+ _xAmount = _xAmount - _altitudeMinorChange;
}
- if (_field41C == -1 || _altitudeMajorChange == -1) {
+ if (_altitudeMinorChange == -1 || _altitudeMajorChange == -1) {
if (_altimeterContent._frame == 1) {
_altimeterContent.setFrame2(10);
} else {
_altimeterContent.setFrame2(_altimeterContent._frame - 1);
}
- } else if (_field41C == -1 || _altitudeMajorChange == 1) {
+ } else if (_altitudeMinorChange == -1 || _altitudeMajorChange == 1) {
if (_altimeterContent._frame == 10)
_altimeterContent.setFrame2(1);
else
_altimeterContent.setFrame2(_altimeterContent._frame + 1);
}
- _altimeterContent.setPosition(Common::Point(109 - _field425, 189));
- R2_GLOBALS._player.changeZoom(_field425);
+ _altimeterContent.setPosition(Common::Point(109 - _xAmount, 189));
+ R2_GLOBALS._player.changeZoom(_xAmount);
}
- if (!_field8F8) {
+ if (!_paletteReloadNeeded) {
R2_GLOBALS._scenePalette.loadPalette(2950);
R2_GLOBALS._scenePalette.refresh();
}
R2_GLOBALS._balloonPosition = _map.setPosition(
- Common::Point(_balloonLocation.x - 120, _balloonLocation.y - 100), !_field8F8);
- _field8F8 = true;
+ Common::Point(_balloonLocation.x - 120, _balloonLocation.y - 100), !_paletteReloadNeeded);
+ _paletteReloadNeeded = true;
if (_balloonLocation.x <= 120)
_balloonScreenPos.x = _balloonLocation.x + 40;
@@ -5168,7 +5159,7 @@ void Scene2900::dispatch() {
R2_GLOBALS._player.setPosition(_balloonScreenPos);
- if ((_balloonLocation.x % 100) == 50 && (_balloonLocation.y % 100) == 50 && !_field416) {
+ if ((_balloonLocation.x % 100) == 50 && (_balloonLocation.y % 100) == 50 && !_majorMinorFlag) {
// At an altitude change point, so calculate new altitude
_newAltitude = R2_GLOBALS._balloonAltitude;
if (_altitudeChanging) {
diff --git a/engines/tsage/ringworld2/ringworld2_scenes2.h b/engines/tsage/ringworld2/ringworld2_scenes2.h
index f90126b5a1..1339504712 100644
--- a/engines/tsage/ringworld2/ringworld2_scenes2.h
+++ b/engines/tsage/ringworld2/ringworld2_scenes2.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope 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.
@@ -69,9 +69,9 @@ public:
bool _exitingFlag;
int _mazePlayerMode;
- NamedHotspot _item1;
- SceneActor _object1;
- SceneActor _objList1[11];
+ NamedHotspot _background;
+ SceneActor _companion;
+ SceneActor _persons[11];
WestExit _westExit;
EastExit _eastExit;
SouthExit _southExit;
@@ -92,10 +92,10 @@ public:
};
class Scene2350 : public SceneExt {
- class Actor2 : public SceneActor {
+ class Companion : public SceneActor {
virtual bool startAction(CursorType action, Event &event);
};
- class Actor3 : public SceneActor {
+ class Balloon : public SceneActor {
virtual bool startAction(CursorType action, Event &event);
};
@@ -106,14 +106,13 @@ class Scene2350 : public SceneExt {
virtual void changeScene();
};
public:
-
SpeakerQuinn _quinnSpeaker;
SpeakerPharisha _pharishaSpeaker;
- NamedHotspot _item1;
- SceneActor _actor1;
- Actor2 _actor2;
- Actor3 _actor3;
- Actor3 _actor4;
+ NamedHotspot _background;
+ SceneActor _person;
+ Companion _companion;
+ Balloon _balloon;
+ Balloon _harness;
ExitUp _exitUp;
ExitWest _exitWest;
SequenceManager _sequenceManager;
@@ -121,19 +120,18 @@ public:
virtual void postInit(SceneObjectList *OwnerList = NULL);
virtual void remove();
virtual void signal();
- virtual void process(Event &event);
};
class Scene2400 : public SceneExt {
- class Exit1 : public SceneExit {
+ class WestExit : public SceneExit {
virtual void changeScene();
};
- class Exit2 : public SceneExit {
+ class EastExit : public SceneExit {
virtual void changeScene();
};
public:
- Exit1 _exit1;
- Exit2 _exit2;
+ WestExit _westExit;
+ EastExit _eastExit;
SequenceManager _sequenceManager;
virtual void postInit(SceneObjectList *OwnerList = NULL);
@@ -153,7 +151,7 @@ class Scene2425 : public SceneExt {
public:
virtual bool startAction(CursorType action, Event &event);
};
- class Item4 : public NamedHotspot {
+ class Background : public NamedHotspot {
public:
virtual bool startAction(CursorType action, Event &event);
};
@@ -167,7 +165,7 @@ class Scene2425 : public SceneExt {
bool startAction(CursorType action, Event &event);
};
- class Exit1 : public SceneExit {
+ class SouthEastExit : public SceneExit {
public:
virtual void changeScene();
};
@@ -175,11 +173,11 @@ public:
RopeDest1 _ropeDest1;
RopeDest2 _ropeDest2;
Crevasse _crevasse;
- Item4 _item4;
+ Background _background;
Rope _rope;
Pictographs _pictographs1;
Pictographs _pictographs2;
- Exit1 _exit1;
+ SouthEastExit _southEastExit;
SequenceManager _sequenceManager;
virtual void postInit(SceneObjectList *OwnerList = NULL);
@@ -188,7 +186,7 @@ public:
};
class Scene2430 : public SceneExt {
- class Actor1 : public SceneActor {
+ class Companion : public SceneActor {
public:
bool startAction(CursorType action, Event &event);
};
@@ -201,28 +199,28 @@ class Scene2430 : public SceneExt {
bool startAction(CursorType action, Event &event);
};
- class Exit1 : public SceneExit {
+ class SouthExit : public SceneExit {
public:
virtual void changeScene();
};
public:
- NamedHotspot _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;
- Actor1 _actor1;
+ NamedHotspot _background;
+ NamedHotspot _bottles2;
+ NamedHotspot _furnishings;
+ NamedHotspot _rug1;
+ NamedHotspot _mirror;
+ NamedHotspot _garments;
+ NamedHotspot _bed;
+ NamedHotspot _towel;
+ NamedHotspot _bottles1;
+ NamedHotspot _post;
+ NamedHotspot _clothesPile1;
+ NamedHotspot _clothesPile2;
+ NamedHotspot _rug2;
+ Companion _companion;
GunPowder _gunPowder;
OilLamp _oilLamp;
- Exit1 _exit1;
+ SouthExit _southExit;
SequenceManager _sequenceManager;
virtual void postInit(SceneObjectList *OwnerList = NULL);
@@ -239,7 +237,7 @@ class Scene2435 : public SceneExt {
bool startAction(CursorType action, Event &event);
};
- class Exit1 : public SceneExit {
+ class SouthExit : public SceneExit {
public:
virtual void changeScene();
};
@@ -252,7 +250,7 @@ public:
NamedHotspot _rightWindow;
Companion _companion;
Astor _astor;
- Exit1 _exit1;
+ SouthExit _southExit;
SequenceManager _sequenceManager;
virtual void postInit(SceneObjectList *OwnerList = NULL);
@@ -261,7 +259,7 @@ public:
};
class Scene2440 : public SceneExt {
- class Actor1 : public SceneActor {
+ class Companion : public SceneActor {
public:
bool startAction(CursorType action, Event &event);
};
@@ -270,21 +268,21 @@ class Scene2440 : public SceneExt {
bool startAction(CursorType action, Event &event);
};
- class Exit1 : public SceneExit {
+ class SouthEastExit : public SceneExit {
public:
virtual void changeScene();
};
public:
- NamedHotspot _item1;
- NamedHotspot _item2;
- NamedHotspot _item3;
- NamedHotspot _item4;
- NamedHotspot _item5;
- NamedHotspot _item6;
- NamedHotspot _item7;
- Actor1 _actor1;
+ NamedHotspot _background;
+ NamedHotspot _garments;
+ NamedHotspot _bedspread;
+ NamedHotspot _post;
+ NamedHotspot _rug;
+ NamedHotspot _furnishings;
+ NamedHotspot _bottles;
+ Companion _companion;
OilLamp _oilLamp;
- Exit1 _exit1;
+ SouthEastExit _southEastExit;
SequenceManager _sequenceManager;
virtual void postInit(SceneObjectList *OwnerList = NULL);
@@ -310,7 +308,7 @@ class Scene2450 : public SceneExt {
bool startAction(CursorType action, Event &event);
};
- class Exit1 : public SceneExit {
+ class SouthWestExit : public SceneExit {
public:
virtual void changeScene();
};
@@ -324,7 +322,7 @@ public:
SceneActor _companion;
Parker _parker;
CareTaker _careTaker;
- Exit1 _exit1;
+ SouthWestExit _southWestExit;
SequenceManager _sequenceManager;
virtual void postInit(SceneObjectList *OwnerList = NULL);
@@ -346,7 +344,7 @@ class Scene2455 : public SceneExt {
bool startAction(CursorType action, Event &event);
};
- class Exit1 : public SceneExit {
+ class NorthExit : public SceneExit {
public:
virtual void changeScene();
};
@@ -355,7 +353,7 @@ public:
Lamp _lamp;
Pool _pool;
ScrithKey _scrithKey;
- Exit1 _exit1;
+ NorthExit _northExit;
SequenceManager _sequenceManager;
virtual void postInit(SceneObjectList *OwnerList = NULL);
@@ -364,7 +362,7 @@ public:
};
class Scene2500 : public SceneExt {
- class Exit1 : public SceneExit {
+ class WestExit : public SceneExit {
public:
virtual void changeScene();
};
@@ -373,11 +371,11 @@ public:
SpeakerSeeker _seekerSpeaker;
SpeakerMiranda _mirandaSpeaker;
SpeakerWebbster2500 _webbsterSpeaker;
- NamedHotspot _item1;
- SceneActor _actor1;
- SceneActor _actor2;
- SceneActor _actor3;
- Exit1 _exit1;
+ NamedHotspot _background;
+ SceneActor _companion;
+ SceneActor _quinn;
+ SceneActor _ship;
+ WestExit _westExit;
SequenceManager _sequenceManager;
virtual void postInit(SceneObjectList *OwnerList = NULL);
@@ -385,7 +383,7 @@ public:
};
class Scene2525 : public SceneExt {
- class Item5 : public NamedHotspot {
+ class StopCock : public NamedHotspot {
public:
virtual bool startAction(CursorType action, Event &event);
};
@@ -395,20 +393,20 @@ class Scene2525 : public SceneExt {
bool startAction(CursorType action, Event &event);
};
- class Exit1 : public SceneExit {
+ class SouthExit : public SceneExit {
public:
virtual void changeScene();
};
public:
- NamedHotspot _item1;
- NamedHotspot _item2;
- NamedHotspot _item3;
- NamedHotspot _item4;
- Item5 _item5;
- SceneActor _actor1;
- SceneActor _actor2;
+ NamedHotspot _background;
+ NamedHotspot _machine;
+ NamedHotspot _pipes1;
+ NamedHotspot _pipes2;
+ StopCock _stopcock;
+ SceneActor _companion;
+ SceneActor _compressor;
GlassDome _glassDome;
- Exit1 _exit1;
+ SouthExit _southExit;
SequenceManager _sequenceManager;
virtual void postInit(SceneObjectList *OwnerList = NULL);
@@ -426,20 +424,20 @@ class Scene2530 : public SceneExt {
bool startAction(CursorType action, Event &event);
};
- class Exit1 : public SceneExit {
+ class SouthExit : public SceneExit {
public:
virtual void changeScene();
};
public:
NamedHotspot _background;
- NamedHotspot _item2;
+ NamedHotspot _crank2;
NamedHotspot _shelf;
NamedHotspot _item4;
- NamedHotspot _item5;
- SceneActor _actor1;
+ NamedHotspot _rope;
+ SceneActor _companion;
Flask _flask;
Crank _crank;
- Exit1 _exit1;
+ SouthExit _southExit;
SequenceManager _sequenceManager;
virtual void postInit(SceneObjectList *OwnerList = NULL);
@@ -456,7 +454,7 @@ class Scene2535 : public SceneExt {
bool startAction(CursorType action, Event &event);
};
- class Exit1 : public SceneExit {
+ class SouthExit : public SceneExit {
public:
virtual void changeScene();
};
@@ -472,7 +470,7 @@ public:
SceneActor _rope;
RebreatherTank _rebreatherTank;
TannerMask _tannerMask;
- Exit1 _exit1;
+ SouthExit _southExit;
SequenceManager _sequenceManager;
virtual void postInit(SceneObjectList *OwnerList = NULL);
@@ -509,11 +507,11 @@ class Scene2700 : public SceneExt {
void signal();
};
- class Area1: public SceneArea {
+ class SouthExit: public SceneArea {
public:
void process(Event &event);
};
- class Area2: public SceneArea {
+ class EastExit: public SceneArea {
public:
void process(Event &event);
};
@@ -535,12 +533,12 @@ public:
Action2 _action2;
Action3 _action3;
Action4 _action4;
- Area1 _area1;
- Area2 _area2;
+ SouthExit _southExit;
+ EastExit _eastExit;
Rect _walkRect1, _walkRect2, _walkRect3;
Rect _walkRect4, _walkRect5, _walkRect6;
SequenceManager _sequenceManager;
- int _field412, _field414, _field416;
+ int _areaMode, _moveMode, _stripNumber;
Scene2700();
virtual void synchronize(Serializer &s);
@@ -579,11 +577,11 @@ class Scene2750 : public SceneExt {
void signal();
};
- class Area1: public SceneArea {
+ class WestExit: public SceneArea {
public:
void process(Event &event);
};
- class Area2: public SceneArea {
+ class EastExit: public SceneArea {
public:
void process(Event &event);
};
@@ -596,16 +594,16 @@ public:
NamedHotspot _ghoulHome3;
NamedHotspot _ghoulHome4;
SceneActor _nej;
- SceneActor _actor2;
- SceneActor _actor3;
- SceneActor _actor4;
- SceneActor _actor5;
- SceneActor _actor6;
- SceneActor _actor7;
- SceneActor _actor8;
- SceneActor _actor9;
- SceneActor _actor10;
- SceneActor _actor11;
+ SceneActor _fire;
+ SceneActor _bird1;
+ SceneActor _folliage1;
+ SceneActor _bird2;
+ SceneActor _folliage2;
+ SceneActor _folliage3;
+ SceneActor _folliage4;
+ SceneActor _folliage5;
+ SceneActor _folliage6;
+ SceneActor _folliage7;
Action1 _action1;
Action2 _action2;
Action3 _action3;
@@ -613,11 +611,11 @@ public:
Action5 _action5;
Action6 _action6;
Action7 _action7;
- Area1 _area1;
- Area2 _area2;
- Rect _rect1, _rect2, _rect3;
+ WestExit _westExit;
+ EastExit _eastExit;
+ Rect _walkRect1, _walkRect2, _walkRect3;
SequenceManager _sequenceManager;
- int _field412, _field414, _field416;
+ int _areaMode, _moveMode, _stripNumber;
Scene2750();
virtual void synchronize(Serializer &s);
@@ -651,16 +649,16 @@ public:
SpeakerQuinn2800 _quinnSpeaker;
SpeakerNej2800 _nejSpeaker;
SpeakerGuard2800 _guardSpeaker;
- NamedHotspot _item1;
+ NamedHotspot _background;
Outpost _outpost;
Guard _guard;
- SceneActor _actor2;
- SceneActor _actor3;
- SceneObject _object1;
+ SceneActor _nej;
+ SceneActor _lightBar;
+ SceneObject _bird;
Action1 _action1;
Action2 _action2;
SequenceManager _sequenceManager;
- int _field412;
+ int _stripNumber;
Scene2800();
virtual void synchronize(Serializer &s);
@@ -710,10 +708,6 @@ class Scene2900 : public SceneExt {
void drawBlock(const byte *data, int xp, int yp, const Rect &r1, const Rect &r2);
public:
int _mapWidth, _mapHeight;
- int _field4;
- int _field6;
- int _field8;
- int _fieldA;
int _resNum;
int _xV, _yV;
Rect _bounds;
@@ -741,18 +735,18 @@ public:
Map _map;
SceneText _skipText;
- int _field412;
+ bool _controlsActiveChanging;
bool _altitudeChanging;
- bool _field416;
- int _field41C;
+ bool _majorMinorFlag;
+ int _altitudeMinorChange;
int _altitudeMajorChange;
Common::Point _balloonLocation;
Common::Point _balloonScreenPos;
int _newAltitude;
- int _field425;
- int _field426;
- int _field427;
- bool _field8F8;
+ int _xAmount;
+ int _xComparison;
+ int _fadeCounter;
+ bool _paletteReloadNeeded;
Scene2900();
virtual void synchronize(Serializer &s);
diff --git a/engines/tsage/ringworld2/ringworld2_scenes3.cpp b/engines/tsage/ringworld2/ringworld2_scenes3.cpp
index 5cca1ee483..3f32503fdf 100644
--- a/engines/tsage/ringworld2/ringworld2_scenes3.cpp
+++ b/engines/tsage/ringworld2/ringworld2_scenes3.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope 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.
@@ -35,13 +35,13 @@ namespace Ringworld2 {
*--------------------------------------------------------------------------*/
Scene3100::Scene3100() {
- _field412 = 0;
+ _fadeSound = false;
}
void Scene3100::synchronize(Serializer &s) {
SceneExt::synchronize(s);
- s.syncAsSint16LE(_field412);
+ s.syncAsSint16LE(_fadeSound);
}
bool Scene3100::Guard::startAction(CursorType action, Event &event) {
@@ -84,20 +84,21 @@ void Scene3100::postInit(SceneObjectList *OwnerList) {
R2_GLOBALS._player._characterIndex = R2_QUINN;
R2_GLOBALS._player.disableControl();
- _actor1.postInit();
- _item2.setDetails(Rect(212, 97, 320, 114), 3100, 3, -1, -1, 1, NULL);
- _item1.setDetails(Rect(0, 0, 480, 200), 3100, 0, -1, -1, 1, NULL);
- _field412 = 0;
+ _hammerHead.postInit();
+ _hammerHead2.setDetails(Rect(212, 97, 320, 114), 3100, 3, -1, -1, 1, NULL);
+ _background.setDetails(Rect(0, 0, 480, 200), 3100, 0, -1, -1, 1, NULL);
+ _fadeSound = false;
if (R2_GLOBALS._sceneManager._previousScene == 1000) {
if (R2_GLOBALS._player._oldCharacterScene[R2_QUINN] == 3100) {
_sceneMode = 3102;
- _actor3.postInit();
- _actor4.postInit();
- _actor5.postInit();
+ _ghoul.postInit();
+ _technicians.postInit();
+ _deadBodies.postInit();
R2_GLOBALS._sound1.play(274);
_sound1.fadeSound(130);
- setAction(&_sequenceManager, this, 3102, &_actor1, &R2_GLOBALS._player, &_actor3, &_actor4, &_actor5, NULL);
+ setAction(&_sequenceManager, this, 3102, &_hammerHead, &R2_GLOBALS._player,
+ &_ghoul, &_technicians, &_deadBodies, NULL);
} else {
_guard.postInit();
_guard.setup(3110, 5, 1);
@@ -105,27 +106,28 @@ void Scene3100::postInit(SceneObjectList *OwnerList) {
_guard.setPosition(Common::Point(10, 149));
_guard.setDetails(3100, 6, -1, -1, 2, (SceneItem *)NULL);
- _actor4.postInit();
- _actor4.setup(3103, 1, 1);
- _actor4.setPosition(Common::Point(278, 113));
- _actor4.setDetails(3100, 9, -1, -1, 2, (SceneItem *)NULL);
- _actor4.animate(ANIM_MODE_2, NULL);
+ _technicians.postInit();
+ _technicians.setup(3103, 1, 1);
+ _technicians.setPosition(Common::Point(278, 113));
+ _technicians.setDetails(3100, 9, -1, -1, 2, (SceneItem *)NULL);
+ _technicians.animate(ANIM_MODE_2, NULL);
- _field412 = 1;
- _actor1.setDetails(3100, 3, -1, -1, 2, (SceneItem *)NULL);
+ _fadeSound = true;
+ _hammerHead.setDetails(3100, 3, -1, -1, 2, (SceneItem *)NULL);
R2_GLOBALS._sound1.play(243);
R2_GLOBALS._sound2.play(130);
_sceneMode = 3100;
- setAction(&_sequenceManager, this, 3100, &R2_GLOBALS._player, &_actor1, NULL);
+ setAction(&_sequenceManager, this, 3100, &R2_GLOBALS._player, &_hammerHead, NULL);
}
} else if (R2_GLOBALS._sceneManager._previousScene == 3255) {
_sceneMode = 3101;
- _actor2.postInit();
- _actor3.postInit();
- _field412 = 1;
+ _miranda.postInit();
+ _ghoul.postInit();
+ _fadeSound = true;
- setAction(&_sequenceManager, this, 3101, &R2_GLOBALS._player, &_actor1, &_actor2, &_actor3, NULL);
+ setAction(&_sequenceManager, this, 3101, &R2_GLOBALS._player, &_hammerHead,
+ &_miranda, &_ghoul, NULL);
} else {
_guard.postInit();
_guard.setup(3110, 5, 1);
@@ -133,16 +135,16 @@ void Scene3100::postInit(SceneObjectList *OwnerList) {
_guard.setPosition(Common::Point(10, 149));
_guard.setDetails(3100, 6, -1, -1, 2, (SceneItem *)NULL);
- _actor4.postInit();
- _actor4.setup(3103, 1, 1);
- _actor4.setPosition(Common::Point(278, 113));
- _actor4.setDetails(3100, 9, -1, -1, 2, (SceneItem *)NULL);
- _actor4.animate(ANIM_MODE_2, NULL);
+ _technicians.postInit();
+ _technicians.setup(3103, 1, 1);
+ _technicians.setPosition(Common::Point(278, 113));
+ _technicians.setDetails(3100, 9, -1, -1, 2, (SceneItem *)NULL);
+ _technicians.animate(ANIM_MODE_2, NULL);
- _actor1.postInit();
- _actor1.setup(3104, 4, 1);
- _actor1.setPosition(Common::Point(143, 104));
- _actor1.setDetails(3100, 3, -1, -1, 2, (SceneItem *)NULL);
+ _hammerHead.postInit();
+ _hammerHead.setup(3104, 4, 1);
+ _hammerHead.setPosition(Common::Point(143, 104));
+ _hammerHead.setDetails(3100, 3, -1, -1, 2, (SceneItem *)NULL);
R2_GLOBALS._player.setup(3110, 3, 1);
R2_GLOBALS._player.changeZoom(50);
@@ -189,13 +191,13 @@ void Scene3100::signal() {
}
void Scene3100::dispatch() {
- if ((_sceneMode == 3100) && (_field412 != 0) && (R2_GLOBALS._player._position.y == 104)) {
- _field412 = 0;
+ if ((_sceneMode == 3100) && _fadeSound && (R2_GLOBALS._player._position.y == 104)) {
+ _fadeSound = false;
R2_GLOBALS._sound2.fadeOut2(NULL);
}
- if ((_sceneMode == 3101) && (_field412 != 0) && (R2_GLOBALS._player._position.y < 104)) {
- _field412 = 0;
+ if ((_sceneMode == 3101) && _fadeSound && (R2_GLOBALS._player._position.y < 104)) {
+ _fadeSound = false;
_sound1.fadeSound(130);
}
@@ -208,33 +210,33 @@ void Scene3100::dispatch() {
*--------------------------------------------------------------------------*/
Scene3125::Scene3125() {
- _field412 = 0;
+ _soundPlayed = false;
}
void Scene3125::synchronize(Serializer &s) {
SceneExt::synchronize(s);
- s.syncAsSint16LE(_field412);
+ s.syncAsSint16LE(_soundPlayed);
}
bool Scene3125::Background::startAction(CursorType action, Event &event) {
- Scene3125 *scene = (Scene3125 *)R2_GLOBALS._sceneManager._scene;
-
switch (action) {
case CURSOR_USE:
if (_useLineNum != -1)
- SceneItem::display(_resNum, _useLineNum, 0, 280, 1, 160, 9, 1, 2, 20, 7, 154, -999);
+ SceneItem::display(_resNum, _useLineNum, 0, 280, 1, 160, 9, 1, 2, 20, 7, 154, LIST_END);
break;
case CURSOR_LOOK:
if (_lookLineNum != -1)
- SceneItem::display(_resNum, _lookLineNum, 0, 280, 1, 160, 9, 1, 2, 20, 7, 154, -999);
+ SceneItem::display(_resNum, _lookLineNum, 0, 280, 1, 160, 9, 1, 2, 20, 7, 154, LIST_END);
break;
case CURSOR_TALK:
if (_talkLineNum != -1)
- SceneItem::display(_resNum, _talkLineNum, 0, 280, 1, 160, 9, 1, 2, 20, 7, 154, -999);
+ SceneItem::display(_resNum, _talkLineNum, 0, 280, 1, 160, 9, 1, 2, 20, 7, 154, LIST_END);
break;
- default:
+ default: {
+ Scene3125 *scene = (Scene3125 *)R2_GLOBALS._sceneManager._scene;
return scene->display(action, event);
+ }
break;
}
@@ -242,19 +244,20 @@ bool Scene3125::Background::startAction(CursorType action, Event &event) {
}
bool Scene3125::Table::startAction(CursorType action, Event &event) {
- Scene3125 *scene = (Scene3125 *)R2_GLOBALS._sceneManager._scene;
-
switch (action) {
- case CURSOR_USE:
+ case CURSOR_USE: {
+ Scene3125 *scene = (Scene3125 *)R2_GLOBALS._sceneManager._scene;
+
R2_GLOBALS._player.disableControl();
scene->_sceneMode = 3125;
- scene->setAction(&scene->_sequenceManager1, scene, 3125, &R2_GLOBALS._player, NULL);
+ scene->setAction(&scene->_sequenceManager, scene, 3125, &R2_GLOBALS._player, NULL);
+ }
break;
case CURSOR_LOOK:
- SceneItem::display(3125, 15, 0, 280, 1, 160, 9, 1, 2, 20, 7, 154, -999);
+ SceneItem::display(3125, 15, 0, 280, 1, 160, 9, 1, 2, 20, 7, 154, LIST_END);
break;
case CURSOR_TALK:
- SceneItem::display(3125, 13, 0, 280, 1, 160, 9, 1, 2, 20, 7, 154, -999);
+ SceneItem::display(3125, 13, 0, 280, 1, 160, 9, 1, 2, 20, 7, 154, LIST_END);
break;
default:
return SceneHotspot::startAction(action, event);
@@ -265,22 +268,23 @@ bool Scene3125::Table::startAction(CursorType action, Event &event) {
}
bool Scene3125::Computer::startAction(CursorType action, Event &event) {
- Scene3125 *scene = (Scene3125 *)R2_GLOBALS._sceneManager._scene;
-
switch (action) {
- case CURSOR_USE:
+ case CURSOR_USE: {
+ Scene3125 *scene = (Scene3125 *)R2_GLOBALS._sceneManager._scene;
+
R2_GLOBALS._player.disableControl();
scene->_ghoul4.postInit();
scene->_sceneMode = 3126;
- scene->setAction(&scene->_sequenceManager1, scene, 3126, &R2_GLOBALS._player,
- &scene->_ghoul1, &scene->_ghoul2, &scene->_ghoul3, &scene->_door,
+ scene->setAction(&scene->_sequenceManager, scene, 3126, &R2_GLOBALS._player,
+ &scene->_ghoul1, &scene->_ghoul2, &scene->_ghoul3, &scene->_door,
&scene->_ghoul4, NULL);
+ }
break;
case CURSOR_LOOK:
- SceneItem::display(3125, 9, 0, 280, 1, 160, 9, 1, 2, 20, 7, 154, -999);
+ SceneItem::display(3125, 9, 0, 280, 1, 160, 9, 1, 2, 20, 7, 154, LIST_END);
break;
case CURSOR_TALK:
- SceneItem::display(3125, 13, 0, 280, 1, 160, 9, 1, 2, 20, 7, 154, -999);
+ SceneItem::display(3125, 13, 0, 280, 1, 160, 9, 1, 2, 20, 7, 154, LIST_END);
break;
default:
return SceneHotspot::startAction(action, event);
@@ -291,21 +295,21 @@ bool Scene3125::Computer::startAction(CursorType action, Event &event) {
}
bool Scene3125::Door::startAction(CursorType action, Event &event) {
- Scene3125 *scene = (Scene3125 *)R2_GLOBALS._sceneManager._scene;
-
if (action != CURSOR_USE)
return SceneActor::startAction(action, event);
+ Scene3125 *scene = (Scene3125 *)R2_GLOBALS._sceneManager._scene;
+
R2_GLOBALS._player.disableControl();
scene->_sceneMode = 3176;
- scene->setAction(&scene->_sequenceManager1, scene, 3176, &R2_GLOBALS._player, &scene->_door, NULL);
+ scene->setAction(&scene->_sequenceManager, scene, 3176, &R2_GLOBALS._player, &scene->_door, NULL);
return true;
}
void Scene3125::postInit(SceneObjectList *OwnerList) {
loadScene(3125);
SceneExt::postInit();
- _field412 = 0;
+ _soundPlayed = false;
_door.postInit();
_door.setup(3175, 1, 1);
@@ -336,7 +340,7 @@ void Scene3125::postInit(SceneObjectList *OwnerList) {
if (R2_GLOBALS._player._oldCharacterScene[R2_MIRANDA] == 3250) {
_sceneMode = 3175;
- setAction(&_sequenceManager1, this, 3175, &R2_GLOBALS._player, &_door, NULL);
+ setAction(&_sequenceManager, this, 3175, &R2_GLOBALS._player, &_door, NULL);
} else {
R2_GLOBALS._player.setup(30, 5, 1);
R2_GLOBALS._player.animate(ANIM_MODE_1, NULL);
@@ -349,9 +353,9 @@ void Scene3125::postInit(SceneObjectList *OwnerList) {
void Scene3125::signal() {
switch (_sceneMode) {
case 3125:
- SceneItem::display(3125, 3, 0, 280, 1, 160, 9, 1, 2, 20, 7, 154, -999);
+ SceneItem::display(3125, 3, 0, 280, 1, 160, 9, 1, 2, 20, 7, 154, LIST_END);
_sceneMode = 3127;
- setAction(&_sequenceManager1, this, 3127, &R2_GLOBALS._player, NULL);
+ setAction(&_sequenceManager, this, 3127, &R2_GLOBALS._player, NULL);
break;
case 3126:
R2_GLOBALS.setFlag(79);
@@ -366,9 +370,9 @@ void Scene3125::signal() {
}
void Scene3125::dispatch() {
- if ((_sceneMode == 3126) && (_ghoul1._frame == 2) && (_field412 == 0)) {
- _field412 = 1;
+ if ((_sceneMode == 3126) && (_ghoul1._frame == 2) && !_soundPlayed) {
R2_GLOBALS._sound1.play(265);
+ _soundPlayed = true;
}
Scene::dispatch();
}
@@ -394,12 +398,12 @@ bool Scene3150::LightFixture::startAction(CursorType action, Event &event) {
if ((R2_INVENTORY.getObjectScene(R2_LIGHT_BULB) != 3150) && (R2_GLOBALS.getFlag(75))) {
R2_GLOBALS._player.disableControl();
scene->_bulbOrWire.postInit();
- scene->_bulbOrWire._effect = 3;
+ scene->_bulbOrWire._effect = EFFECT_SHADED2;
scene->_bulbOrWire._shade = 5;
scene->_sceneMode = 3155;
scene->setAction(&scene->_sequenceManager, scene, 3155, &R2_GLOBALS._player, &scene->_bulbOrWire, NULL);
} else {
- SceneItem::display(3150, 42, 0, 280, 1, 160, 9, 1, 2, 20, 7, 7, -999);
+ SceneItem::display(3150, 42, 0, 280, 1, 160, 9, 1, 2, 20, 7, 7, LIST_END);
}
return true;
default:
@@ -415,18 +419,18 @@ bool Scene3150::Toilet::startAction(CursorType action, Event &event) {
case R2_PILLOW:
R2_GLOBALS._player.disableControl();
scene->_water.postInit();
- scene->_water._effect = 6;
+ scene->_water._effect = EFFECT_SHADED2;
scene->_water._shade = 3;
R2_GLOBALS._player.disableControl();
scene->_sceneMode = 3158;
scene->setAction(&scene->_sequenceManager, scene, 3158, &R2_GLOBALS._player, &scene->_water, NULL);
return true;
case R2_FOOD_TRAY:
- if ((R2_INVENTORY.getObjectScene(R2_LIGHT_BULB) != 3150) &&
- (R2_INVENTORY.getObjectScene(R2_SUPERCONDUCTOR_WIRE) == 3150)
+ if ((R2_INVENTORY.getObjectScene(R2_LIGHT_BULB) != 3150) &&
+ (R2_INVENTORY.getObjectScene(R2_SUPERCONDUCTOR_WIRE) == 3150)
&& (R2_GLOBALS.getFlag(75))) {
scene->_foodTray.postInit();
- scene->_foodTray._effect = 6;
+ scene->_foodTray._effect = EFFECT_SHADED2;
scene->_foodTray._shade = 3;
scene->_foodTray.setDetails(3150, 30, -1, -1, 2, (SceneItem *)NULL);
@@ -434,7 +438,7 @@ bool Scene3150::Toilet::startAction(CursorType action, Event &event) {
scene->_sceneMode = 3159;
scene->setAction(&scene->_sequenceManager, scene, 3159, &R2_GLOBALS._player, &scene->_foodTray, NULL);
} else {
- SceneItem::display(3150, 42, 0, 280, 1, 160, 9, 1, 2, 20, 7, 7, -999);
+ SceneItem::display(3150, 42, 0, 280, 1, 160, 9, 1, 2, 20, 7, 7, LIST_END);
}
return true;
default:
@@ -444,17 +448,18 @@ bool Scene3150::Toilet::startAction(CursorType action, Event &event) {
}
bool Scene3150::Water::startAction(CursorType action, Event &event) {
- Scene3150 *scene = (Scene3150 *)R2_GLOBALS._sceneManager._scene;
-
switch (action) {
- case CURSOR_USE:
+ case CURSOR_USE: {
if (R2_GLOBALS.getFlag(75))
return SceneActor::startAction(action, event);
+ Scene3150 *scene = (Scene3150 *)R2_GLOBALS._sceneManager._scene;
+
R2_GLOBALS._player.disableControl();
scene->_sceneMode = 3151;
scene->setAction(&scene->_sequenceManager, scene, 3151, &R2_GLOBALS._player, &scene->_water, NULL);
return true;
+ }
case R2_FOOD_TRAY:
return false;
default:
@@ -464,21 +469,21 @@ bool Scene3150::Water::startAction(CursorType action, Event &event) {
}
bool Scene3150::FoodTray::startAction(CursorType action, Event &event) {
- Scene3150 *scene = (Scene3150 *)R2_GLOBALS._sceneManager._scene;
-
if ((action != CURSOR_USE) || (R2_GLOBALS.getFlag(77)))
return SceneActor::startAction(action, event);
+ Scene3150 *scene = (Scene3150 *)R2_GLOBALS._sceneManager._scene;
+
R2_GLOBALS._player.disableControl();
scene->_sceneMode = 3157;
scene->setAction(&scene->_sequenceManager, scene, 3157, &R2_GLOBALS._player, &scene->_foodTray, NULL);
return true;
}
-bool Scene3150::Actor6::startAction(CursorType action, Event &event) {
- Scene3150 *scene = (Scene3150 *)R2_GLOBALS._sceneManager._scene;
-
+bool Scene3150::ToiletFlush::startAction(CursorType action, Event &event) {
if (action == CURSOR_USE) {
+ Scene3150 *scene = (Scene3150 *)R2_GLOBALS._sceneManager._scene;
+
if (R2_GLOBALS.getFlag(75)) {
if (R2_GLOBALS.getFlag(77)) {
R2_GLOBALS._player.disableControl();
@@ -487,10 +492,10 @@ bool Scene3150::Actor6::startAction(CursorType action, Event &event) {
scene->setAction(&scene->_sequenceManager, scene, 3152, &R2_GLOBALS._player, NULL);
} else {
scene->_sceneMode = 3153;
- scene->setAction(&scene->_sequenceManager, scene, 3152, &R2_GLOBALS._player, &scene->_water, NULL);
+ scene->setAction(&scene->_sequenceManager, scene, 3153, &R2_GLOBALS._player, &scene->_water, NULL);
}
} else {
- SceneItem::display(3150, 42, 0, 280, 1, 160, 9, 1, 2, 20, 7, 7, -999);
+ SceneItem::display(3150, 42, 0, 280, 1, 160, 9, 1, 2, 20, 7, 7, LIST_END);
}
} else {
R2_GLOBALS._player.disableControl();
@@ -504,9 +509,9 @@ bool Scene3150::Actor6::startAction(CursorType action, Event &event) {
}
bool Scene3150::AirVent::startAction(CursorType action, Event &event) {
- Scene3150 *scene = (Scene3150 *)R2_GLOBALS._sceneManager._scene;
-
if ((action == R2_LASER_HACKSAW) && (!R2_GLOBALS.getFlag(80))) {
+ Scene3150 *scene = (Scene3150 *)R2_GLOBALS._sceneManager._scene;
+
R2_GLOBALS._player.disableControl();
scene->_sceneMode = 3160;
scene->setAction(&scene->_sequenceManager, scene, 3160, &R2_GLOBALS._player, &scene->_airVent, NULL);
@@ -577,7 +582,7 @@ void Scene3150::postInit(SceneObjectList *OwnerList) {
_guard.postInit();
_guard.setup(3154, 1, 16);
_guard.setPosition(Common::Point(104, 129));
- _guard._effect = 6;
+ _guard._effect = EFFECT_SHADED2;
_guard._shade = 3;
_guard.setDetails(3150, 24, -1, -1, -1, (SceneItem *)NULL);
}
@@ -607,7 +612,7 @@ void Scene3150::postInit(SceneObjectList *OwnerList) {
}
_water.fixPriority(110);
_water.setPosition(Common::Point(83, 88));
- _water._effect = 6;
+ _water._effect = EFFECT_SHADED2;
_water._shade = 3;
} else {
_water.setup(3152, 7, 3);
@@ -624,10 +629,10 @@ void Scene3150::postInit(SceneObjectList *OwnerList) {
if (R2_INVENTORY.getObjectScene(R2_SUPERCONDUCTOR_WIRE) == 3150) {
_bulbOrWire.postInit();
- _bulbOrWire.setup(3152, 7, 3);
+ _bulbOrWire.setup(3152, 7, 2);
_bulbOrWire.setPosition(Common::Point(70, 55));
_bulbOrWire.fixPriority(111);
- _bulbOrWire._effect = 6;
+ _bulbOrWire._effect = EFFECT_SHADED2;
_bulbOrWire._shade = 5;
}
@@ -637,7 +642,7 @@ void Scene3150::postInit(SceneObjectList *OwnerList) {
_foodTray.setup(3152, 7, 8);
_foodTray.setPosition(Common::Point(82, 92));
_foodTray.fixPriority(111);
- _foodTray._effect = 6;
+ _foodTray._effect = EFFECT_SHADED2;
_foodTray._shade = 3;
} else {
_foodTray.setup(3152, 7, 7);
@@ -662,7 +667,7 @@ void Scene3150::postInit(SceneObjectList *OwnerList) {
case 0:
_sceneMode = 3150;
_guard.postInit();
- _guard._effect = 6;
+ _guard._effect = EFFECT_SHADED2;
_guard._shade = 5;
setAction(&_sequenceManager, this, 3150, &R2_GLOBALS._player, &_guard, &_doorBars, NULL);
break;
@@ -683,22 +688,24 @@ void Scene3150::postInit(SceneObjectList *OwnerList) {
break;
}
default:
- if ((R2_GLOBALS._v56AA0 == 1) && (R2_INVENTORY.getObjectScene(R2_ANCIENT_SCROLLS) == 2000) && (R2_GLOBALS._player._oldCharacterScene[R2_QUINN] == 3100)) {
- ++R2_GLOBALS._v56AA0;
+ if ((R2_GLOBALS._mirandaJailState == 1) && (R2_INVENTORY.getObjectScene(R2_ANCIENT_SCROLLS) == 2000)
+ && (R2_GLOBALS._player._oldCharacterScene[R2_QUINN] == 3100)) {
+ // Moving story on to Miranda getting food delivered
+ ++R2_GLOBALS._mirandaJailState;
_sceneMode = 3156;
_guard.postInit();
- _guard._effect = 6;
+ _guard._effect = EFFECT_SHADED2;
_guard._shade = 3;
_doorBars.postInit();
_foodTray.postInit();
- _foodTray._effect = 6;
+ _foodTray._effect = EFFECT_SHADED2;
_foodTray._shade = 3;
setAction(&_sequenceManager, this, 3156, &R2_GLOBALS._player, &_guard, &_doorBars, &_foodTray, NULL);
} else {
- if (R2_GLOBALS._v56AA0 != 2)
- ++R2_GLOBALS._v56AA0;
+ if ((R2_GLOBALS._mirandaJailState != 1) && (R2_GLOBALS._mirandaJailState != 2))
+ ++R2_GLOBALS._mirandaJailState;
R2_GLOBALS._player.setup(30, 3, 1);
R2_GLOBALS._player.animate(ANIM_MODE_1, NULL);
@@ -787,12 +794,12 @@ void Scene3150::signal() {
void Scene3150::dispatch() {
if (_foodTray._position.x == 155) {
- _foodTray._effect = 0;
+ _foodTray._effect = EFFECT_NONE;
_foodTray._shade = 0;
}
if (_guard._visage == 3154) {
- _guard._effect = 0;
+ _guard._effect = EFFECT_NONE;
_guard._shade = 0;
}
@@ -804,25 +811,23 @@ void Scene3150::dispatch() {
*
*--------------------------------------------------------------------------*/
-bool Scene3175::Item1::startAction(CursorType action, Event &event) {
- Scene3175 *scene = (Scene3175 *)R2_GLOBALS._sceneManager._scene;
-
+bool Scene3175::RoomItem::startAction(CursorType action, Event &event) {
switch (action) {
case CURSOR_USE:
if (_useLineNum != -1) {
- SceneItem::display(_resNum, _useLineNum, 0, 280, 1, 160, 9, 1, 2, 20, 7, 154, -999);
+ SceneItem::display(_resNum, _useLineNum, 0, 280, 1, 160, 9, 1, 2, 20, 7, 154, LIST_END);
return true;
}
break;
case CURSOR_LOOK:
if (_lookLineNum != -1) {
- SceneItem::display(_resNum, _lookLineNum, 0, 280, 1, 160, 9, 1, 2, 20, 7, 154, -999);
+ SceneItem::display(_resNum, _lookLineNum, 0, 280, 1, 160, 9, 1, 2, 20, 7, 154, LIST_END);
return true;
}
break;
case CURSOR_TALK:
if (_talkLineNum != -1) {
- SceneItem::display(_resNum, _talkLineNum, 0, 280, 1, 160, 9, 1, 2, 20, 7, 154, -999);
+ SceneItem::display(_resNum, _talkLineNum, 0, 280, 1, 160, 9, 1, 2, 20, 7, 154, LIST_END);
return true;
}
break;
@@ -830,28 +835,27 @@ bool Scene3175::Item1::startAction(CursorType action, Event &event) {
break;
}
+ Scene3175 *scene = (Scene3175 *)R2_GLOBALS._sceneManager._scene;
return scene->display(action, event);
}
bool Scene3175::Corpse::startAction(CursorType action, Event &event) {
- Scene3175 *scene = (Scene3175 *)R2_GLOBALS._sceneManager._scene;
-
switch (action) {
case CURSOR_USE:
if (_useLineNum != -1) {
- SceneItem::display(_resNum, _useLineNum, 0, 280, 1, 160, 9, 1, 2, 20, 7, 154, -999);
+ SceneItem::display(_resNum, _useLineNum, 0, 280, 1, 160, 9, 1, 2, 20, 7, 154, LIST_END);
return true;
}
break;
case CURSOR_LOOK:
if (_lookLineNum != -1) {
- SceneItem::display(_resNum, _lookLineNum, 0, 280, 1, 160, 9, 1, 2, 20, 7, 154, -999);
+ SceneItem::display(_resNum, _lookLineNum, 0, 280, 1, 160, 9, 1, 2, 20, 7, 154, LIST_END);
return true;
}
break;
case CURSOR_TALK:
if (_talkLineNum != -1) {
- SceneItem::display(_resNum, _talkLineNum, 0, 280, 1, 160, 9, 1, 2, 20, 7, 154, -999);
+ SceneItem::display(_resNum, _talkLineNum, 0, 280, 1, 160, 9, 1, 2, 20, 7, 154, LIST_END);
return true;
}
break;
@@ -859,25 +863,27 @@ bool Scene3175::Corpse::startAction(CursorType action, Event &event) {
break;
}
+ Scene3175 *scene = (Scene3175 *)R2_GLOBALS._sceneManager._scene;
return scene->display(action, event);
}
bool Scene3175::Door::startAction(CursorType action, Event &event) {
- Scene3175 *scene = (Scene3175 *)R2_GLOBALS._sceneManager._scene;
-
switch (action) {
- case CURSOR_USE:
+ case CURSOR_USE: {
+ Scene3175 *scene = (Scene3175 *)R2_GLOBALS._sceneManager._scene;
+
R2_GLOBALS._player.disableControl();
scene->_sceneMode = 3176;
scene->setAction(&scene->_sequenceManager, scene, 3176, &R2_GLOBALS._player, &scene->_door, NULL);
return true;
+ }
break;
case CURSOR_LOOK:
- SceneItem::display(3175, 9, 0, 280, 1, 160, 9, 1, 2, 20, 7, 154, -999);
+ SceneItem::display(3175, 9, 0, 280, 1, 160, 9, 1, 2, 20, 7, 154, LIST_END);
return true;
break;
case CURSOR_TALK:
- SceneItem::display(3175, 10, 0, 280, 1, 160, 9, 1, 2, 20, 7, 154, -999);
+ SceneItem::display(3175, 10, 0, 280, 1, 160, 9, 1, 2, 20, 7, 154, LIST_END);
return true;
break;
default:
@@ -895,17 +901,17 @@ void Scene3175::postInit(SceneObjectList *OwnerList) {
_door.setPosition(Common::Point(35, 72));
_door.setDetails(3175, 9, 10, -1, 1, (SceneItem *)NULL);
- _actor2.postInit();
- _actor2.setup(3175, 2, 1);
- _actor2.setPosition(Common::Point(87, 148));
+ _computer.postInit();
+ _computer.setup(3175, 2, 1);
+ _computer.setPosition(Common::Point(87, 148));
_corpse.postInit();
_corpse.setup(3175, 3, 1);
_corpse.setPosition(Common::Point(199, 117));
_corpse.setDetails(3175, 15, 16, 17, 1, (SceneItem *)NULL);
- _item2.setDetails(12, 3175, 3, 1, 5);
- _item3.setDetails(11, 3175, 6, 7, 8);
+ _table.setDetails(12, 3175, 3, 1, 5);
+ _autopsies.setDetails(11, 3175, 6, 7, 8);
_background.setDetails(Rect(0, 0, 320, 200), 3175, 0, 1, 2, 1, NULL);
R2_GLOBALS._player.postInit();
@@ -948,11 +954,12 @@ void Scene3200::postInit(SceneObjectList *OwnerList) {
R2_GLOBALS._player.hide();
R2_GLOBALS._player.disableControl();
- _actor1.postInit();
- _actor3.postInit();
- _actor2.postInit();
+ _rocko.postInit();
+ _jocko.postInit();
+ _socko.postInit();
- setAction(&_sequenceManager, this, 3200 + R2_GLOBALS._randomSource.getRandomNumber(1), &_actor1, &_actor2, &_actor3, NULL);
+ setAction(&_sequenceManager, this, 3200 + R2_GLOBALS._randomSource.getRandomNumber(1),
+ &_rocko, &_jocko, &_socko, NULL);
}
void Scene3200::signal() {
@@ -976,10 +983,11 @@ void Scene3210::postInit(SceneObjectList *OwnerList) {
R2_GLOBALS._player.hide();
R2_GLOBALS._player.disableControl();
- _actor1.postInit();
- _actor2.postInit();
+ _captain.postInit();
+ _private.postInit();
- setAction(&_sequenceManager, this, 3210 + R2_GLOBALS._randomSource.getRandomNumber(1), &_actor1, &_actor2, NULL);
+ setAction(&_sequenceManager, this, 3210 + R2_GLOBALS._randomSource.getRandomNumber(1),
+ &_captain, &_private, NULL);
}
void Scene3210::signal() {
@@ -1003,10 +1011,11 @@ void Scene3220::postInit(SceneObjectList *OwnerList) {
R2_GLOBALS._player.hide();
R2_GLOBALS._player.disableControl();
- _actor1.postInit();
- _actor2.postInit();
+ _rocko.postInit();
+ _jocko.postInit();
- setAction(&_sequenceManager, this, 3220 + R2_GLOBALS._randomSource.getRandomNumber(1), &_actor1, &_actor2, NULL);
+ setAction(&_sequenceManager, this, 3220 + R2_GLOBALS._randomSource.getRandomNumber(1),
+ &_rocko, &_jocko, NULL);
}
void Scene3220::signal() {
@@ -1030,11 +1039,12 @@ void Scene3230::postInit(SceneObjectList *OwnerList) {
R2_GLOBALS._player.hide();
R2_GLOBALS._player.disableControl();
- _actor1.postInit();
- _actor2.postInit();
- _actor3.postInit();
+ _rocko.postInit();
+ _jocko.postInit();
+ _ghoul.postInit();
- setAction(&_sequenceManager, this, 3230 + R2_GLOBALS._randomSource.getRandomNumber(1), &_actor1, &_actor2, &_actor3, NULL);
+ setAction(&_sequenceManager, this, 3230 + R2_GLOBALS._randomSource.getRandomNumber(1),
+ &_rocko, &_jocko, &_ghoul, NULL);
}
void Scene3230::signal() {
@@ -1059,10 +1069,11 @@ void Scene3240::postInit(SceneObjectList *OwnerList) {
R2_GLOBALS._player.hide();
R2_GLOBALS._player.disableControl();
- _actor1.postInit();
- _actor2.postInit();
+ _teal.postInit();
+ _webbster.postInit();
- setAction(&_sequenceManager, this, 3240 + R2_GLOBALS._randomSource.getRandomNumber(1), &_actor1, &_actor2, NULL);
+ setAction(&_sequenceManager, this, 3240 + R2_GLOBALS._randomSource.getRandomNumber(1),
+ &_teal, &_webbster, NULL);
}
void Scene3240::signal() {
@@ -1086,17 +1097,18 @@ void Scene3245::postInit(SceneObjectList *OwnerList) {
R2_GLOBALS._player.hide();
R2_GLOBALS._player.disableControl();
- _actor1.postInit();
- _actor2.postInit();
+ _ralf.postInit();
+ _tomko.postInit();
if (R2_GLOBALS._scientistConvIndex < 4)
++R2_GLOBALS._scientistConvIndex;
if (R2_GLOBALS._scientistConvIndex >= 4) {
- SceneItem::display(1200, 7, 0, 280, 1, 160, 9, 1, 2, 20, 7, 7, -999);
+ SceneItem::display(1200, 7, 0, 280, 1, 160, 9, 1, 2, 20, 7, 7, LIST_END);
signal();
} else {
- setAction(&_sequenceManager, this, 3244 + R2_GLOBALS._scientistConvIndex, &_actor1, &_actor2, NULL);
+ setAction(&_sequenceManager, this, 3244 + R2_GLOBALS._scientistConvIndex,
+ &_ralf, &_tomko, NULL);
}
}
@@ -1110,24 +1122,22 @@ void Scene3245::signal() {
*--------------------------------------------------------------------------*/
bool Scene3250::Item::startAction(CursorType action, Event &event) {
- Scene3250 *scene = (Scene3250 *)R2_GLOBALS._sceneManager._scene;
-
switch (action) {
case CURSOR_USE:
if (_useLineNum != -1) {
- SceneItem::display(_resNum, _useLineNum, 0, 280, 1, 160, 9, 1, 2, 20, 7, 154, -999);
+ SceneItem::display(_resNum, _useLineNum, 0, 280, 1, 160, 9, 1, 2, 20, 7, 154, LIST_END);
return true;
}
break;
case CURSOR_LOOK:
if (_lookLineNum != -1) {
- SceneItem::display(_resNum, _lookLineNum, 0, 280, 1, 160, 9, 1, 2, 20, 7, 154, -999);
+ SceneItem::display(_resNum, _lookLineNum, 0, 280, 1, 160, 9, 1, 2, 20, 7, 154, LIST_END);
return true;
}
break;
case CURSOR_TALK:
if (_talkLineNum != -1) {
- SceneItem::display(_resNum, _talkLineNum, 0, 280, 1, 160, 9, 1, 2, 20, 7, 154, -999);
+ SceneItem::display(_resNum, _talkLineNum, 0, 280, 1, 160, 9, 1, 2, 20, 7, 154, LIST_END);
return true;
}
break;
@@ -1135,15 +1145,15 @@ bool Scene3250::Item::startAction(CursorType action, Event &event) {
break;
}
+ Scene3250 *scene = (Scene3250 *)R2_GLOBALS._sceneManager._scene;
return scene->display(action, event);
}
bool Scene3250::Door::startAction(CursorType action, Event &event) {
- Scene3250 *scene = (Scene3250 *)R2_GLOBALS._sceneManager._scene;
-
if (action != CURSOR_USE)
return SceneActor::startAction(action, event);
+ Scene3250 *scene = (Scene3250 *)R2_GLOBALS._sceneManager._scene;
R2_GLOBALS._player.disableControl();
switch(_position.x) {
@@ -1202,20 +1212,20 @@ void Scene3250::postInit(SceneObjectList *OwnerList) {
switch (R2_GLOBALS._player._oldCharacterScene[R2_MIRANDA]) {
case 1200:
_sceneMode = 3250;
- _actor4.postInit();
- R2_GLOBALS._player._effect = 0;
- setAction(&_sequenceManager, this, 3250, &R2_GLOBALS._player, &_actor4, NULL);
+ _grate.postInit();
+ R2_GLOBALS._player._effect = EFFECT_NONE;
+ setAction(&_sequenceManager, this, 3250, &R2_GLOBALS._player, &_grate, NULL);
break;
case 3125:
if (R2_GLOBALS.getFlag(79)) {
_sceneMode = 3254;
_ghoul1.postInit();
- _ghoul1._effect = 1;
+ _ghoul1._effect = EFFECT_SHADED;
_ghoul2.postInit();
- _ghoul2._effect = 1;
+ _ghoul2._effect = EFFECT_SHADED;
_ghoul3.postInit();
- _ghoul3._effect = 1;
- setAction(&_sequenceManager, this, 3254, &R2_GLOBALS._player, &_rightDoor,
+ _ghoul3._effect = EFFECT_SHADED;
+ setAction(&_sequenceManager, this, 3254, &R2_GLOBALS._player, &_rightDoor,
&_ghoul1, &_ghoul2, &_ghoul3, &_leftDoor, NULL);
} else {
_sceneMode = 3252;
@@ -1244,7 +1254,7 @@ void Scene3250::postInit(SceneObjectList *OwnerList) {
void Scene3250::signal() {
switch(_sceneMode) {
case 3250:
- R2_GLOBALS._player._effect = 1;
+ R2_GLOBALS._player._effect = EFFECT_SHADED;
R2_GLOBALS._player.enableControl();
break;
case 3254:
@@ -1265,8 +1275,8 @@ void Scene3250::signal() {
}
void Scene3250::dispatch() {
- if ((R2_GLOBALS._player._visage == 3250) && (R2_GLOBALS._player._strip == 3) && (R2_GLOBALS._player._effect == 0)) {
- R2_GLOBALS._player._effect = 6;
+ if ((R2_GLOBALS._player._visage == 3250) && (R2_GLOBALS._player._strip == 3) && (R2_GLOBALS._player._effect == EFFECT_NONE)) {
+ R2_GLOBALS._player._effect = EFFECT_SHADED2;
R2_GLOBALS._player._shade = 6;
}
@@ -1295,10 +1305,10 @@ void Scene3255::postInit(SceneObjectList *OwnerList) {
R2_GLOBALS._sound1.play(267);
R2_GLOBALS._sound2.play(268);
_sceneMode = 3257;
- _actor3.postInit();
+ _door.postInit();
_quinn.postInit();
- _quinn._effect = 1;
- setAction(&_sequenceManager, this, 3257, &R2_GLOBALS._player, &_quinn, &_actor3, NULL);
+ _quinn._effect = EFFECT_SHADED;
+ setAction(&_sequenceManager, this, 3257, &R2_GLOBALS._player, &_quinn, &_door, NULL);
} else {
_teal.postInit();
_teal.setup(303, 1, 1);
@@ -1319,8 +1329,8 @@ void Scene3255::signal() {
_ghoul1.postInit();
_ghoul2.postInit();
_ghoul3.postInit();
- setAction(&_sequenceManager, this, 3258, &R2_GLOBALS._player, &_quinn,
- &_actor3, &_ghoul1, &_ghoul2, &_ghoul3, NULL);
+ setAction(&_sequenceManager, this, 3258, &R2_GLOBALS._player, &_quinn,
+ &_door, &_ghoul1, &_ghoul2, &_ghoul3, NULL);
break;
case 3256:
R2_GLOBALS._sceneManager.changeScene(3250);
@@ -1334,7 +1344,7 @@ void Scene3255::signal() {
R2_GLOBALS._sceneManager.changeScene(3100);
break;
default:
- SceneItem::display(3255, 0, 0, 280, 1, 160, 9, 1, 2, 20, 7, 7, -999);
+ SceneItem::display(3255, 0, 0, 280, 1, 160, 9, 1, 2, 20, 7, 7, LIST_END);
_sceneMode = 3256;
setAction(&_sequenceManager, this, 3256, &R2_GLOBALS._player, NULL);
}
@@ -1346,9 +1356,9 @@ void Scene3255::dispatch() {
if (_ghoul1._position.y <= 110)
_ghoul1._shade = 6 - (_ghoul1._position.y - 95) / 3;
else
- _ghoul1._effect = 1;
+ _ghoul1._effect = EFFECT_SHADED;
} else {
- _ghoul1._effect = 6;
+ _ghoul1._effect = EFFECT_SHADED2;
_ghoul1._shade = 6;
}
@@ -1356,9 +1366,9 @@ void Scene3255::dispatch() {
if (_ghoul2._position.y <= 110)
_ghoul2._shade = 6 - (_ghoul2._position.y - 95) / 3;
else
- _ghoul2._effect = 1;
+ _ghoul2._effect = EFFECT_SHADED;
} else {
- _ghoul2._effect = 6;
+ _ghoul2._effect = EFFECT_SHADED2;
_ghoul2._shade = 6;
}
@@ -1366,16 +1376,16 @@ void Scene3255::dispatch() {
if (_ghoul3._position.y <= 110)
_ghoul3._shade = 6 - (_ghoul3._position.y - 95) / 3;
else
- _ghoul3._effect = 1;
+ _ghoul3._effect = EFFECT_SHADED;
} else {
- _ghoul3._effect = 6;
+ _ghoul3._effect = EFFECT_SHADED2;
_ghoul3._shade = 6;
}
}
if ((R2_GLOBALS._player._position.x > 250) && (R2_GLOBALS._player._shade == 1)) {
- R2_GLOBALS._player._effect = 6;
- _quinn._effect = 6;
+ R2_GLOBALS._player._effect = EFFECT_SHADED2;
+ _quinn._effect = EFFECT_SHADED2;
}
Scene::dispatch();
}
@@ -1386,11 +1396,11 @@ void Scene3255::dispatch() {
*--------------------------------------------------------------------------*/
bool Scene3260::Door::startAction(CursorType action, Event &event) {
- Scene3260 *scene = (Scene3260 *)R2_GLOBALS._sceneManager._scene;
-
if (action != CURSOR_USE)
return SceneActor::startAction(action, event);
+ Scene3260 *scene = (Scene3260 *)R2_GLOBALS._sceneManager._scene;
+
R2_GLOBALS._player.disableControl();
scene->_sceneMode = 3271;
scene->setAction(&scene->_sequenceManager, scene, 3271, &R2_GLOBALS._player, &scene->_door, NULL);
@@ -1398,11 +1408,11 @@ bool Scene3260::Door::startAction(CursorType action, Event &event) {
}
bool Scene3260::Toolbox::startAction(CursorType action, Event &event) {
- Scene3260 *scene = (Scene3260 *)R2_GLOBALS._sceneManager._scene;
-
if (action != CURSOR_USE)
return SceneActor::startAction(action, event);
+ Scene3260 *scene = (Scene3260 *)R2_GLOBALS._sceneManager._scene;
+
R2_GLOBALS._player.disableControl();
scene->_sceneMode = 3272;
scene->setAction(&scene->_sequenceManager, scene, 3272, &R2_GLOBALS._player, &scene->_toolbox, NULL);
@@ -1470,23 +1480,23 @@ void Scene3260::postInit(SceneObjectList *OwnerList) {
_screen6.setDetails(3260, 3, 1, 5, 1, (SceneItem *)NULL);
_screen6.setAction(&_action6, &_screen6);
- _actor7.postInit();
- _actor7.setup(3260, 2, 1);
- _actor7.setPosition(Common::Point(190, 22));
- _actor7.setDetails(3260, 3, 1, 5, 1, (SceneItem *)NULL);
- _actor7.setAction(&_action7, &_actor7);
+ _screen7.postInit();
+ _screen7.setup(3260, 2, 1);
+ _screen7.setPosition(Common::Point(190, 22));
+ _screen7.setDetails(3260, 3, 1, 5, 1, (SceneItem *)NULL);
+ _screen7.setAction(&_action7, &_screen7);
- _actor8.postInit();
- _actor8.setup(3260, 2, 1);
- _actor8.setPosition(Common::Point(142, 14));
- _actor8.setDetails(3260, 3, 1, 5, 1, (SceneItem *)NULL);
- _actor8.setAction(&_action8, &_actor8);
+ _screen8.postInit();
+ _screen8.setup(3260, 2, 1);
+ _screen8.setPosition(Common::Point(142, 14));
+ _screen8.setDetails(3260, 3, 1, 5, 1, (SceneItem *)NULL);
+ _screen8.setAction(&_action8, &_screen8);
- _actor9.postInit();
- _actor9.setup(3260, 2, 1);
- _actor9.setPosition(Common::Point(166, 6));
- _actor9.setDetails(3260, 3, 1, 5, 1, (SceneItem *)NULL);
- _actor9.setAction(&_action9, &_actor9);
+ _screen9.postInit();
+ _screen9.setup(3260, 2, 1);
+ _screen9.setPosition(Common::Point(166, 6));
+ _screen9.setDetails(3260, 3, 1, 5, 1, (SceneItem *)NULL);
+ _screen9.setAction(&_action9, &_screen9);
_securityConsole.postInit();
_securityConsole.setup(3260, 3, 1);
@@ -1513,7 +1523,7 @@ void Scene3260::postInit(SceneObjectList *OwnerList) {
_lightingConsole.setDetails(3260, 9, 1, 11, 1, (SceneItem *)NULL);
_lightingConsole.animate(ANIM_MODE_2, NULL);
- _item1.setDetails(Rect(0, 0, 320, 200), 3260, 0, 1, 2, 1, NULL);
+ _background.setDetails(Rect(0, 0, 320, 200), 3260, 0, 1, 2, 1, NULL);
R2_GLOBALS._player.postInit();
if (R2_GLOBALS._player._oldCharacterScene[R2_MIRANDA] == 3275) {
@@ -1542,7 +1552,7 @@ void Scene3260::signal() {
case 3272:
_sceneMode = 3273;
R2_GLOBALS._events.setCursor(CURSOR_WALK);
- SceneItem::display(3260, 15, 0, 280, 1, 160, 9, 1, 2, 20, 7, 154, -999);
+ SceneItem::display(3260, 15, 0, 280, 1, 160, 9, 1, 2, 20, 7, 154, LIST_END);
R2_GLOBALS._player.disableControl();
R2_INVENTORY.setObjectScene(R2_TOOLBOX, 3);
R2_INVENTORY.setObjectScene(R2_LASER_HACKSAW, 3);
@@ -1564,11 +1574,11 @@ void Scene3260::signal() {
*--------------------------------------------------------------------------*/
bool Scene3275::Door::startAction(CursorType action, Event &event) {
- Scene3275 *scene = (Scene3275 *)R2_GLOBALS._sceneManager._scene;
-
if (action != CURSOR_USE)
return SceneActor::startAction(action, event);
+ Scene3275 *scene = (Scene3275 *)R2_GLOBALS._sceneManager._scene;
+
R2_GLOBALS._player.disableControl();
scene->_sceneMode = 3275;
scene->setAction(&scene->_sequenceManager, scene, 3275, &R2_GLOBALS._player, &scene->_door, NULL);
@@ -1600,9 +1610,9 @@ void Scene3275::postInit(SceneObjectList *OwnerList) {
_cellExit.setDetails(Rect(398, 60, 439, 118), SHADECURSOR_UP, 3150);
_cellExit.setDest(Common::Point(418, 128));
- _actor1.postInit();
- _actor1.setup(3275, 1, 7);
- _actor1.setPosition(Common::Point(419, 119));
+ _doorFrame.postInit();
+ _doorFrame.setup(3275, 1, 7);
+ _doorFrame.setPosition(Common::Point(419, 119));
_door.postInit();
_door.setup(3275, 2, 1);
@@ -1661,8 +1671,8 @@ void Scene3275::signal() {
void Scene3350::postInit(SceneObjectList *OwnerList) {
loadScene(3350);
- SceneExt::postInit();
R2_GLOBALS._uiElements._active = false;
+ SceneExt::postInit();
R2_GLOBALS._interfaceY = SCREEN_HEIGHT;
R2_GLOBALS._sound2.play(310);
@@ -1673,27 +1683,27 @@ void Scene3350::postInit(SceneObjectList *OwnerList) {
R2_GLOBALS._player.hide();
R2_GLOBALS._player.disableControl();
- _actor1.postInit();
- _actor1.hide();
- _actor2.postInit();
- _actor2.hide();
- _actor3.postInit();
- _actor3.hide();
- _actor4.postInit();
- _actor4.hide();
- _actor9.postInit();
- _actor9.hide();
- _actor8.postInit();
- _actor8.hide();
- _actor5.postInit();
- _actor5.hide();
- _actor6.postInit();
- _actor6.hide();
- _actor7.postInit();
- _actor7.hide();
+ _miranda.postInit();
+ _miranda.hide();
+ _seeker.postInit();
+ _seeker.hide();
+ _webbster.postInit();
+ _webbster.hide();
+ _seatedPeople.postInit();
+ _seatedPeople.hide();
+ _shipFront.postInit();
+ _shipFront.hide();
+ _canopy.postInit();
+ _canopy.hide();
+ _ship.postInit();
+ _ship.hide();
+ _landedShip.postInit();
+ _landedShip.hide();
+ _shipShadow.postInit();
+ _shipShadow.hide();
_sceneMode = 3350;
- setAction(&_sequenceManager, this, _sceneMode, &_actor5, &_actor6, &_actor7, NULL);
+ setAction(&_sequenceManager, this, _sceneMode, &_ship, &_landedShip, &_shipShadow, NULL);
}
void Scene3350::remove() {
@@ -1705,11 +1715,13 @@ void Scene3350::signal() {
switch (_sceneMode) {
case 3350:
_sceneMode = 3351;
- setAction(&_sequenceManager, this, 3351, &_actor4, &_actor9, &_actor8, NULL);
+ setAction(&_sequenceManager, this, 3351, &_seatedPeople, &_shipFront, &_canopy, NULL);
break;
case 3351:
_sceneMode = 3352;
- setAction(&_sequenceManager, this, 3352, &_actor4, &R2_GLOBALS._player, &_actor1, &_actor2, &_actor3, NULL);
+ setAction(&_sequenceManager, this, 3352, &_seatedPeople, &R2_GLOBALS._player,
+ &_miranda, &_seeker, &_webbster, NULL);
+ break;
case 3352:
R2_GLOBALS._sceneManager.changeScene(3395);
break;
@@ -1727,8 +1739,7 @@ void Scene3350::signal() {
void Scene3375::synchronize(Serializer &s) {
SceneExt::synchronize(s);
- s.syncAsSint16LE(_field1488);
- s.syncAsSint16LE(_field1492);
+ s.syncAsSint16LE(_newSceneMode);
for (int i = 0; i < 4; ++i)
s.syncAsSint16LE(_sceneAreas[i]);
}
@@ -1753,11 +1764,11 @@ void Scene3375::enterArea(int sceneMode) {
R2_GLOBALS._player.setPosition(Common::Point(148, 230));
_companion1.setPosition(Common::Point(191, 274));
- _companion1._effect = 1;
+ _companion1._effect = EFFECT_SHADED;
_companion2.setPosition(Common::Point(124, 255));
- _companion2._effect = 1;
+ _companion2._effect = EFFECT_SHADED;
_webbster.setPosition(Common::Point(155, 245));
- _webbster._effect = 1;
+ _webbster._effect = EFFECT_SHADED;
break;
case 3381:
--R2_GLOBALS._walkwaySceneNumber;
@@ -1771,11 +1782,11 @@ void Scene3375::enterArea(int sceneMode) {
R2_GLOBALS._player.setPosition(Common::Point(201, 131));
_companion1.setPosition(Common::Point(231, 127));
- _companion1._effect = 1;
+ _companion1._effect = EFFECT_SHADED;
_companion2.setPosition(Common::Point(231, 127));
- _companion2._effect = 1;
+ _companion2._effect = EFFECT_SHADED;
_webbster.setPosition(Common::Point(231, 127));
- _webbster._effect = 1;
+ _webbster._effect = EFFECT_SHADED;
break;
default:
R2_GLOBALS._player.setPosition(Common::Point(192, 155));
@@ -1811,11 +1822,11 @@ void Scene3375::enterArea(int sceneMode) {
}
bool Scene3375::Companion2::startAction(CursorType action, Event &event) {
- Scene3375 *scene = (Scene3375 *)R2_GLOBALS._sceneManager._scene;
-
if (action != CURSOR_TALK)
return SceneActor::startAction(action, event);
+ Scene3375 *scene = (Scene3375 *)R2_GLOBALS._sceneManager._scene;
+
scene->_sceneMode = 9999;
if (R2_GLOBALS._player._characterIndex == R2_SEEKER)
scene->_stripManager.start(3302, scene);
@@ -1826,11 +1837,11 @@ bool Scene3375::Companion2::startAction(CursorType action, Event &event) {
}
bool Scene3375::Companion1::startAction(CursorType action, Event &event) {
- Scene3375 *scene = (Scene3375 *)R2_GLOBALS._sceneManager._scene;
-
if (action != CURSOR_TALK)
return SceneActor::startAction(action, event);
+ Scene3375 *scene = (Scene3375 *)R2_GLOBALS._sceneManager._scene;
+
scene->_sceneMode = 9999;
if (R2_GLOBALS._player._characterIndex == R2_MIRANDA)
scene->_stripManager.start(3302, scene);
@@ -1841,11 +1852,11 @@ bool Scene3375::Companion1::startAction(CursorType action, Event &event) {
}
bool Scene3375::Webbster::startAction(CursorType action, Event &event) {
- Scene3375 *scene = (Scene3375 *)R2_GLOBALS._sceneManager._scene;
-
if (action != CURSOR_TALK)
return SceneActor::startAction(action, event);
+ Scene3375 *scene = (Scene3375 *)R2_GLOBALS._sceneManager._scene;
+
scene->_sceneMode = 9999;
scene->_stripManager.start(3303, scene);
@@ -1853,8 +1864,6 @@ bool Scene3375::Webbster::startAction(CursorType action, Event &event) {
}
bool Scene3375::Door::startAction(CursorType action, Event &event) {
- Scene3375 *scene = (Scene3375 *)R2_GLOBALS._sceneManager._scene;
-
if (action != CURSOR_USE)
return SceneActor::startAction(action, event);
@@ -1872,8 +1881,10 @@ bool Scene3375::Door::startAction(CursorType action, Event &event) {
R2_GLOBALS._player.disableControl(CURSOR_ARROW);
+ Scene3375 *scene = (Scene3375 *)R2_GLOBALS._sceneManager._scene;
+
scene->_sceneMode = 3375;
- scene->setAction(&scene->_sequenceManager, scene, 3375, &R2_GLOBALS._player,
+ scene->setAction(&scene->_sequenceManager, scene, 3375, &R2_GLOBALS._player,
&scene->_companion1, &scene->_companion2, &scene->_webbster, &scene->_door, NULL);
return true;
@@ -1916,12 +1927,12 @@ void Scene3375::DownExit::changeScene() {
Scene3375 *scene = (Scene3375 *)R2_GLOBALS._sceneManager._scene;
_moving = false;
- R2_GLOBALS._player._effect = 6;
+ R2_GLOBALS._player._effect = EFFECT_SHADED2;
R2_GLOBALS._player._shade = 4;
R2_GLOBALS._player.disableControl(CURSOR_ARROW);
scene->_sceneMode = 3377;
- scene->_field1488 = 3381;
+ scene->_newSceneMode = 3381;
if (R2_GLOBALS._walkwaySceneNumber != 0) {
R2_GLOBALS._walkRegions.enableRegion(2);
@@ -1938,12 +1949,12 @@ void Scene3375::RightExit::changeScene() {
Scene3375 *scene = (Scene3375 *)R2_GLOBALS._sceneManager._scene;
_moving = false;
- R2_GLOBALS._player._effect = 6;
+ R2_GLOBALS._player._effect = EFFECT_SHADED2;
R2_GLOBALS._player._shade = 4;
R2_GLOBALS._player.disableControl(CURSOR_ARROW);
scene->_sceneMode = 3378;
- scene->_field1488 = 3380;
+ scene->_newSceneMode = 3380;
if (R2_GLOBALS._walkwaySceneNumber != 0) {
R2_GLOBALS._walkRegions.enableRegion(2);
@@ -1957,7 +1968,7 @@ void Scene3375::RightExit::changeScene() {
}
Scene3375::Scene3375() {
- _field1488 = _field1492 = 0;
+ _newSceneMode = 0;
_sceneAreas[0] = 3376;
_sceneAreas[1] = 3377;
@@ -1985,11 +1996,11 @@ void Scene3375::postInit(SceneObjectList *OwnerList) {
setZoomPercents(126, 55, 200, 167);
R2_GLOBALS._player.postInit();
- if (R2_GLOBALS._player._characterIndex == R2_SEEKER) {
+ if (R2_GLOBALS._player._characterIndex == R2_SEEKER)
R2_GLOBALS._player._moveDiff = Common::Point(5, 3);
- } else {
+ else
R2_GLOBALS._player._moveDiff = Common::Point(3, 2);
- }
+
R2_GLOBALS._player.changeZoom(-1);
switch (R2_GLOBALS._player._characterIndex) {
@@ -2025,7 +2036,7 @@ void Scene3375::postInit(SceneObjectList *OwnerList) {
_companion1._moveDiff = Common::Point(5, 3);
}
_companion1.changeZoom(-1);
- _companion1._effect = 1;
+ _companion1._effect = EFFECT_SHADED;
int tmpStrip, tmpVisage;
if (R2_GLOBALS._sceneManager._previousScene == 3385)
@@ -2044,7 +2055,7 @@ void Scene3375::postInit(SceneObjectList *OwnerList) {
_companion2.postInit();
_companion2._moveDiff = Common::Point(3, 2);
_companion2.changeZoom(-1);
- _companion2._effect = 1;
+ _companion2._effect = EFFECT_SHADED;
if (R2_GLOBALS._sceneManager._previousScene == 3385)
tmpStrip = 1;
else
@@ -2062,7 +2073,7 @@ void Scene3375::postInit(SceneObjectList *OwnerList) {
_webbster._moveRate = 7;
_webbster._moveDiff = Common::Point(5, 3);
_webbster.changeZoom(-1);
- _webbster._effect = 1;
+ _webbster._effect = EFFECT_SHADED;
if (R2_GLOBALS._sceneManager._previousScene == 3385)
tmpStrip = 1;
else
@@ -2117,10 +2128,10 @@ void Scene3375::signalCase3379() {
_sceneMode = 1;
ADD_MOVER(R2_GLOBALS._player, 70, R2_GLOBALS._player._position.y);
R2_GLOBALS._sceneManager._previousScene = 3375;
- R2_GLOBALS._player._effect = 1;
- _companion1._effect = 1;
- _companion2._effect = 1;
- _webbster._effect = 1;
+ R2_GLOBALS._player._effect = EFFECT_SHADED;
+ _companion1._effect = EFFECT_SHADED;
+ _companion2._effect = EFFECT_SHADED;
+ _webbster._effect = EFFECT_SHADED;
return;
//R2_GLOBALS._walkRegions.disableRegion(1);
@@ -2150,10 +2161,10 @@ void Scene3375::signalCase3379() {
break;
}
R2_GLOBALS._sceneManager._previousScene = 3375;
- R2_GLOBALS._player._effect = 1;
- _companion1._effect = 1;
- _companion2._effect = 1;
- _webbster._effect = 1;
+ R2_GLOBALS._player._effect = EFFECT_SHADED;
+ _companion1._effect = EFFECT_SHADED;
+ _companion2._effect = EFFECT_SHADED;
+ _webbster._effect = EFFECT_SHADED;
R2_GLOBALS._player.enableControl(CURSOR_WALK);
}
@@ -2171,14 +2182,23 @@ void Scene3375::signal() {
case 3377:
// No break on purpose
case 3378:
- _sceneMode = _field1488;
- _field1488 = 0;
- _companion1._effect = 6;
+ _sceneMode = _newSceneMode;
+ _newSceneMode = 0;
+
+ _companion1._effect = EFFECT_SHADED2;
_companion1._shade = 4;
- _companion2._effect = 6;
+ _companion2._effect = EFFECT_SHADED2;
_companion2._shade = 4;
- _webbster._effect = 6;
+ _webbster._effect = EFFECT_SHADED2;
_webbster._shade = 4;
+
+ // HACK: Reset zooms in order to avoid giant characters on the upper right of the screen
+ R2_GLOBALS._player.setZoom(-1);
+ _companion1.setZoom(-1);
+ _companion2.setZoom(-1);
+ _webbster.setZoom(-1);
+ //
+
enterArea(_sceneMode);
break;
case 3379:
@@ -2190,6 +2210,7 @@ void Scene3375::signal() {
else
R2_GLOBALS._player.setStrip(3);
R2_GLOBALS._player.enableControl(CURSOR_TALK);
+ break;
default:
_companion1.setPriority(130);
_companion2.setPriority(132);
@@ -2200,25 +2221,25 @@ void Scene3375::signal() {
}
void Scene3375::dispatch() {
- if ((R2_GLOBALS._player._position.y >= 168) && (R2_GLOBALS._player._effect == 1))
- R2_GLOBALS._player._effect = 6;
- else if ((R2_GLOBALS._player._position.y < 168) && (R2_GLOBALS._player._effect == 6))
- R2_GLOBALS._player._effect = 1;
-
- if ((_companion1._position.y >= 168) && (_companion1._effect == 1))
- _companion1._effect = 6;
- else if ((_companion1._position.y < 168) && (_companion1._effect == 6))
- _companion1._effect = 1;
-
- if ((_companion2._position.y >= 168) && (_companion2._effect == 1))
- _companion2._effect = 6;
- else if ((_companion2._position.y < 168) && (_companion2._effect == 6))
- _companion2._effect = 1;
-
- if ((_webbster._position.y >= 168) && (_webbster._effect == 1))
- _webbster._effect = 6;
- else if ((_webbster._position.y < 168) && (_webbster._effect == 6))
- _webbster._effect = 1;
+ if ((R2_GLOBALS._player._position.y >= 168) && (R2_GLOBALS._player._effect == EFFECT_SHADED))
+ R2_GLOBALS._player._effect = EFFECT_SHADED2;
+ else if ((R2_GLOBALS._player._position.y < 168) && (R2_GLOBALS._player._effect == EFFECT_SHADED2))
+ R2_GLOBALS._player._effect = EFFECT_SHADED;
+
+ if ((_companion1._position.y >= 168) && (_companion1._effect == EFFECT_SHADED))
+ _companion1._effect = EFFECT_SHADED2;
+ else if ((_companion1._position.y < 168) && (_companion1._effect == EFFECT_SHADED2))
+ _companion1._effect = EFFECT_SHADED;
+
+ if ((_companion2._position.y >= 168) && (_companion2._effect == EFFECT_SHADED))
+ _companion2._effect = EFFECT_SHADED2;
+ else if ((_companion2._position.y < 168) && (_companion2._effect == EFFECT_SHADED2))
+ _companion2._effect = EFFECT_SHADED;
+
+ if ((_webbster._position.y >= 168) && (_webbster._effect == EFFECT_SHADED))
+ _webbster._effect = EFFECT_SHADED2;
+ else if ((_webbster._position.y < 168) && (_webbster._effect == EFFECT_SHADED2))
+ _webbster._effect = EFFECT_SHADED;
Scene::dispatch();
}
@@ -2229,21 +2250,21 @@ void Scene3375::dispatch() {
*--------------------------------------------------------------------------*/
Scene3385::Scene3385() {
- _field11B2 = 0;
+ _playerStrip = 0;
}
void Scene3385::synchronize(Serializer &s) {
SceneExt::synchronize(s);
- s.syncAsSint16LE(_field11B2);
+ s.syncAsSint16LE(_playerStrip);
}
bool Scene3385::Companion1::startAction(CursorType action, Event &event) {
- Scene3385 *scene = (Scene3385 *)R2_GLOBALS._sceneManager._scene;
-
if (action != CURSOR_TALK)
return SceneActor::startAction(action, event);
+ Scene3385 *scene = (Scene3385 *)R2_GLOBALS._sceneManager._scene;
+
scene->_sceneMode = 9999;
if (R2_GLOBALS._player._characterIndex == R2_SEEKER)
scene->_stripManager.start(3302, scene);
@@ -2254,11 +2275,11 @@ bool Scene3385::Companion1::startAction(CursorType action, Event &event) {
}
bool Scene3385::Companion2::startAction(CursorType action, Event &event) {
- Scene3385 *scene = (Scene3385 *)R2_GLOBALS._sceneManager._scene;
-
if (action != CURSOR_TALK)
return SceneActor::startAction(action, event);
+ Scene3385 *scene = (Scene3385 *)R2_GLOBALS._sceneManager._scene;
+
scene->_sceneMode = 9999;
if (R2_GLOBALS._player._characterIndex == R2_MIRANDA)
scene->_stripManager.start(3302, scene);
@@ -2269,11 +2290,11 @@ bool Scene3385::Companion2::startAction(CursorType action, Event &event) {
}
bool Scene3385::Webbster::startAction(CursorType action, Event &event) {
- Scene3385 *scene = (Scene3385 *)R2_GLOBALS._sceneManager._scene;
-
if (action != CURSOR_TALK)
return SceneActor::startAction(action, event);
+ Scene3385 *scene = (Scene3385 *)R2_GLOBALS._sceneManager._scene;
+
scene->_sceneMode = 9999;
scene->_stripManager.start(3303, scene);
@@ -2281,8 +2302,6 @@ bool Scene3385::Webbster::startAction(CursorType action, Event &event) {
}
bool Scene3385::Door::startAction(CursorType action, Event &event) {
- Scene3385 *scene = (Scene3385 *)R2_GLOBALS._sceneManager._scene;
-
if (action != CURSOR_USE)
return SceneActor::startAction(action, event);
@@ -2290,23 +2309,25 @@ bool Scene3385::Door::startAction(CursorType action, Event &event) {
if (R2_GLOBALS._sceneManager._previousScene == 3375)
R2_GLOBALS._sound2.play(314);
+ Scene3385 *scene = (Scene3385 *)R2_GLOBALS._sceneManager._scene;
+
scene->_sceneMode = 3386;
- scene->setAction(&scene->_sequenceManager, scene, 3386, &R2_GLOBALS._player,
- &scene->_companion1, &scene->_companion2, &scene->_webbster, &scene->_door,
+ scene->setAction(&scene->_sequenceManager, scene, 3386, &R2_GLOBALS._player,
+ &scene->_companion1, &scene->_companion2, &scene->_webbster, &scene->_door,
NULL);
return true;
}
-void Scene3385::Exit1::changeScene() {
+void Scene3385::SouthExit::changeScene() {
Scene3385 *scene = (Scene3385 *)R2_GLOBALS._sceneManager._scene;
R2_GLOBALS._player.disableControl(CURSOR_ARROW);
scene->_sceneMode = 3387;
if (R2_GLOBALS._sceneManager._previousScene == 3375)
- scene->setAction(&scene->_sequenceManager, scene, scene->_sceneMode,
- &R2_GLOBALS._player, &scene->_companion1, &scene->_companion2,
+ scene->setAction(&scene->_sequenceManager, scene, scene->_sceneMode,
+ &R2_GLOBALS._player, &scene->_companion1, &scene->_companion2,
&scene->_webbster, NULL);
else
scene->signal();
@@ -2340,9 +2361,9 @@ void Scene3385::postInit(SceneObjectList *OwnerList) {
R2_GLOBALS._player._characterScene[R2_MIRANDA] = 3385;
if (R2_GLOBALS._sceneManager._previousScene == 3375)
- _field11B2 = 3;
+ _playerStrip = 3;
else
- _field11B2 = 4;
+ _playerStrip = 4;
setZoomPercents(102, 40, 200, 160);
R2_GLOBALS._player.postInit();
@@ -2355,11 +2376,11 @@ void Scene3385::postInit(SceneObjectList *OwnerList) {
R2_GLOBALS._player.changeZoom(-1);
if (R2_GLOBALS._player._characterIndex == R2_SEEKER)
- R2_GLOBALS._player.setup(20, _field11B2, 1);
+ R2_GLOBALS._player.setup(20, _playerStrip, 1);
else if (R2_GLOBALS._player._characterIndex == R2_MIRANDA)
- R2_GLOBALS._player.setup(30, _field11B2, 1);
+ R2_GLOBALS._player.setup(30, _playerStrip, 1);
else
- R2_GLOBALS._player.setup(10, _field11B2, 1);
+ R2_GLOBALS._player.setup(10, _playerStrip, 1);
R2_GLOBALS._player.animate(ANIM_MODE_1, NULL);
R2_GLOBALS._player.disableControl();
@@ -2373,35 +2394,35 @@ void Scene3385::postInit(SceneObjectList *OwnerList) {
_companion1._moveDiff = Common::Point(5, 3);
}
_companion1.changeZoom(-1);
- _companion1._effect = 1;
+ _companion1._effect = EFFECT_SHADED;
if (R2_GLOBALS._player._characterIndex == R2_SEEKER)
- _companion1.setup(10, _field11B2, 1);
+ _companion1.setup(10, _playerStrip, 1);
else
- _companion1.setup(20, _field11B2, 1);
+ _companion1.setup(20, _playerStrip, 1);
_companion1.animate(ANIM_MODE_1, NULL);
_companion1.setDetails(3385, -1, -1, -1, 1, (SceneItem *) NULL);
_companion2.postInit();
_companion2._moveDiff = Common::Point(3, 2);
_companion2.changeZoom(-1);
- _companion2._effect = 1;
+ _companion2._effect = EFFECT_SHADED;
if (R2_GLOBALS._player._characterIndex == R2_MIRANDA)
- _companion2.setup(10, _field11B2, 1);
+ _companion2.setup(10, _playerStrip, 1);
else
- _companion2.setup(30, _field11B2, 1);
+ _companion2.setup(30, _playerStrip, 1);
_companion2.animate(ANIM_MODE_1, NULL);
_companion2.setDetails(3385, -1, -1, -1, 1, (SceneItem *) NULL);
_webbster.postInit();
_webbster._moveDiff = Common::Point(3, 2);
_webbster.changeZoom(-1);
- _webbster._effect = 1;
- _webbster.setup(40, _field11B2, 1);
+ _webbster._effect = EFFECT_SHADED;
+ _webbster.setup(40, _playerStrip, 1);
_webbster.animate(ANIM_MODE_1, NULL);
_webbster.setDetails(3385, 15, -1, -1, 1, (SceneItem *) NULL);
- _exit1.setDetails(Rect(103, 152, 217, 170), SHADECURSOR_DOWN, 3395);
- _exit1.setDest(Common::Point(158, 151));
+ _southExit.setDetails(Rect(103, 152, 217, 170), SHADECURSOR_DOWN, 3395);
+ _southExit.setDest(Common::Point(158, 151));
_door.postInit();
_door.setPosition(Common::Point(160, 100));
@@ -2466,21 +2487,21 @@ void Scene3385::signal() {
*--------------------------------------------------------------------------*/
Scene3395::Scene3395() {
- _field142E = 0;
+ _playerStrip = 0;
}
void Scene3395::synchronize(Serializer &s) {
SceneExt::synchronize(s);
- s.syncAsSint16LE(_field142E);
+ s.syncAsSint16LE(_playerStrip);
}
bool Scene3395::Companion1::startAction(CursorType action, Event &event) {
- Scene3395 *scene = (Scene3395 *)R2_GLOBALS._sceneManager._scene;
-
if (action != CURSOR_TALK)
return SceneActor::startAction(action, event);
+ Scene3395 *scene = (Scene3395 *)R2_GLOBALS._sceneManager._scene;
+
scene->_sceneMode = 9999;
if (R2_GLOBALS._player._characterIndex == R2_SEEKER)
scene->_stripManager.start(3302, scene);
@@ -2491,11 +2512,11 @@ bool Scene3395::Companion1::startAction(CursorType action, Event &event) {
}
bool Scene3395::Companion2::startAction(CursorType action, Event &event) {
- Scene3395 *scene = (Scene3395 *)R2_GLOBALS._sceneManager._scene;
-
if (action != CURSOR_TALK)
return SceneActor::startAction(action, event);
+ Scene3395 *scene = (Scene3395 *)R2_GLOBALS._sceneManager._scene;
+
scene->_sceneMode = 9999;
if (R2_GLOBALS._player._characterIndex == R2_MIRANDA)
scene->_stripManager.start(3302, scene);
@@ -2506,11 +2527,11 @@ bool Scene3395::Companion2::startAction(CursorType action, Event &event) {
}
bool Scene3395::Webbster::startAction(CursorType action, Event &event) {
- Scene3395 *scene = (Scene3395 *)R2_GLOBALS._sceneManager._scene;
-
if (action != CURSOR_TALK)
return SceneActor::startAction(action, event);
+ Scene3395 *scene = (Scene3395 *)R2_GLOBALS._sceneManager._scene;
+
scene->_sceneMode = 9999;
scene->_stripManager.start(3303, scene);
@@ -2518,8 +2539,6 @@ bool Scene3395::Webbster::startAction(CursorType action, Event &event) {
}
bool Scene3395::Door::startAction(CursorType action, Event &event) {
- Scene3395 *scene = (Scene3395 *)R2_GLOBALS._sceneManager._scene;
-
if (action != CURSOR_USE)
return SceneActor::startAction(action, event);
@@ -2527,9 +2546,11 @@ bool Scene3395::Door::startAction(CursorType action, Event &event) {
if (R2_GLOBALS._sceneManager._previousScene == 3385)
R2_GLOBALS._sound2.play(314);
+ Scene3395 *scene = (Scene3395 *)R2_GLOBALS._sceneManager._scene;
+
scene->_sceneMode = 3396;
- scene->setAction(&scene->_sequenceManager, scene, 3396, &R2_GLOBALS._player,
- &scene->_companion1, &scene->_companion2, &scene->_webbster, &scene->_door,
+ scene->setAction(&scene->_sequenceManager, scene, 3396, &R2_GLOBALS._player,
+ &scene->_companion1, &scene->_companion2, &scene->_webbster, &scene->_door,
NULL);
return true;
@@ -2563,9 +2584,9 @@ void Scene3395::postInit(SceneObjectList *OwnerList) {
R2_GLOBALS._player._characterScene[R2_MIRANDA] = 3395;
if (R2_GLOBALS._sceneManager._previousScene == 3385)
- _field142E = 3;
+ _playerStrip = 3;
else
- _field142E = 4;
+ _playerStrip = 4;
setZoomPercents(51, 40, 200, 137);
R2_GLOBALS._player.postInit();
@@ -2578,11 +2599,11 @@ void Scene3395::postInit(SceneObjectList *OwnerList) {
R2_GLOBALS._player.changeZoom(-1);
if (R2_GLOBALS._player._characterIndex == R2_SEEKER)
- R2_GLOBALS._player.setup(20, _field142E, 1);
+ R2_GLOBALS._player.setup(20, _playerStrip, 1);
else if (R2_GLOBALS._player._characterIndex == R2_MIRANDA)
- R2_GLOBALS._player.setup(30, _field142E, 1);
+ R2_GLOBALS._player.setup(30, _playerStrip, 1);
else
- R2_GLOBALS._player.setup(10, _field142E, 1);
+ R2_GLOBALS._player.setup(10, _playerStrip, 1);
R2_GLOBALS._player.animate(ANIM_MODE_1, NULL);
R2_GLOBALS._player.disableControl();
@@ -2596,30 +2617,30 @@ void Scene3395::postInit(SceneObjectList *OwnerList) {
_companion1._moveDiff = Common::Point(5, 3);
}
_companion1.changeZoom(-1);
- _companion1._effect = 1;
+ _companion1._effect = EFFECT_SHADED;
if (R2_GLOBALS._player._characterIndex == R2_SEEKER)
- _companion1.setup(10, _field142E, 1);
+ _companion1.setup(10, _playerStrip, 1);
else
- _companion1.setup(20, _field142E, 1);
+ _companion1.setup(20, _playerStrip, 1);
_companion1.animate(ANIM_MODE_1, NULL);
_companion1.setDetails(3395, -1, -1, -1, 1, (SceneItem *) NULL);
_companion2.postInit();
_companion2._moveDiff = Common::Point(3, 2);
_companion2.changeZoom(-1);
- _companion2._effect = 1;
+ _companion2._effect = EFFECT_SHADED;
if (R2_GLOBALS._player._characterIndex == R2_MIRANDA)
- _companion2.setup(10, _field142E, 1);
+ _companion2.setup(10, _playerStrip, 1);
else
- _companion2.setup(30, _field142E, 1);
+ _companion2.setup(30, _playerStrip, 1);
_companion2.animate(ANIM_MODE_1, NULL);
_companion2.setDetails(3395, -1, -1, -1, 1, (SceneItem *) NULL);
_webbster.postInit();
_webbster._moveDiff = Common::Point(3, 2);
_webbster.changeZoom(-1);
- _webbster._effect = 1;
- _webbster.setup(40, _field142E, 1);
+ _webbster._effect = EFFECT_SHADED;
+ _webbster.setup(40, _playerStrip, 1);
_webbster.animate(ANIM_MODE_1, NULL);
_webbster.setDetails(3395, 18, -1, -1, 1, (SceneItem *) NULL);
@@ -2689,13 +2710,13 @@ void Scene3395::signal() {
*--------------------------------------------------------------------------*/
Scene3400::Scene3400() {
- _field157C = 0;
+ _soundFaded = false;
}
void Scene3400::synchronize(Serializer &s) {
SceneExt::synchronize(s);
- s.syncAsSint16LE(_field157C);
+ s.syncAsSint16LE(_soundFaded);
}
void Scene3400::postInit(SceneObjectList *OwnerList) {
@@ -2703,8 +2724,7 @@ void Scene3400::postInit(SceneObjectList *OwnerList) {
_sceneBounds = Rect(160, 0, 480, 200);
loadScene(3400);
- _field157C = 0;
- R2_GLOBALS._v558B6.set(60, 0, 260, 200);
+ _soundFaded = false;
SceneExt::postInit();
R2_GLOBALS._sound1.play(317);
@@ -2721,10 +2741,10 @@ void Scene3400::postInit(SceneObjectList *OwnerList) {
R2_GLOBALS._player._characterScene[R2_SEEKER] = 3400;
R2_GLOBALS._player._characterScene[R2_MIRANDA] = 3400;
- _actor7.postInit();
- _actor7.setup(3403, 1, 1);
- _actor7.setPosition(Common::Point(190, 103));
- _actor7.fixPriority(89);
+ _manholeCover.postInit();
+ _manholeCover.setup(3403, 1, 1);
+ _manholeCover.setPosition(Common::Point(190, 103));
+ _manholeCover.fixPriority(89);
R2_GLOBALS._player.postInit();
if (R2_GLOBALS._player._characterIndex == R2_SEEKER)
@@ -2753,7 +2773,7 @@ void Scene3400::postInit(SceneObjectList *OwnerList) {
_companion1._moveDiff = Common::Point(5, 3);
}
_companion1.changeZoom(-1);
- _companion1._effect = 1;
+ _companion1._effect = EFFECT_SHADED;
_companion1.setPosition(Common::Point(247, 63));
if (R2_GLOBALS._player._characterIndex == R2_SEEKER)
_companion1.setup(10, 5, 1);
@@ -2764,7 +2784,7 @@ void Scene3400::postInit(SceneObjectList *OwnerList) {
_companion2.postInit();
_companion2._moveDiff = Common::Point(3, 2);
_companion2.changeZoom(-1);
- _companion2._effect = 1;
+ _companion2._effect = EFFECT_SHADED;
_companion2.setPosition(Common::Point(225, 63));
if (R2_GLOBALS._player._characterIndex == R2_MIRANDA)
_companion2.setup(10, 5, 1);
@@ -2776,16 +2796,16 @@ void Scene3400::postInit(SceneObjectList *OwnerList) {
_webbster._numFrames = 7;
_webbster._moveDiff = Common::Point(5, 3);
_webbster.changeZoom(-1);
- _webbster._effect = 1;
+ _webbster._effect = EFFECT_SHADED;
_webbster.setPosition(Common::Point(235, 61));
_webbster.setup(40, 3, 1);
_webbster.animate(ANIM_MODE_1, NULL);
- _actor6.postInit();
- _actor6.setup(3400, 1, 6);
- _actor6.setPosition(Common::Point(236, 51));
- _actor6.fixPriority(51);
- _actor6.animate(ANIM_MODE_6, NULL);
+ _door.postInit();
+ _door.setup(3400, 1, 6);
+ _door.setPosition(Common::Point(236, 51));
+ _door.fixPriority(51);
+ _door.animate(ANIM_MODE_6, NULL);
R2_GLOBALS.clearFlag(71);
_sceneMode = 3400;
@@ -2801,7 +2821,7 @@ void Scene3400::remove() {
void Scene3400::signal() {
switch (_sceneMode) {
case 3305: {
- warning("STUB: sub_1D227()");
+ // First part of discussion
_tealSpeaker._object1.hide();
_teal.show();
_teal.setStrip(1);
@@ -2813,6 +2833,7 @@ void Scene3400::signal() {
}
break;
case 3306:
+ // Teal picks up the sapphire
R2_GLOBALS._sound2.play(318);
_companion1.setStrip(2);
R2_GLOBALS._player.setStrip(6);
@@ -2823,25 +2844,26 @@ void Scene3400::signal() {
_stripManager.start(3307, this);
if (R2_GLOBALS._player._characterIndex == R2_SEEKER) {
_sceneMode = 3400;
- R2_GLOBALS._player.setAction(&_sequenceManager, this, 3400, &R2_GLOBALS._player, &_teal, &_actor8, NULL);
+ R2_GLOBALS._player.setAction(&_sequenceManager, this, 3400, &R2_GLOBALS._player, &_teal, &_sapphire, NULL);
} else {
_sceneMode = 3408;
- _companion1.setAction(&_sequenceManager, this, 3408, &_companion1, &_teal, &_actor8, NULL);
+ _companion1.setAction(&_sequenceManager, this, 3408, &_companion1, &_teal, &_sapphire, NULL);
}
break;
case 3307:
case 3404:
case 3408:
- if (_field157C == 0) {
+ // A tasp!
+ if (!_soundFaded) {
R2_GLOBALS._sound2.fadeOut2(NULL);
- _field157C = 1;
+ _soundFaded = true;
} else {
_sceneMode = 3308;
_stripManager.start(3308, this);
}
break;
case 3308:
- warning("STUB: sub_1D227()");
+ // Characters teleport one after the other
_companion1.setStrip(2);
R2_GLOBALS._player.setStrip(6);
_companion2.setStrip(6);
@@ -2849,46 +2871,47 @@ void Scene3400::signal() {
_teal.setStrip(1);
_sceneMode = 3403;
if (R2_GLOBALS._player._characterIndex == R2_SEEKER)
- setAction(&_sequenceManager, this, 3403, &R2_GLOBALS._player, &_webbster, &_actor7, NULL);
+ setAction(&_sequenceManager, this, 3403, &R2_GLOBALS._player, &_webbster, &_manholeCover, NULL);
else
- setAction(&_sequenceManager, this, 3403, &_companion1, &_webbster, &_actor7, NULL);
+ setAction(&_sequenceManager, this, 3403, &_companion1, &_webbster, &_manholeCover, NULL);
break;
case 3309:
- warning("STUB: sub_1D227()");
+ // Miranda teleports away
_teal.setStrip(1);
_sceneMode = 3405;
if (R2_GLOBALS._player._characterIndex == R2_MIRANDA)
- setAction(&_sequenceManager, this, 3405, &R2_GLOBALS._player, &_actor7, NULL);
+ setAction(&_sequenceManager, this, 3405, &R2_GLOBALS._player, &_manholeCover, NULL);
else
- setAction(&_sequenceManager, this, 3405, &_companion2, &_actor7, NULL);
+ setAction(&_sequenceManager, this, 3405, &_companion2, &_manholeCover, NULL);
break;
case 3310:
- warning("STUB: sub_1D227()");
+ // Quinn teleports away
_teal.setStrip(1);
_sceneMode = 3406;
if (R2_GLOBALS._player._characterIndex == R2_QUINN)
- setAction(&_sequenceManager, this, 3406, &R2_GLOBALS._player, &_actor7, NULL);
+ setAction(&_sequenceManager, this, 3406, &R2_GLOBALS._player, &_manholeCover, NULL);
else if (R2_GLOBALS._player._characterIndex == R2_SEEKER)
- setAction(&_sequenceManager, this, 3406, &_companion1, &_actor7, NULL);
+ setAction(&_sequenceManager, this, 3406, &_companion1, &_manholeCover, NULL);
else if (R2_GLOBALS._player._characterIndex == R2_MIRANDA)
- setAction(&_sequenceManager, this, 3406, &_companion2, &_actor7, NULL);
+ setAction(&_sequenceManager, this, 3406, &_companion2, &_manholeCover, NULL);
break;
case 3311:
- warning("STUB: sub_1D227()");
+ // Teal teleports away
_tealSpeaker._object1.hide();
_teal.show();
_teal.setStrip(1);
_sceneMode = 3407;
- setAction(&_sequenceManager, this, 3407, &_teal, &_actor7, NULL);
+ setAction(&_sequenceManager, this, 3407, &_teal, &_manholeCover, NULL);
break;
case 3400: {
- _actor8.postInit();
- _actor8.hide();
+ // Teal enters the room
+ _sapphire.postInit();
+ _sapphire.hide();
_teal.postInit();
_teal._numFrames = 7;
_teal._moveDiff = Common::Point(3, 2);
_teal.changeZoom(-1);
- _teal._effect = 1;
+ _teal._effect = EFFECT_SHADED;
_teal.setPosition(Common::Point(-15, 90));
_teal.setup(3402, 1, 1);
_teal.animate(ANIM_MODE_1, NULL);
@@ -2903,123 +2926,133 @@ void Scene3400::signal() {
}
break;
case 3401:
+ // Teal first speech
_sceneMode = 3305;
_stripManager.start(3305, this);
break;
case 3402:
+ // Betrayal of Webbster
_sceneMode = 3306;
_stripManager.start(3306, this);
break;
case 3403:
+ // Teal: "Miranda..."
R2_GLOBALS._scrollFollower = &R2_GLOBALS._player;
_sceneMode = 3309;
_stripManager.start(3309, this);
break;
case 3405:
+ // Teal: "And Quinn..."
_sceneMode = 3310;
_stripManager.start(3310, this);
break;
case 3406:
+ // Teal final sentence before teleporting
_sceneMode = 3311;
_stripManager.start(3311, this);
break;
case 3407:
+ // End of scene
R2_GLOBALS._sceneManager.changeScene(3600);
break;
default:
+ // Unexpected scene mode
R2_GLOBALS._player.enableControl();
break;
}
}
/*--------------------------------------------------------------------------
- * Scene 3500 - Cavern Maze
+ * Scene 3500 - Flub tube maze
*
*--------------------------------------------------------------------------*/
Scene3500::Action1::Action1() {
- _field1E = 0;
- _field20 = 0;
- _field22 = 0;
- _field24 = 0;
+ _direction = 0;
+ _headingRightFl = false;
+ _turningFl = false;
}
void Scene3500::Action1::synchronize(Serializer &s) {
Action::synchronize(s);
- s.syncAsSint16LE(_field1E);
- s.syncAsSint16LE(_field20);
- s.syncAsSint16LE(_field22);
- s.syncAsSint16LE(_field24);
+ s.syncAsSint16LE(_direction);
+ s.syncAsSint16LE(_headingRightFl);
+ if (s.getVersion() < 13) {
+ int useless = 0;
+ s.syncAsSint32LE(useless);
+ }
+ s.syncAsSint16LE(_turningFl);
}
-void Scene3500::Action1::sub108670(int arg1) {
+void Scene3500::Action1::handleHorzButton(int direction) {
Scene3500 *scene = (Scene3500 *)R2_GLOBALS._sceneManager._scene;
- _field1E = arg1;
- _field20 = 1;
- _field24 = 1;
+ // Direction: -1 == Left, 1 == Right
+ _direction = direction;
+ _headingRightFl = true;
+ _turningFl = true;
- scene->_actor9.setStrip(2);
- scene->_actor9.show();
+ scene->_tunnelHorzCircle.setStrip(2);
+ scene->_tunnelHorzCircle.show();
- if (_field1E == 1)
- scene->_actor6.show();
+ if (_direction == 1)
+ scene->_symbolRight.show();
else
- scene->_actor5.show();
+ scene->_symbolLeft.show();
- if (scene->_actor1._frame % 2 == 0) {
- scene->_actor1._frameChange = _field1E;
- scene->_actor1.setFrame(scene->_actor1.changeFrame());
+ if (scene->_shuttle._frame % 2 == 0) {
+ scene->_shuttle._frameChange = _direction;
+ scene->_shuttle.setFrame(scene->_shuttle.changeFrame());
}
setActionIndex(0);
}
-void Scene3500::Action1::sub108732(int arg1) {
+void Scene3500::Action1::turnShuttle(bool arg1) {
Scene3500 *scene = (Scene3500 *)R2_GLOBALS._sceneManager._scene;
- _field20 = arg1;
- _field1E = -_field1E;
+ _headingRightFl = arg1;
+ _direction = -_direction;
- if (_field1E == 1) {
- scene->_actor6.show();
- scene->_actor5.hide();
+ if (_direction == 1) {
+ scene->_symbolRight.show();
+ scene->_symbolLeft.hide();
} else {
- scene->_actor5.show();
- scene->_actor6.hide();
+ scene->_symbolLeft.show();
+ scene->_symbolRight.hide();
}
switch (_actionIndex) {
case 4:
- scene->_actor1._frameChange = _field1E;
- scene->_actor1.setFrame(scene->_actor1.changeFrame());
+ scene->_shuttle._frameChange = _direction;
+ scene->_shuttle.setFrame(scene->_shuttle.changeFrame());
// No break on purpose
case 3:
_actionIndex = 10;
setDelay(0);
break;
case 5: {
- scene->_fieldAF8 = 160;
+ scene->_moverVertX = 160;
Common::Point pt(160, 73);
NpcMover *mover = new NpcMover();
- scene->_actor8.addMover(mover, &pt, NULL);
+ scene->_tunnelVertCircle.addMover(mover, &pt, NULL);
- scene->_fieldB9E = 160 - (_field1E * 2 * 160);
- Common::Point pt2(scene->_fieldB9E, 73);
+ scene->_moverHorzX = 160 - (_direction * 2 * 160);
+ Common::Point pt2(scene->_moverHorzX, 73);
NpcMover *mover2 = new NpcMover();
- scene->_actor9.addMover(mover2, &pt2, this);
+ scene->_tunnelHorzCircle.addMover(mover2, &pt2, this);
_actionIndex = 11;
}
break;
case 6:
- scene->_actor1._frameChange = _field1E;
- scene->_actor1.setFrame(scene->_actor1.changeFrame());
+ scene->_shuttle._frameChange = _direction;
+ scene->_shuttle.setFrame(scene->_shuttle.changeFrame());
setDelay(1);
// No break on purpose
case 8:
- scene->_actor9.setStrip(2);
+ scene->_tunnelHorzCircle.setStrip(2);
_actionIndex = 1;
break;
default:
@@ -3033,156 +3066,155 @@ void Scene3500::Action1::signal() {
switch(_actionIndex++) {
case 0:
R2_GLOBALS._player.disableControl();
- scene->_field1286 = 0;
- if (scene->_field1270 != 0) {
- scene->_field1270 = 0;
+ scene->_directionChangesEnabled = false;
+ if (scene->_speed != 0) {
+ scene->_speed = 0;
scene->_mazeChangeAmount = 0;
- scene->_field1272 = 0;
+ scene->_updateIdxChangeFl = false;
scene->_rotation->_idxChange = 0;
}
break;
case 1:
- if ((scene->_actor1._frame % 2) == 1) {
+ if ((scene->_shuttle._frame % 2) == 1) {
setDelay(1);
return;
}
// No break on purpose
case 3:
- scene->_actor1._frameChange = _field1E;
- scene->_actor1.setFrame(scene->_actor1.changeFrame());
+ scene->_shuttle._frameChange = _direction;
+ scene->_shuttle.setFrame(scene->_shuttle.changeFrame());
setDelay(1);
break;
case 4: {
- int si = scene->_mazeUI.getCellFromMapXY(Common::Point(scene->_mazePosition.x + 70, scene->_mazePosition.y + 46));
+ int cellId = scene->_mazeUI.getCellFromMapXY(Common::Point(scene->_mazePosition.x + 70, scene->_mazePosition.y + 46));
int var2 = scene->_mazeUI.cellFromX(scene->_mazePosition.x + 70) - 70;
int var4 = scene->_mazeUI.cellFromY(scene->_mazePosition.y + 46) - 46;
int di = abs(var2 - scene->_mazePosition.x);
int var6 = abs(var4 - scene->_mazePosition.y);
- if ((scene->_actor1._frame % 2) != 0) {
- scene->_actor1._frameChange = _field1E;
- scene->_actor1.setFrame(scene->_actor1.changeFrame());
+ if ((scene->_shuttle._frame % 2) != 0) {
+ scene->_shuttle._frameChange = _direction;
+ scene->_shuttle.setFrame(scene->_shuttle.changeFrame());
}
// Get the new direction starting on
- int var8 = (scene->_action1._field1E * 2 + scene->_mazeDirection);
- if (var8 > MAZEDIR_NORTHWEST)
- var8 = MAZEDIR_NORTH;
- else if (var8 < MAZEDIR_NORTH)
- var8 = MAZEDIR_WEST;
+ int direction = (scene->_action1._direction * 2 + scene->_mazeDirection);
+ if (direction > MAZEDIR_NORTHWEST)
+ direction = MAZEDIR_NORTH;
+ else if (direction < MAZEDIR_NORTH)
+ direction = MAZEDIR_WEST;
// Check whether movement is allowed in that direction. If so, then
// movement is started again
- switch (var8) {
+ switch (direction) {
case MAZEDIR_NORTH:
- if ( ((si != 2) && (si != 3) && (si != 6) && (si != 1) && (si != 23) && (si != 24) && (si != 4) && (si != 11))
+ if ( ((cellId != 2) && (cellId != 3) && (cellId != 6) && (cellId != 1) && (cellId != 23) && (cellId != 24) && (cellId != 4) && (cellId != 11))
|| (var6 != 0)) {
- if ((si != 25) && (si != 26) && (si != 5) && (si != 14) && (si != 15))
- _field20 = 0;
+ if ((cellId != 25) && (cellId != 26) && (cellId != 5) && (cellId != 14) && (cellId != 15))
+ _headingRightFl = false;
else if ((var6 != 0) || (di <= 3)) // useless, skipped: "|| (di == 0)"
- _field20 = 0;
+ _headingRightFl = false;
else
- _field20 = 1;
+ _headingRightFl = true;
} else
- _field20 = 1;
+ _headingRightFl = true;
break;
case MAZEDIR_EAST:
- if ( ((si != 12) && (si != 13) && (si != 11) && (si != 16) && (si != 26) && (si != 24) && (si != 15) && (si != 6) && (si != 31))
+ if ( ((cellId != 12) && (cellId != 13) && (cellId != 11) && (cellId != 16) && (cellId != 26) && (cellId != 24) && (cellId != 15) && (cellId != 6) && (cellId != 31))
|| (di != 0)) {
- if ((si != 25) && (si != 23) && (si != 14) && (si != 5) && (si != 4))
- _field20 = 0;
+ if ((cellId != 25) && (cellId != 23) && (cellId != 14) && (cellId != 5) && (cellId != 4))
+ _headingRightFl = false;
else if ((di != 0) || (var6 <= 3)) // useless, skipped: "|| (var6 == 0)"
- _field20 = 0;
+ _headingRightFl = false;
else
- _field20 = 1;
+ _headingRightFl = true;
} else
- _field20 = 1;
+ _headingRightFl = true;
break;
case MAZEDIR_SOUTH:
- if ( ((si != 2) && (si != 3) && (si != 6) && (si != 1) && (si != 25) && (si != 26) && (si != 5) && (si != 16) && (si != 31))
+ if ( ((cellId != 2) && (cellId != 3) && (cellId != 6) && (cellId != 1) && (cellId != 25) && (cellId != 26) && (cellId != 5) && (cellId != 16) && (cellId != 31))
|| (var6 != 0)) {
- if ((si != 23) && (si != 24) && (si != 4) && (si != 14) && (si != 15))
- _field20 = 0;
+ if ((cellId != 23) && (cellId != 24) && (cellId != 4) && (cellId != 14) && (cellId != 15))
+ _headingRightFl = false;
else if ((var6 != 0) || (di <= 3)) // useless, skipped: "|| (di == 0)"
- _field20 = 0;
+ _headingRightFl = false;
else
- _field20 = 1;
+ _headingRightFl = true;
} else
- _field20 = 1;
+ _headingRightFl = true;
break;
case MAZEDIR_WEST:
- if ( ((si != 12) && (si != 13) && (si != 11) && (si != 16) && (si != 25) && (si != 23) && (si != 14) && (si != 1) && (si != 31))
+ if ( ((cellId != 12) && (cellId != 13) && (cellId != 11) && (cellId != 16) && (cellId != 25) && (cellId != 23) && (cellId != 14) && (cellId != 1) && (cellId != 31))
|| (var6 != 0)) {
- if ((si != 26) && (si != 24) && (si != 15) && (si != 5) && (si != 4))
- _field20 = 0;
+ if ((cellId != 26) && (cellId != 24) && (cellId != 15) && (cellId != 5) && (cellId != 4))
+ _headingRightFl = false;
else if ((var6 <= 0) || (di != 0)) // useless, skipped: "|| (var6 == 0)"
- _field20 = 0;
+ _headingRightFl = false;
else
- _field20 = 1;
+ _headingRightFl = true;
} else
- _field20 = 1;
+ _headingRightFl = true;
default:
break;
}
}
// No break on purpose
case 2: {
- scene->_actor8.setPosition(Common::Point(160, 73));
- scene->_actor8._moveDiff.x = 160 - scene->_mazeChangeAmount;
- scene->_fieldAF8 = 160 - ((_field1E * 2) * 160);
- Common::Point pt(scene->_fieldAF8, 73);
+ scene->_tunnelVertCircle.setPosition(Common::Point(160, 73));
+ scene->_tunnelVertCircle._moveDiff.x = 160 - scene->_mazeChangeAmount;
+ scene->_moverVertX = 160 - ((_direction * 2) * 160);
+ Common::Point pt(scene->_moverVertX, 73);
NpcMover *mover = new NpcMover();
- scene->_actor8.addMover(mover, &pt, this);
+ scene->_tunnelVertCircle.addMover(mover, &pt, this);
- scene->_actor9.setPosition(Common::Point(160 + ((_field1E * 2) * 160), 73));
- scene->_actor9._moveDiff.x = 160 - scene->_mazeChangeAmount;
- scene->_fieldB9E = 160;
- Common::Point pt2(scene->_fieldB9E, 73);
+ scene->_tunnelHorzCircle.setPosition(Common::Point(160 + ((_direction * 2) * 160), 73));
+ scene->_tunnelHorzCircle._moveDiff.x = 160 - scene->_mazeChangeAmount;
+ scene->_moverHorzX = 160;
+ Common::Point pt2(scene->_moverHorzX, 73);
NpcMover *mover2 = new NpcMover();
- scene->_actor9.addMover(mover2, &pt2, NULL);
+ scene->_tunnelHorzCircle.addMover(mover2, &pt2, NULL);
}
break;
case 5:
- scene->_actor1._frameChange = _field1E;
- scene->_mazeDirection = scene->_actor1.changeFrame();
- scene->_actor1.setFrame(scene->_mazeDirection);
+ scene->_shuttle._frameChange = _direction;
+ scene->_mazeDirection = scene->_shuttle.changeFrame();
+ scene->_shuttle.setFrame(scene->_mazeDirection);
setDelay(1);
break;
case 6:
- scene->_actor8.setPosition(Common::Point(160, 73));
- if (_field20 == 0)
- scene->_actor8.setStrip(1);
+ scene->_tunnelVertCircle.setPosition(Common::Point(160, 73));
+ if (!_headingRightFl)
+ scene->_tunnelVertCircle.setStrip(1);
else
- scene->_actor8.setStrip(2);
- scene->_actor8.fixPriority(1);
+ scene->_tunnelVertCircle.setStrip(2);
+ scene->_tunnelVertCircle.fixPriority(1);
- scene->_actor9.setPosition(Common::Point(-160, 73));
- scene->_actor9.setStrip(9);
- scene->_actor9.fixPriority(11);
- scene->_actor9.hide();
+ scene->_tunnelHorzCircle.setPosition(Common::Point(-160, 73));
+ scene->_tunnelHorzCircle.setStrip(9);
+ scene->_tunnelHorzCircle.fixPriority(11);
+ scene->_tunnelHorzCircle.hide();
setDelay(1);
break;
case 7:
- if ((scene->_actor1._frame % 2) == 0) {
- scene->_actor1._frameChange = _field1E;
- scene->_mazeDirection = scene->_actor1.changeFrame();
- scene->_actor1.setFrame(scene->_mazeDirection);
+ if ((scene->_shuttle._frame % 2) == 0) {
+ scene->_shuttle._frameChange = _direction;
+ scene->_mazeDirection = scene->_shuttle.changeFrame();
+ scene->_shuttle.setFrame(scene->_mazeDirection);
}
setDelay(1);
break;
case 8: {
R2_GLOBALS._player.enableControl();
R2_GLOBALS._player._canWalk = false;
- scene->_field1286 = 1;
- if ((scene->_actor1._frame % 2) == 0) {
- scene->_actor1._frameChange = _field1E;
- scene->_actor1.setFrame(scene->_actor1.changeFrame());
+ scene->_directionChangesEnabled = true;
+ if ((scene->_shuttle._frame % 2) == 0) {
+ scene->_shuttle._frameChange = _direction;
+ scene->_shuttle.setFrame(scene->_shuttle.changeFrame());
}
- // All the var_8 initialization was missing in the original
+ // CHECKME: All the var_8 initialization was missing in the original
// but it's clearly a cut and paste error from case 4.
// The following code allows the switch to work properly.
- warning("Checkme: fix for dead code");
- int var_8 = (_field1E * 2 + scene->_mazeDirection);
+ int var_8 = (_direction * 2 + scene->_mazeDirection);
if (var_8 > 7)
var_8 = 1;
else if (var_8 < 1)
@@ -3203,47 +3235,47 @@ void Scene3500::Action1::signal() {
default:
break;
}
- scene->_actor5.hide();
- scene->_actor6.hide();
- _field24 = 0;
- if (_field20 == 0) {
- scene->_actor7.sub1094ED();
- if (scene->_mazeChangeAmount == scene->_field1270)
+ scene->_symbolLeft.hide();
+ scene->_symbolRight.hide();
+ _turningFl = false;
+ if (!_headingRightFl) {
+ scene->_throttle.updateSpeed();
+ if (scene->_mazeChangeAmount == scene->_speed)
scene->_aSound1.play(276);
}
break;
}
case 10: {
- scene->_fieldAF8 = 160;
+ scene->_moverVertX = 160;
Common::Point pt(160, 73);
NpcMover *mover = new NpcMover();
- scene->_actor8.addMover(mover, &pt, NULL);
+ scene->_tunnelVertCircle.addMover(mover, &pt, NULL);
- scene->_fieldB9E = 160 - (_field1E * 2 * 160);
- Common::Point pt2(scene->_fieldB9E, 73);
+ scene->_moverHorzX = 160 - (_direction * 2 * 160);
+ Common::Point pt2(scene->_moverHorzX, 73);
NpcMover *mover2 = new NpcMover();
- scene->_actor9.addMover(mover2, &pt2, this);
+ scene->_tunnelHorzCircle.addMover(mover2, &pt2, this);
_actionIndex = 6;
}
break;
case 11: {
- scene->_actor8.setStrip(2);
- scene->_actor8.setPosition(Common::Point(160, 73));
- scene->_fieldAF8 = 160 - (_field1E * 2 * 160);
- Common::Point pt(scene->_fieldAF8, 73);
+ scene->_tunnelVertCircle.setStrip(2);
+ scene->_tunnelVertCircle.setPosition(Common::Point(160, 73));
+ scene->_moverVertX = 160 - (_direction * 2 * 160);
+ Common::Point pt(scene->_moverVertX, 73);
NpcMover *mover = new NpcMover();
- scene->_actor8.addMover(mover, &pt, NULL);
- scene->_actor8.fixPriority(11);
- if (_field20 == 0)
- scene->_actor9.setStrip(1);
+ scene->_tunnelVertCircle.addMover(mover, &pt, NULL);
+ scene->_tunnelVertCircle.fixPriority(11);
+ if (!_headingRightFl)
+ scene->_tunnelHorzCircle.setStrip(1);
else
- scene->_actor9.setStrip(2);
- scene->_actor9.setPosition(Common::Point(160 - (_field1E * 2 * 160), 73));
- scene->_fieldB9E = 160;
- Common::Point pt2(scene->_fieldB9E, 73);
+ scene->_tunnelHorzCircle.setStrip(2);
+ scene->_tunnelHorzCircle.setPosition(Common::Point(160 - (_direction * 2 * 160), 73));
+ scene->_moverHorzX = 160;
+ Common::Point pt2(scene->_moverHorzX, 73);
NpcMover *mover2 = new NpcMover();
- scene->_actor9.addMover(mover2, &pt2, this);
- scene->_actor9.fixPriority(1);
+ scene->_tunnelHorzCircle.addMover(mover2, &pt2, this);
+ scene->_tunnelHorzCircle.fixPriority(1);
_actionIndex = 5;
}
break;
@@ -3265,231 +3297,24 @@ void Scene3500::Action1::dispatch() {
/*--------------------------------------------------------------------------*/
Scene3500::Action2::Action2() {
- _field1E = 0;
+ _direction = 0;
}
void Scene3500::Action2::synchronize(Serializer &s) {
Action::synchronize(s);
- s.syncAsSint16LE(_field1E);
-}
-
-/*--------------------------------------------------------------------------*/
-
-Scene3500::Item4::Item4() {
- _field34 = 0;
-}
-
-void Scene3500::Item4::synchronize(Serializer &s) {
- NamedHotspot::synchronize(s);
-
- s.syncAsSint16LE(_field34);
-}
-
-/*--------------------------------------------------------------------------*/
-
-Scene3500::Actor7::Actor7() {
- _fieldA4 = 0;
- _fieldA6 = 0;
- _fieldA8 = 0;
- _fieldAA = 0;
- _fieldAC = 0;
- _fieldAE = 0;
-}
-
-void Scene3500::Actor7::synchronize(Serializer &s) {
- SceneActor::synchronize(s);
-
- s.syncAsSint16LE(_fieldA4);
- s.syncAsSint16LE(_fieldA6);
- s.syncAsSint16LE(_fieldA8);
- s.syncAsSint16LE(_fieldAA);
- s.syncAsSint16LE(_fieldAC);
- s.syncAsSint16LE(_fieldAE);
-}
-
-void Scene3500::Actor7::sub109466(int arg1, int arg2, int arg3, int arg4, int arg5) {
- _fieldAE = 0;
- _fieldA4 = arg1;
- _fieldA6 = arg2;
- _fieldA8 = arg3;
- _fieldAA = arg4;
- _fieldAC = _fieldAA / _fieldA8;
-
- postInit();
- setup(1050, 3, 1);
- fixPriority(255);
- sub109663(arg5);
+ s.syncAsSint16LE(_direction);
}
-void Scene3500::Actor7::sub1094ED() {
+void Scene3500::Action2::handleVertButton(int direction) {
Scene3500 *scene = (Scene3500 *)R2_GLOBALS._sceneManager._scene;
- scene->_field1270 = _position.x - _fieldA4;
-}
-
-void Scene3500::Actor7::sub109663(int arg1){
- sub109693(Common::Point(_fieldA4 + arg1, _fieldA6 - (_fieldAC * arg1)));
-}
-
-void Scene3500::Actor7::sub109693(Common::Point Pt) {
- setPosition(Pt);
-}
-
-/*--------------------------------------------------------------------------*/
-
-int Scene3500::MazeUI3500::cellFromX(int x) {
- return (_cellSize.x / 2) + x - (x % _cellSize.x);
-}
-
-int Scene3500::MazeUI3500::cellFromY(int y) {
- return (_cellSize.y / 2) + y - (y % _cellSize.y) - 1;
-}
-
-int Scene3500::MazeUI3500::getCellFromMapXY(Common::Point pt) {
- int cellX = pt.x / _cellSize.x;
- int cellY = pt.y / _cellSize.y;
-
- if ((cellX >= 0) && (cellY >= 0) && (cellX < _mapCells.x) && (cellY < _mapCells.y)) {
- return (int16)READ_LE_UINT16(_mapData + (_mapCells.x * cellY + cellX) * 2);
- } else
- return -1;
-}
-
-bool Scene3500::MazeUI3500::setMazePosition2(Common::Point &p) {
- bool retVal = setMazePosition(p);
- p = _mapOffset;
-
- return retVal;
-}
-
-Scene3500::Scene3500() {
- _fieldAF8 = 0;
- _fieldB9E = 0;
- _rotation = NULL;
- _mazeChangeAmount = 0;
- _field1270 = 0;
- _field1272 = 0;
- _field1274 = 0;
- _mazeDirection = MAZEDIR_NONE;
- _field1278 = 0;
- _mazePosition.x = 0;
- _mazePosition.y = 0;
- _field127E = 0;
- _field1280 = 0;
- _field1282 = 0;
- _field1284 = 0;
- _field1286 = 0;
-}
-
-void Scene3500::synchronize(Serializer &s) {
- SceneExt::synchronize(s);
- SYNC_POINTER(_rotation);
-
- s.syncAsSint16LE(_fieldAF8);
- s.syncAsSint16LE(_fieldB9E);
- s.syncAsSint16LE(_mazeChangeAmount);
- s.syncAsSint16LE(_field1270);
- s.syncAsSint16LE(_field1272);
- s.syncAsSint16LE(_field1274);
- s.syncAsSint16LE(_mazeDirection);
- s.syncAsSint16LE(_field1278);
- s.syncAsSint16LE(_mazePosition.x);
- s.syncAsSint16LE(_mazePosition.y);
- s.syncAsSint16LE(_field127E);
- s.syncAsSint16LE(_field1280);
- s.syncAsSint16LE(_field1282);
- s.syncAsSint16LE(_field1284);
- s.syncAsSint16LE(_field1286);
-}
-
-void Scene3500::sub107F71(int arg1) {
- switch (arg1) {
- case -1:
- _actor7.sub1094ED();
- if (_field1270 != 0) {
- _field1270--;
- _actor7.sub109663(_field1270);
- }
- if (_action1._field24 != 0)
- _field1270 = 0;
- break;
- case 1:
- _actor7.sub1094ED();
- if (_field1270 < 16) {
- ++_field1270;
- _actor7.sub109663(_field1270);
- }
- if (_action1._field24 != 0)
- _field1270 = 0;
- break;
- case 88:
- if ((_action == 0) || (_action1._field24 == 0)) {
- // The original makes a second useless check on action, skipped
- _action2.sub10831F(2);
- if ((_action) && ((_action2.getActionIndex() != 0) || (_action2._field1E != 2))) {
- _action2.signal();
- } else {
- _actor9.setAction(&_action2, &_actor9, NULL);
- }
- }
- break;
- case 96:
- if ((_action) && (_action1._field24 != 0) && (_action2._field1E != 1)) {
- _field1278 = 0;
- _action1.sub108732(0);
- } else if ((_action) && (_field1278 == 0) && (_action1._field24 != 0)) {
- _field1278 = arg1;
- } else if ((_action) && (_action1._field24 == 0)) {
- _action1.sub108670(1);
- _action1.signal();
- } else if (_action == 0) {
- _action1.sub108670(1);
- setAction(&_action1, &_actor1, NULL);
- }
- break;
- case 104:
- if ((_action == 0) || (_action1._field24 == 0)) {
- _action2.sub10831F(-1);
- if ((_action) && ((_action2.getActionIndex() != 0) || (_action2._field1E != -1))) {
- _action2.signal();
- } else {
- _actor9.setAction(&_action2, &_actor9, NULL);
- }
- }
- break;
- case 112:
- if ((_action) && (_action1._field24 != 0) && (_action2._field1E != -1)) {
- _field1278 = 0;
- _action1.sub108732(0);
- } else if ((_action) && (_field1278 == 0) && (_action1._field24 != 0)) {
- _field1278 = arg1;
- } else if ((_action) && (_action1._field24 == 0)) {
- _action1.sub108670(-1);
- _action1.signal();
- } else if (_action == 0) {
- _action1.sub108670(-1);
- setAction(&_action1, &_actor1, NULL);
- }
- break;
- default:
- _field1270 = arg1;
- _actor7.sub109663(arg1);
- if (_action1._field24 != 0) {
- _field1270 = 0;
- }
- break;
- }
-}
-
-void Scene3500::Action2::sub10831F(int arg1) {
- Scene3500 *scene = (Scene3500 *)R2_GLOBALS._sceneManager._scene;
-
- _field1E = arg1;
- if (_field1E == -1)
- scene->_actor3.setFrame2(3);
+ // Directions : 2 == up, -1 == down
+ _direction = direction;
+ if (_direction == -1)
+ scene->_horizontalSpeedDisplay.setFrame2(3);
else
- scene->_actor3.setFrame2(1);
+ scene->_horizontalSpeedDisplay.setFrame2(1);
setActionIndex(0);
}
@@ -3497,57 +3322,57 @@ void Scene3500::Action2::sub10831F(int arg1) {
void Scene3500::Action2::signal() {
Scene3500 *scene = (Scene3500 *)R2_GLOBALS._sceneManager._scene;
- int si;
- int di;
+ int vertX;
+ int horzX;
switch (_actionIndex++) {
case 0: {
- if (scene->_actor8._mover) {
- si = scene->_fieldAF8;
- di = scene->_fieldB9E;
+ if (scene->_tunnelVertCircle._mover) {
+ vertX = scene->_moverVertX;
+ horzX = scene->_moverHorzX;
} else {
- scene->_fieldAF8 = scene->_actor8._position.x;
- si = scene->_fieldAF8;
- scene->_fieldB9E = scene->_actor9._position.y;
- di = scene->_fieldB9E;
+ scene->_moverVertX = scene->_tunnelVertCircle._position.x;
+ vertX = scene->_moverVertX;
+ scene->_moverHorzX = scene->_tunnelHorzCircle._position.y;
+ horzX = scene->_moverHorzX;
}
- scene->_actor8._moveDiff.y = 9 - (scene->_mazeChangeAmount / 2);
- Common::Point pt(si, 73 - (_field1E * 12));
+ scene->_tunnelVertCircle._moveDiff.y = 9 - (scene->_mazeChangeAmount / 2);
+ Common::Point pt(vertX, 73 - (_direction * 12));
NpcMover *mover = new NpcMover();
- scene->_actor8.addMover(mover, &pt, NULL);
+ scene->_tunnelVertCircle.addMover(mover, &pt, NULL);
- scene->_actor9._moveDiff.y = 9 - (scene->_mazeChangeAmount / 2);
- Common::Point pt2(di, 73 - (_field1E * 12));
+ scene->_tunnelHorzCircle._moveDiff.y = 9 - (scene->_mazeChangeAmount / 2);
+ Common::Point pt2(horzX, 73 - (_direction * 12));
NpcMover *mover2 = new NpcMover();
- scene->_actor9.addMover(mover2, &pt2, NULL);
+ scene->_tunnelHorzCircle.addMover(mover2, &pt2, NULL);
scene->_mazeChangeAmount = (scene->_mazeChangeAmount / 2) + (scene->_mazeChangeAmount % 2);
setDelay(17 - scene->_mazeChangeAmount);
}
break;
case 1: {
R2_GLOBALS._sound2.play(339);
- if (scene->_actor8._mover) {
- si = scene->_fieldAF8;
- di = scene->_fieldB9E;
+ if (scene->_tunnelVertCircle._mover) {
+ vertX = scene->_moverVertX;
+ horzX = scene->_moverHorzX;
} else {
- si = scene->_actor8._position.x;
- di = scene->_actor9._position.x;
+ vertX = scene->_tunnelVertCircle._position.x;
+ horzX = scene->_tunnelHorzCircle._position.x;
}
- scene->_actor7.sub1094ED();
+ scene->_throttle.updateSpeed();
- scene->_actor8._moveDiff.y = 9 - (scene->_mazeChangeAmount / 2);
- Common::Point pt(si, 73);
+ scene->_tunnelVertCircle._moveDiff.y = 9 - (scene->_mazeChangeAmount / 2);
+ Common::Point pt(vertX, 73);
NpcMover *mover = new NpcMover();
- scene->_actor8.addMover(mover, &pt, NULL);
+ scene->_tunnelVertCircle.addMover(mover, &pt, NULL);
- scene->_actor9._moveDiff.y = 9 - (scene->_mazeChangeAmount / 2);
- Common::Point pt2(di, 73);
+ scene->_tunnelHorzCircle._moveDiff.y = 9 - (scene->_mazeChangeAmount / 2);
+ Common::Point pt2(horzX, 73);
NpcMover *mover2 = new NpcMover();
- scene->_actor9.addMover(mover2, &pt2, NULL);
+ scene->_tunnelHorzCircle.addMover(mover2, &pt2, NULL);
- scene->_actor3.setFrame2(2);
+ scene->_horizontalSpeedDisplay.setFrame2(2);
}
break;
default:
@@ -3555,66 +3380,187 @@ void Scene3500::Action2::signal() {
}
}
-bool Scene3500::Item4::startAction(CursorType action, Event &event) {
+/*--------------------------------------------------------------------------*/
+
+Scene3500::DirectionButton::DirectionButton() {
+ _movementId = 0;
+}
+
+void Scene3500::DirectionButton::synchronize(Serializer &s) {
+ NamedHotspot::synchronize(s);
+
+ s.syncAsSint16LE(_movementId);
+}
+
+bool Scene3500::DirectionButton::startAction(CursorType action, Event &event) {
Scene3500 *scene = (Scene3500 *)R2_GLOBALS._sceneManager._scene;
- if (scene->_field1286 == 0)
+ if (!scene->_directionChangesEnabled) {
return true;
-
- if (scene->_field1286 != 4)
+ } else if (action == CURSOR_USE) {
+ R2_GLOBALS._sound2.play(14, nullptr, 63);
+ scene->doMovement(_movementId);
+ return true;
+ } else {
return SceneHotspot::startAction(action, event);
+ }
+}
- R2_GLOBALS._sound2.play(14);
- scene->sub107F71(_field34);
+/*--------------------------------------------------------------------------*/
- return true;
+Scene3500::Throttle::Throttle() {
+ _deltaX = 1;
+ _deltaY = 0;
+ _slideDeltaY = 0;
+ _deltaMouseY = 0;
}
-void Scene3500::Actor7::process(Event &event) {
+void Scene3500::Throttle::synchronize(Serializer &s) {
+ SceneActor::synchronize(s);
+
+ s.syncAsSint16LE(_pos.x);
+ s.syncAsSint16LE(_pos.y);
+ s.syncAsSint16LE(_deltaX);
+ s.syncAsSint16LE(_deltaY);
+ s.syncAsSint16LE(_slideDeltaY);
+ s.syncAsSint16LE(_deltaMouseY);
+}
+
+void Scene3500::Throttle::init(int xp, int yp, int dx, int dy, int speed) {
+ _deltaMouseY = 0;
+ _pos = Common::Point(xp, yp);
+ _deltaX = dx;
+ _deltaY = dy;
+ _slideDeltaY = _deltaY / _deltaX;
+
+ postInit();
+ setup(1050, 3, 1);
+ fixPriority(255);
+ setSpeed(speed);
+}
+
+void Scene3500::Throttle::updateSpeed() {
Scene3500 *scene = (Scene3500 *)R2_GLOBALS._sceneManager._scene;
- if (scene->_field1286 == 0)
+ scene->_speed = _position.x - _pos.x;
+}
+
+void Scene3500::Throttle::setSpeed(int arg1){
+ changePosition(Common::Point(_pos.x + arg1, _pos.y - (_slideDeltaY * arg1)));
+}
+
+void Scene3500::Throttle::changePosition(const Common::Point &pt) {
+ setPosition(pt);
+}
+
+void Scene3500::Throttle::process(Event &event) {
+ Scene3500 *scene = (Scene3500 *)R2_GLOBALS._sceneManager._scene;
+
+ if (!scene->_directionChangesEnabled)
return;
if ((event.eventType == EVENT_BUTTON_DOWN) && (R2_GLOBALS._events.getCursor() == CURSOR_USE) && (_bounds.contains(event.mousePos))) {
- _fieldAE = 1 + event.mousePos.y - _position.y;
+ _deltaMouseY = 1 + event.mousePos.y - _position.y;
event.eventType = EVENT_NONE;
}
- if ((event.eventType == EVENT_BUTTON_UP) && (_fieldAE != 0)) {
- _fieldAE = 0;
+ if ((event.eventType == EVENT_BUTTON_UP) && (_deltaMouseY != 0)) {
+ _deltaMouseY = 0;
event.handled = true;
- if (scene->_action1._field24 == 0)
- sub1094ED();
+ if (!scene->_action1._turningFl)
+ updateSpeed();
}
- if (_fieldAE == 0)
+ if (_deltaMouseY == 0)
return;
R2_GLOBALS._sound2.play(338);
event.handled = true;
- int cx = event.mousePos.y - _fieldAE + 1;
- if (_fieldA6 >= cx) {
- if (_fieldA6 - _fieldAA <= cx)
- sub109693(Common::Point(((_fieldA6 - cx) / 2) + _fieldA4 + ((_fieldA6 - cx) % 2), cx));
+ int cx = event.mousePos.y - _deltaMouseY + 1;
+ if (_pos.y >= cx) {
+ if (_pos.y - _deltaY <= cx)
+ changePosition(Common::Point(((_pos.y - cx) / 2) + _pos.x + ((_pos.y - cx) % 2), cx));
else
- sub109693(Common::Point(_fieldA4 + _fieldA8, _fieldA6 - _fieldAA));
+ changePosition(Common::Point(_pos.x + _deltaX, _pos.y - _deltaY));
} else {
- sub109693(Common::Point(_fieldA4, _fieldA6));
+ changePosition(Common::Point(_pos.x, _pos.y));
}
}
-bool Scene3500::Actor7::startAction(CursorType action, Event &event) {
+bool Scene3500::Throttle::startAction(CursorType action, Event &event) {
Scene3500 *scene = (Scene3500 *)R2_GLOBALS._sceneManager._scene;
- if (scene->_field1286 == 0)
+ if (!scene->_directionChangesEnabled) {
return true;
-
- if (scene->_field1286 == 4)
+ } else if (action == CURSOR_USE) {
return false;
+ } else {
+ return SceneActor::startAction(action, event);
+ }
+}
- return SceneActor::startAction(action, event);
+/*--------------------------------------------------------------------------*/
+
+int16 Scene3500::MazeUI3500::cellFromX(int x) {
+ return (_cellSize.x / 2) + x - (x % _cellSize.x);
+}
+
+int16 Scene3500::MazeUI3500::cellFromY(int y) {
+ return (_cellSize.y / 2) + y - (y % _cellSize.y) - 1;
+}
+
+int Scene3500::MazeUI3500::getCellFromMapXY(Common::Point pt) {
+ int cellX = pt.x / _cellSize.x;
+ int cellY = pt.y / _cellSize.y;
+
+ if ((cellX >= 0) && (cellY >= 0) && (cellX < _mapCells.x) && (cellY < _mapCells.y)) {
+ return (int16)READ_LE_UINT16(_mapData + (_mapCells.x * cellY + cellX) * 2);
+ } else
+ return -1;
+}
+
+bool Scene3500::MazeUI3500::setMazePosition2(Common::Point &p) {
+ bool retVal = setMazePosition(p);
+ p = _mapOffset;
+
+ return retVal;
+}
+
+/*--------------------------------------------------------------------------*/
+
+Scene3500::Scene3500() {
+ _moverVertX = 0;
+ _moverHorzX = 0;
+ _rotation = NULL;
+ _mazeChangeAmount = 0;
+ _speed = 0;
+ _updateIdxChangeFl = false;
+ _mazeDirection = MAZEDIR_NONE;
+ _nextMove = 0;
+ _mazePosition.x = 0;
+ _mazePosition.y = 0;
+ _postFixupFl = true; // Set to true in fixup()
+ _exitCounter = 0;
+ _directionChangesEnabled = false;
+}
+
+void Scene3500::synchronize(Serializer &s) {
+ SceneExt::synchronize(s);
+ SYNC_POINTER(_rotation);
+
+ s.syncAsSint16LE(_moverVertX);
+ s.syncAsSint16LE(_moverHorzX);
+ s.syncAsSint16LE(_mazeChangeAmount);
+ s.syncAsSint16LE(_speed);
+ s.syncAsSint16LE(_updateIdxChangeFl);
+ s.syncAsSint16LE(_mazeDirection);
+ s.syncAsSint16LE(_nextMove);
+ s.syncAsSint16LE(_mazePosition.x);
+ s.syncAsSint16LE(_mazePosition.y);
+ s.syncAsSint16LE(_postFixupFl);
+ s.syncAsSint16LE(_exitCounter);
+ s.syncAsSint16LE(_directionChangesEnabled);
}
void Scene3500::postInit(SceneObjectList *OwnerList) {
@@ -3622,19 +3568,18 @@ void Scene3500::postInit(SceneObjectList *OwnerList) {
loadScene(1050);
R2_GLOBALS._uiElements._active = false;
- R2_GLOBALS._interfaceY = 200;
+ R2_GLOBALS._interfaceY = SCREEN_HEIGHT;
- R2_GLOBALS._v5589E.set(0, 0, 320, 200);
R2_GLOBALS._sound1.play(305);
R2_GLOBALS._player._characterIndex = R2_QUINN;
R2_GLOBALS._player._characterScene[R2_QUINN] = 3500;
R2_GLOBALS._player._characterScene[R2_SEEKER] = 3500;
R2_GLOBALS._player._characterScene[R2_MIRANDA] = 3500;
- _field1284 = 0;
- _field1282 = 0;
- _field1278 = 0;
- _field1272 = 1;
- _field1270 = 4;
+ _exitCounter = 0;
+ _postFixupFl = false;
+ _nextMove = 0;
+ _updateIdxChangeFl = true;
+ _speed = 4;
_mazeChangeAmount = 4;
_mazePosition = Common::Point(860, 891);
_rotation = R2_GLOBALS._scenePalette.addRotation(240, 254, -1);
@@ -3658,78 +3603,78 @@ void Scene3500::postInit(SceneObjectList *OwnerList) {
R2_GLOBALS._scenePalette._palette[(3 * i) + 2] = tmpPal[(3 * i) + 2];
}
- _actor7.sub109466(38, 165, 16, 32, _field1270);
- _actor7.setDetails(3500, 6, 7, -1, 1, (SceneItem *)NULL);
+ _throttle.init(38, 165, 16, 32, _speed);
+ _throttle.setDetails(3500, 6, 7, -1, 1, (SceneItem *)NULL);
R2_GLOBALS._sound1.play(276);
- _item4._field34 = 88;
- _item4.setDetails(88, 3500, 18, 10, -1);
+ _pitchDown._movementId = 88;
+ _pitchDown.setDetails(88, 3500, 18, 10, -1);
- _item5._field34 = 112;
- _item5.setDetails(112, 3500, 9, 10, -1);
+ _turnLeft._movementId = 112;
+ _turnLeft.setDetails(112, 3500, 9, 10, -1);
- _item6._field34 = 104;
- _item6.setDetails(104, 3500, 15, 10, -1);
+ _pitchUp._movementId = 104;
+ _pitchUp.setDetails(104, 3500, 15, 10, -1);
- _item7._field34 = 96;
- _item7.setDetails(96, 3500, 12, 10, -1);
+ _turnRight._movementId = 96;
+ _turnRight.setDetails(96, 3500, 12, 10, -1);
- _actor8.postInit();
- _actor8.setup(1050, 1, 1);
- _actor8.setPosition(Common::Point(160, 73));
- _actor8.fixPriority(1);
+ _tunnelVertCircle.postInit();
+ _tunnelVertCircle.setup(1050, 1, 1);
+ _tunnelVertCircle.setPosition(Common::Point(160, 73));
+ _tunnelVertCircle.fixPriority(1);
- _actor9.postInit();
- _actor9.setup(1050, 2, 1);
- _actor9.setPosition(Common::Point(-160, 73));
- _actor9.fixPriority(11);
- _actor9.hide();
+ _tunnelHorzCircle.postInit();
+ _tunnelHorzCircle.setup(1050, 2, 1);
+ _tunnelHorzCircle.setPosition(Common::Point(-160, 73));
+ _tunnelHorzCircle.fixPriority(11);
+ _tunnelHorzCircle.hide();
- _item2.setDetails(27, 3500, 21, -1, -1);
- _item3.setDetails(Rect(160, 89, 299, 182), 3500, 3, -1, -1, 1, NULL);
- _item1.setDetails(Rect(0, 0, 320, 200), 3500, 0, -1, 2, 1, NULL);
+ _outsideView.setDetails(27, 3500, 21, -1, -1);
+ _mapScreen.setDetails(Rect(160, 89, 299, 182), 3500, 3, -1, -1, 1, NULL);
+ _background.setDetails(Rect(0, 0, 320, 200), 3500, 0, -1, 2, 1, NULL);
- _actor1.postInit();
+ _shuttle.postInit();
_mazeDirection = MAZEDIR_NORTH;
- _actor1.setup(1004, 1, _mazeDirection);
- _actor1.setPosition(Common::Point(230, 135));
- _actor1.fixPriority(200);
- _actor1._frameChange = 1;
-
- _actor5.postInit();
- _actor5.setup(1004, 3, 1);
- _actor5.setPosition(Common::Point(117, 163));
- _actor5.fixPriority(200);
- _actor5.hide();
-
- _actor4.postInit();
- _actor4.setup(1004, 3, 2);
- _actor4.setPosition(Common::Point(126, 163));
- _actor4.fixPriority(200);
-
- _actor6.postInit();
- _actor6.setup(1004, 3, 3);
- _actor6.setPosition(Common::Point(135, 163));
- _actor6.fixPriority(200);
- _actor6.hide();
-
- _actor2.postInit();
- _actor2.setup(1004, 4, _mazeChangeAmount + 1);
- _actor2.setPosition(Common::Point(126, 137));
- _actor2.fixPriority(200);
-
- _actor3.postInit();
- _actor3.setup(1004, 5, 2);
- _actor3.setPosition(Common::Point(126, 108));
- _actor3.fixPriority(200);
+ _shuttle.setup(1004, 1, _mazeDirection);
+ _shuttle.setPosition(Common::Point(230, 135));
+ _shuttle.fixPriority(200);
+ _shuttle._frameChange = 1;
+
+ _symbolLeft.postInit();
+ _symbolLeft.setup(1004, 3, 1);
+ _symbolLeft.setPosition(Common::Point(117, 163));
+ _symbolLeft.fixPriority(200);
+ _symbolLeft.hide();
+
+ _symbolVertical.postInit();
+ _symbolVertical.setup(1004, 3, 2);
+ _symbolVertical.setPosition(Common::Point(126, 163));
+ _symbolVertical.fixPriority(200);
+
+ _symbolRight.postInit();
+ _symbolRight.setup(1004, 3, 3);
+ _symbolRight.setPosition(Common::Point(135, 163));
+ _symbolRight.fixPriority(200);
+ _symbolRight.hide();
+
+ _verticalSpeedDisplay.postInit();
+ _verticalSpeedDisplay.setup(1004, 4, _mazeChangeAmount + 1);
+ _verticalSpeedDisplay.setPosition(Common::Point(126, 137));
+ _verticalSpeedDisplay.fixPriority(200);
+
+ _horizontalSpeedDisplay.postInit();
+ _horizontalSpeedDisplay.setup(1004, 5, 2);
+ _horizontalSpeedDisplay.setPosition(Common::Point(126, 108));
+ _horizontalSpeedDisplay.fixPriority(200);
_mazeUI.setDisplayBounds(Rect(160, 89, 299, 182));
_mazeUI.load(2);
_mazeUI.setMazePosition(_mazePosition);
- _action1._field24 = 0;
+ _action1._turningFl = false;
_mazeUI.draw();
- _field1286 = 1;
+ _directionChangesEnabled = true;
R2_GLOBALS._player.postInit();
R2_GLOBALS._player.hide();
@@ -3738,6 +3683,99 @@ void Scene3500::postInit(SceneObjectList *OwnerList) {
R2_GLOBALS._player._canWalk = false;
}
+void Scene3500::doMovement(int id) {
+ switch (id) {
+ case -1:
+ _throttle.updateSpeed();
+ if (_speed != 0) {
+ _speed--;
+ _throttle.setSpeed(_speed);
+ }
+ if (_action1._turningFl)
+ _speed = 0;
+ break;
+ case 1:
+ _throttle.updateSpeed();
+ if (_speed < 16) {
+ ++_speed;
+ _throttle.setSpeed(_speed);
+ }
+ if (_action1._turningFl)
+ _speed = 0;
+ break;
+ case 88:
+ // Up button has been pressed
+ // The original was doing a double check on action, only one is here.
+ if (!_action || (!_action1._turningFl)) {
+ _action2.handleVertButton(2);
+ if (_action && ((_action2.getActionIndex() != 0) || (_action2._direction != 2))) {
+ _action2.signal();
+ } else {
+ _tunnelHorzCircle.setAction(&_action2, &_tunnelHorzCircle, NULL);
+ }
+ }
+ break;
+ case 96:
+ // Right button has been pressed
+ if (!_action || !_action1._turningFl || (_action1._direction == 1)) {
+ if (_action && (_nextMove == 0) && (_action1._turningFl)) {
+ _nextMove = id;
+ } else if (_action && (!_action1._turningFl)) {
+ _action1.handleHorzButton(1);
+ _action1.signal();
+ } else if (!_action) {
+ _action1.handleHorzButton(1);
+ setAction(&_action1, &_shuttle, NULL);
+ }
+
+ } else {
+ if (_nextMove != 0)
+ _nextMove = 0;
+
+ _action1.turnShuttle(false);
+ }
+ break;
+ case 104:
+ // Down button has been pressed
+ if (!_action || (!_action1._turningFl)) {
+ _action2.handleVertButton(-1);
+ if ((_action) && ((_action2.getActionIndex() != 0) || (_action2._direction != -1))) {
+ _action2.signal();
+ } else {
+ _tunnelHorzCircle.setAction(&_action2, &_tunnelHorzCircle, NULL);
+ }
+ }
+ break;
+ case 112:
+ // Left button has been pressed
+ if (!_action || !_action1._turningFl || (_action1._direction == 1)) {
+ if (_action && (_nextMove == 0) && (_action1._turningFl)) {
+ _nextMove = id;
+ } else if (_action && (!_action1._turningFl)) {
+ _action1.handleHorzButton(-1);
+ _action1.signal();
+ } else if (!_action) {
+ _action1.handleHorzButton(-1);
+ setAction(&_action1, &_shuttle, NULL);
+ }
+
+ } else {
+ if (_nextMove != 0)
+ _nextMove = 0;
+
+ _action1.turnShuttle(false);
+ }
+ break;
+ default:
+ _speed = id;
+ _throttle.setSpeed(id);
+ if (_action1._turningFl) {
+ _speed = 0;
+ }
+ break;
+ }
+}
+
void Scene3500::remove() {
R2_GLOBALS._sound2.fadeOut2(NULL);
SceneExt::remove();
@@ -3746,69 +3784,69 @@ void Scene3500::remove() {
void Scene3500::signal() {
R2_GLOBALS._player.enableControl(CURSOR_USE);
R2_GLOBALS._player._canWalk = false;
- _field1286 = 1;
+ _directionChangesEnabled = true;
}
void Scene3500::process(Event &event) {
- if (_field1286 == 0)
+ if (!_directionChangesEnabled)
return;
if (event.eventType == EVENT_KEYPRESS) {
switch (event.kbd.keycode) {
case Common::KEYCODE_KP7:
R2_GLOBALS._sound2.play(338);
- sub107F71(16);
+ doMovement(16);
event.handled = true;
break;
case Common::KEYCODE_UP:
case Common::KEYCODE_KP8:
R2_GLOBALS._sound2.play(14, NULL, 63);
- sub107F71(88);
+ doMovement(88);
event.handled = true;
break;
case Common::KEYCODE_KP9:
- if (_field1270 < 16)
+ if (_speed < 16)
R2_GLOBALS._sound2.play(338);
- sub107F71(1);
+ doMovement(1);
event.handled = true;
break;
case Common::KEYCODE_KP4:
case Common::KEYCODE_LEFT:
R2_GLOBALS._sound2.play(14, NULL, 63);
- sub107F71(112);
+ doMovement(112);
event.handled = true;
break;
case Common::KEYCODE_KP6:
case Common::KEYCODE_RIGHT:
R2_GLOBALS._sound2.play(14, NULL, 63);
- sub107F71(96);
+ doMovement(96);
event.handled = true;
break;
case Common::KEYCODE_KP1:
R2_GLOBALS._sound2.play(338);
- sub107F71(0);
+ doMovement(0);
event.handled = true;
break;
case Common::KEYCODE_KP2:
case Common::KEYCODE_DOWN:
R2_GLOBALS._sound2.play(14, NULL, 63);
- sub107F71(104);
+ doMovement(104);
event.handled = true;
break;
case Common::KEYCODE_KP3:
- if (_field1270 != 0)
+ if (_speed != 0)
R2_GLOBALS._sound2.play(338);
- sub107F71(-1);
+ doMovement(-1);
event.handled = true;
break;
case Common::KEYCODE_KP0:
R2_GLOBALS._sound2.play(338);
- sub107F71(8);
+ doMovement(8);
event.handled = true;
break;
case Common::KEYCODE_KP_PERIOD:
R2_GLOBALS._sound2.play(338);
- sub107F71(4);
+ doMovement(4);
event.handled = true;
break;
default:
@@ -3817,19 +3855,19 @@ void Scene3500::process(Event &event) {
}
if (!event.handled)
- _actor7.process(event);
+ _throttle.process(event);
if (!event.handled)
- _item4.process(event);
+ _pitchDown.process(event);
if (!event.handled)
- _item5.process(event);
+ _turnLeft.process(event);
if (!event.handled)
- _item6.process(event);
+ _pitchUp.process(event);
if (!event.handled)
- _item7.process(event);
+ _turnRight.process(event);
Scene::process(event);
}
@@ -3838,104 +3876,103 @@ void Scene3500::dispatch() {
Rect tmpRect;
Scene::dispatch();
- if (((_actor1._frame % 2) == 0) && (_action1._field24 == 0)) {
- _actor1.setFrame(_actor1.changeFrame());
- _mazeDirection = _actor1._frame;
+ if (((_shuttle._frame % 2) == 0) && (!_action1._turningFl)) {
+ _shuttle.setFrame(_shuttle.changeFrame());
+ _mazeDirection = _shuttle._frame;
}
- int oldField1278;
- if ((_field1278 != 0) && (_action1._field24 == 0)) {
- oldField1278 = _field1278;
- _field1278 = 0;
- sub107F71(oldField1278);
+
+ if ((_nextMove != 0) && (!_action1._turningFl)) {
+ int move = _nextMove;
+ _nextMove = 0;
+ doMovement(move);
}
if (!_rotation)
return;
- int newMazeX = 0;
- int newMazeY = 0;
- int var_4 = 0;
- int var_6 = 0;
- int var_8 = 0;
- int var_a = 0;
- int dx = 0;
+ int16 newMazeX = 0;
+ int16 newMazeY = 0;
+ int16 mazePosX = 0;
+ int16 mazePosY = 0;
+ int deltaX = 0;
+ int deltaY = 0;
int cellId = 0;
- if ((_mazeChangeAmount == 0) && (_field1282 == 0)) {
- if (_field1284 == 2)
+ if ((_mazeChangeAmount == 0) && !_postFixupFl) {
+ if (_exitCounter == 2)
R2_GLOBALS._sceneManager.changeScene(1000);
} else {
- _field1282 = 0;
+ _postFixupFl = false;
tmpRect.set(160, 89, 299, 182);
newMazeX = _mazePosition.x;
newMazeY = _mazePosition.y;
- var_4 = _mazeUI.cellFromX(newMazeX + 70) - 70;
- var_6 = _mazeUI.cellFromY(_mazePosition.y + 46) - 46;
- var_8 = abs(var_4 - newMazeX);
- var_a = abs(var_6 - newMazeY);
- dx = 0;
+ mazePosX = _mazeUI.cellFromX(newMazeX + 70) - 70;
+ mazePosY = _mazeUI.cellFromY(_mazePosition.y + 46) - 46;
+ deltaX = abs(mazePosX - newMazeX);
+ deltaY = abs(mazePosY - newMazeY);
+ int tmpCellId = 0;
switch (_mazeDirection) {
case MAZEDIR_NORTH:
cellId = _mazeUI.getCellFromMapXY(Common::Point(newMazeX + 70, newMazeY + 46));
if (((cellId == 2) || (cellId == 3) || (cellId == 6) || (cellId == 1)) ||
- ((cellId == 25 || cellId == 26 || cellId == 5 || cellId == 14 || cellId == 15) && var_8 > 3)) {
+ ((cellId == 25 || cellId == 26 || cellId == 5 || cellId == 14 || cellId == 15) && deltaX > 3)) {
R2_GLOBALS._sound2.play(339);
_rotation->_idxChange = 0;
- _field1270 = 0;
+ _speed = 0;
_mazeChangeAmount = 0;
- _field1272 = 0;
- if (_action1._field24 == 0)
- _actor8.hide();
+ _updateIdxChangeFl = false;
+ if (!_action1._turningFl)
+ _tunnelVertCircle.hide();
} else {
- var_6 = _mazeUI.cellFromY(newMazeY + 46) - 46;
+ mazePosY = _mazeUI.cellFromY(newMazeY + 46) - 46;
newMazeY = _mazePosition.y - _mazeChangeAmount;
- dx = _mazeUI.getCellFromMapXY(Common::Point(newMazeX + 70, newMazeY + 46));
- if (((cellId == 23) || (cellId == 24) || (cellId == 4)) && (cellId != dx)) {
- newMazeY = var_6;
+ tmpCellId = _mazeUI.getCellFromMapXY(Common::Point(newMazeX + 70, newMazeY + 46));
+ if (((cellId == 23) || (cellId == 24) || (cellId == 4)) && (cellId != tmpCellId)) {
+ newMazeY = mazePosY;
R2_GLOBALS._sound2.play(339);
_rotation->_idxChange = 0;
- _field1270 = 0;
+ _speed = 0;
_mazeChangeAmount = 0;
- _field1272 = 0;
- if (_action1._field24 == 0)
- _actor8.hide();
- } else if ((cellId == 11) && (cellId != dx)) {
- newMazeY = var_6 + 3;
+ _updateIdxChangeFl = false;
+ if (!_action1._turningFl)
+ _tunnelVertCircle.hide();
+ } else if ((cellId == 11) && (cellId != tmpCellId)) {
+ newMazeY = mazePosY + 3;
R2_GLOBALS._sound2.play(339);
_rotation->_idxChange = 0;
- _field1270 = 0;
+ _speed = 0;
_mazeChangeAmount = 0;
- _field1272 = 0;
- if (_action1._field24 == 0)
- _actor8.hide();
+ _updateIdxChangeFl = false;
+ if (!_action1._turningFl)
+ _tunnelVertCircle.hide();
} else {
- var_6 = _mazeUI.cellFromY(newMazeY + 46) - 46;
- var_a = abs(var_6 - newMazeY);
+ mazePosY = _mazeUI.cellFromY(newMazeY + 46) - 46;
+ deltaY = abs(mazePosY - newMazeY);
cellId = _mazeUI.getCellFromMapXY(Common::Point(newMazeX + 70, newMazeY + 46));
- if ( (((cellId == 23) || (cellId == 24) || (cellId == 4)) && (newMazeY <= var_6) && (_mazePosition.y>= var_6))
- || (((cellId == 25) || (cellId == 26) || (cellId == 5) || (cellId == 14) || (cellId == 15)) && (_mazeChangeAmount >= var_a) && (_mazeChangeAmount > 3) && (_action1._field24 != 0)) ) {
- newMazeY = var_6;
- if ((cellId != 25) && (cellId != 26) && (cellId != 5) && (cellId != 14) && (cellId == 15))
+ if ( (((cellId == 23) || (cellId == 24) || (cellId == 4)) && (newMazeY <= mazePosY) && (_mazePosition.y>= mazePosY))
+ || (((cellId == 25) || (cellId == 26) || (cellId == 5) || (cellId == 14) || (cellId == 15)) && (_mazeChangeAmount >= deltaY) && (_mazeChangeAmount > 3) && (_action1._turningFl != 0)) ) {
+ newMazeY = mazePosY;
+ if ((cellId != 25) && (cellId != 26) && (cellId != 5) && (cellId != 14) && (cellId != 15))
R2_GLOBALS._sound2.play(339);
_rotation->_idxChange = 0;
- _field1270 = 0;
+ _speed = 0;
_mazeChangeAmount = 0;
- _field1272 = 0;
- if (_action1._field24 == 0)
- _actor8.hide();
- } else if ((cellId == 11) && (var_6 + 3 >= newMazeY) && (_mazePosition.y >= var_6 + 3)) {
+ _updateIdxChangeFl = false;
+ if (!_action1._turningFl)
+ _tunnelVertCircle.hide();
+ } else if ((cellId == 11) && (mazePosY + 3 >= newMazeY) && (_mazePosition.y >= mazePosY + 3)) {
R2_GLOBALS._sound2.play(339);
_rotation->_idxChange = 0;
- _field1270 = 0;
+ _speed = 0;
_mazeChangeAmount = 0;
- _field1272 = 0;
- if (_action1._field24 == 0)
- _actor8.hide();
- } else if (((cellId == 25) || (cellId == 26) || (cellId == 5) || (cellId == 14) || (cellId == 15)) && (var_8 != 0) && (var_8 <= 3)) {
- newMazeX = var_4;
+ _updateIdxChangeFl = false;
+ if (!_action1._turningFl)
+ _tunnelVertCircle.hide();
+ } else if (((cellId == 25) || (cellId == 26) || (cellId == 5) || (cellId == 14) || (cellId == 15)) && (deltaX != 0) && (deltaX <= 3)) {
+ newMazeX = mazePosX;
R2_GLOBALS._sound2.play(339);
} else {
// Nothing
@@ -3946,62 +3983,62 @@ void Scene3500::dispatch() {
case MAZEDIR_EAST:
cellId = _mazeUI.getCellFromMapXY(Common::Point(newMazeX + 70, newMazeY + 46));
if ( ((cellId == 12) || (cellId == 13) || (cellId == 11) || (cellId == 16) || (cellId == 31))
- || (((cellId == 25) || (cellId == 23) || (cellId == 14) || (cellId == 5) || (cellId == 4)) && (var_a > 3)) ) {
+ || (((cellId == 25) || (cellId == 23) || (cellId == 14) || (cellId == 5) || (cellId == 4)) && (deltaY > 3)) ) {
R2_GLOBALS._sound2.play(339);
_rotation->_idxChange = 0;
- _field1270 = 0;
+ _speed = 0;
_mazeChangeAmount = 0;
- _field1272 = 0;
- if (_action1._field24 == 0)
- _actor8.hide();
+ _updateIdxChangeFl = false;
+ if (!_action1._turningFl)
+ _tunnelVertCircle.hide();
} else {
- var_4 = _mazeUI.cellFromX(newMazeX + 70) - 70;
+ mazePosX = _mazeUI.cellFromX(newMazeX + 70) - 70;
newMazeX = _mazePosition.x + _mazeChangeAmount;
- dx = _mazeUI.getCellFromMapXY(Common::Point(newMazeX + 70, newMazeY + 46));
- if (((cellId == 26) || (cellId == 24) || (cellId == 15)) && (cellId != dx)) {
- newMazeX = var_4;
+ tmpCellId = _mazeUI.getCellFromMapXY(Common::Point(newMazeX + 70, newMazeY + 46));
+ if (((cellId == 26) || (cellId == 24) || (cellId == 15)) && (cellId != tmpCellId)) {
+ newMazeX = mazePosX;
R2_GLOBALS._sound2.play(339);
_rotation->_idxChange = 0;
- _field1270 = 0;
+ _speed = 0;
_mazeChangeAmount = 0;
- _field1272 = 0;
- if (_action1._field24 == 0)
- _actor8.hide();
- } else if ((cellId == 6) && (cellId != dx)) {
- newMazeX = var_4 - 5;
+ _updateIdxChangeFl = false;
+ if (!_action1._turningFl)
+ _tunnelVertCircle.hide();
+ } else if ((cellId == 6) && (cellId != tmpCellId)) {
+ newMazeX = mazePosX - 5;
R2_GLOBALS._sound2.play(339);
_rotation->_idxChange = 0;
- _field1270 = 0;
+ _speed = 0;
_mazeChangeAmount = 0;
- _field1272 = 0;
- if (_action1._field24 == 0)
- _actor8.hide();
+ _updateIdxChangeFl = false;
+ if (!_action1._turningFl)
+ _tunnelVertCircle.hide();
} else {
- var_4 = _mazeUI.cellFromX(newMazeX + 70) - 70;
- var_8 = abs(newMazeX - var_4);
+ mazePosX = _mazeUI.cellFromX(newMazeX + 70) - 70;
+ deltaX = abs(newMazeX - mazePosX);
cellId = _mazeUI.getCellFromMapXY(Common::Point(newMazeX + 70, newMazeY + 46));
- if ( (((cellId == 26) || (cellId == 24) || (cellId == 15)) && (newMazeX >= var_4) && (_mazePosition.x <= var_4))
- || (((cellId == 25) || (cellId == 23) || (cellId == 14) || (cellId == 5) || (cellId == 4)) && (_mazeChangeAmount >= var_8) && (_mazeChangeAmount <= 3) && (_action1._field24 != 0)) ) {
- newMazeX = var_4;
+ if ( (((cellId == 26) || (cellId == 24) || (cellId == 15)) && (newMazeX >= mazePosX) && (_mazePosition.x <= mazePosX))
+ || (((cellId == 25) || (cellId == 23) || (cellId == 14) || (cellId == 5) || (cellId == 4)) && (_mazeChangeAmount >= deltaX) && (_mazeChangeAmount <= 3) && (_action1._turningFl != 0)) ) {
+ newMazeX = mazePosX;
if ((cellId == 25) || (cellId == 23) || (cellId == 14) || (cellId == 5) || (cellId == 4))
R2_GLOBALS._sound2.play(339);
_rotation->_idxChange = 0;
- _field1270 = 0;
+ _speed = 0;
_mazeChangeAmount = 0;
- _field1272 = 0;
- if (_action1._field24 == 0)
- _actor8.hide();
- } else if ((cellId == 6) && (var_4 - 5 <= newMazeX) && (_mazePosition.x <= var_4 - 5)) {
- newMazeX = var_4 - 5;
+ _updateIdxChangeFl = false;
+ if (!_action1._turningFl)
+ _tunnelVertCircle.hide();
+ } else if ((cellId == 6) && (mazePosX - 5 <= newMazeX) && (_mazePosition.x <= mazePosX - 5)) {
+ newMazeX = mazePosX - 5;
R2_GLOBALS._sound2.play(339);
_rotation->_idxChange = 0;
- _field1270 = 0;
+ _speed = 0;
_mazeChangeAmount = 0;
- _field1272 = 0;
- if (_action1._field24 == 0)
- _actor8.hide();
- } else if (((cellId == 25) || (cellId == 23) || (cellId == 14) || (cellId == 5) || (cellId == 4)) && (var_a != 0) && (var_a <= 3)) {
- newMazeY = var_6;
+ _updateIdxChangeFl = false;
+ if (!_action1._turningFl)
+ _tunnelVertCircle.hide();
+ } else if (((cellId == 25) || (cellId == 23) || (cellId == 14) || (cellId == 5) || (cellId == 4)) && (deltaY != 0) && (deltaY <= 3)) {
+ newMazeY = mazePosY;
R2_GLOBALS._sound2.play(339);
} else {
// Nothing
@@ -4012,84 +4049,84 @@ void Scene3500::dispatch() {
case MAZEDIR_SOUTH:
cellId = _mazeUI.getCellFromMapXY(Common::Point(newMazeX + 70, newMazeY + 46));
if ( ((cellId == 2) || (cellId == 3) || (cellId == 6) || (cellId == 1))
- || (((cellId == 23) || (cellId == 24) || (cellId == 4) || (cellId == 14) || (cellId == 15)) && (var_8 > 3)) ) {
+ || (((cellId == 23) || (cellId == 24) || (cellId == 4) || (cellId == 14) || (cellId == 15)) && (deltaX > 3)) ) {
R2_GLOBALS._sound2.play(339);
_rotation->_idxChange = 0;
- _field1270 = 0;
+ _speed = 0;
_mazeChangeAmount = 0;
- _field1272 = 0;
- if (_action1._field24 == 0)
- _actor8.hide();
+ _updateIdxChangeFl = false;
+ if (!_action1._turningFl)
+ _tunnelVertCircle.hide();
} else {
- var_6 = _mazeUI.cellFromY(newMazeY + 46) - 46;
+ mazePosY = _mazeUI.cellFromY(newMazeY + 46) - 46;
newMazeY = _mazePosition.y + _mazeChangeAmount;
- dx = _mazeUI.getCellFromMapXY(Common::Point(newMazeX + 70, newMazeY + 46));
+ tmpCellId = _mazeUI.getCellFromMapXY(Common::Point(newMazeX + 70, newMazeY + 46));
- if (((cellId == 25) || (cellId == 26) || (cellId == 5)) && (cellId != dx)) {
+ if (((cellId == 25) || (cellId == 26) || (cellId == 5)) && (cellId != tmpCellId)) {
R2_GLOBALS._sound2.play(339);
_rotation->_idxChange = 0;
- _field1270 = 0;
+ _speed = 0;
_mazeChangeAmount = 0;
- _field1272 = 0;
- if (_action1._field24 == 0)
- _actor8.hide();
- } else if ((cellId == 16) && (cellId != dx)) {
- newMazeY = var_6 - 3;
+ _updateIdxChangeFl = false;
+ if (!_action1._turningFl)
+ _tunnelVertCircle.hide();
+ } else if ((cellId == 16) && (cellId != tmpCellId)) {
+ newMazeY = mazePosY - 3;
R2_GLOBALS._sound2.play(339);
_rotation->_idxChange = 0;
- _field1270 = 0;
+ _speed = 0;
_mazeChangeAmount = 0;
- _field1272 = 0;
- if (_action1._field24 == 0)
- _actor8.hide();
- } else if ((cellId == 31) && (cellId != dx)) {
- newMazeY = var_6 + 4;
+ _updateIdxChangeFl = false;
+ if (!_action1._turningFl)
+ _tunnelVertCircle.hide();
+ } else if ((cellId == 31) && (cellId != tmpCellId)) {
+ newMazeY = mazePosY + 4;
R2_GLOBALS._sound2.play(339);
_rotation->_idxChange = 0;
- _field1270 = 0;
+ _speed = 0;
_mazeChangeAmount = 0;
- _field1272 = 0;
- if (_action1._field24 == 0)
- _actor8.hide();
+ _updateIdxChangeFl = false;
+ if (!_action1._turningFl)
+ _tunnelVertCircle.hide();
} else {
- var_6 = _mazeUI.cellFromY(newMazeY + 46) - 46;
- var_a = abs(newMazeY - var_6);
+ mazePosY = _mazeUI.cellFromY(newMazeY + 46) - 46;
+ deltaY = abs(newMazeY - mazePosY);
cellId = _mazeUI.getCellFromMapXY(Common::Point(newMazeX + 70, newMazeY + 46));
- if ( (((cellId == 25) || (cellId == 26) || (cellId == 5)) && (newMazeY >= var_6) && (_mazePosition.y <= var_6))
- || (((cellId == 23) || (cellId == 24) || (cellId == 4) || (cellId == 14) || (cellId == 15)) && (_mazeChangeAmount >= var_a) && (_mazeChangeAmount <= 3) && (_action1._field24 != 0)) ){
- newMazeY = var_6;
+ if ( (((cellId == 25) || (cellId == 26) || (cellId == 5)) && (newMazeY >= mazePosY) && (_mazePosition.y <= mazePosY))
+ || (((cellId == 23) || (cellId == 24) || (cellId == 4) || (cellId == 14) || (cellId == 15)) && (_mazeChangeAmount >= deltaY) && (_mazeChangeAmount <= 3) && (_action1._turningFl != 0)) ){
+ newMazeY = mazePosY;
if ((cellId != 23) && (cellId != 24) && (cellId != 4) && (cellId != 14) && (cellId != 15))
R2_GLOBALS._sound2.play(339);
_rotation->_idxChange = 0;
- _field1270 = 0;
+ _speed = 0;
_mazeChangeAmount = 0;
- _field1272 = 0;
- if (_action1._field24 == 0)
- _actor8.hide();
- } else if ((cellId == 16) && (var_6 - 3 <= newMazeY) && (_mazePosition.y <= var_6 - 3)) {
- newMazeY = var_6 - 3;
+ _updateIdxChangeFl = false;
+ if (!_action1._turningFl)
+ _tunnelVertCircle.hide();
+ } else if ((cellId == 16) && (mazePosY - 3 <= newMazeY) && (_mazePosition.y <= mazePosY - 3)) {
+ newMazeY = mazePosY - 3;
R2_GLOBALS._sound2.play(339);
_rotation->_idxChange = 0;
- _field1270 = 0;
+ _speed = 0;
_mazeChangeAmount = 0;
- _field1272 = 0;
- if (_action1._field24 == 0)
- _actor8.hide();
- } else if ((cellId == 31) && (var_6 + 4 <= newMazeY) && (_mazePosition.y <= var_6 + 4)) {
- newMazeY = var_6 + 4;
+ _updateIdxChangeFl = false;
+ if (!_action1._turningFl)
+ _tunnelVertCircle.hide();
+ } else if ((cellId == 31) && (mazePosY + 4 <= newMazeY) && (_mazePosition.y <= mazePosY + 4)) {
+ newMazeY = mazePosY + 4;
_rotation->_idxChange = 0;
- _field1270 = 0;
+ _speed = 0;
_mazeChangeAmount = 0;
- _field1272 = 0;
- if (_action1._field24 == 0)
- _actor8.hide();
+ _updateIdxChangeFl = false;
+ if (!_action1._turningFl)
+ _tunnelVertCircle.hide();
if ((newMazeX == 660) && (_mazeChangeAmount + 306 <= newMazeY) && (newMazeY <= 307))
- ++_field1284;
+ ++_exitCounter;
else
R2_GLOBALS._sound2.play(339);
- } else if (((cellId == 23) || (cellId == 24) || (cellId == 4) || (cellId == 14) || (cellId == 15)) && (var_8 != 0) && (var_8 <= 3)) {
- newMazeX = var_4;
+ } else if (((cellId == 23) || (cellId == 24) || (cellId == 4) || (cellId == 14) || (cellId == 15)) && (deltaX != 0) && (deltaX <= 3)) {
+ newMazeX = mazePosX;
R2_GLOBALS._sound2.play(339);
} else {
// Nothing
@@ -4100,62 +4137,62 @@ void Scene3500::dispatch() {
case MAZEDIR_WEST:
cellId = _mazeUI.getCellFromMapXY(Common::Point(newMazeX + 70, newMazeY + 46));
if ( ((cellId == 12) || (cellId == 13) || (cellId == 11) || (cellId == 16) || (cellId == 31))
- || (((cellId == 26) || (cellId == 24) || (cellId == 15) || (cellId == 5) || (cellId == 4)) && (var_a > 3)) ) {
+ || (((cellId == 26) || (cellId == 24) || (cellId == 15) || (cellId == 5) || (cellId == 4)) && (deltaY > 3)) ) {
R2_GLOBALS._sound2.play(339);
_rotation->_idxChange = 0;
- _field1270 = 0;
+ _speed = 0;
_mazeChangeAmount = 0;
- _field1272 = 0;
- if (_action1._field24 == 0)
- _actor8.hide();
+ _updateIdxChangeFl = false;
+ if (!_action1._turningFl)
+ _tunnelVertCircle.hide();
} else {
- var_4 = _mazeUI.cellFromX(newMazeX + 70) - 70;
+ mazePosX = _mazeUI.cellFromX(newMazeX + 70) - 70;
newMazeX = _mazePosition.x - _mazeChangeAmount;
- dx = _mazeUI.getCellFromMapXY(Common::Point(newMazeX + 70, newMazeY + 46));
- if (((cellId == 25) || (cellId == 23) || (cellId == 14)) && (cellId != dx)) {
- newMazeX = var_4;
+ tmpCellId = _mazeUI.getCellFromMapXY(Common::Point(newMazeX + 70, newMazeY + 46));
+ if (((cellId == 25) || (cellId == 23) || (cellId == 14)) && (cellId != tmpCellId)) {
+ newMazeX = mazePosX;
R2_GLOBALS._sound2.play(339);
_rotation->_idxChange = 0;
- _field1270 = 0;
+ _speed = 0;
_mazeChangeAmount = 0;
- _field1272 = 0;
- if (_action1._field24 == 0)
- _actor8.hide();
- } else if ((cellId == 1) && (cellId != dx)) {
- newMazeX = var_4 + 5;
+ _updateIdxChangeFl = false;
+ if (!_action1._turningFl)
+ _tunnelVertCircle.hide();
+ } else if ((cellId == 1) && (cellId != tmpCellId)) {
+ newMazeX = mazePosX + 5;
R2_GLOBALS._sound2.play(339);
_rotation->_idxChange = 0;
- _field1270 = 0;
+ _speed = 0;
_mazeChangeAmount = 0;
- _field1272 = 0;
- if (_action1._field24 == 0)
- _actor8.hide();
+ _updateIdxChangeFl = false;
+ if (!_action1._turningFl)
+ _tunnelVertCircle.hide();
} else {
- var_4 = _mazeUI.cellFromX(newMazeX + 70) - 70;
- var_8 = abs(var_4 - newMazeX);
+ mazePosX = _mazeUI.cellFromX(newMazeX + 70) - 70;
+ deltaX = abs(mazePosX - newMazeX);
cellId = _mazeUI.getCellFromMapXY(Common::Point(newMazeX + 70, newMazeY + 46));
- if ( (((cellId == 25) || (cellId == 23) || (cellId == 14)) && (newMazeX <= var_4) && (_mazePosition.x >= var_4))
- || (((cellId == 26) || (cellId == 24) || (cellId == 15) || (cellId == 5) || (cellId == 4)) && (_mazeChangeAmount >= var_8) && (_mazeChangeAmount <= 3) && (_action1._field24 != 0)) ) {
- newMazeX = var_4;
+ if ( (((cellId == 25) || (cellId == 23) || (cellId == 14)) && (newMazeX <= mazePosX) && (_mazePosition.x >= mazePosX))
+ || (((cellId == 26) || (cellId == 24) || (cellId == 15) || (cellId == 5) || (cellId == 4)) && (_mazeChangeAmount >= deltaX) && (_mazeChangeAmount <= 3) && (_action1._turningFl)) ) {
+ newMazeX = mazePosX;
if ((cellId == 26) || (cellId == 24) || (cellId == 15) || (cellId == 5) || (cellId == 4))
R2_GLOBALS._sound2.play(339);
_rotation->_idxChange = 0;
- _field1270 = 0;
+ _speed = 0;
_mazeChangeAmount = 0;
- _field1272 = 0;
- if (_action1._field24 == 0)
- _actor8.hide();
- } else if ((cellId == 1) && (newMazeX >= var_4 + 5) && (_mazePosition.x >= var_4 + 5)) {
- newMazeX = var_4 + 5;
+ _updateIdxChangeFl = false;
+ if (!_action1._turningFl)
+ _tunnelVertCircle.hide();
+ } else if ((cellId == 1) && (newMazeX >= mazePosX + 5) && (_mazePosition.x >= mazePosX + 5)) {
+ newMazeX = mazePosX + 5;
R2_GLOBALS._sound2.play(339);
_rotation->_idxChange = 0;
- _field1270 = 0;
+ _speed = 0;
_mazeChangeAmount = 0;
- _field1272 = 0;
- if (_action1._field24 == 0)
- _actor8.hide();
- } else if (((cellId == 26) || (cellId == 24) || (cellId == 15) || (cellId == 5) || (cellId == 4)) && (var_a != 0) && (var_a <= 3)) {
- newMazeY = var_6;
+ _updateIdxChangeFl = false;
+ if (!_action1._turningFl)
+ _tunnelVertCircle.hide();
+ } else if (((cellId == 26) || (cellId == 24) || (cellId == 15) || (cellId == 5) || (cellId == 4)) && (deltaY != 0) && (deltaY <= 3)) {
+ newMazeY = mazePosY;
R2_GLOBALS._sound2.play(339);
} else {
// Nothing
@@ -4167,32 +4204,32 @@ void Scene3500::dispatch() {
break;
}
- if (_field1284 < 2) {
+ if (_exitCounter < 2) {
_mazePosition.x = newMazeX;
_mazePosition.y = newMazeY;
if (_mazeUI.setMazePosition2(_mazePosition) != 0) {
- _field1272 = 0;
+ _updateIdxChangeFl = false;
_mazeChangeAmount = 0;
- _field1270 = 0;
+ _speed = 0;
_rotation->setDelay(0);
_rotation->_idxChange = 0;
}
_mazeUI.draw();
- if (_field1284 != 0)
- ++_field1284;
+ if (_exitCounter != 0)
+ ++_exitCounter;
}
}
- if (_field1272 == 0) {
- if (_mazeChangeAmount != _field1270) {
- if (_mazeChangeAmount >= _field1270) {
+ if (!_updateIdxChangeFl) {
+ if (_mazeChangeAmount != _speed) {
+ if (_mazeChangeAmount >= _speed) {
if (_mazeChangeAmount == 1) {
- if (_action1._field24 != 0) {
- if ( ((_mazeDirection == 1) && (var_8 == 0) && (var_a != 0) && (var_a <= 3) && ((cellId == 25) || (cellId == 26) || (cellId == 5) || (cellId == 14) || (cellId == 15)))
- || ((_mazeDirection == 3) && (var_a == 0) && (var_8 != 0) && (var_8 <= 3) && ((cellId == 25) || (cellId == 23) || (cellId == 14) || (cellId == 5) || (cellId == 4)))
- || ((_mazeDirection == 5) && (var_8 == 0) && (var_a != 0) && (var_a <= 3) && ((cellId == 23) || (cellId == 24) || (cellId == 4) || (cellId == 14) || (cellId == 15)))
- || ((_mazeDirection == 7) && (var_a == 0) && (var_8 != 0) && (var_8 <= 3) && ((cellId == 26) || (cellId == 24) || (cellId == 15) || (cellId == 5) || (cellId == 4))) ){
+ if (_action1._turningFl) {
+ if ( ((_mazeDirection == 1) && (deltaX == 0) && (deltaY != 0) && (deltaY <= 3) && ((cellId == 25) || (cellId == 26) || (cellId == 5) || (cellId == 14) || (cellId == 15)))
+ || ((_mazeDirection == 3) && (deltaY == 0) && (deltaX != 0) && (deltaX <= 3) && ((cellId == 25) || (cellId == 23) || (cellId == 14) || (cellId == 5) || (cellId == 4)))
+ || ((_mazeDirection == 5) && (deltaX == 0) && (deltaY != 0) && (deltaY <= 3) && ((cellId == 23) || (cellId == 24) || (cellId == 4) || (cellId == 14) || (cellId == 15)))
+ || ((_mazeDirection == 7) && (deltaY == 0) && (deltaX != 0) && (deltaX <= 3) && ((cellId == 26) || (cellId == 24) || (cellId == 15) || (cellId == 5) || (cellId == 4))) ){
_mazeChangeAmount = 1;
} else
_mazeChangeAmount--;
@@ -4202,34 +4239,30 @@ void Scene3500::dispatch() {
_mazeChangeAmount--;
} else
++_mazeChangeAmount;
- _field1272 = 1;
+ _updateIdxChangeFl = true;
}
- _actor2.setFrame2(_mazeChangeAmount + 1);
+ _verticalSpeedDisplay.setFrame2(_mazeChangeAmount + 1);
}
- if (_field1272 == 1) {
+ if (_updateIdxChangeFl) {
if (_mazeChangeAmount == 0)
_rotation->_idxChange = 0;
else if (_mazeChangeAmount > 8)
_rotation->_idxChange = 2;
else
_rotation->_idxChange = 1;
- }
- if (_field1272 != 0)
- _field1272--;
+ _updateIdxChangeFl = false;
+ }
if (_mazeChangeAmount != 0) {
- R2_GLOBALS._player._uiEnabled = false;
- if (_mazeChangeAmount != _field1270)
+ R2_GLOBALS._player._uiEnabled = false;
+ if (_mazeChangeAmount != _speed)
_aSound1.play(276);
} else {
R2_GLOBALS._player._uiEnabled = true;
_aSound1.fadeOut2(NULL);
}
-
- if (_rotation->_currIndex != _field1274)
- _field1274 = _rotation->_currIndex;
}
/*--------------------------------------------------------------------------
@@ -4238,32 +4271,28 @@ void Scene3500::dispatch() {
*--------------------------------------------------------------------------*/
Scene3600::Scene3600() {
- _field2548 = 0;
- _field254A = 0;
- _field254C = 0;
- _field254E = 0;
+ _tealDead = false;
+ _lightEntered = false;
_ghoulTeleported = false;
}
void Scene3600::synchronize(Serializer &s) {
SceneExt::synchronize(s);
- s.syncAsSint16LE(_field2548);
- s.syncAsSint16LE(_field254A);
- s.syncAsSint16LE(_field254C);
- s.syncAsSint16LE(_field254E);
+ s.syncAsSint16LE(_tealDead);
+ s.syncAsSint16LE(_lightEntered);
s.syncAsSint16LE(_ghoulTeleported);
}
Scene3600::Action3600::Action3600() {
- _field1E = 0;
- _field20 = 0;
+ _part2Fl = false;
+ _fadePct = 0;
}
void Scene3600::Action3600::synchronize(Serializer &s) {
Action::synchronize(s);
- s.syncAsSint16LE(_field1E);
- s.syncAsSint16LE(_field20);
+ s.syncAsSint16LE(_part2Fl);
+ s.syncAsSint16LE(_fadePct);
}
void Scene3600::Action3600::signal() {
@@ -4275,17 +4304,17 @@ void Scene3600::Action3600::signal() {
setDelay(60);
break;
case 1:
- if (_field1E == 0) {
- _field1E = 1;
- scene->_actor2.setAction(NULL);
+ if (!_part2Fl) {
+ _part2Fl = true;
+ scene->_steppingDisk.setAction(NULL);
R2_GLOBALS._sound2.play(330, NULL, 0);
R2_GLOBALS._sound2.fade(127, 5, 10, false, NULL);
}
setDelay(1);
- R2_GLOBALS._scenePalette.fade((const byte *)&scene->_palette1._palette, true, _field20);
- if (_field20 > 0)
- _field20 -= 2;
+ R2_GLOBALS._scenePalette.fade((const byte *)&scene->_palette1._palette, true, _fadePct);
+ if (_fadePct > 0)
+ _fadePct -= 2;
break;
case 2:
R2_GLOBALS._sound2.stop();
@@ -4317,7 +4346,7 @@ void Scene3600::Action2::signal() {
scene->_protector.setup(3127, 2, 1);
scene->_protector.animate(ANIM_MODE_1, NULL);
NpcMover *mover = new NpcMover();
- scene->_protector.addMover(mover, &scene->_protector._field8A, scene);
+ scene->_protector.addMover(mover, &scene->_protector._actorDestPos, scene);
}
break;
default:
@@ -4327,10 +4356,10 @@ void Scene3600::Action2::signal() {
}
}
-bool Scene3600::Item5::startAction(CursorType action, Event &event) {
+bool Scene3600::LightShaft::startAction(CursorType action, Event &event) {
Scene3600 *scene = (Scene3600 *)R2_GLOBALS._sceneManager._scene;
- if ((action != CURSOR_USE) || (scene->_action1._field1E == 0))
+ if ((action != CURSOR_USE) || !scene->_action1._part2Fl)
return SceneItem::startAction(action, event);
R2_GLOBALS._walkRegions.enableRegion(2);
@@ -4338,10 +4367,10 @@ bool Scene3600::Item5::startAction(CursorType action, Event &event) {
R2_GLOBALS._player.disableControl();
scene->_sceneMode = 3624;
- scene->_actor10.setStrip2(-1);
- scene->_actor11.setStrip2(-1);
- scene->_actor12.setStrip2(-1);
- scene->_actor4.setStrip2(-1);
+ scene->_quinn.setStrip2(-1);
+ scene->_seeker.setStrip2(-1);
+ scene->_miranda.setStrip2(-1);
+ scene->_webbster.setStrip2(-1);
if (R2_GLOBALS._player._characterIndex == R2_SEEKER)
R2_GLOBALS._player.setAction(&scene->_sequenceManager3, scene, 3611, &R2_GLOBALS._player, NULL);
@@ -4364,14 +4393,14 @@ bool Scene3600::Protector::startAction(CursorType action, Event &event) {
scene->_protectorSpeaker._displayMode = 1;
if (!R2_GLOBALS._player._mover)
R2_GLOBALS._player.addMover(NULL);
- if (!scene->_actor10._mover)
- scene->_actor10.addMover(NULL);
- if (!scene->_actor11._mover)
- scene->_actor11.addMover(NULL);
- if (!scene->_actor12._mover)
- scene->_actor12.addMover(NULL);
- if (!scene->_actor4._mover)
- scene->_actor4.addMover(NULL);
+ if (!scene->_quinn._mover)
+ scene->_quinn.addMover(NULL);
+ if (!scene->_seeker._mover)
+ scene->_seeker.addMover(NULL);
+ if (!scene->_miranda._mover)
+ scene->_miranda.addMover(NULL);
+ if (!scene->_webbster._mover)
+ scene->_webbster.addMover(NULL);
setup(3127, 2, 1);
scene->_sceneMode = 3327;
@@ -4409,16 +4438,13 @@ bool Scene3600::Protector::startAction(CursorType action, Event &event) {
void Scene3600::postInit(SceneObjectList *OwnerList) {
if (R2_GLOBALS._sceneManager._previousScene == 3600) {
R2_GLOBALS._scrollFollower = &R2_GLOBALS._player;
- R2_GLOBALS._v558B6.set(60, 0, 260, 200);
} else {
- R2_GLOBALS._scrollFollower = &_actor2;
+ R2_GLOBALS._scrollFollower = &_steppingDisk;
_sceneBounds = Rect(160, 0, 480, 200);
- R2_GLOBALS._v558B6.set(25, 0, 260, 200);
}
loadScene(3600);
SceneExt::postInit();
- _field254C = 0;
_stripManager.setColors(60, 255);
_stripManager.setFontNumber(3);
@@ -4433,62 +4459,61 @@ void Scene3600::postInit(SceneObjectList *OwnerList) {
R2_GLOBALS._player._characterScene[R2_SEEKER] = 3600;
R2_GLOBALS._player._characterScene[R2_MIRANDA] = 3600;
- _item2.setDetails(33, 3600, 6, -1, -1);
- _item3.setDetails(Rect(3, 3, 22, 45), 3600, 9, -1, -1, 1, NULL);
- _item4.setDetails(Rect(449, 3, 475, 45), 3600, 9, -1, -1, 1, NULL);
+ _console.setDetails(33, 3600, 6, -1, -1);
+ _tapestry1.setDetails(Rect(3, 3, 22, 45), 3600, 9, -1, -1, 1, NULL);
+ _tapestry2.setDetails(Rect(449, 3, 475, 45), 3600, 9, -1, -1, 1, NULL);
- _actor10.postInit();
- _actor10._moveDiff = Common::Point(3, 2);
- _actor10.changeZoom(-1);
- _actor10._effect = 1;
+ _quinn.postInit();
+ _quinn._moveDiff = Common::Point(3, 2);
+ _quinn.changeZoom(-1);
+ _quinn._effect = EFFECT_SHADED;
- if (R2_GLOBALS._player._characterIndex != 1)
- _actor10.setDetails(9001, 0, -1, -1, 1, (SceneItem *) NULL);
+ if (R2_GLOBALS._player._characterIndex != R2_QUINN)
+ _quinn.setDetails(9001, 0, -1, -1, 1, (SceneItem *) NULL);
- _actor11.postInit();
- _actor11._numFrames = 7;
- _actor11._moveDiff = Common::Point(5, 3);
- _actor11.changeZoom(-1);
- _actor11._effect = 1;
+ _seeker.postInit();
+ _seeker._numFrames = 7;
+ _seeker._moveDiff = Common::Point(5, 3);
+ _seeker.changeZoom(-1);
+ _seeker._effect = EFFECT_SHADED;
- if (R2_GLOBALS._player._characterIndex != 2)
- _actor11.setDetails(9002, 1, -1, -1, 1, (SceneItem *) NULL);
+ if (R2_GLOBALS._player._characterIndex != R2_SEEKER)
+ _seeker.setDetails(9002, 1, -1, -1, 1, (SceneItem *) NULL);
- _actor12.postInit();
- _actor12._moveDiff = Common::Point(3, 2);
- _actor12.changeZoom(-1);
- _actor12._effect = 1;
+ _miranda.postInit();
+ _miranda._moveDiff = Common::Point(3, 2);
+ _miranda.changeZoom(-1);
+ _miranda._effect = EFFECT_SHADED;
- if (R2_GLOBALS._player._characterIndex != 3)
- _actor12.setDetails(9003, 1, -1, -1, 1, (SceneItem *) NULL);
+ if (R2_GLOBALS._player._characterIndex != R2_MIRANDA)
+ _miranda.setDetails(9003, 1, -1, -1, 1, (SceneItem *) NULL);
R2_GLOBALS._player.postInit();
R2_GLOBALS._player.changeZoom(-1);
R2_GLOBALS._player.animate(ANIM_MODE_1, NULL);
R2_GLOBALS._player.disableControl();
- _actor4.postInit();
- _actor4._numFrames = 7;
- _actor4._moveDiff = Common::Point(5, 3);
- _actor4.changeZoom(-1);
- _actor4._effect = 1;
- _actor4.setDetails(3600, 27, -1, -1, 1, (SceneItem *) NULL);
+ _webbster.postInit();
+ _webbster._numFrames = 7;
+ _webbster._moveDiff = Common::Point(5, 3);
+ _webbster.changeZoom(-1);
+ _webbster._effect = EFFECT_SHADED;
+ _webbster.setDetails(3600, 27, -1, -1, 1, (SceneItem *) NULL);
- _actor5.postInit();
- _actor5._numFrames = 7;
- _actor5._moveDiff = Common::Point(3, 2);
- _actor5.changeZoom(-1);
- _actor5._effect = 1;
- _actor5.setDetails(3600, 12, -1, -1, 1, (SceneItem *) NULL);
+ _teal.postInit();
+ _teal._numFrames = 7;
+ _teal._moveDiff = Common::Point(3, 2);
+ _teal.changeZoom(-1);
+ _teal._effect = EFFECT_SHADED;
+ _teal.setDetails(3600, 12, -1, -1, 1, (SceneItem *) NULL);
_palette1.loadPalette(0);
_palette1.loadPalette(3601);
if (R2_GLOBALS._sceneManager._previousScene == 3600) {
- _item5._sceneRegionId = 200;
- _item5.setDetails(3600, 30, -1, -1, 5, &_actor4);
- _field254A = 1;
- _field2548 = 1;
+ _lightShaft._sceneRegionId = 200;
+ _lightShaft.setDetails(3600, 30, -1, -1, 5, &_webbster);
+ _tealDead = true;
R2_GLOBALS._walkRegions.disableRegion(2);
R2_GLOBALS._walkRegions.disableRegion(7);
@@ -4496,51 +4521,51 @@ void Scene3600::postInit(SceneObjectList *OwnerList) {
R2_GLOBALS._walkRegions.disableRegion(15);
R2_GLOBALS._walkRegions.disableRegion(16);
- _actor10.setup(10, 5, 11);
- _actor10.animate(ANIM_MODE_1, NULL);
+ _quinn.setup(10, 5, 11);
+ _quinn.animate(ANIM_MODE_1, NULL);
- _actor11.setup(20, 5, 11);
- _actor11.animate(ANIM_MODE_1, NULL);
+ _seeker.setup(20, 5, 11);
+ _seeker.animate(ANIM_MODE_1, NULL);
- _actor12.setup(30, 5, 11);
- _actor12.animate(ANIM_MODE_1, NULL);
+ _miranda.setup(30, 5, 11);
+ _miranda.animate(ANIM_MODE_1, NULL);
if (R2_GLOBALS._player._characterIndex == R2_SEEKER) {
- _actor10.setPosition(Common::Point(76, 148));
- _actor11.setPosition(Common::Point(134, 148));
- _actor12.setPosition(Common::Point(100, 148));
+ _quinn.setPosition(Common::Point(76, 148));
+ _seeker.setPosition(Common::Point(134, 148));
+ _miranda.setPosition(Common::Point(100, 148));
R2_GLOBALS._player._moveDiff = Common::Point(5, 3);
- R2_GLOBALS._player.setup(20, _actor11._strip, 1);
- R2_GLOBALS._player.setPosition(_actor11._position);
- _actor11.hide();
+ R2_GLOBALS._player.setup(20, _seeker._strip, 1);
+ R2_GLOBALS._player.setPosition(_seeker._position);
+ _seeker.hide();
} else if (R2_GLOBALS._player._characterIndex == R2_MIRANDA) {
- _actor10.setPosition(Common::Point(110, 148));
- _actor11.setPosition(Common::Point(76, 148));
- _actor12.setPosition(Common::Point(134, 148));
+ _quinn.setPosition(Common::Point(110, 148));
+ _seeker.setPosition(Common::Point(76, 148));
+ _miranda.setPosition(Common::Point(134, 148));
R2_GLOBALS._player._moveDiff = Common::Point(3, 2);
- R2_GLOBALS._player.setup(30, _actor12._strip, 1);
- R2_GLOBALS._player.setPosition(_actor12._position);
- _actor12.hide();
+ R2_GLOBALS._player.setup(30, _miranda._strip, 1);
+ R2_GLOBALS._player.setPosition(_miranda._position);
+ _miranda.hide();
} else {
- _actor10.setPosition(Common::Point(134, 148));
- _actor11.setPosition(Common::Point(76, 148));
- _actor12.setPosition(Common::Point(110, 148));
+ _quinn.setPosition(Common::Point(134, 148));
+ _seeker.setPosition(Common::Point(76, 148));
+ _miranda.setPosition(Common::Point(110, 148));
R2_GLOBALS._player._moveDiff = Common::Point(3, 2);
- R2_GLOBALS._player.setup(10, _actor10._strip, 1);
- R2_GLOBALS._player.setPosition(_actor10._position);
- _actor10.hide();
+ R2_GLOBALS._player.setup(10, _quinn._strip, 1);
+ R2_GLOBALS._player.setPosition(_quinn._position);
+ _quinn.hide();
}
- _actor4.setPosition(Common::Point(47, 149));
- _actor4.setup(40, 1, 11);
- _actor4.animate(ANIM_MODE_1, NULL);
+ _webbster.setPosition(Common::Point(47, 149));
+ _webbster.setup(40, 1, 11);
+ _webbster.animate(ANIM_MODE_1, NULL);
- _actor5.setPosition(Common::Point(367, 148));
- _actor5.setup(3601, 7, 5);
+ _teal.setPosition(Common::Point(367, 148));
+ _teal.setup(3601, 7, 5);
if (!R2_GLOBALS.getFlag(71)) {
_protector.postInit();
_protector._state = 0;
- _protector._field8A = Common::Point(226, 152);
+ _protector._actorDestPos = Common::Point(226, 152);
_protector._moveDiff = Common::Point(3, 2);
_protector.setPosition(Common::Point(284, 152));
_protector.setup(3127, 2, 1);
@@ -4549,65 +4574,64 @@ void Scene3600::postInit(SceneObjectList *OwnerList) {
}
R2_GLOBALS._sound2.play(330);
- _actor3.postInit();
- _actor3.setPosition(Common::Point(84, 156));
- _actor3.fixPriority(158);
- _actor3.setup(3601, 5, 1);
- _actor3.animate(ANIM_MODE_2, NULL);
-
- _action1._field1E = 1;
- _action1._field20 = 0;
+ _consoleLights.postInit();
+ _consoleLights.setPosition(Common::Point(84, 156));
+ _consoleLights.fixPriority(158);
+ _consoleLights.setup(3601, 5, 1);
+ _consoleLights.animate(ANIM_MODE_2, NULL);
+
+ _action1._part2Fl = true;
+ _action1._fadePct = 0;
_action1.setActionIndex(1);
- _actor3.setAction(&_action1);
+ _consoleLights.setAction(&_action1);
_sceneMode = 3623;
g_globals->_events.setCursor(CURSOR_ARROW);
R2_GLOBALS._player.enableControl(CURSOR_WALK);
} else {
- _field254A = 0;
- _field2548 = 0;
+ _tealDead = false;
R2_GLOBALS._walkRegions.disableRegion(17);
R2_GLOBALS._walkRegions.disableRegion(18);
- _actor10.setPosition(Common::Point(393, 148));
- _actor11.setPosition(Common::Point(364, 153));
- _actor12.setPosition(Common::Point(413, 164));
+ _quinn.setPosition(Common::Point(393, 148));
+ _seeker.setPosition(Common::Point(364, 153));
+ _miranda.setPosition(Common::Point(413, 164));
R2_GLOBALS._player.hide();
- _actor4.setPosition(Common::Point(373, 164));
+ _webbster.setPosition(Common::Point(373, 164));
- _actor5.setup(3403, 8, 11);
- _actor5.setPosition(Common::Point(403, 155));
+ _teal.setup(3403, 8, 11);
+ _teal.setPosition(Common::Point(403, 155));
_protector.setup(3403, 7, 1);
_protector.setPosition(Common::Point(405, 155));
- _actor2.postInit();
- _actor2.setup(3600, 2, 1);
- _actor2.setPosition(Common::Point(403, 161));
- _actor2.fixPriority(149);
- _actor2.changeZoom(-1);
+ _steppingDisk.postInit();
+ _steppingDisk.setup(3600, 2, 1);
+ _steppingDisk.setPosition(Common::Point(403, 161));
+ _steppingDisk.fixPriority(149);
+ _steppingDisk.changeZoom(-1);
- _action1._field1E = 0;
- _action1._field20 = 90;
+ _action1._part2Fl = false;
+ _action1._fadePct = 90;
_sceneMode = 3600;
- setAction(&_sequenceManager1, this, 3600, &_actor11, &_actor10, &_actor12, &_actor4, &_actor5, &_actor2, NULL);
- _field254E = 0;
+ setAction(&_sequenceManager1, this, 3600, &_seeker, &_quinn, &_miranda,
+ &_webbster, &_teal, &_steppingDisk, NULL);
}
- _field254E = 0;
+ _lightEntered = false;
_ghoulTeleported = R2_GLOBALS.getFlag(71);
R2_GLOBALS._sound1.play(326);
- _item1.setDetails(Rect(0, 0, 480, 200), 3600, 0, -1, -1, 1, NULL);
+ _background.setDetails(Rect(0, 0, 480, 200), 3600, 0, -1, -1, 1, NULL);
}
void Scene3600::remove() {
- _actor3.animate(ANIM_MODE_NONE, NULL);
- _actor3.setAction(NULL);
+ _consoleLights.animate(ANIM_MODE_NONE, NULL);
+ _consoleLights.setAction(NULL);
R2_GLOBALS._sound2.fadeOut2(NULL);
R2_GLOBALS._sound1.fadeOut2(NULL);
R2_GLOBALS._scrollFollower = &R2_GLOBALS._player;
@@ -4617,54 +4641,56 @@ void Scene3600::remove() {
void Scene3600::signal() {
switch (_sceneMode) {
case 3320:
- // TODO: warning("STUB: sub_1D227()");
+ // Move to the console
R2_GLOBALS._walkRegions.disableRegion(14);
- R2_GLOBALS._scrollFollower = &_actor11;
+ R2_GLOBALS._scrollFollower = &_seeker;
_tealSpeaker._object1.hide();
- _actor5.show();
- _actor5.setStrip(2);
+ _teal.show();
+ _teal.setStrip(2);
if (R2_GLOBALS._player._characterIndex == R2_SEEKER)
_sceneMode = 3602;
else if (R2_GLOBALS._player._characterIndex == R2_MIRANDA)
_sceneMode = 3603;
else
_sceneMode = 3601;
- setAction(&_sequenceManager1, this, _sceneMode, &_actor11, &_actor10, &_actor12, &_actor4, &_actor5, NULL);
+ setAction(&_sequenceManager1, this, _sceneMode, &_seeker, &_quinn,
+ &_miranda, &_webbster, &_teal, NULL);
break;
case 3321:
- warning("STUB: sub_1D227()");
+ // Teal activates console
R2_GLOBALS._scrollFollower = &R2_GLOBALS._player;
- _tealSpeaker.proc16();
- _actor5.show();
- _actor5.setStrip(1);
- _actor3.postInit();
+ _tealSpeaker.stopSpeaking();
+ _teal.show();
+ _teal.setStrip(1);
+ _consoleLights.postInit();
_sceneMode = 3604;
- setAction(&_sequenceManager1, this, _sceneMode, &_actor5, &_actor3, &_actor10, &_actor11, &_actor12, &_actor4, NULL);
+ setAction(&_sequenceManager1, this, _sceneMode, &_teal, &_consoleLights,
+ &_quinn, &_seeker, &_miranda, &_webbster, NULL);
break;
case 3322:
- warning("STUB: sub_1D227()");
- _quinnSpeaker.proc16();
+ // Teal walks toward the teleport pod, the goule protector appears
+ _quinnSpeaker.stopSpeaking();
_quinnSpeaker._displayMode = 1;
- _tealSpeaker.proc16();
+ _tealSpeaker.stopSpeaking();
_tealSpeaker._displayMode = 7;
- R2_GLOBALS._scrollFollower = &_actor5;
+ R2_GLOBALS._scrollFollower = &_teal;
_sceneMode = 3605;
- setAction(&_sequenceManager1, this, _sceneMode, &_actor5, &_protector, &_actor2, NULL);
+ setAction(&_sequenceManager1, this, _sceneMode, &_teal, &_protector, &_steppingDisk, NULL);
break;
case 3323:
- if (_field254A == 0)
- _field254A = 1;
+ // Goule protector eats Teal guts then moves
+
+ if (!_tealDead)
+ _tealDead = true;
else {
- warning("STUB: sub_1D227()");
- _protectorSpeaker.proc16();
+ _protectorSpeaker.stopSpeaking();
_protector.show();
_protector.setup(3258, 6, 1);
_sceneMode = 3607;
_protector.setAction(&_sequenceManager1, this, _sceneMode, &_protector, NULL);
- R2_GLOBALS._v558C2 = 1;
- _protectorSpeaker.proc16();
+ _protectorSpeaker.stopSpeaking();
_protectorSpeaker._displayMode = 1;
_quinnSpeaker._displayMode = 1;
_protector.show();
@@ -4678,7 +4704,7 @@ void Scene3600::signal() {
R2_GLOBALS._walkRegions.disableRegion(15);
R2_GLOBALS._walkRegions.disableRegion(16);
- _actor3.setAction(&_action1);
+ _consoleLights.setAction(&_action1);
}
break;
case 3324:
@@ -4688,7 +4714,6 @@ void Scene3600::signal() {
R2_GLOBALS._player.enableControl(CURSOR_WALK);
_protector.fixPriority(-1);
_sceneMode = 3623;
- _field2548 = 1;
break;
case 3327:
g_globals->_events.setCursor(CURSOR_ARROW);
@@ -4696,29 +4721,30 @@ void Scene3600::signal() {
_sceneMode = 3623;
break;
case 3450:
+ // Speech of Teal and Quinn
R2_GLOBALS._sound1.stop();
- _actor1.hide();
- _actor6.hide();
+ _protector3400.hide();
+ _door3400.hide();
_sceneBounds = Rect(40, 0, SCREEN_WIDTH + 40, SCREEN_HEIGHT);
setZoomPercents(142, 80, 167, 105);
loadScene(3600);
R2_GLOBALS._uiElements.show();
- _item5._sceneRegionId = 200;
- _item5.setDetails(3600, 30, -1, -1, 5, &_actor4);
-
- _actor3.show();
- _actor10.show();
- _actor11.show();
- _actor12.show();
- _actor4.show();
- _actor5.show();
+ _lightShaft._sceneRegionId = 200;
+ _lightShaft.setDetails(3600, 30, -1, -1, 5, &_webbster);
+
+ _consoleLights.show();
+ _quinn.show();
+ _seeker.show();
+ _miranda.show();
+ _webbster.show();
+ _teal.show();
- _actor5.setPosition(Common::Point(298, 151));
+ _teal.setPosition(Common::Point(298, 151));
_protector.postInit();
_protector._state = 0;
- _protector._field8A = Common::Point(226, 152);
+ _protector._actorDestPos = Common::Point(226, 152);
_protector._moveDiff = Common::Point(5, 3);
_protector.setup(3403, 7, 1);
_protector.setPosition(Common::Point(405, 155));
@@ -4726,32 +4752,32 @@ void Scene3600::signal() {
_protector.addMover(NULL);
_protector.animate(ANIM_MODE_NONE);
_protector.hide();
- _protector.setDetails(3600, 15, -1, 17, 5, &_item5);
+ _protector.setDetails(3600, 15, -1, 17, 5, &_lightShaft);
- _actor2.setup(3600, 2, 1);
- _actor2.setPosition(Common::Point(403, 161));
- _actor2.fixPriority(149);
- _actor2.changeZoom(-1);
- _actor2.show();
+ _steppingDisk.setup(3600, 2, 1);
+ _steppingDisk.setPosition(Common::Point(403, 161));
+ _steppingDisk.fixPriority(149);
+ _steppingDisk.changeZoom(-1);
+ _steppingDisk.show();
_quinnSpeaker._displayMode = 2;
_tealSpeaker._displayMode = 2;
if (R2_GLOBALS._player._characterIndex == R2_SEEKER) {
R2_GLOBALS._player._moveDiff = Common::Point(5, 3);
- R2_GLOBALS._player.setup(20, _actor11._strip, 1);
- R2_GLOBALS._player.setPosition(_actor11._position);
- _actor11.hide();
+ R2_GLOBALS._player.setup(20, _seeker._strip, 1);
+ R2_GLOBALS._player.setPosition(_seeker._position);
+ _seeker.hide();
} else if (R2_GLOBALS._player._characterIndex == R2_MIRANDA) {
R2_GLOBALS._player._moveDiff = Common::Point(3, 2);
- R2_GLOBALS._player.setup(30, _actor12._strip, 1);
- R2_GLOBALS._player.setPosition(_actor12._position);
- _actor12.hide();
+ R2_GLOBALS._player.setup(30, _miranda._strip, 1);
+ R2_GLOBALS._player.setPosition(_miranda._position);
+ _miranda.hide();
} else {
R2_GLOBALS._player._moveDiff = Common::Point(3, 2);
- R2_GLOBALS._player.setup(10, _actor10._strip, 1);
- R2_GLOBALS._player.setPosition(_actor10._position);
- _actor10.hide();
+ R2_GLOBALS._player.setup(10, _quinn._strip, 1);
+ R2_GLOBALS._player.setPosition(_quinn._position);
+ _quinn.hide();
}
R2_GLOBALS._player.show();
R2_GLOBALS._sound1.play(326);
@@ -4760,6 +4786,7 @@ void Scene3600::signal() {
R2_GLOBALS._sound2.play(329);
break;
case 3600:
+ // First speech by Teal
_sceneMode = 3320;
_stripManager.start(3320, this);
break;
@@ -4768,53 +4795,56 @@ void Scene3600::signal() {
case 3602:
// No break on purpose
case 3603:
+ // Teal speech near the console
R2_GLOBALS._walkRegions.disableRegion(2);
R2_GLOBALS._walkRegions.disableRegion(7);
- R2_GLOBALS._v558B6.set(60, 0, 260, 200);
_tealSpeaker._displayMode = 1;
_sceneMode = 3321;
_stripManager.start(3321, this);
break;
case 3604:
+ // Goule Protector forces the door
R2_GLOBALS._sound2.fadeOut2(NULL);
R2_GLOBALS._sound1.stop();
R2_GLOBALS._walkRegions.enableRegion(2);
R2_GLOBALS._walkRegions.enableRegion(7);
- _actor2.hide();
- _actor3.hide();
+ _steppingDisk.hide();
+ _consoleLights.hide();
R2_GLOBALS._player.hide();
- _actor10.hide();
- _actor11.hide();
- _actor12.hide();
- _actor4.hide();
- _actor5.hide();
+ _quinn.hide();
+ _seeker.hide();
+ _miranda.hide();
+ _webbster.hide();
+ _teal.hide();
_sceneBounds = Rect(60, 0, SCREEN_WIDTH + 60, SCREEN_HEIGHT);
setZoomPercents(51, 46, 180, 200);
loadScene(3400);
R2_GLOBALS._uiElements.show();
- _actor1.postInit();
+ _protector3400.postInit();
- _actor2.setup(3403, 1, 1);
- _actor2.setPosition(Common::Point(190, 103));
- _actor2.fixPriority(89);
- _actor2.show();
+ _steppingDisk.setup(3403, 1, 1);
+ _steppingDisk.setPosition(Common::Point(190, 103));
+ _steppingDisk.fixPriority(89);
+ _steppingDisk.show();
- _actor6.postInit();
- _actor6.setup(3400, 1, 6);
- _actor6.setPosition(Common::Point(236, 51));
- _actor6.fixPriority(51);
- R2_GLOBALS._scrollFollower = &_actor6;
+ _door3400.postInit();
+ _door3400.setup(3400, 1, 6);
+ _door3400.setPosition(Common::Point(236, 51));
+ _door3400.fixPriority(51);
+ R2_GLOBALS._scrollFollower = &_door3400;
R2_GLOBALS._sound1.play(323);
_sceneMode = 3450;
- setAction(&_sequenceManager1, this, 3450, &_actor1, &_actor6, NULL);
+ setAction(&_sequenceManager1, this, 3450, &_protector3400, &_door3400, NULL);
break;
case 3605:
+ // Goule protector jumps on Teal
_protector.setup(3258, 4, 1);
- _protector.setAction(&_sequenceManager1, this, 3606, &_actor5, &_protector, &_actor2, NULL);
+ _protector.setAction(&_sequenceManager1, this, 3606, &_teal, &_protector,
+ &_steppingDisk, NULL);
_sceneMode = 3323;
_stripManager.start(3323, this);
@@ -4822,8 +4852,8 @@ void Scene3600::signal() {
case 3620:
// No break on purpose
case 3623:
- if ((_protector._position.x == 226) && (_protector._position.y == 152)
- && (_action1._field1E != 0) && (_protector._visage == 3127) && (!R2_GLOBALS.getFlag(71))) {
+ if ((_protector._position.x == 226) && (_protector._position.y == 152)
+ && _action1._part2Fl && (_protector._visage == 3127) && (!R2_GLOBALS.getFlag(71))) {
R2_GLOBALS._sound2.stop();
R2_GLOBALS._sound2.play(331);
R2_GLOBALS.setFlag(71);
@@ -4833,11 +4863,11 @@ void Scene3600::signal() {
break;
case 3624:
R2_GLOBALS._player.disableControl();
- if ((_field254E != 0) && (_actor10._position.x == 229) && (_actor10._position.y == 154) && (_actor11._position.x == 181) && (_actor11._position.y == 154) && (_actor12._position.x == 207) && (_actor12._position.y == 154) && (_actor4._position.x == 155) && (_actor4._position.y == 154)) {
+ if (_lightEntered && (_quinn._position.x == 229) && (_quinn._position.y == 154) && (_seeker._position.x == 181) && (_seeker._position.y == 154) && (_miranda._position.x == 207) && (_miranda._position.y == 154) && (_webbster._position.x == 155) && (_webbster._position.y == 154)) {
R2_GLOBALS._sound2.stop();
R2_GLOBALS._sound2.play(331);
_sceneMode = 3625;
- setAction(&_sequenceManager1, this, 3625, &_actor10, &_actor11, &_actor12, &_actor4, NULL);
+ setAction(&_sequenceManager1, this, 3625, &_quinn, &_seeker, &_miranda, &_webbster, NULL);
}
break;
case 3625:
@@ -4862,16 +4892,16 @@ void Scene3600::signal() {
}
void Scene3600::process(Event &event) {
- if ((event.eventType == EVENT_BUTTON_DOWN) && (R2_GLOBALS._events.getCursor() == CURSOR_ARROW) && (event.mousePos.x > 237) && (!R2_GLOBALS.getFlag(71))) {
- SceneItem::display(3600, 17, 0, 280, 1, 160, 9, 1, 2, 20, 7, 7 -999);
+ if ((event.eventType == EVENT_BUTTON_DOWN) && (R2_GLOBALS._events.getCursor() == CURSOR_ARROW)
+ && (event.mousePos.x > 237) && (!R2_GLOBALS.getFlag(71))) {
+ SceneItem::display(3600, 17, 0, 280, 1, 160, 9, 1, 2, 20, 7, 7, LIST_END);
event.handled = true;
}
Scene::process(event);
}
void Scene3600::dispatch() {
- if ((R2_GLOBALS._player.getRegionIndex() == 200) && (_action1._field1E != 0)
- && (_field254E == 0)) {
+ if ((R2_GLOBALS._player.getRegionIndex() == 200) && _action1._part2Fl && !_lightEntered) {
R2_GLOBALS._sound2.fadeOut2(NULL);
if (_protector._mover)
_protector.addMover(NULL);
@@ -4881,8 +4911,7 @@ void Scene3600::dispatch() {
if (R2_GLOBALS._player._mover)
R2_GLOBALS._player.addMover(NULL);
- _field254C = 0;
- _field254E = 1;
+ _lightEntered = true;
R2_GLOBALS._walkRegions.enableRegion(2);
R2_GLOBALS._walkRegions.enableRegion(7);
@@ -4890,30 +4919,30 @@ void Scene3600::dispatch() {
_sceneMode = 3624;
- _actor10.setStrip(-1);
- _actor11.setStrip(-1);
- _actor12.setStrip(-1);
- _actor4.setStrip(-1);
+ _quinn.setStrip(-1);
+ _seeker.setStrip(-1);
+ _miranda.setStrip(-1);
+ _webbster.setStrip(-1);
R2_GLOBALS._player.hide();
if (R2_GLOBALS._player._characterIndex == R2_SEEKER) {
- _actor11.setPosition(R2_GLOBALS._player._position);
- _actor11.show();
+ _seeker.setPosition(R2_GLOBALS._player._position);
+ _seeker.show();
} else if (R2_GLOBALS._player._characterIndex == R2_MIRANDA) {
- _actor12.setPosition(R2_GLOBALS._player._position);
- _actor12.show();
+ _miranda.setPosition(R2_GLOBALS._player._position);
+ _miranda.show();
} else {
- _actor10.setPosition(R2_GLOBALS._player._position);
- _actor10.show();
+ _quinn.setPosition(R2_GLOBALS._player._position);
+ _quinn.show();
}
- _actor10.setAction(&_sequenceManager2, this, 3610, &_actor10, NULL);
- _actor11.setAction(&_sequenceManager3, this, 3611, &_actor11, NULL);
- _actor12.setAction(&_sequenceManager4, this, 3612, &_actor12, NULL);
- _actor4.setAction(&_sequenceManager1, this, 3613, &_actor4, NULL);
+ _quinn.setAction(&_sequenceManager2, this, 3610, &_quinn, NULL);
+ _seeker.setAction(&_sequenceManager3, this, 3611, &_seeker, NULL);
+ _miranda.setAction(&_sequenceManager4, this, 3612, &_miranda, NULL);
+ _webbster.setAction(&_sequenceManager1, this, 3613, &_webbster, NULL);
}
- if ((_protector.getRegionIndex() == 200) && (_action1._field1E != 0) && !_ghoulTeleported) {
+ if ((_protector.getRegionIndex() == 200) && _action1._part2Fl && !_ghoulTeleported) {
R2_GLOBALS._sound2.fadeOut2(NULL);
_sceneMode = 3620;
_ghoulTeleported = true;
@@ -4921,14 +4950,14 @@ void Scene3600::dispatch() {
if (R2_GLOBALS._player._mover)
R2_GLOBALS._player.addMover(NULL);
- if (_actor10._mover)
- _actor10.addMover(NULL);
- if (_actor11._mover)
- _actor11.addMover(NULL);
- if (_actor12._mover)
- _actor12.addMover(NULL);
- if (_actor4._mover)
- _actor4.addMover(NULL);
+ if (_quinn._mover)
+ _quinn.addMover(NULL);
+ if (_seeker._mover)
+ _seeker.addMover(NULL);
+ if (_miranda._mover)
+ _miranda.addMover(NULL);
+ if (_webbster._mover)
+ _webbster.addMover(NULL);
}
Scene::dispatch();
@@ -4941,8 +4970,9 @@ void Scene3600::dispatch() {
void Scene3700::postInit(SceneObjectList *OwnerList) {
loadScene(3700);
- SceneExt::postInit();
R2_GLOBALS._uiElements._active = false;
+ R2_GLOBALS._uiElements._visible = false;
+ SceneExt::postInit();
R2_GLOBALS._interfaceY = SCREEN_HEIGHT;
_stripManager.setColors(60, 255);
@@ -4968,14 +4998,14 @@ void Scene3700::postInit(SceneObjectList *OwnerList) {
_webbster._moveDiff = Common::Point(5, 3);
_webbster.hide();
- _actor5.postInit();
+ _teleportPad.postInit();
R2_GLOBALS._player.disableControl();
R2_GLOBALS._sound1.play(332);
_sceneMode = 3700;
- setAction(&_sequenceManager, this, 3700, &_quinn, &_seeker, &_miranda,
- &_webbster, &_actor5, NULL);
+ setAction(&_sequenceManager, this, 3700, &_quinn, &_seeker, &_miranda,
+ &_webbster, &_teleportPad, NULL);
}
void Scene3700::remove() {
@@ -4988,7 +5018,6 @@ void Scene3700::signal() {
case 3328:
// No break on purpose
case 3329:
- warning("STUB: sub_1D227()");
_sceneMode = 3701;
setAction(&_sequenceManager, this, 3701, &_seeker, &_miranda, &_webbster, NULL);
break;
@@ -5019,6 +5048,7 @@ void Scene3700::signal() {
Scene3800::Scene3800() {
_desertDirection = 0;
+ _skylineRect.set(0, 0, 320, 87);
}
void Scene3800::synchronize(Serializer &s) {
@@ -5185,13 +5215,14 @@ void Scene3800::initExits() {
_southExit._moving = false;
_westExit._moving = false;
- loadScene(R2_GLOBALS._v566A6);
+ loadScene(R2_GLOBALS._maze3800SceneNumb);
R2_GLOBALS._uiElements.draw();
}
void Scene3800::enterArea() {
- R2_GLOBALS._player.disableControl();
+ R2_GLOBALS._player.disableControl(CURSOR_WALK);
+
switch (_desertDirection) {
case 0:
R2_GLOBALS._player.postInit();
@@ -5201,20 +5232,23 @@ void Scene3800::enterArea() {
R2_GLOBALS._player.setStrip(3);
R2_GLOBALS._player.changeZoom(-1);
R2_GLOBALS._player._moveDiff = Common::Point(3, 2);
- _actor1.postInit();
- _actor1.fixPriority(10);
- _actor1.changeZoom(-1);
- _actor1.setVisage(1110);
- _actor1._effect = 5;
- _actor1._field9C = this->_field312;
- R2_GLOBALS._player._linkedActor = &_actor1;
+
+ _quinnShadow.postInit();
+ _quinnShadow.fixPriority(10);
+ _quinnShadow.changeZoom(-1);
+ _quinnShadow.setVisage(1110);
+ _quinnShadow._effect = EFFECT_SHADOW_MAP;
+ _quinnShadow._shadowMap = this->_shadowPaletteMap;
+ R2_GLOBALS._player._linkedActor = &_quinnShadow;
+
switch (R2_GLOBALS._sceneManager._previousScene) {
case 2600:
- _object1.postInit();
- _object2.postInit();
- _actor1.hide();
+ _balloon.postInit();
+ _harness.postInit();
+ _quinnShadow.hide();
_sceneMode = 3800;
- setAction(&_sequenceManager1, this, 3800, &R2_GLOBALS._player, &_object1, &_object2, NULL);
+ setAction(&_sequenceManager1, this, 3800, &R2_GLOBALS._player,
+ &_balloon, &_harness, NULL);
break;
case 3900:
_sceneMode = 15;
@@ -5250,6 +5284,7 @@ void Scene3800::enterArea() {
default:
break;
}
+ break;
default:
R2_GLOBALS._player.enableControl(CURSOR_WALK);
break;
@@ -5313,7 +5348,6 @@ void Scene3800::postInit(SceneObjectList *OwnerList) {
_westExit.setDetails(Rect(0, 87, 14, 168), EXITCURSOR_W, 3800);
_westExit.setDest(Common::Point(7, 145));
- _rect1.set(0, 0, 320, 87);
_background.setDetails(Rect(0, 0, 320, 200), 3800, 0, 1, 2, 1, (SceneItem *) NULL);
enterArea();
@@ -5322,45 +5356,43 @@ void Scene3800::postInit(SceneObjectList *OwnerList) {
void Scene3800::signal() {
switch (_sceneMode) {
case 11:
- R2_GLOBALS._v566A6 += 15;
- if (R2_GLOBALS._v566A6 > 3815)
- R2_GLOBALS._v566A6 -= 20;
+ R2_GLOBALS._maze3800SceneNumb += 15;
+ if (R2_GLOBALS._maze3800SceneNumb > 3815)
+ R2_GLOBALS._maze3800SceneNumb -= 20;
initExits();
enterArea();
break;
case 12:
- R2_GLOBALS._v566A6 += 5;
- if (R2_GLOBALS._v566A6 > 3815)
- R2_GLOBALS._v566A6 = 3800;
+ R2_GLOBALS._maze3800SceneNumb += 5;
+ if (R2_GLOBALS._maze3800SceneNumb > 3815)
+ R2_GLOBALS._maze3800SceneNumb = 3800;
initExits();
enterArea();
break;
case 13:
- R2_GLOBALS._v566A6 -= 15;
- if (R2_GLOBALS._v566A6 < 3800)
- R2_GLOBALS._v566A6 += 20;
+ R2_GLOBALS._maze3800SceneNumb -= 15;
+ if (R2_GLOBALS._maze3800SceneNumb < 3800)
+ R2_GLOBALS._maze3800SceneNumb += 20;
initExits();
enterArea();
break;
case 14:
- R2_GLOBALS._v566A6 -= 5;
- if (R2_GLOBALS._v566A6 < 3800)
- R2_GLOBALS._v566A6 = 3815;
+ R2_GLOBALS._maze3800SceneNumb -= 5;
+ if (R2_GLOBALS._maze3800SceneNumb < 3800)
+ R2_GLOBALS._maze3800SceneNumb = 3815;
initExits();
enterArea();
break;
case 15:
- R2_GLOBALS._v56AAB = 0;
R2_GLOBALS._player.enableControl();
break;
case 16:
g_globals->_sceneManager.changeScene(3900);
break;
case 3800:
- _actor1.show();
- _object1.remove();
- _object2.remove();
- R2_GLOBALS._v56AAB = 0;
+ _quinnShadow.show();
+ _balloon.remove();
+ _harness.remove();
R2_GLOBALS._player.enableControl();
break;
case 3805:
@@ -5384,18 +5416,19 @@ void Scene3800::signal() {
}
void Scene3800::process(Event &event) {
- if ((R2_GLOBALS._player._uiEnabled) && (event.eventType == EVENT_BUTTON_DOWN) && (_rect1.contains(event.mousePos))) {
+ if ((R2_GLOBALS._player._uiEnabled) && (event.eventType == EVENT_BUTTON_DOWN)
+ && (_skylineRect.contains(event.mousePos))) {
event.handled = true;
switch (R2_GLOBALS._events.getCursor()) {
- case R2_NEGATOR_GUN:
+ case CURSOR_WALK:
R2_GLOBALS._player.addMover(NULL);
R2_GLOBALS._player.updateAngle(event.mousePos);
break;
- case R2_STEPPING_DISKS:
- SceneItem::display(3800, 5, 0, 280, 1, 160, 9, 1, 2, 20, 7, 7, -999);
+ case CURSOR_LOOK:
+ SceneItem::display(3800, 3, 0, 280, 1, 160, 9, 1, 2, 20, 7, 7, LIST_END);
break;
- case R2_ATTRACTOR_UNIT:
- SceneItem::display(3800, 3, 0, 280, 1, 160, 9, 1, 2, 20, 7, 7, -999);
+ case CURSOR_USE:
+ SceneItem::display(3800, 5, 0, 280, 1, 160, 9, 1, 2, 20, 7, 7, LIST_END);
break;
default:
event.handled = false;
@@ -5492,7 +5525,7 @@ void Scene3900::Exit5::changeScene() {
}
void Scene3900::postInit(SceneObjectList *OwnerList) {
- if ((R2_GLOBALS._desertPreviousDirection == 2)
+ if ((R2_GLOBALS._desertPreviousDirection == 2)
&& (R2_GLOBALS._sceneManager._previousScene != 2700))
loadScene(3825);
else
@@ -5510,13 +5543,13 @@ void Scene3900::postInit(SceneObjectList *OwnerList) {
R2_GLOBALS._player.changeZoom(-1);
R2_GLOBALS._player._moveDiff = Common::Point(3, 2);
- _actor1.postInit();
- _actor1.fixPriority(10);
- _actor1.changeZoom(-1);
- _actor1.setVisage(1110);
- _actor1._effect = 5;
- _actor1._field9C = _field312;
- R2_GLOBALS._player._linkedActor = &_actor1;
+ _quinnShadow.postInit();
+ _quinnShadow.fixPriority(10);
+ _quinnShadow.changeZoom(-1);
+ _quinnShadow.setVisage(1110);
+ _quinnShadow._effect = EFFECT_SHADOW_MAP;
+ _quinnShadow._shadowMap = _shadowPaletteMap;
+ R2_GLOBALS._player._linkedActor = &_quinnShadow;
if ((R2_GLOBALS._desertPreviousDirection == 2) && (R2_GLOBALS._sceneManager._previousScene != 2700)) {
// loadScene(3825);
@@ -5532,8 +5565,8 @@ void Scene3900::postInit(SceneObjectList *OwnerList) {
_westExit._enabled = false;
- _exit5.setDetails(Rect(0, 87, 29, 168), EXITCURSOR_W, 3900);
- _exit5.setDest(Common::Point(24, 135));
+ _westEnterForest.setDetails(Rect(0, 87, 29, 168), EXITCURSOR_W, 3900);
+ _westEnterForest.setDest(Common::Point(24, 135));
} else {
// loadScene(3820);
R2_GLOBALS._desertCorrectDirection = 2;
@@ -5548,12 +5581,12 @@ void Scene3900::postInit(SceneObjectList *OwnerList) {
_westExit._insideArea = false;
_westExit._moving = false;
- _exit5.setDetails(Rect(290, 87, 320, 168), EXITCURSOR_E, 3900);
- _exit5.setDest(Common::Point(295, 135));
+ _westEnterForest.setDetails(Rect(290, 87, 320, 168), EXITCURSOR_E, 3900);
+ _westEnterForest.setDest(Common::Point(295, 135));
}
- _exit5._enabled = true;
- _exit5._insideArea = false;
- _exit5._moving = false;
+ _westEnterForest._enabled = true;
+ _westEnterForest._insideArea = false;
+ _westEnterForest._moving = false;
scalePalette(65, 65, 65);
@@ -5569,8 +5602,8 @@ void Scene3900::postInit(SceneObjectList *OwnerList) {
R2_GLOBALS._uiElements.draw();
- _rect1.set(0, 0, 320, 87);
- _item1.setDetails(Rect(0, 0, 320, 200), 3800, 0, 1, 2, 1, (SceneItem *)NULL);
+ _skylineRect.set(0, 0, 320, 87);
+ _background.setDetails(Rect(0, 0, 320, 200), 3800, 0, 1, 2, 1, (SceneItem *)NULL);
if (R2_GLOBALS._sceneManager._previousScene == 3800) {
_sceneMode = 11;
switch (R2_GLOBALS._desertPreviousDirection) {
@@ -5626,7 +5659,6 @@ void Scene3900::signal() {
case 11:
// No break on purpose
case 12:
- R2_GLOBALS._v56AAB = 0;
R2_GLOBALS._player.enableControl(CURSOR_WALK);
break;
case 13:
@@ -5656,18 +5688,19 @@ void Scene3900::signal() {
}
void Scene3900::process(Event &event) {
- if ((R2_GLOBALS._player._uiEnabled) && (event.eventType == EVENT_BUTTON_DOWN) && (_rect1.contains(event.mousePos))) {
+ if ((R2_GLOBALS._player._uiEnabled) && (event.eventType == EVENT_BUTTON_DOWN)
+ && (_skylineRect.contains(event.mousePos))) {
event.handled = true;
switch (R2_GLOBALS._events.getCursor()) {
- case R2_NEGATOR_GUN:
+ case CURSOR_WALK:
R2_GLOBALS._player.addMover(NULL);
R2_GLOBALS._player.updateAngle(event.mousePos);
break;
- case R2_STEPPING_DISKS:
- SceneItem::display(3800, 5, 0, 280, 1, 160, 9, 1, 2, 20, 7, 7, -999);
+ case CURSOR_USE:
+ SceneItem::display(3800, 5, 0, 280, 1, 160, 9, 1, 2, 20, 7, 7, LIST_END);
break;
- case R2_ATTRACTOR_UNIT:
- SceneItem::display(3800, 3, 0, 280, 1, 160, 9, 1, 2, 20, 7, 7, -999);
+ case CURSOR_LOOK:
+ SceneItem::display(3800, 3, 0, 280, 1, 160, 9, 1, 2, 20, 7, 7, LIST_END);
break;
default:
event.handled = false;
diff --git a/engines/tsage/ringworld2/ringworld2_scenes3.h b/engines/tsage/ringworld2/ringworld2_scenes3.h
index 6c7a594b12..c73f8548e4 100644
--- a/engines/tsage/ringworld2/ringworld2_scenes3.h
+++ b/engines/tsage/ringworld2/ringworld2_scenes3.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope 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.
@@ -45,15 +45,15 @@ class Scene3100 : public SceneExt {
virtual bool startAction(CursorType action, Event &event);
};
public:
- int _field412;
+ bool _fadeSound;
SpeakerGuard _guardSpeaker;
- NamedHotspot _item1;
- NamedHotspot _item2;
- SceneActor _actor1;
- SceneActor _actor2;
- SceneActor _actor3;
- SceneActor _actor4;
- SceneActor _actor5;
+ NamedHotspot _background;
+ NamedHotspot _hammerHead2;
+ SceneActor _hammerHead;
+ SceneActor _miranda;
+ SceneActor _ghoul;
+ SceneActor _technicians;
+ SceneActor _deadBodies;
Guard _guard;
ASoundExt _sound1;
SequenceManager _sequenceManager;
@@ -84,7 +84,7 @@ class Scene3125 : public SceneExt {
virtual bool startAction(CursorType action, Event &event);
};
public:
- int _field412;
+ bool _soundPlayed;
Background _background;
Door _door;
Table _table;
@@ -93,9 +93,7 @@ public:
SceneActor _ghoul2;
SceneActor _ghoul3;
SceneActor _ghoul4;
- SequenceManager _sequenceManager1;
- // Second sequence manager... Unused?
- SequenceManager _sequenceManager2;
+ SequenceManager _sequenceManager;
Scene3125();
virtual void postInit(SceneObjectList *OwnerList = NULL);
@@ -119,7 +117,7 @@ class Scene3150 : public SceneExt {
class FoodTray : public SceneActor {
virtual bool startAction(CursorType action, Event &event);
};
- class Actor6 : public SceneActor {
+ class ToiletFlush : public SceneActor {
virtual bool startAction(CursorType action, Event &event);
};
class AirVent : public SceneActor {
@@ -146,7 +144,7 @@ public:
SceneActor _bulbOrWire;
Water _water;
FoodTray _foodTray;
- Actor6 _toiletFlush;
+ ToiletFlush _toiletFlush;
AirVent _airVent;
DoorExit _doorExit;
VentExit _ventExit;
@@ -158,7 +156,7 @@ public:
};
class Scene3175 : public SceneExt {
- class Item1 : public NamedHotspot {
+ class RoomItem : public NamedHotspot {
public:
virtual bool startAction(CursorType action, Event &event);
};
@@ -170,11 +168,11 @@ class Scene3175 : public SceneExt {
virtual bool startAction(CursorType action, Event &event);
};
public:
- Item1 _background;
- Item1 _item2;
- Item1 _item3;
+ RoomItem _background;
+ RoomItem _table;
+ RoomItem _autopsies;
Door _door;
- SceneActor _actor2;
+ SceneActor _computer;
Corpse _corpse;
SequenceManager _sequenceManager;
@@ -187,9 +185,9 @@ public:
SpeakerRocko3200 _rockoSpeaker;
SpeakerJocko3200 _jockoSpeaker;
SpeakerSocko3200 _sockoSpeaker;
- SceneActor _actor1;
- SceneActor _actor2;
- SceneActor _actor3;
+ SceneActor _rocko;
+ SceneActor _jocko;
+ SceneActor _socko;
SequenceManager _sequenceManager;
virtual void postInit(SceneObjectList *OwnerList = NULL);
@@ -200,8 +198,8 @@ class Scene3210 : public SceneExt {
public:
SpeakerCaptain3210 _captainSpeaker;
SpeakerPrivate3210 _privateSpeaker;
- SceneActor _actor1;
- SceneActor _actor2;
+ SceneActor _captain;
+ SceneActor _private;
SequenceManager _sequenceManager;
virtual void postInit(SceneObjectList *OwnerList = NULL);
@@ -212,8 +210,8 @@ class Scene3220 : public SceneExt {
public:
SpeakerRocko3220 _rockoSpeaker;
SpeakerJocko3220 _jockoSpeaker;
- SceneActor _actor1;
- SceneActor _actor2;
+ SceneActor _rocko;
+ SceneActor _jocko;
SequenceManager _sequenceManager;
virtual void postInit(SceneObjectList *OwnerList = NULL);
@@ -224,9 +222,9 @@ class Scene3230 : public SceneExt {
public:
SpeakerRocko3230 _rockoSpeaker;
SpeakerJocko3230 _jockoSpeaker;
- SceneActor _actor1;
- SceneActor _actor2;
- SceneActor _actor3;
+ SceneActor _rocko;
+ SceneActor _jocko;
+ SceneActor _ghoul;
SequenceManager _sequenceManager;
virtual void postInit(SceneObjectList *OwnerList = NULL);
@@ -238,8 +236,8 @@ public:
SpeakerTeal3240 _tealSpeaker;
SpeakerWebbster3240 _webbsterSpeaker;
SpeakerMiranda _mirandaSpeaker;
- SceneActor _actor1;
- SceneActor _actor2;
+ SceneActor _teal;
+ SceneActor _webbster;
SequenceManager _sequenceManager;
virtual void postInit(SceneObjectList *OwnerList = NULL);
@@ -250,8 +248,8 @@ class Scene3245 : public SceneExt {
public:
SpeakerRalf3245 _ralfSpeaker;
SpeakerTomko3245 _tomkoSpeaker;
- SceneActor _actor1;
- SceneActor _actor2;
+ SceneActor _ralf;
+ SceneActor _tomko;
SequenceManager _sequenceManager;
virtual void postInit(SceneObjectList *OwnerList = NULL);
@@ -275,7 +273,7 @@ public:
Door _leftDoor;
Door _topDoor;
Door _rightDoor;
- Door _actor4;
+ Door _grate;
SceneActor _ghoul1;
SceneActor _ghoul2;
SceneActor _ghoul3;
@@ -290,7 +288,7 @@ class Scene3255 : public SceneExt {
public:
SceneActor _teal;
SceneActor _guard;
- SceneActor _actor3;
+ SceneActor _door;
SceneActor _quinn;
SceneActor _ghoul1;
SceneActor _ghoul2;
@@ -317,16 +315,16 @@ class Scene3260 : public SceneExt {
void signal();
};
public:
- NamedHotspot _item1;
+ NamedHotspot _background;
SceneActor _sceeen1;
SceneActor _screen2;
SceneActor _screen3;
SceneActor _screen4;
SceneActor _screen5;
SceneActor _screen6;
- SceneActor _actor7;
- SceneActor _actor8;
- SceneActor _actor9;
+ SceneActor _screen7;
+ SceneActor _screen8;
+ SceneActor _screen9;
SceneActor _securityConsole;
SceneActor _computerConsole;
SceneActor _lightingConsole;
@@ -366,7 +364,7 @@ public:
NamedHotspot _emptyCell2;
NamedHotspot _securityBeams1;
NamedHotspot _securityBeams2;
- SceneActor _actor1;
+ SceneActor _doorFrame;
Door _door;
CellExit _cellExit;
SequenceManager _sequenceManager;
@@ -377,15 +375,15 @@ public:
class Scene3350 : public SceneExt {
public:
- SceneActor _actor1;
- SceneActor _actor2;
- SceneActor _actor3;
- SceneActor _actor4;
- SceneActor _actor5;
- SceneActor _actor6;
- SceneActor _actor7;
- SceneActor _actor8;
- SceneActor _actor9;
+ SceneActor _miranda;
+ SceneActor _seeker;
+ SceneActor _webbster;
+ SceneActor _seatedPeople;
+ SceneActor _ship;
+ SceneActor _landedShip;
+ SceneActor _shipShadow;
+ SceneActor _canopy;
+ SceneActor _shipFront;
SequenceManager _sequenceManager;
PaletteRotation *_rotation;
@@ -439,9 +437,8 @@ public:
DownExit _downExit;
RightExit _rightExit;
SequenceManager _sequenceManager;
- int _field1488;
+ int _newSceneMode;
int _sceneAreas[4];
- int _field1492;
Scene3375();
virtual void postInit(SceneObjectList *OwnerList = NULL);
@@ -465,7 +462,7 @@ class Scene3385 : public SceneExt {
virtual bool startAction(CursorType action, Event &event);
};
- class Exit1 : public SceneExit {
+ class SouthExit : public SceneExit {
public:
virtual void changeScene();
};
@@ -485,11 +482,11 @@ public:
Companion2 _companion2;
Webbster _webbster;
Door _door;
- Exit1 _exit1;
+ SouthExit _southExit;
Action1 _action1;
SequenceManager _sequenceManager;
- int _field11B2;
+ int _playerStrip;
Scene3385();
virtual void postInit(SceneObjectList *OwnerList = NULL);
@@ -531,7 +528,7 @@ public:
Action1 _action1;
SequenceManager _sequenceManager;
- int _field142E;
+ int _playerStrip;
Scene3395();
virtual void postInit(SceneObjectList *OwnerList = NULL);
@@ -551,12 +548,11 @@ public:
SceneActor _companion2;
SceneActor _webbster;
SceneActor _teal;
- SceneActor _actor5;
- SceneActor _actor6;
- SceneActor _actor7;
- SceneActor _actor8;
+ SceneActor _door;
+ SceneActor _manholeCover;
+ SceneActor _sapphire;
SequenceManager _sequenceManager;
- int16 _field157C;
+ bool _soundFaded;
Scene3400();
virtual void postInit(SceneObjectList *OwnerList = NULL);
@@ -568,114 +564,104 @@ public:
class Scene3500 : public SceneExt {
class Action1: public Action {
public:
- int _field1E;
- int _field20;
- int _field22;
- int _field24;
+ int _direction;
+ bool _headingRightFl;
+ bool _turningFl;
Action1();
virtual void synchronize(Serializer &s);
- void sub108670(int arg1);
- void sub108732(int arg1);
+ void handleHorzButton(int direction);
+ void turnShuttle(bool arg1);
virtual void signal();
virtual void dispatch();
};
class Action2: public Action {
public:
- int _field1E;
+ int _direction;
Action2();
virtual void synchronize(Serializer &s);
- void sub10831F(int arg1);
+ void handleVertButton(int direction);
virtual void signal();
};
- class Item4 : public NamedHotspot {
+ class DirectionButton : public NamedHotspot {
public:
- int _field34;
+ int _movementId;
- Item4();
+ DirectionButton();
virtual void synchronize(Serializer &s);
virtual bool startAction(CursorType action, Event &event);
};
- class Actor7 : public SceneActor {
+ class Throttle : public SceneActor {
public:
- int _fieldA4;
- int _fieldA6;
- int _fieldA8;
- int _fieldAA;
- int _fieldAC;
- int _fieldAE;
+ Common::Point _pos;
+ int _deltaX;
+ int _deltaY;
+ int _slideDeltaY;
+ int _deltaMouseY;
- Actor7();
+ Throttle();
virtual void synchronize(Serializer &s);
- void sub109466(int arg1, int arg2, int arg3, int arg4, int arg5);
- void sub1094ED();
- void sub109663(int arg1);
- void sub109693(Common::Point Pt);
+ void init(int xp, int yp, int dx, int dy, int speed);
+ void updateSpeed();
+ void setSpeed(int arg1);
+ void changePosition(const Common::Point &pt);
virtual void process(Event &event);
virtual bool startAction(CursorType action, Event &event);
};
- class Actor8 : public SceneActor {
- public:
- // TODO: double check if nothing specific is present, then remove this class
- };
-
class MazeUI3500 : public MazeUI {
public:
- int cellFromX(int arg1);
- int cellFromY(int arg1);
+ int16 cellFromX(int arg1);
+ int16 cellFromY(int arg1);
int getCellFromMapXY(Common::Point pt);
bool setMazePosition2(Common::Point &p);
};
public:
Action1 _action1;
Action2 _action2;
- NamedHotspot _item1;
- NamedHotspot _item2;
- NamedHotspot _item3;
- Item4 _item4;
- Item4 _item5;
- Item4 _item6;
- Item4 _item7;
+ NamedHotspot _background;
+ NamedHotspot _outsideView;
+ NamedHotspot _mapScreen;
+ DirectionButton _pitchDown;
+ DirectionButton _turnLeft;
+ DirectionButton _pitchUp;
+ DirectionButton _turnRight;
// Glyph of vessel on top of the maze ui
- SceneActor _actor1;
- SceneActor _actor2;
- SceneActor _actor3;
- SceneActor _actor4;
- SceneActor _actor5;
- SceneActor _actor6;
- Actor7 _actor7;
- Actor8 _actor8;
- Actor8 _actor9;
+ SceneActor _shuttle;
+ SceneActor _verticalSpeedDisplay;
+ SceneActor _horizontalSpeedDisplay;
+ SceneActor _symbolVertical;
+ SceneActor _symbolLeft;
+ SceneActor _symbolRight;
+ Throttle _throttle;
+ SceneActor _tunnelVertCircle;
+ SceneActor _tunnelHorzCircle;
ASoundExt _aSound1;
MazeUI3500 _mazeUI;
SequenceManager _sequenceManager;
- int _fieldAF8;
- int _fieldB9E;
+ int _moverVertX;
+ int _moverHorzX;
PaletteRotation *_rotation;
int _mazeChangeAmount;
- int _field1270;
- int _field1272;
- int _field1274;
+ int _speed;
+ bool _updateIdxChangeFl;
int _mazeDirection;
- int _field1278;
+ int _nextMove;
Common::Point _mazePosition;
- int _field127E;
- int _field1280;
- int _field1282;
- int _field1284;
- int _field1286;
+ bool _postFixupFl;
+ int _exitCounter;
+ bool _directionChangesEnabled;
Scene3500();
- void sub107F71(int arg1);
+ void doMovement(int id);
virtual void postInit(SceneObjectList *OwnerList = NULL);
virtual void remove();
@@ -688,7 +674,8 @@ public:
class Scene3600 : public SceneExt {
class Action3600: public ActionExt {
public:
- int _field1E, _field20;
+ bool _part2Fl;
+ int _fadePct;
Action3600();
virtual void synchronize(Serializer &s);
@@ -699,7 +686,7 @@ class Scene3600 : public SceneExt {
virtual void signal();
};
- class Item5 : public NamedHotspot {
+ class LightShaft : public NamedHotspot {
public:
virtual bool startAction(CursorType action, Event &event);
};
@@ -715,23 +702,20 @@ public:
SpeakerMiranda3600 _mirandaSpeaker;
SpeakerTeal3600 _tealSpeaker;
SpeakerProtector3600 _protectorSpeaker;
- NamedHotspot _item1;
- NamedHotspot _item2;
- NamedHotspot _item3;
- NamedHotspot _item4;
- Item5 _item5;
- SceneActor _actor1;
- SceneActor _actor2;
- SceneActor _actor3;
- SceneActor _actor4;
- SceneActor _actor5;
- SceneActor _actor6;
- SceneActor _actor7;
- SceneActor _actor8;
- SceneActor _actor9;
- SceneActor _actor10;
- SceneActor _actor11;
- SceneActor _actor12;
+ NamedHotspot _background;
+ NamedHotspot _console;
+ NamedHotspot _tapestry1;
+ NamedHotspot _tapestry2;
+ LightShaft _lightShaft;
+ SceneActor _protector3400;
+ SceneActor _steppingDisk;
+ SceneActor _consoleLights;
+ SceneActor _webbster;
+ SceneActor _teal;
+ SceneActor _door3400;
+ SceneActor _quinn;
+ SceneActor _seeker;
+ SceneActor _miranda;
Protector _protector;
SequenceManager _sequenceManager1;
SequenceManager _sequenceManager2;
@@ -739,10 +723,8 @@ public:
SequenceManager _sequenceManager4;
ScenePalette _palette1;
- int _field2548;
- int _field254A;
- int _field254C;
- int _field254E;
+ bool _tealDead;
+ bool _lightEntered;
bool _ghoulTeleported;
Scene3600();
@@ -763,7 +745,7 @@ public:
SceneActor _seeker;
SceneActor _miranda;
SceneActor _webbster;
- SceneActor _actor5;
+ SceneActor _teleportPad;
SequenceManager _sequenceManager;
virtual void postInit(SceneObjectList *OwnerList = NULL);
@@ -793,15 +775,15 @@ class Scene3800 : public SceneExt {
};
public:
- SceneObject _object1;
- SceneObject _object2;
- SceneActor _actor1;
+ SceneObject _balloon;
+ SceneObject _harness;
+ SceneActor _quinnShadow;
NamedHotspot _background;
NorthExit _northExit;
EastExit _eastExit;
SouthExit _southExit;
WestExit _westExit;
- Rect _rect1;
+ Rect _skylineRect;
SequenceManager _sequenceManager1;
int _desertDirection;
@@ -842,14 +824,14 @@ class Scene3900 : public SceneExt {
virtual void changeScene();
};
public:
- SceneActor _actor1;
- NamedHotspot _item1;
+ SceneActor _quinnShadow;
+ NamedHotspot _background;
NorthExit _northExit;
EastExit _eastExit;
SouthExit _southExit;
WestExit _westExit;
- Exit5 _exit5;
- Rect _rect1;
+ Exit5 _westEnterForest;
+ Rect _skylineRect;
virtual void postInit(SceneObjectList *OwnerList = NULL);
virtual void signal();
diff --git a/engines/tsage/ringworld2/ringworld2_speakers.cpp b/engines/tsage/ringworld2/ringworld2_speakers.cpp
index a43938230e..016242edd1 100644
--- a/engines/tsage/ringworld2/ringworld2_speakers.cpp
+++ b/engines/tsage/ringworld2/ringworld2_speakers.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope 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.
@@ -36,11 +36,19 @@ namespace Ringworld2 {
VisualSpeaker::VisualSpeaker(): Speaker() {
_delayAmount = 0;
+ _voiceDelayAmount = 0;
_frameNumber = R2_GLOBALS._events.getFrameNumber();
_color1 = 8;
_color2 = 0;
_displayMode = 0;
_speakerMode = 0;
+
+ _object2 = nullptr;
+ _fieldF8 = 0;
+ _soundId = 0;
+ _removeObject = false;
+ _numFrames = 0;
+ _voiceFrameNumber = 0;
}
void VisualSpeaker::remove() {
@@ -63,9 +71,10 @@ void VisualSpeaker::remove() {
}
void VisualSpeaker::signal() {
- // TODO: _action->_field18 = 1;
+ // TODO: Handle _field18 if used in Action. It looks only used in the original in remove()
+ // _action->_field18 = 1;
if (_speakerMode == 0xff)
- proc16();
+ stopSpeaking();
_speakerMode = 0;
if (_numFrames) {
@@ -75,12 +84,11 @@ void VisualSpeaker::signal() {
_fieldF8 = 1;
}
- if ((R2_GLOBALS._speechSubtitles & SPEECH_TEXT) || _soundId)
+ if ((R2_GLOBALS._speechSubtitles & SPEECH_TEXT) || !_soundId)
_sceneText.show();
if ((R2_GLOBALS._speechSubtitles & SPEECH_VOICE) && _soundId) {
- // TODO: Check global that is passed
- setFrame2(/* word_55F90 */ 1);
+ setVoiceFrame(1);
}
} else if (_action && _object2) {
_action->setDelay(1);
@@ -92,6 +100,7 @@ void VisualSpeaker::signal() {
void VisualSpeaker::dispatch() {
uint32 frameNumber = R2_GLOBALS._events.getFrameNumber();
+ assert(_action);
// Delay check for character animation
if (_delayAmount) {
@@ -108,14 +117,14 @@ void VisualSpeaker::dispatch() {
}
// Delay check for voice
- if (_delayAmount2) {
- if (frameNumber >= _frameNumber2) {
- _delayAmount2 = _delayAmount2 - (_frameNumber2 - frameNumber);
- _frameNumber2 = frameNumber;
-
- if (_delayAmount2 <= 0) {
- _delayAmount2 = 0;
- if (R2_GLOBALS._playStream.play(0, NULL)) {
+ if (_voiceDelayAmount) {
+ if (frameNumber >= _voiceFrameNumber) {
+ _voiceDelayAmount = _voiceDelayAmount - (frameNumber - _voiceFrameNumber);
+ _voiceFrameNumber = frameNumber;
+
+ if (_voiceDelayAmount <= 0) {
+ _voiceDelayAmount = 0;
+ if (R2_GLOBALS._playStream.play(_soundId, NULL)) {
_numFrames = 2;
_soundId = 0;
} else {
@@ -132,6 +141,7 @@ void VisualSpeaker::dispatch() {
_object1.setFrame(1);
if (!(R2_GLOBALS._speechSubtitles & SPEECH_TEXT)) {
+ // Don't bother waiting for a mouse click to start the next speech segment
_action->setDelay(1);
}
}
@@ -149,8 +159,8 @@ void VisualSpeaker::synchronize(Serializer &s) {
s.syncAsSint16LE(_numFrames);
s.syncAsSint16LE(_delayAmount);
s.syncAsUint32LE(_frameNumber);
- s.syncAsSint16LE(_delayAmount2);
- s.syncAsUint32LE(_frameNumber2);
+ s.syncAsSint16LE(_voiceDelayAmount);
+ s.syncAsUint32LE(_voiceFrameNumber);
}
void VisualSpeaker::setText(const Common::String &msg) {
@@ -212,7 +222,7 @@ void VisualSpeaker::setText(const Common::String &msg) {
_sceneText.fixPriority(256);
// If subtitles are turned off, don't show the text
- if ((R2_GLOBALS._speechSubtitles & SPEECH_VOICE) &&
+ if ((R2_GLOBALS._speechSubtitles & SPEECH_VOICE) &&
!(R2_GLOBALS._speechSubtitles & SPEECH_TEXT)) {
_sceneText.hide();
}
@@ -244,13 +254,18 @@ void VisualSpeaker::setText(const Common::String &msg) {
_sceneText.hide();
} else {
if ((R2_GLOBALS._speechSubtitles & SPEECH_VOICE) && _soundId) {
- if (!R2_GLOBALS._playStream.play(_soundId, NULL))
+ if (!R2_GLOBALS._playStream.play(_soundId, NULL)) {
+ // Couldn't play voice, so fall back on showing text
_sceneText.show();
+ } else {
+ _numFrames = 2;
+ _soundId = 0;
+ }
}
}
}
-void VisualSpeaker::proc16() {
+void VisualSpeaker::stopSpeaking() {
R2_GLOBALS._playStream.stop();
_speakerMode = 0;
_object1.remove();
@@ -266,9 +281,9 @@ void VisualSpeaker::setFrame(int numFrames) {
_frameNumber = R2_GLOBALS._events.getFrameNumber();
}
-void VisualSpeaker::setFrame2(int numFrames) {
- _delayAmount2 = numFrames;
- _frameNumber2 = R2_GLOBALS._events.getFrameNumber();
+void VisualSpeaker::setVoiceFrame(int numFrames) {
+ _voiceDelayAmount = numFrames;
+ _voiceFrameNumber = R2_GLOBALS._events.getFrameNumber();
}
void VisualSpeaker::setDelay(int delay) {
@@ -303,12 +318,12 @@ SpeakerCaptain3210::SpeakerCaptain3210() {
_numFrames = 0;
}
-void SpeakerCaptain3210::proc15() {
+void SpeakerCaptain3210::animateSpeaker() {
int v = _speakerMode;
Scene3210 *scene = (Scene3210 *)R2_GLOBALS._sceneManager._scene;
if (!_object2) {
- _object2 = &scene->_actor1;
+ _object2 = &scene->_captain;
_object2->hide();
_object1.postInit();
_object1.setPosition(_object2->_position);
@@ -320,7 +335,8 @@ void SpeakerCaptain3210::proc15() {
if (v == 0) {
_object1.animate(ANIM_MODE_2, NULL);
} else {
- ((SceneItem *)_action)->_sceneRegionId = 0;
+ ((StripManager *)_action)->_useless = 0;
+
_object1.setup(4060, (_object2->_strip * 2) - 1, 1);
_object1.animate(ANIM_MODE_5, this);
}
@@ -358,7 +374,7 @@ SpeakerChief1100::SpeakerChief1100() {
_numFrames = 0;
}
-void SpeakerChief1100::proc15() {
+void SpeakerChief1100::animateSpeaker() {
int v = _speakerMode;
Scene1100 *scene = (Scene1100 *)R2_GLOBALS._sceneManager._scene;
@@ -378,18 +394,21 @@ void SpeakerChief1100::proc15() {
_object1.animate(ANIM_MODE_2, NULL);
break;
case 1:
- ((SceneItem *)_action)->_sceneRegionId = 0;
+ ((StripManager *)_action)->_useless = 0;
+
_object1.setup(4080, 1, 1);
_object1.animate(ANIM_MODE_5, this);
break;
case 2:
- ((SceneItem *)_action)->_sceneRegionId = 0;
+ ((StripManager *)_action)->_useless = 0;
+
_object1.setup(4080, 3, 1);
_object1.animate(ANIM_MODE_5, this);
break;
case 100:
_numFrames = 0;
- ((SceneItem *)_action)->_sceneRegionId = 0;
+ ((StripManager *)_action)->_useless = 0;
+
_object1.setStrip(_object1._strip - 1);
_object1.setFrame(_object1.getFrameCount());
_object1.animate(ANIM_MODE_6, this);
@@ -416,7 +435,7 @@ SpeakerGuard::SpeakerGuard() {
_numFrames = 0;
}
-void SpeakerGuard2800::proc15() {
+void SpeakerGuard2800::animateSpeaker() {
int v = _speakerMode;
Scene2800 *scene = (Scene2800 *)R2_GLOBALS._sceneManager._scene;
@@ -433,7 +452,8 @@ void SpeakerGuard2800::proc15() {
if (v == 0) {
_object1.animate(ANIM_MODE_2, NULL);
} else {
- ((SceneItem *)_action)->_sceneRegionId = 0;
+ ((StripManager *)_action)->_useless = 0;
+
_object1.setZoom(75);
_object1.setup(4060, 3, 1);
_object1.animate(ANIM_MODE_5, this);
@@ -456,12 +476,12 @@ SpeakerJocko::SpeakerJocko() {
_numFrames = 0;
}
-void SpeakerJocko3200::proc15() {
+void SpeakerJocko3200::animateSpeaker() {
int v = _speakerMode;
Scene3200 *scene = (Scene3200 *)R2_GLOBALS._sceneManager._scene;
if (!_object2) {
- _object2 = &scene->_actor2;
+ _object2 = &scene->_jocko;
_object2->hide();
_object1.postInit();
_object1.setPosition(_object2->_position);
@@ -473,18 +493,19 @@ void SpeakerJocko3200::proc15() {
if (v == 0) {
_object1.animate(ANIM_MODE_2, NULL);
} else {
- ((SceneItem *)_action)->_sceneRegionId = 0;
+ ((StripManager *)_action)->_useless = 0;
+
_object1.setup(4060, (_object2->_strip * 2) - 1, 1);
_object1.animate(ANIM_MODE_5, this);
}
}
-void SpeakerJocko3220::proc15() {
+void SpeakerJocko3220::animateSpeaker() {
int v = _speakerMode;
Scene3220 *scene = (Scene3220 *)R2_GLOBALS._sceneManager._scene;
if (!_object2) {
- _object2 = &scene->_actor2;
+ _object2 = &scene->_jocko;
_object2->hide();
_object1.postInit();
_object1.setPosition(_object2->_position);
@@ -496,18 +517,19 @@ void SpeakerJocko3220::proc15() {
if (v == 0) {
_object1.animate(ANIM_MODE_2, NULL);
} else {
- ((SceneItem *)_action)->_sceneRegionId = 0;
+ ((StripManager *)_action)->_useless = 0;
+
_object1.setup(4060, (_object2->_strip * 2) - 1, 1);
_object1.animate(ANIM_MODE_5, this);
}
}
-void SpeakerJocko3230::proc15() {
+void SpeakerJocko3230::animateSpeaker() {
int v = _speakerMode;
Scene3230 *scene = (Scene3230 *)R2_GLOBALS._sceneManager._scene;
if (!_object2) {
- _object2 = &scene->_actor2;
+ _object2 = &scene->_jocko;
_object2->hide();
_object1.postInit();
_object1.setPosition(_object2->_position);
@@ -519,7 +541,8 @@ void SpeakerJocko3230::proc15() {
if (v == 0) {
_object1.animate(ANIM_MODE_2, NULL);
} else {
- ((SceneItem *)_action)->_sceneRegionId = 0;
+ ((StripManager *)_action)->_useless = 0;
+
_object1.setup(4060, (_object2->_strip * 2) - 1, 1);
_object1.animate(ANIM_MODE_5, this);
}
@@ -541,7 +564,7 @@ SpeakerMiranda::SpeakerMiranda(): VisualSpeaker() {
_numFrames = 0;
}
-void SpeakerMiranda300::proc15() {
+void SpeakerMiranda300::animateSpeaker() {
int v = _speakerMode;
if (!_object2) {
@@ -564,13 +587,13 @@ void SpeakerMiranda300::proc15() {
_object1.animate(ANIM_MODE_2, NULL);
} else if (v == 100) {
_numFrames = 0;
- ((SceneItem *)_action)->_sceneRegionId = 0;
+ ((StripManager *)_action)->_useless = 0;
_object1.setStrip(_object1._strip - 1);
_object1.setFrame(_object1.getFrameCount());
_object1.animate(ANIM_MODE_6, this);
} else {
- ((SceneItem *)_action)->_sceneRegionId = 0;
+ ((StripManager *)_action)->_useless = 0;
if (v == 4) {
_object1.setup(304, 5, 1);
@@ -581,12 +604,12 @@ void SpeakerMiranda300::proc15() {
}
}
-void SpeakerMiranda1625::proc15() {
+void SpeakerMiranda1625::animateSpeaker() {
int v = _speakerMode;
if (!_object2) {
Scene1625 *scene = (Scene1625 *)R2_GLOBALS._sceneManager._scene;
- _object2 = &scene->_actor3;
+ _object2 = &scene->_mirandaMouth;
_object2->hide();
_object1.postInit();
_object1.setPosition(Common::Point(196, 65));
@@ -598,13 +621,14 @@ void SpeakerMiranda1625::proc15() {
if (v == 0) {
_object1.animate(ANIM_MODE_2, NULL);
} else {
- ((SceneItem *)_action)->_sceneRegionId = 0;
+ ((StripManager *)_action)->_useless = 0;
+
_object1.setup(1627, 3, 1);
_object1.animate(ANIM_MODE_5, this);
}
}
-void SpeakerMiranda3255::proc15() {
+void SpeakerMiranda3255::animateSpeaker() {
int v = _speakerMode;
if (!_object2) {
@@ -619,13 +643,14 @@ void SpeakerMiranda3255::proc15() {
if (v == 0) {
_object1.animate(ANIM_MODE_2, NULL);
} else {
- ((SceneItem *)_action)->_sceneRegionId = 0;
+ ((StripManager *)_action)->_useless = 0;
+
_object1.setup(3257, 5, 1);
_object1.animate(ANIM_MODE_5, this);
}
}
-void SpeakerMiranda3375::proc15() {
+void SpeakerMiranda3375::animateSpeaker() {
Scene3375 *scene = (Scene3375 *)R2_GLOBALS._sceneManager._scene;
int v = _speakerMode;
@@ -640,7 +665,7 @@ void SpeakerMiranda3375::proc15() {
_object1.postInit();
_object1.setPosition(_object2->_position);
_object1._numFrames = 7;
- _object1._effect = 1;
+ _object1._effect = EFFECT_SHADED;
_object1.changeZoom(-1);
if (scene->_companion1._position.y != 163)
@@ -665,7 +690,8 @@ void SpeakerMiranda3375::proc15() {
_object1.animate(ANIM_MODE_2, NULL);
break;
case 1:
- ((SceneItem *)_action)->_sceneRegionId = 0;
+ ((StripManager *)_action)->_useless = 0;
+
_object1.setup(4051, 5, 1);
_object1.animate(ANIM_MODE_5, this);
break;
@@ -675,7 +701,7 @@ void SpeakerMiranda3375::proc15() {
}
}
-void SpeakerMiranda3385::proc15() {
+void SpeakerMiranda3385::animateSpeaker() {
Scene3385 *scene = (Scene3385 *)R2_GLOBALS._sceneManager._scene;
int v = _speakerMode;
@@ -690,7 +716,7 @@ void SpeakerMiranda3385::proc15() {
_object1.postInit();
_object1.setPosition(_object2->_position);
_object1._numFrames = 7;
- _object1._effect = 1;
+ _object1._effect = EFFECT_SHADED;
_object1.changeZoom(-1);
if (R2_GLOBALS._sceneManager._previousScene == 3375)
@@ -714,7 +740,8 @@ void SpeakerMiranda3385::proc15() {
_object1.animate(ANIM_MODE_2, NULL);
break;
case 1:
- ((SceneItem *)_action)->_sceneRegionId = 0;
+ ((StripManager *)_action)->_useless = 0;
+
_object1.setup(4051, 5, 1);
_object1.animate(ANIM_MODE_5, this);
break;
@@ -724,7 +751,7 @@ void SpeakerMiranda3385::proc15() {
}
}
-void SpeakerMiranda3395::proc15() {
+void SpeakerMiranda3395::animateSpeaker() {
Scene3395 *scene = (Scene3395 *)R2_GLOBALS._sceneManager._scene;
int v = _speakerMode;
@@ -739,7 +766,7 @@ void SpeakerMiranda3395::proc15() {
_object1.postInit();
_object1.setPosition(_object2->_position);
_object1._numFrames = 7;
- _object1._effect = 1;
+ _object1._effect = EFFECT_SHADED;
_object1.changeZoom(-1);
if (R2_GLOBALS._sceneManager._previousScene == 3385)
@@ -764,7 +791,8 @@ void SpeakerMiranda3395::proc15() {
_object1.animate(ANIM_MODE_2, NULL);
break;
case 1:
- ((SceneItem *)_action)->_sceneRegionId = 0;
+ ((StripManager *)_action)->_useless = 0;
+
_object1.setup(4051, 5, 1);
_object1.animate(ANIM_MODE_5, this);
break;
@@ -774,7 +802,7 @@ void SpeakerMiranda3395::proc15() {
}
}
-void SpeakerMiranda3400::proc15() {
+void SpeakerMiranda3400::animateSpeaker() {
Scene3400 *scene = (Scene3400 *)R2_GLOBALS._sceneManager._scene;
int v = _speakerMode;
@@ -789,7 +817,7 @@ void SpeakerMiranda3400::proc15() {
_object1.postInit();
_object1.setPosition(_object2->_position);
_object1._numFrames = 7;
- _object1._effect = 1;
+ _object1._effect = EFFECT_SHADED;
_object1.changeZoom(-1);
R2_GLOBALS._player.disableControl();
R2_GLOBALS._events.setCursor(CURSOR_CROSSHAIRS);
@@ -803,12 +831,14 @@ void SpeakerMiranda3400::proc15() {
_object1.animate(ANIM_MODE_2, NULL);
break;
case 1:
- ((SceneItem *)_action)->_sceneRegionId = 0;
+ ((StripManager *)_action)->_useless = 0;
+
_object1.setup(4051, 5, 1);
_object1.animate(ANIM_MODE_5, this);
break;
case 2:
- ((SceneItem *)_action)->_sceneRegionId = 0;
+ ((StripManager *)_action)->_useless = 0;
+
_object1.setup(4050, 3, 1);
_object1.animate(ANIM_MODE_5, this);
break;
@@ -818,7 +848,7 @@ void SpeakerMiranda3400::proc15() {
}
}
-void SpeakerMiranda3600::proc15() {
+void SpeakerMiranda3600::animateSpeaker() {
Scene3600 *scene = (Scene3600 *)R2_GLOBALS._sceneManager._scene;
int v = _speakerMode;
@@ -827,13 +857,13 @@ void SpeakerMiranda3600::proc15() {
if (R2_GLOBALS._player._characterIndex == R2_MIRANDA)
_object2 = &R2_GLOBALS._player;
else
- _object2 = &scene->_actor12;
+ _object2 = &scene->_miranda;
_object2->hide();
_object1.postInit();
_object1.setPosition(_object2->_position);
_object1._numFrames = 7;
- _object1._effect = 1;
+ _object1._effect = EFFECT_SHADED;
_object1.changeZoom(-1);
R2_GLOBALS._player.disableControl();
R2_GLOBALS._events.setCursor(CURSOR_CROSSHAIRS);
@@ -849,12 +879,14 @@ void SpeakerMiranda3600::proc15() {
_object1.animate(ANIM_MODE_2, NULL);
break;
case 1:
- ((SceneItem *)_action)->_sceneRegionId = 0;
+ ((StripManager *)_action)->_useless = 0;
+
_object1.setup(4051, 1, 1);
_object1.animate(ANIM_MODE_5, this);
break;
case 2:
- ((SceneItem *)_action)->_sceneRegionId = 0;
+ ((StripManager *)_action)->_useless = 0;
+
_object1.setup(4050, 1, 1);
_object1.animate(ANIM_MODE_5, this);
break;
@@ -864,7 +896,7 @@ void SpeakerMiranda3600::proc15() {
}
}
-void SpeakerMiranda3700::proc15() {
+void SpeakerMiranda3700::animateSpeaker() {
Scene3700 *scene = (Scene3700 *)R2_GLOBALS._sceneManager._scene;
int v = _speakerMode;
@@ -889,7 +921,8 @@ void SpeakerMiranda3700::proc15() {
_object1.animate(ANIM_MODE_2, NULL);
break;
case 1:
- ((SceneItem *)_action)->_sceneRegionId = 0;
+ ((StripManager *)_action)->_useless = 0;
+
scene->_quinn.setup(10, 6, 1);
scene->_seeker.setup(20, 5, 1);
_object2->setup(30, 1, 1);
@@ -898,13 +931,15 @@ void SpeakerMiranda3700::proc15() {
_object1.animate(ANIM_MODE_5, this);
break;
case 2:
- ((SceneItem *)_action)->_sceneRegionId = 0;
+ ((StripManager *)_action)->_useless = 0;
+
scene->_miranda.setup(30, 8, 1);
_object1.setup(4052, 3, 1);
_object1.animate(ANIM_MODE_5, this);
break;
case 3:
- ((SceneItem *)_action)->_sceneRegionId = 0;
+ ((StripManager *)_action)->_useless = 0;
+
scene->_seeker.setup(20, 1, 1);
scene->_miranda.setup(30, 1, 1);
_object1.setup(4051, 7, 1);
@@ -932,7 +967,7 @@ SpeakerNej::SpeakerNej() {
_numFrames = 0;
}
-void SpeakerNej2700::proc15() {
+void SpeakerNej2700::animateSpeaker() {
int v = _speakerMode;
Scene2700 *scene = (Scene2700 *)R2_GLOBALS._sceneManager._scene;
@@ -949,7 +984,8 @@ void SpeakerNej2700::proc15() {
if (v == 0) {
_object1.animate(ANIM_MODE_2, NULL);
} else {
- ((SceneItem *)_action)->_sceneRegionId = 0;
+ ((StripManager *)_action)->_useless = 0;
+
switch (_object2->_visage) {
case 2701:
_object1.setup(4022, 3, 1);
@@ -967,7 +1003,7 @@ void SpeakerNej2700::proc15() {
}
}
-void SpeakerNej2750::proc15() {
+void SpeakerNej2750::animateSpeaker() {
int v = _speakerMode;
Scene2750 *scene = (Scene2750 *)R2_GLOBALS._sceneManager._scene;
@@ -984,7 +1020,8 @@ void SpeakerNej2750::proc15() {
if (v == 0) {
_object1.animate(ANIM_MODE_2, NULL);
} else {
- ((SceneItem *)_action)->_sceneRegionId = 0;
+ ((StripManager *)_action)->_useless = 0;
+
switch (_object2->_visage) {
case 2705:
_object1.setup(4022, 7, 1);
@@ -999,12 +1036,12 @@ void SpeakerNej2750::proc15() {
}
}
-void SpeakerNej2800::proc15() {
+void SpeakerNej2800::animateSpeaker() {
int v = _speakerMode;
- Scene2750 *scene = (Scene2750 *)R2_GLOBALS._sceneManager._scene;
+ Scene2800 *scene = (Scene2800 *)R2_GLOBALS._sceneManager._scene;
if (!_object2) {
- _object2 = &scene->_actor2;
+ _object2 = &scene->_nej;
_object2->hide();
_object1.postInit();
_object1.setPosition(_object2->_position);
@@ -1016,10 +1053,11 @@ void SpeakerNej2800::proc15() {
if (v == 0) {
_object1.animate(ANIM_MODE_2, NULL);
} else {
- ((SceneItem *)_action)->_sceneRegionId = 0;
+ ((StripManager *)_action)->_useless = 0;
+
_object1.setup(4023, 3, 1);
if (_object2->_visage == 2801)
- _object1.setPosition(Common::Point(R2_GLOBALS._player._position.x - 12, R2_GLOBALS._player._position.y));
+ _object1.setPosition(Common::Point(_object2->_position.x - 12, _object2->_position.y));
_object1.animate(ANIM_MODE_5, this);
}
}
@@ -1040,7 +1078,7 @@ SpeakerPharisha::SpeakerPharisha(): VisualSpeaker() {
_numFrames = 0;
}
-void SpeakerPharisha2435::proc15() {
+void SpeakerPharisha2435::animateSpeaker() {
int v = _speakerMode;
Scene2435 *scene = (Scene2435 *)R2_GLOBALS._sceneManager._scene;
@@ -1054,7 +1092,8 @@ void SpeakerPharisha2435::proc15() {
if (v == 0) {
_object1.animate(ANIM_MODE_2, NULL);
} else {
- ((SceneItem *)_action)->_sceneRegionId = 0;
+ ((StripManager *)_action)->_useless = 0;
+
_object1.setup(4098, 5, 1);
_object1.animate(ANIM_MODE_5, this);
}
@@ -1076,12 +1115,12 @@ SpeakerPrivate3210::SpeakerPrivate3210() {
_numFrames = 0;
}
-void SpeakerPrivate3210::proc15() {
+void SpeakerPrivate3210::animateSpeaker() {
int v = _speakerMode;
Scene3210 *scene = (Scene3210 *)R2_GLOBALS._sceneManager._scene;
if (!_object2) {
- _object2 = &scene->_actor2;
+ _object2 = &scene->_private;
_object2->hide();
_object1.postInit();
_object1.setPosition(_object2->_position);
@@ -1093,7 +1132,8 @@ void SpeakerPrivate3210::proc15() {
if (v == 0) {
_object1.animate(ANIM_MODE_2, NULL);
} else {
- ((SceneItem *)_action)->_sceneRegionId = 0;
+ ((StripManager *)_action)->_useless = 0;
+
_object1.setup(4060, (_object2->_strip * 2) - 1, 1);
_object1.animate(ANIM_MODE_5, this);
}
@@ -1115,7 +1155,7 @@ SpeakerProtector3600::SpeakerProtector3600() {
_numFrames = 0;
}
-void SpeakerProtector3600::proc15() {
+void SpeakerProtector3600::animateSpeaker() {
int v = _speakerMode;
Scene3600 *scene = (Scene3600 *)R2_GLOBALS._sceneManager._scene;
@@ -1125,7 +1165,7 @@ void SpeakerProtector3600::proc15() {
_object1.postInit();
_object1.setPosition(_object2->_position);
_object1._numFrames = 7;
- _object1._effect = 1;
+ _object1._effect = EFFECT_SHADED;
_object1.changeZoom(-1);
R2_GLOBALS._player.disableControl();
@@ -1142,7 +1182,8 @@ void SpeakerProtector3600::proc15() {
_object1.animate(ANIM_MODE_2, NULL);
break;
case 1:
- ((SceneItem *)_action)->_sceneRegionId = 0;
+ ((StripManager *)_action)->_useless = 0;
+
if (scene->_sceneMode != 3324) {
_object1.setup(4125, 3, 1);
_object1.animate(ANIM_MODE_5, this);
@@ -1176,7 +1217,7 @@ SpeakerQuinn::SpeakerQuinn(): VisualSpeaker() {
_numFrames = 0;
}
-void SpeakerQuinn300::proc15() {
+void SpeakerQuinn300::animateSpeaker() {
int v = _speakerMode;
if (!_object2) {
@@ -1197,16 +1238,16 @@ void SpeakerQuinn300::proc15() {
_object1.animate(ANIM_MODE_2, NULL);
} else if (v == 100) {
_numFrames = 0;
- ((SceneItem *)_action)->_sceneRegionId = 0;
+ ((StripManager *)_action)->_useless = 0;
_object1.setStrip(_object1._strip - 1);
_object1.setFrame(_object1.getFrameCount());
_object1.animate(ANIM_MODE_6, this);
} else {
- ((SceneItem *)_action)->_sceneRegionId = 0;
+ ((StripManager *)_action)->_useless = 0;
switch (_object2->_visage) {
- case 10:
+ case 10:
_object1.setup((v - 1) / 4 + 4010, ((v - ((v - 1) / 4 * 4) - 1) % 8) * 2 + 1, 1);
break;
case 302:
@@ -1223,7 +1264,7 @@ void SpeakerQuinn300::proc15() {
}
}
-void SpeakerQuinn500::proc15() {
+void SpeakerQuinn500::animateSpeaker() {
int v = _speakerMode;
if (!_object2) {
@@ -1249,7 +1290,7 @@ void SpeakerQuinn500::proc15() {
if (v == 0) {
_object1.animate(ANIM_MODE_2, NULL);
} else {
- ((SceneItem *)_action)->_sceneRegionId = 0;
+ ((StripManager *)_action)->_useless = 0;
switch (_object2->_visage) {
case 10:
@@ -1268,7 +1309,7 @@ void SpeakerQuinn500::proc15() {
}
}
-void SpeakerQuinn1100::proc15() {
+void SpeakerQuinn1100::animateSpeaker() {
int v = _speakerMode;
if (!_object2) {
@@ -1297,17 +1338,20 @@ void SpeakerQuinn1100::proc15() {
_object1.animate(ANIM_MODE_2, NULL);
break;
case 1:
- ((SceneItem *)_action)->_sceneRegionId = 0;
+ ((StripManager *)_action)->_useless = 0;
+
_object1.setup(1108, 7, 1);
_object1.animate(ANIM_MODE_5, this);
break;
case 2:
- ((SceneItem *)_action)->_sceneRegionId = 0;
+ ((StripManager *)_action)->_useless = 0;
+
_object1.setup(1109, 1, 1);
_object1.animate(ANIM_MODE_5, this);
break;
case 3:
- ((SceneItem *)_action)->_sceneRegionId = 0;
+ ((StripManager *)_action)->_useless = 0;
+
_object1.setup(1109, 5, 1);
_object1.animate(ANIM_MODE_5, this);
break;
@@ -1317,7 +1361,7 @@ void SpeakerQuinn1100::proc15() {
}
}
-void SpeakerQuinn2435::proc15() {
+void SpeakerQuinn2435::animateSpeaker() {
int v = _speakerMode;
if (!_object2) {
@@ -1337,14 +1381,15 @@ void SpeakerQuinn2435::proc15() {
if (v == 0) {
_object1.animate(ANIM_MODE_2, NULL);
} else {
- ((SceneItem *)_action)->_sceneRegionId = 0;
+ ((StripManager *)_action)->_useless = 0;
+
_object2->setStrip(7);
_object1.setup(2020, 5, 1);
_object1.animate(ANIM_MODE_5, this);
}
}
-void SpeakerQuinn2450::proc15() {
+void SpeakerQuinn2450::animateSpeaker() {
int v = _speakerMode;
if (!_object2) {
@@ -1364,7 +1409,8 @@ void SpeakerQuinn2450::proc15() {
if (v == 0) {
_object1.animate(ANIM_MODE_2, NULL);
} else {
- ((SceneItem *)_action)->_sceneRegionId = 0;
+ ((StripManager *)_action)->_useless = 0;
+
if (R2_GLOBALS.getFlag(61))
_object1.setup(2020, 3, 1);
else
@@ -1373,7 +1419,7 @@ void SpeakerQuinn2450::proc15() {
}
}
-void SpeakerQuinn2700::proc15() {
+void SpeakerQuinn2700::animateSpeaker() {
int v = _speakerMode;
if (!_object2) {
@@ -1389,7 +1435,8 @@ void SpeakerQuinn2700::proc15() {
if (v == 0) {
_object1.animate(ANIM_MODE_2, NULL);
} else {
- ((SceneItem *)_action)->_sceneRegionId = 0;
+ ((StripManager *)_action)->_useless = 0;
+
switch (_object2->_visage) {
case 19:
_object1.setup(4022, 5, 1);
@@ -1404,7 +1451,7 @@ void SpeakerQuinn2700::proc15() {
}
}
-void SpeakerQuinn2750::proc15() {
+void SpeakerQuinn2750::animateSpeaker() {
int v = _speakerMode;
if (!_object2) {
@@ -1420,13 +1467,14 @@ void SpeakerQuinn2750::proc15() {
if (v == 0) {
_object1.animate(ANIM_MODE_2, NULL);
} else {
- ((SceneItem *)_action)->_sceneRegionId = 0;
+ ((StripManager *)_action)->_useless = 0;
+
switch (_object2->_visage) {
case 19:
_object1.setup(4022, 5, 1);
break;
case 2752:
- _object1.setup(2752, 1, 1);
+ _object1.setup(2752, 3, 1);
break;
default:
break;
@@ -1435,7 +1483,7 @@ void SpeakerQuinn2750::proc15() {
}
}
-void SpeakerQuinn2800::proc15() {
+void SpeakerQuinn2800::animateSpeaker() {
int v = _speakerMode;
if (!_object2) {
@@ -1451,7 +1499,8 @@ void SpeakerQuinn2800::proc15() {
if (v == 0) {
_object1.animate(ANIM_MODE_2, NULL);
} else {
- ((SceneItem *)_action)->_sceneRegionId = 0;
+ ((StripManager *)_action)->_useless = 0;
+
switch (_object2->_visage) {
case 16:
_object1.setZoom(75);
@@ -1474,7 +1523,7 @@ void SpeakerQuinn2800::proc15() {
}
}
-void SpeakerQuinn3255::proc15() {
+void SpeakerQuinn3255::animateSpeaker() {
Scene3255 *scene = (Scene3255 *)R2_GLOBALS._sceneManager._scene;
int v = _speakerMode;
@@ -1491,13 +1540,14 @@ void SpeakerQuinn3255::proc15() {
if (v == 0) {
_object1.animate(ANIM_MODE_2, NULL);
} else {
- ((SceneItem *)_action)->_sceneRegionId = 0;
+ ((StripManager *)_action)->_useless = 0;
+
_object1.setup(3257, 3, 1);
_object1.animate(ANIM_MODE_5, this);
}
}
-void SpeakerQuinn3375::proc15() {
+void SpeakerQuinn3375::animateSpeaker() {
Scene3375 *scene = (Scene3375 *)R2_GLOBALS._sceneManager._scene;
int v = _speakerMode;
@@ -1514,7 +1564,7 @@ void SpeakerQuinn3375::proc15() {
_object1.postInit();
_object1.setPosition(_object2->_position);
_object1._numFrames = 7;
- _object1._effect = 1;
+ _object1._effect = EFFECT_SHADED;
_object1.changeZoom(-1);
if (scene->_companion1._position.y != 163)
@@ -1532,13 +1582,13 @@ void SpeakerQuinn3375::proc15() {
_object2->addMover(NULL);
}
-
switch (v) {
case 0:
_object1.animate(ANIM_MODE_2, NULL);
break;
case 1:
- ((SceneItem *)_action)->_sceneRegionId = 0;
+ ((StripManager *)_action)->_useless = 0;
+
_object1.setup(4010, 5, 1);
_object1.animate(ANIM_MODE_5, this);
break;
@@ -1548,7 +1598,7 @@ void SpeakerQuinn3375::proc15() {
}
}
-void SpeakerQuinn3385::proc15() {
+void SpeakerQuinn3385::animateSpeaker() {
Scene3385 *scene = (Scene3385 *)R2_GLOBALS._sceneManager._scene;
int v = _speakerMode;
@@ -1565,7 +1615,7 @@ void SpeakerQuinn3385::proc15() {
_object1.postInit();
_object1.setPosition(_object2->_position);
_object1._numFrames = 7;
- _object1._effect = 1;
+ _object1._effect = EFFECT_SHADED;
_object1.changeZoom(-1);
if (R2_GLOBALS._sceneManager._previousScene == 3375)
@@ -1583,13 +1633,13 @@ void SpeakerQuinn3385::proc15() {
_object2->addMover(NULL);
}
-
switch (v) {
case 0:
_object1.animate(ANIM_MODE_2, NULL);
break;
case 1:
- ((SceneItem *)_action)->_sceneRegionId = 0;
+ ((StripManager *)_action)->_useless = 0;
+
if (R2_GLOBALS._player._characterIndex == R2_SEEKER)
_object1.setup(4010, 3, 1);
else
@@ -1603,7 +1653,7 @@ void SpeakerQuinn3385::proc15() {
}
}
-void SpeakerQuinn3395::proc15() {
+void SpeakerQuinn3395::animateSpeaker() {
Scene3395 *scene = (Scene3395 *)R2_GLOBALS._sceneManager._scene;
int v = _speakerMode;
@@ -1620,7 +1670,7 @@ void SpeakerQuinn3395::proc15() {
_object1.postInit();
_object1.setPosition(_object2->_position);
_object1._numFrames = 7;
- _object1._effect = 1;
+ _object1._effect = EFFECT_SHADED;
_object1.changeZoom(-1);
if (R2_GLOBALS._sceneManager._previousScene == 3385)
@@ -1638,13 +1688,13 @@ void SpeakerQuinn3395::proc15() {
_object2->addMover(NULL);
}
-
switch (v) {
case 0:
_object1.animate(ANIM_MODE_2, NULL);
break;
case 1:
- ((SceneItem *)_action)->_sceneRegionId = 0;
+ ((StripManager *)_action)->_useless = 0;
+
if (R2_GLOBALS._player._characterIndex == R2_SEEKER)
_object1.setup(4010, 3, 1);
else
@@ -1658,7 +1708,7 @@ void SpeakerQuinn3395::proc15() {
}
}
-void SpeakerQuinn3400::proc15() {
+void SpeakerQuinn3400::animateSpeaker() {
Scene3400 *scene = (Scene3400 *)R2_GLOBALS._sceneManager._scene;
int v = _speakerMode;
@@ -1675,7 +1725,7 @@ void SpeakerQuinn3400::proc15() {
_object1.postInit();
_object1.setPosition(_object2->_position);
_object1._numFrames = 7;
- _object1._effect = 1;
+ _object1._effect = EFFECT_SHADED;
_object1.changeZoom(-1);
R2_GLOBALS._player.disableControl();
if (_object2->_mover)
@@ -1687,17 +1737,20 @@ void SpeakerQuinn3400::proc15() {
_object1.animate(ANIM_MODE_2, NULL);
break;
case 1:
- ((SceneItem *)_action)->_sceneRegionId = 0;
+ ((StripManager *)_action)->_useless = 0;
+
_object1.setup(4010, 5, 1);
_object1.animate(ANIM_MODE_5, NULL);
break;
case 2:
- ((SceneItem *)_action)->_sceneRegionId = 0;
+ ((StripManager *)_action)->_useless = 0;
+
_object1.setup(4010, 3, 1);
_object1.animate(ANIM_MODE_5, this);
break;
case 3:
- ((SceneItem *)_action)->_sceneRegionId = 0;
+ ((StripManager *)_action)->_useless = 0;
+
_object1.setup(4012, 3, 1);
_object1.animate(ANIM_MODE_5, this);
break;
@@ -1707,7 +1760,7 @@ void SpeakerQuinn3400::proc15() {
}
}
-void SpeakerQuinn3600::proc15() {
+void SpeakerQuinn3600::animateSpeaker() {
Scene3600 *scene = (Scene3600 *)R2_GLOBALS._sceneManager._scene;
int v = _speakerMode;
@@ -1716,12 +1769,12 @@ void SpeakerQuinn3600::proc15() {
if (R2_GLOBALS._player._characterIndex == R2_QUINN)
_object2 = &R2_GLOBALS._player;
else
- _object2 = &scene->_actor10;
+ _object2 = &scene->_quinn;
_object2->hide();
_object1.postInit();
_object1.setPosition(_object2->_position);
_object1._numFrames = 7;
- _object1._effect = 1;
+ _object1._effect = EFFECT_SHADED;
_object1.changeZoom(-1);
R2_GLOBALS._player.disableControl();
R2_GLOBALS._events.setCursor(CURSOR_CROSSHAIRS);
@@ -1735,17 +1788,20 @@ void SpeakerQuinn3600::proc15() {
_object1.animate(ANIM_MODE_2, NULL);
break;
case 1:
- ((SceneItem *)_action)->_sceneRegionId = 0;
+ ((StripManager *)_action)->_useless = 0;
+
_object1.setup(4021, 7, 1);
_object1.animate(ANIM_MODE_5, this);
break;
case 2:
- ((SceneItem *)_action)->_sceneRegionId = 0;
+ ((StripManager *)_action)->_useless = 0;
+
_object1.setup(4010, 1, 1);
_object1.animate(ANIM_MODE_5, this);
break;
case 3:
- ((SceneItem *)_action)->_sceneRegionId = 0;
+ ((StripManager *)_action)->_useless = 0;
+
_object1.setup(4012, 1, 1);
_object1.animate(ANIM_MODE_5, this);
break;
@@ -1773,7 +1829,7 @@ void SpeakerQuinn3700::setText(const Common::String &msg) {
VisualSpeaker::setText(msg);
}
-void SpeakerQuinn3700::proc15() {
+void SpeakerQuinn3700::animateSpeaker() {
Scene3700 *scene = (Scene3700 *)R2_GLOBALS._sceneManager._scene;
int v = _speakerMode;
@@ -1798,7 +1854,8 @@ void SpeakerQuinn3700::proc15() {
_object1.animate(ANIM_MODE_2, NULL);
break;
case 1:
- ((SceneItem *)_action)->_sceneRegionId = 0;
+ ((StripManager *)_action)->_useless = 0;
+
R2_GLOBALS._sound2.stop();
scene->_quinn.setup(10, 4, 1);
scene->_miranda.setup(30, 7, 1);
@@ -1806,14 +1863,16 @@ void SpeakerQuinn3700::proc15() {
_object1.animate(ANIM_MODE_5, this);
break;
case 2:
- ((SceneItem *)_action)->_sceneRegionId = 0;
+ ((StripManager *)_action)->_useless = 0;
+
scene->_seeker.setup(20, 1, 1);
scene->_miranda.setup(30, 1, 1);
_object1.setup(3702, 1, 1);
_object1.animate(ANIM_MODE_5, this);
break;
case 3:
- ((SceneItem *)_action)->_sceneRegionId = 0;
+ ((StripManager *)_action)->_useless = 0;
+
scene->_quinn.setup(10, 2, 1);
scene->_miranda.setup(30, 1, 1);
_object1.setup(4011, 1, 1);
@@ -1829,17 +1888,8 @@ void SpeakerQuinn3700::proc15() {
// Classes related to QUINNL
//----------------------------------------------------------------------------
-SpeakerQuinnL::SpeakerQuinnL(): VisualSpeaker() {
+SpeakerQuinnL::SpeakerQuinnL(): SpeakerQuinn() {
_speakerName = "QUINNL";
- _color1 = 35;
- _color2 = 0;
- _speakerMode = 0;
- _textWidth = 300;
- _hideObjects = false;
- _object2 = NULL;
- _displayMode = 1;
- _numFrames = 0;
- _fontNumber = 10;
}
//----------------------------------------------------------------------------
@@ -1858,12 +1908,12 @@ SpeakerRalf3245::SpeakerRalf3245() {
_numFrames = 0;
}
-void SpeakerRalf3245::proc15() {
+void SpeakerRalf3245::animateSpeaker() {
int v = _speakerMode;
Scene3245 *scene = (Scene3245 *)R2_GLOBALS._sceneManager._scene;
if (!_object2) {
- _object2 = &scene->_actor1;
+ _object2 = &scene->_ralf;
_object2->hide();
_object1.postInit();
_object1.setPosition(_object2->_position);
@@ -1875,7 +1925,8 @@ void SpeakerRalf3245::proc15() {
if (v == 0) {
_object1.animate(ANIM_MODE_2, NULL);
} else {
- ((SceneItem *)_action)->_sceneRegionId = 0;
+ ((StripManager *)_action)->_useless = 0;
+
switch (_object2->_visage) {
case 3100:
_object1.setup(4105, (_object2->_strip * 2) - 1, 1);
@@ -1910,12 +1961,12 @@ SpeakerRocko::SpeakerRocko() {
_numFrames = 0;
}
-void SpeakerRocko3200::proc15() {
+void SpeakerRocko3200::animateSpeaker() {
int v = _speakerMode;
Scene3200 *scene = (Scene3200 *)R2_GLOBALS._sceneManager._scene;
if (!_object2) {
- _object2 = &scene->_actor1;
+ _object2 = &scene->_rocko;
_object2->hide();
_object1.postInit();
_object1.setPosition(_object2->_position);
@@ -1927,18 +1978,19 @@ void SpeakerRocko3200::proc15() {
if (v == 0) {
_object1.animate(ANIM_MODE_2, NULL);
} else {
- ((SceneItem *)_action)->_sceneRegionId = 0;
+ ((StripManager *)_action)->_useless = 0;
+
_object1.setup(4060, (_object2->_strip * 2) - 1, 1);
_object1.animate(ANIM_MODE_5, this);
}
}
-void SpeakerRocko3220::proc15() {
+void SpeakerRocko3220::animateSpeaker() {
int v = _speakerMode;
Scene3220 *scene = (Scene3220 *)R2_GLOBALS._sceneManager._scene;
if (!_object2) {
- _object2 = &scene->_actor1;
+ _object2 = &scene->_rocko;
_object2->hide();
_object1.postInit();
_object1.setPosition(_object2->_position);
@@ -1950,18 +2002,19 @@ void SpeakerRocko3220::proc15() {
if (v == 0) {
_object1.animate(ANIM_MODE_2, NULL);
} else {
- ((SceneItem *)_action)->_sceneRegionId = 0;
+ ((StripManager *)_action)->_useless = 0;
+
_object1.setup(4060, (_object2->_strip * 2) - 1, 1);
_object1.animate(ANIM_MODE_5, this);
}
}
-void SpeakerRocko3230::proc15() {
+void SpeakerRocko3230::animateSpeaker() {
int v = _speakerMode;
Scene3230 *scene = (Scene3230 *)R2_GLOBALS._sceneManager._scene;
if (!_object2) {
- _object2 = &scene->_actor1;
+ _object2 = &scene->_rocko;
_object2->hide();
_object1.postInit();
_object1.setPosition(_object2->_position);
@@ -1973,7 +2026,8 @@ void SpeakerRocko3230::proc15() {
if (v == 0) {
_object1.animate(ANIM_MODE_2, NULL);
} else {
- ((SceneItem *)_action)->_sceneRegionId = 0;
+ ((StripManager *)_action)->_useless = 0;
+
_object1.setup(4111, (_object2->_strip * 2) - 1, 1);
_object1.animate(ANIM_MODE_5, this);
}
@@ -1995,7 +2049,7 @@ SpeakerSeeker::SpeakerSeeker(): VisualSpeaker() {
_numFrames = 0;
}
-void SpeakerSeeker300::proc15() {
+void SpeakerSeeker300::animateSpeaker() {
int v = _speakerMode;
if (!_object2) {
@@ -2019,19 +2073,20 @@ void SpeakerSeeker300::proc15() {
_object1.animate(ANIM_MODE_2, NULL);
} else if (v == 100) {
_numFrames = 0;
- ((SceneItem *)_action)->_sceneRegionId = 0;
+ ((StripManager *)_action)->_useless = 0;
_object1.setStrip(_object1._strip - 1);
_object1.setFrame(_object1.getFrameCount());
_object1.animate(ANIM_MODE_6, this);
} else {
- ((SceneItem *)_action)->_sceneRegionId = 0;
+ ((StripManager *)_action)->_useless = 0;
+
_object1.setup(306, v * 2 - 1, 1);
_object1.animate(ANIM_MODE_5, this);
}
}
-void SpeakerSeeker500::proc15() {
+void SpeakerSeeker500::animateSpeaker() {
int v = _speakerMode;
if (!_object2) {
@@ -2057,7 +2112,7 @@ void SpeakerSeeker500::proc15() {
if (v == 0) {
_object1.animate(ANIM_MODE_2, NULL);
} else {
- ((SceneItem *)_action)->_sceneRegionId = 0;
+ ((StripManager *)_action)->_useless = 0;
if (v == 1)
_object1.setup(4041, 3, 1);
@@ -2068,7 +2123,7 @@ void SpeakerSeeker500::proc15() {
}
}
-void SpeakerSeeker1100::proc15() {
+void SpeakerSeeker1100::animateSpeaker() {
int v = _speakerMode;
if (!_object2) {
@@ -2097,28 +2152,33 @@ void SpeakerSeeker1100::proc15() {
_object1.animate(ANIM_MODE_2, NULL);
break;
case 1:
- ((SceneItem *)_action)->_sceneRegionId = 0;
+ ((StripManager *)_action)->_useless = 0;
+
_object1.setup(1108, 1, 1);
_object1.animate(ANIM_MODE_5, this);
break;
case 2:
- ((SceneItem *)_action)->_sceneRegionId = 0;
+ ((StripManager *)_action)->_useless = 0;
+
_object1.setup(1108, 3, 1);
_object1.animate(ANIM_MODE_5, this);
break;
case 3:
_object1.setPosition(Common::Point(197, 134));
- ((SceneItem *)_action)->_sceneRegionId = 0;
+ ((StripManager *)_action)->_useless = 0;
+
_object1.setup(1108, 5, 1);
_object1.animate(ANIM_MODE_5, this);
break;
case 4:
- ((SceneItem *)_action)->_sceneRegionId = 0;
+ ((StripManager *)_action)->_useless = 0;
+
_object1.setup(1109, 7, 1);
_object1.animate(ANIM_MODE_5, this);
break;
case 5:
- ((SceneItem *)_action)->_sceneRegionId = 0;
+ ((StripManager *)_action)->_useless = 0;
+
_object1.setup(1109, 3, 1);
_object1.animate(ANIM_MODE_5, this);
break;
@@ -2128,7 +2188,7 @@ void SpeakerSeeker1100::proc15() {
}
}
-void SpeakerSeeker1900::proc15() {
+void SpeakerSeeker1900::animateSpeaker() {
int v = _speakerMode;
if (!_object2) {
@@ -2137,7 +2197,7 @@ void SpeakerSeeker1900::proc15() {
} else {
assert(R2_GLOBALS._sceneManager._sceneNumber == 1900);
Scene1900 *scene = (Scene1900 *)R2_GLOBALS._sceneManager._scene;
- _object2 = &scene->_actor1;
+ _object2 = &scene->_companion;
}
_object2->hide();
@@ -2159,7 +2219,7 @@ void SpeakerSeeker1900::proc15() {
}
}
-void SpeakerSeeker2435::proc15() {
+void SpeakerSeeker2435::animateSpeaker() {
int v = _speakerMode;
if (!_object2) {
@@ -2179,14 +2239,15 @@ void SpeakerSeeker2435::proc15() {
if (v == 0) {
_object1.animate(ANIM_MODE_2, NULL);
} else {
- ((SceneItem *)_action)->_sceneRegionId = 0;
+ ((StripManager *)_action)->_useless = 0;
+
_object2->setStrip(7);
_object1.setup(4099, 1, 1);
_object1.animate(ANIM_MODE_5, this);
}
}
-void SpeakerSeeker2450::proc15() {
+void SpeakerSeeker2450::animateSpeaker() {
int v = _speakerMode;
if (!_object2) {
@@ -2206,13 +2267,14 @@ void SpeakerSeeker2450::proc15() {
if (v == 0) {
_object1.animate(ANIM_MODE_2, NULL);
} else {
- ((SceneItem *)_action)->_sceneRegionId = 0;
+ ((StripManager *)_action)->_useless = 0;
+
_object1.setup(4099, 3, 1);
_object1.animate(ANIM_MODE_5, this);
}
}
-void SpeakerSeeker3375::proc15() {
+void SpeakerSeeker3375::animateSpeaker() {
Scene3375 *scene = (Scene3375 *)R2_GLOBALS._sceneManager._scene;
int v = _speakerMode;
@@ -2227,7 +2289,7 @@ void SpeakerSeeker3375::proc15() {
_object1.postInit();
_object1.setPosition(_object2->_position);
_object1._numFrames = 7;
- _object1._effect = 1;
+ _object1._effect = EFFECT_SHADED;
_object1.changeZoom(-1);
if (scene->_companion1._position.y != 163)
@@ -2245,13 +2307,13 @@ void SpeakerSeeker3375::proc15() {
_object2->addMover(NULL);
}
-
switch (v) {
case 0:
_object1.animate(ANIM_MODE_2, NULL);
break;
case 1:
- ((SceneItem *)_action)->_sceneRegionId = 0;
+ ((StripManager *)_action)->_useless = 0;
+
_object1.setup(4031, 1, 1);
_object1.animate(ANIM_MODE_5, this);
break;
@@ -2261,7 +2323,7 @@ void SpeakerSeeker3375::proc15() {
}
}
-void SpeakerSeeker3385::proc15() {
+void SpeakerSeeker3385::animateSpeaker() {
Scene3385 *scene = (Scene3385 *)R2_GLOBALS._sceneManager._scene;
int v = _speakerMode;
@@ -2276,7 +2338,7 @@ void SpeakerSeeker3385::proc15() {
_object1.postInit();
_object1.setPosition(_object2->_position);
_object1._numFrames = 7;
- _object1._effect = 1;
+ _object1._effect = EFFECT_SHADED;
_object1.changeZoom(-1);
if (R2_GLOBALS._sceneManager._previousScene == 3375)
@@ -2300,7 +2362,8 @@ void SpeakerSeeker3385::proc15() {
_object1.animate(ANIM_MODE_2, NULL);
break;
case 1:
- ((SceneItem *)_action)->_sceneRegionId = 0;
+ ((StripManager *)_action)->_useless = 0;
+
_object1.setup(4031, 3, 1);
_object1.animate(ANIM_MODE_5, this);
break;
@@ -2310,7 +2373,7 @@ void SpeakerSeeker3385::proc15() {
}
}
-void SpeakerSeeker3395::proc15() {
+void SpeakerSeeker3395::animateSpeaker() {
Scene3395 *scene = (Scene3395 *)R2_GLOBALS._sceneManager._scene;
int v = _speakerMode;
@@ -2325,7 +2388,7 @@ void SpeakerSeeker3395::proc15() {
_object1.postInit();
_object1.setPosition(_object2->_position);
_object1._numFrames = 7;
- _object1._effect = 1;
+ _object1._effect = EFFECT_SHADED;
_object1.changeZoom(-1);
if (R2_GLOBALS._sceneManager._previousScene == 3385)
@@ -2343,13 +2406,13 @@ void SpeakerSeeker3395::proc15() {
_object2->addMover(NULL);
}
-
switch (v) {
case 0:
_object1.animate(ANIM_MODE_2, NULL);
break;
case 1:
- ((SceneItem *)_action)->_sceneRegionId = 0;
+ ((StripManager *)_action)->_useless = 0;
+
_object1.setup(4031, 3, 1);
_object1.animate(ANIM_MODE_5, this);
break;
@@ -2359,7 +2422,7 @@ void SpeakerSeeker3395::proc15() {
}
}
-void SpeakerSeeker3400::proc15() {
+void SpeakerSeeker3400::animateSpeaker() {
Scene3400 *scene = (Scene3400 *)R2_GLOBALS._sceneManager._scene;
int v = _speakerMode;
@@ -2374,7 +2437,7 @@ void SpeakerSeeker3400::proc15() {
_object1.postInit();
_object1.setPosition(_object2->_position);
_object1._numFrames = 7;
- _object1._effect = 1;
+ _object1._effect = EFFECT_SHADED;
_object1.changeZoom(-1);
R2_GLOBALS._player.disableControl();
R2_GLOBALS._events.setCursor(CURSOR_CROSSHAIRS);
@@ -2388,27 +2451,32 @@ void SpeakerSeeker3400::proc15() {
_object1.animate(ANIM_MODE_2, NULL);
break;
case 1:
- ((SceneItem *)_action)->_sceneRegionId = 0;
+ ((StripManager *)_action)->_useless = 0;
+
_object1.setup(4031, 1, 1);
_object1.animate(ANIM_MODE_5, this);
break;
case 2:
- ((SceneItem *)_action)->_sceneRegionId = 0;
+ ((StripManager *)_action)->_useless = 0;
+
_object1.setup(4031, 3, 1);
_object1.animate(ANIM_MODE_5, this);
break;
case 3:
- ((SceneItem *)_action)->_sceneRegionId = 0;
+ ((StripManager *)_action)->_useless = 0;
+
_object1.setup(4030, 3, 1);
_object1.animate(ANIM_MODE_5, this);
break;
case 4:
- ((SceneItem *)_action)->_sceneRegionId = 0;
+ ((StripManager *)_action)->_useless = 0;
+
_object1.setup(4031, 7, 1);
_object1.animate(ANIM_MODE_5, this);
break;
case 5:
- ((SceneItem *)_action)->_sceneRegionId = 0;
+ ((StripManager *)_action)->_useless = 0;
+
_object1.setup(4033, 1, 1);
_object1.animate(ANIM_MODE_5, this);
break;
@@ -2418,7 +2486,7 @@ void SpeakerSeeker3400::proc15() {
}
}
-void SpeakerSeeker3600::proc15() {
+void SpeakerSeeker3600::animateSpeaker() {
Scene3600 *scene = (Scene3600 *)R2_GLOBALS._sceneManager._scene;
int v = _speakerMode;
@@ -2427,13 +2495,13 @@ void SpeakerSeeker3600::proc15() {
if (R2_GLOBALS._player._characterIndex == R2_SEEKER)
_object2 = &R2_GLOBALS._player;
else
- _object2 = &scene->_actor11;
+ _object2 = &scene->_seeker;
_object2->hide();
_object1.postInit();
_object1.setPosition(_object2->_position);
_object1._numFrames = 7;
- _object1._effect = 1;
+ _object1._effect = EFFECT_SHADED;
_object1.changeZoom(-1);
R2_GLOBALS._player.disableControl();
R2_GLOBALS._events.setCursor(CURSOR_CROSSHAIRS);
@@ -2450,12 +2518,14 @@ void SpeakerSeeker3600::proc15() {
_object1.animate(ANIM_MODE_2, NULL);
break;
case 1:
- ((SceneItem *)_action)->_sceneRegionId = 0;
+ ((StripManager *)_action)->_useless = 0;
+
_object1.setup(4031, 5, 1);
_object1.animate(ANIM_MODE_5, this);
break;
case 2:
- ((SceneItem *)_action)->_sceneRegionId = 0;
+ ((StripManager *)_action)->_useless = 0;
+
_object1.setup(4030, 1, 1);
_object1.animate(ANIM_MODE_5, this);
break;
@@ -2478,7 +2548,7 @@ void SpeakerSeeker3700::setText(const Common::String &msg) {
VisualSpeaker::setText(msg);
}
-void SpeakerSeeker3700::proc15() {
+void SpeakerSeeker3700::animateSpeaker() {
Scene3700 *scene = (Scene3700 *)R2_GLOBALS._sceneManager._scene;
int v = _speakerMode;
@@ -2503,7 +2573,8 @@ void SpeakerSeeker3700::proc15() {
_object1.animate(ANIM_MODE_2, NULL);
break;
case 1:
- ((SceneItem *)_action)->_sceneRegionId = 0;
+ ((StripManager *)_action)->_useless = 0;
+
R2_GLOBALS._sound2.stop();
scene->_quinn.setup(10, 8, 1);
scene->_seeker.setup(20, 7, 1);
@@ -2512,7 +2583,8 @@ void SpeakerSeeker3700::proc15() {
_object1.animate(ANIM_MODE_5, this);
break;
case 2:
- ((SceneItem *)_action)->_sceneRegionId = 0;
+ ((StripManager *)_action)->_useless = 0;
+
scene->_quinn.setup(10, 2, 1);
scene->_seeker.setup(20, 1, 1);
scene->_miranda.setup(30, 1, 1);
@@ -2529,17 +2601,8 @@ void SpeakerSeeker3700::proc15() {
// Classes related to SEEKERL
//----------------------------------------------------------------------------
-SpeakerSeekerL::SpeakerSeekerL(): VisualSpeaker() {
+SpeakerSeekerL::SpeakerSeekerL(): SpeakerSeeker() {
_speakerName = "SEEKERL";
- _color1 = 35;
- _color2 = 0;
- _speakerMode = 0;
- _textWidth = 300;
- _hideObjects = false;
- _object2 = NULL;
- _displayMode = 1;
- _numFrames = 0;
- _fontNumber = 10;
}
//----------------------------------------------------------------------------
@@ -2558,12 +2621,12 @@ SpeakerSocko3200::SpeakerSocko3200() {
_numFrames = 0;
}
-void SpeakerSocko3200::proc15() {
+void SpeakerSocko3200::animateSpeaker() {
int v = _speakerMode;
Scene3200 *scene = (Scene3200 *)R2_GLOBALS._sceneManager._scene;
if (!_object2) {
- _object2 = &scene->_actor3;
+ _object2 = &scene->_socko;
_object2->hide();
_object1.postInit();
_object1.setPosition(_object2->_position);
@@ -2575,7 +2638,8 @@ void SpeakerSocko3200::proc15() {
if (v == 0) {
_object1.animate(ANIM_MODE_2, NULL);
} else {
- ((SceneItem *)_action)->_sceneRegionId = 0;
+ ((StripManager *)_action)->_useless = 0;
+
_object1.setup(4060, (_object2->_strip * 2) - 1, 1);
_object1.animate(ANIM_MODE_5, this);
}
@@ -2597,7 +2661,7 @@ SpeakerSoldier::SpeakerSoldier(int color) {
_numFrames = 0;
}
-void SpeakerSoldier300::proc15() {
+void SpeakerSoldier300::animateSpeaker() {
int v = _speakerMode;
if (!_object2) {
@@ -2615,7 +2679,8 @@ void SpeakerSoldier300::proc15() {
if (v == 0) {
_object1.animate(ANIM_MODE_2, NULL);
} else {
- ((SceneItem *)_action)->_sceneRegionId = 0;
+ ((StripManager *)_action)->_useless = 0;
+
_object1.setup(303, 3, 1);
_object1.animate(ANIM_MODE_5, this);
}
@@ -2641,7 +2706,7 @@ SpeakerTealMode7::SpeakerTealMode7(): SpeakerTeal() {
_displayMode = 7;
}
-void SpeakerTeal180::proc15() {
+void SpeakerTeal180::animateSpeaker() {
int v = _speakerMode;
if (!_object2) {
@@ -2661,12 +2726,14 @@ void SpeakerTeal180::proc15() {
_object1.animate(ANIM_MODE_2, NULL);
break;
case 1:
- ((SceneItem *)_action)->_sceneRegionId = 0;
+ ((StripManager *)_action)->_useless = 0;
+
_object1.setup(75, 5, 1);
_object1.animate(ANIM_MODE_5, this);
break;
case 2:
- ((SceneItem *)_action)->_sceneRegionId = 0;
+ ((StripManager *)_action)->_useless = 0;
+
_object1.setup(77, 1, 1);
_object1.animate(ANIM_MODE_5, this);
break;
@@ -2676,7 +2743,7 @@ void SpeakerTeal180::proc15() {
}
}
-void SpeakerTeal300::proc15() {
+void SpeakerTeal300::animateSpeaker() {
int v = _speakerMode;
if (!_object2) {
@@ -2694,13 +2761,14 @@ void SpeakerTeal300::proc15() {
if (v == 0) {
_object1.animate(ANIM_MODE_2, NULL);
} else {
- ((SceneItem *)_action)->_sceneRegionId = 0;
+ ((StripManager *)_action)->_useless = 0;
+
_object1.setup(303, 1, 1);
_object1.animate(ANIM_MODE_5, this);
}
}
-void SpeakerTeal1625::proc15() {
+void SpeakerTeal1625::animateSpeaker() {
int v = _speakerMode;
if (!_object2) {
@@ -2718,18 +2786,19 @@ void SpeakerTeal1625::proc15() {
if (v == 0) {
_object1.animate(ANIM_MODE_2, NULL);
} else {
- ((SceneItem *)_action)->_sceneRegionId = 0;
+ ((StripManager *)_action)->_useless = 0;
+
_object1.setup(1627, 1, 1);
_object1.animate(ANIM_MODE_5, this);
}
}
-void SpeakerTeal3240::proc15() {
+void SpeakerTeal3240::animateSpeaker() {
int v = _speakerMode;
Scene3240 *scene = (Scene3240 *)R2_GLOBALS._sceneManager._scene;
if (!_object2) {
- _object2 = &scene->_actor1;
+ _object2 = &scene->_teal;
_object2->hide();
_object1.postInit();
_object1.setPosition(_object2->_position);
@@ -2741,13 +2810,14 @@ void SpeakerTeal3240::proc15() {
if (v == 0) {
_object1.animate(ANIM_MODE_2, NULL);
} else {
- ((SceneItem *)_action)->_sceneRegionId = 0;
+ ((StripManager *)_action)->_useless = 0;
+
_object1.setup(4070, (_object2->_strip * 2) - 1, 1);
_object1.animate(ANIM_MODE_5, this);
}
}
-void SpeakerTeal3400::proc15() {
+void SpeakerTeal3400::animateSpeaker() {
Scene3400 *scene = (Scene3400 *)R2_GLOBALS._sceneManager._scene;
int v = _speakerMode;
@@ -2757,7 +2827,7 @@ void SpeakerTeal3400::proc15() {
_object2->hide();
_object1.postInit();
_object1._numFrames = 7;
- _object1._effect = 1;
+ _object1._effect = EFFECT_SHADED;
_object1.changeZoom(-1);
R2_GLOBALS._player.disableControl();
R2_GLOBALS._events.setCursor(CURSOR_CROSSHAIRS);
@@ -2779,22 +2849,26 @@ void SpeakerTeal3400::proc15() {
_object1.animate(ANIM_MODE_2, NULL);
break;
case 1:
- ((SceneItem *)_action)->_sceneRegionId = 0;
+ ((StripManager *)_action)->_useless = 0;
+
_object1.setup(4107, 5, 1);
_object1.animate(ANIM_MODE_5, this);
break;
case 2:
- ((SceneItem *)_action)->_sceneRegionId = 0;
+ ((StripManager *)_action)->_useless = 0;
+
_object1.setup(4107, 1, 1);
_object1.animate(ANIM_MODE_5, this);
break;
case 3:
- ((SceneItem *)_action)->_sceneRegionId = 0;
+ ((StripManager *)_action)->_useless = 0;
+
_object1.setup(4107, 7, 1);
_object1.animate(ANIM_MODE_5, this);
break;
case 4:
- ((SceneItem *)_action)->_sceneRegionId = 0;
+ ((StripManager *)_action)->_useless = 0;
+
_object1.setup(4107, 3, 1);
_object1.animate(ANIM_MODE_5, this);
break;
@@ -2804,18 +2878,18 @@ void SpeakerTeal3400::proc15() {
}
}
-void SpeakerTeal3600::proc15() {
+void SpeakerTeal3600::animateSpeaker() {
Scene3600 *scene = (Scene3600 *)R2_GLOBALS._sceneManager._scene;
int v = _speakerMode;
if (!_object2) {
- _object2 = &scene->_actor5;
+ _object2 = &scene->_teal;
_object2->hide();
_object1.postInit();
_object1.setPosition(_object2->_position);
_object1._numFrames = 7;
- _object1._effect = 1;
+ _object1._effect = EFFECT_SHADED;
_object1.changeZoom(-1);
R2_GLOBALS._player.disableControl();
R2_GLOBALS._events.setCursor(CURSOR_CROSSHAIRS);
@@ -2835,22 +2909,26 @@ void SpeakerTeal3600::proc15() {
_object1.animate(ANIM_MODE_2, NULL);
break;
case 1:
- ((SceneItem *)_action)->_sceneRegionId = 0;
+ ((StripManager *)_action)->_useless = 0;
+
_object1.setup(4107, 5, 1);
_object1.animate(ANIM_MODE_5, this);
break;
case 2:
- ((SceneItem *)_action)->_sceneRegionId = 0;
+ ((StripManager *)_action)->_useless = 0;
+
_object1.setup(4107, 1, 1);
_object1.animate(ANIM_MODE_5, this);
break;
case 3:
- ((SceneItem *)_action)->_sceneRegionId = 0;
+ ((StripManager *)_action)->_useless = 0;
+
_object1.setup(4107, 7, 1);
_object1.animate(ANIM_MODE_5, this);
break;
case 4:
- ((SceneItem *)_action)->_sceneRegionId = 0;
+ ((StripManager *)_action)->_useless = 0;
+
_object1.setup(4107, 3, 1);
_object1.animate(ANIM_MODE_5, this);
break;
@@ -2876,12 +2954,12 @@ SpeakerTomko3245::SpeakerTomko3245() {
_numFrames = 0;
}
-void SpeakerTomko3245::proc15() {
+void SpeakerTomko3245::animateSpeaker() {
int v = _speakerMode;
Scene3245 *scene = (Scene3245 *)R2_GLOBALS._sceneManager._scene;
if (!_object2) {
- _object2 = &scene->_actor2;
+ _object2 = &scene->_tomko;
_object2->hide();
_object1.postInit();
_object1.setPosition(_object2->_position);
@@ -2893,7 +2971,8 @@ void SpeakerTomko3245::proc15() {
if (v == 0) {
_object1.animate(ANIM_MODE_2, NULL);
} else {
- ((SceneItem *)_action)->_sceneRegionId = 0;
+ ((StripManager *)_action)->_useless = 0;
+
switch (_object2->_visage) {
case 3100:
_object1.setup(4105, (_object2->_strip * 2) - 1, 1);
@@ -2928,8 +3007,8 @@ SpeakerWebbster::SpeakerWebbster(int color) {
_numFrames = 0;
}
-void SpeakerWebbster180::proc15() {
- Scene3375 *scene = (Scene3375 *)R2_GLOBALS._sceneManager._scene;
+void SpeakerWebbster180::animateSpeaker() {
+ Scene180 *scene = (Scene180 *)R2_GLOBALS._sceneManager._scene;
int v = _speakerMode;
@@ -2949,18 +3028,21 @@ void SpeakerWebbster180::proc15() {
_object1.animate(ANIM_MODE_2, NULL);
break;
case 1:
- ((SceneItem *)_action)->_sceneRegionId = 0;
+ ((StripManager *)_action)->_useless = 0;
+
_object1.setup(75, 7, 1);
_object1.animate(ANIM_MODE_5, this);
break;
case 2:
- ((SceneItem *)_action)->_sceneRegionId = 0;
+ ((StripManager *)_action)->_useless = 0;
+
_object1.setup(76, 4, 1);
_object1.animate(ANIM_MODE_5, this);
break;
case 3:
- ((SceneItem *)_action)->_sceneRegionId = 0;
- _object1.setup(75, 6, 1);
+ ((StripManager *)_action)->_useless = 0;
+
+ _object1.setup(76, 6, 1);
_object1.animate(ANIM_MODE_5, this);
break;
default:
@@ -2969,12 +3051,12 @@ void SpeakerWebbster180::proc15() {
}
}
-void SpeakerWebbster3240::proc15() {
+void SpeakerWebbster3240::animateSpeaker() {
int v = _speakerMode;
Scene3240 *scene = (Scene3240 *)R2_GLOBALS._sceneManager._scene;
if (!_object2) {
- _object2 = &scene->_actor2;
+ _object2 = &scene->_webbster;
_object2->hide();
_object1.postInit();
_object1.setPosition(_object2->_position);
@@ -2986,13 +3068,14 @@ void SpeakerWebbster3240::proc15() {
if (v == 0) {
_object1.animate(ANIM_MODE_2, NULL);
} else {
- ((SceneItem *)_action)->_sceneRegionId = 0;
+ ((StripManager *)_action)->_useless = 0;
+
_object1.setup(4110, 5, 1);
_object1.animate(ANIM_MODE_5, this);
}
}
-void SpeakerWebbster3375::proc15() {
+void SpeakerWebbster3375::animateSpeaker() {
Scene3375 *scene = (Scene3375 *)R2_GLOBALS._sceneManager._scene;
int v = _speakerMode;
@@ -3003,7 +3086,7 @@ void SpeakerWebbster3375::proc15() {
_object1.postInit();
_object1.setPosition(_object2->_position);
_object1._numFrames = 7;
- _object1._effect = 1;
+ _object1._effect = EFFECT_SHADED;
_object1.changeZoom(-1);
if (scene->_companion1._position.y != 163)
@@ -3026,7 +3109,8 @@ void SpeakerWebbster3375::proc15() {
_object1.animate(ANIM_MODE_2, NULL);
break;
case 1:
- ((SceneItem *)_action)->_sceneRegionId = 0;
+ ((StripManager *)_action)->_useless = 0;
+
_object1.setup(4110, 5, 1);
_object1.animate(ANIM_MODE_5, this);
break;
@@ -3036,7 +3120,7 @@ void SpeakerWebbster3375::proc15() {
}
}
-void SpeakerWebbster3385::proc15() {
+void SpeakerWebbster3385::animateSpeaker() {
Scene3385 *scene = (Scene3385 *)R2_GLOBALS._sceneManager._scene;
int v = _speakerMode;
@@ -3047,7 +3131,7 @@ void SpeakerWebbster3385::proc15() {
_object1.postInit();
_object1.setPosition(_object2->_position);
_object1._numFrames = 7;
- _object1._effect = 1;
+ _object1._effect = EFFECT_SHADED;
_object1.changeZoom(-1);
if (R2_GLOBALS._sceneManager._previousScene == 3375)
@@ -3070,7 +3154,8 @@ void SpeakerWebbster3385::proc15() {
_object1.animate(ANIM_MODE_2, NULL);
break;
case 1:
- ((SceneItem *)_action)->_sceneRegionId = 0;
+ ((StripManager *)_action)->_useless = 0;
+
_object1.setup(4110, 5, 1);
_object1.animate(ANIM_MODE_5, this);
break;
@@ -3080,7 +3165,7 @@ void SpeakerWebbster3385::proc15() {
}
}
-void SpeakerWebbster3395::proc15() {
+void SpeakerWebbster3395::animateSpeaker() {
Scene3395 *scene = (Scene3395 *)R2_GLOBALS._sceneManager._scene;
int v = _speakerMode;
@@ -3091,7 +3176,7 @@ void SpeakerWebbster3395::proc15() {
_object1.postInit();
_object1.setPosition(_object2->_position);
_object1._numFrames = 7;
- _object1._effect = 1;
+ _object1._effect = EFFECT_SHADED;
_object1.changeZoom(-1);
if (R2_GLOBALS._sceneManager._previousScene == 3385)
@@ -3114,7 +3199,8 @@ void SpeakerWebbster3395::proc15() {
_object1.animate(ANIM_MODE_2, NULL);
break;
case 1:
- ((SceneItem *)_action)->_sceneRegionId = 0;
+ ((StripManager *)_action)->_useless = 0;
+
_object1.setup(4110, 5, 1);
_object1.animate(ANIM_MODE_5, this);
break;
@@ -3124,7 +3210,7 @@ void SpeakerWebbster3395::proc15() {
}
}
-void SpeakerWebbster3400::proc15() {
+void SpeakerWebbster3400::animateSpeaker() {
Scene3400 *scene = (Scene3400 *)R2_GLOBALS._sceneManager._scene;
int v = _speakerMode;
@@ -3135,7 +3221,7 @@ void SpeakerWebbster3400::proc15() {
_object1.postInit();
_object1.setPosition(_object2->_position);
_object1._numFrames = 7;
- _object1._effect = 1;
+ _object1._effect = EFFECT_SHADED;
_object1.changeZoom(-1);
R2_GLOBALS._player.disableControl();
R2_GLOBALS._events.setCursor(CURSOR_CROSSHAIRS);
@@ -3149,17 +3235,20 @@ void SpeakerWebbster3400::proc15() {
_object1.animate(ANIM_MODE_2, NULL);
break;
case 1:
- ((SceneItem *)_action)->_sceneRegionId = 0;
+ ((StripManager *)_action)->_useless = 0;
+
_object1.setup(4110, 5, 1);
_object1.animate(ANIM_MODE_5, this);
break;
case 2:
- ((SceneItem *)_action)->_sceneRegionId = 0;
+ ((StripManager *)_action)->_useless = 0;
+
_object1.setup(4110, 7, 1);
_object1.animate(ANIM_MODE_5, this);
break;
case 3:
- ((SceneItem *)_action)->_sceneRegionId = 0;
+ ((StripManager *)_action)->_useless = 0;
+
_object1.setup(4110, 3, 1);
_object1.animate(ANIM_MODE_5, this);
break;
@@ -3183,7 +3272,7 @@ SpeakerDutyOfficer180::SpeakerDutyOfficer180(): VisualSpeaker() {
_numFrames = 0;
}
-void SpeakerDutyOfficer180::proc15() {
+void SpeakerDutyOfficer180::animateSpeaker() {
Scene180 *scene = (Scene180 *)R2_GLOBALS._sceneManager._scene;
int v = _speakerMode;
@@ -3203,7 +3292,7 @@ void SpeakerDutyOfficer180::proc15() {
_object1.animate(ANIM_MODE_2, NULL);
break;
case 1:
- _action = NULL;
+ _action->_action = NULL;
_object1.setup(76, 2, 1);
_object1.animate(ANIM_MODE_5, this);
break;
@@ -3213,6 +3302,5 @@ void SpeakerDutyOfficer180::proc15() {
}
}
-
} // End of namespace Ringworld2
} // End of namespace TsAGE
diff --git a/engines/tsage/ringworld2/ringworld2_speakers.h b/engines/tsage/ringworld2/ringworld2_speakers.h
index 1b87606381..4a794f65c8 100644
--- a/engines/tsage/ringworld2/ringworld2_speakers.h
+++ b/engines/tsage/ringworld2/ringworld2_speakers.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope 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.
@@ -49,11 +49,11 @@ public:
bool _removeObject;
uint32 _frameNumber;
int _numFrames;
- int _delayAmount2;
- uint32 _frameNumber2;
+ int _voiceDelayAmount;
+ uint32 _voiceFrameNumber;
private:
void setFrame(int numFrames);
- void setFrame2(int numFrames);
+ void setVoiceFrame(int numFrames);
public:
VisualSpeaker();
@@ -63,8 +63,8 @@ public:
virtual void signal();
virtual void dispatch();
virtual void setText(const Common::String &msg);
- virtual void proc15() {}
- virtual void proc16();
+ virtual void animateSpeaker() {}
+ virtual void stopSpeaking();
void setDelay(int delay);
};
@@ -83,7 +83,7 @@ public:
SpeakerCaptain3210();
virtual Common::String getClassName() { return "SpeakerCaptain3210"; }
- virtual void proc15();
+ virtual void animateSpeaker();
};
// Classes related to Caretaker
@@ -102,7 +102,7 @@ public:
SpeakerChief1100();
virtual Common::String getClassName() { return "SpeakerChief1100"; }
- virtual void proc15();
+ virtual void animateSpeaker();
};
// Classes related to Guard
@@ -116,7 +116,7 @@ public:
class SpeakerGuard2800 : public SpeakerGuard {
public:
virtual Common::String getClassName() { return "SpeakerGuard2800"; }
- virtual void proc15();
+ virtual void animateSpeaker();
};
// Classes related to Jocko
@@ -130,19 +130,19 @@ public:
class SpeakerJocko3200 : public SpeakerJocko {
public:
virtual Common::String getClassName() { return "SpeakerJocko3200"; }
- virtual void proc15();
+ virtual void animateSpeaker();
};
class SpeakerJocko3220 : public SpeakerJocko {
public:
virtual Common::String getClassName() { return "SpeakerJocko3220"; }
- virtual void proc15();
+ virtual void animateSpeaker();
};
class SpeakerJocko3230 : public SpeakerJocko {
public:
virtual Common::String getClassName() { return "SpeakerJocko3230"; }
- virtual void proc15();
+ virtual void animateSpeaker();
};
// Classes related to Miranda
@@ -156,55 +156,55 @@ public:
class SpeakerMiranda300 : public SpeakerMiranda {
public:
virtual Common::String getClassName() { return "SpeakerMiranda300"; }
- virtual void proc15();
+ virtual void animateSpeaker();
};
class SpeakerMiranda1625 : public SpeakerMiranda {
public:
virtual Common::String getClassName() { return "SpeakerMiranda1625"; }
- virtual void proc15();
+ virtual void animateSpeaker();
};
class SpeakerMiranda3255 : public SpeakerMiranda {
public:
virtual Common::String getClassName() { return "SpeakerMiranda3255"; }
- virtual void proc15();
+ virtual void animateSpeaker();
};
class SpeakerMiranda3375 : public SpeakerMiranda {
public:
virtual Common::String getClassName() { return "SpeakerMiranda3375"; }
- virtual void proc15();
+ virtual void animateSpeaker();
};
class SpeakerMiranda3385 : public SpeakerMiranda {
public:
virtual Common::String getClassName() { return "SpeakerMiranda3385"; }
- virtual void proc15();
+ virtual void animateSpeaker();
};
class SpeakerMiranda3395 : public SpeakerMiranda {
public:
virtual Common::String getClassName() { return "SpeakerMiranda3395"; }
- virtual void proc15();
+ virtual void animateSpeaker();
};
class SpeakerMiranda3400 : public SpeakerMiranda {
public:
virtual Common::String getClassName() { return "SpeakerMiranda3400"; }
- virtual void proc15();
+ virtual void animateSpeaker();
};
class SpeakerMiranda3600 : public SpeakerMiranda {
public:
virtual Common::String getClassName() { return "SpeakerMiranda3600"; }
- virtual void proc15();
+ virtual void animateSpeaker();
};
class SpeakerMiranda3700 : public SpeakerMiranda {
public:
virtual Common::String getClassName() { return "SpeakerMiranda3700"; }
- virtual void proc15();
+ virtual void animateSpeaker();
};
// Classes related to Nej
@@ -218,19 +218,19 @@ public:
class SpeakerNej2700 : public SpeakerNej {
public:
virtual Common::String getClassName() { return "SpeakerNej2700"; }
- virtual void proc15();
+ virtual void animateSpeaker();
};
class SpeakerNej2750 : public SpeakerNej {
public:
virtual Common::String getClassName() { return "SpeakerNej2750"; }
- virtual void proc15();
+ virtual void animateSpeaker();
};
class SpeakerNej2800 : public SpeakerNej {
public:
virtual Common::String getClassName() { return "SpeakerNej2800"; }
- virtual void proc15();
+ virtual void animateSpeaker();
};
// Classes related to Pharisha
@@ -245,7 +245,7 @@ public:
class SpeakerPharisha2435 : public SpeakerPharisha {
public:
virtual Common::String getClassName() { return "SpeakerPharisha2435"; }
- virtual void proc15();
+ virtual void animateSpeaker();
};
// Classes related to Private
@@ -255,7 +255,7 @@ public:
SpeakerPrivate3210();
virtual Common::String getClassName() { return "SpeakerPrivate3210"; }
- virtual void proc15();
+ virtual void animateSpeaker();
};
// Classes related to Protector
@@ -265,7 +265,7 @@ public:
SpeakerProtector3600();
virtual Common::String getClassName() { return "SpeakerProtector3600"; }
- virtual void proc15();
+ virtual void animateSpeaker();
};
// Classes related to Quinn
@@ -279,97 +279,97 @@ public:
class SpeakerQuinn300 : public SpeakerQuinn {
public:
virtual Common::String getClassName() { return "SpeakerQuinn300"; }
- virtual void proc15();
+ virtual void animateSpeaker();
};
class SpeakerQuinn500 : public SpeakerQuinn {
public:
virtual Common::String getClassName() { return "SpeakerQuinn500"; }
- virtual void proc15();
+ virtual void animateSpeaker();
};
class SpeakerQuinn1100 : public SpeakerQuinn {
public:
virtual Common::String getClassName() { return "SpeakerQuinn1100"; }
- virtual void proc15();
+ virtual void animateSpeaker();
};
class SpeakerQuinn2435 : public SpeakerQuinn {
public:
virtual Common::String getClassName() { return "SpeakerQuinn2435"; }
- virtual void proc15();
+ virtual void animateSpeaker();
};
class SpeakerQuinn2450 : public SpeakerQuinn {
public:
virtual Common::String getClassName() { return "SpeakerQuinn2450"; }
- virtual void proc15();
+ virtual void animateSpeaker();
};
class SpeakerQuinn2700 : public SpeakerQuinn {
public:
virtual Common::String getClassName() { return "SpeakerQuinn2700"; }
- virtual void proc15();
+ virtual void animateSpeaker();
};
class SpeakerQuinn2750 : public SpeakerQuinn {
public:
virtual Common::String getClassName() { return "SpeakerQuinn2750"; }
- virtual void proc15();
+ virtual void animateSpeaker();
};
class SpeakerQuinn2800 : public SpeakerQuinn {
public:
virtual Common::String getClassName() { return "SpeakerQuinn2800"; }
- virtual void proc15();
+ virtual void animateSpeaker();
};
class SpeakerQuinn3255 : public SpeakerQuinn {
public:
virtual Common::String getClassName() { return "SpeakerQuinn3255"; }
- virtual void proc15();
+ virtual void animateSpeaker();
};
class SpeakerQuinn3375 : public SpeakerQuinn {
public:
virtual Common::String getClassName() { return "SpeakerQuinn3375"; }
- virtual void proc15();
+ virtual void animateSpeaker();
};
class SpeakerQuinn3385 : public SpeakerQuinn {
public:
virtual Common::String getClassName() { return "SpeakerQuinn3385"; }
- virtual void proc15();
+ virtual void animateSpeaker();
};
class SpeakerQuinn3395 : public SpeakerQuinn {
public:
virtual Common::String getClassName() { return "SpeakerQuinn3395"; }
- virtual void proc15();
+ virtual void animateSpeaker();
};
class SpeakerQuinn3400 : public SpeakerQuinn {
public:
virtual Common::String getClassName() { return "SpeakerQuinn3400"; }
- virtual void proc15();
+ virtual void animateSpeaker();
};
class SpeakerQuinn3600 : public SpeakerQuinn {
public:
virtual Common::String getClassName() { return "SpeakerQuinn3600"; }
- virtual void proc15();
+ virtual void animateSpeaker();
};
class SpeakerQuinn3700 : public SpeakerQuinn {
public:
virtual Common::String getClassName() { return "SpeakerQuinn3700"; }
virtual void setText(const Common::String &msg);
- virtual void proc15();
+ virtual void animateSpeaker();
};
// Classes related to QuinnL
-class SpeakerQuinnL : public VisualSpeaker {
+class SpeakerQuinnL : public SpeakerQuinn {
public:
SpeakerQuinnL();
@@ -383,7 +383,7 @@ public:
SpeakerRalf3245();
virtual Common::String getClassName() { return "SpeakerRalf3245"; }
- virtual void proc15();
+ virtual void animateSpeaker();
};
// Classes related to Rocko
@@ -397,19 +397,19 @@ public:
class SpeakerRocko3200 : public SpeakerRocko {
public:
virtual Common::String getClassName() { return "SpeakerRocko3200"; }
- virtual void proc15();
+ virtual void animateSpeaker();
};
class SpeakerRocko3220 : public SpeakerRocko {
public:
virtual Common::String getClassName() { return "SpeakerRocko3220"; }
- virtual void proc15();
+ virtual void animateSpeaker();
};
class SpeakerRocko3230 : public SpeakerRocko {
public:
virtual Common::String getClassName() { return "SpeakerRocko3230"; }
- virtual void proc15();
+ virtual void animateSpeaker();
};
// Classes related to Seeker
@@ -423,79 +423,79 @@ public:
class SpeakerSeeker300 : public SpeakerSeeker {
public:
virtual Common::String getClassName() { return "SpeakerSeeker300"; }
- virtual void proc15();
+ virtual void animateSpeaker();
};
class SpeakerSeeker500 : public SpeakerSeeker {
public:
virtual Common::String getClassName() { return "SpeakerSeeker500"; }
- virtual void proc15();
+ virtual void animateSpeaker();
};
class SpeakerSeeker1100 : public SpeakerSeeker {
public:
virtual Common::String getClassName() { return "SpeakerSeeker1100"; }
- virtual void proc15();
+ virtual void animateSpeaker();
};
class SpeakerSeeker1900 : public SpeakerSeeker {
public:
virtual Common::String getClassName() { return "SpeakerSeeker1900"; }
- virtual void proc15();
+ virtual void animateSpeaker();
};
class SpeakerSeeker2435 : public SpeakerSeeker {
public:
virtual Common::String getClassName() { return "SpeakerSeeker2435"; }
- virtual void proc15();
+ virtual void animateSpeaker();
};
class SpeakerSeeker2450 : public SpeakerSeeker {
public:
virtual Common::String getClassName() { return "SpeakerSeeker2450"; }
- virtual void proc15();
+ virtual void animateSpeaker();
};
class SpeakerSeeker3375 : public SpeakerSeeker {
public:
virtual Common::String getClassName() { return "SpeakerSeeker3375"; }
- virtual void proc15();
+ virtual void animateSpeaker();
};
class SpeakerSeeker3385 : public SpeakerSeeker {
public:
virtual Common::String getClassName() { return "SpeakerSeeker3385"; }
- virtual void proc15();
+ virtual void animateSpeaker();
};
class SpeakerSeeker3395 : public SpeakerSeeker {
public:
virtual Common::String getClassName() { return "SpeakerSeeker3395"; }
- virtual void proc15();
+ virtual void animateSpeaker();
};
class SpeakerSeeker3400 : public SpeakerSeeker {
public:
virtual Common::String getClassName() { return "SpeakerSeeker3400"; }
- virtual void proc15();
+ virtual void animateSpeaker();
};
class SpeakerSeeker3600 : public SpeakerSeeker {
public:
virtual Common::String getClassName() { return "SpeakerSeeker3600"; }
- virtual void proc15();
+ virtual void animateSpeaker();
};
class SpeakerSeeker3700 : public SpeakerSeeker {
public:
virtual Common::String getClassName() { return "SpeakerSeeker3700"; }
virtual void setText(const Common::String &msg);
- virtual void proc15();
+ virtual void animateSpeaker();
};
// Classes related to SeekerL
-class SpeakerSeekerL : public VisualSpeaker {
+class SpeakerSeekerL : public SpeakerSeeker {
public:
SpeakerSeekerL();
@@ -509,7 +509,7 @@ public:
SpeakerSocko3200();
virtual Common::String getClassName() { return "SpeakerSocko3200"; }
- virtual void proc15();
+ virtual void animateSpeaker();
};
// Classes related to Soldier
@@ -524,7 +524,7 @@ class SpeakerSoldier300 : public SpeakerSoldier {
public:
SpeakerSoldier300() : SpeakerSoldier(60) {}
virtual Common::String getClassName() { return "SpeakerSoldier300"; }
- virtual void proc15();
+ virtual void animateSpeaker();
};
class SpeakerSoldier1625 : public SpeakerSoldier {
@@ -550,37 +550,37 @@ public:
class SpeakerTeal180 : public SpeakerTeal {
public:
virtual Common::String getClassName() { return "SpeakerTeal180"; }
- virtual void proc15();
+ virtual void animateSpeaker();
};
class SpeakerTeal300 : public SpeakerTeal {
public:
virtual Common::String getClassName() { return "SpeakerTeal300"; }
- virtual void proc15();
+ virtual void animateSpeaker();
};
class SpeakerTeal1625 : public SpeakerTeal {
public:
virtual Common::String getClassName() { return "SpeakerTeal1625"; }
- virtual void proc15();
+ virtual void animateSpeaker();
};
class SpeakerTeal3240 : public SpeakerTeal {
public:
virtual Common::String getClassName() { return "SpeakerTeal3240"; }
- virtual void proc15();
+ virtual void animateSpeaker();
};
class SpeakerTeal3400 : public SpeakerTeal {
public:
virtual Common::String getClassName() { return "SpeakerTeal3400"; }
- virtual void proc15();
+ virtual void animateSpeaker();
};
class SpeakerTeal3600 : public SpeakerTealMode7 {
public:
virtual Common::String getClassName() { return "SpeakerTeal3600"; }
- virtual void proc15();
+ virtual void animateSpeaker();
};
// Classes related to Tomko
@@ -590,7 +590,7 @@ public:
SpeakerTomko3245();
virtual Common::String getClassName() { return "SpeakerTomko3245"; }
- virtual void proc15();
+ virtual void animateSpeaker();
};
// Classes related to Webbster
@@ -605,7 +605,7 @@ class SpeakerWebbster180 : public SpeakerWebbster {
public:
SpeakerWebbster180() : SpeakerWebbster(27) {}
virtual Common::String getClassName() { return "SpeakerWebbster180"; }
- virtual void proc15();
+ virtual void animateSpeaker();
};
class SpeakerWebbster2500 : public SpeakerWebbster {
@@ -619,7 +619,7 @@ public:
SpeakerWebbster3240() : SpeakerWebbster(10) {}
virtual Common::String getClassName() { return "SpeakerWebbster3240"; }
- virtual void proc15();
+ virtual void animateSpeaker();
};
class SpeakerWebbster3375 : public SpeakerWebbster {
@@ -627,7 +627,7 @@ public:
SpeakerWebbster3375() : SpeakerWebbster(60) {}
virtual Common::String getClassName() { return "SpeakerWebbster3375"; }
- virtual void proc15();
+ virtual void animateSpeaker();
};
class SpeakerWebbster3385 : public SpeakerWebbster {
@@ -635,7 +635,7 @@ public:
SpeakerWebbster3385() : SpeakerWebbster(60) {}
virtual Common::String getClassName() { return "SpeakerWebbster3385"; }
- virtual void proc15();
+ virtual void animateSpeaker();
};
class SpeakerWebbster3395 : public SpeakerWebbster {
@@ -643,7 +643,7 @@ public:
SpeakerWebbster3395() : SpeakerWebbster(60) {}
virtual Common::String getClassName() { return "SpeakerWebbster3395"; }
- virtual void proc15();
+ virtual void animateSpeaker();
};
class SpeakerWebbster3400 : public SpeakerWebbster {
@@ -651,7 +651,7 @@ public:
SpeakerWebbster3400() : SpeakerWebbster(27) {}
virtual Common::String getClassName() { return "SpeakerWebbster3400"; }
- virtual void proc15();
+ virtual void animateSpeaker();
};
class SpeakerDutyOfficer180: public VisualSpeaker {
@@ -659,7 +659,7 @@ public:
SpeakerDutyOfficer180();
virtual Common::String getClassName() { return "SpeakerDutyOfficer"; }
- virtual void proc15();
+ virtual void animateSpeaker();
};
} // End of namespace Ringworld2
diff --git a/engines/tsage/saveload.cpp b/engines/tsage/saveload.cpp
index dbc122e6e4..9954b929b2 100644
--- a/engines/tsage/saveload.cpp
+++ b/engines/tsage/saveload.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope 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.
@@ -47,6 +47,8 @@ SavedObject::~SavedObject() {
Saver::Saver() {
_macroSaveFlag = false;
_macroRestoreFlag = false;
+
+ _factoryPtr = nullptr;
}
Saver::~Saver() {
@@ -127,7 +129,6 @@ Common::Error Saver::save(int slot, const Common::String &saveName) {
// Set fields
_macroSaveFlag = true;
- _saveSlot = slot;
// Try and create the save file
Common::OutSaveFile *saveFile = g_system->getSavefileManager()->openForSaving(g_vm->generateSaveName(slot));
@@ -140,8 +141,8 @@ Common::Error Saver::save(int slot, const Common::String &saveName) {
// Write out the savegame header
tSageSavegameHeader header;
- header.saveName = saveName;
- header.version = TSAGE_SAVEGAME_VERSION;
+ header._saveName = saveName;
+ header._version = TSAGE_SAVEGAME_VERSION;
writeSavegameHeader(saveFile, header);
// Save out objects that need to come at the start of the savegame
@@ -177,7 +178,6 @@ Common::Error Saver::restore(int slot) {
// Set fields
_macroRestoreFlag = true;
- _saveSlot = slot;
_unresolvedPtrs.clear();
// Set up the serializer
@@ -190,11 +190,11 @@ Common::Error Saver::restore(int slot) {
// Read in the savegame header
tSageSavegameHeader header;
readSavegameHeader(saveFile, header);
- if (header.thumbnail)
- header.thumbnail->free();
- delete header.thumbnail;
+ if (header._thumbnail)
+ header._thumbnail->free();
+ delete header._thumbnail;
- serializer.setSaveVersion(header.version);
+ serializer.setSaveVersion(header._version);
// Load in data for objects that need to come at the start of the savegame
for (Common::List<SaveListener *>::iterator i = _listeners.begin(); i != _listeners.end(); ++i) {
@@ -242,34 +242,34 @@ const char *SAVEGAME_STR = "SCUMMVM_TSAGE";
bool Saver::readSavegameHeader(Common::InSaveFile *in, tSageSavegameHeader &header) {
char saveIdentBuffer[SAVEGAME_STR_SIZE + 1];
- header.thumbnail = NULL;
+ header._thumbnail = NULL;
// Validate the header Id
in->read(saveIdentBuffer, SAVEGAME_STR_SIZE + 1);
if (strncmp(saveIdentBuffer, SAVEGAME_STR, SAVEGAME_STR_SIZE))
return false;
- header.version = in->readByte();
- if (header.version > TSAGE_SAVEGAME_VERSION)
+ header._version = in->readByte();
+ if (header._version > TSAGE_SAVEGAME_VERSION)
return false;
// Read in the string
- header.saveName.clear();
+ header._saveName.clear();
char ch;
- while ((ch = (char)in->readByte()) != '\0') header.saveName += ch;
+ while ((ch = (char)in->readByte()) != '\0') header._saveName += ch;
// Get the thumbnail
- header.thumbnail = Graphics::loadThumbnail(*in);
- if (!header.thumbnail)
+ header._thumbnail = Graphics::loadThumbnail(*in);
+ if (!header._thumbnail)
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();
- header.totalFrames = in->readUint32LE();
+ header._saveYear = in->readSint16LE();
+ header._saveMonth = in->readSint16LE();
+ header._saveDay = in->readSint16LE();
+ header._saveHour = in->readSint16LE();
+ header._saveMinutes = in->readSint16LE();
+ header._totalFrames = in->readUint32LE();
return true;
}
@@ -281,7 +281,7 @@ void Saver::writeSavegameHeader(Common::OutSaveFile *out, tSageSavegameHeader &h
out->writeByte(TSAGE_SAVEGAME_VERSION);
// Write savegame name
- out->write(header.saveName.c_str(), header.saveName.size() + 1);
+ out->write(header._saveName.c_str(), header._saveName.size() + 1);
// Get the active palette
uint8 thumbPalette[256 * 3];
diff --git a/engines/tsage/saveload.h b/engines/tsage/saveload.h
index d43ef792bc..be5ff51ffb 100644
--- a/engines/tsage/saveload.h
+++ b/engines/tsage/saveload.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope 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.
@@ -33,22 +33,22 @@ namespace TsAGE {
typedef void (*SaveNotifierFn)(bool postFlag);
-#define TSAGE_SAVEGAME_VERSION 10
+#define TSAGE_SAVEGAME_VERSION 15
class SavedObject;
struct tSageSavegameHeader {
- uint8 version;
- Common::String saveName;
- Graphics::Surface *thumbnail;
- int saveYear, saveMonth, saveDay;
- int saveHour, saveMinutes;
- int totalFrames;
+ uint8 _version;
+ Common::String _saveName;
+ Graphics::Surface *_thumbnail;
+ int _saveYear, _saveMonth, _saveDay;
+ int _saveHour, _saveMinutes;
+ int _totalFrames;
};
/*--------------------------------------------------------------------------*/
-// FIXME: workaround to supress spurious strict-alias warnings on older GCC
+// FIXME: workaround to suppress spurious strict-alias warnings on older GCC
// versions. this should be resolved with the savegame rewrite
#define SYNC_POINTER(x) do { \
SavedObject **y = (SavedObject **)((void *)&x); \
@@ -59,7 +59,7 @@ struct tSageSavegameHeader {
if (s.isLoading()) FIELD = (TYPE)v_##FIELD;
/**
- * Derived serializer class with extra synchronisation types
+ * Derived serializer class with extra synchronization types
*/
class Serializer : public Common::Serializer {
public:
@@ -212,7 +212,6 @@ private:
bool _macroSaveFlag;
bool _macroRestoreFlag;
- int _saveSlot;
void resolveLoadPointers();
public:
diff --git a/engines/tsage/scenes.cpp b/engines/tsage/scenes.cpp
index 58bb8c4a44..80ce1e3ecc 100644
--- a/engines/tsage/scenes.cpp
+++ b/engines/tsage/scenes.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope 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.
@@ -43,6 +43,7 @@ SceneManager::SceneManager() {
g_saver->addListener(this);
_objectCount = 0;
_loadMode = 0;
+ _sceneLoadCount = 0;
}
SceneManager::~SceneManager() {
@@ -149,6 +150,7 @@ void SceneManager::fadeInIfNecessary() {
void SceneManager::changeScene(int newSceneNumber) {
debug(1, "changeScene(%d)", newSceneNumber);
+
// Fade out the scene
ScenePalette scenePalette;
uint32 adjustData = 0;
@@ -273,6 +275,8 @@ Scene::Scene() : _sceneBounds(0, 0, SCREEN_WIDTH, SCREEN_HEIGHT),
_activeScreenNumber = 0;
_oldSceneBounds = Rect(4000, 4000, 4100, 4100);
Common::fill(&_zoomPercents[0], &_zoomPercents[256], 0);
+
+ _screenNumber = 0;
}
Scene::~Scene() {
@@ -282,15 +286,23 @@ void Scene::synchronize(Serializer &s) {
if (s.getVersion() >= 2)
StripCallback::synchronize(s);
- s.syncAsSint32LE(_field12);
+ if (s.getVersion() < 14) {
+ int useless = 0;
+ s.syncAsSint32LE(useless);
+ }
+
s.syncAsSint32LE(_screenNumber);
s.syncAsSint32LE(_activeScreenNumber);
s.syncAsSint32LE(_sceneMode);
_backgroundBounds.synchronize(s);
_sceneBounds.synchronize(s);
_oldSceneBounds.synchronize(s);
- s.syncAsSint16LE(_fieldA);
- s.syncAsSint16LE(_fieldE);
+
+ if (s.getVersion() < 14) {
+ int useless = 0;
+ s.syncAsSint16LE(useless);
+ s.syncAsSint16LE(useless);
+ }
for (int i = 0; i < 256; ++i)
s.syncAsUint16LE(_enabledSections[i]);
@@ -303,7 +315,6 @@ void Scene::synchronize(Serializer &s) {
void Scene::postInit(SceneObjectList *OwnerList) {
_action = NULL;
- _field12 = 0;
_sceneMode = 0;
}
diff --git a/engines/tsage/scenes.h b/engines/tsage/scenes.h
index d5ac88c692..9e3857af5e 100644
--- a/engines/tsage/scenes.h
+++ b/engines/tsage/scenes.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope 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.
@@ -35,7 +35,6 @@ class Scene : public StripCallback {
private:
void drawBackgroundObjects();
public:
- int _field12;
int _screenNumber;
int _activeScreenNumber;
int _sceneMode;
@@ -49,9 +48,6 @@ public:
int _zoomPercents[256];
ScenePriorities _priorities;
SceneObjectList _bgSceneObjects;
-
- int _fieldA;
- int _fieldE;
public:
Scene();
virtual ~Scene();
diff --git a/engines/tsage/sound.cpp b/engines/tsage/sound.cpp
index 02abc58178..c5c38505a7 100644
--- a/engines/tsage/sound.cpp
+++ b/engines/tsage/sound.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope 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.
@@ -120,17 +120,31 @@ void SoundManager::syncSounds() {
bool mute = false;
if (ConfMan.hasKey("mute"))
mute = ConfMan.getBool("mute");
+ bool subtitles = ConfMan.hasKey("subtitles") ? ConfMan.getBool("subtitles") : true;
bool music_mute = mute;
+ bool voice_mute = mute;
if (!mute) {
music_mute = ConfMan.getBool("music_mute");
+ voice_mute = ConfMan.getBool("speech_mute");
}
// Get the new music volume
int musicVolume = music_mute ? 0 : MIN(255, ConfMan.getInt("music_volume"));
this->setMasterVol(musicVolume / 2);
+
+ // Return to Ringworld voice settings
+ if (g_vm->getGameID() == GType_Ringworld2) {
+ // If we don't have voice, then ensure that text is turned on
+ if (voice_mute)
+ subtitles = true;
+
+ R2_GLOBALS._speechSubtitles =
+ (voice_mute ? 0 : SPEECH_VOICE) |
+ (!subtitles ? 0 : SPEECH_TEXT);
+ }
}
void SoundManager::update() {
@@ -454,8 +468,9 @@ void SoundManager::sfProcessFading() {
if (vtStruct->_voiceType == VOICETYPE_1) {
for (uint idx = 0; idx < vtStruct->_entries.size(); ++idx) {
- if (vtStruct->_entries[idx]._type1._field6 >= -1)
- ++vtStruct->_entries[idx]._type1._field6;
+ VoiceStructEntryType1 &vte = vtStruct->_entries[idx]._type1;
+ if (vte._field6 >= -1)
+ ++vte._field6;
}
}
}
@@ -485,22 +500,22 @@ void SoundManager::sfUpdateVoiceStructs() {
if (vs->_voiceType == VOICETYPE_0) {
for (uint idx = 0; idx < vs->_entries.size(); ++idx) {
- VoiceStructEntry &vse = vs->_entries[idx];
+ VoiceStructEntryType0 &vte = vs->_entries[idx]._type0;
- vse._type0._sound = vse._type0._sound2;
- vse._type0._channelNum = vse._type0._channelNum2;
- vse._type0._priority = vse._type0._priority2;
- vse._type0._fieldA = vse._type0._field12;
+ vte._sound = vte._sound2;
+ vte._channelNum = vte._channelNum2;
+ vte._priority = vte._priority2;
+ vte._fieldA = vte._field12;
}
} else {
vs->_field3 = vs->_numVoices;
for (uint idx = 0; idx < vs->_entries.size(); ++idx) {
- VoiceStructEntry &vse = vs->_entries[idx];
+ VoiceStructEntryType1 &vte = vs->_entries[idx]._type1;
- vse._type1._sound = vse._type1._sound2;
- vse._type1._channelNum = vse._type1._channelNum2;
- vse._type1._priority = vse._type1._priority2;
+ vte._sound = vte._sound2;
+ vte._channelNum = vte._channelNum2;
+ vte._priority = vte._priority2;
}
}
}
@@ -515,16 +530,16 @@ void SoundManager::sfUpdateVoiceStructs2() {
for (uint idx = 0; idx < vtStruct->_entries.size(); ++idx) {
if (vtStruct->_voiceType == VOICETYPE_0) {
- VoiceStructEntryType0 &vse = vtStruct->_entries[idx]._type0;
- vse._sound2 = vse._sound;
- vse._channelNum2 = vse._channelNum;
- vse._priority2 = vse._priority;
- vse._field12 = vse._fieldA;
+ VoiceStructEntryType0 &vte = vtStruct->_entries[idx]._type0;
+ vte._sound2 = vte._sound;
+ vte._channelNum2 = vte._channelNum;
+ vte._priority2 = vte._priority;
+ vte._field12 = vte._fieldA;
} else {
- VoiceStructEntryType1 &vse = vtStruct->_entries[idx]._type1;
- vse._sound2 = vse._sound;
- vse._channelNum2 = vse._channelNum;
- vse._priority2 = vse._priority;
+ VoiceStructEntryType1 &vte = vtStruct->_entries[idx]._type1;
+ vte._sound2 = vte._sound;
+ vte._channelNum2 = vte._channelNum;
+ vte._priority2 = vte._priority;
}
}
}
@@ -710,7 +725,7 @@ void SoundManager::sfRethinkSoundDrivers() {
ve._type0._sound = NULL;
ve._type0._channelNum = 0;
ve._type0._priority = 0;
- ve._type0._fieldA = 0;
+ ve._type0._fieldA = false;
vs->_entries.push_back(ve);
}
@@ -759,32 +774,31 @@ void SoundManager::sfRethinkVoiceTypes() {
if (vs->_voiceType == VOICETYPE_0) {
for (uint idx = 0; idx < vs->_entries.size(); ++idx) {
- VoiceStructEntry &vse = vs->_entries[idx];
- vse._type0._sound3 = vse._type0._sound;
- vse._type0._channelNum3 = vse._type0._channelNum;
- vse._type0._priority3 = vse._type0._priority;
- vse._type0._field1A = vse._type0._fieldA;
- vse._type0._sound = NULL;
- vse._type0._channelNum = 0;
- vse._type0._priority = 0;
- vse._type0._fieldA = 0;
- vse._type0._sound2 = NULL;
- vse._type0._channelNum2 = 0;
- vse._type0._priority2 = 0;
- vse._type0._field12 = 0;
+ VoiceStructEntryType0 &vte = vs->_entries[idx]._type0;
+ vte._sound3 = vte._sound;
+ vte._channelNum3 = vte._channelNum;
+ vte._priority3 = vte._priority;
+ vte._sound = NULL;
+ vte._channelNum = 0;
+ vte._priority = 0;
+ vte._fieldA = false;
+ vte._sound2 = NULL;
+ vte._channelNum2 = 0;
+ vte._priority2 = 0;
+ vte._field12 = false;
}
} else {
for (uint idx = 0; idx < vs->_entries.size(); ++idx) {
- VoiceStructEntry &vse = vs->_entries[idx];
- vse._type1._sound3 = vse._type1._sound;
- vse._type1._channelNum3 = vse._type1._channelNum;
- vse._type1._priority3 = vse._type1._priority;
- vse._type1._sound = NULL;
- vse._type1._channelNum = 0;
- vse._type1._priority = 0;
- vse._type1._sound2 = NULL;
- vse._type1._channelNum2 = 0;
- vse._type1._priority2 = 0;
+ VoiceStructEntryType1 &vte = vs->_entries[idx]._type1;
+ vte._sound3 = vte._sound;
+ vte._channelNum3 = vte._channelNum;
+ vte._priority3 = vte._priority;
+ vte._sound = NULL;
+ vte._channelNum = 0;
+ vte._priority = 0;
+ vte._sound2 = NULL;
+ vte._channelNum2 = 0;
+ vte._priority2 = 0;
}
// Reset the number of voices available
@@ -844,10 +858,11 @@ void SoundManager::sfRethinkVoiceTypes() {
if (numVoices >= chNumVoices) {
int channelCount = chNumVoices, idx = 0;
while (channelCount > 0) {
- if (!vtStruct->_entries[idx]._type1._sound2) {
- vtStruct->_entries[idx]._type1._sound2 = sound;
- vtStruct->_entries[idx]._type1._channelNum2 = foundIndex;
- vtStruct->_entries[idx]._type1._priority2 = foundPriority;
+ VoiceStructEntryType1 &vte = vtStruct->_entries[idx]._type1;
+ if (!vte._sound2) {
+ vte._sound2 = sound;
+ vte._channelNum2 = foundIndex;
+ vte._priority2 = foundPriority;
--channelCount;
}
++idx;
@@ -867,10 +882,11 @@ void SoundManager::sfRethinkVoiceTypes() {
}
for (uint idx = 0; idx < vtStruct->_entries.size(); ++idx) {
- if (vtStruct->_entries[idx]._type1._priority2 == maxPriority) {
- vtStruct->_entries[idx]._type1._sound2 = NULL;
- vtStruct->_entries[idx]._type1._channelNum2 = 0;
- vtStruct->_entries[idx]._type1._priority2 = 0;
+ VoiceStructEntryType1 &vte = vtStruct->_entries[idx]._type1;
+ if (vte._priority2 == maxPriority) {
+ vte._sound2 = NULL;
+ vte._channelNum2 = 0;
+ vte._priority2 = 0;
++numVoices;
}
}
@@ -878,10 +894,11 @@ void SoundManager::sfRethinkVoiceTypes() {
int voicesCtr = chNumVoices;
for (uint idx = 0; (idx < vtStruct->_entries.size()) && (voicesCtr > 0); ++idx) {
- if (!vtStruct->_entries[idx]._type1._sound2) {
- vtStruct->_entries[idx]._type1._sound2 = sound;
- vtStruct->_entries[idx]._type1._channelNum2 = foundIndex;
- vtStruct->_entries[idx]._type1._priority2 = foundPriority;
+ VoiceStructEntryType1 &vte = vtStruct->_entries[idx]._type1;
+ if (!vte._sound2) {
+ vte._sound2 = sound;
+ vte._channelNum2 = foundIndex;
+ vte._priority2 = foundPriority;
--voicesCtr;
}
}
@@ -918,10 +935,11 @@ void SoundManager::sfRethinkVoiceTypes() {
}
if (entryIndex != -1) {
- vtStruct->_entries[entryIndex]._type0._sound2 = sound;
- vtStruct->_entries[entryIndex]._type0._channelNum2 = foundIndex;
- vtStruct->_entries[entryIndex]._type0._priority2 = foundPriority;
- vtStruct->_entries[entryIndex]._type0._field12 = 0;
+ VoiceStructEntryType0 &vte = vtStruct->_entries[entryIndex]._type0;
+ vte._sound2 = sound;
+ vte._channelNum2 = foundIndex;
+ vte._priority2 = foundPriority;
+ vte._field12 = false;
continue;
}
@@ -939,10 +957,11 @@ void SoundManager::sfRethinkVoiceTypes() {
}
if (entryIndex != -1) {
- vtStruct->_entries[entryIndex]._type0._sound2 = sound;
- vtStruct->_entries[entryIndex]._type0._channelNum2 = foundIndex;
- vtStruct->_entries[entryIndex]._type0._priority2 = foundPriority;
- vtStruct->_entries[entryIndex]._type0._field12 = 0;
+ VoiceStructEntryType0 &vte = vtStruct->_entries[entryIndex]._type0;
+ vte._sound2 = sound;
+ vte._channelNum2 = foundIndex;
+ vte._priority2 = foundPriority;
+ vte._field12 = false;
continue;
}
@@ -955,7 +974,7 @@ void SoundManager::sfRethinkVoiceTypes() {
int entryIndex = -1;
for (uint idx = 0; idx < vtStruct->_entries.size(); ++idx) {
if (vtStruct->_entries[idx]._voiceNum == foundIndex) {
- foundIndex = true;
+ foundMatch = true;
if (!vtStruct->_entries[idx]._type0._sound2) {
entryIndex = idx;
break;
@@ -964,10 +983,11 @@ void SoundManager::sfRethinkVoiceTypes() {
}
if (entryIndex != -1) {
- vtStruct->_entries[entryIndex]._type0._sound2 = sound;
- vtStruct->_entries[entryIndex]._type0._channelNum2 = foundIndex;
- vtStruct->_entries[entryIndex]._type0._priority2 = foundPriority;
- vtStruct->_entries[entryIndex]._type0._field12 = 0;
+ VoiceStructEntryType0 &vte = vtStruct->_entries[entryIndex]._type0;
+ vte._sound2 = sound;
+ vte._channelNum2 = foundIndex;
+ vte._priority2 = foundPriority;
+ vte._field12 = false;
continue;
}
@@ -994,7 +1014,7 @@ void SoundManager::sfRethinkVoiceTypes() {
if (vtStruct->_entries[idx]._type0._priority2 > maxPriority) {
maxPriority = vtStruct->_entries[idx]._type0._priority2;
- entryIndex = -1;
+ entryIndex = idx;
}
}
@@ -1003,10 +1023,11 @@ void SoundManager::sfRethinkVoiceTypes() {
continue;
if (entryIndex != -1) {
- vtStruct->_entries[entryIndex]._type0._sound2 = sound;
- vtStruct->_entries[entryIndex]._type0._channelNum2 = foundIndex;
- vtStruct->_entries[entryIndex]._type0._priority2 = foundPriority;
- vtStruct->_entries[entryIndex]._type0._field12 = 1;
+ VoiceStructEntryType0 &vte = vtStruct->_entries[entryIndex]._type0;
+ vte._sound2 = sound;
+ vte._channelNum2 = foundIndex;
+ vte._priority2 = foundPriority;
+ vte._field12 = true;
continue;
}
@@ -1021,14 +1042,15 @@ void SoundManager::sfRethinkVoiceTypes() {
for (uint idx = 0; idx < vtStruct->_entries.size(); ++idx) {
if (vtStruct->_entries[idx]._field1) {
- if (!vtStruct->_entries[idx]._type0._sound2) {
+ VoiceStructEntryType0 &vte = vtStruct->_entries[idx]._type0;
+ if (!vte._sound2) {
if (vtStruct->_entries[idx]._voiceNum > maxVoiceNum) {
maxVoiceNum = vtStruct->_entries[idx]._voiceNum;
voiceIndex = idx;
}
} else {
- if (vtStruct->_entries[idx]._type0._priority2 > maxPriority) {
- maxPriority = vtStruct->_entries[idx]._type0._priority2;
+ if (vte._priority2 > maxPriority) {
+ maxPriority = vte._priority2;
priorityIndex = idx;
}
}
@@ -1046,7 +1068,7 @@ void SoundManager::sfRethinkVoiceTypes() {
vteSrc._sound2 = sound;
vteSrc._channelNum2 = foundIndex;
vteSrc._priority2 = foundPriority;
- vteSrc._field12 = 1;
+ vteSrc._field12 = true;
continue;
}
@@ -1070,7 +1092,7 @@ void SoundManager::sfRethinkVoiceTypes() {
vteSrc._sound2 = sound;
vteSrc._channelNum2 = foundIndex;
vteSrc._priority2 = foundPriority;
- vteSrc._field12 = 1;
+ vteSrc._field12 = true;
continue;
}
}
@@ -1101,10 +1123,10 @@ void SoundManager::sfRethinkVoiceTypes() {
++total;
vse._priority = vse._priority2;
- vse._fieldA = 1;
+ vse._fieldA = true;
vse._sound2 = NULL;
- if (total) {
+ if ((total) && vse._sound) {
driver->proc24(vse._channelNum, idx, vse._sound, 123, 0);
driver->proc24(vse._channelNum, idx, vse._sound, 1, vse._sound->_chModulation[vse._channelNum]);
driver->proc24(vse._channelNum, idx, vse._sound, 7,
@@ -1121,7 +1143,7 @@ void SoundManager::sfRethinkVoiceTypes() {
vse._sound = NULL;
vse._channelNum = 0;
vse._priority = 0;
- vse._fieldA = 0;
+ vse._fieldA = false;
}
}
@@ -1134,13 +1156,13 @@ void SoundManager::sfRethinkVoiceTypes() {
continue;
for (uint entryIndex = 0; entryIndex < vs->_entries.size(); ++entryIndex) {
- if ((vs->_entries[entryIndex]._type0._sound3 != sound) ||
- (vs->_entries[entryIndex]._type0._channelNum3 != channelNum)) {
+ VoiceStructEntryType0 &vteCur = vs->_entries[entryIndex]._type0;
+ if ((vteCur._sound3 != sound) || (vteCur._channelNum3 != channelNum)) {
// Found match
- vs->_entries[entryIndex]._type0._sound = sound;
- vs->_entries[entryIndex]._type0._channelNum = channelNum;
- vs->_entries[entryIndex]._type0._priority = vse._priority2;
- vs->_entries[entryIndex]._type0._fieldA = 0;
+ vteCur._sound = sound;
+ vteCur._channelNum = channelNum;
+ vteCur._priority = vse._priority2;
+ vteCur._fieldA = false;
vse._sound2 = NULL;
break;
}
@@ -1171,7 +1193,7 @@ void SoundManager::sfRethinkVoiceTypes() {
vseFound._sound = vse._sound2;
vseFound._channelNum = vse._channelNum2;
vseFound._priority = vse._priority2;
- vseFound._fieldA = 0;
+ vseFound._fieldA = false;
SoundDriver *driver = vs->_entries[foundIndex]._driver;
assert(driver);
@@ -1201,10 +1223,10 @@ void SoundManager::sfRethinkVoiceTypes() {
} else {
// Type 1
for (uint idx = 0; idx < vs->_entries.size(); ++idx) {
- VoiceStructEntry &vse = vs->_entries[idx];
- vse._type1._sound = NULL;
- vse._type1._channelNum = 0;
- vse._type1._priority = 0;
+ VoiceStructEntryType1 &vte = vs->_entries[idx]._type1;
+ vte._sound = NULL;
+ vte._channelNum = 0;
+ vte._priority = 0;
}
for (uint idx = 0; idx < vs->_entries.size(); ++idx) {
@@ -1722,7 +1744,7 @@ uint32 Sound::getTimeIndex() const {
}
int Sound::getCueValue() const {
- return _cueValue;
+ return _cueValue == 0xff ? -1 : _cueValue;
}
void Sound::setCueValue(int cueValue) {
@@ -2174,9 +2196,10 @@ void Sound::soPlaySound(VoiceTypeStruct *vtStruct, const byte *channelData, int
SoundDriver *driver = vtStruct->_entries[entryIndex]._driver;
assert(driver);
- vtStruct->_entries[entryIndex]._type1._field6 = 0;
- vtStruct->_entries[entryIndex]._type1._field4 = v0;
- vtStruct->_entries[entryIndex]._type1._field5 = 0;
+ VoiceStructEntryType1 &vte = vtStruct->_entries[entryIndex]._type1;
+ vte._field6 = 0;
+ vte._field4 = v0;
+ vte._field5 = 0;
driver->playSound(channelData, 0, _chProgram[channelNum], vtStruct->_entries[entryIndex]._voiceNum, v0, v1);
}
@@ -2193,9 +2216,10 @@ void Sound::soPlaySound2(VoiceTypeStruct *vtStruct, const byte *channelData, int
assert(driver);
byte *trackData = _channelData[trackCtr];
- vtStruct->_entries[entryIndex]._type1._field6 = 0;
- vtStruct->_entries[entryIndex]._type1._field4 = v0;
- vtStruct->_entries[entryIndex]._type1._field5 = 0;
+ VoiceStructEntryType1 &vte = vtStruct->_entries[entryIndex]._type1;
+ vte._field6 = 0;
+ vte._field4 = v0;
+ vte._field5 = 0;
int v1, v2;
driver->playSound(trackData, 14, -1, vtStruct->_entries[entryIndex]._voiceNum, v0, 0x7F);
@@ -2322,9 +2346,10 @@ void Sound::soServiceTrackType1(int trackIndex, const byte *channelData) {
SoundDriver *driver = vtStruct->_entries[entryIndex]._driver;
assert(driver);
- vtStruct->_entries[entryIndex]._type1._field6 = 0;
- vtStruct->_entries[entryIndex]._type1._field4 = *(channelData + 1);
- vtStruct->_entries[entryIndex]._type1._field5 = 0;
+ VoiceStructEntryType1 &vte = vtStruct->_entries[entryIndex]._type1;
+ vte._field6 = 0;
+ vte._field4 = *(channelData + 1);
+ vte._field5 = 0;
int v1, v2;
driver->playSound(channelData, 14, -1, vtStruct->_entries[entryIndex]._voiceNum, *(channelData + 1), 0x7f);
@@ -2397,7 +2422,7 @@ int Sound::soFindSound(VoiceTypeStruct *vtStruct, int channelNum) {
/*--------------------------------------------------------------------------*/
ASound::ASound(): EventHandler() {
- _action = NULL;
+ _endAction = NULL;
_cueValue = -1;
if (g_globals)
g_globals->_sounds.push_back(this);
@@ -2424,23 +2449,23 @@ void ASound::dispatch() {
_cueValue = cueValue;
_sound.setCueValue(-1);
- if (_action)
- _action->signal();
+ if (_endAction)
+ _endAction->signal();
}
if (_cueValue != -1) {
if (!_sound.isPrimed()) {
_cueValue = -1;
- if (_action) {
- _action->signal();
- _action = NULL;
+ if (_endAction) {
+ _endAction->signal();
+ _endAction = NULL;
}
}
}
}
-void ASound::play(int soundNum, EventHandler *action, int volume) {
- _action = action;
+void ASound::play(int soundNum, EventHandler *endAction, int volume) {
+ _endAction = endAction;
_cueValue = 0;
setVol(volume);
@@ -2463,9 +2488,9 @@ void ASound::unPrime() {
_action = NULL;
}
-void ASound::fade(int fadeDest, int fadeSteps, int fadeTicks, bool stopAfterFadeFlag, EventHandler *action) {
- if (action)
- _action = action;
+void ASound::fade(int fadeDest, int fadeSteps, int fadeTicks, bool stopAfterFadeFlag, EventHandler *endAction) {
+ if (endAction)
+ _endAction = endAction;
_sound.fade(fadeDest, fadeSteps, fadeTicks, stopAfterFadeFlag);
}
@@ -2492,8 +2517,8 @@ void ASoundExt::signal() {
}
}
-void ASoundExt::fadeOut2(EventHandler *action) {
- fade(0, 10, 10, true, action);
+void ASoundExt::fadeOut2(EventHandler *endAction) {
+ fade(0, 10, 10, true, endAction);
}
void ASoundExt::changeSound(int soundNum) {
@@ -2525,6 +2550,12 @@ void PlayStream::ResFileData::load(Common::SeekableReadStream &stream) {
PlayStream::PlayStream(): EventHandler() {
_index = NULL;
_endAction = NULL;
+ _audioStream = NULL;
+
+ _resData._fileChunkSize = 0;
+ _resData._indexSize = 0;
+ _resData._chunkSize = 0;
+ _voiceNum = 0;
}
PlayStream::~PlayStream() {
@@ -2540,7 +2571,7 @@ bool PlayStream::setFile(const Common::String &filename) {
// Load header
_resData.load(_file);
-
+
// Load the index
_index = new uint16[_resData._indexSize / 2];
for (uint i = 0; i < (_resData._indexSize / 2); ++i)
@@ -2552,9 +2583,8 @@ bool PlayStream::setFile(const Common::String &filename) {
bool PlayStream::play(int voiceNum, EventHandler *endAction) {
uint32 offset = getFileOffset(_index, _resData._fileChunkSize, voiceNum);
if (offset) {
+ stop();
_voiceNum = 0;
- if (_sound.isPlaying())
- _sound.stop();
// Move to the offset for the start of the voice
_file.seek(offset);
@@ -2564,7 +2594,7 @@ bool PlayStream::play(int voiceNum, EventHandler *endAction) {
_file.read(&header[0], 4);
if (strncmp(header, "FEED", 4))
error("Invalid stream data");
-
+
// Get basic details of first sound chunk
uint chunkSize = _file.readUint16LE() - 16;
_file.skip(4);
@@ -2572,19 +2602,23 @@ bool PlayStream::play(int voiceNum, EventHandler *endAction) {
_file.skip(4);
// Create the stream
- Audio::QueuingAudioStream *audioStream = Audio::makeQueuingAudioStream(rate, false);
+ _audioStream = Audio::makeQueuingAudioStream(rate, false);
// Load in the first chunk
byte *data = (byte *)malloc(chunkSize);
_file.read(data, chunkSize);
- audioStream->queueBuffer(data, chunkSize, DisposeAfterUse::YES, Audio::FLAG_UNSIGNED);
-
+ _audioStream->queueBuffer(data, chunkSize, DisposeAfterUse::YES, Audio::FLAG_UNSIGNED);
+
// If necessary, load further chunks of the voice in
while (chunkSize == (_resData._chunkSize - 16)) {
// Ensure the next chunk has the 'MORE' header
_file.read(&header[0], 4);
+ if (!strncmp(header, "FEED", 4))
+ // Reached start of next voice sample, so stop
+ break;
if (strncmp(header, "MORE", 4))
- error("Invalid stream data");
+ // Not more remaining, so break
+ break;
// Get the size of the chunk
chunkSize = _file.readUint16LE() - 16;
@@ -2593,28 +2627,32 @@ bool PlayStream::play(int voiceNum, EventHandler *endAction) {
// Read in the data for this next chunk and queue it
data = (byte *)malloc(chunkSize);
_file.read(data, chunkSize);
- audioStream->queueBuffer(data, chunkSize, DisposeAfterUse::YES, Audio::FLAG_UNSIGNED);
+ _audioStream->queueBuffer(data, chunkSize, DisposeAfterUse::YES, Audio::FLAG_UNSIGNED);
}
- g_vm->_mixer->playStream(Audio::Mixer::kSpeechSoundType, &_soundHandle,
- audioStream, DisposeAfterUse::YES);
-
- return true;
+ g_vm->_mixer->playStream(Audio::Mixer::kSpeechSoundType, &_soundHandle,
+ _audioStream, DisposeAfterUse::YES);
+ _voiceNum = voiceNum;
+ _endAction = endAction;
+ return true;
}
-
+
// If it reaches this point, no valid voice data found
return false;
}
void PlayStream::stop() {
- g_vm->_mixer->stopHandle(_soundHandle);
+ if (_audioStream) {
+ g_vm->_mixer->stopHandle(_soundHandle);
+ }
+ _audioStream = NULL;
_voiceNum = 0;
_endAction = NULL;
}
bool PlayStream::isPlaying() const {
- return _voiceNum != 0 && g_vm->_mixer->isSoundHandleActive(_soundHandle);
+ return _audioStream != NULL && !_audioStream->endOfData();
}
void PlayStream::remove() {
@@ -2643,12 +2681,14 @@ void PlayStream::dispatch() {
}
uint32 PlayStream::getFileOffset(const uint16 *data, int count, int voiceNum) {
- assert(data);
+ if (!data)
+ return 0; // no valid voice data found
+
int bitsIndex = voiceNum & 7;
int byteIndex = voiceNum >> 3;
int shiftAmount = bitsIndex * 2;
int bitMask = 3 << shiftAmount;
- int v = (data[byteIndex] & bitMask) >> shiftAmount;
+ int v = (data[byteIndex] & bitMask) >> shiftAmount;
uint32 offset = 0;
if (!v)
@@ -2680,13 +2720,8 @@ SoundDriver::SoundDriver() {
const byte adlib_group_data[] = { 1, 1, 9, 1, 0xff };
-const byte v440B0[9] = { 0, 1, 2, 6, 7, 8, 12, 13, 14 };
-
-const byte v440B9[9] = { 3, 4, 5, 9, 10, 11, 15, 16, 17 };
-
-const byte v440C2[18] = {
- 0, 1, 2, 3, 4, 5, 8, 9, 10, 11, 12, 13, 16, 17, 18, 19, 20, 21
-};
+const byte adlib_operator1_offset[] = { 0, 1, 2, 8, 9, 10, 16, 17, 18 };
+const byte adlib_operator2_offset[] = { 3, 4, 5, 11, 12, 13, 19, 20, 21 };
const byte v44134[64] = {
0, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32,
@@ -2710,8 +2745,6 @@ AdlibSoundDriver::AdlibSoundDriver(): SoundDriver() {
_masterVolume = 0;
_groupData._groupMask = 9;
- _groupData._v1 = 0x46;
- _groupData._v2 = 0;
_groupData._pData = &adlib_group_data[0];
_mixer = g_vm->_mixer;
@@ -2817,10 +2850,10 @@ void AdlibSoundDriver::playSound(const byte *channelData, int dataOffset, int pr
_v4409E[channel] = dataP + offset - _patchData;
// Set sustain/release
- int portNum = v440C2[v440B0[channel]] + 0x80;
+ int portNum = adlib_operator1_offset[channel] + 0x80;
write(portNum, (_portContents[portNum] & 0xF0) | 0xF);
- portNum = v440C2[v440B9[channel]] + 0x80;
+ portNum = adlib_operator2_offset[channel] + 0x80;
write(portNum, (_portContents[portNum] & 0xF0) | 0xF);
if (_channelVoiced[channel])
@@ -2877,10 +2910,10 @@ void AdlibSoundDriver::updateChannelVolume(int channelNum) {
int level1 = !_v44082[channelNum] ? 63 - _v44070[channelNum] :
63 - v44134[volume * _v44070[channelNum] / 63];
- int portNum = v440C2[v440B0[channelNum]] + 0x40;
+ int portNum = adlib_operator1_offset[channelNum] + 0x40;
write(portNum, (_portContents[portNum] & 0x80) | level1);
- portNum = v440C2[v440B9[channelNum]] + 0x40;
+ portNum = adlib_operator2_offset[channelNum] + 0x40;
write(portNum, (_portContents[portNum] & 0x80) | level2);
}
@@ -2897,7 +2930,7 @@ void AdlibSoundDriver::clearVoice(int channel) {
void AdlibSoundDriver::updateChannel(int channel) {
const byte *dataP = _patchData + _v4409E[channel];
- int portOffset = v440C2[v440B0[channel]];
+ int portOffset = adlib_operator1_offset[channel];
int portNum = portOffset + 0x20;
int portValue = 0;
@@ -2920,7 +2953,7 @@ void AdlibSoundDriver::updateChannel(int channel) {
write(0x80 + portOffset, *(dataP + 14) | (*(dataP + 13) << 4));
write(0xE0 + portOffset, (_portContents[0xE0 + portOffset] & 0xFC) | *(dataP + 15));
- portOffset = v440C2[v440B9[channel]];
+ portOffset = adlib_operator2_offset[channel];
portNum = portOffset + 0x20;
portValue = 0;
if (*(dataP + 17))
@@ -3029,8 +3062,6 @@ SoundBlasterDriver::SoundBlasterDriver(): SoundDriver() {
_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;
@@ -3078,10 +3109,12 @@ void SoundBlasterDriver::playSound(const byte *channelData, int dataOffset, int
updateVoice(channel);
// Set the new channel data
- _channelData = channelData + dataOffset;
+ _channelData = channelData + dataOffset + 18;
// Make a copy of the buffer
int dataSize = g_vm->_memoryManager.getSize(channelData);
+ dataSize -= 18;
+
byte *soundData = (byte *)malloc(dataSize - dataOffset);
Common::copy(_channelData, _channelData + (dataSize - dataOffset), soundData);
diff --git a/engines/tsage/sound.h b/engines/tsage/sound.h
index 83cd4753d5..49558b4bca 100644
--- a/engines/tsage/sound.h
+++ b/engines/tsage/sound.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope 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.
@@ -63,8 +63,6 @@ public:
struct GroupData {
uint32 _groupMask;
- byte _v1;
- byte _v2;
const byte *_pData;
};
@@ -98,7 +96,7 @@ public:
virtual const GroupData *getGroupData() { return NULL; } // Method #3
virtual void installPatch(const byte *data, int size) {} // Method #4
virtual void poll() {} // Method #5
- virtual void proc12() {} // Method #6
+ virtual void method6() {} // Method #6
virtual int setMasterVolume(int volume) { return 0; } // Method #7
virtual void proc16() {} // Method #8
virtual void proc18(int al, VoiceType voiceType) {} // Method #9
@@ -120,15 +118,14 @@ struct VoiceStructEntryType0 {
Sound *_sound;
int _channelNum;
int _priority;
- int _fieldA;
+ bool _fieldA;
Sound *_sound2;
int _channelNum2;
int _priority2;
- int _field12;
+ bool _field12;
Sound *_sound3;
int _channelNum3;
int _priority3;
- int _field1A;
};
struct VoiceStructEntryType1 {
@@ -366,7 +363,7 @@ public:
class ASound: public EventHandler {
public:
Sound _sound;
- EventHandler *_action;
+ EventHandler *_endAction;
int _cueValue;
ASound();
@@ -374,7 +371,7 @@ public:
virtual void synchronize(Serializer &s);
virtual void dispatch();
- void play(int soundNum, EventHandler *action = NULL, int volume = 127);
+ void play(int soundNum, EventHandler *endAction = NULL, int volume = 127);
void stop();
void prime(int soundNum, Action *action = NULL);
void unPrime();
@@ -386,7 +383,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, EventHandler *action);
+ void fade(int fadeDest, int fadeSteps, int fadeTicks, bool stopAfterFadeFlag, EventHandler *endAction);
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); }
@@ -407,7 +404,7 @@ public:
int _soundNum;
ASoundExt();
- void fadeOut2(EventHandler *action);
+ void fadeOut2(EventHandler *endAction);
void changeSound(int soundNum);
virtual Common::String getClassName() { return "ASoundExt"; }
@@ -427,8 +424,8 @@ class PlayStream: public EventHandler {
private:
Common::File _file;
ResFileData _resData;
+ Audio::QueuingAudioStream *_audioStream;
Audio::SoundHandle _soundHandle;
- Sound _sound;
uint16 *_index;
EventHandler *_endAction;
int _voiceNum;
@@ -438,7 +435,7 @@ public:
PlayStream();
virtual ~PlayStream();
- bool setFile(const Common::String &filename);
+ bool setFile(const Common::String &filename);
bool play(int voiceNum, EventHandler *endAction);
void stop();
bool isPlaying() const;
diff --git a/engines/tsage/staticres.cpp b/engines/tsage/staticres.cpp
index 662efa19b4..311f7965c7 100644
--- a/engines/tsage/staticres.cpp
+++ b/engines/tsage/staticres.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -213,6 +213,14 @@ char const *const ACCESS_CODE_REQUIRED = "access code required";
char const *const INVALID_ACCESS_CODE = "invalid access code";
char const *const FOREIGN_OBJECT_EXTRACTED = "foreign object extracted";
+// Scene 1330/7 Options dialog messages
+char const *const AUTO_PLAY_ON = "Auto-Play is On";
+char const *const AUTO_PLAY_OFF = "Auto-Play is Off";
+char const *const START_NEW_CARD_GAME = "Start a new game";
+char const *const QUIT_CARD_GAME = "Quit Outpost Alpha";
+char const *const CONTINUE_CARD_GAME = "Continue Outpost Alpha";
+
+//
char const *const HELP_MSG = "\x1\rRETURN TO\r RINGWORLD\x14";
char const *const CHAR_TITLE = "\x01Select Character:";
char const *const CHAR_QUINN_MSG = " Quinn ";
@@ -245,6 +253,8 @@ char const *const USE_INTERCEPTOR = "Do you want to use your interceptor card?";
char const *const USE_DOUBLE_AGENT = "Do you want to use your double agent?";
char const *const NEED_INSTRUCTIONS = "Do you want instructions?";
char const *const WRONG_ANSWER_MSG = "Wrong respond value sent.";
+char const *const BUY_FULL_GAME_MSG = "To order the complete game, RETURN TO RINGWORLD, call 1-800-482-3766!";
+
const byte scene1550JunkLocationsDefault[] = {
20, 7, 41, 6,
3, 6, 42, 11,
@@ -398,8 +408,8 @@ const byte scene1550AreaMap[] = {
13, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 14
};
-const byte k5A72E[] = {0, 98, 135, 183, 229, 81, 133, 185, 235, 75, 131, 187, 241, 70, 129, 190, 247};
-const byte k5A73F[] = {0, 42, 42, 42, 42, 67, 67, 67, 67, 92, 92, 92, 92, 116, 116, 116, 116};
+const byte scene1550JunkX[] = {0, 98, 135, 183, 229, 81, 133, 185, 235, 75, 131, 187, 241, 70, 129, 190, 247};
+const byte scene1550JunkY[] = {0, 42, 42, 42, 42, 67, 67, 67, 67, 92, 92, 92, 92, 116, 116, 116, 116};
const byte k5A750[] = {
9, 10, 7, 13, 7, 8, 9, 7, 9, 10,
2, 3, 3, 2, 2, 2, 4, 3, 3, 4,
@@ -411,7 +421,7 @@ const byte k5A76D[] = {
3, 3, 3, 3, 3, 3, 3, 3, 3
};
const byte scene1550JunkRegions[] = {0, 8, 15, 16, 12, 7, 18, 17, 13, 6, 19, 20, 14, 5, 11, 10, 9};
-const byte k5A79B[] = {
+const byte scene1550SpecialAreas[] = {
23, 3, 1,
23, 4, 1,
26, 3, 1,
diff --git a/engines/tsage/staticres.h b/engines/tsage/staticres.h
index 7d97f2824d..f6fef378ae 100644
--- a/engines/tsage/staticres.h
+++ b/engines/tsage/staticres.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -165,6 +165,13 @@ extern char const *const ACCESS_CODE_REQUIRED;
extern char const *const INVALID_ACCESS_CODE;
extern char const *const FOREIGN_OBJECT_EXTRACTED;
+// Scene 1330/7 Options dialog messages
+extern char const *const AUTO_PLAY_ON;
+extern char const *const AUTO_PLAY_OFF;
+extern char const *const START_NEW_CARD_GAME;
+extern char const *const QUIT_CARD_GAME;
+extern char const *const CONTINUE_CARD_GAME;
+
// Dialog messages
extern char const *const HELP_MSG;
extern char const *const CHAR_TITLE;
@@ -199,15 +206,16 @@ extern char const *const USE_DOUBLE_AGENT;
extern char const *const NEED_INSTRUCTIONS;
extern char const *const WRONG_ANSWER_MSG;
+extern char const *const BUY_FULL_GAME_MSG;
// Scene 1550 arrays of constants
extern const byte scene1550JunkLocationsDefault[];
extern const byte scene1550AreaMap[];
-extern const byte k5A72E[];
-extern const byte k5A73F[];
+extern const byte scene1550JunkX[];
+extern const byte scene1550JunkY[];
extern const byte k5A750[];
extern const byte k5A76D[];
extern const byte scene1550JunkRegions[];
-extern const byte k5A79B[];
+extern const byte scene1550SpecialAreas[];
extern const byte k5A7F6[];
// Scene 2900 balloon data
diff --git a/engines/tsage/tsage.cpp b/engines/tsage/tsage.cpp
index 87697f950b..0b882d5cbf 100644
--- a/engines/tsage/tsage.cpp
+++ b/engines/tsage/tsage.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope 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.
@@ -38,10 +38,13 @@ TSageEngine::TSageEngine(OSystem *system, const tSageGameDescription *gameDesc)
_gameDescription(gameDesc) {
g_vm = this;
DebugMan.addDebugChannel(kRingDebugScripts, "scripts", "Scripts debugging");
- if (g_vm->getFeatures() & GF_DEMO)
- _debugger = new DemoDebugger();
- else if (g_vm->getGameID() == GType_Ringworld)
- _debugger = new RingworldDebugger();
+ _debugger = nullptr;
+ if (g_vm->getGameID() == GType_Ringworld) {
+ if (g_vm->getFeatures() & GF_DEMO)
+ _debugger = new DemoDebugger();
+ else
+ _debugger = new RingworldDebugger();
+ }
else if (g_vm->getGameID() == GType_BlueForce)
_debugger = new BlueForceDebugger();
else if (g_vm->getGameID() == GType_Ringworld2)
@@ -75,16 +78,16 @@ void TSageEngine::initialize() {
// Set up the resource manager
g_resourceManager = new ResourceManager();
- if (g_vm->getFeatures() & GF_DEMO) {
- // Add the single library file associated with the demo
- 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();
-
+ if (g_vm->getGameID() == GType_Ringworld) {
+ if (g_vm->getFeatures() & GF_DEMO) {
+ // Add the single library file associated with the demo
+ g_resourceManager->addLib(getPrimaryFilename());
+ g_globals = new Globals();
+ } else {
+ 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) {
@@ -103,7 +106,7 @@ void TSageEngine::initialize() {
g_globals = new Ringworld2::Ringworld2Globals();
// Setup the user interface
- T2_GLOBALS._uiElements.setup(Common::Point(0, UI_INTERFACE_Y - 2));
+ T2_GLOBALS._uiElements.setup(Common::Point(0, UI_INTERFACE_Y));
// Reset all global variables
R2_GLOBALS.reset();
@@ -124,7 +127,7 @@ void TSageEngine::deinitialize() {
}
Common::Error TSageEngine::run() {
- // Basic initialisation
+ // Basic initialization
initialize();
g_globals->_sceneHandler->registerHandler();
@@ -176,8 +179,4 @@ void TSageEngine::syncSoundSettings() {
g_globals->_soundManager.syncSounds();
}
-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 41179c4915..ea4f5da6ea 100644
--- a/engines/tsage/tsage.h
+++ b/engines/tsage/tsage.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope 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.
@@ -27,6 +27,7 @@
#include "common/rect.h"
#include "audio/mixer.h"
#include "common/file.h"
+#include "gui/debugger.h"
#include "tsage/core.h"
#include "tsage/resources.h"
@@ -76,12 +77,12 @@ public:
MemoryManager _memoryManager;
Debugger *_debugger;
+ GUI::Debugger *getDebugger() { return _debugger; }
const char *getGameId() const;
uint32 getGameID() const;
uint32 getFeatures() const;
Common::String getPrimaryFilename() const;
- bool shouldQuit();
virtual Common::Error init();
virtual Common::Error run();
diff --git a/engines/tsage/user_interface.cpp b/engines/tsage/user_interface.cpp
index 09cc2fd56d..3ee585d5ef 100644
--- a/engines/tsage/user_interface.cpp
+++ b/engines/tsage/user_interface.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope 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.
@@ -38,13 +38,15 @@ void StripProxy::process(Event &event) {
void UIElement::synchronize(Serializer &s) {
BackgroundSceneObject::synchronize(s);
- s.syncAsSint16LE(_field88);
+ if (s.getVersion() < 15) {
+ int useless = 0;
+ s.syncAsSint16LE(useless);
+ }
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;
@@ -87,7 +89,7 @@ void UIQuestion::showDescription(CursorType cursor) {
Ringworld2::SceneExt *scene = static_cast<Ringworld2::SceneExt *>
(R2_GLOBALS._sceneManager._scene);
if (!scene->_sceneAreas.contains(R2_GLOBALS._scannerDialog))
- R2_GLOBALS._scannerDialog->proc12(4, 1, 1, 160, 125);
+ R2_GLOBALS._scannerDialog->setup2(4, 1, 1, 160, 125);
} else {
// Show object description
SceneItem::display2(3, (int)cursor);
@@ -276,11 +278,30 @@ void UICollection::draw() {
Rect(0, UI_INTERFACE_Y, SCREEN_WIDTH, SCREEN_HEIGHT),
Rect(0, UI_INTERFACE_Y, SCREEN_WIDTH, SCREEN_HEIGHT));
+ if (g_vm->getGameID() == GType_Ringworld2)
+ r2rDrawFrame();
+
_clearScreen = 1;
g_globals->_sceneManager._scene->_sceneBounds = savedBounds;
}
}
+void UICollection::r2rDrawFrame() {
+ Visage visage;
+ visage.setVisage(2, 1);
+ GfxSurface vertLineLeft = visage.getFrame(1);
+ GfxSurface vertLineRight = visage.getFrame(3);
+ GfxSurface horizLine = visage.getFrame(2);
+
+ GLOBALS._screenSurface.copyFrom(horizLine, 0, 0);
+ GLOBALS._screenSurface.copyFrom(vertLineLeft, 0, 3);
+ GLOBALS._screenSurface.copyFrom(vertLineRight, SCREEN_WIDTH - 4, 3);
+
+ // Restrict drawing area to exclude the borders at the edge of the screen
+ R2_GLOBALS._screenSurface._clipRect = Rect(4, 3, SCREEN_WIDTH - 4,
+ SCREEN_HEIGHT - 3);
+}
+
/*--------------------------------------------------------------------------*/
UIElements::UIElements(): UICollection() {
@@ -289,6 +310,10 @@ UIElements::UIElements(): UICollection() {
else
_cursorVisage.setVisage(1, 5);
g_saver->addLoadNotifier(&UIElements::loadNotifierProc);
+
+ _slotStart = 0;
+ _scoreValue = 0;
+ _active = false;
}
void UIElements::synchronize(Serializer &s) {
diff --git a/engines/tsage/user_interface.h b/engines/tsage/user_interface.h
index d06dccd9a4..7cde2900f8 100644
--- a/engines/tsage/user_interface.h
+++ b/engines/tsage/user_interface.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope 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.
@@ -37,7 +37,6 @@ public:
class UIElement: public BackgroundSceneObject {
public:
- int _field88;
bool _enabled;
int _frameNum;
@@ -95,6 +94,8 @@ public:
};
class UICollection: public EventHandler {
+private:
+ void r2rDrawFrame();
protected:
void erase();
public:
diff --git a/engines/tucker/configure.engine b/engines/tucker/configure.engine
new file mode 100644
index 0000000000..06676cf0a4
--- /dev/null
+++ b/engines/tucker/configure.engine
@@ -0,0 +1,3 @@
+# This file is included from the main "configure" script
+# add_engine [name] [desc] [build-by-default] [subengines] [base games] [deps]
+add_engine tucker "Bud Tucker in Double Trouble" yes
diff --git a/engines/tucker/console.cpp b/engines/tucker/console.cpp
index 17ba2038d0..49e0ac479f 100644
--- a/engines/tucker/console.cpp
+++ b/engines/tucker/console.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope 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.
diff --git a/engines/tucker/console.h b/engines/tucker/console.h
index 6be56d5594..22f4d5803f 100644
--- a/engines/tucker/console.h
+++ b/engines/tucker/console.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/tucker/detection.cpp b/engines/tucker/detection.cpp
index e4a74f6c37..3d7859e4fd 100644
--- a/engines/tucker/detection.cpp
+++ b/engines/tucker/detection.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/tucker/graphics.cpp b/engines/tucker/graphics.cpp
index e6fb70ac16..b9c184e2bb 100644
--- a/engines/tucker/graphics.cpp
+++ b/engines/tucker/graphics.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -163,13 +163,13 @@ void Graphics::copyRect(uint8 *dst, int dstPitch, uint8 *src, int srcPitch, int
}
void Graphics::drawStringChar(uint8 *dst, int xDst, int yDst, int pitch, uint8 chr, uint8 chrColor, const uint8 *src) {
- if (chr < 32 || chr - 32 >= _charset.xCount * _charset.yCount) {
+ if (chr < 32 || chr - 32 >= _charset._xCount * _charset._yCount) {
return;
}
- const int h = MIN(_charset.charH, 200 - yDst);
- const int w = MIN(_charset.charW, pitch - xDst);
+ const int h = MIN(_charset._charH, 200 - yDst);
+ const int w = MIN(_charset._charW, pitch - xDst);
dst += yDst * pitch + xDst;
- int offset = (chr - 32) * _charset.charH * _charset.charW;
+ int offset = (chr - 32) * _charset._charH * _charset._charW;
for (int y = 0; y < h; ++y) {
for (int x = 0; x < w; ++x) {
const int color = src[offset++];
@@ -189,22 +189,22 @@ void Graphics::setCharset(CharsetType type) {
_charsetType = type;
switch (type) {
case kCharsetTypeDefault:
- _charset.charW = 10;
- _charset.charH = 10;
- _charset.xCount = 32;
- _charset.yCount = 7;
+ _charset._charW = 10;
+ _charset._charH = 10;
+ _charset._xCount = 32;
+ _charset._yCount = 7;
break;
case kCharsetTypeEng:
- _charset.charW = 10;
- _charset.charH = 8;
- _charset.xCount = 32;
- _charset.yCount = 3;
+ _charset._charW = 10;
+ _charset._charH = 8;
+ _charset._xCount = 32;
+ _charset._yCount = 3;
break;
case kCharsetTypeCredits:
- _charset.charW = 19;
- _charset.charH = 10;
- _charset.xCount = 16;
- _charset.yCount = 7;
+ _charset._charW = 19;
+ _charset._charH = 10;
+ _charset._xCount = 16;
+ _charset._yCount = 7;
break;
}
}
diff --git a/engines/tucker/graphics.h b/engines/tucker/graphics.h
index 2b4a57d65d..3e48179a30 100644
--- a/engines/tucker/graphics.h
+++ b/engines/tucker/graphics.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -34,16 +34,14 @@ enum CharsetType {
};
struct Charset {
- int charW;
- int charH;
- int xCount;
- int yCount;
+ int _charW;
+ int _charH;
+ int _xCount;
+ int _yCount;
};
class Graphics {
public:
-
-
static int encodeRLE(const uint8 *src, uint8 *dst, int w, int h);
static int encodeRAW(const uint8 *src, uint8 *dst, int w, int h);
diff --git a/engines/tucker/locations.cpp b/engines/tucker/locations.cpp
index f6d34c295b..b5fb10c59e 100644
--- a/engines/tucker/locations.cpp
+++ b/engines/tucker/locations.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -33,8 +33,8 @@ static const int _data3UpdateLocation1_yTable[] = { 152, 8, 95 };
void TuckerEngine::execData3PreUpdate_locationNum1() {
if (_flagsTable[1] == 1) {
_flagsTable[1] = 2;
- _locationSoundsTable[3].type = 2;
- startSound(_locationSoundsTable[3].offset, 3, _locationSoundsTable[3].volume);
+ _locationSoundsTable[3]._type = 2;
+ startSound(_locationSoundsTable[3]._offset, 3, _locationSoundsTable[3]._volume);
}
_mapSequenceFlagsLocationTable[0] = (_flagsTable[1] > 0) ? 1 : 0;
if (_updateLocationCounter == 0) {
@@ -66,7 +66,7 @@ void TuckerEngine::execData3PreUpdate_locationNum1Helper1() {
}
}
if (_updateLocationFlagsTable[0] == 1 && _updateLocationCounter == 0) {
- setVolumeSound(12, _locationSoundsTable[12].volume);
+ setVolumeSound(12, _locationSoundsTable[12]._volume);
} else {
setVolumeSound(12, 0);
}
@@ -122,7 +122,7 @@ void TuckerEngine::execData3PostUpdate_locationNum1() {
if (_flagsTable[63] == 0) {
if (getRandomNumber() < 400) {
_flagsTable[63] = 1;
- startSound(_locationSoundsTable[2].offset, 2, _locationSoundsTable[2].volume);
+ startSound(_locationSoundsTable[2]._offset, 2, _locationSoundsTable[2]._volume);
}
}
_locationHeightTable[1] = (_yPosCurrent > 104) ? 60 : 0;
@@ -130,48 +130,48 @@ void TuckerEngine::execData3PostUpdate_locationNum1() {
void TuckerEngine::updateSprite_locationNum2() {
if (_flagsTable[9] == 2) {
- _spritesTable[0].state = -1;
+ _spritesTable[0]._state = -1;
return;
}
if (_flagsTable[9] == 1) {
if (_flagsTable[10] == 1) {
- _spritesTable[0].state = -1;
+ _spritesTable[0]._state = -1;
} else if (_charSpeechSoundCounter > 0 && _actionCharacterNum == 0) {
- _spritesTable[0].state = 4;
- _spritesTable[0].needUpdate = 1;
+ _spritesTable[0]._state = 4;
+ _spritesTable[0]._needUpdate = true;
} else {
- _spritesTable[0].needUpdate = 0;
- _spritesTable[0].state = 5;
+ _spritesTable[0]._needUpdate = false;
+ _spritesTable[0]._state = 5;
_flagsTable[10] = 1;
- _spritesTable[0].gfxBackgroundOffset = 0;
+ _spritesTable[0]._gfxBackgroundOffset = 0;
}
return;
}
if (_charSpeechSoundCounter > 0 && _actionCharacterNum == 0) {
- _spritesTable[0].state = 3;
- _spritesTable[0].needUpdate = 1;
+ _spritesTable[0]._state = 3;
+ _spritesTable[0]._needUpdate = true;
return;
}
if (_csDataHandled) {
- _spritesTable[0].needUpdate = 0;
+ _spritesTable[0]._needUpdate = false;
if (_flagsTable[199] == 0) {
_flagsTable[199] = 1;
setCharacterAnimation(0, 0);
} else if (getRandomNumber() > 20000) {
- _spritesTable[0].state = 6;
+ _spritesTable[0]._state = 6;
} else {
- _spritesTable[0].state = 3;
- _spritesTable[0].updateDelay = 5;
+ _spritesTable[0]._state = 3;
+ _spritesTable[0]._updateDelay = 5;
}
} else {
if (_flagsTable[199] == 0) {
_flagsTable[199] = 1;
setCharacterAnimation(1, 0);
} else if (getRandomNumber() < 20000) {
- _spritesTable[0].state = 1;
- _spritesTable[0].updateDelay = 5;
+ _spritesTable[0]._state = 1;
+ _spritesTable[0]._updateDelay = 5;
} else {
- _spritesTable[0].state = 1;
+ _spritesTable[0]._state = 1;
}
}
}
@@ -199,7 +199,7 @@ void TuckerEngine::execData3PreUpdate_locationNum2() {
if (_updateLocationYPosTable2[i] > _updateLocationYMaxTable[i]) {
_updateLocationYPosTable2[i] = 0;
const int num = (getRandomNumber() < 16000) ? 2 : 3;
- startSound(_locationSoundsTable[num].offset, num, _locationSoundsTable[num].volume);
+ startSound(_locationSoundsTable[num]._offset, num, _locationSoundsTable[num]._volume);
}
} else if (getRandomNumber() > 32000) {
const int num = getRandomNumber() / 8192;
@@ -243,9 +243,9 @@ void TuckerEngine::updateSprite_locationNum3_0(int i) {
int num;
if (_charSpeechSoundCounter > 0 && _actionCharacterNum == i) {
num = 5;
- _spritesTable[i].needUpdate = 1;
- } else if (_spritesTable[i].prevState == 5 && _spritesTable[i].animationFrame == 1) {
- _spritesTable[i].needUpdate = 0;
+ _spritesTable[i]._needUpdate = true;
+ } else if (_spritesTable[i]._prevState == 5 && _spritesTable[i]._animationFrame == 1) {
+ _spritesTable[i]._needUpdate = false;
int r = getRandomNumber();
if (r < 12000) {
num = 3;
@@ -256,11 +256,11 @@ void TuckerEngine::updateSprite_locationNum3_0(int i) {
}
} else {
num = 5;
- _spritesTable[i].animationFrame = 1;
- _spritesTable[i].updateDelay = 10;
+ _spritesTable[i]._animationFrame = 1;
+ _spritesTable[i]._updateDelay = 10;
}
- _spritesTable[i].state = num;
- _spritesTable[i].prevAnimationFrame = 1;
+ _spritesTable[i]._state = num;
+ _spritesTable[i]._prevAnimationFrame = true;
}
void TuckerEngine::updateSprite_locationNum3_1(int i) {
@@ -268,44 +268,44 @@ void TuckerEngine::updateSprite_locationNum3_1(int i) {
if (_flagsTable[207] == 1) {
num = -1;
} else if (_flagsTable[203] == 1) {
- _spritesTable[i].needUpdate = 1;
+ _spritesTable[i]._needUpdate = true;
num = 20;
_flagsTable[203] = 2;
} else if (_flagsTable[203] == 2) {
num = 12;
} else if (_flagsTable[203] == 3) {
- _spritesTable[i].needUpdate = 0;
+ _spritesTable[i]._needUpdate = false;
num = 19;
_flagsTable[203] = 0;
} else if (_charSpeechSoundCounter > 0 && _actionCharacterNum == i) {
- _spritesTable[i].needUpdate = 1;
+ _spritesTable[i]._needUpdate = true;
if (_flagsTable[21] == 0) {
num = 7;
} else {
num = 8;
}
} else {
- _spritesTable[i].needUpdate = 0;
+ _spritesTable[i]._needUpdate = false;
if (_csDataHandled) {
num = 6;
if (getRandomNumber() < 32000) {
- _spritesTable[i].updateDelay = 5;
+ _spritesTable[i]._updateDelay = 5;
}
- } else if (_spritesTable[i].state == 6 && _spritesTable[i].animationFrame == 1) {
+ } else if (_spritesTable[i]._state == 6 && _spritesTable[i]._animationFrame == 1) {
if (getRandomNumber() < 20000) {
num = 11;
- _spritesTable[i].defaultUpdateDelay = 5;
+ _spritesTable[i]._defaultUpdateDelay = 5;
} else {
num = 10;
}
} else {
num = 6;
- _spritesTable[i].animationFrame = 1;
- _spritesTable[i].updateDelay = 10;
+ _spritesTable[i]._animationFrame = 1;
+ _spritesTable[i]._updateDelay = 10;
}
}
- _spritesTable[i].state = num;
- _spritesTable[i].gfxBackgroundOffset = 320;
+ _spritesTable[i]._state = num;
+ _spritesTable[i]._gfxBackgroundOffset = 320;
}
void TuckerEngine::updateSprite_locationNum3_2(int i) {
@@ -314,32 +314,32 @@ void TuckerEngine::updateSprite_locationNum3_2(int i) {
_flagsTable[205] = 0;
num = 18;
} else if (_charSpeechSoundCounter > 0 && _actionCharacterNum == i) {
- _spritesTable[i].needUpdate = 1;
+ _spritesTable[i]._needUpdate = true;
num = 17;
} else if (_flagsTable[45] == 1) {
_flagsTable[45] = 2;
num = 16;
} else if (_flagsTable[45] == 2) {
num = 17;
- _spritesTable[i].updateDelay = 5;
- _spritesTable[i].needUpdate = 0;
+ _spritesTable[i]._updateDelay = 5;
+ _spritesTable[i]._needUpdate = false;
} else if (_flagsTable[45] == 3) {
_flagsTable[45] = 0;
num = 16;
- _updateSpriteFlag2 = 1;
+ _updateSpriteFlag2 = true;
} else {
- _spritesTable[i].needUpdate = 0;
- ++_spritesTable[i].counter;
- if (_spritesTable[i].counter <= 5) {
+ _spritesTable[i]._needUpdate = false;
+ ++_spritesTable[i]._counter;
+ if (_spritesTable[i]._counter <= 5) {
num = 14;
} else {
- if (_spritesTable[i].counter > 8) {
- _spritesTable[i].counter = 0;
+ if (_spritesTable[i]._counter > 8) {
+ _spritesTable[i]._counter = 0;
}
num = 15;
}
}
- _spritesTable[i].state = num;
+ _spritesTable[i]._state = num;
}
void TuckerEngine::execData3PreUpdate_locationNum3() {
@@ -362,36 +362,36 @@ void TuckerEngine::updateSprite_locationNum4(int i) {
if (_flagsTable[9] == 2) {
if (_charSpeechSoundCounter > 0 && _actionCharacterNum == i) {
state = 1;
- _spritesTable[i].needUpdate = 1;
+ _spritesTable[i]._needUpdate = true;
} else {
state = 2;
- _spritesTable[i].needUpdate = 0;
+ _spritesTable[i]._needUpdate = false;
}
}
- _spritesTable[i].state = state;
+ _spritesTable[i]._state = state;
}
void TuckerEngine::execData3PreUpdate_locationNum4() {
if (_flagsTable[6] == 0) {
setVolumeSound(0, 0);
} else {
- setVolumeSound(0, _locationSoundsTable[0].volume);
+ setVolumeSound(0, _locationSoundsTable[0]._volume);
}
}
void TuckerEngine::updateSprite_locationNum5_0() {
- ++_spritesTable[0].counter;
- if (_spritesTable[0].counter > 100) {
- _spritesTable[0].counter = 0;
- _spritesTable[0].state = 1;
- _locationSoundsTable[1].type = 2;
- startSound(_locationSoundsTable[1].offset, 1, _locationSoundsTable[1].volume);
- } else if (_spritesTable[0].counter == 50) {
- _locationSoundsTable[1].type = 2;
- _spritesTable[0].state = 2;
- startSound(_locationSoundsTable[1].offset, 1, _locationSoundsTable[1].volume);
- } else {
- _spritesTable[0].state = -1;
+ ++_spritesTable[0]._counter;
+ if (_spritesTable[0]._counter > 100) {
+ _spritesTable[0]._counter = 0;
+ _spritesTable[0]._state = 1;
+ _locationSoundsTable[1]._type = 2;
+ startSound(_locationSoundsTable[1]._offset, 1, _locationSoundsTable[1]._volume);
+ } else if (_spritesTable[0]._counter == 50) {
+ _locationSoundsTable[1]._type = 2;
+ _spritesTable[0]._state = 2;
+ startSound(_locationSoundsTable[1]._offset, 1, _locationSoundsTable[1]._volume);
+ } else {
+ _spritesTable[0]._state = -1;
if (isSoundPlaying(1)) {
stopSound(1);
}
@@ -399,7 +399,7 @@ void TuckerEngine::updateSprite_locationNum5_0() {
}
void TuckerEngine::updateSprite_locationNum5_1(int i) {
- _spritesTable[i].state = 3;
+ _spritesTable[i]._state = 3;
}
void TuckerEngine::updateSprite_locationNum6_0(int i) {
@@ -410,29 +410,29 @@ void TuckerEngine::updateSprite_locationNum6_0(int i) {
state = 14;
} else if (_flagsTable[26] == 4 || _flagsTable[26] == 5) {
if (_charSpeechSoundCounter > 0 && _actionCharacterNum == 0) {
- _spritesTable[0].needUpdate = 1;
+ _spritesTable[0]._needUpdate = true;
state = 3;
- _spritesTable[0].counter = 0;
+ _spritesTable[0]._counter = 0;
} else if (_xPosCurrent < 370 && _flagsTable[26] == 4) {
state = 2;
- } else if (_spritesTable[0].counter == 0) {
+ } else if (_spritesTable[0]._counter == 0) {
setCharacterAnimation(0, 0);
- _updateSpriteFlag1 = 1;
- ++_spritesTable[0].counter;
+ _updateSpriteFlag1 = true;
+ ++_spritesTable[0]._counter;
return;
} else {
state = 1;
- _spritesTable[0].updateDelay = 2;
- ++_spritesTable[0].counter;
- if (_spritesTable[0].counter > 100) {
- _spritesTable[0].counter = 0;
+ _spritesTable[0]._updateDelay = 2;
+ ++_spritesTable[0]._counter;
+ if (_spritesTable[0]._counter > 100) {
+ _spritesTable[0]._counter = 0;
}
}
} else {
state = -1;
}
- _spritesTable[i].state = state;
- _spritesTable[i].gfxBackgroundOffset = 320;
+ _spritesTable[i]._state = state;
+ _spritesTable[i]._gfxBackgroundOffset = 320;
}
void TuckerEngine::updateSprite_locationNum6_1(int i) {
@@ -440,18 +440,18 @@ void TuckerEngine::updateSprite_locationNum6_1(int i) {
if (_charSpeechSoundCounter > 0 && _actionCharacterNum == i) {
if (_flagsTable[209] == 1) {
state = 9;
- _spritesTable[i].needUpdate = 1;
+ _spritesTable[i]._needUpdate = true;
} else {
- _spritesTable[i].needUpdate = 1;
+ _spritesTable[i]._needUpdate = true;
state = 10;
}
} else {
if (getRandomNumber() < 30000 || (_csDataHandled && _xPosCurrent == 248)) {
- _spritesTable[i].needUpdate = 0;
+ _spritesTable[i]._needUpdate = false;
state = 7;
- _spritesTable[i].updateDelay = 5;
+ _spritesTable[i]._updateDelay = 5;
} else {
- _spritesTable[i].needUpdate = 0;
+ _spritesTable[i]._needUpdate = false;
state = 7;
_miscSoundFxNum[0] = 3;
_miscSoundFxDelayCounter[0] = 70;
@@ -459,7 +459,7 @@ void TuckerEngine::updateSprite_locationNum6_1(int i) {
_miscSoundFxDelayCounter[1] = 25;
}
}
- _spritesTable[i].state = state;
+ _spritesTable[i]._state = state;
}
void TuckerEngine::updateSprite_locationNum6_2(int i) {
@@ -467,13 +467,13 @@ void TuckerEngine::updateSprite_locationNum6_2(int i) {
if (_flagsTable[26] < 5 || _flagsTable[207] > 0) {
state = -1;
} else if (_charSpeechSoundCounter > 0 && _actionCharacterNum == i) {
- _spritesTable[i].needUpdate = 1;
+ _spritesTable[i]._needUpdate = true;
state = 12;
} else {
state = 12;
- _spritesTable[i].updateDelay = 2;
+ _spritesTable[i]._updateDelay = 2;
}
- _spritesTable[i].state = state;
+ _spritesTable[i]._state = state;
}
void TuckerEngine::execData3PreUpdate_locationNum6() {
@@ -483,11 +483,11 @@ void TuckerEngine::execData3PreUpdate_locationNum6() {
if (_flagsTable[26] == 2) {
_currentSpriteAnimationLength = 2;
_currentSpriteAnimationFrame = 112;
- if (_spritesTable[0].xSource < 45) {
+ if (_spritesTable[0]._xSource < 45) {
_currentSpriteAnimationFrame2 = 144;
- } else if (_spritesTable[0].xSource > 80) {
+ } else if (_spritesTable[0]._xSource > 80) {
_currentSpriteAnimationFrame2 = 147;
- } else if (_spritesTable[0].xSource < 60) {
+ } else if (_spritesTable[0]._xSource < 60) {
_currentSpriteAnimationFrame2 = 145;
} else {
_currentSpriteAnimationFrame2 = 146;
@@ -500,24 +500,24 @@ void TuckerEngine::execData3PreUpdate_locationNum6Helper1() {
if (_flagsTable[26] == 1) {
if (_flagsTable[27] < 15) {
if (_flagsTable[27] == 0) {
- startSound(_locationSoundsTable[2].offset, 2, _locationSoundsTable[2].volume);
- startSound(_locationSoundsTable[1].offset, 1, _locationSoundsTable[1].volume);
+ startSound(_locationSoundsTable[2]._offset, 2, _locationSoundsTable[2]._volume);
+ startSound(_locationSoundsTable[1]._offset, 1, _locationSoundsTable[1]._volume);
}
++_flagsTable[27];
- setVolumeSound(0, _locationSoundsTable[0].volume - _flagsTable[27] * 5);
- setVolumeMusic(0, _locationMusicsTable[0].volume - _flagsTable[27] * 5);
+ setVolumeSound(0, _locationSoundsTable[0]._volume - _flagsTable[27] * 5);
+ setVolumeMusic(0, _locationMusicsTable[0]._volume - _flagsTable[27] * 5);
}
} else if (_flagsTable[26] == 3) {
if (_flagsTable[27] > 0) {
if (_flagsTable[27] == 15) {
- startSound(_locationSoundsTable[2].offset, 2, _locationSoundsTable[2].volume);
+ startSound(_locationSoundsTable[2]._offset, 2, _locationSoundsTable[2]._volume);
}
--_flagsTable[27];
- setVolumeSound(0, _locationSoundsTable[0].volume - _flagsTable[27] * 5);
- setVolumeMusic(0, _locationMusicsTable[0].volume - _flagsTable[27] * 5);
+ setVolumeSound(0, _locationSoundsTable[0]._volume - _flagsTable[27] * 5);
+ setVolumeMusic(0, _locationMusicsTable[0]._volume - _flagsTable[27] * 5);
int volume = _flagsTable[27];
- if (volume < _locationSoundsTable[1].volume) {
- volume = _locationSoundsTable[1].volume;
+ if (volume < _locationSoundsTable[1]._volume) {
+ volume = _locationSoundsTable[1]._volume;
}
setVolumeSound(1, volume);
}
@@ -538,12 +538,12 @@ void TuckerEngine::execData3PreUpdate_locationNum6Helper1() {
x2 = 15 - _flagsTable[27];
}
for (int i = 0; i < x1; ++i) {
- execData3PreUpdate_locationNum6Helper2(20 * 640 + 325 + i * 8, _data3GfxBuf + _dataTable[238].sourceOffset);
- execData3PreUpdate_locationNum6Helper2(20 * 640 + 445 - i * 8, _data3GfxBuf + _dataTable[238].sourceOffset);
+ execData3PreUpdate_locationNum6Helper2(20 * 640 + 325 + i * 8, _data3GfxBuf + _dataTable[238]._sourceOffset);
+ execData3PreUpdate_locationNum6Helper2(20 * 640 + 445 - i * 8, _data3GfxBuf + _dataTable[238]._sourceOffset);
}
for (int i = 0; i < x2; ++i) {
- execData3PreUpdate_locationNum6Helper3(20 * 640 + 325 + x1 * 8 + i * 4, _data3GfxBuf + _dataTable[238].sourceOffset);
- execData3PreUpdate_locationNum6Helper3(20 * 640 + 449 - x1 * 8 - i * 4, _data3GfxBuf + _dataTable[238].sourceOffset);
+ execData3PreUpdate_locationNum6Helper3(20 * 640 + 325 + x1 * 8 + i * 4, _data3GfxBuf + _dataTable[238]._sourceOffset);
+ execData3PreUpdate_locationNum6Helper3(20 * 640 + 449 - x1 * 8 - i * 4, _data3GfxBuf + _dataTable[238]._sourceOffset);
}
addDirtyRect(0, 20, 640, 51);
}
@@ -583,37 +583,37 @@ void TuckerEngine::execData3PostUpdate_locationNum6() {
void TuckerEngine::updateSprite_locationNum7_0(int i) {
int state;
- ++_spritesTable[i].counter;
+ ++_spritesTable[i]._counter;
if (_charSpeechSoundCounter > 0 && _actionCharacterNum == i) {
- _spritesTable[i].needUpdate = 1;
+ _spritesTable[i]._needUpdate = true;
state = 4;
} else {
- _spritesTable[i].needUpdate = 0;
- if (_spritesTable[i].counter > 0) {
+ _spritesTable[i]._needUpdate = false;
+ if (_spritesTable[i]._counter > 0) {
state = 2;
- _spritesTable[i].counter = 0;
+ _spritesTable[i]._counter = 0;
} else {
state = 1;
}
}
- _spritesTable[i].state = state;
+ _spritesTable[i]._state = state;
}
void TuckerEngine::updateSprite_locationNum7_1(int i) {
int state;
if (_charSpeechSoundCounter > 0 && _actionCharacterNum == i) {
- _spritesTable[i].needUpdate = 1;
+ _spritesTable[i]._needUpdate = true;
state = 5;
} else {
- _spritesTable[i].needUpdate = 0;
+ _spritesTable[i]._needUpdate = false;
state = 5;
- _spritesTable[i].updateDelay = 5;
+ _spritesTable[i]._updateDelay = 5;
}
- _spritesTable[i].state = state;
+ _spritesTable[i]._state = state;
}
void TuckerEngine::updateSprite_locationNum8_0(int i) {
- _spritesTable[i].state = (_flagsTable[28] < 20) ? -1 : 7;
+ _spritesTable[i]._state = (_flagsTable[28] < 20) ? -1 : 7;
}
void TuckerEngine::updateSprite_locationNum8_1(int i) {
@@ -622,20 +622,20 @@ void TuckerEngine::updateSprite_locationNum8_1(int i) {
state = -1;
} else if (_flagsTable[28] == 18) {
state = 6;
- _spritesTable[i].needUpdate = 0;
+ _spritesTable[i]._needUpdate = false;
} else if (_flagsTable[29] == 0) {
state = 1;
} else if (_charSpeechSoundCounter > 0 && _actionCharacterNum == 1) {
- _spritesTable[i].needUpdate = 1;
+ _spritesTable[i]._needUpdate = true;
state = 5;
} else {
- _spritesTable[i].needUpdate = 0;
+ _spritesTable[i]._needUpdate = false;
state = 3;
}
if (_flagsTable[28] == 19) {
_flagsTable[28] = 20;
}
- _spritesTable[i].state = state;
+ _spritesTable[i]._state = state;
}
void TuckerEngine::execData3PostUpdate_locationNum8() {
@@ -662,7 +662,7 @@ void TuckerEngine::execData3PostUpdate_locationNum8() {
_updateLocationYPosTable2[0] += 2;
if (_updateLocationYPosTable2[0] > 120) {
_updateLocationYPosTable2[0] = 0;
- startSound(_locationSoundsTable[2].offset, 2, _locationSoundsTable[2].volume);
+ startSound(_locationSoundsTable[2]._offset, 2, _locationSoundsTable[2]._volume);
}
}
if (_flagsTable[28] > 1 && _flagsTable[28] < 5) {
@@ -674,82 +674,82 @@ void TuckerEngine::execData3PostUpdate_locationNum8() {
void TuckerEngine::updateSprite_locationNum9_0(int i) {
if (_charSpeechSoundCounter > 0 && _actionCharacterNum == 0) {
- _spritesTable[i].needUpdate = 1;
- _spritesTable[i].state = 3;
+ _spritesTable[i]._needUpdate = true;
+ _spritesTable[i]._state = 3;
} else if (_updateLocationCounter2 > 0 || getRandomNumber() > 30000) {
- _spritesTable[i].state = 1;
+ _spritesTable[i]._state = 1;
if (_updateLocationCounter2 == 0) {
_updateLocationCounter2 = 6;
}
} else if (getRandomNumber() > 30000) {
- _spritesTable[i].state = 2;
- _spritesTable[i].defaultUpdateDelay = 5;
+ _spritesTable[i]._state = 2;
+ _spritesTable[i]._defaultUpdateDelay = 5;
} else {
- _spritesTable[i].state = 1;
- _spritesTable[i].animationFrame = 1;
- _spritesTable[i].updateDelay = 10;
+ _spritesTable[i]._state = 1;
+ _spritesTable[i]._animationFrame = 1;
+ _spritesTable[i]._updateDelay = 10;
}
}
void TuckerEngine::updateSprite_locationNum9_1(int i) {
- ++_spritesTable[i].counter;
- if (_spritesTable[i].counter > 10) {
- _spritesTable[i].counter = 0;
- _spritesTable[i].state = 5;
- _spritesTable[i].defaultUpdateDelay = 5;
+ ++_spritesTable[i]._counter;
+ if (_spritesTable[i]._counter > 10) {
+ _spritesTable[i]._counter = 0;
+ _spritesTable[i]._state = 5;
+ _spritesTable[i]._defaultUpdateDelay = 5;
} else {
- _spritesTable[i].state = 4;
+ _spritesTable[i]._state = 4;
}
}
void TuckerEngine::updateSprite_locationNum9_2(int i) {
- _spritesTable[i].state = 6;
- _spritesTable[i].gfxBackgroundOffset = 320;
+ _spritesTable[i]._state = 6;
+ _spritesTable[i]._gfxBackgroundOffset = 320;
}
void TuckerEngine::execData3PreUpdate_locationNum9() {
if (_flagsTable[7] < 2) {
_flagsTable[7] = 2;
}
- if (_flagsTable[8] == 0 && _locationMusicsTable[0].volume != 0) {
- _locationMusicsTable[0].volume = 0;
+ if (_flagsTable[8] == 0 && _locationMusicsTable[0]._volume != 0) {
+ _locationMusicsTable[0]._volume = 0;
} else {
- _locationMusicsTable[0].volume = _xPosCurrent / 40;
+ _locationMusicsTable[0]._volume = _xPosCurrent / 40;
}
- setVolumeMusic(0, _locationMusicsTable[0].volume);
+ setVolumeMusic(0, _locationMusicsTable[0]._volume);
if (!isSoundPlaying(1) && getRandomNumber() > 32000) {
int i = getRandomNumber() / 5500 + 3;
assert(i >= 0 && i < kLocationSoundsTableSize);
- startSound(_locationSoundsTable[i].offset, i, _locationSoundsTable[i].volume);
+ startSound(_locationSoundsTable[i]._offset, i, _locationSoundsTable[i]._volume);
}
if (_flagsTable[8] == 2 && _locationMaskType == 0) {
_flagsTable[8] = 0;
- startSound(_locationSoundsTable[7].offset, 7, _locationSoundsTable[7].volume);
+ startSound(_locationSoundsTable[7]._offset, 7, _locationSoundsTable[7]._volume);
}
}
void TuckerEngine::execData3PostUpdate_locationNum9() {
- if (_spritesTable[1].state == 4) {
- if (_spritesTable[1].flipX == 1) {
+ if (_spritesTable[1]._state == 4) {
+ if (_spritesTable[1]._flipX) {
--_updateLocationXPosTable2[0];
if (_updateLocationXPosTable2[0] < -50) {
- _spritesTable[1].flipX = 0;
+ _spritesTable[1]._flipX = false;
_updateLocationXPosTable2[0] = -50;
}
} else {
++_updateLocationXPosTable2[0];
if (_updateLocationXPosTable2[0] > 500) {
- _spritesTable[1].flipX = 1;
+ _spritesTable[1]._flipX = true;
_updateLocationXPosTable2[0] = 500;
}
}
}
- _spritesTable[1].gfxBackgroundOffset = _updateLocationXPosTable2[0] + 8320;
+ _spritesTable[1]._gfxBackgroundOffset = _updateLocationXPosTable2[0] + 8320;
for (int i = 1; i < 3; ++i) {
- _spritesTable[i].colorType = 1;
- _spritesTable[i].yMaxBackground = 60;
+ _spritesTable[i]._colorType = 1;
+ _spritesTable[i]._yMaxBackground = 60;
drawSprite(i);
- _spritesTable[i].colorType = 0;
+ _spritesTable[i]._colorType = 0;
}
}
@@ -759,7 +759,7 @@ void TuckerEngine::updateSprite_locationNum10() {
if (_flagsTable[99] == 1) {
state = -1;
} else if (_charSpeechSoundCounter > 0 && _actionCharacterNum == 0) {
- _spritesTable[0].needUpdate = 1;
+ _spritesTable[0]._needUpdate = true;
if (r < 26000) {
state = 1;
} else if (r < 29000) {
@@ -769,12 +769,12 @@ void TuckerEngine::updateSprite_locationNum10() {
}
} else if (_csDataHandled) {
state = 2;
- _spritesTable[0].updateDelay = 4;
+ _spritesTable[0]._updateDelay = 4;
} else {
- _spritesTable[0].needUpdate = 0;
+ _spritesTable[0]._needUpdate = false;
if (r > 26000) {
state = 5;
- _spritesTable[0].prevAnimationFrame = 1;
+ _spritesTable[0]._prevAnimationFrame = true;
} else if (r > 24000) {
state = 6;
_miscSoundFxDelayCounter[0] = 120;
@@ -783,7 +783,7 @@ void TuckerEngine::updateSprite_locationNum10() {
setCharacterAnimation(0, 0);
}
}
- _spritesTable[0].state = state;
+ _spritesTable[0]._state = state;
}
void TuckerEngine::execData3PreUpdate_locationNum10() {
@@ -797,8 +797,8 @@ void TuckerEngine::execData3PreUpdate_locationNum10() {
if (_flagsTable[47] == 1 && _inventoryItemsState[26] == 1) {
_flagsTable[47] = 2;
}
- if (_spritesTable[0].state == 6 && _spritesTable[0].animationFrame == 18 && !isSoundPlaying(0)) {
- startSound(_locationSoundsTable[0].offset, 0, _locationSoundsTable[0].volume);
+ if (_spritesTable[0]._state == 6 && _spritesTable[0]._animationFrame == 18 && !isSoundPlaying(0)) {
+ startSound(_locationSoundsTable[0]._offset, 0, _locationSoundsTable[0]._volume);
}
if (_flagsTable[230] == 1 && getRandomNumber() > 32000) {
_flagsTable[230] = 0;
@@ -808,52 +808,52 @@ void TuckerEngine::execData3PreUpdate_locationNum10() {
void TuckerEngine::updateSprite_locationNum11_0(int i) {
const int r = getRandomNumber();
if (_charSpeechSoundCounter > 0 && _actionCharacterNum == i) {
- _spritesTable[i].needUpdate = 1;
- _spritesTable[i].state = 2;
+ _spritesTable[i]._needUpdate = true;
+ _spritesTable[i]._state = 2;
} else {
- _spritesTable[i].needUpdate = 0;
+ _spritesTable[i]._needUpdate = false;
if (r > 28000) {
- _spritesTable[i].state = 3;
+ _spritesTable[i]._state = 3;
} else if (r > 20000) {
- _spritesTable[i].state = 4;
+ _spritesTable[i]._state = 4;
} else {
- _spritesTable[i].state = 3;
- _spritesTable[i].animationFrame = 1;
- _spritesTable[i].updateDelay = 5;
+ _spritesTable[i]._state = 3;
+ _spritesTable[i]._animationFrame = 1;
+ _spritesTable[i]._updateDelay = 5;
}
}
}
void TuckerEngine::updateSprite_locationNum11_1(int i) {
if (getRandomNumber() > 20000) {
- _spritesTable[i].state = 5;
+ _spritesTable[i]._state = 5;
} else {
- _spritesTable[i].animationFrame = 14;
- _updateSpriteFlag1 = 1;
- _spritesTable[i].state = 5;
+ _spritesTable[i]._animationFrame = 14;
+ _updateSpriteFlag1 = true;
+ _spritesTable[i]._state = 5;
}
}
void TuckerEngine::updateSprite_locationNum11_2(int i) {
if (getRandomNumber() > 20000) {
- _spritesTable[i].state = 6;
+ _spritesTable[i]._state = 6;
} else {
- _spritesTable[i].animationFrame = 17;
- _spritesTable[i].state = 6;
- _updateSpriteFlag1 = 1;
+ _spritesTable[i]._animationFrame = 17;
+ _spritesTable[i]._state = 6;
+ _updateSpriteFlag1 = true;
}
}
void TuckerEngine::updateSprite_locationNum11_3(int i) {
- _spritesTable[i].state = 7;
+ _spritesTable[i]._state = 7;
}
void TuckerEngine::updateSprite_locationNum11_4(int i) {
if (getRandomNumber() > 30000 && _flagsTable[55] < 2) {
- _spritesTable[i].state = 1;
- startSound(_locationSoundsTable[6].offset, 6, _locationSoundsTable[6].volume);
+ _spritesTable[i]._state = 1;
+ startSound(_locationSoundsTable[6]._offset, 6, _locationSoundsTable[6]._volume);
} else {
- _spritesTable[i].state = -1;
+ _spritesTable[i]._state = -1;
}
}
@@ -866,10 +866,10 @@ void TuckerEngine::updateSprite_locationNum12_0(int i) {
if (_flagsTable[207] > 0) {
state = -1;
} else if (_charSpeechSoundCounter > 0 && _actionCharacterNum == i) {
- _spritesTable[i].needUpdate = 1;
+ _spritesTable[i]._needUpdate = true;
state = 5;
} else {
- _spritesTable[i].needUpdate = 0;
+ _spritesTable[i]._needUpdate = false;
if (_updateLocationCounter2 < 4) {
state = 1;
} else if (_updateLocationCounter2 < 8) {
@@ -878,7 +878,7 @@ void TuckerEngine::updateSprite_locationNum12_0(int i) {
state = 4;
}
}
- _spritesTable[i].state = state;
+ _spritesTable[i]._state = state;
}
void TuckerEngine::updateSprite_locationNum12_1(int i) {
@@ -891,7 +891,7 @@ void TuckerEngine::updateSprite_locationNum12_1(int i) {
} else {
state = 8;
}
- _spritesTable[i].state = state;
+ _spritesTable[i]._state = state;
}
void TuckerEngine::execData3PreUpdate_locationNum12() {
@@ -899,13 +899,13 @@ void TuckerEngine::execData3PreUpdate_locationNum12() {
_flagsTable[38] = 1;
}
if (_flagsTable[41] == 0) {
- if (_locationMusicsTable[0].volume != 100) {
- _locationMusicsTable[0].volume = 100;
+ if (_locationMusicsTable[0]._volume != 100) {
+ _locationMusicsTable[0]._volume = 100;
setVolumeMusic(0, 100);
}
} else {
- if (_locationMusicsTable[0].volume != 20) {
- _locationMusicsTable[0].volume = 20;
+ if (_locationMusicsTable[0]._volume != 20) {
+ _locationMusicsTable[0]._volume = 20;
setVolumeMusic(0, 20);
}
}
@@ -917,44 +917,44 @@ void TuckerEngine::updateSprite_locationNum13(int i) {
if (_flagsTable[202] == 0) {
_flagsTable[202] = 1;
state = 3;
- _spritesTable[i].stateIndex = -1;
+ _spritesTable[i]._stateIndex = -1;
} else if (_charSpeechSoundCounter > 0 && _actionCharacterNum == i) {
state = 4;
- _spritesTable[i].needUpdate = 1;
+ _spritesTable[i]._needUpdate = true;
} else {
- _spritesTable[i].needUpdate = 0;
+ _spritesTable[i]._needUpdate = false;
state = 5;
}
} else if (_flagsTable[202] == 1) {
- _spritesTable[i].needUpdate = 0;
+ _spritesTable[i]._needUpdate = false;
_flagsTable[202] = 0;
state = 6;
} else {
setCharacterAnimation(0, 0);
return;
}
- _spritesTable[i].state = state;
+ _spritesTable[i]._state = state;
}
void TuckerEngine::execData3PreUpdate_locationNum13() {
if (_flagsTable[69] == 0) {
if (getRandomNumber() > 31000) {
_flagsTable[69] = 1;
- startSound(_locationSoundsTable[1].offset, 1, _locationSoundsTable[1].volume);
+ startSound(_locationSoundsTable[1]._offset, 1, _locationSoundsTable[1]._volume);
} else if (isSoundPlaying(1)) {
stopSound(1);
}
}
_flagsTable[8] = 2;
- if (_spritesTable[0].state == 1) {
- if (_spritesTable[0].animationFrame > 10 && _spritesTable[0].animationFrame < 20) {
+ if (_spritesTable[0]._state == 1) {
+ if (_spritesTable[0]._animationFrame > 10 && _spritesTable[0]._animationFrame < 20) {
if (!isSoundPlaying(0)) {
- startSound(_locationSoundsTable[0].offset, 0, _locationSoundsTable[0].volume);
+ startSound(_locationSoundsTable[0]._offset, 0, _locationSoundsTable[0]._volume);
}
}
}
if (isSoundPlaying(0)) {
- if (_spritesTable[0].animationFrame > 10 && _spritesTable[0].animationFrame < 20) {
+ if (_spritesTable[0]._animationFrame > 10 && _spritesTable[0]._animationFrame < 20) {
stopSound(0);
}
}
@@ -963,12 +963,12 @@ void TuckerEngine::execData3PreUpdate_locationNum13() {
void TuckerEngine::updateSprite_locationNum14(int i) {
int state = 2;
if (_charSpeechSoundCounter > 0 && _actionCharacterNum == i) {
- _spritesTable[i].needUpdate = 1;
+ _spritesTable[i]._needUpdate = true;
state = (getRandomNumber() < 12000) ? 1 : 3;
} else if (getRandomNumber() < 26000) {
- _spritesTable[i].updateDelay = 5;
+ _spritesTable[i]._updateDelay = 5;
}
- _spritesTable[i].state = state;
+ _spritesTable[i]._state = state;
}
void TuckerEngine::execData3PreUpdate_locationNum14() {
@@ -988,7 +988,7 @@ void TuckerEngine::execData3PreUpdate_locationNum14() {
num = 7;
}
if (num != -1) {
- startSound(_locationSoundsTable[num].offset, num, _locationSoundsTable[num].volume);
+ startSound(_locationSoundsTable[num]._offset, num, _locationSoundsTable[num]._volume);
}
}
_locationHeightTable[14] = (_xPosCurrent < 100) ? 0 : 60;
@@ -1008,11 +1008,11 @@ void TuckerEngine::execData3PreUpdate_locationNum14() {
}
const int num = _updateLocation14ObjNum[i];
if (num > 0) {
- const int w = _dataTable[num].xSize;
- const int h = _dataTable[num].ySize;
+ const int w = _dataTable[num]._xSize;
+ const int h = _dataTable[num]._ySize;
const int x = _updateLocationXPosTable2[i] - w / 2;
const int y = _updateLocationYPosTable2[i] / 16 - h / 2;
- Graphics::decodeRLE_248(_locationBackgroundGfxBuf + y * 640 + x, _data3GfxBuf + _dataTable[num].sourceOffset, w, h, 0, 0, false);
+ Graphics::decodeRLE_248(_locationBackgroundGfxBuf + y * 640 + x, _data3GfxBuf + _dataTable[num]._sourceOffset, w, h, 0, 0, false);
addDirtyRect(x, y, w, h);
}
}
@@ -1063,41 +1063,41 @@ void TuckerEngine::execData3PostUpdate_locationNum14() {
}
void TuckerEngine::updateSprite_locationNum15_0(int i) {
- _spritesTable[i].state = -1;
+ _spritesTable[i]._state = -1;
}
void TuckerEngine::updateSprite_locationNum15_1(int i) {
int state;
int r = getRandomNumber();
if (_charSpeechSoundCounter > 0 && _actionCharacterNum == i) {
- _spritesTable[i].needUpdate = 1;
+ _spritesTable[i]._needUpdate = true;
state = 6;
} else {
- _spritesTable[i].needUpdate = 0;
+ _spritesTable[i]._needUpdate = false;
if (r < 26000) {
state = 5;
} else if (r < 29000) {
state = 2;
- _spritesTable[i].prevAnimationFrame = 1;
+ _spritesTable[i]._prevAnimationFrame = true;
} else {
state = 4;
- _spritesTable[4].counter = 1;
+ _spritesTable[4]._counter = 1;
}
}
- _spritesTable[i].state = state;
+ _spritesTable[i]._state = state;
}
void TuckerEngine::updateSprite_locationNum15_2(int i) {
- _spritesTable[i].state = 3;
- if (_spritesTable[4].counter > 0) {
- ++_spritesTable[4].counter;
- if (_spritesTable[4].counter > 6) {
- _spritesTable[4].counter = 0;
+ _spritesTable[i]._state = 3;
+ if (_spritesTable[4]._counter > 0) {
+ ++_spritesTable[4]._counter;
+ if (_spritesTable[4]._counter > 6) {
+ _spritesTable[4]._counter = 0;
} else {
- _spritesTable[i].updateDelay = 2;
+ _spritesTable[i]._updateDelay = 2;
}
} else {
- _spritesTable[i].updateDelay = 2;
+ _spritesTable[i]._updateDelay = 2;
}
}
@@ -1106,7 +1106,7 @@ void TuckerEngine::execData3PreUpdate_locationNum15() {
if (_updateLocationFadePaletteCounter > 500) {
if (!isSoundPlaying(1) && getRandomNumber() > 31000) {
const int i = getRandomNumber() / 4714;
- startSound(_locationSoundsTable[i].offset, i, _locationSoundsTable[i].volume);
+ startSound(_locationSoundsTable[i]._offset, i, _locationSoundsTable[i]._volume);
_updateLocationFadePaletteCounter = 0;
}
}
@@ -1123,21 +1123,21 @@ void TuckerEngine::updateSprite_locationNum16_0(int i) {
} else if (_flagsTable[82] == 2) {
state = -1;
} else if (_charSpeechSoundCounter > 0 && _actionCharacterNum == 0) {
- if (_spritesTable[0].needUpdate == 0) {
- _spritesTable[0].needUpdate = 1;
+ if (!_spritesTable[0]._needUpdate) {
+ _spritesTable[0]._needUpdate = true;
state = 1;
} else {
state = 1;
- _spritesTable[0].animationFrame = 2;
- _updateSpriteFlag1 = 1;
+ _spritesTable[0]._animationFrame = 2;
+ _updateSpriteFlag1 = true;
}
} else if (_csDataHandled) {
- _spritesTable[0].needUpdate = 0;
+ _spritesTable[0]._needUpdate = false;
state = 4;
- _spritesTable[0].updateDelay = 5;
+ _spritesTable[0]._updateDelay = 5;
} else if (r < 30000) {
state = 4;
- _spritesTable[0].updateDelay = 5;
+ _spritesTable[0]._updateDelay = 5;
} else if (r < 31000) {
state = 4;
if (_xPosCurrent < 300) {
@@ -1149,7 +1149,7 @@ void TuckerEngine::updateSprite_locationNum16_0(int i) {
} else {
state = 6;
}
- _spritesTable[i].state = state;
+ _spritesTable[i]._state = state;
}
void TuckerEngine::updateSprite_locationNum16_1(int i) {
@@ -1164,18 +1164,18 @@ void TuckerEngine::updateSprite_locationNum16_1(int i) {
} else if (_flagsTable[60] == 0) {
state = 10;
if (isSoundPlaying(1)) {
- _locationSoundsTable[1].type = 2;
- startSound(_locationSoundsTable[1].offset, 1, _locationSoundsTable[1].volume);
+ _locationSoundsTable[1]._type = 2;
+ startSound(_locationSoundsTable[1]._offset, 1, _locationSoundsTable[1]._volume);
}
} else {
state = 9;
if (isSoundPlaying(0)) {
- _locationSoundsTable[0].type = 2;
- startSound(_locationSoundsTable[0].offset, 0, _locationSoundsTable[0].volume);
+ _locationSoundsTable[0]._type = 2;
+ startSound(_locationSoundsTable[0]._offset, 0, _locationSoundsTable[0]._volume);
}
}
- _spritesTable[i].state = state;
- _spritesTable[i].gfxBackgroundOffset = 320;
+ _spritesTable[i]._state = state;
+ _spritesTable[i]._gfxBackgroundOffset = 320;
}
void TuckerEngine::updateSprite_locationNum16_2(int i) {
@@ -1183,27 +1183,27 @@ void TuckerEngine::updateSprite_locationNum16_2(int i) {
if (_flagsTable[78] == 0) {
if (_flagsTable[60] == 1 && _flagsTable[61] == 1) {
_flagsTable[78] = 1;
- startSound(_locationSoundsTable[5].offset, 5, _locationSoundsTable[5].volume);
+ startSound(_locationSoundsTable[5]._offset, 5, _locationSoundsTable[5]._volume);
state = 7;
}
} else if (_flagsTable[78] == 1) {
if (_charSpeechSoundCounter > 0 && _actionCharacterNum == i) {
- _spritesTable[i].needUpdate = 1;
+ _spritesTable[i]._needUpdate = true;
state = 8;
} else {
if (getRandomNumber() > 32000) {
state = 7;
} else if (getRandomNumber() > 10000) {
state = 13;
- _spritesTable[i].updateDelay = 5;
+ _spritesTable[i]._updateDelay = 5;
} else {
state = 13;
}
- _spritesTable[i].needUpdate = 1;
+ _spritesTable[i]._needUpdate = true;
}
}
- _spritesTable[i].state = state;
- _spritesTable[i].gfxBackgroundOffset = 320;
+ _spritesTable[i]._state = state;
+ _spritesTable[i]._gfxBackgroundOffset = 320;
}
void TuckerEngine::execData3PreUpdate_locationNum16() {
@@ -1218,26 +1218,26 @@ void TuckerEngine::updateSprite_locationNum17() {
} else if (_flagsTable[82] == 2) {
_flagsTable[82] = 3;
_disableCharactersPath = true;
- _spritesTable[0].gfxBackgroundOffset = 100;
+ _spritesTable[0]._gfxBackgroundOffset = 100;
state = 1;
- _spritesTable[0].backgroundOffset = -1;
- } else if (_spritesTable[0].gfxBackgroundOffset < -160) {
+ _spritesTable[0]._backgroundOffset = -1;
+ } else if (_spritesTable[0]._gfxBackgroundOffset < -160) {
state = -1;
} else {
state = 1;
- _spritesTable[0].yMaxBackground = 0;
- _spritesTable[0].colorType = 1;
+ _spritesTable[0]._yMaxBackground = 0;
+ _spritesTable[0]._colorType = 1;
}
- _spritesTable[0].state = state;
+ _spritesTable[0]._state = state;
}
void TuckerEngine::updateSprite_locationNum18() {
int state;
if (_charSpeechSoundCounter > 0 && _actionCharacterNum == 0) {
- _spritesTable[0].needUpdate = 1;
+ _spritesTable[0]._needUpdate = true;
state = 2;
} else {
- _spritesTable[0].needUpdate = 0;
+ _spritesTable[0]._needUpdate = false;
state = 1;
const int r = getRandomNumber();
if (r > 31000) {
@@ -1246,54 +1246,54 @@ void TuckerEngine::updateSprite_locationNum18() {
state = 4;
}
}
- _spritesTable[0].gfxBackgroundOffset = 0;
- _spritesTable[0].backgroundOffset = 0;
- _spritesTable[0].state = state;
+ _spritesTable[0]._gfxBackgroundOffset = 0;
+ _spritesTable[0]._backgroundOffset = 0;
+ _spritesTable[0]._state = state;
}
void TuckerEngine::updateSprite_locationNum19_0(int i) {
int state;
if (_flagsTable[206] == 1) {
state = 7;
- _spritesTable[i].needUpdate = 0;
+ _spritesTable[i]._needUpdate = false;
_flagsTable[206] = 0;
} else if (_charSpeechSoundCounter > 0 && _actionCharacterNum == i) {
- ++_spritesTable[i].counter;
- _spritesTable[i].needUpdate = 1;
- if (_spritesTable[i].counter > 10) {
- _spritesTable[i].counter = 0;
+ ++_spritesTable[i]._counter;
+ _spritesTable[i]._needUpdate = true;
+ if (_spritesTable[i]._counter > 10) {
+ _spritesTable[i]._counter = 0;
state = 2;
} else {
state = 1;
}
} else {
- _spritesTable[i].needUpdate = 0;
- if (_spritesTable[i].counter > 10) {
- _spritesTable[i].counter = 0;
+ _spritesTable[i]._needUpdate = false;
+ if (_spritesTable[i]._counter > 10) {
+ _spritesTable[i]._counter = 0;
}
- if (_spritesTable[i].counter == 2) {
+ if (_spritesTable[i]._counter == 2) {
state = 4;
- _spritesTable[i].prevAnimationFrame = 1;
- } else if (_spritesTable[i].counter == 5) {
+ _spritesTable[i]._prevAnimationFrame = true;
+ } else if (_spritesTable[i]._counter == 5) {
state = 5;
- _spritesTable[i].prevAnimationFrame = 1;
+ _spritesTable[i]._prevAnimationFrame = true;
} else {
state = 5;
- _spritesTable[i].updateDelay = 6;
+ _spritesTable[i]._updateDelay = 6;
}
}
- _spritesTable[i].state = state;
- _spritesTable[i].prevAnimationFrame = 1;
+ _spritesTable[i]._state = state;
+ _spritesTable[i]._prevAnimationFrame = true;
}
void TuckerEngine::updateSprite_locationNum19_1(int i) {
- _spritesTable[i].state = 9;
- _spritesTable[i].gfxBackgroundOffset = 320;
+ _spritesTable[i]._state = 9;
+ _spritesTable[i]._gfxBackgroundOffset = 320;
}
void TuckerEngine::updateSprite_locationNum19_2(int i) {
- _spritesTable[i].gfxBackgroundOffset = 320;
- _spritesTable[i].state = -1;
+ _spritesTable[i]._gfxBackgroundOffset = 320;
+ _spritesTable[i]._state = -1;
}
void TuckerEngine::updateSprite_locationNum19_3(int i) {
@@ -1313,36 +1313,36 @@ void TuckerEngine::updateSprite_locationNum21() {
} else if (_flagsTable[58] == 3) {
state = 6;
_flagsTable[58] = 4;
- _locationSoundsTable[0].volume = 60;
- _locationSoundsTable[5].volume = 60;
+ _locationSoundsTable[0]._volume = 60;
+ _locationSoundsTable[5]._volume = 60;
} else if (_flagsTable[58] == 4) {
state = 7;
- _locationSoundsTable[4].volume = 60;
+ _locationSoundsTable[4]._volume = 60;
} else if (_flagsTable[59] == 4) {
- _spritesTable[0].needUpdate = 1;
+ _spritesTable[0]._needUpdate = true;
_flagsTable[59] = 2;
state = 2;
setVolumeSound(2, 0);
} else if (_flagsTable[59] == 3) {
_flagsTable[59] = 0;
state = 4;
- setVolumeSound(2, _locationSoundsTable[2].volume);
+ setVolumeSound(2, _locationSoundsTable[2]._volume);
} else if (_charSpeechSoundCounter > 0 && _actionCharacterNum == 0) {
- _spritesTable[0].needUpdate = 1;
+ _spritesTable[0]._needUpdate = true;
state = 3;
} else if (_flagsTable[59] == 2) {
- _spritesTable[0].needUpdate = 0;
+ _spritesTable[0]._needUpdate = false;
state = 3;
- _spritesTable[0].updateDelay = 5;
+ _spritesTable[0]._updateDelay = 5;
} else if (_flagsTable[15] == 1) {
state = 3;
- _spritesTable[0].updateDelay = 5;
+ _spritesTable[0]._updateDelay = 5;
} else {
- _spritesTable[0].needUpdate = 0;
+ _spritesTable[0]._needUpdate = false;
state = 1;
}
- _spritesTable[0].state = state;
- _spritesTable[0].gfxBackgroundOffset = 320;
+ _spritesTable[0]._state = state;
+ _spritesTable[0]._gfxBackgroundOffset = 320;
}
void TuckerEngine::execData3PreUpdate_locationNum21() {
@@ -1351,7 +1351,7 @@ void TuckerEngine::execData3PreUpdate_locationNum21() {
_pendingActionDelay = 0;
_flagsTable[59] = 1;
_nextAction = 2;
- _csDataLoaded = 0;
+ _csDataLoaded = false;
}
if (_flagsTable[58] > 0 && !isSoundPlaying(0)) {
const int r = getRandomNumber();
@@ -1364,17 +1364,17 @@ void TuckerEngine::execData3PreUpdate_locationNum21() {
} else {
num = 5;
}
- startSound(_locationSoundsTable[num].offset, num, _locationSoundsTable[num].volume);
+ startSound(_locationSoundsTable[num]._offset, num, _locationSoundsTable[num]._volume);
}
}
- if (_spritesTable[0].state == 6) {
- if (_spritesTable[0].animationFrame < 18) {
- _spritesTable[0].gfxBackgroundOffset = 320 + _spritesTable[0].animationFrame * 638;
+ if (_spritesTable[0]._state == 6) {
+ if (_spritesTable[0]._animationFrame < 18) {
+ _spritesTable[0]._gfxBackgroundOffset = 320 + _spritesTable[0]._animationFrame * 638;
} else {
- _spritesTable[0].gfxBackgroundOffset = 11840 - _spritesTable[0].animationFrame * 2;
+ _spritesTable[0]._gfxBackgroundOffset = 11840 - _spritesTable[0]._animationFrame * 2;
}
} else {
- _spritesTable[0].gfxBackgroundOffset = 320;
+ _spritesTable[0]._gfxBackgroundOffset = 320;
}
if (_inventoryItemsState[19] > 0) {
_flagsTable[43] = 1;
@@ -1397,20 +1397,20 @@ void TuckerEngine::execData3PreUpdate_locationNum22() {
}
if (_flagsTable[210] < 2 && !_csDataHandled && _flagsTable[54] == 1) {
_nextAction = 25;
- _csDataLoaded = 0;
+ _csDataLoaded = false;
_flagsTable[210] = 2;
}
}
void TuckerEngine::updateSprite_locationNum22() {
if (_flagsTable[207] == 1) {
- _spritesTable[0].state = -1;
+ _spritesTable[0]._state = -1;
} else if (_charSpeechSoundCounter > 0 && _actionCharacterNum == 0) {
- _spritesTable[0].needUpdate = 1;
- _spritesTable[0].state = 2;
+ _spritesTable[0]._needUpdate = true;
+ _spritesTable[0]._state = 2;
} else {
- _spritesTable[0].needUpdate = 0;
- _spritesTable[0].state = 1;
+ _spritesTable[0]._needUpdate = false;
+ _spritesTable[0]._state = 1;
}
}
@@ -1421,37 +1421,37 @@ void TuckerEngine::updateSprite_locationNum23_0(int i) {
} else {
state = -1;
}
- _spritesTable[i].state = state;
+ _spritesTable[i]._state = state;
}
void TuckerEngine::updateSprite_locationNum23_1(int i) {
int state;
if (_charSpeechSoundCounter > 0 && _actionCharacterNum == i) {
- _spritesTable[i].needUpdate = 1;
+ _spritesTable[i]._needUpdate = true;
state = 14;
} else if (getRandomNumber() < 30000) {
- _spritesTable[i].needUpdate = 0;
+ _spritesTable[i]._needUpdate = false;
state = 25;
} else {
- _spritesTable[i].needUpdate = 0;
+ _spritesTable[i]._needUpdate = false;
state = 13;
}
- _spritesTable[i].state = state;
+ _spritesTable[i]._state = state;
}
void TuckerEngine::updateSprite_locationNum23_2(int i) {
int state = 0;
if (_flagsTable[210] == 0) {
if (_charSpeechSoundCounter > 0 && _actionCharacterNum == i) {
- _spritesTable[i].needUpdate = 1;
+ _spritesTable[i]._needUpdate = true;
state = 6;
} else {
- _spritesTable[i].needUpdate = 0;
+ _spritesTable[i]._needUpdate = false;
state = (getRandomNumber() < 25000) ? 4 : 5;
}
} else if (_flagsTable[210] == 1) {
if (_charSpeechSoundCounter > 0 && _actionCharacterNum == i) {
- _spritesTable[i].needUpdate = 1;
+ _spritesTable[i]._needUpdate = true;
if (_flagsTable[211] == 10) {
state = 34;
} else if (_flagsTable[211] == 0) {
@@ -1461,7 +1461,7 @@ void TuckerEngine::updateSprite_locationNum23_2(int i) {
state = 31;
}
} else {
- _spritesTable[i].needUpdate = 0;
+ _spritesTable[i]._needUpdate = false;
if (_flagsTable[211] == 1) {
state = 32;
_flagsTable[211] = 0;
@@ -1471,10 +1471,10 @@ void TuckerEngine::updateSprite_locationNum23_2(int i) {
}
} else if (_flagsTable[210] == 2) {
if (_charSpeechSoundCounter > 0 && _actionCharacterNum == i) {
- _spritesTable[i].needUpdate = 1;
+ _spritesTable[i]._needUpdate = true;
state = 33;
} else {
- _spritesTable[i].needUpdate = 0;
+ _spritesTable[i]._needUpdate = false;
if (_flagsTable[212] == 0) {
state = 3;
_flagsTable[212] = 1;
@@ -1488,7 +1488,7 @@ void TuckerEngine::updateSprite_locationNum23_2(int i) {
} else {
state = 24;
}
- _spritesTable[i].state = state;
+ _spritesTable[i]._state = state;
}
void TuckerEngine::updateSprite_locationNum23_3(int i) {
@@ -1496,13 +1496,13 @@ void TuckerEngine::updateSprite_locationNum23_3(int i) {
if (_flagsTable[210] == 0 || _flagsTable[210] == 2) {
state = -1;
} else if (_charSpeechSoundCounter > 0 && _actionCharacterNum == i) {
- _spritesTable[i].needUpdate = 1;
+ _spritesTable[i]._needUpdate = true;
state = 8;
} else {
- _spritesTable[i].needUpdate = 0;
+ _spritesTable[i]._needUpdate = false;
state = 9;
}
- _spritesTable[i].state = state;
+ _spritesTable[i]._state = state;
}
void TuckerEngine::updateSprite_locationNum24_0(int i) {
@@ -1512,40 +1512,40 @@ void TuckerEngine::updateSprite_locationNum24_0(int i) {
state = 5;
} else if (_flagsTable[103] == 0) {
if (_charSpeechSoundCounter > 0 && _actionCharacterNum == i) {
- _spritesTable[i].needUpdate = 1;
+ _spritesTable[i]._needUpdate = true;
state = 2;
} else {
- _spritesTable[i].needUpdate = 1;
+ _spritesTable[i]._needUpdate = true;
state = 1;
if (getRandomNumber() < 30000) {
- _spritesTable[i].updateDelay = 5;
+ _spritesTable[i]._updateDelay = 5;
}
}
} else if (_flagsTable[103] == 1 || _flagsTable[103] == 3) {
state = -1;
} else {
if (_charSpeechSoundCounter > 0 && _actionCharacterNum == i) {
- _spritesTable[i].needUpdate = 1;
+ _spritesTable[i]._needUpdate = true;
state = 4;
} else {
if (getRandomNumber() < 30000) {
- _spritesTable[i].needUpdate = 0;
+ _spritesTable[i]._needUpdate = false;
state = 6;
- _spritesTable[i].updateDelay = 5;
+ _spritesTable[i]._updateDelay = 5;
} else {
- _spritesTable[i].needUpdate = 0;
+ _spritesTable[i]._needUpdate = false;
state = 6;
}
}
}
- _spritesTable[i].state = state;
+ _spritesTable[i]._state = state;
}
void TuckerEngine::updateSprite_locationNum24_1(int i) {
if (_flagsTable[103] > 1) {
- _spritesTable[i].state = 3;
+ _spritesTable[i]._state = 3;
} else {
- _spritesTable[i].state = -1;
+ _spritesTable[i]._state = -1;
}
}
@@ -1554,11 +1554,11 @@ void TuckerEngine::updateSprite_locationNum24_2(int i) {
if (_flagsTable[214] > 1) {
state = -1;
} else if (_flagsTable[214] == 1) {
- _spritesTable[i].needUpdate = 0;
+ _spritesTable[i]._needUpdate = false;
_flagsTable[214] = 2;
state = 9;
} else if (_charSpeechSoundCounter > 0 && _actionCharacterNum == i) {
- _spritesTable[i].needUpdate = 1;
+ _spritesTable[i]._needUpdate = true;
if (_flagsTable[213] == 1) {
state = 10;
} else if (_flagsTable[213] == 2) {
@@ -1567,10 +1567,10 @@ void TuckerEngine::updateSprite_locationNum24_2(int i) {
state = 8;
}
} else {
- _spritesTable[i].needUpdate = 1;
+ _spritesTable[i]._needUpdate = true;
state = 7;
}
- _spritesTable[i].state = state;
+ _spritesTable[i]._state = state;
}
void TuckerEngine::updateSprite_locationNum24_3(int i) {
@@ -1585,18 +1585,18 @@ void TuckerEngine::updateSprite_locationNum24_3(int i) {
} else {
state = 11;
}
- _spritesTable[i].state = state;
+ _spritesTable[i]._state = state;
}
void TuckerEngine::execData3PreUpdate_locationNum24() {
- _characterPrevBackFrontFacing = 0;
+ _characterPrevBackFrontFacing = false;
if (_flagsTable[112] == 0) {
_yPosCurrent = 132;
_xPosCurrent = 112;
} else if (_inventoryItemsState[2] == 1 && _inventoryItemsState[11] == 1 && _flagsTable[156] == 1 && _flagsTable[145] == 3) {
_flagsTable[156] = 2;
_nextAction = 61;
- _csDataLoaded = 0;
+ _csDataLoaded = false;
}
if (_flagsTable[103] > 0 && (_inventoryItemsState[2] > 0 || _inventoryItemsState[11] > 0 || _flagsTable[156] > 0 || _flagsTable[145] == 3) && _flagsTable[217] == 0) {
_flagsTable[217] = 1;
@@ -1619,9 +1619,9 @@ void TuckerEngine::updateSprite_locationNum26_0(int i) {
if (_flagsTable[125] > 0 && _flagsTable[125] < 300) {
_flagsTable[126] = 1;
}
- _spritesTable[i].gfxBackgroundOffset = _flagsTable[125];
- _spritesTable[i].state = 1;
- _spritesTable[i].colorType = 99;
+ _spritesTable[i]._gfxBackgroundOffset = _flagsTable[125];
+ _spritesTable[i]._state = 1;
+ _spritesTable[i]._colorType = 99;
}
void TuckerEngine::updateSprite_locationNum26_1(int i) {
@@ -1630,23 +1630,23 @@ void TuckerEngine::updateSprite_locationNum26_1(int i) {
state = -1;
} else if (_flagsTable[125] > 299) {
state = 2;
- _spritesTable[i].updateDelay = 5;
+ _spritesTable[i]._updateDelay = 5;
} else {
state = 2;
}
- _spritesTable[i].gfxBackgroundOffset = _flagsTable[125];
- _spritesTable[i].colorType = 1;
- _spritesTable[i].state = state;
+ _spritesTable[i]._gfxBackgroundOffset = _flagsTable[125];
+ _spritesTable[i]._colorType = 1;
+ _spritesTable[i]._state = state;
}
void TuckerEngine::execData3PreUpdate_locationNum26() {
- _characterPrevBackFrontFacing = 1;
- _spritesTable[1].gfxBackgroundOffset = _flagsTable[125];
- _spritesTable[0].gfxBackgroundOffset = _flagsTable[125];
+ _characterPrevBackFrontFacing = true;
+ _spritesTable[1]._gfxBackgroundOffset = _flagsTable[125];
+ _spritesTable[0]._gfxBackgroundOffset = _flagsTable[125];
if (_flagsTable[125] > 0 && _flagsTable[125] < 300) {
if (!isSoundPlaying(5)) {
- startSound(_locationSoundsTable[5].offset, 5, _locationSoundsTable[5].volume);
- startSound(_locationSoundsTable[6].offset, 6, _locationSoundsTable[6].volume);
+ startSound(_locationSoundsTable[5]._offset, 5, _locationSoundsTable[5]._volume);
+ startSound(_locationSoundsTable[6]._offset, 6, _locationSoundsTable[6]._volume);
}
++_flagsTable[125];
_flagsTable[126] = 1;
@@ -1656,7 +1656,7 @@ void TuckerEngine::execData3PreUpdate_locationNum26() {
stopSound(6);
}
}
- if (_panelLockedFlag == 0) {
+ if (!_panelLockedFlag) {
if (_xPosCurrent > 207 && _xPosCurrent < 256) {
_objectKeysLocationTable[26] = 0;
_objectKeysPosXTable[26] = 260;
@@ -1674,21 +1674,21 @@ void TuckerEngine::updateSprite_locationNum27(int i) {
state = 1;
_flagsTable[155] = 4;
} else if (_charSpeechSoundCounter > 0 && _actionCharacterNum == i) {
- _spritesTable[i].needUpdate = 1;
+ _spritesTable[i]._needUpdate = true;
state = 2;
} else if (getRandomNumber() < 30000) {
- _spritesTable[i].needUpdate = 0;
+ _spritesTable[i]._needUpdate = false;
state = 3;
- _spritesTable[i].updateDelay = 5;
+ _spritesTable[i]._updateDelay = 5;
} else {
- _spritesTable[i].needUpdate = 0;
+ _spritesTable[i]._needUpdate = false;
state = 3;
}
- _spritesTable[i].state = state;
+ _spritesTable[i]._state = state;
}
void TuckerEngine::execData3PreUpdate_locationNum27() {
- _characterPrevBackFrontFacing = 0;
+ _characterPrevBackFrontFacing = false;
}
void TuckerEngine::execData3PostUpdate_locationNum27() {
@@ -1701,36 +1701,36 @@ void TuckerEngine::updateSprite_locationNum28_0(int i) {
int state;
if (_charSpeechSoundCounter > 0 && _actionCharacterNum == i) {
state = 4;
- _spritesTable[i].needUpdate = 1;
+ _spritesTable[i]._needUpdate = true;
} else {
- _spritesTable[i].needUpdate = 0;
- ++_spritesTable[i].counter;
- if (_spritesTable[i].counter > 30) {
- _spritesTable[i].counter = 0;
+ _spritesTable[i]._needUpdate = false;
+ ++_spritesTable[i]._counter;
+ if (_spritesTable[i]._counter > 30) {
+ _spritesTable[i]._counter = 0;
}
if (_flagsTable[86] == 1) {
- if (_spritesTable[i].counter == 16 || _spritesTable[i].counter == 27) {
+ if (_spritesTable[i]._counter == 16 || _spritesTable[i]._counter == 27) {
state = 3;
} else {
state = 3;
- _spritesTable[i].updateDelay = 5;
+ _spritesTable[i]._updateDelay = 5;
}
} else {
- if (_spritesTable[i].counter == 5 || _spritesTable[i].counter == 11) {
+ if (_spritesTable[i]._counter == 5 || _spritesTable[i]._counter == 11) {
state = 5;
- } else if (_spritesTable[i].counter == 16 || _spritesTable[i].counter == 27) {
+ } else if (_spritesTable[i]._counter == 16 || _spritesTable[i]._counter == 27) {
state = 6;
} else {
state = 6;
- _spritesTable[i].updateDelay = 5;
+ _spritesTable[i]._updateDelay = 5;
}
}
}
- _spritesTable[i].state = state;
+ _spritesTable[i]._state = state;
}
void TuckerEngine::updateSprite_locationNum28_1(int i) {
- _spritesTable[i].state = (_flagsTable[86] == 1) ? 1 : -1;
+ _spritesTable[i]._state = (_flagsTable[86] == 1) ? 1 : -1;
}
void TuckerEngine::updateSprite_locationNum28_2(int i) {
@@ -1741,14 +1741,14 @@ void TuckerEngine::updateSprite_locationNum28_2(int i) {
} else {
state = -1;
}
- _spritesTable[i].state = state;
+ _spritesTable[i]._state = state;
}
void TuckerEngine::execData3PreUpdate_locationNum28() {
if (_flagsTable[86] == 0 && _xPosCurrent > 265 && _nextAction == 0) {
- _panelLockedFlag = 0;
+ _panelLockedFlag = false;
_nextAction = 21;
- _csDataLoaded = 0;
+ _csDataLoaded = false;
_pendingActionDelay = 0;
_pendingActionIndex = 0;
_currentActionVerb = 0;
@@ -1762,21 +1762,21 @@ void TuckerEngine::execData3PostUpdate_locationNum28() {
}
void TuckerEngine::updateSprite_locationNum29_0(int i) {
- _spritesTable[i].state = (getRandomNumber() < 32000) ? -1 : 2;
+ _spritesTable[i]._state = (getRandomNumber() < 32000) ? -1 : 2;
}
void TuckerEngine::updateSprite_locationNum29_1(int i) {
int state = -1;
if (getRandomNumber() >= 32000) {
state = 1;
- _spritesTable[i].gfxBackgroundOffset = 320;
+ _spritesTable[i]._gfxBackgroundOffset = 320;
}
- _spritesTable[i].state = state;
+ _spritesTable[i]._state = state;
}
void TuckerEngine::updateSprite_locationNum29_2(int i) {
- _spritesTable[i].state = 3;
- _spritesTable[i].gfxBackgroundOffset = 320;
+ _spritesTable[i]._state = 3;
+ _spritesTable[i]._gfxBackgroundOffset = 320;
}
void TuckerEngine::execData3PreUpdate_locationNum29() {
@@ -1797,22 +1797,22 @@ void TuckerEngine::execData3PreUpdate_locationNum29() {
}
_system->getPaletteManager()->setPalette(scrollPal, 118, 5);
if (_flagsTable[143] == 1) {
- _locationObjectsTable[2].xPos = 999;
- _locationObjectsTable[3].xPos = 187;
+ _locationObjectsTable[2]._xPos = 999;
+ _locationObjectsTable[3]._xPos = 187;
} else {
- _locationObjectsTable[2].xPos = 187;
- _locationObjectsTable[3].xPos = 999;
+ _locationObjectsTable[2]._xPos = 187;
+ _locationObjectsTable[3]._xPos = 999;
}
}
}
void TuckerEngine::updateSprite_locationNum30_34(int i) {
- _spritesTable[i].state = i + 1;
+ _spritesTable[i]._state = i + 1;
}
void TuckerEngine::execData3PreUpdate_locationNum30() {
if (!isSoundPlaying(1) && getRandomNumber() > 32500) {
- startSound(_locationSoundsTable[1].offset, 1, _locationSoundsTable[1].volume);
+ startSound(_locationSoundsTable[1]._offset, 1, _locationSoundsTable[1]._volume);
}
}
@@ -1829,7 +1829,7 @@ void TuckerEngine::execData3PreUpdate_locationNum31() {
}
void TuckerEngine::execData3PreUpdate_locationNum32() {
- if (_spritesTable[0].state == 12 && _spritesTable[0].animationFrame < 22) {
+ if (_spritesTable[0]._state == 12 && _spritesTable[0]._animationFrame < 22) {
_flagsTable[113] = 1;
} else {
_flagsTable[113] = 0;
@@ -1843,16 +1843,16 @@ void TuckerEngine::execData3PostUpdate_locationNum32() {
}
void TuckerEngine::updateSprite_locationNum31_0(int i) {
- _spritesTable[i].state = (getRandomNumber() < 32000) ? 3 : 1;
+ _spritesTable[i]._state = (getRandomNumber() < 32000) ? 3 : 1;
}
void TuckerEngine::updateSprite_locationNum31_1(int i) {
- _spritesTable[i].state = (_flagsTable[86] == 1) ? 2 : -1;
+ _spritesTable[i]._state = (_flagsTable[86] == 1) ? 2 : -1;
}
void TuckerEngine::updateSprite_locationNum32_0(int i) {
static const uint8 stateTable[] = { 12, 1, 11, 1, 11, 2, 1, 5, 5, 11, 1, 5, 5, 5 };
- ++_spritesTable[i].counter;
+ ++_spritesTable[i]._counter;
if (_flagsTable[123] == 2) {
_flagsTable[123] = 0;
}
@@ -1862,42 +1862,42 @@ void TuckerEngine::updateSprite_locationNum32_0(int i) {
_flagsTable[222] = 2;
} else if (_flagsTable[222] == 2) {
state = 19;
- _spritesTable[i].animationFrame = 23;
- _updateSpriteFlag1 = 1;
+ _spritesTable[i]._animationFrame = 23;
+ _updateSpriteFlag1 = true;
} else if (_flagsTable[123] == 1) {
state = 17;
_flagsTable[123] = 2;
} else if (_flagsTable[222] == 3) {
state = 18;
} else if (_charSpeechSoundCounter > 0 && _actionCharacterNum == i) {
- _spritesTable[i].needUpdate = 1;
+ _spritesTable[i]._needUpdate = true;
state = 4;
} else if (_csDataHandled) {
state = 5;
} else {
- _spritesTable[i].needUpdate = 0;
- if (_spritesTable[i].counter > 13) {
- _spritesTable[i].counter = 0;
+ _spritesTable[i]._needUpdate = false;
+ if (_spritesTable[i]._counter > 13) {
+ _spritesTable[i]._counter = 0;
}
- state = stateTable[_spritesTable[i].counter];
+ state = stateTable[_spritesTable[i]._counter];
}
- _spritesTable[i].state = state;
+ _spritesTable[i]._state = state;
}
void TuckerEngine::updateSprite_locationNum33_0(int i) {
int state = 5;
if (_charSpeechSoundCounter > 0 && _actionCharacterNum == i) {
- _spritesTable[i].needUpdate = 1;
+ _spritesTable[i]._needUpdate = true;
state = 7;
} else if (_flagsTable[87] == 1) {
state = 8;
} else if (_flagsTable[222] == 5) {
state = 4;
} else {
- _spritesTable[i].needUpdate = 0;
+ _spritesTable[i]._needUpdate = false;
state = (getRandomNumber() < 30000) ? 5 : 6;
}
- _spritesTable[i].state = state;
+ _spritesTable[i]._state = state;
}
void TuckerEngine::updateSprite_locationNum33_1(int i) {
@@ -1909,7 +1909,7 @@ void TuckerEngine::updateSprite_locationNum33_1(int i) {
} else {
state = 1;
}
- _spritesTable[i].state = state;
+ _spritesTable[i]._state = state;
}
void TuckerEngine::updateSprite_locationNum33_2(int i) {
@@ -1921,37 +1921,37 @@ void TuckerEngine::updateSprite_locationNum33_2(int i) {
} else {
state = 9;
}
- _spritesTable[i].state = state;
+ _spritesTable[i]._state = state;
}
void TuckerEngine::execData3PreUpdate_locationNum33() {
if (_xPosCurrent < 90) {
if (_flagsTable[105] == 0) {
_flagsTable[105] = 3;
- startSound(_locationSoundsTable[5].offset, 5, _locationSoundsTable[5].volume);
+ startSound(_locationSoundsTable[5]._offset, 5, _locationSoundsTable[5]._volume);
}
} else {
if (_flagsTable[105] == 1) {
_flagsTable[105] = 2;
- startSound(_locationSoundsTable[5].offset, 5, _locationSoundsTable[5].volume);
+ startSound(_locationSoundsTable[5]._offset, 5, _locationSoundsTable[5]._volume);
}
}
if (_xPosCurrent > 230) {
if (_flagsTable[106] == 0) {
_flagsTable[106] = 3;
- startSound(_locationSoundsTable[5].offset, 5, _locationSoundsTable[5].volume);
+ startSound(_locationSoundsTable[5]._offset, 5, _locationSoundsTable[5]._volume);
}
} else {
if (_flagsTable[106] == 1) {
_flagsTable[106] = 2;
- startSound(_locationSoundsTable[5].offset, 5, _locationSoundsTable[5].volume);
+ startSound(_locationSoundsTable[5]._offset, 5, _locationSoundsTable[5]._volume);
}
}
}
void TuckerEngine::execData3PreUpdate_locationNum34() {
if (_flagsTable[143] == 1) {
- _locationObjectsTable[0].xPos = 0;
+ _locationObjectsTable[0]._xPos = 0;
}
}
@@ -1962,7 +1962,7 @@ void TuckerEngine::execData3PreUpdate_locationNum35() {
}
void TuckerEngine::updateSprite_locationNum36(int i) {
- _spritesTable[i].state = (getRandomNumber() < 32000) ? 1 : 2;
+ _spritesTable[i]._state = (getRandomNumber() < 32000) ? 1 : 2;
}
void TuckerEngine::execData3PreUpdate_locationNum36() {
@@ -1978,12 +1978,12 @@ void TuckerEngine::execData3PreUpdate_locationNum36() {
void TuckerEngine::updateSprite_locationNum37(int i) {
int j = i + 1;
int offset = 200 - i * 45;
- ++_spritesTable[i].counter;
- if (_spritesTable[i].counter > offset) {
- _spritesTable[i].state = j;
- _spritesTable[i].counter = 0;
+ ++_spritesTable[i]._counter;
+ if (_spritesTable[i]._counter > offset) {
+ _spritesTable[i]._state = j;
+ _spritesTable[i]._counter = 0;
} else {
- _spritesTable[i].state = -1;
+ _spritesTable[i]._state = -1;
}
}
@@ -2001,16 +2001,16 @@ void TuckerEngine::updateSprite_locationNum41(int i) {
state = 1;
_flagsTable[158] = 2;
} else if (_charSpeechSoundCounter > 0 && _actionCharacterNum == i) {
- _spritesTable[i].needUpdate = 1;
+ _spritesTable[i]._needUpdate = true;
state = 3;
} else if (getRandomNumber() < 30000) {
- _spritesTable[i].needUpdate = 0;
+ _spritesTable[i]._needUpdate = false;
state = 5;
} else {
- _spritesTable[i].needUpdate = 0;
+ _spritesTable[i]._needUpdate = false;
state = 4;
}
- _spritesTable[i].state = state;
+ _spritesTable[i]._state = state;
}
void TuckerEngine::execData3PreUpdate_locationNum41() {
@@ -2020,10 +2020,10 @@ void TuckerEngine::execData3PreUpdate_locationNum41() {
} else if (_backgroundSpriteCurrentFrame == 7) {
_flagsTable[77] = 0;
}
- if (_changeBackgroundSprite == 0) {
+ if (!_changeBackgroundSprite) {
if (_backgroundSpriteCurrentFrame == 16 && !isSoundPlaying(4)) {
- _locationSoundsTable[4].type = 2;
- startSound(_locationSoundsTable[4].offset, 4, _locationSoundsTable[4].volume);
+ _locationSoundsTable[4]._type = 2;
+ startSound(_locationSoundsTable[4]._offset, 4, _locationSoundsTable[4]._volume);
} else {
if (_backgroundSpriteCurrentFrame == 28) {
stopSound(4);
@@ -2031,8 +2031,8 @@ void TuckerEngine::execData3PreUpdate_locationNum41() {
}
} else {
if (_backgroundSpriteCurrentFrame == 28 && !isSoundPlaying(4)) {
- _locationSoundsTable[4].type = 2;
- startSound(_locationSoundsTable[4].offset, 4, _locationSoundsTable[4].volume);
+ _locationSoundsTable[4]._type = 2;
+ startSound(_locationSoundsTable[4]._offset, 4, _locationSoundsTable[4]._volume);
} else {
if (_backgroundSpriteCurrentFrame == 18) {
stopSound(4);
@@ -2040,11 +2040,11 @@ void TuckerEngine::execData3PreUpdate_locationNum41() {
}
}
}
- if (_panelLockedFlag == 1 && _yPosCurrent > 130 && _selectedObject.yPos > 135 && _nextAction == 0 && _flagsTable[223] == 0) {
- _panelLockedFlag = 0;
+ if (_panelLockedFlag && _yPosCurrent > 130 && _selectedObject._yPos > 135 && _nextAction == 0 && _flagsTable[223] == 0) {
+ _panelLockedFlag = false;
_csDataLoaded = false;
_nextLocationNum = 0;
- _selectedObject.locationObject_locationNum = 0;
+ _selectedObject._locationObjectLocationNum = 0;
_locationMaskType = 0;
_nextAction = _flagsTable[163] + 32;
++_flagsTable[163];
@@ -2057,9 +2057,9 @@ void TuckerEngine::execData3PreUpdate_locationNum41() {
}
}
if (_flagsTable[77] == 0) {
- _locationObjectsTable[3].xPos = 230;
+ _locationObjectsTable[3]._xPos = 230;
} else {
- _locationObjectsTable[3].xPos = 930;
+ _locationObjectsTable[3]._xPos = 930;
}
}
}
@@ -2076,13 +2076,13 @@ void TuckerEngine::updateSprite_locationNum42(int i) {
_flagsTable[223] = 3;
} else if (_flagsTable[223] == 3) {
state = 5;
- _spritesTable[i].updateDelay = 5;
- _spritesTable[i].state = _spritesTable[i].firstFrame - 1; // FIXME: bug, fxNum ?
- _updateSpriteFlag1 = 1;
+ _spritesTable[i]._updateDelay = 5;
+ _spritesTable[i]._state = _spritesTable[i]._firstFrame - 1; // FIXME: bug, fxNum ?
+ _updateSpriteFlag1 = true;
} else {
state = 2;
}
- _spritesTable[i].state = state;
+ _spritesTable[i]._state = state;
}
void TuckerEngine::execData3PreUpdate_locationNum42() {
@@ -2094,18 +2094,18 @@ void TuckerEngine::updateSprite_locationNum43_2(int i) {
if (_flagsTable[237] > 0) {
state = -1;
} else if (_charSpeechSoundCounter > 0 && _actionCharacterNum == i) {
- _spritesTable[i].needUpdate = 1;
+ _spritesTable[i]._needUpdate = true;
state = 5;
- } else if (_csDataHandled || _spritesTable[i].counter == 2) {
- _spritesTable[i].needUpdate = 0;
+ } else if (_csDataHandled || _spritesTable[i]._counter == 2) {
+ _spritesTable[i]._needUpdate = false;
state = 6;
- } else if (_spritesTable[i].counter == 0) {
+ } else if (_spritesTable[i]._counter == 0) {
state = 3;
} else {
state = 4;
- _spritesTable[i].counter = 2;
+ _spritesTable[i]._counter = 2;
}
- _spritesTable[i].state = state;
+ _spritesTable[i]._state = state;
}
void TuckerEngine::updateSprite_locationNum43_3(int i) {
@@ -2114,12 +2114,12 @@ void TuckerEngine::updateSprite_locationNum43_3(int i) {
state = -1;
} else if (_charSpeechSoundCounter > 0 && _actionCharacterNum == i) {
state = 7;
- _spritesTable[i].needUpdate = 1;
+ _spritesTable[i]._needUpdate = true;
} else {
state = 8;
- _spritesTable[i].needUpdate = 0;
+ _spritesTable[i]._needUpdate = false;
}
- _spritesTable[i].state = state;
+ _spritesTable[i]._state = state;
}
void TuckerEngine::updateSprite_locationNum43_4(int i) {
@@ -2128,38 +2128,38 @@ void TuckerEngine::updateSprite_locationNum43_4(int i) {
state = -1;
} else if (_charSpeechSoundCounter > 0 && _actionCharacterNum == i) {
state = 9;
- _spritesTable[i].needUpdate = 1;
+ _spritesTable[i]._needUpdate = true;
} else {
state = 10;
- _spritesTable[i].needUpdate = 0;
+ _spritesTable[i]._needUpdate = false;
}
- _spritesTable[i].state = state;
+ _spritesTable[i]._state = state;
}
void TuckerEngine::updateSprite_locationNum43_5(int i) {
- _spritesTable[i].state = (_flagsTable[236] < 4) ? -1 : 11;
+ _spritesTable[i]._state = (_flagsTable[236] < 4) ? -1 : 11;
}
void TuckerEngine::updateSprite_locationNum43_6(int i) {
- _spritesTable[i].state = (_flagsTable[236] < 4) ? -1 : 12;
+ _spritesTable[i]._state = (_flagsTable[236] < 4) ? -1 : 12;
}
void TuckerEngine::execData3PreUpdate_locationNum43() {
- if (_panelLockedFlag == 1 && _xPosCurrent > 67 && _selectedObject.xPos > 68 && _locationMaskType == 0) {
- _panelLockedFlag = 0;
- _csDataLoaded = 0;
+ if (_panelLockedFlag && _xPosCurrent > 67 && _selectedObject._xPos > 68 && _locationMaskType == 0) {
+ _panelLockedFlag = false;
+ _csDataLoaded = false;
_nextAction = 5;
}
- if (_xPosCurrent > 55 && _spritesTable[2].counter == 0) {
- _spritesTable[2].counter = 1;
+ if (_xPosCurrent > 55 && _spritesTable[2]._counter == 0) {
+ _spritesTable[2]._counter = 1;
}
}
void TuckerEngine::execData3PreUpdate_locationNum44() {
if (_backgroundSpriteCurrentAnimation == 1) {
if (!isSoundPlaying(3) && _backgroundSpriteCurrentFrame == 1) {
- _locationSoundsTable[3].type = 2;
- startSound(_locationSoundsTable[3].offset, 3, _locationSoundsTable[3].volume);
+ _locationSoundsTable[3]._type = 2;
+ startSound(_locationSoundsTable[3]._offset, 3, _locationSoundsTable[3]._volume);
}
if (_backgroundSpriteCurrentFrame == 21) {
_flagsTable[77] = 1;
@@ -2169,7 +2169,7 @@ void TuckerEngine::execData3PreUpdate_locationNum44() {
}
} else if (_backgroundSpriteCurrentAnimation == 4) {
if (_backgroundSpriteCurrentFrame == 20 && !isSoundPlaying(3)) {
- startSound(_locationSoundsTable[3].offset, 3, _locationSoundsTable[3].volume);
+ startSound(_locationSoundsTable[3]._offset, 3, _locationSoundsTable[3]._volume);
}
}
}
@@ -2182,14 +2182,14 @@ void TuckerEngine::updateSprite_locationNum48(int i) {
_flagsTable[160] = 3;
state = 3;
} else if (_charSpeechSoundCounter > 0 && _actionCharacterNum == i) {
- _spritesTable[i].needUpdate = 1;
+ _spritesTable[i]._needUpdate = true;
state = 2;
} else {
- _spritesTable[i].needUpdate = 0;
+ _spritesTable[i]._needUpdate = false;
state = 2;
- _spritesTable[i].updateDelay = 5;
+ _spritesTable[i]._updateDelay = 5;
}
- _spritesTable[i].state = state;
+ _spritesTable[i]._state = state;
}
void TuckerEngine::updateSprite_locationNum49(int i) {
@@ -2211,20 +2211,20 @@ void TuckerEngine::updateSprite_locationNum49(int i) {
_flagsTable[185] = 0;
state = 4;
} else if (_charSpeechSoundCounter > 0 && _actionCharacterNum == i) {
- _spritesTable[i].needUpdate = 1;
+ _spritesTable[i]._needUpdate = true;
state = 2;
} else {
- _spritesTable[i].needUpdate = 0;
+ _spritesTable[i]._needUpdate = false;
if (getRandomNumber() < 30000 || _backgroundSpriteCurrentAnimation <= -1) {
state = 3;
- _spritesTable[i].updateDelay = 1;
+ _spritesTable[i]._updateDelay = 1;
} else if (getRandomNumber() < 16000) {
state = 5;
} else {
state = 6;
}
}
- _spritesTable[i].state = state;
+ _spritesTable[i]._state = state;
}
void TuckerEngine::execData3PreUpdate_locationNum49() {
@@ -2272,38 +2272,38 @@ void TuckerEngine::updateSprite_locationNum50(int i) {
_flagsTable[240] = 1;
}
} else {
- _spritesTable[i].animationFrame = _spritesTable[i].firstFrame - 1;
- _spritesTable[i].updateDelay = 5;
- _updateSpriteFlag1 = 1;
+ _spritesTable[i]._animationFrame = _spritesTable[i]._firstFrame - 1;
+ _spritesTable[i]._updateDelay = 5;
+ _updateSpriteFlag1 = true;
state = i + 1;
}
- _spritesTable[i].state = state;
+ _spritesTable[i]._state = state;
}
void TuckerEngine::updateSprite_locationNum51(int i) {
if (i == 2) {
- _spritesTable[i].state = 1;
+ _spritesTable[i]._state = 1;
} else if (i == 0) {
static const int stateTable[] = { 3, 3, 4, 5, 3, 3, 5, 4, 3, 3, 4, 5, 4, 4 };
- ++_spritesTable[i].counter;
- if (_spritesTable[i].counter > 13) {
- _spritesTable[i].counter = 0;
+ ++_spritesTable[i]._counter;
+ if (_spritesTable[i]._counter > 13) {
+ _spritesTable[i]._counter = 0;
}
- _spritesTable[i].state = stateTable[_spritesTable[i].counter];
+ _spritesTable[i]._state = stateTable[_spritesTable[i]._counter];
} else {
i = 1;
- _spritesTable[i].state = 6;
+ _spritesTable[i]._state = 6;
}
- _spritesTable[i].colorType = 1;
- _spritesTable[i].yMaxBackground = 0;
+ _spritesTable[i]._colorType = 1;
+ _spritesTable[i]._yMaxBackground = 0;
}
void TuckerEngine::execData3PreUpdate_locationNum52() {
- if (_selectedObject.xPos > 108 && _panelLockedFlag > 0 && _nextAction == 0 && _locationMaskType == 0) {
+ if (_selectedObject._xPos > 108 && _panelLockedFlag && _nextAction == 0 && _locationMaskType == 0) {
_nextAction = 1;
- _csDataLoaded = 0;
+ _csDataLoaded = false;
}
}
@@ -2313,21 +2313,21 @@ void TuckerEngine::updateSprite_locationNum53_0(int i) {
}
int state;
if (_charSpeechSoundCounter > 0 && _actionCharacterNum == i) {
- _spritesTable[i].needUpdate = 1;
+ _spritesTable[i]._needUpdate = true;
state = 1;
} else if (_flagsTable[197] == 1) {
state = 3;
- _spritesTable[i].needUpdate = 0;
+ _spritesTable[i]._needUpdate = false;
_flagsTable[197] = 2;
} else if (_flagsTable[192] == 1) {
- _spritesTable[i].needUpdate = 0;
+ _spritesTable[i]._needUpdate = false;
state = 5;
} else {
- _spritesTable[i].needUpdate = 0;
+ _spritesTable[i]._needUpdate = false;
state = 5;
- _spritesTable[i].updateDelay = 5;
+ _spritesTable[i]._updateDelay = 5;
}
- _spritesTable[i].state = state;
+ _spritesTable[i]._state = state;
}
void TuckerEngine::updateSprite_locationNum53_1(int i) {
@@ -2339,14 +2339,14 @@ void TuckerEngine::updateSprite_locationNum53_1(int i) {
} else {
state = -1;
}
- _spritesTable[i].state = state;
+ _spritesTable[i]._state = state;
}
void TuckerEngine::execData3PreUpdate_locationNum53() {
if (_flagsTable[192] == 0 && _xPosCurrent < 200 && _nextAction == 0) {
- _panelLockedFlag = 0;
+ _panelLockedFlag = false;
_nextAction = 14;
- _csDataLoaded = 0;
+ _csDataLoaded = false;
_pendingActionDelay = 0;
_pendingActionIndex = 0;
_currentActionVerb = 0;
@@ -2354,55 +2354,52 @@ void TuckerEngine::execData3PreUpdate_locationNum53() {
}
void TuckerEngine::updateSprite_locationNum54(int i) {
- int state = 3;
if (_flagsTable[141] == 2) {
- _spritesTable[i].needUpdate = 0;
+ _spritesTable[i]._needUpdate = false;
setCharacterAnimation(0, i);
_flagsTable[141] = 1;
- _spritesTable[i].counter = 0;
- } else if (_flagsTable[141] == 1 && _spritesTable[i].counter < 40) {
+ _spritesTable[i]._counter = 0;
+ } else if (_flagsTable[141] == 1 && _spritesTable[i]._counter < 40) {
setCharacterAnimation(1, i);
- ++_spritesTable[i].counter;
+ ++_spritesTable[i]._counter;
} else if (_flagsTable[141] == 1) {
setCharacterAnimation(2, i);
_flagsTable[141] = 3;
} else {
+ int state = 3;
if (_charSpeechSoundCounter > 0 && _actionCharacterNum == i) {
- _spritesTable[i].needUpdate = 2;
+ _spritesTable[i]._needUpdate = true;
state = (getRandomNumber() < 12000) ? 2 : 4;
} else if (_flagsTable[141] == 3) {
- state = 3;
_flagsTable[141] = 0;
_flagsTable[224] = 1;
- _spritesTable[i].counter = 0;
- if (_panelLockedFlag == 0 && _xPosCurrent > 130 && _inventoryItemsState[17] == 0) {
+ _spritesTable[i]._counter = 0;
+ if (!_panelLockedFlag && _xPosCurrent > 130 && _inventoryItemsState[17] == 0) {
_nextAction = 18;
_csDataLoaded = false;
}
} else if (getRandomNumber() < 26000) {
- state = 3;
- _spritesTable[i].needUpdate = 0;
- _spritesTable[i].updateDelay = 5;
+ _spritesTable[i]._needUpdate = false;
+ _spritesTable[i]._updateDelay = 5;
} else {
- state = 3;
- _spritesTable[i].needUpdate = 0;
+ _spritesTable[i]._needUpdate = false;
}
if (_inventoryItemsState[17] == 1) {
_flagsTable[224] = 2;
}
- _spritesTable[i].state = state;
+ _spritesTable[i]._state = state;
}
}
void TuckerEngine::updateSprite_locationNum55(int i) {
if (_flagsTable[193] > 0 && _flagsTable[193] < 14) {
setCharacterAnimation(_flagsTable[193] - 1, i);
- _updateSpriteFlag1 = 1;
+ _updateSpriteFlag1 = true;
if (_flagsTable[193] == 1 || _flagsTable[193] == 3 || _flagsTable[193] == 5 || _flagsTable[193] == 7 || _flagsTable[193] == 11 || _flagsTable[193] == 13) {
++_flagsTable[193];
}
} else {
- _spritesTable[i].state = -1;
+ _spritesTable[i]._state = -1;
if (_flagsTable[193] == 14) {
_flagsTable[193] = 15;
}
@@ -2411,26 +2408,26 @@ void TuckerEngine::updateSprite_locationNum55(int i) {
void TuckerEngine::updateSprite_locationNum56(int i) {
int state;
- ++_spritesTable[i].counter;
+ ++_spritesTable[i]._counter;
if (_flagsTable[153] == 1) {
state = -1;
} else if (_charSpeechSoundCounter > 0 && _actionCharacterNum == i) {
- _spritesTable[i].needUpdate = 1;
+ _spritesTable[i]._needUpdate = true;
state = 2;
} else {
- _spritesTable[i].needUpdate = 0;
+ _spritesTable[i]._needUpdate = false;
state = 1;
}
- _spritesTable[i].state = state;
+ _spritesTable[i]._state = state;
}
void TuckerEngine::updateSprite_locationNum57_0(int i) {
int state;
if (_charSpeechSoundCounter > 0 && _actionCharacterNum == i) {
- _spritesTable[i].needUpdate = 1;
+ _spritesTable[i]._needUpdate = true;
state = 5;
} else {
- _spritesTable[i].needUpdate = 0;
+ _spritesTable[i]._needUpdate = false;
if (getRandomNumber() < 30000) {
state = 1;
} else if (getRandomNumber() < 16000) {
@@ -2439,15 +2436,15 @@ void TuckerEngine::updateSprite_locationNum57_0(int i) {
state = 2;
}
}
- _spritesTable[i].state = state;
+ _spritesTable[i]._state = state;
}
void TuckerEngine::updateSprite_locationNum57_1(int i) {
int state = 6;
if (getRandomNumber() < 30000) {
- _spritesTable[i].updateDelay = 5;
+ _spritesTable[i]._updateDelay = 5;
}
- _spritesTable[i].state = state;
+ _spritesTable[i]._state = state;
}
void TuckerEngine::execData3PreUpdate_locationNum57() {
@@ -2472,20 +2469,20 @@ void TuckerEngine::updateSprite_locationNum58(int i) {
_flagsTable[190] = 3;
}
}
- _spritesTable[i].state = state;
- _spritesTable[i].gfxBackgroundOffset = 320;
+ _spritesTable[i]._state = state;
+ _spritesTable[i]._gfxBackgroundOffset = 320;
}
void TuckerEngine::execData3PreUpdate_locationNum58() {
// workaround original game glitch #2872348: do not change position on location change
if (_nextLocationNum == 0 && _flagsTable[190] < 3 && _xPosCurrent > 310) {
_xPosCurrent = 310;
- _panelLockedFlag = 0;
+ _panelLockedFlag = false;
}
- if (_flagsTable[190] > 0 && _locationSoundsTable[0].volume > 0) {
- _locationSoundsTable[0].volume = 0;
- _locationSoundsTable[4].volume = 0;
- _locationSoundsTable[5].volume = 0;
+ if (_flagsTable[190] > 0 && _locationSoundsTable[0]._volume > 0) {
+ _locationSoundsTable[0]._volume = 0;
+ _locationSoundsTable[4]._volume = 0;
+ _locationSoundsTable[5]._volume = 0;
if (isSoundPlaying(0)) {
stopSound(0);
}
@@ -2498,27 +2495,27 @@ void TuckerEngine::updateSprite_locationNum59(int i) {
state = -1;
} else if (_charSpeechSoundCounter > 0 && _actionCharacterNum == i) {
state = 3;
- _spritesTable[i].needUpdate = 1;
+ _spritesTable[i]._needUpdate = true;
} else if (_csDataHandled) {
- _spritesTable[i].needUpdate = 0;
+ _spritesTable[i]._needUpdate = false;
if (_flagsTable[199] == 0) {
_flagsTable[199] = 1;
setCharacterAnimation(0, 0);
return;
}
- _spritesTable[i].needUpdate = 0;
+ _spritesTable[i]._needUpdate = false;
state = 3;
- _spritesTable[i].updateDelay = 5;
+ _spritesTable[i]._updateDelay = 5;
} else if (_flagsTable[199] == 1) {
_flagsTable[199] = 0;
- _spritesTable[i].needUpdate = 0;
+ _spritesTable[i]._needUpdate = false;
setCharacterAnimation(1, 0);
return;
} else {
- _spritesTable[i].needUpdate = 0;
+ _spritesTable[i]._needUpdate = false;
state = 1;
}
- _spritesTable[i].state = state;
+ _spritesTable[i]._state = state;
}
void TuckerEngine::updateSprite_locationNum60_0(int i) {
@@ -2526,34 +2523,34 @@ void TuckerEngine::updateSprite_locationNum60_0(int i) {
if (_flagsTable[186] > 0) {
state = -1;
} else if (_charSpeechSoundCounter > 0 && _actionCharacterNum == i) {
- _spritesTable[i].needUpdate = 1;
+ _spritesTable[i]._needUpdate = true;
state = 9;
} else {
- _spritesTable[i].needUpdate = 0;
+ _spritesTable[i]._needUpdate = false;
state = (getRandomNumber() > 32000) ? 8 : 7;
}
- _spritesTable[i].state = state;
- _spritesTable[i].gfxBackgroundOffset = 320;
+ _spritesTable[i]._state = state;
+ _spritesTable[i]._gfxBackgroundOffset = 320;
}
void TuckerEngine::updateSprite_locationNum60_1(int i) {
int state;
if (_flagsTable[186] == 1) {
_flagsTable[186] = 2;
- _spritesTable[i].needUpdate = 0;
+ _spritesTable[i]._needUpdate = false;
state = 2;
} else if (_flagsTable[186] == 2) {
state = 6;
_flagsTable[187] = 1;
} else if (_charSpeechSoundCounter > 0 && _actionCharacterNum == i) {
- _spritesTable[i].needUpdate = 1;
+ _spritesTable[i]._needUpdate = true;
state = 1;
} else {
- _spritesTable[i].needUpdate = 0;
+ _spritesTable[i]._needUpdate = false;
state = (getRandomNumber() > 32000) ? 5 : 4;
}
- _spritesTable[i].state = state;
- _spritesTable[i].gfxBackgroundOffset = 320;
+ _spritesTable[i]._state = state;
+ _spritesTable[i]._gfxBackgroundOffset = 320;
}
void TuckerEngine::execData3PostUpdate_locationNum60() {
@@ -2569,19 +2566,19 @@ void TuckerEngine::updateSprite_locationNum61_0(int i) {
} else if (_flagsTable[88] == 2) {
state = -1;
} else if (_charSpeechSoundCounter > 0 && _actionCharacterNum == 0) {
- if (_spritesTable[i].needUpdate == 0) {
- _spritesTable[i].needUpdate = 1;
+ if (!_spritesTable[i]._needUpdate) {
+ _spritesTable[i]._needUpdate = true;
state = 2;
} else {
state = 2;
- _spritesTable[0].animationFrame = 2;
- _updateSpriteFlag1 = 1;
+ _spritesTable[0]._animationFrame = 2;
+ _updateSpriteFlag1 = true;
}
} else {
- _spritesTable[i].needUpdate = 0;
+ _spritesTable[i]._needUpdate = false;
if (r < 30000) {
state = 7;
- _spritesTable[i].updateDelay = 5;
+ _spritesTable[i]._updateDelay = 5;
} else if (r < 31000) {
state = 7;
} else if (r < 32000) {
@@ -2590,7 +2587,7 @@ void TuckerEngine::updateSprite_locationNum61_0(int i) {
state = 6;
}
}
- _spritesTable[i].state = state;
+ _spritesTable[i]._state = state;
}
void TuckerEngine::updateSprite_locationNum61_1(int i) {
@@ -2598,19 +2595,19 @@ void TuckerEngine::updateSprite_locationNum61_1(int i) {
if (_flagsTable[151] == 1) {
state = -1;
} else if (_charSpeechSoundCounter > 0 && _actionCharacterNum == i) {
- _spritesTable[i].needUpdate = 1;
+ _spritesTable[i]._needUpdate = true;
state = 14;
} else if (_csDataHandled || getRandomNumber() < 29000) {
- _spritesTable[i].needUpdate = 0;
+ _spritesTable[i]._needUpdate = false;
state = 12;
- _spritesTable[i].updateDelay = 5;
+ _spritesTable[i]._updateDelay = 5;
} else if (getRandomNumber() < 20000) {
state = 12;
} else {
state = 13;
}
- _spritesTable[i].state = state;
- _spritesTable[i].gfxBackgroundOffset = 320;
+ _spritesTable[i]._state = state;
+ _spritesTable[i]._gfxBackgroundOffset = 320;
}
void TuckerEngine::updateSprite_locationNum61_2(int i) {
@@ -2651,8 +2648,8 @@ void TuckerEngine::updateSprite_locationNum61_2(int i) {
if (_flagsTable[136] != 2) {
_flagsTable[150] = 0;
}
- _spritesTable[i].state = state;
- _spritesTable[i].gfxBackgroundOffset = 320;
+ _spritesTable[i]._state = state;
+ _spritesTable[i]._gfxBackgroundOffset = 320;
}
void TuckerEngine::execData3PreUpdate_locationNum61() {
@@ -2676,13 +2673,13 @@ void TuckerEngine::updateSprite_locationNum63_0(int i) {
} else if (_flagsTable[132] != 2 || _flagsTable[133] != 1 || _flagsTable[136] > 0) {
state = -1;
} else if (_charSpeechSoundCounter > 0 && _actionCharacterNum == i) {
- _spritesTable[i].needUpdate = 1;
+ _spritesTable[i]._needUpdate = true;
state = 6;
} else {
- _spritesTable[i].needUpdate = 0;
+ _spritesTable[i]._needUpdate = false;
state = -1;
}
- _spritesTable[i].state = state;
+ _spritesTable[i]._state = state;
}
void TuckerEngine::updateSprite_locationNum63_1(int i) {
@@ -2694,16 +2691,16 @@ void TuckerEngine::updateSprite_locationNum63_1(int i) {
state = 8;
}
}
- _spritesTable[i].state = state;
+ _spritesTable[i]._state = state;
}
void TuckerEngine::updateSprite_locationNum63_2(int i) {
- ++_spritesTable[i].counter;
+ ++_spritesTable[i]._counter;
int state = -1;
if (_flagsTable[132] == 2 && _flagsTable[133] == 1 && _flagsTable[136] <= 0) {
if (_flagsTable[226] == 0) {
state = 9;
- _spritesTable[i].updateDelay = 5;
+ _spritesTable[i]._updateDelay = 5;
} else if (_flagsTable[226] == 1) {
state = 9;
_flagsTable[226] = 2;
@@ -2714,16 +2711,16 @@ void TuckerEngine::updateSprite_locationNum63_2(int i) {
state = 10;
}
}
- _spritesTable[i].state = state;
+ _spritesTable[i]._state = state;
}
void TuckerEngine::updateSprite_locationNum63_3(int i) {
- ++_spritesTable[i].counter;
+ ++_spritesTable[i]._counter;
int state = -1;
if (_flagsTable[132] == 2 && _flagsTable[133] == 1 && _flagsTable[136] <= 0) {
- if (_spritesTable[i].counter > 80) {
+ if (_spritesTable[i]._counter > 80) {
state = 7;
- _spritesTable[i].counter = 0;
+ _spritesTable[i]._counter = 0;
} else if (getRandomNumber() > 32000) {
state = 2;
} else if (getRandomNumber() > 32000) {
@@ -2732,7 +2729,7 @@ void TuckerEngine::updateSprite_locationNum63_3(int i) {
state = 8;
}
}
- _spritesTable[i].state = state;
+ _spritesTable[i]._state = state;
}
void TuckerEngine::updateSprite_locationNum63_4(int i) {
@@ -2740,7 +2737,7 @@ void TuckerEngine::updateSprite_locationNum63_4(int i) {
if (_flagsTable[132] == 2 && _flagsTable[133] == 1 && _flagsTable[136] == 0) {
state = 1;
}
- _spritesTable[i].state = state;
+ _spritesTable[i]._state = state;
}
void TuckerEngine::execData3PreUpdate_locationNum63() {
@@ -2764,8 +2761,8 @@ void TuckerEngine::execData3PreUpdate_locationNum63() {
} else {
if (_flagsTable[132] == 0 || (_flagsTable[132] == 2 && _flagsTable[136] > 0)) {
if (!isSoundPlaying(1)) {
- _locationSoundsTable[1].type = 2;
- startSound(_locationSoundsTable[1].offset, 1, _locationSoundsTable[1].volume);
+ _locationSoundsTable[1]._type = 2;
+ startSound(_locationSoundsTable[1]._offset, 1, _locationSoundsTable[1]._volume);
}
} else {
if (isSoundPlaying(1)) {
@@ -2774,8 +2771,8 @@ void TuckerEngine::execData3PreUpdate_locationNum63() {
}
if (_flagsTable[132] == 1) {
if (!isSoundPlaying(0)) {
- _locationSoundsTable[0].type = 2;
- startSound(_locationSoundsTable[0].offset, 0, _locationSoundsTable[0].volume);
+ _locationSoundsTable[0]._type = 2;
+ startSound(_locationSoundsTable[0]._offset, 0, _locationSoundsTable[0]._volume);
}
} else {
if (isSoundPlaying(0)) {
@@ -2784,7 +2781,7 @@ void TuckerEngine::execData3PreUpdate_locationNum63() {
}
if (_flagsTable[132] == 2 && _flagsTable[136] == 0) {
if (!isSoundPlaying(2)) {
- startSound(_locationSoundsTable[2].offset, 2, _locationSoundsTable[2].volume);
+ startSound(_locationSoundsTable[2]._offset, 2, _locationSoundsTable[2]._volume);
}
} else {
if (isSoundPlaying(2)) {
@@ -2807,7 +2804,7 @@ void TuckerEngine::updateSprite_locationNum65(int i) {
if (_flagsTable[188] == 1) {
_flagsTable[188] = 2;
state = 1;
- _spritesTable[i].gfxBackgroundOffset = 100;
+ _spritesTable[i]._gfxBackgroundOffset = 100;
} else if (_flagsTable[188] > 0 && _flagsTable[189] > 0) {
state = -1;
if (_xPosCurrent < 150 || _yPosCurrent > 240) {
@@ -2826,7 +2823,7 @@ void TuckerEngine::updateSprite_locationNum65(int i) {
_flagsTable[189] = 0;
}
}
- _spritesTable[i].state = state;
+ _spritesTable[i]._state = state;
}
void TuckerEngine::execData3PreUpdate_locationNum65() {
@@ -2836,66 +2833,66 @@ void TuckerEngine::execData3PreUpdate_locationNum65() {
void TuckerEngine::updateSprite_locationNum66_0(int i) {
int state;
if (_charSpeechSoundCounter > 0 && _actionCharacterNum == i) {
- _spritesTable[i].needUpdate = 1;
+ _spritesTable[i]._needUpdate = true;
state = 2;
} else {
- _spritesTable[i].needUpdate = 0;
+ _spritesTable[i]._needUpdate = false;
state = 2;
- _spritesTable[i].updateDelay = 5;
+ _spritesTable[i]._updateDelay = 5;
}
- _spritesTable[i].state = state;
- _spritesTable[i].gfxBackgroundOffset = 320;
+ _spritesTable[i]._state = state;
+ _spritesTable[i]._gfxBackgroundOffset = 320;
}
void TuckerEngine::updateSprite_locationNum66_1(int i) {
int state;
if (_flagsTable[191] == 0 && _xPosCurrent > 568) {
if (_charSpeechSoundCounter > 0 && _actionCharacterNum == i) {
- _spritesTable[i].needUpdate = 1;
+ _spritesTable[i]._needUpdate = true;
state = 8;
} else {
state = 10;
- _spritesTable[i].needUpdate = 0;
+ _spritesTable[i]._needUpdate = false;
}
} else {
if (_charSpeechSoundCounter > 0 && _actionCharacterNum == i) {
- _spritesTable[i].needUpdate = 1;
+ _spritesTable[i]._needUpdate = true;
state = 9;
} else if (getRandomNumber() > 30000) {
state = 6;
- _spritesTable[i].needUpdate = 0;
+ _spritesTable[i]._needUpdate = false;
} else {
- _spritesTable[i].needUpdate = 0;
+ _spritesTable[i]._needUpdate = false;
state = 7;
- _spritesTable[i].updateDelay = 5;
+ _spritesTable[i]._updateDelay = 5;
}
}
- _spritesTable[i].state = state;
- _spritesTable[i].gfxBackgroundOffset = 320;
+ _spritesTable[i]._state = state;
+ _spritesTable[i]._gfxBackgroundOffset = 320;
}
void TuckerEngine::updateSprite_locationNum66_2(int i) {
- _spritesTable[i].disabled = 1;
- _spritesTable[i].state = 3;
+ _spritesTable[i]._disabled = true;
+ _spritesTable[i]._state = 3;
}
void TuckerEngine::updateSprite_locationNum66_3(int i) {
- _spritesTable[i].state = 4;
+ _spritesTable[i]._state = 4;
}
void TuckerEngine::updateSprite_locationNum66_4(int i) {
- _spritesTable[i].state = 5;
- _spritesTable[i].gfxBackgroundOffset = 320;
+ _spritesTable[i]._state = 5;
+ _spritesTable[i]._gfxBackgroundOffset = 320;
}
void TuckerEngine::execData3PreUpdate_locationNum66() {
// FIXME: shouldn't be executed after using the map
_flagsTable[137] = 0;
if (_xPosCurrent > 583 && _flagsTable[191] == 0 && _nextAction == 0 && _locationMaskType == 0) {
- _panelLockedFlag = 0;
- _csDataLoaded = 0;
+ _panelLockedFlag = false;
+ _csDataLoaded = false;
_nextLocationNum = 0;
- _selectedObject.locationObject_locationNum = 0;
+ _selectedObject._locationObjectLocationNum = 0;
if (_flagsTable[131] == 0) {
_nextAction = 13;
} else if (_flagsTable[130] == 0) {
@@ -2907,25 +2904,25 @@ void TuckerEngine::execData3PreUpdate_locationNum66() {
}
void TuckerEngine::execData3PostUpdate_locationNum66() {
- if (_spritesTable[2].flipX == 1) {
+ if (_spritesTable[2]._flipX) {
--_updateLocationXPosTable2[0];
if (_updateLocationXPosTable2[0] < -50) {
- _spritesTable[2].flipX = 0;
+ _spritesTable[2]._flipX = false;
_updateLocationXPosTable2[0] = -50;
}
} else {
++_updateLocationXPosTable2[0];
if (_updateLocationXPosTable2[0] > 500) {
- _spritesTable[2].flipX = 1;
+ _spritesTable[2]._flipX = true;
_updateLocationXPosTable2[0] = 500;
}
}
- _spritesTable[2].gfxBackgroundOffset = _updateLocationXPosTable2[0] + 8320;
+ _spritesTable[2]._gfxBackgroundOffset = _updateLocationXPosTable2[0] + 8320;
const int spr = 2;
- _spritesTable[spr].colorType = 1;
- _spritesTable[spr].yMaxBackground = 0;
+ _spritesTable[spr]._colorType = 1;
+ _spritesTable[spr]._yMaxBackground = 0;
drawSprite(spr);
- _spritesTable[spr].colorType = 0;
+ _spritesTable[spr]._colorType = 0;
}
void TuckerEngine::updateSprite_locationNum69_1(int i) {
@@ -2939,10 +2936,10 @@ void TuckerEngine::updateSprite_locationNum69_1(int i) {
} else if (_flagsTable[236] == 4) {
if (_charSpeechSoundCounter > 0 && _actionCharacterNum == i) {
state = 9;
- _spritesTable[i].needUpdate = 1;
+ _spritesTable[i]._needUpdate = true;
} else {
state = 14;
- _spritesTable[i].needUpdate = 0;
+ _spritesTable[i]._needUpdate = false;
}
} else if (_flagsTable[236] == 5) {
state = 7;
@@ -2950,7 +2947,7 @@ void TuckerEngine::updateSprite_locationNum69_1(int i) {
} else {
state = -1;
}
- _spritesTable[i].state = state;
+ _spritesTable[i]._state = state;
}
void TuckerEngine::updateSprite_locationNum69_2(int i) {
@@ -2966,10 +2963,10 @@ void TuckerEngine::updateSprite_locationNum69_2(int i) {
} else if (_flagsTable[237] == 4 || _flagsTable[237] == 2 || _flagsTable[237] == 3 || _flagsTable[237] == 7) {
if (_charSpeechSoundCounter > 0 && _actionCharacterNum == i) {
state = 10;
- _spritesTable[i].needUpdate = 1;
+ _spritesTable[i]._needUpdate = true;
} else {
state = 12;
- _spritesTable[i].needUpdate = 0;
+ _spritesTable[i]._needUpdate = false;
}
} else if (_flagsTable[237] == 5) {
state = 16;
@@ -2983,7 +2980,7 @@ void TuckerEngine::updateSprite_locationNum69_2(int i) {
} else {
state = -1;
}
- _spritesTable[i].state = state;
+ _spritesTable[i]._state = state;
}
void TuckerEngine::updateSprite_locationNum69_3(int i) {
@@ -2997,21 +2994,21 @@ void TuckerEngine::updateSprite_locationNum69_3(int i) {
_flagsTable[238] = 1;
if (_charSpeechSoundCounter > 0 && _actionCharacterNum == i) {
state = 11;
- _spritesTable[i].needUpdate = 1;
+ _spritesTable[i]._needUpdate = true;
} else {
state = 13;
- _spritesTable[i].needUpdate = 0;
+ _spritesTable[i]._needUpdate = false;
}
} else {
state = -1;
}
- _spritesTable[i].state = state;
+ _spritesTable[i]._state = state;
}
void TuckerEngine::execData3PreUpdate_locationNum70() {
const uint8 color = 103;
if (_execData3Counter == 0) {
- startSound(_locationSoundsTable[6].offset, 6, _locationSoundsTable[6].volume);
+ startSound(_locationSoundsTable[6]._offset, 6, _locationSoundsTable[6]._volume);
_execData3Counter = 1;
_flagsTable[143] = 0;
_updateLocation70StringLen = 0;
@@ -3041,7 +3038,7 @@ void TuckerEngine::execData3PreUpdate_locationNum70Helper() {
if (_lastKeyPressed == Common::KEYCODE_BACKSPACE || _lastKeyPressed == Common::KEYCODE_DELETE) {
if (_updateLocation70StringLen > 0) {
--_updateLocation70StringLen;
- startSound(_locationSoundsTable[0].offset, 0, _locationSoundsTable[0].volume);
+ startSound(_locationSoundsTable[0]._offset, 0, _locationSoundsTable[0]._volume);
}
} else if (_lastKeyPressed == Common::KEYCODE_RETURN) {
_flagsTable[143] = 1;
@@ -3052,7 +3049,7 @@ void TuckerEngine::execData3PreUpdate_locationNum70Helper() {
_flagsTable[143] = 2;
}
const int num = (_flagsTable[143] == 1) ? 4 : 5;
- startSound(_locationSoundsTable[num].offset, num, _locationSoundsTable[num].volume);
+ startSound(_locationSoundsTable[num]._offset, num, _locationSoundsTable[num]._volume);
} else if (_updateLocation70StringLen < 19) {
uint8 chr = 0;
switch (_lastKeyPressed) {
@@ -3089,7 +3086,7 @@ void TuckerEngine::execData3PreUpdate_locationNum70Helper() {
}
break;
}
- startSound(_locationSoundsTable[0].offset, 0, _locationSoundsTable[0].volume);
+ startSound(_locationSoundsTable[0]._offset, 0, _locationSoundsTable[0]._volume);
if (chr > 0) {
_updateLocation70String[_updateLocation70StringLen] = chr;
++_updateLocation70StringLen;
@@ -3104,17 +3101,17 @@ void TuckerEngine::updateSprite_locationNum71(int i) {
if (_flagsTable[155] != 6 || _flagsTable[207] == 1) {
state = -1;
} else if (_charSpeechSoundCounter > 0 && _actionCharacterNum == i) {
- _spritesTable[i].needUpdate = 1;
+ _spritesTable[i]._needUpdate = true;
state = 1;
} else if (getRandomNumber() < 30000) {
- _spritesTable[i].needUpdate = 0;
+ _spritesTable[i]._needUpdate = false;
state = 2;
- _spritesTable[i].updateDelay = 5;
+ _spritesTable[i]._updateDelay = 5;
} else {
- _spritesTable[i].needUpdate = 0;
+ _spritesTable[i]._needUpdate = false;
state = 2;
}
- _spritesTable[i].state = state;
+ _spritesTable[i]._state = state;
}
void TuckerEngine::updateSprite_locationNum72(int i) {
@@ -3122,28 +3119,28 @@ void TuckerEngine::updateSprite_locationNum72(int i) {
if (_flagsTable[155] == 7 || _flagsTable[207] == 1) {
state = -1;
} else if (_charSpeechSoundCounter > 0 && _actionCharacterNum == i) {
- _spritesTable[i].needUpdate = 1;
+ _spritesTable[i]._needUpdate = true;
state = 2;
} else {
- _spritesTable[i].needUpdate = 0;
+ _spritesTable[i]._needUpdate = false;
state = 1;
}
- _spritesTable[i].state = state;
+ _spritesTable[i]._state = state;
}
void TuckerEngine::updateSprite_locationNum74(int i) {
static const uint8 stateTable[] = { 1, 3, 5, 5, 10, 16, 16 };
int num = _flagsTable[236] - 74;
if (stateTable[num] + i == 21) {
- if (_updateLocationFlag == 0) {
- _updateLocationFlag = 1;
+ if (!_updateLocationFlag) {
+ _updateLocationFlag = true;
} else {
- _spritesTable[i].animationFrame = _spritesTable[i].firstFrame - 1;
- _spritesTable[i].updateDelay = 5;
- _updateSpriteFlag1 = 1;
+ _spritesTable[i]._animationFrame = _spritesTable[i]._firstFrame - 1;
+ _spritesTable[i]._updateDelay = 5;
+ _updateSpriteFlag1 = true;
}
}
- _spritesTable[i].state = stateTable[num] + i;
+ _spritesTable[i]._state = stateTable[num] + i;
}
void TuckerEngine::updateSprite_locationNum79(int i) {
@@ -3153,43 +3150,43 @@ void TuckerEngine::updateSprite_locationNum79(int i) {
_flagsTable[227] = 1;
} else if (_flagsTable[227] == 1 && _charSpeechSoundCounter > 0) {
state = 2;
- _spritesTable[i].needUpdate = 1;
+ _spritesTable[i]._needUpdate = true;
} else if (_flagsTable[227] == 2) {
state = 3;
_flagsTable[227] = 3;
- _spritesTable[i].needUpdate = 1;
+ _spritesTable[i]._needUpdate = true;
} else {
- _spritesTable[i].animationFrame = _spritesTable[i].firstFrame - 1;
- _spritesTable[i].updateDelay = 5;
- _updateSpriteFlag1 = 1;
+ _spritesTable[i]._animationFrame = _spritesTable[i]._firstFrame - 1;
+ _spritesTable[i]._updateDelay = 5;
+ _updateSpriteFlag1 = true;
state = 3;
}
- _spritesTable[i].state = state;
+ _spritesTable[i]._state = state;
}
void TuckerEngine::updateSprite_locationNum81_0(int i) {
int state;
if (_charSpeechSoundCounter > 0 && _actionCharacterNum == i) {
- _spritesTable[i].needUpdate = 1;
+ _spritesTable[i]._needUpdate = true;
state = 3;
_flagsTable[288] = 1;
} else if (_flagsTable[288] < 2) {
- _spritesTable[i].needUpdate = 0;
+ _spritesTable[i]._needUpdate = false;
state = 2;
if (_flagsTable[288] == 1) {
_flagsTable[288] = 2;
}
} else {
- _spritesTable[i].animationFrame = _spritesTable[i].firstFrame - 1;
- _spritesTable[i].updateDelay = 5;
- _updateSpriteFlag1 = 1;
+ _spritesTable[i]._animationFrame = _spritesTable[i]._firstFrame - 1;
+ _spritesTable[i]._updateDelay = 5;
+ _updateSpriteFlag1 = true;
state = 2;
}
- _spritesTable[i].state = state;
+ _spritesTable[i]._state = state;
}
void TuckerEngine::updateSprite_locationNum81_1(int i) {
- _spritesTable[i].state = 1;
+ _spritesTable[i]._state = 1;
}
void TuckerEngine::updateSprite_locationNum82(int i) {
@@ -3197,20 +3194,20 @@ void TuckerEngine::updateSprite_locationNum82(int i) {
if (_charSpeechSoundCounter > 0) {
state = 1;
_flagsTable[229] = 1;
- _spritesTable[i].needUpdate = 1;
+ _spritesTable[i]._needUpdate = true;
} else if (_flagsTable[229] == 0) {
state = 1;
} else if (_flagsTable[229] == 1) {
state = 2;
_flagsTable[229] = 2;
- _spritesTable[i].needUpdate = 0;
+ _spritesTable[i]._needUpdate = false;
} else {
- _spritesTable[i].animationFrame = _spritesTable[i].firstFrame - 1;
- _spritesTable[i].updateDelay = 5;
- _updateSpriteFlag1 = 1;
+ _spritesTable[i]._animationFrame = _spritesTable[i]._firstFrame - 1;
+ _spritesTable[i]._updateDelay = 5;
+ _updateSpriteFlag1 = true;
state = 2;
}
- _spritesTable[i].state = state;
+ _spritesTable[i]._state = state;
}
} // namespace Tucker
diff --git a/engines/tucker/resource.cpp b/engines/tucker/resource.cpp
index 1b04f3fae9..9cba7b523d 100644
--- a/engines/tucker/resource.cpp
+++ b/engines/tucker/resource.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -30,7 +30,8 @@
#include "audio/decoders/wave.h"
#include "graphics/surface.h"
-#include "graphics/decoders/pcx.h"
+
+#include "image/pcx.h"
#include "tucker/tucker.h"
#include "tucker/graphics.h"
@@ -126,7 +127,7 @@ public:
}
bool findNextToken(DataToken t) {
- const char *token = 0;
+ const char *token = nullptr;
switch (t) {
case kDataTokenDw:
token = "dw";
@@ -278,7 +279,7 @@ Audio::RewindableAudioStream *CompressedSound::load(CompressedSoundType type, in
void TuckerEngine::loadImage(const char *fname, uint8 *dst, int type) {
char filename[80];
- strcpy(filename, fname);
+ Common::strlcpy(filename, fname, sizeof(filename));
Common::File f;
if (!f.open(filename)) {
@@ -302,7 +303,7 @@ void TuckerEngine::loadImage(const char *fname, uint8 *dst, int type) {
}
}
- ::Graphics::PCXDecoder pcx;
+ Image::PCXDecoder pcx;
if (!pcx.loadStream(f))
error("Error while reading PCX image");
@@ -350,11 +351,11 @@ void TuckerEngine::loadCharset2() {
}
void TuckerEngine::loadCharsetHelper() {
- const int charW = Graphics::_charset.charW;
- const int charH = Graphics::_charset.charH;
+ const int charW = Graphics::_charset._charW;
+ const int charH = Graphics::_charset._charH;
int offset = 0;
- for (int y = 0; y < Graphics::_charset.yCount; ++y) {
- for (int x = 0; x < Graphics::_charset.xCount; ++x) {
+ for (int y = 0; y < Graphics::_charset._yCount; ++y) {
+ for (int x = 0; x < Graphics::_charset._xCount; ++x) {
offset += Graphics::encodeRAW(_loadTempBuf + (y * 320) * charH + x * charW, _charsetGfxBuf + offset, charW, charH);
}
}
@@ -407,8 +408,8 @@ void TuckerEngine::loadBudSpr(int startOffset) {
loadImage(filename.c_str(), _loadTempBuf, 0);
++frame;
}
- int sz = Graphics::encodeRLE(_loadTempBuf + _spriteFramesTable[i].sourceOffset, _spritesGfxBuf + spriteOffset, _spriteFramesTable[i].xSize, _spriteFramesTable[i].ySize);
- _spriteFramesTable[i].sourceOffset = spriteOffset;
+ int sz = Graphics::encodeRLE(_loadTempBuf + _spriteFramesTable[i]._sourceOffset, _spritesGfxBuf + spriteOffset, _spriteFramesTable[i]._xSize, _spriteFramesTable[i]._ySize);
+ _spriteFramesTable[i]._sourceOffset = spriteOffset;
spriteOffset += sz;
}
}
@@ -430,16 +431,16 @@ int TuckerEngine::loadCTable01(int index, int firstSpriteNum, int *framesCount)
}
const int y = t.getNextInteger();
SpriteFrame *c = &_spriteFramesTable[lastSpriteNum++];
- c->sourceOffset = y * 320 + x;
- c->xSize = t.getNextInteger();
- c->ySize = t.getNextInteger();
- c->xOffset = t.getNextInteger();
- if (c->xOffset > 300) {
- c->xOffset -= 500;
+ c->_sourceOffset = y * 320 + x;
+ c->_xSize = t.getNextInteger();
+ c->_ySize = t.getNextInteger();
+ c->_xOffset = t.getNextInteger();
+ if (c->_xOffset > 300) {
+ c->_xOffset -= 500;
}
- c->yOffset = t.getNextInteger();
- if (c->yOffset > 300) {
- c->yOffset -= 500;
+ c->_yOffset = t.getNextInteger();
+ if (c->_yOffset > 300) {
+ c->_yOffset -= 500;
}
}
}
@@ -454,17 +455,17 @@ void TuckerEngine::loadCTable02(int fl) {
loadFile("ctable02.c", _loadTempBuf);
DataTokenizer t(_loadTempBuf, _fileLoadSize);
while (t.findNextToken(kDataTokenDw)) {
- _spriteAnimationsTable[entry].numParts = t.getNextInteger();
- if (_spriteAnimationsTable[entry].numParts < 1) {
+ _spriteAnimationsTable[entry]._numParts = t.getNextInteger();
+ if (_spriteAnimationsTable[entry]._numParts < 1) {
return;
}
- _spriteAnimationsTable[entry].rotateFlag = t.getNextInteger();
+ _spriteAnimationsTable[entry]._rotateFlag = t.getNextInteger();
int num = t.getNextInteger();
if (num != fl) {
continue;
}
int start = 0;
- _spriteAnimationsTable[entry].firstFrameIndex = i;
+ _spriteAnimationsTable[entry]._firstFrameIndex = i;
while (start != 999) {
start = t.getNextInteger();
if (start == 9999) { // end marker in the demo version
@@ -534,7 +535,10 @@ void TuckerEngine::loadObj() {
return;
}
debug(2, "loadObj() partNum %d locationNum %d", _partNum, _locationNum);
- if ((_gameFlags & kGameFlagDemo) == 0) {
+ // If a savegame is loaded from the launcher, skip the display chapter
+ if (_startSlot != -1)
+ _startSlot = -1;
+ else if ((_gameFlags & kGameFlagDemo) == 0) {
handleNewPartSequence();
}
_currentPartNum = _partNum;
@@ -570,12 +574,12 @@ void TuckerEngine::loadData() {
const int x = t.getNextInteger();
const int y = t.getNextInteger();
Data *d = &_dataTable[_dataCount];
- d->sourceOffset = y * 320 + x;
- d->xSize = t.getNextInteger();
- d->ySize = t.getNextInteger();
- d->xDest = t.getNextInteger();
- d->yDest = t.getNextInteger();
- d->index = count;
+ d->_sourceOffset = y * 320 + x;
+ d->_xSize = t.getNextInteger();
+ d->_ySize = t.getNextInteger();
+ d->_xDest = t.getNextInteger();
+ d->_yDest = t.getNextInteger();
+ d->_index = count;
}
++objNum;
++count;
@@ -591,9 +595,9 @@ void TuckerEngine::loadData() {
int TuckerEngine::loadDataHelper(int offset, int index) {
for (int i = 0; i < _dataCount + 1; ++i) {
- if (_dataTable[i].index == index) {
- int sz = Graphics::encodeRLE(_loadTempBuf + _dataTable[i].sourceOffset, _data3GfxBuf + offset, _dataTable[i].xSize, _dataTable[i].ySize);
- _dataTable[i].sourceOffset = offset;
+ if (_dataTable[i]._index == index) {
+ int sz = Graphics::encodeRLE(_loadTempBuf + _dataTable[i]._sourceOffset, _data3GfxBuf + offset, _dataTable[i]._xSize, _dataTable[i]._ySize);
+ _dataTable[i]._sourceOffset = offset;
offset += sz;
}
}
@@ -625,7 +629,7 @@ void TuckerEngine::loadData3() {
}
assert(_locationAnimationsCount < kLocationAnimationsTableSize);
LocationAnimation *d = &_locationAnimationsTable[_locationAnimationsCount++];
- d->graphicNum = num;
+ d->_graphicNum = num;
const int seqNum = t.getNextInteger();
if (seqNum > 0) {
int anim = 0;
@@ -635,22 +639,22 @@ void TuckerEngine::loadData3() {
}
++anim;
}
- d->animCurrentCounter = d->animInitCounter = anim;
+ d->_animCurrentCounter = d->_animInitCounter = anim;
while (_staticData3Table[anim + 1] != 999) {
++anim;
}
- d->animLastCounter = anim;
+ d->_animLastCounter = anim;
} else {
- d->animLastCounter = 0;
+ d->_animLastCounter = 0;
}
- d->getFlag = t.getNextInteger();
- d->inventoryNum = t.getNextInteger();
- d->flagNum = t.getNextInteger();
- d->flagValue = t.getNextInteger();
- d->selectable = t.getNextInteger();
- d->standX = t.getNextInteger();
- d->standY = t.getNextInteger();
- d->drawFlag = 0;
+ d->_getFlag = t.getNextInteger();
+ d->_inventoryNum = t.getNextInteger();
+ d->_flagNum = t.getNextInteger();
+ d->_flagValue = t.getNextInteger();
+ d->_selectable = t.getNextInteger();
+ d->_standX = t.getNextInteger();
+ d->_standY = t.getNextInteger();
+ d->_drawFlag = false;
}
}
}
@@ -661,33 +665,31 @@ void TuckerEngine::loadData4() {
t.findNextToken(kDataTokenDw);
_gameDebug = t.getNextInteger() != 0;
_displayGameHints = t.getNextInteger() != 0;
- // forces game hints feature
-// _displayGameHints = true;
_locationObjectsCount = 0;
if (t.findIndex(_locationNum)) {
while (t.findNextToken(kDataTokenDw)) {
int i = t.getNextInteger();
- if (i < 0) {
+ if (i < 0)
break;
- }
+
assert(_locationObjectsCount < kLocationObjectsTableSize);
LocationObject *d = &_locationObjectsTable[_locationObjectsCount++];
- d->xPos = i;
- d->yPos = t.getNextInteger();
- d->xSize = t.getNextInteger();
- d->ySize = t.getNextInteger();
- d->standX = t.getNextInteger();
- d->standY = t.getNextInteger();
- d->textNum = t.getNextInteger();
- d->cursorNum = t.getNextInteger();
- d->locationNum = t.getNextInteger();
- if (d->locationNum > 0) {
- d->toX = t.getNextInteger();
- d->toY = t.getNextInteger();
- d->toX2 = t.getNextInteger();
- d->toY2 = t.getNextInteger();
- d->toWalkX2 = t.getNextInteger();
- d->toWalkY2 = t.getNextInteger();
+ d->_xPos = i;
+ d->_yPos = t.getNextInteger();
+ d->_xSize = t.getNextInteger();
+ d->_ySize = t.getNextInteger();
+ d->_standX = t.getNextInteger();
+ d->_standY = t.getNextInteger();
+ d->_textNum = t.getNextInteger();
+ d->_cursorNum = t.getNextInteger();
+ d->_locationNum = t.getNextInteger();
+ if (d->_locationNum > 0) {
+ d->_toX = t.getNextInteger();
+ d->_toY = t.getNextInteger();
+ d->_toX2 = t.getNextInteger();
+ d->_toY2 = t.getNextInteger();
+ d->_toWalkX2 = t.getNextInteger();
+ d->_toWalkY2 = t.getNextInteger();
}
}
}
@@ -725,20 +727,20 @@ void TuckerEngine::loadActionFile() {
int keyD = t.getNextInteger();
int keyE = t.getNextInteger();
Action *action = &_actionsTable[_actionsCount++];
- action->key = keyE * 1000000 + keyD * 100000 + keyA * 10000 + keyB * 1000 + keyC;
- action->testFlag1Num = t.getNextInteger();
- action->testFlag1Value = t.getNextInteger();
- action->testFlag2Num = t.getNextInteger();
- action->testFlag2Value = t.getNextInteger();
- action->speech = t.getNextInteger();
- action->flipX = t.getNextInteger();
- action->index = t.getNextInteger();
- action->delay = t.getNextInteger();
- action->setFlagNum = t.getNextInteger();
- assert(action->setFlagNum >= 0 && action->setFlagNum < kFlagsTableSize);
- action->setFlagValue = t.getNextInteger();
- action->fxNum = t.getNextInteger();
- action->fxDelay = t.getNextInteger();
+ action->_key = keyE * 1000000 + keyD * 100000 + keyA * 10000 + keyB * 1000 + keyC;
+ action->_testFlag1Num = t.getNextInteger();
+ action->_testFlag1Value = t.getNextInteger();
+ action->_testFlag2Num = t.getNextInteger();
+ action->_testFlag2Value = t.getNextInteger();
+ action->_speech = t.getNextInteger();
+ action->_flipX = t.getNextInteger();
+ action->_index = t.getNextInteger();
+ action->_delay = t.getNextInteger();
+ action->_setFlagNum = t.getNextInteger();
+ assert(action->_setFlagNum >= 0 && action->_setFlagNum < kFlagsTableSize);
+ action->_setFlagValue = t.getNextInteger();
+ action->_fxNum = t.getNextInteger();
+ action->_fxDelay = t.getNextInteger();
}
}
}
@@ -755,17 +757,17 @@ void TuckerEngine::loadCharPos() {
}
assert(_charPosCount < 4);
CharPos *charPos = &_charPosTable[_charPosCount++];
- charPos->xPos = i;
- charPos->yPos = t.getNextInteger();
- charPos->xSize = t.getNextInteger();
- charPos->ySize = t.getNextInteger();
- charPos->xWalkTo = t.getNextInteger();
- charPos->yWalkTo = t.getNextInteger();
- charPos->flagNum = t.getNextInteger();
- charPos->flagValue = t.getNextInteger();
- charPos->direction = t.getNextInteger();
- charPos->name = t.getNextInteger();
- charPos->description = t.getNextInteger();
+ charPos->_xPos = i;
+ charPos->_yPos = t.getNextInteger();
+ charPos->_xSize = t.getNextInteger();
+ charPos->_ySize = t.getNextInteger();
+ charPos->_xWalkTo = t.getNextInteger();
+ charPos->_yWalkTo = t.getNextInteger();
+ charPos->_flagNum = t.getNextInteger();
+ charPos->_flagValue = t.getNextInteger();
+ charPos->_direction = t.getNextInteger();
+ charPos->_name = t.getNextInteger();
+ charPos->_description = t.getNextInteger();
}
int quitLoop = 0;
size_t count = 0;
@@ -818,9 +820,9 @@ void TuckerEngine::loadSprA02_01() {
void TuckerEngine::unloadSprA02_01() {
for (int i = 1; i < kSprA02TableSize; ++i) {
free(_sprA02Table[i]);
- _sprA02Table[i] = 0;
+ _sprA02Table[i] = nullptr;
}
- _sprA02Table[0] = 0;
+ _sprA02Table[0] = nullptr;
}
void TuckerEngine::loadSprC02_01() {
@@ -834,76 +836,79 @@ void TuckerEngine::loadSprC02_01() {
_spritesCount = _sprC02LookupTable2[_locationNum];
for (int i = 0; i < kMaxCharacters; ++i) {
memset(&_spritesTable[i], 0, sizeof(Sprite));
- _spritesTable[i].state = -1;
- _spritesTable[i].stateIndex = -1;
+ _spritesTable[i]._state = -1;
+ _spritesTable[i]._stateIndex = -1;
}
}
void TuckerEngine::unloadSprC02_01() {
for (int i = 1; i < kSprC02TableSize; ++i) {
free(_sprC02Table[i]);
- _sprC02Table[i] = 0;
+ _sprC02Table[i] = nullptr;
}
- _sprC02Table[0] = 0;
+ _sprC02Table[0] = nullptr;
}
void TuckerEngine::loadFx() {
loadFile("fx.c", _loadTempBuf);
DataTokenizer t(_loadTempBuf, _fileLoadSize);
- t.findIndex(_locationNum);
- t.findNextToken(kDataTokenDw);
- _locationSoundsCount = t.getNextInteger();
- _currentFxSet = 0;
- for (int i = 0; i < _locationSoundsCount; ++i) {
- LocationSound *s = &_locationSoundsTable[i];
- s->offset = 0;
- s->num = t.getNextInteger();
- s->volume = t.getNextInteger();
- s->type = t.getNextInteger();
- switch (s->type) {
- case 5:
- _currentFxSet = 1;
- _currentFxIndex = i;
- _currentFxVolume = s->volume;
- _currentFxDist = t.getNextInteger();
- _currentFxScale = t.getNextInteger();
- break;
- case 6:
- case 7:
- case 8:
- s->startFxSpriteState = t.getNextInteger();
- s->startFxSpriteNum = t.getNextInteger();
- s->updateType = t.getNextInteger();
- if (s->type == 7) {
- s->flagNum = t.getNextInteger();
- s->flagValueStartFx = t.getNextInteger();
- s->stopFxSpriteState = t.getNextInteger();
- s->stopFxSpriteNum = t.getNextInteger();
- s->flagValueStopFx = t.getNextInteger();
+ if (t.findIndex(_locationNum)) {
+ t.findNextToken(kDataTokenDw);
+ _locationSoundsCount = t.getNextInteger();
+ _currentFxSet = 0;
+ for (int i = 0; i < _locationSoundsCount; ++i) {
+ LocationSound *s = &_locationSoundsTable[i];
+ s->_offset = 0;
+ s->_num = t.getNextInteger();
+ s->_volume = t.getNextInteger();
+ s->_type = t.getNextInteger();
+ switch (s->_type) {
+ case 5:
+ _currentFxSet = 1;
+ _currentFxIndex = i;
+ _currentFxVolume = s->_volume;
+ _currentFxDist = t.getNextInteger();
+ _currentFxScale = t.getNextInteger();
+ break;
+ case 6:
+ case 7:
+ case 8:
+ s->_startFxSpriteState = t.getNextInteger();
+ s->_startFxSpriteNum = t.getNextInteger();
+ s->_updateType = t.getNextInteger();
+ if (s->_type == 7) {
+ s->_flagNum = t.getNextInteger();
+ s->_flagValueStartFx = t.getNextInteger();
+ s->_stopFxSpriteState = t.getNextInteger();
+ s->_stopFxSpriteNum = t.getNextInteger();
+ s->_flagValueStopFx = t.getNextInteger();
+ }
+ break;
+ }
+ if (s->_type == 8) {
+ s->_type = 6;
}
- break;
- }
- if (s->type == 8) {
- s->type = 6;
}
- }
- t.findNextToken(kDataTokenDw);
- int count = t.getNextInteger();
- _locationMusicsCount = 0;
- for (int i = 0; i < count; ++i) {
- int flagNum = t.getNextInteger();
- int flagValue = t.getNextInteger();
- if (flagValue == _flagsTable[flagNum]) {
- LocationMusic *m = &_locationMusicsTable[_locationMusicsCount++];
- m->offset = 0;
- m->num = t.getNextInteger();
- m->volume = t.getNextInteger();
- m->flag = t.getNextInteger();
- } else {
- for (int j = 0; j < 3; ++j) {
- t.getNextInteger();
+ t.findNextToken(kDataTokenDw);
+ int count = t.getNextInteger();
+ _locationMusicsCount = 0;
+ for (int i = 0; i < count; ++i) {
+ int flagNum = t.getNextInteger();
+ int flagValue = t.getNextInteger();
+ if (flagValue == _flagsTable[flagNum]) {
+ LocationMusic *m = &_locationMusicsTable[_locationMusicsCount++];
+ m->_offset = 0;
+ m->_num = t.getNextInteger();
+ m->_volume = t.getNextInteger();
+ m->_flag = t.getNextInteger();
+ } else {
+ for (int j = 0; j < 3; ++j) {
+ t.getNextInteger();
+ }
}
}
+ } else {
+ error("loadFx() - Index not found for location %d", _locationNum);
}
}
@@ -923,7 +928,7 @@ void TuckerEngine::loadSound(Audio::Mixer::SoundType type, int num, int volume,
return;
}
if (!stream) {
- const char *fmt = 0;
+ const char *fmt = nullptr;
switch (type) {
case Audio::Mixer::kSFXSoundType:
fmt = "fx/fx%d.wav";
@@ -1004,7 +1009,7 @@ void TuckerEngine::loadActionsTable() {
}
}
} else {
- if (_spritesTable[_csDataTableCount - 1].firstFrame - 1 != _spritesTable[_csDataTableCount - 1].animationFrame) {
+ if (_spritesTable[_csDataTableCount - 1]._firstFrame - 1 != _spritesTable[_csDataTableCount - 1]._animationFrame) {
break;
}
}
@@ -1030,7 +1035,7 @@ void TuckerEngine::loadActionsTable() {
_panelState = 0;
setCursorType(0);
_csDataHandled = false;
- _actionVerbLocked = 0;
+ _actionVerbLocked = false;
_mouseClick = 1;
}
}
diff --git a/engines/tucker/saveload.cpp b/engines/tucker/saveload.cpp
index 5133bc15e8..92da2d4d9b 100644
--- a/engines/tucker/saveload.cpp
+++ b/engines/tucker/saveload.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -64,8 +64,8 @@ void TuckerEngine::saveOrLoadGameStateData(S &s) {
saveOrLoadInt(s, _panelObjectsOffsetTable[i]);
}
saveOrLoadInt(s, _mainSpritesBaseOffset);
- saveOrLoadInt(s, _selectedObject.xPos);
- saveOrLoadInt(s, _selectedObject.yPos);
+ saveOrLoadInt(s, _selectedObject._xPos);
+ saveOrLoadInt(s, _selectedObject._yPos);
saveOrLoadInt(s, _locationNum);
saveOrLoadInt(s, _xPosCurrent);
saveOrLoadInt(s, _yPosCurrent);
diff --git a/engines/tucker/sequences.cpp b/engines/tucker/sequences.cpp
index bd03eed00b..d9f284e443 100644
--- a/engines/tucker/sequences.cpp
+++ b/engines/tucker/sequences.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -40,7 +40,7 @@ void TuckerEngine::handleIntroSequence() {
_player = new AnimationSequencePlayer(_system, _mixer, _eventMan, &_compressedSound, firstSequence);
_player->mainLoop();
delete _player;
- _player = 0;
+ _player = nullptr;
}
void TuckerEngine::handleCreditsSequence() {
@@ -115,7 +115,8 @@ void TuckerEngine::handleCreditsSequence() {
if (counter4 == _creditsSequenceTimecounts[num]) {
_fadePaletteCounter = 0;
clearSprites();
- ++num;
+ if (num < 6)
+ ++num;
Common::String filename;
if (num == 6) {
for (int i = 0; i < 16; ++i) {
@@ -123,6 +124,7 @@ void TuckerEngine::handleCreditsSequence() {
loadImage(filename.c_str(), imgBuf + i * 64000, 2);
}
} else {
+ filename = "";
switch (num) {
case 1:
filename = "loc75.pcx";
@@ -140,7 +142,8 @@ void TuckerEngine::handleCreditsSequence() {
filename = "loc78.pcx";
break;
}
- loadImage(filename.c_str(), _quadBackgroundGfxBuf, 2);
+ if (filename != "")
+ loadImage(filename.c_str(), _quadBackgroundGfxBuf, 2);
}
_spritesCount = _creditsSequenceSpriteCounts[num];
++_flagsTable[236];
@@ -306,7 +309,7 @@ void TuckerEngine::handleMeanwhileSequence() {
void TuckerEngine::handleMapSequence() {
loadImage("map2.pcx", _quadBackgroundGfxBuf + 89600, 0);
loadImage("map1.pcx", _loadTempBuf, 1);
- _selectedObject.locationObject_locationNum = 0;
+ _selectedObject._locationObjectLocationNum = 0;
if (_flagsTable[7] > 0) {
copyMapRect(0, 0, 140, 86);
}
@@ -419,7 +422,7 @@ void TuckerEngine::copyMapRect(int x, int y, int w, int h) {
}
}
-int TuckerEngine::handleSpecialObjectSelectionSequence() {
+bool TuckerEngine::handleSpecialObjectSelectionSequence() {
char filename[40];
if (_partNum == 1 && _selectedObjectNum == 6) {
strcpy(filename, "news1.pcx");
@@ -436,7 +439,7 @@ int TuckerEngine::handleSpecialObjectSelectionSequence() {
} else if (_currentInfoString1SourceType == 1 && _currentActionObj1Num == 91) {
strcpy(filename, "memo.pcx");
} else {
- return 0;
+ return false;
}
while (_fadePaletteCounter > 0) {
fadeInPalette();
@@ -460,10 +463,10 @@ int TuckerEngine::handleSpecialObjectSelectionSequence() {
}
if (_partNum == 3 && _selectedObjectNum == 45) {
for (int i = 0; i < 13; ++i) {
- const int offset = _dataTable[204 + i].yDest * 640 + _dataTable[204 + i].xDest;
+ const int offset = _dataTable[204 + i]._yDest * 640 + _dataTable[204 + i]._xDest;
static const int itemsTable[] = { 15, 44, 25, 19, 21, 24, 12, 27, 20, 29, 35, 23, 3 };
if (_inventoryItemsState[itemsTable[i]] > 1) {
- Graphics::decodeRLE(_locationBackgroundGfxBuf + _scrollOffset + offset, _data3GfxBuf + _dataTable[204 + i].sourceOffset, _dataTable[204 + i].xSize, _dataTable[204 + i].ySize);
+ Graphics::decodeRLE(_locationBackgroundGfxBuf + _scrollOffset + offset, _data3GfxBuf + _dataTable[204 + i]._sourceOffset, _dataTable[204 + i]._xSize, _dataTable[204 + i]._ySize);
}
}
}
@@ -479,7 +482,7 @@ int TuckerEngine::handleSpecialObjectSelectionSequence() {
}
}
loadLoc();
- return 1;
+ return true;
}
AnimationSequencePlayer::AnimationSequencePlayer(OSystem *system, Audio::Mixer *mixer, Common::EventManager *event, CompressedSound *sound, int num)
@@ -487,11 +490,20 @@ AnimationSequencePlayer::AnimationSequencePlayer(OSystem *system, Audio::Mixer *
memset(_animationPalette, 0, sizeof(_animationPalette));
_soundSeqDataCount = 0;
_soundSeqDataIndex = 0;
- _soundSeqData = 0;
+ _soundSeqData = nullptr;
_offscreenBuffer = (uint8 *)malloc(kScreenWidth * kScreenHeight);
_updateScreenWidth = 0;
_updateScreenPicture = false;
- _picBufPtr = _pic2BufPtr = 0;
+ _picBufPtr = _pic2BufPtr = nullptr;
+
+ _changeToNextSequence = false;
+ _updateFunc = nullptr;
+ _updateFuncIndex = 0;
+ _updateScreenCounter = 0;
+ _updateScreenIndex = -1;
+ _frameCounter = 0;
+ _frameTime = 0;
+ _lastFrameTime = 1;
}
AnimationSequencePlayer::~AnimationSequencePlayer() {
@@ -722,13 +734,12 @@ void AnimationSequencePlayer::fadeOutPalette() {
void AnimationSequencePlayer::unloadAnimation() {
_mixer->stopAll();
free(_picBufPtr);
- _picBufPtr = 0;
free(_pic2BufPtr);
- _pic2BufPtr = 0;
+ _picBufPtr = _pic2BufPtr = nullptr;
}
uint8 *AnimationSequencePlayer::loadPicture(const char *fileName) {
- uint8 *p = 0;
+ uint8 *p = nullptr;
Common::File f;
if (f.open(fileName)) {
const int sz = f.size();
diff --git a/engines/tucker/staticres.cpp b/engines/tucker/staticres.cpp
index 388f5ba05c..b884851d7e 100644
--- a/engines/tucker/staticres.cpp
+++ b/engines/tucker/staticres.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/tucker/tucker.cpp b/engines/tucker/tucker.cpp
index 04e83efbe5..de555cd7b6 100644
--- a/engines/tucker/tucker.cpp
+++ b/engines/tucker/tucker.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -43,6 +43,34 @@ namespace Tucker {
TuckerEngine::TuckerEngine(OSystem *system, Common::Language language, uint32 flags)
: Engine(system), _gameLang(language), _gameFlags(flags), _rnd("tucker") {
_console = new TuckerConsole(this);
+
+ resetVariables();
+
+ _execData3Counter = 0;
+ _currentSaveLoadGameState = 1;
+ _fileLoadSize = 0;
+ _csDataSize = 0;
+ _startSlot = ConfMan.hasKey("save_slot") ? ConfMan.getInt("save_slot") : -1;
+
+ _player = nullptr;
+ _loadTempBuf = nullptr;
+ _cursorGfxBuf = nullptr;
+ _charsetGfxBuf = nullptr;
+ _panelGfxBuf = nullptr;
+ _itemsGfxBuf = nullptr;
+ _spritesGfxBuf = nullptr;
+ _locationBackgroundGfxBuf = nullptr;
+ _data5Buf = nullptr;
+ _data3GfxBuf = nullptr;
+ _quadBackgroundGfxBuf = nullptr;
+ _objTxtBuf = nullptr;
+ _panelObjectsGfxBuf = nullptr;
+ _ptTextBuf = nullptr;
+ _infoBarBuf = nullptr;
+ _bgTextBuf = nullptr;
+ _charNameBuf = nullptr;
+ _locationBackgroundMaskBuf = nullptr;
+ _csDataBuf = nullptr;
}
TuckerEngine::~TuckerEngine() {
@@ -64,7 +92,8 @@ Common::Error TuckerEngine::run() {
initGraphics(kScreenWidth, kScreenHeight, false);
syncSoundSettings();
_compressedSound.openFile();
- handleIntroSequence();
+ if (_startSlot == -1)
+ handleIntroSequence();
if ((_gameFlags & kGameFlagIntroOnly) == 0 && !shouldQuit()) {
mainLoop();
}
@@ -84,17 +113,17 @@ void TuckerEngine::allocateBuffers() {
_charsetGfxBuf = (uint8 *)calloc(1, 22400);
_cursorGfxBuf = (uint8 *)calloc(1, 256 * 7);
_infoBarBuf = (uint8 *)calloc(1, 1000);
- _charNameBuf = 0;
- _bgTextBuf = 0;
- _objTxtBuf = 0;
+ _charNameBuf = nullptr;
+ _bgTextBuf = nullptr;
+ _objTxtBuf = nullptr;
_panelObjectsGfxBuf = (uint8 *)calloc(1, 20000);
- _data5Buf = 0;
+ _data5Buf = nullptr;
_data3GfxBuf = (uint8 *)calloc(1, 250000);
_quadBackgroundGfxBuf = (uint8 *)calloc(1, 320 * 140 * 4);
_locationBackgroundMaskBuf = (uint8 *)calloc(1, 640 * 140);
- _csDataBuf = 0;
+ _csDataBuf = nullptr;
_spritesGfxBuf = (uint8 *)calloc(1, 160000);
- _ptTextBuf = 0;
+ _ptTextBuf = nullptr;
memset(_charWidthTable, 0, sizeof(_charWidthTable));
}
@@ -119,7 +148,7 @@ void TuckerEngine::freeBuffers() {
free(_ptTextBuf);
}
-void TuckerEngine::restart() {
+void TuckerEngine::resetVariables() {
_quitGame = false;
_fastMode = false;
_syncCounter = 0;
@@ -131,15 +160,16 @@ void TuckerEngine::restart() {
_nextLocationNum = (_gameFlags & kGameFlagDemo) == 0 ? kStartupLocationGame : kStartupLocationDemo;
_gamePaused = false;
_gameDebug = false;
- _displayGameHints = false;
_displaySpeechText = (_gameFlags & kGameFlagNoSubtitles) == 0 ? ConfMan.getBool("subtitles") : false;
memset(_flagsTable, 0, sizeof(_flagsTable));
_gameHintsIndex = 0;
_gameHintsCounter = 0;
- _gameHintsDisplayText = 0;
_gameHintsStringNum = 0;
+ _displayGameHints = false;
+ _displayHintsText = false;
+
if ((_gameFlags & kGameFlagDemo) == 0) {
_locationWidthTable = _locationWidthTableGame;
_locationHeightTable = _locationHeightTableGame;
@@ -189,7 +219,7 @@ void TuckerEngine::restart() {
_switchPanelCounter = 0;
_conversationOptionsCount = 0;
_fadedPanel = false;
- _panelLockedFlag = 0;
+ _panelLockedFlag = false;
_conversationOptionLinesCount = 0;
memset(_inventoryItemsState, 0, sizeof(_inventoryItemsState));
memset(_inventoryObjectsList, 0, sizeof(_inventoryObjectsList));
@@ -223,11 +253,11 @@ void TuckerEngine::restart() {
_selectedCharacterNum = 0;
_actionObj1Type = _actionObj2Type = 0;
_actionObj1Num = _actionObj2Num = 0;
- _actionRequiresTwoObjects = 0;
- _actionVerbLocked = 0;
+ _actionRequiresTwoObjects = false;
+ _actionVerbLocked = false;
_actionPosX = 0;
_actionPosY = 0;
- _selectedObjectLocationMask = 0;
+ _selectedObjectLocationMask = false;
memset(&_selectedObject, 0, sizeof(_selectedObject));
_selectedCharacterDirection = 0;
_selectedCharacter2Num = 0;
@@ -247,10 +277,10 @@ void TuckerEngine::restart() {
_nextTableToLoadIndex = 0;
memset(_nextTableToLoadTable, 0, sizeof(_nextTableToLoadTable));
_soundInstructionIndex = 0;
- _tableInstructionsPtr = 0;
+ _tableInstructionsPtr = nullptr;
memset(_tableInstructionObj1Table, 0, sizeof(_tableInstructionObj1Table));
memset(_tableInstructionObj2Table, 0, sizeof(_tableInstructionObj2Table));
- _tableInstructionFlag = 0;
+ _tableInstructionFlag = false;
_tableInstructionItemNum1 = _tableInstructionItemNum2 = 0;
memset(_instructionsActionsTable, 0, sizeof(_instructionsActionsTable));
_validInstructionId = false;
@@ -266,7 +296,7 @@ void TuckerEngine::restart() {
_skipCurrentCharacterDraw = false;
_yPosCurrent = 131;
_xPosCurrent = 160;
- _characterSpeechDataPtr = 0;
+ _characterSpeechDataPtr = nullptr;
_ptTextOffset = 0;
memset(_characterAnimationsTable, 0, sizeof(_characterAnimationsTable));
memset(_characterStateTable, 0, sizeof(_characterStateTable));
@@ -279,26 +309,26 @@ void TuckerEngine::restart() {
_currentSpriteAnimationFrame2 = 0;
_characterAnimationIndex = -1;
_characterFacingDirection = _characterPrevFacingDirection = 0;
- _characterBackFrontFacing = _characterPrevBackFrontFacing = 0;
+ _characterBackFrontFacing = _characterPrevBackFrontFacing = false;
_characterAnimationNum = 0;
_noCharacterAnimationChange = 0;
- _changeBackgroundSprite = 0;
_characterSpriteAnimationFrameCounter = 0;
- _locationMaskIgnore = 0;
+ _locationMaskIgnore = false;
_locationMaskType = 0;
_locationMaskCounter = 0;
- _updateSpriteFlag1 = 0;
- _updateSpriteFlag2 = 0;
_handleMapCounter = 0;
_noPositionChangeAfterMap = false;
+ _changeBackgroundSprite = false;
+ _updateSpriteFlag1 = false;
+ _updateSpriteFlag2 = false;
- _mirroredDrawing = 0;
- _loadLocBufPtr = 0;
- _backgroundSpriteDataPtr = 0;
+ _mirroredDrawing = false;
+ _loadLocBufPtr = nullptr;
+ _backgroundSpriteDataPtr = nullptr;
_locationHeight = 0;
_scrollOffset = 0;
_currentGfxBackgroundCounter = 0;
- _currentGfxBackground = 0;
+ _currentGfxBackground = nullptr;
_fadePaletteCounter = 0;
memset(_currentPalette, 0, sizeof(_currentPalette));
_fullRedraw = false;
@@ -319,14 +349,14 @@ void TuckerEngine::restart() {
memset(_updateLocation14ObjNum, 0, sizeof(_updateLocation14ObjNum));
memset(_updateLocation14Delay, 0, sizeof(_updateLocation14Delay));
_updateLocationCounter2 = 0;
- _updateLocationFlag = 0;
+ _updateLocationFlag = false;
_updateLocation70StringLen = 0;
memset(_updateLocation70String, 0, sizeof(_updateLocation70String));
}
void TuckerEngine::mainLoop() {
allocateBuffers();
- restart();
+ resetVariables();
loadCharSizeDta();
if ((_gameFlags & kGameFlagDemo) != 0) {
@@ -352,7 +382,7 @@ void TuckerEngine::mainLoop() {
_flagsTable[219] = 1;
_flagsTable[105] = 1;
- _spriteAnimationFrameIndex = _spriteAnimationsTable[14].firstFrameIndex;
+ _spriteAnimationFrameIndex = _spriteAnimationsTable[14]._firstFrameIndex;
if (ConfMan.hasKey("save_slot")) {
const int slot = ConfMan.getInt("save_slot");
@@ -412,7 +442,7 @@ void TuckerEngine::mainLoop() {
}
if (_flagsTable[158] == 1) {
_flagsTable[158] = 0;
- _skipCurrentCharacterDraw = 1;
+ _skipCurrentCharacterDraw = true;
}
_mainLoopCounter1 = 0;
}
@@ -440,7 +470,7 @@ void TuckerEngine::mainLoop() {
updateGameHints();
}
if (_panelState == 0) {
- if (_panelLockedFlag == 1 || _pendingActionDelay > 0) {
+ if (_panelLockedFlag || _pendingActionDelay > 0) {
if (!_fadedPanel) {
updateItemsGfxColors(0x60, 0x80);
_fadedPanel = true;
@@ -450,7 +480,7 @@ void TuckerEngine::mainLoop() {
clearItemsGfx();
if (_gamePaused) {
drawPausedInfoBar();
- } else if (_gameHintsDisplayText == 1 && _mouseIdleCounter > 1000) {
+ } else if (_displayHintsText && _mouseIdleCounter > 1000) {
drawGameHintString();
} else {
drawInfoString();
@@ -466,10 +496,10 @@ void TuckerEngine::mainLoop() {
}
_currentGfxBackground = _quadBackgroundGfxBuf + (_currentGfxBackgroundCounter / 10) * 44800;
if (_fadePaletteCounter < 34 && _locationNum == 22) {
- _spritesTable[0].gfxBackgroundOffset = (_currentGfxBackgroundCounter / 10) * 640;
+ _spritesTable[0]._gfxBackgroundOffset = (_currentGfxBackgroundCounter / 10) * 640;
_mainSpritesBaseOffset = _currentGfxBackgroundCounter / 10;
if (_locationNum == 22 && _currentGfxBackgroundCounter <= 29) {
- _spritesTable[0].gfxBackgroundOffset = 640;
+ _spritesTable[0]._gfxBackgroundOffset = 640;
_mainSpritesBaseOffset = 1;
}
}
@@ -489,11 +519,11 @@ void TuckerEngine::mainLoop() {
drawData3();
execData3PreUpdate();
for (int i = 0; i < _spritesCount; ++i) {
- if (!_spritesTable[i].disabled) {
+ if (!_spritesTable[i]._disabled) {
drawSprite(i);
}
}
- if (_skipCurrentCharacterDraw != 1) {
+ if (!_skipCurrentCharacterDraw) {
if (_backgroundSpriteCurrentAnimation > -1 && _backgroundSpriteCurrentFrame > 0) {
drawBackgroundSprites();
} else {
@@ -522,7 +552,7 @@ void TuckerEngine::mainLoop() {
--_miscSoundFxDelayCounter[num];
if (_miscSoundFxDelayCounter[num] == 0) {
const int index = _miscSoundFxNum[num];
- startSound(_locationSoundsTable[index].offset, index, _locationSoundsTable[index].volume);
+ startSound(_locationSoundsTable[index]._offset, index, _locationSoundsTable[index]._volume);
}
}
}
@@ -565,7 +595,7 @@ void TuckerEngine::mainLoop() {
}
if (_inputKeys[kInputKeyHelp]) {
_inputKeys[kInputKeyHelp] = false;
- if (_displayGameHints && _gameHintsDisplayText == 1) {
+ if (_displayGameHints && _displayHintsText) {
_gameHintsStringNum = _gameHintsIndex + 1;
_mouseIdleCounter = 1100;
}
@@ -576,6 +606,7 @@ void TuckerEngine::mainLoop() {
_flagsTable[236] = 74;
}
}
+
if (_flagsTable[236] > 70) {
handleCreditsSequence();
_quitGame = true;
@@ -689,14 +720,14 @@ void TuckerEngine::setupNewLocation() {
_mainLoopCounter2 = 0;
_mainLoopCounter1 = 0;
_characterFacingDirection = 0;
- _actionVerbLocked = 0;
- _locationMaskIgnore = 0;
+ _actionVerbLocked = false;
+ _locationMaskIgnore = false;
_backgroundSprOffset = 0;
if (_backgroundSpriteCurrentAnimation > 0 && _backgroundSpriteCurrentFrame > 0) {
_backgroundSpriteCurrentAnimation = -1;
_backgroundSpriteCurrentFrame = 0;
}
- if (_panelLockedFlag == 0 || (_backgroundSpriteCurrentAnimation > 0 && _locationNum != 25)) {
+ if (!_panelLockedFlag || (_backgroundSpriteCurrentAnimation > 0 && _locationNum != 25)) {
_locationMaskType = 0;
} else {
_locationMaskType = 3;
@@ -829,8 +860,8 @@ void TuckerEngine::updateCharPosition() {
updateCharPositionHelper();
return;
case 1:
- if (_locationAnimationsTable[_selectedCharacter2Num].getFlag == 1) {
- _speechSoundNum = _speechSoundBaseNum + _locationAnimationsTable[_selectedCharacter2Num].inventoryNum;
+ if (_locationAnimationsTable[_selectedCharacter2Num]._getFlag == 1) {
+ _speechSoundNum = _speechSoundBaseNum + _locationAnimationsTable[_selectedCharacter2Num]._inventoryNum;
_characterSpeechDataPtr = _ptTextBuf;
updateCharPositionHelper();
return;
@@ -842,8 +873,8 @@ void TuckerEngine::updateCharPosition() {
break;
case 2:
_characterSpeechDataPtr = _ptTextBuf;
- _speechSoundNum = 2175 + _charPosTable[_selectedCharacterNum].description;
- if (_charPosTable[_selectedCharacterNum].description != 0) {
+ _speechSoundNum = 2175 + _charPosTable[_selectedCharacterNum]._description;
+ if (_charPosTable[_selectedCharacterNum]._description != 0) {
updateCharPositionHelper();
return;
}
@@ -852,59 +883,61 @@ void TuckerEngine::updateCharPosition() {
}
int actionKey = _currentActionObj2Num * 1000000 + _currentInfoString2SourceType * 100000 + _currentActionVerb * 10000 + _currentInfoString1SourceType * 1000 + _currentActionObj1Num;
debug(3, "updateCharPosition() actionKey %d", actionKey);
- int skip = 0;
- Action *action = 0;
- for (int i = 0; i < _actionsCount && skip == 0; ++i) {
+ bool skip = false;
+ Action *action = nullptr;
+ for (int i = 0; i < _actionsCount && !skip; ++i) {
action = &_actionsTable[i];
- if (action->key == actionKey) {
- skip = 1;
- if (action->testFlag1Num != 0) {
- if (action->testFlag1Num < 500) {
- if (_flagsTable[action->testFlag1Num] != action->testFlag1Value) {
- skip = 0;
- }
- } else if (_inventoryItemsState[action->testFlag1Num - 500] != action->testFlag1Value) {
- skip = 0;
+ if (action->_key == actionKey) {
+ skip = true;
+ if (action->_testFlag1Num != 0) {
+ if (action->_testFlag1Num < 500) {
+ if (action->_testFlag1Num >= 300)
+ error("updateCharPosition() - Unexpected value for _testFlag1Num : %d", action->_testFlag1Num);
+ if (_flagsTable[action->_testFlag1Num] != action->_testFlag1Value)
+ skip = false;
+ } else if (_inventoryItemsState[action->_testFlag1Num - 500] != action->_testFlag1Value) {
+ skip = false;
}
- debug(3, "updateCharPosition() flag1 %d value %d", action->testFlag1Num, action->testFlag1Value);
- }
- if (action->testFlag2Num != 0) {
- if (action->testFlag2Num < 500) {
- if (_flagsTable[action->testFlag2Num] != action->testFlag2Value) {
- skip = 0;
- }
- } else if (_inventoryItemsState[action->testFlag2Num - 500] != action->testFlag2Value) {
- skip = 0;
+ debug(3, "updateCharPosition() flag1 %d value %d", action->_testFlag1Num, action->_testFlag1Value);
+ }
+ if (action->_testFlag2Num != 0) {
+ if (action->_testFlag2Num < 500) {
+ if (action->_testFlag2Num >= 300)
+ error("updateCharPosition() - Unexpected value for _testFlag1Num : %d", action->_testFlag1Num);
+ if (_flagsTable[action->_testFlag2Num] != action->_testFlag2Value)
+ skip = false;
+ } else if (_inventoryItemsState[action->_testFlag2Num - 500] != action->_testFlag2Value) {
+ skip = false;
}
- debug(3, "updateCharPosition() flag2 %d value %d", action->testFlag2Num, action->testFlag2Value);
+ debug(3, "updateCharPosition() flag2 %d value %d", action->_testFlag2Num, action->_testFlag2Value);
}
}
}
- if (skip == 0) {
+ if (!skip) {
playSpeechForAction(_currentActionVerb);
_currentActionVerb = 0;
return;
}
assert(action);
- if (action->speech != 6) {
- if (action->speech < 100) {
- _spriteAnimationFrameIndex = _spriteAnimationsTable[action->speech].firstFrameIndex;
- _currentSpriteAnimationLength = _spriteAnimationsTable[action->speech].numParts;
- _mirroredDrawing = action->flipX;
+ if (action->_speech != 6) {
+ if (action->_speech < 100) {
+ _spriteAnimationFrameIndex = _spriteAnimationsTable[action->_speech]._firstFrameIndex;
+ _currentSpriteAnimationLength = _spriteAnimationsTable[action->_speech]._numParts;
+ _mirroredDrawing = (action->_flipX != 0);
_characterFacingDirection = 5;
_mainLoopCounter2 = 0;
} else {
- _backgroundSpriteCurrentAnimation = action->speech - 100;
+ _backgroundSpriteCurrentAnimation = action->_speech - 100;
_backgroundSpriteCurrentFrame = 0;
- _mirroredDrawing = 0;
+ _mirroredDrawing = false;
}
}
- _pendingActionDelay = action->delay;
- _charPositionFlagNum = action->setFlagNum;
- _charPositionFlagValue = action->setFlagValue;
- _pendingActionIndex = action->index;
- _characterSoundFxDelayCounter = action->fxDelay;
- _characterSoundFxNum = action->fxNum;
+ _pendingActionDelay = action->_delay;
+ _charPositionFlagNum = action->_setFlagNum;
+ _charPositionFlagValue = action->_setFlagValue;
+ _pendingActionIndex = action->_index;
+ _characterSoundFxDelayCounter = action->_fxDelay;
+ _characterSoundFxNum = action->_fxNum;
_previousActionVerb = _currentActionVerb;
_currentActionVerb = 0;
}
@@ -980,10 +1013,10 @@ void TuckerEngine::setBlackPalette() {
void TuckerEngine::updateCursor() {
setCursorNum(0);
- if (_backgroundSpriteCurrentAnimation == -1 && _panelLockedFlag == 0 && _selectedObject.locationObject_locationNum > 0) {
- _selectedObject.locationObject_locationNum = 0;
+ if (_backgroundSpriteCurrentAnimation == -1 && !_panelLockedFlag && _selectedObject._locationObjectLocationNum > 0) {
+ _selectedObject._locationObjectLocationNum = 0;
}
- if (_locationMaskType > 0 || _selectedObject.locationObject_locationNum > 0 || _pendingActionDelay > 0) {
+ if (_locationMaskType > 0 || _selectedObject._locationObjectLocationNum > 0 || _pendingActionDelay > 0) {
return;
}
if (_rightMouseButtonPressed) {
@@ -993,13 +1026,13 @@ void TuckerEngine::updateCursor() {
_actionVerb = 0;
}
_updateCursorFlag = true;
- _actionVerbLocked = 1;
+ _actionVerbLocked = true;
_actionRequiresTwoObjects = false;
}
} else {
_updateCursorFlag = false;
}
- if (_actionVerbLocked == 0) {
+ if (!_actionVerbLocked) {
setActionVerbUnderCursor();
if (_actionVerb == 0 && _locationNum == 63) {
_actionVerb = 8;
@@ -1016,7 +1049,7 @@ void TuckerEngine::updateCursor() {
} else {
num = getObjectUnderCursor();
if (num > -1) {
- _selectedObjectNum = _locationObjectsTable[num].textNum;
+ _selectedObjectNum = _locationObjectsTable[num]._textNum;
}
}
handleMouseClickOnInventoryObject();
@@ -1027,7 +1060,7 @@ void TuckerEngine::updateCursor() {
_selectedObjectNum = 0;
_selectedObjectType = 0;
}
- if (_actionVerbLocked == 0 && _selectedObjectType == 2 && _selectedObjectNum != 21) {
+ if (!_actionVerbLocked && _selectedObjectType == 2 && _selectedObjectNum != 21) {
_actionVerb = 2;
}
if (!_actionRequiresTwoObjects) {
@@ -1055,7 +1088,7 @@ void TuckerEngine::updateCursor() {
if (_mousePosY >= 150 && _mousePosX < 212) {
if (_mousePosX < 200) {
setActionVerbUnderCursor();
- _actionVerbLocked = 1;
+ _actionVerbLocked = true;
_actionRequiresTwoObjects = false;
} else if (_mousePosY < 175) {
moveDownInventoryObjects();
@@ -1066,13 +1099,13 @@ void TuckerEngine::updateCursor() {
if (_selectedObjectType == 3) {
setActionForInventoryObject();
} else if (_actionVerb != 0) {
- _actionVerbLocked = 0;
+ _actionVerbLocked = false;
setActionState();
} else if (_actionObj1Num == 261 || (_actionObj1Num == 205 && _flagsTable[143] == 0)) {
- _actionVerbLocked = 0;
+ _actionVerbLocked = false;
setActionState();
} else {
- _actionVerbLocked = 0;
+ _actionVerbLocked = false;
_actionRequiresTwoObjects = false;
_currentActionVerb = 0;
setSelectedObjectKey();
@@ -1092,26 +1125,26 @@ void TuckerEngine::stopSounds() {
void TuckerEngine::playSounds() {
for (int i = 0; i < _locationSoundsCount; ++i) {
- if (_locationSoundsTable[i].type == 1 || _locationSoundsTable[i].type == 2 || _locationSoundsTable[i].type == 5 ||
- (_locationSoundsTable[i].type == 7 && _flagsTable[_locationSoundsTable[i].flagNum] == _locationSoundsTable[i].flagValueStartFx)) {
- startSound(_locationSoundsTable[i].offset, i, _locationSoundsTable[i].volume);
+ if (_locationSoundsTable[i]._type == 1 || _locationSoundsTable[i]._type == 2 || _locationSoundsTable[i]._type == 5 ||
+ (_locationSoundsTable[i]._type == 7 && _flagsTable[_locationSoundsTable[i]._flagNum] == _locationSoundsTable[i]._flagValueStartFx)) {
+ startSound(_locationSoundsTable[i]._offset, i, _locationSoundsTable[i]._volume);
}
}
for (int i = 0; i < _locationMusicsCount; ++i) {
- if (_locationMusicsTable[i].flag > 0) {
- startMusic(_locationMusicsTable[i].offset, i, _locationMusicsTable[i].volume);
+ if (_locationMusicsTable[i]._flag > 0) {
+ startMusic(_locationMusicsTable[i]._offset, i, _locationMusicsTable[i]._volume);
}
}
}
void TuckerEngine::updateCharactersPath() {
- if (_panelLockedFlag == 0) {
+ if (!_panelLockedFlag) {
return;
}
if (_backgroundSpriteCurrentAnimation != -1 && _locationNum != 25) {
- if (_xPosCurrent == _selectedObject.xPos && _yPosCurrent == _selectedObject.yPos) {
+ if (_xPosCurrent == _selectedObject._xPos && _yPosCurrent == _selectedObject._yPos) {
_locationMaskCounter = 1;
- _panelLockedFlag = 0;
+ _panelLockedFlag = false;
}
return;
}
@@ -1120,68 +1153,68 @@ void TuckerEngine::updateCharactersPath() {
if (_characterFacingDirection == 5) {
_characterPrevFacingDirection = 5;
}
- int flag = 0;
- if (_yPosCurrent > _selectedObject.yPos) {
- if (testLocationMask(_xPosCurrent, _yPosCurrent - 1) == 1) {
+ bool flag = false;
+ if (_yPosCurrent > _selectedObject._yPos) {
+ if (testLocationMask(_xPosCurrent, _yPosCurrent - 1)) {
--_yPosCurrent;
_characterFacingDirection = 4;
- flag = 1;
+ flag = true;
}
- } else if (_yPosCurrent < _selectedObject.yPos) {
- if (testLocationMask(_xPosCurrent, _yPosCurrent + 1) == 1) {
+ } else if (_yPosCurrent < _selectedObject._yPos) {
+ if (testLocationMask(_xPosCurrent, _yPosCurrent + 1)) {
++_yPosCurrent;
_characterFacingDirection = 2;
- flag = 1;
+ flag = true;
}
}
- if (_xPosCurrent > _selectedObject.xPos) {
- if (testLocationMask(_xPosCurrent - 1, _yPosCurrent) == 1) {
+ if (_xPosCurrent > _selectedObject._xPos) {
+ if (testLocationMask(_xPosCurrent - 1, _yPosCurrent)) {
--_xPosCurrent;
_characterFacingDirection = 3;
- _characterBackFrontFacing = 0;
- flag = 1;
+ _characterBackFrontFacing = false;
+ flag = true;
}
- } else if (_xPosCurrent < _selectedObject.xPos) {
- if (testLocationMask(_xPosCurrent + 1, _yPosCurrent) == 1) {
+ } else if (_xPosCurrent < _selectedObject._xPos) {
+ if (testLocationMask(_xPosCurrent + 1, _yPosCurrent)) {
++_xPosCurrent;
_characterFacingDirection = 1;
- _characterBackFrontFacing = 1;
- flag = 1;
+ _characterBackFrontFacing = true;
+ flag = true;
}
}
- if (flag == 0) {
- if (_selectedObjectLocationMask == 1) {
- _selectedObjectLocationMask = 0;
- _selectedObject.xPos = _selectedObject.xDefaultPos;
- _selectedObject.yPos = _selectedObject.yDefaultPos;
+ if (!flag) {
+ if (_selectedObjectLocationMask) {
+ _selectedObjectLocationMask = false;
+ _selectedObject._xPos = _selectedObject._xDefaultPos;
+ _selectedObject._yPos = _selectedObject._yDefaultPos;
} else {
- _panelLockedFlag = 0;
+ _panelLockedFlag = false;
_characterFacingDirection = 0;
- if (_xPosCurrent == _selectedObject.xPos && _yPosCurrent == _selectedObject.yPos) {
+ if (_xPosCurrent == _selectedObject._xPos && _yPosCurrent == _selectedObject._yPos) {
_locationMaskCounter = 1;
}
}
}
if (_locationNum == 25) {
- if ((_backgroundSpriteCurrentAnimation != 3 || _characterBackFrontFacing != 0) && (_backgroundSpriteCurrentAnimation != 6 || _characterBackFrontFacing != 1)) {
+ if ((_backgroundSpriteCurrentAnimation != 3 || _characterBackFrontFacing) && (_backgroundSpriteCurrentAnimation != 6 || !_characterBackFrontFacing)) {
_xPosCurrent = xPos;
_yPosCurrent = yPos;
return;
}
}
- if (_xPosCurrent != _selectedObject.xPos || _yPosCurrent != _selectedObject.yPos) {
+ if (_xPosCurrent != _selectedObject._xPos || _yPosCurrent != _selectedObject._yPos) {
return;
}
- if (_selectedObjectLocationMask != 0) {
+ if (_selectedObjectLocationMask) {
return;
}
_locationMaskCounter = 1;
- _panelLockedFlag = 0;
- _locationMaskIgnore = 0;
+ _panelLockedFlag = false;
+ _locationMaskIgnore = false;
if (_characterPrevFacingDirection <= 0 || _characterPrevFacingDirection >= 5) {
return;
}
- if (_selectedObject.locationObject_locationNum == 0) {
+ if (_selectedObject._locationObjectLocationNum == 0) {
_characterFacingDirection = 5;
while (_spriteAnimationFramesTable[_spriteAnimationFrameIndex] != 999) {
++_spriteAnimationFrameIndex;
@@ -1200,12 +1233,12 @@ void TuckerEngine::setSoundVolumeDistance() {
void TuckerEngine::updateData3DrawFlag() {
for (int i = 0; i < _locationAnimationsCount; ++i) {
LocationAnimation *a = &_locationAnimationsTable[i];
- if (a->flagNum > 0 && a->flagValue != _flagsTable[a->flagNum]) {
- a->drawFlag = 0;
- } else if (a->getFlag == 0) {
- a->drawFlag = 1;
+ if (a->_flagNum > 0 && a->_flagValue != _flagsTable[a->_flagNum]) {
+ a->_drawFlag = false;
+ } else if (a->_getFlag == 0) {
+ a->_drawFlag = true;
} else {
- a->drawFlag = (_inventoryItemsState[a->inventoryNum] == 0) ? 1 : 0;
+ a->_drawFlag = (_inventoryItemsState[a->_inventoryNum] == 0);
}
}
}
@@ -1214,26 +1247,26 @@ void TuckerEngine::updateData3() {
updateData3DrawFlag();
for (int i = 0; i < _locationAnimationsCount; ++i) {
LocationAnimation *a = &_locationAnimationsTable[i];
- if (a->animLastCounter != 0 && a->drawFlag != 0) {
- if (a->animLastCounter == a->animCurrentCounter) {
- a->animCurrentCounter = a->animInitCounter;
+ if (a->_animLastCounter != 0 && a->_drawFlag) {
+ if (a->_animLastCounter == a->_animCurrentCounter) {
+ a->_animCurrentCounter = a->_animInitCounter;
} else {
- ++a->animCurrentCounter;
+ ++a->_animCurrentCounter;
}
- const int index = a->animCurrentCounter;
+ const int index = a->_animCurrentCounter;
if (_staticData3Table[index] == 998) {
_flagsTable[_staticData3Table[index + 1]] = _staticData3Table[index + 2];
- a->animCurrentCounter = a->animInitCounter;
- a->drawFlag = 0;
+ a->_animCurrentCounter = a->_animInitCounter;
+ a->_drawFlag = false;
}
if (_locationNum == 24 && i == 0) {
// workaround bug #2872385: update fish animation sequence for correct
// position in aquarium.
- if (a->animInitCounter == 505 && a->animCurrentCounter == 513) {
- a->animCurrentCounter = 525;
+ if (a->_animInitCounter == 505 && a->_animCurrentCounter == 513) {
+ a->_animCurrentCounter = 525;
}
}
- a->graphicNum = _staticData3Table[a->animCurrentCounter];
+ a->_graphicNum = _staticData3Table[a->_animCurrentCounter];
}
}
updateData3DrawFlag();
@@ -1242,16 +1275,16 @@ void TuckerEngine::updateData3() {
void TuckerEngine::updateSfxData3_1() {
for (int i = 0; i < _locationSoundsCount; ++i) {
LocationSound *s = &_locationSoundsTable[i];
- if ((s->type == 6 || s->type == 7) && s->updateType == 1) {
+ if ((s->_type == 6 || s->_type == 7) && s->_updateType == 1) {
for (int j = 0; j < _spritesCount; ++j) {
- if (_spritesTable[j].animationFrame == s->startFxSpriteNum && _spritesTable[j].state == s->startFxSpriteState) {
- if (s->type == 7) {
- _flagsTable[s->flagNum] = s->flagValueStartFx;
+ if (_spritesTable[j]._animationFrame == s->_startFxSpriteNum && _spritesTable[j]._state == s->_startFxSpriteState) {
+ if (s->_type == 7) {
+ _flagsTable[s->_flagNum] = s->_flagValueStartFx;
}
- startSound(s->offset, i, s->volume);
- } else if (s->type == 7) {
- if (_spritesTable[j].animationFrame == s->stopFxSpriteNum && _spritesTable[j].state == s->stopFxSpriteState) {
- _flagsTable[s->flagNum] = s->flagValueStopFx;
+ startSound(s->_offset, i, s->_volume);
+ } else if (s->_type == 7) {
+ if (_spritesTable[j]._animationFrame == s->_stopFxSpriteNum && _spritesTable[j]._state == s->_stopFxSpriteState) {
+ _flagsTable[s->_flagNum] = s->_flagValueStopFx;
stopSound(i);
}
}
@@ -1263,15 +1296,15 @@ void TuckerEngine::updateSfxData3_1() {
void TuckerEngine::updateSfxData3_2() {
for (int i = 0; i < _locationSoundsCount; ++i) {
LocationSound *s = &_locationSoundsTable[i];
- if ((s->type == 6 || s->type == 7) && s->updateType == 0) {
- if (s->startFxSpriteNum == _backgroundSpriteCurrentFrame && s->startFxSpriteState == _backgroundSpriteCurrentAnimation) {
- if (s->type == 7) {
- _flagsTable[s->flagNum] = s->flagValueStartFx;
+ if ((s->_type == 6 || s->_type == 7) && s->_updateType == 0) {
+ if (s->_startFxSpriteNum == _backgroundSpriteCurrentFrame && s->_startFxSpriteState == _backgroundSpriteCurrentAnimation) {
+ if (s->_type == 7) {
+ _flagsTable[s->_flagNum] = s->_flagValueStartFx;
}
- startSound(s->offset, i, s->volume);
- } else if (s->type == 7) {
- if (s->stopFxSpriteNum == _backgroundSpriteCurrentFrame && s->stopFxSpriteState == _backgroundSpriteCurrentAnimation) {
- _flagsTable[s->flagNum] = s->flagValueStopFx;
+ startSound(s->_offset, i, s->_volume);
+ } else if (s->_type == 7) {
+ if (s->_stopFxSpriteNum == _backgroundSpriteCurrentFrame && s->_stopFxSpriteState == _backgroundSpriteCurrentAnimation) {
+ _flagsTable[s->_flagNum] = s->_flagValueStopFx;
stopSound(i);
}
}
@@ -1422,7 +1455,7 @@ void TuckerEngine::redrawPanelOverBackground() {
void TuckerEngine::drawConversationTexts() {
int y = 141;
- int flag = 0;
+ bool flag = false;
for (int i = 0; i < _conversationOptionsCount; ++i) {
int color = 108;
if ((_mousePosY > y && _mousePosY < y + 11) || _nextTableToLoadIndex == i) {
@@ -1431,11 +1464,11 @@ void TuckerEngine::drawConversationTexts() {
drawSpeechText(0, y, _characterSpeechDataPtr, _instructionsActionsTable[i], color);
if (_mousePosY > y && _mousePosY < _conversationOptionLinesCount * 10 + y + 1) {
_nextTableToLoadIndex = i;
- flag = 1;
+ flag = true;
}
y += _conversationOptionLinesCount * 10;
}
- if (flag == 0) {
+ if (!flag) {
_nextTableToLoadIndex = -1;
}
}
@@ -1471,31 +1504,31 @@ void TuckerEngine::updateGameHints() {
if (_gameHintsIndex == 0 && _flagsTable[3] > 0) {
_gameHintsIndex = 1;
_gameHintsCounter = 0;
- _gameHintsDisplayText = 0;
+ _displayHintsText = false;
} else if (_gameHintsIndex == 1 && _flagsTable[12] > 0) {
_gameHintsIndex = 2;
_gameHintsCounter = 0;
- _gameHintsDisplayText = 0;
+ _displayHintsText = false;
} else if (_gameHintsIndex == 2 && _flagsTable[20] > 0) {
_gameHintsIndex = 3;
_gameHintsCounter = 0;
- _gameHintsDisplayText = 0;
+ _displayHintsText = false;
} else if (_gameHintsIndex == 3 && _flagsTable[9] > 0) {
_gameHintsIndex = 4;
_gameHintsCounter = 0;
- _gameHintsDisplayText = 0;
+ _displayHintsText = false;
} else if (_gameHintsIndex == 4 && _flagsTable[23] > 0) {
_gameHintsIndex = 5;
_gameHintsCounter = 0;
- _gameHintsDisplayText = 0;
+ _displayHintsText = false;
} else if (_flagsTable[19] > 0) {
_gameHintsIndex = 6;
_gameHintsCounter = 0;
- _gameHintsDisplayText = 0;
+ _displayHintsText = false;
}
++_gameHintsCounter;
if (_gameHintsCounter > 1500) {
- _gameHintsDisplayText = 1;
+ _displayHintsText = true;
}
}
@@ -1503,7 +1536,7 @@ void TuckerEngine::startCharacterSounds() {
if (_characterSoundFxDelayCounter != 0) {
--_characterSoundFxDelayCounter;
if (_characterSoundFxDelayCounter <= 0) {
- startSound(_locationSoundsTable[_characterSoundFxNum].offset, _characterSoundFxNum, _locationSoundsTable[_characterSoundFxNum].volume);
+ startSound(_locationSoundsTable[_characterSoundFxNum]._offset, _characterSoundFxNum, _locationSoundsTable[_characterSoundFxNum]._volume);
}
}
}
@@ -1513,16 +1546,16 @@ void TuckerEngine::updateSoundsTypes3_4() {
return;
}
for (int i = 0; i < _locationSoundsCount; ++i) {
- switch (_locationSoundsTable[i].type) {
+ switch (_locationSoundsTable[i]._type) {
case 3:
if (getRandomNumber() >= 32300) {
- startSound(_locationSoundsTable[i].offset, 0, _locationSoundsTable[i].volume);
+ startSound(_locationSoundsTable[i]._offset, 0, _locationSoundsTable[i]._volume);
return;
}
break;
case 4:
if (getRandomNumber() >= 32763) {
- startSound(_locationSoundsTable[i].offset, 0, _locationSoundsTable[i].volume);
+ startSound(_locationSoundsTable[i]._offset, 0, _locationSoundsTable[i]._volume);
return;
}
break;
@@ -1532,11 +1565,11 @@ void TuckerEngine::updateSoundsTypes3_4() {
void TuckerEngine::drawData3() {
for (int i = 0; i < _locationAnimationsCount; ++i) {
- if (_locationAnimationsTable[i].drawFlag != 0) {
- int num = _locationAnimationsTable[i].graphicNum;
+ if (_locationAnimationsTable[i]._drawFlag) {
+ int num = _locationAnimationsTable[i]._graphicNum;
const Data *d = &_dataTable[num];
- Graphics::decodeRLE(_locationBackgroundGfxBuf + d->yDest * 640 + d->xDest, _data3GfxBuf + d->sourceOffset, d->xSize, d->ySize);
- addDirtyRect(d->xDest, d->yDest, d->xSize, d->ySize);
+ Graphics::decodeRLE(_locationBackgroundGfxBuf + d->_yDest * 640 + d->_xDest, _data3GfxBuf + d->_sourceOffset, d->_xSize, d->_ySize);
+ addDirtyRect(d->_xDest, d->_yDest, d->_xSize, d->_ySize);
}
}
}
@@ -1750,28 +1783,28 @@ void TuckerEngine::drawCurrentSprite() {
// Workaround original game glitch: location 14 contains some colors from [0xE0-0xF8] in a walkable area (tracker item #3106542)
const bool color248Only = (_locationNum == 14);
SpriteFrame *chr = &_spriteFramesTable[_currentSpriteAnimationFrame];
- int yPos = _yPosCurrent + _mainSpritesBaseOffset - 54 + chr->yOffset;
+ int yPos = _yPosCurrent + _mainSpritesBaseOffset - 54 + chr->_yOffset;
int xPos = _xPosCurrent;
- if (_mirroredDrawing == 0) {
- xPos += chr->xOffset - 14;
+ if (!_mirroredDrawing) {
+ xPos += chr->_xOffset - 14;
} else {
- xPos -= chr->xSize + chr->xOffset - 14;
+ xPos -= chr->_xSize + chr->_xOffset - 14;
}
- Graphics::decodeRLE_248(_locationBackgroundGfxBuf + yPos * 640 + xPos, _spritesGfxBuf + chr->sourceOffset, chr->xSize, chr->ySize,
- chr->yOffset, _locationHeightTable[_locationNum], _mirroredDrawing != 0, color248Only);
- addDirtyRect(xPos, yPos, chr->xSize, chr->ySize);
+ Graphics::decodeRLE_248(_locationBackgroundGfxBuf + yPos * 640 + xPos, _spritesGfxBuf + chr->_sourceOffset, chr->_xSize, chr->_ySize,
+ chr->_yOffset, _locationHeightTable[_locationNum], _mirroredDrawing, color248Only);
+ addDirtyRect(xPos, yPos, chr->_xSize, chr->_ySize);
if (_currentSpriteAnimationLength > 1) {
SpriteFrame *chr2 = &_spriteFramesTable[_currentSpriteAnimationFrame2];
- yPos = _yPosCurrent + _mainSpritesBaseOffset - 54 + chr2->yOffset;
+ yPos = _yPosCurrent + _mainSpritesBaseOffset - 54 + chr2->_yOffset;
xPos = _xPosCurrent;
- if (_mirroredDrawing == 0) {
- xPos += chr2->xOffset - 14;
+ if (!_mirroredDrawing) {
+ xPos += chr2->_xOffset - 14;
} else {
- xPos -= chr2->xSize + chr2->xOffset - 14;
+ xPos -= chr2->_xSize + chr2->_xOffset - 14;
}
- Graphics::decodeRLE_248(_locationBackgroundGfxBuf + yPos * 640 + xPos, _spritesGfxBuf + chr2->sourceOffset, chr2->xSize, chr2->ySize,
- chr2->yOffset, _locationHeightTable[_locationNum], _mirroredDrawing != 0, color248Only);
- addDirtyRect(xPos, yPos, chr2->xSize, chr2->ySize);
+ Graphics::decodeRLE_248(_locationBackgroundGfxBuf + yPos * 640 + xPos, _spritesGfxBuf + chr2->_sourceOffset, chr2->_xSize, chr2->_ySize,
+ chr2->_yOffset, _locationHeightTable[_locationNum], _mirroredDrawing, color248Only);
+ addDirtyRect(xPos, yPos, chr2->_xSize, chr2->_ySize);
}
}
@@ -1790,8 +1823,8 @@ void TuckerEngine::setVolumeMusic(int index, int volume) {
}
void TuckerEngine::startSound(int offset, int index, int volume) {
- bool loop = (_locationSoundsTable[index].type == 2 || _locationSoundsTable[index].type == 5 || _locationSoundsTable[index].type == 7);
- loadSound(Audio::Mixer::kSFXSoundType, _locationSoundsTable[index].num, volume, loop, &_sfxHandles[index]);
+ bool loop = (_locationSoundsTable[index]._type == 2 || _locationSoundsTable[index]._type == 5 || _locationSoundsTable[index]._type == 7);
+ loadSound(Audio::Mixer::kSFXSoundType, _locationSoundsTable[index]._num, volume, loop, &_sfxHandles[index]);
}
void TuckerEngine::stopSound(int index) {
@@ -1803,8 +1836,8 @@ bool TuckerEngine::isSoundPlaying(int index) {
}
void TuckerEngine::startMusic(int offset, int index, int volume) {
- bool loop = (_locationMusicsTable[index].flag == 2);
- loadSound(Audio::Mixer::kMusicSoundType, _locationMusicsTable[index].num, volume, loop, &_musicHandles[index]);
+ bool loop = (_locationMusicsTable[index]._flag == 2);
+ loadSound(Audio::Mixer::kMusicSoundType, _locationMusicsTable[index]._num, volume, loop, &_musicHandles[index]);
}
void TuckerEngine::stopMusic(int index) {
@@ -1831,14 +1864,16 @@ void TuckerEngine::rememberSpeechSound() {
}
void TuckerEngine::redrawPanelItems() {
- const uint8 *src = 0;
- uint8 *dst = 0;
- int sz = 0;
if (_forceRedrawPanelItems || (_redrawPanelItemsCounter != 0 && _panelState == 0)) {
_forceRedrawPanelItems = false;
if (_redrawPanelItemsCounter > 0) {
--_redrawPanelItemsCounter;
}
+
+ const uint8 *src = nullptr;
+ uint8 *dst = nullptr;
+ int sz = 0;
+
switch (_panelState) {
case 0:
src = _panelGfxBuf;
@@ -1892,25 +1927,25 @@ void TuckerEngine::redrawPanelItemsHelper() {
void TuckerEngine::drawSprite(int num) {
Sprite *s = &_spritesTable[num];
- if (s->animationFrame <= s->firstFrame && s->animationFrame > 0 && s->state != -1) {
- const uint8 *p = s->animationData;
+ if (s->_animationFrame <= s->_firstFrame && s->_animationFrame > 0 && s->_state != -1) {
+ const uint8 *p = s->_animationData;
if (!p) {
return;
}
- int frameOffset = READ_LE_UINT24(p + s->animationFrame * 4);
+ int frameOffset = READ_LE_UINT24(p + s->_animationFrame * 4);
int srcW = READ_LE_UINT16(p + frameOffset);
int srcH = READ_LE_UINT16(p + frameOffset + 2);
int srcX = READ_LE_UINT16(p + frameOffset + 8);
int srcY = READ_LE_UINT16(p + frameOffset + 10);
- int xPos = s->gfxBackgroundOffset + srcX;
+ int xPos = s->_gfxBackgroundOffset + srcX;
if (xPos < 600 && (_scrollOffset + 320 < xPos || _scrollOffset - srcW > xPos)) {
return;
}
- s->xSource = srcX;
- s->gfxBackgroundOffset += s->backgroundOffset;
+ s->_xSource = srcX;
+ s->_gfxBackgroundOffset += s->_backgroundOffset;
uint8 *dstPtr = _locationBackgroundGfxBuf + srcY * 640 + xPos;
const uint8 *srcPtr = p + frameOffset + 12;
- switch (s->colorType) {
+ switch (s->_colorType) {
case 0:
Graphics::decodeRLE(dstPtr, srcPtr, srcW, srcH);
break;
@@ -1918,11 +1953,11 @@ void TuckerEngine::drawSprite(int num) {
Graphics::decodeRLE_224(dstPtr, srcPtr, srcW, srcH);
break;
default:
- Graphics::decodeRLE_248(dstPtr, srcPtr, srcW, srcH, 0, s->yMaxBackground, s->flipX != 0);
+ Graphics::decodeRLE_248(dstPtr, srcPtr, srcW, srcH, 0, s->_yMaxBackground, s->_flipX);
break;
}
- const int xR = srcX + (s->gfxBackgroundOffset % 640);
- const int yR = srcY + (s->gfxBackgroundOffset / 640);
+ const int xR = srcX + (s->_gfxBackgroundOffset % 640);
+ const int yR = srcY + (s->_gfxBackgroundOffset / 640);
addDirtyRect(xR, yR, srcW, srcH);
}
}
@@ -1938,7 +1973,7 @@ void TuckerEngine::drawPausedInfoBar() {
}
const uint8 *TuckerEngine::getStringBuf(int type) const {
- const uint8 *p = 0;
+ const uint8 *p = nullptr;
switch (type) {
case 0:
p = _data5Buf;
@@ -2031,7 +2066,7 @@ void TuckerEngine::updateCharacterAnimation() {
++_spriteAnimationFrameIndex;
}
_characterFacingDirection = 0;
- if (_changeBackgroundSprite == 1) {
+ if (_changeBackgroundSprite) {
if (_backgroundSpriteCurrentFrame == 0) {
_backgroundSpriteDataPtr = _sprA02Table[_backgroundSpriteCurrentAnimation];
_backgroundSpriteCurrentFrame = _backgroundSpriteLastFrame = READ_LE_UINT16(_backgroundSpriteDataPtr);
@@ -2040,7 +2075,7 @@ void TuckerEngine::updateCharacterAnimation() {
if (_backgroundSpriteCurrentFrame < 1) {
_backgroundSpriteCurrentAnimation = -1;
_backgroundSpriteCurrentFrame = 0;
- _changeBackgroundSprite = 0;
+ _changeBackgroundSprite = false;
if (_nextAction == 0) {
setCursorType(0);
}
@@ -2052,7 +2087,7 @@ void TuckerEngine::updateCharacterAnimation() {
assert(_backgroundSpriteCurrentAnimation >= 0 && _backgroundSpriteCurrentAnimation < kSprA02TableSize);
_backgroundSpriteDataPtr = _sprA02Table[_backgroundSpriteCurrentAnimation];
_backgroundSpriteLastFrame = READ_LE_UINT16(_backgroundSpriteDataPtr);
- } else if (_locationNum == 25 && _panelLockedFlag != 1 && (_backgroundSpriteCurrentAnimation == 3 || _backgroundSpriteCurrentAnimation == 6)) {
+ } else if (_locationNum == 25 && !_panelLockedFlag && (_backgroundSpriteCurrentAnimation == 3 || _backgroundSpriteCurrentAnimation == 6)) {
_backgroundSpriteCurrentFrame = 0;
_backgroundSpriteCurrentAnimation = -1;
} else {
@@ -2068,9 +2103,9 @@ void TuckerEngine::updateCharacterAnimation() {
}
}
if (_locationNum == 24 && _flagsTable[103] == 0) {
- if (_panelLockedFlag == 1) {
- _panelLockedFlag = 0;
- _selectedObject.locationObject_locationNum = 0;
+ if (_panelLockedFlag) {
+ _panelLockedFlag = false;
+ _selectedObject._locationObjectLocationNum = 0;
if (_actionVerb != 2) {
_speechSoundNum = 2236;
startSpeechSound(_speechSoundNum, _speechVolume);
@@ -2105,10 +2140,10 @@ void TuckerEngine::updateCharacterAnimation() {
}
} else if (_locationNum == 25) {
if (_backgroundSpriteCurrentFrame == 0) {
- if (_characterBackFrontFacing == 0) {
+ if (!_characterBackFrontFacing) {
if (_characterBackFrontFacing != _characterPrevBackFrontFacing) {
_backgroundSpriteCurrentAnimation = 10;
- } else if (_panelLockedFlag == 1) {
+ } else if (_panelLockedFlag) {
_backgroundSpriteCurrentAnimation = 3;
} else if (_charSpeechSoundCounter > 0 && _actionCharacterNum == 99) {
_backgroundSpriteCurrentAnimation = 8;
@@ -2118,7 +2153,7 @@ void TuckerEngine::updateCharacterAnimation() {
} else {
if (_characterBackFrontFacing != _characterPrevBackFrontFacing) {
_backgroundSpriteCurrentAnimation = 2;
- } else if (_panelLockedFlag == 1) {
+ } else if (_panelLockedFlag) {
_backgroundSpriteCurrentAnimation = 6;
} else if (_charSpeechSoundCounter > 0 && _actionCharacterNum == 99) {
_backgroundSpriteCurrentAnimation = 9;
@@ -2143,7 +2178,7 @@ void TuckerEngine::updateCharacterAnimation() {
_backgroundSpriteLastFrame = READ_LE_UINT16(_backgroundSpriteDataPtr);
}
int frame = _spriteAnimationFramesTable[_spriteAnimationFrameIndex];
- if (_panelLockedFlag == 0 && _characterFacingDirection < 5 && _selectedObject.locationObject_locationNum == 0) {
+ if (!_panelLockedFlag && _characterFacingDirection < 5 && _selectedObject._locationObjectLocationNum == 0) {
_characterFacingDirection = 0;
}
if (_charSpeechSoundCounter > 0 && _characterFacingDirection != 6 && _actionCharacterNum == 99) {
@@ -2155,7 +2190,7 @@ void TuckerEngine::updateCharacterAnimation() {
}
int num = 0;
if (frame == 999 || (_characterFacingDirection != _characterPrevFacingDirection && _characterFacingDirection < 5)) {
- _mirroredDrawing = 0;
+ _mirroredDrawing = false;
if (_characterFacingDirection == 6) {
if (_csDataHandled) {
switch (_selectedCharacterDirection) {
@@ -2170,7 +2205,7 @@ void TuckerEngine::updateCharacterAnimation() {
break;
default:
num = 16;
- _mirroredDrawing = 1;
+ _mirroredDrawing = true;
break;
}
} else {
@@ -2182,7 +2217,7 @@ void TuckerEngine::updateCharacterAnimation() {
}
if (_characterFacingDirection == 0) {
if (_csDataHandled) {
- _mirroredDrawing = 0;
+ _mirroredDrawing = false;
switch (_selectedCharacterDirection) {
case 1:
num = 3;
@@ -2192,7 +2227,7 @@ void TuckerEngine::updateCharacterAnimation() {
break;
case 3:
num = 1;
- _mirroredDrawing = 1;
+ _mirroredDrawing = true;
break;
default:
num = 5;
@@ -2218,21 +2253,21 @@ void TuckerEngine::updateCharacterAnimation() {
break;
case 3:
num = 0;
- _mirroredDrawing = 1;
+ _mirroredDrawing = true;
break;
case 4:
num = 2;
break;
}
}
- _currentSpriteAnimationLength = _spriteAnimationsTable[num].numParts;
- _spriteAnimationFrameIndex = _spriteAnimationsTable[num].firstFrameIndex;
+ _currentSpriteAnimationLength = _spriteAnimationsTable[num]._numParts;
+ _spriteAnimationFrameIndex = _spriteAnimationsTable[num]._firstFrameIndex;
frame = _spriteAnimationFramesTable[_spriteAnimationFrameIndex];
}
if (_characterAnimationNum > 0) {
num = _characterAnimationNum;
- _currentSpriteAnimationLength = _spriteAnimationsTable[num].numParts;
- _spriteAnimationFrameIndex = _spriteAnimationsTable[num].firstFrameIndex;
+ _currentSpriteAnimationLength = _spriteAnimationsTable[num]._numParts;
+ _spriteAnimationFrameIndex = _spriteAnimationsTable[num]._firstFrameIndex;
frame = _spriteAnimationFramesTable[_spriteAnimationFrameIndex];
_characterAnimationNum = 0;
}
@@ -2287,10 +2322,10 @@ void TuckerEngine::handleMap() {
if (_handleMapCounter > 19) {
_handleMapCounter = 0;
_locationMaskCounter = 1;
- _panelLockedFlag = 0;
+ _panelLockedFlag = false;
}
}
- if (_panelLockedFlag == 0 && (_backgroundSpriteCurrentAnimation == -1 || _locationNum == 25) && _locationMaskType == 3) {
+ if (!_panelLockedFlag && (_backgroundSpriteCurrentAnimation == -1 || _locationNum == 25) && _locationMaskType == 3) {
setCursorType(0);
if (_locationMaskCounter == 1) {
_characterFacingDirection = 0;
@@ -2298,22 +2333,22 @@ void TuckerEngine::handleMap() {
}
return;
}
- if (_selectedObject.locationObject_locationNum != 0 && _locationMaskCounter != 0 && (_backgroundSpriteCurrentAnimation <= -1 || _locationNum == 25)) {
+ if (_selectedObject._locationObjectLocationNum != 0 && _locationMaskCounter != 0 && (_backgroundSpriteCurrentAnimation <= -1 || _locationNum == 25)) {
if (_locationNum == 25 || _backgroundSpriteCurrentAnimation != 4) {
if (_locationMaskType == 0) {
_locationMaskType = 1;
setCursorType(2);
- if (_selectedObject.locationObject_toWalkX2 > 800) {
- _backgroundSpriteCurrentAnimation = _selectedObject.locationObject_toWalkX2 - 900;
- if (_selectedObject.locationObject_toWalkY2 > 499) {
- _changeBackgroundSprite = 1;
- _backgroundSprOffset = _selectedObject.locationObject_toWalkY2 - 500;
+ if (_selectedObject._locationObjectToWalkX2 > 800) {
+ _backgroundSpriteCurrentAnimation = _selectedObject._locationObjectToWalkX2 - 900;
+ if (_selectedObject._locationObjectToWalkY2 > 499) {
+ _changeBackgroundSprite = true;
+ _backgroundSprOffset = _selectedObject._locationObjectToWalkY2 - 500;
} else {
- _backgroundSprOffset = _selectedObject.locationObject_toWalkY2;
- _changeBackgroundSprite = 0;
+ _backgroundSprOffset = _selectedObject._locationObjectToWalkY2;
+ _changeBackgroundSprite = false;
}
_backgroundSpriteCurrentFrame = 0;
- _mirroredDrawing = 0;
+ _mirroredDrawing = false;
if (_locationNum == 25) {
_backgroundSpriteDataPtr = _sprA02Table[_backgroundSpriteCurrentAnimation];
_backgroundSpriteLastFrame = READ_LE_UINT16(_backgroundSpriteDataPtr);
@@ -2321,17 +2356,17 @@ void TuckerEngine::handleMap() {
}
} else {
_locationMaskCounter = 0;
- _selectedObject.xPos = _selectedObject.locationObject_toWalkX2;
- _selectedObject.yPos = _selectedObject.locationObject_toWalkY2;
+ _selectedObject._xPos = _selectedObject._locationObjectToWalkX2;
+ _selectedObject._yPos = _selectedObject._locationObjectToWalkY2;
_handleMapCounter = 1;
- _panelLockedFlag = 1;
+ _panelLockedFlag = true;
}
return;
}
_locationMaskType = 2;
_panelState = 0;
setCursorType(0);
- if (_selectedObject.locationObject_locationNum == 99) {
+ if (_selectedObject._locationObjectLocationNum == 99) {
_noPositionChangeAfterMap = true;
handleMapSequence();
return;
@@ -2341,28 +2376,28 @@ void TuckerEngine::handleMap() {
redrawScreen(_scrollOffset);
_fadePaletteCounter = 34;
}
- _nextLocationNum = _selectedObject.locationObject_locationNum;
- _xPosCurrent = _selectedObject.locationObject_toX;
- _yPosCurrent = _selectedObject.locationObject_toY;
- if (_selectedObject.locationObject_toX2 > 800) {
- _backgroundSpriteCurrentAnimation = _selectedObject.locationObject_toX2 - 900;
- if (_selectedObject.locationObject_toY2 > 499) {
- _changeBackgroundSprite = 1;
- _backgroundSprOffset = _selectedObject.locationObject_toY2 - 500;
+ _nextLocationNum = _selectedObject._locationObjectLocationNum;
+ _xPosCurrent = _selectedObject._locationObjectToX;
+ _yPosCurrent = _selectedObject._locationObjectToY;
+ if (_selectedObject._locationObjectToX2 > 800) {
+ _backgroundSpriteCurrentAnimation = _selectedObject._locationObjectToX2 - 900;
+ if (_selectedObject._locationObjectToY2 > 499) {
+ _changeBackgroundSprite = true;
+ _backgroundSprOffset = _selectedObject._locationObjectToY2 - 500;
} else {
- _changeBackgroundSprite = 0;
- _backgroundSprOffset = _selectedObject.locationObject_toY2;
+ _changeBackgroundSprite = false;
+ _backgroundSprOffset = _selectedObject._locationObjectToY2;
}
_backgroundSpriteCurrentFrame = 0;
} else {
- _selectedObject.xPos = _selectedObject.locationObject_toX2;
- _selectedObject.yPos = _selectedObject.locationObject_toY2;
- _panelLockedFlag = 1;
+ _selectedObject._xPos = _selectedObject._locationObjectToX2;
+ _selectedObject._yPos = _selectedObject._locationObjectToY2;
+ _panelLockedFlag = true;
}
_scrollOffset = 0;
_handleMapCounter = 0;
_locationMaskCounter = 0;
- _selectedObject.locationObject_locationNum = 0;
+ _selectedObject._locationObjectLocationNum = 0;
}
}
}
@@ -2370,79 +2405,79 @@ void TuckerEngine::handleMap() {
void TuckerEngine::clearSprites() {
memset(_spritesTable, 0, sizeof(_spritesTable));
for (int i = 0; i < kMaxCharacters; ++i) {
- _spritesTable[i].state = -1;
- _spritesTable[i].stateIndex = -1;
+ _spritesTable[i]._state = -1;
+ _spritesTable[i]._stateIndex = -1;
}
}
void TuckerEngine::updateSprites() {
const int count = (_locationNum == 9) ? 3 : _spritesCount;
for (int i = 0; i < count; ++i) {
- if (_spritesTable[i].stateIndex > -1) {
- ++_spritesTable[i].stateIndex;
- if (_characterStateTable[_spritesTable[i].stateIndex] == 99) {
- _spritesTable[i].stateIndex = -1;
- _spritesTable[i].state = -1;
+ if (_spritesTable[i]._stateIndex > -1) {
+ ++_spritesTable[i]._stateIndex;
+ if (_characterStateTable[_spritesTable[i]._stateIndex] == 99) {
+ _spritesTable[i]._stateIndex = -1;
+ _spritesTable[i]._state = -1;
updateSprite(i);
} else {
- _spritesTable[i].animationFrame = _characterStateTable[_spritesTable[i].stateIndex];
+ _spritesTable[i]._animationFrame = _characterStateTable[_spritesTable[i]._stateIndex];
}
continue;
}
- if (_spritesTable[i].state == -1) {
+ if (_spritesTable[i]._state == -1) {
updateSprite(i);
continue;
}
- if (_charSpeechSoundCounter > 0 && i == _actionCharacterNum && _spritesTable[i].needUpdate == 0) {
+ if (_charSpeechSoundCounter > 0 && i == _actionCharacterNum && !_spritesTable[i]._needUpdate) {
updateSprite(i);
continue;
}
- if (_charSpeechSoundCounter == 0 && _spritesTable[i].needUpdate > 0) {
+ if (_charSpeechSoundCounter == 0 && _spritesTable[i]._needUpdate) {
updateSprite(i);
continue;
}
- if (_spritesTable[i].updateDelay > 0) {
- --_spritesTable[i].updateDelay;
- if (_spritesTable[i].updateDelay == 0) {
+ if (_spritesTable[i]._updateDelay > 0) {
+ --_spritesTable[i]._updateDelay;
+ if (_spritesTable[i]._updateDelay == 0) {
updateSprite(i);
}
continue;
}
- if (_spritesTable[i].defaultUpdateDelay > 0) {
- _spritesTable[i].updateDelay = _spritesTable[i].defaultUpdateDelay - 1;
- ++_spritesTable[i].animationFrame;
- if (_spritesTable[i].animationFrame == _spritesTable[i].firstFrame) {
+ if (_spritesTable[i]._defaultUpdateDelay > 0) {
+ _spritesTable[i]._updateDelay = _spritesTable[i]._defaultUpdateDelay - 1;
+ ++_spritesTable[i]._animationFrame;
+ if (_spritesTable[i]._animationFrame == _spritesTable[i]._firstFrame) {
updateSprite(i);
}
continue;
}
- if (_spritesTable[i].nextAnimationFrame == 0) {
- ++_spritesTable[i].animationFrame;
- if (_spritesTable[i].firstFrame - 1 < _spritesTable[i].animationFrame) {
- if (_spritesTable[i].prevAnimationFrame == 1) {
- --_spritesTable[i].animationFrame;
- _spritesTable[i].nextAnimationFrame = 1;
+ if (!_spritesTable[i]._nextAnimationFrame) {
+ ++_spritesTable[i]._animationFrame;
+ if (_spritesTable[i]._firstFrame - 1 < _spritesTable[i]._animationFrame) {
+ if (_spritesTable[i]._prevAnimationFrame) {
+ --_spritesTable[i]._animationFrame;
+ _spritesTable[i]._nextAnimationFrame = true;
} else {
updateSprite(i);
}
}
continue;
}
- --_spritesTable[i].animationFrame;
- if (_spritesTable[i].animationFrame == 0) {
+ --_spritesTable[i]._animationFrame;
+ if (_spritesTable[i]._animationFrame == 0) {
updateSprite(i);
}
}
}
void TuckerEngine::updateSprite(int i) {
- _spritesTable[i].prevState = _spritesTable[i].state;
- _spritesTable[i].prevAnimationFrame = 0;
- _spritesTable[i].nextAnimationFrame = 0;
- _updateSpriteFlag1 = 0;
- _updateSpriteFlag2 = 0;
- _spritesTable[i].defaultUpdateDelay = 0;
- _spritesTable[i].updateDelay = 0;
+ _spritesTable[i]._prevState = _spritesTable[i]._state;
+ _spritesTable[i]._prevAnimationFrame = false;
+ _spritesTable[i]._nextAnimationFrame = false;
+ _updateSpriteFlag1 = false;
+ _updateSpriteFlag2 = false;
+ _spritesTable[i]._defaultUpdateDelay = 0;
+ _spritesTable[i]._updateDelay = 0;
switch (_locationNum) {
case 2:
updateSprite_locationNum2();
@@ -2632,7 +2667,7 @@ void TuckerEngine::updateSprite(int i) {
if (i == 0) {
updateSprite_locationNum32_0(0);
} else {
- _spritesTable[i].state = -1;
+ _spritesTable[i]._state = -1;
}
break;
case 33:
@@ -2643,7 +2678,7 @@ void TuckerEngine::updateSprite(int i) {
} else if (i == 2) {
updateSprite_locationNum33_2(2);
} else {
- _spritesTable[i].state = 12;
+ _spritesTable[i]._state = 12;
}
break;
case 34:
@@ -2654,7 +2689,7 @@ void TuckerEngine::updateSprite(int i) {
break;
case 37:
if (i == 0) {
- _spritesTable[0].state = -1;
+ _spritesTable[0]._state = -1;
} else {
updateSprite_locationNum37(i);
}
@@ -2670,9 +2705,9 @@ void TuckerEngine::updateSprite(int i) {
updateSprite_locationNum43_2(i);
} else if (i < 2) {
if (_flagsTable[236] < 4) {
- _spritesTable[i].state = i + 1;
+ _spritesTable[i]._state = i + 1;
} else {
- _spritesTable[i].state = -1;
+ _spritesTable[i]._state = -1;
}
} else if (i == 3) {
updateSprite_locationNum43_3(3);
@@ -2685,10 +2720,10 @@ void TuckerEngine::updateSprite(int i) {
}
break;
case 45:
- _spritesTable[0].state = 1;
+ _spritesTable[0]._state = 1;
break;
case 47:
- _spritesTable[i].state = i + 1;
+ _spritesTable[i]._state = i + 1;
break;
case 48:
updateSprite_locationNum48(0);
@@ -2700,7 +2735,7 @@ void TuckerEngine::updateSprite(int i) {
if (i < 6) {
updateSprite_locationNum50(i);
} else {
- _spritesTable[i].state = i + 1;
+ _spritesTable[i]._state = i + 1;
}
break;
case 51:
@@ -2782,7 +2817,7 @@ void TuckerEngine::updateSprite(int i) {
break;
case 69:
if (i == 0) {
- _spritesTable[0].state = 1;
+ _spritesTable[0]._state = 1;
} else if (i == 1) {
updateSprite_locationNum69_1(1);
} else if (i == 2) {
@@ -2814,23 +2849,23 @@ void TuckerEngine::updateSprite(int i) {
updateSprite_locationNum82(0);
break;
case 98:
- _spritesTable[0].state = 1;
+ _spritesTable[0]._state = 1;
break;
}
- if (_spritesTable[i].stateIndex <= -1) {
- if (_updateSpriteFlag1 == 0) {
- _spritesTable[i].animationFrame = 1;
+ if (_spritesTable[i]._stateIndex <= -1) {
+ if (!_updateSpriteFlag1) {
+ _spritesTable[i]._animationFrame = 1;
}
- if (_spritesTable[i].state < 0 || !_sprC02Table[_spritesTable[i].state]) {
+ if (_spritesTable[i]._state < 0 || !_sprC02Table[_spritesTable[i]._state]) {
// warning("Invalid state %d for sprite %d location %d", _spritesTable[i].state, i, _locationNum);
return;
}
- _spritesTable[i].animationData = _sprC02Table[_spritesTable[i].state];
- _spritesTable[i].firstFrame = READ_LE_UINT16(_spritesTable[i].animationData);
- if (_updateSpriteFlag2 == 1) {
- _spritesTable[i].state = _spritesTable[i].firstFrame;
- _spritesTable[i].nextAnimationFrame = 1;
- _spritesTable[i].prevAnimationFrame = 1;
+ _spritesTable[i]._animationData = _sprC02Table[_spritesTable[i]._state];
+ _spritesTable[i]._firstFrame = READ_LE_UINT16(_spritesTable[i]._animationData);
+ if (_updateSpriteFlag2) {
+ _spritesTable[i]._state = _spritesTable[i]._firstFrame;
+ _spritesTable[i]._nextAnimationFrame = true;
+ _spritesTable[i]._prevAnimationFrame = true;
}
}
}
@@ -2844,7 +2879,7 @@ void TuckerEngine::drawStringInteger(int num, int x, int y, int digits) {
Graphics::drawStringChar(_locationBackgroundGfxBuf, _scrollOffset + x, y, 640, numStr[i], 102, _charsetGfxBuf);
x += 8;
}
- addDirtyRect(_scrollOffset + x, y, Graphics::_charset.charW * 3, Graphics::_charset.charH);
+ addDirtyRect(_scrollOffset + x, y, Graphics::_charset._charW * 3, Graphics::_charset._charH);
}
void TuckerEngine::drawStringAlt(int x, int y, int color, const uint8 *str, int strLen) {
@@ -2856,7 +2891,7 @@ void TuckerEngine::drawStringAlt(int x, int y, int color, const uint8 *str, int
x += _charWidthTable[chr];
++pos;
}
- addDirtyRect(xStart, y, x - xStart, Graphics::_charset.charH);
+ addDirtyRect(xStart, y, x - xStart, Graphics::_charset._charH);
}
void TuckerEngine::drawItemString(int x, int num, const uint8 *str) {
@@ -2911,15 +2946,15 @@ void TuckerEngine::updateItemsGfxColors(int color1, int color128) {
}
}
-int TuckerEngine::testLocationMask(int x, int y) {
- if (_locationMaskType > 0 || _locationMaskIgnore > 0) {
- return 1;
+bool TuckerEngine::testLocationMask(int x, int y) {
+ if (_locationMaskType > 0 || _locationMaskIgnore) {
+ return true;
}
if (_locationNum == 26 || _locationNum == 32) {
y -= 3;
}
const int offset = y * 640 + x;
- return _locationBackgroundMaskBuf[offset] > 0 ? 1 : 0;
+ return (_locationBackgroundMaskBuf[offset] > 0);
}
int TuckerEngine::getStringWidth(int num, const uint8 *ptr) {
@@ -3096,7 +3131,7 @@ int TuckerEngine::readTableInstructionParam(int len) {
++_tableInstructionsPtr;
--len;
}
- char *end = 0;
+ char *end = nullptr;
const int param = strtol((const char *)_tableInstructionsPtr, &end, 10);
if (end != (const char *)_tableInstructionsPtr + len) {
warning("Unexpected instruction parameter length %d (%d)", (int)(end - (const char *)_tableInstructionsPtr), len);
@@ -3123,7 +3158,7 @@ int TuckerEngine::executeTableInstruction() {
return 0;
case kCode_bub:
i = readTableInstructionParam(3);
- _spriteAnimationFrameIndex = _spriteAnimationsTable[i].firstFrameIndex;
+ _spriteAnimationFrameIndex = _spriteAnimationsTable[i]._firstFrameIndex;
_characterFacingDirection = 5;
_mainLoopCounter2 = 0;
return 0;
@@ -3137,13 +3172,13 @@ int TuckerEngine::executeTableInstruction() {
_selectedCharacterDirection = readTableInstructionParam(2);
return 0;
case kCode_bof:
- _skipCurrentCharacterDraw = 1;
+ _skipCurrentCharacterDraw = true;
return 0;
case kCode_buh:
_noCharacterAnimationChange = readTableInstructionParam(2);
return 0;
case kCode_bon:
- _skipCurrentCharacterDraw = 0;
+ _skipCurrentCharacterDraw = false;
return 0;
case kCode_bso:
_backgroundSprOffset = readTableInstructionParam(3);
@@ -3159,24 +3194,24 @@ int TuckerEngine::executeTableInstruction() {
_charSpeechSoundCounter = kDefaultCharSpeechSoundCounter;
return 0;
case kCode_buw:
- _selectedObject.xPos = readTableInstructionParam(3);
- _selectedObject.yPos = readTableInstructionParam(3);
- _locationMaskIgnore = 1;
- _panelLockedFlag = 1;
+ _selectedObject._xPos = readTableInstructionParam(3);
+ _selectedObject._yPos = readTableInstructionParam(3);
+ _locationMaskIgnore = true;
+ _panelLockedFlag = true;
return 0;
case kCode_bux:
_xPosCurrent = readTableInstructionParam(3);
_yPosCurrent = readTableInstructionParam(3);
return 0;
case kCode_c0a:
- _spritesTable[index].state = readTableInstructionParam(3);
- if (_spritesTable[index].state == 999) {
- _spritesTable[index].state = -1;
+ _spritesTable[index]._state = readTableInstructionParam(3);
+ if (_spritesTable[index]._state == 999) {
+ _spritesTable[index]._state = -1;
}
_mainLoopCounter1 = 0;
- _spritesTable[index].updateDelay = 0;
- _spritesTable[index].nextAnimationFrame = 0;
- _spritesTable[index].prevAnimationFrame = 0;
+ _spritesTable[index]._updateDelay = 0;
+ _spritesTable[index]._nextAnimationFrame = false;
+ _spritesTable[index]._prevAnimationFrame = false;
return 0;
case kCode_c0c:
setCharacterAnimation(readTableInstructionParam(3), index);
@@ -3187,7 +3222,7 @@ int TuckerEngine::executeTableInstruction() {
startSpeechSound(_partNum * 3000 + _ptTextOffset + _speechSoundNum - 3000, kMaxSoundVolume);
_charSpeechSoundCounter = kDefaultCharSpeechSoundCounter;
_actionTextColor = 181 + index;
- if (_tableInstructionFlag == 0) {
+ if (!_tableInstructionFlag) {
_actionPosX = _tableInstructionItemNum1;
_actionPosY = _tableInstructionItemNum2;
} else {
@@ -3210,8 +3245,8 @@ int TuckerEngine::executeTableInstruction() {
return 0;
case kCode_flx:
i = readTableInstructionParam(2);
- _locationSoundsTable[i].type = 2;
- startSound(_locationSoundsTable[i].offset, i, _locationSoundsTable[i].volume);
+ _locationSoundsTable[i]._type = 2;
+ startSound(_locationSoundsTable[i]._offset, i, _locationSoundsTable[i]._volume);
return 0;
case kCode_fxx:
i = readTableInstructionParam(2);
@@ -3221,7 +3256,7 @@ int TuckerEngine::executeTableInstruction() {
return 0;
case kCode_fx:
i = readTableInstructionParam(2);
- startSound(_locationSoundsTable[i].offset, i, _locationSoundsTable[i].volume);
+ startSound(_locationSoundsTable[i]._offset, i, _locationSoundsTable[i]._volume);
_soundInstructionIndex = i;
return 0;
case kCode_gfg:
@@ -3284,12 +3319,12 @@ int TuckerEngine::executeTableInstruction() {
_csDataLoaded = false;
return 3;
case kCode_ssp:
- _tableInstructionFlag = 0;
+ _tableInstructionFlag = false;
_tableInstructionItemNum1 = readTableInstructionParam(3);
_tableInstructionItemNum2 = readTableInstructionParam(3);
return 0;
case kCode_s0p:
- _tableInstructionFlag = 1;
+ _tableInstructionFlag = true;
_tableInstructionObj1Table[index] = readTableInstructionParam(3);
_tableInstructionObj2Table[index] = readTableInstructionParam(3);
return 0;
@@ -3380,21 +3415,21 @@ int TuckerEngine::getObjectUnderCursor() {
return -1;
}
for (int i = 0; i < _locationObjectsCount; ++i) {
- if (_mousePosX + _scrollOffset + 1 <= _locationObjectsTable[i].xPos) {
+ if (_mousePosX + _scrollOffset + 1 <= _locationObjectsTable[i]._xPos) {
continue;
}
- if (_mousePosX + _scrollOffset >= _locationObjectsTable[i].xPos + _locationObjectsTable[i].xSize) {
+ if (_mousePosX + _scrollOffset >= _locationObjectsTable[i]._xPos + _locationObjectsTable[i]._xSize) {
continue;
}
- if (_mousePosY <= _locationObjectsTable[i].yPos) {
+ if (_mousePosY <= _locationObjectsTable[i]._yPos) {
continue;
}
- if (_mousePosY >= _locationObjectsTable[i].yPos + _locationObjectsTable[i].ySize) {
+ if (_mousePosY >= _locationObjectsTable[i]._yPos + _locationObjectsTable[i]._ySize) {
continue;
}
_selectedObjectType = 0;
_selectedCharacterNum = i;
- setCursorNum(_locationObjectsTable[i].cursorNum);
+ setCursorNum(_locationObjectsTable[i]._cursorNum);
return i;
}
return -1;
@@ -3405,127 +3440,127 @@ void TuckerEngine::setSelectedObjectKey() {
if (_mousePosY > 139 && _nextAction == 0) {
return;
}
- _panelLockedFlag = 1;
+ _panelLockedFlag = true;
_locationMaskCounter = 0;
_actionRequiresTwoObjects = false;
- _selectedObject.yPos = 0;
- _selectedObject.locationObject_locationNum = 0;
+ _selectedObject._yPos = 0;
+ _selectedObject._locationObjectLocationNum = 0;
_pendingActionIndex = 0;
if (_selectedObjectType == 0) {
if (_selectedObjectNum == 0) {
- _selectedObject.xPos = x;
- _selectedObject.yPos = _mousePosY;
+ _selectedObject._xPos = x;
+ _selectedObject._yPos = _mousePosY;
} else {
- _selectedObject.xPos = _locationObjectsTable[_selectedCharacterNum].standX;
- _selectedObject.yPos = _locationObjectsTable[_selectedCharacterNum].standY;
+ _selectedObject._xPos = _locationObjectsTable[_selectedCharacterNum]._standX;
+ _selectedObject._yPos = _locationObjectsTable[_selectedCharacterNum]._standY;
if (_actionVerb == 0 || _actionVerb == 8) {
- _selectedObject.locationObject_locationNum = _locationObjectsTable[_selectedCharacterNum].locationNum;
- _selectedObject.locationObject_toX = _locationObjectsTable[_selectedCharacterNum].toX;
- _selectedObject.locationObject_toY = _locationObjectsTable[_selectedCharacterNum].toY;
- _selectedObject.locationObject_toX2 = _locationObjectsTable[_selectedCharacterNum].toX2;
- _selectedObject.locationObject_toY2 = _locationObjectsTable[_selectedCharacterNum].toY2;
- _selectedObject.locationObject_toWalkX2 = _locationObjectsTable[_selectedCharacterNum].toWalkX2;
- _selectedObject.locationObject_toWalkY2 = _locationObjectsTable[_selectedCharacterNum].toWalkY2;
+ _selectedObject._locationObjectLocationNum = _locationObjectsTable[_selectedCharacterNum]._locationNum;
+ _selectedObject._locationObjectToX = _locationObjectsTable[_selectedCharacterNum]._toX;
+ _selectedObject._locationObjectToY = _locationObjectsTable[_selectedCharacterNum]._toY;
+ _selectedObject._locationObjectToX2 = _locationObjectsTable[_selectedCharacterNum]._toX2;
+ _selectedObject._locationObjectToY2 = _locationObjectsTable[_selectedCharacterNum]._toY2;
+ _selectedObject._locationObjectToWalkX2 = _locationObjectsTable[_selectedCharacterNum]._toWalkX2;
+ _selectedObject._locationObjectToWalkY2 = _locationObjectsTable[_selectedCharacterNum]._toWalkY2;
}
}
} else {
switch (_selectedObjectType) {
case 1:
- _selectedObject.xPos = _locationAnimationsTable[_selectedCharacterNum].standX;
- _selectedObject.yPos = _locationAnimationsTable[_selectedCharacterNum].standY;
+ _selectedObject._xPos = _locationAnimationsTable[_selectedCharacterNum]._standX;
+ _selectedObject._yPos = _locationAnimationsTable[_selectedCharacterNum]._standY;
break;
case 2:
- _selectedObject.xPos = _charPosTable[_selectedCharacterNum].xWalkTo;
- _selectedObject.yPos = _charPosTable[_selectedCharacterNum].yWalkTo;
+ _selectedObject._xPos = _charPosTable[_selectedCharacterNum]._xWalkTo;
+ _selectedObject._yPos = _charPosTable[_selectedCharacterNum]._yWalkTo;
break;
case 3:
- _selectedObject.xPos = _xPosCurrent;
- _selectedObject.yPos = _yPosCurrent;
+ _selectedObject._xPos = _xPosCurrent;
+ _selectedObject._yPos = _yPosCurrent;
break;
}
}
- if (_selectedObject.yPos == 0) {
- _selectedObject.xPos = x;
- _selectedObject.yPos = _mousePosY;
+ if (_selectedObject._yPos == 0) {
+ _selectedObject._xPos = x;
+ _selectedObject._yPos = _mousePosY;
}
- _selectedObjectLocationMask = testLocationMask(_selectedObject.xPos, _selectedObject.yPos);
- if (_selectedObjectLocationMask == 0 && _objectKeysLocationTable[_locationNum] == 1) {
- if (_selectedObject.yPos < _objectKeysPosYTable[_locationNum]) {
- while (_selectedObjectLocationMask == 0 && _selectedObject.yPos < _objectKeysPosYTable[_locationNum]) {
- ++_selectedObject.yPos;
- _selectedObjectLocationMask = testLocationMask(_selectedObject.xPos, _selectedObject.yPos);
+ _selectedObjectLocationMask = testLocationMask(_selectedObject._xPos, _selectedObject._yPos);
+ if (!_selectedObjectLocationMask && _objectKeysLocationTable[_locationNum] == 1) {
+ if (_selectedObject._yPos < _objectKeysPosYTable[_locationNum]) {
+ while (!_selectedObjectLocationMask && _selectedObject._yPos < _objectKeysPosYTable[_locationNum]) {
+ ++_selectedObject._yPos;
+ _selectedObjectLocationMask = testLocationMask(_selectedObject._xPos, _selectedObject._yPos);
}
} else {
- while (_selectedObjectLocationMask == 0 && _selectedObject.yPos < _objectKeysPosYTable[_locationNum]) {
- --_selectedObject.yPos;
- _selectedObjectLocationMask = testLocationMask(_selectedObject.xPos, _selectedObject.yPos);
+ while (!_selectedObjectLocationMask && _selectedObject._yPos < _objectKeysPosYTable[_locationNum]) {
+ --_selectedObject._yPos;
+ _selectedObjectLocationMask = testLocationMask(_selectedObject._xPos, _selectedObject._yPos);
}
}
}
- if (_selectedObjectLocationMask == 1) {
- _selectedObjectLocationMask = testLocationMaskArea(_xPosCurrent, _yPosCurrent, _selectedObject.xPos, _selectedObject.yPos);
- if (_selectedObjectLocationMask == 1 && _objectKeysPosXTable[_locationNum] > 0) {
- _selectedObject.xDefaultPos = _selectedObject.xPos;
- _selectedObject.yDefaultPos = _selectedObject.yPos;
- _selectedObject.xPos = _objectKeysPosXTable[_locationNum];
- _selectedObject.yPos = _objectKeysPosYTable[_locationNum];
+ if (_selectedObjectLocationMask) {
+ _selectedObjectLocationMask = testLocationMaskArea(_xPosCurrent, _yPosCurrent, _selectedObject._xPos, _selectedObject._yPos);
+ if (_selectedObjectLocationMask && _objectKeysPosXTable[_locationNum] > 0) {
+ _selectedObject._xDefaultPos = _selectedObject._xPos;
+ _selectedObject._yDefaultPos = _selectedObject._yPos;
+ _selectedObject._xPos = _objectKeysPosXTable[_locationNum];
+ _selectedObject._yPos = _objectKeysPosYTable[_locationNum];
if (_objectKeysLocationTable[_locationNum] == 1) {
- _selectedObject.xPos = _selectedObject.xDefaultPos;
+ _selectedObject._xPos = _selectedObject._xDefaultPos;
}
}
}
}
void TuckerEngine::setCharacterAnimation(int count, int spr) {
- _spritesTable[spr].animationFrame = 0;
- _spritesTable[spr].stateIndex = 0;
+ _spritesTable[spr]._animationFrame = 0;
+ _spritesTable[spr]._stateIndex = 0;
for (int i = 0; i < count; ++i) {
- while (_characterStateTable[_spritesTable[spr].stateIndex] != 99) {
- ++_spritesTable[spr].stateIndex;
+ while (_characterStateTable[_spritesTable[spr]._stateIndex] != 99) {
+ ++_spritesTable[spr]._stateIndex;
}
- ++_spritesTable[spr].stateIndex;
+ ++_spritesTable[spr]._stateIndex;
}
- _spritesTable[spr].state = _characterStateTable[_spritesTable[spr].stateIndex];
- ++_spritesTable[spr].stateIndex;
- _spritesTable[spr].animationFrame = _characterStateTable[_spritesTable[spr].stateIndex];
- ++_spritesTable[spr].stateIndex;
- _spritesTable[spr].animationData = _sprC02Table[_spritesTable[spr].state];
- _spritesTable[spr].firstFrame = READ_LE_UINT16(_spritesTable[spr].animationData);
+ _spritesTable[spr]._state = _characterStateTable[_spritesTable[spr]._stateIndex];
+ ++_spritesTable[spr]._stateIndex;
+ _spritesTable[spr]._animationFrame = _characterStateTable[_spritesTable[spr]._stateIndex];
+ ++_spritesTable[spr]._stateIndex;
+ _spritesTable[spr]._animationData = _sprC02Table[_spritesTable[spr]._state];
+ _spritesTable[spr]._firstFrame = READ_LE_UINT16(_spritesTable[spr]._animationData);
}
-int TuckerEngine::testLocationMaskArea(int xBase, int yBase, int xPos, int yPos) {
+bool TuckerEngine::testLocationMaskArea(int xBase, int yBase, int xPos, int yPos) {
while (true) {
bool loop = false;
if (yBase > yPos) {
- if (testLocationMask(xBase, yBase - 1) == 1) {
+ if (testLocationMask(xBase, yBase - 1)) {
--yBase;
loop = true;
}
} else if (yBase < yPos) {
- if (testLocationMask(xBase, yBase + 1) == 1) {
+ if (testLocationMask(xBase, yBase + 1)) {
++yBase;
loop = true;
}
}
if (xBase > xPos) {
- if (testLocationMask(xBase - 1, yBase) == 1) {
+ if (testLocationMask(xBase - 1, yBase)) {
--xBase;
loop = true;
}
} else if (xBase < xPos) {
- if (testLocationMask(xBase + 1, yBase) == 1) {
+ if (testLocationMask(xBase + 1, yBase)) {
++xBase;
loop = true;
}
}
if (xBase == xPos && yBase == yPos) {
- return 0;
+ return false;
}
if (!loop) {
break;
}
}
- return 1;
+ return true;
}
void TuckerEngine::handleMouseClickOnInventoryObject() {
@@ -3548,7 +3583,7 @@ void TuckerEngine::handleMouseClickOnInventoryObject() {
_selectedObjectType = 0;
_selectedObjectNum = 0;
_actionVerb = 0;
- _actionVerbLocked = 0;
+ _actionVerbLocked = false;
_forceRedrawPanelItems = true;
_panelState = 2;
setCursorType(1);
@@ -3573,7 +3608,7 @@ void TuckerEngine::handleMouseClickOnInventoryObject() {
_actionVerb = 0;
_selectedObjectType = 0;
_selectedObjectNum = 0;
- _actionVerbLocked = 0;
+ _actionVerbLocked = false;
}
}
break;
@@ -3585,23 +3620,23 @@ int TuckerEngine::setCharacterUnderCursor() {
return -1;
}
for (int i = 0; i < _charPosCount; ++i) {
- if (_mousePosX + _scrollOffset <= _charPosTable[i].xPos) {
+ if (_mousePosX + _scrollOffset <= _charPosTable[i]._xPos) {
continue;
}
- if (_mousePosX + _scrollOffset >= _charPosTable[i].xPos + _charPosTable[i].xSize) {
+ if (_mousePosX + _scrollOffset >= _charPosTable[i]._xPos + _charPosTable[i]._xSize) {
continue;
}
- if (_mousePosY <= _charPosTable[i].yPos) {
+ if (_mousePosY <= _charPosTable[i]._yPos) {
continue;
}
- if (_mousePosY >= _charPosTable[i].yPos + _charPosTable[i].ySize) {
+ if (_mousePosY >= _charPosTable[i]._yPos + _charPosTable[i]._ySize) {
continue;
}
- if (_charPosTable[i].flagNum == 0 || _flagsTable[_charPosTable[i].flagNum] == _charPosTable[i].flagValue) {
+ if (_charPosTable[i]._flagNum == 0 || _flagsTable[_charPosTable[i]._flagNum] == _charPosTable[i]._flagValue) {
_selectedObjectType = 2;
- _selectedCharacterDirection = _charPosTable[i].direction;
+ _selectedCharacterDirection = _charPosTable[i]._direction;
_selectedCharacterNum = i;
- return _charPosTable[i].name;
+ return _charPosTable[i]._name;
}
}
return -1;
@@ -3612,29 +3647,29 @@ int TuckerEngine::setLocationAnimationUnderCursor() {
return -1;
}
for (int i = _locationAnimationsCount - 1; i >= 0; --i) {
- if (_locationAnimationsTable[i].drawFlag == 0) {
+ if (!_locationAnimationsTable[i]._drawFlag)
continue;
- }
- int num = _locationAnimationsTable[i].graphicNum;
- if (_mousePosX + _scrollOffset + 1 <= _dataTable[num].xDest) {
+
+ int num = _locationAnimationsTable[i]._graphicNum;
+ if (_mousePosX + _scrollOffset + 1 <= _dataTable[num]._xDest) {
continue;
}
- if (_mousePosX + _scrollOffset >= _dataTable[num].xDest + _dataTable[num].xSize) {
+ if (_mousePosX + _scrollOffset >= _dataTable[num]._xDest + _dataTable[num]._xSize) {
continue;
}
- if (_mousePosY <= _dataTable[num].yDest) {
+ if (_mousePosY <= _dataTable[num]._yDest) {
continue;
}
- if (_mousePosY >= _dataTable[num].yDest + _dataTable[num].ySize) {
+ if (_mousePosY >= _dataTable[num]._yDest + _dataTable[num]._ySize) {
continue;
}
- if (_locationAnimationsTable[i].selectable == 0) {
+ if (_locationAnimationsTable[i]._selectable == 0) {
return -1;
}
_selectedObjectType = 1;
_selectedCharacterNum = i;
_selectedCharacter2Num = i;
- return _locationAnimationsTable[i].selectable;
+ return _locationAnimationsTable[i]._selectable;
}
return -1;
}
@@ -3642,14 +3677,14 @@ int TuckerEngine::setLocationAnimationUnderCursor() {
void TuckerEngine::setActionForInventoryObject() {
if (_actionVerb == 0 || _actionVerb == 2 || _actionVerb == 6 || _actionVerb == 7) {
playSpeechForAction(_actionVerb);
- _actionVerbLocked = 0;
+ _actionVerbLocked = false;
_actionRequiresTwoObjects = false;
return;
}
if (_actionVerb == 3 || _actionVerb == 4) {
if (!(_partNum == 2 && _selectedObjectNum == 19) && !(_partNum == 3 && _selectedObjectNum == 42)) {
playSpeechForAction(_actionVerb);
- _actionVerbLocked = 0;
+ _actionVerbLocked = false;
_actionRequiresTwoObjects = false;
return;
}
@@ -3659,13 +3694,13 @@ void TuckerEngine::setActionForInventoryObject() {
_currentActionObj2Num = _actionObj2Num;
_currentInfoString2SourceType = _actionObj2Type;
if (_actionVerb == 1 && _selectedObjectType == 3) {
- if (_panelLockedFlag == 1) {
+ if (_panelLockedFlag) {
if (_locationMaskType != 0) {
return;
}
- _panelLockedFlag = 0;
+ _panelLockedFlag = false;
}
- if (handleSpecialObjectSelectionSequence() == 1) {
+ if (handleSpecialObjectSelectionSequence()) {
return;
}
_speechSoundNum = _actionObj1Num + _speechSoundBaseNum;
@@ -3678,14 +3713,15 @@ void TuckerEngine::setActionForInventoryObject() {
_actionCharacterNum = 99;
setCursorType(2);
_charSpeechSoundCounter = kDefaultCharSpeechSoundCounter;
- _actionVerbLocked = 0;
+ _actionVerbLocked = false;
_actionRequiresTwoObjects = false;
return;
}
- if ((_partNum == 3 && (_actionObj1Num == 6 || _actionObj1Num == 3 || _actionObj1Num == 17)) ||
+ // Items with unary usage i.e. "Use X", rather than "Use X on Y"
+ if ((_partNum == 3 && (_actionObj1Num == 6 || _actionObj1Num == 3 || _actionObj1Num == 17 || _actionObj1Num == 33)) ||
(_partNum == 2 && _actionObj1Num == 19) ||
(_partNum == 3 && (_actionObj1Num == 42 && _selectedObjectNum == 18)) ) {
- _actionVerbLocked = 0;
+ _actionVerbLocked = false;
_actionRequiresTwoObjects = false;
_locationMaskCounter = 1;
setActionState();
@@ -3694,7 +3730,7 @@ void TuckerEngine::setActionForInventoryObject() {
if (!_actionRequiresTwoObjects) {
_actionRequiresTwoObjects = true;
} else {
- _actionVerbLocked = 0;
+ _actionVerbLocked = false;
_actionRequiresTwoObjects = false;
_locationMaskCounter = 1;
setActionState();
@@ -3754,12 +3790,12 @@ void TuckerEngine::drawSpeechText(int xStart, int y, const uint8 *dataPtr, int n
}
}
int count = 0;
- int flag = 0;
+ bool flag = false;
struct {
int w, count, offset;
} lines[5];
lines[0].offset = getPositionForLine(num, dataPtr);
- while (flag == 0 && count < 4) {
+ while (!flag && count < 4) {
int lineCharsCount, lineWidth;
flag = splitSpeechTextLines(dataPtr, lines[count].offset, x, lineCharsCount, lineWidth);
lines[count].w = lineWidth;
@@ -3788,7 +3824,7 @@ void TuckerEngine::drawSpeechText(int xStart, int y, const uint8 *dataPtr, int n
}
}
-int TuckerEngine::splitSpeechTextLines(const uint8 *dataPtr, int pos, int x, int &lineCharsCount, int &lineWidth) {
+bool TuckerEngine::splitSpeechTextLines(const uint8 *dataPtr, int pos, int x, int &lineCharsCount, int &lineWidth) {
int count = 0;
int w = 0;
lineCharsCount = 0;
@@ -3802,11 +3838,11 @@ int TuckerEngine::splitSpeechTextLines(const uint8 *dataPtr, int pos, int x, int
++count;
++pos;
}
- int ret = 0;
+ bool ret = false;
if (x + 1 > w) {
lineCharsCount = count;
lineWidth = w;
- ret = 1;
+ ret = true;
}
return ret;
}
@@ -3818,7 +3854,7 @@ void TuckerEngine::drawSpeechTextLine(const uint8 *dataPtr, int pos, int count,
x += _charWidthTable[dataPtr[pos]];
++pos;
}
- addDirtyRect(xStart, y, x - xStart, Graphics::_charset.charH);
+ addDirtyRect(xStart, y, x - xStart, Graphics::_charset._charH);
}
void TuckerEngine::redrawScreen(int offset) {
diff --git a/engines/tucker/tucker.h b/engines/tucker/tucker.h
index c9e4d986bb..a423915a5f 100644
--- a/engines/tucker/tucker.h
+++ b/engines/tucker/tucker.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -53,133 +53,133 @@ class RewindableAudioStream;
namespace Tucker {
struct Action {
- int key;
- int testFlag1Num;
- int testFlag1Value;
- int testFlag2Num;
- int testFlag2Value;
- int speech;
- int flipX;
- int index;
- int delay;
- int setFlagNum;
- int setFlagValue;
- int fxNum;
- int fxDelay;
+ int _key;
+ int _testFlag1Num;
+ int _testFlag1Value;
+ int _testFlag2Num;
+ int _testFlag2Value;
+ int _speech;
+ int _flipX;
+ int _index;
+ int _delay;
+ int _setFlagNum;
+ int _setFlagValue;
+ int _fxNum;
+ int _fxDelay;
};
struct Sprite {
- int state;
- int gfxBackgroundOffset;
- int updateDelay;
- int backgroundOffset;
- int needUpdate;
- int stateIndex;
- int counter;
- int disabled;
- int colorType;
- int animationFrame;
- int firstFrame;
- uint8 *animationData;
- int prevState;
- int nextAnimationFrame;
- int prevAnimationFrame;
- int defaultUpdateDelay;
- int xSource;
- int yMaxBackground;
- int flipX;
+ int _state;
+ int _gfxBackgroundOffset;
+ int _updateDelay;
+ int _backgroundOffset;
+ int _stateIndex;
+ int _counter;
+ int _colorType;
+ int _animationFrame;
+ int _firstFrame;
+ uint8 *_animationData;
+ int _prevState;
+ int _defaultUpdateDelay;
+ int _xSource;
+ int _yMaxBackground;
+ bool _disabled;
+ bool _flipX;
+ bool _needUpdate;
+ bool _nextAnimationFrame;
+ bool _prevAnimationFrame;
};
struct CharPos {
- int xPos;
- int yPos;
- int xSize;
- int ySize;
- int xWalkTo;
- int yWalkTo;
- int flagNum;
- int flagValue;
- int direction;
- int name;
- int description;
+ int _xPos;
+ int _yPos;
+ int _xSize;
+ int _ySize;
+ int _xWalkTo;
+ int _yWalkTo;
+ int _flagNum;
+ int _flagValue;
+ int _direction;
+ int _name;
+ int _description;
};
struct SpriteFrame {
- int sourceOffset;
- int xOffset;
- int yOffset;
- int xSize;
- int ySize;
+ int _sourceOffset;
+ int _xOffset;
+ int _yOffset;
+ int _xSize;
+ int _ySize;
};
struct SpriteAnimation {
- int numParts;
- int rotateFlag;
- int firstFrameIndex;
+ int _numParts;
+ int _rotateFlag; // Useless variable
+ int _firstFrameIndex;
};
struct Data {
- int sourceOffset;
- int xSize;
- int ySize;
- int xDest;
- int yDest;
- int index;
+ int _sourceOffset;
+ int _xSize;
+ int _ySize;
+ int _xDest;
+ int _yDest;
+ int _index;
};
struct LocationAnimation {
- int graphicNum;
- int animInitCounter;
- int animCurrentCounter;
- int animLastCounter;
- int getFlag;
- int inventoryNum;
- int flagNum;
- int flagValue;
- int selectable;
- int standX;
- int standY;
- int drawFlag;
+ int _graphicNum;
+ int _animInitCounter;
+ int _animCurrentCounter;
+ int _animLastCounter;
+ int _getFlag;
+ int _inventoryNum;
+ int _flagNum;
+ int _flagValue;
+ int _selectable;
+ int _standX;
+ int _standY;
+ bool _drawFlag;
};
struct LocationObject {
- int xPos;
- int yPos;
- int xSize;
- int ySize;
- int textNum;
- int locationNum;
- int toX;
- int toY;
- int toX2;
- int toY2;
- int toWalkX2;
- int toWalkY2;
- int standX;
- int standY;
- int cursorNum;
+ int _xPos;
+ int _yPos;
+ int _xSize;
+ int _ySize;
+ int _textNum;
+ int _locationNum;
+ int _toX;
+ int _toY;
+ int _toX2;
+ int _toY2;
+ int _toWalkX2;
+ int _toWalkY2;
+ int _standX;
+ int _standY;
+ int _cursorNum;
};
struct LocationSound {
- int startFxSpriteState;
- int startFxSpriteNum;
- int updateType;
- int stopFxSpriteState;
- int stopFxSpriteNum;
- int offset;
- int type;
- int volume;
- int flagValueStartFx;
- int flagValueStopFx;
- int flagNum;
- int num;
+ int _startFxSpriteState;
+ int _startFxSpriteNum;
+ int _updateType;
+ int _stopFxSpriteState;
+ int _stopFxSpriteNum;
+ int _offset;
+ int _type;
+ int _volume;
+ int _flagValueStartFx;
+ int _flagValueStopFx;
+ int _flagNum;
+ int _num;
};
struct LocationMusic {
- int flag;
- int offset;
- int volume;
- int num;
+ int _flag;
+ int _offset;
+ int _volume;
+ int _num;
};
enum {
@@ -232,7 +232,7 @@ enum CompressedSoundType {
class CompressedSound {
public:
- CompressedSound() : _compressedSoundType(-1) {}
+ CompressedSound() : _compressedSoundType(-1), _compressedSoundFlags(0) {}
void openFile();
void closeFile();
@@ -284,7 +284,7 @@ protected:
int getRandomNumber();
void allocateBuffers();
void freeBuffers();
- void restart();
+ void resetVariables();
void mainLoop();
void waitForTimer(int ticksCount);
void parseEvents();
@@ -356,7 +356,7 @@ protected:
void drawCreditsString(int x, int y, int num);
void updateCharSpeechSound(bool displayText);
void updateItemsGfxColors(int bit0, int bit7);
- int testLocationMask(int x, int y);
+ bool testLocationMask(int x, int y);
int getStringWidth(int num, const uint8 *ptr);
int getPositionForLine(int num, const uint8 *ptr);
void resetCharacterAnimationIndex(int count);
@@ -369,7 +369,7 @@ protected:
int getObjectUnderCursor();
void setSelectedObjectKey();
void setCharacterAnimation(int count, int spr);
- int testLocationMaskArea(int xBase, int yBase, int xPos, int yPos);
+ bool testLocationMaskArea(int xBase, int yBase, int xPos, int yPos);
void handleMouseClickOnInventoryObject();
int setCharacterUnderCursor();
int setLocationAnimationUnderCursor();
@@ -377,7 +377,7 @@ protected:
void setActionState();
void playSpeechForAction(int i);
void drawSpeechText(int xStart, int y, const uint8 *dataPtr, int num, int color);
- int splitSpeechTextLines(const uint8 *dataPtr, int pos, int x, int &lineCharsCount, int &lineWidth);
+ bool splitSpeechTextLines(const uint8 *dataPtr, int pos, int x, int &lineCharsCount, int &lineWidth);
void drawSpeechTextLine(const uint8 *dataPtr, int pos, int count, int x, int y, uint8 color);
void redrawScreen(int offset);
void redrawScreenRect(const Common::Rect &clip, const Common::Rect &dirty);
@@ -578,7 +578,7 @@ protected:
void handleMeanwhileSequence();
void handleMapSequence();
void copyMapRect(int x, int y, int w, int h);
- int handleSpecialObjectSelectionSequence();
+ bool handleSpecialObjectSelectionSequence();
uint8 *loadFile(const char *filename, uint8 *p);
void loadImage(const char *filename, uint8 *dst, int a);
@@ -613,6 +613,7 @@ protected:
CompressedSound _compressedSound;
Common::Language _gameLang;
uint32 _gameFlags;
+ int _startSlot;
bool _quitGame;
bool _fastMode;
@@ -630,14 +631,14 @@ protected:
bool _gameDebug;
bool _displayGameHints;
int _execData3Counter;
- bool _displaySpeechText;
int _currentSaveLoadGameState;
-
int _gameHintsIndex;
int _gameHintsCounter;
- int _gameHintsDisplayText;
int _gameHintsStringNum;
+ bool _displaySpeechText;
+ bool _displayHintsText;
+
int _fileLoadSize;
uint8 *_loadTempBuf;
uint8 *_cursorGfxBuf;
@@ -685,7 +686,7 @@ protected:
int _switchPanelCounter;
int _conversationOptionsCount;
bool _fadedPanel;
- int _panelLockedFlag;
+ bool _panelLockedFlag;
int _conversationOptionLinesCount;
int _inventoryItemsState[50];
int _inventoryObjectsList[40];
@@ -742,22 +743,22 @@ protected:
int _actionObj1Type, _actionObj2Type;
int _actionObj1Num, _actionObj2Num;
bool _actionRequiresTwoObjects;
- int _actionVerbLocked;
+ bool _actionVerbLocked;
int _actionPosX;
int _actionPosY;
- int _selectedObjectLocationMask;
+ bool _selectedObjectLocationMask;
struct {
- int xDefaultPos;
- int yDefaultPos;
- int xPos;
- int yPos;
- int locationObject_locationNum;
- int locationObject_toX;
- int locationObject_toY;
- int locationObject_toX2;
- int locationObject_toY2;
- int locationObject_toWalkX2;
- int locationObject_toWalkY2;
+ int _xDefaultPos;
+ int _yDefaultPos;
+ int _xPos;
+ int _yPos;
+ int _locationObjectLocationNum;
+ int _locationObjectToX;
+ int _locationObjectToY;
+ int _locationObjectToX2;
+ int _locationObjectToY2;
+ int _locationObjectToWalkX2;
+ int _locationObjectToWalkY2;
} _selectedObject;
int _selectedCharacterDirection;
int _selectedCharacter2Num;
@@ -780,7 +781,7 @@ protected:
const uint8 *_tableInstructionsPtr;
int _tableInstructionObj1Table[6];
int _tableInstructionObj2Table[6];
- int _tableInstructionFlag;
+ bool _tableInstructionFlag;
int _tableInstructionItemNum1, _tableInstructionItemNum2;
int _instructionsActionsTable[6];
bool _validInstructionId;
@@ -810,21 +811,21 @@ protected:
int _characterAnimationIndex;
int _characterFacingDirection;
int _characterPrevFacingDirection;
- int _characterBackFrontFacing;
- int _characterPrevBackFrontFacing;
+ bool _characterBackFrontFacing;
+ bool _characterPrevBackFrontFacing;
int _characterAnimationNum;
int _noCharacterAnimationChange;
- int _changeBackgroundSprite;
int _characterSpriteAnimationFrameCounter;
- int _locationMaskIgnore;
+ bool _locationMaskIgnore;
int _locationMaskType;
int _locationMaskCounter;
- int _updateSpriteFlag1;
- int _updateSpriteFlag2;
int _handleMapCounter;
bool _noPositionChangeAfterMap;
+ bool _changeBackgroundSprite;
+ bool _updateSpriteFlag1;
+ bool _updateSpriteFlag2;
- int _mirroredDrawing;
+ bool _mirroredDrawing;
uint8 *_loadLocBufPtr;
uint8 *_backgroundSpriteDataPtr;
int _locationHeight;
@@ -848,7 +849,7 @@ protected:
int _updateLocation14ObjNum[10];
int _updateLocation14Delay[10];
int _updateLocationCounter2;
- int _updateLocationFlag;
+ bool _updateLocationFlag;
int _updateLocation70StringLen;
uint8 _updateLocation70String[20];
diff --git a/engines/util.h b/engines/util.h
index 53899cb341..0e7b1e118b 100644
--- a/engines/util.h
+++ b/engines/util.h
@@ -17,6 +17,7 @@
* You should have received a copy of the GNU General Public 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 ENGINES_UTIL_H
diff --git a/engines/voyeur/animation.cpp b/engines/voyeur/animation.cpp
new file mode 100644
index 0000000000..62b37346da
--- /dev/null
+++ b/engines/voyeur/animation.cpp
@@ -0,0 +1,501 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public 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 "voyeur/animation.h"
+#include "voyeur/staticres.h"
+#include "voyeur/voyeur.h"
+#include "common/endian.h"
+#include "common/memstream.h"
+#include "common/system.h"
+#include "audio/decoders/raw.h"
+#include "graphics/surface.h"
+
+namespace Voyeur {
+
+// Number of audio frames to keep audio track topped up when playing back video
+#define SOUND_FRAMES_READAHEAD 3
+
+RL2Decoder::RL2Decoder(Audio::Mixer::SoundType soundType) : _soundType(soundType) {
+ _paletteStart = 0;
+ _fileStream = nullptr;
+ _soundFrameNumber = -1;
+
+ _audioTrack = nullptr;
+ _videoTrack = nullptr;
+}
+
+RL2Decoder::~RL2Decoder() {
+ close();
+}
+
+bool RL2Decoder::loadVideo(int videoId) {
+ Common::String filename = Common::String::format("%s.rl2",
+ ::Voyeur::SZ_FILENAMES[videoId * 2]);
+ return loadRL2File(filename, false);
+}
+
+bool RL2Decoder::loadRL2File(const Common::String &file, bool palFlag) {
+ bool result = VideoDecoder::loadFile(file);
+ _paletteStart = palFlag ? 0 : 128;
+ return result;
+}
+
+bool RL2Decoder::loadStream(Common::SeekableReadStream *stream) {
+ close();
+
+ // Load basic file information
+ _fileStream = stream;
+ _header.load(stream);
+ _paletteStart = 0;
+
+ // Check RL2 magic number
+ if (!_header.isValid()) {
+ warning("RL2Decoder::loadStream(): attempted to load non-RL2 data (0x%08X)", _header._signature);
+ return false;
+ }
+
+ // Add an audio track if sound is present
+ _audioTrack = nullptr;
+ if (_header._soundRate) {
+ _audioTrack = new RL2AudioTrack(_header, stream, _soundType);
+ addTrack(_audioTrack);
+ }
+
+ // Create a video track
+ _videoTrack = new RL2VideoTrack(_header, _audioTrack, stream);
+ addTrack(_videoTrack);
+
+ // Load the offset/sizes of the video's audio data
+ _soundFrames.reserve(_header._numFrames);
+ for (int frameNumber = 0; frameNumber < _header._numFrames; ++frameNumber) {
+ int offset = _header._frameOffsets[frameNumber];
+ int size = _header._frameSoundSizes[frameNumber];
+
+ _soundFrames.push_back(SoundFrame(offset, size));
+ }
+
+ return true;
+}
+
+const Common::List<Common::Rect> *RL2Decoder::getDirtyRects() const {
+ if (_videoTrack)
+ return _videoTrack->getDirtyRects();
+
+ return nullptr;
+}
+
+void RL2Decoder::clearDirtyRects() {
+ if (_videoTrack)
+ _videoTrack->clearDirtyRects();
+}
+
+void RL2Decoder::copyDirtyRectsToBuffer(uint8 *dst, uint pitch) {
+ if (_videoTrack)
+ _videoTrack->copyDirtyRectsToBuffer(dst, pitch);
+}
+
+void RL2Decoder::readNextPacket() {
+ int frameNumber = getCurFrame();
+ RL2AudioTrack *audioTrack = getRL2AudioTrack();
+
+ // Handle queueing sound data
+ if (_soundFrameNumber == -1)
+ _soundFrameNumber = (frameNumber == -1) ? 0 : frameNumber;
+
+ while (audioTrack->numQueuedStreams() < SOUND_FRAMES_READAHEAD &&
+ (_soundFrameNumber < (int)_soundFrames.size())) {
+ _fileStream->seek(_soundFrames[_soundFrameNumber]._offset);
+ audioTrack->queueSound(_fileStream, _soundFrames[_soundFrameNumber]._size);
+ ++_soundFrameNumber;
+ }
+}
+
+bool RL2Decoder::seekIntern(const Audio::Timestamp &where) {
+ _soundFrameNumber = -1;
+ return VideoDecoder::seekIntern(where);
+}
+
+void RL2Decoder::close() {
+ VideoDecoder::close();
+ delete _fileStream;
+ _fileStream = nullptr;
+ _soundFrameNumber = -1;
+}
+
+/*------------------------------------------------------------------------*/
+
+RL2Decoder::SoundFrame::SoundFrame(int offset, int size) {
+ _offset = offset;
+ _size = size;
+}
+
+/*------------------------------------------------------------------------*/
+
+RL2Decoder::RL2FileHeader::RL2FileHeader() {
+ _frameOffsets = nullptr;
+ _frameSoundSizes = nullptr;
+
+ _channels = 0;
+ _colorCount = 0;
+ _numFrames = 0;
+ _rate = 0;
+ _soundRate = 0;
+ _videoBase = 0;
+ _backSize = 0;
+ _signature = MKTAG('N', 'O', 'N', 'E');
+ _form = 0;
+ _dataSize = 0;
+ _method = 0;
+ _defSoundSize = 0;
+}
+
+RL2Decoder::RL2FileHeader::~RL2FileHeader() {
+ delete[] _frameOffsets;
+ delete[] _frameSoundSizes;
+}
+
+void RL2Decoder::RL2FileHeader::load(Common::SeekableReadStream *stream) {
+ stream->seek(0);
+
+ _form = stream->readUint32LE();
+ _backSize = stream->readUint32LE();
+ _signature = stream->readUint32BE();
+
+ if (!isValid())
+ return;
+
+ _dataSize = stream->readUint32LE();
+ _numFrames = stream->readUint32LE();
+ _method = stream->readUint16LE();
+ _soundRate = stream->readUint16LE();
+ _rate = stream->readUint16LE();
+ _channels = stream->readUint16LE();
+ _defSoundSize = stream->readUint16LE();
+ _videoBase = stream->readUint16LE();
+ _colorCount = stream->readUint32LE();
+ assert(_colorCount <= 256);
+
+ stream->read(_palette, 768);
+
+ // Skip over background frame, if any, and the list of overall frame sizes (which we don't use)
+ stream->skip(_backSize + 4 * _numFrames);
+
+ // Load frame offsets
+ delete[] _frameOffsets;
+ _frameOffsets = new uint32[_numFrames];
+ for (int i = 0; i < _numFrames; ++i)
+ _frameOffsets[i] = stream->readUint32LE();
+
+ // Load the size of the sound portion of each frame
+ delete[] _frameSoundSizes;
+ _frameSoundSizes = new int[_numFrames];
+ for (int i = 0; i < _numFrames; ++i)
+ _frameSoundSizes[i] = stream->readUint32LE() & 0xffff;
+}
+
+bool RL2Decoder::RL2FileHeader::isValid() const {
+ return _signature == MKTAG('R','L','V','2') || _signature == MKTAG('R','L','V','3');
+}
+
+Common::Rational RL2Decoder::RL2FileHeader::getFrameRate() const {
+ return (_soundRate > 0) ? Common::Rational(_rate, _defSoundSize) :
+ Common::Rational(11025, 1103);
+}
+
+/*------------------------------------------------------------------------*/
+
+RL2Decoder::RL2VideoTrack::RL2VideoTrack(const RL2FileHeader &header, RL2AudioTrack *audioTrack,
+ Common::SeekableReadStream *stream): _header(header), _fileStream(stream) {
+
+ _frameOffsets = nullptr;
+
+ // Set up surfaces
+ _surface = new Graphics::Surface();
+ _surface->create(320, 200, Graphics::PixelFormat::createFormatCLUT8());
+ _backSurface = nullptr;
+
+ _hasBackFrame = header._backSize != 0;
+ if (_hasBackFrame)
+ initBackSurface();
+
+ _videoBase = header._videoBase;
+ _dirtyPalette = header._colorCount > 0;
+
+ _curFrame = -1;
+ _initialFrame = true;
+}
+
+RL2Decoder::RL2VideoTrack::~RL2VideoTrack() {
+ // Free surfaces
+ _surface->free();
+ delete _surface;
+ if (_backSurface) {
+ _backSurface->free();
+ delete _backSurface;
+ }
+}
+
+void RL2Decoder::RL2VideoTrack::initBackSurface() {
+ _backSurface = new Graphics::Surface();
+ _backSurface->create(320, 200, Graphics::PixelFormat::createFormatCLUT8());
+}
+
+bool RL2Decoder::RL2VideoTrack::seek(const Audio::Timestamp &time) {
+ int frame = getFrameAtTime(time);
+
+ if (frame < 0 || frame >= _header._numFrames)
+ return false;
+
+ _curFrame = frame;
+ return true;
+}
+
+uint16 RL2Decoder::RL2VideoTrack::getWidth() const {
+ return _surface->w;
+}
+
+uint16 RL2Decoder::RL2VideoTrack::getHeight() const {
+ return _surface->h;
+}
+
+Graphics::PixelFormat RL2Decoder::RL2VideoTrack::getPixelFormat() const {
+ return _surface->format;
+}
+
+const Graphics::Surface *RL2Decoder::RL2VideoTrack::decodeNextFrame() {
+ if (_initialFrame && _hasBackFrame) {
+ // Read in the initial background frame
+ _fileStream->seek(0x324);
+ rl2DecodeFrameWithoutTransparency(0);
+
+ Common::copy((byte *)_surface->getPixels(), (byte *)_surface->getPixels() + (320 * 200),
+ (byte *)_backSurface->getPixels());
+ _dirtyRects.push_back(Common::Rect(0, 0, _surface->w, _surface->h));
+ _initialFrame = false;
+ }
+
+ // Move to the next frame data
+ _fileStream->seek(_header._frameOffsets[++_curFrame]);
+
+ // If there's any sound data, pass it to the audio track
+ _fileStream->seek(_header._frameSoundSizes[_curFrame], SEEK_CUR);
+
+ // Decode the graphic data using the appropriate method depending on whether the animation
+ // has a background or just raw frames without any background transparency
+ if (_backSurface) {
+ rl2DecodeFrameWithTransparency(_videoBase);
+ } else {
+ rl2DecodeFrameWithoutTransparency(_videoBase);
+ }
+
+ return _surface;
+}
+
+void RL2Decoder::RL2VideoTrack::copyDirtyRectsToBuffer(uint8 *dst, uint pitch) {
+ for (Common::List<Common::Rect>::const_iterator it = _dirtyRects.begin(); it != _dirtyRects.end(); ++it) {
+ for (int y = (*it).top; y < (*it).bottom; ++y) {
+ const int x = (*it).left;
+ memcpy(dst + y * pitch + x, (byte *)_surface->getPixels() + y * getWidth() + x, (*it).right - x);
+ }
+ }
+
+ clearDirtyRects();
+}
+
+void RL2Decoder::RL2VideoTrack::copyFrame(uint8 *data) {
+ memcpy((byte *)_surface->getPixels(), data, getWidth() * getHeight());
+
+ // Redraw
+ _dirtyRects.clear();
+ _dirtyRects.push_back(Common::Rect(0, 0, getWidth(), getHeight()));
+}
+
+void RL2Decoder::RL2VideoTrack::rl2DecodeFrameWithoutTransparency(int screenOffset) {
+ if (screenOffset == -1)
+ screenOffset = _videoBase;
+ int frameSize = _surface->w * _surface->h - screenOffset;
+ byte *destP = (byte *)_surface->getPixels();
+
+ // Main frame decode loop
+ byte nextByte;
+ for (;;) {
+ nextByte = _fileStream->readByte();
+
+ if (nextByte < 0x80) {
+ // Simple byte to copy to output
+ assert(frameSize > 0);
+ *destP++ = nextByte;
+ --frameSize;
+ } else if (nextByte > 0x80) {
+ // Lower 7 bits a run length for the following byte
+ int runLength = _fileStream->readByte();
+ runLength = MIN(runLength, frameSize);
+
+ Common::fill(destP, destP + runLength, nextByte & 0x7f);
+ destP += runLength;
+ frameSize -= runLength;
+ } else {
+ // Follow byte run length for zeroes. If zero, indicates end of image
+ int runLength = _fileStream->readByte();
+ if (runLength == 0)
+ break;
+
+ runLength = MIN(runLength, frameSize);
+ Common::fill(destP, destP + runLength, 0);
+ destP += runLength;
+ frameSize -= runLength;
+ }
+ }
+
+ // If there's any remaining screen area, zero it out
+ byte *endP = (byte *)_surface->getPixels() + _surface->w * _surface->h;
+ if (destP != endP)
+ Common::fill(destP, endP, 0);
+}
+
+void RL2Decoder::RL2VideoTrack::rl2DecodeFrameWithTransparency(int screenOffset) {
+ int frameSize = _surface->w * _surface->h - screenOffset;
+ byte *refP = (byte *)_backSurface->getPixels();
+ byte *destP = (byte *)_surface->getPixels();
+
+ // If there's a screen offset, copy unchanged initial pixels from reference surface
+ if (screenOffset > 0)
+ Common::copy(refP, refP + screenOffset, destP);
+
+ // Main decode loop
+ while (frameSize > 0) {
+ byte nextByte = _fileStream->readByte();
+
+ if (nextByte == 0) {
+ // Move one single byte from reference surface
+ assert(frameSize > 0);
+ destP[screenOffset] = refP[screenOffset];
+ ++screenOffset;
+ --frameSize;
+ } else if (nextByte < 0x80) {
+ // Single 7-bit pixel to output (128-255)
+ assert(frameSize > 0);
+ destP[screenOffset] = nextByte | 0x80;
+ ++screenOffset;
+ --frameSize;
+ } else if (nextByte == 0x80) {
+ int runLength = _fileStream->readByte();
+ if (runLength == 0)
+ return;
+
+ // Run length of transparency (i.e. pixels to copy from reference frame)
+ runLength = MIN(runLength, frameSize);
+
+ Common::copy(refP + screenOffset, refP + screenOffset + runLength, destP + screenOffset);
+ screenOffset += runLength;
+ frameSize -= runLength;
+ } else {
+ // Run length of a single pixel value
+ int runLength = _fileStream->readByte();
+ runLength = MIN(runLength, frameSize);
+
+ Common::fill(destP + screenOffset, destP + screenOffset + runLength, nextByte);
+ screenOffset += runLength;
+ frameSize -= runLength;
+ }
+ }
+
+ // If there's a remaining section of the screen not covered, copy it from reference surface
+ if (screenOffset < (_surface->w * _surface->h))
+ Common::copy(refP + screenOffset, refP + (_surface->w * _surface->h), destP + screenOffset);
+}
+
+Graphics::Surface *RL2Decoder::RL2VideoTrack::getBackSurface() {
+ if (!_backSurface)
+ initBackSurface();
+
+ return _backSurface;
+}
+
+/*------------------------------------------------------------------------*/
+
+RL2Decoder::RL2AudioTrack::RL2AudioTrack(const RL2FileHeader &header, Common::SeekableReadStream *stream, Audio::Mixer::SoundType soundType):
+ _header(header), _soundType(soundType) {
+ // Create audio straem for the audio track
+ _audStream = Audio::makeQueuingAudioStream(_header._rate, _header._channels == 2);
+}
+
+RL2Decoder::RL2AudioTrack::~RL2AudioTrack() {
+ delete _audStream;
+}
+
+void RL2Decoder::RL2AudioTrack::queueSound(Common::SeekableReadStream *stream, int size) {
+ // Queue the sound data
+ byte *data = (byte *)malloc(size);
+ stream->read(data, size);
+ Common::MemoryReadStream *memoryStream = new Common::MemoryReadStream(data, size,
+ DisposeAfterUse::YES);
+
+ _audStream->queueAudioStream(Audio::makeRawStream(memoryStream, _header._rate,
+ Audio::FLAG_UNSIGNED, DisposeAfterUse::YES), DisposeAfterUse::YES);
+}
+
+Audio::AudioStream *RL2Decoder::RL2AudioTrack::getAudioStream() const {
+ return _audStream;
+}
+
+void RL2Decoder::play(VoyeurEngine *vm, int resourceOffset,
+ byte *frames, byte *imgPos) {
+ vm->flipPageAndWait();
+ int paletteStart = getPaletteStart();
+ int paletteCount = getPaletteCount();
+
+ PictureResource videoFrame(getRL2VideoTrack()->getBackSurface());
+ int picCtr = 0;
+ while (!vm->shouldQuit() && !endOfVideo() && !vm->_eventsManager->_mouseClicked) {
+ if (hasDirtyPalette()) {
+ const byte *palette = getPalette();
+
+ vm->_graphicsManager->setPalette128(palette, paletteStart, paletteCount);
+ }
+
+ if (needsUpdate()) {
+ if (frames) {
+ // If reached a point where a new background is needed, load it
+ // and copy over to the video decoder
+ if (getCurFrame() >= READ_LE_UINT16(frames + picCtr * 4)) {
+ PictureResource *newPic = vm->_bVoy->boltEntry(0x302 + picCtr)._picResource;
+ Common::Point pt(READ_LE_UINT16(imgPos + 4 * picCtr) - 32,
+ READ_LE_UINT16(imgPos + 4 * picCtr + 2) - 20);
+
+ vm->_graphicsManager->sDrawPic(newPic, &videoFrame, pt);
+ ++picCtr;
+ }
+ }
+
+ // Decode the next frame and display
+ const Graphics::Surface *frame = decodeNextFrame();
+ Common::copy((const byte *)frame->getPixels(), (const byte *)frame->getPixels() + 320 * 200,
+ (byte *)vm->_graphicsManager->_screenSurface.getPixels());
+ }
+
+ vm->_eventsManager->getMouseInfo();
+ g_system->delayMillis(10);
+ }
+}
+
+} // End of namespace Voyeur
diff --git a/engines/voyeur/animation.h b/engines/voyeur/animation.h
new file mode 100644
index 0000000000..bc6d8a361a
--- /dev/null
+++ b/engines/voyeur/animation.h
@@ -0,0 +1,195 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public 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 VOYEUR_ANIMATION_H
+#define VOYEUR_ANIMATION_H
+
+#include "video/video_decoder.h"
+#include "audio/audiostream.h"
+#include "audio/mixer.h"
+#include "audio/timestamp.h"
+#include "common/array.h"
+#include "common/list.h"
+#include "common/rect.h"
+#include "common/stream.h"
+#include "voyeur/files.h"
+
+namespace Voyeur {
+
+class VoyeurEngine;
+
+/**
+ * Decoder for RL2 videos.
+ *
+ * Video decoder used in engines:
+ * - voyeur
+ */
+class RL2Decoder : public Video::VideoDecoder {
+private:
+ class RL2FileHeader {
+ public:
+ RL2FileHeader();
+ ~RL2FileHeader();
+
+ int _channels;
+ int _colorCount;
+ int _numFrames;
+ int _rate;
+ int _soundRate;
+ int _videoBase;
+ int *_frameSoundSizes;
+
+ uint32 _backSize;
+ uint32 _signature;
+ uint32 *_frameOffsets;
+
+ byte _palette[768];
+
+ void load(Common::SeekableReadStream *stream);
+ Common::Rational getFrameRate() const;
+ bool isValid() const;
+
+ private:
+ uint32 _form; // Unused variable
+ uint32 _dataSize; // Unused variable
+ int _method; // Unused variable
+ int _defSoundSize;
+ };
+
+ class SoundFrame {
+ public:
+ int _offset;
+ int _size;
+
+ SoundFrame(int offset, int size);
+ };
+
+ class RL2AudioTrack : public AudioTrack {
+ private:
+ Audio::Mixer::SoundType _soundType;
+ const RL2FileHeader &_header;
+ Audio::QueuingAudioStream *_audStream;
+ protected:
+ Audio::AudioStream *getAudioStream() const;
+ public:
+ RL2AudioTrack(const RL2FileHeader &header, Common::SeekableReadStream *stream,
+ Audio::Mixer::SoundType soundType);
+ ~RL2AudioTrack();
+
+ Audio::Mixer::SoundType getSoundType() const { return _soundType; }
+ int numQueuedStreams() const { return _audStream->numQueuedStreams(); }
+ virtual bool isSeekable() const { return true; }
+ virtual bool seek(const Audio::Timestamp &time) { return true; }
+
+ void queueSound(Common::SeekableReadStream *stream, int size);
+ };
+
+ class RL2VideoTrack : public FixedRateVideoTrack {
+ public:
+ RL2VideoTrack(const RL2FileHeader &header, RL2AudioTrack *audioTrack,
+ Common::SeekableReadStream *stream);
+ ~RL2VideoTrack();
+
+ uint16 getWidth() const;
+ uint16 getHeight() const;
+ Graphics::Surface *getSurface() { return _surface; }
+ Graphics::Surface *getBackSurface();
+ Graphics::PixelFormat getPixelFormat() const;
+ int getCurFrame() const { return _curFrame; }
+ int getFrameCount() const { return _header._numFrames; }
+ const Graphics::Surface *decodeNextFrame();
+ const byte *getPalette() const { _dirtyPalette = false; return _header._palette; }
+ int getPaletteCount() const { return _header._colorCount; }
+ bool hasDirtyPalette() const { return _dirtyPalette; }
+ const Common::List<Common::Rect> *getDirtyRects() const { return &_dirtyRects; }
+ void clearDirtyRects() { _dirtyRects.clear(); }
+ void copyDirtyRectsToBuffer(uint8 *dst, uint pitch);
+
+ virtual Common::Rational getFrameRate() const { return _header.getFrameRate(); }
+ virtual bool isSeekable() const { return true; }
+ virtual bool seek(const Audio::Timestamp &time);
+ private:
+ Common::SeekableReadStream *_fileStream;
+ const RL2FileHeader &_header;
+ Graphics::Surface *_surface;
+ Graphics::Surface *_backSurface;
+ bool _hasBackFrame;
+
+ mutable bool _dirtyPalette;
+
+ bool _initialFrame;
+ int _curFrame;
+ uint32 _videoBase;
+ uint32 *_frameOffsets;
+
+ Common::List<Common::Rect> _dirtyRects;
+
+ void copyFrame(uint8 *data);
+ void rl2DecodeFrameWithTransparency(int screenOffset);
+ void rl2DecodeFrameWithoutTransparency(int screenOffset = -1);
+ void initBackSurface();
+ };
+
+private:
+ RL2AudioTrack *_audioTrack;
+ RL2VideoTrack *_videoTrack;
+ Common::SeekableReadStream *_fileStream;
+ Audio::Mixer::SoundType _soundType;
+ RL2FileHeader _header;
+ int _paletteStart;
+ Common::Array<SoundFrame> _soundFrames;
+ int _soundFrameNumber;
+ const Common::List<Common::Rect> *getDirtyRects() const;
+
+ void clearDirtyRects();
+ void copyDirtyRectsToBuffer(uint8 *dst, uint pitch);
+ int getPaletteStart() const { return _paletteStart; }
+ const RL2FileHeader &getHeader() { return _header; }
+ virtual void readNextPacket();
+ virtual bool seekIntern(const Audio::Timestamp &time);
+
+public:
+ RL2Decoder(Audio::Mixer::SoundType soundType = Audio::Mixer::kPlainSoundType);
+ virtual ~RL2Decoder();
+
+ virtual void close();
+
+ bool loadStream(Common::SeekableReadStream *stream);
+ bool loadRL2File(const Common::String &file, bool palFlag);
+ bool loadVideo(int videoId);
+ int getPaletteCount() const { return _header._colorCount; }
+
+ /**
+ * Play back a given Voyeur RL2 video
+ * @param vm Engine reference
+ * @param resourceOffset Starting resource to use for frame pictures
+ * @param frames Optional frame numbers resource for when to apply image data
+ * @param imgPos Position to draw image data
+ */
+ void play(VoyeurEngine *vm, int resourceOffset = 0, byte *frames = NULL, byte *imgPos = NULL);
+ RL2VideoTrack *getRL2VideoTrack() { return _videoTrack; }
+ RL2AudioTrack *getRL2AudioTrack() { return _audioTrack; }
+};
+
+} // End of namespace Voyeur
+
+#endif /* VOYEUR_ANIMATION_H */
diff --git a/engines/voyeur/configure.engine b/engines/voyeur/configure.engine
new file mode 100644
index 0000000000..23891fccb7
--- /dev/null
+++ b/engines/voyeur/configure.engine
@@ -0,0 +1,4 @@
+
+# This file is included from the main "configure" script
+# add_engine [name] [desc] [build-by-default] [subengines] [base games] [deps]
+add_engine voyeur "Voyeur" no
diff --git a/engines/voyeur/data.cpp b/engines/voyeur/data.cpp
new file mode 100644
index 0000000000..b8c987f18b
--- /dev/null
+++ b/engines/voyeur/data.cpp
@@ -0,0 +1,371 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public 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 "voyeur/data.h"
+#include "voyeur/voyeur.h"
+
+namespace Voyeur {
+
+void VoyeurEvent::synchronize(Common::Serializer &s) {
+ s.syncAsByte(_hour);
+ s.syncAsByte(_minute);
+ s.syncAsByte(_isAM);
+ s.syncAsByte(_type);
+ s.syncAsSint16LE(_audioVideoId);
+ s.syncAsSint16LE(_computerOn);
+ s.syncAsSint16LE(_computerOff);
+ s.syncAsSint16LE(_dead);
+}
+
+/*------------------------------------------------------------------------*/
+
+SVoy::SVoy(VoyeurEngine *vm):_vm(vm) {
+ // Initialize all the data fields
+ _abortInterface = false;
+ _isAM = false;
+ Common::fill(&_phoneCallsReceived[0], &_phoneCallsReceived[5], false);
+ Common::fill(&_roomHotspotsEnabled[0], &_roomHotspotsEnabled[20], false);
+ _victimMurdered = false;
+
+ _audioVisualStartTime = 0;
+ _audioVisualDuration = 0;
+ _boltGroupId2 = 0;
+ _computerTextId = -1;
+ _computerTimeMin = _computerTimeMax = 0;
+ _eventCount = 0;
+ _fadingStep1 = 0;
+ _fadingStep2 = 0;
+ _fadingType = 0;
+ _incriminatedVictimNumber = 0;
+ _musicStartTime = 0;
+ _playStampMode = 0;
+ _switchBGNum = 0;
+ _transitionId = 0;
+ _victimNumber = 0;
+ _videoEventId = 0;
+ _vocSecondsOffset = 0;
+ _RTANum = 0;
+ _RTVLimit = 0;
+ _RTVNum = 0;
+ _viewBounds = nullptr;
+ Common::fill(&_evPicPtrs[0], &_evPicPtrs[6], (PictureResource *)nullptr);
+ Common::fill(&_evCmPtrs[0], &_evCmPtrs[6], (CMapResource *)nullptr);
+ _policeEvent = 0;
+
+ _eventFlags = EVTFLAG_TIME_DISABLED;
+ _fadingAmount1 = _fadingAmount2 = 127;
+ _murderThreshold = 9999;
+ _aptLoadMode = -1;
+ _eventFlags |= EVTFLAG_100;
+ _totalPhoneCalls = 0;
+
+ for (int i = 0; i < 6; i++)
+ _evPicPtrs[i] = nullptr;
+ for (int i = 0; i < 1000; i++) {
+ _events[i]._hour = 0;
+ _events[i]._minute = 0;
+ _events[i]._isAM = true;
+ _events[i]._type = EVTYPE_NONE;
+ _events[i]._audioVideoId = -1;
+ _events[i]._computerOn = 0;
+ _events[i]._computerOff = 0;
+ _events[i]._dead = 0;
+ }
+ for (int i = 0; i < 6; i++)
+ _evCmPtrs[i] = nullptr;
+}
+
+void SVoy::addEvent(int hour, int minute, VoyeurEventType type, int audioVideoId,
+ int on, int off, int dead) {
+ VoyeurEvent &e = _events[_eventCount++];
+
+ e._type = type;
+ e._hour = hour;
+ e._minute = minute;
+ e._isAM = hour < 12;
+ e._audioVideoId = audioVideoId;
+ e._computerOn = on;
+ e._computerOff = off;
+ e._dead = dead;
+}
+
+void SVoy::synchronize(Common::Serializer &s) {
+ s.syncAsByte(_isAM);
+ s.syncAsSint16LE(_RTANum);
+ s.syncAsSint16LE(_RTVNum);
+ s.syncAsSint16LE(_switchBGNum);
+
+ _videoHotspotTimes.synchronize(s);
+ _audioHotspotTimes.synchronize(s);
+ _evidenceHotspotTimes.synchronize(s);
+
+ for (int idx = 0; idx < 20; ++idx) {
+ s.syncAsByte(_roomHotspotsEnabled[idx]);
+ }
+
+ s.syncAsSint16LE(_audioVisualStartTime);
+ s.syncAsSint16LE(_audioVisualDuration);
+ s.syncAsSint16LE(_vocSecondsOffset);
+ s.syncAsSint16LE(_abortInterface);
+ s.syncAsSint16LE(_playStampMode);
+ s.syncAsSint16LE(_aptLoadMode);
+ s.syncAsSint16LE(_transitionId);
+ s.syncAsSint16LE(_RTVLimit);
+ s.syncAsSint16LE(_eventFlags);
+ s.syncAsSint16LE(_boltGroupId2);
+
+ s.syncAsSint16LE(_musicStartTime);
+ s.syncAsSint16LE(_totalPhoneCalls);
+ s.syncAsSint16LE(_computerTextId);
+ s.syncAsSint16LE(_computerTimeMin);
+ s.syncAsSint16LE(_computerTimeMax);
+ s.syncAsSint16LE(_victimMurdered);
+ s.syncAsSint16LE(_murderThreshold);
+
+ // Events
+ s.syncAsUint16LE(_eventCount);
+ for (int idx = 0; idx < _eventCount; ++idx)
+ _events[idx].synchronize(s);
+
+ s.syncAsSint16LE(_fadingAmount1);
+ s.syncAsSint16LE(_fadingAmount2);
+ s.syncAsSint16LE(_fadingStep1);
+ s.syncAsSint16LE(_fadingStep2);
+ s.syncAsSint16LE(_fadingType);
+ s.syncAsSint16LE(_victimNumber);
+ s.syncAsSint16LE(_incriminatedVictimNumber);
+ s.syncAsSint16LE(_videoEventId);
+
+ if (s.isLoading()) {
+ // Reset apartment loading mode to initial game value
+ _aptLoadMode = 140;
+ _viewBounds = nullptr;
+ }
+}
+
+void SVoy::addVideoEventStart() {
+ VoyeurEvent &e = _events[_eventCount];
+ e._hour = _vm->_gameHour;
+ e._minute = _vm->_gameMinute;
+ e._isAM = _isAM;
+ e._type = EVTYPE_VIDEO;
+ e._audioVideoId = _vm->_audioVideoId;
+ e._computerOn = _vocSecondsOffset;
+ e._dead = _vm->_eventsManager->_videoDead;
+}
+
+void SVoy::addVideoEventEnd() {
+ VoyeurEvent &e = _events[_eventCount];
+ e._computerOff = _RTVNum - _audioVisualStartTime - _vocSecondsOffset;
+ if (_eventCount < (TOTAL_EVENTS - 1))
+ ++_eventCount;
+}
+
+void SVoy::addAudioEventStart() {
+ VoyeurEvent &e = _events[_eventCount];
+ e._hour = _vm->_gameHour;
+ e._minute = _vm->_gameMinute;
+ e._isAM = _isAM;
+ e._type = EVTYPE_AUDIO;
+ e._audioVideoId = _vm->_audioVideoId;
+ e._computerOn = _vocSecondsOffset;
+ e._dead = _vm->_eventsManager->_videoDead;
+}
+
+void SVoy::addAudioEventEnd() {
+ VoyeurEvent &e = _events[_eventCount];
+ e._computerOff = _RTVNum - _audioVisualStartTime - _vocSecondsOffset;
+ if (_eventCount < (TOTAL_EVENTS - 1))
+ ++_eventCount;
+}
+
+void SVoy::addEvidEventStart(int v) {
+ VoyeurEvent &e = _events[_eventCount];
+ e._hour = _vm->_gameHour;
+ e._minute = _vm->_gameMinute;
+ e._isAM = _isAM;
+ e._type = EVTYPE_EVID;
+ e._audioVideoId = _vm->_playStampGroupId;
+ e._computerOn = _boltGroupId2;
+ e._computerOff = v;
+}
+
+void SVoy::addEvidEventEnd(int totalPages) {
+ VoyeurEvent &e = _events[_eventCount];
+ e._dead = totalPages;
+ if (_eventCount < (TOTAL_EVENTS - 1))
+ ++_eventCount;
+}
+
+void SVoy::addComputerEventStart() {
+ VoyeurEvent &e = _events[_eventCount];
+ e._hour = _vm->_gameHour;
+ e._minute = _vm->_gameMinute;
+ e._isAM = _isAM;
+ e._type = EVTYPE_COMPUTER;
+ e._audioVideoId = _vm->_playStampGroupId;
+ e._computerOn = _computerTextId;
+}
+
+void SVoy::addComputerEventEnd(int v) {
+ VoyeurEvent &e = _events[_eventCount];
+ e._computerOff = v;
+ if (_eventCount < (TOTAL_EVENTS - 1))
+ ++_eventCount;
+}
+
+void SVoy::reviewAnEvidEvent(int eventIndex) {
+ VoyeurEvent &e = _events[eventIndex];
+ _vm->_playStampGroupId = e._audioVideoId;
+ _boltGroupId2 = e._computerOn;
+ int frameOff = e._computerOff;
+
+ if (_vm->_bVoy->getBoltGroup(_vm->_playStampGroupId)) {
+ _vm->_graphicsManager->_backColors = _vm->_bVoy->boltEntry(_vm->_playStampGroupId + 1)._cMapResource;
+ _vm->_graphicsManager->_backgroundPage = _vm->_bVoy->boltEntry(_vm->_playStampGroupId)._picResource;
+ _vm->_graphicsManager->_vPort->setupViewPort(_vm->_graphicsManager->_backgroundPage);
+ _vm->_graphicsManager->_backColors->startFade();
+
+ _vm->doEvidDisplay(frameOff, e._dead);
+ _vm->_bVoy->freeBoltGroup(_vm->_playStampGroupId);
+ _vm->_playStampGroupId = -1;
+
+ if (_boltGroupId2 != -1) {
+ _vm->_bVoy->freeBoltGroup(_boltGroupId2);
+ _boltGroupId2 = -1;
+ }
+ }
+}
+
+void SVoy::reviewComputerEvent(int eventIndex) {
+ VoyeurEvent &e = _events[eventIndex];
+ _vm->_playStampGroupId = e._audioVideoId;
+ _computerTextId = e._computerOn;
+
+ if (_vm->_bVoy->getBoltGroup(_vm->_playStampGroupId)) {
+ _vm->_graphicsManager->_backColors = _vm->_bVoy->boltEntry(_vm->_playStampGroupId + 1)._cMapResource;
+ _vm->_graphicsManager->_backgroundPage = _vm->_bVoy->boltEntry(_vm->_playStampGroupId)._picResource;
+ _vm->_graphicsManager->_vPort->setupViewPort(_vm->_graphicsManager->_backgroundPage);
+ _vm->_graphicsManager->_backColors->startFade();
+ _vm->flipPageAndWaitForFade();
+
+ _vm->getComputerBrush();
+ _vm->flipPageAndWait();
+ _vm->doComputerText(e._computerOff);
+
+ _vm->_bVoy->freeBoltGroup(0x4900);
+ _vm->_bVoy->freeBoltGroup(_vm->_playStampGroupId);
+ _vm->_playStampGroupId = -1;
+ }
+}
+
+bool SVoy::checkForKey() {
+ StateResource *state = _vm->_controlPtr->_state;
+ state->_victimEvidenceIndex = 0;
+ if (_vm->_voy->_victimMurdered)
+ return false;
+
+ for (int eventIdx = 0; eventIdx < _eventCount; ++eventIdx) {
+ VoyeurEvent &e = _events[eventIdx];
+
+ switch (e._type) {
+ case EVTYPE_VIDEO:
+ switch (state->_victimIndex) {
+ case 1:
+ if (e._audioVideoId == 33 && e._computerOn < 2 && e._computerOff >= 38)
+ state->_victimEvidenceIndex = 1;
+ break;
+
+ case 2:
+ if (e._audioVideoId == 47 && e._computerOn < 2 && e._computerOff >= 9)
+ state->_victimEvidenceIndex = 2;
+ break;
+
+ case 3:
+ if (e._audioVideoId == 46 && e._computerOn < 2 && e._computerOff > 2)
+ state->_victimEvidenceIndex = 3;
+ break;
+
+ case 4:
+ if (e._audioVideoId == 40 && e._computerOn < 2 && e._computerOff > 6)
+ state->_victimEvidenceIndex = 4;
+ break;
+
+ default:
+ break;
+ }
+ break;
+
+ case EVTYPE_AUDIO:
+ switch (state->_victimIndex) {
+ case 1:
+ if (e._audioVideoId == 8 && e._computerOn < 2 && e._computerOff > 26)
+ state->_victimEvidenceIndex = 1;
+ break;
+
+ case 3:
+ if (e._audioVideoId == 20 && e._computerOn < 2 && e._computerOff > 28)
+ state->_victimEvidenceIndex = 3;
+ if (e._audioVideoId == 35 && e._computerOn < 2 && e._computerOff > 18)
+ state->_victimEvidenceIndex = 3;
+ break;
+
+ default:
+ break;
+ }
+ break;
+
+ case EVTYPE_EVID:
+ switch (state->_victimIndex) {
+ case 4:
+ if (e._audioVideoId == 0x2400 && e._computerOn == 0x4f00 && e._computerOff == 17)
+ state->_victimEvidenceIndex = 4;
+
+ default:
+ break;
+ }
+ break;
+
+ case EVTYPE_COMPUTER:
+ switch (state->_victimIndex) {
+ case 2:
+ if (e._computerOn == 13 && e._computerOff > 76)
+ state->_victimEvidenceIndex = 2;
+ break;
+
+ default:
+ break;
+ }
+ break;
+
+ default:
+ break;
+ }
+
+ if (state->_victimEvidenceIndex == state->_victimIndex)
+ return true;
+ }
+
+ return false;
+}
+
+} // End of namespace Voyeur
diff --git a/engines/voyeur/data.h b/engines/voyeur/data.h
new file mode 100644
index 0000000000..a18ad84f51
--- /dev/null
+++ b/engines/voyeur/data.h
@@ -0,0 +1,232 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public 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 VOYEUR_DATA_H
+#define VOYEUR_DATA_H
+
+#include "common/scummsys.h"
+#include "common/serializer.h"
+#include "voyeur/files.h"
+
+namespace Voyeur {
+
+#define TOTAL_EVENTS 1000
+
+enum VoyeurEventType {
+ EVTYPE_NONE = 0,
+ EVTYPE_VIDEO = 1,
+ EVTYPE_AUDIO = 2,
+ EVTYPE_EVID = 3,
+ EVTYPE_COMPUTER = 4
+};
+
+enum EventFlag { EVTFLAG_TIME_DISABLED = 1, EVTFLAG_2 = 2, EVTFLAG_8 = 8, EVTFLAG_RECORDING = 0x10,
+ EVTFLAG_40 = 0x40, EVTFLAG_VICTIM_PRESET = 0x80, EVTFLAG_100 = 0x100 };
+
+struct VoyeurEvent {
+ int _hour;
+ int _minute;
+ bool _isAM;
+ VoyeurEventType _type;
+ int _audioVideoId;
+ int _computerOn;
+ int _computerOff;
+ int _dead;
+
+ void synchronize(Common::Serializer &s);
+};
+
+class VoyeurEngne;
+
+/**
+ * Encapsulates a list of the time expired ranges that hotspots in the mansion
+ * view are enabled for in a given time period.
+ */
+template<int SLOTS>
+class HotspotTimes {
+public:
+ int _min[SLOTS][20]; // Min time expired
+ int _max[SLOTS][20]; // Max time expired
+
+ HotspotTimes() {
+ reset();
+ }
+
+ /**
+ * Resets the data to an initial state
+ */
+ void reset() {
+ for (int hotspotIdx = 0; hotspotIdx < 20; ++hotspotIdx) {
+ for (int slotIdx = 0; slotIdx < SLOTS; ++slotIdx) {
+ _min[slotIdx][hotspotIdx] = 9999;
+ _max[slotIdx][hotspotIdx] = 0;
+ }
+ }
+ }
+
+ /**
+ * Synchronise the data
+ */
+ void synchronize(Common::Serializer &s) {
+ for (int slotIndex = 0; slotIndex < SLOTS; ++slotIndex) {
+ for (int hotspotIndex = 0; hotspotIndex < 20; ++hotspotIndex) {
+ s.syncAsSint16LE(_min[slotIndex][hotspotIndex]);
+ s.syncAsSint16LE(_max[slotIndex][hotspotIndex]);
+ }
+ }
+ }
+
+ /**
+ * Returns true if the given value is in the range specified by the
+ * min and max at the given hotspot and slot indexes
+ */
+ bool isInRange(int slotIndex, int hotspotIndex, int v) const {
+ return _min[slotIndex][hotspotIndex] <= v &&
+ v < _max[slotIndex][hotspotIndex];
+ }
+};
+
+class SVoy {
+private:
+ VoyeurEngine *_vm;
+
+public:
+ bool _abortInterface;
+ bool _isAM;
+ bool _phoneCallsReceived[5];
+ bool _roomHotspotsEnabled[20];
+ bool _victimMurdered;
+
+ int _aptLoadMode;
+ int _audioVisualStartTime;
+ int _audioVisualDuration;
+ int _boltGroupId2;
+ int _computerTextId;
+ int _computerTimeMin;
+ int _computerTimeMax;
+ int _eventCount;
+ int _eventFlags;
+ int _fadingAmount1;
+ int _fadingAmount2;
+ int _fadingStep1;
+ int _fadingStep2;
+ int _fadingType;
+ int _incriminatedVictimNumber;
+ int _murderThreshold;
+ int _musicStartTime;
+ int _playStampMode;
+ int _switchBGNum;
+ int _totalPhoneCalls;
+ int _transitionId;
+ int _victimNumber;
+ int _videoEventId;
+ int _vocSecondsOffset;
+ int _RTANum;
+ int _RTVLimit;
+ int _RTVNum;
+
+ HotspotTimes<3> _audioHotspotTimes;
+ HotspotTimes<3> _evidenceHotspotTimes;
+ HotspotTimes<8> _videoHotspotTimes;
+
+ Common::Rect _computerScreenRect;
+ RectResource *_viewBounds;
+ PictureResource *_evPicPtrs[6];
+ CMapResource *_evCmPtrs[6];
+ VoyeurEvent _events[TOTAL_EVENTS];
+
+ SVoy(VoyeurEngine *vm);
+
+ /**
+ * Synchronize the data
+ */
+ void synchronize(Common::Serializer &s);
+
+ /**
+ * Add an event to the list of game events that have occurred
+ */
+ void addEvent(int hour, int minute, VoyeurEventType type, int audioVideoId,
+ int on, int off, int dead);
+
+ /**
+ * Adds the start of a video event happening
+ */
+ void addVideoEventStart();
+
+ /**
+ * Adds the finish of a video event happening
+ */
+ void addVideoEventEnd();
+
+ /**
+ * Adds the start of an audio event happening
+ */
+ void addAudioEventStart();
+
+ /**
+ * Adsd the finish of an audio event happening
+ */
+ void addAudioEventEnd();
+
+ /**
+ * Adds the start of an evidence event happening
+ */
+ void addEvidEventStart(int v);
+
+ /**
+ * Adds the finish of an evidence event happening
+ */
+ void addEvidEventEnd(int totalPages);
+
+ /**
+ * Adds the start of a computer event happening
+ */
+ void addComputerEventStart();
+
+ /**
+ * Adds the finish of a computer event happening
+ */
+ void addComputerEventEnd(int v);
+
+ /**
+ * Review a previously recorded evidence event
+ */
+ void reviewAnEvidEvent(int eventIndex);
+
+ /**
+ * Review a previously recorded computer event
+ */
+ void reviewComputerEvent(int eventIndex);
+
+ /**
+ * Checks for key information in determining what kind of murder
+ * should take place
+ */
+ bool checkForKey();
+
+private:
+ int _policeEvent;
+};
+
+} // End of namespace Voyeur
+
+#endif /* VOYEUR_DATA_H */
diff --git a/engines/voyeur/debugger.cpp b/engines/voyeur/debugger.cpp
new file mode 100644
index 0000000000..e9a12180da
--- /dev/null
+++ b/engines/voyeur/debugger.cpp
@@ -0,0 +1,174 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public 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 "voyeur/debugger.h"
+#include "voyeur/graphics.h"
+#include "voyeur/voyeur.h"
+#include "voyeur/staticres.h"
+
+namespace Voyeur {
+
+Debugger::Debugger(VoyeurEngine *vm) : GUI::Debugger(), _vm(vm) {
+ // Register methods
+ registerCmd("continue", WRAP_METHOD(Debugger, cmdExit));
+ registerCmd("time", WRAP_METHOD(Debugger, Cmd_Time));
+ registerCmd("hotspots", WRAP_METHOD(Debugger, Cmd_Hotspots));
+ registerCmd("mouse", WRAP_METHOD(Debugger, Cmd_Mouse));
+
+ // Set fields
+ _isTimeActive = true;
+ _showMousePosition = false;
+}
+
+static const int TIME_STATES[] = {
+ 0, 31, 0, 43, 59, 0, 67, 75, 85, 93, 0, 0, 111, 121, 0, 0
+};
+
+bool Debugger::Cmd_Time(int argc, const char **argv) {
+ if (argc < 2) {
+ // Get the current day and time of day
+ Common::String dtString = _vm->getDayName();
+ Common::String timeString = _vm->getTimeOfDay();
+ if (!timeString.empty())
+ dtString += " " + timeString;
+
+ debugPrintf("Time period = %d, date/time is: %s, time is %s\n",
+ _vm->_voy->_transitionId, dtString.c_str(), _isTimeActive ? "on" : "off");
+ debugPrintf("Format: %s [on | off | 1..17 | val <amount>]\n\n", argv[0]);
+ } else {
+ if (!strcmp(argv[1], "on")) {
+ _isTimeActive = true;
+ debugPrintf("Time is now on\n\n");
+ } else if (!strcmp(argv[1], "off")) {
+ _isTimeActive = false;
+ debugPrintf("Time is now off\n\n");
+ } else if (!strcmp(argv[1], "val")) {
+ if (argc < 3) {
+ debugPrintf("Time expired is currently %d.\n", _vm->_voy->_RTVNum);
+ } else {
+ _vm->_voy->_RTVNum = atoi(argv[2]);
+ debugPrintf("Time expired is now %d.\n", _vm->_voy->_RTVNum);
+ }
+ } else {
+ int timeId = atoi(argv[1]);
+ if (timeId >= 1 && timeId < 17) {
+ int stateId = TIME_STATES[timeId - 1];
+ if (!stateId) {
+ debugPrintf("Given time period is not used in-game\n");
+ } else {
+ debugPrintf("Changing to time period: %d\n", timeId);
+ if (_vm->_mainThread->goToState(-1, stateId))
+ _vm->_mainThread->parsePlayCommands();
+
+ return false;
+ }
+ } else {
+ debugPrintf("Unknown parameter\n\n");
+ }
+ }
+ }
+
+ return true;
+}
+
+bool Debugger::Cmd_Hotspots(int argc, const char **argv) {
+ if (_vm->_voy->_computerTextId >= 0) {
+ debugPrintf("Hotspot Computer Screen %d - %d,%d->%d,%d\n",
+ _vm->_voy->_computerTextId,
+ _vm->_voy->_computerScreenRect.left,
+ _vm->_voy->_computerScreenRect.top,
+ _vm->_voy->_computerScreenRect.right,
+ _vm->_voy->_computerScreenRect.bottom);
+ }
+
+#if 0
+ // Room hotspots
+ BoltEntry &boltEntry = _vm->_bVoy->boltEntry(_vm->_playStampGroupId + 4);
+ if (boltEntry._rectResource) {
+ Common::Array<RectEntry> &hotspots = boltEntry._rectResource->_entries;
+ for (uint hotspotIdx = 0; hotspotIdx < hotspots.size(); ++hotspotIdx) {
+ Common::String pos = Common::String::format("(%d,%d->%d,%d)",
+ hotspots[hotspotIdx].left, hotspots[hotspotIdx].top,
+ hotspots[hotspotIdx].right, hotspots[hotspotIdx].bottom);
+ int arrIndex = hotspots[hotspotIdx]._arrIndex;
+ if (_vm->_voy->_roomHotspotsEnabled[arrIndex - 1]) {
+ debugPrintf("Hotspot Room %d - %s - Enabled\n", arrIndex, pos);
+ } else {
+ debugPrintf("Hotspot Room - %s - Disabled\n", pos);
+ }
+ }
+ }
+#endif
+
+ // Outside view hotspots
+ BoltEntry &boltEntry = _vm->_bVoy->boltEntry(_vm->_playStampGroupId + 1);
+ if (boltEntry._rectResource) {
+ Common::Array<RectEntry> &hotspots = boltEntry._rectResource->_entries;
+
+ for (uint hotspotIdx = 0; hotspotIdx < hotspots.size(); ++hotspotIdx) {
+ Common::String pos = Common::String::format("(%d,%d->%d,%d)",
+ hotspots[hotspotIdx].left, hotspots[hotspotIdx].top,
+ hotspots[hotspotIdx].right, hotspots[hotspotIdx].bottom);
+
+ for (int arrIndex = 0; arrIndex < 3; ++arrIndex) {
+ if (_vm->_voy->_audioHotspotTimes._min[arrIndex][hotspotIdx] != 9999) {
+ debugPrintf("Hotspot %d %s Audio slot %d, time: %d to %d\n",
+ hotspotIdx, pos.c_str(), arrIndex,
+ _vm->_voy->_audioHotspotTimes._min[arrIndex][hotspotIdx],
+ _vm->_voy->_audioHotspotTimes._max[arrIndex][hotspotIdx]);
+ }
+
+ if (_vm->_voy->_evidenceHotspotTimes._min[arrIndex][hotspotIdx] != 9999) {
+ debugPrintf("Hotspot %d %s Evidence slot %d, time: %d to %d\n",
+ hotspotIdx, pos.c_str(), arrIndex,
+ _vm->_voy->_evidenceHotspotTimes._min[arrIndex][hotspotIdx],
+ _vm->_voy->_evidenceHotspotTimes._max[arrIndex][hotspotIdx]);
+ }
+ }
+
+ for (int arrIndex = 0; arrIndex < 8; ++arrIndex) {
+ if (_vm->_voy->_videoHotspotTimes._min[arrIndex][hotspotIdx] != 9999) {
+ debugPrintf("Hotspot %d %s Video slot %d, time: %d to %d\n",
+ hotspotIdx, pos.c_str(), arrIndex,
+ _vm->_voy->_videoHotspotTimes._min[arrIndex][hotspotIdx],
+ _vm->_voy->_videoHotspotTimes._max[arrIndex][hotspotIdx]);
+ }
+ }
+ }
+ }
+
+ debugPrintf("\nEnd of list\n");
+ return true;
+}
+
+bool Debugger::Cmd_Mouse(int argc, const char **argv) {
+ if (argc < 2) {
+ debugPrintf("mouse [ on | off ]\n");
+ } else {
+ _showMousePosition = !strcmp(argv[1], "on");
+ debugPrintf("Mouse position is now %s\n", _showMousePosition ? "on" : "off");
+ }
+
+ return true;
+}
+
+} // End of namespace Voyeur
diff --git a/engines/voyeur/debugger.h b/engines/voyeur/debugger.h
new file mode 100644
index 0000000000..12d62c51a1
--- /dev/null
+++ b/engines/voyeur/debugger.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 VOYEUR_DEBUGGER_H
+#define VOYEUR_DEBUGGER_H
+
+#include "common/scummsys.h"
+#include "gui/debugger.h"
+
+namespace Voyeur {
+
+class VoyeurEngine;
+
+class Debugger : public GUI::Debugger {
+private:
+ VoyeurEngine *_vm;
+public:
+ /**
+ * Specifies whether time should pass, and the video camera's batteries go down
+ * @default true
+ */
+ bool _isTimeActive;
+
+ /*
+ * Specifies whether to show the current mouse position on the screen
+ */
+ bool _showMousePosition;
+protected:
+ /**
+ * Turn time on or off, set the current time period, or the camera delay
+ * within the current time period.
+ */
+ bool Cmd_Time(int argc, const char **argv);
+
+ /**
+ * List the active hotspots during the current time period
+ */
+ bool Cmd_Hotspots(int argc, const char **argv);
+
+ /**
+ * Toggle showing the mouse on the screen
+ */
+ bool Cmd_Mouse(int argc, const char **argv);
+public:
+ Debugger(VoyeurEngine *vm);
+ virtual ~Debugger() {}
+};
+
+} // End of namespace Voyeur
+
+#endif
diff --git a/engines/voyeur/detection.cpp b/engines/voyeur/detection.cpp
new file mode 100644
index 0000000000..3503eb11ef
--- /dev/null
+++ b/engines/voyeur/detection.cpp
@@ -0,0 +1,181 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public 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 "voyeur/voyeur.h"
+
+#include "base/plugins.h"
+#include "common/savefile.h"
+#include "common/str-array.h"
+#include "common/memstream.h"
+#include "engines/advancedDetector.h"
+#include "common/system.h"
+#include "graphics/colormasks.h"
+#include "graphics/surface.h"
+
+#define MAX_SAVES 99
+
+namespace Voyeur {
+
+struct VoyeurGameDescription {
+ ADGameDescription desc;
+};
+
+uint32 VoyeurEngine::getFeatures() const {
+ return _gameDescription->desc.flags;
+}
+
+Common::Language VoyeurEngine::getLanguage() const {
+ return _gameDescription->desc.language;
+}
+
+Common::Platform VoyeurEngine::getPlatform() const {
+ return _gameDescription->desc.platform;
+}
+
+bool VoyeurEngine::getIsDemo() const {
+ return _gameDescription->desc.flags & ADGF_DEMO;
+}
+
+} // End of namespace Voyeur
+
+static const PlainGameDescriptor voyeurGames[] = {
+ {"voyeur", "Voyeur"},
+ {0, 0}
+};
+
+#include "voyeur/detection_tables.h"
+
+class VoyeurMetaEngine : public AdvancedMetaEngine {
+public:
+ VoyeurMetaEngine() : AdvancedMetaEngine(Voyeur::gameDescriptions, sizeof(Voyeur::VoyeurGameDescription), voyeurGames) {
+ _maxScanDepth = 3;
+ }
+
+ virtual const char *getName() const {
+ return "Voyeur Engine";
+ }
+
+ virtual const char *getOriginalCopyright() const {
+ return "Voyeur (c) Philips P.O.V. Entertainment Group";
+ }
+
+ virtual bool hasFeature(MetaEngineFeature f) const;
+ virtual bool createInstance(OSystem *syst, Engine **engine, const ADGameDescription *desc) const;
+ virtual SaveStateList listSaves(const char *target) const;
+ virtual int getMaximumSaveSlot() const;
+ virtual void removeSaveState(const char *target, int slot) const;
+ SaveStateDescriptor querySaveMetaInfos(const char *target, int slot) const;
+};
+
+bool VoyeurMetaEngine::hasFeature(MetaEngineFeature f) const {
+ return
+ (f == kSupportsListSaves) ||
+ (f == kSupportsLoadingDuringStartup) ||
+ (f == kSupportsDeleteSave) ||
+ (f == kSavesSupportMetaInfo) ||
+ (f == kSavesSupportThumbnail);
+}
+
+bool Voyeur::VoyeurEngine::hasFeature(EngineFeature f) const {
+ return
+ (f == kSupportsRTL) ||
+ (f == kSupportsLoadingDuringRuntime) ||
+ (f == kSupportsSavingDuringRuntime);
+}
+
+bool VoyeurMetaEngine::createInstance(OSystem *syst, Engine **engine, const ADGameDescription *desc) const {
+ const Voyeur::VoyeurGameDescription *gd = (const Voyeur::VoyeurGameDescription *)desc;
+ if (gd) {
+ *engine = new Voyeur::VoyeurEngine(syst, gd);
+ }
+ return gd != 0;
+}
+
+SaveStateList VoyeurMetaEngine::listSaves(const char *target) const {
+ Common::SaveFileManager *saveFileMan = g_system->getSavefileManager();
+ Common::StringArray filenames;
+ Common::String saveDesc;
+ Common::String pattern = Common::String::format("%s.0??", target);
+
+ filenames = saveFileMan->listSavefiles(pattern);
+ sort(filenames.begin(), filenames.end()); // Sort to get the files in numerical order
+
+ SaveStateList saveList;
+ Voyeur::VoyeurSavegameHeader header;
+
+ for (Common::StringArray::const_iterator file = filenames.begin(); file != filenames.end(); ++file) {
+ const char *ext = strrchr(file->c_str(), '.');
+ int slot = ext ? atoi(ext + 1) : -1;
+
+ if (slot >= 0 && slot <= MAX_SAVES) {
+ Common::InSaveFile *in = g_system->getSavefileManager()->openForLoading(*file);
+
+ if (in) {
+ if (header.read(in)) {
+ saveList.push_back(SaveStateDescriptor(slot, header._saveName));
+ header._thumbnail->free();
+ }
+ delete in;
+ }
+ }
+ }
+
+ return saveList;
+}
+
+int VoyeurMetaEngine::getMaximumSaveSlot() const {
+ return MAX_SAVES;
+}
+
+void VoyeurMetaEngine::removeSaveState(const char *target, int slot) const {
+ Common::String filename = Common::String::format("%s.%03d", target, slot);
+ g_system->getSavefileManager()->removeSavefile(filename);
+}
+
+SaveStateDescriptor VoyeurMetaEngine::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) {
+ Voyeur::VoyeurSavegameHeader header;
+ header.read(f);
+ delete f;
+
+ // Create the return descriptor
+ SaveStateDescriptor desc(slot, header._saveName);
+ 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();
+}
+
+
+#if PLUGIN_ENABLED_DYNAMIC(VOYEUR)
+ REGISTER_PLUGIN_DYNAMIC(VOYEUR, PLUGIN_TYPE_ENGINE, VoyeurMetaEngine);
+#else
+ REGISTER_PLUGIN_STATIC(VOYEUR, PLUGIN_TYPE_ENGINE, VoyeurMetaEngine);
+#endif
diff --git a/engines/voyeur/detection_tables.h b/engines/voyeur/detection_tables.h
new file mode 100644
index 0000000000..da566ff63d
--- /dev/null
+++ b/engines/voyeur/detection_tables.h
@@ -0,0 +1,42 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ */
+
+namespace Voyeur {
+
+static const VoyeurGameDescription gameDescriptions[] = {
+ {
+ // Voyeur DOS English
+ {
+ "voyeur",
+ 0,
+ AD_ENTRY1s("a1100100.rl2", "b44630677618d034970ca0a13c1c1237", 336361),
+ Common::EN_ANY,
+ Common::kPlatformDOS,
+ ADGF_NO_FLAGS,
+ GUIO1(GUIO_NONE)
+ },
+ },
+
+ { AD_TABLE_END_MARKER }
+};
+
+} // End of namespace Voyeur
diff --git a/engines/voyeur/events.cpp b/engines/voyeur/events.cpp
new file mode 100644
index 0000000000..7ce7351e65
--- /dev/null
+++ b/engines/voyeur/events.cpp
@@ -0,0 +1,613 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public 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 "voyeur/events.h"
+#include "voyeur/voyeur.h"
+#include "voyeur/staticres.h"
+#include "common/events.h"
+#include "graphics/cursorman.h"
+#include "graphics/font.h"
+#include "graphics/fontman.h"
+#include "graphics/palette.h"
+
+namespace Voyeur {
+
+IntNode::IntNode() {
+ _intFunc = NULL;
+ _curTime = 0;
+ _timeReset = 0;
+ _flags = 0;
+}
+
+IntNode::IntNode(uint16 curTime, uint16 timeReset, uint16 flags) {
+ _intFunc = NULL;
+ _curTime = curTime;
+ _timeReset = timeReset;
+ _flags = flags;
+}
+
+/*------------------------------------------------------------------------*/
+
+IntData::IntData() {
+ _flipWait = false;
+ _hasPalette = false;
+ _flashTimer = 0;
+ _flashStep = 0;
+ _skipFading = false;
+ _palStartIndex = 0;
+ _palEndIndex = 0;
+ _palette = NULL;
+}
+
+/*------------------------------------------------------------------------*/
+
+EventsManager::EventsManager(VoyeurEngine *vm) : _intPtr(_gameData),
+ _fadeIntNode(0, 0, 3), _cycleIntNode(0, 0, 3), _vm(vm) {
+ _cycleStatus = 0;
+ _fadeStatus = 0;
+ _priorFrameTime = g_system->getMillis();
+ _gameCounter = 0;
+ _counterFlag = false;
+ _recordBlinkCounter = 0;
+ _cursorBlinked = false;
+
+ Common::fill(&_cycleTime[0], &_cycleTime[4], 0);
+ Common::fill(&_cycleNext[0], &_cycleNext[4], (byte *)nullptr);
+ _cyclePtr = NULL;
+
+ _leftClick = _rightClick = false;
+ _mouseClicked = _newMouseClicked = false;
+ _newLeftClick = _newRightClick = false;;
+
+ _videoDead = 0;
+
+ _fadeFirstCol = _fadeLastCol = 0;
+ _fadeCount = 1;
+
+ for (int i = 0; i < 4; i++)
+ _cycleNext[i] = nullptr;
+}
+
+void EventsManager::startMainClockInt() {
+ _mainIntNode._intFunc = &EventsManager::mainVoyeurIntFunc;
+ _mainIntNode._flags = 0;
+ _mainIntNode._curTime = 0;
+ _mainIntNode._timeReset = 60;
+}
+
+void EventsManager::mainVoyeurIntFunc() {
+ if (!(_vm->_voy->_eventFlags & EVTFLAG_TIME_DISABLED)) {
+ ++_vm->_voy->_switchBGNum;
+
+ if (_vm->_debugger->_isTimeActive) {
+ // Increase camera discharge
+ ++_vm->_voy->_RTVNum;
+
+ // If the murder threshold has been set, and is passed, then flag the victim
+ // as murdered, which prevents sending the tape from succeeding
+ if (_vm->_voy->_RTVNum >= _vm->_voy->_murderThreshold)
+ _vm->_voy->_victimMurdered = true;
+ }
+ }
+}
+
+void EventsManager::sWaitFlip() {
+ Common::Array<ViewPortResource *> &viewPorts = _vm->_graphicsManager->_viewPortListPtr->_entries;
+ for (uint idx = 0; idx < viewPorts.size(); ++idx) {
+ ViewPortResource &viewPort = *viewPorts[idx];
+
+ if (_vm->_graphicsManager->_saveBack && (viewPort._flags & DISPFLAG_40)) {
+ Common::Rect *clipPtr = _vm->_graphicsManager->_clipPtr;
+ _vm->_graphicsManager->_clipPtr = &viewPort._clipRect;
+
+ if (viewPort._restoreFn)
+ (_vm->_graphicsManager->*viewPort._restoreFn)(&viewPort);
+
+ _vm->_graphicsManager->_clipPtr = clipPtr;
+ viewPort._rectListCount[viewPort._pageIndex] = 0;
+ viewPort._rectListPtr[viewPort._pageIndex]->clear();
+ viewPort._flags &= ~DISPFLAG_40;
+ }
+ }
+
+ while (_gameData._flipWait && !_vm->shouldQuit()) {
+ pollEvents();
+ g_system->delayMillis(10);
+ }
+}
+
+void EventsManager::checkForNextFrameCounter() {
+ // Check for next game frame
+ uint32 milli = g_system->getMillis();
+ if ((milli - _priorFrameTime) >= GAME_FRAME_TIME) {
+ _counterFlag = !_counterFlag;
+ if (_counterFlag)
+ ++_gameCounter;
+ _priorFrameTime = milli;
+
+ // Run the timer-based updates
+ voyeurTimer();
+
+ if ((_gameCounter % GAME_FRAME_RATE) == 0)
+ mainVoyeurIntFunc();
+
+ // Give time to the debugger
+ _vm->_debugger->onFrame();
+
+ // If mouse position display is on, display the position
+ if (_vm->_debugger->_showMousePosition)
+ showMousePosition();
+
+ // Display the frame
+ g_system->copyRectToScreen((byte *)_vm->_graphicsManager->_screenSurface.getPixels(),
+ SCREEN_WIDTH, 0, 0, SCREEN_WIDTH, SCREEN_HEIGHT);
+ g_system->updateScreen();
+
+ // Signal the ScummVM debugger
+ _vm->_debugger->onFrame();
+ }
+}
+
+void EventsManager::showMousePosition() {
+ const Graphics::Font &font(*FontMan.getFontByUsage(Graphics::FontManager::kConsoleFont));
+ Common::String mousePos = Common::String::format("(%d,%d)", _mousePos.x, _mousePos.y);
+ if (_vm->_voyeurArea == AREA_INTERFACE) {
+ Common::Point pt = _mousePos + _vm->_mansionViewPos - Common::Point(40, 27);
+ if (pt.x < 0) pt.x = 0;
+ if (pt.y < 0) pt.y = 0;
+
+ mousePos += Common::String::format(" - (%d,%d)", pt.x, pt.y);
+ }
+
+ _vm->_graphicsManager->_screenSurface.fillRect(
+ Common::Rect(0, 0, 110, font.getFontHeight()), 0);
+ font.drawString(&_vm->_graphicsManager->_screenSurface, mousePos,
+ 0, 0, 110, 63);
+}
+
+void EventsManager::voyeurTimer() {
+ _gameData._flashTimer += _gameData._flashStep;
+
+ if (_gameData._flipWait) {
+ _gameData._flipWait = false;
+ _gameData._skipFading = false;
+ }
+
+ videoTimer();
+
+ // Iterate through the list of registered nodes
+ Common::List<IntNode *>::iterator i;
+ for (i = _intNodes.begin(); i != _intNodes.end(); ++i) {
+ IntNode &node = **i;
+
+ if (node._flags & 1)
+ continue;
+ if (!(node._flags & 2)) {
+ if (--node._curTime != 0)
+ continue;
+
+ node._curTime = node._timeReset;
+ }
+
+ (this->*node._intFunc)();
+ }
+
+}
+
+void EventsManager::videoTimer() {
+ if (_gameData._hasPalette) {
+ _gameData._hasPalette = false;
+
+ g_system->getPaletteManager()->setPalette(_gameData._palette +
+ _gameData._palStartIndex * 3, _gameData._palStartIndex,
+ _gameData._palEndIndex - _gameData._palStartIndex + 1);
+ }
+}
+
+void EventsManager::delay(int cycles) {
+ uint32 totalMilli = cycles * 1000 / GAME_FRAME_RATE;
+ uint32 delayEnd = g_system->getMillis() + totalMilli;
+
+ while (!_vm->shouldQuit() && g_system->getMillis() < delayEnd) {
+ g_system->delayMillis(10);
+
+ pollEvents();
+ }
+}
+
+void EventsManager::delayClick(int cycles) {
+ uint32 totalMilli = cycles * 1000 / GAME_FRAME_RATE;
+ uint32 delayEnd = g_system->getMillis() + totalMilli;
+
+ do {
+ g_system->delayMillis(10);
+ getMouseInfo();
+ } while (!_vm->shouldQuit() && g_system->getMillis() < delayEnd
+ && !_vm->_eventsManager->_mouseClicked);
+}
+
+void EventsManager::pollEvents() {
+ checkForNextFrameCounter();
+
+ Common::Event event;
+ while (g_system->getEventManager()->pollEvent(event)) {
+ // Handle keypress
+ switch (event.type) {
+ case Common::EVENT_QUIT:
+ case Common::EVENT_RTL:
+ case Common::EVENT_KEYUP:
+ return;
+
+ case Common::EVENT_KEYDOWN:
+ // Check for debugger
+ if (event.kbd.keycode == Common::KEYCODE_d && (event.kbd.flags & Common::KBD_CTRL)) {
+ // Attach to the debugger
+ _vm->_debugger->attach();
+ _vm->_debugger->onFrame();
+ }
+ return;
+ case Common::EVENT_LBUTTONDOWN:
+ _newLeftClick = true;
+ _newMouseClicked = true;
+ return;
+ case Common::EVENT_RBUTTONDOWN:
+ _newRightClick = true;
+ _newMouseClicked = true;
+ return;
+ case Common::EVENT_LBUTTONUP:
+ case Common::EVENT_RBUTTONUP:
+ _newMouseClicked = false;
+ _newLeftClick = false;
+ _newRightClick = false;
+ return;
+ case Common::EVENT_MOUSEMOVE:
+ _mousePos = event.mouse;
+ break;
+ default:
+ break;
+ }
+ }
+}
+
+void EventsManager::startFade(CMapResource *cMap) {
+ _fadeIntNode._flags |= 1;
+ if (_cycleStatus & 1)
+ _cycleIntNode._flags |= 1;
+
+ _fadeFirstCol = cMap->_start;
+ _fadeLastCol = cMap->_end;
+ _fadeCount = cMap->_steps + 1;
+
+ if (cMap->_steps > 0) {
+ _fadeStatus = cMap->_fadeStatus | 1;
+ byte *vgaP = &_vm->_graphicsManager->_VGAColors[_fadeFirstCol * 3];
+ int mapIndex = 0;
+
+ for (int idx = _fadeFirstCol; idx <= _fadeLastCol; ++idx, vgaP += 3) {
+ ViewPortPalEntry &palEntry = _vm->_graphicsManager->_viewPortListPtr->_palette[idx];
+ palEntry._rEntry = vgaP[0] << 8;
+ int rDiff = (cMap->_entries[mapIndex * 3] << 8) - palEntry._rEntry;
+ palEntry._rChange = rDiff / cMap->_steps;
+
+ palEntry._gEntry = vgaP[1] << 8;
+ int gDiff = (cMap->_entries[mapIndex * 3 + 1] << 8) - palEntry._gEntry;
+ palEntry._gChange = gDiff / cMap->_steps;
+
+ palEntry._bEntry = vgaP[2] << 8;
+ int bDiff = (cMap->_entries[mapIndex * 3 + 2] << 8) - palEntry._bEntry;
+ palEntry._bChange = bDiff / cMap->_steps;
+
+ palEntry._palIndex = idx;
+ if (!(cMap->_fadeStatus & 1))
+ ++mapIndex;
+ }
+
+ if (cMap->_fadeStatus & 2)
+ _intPtr._skipFading = true;
+ _fadeIntNode._flags &= ~1;
+ } else {
+ byte *vgaP = &_vm->_graphicsManager->_VGAColors[_fadeFirstCol * 3];
+ int mapIndex = 0;
+
+ for (int idx = _fadeFirstCol; idx <= _fadeLastCol; ++idx, vgaP += 3) {
+ Common::copy(&cMap->_entries[mapIndex], &cMap->_entries[mapIndex + 3], vgaP);
+
+ if (!(cMap->_fadeStatus & 1))
+ mapIndex += 3;
+ }
+
+ if (_intPtr._palStartIndex > _fadeFirstCol)
+ _intPtr._palStartIndex = _fadeFirstCol;
+ if (_intPtr._palEndIndex < _fadeLastCol)
+ _intPtr._palEndIndex = _fadeLastCol;
+
+ _intPtr._hasPalette = true;
+ }
+
+ if (_cycleStatus & 1)
+ _cycleIntNode._flags &= ~1;
+}
+
+void EventsManager::addIntNode(IntNode *node) {
+ _intNodes.push_back(node);
+}
+
+void EventsManager::addFadeInt() {
+ IntNode &node = _fade2IntNode;
+ node._intFunc = &EventsManager::fadeIntFunc;
+ node._flags = 0;
+ node._curTime = 0;
+ node._timeReset = 1;
+
+ addIntNode(&node);
+}
+
+void EventsManager::vDoFadeInt() {
+ if (_intPtr._skipFading)
+ return;
+ if (--_fadeCount == 0) {
+ _fadeIntNode._flags |= 1;
+ _fadeStatus &= ~1;
+ return;
+ }
+
+ for (int i = _fadeFirstCol; i <= _fadeLastCol; ++i) {
+ ViewPortPalEntry &palEntry = _vm->_graphicsManager->_viewPortListPtr->_palette[i];
+ byte *vgaP = &_vm->_graphicsManager->_VGAColors[palEntry._palIndex * 3];
+
+ palEntry._rEntry += palEntry._rChange;
+ palEntry._gEntry += palEntry._gChange;
+ palEntry._bEntry += palEntry._bChange;
+
+ vgaP[0] = palEntry._rEntry >> 8;
+ vgaP[1] = palEntry._gEntry >> 8;
+ vgaP[2] = palEntry._bEntry >> 8;
+ }
+
+ if (_intPtr._palStartIndex > _fadeFirstCol)
+ _intPtr._palStartIndex = _fadeFirstCol;
+ if (_intPtr._palEndIndex < _fadeLastCol)
+ _intPtr._palEndIndex = _fadeLastCol;
+
+ _intPtr._hasPalette = true;
+}
+
+void EventsManager::vDoCycleInt() {
+ for (int idx = 3; idx >= 0; --idx) {
+ if (_cyclePtr->_type[idx] && --_cycleTime[idx] <= 0) {
+ byte *pSrc = _cycleNext[idx];
+ byte *pPal = _vm->_graphicsManager->_VGAColors;
+
+ if (_cyclePtr->_type[idx] != 1) {
+ // New palette data being specified - loop to set entries
+ do {
+ int palIndex = READ_LE_UINT16(pSrc);
+ pPal[palIndex * 3] = pSrc[3];
+ pPal[palIndex * 3 + 1] = pSrc[4];
+ pPal[palIndex * 3 + 1] = pSrc[5];
+ pSrc += 6;
+
+ if ((int16)READ_LE_UINT16(pSrc) >= 0) {
+ // Resetting back to start of cycle data
+ pSrc = _cycleNext[idx];
+ break;
+ }
+ } while (*(pSrc + 2) == 0);
+
+ _cycleNext[idx] = pSrc;
+ _cycleTime[idx] = pSrc[2];
+ } else {
+ // Palette rotation to be done
+ _cycleTime[idx] = pSrc[4];
+
+ if (pSrc[5] == 1) {
+ // Move palette entry to end of range
+ int start = READ_LE_UINT16(pSrc);
+ int end = READ_LE_UINT16(&pSrc[2]);
+ assert(start < 0x100 && end < 0x100);
+
+ // Store the RGB of the first entry to be moved
+ byte r = pPal[start * 3];
+ byte g = pPal[start * 3 + 1];
+ byte b = pPal[start * 3 + 2];
+
+ Common::copy(&pPal[start * 3 + 3], &pPal[end * 3 + 3], &pPal[start * 3]);
+
+ // Place the original saved entry at the end of the range
+ pPal[end * 3] = r;
+ pPal[end * 3 + 1] = g;
+ pPal[end * 3 + 2] = b;
+
+ if (_fadeStatus & 1) {
+ //dx = start, di = end
+ warning("TODO: Adjustment of ViewPortListResource");
+ }
+ } else {
+ // Move palette entry to start of range
+ int start = READ_LE_UINT16(pSrc);
+ int end = READ_LE_UINT16(&pSrc[2]);
+ assert(start < 0x100 && end < 0x100);
+
+ // Store the RGB of the entry to be moved
+ byte r = pPal[end * 3];
+ byte g = pPal[end * 3 + 1];
+ byte b = pPal[end * 3 + 2];
+
+ // Move the remainder of the range forwards one entry
+ Common::copy_backward(&pPal[start * 3], &pPal[end * 3], &pPal[end * 3 + 3]);
+
+ // Place the original saved entry at the end of the range
+ pPal[start * 3] = r;
+ pPal[start * 3 + 1] = g;
+ pPal[start * 3 + 2] = b;
+
+ if (_fadeStatus & 1) {
+ //dx = start, di = end
+ warning("TODO: Adjustment of ViewPortListResource");
+ }
+ }
+ }
+
+ _intPtr._hasPalette = true;
+ }
+ }
+}
+
+
+void EventsManager::fadeIntFunc() {
+ switch (_vm->_voy->_fadingType) {
+ case 1:
+ if (_vm->_voy->_fadingAmount1 < 63)
+ _vm->_voy->_fadingAmount1 += _vm->_voy->_fadingStep1;
+ if (_vm->_voy->_fadingAmount2 < 63)
+ _vm->_voy->_fadingAmount2 += _vm->_voy->_fadingStep2;
+ if (_vm->_voy->_fadingAmount1 > 63)
+ _vm->_voy->_fadingAmount1 = 63;
+ if (_vm->_voy->_fadingAmount2 > 63)
+ _vm->_voy->_fadingAmount2 = 63;
+ if ((_vm->_voy->_fadingAmount1 == 63) && (_vm->_voy->_fadingAmount2 == 63))
+ _vm->_voy->_fadingType = 0;
+ break;
+ case 2:
+ if (_vm->_voy->_fadingAmount1 > 0)
+ _vm->_voy->_fadingAmount1 -= _vm->_voy->_fadingStep1;
+ if (_vm->_voy->_fadingAmount2 > 0)
+ _vm->_voy->_fadingAmount2 -= _vm->_voy->_fadingStep2;
+ if (_vm->_voy->_fadingAmount1 < 0)
+ _vm->_voy->_fadingAmount1 = 0;
+ if (_vm->_voy->_fadingAmount2 < 0)
+ _vm->_voy->_fadingAmount2 = 0;
+ if ((_vm->_voy->_fadingAmount1 == 0) && (_vm->_voy->_fadingAmount2 == 0))
+ _vm->_voy->_fadingType = 0;
+ break;
+ default:
+ break;
+ }
+}
+
+void EventsManager::deleteIntNode(IntNode *node) {
+ _intNodes.remove(node);
+}
+
+void EventsManager::vInitColor() {
+ _fadeIntNode._intFunc = &EventsManager::vDoFadeInt;
+ _cycleIntNode._intFunc = &EventsManager::vDoCycleInt;
+
+ addIntNode(&_fadeIntNode);
+ addIntNode(&_cycleIntNode);
+}
+
+void EventsManager::setCursor(PictureResource *pic) {
+ PictureResource cursor;
+ cursor._bounds = pic->_bounds;
+ cursor._flags = DISPFLAG_CURSOR;
+
+ _vm->_graphicsManager->sDrawPic(pic, &cursor, Common::Point());
+}
+
+void EventsManager::setCursor(byte *cursorData, int width, int height, int keyColor) {
+ CursorMan.replaceCursor(cursorData, width, height, width / 2, height / 2, keyColor);
+}
+
+void EventsManager::setCursorColor(int idx, int mode) {
+ switch (mode) {
+ case 0:
+ _vm->_graphicsManager->setColor(idx, 90, 90, 232);
+ break;
+ case 1:
+ _vm->_graphicsManager->setColor(idx, 232, 90, 90);
+ break;
+ case 2:
+ _vm->_graphicsManager->setColor(idx, 90, 232, 90);
+ break;
+ case 3:
+ _vm->_graphicsManager->setColor(idx, 90, 232, 232);
+ break;
+ default:
+ break;
+ }
+}
+
+void EventsManager::showCursor() {
+ CursorMan.showMouse(true);
+}
+
+void EventsManager::hideCursor() {
+ CursorMan.showMouse(false);
+}
+
+void EventsManager::getMouseInfo() {
+ pollEvents();
+
+ if (_vm->_voy->_eventFlags & EVTFLAG_RECORDING) {
+ if ((_gameCounter - _recordBlinkCounter) > 8) {
+ _recordBlinkCounter = _gameCounter;
+
+ if (_cursorBlinked) {
+ _cursorBlinked = false;
+ _vm->_graphicsManager->setOneColor(128, 220, 20, 20);
+ _vm->_graphicsManager->setColor(128, 220, 20, 20);
+ } else {
+ _cursorBlinked = true;
+ _vm->_graphicsManager->setOneColor(128, 220, 220, 220);
+ _vm->_graphicsManager->setColor(128, 220, 220, 220);
+ }
+ }
+ }
+
+ _mouseClicked = _newMouseClicked;
+ _leftClick = _newLeftClick;
+ _rightClick = _newRightClick;
+
+ _newMouseClicked = false;
+ _newLeftClick = false;
+ _newRightClick = false;
+}
+
+void EventsManager::startCursorBlink() {
+ if (_vm->_voy->_eventFlags & EVTFLAG_RECORDING) {
+ _vm->_graphicsManager->setOneColor(128, 55, 5, 5);
+ _vm->_graphicsManager->setColor(128, 220, 20, 20);
+ _intPtr._hasPalette = true;
+
+ _vm->_graphicsManager->drawDot();
+ //copySection();
+ }
+}
+
+void EventsManager::incrementTime(int amt) {
+ for (int i = 0; i < amt; ++i)
+ mainVoyeurIntFunc();
+}
+
+void EventsManager::stopEvidDim() {
+ deleteIntNode(&_evIntNode);
+}
+
+Common::String EventsManager::getEvidString(int eventIndex) {
+ assert(eventIndex <= _vm->_voy->_eventCount);
+ VoyeurEvent &e = _vm->_voy->_events[eventIndex];
+ return Common::String::format("%03d %.2d:%.2d %s %s", eventIndex + 1,
+ e._hour, e._minute, e._isAM ? AM : PM, EVENT_TYPE_STRINGS[e._type - 1]);
+}
+
+} // End of namespace Voyeur
diff --git a/engines/voyeur/events.h b/engines/voyeur/events.h
new file mode 100644
index 0000000000..0c1cef0955
--- /dev/null
+++ b/engines/voyeur/events.h
@@ -0,0 +1,145 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public 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 VOYEUR_EVENTS_H
+#define VOYEUR_EVENTS_H
+
+#include "common/scummsys.h"
+#include "common/list.h"
+#include "graphics/surface.h"
+#include "voyeur/files.h"
+
+namespace Voyeur {
+
+class VoyeurEngine;
+class EventsManager;
+class CMapResource;
+
+#define GAME_FRAME_RATE 50
+#define GAME_FRAME_TIME (1000 / GAME_FRAME_RATE)
+
+typedef void (EventsManager::*EventMethodPtr)();
+
+class IntNode {
+public:
+ EventMethodPtr _intFunc;
+ uint16 _curTime;
+ uint16 _timeReset;
+ uint32 _flags;
+
+ IntNode();
+ IntNode(uint16 curTime, uint16 timeReset, uint16 flags);
+};
+
+class IntData {
+public:
+ bool _flipWait;
+ int _flashTimer;
+ int _flashStep;
+ bool _hasPalette;
+ bool _skipFading;
+ int _palStartIndex;
+ int _palEndIndex;
+ byte *_palette;
+
+ IntData();
+};
+
+class EventsManager {
+private:
+ VoyeurEngine *_vm;
+ bool _counterFlag;
+ bool _cursorBlinked;
+ uint32 _gameCounter;
+ uint32 _priorFrameTime;
+ uint32 _recordBlinkCounter; // Original field was called _joe :)
+ Common::List<IntNode *> _intNodes;
+ Common::Point _mousePos;
+
+ void mainVoyeurIntFunc();
+ void checkForNextFrameCounter();
+ void voyeurTimer();
+ void videoTimer();
+ void vDoFadeInt();
+ void vDoCycleInt();
+ void fadeIntFunc();
+ void addIntNode(IntNode *node);
+ void deleteIntNode(IntNode *node);
+
+ /**
+ * Debugger support method to show the mouse position
+ */
+ void showMousePosition();
+public:
+ IntData _gameData;
+ IntData &_intPtr;
+ IntNode _fadeIntNode;
+ IntNode _fade2IntNode;
+ IntNode _cycleIntNode;
+ IntNode _evIntNode;
+ IntNode _mainIntNode;
+ int _cycleStatus;
+ int _fadeFirstCol, _fadeLastCol;
+ int _fadeCount;
+ int _fadeStatus;
+
+ bool _leftClick, _rightClick;
+ bool _mouseClicked, _newMouseClicked;
+ bool _newLeftClick, _newRightClick;
+
+ int _videoDead;
+ int _cycleTime[4];
+ byte *_cycleNext[4];
+ VInitCycleResource *_cyclePtr;
+
+ EventsManager(VoyeurEngine *vm);
+
+ void setMousePos(const Common::Point &p) { _mousePos = p; }
+ void startMainClockInt();
+ void sWaitFlip();
+ void vInitColor();
+
+ void delay(int cycles);
+ void delayClick(int cycles);
+ void pollEvents();
+ void startFade(CMapResource *cMap);
+ void addFadeInt();
+
+ void setCursor(PictureResource *pic);
+ void setCursor(byte *cursorData, int width, int height, int keyColor);
+ void setCursorColor(int idx, int mode);
+ void showCursor();
+ void hideCursor();
+ Common::Point getMousePos() { return _mousePos; }
+ uint32 getGameCounter() const { return _gameCounter; }
+ void getMouseInfo();
+ void startCursorBlink();
+ void incrementTime(int amt);
+
+ void stopEvidDim();
+
+ Common::String getEvidString(int eventIndex);
+};
+
+} // End of namespace Voyeur
+
+#endif /* VOYEUR_EVENTS_H */
diff --git a/engines/voyeur/files.cpp b/engines/voyeur/files.cpp
new file mode 100644
index 0000000000..300e086f75
--- /dev/null
+++ b/engines/voyeur/files.cpp
@@ -0,0 +1,1626 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public 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 "voyeur/files.h"
+#include "voyeur/graphics.h"
+#include "voyeur/voyeur.h"
+#include "voyeur/staticres.h"
+
+namespace Voyeur {
+
+#define BOLT_GROUP_SIZE 16
+
+BoltFilesState::BoltFilesState(VoyeurEngine *vm) : _vm(vm) {
+ _curLibPtr = NULL;
+ _curGroupPtr = NULL;
+ _curMemberPtr = NULL;
+ _bufferEnd = 0;
+ _bufferBegin = 0;
+ _bytesLeft = 0;
+ _bufSize = 0;
+ _bufStart = NULL;
+ _bufPos = NULL;
+ _historyIndex = 0;
+ _runLength = 0;
+ _decompState = false;
+ _runType = 0;
+ _runValue = 0;
+ _runOffset = 0;
+ Common::fill(&_historyBuffer[0], &_historyBuffer[0x200], 0);
+ _curFd = NULL;
+ _boltPageFrame = NULL;
+}
+
+#define NEXT_BYTE if (--_bytesLeft < 0) nextBlock()
+
+byte *BoltFilesState::decompress(byte *buf, int size, int mode) {
+ if (!buf) {
+ buf = new byte[size];
+ Common::fill(buf, buf + size, 0);
+ }
+ byte *bufP = buf;
+
+ if (mode & 8) {
+ _decompState = true;
+ _runType = 0;
+ _runLength = size;
+ }
+
+ while (size > 0) {
+ if (!_decompState) {
+ NEXT_BYTE;
+ byte nextByte = *_bufPos++;
+
+ switch (nextByte & 0xC0) {
+ case 0:
+ _runType = 0;
+ _runLength = 30 - (nextByte & 0x1f) + 1;
+ break;
+ case 0x40:
+ _runType = 1;
+ _runLength = 35 - (nextByte & 0x1f);
+ NEXT_BYTE;
+ _runOffset = *_bufPos++ + ((nextByte & 0x20) << 3);
+ break;
+ case 0x80:
+ _runType = 1;
+ _runLength = (nextByte & 0x20) ? ((32 - (nextByte & 0x1f)) << 2) + 2 :
+ (32 - (nextByte & 0x1f)) << 2;
+ NEXT_BYTE;
+ _runOffset = *_bufPos++ << 1;
+ break;
+ default:
+ _runType = 2;
+
+ if (nextByte & 0x20) {
+ _runLength = 0;
+ } else {
+ NEXT_BYTE;
+ _runLength = ((32 - (nextByte & 0x1f)) + (*_bufPos++ << 5)) << 2;
+ NEXT_BYTE;
+ _bufPos++;
+ NEXT_BYTE;
+ _runValue = *_bufPos++;
+ }
+ break;
+ }
+
+ _runOffset = _historyIndex - _runOffset;
+ }
+
+ int runOffset = _runOffset & 0x1ff;
+ int len;
+ if (_runLength <= size) {
+ len = _runLength;
+ _decompState = false;
+ } else {
+ _decompState = true;
+ len = size;
+ _runLength -= size;
+ if (_runType == 1)
+ _runOffset += len;
+ }
+
+ // Reduce the remaining size
+ size -= len;
+
+ // Handle the run lengths
+ switch (_runType) {
+ case 0:
+ while (len-- > 0) {
+ NEXT_BYTE;
+ byte v = *_bufPos++;
+ _historyBuffer[_historyIndex] = v;
+ *bufP++ = v;
+ _historyIndex = (_historyIndex + 1) & 0x1ff;
+ }
+ break;
+ case 1:
+ while (len-- > 0) {
+ _historyBuffer[_historyIndex] = _historyBuffer[runOffset];
+ *bufP++ = _historyBuffer[runOffset];
+ _historyIndex = (_historyIndex + 1) & 0x1ff;
+ runOffset = (runOffset + 1) & 0x1ff;
+ }
+ break;
+ default:
+ while (len-- > 0) {
+ _historyBuffer[_historyIndex] = _runValue;
+ *bufP++ = _runValue;
+ _historyIndex = (_historyIndex + 1) & 0x1ff;
+ }
+ break;
+ }
+ }
+
+ return buf;
+}
+
+#undef NEXT_BYTE
+
+void BoltFilesState::nextBlock() {
+ if (&_curLibPtr->_file != _curFd || _curFd->pos() != _bufferEnd)
+ _curLibPtr->_file.seek(_bufferEnd);
+
+ _curFd = &_curLibPtr->_file;
+ _bufferBegin = _bufferEnd;
+ int bytesRead = _curFd->read(_bufStart, _bufSize);
+
+ _bufferEnd = _curFd->pos();
+ _bytesLeft = bytesRead - 1;
+ _bufPos = _bufStart;
+}
+
+/*------------------------------------------------------------------------*/
+
+FilesManager::FilesManager(VoyeurEngine *vm) {
+ _curLibPtr = nullptr;
+ _boltFilesState = new BoltFilesState(vm);
+}
+
+FilesManager::~FilesManager() {
+ delete _boltFilesState;
+}
+
+bool FilesManager::openBoltLib(const Common::String &filename, BoltFile *&boltFile) {
+ if (boltFile != NULL) {
+ _boltFilesState->_curLibPtr = boltFile;
+ return true;
+ }
+
+ // Create the bolt file interface object and load the index
+ if (filename == "bvoy.blt")
+ boltFile = _boltFilesState->_curLibPtr = new BVoyBoltFile(*_boltFilesState);
+ else if (filename == "stampblt.blt")
+ boltFile = _boltFilesState->_curLibPtr = new StampBoltFile(*_boltFilesState);
+ else
+ error("Unknown bolt file specified");
+
+ return true;
+}
+
+byte *FilesManager::fload(const Common::String &filename, int *size) {
+ Common::File f;
+ int filesize;
+ byte *data = NULL;
+
+ if (f.open(filename)) {
+ // Read in the file
+ filesize = f.size();
+ data = new byte[filesize];
+ f.read(data, filesize);
+ } else {
+ filesize = 0;
+ }
+
+ if (size)
+ *size = filesize;
+ return data;
+}
+
+/*------------------------------------------------------------------------*/
+
+BoltFile::BoltFile(const Common::String &filename, BoltFilesState &state): _state(state) {
+ if (!_file.open(filename))
+ error("Could not open %s", filename.c_str());
+
+ // Read in the file header
+ byte header[16];
+ _file.read(&header[0], 16);
+
+ if (strncmp((const char *)&header[0], "BOLT", 4) != 0)
+ error("Tried to load non-bolt file");
+
+ int totalGroups = header[11] ? header[11] : 0x100;
+ for (int i = 0; i < totalGroups; ++i)
+ _groups.push_back(BoltGroup(&_file));
+}
+
+BoltFile::~BoltFile() {
+ _file.close();
+ if (_state._curFd == &_file)
+ _state._curFd = NULL;
+ if (_state._curLibPtr == this)
+ _state._curLibPtr = NULL;
+}
+
+BoltGroup *BoltFile::getBoltGroup(uint16 id) {
+ _state._curLibPtr = this;
+ _state._curGroupPtr = &_groups[(id >> 8) & 0xff];
+
+ if (!_state._curGroupPtr->_loaded) {
+ // Load the group index
+ _state._curGroupPtr->load(id & 0xff00);
+ }
+
+ // Pre-process the resources
+ id &= 0xff00;
+ for (int idx = 0; idx < _state._curGroupPtr->_count; ++idx, ++id) {
+ byte *member = getBoltMember(id);
+ assert(member);
+ }
+
+ resolveAll();
+
+ return _state._curGroupPtr;
+}
+
+void BoltFile::freeBoltGroup(uint16 id) {
+ _state._curLibPtr = this;
+ _state._curGroupPtr = &_groups[(id >> 8) & 0xff];
+
+ // Unload the group
+ _state._curGroupPtr->unload();
+}
+
+void BoltFile::freeBoltMember(uint32 id) {
+ // No implementation in ScummVM
+}
+
+BoltEntry &BoltFile::getBoltEntryFromLong(uint32 id) {
+ BoltGroup &group = _groups[id >> 24];
+ assert(group._loaded);
+
+ BoltEntry &entry = group._entries[(id >> 16) & 0xff];
+ assert(!entry.hasResource() || (id & 0xffff) == 0);
+
+ return entry;
+}
+
+BoltEntry &BoltFile::boltEntry(uint16 id) {
+ BoltGroup &group = _groups[id >> 8];
+ assert(group._loaded);
+
+ BoltEntry &entry = group._entries[id & 0xff];
+ assert(entry.hasResource());
+
+ return entry;
+}
+
+PictureResource *BoltFile::getPictureResource(uint32 id) {
+ if ((int32)id == -1)
+ return NULL;
+
+ if (id & 0xffff)
+ id <<= 16;
+ return getBoltEntryFromLong(id)._picResource;
+}
+
+CMapResource *BoltFile::getCMapResource(uint32 id) {
+ if ((int32)id == -1)
+ return NULL;
+
+ if (id & 0xffff)
+ id <<= 16;
+
+ return getBoltEntryFromLong(id)._cMapResource;
+}
+
+byte *BoltFile::memberAddr(uint32 id) {
+ BoltGroup &group = _groups[id >> 8];
+ if (!group._loaded)
+ return NULL;
+
+ // If an entry already has a processed representation, we shouldn't
+ // still be accessing the raw data
+ BoltEntry &entry = group._entries[id & 0xff];
+ assert(!entry.hasResource());
+
+ return entry._data;
+}
+
+byte *BoltFile::memberAddrOffset(uint32 id) {
+ BoltGroup &group = _groups[id >> 24];
+ if (!group._loaded)
+ return NULL;
+
+ // If an entry already has a processed representation, we shouldn't
+ // still be accessing the raw data
+ BoltEntry &entry = group._entries[(id >> 16) & 0xff];
+ assert(!entry.hasResource());
+
+ return entry._data + (id & 0xffff);
+}
+
+/**
+ * Resolves an Id to an offset within a loaded resource
+ */
+void BoltFile::resolveIt(uint32 id, byte **p) {
+ if ((int32)id == -1) {
+ *p = NULL;
+ } else {
+ byte *ptr = memberAddrOffset(id);
+ if (ptr) {
+ *p = ptr;
+ } else {
+ *p = NULL;
+ assert(_state._resolves.size() < 1000);
+ _state._resolves.push_back(ResolveEntry(id, p));
+ }
+ }
+}
+
+void BoltFile::resolveFunction(uint32 id, GraphicMethodPtr *fn) {
+ if ((int32)id == -1)
+ *fn = NULL;
+ else
+ error("Function fnTermGro array not supported");
+}
+
+/**
+ * Resolve any data references to within resources that weren't
+ * previously loaded, but are now
+ */
+void BoltFile::resolveAll() {
+ for (uint idx = 0; idx < _state._resolves.size(); ++idx)
+ *_state._resolves[idx]._p = memberAddrOffset(_state._resolves[idx]._id);
+
+ _state._resolves.clear();
+}
+
+byte *BoltFile::getBoltMember(uint32 id) {
+ _state._curLibPtr = this;
+
+ // Get the group, and load it's entry list if not already loaded
+ _state._curGroupPtr = &_groups[(id >> 8) & 0xff];
+ if (!_state._curGroupPtr->_loaded)
+ _state._curGroupPtr->load(id & 0xff00);
+
+ // Get the entry
+ _state._curMemberPtr = &_state._curGroupPtr->_entries[id & 0xff];
+
+ // Return the data for the entry if it's already been loaded
+ if (_state._curMemberPtr->_data)
+ return _state._curMemberPtr->_data;
+
+ if (_state._curGroupPtr->_processed) {
+ error("Processed resources are not supported");
+ } else {
+ _state._bufStart = _state._decompressBuf;
+ _state._bufSize = DECOMPRESS_SIZE;
+
+ if ((_state._curFd != &_file) || (_state._curMemberPtr->_fileOffset < _state._bufferBegin)
+ || (_state._curMemberPtr->_fileOffset >= _state._bufferEnd)) {
+ _state._bytesLeft = 0;
+ _state._bufPos = _state._bufStart;
+ _state._bufferBegin = -1;
+ _state._bufferEnd = _state._curMemberPtr->_fileOffset;
+ } else {
+ _state._bufPos = _state._curMemberPtr->_fileOffset - _state._bufferBegin + _state._bufStart;
+ _state._bytesLeft = _state._bufSize - (_state._bufPos - _state._bufStart);
+ }
+ }
+
+ _state._decompState = false;
+ _state._historyIndex = 0;
+
+ // Initialize the resource
+ assert(_state._curMemberPtr->_initMethod < 25);
+ initResource(_state._curMemberPtr->_initMethod);
+
+ return _state._curMemberPtr->_data;
+}
+
+void BoltFile::initDefault() {
+ _state._curMemberPtr->_data = _state.decompress(NULL, _state._curMemberPtr->_size,
+ _state._curMemberPtr->_mode);
+}
+
+/*------------------------------------------------------------------------*/
+
+BVoyBoltFile::BVoyBoltFile(BoltFilesState &state): BoltFile("bvoy.blt", state) {
+}
+
+void BVoyBoltFile::initResource(int resType) {
+ switch (resType) {
+ case 2:
+ // Also used for point list, and ending credits credit data
+ sInitRect();
+ break;
+ case 8:
+ sInitPic();
+ break;
+ case 10:
+ vInitCMap();
+ break;
+ case 11:
+ vInitCycl();
+ break;
+ case 15:
+ initViewPort();
+ break;
+ case 16:
+ initViewPortList();
+ break;
+ case 17:
+ initFont();
+ break;
+ case 18:
+ initFontInfo();
+ break;
+ case 19:
+ initSoundMap();
+ break;
+ default:
+ initDefault();
+ break;
+ }
+}
+
+void BVoyBoltFile::initViewPort() {
+ initDefault();
+
+ ViewPortResource *viewPort;
+ byte *src = _state._curMemberPtr->_data;
+ _state._curMemberPtr->_viewPortResource = viewPort = new ViewPortResource(_state, src);
+
+ // This is done post-constructor, since viewports can be self referential, so
+ // we need the _viewPortResource field to have been set before resolving the pointer
+ viewPort->_parent = getBoltEntryFromLong(READ_LE_UINT32(src + 2))._viewPortResource;
+}
+
+void BVoyBoltFile::initViewPortList() {
+ initDefault();
+
+ ViewPortListResource *res;
+ _state._curMemberPtr->_viewPortListResource = res = new ViewPortListResource(
+ _state, _state._curMemberPtr->_data);
+
+ _state._vm->_graphicsManager->_viewPortListPtr = res;
+ _state._vm->_graphicsManager->_vPort = res->_entries[0];
+}
+
+void BVoyBoltFile::initFontInfo() {
+ initDefault();
+ _state._curMemberPtr->_fontInfoResource = new FontInfoResource(
+ _state, _state._curMemberPtr->_data);
+}
+
+void BVoyBoltFile::initFont() {
+ initDefault();
+ _state._curMemberPtr->_fontResource = new FontResource(_state, _state._curMemberPtr->_data);
+}
+
+void BVoyBoltFile::initSoundMap() {
+ initDefault();
+}
+
+void BVoyBoltFile::sInitRect() {
+ _state._curMemberPtr->_data = _state.decompress(NULL, _state._curMemberPtr->_size,
+ _state._curMemberPtr->_mode);
+
+ // Check whether the resource Id is in the list of extended rects
+ bool isExtendedRects = false;
+ for (int i = 0; i < 49 && !isExtendedRects; ++i)
+ isExtendedRects = RESOLVE_TABLE[i] == (_state._curMemberPtr->_id & 0xff00);
+
+ int rectSize = isExtendedRects ? 12 : 8;
+ if ((_state._curMemberPtr->_size % rectSize) == 0 || (_state._curMemberPtr->_size % rectSize) == 2)
+ _state._curMemberPtr->_rectResource = new RectResource(_state._curMemberPtr->_data,
+ _state._curMemberPtr->_size, isExtendedRects);
+}
+
+void BVoyBoltFile::sInitPic() {
+ // Read in the header data
+ _state._curMemberPtr->_data = _state.decompress(NULL, 24, _state._curMemberPtr->_mode);
+ _state._curMemberPtr->_picResource = new PictureResource(_state,
+ _state._curMemberPtr->_data);
+}
+
+void BVoyBoltFile::vInitCMap() {
+ initDefault();
+ _state._curMemberPtr->_cMapResource = new CMapResource(
+ _state, _state._curMemberPtr->_data);
+}
+
+void BVoyBoltFile::vInitCycl() {
+ initDefault();
+ _state._curMemberPtr->_vInitCycleResource = new VInitCycleResource(
+ _state, _state._curMemberPtr->_data);
+ _state._curMemberPtr->_vInitCycleResource->vStopCycle();
+}
+
+/*------------------------------------------------------------------------*/
+
+StampBoltFile::StampBoltFile(BoltFilesState &state): BoltFile("stampblt.blt", state) {
+}
+
+void StampBoltFile::initResource(int resType) {
+ switch (resType) {
+ case 0:
+ initThread();
+ break;
+ case 4:
+ initState();
+ break;
+ case 6:
+ initPtr();
+ break;
+ case 24:
+ initControl();
+ break;
+ default:
+ initDefault();
+ break;
+ }
+}
+
+void StampBoltFile::initThread() {
+ initDefault();
+
+ _state._curMemberPtr->_threadResource = new ThreadResource(_state,
+ _state._curMemberPtr->_data);
+}
+
+void StampBoltFile::initPtr() {
+ initDefault();
+
+ _state._curMemberPtr->_ptrResource = new PtrResource(_state,
+ _state._curMemberPtr->_data);
+}
+
+ void initControlData();
+
+
+void StampBoltFile::initControl() {
+ initDefault();
+
+ ControlResource *res;
+ _state._curMemberPtr->_controlResource = res = new ControlResource(_state,
+ _state._curMemberPtr->_data);
+
+ _state._vm->_controlGroupPtr = _state._curGroupPtr;
+ _state._vm->_controlPtr = res;
+}
+
+void StampBoltFile::initState() {
+ initDefault();
+
+ assert(_state._curMemberPtr->_size == 16);
+ _state._curMemberPtr->_stateResource = new StateResource(_state,
+ _state._curMemberPtr->_data);
+}
+
+/*------------------------------------------------------------------------*/
+
+BoltGroup::BoltGroup(Common::SeekableReadStream *f): _file(f) {
+ byte buffer[BOLT_GROUP_SIZE];
+
+ _loaded = false;
+
+ _file->read(&buffer[0], BOLT_GROUP_SIZE);
+ _processed = buffer[0] != 0;
+ _count = buffer[3] ? buffer[3] : 256;
+ _fileOffset = READ_LE_UINT32(&buffer[8]);
+}
+
+BoltGroup::~BoltGroup() {
+}
+
+void BoltGroup::load(uint16 groupId) {
+ _file->seek(_fileOffset);
+
+ // Read the entries
+ for (int i = 0; i < _count; ++i)
+ _entries.push_back(BoltEntry(_file, groupId + i));
+
+ _loaded = true;
+}
+
+void BoltGroup::unload() {
+ if (!_loaded)
+ return;
+
+ _entries.clear();
+ _loaded = false;
+}
+
+/*------------------------------------------------------------------------*/
+
+BoltEntry::BoltEntry(Common::SeekableReadStream *f, uint16 id): _file(f), _id(id) {
+ _data = nullptr;
+ _rectResource = nullptr;
+ _picResource = nullptr;
+ _viewPortResource = nullptr;
+ _viewPortListResource = nullptr;
+ _fontResource = nullptr;
+ _fontInfoResource = nullptr;
+ _cMapResource = nullptr;
+ _vInitCycleResource = nullptr;
+
+ _ptrResource = nullptr;
+ _stateResource = nullptr;
+ _controlResource = nullptr;
+ _vInitCycleResource = nullptr;
+ _threadResource = nullptr;
+
+ byte buffer[16];
+ _file->read(&buffer[0], 16);
+ _mode = buffer[0];
+ _initMethod = buffer[3];
+ _size = READ_LE_UINT32(&buffer[4]) & 0xffffff;
+ _fileOffset = READ_LE_UINT32(&buffer[8]);
+}
+
+BoltEntry::~BoltEntry() {
+ delete[] _data;
+ delete _rectResource;
+ delete _picResource;
+ delete _viewPortResource;
+ delete _viewPortListResource;
+ delete _fontResource;
+ delete _fontInfoResource;
+ delete _cMapResource;
+
+ delete _ptrResource;
+ delete _controlResource;
+ delete _stateResource;
+ delete _vInitCycleResource;
+ delete _threadResource;
+}
+
+void BoltEntry::load() {
+ // Currently, all entry loading and decompression is done in BoltFile::memberAddr.
+}
+
+/**
+ * Returns true if the given bolt entry has an attached resource
+ */
+bool BoltEntry::hasResource() const {
+ return _rectResource || _picResource || _viewPortResource || _viewPortListResource
+ || _fontResource || _fontInfoResource || _cMapResource || _vInitCycleResource
+ || _ptrResource || _controlResource || _stateResource || _threadResource;
+}
+
+/*------------------------------------------------------------------------*/
+
+RectEntry::RectEntry(int x1, int y1, int x2, int y2, int arrIndex, int count):
+ Common::Rect(x1, y1, x2, y2), _arrIndex(arrIndex), _count(count) {
+}
+
+/*------------------------------------------------------------------------*/
+
+RectResource::RectResource(const byte *src, int size, bool isExtendedRects) {
+ int count;
+ int rectSize = isExtendedRects ? 12 : 8;
+ if ((size % rectSize) == 2) {
+ count = READ_LE_UINT16(src);
+ src += 2;
+ } else {
+ count = size / rectSize;
+ }
+
+ for (int i = 0; i < count; ++i, src += 8) {
+ int arrIndex = 0, rectCount = 0;
+ if (isExtendedRects) {
+ arrIndex = READ_LE_UINT16(src);
+ rectCount = READ_LE_UINT16(src + 2);
+ src += 4;
+ }
+
+ int x1 = READ_LE_UINT16(src);
+ int y1 = READ_LE_UINT16(src + 2);
+ int x2 = READ_LE_UINT16(src + 4);
+ int y2 = READ_LE_UINT16(src + 6);
+
+ _entries.push_back(RectEntry(x1, y1, x2, y2, arrIndex, rectCount));
+ }
+
+ left = _entries[0].left;
+ top = _entries[0].top;
+ right = _entries[0].right;
+ bottom = _entries[0].bottom;
+}
+
+RectResource::RectResource(int x1, int y1, int x2, int y2) {
+ left = x1;
+ top = y1;
+ right = x2;
+ bottom = y2;
+}
+
+/*------------------------------------------------------------------------*/
+
+DisplayResource::DisplayResource() {
+ _vm = NULL;
+ _flags = DISPFLAG_NONE;
+}
+
+DisplayResource::DisplayResource(VoyeurEngine *vm) {
+ _vm = vm;
+ _flags = DISPFLAG_NONE;
+}
+
+void DisplayResource::sFillBox(int width, int height) {
+ assert(_vm);
+ bool saveBack = _vm->_graphicsManager->_saveBack;
+ _vm->_graphicsManager->_saveBack = false;
+
+ PictureResource pr;
+ pr._flags = DISPFLAG_1;
+ pr._select = 0xff;
+ pr._pick = 0;
+ pr._onOff = _vm->_graphicsManager->_drawPtr->_penColor;
+ pr._bounds = Common::Rect(0, 0, width, height);
+
+ _vm->_graphicsManager->sDrawPic(&pr, this, _vm->_graphicsManager->_drawPtr->_pos);
+ _vm->_graphicsManager->_saveBack = saveBack;
+}
+
+bool DisplayResource::clipRect(Common::Rect &rect) {
+ Common::Rect clippingRect;
+ if (_vm->_graphicsManager->_clipPtr) {
+ clippingRect = *_vm->_graphicsManager->_clipPtr;
+ } else if (_flags & DISPFLAG_VIEWPORT) {
+ clippingRect = ((ViewPortResource *)this)->_clipRect;
+ } else {
+ clippingRect = ((PictureResource *)this)->_bounds;
+ }
+
+ Common::Rect r = rect;
+ if (r.left < clippingRect.left) {
+ if (r.right <= clippingRect.left)
+ return false;
+ r.setWidth(r.right - clippingRect.left);
+ }
+ if (r.right >= clippingRect.right) {
+ if (r.left >= clippingRect.left)
+ return false;
+ r.setWidth(clippingRect.right - r.left);
+ }
+
+ if (r.top < clippingRect.top) {
+ if (r.bottom <= clippingRect.top)
+ return false;
+ r.setHeight(r.bottom - clippingRect.top);
+ }
+ if (r.bottom >= clippingRect.bottom) {
+ if (r.top >= clippingRect.top)
+ return false;
+ r.setWidth(clippingRect.bottom - r.top);
+ }
+
+ rect = r;
+ return true;
+}
+
+int DisplayResource::drawText(const Common::String &msg) {
+ GraphicsManager &gfxManager = *_vm->_graphicsManager;
+ assert(gfxManager._fontPtr);
+ assert(gfxManager._fontPtr->_curFont);
+ FontInfoResource &fontInfo = *gfxManager._fontPtr;
+ PictureResource &fontChar = *_vm->_graphicsManager->_fontChar;
+ FontResource &fontData = *fontInfo._curFont;
+ int xShadows[9] = { 0, 1, 1, 1, 0, -1, -1, -1, 0 };
+ int yShadows[9] = { 0, 1, 0, -1, -1, -1, 0, 1, 1 };
+
+ Common::Rect *clipPtr = gfxManager._clipPtr;
+ if (!(fontInfo._picFlags & DISPFLAG_1))
+ gfxManager._clipPtr = NULL;
+
+ int minChar = fontData._minChar;
+ int padding = fontData._padding;
+ int fontHeight = fontData._fontHeight;
+ int totalChars = fontData._maxChar - fontData._minChar;
+ int msgWidth = 0;
+ int xp = 0, yp = 0;
+
+ Common::Point pos = Common::Point(fontInfo._pos.x, fontInfo._pos.y + fontData._topPadding);
+
+ fontChar._flags = fontInfo._picFlags | DISPFLAG_2;
+ fontChar._select = fontInfo._picSelect;
+ fontChar._bounds.setHeight(fontHeight);
+
+ ViewPortResource *viewPort = !(_flags & DISPFLAG_VIEWPORT) ? NULL :
+ (ViewPortResource *)this;
+
+ if ((fontInfo._fontFlags & DISPFLAG_1) || fontInfo._justify ||
+ (gfxManager._saveBack && fontInfo._fontSaveBack && (_flags & DISPFLAG_VIEWPORT))) {
+ msgWidth = viewPort->textWidth(msg);
+ yp = pos.y;
+ xp = pos.x;
+
+ switch (fontInfo._justify) {
+ case 1:
+ xp = pos.x + (fontInfo._justifyWidth / 2) - (msgWidth / 2);
+ break;
+ case 2:
+ xp = pos.x + fontInfo._justifyWidth - msgWidth;
+ break;
+ default:
+ break;
+ }
+
+ if (!(fontInfo._fontFlags & (DISPFLAG_1 | DISPFLAG_2))) {
+ viewPort->_fontRect.left = xp;
+ viewPort->_fontRect.top = yp;
+ viewPort->_fontRect.setWidth(msgWidth);
+ viewPort->_fontRect.setHeight(fontHeight);
+ } else {
+ viewPort->_fontRect.left = pos.x;
+ viewPort->_fontRect.top = pos.y;
+ viewPort->_fontRect.setWidth(fontInfo._justifyWidth);
+ viewPort->_fontRect.setHeight(fontInfo._justifyHeight);
+ }
+
+ pos.x = xp;
+ pos.y = yp;
+
+ if (fontInfo._fontFlags & DISPFLAG_4) {
+ if (fontInfo._shadow.x <= 0) {
+ viewPort->_fontRect.left += fontInfo._shadow.x;
+ viewPort->_fontRect.right -= fontInfo._shadow.x * 2;
+ } else {
+ viewPort->_fontRect.right += fontInfo._shadow.x;
+ }
+
+ if (fontInfo._shadow.y <= 0) {
+ viewPort->_fontRect.top += fontInfo._shadow.y;
+ viewPort->_fontRect.bottom -= fontInfo._shadow.y * 2;
+ } else {
+ viewPort->_fontRect.bottom += fontInfo._shadow.y;
+ }
+ } else if (fontInfo._fontFlags & 8) {
+ if (fontInfo._shadow.x <= 0) {
+ viewPort->_fontRect.left += fontInfo._shadow.x;
+ viewPort->_fontRect.right -= fontInfo._shadow.x * 3;
+ } else {
+ viewPort->_fontRect.right += fontInfo._shadow.x * 3;
+ viewPort->_fontRect.left -= fontInfo._shadow.x;
+ }
+
+ if (fontInfo._shadow.y <= 0) {
+ viewPort->_fontRect.top += fontInfo._shadow.y;
+ viewPort->_fontRect.bottom -= fontInfo._shadow.y * 3;
+ } else {
+ viewPort->_fontRect.bottom += fontInfo._shadow.y * 3;
+ viewPort->_fontRect.top -= fontInfo._shadow.y;
+ }
+ }
+ }
+
+ if (gfxManager._saveBack && fontInfo._fontSaveBack && (_flags & DISPFLAG_VIEWPORT)) {
+ viewPort->addSaveRect(viewPort->_pageIndex, viewPort->_fontRect);
+ }
+
+ if (fontInfo._fontFlags & DISPFLAG_1) {
+ gfxManager._drawPtr->_pos = Common::Point(viewPort->_fontRect.left, viewPort->_fontRect.top);
+ gfxManager._drawPtr->_penColor = fontInfo._backColor;
+ sFillBox(viewPort->_fontRect.width(), viewPort->_fontRect.height());
+ }
+
+ bool saveBack = gfxManager._saveBack;
+ gfxManager._saveBack = false;
+
+ int count = 0;
+ if (fontInfo._fontFlags & DISPFLAG_4)
+ count = 1;
+ else if (fontInfo._fontFlags & DISPFLAG_8)
+ count = 8;
+
+ for (int i = count; i >= 0; --i) {
+ xp = pos.x;
+ yp = pos.y;
+
+ switch (xShadows[i]) {
+ case -1:
+ xp -= fontInfo._shadow.x;
+ break;
+ case 1:
+ xp += fontInfo._shadow.x;
+ break;
+ default:
+ break;
+ }
+
+ switch (yShadows[i]) {
+ case -1:
+ yp -= fontInfo._shadow.y;
+ break;
+ case 1:
+ yp += fontInfo._shadow.y;
+ break;
+ default:
+ break;
+ }
+
+ if (i != 0) {
+ fontChar._pick = 0;
+ fontChar._onOff = fontInfo._shadowColor;
+ } else if (fontData._fontDepth == 1 || (fontInfo._fontFlags & DISPFLAG_10)) {
+ fontChar._pick = 0;
+ fontChar._onOff = fontInfo._foreColor;
+ } else {
+ fontChar._pick = fontInfo._picPick;
+ fontChar._onOff = fontInfo._picOnOff;
+ }
+
+ // Loop to draw each character in turn
+ msgWidth = -padding;
+ const char *msgP = msg.c_str();
+ char ch;
+
+ while ((ch = *msgP++) != '\0') {
+ int charValue = (int)ch - minChar;
+ if (charValue < 0 || charValue >= totalChars || fontData._charWidth[charValue] == 0)
+ charValue = fontData._maxChar - minChar;
+
+ int charWidth = fontData._charWidth[charValue];
+ fontChar._bounds.setWidth(charWidth);
+
+ uint16 offset = READ_LE_UINT16(fontData._charOffsets + charValue * 2);
+ fontChar._imgData = fontData._charImages + offset * 2;
+
+ gfxManager.sDrawPic(&fontChar, this, Common::Point(xp, yp));
+
+ fontChar._imgData = NULL;
+ xp += charWidth + padding;
+ msgWidth += charWidth + padding;
+ }
+ }
+
+ msgWidth = MAX(msgWidth, 0);
+ if (fontInfo._justify == ALIGN_LEFT)
+ fontInfo._pos.x = xp;
+
+ gfxManager._saveBack = saveBack;
+ gfxManager._clipPtr = clipPtr;
+
+ return msgWidth;
+}
+
+int DisplayResource::textWidth(const Common::String &msg) {
+ if (msg.size() == 0)
+ return 0;
+
+ const char *msgP = msg.c_str();
+ FontResource &fontData = *_vm->_graphicsManager->_fontPtr->_curFont;
+ int minChar = fontData._minChar;
+ int maxChar = fontData._maxChar;
+ int padding = fontData._padding;
+ int totalWidth = -padding;
+ char ch;
+
+ // Loop through the characters
+ while ((ch = *msgP++) != '\0') {
+ int charValue = (int)ch;
+ if (charValue < minChar || charValue > maxChar)
+ charValue = maxChar;
+
+ if (!fontData._charWidth[charValue - minChar])
+ charValue = maxChar;
+
+ totalWidth += fontData._charWidth[charValue - minChar] + padding;
+ }
+
+ if (totalWidth < 0)
+ totalWidth = 0;
+ return totalWidth;
+}
+
+/*------------------------------------------------------------------------*/
+
+PictureResource::PictureResource(BoltFilesState &state, const byte *src):
+ DisplayResource(state._vm) {
+ _flags = READ_LE_UINT16(src);
+ _select = src[2];
+ _pick = src[3];
+ _onOff = src[4];
+ // depth is in src[5], unused.
+
+ int xs = READ_LE_UINT16(&src[6]);
+ int ys = READ_LE_UINT16(&src[8]);
+ _bounds = Common::Rect(xs, ys, xs + READ_LE_UINT16(&src[10]),
+ ys + READ_LE_UINT16(&src[12]));
+ _maskData = READ_LE_UINT32(&src[14]);
+ _planeSize = READ_LE_UINT16(&src[22]);
+
+ _keyColor = 0;
+ _imgData = NULL;
+ _freeImgData = DisposeAfterUse::YES;
+
+ int nbytes = _bounds.width() * _bounds.height();
+ if (_flags & PICFLAG_20) {
+ if (_flags & (PICFLAG_VFLIP | PICFLAG_HFLIP)) {
+ // Get the raw data for the picture from another resource
+ uint32 id = READ_LE_UINT32(&src[18]);
+ const byte *srcData = state._curLibPtr->boltEntry(id)._data;
+ _imgData = new byte[nbytes];
+
+ // Flip the image data either horizontally or vertically
+ if (_flags & PICFLAG_HFLIP)
+ flipHorizontal(srcData);
+ else
+ flipVertical(srcData);
+ } else {
+ uint32 id = READ_LE_UINT32(&src[18]) >> 16;
+ byte *imgData = state._curLibPtr->boltEntry(id)._picResource->_imgData;
+ _freeImgData = DisposeAfterUse::NO;
+
+#if 0
+ // TODO: Double check code below. Despite different coding in the
+ // original, both looked like they do the same formula.
+ // Until it's clarified, this check is disabled and replaced by the
+ // common code.
+ if (_flags & PICFLAG_PIC_OFFSET) {
+ _imgData = imgData + (READ_LE_UINT32(&src[18]) & 0xffff);
+ } else {
+ _imgData = imgData + (READ_LE_UINT32(&src[18]) & 0xffff);
+ }
+#endif
+ _imgData = imgData + (READ_LE_UINT32(&src[18]) & 0xffff);
+ }
+ } else if (_flags & PICFLAG_PIC_OFFSET) {
+ int mode = 0;
+ if (_bounds.width() == 320)
+ mode = 147;
+ else {
+ if (_bounds.width() == 640) {
+ if (_bounds.height() == 400)
+ mode = 220;
+ else
+ mode = 221;
+ } else if (_bounds.width() == 800)
+ mode = 222;
+ else if (_bounds.width() == 1024)
+ mode = 226;
+ }
+
+ if (mode != state._vm->_graphicsManager->_SVGAMode) {
+ state._vm->_graphicsManager->_SVGAMode = mode;
+ state._vm->_graphicsManager->clearPalette();
+ }
+
+ int screenOffset = READ_LE_UINT32(&src[18]) & 0xffff;
+ assert(screenOffset == 0);
+
+ if (_flags & PICFLAG_CLEAR_SCREEN) {
+ // Clear screen picture. That's right. This game actually has a picture
+ // resource flag to clear the screen! Bizarre.
+ Graphics::Surface &s = state._vm->_graphicsManager->_screenSurface;
+ s.fillRect(Common::Rect(0, 0, SCREEN_WIDTH, SCREEN_HEIGHT), 0);
+ } else {
+ // Direct screen loading picture. In this case, the raw data of the resource
+ // is directly decompressed into the screen surface. Again, bizarre.
+ byte *pDest = (byte *)state._vm->_graphicsManager->_screenSurface.getPixels();
+ state.decompress(pDest, SCREEN_WIDTH * SCREEN_HEIGHT, state._curMemberPtr->_mode);
+ }
+ } else {
+ if (_flags & PICFLAG_CLEAR_SCREEN00) {
+ if (!(_flags & PICFLAG_CLEAR_SCREEN))
+ nbytes = state._curMemberPtr->_size - 24;
+
+ int mask = (nbytes + 0x3FFF) >> 14;
+ _imgData = NULL;
+
+ if (state._boltPageFrame != NULL) {
+ _maskData = mask;
+ state.decompress(state._boltPageFrame, nbytes, state._curMemberPtr->_mode);
+ return;
+ }
+ }
+
+ if (_flags & PICFLAG_CLEAR_SCREEN) {
+ _imgData = new byte[nbytes];
+ Common::fill(_imgData, _imgData + nbytes, 0);
+ } else {
+ _imgData = state.decompress(NULL, nbytes, state._curMemberPtr->_mode);
+ }
+ }
+}
+
+PictureResource::PictureResource(Graphics::Surface *surface) {
+ _flags = DISPFLAG_NONE;
+ _select = 0;
+ _pick = 0;
+ _onOff = 0;
+ _maskData = 0;
+ _planeSize = 0;
+ _keyColor = 0;
+
+ _bounds = Common::Rect(0, 0, surface->w, surface->h);
+ _imgData = (byte *)surface->getPixels();
+ _freeImgData = DisposeAfterUse::NO;
+}
+
+PictureResource::PictureResource() {
+ _flags = DISPFLAG_NONE;
+ _select = 0;
+ _pick = 0;
+ _onOff = 0;
+ _maskData = 0;
+ _planeSize = 0;
+ _keyColor = 0;
+
+ _imgData = NULL;
+ _freeImgData = DisposeAfterUse::NO;
+}
+
+PictureResource::PictureResource(int flags, int select, int pick, int onOff,
+ const Common::Rect &bounds, int maskData, byte *imgData, int planeSize) {
+ _flags = flags;
+ _select = select;
+ _pick = pick;
+ _onOff = onOff;
+ _bounds = bounds;
+ _maskData = maskData;
+ _imgData = imgData;
+ _planeSize = planeSize;
+ _freeImgData = DisposeAfterUse::NO;
+ _keyColor = 0;
+}
+
+PictureResource::~PictureResource() {
+ if (_freeImgData == DisposeAfterUse::YES)
+ delete[] _imgData;
+}
+
+void PictureResource::flipHorizontal(const byte *data) {
+ const byte *srcP = data + 18;
+ byte *destP = _imgData + _bounds.width() - 1;
+
+ for (int y = 0; y < _bounds.height(); ++y) {
+ for (int x = 0; x < _bounds.width(); ++x, ++srcP, --destP)
+ *destP = *srcP;
+
+ srcP += _bounds.width();
+ destP += _bounds.width();
+ }
+}
+
+void PictureResource::flipVertical(const byte *data) {
+ const byte *srcP = data + 18;
+ byte *destP = _imgData + _bounds.width() * (_bounds.height() - 1);
+
+ for (int y = 0; y < _bounds.height(); ++y) {
+ Common::copy(srcP, srcP + _bounds.width(), destP);
+ srcP += _bounds.width();
+ destP -= _bounds.width();
+ }
+}
+
+/*------------------------------------------------------------------------*/
+
+ViewPortResource::ViewPortResource(BoltFilesState &state, const byte *src):
+ _state(state), DisplayResource(state._vm) {
+ _flags = READ_LE_UINT16(src);
+ _parent = NULL;
+ _pageCount = READ_LE_UINT16(src + 6);
+ _pageIndex = READ_LE_UINT16(src + 8);
+ _lastPage = READ_LE_UINT16(src + 10);
+
+ int xs = READ_LE_UINT16(src + 12);
+ int ys = READ_LE_UINT16(src + 14);
+ _bounds = Common::Rect(xs, ys, xs + READ_LE_UINT16(src + 16),
+ ys + READ_LE_UINT16(src + 18));
+
+ _currentPic = state._curLibPtr->getPictureResource(READ_LE_UINT32(src + 0x20));
+ _activePage = state._curLibPtr->getPictureResource(READ_LE_UINT32(src + 0x24));
+ _pages[0] = state._curLibPtr->getPictureResource(READ_LE_UINT32(src + 0x28));
+ _pages[1] = state._curLibPtr->getPictureResource(READ_LE_UINT32(src + 0x2C));
+
+ byte *dummy;
+ state._curLibPtr->resolveIt(READ_LE_UINT32(src + 0x30), &dummy);
+
+ // Get the rect list
+ for (int listIndex = 0; listIndex < 3; ++listIndex) {
+ _rectListCount[listIndex] = (int16)READ_LE_UINT16(src + 0x40 + 2 * listIndex);
+ int id = (int)READ_LE_UINT32(src + 0x34 + listIndex * 4);
+
+ if (id == -1) {
+ _rectListPtr[listIndex] = NULL;
+ } else {
+ _rectListPtr[listIndex] = new Common::Array<Common::Rect>();
+
+ if (_rectListCount[listIndex] > 0) {
+ int16 *rectList = (int16 *)state._curLibPtr->memberAddrOffset(id);
+ for (int i = 0; i < _rectListCount[listIndex]; ++i) {
+ xs = FROM_LE_16(rectList[0]);
+ ys = FROM_LE_16(rectList[1]);
+ _rectListPtr[i]->push_back(Common::Rect(xs, ys, xs + FROM_LE_16(rectList[2]),
+ ys + FROM_LE_16(rectList[3])));
+ }
+ }
+ }
+ }
+
+ xs = READ_LE_UINT16(src + 0x46);
+ ys = READ_LE_UINT16(src + 0x48);
+ _clipRect = Common::Rect(xs, ys, xs + READ_LE_UINT16(src + 0x4A),
+ ys + READ_LE_UINT16(src + 0x4C));
+
+ state._curLibPtr->resolveIt(READ_LE_UINT32(src + 0x7A), &dummy);
+ state._curLibPtr->resolveFunction(READ_LE_UINT32(src + 0x7E), (GraphicMethodPtr *)&_fn1);
+ state._curLibPtr->resolveFunction(READ_LE_UINT32(src + 0x82), (GraphicMethodPtr *)&_setupFn);
+ state._curLibPtr->resolveFunction(READ_LE_UINT32(src + 0x86), (GraphicMethodPtr *)&_addFn);
+ state._curLibPtr->resolveFunction(READ_LE_UINT32(src + 0x8A), (GraphicMethodPtr *)&_restoreFn);
+
+ if (!_restoreFn && _addFn)
+ _addFn = &GraphicsManager::addRectNoSaveBack;
+}
+
+ViewPortResource::~ViewPortResource() {
+ for (int i = 0; i < 3; ++i)
+ delete _rectListPtr[i];
+}
+
+void ViewPortResource::setupViewPort(PictureResource *page, Common::Rect *clippingRect,
+ ViewPortSetupPtr setupFn, ViewPortAddPtr addFn, ViewPortRestorePtr restoreFn) {
+ PictureResource *pic = _currentPic;
+ Common::Rect r = _bounds;
+ r.translate(pic->_bounds.left, pic->_bounds.top);
+ int xDiff, yDiff;
+
+ if (page) {
+ // Clip based on the passed picture resource
+ xDiff = page->_bounds.left - r.left;
+ yDiff = page->_bounds.top - r.top;
+
+ if (xDiff > 0) {
+ int width = r.width();
+ r.left = page->_bounds.left;
+ r.setWidth(xDiff <= width ? width - xDiff : 0);
+ }
+ if (yDiff > 0) {
+ int height = r.height();
+ r.top = page->_bounds.top;
+ r.setHeight(yDiff <= height ? height - yDiff : 0);
+ }
+
+ xDiff = r.right - page->_bounds.right;
+ yDiff = r.bottom - page->_bounds.bottom;
+
+ if (xDiff > 0)
+ r.setWidth(xDiff <= r.width() ? r.width() - xDiff : 0);
+ if (yDiff > 0)
+ r.setHeight(yDiff <= r.height() ? r.height() - yDiff : 0);
+ }
+
+ if (clippingRect) {
+ // Clip based on the passed clip rectangles
+ xDiff = clippingRect->left - r.left;
+ yDiff = clippingRect->top - r.top;
+
+ if (xDiff > 0) {
+ int width = r.width();
+ r.left = clippingRect->left;
+ r.setWidth(xDiff <= width ? width - xDiff : 0);
+ }
+ if (yDiff > 0) {
+ int height = r.height();
+ r.top = clippingRect->top;
+ r.setHeight(yDiff <= height ? height - yDiff : 0);
+ }
+
+ xDiff = r.right - clippingRect->right;
+ yDiff = r.bottom - clippingRect->bottom;
+
+ if (xDiff > 0)
+ r.setWidth(xDiff <= r.width() ? r.width() - xDiff : 0);
+ if (yDiff > 0)
+ r.setHeight(yDiff <= r.height() ? r.height() - yDiff : 0);
+ }
+
+ _activePage = page;
+ _clipRect = r;
+ _setupFn = setupFn;
+ _addFn = addFn;
+ _restoreFn = restoreFn;
+
+ if (setupFn)
+ (_state._vm->_graphicsManager->*setupFn)(this);
+}
+
+void ViewPortResource::setupViewPort() {
+ setupViewPort(_state._vm->_graphicsManager->_backgroundPage, NULL,
+ &GraphicsManager::setupMCGASaveRect, &GraphicsManager::addRectOptSaveRect,
+ &GraphicsManager::restoreMCGASaveRect);
+}
+
+void ViewPortResource::setupViewPort(PictureResource *pic, Common::Rect *clippingRect) {
+ setupViewPort(pic, clippingRect,
+ &GraphicsManager::setupMCGASaveRect, &GraphicsManager::addRectOptSaveRect,
+ &GraphicsManager::restoreMCGASaveRect);
+}
+
+void ViewPortResource::addSaveRect(int pageIndex, const Common::Rect &r) {
+ Common::Rect rect = r;
+
+ if (clipRect(rect)) {
+ if (_addFn) {
+ (_state._vm->_graphicsManager->*_addFn)(this, pageIndex, rect);
+ } else if (_rectListCount[pageIndex] != -1) {
+ _rectListPtr[pageIndex]->push_back(rect);
+ }
+ }
+}
+
+void ViewPortResource::fillPic(byte onOff) {
+ _state._vm->_graphicsManager->fillPic(this, onOff);
+}
+
+void ViewPortResource::drawIfaceTime() {
+ // Hour display
+ _state._vm->_graphicsManager->drawANumber(_state._vm->_graphicsManager->_vPort,
+ (_state._vm->_gameHour / 10) == 0 ? 10 : _state._vm->_gameHour / 10,
+ Common::Point(161, 25));
+ _state._vm->_graphicsManager->drawANumber(_state._vm->_graphicsManager->_vPort,
+ _state._vm->_gameHour % 10, Common::Point(172, 25));
+
+ // Minute display
+ _state._vm->_graphicsManager->drawANumber(_state._vm->_graphicsManager->_vPort,
+ _state._vm->_gameMinute / 10, Common::Point(190, 25));
+ _state._vm->_graphicsManager->drawANumber(_state._vm->_graphicsManager->_vPort,
+ _state._vm->_gameMinute % 10, Common::Point(201, 25));
+
+ // AM/PM indicator
+ PictureResource *pic = _state._vm->_bVoy->boltEntry(_state._vm->_voy->_isAM ? 272 : 273)._picResource;
+ _state._vm->_graphicsManager->sDrawPic(pic, _state._vm->_graphicsManager->_vPort,
+ Common::Point(215, 27));
+}
+
+void ViewPortResource::drawPicPerm(PictureResource *pic, const Common::Point &pt) {
+ Common::Rect bounds = pic->_bounds;
+ bounds.translate(pt.x, pt.y);
+
+ bool saveBack = _state._vm->_graphicsManager->_saveBack;
+ _state._vm->_graphicsManager->_saveBack = false;
+ _state._vm->_graphicsManager->sDrawPic(pic, this, pt);
+ clipRect(bounds);
+
+ for (int pageIndex = 0; pageIndex < _pageCount; ++pageIndex) {
+ if (_pageIndex != pageIndex) {
+ addSaveRect(pageIndex, bounds);
+ }
+ }
+
+ _state._vm->_graphicsManager->_saveBack = saveBack;
+}
+/*------------------------------------------------------------------------*/
+
+ViewPortListResource::ViewPortListResource(BoltFilesState &state, const byte *src) {
+ uint count = READ_LE_UINT16(src);
+ _palIndex = READ_LE_UINT16(src + 2);
+
+ // Load palette map
+ byte *palData = state._curLibPtr->memberAddr(READ_LE_UINT32(src + 4));
+ for (uint i = 0; i < 256; ++i, palData += 16)
+ _palette.push_back(ViewPortPalEntry(palData));
+
+ // Load view port pointer list
+ const uint32 *idP = (const uint32 *)&src[8];
+ for (uint i = 0; i < count; ++i, ++idP) {
+ uint32 id = READ_LE_UINT32(idP);
+ BoltEntry &entry = state._curLibPtr->getBoltEntryFromLong(id);
+
+ assert(entry._viewPortResource);
+ _entries.push_back(entry._viewPortResource);
+ }
+}
+
+/*------------------------------------------------------------------------*/
+
+ViewPortPalEntry::ViewPortPalEntry(const byte *src) {
+ const uint16 *v = (const uint16 *)src;
+ _rEntry = READ_LE_UINT16(v++);
+ _gEntry = READ_LE_UINT16(v++);
+ _bEntry = READ_LE_UINT16(v++);
+ _rChange = READ_LE_UINT16(v++);
+ _gChange = READ_LE_UINT16(v++);
+ _bChange = READ_LE_UINT16(v++);
+ _palIndex = READ_LE_UINT16(v++);
+}
+
+
+/*------------------------------------------------------------------------*/
+
+FontResource::FontResource(BoltFilesState &state, byte *src) {
+ _minChar = src[0];
+ _maxChar = src[1];
+ _fontDepth = src[2];
+ _padding = src[3];
+ _fontHeight = src[5];
+ _topPadding = (int8)src[6];
+
+ int totalChars = _maxChar - _minChar + 1;
+ _charWidth = new int[totalChars];
+ for (int i = 0; i < totalChars; ++i)
+ _charWidth[i] = READ_LE_UINT16(src + 8 + 2 * i);
+
+ _charOffsets = src + 8 + totalChars * 2;
+ _charImages = _charOffsets + totalChars * 2;
+}
+
+FontResource::~FontResource() {
+ delete[] _charWidth;
+}
+
+/*------------------------------------------------------------------------*/
+
+FontInfoResource::FontInfoResource(BoltFilesState &state, const byte *src) {
+ _curFont = NULL;
+ _picFlags = src[4];
+ _picSelect = src[5];
+ _picPick = src[6];
+ _picOnOff = src[7];
+ _fontFlags = src[8];
+ _justify = (FontJustify)src[9];
+ _fontSaveBack = READ_LE_UINT16(src + 10);
+ _pos.x = (int16)READ_LE_UINT16(src + 12);
+ _pos.y = (int16)READ_LE_UINT16(src + 14);
+ _justifyWidth = READ_LE_UINT16(src + 16);
+ _justifyHeight = READ_LE_UINT16(src + 18);
+ _shadow.x = READ_LE_UINT16(src + 20);
+ _shadow.y = READ_LE_UINT16(src + 22);
+ _foreColor = READ_LE_UINT16(src + 24);
+ _backColor = READ_LE_UINT16(src + 26);
+ _shadowColor = READ_LE_UINT16(src + 28);
+}
+
+FontInfoResource::FontInfoResource() {
+ _curFont = NULL;
+ _picFlags = DISPFLAG_1 | DISPFLAG_2;
+ _picSelect = 0xff;
+ _picPick = 0xff;
+ _picOnOff = 0;
+ _fontFlags = DISPFLAG_NONE;
+ _justify = ALIGN_LEFT;
+ _fontSaveBack = 0;
+ _justifyWidth = 1;
+ _justifyHeight = 1;
+ _shadow = Common::Point(1, 1);
+ _foreColor = 1;
+ _backColor = 0;
+ _shadowColor = 0;
+}
+
+FontInfoResource::FontInfoResource(byte picFlags, byte picSelect, byte picPick, byte picOnOff,
+ byte fontFlags, FontJustify justify, int fontSaveBack, const Common::Point &pos,
+ int justifyWidth, int justifyHeight, const Common::Point &shadow, int foreColor,
+ int backColor, int shadowColor) {
+ _curFont = NULL;
+ _picFlags = picFlags;
+ _picSelect = picSelect;
+ _picPick = picPick;
+ _picOnOff = picOnOff;
+ _fontFlags = fontFlags;
+ _justify = justify;
+ _fontSaveBack = fontSaveBack;
+ _pos = pos;
+ _justifyWidth = justifyWidth;
+ _justifyHeight = justifyHeight;
+ _shadow = shadow;
+ _foreColor = foreColor;
+ _backColor = backColor;
+ _shadowColor = shadowColor;
+}
+
+/*------------------------------------------------------------------------*/
+
+CMapResource::CMapResource(BoltFilesState &state, const byte *src): _vm(state._vm) {
+ _steps = src[0];
+ _fadeStatus = src[1];
+ _start = READ_LE_UINT16(src + 2);
+ _end = READ_LE_UINT16(src + 4);
+
+ int count = _end - _start + 1;
+ _entries = new byte[count * 3];
+ Common::copy(src + 6, src + 6 + 3 * count, _entries);
+
+ int palIndex = state._vm->_graphicsManager->_viewPortListPtr->_palIndex;
+ if (_end > palIndex)
+ _end = palIndex;
+ if (_start > palIndex)
+ _start = palIndex;
+}
+
+CMapResource::~CMapResource() {
+ delete[] _entries;
+}
+
+void CMapResource::startFade() {
+ _vm->_eventsManager->startFade(this);
+}
+
+/*------------------------------------------------------------------------*/
+
+VInitCycleResource::VInitCycleResource(BoltFilesState &state, const byte *src):
+ _state(state) {
+ // Set up arrays
+ for (int i = 0; i < 4; ++i) {
+ _type[i] = READ_LE_UINT16(src + i * 2);
+ state._curLibPtr->resolveIt(READ_LE_UINT32(src + 8 + i * 4), &_ptr[i]);
+ }
+}
+
+void VInitCycleResource::vStartCycle() {
+ EventsManager &evt = *_state._vm->_eventsManager;
+ evt._cycleIntNode._flags |= 1;
+ evt._cyclePtr = this;
+
+ for (int i = 0; i < 4; ++i) {
+ evt._cycleNext[i] = _ptr[i];
+ evt._cycleTime[i] = 0;
+ }
+
+ evt._cycleStatus = 1;
+ evt._cycleIntNode._flags &= ~1;
+}
+
+void VInitCycleResource::vStopCycle() {
+ EventsManager &evt = *_state._vm->_eventsManager;
+ evt._cycleIntNode._flags |= 1;
+ evt._cycleStatus &= ~1;
+}
+
+/*------------------------------------------------------------------------*/
+
+PtrResource::PtrResource(BoltFilesState &state, const byte *src) {
+ // Load pointer list
+ const uint32 *idP = (const uint32 *)&src[0];
+ int size = state._curMemberPtr->_size;
+
+ for (int i = 0; i < size / 4; ++i, ++idP) {
+ uint32 id = READ_LE_UINT32(idP);
+ BoltEntry &entry = state._curLibPtr->getBoltEntryFromLong(id);
+
+ _entries.push_back(&entry);
+ }
+}
+
+/*------------------------------------------------------------------------*/
+
+ControlResource::ControlResource(BoltFilesState &state, const byte *src) {
+ // Get Id for the state data. Since it refers to a following entry in the same
+ // group, for simplicity we set the _state back in the main playStamp method
+ _stateId = READ_LE_UINT32(&src[0x32]);
+ _state = nullptr;
+
+ for (int i = 0; i < 8; ++i)
+ _memberIds[i] = READ_LE_UINT16(src + i * 2);
+
+ // Load pointer list
+ const uint32 *idP = (const uint32 *)&src[0x10];
+ int count = READ_LE_UINT16(&src[0x36]);
+
+ Common::fill(&_entries[0], &_entries[8], (byte *)nullptr);
+ for (int i = 0; i < count; ++i, ++idP) {
+ uint32 id = READ_LE_UINT32(idP);
+ state._curLibPtr->resolveIt(id, &_entries[i]);
+ }
+}
+
+/*------------------------------------------------------------------------*/
+
+StateResource::StateResource(BoltFilesState &state, const byte *src):
+ _victimIndex(_vals[1]), _victimEvidenceIndex(_vals[2]),
+ _victimMurderIndex(_vals[3]) {
+ for (int i = 0; i < 4; ++i)
+ _vals[i] = READ_LE_UINT32(src + i * 4);
+}
+
+void StateResource::synchronize(Common::Serializer &s) {
+ for (int i = 0; i < 4; ++i)
+ s.syncAsSint32LE(_vals[i]);
+}
+
+} // End of namespace Voyeur
diff --git a/engines/voyeur/files.h b/engines/voyeur/files.h
new file mode 100644
index 0000000000..eef5df497c
--- /dev/null
+++ b/engines/voyeur/files.h
@@ -0,0 +1,619 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public 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 VOYEUR_FILES_H
+#define VOYEUR_FILES_H
+
+#include "common/scummsys.h"
+#include "common/file.h"
+#include "common/rect.h"
+#include "common/str.h"
+#include "voyeur/graphics.h"
+
+namespace Voyeur {
+
+class VoyeurEngine;
+class BoltFile;
+class BoltGroup;
+class BoltEntry;
+class RectResource;
+class PictureResource;
+class ViewPortResource;
+class ViewPortListResource;
+class FontResource;
+class CMapResource;
+class VInitCycleResource;
+class PtrResource;
+class ControlResource;
+class StateResource;
+class ThreadResource;
+
+#define DECOMPRESS_SIZE 0x7000
+
+class ResolveEntry {
+public:
+ uint32 _id;
+ byte **_p;
+
+ ResolveEntry(uint32 id, byte **p) { _id = id; _p = p; }
+};
+
+class BoltFilesState {
+public:
+ VoyeurEngine *_vm;
+ BoltFile *_curLibPtr;
+ BoltGroup *_curGroupPtr;
+ BoltEntry *_curMemberPtr;
+ int _bufferEnd;
+ int _bufferBegin;
+ int _bytesLeft;
+ int _bufSize;
+ byte *_bufStart;
+ byte *_bufPos;
+ byte _decompressBuf[DECOMPRESS_SIZE];
+ int _historyIndex;
+ byte _historyBuffer[0x200];
+ int _runLength;
+ bool _decompState;
+ int _runType;
+ int _runValue;
+ int _runOffset;
+ Common::File *_curFd;
+ Common::Array<ResolveEntry> _resolves;
+
+ byte *_boltPageFrame;
+public:
+ BoltFilesState(VoyeurEngine *vm);
+
+ byte *decompress(byte *buf, int size, int mode);
+ void nextBlock();
+};
+
+class BoltFile {
+private:
+ Common::Array<BoltGroup> _groups;
+protected:
+ BoltFilesState &_state;
+
+ virtual void initResource(int resType) = 0;
+ void initDefault();
+private:
+ void resolveAll();
+ byte *getBoltMember(uint32 id);
+
+public:
+ Common::File _file;
+
+ BoltFile(const Common::String &filename, BoltFilesState &state);
+ virtual ~BoltFile();
+
+ BoltGroup *getBoltGroup(uint16 id);
+ void freeBoltGroup(uint16 id);
+ void freeBoltMember(uint32 id);
+ byte *memberAddr(uint32 id);
+ byte *memberAddrOffset(uint32 id);
+ void resolveIt(uint32 id, byte **p);
+ void resolveFunction(uint32 id, GraphicMethodPtr *fn);
+
+ BoltEntry &boltEntry(uint16 id);
+ BoltEntry &getBoltEntryFromLong(uint32 id);
+ PictureResource *getPictureResource(uint32 id);
+ CMapResource *getCMapResource(uint32 id);
+};
+
+class BVoyBoltFile: public BoltFile {
+private:
+ // initType method table
+ void sInitRect();
+ void sInitPic();
+ void vInitCMap();
+ void vInitCycl();
+ void initViewPort();
+ void initViewPortList();
+ void initFontInfo();
+ void initFont();
+ void initSoundMap();
+protected:
+ virtual void initResource(int resType);
+public:
+ BVoyBoltFile(BoltFilesState &state);
+};
+
+class StampBoltFile: public BoltFile {
+private:
+ void initThread();
+ void initState();
+ void initPtr();
+ void initControl();
+protected:
+ virtual void initResource(int resType);
+public:
+ StampBoltFile(BoltFilesState &state);
+};
+
+class BoltGroup {
+private:
+ Common::SeekableReadStream *_file;
+public:
+ bool _loaded;
+ bool _processed;
+ int _count;
+ int _fileOffset;
+ Common::Array<BoltEntry> _entries;
+public:
+ BoltGroup(Common::SeekableReadStream *f);
+ virtual ~BoltGroup();
+
+ void load(uint16 groupId);
+ void unload();
+};
+
+
+class BoltEntry {
+private:
+ Common::SeekableReadStream *_file;
+public:
+ uint16 _id;
+ byte _mode;
+ byte _initMethod;
+ int _fileOffset;
+ int _size;
+ byte *_data;
+
+ // bvoy.blt resource types
+ RectResource *_rectResource;
+ PictureResource *_picResource;
+ ViewPortResource *_viewPortResource;
+ ViewPortListResource *_viewPortListResource;
+ FontResource *_fontResource;
+ FontInfoResource *_fontInfoResource;
+ CMapResource *_cMapResource;
+ VInitCycleResource *_vInitCycleResource;
+
+ // stampblt.blt resource types
+ PtrResource *_ptrResource;
+ ControlResource *_controlResource;
+ StateResource *_stateResource;
+ ThreadResource *_threadResource;
+public:
+ BoltEntry(Common::SeekableReadStream *f, uint16 id);
+ virtual ~BoltEntry();
+
+ void load();
+ bool hasResource() const;
+};
+
+class FilesManager {
+public:
+ BoltFilesState *_boltFilesState;
+ BoltFile *_curLibPtr;
+public:
+ FilesManager(VoyeurEngine *vm);
+ ~FilesManager();
+
+ bool openBoltLib(const Common::String &filename, BoltFile *&boltFile);
+ byte *fload(const Common::String &filename, int *size);
+};
+
+class RectEntry: public Common::Rect {
+public:
+ int _arrIndex;
+ int _count;
+
+ RectEntry(int x1, int y1, int x2, int y2, int arrIndex, int count);
+};
+
+class RectResource: public Common::Rect {
+public:
+ Common::Array<RectEntry> _entries;
+public:
+ RectResource(const byte *src, int size, bool isExtendedRects);
+ RectResource(int xp, int yp, int width, int height);
+ virtual ~RectResource() {}
+};
+
+/* bvoy.blt resource types */
+
+enum PictureFlag {
+ PICFLAG_2 = 2, PICFLAG_PIC_OFFSET = 8, PICFLAG_CLEAR_SCREEN = 0x10,
+ PICFLAG_20 = 0x20, PICFLAG_HFLIP = 0x40, PICFLAG_VFLIP = 0x80, PICFLAG_100 = 0x100,
+ PICFLAG_CLEAR_SCREEN00 = 0x1000
+};
+
+enum DisplayFlag {
+ DISPFLAG_1 = 1, DISPFLAG_2 = 2, DISPFLAG_4 = 4, DISPFLAG_8 = 8,
+ DISPFLAG_10 = 0x10, DISPFLAG_20 = 0x20, DISPFLAG_40 = 0x40, DISPFLAG_80 = 0x80,
+ DISPFLAG_100 = 0x100, DISPFLAG_200 = 0x200, DISPFLAG_400 = 0x400,
+ DISPFLAG_800 = 0x800, DISPFLAG_1000 = 0x1000, DISPFLAG_2000 = 0x2000,
+ DISPFLAG_4000 = 0x4000, DISPFLAG_VIEWPORT = 0x8000, DISPFLAG_CURSOR = 0x10000,
+ DISPFLAG_NONE = 0};
+
+class DisplayResource {
+private:
+ VoyeurEngine *_vm;
+public:
+ uint32 _flags;
+public:
+ DisplayResource();
+ DisplayResource(VoyeurEngine *vm);
+
+ /**
+ * Fill a box of the given size at the current _drawPtr location
+ */
+ void sFillBox(int width, int height);
+
+ /**
+ * Draw text at the current pen position
+ */
+ int drawText(const Common::String &msg);
+
+ /**
+ * Return the width of a given text in the current font
+ */
+ int textWidth(const Common::String &msg);
+
+ /**
+ * Clip the given rectangle by the currently viewable area
+ */
+ bool clipRect(Common::Rect &rect);
+};
+
+class PictureResource: public DisplayResource {
+private:
+ /**
+ * Flip the image data horizontally
+ */
+ void flipHorizontal(const byte *data);
+
+ /**
+ * Flip the image data vertically
+ */
+ void flipVertical(const byte *data);
+public:
+ byte _select;
+ byte _pick;
+ byte _onOff;
+ Common::Rect _bounds;
+ uint32 _maskData;
+ uint _planeSize;
+ byte _keyColor;
+
+ /**
+ * Image data for the picture
+ */
+ byte *_imgData;
+
+ /**
+ * Flag to indicate whether to free the image data
+ */
+ DisposeAfterUse::Flag _freeImgData;
+public:
+ PictureResource(BoltFilesState &state, const byte *src);
+ PictureResource(int flags, int select, int pick, int onOff,
+ const Common::Rect &bounds, int maskData, byte *imgData, int planeSize);
+ PictureResource(Graphics::Surface *surface);
+ PictureResource();
+ virtual ~PictureResource();
+};
+
+typedef void (ViewPortResource::*ViewPortMethodPtr)();
+
+class ViewPortResource: public DisplayResource {
+private:
+ BoltFilesState &_state;
+private:
+ void setupViewPort(PictureResource *page, Common::Rect *clippingRect, ViewPortSetupPtr setupFn,
+ ViewPortAddPtr addFn, ViewPortRestorePtr restoreFn);
+public:
+ ViewPortResource *_parent;
+ int _pageCount;
+ int _pageIndex;
+ int _lastPage;
+ Common::Rect _bounds;
+ PictureResource *_currentPic;
+ PictureResource *_activePage;
+ PictureResource *_pages[2];
+
+ // Rect lists and counts. Note that _rectListCount values of '-1' seem to have
+ // special significance, which is why I'm not making them redundant in favor
+ // of the arrays' .size() method
+ Common::Array<Common::Rect> *_rectListPtr[3];
+ int _rectListCount[3];
+
+ Common::Rect _clipRect;
+ GraphicMethodPtr _fn1;
+ ViewPortSetupPtr _setupFn;
+ ViewPortAddPtr _addFn;
+ ViewPortRestorePtr _restoreFn;
+ Common::Rect _fontRect;
+public:
+ ViewPortResource(BoltFilesState &state, const byte *src);
+ virtual ~ViewPortResource();
+
+ void setupViewPort();
+ void setupViewPort(PictureResource *pic, Common::Rect *clippingRect = NULL);
+ void addSaveRect(int pageIndex, const Common::Rect &r);
+ void fillPic(byte onOff);
+ void drawIfaceTime();
+ void drawPicPerm(PictureResource *pic, const Common::Point &pt);
+};
+
+class ViewPortPalEntry {
+public:
+ uint16 _rEntry, _gEntry, _bEntry;
+ uint16 _rChange, _gChange, _bChange;
+ uint16 _palIndex;
+public:
+ ViewPortPalEntry(const byte *src);
+};
+
+class ViewPortListResource {
+public:
+ Common::Array<ViewPortPalEntry> _palette;
+ Common::Array<ViewPortResource *> _entries;
+ int _palIndex;
+
+ ViewPortListResource(BoltFilesState &state, const byte *src);
+ virtual ~ViewPortListResource() {}
+};
+
+class FontResource {
+public:
+ int _minChar, _maxChar;
+ int _fontDepth;
+ int _padding;
+ int _fontHeight;
+ int _topPadding;
+ int *_charWidth;
+ byte *_charOffsets;
+ byte *_charImages;
+
+ FontResource(BoltFilesState &state, byte *src);
+ virtual ~FontResource();
+};
+
+enum FontJustify { ALIGN_LEFT = 0, ALIGN_CENTER = 1, ALIGN_RIGHT = 2 };
+
+class FontInfoResource {
+public:
+ FontResource *_curFont;
+ byte _picFlags;
+ byte _picSelect;
+ byte _picPick;
+ byte _picOnOff;
+ byte _fontFlags;
+ FontJustify _justify;
+ int _fontSaveBack;
+ Common::Point _pos;
+ int _justifyWidth;
+ int _justifyHeight;
+ Common::Point _shadow;
+ int _foreColor;
+ int _backColor;
+ int _shadowColor;
+public:
+ FontInfoResource(BoltFilesState &state, const byte *src);
+ FontInfoResource();
+ FontInfoResource(byte picFlags, byte picSelect, byte picPick, byte picOnOff, byte fontFlags,
+ FontJustify justify, int fontSaveBack, const Common::Point &pos, int justifyWidth,
+ int justifyHeight, const Common::Point &shadow, int foreColor, int backColor,
+ int shadowColor);
+};
+
+class CMapResource {
+private:
+ VoyeurEngine *_vm;
+public:
+ int _steps;
+ int _fadeStatus;
+ int _start;
+ int _end;
+ byte *_entries;
+public:
+ CMapResource(BoltFilesState &state, const byte *src);
+ virtual ~CMapResource();
+
+ void startFade();
+};
+
+class VInitCycleResource {
+private:
+ BoltFilesState &_state;
+public:
+ int _type[4];
+ byte *_ptr[4];
+public:
+ VInitCycleResource(BoltFilesState &state, const byte *src);
+ virtual ~VInitCycleResource() {}
+
+ void vStartCycle();
+ void vStopCycle();
+};
+
+/* stampblt.blt resources */
+
+class PtrResource {
+public:
+ Common::Array<BoltEntry *> _entries;
+
+ PtrResource(BoltFilesState &state, const byte *src);
+ virtual ~PtrResource() {}
+};
+
+class ControlResource {
+public:
+ int _memberIds[8];
+ byte *_entries[8];
+ int _stateId;
+ StateResource *_state;
+
+ ControlResource(BoltFilesState &state, const byte *src);
+ virtual ~ControlResource() {}
+};
+
+/**
+ * Stores data about the intended victim
+ */
+class StateResource {
+public:
+ int _vals[4];
+ int &_victimIndex;
+ int &_victimEvidenceIndex;
+ int &_victimMurderIndex;
+
+ StateResource(BoltFilesState &state, const byte *src);
+ virtual ~StateResource() {}
+
+ /**
+ * Synchronizes the game data
+ */
+ void synchronize(Common::Serializer &s);
+};
+
+class ThreadResource {
+public:
+ static int _useCount[8];
+ static void initUseCount();
+ static void unloadAllStacks(VoyeurEngine *vm);
+
+ static void init();
+private:
+ VoyeurEngine *_vm;
+ Common::Point _aptPos;
+private:
+ bool getStateInfo();
+ byte *getDataOffset();
+ void getButtonsText();
+ void getButtonsFlags();
+ void performOpenCard();
+ const byte *getRecordOffset(const byte *p);
+ const byte *getNextRecord(const byte *p);
+ const byte *getSTAMPCard(int cardId);
+ int getStateFromID(uint32 id);
+ uint32 getSID(int sid);
+ void cardAction(const byte *p);
+ void doSTAMPCardAction();
+ bool goToStateID(int stackId, int id);
+ const byte *cardPerform(const byte *card);
+ bool cardPerform2(const byte *p, int cardCmdId);
+ void savePrevious();
+ void setButtonFlag(int idx, byte bits);
+ void clearButtonFlag(int idx, byte bits);
+
+ /**
+ * Frees the apartment screen data
+ */
+ void freeTheApt();
+
+ /**
+ * Does any necessary animation at the start or end of showing the apartment.
+ */
+ void doAptAnim(int mode);
+
+ /**
+ * Updates the mansion scroll position if ncessary, and returns true if it
+ * has been changed.
+ */
+ bool checkMansionScroll();
+public:
+ int _stateId;
+ int _stackId;
+ int _savedStateId;
+ int _savedStackId;
+ int _newStateId;
+ int _newStackId;
+ int _stateFlags;
+ int _stateCount;
+ int _parseCount;
+ uint32 _nextStateId;
+ byte *_threadInfoPtr;
+ byte _buttonFlags[64];
+ byte _buttonIds[64];
+ byte *_ctlPtr;
+ byte *_playCommandsPtr;
+
+ /**
+ * Loads the specified stack
+ */
+ bool loadAStack(int stackId);
+
+ /**
+ * Unloads the specified stack
+ */
+ void unloadAStack(int stackId);
+
+ /**
+ * Initializes data for the thread based on the current state
+ */
+ bool doState();
+
+public:
+ ThreadResource(BoltFilesState &state, const byte *src);
+ virtual ~ThreadResource() {}
+
+ /**
+ * Initialize the thread
+ */
+ void initThreadStruct(int idx, int id);
+
+ /**
+ * Go to a new state and/or stack
+ */
+ bool goToState(int stackId, int stateId);
+
+ bool chooseSTAMPButton(int buttonId);
+
+ /**
+ * Parses the script commands from the currently active stack
+ */
+ void parsePlayCommands();
+
+ /**
+ * Do the camera view looking at the mansion
+ */
+ int doInterface();
+
+ /**
+ * Do the display of a room that has one or more evidence hotspots
+ * available for display
+ */
+ void doRoom();
+
+ /**
+ * Shows the apartment screen
+ */
+ int doApt();
+
+ /**
+ * Loads data needed for displaying the initial apartment screen
+ */
+ void loadTheApt();
+
+ /**
+ * Synchronizes the game data
+ */
+ void synchronize(Common::Serializer &s);
+};
+
+} // End of namespace Voyeur
+
+#endif /* VOYEUR_FILES_H */
diff --git a/engines/voyeur/files_threads.cpp b/engines/voyeur/files_threads.cpp
new file mode 100644
index 0000000000..b1960a23ac
--- /dev/null
+++ b/engines/voyeur/files_threads.cpp
@@ -0,0 +1,1731 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public 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 "voyeur/files.h"
+#include "voyeur/graphics.h"
+#include "voyeur/voyeur.h"
+#include "voyeur/staticres.h"
+
+namespace Voyeur {
+
+int ThreadResource::_useCount[8];
+
+void ThreadResource::init() {
+ Common::fill(&_useCount[0], &_useCount[8], 0);
+}
+
+ThreadResource::ThreadResource(BoltFilesState &state, const byte *src):_vm(state._vm) {
+ _stateId = READ_LE_UINT16(&src[0]);
+ _stackId = READ_LE_UINT16(&src[0]);
+ _savedStateId = READ_LE_UINT16(&src[0]);
+ _savedStackId = READ_LE_UINT16(&src[0]);
+ _ctlPtr = nullptr;
+ _aptPos = Common::Point(-1, -1);
+
+ _newStateId = -1;
+ _newStackId = -1;
+ _stateFlags = 0;
+ _stateCount = 0;
+ _parseCount = 0;
+ _nextStateId = 0;
+ _threadInfoPtr = nullptr;
+ _playCommandsPtr = nullptr;
+}
+
+void ThreadResource::initThreadStruct(int idx, int id) {
+ _stackId = -1;
+ if (loadAStack(idx)) {
+ _savedStateId = _savedStackId = -1;
+ _stateId = id;
+ _newStateId = -1;
+ _newStackId = -1;
+
+ doState();
+ }
+}
+
+bool ThreadResource::loadAStack(int stackId) {
+ if (_vm->_stampFlags & 1) {
+ if (stackId < 0)
+ error("loadAStack() - Invalid stackId %d", stackId);
+
+ unloadAStack(_stackId);
+ if (!_useCount[stackId]) {
+ BoltEntry &boltEntry = _vm->_stampLibPtr->boltEntry(_vm->_controlPtr->_memberIds[stackId]);
+ if (!boltEntry._data)
+ return false;
+
+ _vm->_controlPtr->_entries[stackId] = boltEntry._data;
+ }
+
+ ++_useCount[stackId];
+ }
+
+ _ctlPtr = _vm->_controlPtr->_entries[stackId];
+ _stackId = stackId;
+ return true;
+}
+
+void ThreadResource::unloadAStack(int stackId) {
+ if (stackId < 0)
+ return;
+
+ if ((_vm->_stampFlags & 1) && _useCount[stackId]) {
+ if (--_useCount[stackId] == 0) {
+ _vm->_stampLibPtr->freeBoltMember(_vm->_controlPtr->_memberIds[stackId]);
+ }
+ }
+}
+
+bool ThreadResource::doState() {
+ if (!getStateInfo())
+ return false;
+
+ getButtonsFlags();
+
+ _vm->_glGoState = -1;
+ _vm->_glGoStack = -1;
+
+ performOpenCard();
+ if (_stateFlags & 1) {
+ return chooseSTAMPButton(_vm->getRandomNumber(_stateCount - 1));
+ } else {
+ return true;
+ }
+}
+
+bool ThreadResource::getStateInfo() {
+ int id = READ_LE_UINT16(_ctlPtr);
+
+ if (id <= _stateId) {
+ return false;
+ } else {
+ uint32 fld = READ_LE_UINT32(_ctlPtr + 2);
+ fld += _stateId << 3;
+ _nextStateId = READ_LE_UINT32(_ctlPtr + fld + 4);
+
+ fld = READ_LE_UINT32(_ctlPtr + fld);
+ byte *baseP = _ctlPtr + fld;
+ _stateCount = READ_LE_UINT16(baseP);
+ _stateFlags = READ_LE_UINT16(baseP + 2);
+ _parseCount = READ_LE_UINT16(baseP + 4);
+
+ _playCommandsPtr = getDataOffset();
+ _playCommandsPtr += (READ_LE_UINT32(baseP + 6) / 2) << 1;
+
+ _threadInfoPtr = baseP + 10;
+
+ getButtonsText();
+ return true;
+ }
+}
+
+byte *ThreadResource::getDataOffset() {
+ uint32 offset = READ_LE_UINT32(_ctlPtr + 10);
+ return _ctlPtr + offset;
+}
+
+void ThreadResource::getButtonsText() {
+ int idx = 0;
+
+ for (const byte *p = _threadInfoPtr; *p != 0x49; p = getNextRecord(p)) {
+ if (*p == 0xC0) {
+ ++p;
+ if (*p++ & 0x80) {
+ assert(idx < 63);
+ p += 4;
+ }
+
+ ++idx;
+ }
+ }
+}
+
+void ThreadResource::getButtonsFlags() {
+ int idx = 0;
+
+ for (const byte *p = _threadInfoPtr; *p != 0x49; p = getNextRecord(p)) {
+ if (*p == 0xC0) {
+ if (*++p & 0x20)
+ _stateFlags |= 2;
+
+ _buttonFlags[idx] = *p++;
+ _buttonIds[idx] = *p++;
+
+ if (_buttonFlags[idx] & 0x80)
+ p += 4;
+
+ ++idx;
+ }
+ }
+}
+
+void ThreadResource::unloadAllStacks(VoyeurEngine *vm) {
+ if (vm->_stampFlags & 1) {
+ for (int i = 0; i < 8; ++i) {
+ if (_useCount[i])
+ vm->_stampLibPtr->freeBoltMember(vm->_controlPtr->_memberIds[i]);
+ }
+ }
+}
+
+void ThreadResource::performOpenCard() {
+ for (const byte *p = _threadInfoPtr; *p != 0x49; p = getNextRecord(p)) {
+ if (*p == 0x47) {
+ cardAction(p + 1);
+ return;
+ }
+ }
+}
+
+void ThreadResource::initUseCount() {
+ Common::fill(&_useCount[0], &_useCount[8], 0);
+}
+
+const byte *ThreadResource::getRecordOffset(const byte *p) {
+ uint32 recSize = READ_LE_UINT32(p) + READ_LE_UINT32(_ctlPtr + 6);
+ return _ctlPtr + recSize;
+}
+
+const byte *ThreadResource::getNextRecord(const byte *p) {
+ byte v = *p++;
+
+ switch (v) {
+ case 2:
+ case 4:
+ case 6:
+ case 8:
+ case 10:
+ return p + 8;
+ case 1:
+ case 3:
+ case 5:
+ case 7:
+ case 9:
+ case 11:
+ case 21:
+ case 22:
+ case 25:
+ case 26:
+ return p + 5;
+ case 17:
+ case 23:
+ case 24:
+ case 27:
+ case 28:
+ return p + 2;
+ case 19:
+ case 41:
+ return p + 6;
+ case 18:
+ case 51:
+ case 52:
+ return p + 1;
+ case 74:
+ return p + 4;
+ case 192:
+ if (*p & 0x80)
+ p += 4;
+ return p + 2;
+ default:
+ return p;
+ }
+}
+
+const byte *ThreadResource::getSTAMPCard(int cardId) {
+ const byte *p;
+ int count = 0;
+
+ for (p = _threadInfoPtr; count <= cardId && *p != 0x49; p = getNextRecord(p)) {
+ if (*p == 0xC0)
+ ++count;
+ }
+
+ return p;
+}
+
+int ThreadResource::getStateFromID(uint32 id) {
+ int count = READ_LE_UINT16(_ctlPtr);
+
+ for (int i = 0; i < count; ++i) {
+ uint32 sid = getSID(i);
+ if (sid == id)
+ return i;
+ }
+
+ return -1;
+}
+
+uint32 ThreadResource::getSID(int sid) {
+ uint32 offset = READ_LE_UINT32(_ctlPtr + 2) + (sid << 3) + 4;
+ return READ_LE_UINT32(_ctlPtr + offset);
+}
+
+void ThreadResource::doSTAMPCardAction() {
+ for (const byte *p = _threadInfoPtr; *p != 0x49; p = getNextRecord(p)) {
+ if (*p == 0x48) {
+ cardAction(p + 1);
+ return;
+ }
+ }
+}
+
+void ThreadResource::cardAction(const byte *card) {
+ _vm->_glGoState = -1;
+ _vm->_glGoStack = -1;
+
+ // Loop to perform card commands
+ while (!_vm->shouldQuit() && *card < 70 && _vm->_glGoState == -1) {
+ card = cardPerform(card);
+ }
+}
+
+bool ThreadResource::chooseSTAMPButton(int buttonId) {
+ for (int idx = 0; idx < _stateCount; ++idx) {
+ if (_buttonIds[idx] == buttonId) {
+ const byte *card = getSTAMPCard(idx);
+ cardAction(card);
+
+ bool flag = true;
+ while (!_vm->shouldQuit() && _vm->_glGoStack != -1 && flag) {
+ doSTAMPCardAction();
+ flag = goToStateID(_vm->_glGoStack, _vm->_glGoState);
+ }
+
+ while (!_vm->shouldQuit() && _vm->_glGoState != -1 && flag) {
+ doSTAMPCardAction();
+ flag = goToState(-1, _vm->_glGoState);
+ }
+
+ return flag;
+ }
+ }
+
+ return false;
+}
+
+void ThreadResource::parsePlayCommands() {
+ _vm->_voy->_playStampMode = -1;
+ _vm->_voy->_audioVisualStartTime = 0;
+ _vm->_voy->_audioVisualDuration = 0;
+ _vm->_voy->_boltGroupId2 = -1;
+ _vm->_voy->_computerTextId = -1;
+ _vm->_voy->_eventFlags &= ~EVTFLAG_8;
+ _vm->_eventsManager->_videoDead = -1;
+
+ // Reset hotspot data
+ _vm->_voy->_videoHotspotTimes.reset();
+ _vm->_voy->_audioHotspotTimes.reset();
+ _vm->_voy->_evidenceHotspotTimes.reset();
+ Common::fill(&_vm->_voy->_roomHotspotsEnabled[0], &_vm->_voy->_roomHotspotsEnabled[20], false);
+ byte *dataP = _playCommandsPtr;
+ int v2, v3;
+ PictureResource *pic;
+ CMapResource *pal;
+
+ for (int parseIndex = 0; parseIndex < _parseCount; ++parseIndex) {
+ uint16 id = READ_LE_UINT16(dataP);
+ debugC(DEBUG_BASIC, kDebugScripts, "parsePlayCommands (%d of %d) - cmd #%d",
+ parseIndex + 1, _parseCount, id);
+ dataP += 2;
+
+ switch (id) {
+ case 1:
+ _vm->_currentVocId = READ_LE_UINT16(dataP);
+ dataP += 2;
+ break;
+
+ case 2:
+ // Play an audio event
+ v2 = READ_LE_UINT16(dataP);
+
+ if (v2 == 0 || _vm->_controlPtr->_state->_victimIndex == v2) {
+ _vm->_audioVideoId = READ_LE_UINT16(dataP + 2) - 1;
+ _vm->_voy->_audioVisualStartTime = READ_LE_UINT16(dataP + 4);
+ _vm->_voy->_audioVisualDuration = READ_LE_UINT16(dataP + 6);
+
+ if (_vm->_voy->_RTVNum < _vm->_voy->_audioVisualStartTime ||
+ (_vm->_voy->_audioVisualStartTime + _vm->_voy->_audioVisualDuration) < _vm->_voy->_RTVNum) {
+ _vm->_audioVideoId = -1;
+ } else {
+ _vm->_voy->_vocSecondsOffset = _vm->_voy->_RTVNum - _vm->_voy->_audioVisualStartTime;
+ _vm->_voy->addAudioEventStart();
+
+ // Play the audio
+ assert(_vm->_audioVideoId < 38);
+ _vm->playAudio(_vm->_audioVideoId);
+
+ _vm->_voy->addAudioEventEnd();
+ _vm->_eventsManager->incrementTime(1);
+ _vm->_eventsManager->incrementTime(1);
+ _vm->_audioVideoId = -1;
+ parseIndex = 999;
+ }
+ }
+
+ dataP += 8;
+ break;
+
+ case 3:
+ // Play a video event
+ v2 = READ_LE_UINT16(dataP);
+
+ if (v2 == 0 || _vm->_controlPtr->_state->_victimIndex == v2) {
+ _vm->_audioVideoId = READ_LE_UINT16(dataP + 2) - 1;
+ _vm->_voy->_audioVisualStartTime = READ_LE_UINT16(dataP + 4);
+ _vm->_voy->_audioVisualDuration = READ_LE_UINT16(dataP + 6);
+
+ if (_vm->_voy->_RTVNum < _vm->_voy->_audioVisualStartTime ||
+ (_vm->_voy->_audioVisualStartTime + _vm->_voy->_audioVisualDuration) < _vm->_voy->_RTVNum) {
+ _vm->_audioVideoId = -1;
+ } else {
+ _vm->_voy->_vocSecondsOffset = _vm->_voy->_RTVNum - _vm->_voy->_audioVisualStartTime;
+ _vm->_voy->addVideoEventStart();
+ _vm->_voy->_eventFlags &= ~EVTFLAG_TIME_DISABLED;
+ _vm->_voy->_eventFlags |= EVTFLAG_RECORDING;
+ _vm->playAVideo(_vm->_audioVideoId);
+
+ _vm->_voy->_eventFlags &= ~EVTFLAG_RECORDING;
+ _vm->_voy->_eventFlags |= EVTFLAG_TIME_DISABLED;
+ _vm->_voy->addVideoEventEnd();
+ _vm->_eventsManager->incrementTime(1);
+
+ _vm->_audioVideoId = -1;
+ _vm->_playStampGroupId = -1;
+
+ if (_vm->_eventsManager->_videoDead != -1) {
+ _vm->_bVoy->freeBoltGroup(0xE00);
+ _vm->_eventsManager->_videoDead = -1;
+ _vm->flipPageAndWait();
+ }
+
+ _vm->_eventsManager->_videoDead = -1;
+ if (_stateCount == 2 && _vm->_eventsManager->_mouseClicked == 0) {
+ _vm->_voy->_playStampMode = 132;
+ parseIndex = 999;
+ } else {
+ _vm->_voy->_playStampMode = 129;
+ }
+ }
+ }
+
+ dataP += 8;
+ break;
+
+ case 4:
+ case 22:
+ // Case 22: Endgame news reports
+ _vm->_audioVideoId = READ_LE_UINT16(dataP) - 1;
+ dataP += 2;
+
+ if (id == 22) {
+ int resolveIndex = READ_LE_UINT16(dataP);
+ dataP += 2;
+ _vm->_playStampGroupId = _vm->_resolvePtr[resolveIndex];
+ }
+
+ _vm->_voy->_vocSecondsOffset = 0;
+ _vm->_voy->_audioVisualStartTime = _vm->_voy->_RTVNum;
+ _vm->_voy->_eventFlags &= ~(EVTFLAG_TIME_DISABLED | EVTFLAG_RECORDING);
+ _vm->playAVideo(_vm->_audioVideoId);
+ _vm->_voy->_eventFlags |= EVTFLAG_TIME_DISABLED;
+
+ if (id != 22) {
+ _vm->_audioVideoId = -1;
+ parseIndex = 999;
+ } else {
+ int count = _vm->_bVoy->getBoltGroup(_vm->_playStampGroupId)->_entries.size() / 2;
+ _vm->_soundManager->stopVOCPlay();
+ _vm->_eventsManager->getMouseInfo();
+
+ for (int i = 0; i < count; ++i) {
+ pic = _vm->_bVoy->boltEntry(_vm->_playStampGroupId + i * 2)._picResource;
+ pal = _vm->_bVoy->boltEntry(_vm->_playStampGroupId + i * 2 + 1)._cMapResource;
+
+ _vm->_graphicsManager->_vPort->setupViewPort(pic);
+ pal->startFade();
+
+ _vm->flipPageAndWaitForFade();
+
+ if (i > 0) {
+ _vm->_bVoy->freeBoltMember(_vm->_playStampGroupId + i * 2);
+ _vm->_bVoy->freeBoltMember(_vm->_playStampGroupId + i * 2 + 1);
+ }
+
+ Common::String file = Common::String::format("news%d.voc", i + 1);
+ _vm->_soundManager->startVOCPlay(file);
+
+ while (!_vm->shouldQuit() && !_vm->_eventsManager->_mouseClicked &&
+ _vm->_soundManager->getVOCStatus()) {
+ _vm->_eventsManager->delayClick(1);
+ _vm->_eventsManager->getMouseInfo();
+ }
+
+ _vm->_soundManager->stopVOCPlay();
+
+ if (i == (count - 1))
+ _vm->_eventsManager->delayClick(480);
+
+ if (_vm->shouldQuit() || _vm->_eventsManager->_mouseClicked)
+ break;
+ }
+
+ _vm->_bVoy->freeBoltGroup(_vm->_playStampGroupId);
+ _vm->_playStampGroupId = -1;
+ _vm->_audioVideoId = -1;
+ parseIndex = 999;
+ }
+ break;
+
+ case 5:
+ // Check whether transition to a given time period is allowed, and
+ // if so, load the time information for the new time period
+ v2 = READ_LE_UINT16(dataP);
+ if (v2 == 0 || _vm->_controlPtr->_state->_victimIndex == v2) {
+ _vm->_voy->_playStampMode = 5;
+ int count = READ_LE_UINT16(dataP + 2);
+ _vm->_voy->_RTVLimit = READ_LE_UINT16(dataP + 4);
+
+ if (_vm->_voy->_transitionId != count) {
+ if (_vm->_voy->_transitionId > 1)
+ _vm->_voy->_eventFlags &= ~EVTFLAG_100;
+
+ _vm->_voy->_transitionId = count;
+ _vm->_gameMinute = LEVEL_M[count - 1];
+ _vm->_gameHour = LEVEL_H[count - 1];
+ //_vm->_v2A0A2 = 0;
+ _vm->_voy->_RTVNum = 0;
+ _vm->_voy->_RTANum = 255;
+ }
+
+ _vm->_voy->_isAM = (_vm->_voy->_transitionId == 6);
+ }
+
+ dataP += 6;
+ break;
+
+ case 6:
+ _vm->_voy->_playStampMode = 6;
+ v2 = READ_LE_UINT16(dataP);
+ _vm->_playStampGroupId = _vm->_resolvePtr[v2];
+ dataP += 2;
+ break;
+
+ case 7:
+ // Load the video event scene hotspot times data
+ v2 = READ_LE_UINT16(dataP);
+ v3 = READ_LE_UINT16(dataP + 2) - 1;
+
+ if (v2 == 0 || _vm->_controlPtr->_state->_victimIndex == v2) {
+ int idx = 0;
+ while (_vm->_voy->_videoHotspotTimes._min[idx][v3] != 9999)
+ ++idx;
+
+ v2 = READ_LE_UINT16(dataP + 4);
+ _vm->_voy->_videoHotspotTimes._min[idx][v3] = v2;
+ _vm->_voy->_videoHotspotTimes._max[idx][v3] = v2 + READ_LE_UINT16(dataP + 6) - 2;
+ }
+
+ dataP += 8;
+ break;
+
+ case 8:
+ // Load the audio event scene hotspot times data
+ v2 = READ_LE_UINT16(dataP);
+ v3 = READ_LE_UINT16(dataP + 2) - 1;
+
+ if (v2 == 0 || _vm->_controlPtr->_state->_victimIndex == v2) {
+ int idx = 0;
+ while (_vm->_voy->_audioHotspotTimes._min[idx][v3] != 9999)
+ ++idx;
+
+ v2 = READ_LE_UINT16(dataP + 4);
+ _vm->_voy->_audioHotspotTimes._min[idx][v3] = v2;
+ _vm->_voy->_audioHotspotTimes._max[idx][v3] = v2 + READ_LE_UINT16(dataP + 6) - 2;
+ }
+
+ dataP += 8;
+ break;
+
+ case 9:
+ // Load up evidence event scene hotspot times data
+ v2 = READ_LE_UINT16(dataP);
+ v3 = READ_LE_UINT16(dataP + 2) - 1;
+
+ if (v2 == 0 || _vm->_controlPtr->_state->_victimIndex == v2) {
+ int idx = 0;
+ while (_vm->_voy->_evidenceHotspotTimes._min[idx][v3] != 9999)
+ ++idx;
+
+ v2 = READ_LE_UINT16(dataP + 4);
+ _vm->_voy->_evidenceHotspotTimes._min[idx][v3] = v2;
+ _vm->_voy->_evidenceHotspotTimes._max[idx][v3] = v2 + READ_LE_UINT16(dataP + 6) - 2;
+ }
+
+ dataP += 8;
+ break;
+
+ case 10:
+ // Pick the person who is to die, during startup
+ if (_vm->_iForceDeath == -1) {
+ // No specific person has been preset to be killed, so pick one randomly.
+ // The loop below was used because the victim was persisted from the previous
+ // play-through, so it ensured that a different victim is picked.
+ int randomVal;
+ do {
+ randomVal = _vm->getRandomNumber(3) + 1;
+ } while (randomVal == _vm->_voy->_victimNumber);
+
+ _vm->_voy->_victimNumber = randomVal;
+ _vm->_controlPtr->_state->_victimIndex = randomVal;
+ } else {
+ // Player has seen something that locks in the character to die
+ _vm->_voy->_victimNumber = _vm->_iForceDeath;
+ _vm->_controlPtr->_state->_victimIndex = _vm->_iForceDeath;
+ }
+
+ _vm->saveLastInplay();
+ break;
+
+ case 11:
+ _vm->_voy->_eventFlags |= EVTFLAG_2;
+ break;
+
+ case 12:
+ v2 = READ_LE_UINT16(dataP);
+
+ if (v2 == 0 || _vm->_controlPtr->_state->_victimIndex == v2) {
+ _vm->_voy->_boltGroupId2 = _vm->_resolvePtr[READ_LE_UINT16(dataP + 2)];
+ _vm->_voy->_roomHotspotsEnabled[READ_LE_UINT16(dataP + 4) - 1] = true;
+ }
+
+ dataP += 6;
+ break;
+
+ case 13:
+ v2 = READ_LE_UINT16(dataP);
+
+ if (v2 == 0 || _vm->_controlPtr->_state->_victimIndex == v2) {
+ _vm->_voy->_computerTextId = READ_LE_UINT16(dataP + 2) - 1;
+ _vm->_voy->_computerTimeMin = READ_LE_UINT16(dataP + 4);
+ _vm->_voy->_computerTimeMax = READ_LE_UINT16(dataP + 6);
+
+ _vm->_voy->_computerScreenRect.left = COMPUTER_SCREEN_TABLE[_vm->_voy->_computerTextId * 4];
+ _vm->_voy->_computerScreenRect.top = COMPUTER_SCREEN_TABLE[_vm->_voy->_computerTextId * 4 + 1];
+ _vm->_voy->_computerScreenRect.right = COMPUTER_SCREEN_TABLE[_vm->_voy->_computerTextId * 4 + 2];
+ _vm->_voy->_computerScreenRect.bottom = COMPUTER_SCREEN_TABLE[_vm->_voy->_computerTextId * 4 + 3];
+ }
+
+ dataP += 8;
+ break;
+
+ case 14:
+ _vm->_playStampGroupId = 2048;
+ _vm->_voy->_playStampMode = 130;
+ break;
+
+ case 15:
+ _vm->showEndingNews();
+ break;
+
+ case 16:
+ _vm->_voy->_playStampMode = 16;
+ break;
+
+ case 17:
+ _vm->_voy->_playStampMode = 17;
+ break;
+
+ case 18:
+ // Called during the murder (Sunday 10:30PM) time period, to specify the
+ // time expired point at which the murder takes place
+ v2 = READ_LE_UINT16(dataP);
+ v3 = READ_LE_UINT16(dataP + 2);
+
+ if (v2 == 0 || _vm->_controlPtr->_state->_victimIndex == v2)
+ _vm->_voy->_murderThreshold = v3;
+
+ dataP += 4;
+ break;
+
+ case 19:
+ _vm->_voy->_aptLoadMode = 140;
+ loadTheApt();
+ _vm->_voy->_aptLoadMode = 141;
+ freeTheApt();
+ break;
+
+ case 20:
+ _vm->_voy->_aptLoadMode = -1;
+ loadTheApt();
+ _vm->_voy->_aptLoadMode = 141;
+ freeTheApt();
+ break;
+
+ case 21:
+ _vm->_voy->_aptLoadMode = -1;
+ loadTheApt();
+ _vm->_voy->_aptLoadMode = 140;
+ freeTheApt();
+ break;
+
+ case 23:
+ _vm->_voy->_transitionId = 17;
+ _vm->_voy->_aptLoadMode = -1;
+ loadTheApt();
+ _vm->_voy->_aptLoadMode = 144;
+ freeTheApt();
+ break;
+
+ default:
+ break;
+ }
+ }
+}
+
+const byte *ThreadResource::cardPerform(const byte *card) {
+ uint16 id = *card++;
+ int subId = 5;
+ uint32 v2;
+ byte bVal;
+ uint32 idx1, idx2;
+ debugC(DEBUG_BASIC, kDebugScripts, "cardPerform - %d", id);
+
+ switch (id) {
+ case 1:
+ v2 = READ_LE_UINT32(card);
+ card += 4;
+ _vm->_controlPtr->_state->_vals[*card++] = v2;
+ break;
+
+ case 2:
+ v2 = _vm->_controlPtr->_state->_vals[*card++];
+ _vm->_controlPtr->_state->_vals[*card++] = v2;
+ break;
+
+ case 3:
+ v2 = READ_LE_UINT32(card);
+ card += 4;
+ _vm->_controlPtr->_state->_vals[*card++] = v2;
+ break;
+
+ case 4:
+ v2 = _vm->_controlPtr->_state->_vals[*card++];
+ _vm->_controlPtr->_state->_vals[*card++] = v2;
+ break;
+
+ case 5: {
+ v2 = READ_LE_UINT32(card);
+ card += 4;
+ int &v = _vm->_controlPtr->_state->_vals[*card++];
+ v -= v2;
+ break;
+ }
+
+ case 6: {
+ idx1 = *card++;
+ idx2 = *card++;
+
+ v2 = _vm->_controlPtr->_state->_vals[idx1];
+ int &v = _vm->_controlPtr->_state->_vals[idx2];
+ v -= v2;
+ break;
+ }
+
+ case 7: {
+ int v3 = *card++;
+ v2 = READ_LE_UINT32(card);
+ card += 4;
+ int &v = _vm->_controlPtr->_state->_vals[v3];
+ v *= v2;
+ break;
+ }
+
+ case 8: {
+ idx1 = *card++;
+ idx2 = *card++;
+
+ int &v1 = _vm->_controlPtr->_state->_vals[idx1];
+ v2 = _vm->_controlPtr->_state->_vals[idx2];
+ v1 *= v2;
+ break;
+ }
+
+ case 9: {
+ idx1 = *card++;
+ v2 = READ_LE_UINT32(card);
+ card += 4;
+
+ int &v = _vm->_controlPtr->_state->_vals[idx1];
+ v /= v2;
+ break;
+ }
+
+ case 10: {
+ idx1 = *card++;
+ idx2 = *card++;
+
+ int &v1 = _vm->_controlPtr->_state->_vals[idx1];
+ v2 = _vm->_controlPtr->_state->_vals[idx2];
+ v1 /= v2;
+ break;
+ }
+
+ case 11:
+ v2 = READ_LE_UINT32(card);
+ card += 4;
+ v2 = _vm->getRandomNumber(v2 - 1) + 1;
+ _vm->_controlPtr->_state->_vals[*card++] = v2;
+ break;
+
+ case 17:
+ _vm->_glGoState = READ_LE_UINT16(card);
+ card += 2;
+ _vm->_glGoStack = -1;
+ break;
+
+ case 18:
+ v2 = _vm->_controlPtr->_state->_vals[*card++];
+ _vm->_glGoState = getStateFromID(v2);
+ break;
+
+ case 19:
+ _vm->_glGoState = READ_LE_UINT32(card);
+ card += 4;
+ _vm->_glGoStack = READ_LE_UINT16(card);
+ card += 2;
+ break;
+
+ case 23:
+ case 24:
+ case 27:
+ case 28:
+ subId -= 3;
+ // Deliberate fall-through
+
+ case 21:
+ case 22:
+ case 25:
+ case 26:
+ bVal = card[subId];
+ if (bVal == 61) {
+ if (cardPerform2(card, id)) {
+ card += subId;
+ while (*card != 30 && *card != 29)
+ card = cardPerform(card);
+
+ if (*card == 29) {
+ int count = 1;
+ while (count > 0) {
+ card = getNextRecord(card);
+ if (*card == 30)
+ --count;
+ if (*card >= 21 && *card <= 28)
+ ++count;
+ }
+ }
+ } else {
+ card += subId;
+ int count = 1;
+ while (count > 0) {
+ card = getNextRecord(card);
+ if (*card == 29 || *card == 30)
+ --count;
+ if (*card < 21 || *card > 28)
+ continue;
+
+ const byte *nextP = getNextRecord(card + 2);
+ if (*nextP == 61)
+ ++count;
+ }
+ }
+
+ ++card;
+ } else {
+ if (cardPerform2(card, id)) {
+ card += subId;
+ card = cardPerform(card);
+ while (*card++ != 61) ;
+ } else {
+ card += subId;
+ while (*card != 61 && *card != 29)
+ ++card;
+ }
+ }
+ break;
+
+ case 41:
+ bVal = *card++;
+ assert(bVal < 8);
+ card += 6;
+ break;
+
+ case 45:
+ _newStateId = _nextStateId;
+ _newStackId = _stackId;
+ break;
+
+ case 46:
+ _vm->_glGoState = _newStateId;
+ _vm->_glGoStack = _newStackId;
+ _newStateId = -1;
+ _newStackId = -1;
+ break;
+
+ case 51:
+ setButtonFlag(READ_LE_UINT16(card), 64);
+ break;
+
+ case 52:
+ clearButtonFlag(READ_LE_UINT16(card), 64);
+ break;
+
+ default:
+ break;
+ }
+
+ return card;
+}
+
+bool ThreadResource::cardPerform2(const byte *pSrc, int cardCmdId) {
+ int vLong, vLong2;
+
+ switch (cardCmdId) {
+ case 21:
+ vLong = (int32)READ_LE_UINT32(pSrc + 1);
+ return _vm->_controlPtr->_state->_vals[*pSrc] == vLong;
+
+ case 22:
+ vLong = (int32)READ_LE_UINT32(pSrc + 1);
+ return _vm->_controlPtr->_state->_vals[*pSrc] != vLong;
+
+ case 23:
+ vLong = _vm->_controlPtr->_state->_vals[*pSrc];
+ vLong2 = _vm->_controlPtr->_state->_vals[*(pSrc + 1)];
+ return vLong == vLong2;
+
+ case 24:
+ vLong = _vm->_controlPtr->_state->_vals[*pSrc];
+ vLong2 = _vm->_controlPtr->_state->_vals[*(pSrc + 1)];
+ return vLong != vLong2;
+
+ case 25:
+ vLong = _vm->_controlPtr->_state->_vals[*pSrc];
+ vLong2 = (int32)READ_LE_UINT32(pSrc + 1);
+ return vLong < vLong2;
+
+ case 26:
+ vLong = _vm->_controlPtr->_state->_vals[*pSrc];
+ vLong2 = (int32)READ_LE_UINT32(pSrc + 1);
+ return vLong > vLong2;
+
+ case 27:
+ vLong = _vm->_controlPtr->_state->_vals[*pSrc];
+ vLong2 = _vm->_controlPtr->_state->_vals[*(pSrc + 1)];
+ return vLong < vLong2;
+
+ case 28:
+ vLong = _vm->_controlPtr->_state->_vals[*pSrc];
+ vLong2 = _vm->_controlPtr->_state->_vals[*(pSrc + 1)];
+ return vLong > vLong2;
+
+ default:
+ return false;
+ }
+}
+
+int ThreadResource::doApt() {
+ loadTheApt();
+
+ _vm->_currentVocId = 151;
+ _vm->_voy->_viewBounds = _vm->_bVoy->boltEntry(_vm->_playStampGroupId)._rectResource;
+ Common::Array<RectEntry> &hotspots = _vm->_bVoy->boltEntry(
+ _vm->_playStampGroupId + 1)._rectResource->_entries;
+ _vm->_eventsManager->getMouseInfo();
+
+ // Very first time apartment is shown, start the phone message
+ if (_aptPos.x == -1) {
+ _aptPos.x = hotspots[2].left;
+ _aptPos.y = hotspots[2].top;
+ _vm->_currentVocId = 153;
+ }
+
+ if (_vm->_voy->_playStampMode == 16) {
+ hotspots[0].left = 999;
+ hotspots[3].left = 999;
+ _aptPos.x = hotspots[4].left + 28;
+ _aptPos.y = hotspots[4].top + 28;
+ }
+
+ _vm->_eventsManager->setMousePos(Common::Point(_aptPos.x, _aptPos.y));
+ _vm->_soundManager->startVOCPlay(_vm->_soundManager->getVOCFileName(_vm->_currentVocId));
+ _vm->_currentVocId = 151;
+
+ _vm->_graphicsManager->setColor(129, 82, 82, 82);
+ _vm->_graphicsManager->setColor(130, 112, 112, 112);
+ _vm->_graphicsManager->setColor(131, 215, 215, 215);
+ _vm->_graphicsManager->setColor(132, 235, 235, 235);
+
+ _vm->_eventsManager->_intPtr._hasPalette = true;
+
+ // Set up the cursors
+ PictureResource *unselectedCursor = _vm->_bVoy->boltEntry(_vm->_playStampGroupId + 2)._picResource;
+ PictureResource *selectedCursor = _vm->_bVoy->boltEntry(_vm->_playStampGroupId + 3)._picResource;
+ unselectedCursor->_keyColor = 0xff;
+ selectedCursor->_keyColor = 0xff;
+ _vm->_eventsManager->setCursor(unselectedCursor);
+ _vm->_eventsManager->showCursor();
+
+ // Main loop to allow users to move the cursor and select hotspots
+ int hotspotId;
+ int prevHotspotId = -1;
+ Common::Point pt;
+ PictureResource *pic;
+ Common::Rect gmmHotspot(75, 125, 130, 140);
+
+ do {
+ _vm->_voyeurArea = AREA_APARTMENT;
+
+ if (_vm->_loadGameSlot != -1) {
+ // Load a savegame
+ _vm->loadGame(_vm->_loadGameSlot);
+ _vm->_loadGameSlot = -1;
+ }
+
+ _vm->_eventsManager->getMouseInfo();
+ if (!_vm->_soundManager->getVOCStatus()) {
+ // Previous sound ended, so start up a new one
+ _vm->_currentVocId = 151 - _vm->getRandomNumber(4);
+ _vm->_soundManager->startVOCPlay(_vm->_soundManager->getVOCFileName(_vm->_currentVocId));
+ }
+
+ // Loop through the hotspot list
+ hotspotId = -1;
+ pt = _vm->_eventsManager->getMousePos() + Common::Point(16, 16);
+ for (int idx = 0; idx < (int)hotspots.size(); ++idx) {
+ if (hotspots[idx].contains(pt)) {
+ // Cursor is within hotspot area
+
+ // Don't allow the camera to be highlighted on Monday morning.
+ if (idx == 0 && _vm->_voy->_transitionId == 17)
+ continue;
+
+ // Set the highlighted hotspot Id
+ hotspotId = idx;
+
+ if (hotspotId != prevHotspotId) {
+ // Check for whether to replace hotspot Id for "Watch TV" for
+ // "Review the Tape" if player has already watched the TV
+ if ((_vm->_voy->_eventFlags & EVTFLAG_100) && (hotspotId == 2))
+ hotspotId = 5;
+
+ // Draw the text description for the highlighted hotspot
+ pic = _vm->_bVoy->boltEntry(_vm->_playStampGroupId +
+ hotspotId + 6)._picResource;
+ _vm->_graphicsManager->sDrawPic(pic, _vm->_graphicsManager->_vPort,
+ Common::Point(106, 200));
+ }
+
+ break;
+ }
+ }
+
+ // Check for presence in ScummVM GMM
+ if (gmmHotspot.contains(pt))
+ hotspotId = 42;
+
+ // Update the cursor to either standard or highlighted eye cursor
+ _vm->_eventsManager->setCursor((hotspotId == -1) ? unselectedCursor : selectedCursor);
+ _vm->flipPageAndWait();
+
+ if (hotspotId == 42 && _vm->_eventsManager->_leftClick) {
+ // Show the ScummVM GMM
+ _vm->_eventsManager->getMouseInfo();
+ _vm->openMainMenuDialog();
+ }
+
+ } while (!_vm->shouldQuit() && (!_vm->_eventsManager->_leftClick || hotspotId == -1));
+
+ _vm->_eventsManager->hideCursor();
+ pt = _vm->_eventsManager->getMousePos();
+ _aptPos.x = pt.x;
+ _aptPos.y = pt.y;
+
+ switch (hotspotId) {
+ case 0:
+ _vm->_voy->_aptLoadMode = 140;
+ break;
+ case 1:
+ _vm->_voy->_aptLoadMode = 143;
+ break;
+ case 2:
+ _vm->_voy->_aptLoadMode = 142;
+ case 5:
+ _vm->_voy->_aptLoadMode = 141;
+ break;
+ default:
+ _vm->_voy->_aptLoadMode = -1;
+ break;
+ }
+
+ freeTheApt();
+
+ if (_vm->_voy->_transitionId == 1 && hotspotId == 0)
+ _vm->checkTransition();
+
+ if (!hotspotId)
+ _vm->makeViewFinder();
+
+ return hotspotId;
+}
+
+void ThreadResource::doRoom() {
+ VoyeurEngine &vm = *_vm;
+ SVoy voy = *vm._voy;
+
+ vm.makeViewFinderP();
+ voy._fadingType = 0;
+
+ if (!vm._bVoy->getBoltGroup(vm._playStampGroupId))
+ return;
+
+ vm._graphicsManager->_backColors = vm._bVoy->boltEntry(vm._playStampGroupId + 1)._cMapResource;
+ vm._graphicsManager->_backgroundPage = vm._bVoy->boltEntry(vm._playStampGroupId)._picResource;
+ vm._graphicsManager->_vPort->setupViewPort(vm._graphicsManager->_backgroundPage);
+ vm._graphicsManager->_backColors->startFade();
+
+ voy._fadingStep1 = 2;
+ voy._fadingStep2 = 0;
+ voy._fadingType = 1;
+
+ Common::Array<RectEntry> &hotspots = vm._bVoy->boltEntry(vm._playStampGroupId + 4)._rectResource->_entries;
+ int hotspotId = -1;
+
+ PictureResource *crosshairsCursor = vm._bVoy->boltEntry(vm._playStampGroupId + 2)._picResource;
+ PictureResource *magnifierCursor = vm._bVoy->boltEntry(vm._playStampGroupId + 3)._picResource;
+ vm._eventsManager->showCursor();
+
+ RectResource viewBounds(48, 38, 336, 202);
+ voy._viewBounds = &viewBounds;
+
+ vm._eventsManager->getMouseInfo();
+ vm._eventsManager->setMousePos(Common::Point(192, 120));
+ voy._fadingType = 0;
+ vm._currentVocId = 146;
+ voy._musicStartTime = voy._RTVNum;
+
+ voy._vocSecondsOffset = 0;
+ vm._soundManager->startVOCPlay(vm._currentVocId);
+ voy._eventFlags &= ~EVTFLAG_TIME_DISABLED;
+
+ bool breakFlag = false;
+ while (!vm.shouldQuit() && !breakFlag) {
+ _vm->_voyeurArea = AREA_ROOM;
+ vm._graphicsManager->setColor(128, 0, 255, 0);
+ vm._eventsManager->_intPtr._hasPalette = true;
+
+ do {
+ if (vm._currentVocId != -1 && !vm._soundManager->getVOCStatus()) {
+ voy._musicStartTime = voy._RTVNum;
+ voy._vocSecondsOffset = 0;
+ vm._soundManager->startVOCPlay(vm._currentVocId);
+ }
+
+ vm._eventsManager->getMouseInfo();
+ Common::Point pt = vm._eventsManager->getMousePos();
+ pt += Common::Point(30, 15);
+
+ hotspotId = -1;
+
+ if (voy._computerTextId != -1 && voy._computerScreenRect.contains(pt))
+ hotspotId = 999;
+
+ for (uint idx = 0; idx < hotspots.size(); ++idx) {
+ if (hotspots[idx].contains(pt)) {
+ int arrIndex = hotspots[idx]._arrIndex;
+ if (voy._roomHotspotsEnabled[arrIndex - 1]) {
+ hotspotId = idx;
+ break;
+ }
+ }
+ }
+
+ if (hotspotId == -1) {
+ vm._eventsManager->setCursorColor(128, 0);
+ vm._eventsManager->setCursor(crosshairsCursor);
+ } else if (hotspotId != 999 || voy._RTVNum < voy._computerTimeMin ||
+ (voy._computerTimeMax - 2) < voy._RTVNum) {
+ vm._eventsManager->setCursorColor(128, 1);
+ vm._eventsManager->setCursor(magnifierCursor);
+ } else {
+ vm._eventsManager->setCursorColor(128, 2);
+ vm._eventsManager->setCursor(magnifierCursor);
+ }
+
+ vm._eventsManager->_intPtr._hasPalette = true;
+ vm._graphicsManager->flipPage();
+ vm._eventsManager->sWaitFlip();
+ } while (!vm.shouldQuit() && !vm._eventsManager->_mouseClicked);
+
+ if (!vm._eventsManager->_leftClick || hotspotId == -1) {
+ if (vm._eventsManager->_rightClick)
+ breakFlag = true;
+
+ Common::Point pt = vm._eventsManager->getMousePos();
+ vm._eventsManager->getMouseInfo();
+ vm._eventsManager->setMousePos(pt);
+ } else {
+ voy._eventFlags |= EVTFLAG_RECORDING;
+ vm._eventsManager->hideCursor();
+ vm._eventsManager->startCursorBlink();
+
+ if (hotspotId == 999) {
+ _vm->flipPageAndWait();
+
+ if (vm._currentVocId != -1) {
+ voy._vocSecondsOffset = voy._RTVNum - voy._musicStartTime;
+ vm._soundManager->stopVOCPlay();
+ }
+
+ vm.getComputerBrush();
+ _vm->flipPageAndWait();
+
+ vm._voy->addComputerEventStart();
+
+ vm._eventsManager->_mouseClicked = false;
+ vm._eventsManager->startCursorBlink();
+
+ int totalChars = vm.doComputerText(9999);
+ if (totalChars)
+ vm._voy->addComputerEventEnd(totalChars);
+
+ vm._bVoy->freeBoltGroup(0x4900);
+ } else {
+ vm.doEvidDisplay(hotspotId, 999);
+ }
+
+ voy._eventFlags &= ~EVTFLAG_RECORDING;
+ if (!vm._eventsManager->_mouseClicked)
+ vm._eventsManager->delayClick(18000);
+
+ // WORKAROUND: Skipped code from the original, that freed the group,
+ // reloaded it, and reloaded the cursors
+
+ vm._graphicsManager->_backColors = vm._bVoy->boltEntry(
+ vm._playStampGroupId + 1)._cMapResource;
+ vm._graphicsManager->_backgroundPage = vm._bVoy->boltEntry(
+ vm._playStampGroupId)._picResource;
+
+ vm._graphicsManager->_vPort->setupViewPort();
+ vm._graphicsManager->_backColors->startFade();
+ _vm->flipPageAndWait();
+
+ while (!vm.shouldQuit() && (vm._eventsManager->_fadeStatus & 1))
+ vm._eventsManager->delay(1);
+ vm._eventsManager->hideCursor();
+
+ while (!vm.shouldQuit() && voy._fadingAmount2 > 0) {
+ if (voy._fadingAmount1 < 63) {
+ voy._fadingAmount1 += 4;
+ if (voy._fadingAmount1 > 63)
+ voy._fadingAmount1 = 63;
+ }
+
+ if (voy._fadingAmount2 > 0) {
+ voy._fadingAmount2 -= 8;
+ if (voy._fadingAmount2 < 0)
+ voy._fadingAmount2 = 0;
+ }
+
+ vm._eventsManager->delay(1);
+ }
+
+ _vm->flipPageAndWait();
+
+ vm._graphicsManager->fadeUpICF1();
+ voy._eventFlags &= EVTFLAG_RECORDING;
+ vm._eventsManager->showCursor();
+ }
+ }
+
+ voy._eventFlags = EVTFLAG_TIME_DISABLED;
+ vm._eventsManager->incrementTime(1);
+ voy._viewBounds = nullptr;
+ voy._fadingType = 0;
+ vm.makeViewFinderP();
+
+ if (voy._boltGroupId2 != -1) {
+ vm._bVoy->freeBoltGroup(voy._boltGroupId2);
+ voy._boltGroupId2 = -1;
+ }
+
+ if (vm._playStampGroupId != -1) {
+ vm._bVoy->freeBoltGroup(vm._playStampGroupId);
+ vm._playStampGroupId = -1;
+ }
+
+ if (vm._currentVocId != -1) {
+ vm._soundManager->stopVOCPlay();
+ vm._currentVocId = -1;
+ }
+
+ vm._eventsManager->hideCursor();
+ chooseSTAMPButton(0);
+}
+
+int ThreadResource::doInterface() {
+ PictureResource *pic;
+ Common::Point pt;
+
+ _vm->_voy->_eventFlags |= EVTFLAG_TIME_DISABLED;
+ if (_vm->_voy->_abortInterface) {
+ _vm->_voy->_abortInterface = false;
+ return -2;
+ }
+
+ _vm->_voy->_eventFlags &= ~EVTFLAG_100;
+ _vm->_playStampGroupId = -1;
+ _vm->_eventsManager->_intPtr._flashStep = 1;
+ _vm->_eventsManager->_intPtr._flashTimer = 0;
+
+ if (_vm->_voy->_RTVNum >= _vm->_voy->_RTVLimit || _vm->_voy->_RTVNum < 0)
+ _vm->_voy->_RTVNum = _vm->_voy->_RTVLimit - 1;
+
+ if (_vm->_voy->_transitionId < 15 && _vm->_debugger->_isTimeActive
+ && (_vm->_voy->_RTVLimit - 3) < _vm->_voy->_RTVNum) {
+ _vm->_voy->_RTVNum = _vm->_voy->_RTVLimit;
+ _vm->makeViewFinder();
+
+ _vm->initIFace();
+ _vm->_eventsManager->hideCursor();
+ _vm->_voy->_RTVNum = _vm->_voy->_RTVLimit - 4;
+ _vm->_voy->_eventFlags &= ~EVTFLAG_TIME_DISABLED;
+
+ while (!_vm->shouldQuit() && _vm->_voy->_RTVNum < _vm->_voy->_RTVLimit) {
+ _vm->flashTimeBar();
+ _vm->_eventsManager->delayClick(1);
+ }
+
+ _vm->_voy->_eventFlags |= EVTFLAG_TIME_DISABLED;
+ chooseSTAMPButton(20);
+ parsePlayCommands();
+
+ _vm->_eventsManager->showCursor();
+ }
+
+ _vm->checkTransition();
+ _vm->makeViewFinder();
+ _vm->_eventsManager->getMouseInfo();
+ _vm->initIFace();
+
+ Common::Array<RectEntry> *hotspots = &_vm->_bVoy->boltEntry(
+ _vm->_playStampGroupId + 1)._rectResource->_entries;
+ _vm->_currentVocId = 151 - _vm->getRandomNumber(5);
+ _vm->_voy->_vocSecondsOffset = _vm->getRandomNumber(29);
+
+ Common::String fname = _vm->_soundManager->getVOCFileName(_vm->_currentVocId);
+ _vm->_soundManager->startVOCPlay(fname);
+ _vm->_eventsManager->getMouseInfo();
+
+ _vm->_graphicsManager->setColor(240, 220, 220, 220);
+ _vm->_eventsManager->_intPtr._hasPalette = true;
+ _vm->_voy->_eventFlags &= ~EVTFLAG_TIME_DISABLED;
+
+ // Set the cusor
+ PictureResource *crosshairsCursor = _vm->_bVoy->boltEntry(0x112)._picResource;
+ PictureResource *eyeCursor = _vm->_bVoy->boltEntry(0x113)._picResource;
+ PictureResource *listenCursor = _vm->_bVoy->boltEntry(0x114)._picResource;
+ PictureResource *mangifyCursor = _vm->_bVoy->boltEntry(0x115)._picResource;
+
+ _vm->_eventsManager->setCursor(crosshairsCursor);
+
+ // Main loop
+ int regionIndex = 0;
+ Common::Rect mansionViewBounds(MANSION_VIEW_X, MANSION_VIEW_Y,
+ MANSION_VIEW_X + MANSION_VIEW_WIDTH, MANSION_VIEW_Y + MANSION_VIEW_HEIGHT);
+
+ do {
+ _vm->_voyeurArea = AREA_INTERFACE;
+ _vm->doTimeBar();
+ _vm->_eventsManager->getMouseInfo();
+
+ if (checkMansionScroll())
+ _vm->doScroll(_vm->_mansionViewPos);
+
+ _vm->checkPhoneCall();
+ if (!_vm->_soundManager->getVOCStatus()) {
+ _vm->_currentVocId = 151 - _vm->getRandomNumber(5);
+ _vm->_soundManager->startVOCPlay(_vm->_soundManager->getVOCFileName(_vm->_currentVocId));
+ }
+
+ // Calculate the mouse position within the entire mansion
+ pt = _vm->_eventsManager->getMousePos();
+ if (!mansionViewBounds.contains(pt))
+ pt = Common::Point(-1, -1);
+ else
+ pt = _vm->_mansionViewPos +
+ Common::Point(pt.x - MANSION_VIEW_X, pt.y - MANSION_VIEW_Y);
+ regionIndex = -1;
+
+ for (int hotspotIdx = 0; hotspotIdx < (int)hotspots->size(); ++hotspotIdx) {
+ if ((*hotspots)[hotspotIdx].contains(pt)) {
+ // Rect check done
+ for (int arrIndex = 0; arrIndex < 3; ++arrIndex) {
+ if (_vm->_voy->_audioHotspotTimes.isInRange(arrIndex, hotspotIdx, _vm->_voy->_RTVNum)) {
+ // Set the ear cursor for an audio event
+ _vm->_eventsManager->setCursor(listenCursor);
+ regionIndex = hotspotIdx;
+ }
+
+ if (_vm->_voy->_evidenceHotspotTimes.isInRange(arrIndex, hotspotIdx, _vm->_voy->_RTVNum)) {
+ // Set the magnifier cursor for an evidence event
+ _vm->_eventsManager->setCursor(mangifyCursor);
+ regionIndex = hotspotIdx;
+ }
+ }
+
+ for (int arrIndex = 0; arrIndex < 8; ++arrIndex) {
+ if (_vm->_voy->_videoHotspotTimes.isInRange(arrIndex, hotspotIdx, _vm->_voy->_RTVNum)) {
+ // Set the eye cursor for a video event
+ _vm->_eventsManager->setCursor(eyeCursor);
+ regionIndex = hotspotIdx;
+ }
+ }
+ }
+ }
+
+ if (regionIndex == -1) {
+ // Reset back to the crosshairs cursor
+ _vm->_eventsManager->setCursor(crosshairsCursor);
+ }
+
+ // Regularly update the time display
+ if (_vm->_voy->_RTANum & 2) {
+ _vm->_graphicsManager->drawANumber(_vm->_graphicsManager->_vPort,
+ _vm->_gameMinute / 10, Common::Point(190, 25));
+ _vm->_graphicsManager->drawANumber(_vm->_graphicsManager->_vPort,
+ _vm->_gameMinute % 10, Common::Point(201, 25));
+
+ if (_vm->_voy->_RTANum & 4) {
+ int v = _vm->_gameHour / 10;
+ _vm->_graphicsManager->drawANumber(_vm->_graphicsManager->_vPort,
+ v == 0 ? 10 : v, Common::Point(161, 25));
+ _vm->_graphicsManager->drawANumber(_vm->_graphicsManager->_vPort,
+ _vm->_gameHour % 10, Common::Point(172, 25));
+
+ pic = _vm->_bVoy->boltEntry(_vm->_voy->_isAM ? 272 : 273)._picResource;
+ _vm->_graphicsManager->sDrawPic(pic, _vm->_graphicsManager->_vPort,
+ Common::Point(215, 27));
+ }
+ }
+
+ _vm->_voy->_RTANum = 0;
+ _vm->flipPageAndWait();
+
+ pt = _vm->_eventsManager->getMousePos();
+ if ((_vm->_voy->_RTVNum >= _vm->_voy->_RTVLimit) || ((_vm->_voy->_eventFlags & 0x80) &&
+ _vm->_eventsManager->_rightClick && (pt.x == 0))) {
+ // Time to transition to the next time period
+ _vm->_eventsManager->getMouseInfo();
+
+ if (_vm->_voy->_transitionId == 15) {
+ regionIndex = 20;
+ _vm->_voy->_transitionId = 17;
+ _vm->_soundManager->stopVOCPlay();
+ _vm->checkTransition();
+ _vm->_eventsManager->_leftClick = true;
+ } else {
+ _vm->_voy->_eventFlags |= EVTFLAG_TIME_DISABLED;
+
+ chooseSTAMPButton(20);
+ parsePlayCommands();
+ _vm->checkTransition();
+ _vm->makeViewFinder();
+
+ _vm->initIFace();
+
+ hotspots = &_vm->_bVoy->boltEntry(_vm->_playStampGroupId + 1)._rectResource->_entries;
+ _vm->_eventsManager->getMouseInfo();
+
+ _vm->_voy->_eventFlags &= ~EVTFLAG_TIME_DISABLED;
+ _vm->_eventsManager->_intPtr._flashStep = 1;
+ _vm->_eventsManager->_intPtr._flashTimer = 0;
+ }
+ }
+ } while (!_vm->_eventsManager->_rightClick && !_vm->shouldQuit() &&
+ (!_vm->_eventsManager->_leftClick || regionIndex == -1));
+
+ _vm->_eventsManager->hideCursor();
+ _vm->_voy->_eventFlags |= EVTFLAG_TIME_DISABLED;
+ _vm->_bVoy->freeBoltGroup(_vm->_playStampGroupId);
+ if (_vm->_currentVocId != -1)
+ _vm->_soundManager->stopVOCPlay();
+
+ return !_vm->_eventsManager->_rightClick ? regionIndex : -2;
+}
+
+bool ThreadResource::checkMansionScroll() {
+ Common::Point pt = _vm->_eventsManager->getMousePos() -
+ Common::Point(MANSION_VIEW_X, MANSION_VIEW_Y);
+ Common::Point &viewPos = _vm->_mansionViewPos;
+ bool result = false;
+
+ // Scroll mansion view if close to any of the mansion edges
+ if (pt.x >= 0 && pt.x < MANSION_SCROLL_AREA_X && viewPos.x > 0) {
+ viewPos.x = MAX(viewPos.x - MANSION_SCROLL_INC_X, 0);
+ result = true;
+ }
+ if (pt.x >= (MANSION_VIEW_WIDTH - MANSION_SCROLL_AREA_X) &&
+ pt.x < MANSION_VIEW_WIDTH && viewPos.x < MANSION_MAX_X) {
+ viewPos.x = MIN(viewPos.x + MANSION_SCROLL_INC_X, MANSION_MAX_X);
+ result = true;
+ }
+ if (pt.y >= 0 && pt.y < MANSION_SCROLL_AREA_Y && viewPos.y > 0) {
+ viewPos.y = MAX(viewPos.y - MANSION_SCROLL_INC_Y, 0);
+ result = true;
+ }
+ if (pt.y >= (MANSION_VIEW_HEIGHT - MANSION_SCROLL_AREA_Y) &&
+ pt.y < MANSION_VIEW_HEIGHT && viewPos.y < MANSION_MAX_Y) {
+ viewPos.y = MIN(viewPos.y + MANSION_SCROLL_INC_Y, MANSION_MAX_Y);
+ result = true;
+ }
+
+ // Return whether mansion view area has changed
+ return result;
+}
+
+bool ThreadResource::goToStateID(int stackId, int id) {
+ debugC(DEBUG_BASIC, kDebugScripts, "goToStateID - %d, %d", stackId, id);
+
+ // Save current stack
+ savePrevious();
+
+ if (_stackId == stackId || stackId == -1 || loadAStack(stackId)) {
+ // Now in the correct state
+ _stateId = getStateFromID(id);
+
+ if (_stateId != -1) {
+ return doState();
+ } else {
+ _stateId = _savedStateId;
+ _stackId = _savedStackId;
+ }
+ }
+
+ return false;
+}
+
+bool ThreadResource::goToState(int stackId, int stateId) {
+ debugC(DEBUG_BASIC, kDebugScripts, "goToState - %d, %d", stackId, stateId);
+
+ savePrevious();
+ if (stackId == -1 || loadAStack(stackId)) {
+ if (stateId != -1)
+ _stateId = stateId;
+
+ return doState();
+ } else {
+ return false;
+ }
+}
+
+void ThreadResource::savePrevious() {
+ if (_savedStateId != _stateId || _stackId != _savedStackId) {
+ _savedStateId = _stateId;
+ _savedStackId = _stackId;
+ }
+}
+
+void ThreadResource::setButtonFlag(int idx, byte bits) {
+ _buttonFlags[idx] |= bits;
+}
+
+void ThreadResource::clearButtonFlag(int idx, byte bits) {
+ _buttonFlags[idx] &= ~bits;
+}
+
+void ThreadResource::loadTheApt() {
+ switch (_vm->_voy->_transitionId) {
+ case 1:
+ case 2:
+ case 5:
+ case 6:
+ case 7:
+ case 8:
+ case 9:
+ case 17:
+ _vm->_playStampGroupId = 0x5700;
+ break;
+ case 3:
+ _vm->_playStampGroupId = 0x5800;
+ break;
+ case 4:
+ case 10:
+ case 11:
+ case 12:
+ case 13:
+ case 14:
+ case 15:
+ case 16:
+ _vm->_playStampGroupId = 0x5900;
+ break;
+ default:
+ break;
+ }
+
+ if (_vm->_voy->_aptLoadMode == 143)
+ _vm->_voy->_aptLoadMode = -1;
+
+ if (_vm->_voy->_aptLoadMode != -1) {
+ doAptAnim(1);
+ _vm->_bVoy->getBoltGroup(_vm->_playStampGroupId);
+ _vm->_voy->_aptLoadMode = -1;
+ _vm->_graphicsManager->_backgroundPage = _vm->_bVoy->boltEntry(
+ _vm->_playStampGroupId + 5)._picResource;
+ _vm->_graphicsManager->_vPort->setupViewPort(
+ _vm->_graphicsManager->_backgroundPage);
+ } else {
+ _vm->_bVoy->getBoltGroup(_vm->_playStampGroupId);
+ _vm->_graphicsManager->_backgroundPage = _vm->_bVoy->boltEntry(
+ _vm->_playStampGroupId + 5)._picResource;
+ _vm->_graphicsManager->_vPort->setupViewPort(
+ _vm->_graphicsManager->_backgroundPage);
+ }
+
+ CMapResource *pal = _vm->_bVoy->boltEntry(_vm->_playStampGroupId + 4)._cMapResource;
+ pal->_steps = 1;
+ pal->startFade();
+ _vm->flipPageAndWaitForFade();
+}
+
+void ThreadResource::freeTheApt() {
+ _vm->_graphicsManager->fadeDownICF1(5);
+ _vm->flipPageAndWaitForFade();
+
+ _vm->_graphicsManager->fadeUpICF1();
+
+ if (_vm->_currentVocId != -1) {
+ _vm->_soundManager->stopVOCPlay();
+ _vm->_currentVocId = -1;
+ }
+
+ if (_vm->_voy->_aptLoadMode == -1) {
+ _vm->_graphicsManager->fadeDownICF(6);
+ } else {
+ doAptAnim(2);
+ }
+
+ if (_vm->_voy->_aptLoadMode == 140) {
+ _vm->_graphicsManager->screenReset();
+ _vm->_graphicsManager->resetPalette();
+ }
+
+ _vm->_graphicsManager->_vPort->setupViewPort(nullptr);
+ _vm->_bVoy->freeBoltGroup(_vm->_playStampGroupId);
+ _vm->_playStampGroupId = -1;
+ _vm->_voy->_viewBounds = nullptr;
+}
+
+void ThreadResource::doAptAnim(int mode) {
+ _vm->_bVoy->freeBoltGroup(0x100);
+
+ // Figure out the resource to use
+ int id = 0;
+ switch (_vm->_voy->_aptLoadMode) {
+ case 140:
+ id = 0x5A00;
+ break;
+ case 141:
+ id = 0x6000;
+ break;
+ case 142:
+ id = 0x6600;
+ break;
+ case 143:
+ id = 0x6C00;
+ break;
+ case 144:
+ id = 0x6F00;
+ break;
+ default:
+ break;
+ }
+
+ int id2 = (id == 0x6C00 || id == 0x6F00) ? 1 : 2;
+ switch (_vm->_voy->_transitionId) {
+ case 3:
+ id += id2 << 8;
+ break;
+ case 4:
+ case 10:
+ case 11:
+ case 12:
+ case 13:
+ case 14:
+ case 15:
+ case 16:
+ id += id2 << 9;
+ break;
+ default:
+ break;
+ }
+
+ if (mode == 1)
+ id += 0x100;
+
+ // Do the display
+ if (_vm->_bVoy->getBoltGroup(id)) {
+ CMapResource *pal = _vm->_bVoy->boltEntry(id)._cMapResource;
+ pal->_steps = 1;
+
+ for (int idx = 0; (idx < 6) && !_vm->shouldQuit(); ++idx) {
+ PictureResource *pic = _vm->_bVoy->boltEntry(id + idx + 1)._picResource;
+ _vm->_graphicsManager->_vPort->setupViewPort(pic);
+ pal->startFade();
+
+ _vm->flipPageAndWait();
+ _vm->_eventsManager->delayClick(5);
+ }
+
+ _vm->_bVoy->freeBoltGroup(id);
+ }
+
+ _vm->_bVoy->getBoltGroup(0x100);
+}
+
+void ThreadResource::synchronize(Common::Serializer &s) {
+ s.syncAsSint16LE(_aptPos.x);
+ s.syncAsSint16LE(_aptPos.y);
+
+ int stateId = _stateId;
+ int stackId = _stackId;
+ s.syncAsSint16LE(stateId);
+ s.syncAsSint16LE(stackId);
+
+ if (s.isLoading() && (stateId != _stateId || stackId != _stackId))
+ goToState(stackId, stateId);
+
+ s.syncAsSint16LE(_savedStateId);
+ s.syncAsSint16LE(_savedStackId);
+}
+
+} // End of namespace Voyeur
diff --git a/engines/voyeur/graphics.cpp b/engines/voyeur/graphics.cpp
new file mode 100644
index 0000000000..68a30e41f4
--- /dev/null
+++ b/engines/voyeur/graphics.cpp
@@ -0,0 +1,1054 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public 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 "voyeur/graphics.h"
+#include "voyeur/voyeur.h"
+#include "voyeur/staticres.h"
+#include "engines/util.h"
+#include "graphics/palette.h"
+#include "graphics/surface.h"
+
+namespace Voyeur {
+
+/*------------------------------------------------------------------------*/
+
+DrawInfo::DrawInfo(int penColor, const Common::Point &pos) {
+ _penColor = penColor;
+ _pos = pos;
+}
+
+/*------------------------------------------------------------------------*/
+
+GraphicsManager::GraphicsManager(VoyeurEngine *vm) : _defaultDrawInfo(1, Common::Point()), _drawPtr(&_defaultDrawInfo), _vm(vm) {
+ _SVGAMode = 0;
+ _planeSelect = 0;
+ _saveBack = true;
+ _clipPtr = NULL;
+ _viewPortListPtr = NULL;
+ _backgroundPage = NULL;
+ _vPort = NULL;
+ _fontPtr = NULL;
+ Common::fill(&_VGAColors[0], &_VGAColors[PALETTE_SIZE], 0);
+ _fontChar = new PictureResource(DISPFLAG_NONE, 0xff, 0xff, 0, Common::Rect(), 0, NULL, 0);
+ _backColors = nullptr;
+}
+
+void GraphicsManager::sInitGraphics() {
+ initGraphics(SCREEN_WIDTH, SCREEN_HEIGHT, false);
+ _screenSurface.create(SCREEN_WIDTH, SCREEN_HEIGHT, Graphics::PixelFormat::createFormatCLUT8());
+ clearPalette();
+}
+
+GraphicsManager::~GraphicsManager() {
+ _screenSurface.free();
+ delete _fontChar;
+}
+
+void GraphicsManager::setupMCGASaveRect(ViewPortResource *viewPort) {
+ if (viewPort->_activePage) {
+ viewPort->_activePage->_flags |= DISPFLAG_1;
+ Common::Rect *clipRect = _clipPtr;
+ _clipPtr = &viewPort->_clipRect;
+
+ sDrawPic(viewPort->_activePage, viewPort->_currentPic, Common::Point());
+
+ _clipPtr = clipRect;
+ }
+
+ viewPort->_rectListCount[1] = -1;
+}
+
+void GraphicsManager::addRectOptSaveRect(ViewPortResource *viewPort, int idx, const Common::Rect &bounds) {
+ if (viewPort->_rectListCount[idx] == -1)
+ return;
+
+ // TODO: Lots of code in original, which I suspect may be overlapping rect merging
+ viewPort->_rectListPtr[idx]->push_back(bounds);
+ ++viewPort->_rectListCount[idx];
+}
+
+void GraphicsManager::restoreMCGASaveRect(ViewPortResource *viewPort) {
+ if (viewPort->_rectListCount[0] != -1) {
+ for (int i = 0; i < viewPort->_rectListCount[0]; ++i) {
+ addRectOptSaveRect(viewPort, 1, (*viewPort->_rectListPtr[0])[i]);
+ }
+ } else {
+ viewPort->_rectListCount[1] = -1;
+ }
+
+ restoreBack(*viewPort->_rectListPtr[1], viewPort->_rectListCount[1], viewPort->_pages[0],
+ viewPort->_pages[1]);
+
+ int count = viewPort->_rectListCount[0];
+ restoreBack(*viewPort->_rectListPtr[0], viewPort->_rectListCount[0],
+ viewPort->_activePage, viewPort->_currentPic);
+
+ SWAP(viewPort->_rectListPtr[0], viewPort->_rectListPtr[1]);
+ viewPort->_rectListCount[1] = count;
+}
+
+void GraphicsManager::addRectNoSaveBack(ViewPortResource *viewPort, int idx, const Common::Rect &bounds) {
+ // Stubbed/dummy method in the original.
+}
+
+void GraphicsManager::sDrawPic(DisplayResource *srcDisplay, DisplayResource *destDisplay,
+ const Common::Point &initialOffset) {
+ int width1, width2;
+ int widthDiff, widthDiff2;
+ int height1;
+ int srcOffset;
+ int screenOffset;
+ int srcFlags, destFlags;
+ ViewPortResource *destViewPort = NULL;
+ Common::Rect newBounds;
+ Common::Rect backBounds;
+ int tmpWidth = 0;
+ int tmpHeight = 0;
+ bool isClipped = false;
+ byte pixel = 0;
+ int runLength;
+
+ byte *srcImgData, *destImgData;
+ byte *srcP, *destP;
+ byte byteVal, byteVal2;
+
+ PictureResource *srcPic;
+ PictureResource *destPic;
+
+ // Get the picture parameters, or deference viewport pointers to get their pictures
+ if (srcDisplay->_flags & DISPFLAG_VIEWPORT) {
+ // A viewport was passed, not a picture
+ srcPic = ((ViewPortResource *)srcDisplay)->_currentPic;
+ } else {
+ srcPic = (PictureResource *)srcDisplay;
+ }
+
+ if (destDisplay->_flags & DISPFLAG_VIEWPORT) {
+ // A viewport was passed, not a picture
+ destViewPort = (ViewPortResource *)destDisplay;
+ destPic = destViewPort->_currentPic;
+ } else {
+ destPic = (PictureResource *)destDisplay;
+ }
+
+ Common::Point offset = Common::Point(initialOffset.x + srcPic->_bounds.left - destPic->_bounds.left,
+ initialOffset.y + srcPic->_bounds.top - destPic->_bounds.top);
+ width1 = width2 = srcPic->_bounds.width();
+ height1 = srcPic->_bounds.height();
+ srcOffset = 0;
+ srcFlags = srcPic->_flags;
+ destFlags = destPic->_flags;
+ byte *cursorData = NULL;
+
+ if (srcFlags & 1) {
+ if (_clipPtr) {
+ int xs = _clipPtr->left - destPic->_bounds.left;
+ int ys = _clipPtr->top - destPic->_bounds.top;
+ newBounds = Common::Rect(xs, ys, xs + _clipPtr->width(), ys + _clipPtr->height());
+ } else if (destViewPort) {
+ int xs = destViewPort->_clipRect.left - destPic->_bounds.left;
+ int ys = destViewPort->_clipRect.top - destPic->_bounds.top;
+ newBounds = Common::Rect(xs, ys, xs + destViewPort->_clipRect.width(),
+ ys + destViewPort->_clipRect.height());
+ } else {
+ newBounds = Common::Rect(0, 0, destPic->_bounds.width(), destPic->_bounds.height());
+ }
+
+ tmpHeight = offset.y - newBounds.top;
+ if (tmpHeight < 0) {
+ srcOffset -= tmpHeight * width2;
+ height1 += tmpHeight;
+ offset.y = newBounds.top;
+
+ if (height1 <= 0)
+ return;
+
+ isClipped = true;
+ }
+
+ int yMin = newBounds.bottom - (offset.y + height1);
+ if (yMin < 0) {
+ height1 += yMin;
+ if (height1 <= 0)
+ return;
+ }
+
+ tmpWidth = offset.x - newBounds.left;
+ if (tmpWidth < 0) {
+ srcOffset -= tmpWidth;
+ width2 += tmpWidth;
+ offset.x = newBounds.left;
+
+ if (width2 <= 0)
+ return;
+
+ isClipped = true;
+ }
+
+ int xMin = newBounds.right - (offset.x + width2);
+ if (xMin < 0) {
+ width2 += xMin;
+ if (width2 <= 0)
+ return;
+
+ isClipped = true;
+ }
+ }
+
+ screenOffset = offset.y * destPic->_bounds.width() + offset.x;
+ widthDiff = width1 - width2;
+ widthDiff2 = destPic->_bounds.width() - width2;
+
+ if (destViewPort) {
+ if (!_saveBack || (srcPic->_flags & DISPFLAG_800)) {
+ backBounds.left = destPic->_bounds.left + offset.x;
+ backBounds.top = destPic->_bounds.top + offset.y;
+ backBounds.setWidth(width2);
+ backBounds.setHeight(height1);
+ addRectOptSaveRect(destViewPort, 1, backBounds);
+
+ } else if (!destViewPort->_addFn) {
+ if (destViewPort->_rectListCount[destViewPort->_pageIndex] < -1) {
+ Common::Rect r;
+ r.left = destPic->_bounds.left + offset.x;
+ r.top = destPic->_bounds.top + offset.y;
+ r.setWidth(width2);
+ r.setHeight(height1);
+
+ (*destViewPort->_rectListPtr[destViewPort->_pageIndex]).push_back(r);
+ ++destViewPort->_rectListCount[destViewPort->_pageIndex];
+ }
+ } else {
+ int xs = offset.x + destPic->_bounds.left;
+ int ys = offset.y + destPic->_bounds.top;
+ backBounds = Common::Rect(xs, ys, xs + width2, ys + height1);
+
+ (this->*destViewPort->_addFn)(destViewPort, destViewPort->_bounds.top, backBounds);
+ }
+ }
+
+ if (srcFlags & DISPFLAG_1000) {
+ int imageDataShift = 0;
+ srcImgData = srcPic->_imgData + (imageDataShift << 14);
+ for (uint idx = 0; idx < srcPic->_maskData; ++idx) {
+ if (imageDataShift < 4)
+ ++imageDataShift;
+ }
+
+ destImgData = destPic->_imgData + (imageDataShift << 14);
+ for (uint idx = 0; idx < srcPic->_maskData; ++idx) {
+ if (imageDataShift < 4)
+ ++imageDataShift;
+ }
+ } else {
+ srcImgData = srcPic->_imgData;
+ destImgData = destPic->_imgData;
+ }
+
+ if (srcPic->_select != 0xff)
+ return;
+
+ if (destFlags & DISPFLAG_CURSOR) {
+ cursorData = new byte[width2 * height1];
+ Common::fill(cursorData, cursorData + width2 * height1, 0);
+ destImgData = cursorData;
+ }
+
+ if (srcPic->_pick == 0xff) {
+ if (srcFlags & DISPFLAG_8) {
+ error("TODO: sDrawPic variation");
+ } else {
+ // loc_258B8
+ srcP = srcImgData + srcOffset;
+
+ if (destFlags & DISPFLAG_8) {
+ // loc_258D8
+ destP = destImgData + screenOffset;
+
+ if (srcFlags & DISPFLAG_2) {
+ // loc_25652
+ srcP = srcImgData + srcOffset;
+
+ if (destFlags & DISPFLAG_8) {
+ // loc_2566F
+ if (srcFlags & DISPFLAG_2) {
+ // loc_256FA
+ srcP = (byte *)_screenSurface.getPixels() + srcOffset;
+
+ for (int yp = 0; yp < height1; ++yp) {
+ for (int xp = 0; xp < width2; ++xp, ++srcP, ++destP) {
+ pixel = *srcP;
+ if (pixel)
+ *destP = pixel;
+ }
+
+ srcP += widthDiff;
+ destP += widthDiff2;
+ }
+ } else {
+ // loc_25706
+ for (int yp = 0; yp < height1; ++yp) {
+ Common::copy(srcP, srcP + width2, destP);
+ srcP += width2 + widthDiff;
+ destP += width2 + widthDiff2;
+ }
+ }
+ } else {
+ // loc_25773
+ destP = destImgData + screenOffset;
+
+ if (srcFlags & DISPFLAG_2) {
+ // loc_25793
+ for (int yp = 0; yp < height1; ++yp) {
+ Common::copy(srcP, srcP + width2, destP);
+ srcP += width2 + widthDiff;
+ destP += width2 + widthDiff2;
+ }
+ } else {
+ // loc_25829
+ destP = (byte *)_screenSurface.getPixels() + screenOffset;
+
+ for (int yp = 0; yp < height1; ++yp) {
+ Common::copy(srcP, srcP + width2, destP);
+ srcP += width2 + widthDiff;
+ destP += width2 + widthDiff2;
+ }
+ }
+ }
+ } else {
+ // loc_25D40
+ if (srcFlags & DISPFLAG_100) {
+ // loc_25D4A
+ error("TODO: sDrawPic variation");
+ } else {
+ // loc_2606D
+ destP = (byte *)_screenSurface.getPixels() + screenOffset;
+
+ for (int yp = 0; yp < height1; ++yp) {
+ Common::copy(srcP, srcP + width2, destP);
+ destP += width2 + widthDiff2;
+ srcP += width2 + widthDiff;
+ }
+ }
+ }
+ } else {
+ // loc_2615E
+ destP = destImgData + screenOffset;
+
+ if (srcFlags & DISPFLAG_2) {
+ // loc_2617e
+ if (srcFlags & DISPFLAG_100) {
+ // loc_26188
+ srcP = srcImgData;
+ if (isClipped) {
+ // loc_26199
+ tmpWidth = (tmpWidth < 0) ? -tmpWidth : 0;
+ int xMax = tmpWidth + width2;
+ tmpHeight = (tmpHeight < 0) ? -tmpHeight : 0;
+
+ width2 = srcPic->_bounds.width();
+ height1 = tmpHeight + height1;
+
+ for (int yp = 0; yp < height1; ++yp) {
+ runLength = 0;
+
+ for (int xp = 0; xp < width2; ++xp, --runLength) {
+ if (runLength <= 0) {
+ pixel = *srcP++;
+ if (pixel & 0x80) {
+ pixel &= 0x7f;
+ runLength = *srcP++;
+ if (!runLength)
+ runLength = width2;
+ }
+ }
+
+ if (yp >= tmpHeight && xp >= tmpWidth && xp < xMax) {
+ if (pixel > 0)
+ *destP = pixel;
+ ++destP;
+ }
+ }
+
+ if (yp >= tmpHeight)
+ destP += widthDiff2;
+ }
+ } else {
+ // loc_262BE
+ byteVal = 0;
+ for (int yp = 0; yp < height1; ++yp) {
+ for (int xp = 0; xp < width2; ++xp) {
+ byteVal2 = 0;
+ if (!byteVal2) {
+ byteVal = *++srcP;
+ if (byteVal & 0x80) {
+ byteVal &= 0x7f;
+ byteVal2 = *srcP++;
+
+ if (!byteVal2)
+ byteVal2 = width2;
+ }
+ }
+
+ if (byteVal > 0)
+ *destP = byteVal;
+
+ ++destP;
+ --byteVal2;
+ }
+
+ destP += widthDiff2;
+ }
+ }
+ } else {
+ // loc_2637F
+ // Copy with transparency
+ for (int yp = 0; yp < height1; ++yp) {
+ for (int xp = 0; xp < width2; ++xp, ++srcP, ++destP) {
+ if (*srcP != 0)
+ *destP = *srcP;
+ }
+
+ destP += widthDiff2;
+ srcP += widthDiff;
+ }
+ }
+ } else {
+ if (srcFlags & 0x100) {
+ // Simple run-length encoded image
+ srcP = srcImgData;
+
+ if (isClipped) {
+ // loc_26424
+ tmpWidth = (tmpWidth < 0) ? -tmpWidth : 0;
+ int xMax = tmpWidth + width2;
+ tmpHeight = (tmpHeight < 0) ? -tmpHeight : 0;
+ width2 = srcPic->_bounds.width();
+ height1 = tmpHeight + height1;
+
+ for (int yp = 0; yp < height1; ++yp) {
+ runLength = 0;
+ for (int xp = 0; xp < width2; ++xp, --runLength) {
+ if (runLength <= 0) {
+ pixel = *srcP++;
+ if (pixel & 0x80) {
+ pixel &= 0x7F;
+ runLength = *srcP++;
+
+ if (!runLength)
+ runLength = width2;
+ }
+ }
+
+ if (yp >= tmpHeight && xp >= tmpWidth && xp < xMax) {
+ *destP++ = pixel;
+ }
+ }
+
+ if (yp >= tmpHeight)
+ destP += widthDiff2;
+ }
+ } else {
+ // loc_26543
+ for (int yp = 0; yp < height1; ++yp) {
+ int runLen = 0;
+ for (int xp = 0; xp < width2; ++xp, --runLen) {
+ if (runLen <= 0) {
+ // Start of run length, so get pixel and repeat length
+ pixel = *srcP++;
+ if (pixel & 0x80) {
+ pixel &= 0x7f;
+ runLen = *srcP++;
+ if (runLen == 0)
+ runLen = width2;
+ }
+ }
+
+ // Copy pixel to output
+ *destP++ = pixel;
+ }
+
+ destP += widthDiff2;
+ }
+ }
+ } else {
+ for (int yp = 0; yp < height1; ++yp) {
+ Common::copy(srcP, srcP + width2, destP);
+ destP += width2 + widthDiff2;
+ srcP += width2 + widthDiff;
+ }
+ }
+ }
+ }
+ }
+ } else {
+ // loc_26666
+ if (srcPic->_pick == 0) {
+ // loc_2727A
+ byte onOff = srcPic->_onOff;
+
+ if (srcFlags & DISPFLAG_2) {
+ if (!(srcFlags & DISPFLAG_8)) {
+ srcP = srcImgData + srcOffset;
+
+ if (destFlags & DISPFLAG_8) {
+ // loc_272C3
+ error("TODO: sDrawPic variation");
+ } else {
+ destP = destImgData + screenOffset;
+ for (int yp = 0; yp < height1; ++yp) {
+ for (int xp = 0; xp < width2; ++xp, ++destP) {
+ if ((int8)*srcP++ < 0)
+ *destP = onOff;
+ }
+
+ destP += widthDiff2;
+ srcP += widthDiff;
+ }
+ }
+ }
+ } else {
+ // loc_27477
+ if (destFlags & DISPFLAG_8) {
+ // loc_27481
+ destP = (byte *)_screenSurface.getPixels() + screenOffset;
+ for (int yp = 0; yp < height1; ++yp) {
+ Common::fill(destP, destP + width2, onOff);
+ destP += width2 + widthDiff2;
+ }
+ } else {
+ // loc_2753C
+ destP = destImgData + screenOffset;
+
+ for (int yp = 0; yp < height1; ++yp) {
+ Common::fill(destP, destP + width2, onOff);
+ destP += width2 + widthDiff2;
+ }
+ }
+ }
+
+ } else {
+ // loc_26673
+ byte pick = srcPic->_pick;
+ byte onOff = srcPic->_onOff;
+
+ if (!(srcFlags & PICFLAG_PIC_OFFSET)) {
+ srcP = srcImgData += srcOffset;
+ pixel = 0;
+
+ if (destFlags & PICFLAG_PIC_OFFSET) {
+ destP = destImgData + screenOffset;
+ if (srcFlags & PICFLAG_2) {
+ if (srcFlags & PICFLAG_100) {
+ if (isClipped) {
+ // loc_266E3
+ destP = (byte *)_screenSurface.getPixels() + screenOffset;
+ tmpWidth = (tmpWidth < 0) ? -tmpWidth : 0;
+ int xMax = tmpWidth + width2;
+ tmpHeight = (tmpHeight < 0) ? -tmpHeight : 0;
+ pick = 0x7F;
+ width2 = srcPic->_bounds.width();
+ height1 = tmpHeight + height1;
+
+ for (int yp = 0; yp < height1; ++yp) {
+ int runLen = 0;
+ for (int xp = 0; xp < width2; ++xp, --runLen) {
+ if (runLen <= 0) {
+ pixel = *srcP++;
+ if (pixel & 0x80) {
+ pixel &= 0x7F;
+ runLen = *srcP++;
+ if (!runLen)
+ runLen = width2;
+ }
+ }
+
+ if (yp >= tmpHeight && xp >= tmpWidth && xp < xMax) {
+ if (pixel) {
+ *destP = (pixel & pick) ^ onOff;
+ }
+ ++destP;
+ }
+ }
+ if (yp >= tmpHeight)
+ destP += widthDiff2;
+ }
+ } else {
+ // loc_26815
+ destP = (byte *)_screenSurface.getPixels() + screenOffset;
+
+ for (int yp = 0; yp < height1; ++yp) {
+ for (int xi = 0; xi < width2; ++xi, ++destP) {
+ byteVal2 = 0;
+ for (int xp = 0; xp < width2; ++xp, ++destP, --byteVal2) {
+ if (!byteVal2) {
+ pixel = *srcP++;
+ if (pixel & 0x80) {
+ pixel &= 0x7F;
+ byteVal2 = *srcP++;
+ if (!byteVal2) {
+ byteVal2 = width2;
+ }
+ }
+ }
+
+ if (pixel)
+ *destP = (pixel & pick) ^ onOff;
+ }
+ }
+
+ destP += widthDiff2;
+ }
+ }
+ } else {
+ // Direct screen write
+ destP = (byte *)_screenSurface.getPixels() + screenOffset;
+
+ for (int yp = 0; yp < height1; ++yp) {
+ for (int xp = 0; xp < width2; ++xp, ++srcP, ++destP) {
+ if (*srcP)
+ *destP = (*srcP & pick) ^ onOff;
+ }
+ destP += widthDiff2;
+ srcP += widthDiff;
+ }
+ }
+ } else if (srcFlags & PICFLAG_100) {
+ srcP = srcImgData;
+ if (isClipped) {
+ // loc_269FD
+ tmpWidth = (tmpWidth < 0) ? -tmpWidth : 0;
+ int xMax = tmpWidth + width2;
+ tmpHeight = (tmpHeight < 0) ? -tmpHeight : 0;
+ width2 = srcPic->_bounds.width();
+ height1 = tmpHeight + height1;
+
+ for (int yp = 0; yp < height1; ++yp) {
+ runLength = 0;
+ for (int xp = 0; xp < width2; ++xp, --runLength) {
+ if (runLength <= 0) {
+ pixel = *srcP++;
+ if (pixel & 0x80) {
+ pixel &= 0x7F;
+ runLength = *srcP++;
+
+ if (!runLength)
+ runLength = width2;
+ }
+ }
+
+ if (yp >= tmpHeight && xp >= tmpWidth && xp < xMax) {
+ *destP++ = (pixel & 0x80) ^ onOff;
+ }
+ }
+ }
+ } else {
+ // loc_26BD5
+ destP = (byte *)_screenSurface.getPixels() + screenOffset;
+
+ for (int yp = 0; yp < height1; ++yp) {
+ byteVal2 = 0;
+
+ for (int xp = 0; xp < width2; ++xp, ++destP) {
+ if (!byteVal2) {
+ pixel = *srcP++;
+ if (pixel & 0x80) {
+ pixel &= 0x7F;
+ byteVal2 = *srcP++;
+ if (!byteVal2)
+ byteVal2 = width2;
+ }
+ }
+
+ *destP = (pixel & pick) ^ onOff;
+ }
+
+ destP += widthDiff2;
+ }
+ }
+ } else {
+ // loc_26C9A
+ destP = (byte *)_screenSurface.getPixels() + screenOffset;
+
+ for (int yp = 0; yp < height1; ++yp) {
+ for (int xp = 0; xp < width2; ++xp, ++srcP, ++destP) {
+ *destP = (*srcP & pick) ^ onOff;
+ }
+ destP += widthDiff2;
+ srcP += widthDiff;
+ }
+ }
+ } else {
+ // loc_26D2F
+ destP = destImgData + screenOffset;
+
+ if (srcFlags & PICFLAG_2) {
+ // loc_26D4F
+ if (srcFlags & PICFLAG_100) {
+ srcP = srcImgData;
+
+ if (isClipped) {
+ // loc_26D6A
+ tmpWidth = (tmpWidth < 0) ? -tmpWidth : 0;
+ int xMax = tmpWidth + width2;
+ tmpHeight = (tmpHeight < 0) ? -tmpHeight : 0;
+ width2 = srcPic->_bounds.width();
+ height1 = tmpHeight + height1;
+
+ for (int yp = 0; yp < height1; ++yp) {
+ runLength = 0;
+
+ for (int xp = 0; xp < width2; ++xp, --runLength) {
+ if (runLength <= 0) {
+ pixel = *srcP++;
+ if (pixel & 0x80) {
+ pixel &= 0x7F;
+ runLength = *srcP++;
+ if (!runLength)
+ runLength = width2;
+ }
+ }
+
+ if (yp >= tmpHeight && xp >= tmpWidth && xp < xMax) {
+ if (pixel)
+ *destP = (pixel & pick) ^ onOff;
+
+ ++destP;
+ }
+ }
+
+ if (yp >= tmpHeight)
+ destP += widthDiff2;
+ }
+ } else {
+ // loc_26E95
+ for (int yp = 0; yp < height1; ++yp) {
+ byteVal2 = 0;
+ for (int xp = 0; xp < width2; ++xp, ++destP, --byteVal2) {
+ if (!byteVal2) {
+ pixel = *srcP++;
+ if (pixel & 0x80) {
+ pixel &= 0x7F;
+ byteVal2 = *srcP++;
+ if (!byteVal2)
+ byteVal2 = width2;
+ }
+ }
+
+ if (pixel)
+ *destP = (pixel & pick) ^ onOff;
+ }
+
+ destP += widthDiff2;
+ }
+ }
+ } else {
+ // loc_26F5D
+ for (int yp = 0; yp < height1; ++yp) {
+ for (int xp = 0; xp < width2; ++xp, ++srcP, ++destP) {
+ if (*srcP)
+ *destP = (*srcP & pick) ^ onOff;
+ }
+ destP += widthDiff2;
+ srcP += widthDiff;
+ }
+ }
+ } else {
+ // loc_26FEF
+ if (srcFlags & PICFLAG_100) {
+ // loc_26FF9
+ for (int yp = 0; yp < height1; ++yp) {
+ for (int xp = 0; xp < width2; ++xp, ++srcP, ++destP) {
+ *destP = (*srcP & pick) ^ onOff;
+ }
+ destP += widthDiff2;
+ srcP += widthDiff;
+ }
+ } else {
+ // loc_271F0
+ srcP = srcImgData;
+
+ if (isClipped) {
+ // loc_2700A
+ tmpWidth = (tmpWidth < 0) ? -tmpWidth : 0;
+ int xMax = tmpWidth + width2;
+ tmpHeight = (tmpHeight < 0) ? -tmpHeight : 0;
+ width2 = srcPic->_bounds.width();
+ height1 = tmpHeight + height1;
+
+ for (int yp = 0; yp < height1; ++yp) {
+ runLength = 0;
+
+ for (int xp = 0; xp < width2; ++xp, --runLength) {
+ if (runLength <= 0) {
+ pixel = *srcP++;
+ if (pixel & 0x80) {
+ pixel &= 0x7F;
+ runLength = *srcP++;
+ if (!runLength)
+ runLength = width2;
+ }
+ }
+
+ if (yp >= tmpHeight && xp >= tmpWidth && xp < xMax) {
+ *destP++ = (pixel & pick) ^ onOff;
+ }
+ }
+
+ if (yp >= tmpHeight)
+ destP += widthDiff2;
+ }
+ } else {
+ // loc_2712F
+ for (int yp = 0; yp < height1; ++yp) {
+ byteVal2 = 0;
+ for (int xp = 0; xp < width2; ++xp, ++destP, --byteVal2) {
+ if (!byteVal2) {
+ pixel = *srcP++;
+ if (pixel & 0x80) {
+ pixel &= 0x7F;
+ byteVal2 = *srcP++;
+ if (!byteVal2)
+ byteVal2 = width2;
+ }
+ }
+
+ *destP = (*srcP & pick) ^ onOff;
+ }
+ destP += widthDiff2;
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+
+ if (cursorData) {
+ _vm->_eventsManager->setCursor(cursorData, width2, height1, srcPic->_keyColor);
+ delete[] cursorData;
+ }
+}
+
+void GraphicsManager::drawANumber(DisplayResource *display, int num, const Common::Point &pt) {
+ PictureResource *pic = _vm->_bVoy->boltEntry(num + 261)._picResource;
+ sDrawPic(pic, display, pt);
+}
+
+void GraphicsManager::fillPic(DisplayResource *display, byte onOff) {
+ PictureResource *pic;
+ if (display->_flags & DISPFLAG_VIEWPORT) {
+ pic = ((ViewPortResource *)display)->_currentPic;
+ } else {
+ pic = (PictureResource *)display;
+ }
+
+ PictureResource picResource;
+ picResource._flags = DISPFLAG_NONE;
+ picResource._select = 0xff;
+ picResource._pick = 0;
+ picResource._onOff = onOff;
+ picResource._bounds = pic->_bounds;
+
+ sDrawPic(&picResource, display, Common::Point());
+}
+
+/**
+ * Queues the given picture for display
+ */
+void GraphicsManager::sDisplayPic(PictureResource *pic) {
+ _vm->_eventsManager->_intPtr._flipWait = true;
+}
+
+void GraphicsManager::flipPage() {
+ Common::Array<ViewPortResource *> &viewPorts = _viewPortListPtr->_entries;
+ bool flipFlag = false;
+
+ for (uint idx = 0; idx < viewPorts.size(); ++idx) {
+ if (viewPorts[idx]->_flags & DISPFLAG_20) {
+ if ((viewPorts[idx]->_flags & (DISPFLAG_8 || DISPFLAG_1))
+ == (DISPFLAG_8 || DISPFLAG_1)) {
+ if (_planeSelect == idx)
+ sDisplayPic(viewPorts[idx]->_currentPic);
+ flipFlag = true;
+ }
+ }
+
+ if (flipFlag) {
+ ViewPortResource &viewPort = *viewPorts[idx];
+
+ viewPort._lastPage = viewPort._pageIndex;
+ ++viewPort._pageIndex;
+
+ if (viewPort._pageIndex >= viewPort._pageCount)
+ viewPort._pageIndex = 0;
+
+ assert(viewPort._pageIndex < 2);
+ viewPort._currentPic = viewPort._pages[viewPort._pageIndex];
+ viewPort._flags = (viewPort._flags & ~DISPFLAG_8) | DISPFLAG_40;
+ }
+ }
+}
+
+void GraphicsManager::restoreBack(Common::Array<Common::Rect> &rectList, int rectListCount,
+ PictureResource *srcPic, PictureResource *destPic) {
+ // WORKAROUND: Since _backgroundPage can point to a resource freed at the end of display methods,
+ // I'm now explicitly resetting it to null in screenReset(), so at this point it can be null
+ if (!srcPic)
+ return;
+
+ bool saveBack = _saveBack;
+ _saveBack = false;
+
+ if (rectListCount == -1) {
+ sDrawPic(srcPic, destPic, Common::Point());
+ } else {
+ for (int i = rectListCount - 1; i >= 0; --i) {
+ _clipPtr = &rectList[i];
+ sDrawPic(srcPic, destPic, Common::Point());
+ }
+ }
+
+ _saveBack = saveBack;
+}
+
+void GraphicsManager::clearPalette() {
+ byte palette[768];
+ Common::fill(&palette[0], &palette[768], 0);
+ g_system->getPaletteManager()->setPalette(&palette[0], 0, 256);
+}
+
+void GraphicsManager::setPalette(const byte *palette, int start, int count) {
+ g_system->getPaletteManager()->setPalette(palette, start, count);
+ _vm->_eventsManager->_gameData._hasPalette = false;
+}
+
+void GraphicsManager::setPalette128(const byte *palette, int start, int count) {
+ byte rgb[3];
+ g_system->getPaletteManager()->grabPalette(&rgb[0], 128, 1);
+ g_system->getPaletteManager()->setPalette(palette, start, count);
+ g_system->getPaletteManager()->setPalette(&rgb[0], 128, 1);
+}
+
+
+void GraphicsManager::resetPalette() {
+ for (int i = 0; i < 256; ++i)
+ setColor(i, 0, 0, 0);
+
+ _vm->_eventsManager->_intPtr._hasPalette = true;
+}
+
+void GraphicsManager::setColor(int idx, byte r, byte g, byte b) {
+ byte *vgaP = &_VGAColors[idx * 3];
+ vgaP[0] = r;
+ vgaP[1] = g;
+ vgaP[2] = b;
+
+ _vm->_eventsManager->_intPtr._palStartIndex = MIN(_vm->_eventsManager->_intPtr._palStartIndex, idx);
+ _vm->_eventsManager->_intPtr._palEndIndex = MAX(_vm->_eventsManager->_intPtr._palEndIndex, idx);
+}
+
+void GraphicsManager::setOneColor(int idx, byte r, byte g, byte b) {
+ byte palEntry[3];
+ palEntry[0] = r;
+ palEntry[1] = g;
+ palEntry[2] = b;
+ g_system->getPaletteManager()->setPalette(&palEntry[0], idx, 1);
+}
+
+void GraphicsManager::setColors(int start, int count, const byte *pal) {
+ for (int i = 0; i < count; ++i) {
+ if ((i + start) != 128) {
+ const byte *rgb = pal + i * 3;
+ setColor(i + start, rgb[0], rgb[1], rgb[2]);
+ }
+ }
+
+ _vm->_eventsManager->_intPtr._hasPalette = true;
+}
+
+void GraphicsManager::screenReset() {
+ resetPalette();
+
+ _backgroundPage = NULL;
+ _vPort->setupViewPort(NULL);
+ fillPic(_vPort, 0);
+
+ _vm->flipPageAndWait();
+}
+
+void GraphicsManager::fadeDownICF1(int steps) {
+ if (steps > 0) {
+ int stepAmount = _vm->_voy->_fadingAmount2 / steps;
+
+ for (int idx = 0; idx < steps; ++idx) {
+ _vm->_voy->_fadingAmount2 -= stepAmount;
+ _vm->_eventsManager->delay(1);
+ }
+ }
+
+ _vm->_voy->_fadingAmount2 = 0;
+}
+
+void GraphicsManager::fadeUpICF1(int steps) {
+ if (steps > 0) {
+ int stepAmount = (63 - _vm->_voy->_fadingAmount2) / steps;
+
+ for (int idx = 0; idx < steps; ++idx) {
+ _vm->_voy->_fadingAmount2 += stepAmount;
+ _vm->_eventsManager->delay(1);
+ }
+ }
+
+ _vm->_voy->_fadingAmount2 = 63;
+}
+
+void GraphicsManager::fadeDownICF(int steps) {
+ if (steps > 0) {
+ _vm->_eventsManager->hideCursor();
+ int stepAmount1 = _vm->_voy->_fadingAmount1 / steps;
+ int stepAmount2 = _vm->_voy->_fadingAmount2 / steps;
+
+ for (int idx = 0; idx < steps; ++idx) {
+ _vm->_voy->_fadingAmount1 -= stepAmount1;
+ _vm->_voy->_fadingAmount2 -= stepAmount2;
+ _vm->_eventsManager->delay(1);
+ }
+ }
+
+ _vm->_voy->_fadingAmount1 = 0;
+ _vm->_voy->_fadingAmount2 = 0;
+}
+
+void GraphicsManager::drawDot() {
+ for (int y = 0; y < 9; ++y) {
+ byte *pDest = (byte *)_screenSurface.getPixels() + DOT_LINE_START[y] + DOT_LINE_OFFSET[y];
+ Common::fill(pDest, pDest + DOT_LINE_LENGTH[y], 0x80);
+ }
+}
+
+void GraphicsManager::synchronize(Common::Serializer &s) {
+ s.syncBytes(&_VGAColors[0], PALETTE_SIZE);
+}
+
+} // End of namespace Voyeur
diff --git a/engines/voyeur/graphics.h b/engines/voyeur/graphics.h
new file mode 100644
index 0000000000..e4d0b38650
--- /dev/null
+++ b/engines/voyeur/graphics.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.
+ *
+ */
+
+#ifndef VOYEUR_GRAPHICS_H
+#define VOYEUR_GRAPHICS_H
+
+#include "common/scummsys.h"
+#include "common/array.h"
+#include "common/rect.h"
+#include "common/serializer.h"
+#include "graphics/surface.h"
+
+namespace Voyeur {
+
+#define SCREEN_WIDTH 320
+#define SCREEN_HEIGHT 200
+#define PALETTE_COUNT 256
+#define PALETTE_SIZE (256 * 3)
+
+class VoyeurEngine;
+class GraphicsManager;
+class DisplayResource;
+class PictureResource;
+class ViewPortResource;
+class ViewPortListResource;
+class FontResource;
+class FontInfoResource;
+class CMapResource;
+
+class DrawInfo {
+public:
+ int _penColor;
+ Common::Point _pos;
+public:
+ DrawInfo(int penColor, const Common::Point &pos);
+};
+
+typedef void (GraphicsManager::*GraphicMethodPtr)();
+typedef void (GraphicsManager::*ViewPortSetupPtr)(ViewPortResource *);
+typedef void (GraphicsManager::*ViewPortAddPtr)(ViewPortResource *, int idx, const Common::Rect &bounds);
+typedef void (GraphicsManager::*ViewPortRestorePtr)(ViewPortResource *);
+
+class GraphicsManager {
+public:
+ byte _VGAColors[PALETTE_SIZE];
+ PictureResource *_backgroundPage;
+ int _SVGAMode;
+ ViewPortListResource *_viewPortListPtr;
+ ViewPortResource *_vPort;
+ bool _saveBack;
+ Common::Rect *_clipPtr;
+ uint _planeSelect;
+ Graphics::Surface _screenSurface;
+ CMapResource *_backColors;
+ FontInfoResource *_fontPtr;
+ PictureResource *_fontChar;
+ DrawInfo *_drawPtr;
+ DrawInfo _defaultDrawInfo;
+private:
+ VoyeurEngine *_vm;
+
+ void restoreBack(Common::Array<Common::Rect> &rectList, int rectListCount,
+ PictureResource *srcPic, PictureResource *destPic);
+public:
+ GraphicsManager(VoyeurEngine *vm);
+ ~GraphicsManager();
+
+ void sInitGraphics();
+
+ void setupMCGASaveRect(ViewPortResource *viewPort);
+ void addRectOptSaveRect(ViewPortResource *viewPort, int idx, const Common::Rect &bounds);
+ void restoreMCGASaveRect(ViewPortResource *viewPort);
+ void addRectNoSaveBack(ViewPortResource *viewPort, int idx, const Common::Rect &bounds);
+
+ void sDrawPic(DisplayResource *srcDisplay, DisplayResource *destDisplay, const Common::Point &initialOffset);
+ void fillPic(DisplayResource *display, byte onOff);
+ void sDisplayPic(PictureResource *pic);
+ void drawANumber(DisplayResource *display, int num, const Common::Point &pt);
+ void flipPage();
+ void clearPalette();
+ void setPalette(const byte *palette, int start, int count);
+ void setPalette128(const byte *palette, int start, int count);
+ void resetPalette();
+ void setColor(int idx, byte r, byte g, byte b);
+ void setOneColor(int idx, byte r, byte g, byte b);
+ void setColors(int start, int count, const byte *pal);
+ void screenReset();
+ void fadeDownICF1(int steps);
+ void fadeUpICF1(int steps = 0);
+ void fadeDownICF(int steps);
+ void drawDot();
+
+ /**
+ * Synchronizes the game data
+ */
+ void synchronize(Common::Serializer &s);
+};
+
+} // End of namespace Voyeur
+
+#endif /* VOYEUR_GRAPHICS_H */
diff --git a/engines/voyeur/module.mk b/engines/voyeur/module.mk
new file mode 100644
index 0000000000..aab254cf36
--- /dev/null
+++ b/engines/voyeur/module.mk
@@ -0,0 +1,23 @@
+MODULE := engines/voyeur
+
+MODULE_OBJS := \
+ animation.o \
+ data.o \
+ debugger.o \
+ detection.o \
+ events.o \
+ files.o \
+ files_threads.o \
+ graphics.o \
+ sound.o \
+ staticres.o \
+ voyeur.o \
+ voyeur_game.o
+
+# This module can be built as a plugin
+ifeq ($(ENABLE_VOYEUR), DYNAMIC_PLUGIN)
+PLUGIN := 1
+endif
+
+# Include common rules
+include $(srcdir)/rules.mk
diff --git a/engines/voyeur/sound.cpp b/engines/voyeur/sound.cpp
new file mode 100644
index 0000000000..c0e5a043cd
--- /dev/null
+++ b/engines/voyeur/sound.cpp
@@ -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.
+ *
+ */
+
+#include "audio/audiostream.h"
+#include "audio/decoders/raw.h"
+#include "common/memstream.h"
+#include "voyeur/sound.h"
+#include "voyeur/staticres.h"
+
+namespace Voyeur {
+
+ SoundManager::SoundManager(Audio::Mixer *mixer) {
+ _mixer = mixer;
+ _vocOffset = 0;
+}
+
+void SoundManager::playVOCMap(byte *voc, int vocSize) {
+ Common::MemoryReadStream *dataStream = new Common::MemoryReadStream(voc, vocSize, DisposeAfterUse::NO);
+ Audio::AudioStream *audioStream = Audio::makeVOCStream(dataStream, Audio::FLAG_UNSIGNED, DisposeAfterUse::YES);
+
+ _mixer->playStream(Audio::Mixer::kSFXSoundType, &_soundHandle, audioStream);
+}
+
+void SoundManager::abortVOCMap() {
+ _mixer->stopHandle(_soundHandle);
+}
+
+void SoundManager::stopVOCPlay() {
+ _mixer->stopHandle(_soundHandle);
+ _vocOffset = 0;
+}
+
+void SoundManager::setVOCOffset(int offset) {
+ _vocOffset = offset;
+}
+
+Common::String SoundManager::getVOCFileName(int idx) {
+ return Common::String::format("%s.voc", SZ_FILENAMES[idx]);
+}
+
+void SoundManager::startVOCPlay(const Common::String &filename) {
+ Common::File f;
+ if (!f.open(filename))
+ error("Could not find voc file - %s", filename.c_str());
+
+ Audio::SeekableAudioStream *audioStream = Audio::makeVOCStream(f.readStream(f.size()),
+ Audio::FLAG_UNSIGNED, DisposeAfterUse::YES);
+
+ _mixer->playStream(Audio::Mixer::kSFXSoundType, &_soundHandle, audioStream);
+ audioStream->seek(Audio::Timestamp(_vocOffset * 1000, 11025));
+}
+
+void SoundManager::startVOCPlay(int soundId) {
+ startVOCPlay(getVOCFileName(soundId));
+}
+
+int SoundManager::getVOCStatus() {
+ return _mixer->isSoundHandleActive(_soundHandle);
+}
+
+uint32 SoundManager::getVOCFrame() {
+ Audio::Timestamp timestamp = _mixer->getElapsedTime(_soundHandle);
+ return timestamp.secs();
+}
+
+} // End of namespace Voyeur
diff --git a/engines/avalanche/pingo.h b/engines/voyeur/sound.h
index 72fdb54c2a..af1d0b1b46 100644
--- a/engines/avalanche/pingo.h
+++ b/engines/voyeur/sound.h
@@ -8,52 +8,48 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public 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 the original source code of Lord Avalot d'Argent version 1.3.
- * Copyright (c) 1994-1995 Mike, Mark and Thomas Thurman.
- */
-
-/* PINGO Full-screen sub-parts of the game. */
-
-#ifndef AVALANCHE_PINGO_H
-#define AVALANCHE_PINGO_H
+#ifndef VOYEUR_SOUND_H
+#define VOYEUR_SOUND_H
+#include "common/scummsys.h"
#include "common/str.h"
+#include "audio/mixer.h"
+#include "audio/decoders/voc.h"
+#include "voyeur/files.h"
-namespace Avalanche {
-class AvalancheEngine;
-
-class Pingo {
-public:
- Pingo(AvalancheEngine *vm);
-
- void bossKey();
- void copy02();
- void copy03();
- void copyPage(byte frp, byte top);
- void wobble();
- void zonk();
- void winningPic();
+namespace Voyeur {
+class SoundManager {
private:
- AvalancheEngine *_vm;
-
- void dPlot(int16 x, int16 y, Common::String z);
- void zl(int16 x1, int16 y1, int16 x2, int16 y2);
+ Audio::Mixer *_mixer;
+ Audio::SoundHandle _soundHandle;
+ int _vocOffset;
+public:
+ SoundManager(Audio::Mixer *mixer);
+
+ void playVOCMap(byte *voc, int vocSize);
+ void stopVOCPlay();
+ void abortVOCMap();
+ void setVOCOffset(int offset);
+ Common::String getVOCFileName(int idx);
+ void startVOCPlay(const Common::String &filename);
+ void startVOCPlay(int soundId);
+ int getVOCStatus();
+ uint32 getVOCFrame();
};
-} // End of namespace Avalanche.
+} // End of namespace Voyeur
-#endif // AVALANCHE_PINGO_H
+#endif /* VOYEUR_SOUND_H */
diff --git a/engines/voyeur/staticres.cpp b/engines/voyeur/staticres.cpp
new file mode 100644
index 0000000000..372da508f1
--- /dev/null
+++ b/engines/voyeur/staticres.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 "voyeur/staticres.h"
+
+namespace Voyeur {
+
+const int COMPUTER_DEFAULTS[] = {
+ 18, 1, 0, 1, 33, 0, 998, -1, 18, 2, 0, 1, 41, 0,
+ 998, -1, 18, 3, 0, 1, 47, 0, 998, -1, 18, 4, 0,
+ 1, 53, 0, 998, -1, 18, 5, 0, 1, 46, 0, 998, -1,
+ 18, 6, 0, 1, 50, 0, 998, -1, 18, 7, 0, 1, 40, 0,
+ 998, -1, 18, 8, 0, 1, 43, 0, 998, -1, 19, 1, 0,
+ 2, 28, 0, 998, -1
+};
+
+const int RESOLVE_TABLE[] = {
+ 0x2A00, 0x4A00, 0x1000, 0x4B00, 0x2C00, 0x4F00, 0x1400, 0x5000,
+ 0x1700, 0x5100, 0x1800, 0x5200, 0x3300, 0x5400, 0x3700, 0x5500,
+ 0x1A00, 0x1C00, 0x1E00, 0x1F00, 0x2100, 0x2200, 0x2400, 0x2700,
+ 0x2B00, 0x1100, 0x4C00, 0x1200, 0x4D00, 0x1300, 0x4E00, 0x2E00,
+ 0x1900, 0x3200, 0x3400, 0x3800, 0x2800, 0x3E00, 0x4100, 0x2900,
+ 0x4400, 0x4600, 0x5300, 0x3900, 0x7600, 0x7200, 0x7300, 0x7400,
+ 0x7500
+};
+
+const int LEVEL_H[] = {
+ 4, 7, 7, 8, 9, 10, 2, 2, 4, 8, 8, 9, 9, 10, 10, 11, 11
+};
+
+const int LEVEL_M[] = {
+ 0, 0, 30, 0, 30, 0, 0, 0, 30, 0, 30, 0, 45, 0, 30, 0, 30
+};
+
+const int BLIND_TABLE[] = {
+ 0, 1, 2, 3, 4, 5, 6, 7, 8, 0, 9, 10, 11, 1, 11, 5, 12,
+ 13, 16, 15, 16, 17, 18, 5, 6, 18, 17, 13, 13, 14, 14,
+ 5, 12, 6, 6, 13, 14, 13
+};
+
+const int COMPUTER_SCREEN_TABLE[] = {
+ 269, 128, 307, 163,
+ 269, 128, 307, 163,
+ 68, 79, 98, 102,
+ 68, 79, 98, 102,
+ 68, 79, 98, 102,
+ 68, 79, 98, 102,
+ 248, 138, 291, 163,
+ 83, 132, 143, 156,
+ 248, 138, 291, 163,
+ 83, 132, 143, 156,
+ 83, 132, 143, 156,
+ 248, 138, 291, 163,
+ 68, 79, 98, 102,
+ 68, 79, 98, 102
+};
+
+const char *const SZ_FILENAMES[] = {
+ "A2110100", nullptr, "A2300100", nullptr, "B1220100", nullptr, "C1220100", nullptr,
+ "C1290100", nullptr, "D1220100", nullptr, "D1270100", nullptr, "E1210100", nullptr,
+ "E1260100", nullptr, "E1280100", nullptr, "E1325100", nullptr, "F1200100", nullptr,
+ "G1250100", nullptr, "G1260100", nullptr, "H1200100", nullptr, "H1230100", nullptr,
+ "H1310100", nullptr, "I1300100", nullptr, "J1220100", nullptr, "J1230100", nullptr,
+ "J1320100", nullptr, "K1260100", nullptr, "K1280100", nullptr, "K1325100", nullptr,
+ "L1210100", nullptr, "L1280100", nullptr, "L1290100", nullptr, "L1300100", nullptr,
+ "L1310100", nullptr, "M1260100", nullptr, "M1310100", nullptr, "N1210100", nullptr,
+ "N1225100", nullptr, "N1275510", nullptr, "N1280510", nullptr, "N1325100", nullptr,
+ "O1230100", nullptr, "O1260100", nullptr, "O1260520", nullptr, "O1280100", nullptr,
+ "O1325540", nullptr, "P1276710", nullptr, "P1280540", nullptr, "P1280740", nullptr,
+ "P1290510", nullptr, "P1325100", nullptr, "P1325300", nullptr, "P1325520", nullptr,
+ "Q1230100", nullptr, "Q1240530", nullptr, "Q1240730", nullptr, "Q1260100", nullptr,
+ "Q1260520", nullptr, "Q1260720", nullptr, "Q1325100", nullptr, "R1280540", nullptr,
+ "Z1110510", nullptr, "Z1110520", nullptr, "Z1110530", nullptr, "Z1110540", nullptr,
+ "Z1110545", nullptr, "Z2320100", nullptr, "Z2905300", nullptr, "Z3110100", nullptr,
+ "Z3115510", nullptr, "Z3115520", nullptr, "Z3115530", nullptr, "Z3115540", nullptr,
+ "Z4915100", nullptr, "Z4915200", nullptr, "Z4915300",
+ nullptr, nullptr, nullptr, nullptr, nullptr,
+ "MMARG", "MZACK", "MREED", "MJESSI", "MCHLOE", "MCAMERA", "MENDCRED",
+ "NEWCALL2", "PHONE1", "PHONE2", "PHONE3", "PHONE6", "PHONE8",
+ "B1300100", "C1250100", "C1320100", "D1320100", "E1210200", "E1260200",
+ "E1280200", "E1310100", "G1230100", "G1300100", "I1210100", "I1270100",
+ "I1280100", "J1250100", "J1280100", "K1260200", "K1270100", "K1325200",
+ "L1240100", "M1200100", "M1230100", "M1290100", "N1250100", "N1260100",
+ "N1280100", "O1250510", "O1290510", "O1320510", "O1320710", "P1240100",
+ "P1240530", "P1260100", "P1270100", "P1280100", "P1280530", "P1320530",
+ "Q1240100", "E1325100"
+};
+
+const char *const SATURDAY = "Saturday";
+const char *const SUNDAY = "Sunday";
+const char *const MONDAY = "Monday Morning";
+const char *const AM = "am";
+const char *const PM = "pm";
+
+const char *const START_OF_MESSAGE = "*** Start of Message ***";
+const char *const END_OF_MESSAGE = "*** End of Message ***";
+
+const char *const EVENT_TYPE_STRINGS[4] = { "Video", "Audio", "Evidence", "Computer" };
+
+int DOT_LINE_START[9] = {
+ 0xE880, 0xE9C0, 0xEB00, 0xEC40, 0xED80, 0xEEC0, 0xF000, 0xF140, 0xF280
+};
+int DOT_LINE_OFFSET[9] = {
+ 144, 143, 142, 141, 141, 141, 142, 143, 144
+};
+int DOT_LINE_LENGTH[9] = {
+ 5, 7, 9, 11, 11, 11, 9, 7, 5
+};
+
+const char *const PIRACY_MESSAGE[] = {
+ "It is illegal to make",
+ "unauthorized copies of",
+ "this software. Duplication",
+ "of this software for any",
+ "reason including sale,",
+ "loan, rental, or gift is a",
+ "crime. Penalties include",
+ "fines of up to $50,000",
+ "and jail terms up to",
+ "5 years."
+};
+
+} // End of namespace Voyeur
diff --git a/engines/voyeur/staticres.h b/engines/voyeur/staticres.h
new file mode 100644
index 0000000000..ea3a8003ac
--- /dev/null
+++ b/engines/voyeur/staticres.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 VOYEUR_STATICRES_H
+#define VOYEUR_STATICRES_H
+
+#include "common/scummsys.h"
+
+namespace Voyeur {
+
+extern const int COMPUTER_DEFAULTS[];
+
+extern const int RESOLVE_TABLE[];
+
+extern const int LEVEL_H[];
+
+extern const int LEVEL_M[];
+
+extern const int BLIND_TABLE[];
+
+extern const int COMPUTER_SCREEN_TABLE[];
+
+extern const char *const SZ_FILENAMES[];
+
+extern const char *const SATURDAY;
+extern const char *const SUNDAY;
+extern const char *const MONDAY;
+extern const char *const AM;
+extern const char *const PM;
+
+extern const char *const START_OF_MESSAGE;
+extern const char *const END_OF_MESSAGE;
+
+extern const char *const EVENT_TYPE_STRINGS[4];
+
+extern int DOT_LINE_START[9];
+extern int DOT_LINE_OFFSET[9];
+extern int DOT_LINE_LENGTH[9];
+
+extern const char *const PIRACY_MESSAGE[];
+
+} // End of namespace Voyeur
+
+#endif
diff --git a/engines/voyeur/voyeur.cpp b/engines/voyeur/voyeur.cpp
new file mode 100644
index 0000000000..681f431635
--- /dev/null
+++ b/engines/voyeur/voyeur.cpp
@@ -0,0 +1,924 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public 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 "voyeur/voyeur.h"
+#include "voyeur/animation.h"
+#include "voyeur/graphics.h"
+#include "voyeur/staticres.h"
+#include "common/scummsys.h"
+#include "common/config-manager.h"
+#include "common/debug-channels.h"
+#include "graphics/palette.h"
+#include "graphics/scaler.h"
+#include "graphics/thumbnail.h"
+
+namespace Voyeur {
+
+VoyeurEngine *g_vm;
+
+VoyeurEngine::VoyeurEngine(OSystem *syst, const VoyeurGameDescription *gameDesc) : Engine(syst),
+ _gameDescription(gameDesc), _randomSource("Voyeur"),
+ _defaultFontInfo(3, 0xff, 0xff, 0, 0, ALIGN_LEFT, 0, Common::Point(), 1, 1,
+ Common::Point(1, 1), 1, 0, 0) {
+ _debugger = nullptr;
+ _eventsManager = nullptr;
+ _filesManager = nullptr;
+ _graphicsManager = nullptr;
+ _soundManager = nullptr;
+ _voy = nullptr;
+ _bVoy = NULL;
+
+ _iForceDeath = ConfMan.getInt("boot_param");
+ if (_iForceDeath < 1 || _iForceDeath > 4)
+ _iForceDeath = -1;
+
+ _controlPtr = NULL;
+ _stampFlags = 0;
+ _playStampGroupId = _currentVocId = 0;
+ _audioVideoId = -1;
+ _checkTransitionId = -1;
+ _gameHour = 0;
+ _gameMinute = 0;
+ _flashTimeVal = 0;
+ _flashTimeFlag = false;
+ _timeBarVal = -1;
+ _checkPhoneVal = 0;
+ _voyeurArea = AREA_NONE;
+ _loadGameSlot = -1;
+
+ DebugMan.addDebugChannel(kDebugScripts, "scripts", "Game scripts");
+
+ _debugger = new Debugger(this);
+ _eventsManager = new EventsManager(this);
+ _filesManager = new FilesManager(this);
+ _graphicsManager = new GraphicsManager(this);
+ _soundManager = new SoundManager(_mixer);
+ _voy = new SVoy(this);
+
+ _stampLibPtr = nullptr;
+ _controlGroupPtr = nullptr;
+ _stampData = nullptr;
+ _stackGroupPtr = nullptr;
+ _glGoState = -1;
+ _glGoStack = -1;
+ _resolvePtr = nullptr;
+ _mainThread = nullptr;
+
+ centerMansionView();
+}
+
+VoyeurEngine::~VoyeurEngine() {
+ delete _bVoy;
+ delete _voy;
+ delete _soundManager;
+ delete _graphicsManager;
+ delete _filesManager;
+ delete _eventsManager;
+ delete _debugger;
+}
+
+Common::Error VoyeurEngine::run() {
+ ESP_Init();
+ globalInitBolt();
+
+ if (doHeadTitle()) {
+ // The original allows the victim to be explicitly specified via the command line.
+ // This is possible in ScummVM by using a boot parameter.
+ if (_iForceDeath >= 1 && _iForceDeath <= 4)
+ _voy->_eventFlags |= EVTFLAG_VICTIM_PRESET;
+
+
+ playStamp();
+ if (!shouldQuit())
+ doTailTitle();
+ }
+
+ return Common::kNoError;
+}
+
+
+int VoyeurEngine::getRandomNumber(int maxNumber) {
+ return _randomSource.getRandomNumber(maxNumber);
+}
+
+void VoyeurEngine::ESP_Init() {
+ ThreadResource::init();
+
+ if (ConfMan.hasKey("save_slot"))
+ _loadGameSlot = ConfMan.getInt("save_slot");
+}
+
+void VoyeurEngine::globalInitBolt() {
+ initBolt();
+
+ _filesManager->openBoltLib("bvoy.blt", _bVoy);
+ _bVoy->getBoltGroup(0x000);
+ _bVoy->getBoltGroup(0x100);
+
+ _graphicsManager->_fontPtr = &_defaultFontInfo;
+ _graphicsManager->_fontPtr->_curFont = _bVoy->boltEntry(0x101)._fontResource;
+ assert(_graphicsManager->_fontPtr->_curFont);
+
+ // Setup default flags
+ _voy->_viewBounds = nullptr;
+
+ _eventsManager->addFadeInt();
+}
+
+void VoyeurEngine::initBolt() {
+ vInitInterrupts();
+ _graphicsManager->sInitGraphics();
+ _eventsManager->vInitColor();
+ initInput();
+}
+
+void VoyeurEngine::vInitInterrupts() {
+ _eventsManager->_intPtr._palette = &_graphicsManager->_VGAColors[0];
+}
+
+void VoyeurEngine::initInput() {
+}
+
+bool VoyeurEngine::doHeadTitle() {
+// char dest[144];
+
+ _eventsManager->startMainClockInt();
+
+ if (_loadGameSlot == -1) {
+ // Show starting screen
+ if (_bVoy->getBoltGroup(0x500)) {
+ showConversionScreen();
+ _bVoy->freeBoltGroup(0x500);
+
+ if (shouldQuit())
+ return false;
+ }
+
+ if (ConfMan.getBool("copy_protection")) {
+ // Display lock screen
+ bool result = doLock();
+ if (!result || shouldQuit())
+ return false;
+ }
+
+ // Show the title screen
+ _eventsManager->getMouseInfo();
+ showTitleScreen();
+ if (shouldQuit())
+ return false;
+
+ // Opening
+ _eventsManager->getMouseInfo();
+ doOpening();
+ if (shouldQuit())
+ return false;
+
+ _eventsManager->getMouseInfo();
+ doTransitionCard("Saturday Afternoon", "Player's Apartment");
+ _eventsManager->delayClick(90);
+
+ if (_voy->_eventFlags & EVTFLAG_VICTIM_PRESET) {
+ // Preset victim turned on, so add a default set of incriminating videos
+ _voy->addEvent(18, 1, EVTYPE_VIDEO, 33, 0, 998, -1);
+ _voy->addEvent(18, 2, EVTYPE_VIDEO, 41, 0, 998, -1);
+ _voy->addEvent(18, 3, EVTYPE_VIDEO, 47, 0, 998, -1);
+ _voy->addEvent(18, 4, EVTYPE_VIDEO, 53, 0, 998, -1);
+ _voy->addEvent(18, 5, EVTYPE_VIDEO, 46, 0, 998, -1);
+ _voy->addEvent(18, 6, EVTYPE_VIDEO, 50, 0, 998, -1);
+ _voy->addEvent(18, 7, EVTYPE_VIDEO, 40, 0, 998, -1);
+ _voy->addEvent(18, 8, EVTYPE_VIDEO, 43, 0, 998, -1);
+ _voy->addEvent(19, 1, EVTYPE_AUDIO, 20, 0, 998, -1);
+ }
+ }
+
+ _voy->_aptLoadMode = 140;
+ return true;
+}
+
+void VoyeurEngine::showConversionScreen() {
+ _graphicsManager->_backgroundPage = _bVoy->boltEntry(0x502)._picResource;
+ _graphicsManager->_vPort->setupViewPort();
+ flipPageAndWait();
+
+ // Immediate palette load to show the initial screen
+ CMapResource *cMap = _bVoy->getCMapResource(0x503);
+ assert(cMap);
+ cMap->_steps = 0;
+ cMap->startFade();
+
+ // Wait briefly
+ _eventsManager->delayClick(150);
+ if (shouldQuit())
+ return;
+
+ // Fade out the screen
+ cMap = _bVoy->getCMapResource(0x504);
+ cMap->_steps = 30;
+ cMap->startFade();
+ if (shouldQuit())
+ return;
+
+ flipPageAndWaitForFade();
+
+ _graphicsManager->screenReset();
+}
+
+bool VoyeurEngine::doLock() {
+ bool result = true;
+ int buttonVocSize, wrongVocSize;
+ byte *buttonVoc = _filesManager->fload("button.voc", &buttonVocSize);
+ byte *wrongVoc = _filesManager->fload("wrong.voc", &wrongVocSize);
+
+ if (_bVoy->getBoltGroup(0x700)) {
+ Common::String password = "3333";
+
+ _graphicsManager->_backgroundPage = _bVoy->getPictureResource(0x700);
+ _graphicsManager->_backColors = _bVoy->getCMapResource(0x701);
+ PictureResource *cursorPic = _bVoy->getPictureResource(0x702);
+ _voy->_viewBounds = _bVoy->boltEntry(0x704)._rectResource;
+ Common::Array<RectEntry> &hotspots = _bVoy->boltEntry(0x705)._rectResource->_entries;
+
+ assert(cursorPic);
+ _graphicsManager->_vPort->setupViewPort();
+
+ _graphicsManager->_backColors->startFade();
+ _graphicsManager->_vPort->_parent->_flags |= DISPFLAG_8;
+ _graphicsManager->flipPage();
+ _eventsManager->sWaitFlip();
+
+ while (!shouldQuit() && (_eventsManager->_fadeStatus & 1))
+ _eventsManager->delay(1);
+
+ _eventsManager->setCursorColor(127, 0);
+ _graphicsManager->setColor(1, 64, 64, 64);
+ _graphicsManager->setColor(2, 96, 96, 96);
+ _graphicsManager->setColor(3, 160, 160, 160);
+ _graphicsManager->setColor(4, 224, 224, 224);
+
+ // Set up the cursor
+ _eventsManager->setCursor(cursorPic);
+ _eventsManager->showCursor();
+
+ _eventsManager->_intPtr._hasPalette = true;
+
+ _graphicsManager->_fontPtr->_curFont = _bVoy->boltEntry(0x708)._fontResource;
+ _graphicsManager->_fontPtr->_fontSaveBack = 0;
+ _graphicsManager->_fontPtr->_fontFlags = DISPFLAG_NONE;
+
+ Common::String dateString = "ScummVM";
+ Common::String displayString = Common::String::format("Last Play %s", dateString.c_str());
+
+ bool firstLoop = true;
+ bool breakFlag = false;
+ while (!breakFlag && !shouldQuit()) {
+ _graphicsManager->_vPort->setupViewPort();
+ flipPageAndWait();
+
+ // Display the last play time
+ _graphicsManager->_fontPtr->_pos = Common::Point(0, 97);
+ _graphicsManager->_fontPtr->_justify = ALIGN_CENTER;
+ _graphicsManager->_fontPtr->_justifyWidth = 384;
+ _graphicsManager->_fontPtr->_justifyHeight = 97;
+
+ _graphicsManager->_vPort->drawText(displayString);
+ flipPageAndWait();
+
+ if (firstLoop) {
+ firstLoop = false;
+ displayString = "";
+ }
+
+ // Loop for getting key presses
+ int key;
+ do {
+ do {
+ // Scan through the list of key rects to check if a keypad key is highlighted
+ key = -1;
+ Common::Point mousePos = _eventsManager->getMousePos() + Common::Point(20, 10);
+
+ int keyCount = hotspots.size();
+ for (int keyIndex = 0; keyIndex < keyCount; ++keyIndex) {
+ if (hotspots[keyIndex].contains(mousePos)) {
+ key = keyIndex;
+ break;
+ }
+ }
+
+ _eventsManager->setCursorColor(127, (key == -1) ? 0 : 1);
+ _eventsManager->_intPtr._hasPalette = true;
+
+ _eventsManager->delay(1);
+ _eventsManager->getMouseInfo();
+ } while (!shouldQuit() && !_eventsManager->_mouseClicked);
+ _eventsManager->_mouseClicked = false;
+ } while (!shouldQuit() && key == -1);
+
+ _soundManager->abortVOCMap();
+ _soundManager->playVOCMap(buttonVoc, buttonVocSize);
+
+ while (_soundManager->getVOCStatus()) {
+ if (shouldQuit())
+ break;
+ _eventsManager->delay(1);
+ }
+
+ // Process the key
+ if (key < 10) {
+ // Numeric key
+ if (displayString.size() < 10) {
+ displayString += '0' + key;
+ continue;
+ }
+ } else if (key == 10) {
+ // Accept key
+ if ((password.empty() && displayString.empty()) || (password == displayString)) {
+ breakFlag = true;
+ result = true;
+ break;
+ }
+ } else if (key == 11) {
+ // New code
+ if ((password.empty() && displayString.empty()) || (password != displayString)) {
+ _graphicsManager->_vPort->setupViewPort();
+ password = displayString;
+ displayString = "";
+ continue;
+ }
+ } else if (key == 12) {
+ // Exit keyword
+ breakFlag = true;
+ result = false;
+ break;
+ } else {
+ continue;
+ }
+
+ _soundManager->playVOCMap(wrongVoc, wrongVocSize);
+ }
+
+ _graphicsManager->fillPic(_graphicsManager->_vPort, 0);
+ flipPageAndWait();
+ _graphicsManager->resetPalette();
+
+ _voy->_viewBounds = nullptr;
+ _bVoy->freeBoltGroup(0x700);
+ }
+
+ _eventsManager->hideCursor();
+
+ delete[] buttonVoc;
+ delete[] wrongVoc;
+
+ return result;
+}
+
+void VoyeurEngine::showTitleScreen() {
+ if (!_bVoy->getBoltGroup(0x500))
+ return;
+
+ _graphicsManager->_backgroundPage = _bVoy->getPictureResource(0x500);
+
+ _graphicsManager->_vPort->setupViewPort();
+ flipPageAndWait();
+
+ // Immediate palette load to show the initial screen
+ CMapResource *cMap = _bVoy->getCMapResource(0x501);
+ assert(cMap);
+ cMap->_steps = 60;
+ cMap->startFade();
+
+ // Wait briefly
+ _eventsManager->delayClick(200);
+ if (shouldQuit()) {
+ _bVoy->freeBoltGroup(0x500);
+ return;
+ }
+
+ // Fade out the screen
+ cMap = _bVoy->getCMapResource(0x504);
+ cMap->_steps = 30;
+ cMap->startFade();
+
+ flipPageAndWaitForFade();
+ if (shouldQuit()) {
+ _bVoy->freeBoltGroup(0x500);
+ return;
+ }
+
+ _graphicsManager->screenReset();
+ _eventsManager->delayClick(200);
+
+ // Voyeur title
+ playRL2Video("a1100100.rl2");
+ _graphicsManager->screenReset();
+
+ _bVoy->freeBoltGroup(0x500);
+}
+
+void VoyeurEngine::doOpening() {
+ _graphicsManager->screenReset();
+
+ if (!_bVoy->getBoltGroup(0x200))
+ return;
+
+ byte *frameTable = _bVoy->memberAddr(0x215);
+ byte *xyTable = _bVoy->memberAddr(0x216);
+// byte *whTable = _bVoy->memberAddr(0x217);
+ int frameIndex = 0;
+ bool creditShow = true;
+ PictureResource *textPic = nullptr;
+ Common::Point textPos;
+
+ _voy->_vocSecondsOffset = 0;
+ _voy->_RTVNum = 0;
+ _voy->_audioVisualStartTime = _voy->_RTVNum;
+ _voy->_eventFlags |= EVTFLAG_RECORDING;
+ _gameHour = 4;
+ _gameMinute = 0;
+ _audioVideoId = 1;
+ _eventsManager->_videoDead = -1;
+ _voy->addVideoEventStart();
+
+ _voy->_eventFlags &= ~EVTFLAG_TIME_DISABLED;
+
+ for (int i = 0; i < 256; ++i)
+ _graphicsManager->setColor(i, 8, 8, 8);
+
+ _eventsManager->_intPtr._hasPalette = true;
+ _graphicsManager->_vPort->setupViewPort();
+ flipPageAndWait();
+
+ RL2Decoder decoder;
+ decoder.loadRL2File("a2300100.rl2", false);
+ decoder.start();
+
+ while (!shouldQuit() && !decoder.endOfVideo() && !_eventsManager->_mouseClicked) {
+ if (decoder.hasDirtyPalette()) {
+ const byte *palette = decoder.getPalette();
+ _graphicsManager->setPalette(palette, 0, 256);
+ }
+
+ if (decoder.needsUpdate()) {
+ const Graphics::Surface *frame = decoder.decodeNextFrame();
+
+ Common::copy((const byte *)frame->getPixels(), (const byte *)frame->getPixels() + 320 * 200,
+ (byte *)_graphicsManager->_screenSurface.getPixels());
+
+ if (decoder.getCurFrame() >= (int32)READ_LE_UINT32(frameTable + frameIndex * 4)) {
+ if (creditShow) {
+ // Show a credit
+ textPic = _bVoy->boltEntry(frameIndex / 2 + 0x202)._picResource;
+ textPos = Common::Point(READ_LE_UINT16(xyTable + frameIndex * 2),
+ READ_LE_UINT16(xyTable + (frameIndex + 1) * 2));
+
+ creditShow = false;
+ } else {
+ textPic = nullptr;
+
+ creditShow = true;
+ }
+
+ ++frameIndex;
+ }
+
+ if (textPic) {
+ _graphicsManager->sDrawPic(textPic, _graphicsManager->_vPort, textPos);
+ }
+
+ flipPageAndWait();
+ }
+
+ _eventsManager->getMouseInfo();
+ g_system->delayMillis(10);
+ }
+
+ if ((_voy->_RTVNum - _voy->_audioVisualStartTime) < 2)
+ _eventsManager->delay(60);
+
+ _voy->_eventFlags |= EVTFLAG_TIME_DISABLED;
+ _voy->addVideoEventEnd();
+ _voy->_eventFlags &= ~EVTFLAG_RECORDING;
+
+ _bVoy->freeBoltGroup(0x200);
+}
+
+void VoyeurEngine::playRL2Video(const Common::String &filename) {
+ RL2Decoder decoder;
+ decoder.loadRL2File(filename, false);
+ decoder.start();
+
+ while (!shouldQuit() && !decoder.endOfVideo() && !_eventsManager->_mouseClicked) {
+ if (decoder.hasDirtyPalette()) {
+ const byte *palette = decoder.getPalette();
+ _graphicsManager->setPalette(palette, 0, 256);
+ }
+
+ if (decoder.needsUpdate()) {
+ const Graphics::Surface *frame = decoder.decodeNextFrame();
+
+ Common::copy((const byte *)frame->getPixels(), (const byte *)frame->getPixels() + 320 * 200,
+ (byte *)_graphicsManager->_screenSurface.getPixels());
+ }
+
+ _eventsManager->getMouseInfo();
+ g_system->delayMillis(10);
+ }
+}
+
+void VoyeurEngine::playAVideo(int videoId) {
+ playAVideoDuration(videoId, 9999);
+}
+
+void VoyeurEngine::playAVideoDuration(int videoId, int duration) {
+ int totalFrames = duration * 10;
+
+ if (videoId == -1)
+ return;
+
+ PictureResource *pic = NULL;
+ if (videoId == 42) {
+ _eventsManager->_videoDead = 0;
+ pic = _bVoy->boltEntry(0xE00 + _eventsManager->_videoDead)._picResource;
+ }
+
+ RL2Decoder decoder;
+ decoder.loadVideo(videoId);
+
+ decoder.seek(Audio::Timestamp(_voy->_vocSecondsOffset * 1000));
+ decoder.start();
+ int endFrame = decoder.getCurFrame() + totalFrames;
+
+ _eventsManager->getMouseInfo();
+ _eventsManager->startCursorBlink();
+
+ while (!shouldQuit() && !decoder.endOfVideo() && !_eventsManager->_mouseClicked &&
+ (decoder.getCurFrame() < endFrame)) {
+ if (decoder.needsUpdate()) {
+ const Graphics::Surface *frame = decoder.decodeNextFrame();
+
+ Common::copy((const byte *)frame->getPixels(), (const byte *)frame->getPixels() + 320 * 200,
+ (byte *)_graphicsManager->_screenSurface.getPixels());
+ if (_voy->_eventFlags & EVTFLAG_RECORDING)
+ _graphicsManager->drawDot();
+ }
+
+ if (decoder.hasDirtyPalette()) {
+ const byte *palette = decoder.getPalette();
+ _graphicsManager->setPalette(palette, 0, decoder.getPaletteCount());
+ _graphicsManager->setOneColor(128, 220, 20, 20);
+ }
+
+ _eventsManager->getMouseInfo();
+ g_system->delayMillis(10);
+ }
+
+ // RL2 finished
+ _graphicsManager->screenReset();
+ _voy->_eventFlags &= ~EVTFLAG_RECORDING;
+
+ if (_voy->_eventFlags & EVTFLAG_8) {
+ assert(pic);
+ byte *imgData = _graphicsManager->_vPort->_currentPic->_imgData;
+ _graphicsManager->_vPort->_currentPic->_imgData = pic->_imgData;
+ pic->_imgData = imgData;
+ _voy->_eventFlags &= ~EVTFLAG_8;
+ }
+}
+
+void VoyeurEngine::playAudio(int audioId) {
+ _bVoy->getBoltGroup(0x7F00);
+ _graphicsManager->_backgroundPage = _bVoy->boltEntry(0x7F00 +
+ BLIND_TABLE[audioId] * 2)._picResource;
+ _graphicsManager->_backColors = _bVoy->boltEntry(0x7F01 +
+ BLIND_TABLE[audioId] * 2)._cMapResource;
+
+ _graphicsManager->_vPort->setupViewPort();
+ _graphicsManager->_backColors->startFade();
+ flipPageAndWaitForFade();
+
+ _voy->_eventFlags &= ~EVTFLAG_TIME_DISABLED;
+ _soundManager->setVOCOffset(_voy->_vocSecondsOffset);
+ Common::String filename = _soundManager->getVOCFileName(
+ audioId + 159);
+ _soundManager->startVOCPlay(filename);
+ _voy->_eventFlags |= EVTFLAG_RECORDING;
+ _eventsManager->startCursorBlink();
+
+ while (!shouldQuit() && !_eventsManager->_mouseClicked &&
+ _soundManager->getVOCStatus())
+ _eventsManager->delayClick(1);
+
+ _voy->_eventFlags |= EVTFLAG_TIME_DISABLED;
+ _soundManager->stopVOCPlay();
+
+ _bVoy->freeBoltGroup(0x7F00);
+ _graphicsManager->_vPort->setupViewPort(NULL);
+
+ _voy->_eventFlags &= ~EVTFLAG_RECORDING;
+ _voy->_playStampMode = 129;
+}
+
+void VoyeurEngine::doTransitionCard(const Common::String &time, const Common::String &location) {
+ _graphicsManager->setColor(128, 16, 16, 16);
+ _graphicsManager->setColor(224, 220, 220, 220);
+ _eventsManager->_intPtr._hasPalette = true;
+
+ _graphicsManager->_vPort->setupViewPort(NULL);
+ _graphicsManager->_vPort->fillPic(0x80);
+ _graphicsManager->flipPage();
+ _eventsManager->sWaitFlip();
+
+ flipPageAndWait();
+ _graphicsManager->_vPort->fillPic(0x80);
+
+ FontInfoResource &fi = *_graphicsManager->_fontPtr;
+ fi._curFont = _bVoy->boltEntry(257)._fontResource;
+ fi._foreColor = 224;
+ fi._fontSaveBack = 0;
+ fi._pos = Common::Point(0, 116);
+ fi._justify = ALIGN_CENTER;
+ fi._justifyWidth = 384;
+ fi._justifyHeight = 120;
+
+ _graphicsManager->_vPort->drawText(time);
+
+ if (!location.empty()) {
+ fi._pos = Common::Point(0, 138);
+ fi._justify = ALIGN_CENTER;
+ fi._justifyWidth = 384;
+ fi._justifyHeight = 140;
+
+ _graphicsManager->_vPort->drawText(location);
+ }
+
+ flipPageAndWait();
+}
+
+void VoyeurEngine::saveLastInplay() {
+ // No implementation in ScummVM version
+}
+
+void VoyeurEngine::flipPageAndWait() {
+ _graphicsManager->_vPort->_flags |= DISPFLAG_8;
+ _graphicsManager->flipPage();
+ _eventsManager->sWaitFlip();
+}
+
+void VoyeurEngine::flipPageAndWaitForFade() {
+ flipPageAndWait();
+
+ while (!shouldQuit() && (_eventsManager->_fadeStatus & 1))
+ _eventsManager->delay(1);
+}
+
+void VoyeurEngine::showEndingNews() {
+ _playStampGroupId = (_voy->_incriminatedVictimNumber - 1) * 256 + 0x7700;
+ _voy->_boltGroupId2 = (_controlPtr->_state->_victimIndex - 1) * 256 + 0x7B00;
+
+ _bVoy->getBoltGroup(_playStampGroupId);
+ _bVoy->getBoltGroup(_voy->_boltGroupId2);
+
+ PictureResource *pic = _bVoy->boltEntry(_playStampGroupId)._picResource;
+ CMapResource *pal = _bVoy->boltEntry(_playStampGroupId + 1)._cMapResource;
+
+ _graphicsManager->_vPort->setupViewPort(pic);
+ pal->startFade();
+ flipPageAndWaitForFade();
+
+ _eventsManager->getMouseInfo();
+
+ for (int idx = 1; idx < 4; ++idx) {
+ if (idx == 3) {
+ pic = _bVoy->boltEntry(_voy->_boltGroupId2)._picResource;
+ pal = _bVoy->boltEntry(_voy->_boltGroupId2 + 1)._cMapResource;
+ } else {
+ pic = _bVoy->boltEntry(_playStampGroupId + idx * 2)._picResource;
+ pal = _bVoy->boltEntry(_playStampGroupId + idx * 2 + 1)._cMapResource;
+ }
+
+ _graphicsManager->_vPort->setupViewPort(pic);
+ pal->startFade();
+ flipPageAndWaitForFade();
+
+ _bVoy->freeBoltMember(_playStampGroupId + (idx - 1) * 2);
+ _bVoy->freeBoltMember(_playStampGroupId + (idx - 1) * 2 + 1);
+
+ Common::String fname = Common::String::format("news%d.voc", idx);
+ _soundManager->startVOCPlay(fname);
+
+ _eventsManager->getMouseInfo();
+ while (!shouldQuit() && !_eventsManager->_mouseClicked &&
+ _soundManager->getVOCStatus()) {
+ _eventsManager->delay(1);
+ _eventsManager->getMouseInfo();
+ }
+
+ _soundManager->stopVOCPlay();
+ if (idx == 3)
+ _eventsManager->delay(3);
+
+ if (shouldQuit() || _eventsManager->_mouseClicked)
+ break;
+ }
+
+ _bVoy->freeBoltGroup(_playStampGroupId);
+ _bVoy->freeBoltGroup(_voy->_boltGroupId2);
+ _playStampGroupId = -1;
+ _voy->_boltGroupId2 = -1;
+}
+
+/*------------------------------------------------------------------------*/
+
+Common::String VoyeurEngine::generateSaveName(int slot) {
+ return Common::String::format("%s.%03d", _targetName.c_str(), slot);
+}
+
+/**
+ * Returns true if it is currently okay to restore a game
+ */
+bool VoyeurEngine::canLoadGameStateCurrently() {
+ return _voyeurArea == AREA_APARTMENT;
+}
+
+/**
+ * Returns true if it is currently okay to save the game
+ */
+bool VoyeurEngine::canSaveGameStateCurrently() {
+ return _voyeurArea == AREA_APARTMENT;
+}
+
+/**
+ * Load the savegame at the specified slot index
+ */
+Common::Error VoyeurEngine::loadGameState(int slot) {
+ _loadGameSlot = slot;
+ return Common::kNoError;
+}
+
+void VoyeurEngine::loadGame(int slot) {
+ // Open up the save file
+ Common::InSaveFile *saveFile = g_system->getSavefileManager()->openForLoading(generateSaveName(slot));
+ if (!saveFile)
+ return;
+
+ Common::Serializer serializer(saveFile, NULL);
+
+ // Store the current time index before the game is loaded
+ _checkTransitionId = _voy->_transitionId;
+
+ // Stop any playing sound
+ _soundManager->stopVOCPlay();
+
+ // Read in the savegame header
+ VoyeurSavegameHeader header;
+ if (!header.read(saveFile))
+ return;
+ if (header._thumbnail)
+ header._thumbnail->free();
+ delete header._thumbnail;
+
+ synchronize(serializer);
+
+ delete saveFile;
+
+ // Show a transition card if the time index has changed
+ checkTransition();
+
+ // Load the apartment
+ _mainThread->loadTheApt();
+}
+
+/**
+ * Save the game to the given slot index, and with the given name
+ */
+Common::Error VoyeurEngine::saveGameState(int slot, const Common::String &desc) {
+ // Open the save file for writing
+ Common::OutSaveFile *saveFile = g_system->getSavefileManager()->openForSaving(generateSaveName(slot));
+ if (!saveFile)
+ return Common::kCreatingFileFailed;
+
+ // Write out the header
+ VoyeurSavegameHeader header;
+ header.write(saveFile, this, desc);
+
+ // Set up a serializer
+ Common::Serializer serializer(NULL, saveFile);
+
+ // Synchronise the data
+ synchronize(serializer);
+
+ saveFile->finalize();
+ delete saveFile;
+
+ return Common::kNoError;
+}
+
+void VoyeurEngine::synchronize(Common::Serializer &s) {
+ s.syncAsSint16LE(_glGoState);
+ s.syncAsSint16LE(_glGoStack);
+ s.syncAsSint16LE(_stampFlags);
+ s.syncAsSint16LE(_playStampGroupId);
+ s.syncAsSint16LE(_currentVocId);
+ s.syncAsSint16LE(_audioVideoId);
+
+ s.syncAsSint16LE(_iForceDeath);
+ s.syncAsSint16LE(_gameHour);
+ s.syncAsSint16LE(_gameMinute);
+ s.syncAsSint16LE(_flashTimeVal);
+ s.syncAsSint16LE(_flashTimeFlag);
+ s.syncAsSint16LE(_timeBarVal);
+ s.syncAsSint16LE(_checkPhoneVal);
+
+ // Sub-systems
+ _voy->synchronize(s);
+ _graphicsManager->synchronize(s);
+ _mainThread->synchronize(s);
+ _controlPtr->_state->synchronize(s);
+}
+
+/*------------------------------------------------------------------------*/
+
+bool VoyeurSavegameHeader::read(Common::InSaveFile *f) {
+ _thumbnail = NULL;
+
+ uint32 signature = f->readUint32BE();
+ if (signature != MKTAG('V', 'O', 'Y', 'R')) {
+ warning("Invalid savegame");
+ return false;
+ }
+
+ _version = f->readByte();
+ if (_version > VOYEUR_SAVEGAME_VERSION)
+ return false;
+
+ char c;
+ _saveName = "";
+ while ((c = f->readByte()) != 0)
+ _saveName += c;
+
+ // Get the thumbnail
+ _thumbnail = Graphics::loadThumbnail(*f);
+ if (!_thumbnail)
+ return false;
+
+ // Read in the save datet/ime
+ _saveYear = f->readSint16LE();
+ _saveMonth = f->readSint16LE();
+ _saveDay = f->readSint16LE();
+ _saveHour = f->readSint16LE();
+ _saveMinutes = f->readSint16LE();
+ _totalFrames = f->readUint32LE();
+
+ return true;
+}
+
+void VoyeurSavegameHeader::write(Common::OutSaveFile *f, VoyeurEngine *vm, const Common::String &saveName) {
+ // Write ident string
+ f->writeUint32BE(MKTAG('V', 'O', 'Y', 'R'));
+
+ // Write out savegame version
+ f->writeByte(VOYEUR_SAVEGAME_VERSION);
+
+ // Write out savegame name
+ f->write(saveName.c_str(), saveName.size());
+ f->writeByte(0);
+
+ // Create a thumbnail and save it
+ Graphics::Surface *thumb = new Graphics::Surface();
+ ::createThumbnail(thumb, (byte *)vm->_graphicsManager->_screenSurface.getPixels(),
+ SCREEN_WIDTH, SCREEN_HEIGHT, vm->_graphicsManager->_VGAColors);
+ Graphics::saveThumbnail(*f, *thumb);
+ thumb->free();
+ delete thumb;
+
+ // Write the save datet/ime
+ TimeDate td;
+ g_system->getTimeAndDate(td);
+ f->writeSint16LE(td.tm_year + 1900);
+ f->writeSint16LE(td.tm_mon + 1);
+ f->writeSint16LE(td.tm_mday);
+ f->writeSint16LE(td.tm_hour);
+ f->writeSint16LE(td.tm_min);
+ f->writeUint32LE(vm->_eventsManager->getGameCounter());
+}
+
+} // End of namespace Voyeur
diff --git a/engines/voyeur/voyeur.h b/engines/voyeur/voyeur.h
new file mode 100644
index 0000000000..e0bb734fa8
--- /dev/null
+++ b/engines/voyeur/voyeur.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.
+ *
+ */
+
+#ifndef VOYEUR_VOYEUR_H
+#define VOYEUR_VOYEUR_H
+
+#include "voyeur/debugger.h"
+#include "voyeur/data.h"
+#include "voyeur/events.h"
+#include "voyeur/files.h"
+#include "voyeur/graphics.h"
+#include "voyeur/sound.h"
+#include "common/scummsys.h"
+#include "common/system.h"
+#include "common/error.h"
+#include "common/random.h"
+#include "common/savefile.h"
+#include "common/serializer.h"
+#include "common/util.h"
+#include "engines/engine.h"
+#include "graphics/surface.h"
+
+/**
+ * This is the namespace of the Voyeur engine.
+ *
+ * Status of this engine: Complete
+ *
+ * Games using this engine:
+ * - Voyeur (Dos)
+ */
+namespace Voyeur {
+
+#define DEBUG_BASIC 1
+#define DEBUG_INTERMEDIATE 2
+#define DEBUG_DETAILED 3
+
+// Constants used for doInterface display of the mansion
+#define MANSION_MAX_X 784
+#define MANSION_MAX_Y 150
+#define MANSION_VIEW_X 40
+#define MANSION_VIEW_Y 27
+#define MANSION_VIEW_WIDTH 240
+#define MANSION_VIEW_HEIGHT 148
+#define MANSION_SCROLL_AREA_X 20
+#define MANSION_SCROLL_AREA_Y 20
+#define MANSION_SCROLL_INC_X 4
+#define MANSION_SCROLL_INC_Y 4
+
+enum VoyeurDebugChannels {
+ kDebugScripts = 1 << 0
+};
+
+enum VoyeurArea { AREA_NONE, AREA_APARTMENT, AREA_INTERFACE, AREA_ROOM, AREA_EVIDENCE };
+
+struct VoyeurGameDescription;
+
+class VoyeurEngine : public Engine {
+private:
+ const VoyeurGameDescription *_gameDescription;
+ Common::RandomSource _randomSource;
+ FontInfoResource _defaultFontInfo;
+
+ void ESP_Init();
+ void globalInitBolt();
+ void initBolt();
+ void vInitInterrupts();
+ void initInput();
+
+ bool doHeadTitle();
+ void showConversionScreen();
+ bool doLock();
+ void showTitleScreen();
+ void doOpening();
+
+ void playStamp();
+ void initStamp();
+ void closeStamp();
+
+ /**
+ * Shows the game ending title animation
+ */
+ void doTailTitle();
+
+ /**
+ * Shows the game ending credits
+ */
+ void doClosingCredits();
+
+ /**
+ * Shows the final anti-piracy message before exiting the game
+ */
+ void doPiracy();
+
+ /**
+ * Review previous tape recordings on the TV
+ */
+ void reviewTape();
+
+ /**
+ * Shows the TV gossip animation
+ */
+ void doGossip();
+
+ /**
+ * Shows the animation of the VCR tape during the 'Call the Police' sequence
+ */
+ void doTapePlaying();
+
+ /**
+ * Does a check as to whether a murder has been witnessed
+ */
+ bool checkForMurder();
+
+ /**
+ * Does a check for whether incriminating evidence has been revealed
+ */
+ bool checkForIncriminate();
+
+ /**
+ * Plays a video event previously witnessed
+ */
+ void playAVideoEvent(int eventIndex);
+
+ /**
+ * Shows the user a screen to select one of four characters to send the
+ * video tape to
+ */
+ int getChooseButton();
+
+ /**
+ * Synchronizes the game data
+ */
+ void synchronize(Common::Serializer &s);
+
+ /**
+ * Resets the mansion view position
+ */
+ void centerMansionView();
+protected:
+ // Engine APIs
+ virtual Common::Error run();
+ virtual bool hasFeature(EngineFeature f) const;
+public:
+ BoltFile *_bVoy;
+ Debugger *_debugger;
+ EventsManager *_eventsManager;
+ FilesManager *_filesManager;
+ GraphicsManager *_graphicsManager;
+ SoundManager *_soundManager;
+ SVoy *_voy;
+
+ BoltFile *_stampLibPtr;
+ BoltGroup *_controlGroupPtr;
+ ControlResource *_controlPtr;
+ byte *_stampData;
+ BoltGroup *_stackGroupPtr;
+ int _glGoState;
+ int _glGoStack;
+ int _stampFlags;
+ int _playStampGroupId;
+ int _currentVocId;
+
+ int _audioVideoId;
+ const int *_resolvePtr;
+ int _iForceDeath;
+ int _checkTransitionId;
+ int _gameHour;
+ int _gameMinute;
+ int _flashTimeVal;
+ bool _flashTimeFlag;
+ int _timeBarVal;
+ int _checkPhoneVal;
+ Common::Point _mansionViewPos;
+ ThreadResource *_mainThread;
+ VoyeurArea _voyeurArea;
+ int _loadGameSlot;
+public:
+ VoyeurEngine(OSystem *syst, const VoyeurGameDescription *gameDesc);
+ virtual ~VoyeurEngine();
+ void GUIError(const Common::String &msg);
+
+ uint32 getFeatures() const;
+ Common::Language getLanguage() const;
+ Common::Platform getPlatform() const;
+ uint16 getVersion() const;
+ bool getIsDemo() const;
+
+ int getRandomNumber(int maxNumber);
+ Common::String generateSaveName(int slotNumber);
+ virtual bool canLoadGameStateCurrently();
+ virtual bool canSaveGameStateCurrently();
+ virtual Common::Error loadGameState(int slot);
+ virtual Common::Error saveGameState(int slot, const Common::String &desc);
+ void loadGame(int slot);
+
+ void playRL2Video(const Common::String &filename);
+ void doTransitionCard(const Common::String &time, const Common::String &location);
+
+ /**
+ * Play a given video
+ */
+ void playAVideo(int videoId);
+
+ /**
+ * Play a given video for a given amount of time. This is particularly used
+ * for later tape playback, where it will only play back as much of the video
+ * as the user originally watched (since they can break out of watching a video).
+ */
+ void playAVideoDuration(int videoId, int duration);
+
+ /**
+ * Play an audio sequence
+ */
+ void playAudio(int audioId);
+
+ /**
+ * Saves the last time the game was played
+ */
+ void saveLastInplay();
+ void makeViewFinder();
+ void makeViewFinderP();
+ void initIFace();
+ void checkTransition();
+ int doComputerText(int maxLen);
+ void getComputerBrush();
+
+ /**
+ * Displays the time/charge remaining on the video camera screen
+ */
+ void doTimeBar();
+
+ /**
+ * If necessary, flashes the time remaining bar on the video camera screen
+ */
+ void flashTimeBar();
+
+ /**
+ * Handle scrolling of the mansion view in the camera sights
+ */
+ void doScroll(const Common::Point &pt);
+
+ /**
+ * Check for phone call
+ */
+ void checkPhoneCall();
+
+ /**
+ * Display evidence sequence from within a room
+ * Suspension of disbelief needed to believe that recording from a distance,
+ * you could still flip through the often pages of evidence for a single hotspot.
+ */
+ void doEvidDisplay(int evidId, int eventId);
+
+ /**
+ * Flips the active page and waits until it's drawn
+ */
+ void flipPageAndWait();
+
+ /**
+ * Flips the active page and waits until it's drawn and faded in
+ */
+ void flipPageAndWaitForFade();
+
+ /**
+ * Returns the string for the current in-game day of the week
+ */
+ Common::String getDayName();
+
+ /**
+ * Returns the string for the current in-game time of day
+ */
+ Common::String getTimeOfDay();
+
+ /**
+ * Show the ending sequence of the arrest
+ */
+ void showEndingNews();
+};
+
+#define VOYEUR_SAVEGAME_VERSION 1
+
+/**
+ * Header for Voyeur savegame files
+ */
+struct VoyeurSavegameHeader {
+ uint8 _version;
+ Common::String _saveName;
+ Graphics::Surface *_thumbnail;
+ int _saveYear, _saveMonth, _saveDay;
+ int _saveHour, _saveMinutes;
+ int _totalFrames;
+
+ /**
+ * Read in the header from the specified file
+ */
+ bool read(Common::InSaveFile *f);
+
+ /**
+ * Write out header information to the specified file
+ */
+ void write(Common::OutSaveFile *f, VoyeurEngine *vm, const Common::String &saveName);
+};
+
+} // End of namespace Voyeur
+
+#endif /* VOYEUR_VOYEUR_H */
diff --git a/engines/voyeur/voyeur_game.cpp b/engines/voyeur/voyeur_game.cpp
new file mode 100644
index 0000000000..c7df924f7e
--- /dev/null
+++ b/engines/voyeur/voyeur_game.cpp
@@ -0,0 +1,1427 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public 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 "voyeur/voyeur.h"
+#include "voyeur/staticres.h"
+#include "voyeur/animation.h"
+
+namespace Voyeur {
+
+void VoyeurEngine::playStamp() {
+ _stampLibPtr = NULL;
+ _filesManager->openBoltLib("stampblt.blt", _stampLibPtr);
+
+ _stampLibPtr->getBoltGroup(0);
+ _controlPtr->_state = _stampLibPtr->boltEntry(_controlPtr->_stateId >> 16)._stateResource;
+ assert(_controlPtr->_state);
+
+ _resolvePtr = &RESOLVE_TABLE[0];
+ initStamp();
+
+ PtrResource *threadsList = _stampLibPtr->boltEntry(3)._ptrResource;
+ _mainThread = threadsList->_entries[0]->_threadResource;
+ _mainThread->initThreadStruct(0, 0);
+
+ _voy->_isAM = false;
+ _gameHour = 9;
+ _gameMinute = 0;
+ _voy->_abortInterface = true;
+
+ int buttonId;
+ bool breakFlag = false;
+ while (!breakFlag && !shouldQuit()) {
+ _voyeurArea = AREA_NONE;
+ _eventsManager->getMouseInfo();
+ _playStampGroupId = _currentVocId = -1;
+ _audioVideoId = -1;
+
+ _mainThread->parsePlayCommands();
+
+ bool flag = breakFlag = (_voy->_eventFlags & EVTFLAG_2) != 0;
+
+ switch (_voy->_playStampMode) {
+ case 5:
+ buttonId = _mainThread->doInterface();
+
+ if (buttonId == -2) {
+ switch (_mainThread->doApt()) {
+ case 0:
+ _voy->_aptLoadMode = 140;
+ break;
+ case 1:
+ _voy->_eventFlags &= ~EVTFLAG_TIME_DISABLED;
+ _voy->_abortInterface = true;
+ _mainThread->chooseSTAMPButton(22);
+ _voy->_aptLoadMode = 143;
+ break;
+ case 2:
+ _voy->_eventFlags &= ~EVTFLAG_TIME_DISABLED;
+ reviewTape();
+ _voy->_abortInterface = true;
+ _voy->_aptLoadMode = 142;
+ break;
+ case 3:
+ _voy->_eventFlags &= ~EVTFLAG_TIME_DISABLED;
+ _mainThread->chooseSTAMPButton(21);
+ break;
+ case 4:
+ breakFlag = true;
+ break;
+ case 5:
+ doGossip();
+ _voy->_abortInterface = true;
+ _voy->_aptLoadMode = 141;
+ _voy->_eventFlags &= ~EVTFLAG_100;
+ break;
+ default:
+ break;
+ }
+ } else {
+ _mainThread->chooseSTAMPButton(buttonId);
+ }
+
+ flag = true;
+ break;
+
+ case 6:
+ _mainThread->doRoom();
+ flag = true;
+ break;
+
+ case 16:
+ _voy->_transitionId = 17;
+ buttonId = _mainThread->doApt();
+
+ switch (buttonId) {
+ case 1:
+ _mainThread->chooseSTAMPButton(22);
+ flag = true;
+ break;
+ case 2:
+ reviewTape();
+ _voy->_abortInterface = true;
+ break;
+ case 4:
+ flag = true;
+ breakFlag = true;
+ break;
+ default:
+ break;
+ }
+ break;
+
+ case 17:
+ // Called the police, showing the tape
+ doTapePlaying();
+ if (!checkForMurder() && _voy->_transitionId <= 15)
+ checkForIncriminate();
+
+ if (_voy->_videoEventId != -1) {
+ // Show the found video that is of interest to the police
+ playAVideoEvent(_voy->_videoEventId);
+ _voy->_eventFlags &= ~EVTFLAG_RECORDING;
+ }
+
+ // Handle response
+ _mainThread->chooseSTAMPButton(0);
+ flag = true;
+ break;
+
+ case 130: {
+ // user selected to send the tape
+ if (_bVoy->getBoltGroup(_playStampGroupId)) {
+ _graphicsManager->_backgroundPage = _bVoy->boltEntry(_playStampGroupId)._picResource;
+ _graphicsManager->_backColors = _bVoy->boltEntry(_playStampGroupId + 1)._cMapResource;
+
+ buttonId = getChooseButton();
+ if (_eventsManager->_rightClick)
+ // Aborted out of selecting a recipient
+ buttonId = 4;
+
+ _bVoy->freeBoltGroup(_playStampGroupId);
+ _graphicsManager->screenReset();
+ _playStampGroupId = -1;
+ flag = true;
+
+ if (buttonId != 4) {
+ _voy->_playStampMode = 131;
+ _voy->checkForKey();
+ _mainThread->chooseSTAMPButton(buttonId);
+ } else {
+ _mainThread->chooseSTAMPButton(buttonId);
+ _voy->_abortInterface = true;
+ }
+ }
+ break;
+ }
+
+ default:
+ break;
+ }
+
+ do {
+ if (flag) {
+ if (_currentVocId != -1) {
+ _soundManager->stopVOCPlay();
+ _currentVocId = -1;
+ }
+
+ _audioVideoId = -1;
+
+ if (_voy->_boltGroupId2 != -1) {
+ _bVoy->freeBoltGroup(_voy->_boltGroupId2);
+ _voy->_boltGroupId2 = -1;
+ }
+
+ if (_playStampGroupId != -1) {
+ _bVoy->freeBoltGroup(_playStampGroupId);
+ _playStampGroupId = -1;
+ }
+
+ // Break out of loop
+ flag = false;
+
+ } else if (_mainThread->_stateFlags & 2) {
+ _eventsManager->getMouseInfo();
+ _mainThread->chooseSTAMPButton(0);
+ flag = true;
+ } else {
+ _mainThread->chooseSTAMPButton(0);
+ flag = true;
+ }
+ } while (flag);
+ }
+
+ _voy->_viewBounds = nullptr;
+ closeStamp();
+ _stampLibPtr->freeBoltGroup(0);
+ delete _stampLibPtr;
+}
+
+void VoyeurEngine::initStamp() {
+ _stampFlags &= ~1;
+ _stackGroupPtr = _controlGroupPtr;
+
+ if (!_controlPtr->_entries[0])
+ error("No control entries");
+
+ ThreadResource::initUseCount();
+}
+
+void VoyeurEngine::closeStamp() {
+ ThreadResource::unloadAllStacks(this);
+}
+
+void VoyeurEngine::doTailTitle() {
+ _graphicsManager->_vPort->setupViewPort(NULL);
+ _graphicsManager->screenReset();
+
+ if (_bVoy->getBoltGroup(0x600)) {
+ RL2Decoder decoder;
+ decoder.loadRL2File("a1100200.rl2", false);
+ decoder.start();
+ decoder.play(this);
+
+ if (!shouldQuit() && !_eventsManager->_mouseClicked) {
+ doClosingCredits();
+
+ if (!shouldQuit() && !_eventsManager->_mouseClicked) {
+ _graphicsManager->screenReset();
+
+ PictureResource *pic = _bVoy->boltEntry(0x602)._picResource;
+ CMapResource *pal = _bVoy->boltEntry(0x603)._cMapResource;
+
+ _graphicsManager->_vPort->setupViewPort(pic);
+ pal->startFade();
+ flipPageAndWaitForFade();
+ _eventsManager->delayClick(300);
+
+ pic = _bVoy->boltEntry(0x604)._picResource;
+ pal = _bVoy->boltEntry(0x605)._cMapResource;
+
+ _graphicsManager->_vPort->setupViewPort(pic);
+ pal->startFade();
+ flipPageAndWaitForFade();
+ _eventsManager->delayClick(120);
+
+ _soundManager->stopVOCPlay();
+ }
+ }
+
+ _bVoy->freeBoltGroup(0x600);
+ }
+
+ if (!shouldQuit()) {
+ _bVoy->getBoltGroup(0x100);
+ doPiracy();
+ }
+}
+
+void VoyeurEngine::doClosingCredits() {
+ if (!_bVoy->getBoltGroup(0x400))
+ return;
+
+ const char *msg = (const char *)_bVoy->memberAddr(0x404);
+ const byte *creditList = (const byte *)_bVoy->memberAddr(0x405);
+
+ _graphicsManager->_vPort->setupViewPort(NULL);
+ _graphicsManager->setColor(1, 180, 180, 180);
+ _graphicsManager->setColor(2, 200, 200, 200);
+ _eventsManager->_intPtr._hasPalette = true;
+
+ _graphicsManager->_fontPtr->_curFont = _bVoy->boltEntry(0x402)._fontResource;
+ _graphicsManager->_fontPtr->_foreColor = 2;
+ _graphicsManager->_fontPtr->_backColor = 2;
+ _graphicsManager->_fontPtr->_fontSaveBack = false;
+ _graphicsManager->_fontPtr->_fontFlags = DISPFLAG_NONE;
+
+ _soundManager->startVOCPlay(152);
+ FontInfoResource &fi = *_graphicsManager->_fontPtr;
+
+ for (int idx = 0; idx < 78; ++idx) {
+ const byte *entry = creditList + idx * 6;
+ int flags = READ_LE_UINT16(entry + 4);
+
+ if (flags & 0x10)
+ _graphicsManager->_vPort->fillPic(0);
+
+ if (flags & 1) {
+ fi._foreColor = 1;
+ fi._curFont = _bVoy->boltEntry(0x402)._fontResource;
+ fi._justify = ALIGN_CENTER;
+ fi._justifyWidth = 384;
+ fi._justifyHeight = 240;
+ fi._pos = Common::Point(0, READ_LE_UINT16(entry));
+
+ _graphicsManager->_vPort->drawText(msg);
+ msg += strlen(msg) + 1;
+ }
+
+ if (flags & 0x40) {
+ fi._foreColor = 2;
+ fi._curFont = _bVoy->boltEntry(0x400)._fontResource;
+ fi._justify = ALIGN_CENTER;
+ fi._justifyWidth = 384;
+ fi._justifyHeight = 240;
+ fi._pos = Common::Point(0, READ_LE_UINT16(entry));
+
+ _graphicsManager->_vPort->drawText(msg);
+ msg += strlen(msg) + 1;
+ }
+
+ if (flags & 2) {
+ fi._foreColor = 1;
+ fi._curFont = _bVoy->boltEntry(0x400)._fontResource;
+ fi._justify = ALIGN_LEFT;
+ fi._justifyWidth = 384;
+ fi._justifyHeight = 240;
+ fi._pos = Common::Point(38, READ_LE_UINT16(entry));
+
+ _graphicsManager->_vPort->drawText(msg);
+ msg += strlen(msg) + 1;
+
+ fi._foreColor = 2;
+ fi._justify = ALIGN_LEFT;
+ fi._justifyWidth = 384;
+ fi._justifyHeight = 240;
+ fi._pos = Common::Point(198, READ_LE_UINT16(entry));
+
+ _graphicsManager->_vPort->drawText(msg);
+ msg += strlen(msg) + 1;
+ }
+
+ if (flags & 4) {
+ fi._foreColor = 1;
+ fi._curFont = _bVoy->boltEntry(0x402)._fontResource;
+ fi._justify = ALIGN_CENTER;
+ fi._justifyWidth = 384;
+ fi._justifyHeight = 240;
+ fi._pos = Common::Point(0, READ_LE_UINT16(entry));
+
+ _graphicsManager->_vPort->drawText(msg);
+ msg += strlen(msg) + 1;
+
+ fi._foreColor = 2;
+ fi._curFont = _bVoy->boltEntry(0x400)._fontResource;
+ fi._justify = ALIGN_CENTER;
+ fi._justifyWidth = 384;
+ fi._justifyHeight = 240;
+ fi._pos = Common::Point(0, READ_LE_UINT16(entry) + 13);
+
+ _graphicsManager->_vPort->drawText(msg);
+ msg += strlen(msg) + 1;
+ }
+
+ if (flags & 0x20) {
+ flipPageAndWait();
+ _eventsManager->delayClick(READ_LE_UINT16(entry + 2) * 60);
+ }
+
+ if (shouldQuit() || _eventsManager->_mouseClicked)
+ break;
+ }
+
+ _soundManager->stopVOCPlay();
+ _graphicsManager->_fontPtr->_curFont = _bVoy->boltEntry(0x101)._fontResource;
+ _bVoy->freeBoltGroup(0x400);
+}
+
+void VoyeurEngine::doPiracy() {
+ _graphicsManager->screenReset();
+ _graphicsManager->setColor(1, 0, 0, 0);
+ _graphicsManager->setColor(2, 255, 255, 255);
+ _eventsManager->_intPtr._hasPalette = true;
+ _graphicsManager->_vPort->setupViewPort(NULL);
+ _graphicsManager->_vPort->fillPic(1);
+
+ FontInfoResource &fi = *_graphicsManager->_fontPtr;
+ fi._curFont = _bVoy->boltEntry(0x101)._fontResource;
+ fi._foreColor = 2;
+ fi._backColor = 2;
+ fi._fontSaveBack = false;
+ fi._fontFlags = DISPFLAG_NONE;
+ fi._justify = ALIGN_CENTER;
+ fi._justifyWidth = 384;
+ fi._justifyHeight = 230;
+
+ // Loop through the piracy message array to draw each line
+ int yp, idx;
+ for (idx = 0, yp = 33; idx < 10; ++idx) {
+ fi._pos = Common::Point(0, yp);
+ _graphicsManager->_vPort->drawText(PIRACY_MESSAGE[idx]);
+
+ yp += fi._curFont->_fontHeight + 4;
+ }
+
+ flipPageAndWait();
+ _eventsManager->getMouseInfo();
+ _eventsManager->delayClick(720);
+}
+
+void VoyeurEngine::reviewTape() {
+ int eventStart = 0;
+ int newX = -1;
+ int newY = -1;
+ int eventLine = 7;
+ Common::Rect tempRect(58, 30, 58 + 223, 30 + 124);
+ Common::Point pt;
+ int foundIndex;
+
+ _bVoy->getBoltGroup(0x900);
+ PictureResource *cursor = _bVoy->boltEntry(0x903)._picResource;
+
+ if ((_voy->_eventCount - 8) != 0)
+ eventStart = MAX(_voy->_eventCount - 8, 0);
+
+ if ((eventStart + _voy->_eventCount) <= 7)
+ eventLine = eventStart + _voy->_eventCount - 1;
+
+ bool breakFlag = false;
+ while (!shouldQuit() && !breakFlag) {
+ _voy->_viewBounds = _bVoy->boltEntry(0x907)._rectResource;
+ Common::Array<RectEntry> &hotspots = _bVoy->boltEntry(0x906)._rectResource->_entries;
+
+ _graphicsManager->_backColors = _bVoy->boltEntry(0x902)._cMapResource;
+ _graphicsManager->_backgroundPage = _bVoy->boltEntry(0x901)._picResource;
+ _graphicsManager->_vPort->setupViewPort(_graphicsManager->_backgroundPage);
+ _graphicsManager->_backColors->startFade();
+
+ flipPageAndWaitForFade();
+
+ _graphicsManager->setColor(1, 32, 32, 32);
+ _graphicsManager->setColor(2, 96, 96, 96);
+ _graphicsManager->setColor(3, 160, 160, 160);
+ _graphicsManager->setColor(4, 224, 224, 224);
+ _graphicsManager->setColor(9, 24, 64, 24);
+ _graphicsManager->setColor(10, 64, 132, 64);
+ _graphicsManager->setColor(11, 100, 192, 100);
+ _graphicsManager->setColor(12, 120, 248, 120);
+ _eventsManager->setCursorColor(128, 1);
+
+ _eventsManager->_intPtr._hasPalette = true;
+ _graphicsManager->_fontPtr->_curFont = _bVoy->boltEntry(0x909)._fontResource;
+ _graphicsManager->_fontPtr->_fontSaveBack = false;
+ _graphicsManager->_fontPtr->_fontFlags = DISPFLAG_NONE;
+
+ _eventsManager->getMouseInfo();
+ if (newX == -1) {
+ _eventsManager->setMousePos(Common::Point(hotspots[1].left + 12, hotspots[1].top + 6));
+ } else {
+ _eventsManager->setMousePos(Common::Point(newX, newY));
+ }
+
+ _currentVocId = 151;
+ _voy->_vocSecondsOffset = 0;
+ bool needRedraw = true;
+ do {
+ if (_currentVocId != -1 && !_soundManager->getVOCStatus()) {
+ _voy->_musicStartTime = _voy->_RTVNum;
+ _soundManager->startVOCPlay(_currentVocId);
+ }
+
+ if (needRedraw) {
+ needRedraw = false;
+ flipPageAndWait();
+
+ _graphicsManager->_drawPtr->_penColor = 0;
+ _graphicsManager->_drawPtr->_pos = Common::Point(tempRect.left, tempRect.top);
+ _graphicsManager->_backgroundPage->sFillBox(tempRect.width(), tempRect.height());
+
+ int yp = 45;
+ int eventNum = eventStart;
+ for (int lineNum = 0; lineNum < 8 && eventNum < _voy->_eventCount; ++lineNum, ++eventNum) {
+ _graphicsManager->_fontPtr->_picFlags = DISPFLAG_NONE;
+ _graphicsManager->_fontPtr->_picSelect = 0xff;
+ _graphicsManager->_fontPtr->_picPick = 7;
+ _graphicsManager->_fontPtr->_picOnOff = (lineNum == eventLine) ? 8 : 0;
+ _graphicsManager->_fontPtr->_pos = Common::Point(68, yp);
+ _graphicsManager->_fontPtr->_justify = ALIGN_LEFT;
+ _graphicsManager->_fontPtr->_justifyWidth = 0;
+ _graphicsManager->_fontPtr->_justifyHeight = 0;
+
+ Common::String msg = _eventsManager->getEvidString(eventNum);
+ _graphicsManager->_backgroundPage->drawText(msg);
+
+ yp += 15;
+ }
+
+ _graphicsManager->_vPort->addSaveRect(
+ _graphicsManager->_vPort->_lastPage, tempRect);
+ flipPageAndWait();
+
+ _graphicsManager->_vPort->addSaveRect(
+ _graphicsManager->_vPort->_lastPage, tempRect);
+ }
+
+ _graphicsManager->sDrawPic(cursor, _graphicsManager->_vPort,
+ _eventsManager->getMousePos());
+ flipPageAndWait();
+
+ _eventsManager->getMouseInfo();
+ foundIndex = -1;
+
+ Common::Point tempPos = _eventsManager->getMousePos() + Common::Point(14, 7);
+ for (uint idx = 0; idx < hotspots.size(); ++idx) {
+ if (hotspots[idx].contains(tempPos)) {
+ // Found hotspot area
+ foundIndex = idx;
+ break;
+ }
+ }
+
+ pt = _eventsManager->getMousePos();
+ if (tempPos.x >= 68 && tempPos.x <= 277 && tempPos.y >= 31 && tempPos.y <= 154) {
+ tempPos.y -= 2;
+ foundIndex = (tempPos.y - 31) / 15;
+ if ((tempPos.y - 31) % 15 >= 12 || (eventStart + foundIndex) >= _voy->_eventCount) {
+ _eventsManager->setCursorColor(128, 0);
+ foundIndex = 999;
+ } else if (!_eventsManager->_leftClick) {
+ _eventsManager->setCursorColor(128, 2);
+ foundIndex = -1;
+ } else {
+ _eventsManager->setCursorColor(128, 2);
+ eventLine = foundIndex;
+
+ flipPageAndWait();
+
+ _graphicsManager->_drawPtr->_penColor = 0;
+ _graphicsManager->_drawPtr->_pos = Common::Point(tempRect.left, tempRect.top);
+ _graphicsManager->_backgroundPage->sFillBox(tempRect.width(), tempRect.height());
+
+ int yp = 45;
+ int eventNum = eventStart;
+ for (int idx = 0; idx < 8 && eventNum < _voy->_eventCount; ++idx, ++eventNum) {
+ _graphicsManager->_fontPtr->_picFlags = DISPFLAG_NONE;
+ _graphicsManager->_fontPtr->_picSelect = 0xff;
+ _graphicsManager->_fontPtr->_picPick = 7;
+ _graphicsManager->_fontPtr->_picOnOff = (idx == eventLine) ? 8 : 0;
+ _graphicsManager->_fontPtr->_pos = Common::Point(68, yp);
+ _graphicsManager->_fontPtr->_justify = ALIGN_LEFT;
+ _graphicsManager->_fontPtr->_justifyWidth = 0;
+ _graphicsManager->_fontPtr->_justifyHeight = 0;
+
+ Common::String msg = _eventsManager->getEvidString(eventNum);
+ _graphicsManager->_backgroundPage->drawText(msg);
+
+ yp += 15;
+ }
+
+ _graphicsManager->_vPort->addSaveRect(
+ _graphicsManager->_vPort->_lastPage, tempRect);
+ flipPageAndWait();
+
+ _graphicsManager->_vPort->addSaveRect(
+ _graphicsManager->_vPort->_lastPage, tempRect);
+ flipPageAndWait();
+
+ _eventsManager->getMouseInfo();
+ foundIndex = -1;
+ }
+ } else if ((_voy->_eventFlags & EVTFLAG_40) && _voy->_viewBounds->left == pt.x &&
+ _voy->_viewBounds->bottom == pt.y) {
+ foundIndex = 999;
+ } else if ((_voy->_eventFlags & EVTFLAG_40) && _voy->_viewBounds->left == pt.x &&
+ _voy->_viewBounds->top == pt.y) {
+ foundIndex = 998;
+ } else {
+ _eventsManager->setCursorColor(128, (foundIndex == -1) ? 0 : 1);
+ }
+
+ _eventsManager->_intPtr._hasPalette = true;
+
+ if (_eventsManager->_mouseClicked) {
+ switch (foundIndex) {
+ case 2:
+ if (eventStart > 0) {
+ --eventStart;
+ needRedraw = true;
+ }
+ foundIndex = -1;
+ break;
+
+ case 3:
+ if (eventStart > 0) {
+ eventStart -= 8;
+ if (eventStart < 0)
+ eventStart = 0;
+ needRedraw = true;
+ }
+ foundIndex = -1;
+ break;
+
+ case 4:
+ if ((_voy->_eventCount - 8) > eventStart) {
+ ++eventStart;
+ needRedraw = true;
+ }
+ foundIndex = -1;
+ break;
+
+ case 5:
+ if (_voy->_eventCount >= 8 && (_voy->_eventCount - 8) != eventStart) {
+ eventStart += 8;
+ if ((_voy->_eventCount - 8) < eventStart)
+ eventStart = _voy->_eventCount - 8;
+ needRedraw = true;
+ }
+ foundIndex = -1;
+ break;
+
+ default:
+ break;
+ }
+
+ while (eventLine > 0 && (eventLine + eventStart) >= _voy->_eventCount)
+ --eventLine;
+ }
+
+ pt = _eventsManager->getMousePos();
+ if (_eventsManager->_mouseClicked && _voy->_viewBounds->left == pt.x &&
+ (_voy->_eventFlags & EVTFLAG_40) && _eventsManager->_rightClick) {
+ _controlPtr->_state->_victimIndex = (pt.y / 60) + 1;
+ foundIndex = -1;
+ _eventsManager->_rightClick = 0;
+ }
+
+ if (_eventsManager->_rightClick)
+ foundIndex = 0;
+
+ } while (!shouldQuit() && (!_eventsManager->_mouseClicked || foundIndex == -1));
+
+ newY = _eventsManager->getMousePos().y;
+ _voy->_fadingType = 0;
+ _voy->_viewBounds = nullptr;
+ _graphicsManager->_vPort->setupViewPort(NULL);
+
+ if (_currentVocId != -1) {
+ _voy->_vocSecondsOffset = _voy->_RTVNum - _voy->_musicStartTime;
+ _soundManager->stopVOCPlay();
+ }
+
+ // Break out if the exit button was pressed
+ if (!foundIndex)
+ break;
+
+ int eventIndex = eventStart + eventLine;
+ VoyeurEvent &e = _voy->_events[eventIndex];
+ switch (e._type) {
+ case EVTYPE_VIDEO:
+ playAVideoEvent(eventIndex);
+ break;
+
+ case EVTYPE_AUDIO: {
+ _audioVideoId = e._audioVideoId;
+ _voy->_vocSecondsOffset = e._computerOn;
+
+ _bVoy->getBoltGroup(0x7F00);
+ _graphicsManager->_backgroundPage = _bVoy->boltEntry(0x7F00 +
+ BLIND_TABLE[_audioVideoId])._picResource;
+ _graphicsManager->_backColors = _bVoy->boltEntry(0x7F01 +
+ BLIND_TABLE[_audioVideoId])._cMapResource;
+
+ _graphicsManager->_vPort->setupViewPort(_graphicsManager->_backgroundPage);
+ _graphicsManager->_backColors->startFade();
+ flipPageAndWaitForFade();
+
+ _eventsManager->_intPtr._flashStep = 1;
+ _eventsManager->_intPtr._flashTimer = 0;
+ _voy->_eventFlags &= ~EVTFLAG_TIME_DISABLED;
+
+ // Play suond for the given duration
+ _soundManager->setVOCOffset(_voy->_vocSecondsOffset);
+ _soundManager->startVOCPlay(_audioVideoId + 159);
+ uint32 secondsDuration = e._computerOff;
+
+ _eventsManager->getMouseInfo();
+ while (!_eventsManager->_mouseClicked && _soundManager->getVOCStatus() &&
+ _soundManager->getVOCFrame() < secondsDuration) {
+ _eventsManager->getMouseInfo();
+ _eventsManager->delay(10);
+ }
+
+ _voy->_eventFlags |= EVTFLAG_TIME_DISABLED;
+ _soundManager->stopVOCPlay();
+ _bVoy->freeBoltGroup(0x7F00);
+ break;
+ }
+
+ case EVTYPE_EVID:
+ _voy->reviewAnEvidEvent(eventIndex);
+
+ _voy->_vocSecondsOffset = _voy->_RTVNum - _voy->_musicStartTime;
+ _soundManager->stopVOCPlay();
+ _bVoy->getBoltGroup(0x900);
+ break;
+
+ case EVTYPE_COMPUTER:
+ _voy->reviewComputerEvent(eventIndex);
+
+ _voy->_vocSecondsOffset = _voy->_RTVNum - _voy->_musicStartTime;
+ _soundManager->stopVOCPlay();
+ _bVoy->getBoltGroup(0x900);
+ break;
+
+ default:
+ break;
+ }
+ }
+
+ _graphicsManager->_fontPtr->_curFont = _bVoy->boltEntry(0x101)._fontResource;
+
+ _graphicsManager->_vPort->fillPic(0);
+ flipPageAndWait();
+ _bVoy->freeBoltGroup(0x900);
+}
+
+void VoyeurEngine::doGossip() {
+ _graphicsManager->resetPalette();
+ _graphicsManager->screenReset();
+
+ if (!_bVoy->getBoltGroup(0x300))
+ return;
+
+ // Load the gossip animation
+ RL2Decoder decoder;
+ decoder.loadRL2File("a2050100.rl2", false);
+ decoder.start();
+
+ // Get the resource data for the first gossip video
+ PictureResource *bgPic = _bVoy->boltEntry(0x300)._picResource;
+ CMapResource *pal = _bVoy->boltEntry(0x301)._cMapResource;
+ pal->startFade();
+
+ // Transfer initial background to video decoder
+ PictureResource videoFrame(decoder.getRL2VideoTrack()->getBackSurface());
+ bgPic->_bounds.moveTo(0, 0);
+ _graphicsManager->sDrawPic(bgPic, &videoFrame, Common::Point(0, 0));
+
+ byte *frameNumsP = _bVoy->memberAddr(0x309);
+ byte *posP = _bVoy->boltEntry(0x30A)._data;
+
+ // Play the initial gossip video
+ decoder.play(this, 0x302, frameNumsP, posP);
+ decoder.close();
+
+ // Reset the palette and clear the screen
+ _graphicsManager->resetPalette();
+ _graphicsManager->screenReset();
+
+ // Play interview video
+ RL2Decoder decoder2;
+ decoder2.loadRL2File("a2110100.rl2", true);
+ decoder2.start();
+
+ _eventsManager->getMouseInfo();
+ decoder2.play(this);
+ decoder2.close();
+
+ _bVoy->freeBoltGroup(0x300);
+ _graphicsManager->screenReset();
+}
+
+void VoyeurEngine::doTapePlaying() {
+ if (!_bVoy->getBoltGroup(0xA00))
+ return;
+
+ _eventsManager->getMouseInfo();
+ _graphicsManager->_backColors = _bVoy->boltEntry(0xA01)._cMapResource;
+ _graphicsManager->_backgroundPage = _bVoy->boltEntry(0xA00)._picResource;
+ PictureResource *pic = _bVoy->boltEntry(0xA02)._picResource;
+ VInitCycleResource *cycle = _bVoy->boltEntry(0xA05)._vInitCycleResource;
+
+ _graphicsManager->_vPort->setupViewPort(_graphicsManager->_backgroundPage);
+ _graphicsManager->sDrawPic(pic, _graphicsManager->_vPort, Common::Point(57, 30));
+ _graphicsManager->_backColors->startFade();
+ flipPageAndWaitForFade();
+
+ cycle->vStartCycle();
+
+ _soundManager->startVOCPlay("vcr.voc");
+ while (!shouldQuit() && !_eventsManager->_mouseClicked && _soundManager->getVOCStatus()) {
+ _eventsManager->delayClick(2);
+ }
+
+ _soundManager->stopVOCPlay();
+ cycle->vStopCycle();
+ _bVoy->freeBoltGroup(0xA00);
+}
+
+bool VoyeurEngine::checkForMurder() {
+ int oldMurderIndex = _controlPtr->_state->_victimMurderIndex;
+
+ for (int idx = 0; idx < _voy->_eventCount; ++idx) {
+ VoyeurEvent &evt = _voy->_events[idx];
+
+ if (evt._type == EVTYPE_VIDEO) {
+ switch (_controlPtr->_state->_victimIndex) {
+ case 1:
+ if (evt._audioVideoId == 41 && evt._computerOn <= 15 &&
+ (evt._computerOff + evt._computerOn) >= 16) {
+ _controlPtr->_state->_victimMurderIndex = 1;
+ }
+ break;
+
+ case 2:
+ if (evt._audioVideoId == 53 && evt._computerOn <= 19 &&
+ (evt._computerOff + evt._computerOn) >= 21) {
+ _controlPtr->_state->_victimMurderIndex = 2;
+ }
+ break;
+
+ case 3:
+ if (evt._audioVideoId == 50 && evt._computerOn <= 28 &&
+ (evt._computerOff + evt._computerOn) >= 29) {
+ _controlPtr->_state->_victimMurderIndex = 3;
+ }
+ break;
+
+ case 4:
+ if (evt._audioVideoId == 43 && evt._computerOn <= 10 &&
+ (evt._computerOff + evt._computerOn) >= 14) {
+ _controlPtr->_state->_victimMurderIndex = 4;
+ }
+ break;
+
+ default:
+ break;
+ }
+ }
+
+ if (_controlPtr->_state->_victimMurderIndex == _controlPtr->_state->_victimIndex) {
+ _voy->_videoEventId = idx;
+ return true;
+ }
+ }
+
+ _controlPtr->_state->_victimMurderIndex = oldMurderIndex;
+ _voy->_videoEventId = -1;
+ return false;
+}
+
+bool VoyeurEngine::checkForIncriminate() {
+ _voy->_incriminatedVictimNumber = 0;
+
+ for (int idx = 0; idx < _voy->_eventCount; ++idx) {
+ VoyeurEvent &evt = _voy->_events[idx];
+
+ if (evt._type == EVTYPE_VIDEO) {
+ if (evt._audioVideoId == 44 && evt._computerOn <= 40 &&
+ (evt._computerOff + evt._computerOn) >= 70) {
+ _voy->_incriminatedVictimNumber = 1;
+ }
+
+ if (evt._audioVideoId == 44 && evt._computerOn <= 79 &&
+ (evt._computerOff + evt._computerOn) >= 129) {
+ _voy->_incriminatedVictimNumber = 1;
+ }
+
+ if (evt._audioVideoId == 20 && evt._computerOn <= 28 &&
+ (evt._computerOff + evt._computerOn) >= 45) {
+ _voy->_incriminatedVictimNumber = 2;
+ }
+
+ if (evt._audioVideoId == 35 && evt._computerOn <= 17 &&
+ (evt._computerOff + evt._computerOn) >= 36) {
+ _voy->_incriminatedVictimNumber = 3;
+ }
+
+ if (evt._audioVideoId == 30 && evt._computerOn <= 80 &&
+ (evt._computerOff + evt._computerOn) >= 139) {
+ _voy->_incriminatedVictimNumber = 4;
+ }
+ }
+
+ if (_voy->_incriminatedVictimNumber) {
+ _controlPtr->_state->_victimMurderIndex = 88;
+ _voy->_videoEventId = idx;
+ return true;
+ }
+ }
+
+ _voy->_videoEventId = -1;
+ return false;
+}
+
+void VoyeurEngine::playAVideoEvent(int eventIndex) {
+ VoyeurEvent &evt = _voy->_events[eventIndex];
+ _audioVideoId = evt._audioVideoId;
+ _voy->_vocSecondsOffset = evt._computerOn;
+ _eventsManager->_videoDead = evt._dead;
+ _voy->_eventFlags &= ~EVTFLAG_TIME_DISABLED;
+
+ playAVideoDuration(_audioVideoId, evt._computerOff);
+
+ _voy->_eventFlags |= EVTFLAG_TIME_DISABLED;
+ if (_eventsManager->_videoDead != -1) {
+ _bVoy->freeBoltGroup(0xE00);
+ _eventsManager->_videoDead = -1;
+ flipPageAndWait();
+ _eventsManager->_videoDead = -1;
+ }
+
+ _audioVideoId = -1;
+ if (_eventsManager->_videoDead != -1) {
+ _bVoy->freeBoltGroup(0xE00);
+ _eventsManager->_videoDead = -1;
+ flipPageAndWait();
+ }
+}
+
+int VoyeurEngine::getChooseButton() {
+ int prevIndex = -2;
+ Common::Array<RectEntry> &hotspots = _bVoy->boltEntry(_playStampGroupId
+ + 6)._rectResource->_entries;
+ int selectedIndex = -1;
+
+ _graphicsManager->_vPort->setupViewPort(_graphicsManager->_backgroundPage);
+ _graphicsManager->_backColors->_steps = 0;
+ _graphicsManager->_backColors->startFade();
+ flipPageAndWait();
+
+ _voy->_viewBounds = _bVoy->boltEntry(_playStampGroupId + 7)._rectResource;
+ PictureResource *cursorPic = _bVoy->boltEntry(_playStampGroupId + 2)._picResource;
+
+ do {
+ do {
+ if (_currentVocId != -1 && !_soundManager->getVOCStatus())
+ _soundManager->startVOCPlay(_currentVocId);
+
+ _eventsManager->getMouseInfo();
+ selectedIndex = -1;
+ Common::Point pt = _eventsManager->getMousePos();
+
+ for (uint idx = 0; idx < hotspots.size(); ++idx) {
+ if (hotspots[idx].contains(pt)) {
+ if (!_voy->_victimMurdered || ((int)idx + 1) != _controlPtr->_state->_victimIndex) {
+ selectedIndex = idx;
+ if (selectedIndex != prevIndex) {
+ PictureResource *btnPic = _bVoy->boltEntry(_playStampGroupId + 8 + idx)._picResource;
+ _graphicsManager->sDrawPic(btnPic, _graphicsManager->_vPort,
+ Common::Point(106, 200));
+
+ cursorPic = _bVoy->boltEntry(_playStampGroupId + 4)._picResource;
+ }
+ }
+ }
+ }
+
+ if (selectedIndex == -1) {
+ cursorPic = _bVoy->boltEntry(_playStampGroupId + 2)._picResource;
+ PictureResource *btnPic = _bVoy->boltEntry(_playStampGroupId + 12)._picResource;
+ _graphicsManager->sDrawPic(btnPic, _graphicsManager->_vPort,
+ Common::Point(106, 200));
+ }
+
+ _graphicsManager->sDrawPic(cursorPic, _graphicsManager->_vPort,
+ Common::Point(pt.x + 13, pt.y - 12));
+
+ flipPageAndWait();
+ } while (!shouldQuit() && !_eventsManager->_mouseClicked);
+ } while (!shouldQuit() && selectedIndex == -1 && !_eventsManager->_rightClick);
+
+ return selectedIndex;
+}
+
+void VoyeurEngine::makeViewFinder() {
+ _graphicsManager->_backgroundPage = _bVoy->boltEntry(0x103)._picResource;
+ _graphicsManager->sDrawPic(_graphicsManager->_backgroundPage,
+ _graphicsManager->_vPort, Common::Point(0, 0));
+ CMapResource *pal = _bVoy->boltEntry(0x104)._cMapResource;
+
+ int palOffset = 0;
+ switch (_voy->_transitionId) {
+ case 1:
+ case 2:
+ case 5:
+ case 6:
+ case 7:
+ case 8:
+ case 9:
+ case 17:
+ palOffset = 0;
+ break;
+ case 3:
+ palOffset = 1;
+ break;
+ case 4:
+ case 10:
+ case 11:
+ case 12:
+ case 13:
+ case 14:
+ case 15:
+ case 16:
+ palOffset = 2;
+ break;
+ default:
+ break;
+ }
+
+ _graphicsManager->_vPort->drawIfaceTime();
+ doTimeBar();
+ pal->startFade();
+
+ flipPageAndWaitForFade();
+
+ _graphicsManager->setColor(241, 105, 105, 105);
+ _graphicsManager->setColor(242, 105, 105, 105);
+ _graphicsManager->setColor(243, 105, 105, 105);
+ _graphicsManager->setColor(palOffset + 241, 219, 235, 235);
+
+ _eventsManager->_intPtr._hasPalette = true;
+}
+
+void VoyeurEngine::makeViewFinderP() {
+ _graphicsManager->screenReset();
+}
+
+void VoyeurEngine::initIFace() {
+ int playStamp1 = _playStampGroupId;
+ switch (_voy->_transitionId) {
+ case 0:
+ break;
+ case 1:
+ case 2:
+ case 5:
+ case 6:
+ case 7:
+ case 8:
+ case 9:
+ _playStampGroupId = 0xB00;
+ break;
+ case 3:
+ _playStampGroupId = 0xC00;
+ break;
+ default:
+ _playStampGroupId = 0xD00;
+ break;
+ }
+ if (playStamp1 != -1)
+ _bVoy->freeBoltGroup(playStamp1);
+
+ _bVoy->getBoltGroup(_playStampGroupId);
+ CMapResource *pal = _bVoy->boltEntry(_playStampGroupId + 2)._cMapResource;
+ pal->startFade();
+
+ // Reset the mansion view off to it's prior position (if any)
+ doScroll(_mansionViewPos);
+
+ _voy->_viewBounds = _bVoy->boltEntry(_playStampGroupId)._rectResource;
+
+ // Show the cursor using ScummVM functionality
+ _eventsManager->showCursor();
+
+ // Note: the original did two loops to preload members here, which is
+ // redundant for ScummVM, since computers are faster these days, and
+ // getting resources as needed will be fast enough.
+}
+
+void VoyeurEngine::doScroll(const Common::Point &pt) {
+ Common::Rect clipRect(72, 47, 72 + 240, 47 + 148);
+ _graphicsManager->_vPort->setupViewPort(NULL, &clipRect);
+
+ int base = 0;
+ switch (_voy->_transitionId) {
+ case 0:
+ break;
+ case 1:
+ case 2:
+ case 5:
+ case 6:
+ case 7:
+ case 8:
+ case 9:
+ base = 0xB00;
+ break;
+ case 3:
+ base = 0xC00;
+ break;
+ default:
+ base = 0xD00;
+ }
+
+ if (base) {
+ PictureResource *pic = _bVoy->boltEntry(base + 3)._picResource;
+ _graphicsManager->sDrawPic(pic, _graphicsManager->_vPort, Common::Point(784 - pt.x - 712, 150 - pt.y - 104));
+ pic = _bVoy->boltEntry(base + 4)._picResource;
+ _graphicsManager->sDrawPic(pic, _graphicsManager->_vPort, Common::Point(784 - pt.x - 712, 150 - pt.y - 44));
+ pic = _bVoy->boltEntry(base + 5)._picResource;
+ _graphicsManager->sDrawPic(pic, _graphicsManager->_vPort, Common::Point(784 - pt.x - 712, 150 - pt.y + 16));
+ pic = _bVoy->boltEntry(base + 6)._picResource;
+ _graphicsManager->sDrawPic(pic, _graphicsManager->_vPort, Common::Point(784 - pt.x - 712, 150 - pt.y + 76));
+ pic = _bVoy->boltEntry(base + 7)._picResource;
+ _graphicsManager->sDrawPic(pic, _graphicsManager->_vPort, Common::Point(784 - pt.x - 712, 150 - pt.y + 136));
+ }
+
+ _graphicsManager->_vPort->setupViewPort(NULL);
+}
+
+void VoyeurEngine::checkTransition() {
+ Common::String time, day;
+
+ if (_voy->_transitionId != _checkTransitionId) {
+ // Get the day
+ day = getDayName();
+
+ // Only proceed if a valid day string was returned
+ if (!day.empty()) {
+ _graphicsManager->fadeDownICF(6);
+
+ // Get the time of day string
+ time = getTimeOfDay();
+
+ // Show a transition card with the day and time, and wait
+ doTransitionCard(day, time);
+ _eventsManager->delayClick(180);
+ }
+
+ _checkTransitionId = _voy->_transitionId;
+ centerMansionView();
+ }
+}
+
+Common::String VoyeurEngine::getDayName() {
+ switch (_voy->_transitionId) {
+ case 0:
+ return "";
+ case 1:
+ case 2:
+ case 3:
+ case 4:
+ return SATURDAY;
+ case 17:
+ return MONDAY;
+ default:
+ return SUNDAY;
+ }
+}
+
+Common::String VoyeurEngine::getTimeOfDay() {
+ if (_voy->_transitionId == 17)
+ return "";
+
+ return Common::String::format("%d:%02d%s", _gameHour, _gameMinute, _voy->_isAM ? AM : PM);
+}
+
+int VoyeurEngine::doComputerText(int maxLen) {
+ FontInfoResource &font = *_graphicsManager->_fontPtr;
+ int totalChars = 0;
+
+ font._curFont = _bVoy->boltEntry(0x4910)._fontResource;
+ font._foreColor = 129;
+ font._fontSaveBack = false;
+ font._fontFlags = DISPFLAG_NONE;
+ if (_voy->_vocSecondsOffset > 60)
+ _voy->_vocSecondsOffset = 0;
+
+ if (_voy->_RTVNum > _voy->_computerTimeMax && maxLen == 9999) {
+ if (_currentVocId != -1)
+ _soundManager->startVOCPlay(_currentVocId);
+ font._justify = ALIGN_LEFT;
+ font._justifyWidth = 384;
+ font._justifyHeight = 100;
+ font._pos = Common::Point(128, 100);
+ _graphicsManager->_vPort->drawText(END_OF_MESSAGE);
+ } else if (_voy->_RTVNum < _voy->_computerTimeMin && maxLen == 9999) {
+ if (_currentVocId != -1)
+ _soundManager->startVOCPlay(_currentVocId);
+ font._justify = ALIGN_LEFT;
+ font._justifyWidth = 384;
+ font._justifyHeight = 100;
+ font._pos = Common::Point(120, 100);
+ _graphicsManager->_vPort->drawText(START_OF_MESSAGE);
+ } else {
+ char *msg = (char *)_bVoy->memberAddr(0x4900 + _voy->_computerTextId);
+ font._pos = Common::Point(96, 60);
+
+ bool showEnd = true;
+ int yp = 60;
+ do {
+ if (_currentVocId != -1 && !_soundManager->getVOCStatus()) {
+ if (_voy->_vocSecondsOffset > 60)
+ _voy->_vocSecondsOffset = 0;
+ _soundManager->startVOCPlay(_currentVocId);
+ }
+
+ char c = *msg++;
+ if (c == '\0') {
+ if (showEnd) {
+ _eventsManager->delay(90);
+ _graphicsManager->_drawPtr->_pos = Common::Point(96, 54);
+ _graphicsManager->_drawPtr->_penColor = 254;
+ _graphicsManager->_vPort->sFillBox(196, 124);
+ _graphicsManager->_fontPtr->_justify = ALIGN_LEFT;
+ _graphicsManager->_fontPtr->_justifyWidth = 384;
+ _graphicsManager->_fontPtr->_justifyHeight = 100;
+ _graphicsManager->_fontPtr->_pos = Common::Point(128, 100);
+ _graphicsManager->_vPort->drawText(END_OF_MESSAGE);
+ }
+ break;
+ }
+
+ if (c == '~' || c == '^') {
+ if (c == '^') {
+ yp += 10;
+ } else {
+ _eventsManager->delay(90);
+ _graphicsManager->_drawPtr->_pos = Common::Point(96, 54);
+ _graphicsManager->_drawPtr->_penColor = 255;
+ _graphicsManager->_vPort->sFillBox(196, 124);
+ yp = 60;
+ }
+
+ _graphicsManager->_fontPtr->_pos = Common::Point(96, yp);
+ } else if (c == '_') {
+ showEnd = false;
+ } else {
+ _graphicsManager->_fontPtr->_justify = ALIGN_LEFT;
+ _graphicsManager->_fontPtr->_justifyWidth = 0;
+ _graphicsManager->_fontPtr->_justifyHeight = 0;
+ _graphicsManager->_vPort->drawText(Common::String(c));
+ _eventsManager->delay(4);
+ }
+
+ flipPageAndWait();
+ _eventsManager->getMouseInfo();
+ ++totalChars;
+
+ } while (!shouldQuit() && !_eventsManager->_mouseClicked && totalChars < maxLen);
+
+ _voy->_computerTimeMax = 0;
+ }
+
+ flipPageAndWait();
+
+ _graphicsManager->_fontPtr->_curFont = _bVoy->boltEntry(0x101)._fontResource;
+ return totalChars;
+}
+
+void VoyeurEngine::getComputerBrush() {
+ if (!_bVoy->getBoltGroup(0x4900))
+ return;
+
+ PictureResource *pic = _bVoy->boltEntry(0x490E)._picResource;
+ int xp = (384 - pic->_bounds.width()) / 2;
+ int yp = (240 - pic->_bounds.height()) / 2 - 4;
+
+ _graphicsManager->_vPort->drawPicPerm(pic, Common::Point(xp, yp));
+
+ CMapResource *pal = _bVoy->boltEntry(0x490F)._cMapResource;
+ pal->startFade();
+}
+
+void VoyeurEngine::doTimeBar() {
+ flashTimeBar();
+
+ if (_voy->_RTVLimit > 0) {
+ if (_voy->_RTVNum > _voy->_RTVLimit || _voy->_RTVNum < 0)
+ _voy->_RTVNum = _voy->_RTVLimit - 1;
+
+ _timeBarVal = _voy->_RTVNum;
+ int height = ((_voy->_RTVLimit - _voy->_RTVNum) * 59) / _voy->_RTVLimit;
+ int fullHeight = MAX(151 - height, 93);
+
+ _graphicsManager->_drawPtr->_penColor = 134;
+ _graphicsManager->_drawPtr->_pos = Common::Point(39, 92);
+
+ _graphicsManager->_vPort->sFillBox(6, fullHeight - 92);
+ if (height > 0) {
+ _graphicsManager->setColor(215, 238, 238, 238);
+ _eventsManager->_intPtr._hasPalette = true;
+
+ _graphicsManager->_drawPtr->_penColor = 215;
+ _graphicsManager->_drawPtr->_pos = Common::Point(39, fullHeight);
+ _graphicsManager->_vPort->sFillBox(6, height);
+ }
+ }
+}
+
+void VoyeurEngine::flashTimeBar() {
+ if (_voy->_RTVNum >= 0 && (_voy->_RTVLimit - _voy->_RTVNum) < 11 &&
+ (_eventsManager->_intPtr._flashTimer >= (_flashTimeVal + 15) ||
+ _eventsManager->_intPtr._flashTimer < _flashTimeVal)) {
+ // Within camera low power range
+ _flashTimeVal = _eventsManager->_intPtr._flashTimer;
+
+ if (_flashTimeFlag)
+ _graphicsManager->setColor(240, 220, 20, 20);
+ else
+ _graphicsManager->setColor(240, 220, 220, 220);
+
+ _eventsManager->_intPtr._hasPalette = true;
+ _flashTimeFlag = !_flashTimeFlag;
+ }
+}
+
+void VoyeurEngine::checkPhoneCall() {
+ if ((_voy->_RTVLimit - _voy->_RTVNum) >= 36 && _voy->_totalPhoneCalls < 5 &&
+ _currentVocId <= 151 && _currentVocId > 146) {
+ if ((_voy->_switchBGNum < _checkPhoneVal || _checkPhoneVal > 180) &&
+ !_soundManager->getVOCStatus()) {
+ int soundIndex;
+ do {
+ soundIndex = getRandomNumber(4);
+ } while (_voy->_phoneCallsReceived[soundIndex]);
+ _currentVocId = 154 + soundIndex;
+
+ _soundManager->stopVOCPlay();
+ _soundManager->startVOCPlay(_currentVocId);
+ _checkPhoneVal = _voy->_switchBGNum;
+ _voy->_phoneCallsReceived[soundIndex] = true;
+ ++_voy->_totalPhoneCalls;
+ }
+ }
+}
+
+void VoyeurEngine::doEvidDisplay(int evidId, int eventId) {
+ _eventsManager->getMouseInfo();
+ flipPageAndWait();
+
+ if (_currentVocId != -1) {
+ _voy->_vocSecondsOffset = _voy->_RTVNum - _voy->_musicStartTime;
+ _soundManager->stopVOCPlay();
+ }
+
+ _bVoy->getBoltGroup(_voy->_boltGroupId2);
+ PictureResource *pic = _bVoy->boltEntry(_voy->_boltGroupId2 + evidId * 2)._picResource;
+ _graphicsManager->sDrawPic(pic, _graphicsManager->_vPort, Common::Point(
+ (384 - pic->_bounds.width()) / 2, (240 - pic->_bounds.height()) / 2));
+ _bVoy->freeBoltMember(_voy->_boltGroupId2 + evidId * 2);
+
+ CMapResource *pal = _bVoy->boltEntry(_voy->_boltGroupId2 + evidId * 2 + 1)._cMapResource;
+ pal->startFade();
+
+ while (!shouldQuit() && (_eventsManager->_fadeStatus & 1))
+ _eventsManager->delay(1);
+ _bVoy->freeBoltMember(_voy->_boltGroupId2 + evidId * 2 + 1);
+
+ Common::Array<RectEntry> &hotspots = _bVoy->boltEntry(_playStampGroupId + 4)._rectResource->_entries;
+ int count = hotspots[evidId]._count;
+
+ if (count > 0) {
+ for (int idx = 1; idx <= count; ++idx) {
+ _voy->_evPicPtrs[idx - 1] = _bVoy->boltEntry(_voy->_boltGroupId2 +
+ (evidId + idx) * 2)._picResource;
+ _voy->_evCmPtrs[idx - 1] = _bVoy->boltEntry(_voy->_boltGroupId2 +
+ (evidId + idx) * 2 + 1)._cMapResource;
+ }
+ }
+
+ flipPageAndWait();
+ _eventsManager->stopEvidDim();
+
+ if (eventId == 999)
+ _voy->addEvidEventStart(evidId);
+
+ _eventsManager->getMouseInfo();
+
+ int arrIndex = 0;
+ int evidIdx = evidId;
+
+ while (!shouldQuit() && !_eventsManager->_rightClick) {
+ _voyeurArea = AREA_EVIDENCE;
+
+ if (_currentVocId != -1 && !_soundManager->getVOCStatus()) {
+ if (_voy->_vocSecondsOffset > 60)
+ _voy->_vocSecondsOffset = 0;
+
+ _soundManager->startVOCPlay(_currentVocId);
+ }
+
+ _eventsManager->delayClick(600);
+ if (_eventsManager->_rightClick)
+ break;
+ if (count == 0 || evidIdx >= eventId)
+ continue;
+
+ pic = _voy->_evPicPtrs[arrIndex];
+ _graphicsManager->sDrawPic(pic, _graphicsManager->_vPort,
+ Common::Point((384 - pic->_bounds.width()) / 2,
+ (240 - pic->_bounds.height()) / 2));
+ _voy->_evCmPtrs[arrIndex]->startFade();
+ while (!shouldQuit() && (_eventsManager->_fadeStatus & 1))
+ _eventsManager->delay(1);
+
+ flipPageAndWait();
+ _eventsManager->delay(6);
+
+ ++evidIdx;
+ ++arrIndex;
+ --count;
+ }
+
+ if (eventId == 999)
+ _voy->addEvidEventEnd(evidIdx);
+
+ for (int idx = 1; idx <= hotspots[evidId]._count; ++idx) {
+ _bVoy->freeBoltMember(_voy->_boltGroupId2 + (evidId + idx) * 2);
+ _bVoy->freeBoltMember(_voy->_boltGroupId2 + (evidId + idx) * 2 + 1);
+ }
+}
+
+void VoyeurEngine::centerMansionView() {
+ _mansionViewPos = Common::Point((MANSION_MAX_X - MANSION_VIEW_WIDTH) / 2,
+ (MANSION_MAX_Y - MANSION_VIEW_HEIGHT) / 2);
+}
+
+} // End of namespace Voyeur
diff --git a/engines/wintermute/ad/ad_actor.cpp b/engines/wintermute/ad/ad_actor.cpp
index 967270b9bd..9d5a35464a 100644
--- a/engines/wintermute/ad/ad_actor.cpp
+++ b/engines/wintermute/ad/ad_actor.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -1319,29 +1319,29 @@ BaseSprite *AdActor::getTalkStanceOld(const char *stance) {
bool AdActor::persist(BasePersistenceManager *persistMgr) {
AdTalkHolder::persist(persistMgr);
- persistMgr->transfer(TMEMBER_INT(_dir));
+ persistMgr->transferSint32(TMEMBER_INT(_dir));
persistMgr->transferPtr(TMEMBER_PTR(_path));
- persistMgr->transfer(TMEMBER(_pFCount));
- persistMgr->transfer(TMEMBER(_pFStepX));
- persistMgr->transfer(TMEMBER(_pFStepY));
- persistMgr->transfer(TMEMBER(_pFX));
- persistMgr->transfer(TMEMBER(_pFY));
+ persistMgr->transferSint32(TMEMBER(_pFCount));
+ persistMgr->transferDouble(TMEMBER(_pFStepX));
+ persistMgr->transferDouble(TMEMBER(_pFStepY));
+ persistMgr->transferDouble(TMEMBER(_pFX));
+ persistMgr->transferDouble(TMEMBER(_pFY));
persistMgr->transferPtr(TMEMBER_PTR(_standSprite));
_talkSprites.persist(persistMgr);
_talkSpritesEx.persist(persistMgr);
- persistMgr->transfer(TMEMBER_INT(_targetDir));
- persistMgr->transfer(TMEMBER_INT(_afterWalkDir));
+ persistMgr->transferSint32(TMEMBER_INT(_targetDir));
+ persistMgr->transferSint32(TMEMBER_INT(_afterWalkDir));
persistMgr->transferPtr(TMEMBER_PTR(_targetPoint));
persistMgr->transferPtr(TMEMBER_PTR(_turnLeftSprite));
persistMgr->transferPtr(TMEMBER_PTR(_turnRightSprite));
persistMgr->transferPtr(TMEMBER_PTR(_walkSprite));
persistMgr->transferPtr(TMEMBER_PTR(_animSprite2));
- persistMgr->transfer(TMEMBER(_talkAnimName));
- persistMgr->transfer(TMEMBER(_idleAnimName));
- persistMgr->transfer(TMEMBER(_walkAnimName));
- persistMgr->transfer(TMEMBER(_turnLeftAnimName));
- persistMgr->transfer(TMEMBER(_turnRightAnimName));
+ persistMgr->transferString(TMEMBER(_talkAnimName));
+ persistMgr->transferString(TMEMBER(_idleAnimName));
+ persistMgr->transferString(TMEMBER(_walkAnimName));
+ persistMgr->transferString(TMEMBER(_turnLeftAnimName));
+ persistMgr->transferString(TMEMBER(_turnRightAnimName));
_anims.persist(persistMgr);
@@ -1376,7 +1376,7 @@ TDirection AdActor::angleToDirection(int angle) {
//////////////////////////////////////////////////////////////////////////
-int AdActor::getHeight() {
+int32 AdActor::getHeight() {
// if no current sprite is set, set some
if (_currentSprite == nullptr) {
if (_standSprite) {
diff --git a/engines/wintermute/ad/ad_actor.h b/engines/wintermute/ad/ad_actor.h
index e836dd72cf..863a055a4b 100644
--- a/engines/wintermute/ad/ad_actor.h
+++ b/engines/wintermute/ad/ad_actor.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -47,7 +47,7 @@ class AdActor : public AdTalkHolder {
public:
TDirection angleToDirection(int angle);
DECLARE_PERSISTENT(AdActor, AdTalkHolder)
- virtual int getHeight();
+ virtual int32 getHeight() override;
BaseSprite *getTalkStance(const char *stance);
virtual void goTo(int x, int y, TDirection afterWalkDir = DI_NONE);
BasePoint *_targetPoint;
diff --git a/engines/wintermute/ad/ad_entity.cpp b/engines/wintermute/ad/ad_entity.cpp
index 2c0e13a4dc..1bbadeb7f7 100644
--- a/engines/wintermute/ad/ad_entity.cpp
+++ b/engines/wintermute/ad/ad_entity.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -1067,7 +1067,7 @@ bool AdEntity::saveAsText(BaseDynamicBuffer *buffer, int indent) {
//////////////////////////////////////////////////////////////////////////
-int AdEntity::getHeight() {
+int32 AdEntity::getHeight() {
if (_region && !_sprite) {
return _region->_rect.bottom - _region->_rect.top;
} else {
@@ -1092,16 +1092,16 @@ void AdEntity::updatePosition() {
bool AdEntity::persist(BasePersistenceManager *persistMgr) {
AdTalkHolder::persist(persistMgr);
- persistMgr->transfer(TMEMBER(_item));
+ persistMgr->transferCharPtr(TMEMBER(_item));
persistMgr->transferPtr(TMEMBER_PTR(_region));
//persistMgr->transfer(TMEMBER(_sprite));
- persistMgr->transfer(TMEMBER_INT(_subtype));
+ persistMgr->transferSint32(TMEMBER_INT(_subtype));
_talkSprites.persist(persistMgr);
_talkSpritesEx.persist(persistMgr);
- persistMgr->transfer(TMEMBER(_walkToX));
- persistMgr->transfer(TMEMBER(_walkToY));
- persistMgr->transfer(TMEMBER_INT(_walkToDir));
+ persistMgr->transferSint32(TMEMBER(_walkToX));
+ persistMgr->transferSint32(TMEMBER(_walkToY));
+ persistMgr->transferSint32(TMEMBER_INT(_walkToDir));
persistMgr->transferPtr(TMEMBER_PTR(_theora));
diff --git a/engines/wintermute/ad/ad_entity.h b/engines/wintermute/ad/ad_entity.h
index c4d60e86f3..7e1525b7c1 100644
--- a/engines/wintermute/ad/ad_entity.h
+++ b/engines/wintermute/ad/ad_entity.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -40,7 +40,7 @@ public:
void setItem(const char *itemName);
DECLARE_PERSISTENT(AdEntity, AdTalkHolder)
void updatePosition();
- virtual int getHeight();
+ virtual int32 getHeight() override;
BaseRegion *_region;
virtual bool saveAsText(BaseDynamicBuffer *buffer, int indent) override;
virtual bool update();
diff --git a/engines/wintermute/ad/ad_game.cpp b/engines/wintermute/ad/ad_game.cpp
index 86f470b8c3..3c4383f55e 100644
--- a/engines/wintermute/ad/ad_game.cpp
+++ b/engines/wintermute/ad/ad_game.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -1417,41 +1417,41 @@ bool AdGame::persist(BasePersistenceManager *persistMgr) {
_objects.persist(persistMgr);
- persistMgr->transfer(TMEMBER(_prevSceneName));
- persistMgr->transfer(TMEMBER(_prevSceneFilename));
+ persistMgr->transferCharPtr(TMEMBER(_prevSceneName));
+ persistMgr->transferCharPtr(TMEMBER(_prevSceneFilename));
persistMgr->transferPtr(TMEMBER_PTR(_responseBox));
_responsesBranch.persist(persistMgr);
_responsesGame.persist(persistMgr);
persistMgr->transferPtr(TMEMBER_PTR(_scene));
_sceneStates.persist(persistMgr);
- persistMgr->transfer(TMEMBER(_scheduledFadeIn));
- persistMgr->transfer(TMEMBER(_scheduledScene));
+ persistMgr->transferBool(TMEMBER(_scheduledFadeIn));
+ persistMgr->transferCharPtr(TMEMBER(_scheduledScene));
persistMgr->transferPtr(TMEMBER_PTR(_selectedItem));
- persistMgr->transfer(TMEMBER_INT(_talkSkipButton));
+ persistMgr->transferSint32(TMEMBER_INT(_talkSkipButton));
_sentences.persist(persistMgr);
persistMgr->transferPtr(TMEMBER_PTR(_sceneViewport));
- persistMgr->transfer(TMEMBER_INT(_stateEx));
- persistMgr->transfer(TMEMBER(_initialScene));
- persistMgr->transfer(TMEMBER(_debugStartupScene));
+ persistMgr->transferSint32(TMEMBER_INT(_stateEx));
+ persistMgr->transferBool(TMEMBER(_initialScene));
+ persistMgr->transferCharPtr(TMEMBER(_debugStartupScene));
persistMgr->transferPtr(TMEMBER_PTR(_invObject));
persistMgr->transferPtr(TMEMBER_PTR(_inventoryOwner));
- persistMgr->transfer(TMEMBER(_tempDisableSaveState));
+ persistMgr->transferBool(TMEMBER(_tempDisableSaveState));
_items.persist(persistMgr);
- persistMgr->transfer(TMEMBER(_itemsFile));
+ persistMgr->transferCharPtr(TMEMBER(_itemsFile));
_speechDirs.persist(persistMgr);
- persistMgr->transfer(TMEMBER(_smartItemCursor));
+ persistMgr->transferBool(TMEMBER(_smartItemCursor));
if (!persistMgr->getIsSaving()) {
_initialScene = false;
}
- persistMgr->transfer(TMEMBER(_startupScene));
+ persistMgr->transferCharPtr(TMEMBER(_startupScene));
return STATUS_OK;
@@ -2160,7 +2160,6 @@ bool AdGame::onMouseLeftDown() {
_gameRef->_capturedObject = _gameRef->_activeObject;
}
_mouseLeftDown = true;
- BasePlatform::setCapture(/*_renderer->_window*/);
return STATUS_OK;
}
@@ -2171,7 +2170,6 @@ bool AdGame::onMouseLeftUp() {
_activeObject->handleMouse(MOUSE_RELEASE, MOUSE_BUTTON_LEFT);
}
- BasePlatform::releaseCapture();
_capturedObject = nullptr;
_mouseLeftDown = false;
diff --git a/engines/wintermute/ad/ad_game.h b/engines/wintermute/ad/ad_game.h
index 019f2e6478..ebb37e9a07 100644
--- a/engines/wintermute/ad/ad_game.h
+++ b/engines/wintermute/ad/ad_game.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/wintermute/ad/ad_inventory.cpp b/engines/wintermute/ad/ad_inventory.cpp
index 544d8310d0..e385d233b6 100644
--- a/engines/wintermute/ad/ad_inventory.cpp
+++ b/engines/wintermute/ad/ad_inventory.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -128,7 +128,7 @@ bool AdInventory::persist(BasePersistenceManager *persistMgr) {
BaseObject::persist(persistMgr);
_takenItems.persist(persistMgr);
- persistMgr->transfer(TMEMBER(_scrollOffset));
+ persistMgr->transferSint32(TMEMBER(_scrollOffset));
return STATUS_OK;
}
diff --git a/engines/wintermute/ad/ad_inventory.h b/engines/wintermute/ad/ad_inventory.h
index 9de831b2a0..c2092bce56 100644
--- a/engines/wintermute/ad/ad_inventory.h
+++ b/engines/wintermute/ad/ad_inventory.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/wintermute/ad/ad_inventory_box.cpp b/engines/wintermute/ad/ad_inventory_box.cpp
index 4c904e78eb..a2e54a3318 100644
--- a/engines/wintermute/ad/ad_inventory_box.cpp
+++ b/engines/wintermute/ad/ad_inventory_box.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -372,16 +372,16 @@ bool AdInventoryBox::persist(BasePersistenceManager *persistMgr) {
BaseObject::persist(persistMgr);
persistMgr->transferPtr(TMEMBER_PTR(_closeButton));
- persistMgr->transfer(TMEMBER(_hideSelected));
- persistMgr->transfer(TMEMBER(_itemHeight));
- persistMgr->transfer(TMEMBER(_itemsArea));
- persistMgr->transfer(TMEMBER(_itemWidth));
- persistMgr->transfer(TMEMBER(_scrollBy));
- persistMgr->transfer(TMEMBER(_scrollOffset));
- persistMgr->transfer(TMEMBER(_spacing));
- persistMgr->transfer(TMEMBER(_visible));
+ persistMgr->transferBool(TMEMBER(_hideSelected));
+ persistMgr->transferSint32(TMEMBER(_itemHeight));
+ persistMgr->transferRect32(TMEMBER(_itemsArea));
+ persistMgr->transferSint32(TMEMBER(_itemWidth));
+ persistMgr->transferSint32(TMEMBER(_scrollBy));
+ persistMgr->transferSint32(TMEMBER(_scrollOffset));
+ persistMgr->transferSint32(TMEMBER(_spacing));
+ persistMgr->transferBool(TMEMBER(_visible));
persistMgr->transferPtr(TMEMBER_PTR(_window));
- persistMgr->transfer(TMEMBER(_exclusive));
+ persistMgr->transferBool(TMEMBER(_exclusive));
return STATUS_OK;
}
diff --git a/engines/wintermute/ad/ad_inventory_box.h b/engines/wintermute/ad/ad_inventory_box.h
index 4d576625b2..4673f2e3f3 100644
--- a/engines/wintermute/ad/ad_inventory_box.h
+++ b/engines/wintermute/ad/ad_inventory_box.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/wintermute/ad/ad_item.cpp b/engines/wintermute/ad/ad_item.cpp
index f9741d1ed2..c7eda029cf 100644
--- a/engines/wintermute/ad/ad_item.cpp
+++ b/engines/wintermute/ad/ad_item.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -783,17 +783,17 @@ bool AdItem::persist(BasePersistenceManager *persistMgr) {
AdTalkHolder::persist(persistMgr);
- persistMgr->transfer(TMEMBER(_cursorCombined));
+ persistMgr->transferBool(TMEMBER(_cursorCombined));
persistMgr->transferPtr(TMEMBER_PTR(_cursorHover));
persistMgr->transferPtr(TMEMBER_PTR(_cursorNormal));
persistMgr->transferPtr(TMEMBER_PTR(_spriteHover));
- persistMgr->transfer(TMEMBER(_inInventory));
- persistMgr->transfer(TMEMBER(_displayAmount));
- persistMgr->transfer(TMEMBER(_amount));
- persistMgr->transfer(TMEMBER(_amountOffsetX));
- persistMgr->transfer(TMEMBER(_amountOffsetY));
- persistMgr->transfer(TMEMBER_INT(_amountAlign));
- persistMgr->transfer(TMEMBER(_amountString));
+ persistMgr->transferBool(TMEMBER(_inInventory));
+ persistMgr->transferBool(TMEMBER(_displayAmount));
+ persistMgr->transferSint32(TMEMBER(_amount));
+ persistMgr->transferSint32(TMEMBER(_amountOffsetX));
+ persistMgr->transferSint32(TMEMBER(_amountOffsetY));
+ persistMgr->transferSint32(TMEMBER_INT(_amountAlign));
+ persistMgr->transferCharPtr(TMEMBER(_amountString));
return STATUS_OK;
}
diff --git a/engines/wintermute/ad/ad_item.h b/engines/wintermute/ad/ad_item.h
index 935ea5d73d..092a645019 100644
--- a/engines/wintermute/ad/ad_item.h
+++ b/engines/wintermute/ad/ad_item.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/wintermute/ad/ad_layer.cpp b/engines/wintermute/ad/ad_layer.cpp
index 752700d0d4..f6ea339895 100644
--- a/engines/wintermute/ad/ad_layer.cpp
+++ b/engines/wintermute/ad/ad_layer.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -551,12 +551,12 @@ bool AdLayer::persist(BasePersistenceManager *persistMgr) {
BaseObject::persist(persistMgr);
- persistMgr->transfer(TMEMBER(_active));
- persistMgr->transfer(TMEMBER(_closeUp));
- persistMgr->transfer(TMEMBER(_height));
- persistMgr->transfer(TMEMBER(_main));
+ persistMgr->transferBool(TMEMBER(_active));
+ persistMgr->transferBool(TMEMBER(_closeUp));
+ persistMgr->transferSint32(TMEMBER(_height));
+ persistMgr->transferBool(TMEMBER(_main));
_nodes.persist(persistMgr);
- persistMgr->transfer(TMEMBER(_width));
+ persistMgr->transferSint32(TMEMBER(_width));
return STATUS_OK;
}
diff --git a/engines/wintermute/ad/ad_layer.h b/engines/wintermute/ad/ad_layer.h
index af7c3a364c..995ef28ee9 100644
--- a/engines/wintermute/ad/ad_layer.h
+++ b/engines/wintermute/ad/ad_layer.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/wintermute/ad/ad_node_state.cpp b/engines/wintermute/ad/ad_node_state.cpp
index 876c5a8bb4..c43604320b 100644
--- a/engines/wintermute/ad/ad_node_state.cpp
+++ b/engines/wintermute/ad/ad_node_state.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -95,13 +95,13 @@ void AdNodeState::setCursor(const char *filename) {
bool AdNodeState::persist(BasePersistenceManager *persistMgr) {
persistMgr->transferPtr(TMEMBER_PTR(_gameRef));
- persistMgr->transfer(TMEMBER(_active));
- persistMgr->transfer(TMEMBER(_name));
- persistMgr->transfer(TMEMBER(_filename));
- persistMgr->transfer(TMEMBER(_cursor));
- persistMgr->transfer(TMEMBER(_alphaColor));
+ persistMgr->transferBool(TMEMBER(_active));
+ persistMgr->transferCharPtr(TMEMBER(_name));
+ persistMgr->transferCharPtr(TMEMBER(_filename));
+ persistMgr->transferCharPtr(TMEMBER(_cursor));
+ persistMgr->transferUint32(TMEMBER(_alphaColor));
for (int i = 0; i < 7; i++) {
- persistMgr->transfer(TMEMBER(_caption[i]));
+ persistMgr->transferCharPtr(TMEMBER(_caption[i]));
}
return STATUS_OK;
diff --git a/engines/wintermute/ad/ad_node_state.h b/engines/wintermute/ad/ad_node_state.h
index 4b5b46ee60..cf897e9af3 100644
--- a/engines/wintermute/ad/ad_node_state.h
+++ b/engines/wintermute/ad/ad_node_state.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/wintermute/ad/ad_object.cpp b/engines/wintermute/ad/ad_object.cpp
index 0d5011f92d..a93bd42bd0 100644
--- a/engines/wintermute/ad/ad_object.cpp
+++ b/engines/wintermute/ad/ad_object.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -859,7 +859,7 @@ bool AdObject::setFont(const char *filename) {
//////////////////////////////////////////////////////////////////////////
-int AdObject::getHeight() {
+int32 AdObject::getHeight() {
if (!_currentSprite) {
return 0;
} else {
@@ -1030,30 +1030,30 @@ bool AdObject::reset() {
bool AdObject::persist(BasePersistenceManager *persistMgr) {
BaseObject::persist(persistMgr);
- persistMgr->transfer(TMEMBER(_active));
+ persistMgr->transferBool(TMEMBER(_active));
persistMgr->transferPtr(TMEMBER_PTR(_blockRegion));
persistMgr->transferPtr(TMEMBER_PTR(_currentBlockRegion));
persistMgr->transferPtr(TMEMBER_PTR(_currentWptGroup));
persistMgr->transferPtr(TMEMBER_PTR(_currentSprite));
- persistMgr->transfer(TMEMBER(_drawn));
+ persistMgr->transferBool(TMEMBER(_drawn));
persistMgr->transferPtr(TMEMBER_PTR(_font));
- persistMgr->transfer(TMEMBER(_ignoreItems));
- persistMgr->transfer(TMEMBER_INT(_nextState));
+ persistMgr->transferBool(TMEMBER(_ignoreItems));
+ persistMgr->transferSint32(TMEMBER_INT(_nextState));
persistMgr->transferPtr(TMEMBER_PTR(_sentence));
- persistMgr->transfer(TMEMBER_INT(_state));
+ persistMgr->transferSint32(TMEMBER_INT(_state));
persistMgr->transferPtr(TMEMBER_PTR(_animSprite));
- persistMgr->transfer(TMEMBER(_sceneIndependent));
- persistMgr->transfer(TMEMBER(_forcedTalkAnimName));
- persistMgr->transfer(TMEMBER(_forcedTalkAnimUsed));
+ persistMgr->transferBool(TMEMBER(_sceneIndependent));
+ persistMgr->transferCharPtr(TMEMBER(_forcedTalkAnimName));
+ persistMgr->transferBool(TMEMBER(_forcedTalkAnimUsed));
persistMgr->transferPtr(TMEMBER_PTR(_tempSprite2));
- persistMgr->transfer(TMEMBER_INT(_type));
+ persistMgr->transferSint32(TMEMBER_INT(_type));
persistMgr->transferPtr(TMEMBER_PTR(_wptGroup));
persistMgr->transferPtr(TMEMBER_PTR(_stickRegion));
- persistMgr->transfer(TMEMBER(_subtitlesModRelative));
- persistMgr->transfer(TMEMBER(_subtitlesModX));
- persistMgr->transfer(TMEMBER(_subtitlesModY));
- persistMgr->transfer(TMEMBER(_subtitlesModXCenter));
- persistMgr->transfer(TMEMBER(_subtitlesWidth));
+ persistMgr->transferBool(TMEMBER(_subtitlesModRelative));
+ persistMgr->transferSint32(TMEMBER(_subtitlesModX));
+ persistMgr->transferSint32(TMEMBER(_subtitlesModY));
+ persistMgr->transferBool(TMEMBER(_subtitlesModXCenter));
+ persistMgr->transferSint32(TMEMBER(_subtitlesWidth));
persistMgr->transferPtr(TMEMBER_PTR(_inventory));
persistMgr->transferPtr(TMEMBER_PTR(_partEmitter));
@@ -1065,9 +1065,9 @@ bool AdObject::persist(BasePersistenceManager *persistMgr) {
_attachmentsPost.persist(persistMgr);
persistMgr->transferPtr(TMEMBER_PTR(_registerAlias));
- persistMgr->transfer(TMEMBER(_partFollowParent));
- persistMgr->transfer(TMEMBER(_partOffsetX));
- persistMgr->transfer(TMEMBER(_partOffsetY));
+ persistMgr->transferBool(TMEMBER(_partFollowParent));
+ persistMgr->transferSint32(TMEMBER(_partOffsetX));
+ persistMgr->transferSint32(TMEMBER(_partOffsetY));
return STATUS_OK;
}
diff --git a/engines/wintermute/ad/ad_object.h b/engines/wintermute/ad/ad_object.h
index 9e30f69855..35a734cd83 100644
--- a/engines/wintermute/ad/ad_object.h
+++ b/engines/wintermute/ad/ad_object.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -61,7 +61,7 @@ public:
bool reset();
DECLARE_PERSISTENT(AdObject, BaseObject)
virtual void talk(const char *text, const char *sound = nullptr, uint32 duration = 0, const char *stances = nullptr, TTextAlign align = TAL_CENTER);
- virtual int getHeight() override;
+ virtual int32 getHeight() override;
bool setFont(const char *filename);
virtual bool update() override;
diff --git a/engines/wintermute/ad/ad_path.cpp b/engines/wintermute/ad/ad_path.cpp
index 91a24cbf7d..4d5c313e52 100644
--- a/engines/wintermute/ad/ad_path.cpp
+++ b/engines/wintermute/ad/ad_path.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -110,9 +110,9 @@ bool AdPath::persist(BasePersistenceManager *persistMgr) {
persistMgr->transferPtr(TMEMBER_PTR(_gameRef));
- persistMgr->transfer(TMEMBER(_currIndex));
+ persistMgr->transferSint32(TMEMBER(_currIndex));
_points.persist(persistMgr);
- persistMgr->transfer(TMEMBER(_ready));
+ persistMgr->transferBool(TMEMBER(_ready));
return STATUS_OK;
}
diff --git a/engines/wintermute/ad/ad_path.h b/engines/wintermute/ad/ad_path.h
index 9de0bcad2c..8dbec5e4f0 100644
--- a/engines/wintermute/ad/ad_path.h
+++ b/engines/wintermute/ad/ad_path.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/wintermute/ad/ad_path_point.cpp b/engines/wintermute/ad/ad_path_point.cpp
index d5108ad8c1..6e20554034 100644
--- a/engines/wintermute/ad/ad_path_point.cpp
+++ b/engines/wintermute/ad/ad_path_point.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -65,8 +65,8 @@ bool AdPathPoint::persist(BasePersistenceManager *persistMgr) {
BasePoint::persist(persistMgr);
- persistMgr->transfer(TMEMBER(_distance));
- persistMgr->transfer(TMEMBER(_marked));
+ persistMgr->transferSint32(TMEMBER(_distance));
+ persistMgr->transferBool(TMEMBER(_marked));
persistMgr->transferPtr(TMEMBER_PTR(_origin));
return STATUS_OK;
diff --git a/engines/wintermute/ad/ad_path_point.h b/engines/wintermute/ad/ad_path_point.h
index 5e6b8c61ea..c375946f32 100644
--- a/engines/wintermute/ad/ad_path_point.h
+++ b/engines/wintermute/ad/ad_path_point.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/wintermute/ad/ad_region.cpp b/engines/wintermute/ad/ad_region.cpp
index 1c0cf41e86..89ad09fb8f 100644
--- a/engines/wintermute/ad/ad_region.cpp
+++ b/engines/wintermute/ad/ad_region.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -401,9 +401,9 @@ bool AdRegion::saveAsText(BaseDynamicBuffer *buffer, int indent) {
bool AdRegion::persist(BasePersistenceManager *persistMgr) {
BaseRegion::persist(persistMgr);
- persistMgr->transfer(TMEMBER(_alpha));
- persistMgr->transfer(TMEMBER(_blocked));
- persistMgr->transfer(TMEMBER(_decoration));
+ persistMgr->transferUint32(TMEMBER(_alpha));
+ persistMgr->transferBool(TMEMBER(_blocked));
+ persistMgr->transferBool(TMEMBER(_decoration));
persistMgr->transferFloat(TMEMBER(_zoom));
return STATUS_OK;
diff --git a/engines/wintermute/ad/ad_region.h b/engines/wintermute/ad/ad_region.h
index f3674dcbfb..2b5e468901 100644
--- a/engines/wintermute/ad/ad_region.h
+++ b/engines/wintermute/ad/ad_region.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/wintermute/ad/ad_response.cpp b/engines/wintermute/ad/ad_response.cpp
index fa05224b06..6ebe70bedb 100644
--- a/engines/wintermute/ad/ad_response.cpp
+++ b/engines/wintermute/ad/ad_response.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -134,10 +134,10 @@ bool AdResponse::persist(BasePersistenceManager *persistMgr) {
persistMgr->transferPtr(TMEMBER_PTR(_icon));
persistMgr->transferPtr(TMEMBER_PTR(_iconHover));
persistMgr->transferPtr(TMEMBER_PTR(_iconPressed));
- persistMgr->transfer(TMEMBER(_iD));
- persistMgr->transfer(TMEMBER(_text));
- persistMgr->transfer(TMEMBER(_textOrig));
- persistMgr->transfer(TMEMBER_INT(_responseType));
+ persistMgr->transferSint32(TMEMBER(_iD));
+ persistMgr->transferCharPtr(TMEMBER(_text));
+ persistMgr->transferCharPtr(TMEMBER(_textOrig));
+ persistMgr->transferSint32(TMEMBER_INT(_responseType));
persistMgr->transferPtr(TMEMBER_PTR(_font));
return STATUS_OK;
diff --git a/engines/wintermute/ad/ad_response.h b/engines/wintermute/ad/ad_response.h
index 00ebafbdb0..22aac01ff2 100644
--- a/engines/wintermute/ad/ad_response.h
+++ b/engines/wintermute/ad/ad_response.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/wintermute/ad/ad_response_box.cpp b/engines/wintermute/ad/ad_response_box.cpp
index 2a5adb9234..83c2ae74c6 100644
--- a/engines/wintermute/ad/ad_response_box.cpp
+++ b/engines/wintermute/ad/ad_response_box.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -58,7 +58,7 @@ AdResponseBox::AdResponseBox(BaseGame *inGame) : BaseObject(inGame) {
_shieldWindow = new UIWindow(_gameRef);
_horizontal = false;
- BasePlatform::setRectEmpty(&_responseArea);
+ _responseArea.setEmpty();
_scrollOffset = 0;
_spacing = 0;
@@ -583,20 +583,20 @@ bool AdResponseBox::persist(BasePersistenceManager *persistMgr) {
persistMgr->transferPtr(TMEMBER_PTR(_font));
persistMgr->transferPtr(TMEMBER_PTR(_fontHover));
- persistMgr->transfer(TMEMBER(_horizontal));
- persistMgr->transfer(TMEMBER(_lastResponseText));
- persistMgr->transfer(TMEMBER(_lastResponseTextOrig));
+ persistMgr->transferBool(TMEMBER(_horizontal));
+ persistMgr->transferCharPtr(TMEMBER(_lastResponseText));
+ persistMgr->transferCharPtr(TMEMBER(_lastResponseTextOrig));
_respButtons.persist(persistMgr);
- persistMgr->transfer(TMEMBER(_responseArea));
+ persistMgr->transferRect32(TMEMBER(_responseArea));
_responses.persist(persistMgr);
- persistMgr->transfer(TMEMBER(_scrollOffset));
+ persistMgr->transferSint32(TMEMBER(_scrollOffset));
persistMgr->transferPtr(TMEMBER_PTR(_shieldWindow));
- persistMgr->transfer(TMEMBER(_spacing));
+ persistMgr->transferSint32(TMEMBER(_spacing));
persistMgr->transferPtr(TMEMBER_PTR(_waitingScript));
persistMgr->transferPtr(TMEMBER_PTR(_window));
- persistMgr->transfer(TMEMBER_INT(_verticalAlign));
- persistMgr->transfer(TMEMBER_INT(_align));
+ persistMgr->transferSint32(TMEMBER_INT(_verticalAlign));
+ persistMgr->transferSint32(TMEMBER_INT(_align));
return STATUS_OK;
}
diff --git a/engines/wintermute/ad/ad_response_box.h b/engines/wintermute/ad/ad_response_box.h
index 9469bfda43..c808a7b5db 100644
--- a/engines/wintermute/ad/ad_response_box.h
+++ b/engines/wintermute/ad/ad_response_box.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/wintermute/ad/ad_response_context.cpp b/engines/wintermute/ad/ad_response_context.cpp
index 0b58f5ba0c..6d7d8d50a4 100644
--- a/engines/wintermute/ad/ad_response_context.cpp
+++ b/engines/wintermute/ad/ad_response_context.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -50,8 +50,8 @@ AdResponseContext::~AdResponseContext() {
//////////////////////////////////////////////////////////////////////////
bool AdResponseContext::persist(BasePersistenceManager *persistMgr) {
persistMgr->transferPtr(TMEMBER_PTR(_gameRef));
- persistMgr->transfer(TMEMBER(_context));
- persistMgr->transfer(TMEMBER(_id));
+ persistMgr->transferCharPtr(TMEMBER(_context));
+ persistMgr->transferSint32(TMEMBER(_id));
return STATUS_OK;
}
diff --git a/engines/wintermute/ad/ad_response_context.h b/engines/wintermute/ad/ad_response_context.h
index bc30b4a1c9..385ec2ded5 100644
--- a/engines/wintermute/ad/ad_response_context.h
+++ b/engines/wintermute/ad/ad_response_context.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/wintermute/ad/ad_rot_level.cpp b/engines/wintermute/ad/ad_rot_level.cpp
index b5bdc8ebe9..410ba22b53 100644
--- a/engines/wintermute/ad/ad_rot_level.cpp
+++ b/engines/wintermute/ad/ad_rot_level.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/wintermute/ad/ad_rot_level.h b/engines/wintermute/ad/ad_rot_level.h
index 47c621845a..f60dd0a5a9 100644
--- a/engines/wintermute/ad/ad_rot_level.h
+++ b/engines/wintermute/ad/ad_rot_level.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/wintermute/ad/ad_scale_level.cpp b/engines/wintermute/ad/ad_scale_level.cpp
index aa7f6f89cf..7e2eaa6f4f 100644
--- a/engines/wintermute/ad/ad_scale_level.cpp
+++ b/engines/wintermute/ad/ad_scale_level.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/wintermute/ad/ad_scale_level.h b/engines/wintermute/ad/ad_scale_level.h
index 768e79bbf7..4d6a83561f 100644
--- a/engines/wintermute/ad/ad_scale_level.h
+++ b/engines/wintermute/ad/ad_scale_level.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/wintermute/ad/ad_scene.cpp b/engines/wintermute/ad/ad_scene.cpp
index bc8d9e96d2..02a6aeb801 100644
--- a/engines/wintermute/ad/ad_scene.cpp
+++ b/engines/wintermute/ad/ad_scene.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -2041,6 +2041,10 @@ bool AdScene::scSetProperty(const char *name, ScValue *value) {
//////////////////////////////////////////////////////////////////////////
else if (strcmp(name, "ScrollSpeedX") == 0) {
_scrollTimeH = value->getInt();
+ if (_scrollTimeH == 0) {
+ warning("_scrollTimeH can't be 0, resetting to default");
+ _scrollTimeH = 10;
+ }
return STATUS_OK;
}
@@ -2049,6 +2053,10 @@ bool AdScene::scSetProperty(const char *name, ScValue *value) {
//////////////////////////////////////////////////////////////////////////
else if (strcmp(name, "ScrollSpeedY") == 0) {
_scrollTimeV = value->getInt();
+ if (_scrollTimeV == 0) {
+ warning("_scrollTimeV can't be 0, resetting to default");
+ _scrollTimeV = 10;
+ }
return STATUS_OK;
}
@@ -2300,58 +2308,58 @@ float AdScene::getScaleAt(int Y) {
bool AdScene::persist(BasePersistenceManager *persistMgr) {
BaseObject::persist(persistMgr);
- persistMgr->transfer(TMEMBER(_autoScroll));
- persistMgr->transfer(TMEMBER(_editorColBlocked));
- persistMgr->transfer(TMEMBER(_editorColBlockedSel));
- persistMgr->transfer(TMEMBER(_editorColDecor));
- persistMgr->transfer(TMEMBER(_editorColDecorSel));
- persistMgr->transfer(TMEMBER(_editorColEntity));
- persistMgr->transfer(TMEMBER(_editorColEntitySel));
- persistMgr->transfer(TMEMBER(_editorColFrame));
- persistMgr->transfer(TMEMBER(_editorColRegion));
- persistMgr->transfer(TMEMBER(_editorColRegionSel));
- persistMgr->transfer(TMEMBER(_editorColScale));
- persistMgr->transfer(TMEMBER(_editorColWaypoints));
- persistMgr->transfer(TMEMBER(_editorColWaypointsSel));
- persistMgr->transfer(TMEMBER(_editorMarginH));
- persistMgr->transfer(TMEMBER(_editorMarginV));
- persistMgr->transfer(TMEMBER(_editorShowBlocked));
- persistMgr->transfer(TMEMBER(_editorShowDecor));
- persistMgr->transfer(TMEMBER(_editorShowEntities));
- persistMgr->transfer(TMEMBER(_editorShowRegions));
- persistMgr->transfer(TMEMBER(_editorShowScale));
+ persistMgr->transferBool(TMEMBER(_autoScroll));
+ persistMgr->transferUint32(TMEMBER(_editorColBlocked));
+ persistMgr->transferUint32(TMEMBER(_editorColBlockedSel));
+ persistMgr->transferUint32(TMEMBER(_editorColDecor));
+ persistMgr->transferUint32(TMEMBER(_editorColDecorSel));
+ persistMgr->transferUint32(TMEMBER(_editorColEntity));
+ persistMgr->transferUint32(TMEMBER(_editorColEntitySel));
+ persistMgr->transferUint32(TMEMBER(_editorColFrame));
+ persistMgr->transferUint32(TMEMBER(_editorColRegion));
+ persistMgr->transferUint32(TMEMBER(_editorColRegionSel));
+ persistMgr->transferUint32(TMEMBER(_editorColScale));
+ persistMgr->transferUint32(TMEMBER(_editorColWaypoints));
+ persistMgr->transferUint32(TMEMBER(_editorColWaypointsSel));
+ persistMgr->transferSint32(TMEMBER(_editorMarginH));
+ persistMgr->transferSint32(TMEMBER(_editorMarginV));
+ persistMgr->transferBool(TMEMBER(_editorShowBlocked));
+ persistMgr->transferBool(TMEMBER(_editorShowDecor));
+ persistMgr->transferBool(TMEMBER(_editorShowEntities));
+ persistMgr->transferBool(TMEMBER(_editorShowRegions));
+ persistMgr->transferBool(TMEMBER(_editorShowScale));
persistMgr->transferPtr(TMEMBER_PTR(_fader));
- persistMgr->transfer(TMEMBER(_height));
- persistMgr->transfer(TMEMBER(_initialized));
- persistMgr->transfer(TMEMBER(_lastTimeH));
- persistMgr->transfer(TMEMBER(_lastTimeV));
+ persistMgr->transferSint32(TMEMBER(_height));
+ persistMgr->transferBool(TMEMBER(_initialized));
+ persistMgr->transferUint32(TMEMBER(_lastTimeH));
+ persistMgr->transferUint32(TMEMBER(_lastTimeV));
_layers.persist(persistMgr);
persistMgr->transferPtr(TMEMBER_PTR(_mainLayer));
_objects.persist(persistMgr);
- persistMgr->transfer(TMEMBER(_offsetLeft));
- persistMgr->transfer(TMEMBER(_offsetTop));
- persistMgr->transfer(TMEMBER(_paralaxScrolling));
- persistMgr->transfer(TMEMBER(_persistentState));
- persistMgr->transfer(TMEMBER(_persistentStateSprites));
- persistMgr->transfer(TMEMBER(_pfMaxTime));
+ persistMgr->transferSint32(TMEMBER(_offsetLeft));
+ persistMgr->transferSint32(TMEMBER(_offsetTop));
+ persistMgr->transferBool(TMEMBER(_paralaxScrolling));
+ persistMgr->transferBool(TMEMBER(_persistentState));
+ persistMgr->transferBool(TMEMBER(_persistentStateSprites));
+ persistMgr->transferUint32(TMEMBER(_pfMaxTime));
_pfPath.persist(persistMgr);
- persistMgr->transfer(TMEMBER(_pfPointsNum));
- persistMgr->transfer(TMEMBER(_pfReady));
+ persistMgr->transferSint32(TMEMBER(_pfPointsNum));
+ persistMgr->transferBool(TMEMBER(_pfReady));
persistMgr->transferPtr(TMEMBER_PTR(_pfRequester));
persistMgr->transferPtr(TMEMBER_PTR(_pfTarget));
persistMgr->transferPtr(TMEMBER_PTR(_pfTargetPath));
_rotLevels.persist(persistMgr);
_scaleLevels.persist(persistMgr);
- persistMgr->transfer(TMEMBER(_scrollPixelsH));
- persistMgr->transfer(TMEMBER(_scrollPixelsV));
- persistMgr->transfer(TMEMBER(_scrollTimeH));
- persistMgr->transfer(TMEMBER(_scrollTimeV));
+ persistMgr->transferSint32(TMEMBER(_scrollPixelsH));
+ persistMgr->transferSint32(TMEMBER(_scrollPixelsV));
+ persistMgr->transferUint32(TMEMBER(_scrollTimeH));
+ persistMgr->transferUint32(TMEMBER(_scrollTimeV));
persistMgr->transferPtr(TMEMBER_PTR(_shieldWindow));
- persistMgr->transfer(TMEMBER(_targetOffsetLeft));
- persistMgr->transfer(TMEMBER(_targetOffsetTop));
+ persistMgr->transferSint32(TMEMBER(_targetOffsetLeft));
+ persistMgr->transferSint32(TMEMBER(_targetOffsetTop));
_waypointGroups.persist(persistMgr);
persistMgr->transferPtr(TMEMBER_PTR(_viewport));
- persistMgr->transfer(TMEMBER(_width));
+ persistMgr->transferSint32(TMEMBER(_width));
return STATUS_OK;
}
diff --git a/engines/wintermute/ad/ad_scene.h b/engines/wintermute/ad/ad_scene.h
index 1f35a776b5..1ca52bdda9 100644
--- a/engines/wintermute/ad/ad_scene.h
+++ b/engines/wintermute/ad/ad_scene.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/wintermute/ad/ad_scene_node.cpp b/engines/wintermute/ad/ad_scene_node.cpp
index 8548da91db..e5d23d5f2a 100644
--- a/engines/wintermute/ad/ad_scene_node.cpp
+++ b/engines/wintermute/ad/ad_scene_node.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -74,7 +74,7 @@ bool AdSceneNode::persist(BasePersistenceManager *persistMgr) {
persistMgr->transferPtr(TMEMBER_PTR(_entity));
persistMgr->transferPtr(TMEMBER_PTR(_region));
- persistMgr->transfer(TMEMBER_INT(_type));
+ persistMgr->transferSint32(TMEMBER_INT(_type));
return STATUS_OK;
}
diff --git a/engines/wintermute/ad/ad_scene_node.h b/engines/wintermute/ad/ad_scene_node.h
index 5bb1606d0e..34b59cd587 100644
--- a/engines/wintermute/ad/ad_scene_node.h
+++ b/engines/wintermute/ad/ad_scene_node.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/wintermute/ad/ad_scene_state.cpp b/engines/wintermute/ad/ad_scene_state.cpp
index 58cb5f514a..d7c863792d 100644
--- a/engines/wintermute/ad/ad_scene_state.cpp
+++ b/engines/wintermute/ad/ad_scene_state.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -56,7 +56,7 @@ AdSceneState::~AdSceneState() {
//////////////////////////////////////////////////////////////////////////
bool AdSceneState::persist(BasePersistenceManager *persistMgr) {
- persistMgr->transfer(TMEMBER(_filename));
+ persistMgr->transferCharPtr(TMEMBER(_filename));
_nodeStates.persist(persistMgr);
return STATUS_OK;
diff --git a/engines/wintermute/ad/ad_scene_state.h b/engines/wintermute/ad/ad_scene_state.h
index 067c737b2e..90e39f3d51 100644
--- a/engines/wintermute/ad/ad_scene_state.h
+++ b/engines/wintermute/ad/ad_scene_state.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/wintermute/ad/ad_sentence.cpp b/engines/wintermute/ad/ad_sentence.cpp
index d5baa8291f..86ae06ad06 100644
--- a/engines/wintermute/ad/ad_sentence.cpp
+++ b/engines/wintermute/ad/ad_sentence.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -249,23 +249,23 @@ bool AdSentence::persist(BasePersistenceManager *persistMgr) {
persistMgr->transferPtr(TMEMBER_PTR(_gameRef));
- persistMgr->transfer(TMEMBER_INT(_align));
- persistMgr->transfer(TMEMBER(_currentStance));
+ persistMgr->transferSint32(TMEMBER_INT(_align));
+ persistMgr->transferSint32(TMEMBER(_currentStance));
persistMgr->transferPtr(TMEMBER_PTR(_currentSprite));
- persistMgr->transfer(TMEMBER(_currentSkelAnim));
- persistMgr->transfer(TMEMBER(_duration));
+ persistMgr->transferCharPtr(TMEMBER(_currentSkelAnim));
+ persistMgr->transferUint32(TMEMBER(_duration));
persistMgr->transferPtr(TMEMBER_PTR(_font));
- persistMgr->transfer(TMEMBER(_pos));
+ persistMgr->transferPoint32(TMEMBER(_pos));
persistMgr->transferPtr(TMEMBER_PTR(_sound));
- persistMgr->transfer(TMEMBER(_soundStarted));
- persistMgr->transfer(TMEMBER(_stances));
- persistMgr->transfer(TMEMBER(_startTime));
+ persistMgr->transferBool(TMEMBER(_soundStarted));
+ persistMgr->transferCharPtr(TMEMBER(_stances));
+ persistMgr->transferUint32(TMEMBER(_startTime));
persistMgr->transferPtr(TMEMBER_PTR(_talkDef));
- persistMgr->transfer(TMEMBER(_tempStance));
- persistMgr->transfer(TMEMBER(_text));
- persistMgr->transfer(TMEMBER(_width));
- persistMgr->transfer(TMEMBER(_fixedPos));
- persistMgr->transfer(TMEMBER(_freezable));
+ persistMgr->transferCharPtr(TMEMBER(_tempStance));
+ persistMgr->transferCharPtr(TMEMBER(_text));
+ persistMgr->transferSint32(TMEMBER(_width));
+ persistMgr->transferBool(TMEMBER(_fixedPos));
+ persistMgr->transferBool(TMEMBER(_freezable));
return STATUS_OK;
}
diff --git a/engines/wintermute/ad/ad_sentence.h b/engines/wintermute/ad/ad_sentence.h
index c491ad99a2..7d187786d4 100644
--- a/engines/wintermute/ad/ad_sentence.h
+++ b/engines/wintermute/ad/ad_sentence.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/wintermute/ad/ad_sprite_set.cpp b/engines/wintermute/ad/ad_sprite_set.cpp
index dd920492de..e598913ae6 100644
--- a/engines/wintermute/ad/ad_sprite_set.cpp
+++ b/engines/wintermute/ad/ad_sprite_set.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/wintermute/ad/ad_sprite_set.h b/engines/wintermute/ad/ad_sprite_set.h
index ece71f7adb..8590970126 100644
--- a/engines/wintermute/ad/ad_sprite_set.h
+++ b/engines/wintermute/ad/ad_sprite_set.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/wintermute/ad/ad_talk_def.cpp b/engines/wintermute/ad/ad_talk_def.cpp
index 1fdeed418f..6194121727 100644
--- a/engines/wintermute/ad/ad_talk_def.cpp
+++ b/engines/wintermute/ad/ad_talk_def.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -209,9 +209,9 @@ bool AdTalkDef::persist(BasePersistenceManager *persistMgr) {
BaseObject::persist(persistMgr);
persistMgr->transferPtr(TMEMBER_PTR(_defaultSprite));
- persistMgr->transfer(TMEMBER(_defaultSpriteFilename));
+ persistMgr->transferCharPtr(TMEMBER(_defaultSpriteFilename));
persistMgr->transferPtr(TMEMBER_PTR(_defaultSpriteSet));
- persistMgr->transfer(TMEMBER(_defaultSpriteSetFilename));
+ persistMgr->transferCharPtr(TMEMBER(_defaultSpriteSetFilename));
_nodes.persist(persistMgr);
diff --git a/engines/wintermute/ad/ad_talk_def.h b/engines/wintermute/ad/ad_talk_def.h
index 5711906b4b..a19c504955 100644
--- a/engines/wintermute/ad/ad_talk_def.h
+++ b/engines/wintermute/ad/ad_talk_def.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/wintermute/ad/ad_talk_holder.cpp b/engines/wintermute/ad/ad_talk_holder.cpp
index 6041105b93..116d3edd21 100644
--- a/engines/wintermute/ad/ad_talk_holder.cpp
+++ b/engines/wintermute/ad/ad_talk_holder.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/wintermute/ad/ad_talk_holder.h b/engines/wintermute/ad/ad_talk_holder.h
index ab48c3aaf4..b5f8f48318 100644
--- a/engines/wintermute/ad/ad_talk_holder.h
+++ b/engines/wintermute/ad/ad_talk_holder.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/wintermute/ad/ad_talk_node.cpp b/engines/wintermute/ad/ad_talk_node.cpp
index eca4535288..f4612122da 100644
--- a/engines/wintermute/ad/ad_talk_node.cpp
+++ b/engines/wintermute/ad/ad_talk_node.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -191,14 +191,14 @@ bool AdTalkNode::loadBuffer(char *buffer, bool complete) {
//////////////////////////////////////////////////////////////////////////
bool AdTalkNode::persist(BasePersistenceManager *persistMgr) {
- persistMgr->transfer(TMEMBER(_comment));
- persistMgr->transfer(TMEMBER(_startTime));
- persistMgr->transfer(TMEMBER(_endTime));
- persistMgr->transfer(TMEMBER(_playToEnd));
+ persistMgr->transferCharPtr(TMEMBER(_comment));
+ persistMgr->transferUint32(TMEMBER(_startTime));
+ persistMgr->transferUint32(TMEMBER(_endTime));
+ persistMgr->transferBool(TMEMBER(_playToEnd));
persistMgr->transferPtr(TMEMBER_PTR(_sprite));
- persistMgr->transfer(TMEMBER(_spriteFilename));
+ persistMgr->transferCharPtr(TMEMBER(_spriteFilename));
persistMgr->transferPtr(TMEMBER_PTR(_spriteSet));
- persistMgr->transfer(TMEMBER(_spriteSetFilename));
+ persistMgr->transferCharPtr(TMEMBER(_spriteSetFilename));
return STATUS_OK;
}
diff --git a/engines/wintermute/ad/ad_talk_node.h b/engines/wintermute/ad/ad_talk_node.h
index 7a014b2d9f..e619edf7c2 100644
--- a/engines/wintermute/ad/ad_talk_node.h
+++ b/engines/wintermute/ad/ad_talk_node.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/wintermute/ad/ad_types.h b/engines/wintermute/ad/ad_types.h
index dc1a54b91d..931e38974c 100644
--- a/engines/wintermute/ad/ad_types.h
+++ b/engines/wintermute/ad/ad_types.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/wintermute/ad/ad_waypoint_group.cpp b/engines/wintermute/ad/ad_waypoint_group.cpp
index f7735a4d9b..25d7f83264 100644
--- a/engines/wintermute/ad/ad_waypoint_group.cpp
+++ b/engines/wintermute/ad/ad_waypoint_group.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -194,11 +194,11 @@ bool AdWaypointGroup::persist(BasePersistenceManager *persistMgr) {
BaseObject::persist(persistMgr);
- persistMgr->transfer(TMEMBER(_active));
- persistMgr->transfer(TMEMBER(_editorSelectedPoint));
+ persistMgr->transferBool(TMEMBER(_active));
+ persistMgr->transferSint32(TMEMBER(_editorSelectedPoint));
persistMgr->transferFloat(TMEMBER(_lastMimicScale));
- persistMgr->transfer(TMEMBER(_lastMimicX));
- persistMgr->transfer(TMEMBER(_lastMimicY));
+ persistMgr->transferSint32(TMEMBER(_lastMimicX));
+ persistMgr->transferSint32(TMEMBER(_lastMimicY));
_points.persist(persistMgr);
return STATUS_OK;
diff --git a/engines/wintermute/ad/ad_waypoint_group.h b/engines/wintermute/ad/ad_waypoint_group.h
index 47fd611be6..32d5e9b764 100644
--- a/engines/wintermute/ad/ad_waypoint_group.h
+++ b/engines/wintermute/ad/ad_waypoint_group.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/wintermute/base/base.cpp b/engines/wintermute/base/base.cpp
index 91ca30db70..90a3a62d69 100644
--- a/engines/wintermute/base/base.cpp
+++ b/engines/wintermute/base/base.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -60,7 +60,7 @@ Common::String BaseClass::getEditorProp(const Common::String &propName, const Co
if (_editorPropsIter != _editorProps.end()) {
return _editorPropsIter->_value.c_str();
} else {
- return initVal;
+ return initVal; // Used to be NULL
}
}
diff --git a/engines/wintermute/base/base.h b/engines/wintermute/base/base.h
index f4b0976019..e6ed7c51fe 100644
--- a/engines/wintermute/base/base.h
+++ b/engines/wintermute/base/base.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -44,7 +44,7 @@ class BaseClass {
public:
bool _persistable;
bool setEditorProp(const Common::String &propName, const Common::String &propValue);
- Common::String getEditorProp(const Common::String &propName, const Common::String &initVal = nullptr);
+ Common::String getEditorProp(const Common::String &propName, const Common::String &initVal = Common::String());
BaseClass(TDynamicConstructor, TDynamicConstructor) {}
bool parseEditorProperty(char *buffer, bool complete = true);
virtual bool saveAsText(BaseDynamicBuffer *buffer, int indent = 0);
diff --git a/engines/wintermute/base/base_active_rect.cpp b/engines/wintermute/base/base_active_rect.cpp
index abeaa18d54..0c5d16966f 100644
--- a/engines/wintermute/base/base_active_rect.cpp
+++ b/engines/wintermute/base/base_active_rect.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -37,7 +37,7 @@ namespace Wintermute {
//////////////////////////////////////////////////////////////////////
BaseActiveRect::BaseActiveRect(BaseGame *inGame) : BaseClass(inGame) {
- BasePlatform::setRectEmpty(&_rect);
+ _rect.setEmpty();
_owner = nullptr;
_frame = nullptr;
_region = nullptr;
@@ -52,7 +52,7 @@ BaseActiveRect::BaseActiveRect(BaseGame *inGame) : BaseClass(inGame) {
BaseActiveRect::BaseActiveRect(BaseGame *inGame, BaseObject *owner, BaseSubFrame *frame, int x, int y, int width, int height, float zoomX, float zoomY, bool precise) : BaseClass(inGame) {
_owner = owner;
_frame = frame;
- BasePlatform::setRect(&_rect, x, y, x + width, y + height);
+ _rect.setRect(x, y, x + width, y + height);
_zoomX = zoomX;
_zoomY = zoomY;
_precise = precise;
diff --git a/engines/wintermute/base/base_active_rect.h b/engines/wintermute/base/base_active_rect.h
index a3c0746618..29acc595d1 100644
--- a/engines/wintermute/base/base_active_rect.h
+++ b/engines/wintermute/base/base_active_rect.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/wintermute/base/base_dynamic_buffer.cpp b/engines/wintermute/base/base_dynamic_buffer.cpp
index 5334ae46c4..7187a78769 100644
--- a/engines/wintermute/base/base_dynamic_buffer.cpp
+++ b/engines/wintermute/base/base_dynamic_buffer.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/wintermute/base/base_dynamic_buffer.h b/engines/wintermute/base/base_dynamic_buffer.h
index 2804d78895..6662e36dfd 100644
--- a/engines/wintermute/base/base_dynamic_buffer.h
+++ b/engines/wintermute/base/base_dynamic_buffer.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/wintermute/base/base_engine.cpp b/engines/wintermute/base/base_engine.cpp
index acb12bbe5f..7c2e9c8468 100644
--- a/engines/wintermute/base/base_engine.cpp
+++ b/engines/wintermute/base/base_engine.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/wintermute/base/base_engine.h b/engines/wintermute/base/base_engine.h
index a5eafd3597..dd82cf9c29 100644
--- a/engines/wintermute/base/base_engine.h
+++ b/engines/wintermute/base/base_engine.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/wintermute/base/base_fader.cpp b/engines/wintermute/base/base_fader.cpp
index 7978230964..f9c4d1cba5 100644
--- a/engines/wintermute/base/base_fader.cpp
+++ b/engines/wintermute/base/base_fader.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -175,16 +175,16 @@ uint32 BaseFader::getCurrentColor() const {
bool BaseFader::persist(BasePersistenceManager *persistMgr) {
BaseObject::persist(persistMgr);
- persistMgr->transfer(TMEMBER(_active));
- persistMgr->transfer(TMEMBER(_blue));
- persistMgr->transfer(TMEMBER(_currentAlpha));
- persistMgr->transfer(TMEMBER(_duration));
- persistMgr->transfer(TMEMBER(_green));
- persistMgr->transfer(TMEMBER(_red));
- persistMgr->transfer(TMEMBER(_sourceAlpha));
- persistMgr->transfer(TMEMBER(_startTime));
- persistMgr->transfer(TMEMBER(_targetAlpha));
- persistMgr->transfer(TMEMBER(_system));
+ persistMgr->transferBool(TMEMBER(_active));
+ persistMgr->transferByte(TMEMBER(_blue));
+ persistMgr->transferByte(TMEMBER(_currentAlpha));
+ persistMgr->transferUint32(TMEMBER(_duration));
+ persistMgr->transferByte(TMEMBER(_green));
+ persistMgr->transferByte(TMEMBER(_red));
+ persistMgr->transferByte(TMEMBER(_sourceAlpha));
+ persistMgr->transferUint32(TMEMBER(_startTime));
+ persistMgr->transferByte(TMEMBER(_targetAlpha));
+ persistMgr->transferBool(TMEMBER(_system));
if (_system && !persistMgr->getIsSaving()) {
_startTime = 0;
diff --git a/engines/wintermute/base/base_fader.h b/engines/wintermute/base/base_fader.h
index 087b19bc44..f742954c3d 100644
--- a/engines/wintermute/base/base_fader.h
+++ b/engines/wintermute/base/base_fader.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/wintermute/base/base_file_manager.cpp b/engines/wintermute/base/base_file_manager.cpp
index bea7e53445..1f78303f52 100644
--- a/engines/wintermute/base/base_file_manager.cpp
+++ b/engines/wintermute/base/base_file_manager.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -168,15 +168,20 @@ bool BaseFileManager::initPaths() {
if (languageSubFolder.exists()) {
addPath(PATH_PACKAGE, languageSubFolder);
}
+ // Also add languages/ for Reversion1.
+ languageSubFolder = gameData.getChild("languages");
+ if (languageSubFolder.exists()) {
+ addPath(PATH_PACKAGE, languageSubFolder);
+ }
return STATUS_OK;
}
bool BaseFileManager::registerPackages(const Common::FSList &fslist) {
for (Common::FSList::const_iterator it = fslist.begin(); it != fslist.end(); ++it) {
- debugC(kWintermuteDebugFileAccess, "Adding %s", (*it).getName().c_str());
- if ((*it).getName().contains(".dcp")) {
- if (registerPackage((*it))) {
- addPath(PATH_PACKAGE, (*it));
+ debugC(kWintermuteDebugFileAccess, "Adding %s", it->getName().c_str());
+ if (it->getName().contains(".dcp")) {
+ if (registerPackage(*it)) {
+ addPath(PATH_PACKAGE, *it);
}
}
}
@@ -187,36 +192,77 @@ bool BaseFileManager::registerPackages(const Common::FSList &fslist) {
bool BaseFileManager::registerPackages() {
debugC(kWintermuteDebugFileAccess | kWintermuteDebugLog, "Scanning packages");
+ // We need the target name as a Common::String to perform some game-specific hacks.
+ Common::String targetName = BaseEngine::instance().getGameTargetName();
+
// Register without using SearchMan, as otherwise the FSNode-based lookup in openPackage will fail
// and that has to be like that to support the detection-scheme.
Common::FSList files;
- for (Common::FSList::iterator it = _packagePaths.begin(); it != _packagePaths.end(); ++it) {
- debugC(kWintermuteDebugFileAccess, "Should register folder: %s %s", (*it).getPath().c_str(), (*it).getName().c_str());
- if (!(*it).getChildren(files, Common::FSNode::kListFilesOnly)) {
- warning("getChildren() failed for path: %s", (*it).getDisplayName().c_str());
+ for (Common::FSList::const_iterator it = _packagePaths.begin(); it != _packagePaths.end(); ++it) {
+ debugC(kWintermuteDebugFileAccess, "Should register folder: %s %s", it->getPath().c_str(), it->getName().c_str());
+ if (!it->getChildren(files, Common::FSNode::kListFilesOnly)) {
+ warning("getChildren() failed for path: %s", it->getDisplayName().c_str());
}
- for (Common::FSList::iterator fileIt = files.begin(); fileIt != files.end(); ++fileIt) {
- if (!fileIt->getName().hasSuffix(".dcp")) {
+ for (Common::FSList::const_iterator fileIt = files.begin(); fileIt != files.end(); ++fileIt) {
+ // To prevent any case sensitivity issues we make the filename
+ // all lowercase here. This makes the code slightly prettier
+ // than the equivalent of using equalsIgnoreCase.
+ Common::String fileName = fileIt->getName();
+ fileName.toLowercase();
+
+ if (!fileName.hasSuffix(".dcp")) {
continue;
}
+ // HACK: for Reversion1, avoid loading xlanguage_pt.dcp from the main folder:
+ if (_language != Common::PT_BRA && targetName.hasPrefix("reversion1")) {
+ if (fileName == "xlanguage_pt.dcp") {
+ continue;
+ }
+ }
+
+ // Again, make the parent's name all lowercase to avoid any case
+ // issues.
+ Common::String parentName = fileIt->getParent().getName();
+ parentName.toLowercase();
+
// Avoid registering all the language files
// TODO: Select based on the gameDesc.
- if (_language != Common::UNK_LANG && fileIt->getParent().getName() == "language") {
- Common::String parentName = fileIt->getParent().getName();
- Common::String dcpName = fileIt->getName();
- if (_language == Common::EN_ANY && fileIt->getName() != "english.dcp") {
+ if (_language != Common::UNK_LANG && (parentName == "language" || parentName == "languages")) {
+ // English
+ if (_language == Common::EN_ANY && (fileName != "english.dcp" && fileName != "xlanguage_en.dcp")) {
+ continue;
+ // Chinese
+ } else if (_language == Common::ZH_CNA && (fileName != "chinese.dcp" && fileName != "xlanguage_nz.dcp")) {
+ continue;
+ // Czech
+ } else if (_language == Common::CZ_CZE && (fileName != "czech.dcp" && fileName != "xlanguage_cz.dcp")) {
+ continue;
+ // French
+ } else if (_language == Common::FR_FRA && (fileName != "french.dcp" && fileName != "xlanguage_fr.dcp")) {
+ continue;
+ // German
+ } else if (_language == Common::DE_DEU && (fileName != "german.dcp" && fileName != "xlanguage_de.dcp")) {
+ continue;
+ // Italian
+ } else if (_language == Common::IT_ITA && (fileName != "italian.dcp" && fileName != "xlanguage_it.dcp")) {
continue;
- } else if (_language == Common::CZ_CZE && fileIt->getName() != "czech.dcp") {
+ // Latvian
+ } else if (_language == Common::LV_LAT && (fileName != "latvian.dcp" && fileName != "xlanguage_lv.dcp")) {
+ // TODO: 'latvian.dcp' is just guesswork. Is there any
+ // game using Latvian and using this filename?
continue;
- } else if (_language == Common::IT_ITA && fileIt->getName() != "italian.dcp") {
+ // Polish
+ } else if (_language == Common::PL_POL && (fileName != "polish.dcp" && fileName != "xlanguage_pl.dcp")) {
continue;
- } else if (_language == Common::PL_POL && fileIt->getName() != "polish.dcp") {
+ // Portuguese
+ } else if (_language == Common::PT_BRA && (fileName != "portuguese.dcp" && fileName != "xlanguage_pt.dcp")) {
continue;
- } else if (_language == Common::RU_RUS && fileIt->getName() != "russian.dcp") {
+ // Russian
+ } else if (_language == Common::RU_RUS && (fileName != "russian.dcp" && fileName != "xlanguage_ru.dcp")) {
continue;
}
}
- debugC(kWintermuteDebugFileAccess, "Registering %s %s", (*fileIt).getPath().c_str(), (*fileIt).getName().c_str());
+ debugC(kWintermuteDebugFileAccess, "Registering %s %s", fileIt->getPath().c_str(), fileIt->getName().c_str());
registerPackage((*fileIt));
}
}
@@ -250,8 +296,6 @@ Common::SeekableReadStream *BaseFileManager::openPkgFile(const Common::String &f
Common::String upcName = filename;
upcName.toUppercase();
Common::SeekableReadStream *file = nullptr;
- char fileName[MAX_PATH_LENGTH];
- Common::strlcpy(fileName, upcName.c_str(), MAX_PATH_LENGTH);
// correct slashes
for (uint32 i = 0; i < upcName.size(); i++) {
diff --git a/engines/wintermute/base/base_file_manager.h b/engines/wintermute/base/base_file_manager.h
index 8c2876f681..653721c8f5 100644
--- a/engines/wintermute/base/base_file_manager.h
+++ b/engines/wintermute/base/base_file_manager.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/wintermute/base/base_frame.cpp b/engines/wintermute/base/base_frame.cpp
index 1af8be02dd..f2c24b8f6a 100644
--- a/engines/wintermute/base/base_frame.cpp
+++ b/engines/wintermute/base/base_frame.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -181,7 +181,7 @@ bool BaseFrame::loadBuffer(char *buffer, int lifeTime, bool keepLoaded) {
bool decoration = false;
bool mirrorX = false;
bool mirrorY = false;
- BasePlatform::setRectEmpty(&rect);
+ rect.setEmpty();
char *surface_file = nullptr;
while ((cmd = parser.getCommand(&buffer, commands, &params)) > 0) {
@@ -325,7 +325,7 @@ bool BaseFrame::loadBuffer(char *buffer, int lifeTime, bool keepLoaded) {
}
}
- if (BasePlatform::isRectEmpty(&rect)) {
+ if (rect.isRectEmpty()) {
sub->setDefaultRect();
} else {
sub->setRect(rect);
@@ -352,7 +352,7 @@ bool BaseFrame::getBoundingRect(Rect32 *rect, int x, int y, float scaleX, float
if (!rect) {
return false;
}
- BasePlatform::setRectEmpty(rect);
+ rect->setEmpty();
Rect32 subRect;
@@ -414,12 +414,12 @@ bool BaseFrame::persist(BasePersistenceManager *persistMgr) {
BaseScriptable::persist(persistMgr);
_applyEvent.persist(persistMgr);
- persistMgr->transfer(TMEMBER(_delay));
- persistMgr->transfer(TMEMBER(_editorExpanded));
- persistMgr->transfer(TMEMBER(_keyframe));
- persistMgr->transfer(TMEMBER(_killSound));
- persistMgr->transfer(TMEMBER(_moveX));
- persistMgr->transfer(TMEMBER(_moveY));
+ persistMgr->transferUint32(TMEMBER(_delay));
+ persistMgr->transferBool(TMEMBER(_editorExpanded));
+ persistMgr->transferBool(TMEMBER(_keyframe));
+ persistMgr->transferBool(TMEMBER(_killSound));
+ persistMgr->transferSint32(TMEMBER(_moveX));
+ persistMgr->transferSint32(TMEMBER(_moveY));
persistMgr->transferPtr(TMEMBER_PTR(_sound));
_subframes.persist(persistMgr);
diff --git a/engines/wintermute/base/base_frame.h b/engines/wintermute/base/base_frame.h
index c4cfc443fa..49a56592bb 100644
--- a/engines/wintermute/base/base_frame.h
+++ b/engines/wintermute/base/base_frame.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/wintermute/base/base_game.cpp b/engines/wintermute/base/base_game.cpp
index 0d8af0ce8a..d37a22e2a6 100644
--- a/engines/wintermute/base/base_game.cpp
+++ b/engines/wintermute/base/base_game.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -185,7 +185,7 @@ BaseGame::BaseGame(const Common::String &targetName) : BaseObject(this), _target
_lastCursor = nullptr;
- BasePlatform::setRectEmpty(&_mouseLockRect);
+ _mouseLockRect.setEmpty();
_suppressScriptErrors = false;
_lastMiniUpdate = 0;
@@ -1123,7 +1123,7 @@ bool BaseGame::scCallMethod(ScScript *script, ScStack *stack, ScStack *thisStack
BaseUtils::swap(&top, &bottom);
}
- BasePlatform::setRect(&_mouseLockRect, left, top, right, bottom);
+ _mouseLockRect.setRect(left, top, right, bottom);
stack->pushNULL();
return STATUS_OK;
@@ -3054,61 +3054,61 @@ bool BaseGame::persist(BasePersistenceManager *persistMgr) {
persistMgr->transferPtr(TMEMBER_PTR(_activeObject));
persistMgr->transferPtr(TMEMBER_PTR(_capturedObject));
persistMgr->transferPtr(TMEMBER_PTR(_cursorNoninteractive));
- persistMgr->transfer(TMEMBER(_editorMode));
+ persistMgr->transferBool(TMEMBER(_editorMode));
persistMgr->transferPtr(TMEMBER_PTR(_fader));
- persistMgr->transfer(TMEMBER(_freezeLevel));
+ persistMgr->transferSint32(TMEMBER(_freezeLevel));
persistMgr->transferPtr(TMEMBER_PTR(_focusedWindow));
persistMgr->transferPtr(TMEMBER_PTR(_fontStorage));
- persistMgr->transfer(TMEMBER(_interactive));
+ persistMgr->transferBool(TMEMBER(_interactive));
persistMgr->transferPtr(TMEMBER_PTR(_keyboardState));
- persistMgr->transfer(TMEMBER(_lastTime));
+ persistMgr->transferUint32(TMEMBER(_lastTime));
persistMgr->transferPtr(TMEMBER_PTR(_mainObject));
_musicSystem->persistChannels(persistMgr);
_musicSystem->persistCrossfadeSettings(persistMgr);
- persistMgr->transfer(TMEMBER(_offsetX));
- persistMgr->transfer(TMEMBER(_offsetY));
+ persistMgr->transferSint32(TMEMBER(_offsetX));
+ persistMgr->transferSint32(TMEMBER(_offsetY));
persistMgr->transferFloat(TMEMBER(_offsetPercentX));
persistMgr->transferFloat(TMEMBER(_offsetPercentY));
- persistMgr->transfer(TMEMBER(_origInteractive));
- persistMgr->transfer(TMEMBER_INT(_origState));
- persistMgr->transfer(TMEMBER(_personalizedSave));
- persistMgr->transfer(TMEMBER(_quitting));
+ persistMgr->transferBool(TMEMBER(_origInteractive));
+ persistMgr->transferSint32(TMEMBER_INT(_origState));
+ persistMgr->transferBool(TMEMBER(_personalizedSave));
+ persistMgr->transferBool(TMEMBER(_quitting));
_regObjects.persist(persistMgr);
persistMgr->transferPtr(TMEMBER_PTR(_scEngine));
//persistMgr->transfer(TMEMBER(_soundMgr));
- persistMgr->transfer(TMEMBER_INT(_state));
+ persistMgr->transferSint32(TMEMBER_INT(_state));
//persistMgr->transfer(TMEMBER(_surfaceStorage));
- persistMgr->transfer(TMEMBER(_subtitles));
- persistMgr->transfer(TMEMBER(_subtitlesSpeed));
+ persistMgr->transferBool(TMEMBER(_subtitles));
+ persistMgr->transferSint32(TMEMBER(_subtitlesSpeed));
persistMgr->transferPtr(TMEMBER_PTR(_systemFont));
persistMgr->transferPtr(TMEMBER_PTR(_videoFont));
- persistMgr->transfer(TMEMBER(_videoSubtitles));
+ persistMgr->transferBool(TMEMBER(_videoSubtitles));
_timerNormal.persist(persistMgr);
_timerLive.persist(persistMgr);
_renderer->persistSaveLoadImages(persistMgr);
- persistMgr->transfer(TMEMBER_INT(_textEncoding));
- persistMgr->transfer(TMEMBER(_textRTL));
+ persistMgr->transferSint32(TMEMBER_INT(_textEncoding));
+ persistMgr->transferBool(TMEMBER(_textRTL));
- persistMgr->transfer(TMEMBER(_soundBufferSizeSec));
- persistMgr->transfer(TMEMBER(_suspendedRendering));
+ persistMgr->transferSint32(TMEMBER(_soundBufferSizeSec));
+ persistMgr->transferBool(TMEMBER(_suspendedRendering));
- persistMgr->transfer(TMEMBER(_mouseLockRect));
+ persistMgr->transferRect32(TMEMBER(_mouseLockRect));
_windows.persist(persistMgr);
- persistMgr->transfer(TMEMBER(_suppressScriptErrors));
- persistMgr->transfer(TMEMBER(_autorunDisabled));
+ persistMgr->transferBool(TMEMBER(_suppressScriptErrors));
+ persistMgr->transferBool(TMEMBER(_autorunDisabled));
- persistMgr->transfer(TMEMBER(_autoSaveOnExit));
- persistMgr->transfer(TMEMBER(_autoSaveSlot));
- persistMgr->transfer(TMEMBER(_cursorHidden));
+ persistMgr->transferBool(TMEMBER(_autoSaveOnExit));
+ persistMgr->transferUint32(TMEMBER(_autoSaveSlot));
+ persistMgr->transferBool(TMEMBER(_cursorHidden));
if (!persistMgr->getIsSaving()) {
_quitting = false;
@@ -3361,10 +3361,10 @@ bool BaseGame::getCurrentViewportRect(Rect32 *rect, bool *custom) const {
*custom = true;
}
} else {
- BasePlatform::setRect(rect, _renderer->_drawOffsetX,
- _renderer->_drawOffsetY,
- _renderer->getWidth() + _renderer->_drawOffsetX,
- _renderer->getHeight() + _renderer->_drawOffsetY);
+ rect->setRect(_renderer->_drawOffsetX,
+ _renderer->_drawOffsetY,
+ _renderer->getWidth() + _renderer->_drawOffsetX,
+ _renderer->getHeight() + _renderer->_drawOffsetY);
if (custom) {
*custom = false;
}
@@ -3577,7 +3577,6 @@ bool BaseGame::onMouseLeftDown() {
_capturedObject = _activeObject;
}
_mouseLeftDown = true;
- BasePlatform::setCapture(/*_renderer->_window*/);
return STATUS_OK;
}
@@ -3588,7 +3587,6 @@ bool BaseGame::onMouseLeftUp() {
_activeObject->handleMouse(MOUSE_RELEASE, MOUSE_BUTTON_LEFT);
}
- BasePlatform::releaseCapture();
_capturedObject = nullptr;
_mouseLeftDown = false;
diff --git a/engines/wintermute/base/base_game.h b/engines/wintermute/base/base_game.h
index 742d6f548d..cdbbff6c93 100644
--- a/engines/wintermute/base/base_game.h
+++ b/engines/wintermute/base/base_game.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -251,6 +251,8 @@ public:
void addMem(int32 bytes);
bool _touchInterface;
bool _constrainedMemory;
+
+ bool stopVideo();
protected:
BaseFont *_systemFont;
BaseFont *_videoFont;
@@ -319,7 +321,6 @@ private:
BaseGameMusic *_musicSystem;
bool isVideoPlaying();
- bool stopVideo();
BaseArray<BaseQuickMsg *> _quickMessages;
BaseArray<UIWindow *> _windows;
diff --git a/engines/wintermute/base/base_game_music.cpp b/engines/wintermute/base/base_game_music.cpp
index c50969df76..fee7c7be2d 100644
--- a/engines/wintermute/base/base_game_music.cpp
+++ b/engines/wintermute/base/base_game_music.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -215,18 +215,18 @@ bool BaseGameMusic::updateMusicCrossfade() {
bool BaseGameMusic::persistChannels(BasePersistenceManager *persistMgr) {
for (int i = 0; i < NUM_MUSIC_CHANNELS; i++) {
persistMgr->transferPtr(TMEMBER_PTR(_music[i]));
- persistMgr->transfer(TMEMBER(_musicStartTime[i]));
+ persistMgr->transferUint32(TMEMBER(_musicStartTime[i]));
}
return true;
}
bool BaseGameMusic::persistCrossfadeSettings(BasePersistenceManager *persistMgr) {
- persistMgr->transfer(TMEMBER(_musicCrossfadeRunning));
- persistMgr->transfer(TMEMBER(_musicCrossfadeStartTime));
- persistMgr->transfer(TMEMBER(_musicCrossfadeLength));
- persistMgr->transfer(TMEMBER(_musicCrossfadeChannel1));
- persistMgr->transfer(TMEMBER(_musicCrossfadeChannel2));
- persistMgr->transfer(TMEMBER(_musicCrossfadeSwap));
+ persistMgr->transferBool(TMEMBER(_musicCrossfadeRunning));
+ persistMgr->transferUint32(TMEMBER(_musicCrossfadeStartTime));
+ persistMgr->transferUint32(TMEMBER(_musicCrossfadeLength));
+ persistMgr->transferSint32(TMEMBER(_musicCrossfadeChannel1));
+ persistMgr->transferSint32(TMEMBER(_musicCrossfadeChannel2));
+ persistMgr->transferBool(TMEMBER(_musicCrossfadeSwap));
return true;
}
diff --git a/engines/wintermute/base/base_game_music.h b/engines/wintermute/base/base_game_music.h
index 72c7a171a6..1e786dbb2b 100644
--- a/engines/wintermute/base/base_game_music.h
+++ b/engines/wintermute/base/base_game_music.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/wintermute/base/base_game_settings.cpp b/engines/wintermute/base/base_game_settings.cpp
index 43809b5d1e..3b54384cc7 100644
--- a/engines/wintermute/base/base_game_settings.cpp
+++ b/engines/wintermute/base/base_game_settings.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/wintermute/base/base_game_settings.h b/engines/wintermute/base/base_game_settings.h
index 38a2fd1042..fe0e9907e6 100644
--- a/engines/wintermute/base/base_game_settings.h
+++ b/engines/wintermute/base/base_game_settings.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/wintermute/base/base_keyboard_state.cpp b/engines/wintermute/base/base_keyboard_state.cpp
index aeb56ad282..61087c5836 100644
--- a/engines/wintermute/base/base_keyboard_state.cpp
+++ b/engines/wintermute/base/base_keyboard_state.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -221,12 +221,12 @@ bool BaseKeyboardState::persist(BasePersistenceManager *persistMgr) {
//if (!persistMgr->getIsSaving()) cleanup();
BaseScriptable::persist(persistMgr);
- persistMgr->transfer(TMEMBER(_currentAlt));
- persistMgr->transfer(TMEMBER(_currentCharCode));
- persistMgr->transfer(TMEMBER(_currentControl));
- persistMgr->transfer(TMEMBER(_currentKeyData));
- persistMgr->transfer(TMEMBER(_currentPrintable));
- persistMgr->transfer(TMEMBER(_currentShift));
+ persistMgr->transferBool(TMEMBER(_currentAlt));
+ persistMgr->transferUint32(TMEMBER(_currentCharCode));
+ persistMgr->transferBool(TMEMBER(_currentControl));
+ persistMgr->transferUint32(TMEMBER(_currentKeyData));
+ persistMgr->transferBool(TMEMBER(_currentPrintable));
+ persistMgr->transferBool(TMEMBER(_currentShift));
if (!persistMgr->getIsSaving()) {
_keyStates = new uint8[323]; // Hardcoded size for the common/keyboard.h enum
@@ -276,17 +276,21 @@ uint32 BaseKeyboardState::keyCodeToVKey(Common::Event *event) {
}
enum VKeyCodes {
- kVkSpace = 32,
- kVkLeft = 37,
- kVkUp = 38,
- kVkRight = 39,
- kVkDown = 40
+ kVkEscape = 27,
+ kVkSpace = 32,
+ kVkLeft = 37,
+ kVkUp = 38,
+ kVkRight = 39,
+ kVkDown = 40
};
//////////////////////////////////////////////////////////////////////////
Common::KeyCode BaseKeyboardState::vKeyToKeyCode(uint32 vkey) {
// todo
switch (vkey) {
+ case kVkEscape:
+ return Common::KEYCODE_ESCAPE;
+ break;
case kVkSpace:
return Common::KEYCODE_SPACE;
break;
diff --git a/engines/wintermute/base/base_keyboard_state.h b/engines/wintermute/base/base_keyboard_state.h
index 14a57ee7b8..c74bd5b0f7 100644
--- a/engines/wintermute/base/base_keyboard_state.h
+++ b/engines/wintermute/base/base_keyboard_state.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/wintermute/base/base_named_object.cpp b/engines/wintermute/base/base_named_object.cpp
index 3d1df5ab84..5bfc978299 100644
--- a/engines/wintermute/base/base_named_object.cpp
+++ b/engines/wintermute/base/base_named_object.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/wintermute/base/base_named_object.h b/engines/wintermute/base/base_named_object.h
index ee4a3bba6a..a337eae82d 100644
--- a/engines/wintermute/base/base_named_object.h
+++ b/engines/wintermute/base/base_named_object.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/wintermute/base/base_object.cpp b/engines/wintermute/base/base_object.cpp
index ea754f8f23..708df8def1 100644
--- a/engines/wintermute/base/base_object.cpp
+++ b/engines/wintermute/base/base_object.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -63,7 +63,7 @@ BaseObject::BaseObject(BaseGame *inGame) : BaseScriptHolder(inGame) {
_iD = _gameRef->getSequence();
- BasePlatform::setRectEmpty(&_rect);
+ _rect.setEmpty();
_rectSet = false;
_cursor = nullptr;
@@ -953,53 +953,53 @@ bool BaseObject::persist(BasePersistenceManager *persistMgr) {
BaseScriptHolder::persist(persistMgr);
for (int i = 0; i < 7; i++) {
- persistMgr->transfer(TMEMBER(_caption[i]));
+ persistMgr->transferCharPtr(TMEMBER(_caption[i]));
}
persistMgr->transferPtr(TMEMBER_PTR(_activeCursor));
- persistMgr->transfer(TMEMBER(_alphaColor));
- persistMgr->transfer(TMEMBER(_autoSoundPanning));
+ persistMgr->transferUint32(TMEMBER(_alphaColor));
+ persistMgr->transferBool(TMEMBER(_autoSoundPanning));
persistMgr->transferPtr(TMEMBER_PTR(_cursor));
- persistMgr->transfer(TMEMBER(_sharedCursors));
- persistMgr->transfer(TMEMBER(_editorAlwaysRegister));
- persistMgr->transfer(TMEMBER(_editorOnly));
- persistMgr->transfer(TMEMBER(_editorSelected));
- persistMgr->transfer(TMEMBER(_iD));
- persistMgr->transfer(TMEMBER(_is3D));
- persistMgr->transfer(TMEMBER(_movable));
- persistMgr->transfer(TMEMBER(_posX));
- persistMgr->transfer(TMEMBER(_posY));
+ persistMgr->transferBool(TMEMBER(_sharedCursors));
+ persistMgr->transferBool(TMEMBER(_editorAlwaysRegister));
+ persistMgr->transferBool(TMEMBER(_editorOnly));
+ persistMgr->transferBool(TMEMBER(_editorSelected));
+ persistMgr->transferSint32(TMEMBER(_iD));
+ persistMgr->transferBool(TMEMBER(_is3D));
+ persistMgr->transferBool(TMEMBER(_movable));
+ persistMgr->transferSint32(TMEMBER(_posX));
+ persistMgr->transferSint32(TMEMBER(_posY));
persistMgr->transferFloat(TMEMBER(_relativeScale));
- persistMgr->transfer(TMEMBER(_rotatable));
+ persistMgr->transferBool(TMEMBER(_rotatable));
persistMgr->transferFloat(TMEMBER(_scale));
persistMgr->transferPtr(TMEMBER_PTR(_sFX));
- persistMgr->transfer(TMEMBER(_sFXStart));
- persistMgr->transfer(TMEMBER(_sFXVolume));
- persistMgr->transfer(TMEMBER(_ready));
- persistMgr->transfer(TMEMBER(_rect));
- persistMgr->transfer(TMEMBER(_rectSet));
- persistMgr->transfer(TMEMBER(_registrable));
- persistMgr->transfer(TMEMBER(_shadowable));
- persistMgr->transfer(TMEMBER(_soundEvent));
- persistMgr->transfer(TMEMBER(_zoomable));
+ persistMgr->transferUint32(TMEMBER(_sFXStart));
+ persistMgr->transferSint32(TMEMBER(_sFXVolume));
+ persistMgr->transferBool(TMEMBER(_ready));
+ persistMgr->transferRect32(TMEMBER(_rect));
+ persistMgr->transferBool(TMEMBER(_rectSet));
+ persistMgr->transferBool(TMEMBER(_registrable));
+ persistMgr->transferBool(TMEMBER(_shadowable));
+ persistMgr->transferCharPtr(TMEMBER(_soundEvent));
+ persistMgr->transferBool(TMEMBER(_zoomable));
persistMgr->transferFloat(TMEMBER(_scaleX));
persistMgr->transferFloat(TMEMBER(_scaleY));
persistMgr->transferFloat(TMEMBER(_rotate));
- persistMgr->transfer(TMEMBER(_rotateValid));
+ persistMgr->transferBool(TMEMBER(_rotateValid));
persistMgr->transferFloat(TMEMBER(_relativeRotate));
- persistMgr->transfer(TMEMBER(_saveState));
- persistMgr->transfer(TMEMBER(_nonIntMouseEvents));
+ persistMgr->transferBool(TMEMBER(_saveState));
+ persistMgr->transferBool(TMEMBER(_nonIntMouseEvents));
- persistMgr->transfer(TMEMBER_INT(_sFXType));
+ persistMgr->transferSint32(TMEMBER_INT(_sFXType));
persistMgr->transferFloat(TMEMBER(_sFXParam1));
persistMgr->transferFloat(TMEMBER(_sFXParam2));
persistMgr->transferFloat(TMEMBER(_sFXParam3));
persistMgr->transferFloat(TMEMBER(_sFXParam4));
- persistMgr->transfer(TMEMBER_INT(_blendMode));
+ persistMgr->transferSint32(TMEMBER_INT(_blendMode));
return STATUS_OK;
}
@@ -1039,7 +1039,7 @@ bool BaseObject::setActiveCursor(const char *filename) {
//////////////////////////////////////////////////////////////////////////
-int BaseObject::getHeight() {
+int32 BaseObject::getHeight() {
return 0;
}
diff --git a/engines/wintermute/base/base_object.h b/engines/wintermute/base/base_object.h
index 42041c5e3c..f5036f4ec4 100644
--- a/engines/wintermute/base/base_object.h
+++ b/engines/wintermute/base/base_object.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -89,7 +89,7 @@ public:
virtual bool handleMouseWheel(int delta);
virtual bool handleMouse(TMouseEvent event, TMouseButton button);
virtual bool handleKeypress(Common::Event *event, bool printable = false);
- virtual int getHeight();
+ virtual int32 getHeight();
bool setCursor(const char *filename);
bool setActiveCursor(const char *filename);
bool cleanup();
diff --git a/engines/wintermute/base/base_parser.cpp b/engines/wintermute/base/base_parser.cpp
index 0b677b6cb2..2d80bc5017 100644
--- a/engines/wintermute/base/base_parser.cpp
+++ b/engines/wintermute/base/base_parser.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -250,10 +250,10 @@ Common::String BaseParser::getToken(char **buf) {
*t++ = 0;
} else if (*b == 0) {
*buf = b;
- return nullptr;
+ return Common::String();
} else {
// Error.
- return nullptr;
+ return Common::String();
}
*buf = b;
diff --git a/engines/wintermute/base/base_parser.h b/engines/wintermute/base/base_parser.h
index 4bf48cc016..4e4a54e28c 100644
--- a/engines/wintermute/base/base_parser.h
+++ b/engines/wintermute/base/base_parser.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/wintermute/base/base_persistence_manager.cpp b/engines/wintermute/base/base_persistence_manager.cpp
index e5542d96b7..bea55fb857 100644
--- a/engines/wintermute/base/base_persistence_manager.cpp
+++ b/engines/wintermute/base/base_persistence_manager.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -38,8 +38,8 @@
#include "engines/wintermute/base/sound/base_sound.h"
#include "engines/wintermute/graphics/transparent_surface.h"
#include "engines/wintermute/wintermute.h"
-#include "graphics/decoders/bmp.h"
#include "graphics/scaler.h"
+#include "image/bmp.h"
#include "common/memstream.h"
#include "common/str.h"
#include "common/system.h"
@@ -170,7 +170,7 @@ void BasePersistenceManager::getSaveStateDesc(int slot, SaveStateDescriptor &des
if (thumbSize > 0) {
Common::MemoryReadStream thumbStream(thumbData, thumbSize, DisposeAfterUse::NO);
- Graphics::BitmapDecoder bmpDecoder;
+ Image::BitmapDecoder bmpDecoder;
if (bmpDecoder.loadStream(thumbStream)) {
const Graphics::Surface *bmpSurface = bmpDecoder.getSurface();
TransparentSurface *scaleableSurface = new TransparentSurface(*bmpSurface, false);
@@ -587,7 +587,7 @@ double BasePersistenceManager::getDouble() {
//////////////////////////////////////////////////////////////////////////
// bool
-bool BasePersistenceManager::transfer(const char *name, bool *val) {
+bool BasePersistenceManager::transferBool(const char *name, bool *val) {
if (_saving) {
_saveStream->writeByte(*val);
if (_saveStream->err()) {
@@ -606,7 +606,7 @@ bool BasePersistenceManager::transfer(const char *name, bool *val) {
//////////////////////////////////////////////////////////////////////////
// int
-bool BasePersistenceManager::transfer(const char *name, int32 *val) {
+bool BasePersistenceManager::transferSint32(const char *name, int32 *val) {
if (_saving) {
_saveStream->writeSint32LE(*val);
if (_saveStream->err()) {
@@ -625,7 +625,7 @@ bool BasePersistenceManager::transfer(const char *name, int32 *val) {
//////////////////////////////////////////////////////////////////////////
// DWORD
-bool BasePersistenceManager::transfer(const char *name, uint32 *val) {
+bool BasePersistenceManager::transferUint32(const char *name, uint32 *val) {
if (_saving) {
_saveStream->writeUint32LE(*val);
if (_saveStream->err()) {
@@ -663,7 +663,7 @@ bool BasePersistenceManager::transferFloat(const char *name, float *val) {
//////////////////////////////////////////////////////////////////////////
// double
-bool BasePersistenceManager::transfer(const char *name, double *val) {
+bool BasePersistenceManager::transferDouble(const char *name, double *val) {
if (_saving) {
putDouble(*val);
if (_saveStream->err()) {
@@ -682,7 +682,7 @@ bool BasePersistenceManager::transfer(const char *name, double *val) {
//////////////////////////////////////////////////////////////////////////
// char*
-bool BasePersistenceManager::transfer(const char *name, char **val) {
+bool BasePersistenceManager::transferCharPtr(const char *name, char **val) {
if (_saving) {
putString(*val);
return STATUS_OK;
@@ -699,7 +699,7 @@ bool BasePersistenceManager::transfer(const char *name, char **val) {
//////////////////////////////////////////////////////////////////////////
// const char*
-bool BasePersistenceManager::transfer(const char *name, const char **val) {
+bool BasePersistenceManager::transferConstChar(const char *name, const char **val) {
if (_saving) {
putString(*val);
return STATUS_OK;
@@ -716,7 +716,7 @@ bool BasePersistenceManager::transfer(const char *name, const char **val) {
//////////////////////////////////////////////////////////////////////////
// Common::String
-bool BasePersistenceManager::transfer(const char *name, Common::String *val) {
+bool BasePersistenceManager::transferString(const char *name, Common::String *val) {
if (_saving) {
putString(val->c_str());
return STATUS_OK;
@@ -737,39 +737,8 @@ bool BasePersistenceManager::transfer(const char *name, Common::String *val) {
}
//////////////////////////////////////////////////////////////////////////
-bool BasePersistenceManager::transfer(const char *name, AnsiStringArray &val) {
- size_t size;
-
- if (_saving) {
- size = val.size();
- _saveStream->writeUint32LE(size);
-
- for (AnsiStringArray::iterator it = val.begin(); it != val.end(); ++it) {
- putString((*it).c_str());
- }
- } else {
- val.clear();
- size = _loadStream->readUint32LE();
-
- for (size_t i = 0; i < size; i++) {
- char *str = getString();
- if (_loadStream->err()) {
- delete[] str;
- return STATUS_FAILED;
- }
- if (str) {
- val.push_back(str);
- }
- delete[] str;
- }
- }
-
- return STATUS_OK;
-}
-
-//////////////////////////////////////////////////////////////////////////
// BYTE
-bool BasePersistenceManager::transfer(const char *name, byte *val) {
+bool BasePersistenceManager::transferByte(const char *name, byte *val) {
if (_saving) {
_saveStream->writeByte(*val);
if (_saveStream->err()) {
@@ -788,7 +757,7 @@ bool BasePersistenceManager::transfer(const char *name, byte *val) {
//////////////////////////////////////////////////////////////////////////
// RECT
-bool BasePersistenceManager::transfer(const char *name, Rect32 *val) {
+bool BasePersistenceManager::transferRect32(const char *name, Rect32 *val) {
if (_saving) {
_saveStream->writeSint32LE(val->left);
_saveStream->writeSint32LE(val->top);
@@ -813,7 +782,7 @@ bool BasePersistenceManager::transfer(const char *name, Rect32 *val) {
//////////////////////////////////////////////////////////////////////////
// POINT
-bool BasePersistenceManager::transfer(const char *name, Point32 *val) {
+bool BasePersistenceManager::transferPoint32(const char *name, Point32 *val) {
if (_saving) {
_saveStream->writeSint32LE(val->x);
_saveStream->writeSint32LE(val->y);
@@ -834,7 +803,7 @@ bool BasePersistenceManager::transfer(const char *name, Point32 *val) {
//////////////////////////////////////////////////////////////////////////
// Vector2
-bool BasePersistenceManager::transfer(const char *name, Vector2 *val) {
+bool BasePersistenceManager::transferVector2(const char *name, Vector2 *val) {
if (_saving) {
putFloat(val->x);
putFloat(val->y);
diff --git a/engines/wintermute/base/base_persistence_manager.h b/engines/wintermute/base/base_persistence_manager.h
index 3c0587b362..373d1580de 100644
--- a/engines/wintermute/base/base_persistence_manager.h
+++ b/engines/wintermute/base/base_persistence_manager.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -74,19 +74,18 @@ public:
byte *_richBuffer;
bool transferPtr(const char *name, void *val);
- bool transfer(const char *name, int32 *val);
- bool transfer(const char *name, uint32 *val);
+ bool transferSint32(const char *name, int32 *val);
+ bool transferUint32(const char *name, uint32 *val);
bool transferFloat(const char *name, float *val);
- bool transfer(const char *name, double *val);
- bool transfer(const char *name, bool *val);
- bool transfer(const char *name, byte *val);
- bool transfer(const char *name, Rect32 *val);
- bool transfer(const char *name, Point32 *val);
- bool transfer(const char *name, const char **val);
- bool transfer(const char *name, char **val);
- bool transfer(const char *name, Common::String *val);
- bool transfer(const char *name, Vector2 *val);
- bool transfer(const char *name, AnsiStringArray &Val);
+ bool transferDouble(const char *name, double *val);
+ bool transferBool(const char *name, bool *val);
+ bool transferByte(const char *name, byte *val);
+ bool transferRect32(const char *name, Rect32 *val);
+ bool transferPoint32(const char *name, Point32 *val);
+ bool transferConstChar(const char *name, const char **val);
+ bool transferCharPtr(const char *name, char **val);
+ bool transferString(const char *name, Common::String *val);
+ bool transferVector2(const char *name, Vector2 *val);
BasePersistenceManager(const char *savePrefix = nullptr, bool deleteSingleton = false);
virtual ~BasePersistenceManager();
bool checkVersion(byte verMajor, byte verMinor, byte verBuild);
diff --git a/engines/wintermute/base/base_point.cpp b/engines/wintermute/base/base_point.cpp
index fe6ca941f3..f810b286fb 100644
--- a/engines/wintermute/base/base_point.cpp
+++ b/engines/wintermute/base/base_point.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -54,8 +54,8 @@ BasePoint::BasePoint(int initX, int initY) {
//////////////////////////////////////////////////////////////////////////
bool BasePoint::persist(BasePersistenceManager *persistMgr) {
- persistMgr->transfer(TMEMBER(x));
- persistMgr->transfer(TMEMBER(y));
+ persistMgr->transferSint32(TMEMBER(x));
+ persistMgr->transferSint32(TMEMBER(y));
return STATUS_OK;
}
diff --git a/engines/wintermute/base/base_point.h b/engines/wintermute/base/base_point.h
index cf8a5be336..6f5c1ca28f 100644
--- a/engines/wintermute/base/base_point.h
+++ b/engines/wintermute/base/base_point.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/wintermute/base/base_quick_msg.cpp b/engines/wintermute/base/base_quick_msg.cpp
index ac0c107d3b..514f44f788 100644
--- a/engines/wintermute/base/base_quick_msg.cpp
+++ b/engines/wintermute/base/base_quick_msg.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/wintermute/base/base_quick_msg.h b/engines/wintermute/base/base_quick_msg.h
index b706424c18..39eace390c 100644
--- a/engines/wintermute/base/base_quick_msg.h
+++ b/engines/wintermute/base/base_quick_msg.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/wintermute/base/base_region.cpp b/engines/wintermute/base/base_region.cpp
index 581583c922..9a31f5cd66 100644
--- a/engines/wintermute/base/base_region.cpp
+++ b/engines/wintermute/base/base_region.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -48,7 +48,7 @@ BaseRegion::BaseRegion(BaseGame *inGame) : BaseObject(inGame) {
_lastMimicScale = -1;
_lastMimicX = _lastMimicY = INT_MIN;
- BasePlatform::setRectEmpty(&_rect);
+ _rect.setEmpty();
}
@@ -65,7 +65,7 @@ void BaseRegion::cleanup() {
}
_points.clear();
- BasePlatform::setRectEmpty(&_rect);
+ _rect.setEmpty();
_editorSelectedPoint = -1;
}
@@ -430,11 +430,11 @@ bool BaseRegion::persist(BasePersistenceManager *persistMgr) {
BaseObject::persist(persistMgr);
- persistMgr->transfer(TMEMBER(_active));
- persistMgr->transfer(TMEMBER(_editorSelectedPoint));
+ persistMgr->transferBool(TMEMBER(_active));
+ persistMgr->transferSint32(TMEMBER(_editorSelectedPoint));
persistMgr->transferFloat(TMEMBER(_lastMimicScale));
- persistMgr->transfer(TMEMBER(_lastMimicX));
- persistMgr->transfer(TMEMBER(_lastMimicY));
+ persistMgr->transferSint32(TMEMBER(_lastMimicX));
+ persistMgr->transferSint32(TMEMBER(_lastMimicY));
_points.persist(persistMgr);
return STATUS_OK;
@@ -491,7 +491,7 @@ bool BaseRegion::ptInPolygon(int32 x, int32 y) {
//////////////////////////////////////////////////////////////////////////
bool BaseRegion::getBoundingRect(Rect32 *rect) {
if (_points.size() == 0) {
- BasePlatform::setRectEmpty(rect);
+ rect->setEmpty();
} else {
int32 minX = INT_MAX, minY = INT_MAX, maxX = INT_MIN, maxY = INT_MIN;
@@ -502,7 +502,7 @@ bool BaseRegion::getBoundingRect(Rect32 *rect) {
maxX = MAX(maxX, _points[i]->x);
maxY = MAX(maxY, _points[i]->y);
}
- BasePlatform::setRect(rect, minX, minY, maxX, maxY);
+ rect->setRect(minX, minY, maxX, maxY);
}
return STATUS_OK;
}
diff --git a/engines/wintermute/base/base_region.h b/engines/wintermute/base/base_region.h
index 846dcfc341..fc3389c501 100644
--- a/engines/wintermute/base/base_region.h
+++ b/engines/wintermute/base/base_region.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/wintermute/base/base_script_holder.cpp b/engines/wintermute/base/base_script_holder.cpp
index a670ebf1af..8383657239 100644
--- a/engines/wintermute/base/base_script_holder.cpp
+++ b/engines/wintermute/base/base_script_holder.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -280,14 +280,14 @@ bool BaseScriptHolder::saveAsText(BaseDynamicBuffer *buffer, int indent) {
bool BaseScriptHolder::persist(BasePersistenceManager *persistMgr) {
BaseScriptable::persist(persistMgr);
- persistMgr->transfer(TMEMBER(_filename));
- persistMgr->transfer(TMEMBER(_freezable));
+ persistMgr->transferCharPtr(TMEMBER(_filename));
+ persistMgr->transferBool(TMEMBER(_freezable));
if (persistMgr->getIsSaving()) {
const char *name = getName();
- persistMgr->transfer(TMEMBER(name));
+ persistMgr->transferConstChar(TMEMBER(name));
} else {
char *name;
- persistMgr->transfer(TMEMBER(name));
+ persistMgr->transferCharPtr(TMEMBER(name));
setName(name);
delete[] name;
}
diff --git a/engines/wintermute/base/base_script_holder.h b/engines/wintermute/base/base_script_holder.h
index b4e22a59ee..9b3bf9ec44 100644
--- a/engines/wintermute/base/base_script_holder.h
+++ b/engines/wintermute/base/base_script_holder.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/wintermute/base/base_scriptable.cpp b/engines/wintermute/base/base_scriptable.cpp
index be1e18c2c4..c65d30d941 100644
--- a/engines/wintermute/base/base_scriptable.cpp
+++ b/engines/wintermute/base/base_scriptable.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -153,7 +153,7 @@ void BaseScriptable::scSetBool(bool val) {
//////////////////////////////////////////////////////////////////////////
bool BaseScriptable::persist(BasePersistenceManager *persistMgr) {
persistMgr->transferPtr(TMEMBER_PTR(_gameRef));
- persistMgr->transfer(TMEMBER(_refCount));
+ persistMgr->transferSint32(TMEMBER(_refCount));
persistMgr->transferPtr(TMEMBER_PTR(_scProp));
persistMgr->transferPtr(TMEMBER_PTR(_scValue));
diff --git a/engines/wintermute/base/base_scriptable.h b/engines/wintermute/base/base_scriptable.h
index 08fd32081a..b32668d6c8 100644
--- a/engines/wintermute/base/base_scriptable.h
+++ b/engines/wintermute/base/base_scriptable.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/wintermute/base/base_sprite.cpp b/engines/wintermute/base/base_sprite.cpp
index 383655e0af..2e00998037 100644
--- a/engines/wintermute/base/base_sprite.cpp
+++ b/engines/wintermute/base/base_sprite.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -462,7 +462,7 @@ bool BaseSprite::getBoundingRect(Rect32 *rect, int x, int y, float scaleX, float
return false;
}
- BasePlatform::setRectEmpty(rect);
+ rect->setEmpty();
for (uint32 i = 0; i < _frames.size(); i++) {
Rect32 frame;
Rect32 temp;
@@ -520,29 +520,29 @@ bool BaseSprite::saveAsText(BaseDynamicBuffer *buffer, int indent) {
bool BaseSprite::persist(BasePersistenceManager *persistMgr) {
BaseScriptHolder::persist(persistMgr);
- persistMgr->transfer(TMEMBER(_canBreak));
- persistMgr->transfer(TMEMBER(_changed));
- persistMgr->transfer(TMEMBER(_paused));
- persistMgr->transfer(TMEMBER(_continuous));
- persistMgr->transfer(TMEMBER(_currentFrame));
- persistMgr->transfer(TMEMBER(_editorAllFrames));
- persistMgr->transfer(TMEMBER(_editorBgAlpha));
- persistMgr->transfer(TMEMBER(_editorBgFile));
- persistMgr->transfer(TMEMBER(_editorBgOffsetX));
- persistMgr->transfer(TMEMBER(_editorBgOffsetY));
- persistMgr->transfer(TMEMBER(_editorMuted));
- persistMgr->transfer(TMEMBER(_finished));
+ persistMgr->transferBool(TMEMBER(_canBreak));
+ persistMgr->transferBool(TMEMBER(_changed));
+ persistMgr->transferBool(TMEMBER(_paused));
+ persistMgr->transferBool(TMEMBER(_continuous));
+ persistMgr->transferSint32(TMEMBER(_currentFrame));
+ persistMgr->transferBool(TMEMBER(_editorAllFrames));
+ persistMgr->transferSint32(TMEMBER(_editorBgAlpha));
+ persistMgr->transferCharPtr(TMEMBER(_editorBgFile));
+ persistMgr->transferSint32(TMEMBER(_editorBgOffsetX));
+ persistMgr->transferSint32(TMEMBER(_editorBgOffsetY));
+ persistMgr->transferBool(TMEMBER(_editorMuted));
+ persistMgr->transferBool(TMEMBER(_finished));
_frames.persist(persistMgr);
- persistMgr->transfer(TMEMBER(_lastFrameTime));
- persistMgr->transfer(TMEMBER(_looping));
- persistMgr->transfer(TMEMBER(_moveX));
- persistMgr->transfer(TMEMBER(_moveY));
+ persistMgr->transferUint32(TMEMBER(_lastFrameTime));
+ persistMgr->transferBool(TMEMBER(_looping));
+ persistMgr->transferSint32(TMEMBER(_moveX));
+ persistMgr->transferSint32(TMEMBER(_moveY));
persistMgr->transferPtr(TMEMBER_PTR(_owner));
- persistMgr->transfer(TMEMBER(_precise));
- persistMgr->transfer(TMEMBER(_streamed));
- persistMgr->transfer(TMEMBER(_streamedKeepLoaded));
+ persistMgr->transferBool(TMEMBER(_precise));
+ persistMgr->transferBool(TMEMBER(_streamed));
+ persistMgr->transferBool(TMEMBER(_streamedKeepLoaded));
return STATUS_OK;
diff --git a/engines/wintermute/base/base_sprite.h b/engines/wintermute/base/base_sprite.h
index 54d595f655..92287995d9 100644
--- a/engines/wintermute/base/base_sprite.h
+++ b/engines/wintermute/base/base_sprite.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/wintermute/base/base_string_table.cpp b/engines/wintermute/base/base_string_table.cpp
index 3d9cc4f8b3..9adbbdf7be 100644
--- a/engines/wintermute/base/base_string_table.cpp
+++ b/engines/wintermute/base/base_string_table.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/wintermute/base/base_string_table.h b/engines/wintermute/base/base_string_table.h
index f8808f5b27..9e915a1ad9 100644
--- a/engines/wintermute/base/base_string_table.h
+++ b/engines/wintermute/base/base_string_table.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/wintermute/base/base_sub_frame.cpp b/engines/wintermute/base/base_sub_frame.cpp
index 1055987f6b..3a6e28b1f2 100644
--- a/engines/wintermute/base/base_sub_frame.cpp
+++ b/engines/wintermute/base/base_sub_frame.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -34,7 +34,6 @@
#include "engines/wintermute/base/base_surface_storage.h"
#include "engines/wintermute/base/base_game.h"
#include "engines/wintermute/base/base_engine.h"
-#include "engines/wintermute/platform_osystem.h"
#include "engines/wintermute/base/gfx/base_renderer.h"
#include "engines/wintermute/base/scriptables/script_value.h"
#include "engines/wintermute/base/scriptables/script_stack.h"
@@ -54,7 +53,7 @@ BaseSubFrame::BaseSubFrame(BaseGame *inGame) : BaseScriptable(inGame, true) {
_transparent = 0xFFFF00FF;
_wantsDefaultRect = false;
- BasePlatform::setRectEmpty(&_rect);
+ _rect.setEmpty();
_editorSelected = false;
@@ -121,7 +120,7 @@ bool BaseSubFrame::loadBuffer(char *buffer, int lifeTime, bool keepLoaded) {
int r = 255, g = 255, b = 255;
int ar = 255, ag = 255, ab = 255, alpha = 255;
bool custoTrans = false;
- BasePlatform::setRectEmpty(&rect);
+ rect.setEmpty();
char *surfaceFile = nullptr;
delete _surface;
@@ -208,7 +207,7 @@ bool BaseSubFrame::loadBuffer(char *buffer, int lifeTime, bool keepLoaded) {
return STATUS_FAILED;
}
*/
- if (BasePlatform::isRectEmpty(&rect)) {
+ if (rect.isRectEmpty()) {
setDefaultRect();
} else {
setRect(rect);
@@ -219,7 +218,7 @@ bool BaseSubFrame::loadBuffer(char *buffer, int lifeTime, bool keepLoaded) {
Rect32 BaseSubFrame::getRect() {
if (_wantsDefaultRect && _surface) {
- BasePlatform::setRect(&_rect, 0, 0, _surface->getWidth(), _surface->getHeight());
+ _rect.setRect(0, 0, _surface->getWidth(), _surface->getHeight());
_wantsDefaultRect = false;
}
return _rect;
@@ -236,7 +235,7 @@ const char* BaseSubFrame::getSurfaceFilename() {
//////////////////////////////////////////////////////////////////////
bool BaseSubFrame::draw(int x, int y, BaseObject *registerOwner, float zoomX, float zoomY, bool precise, uint32 alpha, float rotate, TSpriteBlendMode blendMode) {
-
+
rotate = fmod(rotate, 360.0f);
if (rotate < 0) {
rotate += 360.0f;
@@ -272,7 +271,7 @@ bool BaseSubFrame::draw(int x, int y, BaseObject *registerOwner, float zoomX, fl
TransformStruct transform = TransformStruct(zoomX, zoomY, (uint32)rotate, _hotspotX, _hotspotY, blendMode, alpha, _mirrorX, _mirrorY, 0, 0);
Rect32 newRect = TransformTools::newRect (oldRect, transform, &newHotspot);
newOrigin = origin - newHotspot;
- res = _surface->displayTransform(newOrigin.x, newOrigin.y, oldRect, newRect, transform);
+ res = _surface->displayTransform(newOrigin.x, newOrigin.y, oldRect, newRect, transform);
} else {
if (zoomX == kDefaultZoomX && zoomY == kDefaultZoomY) {
res = _surface->displayTrans(x - _hotspotX, y - _hotspotY, getRect(), alpha, blendMode, _mirrorX, _mirrorY);
@@ -294,11 +293,10 @@ bool BaseSubFrame::getBoundingRect(Rect32 *rect, int x, int y, float scaleX, flo
float ratioX = scaleX / 100.0f;
float ratioY = scaleY / 100.0f;
- BasePlatform::setRect(rect,
- (int)(x - _hotspotX * ratioX),
- (int)(y - _hotspotY * ratioY),
- (int)(x - _hotspotX * ratioX + (getRect().right - getRect().left) * ratioX),
- (int)(y - _hotspotY * ratioY + (getRect().bottom - getRect().top) * ratioY));
+ rect->setRect((int)(x - _hotspotX * ratioX),
+ (int)(y - _hotspotY * ratioY),
+ (int)(x - _hotspotX * ratioX + (getRect().right - getRect().left) * ratioX),
+ (int)(y - _hotspotY * ratioY + (getRect().bottom - getRect().top) * ratioY));
return true;
}
@@ -318,9 +316,9 @@ bool BaseSubFrame::saveAsText(BaseDynamicBuffer *buffer, int indent, bool comple
}
Rect32 rect;
- BasePlatform::setRectEmpty(&rect);
+ rect.setEmpty();
if (_surface) {
- BasePlatform::setRect(&rect, 0, 0, _surface->getWidth(), _surface->getHeight());
+ rect.setRect(0, 0, _surface->getWidth(), _surface->getHeight());
}
if (!(rect == getRect())) {
buffer->putTextIndent(indent + 2, "RECT { %d,%d,%d,%d }\n", getRect().left, getRect().top, getRect().right, getRect().bottom);
@@ -376,7 +374,7 @@ void BaseSubFrame::setDefaultRect() {
_wantsDefaultRect = true;
} else {
_wantsDefaultRect = false;
- BasePlatform::setRectEmpty(&_rect);
+ _rect.setEmpty();
}
}
@@ -386,27 +384,27 @@ bool BaseSubFrame::persist(BasePersistenceManager *persistMgr) {
BaseScriptable::persist(persistMgr);
- persistMgr->transfer(TMEMBER(_2DOnly));
- persistMgr->transfer(TMEMBER(_3DOnly));
- persistMgr->transfer(TMEMBER(_alpha));
- persistMgr->transfer(TMEMBER(_decoration));
- persistMgr->transfer(TMEMBER(_editorSelected));
- persistMgr->transfer(TMEMBER(_hotspotX));
- persistMgr->transfer(TMEMBER(_hotspotY));
- persistMgr->transfer(TMEMBER(_rect));
- persistMgr->transfer(TMEMBER(_wantsDefaultRect));
-
- persistMgr->transfer(TMEMBER(_surfaceFilename));
- persistMgr->transfer(TMEMBER(_cKDefault));
- persistMgr->transfer(TMEMBER(_cKRed));
- persistMgr->transfer(TMEMBER(_cKGreen));
- persistMgr->transfer(TMEMBER(_cKBlue));
- persistMgr->transfer(TMEMBER(_lifeTime));
-
- persistMgr->transfer(TMEMBER(_keepLoaded));
- persistMgr->transfer(TMEMBER(_mirrorX));
- persistMgr->transfer(TMEMBER(_mirrorY));
- persistMgr->transfer(TMEMBER(_transparent));
+ persistMgr->transferBool(TMEMBER(_2DOnly));
+ persistMgr->transferBool(TMEMBER(_3DOnly));
+ persistMgr->transferUint32(TMEMBER(_alpha));
+ persistMgr->transferBool(TMEMBER(_decoration));
+ persistMgr->transferBool(TMEMBER(_editorSelected));
+ persistMgr->transferSint32(TMEMBER(_hotspotX));
+ persistMgr->transferSint32(TMEMBER(_hotspotY));
+ persistMgr->transferRect32(TMEMBER(_rect));
+ persistMgr->transferBool(TMEMBER(_wantsDefaultRect));
+
+ persistMgr->transferCharPtr(TMEMBER(_surfaceFilename));
+ persistMgr->transferBool(TMEMBER(_cKDefault));
+ persistMgr->transferByte(TMEMBER(_cKRed));
+ persistMgr->transferByte(TMEMBER(_cKGreen));
+ persistMgr->transferByte(TMEMBER(_cKBlue));
+ persistMgr->transferSint32(TMEMBER(_lifeTime));
+
+ persistMgr->transferBool(TMEMBER(_keepLoaded));
+ persistMgr->transferBool(TMEMBER(_mirrorX));
+ persistMgr->transferBool(TMEMBER(_mirrorY));
+ persistMgr->transferUint32(TMEMBER(_transparent));
return STATUS_OK;
}
diff --git a/engines/wintermute/base/base_sub_frame.h b/engines/wintermute/base/base_sub_frame.h
index 4e164467e2..b2859fa3f3 100644
--- a/engines/wintermute/base/base_sub_frame.h
+++ b/engines/wintermute/base/base_sub_frame.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/wintermute/base/base_surface_storage.cpp b/engines/wintermute/base/base_surface_storage.cpp
index f1d068674b..a2dedf66a3 100644
--- a/engines/wintermute/base/base_surface_storage.cpp
+++ b/engines/wintermute/base/base_surface_storage.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/wintermute/base/base_surface_storage.h b/engines/wintermute/base/base_surface_storage.h
index c0049d676c..2bec9a0fbb 100644
--- a/engines/wintermute/base/base_surface_storage.h
+++ b/engines/wintermute/base/base_surface_storage.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/wintermute/base/base_transition_manager.cpp b/engines/wintermute/base/base_transition_manager.cpp
index eee5f1aae7..198dfe26ba 100644
--- a/engines/wintermute/base/base_transition_manager.cpp
+++ b/engines/wintermute/base/base_transition_manager.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/wintermute/base/base_transition_manager.h b/engines/wintermute/base/base_transition_manager.h
index 82edb9ff88..3cfc0f2028 100644
--- a/engines/wintermute/base/base_transition_manager.h
+++ b/engines/wintermute/base/base_transition_manager.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/wintermute/base/base_viewport.cpp b/engines/wintermute/base/base_viewport.cpp
index 09ac80e9de..bf3700a14e 100644
--- a/engines/wintermute/base/base_viewport.cpp
+++ b/engines/wintermute/base/base_viewport.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -29,7 +29,6 @@
#include "engines/wintermute/base/base_viewport.h"
#include "engines/wintermute/base/base_engine.h"
#include "engines/wintermute/base/base_persistence_manager.h"
-#include "engines/wintermute/platform_osystem.h"
#include "engines/wintermute/base/gfx/base_renderer.h"
namespace Wintermute {
@@ -38,7 +37,7 @@ IMPLEMENT_PERSISTENT(BaseViewport, false)
//////////////////////////////////////////////////////////////////////////
BaseViewport::BaseViewport(BaseGame *inGame) : BaseClass(inGame) {
- BasePlatform::setRectEmpty(&_rect);
+ _rect.setEmpty();
_mainObject = nullptr;
_offsetX = _offsetY = 0;
}
@@ -56,9 +55,9 @@ bool BaseViewport::persist(BasePersistenceManager *persistMgr) {
persistMgr->transferPtr(TMEMBER_PTR(_gameRef));
persistMgr->transferPtr(TMEMBER_PTR(_mainObject));
- persistMgr->transfer(TMEMBER(_offsetX));
- persistMgr->transfer(TMEMBER(_offsetY));
- persistMgr->transfer(TMEMBER(_rect));
+ persistMgr->transferSint32(TMEMBER(_offsetX));
+ persistMgr->transferSint32(TMEMBER(_offsetY));
+ persistMgr->transferRect32(TMEMBER(_rect));
return STATUS_OK;
}
@@ -73,7 +72,7 @@ bool BaseViewport::setRect(int32 left, int32 top, int32 right, int32 bottom, boo
bottom = MIN(bottom, BaseEngine::instance().getRenderer()->getHeight());
}
- BasePlatform::setRect(&_rect, left, top, right, bottom);
+ _rect.setRect(left, top, right, bottom);
_offsetX = left;
_offsetY = top;
return STATUS_OK;
diff --git a/engines/wintermute/base/base_viewport.h b/engines/wintermute/base/base_viewport.h
index 0225c02c7c..eae756f9c6 100644
--- a/engines/wintermute/base/base_viewport.h
+++ b/engines/wintermute/base/base_viewport.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/wintermute/base/file/base_disk_file.cpp b/engines/wintermute/base/file/base_disk_file.cpp
index 808dc9e00d..82a9e24dfb 100644
--- a/engines/wintermute/base/file/base_disk_file.cpp
+++ b/engines/wintermute/base/file/base_disk_file.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/wintermute/base/file/base_disk_file.h b/engines/wintermute/base/file/base_disk_file.h
index 81cc22b86d..f20629f7ec 100644
--- a/engines/wintermute/base/file/base_disk_file.h
+++ b/engines/wintermute/base/file/base_disk_file.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/wintermute/base/file/base_file.cpp b/engines/wintermute/base/file/base_file.cpp
index 42eea69824..2927c908e2 100644
--- a/engines/wintermute/base/file/base_file.cpp
+++ b/engines/wintermute/base/file/base_file.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/wintermute/base/file/base_file.h b/engines/wintermute/base/file/base_file.h
index 9acda7ffce..820b6510fd 100644
--- a/engines/wintermute/base/file/base_file.h
+++ b/engines/wintermute/base/file/base_file.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/wintermute/base/file/base_file_entry.cpp b/engines/wintermute/base/file/base_file_entry.cpp
index 846f56b55c..991d75d03d 100644
--- a/engines/wintermute/base/file/base_file_entry.cpp
+++ b/engines/wintermute/base/file/base_file_entry.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/wintermute/base/file/base_file_entry.h b/engines/wintermute/base/file/base_file_entry.h
index 9d738c8c11..6bac3789d7 100644
--- a/engines/wintermute/base/file/base_file_entry.h
+++ b/engines/wintermute/base/file/base_file_entry.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/wintermute/base/file/base_package.cpp b/engines/wintermute/base/file/base_package.cpp
index 512279b72c..ae4955390b 100644
--- a/engines/wintermute/base/file/base_package.cpp
+++ b/engines/wintermute/base/file/base_package.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -53,8 +53,8 @@ static bool findPackageSignature(Common::SeekableReadStream *f, uint32 *offset)
byte buf[32768];
byte signature[8];
- ((uint32 *)signature)[0] = PACKAGE_MAGIC_1;
- ((uint32 *)signature)[1] = PACKAGE_MAGIC_2;
+ WRITE_LE_UINT32(signature + 0, PACKAGE_MAGIC_1);
+ WRITE_LE_UINT32(signature + 4, PACKAGE_MAGIC_2);
uint32 fileSize = (uint32)f->size();
uint32 startPos = 1024 * 1024;
diff --git a/engines/wintermute/base/file/base_package.h b/engines/wintermute/base/file/base_package.h
index 18156c4f65..35976eb47b 100644
--- a/engines/wintermute/base/file/base_package.h
+++ b/engines/wintermute/base/file/base_package.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/wintermute/base/file/base_save_thumb_file.cpp b/engines/wintermute/base/file/base_save_thumb_file.cpp
index bb172ca66a..acd5363e89 100644
--- a/engines/wintermute/base/file/base_save_thumb_file.cpp
+++ b/engines/wintermute/base/file/base_save_thumb_file.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/wintermute/base/file/base_save_thumb_file.h b/engines/wintermute/base/file/base_save_thumb_file.h
index faf1af9255..4d9030189d 100644
--- a/engines/wintermute/base/file/base_save_thumb_file.h
+++ b/engines/wintermute/base/file/base_save_thumb_file.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/wintermute/base/file/dcpackage.h b/engines/wintermute/base/file/dcpackage.h
index a2ec5d28d5..5f21ce94ea 100644
--- a/engines/wintermute/base/file/dcpackage.h
+++ b/engines/wintermute/base/file/dcpackage.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/wintermute/base/font/base_font.cpp b/engines/wintermute/base/font/base_font.cpp
index 2a394616d1..0a5f7466df 100644
--- a/engines/wintermute/base/font/base_font.cpp
+++ b/engines/wintermute/base/font/base_font.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/wintermute/base/font/base_font.h b/engines/wintermute/base/font/base_font.h
index d75d3f4fb5..5f37d983cb 100644
--- a/engines/wintermute/base/font/base_font.h
+++ b/engines/wintermute/base/font/base_font.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/wintermute/base/font/base_font_bitmap.cpp b/engines/wintermute/base/font/base_font_bitmap.cpp
index 23a633a5a8..bab2bf3df4 100644
--- a/engines/wintermute/base/font/base_font_bitmap.cpp
+++ b/engines/wintermute/base/font/base_font_bitmap.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -37,7 +37,6 @@
#include "engines/wintermute/base/base_frame.h"
#include "engines/wintermute/base/base_sprite.h"
#include "engines/wintermute/base/base_file_manager.h"
-#include "engines/wintermute/platform_osystem.h"
namespace Wintermute {
@@ -253,7 +252,7 @@ void BaseFontBitmap::drawChar(byte c, int x, int y) {
tileWidth = _widths[c];
}
- BasePlatform::setRect(&rect, col * _tileWidth, row * _tileHeight, col * _tileWidth + tileWidth, (row + 1)*_tileHeight);
+ rect.setRect(col * _tileWidth, row * _tileHeight, col * _tileWidth + tileWidth, (row + 1) * _tileHeight);
bool handled = false;
if (_sprite) {
_sprite->getCurrentFrame();
@@ -496,13 +495,13 @@ bool BaseFontBitmap::loadBuffer(char *buffer) {
bool BaseFontBitmap::persist(BasePersistenceManager *persistMgr) {
BaseFont::persist(persistMgr);
- persistMgr->transfer(TMEMBER(_numColumns));
+ persistMgr->transferSint32(TMEMBER(_numColumns));
persistMgr->transferPtr(TMEMBER_PTR(_subframe));
- persistMgr->transfer(TMEMBER(_tileHeight));
- persistMgr->transfer(TMEMBER(_tileWidth));
+ persistMgr->transferSint32(TMEMBER(_tileHeight));
+ persistMgr->transferSint32(TMEMBER(_tileWidth));
persistMgr->transferPtr(TMEMBER_PTR(_sprite));
- persistMgr->transfer(TMEMBER(_widthsFrame));
+ persistMgr->transferSint32(TMEMBER(_widthsFrame));
if (persistMgr->getIsSaving()) {
persistMgr->putBytes(_widths, sizeof(_widths));
@@ -511,8 +510,8 @@ bool BaseFontBitmap::persist(BasePersistenceManager *persistMgr) {
}
- persistMgr->transfer(TMEMBER(_fontextFix));
- persistMgr->transfer(TMEMBER(_wholeCell));
+ persistMgr->transferBool(TMEMBER(_fontextFix));
+ persistMgr->transferBool(TMEMBER(_wholeCell));
return STATUS_OK;
diff --git a/engines/wintermute/base/font/base_font_bitmap.h b/engines/wintermute/base/font/base_font_bitmap.h
index 77620d8b88..c26a6ad1cb 100644
--- a/engines/wintermute/base/font/base_font_bitmap.h
+++ b/engines/wintermute/base/font/base_font_bitmap.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/wintermute/base/font/base_font_storage.cpp b/engines/wintermute/base/font/base_font_storage.cpp
index 8abd368b70..f4f7de44fc 100644
--- a/engines/wintermute/base/font/base_font_storage.cpp
+++ b/engines/wintermute/base/font/base_font_storage.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/wintermute/base/font/base_font_storage.h b/engines/wintermute/base/font/base_font_storage.h
index f4ac490324..e29675aaef 100644
--- a/engines/wintermute/base/font/base_font_storage.h
+++ b/engines/wintermute/base/font/base_font_storage.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/wintermute/base/font/base_font_truetype.cpp b/engines/wintermute/base/font/base_font_truetype.cpp
index bbc66902a1..df9a8648db 100644
--- a/engines/wintermute/base/font/base_font_truetype.cpp
+++ b/engines/wintermute/base/font/base_font_truetype.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -34,7 +34,6 @@
#include "engines/wintermute/base/base_game.h"
#include "engines/wintermute/base/base_file_manager.h"
#include "engines/wintermute/utils/utils.h"
-#include "engines/wintermute/platform_osystem.h"
#include "engines/wintermute/wintermute.h"
#include "graphics/fonts/ttf.h"
#include "graphics/fontman.h"
@@ -122,7 +121,7 @@ int BaseFontTT::getTextWidth(const byte *text, int maxLength) {
}
if (maxLength >= 0 && textStr.size() > (uint32)maxLength) {
- textStr = Common::String(textStr.c_str(), (uint32)maxLength);
+ textStr = WideString(textStr.c_str(), (uint32)maxLength);
}
//text = text.substr(0, MaxLength); // TODO: Remove
@@ -156,19 +155,19 @@ void BaseFontTT::drawText(const byte *text, int x, int y, int width, TTextAlign
return;
}
- WideString textStr = (const char *)text;
+ WideString textStr;
// TODO: Why do we still insist on Widestrings everywhere?
- /* if (_gameRef->_textEncoding == TEXT_UTF8) text = StringUtil::Utf8ToWide((char *)Text);
- else text = StringUtil::AnsiToWide((char *)Text);*/
// HACK: J.U.L.I.A. uses CP1252, we need to fix that,
// And we still don't have any UTF8-support.
- if (_gameRef->_textEncoding != TEXT_UTF8) {
+ if (_gameRef->_textEncoding == TEXT_UTF8) {
+ textStr = StringUtil::utf8ToWide((const char *)text);
+ } else {
textStr = StringUtil::ansiToWide((const char *)text);
}
if (maxLength >= 0 && textStr.size() > (uint32)maxLength) {
- textStr = Common::String(textStr.c_str(), (uint32)maxLength);
+ textStr = WideString(textStr.c_str(), (uint32)maxLength);
}
//text = text.substr(0, MaxLength); // TODO: Remove
@@ -227,7 +226,7 @@ void BaseFontTT::drawText(const byte *text, int x, int y, int width, TTextAlign
// and paint it
if (surface) {
Rect32 rc;
- BasePlatform::setRect(&rc, 0, 0, surface->getWidth(), surface->getHeight());
+ rc.setRect(0, 0, surface->getWidth(), surface->getHeight());
for (uint32 i = 0; i < _layers.size(); i++) {
uint32 color = _layers[i]->_color;
uint32 origForceAlpha = renderer->_forceAlphaColor;
@@ -249,7 +248,7 @@ BaseSurface *BaseFontTT::renderTextToTexture(const WideString &text, int width,
//TextLineList lines;
// TODO: Use WideString-conversion here.
//WrapText(text, width, maxHeight, lines);
- Common::Array<Common::String> lines;
+ Common::Array<WideString> lines;
_font->wordWrapText(text, width, lines);
while (maxHeight > 0 && lines.size() * _lineHeight > maxHeight) {
@@ -268,16 +267,13 @@ BaseSurface *BaseFontTT::renderTextToTexture(const WideString &text, int width,
alignment = Graphics::kTextAlignRight;
}
- debugC(kWintermuteDebugFont, "%s %d %d %d %d", text.c_str(), RGBCOLGetR(_layers[0]->_color), RGBCOLGetG(_layers[0]->_color), RGBCOLGetB(_layers[0]->_color), RGBCOLGetA(_layers[0]->_color));
+ // TODO: This debug call does not work with WideString because text.c_str() returns an uint32 array.
+ //debugC(kWintermuteDebugFont, "%s %d %d %d %d", text.c_str(), RGBCOLGetR(_layers[0]->_color), RGBCOLGetG(_layers[0]->_color), RGBCOLGetB(_layers[0]->_color), RGBCOLGetA(_layers[0]->_color));
// void drawString(Surface *dst, const Common::String &str, int x, int y, int w, uint32 color, TextAlign align = kTextAlignLeft, int deltax = 0, bool useEllipsis = true) const;
Graphics::Surface *surface = new Graphics::Surface();
- if (_deletableFont) { // We actually have a TTF
- surface->create((uint16)width, (uint16)(_lineHeight * lines.size()), _gameRef->_renderer->getPixelFormat());
- } else { // We are using a fallback, they can't do 32bpp
- surface->create((uint16)width, (uint16)(_lineHeight * lines.size()), Graphics::PixelFormat(2, 5, 5, 5, 1, 11, 6, 1, 0));
- }
+ surface->create((uint16)width, (uint16)(_lineHeight * lines.size()), _gameRef->_renderer->getPixelFormat());
uint32 useColor = 0xffffffff;
- Common::Array<Common::String>::iterator it;
+ Common::Array<WideString>::iterator it;
int heightOffset = 0;
for (it = lines.begin(); it != lines.end(); ++it) {
_font->drawString(surface, *it, 0, heightOffset, width, useColor, alignment);
@@ -285,7 +281,6 @@ BaseSurface *BaseFontTT::renderTextToTexture(const WideString &text, int width,
}
BaseSurface *retSurface = _gameRef->_renderer->createSurface();
- Graphics::Surface *convertedSurface = surface->convertTo(_gameRef->_renderer->getPixelFormat());
if (_deletableFont) {
// Reconstruct the alpha channel of the font.
@@ -295,22 +290,20 @@ BaseSurface *BaseFontTT::renderTextToTexture(const WideString &text, int width,
// to its original alpha value.
Graphics::PixelFormat format = _gameRef->_renderer->getPixelFormat();
- uint32 *pixels = (uint32 *)convertedSurface->getPixels();
+ uint32 *pixels = (uint32 *)surface->getPixels();
// This is a Surface we created ourselves, so no empty space between rows.
for (int i = 0; i < surface->w * surface->h; ++i) {
uint8 a, r, g, b;
format.colorToRGB(*pixels, r, g, b);
a = r;
- *pixels++ = format.ARGBToColor(a, r, g, b);
+ *pixels++ = format.ARGBToColor(a, r, g, b);
}
}
- retSurface->putSurface(*convertedSurface, true);
- convertedSurface->free();
+ retSurface->putSurface(*surface, true);
surface->free();
delete surface;
- delete convertedSurface;
return retSurface;
// TODO: _isUnderline, _isBold, _isItalic, _isStriked
}
@@ -521,25 +514,25 @@ bool BaseFontTT::parseLayer(BaseTTFontLayer *layer, char *buffer) {
bool BaseFontTT::persist(BasePersistenceManager *persistMgr) {
BaseFont::persist(persistMgr);
- persistMgr->transfer(TMEMBER(_isBold));
- persistMgr->transfer(TMEMBER(_isItalic));
- persistMgr->transfer(TMEMBER(_isUnderline));
- persistMgr->transfer(TMEMBER(_isStriked));
- persistMgr->transfer(TMEMBER(_fontHeight));
- persistMgr->transfer(TMEMBER(_fontFile));
+ persistMgr->transferBool(TMEMBER(_isBold));
+ persistMgr->transferBool(TMEMBER(_isItalic));
+ persistMgr->transferBool(TMEMBER(_isUnderline));
+ persistMgr->transferBool(TMEMBER(_isStriked));
+ persistMgr->transferSint32(TMEMBER(_fontHeight));
+ persistMgr->transferCharPtr(TMEMBER(_fontFile));
// persist layers
int32 numLayers;
if (persistMgr->getIsSaving()) {
numLayers = _layers.size();
- persistMgr->transfer(TMEMBER(numLayers));
+ persistMgr->transferSint32(TMEMBER(numLayers));
for (int i = 0; i < numLayers; i++) {
_layers[i]->persist(persistMgr);
}
} else {
numLayers = _layers.size();
- persistMgr->transfer(TMEMBER(numLayers));
+ persistMgr->transferSint32(TMEMBER(numLayers));
for (int i = 0; i < numLayers; i++) {
BaseTTFontLayer *layer = new BaseTTFontLayer;
layer->persist(persistMgr);
@@ -569,13 +562,22 @@ bool BaseFontTT::initFont() {
return STATUS_FAILED;
}
#ifdef USE_FREETYPE2
+ Common::String fallbackFilename;
+ // Handle Bold atleast for the fallback-case.
+ // TODO: Handle italic. (Needs a test-case)
+ if (_isBold) {
+ fallbackFilename = "FreeSansBold.ttf";
+ } else {
+ fallbackFilename = "FreeSans.ttf";
+ }
+
Common::SeekableReadStream *file = BaseFileManager::getEngineInstance()->openFile(_fontFile);
if (!file) {
if (Common::String(_fontFile) != "arial.ttf") {
warning("%s has no replacement font yet, using FreeSans for now (if available)", _fontFile);
}
// Fallback1: Try to find FreeSans.ttf
- file = SearchMan.createReadStreamForMember("FreeSans.ttf");
+ file = SearchMan.createReadStreamForMember(fallbackFilename);
}
if (file) {
@@ -602,10 +604,10 @@ bool BaseFontTT::initFont() {
}
if (themeFile) {
Common::Archive *themeArchive = Common::makeZipArchive(themeFile);
- if (themeArchive->hasFile("FreeSans.ttf")) {
+ if (themeArchive->hasFile(fallbackFilename)) {
file = nullptr;
- file = themeArchive->createReadStreamForMember("FreeSans.ttf");
- _deletableFont = Graphics::loadTTFFont(*file, 96, _fontHeight); // Use the same dpi as WME (96 vs 72).
+ file = themeArchive->createReadStreamForMember(fallbackFilename);
+ _deletableFont = Graphics::loadTTFFont(*file, _fontHeight, 96); // Use the same dpi as WME (96 vs 72).
_font = _deletableFont;
}
// We're not using BaseFileManager, so clean up after ourselves:
@@ -619,10 +621,12 @@ bool BaseFontTT::initFont() {
// Fallback3: Try to ask FontMan for the FreeSans.ttf ScummModern.zip uses:
if (!_font) {
// Really not desireable, as we will get a font with dpi-72 then
- Common::String fontName = Common::String::format("%s-%s@%d", "FreeSans.ttf", "ASCII", _fontHeight);
+ Common::String fontName = Common::String::format("%s-%s@%d", fallbackFilename.c_str(), "ASCII", _fontHeight);
warning("Looking for %s", fontName.c_str());
_font = FontMan.getFontByName(fontName);
}
+#else
+ warning("BaseFontTT::InitFont - FreeType2-support not compiled in, TTF-fonts will not be loaded");
#endif // USE_FREETYPE2
// Fallback4: Just use the Big GUI-font. (REALLY undesireable)
@@ -639,9 +643,9 @@ void BaseFontTT::measureText(const WideString &text, int maxWidth, int maxHeight
//TextLineList lines;
if (maxWidth >= 0) {
- Common::Array<Common::String> lines;
+ Common::Array<WideString> lines;
_font->wordWrapText(text, maxWidth, lines);
- Common::Array<Common::String>::iterator it;
+ Common::Array<WideString>::iterator it;
textWidth = 0;
for (it = lines.begin(); it != lines.end(); ++it) {
textWidth = MAX(textWidth, _font->getStringWidth(*it));
diff --git a/engines/wintermute/base/font/base_font_truetype.h b/engines/wintermute/base/font/base_font_truetype.h
index 9e0a082593..c0349eccd4 100644
--- a/engines/wintermute/base/font/base_font_truetype.h
+++ b/engines/wintermute/base/font/base_font_truetype.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -56,9 +56,8 @@ private:
bool _marked;
uint32 _lastUsed;
- BaseCachedTTFontText() {
+ BaseCachedTTFontText() : _text() {
//_text = L"";
- _text = "";
_width = _maxHeight = _maxLength = -1;
_align = TAL_LEFT;
_surface = nullptr;
@@ -84,9 +83,9 @@ public:
}
bool persist(BasePersistenceManager *persistMgr) {
- persistMgr->transfer(TMEMBER(_offsetX));
- persistMgr->transfer(TMEMBER(_offsetY));
- persistMgr->transfer(TMEMBER(_color));
+ persistMgr->transferSint32(TMEMBER(_offsetX));
+ persistMgr->transferSint32(TMEMBER(_offsetY));
+ persistMgr->transferUint32(TMEMBER(_color));
return STATUS_OK;
}
@@ -135,7 +134,7 @@ private:
size_t _maxCharWidth;
size_t _maxCharHeight;
-public:
+private:
bool _isBold;
bool _isItalic;
bool _isUnderline;
diff --git a/engines/wintermute/base/gfx/base_image.cpp b/engines/wintermute/base/gfx/base_image.cpp
index d0dbae352e..e676fafdbf 100644
--- a/engines/wintermute/base/gfx/base_image.cpp
+++ b/engines/wintermute/base/gfx/base_image.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -29,11 +29,11 @@
#include "engines/wintermute/base/gfx/base_image.h"
#include "engines/wintermute/base/base_file_manager.h"
#include "engines/wintermute/graphics/transparent_surface.h"
-#include "graphics/decoders/png.h"
-#include "graphics/decoders/jpeg.h"
-#include "graphics/decoders/bmp.h"
-#include "graphics/decoders/tga.h"
#include "graphics/surface.h"
+#include "image/png.h"
+#include "image/jpeg.h"
+#include "image/bmp.h"
+#include "image/tga.h"
#include "common/textconsole.h"
#include "common/stream.h"
#include "common/system.h"
@@ -62,16 +62,14 @@ BaseImage::~BaseImage() {
bool BaseImage::loadFile(const Common::String &filename) {
_filename = filename;
_filename.toLowercase();
- if (filename.hasPrefix("savegame:")) {
- _decoder = new Graphics::BitmapDecoder();
+ if (filename.hasPrefix("savegame:") || _filename.hasSuffix(".bmp")) {
+ _decoder = new Image::BitmapDecoder();
} else if (_filename.hasSuffix(".png")) {
- _decoder = new Graphics::PNGDecoder();
- } else if (_filename.hasSuffix(".bmp")) {
- _decoder = new Graphics::BitmapDecoder();
+ _decoder = new Image::PNGDecoder();
} else if (_filename.hasSuffix(".tga")) {
- _decoder = new Graphics::TGADecoder();
+ _decoder = new Image::TGADecoder();
} else if (_filename.hasSuffix(".jpg")) {
- _decoder = new Graphics::JPEGDecoder();
+ _decoder = new Image::JPEGDecoder();
} else {
error("BaseImage::loadFile : Unsupported fileformat %s", filename.c_str());
}
diff --git a/engines/wintermute/base/gfx/base_image.h b/engines/wintermute/base/gfx/base_image.h
index 4b04fd1252..56be9fc453 100644
--- a/engines/wintermute/base/gfx/base_image.h
+++ b/engines/wintermute/base/gfx/base_image.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -31,11 +31,14 @@
#include "graphics/surface.h"
#include "graphics/pixelformat.h"
-#include "graphics/decoders/image_decoder.h"
#include "common/endian.h"
#include "common/str.h"
#include "common/stream.h"
+namespace Image {
+class ImageDecoder;
+}
+
namespace Wintermute {
class BaseSurface;
class BaseFileManager;
@@ -60,7 +63,7 @@ public:
void copyFrom(const Graphics::Surface *surface);
private:
Common::String _filename;
- Graphics::ImageDecoder *_decoder;
+ Image::ImageDecoder *_decoder;
const Graphics::Surface *_surface;
Graphics::Surface *_deletableSurface;
const byte *_palette;
diff --git a/engines/wintermute/base/gfx/base_renderer.cpp b/engines/wintermute/base/gfx/base_renderer.cpp
index 1f171209d7..0f33fc2c43 100644
--- a/engines/wintermute/base/gfx/base_renderer.cpp
+++ b/engines/wintermute/base/gfx/base_renderer.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -65,7 +65,7 @@ BaseRenderer::BaseRenderer(BaseGame *inGame) : BaseClass(inGame) {
_loadImageX = _loadImageY = 0;
_width = _height = _bPP = 0;
- BasePlatform::setRectEmpty(&_monitorRect);
+ _monitorRect.setEmpty();
_realWidth = _realHeight = 0;
_drawOffsetX = _drawOffsetY = 0;
@@ -173,12 +173,12 @@ void BaseRenderer::endSaveLoad() {
}
void BaseRenderer::persistSaveLoadImages(BasePersistenceManager *persistMgr) {
- persistMgr->transfer(TMEMBER(_loadImageName));
- persistMgr->transfer(TMEMBER(_saveImageName));
- persistMgr->transfer(TMEMBER(_saveImageX));
- persistMgr->transfer(TMEMBER(_saveImageY));
- persistMgr->transfer(TMEMBER(_loadImageX));
- persistMgr->transfer(TMEMBER(_loadImageY));
+ persistMgr->transferString(TMEMBER(_loadImageName));
+ persistMgr->transferString(TMEMBER(_saveImageName));
+ persistMgr->transferSint32(TMEMBER(_saveImageX));
+ persistMgr->transferSint32(TMEMBER(_saveImageY));
+ persistMgr->transferSint32(TMEMBER(_loadImageX));
+ persistMgr->transferSint32(TMEMBER(_loadImageY));
}
//////////////////////////////////////////////////////////////////////
@@ -374,7 +374,7 @@ bool BaseRenderer::displayIndicator() {
}
if (_saveLoadImage && !_hasDrawnSaveLoadImage) {
Rect32 rc;
- BasePlatform::setRect(&rc, 0, 0, _saveLoadImage->getWidth(), _saveLoadImage->getHeight());
+ rc.setRect(0, 0, _saveLoadImage->getWidth(), _saveLoadImage->getHeight());
if (_loadInProgress) {
_saveLoadImage->displayTrans(_loadImageX, _loadImageY, rc);
} else {
diff --git a/engines/wintermute/base/gfx/base_renderer.h b/engines/wintermute/base/gfx/base_renderer.h
index b6615bc8fc..42ff2cb9e1 100644
--- a/engines/wintermute/base/gfx/base_renderer.h
+++ b/engines/wintermute/base/gfx/base_renderer.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/wintermute/base/gfx/base_surface.cpp b/engines/wintermute/base/gfx/base_surface.cpp
index 19639c0c33..ec42a63c77 100644
--- a/engines/wintermute/base/gfx/base_surface.cpp
+++ b/engines/wintermute/base/gfx/base_surface.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/wintermute/base/gfx/base_surface.h b/engines/wintermute/base/gfx/base_surface.h
index a53748e9aa..7bd9bcbaea 100644
--- a/engines/wintermute/base/gfx/base_surface.h
+++ b/engines/wintermute/base/gfx/base_surface.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/wintermute/base/gfx/osystem/base_render_osystem.cpp b/engines/wintermute/base/gfx/osystem/base_render_osystem.cpp
index ff63789d18..601fcc0ffa 100644
--- a/engines/wintermute/base/gfx/osystem/base_render_osystem.cpp
+++ b/engines/wintermute/base/gfx/osystem/base_render_osystem.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -268,7 +268,7 @@ Graphics::PixelFormat BaseRenderOSystem::getPixelFormat() const {
return _renderSurface->format;
}
-void BaseRenderOSystem::drawSurface(BaseSurfaceOSystem *owner, const Graphics::Surface *surf, Common::Rect *srcRect, Common::Rect *dstRect, TransformStruct &transform) {
+void BaseRenderOSystem::drawSurface(BaseSurfaceOSystem *owner, const Graphics::Surface *surf, Common::Rect *srcRect, Common::Rect *dstRect, TransformStruct &transform) {
if (_disableDirtyRects) {
RenderTicket *ticket = new RenderTicket(owner, surf, srcRect, dstRect, transform);
@@ -376,7 +376,7 @@ void BaseRenderOSystem::addDirtyRect(const Common::Rect &rect) {
void BaseRenderOSystem::drawTickets() {
RenderQueueIterator it = _renderQueue.begin();
// Clean out the old tickets
- // Note: We draw invalid tickets too, otherwise we wouldn't be honouring
+ // Note: We draw invalid tickets too, otherwise we wouldn't be honoring
// the draw request they obviously made BEFORE becoming invalid, either way
// we have a copy of their data, so their invalidness won't affect us.
while (it != _renderQueue.end()) {
@@ -399,10 +399,23 @@ void BaseRenderOSystem::drawTickets() {
return;
}
- // Apply the clear-color to the dirty rect.
- _renderSurface->fillRect(*_dirtyRect, _clearColor);
+ it = _renderQueue.begin();
_lastFrameIter = _renderQueue.end();
- for (it = _renderQueue.begin(); it != _renderQueue.end(); ++it) {
+ // A special case: If the screen has one giant OPAQUE rect to be drawn, then we skip filling
+ // the background color. Typical use-case: Fullscreen FMVs.
+ // Caveat: The FPS-counter will invalidate this.
+ if (it != _lastFrameIter && _renderQueue.front() == _renderQueue.back() && (*it)->_transform._alphaDisable == true) {
+ // If our single opaque rect fills the dirty rect, we can skip filling.
+ if (*_dirtyRect != (*it)->_dstRect) {
+ // Apply the clear-color to the dirty rect.
+ _renderSurface->fillRect(*_dirtyRect, _clearColor);
+ }
+ // Otherwise Do NOT fill.
+ } else {
+ // Apply the clear-color to the dirty rect.
+ _renderSurface->fillRect(*_dirtyRect, _clearColor);
+ }
+ for (; it != _renderQueue.end(); ++it) {
RenderTicket *ticket = *it;
if (ticket->_dstRect.intersects(*_dirtyRect)) {
// dstClip is the area we want redrawn.
diff --git a/engines/wintermute/base/gfx/osystem/base_render_osystem.h b/engines/wintermute/base/gfx/osystem/base_render_osystem.h
index 8996c8b2e8..c9b8a52282 100644
--- a/engines/wintermute/base/gfx/osystem/base_render_osystem.h
+++ b/engines/wintermute/base/gfx/osystem/base_render_osystem.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/wintermute/base/gfx/osystem/base_surface_osystem.cpp b/engines/wintermute/base/gfx/osystem/base_surface_osystem.cpp
index 9ec8573a87..983f9c1296 100644
--- a/engines/wintermute/base/gfx/osystem/base_surface_osystem.cpp
+++ b/engines/wintermute/base/gfx/osystem/base_surface_osystem.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -32,10 +32,6 @@
#include "engines/wintermute/base/gfx/osystem/base_render_osystem.h"
#include "engines/wintermute/base/gfx/base_image.h"
#include "engines/wintermute/platform_osystem.h"
-#include "graphics/decoders/png.h"
-#include "graphics/decoders/bmp.h"
-#include "graphics/decoders/jpeg.h"
-#include "graphics/decoders/tga.h"
#include "engines/wintermute/graphics/transparent_surface.h"
#include "engines/wintermute/graphics/transform_tools.h"
#include "graphics/pixelformat.h"
@@ -341,7 +337,7 @@ bool BaseSurfaceOSystem::display(int x, int y, Rect32 rect, TSpriteBlendMode ble
//////////////////////////////////////////////////////////////////////////
bool BaseSurfaceOSystem::displayTrans(int x, int y, Rect32 rect, uint32 alpha, TSpriteBlendMode blendMode, bool mirrorX, bool mirrorY) {
_rotation = 0;
- return drawSprite(x, y, &rect, nullptr, TransformStruct(kDefaultZoomX, kDefaultZoomY, blendMode, alpha, mirrorX, mirrorY));
+ return drawSprite(x, y, &rect, nullptr, TransformStruct(kDefaultZoomX, kDefaultZoomY, blendMode, alpha, mirrorX, mirrorY));
}
//////////////////////////////////////////////////////////////////////////
@@ -441,14 +437,20 @@ bool BaseSurfaceOSystem::drawSprite(int x, int y, Rect32 *rect, Rect32 *newRect,
transform._alphaDisable = true;
}
- renderer->drawSurface(this, _surface, &srcRect, &position, transform);
+ renderer->drawSurface(this, _surface, &srcRect, &position, transform);
return STATUS_OK;
}
bool BaseSurfaceOSystem::putSurface(const Graphics::Surface &surface, bool hasAlpha) {
_loaded = true;
- _surface->free();
- _surface->copyFrom(surface);
+ if (surface.format == _surface->format && surface.pitch == _surface->pitch && surface.h == _surface->h) {
+ const byte *src = (const byte *)surface.getBasePtr(0, 0);
+ byte *dst = (byte *)_surface->getBasePtr(0, 0);
+ memcpy(dst, src, surface.pitch * surface.h);
+ } else {
+ _surface->free();
+ _surface->copyFrom(surface);
+ }
if (hasAlpha) {
_alphaType = TransparentSurface::ALPHA_FULL;
} else {
diff --git a/engines/wintermute/base/gfx/osystem/base_surface_osystem.h b/engines/wintermute/base/gfx/osystem/base_surface_osystem.h
index 67f45f66db..4a05b2c66c 100644
--- a/engines/wintermute/base/gfx/osystem/base_surface_osystem.h
+++ b/engines/wintermute/base/gfx/osystem/base_surface_osystem.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/wintermute/base/gfx/osystem/render_ticket.cpp b/engines/wintermute/base/gfx/osystem/render_ticket.cpp
index 1cd35e3b04..f8579dfd41 100644
--- a/engines/wintermute/base/gfx/osystem/render_ticket.cpp
+++ b/engines/wintermute/base/gfx/osystem/render_ticket.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -86,9 +86,9 @@ RenderTicket::~RenderTicket() {
bool RenderTicket::operator==(const RenderTicket &t) const {
if ((t._owner != _owner) ||
- (t._transform != _transform) ||
+ (t._transform != _transform) ||
(t._dstRect != _dstRect) ||
- (t._srcRect != _srcRect)
+ (t._srcRect != _srcRect)
) {
return false;
}
diff --git a/engines/wintermute/base/gfx/osystem/render_ticket.h b/engines/wintermute/base/gfx/osystem/render_ticket.h
index e824c09fe7..de95273021 100644
--- a/engines/wintermute/base/gfx/osystem/render_ticket.h
+++ b/engines/wintermute/base/gfx/osystem/render_ticket.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -41,17 +41,17 @@ class BaseSurfaceOSystem;
* A render ticket is a collection of the data and draw specifications made
* for a single draw-call in the OSystem-backend for WME. The ticket additionally
* holds the order in which this call was made, so that it can be detected if
- * the same call is done in the following frame. Thus allowing us to potentially
- * skip drawing the same region again, unless anything has changed. Since a surface
- * can have a potentially large amount of draw-calls made to it, at varying rotation,
- * zoom, and crop-levels we also need to hold a copy of the necessary data.
- * (Video-surfaces may even change their data). The promise that is made when a ticket
- * is created is that what the state was of the surface at THAT point, is what will end
+ * the same call is done in the following frame. Thus allowing us to potentially
+ * skip drawing the same region again, unless anything has changed. Since a surface
+ * can have a potentially large amount of draw-calls made to it, at varying rotation,
+ * zoom, and crop-levels we also need to hold a copy of the necessary data.
+ * (Video-surfaces may even change their data). The promise that is made when a ticket
+ * is created is that what the state was of the surface at THAT point, is what will end
* up on screen at flip() time.
*/
class RenderTicket {
public:
- RenderTicket(BaseSurfaceOSystem *owner, const Graphics::Surface *surf, Common::Rect *srcRect, Common::Rect *dstRest, TransformStruct transform);
+ RenderTicket(BaseSurfaceOSystem *owner, const Graphics::Surface *surf, Common::Rect *srcRect, Common::Rect *dstRest, TransformStruct transform);
RenderTicket() : _isValid(true), _wantsDraw(false), _transform(TransformStruct()) {}
~RenderTicket();
const Graphics::Surface *getSurface() const { return _surface; }
@@ -65,8 +65,8 @@ public:
bool _isValid;
bool _wantsDraw;
- TransformStruct _transform;
-
+ TransformStruct _transform;
+
BaseSurfaceOSystem *_owner;
bool operator==(const RenderTicket &a) const;
const Common::Rect *getSrcRect() const { return &_srcRect; }
diff --git a/engines/wintermute/base/particles/part_emitter.cpp b/engines/wintermute/base/particles/part_emitter.cpp
index aaffa0965a..c64a099cee 100644
--- a/engines/wintermute/base/particles/part_emitter.cpp
+++ b/engines/wintermute/base/particles/part_emitter.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -38,7 +38,6 @@
#include "engines/wintermute/base/base_file_manager.h"
#include "engines/wintermute/base/gfx/base_renderer.h"
#include "engines/wintermute/utils/utils.h"
-#include "engines/wintermute/platform_osystem.h"
#include "common/str.h"
#include "common/math.h"
@@ -50,7 +49,7 @@ IMPLEMENT_PERSISTENT(PartEmitter, false)
PartEmitter::PartEmitter(BaseGame *inGame, BaseScriptHolder *owner) : BaseObject(inGame) {
_width = _height = 0;
- BasePlatform::setRectEmpty(&_border);
+ _border.setEmpty();
_borderThicknessLeft = _borderThicknessRight = _borderThicknessTop = _borderThicknessBottom = 0;
_angle1 = _angle2 = 0;
@@ -198,7 +197,7 @@ bool PartEmitter::initParticle(PartParticle *particle, uint32 currentTime, uint3
float angVelocity = BaseUtils::randomFloat(_angVelocity1, _angVelocity2);
float growthRate = BaseUtils::randomFloat(_growthRate1, _growthRate2);
- if (!BasePlatform::isRectEmpty(&_border)) {
+ if (!_border.isRectEmpty()) {
int thicknessLeft = (int)(_borderThicknessLeft - (float)_borderThicknessLeft * posZ / 100.0f);
int thicknessRight = (int)(_borderThicknessRight - (float)_borderThicknessRight * posZ / 100.0f);
int thicknessTop = (int)(_borderThicknessTop - (float)_borderThicknessTop * posZ / 100.0f);
@@ -386,7 +385,7 @@ bool PartEmitter::compareZ(const PartParticle *p1, const PartParticle *p2) {
//////////////////////////////////////////////////////////////////////////
bool PartEmitter::setBorder(int x, int y, int width, int height) {
- BasePlatform::setRect(&_border, x, y, x + width, y + height);
+ _border.setRect(x, y, x + width, y + height);
return STATUS_OK;
}
@@ -1157,44 +1156,44 @@ const char *PartEmitter::scToString() {
bool PartEmitter::persist(BasePersistenceManager *persistMgr) {
BaseObject::persist(persistMgr);
- persistMgr->transfer(TMEMBER(_width));
- persistMgr->transfer(TMEMBER(_height));
+ persistMgr->transferSint32(TMEMBER(_width));
+ persistMgr->transferSint32(TMEMBER(_height));
- persistMgr->transfer(TMEMBER(_angle1));
- persistMgr->transfer(TMEMBER(_angle2));
+ persistMgr->transferSint32(TMEMBER(_angle1));
+ persistMgr->transferSint32(TMEMBER(_angle2));
persistMgr->transferFloat(TMEMBER(_velocity1));
persistMgr->transferFloat(TMEMBER(_velocity2));
- persistMgr->transfer(TMEMBER(_velocityZBased));
+ persistMgr->transferBool(TMEMBER(_velocityZBased));
persistMgr->transferFloat(TMEMBER(_scale1));
persistMgr->transferFloat(TMEMBER(_scale2));
- persistMgr->transfer(TMEMBER(_scaleZBased));
+ persistMgr->transferBool(TMEMBER(_scaleZBased));
- persistMgr->transfer(TMEMBER(_maxParticles));
+ persistMgr->transferSint32(TMEMBER(_maxParticles));
- persistMgr->transfer(TMEMBER(_lifeTime1));
- persistMgr->transfer(TMEMBER(_lifeTime2));
- persistMgr->transfer(TMEMBER(_lifeTimeZBased));
+ persistMgr->transferSint32(TMEMBER(_lifeTime1));
+ persistMgr->transferSint32(TMEMBER(_lifeTime2));
+ persistMgr->transferBool(TMEMBER(_lifeTimeZBased));
- persistMgr->transfer(TMEMBER(_genInterval));
- persistMgr->transfer(TMEMBER(_genAmount));
+ persistMgr->transferSint32(TMEMBER(_genInterval));
+ persistMgr->transferSint32(TMEMBER(_genAmount));
- persistMgr->transfer(TMEMBER(_running));
- persistMgr->transfer(TMEMBER(_overheadTime));
+ persistMgr->transferBool(TMEMBER(_running));
+ persistMgr->transferSint32(TMEMBER(_overheadTime));
- persistMgr->transfer(TMEMBER(_border));
- persistMgr->transfer(TMEMBER(_borderThicknessLeft));
- persistMgr->transfer(TMEMBER(_borderThicknessRight));
- persistMgr->transfer(TMEMBER(_borderThicknessTop));
- persistMgr->transfer(TMEMBER(_borderThicknessBottom));
+ persistMgr->transferRect32(TMEMBER(_border));
+ persistMgr->transferSint32(TMEMBER(_borderThicknessLeft));
+ persistMgr->transferSint32(TMEMBER(_borderThicknessRight));
+ persistMgr->transferSint32(TMEMBER(_borderThicknessTop));
+ persistMgr->transferSint32(TMEMBER(_borderThicknessBottom));
- persistMgr->transfer(TMEMBER(_fadeInTime));
- persistMgr->transfer(TMEMBER(_fadeOutTime));
+ persistMgr->transferSint32(TMEMBER(_fadeInTime));
+ persistMgr->transferSint32(TMEMBER(_fadeOutTime));
- persistMgr->transfer(TMEMBER(_alpha1));
- persistMgr->transfer(TMEMBER(_alpha2));
- persistMgr->transfer(TMEMBER(_alphaTimeBased));
+ persistMgr->transferSint32(TMEMBER(_alpha1));
+ persistMgr->transferSint32(TMEMBER(_alpha2));
+ persistMgr->transferBool(TMEMBER(_alphaTimeBased));
persistMgr->transferFloat(TMEMBER(_angVelocity1));
persistMgr->transferFloat(TMEMBER(_angVelocity2));
@@ -1204,14 +1203,14 @@ bool PartEmitter::persist(BasePersistenceManager *persistMgr) {
persistMgr->transferFloat(TMEMBER(_growthRate1));
persistMgr->transferFloat(TMEMBER(_growthRate2));
- persistMgr->transfer(TMEMBER(_exponentialGrowth));
+ persistMgr->transferBool(TMEMBER(_exponentialGrowth));
- persistMgr->transfer(TMEMBER(_useRegion));
+ persistMgr->transferBool(TMEMBER(_useRegion));
- persistMgr->transfer(TMEMBER_INT(_maxBatches));
- persistMgr->transfer(TMEMBER_INT(_batchesGenerated));
+ persistMgr->transferSint32(TMEMBER_INT(_maxBatches));
+ persistMgr->transferSint32(TMEMBER_INT(_batchesGenerated));
- persistMgr->transfer(TMEMBER(_emitEvent));
+ persistMgr->transferCharPtr(TMEMBER(_emitEvent));
persistMgr->transferPtr(TMEMBER_PTR(_owner));
@@ -1220,12 +1219,12 @@ bool PartEmitter::persist(BasePersistenceManager *persistMgr) {
uint32 numForces;
if (persistMgr->getIsSaving()) {
numForces = _forces.size();
- persistMgr->transfer(TMEMBER(numForces));
+ persistMgr->transferUint32(TMEMBER(numForces));
for (uint32 i = 0; i < _forces.size(); i++) {
_forces[i]->persist(persistMgr);
}
} else {
- persistMgr->transfer(TMEMBER(numForces));
+ persistMgr->transferUint32(TMEMBER(numForces));
for (uint32 i = 0; i < numForces; i++) {
PartForce *force = new PartForce(_gameRef);
force->persist(persistMgr);
@@ -1236,12 +1235,12 @@ bool PartEmitter::persist(BasePersistenceManager *persistMgr) {
uint32 numParticles;
if (persistMgr->getIsSaving()) {
numParticles = _particles.size();
- persistMgr->transfer(TMEMBER(numParticles));
+ persistMgr->transferUint32(TMEMBER(numParticles));
for (uint32 i = 0; i < _particles.size(); i++) {
_particles[i]->persist(persistMgr);
}
} else {
- persistMgr->transfer(TMEMBER(numParticles));
+ persistMgr->transferUint32(TMEMBER(numParticles));
for (uint32 i = 0; i < numParticles; i++) {
PartParticle *particle = new PartParticle(_gameRef);
particle->persist(persistMgr);
diff --git a/engines/wintermute/base/particles/part_emitter.h b/engines/wintermute/base/particles/part_emitter.h
index 94b4dc8126..3fe24b52a0 100644
--- a/engines/wintermute/base/particles/part_emitter.h
+++ b/engines/wintermute/base/particles/part_emitter.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/wintermute/base/particles/part_force.cpp b/engines/wintermute/base/particles/part_force.cpp
index 122cdf1afe..c2e0832e72 100644
--- a/engines/wintermute/base/particles/part_force.cpp
+++ b/engines/wintermute/base/particles/part_force.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -49,15 +49,15 @@ PartForce::~PartForce(void) {
bool PartForce::persist(BasePersistenceManager *persistMgr) {
if (persistMgr->getIsSaving()) {
const char *name = getName();
- persistMgr->transfer(TMEMBER(name));
+ persistMgr->transferConstChar(TMEMBER(name));
} else {
const char *name;
- persistMgr->transfer(TMEMBER(name));
+ persistMgr->transferConstChar(TMEMBER(name));
setName(name);
}
- persistMgr->transfer(TMEMBER(_pos));
- persistMgr->transfer(TMEMBER(_direction));
- persistMgr->transfer(TMEMBER_INT(_type));
+ persistMgr->transferVector2(TMEMBER(_pos));
+ persistMgr->transferVector2(TMEMBER(_direction));
+ persistMgr->transferSint32(TMEMBER_INT(_type));
return STATUS_OK;
}
diff --git a/engines/wintermute/base/particles/part_force.h b/engines/wintermute/base/particles/part_force.h
index cdb1ce40f9..11862d08ed 100644
--- a/engines/wintermute/base/particles/part_force.h
+++ b/engines/wintermute/base/particles/part_force.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/wintermute/base/particles/part_particle.cpp b/engines/wintermute/base/particles/part_particle.cpp
index 86cacacb5c..97c81e49a5 100644
--- a/engines/wintermute/base/particles/part_particle.cpp
+++ b/engines/wintermute/base/particles/part_particle.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -45,7 +45,7 @@ PartParticle::PartParticle(BaseGame *inGame) : BaseClass(inGame) {
_creationTime = 0;
_lifeTime = 0;
_isDead = true;
- BasePlatform::setRectEmpty(&_border);
+ _border.setEmpty();
_state = PARTICLE_NORMAL;
_fadeStart = 0;
@@ -125,7 +125,7 @@ bool PartParticle::update(PartEmitter *emitter, uint32 currentTime, uint32 timer
}
// particle hit the border
- if (!_isDead && !BasePlatform::isRectEmpty(&_border)) {
+ if (!_isDead && !_border.isRectEmpty()) {
Point32 p;
p.x = (int32)_pos.x;
p.y = (int32)_pos.y;
@@ -230,32 +230,32 @@ bool PartParticle::fadeOut(uint32 currentTime, int fadeTime) {
//////////////////////////////////////////////////////////////////////////
bool PartParticle::persist(BasePersistenceManager *persistMgr) {
- persistMgr->transfer(TMEMBER(_alpha1));
- persistMgr->transfer(TMEMBER(_alpha2));
- persistMgr->transfer(TMEMBER(_border));
- persistMgr->transfer(TMEMBER(_pos));
+ persistMgr->transferSint32(TMEMBER(_alpha1));
+ persistMgr->transferSint32(TMEMBER(_alpha2));
+ persistMgr->transferRect32(TMEMBER(_border));
+ persistMgr->transferVector2(TMEMBER(_pos));
persistMgr->transferFloat(TMEMBER(_posZ));
- persistMgr->transfer(TMEMBER(_velocity));
+ persistMgr->transferVector2(TMEMBER(_velocity));
persistMgr->transferFloat(TMEMBER(_scale));
- persistMgr->transfer(TMEMBER(_creationTime));
- persistMgr->transfer(TMEMBER(_lifeTime));
- persistMgr->transfer(TMEMBER(_isDead));
- persistMgr->transfer(TMEMBER_INT(_state));
- persistMgr->transfer(TMEMBER(_fadeStart));
- persistMgr->transfer(TMEMBER(_fadeTime));
- persistMgr->transfer(TMEMBER(_currentAlpha));
+ persistMgr->transferUint32(TMEMBER(_creationTime));
+ persistMgr->transferSint32(TMEMBER(_lifeTime));
+ persistMgr->transferBool(TMEMBER(_isDead));
+ persistMgr->transferSint32(TMEMBER_INT(_state));
+ persistMgr->transferUint32(TMEMBER(_fadeStart));
+ persistMgr->transferSint32(TMEMBER(_fadeTime));
+ persistMgr->transferSint32(TMEMBER(_currentAlpha));
persistMgr->transferFloat(TMEMBER(_angVelocity));
persistMgr->transferFloat(TMEMBER(_rotation));
persistMgr->transferFloat(TMEMBER(_growthRate));
- persistMgr->transfer(TMEMBER(_exponentialGrowth));
- persistMgr->transfer(TMEMBER(_fadeStartAlpha));
+ persistMgr->transferBool(TMEMBER(_exponentialGrowth));
+ persistMgr->transferSint32(TMEMBER(_fadeStartAlpha));
if (persistMgr->getIsSaving()) {
const char *filename = _sprite->getFilename();
- persistMgr->transfer(TMEMBER(filename));
+ persistMgr->transferConstChar(TMEMBER(filename));
} else {
char *filename;
- persistMgr->transfer(TMEMBER(filename));
+ persistMgr->transferCharPtr(TMEMBER(filename));
SystemClassRegistry::getInstance()->_disabled = true;
setSprite(filename);
SystemClassRegistry::getInstance()->_disabled = false;
diff --git a/engines/wintermute/base/particles/part_particle.h b/engines/wintermute/base/particles/part_particle.h
index 281d87cf72..9019845a82 100644
--- a/engines/wintermute/base/particles/part_particle.h
+++ b/engines/wintermute/base/particles/part_particle.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/wintermute/base/save_thumb_helper.cpp b/engines/wintermute/base/save_thumb_helper.cpp
index 77514849a6..b1d9330263 100644
--- a/engines/wintermute/base/save_thumb_helper.cpp
+++ b/engines/wintermute/base/save_thumb_helper.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/wintermute/base/save_thumb_helper.h b/engines/wintermute/base/save_thumb_helper.h
index 44792e3d75..0d32d3ed9f 100644
--- a/engines/wintermute/base/save_thumb_helper.h
+++ b/engines/wintermute/base/save_thumb_helper.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/wintermute/base/saveload.cpp b/engines/wintermute/base/saveload.cpp
index 8d37909bb4..85553a2a53 100644
--- a/engines/wintermute/base/saveload.cpp
+++ b/engines/wintermute/base/saveload.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -48,6 +48,7 @@ bool SaveLoad::loadGame(const Common::String &filename, BaseGame *gameRef) {
bool ret;
+ gameRef->stopVideo();
gameRef->_renderer->initSaveLoad(false);
gameRef->_loadInProgress = true;
diff --git a/engines/wintermute/base/saveload.h b/engines/wintermute/base/saveload.h
index 15d4d86b26..31f5841f41 100644
--- a/engines/wintermute/base/saveload.h
+++ b/engines/wintermute/base/saveload.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/wintermute/base/scriptables/dcscript.h b/engines/wintermute/base/scriptables/dcscript.h
index d6bb3cd176..8047baaa68 100644
--- a/engines/wintermute/base/scriptables/dcscript.h
+++ b/engines/wintermute/base/scriptables/dcscript.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/wintermute/base/scriptables/script.cpp b/engines/wintermute/base/scriptables/script.cpp
index 5aeff78c50..44fd117e61 100644
--- a/engines/wintermute/base/scriptables/script.cpp
+++ b/engines/wintermute/base/scriptables/script.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -488,7 +488,8 @@ double ScScript::getFloat() {
SWAP(buffer[3], buffer[4]);
#endif
- double ret = *(double *)(buffer);
+ double ret;
+ memcpy(&ret, buffer, sizeof(double));
_iP += 8; // Hardcode the double-size used originally.
return ret;
}
@@ -1249,15 +1250,15 @@ bool ScScript::persist(BasePersistenceManager *persistMgr) {
// buffer
if (persistMgr->getIsSaving()) {
if (_state != SCRIPT_PERSISTENT && _state != SCRIPT_FINISHED && _state != SCRIPT_THREAD_FINISHED) {
- persistMgr->transfer(TMEMBER(_bufferSize));
+ persistMgr->transferUint32(TMEMBER(_bufferSize));
persistMgr->putBytes(_buffer, _bufferSize);
} else {
// don't save idle/finished scripts
int32 bufferSize = 0;
- persistMgr->transfer(TMEMBER(bufferSize));
+ persistMgr->transferSint32(TMEMBER(bufferSize));
}
} else {
- persistMgr->transfer(TMEMBER(_bufferSize));
+ persistMgr->transferUint32(TMEMBER(_bufferSize));
if (_bufferSize > 0) {
_buffer = new byte[_bufferSize];
persistMgr->getBytes(_buffer, _bufferSize);
@@ -1270,31 +1271,31 @@ bool ScScript::persist(BasePersistenceManager *persistMgr) {
}
persistMgr->transferPtr(TMEMBER_PTR(_callStack));
- persistMgr->transfer(TMEMBER(_currentLine));
+ persistMgr->transferSint32(TMEMBER(_currentLine));
persistMgr->transferPtr(TMEMBER_PTR(_engine));
- persistMgr->transfer(TMEMBER(_filename));
- persistMgr->transfer(TMEMBER(_freezable));
+ persistMgr->transferCharPtr(TMEMBER(_filename));
+ persistMgr->transferBool(TMEMBER(_freezable));
persistMgr->transferPtr(TMEMBER_PTR(_globals));
- persistMgr->transfer(TMEMBER(_iP));
+ persistMgr->transferUint32(TMEMBER(_iP));
persistMgr->transferPtr(TMEMBER_PTR(_scopeStack));
persistMgr->transferPtr(TMEMBER_PTR(_stack));
- persistMgr->transfer(TMEMBER_INT(_state));
+ persistMgr->transferSint32(TMEMBER_INT(_state));
persistMgr->transferPtr(TMEMBER_PTR(_operand));
- persistMgr->transfer(TMEMBER_INT(_origState));
+ persistMgr->transferSint32(TMEMBER_INT(_origState));
persistMgr->transferPtr(TMEMBER_PTR(_owner));
persistMgr->transferPtr(TMEMBER_PTR(_reg1));
- persistMgr->transfer(TMEMBER(_thread));
- persistMgr->transfer(TMEMBER(_threadEvent));
+ persistMgr->transferBool(TMEMBER(_thread));
+ persistMgr->transferCharPtr(TMEMBER(_threadEvent));
persistMgr->transferPtr(TMEMBER_PTR(_thisStack));
- persistMgr->transfer(TMEMBER(_timeSlice));
+ persistMgr->transferUint32(TMEMBER(_timeSlice));
persistMgr->transferPtr(TMEMBER_PTR(_waitObject));
persistMgr->transferPtr(TMEMBER_PTR(_waitScript));
- persistMgr->transfer(TMEMBER(_waitTime));
- persistMgr->transfer(TMEMBER(_waitFrozen));
+ persistMgr->transferUint32(TMEMBER(_waitTime));
+ persistMgr->transferBool(TMEMBER(_waitFrozen));
- persistMgr->transfer(TMEMBER(_methodThread));
- persistMgr->transfer(TMEMBER(_methodThread));
- persistMgr->transfer(TMEMBER(_unbreakable));
+ persistMgr->transferBool(TMEMBER(_methodThread));
+ persistMgr->transferBool(TMEMBER(_methodThread)); // TODO-SAVE: Deduplicate.
+ persistMgr->transferBool(TMEMBER(_unbreakable));
persistMgr->transferPtr(TMEMBER_PTR(_parentScript));
if (!persistMgr->getIsSaving()) {
diff --git a/engines/wintermute/base/scriptables/script.h b/engines/wintermute/base/scriptables/script.h
index 488ff63606..1edeae5b55 100644
--- a/engines/wintermute/base/scriptables/script.h
+++ b/engines/wintermute/base/scriptables/script.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/wintermute/base/scriptables/script_engine.cpp b/engines/wintermute/base/scriptables/script_engine.cpp
index bb819b23e4..cdf55a304c 100644
--- a/engines/wintermute/base/scriptables/script_engine.cpp
+++ b/engines/wintermute/base/scriptables/script_engine.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/wintermute/base/scriptables/script_engine.h b/engines/wintermute/base/scriptables/script_engine.h
index 622b3c4b94..bdb139e1f8 100644
--- a/engines/wintermute/base/scriptables/script_engine.h
+++ b/engines/wintermute/base/scriptables/script_engine.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/wintermute/base/scriptables/script_ext_array.cpp b/engines/wintermute/base/scriptables/script_ext_array.cpp
index 7f1c769ec5..7431029cbf 100644
--- a/engines/wintermute/base/scriptables/script_ext_array.cpp
+++ b/engines/wintermute/base/scriptables/script_ext_array.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -214,7 +214,7 @@ bool SXArray::scSetProperty(const char *name, ScValue *value) {
bool SXArray::persist(BasePersistenceManager *persistMgr) {
BaseScriptable::persist(persistMgr);
- persistMgr->transfer(TMEMBER(_length));
+ persistMgr->transferSint32(TMEMBER(_length));
persistMgr->transferPtr(TMEMBER_PTR(_values));
return STATUS_OK;
diff --git a/engines/wintermute/base/scriptables/script_ext_array.h b/engines/wintermute/base/scriptables/script_ext_array.h
index e6381a011e..2daa58a241 100644
--- a/engines/wintermute/base/scriptables/script_ext_array.h
+++ b/engines/wintermute/base/scriptables/script_ext_array.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/wintermute/base/scriptables/script_ext_date.cpp b/engines/wintermute/base/scriptables/script_ext_date.cpp
index d88bfc5851..89cdcde0af 100644
--- a/engines/wintermute/base/scriptables/script_ext_date.cpp
+++ b/engines/wintermute/base/scriptables/script_ext_date.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -243,15 +243,15 @@ bool SXDate::persist(BasePersistenceManager *persistMgr) {
int32 hour = _tm.tm_hour;
int32 min = _tm.tm_min;
int32 sec = _tm.tm_sec;
- persistMgr->transfer(TMEMBER(year));
- persistMgr->transfer(TMEMBER(mon));
- persistMgr->transfer(TMEMBER(mday));
- persistMgr->transfer(TMEMBER(hour));
- persistMgr->transfer(TMEMBER(min));
- persistMgr->transfer(TMEMBER(sec));
+ persistMgr->transferSint32(TMEMBER(year));
+ persistMgr->transferSint32(TMEMBER(mon));
+ persistMgr->transferSint32(TMEMBER(mday));
+ persistMgr->transferSint32(TMEMBER(hour));
+ persistMgr->transferSint32(TMEMBER(min));
+ persistMgr->transferSint32(TMEMBER(sec));
if (persistMgr->checkVersion(1, 2, 1)) {
int32 wday = _tm.tm_wday;
- persistMgr->transfer(TMEMBER(wday));
+ persistMgr->transferSint32(TMEMBER(wday));
_tm.tm_wday = wday;
}
_tm.tm_year = year;
diff --git a/engines/wintermute/base/scriptables/script_ext_date.h b/engines/wintermute/base/scriptables/script_ext_date.h
index 0ccf093a7b..46a23a36fa 100644
--- a/engines/wintermute/base/scriptables/script_ext_date.h
+++ b/engines/wintermute/base/scriptables/script_ext_date.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/wintermute/base/scriptables/script_ext_file.cpp b/engines/wintermute/base/scriptables/script_ext_file.cpp
index 18f7b8213a..15ddd4bcca 100644
--- a/engines/wintermute/base/scriptables/script_ext_file.cpp
+++ b/engines/wintermute/base/scriptables/script_ext_file.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -443,7 +443,7 @@ bool SXFile::scCallMethod(ScScript *script, ScStack *stack, ScStack *thisStack,
return STATUS_OK;
}
float val;
- (*(uint32 *)&val) = _readFile->readUint32LE();
+ WRITE_UINT32(&val, _readFile->readUint32LE());
if (!_readFile->err()) {
stack->pushFloat(val);
} else {
@@ -766,16 +766,16 @@ bool SXFile::persist(BasePersistenceManager *persistMgr) {
BaseScriptable::persist(persistMgr);
- persistMgr->transfer(TMEMBER(_filename));
- persistMgr->transfer(TMEMBER(_mode));
- persistMgr->transfer(TMEMBER(_textMode));
+ persistMgr->transferCharPtr(TMEMBER(_filename));
+ persistMgr->transferSint32(TMEMBER(_mode));
+ persistMgr->transferBool(TMEMBER(_textMode));
uint32 pos = 0;
if (persistMgr->getIsSaving()) {
pos = getPos();
- persistMgr->transfer(TMEMBER(pos));
+ persistMgr->transferUint32(TMEMBER(pos));
} else {
- persistMgr->transfer(TMEMBER(pos));
+ persistMgr->transferUint32(TMEMBER(pos));
// try to re-open file if needed
_writeFile = nullptr;
diff --git a/engines/wintermute/base/scriptables/script_ext_file.h b/engines/wintermute/base/scriptables/script_ext_file.h
index a1298929f2..4994ef9c97 100644
--- a/engines/wintermute/base/scriptables/script_ext_file.h
+++ b/engines/wintermute/base/scriptables/script_ext_file.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/wintermute/base/scriptables/script_ext_math.cpp b/engines/wintermute/base/scriptables/script_ext_math.cpp
index ec53b983e7..4d770d4c51 100644
--- a/engines/wintermute/base/scriptables/script_ext_math.cpp
+++ b/engines/wintermute/base/scriptables/script_ext_math.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/wintermute/base/scriptables/script_ext_math.h b/engines/wintermute/base/scriptables/script_ext_math.h
index 1aa274a96f..5354e52f1e 100644
--- a/engines/wintermute/base/scriptables/script_ext_math.h
+++ b/engines/wintermute/base/scriptables/script_ext_math.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/wintermute/base/scriptables/script_ext_mem_buffer.cpp b/engines/wintermute/base/scriptables/script_ext_mem_buffer.cpp
index 6a47c09136..276d1fb211 100644
--- a/engines/wintermute/base/scriptables/script_ext_mem_buffer.cpp
+++ b/engines/wintermute/base/scriptables/script_ext_mem_buffer.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -498,7 +498,7 @@ bool SXMemBuffer::persist(BasePersistenceManager *persistMgr) {
BaseScriptable::persist(persistMgr);
- persistMgr->transfer(TMEMBER(_size));
+ persistMgr->transferSint32(TMEMBER(_size));
if (persistMgr->getIsSaving()) {
if (_size > 0) {
diff --git a/engines/wintermute/base/scriptables/script_ext_mem_buffer.h b/engines/wintermute/base/scriptables/script_ext_mem_buffer.h
index 4aad8b6484..740ff1d23f 100644
--- a/engines/wintermute/base/scriptables/script_ext_mem_buffer.h
+++ b/engines/wintermute/base/scriptables/script_ext_mem_buffer.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/wintermute/base/scriptables/script_ext_object.cpp b/engines/wintermute/base/scriptables/script_ext_object.cpp
index a72b244f0a..cf1b788ede 100644
--- a/engines/wintermute/base/scriptables/script_ext_object.cpp
+++ b/engines/wintermute/base/scriptables/script_ext_object.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/wintermute/base/scriptables/script_ext_object.h b/engines/wintermute/base/scriptables/script_ext_object.h
index 566111292a..04878be85e 100644
--- a/engines/wintermute/base/scriptables/script_ext_object.h
+++ b/engines/wintermute/base/scriptables/script_ext_object.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/wintermute/base/scriptables/script_ext_string.cpp b/engines/wintermute/base/scriptables/script_ext_string.cpp
index 2f2422cdf9..bc0c658c57 100644
--- a/engines/wintermute/base/scriptables/script_ext_string.cpp
+++ b/engines/wintermute/base/scriptables/script_ext_string.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -298,21 +298,15 @@ bool SXString::scCallMethod(ScScript *script, ScStack *stack, ScStack *thisStack
uint32 start = 0;
for(uint32 i = 0; i < str.size() + 1; i++) {
- char ch = str.c_str()[i];
- if(ch=='\0' || delims.contains(ch))
- {
- char *part = new char[i - start + 1];
- if(i != start) {
- Common::strlcpy(part, str.c_str() + start, i - start + 1);
- part[i - start] = '\0';
+ // The [] operator doesn't allow access to the zero code terminator
+ // (bug #6531)
+ uint32 ch = (i == str.size()) ? '\0' : str[i];
+ if (ch =='\0' || delims.contains(ch)) {
+ if (i != start) {
+ parts.push_back(WideString(str.c_str() + start, i - start + 1));
} else {
- part[0] = '\0';
+ parts.push_back(WideString());
}
- val = new ScValue(_gameRef, part);
- array->push(val);
- delete[] part;
- delete val;
- val = nullptr;
start = i + 1;
}
}
@@ -406,7 +400,7 @@ bool SXString::persist(BasePersistenceManager *persistMgr) {
BaseScriptable::persist(persistMgr);
- persistMgr->transfer(TMEMBER(_capacity));
+ persistMgr->transferSint32(TMEMBER(_capacity));
if (persistMgr->getIsSaving()) {
if (_capacity > 0) {
diff --git a/engines/wintermute/base/scriptables/script_ext_string.h b/engines/wintermute/base/scriptables/script_ext_string.h
index 7a95c59b4c..b28f2b24c1 100644
--- a/engines/wintermute/base/scriptables/script_ext_string.h
+++ b/engines/wintermute/base/scriptables/script_ext_string.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/wintermute/base/scriptables/script_stack.cpp b/engines/wintermute/base/scriptables/script_stack.cpp
index 801ac6ab52..fe765bfb68 100644
--- a/engines/wintermute/base/scriptables/script_stack.cpp
+++ b/engines/wintermute/base/scriptables/script_stack.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -186,7 +186,7 @@ bool ScStack::persist(BasePersistenceManager *persistMgr) {
persistMgr->transferPtr(TMEMBER_PTR(_gameRef));
- persistMgr->transfer(TMEMBER(_sP));
+ persistMgr->transferSint32(TMEMBER(_sP));
_values.persist(persistMgr);
return STATUS_OK;
diff --git a/engines/wintermute/base/scriptables/script_stack.h b/engines/wintermute/base/scriptables/script_stack.h
index ee04485a51..fe7afae3f9 100644
--- a/engines/wintermute/base/scriptables/script_stack.h
+++ b/engines/wintermute/base/scriptables/script_stack.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/wintermute/base/scriptables/script_value.cpp b/engines/wintermute/base/scriptables/script_value.cpp
index 31ec457df1..4b84574257 100644
--- a/engines/wintermute/base/scriptables/script_value.cpp
+++ b/engines/wintermute/base/scriptables/script_value.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -791,32 +791,32 @@ void ScValue::setValue(ScValue *val) {
bool ScValue::persist(BasePersistenceManager *persistMgr) {
persistMgr->transferPtr(TMEMBER_PTR(_gameRef));
- persistMgr->transfer(TMEMBER(_persistent));
- persistMgr->transfer(TMEMBER(_isConstVar));
- persistMgr->transfer(TMEMBER_INT(_type));
- persistMgr->transfer(TMEMBER(_valBool));
- persistMgr->transfer(TMEMBER(_valFloat));
- persistMgr->transfer(TMEMBER(_valInt));
+ persistMgr->transferBool(TMEMBER(_persistent));
+ persistMgr->transferBool(TMEMBER(_isConstVar));
+ persistMgr->transferSint32(TMEMBER_INT(_type));
+ persistMgr->transferBool(TMEMBER(_valBool));
+ persistMgr->transferDouble(TMEMBER(_valFloat));
+ persistMgr->transferSint32(TMEMBER(_valInt));
persistMgr->transferPtr(TMEMBER_PTR(_valNative));
int32 size;
const char *str;
if (persistMgr->getIsSaving()) {
size = _valObject.size();
- persistMgr->transfer("", &size);
+ persistMgr->transferSint32("", &size);
_valIter = _valObject.begin();
while (_valIter != _valObject.end()) {
str = _valIter->_key.c_str();
- persistMgr->transfer("", &str);
+ persistMgr->transferConstChar("", &str);
persistMgr->transferPtr("", &_valIter->_value);
_valIter++;
}
} else {
ScValue *val = nullptr;
- persistMgr->transfer("", &size);
+ persistMgr->transferSint32("", &size);
for (int i = 0; i < size; i++) {
- persistMgr->transfer("", &str);
+ persistMgr->transferConstChar("", &str);
persistMgr->transferPtr("", &val);
_valObject[str] = val;
@@ -825,7 +825,7 @@ bool ScValue::persist(BasePersistenceManager *persistMgr) {
}
persistMgr->transferPtr(TMEMBER_PTR(_valRef));
- persistMgr->transfer(TMEMBER(_valString));
+ persistMgr->transferCharPtr(TMEMBER(_valString));
if (!persistMgr->getIsSaving() && !persistMgr->checkVersion(1,2,2)) {
// Savegames prior to 1.2.2 stored empty strings as NULL.
diff --git a/engines/wintermute/base/scriptables/script_value.h b/engines/wintermute/base/scriptables/script_value.h
index 90ad9f182a..6130553645 100644
--- a/engines/wintermute/base/scriptables/script_value.h
+++ b/engines/wintermute/base/scriptables/script_value.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/wintermute/base/sound/base_sound.cpp b/engines/wintermute/base/sound/base_sound.cpp
index c1923b3ca8..fa452cc0d6 100644
--- a/engines/wintermute/base/sound/base_sound.cpp
+++ b/engines/wintermute/base/sound/base_sound.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -166,16 +166,16 @@ bool BaseSound::persist(BasePersistenceManager *persistMgr) {
persistMgr->transferPtr(TMEMBER_PTR(_gameRef));
- persistMgr->transfer(TMEMBER(_soundFilename));
- persistMgr->transfer(TMEMBER(_soundLooping));
- persistMgr->transfer(TMEMBER(_soundPaused));
- persistMgr->transfer(TMEMBER(_soundFreezePaused));
- persistMgr->transfer(TMEMBER(_soundPlaying));
- persistMgr->transfer(TMEMBER(_soundPosition));
- persistMgr->transfer(TMEMBER(_soundPrivateVolume));
- persistMgr->transfer(TMEMBER(_soundStreamed));
- persistMgr->transfer(TMEMBER_INT(_soundType));
- persistMgr->transfer(TMEMBER(_soundLoopStart));
+ persistMgr->transferString(TMEMBER(_soundFilename));
+ persistMgr->transferBool(TMEMBER(_soundLooping));
+ persistMgr->transferBool(TMEMBER(_soundPaused));
+ persistMgr->transferBool(TMEMBER(_soundFreezePaused));
+ persistMgr->transferBool(TMEMBER(_soundPlaying));
+ persistMgr->transferUint32(TMEMBER(_soundPosition));
+ persistMgr->transferSint32(TMEMBER(_soundPrivateVolume));
+ persistMgr->transferBool(TMEMBER(_soundStreamed));
+ persistMgr->transferSint32(TMEMBER_INT(_soundType));
+ persistMgr->transferUint32(TMEMBER(_soundLoopStart));
return STATUS_OK;
}
diff --git a/engines/wintermute/base/sound/base_sound.h b/engines/wintermute/base/sound/base_sound.h
index 0a984d240a..ceeb81c1bf 100644
--- a/engines/wintermute/base/sound/base_sound.h
+++ b/engines/wintermute/base/sound/base_sound.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/wintermute/base/sound/base_sound_buffer.cpp b/engines/wintermute/base/sound/base_sound_buffer.cpp
index 7666a441a3..7ec68ea752 100644
--- a/engines/wintermute/base/sound/base_sound_buffer.cpp
+++ b/engines/wintermute/base/sound/base_sound_buffer.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -58,6 +58,7 @@ BaseSoundBuffer::BaseSoundBuffer(BaseGame *inGame) : BaseClass(inGame) {
_file = nullptr;
_privateVolume = 255;
_volume = 255;
+ _pan = 0;
_looping = false;
_loopStart = 0;
@@ -143,9 +144,9 @@ bool BaseSoundBuffer::play(bool looping, uint32 startSample) {
_handle = new Audio::SoundHandle;
if (_looping) {
Audio::AudioStream *loopStream = new Audio::LoopingAudioStream(_stream, 0, DisposeAfterUse::NO);
- g_system->getMixer()->playStream(_type, _handle, loopStream, -1, _volume, 0, DisposeAfterUse::YES);
+ g_system->getMixer()->playStream(_type, _handle, loopStream, -1, _volume, _pan, DisposeAfterUse::YES);
} else {
- g_system->getMixer()->playStream(_type, _handle, _stream, -1, _volume, 0, DisposeAfterUse::NO);
+ g_system->getMixer()->playStream(_type, _handle, _stream, -1, _volume, _pan, DisposeAfterUse::NO);
}
}
@@ -268,8 +269,11 @@ bool BaseSoundBuffer::setLoopStart(uint32 pos) {
//////////////////////////////////////////////////////////////////////////
bool BaseSoundBuffer::setPan(float pan) {
+ pan = MAX(pan, -1.0f);
+ pan = MIN(pan, 1.0f);
+ _pan = (int8)(pan * 127);
if (_handle) {
- g_system->getMixer()->setChannelBalance(*_handle, (int8)(pan * 127));
+ g_system->getMixer()->setChannelBalance(*_handle, _pan);
}
return STATUS_OK;
}
diff --git a/engines/wintermute/base/sound/base_sound_buffer.h b/engines/wintermute/base/sound/base_sound_buffer.h
index 53b86f64c6..94bc8dc6ad 100644
--- a/engines/wintermute/base/sound/base_sound_buffer.h
+++ b/engines/wintermute/base/sound/base_sound_buffer.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -93,6 +93,7 @@ private:
bool _streamed;
Common::SeekableReadStream *_file;
int32 _volume;
+ int8 _pan;
};
} // End of namespace Wintermute
diff --git a/engines/wintermute/base/sound/base_sound_manager.cpp b/engines/wintermute/base/sound/base_sound_manager.cpp
index 68e62f25b0..539dc0dd1d 100644
--- a/engines/wintermute/base/sound/base_sound_manager.cpp
+++ b/engines/wintermute/base/sound/base_sound_manager.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/wintermute/base/sound/base_sound_manager.h b/engines/wintermute/base/sound/base_sound_manager.h
index 5993a05001..30d943c264 100644
--- a/engines/wintermute/base/sound/base_sound_manager.h
+++ b/engines/wintermute/base/sound/base_sound_manager.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/wintermute/base/timer.cpp b/engines/wintermute/base/timer.cpp
index 96097c10d5..c2ecc1469a 100644
--- a/engines/wintermute/base/timer.cpp
+++ b/engines/wintermute/base/timer.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -66,9 +66,9 @@ uint32 Timer::getTimeLast() const {
}
void Timer::persist(BasePersistenceManager *persistMgr) {
- persistMgr->transfer(TMEMBER(_timer));
- persistMgr->transfer(TMEMBER(_timerDelta));
- persistMgr->transfer(TMEMBER(_timerLast));
+ persistMgr->transferUint32(TMEMBER(_timer));
+ persistMgr->transferUint32(TMEMBER(_timerDelta));
+ persistMgr->transferUint32(TMEMBER(_timerLast));
}
} // End of namespace Wintermute
diff --git a/engines/wintermute/base/timer.h b/engines/wintermute/base/timer.h
index 4099c6c825..768bea4253 100644
--- a/engines/wintermute/base/timer.h
+++ b/engines/wintermute/base/timer.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/wintermute/coll_templ.h b/engines/wintermute/coll_templ.h
index a3df92d6c8..74e266168f 100644
--- a/engines/wintermute/coll_templ.h
+++ b/engines/wintermute/coll_templ.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -67,7 +67,7 @@ class BaseArray : public BaseArrayBase<TYPE> {
int32 j;
if (persistMgr->getIsSaving()) {
j = Common::Array<TYPE>::size();
- persistMgr->transfer("ArraySize", &j);
+ persistMgr->transferSint32("ArraySize", &j);
typename Common::Array<TYPE>::const_iterator it = Common::Array<TYPE>::begin();
for (; it != Common::Array<TYPE>::end(); ++it) {
TYPE obj = *it;
@@ -75,7 +75,7 @@ class BaseArray : public BaseArrayBase<TYPE> {
}
} else {
Common::Array<TYPE>::clear();
- persistMgr->transfer("ArraySize", &j);
+ persistMgr->transferSint32("ArraySize", &j);
for (int i = 0; i < j; i++) {
TYPE obj = nullptr;
persistMgr->transferPtr("", &obj);
@@ -93,18 +93,18 @@ class BaseArray<char *> : public BaseArrayBase<char *> {
int32 j;
if (persistMgr->getIsSaving()) {
j = Common::Array<char *>::size();
- persistMgr->transfer("ArraySize", &j);
+ persistMgr->transferSint32("ArraySize", &j);
Common::Array<char *>::const_iterator it = Common::Array<char *>::begin();
for (; it != Common::Array<char *>::end(); ++it) {
char * obj = *it;
- persistMgr->transfer("", &obj);
+ persistMgr->transferCharPtr("", &obj);
}
} else {
Common::Array<char *>::clear();
- persistMgr->transfer("ArraySize", &j);
+ persistMgr->transferSint32("ArraySize", &j);
for (int i = 0; i < j; i++) {
char * obj = nullptr;
- persistMgr->transfer("", &obj);
+ persistMgr->transferCharPtr("", &obj);
add(obj);
}
}
@@ -119,18 +119,18 @@ public:
int32 j;
if (persistMgr->getIsSaving()) {
j = Common::Array<const char *>::size();
- persistMgr->transfer("ArraySize", &j);
+ persistMgr->transferSint32("ArraySize", &j);
Common::Array<const char *>::const_iterator it = Common::Array<const char *>::begin();
for (; it != Common::Array<const char *>::end(); ++it) {
const char * obj = *it;
- persistMgr->transfer("", &obj);
+ persistMgr->transferConstChar("", &obj);
}
} else {
Common::Array<const char *>::clear();
- persistMgr->transfer("ArraySize", &j);
+ persistMgr->transferSint32("ArraySize", &j);
for (int i = 0; i < j; i++) {
const char * obj = nullptr;
- persistMgr->transfer("", &obj);
+ persistMgr->transferConstChar("", &obj);
add(obj);
}
}
diff --git a/engines/wintermute/configure.engine b/engines/wintermute/configure.engine
new file mode 100644
index 0000000000..bdaf49de3f
--- /dev/null
+++ b/engines/wintermute/configure.engine
@@ -0,0 +1,3 @@
+# This file is included from the main "configure" script
+# add_engine [name] [desc] [build-by-default] [subengines] [base games] [deps]
+add_engine wintermute "Wintermute" yes "" "" "jpeg png zlib vorbis 16bit"
diff --git a/engines/wintermute/dcgf.h b/engines/wintermute/dcgf.h
index 3db443965e..78503b8c3b 100644
--- a/engines/wintermute/dcgf.h
+++ b/engines/wintermute/dcgf.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/wintermute/dctypes.h b/engines/wintermute/dctypes.h
index b40322147f..33e1cc4018 100644
--- a/engines/wintermute/dctypes.h
+++ b/engines/wintermute/dctypes.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -31,6 +31,7 @@
#include "common/str.h"
+#include "common/ustr.h"
#include "common/list.h"
#include "common/array.h"
@@ -41,7 +42,7 @@ namespace Wintermute {
//typedef std::wstring WideString;
typedef Common::String AnsiString;
typedef Common::String Utf8String;
-typedef Common::String WideString; // NB: Not actually true I presume.
+typedef Common::U32String WideString;
typedef Common::List<WideString> WideStringList;
typedef Common::List<AnsiString> AnsiStringList;
diff --git a/engines/wintermute/debugger.cpp b/engines/wintermute/debugger.cpp
index 8c8b8255ab..a313314a8b 100644
--- a/engines/wintermute/debugger.cpp
+++ b/engines/wintermute/debugger.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -29,8 +29,8 @@
namespace Wintermute {
Console::Console(WintermuteEngine *vm) : GUI::Debugger(), _engineRef(vm) {
- DCmd_Register("show_fps", WRAP_METHOD(Console, Cmd_ShowFps));
- DCmd_Register("dump_file", WRAP_METHOD(Console, Cmd_DumpFile));
+ registerCmd("show_fps", WRAP_METHOD(Console, Cmd_ShowFps));
+ registerCmd("dump_file", WRAP_METHOD(Console, Cmd_DumpFile));
}
Console::~Console(void) {
@@ -50,7 +50,7 @@ bool Console::Cmd_ShowFps(int argc, const char **argv) {
bool Console::Cmd_DumpFile(int argc, const char **argv) {
if (argc != 3) {
- DebugPrintf("Usage: %s <file path> <output file name>\n", argv[0]);
+ debugPrintf("Usage: %s <file path> <output file name>\n", argv[0]);
return true;
}
@@ -60,7 +60,7 @@ bool Console::Cmd_DumpFile(int argc, const char **argv) {
BaseFileManager *fileManager = BaseEngine::instance().getFileManager();
Common::SeekableReadStream *inFile = fileManager->openFile(filePath);
if (!inFile) {
- DebugPrintf("File '%s' not found\n", argv[1]);
+ debugPrintf("File '%s' not found\n", argv[1]);
return true;
}
@@ -77,7 +77,7 @@ bool Console::Cmd_DumpFile(int argc, const char **argv) {
delete outFile;
delete inFile;
- DebugPrintf("Resource file '%s' dumped to file '%s'\n", argv[1], argv[2]);
+ debugPrintf("Resource file '%s' dumped to file '%s'\n", argv[1], argv[2]);
return true;
}
diff --git a/engines/wintermute/debugger.h b/engines/wintermute/debugger.h
index 6fbbb084f0..625da0ce41 100644
--- a/engines/wintermute/debugger.h
+++ b/engines/wintermute/debugger.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/wintermute/detection.cpp b/engines/wintermute/detection.cpp
index ac21d78ef5..a659c434d0 100644
--- a/engines/wintermute/detection.cpp
+++ b/engines/wintermute/detection.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -68,6 +68,7 @@ static char s_fallbackGameIdBuf[256];
static const char *directoryGlobs[] = {
"language", // To detect the various languages
+ "languages", // To detect the various languages
0
};
@@ -106,11 +107,11 @@ public:
}
}
// Prefix to avoid collisions with actually known games
- name = "wmefan-" + name;
+ name = "wmeunk-" + name;
Common::strlcpy(s_fallbackGameIdBuf, name.c_str(), sizeof(s_fallbackGameIdBuf) - 1);
s_fallbackDesc.gameid = s_fallbackGameIdBuf;
if (caption != name) {
- caption += " (fangame) ";
+ caption += " (unknown version) ";
char *offset = s_fallbackGameIdBuf + name.size() + 1;
uint32 remainingLength = (sizeof(s_fallbackGameIdBuf) - 1) - (name.size() + 1);
Common::strlcpy(offset, caption.c_str(), remainingLength);
@@ -184,7 +185,7 @@ public:
} // End of namespace Wintermute
#if PLUGIN_ENABLED_DYNAMIC(WINTERMUTE)
-REGISTER_PLUGIN_DYNAMIC(WINTERMUTE, PLUGIN_TYPE_ENGINE, Wintermute::WintermuteMetaEngine);
+ REGISTER_PLUGIN_DYNAMIC(WINTERMUTE, PLUGIN_TYPE_ENGINE, Wintermute::WintermuteMetaEngine);
#else
-REGISTER_PLUGIN_STATIC(WINTERMUTE, PLUGIN_TYPE_ENGINE, Wintermute::WintermuteMetaEngine);
+ REGISTER_PLUGIN_STATIC(WINTERMUTE, PLUGIN_TYPE_ENGINE, Wintermute::WintermuteMetaEngine);
#endif
diff --git a/engines/wintermute/detection_tables.h b/engines/wintermute/detection_tables.h
index 63f5078c12..6087e60ece 100644
--- a/engines/wintermute/detection_tables.h
+++ b/engines/wintermute/detection_tables.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -27,8 +27,11 @@ namespace Wintermute {
static const PlainGameDescriptor wintermuteGames[] = {
{"5ld", "Five Lethal Demons"},
{"5ma", "Five Magical Amulets"},
- {"bthreshold", "Beyond the Threshold"},
{"actualdest", "Actual Destination"},
+ {"agustin", "Boredom of Agustin Cordes"},
+ {"bickadoodle", "Bickadoodle"},
+ {"bookofgron", "Book of Gron Part One"},
+ {"bthreshold", "Beyond the Threshold"},
{"carolreed4", "Carol Reed 4 - East Side Story"},
{"carolreed5", "Carol Reed 5 - The Colour of Murder"},
{"carolreed6", "Carol Reed 6 - Black Circle"},
@@ -36,29 +39,45 @@ static const PlainGameDescriptor wintermuteGames[] = {
{"carolreed8", "Carol Reed 8 - Amber's Blood"},
{"carolreed9", "Carol Reed 9 - Cold Case Summer"},
{"chivalry", "Chivalry is Not Dead"},
+ {"corrosion", "Corrosion: Cold Winter Waiting"},
{"deadcity", "Dead City"},
{"dreaming", "Des Reves Elastiques Avec Mille Insectes Nommes Georges"},
{"dirtysplit", "Dirty Split"},
{"dreamscape", "Dreamscape"},
{"escapemansion", "Escape from the Mansion"},
+ {"framed", "Framed"},
{"ghostsheet", "Ghost in the Sheet"},
{"hamlet", "Hamlet or the last game without MMORPS features, shaders and product placement"},
+ {"helga", "Helga Deep In Trouble"},
{"jamesperis", "James Peris: No License Nor Control"},
+ {"kulivocko", "Kulivocko"},
+ {"lonelyrobot", "Project Lonely Robot"},
{"looky", "Looky"},
{"julia", "J.U.L.I.A."},
{"mirage", "Mirage"},
+ {"oknytt", "Oknytt"},
+ {"paintaria", "Paintaria"},
{"pigeons", "Pigeons in the Park"},
+ {"projectdoom", "Project: Doom"},
{"reversion1", "Reversion: The Escape"},
{"reversion2", "Reversion: The Meeting"},
+ {"rhiannon", "Rhiannon: Curse of the four Branches"},
+ {"ritter", "1 1/2 Ritter: Auf der Suche nach der hinreissenden Herzelinde"},
{"rosemary", "Rosemary"},
+ {"securanote", "Securanote"},
{"shaban", "Shaban"},
{"shinestar", "The Shine of a Star"},
+ {"spaceinvaders", "Space Invaders"},
{"spacemadness", "Space Madness"},
{"thebox", "The Box"},
+ {"thekite", "The Kite"},
{"tib", "Fairy Tales About Toshechka and Boshechka"},
{"tradestory", "The Trader of Stories"},
{"twc", "the white chamber"},
+ {"vsevolod", "Vsevolod"},
{"wintermute", "Wintermute engine game"},
+ {"wtetris", "Wilma Tetris"},
+ {"zilm", "Zilm: A Game of Reflex"},
{0, 0}
};
@@ -93,6 +112,16 @@ static const ADGameDescription gameDescriptions[] = {
ADGF_UNSTABLE,
GUIO0()
},
+ // Boredom of Agustin Cordes
+ {
+ "agustin",
+ "",
+ AD_ENTRY1s("data.dcp", "abb79c16c9b92e9b06525a4c7c3f5861", 2461949),
+ Common::EN_ANY,
+ Common::kPlatformWindows,
+ ADGF_UNSTABLE,
+ GUIO0()
+ },
// Beyond the Threshold
{
"bthreshold",
@@ -103,6 +132,46 @@ static const ADGameDescription gameDescriptions[] = {
ADGF_UNSTABLE,
GUIO0()
},
+ // Bickadoodle
+ {
+ "bickadoodle",
+ "",
+ AD_ENTRY1s("data.dcp", "84db4d1594cac95e25614985775d10a8", 35303844),
+ Common::EN_ANY,
+ Common::kPlatformWindows,
+ ADGF_UNSTABLE,
+ GUIO0()
+ },
+ // Bickadoodle (Ver 1.1)
+ {
+ "bickadoodle",
+ "Version 1.1",
+ AD_ENTRY1s("data.dcp", "8bb52ac9a9ee129c5059e8e808b669d7", 35337760),
+ Common::EN_ANY,
+ Common::kPlatformWindows,
+ ADGF_UNSTABLE,
+ GUIO0()
+ },
+ // Bickadoodle (download from http://aethericgames.com/games/bickadoodle/download-bickadoodle/)
+ {
+ "bickadoodle",
+ "",
+ AD_ENTRY1s("data.dcp", "1584d83577c32add0fce27fae91141a2", 35337728),
+ Common::EN_ANY,
+ Common::kPlatformWindows,
+ ADGF_UNSTABLE,
+ GUIO0()
+ },
+ // Book of Gron Part One
+ {
+ "bookofgron",
+ "",
+ AD_ENTRY1s("data.dcp", "e61b2ebee044a82fa0f8ca0fce2c8946", 83129531),
+ Common::RU_RUS,
+ Common::kPlatformWindows,
+ ADGF_UNSTABLE,
+ GUIO0()
+ },
// Carol Reed 4 - East Side Story (Demo)
{
"carolreed4",
@@ -206,6 +275,32 @@ static const ADGameDescription gameDescriptions[] = {
ADGF_TESTING,
GUIO0()
},
+ // Corrosion: Cold Winter Waiting
+ {
+ "corrosion",
+ "",
+ AD_ENTRY1s("data.dcp", "ae885b1a8faa0b27f43c0e8f0df02fc9", 525931618),
+ Common::EN_ANY,
+ Common::kPlatformWindows,
+ ADGF_TESTING,
+ GUIO0()
+ },
+ // Dead City (Czech)
+ {
+ "deadcity",
+ "",
+ {
+ // The Czech data are in data.dcp, so in this case we'll have to
+ // just detect the english version twice, to give the user a choice.
+ {"english.dcp", 0, "c591046d6de7e381d76f70e0787b2b1f", 415935},
+ {"data.dcp", 0, "7ebfd50d1a22370ed7b079bcaa631d62", 9070205},
+ AD_LISTEND
+ },
+ Common::CZ_CZE,
+ Common::kPlatformWindows,
+ ADGF_UNSTABLE,
+ GUIO0()
+ },
// Dead City (English)
{
"deadcity",
@@ -248,6 +343,19 @@ static const ADGameDescription gameDescriptions[] = {
ADGF_UNSTABLE,
GUIO0()
},
+ // Dirty Split (Czech)
+ {
+ "dirtysplit",
+ "",
+ {
+ {"czech.dcp", 0, "08a71446467cf8f9444cfea446b46ad6", 127697934},
+ {"data.dcp", 0, "8b4b81b718bf65f30a67fc0b1e329eb5", 88577623},
+ },
+ Common::CZ_CZE,
+ Common::kPlatformWindows,
+ ADGF_UNSTABLE,
+ GUIO0()
+ },
// Dirty Split (English)
{
"dirtysplit",
@@ -258,6 +366,20 @@ static const ADGameDescription gameDescriptions[] = {
ADGF_UNSTABLE,
GUIO0()
},
+ // Dirty Split (French)
+ {
+ "dirtysplit",
+ "",
+ {
+ {"french.dcp", 0, "a0508dedebd0fe478d0158fa4c2a1136", 125534323},
+ {"data.dcp", 0, "e6d70c7f5d181b761cfcf974adf9186a", 88577623},
+ AD_LISTEND
+ },
+ Common::FR_FRA,
+ Common::kPlatformWindows,
+ ADGF_UNSTABLE,
+ GUIO0()
+ },
// Dirty Split (German)
{
"dirtysplit",
@@ -268,6 +390,32 @@ static const ADGameDescription gameDescriptions[] = {
ADGF_UNSTABLE,
GUIO0()
},
+ // Dirty Split (Italian)
+ {
+ "dirtysplit",
+ "",
+ {
+ {"italian.dcp", 0, "8108807fbd8af70be1ec452d0fd1131b", 125513726},
+ {"data.dcp", 0, "35a150e22af274185883fdbb142c6fb1", 88577623},
+ },
+ Common::IT_ITA,
+ Common::kPlatformWindows,
+ ADGF_UNSTABLE,
+ GUIO0()
+ },
+ // Dirty Split (Spanish)
+ {
+ "dirtysplit",
+ "",
+ {
+ {"spanish.dcp", 0, "b3982c0a5e85b42e1e38240fef004aa4", 164428596},
+ {"data.dcp", 0, "63766d6c68b9f00b632ea1736fc8a95c", 88577621},
+ },
+ Common::ES_ESP,
+ Common::kPlatformWindows,
+ ADGF_UNSTABLE,
+ GUIO0()
+ },
// Des Reves Elastiques Avec Mille Insectes Nommes Georges
{
"dreaming",
@@ -308,7 +456,41 @@ static const ADGameDescription gameDescriptions[] = {
ADGF_UNSTABLE,
GUIO0()
},
- // Ghosts in the Sheet
+ // Escape from the Mansion
+ {
+ "escapemansion",
+ "1.3",
+ AD_ENTRY1s("data.dcp", "1e5d231b56c8a228cd15cb690f50253e", 29261972),
+ Common::EN_ANY,
+ Common::kPlatformWindows,
+ ADGF_UNSTABLE,
+ GUIO0()
+ },
+ // Framed
+ {
+ "framed",
+ "",
+ AD_ENTRY1s("data.dcp", "e7259fb36f2c6f9f28242291e0c3de98", 34690568),
+ Common::EN_ANY,
+ Common::kPlatformWindows,
+ ADGF_UNSTABLE,
+ GUIO0()
+ },
+ // Ghost in the Sheet
+ {
+ "ghostsheet",
+ "",
+ {
+ {"english.dcp", 0, "e6d0aad2c89996bcabe416105a3d6d3a", 12221017},
+ {"data.dcp", 0, "b2f8b05328e4881e15e98e845b63f451", 168003},
+ AD_LISTEND
+ },
+ Common::EN_ANY,
+ Common::kPlatformWindows,
+ ADGF_UNSTABLE,
+ GUIO0()
+ },
+ // Ghost in the Sheet (Demo)
{
"ghostsheet",
"Demo",
@@ -329,6 +511,35 @@ static const ADGameDescription gameDescriptions[] = {
ADGF_UNSTABLE,
GUIO0()
},
+ // Helga Deep In Trouble (English)
+ {
+ "helga",
+ "",
+ {
+ {"english.dcp", 0, "bfa136b21bdbc7d8691c0770a6d40bc3", 135931},
+ {"data.dcp", 0, "25cb955a60b58326f2eeda1ce288fb37", 183251259},
+ AD_LISTEND
+ },
+ Common::EN_ANY,
+ Common::kPlatformWindows,
+ ADGF_UNSTABLE,
+ GUIO0()
+ },
+ // Helga Deep In Trouble (Demo) (English)
+ {
+ "helga",
+ "Demo",
+ {
+ {"english.dcp", 0, "b3a93e678f0ef97200f691cd1724643f", 135864},
+ {"data.dcp", 0, "45134ed93bc391edf148b79cdcbf2a09", 154266028},
+ AD_LISTEND
+ },
+ Common::EN_ANY,
+ Common::kPlatformWindows,
+ ADGF_UNSTABLE |
+ ADGF_DEMO,
+ GUIO0()
+ },
// James Peris: No License Nor Control (English)
{
"jamesperis",
@@ -381,6 +592,16 @@ static const ADGameDescription gameDescriptions[] = {
ADGF_UNSTABLE,
GUIO0()
},
+ // J.U.L.I.A. (English, Bundle in a box-version)
+ {
+ "julia",
+ "Version 1.2",
+ AD_ENTRY1s("data.dcp", "fe90023ccc22f35185b40b910e0d03a2", 10101373),
+ Common::EN_ANY,
+ Common::kPlatformWindows,
+ ADGF_UNSTABLE,
+ GUIO0()
+ },
// J.U.L.I.A. (English) (Demo)
{
"julia",
@@ -403,6 +624,27 @@ static const ADGameDescription gameDescriptions[] = {
ADGF_DEMO,
GUIO0()
},
+ // Kulivocko (Czech)
+ {
+ "kulivocko",
+ "",
+ AD_ENTRY1s("data.dcp", "44306dc470e9b27474043932eccee02f", 155106392),
+ Common::CZ_CZE,
+ Common::kPlatformWindows,
+ ADGF_UNSTABLE,
+ GUIO0()
+ },
+ // Kulivocko (Czech) (Demo)
+ {
+ "kulivocko",
+ "Demo",
+ AD_ENTRY1s("data.dcp", "63b164bdfadecbb0deb5da691afb8154", 48362234),
+ Common::CZ_CZE,
+ Common::kPlatformWindows,
+ ADGF_UNSTABLE |
+ ADGF_DEMO,
+ GUIO0()
+ },
// Looky Demo (English)
{
"looky",
@@ -414,7 +656,8 @@ static const ADGameDescription gameDescriptions[] = {
},
Common::EN_ANY,
Common::kPlatformWindows,
- ADGF_UNSTABLE,
+ ADGF_UNSTABLE |
+ ADGF_DEMO,
GUIO0()
},
// Looky Demo (German)
@@ -428,7 +671,8 @@ static const ADGameDescription gameDescriptions[] = {
},
Common::DE_DEU,
Common::kPlatformWindows,
- ADGF_UNSTABLE,
+ ADGF_UNSTABLE |
+ ADGF_DEMO,
GUIO0()
},
// Looky (German)
@@ -455,6 +699,26 @@ static const ADGameDescription gameDescriptions[] = {
ADGF_UNSTABLE,
GUIO0()
},
+ // Oknytt
+ {
+ "oknytt",
+ "Version 1.0",
+ AD_ENTRY1s("data.dcp", "6456cf8f429905c83f07509f9da536dd", 109502959),
+ Common::EN_ANY,
+ Common::kPlatformWindows,
+ ADGF_UNSTABLE,
+ GUIO0()
+ },
+ // Paintaria
+ {
+ "paintaria",
+ "",
+ AD_ENTRY1s("data.dcp", "354c08440c98150ff0d4008dd2865880", 48326040),
+ Common::EN_ANY,
+ Common::kPlatformWindows,
+ ADGF_UNSTABLE,
+ GUIO0()
+ },
// Pigeons in the Park
{
"pigeons",
@@ -465,6 +729,27 @@ static const ADGameDescription gameDescriptions[] = {
ADGF_UNSTABLE,
GUIO0()
},
+ // Project: Doom
+ {
+ "projectdoom",
+ "",
+ AD_ENTRY1s("data.dcp", "d5894b65a40706845434b99870bcab92", 99223761),
+ Common::EN_ANY,
+ Common::kPlatformWindows,
+ ADGF_UNSTABLE,
+ GUIO0()
+ },
+ // Project Lonely Robot
+ {
+ "lonelyrobot",
+ "beta",
+ AD_ENTRY1s("data.dcp", "a0cf7ad5bab957416dcda454e9f28ef0", 3420120),
+ Common::EN_ANY,
+ Common::kPlatformWindows,
+ ADGF_UNSTABLE |
+ ADGF_DEMO,
+ GUIO0()
+ },
// Reversion: The Escape Version 1.0
{
"reversion1",
@@ -643,6 +928,118 @@ static const ADGameDescription gameDescriptions[] = {
ADGF_UNSTABLE,
GUIO0()
},
+ // Reversion: The Escape Version 1.3.2369 (Chinese)
+ {
+ "reversion1",
+ "Version 1.3.2369",
+ {
+ {"xlanguage_nz.dcp", 0, "7146dfa43ffdf0886e034fffe2c8a0c0", 13722261},
+ {"data.dcp", 0, "aecb5deeea7b0baa871fbd0cef35a648", 254219204},
+ AD_LISTEND
+ },
+ Common::ZH_CNA,
+ Common::kPlatformWindows,
+ ADGF_UNSTABLE,
+ GUIO0()
+ },
+ // Reversion: The Escape Version 1.3.2369 (English)
+ {
+ "reversion1",
+ "Version 1.3.2369",
+ {
+ {"xlanguage_en.dcp", 0, "64b6fa7eedc09c231f6ce046e77fee05", 11339619},
+ {"data.dcp", 0, "aecb5deeea7b0baa871fbd0cef35a648", 254219204},
+ AD_LISTEND
+ },
+ Common::EN_ANY,
+ Common::kPlatformWindows,
+ ADGF_UNSTABLE,
+ GUIO0()
+ },
+ // Reversion: The Escape Version 1.3.2369 (French)
+ {
+ "reversion1",
+ "Version 1.3.2369",
+ {
+ {"xlanguage_fr.dcp", 0, "d561d562224afea809153a1fd9fdb0c0", 11963210},
+ {"data.dcp", 0, "aecb5deeea7b0baa871fbd0cef35a648", 254219204},
+ AD_LISTEND
+ },
+ Common::FR_FRA,
+ Common::kPlatformWindows,
+ ADGF_UNSTABLE,
+ GUIO0()
+ },
+ // Reversion: The Escape Version 1.3.2369 (German)
+ {
+ "reversion1",
+ "Version 1.3.2369",
+ {
+ {"xlanguage_de.dcp", 0, "4e3f614c36bd6bae74b8cc83e663a8f0", 14040310},
+ {"data.dcp", 0, "aecb5deeea7b0baa871fbd0cef35a648", 254219204},
+ AD_LISTEND
+ },
+ Common::DE_DEU,
+ Common::kPlatformWindows,
+ ADGF_UNSTABLE,
+ GUIO0()
+ },
+ // Reversion: The Escape Version 1.3.2369 (Italian)
+ {
+ "reversion1",
+ "Version 1.3.2369",
+ {
+ {"xlanguage_it.dcp", 0, "10d09b7fe61946f09dd91d5e8d090f94", 11913752},
+ {"data.dcp", 0, "aecb5deeea7b0baa871fbd0cef35a648", 254219204},
+ AD_LISTEND
+ },
+ Common::IT_ITA,
+ Common::kPlatformWindows,
+ ADGF_UNSTABLE,
+ GUIO0()
+ },
+ // Reversion: The Escape Version 1.3.2369 (Latvian)
+ {
+ "reversion1",
+ "Version 1.3.2369",
+ {
+ {"xlanguage_lv.dcp", 0, "704359ab5040b0dab6545064d7aa6eb9", 11414925},
+ {"data.dcp", 0, "aecb5deeea7b0baa871fbd0cef35a648", 254219204},
+ AD_LISTEND
+ },
+ Common::LV_LAT,
+ Common::kPlatformWindows,
+ ADGF_UNSTABLE,
+ GUIO0()
+ },
+ // Reversion: The Escape Version 1.3.2369 (Polish)
+ {
+ "reversion1",
+ "Version 1.3.2369",
+ {
+ {"xlanguage_pl.dcp", 0, "c4ad33f57e1e998169552d521c1d6638", 11532215},
+ {"data.dcp", 0, "aecb5deeea7b0baa871fbd0cef35a648", 254219204},
+ AD_LISTEND
+ },
+ Common::PL_POL,
+ Common::kPlatformWindows,
+ ADGF_UNSTABLE,
+ GUIO0()
+ },
+ // Reversion: The Escape Version 1.3.2369 (Portuguese)
+ {
+ "reversion1",
+ "Version 1.3.2369",
+ {
+ {"xlanguage_pt.dcp", 0, "886886b6b14aadac844078de856799a6", 10620797},
+ {"data.dcp", 0, "aecb5deeea7b0baa871fbd0cef35a648", 254219204},
+ AD_LISTEND
+ },
+ Common::PT_BRA,
+ Common::kPlatformWindows,
+ ADGF_UNSTABLE,
+ GUIO0()
+ },
// Reversion: The Meeting (Chinese)
{
"reversion2",
@@ -681,6 +1078,66 @@ static const ADGameDescription gameDescriptions[] = {
ADGF_UNSTABLE,
GUIO0()
},
+ // Reversion: The Meeting Version 2.0.2412 (Chinese)
+ {
+ "reversion2",
+ "Version 2.0.2412",
+ {
+ {"data.dcp", 0, "f4ffc4df24b7bebad56a24930f33a2bc", 255766600},
+ {"xlanguage_nz.dcp", 0, "17c79af4928e24484bee77a7e807cc2a", 10737127},
+ {"Linux.dcp", 0, "21858bd77dc86b03f701fd47900e2f51", 984535},
+ AD_LISTEND
+ },
+ Common::ZH_CNA,
+ Common::kPlatformLinux,
+ ADGF_UNSTABLE,
+ GUIO0()
+ },
+ // Reversion: The Meeting Version 2.0.2412 (English)
+ {
+ "reversion2",
+ "Version 2.0.2412",
+ {
+ {"data.dcp", 0, "f4ffc4df24b7bebad56a24930f33a2bc", 255766600},
+ {"xlanguage_en.dcp", 0, "0598bf752ce93b42bcaf1094df537c7b", 8533057},
+ {"Linux.dcp", 0, "21858bd77dc86b03f701fd47900e2f51", 984535},
+ AD_LISTEND
+ },
+ Common::EN_ANY,
+ Common::kPlatformLinux,
+ ADGF_UNSTABLE,
+ GUIO0()
+ },
+ // Rhiannon: Curse of the four Branches
+ {
+ "rhiannon",
+ "",
+ AD_ENTRY1s("data.dcp", "870f348900b735f1cc79c0608ce32b0e", 1046169851),
+ Common::EN_ANY,
+ Common::kPlatformWindows,
+ ADGF_UNSTABLE,
+ GUIO0()
+ },
+ // Rhiannon: Curse of the four Branches (English PC DVD)
+ {
+ "rhiannon",
+ "DVD",
+ AD_ENTRY1s("data.dcp", "6736bbc921bb6ce5161b3ad095a97bd4", 1053441028),
+ Common::EN_ANY,
+ Common::kPlatformWindows,
+ ADGF_UNSTABLE,
+ GUIO0()
+ },
+ // 1 1/2 Ritter: Auf der Suche nach der hinreissenden Herzelinde
+ {
+ "ritter",
+ "",
+ AD_ENTRY1s("data.dcp", "5ac416cee605d3a30f4d59687b1cdab2", 364260278),
+ Common::DE_DEU,
+ Common::kPlatformWindows,
+ ADGF_UNSTABLE,
+ GUIO0()
+ },
// Rosemary
{
"rosemary",
@@ -691,6 +1148,16 @@ static const ADGameDescription gameDescriptions[] = {
ADGF_UNSTABLE,
GUIO0()
},
+ // Securanote
+ {
+ "securanote",
+ "",
+ AD_ENTRY1s("data.dcp", "5213d3e59b9e95b7fbd5c56f7de5341a", 2625554),
+ Common::EN_ANY,
+ Common::kPlatformIOS,
+ ADGF_UNSTABLE,
+ GUIO0()
+ },
// Shaban
{
"shaban",
@@ -711,6 +1178,17 @@ static const ADGameDescription gameDescriptions[] = {
ADGF_UNSTABLE,
GUIO0()
},
+ // Space Invaders (Demo)
+ {
+ "spaceinvaders",
+ "Demo",
+ AD_ENTRY1s("data.dcp", "3f27adefdf72f2c1601cf555c80a509f", 1308361),
+ Common::EN_ANY,
+ Common::kPlatformWindows,
+ ADGF_UNSTABLE |
+ ADGF_DEMO,
+ GUIO0()
+ },
// Space Madness
{
"spacemadness",
@@ -731,6 +1209,56 @@ static const ADGameDescription gameDescriptions[] = {
ADGF_UNSTABLE,
GUIO0()
},
+ // The Kite (Version 1.1)
+ {
+ "thekite",
+ "Version 1.1",
+ AD_ENTRY1s("data.dcp", "92d29428f464469bda2d81b03d4d5c3e", 47332296),
+ Common::EN_ANY,
+ Common::kPlatformWindows,
+ ADGF_UNSTABLE,
+ GUIO0()
+ },
+ // The Kite (Version 1.2.e)
+ {
+ "thekite",
+ "Version 1.2.e",
+ AD_ENTRY1s("data.dcp", "92451578b1bdd2b32a1db592a4f6d5fc", 47360539),
+ Common::EN_ANY,
+ Common::kPlatformWindows,
+ ADGF_UNSTABLE,
+ GUIO0()
+ },
+ // The Kite (Version 1.2.i) (Italian)
+ {
+ "thekite",
+ "Version 1.2.i",
+ AD_ENTRY1s("data.dcp", "d3435b106a1b3b4c1df8ad596d271586", 47509274),
+ Common::IT_ITA,
+ Common::kPlatformWindows,
+ ADGF_UNSTABLE,
+ GUIO0()
+ },
+ // The Kite (Version 1.2.r) (Russian)
+ {
+ "thekite",
+ "Version 1.2.r",
+ AD_ENTRY1s("data.dcp", "d531e097dd884737469da014ed882cde", 47554582 ),
+ Common::RU_RUS,
+ Common::kPlatformWindows,
+ ADGF_UNSTABLE,
+ GUIO0()
+ },
+ // The Kite (Version 1.3.e)
+ {
+ "thekite",
+ "Version 1.3.e",
+ AD_ENTRY1s("data.dcp", "9761827b51370263b7623721545d7627", 47382987),
+ Common::EN_ANY,
+ Common::kPlatformWindows,
+ ADGF_UNSTABLE,
+ GUIO0()
+ },
// Fairy Tales About Toshechka and Boshechka
{
"tib",
@@ -762,6 +1290,37 @@ static const ADGameDescription gameDescriptions[] = {
ADGF_UNSTABLE,
GUIO0()
},
+ // Vsevolod Prologue (Demo)
+ {
+ "vsevolod",
+ "Prologue",
+ AD_ENTRY1s("data.dcp", "f2dcffd2692dbfcc9371fa1a87970fe7", 388669493),
+ Common::EN_ANY,
+ Common::kPlatformWindows,
+ ADGF_UNSTABLE |
+ ADGF_DEMO,
+ GUIO0()
+ },
+ // Wilma Tetris
+ {
+ "wtetris",
+ "",
+ AD_ENTRY1s("data.dcp", "946e3a0496e6c12fb344c9ed861ff015", 2780093),
+ Common::EN_ANY,
+ Common::kPlatformWindows,
+ ADGF_UNSTABLE,
+ GUIO0()
+ },
+ // Zilm: A Game of Reflex 1.0
+ {
+ "Zilm",
+ "1.0",
+ AD_ENTRY1s("data.dcp", "098dffaf03d8adbb4cb5633e4733e63c", 351726),
+ Common::EN_ANY,
+ Common::kPlatformWindows,
+ ADGF_UNSTABLE,
+ GUIO0()
+ },
AD_TABLE_END_MARKER
};
diff --git a/engines/wintermute/graphics/transform_struct.cpp b/engines/wintermute/graphics/transform_struct.cpp
index 822c06f42f..9483975d94 100644
--- a/engines/wintermute/graphics/transform_struct.cpp
+++ b/engines/wintermute/graphics/transform_struct.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -40,47 +40,47 @@ void TransformStruct::init(Point32 zoom, uint32 angle, Point32 hotspot, bool alp
}
TransformStruct::TransformStruct(int32 zoomX, int32 zoomY, uint32 angle, int32 hotspotX, int32 hotspotY, TSpriteBlendMode blendMode, uint32 rgbaMod, bool mirrorX, bool mirrorY, int32 offsetX, int32 offsetY) {
- init(Point32(zoomX, zoomY),
- angle,
- Point32(hotspotX, hotspotY),
- false,
- blendMode,
- rgbaMod,
- mirrorX, mirrorY,
+ init(Point32(zoomX, zoomY),
+ angle,
+ Point32(hotspotX, hotspotY),
+ false,
+ blendMode,
+ rgbaMod,
+ mirrorX, mirrorY,
Point32(offsetX, offsetY));
}
TransformStruct::TransformStruct(float zoomX, float zoomY, uint32 angle, int32 hotspotX, int32 hotspotY, TSpriteBlendMode blendMode, uint32 rgbaMod, bool mirrorX, bool mirrorY, int32 offsetX, int32 offsetY) {
- init(Point32((int32)(zoomX / 100.0 * kDefaultZoomX),
- (int32)(zoomY / 100.0 * kDefaultZoomY)),
- angle,
- Point32(hotspotX, hotspotY),
- false,
- blendMode,
- rgbaMod,
- mirrorX, mirrorY,
+ init(Point32((int32)(zoomX / 100.0 * kDefaultZoomX),
+ (int32)(zoomY / 100.0 * kDefaultZoomY)),
+ angle,
+ Point32(hotspotX, hotspotY),
+ false,
+ blendMode,
+ rgbaMod,
+ mirrorX, mirrorY,
Point32(offsetX, offsetY));
}
TransformStruct::TransformStruct(int32 zoomX, int32 zoomY, TSpriteBlendMode blendMode, uint32 rgbaMod, bool mirrorX, bool mirrorY) {
- init(Point32(zoomX, zoomY),
- kDefaultAngle,
- Point32(kDefaultHotspotX, kDefaultHotspotY),
- false,
- blendMode,
- rgbaMod,
- mirrorX,
- mirrorY,
+ init(Point32(zoomX, zoomY),
+ kDefaultAngle,
+ Point32(kDefaultHotspotX, kDefaultHotspotY),
+ false,
+ blendMode,
+ rgbaMod,
+ mirrorX,
+ mirrorY,
Point32(kDefaultOffsetX, kDefaultOffsetY));
}
TransformStruct::TransformStruct(int32 zoomX, int32 zoomY, uint32 angle, int32 hotspotX, int32 hotspotY) {
- init(Point32(zoomX, zoomY),
- angle,
- Point32(hotspotX, hotspotY),
- true,
- BLEND_NORMAL,
- kDefaultRgbaMod,
+ init(Point32(zoomX, zoomY),
+ angle,
+ Point32(hotspotX, hotspotY),
+ true,
+ BLEND_NORMAL,
+ kDefaultRgbaMod,
false, false,
Point32(kDefaultOffsetX, kDefaultOffsetY));
}
@@ -99,13 +99,13 @@ TransformStruct::TransformStruct(int32 numTimesX, int32 numTimesY) {
}
TransformStruct::TransformStruct() {
- init(Point32(kDefaultZoomX, kDefaultZoomY),
- kDefaultAngle,
- Point32(kDefaultHotspotX, kDefaultHotspotY),
- true,
- BLEND_NORMAL,
- kDefaultRgbaMod,
- false, false,
+ init(Point32(kDefaultZoomX, kDefaultZoomY),
+ kDefaultAngle,
+ Point32(kDefaultHotspotX, kDefaultHotspotY),
+ true,
+ BLEND_NORMAL,
+ kDefaultRgbaMod,
+ false, false,
Point32(kDefaultOffsetX, kDefaultOffsetY));
}
diff --git a/engines/wintermute/graphics/transform_struct.h b/engines/wintermute/graphics/transform_struct.h
index d5a03ea331..f80b0967cb 100644
--- a/engines/wintermute/graphics/transform_struct.h
+++ b/engines/wintermute/graphics/transform_struct.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/wintermute/graphics/transform_tools.cpp b/engines/wintermute/graphics/transform_tools.cpp
index dc92cdbbfd..7a009c26fa 100644
--- a/engines/wintermute/graphics/transform_tools.cpp
+++ b/engines/wintermute/graphics/transform_tools.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/wintermute/graphics/transform_tools.h b/engines/wintermute/graphics/transform_tools.h
index 9a73e3b69f..e259db04e5 100644
--- a/engines/wintermute/graphics/transform_tools.h
+++ b/engines/wintermute/graphics/transform_tools.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/wintermute/graphics/transparent_surface.cpp b/engines/wintermute/graphics/transparent_surface.cpp
index 43deb62db6..5fe0d13766 100644
--- a/engines/wintermute/graphics/transparent_surface.cpp
+++ b/engines/wintermute/graphics/transparent_surface.cpp
@@ -76,7 +76,6 @@ public:
* @param *outa, *outr, *outg, *outb pointer to the output pixel.
* @param *outa, *outr, *outg, *outb pointer to the colormod components.
*/
-
void BlenderAdditive::blendPixel(byte ina, byte inr, byte ing, byte inb, byte *outa, byte *outr, byte *outg, byte *outb, byte *ca, byte *cr, byte *cg, byte *cb) {
if (*ca != 255) {
ina = (ina) * (*ca) >> 8;
@@ -85,20 +84,23 @@ void BlenderAdditive::blendPixel(byte ina, byte inr, byte ing, byte inb, byte *o
if (ina == 0) {
return;
} else {
- if (*cb != 255)
+ if (*cb != 255) {
*outb = MIN(*outb + ((inb * (*cb) * ina) >> 16), 255);
- else
+ } else {
*outb = MIN(*outb + (inb * ina >> 8), 255);
+ }
- if (*cg != 255)
+ if (*cg != 255) {
*outg = MIN(*outg + ((ing * (*cg) * ina) >> 16), 255);
- else
+ } else {
*outg = MIN(*outg + (ing * ina >> 8), 255);
+ }
- if (*cr != 255)
+ if (*cr != 255) {
*outr = MIN(*outr + ((inr * (*cr) * ina) >> 16), 255);
- else
+ } else {
*outr = MIN(*outr + (inr * ina >> 8), 255);
+ }
}
}
@@ -108,7 +110,6 @@ void BlenderAdditive::blendPixel(byte ina, byte inr, byte ing, byte inb, byte *o
* @param *outa, *outr, *outg, *outb pointer to the output pixel.
* @param *outa, *outr, *outg, *outb pointer to the colormod components.
*/
-
void BlenderSubtractive::blendPixel(byte ina, byte inr, byte ing, byte inb, byte *outa, byte *outr, byte *outg, byte *outb, byte *ca, byte *cr, byte *cg, byte *cb) {
//if (*ca != 255) {
// ina = ina * (*ca) >> 8;
@@ -122,20 +123,23 @@ void BlenderSubtractive::blendPixel(byte ina, byte inr, byte ing, byte inb, byte
if (ina == 0) {
return;
} else {
- if (*cb != 255)
+ if (*cb != 255) {
*outb = MAX(*outb - ((inb * (*cb) * (*outb) * ina) >> 24), 0);
- else
+ } else {
*outb = MAX(*outb - (inb * (*outb) * ina >> 16), 0);
+ }
- if (*cg != 255)
+ if (*cg != 255) {
*outg = MAX(*outg - ((ing * (*cg) * (*outg) * ina) >> 24), 0);
- else
+ } else {
*outg = MAX(*outg - (ing * (*outg) * ina >> 16), 0);
+ }
- if (*cr != 255)
- *outr = MAX(*outr - ((inr * (*cr) * (*outr) * ina) >> 24), 0);
- else
+ if (*cr != 255) {
+ *outr = MAX(*outr - ((inr * (*cr) * (*outr) * ina) >> 24), 0);
+ } else {
*outr = MAX(*outr - (inr * (*outr) * ina >> 16), 0);
+ }
}
}
@@ -154,20 +158,23 @@ void BlenderNormal::blendPixel(byte ina, byte inr, byte ing, byte inb, byte *out
if (ina == 0) {
return;
} else if (ina == 255) {
- if (*cb != 255)
+ if (*cb != 255) {
*outb = (inb * (*cb)) >> 8;
- else
+ } else {
*outb = inb;
+ }
- if (*cr != 255)
+ if (*cr != 255) {
*outr = (inr * (*cr)) >> 8;
- else
+ } else {
*outr = inr;
+ }
- if (*cg != 255)
+ if (*cg != 255) {
*outg = (ing * (*cg)) >> 8;
- else
+ } else {
*outg = ing;
+ }
*outa = ina;
@@ -180,26 +187,29 @@ void BlenderNormal::blendPixel(byte ina, byte inr, byte ing, byte inb, byte *out
*outr = (*outr * (255 - ina) >> 8);
*outg = (*outg * (255 - ina) >> 8);
- if (*cb == 0)
+ if (*cb == 0) {
*outb = *outb;
- else if (*cb != 255)
+ } else if (*cb != 255) {
*outb = *outb + (inb * ina * (*cb) >> 16);
- else
+ } else {
*outb = *outb + (inb * ina >> 8);
+ }
- if (*cr == 0)
+ if (*cr == 0) {
*outr = *outr;
- else if (*cr != 255)
+ } else if (*cr != 255) {
*outr = *outr + (inr * ina * (*cr) >> 16);
- else
+ } else {
*outr = *outr + (inr * ina >> 8);
+ }
- if (*cg == 0)
+ if (*cg == 0) {
*outg = *outg;
- else if (*cg != 255)
+ } else if (*cg != 255) {
*outg = *outg + (ing * ina * (*cg) >> 16);
- else
+ } else {
*outg = *outg + (ing * ina >> 8);
+ }
return;
}
@@ -234,7 +244,6 @@ void BlenderNormal::blendPixel(byte ina, byte inr, byte ing, byte inb, byte *out
* @param ina, inr, ing, inb: the input pixel, split into its components.
* @param *outa, *outr, *outg, *outb pointer to the output pixel.
*/
-
void BlenderSubtractive::blendPixel(byte ina, byte inr, byte ing, byte inb, byte *outa, byte *outr, byte *outg, byte *outb) {
if (ina == 0) {
@@ -259,7 +268,6 @@ void BlenderSubtractive::blendPixel(byte ina, byte inr, byte ing, byte inb, byte
* @param ina, inr, ing, inb: the input pixel, split into its components.
* @param *outa, *outr, *outg, *outb pointer to the output pixel.
*/
-
void BlenderAdditive::blendPixel(byte ina, byte inr, byte ing, byte inb, byte *outa, byte *outr, byte *outg, byte *outb) {
if (ina == 0) {
@@ -297,10 +305,11 @@ TransparentSurface::TransparentSurface(const Surface &surf, bool copyData) : Sur
}
}
-void doBlitOpaqueFast(byte *ino, byte *outo, uint32 width, uint32 height, uint32 pitch, int32 inStep, int32 inoStep) {
/**
* Optimized version of doBlit to be used w/opaque blitting (no alpha).
*/
+void doBlitOpaqueFast(byte *ino, byte *outo, uint32 width, uint32 height, uint32 pitch, int32 inStep, int32 inoStep) {
+
byte *in;
byte *out;
@@ -320,7 +329,6 @@ void doBlitOpaqueFast(byte *ino, byte *outo, uint32 width, uint32 height, uint32
/**
* Optimized version of doBlit to be used w/binary blitting (blit or no-blit, no blending).
*/
-
void doBlitBinaryFast(byte *ino, byte *outo, uint32 width, uint32 height, uint32 pitch, int32 inStep, int32 inoStep) {
byte *in;
@@ -350,8 +358,8 @@ void doBlitBinaryFast(byte *ino, byte *outo, uint32 width, uint32 height, uint32
* What we have here is a template method that calls blendPixel() from a different
* class - the one we call it with - thus performing a different type of blending.
*
- * @param *ino a pointer to the input surface
- * @param *outo a pointer to the output surface
+ * @param ino a pointer to the input surface
+ * @param outo a pointer to the output surface
* @param width width of the input surface
* @param height height of the input surface
* @param pitch pitch of the output surface - that is, width in bytes of every row, usually bpp * width of the TARGET surface (the area we are blitting to might be smaller, do the math)
@@ -360,7 +368,7 @@ void doBlitBinaryFast(byte *ino, byte *outo, uint32 width, uint32 height, uint32
* @color colormod in 0xAARRGGBB format - 0xFFFFFFFF for no colormod
*/
-template<class Blender>
+template<class Blender>
void doBlit(byte *ino, byte *outo, uint32 width, uint32 height, uint32 pitch, int32 inStep, int32 inoStep, uint32 color) {
Blender b;
byte *in;
@@ -379,10 +387,10 @@ void doBlit(byte *ino, byte *outo, uint32 width, uint32 height, uint32 pitch, in
byte *outb = &out[TransparentSurface::kBIndex];
b.blendPixel(in[TransparentSurface::kAIndex],
- in[TransparentSurface::kRIndex],
- in[TransparentSurface::kGIndex],
- in[TransparentSurface::kBIndex],
- outa, outr, outg, outb);
+ in[TransparentSurface::kRIndex],
+ in[TransparentSurface::kGIndex],
+ in[TransparentSurface::kBIndex],
+ outa, outr, outg, outb);
in += inStep;
out += 4;
@@ -408,10 +416,10 @@ void doBlit(byte *ino, byte *outo, uint32 width, uint32 height, uint32 pitch, in
byte *outb = &out[TransparentSurface::kBIndex];
b.blendPixel(in[TransparentSurface::kAIndex],
- in[TransparentSurface::kRIndex],
- in[TransparentSurface::kGIndex],
- in[TransparentSurface::kBIndex],
- outa, outr, outg, outb, &ca, &cr, &cg, &cb);
+ in[TransparentSurface::kRIndex],
+ in[TransparentSurface::kGIndex],
+ in[TransparentSurface::kBIndex],
+ outa, outr, outg, outb, &ca, &cr, &cg, &cb);
in += inStep;
out += 4;
}
@@ -431,8 +439,9 @@ Common::Rect TransparentSurface::blit(Graphics::Surface &target, int posX, int p
// Check if we need to draw anything at all
int ca = (color >> 24) & 0xff;
- if (ca == 0)
+ if (ca == 0) {
return retSize;
+ }
// Create an encapsulating surface for the data
TransparentSurface srcImage(*this, false);
@@ -460,17 +469,19 @@ Common::Rect TransparentSurface::blit(Graphics::Surface &target, int posX, int p
srcImage.h = pPartRect->height();
debug(6, "Blit(%d, %d, %d, [%d, %d, %d, %d], %08x, %d, %d)", posX, posY, flipping,
- pPartRect->left, pPartRect->top, pPartRect->width(), pPartRect->height(), color, width, height);
+ pPartRect->left, pPartRect->top, pPartRect->width(), pPartRect->height(), color, width, height);
} else {
debug(6, "Blit(%d, %d, %d, [%d, %d, %d, %d], %08x, %d, %d)", posX, posY, flipping, 0, 0,
- srcImage.w, srcImage.h, color, width, height);
+ srcImage.w, srcImage.h, color, width, height);
}
- if (width == -1)
+ if (width == -1) {
width = srcImage.w;
- if (height == -1)
+ }
+ if (height == -1) {
height = srcImage.h;
+ }
#ifdef SCALING_TESTING
// Hardcode scaling to 66% to test scaling
@@ -520,12 +531,12 @@ Common::Rect TransparentSurface::blit(Graphics::Surface &target, int posX, int p
yp = img->h - 1;
}
- byte *ino= (byte *)img->getBasePtr(xp, yp);
+ byte *ino = (byte *)img->getBasePtr(xp, yp);
byte *outo = (byte *)target.getBasePtr(posX, posY);
- if (color == 0xFFFFFF && blendMode == BLEND_NORMAL && _alphaMode == ALPHA_OPAQUE) {
+ if (color == 0xFFFFFFFF && blendMode == BLEND_NORMAL && _alphaMode == ALPHA_OPAQUE) {
doBlitOpaqueFast(ino, outo, img->w, img->h, target.pitch, inStep, inoStep);
- } else if (color == 0xFFFFFF && blendMode == BLEND_NORMAL && _alphaMode == ALPHA_BINARY) {
+ } else if (color == 0xFFFFFFFF && blendMode == BLEND_NORMAL && _alphaMode == ALPHA_BINARY) {
doBlitBinaryFast(ino, outo, img->w, img->h, target.pitch, inStep, inoStep);
} else {
if (blendMode == BLEND_ADDITIVE) {
@@ -653,8 +664,9 @@ TransparentSurface *TransparentSurface::rotoscale(const TransformStruct &transfo
target->create((uint16)dstW, (uint16)dstH, this->format);
- if (transform._zoom.x == 0 || transform._zoom.y == 0)
+ if (transform._zoom.x == 0 || transform._zoom.y == 0) {
return target;
+ }
uint32 invAngle = 360 - (transform._angle % 360);
float invCos = cos(invAngle * M_PI / 180.0);
@@ -688,8 +700,12 @@ TransparentSurface *TransparentSurface::rotoscale(const TransformStruct &transfo
for (int x = 0; x < dstW; x++) {
int dx = (sdx >> 16);
int dy = (sdy >> 16);
- if (flipx) dx = sw - dx;
- if (flipy) dy = sh - dy;
+ if (flipx) {
+ dx = sw - dx;
+ }
+ if (flipy) {
+ dy = sh - dy;
+ }
#ifdef ENABLE_BILINEAR
if ((dx > -1) && (dy > -1) && (dx < sw) && (dy < sh)) {
@@ -698,7 +714,7 @@ TransparentSurface *TransparentSurface::rotoscale(const TransformStruct &transfo
c00 = *sp;
sp += 1;
c01 = *sp;
- sp += (this->pitch/4);
+ sp += (this->pitch / 4);
c11 = *sp;
sp -= 1;
c10 = *sp;
@@ -768,12 +784,12 @@ TransparentSurface *TransparentSurface::scale(uint16 newWidth, uint16 newHeight)
bool flipx = false, flipy = false; // TODO: See mirroring comment in RenderTicket ctor
- int *sax = new int[dstW+1];
- int *say = new int[dstH+1];
+ int *sax = new int[dstW + 1];
+ int *say = new int[dstH + 1];
assert(sax && say);
/*
- * Precalculate row increments
+ * Precalculate row increments
*/
int spixelw = (srcW - 1);
int spixelh = (srcH - 1);
@@ -793,8 +809,8 @@ TransparentSurface *TransparentSurface::scale(uint16 newWidth, uint16 newHeight)
csx += sx;
/* Guard from overflows */
- if (csx > ssx) {
- csx = ssx;
+ if (csx > ssx) {
+ csx = ssx;
}
}
@@ -812,14 +828,16 @@ TransparentSurface *TransparentSurface::scale(uint16 newWidth, uint16 newHeight)
}
}
- const tColorRGBA *sp = (const tColorRGBA *) getBasePtr(0,0);
- tColorRGBA *dp = (tColorRGBA *) target->getBasePtr(0,0);
+ const tColorRGBA *sp = (const tColorRGBA *) getBasePtr(0, 0);
+ tColorRGBA *dp = (tColorRGBA *) target->getBasePtr(0, 0);
int spixelgap = srcW;
- if (flipx)
+ if (flipx) {
sp += spixelw;
- if (flipy)
+ }
+ if (flipy) {
sp += spixelgap * spixelh;
+ }
csay = say;
for (int y = 0; y < dstH; y++) {
@@ -839,10 +857,11 @@ TransparentSurface *TransparentSurface::scale(uint16 newWidth, uint16 newHeight)
c01 = sp;
c10 = sp;
if (cy < spixelh) {
- if (flipy)
+ if (flipy) {
c10 -= spixelgap;
- else
+ } else {
c10 += spixelgap;
+ }
}
c11 = c10;
if (cx < spixelw) {
@@ -878,10 +897,11 @@ TransparentSurface *TransparentSurface::scale(uint16 newWidth, uint16 newHeight)
int *salastx = csax;
csax++;
int sstepx = (*csax >> 16) - (*salastx >> 16);
- if (flipx)
+ if (flipx) {
sp -= sstepx;
- else
+ } else {
sp += sstepx;
+ }
/*
* Advance destination pointer x
@@ -895,10 +915,11 @@ TransparentSurface *TransparentSurface::scale(uint16 newWidth, uint16 newHeight)
csay++;
int sstepy = (*csay >> 16) - (*salasty >> 16);
sstepy *= spixelgap;
- if (flipy)
+ if (flipy) {
sp = csp - sstepy;
- else
+ } else {
sp = csp + sstepy;
+ }
}
delete[] sax;
@@ -907,14 +928,16 @@ TransparentSurface *TransparentSurface::scale(uint16 newWidth, uint16 newHeight)
#else
int *scaleCacheX = new int[dstW];
- for (int x = 0; x < dstW; x++)
+ for (int x = 0; x < dstW; x++) {
scaleCacheX[x] = (x * srcW) / dstW;
+ }
for (int y = 0; y < dstH; y++) {
uint32 *destP = (uint32 *)target->getBasePtr(0, y);
const uint32 *srcP = (const uint32 *)getBasePtr(0, (y * srcH) / dstH);
- for (int x = 0; x < dstW; x++)
+ for (int x = 0; x < dstW; x++) {
*destP++ = srcP[scaleCacheX[x]];
+ }
}
delete[] scaleCacheX;
@@ -924,8 +947,4 @@ TransparentSurface *TransparentSurface::scale(uint16 newWidth, uint16 newHeight)
}
-
-
-
-
} // End of namespace Wintermute
diff --git a/engines/wintermute/graphics/transparent_surface.h b/engines/wintermute/graphics/transparent_surface.h
index b887c05fa8..4ad9bf07eb 100644
--- a/engines/wintermute/graphics/transparent_surface.h
+++ b/engines/wintermute/graphics/transparent_surface.h
@@ -17,6 +17,7 @@
* You should have received a copy of the GNU General Public 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_TRANSPARENTSURFACE_H
@@ -73,17 +74,17 @@ struct TransparentSurface : public Graphics::Surface {
ALPHA_FULL = 2
};
- #ifdef SCUMM_LITTLE_ENDIAN
+#ifdef SCUMM_LITTLE_ENDIAN
static const int kAIndex = 0;
static const int kBIndex = 1;
static const int kGIndex = 2;
static const int kRIndex = 3;
- #else
+#else
static const int kAIndex = 3;
static const int kBIndex = 2;
static const int kGIndex = 1;
static const int kRIndex = 0;
- #endif
+#endif
static const int kBShift = 8;//img->format.bShift;
static const int kGShift = 16;//img->format.gShift;
@@ -99,32 +100,31 @@ struct TransparentSurface : public Graphics::Surface {
/**
@brief renders the surface to another surface
- @param pDest a pointer to the target image. In most cases this is the framebuffer.
- @param PosX the position on the X-axis in the target image in pixels where the image is supposed to be rendered.<br>
+ @param target a pointer to the target surface. In most cases this is the framebuffer.
+ @param posX the position on the X-axis in the target image in pixels where the image is supposed to be rendered.<br>
The default value is 0.
- @param PosY the position on the Y-axis in the target image in pixels where the image is supposed to be rendered.<br>
+ @param posY the position on the Y-axis in the target image in pixels where the image is supposed to be rendered.<br>
The default value is 0.
- @param Flipping how the the image should be flipped.<br>
+ @param flipping how the the image should be flipped.<br>
The default value is BS_Image::FLIP_NONE (no flipping)
- @param pSrcPartRect Pointer on Common::Rect which specifies the section to be rendered. If the whole image has to be rendered the Pointer is NULL.<br>
+ @param pPartRect Pointer on Common::Rect which specifies the section to be rendered. If the whole image has to be rendered the Pointer is NULL.<br>
This referes to the unflipped and unscaled image.<br>
The default value is NULL.
- @param Color an ARGB color value, which determines the parameters for the color modulation und alpha blending.<br>
+ @param color an ARGB color value, which determines the parameters for the color modulation und alpha blending.<br>
The alpha component of the color determines the alpha blending parameter (0 = no covering, 255 = full covering).<br>
The color components determines the color for color modulation.<br>
The default value is BS_ARGB(255, 255, 255, 255) (full covering, no color modulation).
The macros BS_RGB and BS_ARGB can be used for the creation of the color value.
- @param Width the output width of the screen section.
+ @param width the output width of the screen section.
The images will be scaled if the output width of the screen section differs from the image section.<br>
The value -1 determines that the image should not be scaled.<br>
The default value is -1.
- @param Width the output height of the screen section.
+ @param height the output height of the screen section.
The images will be scaled if the output width of the screen section differs from the image section.<br>
The value -1 determines that the image should not be scaled.<br>
The default value is -1.
@return returns false if the rendering failed.
*/
-
Common::Rect blit(Graphics::Surface &target, int posX = 0, int posY = 0,
int flipping = FLIP_NONE,
Common::Rect *pPartRect = nullptr,
@@ -132,13 +132,14 @@ struct TransparentSurface : public Graphics::Surface {
int width = -1, int height = -1,
TSpriteBlendMode blend = BLEND_NORMAL);
void applyColorKey(uint8 r, uint8 g, uint8 b, bool overwriteAlpha = false);
-
+
/**
* @brief Scale function; this returns a transformed version of this surface after rotation and
* scaling. Please do not use this if angle != 0, use rotoscale.
*
- * @param transform a TransformStruct wrapping the required info. @see TransformStruct
- *
+ * @param newWidth the resulting width.
+ * @param newHeight the resulting height.
+ * @see TransformStruct
*/
TransparentSurface *scale(uint16 newWidth, uint16 newHeight) const;
@@ -147,7 +148,7 @@ struct TransparentSurface : public Graphics::Surface {
* scaling. Please do not use this if angle == 0, use plain old scaling function.
*
* @param transform a TransformStruct wrapping the required info. @see TransformStruct
- *
+ *
*/
TransparentSurface *rotoscale(const TransformStruct &transform) const;
AlphaType getAlphaMode() const;
diff --git a/engines/wintermute/math/floatpoint.h b/engines/wintermute/math/floatpoint.h
index 0c47ef09d7..77cd9980b9 100644
--- a/engines/wintermute/math/floatpoint.h
+++ b/engines/wintermute/math/floatpoint.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/wintermute/math/math_util.cpp b/engines/wintermute/math/math_util.cpp
index 903cea6d39..ed2b932693 100644
--- a/engines/wintermute/math/math_util.cpp
+++ b/engines/wintermute/math/math_util.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/wintermute/math/math_util.h b/engines/wintermute/math/math_util.h
index 41a7a43e2e..30b58baa39 100644
--- a/engines/wintermute/math/math_util.h
+++ b/engines/wintermute/math/math_util.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/wintermute/math/matrix4.cpp b/engines/wintermute/math/matrix4.cpp
index 011766f510..dff4301df3 100644
--- a/engines/wintermute/math/matrix4.cpp
+++ b/engines/wintermute/math/matrix4.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/wintermute/math/matrix4.h b/engines/wintermute/math/matrix4.h
index 4198b50484..245fb4a4a0 100644
--- a/engines/wintermute/math/matrix4.h
+++ b/engines/wintermute/math/matrix4.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/wintermute/math/rect32.h b/engines/wintermute/math/rect32.h
index f522ab3a35..93b5c68a30 100644
--- a/engines/wintermute/math/rect32.h
+++ b/engines/wintermute/math/rect32.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -94,12 +94,24 @@ struct Rect32 {
left = right = top = bottom = 0;
}
+ bool isRectEmpty() const {
+ return (left >= right) || (top >= bottom);
+ }
+
void offsetRect(int dx, int dy) {
left += dx;
top += dy;
right += dx;
bottom += dy;
}
+
+ void setRect(int32 newLeft, int32 newTop, int32 newRight, int32 newBottom) {
+ this->left = newLeft;
+ this->top = newTop;
+ this->right = newRight;
+ this->bottom = newBottom;
+ }
+
/**
* Check if the given rect is equal to this one.
*
diff --git a/engines/wintermute/math/vector2.cpp b/engines/wintermute/math/vector2.cpp
index 618ee9bda9..a88edb1e6f 100644
--- a/engines/wintermute/math/vector2.cpp
+++ b/engines/wintermute/math/vector2.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/wintermute/math/vector2.h b/engines/wintermute/math/vector2.h
index e4ba97c517..65aa6961f8 100644
--- a/engines/wintermute/math/vector2.h
+++ b/engines/wintermute/math/vector2.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/wintermute/module.mk b/engines/wintermute/module.mk
index 95f9ba2ffb..19fb3d6717 100644
--- a/engines/wintermute/module.mk
+++ b/engines/wintermute/module.mk
@@ -1,5 +1,5 @@
MODULE := engines/wintermute
-
+
MODULE_OBJS := \
ad/ad_actor.o \
ad/ad_entity.o \
@@ -116,14 +116,14 @@ MODULE_OBJS := \
debugger.o \
wintermute.o \
persistent.o
-
+
MODULE_DIRS += \
engines/wintermute
-
+
# This module can be built as a plugin
ifeq ($(ENABLE_WINTERMUTE), DYNAMIC_PLUGIN)
PLUGIN := 1
endif
-
-# Include common rules
+
+# Include common rules
include $(srcdir)/rules.mk
diff --git a/engines/wintermute/persistent.cpp b/engines/wintermute/persistent.cpp
index 514fd61d34..558fb82a0f 100644
--- a/engines/wintermute/persistent.cpp
+++ b/engines/wintermute/persistent.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/wintermute/persistent.h b/engines/wintermute/persistent.h
index ddc0791054..202a0fcda6 100644
--- a/engines/wintermute/persistent.h
+++ b/engines/wintermute/persistent.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/wintermute/platform_osystem.cpp b/engines/wintermute/platform_osystem.cpp
index 87a127d001..e18051f43f 100644
--- a/engines/wintermute/platform_osystem.cpp
+++ b/engines/wintermute/platform_osystem.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -169,52 +169,16 @@ bool BasePlatform::setCursorPos(int x, int y) {
}
//////////////////////////////////////////////////////////////////////////
-bool BasePlatform::showWindow(int nCmdShow) {
- return false;
-}
-
-//////////////////////////////////////////////////////////////////////////
-void BasePlatform::setCapture() {
- return;
-}
-
-//////////////////////////////////////////////////////////////////////////
-bool BasePlatform::releaseCapture() {
- return false;
-}
-
-//////////////////////////////////////////////////////////////////////////
-bool BasePlatform::setRectEmpty(Rect32 *lprc) {
- lprc->left = lprc->right = lprc->top = lprc->bottom = 0;
- return true;
-}
-
-//////////////////////////////////////////////////////////////////////////
-bool BasePlatform::isRectEmpty(const Rect32 *lprc) {
- return (lprc->left >= lprc->right) || (lprc->top >= lprc->bottom);
-}
-
-//////////////////////////////////////////////////////////////////////////
bool BasePlatform::ptInRect(Rect32 *lprc, Point32 p) {
return (p.x >= lprc->left) && (p.x < lprc->right) && (p.y >= lprc->top) && (p.y < lprc->bottom);
}
//////////////////////////////////////////////////////////////////////////
-bool BasePlatform::setRect(Rect32 *lprc, int left, int top, int right, int bottom) {
- lprc->left = left;
- lprc->top = top;
- lprc->right = right;
- lprc->bottom = bottom;
-
- return true;
-}
-
-//////////////////////////////////////////////////////////////////////////
bool BasePlatform::intersectRect(Rect32 *lprcDst, const Rect32 *lprcSrc1, const Rect32 *lprcSrc2) {
- if (isRectEmpty(lprcSrc1) || isRectEmpty(lprcSrc2) ||
+ if (lprcSrc1->isRectEmpty() || lprcSrc2->isRectEmpty() ||
lprcSrc1->left >= lprcSrc2->right || lprcSrc2->left >= lprcSrc1->right ||
lprcSrc1->top >= lprcSrc2->bottom || lprcSrc2->top >= lprcSrc1->bottom) {
- setRectEmpty(lprcDst);
+ lprcDst->setEmpty();
return false;
}
lprcDst->left = MAX(lprcSrc1->left, lprcSrc2->left);
@@ -227,15 +191,15 @@ bool BasePlatform::intersectRect(Rect32 *lprcDst, const Rect32 *lprcSrc1, const
//////////////////////////////////////////////////////////////////////////
bool BasePlatform::unionRect(Rect32 *lprcDst, Rect32 *lprcSrc1, Rect32 *lprcSrc2) {
- if (isRectEmpty(lprcSrc1)) {
- if (isRectEmpty(lprcSrc2)) {
- setRectEmpty(lprcDst);
+ if (lprcSrc1->isRectEmpty()) {
+ if (lprcSrc2->isRectEmpty()) {
+ lprcDst->setEmpty();
return false;
} else {
*lprcDst = *lprcSrc2;
}
} else {
- if (isRectEmpty(lprcSrc2)) {
+ if (lprcSrc2->isRectEmpty()) {
*lprcDst = *lprcSrc1;
} else {
lprcDst->left = MIN(lprcSrc1->left, lprcSrc2->left);
diff --git a/engines/wintermute/platform_osystem.h b/engines/wintermute/platform_osystem.h
index 46c86df909..dd18f99038 100644
--- a/engines/wintermute/platform_osystem.h
+++ b/engines/wintermute/platform_osystem.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -48,13 +48,7 @@ public:
// Win32 API bindings
static bool getCursorPos(Point32 *lpPoint);
static bool setCursorPos(int x, int y);
- static bool showWindow(int nCmdShow);
-
- static void setCapture();
- static bool releaseCapture();
- static bool setRectEmpty(Rect32 *lprc);
- static bool isRectEmpty(const Rect32 *lprc);
static bool ptInRect(Rect32 *lprc, Point32 p);
static bool setRect(Rect32 *lprc, int left, int top, int right, int bottom);
static bool intersectRect(Rect32 *lprcDst, const Rect32 *lprcSrc1, const Rect32 *lprcSrc2);
diff --git a/engines/wintermute/system/sys_class.cpp b/engines/wintermute/system/sys_class.cpp
index 0577f29e2c..4152b6fa7d 100644
--- a/engines/wintermute/system/sys_class.cpp
+++ b/engines/wintermute/system/sys_class.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/wintermute/system/sys_class.h b/engines/wintermute/system/sys_class.h
index 9fb3f70696..a86f476f70 100644
--- a/engines/wintermute/system/sys_class.h
+++ b/engines/wintermute/system/sys_class.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/wintermute/system/sys_class_registry.cpp b/engines/wintermute/system/sys_class_registry.cpp
index 20e4661efb..825fd8f32a 100644
--- a/engines/wintermute/system/sys_class_registry.cpp
+++ b/engines/wintermute/system/sys_class_registry.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/wintermute/system/sys_class_registry.h b/engines/wintermute/system/sys_class_registry.h
index 48a6738ffb..a9c7e641db 100644
--- a/engines/wintermute/system/sys_class_registry.h
+++ b/engines/wintermute/system/sys_class_registry.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/wintermute/system/sys_instance.cpp b/engines/wintermute/system/sys_instance.cpp
index b8e5c9b50a..490324167f 100644
--- a/engines/wintermute/system/sys_instance.cpp
+++ b/engines/wintermute/system/sys_instance.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/wintermute/system/sys_instance.h b/engines/wintermute/system/sys_instance.h
index 115de28094..7f6661eb0e 100644
--- a/engines/wintermute/system/sys_instance.h
+++ b/engines/wintermute/system/sys_instance.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/wintermute/ui/ui_button.cpp b/engines/wintermute/ui/ui_button.cpp
index 42a873a0b4..12ecfe152d 100644
--- a/engines/wintermute/ui/ui_button.cpp
+++ b/engines/wintermute/ui/ui_button.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -655,7 +655,7 @@ bool UIButton::display(int offsetX, int offsetY) {
BaseFont *font = 0;
//RECT rect;
- //BasePlatform::setRect(&rect, OffsetX + _posX, OffsetY + _posY, OffsetX+_posX+_width, OffsetY+_posY+_height);
+ //rect.setRect(OffsetX + _posX, OffsetY + _posY, OffsetX+_posX+_width, OffsetY+_posY+_height);
//_hover = (!_disable && BasePlatform::ptInRect(&rect, _gameRef->_mousePos)!=FALSE);
_hover = (!_disable && _gameRef->_activeObject == this && (_gameRef->_interactive || _gameRef->_state == GAME_SEMI_FROZEN));
@@ -1178,25 +1178,25 @@ bool UIButton::persist(BasePersistenceManager *persistMgr) {
UIObject::persist(persistMgr);
- persistMgr->transfer(TMEMBER_INT(_align));
+ persistMgr->transferSint32(TMEMBER_INT(_align));
persistMgr->transferPtr(TMEMBER_PTR(_backDisable));
persistMgr->transferPtr(TMEMBER_PTR(_backFocus));
persistMgr->transferPtr(TMEMBER_PTR(_backHover));
persistMgr->transferPtr(TMEMBER_PTR(_backPress));
- persistMgr->transfer(TMEMBER(_centerImage));
+ persistMgr->transferBool(TMEMBER(_centerImage));
persistMgr->transferPtr(TMEMBER_PTR(_fontDisable));
persistMgr->transferPtr(TMEMBER_PTR(_fontFocus));
persistMgr->transferPtr(TMEMBER_PTR(_fontHover));
persistMgr->transferPtr(TMEMBER_PTR(_fontPress));
- persistMgr->transfer(TMEMBER(_hover));
+ persistMgr->transferBool(TMEMBER(_hover));
persistMgr->transferPtr(TMEMBER_PTR(_image));
persistMgr->transferPtr(TMEMBER_PTR(_imageDisable));
persistMgr->transferPtr(TMEMBER_PTR(_imageFocus));
persistMgr->transferPtr(TMEMBER_PTR(_imageHover));
persistMgr->transferPtr(TMEMBER_PTR(_imagePress));
- persistMgr->transfer(TMEMBER(_pixelPerfect));
- persistMgr->transfer(TMEMBER(_press));
- persistMgr->transfer(TMEMBER(_stayPressed));
+ persistMgr->transferBool(TMEMBER(_pixelPerfect));
+ persistMgr->transferBool(TMEMBER(_press));
+ persistMgr->transferBool(TMEMBER(_stayPressed));
if (!persistMgr->getIsSaving()) {
_oneTimePress = false;
diff --git a/engines/wintermute/ui/ui_button.h b/engines/wintermute/ui/ui_button.h
index 6452cfc4f7..2e4fa8486b 100644
--- a/engines/wintermute/ui/ui_button.h
+++ b/engines/wintermute/ui/ui_button.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/wintermute/ui/ui_edit.cpp b/engines/wintermute/ui/ui_edit.cpp
index 4de1965b59..ffe8d66b4d 100644
--- a/engines/wintermute/ui/ui_edit.cpp
+++ b/engines/wintermute/ui/ui_edit.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -932,14 +932,14 @@ bool UIEdit::persist(BasePersistenceManager *persistMgr) {
UIObject::persist(persistMgr);
- persistMgr->transfer(TMEMBER(_cursorBlinkRate));
- persistMgr->transfer(TMEMBER(_cursorChar));
+ persistMgr->transferUint32(TMEMBER(_cursorBlinkRate));
+ persistMgr->transferCharPtr(TMEMBER(_cursorChar));
persistMgr->transferPtr(TMEMBER_PTR(_fontSelected));
- persistMgr->transfer(TMEMBER(_frameWidth));
- persistMgr->transfer(TMEMBER(_maxLength));
- persistMgr->transfer(TMEMBER(_scrollOffset));
- persistMgr->transfer(TMEMBER(_selEnd));
- persistMgr->transfer(TMEMBER(_selStart));
+ persistMgr->transferSint32(TMEMBER(_frameWidth));
+ persistMgr->transferSint32(TMEMBER(_maxLength));
+ persistMgr->transferSint32(TMEMBER(_scrollOffset));
+ persistMgr->transferSint32(TMEMBER(_selEnd));
+ persistMgr->transferSint32(TMEMBER(_selStart));
if (!persistMgr->getIsSaving()) {
_cursorVisible = false;
diff --git a/engines/wintermute/ui/ui_edit.h b/engines/wintermute/ui/ui_edit.h
index 19ea5ecc5d..ea110a74a8 100644
--- a/engines/wintermute/ui/ui_edit.h
+++ b/engines/wintermute/ui/ui_edit.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/wintermute/ui/ui_entity.cpp b/engines/wintermute/ui/ui_entity.cpp
index 0dbf8df00b..9e1e2a28e5 100644
--- a/engines/wintermute/ui/ui_entity.cpp
+++ b/engines/wintermute/ui/ui_entity.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/wintermute/ui/ui_entity.h b/engines/wintermute/ui/ui_entity.h
index 63f0026412..b1ea2d579f 100644
--- a/engines/wintermute/ui/ui_entity.h
+++ b/engines/wintermute/ui/ui_entity.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/wintermute/ui/ui_object.cpp b/engines/wintermute/ui/ui_object.cpp
index a8da89b011..194943add8 100644
--- a/engines/wintermute/ui/ui_object.cpp
+++ b/engines/wintermute/ui/ui_object.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -622,23 +622,23 @@ bool UIObject::persist(BasePersistenceManager *persistMgr) {
BaseObject::persist(persistMgr);
persistMgr->transferPtr(TMEMBER_PTR(_back));
- persistMgr->transfer(TMEMBER(_canFocus));
- persistMgr->transfer(TMEMBER(_disable));
+ persistMgr->transferBool(TMEMBER(_canFocus));
+ persistMgr->transferBool(TMEMBER(_disable));
persistMgr->transferPtr(TMEMBER_PTR(_focusedWidget));
persistMgr->transferPtr(TMEMBER_PTR(_font));
- persistMgr->transfer(TMEMBER(_height));
+ persistMgr->transferSint32(TMEMBER(_height));
persistMgr->transferPtr(TMEMBER_PTR(_image));
persistMgr->transferPtr(TMEMBER_PTR(_listenerObject));
persistMgr->transferPtr(TMEMBER_PTR(_listenerParamObject));
- persistMgr->transfer(TMEMBER(_listenerParamDWORD));
+ persistMgr->transferUint32(TMEMBER(_listenerParamDWORD));
persistMgr->transferPtr(TMEMBER_PTR(_parent));
- persistMgr->transfer(TMEMBER(_parentNotify));
- persistMgr->transfer(TMEMBER(_sharedFonts));
- persistMgr->transfer(TMEMBER(_sharedImages));
- persistMgr->transfer(TMEMBER(_text));
- persistMgr->transfer(TMEMBER_INT(_type));
- persistMgr->transfer(TMEMBER(_visible));
- persistMgr->transfer(TMEMBER(_width));
+ persistMgr->transferBool(TMEMBER(_parentNotify));
+ persistMgr->transferBool(TMEMBER(_sharedFonts));
+ persistMgr->transferBool(TMEMBER(_sharedImages));
+ persistMgr->transferCharPtr(TMEMBER(_text));
+ persistMgr->transferSint32(TMEMBER_INT(_type));
+ persistMgr->transferBool(TMEMBER(_visible));
+ persistMgr->transferSint32(TMEMBER(_width));
return STATUS_OK;
}
@@ -652,7 +652,10 @@ int32 UIObject::getWidth() const {
return _width;
}
-int32 UIObject::getHeight() const {
+// Has to be non-const to allow the virtual override to work,
+// as other getHeight()-functions currently have the potential
+// of having side-effects.
+int32 UIObject::getHeight() {
return _height;
}
diff --git a/engines/wintermute/ui/ui_object.h b/engines/wintermute/ui/ui_object.h
index 8d14d8a6a4..e7c0d56eb8 100644
--- a/engines/wintermute/ui/ui_object.h
+++ b/engines/wintermute/ui/ui_object.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -69,7 +69,7 @@ public:
TUIObjectType _type;
int32 getWidth() const;
- int32 getHeight() const;
+ int32 getHeight() override;
void setHeight(int32 height);
void setWidth(int32 width);
bool isDisabled() const;
diff --git a/engines/wintermute/ui/ui_text.cpp b/engines/wintermute/ui/ui_text.cpp
index 117b1ff6cf..18b134a338 100644
--- a/engines/wintermute/ui/ui_text.cpp
+++ b/engines/wintermute/ui/ui_text.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -503,8 +503,8 @@ const char *UIText::scToString() {
bool UIText::persist(BasePersistenceManager *persistMgr) {
UIObject::persist(persistMgr);
- persistMgr->transfer(TMEMBER_INT(_textAlign));
- persistMgr->transfer(TMEMBER_INT(_verticalAlign));
+ persistMgr->transferSint32(TMEMBER_INT(_textAlign));
+ persistMgr->transferSint32(TMEMBER_INT(_verticalAlign));
return STATUS_OK;
}
diff --git a/engines/wintermute/ui/ui_text.h b/engines/wintermute/ui/ui_text.h
index c39260b228..d82ae9a1a2 100644
--- a/engines/wintermute/ui/ui_text.h
+++ b/engines/wintermute/ui/ui_text.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/wintermute/ui/ui_tiled_image.cpp b/engines/wintermute/ui/ui_tiled_image.cpp
index e647e0d894..caa93df21c 100644
--- a/engines/wintermute/ui/ui_tiled_image.cpp
+++ b/engines/wintermute/ui/ui_tiled_image.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -44,15 +44,15 @@ IMPLEMENT_PERSISTENT(UITiledImage, false)
UITiledImage::UITiledImage(BaseGame *inGame) : BaseObject(inGame) {
_image = nullptr;
- BasePlatform::setRectEmpty(&_upLeft);
- BasePlatform::setRectEmpty(&_upMiddle);
- BasePlatform::setRectEmpty(&_upRight);
- BasePlatform::setRectEmpty(&_middleLeft);
- BasePlatform::setRectEmpty(&_middleMiddle);
- BasePlatform::setRectEmpty(&_middleRight);
- BasePlatform::setRectEmpty(&_downLeft);
- BasePlatform::setRectEmpty(&_downMiddle);
- BasePlatform::setRectEmpty(&_downRight);
+ _upLeft.setEmpty();
+ _upMiddle.setEmpty();
+ _upRight.setEmpty();
+ _middleLeft.setEmpty();
+ _middleMiddle.setEmpty();
+ _middleRight.setEmpty();
+ _downLeft.setEmpty();
+ _downMiddle.setEmpty();
+ _downRight.setEmpty();
}
@@ -267,19 +267,19 @@ bool UITiledImage::loadBuffer(char *buffer, bool complete) {
if (vTiles && hTiles) {
// up row
- BasePlatform::setRect(&_upLeft, 0, 0, h1, v1);
- BasePlatform::setRect(&_upMiddle, h1, 0, h1 + h2, v1);
- BasePlatform::setRect(&_upRight, h1 + h2, 0, h1 + h2 + h3, v1);
+ _upLeft.setRect(0, 0, h1, v1);
+ _upMiddle.setRect(h1, 0, h1 + h2, v1);
+ _upRight.setRect(h1 + h2, 0, h1 + h2 + h3, v1);
// middle row
- BasePlatform::setRect(&_middleLeft, 0, v1, h1, v1 + v2);
- BasePlatform::setRect(&_middleMiddle, h1, v1, h1 + h2, v1 + v2);
- BasePlatform::setRect(&_middleRight, h1 + h2, v1, h1 + h2 + h3, v1 + v2);
+ _middleLeft.setRect(0, v1, h1, v1 + v2);
+ _middleMiddle.setRect(h1, v1, h1 + h2, v1 + v2);
+ _middleRight.setRect(h1 + h2, v1, h1 + h2 + h3, v1 + v2);
// down row
- BasePlatform::setRect(&_downLeft, 0, v1 + v2, h1, v1 + v2 + v3);
- BasePlatform::setRect(&_downMiddle, h1, v1 + v2, h1 + h2, v1 + v2 + v3);
- BasePlatform::setRect(&_downRight, h1 + h2, v1 + v2, h1 + h2 + h3, v1 + v2 + v3);
+ _downLeft.setRect(0, v1 + v2, h1, v1 + v2 + v3);
+ _downMiddle.setRect(h1, v1 + v2, h1 + h2, v1 + v2 + v3);
+ _downRight.setRect(h1 + h2, v1 + v2, h1 + h2 + h3, v1 + v2 + v3);
}
// default
@@ -287,34 +287,34 @@ bool UITiledImage::loadBuffer(char *buffer, bool complete) {
int width = _image->_surface->getWidth() / 3;
int height = _image->_surface->getHeight() / 3;
- if (BasePlatform::isRectEmpty(&_upLeft)) {
- BasePlatform::setRect(&_upLeft, 0, 0, width, height);
+ if (_upLeft.isRectEmpty()) {
+ _upLeft.setRect(0, 0, width, height);
}
- if (BasePlatform::isRectEmpty(&_upMiddle)) {
- BasePlatform::setRect(&_upMiddle, width, 0, 2 * width, height);
+ if (_upMiddle.isRectEmpty()) {
+ _upMiddle.setRect(width, 0, 2 * width, height);
}
- if (BasePlatform::isRectEmpty(&_upRight)) {
- BasePlatform::setRect(&_upRight, 2 * width, 0, 3 * width, height);
+ if (_upRight.isRectEmpty()) {
+ _upRight.setRect(2 * width, 0, 3 * width, height);
}
- if (BasePlatform::isRectEmpty(&_middleLeft)) {
- BasePlatform::setRect(&_middleLeft, 0, height, width, 2 * height);
+ if (_middleLeft.isRectEmpty()) {
+ _middleLeft.setRect(0, height, width, 2 * height);
}
- if (BasePlatform::isRectEmpty(&_middleMiddle)) {
- BasePlatform::setRect(&_middleMiddle, width, height, 2 * width, 2 * height);
+ if (_middleMiddle.isRectEmpty()) {
+ _middleMiddle.setRect(width, height, 2 * width, 2 * height);
}
- if (BasePlatform::isRectEmpty(&_middleRight)) {
- BasePlatform::setRect(&_middleRight, 2 * width, height, 3 * width, 2 * height);
+ if (_middleRight.isRectEmpty()) {
+ _middleRight.setRect(2 * width, height, 3 * width, 2 * height);
}
- if (BasePlatform::isRectEmpty(&_downLeft)) {
- BasePlatform::setRect(&_downLeft, 0, 2 * height, width, 3 * height);
+ if (_downLeft.isRectEmpty()) {
+ _downLeft.setRect(0, 2 * height, width, 3 * height);
}
- if (BasePlatform::isRectEmpty(&_downMiddle)) {
- BasePlatform::setRect(&_downMiddle, width, 2 * height, 2 * width, 3 * height);
+ if (_downMiddle.isRectEmpty()) {
+ _downMiddle.setRect(width, 2 * height, 2 * width, 3 * height);
}
- if (BasePlatform::isRectEmpty(&_downRight)) {
- BasePlatform::setRect(&_downRight, 2 * width, 2 * height, 3 * width, 3 * height);
+ if (_downRight.isRectEmpty()) {
+ _downRight.setRect(2 * width, 2 * height, 3 * width, 3 * height);
}
}
@@ -369,16 +369,16 @@ void UITiledImage::correctSize(int32 *width, int32 *height) {
bool UITiledImage::persist(BasePersistenceManager *persistMgr) {
BaseObject::persist(persistMgr);
- persistMgr->transfer(TMEMBER(_downLeft));
- persistMgr->transfer(TMEMBER(_downMiddle));
- persistMgr->transfer(TMEMBER(_downRight));
+ persistMgr->transferRect32(TMEMBER(_downLeft));
+ persistMgr->transferRect32(TMEMBER(_downMiddle));
+ persistMgr->transferRect32(TMEMBER(_downRight));
persistMgr->transferPtr(TMEMBER_PTR(_image));
- persistMgr->transfer(TMEMBER(_middleLeft));
- persistMgr->transfer(TMEMBER(_middleMiddle));
- persistMgr->transfer(TMEMBER(_middleRight));
- persistMgr->transfer(TMEMBER(_upLeft));
- persistMgr->transfer(TMEMBER(_upMiddle));
- persistMgr->transfer(TMEMBER(_upRight));
+ persistMgr->transferRect32(TMEMBER(_middleLeft));
+ persistMgr->transferRect32(TMEMBER(_middleMiddle));
+ persistMgr->transferRect32(TMEMBER(_middleRight));
+ persistMgr->transferRect32(TMEMBER(_upLeft));
+ persistMgr->transferRect32(TMEMBER(_upMiddle));
+ persistMgr->transferRect32(TMEMBER(_upRight));
return STATUS_OK;
}
diff --git a/engines/wintermute/ui/ui_tiled_image.h b/engines/wintermute/ui/ui_tiled_image.h
index fa92c46781..916353af2d 100644
--- a/engines/wintermute/ui/ui_tiled_image.h
+++ b/engines/wintermute/ui/ui_tiled_image.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/wintermute/ui/ui_window.cpp b/engines/wintermute/ui/ui_window.cpp
index 9051ce8217..9f3cdeaaa3 100644
--- a/engines/wintermute/ui/ui_window.cpp
+++ b/engines/wintermute/ui/ui_window.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -54,8 +54,8 @@ IMPLEMENT_PERSISTENT(UIWindow, false)
//////////////////////////////////////////////////////////////////////////
UIWindow::UIWindow(BaseGame *inGame) : UIObject(inGame) {
- BasePlatform::setRectEmpty(&_titleRect);
- BasePlatform::setRectEmpty(&_dragRect);
+ _titleRect.setEmpty();
+ _dragRect.setEmpty();
_titleAlign = TAL_LEFT;
_transparent = false;
@@ -213,7 +213,7 @@ bool UIWindow::display(int offsetX, int offsetY) {
image->draw(_posX + offsetX, _posY + offsetY, _transparent ? nullptr : this);
}
- if (!BasePlatform::isRectEmpty(&_titleRect) && font && _text) {
+ if (!_titleRect.isRectEmpty() && font && _text) {
font->drawText((byte *)_text, _posX + offsetX + _titleRect.left, _posY + offsetY + _titleRect.top, _titleRect.right - _titleRect.left, _titleAlign, _titleRect.bottom - _titleRect.top);
}
@@ -676,11 +676,11 @@ bool UIWindow::saveAsText(BaseDynamicBuffer *buffer, int indent) {
error("UIWindow::SaveAsText - Unhandled enum-value NUM_TEXT_ALIGN");
}
- if (!BasePlatform::isRectEmpty(&_titleRect)) {
+ if (!_titleRect.isRectEmpty()) {
buffer->putTextIndent(indent + 2, "TITLE_RECT { %d, %d, %d, %d }\n", _titleRect.left, _titleRect.top, _titleRect.right, _titleRect.bottom);
}
- if (!BasePlatform::isRectEmpty(&_dragRect)) {
+ if (!_dragRect.isRectEmpty()) {
buffer->putTextIndent(indent + 2, "DRAG_RECT { %d, %d, %d, %d }\n", _dragRect.left, _dragRect.top, _dragRect.right, _dragRect.bottom);
}
@@ -1227,7 +1227,7 @@ bool UIWindow::handleMouse(TMouseEvent event, TMouseButton button) {
bool res = UIObject::handleMouse(event, button);
// handle window dragging
- if (!BasePlatform::isRectEmpty(&_dragRect)) {
+ if (!_dragRect.isRectEmpty()) {
// start drag
if (event == MOUSE_CLICK && button == MOUSE_BUTTON_LEFT) {
Rect32 dragRect = _dragRect;
@@ -1258,24 +1258,24 @@ bool UIWindow::persist(BasePersistenceManager *persistMgr) {
UIObject::persist(persistMgr);
persistMgr->transferPtr(TMEMBER_PTR(_backInactive));
- persistMgr->transfer(TMEMBER(_clipContents));
- persistMgr->transfer(TMEMBER(_dragFrom));
- persistMgr->transfer(TMEMBER(_dragging));
- persistMgr->transfer(TMEMBER(_dragRect));
- persistMgr->transfer(TMEMBER(_fadeBackground));
- persistMgr->transfer(TMEMBER(_fadeColor));
+ persistMgr->transferBool(TMEMBER(_clipContents));
+ persistMgr->transferPoint32(TMEMBER(_dragFrom));
+ persistMgr->transferBool(TMEMBER(_dragging));
+ persistMgr->transferRect32(TMEMBER(_dragRect));
+ persistMgr->transferBool(TMEMBER(_fadeBackground));
+ persistMgr->transferUint32(TMEMBER(_fadeColor));
persistMgr->transferPtr(TMEMBER_PTR(_fontInactive));
persistMgr->transferPtr(TMEMBER_PTR(_imageInactive));
- persistMgr->transfer(TMEMBER(_inGame));
- persistMgr->transfer(TMEMBER(_isMenu));
- persistMgr->transfer(TMEMBER_INT(_mode));
+ persistMgr->transferBool(TMEMBER(_inGame));
+ persistMgr->transferBool(TMEMBER(_isMenu));
+ persistMgr->transferSint32(TMEMBER_INT(_mode));
persistMgr->transferPtr(TMEMBER_PTR(_shieldButton));
persistMgr->transferPtr(TMEMBER_PTR(_shieldWindow));
- persistMgr->transfer(TMEMBER_INT(_titleAlign));
- persistMgr->transfer(TMEMBER(_titleRect));
- persistMgr->transfer(TMEMBER(_transparent));
+ persistMgr->transferSint32(TMEMBER_INT(_titleAlign));
+ persistMgr->transferRect32(TMEMBER(_titleRect));
+ persistMgr->transferBool(TMEMBER(_transparent));
persistMgr->transferPtr(TMEMBER_PTR(_viewport));
- persistMgr->transfer(TMEMBER(_pauseMusic));
+ persistMgr->transferBool(TMEMBER(_pauseMusic));
_widgets.persist(persistMgr);
diff --git a/engines/wintermute/ui/ui_window.h b/engines/wintermute/ui/ui_window.h
index 6b4d970581..dad8c89e6c 100644
--- a/engines/wintermute/ui/ui_window.h
+++ b/engines/wintermute/ui/ui_window.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/wintermute/utils/path_util.cpp b/engines/wintermute/utils/path_util.cpp
index ee8b298562..71311713af 100644
--- a/engines/wintermute/utils/path_util.cpp
+++ b/engines/wintermute/utils/path_util.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/wintermute/utils/path_util.h b/engines/wintermute/utils/path_util.h
index 2c7dfa99d1..264dc5d241 100644
--- a/engines/wintermute/utils/path_util.h
+++ b/engines/wintermute/utils/path_util.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/wintermute/utils/string_util.cpp b/engines/wintermute/utils/string_util.cpp
index e8e078aba8..82d4fe6902 100644
--- a/engines/wintermute/utils/string_util.cpp
+++ b/engines/wintermute/utils/string_util.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -50,142 +50,94 @@ bool StringUtil::compareNoCase(const AnsiString &str1, const AnsiString &str2) {
//////////////////////////////////////////////////////////////////////////
WideString StringUtil::utf8ToWide(const Utf8String &Utf8Str) {
- error("StringUtil::Utf8ToWide - WideString not supported yet");
- /* size_t WideSize = Utf8Str.size();
-
- if (sizeof(wchar_t) == 2) {
- wchar_t *WideStringNative = new wchar_t[WideSize + 1];
-
- const UTF8 *SourceStart = reinterpret_cast<const UTF8 *>(Utf8Str.c_str());
- const UTF8 *SourceEnd = SourceStart + WideSize;
-
- UTF16 *TargetStart = reinterpret_cast<UTF16 *>(WideStringNative);
- UTF16 *TargetEnd = TargetStart + WideSize + 1;
-
- ConversionResult res = ConvertUTF8toUTF16(&SourceStart, SourceEnd, &TargetStart, TargetEnd, strictConversion);
- if (res != conversionOK) {
- delete[] WideStringNative;
- return L"";
- }
- *TargetStart = 0;
- WideString ResultString(WideStringNative);
- delete[] WideStringNative;
-
- return ResultString;
- } else if (sizeof(wchar_t) == 4) {
- wchar_t *WideStringNative = new wchar_t[WideSize + 1];
-
- const UTF8 *SourceStart = reinterpret_cast<const UTF8 *>(Utf8Str.c_str());
- const UTF8 *SourceEnd = SourceStart + WideSize;
-
- UTF32 *TargetStart = reinterpret_cast<UTF32 *>(WideStringNative);
- UTF32 *TargetEnd = TargetStart + WideSize;
-
- ConversionResult res = ConvertUTF8toUTF32(&SourceStart, SourceEnd, &TargetStart, TargetEnd, strictConversion);
- if (res != conversionOK) {
- delete[] WideStringNative;
- return L"";
- }
- *TargetStart = 0;
- WideString ResultString(WideStringNative);
- delete[] WideStringNative;
-
- return ResultString;
- } else {
- return L"";
- }*/
- return "";
+ size_t wideSize = Utf8Str.size();
+
+ uint32 *wideStringNative = new uint32[wideSize + 1];
+
+ const UTF8 *sourceStart = reinterpret_cast<const UTF8 *>(Utf8Str.c_str());
+ const UTF8 *sourceEnd = sourceStart + wideSize;
+
+ UTF32 *targetStart = reinterpret_cast<UTF32 *>(wideStringNative);
+ UTF32 *targetEnd = targetStart + wideSize;
+
+ ConversionResult res = ConvertUTF8toUTF32(&sourceStart, sourceEnd, &targetStart, targetEnd, strictConversion);
+ if (res != conversionOK) {
+ delete[] wideStringNative;
+ return WideString();
+ }
+ *targetStart = 0;
+ WideString resultString(wideStringNative);
+ delete[] wideStringNative;
+ return resultString;
}
//////////////////////////////////////////////////////////////////////////
Utf8String StringUtil::wideToUtf8(const WideString &WideStr) {
- error("StringUtil::wideToUtf8 - Widestring not supported yet");
- /* size_t WideSize = WideStr.length();
-
- if (sizeof(wchar_t) == 2) {
- size_t utf8Size = 3 * WideSize + 1;
- char *utf8StringNative = new char[Utf8Size];
-
- const UTF16 *SourceStart = reinterpret_cast<const UTF16 *>(WideStr.c_str());
- const UTF16 *SourceEnd = SourceStart + WideSize;
-
- UTF8 *TargetStart = reinterpret_cast<UTF8 *>(Utf8StringNative);
- UTF8 *TargetEnd = TargetStart + Utf8Size;
-
- ConversionResult res = ConvertUTF16toUTF8(&SourceStart, SourceEnd, &TargetStart, TargetEnd, strictConversion);
- if (res != conversionOK) {
- delete[] Utf8StringNative;
- return (Utf8String)"";
- }
- *TargetStart = 0;
- Utf8String ResultString(Utf8StringNative);
- delete[] Utf8StringNative;
- return ResultString;
- } else if (sizeof(wchar_t) == 4) {
- size_t utf8Size = 4 * WideSize + 1;
- char *utf8StringNative = new char[Utf8Size];
-
- const UTF32 *SourceStart = reinterpret_cast<const UTF32 *>(WideStr.c_str());
- const UTF32 *SourceEnd = SourceStart + WideSize;
-
- UTF8 *TargetStart = reinterpret_cast<UTF8 *>(Utf8StringNative);
- UTF8 *TargetEnd = TargetStart + Utf8Size;
-
- ConversionResult res = ConvertUTF32toUTF8(&SourceStart, SourceEnd, &TargetStart, TargetEnd, strictConversion);
- if (res != conversionOK) {
- delete[] Utf8StringNative;
- return (Utf8String)"";
- }
- *TargetStart = 0;
- Utf8String ResultString(Utf8StringNative);
- delete[] Utf8StringNative;
- return ResultString;
- } else {
- return (Utf8String)"";
- }*/
- return "";
+ size_t wideSize = WideStr.size();
+
+ size_t utf8Size = 4 * wideSize + 1;
+ char *utf8StringNative = new char[utf8Size];
+
+ const UTF32 *sourceStart = reinterpret_cast<const UTF32 *>(WideStr.c_str());
+ const UTF32 *sourceEnd = sourceStart + wideSize;
+
+ UTF8 *targetStart = reinterpret_cast<UTF8 *>(utf8StringNative);
+ UTF8 *targetEnd = targetStart + utf8Size;
+
+ ConversionResult res = ConvertUTF32toUTF8(&sourceStart, sourceEnd, &targetStart, targetEnd, strictConversion);
+ if (res != conversionOK) {
+ delete[] utf8StringNative;
+ return Utf8String();
+ }
+ *targetStart = 0;
+ Utf8String resultString(utf8StringNative);
+ delete[] utf8StringNative;
+ return resultString;
}
//////////////////////////////////////////////////////////////////////////
WideString StringUtil::ansiToWide(const AnsiString &str) {
- // TODO: This function gets called a lot, so warnings like these drown out the usefull information
- Common::String converted = "";
- uint32 index = 0;
- while (index != str.size()) {
- byte c = str[index];
- if (c == 146) {
- converted += (char)39; // Replace right-quote with apostrophe
- } else if (c == 133) {
- converted += Common::String("..."); // Replace ...-symbol with ...
+ WideString result;
+ for (AnsiString::const_iterator i = str.begin(), end = str.end(); i != end; ++i) {
+ const byte c = *i;
+ if (c < 0x80 || c >= 0xA0) {
+ result += c;
} else {
- converted += c;
+ uint32 utf32 = _ansiToUTF32[c - 0x80];
+ if (utf32) {
+ result += utf32;
+ } else {
+ // It's an invalid CP1252 character...
+ }
}
- index++;
}
- // using default os locale!
-
- /* setlocale(LC_CTYPE, "");
- size_t wideSize = mbstowcs(NULL, str.c_str(), 0) + 1;
- wchar_t *wstr = new wchar_t[WideSize];
- mbstowcs(wstr, str.c_str(), WideSize);
- WideString ResultString(wstr);
- delete[] wstr;
- return ResultString;*/
- return WideString(converted);
+ return result;
}
//////////////////////////////////////////////////////////////////////////
AnsiString StringUtil::wideToAnsi(const WideString &wstr) {
- // using default os locale!
- // TODO: This function gets called a lot, so warnings like these drown out the usefull information
- /* setlocale(LC_CTYPE, "");
- size_t wideSize = wcstombs(NULL, wstr.c_str(), 0) + 1;
- char *str = new char[WideSize];
- wcstombs(str, wstr.c_str(), WideSize);
- AnsiString ResultString(str);
- delete[] str;
- return ResultString;*/
- return AnsiString(wstr);
+ AnsiString result;
+ for (WideString::const_iterator i = wstr.begin(), end = wstr.end(); i != end; ++i) {
+ const uint32 c = *i;
+ if (c < 0x80 || (c >= 0xA0 && c <= 0xFF)) {
+ result += c;
+ } else {
+ uint32 ansi = 0xFFFFFFFF;
+ for (uint j = 0; j < ARRAYSIZE(_ansiToUTF32); ++j) {
+ if (_ansiToUTF32[j] == c) {
+ ansi = j + 0x80;
+ break;
+ }
+ }
+
+ if (ansi != 0xFFFFFFFF) {
+ result += ansi;
+ } else {
+ // There's no valid CP1252 code for this character...
+ }
+ }
+ }
+ return result;
}
//////////////////////////////////////////////////////////////////////////
@@ -199,12 +151,7 @@ bool StringUtil::isUtf8BOM(const byte *buffer, uint32 bufferSize) {
//////////////////////////////////////////////////////////////////////////
int StringUtil::indexOf(const WideString &str, const WideString &toFind, size_t startFrom) {
- const char *index = strstr(str.c_str(), toFind.c_str());
- if (index == nullptr) {
- return -1;
- } else {
- return index - str.c_str();
- }
+ return str.find(toFind, startFrom);
}
Common::String StringUtil::encodeSetting(const Common::String &str) {
@@ -225,5 +172,10 @@ AnsiString StringUtil::toString(int val) {
return Common::String::format("%d", val);
}
+// Mapping of CP1252 characters 0x80...0x9F into UTF-32
+uint32 StringUtil::_ansiToUTF32[32] = {
+ 0x20AC, 0x0000, 0x201A, 0x0192, 0x201E, 0x2026, 0x2020, 0x2021, 0x02C6, 0x2030, 0x0160, 0x2039, 0x0152, 0x0000, 0x017D, 0x0000,
+ 0x0000, 0x2018, 0x2019, 0x201C, 0x201D, 0x2022, 0x2013, 0x2014, 0x02DC, 0x2122, 0x0161, 0x203A, 0x0153, 0x0000, 0x017E, 0x0178
+};
} // End of namespace Wintermute
diff --git a/engines/wintermute/utils/string_util.h b/engines/wintermute/utils/string_util.h
index 3ae5e47493..431d401d96 100644
--- a/engines/wintermute/utils/string_util.h
+++ b/engines/wintermute/utils/string_util.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -49,6 +49,9 @@ public:
static Common::String decodeSetting(const Common::String &str);
static AnsiString toString(int val);
+
+private:
+ static uint32 _ansiToUTF32[32];
};
} // End of namespace Wintermute
diff --git a/engines/wintermute/utils/utils.cpp b/engines/wintermute/utils/utils.cpp
index 8fa6313ba6..d592019418 100644
--- a/engines/wintermute/utils/utils.cpp
+++ b/engines/wintermute/utils/utils.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/wintermute/utils/utils.h b/engines/wintermute/utils/utils.h
index 6c804ff01e..4ee875fb06 100644
--- a/engines/wintermute/utils/utils.h
+++ b/engines/wintermute/utils/utils.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/wintermute/video/video_player.cpp b/engines/wintermute/video/video_player.cpp
index f18311c3e1..5a71b04377 100644
--- a/engines/wintermute/video/video_player.cpp
+++ b/engines/wintermute/video/video_player.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/wintermute/video/video_player.h b/engines/wintermute/video/video_player.h
index 51c6bf41d3..8812e2597b 100644
--- a/engines/wintermute/video/video_player.h
+++ b/engines/wintermute/video/video_player.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/wintermute/video/video_theora_player.cpp b/engines/wintermute/video/video_theora_player.cpp
index f3317684b5..e1553580ec 100644
--- a/engines/wintermute/video/video_theora_player.cpp
+++ b/engines/wintermute/video/video_theora_player.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -34,7 +34,6 @@
#include "engines/wintermute/base/gfx/base_image.h"
#include "engines/wintermute/base/gfx/base_renderer.h"
#include "engines/wintermute/base/sound/base_sound_manager.h"
-#include "engines/wintermute/platform_osystem.h"
#include "video/theora_decoder.h"
#include "engines/wintermute/wintermute.h"
#include "common/system.h"
@@ -128,6 +127,7 @@ bool VideoTheoraPlayer::initialize(const Common::String &filename, const Common:
#if defined (USE_THEORADEC)
_theoraDecoder = new Video::TheoraDecoder();
#else
+ warning("VideoTheoraPlayer::initialize - Theora support not compiled in, video will be skipped: %s", filename.c_str());
return STATUS_FAILED;
#endif
_theoraDecoder->loadStream(_file);
@@ -306,8 +306,15 @@ bool VideoTheoraPlayer::update() {
if (!_theoraDecoder->endOfVideo() && _theoraDecoder->getTimeToNextFrame() == 0) {
const Graphics::Surface *decodedFrame = _theoraDecoder->decodeNextFrame();
if (decodedFrame) {
- _surface.free();
- _surface.copyFrom(*decodedFrame);
+ if (decodedFrame->format == _surface.format && decodedFrame->pitch == _surface.pitch && decodedFrame->h == _surface.h) {
+ const byte *src = (const byte *)decodedFrame->getBasePtr(0, 0);
+ byte *dst = (byte *)_surface.getBasePtr(0, 0);
+ memcpy(dst, src, _surface.pitch * _surface.h);
+ } else {
+ _surface.free();
+ _surface.copyFrom(*decodedFrame);
+ }
+
if (_texture) {
writeVideo();
}
@@ -396,7 +403,7 @@ bool VideoTheoraPlayer::display(uint32 alpha) {
bool res;
if (_texture && _videoFrameReady) {
- BasePlatform::setRect(&rc, 0, 0, _texture->getWidth(), _texture->getHeight());
+ rc.setRect(0, 0, _texture->getWidth(), _texture->getHeight());
if (_playZoom == 100.0f) {
res = _texture->displayTrans(_posX, _posY, rc, alpha);
} else {
@@ -492,16 +499,16 @@ bool VideoTheoraPlayer::persist(BasePersistenceManager *persistMgr) {
}
persistMgr->transferPtr(TMEMBER_PTR(_gameRef));
- persistMgr->transfer(TMEMBER(_savedPos));
- persistMgr->transfer(TMEMBER(_savedState));
- persistMgr->transfer(TMEMBER(_filename));
- persistMgr->transfer(TMEMBER(_alphaFilename));
- persistMgr->transfer(TMEMBER(_posX));
- persistMgr->transfer(TMEMBER(_posY));
+ persistMgr->transferUint32(TMEMBER(_savedPos));
+ persistMgr->transferSint32(TMEMBER(_savedState));
+ persistMgr->transferString(TMEMBER(_filename));
+ persistMgr->transferString(TMEMBER(_alphaFilename));
+ persistMgr->transferSint32(TMEMBER(_posX));
+ persistMgr->transferSint32(TMEMBER(_posY));
persistMgr->transferFloat(TMEMBER(_playZoom));
- persistMgr->transfer(TMEMBER_INT(_playbackType));
- persistMgr->transfer(TMEMBER(_looping));
- persistMgr->transfer(TMEMBER(_volume));
+ persistMgr->transferSint32(TMEMBER_INT(_playbackType));
+ persistMgr->transferBool(TMEMBER(_looping));
+ persistMgr->transferSint32(TMEMBER(_volume));
if (!persistMgr->getIsSaving() && (_savedState != THEORA_STATE_NONE)) {
initializeSimple();
diff --git a/engines/wintermute/video/video_theora_player.h b/engines/wintermute/video/video_theora_player.h
index a4f1b9edd6..8274a1444f 100644
--- a/engines/wintermute/video/video_theora_player.h
+++ b/engines/wintermute/video/video_theora_player.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -62,7 +62,7 @@ public:
//CVidSubtitler *_subtitler;
// control methods
- bool initialize(const Common::String &filename, const Common::String &subtitleFile = nullptr);
+ bool initialize(const Common::String &filename, const Common::String &subtitleFile = Common::String());
bool initializeSimple();
bool update();
bool play(TVideoPlayback type = VID_PLAY_CENTER, int x = 0, int y = 0, bool freezeGame = false, bool freezeMusic = true, bool looping = false, uint32 startTime = 0, float forceZoom = -1.0f, int volume = -1);
diff --git a/engines/wintermute/wintermute.cpp b/engines/wintermute/wintermute.cpp
index 0a6be4caf8..81b6e53c9f 100644
--- a/engines/wintermute/wintermute.cpp
+++ b/engines/wintermute/wintermute.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -365,6 +365,17 @@ bool WintermuteEngine::getGameInfo(const Common::FSList &fslist, Common::String
name = value;
} else if (key == "CAPTION") {
retVal = true;
+ // Remove any translation tags, if they are included in the game description.
+ // This can potentially remove parts of a string that has translation tags
+ // and contains a "/" in its description (e.g. /tag/Name start / name end will
+ // result in "name end"), but it's a very rare case, and this code is just used
+ // for fallback anyway.
+ if (value.hasPrefix("/")) {
+ value.deleteChar(0);
+ while (value.contains("/")) {
+ value.deleteChar(0);
+ }
+ }
caption = value;
}
}
diff --git a/engines/wintermute/wintermute.h b/engines/wintermute/wintermute.h
index fcaa2840a9..017809d56a 100644
--- a/engines/wintermute/wintermute.h
+++ b/engines/wintermute/wintermute.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/wintermute/wintypes.h b/engines/wintermute/wintypes.h
index 1288ac1a65..b30c09dff7 100644
--- a/engines/wintermute/wintypes.h
+++ b/engines/wintermute/wintypes.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/zvision/rlf_animation.cpp b/engines/zvision/animation/rlf_animation.cpp
index 5784df0dac..5784df0dac 100644
--- a/engines/zvision/rlf_animation.cpp
+++ b/engines/zvision/animation/rlf_animation.cpp
diff --git a/engines/zvision/rlf_animation.h b/engines/zvision/animation/rlf_animation.h
index bc5fdc5d90..dfb2a60109 100644
--- a/engines/zvision/rlf_animation.h
+++ b/engines/zvision/animation/rlf_animation.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/zvision/zfs_archive.cpp b/engines/zvision/archives/zfs_archive.cpp
index 3f5ff5a0d4..ed4dcec1fe 100644
--- a/engines/zvision/zfs_archive.cpp
+++ b/engines/zvision/archives/zfs_archive.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -22,7 +22,7 @@
#include "common/scummsys.h"
-#include "zvision/zfs_archive.h"
+#include "zvision/archives/zfs_archive.h"
#include "common/memstream.h"
#include "common/debug.h"
diff --git a/engines/zvision/zfs_archive.h b/engines/zvision/archives/zfs_archive.h
index fc4be5aa1b..44e2c4b240 100644
--- a/engines/zvision/zfs_archive.h
+++ b/engines/zvision/archives/zfs_archive.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/zvision/configure.engine b/engines/zvision/configure.engine
new file mode 100644
index 0000000000..02e31943af
--- /dev/null
+++ b/engines/zvision/configure.engine
@@ -0,0 +1,3 @@
+# This file is included from the main "configure" script
+# add_engine [name] [desc] [build-by-default] [subengines] [base games] [deps]
+add_engine zvision "ZVision" no "" "" "freetype2 16bit"
diff --git a/engines/zvision/console.cpp b/engines/zvision/core/console.cpp
index 252a4b75ef..252a4b75ef 100644
--- a/engines/zvision/console.cpp
+++ b/engines/zvision/core/console.cpp
diff --git a/engines/zvision/core/console.h b/engines/zvision/core/console.h
new file mode 100644
index 0000000000..29523c57ee
--- /dev/null
+++ b/engines/zvision/core/console.h
@@ -0,0 +1,55 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ */
+
+#ifndef ZVISION_CONSOLE_H
+#define ZVISION_CONSOLE_H
+
+#include "gui/debugger.h"
+
+namespace ZVision {
+
+class ZVision;
+
+class Console : public GUI::Debugger {
+public:
+ Console(ZVision *engine);
+ virtual ~Console() {}
+
+private:
+ ZVision *_engine;
+
+ bool cmdLoadImage(int argc, const char **argv);
+ bool cmdLoadVideo(int argc, const char **argv);
+ bool cmdLoadSound(int argc, const char **argv);
+ bool cmdRawToWav(int argc, const char **argv);
+ bool cmdSetRenderState(int argc, const char **argv);
+ bool cmdGenerateRenderTable(int argc, const char **argv);
+ bool cmdSetPanoramaFoV(int argc, const char **argv);
+ bool cmdSetPanoramaScale(int argc, const char **argv);
+ bool cmdChangeLocation(int argc, const char **argv);
+ bool cmdDumpFile(int argc, const char **argv);
+ bool cmdParseAllScrFiles(int argc, const char **argv);
+ bool cmdRenderText(int argc, const char **argv);
+};
+
+} // End of namespace ZVision
+#endif
diff --git a/engines/zvision/events.cpp b/engines/zvision/core/events.cpp
index 189bf007c1..189bf007c1 100644
--- a/engines/zvision/events.cpp
+++ b/engines/zvision/core/events.cpp
diff --git a/engines/zvision/menu.h b/engines/zvision/core/menu.h
index c5938cdc3d..7be03f62ef 100644
--- a/engines/zvision/menu.h
+++ b/engines/zvision/core/menu.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/zvision/save_manager.cpp b/engines/zvision/core/save_manager.cpp
index 15b7424de7..8ec4f4d628 100644
--- a/engines/zvision/save_manager.cpp
+++ b/engines/zvision/core/save_manager.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -22,11 +22,11 @@
#include "common/scummsys.h"
-#include "zvision/save_manager.h"
+#include "zvision/core/save_manager.h"
#include "zvision/zvision.h"
-#include "zvision/script_manager.h"
-#include "zvision/render_manager.h"
+#include "zvision/scripting/script_manager.h"
+#include "zvision/graphics/render_manager.h"
#include "common/system.h"
diff --git a/engines/zvision/save_manager.h b/engines/zvision/core/save_manager.h
index 84afc8cb13..8ed64a3fdc 100644
--- a/engines/zvision/save_manager.h
+++ b/engines/zvision/core/save_manager.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/zvision/cursor.cpp b/engines/zvision/cursors/cursor.cpp
index e2e3d7ee72..e2e3d7ee72 100644
--- a/engines/zvision/cursor.cpp
+++ b/engines/zvision/cursors/cursor.cpp
diff --git a/engines/zvision/cursor.h b/engines/zvision/cursors/cursor.h
index 2304bf4c82..57db561655 100644
--- a/engines/zvision/cursor.h
+++ b/engines/zvision/cursors/cursor.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/zvision/cursor_manager.cpp b/engines/zvision/cursors/cursor_manager.cpp
index c66fa650a8..c66fa650a8 100644
--- a/engines/zvision/cursor_manager.cpp
+++ b/engines/zvision/cursors/cursor_manager.cpp
diff --git a/engines/zvision/cursor_manager.h b/engines/zvision/cursors/cursor_manager.h
index 0521a17337..0521a17337 100644
--- a/engines/zvision/cursor_manager.h
+++ b/engines/zvision/cursors/cursor_manager.h
diff --git a/engines/zvision/detection.cpp b/engines/zvision/detection.cpp
index 4ab0d6c85d..5ad2e7d977 100644
--- a/engines/zvision/detection.cpp
+++ b/engines/zvision/detection.cpp
@@ -8,17 +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.
*
- *
*/
#include "common/scummsys.h"
diff --git a/engines/zvision/detection.h b/engines/zvision/detection.h
index 34417601e8..a788e710b7 100644
--- a/engines/zvision/detection.h
+++ b/engines/zvision/detection.h
@@ -1,24 +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.
-*
-*/
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public 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 ZVISION_DETECTION_H
#define ZVISION_DETECTION_H
diff --git a/engines/zvision/truetype_font.cpp b/engines/zvision/fonts/truetype_font.cpp
index e3eea403b6..e3eea403b6 100644
--- a/engines/zvision/truetype_font.cpp
+++ b/engines/zvision/fonts/truetype_font.cpp
diff --git a/engines/zvision/truetype_font.h b/engines/zvision/fonts/truetype_font.h
index 497ac763c1..bed1d5513e 100644
--- a/engines/zvision/truetype_font.h
+++ b/engines/zvision/fonts/truetype_font.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -43,12 +43,12 @@ public:
~TruetypeFont();
private:
- ZVision *_engine;
+// ZVision *_engine;
Graphics::Font *_font;
int _lineHeight;
- size_t _maxCharWidth;
- size_t _maxCharHeight;
+// size_t _maxCharWidth;
+// size_t _maxCharHeight;
public:
int32 _fontHeight;
diff --git a/engines/zvision/render_manager.cpp b/engines/zvision/graphics/render_manager.cpp
index 071affffab..071affffab 100644
--- a/engines/zvision/render_manager.cpp
+++ b/engines/zvision/graphics/render_manager.cpp
diff --git a/engines/zvision/render_manager.h b/engines/zvision/graphics/render_manager.h
index 668c8acc41..668c8acc41 100644
--- a/engines/zvision/render_manager.h
+++ b/engines/zvision/graphics/render_manager.h
diff --git a/engines/zvision/render_table.cpp b/engines/zvision/graphics/render_table.cpp
index 210c4fc1fb..942420c700 100644
--- a/engines/zvision/render_table.cpp
+++ b/engines/zvision/graphics/render_table.cpp
@@ -1,28 +1,28 @@
/* ScummVM - Graphic Adventure Engine
-*
-* ScummVM is the legal property of its developers, whose names
-* are too numerous to list here. Please refer to the COPYRIGHT
-* file distributed with this source distribution.
-*
-* This program is free software; you can redistribute it and/or
-* modify it under the terms of the GNU General Public License
-* as published by the Free Software Foundation; either version 2
-* of the License, or (at your option) any later version.
-
-* This program is distributed in the hope that it will be useful,
-* but WITHOUT ANY WARRANTY; without even the implied warranty of
-* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-* GNU General Public License for more details.
-
-* You should have received a copy of the GNU General Public License
-* along with this program; if not, write to the Free Software
-* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
-*
-*/
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public 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 "zvision/render_table.h"
+#include "zvision/graphics/render_table.h"
#include "common/rect.h"
diff --git a/engines/zvision/render_table.h b/engines/zvision/graphics/render_table.h
index 86afd1fff9..0b4d6e3919 100644
--- a/engines/zvision/render_table.h
+++ b/engines/zvision/graphics/render_table.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/zvision/actions.cpp b/engines/zvision/scripting/actions.cpp
index f60a69744a..f60a69744a 100644
--- a/engines/zvision/actions.cpp
+++ b/engines/zvision/scripting/actions.cpp
diff --git a/engines/zvision/actions.h b/engines/zvision/scripting/actions.h
index 82532cef99..c60aedcdf3 100644
--- a/engines/zvision/actions.h
+++ b/engines/zvision/scripting/actions.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/zvision/control.cpp b/engines/zvision/scripting/control.cpp
index ef2e90f8ce..ae717d6f8d 100644
--- a/engines/zvision/control.cpp
+++ b/engines/zvision/scripting/control.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -22,11 +22,11 @@
#include "common/scummsys.h"
-#include "zvision/control.h"
+#include "zvision/scripting/control.h"
#include "zvision/zvision.h"
-#include "zvision/render_manager.h"
-#include "zvision/utility.h"
+#include "zvision/graphics/render_manager.h"
+#include "zvision/utility/utility.h"
#include "common/stream.h"
diff --git a/engines/zvision/control.h b/engines/zvision/scripting/control.h
index 93ad5f5df1..93ad5f5df1 100644
--- a/engines/zvision/control.h
+++ b/engines/zvision/scripting/control.h
diff --git a/engines/zvision/input_control.cpp b/engines/zvision/scripting/controls/input_control.cpp
index a366e06923..a366e06923 100644
--- a/engines/zvision/input_control.cpp
+++ b/engines/zvision/scripting/controls/input_control.cpp
diff --git a/engines/zvision/input_control.h b/engines/zvision/scripting/controls/input_control.h
index 0179bd9006..4a63f228a0 100644
--- a/engines/zvision/input_control.h
+++ b/engines/zvision/scripting/controls/input_control.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -23,8 +23,8 @@
#ifndef ZVISION_INPUT_CONTROL_H
#define ZVISION_INPUT_CONTROL_H
-#include "zvision/control.h"
-#include "zvision/string_manager.h"
+#include "zvision/scripting/control.h"
+#include "zvision/strings/string_manager.h"
#include "common/rect.h"
diff --git a/engines/zvision/lever_control.cpp b/engines/zvision/scripting/controls/lever_control.cpp
index f68f256229..f68f256229 100644
--- a/engines/zvision/lever_control.cpp
+++ b/engines/zvision/scripting/controls/lever_control.cpp
diff --git a/engines/zvision/lever_control.h b/engines/zvision/scripting/controls/lever_control.h
index ac7ee8b5c7..712d688523 100644
--- a/engines/zvision/lever_control.h
+++ b/engines/zvision/scripting/controls/lever_control.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -23,7 +23,7 @@
#ifndef ZVISION_LEVER_CONTROL_H
#define ZVISION_LEVER_CONTROL_H
-#include "zvision/control.h"
+#include "zvision/scripting/control.h"
#include "common/list.h"
#include "common/rect.h"
diff --git a/engines/zvision/push_toggle_control.cpp b/engines/zvision/scripting/controls/push_toggle_control.cpp
index 0ba6dd7d25..16cd971ad5 100644
--- a/engines/zvision/push_toggle_control.cpp
+++ b/engines/zvision/scripting/controls/push_toggle_control.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -22,12 +22,12 @@
#include "common/scummsys.h"
-#include "zvision/push_toggle_control.h"
+#include "zvision/scripting/controls/push_toggle_control.h"
#include "zvision/zvision.h"
-#include "zvision/script_manager.h"
-#include "zvision/cursor_manager.h"
-#include "zvision/utility.h"
+#include "zvision/scripting/script_manager.h"
+#include "zvision/cursors/cursor_manager.h"
+#include "zvision/utility/utility.h"
#include "common/stream.h"
diff --git a/engines/zvision/push_toggle_control.h b/engines/zvision/scripting/controls/push_toggle_control.h
index 17ff850e32..6ba1bd77fa 100644
--- a/engines/zvision/push_toggle_control.h
+++ b/engines/zvision/scripting/controls/push_toggle_control.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -23,7 +23,7 @@
#ifndef ZVISION_PUSH_TOGGLE_CONTROL_H
#define ZVISION_PUSH_TOGGLE_CONTROL_H
-#include "zvision/control.h"
+#include "zvision/scripting/control.h"
#include "common/rect.h"
#include "common/events.h"
diff --git a/engines/zvision/timer_node.cpp b/engines/zvision/scripting/controls/timer_node.cpp
index a94f6db19b..a94f6db19b 100644
--- a/engines/zvision/timer_node.cpp
+++ b/engines/zvision/scripting/controls/timer_node.cpp
diff --git a/engines/zvision/timer_node.h b/engines/zvision/scripting/controls/timer_node.h
index f6584becda..f6584becda 100644
--- a/engines/zvision/timer_node.h
+++ b/engines/zvision/scripting/controls/timer_node.h
diff --git a/engines/zvision/puzzle.h b/engines/zvision/scripting/puzzle.h
index 4d50756b87..4d50756b87 100644
--- a/engines/zvision/puzzle.h
+++ b/engines/zvision/scripting/puzzle.h
diff --git a/engines/zvision/scr_file_handling.cpp b/engines/zvision/scripting/scr_file_handling.cpp
index 9d1d0bf856..9d1d0bf856 100644
--- a/engines/zvision/scr_file_handling.cpp
+++ b/engines/zvision/scripting/scr_file_handling.cpp
diff --git a/engines/zvision/script_manager.cpp b/engines/zvision/scripting/script_manager.cpp
index 1a567397a8..1a567397a8 100644
--- a/engines/zvision/script_manager.cpp
+++ b/engines/zvision/scripting/script_manager.cpp
diff --git a/engines/zvision/script_manager.h b/engines/zvision/scripting/script_manager.h
index 6adade5745..6adade5745 100644
--- a/engines/zvision/script_manager.h
+++ b/engines/zvision/scripting/script_manager.h
diff --git a/engines/zvision/zork_raw.cpp b/engines/zvision/sound/zork_raw.cpp
index a4d091f3c0..a4d091f3c0 100644
--- a/engines/zvision/zork_raw.cpp
+++ b/engines/zvision/sound/zork_raw.cpp
diff --git a/engines/zvision/zork_raw.h b/engines/zvision/sound/zork_raw.h
index a5e346dfbb..a5e346dfbb 100644
--- a/engines/zvision/zork_raw.h
+++ b/engines/zvision/sound/zork_raw.h
diff --git a/engines/zvision/string_manager.cpp b/engines/zvision/strings/string_manager.cpp
index f8a48682ac..22331d8a24 100644
--- a/engines/zvision/string_manager.cpp
+++ b/engines/zvision/strings/string_manager.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -22,9 +22,9 @@
#include "common/scummsys.h"
-#include "zvision/string_manager.h"
+#include "zvision/strings/string_manager.h"
-#include "zvision/truetype_font.h"
+#include "zvision/fonts/truetype_font.h"
#include "common/file.h"
#include "common/tokenizer.h"
diff --git a/engines/zvision/string_manager.h b/engines/zvision/strings/string_manager.h
index 9cfed5261b..af8324b890 100644
--- a/engines/zvision/string_manager.h
+++ b/engines/zvision/strings/string_manager.h
@@ -8,24 +8,23 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public 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 ZVISION_STRING_MANAGER_H
#define ZVISION_STRING_MANAGER_H
#include "zvision/detection.h"
-#include "zvision/truetype_font.h"
+#include "zvision/fonts/truetype_font.h"
namespace Graphics {
diff --git a/engines/zvision/subtitles.h b/engines/zvision/subtitles/subtitles.h
index 698561b655..09e079bba4 100644
--- a/engines/zvision/subtitles.h
+++ b/engines/zvision/subtitles/subtitles.h
@@ -8,17 +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.
*
- *
*/
#ifndef ZVISION_SUBTITLES_H
diff --git a/engines/zvision/clock.cpp b/engines/zvision/utility/clock.cpp
index d78cf6e2c1..45ab23ab65 100644
--- a/engines/zvision/clock.cpp
+++ b/engines/zvision/utility/clock.cpp
@@ -8,22 +8,21 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public 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 "zvision/clock.h"
+#include "zvision/utility/clock.h"
#include "common/system.h"
diff --git a/engines/zvision/clock.h b/engines/zvision/utility/clock.h
index 3740e07881..9a50116a8c 100644
--- a/engines/zvision/clock.h
+++ b/engines/zvision/utility/clock.h
@@ -8,17 +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.
*
- *
*/
#ifndef ZVISION_CLOCK_H
diff --git a/engines/zvision/lzss_read_stream.cpp b/engines/zvision/utility/lzss_read_stream.cpp
index b36bf5f7c0..14613a6fb2 100644
--- a/engines/zvision/lzss_read_stream.cpp
+++ b/engines/zvision/utility/lzss_read_stream.cpp
@@ -1,28 +1,28 @@
/* ScummVM - Graphic Adventure Engine
-*
-* ScummVM is the legal property of its developers, whose names
-* are too numerous to list here. Please refer to the COPYRIGHT
-* file distributed with this source distribution.
-*
-* This program is free software; you can redistribute it and/or
-* modify it under the terms of the GNU General Public License
-* as published by the Free Software Foundation; either version 2
-* of the License, or (at your option) any later version.
-
-* This program is distributed in the hope that it will be useful,
-* but WITHOUT ANY WARRANTY; without even the implied warranty of
-* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-* GNU General Public License for more details.
-
-* You should have received a copy of the GNU General Public License
-* along with this program; if not, write to the Free Software
-* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
-*
-*/
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public 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 "zvision/lzss_read_stream.h"
+#include "zvision/utility/lzss_read_stream.h"
namespace ZVision {
diff --git a/engines/zvision/lzss_read_stream.h b/engines/zvision/utility/lzss_read_stream.h
index 73e848b9f6..b7ae5ac2cb 100644
--- a/engines/zvision/lzss_read_stream.h
+++ b/engines/zvision/utility/lzss_read_stream.h
@@ -1,24 +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.
-*
-*/
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public 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 ZVISION_LZSS_STREAM_H
#define ZVISION_LZSS_STREAM_H
diff --git a/engines/zvision/single_value_container.cpp b/engines/zvision/utility/single_value_container.cpp
index 837bd8d7fc..e609474285 100644
--- a/engines/zvision/single_value_container.cpp
+++ b/engines/zvision/utility/single_value_container.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -22,7 +22,7 @@
#include "common/scummsys.h"
-#include "zvision/single_value_container.h"
+#include "zvision/utility/single_value_container.h"
#include "common/textconsole.h"
#include "common/str.h"
diff --git a/engines/zvision/single_value_container.h b/engines/zvision/utility/single_value_container.h
index 32b4d6c6dc..ac6e99039a 100644
--- a/engines/zvision/single_value_container.h
+++ b/engines/zvision/utility/single_value_container.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/engines/zvision/utility.cpp b/engines/zvision/utility/utility.cpp
index 1d96b33021..537f525bd4 100644
--- a/engines/zvision/utility.cpp
+++ b/engines/zvision/utility/utility.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -22,10 +22,10 @@
#include "common/scummsys.h"
-#include "zvision/utility.h"
+#include "zvision/utility/utility.h"
#include "zvision/zvision.h"
-#include "zvision/zork_raw.h"
+#include "zvision/sound/zork_raw.h"
#include "common/tokenizer.h"
#include "common/file.h"
diff --git a/engines/zvision/utility.h b/engines/zvision/utility/utility.h
index 8da88cf28c..380034404a 100644
--- a/engines/zvision/utility.h
+++ b/engines/zvision/utility/utility.h
@@ -8,17 +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.
*
- *
*/
#ifndef ZVISION_UTILITY_H
diff --git a/engines/zvision/video.cpp b/engines/zvision/video/video.cpp
index 0ad9000fcb..0ad9000fcb 100644
--- a/engines/zvision/video.cpp
+++ b/engines/zvision/video/video.cpp
diff --git a/engines/zvision/zork_avi_decoder.cpp b/engines/zvision/video/zork_avi_decoder.cpp
index 0711cdf9d7..e7624342e8 100644
--- a/engines/zvision/zork_avi_decoder.cpp
+++ b/engines/zvision/video/zork_avi_decoder.cpp
@@ -8,24 +8,23 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public 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 "zvision/zork_avi_decoder.h"
+#include "zvision/video/zork_avi_decoder.h"
-#include "zvision/zork_raw.h"
+#include "zvision/sound/zork_raw.h"
#include "common/stream.h"
diff --git a/engines/zvision/zork_avi_decoder.h b/engines/zvision/video/zork_avi_decoder.h
index d8937ac057..d8937ac057 100644
--- a/engines/zvision/zork_avi_decoder.h
+++ b/engines/zvision/video/zork_avi_decoder.h
diff --git a/graphics/VectorRendererSpec.cpp b/graphics/VectorRendererSpec.cpp
index 491a9d7f42..a9594f7dd2 100644
--- a/graphics/VectorRendererSpec.cpp
+++ b/graphics/VectorRendererSpec.cpp
@@ -620,7 +620,10 @@ applyScreenShading(GUI::ThemeEngine::ShadingStyle shadingStyle) {
template<typename PixelType>
inline void VectorRendererSpec<PixelType>::
blendPixelPtr(PixelType *ptr, PixelType color, uint8 alpha) {
- if (sizeof(PixelType) == 4) {
+ if (alpha == 0xff) {
+ // fully opaque pixel, don't blend
+ *ptr = color | _alphaMask;
+ } else if (sizeof(PixelType) == 4) {
const byte sR = (color & _redMask) >> _format.rShift;
const byte sG = (color & _greenMask) >> _format.gShift;
const byte sB = (color & _blueMask) >> _format.bShift;
@@ -628,15 +631,17 @@ blendPixelPtr(PixelType *ptr, PixelType color, uint8 alpha) {
byte dR = (*ptr & _redMask) >> _format.rShift;
byte dG = (*ptr & _greenMask) >> _format.gShift;
byte dB = (*ptr & _blueMask) >> _format.bShift;
+ byte dA = (*ptr & _alphaMask) >> _format.aShift;
dR += ((sR - dR) * alpha) >> 8;
dG += ((sG - dG) * alpha) >> 8;
dB += ((sB - dB) * alpha) >> 8;
+ dA += ((0xff - dA) * alpha) >> 8;
*ptr = ((dR << _format.rShift) & _redMask)
| ((dG << _format.gShift) & _greenMask)
| ((dB << _format.bShift) & _blueMask)
- | (*ptr & _alphaMask);
+ | ((dA << _format.aShift) & _alphaMask);
} else if (sizeof(PixelType) == 2) {
int idst = *ptr;
int isrc = color;
@@ -651,7 +656,9 @@ blendPixelPtr(PixelType *ptr, PixelType color, uint8 alpha) {
(_blueMask & ((idst & _blueMask) +
((int)(((int)(isrc & _blueMask) -
(int)(idst & _blueMask)) * alpha) >> 8))) |
- (idst & _alphaMask));
+ (_alphaMask & ((idst & _alphaMask) +
+ ((int)(((int)(_alphaMask) -
+ (int)(idst & _alphaMask)) * alpha) >> 8))));
} else {
error("Unsupported BPP format: %u", (uint)sizeof(PixelType));
}
@@ -691,11 +698,10 @@ darkenFill(PixelType *ptr, PixelType *end) {
// assuming at least 3 alpha bits
mask |= 3 << _format.aShift;
- PixelType addA = (PixelType)(255 >> _format.aLoss) << _format.aShift;
- addA -= (addA >> 2);
+ PixelType addA = (PixelType)(3 << (_format.aShift + 6 - _format.aLoss));
while (ptr != end) {
- // Darken the colour, and increase the alpha
+ // Darken the color, and increase the alpha
// (0% -> 75%, 100% -> 100%)
*ptr = (PixelType)(((*ptr & ~mask) >> 2) + addA);
++ptr;
@@ -1266,51 +1272,50 @@ template<typename PixelType>
void VectorRendererSpec<PixelType>::
drawBevelSquareAlg(int x, int y, int w, int h, int bevel, PixelType top_color, PixelType bottom_color, bool fill) {
int pitch = _activeSurface->pitch / _activeSurface->format.bytesPerPixel;
+ int i, j;
+ PixelType *ptr_left;
- int height = h;
- PixelType *ptr_fill = (PixelType *)_activeSurface->getBasePtr(x, y);
-
+ // Fill Background
+ ptr_left = (PixelType *)_activeSurface->getBasePtr(x, y);
+ i = h;
if (fill) {
assert((_bgColor & ~_alphaMask) == 0); // only support black
- while (height--) {
- darkenFill(ptr_fill, ptr_fill + w);
- ptr_fill += pitch;
+ while (i--) {
+ darkenFill(ptr_left, ptr_left + w);
+ ptr_left += pitch;
}
}
- int i, j;
-
x = MAX(x - bevel, 0);
y = MAX(y - bevel, 0);
w = MIN(w + (bevel * 2), (int)_activeSurface->w);
h = MIN(h + (bevel * 2), (int)_activeSurface->h);
- PixelType *ptr_left = (PixelType *)_activeSurface->getBasePtr(x, y);
-
+ ptr_left = (PixelType *)_activeSurface->getBasePtr(x, y);
i = bevel;
while (i--) {
colorFill<PixelType>(ptr_left, ptr_left + w, top_color);
ptr_left += pitch;
}
- i = h - bevel;
ptr_left = (PixelType *)_activeSurface->getBasePtr(x, y + bevel);
+ i = h - bevel;
while (i--) {
colorFill<PixelType>(ptr_left, ptr_left + bevel, top_color);
ptr_left += pitch;
}
- i = bevel;
ptr_left = (PixelType *)_activeSurface->getBasePtr(x, y + h - bevel);
+ i = bevel;
while (i--) {
colorFill<PixelType>(ptr_left + i, ptr_left + w, bottom_color);
ptr_left += pitch;
}
+ ptr_left = (PixelType *)_activeSurface->getBasePtr(x + w - bevel, y);
i = h - bevel;
j = bevel - 1;
- ptr_left = (PixelType *)_activeSurface->getBasePtr(x + w - bevel, y);
while (i--) {
colorFill<PixelType>(ptr_left + j, ptr_left + bevel, bottom_color);
if (j > 0) j--;
diff --git a/graphics/colormasks.h b/graphics/colormasks.h
index 2a2523f4b3..eebfc13213 100644
--- a/graphics/colormasks.h
+++ b/graphics/colormasks.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/graphics/conversion.cpp b/graphics/conversion.cpp
index 2da8b6f0ce..27180b80ad 100644
--- a/graphics/conversion.cpp
+++ b/graphics/conversion.cpp
@@ -17,6 +17,7 @@
* You should have received a copy of the GNU General Public 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/conversion.h"
diff --git a/graphics/conversion.h b/graphics/conversion.h
index 28e64a94fb..33d57f7a4f 100644
--- a/graphics/conversion.h
+++ b/graphics/conversion.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/graphics/cursor.h b/graphics/cursor.h
index b04d9c04e2..354d981de6 100644
--- a/graphics/cursor.h
+++ b/graphics/cursor.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/graphics/cursorman.cpp b/graphics/cursorman.cpp
index 133ee5fd71..5fcd2a3602 100644
--- a/graphics/cursorman.cpp
+++ b/graphics/cursorman.cpp
@@ -17,6 +17,7 @@
* You should have received a copy of the GNU General Public 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/cursorman.h"
diff --git a/graphics/cursorman.h b/graphics/cursorman.h
index b4d8ad94ce..f4a0ebbd82 100644
--- a/graphics/cursorman.h
+++ b/graphics/cursorman.h
@@ -17,6 +17,7 @@
* You should have received a copy of the GNU General Public 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_CURSORMAN_H
diff --git a/graphics/font.cpp b/graphics/font.cpp
index a852274b06..1ed67fa169 100644
--- a/graphics/font.cpp
+++ b/graphics/font.cpp
@@ -17,6 +17,7 @@
* You should have received a copy of the GNU General Public 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/font.h"
@@ -26,93 +27,32 @@
namespace Graphics {
-int Font::getKerningOffset(byte left, byte right) const {
+int Font::getKerningOffset(uint32 left, uint32 right) const {
return 0;
}
-int Font::getStringWidth(const Common::String &str) const {
+namespace {
+
+template<class StringType>
+int getStringWidthImpl(const Font &font, const StringType &str) {
int space = 0;
- uint last = 0;
+ typename StringType::unsigned_type last = 0;
for (uint i = 0; i < str.size(); ++i) {
- const uint cur = str[i];
- space += getCharWidth(cur) + getKerningOffset(last, cur);
+ const typename StringType::unsigned_type cur = str[i];
+ space += font.getCharWidth(cur) + font.getKerningOffset(last, cur);
last = cur;
}
return space;
}
-void Font::drawString(Surface *dst, const Common::String &sOld, int x, int y, int w, uint32 color, TextAlign align, int deltax, bool useEllipsis) const {
+template<class StringType>
+void drawStringImpl(const Font &font, Surface *dst, const StringType &str, int x, int y, int w, uint32 color, TextAlign align, int deltax) {
assert(dst != 0);
- const int leftX = x, rightX = x + w;
- uint i;
- Common::String s = sOld;
- int width = getStringWidth(s);
- Common::String str;
-
- if (useEllipsis && width > w && s.hasSuffix("...")) {
- // String is too wide. Check whether it ends in an ellipsis
- // ("..."). If so, remove that and try again!
- s.deleteLastChar();
- s.deleteLastChar();
- s.deleteLastChar();
- width = getStringWidth(s);
- }
-
- if (useEllipsis && width > w) {
- // String is too wide. So we shorten it "intelligently" by
- // replacing parts of the string by an ellipsis. There are
- // three possibilities for this: replace the start, the end, or
- // the middle of the string. What is best really depends on the
- // context; but unless we want to make this configurable,
- // replacing the middle seems to be a good compromise.
-
- const int ellipsisWidth = getStringWidth("...");
- // SLOW algorithm to remove enough of the middle. But it is good enough
- // for now.
- const int halfWidth = (w - ellipsisWidth) / 2;
- int w2 = 0;
- uint last = 0;
-
- for (i = 0; i < s.size(); ++i) {
- const uint cur = s[i];
- int charWidth = getCharWidth(cur) + getKerningOffset(last, cur);
- if (w2 + charWidth > halfWidth)
- break;
- last = cur;
- w2 += charWidth;
- str += cur;
- }
-
- // At this point we know that the first 'i' chars are together 'w2'
- // pixels wide. We took the first i-1, and add "..." to them.
- str += "...";
- last = '.';
-
- // The original string is width wide. Of those we already skipped past
- // w2 pixels, which means (width - w2) remain.
- // The new str is (w2+ellipsisWidth) wide, so we can accommodate about
- // (w - (w2+ellipsisWidth)) more pixels.
- // Thus we skip ((width - w2) - (w - (w2+ellipsisWidth))) =
- // (width + ellipsisWidth - w)
- int skip = width + ellipsisWidth - w;
- for (; i < s.size() && skip > 0; ++i) {
- const uint cur = s[i];
- skip -= getCharWidth(cur) + getKerningOffset(last, cur);
- last = cur;
- }
-
- // Append the remaining chars, if any
- for (; i < s.size(); ++i) {
- str += s[i];
- }
-
- width = getStringWidth(str);
- } else {
- str = s;
- }
+ const int leftX = x, rightX = x + w;
+ int width = font.getStringWidth(str);
if (align == kTextAlignCenter)
x = x + (w - width)/2;
@@ -120,29 +60,29 @@ void Font::drawString(Surface *dst, const Common::String &sOld, int x, int y, in
x = x + w - width;
x += deltax;
- uint last = 0;
- for (i = 0; i < str.size(); ++i) {
- const uint cur = str[i];
- x += getKerningOffset(last, cur);
+ typename StringType::unsigned_type last = 0;
+ for (typename StringType::const_iterator i = str.begin(), end = str.end(); i != end; ++i) {
+ const typename StringType::unsigned_type cur = *i;
+ x += font.getKerningOffset(last, cur);
last = cur;
- w = getCharWidth(cur);
+ w = font.getCharWidth(cur);
if (x+w > rightX)
break;
if (x+w >= leftX)
- drawChar(dst, str[i], x, y, color);
+ font.drawChar(dst, cur, x, y, color);
x += w;
}
}
-
+template<class StringType>
struct WordWrapper {
- Common::Array<Common::String> &lines;
+ Common::Array<StringType> &lines;
int actualMaxLineWidth;
- WordWrapper(Common::Array<Common::String> &l) : lines(l), actualMaxLineWidth(0) {
+ WordWrapper(Common::Array<StringType> &l) : lines(l), actualMaxLineWidth(0) {
}
- void add(Common::String &line, int &w) {
+ void add(StringType &line, int &w) {
if (actualMaxLineWidth < w)
actualMaxLineWidth = w;
@@ -153,10 +93,11 @@ struct WordWrapper {
}
};
-int Font::wordWrapText(const Common::String &str, int maxWidth, Common::Array<Common::String> &lines) const {
- WordWrapper wrapper(lines);
- Common::String line;
- Common::String tmpStr;
+template<class StringType>
+int wordWrapTextImpl(const Font &font, const StringType &str, int maxWidth, Common::Array<StringType> &lines) {
+ WordWrapper<StringType> wrapper(lines);
+ StringType line;
+ StringType tmpStr;
int lineWidth = 0;
int tmpWidth = 0;
@@ -173,10 +114,10 @@ int Font::wordWrapText(const Common::String &str, int maxWidth, Common::Array<Co
// of a line. If we encounter such a word, we have to wrap it over multiple
// lines.
- uint last = 0;
- for (Common::String::const_iterator x = str.begin(); x != str.end(); ++x) {
- const byte c = *x;
- const int w = getCharWidth(c) + getKerningOffset(last, c);
+ typename StringType::unsigned_type last = 0;
+ for (typename StringType::const_iterator x = str.begin(); x != str.end(); ++x) {
+ const typename StringType::unsigned_type c = *x;
+ const int w = font.getCharWidth(c) + font.getKerningOffset(last, c);
last = c;
const bool wouldExceedWidth = (lineWidth + tmpWidth + w > maxWidth);
@@ -212,7 +153,7 @@ int Font::wordWrapText(const Common::String &str, int maxWidth, Common::Array<Co
tmpStr.deleteChar(0);
// This is not very fast, but it is the simplest way to
// assure we do not mess something up because of kerning.
- tmpWidth = getStringWidth(tmpStr);
+ tmpWidth = font.getStringWidth(tmpStr);
}
} else {
wrapper.add(tmpStr, tmpWidth);
@@ -232,5 +173,98 @@ int Font::wordWrapText(const Common::String &str, int maxWidth, Common::Array<Co
return wrapper.actualMaxLineWidth;
}
+} // End of anonymous namespace
+
+int Font::getStringWidth(const Common::String &str) const {
+ return getStringWidthImpl(*this, str);
+}
+
+int Font::getStringWidth(const Common::U32String &str) const {
+ return getStringWidthImpl(*this, str);
+}
+
+void Font::drawString(Surface *dst, const Common::String &sOld, int x, int y, int w, uint32 color, TextAlign align, int deltax, bool useEllipsis) const {
+ Common::String s = sOld;
+ int width = getStringWidth(s);
+ Common::String str;
+
+ if (useEllipsis && width > w && s.hasSuffix("...")) {
+ // String is too wide. Check whether it ends in an ellipsis
+ // ("..."). If so, remove that and try again!
+ s.deleteLastChar();
+ s.deleteLastChar();
+ s.deleteLastChar();
+ width = getStringWidth(s);
+ }
+
+ if (useEllipsis && width > w) {
+ // String is too wide. So we shorten it "intelligently" by
+ // replacing parts of the string by an ellipsis. There are
+ // three possibilities for this: replace the start, the end, or
+ // the middle of the string. What is best really depends on the
+ // context; but unless we want to make this configurable,
+ // replacing the middle seems to be a good compromise.
+
+ const int ellipsisWidth = getStringWidth("...");
+
+ // SLOW algorithm to remove enough of the middle. But it is good enough
+ // for now.
+ const int halfWidth = (w - ellipsisWidth) / 2;
+ int w2 = 0;
+ Common::String::unsigned_type last = 0;
+ uint i;
+
+ for (i = 0; i < s.size(); ++i) {
+ const Common::String::unsigned_type cur = s[i];
+ int charWidth = getCharWidth(cur) + getKerningOffset(last, cur);
+ if (w2 + charWidth > halfWidth)
+ break;
+ last = cur;
+ w2 += charWidth;
+ str += cur;
+ }
+
+ // At this point we know that the first 'i' chars are together 'w2'
+ // pixels wide. We took the first i-1, and add "..." to them.
+ str += "...";
+ last = '.';
+
+ // The original string is width wide. Of those we already skipped past
+ // w2 pixels, which means (width - w2) remain.
+ // The new str is (w2+ellipsisWidth) wide, so we can accommodate about
+ // (w - (w2+ellipsisWidth)) more pixels.
+ // Thus we skip ((width - w2) - (w - (w2+ellipsisWidth))) =
+ // (width + ellipsisWidth - w)
+ int skip = width + ellipsisWidth - w;
+ for (; i < s.size() && skip > 0; ++i) {
+ const Common::String::unsigned_type cur = s[i];
+ skip -= getCharWidth(cur) + getKerningOffset(last, cur);
+ last = cur;
+ }
+
+ // Append the remaining chars, if any
+ for (; i < s.size(); ++i) {
+ str += s[i];
+ }
+
+ width = getStringWidth(str);
+ } else {
+ str = s;
+ }
+
+ drawStringImpl(*this, dst, str, x, y, w, color, align, deltax);
+}
+
+void Font::drawString(Surface *dst, const Common::U32String &str, int x, int y, int w, uint32 color, TextAlign align) const {
+ drawStringImpl(*this, dst, str, x, y, w, color, align, 0);
+}
+
+int Font::wordWrapText(const Common::String &str, int maxWidth, Common::Array<Common::String> &lines) const {
+ return wordWrapTextImpl(*this, str, maxWidth, lines);
+}
+
+int Font::wordWrapText(const Common::U32String &str, int maxWidth, Common::Array<Common::U32String> &lines) const {
+ return wordWrapTextImpl(*this, str, maxWidth, lines);
+}
} // End of namespace Graphics
diff --git a/graphics/font.h b/graphics/font.h
index 6819b42f52..f333107780 100644
--- a/graphics/font.h
+++ b/graphics/font.h
@@ -17,12 +17,14 @@
* You should have received a copy of the GNU General Public 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_FONT_H
#define GRAPHICS_FONT_H
#include "common/str.h"
+#include "common/ustr.h"
namespace Common {
template<class T> class Array;
@@ -70,7 +72,7 @@ public:
* @param chr The character to query the width of.
* @return The character's width.
*/
- virtual int getCharWidth(byte chr) const = 0;
+ virtual int getCharWidth(uint32 chr) const = 0;
/**
* Query the kerning offset between two characters.
@@ -79,7 +81,7 @@ public:
* @param right The right character. May be 0.
* @return The horizontal displacement.
*/
- virtual int getKerningOffset(byte left, byte right) const;
+ virtual int getKerningOffset(uint32 left, uint32 right) const;
/**
* Draw a character at a specific point on a surface.
@@ -96,15 +98,17 @@ public:
* @param y The y coordinate where to draw the character.
* @param color The color of the character.
*/
- virtual void drawChar(Surface *dst, byte chr, int x, int y, uint32 color) const = 0;
+ virtual void drawChar(Surface *dst, uint32 chr, int x, int y, uint32 color) const = 0;
// TODO: Add doxygen comments to this
void drawString(Surface *dst, const Common::String &str, int x, int y, int w, uint32 color, TextAlign align = kTextAlignLeft, int deltax = 0, bool useEllipsis = true) const;
+ void drawString(Surface *dst, const Common::U32String &str, int x, int y, int w, uint32 color, TextAlign align = kTextAlignLeft) const;
/**
* Compute and return the width the string str has when rendered using this font.
*/
int getStringWidth(const Common::String &str) const;
+ int getStringWidth(const Common::U32String &str) const;
/**
* Take a text (which may contain newline characters) and word wrap it so that
@@ -120,6 +124,7 @@ public:
* @return the maximal width of any of the lines added to lines
*/
int wordWrapText(const Common::String &str, int maxWidth, Common::Array<Common::String> &lines) const;
+ int wordWrapText(const Common::U32String &str, int maxWidth, Common::Array<Common::U32String> &lines) const;
};
} // End of namespace Graphics
diff --git a/graphics/fontman.cpp b/graphics/fontman.cpp
index 99dd3d664f..5cf52416cf 100644
--- a/graphics/fontman.cpp
+++ b/graphics/fontman.cpp
@@ -17,6 +17,7 @@
* You should have received a copy of the GNU General Public 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"
diff --git a/graphics/fontman.h b/graphics/fontman.h
index b06ddea860..b3de92f547 100644
--- a/graphics/fontman.h
+++ b/graphics/fontman.h
@@ -17,6 +17,7 @@
* You should have received a copy of the GNU General Public 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_FONTMAN_H
diff --git a/graphics/fonts/bdf.cpp b/graphics/fonts/bdf.cpp
index e523a36ad5..3476838911 100644
--- a/graphics/fonts/bdf.cpp
+++ b/graphics/fonts/bdf.cpp
@@ -17,6 +17,7 @@
* You should have received a copy of the GNU General Public 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"
@@ -51,7 +52,7 @@ int BdfFont::getMaxCharWidth() const {
return _data.maxAdvance;
}
-int BdfFont::getCharWidth(byte chr) const {
+int BdfFont::getCharWidth(uint32 chr) const {
// In case all font have the same advance value, we use the maximum.
if (!_data.advances)
return _data.maxAdvance;
@@ -85,9 +86,9 @@ void drawCharIntern(byte *ptr, uint pitch, const byte *src, int h, int width, in
}
}
-int BdfFont::mapToIndex(byte ch) const {
+int BdfFont::mapToIndex(uint32 ch) const {
// Check whether the character is included
- if (_data.firstCharacter <= ch && ch <= _data.firstCharacter + _data.numCharacters) {
+ if (_data.firstCharacter <= (int)ch && (int)ch <= _data.firstCharacter + _data.numCharacters) {
if (_data.bitmaps[ch - _data.firstCharacter])
return ch - _data.firstCharacter;
}
@@ -95,7 +96,7 @@ int BdfFont::mapToIndex(byte ch) const {
return _data.defaultCharacter - _data.firstCharacter;
}
-void BdfFont::drawChar(Surface *dst, byte chr, const int tx, const int ty, const uint32 color) const {
+void BdfFont::drawChar(Surface *dst, uint32 chr, const int tx, const int ty, const uint32 color) const {
assert(dst != 0);
// TODO: Where is the relation between the max advance being smaller or
diff --git a/graphics/fonts/bdf.h b/graphics/fonts/bdf.h
index b0166a2095..b91834785f 100644
--- a/graphics/fonts/bdf.h
+++ b/graphics/fonts/bdf.h
@@ -17,6 +17,7 @@
* You should have received a copy of the GNU General Public 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
@@ -61,14 +62,14 @@ public:
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;
+ virtual int getCharWidth(uint32 chr) const;
+ virtual void drawChar(Surface *dst, uint32 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);
private:
- int mapToIndex(byte ch) const;
+ int mapToIndex(uint32 ch) const;
const BdfFontData _data;
const DisposeAfterUse::Flag _dispose;
diff --git a/graphics/fonts/ttf.cpp b/graphics/fonts/ttf.cpp
index b9e9610d77..09a00672e3 100644
--- a/graphics/fonts/ttf.cpp
+++ b/graphics/fonts/ttf.cpp
@@ -101,17 +101,17 @@ public:
TTFFont();
virtual ~TTFFont();
- bool load(Common::SeekableReadStream &stream, int size, uint dpi, bool monochrome, const uint32 *mapping);
+ bool load(Common::SeekableReadStream &stream, int size, uint dpi, TTFRenderMode renderMode, const uint32 *mapping);
virtual int getFontHeight() const;
virtual int getMaxCharWidth() const;
- virtual int getCharWidth(byte chr) const;
+ virtual int getCharWidth(uint32 chr) const;
- virtual int getKerningOffset(byte left, byte right) const;
+ virtual int getKerningOffset(uint32 left, uint32 right) const;
- virtual void drawChar(Surface *dst, byte chr, int x, int y, uint32 color) const;
+ virtual void drawChar(Surface *dst, uint32 chr, int x, int y, uint32 color) const;
private:
bool _initialized;
FT_Face _face;
@@ -126,21 +126,24 @@ private:
Surface image;
int xOffset, yOffset;
int advance;
+ FT_UInt slot;
};
- bool cacheGlyph(Glyph &glyph, FT_UInt &slot, uint chr);
- typedef Common::HashMap<byte, Glyph> GlyphCache;
- GlyphCache _glyphs;
+ bool cacheGlyph(Glyph &glyph, uint32 chr) const;
+ typedef Common::HashMap<uint32, Glyph> GlyphCache;
+ mutable GlyphCache _glyphs;
+ bool _allowLateCaching;
+ void assureCached(uint32 chr) const;
- FT_UInt _glyphSlots[256];
-
- bool _monochrome;
+ FT_Int32 _loadFlags;
+ FT_Render_Mode _renderMode;
bool _hasKerning;
};
TTFFont::TTFFont()
: _initialized(false), _face(), _ttfFile(0), _size(0), _width(0), _height(0), _ascent(0),
- _descent(0), _glyphs(), _glyphSlots(), _monochrome(false), _hasKerning(false) {
+ _descent(0), _glyphs(), _loadFlags(FT_LOAD_TARGET_NORMAL), _renderMode(FT_RENDER_MODE_NORMAL),
+ _hasKerning(false), _allowLateCaching(false) {
}
TTFFont::~TTFFont() {
@@ -157,7 +160,7 @@ TTFFont::~TTFFont() {
}
}
-bool TTFFont::load(Common::SeekableReadStream &stream, int size, uint dpi, bool monochrome, const uint32 *mapping) {
+bool TTFFont::load(Common::SeekableReadStream &stream, int size, uint dpi, TTFRenderMode renderMode, const uint32 *mapping) {
if (!g_ttf.isInitialized())
return false;
@@ -202,7 +205,22 @@ bool TTFFont::load(Common::SeekableReadStream &stream, int size, uint dpi, bool
return false;
}
- _monochrome = monochrome;
+ switch (renderMode) {
+ case kTTFRenderModeNormal:
+ _loadFlags = FT_LOAD_TARGET_NORMAL;
+ _renderMode = FT_RENDER_MODE_NORMAL;
+ break;
+
+ case kTTFRenderModeLight:
+ _loadFlags = FT_LOAD_TARGET_LIGHT;
+ _renderMode = FT_RENDER_MODE_LIGHT;
+ break;
+
+ case kTTFRenderModeMonochrome:
+ _loadFlags = FT_LOAD_TARGET_MONO;
+ _renderMode = FT_RENDER_MODE_MONO;
+ break;
+ }
FT_Fixed yScale = _face->size->metrics.y_scale;
_ascent = ftCeil26_6(FT_MulFix(_face->ascender, yScale));
@@ -212,19 +230,26 @@ bool TTFFont::load(Common::SeekableReadStream &stream, int size, uint dpi, bool
_height = _ascent - _descent + 1;
if (!mapping) {
+ // Allow loading of all unicode characters.
+ _allowLateCaching = true;
+
// Load all ISO-8859-1 characters.
for (uint i = 0; i < 256; ++i) {
- if (!cacheGlyph(_glyphs[i], _glyphSlots[i], i))
- _glyphSlots[i] = 0;
+ if (!cacheGlyph(_glyphs[i], i)) {
+ _glyphs.erase(i);
+ }
}
} else {
+ // We have a fixed map of characters do not load more later.
+ _allowLateCaching = false;
+
for (uint i = 0; i < 256; ++i) {
const uint32 unicode = mapping[i] & 0x7FFFFFFF;
const bool isRequired = (mapping[i] & 0x80000000) != 0;
// Check whether loading an important glyph fails and error out if
// that is the case.
- if (!cacheGlyph(_glyphs[i], _glyphSlots[i], unicode)) {
- _glyphSlots[i] = 0;
+ if (!cacheGlyph(_glyphs[i], unicode)) {
+ _glyphs.erase(i);
if (isRequired)
return false;
}
@@ -243,7 +268,8 @@ int TTFFont::getMaxCharWidth() const {
return _width;
}
-int TTFFont::getCharWidth(byte chr) const {
+int TTFFont::getCharWidth(uint32 chr) const {
+ assureCached(chr);
GlyphCache::const_iterator glyphEntry = _glyphs.find(chr);
if (glyphEntry == _glyphs.end())
return 0;
@@ -251,12 +277,29 @@ int TTFFont::getCharWidth(byte chr) const {
return glyphEntry->_value.advance;
}
-int TTFFont::getKerningOffset(byte left, byte right) const {
+int TTFFont::getKerningOffset(uint32 left, uint32 right) const {
if (!_hasKerning)
return 0;
- FT_UInt leftGlyph = _glyphSlots[left];
- FT_UInt rightGlyph = _glyphSlots[right];
+ assureCached(left);
+ assureCached(right);
+
+ FT_UInt leftGlyph, rightGlyph;
+ GlyphCache::const_iterator glyphEntry;
+
+ glyphEntry = _glyphs.find(left);
+ if (glyphEntry != _glyphs.end()) {
+ leftGlyph = glyphEntry->_value.slot;
+ } else {
+ return 0;
+ }
+
+ glyphEntry = _glyphs.find(right);
+ if (glyphEntry != _glyphs.end()) {
+ rightGlyph = glyphEntry->_value.slot;
+ } else {
+ return 0;
+ }
if (!leftGlyph || !rightGlyph)
return 0;
@@ -304,7 +347,8 @@ void renderGlyph(uint8 *dstPos, const int dstPitch, const uint8 *srcPos, const i
} // End of anonymous namespace
-void TTFFont::drawChar(Surface *dst, byte chr, int x, int y, uint32 color) const {
+void TTFFont::drawChar(Surface *dst, uint32 chr, int x, int y, uint32 color) const {
+ assureCached(chr);
GlyphCache::const_iterator glyphEntry = _glyphs.find(chr);
if (glyphEntry == _glyphs.end())
return;
@@ -376,18 +420,20 @@ void TTFFont::drawChar(Surface *dst, byte chr, int x, int y, uint32 color) const
}
}
-bool TTFFont::cacheGlyph(Glyph &glyph, FT_UInt &slot, uint chr) {
- slot = FT_Get_Char_Index(_face, chr);
+bool TTFFont::cacheGlyph(Glyph &glyph, uint32 chr) const {
+ FT_UInt slot = FT_Get_Char_Index(_face, chr);
if (!slot)
return false;
+ glyph.slot = slot;
+
// We use the light target and render mode to improve the looks of the
// glyphs. It is most noticable in FreeSansBold.ttf, where otherwise the
// 't' glyph looks like it is cut off on the right side.
- if (FT_Load_Glyph(_face, slot, (_monochrome ? FT_LOAD_TARGET_MONO : FT_LOAD_TARGET_LIGHT)))
+ if (FT_Load_Glyph(_face, slot, _loadFlags))
return false;
- if (FT_Render_Glyph(_face->glyph, (_monochrome ? FT_RENDER_MODE_MONO : FT_RENDER_MODE_LIGHT)))
+ if (FT_Render_Glyph(_face->glyph, _renderMode))
return false;
if (_face->glyph->format != FT_GLYPH_FORMAT_BITMAP)
@@ -456,16 +502,28 @@ bool TTFFont::cacheGlyph(Glyph &glyph, FT_UInt &slot, uint chr) {
default:
warning("TTFFont::cacheGlyph: Unsupported pixel mode %d", bitmap.pixel_mode);
+ glyph.image.free();
return false;
}
return true;
}
-Font *loadTTFFont(Common::SeekableReadStream &stream, int size, uint dpi, bool monochrome, const uint32 *mapping) {
+void TTFFont::assureCached(uint32 chr) const {
+ if (!chr || !_allowLateCaching || _glyphs.contains(chr)) {
+ return;
+ }
+
+ Glyph newGlyph;
+ if (cacheGlyph(newGlyph, chr)) {
+ _glyphs[chr] = newGlyph;
+ }
+}
+
+Font *loadTTFFont(Common::SeekableReadStream &stream, int size, uint dpi, TTFRenderMode renderMode, const uint32 *mapping) {
TTFFont *font = new TTFFont();
- if (!font->load(stream, size, dpi, monochrome, mapping)) {
+ if (!font->load(stream, size, dpi, renderMode, mapping)) {
delete font;
return 0;
}
diff --git a/graphics/fonts/ttf.h b/graphics/fonts/ttf.h
index e1464b1f45..bd25b69f21 100644
--- a/graphics/fonts/ttf.h
+++ b/graphics/fonts/ttf.h
@@ -32,7 +32,46 @@
namespace Graphics {
class Font;
-Font *loadTTFFont(Common::SeekableReadStream &stream, int size, uint dpi = 0, bool monochrome = false, const uint32 *mapping = 0);
+
+/**
+ * This specifies the mode in which TTF glyphs are rendered. This, for example,
+ * allows to render glyphs fully monochrome, i.e. without any anti-aliasing.
+ */
+enum TTFRenderMode {
+ /**
+ * Standard render mode. Equivalent of FreeType2's FT_RENDER_MODE_NORMAL.
+ */
+ kTTFRenderModeNormal,
+
+ /**
+ * Use lighter hinting. Equivalent of FreeType2's FT_RENDER_MODE_LIGHT.
+ */
+ kTTFRenderModeLight,
+
+ /**
+ * Render fully monochrome. This makes glyph pixels either be fully opaque
+ * or fully transparent.
+ */
+ kTTFRenderModeMonochrome
+};
+
+/**
+ * Loads a TTF font file from a given data stream object.
+ *
+ * @param stream Stream object to load font data from.
+ * @param size The point size to load.
+ * @param dpi The dpi to use for size calculations, by default 72dpi
+ * are used.
+ * @param renderMode FreeType2 mode used to render glyphs. @see TTFRenderMode
+ * @param mapping A mapping from code points 0-255 into UTF-32 code points.
+ * This can be used to support various 8bit character sets.
+ * In case the msb of the UTF-32 code point is set the font
+ * loading fails in case no glyph for it is found. When this
+ * is non-null only characters given in the mapping are
+ * supported.
+ * @return 0 in case loading fails, otherwise a pointer to the Font object.
+ */
+Font *loadTTFFont(Common::SeekableReadStream &stream, int size, uint dpi = 0, TTFRenderMode renderMode = kTTFRenderModeLight, const uint32 *mapping = 0);
void shutdownTTF();
diff --git a/graphics/fonts/winfont.cpp b/graphics/fonts/winfont.cpp
index 3bad92236d..141fc243e1 100644
--- a/graphics/fonts/winfont.cpp
+++ b/graphics/fonts/winfont.cpp
@@ -17,6 +17,7 @@
* You should have received a copy of the GNU General Public 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/file.h"
@@ -200,7 +201,7 @@ char WinFont::indexToCharacter(uint16 index) const {
return index + _firstChar;
}
-uint16 WinFont::characterToIndex(byte character) const {
+uint16 WinFont::characterToIndex(uint32 character) const {
// Go to the default character if we didn't find a mapping
if (character < _firstChar || character > _lastChar)
character = _defaultChar;
@@ -208,7 +209,7 @@ uint16 WinFont::characterToIndex(byte character) const {
return character - _firstChar;
}
-int WinFont::getCharWidth(byte chr) const {
+int WinFont::getCharWidth(uint32 chr) const {
return _glyphs[characterToIndex(chr)].charWidth;
}
@@ -324,7 +325,7 @@ bool WinFont::loadFromFNT(Common::SeekableReadStream &stream) {
return true;
}
-void WinFont::drawChar(Surface *dst, byte chr, int x, int y, uint32 color) const {
+void WinFont::drawChar(Surface *dst, uint32 chr, int x, int y, uint32 color) const {
assert(dst);
assert(dst->format.bytesPerPixel == 1 || dst->format.bytesPerPixel == 2 || dst->format.bytesPerPixel == 4);
assert(_glyphs);
diff --git a/graphics/fonts/winfont.h b/graphics/fonts/winfont.h
index 4382d7ed6b..3354fc2381 100644
--- a/graphics/fonts/winfont.h
+++ b/graphics/fonts/winfont.h
@@ -17,6 +17,7 @@
* You should have received a copy of the GNU General Public 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_WINFONT_H
@@ -62,8 +63,8 @@ public:
// Font API
int getFontHeight() const { return _pixHeight; }
int getMaxCharWidth() const { return _maxWidth; }
- int getCharWidth(byte chr) const;
- void drawChar(Surface *dst, byte chr, int x, int y, uint32 color) const;
+ int getCharWidth(uint32 chr) const;
+ void drawChar(Surface *dst, uint32 chr, int x, int y, uint32 color) const;
private:
bool loadFromPE(const Common::String &fileName, const WinFontDirEntry &dirEntry);
@@ -72,7 +73,7 @@ private:
uint32 getFontIndex(Common::SeekableReadStream &stream, const WinFontDirEntry &dirEntry);
bool loadFromFNT(Common::SeekableReadStream &stream);
char indexToCharacter(uint16 index) const;
- uint16 characterToIndex(byte character) const;
+ uint16 characterToIndex(uint32 character) const;
uint16 _pixHeight;
uint16 _maxWidth;
diff --git a/graphics/maccursor.cpp b/graphics/maccursor.cpp
index 8ad6c95961..a66a9104f3 100644
--- a/graphics/maccursor.cpp
+++ b/graphics/maccursor.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/graphics/maccursor.h b/graphics/maccursor.h
index f5efc20655..1ae38f8aa9 100644
--- a/graphics/maccursor.h
+++ b/graphics/maccursor.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/graphics/module.mk b/graphics/module.mk
index 8b63435905..5918775240 100644
--- a/graphics/module.mk
+++ b/graphics/module.mk
@@ -21,14 +21,7 @@ MODULE_OBJS := \
VectorRenderer.o \
VectorRendererSpec.o \
wincursor.o \
- yuv_to_rgb.o \
- decoders/bmp.o \
- decoders/iff.o \
- decoders/jpeg.o \
- decoders/pcx.o \
- decoders/pict.o \
- decoders/png.o \
- decoders/tga.o
+ yuv_to_rgb.o
ifdef USE_SCALERS
MODULE_OBJS += \
diff --git a/graphics/palette.h b/graphics/palette.h
index 77891c3fdc..2884bef7f4 100644
--- a/graphics/palette.h
+++ b/graphics/palette.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/graphics/pixelformat.h b/graphics/pixelformat.h
index ca4ef11c17..792833a8e3 100644
--- a/graphics/pixelformat.h
+++ b/graphics/pixelformat.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/graphics/primitives.cpp b/graphics/primitives.cpp
index c140dc8644..564bdb9673 100644
--- a/graphics/primitives.cpp
+++ b/graphics/primitives.cpp
@@ -17,6 +17,7 @@
* You should have received a copy of the GNU General Public 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/util.h"
diff --git a/graphics/primitives.h b/graphics/primitives.h
index f4a92683ab..a3e8ab1565 100644
--- a/graphics/primitives.h
+++ b/graphics/primitives.h
@@ -17,6 +17,7 @@
* You should have received a copy of the GNU General Public 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_PRIMITIVES_H
diff --git a/graphics/scaler.cpp b/graphics/scaler.cpp
index 3325fd4db2..745988cbd9 100644
--- a/graphics/scaler.cpp
+++ b/graphics/scaler.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/graphics/scaler.h b/graphics/scaler.h
index 1e5b796631..cf9a98a240 100644
--- a/graphics/scaler.h
+++ b/graphics/scaler.h
@@ -17,6 +17,7 @@
* You should have received a copy of the GNU General Public 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_SCALER_H
diff --git a/graphics/scaler/2xsai.cpp b/graphics/scaler/2xsai.cpp
index 2afdd9385d..757c1cf8de 100644
--- a/graphics/scaler/2xsai.cpp
+++ b/graphics/scaler/2xsai.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/graphics/scaler/Normal2xARM.s b/graphics/scaler/Normal2xARM.s
index e3592295e0..c5684c30e6 100644
--- a/graphics/scaler/Normal2xARM.s
+++ b/graphics/scaler/Normal2xARM.s
@@ -28,6 +28,7 @@
@ Assumes dst is aligned (so did the C)
@ Assumes 16bit (so did the C)
+ .align 2
Normal2xARM:
@ r0 = src
@ r1 = srcPitch
@@ -92,6 +93,7 @@ thin:
@ Assumes dst is aligned (so did the C)
@ Assumes 16bit (so did the C)
+ .align 2
Normal2xAspectMask:
@ r0 = src
@ r1 = srcPitch
diff --git a/graphics/scaler/aspect.cpp b/graphics/scaler/aspect.cpp
index 92d6c5777e..b923442163 100644
--- a/graphics/scaler/aspect.cpp
+++ b/graphics/scaler/aspect.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/graphics/scaler/aspect.h b/graphics/scaler/aspect.h
index bb354c79ac..30e13c93cd 100644
--- a/graphics/scaler/aspect.h
+++ b/graphics/scaler/aspect.h
@@ -17,6 +17,7 @@
* You should have received a copy of the GNU General Public 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_SCALER_ASPECT_H
diff --git a/graphics/scaler/downscaler.cpp b/graphics/scaler/downscaler.cpp
index 65400ccd46..3f4f81a228 100644
--- a/graphics/scaler/downscaler.cpp
+++ b/graphics/scaler/downscaler.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/graphics/scaler/downscaler.h b/graphics/scaler/downscaler.h
index 97e55dc3d5..ca1137e78b 100644
--- a/graphics/scaler/downscaler.h
+++ b/graphics/scaler/downscaler.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/graphics/scaler/downscalerARM.s b/graphics/scaler/downscalerARM.s
index e4662522aa..4c09381457 100644
--- a/graphics/scaler/downscalerARM.s
+++ b/graphics/scaler/downscalerARM.s
@@ -29,6 +29,7 @@
@ dstPtr. srcPitch and dstPitch identify how to reach subsequent
@ lines. redblueMask and round allow for one routine to do both
@ 565 and 555 formats.
+ .align 2
DownscaleAllByHalfARM:
@ r0 = srcPtr
@ r1 = srcPitch
diff --git a/graphics/scaler/hq2x.cpp b/graphics/scaler/hq2x.cpp
index 246e8f62d7..74ceebd611 100644
--- a/graphics/scaler/hq2x.cpp
+++ b/graphics/scaler/hq2x.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/graphics/scaler/hq3x.cpp b/graphics/scaler/hq3x.cpp
index 7f7867d5a6..f6c86b3017 100644
--- a/graphics/scaler/hq3x.cpp
+++ b/graphics/scaler/hq3x.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/graphics/scaler/intern.h b/graphics/scaler/intern.h
index 255cc1a511..0f3f874675 100644
--- a/graphics/scaler/intern.h
+++ b/graphics/scaler/intern.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/graphics/scaler/scale2xARM.s b/graphics/scaler/scale2xARM.s
index 563a22eeb1..a56e78447f 100644
--- a/graphics/scaler/scale2xARM.s
+++ b/graphics/scaler/scale2xARM.s
@@ -37,6 +37,7 @@
@ We hold: r10 B
@ r8 r14 r7 D E F
@ r12 H
+ .align 2
scale2x_8_arm:
STMFD r13!,{r4-r5,r7-r8,r10-r11,r14}
LDR r4, [r13,#4*7]
@@ -85,6 +86,7 @@ end8:
LDMFD r13!,{r4-r5,r7-r8,r10-r11,PC}
+ .align 2
scale2x_16_arm:
STMFD r13!,{r4-r5,r7-r8,r10-r11,r14}
LDR r4, [r13,#4*7]
@@ -133,6 +135,7 @@ end16:
LDMFD r13!,{r4-r5,r7-r8,r10-r11,PC}
+ .align 2
scale2x_32_arm:
STMFD r13!,{r4-r5,r7-r8,r10-r11,r14}
LDR r4, [r13,#4*7]
diff --git a/graphics/scaler/thumbnail_intern.cpp b/graphics/scaler/thumbnail_intern.cpp
index c30fc3b6fd..65e327f9c2 100644
--- a/graphics/scaler/thumbnail_intern.cpp
+++ b/graphics/scaler/thumbnail_intern.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/graphics/sjis.cpp b/graphics/sjis.cpp
index 33f0e562cb..45cf1cee90 100644
--- a/graphics/sjis.cpp
+++ b/graphics/sjis.cpp
@@ -17,6 +17,7 @@
* You should have received a copy of the GNU General Public 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"
@@ -40,31 +41,25 @@ FontSJIS *FontSJIS::createFont(const Common::Platform platform) {
// Try the font ROM of the specified platform
if (platform == Common::kPlatformFMTowns) {
ret = new FontTowns();
- if (ret) {
- if (ret->loadData())
- return ret;
- }
+ if (ret->loadData())
+ return ret;
delete ret;
} else if (platform == Common::kPlatformPCEngine) {
ret = new FontPCEngine();
- if (ret) {
- if (ret->loadData())
- return 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;
- }
+ if (ret->loadData())
+ return ret;
delete ret;
}*/
// Try ScummVM's font.
ret = new FontSjisSVM(platform);
- if (ret && ret->loadData())
+ if (ret->loadData())
return ret;
delete ret;
diff --git a/graphics/sjis.h b/graphics/sjis.h
index 928332f712..4c5b2797c5 100644
--- a/graphics/sjis.h
+++ b/graphics/sjis.h
@@ -17,6 +17,7 @@
* You should have received a copy of the GNU General Public 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 code in this file is currently only used in KYRA and SCI.
diff --git a/graphics/surface.cpp b/graphics/surface.cpp
index 777c1058fb..67ed942b0b 100644
--- a/graphics/surface.cpp
+++ b/graphics/surface.cpp
@@ -17,6 +17,7 @@
* You should have received a copy of the GNU General Public 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/algorithm.h"
diff --git a/graphics/surface.h b/graphics/surface.h
index 07e289b0bb..d083449854 100644
--- a/graphics/surface.h
+++ b/graphics/surface.h
@@ -17,6 +17,7 @@
* You should have received a copy of the GNU General Public 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_SURFACE_H
@@ -334,7 +335,9 @@ public:
*/
struct SharedPtrSurfaceDeleter {
void operator()(Surface *ptr) {
- ptr->free();
+ if (ptr) {
+ ptr->free();
+ }
delete ptr;
}
};
diff --git a/graphics/thumbnail.cpp b/graphics/thumbnail.cpp
index e3f368dffa..802ad09cbb 100644
--- a/graphics/thumbnail.cpp
+++ b/graphics/thumbnail.cpp
@@ -17,6 +17,7 @@
* You should have received a copy of the GNU General Public 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/thumbnail.h"
diff --git a/graphics/thumbnail.h b/graphics/thumbnail.h
index c857809c91..cec3d02800 100644
--- a/graphics/thumbnail.h
+++ b/graphics/thumbnail.h
@@ -17,6 +17,7 @@
* You should have received a copy of the GNU General Public 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_THUMBNAIL_H
diff --git a/graphics/wincursor.cpp b/graphics/wincursor.cpp
index 1d599f7130..1d96114673 100644
--- a/graphics/wincursor.cpp
+++ b/graphics/wincursor.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/graphics/wincursor.h b/graphics/wincursor.h
index 9e73e3a12f..2780b23a90 100644
--- a/graphics/wincursor.h
+++ b/graphics/wincursor.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/gui/Actions.cpp b/gui/Actions.cpp
index 0c80844ff9..b25f75e4af 100644
--- a/gui/Actions.cpp
+++ b/gui/Actions.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/gui/Actions.h b/gui/Actions.h
index 039fb9019c..ac7bd39093 100644
--- a/gui/Actions.h
+++ b/gui/Actions.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/gui/EventRecorder.cpp b/gui/EventRecorder.cpp
index 71f66911e9..ab284aaa6e 100644
--- a/gui/EventRecorder.cpp
+++ b/gui/EventRecorder.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/gui/EventRecorder.h b/gui/EventRecorder.h
index b2a549ece8..5f016b0c33 100644
--- a/gui/EventRecorder.h
+++ b/gui/EventRecorder.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/gui/Key.cpp b/gui/Key.cpp
index fa29971e12..cec48ffb65 100644
--- a/gui/Key.cpp
+++ b/gui/Key.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/gui/Key.h b/gui/Key.h
index f8f8983c97..8bbbc4fdaa 100644
--- a/gui/Key.h
+++ b/gui/Key.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/gui/KeysDialog.cpp b/gui/KeysDialog.cpp
index f28b039763..7adb20a379 100644
--- a/gui/KeysDialog.cpp
+++ b/gui/KeysDialog.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/gui/KeysDialog.h b/gui/KeysDialog.h
index 2dd6076a02..e0cf025583 100644
--- a/gui/KeysDialog.h
+++ b/gui/KeysDialog.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/gui/ThemeEngine.cpp b/gui/ThemeEngine.cpp
index 688654d208..ed01204180 100644
--- a/gui/ThemeEngine.cpp
+++ b/gui/ThemeEngine.cpp
@@ -34,7 +34,8 @@
#include "graphics/VectorRenderer.h"
#include "graphics/fonts/bdf.h"
#include "graphics/fonts/ttf.h"
-#include "graphics/decoders/bmp.h"
+
+#include "image/bmp.h"
#include "gui/widget.h"
#include "gui/ThemeEngine.h"
@@ -638,7 +639,7 @@ bool ThemeEngine::addBitmap(const Common::String &filename) {
return true;
// If not, try to load the bitmap via the BitmapDecoder class.
- Graphics::BitmapDecoder bitmapDecoder;
+ Image::BitmapDecoder bitmapDecoder;
const Graphics::Surface *srcSurface = 0;
Common::ArchiveMemberList members;
_themeFiles.listMatchingMembers(members, filename);
@@ -1360,17 +1361,17 @@ bool ThemeEngine::createCursor(const Common::String &filename, int hotspotX, int
// If there is no entry yet for this color in the palette: Add one
if (!colorToIndex.contains(col)) {
+ if (colorsFound >= MAX_CURS_COLORS) {
+ warning("Cursor contains too many colors (%d, but only %d are allowed)", colorsFound, MAX_CURS_COLORS);
+ return false;
+ }
+
const int index = colorsFound++;
colorToIndex[col] = index;
_cursorPal[index * 3 + 0] = r;
_cursorPal[index * 3 + 1] = g;
_cursorPal[index * 3 + 2] = b;
-
- if (colorsFound > MAX_CURS_COLORS) {
- warning("Cursor contains too many colors (%d, but only %d are allowed)", colorsFound, MAX_CURS_COLORS);
- return false;
- }
}
// Copy pixel from the 16 bit source surface to the 8bit target surface
@@ -1445,7 +1446,7 @@ const Graphics::Font *ThemeEngine::loadScalableFont(const Common::String &filena
for (Common::ArchiveMemberList::const_iterator i = members.begin(), end = members.end(); i != end; ++i) {
Common::SeekableReadStream *stream = (*i)->createReadStream();
if (stream) {
- font = Graphics::loadTTFFont(*stream, pointsize, 0, false,
+ font = Graphics::loadTTFFont(*stream, pointsize, 0, Graphics::kTTFRenderModeLight,
#ifdef USE_TRANSLATION
TransMan.getCharsetMapping()
#else
diff --git a/gui/Tooltip.cpp b/gui/Tooltip.cpp
index 88124e782b..e5f06bcafe 100644
--- a/gui/Tooltip.cpp
+++ b/gui/Tooltip.cpp
@@ -17,6 +17,7 @@
* You should have received a copy of the GNU General Public 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/util.h"
diff --git a/gui/Tooltip.h b/gui/Tooltip.h
index 9ab536b349..f83fc40966 100644
--- a/gui/Tooltip.h
+++ b/gui/Tooltip.h
@@ -17,6 +17,7 @@
* You should have received a copy of the GNU General Public 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 GUI_TOOLTIP_H
diff --git a/gui/about.cpp b/gui/about.cpp
index 3bb1934e28..fe726df750 100644
--- a/gui/about.cpp
+++ b/gui/about.cpp
@@ -17,6 +17,7 @@
* You should have received a copy of the GNU General Public 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/metaengine.h"
@@ -56,7 +57,7 @@ enum {
static const char *copyright_text[] = {
"",
-"C0""Copyright (C) 2001-2013 The ScummVM project",
+"C0""Copyright (C) 2001-2014 The ScummVM Team",
"C0""http://www.scummvm.org",
"",
"C0""ScummVM is the legal property of its developers, whose names are too numerous to list here. Please refer to the COPYRIGHT file distributed with this binary.",
diff --git a/gui/about.h b/gui/about.h
index 65062ab79d..9eeb3071f3 100644
--- a/gui/about.h
+++ b/gui/about.h
@@ -17,6 +17,7 @@
* You should have received a copy of the GNU General Public 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 ABOUT_DIALOG_H
diff --git a/gui/browser.cpp b/gui/browser.cpp
index 84f2d0f747..83e240a5bc 100644
--- a/gui/browser.cpp
+++ b/gui/browser.cpp
@@ -17,6 +17,7 @@
* You should have received a copy of the GNU General Public 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 "gui/browser.h"
diff --git a/gui/browser.h b/gui/browser.h
index b82fe516f9..b77907bad2 100644
--- a/gui/browser.h
+++ b/gui/browser.h
@@ -17,6 +17,7 @@
* You should have received a copy of the GNU General Public 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 BROWSER_DIALOG_H
diff --git a/gui/chooser.cpp b/gui/chooser.cpp
index c195e94c9b..61af3de407 100644
--- a/gui/chooser.cpp
+++ b/gui/chooser.cpp
@@ -17,6 +17,7 @@
* You should have received a copy of the GNU General Public 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"
diff --git a/gui/chooser.h b/gui/chooser.h
index d7e795b344..47b34b7233 100644
--- a/gui/chooser.h
+++ b/gui/chooser.h
@@ -17,6 +17,7 @@
* You should have received a copy of the GNU General Public 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 CHOOSER_DIALOG_H
diff --git a/gui/console.cpp b/gui/console.cpp
index 49e2fccd98..4cdad41f5f 100644
--- a/gui/console.cpp
+++ b/gui/console.cpp
@@ -17,6 +17,7 @@
* You should have received a copy of the GNU General Public 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 "gui/console.h"
@@ -82,8 +83,6 @@ ConsoleDialog::ConsoleDialog(float widthPercent, float heightPercent)
_historyIndex = 0;
_historyLine = 0;
_historySize = 0;
- for (int i = 0; i < kHistorySize; i++)
- _history[i][0] = '\0';
// Display greetings & prompt
print(gScummVMFullVersion);
@@ -274,24 +273,19 @@ void ConsoleDialog::handleKeyDown(Common::KeyState state) {
if (len > 0) {
- // We have to allocate the string buffer with new, since VC++ sadly does not
- // comply to the C++ standard, so we can't use a dynamic sized stack array.
- char *str = new char[len + 1];
+ Common::String str;
// Copy the user input to str
for (i = 0; i < len; i++)
- str[i] = buffer(_promptStartPos + i);
- str[len] = '\0';
+ str.insertChar(buffer(_promptStartPos + i), i);
// Add the input to the history
addToHistory(str);
// Pass it to the input callback, if any
if (_callbackProc)
- keepRunning = (*_callbackProc)(this, str, _callbackRefCon);
+ keepRunning = (*_callbackProc)(this, str.c_str(), _callbackRefCon);
- // Get rid of the string buffer
- delete[] str;
}
print(PROMPT);
@@ -575,8 +569,8 @@ void ConsoleDialog::killLastWord() {
}
}
-void ConsoleDialog::addToHistory(const char *str) {
- strcpy(_history[_historyIndex], str);
+void ConsoleDialog::addToHistory(const Common::String &str) {
+ _history[_historyIndex] = str;
_historyIndex = (_historyIndex + 1) % kHistorySize;
_historyLine = 0;
if (_historySize < kHistorySize)
@@ -590,8 +584,7 @@ void ConsoleDialog::historyScroll(int direction) {
if (_historyLine == 0 && direction > 0) {
int i;
for (i = 0; i < _promptEndPos - _promptStartPos; i++)
- _history[_historyIndex][i] = buffer(_promptStartPos + i);
- _history[_historyIndex][i] = '\0';
+ _history[_historyIndex].insertChar(buffer(_promptStartPos + i), i);
}
// Advance to the next line in the history
@@ -617,7 +610,8 @@ void ConsoleDialog::historyScroll(int direction) {
idx = (_historyIndex - _historyLine + _historySize) % _historySize;
else
idx = _historyIndex;
- for (int i = 0; i < kLineBufferSize && _history[idx][i] != '\0'; i++)
+ int length = _history[idx].size();
+ for (int i = 0; i < length; i++)
printCharIntern(_history[idx][i]);
_promptEndPos = _currentPos;
diff --git a/gui/console.h b/gui/console.h
index 50a00a1ad1..430d5b9434 100644
--- a/gui/console.h
+++ b/gui/console.h
@@ -17,12 +17,14 @@
* You should have received a copy of the GNU General Public 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 CONSOLE_DIALOG_H
#define CONSOLE_DIALOG_H
#include "gui/dialog.h"
+#include "common/str.h"
namespace GUI {
@@ -69,7 +71,6 @@ protected:
enum {
kBufferSize = 32768,
kCharsPerLine = 128,
- kLineBufferSize = 256,
kHistorySize = 20
};
@@ -112,7 +113,7 @@ protected:
CompletionCallbackProc _completionCallbackProc;
void *_completionCallbackRefCon;
- char _history[kHistorySize][kLineBufferSize];
+ Common::String _history[kHistorySize];
int _historySize;
int _historyIndex;
int _historyLine;
@@ -184,7 +185,7 @@ protected:
void killLastWord();
// History
- void addToHistory(const char *str);
+ void addToHistory(const Common::String &str);
void historyScroll(int direction);
};
diff --git a/gui/credits.h b/gui/credits.h
index aca3745631..d5c12515d3 100644
--- a/gui/credits.h
+++ b/gui/credits.h
@@ -77,7 +77,7 @@ static const char *credits[] = {
"C0""Ludvig Strigeus",
"C2""(retired)",
"",
-"C1""AVALANCHE",
+"C1""Avalanche",
"A0""Peter Bozso",
"C0""Peter Bozs\363",
"A0""Arnaud Boutonne",
@@ -168,6 +168,12 @@ static const char *credits[] = {
"C0""Benjamin Haisch",
"C0""Filippos Karapetis",
"",
+"C1""MADS",
+"A0""Arnaud Boutonne",
+"C0""Arnaud Boutonn\351",
+"C0""Paul Gilbert",
+"C0""Filippos Karapetis",
+"",
"C1""Mohawk",
"C0""Bastien Bouclet",
"C0""Matthew Hoops",
@@ -299,6 +305,11 @@ static const char *credits[] = {
"C0""Gregory Montoir",
"C2""(retired)",
"",
+"C1""Voyeur",
+"A0""Arnaud Boutonne",
+"C0""Arnaud Boutonn\351",
+"C0""Paul Gilbert",
+"",
"C1""Wintermute",
"A0""Einar Johan T. Somaaen",
"C0""Einar Johan T. S\370m\345en",
@@ -522,7 +533,7 @@ static const char *credits[] = {
"C0""Johannes Schickel",
"",
"",
-"C1""Translations",
+"C1""GUI Translations",
"C0""Thierry Crozat",
"C2""Translation Lead",
"C1""Basque",
@@ -592,6 +603,28 @@ static const char *credits[] = {
"C0""Lubomyr Lisen",
"",
"",
+"C1""Game Translations",
+"C1""CGE",
+"C0""Dan Serban",
+"C2""Soltys English translation",
+"A0""Victor Gonzalez",
+"C0""V\355ctor Gonz\341lez",
+"C2""Soltys Spanish translation",
+"A0""Alejandro Gomez de la Munoza",
+"C0""Alejandro G\363mez de la Mu\361oza",
+"C2""Soltys Spanish translation",
+"",
+"C1""Drascula",
+"C0""Thierry Crozat",
+"C2""Improve French translation",
+"",
+"C1""Mortevielle",
+"C0""Hugo Labrande",
+"C2""Improve English translation",
+"C0""Thierry Crozat",
+"C2""Improve English translation",
+"",
+"",
"C1""Websites (design)",
"A0""Dobo Balazs",
"C0""Dob\363 Bal\341zs",
diff --git a/gui/debugger.cpp b/gui/debugger.cpp
index 35627dd584..dcdc18d7b9 100644
--- a/gui/debugger.cpp
+++ b/gui/debugger.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -23,6 +23,7 @@
// NB: This is really only necessary if USE_READLINE is defined
#define FORBIDDEN_SYMBOL_ALLOW_ALL
+#include "common/debug.h"
#include "common/debug-channels.h"
#include "common/system.h"
@@ -51,19 +52,20 @@ Debugger::Debugger() {
#endif
// Register variables
- DVar_Register("debug_countdown", &_frameCountdown, DVAR_INT, 0);
+ registerVar("debug_countdown", &_frameCountdown, DVAR_INT, 0);
// Register commands
- //DCmd_Register("continue", WRAP_METHOD(Debugger, Cmd_Exit));
- DCmd_Register("exit", WRAP_METHOD(Debugger, Cmd_Exit));
- DCmd_Register("quit", WRAP_METHOD(Debugger, Cmd_Exit));
+ //registerCmd("continue", WRAP_METHOD(Debugger, cmdExit));
+ registerCmd("exit", WRAP_METHOD(Debugger, cmdExit));
+ registerCmd("quit", WRAP_METHOD(Debugger, cmdExit));
- DCmd_Register("help", WRAP_METHOD(Debugger, Cmd_Help));
- DCmd_Register("openlog", WRAP_METHOD(Debugger, Cmd_OpenLog));
+ registerCmd("help", WRAP_METHOD(Debugger, cmdHelp));
+ registerCmd("openlog", WRAP_METHOD(Debugger, cmdOpenLog));
- DCmd_Register("debugflag_list", WRAP_METHOD(Debugger, Cmd_DebugFlagsList));
- DCmd_Register("debugflag_enable", WRAP_METHOD(Debugger, Cmd_DebugFlagEnable));
- DCmd_Register("debugflag_disable", WRAP_METHOD(Debugger, Cmd_DebugFlagDisable));
+ registerCmd("debuglevel", WRAP_METHOD(Debugger, cmdDebugLevel));
+ registerCmd("debugflag_list", WRAP_METHOD(Debugger, cmdDebugFlagsList));
+ registerCmd("debugflag_enable", WRAP_METHOD(Debugger, cmdDebugFlagEnable));
+ registerCmd("debugflag_disable", WRAP_METHOD(Debugger, cmdDebugFlagDisable));
}
Debugger::~Debugger() {
@@ -74,7 +76,7 @@ Debugger::~Debugger() {
// Initialisation Functions
-int Debugger::DebugPrintf(const char *format, ...) {
+int Debugger::debugPrintf(const char *format, ...) {
va_list argptr;
va_start(argptr, format);
@@ -133,6 +135,14 @@ Debugger *g_readline_debugger;
char *readline_completionFunction(const char *text, int state) {
return g_readline_debugger->readlineComplete(text, state);
}
+
+#ifdef USE_READLINE_INT_COMPLETION
+typedef int RLCompFunc_t(const char *, int);
+#else
+typedef char *RLCompFunc_t(const char *, int);
+#endif
+
+
} // end of anonymous namespace
#endif
@@ -143,13 +153,13 @@ void Debugger::enter() {
#ifndef USE_TEXT_CONSOLE_FOR_DEBUGGER
if (_firstTime) {
- DebugPrintf("Debugger started, type 'exit' to return to the game.\n");
- DebugPrintf("Type 'help' to see a little list of commands and variables.\n");
+ debugPrintf("Debugger started, type 'exit' to return to the game.\n");
+ debugPrintf("Type 'help' to see a little list of commands and variables.\n");
_firstTime = false;
}
if (_errStr) {
- DebugPrintf("ERROR: %s\n\n", _errStr);
+ debugPrintf("ERROR: %s\n\n", _errStr);
free(_errStr);
_errStr = NULL;
}
@@ -162,7 +172,7 @@ void Debugger::enter() {
// TODO: add support for saving/loading history?
g_readline_debugger = this;
- rl_completion_entry_function = &readline_completionFunction;
+ rl_completion_entry_function = (RLCompFunc_t *)&readline_completionFunction;
char *line_read = 0;
do {
@@ -232,82 +242,82 @@ bool Debugger::parseCommand(const char *inputOrig) {
}
// It's not a command, so things get a little tricky for variables. Do fuzzy matching to ignore things like subscripts.
- for (uint i = 0; i < _dvars.size(); i++) {
- if (!strncmp(_dvars[i].name.c_str(), param[0], _dvars[i].name.size())) {
+ for (uint i = 0; i < _vars.size(); i++) {
+ if (!strncmp(_vars[i].name.c_str(), param[0], _vars[i].name.size())) {
if (num_params > 1) {
// Alright, we need to check the TYPE of the variable to deref and stuff... the array stuff is a bit ugly :)
- switch (_dvars[i].type) {
+ switch (_vars[i].type) {
// Integer
case DVAR_BYTE:
- *(byte *)_dvars[i].variable = atoi(param[1]);
- DebugPrintf("byte%s = %d\n", param[0], *(byte *)_dvars[i].variable);
+ *(byte *)_vars[i].variable = atoi(param[1]);
+ debugPrintf("byte%s = %d\n", param[0], *(byte *)_vars[i].variable);
break;
case DVAR_INT:
- *(int32 *)_dvars[i].variable = atoi(param[1]);
- DebugPrintf("(int)%s = %d\n", param[0], *(int32 *)_dvars[i].variable);
+ *(int32 *)_vars[i].variable = atoi(param[1]);
+ debugPrintf("(int)%s = %d\n", param[0], *(int32 *)_vars[i].variable);
break;
case DVAR_BOOL:
- if (Common::parseBool(param[1], *(bool *)_dvars[i].variable))
- DebugPrintf("(bool)%s = %s\n", param[0], *(bool *)_dvars[i].variable ? "true" : "false");
+ if (Common::parseBool(param[1], *(bool *)_vars[i].variable))
+ debugPrintf("(bool)%s = %s\n", param[0], *(bool *)_vars[i].variable ? "true" : "false");
else
- DebugPrintf("Invalid value for boolean variable. Valid values are \"true\", \"false\", \"1\", \"0\", \"yes\", \"no\"\n");
+ debugPrintf("Invalid value for boolean variable. Valid values are \"true\", \"false\", \"1\", \"0\", \"yes\", \"no\"\n");
break;
// Integer Array
case DVAR_INTARRAY: {
const char *chr = strchr(param[0], '[');
if (!chr) {
- DebugPrintf("You must access this array as %s[element]\n", param[0]);
+ debugPrintf("You must access this array as %s[element]\n", param[0]);
} else {
int element = atoi(chr+1);
- int32 *var = *(int32 **)_dvars[i].variable;
- if (element >= _dvars[i].arraySize) {
- DebugPrintf("%s is out of range (array is %d elements big)\n", param[0], _dvars[i].arraySize);
+ int32 *var = *(int32 **)_vars[i].variable;
+ if (element >= _vars[i].arraySize) {
+ debugPrintf("%s is out of range (array is %d elements big)\n", param[0], _vars[i].arraySize);
} else {
var[element] = atoi(param[1]);
- DebugPrintf("(int)%s = %d\n", param[0], var[element]);
+ debugPrintf("(int)%s = %d\n", param[0], var[element]);
}
}
}
break;
default:
- DebugPrintf("Failed to set variable %s to %s - unknown type\n", _dvars[i].name.c_str(), param[1]);
+ debugPrintf("Failed to set variable %s to %s - unknown type\n", _vars[i].name.c_str(), param[1]);
break;
}
} else {
// And again, type-dependent prints/defrefs. The array one is still ugly.
- switch (_dvars[i].type) {
+ switch (_vars[i].type) {
// Integer
case DVAR_BYTE:
- DebugPrintf("(byte)%s = %d\n", param[0], *(const byte *)_dvars[i].variable);
+ debugPrintf("(byte)%s = %d\n", param[0], *(const byte *)_vars[i].variable);
break;
case DVAR_INT:
- DebugPrintf("(int)%s = %d\n", param[0], *(const int32 *)_dvars[i].variable);
+ debugPrintf("(int)%s = %d\n", param[0], *(const int32 *)_vars[i].variable);
break;
case DVAR_BOOL:
- DebugPrintf("(bool)%s = %s\n", param[0], *(const bool *)_dvars[i].variable ? "true" : "false");
+ debugPrintf("(bool)%s = %s\n", param[0], *(const bool *)_vars[i].variable ? "true" : "false");
break;
// Integer array
case DVAR_INTARRAY: {
const char *chr = strchr(param[0], '[');
if (!chr) {
- DebugPrintf("You must access this array as %s[element]\n", param[0]);
+ debugPrintf("You must access this array as %s[element]\n", param[0]);
} else {
int element = atoi(chr+1);
- const int32 *var = *(const int32 **)_dvars[i].variable;
- if (element >= _dvars[i].arraySize) {
- DebugPrintf("%s is out of range (array is %d elements big)\n", param[0], _dvars[i].arraySize);
+ const int32 *var = *(const int32 **)_vars[i].variable;
+ if (element >= _vars[i].arraySize) {
+ debugPrintf("%s is out of range (array is %d elements big)\n", param[0], _vars[i].arraySize);
} else {
- DebugPrintf("(int)%s = %d\n", param[0], var[element]);
+ debugPrintf("(int)%s = %d\n", param[0], var[element]);
}
}
}
break;
// String
case DVAR_STRING:
- DebugPrintf("(string)%s = %s\n", param[0], ((Common::String *)_dvars[i].variable)->c_str());
+ debugPrintf("(string)%s = %s\n", param[0], ((Common::String *)_vars[i].variable)->c_str());
break;
default:
- DebugPrintf("%s = (unknown type)\n", param[0]);
+ debugPrintf("%s = (unknown type)\n", param[0]);
break;
}
}
@@ -317,7 +327,7 @@ bool Debugger::parseCommand(const char *inputOrig) {
}
}
- DebugPrintf("Unknown command or variable\n");
+ debugPrintf("Unknown command or variable\n");
free(input);
return true;
}
@@ -396,36 +406,36 @@ char *Debugger::readlineComplete(const char *input, int state) {
#endif
// Variable registration function
-void Debugger::DVar_Register(const Common::String &varname, void *pointer, VarType type, int arraySize) {
+void Debugger::registerVar(const Common::String &varname, void *pointer, VarType type, int arraySize) {
// TODO: Filter out duplicates
// TODO: Sort this list? Then we can do binary search later on when doing lookups.
assert(pointer);
- DVar tmp;
+ Var tmp;
tmp.name = varname;
tmp.type = type;
tmp.variable = pointer;
tmp.arraySize = arraySize;
- _dvars.push_back(tmp);
+ _vars.push_back(tmp);
}
// Command registration function
-void Debugger::DCmd_Register(const Common::String &cmdname, Debuglet *debuglet) {
+void Debugger::registerCmd(const Common::String &cmdname, Debuglet *debuglet) {
assert(debuglet && debuglet->isValid());
_cmds[cmdname] = Common::SharedPtr<Debuglet>(debuglet);
}
// Detach ("exit") the debugger
-bool Debugger::Cmd_Exit(int argc, const char **argv) {
+bool Debugger::cmdExit(int argc, const char **argv) {
detach();
return false;
}
// Print a list of all registered commands (and variables, if any),
// nicely word-wrapped.
-bool Debugger::Cmd_Help(int argc, const char **argv) {
+bool Debugger::cmdHelp(int argc, const char **argv) {
#ifndef USE_TEXT_CONSOLE_FOR_DEBUGGER
const int charsPerLine = _debuggerDialog->getCharsPerLine();
#elif defined(USE_READLINE)
@@ -438,7 +448,7 @@ bool Debugger::Cmd_Help(int argc, const char **argv) {
int width, size;
uint i;
- DebugPrintf("Commands are:\n");
+ debugPrintf("Commands are:\n");
// Obtain a list of sorted command names
Common::Array<Common::String> cmds;
@@ -454,84 +464,109 @@ bool Debugger::Cmd_Help(int argc, const char **argv) {
size = cmds[i].size() + 1;
if ((width + size) >= charsPerLine) {
- DebugPrintf("\n");
+ debugPrintf("\n");
width = size;
} else
width += size;
- DebugPrintf("%s ", cmds[i].c_str());
+ debugPrintf("%s ", cmds[i].c_str());
}
- DebugPrintf("\n");
+ debugPrintf("\n");
- if (!_dvars.empty()) {
- DebugPrintf("\n");
- DebugPrintf("Variables are:\n");
+ if (!_vars.empty()) {
+ debugPrintf("\n");
+ debugPrintf("Variables are:\n");
width = 0;
- for (i = 0; i < _dvars.size(); i++) {
- size = _dvars[i].name.size() + 1;
+ for (i = 0; i < _vars.size(); i++) {
+ size = _vars[i].name.size() + 1;
if ((width + size) >= charsPerLine) {
- DebugPrintf("\n");
+ debugPrintf("\n");
width = size;
} else
width += size;
- DebugPrintf("%s ", _dvars[i].name.c_str());
+ debugPrintf("%s ", _vars[i].name.c_str());
}
- DebugPrintf("\n");
+ debugPrintf("\n");
}
return true;
}
-bool Debugger::Cmd_OpenLog(int argc, const char **argv) {
+bool Debugger::cmdOpenLog(int argc, const char **argv) {
if (g_system->hasFeature(OSystem::kFeatureDisplayLogFile))
g_system->displayLogFile();
else
- DebugPrintf("Opening the log file not supported on this system\n");
+ debugPrintf("Opening the log file not supported on this system\n");
return true;
}
-bool Debugger::Cmd_DebugFlagsList(int argc, const char **argv) {
+bool Debugger::cmdDebugLevel(int argc, const char **argv) {
+ if (argc == 1) { // print level
+ debugPrintf("Debugging is currently %s (set at level %d)\n", (gDebugLevel >= 0) ? "enabled" : "disabled", gDebugLevel);
+ debugPrintf("Usage: %s <n> where n is 0 to 10 or -1 to disable debugging\n", argv[0]);
+ } else { // set level
+ gDebugLevel = atoi(argv[1]);
+ if (gDebugLevel >= 0 && gDebugLevel < 11) {
+ debugPrintf("Debug level set to level %d\n", gDebugLevel);
+ } else if (gDebugLevel < 0) {
+ debugPrintf("Debugging is now disabled\n");
+ } else {
+ debugPrintf("Invalid debug level value\n");
+ debugPrintf("Usage: %s <n> where n is 0 to 10 or -1 to disable debugging\n", argv[0]);
+ }
+ }
+
+ return true;
+}
+
+bool Debugger::cmdDebugFlagsList(int argc, const char **argv) {
const Common::DebugManager::DebugChannelList &debugLevels = DebugMan.listDebugChannels();
- DebugPrintf("Engine debug levels:\n");
- DebugPrintf("--------------------\n");
+ debugPrintf("Engine debug levels:\n");
+ debugPrintf("--------------------\n");
if (debugLevels.empty()) {
- DebugPrintf("No engine debug levels\n");
+ debugPrintf("No engine debug levels\n");
return true;
}
for (Common::DebugManager::DebugChannelList::const_iterator i = debugLevels.begin(); i != debugLevels.end(); ++i) {
- DebugPrintf("%c%s - %s (%s)\n", i->enabled ? '+' : ' ',
+ debugPrintf("%c%s - %s (%s)\n", i->enabled ? '+' : ' ',
i->name.c_str(), i->description.c_str(),
i->enabled ? "enabled" : "disabled");
}
- DebugPrintf("\n");
+ debugPrintf("\n");
return true;
}
-bool Debugger::Cmd_DebugFlagEnable(int argc, const char **argv) {
+bool Debugger::cmdDebugFlagEnable(int argc, const char **argv) {
if (argc < 2) {
- DebugPrintf("debugflag_enable <flag>\n");
+ debugPrintf("debugflag_enable [<flag> | all]\n");
} else {
- if (DebugMan.enableDebugChannel(argv[1])) {
- DebugPrintf("Enabled debug flag '%s'\n", argv[1]);
+ if (!scumm_stricmp(argv[1], "all")) {
+ debugPrintf("Enabled all debug flags\n");
+ DebugMan.enableAllDebugChannels();
+ } else if (DebugMan.enableDebugChannel(argv[1])) {
+ debugPrintf("Enabled debug flag '%s'\n", argv[1]);
} else {
- DebugPrintf("Failed to enable debug flag '%s'\n", argv[1]);
+ debugPrintf("Failed to enable debug flag '%s'\n", argv[1]);
}
}
return true;
}
-bool Debugger::Cmd_DebugFlagDisable(int argc, const char **argv) {
+bool Debugger::cmdDebugFlagDisable(int argc, const char **argv) {
if (argc < 2) {
- DebugPrintf("debugflag_disable <flag>\n");
+ debugPrintf("debugflag_disable [<flag> | all]\n");
} else {
- if (DebugMan.disableDebugChannel(argv[1])) {
- DebugPrintf("Disabled debug flag '%s'\n", argv[1]);
+ if (!scumm_stricmp(argv[1], "all")) {
+ debugPrintf("Disabled all debug flags\n");
+ DebugMan.disableAllDebugChannels();
+ } else if (DebugMan.disableDebugChannel(argv[1])) {
+ debugPrintf("Disabled debug flag '%s'\n", argv[1]);
} else {
- DebugPrintf("Failed to disable debug flag '%s'\n", argv[1]);
+ debugPrintf("Failed to disable debug flag '%s'\n", argv[1]);
}
}
return true;
diff --git a/gui/debugger.h b/gui/debugger.h
index b79e8723c1..8c7481b61f 100644
--- a/gui/debugger.h
+++ b/gui/debugger.h
@@ -17,6 +17,7 @@
* You should have received a copy of the GNU General Public 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 GUI_DEBUGGER_H
@@ -39,7 +40,7 @@ public:
Debugger();
virtual ~Debugger();
- int DebugPrintf(const char *format, ...) GCC_PRINTF(2, 3);
+ int debugPrintf(const char *format, ...) GCC_PRINTF(2, 3);
/**
* The onFrame() method should be invoked by the engine at regular
@@ -73,8 +74,8 @@ protected:
* Convenience macro that makes it easier to register a method
* of a debugger subclass as a command.
* Usage example:
- * DCmd_Register("COMMAND", WRAP_METHOD(MyDebugger, MyCmd));
- * would register the method MyDebugger::MyCmd(int, const char **)
+ * registerCmd("COMMAND", WRAP_METHOD(MyDebugger, myCmd));
+ * would register the method MyDebugger::myCmd(int, const char **)
* under the command name "COMMAND".
*/
#define WRAP_METHOD(cls, method) \
@@ -88,14 +89,14 @@ protected:
DVAR_STRING
};
- struct DVar {
+ struct Var {
Common::String name;
void *variable;
VarType type;
int arraySize;
};
-
+private:
/**
* Register a variable with the debugger. This allows the user to read and modify
* this variable.
@@ -103,11 +104,31 @@ protected:
* @param variable pointer to the actual storage of the variable
* @param type the type of the variable (byte, int, bool, ...)
* @paral arraySize for type DVAR_INTARRAY this specifies the size of the array
- *
- * @todo replace this single method by type safe variants.
*/
- void DVar_Register(const Common::String &varname, void *variable, VarType type, int arraySize);
- void DCmd_Register(const Common::String &cmdname, Debuglet *debuglet);
+ void registerVar(const Common::String &varname, void *variable, VarType type, int arraySize);
+
+protected:
+ void registerVar(const Common::String &varname, byte *variable) {
+ registerVar(varname, variable, DVAR_BYTE, 0);
+ }
+
+ void registerVar(const Common::String &varname, int *variable) {
+ registerVar(varname, variable, DVAR_INT, 0);
+ }
+
+ void registerVar(const Common::String &varname, bool *variable) {
+ registerVar(varname, variable, DVAR_BOOL, 0);
+ }
+
+ void registerVar(const Common::String &varname, int32 **variable, int arraySize) {
+ registerVar(varname, variable, DVAR_INTARRAY, arraySize);
+ }
+
+ void registerVar(const Common::String &varname, Common::String *variable) {
+ registerVar(varname, variable, DVAR_STRING, 0);
+ }
+
+ void registerCmd(const Common::String &cmdname, Debuglet *debuglet);
private:
@@ -124,7 +145,7 @@ private:
*/
uint _frameCountdown;
- Common::Array<DVar> _dvars;
+ Common::Array<Var> _vars;
typedef Common::HashMap<Common::String, Common::SharedPtr<Debuglet>, Common::IgnoreCase_Hash, Common::IgnoreCase_EqualTo> CommandsMap;
CommandsMap _cmds;
@@ -167,7 +188,7 @@ protected:
virtual void postEnter();
/**
- * Subclasses should invoke the detach() method in their Cmd_FOO methods
+ * Subclasses should invoke the detach() method in their cmdFOO methods
* if that command will resume execution of the program (as opposed to
* executing, say, a "single step through code" command).
*
@@ -189,12 +210,13 @@ private:
virtual bool handleCommand(int argc, const char **argv, bool &keepRunning);
protected:
- bool Cmd_Exit(int argc, const char **argv);
- bool Cmd_Help(int argc, const char **argv);
- bool Cmd_OpenLog(int argc, const char **argv);
- bool Cmd_DebugFlagsList(int argc, const char **argv);
- bool Cmd_DebugFlagEnable(int argc, const char **argv);
- bool Cmd_DebugFlagDisable(int argc, const char **argv);
+ bool cmdExit(int argc, const char **argv);
+ bool cmdHelp(int argc, const char **argv);
+ bool cmdOpenLog(int argc, const char **argv);
+ bool cmdDebugLevel(int argc, const char **argv);
+ bool cmdDebugFlagsList(int argc, const char **argv);
+ bool cmdDebugFlagEnable(int argc, const char **argv);
+ bool cmdDebugFlagDisable(int argc, const char **argv);
#ifndef USE_TEXT_CONSOLE_FOR_DEBUGGER
private:
diff --git a/gui/dialog.cpp b/gui/dialog.cpp
index ffca15bbc8..fa4e508494 100644
--- a/gui/dialog.cpp
+++ b/gui/dialog.cpp
@@ -17,6 +17,7 @@
* You should have received a copy of the GNU General Public 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/rect.h"
@@ -249,7 +250,18 @@ void Dialog::handleKeyDown(Common::KeyState state) {
close();
}
- // TODO: tab/shift-tab should focus the next/previous focusable widget
+ if (state.keycode == Common::KEYCODE_TAB) {
+ // TODO: Maybe add Tab behaviours for all widgets too.
+ // searches through widgets on screen for tab widget
+ Widget *w = _firstWidget;
+ while (w) {
+ if (w->_type == kTabWidget)
+ if (w->handleKeyDown(state))
+ return;
+
+ w = w->_next;
+ }
+ }
}
void Dialog::handleKeyUp(Common::KeyState state) {
diff --git a/gui/dialog.h b/gui/dialog.h
index d269a2f645..593ee13458 100644
--- a/gui/dialog.h
+++ b/gui/dialog.h
@@ -17,6 +17,7 @@
* You should have received a copy of the GNU General Public 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 GUI_DIALOG_H
diff --git a/gui/editrecorddialog.cpp b/gui/editrecorddialog.cpp
index cfcc747121..cd384baaed 100644
--- a/gui/editrecorddialog.cpp
+++ b/gui/editrecorddialog.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/gui/editrecorddialog.h b/gui/editrecorddialog.h
index c8da4521ca..3825f64ee1 100644
--- a/gui/editrecorddialog.h
+++ b/gui/editrecorddialog.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/gui/error.cpp b/gui/error.cpp
index 75bdab1a2a..11f591ed0e 100644
--- a/gui/error.cpp
+++ b/gui/error.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/gui/error.h b/gui/error.h
index f193136d74..fa517b8e48 100644
--- a/gui/error.h
+++ b/gui/error.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/gui/fluidsynth-dialog.cpp b/gui/fluidsynth-dialog.cpp
index 662518b557..af5ee6fb10 100644
--- a/gui/fluidsynth-dialog.cpp
+++ b/gui/fluidsynth-dialog.cpp
@@ -17,6 +17,7 @@
* You should have received a copy of the GNU General Public 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 "gui/fluidsynth-dialog.h"
diff --git a/gui/fluidsynth-dialog.h b/gui/fluidsynth-dialog.h
index 4d74c9f93e..ebf6563960 100644
--- a/gui/fluidsynth-dialog.h
+++ b/gui/fluidsynth-dialog.h
@@ -17,6 +17,7 @@
* You should have received a copy of the GNU General Public 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 FLUIDSYNTH_DIALOG_H
diff --git a/gui/gui-manager.cpp b/gui/gui-manager.cpp
index 1505c8c707..80c3c2a552 100644
--- a/gui/gui-manager.cpp
+++ b/gui/gui-manager.cpp
@@ -17,6 +17,7 @@
* You should have received a copy of the GNU General Public 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/events.h"
@@ -309,6 +310,19 @@ void GuiManager::runLoop() {
Common::Event event;
while (eventMan->pollEvent(event)) {
+ // We will need to check whether the screen changed while polling
+ // for an event here. While we do send EVENT_SCREEN_CHANGED
+ // whenever this happens we still cannot be sure that we get such
+ // an event immediately. For example, we might have an mouse move
+ // event queued before an screen changed event. In some rare cases
+ // this would make the GUI redraw (with the code a few lines
+ // below) when it is not yet updated for new overlay dimensions.
+ // As a result ScummVM would crash because it tries to copy data
+ // outside the actual overlay screen.
+ if (event.type != Common::EVENT_SCREEN_CHANGED) {
+ checkScreenChange();
+ }
+
// The top dialog can change during the event loop. In that case, flush all the
// dialog-related events since they were probably generated while the old dialog
// was still visible, and therefore not intended for the new one.
diff --git a/gui/gui-manager.h b/gui/gui-manager.h
index b52d91ba08..4186a93ccb 100644
--- a/gui/gui-manager.h
+++ b/gui/gui-manager.h
@@ -17,6 +17,7 @@
* You should have received a copy of the GNU General Public 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 GUIMANAGER_H
diff --git a/gui/launcher.cpp b/gui/launcher.cpp
index 77d4cce794..9ac97a77d6 100644
--- a/gui/launcher.cpp
+++ b/gui/launcher.cpp
@@ -17,6 +17,7 @@
* You should have received a copy of the GNU General Public 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/version.h"
diff --git a/gui/launcher.h b/gui/launcher.h
index 2ab47be98d..e9c76a5320 100644
--- a/gui/launcher.h
+++ b/gui/launcher.h
@@ -17,6 +17,7 @@
* You should have received a copy of the GNU General Public 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 GUI_LAUNCHER_DIALOG_H
diff --git a/gui/massadd.cpp b/gui/massadd.cpp
index 70580e8b9c..34e1ab466e 100644
--- a/gui/massadd.cpp
+++ b/gui/massadd.cpp
@@ -17,6 +17,7 @@
* You should have received a copy of the GNU General Public 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/metaengine.h"
diff --git a/gui/massadd.h b/gui/massadd.h
index 7350213835..116a420d79 100644
--- a/gui/massadd.h
+++ b/gui/massadd.h
@@ -17,6 +17,7 @@
* You should have received a copy of the GNU General Public 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 MASSADD_DIALOG_H
diff --git a/gui/message.cpp b/gui/message.cpp
index 6c2f489a4c..674680c4d4 100644
--- a/gui/message.cpp
+++ b/gui/message.cpp
@@ -17,6 +17,7 @@
* You should have received a copy of the GNU General Public 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"
diff --git a/gui/message.h b/gui/message.h
index 9da8417b5f..ff69780709 100644
--- a/gui/message.h
+++ b/gui/message.h
@@ -17,6 +17,7 @@
* You should have received a copy of the GNU General Public 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 MESSAGE_DIALOG_H
diff --git a/gui/object.cpp b/gui/object.cpp
index 189a286ead..ef2cc9d6e0 100644
--- a/gui/object.cpp
+++ b/gui/object.cpp
@@ -17,6 +17,7 @@
* You should have received a copy of the GNU General Public 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/textconsole.h"
diff --git a/gui/object.h b/gui/object.h
index dac3341b5a..219bf77f69 100644
--- a/gui/object.h
+++ b/gui/object.h
@@ -17,6 +17,7 @@
* You should have received a copy of the GNU General Public 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 GUI_OBJECT_H
diff --git a/gui/onscreendialog.cpp b/gui/onscreendialog.cpp
index 03a6f26ec0..0e37834136 100644
--- a/gui/onscreendialog.cpp
+++ b/gui/onscreendialog.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/gui/onscreendialog.h b/gui/onscreendialog.h
index 2fae14cbc6..ca95ff3743 100644
--- a/gui/onscreendialog.h
+++ b/gui/onscreendialog.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/gui/options.cpp b/gui/options.cpp
index a9fdc19274..3308cdead6 100644
--- a/gui/options.cpp
+++ b/gui/options.cpp
@@ -17,6 +17,7 @@
* You should have received a copy of the GNU General Public 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 "gui/browser.h"
diff --git a/gui/options.h b/gui/options.h
index 081ef4fea5..1e65bfd134 100644
--- a/gui/options.h
+++ b/gui/options.h
@@ -17,6 +17,7 @@
* You should have received a copy of the GNU General Public 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 OPTIONS_DIALOG_H
diff --git a/gui/predictivedialog.cpp b/gui/predictivedialog.cpp
index ef94ec6d50..a894b02f80 100644
--- a/gui/predictivedialog.cpp
+++ b/gui/predictivedialog.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -752,7 +752,8 @@ bool PredictiveDialog::matchWord() {
char tmp[kMaxLineLen];
strncpy(tmp, _unitedDict.dictLine[line], kMaxLineLen);
tmp[kMaxLineLen - 1] = 0;
- char *tok = strtok(tmp, " ");
+ char *tok;
+ strtok(tmp, " ");
tok = strtok(NULL, " ");
_currentWord = Common::String(tok, _currentCode.size());
return true;
diff --git a/gui/predictivedialog.h b/gui/predictivedialog.h
index 0e3d2967c0..32d769d6ca 100644
--- a/gui/predictivedialog.h
+++ b/gui/predictivedialog.h
@@ -17,6 +17,7 @@
* You should have received a copy of the GNU General Public 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 GLOBAL_DIALOGS_H
diff --git a/gui/recorderdialog.cpp b/gui/recorderdialog.cpp
index 1a11dbac65..5617d2ba9a 100644
--- a/gui/recorderdialog.cpp
+++ b/gui/recorderdialog.cpp
@@ -17,6 +17,7 @@
* You should have received a copy of the GNU General Public 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/algorithm.h"
diff --git a/gui/recorderdialog.h b/gui/recorderdialog.h
index 9c5965f56d..8a229a06e4 100644
--- a/gui/recorderdialog.h
+++ b/gui/recorderdialog.h
@@ -17,6 +17,7 @@
* You should have received a copy of the GNU General Public 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 GUI_RECORDER_DIALOG_H
diff --git a/gui/saveload-dialog.cpp b/gui/saveload-dialog.cpp
index 585117fba4..f6eee3af50 100644
--- a/gui/saveload-dialog.cpp
+++ b/gui/saveload-dialog.cpp
@@ -17,6 +17,7 @@
* You should have received a copy of the GNU General Public 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 "gui/saveload-dialog.h"
diff --git a/gui/saveload-dialog.h b/gui/saveload-dialog.h
index 6f7d95f73f..31f28f6452 100644
--- a/gui/saveload-dialog.h
+++ b/gui/saveload-dialog.h
@@ -17,6 +17,7 @@
* You should have received a copy of the GNU General Public 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 GUI_SAVELOAD_DIALOG_H
diff --git a/gui/saveload.cpp b/gui/saveload.cpp
index c2bbcd9bec..c1c1d12ec5 100644
--- a/gui/saveload.cpp
+++ b/gui/saveload.cpp
@@ -17,6 +17,7 @@
* You should have received a copy of the GNU General Public 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"
diff --git a/gui/saveload.h b/gui/saveload.h
index 17fd99a31d..22c26d4c5e 100644
--- a/gui/saveload.h
+++ b/gui/saveload.h
@@ -17,6 +17,7 @@
* You should have received a copy of the GNU General Public 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 GUI_SAVELOAD_H
diff --git a/gui/themebrowser.cpp b/gui/themebrowser.cpp
index c22603b822..d8bd5d6fe8 100644
--- a/gui/themebrowser.cpp
+++ b/gui/themebrowser.cpp
@@ -17,6 +17,7 @@
* You should have received a copy of the GNU General Public 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 "gui/themebrowser.h"
diff --git a/gui/themebrowser.h b/gui/themebrowser.h
index daea3836fc..2d94a7f423 100644
--- a/gui/themebrowser.h
+++ b/gui/themebrowser.h
@@ -17,6 +17,7 @@
* You should have received a copy of the GNU General Public 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 GUI_THEMEBROWSER_H
diff --git a/gui/themes/default.inc b/gui/themes/default.inc
index 352cc86852..e881c2d4eb 100644
--- a/gui/themes/default.inc
+++ b/gui/themes/default.inc
@@ -2506,16 +2506,16 @@
"</layout>"
"</dialog>"
"<dialog name='GlobalMenu' overlays='screen_center'>"
-"<layout type='vertical' padding='2,2,4,6' center='true' spacing='6'>"
+"<layout type='vertical' padding='2,2,2,6' center='true' spacing='0'>"
"<widget name='Title' "
"width='160' "
-"height='4' "
+"height='12' "
"/>"
"<widget name='Version' "
"width='160' "
-"height='4' "
+"height='14' "
"/>"
-"<space size='1'/>"
+"<layout type='vertical' padding='0,0,3,0' center='true' spacing='6'>"
"<widget name='Load' "
"width='120' "
"height='12' "
@@ -2551,6 +2551,7 @@
"height='12' "
"/>"
"</layout>"
+"</layout>"
"</dialog>"
"<dialog name='GlobalConfig' overlays='screen_center'>"
"<layout type='vertical' padding='8,8,8,8'>"
diff --git a/gui/themes/scummclassic.zip b/gui/themes/scummclassic.zip
index 1085aa64a4..7115849aa0 100644
--- a/gui/themes/scummclassic.zip
+++ b/gui/themes/scummclassic.zip
Binary files differ
diff --git a/gui/themes/scummclassic/classic_layout_lowres.stx b/gui/themes/scummclassic/classic_layout_lowres.stx
index 802998df3c..506657ef31 100644
--- a/gui/themes/scummclassic/classic_layout_lowres.stx
+++ b/gui/themes/scummclassic/classic_layout_lowres.stx
@@ -687,50 +687,51 @@
</dialog>
<dialog name = 'GlobalMenu' overlays = 'screen_center'>
- <layout type = 'vertical' padding = '2, 2, 4, 6' center = 'true' spacing='6'>
+ <layout type = 'vertical' padding = '2, 2, 2, 6' center = 'true' spacing='0'>
<widget name = 'Title'
width = '160'
- height = '4'
+ height = '12'
/>
<widget name = 'Version'
width = '160'
- height = '4'
- />
- <space size = '1'/>
- <widget name = 'Load'
- width = '120'
- height = '12'
- />
- <widget name = 'Save'
- width = '120'
- height = '12'
- />
- <space size = '1'/>
- <widget name = 'Options'
- width = '120'
- height = '12'
- />
- <widget name = 'Help'
- width = '120'
- height = '12'
- />
- <widget name = 'About'
- width = '120'
- height = '12'
- />
- <space size = '1'/>
- <widget name = 'Resume'
- width = '120'
- height = '12'
- />
- <widget name = 'RTL'
- width = '120'
- height = '12'
- />
- <widget name = 'Quit'
- width = '120'
- height = '12'
+ height = '14'
/>
+ <layout type = 'vertical' padding = '0, 0, 3, 0' center = 'true' spacing='6'>
+ <widget name = 'Load'
+ width = '120'
+ height = '12'
+ />
+ <widget name = 'Save'
+ width = '120'
+ height = '12'
+ />
+ <space size = '1'/>
+ <widget name = 'Options'
+ width = '120'
+ height = '12'
+ />
+ <widget name = 'Help'
+ width = '120'
+ height = '12'
+ />
+ <widget name = 'About'
+ width = '120'
+ height = '12'
+ />
+ <space size = '1'/>
+ <widget name = 'Resume'
+ width = '120'
+ height = '12'
+ />
+ <widget name = 'RTL'
+ width = '120'
+ height = '12'
+ />
+ <widget name = 'Quit'
+ width = '120'
+ height = '12'
+ />
+ </layout>
</layout>
</dialog>
diff --git a/gui/themes/scummtheme.py b/gui/themes/scummtheme.py
index 524e91468e..94dc08f1ef 100755
--- a/gui/themes/scummtheme.py
+++ b/gui/themes/scummtheme.py
@@ -19,7 +19,9 @@ def buildTheme(themeName):
zf.write('THEMERC', './THEMERC')
- for filename in os.listdir('.'):
+ filenames = os.listdir('.')
+ filenames.sort()
+ for filename in filenames:
if os.path.isfile(filename) and not filename[0] == '.' and filename.endswith(THEME_FILE_EXTENSIONS):
zf.write(filename, './' + filename)
print (" Adding file: " + filename)
@@ -65,7 +67,9 @@ def buildDefTheme(themeName):
def_file.write(""" "<?xml version = '1.0'?>"\n""")
strlitcount = 24
- for filename in os.listdir(themeName):
+ filenames = os.listdir(themeName)
+ filenames.sort()
+ for filename in filenames:
filename = os.path.join(themeName, filename)
if os.path.isfile(filename) and filename.endswith(".stx"):
theme_file = open(filename, "r")
diff --git a/gui/themes/translations.dat b/gui/themes/translations.dat
index 7bd1316208..1a7b49852d 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 e96b62e359..851774fd70 100644
--- a/gui/widget.cpp
+++ b/gui/widget.cpp
@@ -17,6 +17,7 @@
* You should have received a copy of the GNU General Public 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"
diff --git a/gui/widget.h b/gui/widget.h
index e3f712564f..9891f32b36 100644
--- a/gui/widget.h
+++ b/gui/widget.h
@@ -17,6 +17,7 @@
* You should have received a copy of the GNU General Public 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 GUI_WIDGET_H
diff --git a/gui/widgets/editable.cpp b/gui/widgets/editable.cpp
index 667850d6cc..af3e5e9b9a 100644
--- a/gui/widgets/editable.cpp
+++ b/gui/widgets/editable.cpp
@@ -17,6 +17,7 @@
* You should have received a copy of the GNU General Public 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/rect.h"
@@ -261,23 +262,45 @@ void EditableWidget::drawCaret(bool erase) {
int x = editRect.left;
int y = editRect.top;
- x += getCaretOffset();
+ const int caretOffset = getCaretOffset();
+ x += caretOffset;
- if (y < 0 || y + editRect.height() - 2 >= _h)
+ if (y < 0 || y + editRect.height() > _h)
return;
x += getAbsX();
y += getAbsY();
- g_gui.theme()->drawCaret(Common::Rect(x, y, x + 1, y + editRect.height() - 2), erase);
+ g_gui.theme()->drawCaret(Common::Rect(x, y, x + 1, y + editRect.height()), erase);
if (erase) {
+ GUI::EditableWidget::String character;
+ int width;
+
if ((uint)_caretPos < _editString.size()) {
- GUI::EditableWidget::String chr(_editString[_caretPos]);
- int chrWidth = g_gui.getCharWidth(_editString[_caretPos], _font);
+ const byte chr = _editString[_caretPos];
+ width = g_gui.getCharWidth(chr, _font);
+ character = chr;
+
const uint last = (_caretPos > 0) ? _editString[_caretPos - 1] : 0;
- x += g_gui.getKerningOffset(last, _editString[_caretPos], _font);
- g_gui.theme()->drawText(Common::Rect(x, y, x + chrWidth, y + editRect.height() - 2), chr, _state, Graphics::kTextAlignLeft, _inversion, 0, false, _font, ThemeEngine::kFontColorNormal, true, _textDrawableArea);
+ x += g_gui.getKerningOffset(last, chr, _font);
+ } else {
+ // We draw a fake space here to assure that removing the caret
+ // does not result in color glitches in case the edit rect is
+ // drawn with an inversion.
+ width = g_gui.getCharWidth(' ', _font);
+ character = " ";
+ }
+
+ // TODO: Right now we manually prevent text from being drawn outside
+ // the edit area here. We might want to consider to use
+ // setTextDrawableArea for this. However, it seems that only
+ // EditTextWidget uses that but not ListWidget. Thus, one should check
+ // whether we can unify the drawing in the text area first to avoid
+ // possible glitches due to different methods used.
+ width = MIN(editRect.width() - caretOffset, width);
+ if (width > 0) {
+ g_gui.theme()->drawText(Common::Rect(x, y, x + width, y + editRect.height()), character, _state, Graphics::kTextAlignLeft, _inversion, 0, false, _font, ThemeEngine::kFontColorNormal, true, _textDrawableArea);
}
}
diff --git a/gui/widgets/editable.h b/gui/widgets/editable.h
index 4a18d5e689..e3b3a2b014 100644
--- a/gui/widgets/editable.h
+++ b/gui/widgets/editable.h
@@ -17,6 +17,7 @@
* You should have received a copy of the GNU General Public 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 GUI_WIDGETS_EDITABLE_H
@@ -78,6 +79,11 @@ protected:
virtual void startEditMode() = 0;
virtual void endEditMode() = 0;
virtual void abortEditMode() = 0;
+ /**
+ * The area where text input is being made. This should exactly match the
+ * rect with which the actual edit string is drawn otherwise nasty
+ * graphics glitches when redrawing the caret can occur.
+ */
virtual Common::Rect getEditRect() const = 0;
virtual int getCaretOffset() const;
void drawCaret(bool erase);
diff --git a/gui/widgets/edittext.cpp b/gui/widgets/edittext.cpp
index 52527effd8..3e72350c99 100644
--- a/gui/widgets/edittext.cpp
+++ b/gui/widgets/edittext.cpp
@@ -17,6 +17,7 @@
* You should have received a copy of the GNU General Public 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/system.h"
@@ -101,7 +102,7 @@ void EditTextWidget::drawWidget() {
}
Common::Rect EditTextWidget::getEditRect() const {
- Common::Rect r(2 + _leftPadding, 2, _w - 2 - _leftPadding - _rightPadding, _h - 1);
+ Common::Rect r(2 + _leftPadding, 2, _w - 2 - _leftPadding - _rightPadding, _h);
return r;
}
diff --git a/gui/widgets/edittext.h b/gui/widgets/edittext.h
index a34dc4b5dd..7376ae70ff 100644
--- a/gui/widgets/edittext.h
+++ b/gui/widgets/edittext.h
@@ -17,6 +17,7 @@
* You should have received a copy of the GNU General Public 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 GUI_WIDGETS_EDITTEXT_H
diff --git a/gui/widgets/list.cpp b/gui/widgets/list.cpp
index 8ecb31311f..4b69202fdc 100644
--- a/gui/widgets/list.cpp
+++ b/gui/widgets/list.cpp
@@ -17,6 +17,7 @@
* You should have received a copy of the GNU General Public 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/system.h"
@@ -541,7 +542,7 @@ void ListWidget::drawWidget() {
}
Common::Rect ListWidget::getEditRect() const {
- Common::Rect r(_hlLeftPadding, 0, _w - _hlLeftPadding - _hlRightPadding, kLineHeight - 1);
+ Common::Rect r(_hlLeftPadding, 0, _w - _hlLeftPadding - _hlRightPadding, kLineHeight - 2);
const int offset = (_selectedItem - _currentPos) * kLineHeight + _topPadding;
r.top += offset;
r.bottom += offset;
diff --git a/gui/widgets/list.h b/gui/widgets/list.h
index d18a82dd3f..1abb2b810e 100644
--- a/gui/widgets/list.h
+++ b/gui/widgets/list.h
@@ -17,6 +17,7 @@
* You should have received a copy of the GNU General Public 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 GUI_WIDGETS_LIST_H
diff --git a/gui/widgets/popup.cpp b/gui/widgets/popup.cpp
index 829a49c53e..6186492339 100644
--- a/gui/widgets/popup.cpp
+++ b/gui/widgets/popup.cpp
@@ -17,6 +17,7 @@
* You should have received a copy of the GNU General Public 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/system.h"
diff --git a/gui/widgets/popup.h b/gui/widgets/popup.h
index 34983adbeb..102c7fd258 100644
--- a/gui/widgets/popup.h
+++ b/gui/widgets/popup.h
@@ -17,6 +17,7 @@
* You should have received a copy of the GNU General Public 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 GUI_WIDGETS_POPUP_H
diff --git a/gui/widgets/scrollbar.cpp b/gui/widgets/scrollbar.cpp
index c7c17bc908..f1306b9c4a 100644
--- a/gui/widgets/scrollbar.cpp
+++ b/gui/widgets/scrollbar.cpp
@@ -17,6 +17,7 @@
* You should have received a copy of the GNU General Public 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/rect.h"
diff --git a/gui/widgets/scrollbar.h b/gui/widgets/scrollbar.h
index 1c9f371cbc..de7c13ce03 100644
--- a/gui/widgets/scrollbar.h
+++ b/gui/widgets/scrollbar.h
@@ -17,6 +17,7 @@
* You should have received a copy of the GNU General Public 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 GUI_WIDGETS_SCROLLBAR_H
diff --git a/gui/widgets/tab.cpp b/gui/widgets/tab.cpp
index 66f33907ca..756781a04b 100644
--- a/gui/widgets/tab.cpp
+++ b/gui/widgets/tab.cpp
@@ -17,6 +17,7 @@
* You should have received a copy of the GNU General Public 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/util.h"
@@ -182,6 +183,7 @@ void TabWidget::setActiveTab(int tabID) {
}
_activeTab = tabID;
_firstWidget = _tabs[tabID].firstWidget;
+
_boss->draw();
}
}
@@ -225,12 +227,34 @@ void TabWidget::handleMouseDown(int x, int y, int button, int clickCount) {
}
bool TabWidget::handleKeyDown(Common::KeyState state) {
- // TODO: maybe there should be a way to switch between tabs
- // using the keyboard? E.g. Alt-Shift-Left/Right-Arrow or something
- // like that.
+ if (state.hasFlags(Common::KBD_SHIFT) && state.keycode == Common::KEYCODE_TAB)
+ adjustTabs(kTabBackwards);
+ else if (state.keycode == Common::KEYCODE_TAB)
+ adjustTabs(kTabForwards);
+
return Widget::handleKeyDown(state);
}
+void TabWidget::adjustTabs(int value) {
+ // Determine which tab is next
+ int tabID = _activeTab + value;
+ if (tabID >= (int)_tabs.size())
+ tabID = 0;
+ else if (tabID < 0)
+ tabID = ((int)_tabs.size() - 1);
+
+ // Slides _firstVisibleTab forward to the correct tab
+ int maxTabsOnScreen = (_w / _tabWidth);
+ if (tabID >= maxTabsOnScreen && (_firstVisibleTab + maxTabsOnScreen) < (int)_tabs.size())
+ _firstVisibleTab++;
+
+ // Slides _firstVisibleTab backwards to the correct tab
+ while (tabID < _firstVisibleTab)
+ _firstVisibleTab--;
+
+ setActiveTab(tabID);
+}
+
void TabWidget::reflowLayout() {
Widget::reflowLayout();
diff --git a/gui/widgets/tab.h b/gui/widgets/tab.h
index b19036979e..a01ee2d9dc 100644
--- a/gui/widgets/tab.h
+++ b/gui/widgets/tab.h
@@ -17,6 +17,7 @@
* You should have received a copy of the GNU General Public 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 GUI_WIDGETS_TAB_H
@@ -27,6 +28,11 @@
#include "common/array.h"
namespace GUI {
+
+enum {
+ kTabForwards = 1,
+ kTabBackwards = -1
+};
class TabWidget : public Widget {
typedef Common::String String;
@@ -108,6 +114,8 @@ protected:
virtual void drawWidget();
virtual Widget *findWidget(int x, int y);
+
+ virtual void adjustTabs(int value);
};
} // End of namespace GUI
diff --git a/graphics/decoders/bmp.cpp b/image/bmp.cpp
index 2eabbb7631..28eb049035 100644
--- a/graphics/decoders/bmp.cpp
+++ b/image/bmp.cpp
@@ -17,21 +17,25 @@
* You should have received a copy of the GNU General Public 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 "image/bmp.h"
+
#include "common/stream.h"
+#include "common/substream.h"
#include "common/textconsole.h"
-
#include "graphics/pixelformat.h"
#include "graphics/surface.h"
-#include "graphics/decoders/bmp.h"
+#include "image/codecs/codec.h"
-namespace Graphics {
+namespace Image {
BitmapDecoder::BitmapDecoder() {
_surface = 0;
_palette = 0;
_paletteColorCount = 0;
+ _codec = 0;
}
BitmapDecoder::~BitmapDecoder() {
@@ -39,13 +43,15 @@ BitmapDecoder::~BitmapDecoder() {
}
void BitmapDecoder::destroy() {
- if (_surface) {
- _surface->free();
- delete _surface; _surface = 0;
- }
+ _surface = 0;
+
+ delete[] _palette;
+ _palette = 0;
- delete[] _palette; _palette = 0;
_paletteColorCount = 0;
+
+ delete _codec;
+ _codec = 0;
}
bool BitmapDecoder::loadStream(Common::SeekableReadStream &stream) {
@@ -87,14 +93,8 @@ bool BitmapDecoder::loadStream(Common::SeekableReadStream &stream) {
return false;
}
- uint32 compression = stream.readUint32LE();
-
- if (compression != 0) {
- warning("Compressed bitmaps not supported");
- return false;
- }
-
- /* uint32 imageSize = */ stream.readUint32LE();
+ uint32 compression = stream.readUint32BE();
+ uint32 imageSize = stream.readUint32LE();
/* uint32 pixelsPerMeterX = */ stream.readUint32LE();
/* uint32 pixelsPerMeterY = */ stream.readUint32LE();
_paletteColorCount = stream.readUint32LE();
@@ -114,69 +114,22 @@ bool BitmapDecoder::loadStream(Common::SeekableReadStream &stream) {
}
}
- // Start us at the beginning of the image
- stream.seek(imageOffset);
-
- Graphics::PixelFormat format = Graphics::PixelFormat::createFormatCLUT8();
-
- // BGRA for 24bpp and 32 bpp
- if (bitsPerPixel == 24 || bitsPerPixel == 32)
- format = Graphics::PixelFormat(4, 8, 8, 8, 8, 8, 16, 24, 0);
-
- _surface = new Graphics::Surface();
- _surface->create(width, height, format);
+ // Create the codec (it will warn about unhandled compression)
+ _codec = createBitmapCodec(compression, width, height, bitsPerPixel);
+ if (!_codec)
+ return false;
- int srcPitch = width * (bitsPerPixel >> 3);
- const int extraDataLength = (srcPitch % 4) ? 4 - (srcPitch % 4) : 0;
+ // If the image size is zero, set it to the rest of the stream.
+ if (imageSize == 0)
+ imageSize = stream.size() - imageOffset;
- if (bitsPerPixel == 8) {
- byte *dst = (byte *)_surface->getPixels();
+ // Grab the frame data
+ Common::SeekableSubReadStream subStream(&stream, imageOffset, imageOffset + imageSize);
- for (int32 i = 0; i < height; i++) {
- stream.read(dst + (height - i - 1) * width, width);
- stream.skip(extraDataLength);
- }
- } else if (bitsPerPixel == 24) {
- byte *dst = (byte *)_surface->getBasePtr(0, height - 1);
-
- for (int32 i = 0; i < height; i++) {
- for (uint32 j = 0; j < width; j++) {
- byte b = stream.readByte();
- byte g = stream.readByte();
- byte r = stream.readByte();
- uint32 color = format.RGBToColor(r, g, b);
-
- *((uint32 *)dst) = color;
- dst += format.bytesPerPixel;
- }
-
- stream.skip(extraDataLength);
- dst -= _surface->pitch * 2;
- }
- } else { // 32 bpp
- byte *dst = (byte *)_surface->getBasePtr(0, height - 1);
-
- for (int32 i = 0; i < height; i++) {
- for (uint32 j = 0; j < width; j++) {
- byte b = stream.readByte();
- byte g = stream.readByte();
- byte r = stream.readByte();
- // Ignore the last byte, as in v3 it is unused
- // and should thus NOT be used as alpha.
- // ref: http://msdn.microsoft.com/en-us/library/windows/desktop/dd183376%28v=vs.85%29.aspx
- stream.readByte();
- uint32 color = format.RGBToColor(r, g, b);
-
- *((uint32 *)dst) = color;
- dst += format.bytesPerPixel;
- }
-
- stream.skip(extraDataLength);
- dst -= _surface->pitch * 2;
- }
- }
+ // We only support raw bitmaps for now
+ _surface = _codec->decodeFrame(subStream);
return true;
}
-} // End of namespace Graphics
+} // End of namespace Image
diff --git a/graphics/decoders/bmp.h b/image/bmp.h
index 779da352be..b482cc674b 100644
--- a/graphics/decoders/bmp.h
+++ b/image/bmp.h
@@ -17,6 +17,7 @@
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
*/
/**
@@ -27,21 +28,24 @@
* - wintermute
*/
-#ifndef GRAPHICS_DECODERS_BMP_H
-#define GRAPHICS_DECODERS_BMP_H
+#ifndef IMAGE_BMP_H
+#define IMAGE_BMP_H
#include "common/scummsys.h"
#include "common/str.h"
-#include "graphics/decoders/image_decoder.h"
+#include "image/image_decoder.h"
-namespace Common{
+namespace Common {
class SeekableReadStream;
}
namespace Graphics {
-
-struct PixelFormat;
struct Surface;
+}
+
+namespace Image {
+
+class Codec;
class BitmapDecoder : public ImageDecoder {
public:
@@ -51,16 +55,17 @@ public:
// ImageDecoder API
void destroy();
virtual bool loadStream(Common::SeekableReadStream &stream);
- virtual const Surface *getSurface() const { return _surface; }
+ virtual const Graphics::Surface *getSurface() const { return _surface; }
const byte *getPalette() const { return _palette; }
uint16 getPaletteColorCount() const { return _paletteColorCount; }
private:
- Surface *_surface;
+ Codec *_codec;
+ const Graphics::Surface *_surface;
byte *_palette;
uint16 _paletteColorCount;
};
-} // End of namespace Graphics
+} // End of namespace Image
#endif
diff --git a/image/codecs/bmp_raw.cpp b/image/codecs/bmp_raw.cpp
new file mode 100644
index 0000000000..83aedc84e6
--- /dev/null
+++ b/image/codecs/bmp_raw.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 "image/codecs/bmp_raw.h"
+
+#include "common/stream.h"
+#include "common/textconsole.h"
+#include "graphics/surface.h"
+
+namespace Image {
+
+BitmapRawDecoder::BitmapRawDecoder(int width, int height, int bitsPerPixel) : Codec(),
+ _surface(0), _width(width), _height(height), _bitsPerPixel(bitsPerPixel) {
+}
+
+BitmapRawDecoder::~BitmapRawDecoder() {
+ if (_surface) {
+ _surface->free();
+ delete _surface;
+ }
+}
+
+const Graphics::Surface *BitmapRawDecoder::decodeFrame(Common::SeekableReadStream &stream) {
+ Graphics::PixelFormat format = getPixelFormat();
+
+ _surface = new Graphics::Surface();
+ _surface->create(_width, _height, format);
+
+ int srcPitch = _width * (_bitsPerPixel >> 3);
+ const int extraDataLength = (srcPitch % 4) ? 4 - (srcPitch % 4) : 0;
+
+ if (_bitsPerPixel == 8) {
+ byte *dst = (byte *)_surface->getPixels();
+
+ for (int i = 0; i < _height; i++) {
+ stream.read(dst + (_height - i - 1) * _width, _width);
+ stream.skip(extraDataLength);
+ }
+ } else if (_bitsPerPixel == 24) {
+ byte *dst = (byte *)_surface->getBasePtr(0, _height - 1);
+
+ for (int i = 0; i < _height; i++) {
+ for (int j = 0; j < _width; j++) {
+ byte b = stream.readByte();
+ byte g = stream.readByte();
+ byte r = stream.readByte();
+ uint32 color = format.RGBToColor(r, g, b);
+
+ *((uint32 *)dst) = color;
+ dst += format.bytesPerPixel;
+ }
+
+ stream.skip(extraDataLength);
+ dst -= _surface->pitch * 2;
+ }
+ } else { // 32 bpp
+ byte *dst = (byte *)_surface->getBasePtr(0, _height - 1);
+
+ for (int i = 0; i < _height; i++) {
+ for (int j = 0; j < _width; j++) {
+ byte b = stream.readByte();
+ byte g = stream.readByte();
+ byte r = stream.readByte();
+ // Ignore the last byte, as in v3 it is unused
+ // and should thus NOT be used as alpha.
+ // ref: http://msdn.microsoft.com/en-us/library/windows/desktop/dd183376%28v=vs.85%29.aspx
+ stream.readByte();
+ uint32 color = format.RGBToColor(r, g, b);
+
+ *((uint32 *)dst) = color;
+ dst += format.bytesPerPixel;
+ }
+
+ stream.skip(extraDataLength);
+ dst -= _surface->pitch * 2;
+ }
+ }
+
+ return _surface;
+}
+
+Graphics::PixelFormat BitmapRawDecoder::getPixelFormat() const {
+ switch (_bitsPerPixel) {
+ case 8:
+ return Graphics::PixelFormat::createFormatCLUT8();
+ case 24:
+ case 32:
+ return Graphics::PixelFormat(4, 8, 8, 8, 8, 8, 16, 24, 0);
+ }
+
+ error("Unhandled BMP raw %dbpp", _bitsPerPixel);
+}
+
+} // End of namespace Image
diff --git a/image/codecs/bmp_raw.h b/image/codecs/bmp_raw.h
new file mode 100644
index 0000000000..99509a1708
--- /dev/null
+++ b/image/codecs/bmp_raw.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 IMAGE_CODECS_BMP_RAW_H
+#define IMAGE_CODECS_BMP_RAW_H
+
+#include "image/codecs/codec.h"
+
+namespace Image {
+
+/**
+ * Bitmap raw image decoder.
+ *
+ * Used by BMP/AVI.
+ */
+class BitmapRawDecoder : public Codec {
+public:
+ BitmapRawDecoder(int width, int height, int bitsPerPixel);
+ ~BitmapRawDecoder();
+
+ const Graphics::Surface *decodeFrame(Common::SeekableReadStream &stream);
+ Graphics::PixelFormat getPixelFormat() const;
+
+private:
+ Graphics::Surface *_surface;
+ int _width, _height;
+ int _bitsPerPixel;
+};
+
+} // End of namespace Image
+
+#endif
diff --git a/video/codecs/cdtoons.cpp b/image/codecs/cdtoons.cpp
index 68925ed0db..6a2dc51b86 100644
--- a/video/codecs/cdtoons.cpp
+++ b/image/codecs/cdtoons.cpp
@@ -8,25 +8,25 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public 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 "video/codecs/cdtoons.h"
+#include "image/codecs/cdtoons.h"
#include "common/rect.h"
#include "common/stream.h"
#include "common/textconsole.h"
#include "common/array.h"
-namespace Video {
+namespace Image {
struct CDToonsAction {
uint16 blockId;
@@ -39,12 +39,12 @@ struct CDToonsDiff {
Common::Rect rect;
};
-static Common::Rect readRect(Common::SeekableReadStream *stream) {
+static Common::Rect readRect(Common::SeekableReadStream &stream) {
Common::Rect rect;
- rect.top = stream->readUint16BE();
- rect.left = stream->readUint16BE();
- rect.bottom = stream->readUint16BE();
- rect.right = stream->readUint16BE();
+ rect.top = stream.readUint16BE();
+ rect.left = stream.readUint16BE();
+ rect.bottom = stream.readUint16BE();
+ rect.right = stream.readUint16BE();
return rect;
}
@@ -67,14 +67,14 @@ CDToonsDecoder::~CDToonsDecoder() {
delete[] i->_value.data;
}
-Graphics::Surface *CDToonsDecoder::decodeImage(Common::SeekableReadStream *stream) {
- uint16 u0 = stream->readUint16BE(); // always 9?
- uint16 frameId = stream->readUint16BE();
- uint16 blocksValidUntil = stream->readUint16BE();
- byte u6 = stream->readByte();
- byte backgroundColor = stream->readByte();
+Graphics::Surface *CDToonsDecoder::decodeFrame(Common::SeekableReadStream &stream) {
+ uint16 u0 = stream.readUint16BE(); // always 9?
+ uint16 frameId = stream.readUint16BE();
+ uint16 blocksValidUntil = stream.readUint16BE();
+ byte u6 = stream.readByte();
+ byte backgroundColor = stream.readByte();
debugN(5, "CDToons frame %d, size %d, unknown %04x (at 0), blocks valid until %d, unknown 6 is %02x, bkg color is %02x\n",
- frameId, stream->size(), u0, blocksValidUntil, u6, backgroundColor);
+ frameId, stream.size(), u0, blocksValidUntil, u6, backgroundColor);
Common::Rect clipRect = readRect(stream);
debugN(9, "CDToons clipRect: (%d, %d) to (%d, %d)\n",
@@ -84,31 +84,31 @@ Graphics::Surface *CDToonsDecoder::decodeImage(Common::SeekableReadStream *strea
debugN(9, "CDToons dirtyRect: (%d, %d) to (%d, %d)\n",
dirtyRect.left, dirtyRect.top, dirtyRect.right, dirtyRect.bottom);
- uint32 flags = stream->readUint32BE();
+ uint32 flags = stream.readUint32BE();
if (flags & 0x80)
error("CDToons: frame already processed?");
debugN(5, "CDToons flags: %08x\n", flags);
- uint16 blockCount = stream->readUint16BE();
- uint16 blockOffset = stream->readUint16BE();
+ uint16 blockCount = stream.readUint16BE();
+ uint16 blockOffset = stream.readUint16BE();
debugN(9, "CDToons: %d blocks at 0x%04x\n",
blockCount, blockOffset);
// max block id?
- uint16 u32 = stream->readUint16BE();
+ uint16 u32 = stream.readUint16BE();
debugN(5, "CDToons unknown at 32: %04x\n", u32);
- byte actionCount = stream->readByte();
- byte u35 = stream->readByte();
+ byte actionCount = stream.readByte();
+ byte u35 = stream.readByte();
- uint16 paletteId = stream->readUint16BE();
- byte paletteSet = stream->readByte();
+ uint16 paletteId = stream.readUint16BE();
+ byte paletteSet = stream.readByte();
debugN(9, "CDToons palette id %04x, palette byte %02x\n",
paletteId, paletteSet);
- byte u39 = stream->readByte();
- uint16 u40 = stream->readUint16BE();
- uint16 u42 = stream->readUint16BE();
+ byte u39 = stream.readByte();
+ uint16 u40 = stream.readUint16BE();
+ uint16 u42 = stream.readUint16BE();
debugN(5, "CDToons: unknown at 35 is %02x, unknowns at 39: %02x, %04x, %04x\n",
u35, u39, u40, u42);
@@ -116,41 +116,41 @@ Graphics::Surface *CDToonsDecoder::decodeImage(Common::SeekableReadStream *strea
for (uint i = 0; i < actionCount; i++) {
CDToonsAction action;
- action.blockId = stream->readUint16BE();
+ action.blockId = stream.readUint16BE();
action.rect = readRect(stream);
debugN(9, "CDToons action: render block %d at (%d, %d) to (%d, %d)\n",
action.blockId, action.rect.left, action.rect.top, action.rect.right, action.rect.bottom);
actions.push_back(action);
}
- if (stream->pos() > blockOffset)
+ if (stream.pos() > blockOffset)
error("CDToons header ended at 0x%08x, but blocks should have started at 0x%08x",
- stream->pos(), blockOffset);
+ stream.pos(), blockOffset);
- if (stream->pos() != blockOffset)
- error("CDToons had %d unknown bytes after header", blockOffset - stream->pos());
+ if (stream.pos() != blockOffset)
+ error("CDToons had %d unknown bytes after header", blockOffset - stream.pos());
for (uint i = 0; i < blockCount; i++) {
- uint16 blockId = stream->readUint16BE();
+ uint16 blockId = stream.readUint16BE();
if (blockId >= 1200)
error("CDToons: block id %d was too high", blockId);
if (_blocks.contains(blockId))
error("CDToons: new block %d was already seen", blockId);
CDToonsBlock block;
- block.flags = stream->readUint16BE();
+ block.flags = stream.readUint16BE();
// flag 1 = palette, flag 2 = data?
if (block.flags & 0x8000)
error("CDToons: block already processed?");
- block.size = stream->readUint32BE();
+ block.size = stream.readUint32BE();
if (block.size < 14)
error("CDToons: block size was %d, too small", block.size);
block.size -= 14;
- block.startFrame = stream->readUint16BE();
- block.endFrame = stream->readUint16BE();
- block.unknown12 = stream->readUint16BE();
+ block.startFrame = stream.readUint16BE();
+ block.endFrame = stream.readUint16BE();
+ block.unknown12 = stream.readUint16BE();
block.data = new byte[block.size];
- stream->read(block.data, block.size);
+ stream.read(block.data, block.size);
debugN(9, "CDToons block id 0x%04x of size 0x%08x, flags %04x, from frame %d to %d, unknown at 12 is %04x\n",
blockId, block.size, block.flags, block.startFrame, block.endFrame, block.unknown12);
@@ -162,16 +162,16 @@ Graphics::Surface *CDToonsDecoder::decodeImage(Common::SeekableReadStream *strea
Common::Array<CDToonsDiff> diffs;
while (true) {
- int32 nextPos = stream->pos();
- uint32 tag = stream->readUint32BE();
- uint32 size = stream->readUint32BE();
+ int32 nextPos = stream.pos();
+ uint32 tag = stream.readUint32BE();
+ uint32 size = stream.readUint32BE();
nextPos += size;
switch (tag) {
case MKTAG('D','i','f','f'):
{
debugN(5, "CDToons: Diff\n");
- uint16 count = stream->readUint16BE();
+ uint16 count = stream.readUint16BE();
Common::Rect diffClipRect = readRect(stream);
debugN(9, "CDToons diffClipRect: (%d, %d) to (%d, %d)\n",
@@ -182,14 +182,14 @@ Graphics::Surface *CDToonsDecoder::decodeImage(Common::SeekableReadStream *strea
CDToonsDiff diff;
diff.rect = readRect(stream);
- diff.size = stream->readUint32BE();
+ diff.size = stream.readUint32BE();
if (diff.size < 20)
error("CDToons: Diff block size was %d, too small", diff.size);
- uint16 diffWidth = stream->readUint16BE();
- uint16 diffHeight = stream->readUint16BE();
- uint16 unknown16 = stream->readUint16BE();
- uint16 unknown18 = stream->readUint16BE();
+ uint16 diffWidth = stream.readUint16BE();
+ uint16 diffHeight = stream.readUint16BE();
+ uint16 unknown16 = stream.readUint16BE();
+ uint16 unknown18 = stream.readUint16BE();
diff.size -= 8;
if (diffWidth != diff.rect.width() || diffHeight != diff.rect.height())
@@ -199,7 +199,7 @@ Graphics::Surface *CDToonsDecoder::decodeImage(Common::SeekableReadStream *strea
unknown16, unknown18);
diff.data = new byte[diff.size];
- stream->read(diff.data, diff.size);
+ stream.read(diff.data, diff.size);
diffs.push_back(diff);
}
}
@@ -212,8 +212,8 @@ Graphics::Surface *CDToonsDecoder::decodeImage(Common::SeekableReadStream *strea
if (xFrmBegin)
error("CDToons: duplicate XFrm");
- xFrmBegin = stream->readByte();
- xFrmCount = stream->readByte();
+ xFrmBegin = stream.readByte();
+ xFrmCount = stream.readByte();
debugN(9, "CDToons XFrm: run %d actions from %d\n", xFrmCount, xFrmBegin - 1);
// TODO: don't ignore (if xFrmCount is non-zero)
@@ -248,7 +248,7 @@ Graphics::Surface *CDToonsDecoder::decodeImage(Common::SeekableReadStream *strea
if (!(flags & 0x40))
error("CDToons: useless FrtR?");
- uint16 count = stream->readUint16BE();
+ uint16 count = stream.readUint16BE();
debugN(9, "CDToons FrtR: %d dirty rectangles\n", count);
for (uint i = 0; i < count; i++) {
Common::Rect dirtyRectFrtR = readRect(stream);
@@ -263,7 +263,7 @@ Graphics::Surface *CDToonsDecoder::decodeImage(Common::SeekableReadStream *strea
if (!(flags & 0x20))
error("CDToons: useless BckR?");
- uint16 count = stream->readUint16BE();
+ uint16 count = stream.readUint16BE();
debugN(9, "CDToons BckR: %d subentries\n", count);
for (uint i = 0; i < count; i++) {
Common::Rect dirtyRectBckR = readRect(stream);
@@ -276,15 +276,15 @@ Graphics::Surface *CDToonsDecoder::decodeImage(Common::SeekableReadStream *strea
warning("Unknown CDToons tag '%s'", tag2str(tag));
}
- if (stream->pos() > nextPos)
+ if (stream.pos() > nextPos)
error("CDToons ran off the end of a block while reading it (at %d, next block at %d)",
- stream->pos(), nextPos);
- if (stream->pos() != nextPos) {
- warning("CDToons had %d unknown bytes after block", nextPos - stream->pos());
- stream->seek(nextPos);
+ stream.pos(), nextPos);
+ if (stream.pos() != nextPos) {
+ warning("CDToons had %d unknown bytes after block", nextPos - stream.pos());
+ stream.seek(nextPos);
}
- if (stream->pos() == stream->size())
+ if (stream.pos() == stream.size())
break;
}
@@ -445,4 +445,4 @@ void CDToonsDecoder::setPalette(byte *data) {
_palette[0] = _palette[1] = _palette[2] = 0;
}
-} // End of namespace Video
+} // End of namespace Image
diff --git a/video/codecs/cdtoons.h b/image/codecs/cdtoons.h
index 74d30ce8ea..889ec3ea1d 100644
--- a/video/codecs/cdtoons.h
+++ b/image/codecs/cdtoons.h
@@ -8,26 +8,26 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public 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_CODECS_CDTOONS_H
-#define VIDEO_CODECS_CDTOONS_H
+#ifndef IMAGE_CODECS_CDTOONS_H
+#define IMAGE_CODECS_CDTOONS_H
-#include "video/codecs/codec.h"
+#include "image/codecs/codec.h"
#include "common/hashmap.h"
-namespace Video {
+namespace Image {
struct CDToonsBlock {
uint16 flags;
@@ -41,15 +41,14 @@ struct CDToonsBlock {
/**
* Broderbund CDToons decoder.
*
- * Used in video:
- * - QuickTimeDecoder
+ * Used by PICT/QuickTime.
*/
class CDToonsDecoder : public Codec {
public:
CDToonsDecoder(uint16 width, uint16 height);
~CDToonsDecoder();
- Graphics::Surface *decodeImage(Common::SeekableReadStream *stream);
+ Graphics::Surface *decodeFrame(Common::SeekableReadStream &stream);
Graphics::PixelFormat getPixelFormat() const { return Graphics::PixelFormat::createFormatCLUT8(); }
bool containsPalette() const { return true; }
const byte *getPalette() { _dirtyPalette = false; return _palette; }
@@ -67,6 +66,6 @@ private:
void setPalette(byte *data);
};
-} // End of namespace Video
+} // End of namespace Image
#endif
diff --git a/video/codecs/cinepak.cpp b/image/codecs/cinepak.cpp
index a7782f4192..8d5dbceb4a 100644
--- a/video/codecs/cinepak.cpp
+++ b/image/codecs/cinepak.cpp
@@ -8,19 +8,19 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public 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 "video/codecs/cinepak.h"
+#include "image/codecs/cinepak.h"
#include "common/debug.h"
#include "common/stream.h"
@@ -32,7 +32,7 @@
// Code here partially based off of ffmpeg ;)
-namespace Video {
+namespace Image {
#define PUT_PIXEL(offset, lum, u, v) \
if (_pixelFormat.bytesPerPixel != 1) { \
@@ -83,13 +83,13 @@ CinepakDecoder::~CinepakDecoder() {
delete[] _clipTableBuf;
}
-const Graphics::Surface *CinepakDecoder::decodeImage(Common::SeekableReadStream *stream) {
- _curFrame.flags = stream->readByte();
- _curFrame.length = (stream->readByte() << 16);
- _curFrame.length |= stream->readUint16BE();
- _curFrame.width = stream->readUint16BE();
- _curFrame.height = stream->readUint16BE();
- _curFrame.stripCount = stream->readUint16BE();
+const Graphics::Surface *CinepakDecoder::decodeFrame(Common::SeekableReadStream &stream) {
+ _curFrame.flags = stream.readByte();
+ _curFrame.length = (stream.readByte() << 16);
+ _curFrame.length |= stream.readUint16BE();
+ _curFrame.width = stream.readUint16BE();
+ _curFrame.height = stream.readUint16BE();
+ _curFrame.stripCount = stream.readUint16BE();
if (_curFrame.strips == NULL)
_curFrame.strips = new CinepakStrip[_curFrame.stripCount];
@@ -98,11 +98,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)
- stream->readUint32BE();
- else if ((stream->size() % _curFrame.length) == 0)
- stream->seek(-2, SEEK_CUR);
+ if (_curFrame.length != (uint32)stream.size()) {
+ if (stream.readUint16BE() == 0xFE00)
+ stream.readUint32BE();
+ else if ((stream.size() % _curFrame.length) == 0)
+ stream.seek(-2, SEEK_CUR);
}
if (!_curFrame.surface) {
@@ -121,29 +121,29 @@ const Graphics::Surface *CinepakDecoder::decodeImage(Common::SeekableReadStream
}
}
- _curFrame.strips[i].id = stream->readUint16BE();
- _curFrame.strips[i].length = stream->readUint16BE() - 12; // Subtract the 12 byte header
- _curFrame.strips[i].rect.top = _y; stream->readUint16BE(); // Ignore, substitute with our own.
- _curFrame.strips[i].rect.left = 0; stream->readUint16BE(); // Ignore, substitute with our own
- _curFrame.strips[i].rect.bottom = _y + stream->readUint16BE();
- _curFrame.strips[i].rect.right = _curFrame.width; stream->readUint16BE(); // Ignore, substitute with our own
+ _curFrame.strips[i].id = stream.readUint16BE();
+ _curFrame.strips[i].length = stream.readUint16BE() - 12; // Subtract the 12 byte header
+ _curFrame.strips[i].rect.top = _y; stream.readUint16BE(); // Ignore, substitute with our own.
+ _curFrame.strips[i].rect.left = 0; stream.readUint16BE(); // Ignore, substitute with our own
+ _curFrame.strips[i].rect.bottom = _y + stream.readUint16BE();
+ _curFrame.strips[i].rect.right = _curFrame.width; stream.readUint16BE(); // Ignore, substitute with our own
// Sanity check. Because Cinepak is based on 4x4 blocks, the width and height of each strip needs to be divisible by 4.
assert(!(_curFrame.strips[i].rect.width() % 4) && !(_curFrame.strips[i].rect.height() % 4));
- uint32 pos = stream->pos();
+ uint32 pos = stream.pos();
- while ((uint32)stream->pos() < (pos + _curFrame.strips[i].length) && !stream->eos()) {
- byte chunkID = stream->readByte();
+ while ((uint32)stream.pos() < (pos + _curFrame.strips[i].length) && !stream.eos()) {
+ byte chunkID = stream.readByte();
- if (stream->eos())
+ if (stream.eos())
break;
// Chunk Size is 24-bit, ignore the first 4 bytes
- uint32 chunkSize = stream->readByte() << 16;
- chunkSize += stream->readUint16BE() - 4;
+ uint32 chunkSize = stream.readByte() << 16;
+ chunkSize += stream.readUint16BE() - 4;
- int32 startPos = stream->pos();
+ int32 startPos = stream.pos();
switch (chunkID) {
case 0x20:
@@ -168,8 +168,8 @@ const Graphics::Surface *CinepakDecoder::decodeImage(Common::SeekableReadStream
return _curFrame.surface;
}
- if (stream->pos() != startPos + (int32)chunkSize)
- stream->seek(startPos + chunkSize);
+ if (stream.pos() != startPos + (int32)chunkSize)
+ stream.seek(startPos + chunkSize);
}
_y = _curFrame.strips[i].rect.bottom;
@@ -178,32 +178,32 @@ const Graphics::Surface *CinepakDecoder::decodeImage(Common::SeekableReadStream
return _curFrame.surface;
}
-void CinepakDecoder::loadCodebook(Common::SeekableReadStream *stream, uint16 strip, byte codebookType, byte chunkID, uint32 chunkSize) {
+void CinepakDecoder::loadCodebook(Common::SeekableReadStream &stream, uint16 strip, byte codebookType, byte chunkID, uint32 chunkSize) {
CinepakCodebook *codebook = (codebookType == 1) ? _curFrame.strips[strip].v1_codebook : _curFrame.strips[strip].v4_codebook;
- int32 startPos = stream->pos();
+ int32 startPos = stream.pos();
uint32 flag = 0, mask = 0;
for (uint16 i = 0; i < 256; i++) {
if ((chunkID & 0x01) && !(mask >>= 1)) {
- if ((stream->pos() - startPos + 4) > (int32)chunkSize)
+ if ((stream.pos() - startPos + 4) > (int32)chunkSize)
break;
- flag = stream->readUint32BE();
+ flag = stream.readUint32BE();
mask = 0x80000000;
}
if (!(chunkID & 0x01) || (flag & mask)) {
byte n = (chunkID & 0x04) ? 4 : 6;
- if ((stream->pos() - startPos + n) > (int32)chunkSize)
+ if ((stream.pos() - startPos + n) > (int32)chunkSize)
break;
for (byte j = 0; j < 4; j++)
- codebook[i].y[j] = stream->readByte();
+ codebook[i].y[j] = stream.readByte();
if (n == 6) {
- codebook[i].u = stream->readSByte();
- codebook[i].v = stream->readSByte();
+ codebook[i].u = stream.readSByte();
+ codebook[i].v = stream.readSByte();
} else {
// This codebook type indicates either greyscale or
// palettized video. For greyscale, default us to
@@ -215,10 +215,10 @@ void CinepakDecoder::loadCodebook(Common::SeekableReadStream *stream, uint16 str
}
}
-void CinepakDecoder::decodeVectors(Common::SeekableReadStream *stream, uint16 strip, byte chunkID, uint32 chunkSize) {
+void CinepakDecoder::decodeVectors(Common::SeekableReadStream &stream, uint16 strip, byte chunkID, uint32 chunkSize) {
uint32 flag = 0, mask = 0;
uint32 iy[4];
- int32 startPos = stream->pos();
+ int32 startPos = stream.pos();
for (uint16 y = _curFrame.strips[strip].rect.top; y < _curFrame.strips[strip].rect.bottom; y += 4) {
iy[0] = _curFrame.strips[strip].rect.left + y * _curFrame.width;
@@ -228,28 +228,28 @@ void CinepakDecoder::decodeVectors(Common::SeekableReadStream *stream, uint16 st
for (uint16 x = _curFrame.strips[strip].rect.left; x < _curFrame.strips[strip].rect.right; x += 4) {
if ((chunkID & 0x01) && !(mask >>= 1)) {
- if ((stream->pos() - startPos + 4) > (int32)chunkSize)
+ if ((stream.pos() - startPos + 4) > (int32)chunkSize)
return;
- flag = stream->readUint32BE();
+ flag = stream.readUint32BE();
mask = 0x80000000;
}
if (!(chunkID & 0x01) || (flag & mask)) {
if (!(chunkID & 0x02) && !(mask >>= 1)) {
- if ((stream->pos() - startPos + 4) > (int32)chunkSize)
+ if ((stream.pos() - startPos + 4) > (int32)chunkSize)
return;
- flag = stream->readUint32BE();
+ flag = stream.readUint32BE();
mask = 0x80000000;
}
if ((chunkID & 0x02) || (~flag & mask)) {
- if ((stream->pos() - startPos + 1) > (int32)chunkSize)
+ if ((stream.pos() - startPos + 1) > (int32)chunkSize)
return;
// Get the codebook
- CinepakCodebook codebook = _curFrame.strips[strip].v1_codebook[stream->readByte()];
+ CinepakCodebook codebook = _curFrame.strips[strip].v1_codebook[stream.readByte()];
PUT_PIXEL(iy[0] + 0, codebook.y[0], codebook.u, codebook.v);
PUT_PIXEL(iy[0] + 1, codebook.y[0], codebook.u, codebook.v);
@@ -271,28 +271,28 @@ void CinepakDecoder::decodeVectors(Common::SeekableReadStream *stream, uint16 st
PUT_PIXEL(iy[3] + 2, codebook.y[3], codebook.u, codebook.v);
PUT_PIXEL(iy[3] + 3, codebook.y[3], codebook.u, codebook.v);
} else if (flag & mask) {
- if ((stream->pos() - startPos + 4) > (int32)chunkSize)
+ if ((stream.pos() - startPos + 4) > (int32)chunkSize)
return;
- CinepakCodebook codebook = _curFrame.strips[strip].v4_codebook[stream->readByte()];
+ CinepakCodebook codebook = _curFrame.strips[strip].v4_codebook[stream.readByte()];
PUT_PIXEL(iy[0] + 0, codebook.y[0], codebook.u, codebook.v);
PUT_PIXEL(iy[0] + 1, codebook.y[1], codebook.u, codebook.v);
PUT_PIXEL(iy[1] + 0, codebook.y[2], codebook.u, codebook.v);
PUT_PIXEL(iy[1] + 1, codebook.y[3], codebook.u, codebook.v);
- codebook = _curFrame.strips[strip].v4_codebook[stream->readByte()];
+ codebook = _curFrame.strips[strip].v4_codebook[stream.readByte()];
PUT_PIXEL(iy[0] + 2, codebook.y[0], codebook.u, codebook.v);
PUT_PIXEL(iy[0] + 3, codebook.y[1], codebook.u, codebook.v);
PUT_PIXEL(iy[1] + 2, codebook.y[2], codebook.u, codebook.v);
PUT_PIXEL(iy[1] + 3, codebook.y[3], codebook.u, codebook.v);
- codebook = _curFrame.strips[strip].v4_codebook[stream->readByte()];
+ codebook = _curFrame.strips[strip].v4_codebook[stream.readByte()];
PUT_PIXEL(iy[2] + 0, codebook.y[0], codebook.u, codebook.v);
PUT_PIXEL(iy[2] + 1, codebook.y[1], codebook.u, codebook.v);
PUT_PIXEL(iy[3] + 0, codebook.y[2], codebook.u, codebook.v);
PUT_PIXEL(iy[3] + 1, codebook.y[3], codebook.u, codebook.v);
- codebook = _curFrame.strips[strip].v4_codebook[stream->readByte()];
+ codebook = _curFrame.strips[strip].v4_codebook[stream.readByte()];
PUT_PIXEL(iy[2] + 2, codebook.y[0], codebook.u, codebook.v);
PUT_PIXEL(iy[2] + 3, codebook.y[1], codebook.u, codebook.v);
PUT_PIXEL(iy[3] + 2, codebook.y[2], codebook.u, codebook.v);
@@ -306,4 +306,4 @@ void CinepakDecoder::decodeVectors(Common::SeekableReadStream *stream, uint16 st
}
}
-} // End of namespace Video
+} // End of namespace Image
diff --git a/video/codecs/cinepak.h b/image/codecs/cinepak.h
index f4adfd50fe..e9cd437730 100644
--- a/video/codecs/cinepak.h
+++ b/image/codecs/cinepak.h
@@ -8,32 +8,32 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public 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_CODECS_CINEPAK_H
-#define VIDEO_CODECS_CINEPAK_H
+#ifndef IMAGE_CODECS_CINEPAK_H
+#define IMAGE_CODECS_CINEPAK_H
#include "common/scummsys.h"
#include "common/rect.h"
#include "graphics/pixelformat.h"
-#include "video/codecs/codec.h"
+#include "image/codecs/codec.h"
namespace Common {
class SeekableReadStream;
}
-namespace Video {
+namespace Image {
struct CinepakCodebook {
// These are not in the normal YUV colorspace, but in the Cinepak YUV colorspace instead.
@@ -62,16 +62,14 @@ struct CinepakFrame {
/**
* Cinepak decoder.
*
- * Used in video:
- * - AVIDecoder
- * - QuickTimeDecoder
+ * Used by BMP/AVI and PICT/QuickTime.
*/
class CinepakDecoder : public Codec {
public:
CinepakDecoder(int bitsPerPixel = 24);
~CinepakDecoder();
- const Graphics::Surface *decodeImage(Common::SeekableReadStream *stream);
+ const Graphics::Surface *decodeFrame(Common::SeekableReadStream &stream);
Graphics::PixelFormat getPixelFormat() const { return _pixelFormat; }
private:
@@ -80,10 +78,10 @@ private:
Graphics::PixelFormat _pixelFormat;
byte *_clipTable, *_clipTableBuf;
- void loadCodebook(Common::SeekableReadStream *stream, uint16 strip, byte codebookType, byte chunkID, uint32 chunkSize);
- void decodeVectors(Common::SeekableReadStream *stream, uint16 strip, byte chunkID, uint32 chunkSize);
+ void loadCodebook(Common::SeekableReadStream &stream, uint16 strip, byte codebookType, byte chunkID, uint32 chunkSize);
+ void decodeVectors(Common::SeekableReadStream &stream, uint16 strip, byte chunkID, uint32 chunkSize);
};
-} // End of namespace Video
+} // End of namespace Image
#endif
diff --git a/image/codecs/codec.cpp b/image/codecs/codec.cpp
new file mode 100644
index 0000000000..6b0c7ebcfb
--- /dev/null
+++ b/image/codecs/codec.cpp
@@ -0,0 +1,117 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+
+ * You should have received a copy of the GNU General Public 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 "image/codecs/codec.h"
+
+#include "image/jpeg.h"
+#include "image/codecs/bmp_raw.h"
+#include "image/codecs/cdtoons.h"
+#include "image/codecs/cinepak.h"
+#include "image/codecs/indeo3.h"
+#include "image/codecs/mjpeg.h"
+#include "image/codecs/mpeg.h"
+#include "image/codecs/msvideo1.h"
+#include "image/codecs/msrle.h"
+#include "image/codecs/qtrle.h"
+#include "image/codecs/rpza.h"
+#include "image/codecs/smc.h"
+#include "image/codecs/svq1.h"
+#include "image/codecs/truemotion1.h"
+
+#include "common/endian.h"
+#include "common/textconsole.h"
+
+namespace Image {
+
+Codec *createBitmapCodec(uint32 tag, int width, int height, int bitsPerPixel) {
+ switch (tag) {
+ case SWAP_CONSTANT_32(0):
+ return new BitmapRawDecoder(width, height, bitsPerPixel);
+ case SWAP_CONSTANT_32(1):
+ return new MSRLEDecoder(width, height, bitsPerPixel);
+ case MKTAG('C','R','A','M'):
+ case MKTAG('m','s','v','c'):
+ case MKTAG('W','H','A','M'):
+ return new MSVideo1Decoder(width, height, bitsPerPixel);
+ case MKTAG('c','v','i','d'):
+ return new CinepakDecoder(bitsPerPixel);
+ case MKTAG('I','V','3','2'):
+ return new Indeo3Decoder(width, height);
+#ifdef IMAGE_CODECS_TRUEMOTION1_H
+ case MKTAG('D','U','C','K'):
+ case MKTAG('d','u','c','k'):
+ return new TrueMotion1Decoder();
+#endif
+#ifdef USE_MPEG2
+ case MKTAG('m','p','g','2'):
+ return new MPEGDecoder();
+#endif
+ case MKTAG('M','J','P','G'):
+ case MKTAG('m','j','p','g'):
+ return new MJPEGDecoder();
+ default:
+ if (tag & 0x00FFFFFF)
+ warning("Unknown BMP/AVI compression format \'%s\'", tag2str(tag));
+ else
+ warning("Unknown BMP/AVI compression format %d", SWAP_BYTES_32(tag));
+ }
+
+ return 0;
+}
+
+Codec *createQuickTimeCodec(uint32 tag, int width, int height, int bitsPerPixel) {
+ switch (tag) {
+ case MKTAG('c','v','i','d'):
+ // Cinepak: As used by most Myst and all Riven videos as well as some Myst ME videos. "The Chief" videos also use this.
+ return new CinepakDecoder(bitsPerPixel);
+ case MKTAG('r','p','z','a'):
+ // Apple Video ("Road Pizza"): Used by some Myst videos.
+ return new RPZADecoder(width, height);
+ case MKTAG('r','l','e',' '):
+ // QuickTime RLE: Used by some Myst ME videos.
+ return new QTRLEDecoder(width, height, bitsPerPixel);
+ case MKTAG('s','m','c',' '):
+ // Apple SMC: Used by some Myst videos.
+ return new SMCDecoder(width, height);
+ case MKTAG('S','V','Q','1'):
+ // Sorenson Video 1: Used by some Myst ME videos.
+ return new SVQ1Decoder(width, height);
+ case MKTAG('S','V','Q','3'):
+ // Sorenson Video 3: Used by some Myst ME videos.
+ warning("Sorenson Video 3 not yet supported");
+ break;
+ case MKTAG('j','p','e','g'):
+ // JPEG: Used by some Myst ME 10th Anniversary videos.
+ return new JPEGDecoder();
+ case MKTAG('Q','k','B','k'):
+ // CDToons: Used by most of the Broderbund games.
+ return new CDToonsDecoder(width, height);
+ default:
+ warning("Unsupported QuickTime codec \'%s\'", tag2str(tag));
+ }
+
+ return 0;
+}
+
+} // End of namespace Image
diff --git a/video/codecs/codec.h b/image/codecs/codec.h
index a4ad786bb0..d87758e65e 100644
--- a/video/codecs/codec.h
+++ b/image/codecs/codec.h
@@ -8,20 +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.
*
*/
-#ifndef VIDEO_CODECS_CODEC_H
-#define VIDEO_CODECS_CODEC_H
+#ifndef IMAGE_CODECS_CODEC_H
+#define IMAGE_CODECS_CODEC_H
#include "graphics/surface.h"
#include "graphics/pixelformat.h"
@@ -30,11 +30,23 @@ namespace Common {
class SeekableReadStream;
}
-namespace Video {
+namespace Image {
/**
- * An abstract representation of a video codec used for decoding
- * video frames.
+ * An abstract representation of a image codec.
+ *
+ * Unlike ImageDecoder, the entire info for a frame may not be present
+ * within the stream. The codec may rely on the supporting container
+ * for parameters and can also rely on a previous (or future) frame.
+ * When decoding, the previous frame may not destroyed and could be
+ * maintained for use in the next one.
+ *
+ * An ImageDecoder can always be a Codec, but a Codec may not necessarily
+ * be able to be an ImageDecoder.
+ *
+ * Used in image:
+ * - BitmapDecoder
+ * - PICTDecoder
*
* Used in video:
* - AVIDecoder
@@ -51,9 +63,8 @@ public:
* containing the decoded frame.
*
* @return a pointer to the decoded frame
- * @note stream is not deleted
*/
- virtual const Graphics::Surface *decodeImage(Common::SeekableReadStream *stream) = 0;
+ virtual const Graphics::Surface *decodeFrame(Common::SeekableReadStream &stream) = 0;
/**
* Get the format that the surface returned from decodeImage() will
@@ -77,6 +88,16 @@ public:
virtual bool hasDirtyPalette() const { return false; }
};
-} // End of namespace Video
+/**
+ * Create a codec given a bitmap/AVI compression tag.
+ */
+Codec *createBitmapCodec(uint32 tag, int width, int height, int bitsPerPixel);
+
+/**
+ * Create a codec given a QuickTime compression tag.
+ */
+Codec *createQuickTimeCodec(uint32 tag, int width, int height, int bitsPerPixel);
+
+} // End of namespace Image
#endif
diff --git a/video/codecs/indeo3.cpp b/image/codecs/indeo3.cpp
index 28e1a9c620..af9120ca93 100644
--- a/video/codecs/indeo3.cpp
+++ b/image/codecs/indeo3.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -36,9 +36,9 @@
#include "graphics/yuv_to_rgb.h"
-#include "video/codecs/indeo3.h"
+#include "image/codecs/indeo3.h"
-namespace Video {
+namespace Image {
Indeo3Decoder::Indeo3Decoder(uint16 width, uint16 height) : _ModPred(0), _corrector_type(0) {
_iv_frame[0].the_buf = 0;
@@ -165,24 +165,24 @@ void Indeo3Decoder::allocFrames() {
}
}
-const Graphics::Surface *Indeo3Decoder::decodeImage(Common::SeekableReadStream *stream) {
+const Graphics::Surface *Indeo3Decoder::decodeFrame(Common::SeekableReadStream &stream) {
// Not Indeo 3? Fail
- if (!isIndeo3(*stream))
+ if (!isIndeo3(stream))
return 0;
- stream->seek(12);
- uint32 frameDataLen = stream->readUint32LE();
+ stream.seek(12);
+ uint32 frameDataLen = stream.readUint32LE();
// Less data than the frame should have? Fail
- if (stream->size() < (int)(frameDataLen - 16))
+ if (stream.size() < (int)(frameDataLen - 16))
return 0;
- stream->seek(16); // Behind header
- stream->skip(2); // Unknown
+ stream.seek(16); // Behind header
+ stream.skip(2); // Unknown
- uint16 flags1 = stream->readUint16LE();
- uint32 flags3 = stream->readUint32LE();
- uint8 flags2 = stream->readByte();
+ uint16 flags1 = stream.readUint16LE();
+ uint32 flags3 = stream.readUint32LE();
+ uint8 flags2 = stream.readByte();
// Finding the reference frame
if (flags1 & 0x200) {
@@ -196,22 +196,22 @@ const Graphics::Surface *Indeo3Decoder::decodeImage(Common::SeekableReadStream *
if (flags3 == 0x80)
return _surface;
- stream->skip(3);
+ stream.skip(3);
- uint16 fHeight = stream->readUint16LE();
- uint16 fWidth = stream->readUint16LE();
+ uint16 fHeight = stream.readUint16LE();
+ uint16 fWidth = stream.readUint16LE();
uint32 chromaHeight = ((fHeight >> 2) + 3) & 0x7FFC;
uint32 chromaWidth = ((fWidth >> 2) + 3) & 0x7FFC;
uint32 offs;
- uint32 offsY = stream->readUint32LE() + 16;
- uint32 offsU = stream->readUint32LE() + 16;
- uint32 offsV = stream->readUint32LE() + 16;
+ uint32 offsY = stream.readUint32LE() + 16;
+ uint32 offsU = stream.readUint32LE() + 16;
+ uint32 offsV = stream.readUint32LE() + 16;
- stream->skip(4);
+ stream.skip(4);
- uint32 hPos = stream->pos();
+ uint32 hPos = stream.pos();
if (offsY < hPos) {
warning("Indeo3Decoder::decodeImage: offsY < hPos");
@@ -226,11 +226,11 @@ const Graphics::Surface *Indeo3Decoder::decodeImage(Common::SeekableReadStream *
return 0;
}
- uint32 dataSize = stream->size() - hPos;
+ uint32 dataSize = stream.size() - hPos;
byte *inData = new byte[dataSize];
- if (stream->read(inData, dataSize) != dataSize) {
+ if (stream.read(inData, dataSize) != dataSize) {
delete[] inData;
return 0;
}
@@ -239,23 +239,23 @@ const Graphics::Surface *Indeo3Decoder::decodeImage(Common::SeekableReadStream *
byte *buf_pos;
// Luminance Y
- stream->seek(offsY);
+ stream.seek(offsY);
buf_pos = inData + offsY + 4 - hPos;
- offs = stream->readUint32LE();
+ offs = stream.readUint32LE();
decodeChunk(_cur_frame->Ybuf, _ref_frame->Ybuf, fWidth, fHeight,
buf_pos + offs * 2, flags2, hdr_pos, buf_pos, MIN<int>(fWidth, 160));
// Chrominance U
- stream->seek(offsU);
+ stream.seek(offsU);
buf_pos = inData + offsU + 4 - hPos;
- offs = stream->readUint32LE();
+ offs = stream.readUint32LE();
decodeChunk(_cur_frame->Vbuf, _ref_frame->Vbuf, chromaWidth, chromaHeight,
buf_pos + offs * 2, flags2, hdr_pos, buf_pos, MIN<int>(chromaWidth, 40));
// Chrominance V
- stream->seek(offsV);
+ stream.seek(offsV);
buf_pos = inData + offsV + 4 - hPos;
- offs = stream->readUint32LE();
+ offs = stream.readUint32LE();
decodeChunk(_cur_frame->Ubuf, _ref_frame->Ubuf, chromaWidth, chromaHeight,
buf_pos + offs * 2, flags2, hdr_pos, buf_pos, MIN<int>(chromaWidth, 40));
@@ -3484,4 +3484,4 @@ const uint32 Indeo3Decoder::correctionhighorder[] = {
0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000
};
-} // End of namespace Video
+} // End of namespace Image
diff --git a/video/codecs/indeo3.h b/image/codecs/indeo3.h
index 880901df13..0ff0265250 100644
--- a/video/codecs/indeo3.h
+++ b/image/codecs/indeo3.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -29,18 +29,19 @@
* written, produced, and directed by Alan Smithee
*/
-#ifndef VIDEO_CODECS_INDEO3_H
-#define VIDEO_CODECS_INDEO3_H
+#ifndef IMAGE_CODECS_INDEO3_H
+#define IMAGE_CODECS_INDEO3_H
-#include "video/codecs/codec.h"
+#include "image/codecs/codec.h"
-namespace Video {
+namespace Image {
/**
* Intel Indeo 3 decoder.
*
+ * Used by BMP/AVI.
+ *
* Used in video:
- * - AVIDecoder
* - VMDDecoder
*/
class Indeo3Decoder : public Codec {
@@ -48,7 +49,7 @@ public:
Indeo3Decoder(uint16 width, uint16 height);
~Indeo3Decoder();
- const Graphics::Surface *decodeImage(Common::SeekableReadStream *stream);
+ const Graphics::Surface *decodeFrame(Common::SeekableReadStream &stream);
Graphics::PixelFormat getPixelFormat() const;
static bool isIndeo3(Common::SeekableReadStream &stream);
@@ -89,6 +90,6 @@ private:
const byte *buf2, int min_width_160);
};
-} // End of namespace Video
+} // End of namespace Image
-#endif // VIDEO_CODECS_INDEO3_H
+#endif
diff --git a/image/codecs/mjpeg.cpp b/image/codecs/mjpeg.cpp
new file mode 100644
index 0000000000..4ad72f259d
--- /dev/null
+++ b/image/codecs/mjpeg.cpp
@@ -0,0 +1,217 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public 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 LGPL MJPEG/AVI to JPEG/JFIF conversion code from libav
+// Copyright (c) 2010 Adrian Daerr and Nicolas George
+// That in turn was adapted from mjpeg2jpeg.c, with original copyright:
+// Paris 2010 Adrian Daerr, public domain
+
+#include "common/memstream.h"
+#include "common/system.h"
+#include "common/textconsole.h"
+#include "graphics/surface.h"
+#include "image/jpeg.h"
+
+#include "image/codecs/mjpeg.h"
+
+namespace Common {
+class SeekableReadStream;
+}
+
+namespace Image {
+
+MJPEGDecoder::MJPEGDecoder() : Codec() {
+ _pixelFormat = g_system->getScreenFormat();
+ _surface = 0;
+}
+
+MJPEGDecoder::~MJPEGDecoder() {
+ if (_surface) {
+ _surface->free();
+ delete _surface;
+ }
+}
+
+// Header to be inserted
+static const byte s_jpegHeader[] = {
+ 0xff, 0xd8, // SOI
+ 0xff, 0xe0, // APP0
+ 0x00, 0x10, // APP0 header size (including
+ // this field, but excluding preceding)
+ 'J', 'F', 'I', 'F', 0x00, // ID string 'JFIF\0'
+ 0x01, 0x01, // version
+ 0x00, // bits per type
+ 0x00, 0x00, // X density
+ 0x00, 0x00, // Y density
+ 0x00, // X thumbnail size
+ 0x00
+};
+
+enum {
+ DHT_SEGMENT_SIZE = 420
+};
+
+static const byte s_dhtSegmentHead[] = { 0xFF, 0xC4, 0x01, 0xA2, 0x00 };
+static const byte s_dhtSegmentFrag[] = {
+ 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09,
+ 0x0a, 0x0b, 0x01, 0x00, 0x03, 0x01, 0x01, 0x01, 0x01, 0x01,
+ 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00
+};
+
+// Set up the standard Huffman tables (cf. JPEG standard section K.3)
+// IMPORTANT: these are only valid for 8-bit data precision!
+static const byte s_mjpegBitsDCLuminance[17] = {
+ /* 0-base */ 0, 0, 1, 5, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0
+};
+
+static const byte s_mjpegValDC[12] = {
+ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11
+};
+
+static const byte s_mjpegBitsDCChrominance[17] = {
+ /* 0-base */ 0, 0, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0
+};
+
+static const byte s_mjpegBitsACLuminance[17] = {
+ /* 0-base */ 0, 0, 2, 1, 3, 3, 2, 4, 3, 5, 5, 4, 4, 0, 0, 1, 0x7d
+};
+
+static const byte s_mjpegValACLuminance[] = {
+ 0x01, 0x02, 0x03, 0x00, 0x04, 0x11, 0x05, 0x12,
+ 0x21, 0x31, 0x41, 0x06, 0x13, 0x51, 0x61, 0x07,
+ 0x22, 0x71, 0x14, 0x32, 0x81, 0x91, 0xa1, 0x08,
+ 0x23, 0x42, 0xb1, 0xc1, 0x15, 0x52, 0xd1, 0xf0,
+ 0x24, 0x33, 0x62, 0x72, 0x82, 0x09, 0x0a, 0x16,
+ 0x17, 0x18, 0x19, 0x1a, 0x25, 0x26, 0x27, 0x28,
+ 0x29, 0x2a, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39,
+ 0x3a, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49,
+ 0x4a, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59,
+ 0x5a, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69,
+ 0x6a, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79,
+ 0x7a, 0x83, 0x84, 0x85, 0x86, 0x87, 0x88, 0x89,
+ 0x8a, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97, 0x98,
+ 0x99, 0x9a, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7,
+ 0xa8, 0xa9, 0xaa, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6,
+ 0xb7, 0xb8, 0xb9, 0xba, 0xc2, 0xc3, 0xc4, 0xc5,
+ 0xc6, 0xc7, 0xc8, 0xc9, 0xca, 0xd2, 0xd3, 0xd4,
+ 0xd5, 0xd6, 0xd7, 0xd8, 0xd9, 0xda, 0xe1, 0xe2,
+ 0xe3, 0xe4, 0xe5, 0xe6, 0xe7, 0xe8, 0xe9, 0xea,
+ 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, 0xf8,
+ 0xf9, 0xfa
+};
+
+static const byte s_mjpegBitsACChrominance[17] = {
+ /* 0-base */ 0, 0, 2, 1, 2, 4, 4, 3, 4, 7, 5, 4, 4, 0, 1, 2, 0x77
+};
+
+static const byte s_mjpegValACChrominance[] = {
+ 0x00, 0x01, 0x02, 0x03, 0x11, 0x04, 0x05, 0x21,
+ 0x31, 0x06, 0x12, 0x41, 0x51, 0x07, 0x61, 0x71,
+ 0x13, 0x22, 0x32, 0x81, 0x08, 0x14, 0x42, 0x91,
+ 0xa1, 0xb1, 0xc1, 0x09, 0x23, 0x33, 0x52, 0xf0,
+ 0x15, 0x62, 0x72, 0xd1, 0x0a, 0x16, 0x24, 0x34,
+ 0xe1, 0x25, 0xf1, 0x17, 0x18, 0x19, 0x1a, 0x26,
+ 0x27, 0x28, 0x29, 0x2a, 0x35, 0x36, 0x37, 0x38,
+ 0x39, 0x3a, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48,
+ 0x49, 0x4a, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58,
+ 0x59, 0x5a, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68,
+ 0x69, 0x6a, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78,
+ 0x79, 0x7a, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87,
+ 0x88, 0x89, 0x8a, 0x92, 0x93, 0x94, 0x95, 0x96,
+ 0x97, 0x98, 0x99, 0x9a, 0xa2, 0xa3, 0xa4, 0xa5,
+ 0xa6, 0xa7, 0xa8, 0xa9, 0xaa, 0xb2, 0xb3, 0xb4,
+ 0xb5, 0xb6, 0xb7, 0xb8, 0xb9, 0xba, 0xc2, 0xc3,
+ 0xc4, 0xc5, 0xc6, 0xc7, 0xc8, 0xc9, 0xca, 0xd2,
+ 0xd3, 0xd4, 0xd5, 0xd6, 0xd7, 0xd8, 0xd9, 0xda,
+ 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7, 0xe8, 0xe9,
+ 0xea, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, 0xf8,
+ 0xf9, 0xfa
+};
+
+const Graphics::Surface *MJPEGDecoder::decodeFrame(Common::SeekableReadStream &stream) {
+ // We need to reconstruct an actual JPEG stream here, then feed it to the JPEG decoder
+ // Yes, this is a pain.
+
+ stream.readUint32BE(); // Skip nonsense JPEG header
+ uint16 inputSkip = stream.readUint16BE() + 4;
+ uint32 tag = stream.readUint32BE();
+
+ if (tag != MKTAG('A', 'V', 'I', '1')) {
+ warning("Invalid MJPEG tag found");
+ return 0;
+ }
+
+ uint32 outputSize = stream.size() - inputSkip + sizeof(s_jpegHeader) + DHT_SEGMENT_SIZE;
+ byte *data = (byte *)malloc(outputSize);
+
+ if (!data) {
+ warning("Failed to allocate data for MJPEG conversion");
+ return 0;
+ }
+
+ // Copy the header
+ memcpy(data, s_jpegHeader, sizeof(s_jpegHeader));
+ uint32 dataOffset = sizeof(s_jpegHeader);
+
+ // Write the fake DHT segment
+ memcpy(data + dataOffset, s_dhtSegmentHead, sizeof(s_dhtSegmentHead));
+ dataOffset += sizeof(s_dhtSegmentHead);
+ memcpy(data + dataOffset, s_mjpegBitsDCLuminance + 1, 16);
+ dataOffset += 16;
+ memcpy(data + dataOffset, s_dhtSegmentFrag, sizeof(s_dhtSegmentFrag));
+ dataOffset += sizeof(s_dhtSegmentFrag);
+ memcpy(data + dataOffset, s_mjpegValDC, 12);
+ dataOffset += 12;
+ data[dataOffset++] = 0x10;
+ memcpy(data + dataOffset, s_mjpegBitsACLuminance + 1, 16);
+ dataOffset += 16;
+ memcpy(data + dataOffset, s_mjpegValACLuminance, 162);
+ dataOffset += 162;
+ data[dataOffset++] = 0x11;
+ memcpy(data + dataOffset, s_mjpegBitsACChrominance + 1, 16);
+ dataOffset += 16;
+ memcpy(data + dataOffset, s_mjpegValACChrominance, 162);
+ dataOffset += 162;
+
+ // Write the actual data
+ stream.seek(inputSkip);
+ stream.read(data + dataOffset, stream.size() - inputSkip);
+
+ Common::MemoryReadStream convertedStream(data, outputSize, DisposeAfterUse::YES);
+ JPEGDecoder jpeg;
+
+ if (!jpeg.loadStream(convertedStream)) {
+ warning("Failed to decode MJPEG frame");
+ return 0;
+ }
+
+ if (_surface) {
+ _surface->free();
+ delete _surface;
+ }
+
+ _surface = jpeg.getSurface()->convertTo(_pixelFormat);
+
+ return _surface;
+}
+
+} // End of namespace Image
diff --git a/video/codecs/mjpeg.h b/image/codecs/mjpeg.h
index d71454799c..2db736c218 100644
--- a/video/codecs/mjpeg.h
+++ b/image/codecs/mjpeg.h
@@ -8,22 +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.
*
*/
-#ifndef VIDEO_CODECS_MJPEG_H
-#define VIDEO_CODECS_MJPEG_H
+#ifndef IMAGE_CODECS_MJPEG_H
+#define IMAGE_CODECS_MJPEG_H
-#include "video/codecs/codec.h"
+#include "image/codecs/codec.h"
#include "graphics/pixelformat.h"
namespace Common {
@@ -34,20 +34,19 @@ namespace Graphics {
struct Surface;
}
-namespace Video {
+namespace Image {
/**
* Motion JPEG decoder.
*
- * Used in video:
- * - QuickTimeDecoder
+ * Used by BMP/AVI.
*/
-class JPEGDecoder : public Codec {
+class MJPEGDecoder : public Codec {
public:
- JPEGDecoder();
- ~JPEGDecoder();
+ MJPEGDecoder();
+ ~MJPEGDecoder();
- const Graphics::Surface *decodeImage(Common::SeekableReadStream *stream);
+ const Graphics::Surface *decodeFrame(Common::SeekableReadStream &stream);
Graphics::PixelFormat getPixelFormat() const { return _pixelFormat; }
private:
@@ -55,6 +54,6 @@ private:
Graphics::Surface *_surface;
};
-} // End of namespace Video
+} // End of namespace Image
#endif
diff --git a/video/codecs/mpeg.cpp b/image/codecs/mpeg.cpp
index 4540b4182e..beb042dbf1 100644
--- a/video/codecs/mpeg.cpp
+++ b/image/codecs/mpeg.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -27,9 +27,9 @@
#include "graphics/surface.h"
#include "graphics/yuv_to_rgb.h"
-#include "video/codecs/mpeg.h"
+#include "image/codecs/mpeg.h"
-namespace Video {
+namespace Image {
MPEGDecoder::MPEGDecoder() : Codec() {
_pixelFormat = g_system->getScreenFormat();
@@ -52,13 +52,13 @@ MPEGDecoder::~MPEGDecoder() {
}
}
-const Graphics::Surface *MPEGDecoder::decodeImage(Common::SeekableReadStream *stream) {
+const Graphics::Surface *MPEGDecoder::decodeFrame(Common::SeekableReadStream &stream) {
uint32 framePeriod;
decodePacket(stream, framePeriod);
return _surface;
}
-bool MPEGDecoder::decodePacket(Common::SeekableReadStream *packet, uint32 &framePeriod, Graphics::Surface *dst) {
+bool MPEGDecoder::decodePacket(Common::SeekableReadStream &packet, uint32 &framePeriod, Graphics::Surface *dst) {
// Decode as much as we can out of this packet
uint32 size = 0xFFFFFFFF;
mpeg2_state_t state;
@@ -70,7 +70,7 @@ bool MPEGDecoder::decodePacket(Common::SeekableReadStream *packet, uint32 &frame
switch (state) {
case STATE_BUFFER:
- size = packet->read(_buffer, BUFFER_SIZE);
+ size = packet.read(_buffer, BUFFER_SIZE);
mpeg2_buffer(_mpegDecoder, _buffer, _buffer + size);
break;
case STATE_SLICE:
@@ -104,4 +104,4 @@ bool MPEGDecoder::decodePacket(Common::SeekableReadStream *packet, uint32 &frame
return foundFrame;
}
-} // End of namespace Video
+} // End of namespace Image
diff --git a/video/codecs/mpeg.h b/image/codecs/mpeg.h
index 0082844537..6cb10f21ac 100644
--- a/video/codecs/mpeg.h
+++ b/image/codecs/mpeg.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -22,10 +22,10 @@
#ifdef USE_MPEG2
-#ifndef VIDEO_CODECS_MPEG_H
-#define VIDEO_CODECS_MPEG_H
+#ifndef IMAGE_CODECS_MPEG_H
+#define IMAGE_CODECS_MPEG_H
-#include "video/codecs/codec.h"
+#include "image/codecs/codec.h"
#include "graphics/pixelformat.h"
#if defined(__PLAYSTATION2__)
@@ -37,7 +37,7 @@
typedef signed short int16_t;
typedef unsigned char uint8_t;
typedef unsigned short uint16_t;
-#elif defined(_MSC_VER)
+#elif defined(_MSC_VER) || defined (__SYMBIAN32__)
typedef signed char int8_t;
typedef signed short int16_t;
typedef unsigned char uint8_t;
@@ -62,21 +62,24 @@ namespace Graphics {
struct Surface;
}
-namespace Video {
-
-// MPEG 1/2 video decoder
+namespace Image {
+/**
+ * MPEG 1/2 video decoder.
+ *
+ * Used by BMP/AVI.
+ */
class MPEGDecoder : public Codec {
public:
MPEGDecoder();
~MPEGDecoder();
// Codec interface
- const Graphics::Surface *decodeImage(Common::SeekableReadStream *stream);
+ const Graphics::Surface *decodeFrame(Common::SeekableReadStream &stream);
Graphics::PixelFormat getPixelFormat() const { return _pixelFormat; }
// MPEGPSDecoder call
- bool decodePacket(Common::SeekableReadStream *packet, uint32 &framePeriod, Graphics::Surface *dst = 0);
+ bool decodePacket(Common::SeekableReadStream &packet, uint32 &framePeriod, Graphics::Surface *dst = 0);
private:
Graphics::PixelFormat _pixelFormat;
@@ -91,8 +94,8 @@ private:
const mpeg2_info_t *_mpegInfo;
};
-} // End of namespace Video
+} // End of namespace Image
-#endif // VIDEO_CODECS_MPEG_H
+#endif // IMAGE_CODECS_MPEG_H
#endif // USE_MPEG2
diff --git a/video/codecs/msrle.cpp b/image/codecs/msrle.cpp
index 2f2ac0334f..89fe869a9e 100644
--- a/video/codecs/msrle.cpp
+++ b/image/codecs/msrle.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -22,11 +22,11 @@
// Based off ffmpeg's msrledec.c
-#include "video/codecs/msrle.h"
+#include "image/codecs/msrle.h"
#include "common/stream.h"
#include "common/textconsole.h"
-namespace Video {
+namespace Image {
MSRLEDecoder::MSRLEDecoder(uint16 width, uint16 height, byte bitsPerPixel) {
_surface = new Graphics::Surface();
@@ -39,7 +39,7 @@ MSRLEDecoder::~MSRLEDecoder() {
delete _surface;
}
-const Graphics::Surface *MSRLEDecoder::decodeImage(Common::SeekableReadStream *stream) {
+const Graphics::Surface *MSRLEDecoder::decodeFrame(Common::SeekableReadStream &stream) {
if (_bitsPerPixel == 8) {
decode8(stream);
} else
@@ -48,7 +48,7 @@ const Graphics::Surface *MSRLEDecoder::decodeImage(Common::SeekableReadStream *s
return _surface;
}
-void MSRLEDecoder::decode8(Common::SeekableReadStream *stream) {
+void MSRLEDecoder::decode8(Common::SeekableReadStream &stream) {
int x = 0;
int y = _surface->h - 1;
@@ -60,9 +60,9 @@ void MSRLEDecoder::decode8(Common::SeekableReadStream *stream) {
byte *output = data + ((height - 1) * width);
byte *output_end = data + ((height) * width);
- while (!stream->eos()) {
- byte count = stream->readByte();
- byte value = stream->readByte();
+ while (!stream.eos()) {
+ byte count = stream.readByte();
+ byte value = stream.readByte();
if (count == 0) {
if (value == 0) {
@@ -84,8 +84,8 @@ void MSRLEDecoder::decode8(Common::SeekableReadStream *stream) {
} else if (value == 2) {
// Skip
- count = stream->readByte();
- value = stream->readByte();
+ count = stream.readByte();
+ value = stream.readByte();
y -= value;
x += count;
@@ -101,15 +101,15 @@ void MSRLEDecoder::decode8(Common::SeekableReadStream *stream) {
// Copy data
if (output + value > output_end) {
- stream->skip(value);
+ stream.skip(value);
continue;
}
for (int i = 0; i < value; i++)
- *output++ = stream->readByte();
+ *output++ = stream.readByte();
if (value & 1)
- stream->skip(1);
+ stream.skip(1);
x += value;
}
@@ -129,4 +129,4 @@ void MSRLEDecoder::decode8(Common::SeekableReadStream *stream) {
warning("MS RLE Codec: No end-of-picture code");
}
-} // End of namespace Video
+} // End of namespace Image
diff --git a/video/codecs/msrle.h b/image/codecs/msrle.h
index 64ebaaee51..116b1bcbf6 100644
--- a/video/codecs/msrle.h
+++ b/image/codecs/msrle.h
@@ -8,37 +8,36 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public 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_CODECS_MSRLE_H
-#define VIDEO_CODECS_MSRLE_H
+#ifndef IMAGE_CODECS_MSRLE_H
+#define IMAGE_CODECS_MSRLE_H
-#include "video/codecs/codec.h"
+#include "image/codecs/codec.h"
-namespace Video {
+namespace Image {
/**
* Microsoft Run-Length Encoding decoder.
*
- * Used in video:
- * - AVIDecoder
+ * Used by BMP/AVI.
*/
class MSRLEDecoder : public Codec {
public:
MSRLEDecoder(uint16 width, uint16 height, byte bitsPerPixel);
~MSRLEDecoder();
- const Graphics::Surface *decodeImage(Common::SeekableReadStream *stream);
+ const Graphics::Surface *decodeFrame(Common::SeekableReadStream &stream);
Graphics::PixelFormat getPixelFormat() const { return Graphics::PixelFormat::createFormatCLUT8(); }
private:
@@ -46,9 +45,9 @@ private:
Graphics::Surface *_surface;
- void decode8(Common::SeekableReadStream *stream);
+ void decode8(Common::SeekableReadStream &stream);
};
-} // End of namespace Video
+} // End of namespace Image
#endif
diff --git a/video/codecs/msvideo1.cpp b/image/codecs/msvideo1.cpp
index 409d588ddf..25d7395363 100644
--- a/video/codecs/msvideo1.cpp
+++ b/image/codecs/msvideo1.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -22,15 +22,15 @@
// Based off ffmpeg's msvideo.cpp
-#include "video/codecs/msvideo1.h"
+#include "image/codecs/msvideo1.h"
#include "common/stream.h"
#include "common/textconsole.h"
-namespace Video {
+namespace Image {
#define CHECK_STREAM_PTR(n) \
- if ((stream->pos() + n) > stream->size() ) { \
- warning ("MS Video-1: Stream out of bounds (%d >= %d)", stream->pos() + n, stream->size()); \
+ if ((stream.pos() + n) > stream.size() ) { \
+ warning ("MS Video-1: Stream out of bounds (%d >= %d)", stream.pos() + n, stream.size()); \
return; \
}
@@ -46,7 +46,7 @@ MSVideo1Decoder::~MSVideo1Decoder() {
delete _surface;
}
-void MSVideo1Decoder::decode8(Common::SeekableReadStream *stream) {
+void MSVideo1Decoder::decode8(Common::SeekableReadStream &stream) {
byte colors[8];
byte *pixels = (byte *)_surface->getPixels();
uint16 stride = _surface->w;
@@ -73,8 +73,8 @@ void MSVideo1Decoder::decode8(Common::SeekableReadStream *stream) {
/* get the next two bytes in the encoded data stream */
CHECK_STREAM_PTR(2);
- byte byte_a = stream->readByte();
- byte byte_b = stream->readByte();
+ byte byte_a = stream.readByte();
+ byte byte_b = stream.readByte();
/* check if the decode is finished */
if (byte_a == 0 && byte_b == 0 && totalBlocks == 0) {
@@ -87,8 +87,8 @@ void MSVideo1Decoder::decode8(Common::SeekableReadStream *stream) {
uint16 flags = (byte_b << 8) | byte_a;
CHECK_STREAM_PTR(2);
- colors[0] = stream->readByte();
- colors[1] = stream->readByte();
+ colors[0] = stream.readByte();
+ colors[1] = stream.readByte();
for (byte pixel_y = 0; pixel_y < 4; pixel_y++) {
for (byte pixel_x = 0; pixel_x < 4; pixel_x++, flags >>= 1)
@@ -101,7 +101,7 @@ void MSVideo1Decoder::decode8(Common::SeekableReadStream *stream) {
CHECK_STREAM_PTR(8);
for (byte i = 0; i < 8; i++)
- colors[i] = stream->readByte();
+ colors[i] = stream.readByte();
for (byte pixel_y = 0; pixel_y < 4; pixel_y++) {
for (byte pixel_x = 0; pixel_x < 4; pixel_x++, flags >>= 1)
@@ -125,7 +125,7 @@ void MSVideo1Decoder::decode8(Common::SeekableReadStream *stream) {
}
}
-const Graphics::Surface *MSVideo1Decoder::decodeImage(Common::SeekableReadStream *stream) {
+const Graphics::Surface *MSVideo1Decoder::decodeFrame(Common::SeekableReadStream &stream) {
if (_bitsPerPixel == 8)
decode8(stream);
else {
@@ -136,4 +136,4 @@ const Graphics::Surface *MSVideo1Decoder::decodeImage(Common::SeekableReadStream
return _surface;
}
-} // End of namespace Video
+} // End of namespace Image
diff --git a/video/codecs/msvideo1.h b/image/codecs/msvideo1.h
index 047d542743..2a6dcd0a9a 100644
--- a/video/codecs/msvideo1.h
+++ b/image/codecs/msvideo1.h
@@ -8,37 +8,36 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public 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_CODECS_MSVIDEO1_H
-#define VIDEO_CODECS_MSVIDEO1_H
+#ifndef IMAGE_CODECS_MSVIDEO1_H
+#define IMAGE_CODECS_MSVIDEO1_H
-#include "video/codecs/codec.h"
+#include "image/codecs/codec.h"
-namespace Video {
+namespace Image {
/**
* Microsoft Video 1 decoder.
*
- * Used in video:
- * - AVIDecoder
+ * Used by BMP/AVI.
*/
class MSVideo1Decoder : public Codec {
public:
MSVideo1Decoder(uint16 width, uint16 height, byte bitsPerPixel);
~MSVideo1Decoder();
- const Graphics::Surface *decodeImage(Common::SeekableReadStream *stream);
+ const Graphics::Surface *decodeFrame(Common::SeekableReadStream &stream);
Graphics::PixelFormat getPixelFormat() const { return Graphics::PixelFormat::createFormatCLUT8(); }
private:
@@ -46,10 +45,10 @@ private:
Graphics::Surface *_surface;
- void decode8(Common::SeekableReadStream *stream);
- //void decode16(Common::SeekableReadStream *stream);
+ void decode8(Common::SeekableReadStream &stream);
+ //void decode16(Common::SeekableReadStream &stream);
};
-} // End of namespace Video
+} // End of namespace Image
#endif
diff --git a/video/codecs/qtrle.cpp b/image/codecs/qtrle.cpp
index 1f1fee7997..94744efa5a 100644
--- a/video/codecs/qtrle.cpp
+++ b/image/codecs/qtrle.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -23,7 +23,7 @@
// QuickTime RLE Decoder
// Based off ffmpeg's QuickTime RLE decoder (written by Mike Melanson)
-#include "video/codecs/qtrle.h"
+#include "image/codecs/qtrle.h"
#include "common/debug.h"
#include "common/scummsys.h"
@@ -33,7 +33,7 @@
#include "graphics/colormasks.h"
#include "graphics/surface.h"
-namespace Video {
+namespace Image {
QTRLEDecoder::QTRLEDecoder(uint16 width, uint16 height, byte bitsPerPixel) : Codec() {
_bitsPerPixel = bitsPerPixel;
@@ -48,8 +48,8 @@ QTRLEDecoder::QTRLEDecoder(uint16 width, uint16 height, byte bitsPerPixel) : Cod
}
#define CHECK_STREAM_PTR(n) \
- if ((stream->pos() + n) > stream->size()) { \
- warning("QTRLE Problem: stream out of bounds (%d > %d)", stream->pos() + n, stream->size()); \
+ if ((stream.pos() + n) > stream.size()) { \
+ warning("QTRLE Problem: stream out of bounds (%d > %d)", stream.pos() + n, stream.size()); \
return; \
}
@@ -59,14 +59,14 @@ QTRLEDecoder::QTRLEDecoder(uint16 width, uint16 height, byte bitsPerPixel) : Cod
return; \
} \
-void QTRLEDecoder::decode1(Common::SeekableReadStream *stream, uint32 rowPtr, uint32 linesToChange) {
+void QTRLEDecoder::decode1(Common::SeekableReadStream &stream, uint32 rowPtr, uint32 linesToChange) {
uint32 pixelPtr = 0;
byte *rgb = (byte *)_surface->getPixels();
while (linesToChange) {
CHECK_STREAM_PTR(2);
- byte skip = stream->readByte();
- int8 rleCode = stream->readSByte();
+ byte skip = stream.readByte();
+ int8 rleCode = stream.readSByte();
if (rleCode == 0)
break;
@@ -83,8 +83,8 @@ void QTRLEDecoder::decode1(Common::SeekableReadStream *stream, uint32 rowPtr, ui
rleCode = -rleCode;
// get the next 2 bytes from the stream, treat them as groups of 8 pixels, and output them rleCode times */
CHECK_STREAM_PTR(2);
- byte pi0 = stream->readByte();
- byte pi1 = stream->readByte();
+ byte pi0 = stream.readByte();
+ byte pi1 = stream.readByte();
CHECK_PIXEL_PTR(rleCode * 2);
while (rleCode--) {
@@ -98,25 +98,25 @@ void QTRLEDecoder::decode1(Common::SeekableReadStream *stream, uint32 rowPtr, ui
CHECK_PIXEL_PTR(rleCode);
while (rleCode--)
- rgb[pixelPtr++] = stream->readByte();
+ rgb[pixelPtr++] = stream.readByte();
}
}
}
-void QTRLEDecoder::decode2_4(Common::SeekableReadStream *stream, uint32 rowPtr, uint32 linesToChange, byte bpp) {
+void QTRLEDecoder::decode2_4(Common::SeekableReadStream &stream, uint32 rowPtr, uint32 linesToChange, byte bpp) {
uint32 pixelPtr = 0;
byte *rgb = (byte *)_surface->getPixels();
byte numPixels = (bpp == 4) ? 8 : 16;
while (linesToChange--) {
CHECK_STREAM_PTR(2);
- pixelPtr = rowPtr + (numPixels * (stream->readByte() - 1));
+ pixelPtr = rowPtr + (numPixels * (stream.readByte() - 1));
- for (int8 rleCode = stream->readSByte(); rleCode != -1; rleCode = stream->readSByte()) {
+ for (int8 rleCode = stream.readSByte(); rleCode != -1; rleCode = stream.readSByte()) {
if (rleCode == 0) {
// there's another skip code in the stream
CHECK_STREAM_PTR(1);
- pixelPtr += (numPixels * (stream->readByte() - 1));
+ pixelPtr += (numPixels * (stream.readByte() - 1));
} else if (rleCode < 0) {
// decode the run length code
rleCode = -rleCode;
@@ -127,10 +127,10 @@ void QTRLEDecoder::decode2_4(Common::SeekableReadStream *stream, uint32 rowPtr,
byte pi[16]; // 16 palette indices
for (int8 i = numPixels - 1; i >= 0; i--) {
- pi[numPixels - 1 - i] = (stream->readByte() >> ((i * bpp) & 0x07)) & ((1 << bpp) - 1);
+ pi[numPixels - 1 - i] = (stream.readByte() >> ((i * bpp) & 0x07)) & ((1 << bpp) - 1);
if ((i & ((numPixels >> 2) - 1)) == 0)
- stream->readByte();
+ stream.readByte();
}
CHECK_PIXEL_PTR(rleCode * numPixels);
@@ -145,7 +145,7 @@ void QTRLEDecoder::decode2_4(Common::SeekableReadStream *stream, uint32 rowPtr,
CHECK_PIXEL_PTR(rleCode * (numPixels >> 2));
while (rleCode--) {
- byte temp = stream->readByte();
+ byte temp = stream.readByte();
if (bpp == 4) {
rgb[pixelPtr++] = (temp >> 4) & 0x0f;
rgb[pixelPtr++] = temp & 0x0f;
@@ -163,19 +163,19 @@ void QTRLEDecoder::decode2_4(Common::SeekableReadStream *stream, uint32 rowPtr,
}
}
-void QTRLEDecoder::decode8(Common::SeekableReadStream *stream, uint32 rowPtr, uint32 linesToChange) {
+void QTRLEDecoder::decode8(Common::SeekableReadStream &stream, uint32 rowPtr, uint32 linesToChange) {
uint32 pixelPtr = 0;
byte *rgb = (byte *)_surface->getPixels();
while (linesToChange--) {
CHECK_STREAM_PTR(2);
- pixelPtr = rowPtr + 4 * (stream->readByte() - 1);
+ pixelPtr = rowPtr + 4 * (stream.readByte() - 1);
- for (int8 rleCode = stream->readSByte(); rleCode != -1; rleCode = stream->readSByte()) {
+ for (int8 rleCode = stream.readSByte(); rleCode != -1; rleCode = stream.readSByte()) {
if (rleCode == 0) {
// there's another skip code in the stream
CHECK_STREAM_PTR(1);
- pixelPtr += 4 * (stream->readByte() - 1);
+ pixelPtr += 4 * (stream.readByte() - 1);
} else if (rleCode < 0) {
// decode the run length code
rleCode = -rleCode;
@@ -186,7 +186,7 @@ void QTRLEDecoder::decode8(Common::SeekableReadStream *stream, uint32 rowPtr, ui
byte pi[4]; // 4 palette indexes
for (byte i = 0; i < 4; i++)
- pi[i] = stream->readByte();
+ pi[i] = stream.readByte();
CHECK_PIXEL_PTR(rleCode * 4);
@@ -200,7 +200,7 @@ void QTRLEDecoder::decode8(Common::SeekableReadStream *stream, uint32 rowPtr, ui
CHECK_PIXEL_PTR(rleCode);
while (rleCode--)
- rgb[pixelPtr++] = stream->readByte();
+ rgb[pixelPtr++] = stream.readByte();
}
}
@@ -208,25 +208,25 @@ void QTRLEDecoder::decode8(Common::SeekableReadStream *stream, uint32 rowPtr, ui
}
}
-void QTRLEDecoder::decode16(Common::SeekableReadStream *stream, uint32 rowPtr, uint32 linesToChange) {
+void QTRLEDecoder::decode16(Common::SeekableReadStream &stream, uint32 rowPtr, uint32 linesToChange) {
uint32 pixelPtr = 0;
uint16 *rgb = (uint16 *)_surface->getPixels();
while (linesToChange--) {
CHECK_STREAM_PTR(2);
- pixelPtr = rowPtr + stream->readByte() - 1;
+ pixelPtr = rowPtr + stream.readByte() - 1;
- for (int8 rleCode = stream->readSByte(); rleCode != -1; rleCode = stream->readSByte()) {
+ for (int8 rleCode = stream.readSByte(); rleCode != -1; rleCode = stream.readSByte()) {
if (rleCode == 0) {
// there's another skip code in the stream
CHECK_STREAM_PTR(1);
- pixelPtr += stream->readByte() - 1;
+ pixelPtr += stream.readByte() - 1;
} else if (rleCode < 0) {
// decode the run length code
rleCode = -rleCode;
CHECK_STREAM_PTR(2);
- uint16 rgb16 = stream->readUint16BE();
+ uint16 rgb16 = stream.readUint16BE();
CHECK_PIXEL_PTR(rleCode);
@@ -238,7 +238,7 @@ void QTRLEDecoder::decode16(Common::SeekableReadStream *stream, uint32 rowPtr, u
// copy pixels directly to output
while (rleCode--)
- rgb[pixelPtr++] = stream->readUint16BE();
+ rgb[pixelPtr++] = stream.readUint16BE();
}
}
@@ -246,28 +246,28 @@ void QTRLEDecoder::decode16(Common::SeekableReadStream *stream, uint32 rowPtr, u
}
}
-void QTRLEDecoder::decode24(Common::SeekableReadStream *stream, uint32 rowPtr, uint32 linesToChange) {
+void QTRLEDecoder::decode24(Common::SeekableReadStream &stream, uint32 rowPtr, uint32 linesToChange) {
uint32 pixelPtr = 0;
uint32 *rgb = (uint32 *)_surface->getPixels();
while (linesToChange--) {
CHECK_STREAM_PTR(2);
- pixelPtr = rowPtr + stream->readByte() - 1;
+ pixelPtr = rowPtr + stream.readByte() - 1;
- for (int8 rleCode = stream->readSByte(); rleCode != -1; rleCode = stream->readSByte()) {
+ for (int8 rleCode = stream.readSByte(); rleCode != -1; rleCode = stream.readSByte()) {
if (rleCode == 0) {
// there's another skip code in the stream
CHECK_STREAM_PTR(1);
- pixelPtr += stream->readByte() - 1;
+ pixelPtr += stream.readByte() - 1;
} else if (rleCode < 0) {
// decode the run length code
rleCode = -rleCode;
CHECK_STREAM_PTR(3);
- byte r = stream->readByte();
- byte g = stream->readByte();
- byte b = stream->readByte();
+ byte r = stream.readByte();
+ byte g = stream.readByte();
+ byte b = stream.readByte();
uint32 color = _surface->format.RGBToColor(r, g, b);
CHECK_PIXEL_PTR(rleCode);
@@ -280,9 +280,9 @@ void QTRLEDecoder::decode24(Common::SeekableReadStream *stream, uint32 rowPtr, u
// copy pixels directly to output
while (rleCode--) {
- byte r = stream->readByte();
- byte g = stream->readByte();
- byte b = stream->readByte();
+ byte r = stream.readByte();
+ byte g = stream.readByte();
+ byte b = stream.readByte();
rgb[pixelPtr++] = _surface->format.RGBToColor(r, g, b);
}
}
@@ -292,29 +292,29 @@ void QTRLEDecoder::decode24(Common::SeekableReadStream *stream, uint32 rowPtr, u
}
}
-void QTRLEDecoder::decode32(Common::SeekableReadStream *stream, uint32 rowPtr, uint32 linesToChange) {
+void QTRLEDecoder::decode32(Common::SeekableReadStream &stream, uint32 rowPtr, uint32 linesToChange) {
uint32 pixelPtr = 0;
uint32 *rgb = (uint32 *)_surface->getPixels();
while (linesToChange--) {
CHECK_STREAM_PTR(2);
- pixelPtr = rowPtr + stream->readByte() - 1;
+ pixelPtr = rowPtr + stream.readByte() - 1;
- for (int8 rleCode = stream->readSByte(); rleCode != -1; rleCode = stream->readSByte()) {
+ for (int8 rleCode = stream.readSByte(); rleCode != -1; rleCode = stream.readSByte()) {
if (rleCode == 0) {
// there's another skip code in the stream
CHECK_STREAM_PTR(1);
- pixelPtr += stream->readByte() - 1;
+ pixelPtr += stream.readByte() - 1;
} else if (rleCode < 0) {
// decode the run length code
rleCode = -rleCode;
CHECK_STREAM_PTR(4);
- byte a = stream->readByte();
- byte r = stream->readByte();
- byte g = stream->readByte();
- byte b = stream->readByte();
+ byte a = stream.readByte();
+ byte r = stream.readByte();
+ byte g = stream.readByte();
+ byte b = stream.readByte();
uint32 color = _surface->format.ARGBToColor(a, r, g, b);
CHECK_PIXEL_PTR(rleCode);
@@ -327,10 +327,10 @@ void QTRLEDecoder::decode32(Common::SeekableReadStream *stream, uint32 rowPtr, u
// copy pixels directly to output
while (rleCode--) {
- byte a = stream->readByte();
- byte r = stream->readByte();
- byte g = stream->readByte();
- byte b = stream->readByte();
+ byte a = stream.readByte();
+ byte r = stream.readByte();
+ byte g = stream.readByte();
+ byte b = stream.readByte();
rgb[pixelPtr++] = _surface->format.ARGBToColor(a, r, g, b);
}
}
@@ -340,29 +340,29 @@ void QTRLEDecoder::decode32(Common::SeekableReadStream *stream, uint32 rowPtr, u
}
}
-const Graphics::Surface *QTRLEDecoder::decodeImage(Common::SeekableReadStream *stream) {
+const Graphics::Surface *QTRLEDecoder::decodeFrame(Common::SeekableReadStream &stream) {
uint16 startLine = 0;
uint16 height = _surface->h;
// check if this frame is even supposed to change
- if (stream->size() < 8)
+ if (stream.size() < 8)
return _surface;
// start after the chunk size
- stream->readUint32BE();
+ stream.readUint32BE();
// fetch the header
- uint16 header = stream->readUint16BE();
+ uint16 header = stream.readUint16BE();
// if a header is present, fetch additional decoding parameters
if (header & 8) {
- if (stream->size() < 14)
+ if (stream.size() < 14)
return _surface;
- startLine = stream->readUint16BE();
- stream->readUint16BE(); // Unknown
- height = stream->readUint16BE();
- stream->readUint16BE(); // Unknown
+ startLine = stream.readUint16BE();
+ stream.readUint16BE(); // Unknown
+ height = stream.readUint16BE();
+ stream.readUint16BE(); // Unknown
}
uint32 rowPtr = _surface->w * startLine;
@@ -428,4 +428,4 @@ Graphics::PixelFormat QTRLEDecoder::getPixelFormat() const {
return Graphics::PixelFormat();
}
-} // End of namespace Video
+} // End of namespace Image
diff --git a/video/codecs/qtrle.h b/image/codecs/qtrle.h
index a1dd9c9188..b44a46c3e2 100644
--- a/video/codecs/qtrle.h
+++ b/image/codecs/qtrle.h
@@ -8,38 +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
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public 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_CODECS_QTRLE_H
-#define VIDEO_CODECS_QTRLE_H
+#ifndef IMAGE_CODECS_QTRLE_H
+#define IMAGE_CODECS_QTRLE_H
#include "graphics/pixelformat.h"
-#include "video/codecs/codec.h"
+#include "image/codecs/codec.h"
-namespace Video {
+namespace Image {
/**
* QuickTime Run-Length Encoding decoder.
*
- * Used in video:
- * - QuickTimeDecoder
+ * Used by PICT/QuickTime.
*/
class QTRLEDecoder : public Codec {
public:
QTRLEDecoder(uint16 width, uint16 height, byte bitsPerPixel);
~QTRLEDecoder();
- const Graphics::Surface *decodeImage(Common::SeekableReadStream *stream);
+ const Graphics::Surface *decodeFrame(Common::SeekableReadStream &stream);
Graphics::PixelFormat getPixelFormat() const;
private:
@@ -47,14 +46,14 @@ private:
Graphics::Surface *_surface;
- void decode1(Common::SeekableReadStream *stream, uint32 rowPtr, uint32 linesToChange);
- void decode2_4(Common::SeekableReadStream *stream, uint32 rowPtr, uint32 linesToChange, byte bpp);
- void decode8(Common::SeekableReadStream *stream, uint32 rowPtr, uint32 linesToChange);
- void decode16(Common::SeekableReadStream *stream, uint32 rowPtr, uint32 linesToChange);
- void decode24(Common::SeekableReadStream *stream, uint32 rowPtr, uint32 linesToChange);
- void decode32(Common::SeekableReadStream *stream, uint32 rowPtr, uint32 linesToChange);
+ void decode1(Common::SeekableReadStream &stream, uint32 rowPtr, uint32 linesToChange);
+ void decode2_4(Common::SeekableReadStream &stream, uint32 rowPtr, uint32 linesToChange, byte bpp);
+ void decode8(Common::SeekableReadStream &stream, uint32 rowPtr, uint32 linesToChange);
+ void decode16(Common::SeekableReadStream &stream, uint32 rowPtr, uint32 linesToChange);
+ void decode24(Common::SeekableReadStream &stream, uint32 rowPtr, uint32 linesToChange);
+ void decode32(Common::SeekableReadStream &stream, uint32 rowPtr, uint32 linesToChange);
};
-} // End of namespace Video
+} // End of namespace Image
#endif
diff --git a/video/codecs/rpza.cpp b/image/codecs/rpza.cpp
index 17a2c53d9b..5aeee7c90b 100644
--- a/video/codecs/rpza.cpp
+++ b/image/codecs/rpza.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -22,14 +22,14 @@
// Based off ffmpeg's RPZA decoder
-#include "video/codecs/rpza.h"
+#include "image/codecs/rpza.h"
#include "common/debug.h"
#include "common/system.h"
#include "common/stream.h"
#include "common/textconsole.h"
-namespace Video {
+namespace Image {
RPZADecoder::RPZADecoder(uint16 width, uint16 height) : Codec() {
// We need to increase the surface size to a multiple of 4
@@ -61,7 +61,7 @@ RPZADecoder::~RPZADecoder() {
WRITE_UINT16((uint16 *)_surface->getPixels() + blockPtr, color); \
blockPtr++
-const Graphics::Surface *RPZADecoder::decodeImage(Common::SeekableReadStream *stream) {
+const Graphics::Surface *RPZADecoder::decodeFrame(Common::SeekableReadStream &stream) {
uint16 colorA = 0, colorB = 0;
uint16 color4[4];
@@ -73,40 +73,40 @@ const Graphics::Surface *RPZADecoder::decodeImage(Common::SeekableReadStream *st
uint16 tb;
// First byte is always 0xe1. Warn if it's different
- byte firstByte = stream->readByte();
+ byte firstByte = stream.readByte();
if (firstByte != 0xe1)
warning("First RPZA chunk byte is 0x%02x instead of 0xe1", firstByte);
// Get chunk size, ingnoring first byte
- uint32 chunkSize = stream->readUint16BE() << 8;
- chunkSize += stream->readByte();
+ uint32 chunkSize = stream.readUint16BE() << 8;
+ chunkSize += stream.readByte();
// If length mismatch use size from MOV file and try to decode anyway
- if (chunkSize != (uint32)stream->size()) {
+ if (chunkSize != (uint32)stream.size()) {
warning("MOV chunk size != encoded chunk size; using MOV chunk size");
- chunkSize = stream->size();
+ chunkSize = stream.size();
}
// Number of 4x4 blocks in frame
int32 totalBlocks = ((_surface->w + 3) / 4) * ((_surface->h + 3) / 4);
// Process chunk data
- while ((uint32)stream->pos() < chunkSize) {
- byte opcode = stream->readByte(); // Get opcode
+ while ((uint32)stream.pos() < chunkSize) {
+ byte opcode = stream.readByte(); // Get opcode
byte numBlocks = (opcode & 0x1f) + 1; // Extract block counter from opcode
// If opcode MSbit is 0, we need more data to decide what to do
if ((opcode & 0x80) == 0) {
- colorA = (opcode << 8) | stream->readByte();
+ colorA = (opcode << 8) | stream.readByte();
opcode = 0;
- if (stream->readByte() & 0x80) {
+ if (stream.readByte() & 0x80) {
// Must behave as opcode 110xxxxx, using colorA computed
// above. Use fake opcode 0x20 to enter switch block at
// the right place
opcode = 0x20;
numBlocks = 1;
}
- stream->seek(-1, SEEK_CUR);
+ stream.seek(-1, SEEK_CUR);
}
switch (opcode & 0xe0) {
@@ -116,7 +116,7 @@ const Graphics::Surface *RPZADecoder::decodeImage(Common::SeekableReadStream *st
}
break;
case 0xa0: // Fill blocks with one color
- colorA = stream->readUint16BE();
+ colorA = stream.readUint16BE();
while (numBlocks--) {
blockPtr = rowPtr + pixelPtr;
for (byte pixel_y = 0; pixel_y < 4; pixel_y++) {
@@ -131,9 +131,9 @@ const Graphics::Surface *RPZADecoder::decodeImage(Common::SeekableReadStream *st
// Fill blocks with 4 colors
case 0xc0:
- colorA = stream->readUint16BE();
+ colorA = stream.readUint16BE();
case 0x20:
- colorB = stream->readUint16BE();
+ colorB = stream.readUint16BE();
// Sort out the colors
color4[0] = colorB;
@@ -162,7 +162,7 @@ const Graphics::Surface *RPZADecoder::decodeImage(Common::SeekableReadStream *st
while (numBlocks--) {
blockPtr = rowPtr + pixelPtr;
for (byte pixel_y = 0; pixel_y < 4; pixel_y++) {
- byte index = stream->readByte();
+ byte index = stream.readByte();
for (byte pixel_x = 0; pixel_x < 4; pixel_x++) {
byte idx = (index >> (2 * (3 - pixel_x))) & 0x03;
PUT_PIXEL(color4[idx]);
@@ -180,7 +180,7 @@ const Graphics::Surface *RPZADecoder::decodeImage(Common::SeekableReadStream *st
for (byte pixel_x = 0; pixel_x < 4; pixel_x++) {
// We already have color of upper left pixel
if (pixel_y != 0 || pixel_x != 0)
- colorA = stream->readUint16BE();
+ colorA = stream.readUint16BE();
PUT_PIXEL(colorA);
}
@@ -198,4 +198,4 @@ const Graphics::Surface *RPZADecoder::decodeImage(Common::SeekableReadStream *st
return _surface;
}
-} // End of namespace Video
+} // End of namespace Image
diff --git a/video/codecs/rpza.h b/image/codecs/rpza.h
index 67e0699692..d1dbbdb676 100644
--- a/video/codecs/rpza.h
+++ b/image/codecs/rpza.h
@@ -8,44 +8,43 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public 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_CODECS_RPZA_H
-#define VIDEO_CODECS_RPZA_H
+#ifndef IMAGE_CODECS_RPZA_H
+#define IMAGE_CODECS_RPZA_H
#include "graphics/pixelformat.h"
-#include "video/codecs/codec.h"
+#include "image/codecs/codec.h"
-namespace Video {
+namespace Image {
/**
* Apple RPZA decoder.
*
- * Used in video:
- * - QuickTimeDecoder
+ * Used by PICT/QuickTime.
*/
class RPZADecoder : public Codec {
public:
RPZADecoder(uint16 width, uint16 height);
~RPZADecoder();
- const Graphics::Surface *decodeImage(Common::SeekableReadStream *stream);
+ const Graphics::Surface *decodeFrame(Common::SeekableReadStream &stream);
Graphics::PixelFormat getPixelFormat() const { return Graphics::PixelFormat(2, 5, 5, 5, 0, 10, 5, 0, 0); }
private:
Graphics::Surface *_surface;
};
-} // End of namespace Video
+} // End of namespace Image
#endif
diff --git a/video/codecs/smc.cpp b/image/codecs/smc.cpp
index c0f8152547..54493d0c34 100644
--- a/video/codecs/smc.cpp
+++ b/image/codecs/smc.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -22,14 +22,14 @@
// Based off ffmpeg's SMC decoder
-#include "video/codecs/smc.h"
+#include "image/codecs/smc.h"
#include "common/stream.h"
#include "common/textconsole.h"
-namespace Video {
+namespace Image {
#define GET_BLOCK_COUNT() \
- (opcode & 0x10) ? (1 + stream->readByte()) : 1 + (opcode & 0x0F);
+ (opcode & 0x10) ? (1 + stream.readByte()) : 1 + (opcode & 0x0F);
#define ADVANCE_BLOCK() \
{ \
@@ -55,7 +55,7 @@ SMCDecoder::~SMCDecoder() {
delete _surface;
}
-const Graphics::Surface *SMCDecoder::decodeImage(Common::SeekableReadStream *stream) {
+const Graphics::Surface *SMCDecoder::decodeFrame(Common::SeekableReadStream &stream) {
byte *pixels = (byte *)_surface->getPixels();
uint32 numBlocks = 0;
@@ -77,9 +77,9 @@ const Graphics::Surface *SMCDecoder::decodeImage(Common::SeekableReadStream *str
uint32 colorOctetIndex = 0;
uint32 colorTableIndex = 0; // indices to color pair, quad, or octet tables
- int32 chunkSize = stream->readUint32BE() & 0x00FFFFFF;
- if (chunkSize != stream->size())
- warning("MOV chunk size != SMC chunk size (%d != %d); ignoring SMC chunk size", chunkSize, stream->size());
+ int32 chunkSize = stream.readUint32BE() & 0x00FFFFFF;
+ if (chunkSize != stream.size())
+ warning("MOV chunk size != SMC chunk size (%d != %d); ignoring SMC chunk size", chunkSize, stream.size());
int32 totalBlocks = ((_surface->w + 3) / 4) * ((_surface->h + 3) / 4);
@@ -88,8 +88,8 @@ const Graphics::Surface *SMCDecoder::decodeImage(Common::SeekableReadStream *str
// sanity checks
// make sure stream ptr hasn't gone out of bounds
- if (stream->pos() > stream->size()) {
- warning("SMC decoder just went out of bounds (stream ptr = %d, chunk size = %d)", stream->pos(), stream->size());
+ if (stream.pos() > stream.size()) {
+ warning("SMC decoder just went out of bounds (stream ptr = %d, chunk size = %d)", stream.pos(), stream.size());
return _surface;
}
@@ -99,7 +99,7 @@ const Graphics::Surface *SMCDecoder::decodeImage(Common::SeekableReadStream *str
return _surface;
}
- byte opcode = stream->readByte();
+ byte opcode = stream.readByte();
switch (opcode & 0xF0) {
// skip n blocks
@@ -192,7 +192,7 @@ const Graphics::Surface *SMCDecoder::decodeImage(Common::SeekableReadStream *str
case 0x60:
case 0x70:
numBlocks = GET_BLOCK_COUNT();
- pixel = stream->readByte();
+ pixel = stream.readByte();
while (numBlocks--) {
blockPtr = rowPtr + pixelPtr;
@@ -216,7 +216,7 @@ const Graphics::Surface *SMCDecoder::decodeImage(Common::SeekableReadStream *str
// fetch the next 2 colors from bytestream and store in next
// available entry in the color pair table
for (byte i = 0; i < CPAIR; i++) {
- pixel = stream->readByte();
+ pixel = stream.readByte();
colorTableIndex = CPAIR * colorPairIndex + i;
_colorPairs[colorTableIndex] = pixel;
}
@@ -229,10 +229,10 @@ const Graphics::Surface *SMCDecoder::decodeImage(Common::SeekableReadStream *str
if (colorPairIndex == COLORS_PER_TABLE)
colorPairIndex = 0;
} else
- colorTableIndex = CPAIR * stream->readByte();
+ colorTableIndex = CPAIR * stream.readByte();
while (numBlocks--) {
- colorFlags = stream->readUint16BE();
+ colorFlags = stream.readUint16BE();
uint16 flagMask = 0x8000;
blockPtr = rowPtr + pixelPtr;
for (byte y = 0; y < 4; y++) {
@@ -262,7 +262,7 @@ const Graphics::Surface *SMCDecoder::decodeImage(Common::SeekableReadStream *str
// fetch the next 4 colors from bytestream and store in next
// available entry in the color quad table
for (byte i = 0; i < CQUAD; i++) {
- pixel = stream->readByte();
+ pixel = stream.readByte();
colorTableIndex = CQUAD * colorQuadIndex + i;
_colorQuads[colorTableIndex] = pixel;
}
@@ -275,10 +275,10 @@ const Graphics::Surface *SMCDecoder::decodeImage(Common::SeekableReadStream *str
if (colorQuadIndex == COLORS_PER_TABLE)
colorQuadIndex = 0;
} else
- colorTableIndex = CQUAD * stream->readByte();
+ colorTableIndex = CQUAD * stream.readByte();
while (numBlocks--) {
- colorFlags = stream->readUint32BE();
+ colorFlags = stream.readUint32BE();
// flag mask actually acts as a bit shift count here
byte flagMask = 30;
@@ -306,7 +306,7 @@ const Graphics::Surface *SMCDecoder::decodeImage(Common::SeekableReadStream *str
// fetch the next 8 colors from bytestream and store in next
// available entry in the color octet table
for (byte i = 0; i < COCTET; i++) {
- pixel = stream->readByte();
+ pixel = stream.readByte();
colorTableIndex = COCTET * colorOctetIndex + i;
_colorOctets[colorTableIndex] = pixel;
}
@@ -319,7 +319,7 @@ const Graphics::Surface *SMCDecoder::decodeImage(Common::SeekableReadStream *str
if (colorOctetIndex == COLORS_PER_TABLE)
colorOctetIndex = 0;
} else
- colorTableIndex = COCTET * stream->readByte();
+ colorTableIndex = COCTET * stream.readByte();
while (numBlocks--) {
/*
@@ -331,7 +331,7 @@ const Graphics::Surface *SMCDecoder::decodeImage(Common::SeekableReadStream *str
// build the color flags
byte flagData[6];
- stream->read(flagData, 6);
+ stream.read(flagData, 6);
colorFlagsA = ((READ_BE_UINT16(flagData) & 0xFFF0) << 8) | (READ_BE_UINT16(flagData + 2) >> 4);
colorFlagsB = ((READ_BE_UINT16(flagData + 4) & 0xFFF0) << 8) | ((flagData[1] & 0xF) << 8) |
@@ -369,7 +369,7 @@ const Graphics::Surface *SMCDecoder::decodeImage(Common::SeekableReadStream *str
blockPtr = rowPtr + pixelPtr;
for (byte y = 0; y < 4; y++) {
for (byte x = 0; x < 4; x++)
- pixels[blockPtr++] = stream->readByte();
+ pixels[blockPtr++] = stream.readByte();
blockPtr += rowInc;
}
@@ -386,4 +386,4 @@ const Graphics::Surface *SMCDecoder::decodeImage(Common::SeekableReadStream *str
return _surface;
}
-} // End of namespace Video
+} // End of namespace Image
diff --git a/video/codecs/smc.h b/image/codecs/smc.h
index 4b9f57410a..655ff0a3bc 100644
--- a/video/codecs/smc.h
+++ b/image/codecs/smc.h
@@ -8,24 +8,24 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public 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_CODECS_SMC_H
-#define VIDEO_CODECS_SMC_H
+#ifndef IMAGE_CODECS_SMC_H
+#define IMAGE_CODECS_SMC_H
-#include "video/codecs/codec.h"
+#include "image/codecs/codec.h"
-namespace Video {
+namespace Image {
enum {
CPAIR = 2,
@@ -37,15 +37,14 @@ enum {
/**
* Apple SMC decoder.
*
- * Used in video:
- * - QuickTimeDecoder
+ * Used by PICT/QuickTime.
*/
class SMCDecoder : public Codec {
public:
SMCDecoder(uint16 width, uint16 height);
~SMCDecoder();
- const Graphics::Surface *decodeImage(Common::SeekableReadStream *stream);
+ const Graphics::Surface *decodeFrame(Common::SeekableReadStream &stream);
Graphics::PixelFormat getPixelFormat() const { return Graphics::PixelFormat::createFormatCLUT8(); }
private:
@@ -57,6 +56,6 @@ private:
byte _colorOctets[COLORS_PER_TABLE * COCTET];
};
-} // End of namespace Video
+} // End of namespace Image
#endif
diff --git a/video/codecs/svq1.cpp b/image/codecs/svq1.cpp
index 57e84968a3..765d512797 100644
--- a/video/codecs/svq1.cpp
+++ b/image/codecs/svq1.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -23,9 +23,9 @@
// Sorenson Video 1 Codec
// Based off FFmpeg's SVQ1 decoder (written by Arpi and Nick Kurshev)
-#include "video/codecs/svq1.h"
-#include "video/codecs/svq1_cb.h"
-#include "video/codecs/svq1_vlc.h"
+#include "image/codecs/svq1.h"
+#include "image/codecs/svq1_cb.h"
+#include "image/codecs/svq1_vlc.h"
#include "common/stream.h"
#include "common/bitstream.h"
@@ -37,7 +37,7 @@
#include "graphics/yuv_to_rgb.h"
-namespace Video {
+namespace Image {
#define SVQ1_BLOCK_SKIP 0
#define SVQ1_BLOCK_INTER 1
@@ -91,10 +91,10 @@ SVQ1Decoder::~SVQ1Decoder() {
#define ALIGN(x, a) (((x)+(a)-1)&~((a)-1))
-const Graphics::Surface *SVQ1Decoder::decodeImage(Common::SeekableReadStream *stream) {
+const Graphics::Surface *SVQ1Decoder::decodeFrame(Common::SeekableReadStream &stream) {
debug(1, "SVQ1Decoder::decodeImage()");
- Common::BitStream32BEMSB frameData(*stream);
+ Common::BitStream32BEMSB frameData(stream);
uint32 frameCode = frameData.getBits(22);
debug(1, " frameCode: %d", frameCode);
@@ -794,4 +794,4 @@ bool SVQ1Decoder::svq1DecodeDeltaBlock(Common::BitStream *ss, byte *current, byt
return resultValid;
}
-} // End of namespace Video
+} // End of namespace Image
diff --git a/video/codecs/svq1.h b/image/codecs/svq1.h
index 6667fea344..236b810294 100644
--- a/video/codecs/svq1.h
+++ b/image/codecs/svq1.h
@@ -8,22 +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.
*
*/
-#ifndef VIDEO_CODECS_SVQ1_H
-#define VIDEO_CODECS_SVQ1_H
+#ifndef IMAGE_CODECS_SVQ1_H
+#define IMAGE_CODECS_SVQ1_H
-#include "video/codecs/codec.h"
+#include "image/codecs/codec.h"
namespace Common {
class BitStream;
@@ -31,20 +31,19 @@ class Huffman;
struct Point;
}
-namespace Video {
+namespace Image {
/**
* Sorenson Vector Quantizer 1 decoder.
*
- * Used in video:
- * - QuickTimeDecoder
+ * Used by PICT/QuickTime.
*/
class SVQ1Decoder : public Codec {
public:
SVQ1Decoder(uint16 width, uint16 height);
~SVQ1Decoder();
- const Graphics::Surface *decodeImage(Common::SeekableReadStream *stream);
+ const Graphics::Surface *decodeFrame(Common::SeekableReadStream &stream);
Graphics::PixelFormat getPixelFormat() const { return _surface->format; }
private:
@@ -83,6 +82,6 @@ private:
void putPixels16XY2C(byte *block, const byte *pixels, int lineSize, int h);
};
-} // End of namespace Video
+} // End of namespace Image
#endif
diff --git a/video/codecs/svq1_cb.h b/image/codecs/svq1_cb.h
index 8281b3fc28..27408a7472 100644
--- a/video/codecs/svq1_cb.h
+++ b/image/codecs/svq1_cb.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -23,12 +23,12 @@
// These tables are modified from their FFmpeg counterparts so that
// they work on both little and big endian systems.
-#ifndef VIDEO_CODECS_SVQ1_CB_H
-#define VIDEO_CODECS_SVQ1_CB_H
+#ifndef IMAGE_CODECS_SVQ1_CB_H
+#define IMAGE_CODECS_SVQ1_CB_H
#include "common/scummsys.h"
-namespace Video {
+namespace Image {
static const int8 s_svq1InterCodebook4x2[768] = {
7, 2, -6, -7, 7, 3, -3, -4, -7, -2, 7, 8, -8, -4, 3, 4,
@@ -1506,6 +1506,6 @@ static const int8 *const s_svq1IntraCodebooks[6] = {
0, 0
};
-} // End of namespace Video
+} // End of namespace Image
#endif
diff --git a/video/codecs/svq1_vlc.h b/image/codecs/svq1_vlc.h
index 5fb10981f7..19cfb3418c 100644
--- a/video/codecs/svq1_vlc.h
+++ b/image/codecs/svq1_vlc.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -23,12 +23,12 @@
// These tables are modified versions of the FFmpeg ones so that they
// will work with our BitStream class directly.
-#ifndef VIDEO_CODECS_SVQ1_VLC_H
-#define VIDEO_CODECS_SVQ1_VLC_H
+#ifndef IMAGE_CODECS_SVQ1_VLC_H
+#define IMAGE_CODECS_SVQ1_VLC_H
#include "common/scummsys.h"
-namespace Video {
+namespace Image {
static const byte s_svq1BlockTypeLengths[4] = {
1, 2, 3, 3
@@ -336,6 +336,6 @@ static const uint32 s_svq1MotionComponentCodes[33] = {
2, 3, 2
};
-} // End of namespace Video
+} // End of namespace Image
#endif
diff --git a/video/codecs/truemotion1.cpp b/image/codecs/truemotion1.cpp
index 720e86a4ff..e60ec6c72e 100644
--- a/video/codecs/truemotion1.cpp
+++ b/image/codecs/truemotion1.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -23,16 +23,17 @@
// Based on the TrueMotion 1 decoder by Alex Beregszaszi & Mike Melanson in FFmpeg
#include "common/scummsys.h"
-#include "video/codecs/truemotion1.h"
+#include "image/codecs/truemotion1.h"
-#ifdef VIDEO_CODECS_TRUEMOTION1_H
+#ifdef IMAGE_CODECS_TRUEMOTION1_H
-#include "video/codecs/truemotion1data.h"
+#include "image/codecs/truemotion1data.h"
#include "common/stream.h"
#include "common/textconsole.h"
+#include "common/rect.h"
#include "common/util.h"
-namespace Video {
+namespace Image {
enum {
FLAG_SPRITE = (1 << 5),
@@ -88,24 +89,20 @@ static const CompressionType compressionTypes[17] = {
{ ALGO_RGB24H, 2, 2, BLOCK_2x2 }
};
-TrueMotion1Decoder::TrueMotion1Decoder(uint16 width, uint16 height) {
- _surface = new Graphics::Surface();
- _width = width;
- _height = height;
-
- _surface->create(width, height, getPixelFormat());
-
- // there is a vertical predictor for each pixel in a line; each vertical
- // predictor is 0 to start with
- _vertPred = new uint32[_width];
+TrueMotion1Decoder::TrueMotion1Decoder() {
+ _surface = 0;
+ _vertPred = 0;
_buf = _mbChangeBits = _indexStream = 0;
_lastDeltaset = _lastVectable = -1;
}
TrueMotion1Decoder::~TrueMotion1Decoder() {
- _surface->free();
- delete _surface;
+ if (_surface) {
+ _surface->free();
+ delete _surface;
+ }
+
delete[] _vertPred;
}
@@ -163,18 +160,13 @@ void TrueMotion1Decoder::genVectorTable16(const byte *selVectorTable) {
}
}
-void TrueMotion1Decoder::decodeHeader(Common::SeekableReadStream *stream) {
- _buf = new byte[stream->size()];
- stream->read(_buf, stream->size());
+void TrueMotion1Decoder::decodeHeader(Common::SeekableReadStream &stream) {
+ _buf = new byte[stream.size()];
+ stream.read(_buf, stream.size());
byte headerBuffer[128]; // logical maximum size of the header
const byte *selVectorTable;
- // There is 1 change bit per 4 pixels, so each change byte represents
- // 32 pixels; divide width by 4 to obtain the number of change bits and
- // then round up to the nearest byte.
- _mbChangeBitsRowSize = ((_width >> 2) + 7) >> 3;
-
_header.headerSize = ((_buf[0] >> 5) | (_buf[0] << 3)) & 0x7f;
if (_buf[0] < 0x10)
@@ -196,6 +188,22 @@ void TrueMotion1Decoder::decodeHeader(Common::SeekableReadStream *stream) {
_header.flags = headerBuffer[11];
_header.control = headerBuffer[12];
+ if (!_vertPred) {
+ // there is a vertical predictor for each pixel in a line; each vertical
+ // predictor is 0 to start with
+ _vertPred = new uint32[_header.xsize];
+ }
+
+ if (!_surface) {
+ _surface = new Graphics::Surface();
+ _surface->create(_header.xsize, _header.ysize, getPixelFormat());
+ }
+
+ // There is 1 change bit per 4 pixels, so each change byte represents
+ // 32 pixels; divide width by 4 to obtain the number of change bits and
+ // then round up to the nearest byte.
+ _mbChangeBitsRowSize = ((_header.xsize >> 2) + 7) >> 3;
+
// Version 2
if (_header.version >= 2) {
if (_header.headerType > 3) {
@@ -240,10 +248,10 @@ void TrueMotion1Decoder::decodeHeader(Common::SeekableReadStream *stream) {
_indexStream = _mbChangeBits;
} else {
// one change bit per 4x4 block
- _indexStream = _mbChangeBits + _mbChangeBitsRowSize * (_height >> 2);
+ _indexStream = _mbChangeBits + _mbChangeBitsRowSize * (_header.ysize >> 2);
}
- _indexStreamSize = stream->size() - (_indexStream - _buf);
+ _indexStreamSize = stream.size() - (_indexStream - _buf);
_lastDeltaset = _header.deltaset;
_lastVectable = _header.vectable;
@@ -306,11 +314,11 @@ void TrueMotion1Decoder::decode16() {
int index;
// clean out the line buffer
- memset(_vertPred, 0, _width * 4);
+ memset(_vertPred, 0, _header.xsize * 4);
GET_NEXT_INDEX();
- for (int y = 0; y < _height; y++) {
+ for (int y = 0; y < _header.ysize; y++) {
// re-init variables for the next line iteration
uint32 horizPred = 0;
uint32 *currentPixelPair = (uint32 *)_surface->getBasePtr(0, y);
@@ -319,7 +327,7 @@ void TrueMotion1Decoder::decode16() {
byte mbChangeByte = _mbChangeBits[mbChangeIndex++];
byte mbChangeByteMask = 1;
- for (int pixelsLeft = _width; pixelsLeft > 0; pixelsLeft -= 4) {
+ for (int pixelsLeft = _header.xsize; pixelsLeft > 0; pixelsLeft -= 4) {
if (keyframe || (mbChangeByte & mbChangeByteMask) == 0) {
switch (y & 3) {
case 0:
@@ -397,7 +405,7 @@ void TrueMotion1Decoder::decode16() {
}
}
-const Graphics::Surface *TrueMotion1Decoder::decodeImage(Common::SeekableReadStream *stream) {
+const Graphics::Surface *TrueMotion1Decoder::decodeFrame(Common::SeekableReadStream &stream) {
decodeHeader(stream);
if (compressionTypes[_header.compression].algorithm == ALGO_NOP) {
@@ -417,6 +425,6 @@ const Graphics::Surface *TrueMotion1Decoder::decodeImage(Common::SeekableReadStr
return _surface;
}
-} // End of namespace Video
+} // End of namespace Image
#endif
diff --git a/video/codecs/truemotion1.h b/image/codecs/truemotion1.h
index 6ac09af24b..51daf607d2 100644
--- a/video/codecs/truemotion1.h
+++ b/image/codecs/truemotion1.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -25,25 +25,24 @@
// Only compile if SCI32 is enabled, ZVISION is enabled, or if we're building dynamic modules
#if defined(ENABLE_SCI32) || defined(ENABLE_ZVISION) || defined(DYNAMIC_MODULES)
-#ifndef VIDEO_CODECS_TRUEMOTION1_H
-#define VIDEO_CODECS_TRUEMOTION1_H
+#ifndef IMAGE_CODECS_TRUEMOTION1_H
+#define IMAGE_CODECS_TRUEMOTION1_H
-#include "video/codecs/codec.h"
+#include "image/codecs/codec.h"
-namespace Video {
+namespace Image {
/**
* Duck TrueMotion 1 decoder.
*
- * Used in video:
- * - AVIDecoder
+ * Used by BMP/AVI.
*/
class TrueMotion1Decoder : public Codec {
public:
- TrueMotion1Decoder(uint16 width, uint16 height);
+ TrueMotion1Decoder();
~TrueMotion1Decoder();
- const Graphics::Surface *decodeImage(Common::SeekableReadStream *stream);
+ const Graphics::Surface *decodeFrame(Common::SeekableReadStream &stream);
// Always return RGB565
Graphics::PixelFormat getPixelFormat() const { return Graphics::PixelFormat(2, 5, 6, 5, 0, 11, 5, 0, 0); }
@@ -55,7 +54,6 @@ private:
byte *_buf, *_mbChangeBits, *_indexStream;
int _indexStreamSize;
- uint16 _width, _height;
int _flags;
struct PredictorTableEntry {
@@ -96,14 +94,14 @@ private:
} _header;
void selectDeltaTables(int deltaTableIndex);
- void decodeHeader(Common::SeekableReadStream *stream);
+ void decodeHeader(Common::SeekableReadStream &stream);
void decode16();
int makeYdt16Entry(int p1, int p2);
int makeCdt16Entry(int p1, int p2);
void genVectorTable16(const byte *selVectorTable);
};
-} // End of namespace Video
+} // End of namespace Image
-#endif // VIDEO_CODECS_TRUEMOTION1_H
+#endif // IMAGE_CODECS_TRUEMOTION1_H
#endif // SCI32/Plugins guard
diff --git a/video/codecs/truemotion1data.h b/image/codecs/truemotion1data.h
index fabec43566..c73047211e 100644
--- a/video/codecs/truemotion1data.h
+++ b/image/codecs/truemotion1data.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -23,12 +23,12 @@
// Based on the TrueMotion 1 decoder by Alex Beregszaszi & Mike Melanson in FFmpeg
// These tables were originally part of VpVision from On2
-#ifndef VIDEO_CODECS_TRUEMOTION1DATA_H
-#define VIDEO_CODECS_TRUEMOTION1DATA_H
+#ifndef IMAGE_CODECS_TRUEMOTION1DATA_H
+#define IMAGE_CODECS_TRUEMOTION1DATA_H
#include "common/scummsys.h"
-namespace Video {
+namespace Image {
// Y delta tables, skinny and fat
static const int16 ydt1[8] = { 0, -2, 2, -6, 6, -12, 12, -12 };
@@ -824,6 +824,6 @@ static const byte pc_tbl4[] = {
static const byte * const tables[] = { pc_tbl2, pc_tbl3, pc_tbl4 };
-} // End of namespace Video
+} // End of namespace Image
#endif
diff --git a/graphics/decoders/iff.cpp b/image/iff.cpp
index 7b37969fc1..d93e9ff878 100644
--- a/graphics/decoders/iff.cpp
+++ b/image/iff.cpp
@@ -17,19 +17,24 @@
* You should have received a copy of the GNU General Public 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 "image/iff.h"
+
#include "common/iff_container.h"
#include "common/stream.h"
#include "common/util.h"
-#include "graphics/decoders/iff.h"
-
-namespace Graphics {
+namespace Image {
IFFDecoder::IFFDecoder() {
_surface = 0;
_palette = 0;
+
+ // these 2 properties are not reset by destroy(), so the default is set here.
+ _numRelevantPlanes = 8;
+ _pixelPacking = false;
destroy();
}
@@ -54,8 +59,6 @@ void IFFDecoder::destroy() {
_paletteRanges.clear();
_type = TYPE_UNKNOWN;
_paletteColorCount = 0;
- _numRelevantPlanes = 8;
- _pixelPacking = false;
}
bool IFFDecoder::loadStream(Common::SeekableReadStream &stream) {
@@ -238,4 +241,4 @@ void IFFDecoder::packPixels(byte *scanlines, byte *data, const uint16 scanlinePi
}
}
-} // End of namespace Graphics
+} // End of namespace Image
diff --git a/graphics/decoders/iff.h b/image/iff.h
index beac62e519..3d342b3173 100644
--- a/graphics/decoders/iff.h
+++ b/image/iff.h
@@ -17,6 +17,7 @@
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
*/
/**
@@ -28,22 +29,24 @@
* - saga
*/
-#ifndef GRAPHICS_DECODERS_IFF_H
-#define GRAPHICS_DECODERS_IFF_H
+#ifndef IMAGE_IFF_H
+#define IMAGE_IFF_H
#include "common/array.h"
#include "common/endian.h"
-
#include "graphics/surface.h"
-#include "graphics/decoders/image_decoder.h"
+
+#include "image/image_decoder.h"
namespace Common {
class SeekableReadStream;
}
namespace Graphics {
-
struct Surface;
+}
+
+namespace Image {
class IFFDecoder : public ImageDecoder {
public:
@@ -77,7 +80,7 @@ public:
void destroy();
bool loadStream(Common::SeekableReadStream &stream);
const Header *getHeader() const { return &_header; }
- const Surface *getSurface() const { return _surface; }
+ const Graphics::Surface *getSurface() const { return _surface; }
const byte *getPalette() const { return _palette; }
const Common::Array<PaletteRange> &getPaletteRanges() const { return _paletteRanges; }
uint16 getPaletteColorCount() const { return _paletteColorCount; }
@@ -85,6 +88,8 @@ public:
/**
* The number of planes to decode, also determines the pixel packing if _packPixels is true.
* 8 == decode all planes, map 1 pixel in 1 byte. (default, no packing even if _packPixels is true)
+ *
+ * NOTE: this property must be reset manually, and is not reset by a call to destroy().
*/
void setNumRelevantPlanes(const uint8 numRelevantPlanes) { _numRelevantPlanes = numRelevantPlanes; }
@@ -94,12 +99,14 @@ public:
* 2 == decode first 2 planes, pack 4 pixels in 1 byte. This makes _surface->w 1/4th of _header.width
* 4 == decode first 4 planes, pack 2 pixels in 1 byte. This makes _surface->w half of _header.width
* Packed bitmaps won't have a proper surface format since there is no way to tell it to use 1, 2 or 4 bits per pixel
+ *
+ * NOTE: this property must be reset manually, and is not reset by a call to destroy().
*/
void setPixelPacking(const bool pixelPacking) { _pixelPacking = pixelPacking; }
private:
Header _header;
- Surface *_surface;
+ Graphics::Surface *_surface;
byte *_palette;
Common::Array<PaletteRange> _paletteRanges;
Type _type;
@@ -114,6 +121,6 @@ private:
void packPixels(byte *scanlines, byte *data, const uint16 scanlinePitch, const uint16 outPitch);
};
-} // End of namespace Graphics
+} // End of namespace Image
-#endif // GRAPHICS_DECODERS_IFF_H
+#endif
diff --git a/graphics/decoders/image_decoder.h b/image/image_decoder.h
index 49e31c6e3a..4d3512e0f6 100644
--- a/graphics/decoders/image_decoder.h
+++ b/image/image_decoder.h
@@ -17,26 +17,30 @@
* You should have received a copy of the GNU General Public 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_DECODERS_IMAGEDECODER_H
-#define GRAPHICS_DECODERS_IMAGEDECODER_H
+#ifndef IMAGE_IMAGEDECODER_H
+#define IMAGE_IMAGEDECODER_H
#include "common/scummsys.h"
#include "common/str.h"
-namespace Common{
+namespace Common {
class SeekableReadStream;
}
namespace Graphics {
-
-struct PixelFormat;
struct Surface;
+}
+
+namespace Image {
/**
* A representation of an image decoder that maintains ownership of the surface
* and palette it decodes to.
+ *
+ * This is designed for still frames only.
*/
class ImageDecoder {
public:
@@ -44,6 +48,9 @@ public:
/**
* Load an image from the specified stream
+ *
+ * loadStream() should implicitly call destroy() to free the memory
+ * of the last loadStream() call.
*
* @param stream the input stream
* @return whether loading the file succeeded
@@ -54,6 +61,9 @@ public:
/**
* Destroy this decoder's surface and palette
+ *
+ * This should be called by a loadStream() implementation as well
+ * as the destructor.
*/
virtual void destroy() = 0;
@@ -66,7 +76,7 @@ public:
*
* @return the decoded surface, or 0 if no surface is present
*/
- virtual const Surface *getSurface() const = 0;
+ virtual const Graphics::Surface *getSurface() const = 0;
/**
* Get the decoded palette
@@ -93,6 +103,6 @@ public:
virtual uint16 getPaletteColorCount() const { return 0; }
};
-} // End of namespace Graphics
+} // End of namespace Image
#endif
diff --git a/graphics/decoders/jpeg.cpp b/image/jpeg.cpp
index c858884095..1ce45f2539 100644
--- a/graphics/decoders/jpeg.cpp
+++ b/image/jpeg.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -24,13 +24,13 @@
// here.
#define FORBIDDEN_SYMBOL_ALLOW_ALL
-#include "graphics/pixelformat.h"
-#include "graphics/decoders/jpeg.h"
+#include "image/jpeg.h"
#include "common/debug.h"
#include "common/endian.h"
#include "common/stream.h"
#include "common/textconsole.h"
+#include "graphics/pixelformat.h"
#ifdef USE_JPEG
// The original release of libjpeg v6b did not contain any extern "C" in case
@@ -42,16 +42,16 @@ extern "C" {
}
#endif
-namespace Graphics {
+namespace Image {
-JPEGDecoder::JPEGDecoder() : ImageDecoder(), _surface(), _colorSpace(kColorSpaceRGBA) {
+JPEGDecoder::JPEGDecoder() : _surface(), _colorSpace(kColorSpaceRGBA) {
}
JPEGDecoder::~JPEGDecoder() {
destroy();
}
-const Surface *JPEGDecoder::getSurface() const {
+const Graphics::Surface *JPEGDecoder::getSurface() const {
return &_surface;
}
@@ -59,6 +59,17 @@ void JPEGDecoder::destroy() {
_surface.free();
}
+const Graphics::Surface *JPEGDecoder::decodeFrame(Common::SeekableReadStream &stream) {
+ if (!loadStream(stream))
+ return 0;
+
+ return getSurface();
+}
+
+Graphics::PixelFormat JPEGDecoder::getPixelFormat() const {
+ return _surface.format;
+}
+
#ifdef USE_JPEG
namespace {
diff --git a/graphics/decoders/jpeg.h b/image/jpeg.h
index 8460bc2698..ac0d22d129 100644
--- a/graphics/decoders/jpeg.h
+++ b/image/jpeg.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -26,21 +26,24 @@
* - groovie
* - mohawk
* - wintermute
+ *
+ * Used by PICT/QuickTime.
*/
-#ifndef GRAPHICS_JPEG_H
-#define GRAPHICS_JPEG_H
+#ifndef IMAGE_JPEG_H
+#define IMAGE_JPEG_H
#include "graphics/surface.h"
-#include "graphics/decoders/image_decoder.h"
+#include "image/image_decoder.h"
+#include "image/codecs/codec.h"
namespace Common {
class SeekableReadStream;
}
-namespace Graphics {
+namespace Image {
-class JPEGDecoder : public ImageDecoder {
+class JPEGDecoder : public ImageDecoder, public Codec {
public:
JPEGDecoder();
~JPEGDecoder();
@@ -48,7 +51,11 @@ public:
// ImageDecoder API
virtual void destroy();
virtual bool loadStream(Common::SeekableReadStream &str);
- virtual const Surface *getSurface() const;
+ virtual const Graphics::Surface *getSurface() const;
+
+ // Codec API
+ const Graphics::Surface *decodeFrame(Common::SeekableReadStream &stream);
+ Graphics::PixelFormat getPixelFormat() const;
// Special API for JPEG
enum ColorSpace {
@@ -90,6 +97,6 @@ private:
ColorSpace _colorSpace;
};
-} // End of Graphics namespace
+} // End of namespace Image
-#endif // GRAPHICS_JPEG_H
+#endif
diff --git a/image/module.mk b/image/module.mk
new file mode 100644
index 0000000000..fdf52ec09f
--- /dev/null
+++ b/image/module.mk
@@ -0,0 +1,31 @@
+MODULE := image
+
+MODULE_OBJS := \
+ bmp.o \
+ iff.o \
+ jpeg.o \
+ pcx.o \
+ pict.o \
+ png.o \
+ tga.o \
+ codecs/bmp_raw.o \
+ codecs/cdtoons.o \
+ codecs/cinepak.o \
+ codecs/codec.o \
+ codecs/indeo3.o \
+ codecs/mjpeg.o \
+ codecs/msrle.o \
+ codecs/msvideo1.o \
+ codecs/qtrle.o \
+ codecs/rpza.o \
+ codecs/smc.o \
+ codecs/svq1.o \
+ codecs/truemotion1.o
+
+ifdef USE_MPEG2
+MODULE_OBJS += \
+ codecs/mpeg.o
+endif
+
+# Include common rules
+include $(srcdir)/rules.mk
diff --git a/graphics/decoders/pcx.cpp b/image/pcx.cpp
index eb9b4c997d..282a6c68c7 100644
--- a/graphics/decoders/pcx.cpp
+++ b/image/pcx.cpp
@@ -17,14 +17,15 @@
* You should have received a copy of the GNU General Public 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 "image/pcx.h"
+
#include "common/stream.h"
#include "common/textconsole.h"
-
#include "graphics/pixelformat.h"
#include "graphics/surface.h"
-#include "graphics/decoders/pcx.h"
/**
* Based on the PCX specs:
@@ -33,7 +34,7 @@
* http://git.videolan.org/?p=ffmpeg.git;a=blob;f=libavcodec/pcx.c
*/
-namespace Graphics {
+namespace Image {
PCXDecoder::PCXDecoder() {
_surface = 0;
@@ -210,4 +211,4 @@ void PCXDecoder::decodeRLE(Common::SeekableReadStream &stream, byte *dst, uint32
}
}
-} // End of namespace Graphics
+} // End of namespace Image
diff --git a/graphics/decoders/pcx.h b/image/pcx.h
index b25166b3d9..ce30ab5eb2 100644
--- a/graphics/decoders/pcx.h
+++ b/image/pcx.h
@@ -17,6 +17,7 @@
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
*/
/**
@@ -27,21 +28,18 @@
* - tucker
*/
-#ifndef GRAPHICS_DECODERS_PCX_H
-#define GRAPHICS_DECODERS_PCX_H
+#ifndef IMAGE_PCX_H
+#define IMAGE_PCX_H
#include "common/scummsys.h"
#include "common/str.h"
-#include "graphics/decoders/image_decoder.h"
+#include "image/image_decoder.h"
namespace Common{
class SeekableReadStream;
}
-namespace Graphics {
-
-struct PixelFormat;
-struct Surface;
+namespace Image {
class PCXDecoder : public ImageDecoder {
public:
@@ -51,18 +49,18 @@ public:
// ImageDecoder API
void destroy();
virtual bool loadStream(Common::SeekableReadStream &stream);
- virtual const Surface *getSurface() const { return _surface; }
+ virtual const Graphics::Surface *getSurface() const { return _surface; }
const byte *getPalette() const { return _palette; }
uint16 getPaletteColorCount() const { return _paletteColorCount; }
private:
void decodeRLE(Common::SeekableReadStream &stream, byte *dst, uint32 bytesPerScanline, bool compressed);
- Surface *_surface;
+ Graphics::Surface *_surface;
byte *_palette;
uint16 _paletteColorCount;
};
-} // End of namespace Graphics
+} // End of namespace Image
#endif
diff --git a/graphics/decoders/pict.cpp b/image/pict.cpp
index f3e17b33e2..89f115dc90 100644
--- a/graphics/decoders/pict.cpp
+++ b/image/pict.cpp
@@ -8,29 +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.
*
*/
+#include "image/pict.h"
+#include "image/codecs/codec.h"
+
#include "common/debug.h"
#include "common/endian.h"
#include "common/stream.h"
#include "common/substream.h"
#include "common/textconsole.h"
-
#include "graphics/surface.h"
-#include "graphics/decoders/jpeg.h"
-#include "graphics/decoders/pict.h"
-namespace Graphics {
+namespace Image {
// The PICT code is based off of the QuickDraw specs:
// http://developer.apple.com/legacy/mac/library/documentation/mac/QuickDraw/QuickDraw-461.html
@@ -229,7 +229,7 @@ bool PICTDecoder::loadStream(Common::SeekableReadStream &stream) {
// NOTE: This is only a subset of the full PICT format.
// - Only V2 (Extended) Images Supported
- // - CompressedQuickTime (JPEG) compressed data is supported
+ // - CompressedQuickTime compressed data is supported
// - DirectBitsRect/PackBitsRect compressed data is supported
for (uint32 opNum = 0; !stream.eos() && !stream.err() && stream.pos() < stream.size() && _continueParsing; opNum++) {
// PICT v2 opcodes are two bytes
@@ -363,12 +363,12 @@ void PICTDecoder::unpackBitsRect(Common::SeekableReadStream &stream, bool withPa
switch (bytesPerPixel) {
case 1:
// Just copy to the image
- _outputSurface->create(width, height, PixelFormat::createFormatCLUT8());
+ _outputSurface->create(width, height, Graphics::PixelFormat::createFormatCLUT8());
memcpy(_outputSurface->getPixels(), buffer, _outputSurface->w * _outputSurface->h);
break;
case 2:
// We have a 16-bit surface
- _outputSurface->create(width, height, PixelFormat(2, 5, 5, 5, 0, 10, 5, 0, 0));
+ _outputSurface->create(width, height, Graphics::PixelFormat(2, 5, 5, 5, 0, 10, 5, 0, 0));
for (uint16 y = 0; y < _outputSurface->h; y++)
for (uint16 x = 0; x < _outputSurface->w; x++)
WRITE_UINT16(_outputSurface->getBasePtr(x, y), READ_UINT16(buffer + (y * _outputSurface->w + x) * 2));
@@ -550,31 +550,37 @@ void PICTDecoder::decodeCompressedQuickTime(Common::SeekableReadStream &stream)
// Now we've reached the image descriptor, so read the relevant data from that
uint32 idStart = stream.pos();
uint32 idSize = stream.readUint32BE();
- uint32 codec = stream.readUint32BE();
- stream.skip(36); // miscellaneous stuff
- uint32 jpegSize = stream.readUint32BE();
+ uint32 codecTag = stream.readUint32BE();
+ stream.skip(24); // miscellaneous stuff
+ uint16 width = stream.readUint16BE();
+ uint16 height = stream.readUint16BE();
+ stream.skip(8); // resolution, dpi
+ uint32 imageSize = stream.readUint32BE();
+ stream.skip(34);
+ uint16 bitsPerPixel = stream.readUint16BE();
stream.skip(idSize - (stream.pos() - idStart)); // more useless stuff
- if (codec != MKTAG('j', 'p', 'e', 'g'))
- error("Unhandled CompressedQuickTime format '%s'", tag2str(codec));
+ Common::SeekableSubReadStream imageStream(&stream, stream.pos(), stream.pos() + imageSize);
- Common::SeekableSubReadStream jpegStream(&stream, stream.pos(), stream.pos() + jpegSize);
+ Codec *codec = createQuickTimeCodec(codecTag, width, height, bitsPerPixel);
+ if (!codec)
+ error("Unhandled CompressedQuickTime format");
- JPEGDecoder jpeg;
- if (!jpeg.loadStream(jpegStream))
- error("PICTDecoder::decodeCompressedQuickTime(): Could not decode JPEG data");
+ const Graphics::Surface *surface = codec->decodeFrame(imageStream);
- const Graphics::Surface *jpegSurface = jpeg.getSurface();
+ if (!surface)
+ error("PICTDecoder::decodeCompressedQuickTime(): Could not decode data");
if (!_outputSurface) {
_outputSurface = new Graphics::Surface();
- _outputSurface->create(_imageRect.width(), _imageRect.height(), jpegSurface->format);
+ _outputSurface->create(_imageRect.width(), _imageRect.height(), surface->format);
}
- for (uint16 y = 0; y < jpegSurface->h; y++)
- memcpy(_outputSurface->getBasePtr(0 + xOffset, y + yOffset), jpegSurface->getBasePtr(0, y), jpegSurface->w * jpegSurface->format.bytesPerPixel);
+ for (uint16 y = 0; y < surface->h; y++)
+ memcpy(_outputSurface->getBasePtr(0 + xOffset, y + yOffset), surface->getBasePtr(0, y), surface->w * surface->format.bytesPerPixel);
stream.seek(startPos + dataSize);
+ delete codec;
}
-} // End of namespace Graphics
+} // End of namespace Image
diff --git a/graphics/decoders/pict.h b/image/pict.h
index 6f0d86c7a1..77b450f4a2 100644
--- a/graphics/decoders/pict.h
+++ b/image/pict.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -28,23 +28,24 @@
* - sci
*/
-#ifndef GRAPHICS_PICT_H
-#define GRAPHICS_PICT_H
+#ifndef IMAGE_PICT_H
+#define IMAGE_PICT_H
#include "common/array.h"
#include "common/rect.h"
#include "common/scummsys.h"
-#include "graphics/decoders/image_decoder.h"
-#include "graphics/pixelformat.h"
+#include "image/image_decoder.h"
namespace Common {
class SeekableReadStream;
}
namespace Graphics {
-
struct Surface;
+}
+
+namespace Image {
#define DECLARE_OPCODE(x) void x(Common::SeekableReadStream &stream)
@@ -56,7 +57,7 @@ public:
// ImageDecoder API
bool loadStream(Common::SeekableReadStream &stream);
void destroy();
- const Surface *getSurface() const { return _outputSurface; }
+ const Graphics::Surface *getSurface() const { return _outputSurface; }
const byte *getPalette() const { return _palette; }
uint16 getPaletteColorCount() const { return _paletteColorCount; }
@@ -135,6 +136,6 @@ private:
#undef DECLARE_OPCODE
-} // End of namespace Graphics
+} // End of namespace Image
#endif
diff --git a/graphics/decoders/png.cpp b/image/png.cpp
index 5acb7b36f7..158acfa8a5 100644
--- a/graphics/decoders/png.cpp
+++ b/image/png.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -29,14 +29,14 @@
#include <png.h>
#endif
-#include "graphics/decoders/png.h"
+#include "image/png.h"
#include "graphics/pixelformat.h"
#include "graphics/surface.h"
#include "common/stream.h"
-namespace Graphics {
+namespace Image {
PNGDecoder::PNGDecoder() : _outputSurface(0), _palette(0), _paletteColorCount(0), _stream(0) {
}
@@ -163,7 +163,13 @@ bool PNGDecoder::loadStream(Common::SeekableReadStream &stream) {
_outputSurface->create(width, height, Graphics::PixelFormat::createFormatCLUT8());
png_set_packing(pngPtr);
} else {
- _outputSurface->create(width, height, Graphics::PixelFormat(4, 8, 8, 8, 8, 24, 16, 8, 0));
+ bool isAlpha = (colorType & PNG_COLOR_MASK_ALPHA);
+ if (png_get_valid(pngPtr, infoPtr, PNG_INFO_tRNS)) {
+ isAlpha = true;
+ png_set_expand(pngPtr);
+ }
+ _outputSurface->create(width, height, Graphics::PixelFormat(4,
+ 8, 8, 8, isAlpha ? 8 : 0, 24, 16, 8, 0));
if (!_outputSurface->getPixels()) {
error("Could not allocate memory for output image.");
}
@@ -171,8 +177,6 @@ bool PNGDecoder::loadStream(Common::SeekableReadStream &stream) {
png_set_strip_16(pngPtr);
if (bitDepth < 8)
png_set_expand(pngPtr);
- if (png_get_valid(pngPtr, infoPtr, PNG_INFO_tRNS))
- png_set_expand(pngPtr);
if (colorType == PNG_COLOR_TYPE_GRAY ||
colorType == PNG_COLOR_TYPE_GRAY_ALPHA)
png_set_gray_to_rgb(pngPtr);
@@ -238,4 +242,4 @@ bool PNGDecoder::loadStream(Common::SeekableReadStream &stream) {
#endif
}
-} // End of Graphics namespace
+} // End of namespace Image
diff --git a/graphics/decoders/png.h b/image/png.h
index 5e608eb7b1..c4532fd03b 100644
--- a/graphics/decoders/png.h
+++ b/image/png.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -28,21 +28,22 @@
* - libpng
*/
-#ifndef GRAPHICS_PNG_H
-#define GRAPHICS_PNG_H
+#ifndef IMAGE_PNG_H
+#define IMAGE_PNG_H
#include "common/scummsys.h"
#include "common/textconsole.h"
-#include "graphics/decoders/image_decoder.h"
+#include "image/image_decoder.h"
namespace Common {
class SeekableReadStream;
}
namespace Graphics {
-
struct Surface;
-struct PixelFormat;
+}
+
+namespace Image {
class PNGDecoder : public ImageDecoder {
public:
@@ -62,6 +63,6 @@ private:
Graphics::Surface *_outputSurface;
};
-} // End of namespace Graphics
+} // End of namespace Image
-#endif // GRAPHICS_PNG_H
+#endif
diff --git a/graphics/decoders/tga.cpp b/image/tga.cpp
index a9f136d238..e251f64677 100644
--- a/graphics/decoders/tga.cpp
+++ b/image/tga.cpp
@@ -17,20 +17,21 @@
* You should have received a copy of the GNU General Public 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 code from xoreos https://github.com/DrMcCoy/xoreos/
* relicensed under GPLv2+ with permission from DrMcCoy and clone2727
*/
+#include "image/tga.h"
+
#include "common/util.h"
#include "common/stream.h"
#include "common/textconsole.h"
#include "common/error.h"
-#include "graphics/decoders/tga.h"
-
-namespace Graphics {
+namespace Image {
TGADecoder::TGADecoder() {
_colorMapSize = 0;
@@ -50,6 +51,8 @@ void TGADecoder::destroy() {
}
bool TGADecoder::loadStream(Common::SeekableReadStream &tga) {
+ destroy();
+
byte imageType, pixelDepth;
bool success;
success = readHeader(tga, imageType, pixelDepth);
@@ -136,29 +139,29 @@ bool TGADecoder::readHeader(Common::SeekableReadStream &tga, byte &imageType, by
//int interleave = (imgDesc & 0xC);
if (imageType == TYPE_CMAP || imageType == TYPE_RLE_CMAP) {
if (pixelDepth == 8) {
- _format = PixelFormat::createFormatCLUT8();
+ _format = Graphics::PixelFormat::createFormatCLUT8();
} else {
warning("Unsupported index-depth: %d", pixelDepth);
return false;
}
} else if (imageType == TYPE_TRUECOLOR || imageType == TYPE_RLE_TRUECOLOR) {
if (pixelDepth == 24) {
- _format = PixelFormat(3, 8, 8, 8, 0, 16, 8, 0, 0);
+ _format = Graphics::PixelFormat(3, 8, 8, 8, 0, 16, 8, 0, 0);
} else if (pixelDepth == 32) {
// HACK: According to the spec, attributeBits should determine the amount
// of alpha-bits, however, as the game files that use this decoder seems
// to ignore that fact, we force the amount to 8 for 32bpp files for now.
- _format = PixelFormat(4, 8, 8, 8, /* attributeBits */ 8, 16, 8, 0, 24);
+ _format = Graphics::PixelFormat(4, 8, 8, 8, /* attributeBits */ 8, 16, 8, 0, 24);
} else if (pixelDepth == 16 && imageType == TYPE_TRUECOLOR) {
// 16bpp TGA is ARGB1555
- _format = PixelFormat(2, 5, 5, 5, attributeBits, 10, 5, 0, 15);
+ _format = Graphics::PixelFormat(2, 5, 5, 5, attributeBits, 10, 5, 0, 15);
} else {
warning("Unsupported pixel depth: %d, %d", imageType, pixelDepth);
return false;
}
} else if (imageType == TYPE_BW || TYPE_RLE_BW) {
if (pixelDepth == 8) {
- _format = PixelFormat(4, 8, 8, 8, 0, 16, 8, 0, 0);
+ _format = Graphics::PixelFormat(4, 8, 8, 8, 0, 16, 8, 0, 0);
} else {
warning("Unsupported pixel depth: %d, %d", imageType, pixelDepth);
return false;
@@ -184,7 +187,7 @@ bool TGADecoder::readColorMap(Common::SeekableReadStream &tga, byte imageType, b
byte r, g, b;
if (_colorMapEntryLength == 32) {
byte a;
- PixelFormat format(4, 8, 8, 8, 0, 16, 8, 0, 24);
+ Graphics::PixelFormat format(4, 8, 8, 8, 0, 16, 8, 0, 24);
uint32 color = tga.readUint32LE();
format.colorToARGB(color, a, r, g, b);
} else if (_colorMapEntryLength == 24) {
@@ -193,7 +196,7 @@ bool TGADecoder::readColorMap(Common::SeekableReadStream &tga, byte imageType, b
b = tga.readByte();
} else if (_colorMapEntryLength == 16) {
byte a;
- PixelFormat format(2, 5, 5, 5, 0, 10, 5, 0, 15);
+ Graphics::PixelFormat format(2, 5, 5, 5, 0, 10, 5, 0, 15);
uint16 color = tga.readUint16LE();
format.colorToARGB(color, a, r, g, b);
} else {
@@ -424,4 +427,4 @@ bool TGADecoder::readDataRLE(Common::SeekableReadStream &tga, byte imageType, by
return true;
}
-} // End of namespace Graphics
+} // End of namespace Image
diff --git a/graphics/decoders/tga.h b/image/tga.h
index d8ccf8f766..677c17834f 100644
--- a/graphics/decoders/tga.h
+++ b/image/tga.h
@@ -17,6 +17,7 @@
* You should have received a copy of the GNU General Public 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 code from eos https://github.com/DrMcCoy/xoreos/
@@ -26,19 +27,20 @@
/*
* TGA decoder used in engines:
* - wintermute
+ * - zvision
*/
-#ifndef GRAPHICS_DECODERS_TGA_H
-#define GRAPHICS_DECODERS_TGA_H
+#ifndef IMAGE_TGA_H
+#define IMAGE_TGA_H
#include "graphics/surface.h"
-#include "graphics/decoders/image_decoder.h"
+#include "image/image_decoder.h"
namespace Common {
class SeekableReadStream;
}
-namespace Graphics {
+namespace Image {
/** TarGa image-decoder
* The following variations of TGA are supported:
@@ -57,7 +59,7 @@ public:
TGADecoder();
virtual ~TGADecoder();
virtual void destroy();
- virtual const Surface *getSurface() const { return &_surface; }
+ virtual const Graphics::Surface *getSurface() const { return &_surface; }
virtual const byte *getPalette() const { return _colorMap; }
virtual uint16 getPaletteColorCount() const { return _colorMapLength; }
virtual bool loadStream(Common::SeekableReadStream &stream);
@@ -83,8 +85,8 @@ private:
// Origin may be at the top, or bottom
bool _originTop;
- PixelFormat _format;
- Surface _surface;
+ Graphics::PixelFormat _format;
+ Graphics::Surface _surface;
// Loading helpers
bool readHeader(Common::SeekableReadStream &tga, byte &imageType, byte &pixelDepth);
bool readData(Common::SeekableReadStream &tga, byte imageType, byte pixelDepth);
@@ -93,6 +95,6 @@ private:
bool readColorMap(Common::SeekableReadStream &tga, byte imageType, byte pixelDepth);
};
-} // End of namespace Graphics
+} // End of namespace Image
-#endif // GRAPHICS_DECODERS_TGA_H
+#endif
diff --git a/po/be_BY.po b/po/be_BY.po
index 4c36c65f71..692985edde 100644
--- a/po/be_BY.po
+++ b/po/be_BY.po
@@ -1,5 +1,5 @@
# Belarusian translation for ScummVM.
-# Copyright (C) 2010-2013 ScummVM Team
+# Copyright (C) 2010-2014 ScummVM Team
# This file is distributed under the same license as the ScummVM package.
# Ivan Lukyanov <greencis@mail.ru>, 2013.
#
@@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: ScummVM 1.6.0git\n"
"Report-Msgid-Bugs-To: scummvm-devel@lists.sf.net\n"
-"POT-Creation-Date: 2013-04-24 13:35+0100\n"
+"POT-Creation-Date: 2014-06-07 23:06+0100\n"
"PO-Revision-Date: 2013-04-28 18:53+0300\n"
"Last-Translator: Ivan Lukyanov <greencis@mail.ru>\n"
"Language-Team: Ivan Lukyanov <greencis@mail.ru>\n"
@@ -19,77 +19,77 @@ msgstr ""
"%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n"
"X-Generator: Poedit 1.5.5\n"
-#: gui/about.cpp:93
+#: gui/about.cpp:94
#, c-format
msgid "(built on %s)"
msgstr "(áÐÑàÐÝë %s)"
-#: gui/about.cpp:100
+#: gui/about.cpp:101
msgid "Features compiled in:"
msgstr "ÃÚÛîçÐÝëï þ ÑöÛÔ Þßæëö:"
-#: gui/about.cpp:109
+#: gui/about.cpp:110
msgid "Available engines:"
msgstr "´ÐáâãßÝëï àãåÐÒöçÚö:"
-#: gui/browser.cpp:67
+#: gui/browser.cpp:68
msgid "Show hidden files"
msgstr "¿ÐÚÐ×ÒÐæì áåÐÒÐÝëï äÐÙÛë"
-#: gui/browser.cpp:67
+#: gui/browser.cpp:68
msgid "Show files marked with the hidden attribute"
msgstr "¿ÐÚÐ×ÒÐæì äÐÙÛë áÐ áåÐÒÐÝëÜ ÐâàëÑãâÐÜ"
-#: gui/browser.cpp:71
+#: gui/browser.cpp:72
msgid "Go up"
msgstr "ÃÒÕàå"
-#: gui/browser.cpp:71 gui/browser.cpp:73
+#: gui/browser.cpp:72 gui/browser.cpp:74
msgid "Go to previous directory level"
msgstr "¿ÕàÐÙáæö ÝÐ ÔëàíÚâÞàëî þ×àÞþÝÕÜ ÒëèíÙ"
-#: gui/browser.cpp:73
+#: gui/browser.cpp:74
msgctxt "lowres"
msgid "Go up"
msgstr "ÃÒÕàå"
-#: gui/browser.cpp:74 gui/chooser.cpp:45 gui/KeysDialog.cpp:43
-#: gui/launcher.cpp:345 gui/massadd.cpp:94 gui/options.cpp:1238
-#: gui/saveload-dialog.cpp:215 gui/saveload-dialog.cpp:275
-#: gui/saveload-dialog.cpp:545 gui/saveload-dialog.cpp:919
-#: gui/themebrowser.cpp:54 gui/fluidsynth-dialog.cpp:151
-#: engines/engine.cpp:447 engines/drascula/saveload.cpp:51
-#: engines/scumm/dialogs.cpp:190 engines/sword1/control.cpp:865
-#: engines/parallaction/saveload.cpp:274 backends/platform/wii/options.cpp:48
-#: backends/events/default/default-events.cpp:193
-#: backends/events/default/default-events.cpp:215
+#: gui/browser.cpp:75 gui/chooser.cpp:46 gui/KeysDialog.cpp:43
+#: gui/launcher.cpp:351 gui/massadd.cpp:95 gui/options.cpp:1239
+#: gui/saveload-dialog.cpp:216 gui/saveload-dialog.cpp:276
+#: gui/saveload-dialog.cpp:547 gui/saveload-dialog.cpp:922
+#: gui/themebrowser.cpp:55 gui/fluidsynth-dialog.cpp:152
+#: engines/engine.cpp:452 backends/platform/wii/options.cpp:48
+#: backends/events/default/default-events.cpp:196
+#: backends/events/default/default-events.cpp:218
+#: engines/drascula/saveload.cpp:49 engines/parallaction/saveload.cpp:274
+#: engines/scumm/dialogs.cpp:191 engines/sword1/control.cpp:865
msgid "Cancel"
msgstr "°ÔÜÕÝÐ"
-#: gui/browser.cpp:75 gui/chooser.cpp:46 gui/themebrowser.cpp:55
+#: gui/browser.cpp:76 gui/chooser.cpp:47 gui/themebrowser.cpp:56
msgid "Choose"
msgstr "°ÑàÐæì"
-#: gui/gui-manager.cpp:115 engines/scumm/help.cpp:125
-#: engines/scumm/help.cpp:140 engines/scumm/help.cpp:165
-#: engines/scumm/help.cpp:191 engines/scumm/help.cpp:209
-#: backends/keymapper/remap-dialog.cpp:52
+#: gui/gui-manager.cpp:117 backends/keymapper/remap-dialog.cpp:53
+#: engines/scumm/help.cpp:125 engines/scumm/help.cpp:140
+#: engines/scumm/help.cpp:165 engines/scumm/help.cpp:191
+#: engines/scumm/help.cpp:209
msgid "Close"
msgstr "·ÐÚàëæì"
-#: gui/gui-manager.cpp:118
+#: gui/gui-manager.cpp:120
msgid "Mouse click"
msgstr "ºÛöÚ Üëèèã"
-#: gui/gui-manager.cpp:122 base/main.cpp:301
+#: gui/gui-manager.cpp:124 base/main.cpp:319
msgid "Display keyboard"
msgstr "¿ÐÚÐ×Ðæì ÚÛÐÒöïâãàã"
-#: gui/gui-manager.cpp:126 base/main.cpp:305
+#: gui/gui-manager.cpp:128 base/main.cpp:323
msgid "Remap keys"
msgstr "¿ÕàÐßàë×ÝÐçëæì ÚÛÐÒöèë"
-#: gui/gui-manager.cpp:129 base/main.cpp:308
+#: gui/gui-manager.cpp:131 base/main.cpp:326
msgid "Toggle FullScreen"
msgstr "¿ÕàÐÚÛîçíÝÝÕ ÝÐ þÒÕáì íÚàÐÝ"
@@ -101,21 +101,21 @@ msgstr "°ÑïàëæÕ Ô×ÕïÝÝÕ ÔÛï ßàë×ÝÐçíÝÝï"
msgid "Map"
msgstr "¿àë×ÝÐçëæì"
-#: gui/KeysDialog.cpp:42 gui/launcher.cpp:346 gui/launcher.cpp:1001
-#: gui/launcher.cpp:1005 gui/massadd.cpp:91 gui/options.cpp:1239
-#: gui/saveload-dialog.cpp:920 gui/fluidsynth-dialog.cpp:152
-#: engines/engine.cpp:366 engines/engine.cpp:377
-#: engines/drascula/saveload.cpp:51 engines/scumm/dialogs.cpp:192
-#: engines/scumm/scumm.cpp:1778 engines/agos/animation.cpp:558
-#: engines/groovie/script.cpp:420 engines/sky/compact.cpp:131
-#: engines/sky/compact.cpp:141 engines/sword1/animation.cpp:519
-#: engines/sword1/animation.cpp:540 engines/sword1/animation.cpp:550
-#: engines/sword1/animation.cpp:557 engines/sword1/control.cpp:865
-#: engines/sword1/logic.cpp:1633 engines/sword2/animation.cpp:419
-#: engines/sword2/animation.cpp:439 engines/sword2/animation.cpp:449
-#: engines/sword2/animation.cpp:458 engines/parallaction/saveload.cpp:274
+#: gui/KeysDialog.cpp:42 gui/launcher.cpp:352 gui/launcher.cpp:1048
+#: gui/launcher.cpp:1052 gui/massadd.cpp:92 gui/options.cpp:1240
+#: gui/saveload-dialog.cpp:923 gui/fluidsynth-dialog.cpp:153
+#: engines/engine.cpp:371 engines/engine.cpp:382
#: backends/platform/wii/options.cpp:47
#: backends/platform/wince/CELauncherDialog.cpp:54
+#: engines/agos/animation.cpp:558 engines/drascula/saveload.cpp:49
+#: engines/groovie/script.cpp:399 engines/parallaction/saveload.cpp:274
+#: engines/scumm/dialogs.cpp:193 engines/scumm/scumm.cpp:1779
+#: engines/sky/compact.cpp:131 engines/sky/compact.cpp:141
+#: engines/sword1/animation.cpp:524 engines/sword1/animation.cpp:545
+#: engines/sword1/animation.cpp:561 engines/sword1/animation.cpp:569
+#: engines/sword1/control.cpp:865 engines/sword1/logic.cpp:1633
+#: engines/sword2/animation.cpp:425 engines/sword2/animation.cpp:445
+#: engines/sword2/animation.cpp:461 engines/sword2/animation.cpp:471
msgid "OK"
msgstr "OK"
@@ -141,15 +141,15 @@ msgstr "ºÐÛö ÛÐáÚÐ, ÐÑïàëæÕ Ô×ÕïÝÝÕ"
msgid "Press the key to associate"
msgstr "½ÐæöáÝöæÕ ÚÛÐÒöèã ÔÛï ßàë×ÝÐçíÝÝï"
-#: gui/launcher.cpp:187
+#: gui/launcher.cpp:193
msgid "Game"
msgstr "³ãÛìÝï"
-#: gui/launcher.cpp:191
+#: gui/launcher.cpp:197
msgid "ID:"
msgstr "ID:"
-#: gui/launcher.cpp:191 gui/launcher.cpp:193 gui/launcher.cpp:194
+#: gui/launcher.cpp:197 gui/launcher.cpp:199 gui/launcher.cpp:200
msgid ""
"Short game identifier used for referring to savegames and running the game "
"from the command line"
@@ -157,315 +157,316 @@ msgstr ""
"ºÐàÞâÚö öÔíÝâëäöÚÐâÐà, ÒëÚÐàëáâÞþÒÐÝë ÔÛï öÜñÝÐþ ×ÐåÐÒÐÝÝïþ ÓãÛìÝïþ ö ÔÛï "
"×ÐßãáÚã × ÚÐÜÐÝÔÝÐÓÐ àÐÔÚÐ"
-#: gui/launcher.cpp:193
+#: gui/launcher.cpp:199
msgctxt "lowres"
msgid "ID:"
msgstr "ID:"
-#: gui/launcher.cpp:198
+#: gui/launcher.cpp:204
msgid "Name:"
msgstr "½Ð×ÒÐ:"
-#: gui/launcher.cpp:198 gui/launcher.cpp:200 gui/launcher.cpp:201
+#: gui/launcher.cpp:204 gui/launcher.cpp:206 gui/launcher.cpp:207
msgid "Full title of the game"
msgstr "¿ÞþÝÐï ÝÐ×ÒÐ ÓãÛìÝö"
-#: gui/launcher.cpp:200
+#: gui/launcher.cpp:206
msgctxt "lowres"
msgid "Name:"
msgstr "½Ð×Ò:"
-#: gui/launcher.cpp:204
+#: gui/launcher.cpp:210
msgid "Language:"
msgstr "¼ÞÒÐ:"
-#: gui/launcher.cpp:204 gui/launcher.cpp:205
+#: gui/launcher.cpp:210 gui/launcher.cpp:211
msgid ""
"Language of the game. This will not turn your Spanish game version into "
"English"
msgstr ""
"¼ÞÒÐ ÓãÛìÝö. ·ÜÕÝÐ ÓíâÐÙ ÝÐÛÐÔë ÝÕ ßÕàÐâÒÞàëæì ÐÝÓÕÛìáÚãî ÓãÛìÝî þ àãáÚãî"
-#: gui/launcher.cpp:206 gui/launcher.cpp:220 gui/options.cpp:86
-#: gui/options.cpp:736 gui/options.cpp:749 gui/options.cpp:1209
-#: audio/null.cpp:40
+#: gui/launcher.cpp:212 gui/launcher.cpp:226 gui/options.cpp:87
+#: gui/options.cpp:737 gui/options.cpp:750 gui/options.cpp:1210
+#: audio/null.cpp:41
msgid "<default>"
msgstr "<ßÐ ×ÜÐþçÐÝÝö>"
-#: gui/launcher.cpp:216
+#: gui/launcher.cpp:222
msgid "Platform:"
msgstr "¿ÛÐâäÞàÜÐ:"
-#: gui/launcher.cpp:216 gui/launcher.cpp:218 gui/launcher.cpp:219
+#: gui/launcher.cpp:222 gui/launcher.cpp:224 gui/launcher.cpp:225
msgid "Platform the game was originally designed for"
msgstr "¿ÛÐâäÞàÜÐ, ÔÛï ïÚÞÙ ÓãÛìÝï ÑëÛÐ ßÕàèÐßÐçÐâÚÞÒÐ àÐáßàÐæÐÒÐÝÐ"
-#: gui/launcher.cpp:218
+#: gui/launcher.cpp:224
msgctxt "lowres"
msgid "Platform:"
msgstr "¿ÛÐâäÞàÜÐ:"
-#: gui/launcher.cpp:231
+#: gui/launcher.cpp:237
msgid "Engine"
msgstr "ÀãåÐÒöçÞÚ"
-#: gui/launcher.cpp:239 gui/options.cpp:1072 gui/options.cpp:1089
+#: gui/launcher.cpp:245 gui/options.cpp:1073 gui/options.cpp:1090
msgid "Graphics"
msgstr "³àÐäöÚÐ"
-#: gui/launcher.cpp:239 gui/options.cpp:1072 gui/options.cpp:1089
+#: gui/launcher.cpp:245 gui/options.cpp:1073 gui/options.cpp:1090
msgid "GFX"
msgstr "³àä"
-#: gui/launcher.cpp:242
+#: gui/launcher.cpp:248
msgid "Override global graphic settings"
msgstr "¿ÕàÐÚàëæì ÓÛÐÑÐÛìÝëï ÝÐÛÐÔë ÓàÐäöÚö"
-#: gui/launcher.cpp:244
+#: gui/launcher.cpp:250
msgctxt "lowres"
msgid "Override global graphic settings"
msgstr "¿ÕàÐÚàëæì ÓÛÐÑÐÛìÝëï ÝÐÛÐÔë ÓàÐäöÚö"
-#: gui/launcher.cpp:251 gui/options.cpp:1095
+#: gui/launcher.cpp:257 gui/options.cpp:1096
msgid "Audio"
msgstr "°þÔëñ"
-#: gui/launcher.cpp:254
+#: gui/launcher.cpp:260
msgid "Override global audio settings"
msgstr "¿ÕàÐÚàëæì ÓÛÐÑÐÛìÝëï ÝÐÛÐÔë ÐþÔëñ"
-#: gui/launcher.cpp:256
+#: gui/launcher.cpp:262
msgctxt "lowres"
msgid "Override global audio settings"
msgstr "¿ÕàÐÚàëæì ÓÛÐÑÐÛìÝëï ÝÐÛÐÔë ÐþÔëñ"
-#: gui/launcher.cpp:265 gui/options.cpp:1100
+#: gui/launcher.cpp:271 gui/options.cpp:1101
msgid "Volume"
msgstr "³ãçÝÐáæì"
-#: gui/launcher.cpp:267 gui/options.cpp:1102
+#: gui/launcher.cpp:273 gui/options.cpp:1103
msgctxt "lowres"
msgid "Volume"
msgstr "³ãçÝ"
-#: gui/launcher.cpp:270
+#: gui/launcher.cpp:276
msgid "Override global volume settings"
msgstr "¿ÕàÐÚàëæì ÓÛÐÑÐÛìÝëï ÝÐÛÐÔë ÓãçÝÐáæö"
-#: gui/launcher.cpp:272
+#: gui/launcher.cpp:278
msgctxt "lowres"
msgid "Override global volume settings"
msgstr "¿ÕàÐÚàëæì ÓÛÐÑÐÛìÝëï ÝÐÛÐÔë ÓãçÝÐáæö"
-#: gui/launcher.cpp:280 gui/options.cpp:1110
+#: gui/launcher.cpp:286 gui/options.cpp:1111
msgid "MIDI"
msgstr "MIDI"
-#: gui/launcher.cpp:283
+#: gui/launcher.cpp:289
msgid "Override global MIDI settings"
msgstr "¿ÕàÐÚàëæì ÓÛÐÑÐÛìÝëï ÝÐÛÐÔë MIDI"
-#: gui/launcher.cpp:285
+#: gui/launcher.cpp:291
msgctxt "lowres"
msgid "Override global MIDI settings"
msgstr "¿ÕàÐÚàëæì ÓÛÐÑÐÛìÝëï ÝÐÛÐÔë MIDI"
-#: gui/launcher.cpp:294 gui/options.cpp:1116
+#: gui/launcher.cpp:300 gui/options.cpp:1117
msgid "MT-32"
msgstr "MT-32"
-#: gui/launcher.cpp:297
+#: gui/launcher.cpp:303
msgid "Override global MT-32 settings"
msgstr "¿ÕàÐÚàëæì ÓÛÐÑÐÛìÝëï ÝÐÛÐÔë MT-32"
-#: gui/launcher.cpp:299
+#: gui/launcher.cpp:305
msgctxt "lowres"
msgid "Override global MT-32 settings"
msgstr "¿ÕàÐÚàëæì ÓÛÐÑÐÛìÝëï ÝÐÛÐÔë MT-32"
-#: gui/launcher.cpp:308 gui/options.cpp:1123
+#: gui/launcher.cpp:314 gui/options.cpp:1124
msgid "Paths"
msgstr "ÈÛïåö"
-#: gui/launcher.cpp:310 gui/options.cpp:1125
+#: gui/launcher.cpp:316 gui/options.cpp:1126
msgctxt "lowres"
msgid "Paths"
msgstr "ÈÛïåö"
-#: gui/launcher.cpp:317
+#: gui/launcher.cpp:323
msgid "Game Path:"
msgstr "ÈÛïå ÔÐ ÓãÛìÝö:"
-#: gui/launcher.cpp:319
+#: gui/launcher.cpp:325
msgctxt "lowres"
msgid "Game Path:"
msgstr "´×Õ ÓãÛìÝï:"
-#: gui/launcher.cpp:324 gui/options.cpp:1149
+#: gui/launcher.cpp:330 gui/options.cpp:1150
msgid "Extra Path:"
msgstr "´ÐÔ. èÛïå:"
-#: gui/launcher.cpp:324 gui/launcher.cpp:326 gui/launcher.cpp:327
+#: gui/launcher.cpp:330 gui/launcher.cpp:332 gui/launcher.cpp:333
msgid "Specifies path to additional data used the game"
msgstr "¿ÐÚÐ×ÒÐÕ èÛïå ÔÐ ÔÐÔÐâÚÞÒëå äÐÙÛÐþ, ÔÐÔ×ÕÝëå ÔÛï ÓãÛìÝö"
-#: gui/launcher.cpp:326 gui/options.cpp:1151
+#: gui/launcher.cpp:332 gui/options.cpp:1152
msgctxt "lowres"
msgid "Extra Path:"
msgstr "´ÐÔ. èÛïå:"
-#: gui/launcher.cpp:333 gui/options.cpp:1133
+#: gui/launcher.cpp:339 gui/options.cpp:1134
msgid "Save Path:"
msgstr "·ÐåÐÒÐÝÝö ÓãÛìÝïþ:"
-#: gui/launcher.cpp:333 gui/launcher.cpp:335 gui/launcher.cpp:336
-#: gui/options.cpp:1133 gui/options.cpp:1135 gui/options.cpp:1136
+#: gui/launcher.cpp:339 gui/launcher.cpp:341 gui/launcher.cpp:342
+#: gui/options.cpp:1134 gui/options.cpp:1136 gui/options.cpp:1137
msgid "Specifies where your savegames are put"
msgstr "¿ÐÚÐ×ÒÐÕ èÛïå ÔÐ ×ÐåÐÒÐÝÝïþ ÓãÛìÝö"
-#: gui/launcher.cpp:335 gui/options.cpp:1135
+#: gui/launcher.cpp:341 gui/options.cpp:1136
msgctxt "lowres"
msgid "Save Path:"
msgstr "ÈÛïå ×Ðå.:"
-#: gui/launcher.cpp:354 gui/launcher.cpp:453 gui/launcher.cpp:511
-#: gui/launcher.cpp:565 gui/options.cpp:1144 gui/options.cpp:1152
-#: gui/options.cpp:1161 gui/options.cpp:1276 gui/options.cpp:1282
-#: gui/options.cpp:1290 gui/options.cpp:1320 gui/options.cpp:1326
-#: gui/options.cpp:1333 gui/options.cpp:1426 gui/options.cpp:1429
-#: gui/options.cpp:1441
+#: gui/launcher.cpp:360 gui/launcher.cpp:459 gui/launcher.cpp:517
+#: gui/launcher.cpp:571 gui/options.cpp:1145 gui/options.cpp:1153
+#: gui/options.cpp:1162 gui/options.cpp:1277 gui/options.cpp:1283
+#: gui/options.cpp:1291 gui/options.cpp:1321 gui/options.cpp:1327
+#: gui/options.cpp:1334 gui/options.cpp:1427 gui/options.cpp:1430
+#: gui/options.cpp:1442
msgctxt "path"
msgid "None"
msgstr "½Õ ×ÐÔÐÔ×ÕÝë"
-#: gui/launcher.cpp:359 gui/launcher.cpp:459 gui/launcher.cpp:569
-#: gui/options.cpp:1270 gui/options.cpp:1314 gui/options.cpp:1432
+#: gui/launcher.cpp:365 gui/launcher.cpp:465 gui/launcher.cpp:575
+#: gui/options.cpp:1271 gui/options.cpp:1315 gui/options.cpp:1433
#: backends/platform/wii/options.cpp:56
msgid "Default"
msgstr "¿Ð ×ÜÐþçÐÝÝö"
-#: gui/launcher.cpp:504 gui/options.cpp:1435
+#: gui/launcher.cpp:510 gui/options.cpp:1436
msgid "Select SoundFont"
msgstr "°ÑïàëæÕ SoundFont"
-#: gui/launcher.cpp:523 gui/launcher.cpp:677
+#: gui/launcher.cpp:529 gui/launcher.cpp:682
msgid "Select directory with game data"
msgstr "°ÑïàëæÕ ÔëàíÚâÞàëî × äÐÙÛÐÜö ÓãÛìÝö"
-#: gui/launcher.cpp:541
+#: gui/launcher.cpp:547
msgid "Select additional game directory"
msgstr "°ÑïàëæÕ ÔÐÔÐâÚÞÒãî ÔëàíÚâÞàëî ÓãÛìÝö"
-#: gui/launcher.cpp:553
+#: gui/launcher.cpp:559
msgid "Select directory for saved games"
msgstr "°ÑïàëæÕ ÔëàíÚâÞàëî ÔÛï ×ÐåÐÒÐÝÝïþ"
-#: gui/launcher.cpp:580
+#: gui/launcher.cpp:586
msgid "This game ID is already taken. Please choose another one."
msgstr "³íâë ID ÓãÛìÝö þÖÞ ÒëÚÐàëáâÞþÒÐÕææÐ. ºÐÛö ÛÐáÚÐ, ÐÑïàëæÕ öÝèë."
-#: gui/launcher.cpp:621 engines/dialogs.cpp:110
+#: gui/launcher.cpp:626 engines/dialogs.cpp:111
msgid "~Q~uit"
msgstr "~²~ëåÐÔ"
-#: gui/launcher.cpp:621 backends/platform/sdl/macosx/appmenu_osx.mm:95
+#: gui/launcher.cpp:626 backends/platform/sdl/macosx/appmenu_osx.mm:95
msgid "Quit ScummVM"
msgstr "·ÐÒïàèëæì ScummVM"
-#: gui/launcher.cpp:622
+#: gui/launcher.cpp:627
msgid "A~b~out..."
msgstr "¿àÐ ß~à~ÐÓàÐÜã..."
-#: gui/launcher.cpp:622 backends/platform/sdl/macosx/appmenu_osx.mm:69
+#: gui/launcher.cpp:627 backends/platform/sdl/macosx/appmenu_osx.mm:69
msgid "About ScummVM"
msgstr "¿àÐ ßàÐÓàÐÜã ScummVM"
-#: gui/launcher.cpp:623
+#: gui/launcher.cpp:628
msgid "~O~ptions..."
msgstr "~½~ÐÛÐÔë..."
-#: gui/launcher.cpp:623
+#: gui/launcher.cpp:628
msgid "Change global ScummVM options"
msgstr "·ÜïÝöæì ÓÛÐÑÐÛìÝëï ÝÐÛÐÔë ScummVM"
-#: gui/launcher.cpp:625
+#: gui/launcher.cpp:630
msgid "~S~tart"
msgstr "¿~ã~áÚ"
-#: gui/launcher.cpp:625
+#: gui/launcher.cpp:630
msgid "Start selected game"
msgstr "·Ðßãáæöæì ÐÑàÐÝãî ÓãÛìÝî"
-#: gui/launcher.cpp:628
+#: gui/launcher.cpp:633
msgid "~L~oad..."
msgstr "~·~ÐÓàã×öæì..."
-#: gui/launcher.cpp:628
+#: gui/launcher.cpp:633
msgid "Load savegame for selected game"
msgstr "·ÐÓàã×öæì ×ÐåÐÒÐÝÝÕ ÔÛï ÐÑàÐÝÐÙ ÓãÛìÝö"
-#: gui/launcher.cpp:633 gui/launcher.cpp:1120
+#: gui/launcher.cpp:638
msgid "~A~dd Game..."
msgstr "~´~ÐÔÐæì ÓãÛìÝî..."
-#: gui/launcher.cpp:633 gui/launcher.cpp:640
+#: gui/launcher.cpp:638 gui/launcher.cpp:645
msgid "Hold Shift for Mass Add"
msgstr "ÃâàëÜÛöÒÐÙæÕ ÚÛÐÒöèã Shift ÔÛï âÐÓÞ, ÚÐÑ ÔÐÔÐæì ÝÕÚÐÛìÚö ÓãÛìÝïþ"
-#: gui/launcher.cpp:635
+#: gui/launcher.cpp:640
msgid "~E~dit Game..."
msgstr "½~Ð~ÛÐÔë ÓãÛìÝö..."
-#: gui/launcher.cpp:635 gui/launcher.cpp:642
+#: gui/launcher.cpp:640 gui/launcher.cpp:647
msgid "Change game options"
msgstr "·ÜïÝöæì ÝÐÛÐÔë ÓãÛìÝö"
-#: gui/launcher.cpp:637
+#: gui/launcher.cpp:642
msgid "~R~emove Game"
msgstr "²~ë~ÔÐÛöæì ÓãÛìÝî"
-#: gui/launcher.cpp:637 gui/launcher.cpp:644
+#: gui/launcher.cpp:642 gui/launcher.cpp:649
msgid "Remove game from the list. The game data files stay intact"
msgstr "²ëÔÐÛöæì ÓãÛìÝî áÐ áßöáã. ½Õ ÒëÔÐÛïÕ ÓãÛìÝî × ÖÞàáâÚÐÓÐ ÔëáÚÐ"
-#: gui/launcher.cpp:640 gui/launcher.cpp:1120
+#: gui/launcher.cpp:645
msgctxt "lowres"
msgid "~A~dd Game..."
msgstr "~´~ÐÔ. ÓãÛìÝî..."
-#: gui/launcher.cpp:642
+#: gui/launcher.cpp:647
msgctxt "lowres"
msgid "~E~dit Game..."
msgstr "½~Ð~Û. ÓãÛìÝö..."
-#: gui/launcher.cpp:644
+#: gui/launcher.cpp:649
msgctxt "lowres"
msgid "~R~emove Game"
msgstr "²~ë~ÔÐÛöæì ÓãÛìÝî"
-#: gui/launcher.cpp:652
+#: gui/launcher.cpp:657
msgid "Search in game list"
msgstr "¿ÞèãÚ ã áßöáÕ ÓãÛìÝïþ"
-#: gui/launcher.cpp:656 gui/launcher.cpp:1167
+#: gui/launcher.cpp:661 gui/launcher.cpp:1222
msgid "Search:"
msgstr "¿ÞèãÚ:"
-#: gui/launcher.cpp:680 engines/dialogs.cpp:114 engines/mohawk/myst.cpp:245
-#: engines/mohawk/riven.cpp:716 engines/cruise/menu.cpp:214
-#: engines/pegasus/pegasus.cpp:349
+#: gui/launcher.cpp:685 engines/dialogs.cpp:115 engines/cruise/menu.cpp:214
+#: engines/mohawk/myst.cpp:245 engines/mohawk/riven.cpp:718
+#: engines/pegasus/pegasus.cpp:353
msgid "Load game:"
msgstr "·ÐÓàã×öæì ÓãÛìÝî:"
-#: gui/launcher.cpp:680 engines/dialogs.cpp:114 engines/scumm/dialogs.cpp:188
-#: engines/mohawk/myst.cpp:245 engines/mohawk/riven.cpp:716
-#: engines/cruise/menu.cpp:214 engines/pegasus/pegasus.cpp:349
+#: gui/launcher.cpp:685 engines/dialogs.cpp:115
#: backends/platform/wince/CEActionsPocket.cpp:267
#: backends/platform/wince/CEActionsSmartphone.cpp:231
+#: engines/cruise/menu.cpp:214 engines/mohawk/myst.cpp:245
+#: engines/mohawk/riven.cpp:718 engines/pegasus/pegasus.cpp:353
+#: engines/scumm/dialogs.cpp:189
msgid "Load"
msgstr "·ÐÓàã×öæì"
-#: gui/launcher.cpp:788
+#: gui/launcher.cpp:792
msgid ""
"Do you really want to run the mass game detector? This could potentially add "
"a huge number of games."
@@ -473,7 +474,8 @@ msgstr ""
"²ë áÐßàÐþÔë ÖÐÔÐÕæÕ ×Ðßãáæöæì ÔíâíÚâÐà ãáöå ÓãÛìÝïþ? ³íâÐ ßÐâíÝæëïÛìÝÐ ÜÞÖÐ "
"ÔÐÔÐæì ÒïÛöÚãî ÚÞÛìÚÐáæì ÓãÛìÝïþ."
-#: gui/launcher.cpp:789 gui/launcher.cpp:937 gui/fluidsynth-dialog.cpp:216
+#: gui/launcher.cpp:793 gui/launcher.cpp:941 gui/launcher.cpp:1000
+#: gui/fluidsynth-dialog.cpp:217
#: backends/events/symbiansdl/symbiansdl-events.cpp:184
#: backends/platform/wince/CEActionsPocket.cpp:326
#: backends/platform/wince/CEActionsSmartphone.cpp:287
@@ -481,7 +483,8 @@ msgstr ""
msgid "Yes"
msgstr "ÂÐÚ"
-#: gui/launcher.cpp:789 gui/launcher.cpp:937 gui/fluidsynth-dialog.cpp:216
+#: gui/launcher.cpp:793 gui/launcher.cpp:941 gui/launcher.cpp:1000
+#: gui/fluidsynth-dialog.cpp:217
#: backends/events/symbiansdl/symbiansdl-events.cpp:184
#: backends/platform/wince/CEActionsPocket.cpp:326
#: backends/platform/wince/CEActionsSmartphone.cpp:287
@@ -489,189 +492,184 @@ msgstr "ÂÐÚ"
msgid "No"
msgstr "½Õ"
-#: gui/launcher.cpp:837
+#: gui/launcher.cpp:841
msgid "ScummVM couldn't open the specified directory!"
msgstr "ScummVM ÝÕ ÜÞÖÐ ÐÔÚàëæì Ð×ÝÐçÐÝãî ÔëàíÚâÞàëî!"
-#: gui/launcher.cpp:849
+#: gui/launcher.cpp:853
msgid "ScummVM could not find any game in the specified directory!"
msgstr "ScummVM ÝÕ ÜÞÖÐ ×ÝÐÙáæö ÓãÛìÝî þ Ð×ÝÐçÐÝÐÙ ÔëàíÚâÞàëö!"
-#: gui/launcher.cpp:863
+#: gui/launcher.cpp:867
msgid "Pick the game:"
msgstr "°ÑïàëæÕ ÓãÛìÝî:"
-#: gui/launcher.cpp:937
+#: gui/launcher.cpp:941
msgid "Do you really want to remove this game configuration?"
msgstr "²ë áÐßàÐþÔë ÖÐÔÐÕæÕ ÒëÔÐÛöæì ÝÐÛÐÔë ÔÛï ÓíâÐÙ ÓãÛìÝö?"
-#: gui/launcher.cpp:1001
+#: gui/launcher.cpp:999
+#, fuzzy
+msgid "Do you want to load savegame?"
+msgstr "²ë ÖÐÔÐÕæÕ ×ÐÓàã×öæì ÐÑÞ ×ÐåÐÒÐæì ÓãÛìÝî?"
+
+#: gui/launcher.cpp:1048
msgid "This game does not support loading games from the launcher."
msgstr "³íâÐï ÓãÛìÝï ÝÕ ßÐÔâàëÜÛöÒÐÕ ×ÐÓàã×Úã ×ÐåÐÒÐÝÝïþ ßàÐ× ÓÐÛÞþÝÐÕ ÜÕÝî."
-#: gui/launcher.cpp:1005
+#: gui/launcher.cpp:1052
msgid "ScummVM could not find any engine capable of running the selected game!"
msgstr "ScummVM ÝÕ ×ÜÞÓ ×ÝÐÙáæö àãåÐÒöçÞÚ ÔÛï ×ÐßãáÚã ÐÑàÐÝÐÙ ÓãÛìÝö!"
-#: gui/launcher.cpp:1119
-msgctxt "lowres"
-msgid "Mass Add..."
-msgstr "ÈÜÐâ ÓãÛìÝïþ..."
-
-#: gui/launcher.cpp:1119
-msgid "Mass Add..."
-msgstr "ÈÜÐâ ÓãÛìÝïþ..."
-
-#: gui/massadd.cpp:78 gui/massadd.cpp:81
+#: gui/massadd.cpp:79 gui/massadd.cpp:82
msgid "... progress ..."
msgstr "...èãÚÐî..."
-#: gui/massadd.cpp:258
+#: gui/massadd.cpp:259
msgid "Scan complete!"
msgstr "¿ÞèãÚ áÚÞÝçÐÝë!"
-#: gui/massadd.cpp:261
+#: gui/massadd.cpp:262
#, c-format
msgid "Discovered %d new games, ignored %d previously added games."
msgstr "·ÝÞÙÔ×ÕÝÐ %d ÝÞÒëå ÓãÛìÝïþ, ßàÐßãèçÐÝÐ %d àÐÝÕÙ ÔÐÔÐÔ×ÕÝëå ÓãÛìÝïþ."
-#: gui/massadd.cpp:265
+#: gui/massadd.cpp:266
#, c-format
msgid "Scanned %d directories ..."
msgstr "¿àÐÓÛÕÔÖÐÝÐ %d ÔëàíÚâÞàëÙ..."
-#: gui/massadd.cpp:268
+#: gui/massadd.cpp:269
#, c-format
msgid "Discovered %d new games, ignored %d previously added games ..."
msgstr "·ÝÞÙÔ×ÕÝÐ %d ÝÞÒëå ÓãÛìÝïþ, ßàÐßãèçÐÝÐ %d àÐÝÕÙ ÔÐÔÐÔ×ÕÝëå ÓãÛìÝïþ..."
-#: gui/options.cpp:84
+#: gui/options.cpp:85
msgid "Never"
msgstr "½öÚÞÛö"
-#: gui/options.cpp:84
+#: gui/options.cpp:85
msgid "every 5 mins"
msgstr "ÚÞÖÝëï 5 åÒöÛöÝ"
-#: gui/options.cpp:84
+#: gui/options.cpp:85
msgid "every 10 mins"
msgstr "ÚÞÖÝëï 10 åÒöÛöÝ"
-#: gui/options.cpp:84
+#: gui/options.cpp:85
msgid "every 15 mins"
msgstr "ÚÞÖÝëï 15 åÒöÛöÝ"
-#: gui/options.cpp:84
+#: gui/options.cpp:85
msgid "every 30 mins"
msgstr "ÚÞÖÝëï 30 åÒöÛöÝ"
-#: gui/options.cpp:86
+#: gui/options.cpp:87
msgid "8 kHz"
msgstr "8 Ú³æ"
-#: gui/options.cpp:86
+#: gui/options.cpp:87
msgid "11kHz"
msgstr "11 Ú³æ"
-#: gui/options.cpp:86
+#: gui/options.cpp:87
msgid "22 kHz"
msgstr "22 Ú³æ"
-#: gui/options.cpp:86
+#: gui/options.cpp:87
msgid "44 kHz"
msgstr "44 Ú³æ"
-#: gui/options.cpp:86
+#: gui/options.cpp:87
msgid "48 kHz"
msgstr "48 Ú³æ"
-#: gui/options.cpp:254 gui/options.cpp:480 gui/options.cpp:581
-#: gui/options.cpp:650 gui/options.cpp:858
+#: gui/options.cpp:255 gui/options.cpp:481 gui/options.cpp:582
+#: gui/options.cpp:651 gui/options.cpp:859
msgctxt "soundfont"
msgid "None"
msgstr "½Õ ×ÐÔÐÔ×ÕÝë"
-#: gui/options.cpp:388
+#: gui/options.cpp:389
msgid "Failed to apply some of the graphic options changes:"
msgstr "½Õ ÐâàëÜÐÛÐáï þÖëæì ×ÜÕÝë ÝÕÚÐâÞàëå ÓàÐäöçÝëå ÝÐÛÐÔ:"
-#: gui/options.cpp:400
+#: gui/options.cpp:401
msgid "the video mode could not be changed."
msgstr "ÒöÔíÐàíÖëÜ ÝÕ ÜÞÖÐ Ñëæì ×ÜÕÝÕÝë."
-#: gui/options.cpp:406
+#: gui/options.cpp:407
msgid "the fullscreen setting could not be changed"
msgstr "ßÞþÝÐíÚàÐÝÝë àíÖëÜ ÝÕ ÜÞÖÐ Ñëæì ×ÜÕÝÕÝë"
-#: gui/options.cpp:412
+#: gui/options.cpp:413
msgid "the aspect ratio setting could not be changed"
msgstr "àíÖëÜ ÚÐàíÚâëàÞþÚö áãÐÔÝÞáöÝ ÑÐÚÞþ ÝÕ ÜÞÖÐ Ñëæì ×ÜÕÝÕÝë"
-#: gui/options.cpp:733
+#: gui/options.cpp:734
msgid "Graphics mode:"
msgstr "³àÐä. àíÖëÜ:"
-#: gui/options.cpp:747
+#: gui/options.cpp:748
msgid "Render mode:"
msgstr "ÀíÖëÜ àÐáâàã:"
-#: gui/options.cpp:747 gui/options.cpp:748
+#: gui/options.cpp:748 gui/options.cpp:749
msgid "Special dithering modes supported by some games"
msgstr "ÁßÕæëïÛìÝëï àíÖëÜë àíÝÔíàëÝÓã, ßÐÔâàëÜÞþÒÐÝëï ÝÕÚÐâÞàëÜö ÓãÛìÝïÜö"
-#: gui/options.cpp:759
-#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2236
-#: backends/graphics/openglsdl/openglsdl-graphics.cpp:476
+#: gui/options.cpp:760
+#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2249
msgid "Fullscreen mode"
msgstr "¿ÞþÝÐíÚàÐÝÝë àíÖëÜ"
-#: gui/options.cpp:762
+#: gui/options.cpp:763
msgid "Aspect ratio correction"
msgstr "ºÐàíÚæëï áãÐÔÝÞáöÝ ÑÐÚÞþ"
-#: gui/options.cpp:762
+#: gui/options.cpp:763
msgid "Correct aspect ratio for 320x200 games"
msgstr "ºÐàíÚâÐÒÐæì áãÐÔÝÞáöÝë ÑÐÚÞþ ÔÛï ÓãÛìÝïþ × àí×ÐÛîæëïÙ 320x200"
-#: gui/options.cpp:770
+#: gui/options.cpp:771
msgid "Preferred Device:"
msgstr "ÃßÐÔÐÑÐÝÐÕ:"
-#: gui/options.cpp:770
+#: gui/options.cpp:771
msgid "Music Device:"
msgstr "³ãÚÐÒÐï ßàëÛÐÔÐ:"
-#: gui/options.cpp:770 gui/options.cpp:772
+#: gui/options.cpp:771 gui/options.cpp:773
msgid "Specifies preferred sound device or sound card emulator"
msgstr "·Ð×ÝÐçÐÕ þßÐÔÐÑÐÝãî ÓãÚÐÒãî ßàëÛÐÔã æö íÜãÛïâÐà ÓãÚÐÒÞÙ ÚÐàâë"
-#: gui/options.cpp:770 gui/options.cpp:772 gui/options.cpp:773
+#: gui/options.cpp:771 gui/options.cpp:773 gui/options.cpp:774
msgid "Specifies output sound device or sound card emulator"
msgstr "·Ð×ÝÐçÐÕ ÒëåÞÔÝãî ÓãÚÐÒãî ßàëÛÐÔã æö íÜãÛïâÐà ÓãÚÐÒÞÙ ÚÐàâë"
-#: gui/options.cpp:772
+#: gui/options.cpp:773
msgctxt "lowres"
msgid "Preferred Dev.:"
msgstr "ÃßÐÔÐÑÐÝÐÕ:"
-#: gui/options.cpp:772
+#: gui/options.cpp:773
msgctxt "lowres"
msgid "Music Device:"
msgstr "³ãÚ. ßàëÛÐÔÐ:"
-#: gui/options.cpp:799
+#: gui/options.cpp:800
msgid "AdLib emulator:"
msgstr "ÍÜãÛïâÐà AdLib:"
-#: gui/options.cpp:799 gui/options.cpp:800
+#: gui/options.cpp:800 gui/options.cpp:801
msgid "AdLib is used for music in many games"
msgstr "³ãÚÐÒÐï ÚÐàâÐ AdLib ÒëÚÐàëáâÞþÒÐÕææÐ ÜÝÞÓöÜö ÓãÛìÝïÜö"
-#: gui/options.cpp:810
+#: gui/options.cpp:811
msgid "Output rate:"
msgstr "ÇÐèçëÝï ÓãÚã:"
-#: gui/options.cpp:810 gui/options.cpp:811
+#: gui/options.cpp:811 gui/options.cpp:812
msgid ""
"Higher value specifies better sound quality but may be not supported by your "
"soundcard"
@@ -679,68 +677,68 @@ msgstr ""
"±ÞÛìèëï ×ÝÐçíÝÝö ×ÐÔÐîæì ÛÕßèãî ïÚÐáæì ÓãÚã, ÐÔÝÐÚ ïÝë ÜÞÓãæì ÝÕ "
"ßÐÔâàëÜÛöÒÐææÐ ÒÐèÐÙ ÓãÚÐÒÞÙ ÚÐàâÐÙ"
-#: gui/options.cpp:821
+#: gui/options.cpp:822
msgid "GM Device:"
msgstr "¿àëÛÐÔÐ GM:"
-#: gui/options.cpp:821
+#: gui/options.cpp:822
msgid "Specifies default sound device for General MIDI output"
msgstr "·Ð×ÝÐçÐÕ ÒëåÞÔÝãî ÓãÚÐÒãî ßàëÛÐÔã ÔÛï MIDI"
-#: gui/options.cpp:832
+#: gui/options.cpp:833
msgid "Don't use General MIDI music"
msgstr "½Õ ÒëÚÐàëáâÞþÒÐæì Üã×ëÚã ÔÛï General MIDI"
-#: gui/options.cpp:843 gui/options.cpp:909
+#: gui/options.cpp:844 gui/options.cpp:910
msgid "Use first available device"
msgstr "²ëÚÐàëáâÞþÒÐæì ßÕàèãî ÔÐáâãßÝãî ßàëÛÐÔã"
-#: gui/options.cpp:855
+#: gui/options.cpp:856
msgid "SoundFont:"
msgstr "SoundFont:"
-#: gui/options.cpp:855 gui/options.cpp:857 gui/options.cpp:858
+#: gui/options.cpp:856 gui/options.cpp:858 gui/options.cpp:859
msgid "SoundFont is supported by some audio cards, Fluidsynth and Timidity"
msgstr ""
"SoundFont'ë ßÐÔâàëÜÛöÒÐîææÐ ÝÕÚÐâÞàëÜö ÓãÚÐÒëÜö ÚÐàâÐÜö, Fluidsynth Ôë "
"Timidity"
-#: gui/options.cpp:857
+#: gui/options.cpp:858
msgctxt "lowres"
msgid "SoundFont:"
msgstr "SoundFont:"
-#: gui/options.cpp:863
+#: gui/options.cpp:864
msgid "Mixed AdLib/MIDI mode"
msgstr "·ÜÕèÐÝë àíÖëÜ AdLib/MIDI"
-#: gui/options.cpp:863
+#: gui/options.cpp:864
msgid "Use both MIDI and AdLib sound generation"
msgstr "²ëÚÐàëáâÞþÒÐæì ö MIDI, ö AdLib ÔÛï ÓÕÝÕàÐæëö ÓãÚã"
-#: gui/options.cpp:866
+#: gui/options.cpp:867
msgid "MIDI gain:"
msgstr "Ã×ÜÐæÝÕÝÝÕ MIDI:"
-#: gui/options.cpp:873
+#: gui/options.cpp:874
msgid "FluidSynth Settings"
msgstr "½ÐÛÐÔë FluidSynth"
-#: gui/options.cpp:880
+#: gui/options.cpp:881
msgid "MT-32 Device:"
msgstr "½ÐÛ. MT-32:"
-#: gui/options.cpp:880
+#: gui/options.cpp:881
msgid "Specifies default sound device for Roland MT-32/LAPC1/CM32l/CM64 output"
msgstr ""
"¿ÐÚÐ×ÒÐÕ ÓãÚÐÒãî ßàëÛÐÔã ßÐ ×ÜÐþçÐÝÝö ÔÛï ÒëÒÐÔã ÝÐ Roland MT-32/LAPC1/CM32l/"
"CM64"
-#: gui/options.cpp:885
+#: gui/options.cpp:886
msgid "True Roland MT-32 (disable GM emulation)"
msgstr "ÁÐßàÐþÔÝë Roland MT-32 (×ÐÑÐàÐÝöæì íÜãÛïæëî GM)"
-#: gui/options.cpp:885 gui/options.cpp:887
+#: gui/options.cpp:886 gui/options.cpp:888
msgid ""
"Check if you want to use your real hardware Roland-compatible sound device "
"connected to your computer"
@@ -748,194 +746,195 @@ msgstr ""
"°Ô×ÝÐçæÕ, ÚÐÛö þ ÒÐá ßÐÔÚÛîçÐÝÐ Roland-áãÜïèçÐÛìÝÐï ÓãÚÐÒÐï ßàëÛÐÔÐ ö Òë "
"ÖÐÔÐÕæÕ ïÕ ÒëÚÐàëáâÞþÒÐæì"
-#: gui/options.cpp:887
+#: gui/options.cpp:888
msgctxt "lowres"
msgid "True Roland MT-32 (no GM emulation)"
msgstr "ÁÐßàÐþÔÝë Roland MT-32 (ÑÕ× GM)"
-#: gui/options.cpp:890
-msgid "Roland GS Mode (disable GM mapping)"
+#: gui/options.cpp:891
+#, fuzzy
+msgid "Roland GS Device (enable MT-32 mappings)"
msgstr "ÀíÖëÜ Roland GS (×ÐÑÐàÐÝöæì àÐáÚÛÐÔÚã GM)"
-#: gui/options.cpp:890
-msgid "Turns off General MIDI mapping for games with Roland MT-32 soundtrack"
+#: gui/options.cpp:891
+msgid ""
+"Check if you want to enable patch mappings to emulate an MT-32 on a Roland "
+"GS device"
msgstr ""
-"²ëÚÛîçÐÕ áãßÐáâÐþÛÕÝÝÕ General MIDI ÔÛï ÓãÛìÝïþ × ÓãÚÐÒÞÙ ÔÐàÞÖÚÐÙ ÔÛï "
-"Roland MT-32"
-#: gui/options.cpp:899
+#: gui/options.cpp:900
msgid "Don't use Roland MT-32 music"
msgstr "½Õ ÒëÚÐàëáâÞþÒÐæì Üã×ëÚã ÔÛï MT-32"
-#: gui/options.cpp:926
+#: gui/options.cpp:927
msgid "Text and Speech:"
msgstr "ÂíÚáâ ö ÐÓãçÚÐ:"
-#: gui/options.cpp:930 gui/options.cpp:940
+#: gui/options.cpp:931 gui/options.cpp:941
msgid "Speech"
msgstr "°ÓãçÚÐ"
-#: gui/options.cpp:931 gui/options.cpp:941
+#: gui/options.cpp:932 gui/options.cpp:942
msgid "Subtitles"
msgstr "ÁãÑâëâàë"
-#: gui/options.cpp:932
+#: gui/options.cpp:933
msgid "Both"
msgstr "°ÑÞÕ"
-#: gui/options.cpp:934
+#: gui/options.cpp:935
msgid "Subtitle speed:"
msgstr "ÅãâÚÐáæì âëâàÐþ:"
-#: gui/options.cpp:936
+#: gui/options.cpp:937
msgctxt "lowres"
msgid "Text and Speech:"
msgstr "ÂíÚáâ ö ÐÓãçÚÐ:"
-#: gui/options.cpp:940
+#: gui/options.cpp:941
msgid "Spch"
msgstr "°Óãç"
-#: gui/options.cpp:941
+#: gui/options.cpp:942
msgid "Subs"
msgstr "狄"
-#: gui/options.cpp:942
+#: gui/options.cpp:943
msgctxt "lowres"
msgid "Both"
msgstr "°ÑÞÕ"
-#: gui/options.cpp:942
+#: gui/options.cpp:943
msgid "Show subtitles and play speech"
msgstr "¿ÐÚÐ×ÒÐæì áãÑâëâàë ö ßàÐÙÓàÐÒÐæì ÓÐÒÞàÚã"
-#: gui/options.cpp:944
+#: gui/options.cpp:945
msgctxt "lowres"
msgid "Subtitle speed:"
msgstr "ÅãâÚÐáæì âëâàÐþ:"
-#: gui/options.cpp:960
+#: gui/options.cpp:961
msgid "Music volume:"
msgstr "³ãçÝ. Üã×ëÚö:"
-#: gui/options.cpp:962
+#: gui/options.cpp:963
msgctxt "lowres"
msgid "Music volume:"
msgstr "³ãçÝ. Üã×ëÚö:"
-#: gui/options.cpp:969
+#: gui/options.cpp:970
msgid "Mute All"
msgstr "²ëÚÛ. ãáñ"
-#: gui/options.cpp:972
+#: gui/options.cpp:973
msgid "SFX volume:"
msgstr "³ãçÝÐáæì SFX:"
-#: gui/options.cpp:972 gui/options.cpp:974 gui/options.cpp:975
+#: gui/options.cpp:973 gui/options.cpp:975 gui/options.cpp:976
msgid "Special sound effects volume"
msgstr "³ãçÝÐáæì áßÕæëïÛìÝëå ÓãÚÐÒëå íäÕÚâÐþ"
-#: gui/options.cpp:974
+#: gui/options.cpp:975
msgctxt "lowres"
msgid "SFX volume:"
msgstr "³ãçÝ. SFX:"
-#: gui/options.cpp:982
+#: gui/options.cpp:983
msgid "Speech volume:"
msgstr "³ãçÝ. ÐÓãçÚö:"
-#: gui/options.cpp:984
+#: gui/options.cpp:985
msgctxt "lowres"
msgid "Speech volume:"
msgstr "³ãçÝ. ÐÓãçÚö:"
-#: gui/options.cpp:1141
+#: gui/options.cpp:1142
msgid "Theme Path:"
msgstr "ÈÛïå ÔÐ âíÜ:"
-#: gui/options.cpp:1143
+#: gui/options.cpp:1144
msgctxt "lowres"
msgid "Theme Path:"
msgstr "´×Õ âíÜë:"
-#: gui/options.cpp:1149 gui/options.cpp:1151 gui/options.cpp:1152
+#: gui/options.cpp:1150 gui/options.cpp:1152 gui/options.cpp:1153
msgid "Specifies path to additional data used by all games or ScummVM"
msgstr ""
"¿ÐÚÐ×ÒÐÕ èÛïå ÔÐ ÔÐÔÐâÚÞÒëå äÐÙÛÐþ ÔÐÔ×ÕÝëå, ÒëÚÐàëáâÞþÒÐÝëå ãáöÜö ÓãÛìÝïÜö, "
"ÐÑÞ ScummVM"
-#: gui/options.cpp:1158
+#: gui/options.cpp:1159
msgid "Plugins Path:"
msgstr "ÈÛïå ÔÐ ßÛÐÓöÝÐþ:"
-#: gui/options.cpp:1160
+#: gui/options.cpp:1161
msgctxt "lowres"
msgid "Plugins Path:"
msgstr "ÈÛïå ÔÐ ßÛÐÓöÝÐþ:"
-#: gui/options.cpp:1169 gui/fluidsynth-dialog.cpp:137
+#: gui/options.cpp:1170 gui/fluidsynth-dialog.cpp:138
msgid "Misc"
msgstr "ÀÞ×ÝÐÕ"
-#: gui/options.cpp:1171
+#: gui/options.cpp:1172
msgctxt "lowres"
msgid "Misc"
msgstr "ÀÞ×ÝÐÕ"
-#: gui/options.cpp:1173
+#: gui/options.cpp:1174
msgid "Theme:"
msgstr "ÂíÜÐ"
-#: gui/options.cpp:1177
+#: gui/options.cpp:1178
msgid "GUI Renderer:"
msgstr "¼ÐÛïÒÐÛÚÐ GUI:"
-#: gui/options.cpp:1189
+#: gui/options.cpp:1190
msgid "Autosave:"
msgstr "°þâÐ×ÐåÐÒÐÝÝÕ:"
-#: gui/options.cpp:1191
+#: gui/options.cpp:1192
msgctxt "lowres"
msgid "Autosave:"
msgstr "°þâÐ×Ðå.:"
-#: gui/options.cpp:1199
+#: gui/options.cpp:1200
msgid "Keys"
msgstr "ºÛÐÒöèë"
-#: gui/options.cpp:1206
+#: gui/options.cpp:1207
msgid "GUI Language:"
msgstr "¼ÞÒÐ GUI:"
-#: gui/options.cpp:1206
+#: gui/options.cpp:1207
msgid "Language of ScummVM GUI"
msgstr "¼ÞÒÐ ÓàÐäöçÝÐÓÐ öÝâíàäÕÙáã ScummVM"
-#: gui/options.cpp:1365
+#: gui/options.cpp:1366
msgid "You have to restart ScummVM before your changes will take effect."
msgstr "²ë ßÐÒöÝÝë ßÕàÐ×Ðßãáæöæì ScummVM, ÚÐÑ ãÖëæì ×ÜÕÝë."
-#: gui/options.cpp:1378
+#: gui/options.cpp:1379
msgid "Select directory for savegames"
msgstr "°ÑïàëæÕ ÔëàíÚâÞàëî ÔÛï ×ÐåÐÒÐÝÝïþ"
-#: gui/options.cpp:1385
+#: gui/options.cpp:1386
msgid "The chosen directory cannot be written to. Please select another one."
msgstr "½Õ ÜÐÓã ßöáÐæì ã ÐÑàÐÝãî ÔëàíÚâÞàëî. ºÐÛö ÛÐáÚÐ, Ð×ÝÐçæÕ öÝèãî."
-#: gui/options.cpp:1394
+#: gui/options.cpp:1395
msgid "Select directory for GUI themes"
msgstr "°ÑïàëæÕ ÔëàíÚâÞàëî ÔÛï âíÜ GUI"
-#: gui/options.cpp:1404
+#: gui/options.cpp:1405
msgid "Select directory for extra files"
msgstr "°ÑïàëæÕ ÔëàíÚâÞàëî × ÔÐÔÐâÚÞÒëÜö äÐÙÛÐÜö"
-#: gui/options.cpp:1415
+#: gui/options.cpp:1416
msgid "Select directory for plugins"
msgstr "°ÑïàëæÕ ÔëàíÚâÞàëî × ßÛÐÓöÝÐÜö"
-#: gui/options.cpp:1468
+#: gui/options.cpp:1469
msgid ""
"The theme you selected does not support your current language. If you want "
"to use this theme you need to switch to another language first."
@@ -943,222 +942,225 @@ msgstr ""
"ÂíÜÐ, ÐÑàÐÝÐï ÒÐÜö, ÝÕ ßÐÔâàëÜÛöÒÐÕ ÑïÓãçãî ÜÞÒã. ºÐÛö Òë ÖÐÔÐÕæÕ "
"ÒëÚÐàëáâÞþÒÐæì Óíâãî âíÜã, ÒÐÜ ÝÕÐÑåÞÔÝÐ áßÐçÐâÚã ßÕàÐÚÛîçëææÐ ÝÐ öÝèãî ÜÞÒã."
-#: gui/saveload-dialog.cpp:166
+#: gui/saveload-dialog.cpp:167
msgid "List view"
msgstr "²ëÓÛïÔ áßöáã"
-#: gui/saveload-dialog.cpp:167
+#: gui/saveload-dialog.cpp:168
msgid "Grid view"
msgstr "²ëÓÛïÔ áÕâÚö"
-#: gui/saveload-dialog.cpp:210 gui/saveload-dialog.cpp:358
+#: gui/saveload-dialog.cpp:211 gui/saveload-dialog.cpp:360
msgid "No date saved"
msgstr "´ÐâÐ ÝÕ ×ÐßöáÐÝÐ"
-#: gui/saveload-dialog.cpp:211 gui/saveload-dialog.cpp:359
+#: gui/saveload-dialog.cpp:212 gui/saveload-dialog.cpp:361
msgid "No time saved"
msgstr "ÇÐá ÝÕ ×ÐßöáÐÝë"
-#: gui/saveload-dialog.cpp:212 gui/saveload-dialog.cpp:360
+#: gui/saveload-dialog.cpp:213 gui/saveload-dialog.cpp:362
msgid "No playtime saved"
msgstr "ÇÐá ÓãÛìÝö ÝÕ ×ÐßöáÐÝë"
-#: gui/saveload-dialog.cpp:219 gui/saveload-dialog.cpp:275
+#: gui/saveload-dialog.cpp:220 gui/saveload-dialog.cpp:276
msgid "Delete"
msgstr "²ëÔÐÛöæì"
-#: gui/saveload-dialog.cpp:274
+#: gui/saveload-dialog.cpp:275
msgid "Do you really want to delete this savegame?"
msgstr "²ë áÐßàÐþÔë ÖÐÔÐÕæÕ ÒëÔÐÛöæì ÓíâÐ ×ÐåÐÒÐÝÝÕ?"
-#: gui/saveload-dialog.cpp:383 gui/saveload-dialog.cpp:872
+#: gui/saveload-dialog.cpp:385 gui/saveload-dialog.cpp:875
msgid "Date: "
msgstr "´ÐâÐ: "
-#: gui/saveload-dialog.cpp:387 gui/saveload-dialog.cpp:878
+#: gui/saveload-dialog.cpp:389 gui/saveload-dialog.cpp:881
msgid "Time: "
msgstr "ÇÐá: "
-#: gui/saveload-dialog.cpp:393 gui/saveload-dialog.cpp:886
+#: gui/saveload-dialog.cpp:395 gui/saveload-dialog.cpp:889
msgid "Playtime: "
msgstr "ÇÐá ÓãÛìÝö: "
-#: gui/saveload-dialog.cpp:406 gui/saveload-dialog.cpp:494
+#: gui/saveload-dialog.cpp:408 gui/saveload-dialog.cpp:496
msgid "Untitled savestate"
msgstr "·ÐåÐÒÐÝÝÕ ÑÕ× öÜï"
-#: gui/saveload-dialog.cpp:546
+#: gui/saveload-dialog.cpp:548
msgid "Next"
msgstr "½ÐáâãßÝë"
-#: gui/saveload-dialog.cpp:549
+#: gui/saveload-dialog.cpp:551
msgid "Prev"
msgstr "¿ÐßïàíÔÝö"
-#: gui/saveload-dialog.cpp:736
+#: gui/saveload-dialog.cpp:739
msgid "New Save"
msgstr "½ÞÒÐÕ ×ÐåÐÒÐÝÝÕ"
-#: gui/saveload-dialog.cpp:736
+#: gui/saveload-dialog.cpp:739
msgid "Create a new save game"
msgstr "ÁâÒÐàëæì ÝÞÒë ×Ðßöá ÓãÛìÝö"
-#: gui/saveload-dialog.cpp:865
+#: gui/saveload-dialog.cpp:868
msgid "Name: "
msgstr "½Ð×ÒÐ: "
-#: gui/saveload-dialog.cpp:937
+#: gui/saveload-dialog.cpp:940
#, c-format
msgid "Enter a description for slot %d:"
msgstr "ÃÒïÔ×öæÕ ÐßöáÐÝÝÕ áÛÞâÐ %d:"
-#: gui/themebrowser.cpp:44
+#: gui/themebrowser.cpp:45
msgid "Select a Theme"
msgstr "°ÑïàëæÕ âíÜã"
-#: gui/ThemeEngine.cpp:337
+#: gui/ThemeEngine.cpp:347
msgid "Disabled GFX"
msgstr "±Õ× ÓàÐäöÚö"
-#: gui/ThemeEngine.cpp:337
+#: gui/ThemeEngine.cpp:347
msgctxt "lowres"
msgid "Disabled GFX"
msgstr "±Õ× ÓàÐäöÚö"
-#: gui/ThemeEngine.cpp:338
-msgid "Standard Renderer (16bpp)"
+#: gui/ThemeEngine.cpp:348
+#, fuzzy
+msgid "Standard Renderer"
msgstr "ÁâÐÝÔÐàâÝë àÐáâÐàë×ÐâÐà (16bpp)"
-#: gui/ThemeEngine.cpp:338
-msgid "Standard (16bpp)"
-msgstr "ÁâÐÝÔÐàâÝë àÐáâÐàë×ÐâÐà (16bpp)"
+#: gui/ThemeEngine.cpp:348 engines/scumm/dialogs.cpp:659
+msgid "Standard"
+msgstr "ÁâÐÝÔÐàâÝë"
-#: gui/ThemeEngine.cpp:340
-msgid "Antialiased Renderer (16bpp)"
+#: gui/ThemeEngine.cpp:350
+#, fuzzy
+msgid "Antialiased Renderer"
msgstr "ÀÐáâÐàë×ÐâÐà áÐ ×ÓÛÐÔÖÒÐÝÝÕÜ (16bpp)"
-#: gui/ThemeEngine.cpp:340
-msgid "Antialiased (16bpp)"
+#: gui/ThemeEngine.cpp:350
+#, fuzzy
+msgid "Antialiased"
msgstr "ÀÐáâÐàë×ÐâÐà áÐ ×ÓÛÐÔÖÒÐÝÝÕÜ (16bpp)"
-#: gui/widget.cpp:322 gui/widget.cpp:324 gui/widget.cpp:330 gui/widget.cpp:332
+#: gui/widget.cpp:323 gui/widget.cpp:325 gui/widget.cpp:331 gui/widget.cpp:333
msgid "Clear value"
msgstr "°çëáæöæì ×ÝÐçíÝÝÕ"
-#: gui/fluidsynth-dialog.cpp:67
+#: gui/fluidsynth-dialog.cpp:68
msgid "Reverb"
msgstr "ÀíÒÕàÑÕàÐæëï"
-#: gui/fluidsynth-dialog.cpp:69 gui/fluidsynth-dialog.cpp:101
+#: gui/fluidsynth-dialog.cpp:70 gui/fluidsynth-dialog.cpp:102
msgid "Active"
msgstr "(°ÚâëþÝÐï)"
-#: gui/fluidsynth-dialog.cpp:71
+#: gui/fluidsynth-dialog.cpp:72
msgid "Room:"
msgstr "¿ÐÚÞÙ:"
-#: gui/fluidsynth-dialog.cpp:78
+#: gui/fluidsynth-dialog.cpp:79
msgid "Damp:"
msgstr "´íÜßäÐÒÐÝÝÕ:"
-#: gui/fluidsynth-dialog.cpp:85
+#: gui/fluidsynth-dialog.cpp:86
msgid "Width:"
msgstr "´ÐþÖëÝï:"
-#: gui/fluidsynth-dialog.cpp:92 gui/fluidsynth-dialog.cpp:110
+#: gui/fluidsynth-dialog.cpp:93 gui/fluidsynth-dialog.cpp:111
msgid "Level:"
msgstr "Ã×àÞÒÕÝì:"
-#: gui/fluidsynth-dialog.cpp:99
+#: gui/fluidsynth-dialog.cpp:100
msgid "Chorus"
msgstr "ÅÞà"
-#: gui/fluidsynth-dialog.cpp:103
+#: gui/fluidsynth-dialog.cpp:104
msgid "N:"
msgstr "N:"
-#: gui/fluidsynth-dialog.cpp:117
+#: gui/fluidsynth-dialog.cpp:118
msgid "Speed:"
msgstr "ÅãâÚÐáæì:"
-#: gui/fluidsynth-dialog.cpp:124
+#: gui/fluidsynth-dialog.cpp:125
msgid "Depth:"
msgstr "³ÛëÑöÝï:"
-#: gui/fluidsynth-dialog.cpp:131
+#: gui/fluidsynth-dialog.cpp:132
msgid "Type:"
msgstr "Âëß:"
-#: gui/fluidsynth-dialog.cpp:134
+#: gui/fluidsynth-dialog.cpp:135
msgid "Sine"
msgstr "ÁöÝãá"
-#: gui/fluidsynth-dialog.cpp:135
+#: gui/fluidsynth-dialog.cpp:136
msgid "Triangle"
msgstr "ÂàÞåÚãâÝöÚ"
-#: gui/fluidsynth-dialog.cpp:139
+#: gui/fluidsynth-dialog.cpp:140
msgid "Interpolation:"
msgstr "¦ÝâíàßÐÛïæëï:"
-#: gui/fluidsynth-dialog.cpp:142
+#: gui/fluidsynth-dialog.cpp:143
msgid "None (fastest)"
msgstr "½ïÜÐ (åãâçíÙèÐÕ)"
-#: gui/fluidsynth-dialog.cpp:143
+#: gui/fluidsynth-dialog.cpp:144
msgid "Linear"
msgstr "»öÝÕÙÝÐï"
-#: gui/fluidsynth-dialog.cpp:144
+#: gui/fluidsynth-dialog.cpp:145
msgid "Fourth-order"
msgstr "ÇÐæÒñàâÐÓÐ ßÐàÐÔÚÐ"
-#: gui/fluidsynth-dialog.cpp:145
+#: gui/fluidsynth-dialog.cpp:146
msgid "Seventh-order"
msgstr "ÁñÜÐÓÐ ßÐàÐÔÚÐ"
-#: gui/fluidsynth-dialog.cpp:149
+#: gui/fluidsynth-dialog.cpp:150
msgid "Reset"
msgstr "ÁÚöÝãæì"
-#: gui/fluidsynth-dialog.cpp:149
+#: gui/fluidsynth-dialog.cpp:150
msgid "Reset all FluidSynth settings to their default values."
msgstr "ÁÚöÝãæì ÝÐÛÐÔë FluidSynth ßÐ ×ÜÐþçÐÝÝö."
-#: gui/fluidsynth-dialog.cpp:216
+#: gui/fluidsynth-dialog.cpp:217
msgid ""
"Do you really want to reset all FluidSynth settings to their default values?"
msgstr "²ë áÐßàÐþÔë ÖÐÔÐÕæÕ áÚöÝãæì ÝÐÛÐÔë FluidSynth ßÐ ×ÜÐþçÐÝÝö?"
-#: base/main.cpp:210
+#: base/main.cpp:228
#, c-format
msgid "Engine does not support debug level '%s'"
msgstr "ÀãåÐÒöçÞÚ ÝÕ ßÐÔâàëÜÛöÒÐÕ þ×àÞÒÕÝì ÐÔÛÐÔÚö '%s'"
-#: base/main.cpp:288
+#: base/main.cpp:306
msgid "Menu"
msgstr "¼ÕÝî"
-#: base/main.cpp:291 backends/platform/symbian/src/SymbianActions.cpp:45
+#: base/main.cpp:309 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:294 backends/platform/symbian/src/SymbianActions.cpp:50
+#: base/main.cpp:312 backends/platform/symbian/src/SymbianActions.cpp:50
#: backends/platform/wince/CEActionsPocket.cpp:42
msgid "Pause"
msgstr "¿Ðþ×Ð"
-#: base/main.cpp:297
+#: base/main.cpp:315
msgid "Skip line"
msgstr "¿àÐßãáæöæì àÐÔÞÚ"
-#: base/main.cpp:468
+#: base/main.cpp:507
msgid "Error running game:"
msgstr "¿ÐÜëÛÚÐ ×ÐßãáÚã ÓãÛìÝö:"
-#: base/main.cpp:492
+#: base/main.cpp:536
msgid "Could not find any engine capable of running the selected game"
msgstr "½Õ ÜÐÓã ×ÝÐÙáæö àãåÐÒöçÞÚ ÔÛï ×ÐßãáÚã ÐÑàÐÝÐÙ ÓãÛìÝö"
@@ -1226,73 +1228,73 @@ msgstr "¿ÕàÐßëÝÕÝÐ ÚÐàëáâÐçÞÜ"
msgid "Unknown error"
msgstr "½ÕÒïÔÞÜÐï ßÐÜëÛÚÐ"
-#: engines/advancedDetector.cpp:316
+#: engines/advancedDetector.cpp:317
#, c-format
msgid "The game in '%s' seems to be unknown."
msgstr "·ÔÐÕææÐ, èâÞ ÓãÛìÝï '%s' ïèçí ÝÕÒïÔÞÜÐ."
-#: engines/advancedDetector.cpp:317
+#: engines/advancedDetector.cpp:318
msgid "Please, report the following data to the ScummVM team along with name"
msgstr ""
"ºÐÛö ÛÐáÚÐ, ßÕàÐÔÐÙæÕ ÝÐáâãßÝëï ÔÐÔ×ÕÝëï ÚÐÜÐÝÔ×Õ ScummVM àÐ×ÐÜ × ÝÐ×ÒÐÙ"
-#: engines/advancedDetector.cpp:319
+#: engines/advancedDetector.cpp:320
msgid "of the game you tried to add and its version/language/etc.:"
msgstr "ÓãÛìÝö, ïÚãî Òë áßàÐÑãÕæÕ ÔÐÔÐæì, ö Ð×ÝÐçæÕ ïÕ ÒÕàáöî, ÜÞÒã ö Ó.Ô."
-#: engines/dialogs.cpp:84
+#: engines/dialogs.cpp:85
msgid "~R~esume"
msgstr "¿àÐæïÓ~Ý~ãæì"
-#: engines/dialogs.cpp:86
+#: engines/dialogs.cpp:87
msgid "~L~oad"
msgstr "·Ð~Ó~àã×öæì"
-#: engines/dialogs.cpp:90
+#: engines/dialogs.cpp:91
msgid "~S~ave"
msgstr "·Ð~ß~öáÐæì"
-#: engines/dialogs.cpp:94
+#: engines/dialogs.cpp:95
msgid "~O~ptions"
msgstr "~¾~ßæëö"
-#: engines/dialogs.cpp:99
+#: engines/dialogs.cpp:100
msgid "~H~elp"
msgstr "~´~ÐßÐÜÞÓÐ"
-#: engines/dialogs.cpp:101
+#: engines/dialogs.cpp:102
msgid "~A~bout"
msgstr "~¿~àÐ ßàÐÓàÐÜã"
-#: engines/dialogs.cpp:104 engines/dialogs.cpp:180
+#: engines/dialogs.cpp:105 engines/dialogs.cpp:181
msgid "~R~eturn to Launcher"
msgstr "~³~ÐÛÞþÝÐÕ ÜÕÝî"
-#: engines/dialogs.cpp:106 engines/dialogs.cpp:182
+#: engines/dialogs.cpp:107 engines/dialogs.cpp:183
msgctxt "lowres"
msgid "~R~eturn to Launcher"
msgstr "~³~ÐÛÞþÝÐÕ ÜÕÝî"
-#: engines/dialogs.cpp:115 engines/agi/saveload.cpp:803
-#: engines/drascula/saveload.cpp:338 engines/cruise/menu.cpp:212
-#: engines/sci/engine/kfile.cpp:742 engines/toltecs/menu.cpp:284
-#: engines/pegasus/pegasus.cpp:373
+#: engines/dialogs.cpp:116 engines/agi/saveload.cpp:803
+#: engines/cruise/menu.cpp:212 engines/drascula/saveload.cpp:336
+#: engines/neverhood/menumodule.cpp:873 engines/pegasus/pegasus.cpp:377
+#: engines/sci/engine/kfile.cpp:758 engines/toltecs/menu.cpp:281
msgid "Save game:"
msgstr "·ÐåÐÒÐæì ÓãÛìÝî:"
-#: engines/dialogs.cpp:115 engines/agi/saveload.cpp:803
-#: engines/drascula/saveload.cpp:338 engines/scumm/dialogs.cpp:187
-#: engines/cruise/menu.cpp:212 engines/sci/engine/kfile.cpp:742
-#: engines/toltecs/menu.cpp:284 engines/pegasus/pegasus.cpp:373
-#: backends/platform/symbian/src/SymbianActions.cpp:44
+#: engines/dialogs.cpp:116 backends/platform/symbian/src/SymbianActions.cpp:44
#: backends/platform/wince/CEActionsPocket.cpp:43
#: backends/platform/wince/CEActionsPocket.cpp:267
#: backends/platform/wince/CEActionsSmartphone.cpp:45
#: backends/platform/wince/CEActionsSmartphone.cpp:231
+#: engines/agi/saveload.cpp:803 engines/cruise/menu.cpp:212
+#: engines/drascula/saveload.cpp:336 engines/neverhood/menumodule.cpp:873
+#: engines/pegasus/pegasus.cpp:377 engines/sci/engine/kfile.cpp:758
+#: engines/scumm/dialogs.cpp:188 engines/toltecs/menu.cpp:281
msgid "Save"
msgstr "·ÐåÐÒÐæì"
-#: engines/dialogs.cpp:144
+#: engines/dialogs.cpp:145
msgid ""
"Sorry, this engine does not currently provide in-game help. Please consult "
"the README for basic information, and for instructions on how to obtain "
@@ -1302,7 +1304,7 @@ msgstr ""
"×ÒïàÝöæÕáï ÔÐ äÐÙÛÐ README ×Ð ÑÐ×ÐÒÐÙ öÝäÐàÜÐæëïÙ, Ð âÐÚáÐÜÐ öÝáâàãÚæëïÜö "
"ßàÐ âÞÕ, ïÚ ÐâàëÜÐæì ÔÐÛÕÙèãî ÔÐßÐÜÞÓã."
-#: engines/dialogs.cpp:228
+#: engines/dialogs.cpp:234 engines/pegasus/pegasus.cpp:393
#, c-format
msgid ""
"Gamestate save failed (%s)! Please consult the README for basic information, "
@@ -1312,37 +1314,37 @@ msgstr ""
"×Ð ÑÐ×ÐÒÐÙ öÝäÐàÜÐæëïÙ, Ð âÐÚáÐÜÐ öÝáâàãÚæëïÜö ßàÐ âÞÕ, ïÚ ÐâàëÜÐæì ÔÐÛÕÙèãî "
"ÔÐßÐÜÞÓã."
-#: engines/dialogs.cpp:301 engines/mohawk/dialogs.cpp:109
+#: engines/dialogs.cpp:307 engines/mohawk/dialogs.cpp:109
#: engines/mohawk/dialogs.cpp:170
msgid "~O~K"
msgstr "~¾~º"
-#: engines/dialogs.cpp:302 engines/mohawk/dialogs.cpp:110
+#: engines/dialogs.cpp:308 engines/mohawk/dialogs.cpp:110
#: engines/mohawk/dialogs.cpp:171
msgid "~C~ancel"
msgstr "~°~ÔÜÕÝÐ"
-#: engines/dialogs.cpp:305
+#: engines/dialogs.cpp:311
msgid "~K~eys"
msgstr "~º~ÛÐÒöèë"
-#: engines/engine.cpp:240
+#: engines/engine.cpp:245
msgid "Could not initialize color format."
msgstr "½Õ ÜÐÓã öÝöæëïÛö×ÐÒÐæì äÐàÜÐâ ÚÞÛÕàã."
-#: engines/engine.cpp:248
+#: engines/engine.cpp:253
msgid "Could not switch to video mode: '"
msgstr "½Õ ÐâàëÜÐÛÐáï ßÕàÐÚÛîçëæì ÒöÔíÐàíÖëÜ: '"
-#: engines/engine.cpp:257
+#: engines/engine.cpp:262
msgid "Could not apply aspect ratio setting."
msgstr "½Õ ÐâàëÜÐÛÐáï ÒëÚÐàëáâÐæì ÚÐàíÚæëî áãÐÔÝÞáöÝ ÑÐÚÞþ."
-#: engines/engine.cpp:262
+#: engines/engine.cpp:267
msgid "Could not apply fullscreen setting."
msgstr "½Õ ÜÐÓã þÖëæì ßÞþÝÐíÚàÐÝÝë àíÖëÜ."
-#: engines/engine.cpp:362
+#: engines/engine.cpp:367
msgid ""
"You appear to be playing this game directly\n"
"from the CD. This is known to cause problems,\n"
@@ -1356,7 +1358,7 @@ msgstr ""
"ÝÐ ÖÞàáâÚö ÔëáÚ. ¿ÐÔàÐÑï×ÝÐáæö ÜÞÖÝÐ ×ÝÐÙáæö þ\n"
"äÐÙÛÕ README."
-#: engines/engine.cpp:373
+#: engines/engine.cpp:378
msgid ""
"This game has audio tracks in its disk. These\n"
"tracks need to be ripped from the disk using\n"
@@ -1371,7 +1373,7 @@ msgstr ""
"×'ïÒöææÐ Üã×ëÚÐ. ¿ÐÔàÐÑï×ÝÐáæö ÜÞÖÝÐ ×ÝÐÙáæö þ\n"
"äÐÙÛÕ README."
-#: engines/engine.cpp:431
+#: engines/engine.cpp:436
#, c-format
msgid ""
"Gamestate load failed (%s)! Please consult the README for basic information, "
@@ -1381,7 +1383,7 @@ msgstr ""
"README ×Ð ÑÐ×ÐÒÐÙ öÝäÐàÜÐæëïÙ, Ð âÐÚáÐÜÐ öÝáâàãÚæëïÜö ßàÐ âÞÕ, ïÚ ÐâàëÜÐæì "
"ÔÐÛÕÙèãî ÔÐßÐÜÞÓã."
-#: engines/engine.cpp:444
+#: engines/engine.cpp:449
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 "
@@ -1391,35 +1393,762 @@ msgstr ""
"ScummVM æÐÛÚÐÜ. ÏÝÐ, åãâçíÙ ×Ð þáñ, ÝÕ ÑãÔ×Õ ßàÐæÐÒÐæì áâÐÑöÛìÝÐ, ö "
"×ÐåÐÒÐÝÝö ÓãÛìÝïþ ÜÞÓãæì ÝÕ ßàÐæÐÒÐæì ã ÑãÔãçëå ÒÕàáöïå ScummVM."
-#: engines/engine.cpp:447
+#: engines/engine.cpp:452
msgid "Start anyway"
msgstr "Ãáñ ÐÔÝÞ ×Ðßãáæöæì"
-#: engines/agi/detection.cpp:142 engines/drascula/detection.cpp:270
-#: engines/dreamweb/detection.cpp:47 engines/sci/detection.cpp:393
-#: engines/toltecs/detection.cpp:173
+#: audio/fmopl.cpp:50
+msgid "MAME OPL emulator"
+msgstr "ÍÜãÛïâÐà MAME OPL"
+
+#: audio/fmopl.cpp:52
+msgid "DOSBox OPL emulator"
+msgstr "ÍÜãÛïâÐà DOSBox OPL"
+
+#: audio/mididrv.cpp:209
+#, c-format
+msgid ""
+"The selected audio device '%s' was not found (e.g. might be turned off or "
+"disconnected)."
+msgstr ""
+"°ÑàÐÝÐï ÓãÚÐÒÐï ßàëÛÐÔÐ '%s' ÝÕ ÑëÛÐ ×ÝÞÙÔ×ÕÝÐ (ÜÐÓçëÜÐ, ïÝÐ ÒëÚÛîçÐÝÐ æö ÝÕ "
+"ßÐÔÚÛîçÐÝÐ)."
+
+#: audio/mididrv.cpp:209 audio/mididrv.cpp:221 audio/mididrv.cpp:257
+#: audio/mididrv.cpp:272
+msgid "Attempting to fall back to the next available device..."
+msgstr "ÁßàÐÑãî ÒëÚÐàëáâÐæì öÝèãî ÔÐáâãßÝãî ßàëÛÐÔã..."
+
+#: audio/mididrv.cpp:221
+#, c-format
+msgid ""
+"The selected audio device '%s' cannot be used. See log file for more "
+"information."
+msgstr ""
+"°ÑàÐÝÐï ÓãÚÐÒÐï ßàëÛÐÔÐ '%s' ÝÕ ÜÞÖÐ Ñëæì áÚÐàëáâÐÝÐ. ³ÛïÔ×öæÕ äÐÙÛ "
+"ßàÐâÐÚÞÛã ÔÛï ÑÞÛìè ßÐÔàÐÑï×ÝÐÙ öÝäÐàÜÐæëö."
+
+#: audio/mididrv.cpp:257
+#, c-format
+msgid ""
+"The preferred audio device '%s' was not found (e.g. might be turned off or "
+"disconnected)."
+msgstr ""
+"¿ÕàÐÒÐÖÝÐï ÓãÚÐÒÐï ßàëÛÐÔÐ '%s' ÝÕ ÑëÛÐ ×ÝÞÙÔ×ÕÝÐ (ÜÐÓçëÜÐ, ïÝÐ ÒëÚÛîçÐÝÐ æö "
+"ÝÕ ßÐÔÚÛîçÐÝÐ)."
+
+#: audio/mididrv.cpp:272
+#, c-format
+msgid ""
+"The preferred audio device '%s' cannot be used. See log file for more "
+"information."
+msgstr ""
+"¿ÕàÐÒÐÖÝÐï ÓãÚÐÒÐï ßàëÛÐÔÐ '%s' ÝÕ ÜÞÖÐ Ñëæì áÚÐàëáâÐÝÐ. ³ÛïÔ×öæÕ äÐÙÛ "
+"ßàÐâÐÚÞÛã ÔÛï ÑÞÛìè ßÐÔàÐÑï×ÝÐÙ öÝäÐàÜÐæëö."
+
+#: audio/null.h:44
+msgid "No music"
+msgstr "±Õ× Üã×ëÚö"
+
+#: audio/mods/paula.cpp:196
+msgid "Amiga Audio Emulator"
+msgstr "ÍÜãÛïâÐà ÓãÚã Amiga"
+
+#: audio/softsynth/adlib.cpp:2285
+msgid "AdLib Emulator"
+msgstr "ÍÜãÛïâÐà AdLib"
+
+#: audio/softsynth/appleiigs.cpp:33
+msgid "Apple II GS Emulator (NOT IMPLEMENTED)"
+msgstr "ÍÜãÛïâÐà Apple II GS (ÐÔáãâÝöçÐÕ)"
+
+#: audio/softsynth/sid.cpp:1430
+msgid "C64 Audio Emulator"
+msgstr "ÍÜãÛïâÐà ÓãÚã C64"
+
+#: audio/softsynth/mt32.cpp:200
+msgid "Initializing MT-32 Emulator"
+msgstr "½ÐÛÐÔÖÒÐî íÜãÛïâÐà MT-32"
+
+#: audio/softsynth/mt32.cpp:426
+msgid "MT-32 Emulator"
+msgstr "ÍÜãÛïâÐà MT-32"
+
+#: audio/softsynth/pcspk.cpp:139
+msgid "PC Speaker Emulator"
+msgstr "ÍÜãÛïâÐà PC áßöÚÕàÐ"
+
+#: audio/softsynth/pcspk.cpp:158
+msgid "IBM PCjr Emulator"
+msgstr "ÍÜãÛïâÐà IBM PCjr"
+
+#: backends/keymapper/remap-dialog.cpp:48
+msgid "Keymap:"
+msgstr "ÂÐÑÛöæÐ ÚÛÐÒöè:"
+
+#: backends/keymapper/remap-dialog.cpp:67
+msgid " (Effective)"
+msgstr " (´×ÕÙáÝÐï)"
+
+#: backends/keymapper/remap-dialog.cpp:107
+msgid " (Active)"
+msgstr " (°ÚâëþÝÐï)"
+
+#: backends/keymapper/remap-dialog.cpp:107
+msgid " (Blocked)"
+msgstr " (·ÐÑÛÐÚÐÒÐÝÐ)"
+
+#: backends/keymapper/remap-dialog.cpp:120
+msgid " (Global)"
+msgstr " (³ÛÐÑÐÛìÝÐï)"
+
+#: backends/keymapper/remap-dialog.cpp:128
+msgid " (Game)"
+msgstr " (³ãÛìÝö)"
+
+#: backends/midi/windows.cpp:165
+msgid "Windows MIDI"
+msgstr "Windows MIDI"
+
+#: backends/platform/ds/arm9/source/dsoptions.cpp:56
+#: engines/scumm/dialogs.cpp:291
+msgid "~C~lose"
+msgstr "~·~ÐÚàëæì"
+
+#: backends/platform/ds/arm9/source/dsoptions.cpp:57
+msgid "ScummVM Main Menu"
+msgstr "³ÐÛÞþÝÐÕ ÜÕÝî ScummVM"
+
+#: backends/platform/ds/arm9/source/dsoptions.cpp:63
+msgid "~L~eft handed mode"
+msgstr "»ÕÒÐàãÚö àíÖëÜ"
+
+#: backends/platform/ds/arm9/source/dsoptions.cpp:64
+msgid "~I~ndy fight controls"
+msgstr "ºöàÐÒÐÝÝÕ ÑÐïÜö þ Indy"
+
+#: backends/platform/ds/arm9/source/dsoptions.cpp:65
+msgid "Show mouse cursor"
+msgstr "¿ÐÚÐ×ÒÐæì ÚãàáÞà Üëèë"
+
+#: backends/platform/ds/arm9/source/dsoptions.cpp:66
+msgid "Snap to edges"
+msgstr "¿àëÜÐæÐÒÐæì ÔÐ ÜÕÖ"
+
+#: backends/platform/ds/arm9/source/dsoptions.cpp:68
+msgid "Touch X Offset"
+msgstr "·àãèíÝÝÕ ÔÞâëÚÐþ ßÐ ÒÞáö X"
+
+#: backends/platform/ds/arm9/source/dsoptions.cpp:75
+msgid "Touch Y Offset"
+msgstr "·àãèíÝÝÕ ÔÞâëÚÐþ ßÐ ÒÞáö Y"
+
+#: backends/platform/ds/arm9/source/dsoptions.cpp:87
+msgid "Use laptop trackpad-style cursor control"
+msgstr "²ëÚÐàëáâÞþÒÐæì ÚöàÐÒÐÝÝÕ ÚãàáÞàÐÜ ïÚ ÝÐ âàíÚßÐÔ×Õ ÛíßâÞßÐþ"
+
+#: backends/platform/ds/arm9/source/dsoptions.cpp:88
+msgid "Tap for left click, double tap right click"
+msgstr "ÂÐß ÔÛï ÛÕÒÐÙ ßáâàëçÚö, ßÐÔÒÞÙÝë âÐß ÔÛï ßàÐÒÐÙ ßáâàëçÚö"
+
+#: backends/platform/ds/arm9/source/dsoptions.cpp:90
+msgid "Sensitivity"
+msgstr "°ÔçãÒÐÛìÝÐáæì"
+
+#: backends/platform/ds/arm9/source/dsoptions.cpp:99
+msgid "Initial top screen scale:"
+msgstr "¿ÐçÐâÚÞÒë ÜÐèâÐÑ ÒÕàåÝïÓÐ íÚàÐÝÐ:"
+
+#: backends/platform/ds/arm9/source/dsoptions.cpp:105
+msgid "Main screen scaling:"
+msgstr "¼ÐèâÐÑ ÓÐÛÞþÝÐÓÐ íÚàÐÝÐ:"
+
+#: backends/platform/ds/arm9/source/dsoptions.cpp:107
+msgid "Hardware scale (fast, but low quality)"
+msgstr "ÅÐàÔÒÐàÝÐÕ ÜÐèâÐÑÐÒÐÝÝÕ (åãâÚÐ, ÐÛÕ Ýö×ÚÐÙ ïÚÐáæö)"
+
+#: backends/platform/ds/arm9/source/dsoptions.cpp:108
+msgid "Software scale (good quality, but slower)"
+msgstr "¿àÐÓàÐÜÝÐÕ ÜÐèâÐÑÐÒÐÝÝÕ (ÔÞÑàÐï ïÚÐáæì, ÐÛÕ ÜÐàãÔÝÕÙ)"
+
+#: backends/platform/ds/arm9/source/dsoptions.cpp:109
+msgid "Unscaled (you must scroll left and right)"
+msgstr "±Õ× ÜÐèâÐÑÐÒÐÝÝï (âàíÑÐ ÑãÔ×Õ ßàÐÚàãçÒÐæì ÝÐÛÕÒÐ ö ÝÐßàÐÒÐ)"
+
+#: backends/platform/ds/arm9/source/dsoptions.cpp:111
+msgid "Brightness:"
+msgstr "ÏàÚÐáæì:"
+
+#: backends/platform/ds/arm9/source/dsoptions.cpp:121
+msgid "High quality audio (slower) (reboot)"
+msgstr "²ëáÞÚÐï ïÚÐáæì ÓãÚã (ÜÐàãÔÝÕÙ) (àíÑãâ)"
+
+#: backends/platform/ds/arm9/source/dsoptions.cpp:122
+msgid "Disable power off"
+msgstr "·ÐÑÐàÐÝöæì ÒëÚÛîçíÝÝÕ"
+
+#: backends/platform/iphone/osys_events.cpp:300
+msgid "Mouse-click-and-drag mode enabled."
+msgstr "ÀíÖëÜ Üëèë ÝÐæöáÝãæì-ö-æïÓÝãæì ãÚÛîçÐÝë."
+
+#: backends/platform/iphone/osys_events.cpp:302
+msgid "Mouse-click-and-drag mode disabled."
+msgstr "ÀíÖëÜ Üëèë ÝÐæöáÝãæì-ö-æïÓÝãæì ÒëÚÛîçÐÝë."
+
+#: backends/platform/iphone/osys_events.cpp:313
+msgid "Touchpad mode enabled."
+msgstr "ÀíÖëÜ âÐçßÐÔÐ þÚÛîçÐÝë."
+
+#: backends/platform/iphone/osys_events.cpp:315
+msgid "Touchpad mode disabled."
+msgstr "ÀíÖëÜ âÐçßÐÔÐ ÒëÚÛîçÐÝë."
+
+#: backends/platform/maemo/maemo.cpp:209
+msgid "Click Mode"
+msgstr "ÀíÖëÜ ßáâàëçÚö"
+
+#: backends/platform/maemo/maemo.cpp:215
+#: backends/platform/symbian/src/SymbianActions.cpp:42
+#: backends/platform/wince/CEActionsPocket.cpp:60
+#: backends/platform/wince/CEActionsSmartphone.cpp:43
+#: backends/platform/tizen/form.cpp:275
+msgid "Left Click"
+msgstr "»ÕÒÐï ßáâàëçÚÐ"
+
+#: backends/platform/maemo/maemo.cpp:218
+msgid "Middle Click"
+msgstr "ÁïàíÔÝïï ßáâàëçÚÐ"
+
+#: backends/platform/maemo/maemo.cpp:221
+#: backends/platform/symbian/src/SymbianActions.cpp:43
+#: backends/platform/wince/CEActionsSmartphone.cpp:44
+#: backends/platform/tizen/form.cpp:267
+msgid "Right Click"
+msgstr "¿àÐÒÐï ßáâàëçÚÐ"
+
+#: backends/platform/sdl/macosx/appmenu_osx.mm:77
+msgid "Hide ScummVM"
+msgstr "ÁåÐÒÐæì ScummVM"
+
+#: backends/platform/sdl/macosx/appmenu_osx.mm:82
+msgid "Hide Others"
+msgstr "ÁåÐÒÐæì ÐáâÐâÝöï"
+
+#: backends/platform/sdl/macosx/appmenu_osx.mm:87
+msgid "Show All"
+msgstr "¿ÐÚÐ×Ðæì ãáñ"
+
+#: backends/platform/sdl/macosx/appmenu_osx.mm:109
+#: backends/platform/sdl/macosx/appmenu_osx.mm:120
+msgid "Window"
+msgstr "°ÚÝÞ"
+
+#: backends/platform/sdl/macosx/appmenu_osx.mm:114
+msgid "Minimize"
+msgstr "¿àëÑàÐæì ã Dock"
+
+#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:46
+msgid "Normal (no scaling)"
+msgstr "±Õ× ßÐÒÕÛöçíÝÝï"
+
+#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:65
+msgctxt "lowres"
+msgid "Normal (no scaling)"
+msgstr "±Õ× ßÐÒÕÛöçíÝÝï"
+
+#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2148
+msgid "Enabled aspect ratio correction"
+msgstr "ºÐàíÚæëï áãÐÔÝÞáöÝ ÑÐÚÞþ ãÚÛîçÐÝÐ"
+
+#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2154
+msgid "Disabled aspect ratio correction"
+msgstr "ºÐàíÚæëï áãÐÔÝÞáöÝ ÑÐÚÞþ ÒëÚÛîçÐÝÐ"
+
+#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2209
+msgid "Active graphics filter:"
+msgstr "°ÚâëþÝë ÓàÐäöçÝë äöÛìâà:"
+
+#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2251
+msgid "Windowed mode"
+msgstr "°ÚÞÝÝë àíÖëÜ"
+
+#: backends/graphics/opengl/opengl-graphics.cpp:118
+#, fuzzy
+msgid "OpenGL"
+msgstr "°ÔÚàëæì"
+
+#: backends/graphics/opengl/opengl-graphics.cpp:119
+msgid "OpenGL (No filtering)"
+msgstr ""
+
+#: backends/platform/symbian/src/SymbianActions.cpp:38
+#: backends/platform/wince/CEActionsSmartphone.cpp:39
+msgid "Up"
+msgstr "ÃÒÕàå"
+
+#: backends/platform/symbian/src/SymbianActions.cpp:39
+#: backends/platform/wince/CEActionsSmartphone.cpp:40
+msgid "Down"
+msgstr "ÃÝö×"
+
+#: backends/platform/symbian/src/SymbianActions.cpp:40
+#: backends/platform/wince/CEActionsSmartphone.cpp:41
+msgid "Left"
+msgstr "½ÐÛÕÒÐ"
+
+#: backends/platform/symbian/src/SymbianActions.cpp:41
+#: backends/platform/wince/CEActionsSmartphone.cpp:42
+msgid "Right"
+msgstr "½ÐßàÐÒÐ"
+
+#: backends/platform/symbian/src/SymbianActions.cpp:46
+#: backends/platform/wince/CEActionsSmartphone.cpp:47
+msgid "Zone"
+msgstr "·ÞÝÐ"
+
+#: backends/platform/symbian/src/SymbianActions.cpp:47
+#: backends/platform/wince/CEActionsPocket.cpp:54
+#: backends/platform/wince/CEActionsSmartphone.cpp:48
+msgid "Multi Function"
+msgstr "¼ãÛìâëäãÝÚæëï"
+
+#: backends/platform/symbian/src/SymbianActions.cpp:48
+msgid "Swap character"
+msgstr "·ÜïÝöæì ÓÕàÞï"
+
+#: backends/platform/symbian/src/SymbianActions.cpp:49
+msgid "Skip text"
+msgstr "¿àÐßãáæöæì âíÚáâ"
+
+#: backends/platform/symbian/src/SymbianActions.cpp:51
+msgid "Fast mode"
+msgstr "ÅãâÚö àíÖëÜ"
+
+#: 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:218
+#: engines/scumm/dialogs.cpp:192 engines/scumm/help.cpp:82
+#: engines/scumm/help.cpp:84
+msgid "Quit"
+msgstr "²ëåÐÔ"
+
+#: backends/platform/symbian/src/SymbianActions.cpp:53
+msgid "Debugger"
+msgstr "°ÔÛÐÔçëÚ"
+
+#: backends/platform/symbian/src/SymbianActions.cpp:54
+msgid "Global menu"
+msgstr "³ÛÐÑÐÛìÝÐÕ ÜÕÝî"
+
+#: backends/platform/symbian/src/SymbianActions.cpp:55
+msgid "Virtual keyboard"
+msgstr "²öàâãÐÛìÝÐï ÚÛÐÒöïâãàÐ"
+
+#: backends/platform/symbian/src/SymbianActions.cpp:56
+msgid "Key mapper"
+msgstr "¿àë×ÝÐçíÝÝÕ ÚÛÐÒöè"
+
+#: backends/events/symbiansdl/symbiansdl-events.cpp:184
+msgid "Do you want to quit ?"
+msgstr "²ë áÐßàÐþÔë ÖÐÔÐÕæÕ ÒëÙáæö?"
+
+#: backends/platform/wii/options.cpp:51
+msgid "Video"
+msgstr "²öÔíÐ"
+
+#: backends/platform/wii/options.cpp:54
+msgid "Current video mode:"
+msgstr "±ïÓãçë ÒöÔíÐàíÖëÜ:"
+
+#: backends/platform/wii/options.cpp:56
+msgid "Double-strike"
+msgstr "´ÒÐÙÝë þÔÐà"
+
+#: backends/platform/wii/options.cpp:60
+msgid "Horizontal underscan:"
+msgstr "³Ðàë×ÐÝâÐÛìÝë underscan:"
+
+#: backends/platform/wii/options.cpp:66
+msgid "Vertical underscan:"
+msgstr "²ÕàâëÚÐÛìÝë underscan:"
+
+#: backends/platform/wii/options.cpp:71
+msgid "Input"
+msgstr "ÃÒÞÔ"
+
+#: backends/platform/wii/options.cpp:74
+msgid "GC Pad sensitivity:"
+msgstr "°ÔçãÒÐÛìÝÐáæì GC ßÐÔÐ:"
+
+#: backends/platform/wii/options.cpp:80
+msgid "GC Pad acceleration:"
+msgstr "¿ÐáÚÐàíÝÝÕ GC ßÐÔÐ:"
+
+#: backends/platform/wii/options.cpp:86
+msgid "DVD"
+msgstr "DVD"
+
+#: backends/platform/wii/options.cpp:89 backends/platform/wii/options.cpp:101
+msgid "Status:"
+msgstr "ÁâÐÝ:"
+
+#: backends/platform/wii/options.cpp:90 backends/platform/wii/options.cpp:102
+msgid "Unknown"
+msgstr "½ÕÒïÔÞÜÐ"
+
+#: backends/platform/wii/options.cpp:93
+msgid "Mount DVD"
+msgstr "¿ÐÔÚÛîçëæì DVD"
+
+#: backends/platform/wii/options.cpp:94
+msgid "Unmount DVD"
+msgstr "°ÔÚÛîçëæì DVD"
+
+#: backends/platform/wii/options.cpp:98
+msgid "SMB"
+msgstr "SMB"
+
+#: backends/platform/wii/options.cpp:106
+msgid "Server:"
+msgstr "ÁÕàÒÕà:"
+
+#: backends/platform/wii/options.cpp:110
+msgid "Share:"
+msgstr "ÁÕâÚÐÒÐï âíçÚÐ:"
+
+#: backends/platform/wii/options.cpp:114
+msgid "Username:"
+msgstr "ºÐàëáâÐç:"
+
+#: backends/platform/wii/options.cpp:118
+msgid "Password:"
+msgstr "¿ÐàÞÛì:"
+
+#: backends/platform/wii/options.cpp:121
+msgid "Init network"
+msgstr "¦ÝöæëïÛö×Ðæëï áÕâÚö"
+
+#: backends/platform/wii/options.cpp:123
+msgid "Mount SMB"
+msgstr "¿ÐÔÚÛîçëæì SMB"
+
+#: backends/platform/wii/options.cpp:124
+msgid "Unmount SMB"
+msgstr "°ÔÚÛîçëæì SMB"
+
+#: backends/platform/wii/options.cpp:143
+msgid "DVD Mounted successfully"
+msgstr "DVD ßÐÔÚÛîçÐÝë ßÐáßïåÞÒÐ"
+
+#: backends/platform/wii/options.cpp:146
+msgid "Error while mounting the DVD"
+msgstr "¿ÐÜëÛÚÐ ßàë ßÐÔÚÛîçíÝÝö DVD"
+
+#: backends/platform/wii/options.cpp:148
+msgid "DVD not mounted"
+msgstr "DVD ÝÕ ßÐÔÚÛîçÐÝë"
+
+#: backends/platform/wii/options.cpp:161
+msgid "Network up, share mounted"
+msgstr "ÁÕâÚÐ ßàÐæãÕ, âíçÚÐ ßÐÔÚÛîçÐÝÐ"
+
+#: backends/platform/wii/options.cpp:163
+msgid "Network up"
+msgstr "ÁÕâÚÐ ßàÐæãÕ"
+
+#: backends/platform/wii/options.cpp:166
+msgid ", error while mounting the share"
+msgstr ", ßÐÜëÛÚÐ ßàë ßÐÔÚÛîçíÝÝö âíçÚö"
+
+#: backends/platform/wii/options.cpp:168
+msgid ", share not mounted"
+msgstr ", âíçÚÐ ÝÕ ßÐÔÚÛîçÐÝÐ"
+
+#: backends/platform/wii/options.cpp:174
+msgid "Network down"
+msgstr "ÁÕâÚÐ ÒëÚÛîçÐÝÐ"
+
+#: backends/platform/wii/options.cpp:178
+msgid "Initializing network"
+msgstr "½ÐÛÐÔÖÒÐî áÕâÚã"
+
+#: backends/platform/wii/options.cpp:182
+msgid "Timeout while initializing network"
+msgstr "ÇÐá ßÐÔÚÛîçíÝÝï ÔÐ áÕâÚö ÜöÝãþ"
+
+#: backends/platform/wii/options.cpp:186
+#, c-format
+msgid "Network not initialized (%d)"
+msgstr "ÁÕâÚÐ ÝÕ ÝÐÛÐÔ×öÛÐáï (%d)"
+
+#: backends/platform/wince/CEActionsPocket.cpp:46
+msgid "Hide Toolbar"
+msgstr "ÁåÐÒÐæì ßÐÝíÛì öÝáâàãÜÕÝâÐþ"
+
+#: backends/platform/wince/CEActionsPocket.cpp:47
+msgid "Show Keyboard"
+msgstr "¿ÐÚÐ×Ðæì ÚÛÐÒöïâãàã"
+
+#: backends/platform/wince/CEActionsPocket.cpp:48
+msgid "Sound on/off"
+msgstr "³ãÚ ãÚÛ/ÒëÚÛ"
+
+#: backends/platform/wince/CEActionsPocket.cpp:49
+msgid "Right click"
+msgstr "¿àÐÒÐï ßáâàëçÚÐ"
+
+#: backends/platform/wince/CEActionsPocket.cpp:50
+msgid "Show/Hide Cursor"
+msgstr "¿ÐÚÐ×Ðæì/¿àëÑàÐæì ÚãàáÞà"
+
+#: backends/platform/wince/CEActionsPocket.cpp:51
+msgid "Free look"
+msgstr "²ÞÛìÝë ÐÓÛïÔ"
+
+#: backends/platform/wince/CEActionsPocket.cpp:52
+msgid "Zoom up"
+msgstr "¿ÐÒïÛ. ÜÐèâÐÑ"
+
+#: backends/platform/wince/CEActionsPocket.cpp:53
+msgid "Zoom down"
+msgstr "¿ÐÜÕÝè. ÜÐèâÐÑ"
+
+#: backends/platform/wince/CEActionsPocket.cpp:55
+#: backends/platform/wince/CEActionsSmartphone.cpp:49
+msgid "Bind Keys"
+msgstr "¿àë×ÝÐçëæì ÚÛÐÒöèë"
+
+#: backends/platform/wince/CEActionsPocket.cpp:56
+msgid "Cursor Up"
+msgstr "ºãàáÞà ãÒÕàå"
+
+#: backends/platform/wince/CEActionsPocket.cpp:57
+msgid "Cursor Down"
+msgstr "ºãàáÞà ãÝö×"
+
+#: backends/platform/wince/CEActionsPocket.cpp:58
+msgid "Cursor Left"
+msgstr "ºãàáÞà ÝÐÛÕÒÐ"
+
+#: backends/platform/wince/CEActionsPocket.cpp:59
+msgid "Cursor Right"
+msgstr "ºãàáÞà ÝÐßàÐÒÐ"
+
+#: 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:326
+#: backends/platform/wince/CEActionsSmartphone.cpp:287
+msgid " Are you sure you want to quit ? "
+msgstr " ²ë þßíþÝÕÝë, èâÞ ÖÐÔÐÕæÕ ÒëÙáæö? "
+
+#: backends/platform/wince/CEActionsSmartphone.cpp:50
+msgid "Keyboard"
+msgstr "ºÛÐÒöïâãàÐ"
+
+#: backends/platform/wince/CEActionsSmartphone.cpp:51
+msgid "Rotate"
+msgstr "¿ÐÒïàÝãæì"
+
+#: backends/platform/wince/CELauncherDialog.cpp:56
+msgid "Using SDL driver "
+msgstr "²ëÚÐàëáâÞþÒÐî ÔàÐÙÒÕà SDL "
+
+#: backends/platform/wince/CELauncherDialog.cpp:60
+msgid "Display "
+msgstr "¿ÐÚÐ×Ðæì "
+
+#: backends/platform/wince/CELauncherDialog.cpp:83
+msgid "Do you want to perform an automatic scan ?"
+msgstr "²ë ÖÐÔÐÕæÕ ×àÐÑöæì ÐþâÐÜÐâëçÝë ßÞèãÚ?"
+
+#: backends/platform/wince/wince-sdl.cpp:516
+msgid "Map right click action"
+msgstr "¿àë×ÝÐçëæì Ô×ÕïÝÝÕ ßÐ ßàÐÒÐÙ ßáâàëçæë"
+
+#: backends/platform/wince/wince-sdl.cpp:520
+msgid "You must map a key to the 'Right Click' action to play this game"
+msgstr ""
+"²ë ßÐÒöÝÝë ßàë×ÝÐçëæì ÚÛÐÒöèã ÝÐ Ô×ÕïÝÝÕ 'Right Click' ÔÛï ÓíâÐÙ ÓãÛìÝö"
+
+#: backends/platform/wince/wince-sdl.cpp:529
+msgid "Map hide toolbar action"
+msgstr "¿àë×ÝÐçëæì Ô×ÕïÝÝÕ 'áåÐÒÐæì ßÐÝíÛì öÝáâàãÜÕÝâÐþ'"
+
+#: backends/platform/wince/wince-sdl.cpp:533
+msgid "You must map a key to the 'Hide toolbar' action to play this game"
+msgstr ""
+"²ë ßÐÒöÝÝë ßàë×ÝÐçëæì ÚÛÐÒöèã ÝÐ Ô×ÕïÝÝÕ 'Hide toolbar' ÔÛï ÓíâÐÙ ÓãÛìÝö"
+
+#: backends/platform/wince/wince-sdl.cpp:542
+msgid "Map Zoom Up action (optional)"
+msgstr "¿àë×ÝÐçëæì Ô×ÕïÝÝÕ ¿ÐÒïÛöçëæì ¼ÐèâÐÑ (ÝÕÐÑÐÒï×ÚÞÒÐ)"
+
+#: backends/platform/wince/wince-sdl.cpp:545
+msgid "Map Zoom Down action (optional)"
+msgstr "¿àë×ÝÐçëæì Ô×ÕïÝÝÕ ¿ÐÜÕÝèëæì ¼ÐèâÐÑ (ÝÕÐÑÐÒï×ÚÞÒÐ)"
+
+#: backends/platform/wince/wince-sdl.cpp:553
+msgid ""
+"Don't forget to map a key to 'Hide Toolbar' action to see the whole inventory"
+msgstr ""
+"½Õ ×ÐÑãÔ×ìæÕáï ßàë×ÝÐçëæì ÚÛÐÒöèã ÔÛï Ô×ÕïÝÝï 'Hide Toolbar', ÚÐÑ ãÑÐçëæì "
+"ãÒÕáì öÝÒÕÝâÐà ã ÓãÛìÝö"
+
+#: backends/events/default/default-events.cpp:196
+msgid "Do you really want to return to the Launcher?"
+msgstr "²ë áÐßàÐþÔë ÖÐÔÐÕæÕ ÒïàÝãææÐ þ ÓÐÛÞþÝÐÕ ÜÕÝî?"
+
+#: backends/events/default/default-events.cpp:196
+msgid "Launcher"
+msgstr "³ÐÛÞþÝÐÕ ÜÕÝî"
+
+#: backends/events/default/default-events.cpp:218
+msgid "Do you really want to quit?"
+msgstr "²ë áÐßàÐþÔë ÖÐÔÐÕæÕ ÒëÙáæö?"
+
+#: backends/events/gph/gph-events.cpp:386
+#: backends/events/gph/gph-events.cpp:429
+#: backends/events/openpandora/op-events.cpp:168
+msgid "Touchscreen 'Tap Mode' - Left Click"
+msgstr "ÀíÖëÜ 'ÔÞâëÚÐþ' âÐçáÚàëÝÐ - »ÕÒë ÚÛöÚ"
+
+#: backends/events/gph/gph-events.cpp:388
+#: backends/events/gph/gph-events.cpp:431
+#: backends/events/openpandora/op-events.cpp:170
+msgid "Touchscreen 'Tap Mode' - Right Click"
+msgstr "ÀíÖëÜ 'ÔÞâëÚÐþ' âÐçáÚàëÝÐ - ¿àÐÒë ÚÛöÚ"
+
+#: backends/events/gph/gph-events.cpp:390
+#: backends/events/gph/gph-events.cpp:433
+#: backends/events/openpandora/op-events.cpp:172
+msgid "Touchscreen 'Tap Mode' - Hover (No Click)"
+msgstr "ÀíÖëÜ 'ÔÞâëÚÐþ' âÐçáÚàëÝÐ - ¿àÐÛñâ (ÑÕ× ÚÛöÚã)"
+
+#: backends/events/gph/gph-events.cpp:410
+msgid "Maximum Volume"
+msgstr "¼ÐÚáöÜÐÛìÝÐï ÓãçÝÐáæì"
+
+#: backends/events/gph/gph-events.cpp:412
+msgid "Increasing Volume"
+msgstr "¿ÐÒÕÛöçíÝÝÕ ÓãçÝÐáæö"
+
+#: backends/events/gph/gph-events.cpp:418
+msgid "Minimal Volume"
+msgstr "¼öÝöÜÐÛìÝÐï ÓãçÝÐáæì"
+
+#: backends/events/gph/gph-events.cpp:420
+msgid "Decreasing Volume"
+msgstr "¿ÐÜïÝèíÝÝÕ ÓãçÝÐáæö"
+
+#: backends/events/openpandora/op-events.cpp:174
+msgid "Touchscreen 'Tap Mode' - Hover (DPad Clicks)"
+msgstr "ÀíÖëÜ 'ÔÞâëÚÐþ' âÐçáÚàëÝÐ - ¿àÐÛñâ (ÚÛöÚö ßÐ DPad)"
+
+#: backends/updates/macosx/macosx-updates.mm:67
+msgid "Check for Updates..."
+msgstr "¿àÐÒïàÐî ÐÑÝÐþÛÕÝÝö..."
+
+#: backends/platform/tizen/form.cpp:263
+msgid "Right Click Once"
+msgstr "°ÔÝÐ ßàÐÒÐï ßáâàëçÚÐ"
+
+#: backends/platform/tizen/form.cpp:271
+msgid "Move Only"
+msgstr "ÂÞÛìÚö ßÕàÐÜïáæöæì"
+
+#: backends/platform/tizen/form.cpp:294
+msgid "Escape Key"
+msgstr "ºÛÐÒöèÐ ESC"
+
+#: backends/platform/tizen/form.cpp:299
+msgid "Game Menu"
+msgstr "¼ÕÝî ÓãÛìÝö"
+
+#: backends/platform/tizen/form.cpp:304
+msgid "Show Keypad"
+msgstr "¿ÐÚÐ×Ðæì ÚÛÐÒöïâãàã"
+
+#: backends/platform/tizen/form.cpp:309
+msgid "Control Mouse"
+msgstr "ºöàÐÒÐÝÝÕ Üëèèã"
+
+#: backends/events/maemosdl/maemosdl-events.cpp:192
+msgid "Clicking Enabled"
+msgstr "¿áâàëçÚö þÚÛîçÐÝë"
+
+#: backends/events/maemosdl/maemosdl-events.cpp:192
+msgid "Clicking Disabled"
+msgstr "¿áâàëçÚö ÒëÚÛîçÐÝë"
+
+#: engines/agi/detection.cpp:142 engines/drascula/detection.cpp:302
+#: engines/dreamweb/detection.cpp:47 engines/neverhood/detection.cpp:160
+#: engines/sci/detection.cpp:394 engines/toltecs/detection.cpp:186
msgid "Use original save/load screens"
msgstr "²ëÚÐàëáâÞþÒÐæì ÐàëÓöÝÐÛìÝëï íÚàÐÝë ×Ðßöáã/çëâÐÝÝö ÓãÛìÝö"
-#: engines/agi/detection.cpp:143 engines/drascula/detection.cpp:271
-#: engines/dreamweb/detection.cpp:48 engines/sci/detection.cpp:394
-#: engines/toltecs/detection.cpp:174
+#: engines/agi/detection.cpp:143 engines/drascula/detection.cpp:303
+#: engines/dreamweb/detection.cpp:48 engines/neverhood/detection.cpp:161
+#: engines/sci/detection.cpp:395 engines/toltecs/detection.cpp:187
msgid "Use the original save/load screens, instead of the ScummVM ones"
msgstr ""
"²ëÚÐàëáâÞþÒÐæì ÐàëÓöÝÐÛìÝëï íÚàÐÝë ×Ðßöáã ö ×ÐåÐÒÐÝÝö ÓãÛìÝö ×ÐÜÕáâ "
"×àÞÑÛÕÝëå ã ScummVM"
-#: engines/agi/saveload.cpp:816 engines/drascula/saveload.cpp:351
-#: engines/sci/engine/kfile.cpp:841 engines/toltecs/menu.cpp:259
+#: engines/agi/saveload.cpp:816 engines/drascula/saveload.cpp:349
+#: engines/neverhood/menumodule.cpp:886 engines/sci/engine/kfile.cpp:857
+#: engines/toltecs/menu.cpp:256
msgid "Restore game:"
msgstr "Ã×ÝÐÒöæì ÓãÛìÝî:"
-#: engines/agi/saveload.cpp:816 engines/drascula/saveload.cpp:351
-#: engines/sci/engine/kfile.cpp:841 engines/toltecs/menu.cpp:259
+#: engines/agi/saveload.cpp:816 engines/drascula/saveload.cpp:349
+#: engines/neverhood/menumodule.cpp:886 engines/sci/engine/kfile.cpp:857
+#: engines/toltecs/menu.cpp:256
msgid "Restore"
msgstr "Ã×ÝÐÒöæì"
-#: engines/drascula/saveload.cpp:49
+#: engines/agos/saveload.cpp:160 engines/scumm/scumm.cpp:2321
+#, c-format
+msgid ""
+"Failed to load game state from file:\n"
+"\n"
+"%s"
+msgstr ""
+"½Õ ÐâàëÜÐÛÐáï ×ÐÓàã×öæì ÓãÛìÝî × äÐÙÛÐ:\n"
+"\n"
+"%s"
+
+#: engines/agos/saveload.cpp:195 engines/scumm/scumm.cpp:2314
+#, c-format
+msgid ""
+"Failed to save game state to file:\n"
+"\n"
+"%s"
+msgstr ""
+"½Õ ÐâàëÜÐÛÐáï ×ÐßöáÐæì ÓãÛìÝî þ äÐÙÛ:\n"
+"\n"
+"%s"
+
+#: engines/agos/saveload.cpp:203 engines/scumm/scumm.cpp:2332
+#, c-format
+msgid ""
+"Successfully saved game state in file:\n"
+"\n"
+"%s"
+msgstr ""
+"³ãÛìÝï ßÐáßïåÞÒÐ ×ÐåÐÒÐÝÐ þ äÐÙÛ:\n"
+"\n"
+"%s"
+
+#: engines/agos/animation.cpp:557
+#, c-format
+msgid "Cutscene file '%s' not found!"
+msgstr "ÄÐÙÛ ×ÐáâÐþÚö '%s' ÝÕ ×ÝÞÙÔ×ÕÝë!"
+
+#: engines/drascula/saveload.cpp:47
msgid ""
"ScummVM found that you have old savefiles for Drascula that should be "
"converted.\n"
@@ -1444,27 +2173,304 @@ msgstr "²ëÚÐàëáâÞþÒÐæì àíÖëÜ ïàÚÐÙ ßÐÛöâàë"
msgid "Display graphics using the game's bright palette"
msgstr "¼ÐÛîÕ ÓàÐäöÚã × ÒëÚÐàëáâÐÝÝÕÜ ïàÚÐÙ ßÐÛöâàë ÓãÛìÝö"
-#: engines/sci/detection.cpp:373
+#: engines/gob/inter_playtoons.cpp:256 engines/gob/inter_v2.cpp:1470
+#: engines/tinsel/saveload.cpp:532
+msgid "Failed to load game state from file."
+msgstr "½Õ ÐâàëÜÐÛÐáï ×ÐÓàã×öæì ×ÐåÐÒÐÝãî ÓãÛìÝî × äÐÙÛÐ."
+
+#: engines/gob/inter_v2.cpp:1540 engines/tinsel/saveload.cpp:545
+msgid "Failed to save game state to file."
+msgstr "½Õ ÐâàëÜÐÛÐáï ×ÐåÐÒÐæì ÓãÛìÝî þ äÐÙÛ."
+
+#: engines/gob/inter_v5.cpp:107
+msgid "Failed to delete file."
+msgstr "½Õ ÐâàëÜÐÛÐáï ÒëÔÐÛöæì äÐÙÛ."
+
+#: engines/groovie/detection.cpp:312
+msgid "Fast movie speed"
+msgstr "ÅãâÚö àíÖëÜ ÒöÔíÐ"
+
+#: engines/groovie/detection.cpp:313
+msgid "Play movies at an increased speed"
+msgstr "¿àÐÙÓàÐÒÐæì ÒöÔíÐ ÝÐ ßÐÒïÛöçÐÝÐÙ åãâÚÐáæö"
+
+#: engines/groovie/script.cpp:399
+msgid "Failed to save game"
+msgstr "½Õ ÐâàëÜÐÛÐáï ×ÐåÐÒÐæì ÓãÛìÝî"
+
+#. I18N: Studio audience adds an applause and cheering sounds whenever
+#. Malcolm makes a joke.
+#: engines/kyra/detection.cpp:62
+msgid "Studio audience"
+msgstr "ÁâãÔëÙÝÐï ÐþÔëâÞàëï"
+
+#: engines/kyra/detection.cpp:63
+msgid "Enable studio audience"
+msgstr "ÃÚÛîçëæì ÓãÚö ÐþÔëâÞàëö þ áâãÔëö"
+
+#. I18N: This option allows the user to skip text and cutscenes.
+#: engines/kyra/detection.cpp:73
+msgid "Skip support"
+msgstr "¿ÐÔâàëÜÚÐ ßàÞßãáÚÐþ"
+
+#: engines/kyra/detection.cpp:74
+msgid "Allow text and cutscenes to be skipped"
+msgstr "ÃÚÛîçÐÕ ÜÐÓçëÜÐáæì ßàÐßãáÚÐæì âíÚáâë ö ×ÐáâÐþÚö"
+
+#. I18N: Helium mode makes people sound like they've inhaled Helium.
+#: engines/kyra/detection.cpp:84
+msgid "Helium mode"
+msgstr "ÀíÖëÜ ÓÕÛöï"
+
+#: engines/kyra/detection.cpp:85
+msgid "Enable helium mode"
+msgstr "ÃÚÛîçëæì àíÖëÜ ÓÕÛöï"
+
+#. I18N: When enabled, this option makes scrolling smoother when
+#. changing from one screen to another.
+#: engines/kyra/detection.cpp:99
+msgid "Smooth scrolling"
+msgstr "¿ÛëþÝÐï ßàÐÓÞàâÚÐ"
+
+#: engines/kyra/detection.cpp:100
+msgid "Enable smooth scrolling when walking"
+msgstr "ÃÚÛîçëæì ßÛëþÝãî ßàÐÓÞàâÚã ßÐÔçÐá åÐÔë"
+
+#. I18N: When enabled, this option changes the cursor when it floats to the
+#. edge of the screen to a directional arrow. The player can then click to
+#. walk towards that direction.
+#: engines/kyra/detection.cpp:112
+msgid "Floating cursors"
+msgstr "¿ÛëÒãçëï ÚãàáÞàë"
+
+#: engines/kyra/detection.cpp:113
+msgid "Enable floating cursors"
+msgstr "ÃÚÛîçëæì ßÛëÒãçëï ÚãàáÞàë"
+
+#. I18N: HP stands for Hit Points
+#: engines/kyra/detection.cpp:127
+msgid "HP bar graphs"
+msgstr "¿ÐÛÞáÚö ×ÔÐàÞþï"
+
+#: engines/kyra/detection.cpp:128
+msgid "Enable hit point bar graphs"
+msgstr "ÃÚÛîçëæì ÐÔÛîáâàÐÒÐÝÝÕ ßÐÛÞáÐÚ ×ÔÐàÞþï"
+
+#: engines/kyra/lol.cpp:478
+msgid "Attack 1"
+msgstr "°âÐÚÐ 1"
+
+#: engines/kyra/lol.cpp:479
+msgid "Attack 2"
+msgstr "°âÐÚÐ 2"
+
+#: engines/kyra/lol.cpp:480
+msgid "Attack 3"
+msgstr "°âÐÚÐ 3"
+
+#: engines/kyra/lol.cpp:481
+msgid "Move Forward"
+msgstr "¦áæö ÝÐßÕàÐÔ"
+
+#: engines/kyra/lol.cpp:482
+msgid "Move Back"
+msgstr "¦áæö ÝÐ×ÐÔ"
+
+#: engines/kyra/lol.cpp:483
+msgid "Slide Left"
+msgstr "ÁÛö×ÓÐæì ÝÐÛÕÒÐ"
+
+#: engines/kyra/lol.cpp:484
+msgid "Slide Right"
+msgstr "ÁÛö×ÓÐæì ÝÐßàÐÒÐ"
+
+#: engines/kyra/lol.cpp:485 engines/pegasus/pegasus.cpp:2509
+msgid "Turn Left"
+msgstr "¿ÐÒÐàÞâ ÝÐÛÕÒÐ"
+
+#: engines/kyra/lol.cpp:486 engines/pegasus/pegasus.cpp:2510
+msgid "Turn Right"
+msgstr "¿ÐÒÐàÞâ ÝÐßàÐÒÐ"
+
+#: engines/kyra/lol.cpp:487
+msgid "Rest"
+msgstr "°ÔßÐçëæì"
+
+#: engines/kyra/lol.cpp:488
+msgid "Options"
+msgstr "¾ßæëö"
+
+#: engines/kyra/lol.cpp:489
+msgid "Choose Spell"
+msgstr "°ÑàÐæì ×ÐÓÐÒÞà"
+
+#: engines/kyra/sound_midi.cpp:477
+msgid ""
+"You appear to be using a General MIDI device,\n"
+"but your game only supports Roland MT32 MIDI.\n"
+"We try to map the Roland MT32 instruments to\n"
+"General MIDI ones. It is still possible that\n"
+"some tracks sound incorrect."
+msgstr ""
+"·ÔÐÕææÐ, Òë áßàÐÑãÕæÕ ÒëÚÐàëáâÞþÒÐæì ßàëÛÐÔã\n"
+"General MIDI, ÐÛÕ ÓíâÐï ÓãÛìÝï ßÐÔâàëÜÛöÒÐÕ âÞÛìÚö\n"
+"Roland MT32 MIDI. ¼ë ßÐáßàÐÑãÕÜ ßÐÔÐÑàÐæì General\n"
+"MIDI ßàëÛÐÔë, ßÐÔÞÑÝëï ÝÐ Roland MT32, ÐÛÕ\n"
+"ÜÞÖÐ âÐÚ ÐâàëÜÐææÐ, èâÞ ÝÕÚÐâÞàëï âàíÚö ÑãÔãæì\n"
+"áëÓàÐÝë ÝïßàÐÒöÛìÝÐ."
+
+#. I18N: Option for fast scene switching
+#: engines/mohawk/dialogs.cpp:92 engines/mohawk/dialogs.cpp:167
+msgid "~Z~ip Mode Activated"
+msgstr "ÀíÖëÜ åãâÚÐÓÐ ßÕàÐåÞÔã ÐÚâëÒÐÒÐÝë"
+
+#: engines/mohawk/dialogs.cpp:93
+msgid "~T~ransitions Enabled"
+msgstr "¿ÕàÐåÞÔë ÐÚâëÒÐÒÐÝë"
+
+#. I18N: Drop book page
+#: engines/mohawk/dialogs.cpp:95
+msgid "~D~rop Page"
+msgstr "²ëÚöÝãæì áâÐàÞÝÚã"
+
+#: engines/mohawk/dialogs.cpp:99
+msgid "~S~how Map"
+msgstr "¿ÞÚÐ×Ðâì ÚÐàâã"
+
+#: engines/mohawk/dialogs.cpp:105
+msgid "~M~ain Menu"
+msgstr "³ÐÛÞþÝÐÕ ÜÕÝî"
+
+#: engines/mohawk/dialogs.cpp:168
+msgid "~W~ater Effect Enabled"
+msgstr "ÍäÕÚâë ÒÐÔë þÚÛîçÐÝë"
+
+#: engines/neverhood/detection.cpp:167
+msgid "Skip the Hall of Records storyboard scenes"
+msgstr ""
+
+#: engines/neverhood/detection.cpp:168
+msgid "Allows the player to skip past the Hall of Records storyboard scenes"
+msgstr ""
+
+#: engines/neverhood/detection.cpp:174
+msgid "Scale the making of videos to full screen"
+msgstr ""
+
+#: engines/neverhood/detection.cpp:175
+msgid "Scale the making of videos, so that they use the whole screen"
+msgstr ""
+
+#: engines/parallaction/saveload.cpp:133
+#, c-format
+msgid ""
+"Can't save game in slot %i\n"
+"\n"
+msgstr ""
+"½Õ ÜÐÓã ×ÐåÐÒÐæì ÓãÛìÝî þ ßÐ×öæëî %i\n"
+"\n"
+
+#: engines/parallaction/saveload.cpp:204
+msgid "Loading game..."
+msgstr "·ÐÓàãÖÐî ÓãÛìÝî..."
+
+#: engines/parallaction/saveload.cpp:219
+msgid "Saving game..."
+msgstr "·ÐåÞþÒÐî ÓãÛìÝî..."
+
+#: engines/parallaction/saveload.cpp:272
+msgid ""
+"ScummVM found that you have old savefiles for Nippon Safes that should be "
+"renamed.\n"
+"The old names are 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 next time.\n"
+msgstr ""
+"ScummVM ×ÝÐÙèÞþ ã ÒÐá áâÐàëï ×ÐåÐÒÐÝÝö ÓãÛìÝö Nippon Safes, ïÚöï ÝÕÐÑåÞÔÝÐ "
+"ßÕàÐÝÐ×ÒÐæì. ÁâÐàëï ÝÐ×Òë ÑÞÛìè ÝÕ ßÐÔâàëÜÛöÒÐîææÐ, ö âÐÜã Òë ÝÕ ×ÜÞÖÐæÕ "
+"×ÐÓàã×öæì ×ÐåÐÒÐÝÝö, ÚÐÛö ÝÕ ßÕàÐÝÐ×ÐÒÕæÕ öå.\n"
+"\n"
+"½ÐæöáÝöæÕ ¾º, ÚÐÑ ßÕàÐÝÐ×ÒÐæì öå ×ÐàÐ×, ã ÐÔÒÐàÞâÝëÜ ÒëßÐÔÚã ÓíâÐ Ö "
+"ßÐÒÕÔÐÜÛÕÝÝÕ ×'ïÒöææÐ ßàë ÝÐáâãßÝëÜ ×ÐßãáÚã ÓãÛìÝö.\n"
+
+#: engines/parallaction/saveload.cpp:319
+msgid "ScummVM successfully converted all your savefiles."
+msgstr "ScummVM ßÐáßïåÞÒÐ ßÕàÐþâÒÐàëþ ãáÕ ÒÐèë ×ÐåÐÒÐÝÝö ÓãÛìÝïþ."
+
+#: engines/parallaction/saveload.cpp:321
+msgid ""
+"ScummVM printed some warnings in your console window and can't guarantee all "
+"your files have been converted.\n"
+"\n"
+"Please report to the team."
+msgstr ""
+"ScummVM ÝÐßöáÐþ ÝÕÚÐÛìÚö ßÐßïàíÔÖÐÝÝïþ ã ÐÚÝÞ ÚÐÝáÞÛö ö ÝÕ ×ÜÞÓ ßÕàÐþâÒÐàëæì "
+"ãáÕ äÐÙÛë.\n"
+"\n"
+"ºÐÛö ÛÐáÚÐ, ßÐÒÕÔÐÜöæÕ ßàÐ ÓíâÐ ÚÐÜÐÝÔ×Õ ScummVM."
+
+#: engines/pegasus/pegasus.cpp:714
+msgid "Invalid save file name"
+msgstr "½ïßàÐÒöÛìÝÐÕ öÜï äÐÙÛÐ ×ÐåÐÒÐÝÝï"
+
+#: engines/pegasus/pegasus.cpp:2507
+msgid "Up/Zoom In/Move Forward/Open Doors"
+msgstr "ÃÒÕàå/¼ÐèâÐÑ+/½ÐßÕàÐÔ/°ÔçëÝöæì Ô×ÒÕàë"
+
+#: engines/pegasus/pegasus.cpp:2508
+msgid "Down/Zoom Out"
+msgstr "ÃÝö×/¿ÐÜÕÝè. ÜÐèâÐÑ"
+
+#: engines/pegasus/pegasus.cpp:2511
+msgid "Display/Hide Inventory Tray"
+msgstr "¿ÐÚÐ×Ðæì/áåÐÒÐæì öÝÒÕÝâÐà"
+
+#: engines/pegasus/pegasus.cpp:2512
+msgid "Display/Hide Biochip Tray"
+msgstr "¿ÐÚÐ×Ðæì/áåÐÒÐæì Ñöïçëß"
+
+#: engines/pegasus/pegasus.cpp:2513
+msgid "Action/Select"
+msgstr "´×ÕïÝÝÕ/°ÑàÐæì"
+
+#: engines/pegasus/pegasus.cpp:2514
+msgid "Toggle Center Data Display"
+msgstr "¿ÕàÐÚÛîçëæì"
+
+#: engines/pegasus/pegasus.cpp:2515
+msgid "Display/Hide Info Screen"
+msgstr "¿ÐÚÐ×Ðæì/áåÐÒÐæì öÝäÐàÜÐæëî"
+
+#: engines/pegasus/pegasus.cpp:2516
+msgid "Display/Hide Pause Menu"
+msgstr "¿ÐÚÐ×Ðæì/áåÐÒÐæì ÜÕÝî ßÐþ×ë"
+
+#: engines/pegasus/pegasus.cpp:2517
+msgid "???"
+msgstr "???"
+
+#: engines/sci/detection.cpp:374
msgid "EGA undithering"
msgstr "EGA ÑÕ× àÐáâàã"
-#: engines/sci/detection.cpp:374
+#: engines/sci/detection.cpp:375
msgid "Enable undithering in EGA games"
msgstr "ÃÚÛîçÐÕ àíÖëÜ ÑÕ× àÐáâàÐÒÐÝÝï þ EGA ÓãÛìÝïå"
-#: engines/sci/detection.cpp:383
+#: engines/sci/detection.cpp:384
msgid "Prefer digital sound effects"
msgstr "°ÔÔÐÒÐæì ßÕàÐÒÐÓã ÛöçÑÐÒëÜ ÓãÚÐÒëÜ íäÕÚâÐÜ"
-#: engines/sci/detection.cpp:384
+#: engines/sci/detection.cpp:385
msgid "Prefer digital sound effects instead of synthesized ones"
msgstr "°ÔÔÐÒÐæì ßÕàÐÒÐÓã ÛöçÑÐÒëÜ ÓãÚÐÒëÜ íäÕÚâÐÜ ×ÐÜÕáâ áöÝâí×ÐÒÐÝëå"
-#: engines/sci/detection.cpp:403
+#: engines/sci/detection.cpp:404
msgid "Use IMF/Yamaha FB-01 for MIDI output"
msgstr "²ëÚÐàëáâÞþÒÐæì IMF/Yamaha FB-01 ÔÛï ÒëÒÐÔã MIDI"
-#: engines/sci/detection.cpp:404
+#: engines/sci/detection.cpp:405
msgid ""
"Use an IBM Music Feature card or a Yamaha FB-01 FM synth module for MIDI "
"output"
@@ -1472,168 +2478,150 @@ msgstr ""
"²ëÚÐàëáâÞþÒÐæì ÓãÚÐÒãî ÚÐàâã IBM Music Feature æö ÜÞÔãÛì áöÝâí×ã Yamaha "
"FB-01 FM ÔÛï MIDI"
-#: engines/sci/detection.cpp:414
+#: engines/sci/detection.cpp:415
msgid "Use CD audio"
msgstr "²ëÚÐàëáâÞþÒÐæì CD ÐþÔëñ"
-#: engines/sci/detection.cpp:415
+#: engines/sci/detection.cpp:416
msgid "Use CD audio instead of in-game audio, if available"
msgstr ""
"²ëÚÐàëáâÞþÒÐæì ÓãÚÐÒëï ÔÐàÞÖÚö × CD ×ÐÜÕáâ Üã×ëÚö × äÐÙÛÐþ ÓãÛìÝö (ÚÐÛö "
"ÔÐáâãßÝÐ)"
-#: engines/sci/detection.cpp:425
+#: engines/sci/detection.cpp:426
msgid "Use Windows cursors"
msgstr "²ëÚÐàëáâÞþÒÐæì ÚãàáÞàë Windows"
-#: engines/sci/detection.cpp:426
+#: engines/sci/detection.cpp:427
msgid ""
"Use the Windows cursors (smaller and monochrome) instead of the DOS ones"
msgstr ""
"²ëÚÐàëáâÞþÒÐæì ÚãàáÞàë Windows (ÜÕÝèëï ßÐ ßÐÜÕàë ö ÐÔÝÐÚÐÛïàÞÒëï) ×ÐÜÕáâ "
"ÚãàáÞàÐþ DOS"
-#: engines/sci/detection.cpp:436
+#: engines/sci/detection.cpp:437
msgid "Use silver cursors"
msgstr "²ëÚÐàëáâÞþÒÐæì áàíÑÝëï ÚãàáÞàë"
-#: engines/sci/detection.cpp:437
+#: engines/sci/detection.cpp:438
msgid ""
"Use the alternate set of silver cursors, instead of the normal golden ones"
msgstr ""
"²ëÚÐàëáâÞþÒÐæì ÐÛìâíàÝÐâëþÝë ÝÐÑÞà áàíÑÝëå ÚãàáÞàÐþ ×ÐÜÕáâ ×ÒëçÐÙÝëå ×ÐÛÐâëå"
-#: engines/scumm/dialogs.cpp:175
+#: engines/scumm/dialogs.cpp:176
#, c-format
msgid "Insert Disk %c and Press Button to Continue."
msgstr "ÃáâÐþæÕ ÔëáÚ %c ö ÝÐæöáÝöæÕ ÚÛÐÒöèã, ÚÐÑ ßàÐæïÓÝãæì."
-#: engines/scumm/dialogs.cpp:176
+#: engines/scumm/dialogs.cpp:177
#, c-format
msgid "Unable to Find %s, (%c%d) Press Button."
msgstr "½Õ ÐâàëÜÐÛÐáï ×ÝÐÙáæö %s, (%c%d) ½ÐæöáÝöæÕ ÚÛÐÒöèã."
-#: engines/scumm/dialogs.cpp:177
+#: engines/scumm/dialogs.cpp:178
#, c-format
msgid "Error reading disk %c, (%c%d) Press Button."
msgstr "¿ÐÜëÛÚÐ çëâÐÝÝï ÔëáÚÐ %c, (%c%d) ½ÐæöáÝöæÕ ÚÛÐÒöèã."
-#: engines/scumm/dialogs.cpp:178
+#: engines/scumm/dialogs.cpp:179
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
+#: engines/scumm/dialogs.cpp:183
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
+#: engines/scumm/dialogs.cpp:185
msgid "Are you sure you want to quit? (Y/N)"
msgstr "²ë þßíþÝÕÝë, èâÞ ÖÐÔÐÕæÕ ÒëÙáæö? (Y/N)"
-#: engines/scumm/dialogs.cpp:189
+#: engines/scumm/dialogs.cpp:190
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:215
-msgid "Quit"
-msgstr "²ëåÐÔ"
-
-#: engines/scumm/dialogs.cpp:193
+#: engines/scumm/dialogs.cpp:194
msgid "Insert save/load game disk"
msgstr "ÃáâÐþæÕ ÔëáÚ × ×ÐåÐÒÐÝÝïÜö"
-#: engines/scumm/dialogs.cpp:194
+#: engines/scumm/dialogs.cpp:195
msgid "You must enter a name"
msgstr "²ë ßÐÒöÝÝë þÒÕáæö öÜï"
-#: engines/scumm/dialogs.cpp:195
+#: engines/scumm/dialogs.cpp:196
msgid "The game was NOT saved (disk full?)"
msgstr "³ãÛìÝï ½µ ±Ë»° ×ÐßöáÐÝÐ (ÔëáÚ ßÞþÝë?)"
-#: engines/scumm/dialogs.cpp:196
+#: engines/scumm/dialogs.cpp:197
msgid "The game was NOT loaded"
msgstr "³ãÛìÝï ½µ ±Ë»° ×ÐÓàãÖÐÝÐ"
-#: engines/scumm/dialogs.cpp:197
+#: engines/scumm/dialogs.cpp:198
#, c-format
msgid "Saving '%s'"
msgstr "·ÐåÞþÒÐî '%s'"
-#: engines/scumm/dialogs.cpp:198
+#: engines/scumm/dialogs.cpp:199
#, c-format
msgid "Loading '%s'"
msgstr "·ÐÓàãÖÐî '%s'"
-#: engines/scumm/dialogs.cpp:199
+#: engines/scumm/dialogs.cpp:200
msgid "Name your SAVE game"
msgstr "½Ð×ÐÒöæÕ ×ÐåÐÒÐÝÝÕ ÓãÛìÝö"
-#: engines/scumm/dialogs.cpp:200
+#: engines/scumm/dialogs.cpp:201
msgid "Select a game to LOAD"
msgstr "°ÑïàëæÕ ÓãÛìÝî ÔÛï ×ÐÓàã×Úö"
-#: engines/scumm/dialogs.cpp:201
+#: engines/scumm/dialogs.cpp:202
msgid "Game title)"
msgstr "½Ð×ÒÐ ÓãÛìÝö)"
#. I18N: Previous page button
-#: engines/scumm/dialogs.cpp:287
+#: engines/scumm/dialogs.cpp:288
msgid "~P~revious"
msgstr "~¿~Ðßïà"
#. I18N: Next page button
-#: engines/scumm/dialogs.cpp:289
+#: engines/scumm/dialogs.cpp:290
msgid "~N~ext"
msgstr "~½~Ðáâ"
-#: engines/scumm/dialogs.cpp:290
-#: backends/platform/ds/arm9/source/dsoptions.cpp:56
-msgid "~C~lose"
-msgstr "~·~ÐÚàëæì"
-
-#: engines/scumm/dialogs.cpp:597
+#: engines/scumm/dialogs.cpp:598
msgid "Speech Only"
msgstr "ÂÞÛìÚö ÐÓãçÚÐ"
-#: engines/scumm/dialogs.cpp:598
+#: engines/scumm/dialogs.cpp:599
msgid "Speech and Subtitles"
msgstr "°ÓãçÚÐ ö áãÑâëâàë"
-#: engines/scumm/dialogs.cpp:599
+#: engines/scumm/dialogs.cpp:600
msgid "Subtitles Only"
msgstr "ÂÞÛìÚö áãÑâëâàë"
-#: engines/scumm/dialogs.cpp:607
+#: engines/scumm/dialogs.cpp:608
msgctxt "lowres"
msgid "Speech & Subs"
msgstr "°ÓãçÚÐ ö âíÚáâ"
-#: engines/scumm/dialogs.cpp:653
+#: engines/scumm/dialogs.cpp:654
msgid "Select a Proficiency Level."
msgstr "°ÑïàëæÕ þ×àÞÒÕÝì áÚÛÐÔÐÝÐáæö."
-#: engines/scumm/dialogs.cpp:655
+#: engines/scumm/dialogs.cpp:656
msgid "Refer to your Loom(TM) manual for help."
msgstr "·Ð ÔÐßÐÜÞÓÐÙ ×ÒïàÝöæÕáï ÔÐ öÝáâàãÚæëö Loom(TM)."
-#: engines/scumm/dialogs.cpp:658
-msgid "Standard"
-msgstr "ÁâÐÝÔÐàâÝë"
-
-#: engines/scumm/dialogs.cpp:659
+#: engines/scumm/dialogs.cpp:660
msgid "Practice"
msgstr "¿àÐÚâëÚÐÝâ"
-#: engines/scumm/dialogs.cpp:660
+#: engines/scumm/dialogs.cpp:661
msgid "Expert"
msgstr "ÍÚáßÕàâ"
@@ -2150,7 +3138,7 @@ msgstr "»ïæÕæì ÝÐßàÐÒÐ"
msgid "Fly to lower right"
msgstr "»ïæÕæì ÝÐßàÐÒÐ-þÝö×"
-#: engines/scumm/scumm.cpp:1776
+#: engines/scumm/scumm.cpp:1777
#, c-format
msgid ""
"Native MIDI support requires the Roland Upgrade from LucasArts,\n"
@@ -2159,40 +3147,7 @@ msgstr ""
"ÀíÖëÜ \"àÞÔÝÐÓÐ\" MIDI ßÐâàÐÑãÕ ÐÑÝÐþÛÕÝÝÕ Roland Upgrade ÐÔ\n"
"LucasArts, ÐÛÕ ÝÕ åÐßÐÕ %s. ¿ÕàÐÚÛîçÐîáï ÝÐ AdLib."
-#: engines/scumm/scumm.cpp:2303 engines/agos/saveload.cpp:220
-#, c-format
-msgid ""
-"Failed to save game state to file:\n"
-"\n"
-"%s"
-msgstr ""
-"½Õ ÐâàëÜÐÛÐáï ×ÐßöáÐæì ÓãÛìÝî þ äÐÙÛ:\n"
-"\n"
-"%s"
-
-#: engines/scumm/scumm.cpp:2310 engines/agos/saveload.cpp:185
-#, c-format
-msgid ""
-"Failed to load game state from file:\n"
-"\n"
-"%s"
-msgstr ""
-"½Õ ÐâàëÜÐÛÐáï ×ÐÓàã×öæì ÓãÛìÝî × äÐÙÛÐ:\n"
-"\n"
-"%s"
-
-#: engines/scumm/scumm.cpp:2322 engines/agos/saveload.cpp:228
-#, c-format
-msgid ""
-"Successfully saved game state in file:\n"
-"\n"
-"%s"
-msgstr ""
-"³ãÛìÝï ßÐáßïåÞÒÐ ×ÐåÐÒÐÝÐ þ äÐÙÛ:\n"
-"\n"
-"%s"
-
-#: engines/scumm/scumm.cpp:2537
+#: engines/scumm/scumm.cpp:2547
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' "
@@ -2202,191 +3157,6 @@ msgstr ""
"þÜÕÕ. ºÐÑ ×ÓãÛïæì, ÝÐæöáÝöæÕ '½ÞÒÐï ÓãÛìÝï' ã áâÐàâÐÒëÜ ÜÕÝî ScummVM, Ð "
"×ÐâëÜ ÐÑïàëæÕ ÔëàíÚâÞàëî Maniac ã ÔëàíÚâÞàëö × ÓãÛìÝñÙ Tentacle."
-#. I18N: Option for fast scene switching
-#: engines/mohawk/dialogs.cpp:92 engines/mohawk/dialogs.cpp:167
-msgid "~Z~ip Mode Activated"
-msgstr "ÀíÖëÜ åãâÚÐÓÐ ßÕàÐåÞÔã ÐÚâëÒÐÒÐÝë"
-
-#: engines/mohawk/dialogs.cpp:93
-msgid "~T~ransitions Enabled"
-msgstr "¿ÕàÐåÞÔë ÐÚâëÒÐÒÐÝë"
-
-#. I18N: Drop book page
-#: engines/mohawk/dialogs.cpp:95
-msgid "~D~rop Page"
-msgstr "²ëÚöÝãæì áâÐàÞÝÚã"
-
-#: engines/mohawk/dialogs.cpp:99
-msgid "~S~how Map"
-msgstr "¿ÞÚÐ×Ðâì ÚÐàâã"
-
-#: engines/mohawk/dialogs.cpp:105
-msgid "~M~ain Menu"
-msgstr "³ÐÛÞþÝÐÕ ÜÕÝî"
-
-#: engines/mohawk/dialogs.cpp:168
-msgid "~W~ater Effect Enabled"
-msgstr "ÍäÕÚâë ÒÐÔë þÚÛîçÐÝë"
-
-#: engines/agos/animation.cpp:557
-#, c-format
-msgid "Cutscene file '%s' not found!"
-msgstr "ÄÐÙÛ ×ÐáâÐþÚö '%s' ÝÕ ×ÝÞÙÔ×ÕÝë!"
-
-#: engines/gob/inter_playtoons.cpp:256 engines/gob/inter_v2.cpp:1287
-#: engines/tinsel/saveload.cpp:532
-msgid "Failed to load game state from file."
-msgstr "½Õ ÐâàëÜÐÛÐáï ×ÐÓàã×öæì ×ÐåÐÒÐÝãî ÓãÛìÝî × äÐÙÛÐ."
-
-#: engines/gob/inter_v2.cpp:1357 engines/tinsel/saveload.cpp:545
-msgid "Failed to save game state to file."
-msgstr "½Õ ÐâàëÜÐÛÐáï ×ÐåÐÒÐæì ÓãÛìÝî þ äÐÙÛ."
-
-#: engines/gob/inter_v5.cpp:107
-msgid "Failed to delete file."
-msgstr "½Õ ÐâàëÜÐÛÐáï ÒëÔÐÛöæì äÐÙÛ."
-
-#: engines/groovie/detection.cpp:312
-msgid "Fast movie speed"
-msgstr "ÅãâÚö àíÖëÜ ÒöÔíÐ"
-
-#: engines/groovie/detection.cpp:313
-msgid "Play movies at an increased speed"
-msgstr "¿àÐÙÓàÐÒÐæì ÒöÔíÐ ÝÐ ßÐÒïÛöçÐÝÐÙ åãâÚÐáæö"
-
-#: engines/groovie/script.cpp:420
-msgid "Failed to save game"
-msgstr "½Õ ÐâàëÜÐÛÐáï ×ÐåÐÒÐæì ÓãÛìÝî"
-
-#. I18N: Studio audience adds an applause and cheering sounds whenever
-#. Malcolm makes a joke.
-#: engines/kyra/detection.cpp:62
-msgid "Studio audience"
-msgstr "ÁâãÔëÙÝÐï ÐþÔëâÞàëï"
-
-#: engines/kyra/detection.cpp:63
-msgid "Enable studio audience"
-msgstr "ÃÚÛîçëæì ÓãÚö ÐþÔëâÞàëö þ áâãÔëö"
-
-#. I18N: This option allows the user to skip text and cutscenes.
-#: engines/kyra/detection.cpp:73
-msgid "Skip support"
-msgstr "¿ÐÔâàëÜÚÐ ßàÞßãáÚÐþ"
-
-#: engines/kyra/detection.cpp:74
-msgid "Allow text and cutscenes to be skipped"
-msgstr "ÃÚÛîçÐÕ ÜÐÓçëÜÐáæì ßàÐßãáÚÐæì âíÚáâë ö ×ÐáâÐþÚö"
-
-#. I18N: Helium mode makes people sound like they've inhaled Helium.
-#: engines/kyra/detection.cpp:84
-msgid "Helium mode"
-msgstr "ÀíÖëÜ ÓÕÛöï"
-
-#: engines/kyra/detection.cpp:85
-msgid "Enable helium mode"
-msgstr "ÃÚÛîçëæì àíÖëÜ ÓÕÛöï"
-
-#. I18N: When enabled, this option makes scrolling smoother when
-#. changing from one screen to another.
-#: engines/kyra/detection.cpp:99
-msgid "Smooth scrolling"
-msgstr "¿ÛëþÝÐï ßàÐÓÞàâÚÐ"
-
-#: engines/kyra/detection.cpp:100
-msgid "Enable smooth scrolling when walking"
-msgstr "ÃÚÛîçëæì ßÛëþÝãî ßàÐÓÞàâÚã ßÐÔçÐá åÐÔë"
-
-#. I18N: When enabled, this option changes the cursor when it floats to the
-#. edge of the screen to a directional arrow. The player can then click to
-#. walk towards that direction.
-#: engines/kyra/detection.cpp:112
-msgid "Floating cursors"
-msgstr "¿ÛëÒãçëï ÚãàáÞàë"
-
-#: engines/kyra/detection.cpp:113
-msgid "Enable floating cursors"
-msgstr "ÃÚÛîçëæì ßÛëÒãçëï ÚãàáÞàë"
-
-#. I18N: HP stands for Hit Points
-#: engines/kyra/detection.cpp:127
-msgid "HP bar graphs"
-msgstr "¿ÐÛÞáÚö ×ÔÐàÞþï"
-
-#: engines/kyra/detection.cpp:128
-msgid "Enable hit point bar graphs"
-msgstr "ÃÚÛîçëæì ÐÔÛîáâàÐÒÐÝÝÕ ßÐÛÞáÐÚ ×ÔÐàÞþï"
-
-#: engines/kyra/lol.cpp:478
-msgid "Attack 1"
-msgstr "°âÐÚÐ 1"
-
-#: engines/kyra/lol.cpp:479
-msgid "Attack 2"
-msgstr "°âÐÚÐ 2"
-
-#: engines/kyra/lol.cpp:480
-msgid "Attack 3"
-msgstr "°âÐÚÐ 3"
-
-#: engines/kyra/lol.cpp:481
-msgid "Move Forward"
-msgstr "¦áæö ÝÐßÕàÐÔ"
-
-#: engines/kyra/lol.cpp:482
-msgid "Move Back"
-msgstr "¦áæö ÝÐ×ÐÔ"
-
-#: engines/kyra/lol.cpp:483
-msgid "Slide Left"
-msgstr "ÁÛö×ÓÐæì ÝÐÛÕÒÐ"
-
-#: engines/kyra/lol.cpp:484
-msgid "Slide Right"
-msgstr "ÁÛö×ÓÐæì ÝÐßàÐÒÐ"
-
-#: engines/kyra/lol.cpp:485 engines/pegasus/pegasus.cpp:2447
-msgid "Turn Left"
-msgstr "¿ÐÒÐàÞâ ÝÐÛÕÒÐ"
-
-#: engines/kyra/lol.cpp:486 engines/pegasus/pegasus.cpp:2448
-msgid "Turn Right"
-msgstr "¿ÐÒÐàÞâ ÝÐßàÐÒÐ"
-
-#: engines/kyra/lol.cpp:487
-msgid "Rest"
-msgstr "°ÔßÐçëæì"
-
-#: engines/kyra/lol.cpp:488
-msgid "Options"
-msgstr "¾ßæëö"
-
-#: engines/kyra/lol.cpp:489
-msgid "Choose Spell"
-msgstr "°ÑàÐæì ×ÐÓÐÒÞà"
-
-#: engines/kyra/sound_midi.cpp:477
-msgid ""
-"You appear to be using a General MIDI device,\n"
-"but your game only supports Roland MT32 MIDI.\n"
-"We try to map the Roland MT32 instruments to\n"
-"General MIDI ones. It is still possible that\n"
-"some tracks sound incorrect."
-msgstr ""
-"·ÔÐÕææÐ, Òë áßàÐÑãÕæÕ ÒëÚÐàëáâÞþÒÐæì ßàëÛÐÔã\n"
-"General MIDI, ÐÛÕ ÓíâÐï ÓãÛìÝï ßÐÔâàëÜÛöÒÐÕ âÞÛìÚö\n"
-"Roland MT32 MIDI. ¼ë ßÐáßàÐÑãÕÜ ßÐÔÐÑàÐæì General\n"
-"MIDI ßàëÛÐÔë, ßÐÔÞÑÝëï ÝÐ Roland MT32, ÐÛÕ\n"
-"ÜÞÖÐ âÐÚ ÐâàëÜÐææÐ, èâÞ ÝÕÚÐâÞàëï âàíÚö ÑãÔãæì\n"
-"áëÓàÐÝë ÝïßàÐÒöÛìÝÐ."
-
-#: engines/queen/queen.cpp:59
-msgid "Alternative intro"
-msgstr "°ÛìâíàÝÐâëþÝë þáâãß"
-
-#: engines/queen/queen.cpp:60
-msgid "Use an alternative game intro (CD version only)"
-msgstr "²ëÚÐàëáâÞþÒÐæì ÐÛìâíàÝÐâëþÝë þáâãß (âÞÛìÚö ÔÛï CD ÒÕàáöö ÓãÛìÝö)"
-
#: engines/sky/compact.cpp:130
msgid ""
"Unable to find \"sky.cpt\" file!\n"
@@ -2411,21 +3181,24 @@ msgstr "Ãáâãß × ÔëáÚÕâ"
msgid "Use the floppy version's intro (CD version only)"
msgstr "²ëÚÐàëáâÞþÒÐæì ãáâãß × ÓÝãâÚöå ÔëáÚÐþ (âÞÛìÚö ÔÛï CD ÒÕàáöö ÓãÛìÝö)"
-#: engines/sword1/animation.cpp:519
+#: engines/sword1/animation.cpp:524
#, c-format
msgid "PSX stream cutscene '%s' cannot be played in paletted mode"
msgstr "·ÐáâÐþÚÐ PSX '%s' ÝÕ ÜÞÖÐ Ñëæì ßàÐÙÓàÐÝÐ þ àíÖëÜÕ × ßÐÛöâàÐÙ"
-#: engines/sword1/animation.cpp:540 engines/sword2/animation.cpp:439
+#: engines/sword1/animation.cpp:545 engines/sword2/animation.cpp:445
msgid "DXA cutscenes found but ScummVM has been built without zlib support"
msgstr ""
"·ÝÞÙÔ×ÕÝë ×ÐáâÐþÚö þ äÐàÜÐæÕ DXA, ÐÛÕ ScummVM Ñëþ áÐÑàÐÝë ÑÕ× ßÐÔâàëÜÚö zlib"
-#: engines/sword1/animation.cpp:550 engines/sword2/animation.cpp:449
-msgid "MPEG2 cutscenes are no longer supported"
-msgstr "·ÐáâÐþÚö þ äÐàÜÐæÕ MPEG2 ÑÞÛìè ÝÕ ßÐÔâàëÜÛöÒÐîææÐ"
+#: engines/sword1/animation.cpp:561
+#, fuzzy
+msgid "MPEG-2 cutscenes found but ScummVM has been built without MPEG-2"
+msgstr ""
+"·ÝÞÙÔ×ÕÝë ×ÐáâÐþÚö þ äÐàÜÐæÕ PSX, ÐÛÕ ScummVM Ñëþ áÐÑàÐÝë ÑÕ× ßÐÔâàëÜÚö RGB "
+"ÚÞÛÕàÐþ"
-#: engines/sword1/animation.cpp:556 engines/sword2/animation.cpp:457
+#: engines/sword1/animation.cpp:568 engines/sword2/animation.cpp:470
#, c-format
msgid "Cutscene '%s' not found"
msgstr "·ÐáâÐþÚÐ '%s' ÝÕ ×ÝÞÙÔ×ÕÝÐ"
@@ -2468,13 +3241,20 @@ msgstr "·àÐÑöæì ÝÞÒÐÕ"
msgid "This is the end of the Broken Sword 1 Demo"
msgstr "³íâÐ ×ÐÒïàèíÝÝÕ ÔíÜÐ Broken Sword 1"
-#: engines/sword2/animation.cpp:419
+#: engines/sword2/animation.cpp:425
msgid ""
"PSX cutscenes found but ScummVM has been built without RGB color support"
msgstr ""
"·ÝÞÙÔ×ÕÝë ×ÐáâÐþÚö þ äÐàÜÐæÕ PSX, ÐÛÕ ScummVM Ñëþ áÐÑàÐÝë ÑÕ× ßÐÔâàëÜÚö RGB "
"ÚÞÛÕàÐþ"
+#: engines/sword2/animation.cpp:461
+#, fuzzy
+msgid ""
+"MPEG-2 cutscenes found but ScummVM has been built without MPEG-2 support"
+msgstr ""
+"·ÝÞÙÔ×ÕÝë ×ÐáâÐþÚö þ äÐàÜÐæÕ DXA, ÐÛÕ ScummVM Ñëþ áÐÑàÐÝë ÑÕ× ßÐÔâàëÜÚö zlib"
+
#: engines/sword2/sword2.cpp:79
msgid "Show object labels"
msgstr "¿ÐÚÐ×ÒÐæì ÝÐ×Òë ÐÑ'ÕÚâÐþ"
@@ -2483,13 +3263,13 @@ msgstr "¿ÐÚÐ×ÒÐæì ÝÐ×Òë ÐÑ'ÕÚâÐþ"
msgid "Show labels for objects on mouse hover"
msgstr "¿ÐÚÐ×ÒÐÕ ÝÐ×Òë ÐÑ'ÕÚâÐþ ßàë ÝÐÒïÔ×ÕÝÝö ÚãàáÞàÐ Üëèë"
-#: engines/teenagent/resources.cpp:94
+#: engines/teenagent/resources.cpp:95
msgid ""
"You're missing the 'teenagent.dat' file. Get it from the ScummVM website"
msgstr ""
"à ÒÐá ÐÔáãâÝöçÐÕ äÐÙÛ 'teenagent.dat'. ·ÐßÐÜßãÙæÕ ïÓÞ × ÒíÑ-áÐÙâÐ ScummVM"
-#: engines/teenagent/resources.cpp:115
+#: engines/teenagent/resources.cpp:116
msgid ""
"The teenagent.dat file is compressed and zlib hasn't been included in this "
"executable. Please decompress it"
@@ -2497,789 +3277,51 @@ msgstr ""
"ÄÐÙÛ teenagent.dat ×ÖÐâë, ÐÛÕ zlib ÝÕ þÚÛîçÐÝÐ þ Óíâã ßàÐÓàÐÜã. ºÐÛö ÛÐáÚÐ, "
"àÐáßÐÚãÙæÕ ïÓÞ"
-#: engines/parallaction/saveload.cpp:133
-#, c-format
-msgid ""
-"Can't save game in slot %i\n"
-"\n"
-msgstr ""
-"½Õ ÜÐÓã ×ÐåÐÒÐæì ÓãÛìÝî þ ßÐ×öæëî %i\n"
-"\n"
-
-#: engines/parallaction/saveload.cpp:204
-msgid "Loading game..."
-msgstr "·ÐÓàãÖÐî ÓãÛìÝî..."
-
-#: engines/parallaction/saveload.cpp:219
-msgid "Saving game..."
-msgstr "·ÐåÞþÒÐî ÓãÛìÝî..."
-
-#: engines/parallaction/saveload.cpp:272
-msgid ""
-"ScummVM found that you have old savefiles for Nippon Safes that should be "
-"renamed.\n"
-"The old names are 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 next time.\n"
-msgstr ""
-"ScummVM ×ÝÐÙèÞþ ã ÒÐá áâÐàëï ×ÐåÐÒÐÝÝö ÓãÛìÝö Nippon Safes, ïÚöï ÝÕÐÑåÞÔÝÐ "
-"ßÕàÐÝÐ×ÒÐæì. ÁâÐàëï ÝÐ×Òë ÑÞÛìè ÝÕ ßÐÔâàëÜÛöÒÐîææÐ, ö âÐÜã Òë ÝÕ ×ÜÞÖÐæÕ "
-"×ÐÓàã×öæì ×ÐåÐÒÐÝÝö, ÚÐÛö ÝÕ ßÕàÐÝÐ×ÐÒÕæÕ öå.\n"
-"\n"
-"½ÐæöáÝöæÕ ¾º, ÚÐÑ ßÕàÐÝÐ×ÒÐæì öå ×ÐàÐ×, ã ÐÔÒÐàÞâÝëÜ ÒëßÐÔÚã ÓíâÐ Ö "
-"ßÐÒÕÔÐÜÛÕÝÝÕ ×'ïÒöææÐ ßàë ÝÐáâãßÝëÜ ×ÐßãáÚã ÓãÛìÝö.\n"
-
-#: engines/parallaction/saveload.cpp:319
-msgid "ScummVM successfully converted all your savefiles."
-msgstr "ScummVM ßÐáßïåÞÒÐ ßÕàÐþâÒÐàëþ ãáÕ ÒÐèë ×ÐåÐÒÐÝÝö ÓãÛìÝïþ."
-
-#: engines/parallaction/saveload.cpp:321
-msgid ""
-"ScummVM printed some warnings in your console window and can't guarantee all "
-"your files have been converted.\n"
-"\n"
-"Please report to the team."
-msgstr ""
-"ScummVM ÝÐßöáÐþ ÝÕÚÐÛìÚö ßÐßïàíÔÖÐÝÝïþ ã ÐÚÝÞ ÚÐÝáÞÛö ö ÝÕ ×ÜÞÓ ßÕàÐþâÒÐàëæì "
-"ãáÕ äÐÙÛë.\n"
-"\n"
-"ºÐÛö ÛÐáÚÐ, ßÐÒÕÔÐÜöæÕ ßàÐ ÓíâÐ ÚÐÜÐÝÔ×Õ ScummVM."
-
-#: engines/pegasus/pegasus.cpp:679
-msgid "Invalid save file name"
-msgstr "½ïßàÐÒöÛìÝÐÕ öÜï äÐÙÛÐ ×ÐåÐÒÐÝÝï"
-
-#: engines/pegasus/pegasus.cpp:2445
-msgid "Up/Zoom In/Move Forward/Open Doors"
-msgstr "ÃÒÕàå/¼ÐèâÐÑ+/½ÐßÕàÐÔ/°ÔçëÝöæì Ô×ÒÕàë"
-
-#: engines/pegasus/pegasus.cpp:2446
-msgid "Down/Zoom Out"
-msgstr "ÃÝö×/¿ÐÜÕÝè. ÜÐèâÐÑ"
-
-#: engines/pegasus/pegasus.cpp:2449
-msgid "Display/Hide Inventory Tray"
-msgstr "¿ÐÚÐ×Ðæì/áåÐÒÐæì öÝÒÕÝâÐà"
-
-#: engines/pegasus/pegasus.cpp:2450
-msgid "Display/Hide Biochip Tray"
-msgstr "¿ÐÚÐ×Ðæì/áåÐÒÐæì Ñöïçëß"
-
-#: engines/pegasus/pegasus.cpp:2451
-msgid "Action/Select"
-msgstr "´×ÕïÝÝÕ/°ÑàÐæì"
-
-#: engines/pegasus/pegasus.cpp:2452
-msgid "Toggle Center Data Display"
-msgstr "¿ÕàÐÚÛîçëæì"
-
-#: engines/pegasus/pegasus.cpp:2453
-msgid "Display/Hide Info Screen"
-msgstr "¿ÐÚÐ×Ðæì/áåÐÒÐæì öÝäÐàÜÐæëî"
-
-#: engines/pegasus/pegasus.cpp:2454
-msgid "Display/Hide Pause Menu"
-msgstr "¿ÐÚÐ×Ðæì/áåÐÒÐæì ÜÕÝî ßÐþ×ë"
-
-#: engines/pegasus/pegasus.cpp:2455
-msgid "???"
-msgstr "???"
-
-#: audio/fmopl.cpp:49
-msgid "MAME OPL emulator"
-msgstr "ÍÜãÛïâÐà MAME OPL"
-
-#: audio/fmopl.cpp:51
-msgid "DOSBox OPL emulator"
-msgstr "ÍÜãÛïâÐà DOSBox OPL"
-
-#: audio/mididrv.cpp:209
-#, c-format
-msgid ""
-"The selected audio device '%s' was not found (e.g. might be turned off or "
-"disconnected)."
-msgstr ""
-"°ÑàÐÝÐï ÓãÚÐÒÐï ßàëÛÐÔÐ '%s' ÝÕ ÑëÛÐ ×ÝÞÙÔ×ÕÝÐ (ÜÐÓçëÜÐ, ïÝÐ ÒëÚÛîçÐÝÐ æö ÝÕ "
-"ßÐÔÚÛîçÐÝÐ)."
-
-#: audio/mididrv.cpp:209 audio/mididrv.cpp:221 audio/mididrv.cpp:257
-#: audio/mididrv.cpp:272
-msgid "Attempting to fall back to the next available device..."
-msgstr "ÁßàÐÑãî ÒëÚÐàëáâÐæì öÝèãî ÔÐáâãßÝãî ßàëÛÐÔã..."
-
-#: audio/mididrv.cpp:221
-#, c-format
-msgid ""
-"The selected audio device '%s' cannot be used. See log file for more "
-"information."
-msgstr ""
-"°ÑàÐÝÐï ÓãÚÐÒÐï ßàëÛÐÔÐ '%s' ÝÕ ÜÞÖÐ Ñëæì áÚÐàëáâÐÝÐ. ³ÛïÔ×öæÕ äÐÙÛ "
-"ßàÐâÐÚÞÛã ÔÛï ÑÞÛìè ßÐÔàÐÑï×ÝÐÙ öÝäÐàÜÐæëö."
-
-#: audio/mididrv.cpp:257
-#, c-format
-msgid ""
-"The preferred audio device '%s' was not found (e.g. might be turned off or "
-"disconnected)."
-msgstr ""
-"¿ÕàÐÒÐÖÝÐï ÓãÚÐÒÐï ßàëÛÐÔÐ '%s' ÝÕ ÑëÛÐ ×ÝÞÙÔ×ÕÝÐ (ÜÐÓçëÜÐ, ïÝÐ ÒëÚÛîçÐÝÐ æö "
-"ÝÕ ßÐÔÚÛîçÐÝÐ)."
-
-#: audio/mididrv.cpp:272
-#, c-format
-msgid ""
-"The preferred audio device '%s' cannot be used. See log file for more "
-"information."
-msgstr ""
-"¿ÕàÐÒÐÖÝÐï ÓãÚÐÒÐï ßàëÛÐÔÐ '%s' ÝÕ ÜÞÖÐ Ñëæì áÚÐàëáâÐÝÐ. ³ÛïÔ×öæÕ äÐÙÛ "
-"ßàÐâÐÚÞÛã ÔÛï ÑÞÛìè ßÐÔàÐÑï×ÝÐÙ öÝäÐàÜÐæëö."
-
-#: audio/null.h:43
-msgid "No music"
-msgstr "±Õ× Üã×ëÚö"
-
-#: audio/mods/paula.cpp:189
-msgid "Amiga Audio Emulator"
-msgstr "ÍÜãÛïâÐà ÓãÚã Amiga"
-
-#: audio/softsynth/adlib.cpp:2284
-msgid "AdLib Emulator"
-msgstr "ÍÜãÛïâÐà AdLib"
-
-#: audio/softsynth/appleiigs.cpp:33
-msgid "Apple II GS Emulator (NOT IMPLEMENTED)"
-msgstr "ÍÜãÛïâÐà Apple II GS (ÐÔáãâÝöçÐÕ)"
-
-#: audio/softsynth/sid.cpp:1430
-msgid "C64 Audio Emulator"
-msgstr "ÍÜãÛïâÐà ÓãÚã C64"
-
-#: audio/softsynth/mt32.cpp:205
-msgid "Initializing MT-32 Emulator"
-msgstr "½ÐÛÐÔÖÒÐî íÜãÛïâÐà MT-32"
-
-#: audio/softsynth/mt32.cpp:431
-msgid "MT-32 Emulator"
-msgstr "ÍÜãÛïâÐà MT-32"
-
-#: audio/softsynth/pcspk.cpp:139
-msgid "PC Speaker Emulator"
-msgstr "ÍÜãÛïâÐà PC áßöÚÕàÐ"
-
-#: audio/softsynth/pcspk.cpp:158
-msgid "IBM PCjr Emulator"
-msgstr "ÍÜãÛïâÐà IBM PCjr"
-
-#: backends/keymapper/remap-dialog.cpp:47
-msgid "Keymap:"
-msgstr "ÂÐÑÛöæÐ ÚÛÐÒöè:"
-
-#: backends/keymapper/remap-dialog.cpp:66
-msgid " (Effective)"
-msgstr " (´×ÕÙáÝÐï)"
-
-#: backends/keymapper/remap-dialog.cpp:106
-msgid " (Active)"
-msgstr " (°ÚâëþÝÐï)"
-
-#: backends/keymapper/remap-dialog.cpp:106
-msgid " (Blocked)"
-msgstr " (·ÐÑÛÐÚÐÒÐÝÐ)"
-
-#: backends/keymapper/remap-dialog.cpp:119
-msgid " (Global)"
-msgstr " (³ÛÐÑÐÛìÝÐï)"
-
-#: backends/keymapper/remap-dialog.cpp:127
-msgid " (Game)"
-msgstr " (³ãÛìÝö)"
-
-#: backends/midi/windows.cpp:164
-msgid "Windows MIDI"
-msgstr "Windows MIDI"
-
-#: backends/platform/ds/arm9/source/dsoptions.cpp:57
-msgid "ScummVM Main Menu"
-msgstr "³ÐÛÞþÝÐÕ ÜÕÝî ScummVM"
-
-#: backends/platform/ds/arm9/source/dsoptions.cpp:63
-msgid "~L~eft handed mode"
-msgstr "»ÕÒÐàãÚö àíÖëÜ"
-
-#: backends/platform/ds/arm9/source/dsoptions.cpp:64
-msgid "~I~ndy fight controls"
-msgstr "ºöàÐÒÐÝÝÕ ÑÐïÜö þ Indy"
-
-#: backends/platform/ds/arm9/source/dsoptions.cpp:65
-msgid "Show mouse cursor"
-msgstr "¿ÐÚÐ×ÒÐæì ÚãàáÞà Üëèë"
-
-#: backends/platform/ds/arm9/source/dsoptions.cpp:66
-msgid "Snap to edges"
-msgstr "¿àëÜÐæÐÒÐæì ÔÐ ÜÕÖ"
-
-#: backends/platform/ds/arm9/source/dsoptions.cpp:68
-msgid "Touch X Offset"
-msgstr "·àãèíÝÝÕ ÔÞâëÚÐþ ßÐ ÒÞáö X"
-
-#: backends/platform/ds/arm9/source/dsoptions.cpp:75
-msgid "Touch Y Offset"
-msgstr "·àãèíÝÝÕ ÔÞâëÚÐþ ßÐ ÒÞáö Y"
-
-#: backends/platform/ds/arm9/source/dsoptions.cpp:87
-msgid "Use laptop trackpad-style cursor control"
-msgstr "²ëÚÐàëáâÞþÒÐæì ÚöàÐÒÐÝÝÕ ÚãàáÞàÐÜ ïÚ ÝÐ âàíÚßÐÔ×Õ ÛíßâÞßÐþ"
-
-#: backends/platform/ds/arm9/source/dsoptions.cpp:88
-msgid "Tap for left click, double tap right click"
-msgstr "ÂÐß ÔÛï ÛÕÒÐÙ ßáâàëçÚö, ßÐÔÒÞÙÝë âÐß ÔÛï ßàÐÒÐÙ ßáâàëçÚö"
-
-#: backends/platform/ds/arm9/source/dsoptions.cpp:90
-msgid "Sensitivity"
-msgstr "°ÔçãÒÐÛìÝÐáæì"
-
-#: backends/platform/ds/arm9/source/dsoptions.cpp:99
-msgid "Initial top screen scale:"
-msgstr "¿ÐçÐâÚÞÒë ÜÐèâÐÑ ÒÕàåÝïÓÐ íÚàÐÝÐ:"
-
-#: backends/platform/ds/arm9/source/dsoptions.cpp:105
-msgid "Main screen scaling:"
-msgstr "¼ÐèâÐÑ ÓÐÛÞþÝÐÓÐ íÚàÐÝÐ:"
-
-#: backends/platform/ds/arm9/source/dsoptions.cpp:107
-msgid "Hardware scale (fast, but low quality)"
-msgstr "ÅÐàÔÒÐàÝÐÕ ÜÐèâÐÑÐÒÐÝÝÕ (åãâÚÐ, ÐÛÕ Ýö×ÚÐÙ ïÚÐáæö)"
-
-#: backends/platform/ds/arm9/source/dsoptions.cpp:108
-msgid "Software scale (good quality, but slower)"
-msgstr "¿àÐÓàÐÜÝÐÕ ÜÐèâÐÑÐÒÐÝÝÕ (ÔÞÑàÐï ïÚÐáæì, ÐÛÕ ÜÐàãÔÝÕÙ)"
-
-#: backends/platform/ds/arm9/source/dsoptions.cpp:109
-msgid "Unscaled (you must scroll left and right)"
-msgstr "±Õ× ÜÐèâÐÑÐÒÐÝÝï (âàíÑÐ ÑãÔ×Õ ßàÐÚàãçÒÐæì ÝÐÛÕÒÐ ö ÝÐßàÐÒÐ)"
-
-#: backends/platform/ds/arm9/source/dsoptions.cpp:111
-msgid "Brightness:"
-msgstr "ÏàÚÐáæì:"
-
-#: backends/platform/ds/arm9/source/dsoptions.cpp:121
-msgid "High quality audio (slower) (reboot)"
-msgstr "²ëáÞÚÐï ïÚÐáæì ÓãÚã (ÜÐàãÔÝÕÙ) (àíÑãâ)"
-
-#: backends/platform/ds/arm9/source/dsoptions.cpp:122
-msgid "Disable power off"
-msgstr "·ÐÑÐàÐÝöæì ÒëÚÛîçíÝÝÕ"
-
-#: backends/platform/iphone/osys_events.cpp:300
-msgid "Mouse-click-and-drag mode enabled."
-msgstr "ÀíÖëÜ Üëèë ÝÐæöáÝãæì-ö-æïÓÝãæì ãÚÛîçÐÝë."
-
-#: backends/platform/iphone/osys_events.cpp:302
-msgid "Mouse-click-and-drag mode disabled."
-msgstr "ÀíÖëÜ Üëèë ÝÐæöáÝãæì-ö-æïÓÝãæì ÒëÚÛîçÐÝë."
-
-#: backends/platform/iphone/osys_events.cpp:313
-msgid "Touchpad mode enabled."
-msgstr "ÀíÖëÜ âÐçßÐÔÐ þÚÛîçÐÝë."
-
-#: backends/platform/iphone/osys_events.cpp:315
-msgid "Touchpad mode disabled."
-msgstr "ÀíÖëÜ âÐçßÐÔÐ ÒëÚÛîçÐÝë."
-
-#: backends/platform/maemo/maemo.cpp:209
-msgid "Click Mode"
-msgstr "ÀíÖëÜ ßáâàëçÚö"
-
-#: backends/platform/maemo/maemo.cpp:215
-#: 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/maemo/maemo.cpp:218
-msgid "Middle Click"
-msgstr "ÁïàíÔÝïï ßáâàëçÚÐ"
-
-#: backends/platform/maemo/maemo.cpp:221
-#: backends/platform/symbian/src/SymbianActions.cpp:43
-#: backends/platform/wince/CEActionsSmartphone.cpp:44
-#: backends/platform/bada/form.cpp:273
-msgid "Right Click"
-msgstr "¿àÐÒÐï ßáâàëçÚÐ"
-
-#: backends/platform/sdl/macosx/appmenu_osx.mm:77
-msgid "Hide ScummVM"
-msgstr "ÁåÐÒÐæì ScummVM"
-
-#: backends/platform/sdl/macosx/appmenu_osx.mm:82
-msgid "Hide Others"
-msgstr "ÁåÐÒÐæì ÐáâÐâÝöï"
-
-#: backends/platform/sdl/macosx/appmenu_osx.mm:87
-msgid "Show All"
-msgstr "¿ÐÚÐ×Ðæì ãáñ"
-
-#: backends/platform/sdl/macosx/appmenu_osx.mm:109
-#: backends/platform/sdl/macosx/appmenu_osx.mm:120
-msgid "Window"
-msgstr "°ÚÝÞ"
-
-#: backends/platform/sdl/macosx/appmenu_osx.mm:114
-msgid "Minimize"
-msgstr "¿àëÑàÐæì ã Dock"
-
-#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:45
-msgid "Normal (no scaling)"
-msgstr "±Õ× ßÐÒÕÛöçíÝÝï"
-
-#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:64
-msgctxt "lowres"
-msgid "Normal (no scaling)"
-msgstr "±Õ× ßÐÒÕÛöçíÝÝï"
-
-#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2135
-#: backends/graphics/openglsdl/openglsdl-graphics.cpp:537
-msgid "Enabled aspect ratio correction"
-msgstr "ºÐàíÚæëï áãÐÔÝÞáöÝ ÑÐÚÞþ ãÚÛîçÐÝÐ"
-
-#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2141
-#: backends/graphics/openglsdl/openglsdl-graphics.cpp:542
-msgid "Disabled aspect ratio correction"
-msgstr "ºÐàíÚæëï áãÐÔÝÞáöÝ ÑÐÚÞþ ÒëÚÛîçÐÝÐ"
-
-#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2196
-msgid "Active graphics filter:"
-msgstr "°ÚâëþÝë ÓàÐäöçÝë äöÛìâà:"
-
-#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2238
-#: backends/graphics/openglsdl/openglsdl-graphics.cpp:481
-msgid "Windowed mode"
-msgstr "°ÚÞÝÝë àíÖëÜ"
-
-#: backends/graphics/opengl/opengl-graphics.cpp:135
-msgid "OpenGL Normal"
-msgstr "OpenGL ÑÕ× ßÐÒÕÛöçíÝÝï"
-
-#: backends/graphics/opengl/opengl-graphics.cpp:136
-msgid "OpenGL Conserve"
-msgstr "OpenGL × ×ÐåÐÒÐÝÝÕÜ"
-
-#: backends/graphics/opengl/opengl-graphics.cpp:137
-msgid "OpenGL Original"
-msgstr "OpenGL ßÕàèÐßÐçÐâÚÞÒë"
-
-#: backends/graphics/openglsdl/openglsdl-graphics.cpp:415
-msgid "Current display mode"
-msgstr "±ïÓãçë ÒöÔíÐàíÖëÜ"
-
-#: backends/graphics/openglsdl/openglsdl-graphics.cpp:428
-msgid "Current scale"
-msgstr "±ïÓãçë ÜÐèâÐÑ"
-
-#: backends/graphics/openglsdl/openglsdl-graphics.cpp:562
-msgid "Active filter mode: Linear"
-msgstr "°ÚâëþÝë àíÖëÜ äöÛìâàÐ: »öÝÕÙÝë"
-
-#: backends/graphics/openglsdl/openglsdl-graphics.cpp:564
-msgid "Active filter mode: Nearest"
-msgstr "°ÚâëþÝë àíÖëÜ äöÛìâàÐ: ½ÐÙÑÛö×Úö"
-
-#: backends/platform/symbian/src/SymbianActions.cpp:38
-#: backends/platform/wince/CEActionsSmartphone.cpp:39
-msgid "Up"
-msgstr "ÃÒÕàå"
-
-#: backends/platform/symbian/src/SymbianActions.cpp:39
-#: backends/platform/wince/CEActionsSmartphone.cpp:40
-msgid "Down"
-msgstr "ÃÝö×"
-
-#: backends/platform/symbian/src/SymbianActions.cpp:40
-#: backends/platform/wince/CEActionsSmartphone.cpp:41
-msgid "Left"
-msgstr "½ÐÛÕÒÐ"
-
-#: backends/platform/symbian/src/SymbianActions.cpp:41
-#: backends/platform/wince/CEActionsSmartphone.cpp:42
-msgid "Right"
-msgstr "½ÐßàÐÒÐ"
-
-#: backends/platform/symbian/src/SymbianActions.cpp:46
-#: backends/platform/wince/CEActionsSmartphone.cpp:47
-msgid "Zone"
-msgstr "·ÞÝÐ"
-
-#: backends/platform/symbian/src/SymbianActions.cpp:47
-#: backends/platform/wince/CEActionsPocket.cpp:54
-#: backends/platform/wince/CEActionsSmartphone.cpp:48
-msgid "Multi Function"
-msgstr "¼ãÛìâëäãÝÚæëï"
-
-#: backends/platform/symbian/src/SymbianActions.cpp:48
-msgid "Swap character"
-msgstr "·ÜïÝöæì ÓÕàÞï"
-
-#: backends/platform/symbian/src/SymbianActions.cpp:49
-msgid "Skip text"
-msgstr "¿àÐßãáæöæì âíÚáâ"
-
-#: backends/platform/symbian/src/SymbianActions.cpp:51
-msgid "Fast mode"
-msgstr "ÅãâÚö àíÖëÜ"
-
-#: backends/platform/symbian/src/SymbianActions.cpp:53
-msgid "Debugger"
-msgstr "°ÔÛÐÔçëÚ"
-
-#: backends/platform/symbian/src/SymbianActions.cpp:54
-msgid "Global menu"
-msgstr "³ÛÐÑÐÛìÝÐÕ ÜÕÝî"
-
-#: backends/platform/symbian/src/SymbianActions.cpp:55
-msgid "Virtual keyboard"
-msgstr "²öàâãÐÛìÝÐï ÚÛÐÒöïâãàÐ"
-
-#: backends/platform/symbian/src/SymbianActions.cpp:56
-msgid "Key mapper"
-msgstr "¿àë×ÝÐçíÝÝÕ ÚÛÐÒöè"
-
-#: backends/events/symbiansdl/symbiansdl-events.cpp:184
-msgid "Do you want to quit ?"
-msgstr "²ë áÐßàÐþÔë ÖÐÔÐÕæÕ ÒëÙáæö?"
-
-#: backends/platform/wii/options.cpp:51
-msgid "Video"
-msgstr "²öÔíÐ"
-
-#: backends/platform/wii/options.cpp:54
-msgid "Current video mode:"
-msgstr "±ïÓãçë ÒöÔíÐàíÖëÜ:"
-
-#: backends/platform/wii/options.cpp:56
-msgid "Double-strike"
-msgstr "´ÒÐÙÝë þÔÐà"
-
-#: backends/platform/wii/options.cpp:60
-msgid "Horizontal underscan:"
-msgstr "³Ðàë×ÐÝâÐÛìÝë underscan:"
-
-#: backends/platform/wii/options.cpp:66
-msgid "Vertical underscan:"
-msgstr "²ÕàâëÚÐÛìÝë underscan:"
-
-#: backends/platform/wii/options.cpp:71
-msgid "Input"
-msgstr "ÃÒÞÔ"
-
-#: backends/platform/wii/options.cpp:74
-msgid "GC Pad sensitivity:"
-msgstr "°ÔçãÒÐÛìÝÐáæì GC ßÐÔÐ:"
-
-#: backends/platform/wii/options.cpp:80
-msgid "GC Pad acceleration:"
-msgstr "¿ÐáÚÐàíÝÝÕ GC ßÐÔÐ:"
-
-#: backends/platform/wii/options.cpp:86
-msgid "DVD"
-msgstr "DVD"
-
-#: backends/platform/wii/options.cpp:89 backends/platform/wii/options.cpp:101
-msgid "Status:"
-msgstr "ÁâÐÝ:"
-
-#: backends/platform/wii/options.cpp:90 backends/platform/wii/options.cpp:102
-msgid "Unknown"
-msgstr "½ÕÒïÔÞÜÐ"
-
-#: backends/platform/wii/options.cpp:93
-msgid "Mount DVD"
-msgstr "¿ÐÔÚÛîçëæì DVD"
-
-#: backends/platform/wii/options.cpp:94
-msgid "Unmount DVD"
-msgstr "°ÔÚÛîçëæì DVD"
-
-#: backends/platform/wii/options.cpp:98
-msgid "SMB"
-msgstr "SMB"
-
-#: backends/platform/wii/options.cpp:106
-msgid "Server:"
-msgstr "ÁÕàÒÕà:"
-
-#: backends/platform/wii/options.cpp:110
-msgid "Share:"
-msgstr "ÁÕâÚÐÒÐï âíçÚÐ:"
-
-#: backends/platform/wii/options.cpp:114
-msgid "Username:"
-msgstr "ºÐàëáâÐç:"
-
-#: backends/platform/wii/options.cpp:118
-msgid "Password:"
-msgstr "¿ÐàÞÛì:"
-
-#: backends/platform/wii/options.cpp:121
-msgid "Init network"
-msgstr "¦ÝöæëïÛö×Ðæëï áÕâÚö"
-
-#: backends/platform/wii/options.cpp:123
-msgid "Mount SMB"
-msgstr "¿ÐÔÚÛîçëæì SMB"
-
-#: backends/platform/wii/options.cpp:124
-msgid "Unmount SMB"
-msgstr "°ÔÚÛîçëæì SMB"
-
-#: backends/platform/wii/options.cpp:143
-msgid "DVD Mounted successfully"
-msgstr "DVD ßÐÔÚÛîçÐÝë ßÐáßïåÞÒÐ"
-
-#: backends/platform/wii/options.cpp:146
-msgid "Error while mounting the DVD"
-msgstr "¿ÐÜëÛÚÐ ßàë ßÐÔÚÛîçíÝÝö DVD"
-
-#: backends/platform/wii/options.cpp:148
-msgid "DVD not mounted"
-msgstr "DVD ÝÕ ßÐÔÚÛîçÐÝë"
-
-#: backends/platform/wii/options.cpp:161
-msgid "Network up, share mounted"
-msgstr "ÁÕâÚÐ ßàÐæãÕ, âíçÚÐ ßÐÔÚÛîçÐÝÐ"
-
-#: backends/platform/wii/options.cpp:163
-msgid "Network up"
-msgstr "ÁÕâÚÐ ßàÐæãÕ"
-
-#: backends/platform/wii/options.cpp:166
-msgid ", error while mounting the share"
-msgstr ", ßÐÜëÛÚÐ ßàë ßÐÔÚÛîçíÝÝö âíçÚö"
-
-#: backends/platform/wii/options.cpp:168
-msgid ", share not mounted"
-msgstr ", âíçÚÐ ÝÕ ßÐÔÚÛîçÐÝÐ"
-
-#: backends/platform/wii/options.cpp:174
-msgid "Network down"
-msgstr "ÁÕâÚÐ ÒëÚÛîçÐÝÐ"
-
-#: backends/platform/wii/options.cpp:178
-msgid "Initializing network"
-msgstr "½ÐÛÐÔÖÒÐî áÕâÚã"
-
-#: backends/platform/wii/options.cpp:182
-msgid "Timeout while initializing network"
-msgstr "ÇÐá ßÐÔÚÛîçíÝÝï ÔÐ áÕâÚö ÜöÝãþ"
-
-#: backends/platform/wii/options.cpp:186
-#, c-format
-msgid "Network not initialized (%d)"
-msgstr "ÁÕâÚÐ ÝÕ ÝÐÛÐÔ×öÛÐáï (%d)"
-
-#: backends/platform/wince/CEActionsPocket.cpp:46
-msgid "Hide Toolbar"
-msgstr "ÁåÐÒÐæì ßÐÝíÛì öÝáâàãÜÕÝâÐþ"
-
-#: backends/platform/wince/CEActionsPocket.cpp:47
-msgid "Show Keyboard"
-msgstr "¿ÐÚÐ×Ðæì ÚÛÐÒöïâãàã"
-
-#: backends/platform/wince/CEActionsPocket.cpp:48
-msgid "Sound on/off"
-msgstr "³ãÚ ãÚÛ/ÒëÚÛ"
-
-#: backends/platform/wince/CEActionsPocket.cpp:49
-msgid "Right click"
-msgstr "¿àÐÒÐï ßáâàëçÚÐ"
-
-#: backends/platform/wince/CEActionsPocket.cpp:50
-msgid "Show/Hide Cursor"
-msgstr "¿ÐÚÐ×Ðæì/¿àëÑàÐæì ÚãàáÞà"
-
-#: backends/platform/wince/CEActionsPocket.cpp:51
-msgid "Free look"
-msgstr "²ÞÛìÝë ÐÓÛïÔ"
-
-#: backends/platform/wince/CEActionsPocket.cpp:52
-msgid "Zoom up"
-msgstr "¿ÐÒïÛ. ÜÐèâÐÑ"
-
-#: backends/platform/wince/CEActionsPocket.cpp:53
-msgid "Zoom down"
-msgstr "¿ÐÜÕÝè. ÜÐèâÐÑ"
-
-#: backends/platform/wince/CEActionsPocket.cpp:55
-#: backends/platform/wince/CEActionsSmartphone.cpp:49
-msgid "Bind Keys"
-msgstr "¿àë×ÝÐçëæì ÚÛÐÒöèë"
-
-#: backends/platform/wince/CEActionsPocket.cpp:56
-msgid "Cursor Up"
-msgstr "ºãàáÞà ãÒÕàå"
-
-#: backends/platform/wince/CEActionsPocket.cpp:57
-msgid "Cursor Down"
-msgstr "ºãàáÞà ãÝö×"
-
-#: backends/platform/wince/CEActionsPocket.cpp:58
-msgid "Cursor Left"
-msgstr "ºãàáÞà ÝÐÛÕÒÐ"
-
-#: backends/platform/wince/CEActionsPocket.cpp:59
-msgid "Cursor Right"
-msgstr "ºãàáÞà ÝÐßàÐÒÐ"
-
-#: 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:326
-#: backends/platform/wince/CEActionsSmartphone.cpp:287
-msgid " Are you sure you want to quit ? "
-msgstr " ²ë þßíþÝÕÝë, èâÞ ÖÐÔÐÕæÕ ÒëÙáæö? "
-
-#: backends/platform/wince/CEActionsSmartphone.cpp:50
-msgid "Keyboard"
-msgstr "ºÛÐÒöïâãàÐ"
-
-#: backends/platform/wince/CEActionsSmartphone.cpp:51
-msgid "Rotate"
-msgstr "¿ÐÒïàÝãæì"
-
-#: backends/platform/wince/CELauncherDialog.cpp:56
-msgid "Using SDL driver "
-msgstr "²ëÚÐàëáâÞþÒÐî ÔàÐÙÒÕà SDL "
-
-#: backends/platform/wince/CELauncherDialog.cpp:60
-msgid "Display "
-msgstr "¿ÐÚÐ×Ðæì "
-
-#: backends/platform/wince/CELauncherDialog.cpp:83
-msgid "Do you want to perform an automatic scan ?"
-msgstr "²ë ÖÐÔÐÕæÕ ×àÐÑöæì ÐþâÐÜÐâëçÝë ßÞèãÚ?"
-
-#: backends/platform/wince/wince-sdl.cpp:515
-msgid "Map right click action"
-msgstr "¿àë×ÝÐçëæì Ô×ÕïÝÝÕ ßÐ ßàÐÒÐÙ ßáâàëçæë"
-
-#: 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:528
-msgid "Map hide toolbar action"
-msgstr "¿àë×ÝÐçëæì Ô×ÕïÝÝÕ 'áåÐÒÐæì ßÐÝíÛì öÝáâàãÜÕÝâÐþ'"
-
-#: 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:541
-msgid "Map Zoom Up action (optional)"
-msgstr "¿àë×ÝÐçëæì Ô×ÕïÝÝÕ ¿ÐÒïÛöçëæì ¼ÐèâÐÑ (ÝÕÐÑÐÒï×ÚÞÒÐ)"
-
-#: backends/platform/wince/wince-sdl.cpp:544
-msgid "Map Zoom Down action (optional)"
-msgstr "¿àë×ÝÐçëæì Ô×ÕïÝÝÕ ¿ÐÜÕÝèëæì ¼ÐèâÐÑ (ÝÕÐÑÐÒï×ÚÞÒÐ)"
-
-#: 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 ""
-"½Õ ×ÐÑãÔ×ìæÕáï ßàë×ÝÐçëæì ÚÛÐÒöèã ÔÛï Ô×ÕïÝÝï 'Hide Toolbar', ÚÐÑ ãÑÐçëæì "
-"ãÒÕáì öÝÒÕÝâÐà ã ÓãÛìÝö"
-
-#: backends/events/default/default-events.cpp:193
-msgid "Do you really want to return to the Launcher?"
-msgstr "²ë áÐßàÐþÔë ÖÐÔÐÕæÕ ÒïàÝãææÐ þ ÓÐÛÞþÝÐÕ ÜÕÝî?"
-
-#: backends/events/default/default-events.cpp:193
-msgid "Launcher"
-msgstr "³ÐÛÞþÝÐÕ ÜÕÝî"
-
-#: backends/events/default/default-events.cpp:215
-msgid "Do you really want to quit?"
-msgstr "²ë áÐßàÐþÔë ÖÐÔÐÕæÕ ÒëÙáæö?"
-
-#: backends/events/gph/gph-events.cpp:386
-#: backends/events/gph/gph-events.cpp:429
-#: backends/events/openpandora/op-events.cpp:168
-msgid "Touchscreen 'Tap Mode' - Left Click"
-msgstr "ÀíÖëÜ 'ÔÞâëÚÐþ' âÐçáÚàëÝÐ - »ÕÒë ÚÛöÚ"
-
-#: backends/events/gph/gph-events.cpp:388
-#: backends/events/gph/gph-events.cpp:431
-#: backends/events/openpandora/op-events.cpp:170
-msgid "Touchscreen 'Tap Mode' - Right Click"
-msgstr "ÀíÖëÜ 'ÔÞâëÚÐþ' âÐçáÚàëÝÐ - ¿àÐÒë ÚÛöÚ"
-
-#: backends/events/gph/gph-events.cpp:390
-#: backends/events/gph/gph-events.cpp:433
-#: backends/events/openpandora/op-events.cpp:172
-msgid "Touchscreen 'Tap Mode' - Hover (No Click)"
-msgstr "ÀíÖëÜ 'ÔÞâëÚÐþ' âÐçáÚàëÝÐ - ¿àÐÛñâ (ÑÕ× ÚÛöÚã)"
-
-#: backends/events/gph/gph-events.cpp:410
-msgid "Maximum Volume"
-msgstr "¼ÐÚáöÜÐÛìÝÐï ÓãçÝÐáæì"
+#~ msgctxt "lowres"
+#~ msgid "Mass Add..."
+#~ msgstr "ÈÜÐâ ÓãÛìÝïþ..."
-#: backends/events/gph/gph-events.cpp:412
-msgid "Increasing Volume"
-msgstr "¿ÐÒÕÛöçíÝÝÕ ÓãçÝÐáæö"
+#~ msgid "Mass Add..."
+#~ msgstr "ÈÜÐâ ÓãÛìÝïþ..."
-#: backends/events/gph/gph-events.cpp:418
-msgid "Minimal Volume"
-msgstr "¼öÝöÜÐÛìÝÐï ÓãçÝÐáæì"
+#~ msgid ""
+#~ "Turns off General MIDI mapping for games with Roland MT-32 soundtrack"
+#~ msgstr ""
+#~ "²ëÚÛîçÐÕ áãßÐáâÐþÛÕÝÝÕ General MIDI ÔÛï ÓãÛìÝïþ × ÓãÚÐÒÞÙ ÔÐàÞÖÚÐÙ ÔÛï "
+#~ "Roland MT-32"
-#: backends/events/gph/gph-events.cpp:420
-msgid "Decreasing Volume"
-msgstr "¿ÐÜïÝèíÝÝÕ ÓãçÝÐáæö"
+#~ msgid "Standard (16bpp)"
+#~ msgstr "ÁâÐÝÔÐàâÝë àÐáâÐàë×ÐâÐà (16bpp)"
-#: backends/events/openpandora/op-events.cpp:174
-msgid "Touchscreen 'Tap Mode' - Hover (DPad Clicks)"
-msgstr "ÀíÖëÜ 'ÔÞâëÚÐþ' âÐçáÚàëÝÐ - ¿àÐÛñâ (ÚÛöÚö ßÐ DPad)"
+#~ msgid "Alternative intro"
+#~ msgstr "°ÛìâíàÝÐâëþÝë þáâãß"
-#: backends/updates/macosx/macosx-updates.mm:67
-msgid "Check for Updates..."
-msgstr "¿àÐÒïàÐî ÐÑÝÐþÛÕÝÝö..."
+#~ msgid "Use an alternative game intro (CD version only)"
+#~ msgstr "²ëÚÐàëáâÞþÒÐæì ÐÛìâíàÝÐâëþÝë þáâãß (âÞÛìÚö ÔÛï CD ÒÕàáöö ÓãÛìÝö)"
-#: backends/platform/bada/form.cpp:269
-msgid "Right Click Once"
-msgstr "°ÔÝÐ ßàÐÒÐï ßáâàëçÚÐ"
+#~ msgid "MPEG2 cutscenes are no longer supported"
+#~ msgstr "·ÐáâÐþÚö þ äÐàÜÐæÕ MPEG2 ÑÞÛìè ÝÕ ßÐÔâàëÜÛöÒÐîææÐ"
-#: backends/platform/bada/form.cpp:277
-msgid "Move Only"
-msgstr "ÂÞÛìÚö ßÕàÐÜïáæöæì"
+#~ msgid "OpenGL Normal"
+#~ msgstr "OpenGL ÑÕ× ßÐÒÕÛöçíÝÝï"
-#: backends/platform/bada/form.cpp:291
-msgid "Escape Key"
-msgstr "ºÛÐÒöèÐ ESC"
+#~ msgid "OpenGL Conserve"
+#~ msgstr "OpenGL × ×ÐåÐÒÐÝÝÕÜ"
-#: backends/platform/bada/form.cpp:296
-msgid "Game Menu"
-msgstr "¼ÕÝî ÓãÛìÝö"
+#~ msgid "OpenGL Original"
+#~ msgstr "OpenGL ßÕàèÐßÐçÐâÚÞÒë"
-#: backends/platform/bada/form.cpp:301
-msgid "Show Keypad"
-msgstr "¿ÐÚÐ×Ðæì ÚÛÐÒöïâãàã"
+#~ msgid "Current display mode"
+#~ msgstr "±ïÓãçë ÒöÔíÐàíÖëÜ"
-#: backends/platform/bada/form.cpp:309
-msgid "Control Mouse"
-msgstr "ºöàÐÒÐÝÝÕ Üëèèã"
+#~ msgid "Current scale"
+#~ msgstr "±ïÓãçë ÜÐèâÐÑ"
-#: backends/events/maemosdl/maemosdl-events.cpp:192
-msgid "Clicking Enabled"
-msgstr "¿áâàëçÚö þÚÛîçÐÝë"
+#~ msgid "Active filter mode: Linear"
+#~ msgstr "°ÚâëþÝë àíÖëÜ äöÛìâàÐ: »öÝÕÙÝë"
-#: backends/events/maemosdl/maemosdl-events.cpp:192
-msgid "Clicking Disabled"
-msgstr "¿áâàëçÚö ÒëÚÛîçÐÝë"
+#~ msgid "Active filter mode: Nearest"
+#~ msgstr "°ÚâëþÝë àíÖëÜ äöÛìâàÐ: ½ÐÙÑÛö×Úö"
#~ msgid "Enable Roland GS Mode"
#~ msgstr "ÃÚÛîçëæì àíÖëÜ Roland GS"
diff --git a/po/ca_ES.po b/po/ca_ES.po
index f201be5cba..498ad386b7 100644
--- a/po/ca_ES.po
+++ b/po/ca_ES.po
@@ -1,5 +1,5 @@
# Catalan translation for ScummVM.
-# Copyright (C) 2007-2013 ScummVM Team
+# Copyright (C) 2007-2014 ScummVM Team
# This file is distributed under the same license as the ScummVM package.
# Jordi Vilalta Prat <jvprat@jvprat.com>, 2007-2011.
#
@@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: ScummVM 1.6.0git\n"
"Report-Msgid-Bugs-To: scummvm-devel@lists.sf.net\n"
-"POT-Creation-Date: 2013-04-24 13:35+0100\n"
+"POT-Creation-Date: 2014-06-07 23:06+0100\n"
"PO-Revision-Date: 2013-05-05 14:16+0100\n"
"Last-Translator: Jordi Vilalta Prat <jvprat@jvprat.com>\n"
"Language-Team: Catalan <scummvm-devel@lists.sf.net>\n"
@@ -16,77 +16,77 @@ msgstr ""
"Content-Type: text/plain; charset=iso-8859-1\n"
"Content-Transfer-Encoding: 8bit\n"
-#: gui/about.cpp:93
+#: gui/about.cpp:94
#, c-format
msgid "(built on %s)"
msgstr "(compilat el %s)"
-#: gui/about.cpp:100
+#: gui/about.cpp:101
msgid "Features compiled in:"
msgstr "Característiques compilades:"
-#: gui/about.cpp:109
+#: gui/about.cpp:110
msgid "Available engines:"
msgstr "Motors disponibles:"
-#: gui/browser.cpp:67
+#: gui/browser.cpp:68
msgid "Show hidden files"
msgstr "Mostra els fitxers ocults"
-#: gui/browser.cpp:67
+#: gui/browser.cpp:68
msgid "Show files marked with the hidden attribute"
msgstr "Mostra els fitxers marcats amb l'atribut d'ocultació"
-#: gui/browser.cpp:71
+#: gui/browser.cpp:72
msgid "Go up"
msgstr "Amunt"
-#: gui/browser.cpp:71 gui/browser.cpp:73
+#: gui/browser.cpp:72 gui/browser.cpp:74
msgid "Go to previous directory level"
msgstr "Torna al nivell de directoris anterior"
-#: gui/browser.cpp:73
+#: gui/browser.cpp:74
msgctxt "lowres"
msgid "Go up"
msgstr "Amunt"
-#: gui/browser.cpp:74 gui/chooser.cpp:45 gui/KeysDialog.cpp:43
-#: gui/launcher.cpp:345 gui/massadd.cpp:94 gui/options.cpp:1238
-#: gui/saveload-dialog.cpp:215 gui/saveload-dialog.cpp:275
-#: gui/saveload-dialog.cpp:545 gui/saveload-dialog.cpp:919
-#: gui/themebrowser.cpp:54 gui/fluidsynth-dialog.cpp:151
-#: engines/engine.cpp:447 engines/drascula/saveload.cpp:49
-#: engines/scumm/dialogs.cpp:190 engines/sword1/control.cpp:865
-#: engines/parallaction/saveload.cpp:274 backends/platform/wii/options.cpp:48
-#: backends/events/default/default-events.cpp:193
-#: backends/events/default/default-events.cpp:215
+#: gui/browser.cpp:75 gui/chooser.cpp:46 gui/KeysDialog.cpp:43
+#: gui/launcher.cpp:351 gui/massadd.cpp:95 gui/options.cpp:1239
+#: gui/saveload-dialog.cpp:216 gui/saveload-dialog.cpp:276
+#: gui/saveload-dialog.cpp:547 gui/saveload-dialog.cpp:922
+#: gui/themebrowser.cpp:55 gui/fluidsynth-dialog.cpp:152
+#: engines/engine.cpp:452 backends/platform/wii/options.cpp:48
+#: backends/events/default/default-events.cpp:196
+#: backends/events/default/default-events.cpp:218
+#: engines/drascula/saveload.cpp:49 engines/parallaction/saveload.cpp:274
+#: engines/scumm/dialogs.cpp:191 engines/sword1/control.cpp:865
msgid "Cancel"
msgstr "Cancel·la"
-#: gui/browser.cpp:75 gui/chooser.cpp:46 gui/themebrowser.cpp:55
+#: gui/browser.cpp:76 gui/chooser.cpp:47 gui/themebrowser.cpp:56
msgid "Choose"
msgstr "Escull"
-#: gui/gui-manager.cpp:115 engines/scumm/help.cpp:125
-#: engines/scumm/help.cpp:140 engines/scumm/help.cpp:165
-#: engines/scumm/help.cpp:191 engines/scumm/help.cpp:209
-#: backends/keymapper/remap-dialog.cpp:52
+#: gui/gui-manager.cpp:117 backends/keymapper/remap-dialog.cpp:53
+#: engines/scumm/help.cpp:125 engines/scumm/help.cpp:140
+#: engines/scumm/help.cpp:165 engines/scumm/help.cpp:191
+#: engines/scumm/help.cpp:209
msgid "Close"
msgstr "Tanca"
-#: gui/gui-manager.cpp:118
+#: gui/gui-manager.cpp:120
msgid "Mouse click"
msgstr "Clic del ratolí"
-#: gui/gui-manager.cpp:122 base/main.cpp:301
+#: gui/gui-manager.cpp:124 base/main.cpp:319
msgid "Display keyboard"
msgstr "Mostra el teclat"
-#: gui/gui-manager.cpp:126 base/main.cpp:305
+#: gui/gui-manager.cpp:128 base/main.cpp:323
msgid "Remap keys"
msgstr "Assigna les tecles"
-#: gui/gui-manager.cpp:129 base/main.cpp:308
+#: gui/gui-manager.cpp:131 base/main.cpp:326
msgid "Toggle FullScreen"
msgstr "Commuta la pantalla completa"
@@ -98,21 +98,21 @@ msgstr "Sel·leccioneu una acció a assignar"
msgid "Map"
msgstr "Assigna"
-#: gui/KeysDialog.cpp:42 gui/launcher.cpp:346 gui/launcher.cpp:1001
-#: gui/launcher.cpp:1005 gui/massadd.cpp:91 gui/options.cpp:1239
-#: gui/saveload-dialog.cpp:920 gui/fluidsynth-dialog.cpp:152
-#: engines/engine.cpp:366 engines/engine.cpp:377
-#: engines/drascula/saveload.cpp:49 engines/scumm/dialogs.cpp:192
-#: engines/scumm/scumm.cpp:1778 engines/agos/animation.cpp:558
-#: engines/groovie/script.cpp:420 engines/sky/compact.cpp:131
-#: engines/sky/compact.cpp:141 engines/sword1/animation.cpp:519
-#: engines/sword1/animation.cpp:540 engines/sword1/animation.cpp:550
-#: engines/sword1/animation.cpp:557 engines/sword1/control.cpp:865
-#: engines/sword1/logic.cpp:1633 engines/sword2/animation.cpp:419
-#: engines/sword2/animation.cpp:439 engines/sword2/animation.cpp:449
-#: engines/sword2/animation.cpp:458 engines/parallaction/saveload.cpp:274
+#: gui/KeysDialog.cpp:42 gui/launcher.cpp:352 gui/launcher.cpp:1048
+#: gui/launcher.cpp:1052 gui/massadd.cpp:92 gui/options.cpp:1240
+#: gui/saveload-dialog.cpp:923 gui/fluidsynth-dialog.cpp:153
+#: engines/engine.cpp:371 engines/engine.cpp:382
#: backends/platform/wii/options.cpp:47
#: backends/platform/wince/CELauncherDialog.cpp:54
+#: engines/agos/animation.cpp:558 engines/drascula/saveload.cpp:49
+#: engines/groovie/script.cpp:399 engines/parallaction/saveload.cpp:274
+#: engines/scumm/dialogs.cpp:193 engines/scumm/scumm.cpp:1779
+#: engines/sky/compact.cpp:131 engines/sky/compact.cpp:141
+#: engines/sword1/animation.cpp:524 engines/sword1/animation.cpp:545
+#: engines/sword1/animation.cpp:561 engines/sword1/animation.cpp:569
+#: engines/sword1/control.cpp:865 engines/sword1/logic.cpp:1633
+#: engines/sword2/animation.cpp:425 engines/sword2/animation.cpp:445
+#: engines/sword2/animation.cpp:461 engines/sword2/animation.cpp:471
msgid "OK"
msgstr "D'acord"
@@ -138,15 +138,15 @@ msgstr "Seleccioneu una acció"
msgid "Press the key to associate"
msgstr "Premeu la tecla a associar"
-#: gui/launcher.cpp:187
+#: gui/launcher.cpp:193
msgid "Game"
msgstr "Joc"
-#: gui/launcher.cpp:191
+#: gui/launcher.cpp:197
msgid "ID:"
msgstr "Identificador:"
-#: gui/launcher.cpp:191 gui/launcher.cpp:193 gui/launcher.cpp:194
+#: gui/launcher.cpp:197 gui/launcher.cpp:199 gui/launcher.cpp:200
msgid ""
"Short game identifier used for referring to savegames and running the game "
"from the command line"
@@ -154,29 +154,29 @@ msgstr ""
"Identificador de joc curt utilitzat per referir-se a les partides i per "
"executar el joc des de la línia de comandes"
-#: gui/launcher.cpp:193
+#: gui/launcher.cpp:199
msgctxt "lowres"
msgid "ID:"
msgstr "ID:"
-#: gui/launcher.cpp:198
+#: gui/launcher.cpp:204
msgid "Name:"
msgstr "Nom:"
-#: gui/launcher.cpp:198 gui/launcher.cpp:200 gui/launcher.cpp:201
+#: gui/launcher.cpp:204 gui/launcher.cpp:206 gui/launcher.cpp:207
msgid "Full title of the game"
msgstr "Títol complet del joc"
-#: gui/launcher.cpp:200
+#: gui/launcher.cpp:206
msgctxt "lowres"
msgid "Name:"
msgstr "Nom:"
-#: gui/launcher.cpp:204
+#: gui/launcher.cpp:210
msgid "Language:"
msgstr "Idioma:"
-#: gui/launcher.cpp:204 gui/launcher.cpp:205
+#: gui/launcher.cpp:210 gui/launcher.cpp:211
msgid ""
"Language of the game. This will not turn your Spanish game version into "
"English"
@@ -184,289 +184,290 @@ msgstr ""
"Idioma del joc. Això no convertirà la vostra versió Espanyola del joc a "
"Anglès"
-#: gui/launcher.cpp:206 gui/launcher.cpp:220 gui/options.cpp:86
-#: gui/options.cpp:736 gui/options.cpp:749 gui/options.cpp:1209
-#: audio/null.cpp:40
+#: gui/launcher.cpp:212 gui/launcher.cpp:226 gui/options.cpp:87
+#: gui/options.cpp:737 gui/options.cpp:750 gui/options.cpp:1210
+#: audio/null.cpp:41
msgid "<default>"
msgstr "<per defecte>"
-#: gui/launcher.cpp:216
+#: gui/launcher.cpp:222
msgid "Platform:"
msgstr "Plataforma:"
-#: gui/launcher.cpp:216 gui/launcher.cpp:218 gui/launcher.cpp:219
+#: gui/launcher.cpp:222 gui/launcher.cpp:224 gui/launcher.cpp:225
msgid "Platform the game was originally designed for"
msgstr "Plataforma per la que el joc es va dissenyar originalment"
-#: gui/launcher.cpp:218
+#: gui/launcher.cpp:224
msgctxt "lowres"
msgid "Platform:"
msgstr "Platafor.:"
-#: gui/launcher.cpp:231
+#: gui/launcher.cpp:237
msgid "Engine"
msgstr "Motor"
-#: gui/launcher.cpp:239 gui/options.cpp:1072 gui/options.cpp:1089
+#: gui/launcher.cpp:245 gui/options.cpp:1073 gui/options.cpp:1090
msgid "Graphics"
msgstr "Gràfics"
-#: gui/launcher.cpp:239 gui/options.cpp:1072 gui/options.cpp:1089
+#: gui/launcher.cpp:245 gui/options.cpp:1073 gui/options.cpp:1090
msgid "GFX"
msgstr "GFX"
-#: gui/launcher.cpp:242
+#: gui/launcher.cpp:248
msgid "Override global graphic settings"
msgstr "Fer canvis sobre les opcions globals de gràfics"
-#: gui/launcher.cpp:244
+#: gui/launcher.cpp:250
msgctxt "lowres"
msgid "Override global graphic settings"
msgstr "Canviar les opcions de gràfics"
-#: gui/launcher.cpp:251 gui/options.cpp:1095
+#: gui/launcher.cpp:257 gui/options.cpp:1096
msgid "Audio"
msgstr "Àudio"
-#: gui/launcher.cpp:254
+#: gui/launcher.cpp:260
msgid "Override global audio settings"
msgstr "Fer canvis sobre les opcions globals d'àudio"
-#: gui/launcher.cpp:256
+#: gui/launcher.cpp:262
msgctxt "lowres"
msgid "Override global audio settings"
msgstr "Canviar les opcions d'àudio"
-#: gui/launcher.cpp:265 gui/options.cpp:1100
+#: gui/launcher.cpp:271 gui/options.cpp:1101
msgid "Volume"
msgstr "Volum"
-#: gui/launcher.cpp:267 gui/options.cpp:1102
+#: gui/launcher.cpp:273 gui/options.cpp:1103
msgctxt "lowres"
msgid "Volume"
msgstr "Volum"
-#: gui/launcher.cpp:270
+#: gui/launcher.cpp:276
msgid "Override global volume settings"
msgstr "Fer canvis sobre les opcions globals de volum"
-#: gui/launcher.cpp:272
+#: gui/launcher.cpp:278
msgctxt "lowres"
msgid "Override global volume settings"
msgstr "Canviar les opcions de volum"
-#: gui/launcher.cpp:280 gui/options.cpp:1110
+#: gui/launcher.cpp:286 gui/options.cpp:1111
msgid "MIDI"
msgstr "MIDI"
-#: gui/launcher.cpp:283
+#: gui/launcher.cpp:289
msgid "Override global MIDI settings"
msgstr "Fer canvis sobre les opcions globals de MIDI"
-#: gui/launcher.cpp:285
+#: gui/launcher.cpp:291
msgctxt "lowres"
msgid "Override global MIDI settings"
msgstr "Canviar les opcions de MIDI"
-#: gui/launcher.cpp:294 gui/options.cpp:1116
+#: gui/launcher.cpp:300 gui/options.cpp:1117
msgid "MT-32"
msgstr "MT-32"
-#: gui/launcher.cpp:297
+#: gui/launcher.cpp:303
msgid "Override global MT-32 settings"
msgstr "Fer canvis sobre les opcions globals de MT-32"
-#: gui/launcher.cpp:299
+#: gui/launcher.cpp:305
msgctxt "lowres"
msgid "Override global MT-32 settings"
msgstr "Canviar les opcions de MT-32"
-#: gui/launcher.cpp:308 gui/options.cpp:1123
+#: gui/launcher.cpp:314 gui/options.cpp:1124
msgid "Paths"
msgstr "Camins"
-#: gui/launcher.cpp:310 gui/options.cpp:1125
+#: gui/launcher.cpp:316 gui/options.cpp:1126
msgctxt "lowres"
msgid "Paths"
msgstr "Camins"
-#: gui/launcher.cpp:317
+#: gui/launcher.cpp:323
msgid "Game Path:"
msgstr "Camí del joc:"
-#: gui/launcher.cpp:319
+#: gui/launcher.cpp:325
msgctxt "lowres"
msgid "Game Path:"
msgstr "Camí joc:"
-#: gui/launcher.cpp:324 gui/options.cpp:1149
+#: gui/launcher.cpp:330 gui/options.cpp:1150
msgid "Extra Path:"
msgstr "Camí extra:"
-#: gui/launcher.cpp:324 gui/launcher.cpp:326 gui/launcher.cpp:327
+#: gui/launcher.cpp:330 gui/launcher.cpp:332 gui/launcher.cpp:333
msgid "Specifies path to additional data used the game"
msgstr "Especifica el camí de dades addicionals utilitzades pel joc"
-#: gui/launcher.cpp:326 gui/options.cpp:1151
+#: gui/launcher.cpp:332 gui/options.cpp:1152
msgctxt "lowres"
msgid "Extra Path:"
msgstr "Camí extra:"
-#: gui/launcher.cpp:333 gui/options.cpp:1133
+#: gui/launcher.cpp:339 gui/options.cpp:1134
msgid "Save Path:"
msgstr "Camí de partides:"
-#: gui/launcher.cpp:333 gui/launcher.cpp:335 gui/launcher.cpp:336
-#: gui/options.cpp:1133 gui/options.cpp:1135 gui/options.cpp:1136
+#: gui/launcher.cpp:339 gui/launcher.cpp:341 gui/launcher.cpp:342
+#: gui/options.cpp:1134 gui/options.cpp:1136 gui/options.cpp:1137
msgid "Specifies where your savegames are put"
msgstr "Especifica on es desaran les partides"
-#: gui/launcher.cpp:335 gui/options.cpp:1135
+#: gui/launcher.cpp:341 gui/options.cpp:1136
msgctxt "lowres"
msgid "Save Path:"
msgstr "Partides:"
-#: gui/launcher.cpp:354 gui/launcher.cpp:453 gui/launcher.cpp:511
-#: gui/launcher.cpp:565 gui/options.cpp:1144 gui/options.cpp:1152
-#: gui/options.cpp:1161 gui/options.cpp:1276 gui/options.cpp:1282
-#: gui/options.cpp:1290 gui/options.cpp:1320 gui/options.cpp:1326
-#: gui/options.cpp:1333 gui/options.cpp:1426 gui/options.cpp:1429
-#: gui/options.cpp:1441
+#: gui/launcher.cpp:360 gui/launcher.cpp:459 gui/launcher.cpp:517
+#: gui/launcher.cpp:571 gui/options.cpp:1145 gui/options.cpp:1153
+#: gui/options.cpp:1162 gui/options.cpp:1277 gui/options.cpp:1283
+#: gui/options.cpp:1291 gui/options.cpp:1321 gui/options.cpp:1327
+#: gui/options.cpp:1334 gui/options.cpp:1427 gui/options.cpp:1430
+#: gui/options.cpp:1442
msgctxt "path"
msgid "None"
msgstr "Cap"
-#: gui/launcher.cpp:359 gui/launcher.cpp:459 gui/launcher.cpp:569
-#: gui/options.cpp:1270 gui/options.cpp:1314 gui/options.cpp:1432
+#: gui/launcher.cpp:365 gui/launcher.cpp:465 gui/launcher.cpp:575
+#: gui/options.cpp:1271 gui/options.cpp:1315 gui/options.cpp:1433
#: backends/platform/wii/options.cpp:56
msgid "Default"
msgstr "Per defecte"
-#: gui/launcher.cpp:504 gui/options.cpp:1435
+#: gui/launcher.cpp:510 gui/options.cpp:1436
msgid "Select SoundFont"
msgstr "Seleccioneu el fitxer SoundFont"
-#: gui/launcher.cpp:523 gui/launcher.cpp:677
+#: gui/launcher.cpp:529 gui/launcher.cpp:682
msgid "Select directory with game data"
msgstr "Seleccioneu el directori amb les dades del joc"
-#: gui/launcher.cpp:541
+#: gui/launcher.cpp:547
msgid "Select additional game directory"
msgstr "Seleccioneu el directori addicional del joc"
-#: gui/launcher.cpp:553
+#: gui/launcher.cpp:559
msgid "Select directory for saved games"
msgstr "Seleccioneu el directori de les partides desades"
-#: gui/launcher.cpp:580
+#: gui/launcher.cpp:586
msgid "This game ID is already taken. Please choose another one."
msgstr ""
"Aquest identificador de joc ja està en ús. Si us plau, trieu-ne un altre."
-#: gui/launcher.cpp:621 engines/dialogs.cpp:110
+#: gui/launcher.cpp:626 engines/dialogs.cpp:111
msgid "~Q~uit"
msgstr "~T~anca"
-#: gui/launcher.cpp:621 backends/platform/sdl/macosx/appmenu_osx.mm:95
+#: gui/launcher.cpp:626 backends/platform/sdl/macosx/appmenu_osx.mm:95
msgid "Quit ScummVM"
msgstr "Surt de ScummVM"
-#: gui/launcher.cpp:622
+#: gui/launcher.cpp:627
msgid "A~b~out..."
msgstr "~Q~uant a..."
-#: gui/launcher.cpp:622 backends/platform/sdl/macosx/appmenu_osx.mm:69
+#: gui/launcher.cpp:627 backends/platform/sdl/macosx/appmenu_osx.mm:69
msgid "About ScummVM"
msgstr "Quant a ScummVM"
-#: gui/launcher.cpp:623
+#: gui/launcher.cpp:628
msgid "~O~ptions..."
msgstr "~O~pcions..."
-#: gui/launcher.cpp:623
+#: gui/launcher.cpp:628
msgid "Change global ScummVM options"
msgstr "Canvia les opcions globals de ScummVM"
-#: gui/launcher.cpp:625
+#: gui/launcher.cpp:630
msgid "~S~tart"
msgstr "~I~nicia"
-#: gui/launcher.cpp:625
+#: gui/launcher.cpp:630
msgid "Start selected game"
msgstr "Iniciant el joc seleccionat"
-#: gui/launcher.cpp:628
+#: gui/launcher.cpp:633
msgid "~L~oad..."
msgstr "~C~arrega..."
-#: gui/launcher.cpp:628
+#: gui/launcher.cpp:633
msgid "Load savegame for selected game"
msgstr "Carrega una partida pel joc seleccionat"
-#: gui/launcher.cpp:633 gui/launcher.cpp:1120
+#: gui/launcher.cpp:638
msgid "~A~dd Game..."
msgstr "~A~fegeix Joc..."
-#: gui/launcher.cpp:633 gui/launcher.cpp:640
+#: gui/launcher.cpp:638 gui/launcher.cpp:645
msgid "Hold Shift for Mass Add"
msgstr "Mantingueu premut Shift per a l'Addició Massiva"
-#: gui/launcher.cpp:635
+#: gui/launcher.cpp:640
msgid "~E~dit Game..."
msgstr "~E~dita Joc..."
-#: gui/launcher.cpp:635 gui/launcher.cpp:642
+#: gui/launcher.cpp:640 gui/launcher.cpp:647
msgid "Change game options"
msgstr "Canvia les opcions del joc"
-#: gui/launcher.cpp:637
+#: gui/launcher.cpp:642
msgid "~R~emove Game"
msgstr "~S~uprimeix Joc"
-#: gui/launcher.cpp:637 gui/launcher.cpp:644
+#: gui/launcher.cpp:642 gui/launcher.cpp:649
msgid "Remove game from the list. The game data files stay intact"
msgstr ""
"Elimina un joc de la llista. Els fitxers de dades del joc es mantenen "
"intactes"
-#: gui/launcher.cpp:640 gui/launcher.cpp:1120
+#: gui/launcher.cpp:645
msgctxt "lowres"
msgid "~A~dd Game..."
msgstr "~A~fegeix Joc..."
-#: gui/launcher.cpp:642
+#: gui/launcher.cpp:647
msgctxt "lowres"
msgid "~E~dit Game..."
msgstr "~E~dita Joc..."
-#: gui/launcher.cpp:644
+#: gui/launcher.cpp:649
msgctxt "lowres"
msgid "~R~emove Game"
msgstr "~S~uprimeix"
-#: gui/launcher.cpp:652
+#: gui/launcher.cpp:657
msgid "Search in game list"
msgstr "Cerca a la llista de jocs"
-#: gui/launcher.cpp:656 gui/launcher.cpp:1167
+#: gui/launcher.cpp:661 gui/launcher.cpp:1222
msgid "Search:"
msgstr "Cerca:"
-#: gui/launcher.cpp:680 engines/dialogs.cpp:114 engines/mohawk/myst.cpp:245
-#: engines/mohawk/riven.cpp:716 engines/cruise/menu.cpp:214
-#: engines/pegasus/pegasus.cpp:349
+#: gui/launcher.cpp:685 engines/dialogs.cpp:115 engines/cruise/menu.cpp:214
+#: engines/mohawk/myst.cpp:245 engines/mohawk/riven.cpp:718
+#: engines/pegasus/pegasus.cpp:353
msgid "Load game:"
msgstr "Carrega partida:"
-#: gui/launcher.cpp:680 engines/dialogs.cpp:114 engines/scumm/dialogs.cpp:188
-#: engines/mohawk/myst.cpp:245 engines/mohawk/riven.cpp:716
-#: engines/cruise/menu.cpp:214 engines/pegasus/pegasus.cpp:349
+#: gui/launcher.cpp:685 engines/dialogs.cpp:115
#: backends/platform/wince/CEActionsPocket.cpp:267
#: backends/platform/wince/CEActionsSmartphone.cpp:231
+#: engines/cruise/menu.cpp:214 engines/mohawk/myst.cpp:245
+#: engines/mohawk/riven.cpp:718 engines/pegasus/pegasus.cpp:353
+#: engines/scumm/dialogs.cpp:189
msgid "Load"
msgstr "Carrega"
-#: gui/launcher.cpp:788
+#: gui/launcher.cpp:792
msgid ""
"Do you really want to run the mass game detector? This could potentially add "
"a huge number of games."
@@ -474,7 +475,8 @@ msgstr ""
"Esteu segur que voleu executar el detector massiu de jocs? Això pot afegir "
"una gran quantitat de jocs."
-#: gui/launcher.cpp:789 gui/launcher.cpp:937 gui/fluidsynth-dialog.cpp:216
+#: gui/launcher.cpp:793 gui/launcher.cpp:941 gui/launcher.cpp:1000
+#: gui/fluidsynth-dialog.cpp:217
#: backends/events/symbiansdl/symbiansdl-events.cpp:184
#: backends/platform/wince/CEActionsPocket.cpp:326
#: backends/platform/wince/CEActionsSmartphone.cpp:287
@@ -482,7 +484,8 @@ msgstr ""
msgid "Yes"
msgstr "Sí"
-#: gui/launcher.cpp:789 gui/launcher.cpp:937 gui/fluidsynth-dialog.cpp:216
+#: gui/launcher.cpp:793 gui/launcher.cpp:941 gui/launcher.cpp:1000
+#: gui/fluidsynth-dialog.cpp:217
#: backends/events/symbiansdl/symbiansdl-events.cpp:184
#: backends/platform/wince/CEActionsPocket.cpp:326
#: backends/platform/wince/CEActionsSmartphone.cpp:287
@@ -490,191 +493,186 @@ msgstr "Sí"
msgid "No"
msgstr "No"
-#: gui/launcher.cpp:837
+#: gui/launcher.cpp:841
msgid "ScummVM couldn't open the specified directory!"
msgstr "ScummVM no ha pogut obrir el directori especificat!"
-#: gui/launcher.cpp:849
+#: gui/launcher.cpp:853
msgid "ScummVM could not find any game in the specified directory!"
msgstr "ScummVM no ha pogut trobar cap joc al directori especificat!"
-#: gui/launcher.cpp:863
+#: gui/launcher.cpp:867
msgid "Pick the game:"
msgstr "Seleccioneu el joc:"
-#: gui/launcher.cpp:937
+#: gui/launcher.cpp:941
msgid "Do you really want to remove this game configuration?"
msgstr "Realment voleu suprimir la configuració d'aquest joc?"
-#: gui/launcher.cpp:1001
+#: gui/launcher.cpp:999
+#, fuzzy
+msgid "Do you want to load savegame?"
+msgstr "Voleu carregar o desar el joc?"
+
+#: gui/launcher.cpp:1048
msgid "This game does not support loading games from the launcher."
msgstr "Aquest joc no suporta la càrrega de partides des del llançador."
-#: gui/launcher.cpp:1005
+#: gui/launcher.cpp:1052
msgid "ScummVM could not find any engine capable of running the selected game!"
msgstr ""
"ScummVM no ha pogut trobar cap motor capaç d'executar el joc seleccionat!"
-#: gui/launcher.cpp:1119
-msgctxt "lowres"
-msgid "Mass Add..."
-msgstr "Afegeix Jocs"
-
-#: gui/launcher.cpp:1119
-msgid "Mass Add..."
-msgstr "Addició Massiva..."
-
-#: gui/massadd.cpp:78 gui/massadd.cpp:81
+#: gui/massadd.cpp:79 gui/massadd.cpp:82
msgid "... progress ..."
msgstr "... progrés ..."
-#: gui/massadd.cpp:258
+#: gui/massadd.cpp:259
msgid "Scan complete!"
msgstr "S'ha acabat la cerca!"
-#: gui/massadd.cpp:261
+#: gui/massadd.cpp:262
#, c-format
msgid "Discovered %d new games, ignored %d previously added games."
msgstr "S'han trobat %d jocs nous, s'han ignorat %d jocs afegits prèviament."
-#: gui/massadd.cpp:265
+#: gui/massadd.cpp:266
#, c-format
msgid "Scanned %d directories ..."
msgstr "S'han cercat %d directoris ..."
-#: gui/massadd.cpp:268
+#: gui/massadd.cpp:269
#, c-format
msgid "Discovered %d new games, ignored %d previously added games ..."
msgstr ""
"S'han trobat %d jocs nous, s'han ignorat %d jocs afegits anteriorment ..."
-#: gui/options.cpp:84
+#: gui/options.cpp:85
msgid "Never"
msgstr "Mai"
-#: gui/options.cpp:84
+#: gui/options.cpp:85
msgid "every 5 mins"
msgstr "cada 5 minuts"
-#: gui/options.cpp:84
+#: gui/options.cpp:85
msgid "every 10 mins"
msgstr "cada 10 minuts"
-#: gui/options.cpp:84
+#: gui/options.cpp:85
msgid "every 15 mins"
msgstr "cada 15 minuts"
-#: gui/options.cpp:84
+#: gui/options.cpp:85
msgid "every 30 mins"
msgstr "cada 30 minuts"
-#: gui/options.cpp:86
+#: gui/options.cpp:87
msgid "8 kHz"
msgstr "8 kHz"
-#: gui/options.cpp:86
+#: gui/options.cpp:87
msgid "11kHz"
msgstr "11kHz"
-#: gui/options.cpp:86
+#: gui/options.cpp:87
msgid "22 kHz"
msgstr "22 kHz"
-#: gui/options.cpp:86
+#: gui/options.cpp:87
msgid "44 kHz"
msgstr "44 kHz"
-#: gui/options.cpp:86
+#: gui/options.cpp:87
msgid "48 kHz"
msgstr "48 kHz"
-#: gui/options.cpp:254 gui/options.cpp:480 gui/options.cpp:581
-#: gui/options.cpp:650 gui/options.cpp:858
+#: gui/options.cpp:255 gui/options.cpp:481 gui/options.cpp:582
+#: gui/options.cpp:651 gui/options.cpp:859
msgctxt "soundfont"
msgid "None"
msgstr "Cap"
-#: gui/options.cpp:388
+#: gui/options.cpp:389
msgid "Failed to apply some of the graphic options changes:"
msgstr "No s'han pogut aplicar alguns canvis de les opcions gràfiques:"
-#: gui/options.cpp:400
+#: gui/options.cpp:401
msgid "the video mode could not be changed."
msgstr "no s'ha pogut canviar el mode de vídeo"
-#: gui/options.cpp:406
+#: gui/options.cpp:407
msgid "the fullscreen setting could not be changed"
msgstr "no s'ha pogut canviar l'ajust de pantalla completa"
-#: gui/options.cpp:412
+#: gui/options.cpp:413
msgid "the aspect ratio setting could not be changed"
msgstr "no s'ha pogut canviar l'ajust de la correcció d'aspecte"
-#: gui/options.cpp:733
+#: gui/options.cpp:734
msgid "Graphics mode:"
msgstr "Mode gràfic:"
-#: gui/options.cpp:747
+#: gui/options.cpp:748
msgid "Render mode:"
msgstr "Mode de pintat:"
-#: gui/options.cpp:747 gui/options.cpp:748
+#: gui/options.cpp:748 gui/options.cpp:749
msgid "Special dithering modes supported by some games"
msgstr "Modes de tramat especials suportats per alguns jocs"
-#: gui/options.cpp:759
-#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2236
-#: backends/graphics/openglsdl/openglsdl-graphics.cpp:476
+#: gui/options.cpp:760
+#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2249
msgid "Fullscreen mode"
msgstr "Mode pantalla completa"
-#: gui/options.cpp:762
+#: gui/options.cpp:763
msgid "Aspect ratio correction"
msgstr "Correcció de la relació d'aspecte"
-#: gui/options.cpp:762
+#: gui/options.cpp:763
msgid "Correct aspect ratio for 320x200 games"
msgstr "Corregeix la relació d'aspecte per jocs de 320x200"
-#: gui/options.cpp:770
+#: gui/options.cpp:771
msgid "Preferred Device:"
msgstr "Disp. preferit:"
-#: gui/options.cpp:770
+#: gui/options.cpp:771
msgid "Music Device:"
msgstr "Disp. de música:"
-#: gui/options.cpp:770 gui/options.cpp:772
+#: gui/options.cpp:771 gui/options.cpp:773
msgid "Specifies preferred sound device or sound card emulator"
msgstr "Especifica el dispositiu de so o l'emulador de tarja de so preferit"
-#: gui/options.cpp:770 gui/options.cpp:772 gui/options.cpp:773
+#: gui/options.cpp:771 gui/options.cpp:773 gui/options.cpp:774
msgid "Specifies output sound device or sound card emulator"
msgstr "Especifica el dispositiu de so o l'emulador de tarja de so de sortida"
-#: gui/options.cpp:772
+#: gui/options.cpp:773
msgctxt "lowres"
msgid "Preferred Dev.:"
msgstr "Disp. preferit:"
-#: gui/options.cpp:772
+#: gui/options.cpp:773
msgctxt "lowres"
msgid "Music Device:"
msgstr "Disp. de música:"
-#: gui/options.cpp:799
+#: gui/options.cpp:800
msgid "AdLib emulator:"
msgstr "Emulador AdLib:"
-#: gui/options.cpp:799 gui/options.cpp:800
+#: gui/options.cpp:800 gui/options.cpp:801
msgid "AdLib is used for music in many games"
msgstr "AdLib s'utilitza per la música de molts jocs"
-#: gui/options.cpp:810
+#: gui/options.cpp:811
msgid "Output rate:"
msgstr "Freq. sortida:"
-#: gui/options.cpp:810 gui/options.cpp:811
+#: gui/options.cpp:811 gui/options.cpp:812
msgid ""
"Higher value specifies better sound quality but may be not supported by your "
"soundcard"
@@ -682,67 +680,67 @@ msgstr ""
"Valors més alts especifiquen millor qualitat de so però pot ser que la "
"vostra tarja de so no ho suporti"
-#: gui/options.cpp:821
+#: gui/options.cpp:822
msgid "GM Device:"
msgstr "Dispositiu GM:"
-#: gui/options.cpp:821
+#: gui/options.cpp:822
msgid "Specifies default sound device for General MIDI output"
msgstr ""
"Especifica el dispositiu de so per defecte per a la sortida General MIDI"
-#: gui/options.cpp:832
+#: gui/options.cpp:833
msgid "Don't use General MIDI music"
msgstr "No utilitzis música General MIDI"
-#: gui/options.cpp:843 gui/options.cpp:909
+#: gui/options.cpp:844 gui/options.cpp:910
msgid "Use first available device"
msgstr "Utilitza el primer dispositiu disponible"
-#: gui/options.cpp:855
+#: gui/options.cpp:856
msgid "SoundFont:"
msgstr "Fitxer SoundFont:"
-#: gui/options.cpp:855 gui/options.cpp:857 gui/options.cpp:858
+#: gui/options.cpp:856 gui/options.cpp:858 gui/options.cpp:859
msgid "SoundFont is supported by some audio cards, Fluidsynth and Timidity"
msgstr "Algunes targes de so, Fluidsynth i Timidity suporten SoundFont"
-#: gui/options.cpp:857
+#: gui/options.cpp:858
msgctxt "lowres"
msgid "SoundFont:"
msgstr "SoundFont:"
-#: gui/options.cpp:863
+#: gui/options.cpp:864
msgid "Mixed AdLib/MIDI mode"
msgstr "Mode combinat AdLib/MIDI"
-#: gui/options.cpp:863
+#: gui/options.cpp:864
msgid "Use both MIDI and AdLib sound generation"
msgstr "Utilitza MIDI i la generació de so AdLib alhora"
-#: gui/options.cpp:866
+#: gui/options.cpp:867
msgid "MIDI gain:"
msgstr "Guany MIDI:"
-#: gui/options.cpp:873
+#: gui/options.cpp:874
msgid "FluidSynth Settings"
msgstr "Configuració de FluidSynth"
-#: gui/options.cpp:880
+#: gui/options.cpp:881
msgid "MT-32 Device:"
msgstr "Disposit. MT-32:"
-#: gui/options.cpp:880
+#: gui/options.cpp:881
msgid "Specifies default sound device for Roland MT-32/LAPC1/CM32l/CM64 output"
msgstr ""
"Especifica el dispositiu de so per defecte per a la sortida de Roland MT-32/"
"LAPC1/CM32l/CM64"
-#: gui/options.cpp:885
+#: gui/options.cpp:886
msgid "True Roland MT-32 (disable GM emulation)"
msgstr "Roland MT-32 real (desactiva l'emulació GM)"
-#: gui/options.cpp:885 gui/options.cpp:887
+#: gui/options.cpp:886 gui/options.cpp:888
msgid ""
"Check if you want to use your real hardware Roland-compatible sound device "
"connected to your computer"
@@ -750,196 +748,197 @@ msgstr ""
"Marqueu si voleu utilitzar el vostre dispositiu hardware real de so "
"compatible amb Roland connectat al vostre ordinador"
-#: gui/options.cpp:887
+#: gui/options.cpp:888
msgctxt "lowres"
msgid "True Roland MT-32 (no GM emulation)"
msgstr "Roland MT-32 real (sense emulació GM)"
-#: gui/options.cpp:890
-msgid "Roland GS Mode (disable GM mapping)"
+#: gui/options.cpp:891
+#, fuzzy
+msgid "Roland GS Device (enable MT-32 mappings)"
msgstr "Mode Roland GS (desactiva el mapeig GM)"
-#: gui/options.cpp:890
-msgid "Turns off General MIDI mapping for games with Roland MT-32 soundtrack"
+#: gui/options.cpp:891
+msgid ""
+"Check if you want to enable patch mappings to emulate an MT-32 on a Roland "
+"GS device"
msgstr ""
-"Desactiva la conversió General MIDI pels jocs que tenen banda sonora per a "
-"Roland MT-32"
-#: gui/options.cpp:899
+#: gui/options.cpp:900
msgid "Don't use Roland MT-32 music"
msgstr "No utilitzis música de Roland MT-32"
-#: gui/options.cpp:926
+#: gui/options.cpp:927
msgid "Text and Speech:"
msgstr "Text i Veus:"
-#: gui/options.cpp:930 gui/options.cpp:940
+#: gui/options.cpp:931 gui/options.cpp:941
msgid "Speech"
msgstr "Veus"
-#: gui/options.cpp:931 gui/options.cpp:941
+#: gui/options.cpp:932 gui/options.cpp:942
msgid "Subtitles"
msgstr "Subtítols"
-#: gui/options.cpp:932
+#: gui/options.cpp:933
msgid "Both"
msgstr "Ambdós"
-#: gui/options.cpp:934
+#: gui/options.cpp:935
msgid "Subtitle speed:"
msgstr "Velocitat de subt.:"
-#: gui/options.cpp:936
+#: gui/options.cpp:937
msgctxt "lowres"
msgid "Text and Speech:"
msgstr "Text i Veus:"
-#: gui/options.cpp:940
+#: gui/options.cpp:941
msgid "Spch"
msgstr "Veus"
-#: gui/options.cpp:941
+#: gui/options.cpp:942
msgid "Subs"
msgstr "Subt"
-#: gui/options.cpp:942
+#: gui/options.cpp:943
msgctxt "lowres"
msgid "Both"
msgstr "Ambdós"
-#: gui/options.cpp:942
+#: gui/options.cpp:943
msgid "Show subtitles and play speech"
msgstr "Mostra els subtítols i reprodueix la veu"
-#: gui/options.cpp:944
+#: gui/options.cpp:945
msgctxt "lowres"
msgid "Subtitle speed:"
msgstr "Veloc. de subt.:"
-#: gui/options.cpp:960
+#: gui/options.cpp:961
msgid "Music volume:"
msgstr "Volum de música:"
-#: gui/options.cpp:962
+#: gui/options.cpp:963
msgctxt "lowres"
msgid "Music volume:"
msgstr "Volum de música:"
-#: gui/options.cpp:969
+#: gui/options.cpp:970
msgid "Mute All"
msgstr "Silenciar tot"
-#: gui/options.cpp:972
+#: gui/options.cpp:973
msgid "SFX volume:"
msgstr "Volum d'efectes:"
-#: gui/options.cpp:972 gui/options.cpp:974 gui/options.cpp:975
+#: gui/options.cpp:973 gui/options.cpp:975 gui/options.cpp:976
msgid "Special sound effects volume"
msgstr "Volum dels sons d'efectes especials"
-#: gui/options.cpp:974
+#: gui/options.cpp:975
msgctxt "lowres"
msgid "SFX volume:"
msgstr "Volum d'efectes:"
-#: gui/options.cpp:982
+#: gui/options.cpp:983
msgid "Speech volume:"
msgstr "Volum de veus:"
-#: gui/options.cpp:984
+#: gui/options.cpp:985
msgctxt "lowres"
msgid "Speech volume:"
msgstr "Volum de veus:"
-#: gui/options.cpp:1141
+#: gui/options.cpp:1142
msgid "Theme Path:"
msgstr "Camí dels temes:"
-#: gui/options.cpp:1143
+#: gui/options.cpp:1144
msgctxt "lowres"
msgid "Theme Path:"
msgstr "Camí temes:"
-#: gui/options.cpp:1149 gui/options.cpp:1151 gui/options.cpp:1152
+#: gui/options.cpp:1150 gui/options.cpp:1152 gui/options.cpp:1153
msgid "Specifies path to additional data used by all games or ScummVM"
msgstr ""
"Especifica el camí de les dades addicionals utilitzades per tots els jocs o "
"pel ScummVM"
-#: gui/options.cpp:1158
+#: gui/options.cpp:1159
msgid "Plugins Path:"
msgstr "Camí dels connectors:"
-#: gui/options.cpp:1160
+#: gui/options.cpp:1161
msgctxt "lowres"
msgid "Plugins Path:"
msgstr "Camí de connectors:"
-#: gui/options.cpp:1169 gui/fluidsynth-dialog.cpp:137
+#: gui/options.cpp:1170 gui/fluidsynth-dialog.cpp:138
msgid "Misc"
msgstr "Misc"
-#: gui/options.cpp:1171
+#: gui/options.cpp:1172
msgctxt "lowres"
msgid "Misc"
msgstr "Misc"
-#: gui/options.cpp:1173
+#: gui/options.cpp:1174
msgid "Theme:"
msgstr "Tema:"
-#: gui/options.cpp:1177
+#: gui/options.cpp:1178
msgid "GUI Renderer:"
msgstr "Pintat GUI:"
-#: gui/options.cpp:1189
+#: gui/options.cpp:1190
msgid "Autosave:"
msgstr "Desat automàtic:"
-#: gui/options.cpp:1191
+#: gui/options.cpp:1192
msgctxt "lowres"
msgid "Autosave:"
msgstr "Auto-desat:"
-#: gui/options.cpp:1199
+#: gui/options.cpp:1200
msgid "Keys"
msgstr "Tecles"
-#: gui/options.cpp:1206
+#: gui/options.cpp:1207
msgid "GUI Language:"
msgstr "Idioma GUI:"
-#: gui/options.cpp:1206
+#: gui/options.cpp:1207
msgid "Language of ScummVM GUI"
msgstr "Idioma de la interfície d'usuari de ScummVM"
-#: gui/options.cpp:1365
+#: gui/options.cpp:1366
msgid "You have to restart ScummVM before your changes will take effect."
msgstr "Heu de reiniciar ScummVM perquè tots els canvis tinguin efecte."
-#: gui/options.cpp:1378
+#: gui/options.cpp:1379
msgid "Select directory for savegames"
msgstr "Seleccioneu el directori de les partides desades"
-#: gui/options.cpp:1385
+#: gui/options.cpp:1386
msgid "The chosen directory cannot be written to. Please select another one."
msgstr ""
"No es pot escriure al directori seleccionat. Si us plau, escolliu-ne un "
"altre."
-#: gui/options.cpp:1394
+#: gui/options.cpp:1395
msgid "Select directory for GUI themes"
msgstr "Seleccioneu el directori dels temes"
-#: gui/options.cpp:1404
+#: gui/options.cpp:1405
msgid "Select directory for extra files"
msgstr "Seleccioneu el directori dels fitxers extra"
-#: gui/options.cpp:1415
+#: gui/options.cpp:1416
msgid "Select directory for plugins"
msgstr "Seleccioneu el directori dels connectors"
-#: gui/options.cpp:1468
+#: gui/options.cpp:1469
msgid ""
"The theme you selected does not support your current language. If you want "
"to use this theme you need to switch to another language first."
@@ -947,224 +946,227 @@ msgstr ""
"El tema que heu seleccionat no suporta l'idioma actual. Si voleu utilitzar "
"aquest tema primer haureu de canviar a un altre idioma."
-#: gui/saveload-dialog.cpp:166
+#: gui/saveload-dialog.cpp:167
msgid "List view"
msgstr "Vista de llistat"
-#: gui/saveload-dialog.cpp:167
+#: gui/saveload-dialog.cpp:168
msgid "Grid view"
msgstr "Vista de quadrícula"
-#: gui/saveload-dialog.cpp:210 gui/saveload-dialog.cpp:358
+#: gui/saveload-dialog.cpp:211 gui/saveload-dialog.cpp:360
msgid "No date saved"
msgstr "No hi ha data desada"
-#: gui/saveload-dialog.cpp:211 gui/saveload-dialog.cpp:359
+#: gui/saveload-dialog.cpp:212 gui/saveload-dialog.cpp:361
msgid "No time saved"
msgstr "No hi ha hora desada"
-#: gui/saveload-dialog.cpp:212 gui/saveload-dialog.cpp:360
+#: gui/saveload-dialog.cpp:213 gui/saveload-dialog.cpp:362
msgid "No playtime saved"
msgstr "No hi ha temps de joc desat"
-#: gui/saveload-dialog.cpp:219 gui/saveload-dialog.cpp:275
+#: gui/saveload-dialog.cpp:220 gui/saveload-dialog.cpp:276
msgid "Delete"
msgstr "Suprimeix"
-#: gui/saveload-dialog.cpp:274
+#: gui/saveload-dialog.cpp:275
msgid "Do you really want to delete this savegame?"
msgstr "Realment voleu suprimir aquesta partida?"
-#: gui/saveload-dialog.cpp:383 gui/saveload-dialog.cpp:872
+#: gui/saveload-dialog.cpp:385 gui/saveload-dialog.cpp:875
msgid "Date: "
msgstr "Data: "
-#: gui/saveload-dialog.cpp:387 gui/saveload-dialog.cpp:878
+#: gui/saveload-dialog.cpp:389 gui/saveload-dialog.cpp:881
msgid "Time: "
msgstr "Hora: "
-#: gui/saveload-dialog.cpp:393 gui/saveload-dialog.cpp:886
+#: gui/saveload-dialog.cpp:395 gui/saveload-dialog.cpp:889
msgid "Playtime: "
msgstr "Temps de joc: "
-#: gui/saveload-dialog.cpp:406 gui/saveload-dialog.cpp:494
+#: gui/saveload-dialog.cpp:408 gui/saveload-dialog.cpp:496
msgid "Untitled savestate"
msgstr "Partida sense títol"
-#: gui/saveload-dialog.cpp:546
+#: gui/saveload-dialog.cpp:548
msgid "Next"
msgstr "Següent"
-#: gui/saveload-dialog.cpp:549
+#: gui/saveload-dialog.cpp:551
msgid "Prev"
msgstr "Anterior"
-#: gui/saveload-dialog.cpp:736
+#: gui/saveload-dialog.cpp:739
msgid "New Save"
msgstr "Nova partida desada"
-#: gui/saveload-dialog.cpp:736
+#: gui/saveload-dialog.cpp:739
msgid "Create a new save game"
msgstr "Crea una nova partida desada"
-#: gui/saveload-dialog.cpp:865
+#: gui/saveload-dialog.cpp:868
msgid "Name: "
msgstr "Nom: "
-#: gui/saveload-dialog.cpp:937
+#: gui/saveload-dialog.cpp:940
#, c-format
msgid "Enter a description for slot %d:"
msgstr "Entreu la descripció per l'espai %d:"
-#: gui/themebrowser.cpp:44
+#: gui/themebrowser.cpp:45
msgid "Select a Theme"
msgstr "Seleccioneu un Tema"
-#: gui/ThemeEngine.cpp:337
+#: gui/ThemeEngine.cpp:347
msgid "Disabled GFX"
msgstr "GFX desactivats"
-#: gui/ThemeEngine.cpp:337
+#: gui/ThemeEngine.cpp:347
msgctxt "lowres"
msgid "Disabled GFX"
msgstr "GFX desactivats"
-#: gui/ThemeEngine.cpp:338
-msgid "Standard Renderer (16bpp)"
+#: gui/ThemeEngine.cpp:348
+#, fuzzy
+msgid "Standard Renderer"
msgstr "Pintat estàndard (16bpp)"
-#: gui/ThemeEngine.cpp:338
-msgid "Standard (16bpp)"
-msgstr "Estàndard (16bpp)"
+#: gui/ThemeEngine.cpp:348 engines/scumm/dialogs.cpp:659
+msgid "Standard"
+msgstr "Estàndard"
-#: gui/ThemeEngine.cpp:340
-msgid "Antialiased Renderer (16bpp)"
+#: gui/ThemeEngine.cpp:350
+#, fuzzy
+msgid "Antialiased Renderer"
msgstr "Pintat amb antialias (16bpp)"
-#: gui/ThemeEngine.cpp:340
-msgid "Antialiased (16bpp)"
+#: gui/ThemeEngine.cpp:350
+#, fuzzy
+msgid "Antialiased"
msgstr "Amb antialias (16bpp)"
-#: gui/widget.cpp:322 gui/widget.cpp:324 gui/widget.cpp:330 gui/widget.cpp:332
+#: gui/widget.cpp:323 gui/widget.cpp:325 gui/widget.cpp:331 gui/widget.cpp:333
msgid "Clear value"
msgstr "Neteja el valor"
-#: gui/fluidsynth-dialog.cpp:67
+#: gui/fluidsynth-dialog.cpp:68
msgid "Reverb"
msgstr "Reverberació"
-#: gui/fluidsynth-dialog.cpp:69 gui/fluidsynth-dialog.cpp:101
+#: gui/fluidsynth-dialog.cpp:70 gui/fluidsynth-dialog.cpp:102
msgid "Active"
msgstr "Actiu"
-#: gui/fluidsynth-dialog.cpp:71
+#: gui/fluidsynth-dialog.cpp:72
msgid "Room:"
msgstr "Habitació:"
-#: gui/fluidsynth-dialog.cpp:78
+#: gui/fluidsynth-dialog.cpp:79
msgid "Damp:"
msgstr "Humitat:"
-#: gui/fluidsynth-dialog.cpp:85
+#: gui/fluidsynth-dialog.cpp:86
msgid "Width:"
msgstr "Amplitud:"
-#: gui/fluidsynth-dialog.cpp:92 gui/fluidsynth-dialog.cpp:110
+#: gui/fluidsynth-dialog.cpp:93 gui/fluidsynth-dialog.cpp:111
msgid "Level:"
msgstr "Nivell:"
-#: gui/fluidsynth-dialog.cpp:99
+#: gui/fluidsynth-dialog.cpp:100
msgid "Chorus"
msgstr "Cor"
-#: gui/fluidsynth-dialog.cpp:103
+#: gui/fluidsynth-dialog.cpp:104
msgid "N:"
msgstr "N:"
-#: gui/fluidsynth-dialog.cpp:117
+#: gui/fluidsynth-dialog.cpp:118
msgid "Speed:"
msgstr "Velocitat:"
-#: gui/fluidsynth-dialog.cpp:124
+#: gui/fluidsynth-dialog.cpp:125
msgid "Depth:"
msgstr "Profunditat:"
-#: gui/fluidsynth-dialog.cpp:131
+#: gui/fluidsynth-dialog.cpp:132
msgid "Type:"
msgstr "Tipus:"
-#: gui/fluidsynth-dialog.cpp:134
+#: gui/fluidsynth-dialog.cpp:135
msgid "Sine"
msgstr "Sinus"
-#: gui/fluidsynth-dialog.cpp:135
+#: gui/fluidsynth-dialog.cpp:136
msgid "Triangle"
msgstr "Triangle"
-#: gui/fluidsynth-dialog.cpp:139
+#: gui/fluidsynth-dialog.cpp:140
msgid "Interpolation:"
msgstr "Interpolació:"
-#: gui/fluidsynth-dialog.cpp:142
+#: gui/fluidsynth-dialog.cpp:143
msgid "None (fastest)"
msgstr "Cap (el més ràpid)"
-#: gui/fluidsynth-dialog.cpp:143
+#: gui/fluidsynth-dialog.cpp:144
msgid "Linear"
msgstr "Lineal"
-#: gui/fluidsynth-dialog.cpp:144
+#: gui/fluidsynth-dialog.cpp:145
msgid "Fourth-order"
msgstr "Quart ordre"
-#: gui/fluidsynth-dialog.cpp:145
+#: gui/fluidsynth-dialog.cpp:146
msgid "Seventh-order"
msgstr "Setè ordre"
-#: gui/fluidsynth-dialog.cpp:149
+#: gui/fluidsynth-dialog.cpp:150
msgid "Reset"
msgstr "Reset"
-#: gui/fluidsynth-dialog.cpp:149
+#: gui/fluidsynth-dialog.cpp:150
msgid "Reset all FluidSynth settings to their default values."
msgstr "Retorna tots els ajustos de FluidSynth als seus valors per defecte."
-#: gui/fluidsynth-dialog.cpp:216
+#: gui/fluidsynth-dialog.cpp:217
msgid ""
"Do you really want to reset all FluidSynth settings to their default values?"
msgstr ""
"Realment voleu retorna tots els ajustos de FluidSynth als seus valors per "
"defecte?"
-#: base/main.cpp:210
+#: base/main.cpp:228
#, c-format
msgid "Engine does not support debug level '%s'"
msgstr "El motor no suporta el nivell de depuració '%s'"
-#: base/main.cpp:288
+#: base/main.cpp:306
msgid "Menu"
msgstr "Menú"
-#: base/main.cpp:291 backends/platform/symbian/src/SymbianActions.cpp:45
+#: base/main.cpp:309 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:294 backends/platform/symbian/src/SymbianActions.cpp:50
+#: base/main.cpp:312 backends/platform/symbian/src/SymbianActions.cpp:50
#: backends/platform/wince/CEActionsPocket.cpp:42
msgid "Pause"
msgstr "Pausa"
-#: base/main.cpp:297
+#: base/main.cpp:315
msgid "Skip line"
msgstr "Salta la línia"
-#: base/main.cpp:468
+#: base/main.cpp:507
msgid "Error running game:"
msgstr "Error al executar el joc:"
-#: base/main.cpp:492
+#: base/main.cpp:536
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"
@@ -1232,73 +1234,73 @@ msgstr "Cancel·lat per l'usuari"
msgid "Unknown error"
msgstr "Error desconegut"
-#: engines/advancedDetector.cpp:316
+#: engines/advancedDetector.cpp:317
#, c-format
msgid "The game in '%s' seems to be unknown."
msgstr "El joc a '%s' sembla ser desconegut."
-#: engines/advancedDetector.cpp:317
+#: engines/advancedDetector.cpp:318
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:319
+#: engines/advancedDetector.cpp:320
msgid "of the game you tried to add and its version/language/etc.:"
msgstr "nom del joc que heu provat d'afegir i la seva versió/llengua/etc.:"
-#: engines/dialogs.cpp:84
+#: engines/dialogs.cpp:85
msgid "~R~esume"
msgstr "~C~ontinua"
-#: engines/dialogs.cpp:86
+#: engines/dialogs.cpp:87
msgid "~L~oad"
msgstr "C~a~rrega"
-#: engines/dialogs.cpp:90
+#: engines/dialogs.cpp:91
msgid "~S~ave"
msgstr "~D~esa"
-#: engines/dialogs.cpp:94
+#: engines/dialogs.cpp:95
msgid "~O~ptions"
msgstr "~O~pcions"
-#: engines/dialogs.cpp:99
+#: engines/dialogs.cpp:100
msgid "~H~elp"
msgstr "~A~juda"
-#: engines/dialogs.cpp:101
+#: engines/dialogs.cpp:102
msgid "~A~bout"
msgstr "~Q~uant a"
-#: engines/dialogs.cpp:104 engines/dialogs.cpp:180
+#: engines/dialogs.cpp:105 engines/dialogs.cpp:181
msgid "~R~eturn to Launcher"
msgstr "~R~etorna al Llançador"
-#: engines/dialogs.cpp:106 engines/dialogs.cpp:182
+#: engines/dialogs.cpp:107 engines/dialogs.cpp:183
msgctxt "lowres"
msgid "~R~eturn to Launcher"
msgstr "~R~etorna al Llançador"
-#: engines/dialogs.cpp:115 engines/agi/saveload.cpp:803
-#: engines/drascula/saveload.cpp:336 engines/cruise/menu.cpp:212
-#: engines/sci/engine/kfile.cpp:742 engines/toltecs/menu.cpp:284
-#: engines/pegasus/pegasus.cpp:373
+#: engines/dialogs.cpp:116 engines/agi/saveload.cpp:803
+#: engines/cruise/menu.cpp:212 engines/drascula/saveload.cpp:336
+#: engines/neverhood/menumodule.cpp:873 engines/pegasus/pegasus.cpp:377
+#: engines/sci/engine/kfile.cpp:758 engines/toltecs/menu.cpp:281
msgid "Save game:"
msgstr "Desa la partida:"
-#: engines/dialogs.cpp:115 engines/agi/saveload.cpp:803
-#: engines/drascula/saveload.cpp:336 engines/scumm/dialogs.cpp:187
-#: engines/cruise/menu.cpp:212 engines/sci/engine/kfile.cpp:742
-#: engines/toltecs/menu.cpp:284 engines/pegasus/pegasus.cpp:373
-#: backends/platform/symbian/src/SymbianActions.cpp:44
+#: engines/dialogs.cpp:116 backends/platform/symbian/src/SymbianActions.cpp:44
#: backends/platform/wince/CEActionsPocket.cpp:43
#: backends/platform/wince/CEActionsPocket.cpp:267
#: backends/platform/wince/CEActionsSmartphone.cpp:45
#: backends/platform/wince/CEActionsSmartphone.cpp:231
+#: engines/agi/saveload.cpp:803 engines/cruise/menu.cpp:212
+#: engines/drascula/saveload.cpp:336 engines/neverhood/menumodule.cpp:873
+#: engines/pegasus/pegasus.cpp:377 engines/sci/engine/kfile.cpp:758
+#: engines/scumm/dialogs.cpp:188 engines/toltecs/menu.cpp:281
msgid "Save"
msgstr "Desa"
-#: engines/dialogs.cpp:144
+#: engines/dialogs.cpp:145
msgid ""
"Sorry, this engine does not currently provide in-game help. Please consult "
"the README for basic information, and for instructions on how to obtain "
@@ -1307,7 +1309,7 @@ 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:228
+#: engines/dialogs.cpp:234 engines/pegasus/pegasus.cpp:393
#, c-format
msgid ""
"Gamestate save failed (%s)! Please consult the README for basic information, "
@@ -1316,37 +1318,37 @@ msgstr ""
"No s'ha pogut desar la partida (%s)! Consulteu el fitxer README per a la "
"informació bàsica i les instruccions sobre com obtenir més assistència."
-#: engines/dialogs.cpp:301 engines/mohawk/dialogs.cpp:109
+#: engines/dialogs.cpp:307 engines/mohawk/dialogs.cpp:109
#: engines/mohawk/dialogs.cpp:170
msgid "~O~K"
msgstr "~D~'acord"
-#: engines/dialogs.cpp:302 engines/mohawk/dialogs.cpp:110
+#: engines/dialogs.cpp:308 engines/mohawk/dialogs.cpp:110
#: engines/mohawk/dialogs.cpp:171
msgid "~C~ancel"
msgstr "~C~ancel·la"
-#: engines/dialogs.cpp:305
+#: engines/dialogs.cpp:311
msgid "~K~eys"
msgstr "~T~ecles"
-#: engines/engine.cpp:240
+#: engines/engine.cpp:245
msgid "Could not initialize color format."
msgstr "No s'ha pogut iniciar el format de color."
-#: engines/engine.cpp:248
+#: engines/engine.cpp:253
msgid "Could not switch to video mode: '"
msgstr "No s'ha pogut canviar al mode de vídeo: '"
-#: engines/engine.cpp:257
+#: engines/engine.cpp:262
msgid "Could not apply aspect ratio setting."
msgstr "No s'ha pogut aplicar la configuració de la relació d'aspecte."
-#: engines/engine.cpp:262
+#: engines/engine.cpp:267
msgid "Could not apply fullscreen setting."
msgstr "No s'ha pogut aplicar l'ajust de pantalla completa."
-#: engines/engine.cpp:362
+#: engines/engine.cpp:367
msgid ""
"You appear to be playing this game directly\n"
"from the CD. This is known to cause problems,\n"
@@ -1360,7 +1362,7 @@ msgstr ""
"els fitxers de dades al disc dur.\n"
"Consulteu el fitxer README per a més detalls."
-#: engines/engine.cpp:373
+#: engines/engine.cpp:378
msgid ""
"This game has audio tracks in its disk. These\n"
"tracks need to be ripped from the disk using\n"
@@ -1374,7 +1376,7 @@ msgstr ""
"tal de poder sentir la música del joc.\n"
"Consulteu el fitxer README per a més detalls."
-#: engines/engine.cpp:431
+#: engines/engine.cpp:436
#, c-format
msgid ""
"Gamestate load failed (%s)! Please consult the README for basic information, "
@@ -1383,7 +1385,7 @@ msgstr ""
"No s'ha pogut carregar la partida (%s)! Consulteu el fitxer README per a la "
"informació bàsica i les instruccions sobre com obtenir més assistència."
-#: engines/engine.cpp:444
+#: engines/engine.cpp:449
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 "
@@ -1393,33 +1395,760 @@ msgstr ""
"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:447
+#: engines/engine.cpp:452
msgid "Start anyway"
msgstr "Inicia de totes maneres"
-#: engines/agi/detection.cpp:142 engines/drascula/detection.cpp:270
-#: engines/dreamweb/detection.cpp:47 engines/sci/detection.cpp:393
-#: engines/toltecs/detection.cpp:173
+#: audio/fmopl.cpp:50
+msgid "MAME OPL emulator"
+msgstr "Emulador OPL de MAME"
+
+#: audio/fmopl.cpp:52
+msgid "DOSBox OPL emulator"
+msgstr "Emulador OPL de DOSBox"
+
+#: audio/mididrv.cpp:209
+#, c-format
+msgid ""
+"The selected audio device '%s' was not found (e.g. might be turned off or "
+"disconnected)."
+msgstr ""
+"No s'ha pogut trobar el dispositiu d'àudio seleccionat '%s' (p.e. pot estar "
+"desactivat o desconnectat)."
+
+#: audio/mididrv.cpp:209 audio/mididrv.cpp:221 audio/mididrv.cpp:257
+#: audio/mididrv.cpp:272
+msgid "Attempting to fall back to the next available device..."
+msgstr "Provant de recórrer al següent dispositiu disponible..."
+
+#: audio/mididrv.cpp:221
+#, c-format
+msgid ""
+"The selected audio device '%s' cannot be used. See log file for more "
+"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:257
+#, c-format
+msgid ""
+"The preferred audio device '%s' was not found (e.g. might be turned off or "
+"disconnected)."
+msgstr ""
+"No s'ha pogut trobar el dispositiu d'àudio preferit '%s' (p.e. pot estar "
+"desactivat o desconnectat)."
+
+#: audio/mididrv.cpp:272
+#, c-format
+msgid ""
+"The preferred audio device '%s' cannot be used. See log file for more "
+"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:44
+msgid "No music"
+msgstr "Sense música"
+
+#: audio/mods/paula.cpp:196
+msgid "Amiga Audio Emulator"
+msgstr "Emulador d'àudio Amiga"
+
+#: audio/softsynth/adlib.cpp:2285
+msgid "AdLib Emulator"
+msgstr "Emulador d'AdLib"
+
+#: audio/softsynth/appleiigs.cpp:33
+msgid "Apple II GS Emulator (NOT IMPLEMENTED)"
+msgstr "Emulador d'Apple II GS (NO IMPLEMENTAT)"
+
+#: audio/softsynth/sid.cpp:1430
+msgid "C64 Audio Emulator"
+msgstr "Emulador d'àudio C64"
+
+#: audio/softsynth/mt32.cpp:200
+msgid "Initializing MT-32 Emulator"
+msgstr "Iniciant l'Emulador de MT-32"
+
+#: audio/softsynth/mt32.cpp:426
+msgid "MT-32 Emulator"
+msgstr "Emulador de MT-32"
+
+#: audio/softsynth/pcspk.cpp:139
+msgid "PC Speaker Emulator"
+msgstr "Emulador Altaveu PC"
+
+#: audio/softsynth/pcspk.cpp:158
+msgid "IBM PCjr Emulator"
+msgstr "Emulador d'IBM PCjr"
+
+#: backends/keymapper/remap-dialog.cpp:48
+msgid "Keymap:"
+msgstr "Assignacions de teclat:"
+
+#: backends/keymapper/remap-dialog.cpp:67
+msgid " (Effective)"
+msgstr " (Efectiu)"
+
+#: backends/keymapper/remap-dialog.cpp:107
+msgid " (Active)"
+msgstr " (Actiu)"
+
+#: backends/keymapper/remap-dialog.cpp:107
+msgid " (Blocked)"
+msgstr " (Bloquejat)"
+
+#: backends/keymapper/remap-dialog.cpp:120
+msgid " (Global)"
+msgstr " (Global)"
+
+#: backends/keymapper/remap-dialog.cpp:128
+msgid " (Game)"
+msgstr " (Joc)"
+
+#: backends/midi/windows.cpp:165
+msgid "Windows MIDI"
+msgstr "MIDI de Windows"
+
+#: backends/platform/ds/arm9/source/dsoptions.cpp:56
+#: engines/scumm/dialogs.cpp:291
+msgid "~C~lose"
+msgstr "~T~anca"
+
+#: backends/platform/ds/arm9/source/dsoptions.cpp:57
+msgid "ScummVM Main Menu"
+msgstr "Menú Principal de ScummVM"
+
+#: backends/platform/ds/arm9/source/dsoptions.cpp:63
+msgid "~L~eft handed mode"
+msgstr "Mode ~e~squerrà"
+
+#: backends/platform/ds/arm9/source/dsoptions.cpp:64
+msgid "~I~ndy fight controls"
+msgstr "Controls de lluita de l'~I~ndy"
+
+#: backends/platform/ds/arm9/source/dsoptions.cpp:65
+msgid "Show mouse cursor"
+msgstr "Mostra el cursor del ratolí"
+
+#: backends/platform/ds/arm9/source/dsoptions.cpp:66
+msgid "Snap to edges"
+msgstr "Enganxa a les vores"
+
+#: backends/platform/ds/arm9/source/dsoptions.cpp:68
+msgid "Touch X Offset"
+msgstr "Desplaçament X del toc"
+
+#: backends/platform/ds/arm9/source/dsoptions.cpp:75
+msgid "Touch Y Offset"
+msgstr "Desplaçament Y del toc"
+
+#: backends/platform/ds/arm9/source/dsoptions.cpp:87
+msgid "Use laptop trackpad-style cursor control"
+msgstr "Utilitza el control del cursor a l'estil del trackpad dels portàtils"
+
+#: backends/platform/ds/arm9/source/dsoptions.cpp:88
+msgid "Tap for left click, double tap right click"
+msgstr "Toc per a clic esquerre, doble toc per a clic dret"
+
+#: backends/platform/ds/arm9/source/dsoptions.cpp:90
+msgid "Sensitivity"
+msgstr "Sensibilitat"
+
+#: backends/platform/ds/arm9/source/dsoptions.cpp:99
+msgid "Initial top screen scale:"
+msgstr "Escalat inicial de la pantalla superior:"
+
+#: backends/platform/ds/arm9/source/dsoptions.cpp:105
+msgid "Main screen scaling:"
+msgstr "Escalat de la pantalla principal:"
+
+#: backends/platform/ds/arm9/source/dsoptions.cpp:107
+msgid "Hardware scale (fast, but low quality)"
+msgstr "Escalat per hardware (ràpid, però de baixa qualitat)"
+
+#: backends/platform/ds/arm9/source/dsoptions.cpp:108
+msgid "Software scale (good quality, but slower)"
+msgstr "Escalat per software (bona qualitat, però més lent)"
+
+#: backends/platform/ds/arm9/source/dsoptions.cpp:109
+msgid "Unscaled (you must scroll left and right)"
+msgstr "Sense escalar (haureu de desplaçar-vos a esquerra i dreta)"
+
+#: backends/platform/ds/arm9/source/dsoptions.cpp:111
+msgid "Brightness:"
+msgstr "Lluminositat:"
+
+#: backends/platform/ds/arm9/source/dsoptions.cpp:121
+msgid "High quality audio (slower) (reboot)"
+msgstr "Alta qualitat d'àudio (més lent) (reiniciar)"
+
+#: backends/platform/ds/arm9/source/dsoptions.cpp:122
+msgid "Disable power off"
+msgstr "Desactiva l'apagat automàtic"
+
+#: backends/platform/iphone/osys_events.cpp:300
+msgid "Mouse-click-and-drag mode enabled."
+msgstr "S'ha activat el mode de clic-i-arrossega."
+
+#: backends/platform/iphone/osys_events.cpp:302
+msgid "Mouse-click-and-drag mode disabled."
+msgstr "S'ha desactivat el mode clic-i-arrossega."
+
+#: backends/platform/iphone/osys_events.cpp:313
+msgid "Touchpad mode enabled."
+msgstr "Mode Touchpad activat."
+
+#: backends/platform/iphone/osys_events.cpp:315
+msgid "Touchpad mode disabled."
+msgstr "Mode Touchpad desactivat."
+
+#: backends/platform/maemo/maemo.cpp:209
+msgid "Click Mode"
+msgstr "Mode clic"
+
+#: backends/platform/maemo/maemo.cpp:215
+#: backends/platform/symbian/src/SymbianActions.cpp:42
+#: backends/platform/wince/CEActionsPocket.cpp:60
+#: backends/platform/wince/CEActionsSmartphone.cpp:43
+#: backends/platform/tizen/form.cpp:275
+msgid "Left Click"
+msgstr "Clic esquerre"
+
+#: backends/platform/maemo/maemo.cpp:218
+msgid "Middle Click"
+msgstr "Clic central"
+
+#: backends/platform/maemo/maemo.cpp:221
+#: backends/platform/symbian/src/SymbianActions.cpp:43
+#: backends/platform/wince/CEActionsSmartphone.cpp:44
+#: backends/platform/tizen/form.cpp:267
+msgid "Right Click"
+msgstr "Clic dret"
+
+#: backends/platform/sdl/macosx/appmenu_osx.mm:77
+msgid "Hide ScummVM"
+msgstr "Amaga ScummVM"
+
+#: backends/platform/sdl/macosx/appmenu_osx.mm:82
+msgid "Hide Others"
+msgstr "Oculta els altres"
+
+#: backends/platform/sdl/macosx/appmenu_osx.mm:87
+msgid "Show All"
+msgstr "Mostra-ho tot"
+
+#: backends/platform/sdl/macosx/appmenu_osx.mm:109
+#: backends/platform/sdl/macosx/appmenu_osx.mm:120
+msgid "Window"
+msgstr "Finestra"
+
+#: backends/platform/sdl/macosx/appmenu_osx.mm:114
+msgid "Minimize"
+msgstr "Minimitza"
+
+#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:46
+msgid "Normal (no scaling)"
+msgstr "Normal (sense escalar)"
+
+#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:65
+msgctxt "lowres"
+msgid "Normal (no scaling)"
+msgstr "Normal (no escalat)"
+
+#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2148
+msgid "Enabled aspect ratio correction"
+msgstr "S'ha activat la correcció de la relació d'aspecte"
+
+#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2154
+msgid "Disabled aspect ratio correction"
+msgstr "S'ha desactivat la correcció de la relació d'aspecte"
+
+#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2209
+msgid "Active graphics filter:"
+msgstr "Filtre de gràfics actiu:"
+
+#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2251
+msgid "Windowed mode"
+msgstr "Mode de finestra"
+
+#: backends/graphics/opengl/opengl-graphics.cpp:118
+#, fuzzy
+msgid "OpenGL"
+msgstr "Obre"
+
+#: backends/graphics/opengl/opengl-graphics.cpp:119
+msgid "OpenGL (No filtering)"
+msgstr ""
+
+#: backends/platform/symbian/src/SymbianActions.cpp:38
+#: backends/platform/wince/CEActionsSmartphone.cpp:39
+msgid "Up"
+msgstr "Amunt"
+
+#: backends/platform/symbian/src/SymbianActions.cpp:39
+#: backends/platform/wince/CEActionsSmartphone.cpp:40
+msgid "Down"
+msgstr "Avall"
+
+#: backends/platform/symbian/src/SymbianActions.cpp:40
+#: backends/platform/wince/CEActionsSmartphone.cpp:41
+msgid "Left"
+msgstr "Esquerra"
+
+#: backends/platform/symbian/src/SymbianActions.cpp:41
+#: backends/platform/wince/CEActionsSmartphone.cpp:42
+msgid "Right"
+msgstr "Dreta"
+
+#: backends/platform/symbian/src/SymbianActions.cpp:46
+#: backends/platform/wince/CEActionsSmartphone.cpp:47
+msgid "Zone"
+msgstr "Zona"
+
+#: backends/platform/symbian/src/SymbianActions.cpp:47
+#: backends/platform/wince/CEActionsPocket.cpp:54
+#: backends/platform/wince/CEActionsSmartphone.cpp:48
+msgid "Multi Function"
+msgstr "Funció Múltiple"
+
+#: backends/platform/symbian/src/SymbianActions.cpp:48
+msgid "Swap character"
+msgstr "Commuta el personatge"
+
+#: backends/platform/symbian/src/SymbianActions.cpp:49
+msgid "Skip text"
+msgstr "Salta el text"
+
+#: backends/platform/symbian/src/SymbianActions.cpp:51
+msgid "Fast mode"
+msgstr "Mode ràpid"
+
+#: 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:218
+#: engines/scumm/dialogs.cpp:192 engines/scumm/help.cpp:82
+#: engines/scumm/help.cpp:84
+msgid "Quit"
+msgstr "Surt"
+
+#: backends/platform/symbian/src/SymbianActions.cpp:53
+msgid "Debugger"
+msgstr "Depurador"
+
+#: backends/platform/symbian/src/SymbianActions.cpp:54
+msgid "Global menu"
+msgstr "Menú global"
+
+#: backends/platform/symbian/src/SymbianActions.cpp:55
+msgid "Virtual keyboard"
+msgstr "Teclat virtual"
+
+#: backends/platform/symbian/src/SymbianActions.cpp:56
+msgid "Key mapper"
+msgstr "Assignador de tecles"
+
+#: backends/events/symbiansdl/symbiansdl-events.cpp:184
+msgid "Do you want to quit ?"
+msgstr "Vols sortir?"
+
+#: backends/platform/wii/options.cpp:51
+msgid "Video"
+msgstr "Vídeo"
+
+#: backends/platform/wii/options.cpp:54
+msgid "Current video mode:"
+msgstr "Mode de vídeo actual:"
+
+#: backends/platform/wii/options.cpp:56
+msgid "Double-strike"
+msgstr "Double-strike"
+
+#: backends/platform/wii/options.cpp:60
+msgid "Horizontal underscan:"
+msgstr "Underscan horitzontal:"
+
+#: backends/platform/wii/options.cpp:66
+msgid "Vertical underscan:"
+msgstr "Underscan vertical:"
+
+#: backends/platform/wii/options.cpp:71
+msgid "Input"
+msgstr "Entrada"
+
+#: backends/platform/wii/options.cpp:74
+msgid "GC Pad sensitivity:"
+msgstr "Sensibilitat del Pad GC:"
+
+#: backends/platform/wii/options.cpp:80
+msgid "GC Pad acceleration:"
+msgstr "Acceleració del Pad GC:"
+
+#: backends/platform/wii/options.cpp:86
+msgid "DVD"
+msgstr "DVD"
+
+#: backends/platform/wii/options.cpp:89 backends/platform/wii/options.cpp:101
+msgid "Status:"
+msgstr "Estat:"
+
+#: backends/platform/wii/options.cpp:90 backends/platform/wii/options.cpp:102
+msgid "Unknown"
+msgstr "Desconegut"
+
+#: backends/platform/wii/options.cpp:93
+msgid "Mount DVD"
+msgstr "Munta el DVD"
+
+#: backends/platform/wii/options.cpp:94
+msgid "Unmount DVD"
+msgstr "Desmunta el DVD"
+
+#: backends/platform/wii/options.cpp:98
+msgid "SMB"
+msgstr "SMB"
+
+#: backends/platform/wii/options.cpp:106
+msgid "Server:"
+msgstr "Servidor:"
+
+#: backends/platform/wii/options.cpp:110
+msgid "Share:"
+msgstr "Compartició:"
+
+#: backends/platform/wii/options.cpp:114
+msgid "Username:"
+msgstr "Nom d'usuari:"
+
+#: backends/platform/wii/options.cpp:118
+msgid "Password:"
+msgstr "Contrasenya:"
+
+#: backends/platform/wii/options.cpp:121
+msgid "Init network"
+msgstr "Inicia la xarxa"
+
+#: backends/platform/wii/options.cpp:123
+msgid "Mount SMB"
+msgstr "Munta SMB"
+
+#: backends/platform/wii/options.cpp:124
+msgid "Unmount SMB"
+msgstr "Desmunta SMB"
+
+#: backends/platform/wii/options.cpp:143
+msgid "DVD Mounted successfully"
+msgstr "El DVD s'ha muntat satisfactòriament"
+
+#: backends/platform/wii/options.cpp:146
+msgid "Error while mounting the DVD"
+msgstr "Error al muntar el DVD"
+
+#: backends/platform/wii/options.cpp:148
+msgid "DVD not mounted"
+msgstr "El DVD no està muntat"
+
+#: backends/platform/wii/options.cpp:161
+msgid "Network up, share mounted"
+msgstr "Xarxa activa, compartició muntada"
+
+#: backends/platform/wii/options.cpp:163
+msgid "Network up"
+msgstr "Xarxa activa"
+
+#: backends/platform/wii/options.cpp:166
+msgid ", error while mounting the share"
+msgstr ", error al muntar la compartició"
+
+#: backends/platform/wii/options.cpp:168
+msgid ", share not mounted"
+msgstr ", compartició no muntada"
+
+#: backends/platform/wii/options.cpp:174
+msgid "Network down"
+msgstr "Xarxa inactiva"
+
+#: backends/platform/wii/options.cpp:178
+msgid "Initializing network"
+msgstr "Iniciant la xarxa"
+
+#: backends/platform/wii/options.cpp:182
+msgid "Timeout while initializing network"
+msgstr "S'ha excedit el temps d'iniciació de la xarxa"
+
+#: backends/platform/wii/options.cpp:186
+#, c-format
+msgid "Network not initialized (%d)"
+msgstr "Xarxa no iniciada (%d)"
+
+#: backends/platform/wince/CEActionsPocket.cpp:46
+msgid "Hide Toolbar"
+msgstr "Oculta la barra d'eines"
+
+#: backends/platform/wince/CEActionsPocket.cpp:47
+msgid "Show Keyboard"
+msgstr "Mostra el teclat"
+
+#: backends/platform/wince/CEActionsPocket.cpp:48
+msgid "Sound on/off"
+msgstr "So engegat/parat"
+
+#: backends/platform/wince/CEActionsPocket.cpp:49
+msgid "Right click"
+msgstr "Clic dret"
+
+#: backends/platform/wince/CEActionsPocket.cpp:50
+msgid "Show/Hide Cursor"
+msgstr "Mostra/Oculta el cursor"
+
+#: backends/platform/wince/CEActionsPocket.cpp:51
+msgid "Free look"
+msgstr "Vista lliure"
+
+#: backends/platform/wince/CEActionsPocket.cpp:52
+msgid "Zoom up"
+msgstr "Amplia"
+
+#: backends/platform/wince/CEActionsPocket.cpp:53
+msgid "Zoom down"
+msgstr "Redueix"
+
+#: backends/platform/wince/CEActionsPocket.cpp:55
+#: backends/platform/wince/CEActionsSmartphone.cpp:49
+msgid "Bind Keys"
+msgstr "Mapeja tecles"
+
+#: backends/platform/wince/CEActionsPocket.cpp:56
+msgid "Cursor Up"
+msgstr "Cursor Amunt"
+
+#: backends/platform/wince/CEActionsPocket.cpp:57
+msgid "Cursor Down"
+msgstr "Cursor Avall"
+
+#: backends/platform/wince/CEActionsPocket.cpp:58
+msgid "Cursor Left"
+msgstr "Cursor Esquerra"
+
+#: backends/platform/wince/CEActionsPocket.cpp:59
+msgid "Cursor Right"
+msgstr "Cursor Dreta"
+
+#: 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:326
+#: backends/platform/wince/CEActionsSmartphone.cpp:287
+msgid " Are you sure you want to quit ? "
+msgstr " Esteu segur de voler sortir? "
+
+#: backends/platform/wince/CEActionsSmartphone.cpp:50
+msgid "Keyboard"
+msgstr "Teclat"
+
+#: backends/platform/wince/CEActionsSmartphone.cpp:51
+msgid "Rotate"
+msgstr "Rotar"
+
+#: backends/platform/wince/CELauncherDialog.cpp:56
+msgid "Using SDL driver "
+msgstr "Utilitzant el controlador SDL "
+
+#: backends/platform/wince/CELauncherDialog.cpp:60
+msgid "Display "
+msgstr "Pantalla "
+
+#: 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:516
+msgid "Map right click action"
+msgstr "Assigna l'acció del clic dret"
+
+#: backends/platform/wince/wince-sdl.cpp:520
+msgid "You must map a key to the 'Right Click' action to play this game"
+msgstr "Heu d'assignar una tecla a l'acció 'Clic dret' per jugar a aquest joc"
+
+#: backends/platform/wince/wince-sdl.cpp:529
+msgid "Map hide toolbar action"
+msgstr "Assigna l'acció d'ocultar la barra d'eines"
+
+#: backends/platform/wince/wince-sdl.cpp:533
+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:542
+msgid "Map Zoom Up action (optional)"
+msgstr "Assigna l'acció d'Ampliar el Zoom (opcional)"
+
+#: backends/platform/wince/wince-sdl.cpp:545
+msgid "Map Zoom Down action (optional)"
+msgstr "Assigna l'acció de Reduir el Zoom (opcional)"
+
+#: backends/platform/wince/wince-sdl.cpp:553
+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:196
+msgid "Do you really want to return to the Launcher?"
+msgstr "Realment voleu tornar al Llançador?"
+
+#: backends/events/default/default-events.cpp:196
+msgid "Launcher"
+msgstr "Llançador"
+
+#: backends/events/default/default-events.cpp:218
+msgid "Do you really want to quit?"
+msgstr "Estàs segur de voler sortir?"
+
+#: backends/events/gph/gph-events.cpp:386
+#: backends/events/gph/gph-events.cpp:429
+#: backends/events/openpandora/op-events.cpp:168
+msgid "Touchscreen 'Tap Mode' - Left Click"
+msgstr "'Mode Toc' de pantalla tàctil - Clic esquerre"
+
+#: backends/events/gph/gph-events.cpp:388
+#: backends/events/gph/gph-events.cpp:431
+#: backends/events/openpandora/op-events.cpp:170
+msgid "Touchscreen 'Tap Mode' - Right Click"
+msgstr "'Mode Toc' de pantalla tàctil - Clic dret"
+
+#: backends/events/gph/gph-events.cpp:390
+#: backends/events/gph/gph-events.cpp:433
+#: backends/events/openpandora/op-events.cpp:172
+msgid "Touchscreen 'Tap Mode' - Hover (No Click)"
+msgstr "'Mode Toc' de pantalla tàctil - Flotant (sense clic)"
+
+#: backends/events/gph/gph-events.cpp:410
+msgid "Maximum Volume"
+msgstr "Volum màxim"
+
+#: backends/events/gph/gph-events.cpp:412
+msgid "Increasing Volume"
+msgstr "Pujant el volum"
+
+#: backends/events/gph/gph-events.cpp:418
+msgid "Minimal Volume"
+msgstr "Volum mínim"
+
+#: backends/events/gph/gph-events.cpp:420
+msgid "Decreasing Volume"
+msgstr "Baixant el volum"
+
+#: backends/events/openpandora/op-events.cpp:174
+msgid "Touchscreen 'Tap Mode' - Hover (DPad Clicks)"
+msgstr "'Mode Toc' de pantalla tàctil - Flotant (Clics de DPad)"
+
+#: backends/updates/macosx/macosx-updates.mm:67
+msgid "Check for Updates..."
+msgstr "Comprova les actualitzacions..."
+
+#: backends/platform/tizen/form.cpp:263
+msgid "Right Click Once"
+msgstr "Un clic dret"
+
+#: backends/platform/tizen/form.cpp:271
+msgid "Move Only"
+msgstr "Només mou"
+
+#: backends/platform/tizen/form.cpp:294
+msgid "Escape Key"
+msgstr "Tecla d'escapada"
+
+#: backends/platform/tizen/form.cpp:299
+msgid "Game Menu"
+msgstr "Menú del joc"
+
+#: backends/platform/tizen/form.cpp:304
+msgid "Show Keypad"
+msgstr "Mostra el teclat numèric"
+
+#: backends/platform/tizen/form.cpp:309
+msgid "Control Mouse"
+msgstr "Controla el ratolí"
+
+#: backends/events/maemosdl/maemosdl-events.cpp:192
+msgid "Clicking Enabled"
+msgstr "Clicat activat"
+
+#: backends/events/maemosdl/maemosdl-events.cpp:192
+msgid "Clicking Disabled"
+msgstr "Clicat desactivat"
+
+#: engines/agi/detection.cpp:142 engines/drascula/detection.cpp:302
+#: engines/dreamweb/detection.cpp:47 engines/neverhood/detection.cpp:160
+#: engines/sci/detection.cpp:394 engines/toltecs/detection.cpp:186
msgid "Use original save/load screens"
msgstr "Utilitza les pantalles originals de desat/càrrega"
-#: engines/agi/detection.cpp:143 engines/drascula/detection.cpp:271
-#: engines/dreamweb/detection.cpp:48 engines/sci/detection.cpp:394
-#: engines/toltecs/detection.cpp:174
+#: engines/agi/detection.cpp:143 engines/drascula/detection.cpp:303
+#: engines/dreamweb/detection.cpp:48 engines/neverhood/detection.cpp:161
+#: engines/sci/detection.cpp:395 engines/toltecs/detection.cpp:187
msgid "Use the original save/load screens, instead of the ScummVM ones"
msgstr ""
"Utilitza les pantalles originals de desat/càrrega, en lloc de les de ScummVM"
#: engines/agi/saveload.cpp:816 engines/drascula/saveload.cpp:349
-#: engines/sci/engine/kfile.cpp:841 engines/toltecs/menu.cpp:259
+#: engines/neverhood/menumodule.cpp:886 engines/sci/engine/kfile.cpp:857
+#: engines/toltecs/menu.cpp:256
msgid "Restore game:"
msgstr "Recupera la partida:"
#: engines/agi/saveload.cpp:816 engines/drascula/saveload.cpp:349
-#: engines/sci/engine/kfile.cpp:841 engines/toltecs/menu.cpp:259
+#: engines/neverhood/menumodule.cpp:886 engines/sci/engine/kfile.cpp:857
+#: engines/toltecs/menu.cpp:256
msgid "Restore"
msgstr "Restaura"
+#: engines/agos/saveload.cpp:160 engines/scumm/scumm.cpp:2321
+#, c-format
+msgid ""
+"Failed to load game state from file:\n"
+"\n"
+"%s"
+msgstr ""
+"No s'ha pogut carregar l'estat del joc del fitxer:\n"
+"\n"
+"%s"
+
+#: engines/agos/saveload.cpp:195 engines/scumm/scumm.cpp:2314
+#, c-format
+msgid ""
+"Failed to save game state to file:\n"
+"\n"
+"%s"
+msgstr ""
+"No s'ha pogut desar l'estat del joc al fitxer:\n"
+"\n"
+"%s"
+
+#: engines/agos/saveload.cpp:203 engines/scumm/scumm.cpp:2332
+#, c-format
+msgid ""
+"Successfully saved game state in file:\n"
+"\n"
+"%s"
+msgstr ""
+"S'ha desat l'estat del joc en el fitxer:\n"
+"\n"
+"%s"
+
+#: engines/agos/animation.cpp:557
+#, c-format
+msgid "Cutscene file '%s' not found!"
+msgstr "No s'ha trobat el fitxer d'escena '%s'!"
+
#: engines/drascula/saveload.cpp:47
msgid ""
"ScummVM found that you have old savefiles for Drascula that should be "
@@ -1446,27 +2175,304 @@ msgstr "Utilitza el mode de paleta brillant"
msgid "Display graphics using the game's bright palette"
msgstr "Mostra els gràfics utilitzant la paleta brillant del joc"
-#: engines/sci/detection.cpp:373
+#: engines/gob/inter_playtoons.cpp:256 engines/gob/inter_v2.cpp:1470
+#: engines/tinsel/saveload.cpp:532
+msgid "Failed to load game state from file."
+msgstr "No s'ha pogut carregar l'estat del joc del fitxer."
+
+#: engines/gob/inter_v2.cpp:1540 engines/tinsel/saveload.cpp:545
+msgid "Failed to save game state to file."
+msgstr "No s'ha pogut desar l'estat del joc al fitxer."
+
+#: engines/gob/inter_v5.cpp:107
+msgid "Failed to delete file."
+msgstr "No s'ha pogut esborrar el fitxer."
+
+#: engines/groovie/detection.cpp:312
+msgid "Fast movie speed"
+msgstr "Velocitat ràpida de les pel·lícules"
+
+#: engines/groovie/detection.cpp:313
+msgid "Play movies at an increased speed"
+msgstr "Reprodueix les pel·lícules a major velocitat"
+
+#: engines/groovie/script.cpp:399
+msgid "Failed to save game"
+msgstr "No s'ha pogut desar l'estat del joc"
+
+#. I18N: Studio audience adds an applause and cheering sounds whenever
+#. Malcolm makes a joke.
+#: engines/kyra/detection.cpp:62
+msgid "Studio audience"
+msgstr "Públic"
+
+#: engines/kyra/detection.cpp:63
+msgid "Enable studio audience"
+msgstr "Activa el públic"
+
+#. I18N: This option allows the user to skip text and cutscenes.
+#: engines/kyra/detection.cpp:73
+msgid "Skip support"
+msgstr "Suport per saltar text i escenes"
+
+#: engines/kyra/detection.cpp:74
+msgid "Allow text and cutscenes to be skipped"
+msgstr "Permet que se saltin textos i escenes"
+
+#. I18N: Helium mode makes people sound like they've inhaled Helium.
+#: engines/kyra/detection.cpp:84
+msgid "Helium mode"
+msgstr "Mode heli"
+
+#: engines/kyra/detection.cpp:85
+msgid "Enable helium mode"
+msgstr "Activa el mode heli"
+
+#. I18N: When enabled, this option makes scrolling smoother when
+#. changing from one screen to another.
+#: engines/kyra/detection.cpp:99
+msgid "Smooth scrolling"
+msgstr "Desplaçament suau"
+
+#: engines/kyra/detection.cpp:100
+msgid "Enable smooth scrolling when walking"
+msgstr "Activa el desplaçament suau al caminar"
+
+#. I18N: When enabled, this option changes the cursor when it floats to the
+#. edge of the screen to a directional arrow. The player can then click to
+#. walk towards that direction.
+#: engines/kyra/detection.cpp:112
+msgid "Floating cursors"
+msgstr "Cursor flotant"
+
+#: engines/kyra/detection.cpp:113
+msgid "Enable floating cursors"
+msgstr "Activa els cursors flotants"
+
+#. I18N: HP stands for Hit Points
+#: engines/kyra/detection.cpp:127
+msgid "HP bar graphs"
+msgstr "Barra gràfica de PI"
+
+#: engines/kyra/detection.cpp:128
+msgid "Enable hit point bar graphs"
+msgstr "Activa la barra gràfica dels punts d'impacte"
+
+#: engines/kyra/lol.cpp:478
+msgid "Attack 1"
+msgstr "Atac 1"
+
+#: engines/kyra/lol.cpp:479
+msgid "Attack 2"
+msgstr "Atac 2"
+
+#: engines/kyra/lol.cpp:480
+msgid "Attack 3"
+msgstr "Atac 3"
+
+#: engines/kyra/lol.cpp:481
+msgid "Move Forward"
+msgstr "Mou endavant"
+
+#: engines/kyra/lol.cpp:482
+msgid "Move Back"
+msgstr "Mou enrere"
+
+#: engines/kyra/lol.cpp:483
+msgid "Slide Left"
+msgstr "Mou a l'esquerra"
+
+#: engines/kyra/lol.cpp:484
+msgid "Slide Right"
+msgstr "Mou a la dreta"
+
+#: engines/kyra/lol.cpp:485 engines/pegasus/pegasus.cpp:2509
+msgid "Turn Left"
+msgstr "Gira a l'esquerra"
+
+#: engines/kyra/lol.cpp:486 engines/pegasus/pegasus.cpp:2510
+msgid "Turn Right"
+msgstr "Gira a la dreta"
+
+#: engines/kyra/lol.cpp:487
+msgid "Rest"
+msgstr "Descansa"
+
+#: engines/kyra/lol.cpp:488
+msgid "Options"
+msgstr "Opcions"
+
+#: engines/kyra/lol.cpp:489
+msgid "Choose Spell"
+msgstr "Escull l'encanteri"
+
+#: engines/kyra/sound_midi.cpp:477
+msgid ""
+"You appear to be using a General MIDI device,\n"
+"but your game only supports Roland MT32 MIDI.\n"
+"We try to map the Roland MT32 instruments to\n"
+"General MIDI ones. It is still possible that\n"
+"some tracks sound incorrect."
+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."
+
+#. I18N: Option for fast scene switching
+#: engines/mohawk/dialogs.cpp:92 engines/mohawk/dialogs.cpp:167
+msgid "~Z~ip Mode Activated"
+msgstr "Mode ~Z~ip activat"
+
+#: engines/mohawk/dialogs.cpp:93
+msgid "~T~ransitions Enabled"
+msgstr "~T~ransicions activades"
+
+#. I18N: Drop book page
+#: engines/mohawk/dialogs.cpp:95
+msgid "~D~rop Page"
+msgstr "~D~escarta la pàgina"
+
+#: engines/mohawk/dialogs.cpp:99
+msgid "~S~how Map"
+msgstr "~M~ostra el mapa"
+
+#: engines/mohawk/dialogs.cpp:105
+msgid "~M~ain Menu"
+msgstr "~M~enú Principal"
+
+#: engines/mohawk/dialogs.cpp:168
+msgid "~W~ater Effect Enabled"
+msgstr "~E~fecte de l'aigua activat"
+
+#: engines/neverhood/detection.cpp:167
+msgid "Skip the Hall of Records storyboard scenes"
+msgstr ""
+
+#: engines/neverhood/detection.cpp:168
+msgid "Allows the player to skip past the Hall of Records storyboard scenes"
+msgstr ""
+
+#: engines/neverhood/detection.cpp:174
+msgid "Scale the making of videos to full screen"
+msgstr ""
+
+#: engines/neverhood/detection.cpp:175
+msgid "Scale the making of videos, so that they use the whole screen"
+msgstr ""
+
+#: engines/parallaction/saveload.cpp:133
+#, c-format
+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:204
+msgid "Loading game..."
+msgstr "Carregant la partida..."
+
+#: engines/parallaction/saveload.cpp:219
+msgid "Saving game..."
+msgstr "Desant la partida..."
+
+#: engines/parallaction/saveload.cpp:272
+msgid ""
+"ScummVM found that you have old savefiles for Nippon Safes that should be "
+"renamed.\n"
+"The old names are 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 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:319
+msgid "ScummVM successfully converted all your savefiles."
+msgstr "ScummVM ha convertit satisfactòriament totes les partides desades."
+
+#: engines/parallaction/saveload.cpp:321
+msgid ""
+"ScummVM printed some warnings in your console window and can't guarantee all "
+"your files have been converted.\n"
+"\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."
+
+#: engines/pegasus/pegasus.cpp:714
+msgid "Invalid save file name"
+msgstr "Nom de partida desada incorrecte"
+
+#: engines/pegasus/pegasus.cpp:2507
+msgid "Up/Zoom In/Move Forward/Open Doors"
+msgstr "Amunt/Amplia el zoom/Mou endavant/Obre les portes"
+
+#: engines/pegasus/pegasus.cpp:2508
+msgid "Down/Zoom Out"
+msgstr "Avall/Allunya el zoom"
+
+#: engines/pegasus/pegasus.cpp:2511
+msgid "Display/Hide Inventory Tray"
+msgstr "Mostra/Oculta la safata d'inventari"
+
+#: engines/pegasus/pegasus.cpp:2512
+msgid "Display/Hide Biochip Tray"
+msgstr "Mostra/Oculta la safata del Biochip"
+
+#: engines/pegasus/pegasus.cpp:2513
+msgid "Action/Select"
+msgstr "Acció/Selecció"
+
+#: engines/pegasus/pegasus.cpp:2514
+msgid "Toggle Center Data Display"
+msgstr "Conmuta la visualització de dades central"
+
+#: engines/pegasus/pegasus.cpp:2515
+msgid "Display/Hide Info Screen"
+msgstr "Mostra/Oculta la pantalla d'informació"
+
+#: engines/pegasus/pegasus.cpp:2516
+msgid "Display/Hide Pause Menu"
+msgstr "Mostra/Oculta el menú de pausa"
+
+#: engines/pegasus/pegasus.cpp:2517
+msgid "???"
+msgstr "???"
+
+#: engines/sci/detection.cpp:374
msgid "EGA undithering"
msgstr "Elimina el tramat d'EGA"
-#: engines/sci/detection.cpp:374
+#: engines/sci/detection.cpp:375
msgid "Enable undithering in EGA games"
msgstr "Activa l'eliminació del tramat en els jocs EGA"
-#: engines/sci/detection.cpp:383
+#: engines/sci/detection.cpp:384
msgid "Prefer digital sound effects"
msgstr "Prefereix efectes de so digitals"
-#: engines/sci/detection.cpp:384
+#: engines/sci/detection.cpp:385
msgid "Prefer digital sound effects instead of synthesized ones"
msgstr "Prefereix els efectes de so digitals en lloc dels sintetitzats"
-#: engines/sci/detection.cpp:403
+#: engines/sci/detection.cpp:404
msgid "Use IMF/Yamaha FB-01 for MIDI output"
msgstr "Utilitza IMF/Yamaha FB-01 per la sortida MIDI"
-#: engines/sci/detection.cpp:404
+#: engines/sci/detection.cpp:405
msgid ""
"Use an IBM Music Feature card or a Yamaha FB-01 FM synth module for MIDI "
"output"
@@ -1474,168 +2480,150 @@ msgstr ""
"Utilitza una tarja IBM Music Feature o un mòdul sintetitzador Yamaha FB-01 "
"FM per la sortida MIDI"
-#: engines/sci/detection.cpp:414
+#: engines/sci/detection.cpp:415
msgid "Use CD audio"
msgstr "Utilitza l'àudio del CD"
-#: engines/sci/detection.cpp:415
+#: engines/sci/detection.cpp:416
msgid "Use CD audio instead of in-game audio, if available"
msgstr ""
"Utilitza l'àudio del CD en lloc de l'àudio intern del joc, si està disponible"
-#: engines/sci/detection.cpp:425
+#: engines/sci/detection.cpp:426
msgid "Use Windows cursors"
msgstr "Utilitza els cursors de Windows"
-#: engines/sci/detection.cpp:426
+#: engines/sci/detection.cpp:427
msgid ""
"Use the Windows cursors (smaller and monochrome) instead of the DOS ones"
msgstr ""
"Utilitza els cursors de Windows (més petits i en blanc i negre) en lloc dels "
"de DOS"
-#: engines/sci/detection.cpp:436
+#: engines/sci/detection.cpp:437
msgid "Use silver cursors"
msgstr "Utilitza cursors platejats"
-#: engines/sci/detection.cpp:437
+#: engines/sci/detection.cpp:438
msgid ""
"Use the alternate set of silver cursors, instead of the normal golden ones"
msgstr ""
"Utilitza el conjunt alternatiu de cursors platejats, en lloc dels normals "
"daurats"
-#: engines/scumm/dialogs.cpp:175
+#: engines/scumm/dialogs.cpp:176
#, 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
+#: engines/scumm/dialogs.cpp:177
#, 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
+#: engines/scumm/dialogs.cpp:178
#, 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
+#: engines/scumm/dialogs.cpp:179
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
+#: engines/scumm/dialogs.cpp:183
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
+#: engines/scumm/dialogs.cpp:185
msgid "Are you sure you want to quit? (Y/N)"
msgstr "Esteu segur de voler sortir? (S/N)S"
-#: engines/scumm/dialogs.cpp:189
+#: engines/scumm/dialogs.cpp:190
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:215
-msgid "Quit"
-msgstr "Surt"
-
-#: engines/scumm/dialogs.cpp:193
+#: engines/scumm/dialogs.cpp:194
msgid "Insert save/load game disk"
msgstr "Inseriu el disc de partides desades"
-#: engines/scumm/dialogs.cpp:194
+#: engines/scumm/dialogs.cpp:195
msgid "You must enter a name"
msgstr "Heu d'introduir un nom"
-#: engines/scumm/dialogs.cpp:195
+#: engines/scumm/dialogs.cpp:196
msgid "The game was NOT saved (disk full?)"
msgstr "La partida NO s'ha desat (el disc està ple?)"
-#: engines/scumm/dialogs.cpp:196
+#: engines/scumm/dialogs.cpp:197
msgid "The game was NOT loaded"
msgstr "La partida NO s'ha desat"
-#: engines/scumm/dialogs.cpp:197
+#: engines/scumm/dialogs.cpp:198
#, c-format
msgid "Saving '%s'"
msgstr "Desant '%s'"
-#: engines/scumm/dialogs.cpp:198
+#: engines/scumm/dialogs.cpp:199
#, c-format
msgid "Loading '%s'"
msgstr "Carregant '%s'"
-#: engines/scumm/dialogs.cpp:199
+#: engines/scumm/dialogs.cpp:200
msgid "Name your SAVE game"
msgstr "Anomeneu la partida DESADA"
-#: engines/scumm/dialogs.cpp:200
+#: engines/scumm/dialogs.cpp:201
msgid "Select a game to LOAD"
msgstr "Seleccioneu una partida per CARREGAR"
-#: engines/scumm/dialogs.cpp:201
+#: engines/scumm/dialogs.cpp:202
msgid "Game title)"
msgstr "Títol del joc)"
#. I18N: Previous page button
-#: engines/scumm/dialogs.cpp:287
+#: engines/scumm/dialogs.cpp:288
msgid "~P~revious"
msgstr "~A~nterior"
#. I18N: Next page button
-#: engines/scumm/dialogs.cpp:289
+#: engines/scumm/dialogs.cpp:290
msgid "~N~ext"
msgstr "~S~egüent"
-#: engines/scumm/dialogs.cpp:290
-#: backends/platform/ds/arm9/source/dsoptions.cpp:56
-msgid "~C~lose"
-msgstr "~T~anca"
-
-#: engines/scumm/dialogs.cpp:597
+#: engines/scumm/dialogs.cpp:598
msgid "Speech Only"
msgstr "Només veus"
-#: engines/scumm/dialogs.cpp:598
+#: engines/scumm/dialogs.cpp:599
msgid "Speech and Subtitles"
msgstr "Veu i subtítols"
-#: engines/scumm/dialogs.cpp:599
+#: engines/scumm/dialogs.cpp:600
msgid "Subtitles Only"
msgstr "Només subtítols"
-#: engines/scumm/dialogs.cpp:607
+#: engines/scumm/dialogs.cpp:608
msgctxt "lowres"
msgid "Speech & Subs"
msgstr "Veus i sub."
-#: engines/scumm/dialogs.cpp:653
+#: engines/scumm/dialogs.cpp:654
msgid "Select a Proficiency Level."
msgstr "Seleccioneu el nivell de competència."
-#: engines/scumm/dialogs.cpp:655
+#: engines/scumm/dialogs.cpp:656
msgid "Refer to your Loom(TM) manual for help."
msgstr "Consulteu el manual de Loom(TM) per ajuda."
-#: engines/scumm/dialogs.cpp:658
-msgid "Standard"
-msgstr "Estàndard"
-
-#: engines/scumm/dialogs.cpp:659
+#: engines/scumm/dialogs.cpp:660
msgid "Practice"
msgstr "Pràctica"
-#: engines/scumm/dialogs.cpp:660
+#: engines/scumm/dialogs.cpp:661
msgid "Expert"
msgstr "Expert"
@@ -2152,7 +3140,7 @@ msgstr "Vola a la dreta"
msgid "Fly to lower right"
msgstr "Vola avall i a la dreta"
-#: engines/scumm/scumm.cpp:1776
+#: engines/scumm/scumm.cpp:1777
#, c-format
msgid ""
"Native MIDI support requires the Roland Upgrade from LucasArts,\n"
@@ -2161,40 +3149,7 @@ 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:2303 engines/agos/saveload.cpp:220
-#, c-format
-msgid ""
-"Failed to save game state to file:\n"
-"\n"
-"%s"
-msgstr ""
-"No s'ha pogut desar l'estat del joc al fitxer:\n"
-"\n"
-"%s"
-
-#: engines/scumm/scumm.cpp:2310 engines/agos/saveload.cpp:185
-#, c-format
-msgid ""
-"Failed to load game state from file:\n"
-"\n"
-"%s"
-msgstr ""
-"No s'ha pogut carregar l'estat del joc del fitxer:\n"
-"\n"
-"%s"
-
-#: engines/scumm/scumm.cpp:2322 engines/agos/saveload.cpp:228
-#, c-format
-msgid ""
-"Successfully saved game state in file:\n"
-"\n"
-"%s"
-msgstr ""
-"S'ha desat l'estat del joc en el fitxer:\n"
-"\n"
-"%s"
-
-#: engines/scumm/scumm.cpp:2537
+#: engines/scumm/scumm.cpp:2547
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' "
@@ -2204,190 +3159,6 @@ msgstr ""
"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."
-#. I18N: Option for fast scene switching
-#: engines/mohawk/dialogs.cpp:92 engines/mohawk/dialogs.cpp:167
-msgid "~Z~ip Mode Activated"
-msgstr "Mode ~Z~ip activat"
-
-#: engines/mohawk/dialogs.cpp:93
-msgid "~T~ransitions Enabled"
-msgstr "~T~ransicions activades"
-
-#. I18N: Drop book page
-#: engines/mohawk/dialogs.cpp:95
-msgid "~D~rop Page"
-msgstr "~D~escarta la pàgina"
-
-#: engines/mohawk/dialogs.cpp:99
-msgid "~S~how Map"
-msgstr "~M~ostra el mapa"
-
-#: engines/mohawk/dialogs.cpp:105
-msgid "~M~ain Menu"
-msgstr "~M~enú Principal"
-
-#: engines/mohawk/dialogs.cpp:168
-msgid "~W~ater Effect Enabled"
-msgstr "~E~fecte de l'aigua activat"
-
-#: engines/agos/animation.cpp:557
-#, c-format
-msgid "Cutscene file '%s' not found!"
-msgstr "No s'ha trobat el fitxer d'escena '%s'!"
-
-#: engines/gob/inter_playtoons.cpp:256 engines/gob/inter_v2.cpp:1287
-#: engines/tinsel/saveload.cpp:532
-msgid "Failed to load game state from file."
-msgstr "No s'ha pogut carregar l'estat del joc del fitxer."
-
-#: engines/gob/inter_v2.cpp:1357 engines/tinsel/saveload.cpp:545
-msgid "Failed to save game state to file."
-msgstr "No s'ha pogut desar l'estat del joc al fitxer."
-
-#: engines/gob/inter_v5.cpp:107
-msgid "Failed to delete file."
-msgstr "No s'ha pogut esborrar el fitxer."
-
-#: engines/groovie/detection.cpp:312
-msgid "Fast movie speed"
-msgstr "Velocitat ràpida de les pel·lícules"
-
-#: engines/groovie/detection.cpp:313
-msgid "Play movies at an increased speed"
-msgstr "Reprodueix les pel·lícules a major velocitat"
-
-#: engines/groovie/script.cpp:420
-msgid "Failed to save game"
-msgstr "No s'ha pogut desar l'estat del joc"
-
-#. I18N: Studio audience adds an applause and cheering sounds whenever
-#. Malcolm makes a joke.
-#: engines/kyra/detection.cpp:62
-msgid "Studio audience"
-msgstr "Públic"
-
-#: engines/kyra/detection.cpp:63
-msgid "Enable studio audience"
-msgstr "Activa el públic"
-
-#. I18N: This option allows the user to skip text and cutscenes.
-#: engines/kyra/detection.cpp:73
-msgid "Skip support"
-msgstr "Suport per saltar text i escenes"
-
-#: engines/kyra/detection.cpp:74
-msgid "Allow text and cutscenes to be skipped"
-msgstr "Permet que se saltin textos i escenes"
-
-#. I18N: Helium mode makes people sound like they've inhaled Helium.
-#: engines/kyra/detection.cpp:84
-msgid "Helium mode"
-msgstr "Mode heli"
-
-#: engines/kyra/detection.cpp:85
-msgid "Enable helium mode"
-msgstr "Activa el mode heli"
-
-#. I18N: When enabled, this option makes scrolling smoother when
-#. changing from one screen to another.
-#: engines/kyra/detection.cpp:99
-msgid "Smooth scrolling"
-msgstr "Desplaçament suau"
-
-#: engines/kyra/detection.cpp:100
-msgid "Enable smooth scrolling when walking"
-msgstr "Activa el desplaçament suau al caminar"
-
-#. I18N: When enabled, this option changes the cursor when it floats to the
-#. edge of the screen to a directional arrow. The player can then click to
-#. walk towards that direction.
-#: engines/kyra/detection.cpp:112
-msgid "Floating cursors"
-msgstr "Cursor flotant"
-
-#: engines/kyra/detection.cpp:113
-msgid "Enable floating cursors"
-msgstr "Activa els cursors flotants"
-
-#. I18N: HP stands for Hit Points
-#: engines/kyra/detection.cpp:127
-msgid "HP bar graphs"
-msgstr "Barra gràfica de PI"
-
-#: engines/kyra/detection.cpp:128
-msgid "Enable hit point bar graphs"
-msgstr "Activa la barra gràfica dels punts d'impacte"
-
-#: engines/kyra/lol.cpp:478
-msgid "Attack 1"
-msgstr "Atac 1"
-
-#: engines/kyra/lol.cpp:479
-msgid "Attack 2"
-msgstr "Atac 2"
-
-#: engines/kyra/lol.cpp:480
-msgid "Attack 3"
-msgstr "Atac 3"
-
-#: engines/kyra/lol.cpp:481
-msgid "Move Forward"
-msgstr "Mou endavant"
-
-#: engines/kyra/lol.cpp:482
-msgid "Move Back"
-msgstr "Mou enrere"
-
-#: engines/kyra/lol.cpp:483
-msgid "Slide Left"
-msgstr "Mou a l'esquerra"
-
-#: engines/kyra/lol.cpp:484
-msgid "Slide Right"
-msgstr "Mou a la dreta"
-
-#: engines/kyra/lol.cpp:485 engines/pegasus/pegasus.cpp:2447
-msgid "Turn Left"
-msgstr "Gira a l'esquerra"
-
-#: engines/kyra/lol.cpp:486 engines/pegasus/pegasus.cpp:2448
-msgid "Turn Right"
-msgstr "Gira a la dreta"
-
-#: engines/kyra/lol.cpp:487
-msgid "Rest"
-msgstr "Descansa"
-
-#: engines/kyra/lol.cpp:488
-msgid "Options"
-msgstr "Opcions"
-
-#: engines/kyra/lol.cpp:489
-msgid "Choose Spell"
-msgstr "Escull l'encanteri"
-
-#: engines/kyra/sound_midi.cpp:477
-msgid ""
-"You appear to be using a General MIDI device,\n"
-"but your game only supports Roland MT32 MIDI.\n"
-"We try to map the Roland MT32 instruments to\n"
-"General MIDI ones. It is still possible that\n"
-"some tracks sound incorrect."
-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/queen/queen.cpp:59
-msgid "Alternative intro"
-msgstr "Introducció alternativa"
-
-#: engines/queen/queen.cpp:60
-msgid "Use an alternative game intro (CD version only)"
-msgstr "Utilitza una introducció del joc alternativa (només per la versió CD)"
-
#: engines/sky/compact.cpp:130
msgid ""
"Unable to find \"sky.cpt\" file!\n"
@@ -2413,22 +3184,25 @@ msgid "Use the floppy version's intro (CD version only)"
msgstr ""
"Utilitza la introducció de la versió de disquets (només per a la versió CD)"
-#: engines/sword1/animation.cpp:519
+#: engines/sword1/animation.cpp:524
#, c-format
msgid "PSX stream cutscene '%s' cannot be played in paletted mode"
msgstr "L'escena '%s' de PSX no es pot reproduir en mode paleta"
-#: engines/sword1/animation.cpp:540 engines/sword2/animation.cpp:439
+#: engines/sword1/animation.cpp:545 engines/sword2/animation.cpp:445
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:550 engines/sword2/animation.cpp:449
-msgid "MPEG2 cutscenes are no longer supported"
-msgstr "Les escenes MPEG2 ja no estan suportades"
+#: engines/sword1/animation.cpp:561
+#, fuzzy
+msgid "MPEG-2 cutscenes found but ScummVM has been built without MPEG-2"
+msgstr ""
+"S'han trobat escenes de PSX, però s'ha compilat el ScummVM sense suport de "
+"color RGB"
-#: engines/sword1/animation.cpp:556 engines/sword2/animation.cpp:457
+#: engines/sword1/animation.cpp:568 engines/sword2/animation.cpp:470
#, c-format
msgid "Cutscene '%s' not found"
msgstr "No s'ha trobat l'escena '%s'"
@@ -2472,13 +3246,21 @@ msgstr "Mantingues el nou"
msgid "This is the end of the Broken Sword 1 Demo"
msgstr "Aquest és el final de la Demo del Broken Sword 1"
-#: engines/sword2/animation.cpp:419
+#: engines/sword2/animation.cpp:425
msgid ""
"PSX cutscenes found but ScummVM has been built without RGB color support"
msgstr ""
"S'han trobat escenes de PSX, però s'ha compilat el ScummVM sense suport de "
"color RGB"
+#: engines/sword2/animation.cpp:461
+#, fuzzy
+msgid ""
+"MPEG-2 cutscenes found but ScummVM has been built without MPEG-2 support"
+msgstr ""
+"S'han trobat escenes en DXA, però s'ha compilat el ScummVM sense suport de "
+"zlib"
+
#: engines/sword2/sword2.cpp:79
msgid "Show object labels"
msgstr "Mostra les etiquetes dels objectes"
@@ -2487,12 +3269,12 @@ msgstr "Mostra les etiquetes dels objectes"
msgid "Show labels for objects on mouse hover"
msgstr "Mostra etiquetes al posar el ratolí sobre els objectes"
-#: engines/teenagent/resources.cpp:94
+#: engines/teenagent/resources.cpp:95
msgid ""
"You're missing the 'teenagent.dat' file. Get it from the ScummVM website"
msgstr "Us falta el fitxer 'teenagent.dat'. Obteniu-lo a la pàgina de ScummVM"
-#: engines/teenagent/resources.cpp:115
+#: engines/teenagent/resources.cpp:116
msgid ""
"The teenagent.dat file is compressed and zlib hasn't been included in this "
"executable. Please decompress it"
@@ -2500,790 +3282,52 @@ msgstr ""
"El fitxer teenagent.dat està comprimit però aquest executable no conté zlib. "
"Descomprimiu-lo, si us plau."
-#: engines/parallaction/saveload.cpp:133
-#, c-format
-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:204
-msgid "Loading game..."
-msgstr "Carregant la partida..."
-
-#: engines/parallaction/saveload.cpp:219
-msgid "Saving game..."
-msgstr "Desant la partida..."
-
-#: engines/parallaction/saveload.cpp:272
-msgid ""
-"ScummVM found that you have old savefiles for Nippon Safes that should be "
-"renamed.\n"
-"The old names are 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 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:319
-msgid "ScummVM successfully converted all your savefiles."
-msgstr "ScummVM ha convertit satisfactòriament totes les partides desades."
-
-#: engines/parallaction/saveload.cpp:321
-msgid ""
-"ScummVM printed some warnings in your console window and can't guarantee all "
-"your files have been converted.\n"
-"\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."
-
-#: engines/pegasus/pegasus.cpp:679
-msgid "Invalid save file name"
-msgstr "Nom de partida desada incorrecte"
-
-#: engines/pegasus/pegasus.cpp:2445
-msgid "Up/Zoom In/Move Forward/Open Doors"
-msgstr "Amunt/Amplia el zoom/Mou endavant/Obre les portes"
-
-#: engines/pegasus/pegasus.cpp:2446
-msgid "Down/Zoom Out"
-msgstr "Avall/Allunya el zoom"
-
-#: engines/pegasus/pegasus.cpp:2449
-msgid "Display/Hide Inventory Tray"
-msgstr "Mostra/Oculta la safata d'inventari"
-
-#: engines/pegasus/pegasus.cpp:2450
-msgid "Display/Hide Biochip Tray"
-msgstr "Mostra/Oculta la safata del Biochip"
-
-#: engines/pegasus/pegasus.cpp:2451
-msgid "Action/Select"
-msgstr "Acció/Selecció"
-
-#: engines/pegasus/pegasus.cpp:2452
-msgid "Toggle Center Data Display"
-msgstr "Conmuta la visualització de dades central"
-
-#: engines/pegasus/pegasus.cpp:2453
-msgid "Display/Hide Info Screen"
-msgstr "Mostra/Oculta la pantalla d'informació"
-
-#: engines/pegasus/pegasus.cpp:2454
-msgid "Display/Hide Pause Menu"
-msgstr "Mostra/Oculta el menú de pausa"
-
-#: engines/pegasus/pegasus.cpp:2455
-msgid "???"
-msgstr "???"
-
-#: audio/fmopl.cpp:49
-msgid "MAME OPL emulator"
-msgstr "Emulador OPL de MAME"
-
-#: audio/fmopl.cpp:51
-msgid "DOSBox OPL emulator"
-msgstr "Emulador OPL de DOSBox"
-
-#: audio/mididrv.cpp:209
-#, c-format
-msgid ""
-"The selected audio device '%s' was not found (e.g. might be turned off or "
-"disconnected)."
-msgstr ""
-"No s'ha pogut trobar el dispositiu d'àudio seleccionat '%s' (p.e. pot estar "
-"desactivat o desconnectat)."
-
-#: audio/mididrv.cpp:209 audio/mididrv.cpp:221 audio/mididrv.cpp:257
-#: audio/mididrv.cpp:272
-msgid "Attempting to fall back to the next available device..."
-msgstr "Provant de recórrer al següent dispositiu disponible..."
+#~ msgctxt "lowres"
+#~ msgid "Mass Add..."
+#~ msgstr "Afegeix Jocs"
-#: audio/mididrv.cpp:221
-#, c-format
-msgid ""
-"The selected audio device '%s' cannot be used. See log file for more "
-"information."
-msgstr ""
-"No es pot utilitzar el dispositiu d'àudio seleccionat '%s'. Vegeu el fitxer "
-"de registre per a més informació."
+#~ msgid "Mass Add..."
+#~ msgstr "Addició Massiva..."
-#: audio/mididrv.cpp:257
-#, c-format
-msgid ""
-"The preferred audio device '%s' was not found (e.g. might be turned off or "
-"disconnected)."
-msgstr ""
-"No s'ha pogut trobar el dispositiu d'àudio preferit '%s' (p.e. pot estar "
-"desactivat o desconnectat)."
+#~ msgid ""
+#~ "Turns off General MIDI mapping for games with Roland MT-32 soundtrack"
+#~ msgstr ""
+#~ "Desactiva la conversió General MIDI pels jocs que tenen banda sonora per "
+#~ "a Roland MT-32"
-#: audio/mididrv.cpp:272
-#, c-format
-msgid ""
-"The preferred audio device '%s' cannot be used. See log file for more "
-"information."
-msgstr ""
-"No es pot utilitzar el dispositiu d'àudio preferit '%s'. Vegeu el fitxer de "
-"registre per a més informació."
+#~ msgid "Standard (16bpp)"
+#~ msgstr "Estàndard (16bpp)"
-#: audio/null.h:43
-msgid "No music"
-msgstr "Sense música"
+#~ msgid "Alternative intro"
+#~ msgstr "Introducció alternativa"
-#: audio/mods/paula.cpp:196
-msgid "Amiga Audio Emulator"
-msgstr "Emulador d'àudio Amiga"
-
-#: audio/softsynth/adlib.cpp:2284
-msgid "AdLib Emulator"
-msgstr "Emulador d'AdLib"
+#~ msgid "Use an alternative game intro (CD version only)"
+#~ msgstr ""
+#~ "Utilitza una introducció del joc alternativa (només per la versió CD)"
-#: audio/softsynth/appleiigs.cpp:33
-msgid "Apple II GS Emulator (NOT IMPLEMENTED)"
-msgstr "Emulador d'Apple II GS (NO IMPLEMENTAT)"
-
-#: audio/softsynth/sid.cpp:1430
-msgid "C64 Audio Emulator"
-msgstr "Emulador d'àudio C64"
-
-#: audio/softsynth/mt32.cpp:211
-msgid "Initializing MT-32 Emulator"
-msgstr "Iniciant l'Emulador de MT-32"
+#~ msgid "MPEG2 cutscenes are no longer supported"
+#~ msgstr "Les escenes MPEG2 ja no estan suportades"
-#: audio/softsynth/mt32.cpp:437
-msgid "MT-32 Emulator"
-msgstr "Emulador de MT-32"
+#~ msgid "OpenGL Normal"
+#~ msgstr "OpenGL Normal"
-#: audio/softsynth/pcspk.cpp:139
-msgid "PC Speaker Emulator"
-msgstr "Emulador Altaveu PC"
+#~ msgid "OpenGL Conserve"
+#~ msgstr "OpenGL Conserva"
-#: audio/softsynth/pcspk.cpp:158
-msgid "IBM PCjr Emulator"
-msgstr "Emulador d'IBM PCjr"
+#~ msgid "OpenGL Original"
+#~ msgstr "OpenGL Original"
-#: backends/keymapper/remap-dialog.cpp:47
-msgid "Keymap:"
-msgstr "Assignacions de teclat:"
+#~ msgid "Current display mode"
+#~ msgstr "Mode de vídeo actual"
-#: backends/keymapper/remap-dialog.cpp:66
-msgid " (Effective)"
-msgstr " (Efectiu)"
+#~ msgid "Current scale"
+#~ msgstr "Escala actual"
-#: backends/keymapper/remap-dialog.cpp:106
-msgid " (Active)"
-msgstr " (Actiu)"
+#~ msgid "Active filter mode: Linear"
+#~ msgstr "Mode de filtre actiu: Lineal"
-#: backends/keymapper/remap-dialog.cpp:106
-msgid " (Blocked)"
-msgstr " (Bloquejat)"
-
-#: backends/keymapper/remap-dialog.cpp:119
-msgid " (Global)"
-msgstr " (Global)"
-
-#: backends/keymapper/remap-dialog.cpp:127
-msgid " (Game)"
-msgstr " (Joc)"
-
-#: backends/midi/windows.cpp:164
-msgid "Windows MIDI"
-msgstr "MIDI de Windows"
-
-#: backends/platform/ds/arm9/source/dsoptions.cpp:57
-msgid "ScummVM Main Menu"
-msgstr "Menú Principal de ScummVM"
-
-#: backends/platform/ds/arm9/source/dsoptions.cpp:63
-msgid "~L~eft handed mode"
-msgstr "Mode ~e~squerrà"
-
-#: backends/platform/ds/arm9/source/dsoptions.cpp:64
-msgid "~I~ndy fight controls"
-msgstr "Controls de lluita de l'~I~ndy"
-
-#: backends/platform/ds/arm9/source/dsoptions.cpp:65
-msgid "Show mouse cursor"
-msgstr "Mostra el cursor del ratolí"
-
-#: backends/platform/ds/arm9/source/dsoptions.cpp:66
-msgid "Snap to edges"
-msgstr "Enganxa a les vores"
-
-#: backends/platform/ds/arm9/source/dsoptions.cpp:68
-msgid "Touch X Offset"
-msgstr "Desplaçament X del toc"
-
-#: backends/platform/ds/arm9/source/dsoptions.cpp:75
-msgid "Touch Y Offset"
-msgstr "Desplaçament Y del toc"
-
-#: backends/platform/ds/arm9/source/dsoptions.cpp:87
-msgid "Use laptop trackpad-style cursor control"
-msgstr "Utilitza el control del cursor a l'estil del trackpad dels portàtils"
-
-#: backends/platform/ds/arm9/source/dsoptions.cpp:88
-msgid "Tap for left click, double tap right click"
-msgstr "Toc per a clic esquerre, doble toc per a clic dret"
-
-#: backends/platform/ds/arm9/source/dsoptions.cpp:90
-msgid "Sensitivity"
-msgstr "Sensibilitat"
-
-#: backends/platform/ds/arm9/source/dsoptions.cpp:99
-msgid "Initial top screen scale:"
-msgstr "Escalat inicial de la pantalla superior:"
-
-#: backends/platform/ds/arm9/source/dsoptions.cpp:105
-msgid "Main screen scaling:"
-msgstr "Escalat de la pantalla principal:"
-
-#: backends/platform/ds/arm9/source/dsoptions.cpp:107
-msgid "Hardware scale (fast, but low quality)"
-msgstr "Escalat per hardware (ràpid, però de baixa qualitat)"
-
-#: backends/platform/ds/arm9/source/dsoptions.cpp:108
-msgid "Software scale (good quality, but slower)"
-msgstr "Escalat per software (bona qualitat, però més lent)"
-
-#: backends/platform/ds/arm9/source/dsoptions.cpp:109
-msgid "Unscaled (you must scroll left and right)"
-msgstr "Sense escalar (haureu de desplaçar-vos a esquerra i dreta)"
-
-#: backends/platform/ds/arm9/source/dsoptions.cpp:111
-msgid "Brightness:"
-msgstr "Lluminositat:"
-
-#: backends/platform/ds/arm9/source/dsoptions.cpp:121
-msgid "High quality audio (slower) (reboot)"
-msgstr "Alta qualitat d'àudio (més lent) (reiniciar)"
-
-#: backends/platform/ds/arm9/source/dsoptions.cpp:122
-msgid "Disable power off"
-msgstr "Desactiva l'apagat automàtic"
-
-#: backends/platform/iphone/osys_events.cpp:300
-msgid "Mouse-click-and-drag mode enabled."
-msgstr "S'ha activat el mode de clic-i-arrossega."
-
-#: backends/platform/iphone/osys_events.cpp:302
-msgid "Mouse-click-and-drag mode disabled."
-msgstr "S'ha desactivat el mode clic-i-arrossega."
-
-#: backends/platform/iphone/osys_events.cpp:313
-msgid "Touchpad mode enabled."
-msgstr "Mode Touchpad activat."
-
-#: backends/platform/iphone/osys_events.cpp:315
-msgid "Touchpad mode disabled."
-msgstr "Mode Touchpad desactivat."
-
-#: backends/platform/maemo/maemo.cpp:209
-msgid "Click Mode"
-msgstr "Mode clic"
-
-#: backends/platform/maemo/maemo.cpp:215
-#: 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/maemo/maemo.cpp:218
-msgid "Middle Click"
-msgstr "Clic central"
-
-#: backends/platform/maemo/maemo.cpp:221
-#: 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"
-
-#: backends/platform/sdl/macosx/appmenu_osx.mm:77
-msgid "Hide ScummVM"
-msgstr "Amaga ScummVM"
-
-#: backends/platform/sdl/macosx/appmenu_osx.mm:82
-msgid "Hide Others"
-msgstr "Oculta els altres"
-
-#: backends/platform/sdl/macosx/appmenu_osx.mm:87
-msgid "Show All"
-msgstr "Mostra-ho tot"
-
-#: backends/platform/sdl/macosx/appmenu_osx.mm:109
-#: backends/platform/sdl/macosx/appmenu_osx.mm:120
-msgid "Window"
-msgstr "Finestra"
-
-#: backends/platform/sdl/macosx/appmenu_osx.mm:114
-msgid "Minimize"
-msgstr "Minimitza"
-
-#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:45
-msgid "Normal (no scaling)"
-msgstr "Normal (sense escalar)"
-
-#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:64
-msgctxt "lowres"
-msgid "Normal (no scaling)"
-msgstr "Normal (no escalat)"
-
-#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2135
-#: backends/graphics/openglsdl/openglsdl-graphics.cpp:537
-msgid "Enabled aspect ratio correction"
-msgstr "S'ha activat la correcció de la relació d'aspecte"
-
-#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2141
-#: backends/graphics/openglsdl/openglsdl-graphics.cpp:542
-msgid "Disabled aspect ratio correction"
-msgstr "S'ha desactivat la correcció de la relació d'aspecte"
-
-#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2196
-msgid "Active graphics filter:"
-msgstr "Filtre de gràfics actiu:"
-
-#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2238
-#: backends/graphics/openglsdl/openglsdl-graphics.cpp:481
-msgid "Windowed mode"
-msgstr "Mode de finestra"
-
-#: backends/graphics/opengl/opengl-graphics.cpp:135
-msgid "OpenGL Normal"
-msgstr "OpenGL Normal"
-
-#: backends/graphics/opengl/opengl-graphics.cpp:136
-msgid "OpenGL Conserve"
-msgstr "OpenGL Conserva"
-
-#: backends/graphics/opengl/opengl-graphics.cpp:137
-msgid "OpenGL Original"
-msgstr "OpenGL Original"
-
-#: backends/graphics/openglsdl/openglsdl-graphics.cpp:415
-msgid "Current display mode"
-msgstr "Mode de vídeo actual"
-
-#: backends/graphics/openglsdl/openglsdl-graphics.cpp:428
-msgid "Current scale"
-msgstr "Escala actual"
-
-#: backends/graphics/openglsdl/openglsdl-graphics.cpp:562
-msgid "Active filter mode: Linear"
-msgstr "Mode de filtre actiu: Lineal"
-
-#: backends/graphics/openglsdl/openglsdl-graphics.cpp:564
-msgid "Active filter mode: Nearest"
-msgstr "Mode de filtre actiu: Pròxim"
-
-#: backends/platform/symbian/src/SymbianActions.cpp:38
-#: backends/platform/wince/CEActionsSmartphone.cpp:39
-msgid "Up"
-msgstr "Amunt"
-
-#: backends/platform/symbian/src/SymbianActions.cpp:39
-#: backends/platform/wince/CEActionsSmartphone.cpp:40
-msgid "Down"
-msgstr "Avall"
-
-#: backends/platform/symbian/src/SymbianActions.cpp:40
-#: backends/platform/wince/CEActionsSmartphone.cpp:41
-msgid "Left"
-msgstr "Esquerra"
-
-#: backends/platform/symbian/src/SymbianActions.cpp:41
-#: backends/platform/wince/CEActionsSmartphone.cpp:42
-msgid "Right"
-msgstr "Dreta"
-
-#: backends/platform/symbian/src/SymbianActions.cpp:46
-#: backends/platform/wince/CEActionsSmartphone.cpp:47
-msgid "Zone"
-msgstr "Zona"
-
-#: backends/platform/symbian/src/SymbianActions.cpp:47
-#: backends/platform/wince/CEActionsPocket.cpp:54
-#: backends/platform/wince/CEActionsSmartphone.cpp:48
-msgid "Multi Function"
-msgstr "Funció Múltiple"
-
-#: backends/platform/symbian/src/SymbianActions.cpp:48
-msgid "Swap character"
-msgstr "Commuta el personatge"
-
-#: backends/platform/symbian/src/SymbianActions.cpp:49
-msgid "Skip text"
-msgstr "Salta el text"
-
-#: backends/platform/symbian/src/SymbianActions.cpp:51
-msgid "Fast mode"
-msgstr "Mode ràpid"
-
-#: backends/platform/symbian/src/SymbianActions.cpp:53
-msgid "Debugger"
-msgstr "Depurador"
-
-#: backends/platform/symbian/src/SymbianActions.cpp:54
-msgid "Global menu"
-msgstr "Menú global"
-
-#: backends/platform/symbian/src/SymbianActions.cpp:55
-msgid "Virtual keyboard"
-msgstr "Teclat virtual"
-
-#: backends/platform/symbian/src/SymbianActions.cpp:56
-msgid "Key mapper"
-msgstr "Assignador de tecles"
-
-#: backends/events/symbiansdl/symbiansdl-events.cpp:184
-msgid "Do you want to quit ?"
-msgstr "Vols sortir?"
-
-#: backends/platform/wii/options.cpp:51
-msgid "Video"
-msgstr "Vídeo"
-
-#: backends/platform/wii/options.cpp:54
-msgid "Current video mode:"
-msgstr "Mode de vídeo actual:"
-
-#: backends/platform/wii/options.cpp:56
-msgid "Double-strike"
-msgstr "Double-strike"
-
-#: backends/platform/wii/options.cpp:60
-msgid "Horizontal underscan:"
-msgstr "Underscan horitzontal:"
-
-#: backends/platform/wii/options.cpp:66
-msgid "Vertical underscan:"
-msgstr "Underscan vertical:"
-
-#: backends/platform/wii/options.cpp:71
-msgid "Input"
-msgstr "Entrada"
-
-#: backends/platform/wii/options.cpp:74
-msgid "GC Pad sensitivity:"
-msgstr "Sensibilitat del Pad GC:"
-
-#: backends/platform/wii/options.cpp:80
-msgid "GC Pad acceleration:"
-msgstr "Acceleració del Pad GC:"
-
-#: backends/platform/wii/options.cpp:86
-msgid "DVD"
-msgstr "DVD"
-
-#: backends/platform/wii/options.cpp:89 backends/platform/wii/options.cpp:101
-msgid "Status:"
-msgstr "Estat:"
-
-#: backends/platform/wii/options.cpp:90 backends/platform/wii/options.cpp:102
-msgid "Unknown"
-msgstr "Desconegut"
-
-#: backends/platform/wii/options.cpp:93
-msgid "Mount DVD"
-msgstr "Munta el DVD"
-
-#: backends/platform/wii/options.cpp:94
-msgid "Unmount DVD"
-msgstr "Desmunta el DVD"
-
-#: backends/platform/wii/options.cpp:98
-msgid "SMB"
-msgstr "SMB"
-
-#: backends/platform/wii/options.cpp:106
-msgid "Server:"
-msgstr "Servidor:"
-
-#: backends/platform/wii/options.cpp:110
-msgid "Share:"
-msgstr "Compartició:"
-
-#: backends/platform/wii/options.cpp:114
-msgid "Username:"
-msgstr "Nom d'usuari:"
-
-#: backends/platform/wii/options.cpp:118
-msgid "Password:"
-msgstr "Contrasenya:"
-
-#: backends/platform/wii/options.cpp:121
-msgid "Init network"
-msgstr "Inicia la xarxa"
-
-#: backends/platform/wii/options.cpp:123
-msgid "Mount SMB"
-msgstr "Munta SMB"
-
-#: backends/platform/wii/options.cpp:124
-msgid "Unmount SMB"
-msgstr "Desmunta SMB"
-
-#: backends/platform/wii/options.cpp:143
-msgid "DVD Mounted successfully"
-msgstr "El DVD s'ha muntat satisfactòriament"
-
-#: backends/platform/wii/options.cpp:146
-msgid "Error while mounting the DVD"
-msgstr "Error al muntar el DVD"
-
-#: backends/platform/wii/options.cpp:148
-msgid "DVD not mounted"
-msgstr "El DVD no està muntat"
-
-#: backends/platform/wii/options.cpp:161
-msgid "Network up, share mounted"
-msgstr "Xarxa activa, compartició muntada"
-
-#: backends/platform/wii/options.cpp:163
-msgid "Network up"
-msgstr "Xarxa activa"
-
-#: backends/platform/wii/options.cpp:166
-msgid ", error while mounting the share"
-msgstr ", error al muntar la compartició"
-
-#: backends/platform/wii/options.cpp:168
-msgid ", share not mounted"
-msgstr ", compartició no muntada"
-
-#: backends/platform/wii/options.cpp:174
-msgid "Network down"
-msgstr "Xarxa inactiva"
-
-#: backends/platform/wii/options.cpp:178
-msgid "Initializing network"
-msgstr "Iniciant la xarxa"
-
-#: backends/platform/wii/options.cpp:182
-msgid "Timeout while initializing network"
-msgstr "S'ha excedit el temps d'iniciació de la xarxa"
-
-#: backends/platform/wii/options.cpp:186
-#, c-format
-msgid "Network not initialized (%d)"
-msgstr "Xarxa no iniciada (%d)"
-
-#: backends/platform/wince/CEActionsPocket.cpp:46
-msgid "Hide Toolbar"
-msgstr "Oculta la barra d'eines"
-
-#: backends/platform/wince/CEActionsPocket.cpp:47
-msgid "Show Keyboard"
-msgstr "Mostra el teclat"
-
-#: backends/platform/wince/CEActionsPocket.cpp:48
-msgid "Sound on/off"
-msgstr "So engegat/parat"
-
-#: backends/platform/wince/CEActionsPocket.cpp:49
-msgid "Right click"
-msgstr "Clic dret"
-
-#: backends/platform/wince/CEActionsPocket.cpp:50
-msgid "Show/Hide Cursor"
-msgstr "Mostra/Oculta el cursor"
-
-#: backends/platform/wince/CEActionsPocket.cpp:51
-msgid "Free look"
-msgstr "Vista lliure"
-
-#: backends/platform/wince/CEActionsPocket.cpp:52
-msgid "Zoom up"
-msgstr "Amplia"
-
-#: backends/platform/wince/CEActionsPocket.cpp:53
-msgid "Zoom down"
-msgstr "Redueix"
-
-#: backends/platform/wince/CEActionsPocket.cpp:55
-#: backends/platform/wince/CEActionsSmartphone.cpp:49
-msgid "Bind Keys"
-msgstr "Mapeja tecles"
-
-#: backends/platform/wince/CEActionsPocket.cpp:56
-msgid "Cursor Up"
-msgstr "Cursor Amunt"
-
-#: backends/platform/wince/CEActionsPocket.cpp:57
-msgid "Cursor Down"
-msgstr "Cursor Avall"
-
-#: backends/platform/wince/CEActionsPocket.cpp:58
-msgid "Cursor Left"
-msgstr "Cursor Esquerra"
-
-#: backends/platform/wince/CEActionsPocket.cpp:59
-msgid "Cursor Right"
-msgstr "Cursor Dreta"
-
-#: 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:326
-#: backends/platform/wince/CEActionsSmartphone.cpp:287
-msgid " Are you sure you want to quit ? "
-msgstr " Esteu segur de voler sortir? "
-
-#: backends/platform/wince/CEActionsSmartphone.cpp:50
-msgid "Keyboard"
-msgstr "Teclat"
-
-#: backends/platform/wince/CEActionsSmartphone.cpp:51
-msgid "Rotate"
-msgstr "Rotar"
-
-#: backends/platform/wince/CELauncherDialog.cpp:56
-msgid "Using SDL driver "
-msgstr "Utilitzant el controlador SDL "
-
-#: backends/platform/wince/CELauncherDialog.cpp:60
-msgid "Display "
-msgstr "Pantalla "
-
-#: 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:515
-msgid "Map right click action"
-msgstr "Assigna l'acció del clic dret"
-
-#: backends/platform/wince/wince-sdl.cpp:519
-msgid "You must map a key to the 'Right Click' action to play this game"
-msgstr "Heu d'assignar una tecla a l'acció 'Clic dret' per jugar a aquest joc"
-
-#: backends/platform/wince/wince-sdl.cpp:528
-msgid "Map hide toolbar action"
-msgstr "Assigna l'acció d'ocultar la barra d'eines"
-
-#: 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:541
-msgid "Map Zoom Up action (optional)"
-msgstr "Assigna l'acció d'Ampliar el Zoom (opcional)"
-
-#: backends/platform/wince/wince-sdl.cpp:544
-msgid "Map Zoom Down action (optional)"
-msgstr "Assigna l'acció de Reduir el Zoom (opcional)"
-
-#: 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:193
-msgid "Do you really want to return to the Launcher?"
-msgstr "Realment voleu tornar al Llançador?"
-
-#: backends/events/default/default-events.cpp:193
-msgid "Launcher"
-msgstr "Llançador"
-
-#: backends/events/default/default-events.cpp:215
-msgid "Do you really want to quit?"
-msgstr "Estàs segur de voler sortir?"
-
-#: backends/events/gph/gph-events.cpp:386
-#: backends/events/gph/gph-events.cpp:429
-#: backends/events/openpandora/op-events.cpp:168
-msgid "Touchscreen 'Tap Mode' - Left Click"
-msgstr "'Mode Toc' de pantalla tàctil - Clic esquerre"
-
-#: backends/events/gph/gph-events.cpp:388
-#: backends/events/gph/gph-events.cpp:431
-#: backends/events/openpandora/op-events.cpp:170
-msgid "Touchscreen 'Tap Mode' - Right Click"
-msgstr "'Mode Toc' de pantalla tàctil - Clic dret"
-
-#: backends/events/gph/gph-events.cpp:390
-#: backends/events/gph/gph-events.cpp:433
-#: backends/events/openpandora/op-events.cpp:172
-msgid "Touchscreen 'Tap Mode' - Hover (No Click)"
-msgstr "'Mode Toc' de pantalla tàctil - Flotant (sense clic)"
-
-#: backends/events/gph/gph-events.cpp:410
-msgid "Maximum Volume"
-msgstr "Volum màxim"
-
-#: backends/events/gph/gph-events.cpp:412
-msgid "Increasing Volume"
-msgstr "Pujant el volum"
-
-#: backends/events/gph/gph-events.cpp:418
-msgid "Minimal Volume"
-msgstr "Volum mínim"
-
-#: backends/events/gph/gph-events.cpp:420
-msgid "Decreasing Volume"
-msgstr "Baixant el volum"
-
-#: backends/events/openpandora/op-events.cpp:174
-msgid "Touchscreen 'Tap Mode' - Hover (DPad Clicks)"
-msgstr "'Mode Toc' de pantalla tàctil - Flotant (Clics de DPad)"
-
-#: backends/updates/macosx/macosx-updates.mm:67
-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"
-
-#: backends/platform/bada/form.cpp:309
-msgid "Control Mouse"
-msgstr "Controla el ratolí"
-
-#: backends/events/maemosdl/maemosdl-events.cpp:192
-msgid "Clicking Enabled"
-msgstr "Clicat activat"
-
-#: backends/events/maemosdl/maemosdl-events.cpp:192
-msgid "Clicking Disabled"
-msgstr "Clicat desactivat"
+#~ msgid "Active filter mode: Nearest"
+#~ msgstr "Mode de filtre actiu: Pròxim"
#~ msgid "Enable Roland GS Mode"
#~ msgstr "Activa el Mode Roland GS"
diff --git a/po/cs_CZ.po b/po/cs_CZ.po
index 4b330af830..4c82bfdcaf 100644
--- a/po/cs_CZ.po
+++ b/po/cs_CZ.po
@@ -1,14 +1,14 @@
# Czech translation for ScummVM.
-# Copyright (C) 2001-2013 ScummVM Team
+# Copyright (C) 2001-2014 ScummVM Team
# This file is distributed under the same license as the ScummVM package.
# Zbynìk Schwarz <zbynek.schwarz@gmail.com>, 2011-2013.
#
msgid ""
msgstr ""
-"Project-Id-Version: ScummVM 1.4.0git\n"
+"Project-Id-Version: ScummVM 1.7.0git\n"
"Report-Msgid-Bugs-To: scummvm-devel@lists.sf.net\n"
-"POT-Creation-Date: 2013-04-24 13:35+0100\n"
-"PO-Revision-Date: 2013-05-01 16:53+0100\n"
+"POT-Creation-Date: 2014-06-07 23:06+0100\n"
+"PO-Revision-Date: 2014-02-27 21:43+0100\n"
"Last-Translator: Zbynìk Schwarz <zbynek.schwarz@gmail.com>\n"
"Language-Team: \n"
"Language: Cesky\n"
@@ -17,80 +17,80 @@ msgstr ""
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n"
"X-Poedit-SourceCharset: iso-8859-2\n"
-"X-Generator: Poedit 1.5.5\n"
+"X-Generator: Poedit 1.6.4\n"
"X-Poedit-Basepath: ..\n"
-#: gui/about.cpp:93
+#: gui/about.cpp:94
#, c-format
msgid "(built on %s)"
msgstr "(sestaveno %s)"
-#: gui/about.cpp:100
+#: gui/about.cpp:101
msgid "Features compiled in:"
msgstr "Zakompilované funkce:"
-#: gui/about.cpp:109
+#: gui/about.cpp:110
msgid "Available engines:"
msgstr "Dostupná jádra:"
-#: gui/browser.cpp:67
+#: gui/browser.cpp:68
msgid "Show hidden files"
msgstr "Zobrazit skryté soubory"
-#: gui/browser.cpp:67
+#: gui/browser.cpp:68
msgid "Show files marked with the hidden attribute"
msgstr "Zobrazit soubory s vlastností skryté"
-#: gui/browser.cpp:71
+#: gui/browser.cpp:72
msgid "Go up"
msgstr "Jít nahoru"
-#: gui/browser.cpp:71 gui/browser.cpp:73
+#: gui/browser.cpp:72 gui/browser.cpp:74
msgid "Go to previous directory level"
msgstr "Jít na pøedchozí úroveò adresáøe"
-#: gui/browser.cpp:73
+#: gui/browser.cpp:74
msgctxt "lowres"
msgid "Go up"
msgstr "Jít nahoru"
-#: gui/browser.cpp:74 gui/chooser.cpp:45 gui/KeysDialog.cpp:43
-#: gui/launcher.cpp:345 gui/massadd.cpp:94 gui/options.cpp:1238
-#: gui/saveload-dialog.cpp:215 gui/saveload-dialog.cpp:275
-#: gui/saveload-dialog.cpp:545 gui/saveload-dialog.cpp:919
-#: gui/themebrowser.cpp:54 gui/fluidsynth-dialog.cpp:151
-#: engines/engine.cpp:447 engines/drascula/saveload.cpp:51
-#: engines/scumm/dialogs.cpp:190 engines/sword1/control.cpp:865
-#: engines/parallaction/saveload.cpp:274 backends/platform/wii/options.cpp:48
-#: backends/events/default/default-events.cpp:193
-#: backends/events/default/default-events.cpp:215
+#: gui/browser.cpp:75 gui/chooser.cpp:46 gui/KeysDialog.cpp:43
+#: gui/launcher.cpp:351 gui/massadd.cpp:95 gui/options.cpp:1239
+#: gui/saveload-dialog.cpp:216 gui/saveload-dialog.cpp:276
+#: gui/saveload-dialog.cpp:547 gui/saveload-dialog.cpp:922
+#: gui/themebrowser.cpp:55 gui/fluidsynth-dialog.cpp:152
+#: engines/engine.cpp:452 backends/platform/wii/options.cpp:48
+#: backends/events/default/default-events.cpp:196
+#: backends/events/default/default-events.cpp:218
+#: engines/drascula/saveload.cpp:49 engines/parallaction/saveload.cpp:274
+#: engines/scumm/dialogs.cpp:191 engines/sword1/control.cpp:865
msgid "Cancel"
msgstr "Zru¹it"
-#: gui/browser.cpp:75 gui/chooser.cpp:46 gui/themebrowser.cpp:55
+#: gui/browser.cpp:76 gui/chooser.cpp:47 gui/themebrowser.cpp:56
msgid "Choose"
msgstr "Zvolit"
-#: gui/gui-manager.cpp:115 engines/scumm/help.cpp:125
-#: engines/scumm/help.cpp:140 engines/scumm/help.cpp:165
-#: engines/scumm/help.cpp:191 engines/scumm/help.cpp:209
-#: backends/keymapper/remap-dialog.cpp:52
+#: gui/gui-manager.cpp:117 backends/keymapper/remap-dialog.cpp:53
+#: engines/scumm/help.cpp:125 engines/scumm/help.cpp:140
+#: engines/scumm/help.cpp:165 engines/scumm/help.cpp:191
+#: engines/scumm/help.cpp:209
msgid "Close"
msgstr "Zavøít"
-#: gui/gui-manager.cpp:118
+#: gui/gui-manager.cpp:120
msgid "Mouse click"
msgstr "Kliknutí my¹í"
-#: gui/gui-manager.cpp:122 base/main.cpp:301
+#: gui/gui-manager.cpp:124 base/main.cpp:319
msgid "Display keyboard"
msgstr "Zobrazit klávesnici"
-#: gui/gui-manager.cpp:126 base/main.cpp:305
+#: gui/gui-manager.cpp:128 base/main.cpp:323
msgid "Remap keys"
msgstr "Pøemapovat klávesy"
-#: gui/gui-manager.cpp:129 base/main.cpp:308
+#: gui/gui-manager.cpp:131 base/main.cpp:326
msgid "Toggle FullScreen"
msgstr "Pøepnout celou obrazovku"
@@ -102,21 +102,21 @@ msgstr "Zvolte èinnost k mapování"
msgid "Map"
msgstr "Mapovat"
-#: gui/KeysDialog.cpp:42 gui/launcher.cpp:346 gui/launcher.cpp:1001
-#: gui/launcher.cpp:1005 gui/massadd.cpp:91 gui/options.cpp:1239
-#: gui/saveload-dialog.cpp:920 gui/fluidsynth-dialog.cpp:152
-#: engines/engine.cpp:366 engines/engine.cpp:377
-#: engines/drascula/saveload.cpp:51 engines/scumm/dialogs.cpp:192
-#: engines/scumm/scumm.cpp:1778 engines/agos/animation.cpp:558
-#: engines/groovie/script.cpp:420 engines/sky/compact.cpp:131
-#: engines/sky/compact.cpp:141 engines/sword1/animation.cpp:519
-#: engines/sword1/animation.cpp:540 engines/sword1/animation.cpp:550
-#: engines/sword1/animation.cpp:557 engines/sword1/control.cpp:865
-#: engines/sword1/logic.cpp:1633 engines/sword2/animation.cpp:419
-#: engines/sword2/animation.cpp:439 engines/sword2/animation.cpp:449
-#: engines/sword2/animation.cpp:458 engines/parallaction/saveload.cpp:274
+#: gui/KeysDialog.cpp:42 gui/launcher.cpp:352 gui/launcher.cpp:1048
+#: gui/launcher.cpp:1052 gui/massadd.cpp:92 gui/options.cpp:1240
+#: gui/saveload-dialog.cpp:923 gui/fluidsynth-dialog.cpp:153
+#: engines/engine.cpp:371 engines/engine.cpp:382
#: backends/platform/wii/options.cpp:47
#: backends/platform/wince/CELauncherDialog.cpp:54
+#: engines/agos/animation.cpp:558 engines/drascula/saveload.cpp:49
+#: engines/groovie/script.cpp:399 engines/parallaction/saveload.cpp:274
+#: engines/scumm/dialogs.cpp:193 engines/scumm/scumm.cpp:1779
+#: engines/sky/compact.cpp:131 engines/sky/compact.cpp:141
+#: engines/sword1/animation.cpp:524 engines/sword1/animation.cpp:545
+#: engines/sword1/animation.cpp:561 engines/sword1/animation.cpp:569
+#: engines/sword1/control.cpp:865 engines/sword1/logic.cpp:1633
+#: engines/sword2/animation.cpp:425 engines/sword2/animation.cpp:445
+#: engines/sword2/animation.cpp:461 engines/sword2/animation.cpp:471
msgid "OK"
msgstr "OK"
@@ -142,15 +142,15 @@ msgstr "Prosím vyberte èinnost"
msgid "Press the key to associate"
msgstr "Zmáèknìte klávesu pro pøiøazení"
-#: gui/launcher.cpp:187
+#: gui/launcher.cpp:193
msgid "Game"
msgstr "Hra"
-#: gui/launcher.cpp:191
+#: gui/launcher.cpp:197
msgid "ID:"
msgstr "ID:"
-#: gui/launcher.cpp:191 gui/launcher.cpp:193 gui/launcher.cpp:194
+#: gui/launcher.cpp:197 gui/launcher.cpp:199 gui/launcher.cpp:200
msgid ""
"Short game identifier used for referring to savegames and running the game "
"from the command line"
@@ -158,314 +158,315 @@ msgstr ""
"Krátký identifikátor her, pou¾ívaný jako odkaz k ulo¾eným hrám a spu¹tìní "
"hry z pøíkazového øádku"
-#: gui/launcher.cpp:193
+#: gui/launcher.cpp:199
msgctxt "lowres"
msgid "ID:"
msgstr "ID:"
-#: gui/launcher.cpp:198
+#: gui/launcher.cpp:204
msgid "Name:"
msgstr "Jméno"
-#: gui/launcher.cpp:198 gui/launcher.cpp:200 gui/launcher.cpp:201
+#: gui/launcher.cpp:204 gui/launcher.cpp:206 gui/launcher.cpp:207
msgid "Full title of the game"
msgstr "Úplný název hry"
-#: gui/launcher.cpp:200
+#: gui/launcher.cpp:206
msgctxt "lowres"
msgid "Name:"
msgstr "Jméno:"
-#: gui/launcher.cpp:204
+#: gui/launcher.cpp:210
msgid "Language:"
msgstr "Jazyk:"
-#: gui/launcher.cpp:204 gui/launcher.cpp:205
+#: gui/launcher.cpp:210 gui/launcher.cpp:211
msgid ""
"Language of the game. This will not turn your Spanish game version into "
"English"
msgstr "Jazyk hry. Toto z va¹í ©panìlské verze neudìlá Anglickou"
-#: gui/launcher.cpp:206 gui/launcher.cpp:220 gui/options.cpp:86
-#: gui/options.cpp:736 gui/options.cpp:749 gui/options.cpp:1209
-#: audio/null.cpp:40
+#: gui/launcher.cpp:212 gui/launcher.cpp:226 gui/options.cpp:87
+#: gui/options.cpp:737 gui/options.cpp:750 gui/options.cpp:1210
+#: audio/null.cpp:41
msgid "<default>"
msgstr "<výchozí>"
-#: gui/launcher.cpp:216
+#: gui/launcher.cpp:222
msgid "Platform:"
msgstr "Platforma:"
-#: gui/launcher.cpp:216 gui/launcher.cpp:218 gui/launcher.cpp:219
+#: gui/launcher.cpp:222 gui/launcher.cpp:224 gui/launcher.cpp:225
msgid "Platform the game was originally designed for"
msgstr "Platforma, pro kterou byla hra pùvodnì vytvoøena"
-#: gui/launcher.cpp:218
+#: gui/launcher.cpp:224
msgctxt "lowres"
msgid "Platform:"
msgstr "Platforma:"
-#: gui/launcher.cpp:231
+#: gui/launcher.cpp:237
msgid "Engine"
msgstr "Jádro"
-#: gui/launcher.cpp:239 gui/options.cpp:1072 gui/options.cpp:1089
+#: gui/launcher.cpp:245 gui/options.cpp:1073 gui/options.cpp:1090
msgid "Graphics"
msgstr "Obraz"
-#: gui/launcher.cpp:239 gui/options.cpp:1072 gui/options.cpp:1089
+#: gui/launcher.cpp:245 gui/options.cpp:1073 gui/options.cpp:1090
msgid "GFX"
msgstr "GFX"
-#: gui/launcher.cpp:242
+#: gui/launcher.cpp:248
msgid "Override global graphic settings"
msgstr "Potlaèit globální nastavení obrazu"
-#: gui/launcher.cpp:244
+#: gui/launcher.cpp:250
msgctxt "lowres"
msgid "Override global graphic settings"
msgstr "Potlaèit globální nastavení obrazu"
-#: gui/launcher.cpp:251 gui/options.cpp:1095
+#: gui/launcher.cpp:257 gui/options.cpp:1096
msgid "Audio"
msgstr "Zvuk"
-#: gui/launcher.cpp:254
+#: gui/launcher.cpp:260
msgid "Override global audio settings"
msgstr "Potlaèit globální nastavení zvuku"
-#: gui/launcher.cpp:256
+#: gui/launcher.cpp:262
msgctxt "lowres"
msgid "Override global audio settings"
msgstr "Potlaèit globální nastavení zvuku"
-#: gui/launcher.cpp:265 gui/options.cpp:1100
+#: gui/launcher.cpp:271 gui/options.cpp:1101
msgid "Volume"
msgstr "Hlasitost"
-#: gui/launcher.cpp:267 gui/options.cpp:1102
+#: gui/launcher.cpp:273 gui/options.cpp:1103
msgctxt "lowres"
msgid "Volume"
msgstr "Hlasitost"
-#: gui/launcher.cpp:270
+#: gui/launcher.cpp:276
msgid "Override global volume settings"
msgstr "Potlaèit globální nastavení hlasitosti"
-#: gui/launcher.cpp:272
+#: gui/launcher.cpp:278
msgctxt "lowres"
msgid "Override global volume settings"
msgstr "Potlaèit globální nastavení hlasitosti"
-#: gui/launcher.cpp:280 gui/options.cpp:1110
+#: gui/launcher.cpp:286 gui/options.cpp:1111
msgid "MIDI"
msgstr "MIDI"
-#: gui/launcher.cpp:283
+#: gui/launcher.cpp:289
msgid "Override global MIDI settings"
msgstr "Potlaèit globální nastavení MIDI"
-#: gui/launcher.cpp:285
+#: gui/launcher.cpp:291
msgctxt "lowres"
msgid "Override global MIDI settings"
msgstr "Potlaèit globální nastavení MIDI"
-#: gui/launcher.cpp:294 gui/options.cpp:1116
+#: gui/launcher.cpp:300 gui/options.cpp:1117
msgid "MT-32"
msgstr "MT-32"
-#: gui/launcher.cpp:297
+#: gui/launcher.cpp:303
msgid "Override global MT-32 settings"
msgstr "Potlaèit globální nastavení MT-32"
-#: gui/launcher.cpp:299
+#: gui/launcher.cpp:305
msgctxt "lowres"
msgid "Override global MT-32 settings"
msgstr "Potlaèit globální nastavení MT-32"
-#: gui/launcher.cpp:308 gui/options.cpp:1123
+#: gui/launcher.cpp:314 gui/options.cpp:1124
msgid "Paths"
msgstr "Cesty"
-#: gui/launcher.cpp:310 gui/options.cpp:1125
+#: gui/launcher.cpp:316 gui/options.cpp:1126
msgctxt "lowres"
msgid "Paths"
msgstr "Cesty"
-#: gui/launcher.cpp:317
+#: gui/launcher.cpp:323
msgid "Game Path:"
msgstr "Cesta Hry:"
-#: gui/launcher.cpp:319
+#: gui/launcher.cpp:325
msgctxt "lowres"
msgid "Game Path:"
msgstr "Cesta Hry:"
-#: gui/launcher.cpp:324 gui/options.cpp:1149
+#: gui/launcher.cpp:330 gui/options.cpp:1150
msgid "Extra Path:"
msgstr "Dodateèná Cesta:"
-#: gui/launcher.cpp:324 gui/launcher.cpp:326 gui/launcher.cpp:327
+#: gui/launcher.cpp:330 gui/launcher.cpp:332 gui/launcher.cpp:333
msgid "Specifies path to additional data used the game"
msgstr "Stanoví cestu pro dodateèná data pou¾itá ve høe"
-#: gui/launcher.cpp:326 gui/options.cpp:1151
+#: gui/launcher.cpp:332 gui/options.cpp:1152
msgctxt "lowres"
msgid "Extra Path:"
msgstr "Dodateèná Cesta:"
-#: gui/launcher.cpp:333 gui/options.cpp:1133
+#: gui/launcher.cpp:339 gui/options.cpp:1134
msgid "Save Path:"
msgstr "Cesta pro ulo¾ení:"
-#: gui/launcher.cpp:333 gui/launcher.cpp:335 gui/launcher.cpp:336
-#: gui/options.cpp:1133 gui/options.cpp:1135 gui/options.cpp:1136
+#: gui/launcher.cpp:339 gui/launcher.cpp:341 gui/launcher.cpp:342
+#: gui/options.cpp:1134 gui/options.cpp:1136 gui/options.cpp:1137
msgid "Specifies where your savegames are put"
msgstr "Stanovuje, kam jsou umístìny va¹e ulo¾ené hry"
-#: gui/launcher.cpp:335 gui/options.cpp:1135
+#: gui/launcher.cpp:341 gui/options.cpp:1136
msgctxt "lowres"
msgid "Save Path:"
msgstr "Cesta pro ulo¾ení:"
-#: gui/launcher.cpp:354 gui/launcher.cpp:453 gui/launcher.cpp:511
-#: gui/launcher.cpp:565 gui/options.cpp:1144 gui/options.cpp:1152
-#: gui/options.cpp:1161 gui/options.cpp:1276 gui/options.cpp:1282
-#: gui/options.cpp:1290 gui/options.cpp:1320 gui/options.cpp:1326
-#: gui/options.cpp:1333 gui/options.cpp:1426 gui/options.cpp:1429
-#: gui/options.cpp:1441
+#: gui/launcher.cpp:360 gui/launcher.cpp:459 gui/launcher.cpp:517
+#: gui/launcher.cpp:571 gui/options.cpp:1145 gui/options.cpp:1153
+#: gui/options.cpp:1162 gui/options.cpp:1277 gui/options.cpp:1283
+#: gui/options.cpp:1291 gui/options.cpp:1321 gui/options.cpp:1327
+#: gui/options.cpp:1334 gui/options.cpp:1427 gui/options.cpp:1430
+#: gui/options.cpp:1442
msgctxt "path"
msgid "None"
msgstr "®ádné"
-#: gui/launcher.cpp:359 gui/launcher.cpp:459 gui/launcher.cpp:569
-#: gui/options.cpp:1270 gui/options.cpp:1314 gui/options.cpp:1432
+#: gui/launcher.cpp:365 gui/launcher.cpp:465 gui/launcher.cpp:575
+#: gui/options.cpp:1271 gui/options.cpp:1315 gui/options.cpp:1433
#: backends/platform/wii/options.cpp:56
msgid "Default"
msgstr "Výchozí"
-#: gui/launcher.cpp:504 gui/options.cpp:1435
+#: gui/launcher.cpp:510 gui/options.cpp:1436
msgid "Select SoundFont"
msgstr "Vybrat SoundFont"
-#: gui/launcher.cpp:523 gui/launcher.cpp:677
+#: gui/launcher.cpp:529 gui/launcher.cpp:682
msgid "Select directory with game data"
msgstr "Vyberte adresáø s daty hry"
-#: gui/launcher.cpp:541
+#: gui/launcher.cpp:547
msgid "Select additional game directory"
msgstr "Vyberte dodateèný adresáø hry"
-#: gui/launcher.cpp:553
+#: gui/launcher.cpp:559
msgid "Select directory for saved games"
msgstr "Vyberte adresáø pro ulo¾ené hry"
-#: gui/launcher.cpp:580
+#: gui/launcher.cpp:586
msgid "This game ID is already taken. Please choose another one."
msgstr "Toto ID hry je u¾ zabrané. Vyberte si, prosím, jiné."
-#: gui/launcher.cpp:621 engines/dialogs.cpp:110
+#: gui/launcher.cpp:626 engines/dialogs.cpp:111
msgid "~Q~uit"
msgstr "~U~konèit"
-#: gui/launcher.cpp:621 backends/platform/sdl/macosx/appmenu_osx.mm:95
+#: gui/launcher.cpp:626 backends/platform/sdl/macosx/appmenu_osx.mm:95
msgid "Quit ScummVM"
msgstr "Ukonèit ScummVM"
-#: gui/launcher.cpp:622
+#: gui/launcher.cpp:627
msgid "A~b~out..."
msgstr "~O~ Programu..."
-#: gui/launcher.cpp:622 backends/platform/sdl/macosx/appmenu_osx.mm:69
+#: gui/launcher.cpp:627 backends/platform/sdl/macosx/appmenu_osx.mm:69
msgid "About ScummVM"
msgstr "O ScummVM"
-#: gui/launcher.cpp:623
+#: gui/launcher.cpp:628
msgid "~O~ptions..."
msgstr "~V~olby..."
-#: gui/launcher.cpp:623
+#: gui/launcher.cpp:628
msgid "Change global ScummVM options"
msgstr "Zmìnit globální volby ScummVM"
-#: gui/launcher.cpp:625
+#: gui/launcher.cpp:630
msgid "~S~tart"
msgstr "~S~pustit"
-#: gui/launcher.cpp:625
+#: gui/launcher.cpp:630
msgid "Start selected game"
msgstr "Spustit zvolenou hru"
-#: gui/launcher.cpp:628
+#: gui/launcher.cpp:633
msgid "~L~oad..."
msgstr "~N~ahrát..."
-#: gui/launcher.cpp:628
+#: gui/launcher.cpp:633
msgid "Load savegame for selected game"
msgstr "Nahrát ulo¾enou pozici pro zvolenou hru"
-#: gui/launcher.cpp:633 gui/launcher.cpp:1120
+#: gui/launcher.cpp:638
msgid "~A~dd Game..."
msgstr "~P~øidat hru..."
-#: gui/launcher.cpp:633 gui/launcher.cpp:640
+#: gui/launcher.cpp:638 gui/launcher.cpp:645
msgid "Hold Shift for Mass Add"
msgstr "Podr¾te Shift pro Hromadné Pøidání"
-#: gui/launcher.cpp:635
+#: gui/launcher.cpp:640
msgid "~E~dit Game..."
msgstr "~U~pravit Hru..."
-#: gui/launcher.cpp:635 gui/launcher.cpp:642
+#: gui/launcher.cpp:640 gui/launcher.cpp:647
msgid "Change game options"
msgstr "Zmìnit volby hry"
-#: gui/launcher.cpp:637
+#: gui/launcher.cpp:642
msgid "~R~emove Game"
msgstr "~O~dstranit Hru"
-#: gui/launcher.cpp:637 gui/launcher.cpp:644
+#: gui/launcher.cpp:642 gui/launcher.cpp:649
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:640 gui/launcher.cpp:1120
+#: gui/launcher.cpp:645
msgctxt "lowres"
msgid "~A~dd Game..."
msgstr "~P~øidat hru..."
-#: gui/launcher.cpp:642
+#: gui/launcher.cpp:647
msgctxt "lowres"
msgid "~E~dit Game..."
msgstr "~U~pravit hru..."
-#: gui/launcher.cpp:644
+#: gui/launcher.cpp:649
msgctxt "lowres"
msgid "~R~emove Game"
msgstr "~O~dstranit hru"
-#: gui/launcher.cpp:652
+#: gui/launcher.cpp:657
msgid "Search in game list"
msgstr "Hledat v seznamu her"
-#: gui/launcher.cpp:656 gui/launcher.cpp:1167
+#: gui/launcher.cpp:661 gui/launcher.cpp:1222
msgid "Search:"
msgstr "Hledat:"
-#: gui/launcher.cpp:680 engines/dialogs.cpp:114 engines/mohawk/myst.cpp:245
-#: engines/mohawk/riven.cpp:716 engines/cruise/menu.cpp:214
-#: engines/pegasus/pegasus.cpp:349
+#: gui/launcher.cpp:685 engines/dialogs.cpp:115 engines/cruise/menu.cpp:214
+#: engines/mohawk/myst.cpp:245 engines/mohawk/riven.cpp:718
+#: engines/pegasus/pegasus.cpp:353
msgid "Load game:"
msgstr "Nahrát hru:"
-#: gui/launcher.cpp:680 engines/dialogs.cpp:114 engines/scumm/dialogs.cpp:188
-#: engines/mohawk/myst.cpp:245 engines/mohawk/riven.cpp:716
-#: engines/cruise/menu.cpp:214 engines/pegasus/pegasus.cpp:349
+#: gui/launcher.cpp:685 engines/dialogs.cpp:115
#: backends/platform/wince/CEActionsPocket.cpp:267
#: backends/platform/wince/CEActionsSmartphone.cpp:231
+#: engines/cruise/menu.cpp:214 engines/mohawk/myst.cpp:245
+#: engines/mohawk/riven.cpp:718 engines/pegasus/pegasus.cpp:353
+#: engines/scumm/dialogs.cpp:189
msgid "Load"
msgstr "Nahrát"
-#: gui/launcher.cpp:788
+#: gui/launcher.cpp:792
msgid ""
"Do you really want to run the mass game detector? This could potentially add "
"a huge number of games."
@@ -473,7 +474,8 @@ msgstr ""
"Opravdu chcete spustit hromadnou detekci her? Toto by mohlo potenciálnì "
"pøidat velkou spoustu her. "
-#: gui/launcher.cpp:789 gui/launcher.cpp:937 gui/fluidsynth-dialog.cpp:216
+#: gui/launcher.cpp:793 gui/launcher.cpp:941 gui/launcher.cpp:1000
+#: gui/fluidsynth-dialog.cpp:217
#: backends/events/symbiansdl/symbiansdl-events.cpp:184
#: backends/platform/wince/CEActionsPocket.cpp:326
#: backends/platform/wince/CEActionsSmartphone.cpp:287
@@ -481,7 +483,8 @@ msgstr ""
msgid "Yes"
msgstr "Ano"
-#: gui/launcher.cpp:789 gui/launcher.cpp:937 gui/fluidsynth-dialog.cpp:216
+#: gui/launcher.cpp:793 gui/launcher.cpp:941 gui/launcher.cpp:1000
+#: gui/fluidsynth-dialog.cpp:217
#: backends/events/symbiansdl/symbiansdl-events.cpp:184
#: backends/platform/wince/CEActionsPocket.cpp:326
#: backends/platform/wince/CEActionsSmartphone.cpp:287
@@ -489,189 +492,183 @@ msgstr "Ano"
msgid "No"
msgstr "Ne"
-#: gui/launcher.cpp:837
+#: gui/launcher.cpp:841
msgid "ScummVM couldn't open the specified directory!"
msgstr "ScummVM nemohl tento adresáø otevøít!"
-#: gui/launcher.cpp:849
+#: gui/launcher.cpp:853
msgid "ScummVM could not find any game in the specified directory!"
msgstr "ScummVM nemohl v zadaném adresáøi najít ¾ádnou hru!"
-#: gui/launcher.cpp:863
+#: gui/launcher.cpp:867
msgid "Pick the game:"
msgstr "Vybrat hru:"
-#: gui/launcher.cpp:937
+#: gui/launcher.cpp:941
msgid "Do you really want to remove this game configuration?"
msgstr "Opravdu chcete odstranit nastavení této hry?"
-#: gui/launcher.cpp:1001
+#: gui/launcher.cpp:999
+msgid "Do you want to load savegame?"
+msgstr "Chcete naèíst ulo¾enou pozici?"
+
+#: gui/launcher.cpp:1048
msgid "This game does not support loading games from the launcher."
msgstr "Tato hra nepodporuje spou¹tìní her ze spou¹tìèe"
-#: gui/launcher.cpp:1005
+#: gui/launcher.cpp:1052
msgid "ScummVM could not find any engine capable of running the selected game!"
msgstr "ScummVM nemohl najít ¾ádné jádro schopné vybranou hru spustit!"
-#: gui/launcher.cpp:1119
-msgctxt "lowres"
-msgid "Mass Add..."
-msgstr "Hromadné Pøidání..."
-
-#: gui/launcher.cpp:1119
-msgid "Mass Add..."
-msgstr "Hromadné Pøidání..."
-
-#: gui/massadd.cpp:78 gui/massadd.cpp:81
+#: gui/massadd.cpp:79 gui/massadd.cpp:82
msgid "... progress ..."
msgstr "... prùbìh ..."
-#: gui/massadd.cpp:258
+#: gui/massadd.cpp:259
msgid "Scan complete!"
msgstr "Hledání dokonèeno!"
-#: gui/massadd.cpp:261
+#: gui/massadd.cpp:262
#, 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:265
+#: gui/massadd.cpp:266
#, c-format
msgid "Scanned %d directories ..."
msgstr "Prohledáno %d adresáøù..."
-#: gui/massadd.cpp:268
+#: gui/massadd.cpp:269
#, 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/options.cpp:84
+#: gui/options.cpp:85
msgid "Never"
msgstr "Nikdy"
-#: gui/options.cpp:84
+#: gui/options.cpp:85
msgid "every 5 mins"
msgstr "Ka¾dých 5 min"
-#: gui/options.cpp:84
+#: gui/options.cpp:85
msgid "every 10 mins"
msgstr "Ka¾dých 10 min"
-#: gui/options.cpp:84
+#: gui/options.cpp:85
msgid "every 15 mins"
msgstr "Ka¾dých 15 min"
-#: gui/options.cpp:84
+#: gui/options.cpp:85
msgid "every 30 mins"
msgstr "Ka¾dých 30 min"
-#: gui/options.cpp:86
+#: gui/options.cpp:87
msgid "8 kHz"
msgstr "8 kHz"
-#: gui/options.cpp:86
+#: gui/options.cpp:87
msgid "11kHz"
msgstr "11kHz"
-#: gui/options.cpp:86
+#: gui/options.cpp:87
msgid "22 kHz"
msgstr "22 kHz"
-#: gui/options.cpp:86
+#: gui/options.cpp:87
msgid "44 kHz"
msgstr "44 kHz"
-#: gui/options.cpp:86
+#: gui/options.cpp:87
msgid "48 kHz"
msgstr "48 kHz"
-#: gui/options.cpp:254 gui/options.cpp:480 gui/options.cpp:581
-#: gui/options.cpp:650 gui/options.cpp:858
+#: gui/options.cpp:255 gui/options.cpp:481 gui/options.cpp:582
+#: gui/options.cpp:651 gui/options.cpp:859
msgctxt "soundfont"
msgid "None"
msgstr "®ádné"
-#: gui/options.cpp:388
+#: gui/options.cpp:389
msgid "Failed to apply some of the graphic options changes:"
msgstr "Nelze pou¾ít nìkteré zmìny mo¾ností grafiky:"
-#: gui/options.cpp:400
+#: gui/options.cpp:401
msgid "the video mode could not be changed."
msgstr "re¾im obrazu nemohl být zmìnìn."
-#: gui/options.cpp:406
+#: gui/options.cpp:407
msgid "the fullscreen setting could not be changed"
msgstr "nastavení celé obrazovky nemohlo být zmìnìno"
-#: gui/options.cpp:412
+#: gui/options.cpp:413
msgid "the aspect ratio setting could not be changed"
msgstr "nastavení pomìru stran nemohlo být zmìnìno"
-#: gui/options.cpp:733
+#: gui/options.cpp:734
msgid "Graphics mode:"
msgstr "Re¾im obrazu:"
-#: gui/options.cpp:747
+#: gui/options.cpp:748
msgid "Render mode:"
msgstr "Re¾im vykreslení:"
-#: gui/options.cpp:747 gui/options.cpp:748
+#: gui/options.cpp:748 gui/options.cpp:749
msgid "Special dithering modes supported by some games"
msgstr "Speciální re¾imy chvìní podporované nìkterými hrami"
-#: gui/options.cpp:759
-#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2236
-#: backends/graphics/openglsdl/openglsdl-graphics.cpp:476
+#: gui/options.cpp:760
+#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2249
msgid "Fullscreen mode"
msgstr "Re¾im celé obrazovky"
-#: gui/options.cpp:762
+#: gui/options.cpp:763
msgid "Aspect ratio correction"
msgstr "Korekce pomìru stran"
-#: gui/options.cpp:762
+#: gui/options.cpp:763
msgid "Correct aspect ratio for 320x200 games"
msgstr "Korigovat pomìr stran pro hry 320x200"
-#: gui/options.cpp:770
+#: gui/options.cpp:771
msgid "Preferred Device:"
msgstr "Prioritní Zaøízení:"
-#: gui/options.cpp:770
+#: gui/options.cpp:771
msgid "Music Device:"
msgstr "Hudební zaøízení"
-#: gui/options.cpp:770 gui/options.cpp:772
+#: gui/options.cpp:771 gui/options.cpp:773
msgid "Specifies preferred sound device or sound card emulator"
msgstr "Stanoví prioritní zvukové zaøízení nebo emulátor zvukové karty"
-#: gui/options.cpp:770 gui/options.cpp:772 gui/options.cpp:773
+#: gui/options.cpp:771 gui/options.cpp:773 gui/options.cpp:774
msgid "Specifies output sound device or sound card emulator"
msgstr "Stanoví výstupní zvukové zaøízení nebo emulátor zvukové karty"
-#: gui/options.cpp:772
+#: gui/options.cpp:773
msgctxt "lowres"
msgid "Preferred Dev.:"
msgstr "Prioritní Zaø.:"
-#: gui/options.cpp:772
+#: gui/options.cpp:773
msgctxt "lowres"
msgid "Music Device:"
msgstr "Hudební zaøízení"
-#: gui/options.cpp:799
+#: gui/options.cpp:800
msgid "AdLib emulator:"
msgstr "AdLib emulátor"
-#: gui/options.cpp:799 gui/options.cpp:800
+#: gui/options.cpp:800 gui/options.cpp:801
msgid "AdLib is used for music in many games"
msgstr "AdLib se pou¾ívá pro hudbu v mnoha hrách"
-#: gui/options.cpp:810
+#: gui/options.cpp:811
msgid "Output rate:"
msgstr "Výstup. frekvence:"
-#: gui/options.cpp:810 gui/options.cpp:811
+#: gui/options.cpp:811 gui/options.cpp:812
msgid ""
"Higher value specifies better sound quality but may be not supported by your "
"soundcard"
@@ -679,66 +676,66 @@ msgstr ""
"Vy¹¹í hodnota zpùsobí lep¹í kvalitu zvuku, ale nemusí být podporována Va¹i "
"zvukovou kartou"
-#: gui/options.cpp:821
+#: gui/options.cpp:822
msgid "GM Device:"
msgstr "GM Zaøízení:"
-#: gui/options.cpp:821
+#: gui/options.cpp:822
msgid "Specifies default sound device for General MIDI output"
msgstr "Stanoví výchozí zvukové zaøízení pro výstup General MIDI"
-#: gui/options.cpp:832
+#: gui/options.cpp:833
msgid "Don't use General MIDI music"
msgstr "Nepou¾ívat hudbu General MIDI"
-#: gui/options.cpp:843 gui/options.cpp:909
+#: gui/options.cpp:844 gui/options.cpp:910
msgid "Use first available device"
msgstr "Pou¾ít první dostupné zaøízení"
-#: gui/options.cpp:855
+#: gui/options.cpp:856
msgid "SoundFont:"
msgstr "SoundFont:"
-#: gui/options.cpp:855 gui/options.cpp:857 gui/options.cpp:858
+#: gui/options.cpp:856 gui/options.cpp:858 gui/options.cpp:859
msgid "SoundFont is supported by some audio cards, Fluidsynth and Timidity"
msgstr ""
"SoundFont je podporován nìkterými zvukovými kartami, Fluidsynth a Timidity"
-#: gui/options.cpp:857
+#: gui/options.cpp:858
msgctxt "lowres"
msgid "SoundFont:"
msgstr "SoundFont:"
-#: gui/options.cpp:863
+#: gui/options.cpp:864
msgid "Mixed AdLib/MIDI mode"
msgstr "Smí¹ený re¾im AdLib/MIDI"
-#: gui/options.cpp:863
+#: gui/options.cpp:864
msgid "Use both MIDI and AdLib sound generation"
msgstr "Pou¾ít obì zvukové generace MIDI a AdLib"
-#: gui/options.cpp:866
+#: gui/options.cpp:867
msgid "MIDI gain:"
msgstr "Zesílení MIDI:"
-#: gui/options.cpp:873
+#: gui/options.cpp:874
msgid "FluidSynth Settings"
msgstr "Nastavení FluidSynth"
-#: gui/options.cpp:880
+#: gui/options.cpp:881
msgid "MT-32 Device:"
msgstr "Zaøízení MT-32:"
-#: gui/options.cpp:880
+#: gui/options.cpp:881
msgid "Specifies default sound device for Roland MT-32/LAPC1/CM32l/CM64 output"
msgstr ""
"Stanoví výchozí zvukové výstupní zaøízení pro Roland MT-32/LAPC1/CM32l/CM64"
-#: gui/options.cpp:885
+#: gui/options.cpp:886
msgid "True Roland MT-32 (disable GM emulation)"
msgstr "Opravdový Roland MT-32 (vypne GM emulaci)"
-#: gui/options.cpp:885 gui/options.cpp:887
+#: gui/options.cpp:886 gui/options.cpp:888
msgid ""
"Check if you want to use your real hardware Roland-compatible sound device "
"connected to your computer"
@@ -746,190 +743,194 @@ msgstr ""
"Za¹krtnìte, pokud chcete pou¾ít pravé hardwarové zaøízení kompatibilní s "
"Roland, pøipojené k va¹emu poèítaèi"
-#: gui/options.cpp:887
+#: gui/options.cpp:888
msgctxt "lowres"
msgid "True Roland MT-32 (no GM emulation)"
msgstr "Opravdový Roland MT-32 (¾ádná GM emulace)"
-#: gui/options.cpp:890
-msgid "Roland GS Mode (disable GM mapping)"
-msgstr "Re¾im Roland GS (vypne mapování GM)"
+#: gui/options.cpp:891
+msgid "Roland GS Device (enable MT-32 mappings)"
+msgstr "Zaøízení Roland GS (zapne mapování MT-32)"
-#: gui/options.cpp:890
-msgid "Turns off General MIDI mapping for games with Roland MT-32 soundtrack"
-msgstr "Vypne mapování General MIDI pro hry s Roland MT-32 zvukovým doprovodem"
+#: gui/options.cpp:891
+msgid ""
+"Check if you want to enable patch mappings to emulate an MT-32 on a Roland "
+"GS device"
+msgstr ""
+"Za¹krtnìte, pokud chcete povolit záplaty mapování umo¾òující emulovat MT-32 "
+"na zaøízení Roland GS"
-#: gui/options.cpp:899
+#: gui/options.cpp:900
msgid "Don't use Roland MT-32 music"
msgstr "Nepou¾ívat hudbu Roland MT-32"
-#: gui/options.cpp:926
+#: gui/options.cpp:927
msgid "Text and Speech:"
msgstr "Text a Øeè"
-#: gui/options.cpp:930 gui/options.cpp:940
+#: gui/options.cpp:931 gui/options.cpp:941
msgid "Speech"
msgstr "Øeè"
-#: gui/options.cpp:931 gui/options.cpp:941
+#: gui/options.cpp:932 gui/options.cpp:942
msgid "Subtitles"
msgstr "Titulky"
-#: gui/options.cpp:932
+#: gui/options.cpp:933
msgid "Both"
msgstr "Oba"
-#: gui/options.cpp:934
+#: gui/options.cpp:935
msgid "Subtitle speed:"
msgstr "Rychlost titulkù:"
-#: gui/options.cpp:936
+#: gui/options.cpp:937
msgctxt "lowres"
msgid "Text and Speech:"
msgstr "Text a Øeè:"
-#: gui/options.cpp:940
+#: gui/options.cpp:941
msgid "Spch"
msgstr "Øeè"
-#: gui/options.cpp:941
+#: gui/options.cpp:942
msgid "Subs"
msgstr "Titl"
-#: gui/options.cpp:942
+#: gui/options.cpp:943
msgctxt "lowres"
msgid "Both"
msgstr "Oba"
-#: gui/options.cpp:942
+#: gui/options.cpp:943
msgid "Show subtitles and play speech"
msgstr "Zobrazit titulky a pøehrávat øeè"
-#: gui/options.cpp:944
+#: gui/options.cpp:945
msgctxt "lowres"
msgid "Subtitle speed:"
msgstr "Rychlost titulkù"
-#: gui/options.cpp:960
+#: gui/options.cpp:961
msgid "Music volume:"
msgstr "Hlasitost hudby"
-#: gui/options.cpp:962
+#: gui/options.cpp:963
msgctxt "lowres"
msgid "Music volume:"
msgstr "Hlasitost hudby"
-#: gui/options.cpp:969
+#: gui/options.cpp:970
msgid "Mute All"
msgstr "Ztlumit V¹e"
-#: gui/options.cpp:972
+#: gui/options.cpp:973
msgid "SFX volume:"
msgstr "Hlasitost zvukù"
-#: gui/options.cpp:972 gui/options.cpp:974 gui/options.cpp:975
+#: gui/options.cpp:973 gui/options.cpp:975 gui/options.cpp:976
msgid "Special sound effects volume"
msgstr "Hlasitost speciálních zvukových efektù"
-#: gui/options.cpp:974
+#: gui/options.cpp:975
msgctxt "lowres"
msgid "SFX volume:"
msgstr "Hlasitost zvukù"
-#: gui/options.cpp:982
+#: gui/options.cpp:983
msgid "Speech volume:"
msgstr "Hlasitost øeèi"
-#: gui/options.cpp:984
+#: gui/options.cpp:985
msgctxt "lowres"
msgid "Speech volume:"
msgstr "Hlasitost øeèi"
-#: gui/options.cpp:1141
+#: gui/options.cpp:1142
msgid "Theme Path:"
msgstr "Cesta ke Vzhledu:"
-#: gui/options.cpp:1143
+#: gui/options.cpp:1144
msgctxt "lowres"
msgid "Theme Path:"
msgstr "Cesta ke Vzhledu:"
-#: gui/options.cpp:1149 gui/options.cpp:1151 gui/options.cpp:1152
+#: gui/options.cpp:1150 gui/options.cpp:1152 gui/options.cpp:1153
msgid "Specifies path to additional data used by all games or ScummVM"
msgstr "Stanoví cestu k dodateèným datùm pou¾ívaná v¹emi hrami nebo ScummVM"
-#: gui/options.cpp:1158
+#: gui/options.cpp:1159
msgid "Plugins Path:"
msgstr "Cesta k Pluginùm:"
-#: gui/options.cpp:1160
+#: gui/options.cpp:1161
msgctxt "lowres"
msgid "Plugins Path:"
msgstr "Cesta k Pluginùm:"
-#: gui/options.cpp:1169 gui/fluidsynth-dialog.cpp:137
+#: gui/options.cpp:1170 gui/fluidsynth-dialog.cpp:138
msgid "Misc"
msgstr "Rùzné"
-#: gui/options.cpp:1171
+#: gui/options.cpp:1172
msgctxt "lowres"
msgid "Misc"
msgstr "Rùzné"
-#: gui/options.cpp:1173
+#: gui/options.cpp:1174
msgid "Theme:"
msgstr "Vzhled:"
-#: gui/options.cpp:1177
+#: gui/options.cpp:1178
msgid "GUI Renderer:"
msgstr "GUI Vykreslovaè:"
-#: gui/options.cpp:1189
+#: gui/options.cpp:1190
msgid "Autosave:"
msgstr "Autoukládání:"
-#: gui/options.cpp:1191
+#: gui/options.cpp:1192
msgctxt "lowres"
msgid "Autosave:"
msgstr "Autoukládání:"
-#: gui/options.cpp:1199
+#: gui/options.cpp:1200
msgid "Keys"
msgstr "Klávesy"
-#: gui/options.cpp:1206
+#: gui/options.cpp:1207
msgid "GUI Language:"
msgstr "Jazyk GUI"
-#: gui/options.cpp:1206
+#: gui/options.cpp:1207
msgid "Language of ScummVM GUI"
msgstr "Jazyk GUI ScummVM"
-#: gui/options.cpp:1365
+#: gui/options.cpp:1366
msgid "You have to restart ScummVM before your changes will take effect."
msgstr "Pro pou¾ití tìchto nastavení musíte restartovat ScummVM."
-#: gui/options.cpp:1378
+#: gui/options.cpp:1379
msgid "Select directory for savegames"
msgstr "Vybrat adresáø pro ulo¾ené hry"
-#: gui/options.cpp:1385
+#: gui/options.cpp:1386
msgid "The chosen directory cannot be written to. Please select another one."
msgstr "Do zvoleného adresáøe nelze zapisovat. Vyberte, prosím, jiný."
-#: gui/options.cpp:1394
+#: gui/options.cpp:1395
msgid "Select directory for GUI themes"
msgstr "Vyberte adresáø pro vhledy GUI"
-#: gui/options.cpp:1404
+#: gui/options.cpp:1405
msgid "Select directory for extra files"
msgstr "Vyberte adresáø pro dodateèné soubory"
-#: gui/options.cpp:1415
+#: gui/options.cpp:1416
msgid "Select directory for plugins"
msgstr "Vyberte adresáø pro zásuvné moduly"
-#: gui/options.cpp:1468
+#: gui/options.cpp:1469
msgid ""
"The theme you selected does not support your current language. If you want "
"to use this theme you need to switch to another language first."
@@ -937,224 +938,224 @@ msgstr ""
"Vzhled, který jste zvolili, nepodporuje Vá¹ souèasný jazyk. Pokud chcete "
"tento vzhled pou¾ít, musíte nejdøíve pøepnout na jiný jazyk."
-#: gui/saveload-dialog.cpp:166
+#: gui/saveload-dialog.cpp:167
msgid "List view"
msgstr "Seznam"
-#: gui/saveload-dialog.cpp:167
+#: gui/saveload-dialog.cpp:168
msgid "Grid view"
msgstr "Møí¾ka"
-#: gui/saveload-dialog.cpp:210 gui/saveload-dialog.cpp:358
+#: gui/saveload-dialog.cpp:211 gui/saveload-dialog.cpp:360
msgid "No date saved"
msgstr "Neulo¾ena ¾ádná data"
-#: gui/saveload-dialog.cpp:211 gui/saveload-dialog.cpp:359
+#: gui/saveload-dialog.cpp:212 gui/saveload-dialog.cpp:361
msgid "No time saved"
msgstr "®ádný ulo¾ený èas"
-#: gui/saveload-dialog.cpp:212 gui/saveload-dialog.cpp:360
+#: gui/saveload-dialog.cpp:213 gui/saveload-dialog.cpp:362
msgid "No playtime saved"
msgstr "®ádná ulo¾ená doba hraní"
-#: gui/saveload-dialog.cpp:219 gui/saveload-dialog.cpp:275
+#: gui/saveload-dialog.cpp:220 gui/saveload-dialog.cpp:276
msgid "Delete"
msgstr "Smazat"
-#: gui/saveload-dialog.cpp:274
+#: gui/saveload-dialog.cpp:275
msgid "Do you really want to delete this savegame?"
msgstr "Opravdu chcete tuto ulo¾enou hru vymazat"
-#: gui/saveload-dialog.cpp:383 gui/saveload-dialog.cpp:872
+#: gui/saveload-dialog.cpp:385 gui/saveload-dialog.cpp:875
msgid "Date: "
msgstr "Datum:"
-#: gui/saveload-dialog.cpp:387 gui/saveload-dialog.cpp:878
+#: gui/saveload-dialog.cpp:389 gui/saveload-dialog.cpp:881
msgid "Time: "
msgstr "Èas:"
-#: gui/saveload-dialog.cpp:393 gui/saveload-dialog.cpp:886
+#: gui/saveload-dialog.cpp:395 gui/saveload-dialog.cpp:889
msgid "Playtime: "
msgstr "Doba hraní:"
-#: gui/saveload-dialog.cpp:406 gui/saveload-dialog.cpp:494
+#: gui/saveload-dialog.cpp:408 gui/saveload-dialog.cpp:496
msgid "Untitled savestate"
msgstr "Bezejmenný ulo¾ený stav"
-#: gui/saveload-dialog.cpp:546
+#: gui/saveload-dialog.cpp:548
msgid "Next"
msgstr "Dal¹í"
-#: gui/saveload-dialog.cpp:549
+#: gui/saveload-dialog.cpp:551
msgid "Prev"
msgstr "Pøedchozí"
-#: gui/saveload-dialog.cpp:736
+#: gui/saveload-dialog.cpp:739
msgid "New Save"
msgstr "Nová ulo¾ená pozice"
-#: gui/saveload-dialog.cpp:736
+#: gui/saveload-dialog.cpp:739
msgid "Create a new save game"
msgstr "Vytvoøit novou ulo¾enou hru."
-#: gui/saveload-dialog.cpp:865
+#: gui/saveload-dialog.cpp:868
msgid "Name: "
msgstr "Název:"
-#: gui/saveload-dialog.cpp:937
+#: gui/saveload-dialog.cpp:940
#, c-format
msgid "Enter a description for slot %d:"
msgstr "Zadejte popis pro pozici %d:"
-#: gui/themebrowser.cpp:44
+#: gui/themebrowser.cpp:45
msgid "Select a Theme"
msgstr "Vyberte Vzhled"
-#: gui/ThemeEngine.cpp:337
+#: gui/ThemeEngine.cpp:347
msgid "Disabled GFX"
msgstr "GFX zakázáno"
-#: gui/ThemeEngine.cpp:337
+#: gui/ThemeEngine.cpp:347
msgctxt "lowres"
msgid "Disabled GFX"
msgstr "GFX zakázáno"
-#: gui/ThemeEngine.cpp:338
-msgid "Standard Renderer (16bpp)"
-msgstr "Standardní Vykreslovaè (16bpp)"
+#: gui/ThemeEngine.cpp:348
+msgid "Standard Renderer"
+msgstr "Standardní Vykreslovaè"
-#: gui/ThemeEngine.cpp:338
-msgid "Standard (16bpp)"
-msgstr "Standardní (16bpp)"
+#: gui/ThemeEngine.cpp:348 engines/scumm/dialogs.cpp:659
+msgid "Standard"
+msgstr "Standardní"
-#: gui/ThemeEngine.cpp:340
-msgid "Antialiased Renderer (16bpp)"
-msgstr "Vykreslovaè s vyhlazenými hranami (16bpp)"
+#: gui/ThemeEngine.cpp:350
+msgid "Antialiased Renderer"
+msgstr "Vykreslovaè s vyhlazenými hranami"
-#: gui/ThemeEngine.cpp:340
-msgid "Antialiased (16bpp)"
-msgstr "S vyhlazenými hranami (16bpp)"
+#: gui/ThemeEngine.cpp:350
+msgid "Antialiased"
+msgstr "S vyhlazenými hranami"
-#: gui/widget.cpp:322 gui/widget.cpp:324 gui/widget.cpp:330 gui/widget.cpp:332
+#: gui/widget.cpp:323 gui/widget.cpp:325 gui/widget.cpp:331 gui/widget.cpp:333
msgid "Clear value"
msgstr "Vyèistit hodnotu"
-#: gui/fluidsynth-dialog.cpp:67
+#: gui/fluidsynth-dialog.cpp:68
msgid "Reverb"
msgstr "Dozvuk"
-#: gui/fluidsynth-dialog.cpp:69 gui/fluidsynth-dialog.cpp:101
+#: gui/fluidsynth-dialog.cpp:70 gui/fluidsynth-dialog.cpp:102
msgid "Active"
msgstr "Aktivní"
-#: gui/fluidsynth-dialog.cpp:71
+#: gui/fluidsynth-dialog.cpp:72
msgid "Room:"
msgstr "Místnost:"
-#: gui/fluidsynth-dialog.cpp:78
+#: gui/fluidsynth-dialog.cpp:79
msgid "Damp:"
msgstr "Tlumení:"
-#: gui/fluidsynth-dialog.cpp:85
+#: gui/fluidsynth-dialog.cpp:86
msgid "Width:"
msgstr "©íøka:"
-#: gui/fluidsynth-dialog.cpp:92 gui/fluidsynth-dialog.cpp:110
+#: gui/fluidsynth-dialog.cpp:93 gui/fluidsynth-dialog.cpp:111
msgid "Level:"
msgstr "Úroveò:"
-#: gui/fluidsynth-dialog.cpp:99
+#: gui/fluidsynth-dialog.cpp:100
msgid "Chorus"
msgstr "Sbor"
-#: gui/fluidsynth-dialog.cpp:103
+#: gui/fluidsynth-dialog.cpp:104
msgid "N:"
msgstr "N:"
-#: gui/fluidsynth-dialog.cpp:117
+#: gui/fluidsynth-dialog.cpp:118
msgid "Speed:"
msgstr "Rychlost:"
-#: gui/fluidsynth-dialog.cpp:124
+#: gui/fluidsynth-dialog.cpp:125
msgid "Depth:"
msgstr "Hloubka:"
-#: gui/fluidsynth-dialog.cpp:131
+#: gui/fluidsynth-dialog.cpp:132
msgid "Type:"
msgstr "Typ:"
-#: gui/fluidsynth-dialog.cpp:134
+#: gui/fluidsynth-dialog.cpp:135
msgid "Sine"
msgstr "Sinus"
-#: gui/fluidsynth-dialog.cpp:135
+#: gui/fluidsynth-dialog.cpp:136
msgid "Triangle"
msgstr "Trojúhrlník"
-#: gui/fluidsynth-dialog.cpp:139
+#: gui/fluidsynth-dialog.cpp:140
msgid "Interpolation:"
msgstr "Interpolace:"
-#: gui/fluidsynth-dialog.cpp:142
+#: gui/fluidsynth-dialog.cpp:143
msgid "None (fastest)"
msgstr "®ádná (Nejrychlej¹í)"
-#: gui/fluidsynth-dialog.cpp:143
+#: gui/fluidsynth-dialog.cpp:144
msgid "Linear"
msgstr "Lineární"
-#: gui/fluidsynth-dialog.cpp:144
+#: gui/fluidsynth-dialog.cpp:145
msgid "Fourth-order"
msgstr "Interpolace ètvrtého øádu"
-#: gui/fluidsynth-dialog.cpp:145
+#: gui/fluidsynth-dialog.cpp:146
msgid "Seventh-order"
msgstr "Interpolace sedmého øádu"
-#: gui/fluidsynth-dialog.cpp:149
+#: gui/fluidsynth-dialog.cpp:150
msgid "Reset"
msgstr "Resetovat"
-#: gui/fluidsynth-dialog.cpp:149
+#: gui/fluidsynth-dialog.cpp:150
msgid "Reset all FluidSynth settings to their default values."
msgstr "Resetovat ve¹kerá nastavení FludSynth n ajejich výchozí hodnoty."
-#: gui/fluidsynth-dialog.cpp:216
+#: gui/fluidsynth-dialog.cpp:217
msgid ""
"Do you really want to reset all FluidSynth settings to their default values?"
msgstr ""
"Opravdu chcete resetovat ve¹kerá nastavení FluidSynth na jejich výchozí "
"hodnoty?"
-#: base/main.cpp:210
+#: base/main.cpp:228
#, c-format
msgid "Engine does not support debug level '%s'"
msgstr "Jádro nepodporuje úroveò ladìní '%s'"
-#: base/main.cpp:288
+#: base/main.cpp:306
msgid "Menu"
msgstr "Menu"
-#: base/main.cpp:291 backends/platform/symbian/src/SymbianActions.cpp:45
+#: base/main.cpp:309 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:294 backends/platform/symbian/src/SymbianActions.cpp:50
+#: base/main.cpp:312 backends/platform/symbian/src/SymbianActions.cpp:50
#: backends/platform/wince/CEActionsPocket.cpp:42
msgid "Pause"
msgstr "Pauza"
-#: base/main.cpp:297
+#: base/main.cpp:315
msgid "Skip line"
msgstr "Pøeskoèit øádek"
-#: base/main.cpp:468
+#: base/main.cpp:507
msgid "Error running game:"
msgstr "Chyba pøi spu¹tìní hry:"
-#: base/main.cpp:492
+#: base/main.cpp:536
msgid "Could not find any engine capable of running the selected game"
msgstr "Nelze nalézt ¾ádné jádro schopné vybranou hru spustit"
@@ -1222,72 +1223,72 @@ msgstr "Zru¹eno u¾ivatelem"
msgid "Unknown error"
msgstr "Neznámá chyba"
-#: engines/advancedDetector.cpp:316
+#: engines/advancedDetector.cpp:317
#, c-format
msgid "The game in '%s' seems to be unknown."
msgstr "Hra v '%s' se zdá být neznámá."
-#: engines/advancedDetector.cpp:317
+#: engines/advancedDetector.cpp:318
msgid "Please, report the following data to the ScummVM team along with name"
msgstr "Prosím nahlaste následující data týmu ScummVM spolu se jménem"
-#: engines/advancedDetector.cpp:319
+#: engines/advancedDetector.cpp:320
msgid "of the game you tried to add and its version/language/etc.:"
msgstr "hry, kterou jste se pokusili pøidat a její verzi/jazyk/atd.:"
-#: engines/dialogs.cpp:84
+#: engines/dialogs.cpp:85
msgid "~R~esume"
msgstr "~P~okraèovat"
-#: engines/dialogs.cpp:86
+#: engines/dialogs.cpp:87
msgid "~L~oad"
msgstr "~N~ahrát"
-#: engines/dialogs.cpp:90
+#: engines/dialogs.cpp:91
msgid "~S~ave"
msgstr "~U~lo¾it"
-#: engines/dialogs.cpp:94
+#: engines/dialogs.cpp:95
msgid "~O~ptions"
msgstr "~V~olby"
-#: engines/dialogs.cpp:99
+#: engines/dialogs.cpp:100
msgid "~H~elp"
msgstr "~N~ápovìda"
-#: engines/dialogs.cpp:101
+#: engines/dialogs.cpp:102
msgid "~A~bout"
msgstr "~O~ programu"
-#: engines/dialogs.cpp:104 engines/dialogs.cpp:180
+#: engines/dialogs.cpp:105 engines/dialogs.cpp:181
msgid "~R~eturn to Launcher"
msgstr "~N~ávrat do Spou¹tìèe"
-#: engines/dialogs.cpp:106 engines/dialogs.cpp:182
+#: engines/dialogs.cpp:107 engines/dialogs.cpp:183
msgctxt "lowres"
msgid "~R~eturn to Launcher"
msgstr "~N~ávrat do Spou¹tìèe"
-#: engines/dialogs.cpp:115 engines/agi/saveload.cpp:803
-#: engines/drascula/saveload.cpp:338 engines/cruise/menu.cpp:212
-#: engines/sci/engine/kfile.cpp:742 engines/toltecs/menu.cpp:284
-#: engines/pegasus/pegasus.cpp:373
+#: engines/dialogs.cpp:116 engines/agi/saveload.cpp:803
+#: engines/cruise/menu.cpp:212 engines/drascula/saveload.cpp:336
+#: engines/neverhood/menumodule.cpp:873 engines/pegasus/pegasus.cpp:377
+#: engines/sci/engine/kfile.cpp:758 engines/toltecs/menu.cpp:281
msgid "Save game:"
msgstr "Ulo¾it hru:"
-#: engines/dialogs.cpp:115 engines/agi/saveload.cpp:803
-#: engines/drascula/saveload.cpp:338 engines/scumm/dialogs.cpp:187
-#: engines/cruise/menu.cpp:212 engines/sci/engine/kfile.cpp:742
-#: engines/toltecs/menu.cpp:284 engines/pegasus/pegasus.cpp:373
-#: backends/platform/symbian/src/SymbianActions.cpp:44
+#: engines/dialogs.cpp:116 backends/platform/symbian/src/SymbianActions.cpp:44
#: backends/platform/wince/CEActionsPocket.cpp:43
#: backends/platform/wince/CEActionsPocket.cpp:267
#: backends/platform/wince/CEActionsSmartphone.cpp:45
#: backends/platform/wince/CEActionsSmartphone.cpp:231
+#: engines/agi/saveload.cpp:803 engines/cruise/menu.cpp:212
+#: engines/drascula/saveload.cpp:336 engines/neverhood/menumodule.cpp:873
+#: engines/pegasus/pegasus.cpp:377 engines/sci/engine/kfile.cpp:758
+#: engines/scumm/dialogs.cpp:188 engines/toltecs/menu.cpp:281
msgid "Save"
msgstr "Ulo¾it"
-#: engines/dialogs.cpp:144
+#: engines/dialogs.cpp:145
msgid ""
"Sorry, this engine does not currently provide in-game help. Please consult "
"the README for basic information, and for instructions on how to obtain "
@@ -1297,7 +1298,7 @@ msgstr ""
"prohlédnìte si README pro základní informace a pro instrukce jak získat "
"dal¹í pomoc."
-#: engines/dialogs.cpp:228
+#: engines/dialogs.cpp:234 engines/pegasus/pegasus.cpp:393
#, c-format
msgid ""
"Gamestate save failed (%s)! Please consult the README for basic information, "
@@ -1306,37 +1307,37 @@ msgstr ""
"Ulo¾ení stavu hry selhalo (%s)! Prosím pøeètìte si dokumentaci pro základní "
"informace a pokyny k získání dal¹í podpory."
-#: engines/dialogs.cpp:301 engines/mohawk/dialogs.cpp:109
+#: engines/dialogs.cpp:307 engines/mohawk/dialogs.cpp:109
#: engines/mohawk/dialogs.cpp:170
msgid "~O~K"
msgstr "~O~K"
-#: engines/dialogs.cpp:302 engines/mohawk/dialogs.cpp:110
+#: engines/dialogs.cpp:308 engines/mohawk/dialogs.cpp:110
#: engines/mohawk/dialogs.cpp:171
msgid "~C~ancel"
msgstr "~Z~ru¹it"
-#: engines/dialogs.cpp:305
+#: engines/dialogs.cpp:311
msgid "~K~eys"
msgstr "~K~lávesy"
-#: engines/engine.cpp:240
+#: engines/engine.cpp:245
msgid "Could not initialize color format."
msgstr "Nelze zavést barevný formát."
-#: engines/engine.cpp:248
+#: engines/engine.cpp:253
msgid "Could not switch to video mode: '"
msgstr "Nelze pøepnout na re¾im obrazu: '"
-#: engines/engine.cpp:257
+#: engines/engine.cpp:262
msgid "Could not apply aspect ratio setting."
msgstr "Nelze pou¾ít nastavení pomìru stran."
-#: engines/engine.cpp:262
+#: engines/engine.cpp:267
msgid "Could not apply fullscreen setting."
msgstr "Nelze pou¾ít nastavení celé obrazovky."
-#: engines/engine.cpp:362
+#: engines/engine.cpp:367
msgid ""
"You appear to be playing this game directly\n"
"from the CD. This is known to cause problems,\n"
@@ -1350,7 +1351,7 @@ msgstr ""
"datové soubory na Vá¹ pevný disk.\n"
"Pro podrobnosti si pøeètìte README."
-#: engines/engine.cpp:373
+#: engines/engine.cpp:378
msgid ""
"This game has audio tracks in its disk. These\n"
"tracks need to be ripped from the disk using\n"
@@ -1364,7 +1365,7 @@ msgstr ""
"abyste mohli poslouchat hudbu ve høe.\n"
"Pro podrobnosti si pøeètìte README."
-#: engines/engine.cpp:431
+#: engines/engine.cpp:436
#, c-format
msgid ""
"Gamestate load failed (%s)! Please consult the README for basic information, "
@@ -1373,7 +1374,7 @@ msgstr ""
"Naètení stavu hry selhalo (%s)! Prosím pøeètìte si dokumentaci pro základní "
"informace a pokyny k získání dal¹í podpory."
-#: engines/engine.cpp:444
+#: engines/engine.cpp:449
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 "
@@ -1383,33 +1384,761 @@ msgstr ""
"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:447
+#: engines/engine.cpp:452
msgid "Start anyway"
msgstr "Pøesto spustit"
-#: engines/agi/detection.cpp:142 engines/drascula/detection.cpp:270
-#: engines/dreamweb/detection.cpp:47 engines/sci/detection.cpp:393
-#: engines/toltecs/detection.cpp:173
+#: audio/fmopl.cpp:50
+msgid "MAME OPL emulator"
+msgstr "MAME OPL Emulátor"
+
+#: audio/fmopl.cpp:52
+msgid "DOSBox OPL emulator"
+msgstr "DOSBox OPL Emulátor"
+
+#: audio/mididrv.cpp:209
+#, c-format
+msgid ""
+"The selected audio device '%s' was not found (e.g. might be turned off or "
+"disconnected)."
+msgstr ""
+"Zvolené zvukové zaøízení '%s' nebylo nalezeno (napø. mù¾e být vypnuto nebo "
+"odpojeno)."
+
+#: audio/mididrv.cpp:209 audio/mididrv.cpp:221 audio/mididrv.cpp:257
+#: audio/mididrv.cpp:272
+msgid "Attempting to fall back to the next available device..."
+msgstr "Pokus o navrácení na nejbli¾¹í dostupné zaøízení..."
+
+#: audio/mididrv.cpp:221
+#, c-format
+msgid ""
+"The selected audio device '%s' cannot be used. See log file for more "
+"information."
+msgstr ""
+"Zvolené zvukové zaøízení '%s' nelze pou¾ít. Podívejte se na záznam pro více "
+"informací."
+
+#: audio/mididrv.cpp:257
+#, c-format
+msgid ""
+"The preferred audio device '%s' was not found (e.g. might be turned off or "
+"disconnected)."
+msgstr ""
+"Upøednostòované zvukové zaøízení '%s' nebylo nalezeno (napø. mù¾e být "
+"vypnuto nebo odpojeno)."
+
+#: audio/mididrv.cpp:272
+#, c-format
+msgid ""
+"The preferred audio device '%s' cannot be used. See log file for more "
+"information."
+msgstr ""
+"Upøednostòované zvukové zaøízení '%s' nelze pou¾ít. Podívejte se na záznam "
+"pro více informací."
+
+#: audio/null.h:44
+msgid "No music"
+msgstr "Bez hudby"
+
+#: audio/mods/paula.cpp:196
+msgid "Amiga Audio Emulator"
+msgstr "Emulátor zvuku Amiga"
+
+#: audio/softsynth/adlib.cpp:2285
+msgid "AdLib Emulator"
+msgstr "AdLib Emulátor"
+
+#: audio/softsynth/appleiigs.cpp:33
+msgid "Apple II GS Emulator (NOT IMPLEMENTED)"
+msgstr "Apple II GS Emulátor (NENÍ ZAVEDEN)"
+
+#: audio/softsynth/sid.cpp:1430
+msgid "C64 Audio Emulator"
+msgstr "Emulátor zvuku C64"
+
+#: audio/softsynth/mt32.cpp:200
+msgid "Initializing MT-32 Emulator"
+msgstr "Zavádím MT-32 Emulátor"
+
+#: audio/softsynth/mt32.cpp:426
+msgid "MT-32 Emulator"
+msgstr "MT-32 Emulátor"
+
+#: audio/softsynth/pcspk.cpp:139
+msgid "PC Speaker Emulator"
+msgstr "PC Speaker Emulátor"
+
+#: audio/softsynth/pcspk.cpp:158
+msgid "IBM PCjr Emulator"
+msgstr "IBM PCjr Emulátor"
+
+#: backends/keymapper/remap-dialog.cpp:48
+msgid "Keymap:"
+msgstr "Mapa Kláves:"
+
+#: backends/keymapper/remap-dialog.cpp:67
+msgid " (Effective)"
+msgstr " (Aktivní)"
+
+#: backends/keymapper/remap-dialog.cpp:107
+msgid " (Active)"
+msgstr "(Aktivní)"
+
+#: backends/keymapper/remap-dialog.cpp:107
+msgid " (Blocked)"
+msgstr " (Blokováno)"
+
+#: backends/keymapper/remap-dialog.cpp:120
+msgid " (Global)"
+msgstr "(Globální)"
+
+#: backends/keymapper/remap-dialog.cpp:128
+msgid " (Game)"
+msgstr "(Hra)"
+
+#: backends/midi/windows.cpp:165
+msgid "Windows MIDI"
+msgstr "Windows MIDI"
+
+#: backends/platform/ds/arm9/source/dsoptions.cpp:56
+#: engines/scumm/dialogs.cpp:291
+msgid "~C~lose"
+msgstr "~Z~avøít"
+
+#: backends/platform/ds/arm9/source/dsoptions.cpp:57
+msgid "ScummVM Main Menu"
+msgstr "Hlavní Menu ScummVM"
+
+#: backends/platform/ds/arm9/source/dsoptions.cpp:63
+msgid "~L~eft handed mode"
+msgstr "~R~e¾im pro leváky"
+
+#: backends/platform/ds/arm9/source/dsoptions.cpp:64
+msgid "~I~ndy fight controls"
+msgstr "~O~vládání Indyho boje"
+
+#: backends/platform/ds/arm9/source/dsoptions.cpp:65
+msgid "Show mouse cursor"
+msgstr "Zobrazit kurzor my¹i"
+
+#: backends/platform/ds/arm9/source/dsoptions.cpp:66
+msgid "Snap to edges"
+msgstr "Pøichytit k okrajùm"
+
+#: backends/platform/ds/arm9/source/dsoptions.cpp:68
+msgid "Touch X Offset"
+msgstr "Dotykové vyrovnáni na ose X"
+
+#: backends/platform/ds/arm9/source/dsoptions.cpp:75
+msgid "Touch Y Offset"
+msgstr "Dotykové vyrovnáni na ose Y"
+
+#: backends/platform/ds/arm9/source/dsoptions.cpp:87
+msgid "Use laptop trackpad-style cursor control"
+msgstr "Pou¾ít styl kontroly kurzoru jako u ovládací podu¹ky laptopu"
+
+#: backends/platform/ds/arm9/source/dsoptions.cpp:88
+msgid "Tap for left click, double tap right click"
+msgstr "«uknìte pro levé kliknutí, dvakrát pro pravé kliknutí"
+
+#: backends/platform/ds/arm9/source/dsoptions.cpp:90
+msgid "Sensitivity"
+msgstr "Citlivost"
+
+#: backends/platform/ds/arm9/source/dsoptions.cpp:99
+msgid "Initial top screen scale:"
+msgstr "Poèáteèní zmìna velikosti horní obrazovky:"
+
+#: backends/platform/ds/arm9/source/dsoptions.cpp:105
+msgid "Main screen scaling:"
+msgstr "Zmìna velikosti hlavní obrazovky:"
+
+#: backends/platform/ds/arm9/source/dsoptions.cpp:107
+msgid "Hardware scale (fast, but low quality)"
+msgstr "Hardwarová zmìna velikosti (rychlé, ale nízká kvalita)"
+
+#: backends/platform/ds/arm9/source/dsoptions.cpp:108
+msgid "Software scale (good quality, but slower)"
+msgstr "Softwarová zmìna velikosti (dobrá kvalita, ale pomalej¹í)"
+
+#: backends/platform/ds/arm9/source/dsoptions.cpp:109
+msgid "Unscaled (you must scroll left and right)"
+msgstr "Beze zmìny velikosti (musíte posunovat doleva a doprava)"
+
+#: backends/platform/ds/arm9/source/dsoptions.cpp:111
+msgid "Brightness:"
+msgstr "Jas:"
+
+#: backends/platform/ds/arm9/source/dsoptions.cpp:121
+msgid "High quality audio (slower) (reboot)"
+msgstr "Vysoká kvalita zvuku (pomalej¹í) (restart) "
+
+#: backends/platform/ds/arm9/source/dsoptions.cpp:122
+msgid "Disable power off"
+msgstr "Zakázat vypnutí"
+
+#: backends/platform/iphone/osys_events.cpp:300
+msgid "Mouse-click-and-drag mode enabled."
+msgstr "Re¾im pøetáhnutí my¹i zapnut."
+
+#: backends/platform/iphone/osys_events.cpp:302
+msgid "Mouse-click-and-drag mode disabled."
+msgstr "Re¾im pøetáhnutí my¹i vypnut."
+
+#: backends/platform/iphone/osys_events.cpp:313
+msgid "Touchpad mode enabled."
+msgstr "Touchpad re¾im zapnut"
+
+#: backends/platform/iphone/osys_events.cpp:315
+msgid "Touchpad mode disabled."
+msgstr "Touchpad re¾im vypnut"
+
+#: backends/platform/maemo/maemo.cpp:209
+msgid "Click Mode"
+msgstr "Re¾im kliknutí"
+
+#: backends/platform/maemo/maemo.cpp:215
+#: backends/platform/symbian/src/SymbianActions.cpp:42
+#: backends/platform/wince/CEActionsPocket.cpp:60
+#: backends/platform/wince/CEActionsSmartphone.cpp:43
+#: backends/platform/tizen/form.cpp:275
+msgid "Left Click"
+msgstr "Levé Kliknutí"
+
+#: backends/platform/maemo/maemo.cpp:218
+msgid "Middle Click"
+msgstr "Kliknutí prostøedním tlaèítkem"
+
+#: backends/platform/maemo/maemo.cpp:221
+#: backends/platform/symbian/src/SymbianActions.cpp:43
+#: backends/platform/wince/CEActionsSmartphone.cpp:44
+#: backends/platform/tizen/form.cpp:267
+msgid "Right Click"
+msgstr "Pravé kliknutí"
+
+#: backends/platform/sdl/macosx/appmenu_osx.mm:77
+msgid "Hide ScummVM"
+msgstr "Skrýt ScummVM"
+
+#: backends/platform/sdl/macosx/appmenu_osx.mm:82
+msgid "Hide Others"
+msgstr "Skrýt Ostatní"
+
+#: backends/platform/sdl/macosx/appmenu_osx.mm:87
+msgid "Show All"
+msgstr "Zobrazit V¹e"
+
+#: backends/platform/sdl/macosx/appmenu_osx.mm:109
+#: backends/platform/sdl/macosx/appmenu_osx.mm:120
+msgid "Window"
+msgstr "Okno"
+
+#: backends/platform/sdl/macosx/appmenu_osx.mm:114
+msgid "Minimize"
+msgstr "Minimalizovat"
+
+#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:46
+msgid "Normal (no scaling)"
+msgstr "Normální (bez zmìny velikosti)"
+
+#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:65
+msgctxt "lowres"
+msgid "Normal (no scaling)"
+msgstr "Normální (bez zmìny velikosti)"
+
+#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2148
+msgid "Enabled aspect ratio correction"
+msgstr "Povolena korekce pomìru stran"
+
+#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2154
+msgid "Disabled aspect ratio correction"
+msgstr "Zakázána korekce pomìru stran"
+
+#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2209
+msgid "Active graphics filter:"
+msgstr "Aktivní grafický filtr:"
+
+#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2251
+msgid "Windowed mode"
+msgstr "Re¾im do okna"
+
+#: backends/graphics/opengl/opengl-graphics.cpp:118
+msgid "OpenGL"
+msgstr "OpenGL"
+
+#: backends/graphics/opengl/opengl-graphics.cpp:119
+msgid "OpenGL (No filtering)"
+msgstr "OpenGL (bez filtrování)"
+
+#: backends/platform/symbian/src/SymbianActions.cpp:38
+#: backends/platform/wince/CEActionsSmartphone.cpp:39
+msgid "Up"
+msgstr "Nahoru"
+
+#: backends/platform/symbian/src/SymbianActions.cpp:39
+#: backends/platform/wince/CEActionsSmartphone.cpp:40
+msgid "Down"
+msgstr "Dolù"
+
+#: backends/platform/symbian/src/SymbianActions.cpp:40
+#: backends/platform/wince/CEActionsSmartphone.cpp:41
+msgid "Left"
+msgstr "Doleva"
+
+#: backends/platform/symbian/src/SymbianActions.cpp:41
+#: backends/platform/wince/CEActionsSmartphone.cpp:42
+msgid "Right"
+msgstr "Doprava"
+
+#: backends/platform/symbian/src/SymbianActions.cpp:46
+#: backends/platform/wince/CEActionsSmartphone.cpp:47
+msgid "Zone"
+msgstr "Oblast"
+
+#: backends/platform/symbian/src/SymbianActions.cpp:47
+#: backends/platform/wince/CEActionsPocket.cpp:54
+#: backends/platform/wince/CEActionsSmartphone.cpp:48
+msgid "Multi Function"
+msgstr "Multi Funkce"
+
+#: backends/platform/symbian/src/SymbianActions.cpp:48
+msgid "Swap character"
+msgstr "Zamìnit znaky"
+
+#: backends/platform/symbian/src/SymbianActions.cpp:49
+msgid "Skip text"
+msgstr "Pøeskoèit text"
+
+#: backends/platform/symbian/src/SymbianActions.cpp:51
+msgid "Fast mode"
+msgstr "Rychlý re¾im"
+
+#: 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:218
+#: engines/scumm/dialogs.cpp:192 engines/scumm/help.cpp:82
+#: engines/scumm/help.cpp:84
+msgid "Quit"
+msgstr "Ukonèit"
+
+#: backends/platform/symbian/src/SymbianActions.cpp:53
+msgid "Debugger"
+msgstr "Ladící program"
+
+#: backends/platform/symbian/src/SymbianActions.cpp:54
+msgid "Global menu"
+msgstr "Globální menu"
+
+#: backends/platform/symbian/src/SymbianActions.cpp:55
+msgid "Virtual keyboard"
+msgstr "Virtuální klávesnice"
+
+#: backends/platform/symbian/src/SymbianActions.cpp:56
+msgid "Key mapper"
+msgstr "Mapovaè kláves"
+
+#: backends/events/symbiansdl/symbiansdl-events.cpp:184
+msgid "Do you want to quit ?"
+msgstr "Chcete ukonèit ?"
+
+#: backends/platform/wii/options.cpp:51
+msgid "Video"
+msgstr "Video"
+
+#: backends/platform/wii/options.cpp:54
+msgid "Current video mode:"
+msgstr "Souèasný re¾im obrazu:"
+
+#: backends/platform/wii/options.cpp:56
+msgid "Double-strike"
+msgstr "Dvojité pøe¹krtnutí"
+
+#: backends/platform/wii/options.cpp:60
+msgid "Horizontal underscan:"
+msgstr "Horizontální zmen¹ení"
+
+#: backends/platform/wii/options.cpp:66
+msgid "Vertical underscan:"
+msgstr "Vertikální zmen¹ení"
+
+#: backends/platform/wii/options.cpp:71
+msgid "Input"
+msgstr "Vstup"
+
+#: backends/platform/wii/options.cpp:74
+msgid "GC Pad sensitivity:"
+msgstr "Citlivost GC Padu"
+
+#: backends/platform/wii/options.cpp:80
+msgid "GC Pad acceleration:"
+msgstr "Zrychlení GC Padu"
+
+#: backends/platform/wii/options.cpp:86
+msgid "DVD"
+msgstr "DVD"
+
+#: backends/platform/wii/options.cpp:89 backends/platform/wii/options.cpp:101
+msgid "Status:"
+msgstr "Stav:"
+
+#: backends/platform/wii/options.cpp:90 backends/platform/wii/options.cpp:102
+msgid "Unknown"
+msgstr "Neznámé"
+
+#: backends/platform/wii/options.cpp:93
+msgid "Mount DVD"
+msgstr "Pøipojit DVD"
+
+#: backends/platform/wii/options.cpp:94
+msgid "Unmount DVD"
+msgstr "Odpojit DVD"
+
+#: backends/platform/wii/options.cpp:98
+msgid "SMB"
+msgstr "SMB"
+
+#: backends/platform/wii/options.cpp:106
+msgid "Server:"
+msgstr "Server:"
+
+#: backends/platform/wii/options.cpp:110
+msgid "Share:"
+msgstr "Sdílení:"
+
+#: backends/platform/wii/options.cpp:114
+msgid "Username:"
+msgstr "U¾ivatelské jméno"
+
+#: backends/platform/wii/options.cpp:118
+msgid "Password:"
+msgstr "Heslo"
+
+#: backends/platform/wii/options.cpp:121
+msgid "Init network"
+msgstr "Spustit sí»"
+
+#: backends/platform/wii/options.cpp:123
+msgid "Mount SMB"
+msgstr "Pøipojit SMB"
+
+#: backends/platform/wii/options.cpp:124
+msgid "Unmount SMB"
+msgstr "Odpojit SMB"
+
+#: backends/platform/wii/options.cpp:143
+msgid "DVD Mounted successfully"
+msgstr "DVD úspì¹nì pøipojeno"
+
+#: backends/platform/wii/options.cpp:146
+msgid "Error while mounting the DVD"
+msgstr "Chyba pøi pøipojování DVD"
+
+#: backends/platform/wii/options.cpp:148
+msgid "DVD not mounted"
+msgstr "DVD nepøipojeno"
+
+#: backends/platform/wii/options.cpp:161
+msgid "Network up, share mounted"
+msgstr "Sí» je zapnuta, sdílení pøipojeno"
+
+#: backends/platform/wii/options.cpp:163
+msgid "Network up"
+msgstr "Sí» je zapnuta"
+
+#: backends/platform/wii/options.cpp:166
+msgid ", error while mounting the share"
+msgstr ", chyba pøi pøipojování sdílení"
+
+#: backends/platform/wii/options.cpp:168
+msgid ", share not mounted"
+msgstr ", sdílení není pøipojeno"
+
+#: backends/platform/wii/options.cpp:174
+msgid "Network down"
+msgstr "Sí» je nedostupná"
+
+#: backends/platform/wii/options.cpp:178
+msgid "Initializing network"
+msgstr "Zavádím sí»"
+
+#: backends/platform/wii/options.cpp:182
+msgid "Timeout while initializing network"
+msgstr "Pøi zavádìní sítì vypr¹el limit"
+
+#: backends/platform/wii/options.cpp:186
+#, c-format
+msgid "Network not initialized (%d)"
+msgstr "Sí» není zavedena (%d)"
+
+#: backends/platform/wince/CEActionsPocket.cpp:46
+msgid "Hide Toolbar"
+msgstr "Skrýt Panel nástrojù"
+
+#: backends/platform/wince/CEActionsPocket.cpp:47
+msgid "Show Keyboard"
+msgstr "Zobrazit klávesnici"
+
+#: backends/platform/wince/CEActionsPocket.cpp:48
+msgid "Sound on/off"
+msgstr "Zvuk zapnout/vypnout"
+
+#: backends/platform/wince/CEActionsPocket.cpp:49
+msgid "Right click"
+msgstr "Pravé kliknutí"
+
+#: backends/platform/wince/CEActionsPocket.cpp:50
+msgid "Show/Hide Cursor"
+msgstr "Ukázat/Skrýt Kurzor"
+
+#: backends/platform/wince/CEActionsPocket.cpp:51
+msgid "Free look"
+msgstr "Rozhlí¾ení pomocí my¹i"
+
+#: backends/platform/wince/CEActionsPocket.cpp:52
+msgid "Zoom up"
+msgstr "Pøiblí¾ení nahoru"
+
+#: backends/platform/wince/CEActionsPocket.cpp:53
+msgid "Zoom down"
+msgstr "Pøiblí¾ení dolù"
+
+#: backends/platform/wince/CEActionsPocket.cpp:55
+#: backends/platform/wince/CEActionsSmartphone.cpp:49
+msgid "Bind Keys"
+msgstr "Pøiøadit klávesy"
+
+#: backends/platform/wince/CEActionsPocket.cpp:56
+msgid "Cursor Up"
+msgstr "©ipka Nahoru"
+
+#: backends/platform/wince/CEActionsPocket.cpp:57
+msgid "Cursor Down"
+msgstr "©ipka Dolù"
+
+#: backends/platform/wince/CEActionsPocket.cpp:58
+msgid "Cursor Left"
+msgstr "©ipka Doleva"
+
+#: backends/platform/wince/CEActionsPocket.cpp:59
+msgid "Cursor Right"
+msgstr "©ipka Doprava"
+
+#: 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:326
+#: backends/platform/wince/CEActionsSmartphone.cpp:287
+msgid " Are you sure you want to quit ? "
+msgstr " Jste si jisti, ¾e chcete odejít ? "
+
+#: backends/platform/wince/CEActionsSmartphone.cpp:50
+msgid "Keyboard"
+msgstr "Klávesnice"
+
+#: backends/platform/wince/CEActionsSmartphone.cpp:51
+msgid "Rotate"
+msgstr "Otáèet"
+
+#: backends/platform/wince/CELauncherDialog.cpp:56
+msgid "Using SDL driver "
+msgstr "Pou¾ívá ovladaè SDL"
+
+#: backends/platform/wince/CELauncherDialog.cpp:60
+msgid "Display "
+msgstr "Displej"
+
+#: 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:516
+msgid "Map right click action"
+msgstr "Mapovat èinnost pravé kliknutí"
+
+#: backends/platform/wince/wince-sdl.cpp:520
+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:529
+msgid "Map hide toolbar action"
+msgstr "Mapovat èinnost skrýt panel nástrojù"
+
+#: backends/platform/wince/wince-sdl.cpp:533
+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:542
+msgid "Map Zoom Up action (optional)"
+msgstr "Namapovat èinnost Pøiblí¾it Nahoru (nepovinné)"
+
+#: backends/platform/wince/wince-sdl.cpp:545
+msgid "Map Zoom Down action (optional)"
+msgstr "Namapovat èinnost Pøiblí¾it Dolù (nepovinné)"
+
+#: backends/platform/wince/wince-sdl.cpp:553
+msgid ""
+"Don't forget to map a key to 'Hide Toolbar' action to see the whole inventory"
+msgstr ""
+"Nezapomeòte namapovat klávesu k èinnosti 'Skrýt Panel Nástrojù, abyste "
+"vidìli celý inventáø"
+
+#: backends/events/default/default-events.cpp:196
+msgid "Do you really want to return to the Launcher?"
+msgstr "Opravdu se chcete vrátit tuto do Spou¹tìèe?"
+
+#: backends/events/default/default-events.cpp:196
+msgid "Launcher"
+msgstr "Spou¹tìè"
+
+#: backends/events/default/default-events.cpp:218
+msgid "Do you really want to quit?"
+msgstr "Opravdu chcete skonèit?"
+
+#: backends/events/gph/gph-events.cpp:386
+#: backends/events/gph/gph-events.cpp:429
+#: backends/events/openpandora/op-events.cpp:168
+msgid "Touchscreen 'Tap Mode' - Left Click"
+msgstr "'Re¾im «uknutí' Dotykové Obrazovky - Levé Kliknutí"
+
+#: backends/events/gph/gph-events.cpp:388
+#: backends/events/gph/gph-events.cpp:431
+#: backends/events/openpandora/op-events.cpp:170
+msgid "Touchscreen 'Tap Mode' - Right Click"
+msgstr "'Re¾im «uknutí' Dotykové Obrazovky - Pravé Kliknutí"
+
+#: backends/events/gph/gph-events.cpp:390
+#: backends/events/gph/gph-events.cpp:433
+#: backends/events/openpandora/op-events.cpp:172
+msgid "Touchscreen 'Tap Mode' - Hover (No Click)"
+msgstr "'Re¾im «uknutí' Dotykové Obrazovky - Najetí (Bez Kliknutí)"
+
+#: backends/events/gph/gph-events.cpp:410
+msgid "Maximum Volume"
+msgstr "Maximální Hlasitost"
+
+#: backends/events/gph/gph-events.cpp:412
+msgid "Increasing Volume"
+msgstr "Zvy¹uji Hlasitost"
+
+#: backends/events/gph/gph-events.cpp:418
+msgid "Minimal Volume"
+msgstr "Minimální Hlasitost"
+
+#: backends/events/gph/gph-events.cpp:420
+msgid "Decreasing Volume"
+msgstr "Sni¾uji Hlasitost"
+
+#: backends/events/openpandora/op-events.cpp:174
+msgid "Touchscreen 'Tap Mode' - Hover (DPad Clicks)"
+msgstr "'Re¾im «uknutí' Dotykové Obrazovky - Najetí (Dpad kliká)"
+
+#: backends/updates/macosx/macosx-updates.mm:67
+msgid "Check for Updates..."
+msgstr "Zkontrolovat Aktualizace..."
+
+#: backends/platform/tizen/form.cpp:263
+msgid "Right Click Once"
+msgstr "Pravé kliknutí jednou"
+
+#: backends/platform/tizen/form.cpp:271
+msgid "Move Only"
+msgstr "Pouze Pohyb"
+
+#: backends/platform/tizen/form.cpp:294
+msgid "Escape Key"
+msgstr "Klávesa Escape"
+
+#: backends/platform/tizen/form.cpp:299
+msgid "Game Menu"
+msgstr "Menu Hry"
+
+#: backends/platform/tizen/form.cpp:304
+msgid "Show Keypad"
+msgstr "Zobrazit Klávesnici"
+
+#: backends/platform/tizen/form.cpp:309
+msgid "Control Mouse"
+msgstr "Ovládání My¹i"
+
+#: backends/events/maemosdl/maemosdl-events.cpp:192
+msgid "Clicking Enabled"
+msgstr "Kliknutí Povoleno"
+
+#: backends/events/maemosdl/maemosdl-events.cpp:192
+msgid "Clicking Disabled"
+msgstr "Kliknutí Zakázáno"
+
+#: engines/agi/detection.cpp:142 engines/drascula/detection.cpp:302
+#: engines/dreamweb/detection.cpp:47 engines/neverhood/detection.cpp:160
+#: engines/sci/detection.cpp:394 engines/toltecs/detection.cpp:186
msgid "Use original save/load screens"
msgstr "Pou¾ít pùvodní obrazovky naètení/ulo¾ení"
-#: engines/agi/detection.cpp:143 engines/drascula/detection.cpp:271
-#: engines/dreamweb/detection.cpp:48 engines/sci/detection.cpp:394
-#: engines/toltecs/detection.cpp:174
+#: engines/agi/detection.cpp:143 engines/drascula/detection.cpp:303
+#: engines/dreamweb/detection.cpp:48 engines/neverhood/detection.cpp:161
+#: engines/sci/detection.cpp:395 engines/toltecs/detection.cpp:187
msgid "Use the original save/load screens, instead of the ScummVM ones"
msgstr "Pou¾ít pùvodní obrazovky naètení/ulo¾ení místo ze ScummVM"
-#: engines/agi/saveload.cpp:816 engines/drascula/saveload.cpp:351
-#: engines/sci/engine/kfile.cpp:841 engines/toltecs/menu.cpp:259
+#: engines/agi/saveload.cpp:816 engines/drascula/saveload.cpp:349
+#: engines/neverhood/menumodule.cpp:886 engines/sci/engine/kfile.cpp:857
+#: engines/toltecs/menu.cpp:256
msgid "Restore game:"
msgstr "Obnovit hru"
-#: engines/agi/saveload.cpp:816 engines/drascula/saveload.cpp:351
-#: engines/sci/engine/kfile.cpp:841 engines/toltecs/menu.cpp:259
+#: engines/agi/saveload.cpp:816 engines/drascula/saveload.cpp:349
+#: engines/neverhood/menumodule.cpp:886 engines/sci/engine/kfile.cpp:857
+#: engines/toltecs/menu.cpp:256
msgid "Restore"
msgstr "Obnovit"
-#: engines/drascula/saveload.cpp:49
+#: engines/agos/saveload.cpp:160 engines/scumm/scumm.cpp:2321
+#, c-format
+msgid ""
+"Failed to load game state from file:\n"
+"\n"
+"%s"
+msgstr ""
+"Nahrání stavu hry selhalo ze souboru:\n"
+"\n"
+"%s"
+
+#: engines/agos/saveload.cpp:195 engines/scumm/scumm.cpp:2314
+#, c-format
+msgid ""
+"Failed to save game state to file:\n"
+"\n"
+"%s"
+msgstr ""
+"Ulo¾ení stavu hry selhalo do souboru:\n"
+"\n"
+"%s"
+
+#: engines/agos/saveload.cpp:203 engines/scumm/scumm.cpp:2332
+#, c-format
+msgid ""
+"Successfully saved game state in file:\n"
+"\n"
+"%s"
+msgstr ""
+"Stav hry úspì¹nì ulo¾en do:\n"
+"\n"
+"%s"
+
+#: engines/agos/animation.cpp:557
+#, c-format
+msgid "Cutscene file '%s' not found!"
+msgstr "Soubor videa '%s' nenalezen'"
+
+#: engines/drascula/saveload.cpp:47
msgid ""
"ScummVM found that you have old savefiles for Drascula that should be "
"converted.\n"
@@ -1435,27 +2164,303 @@ msgstr "Pou¾ít re¾im jasné palety"
msgid "Display graphics using the game's bright palette"
msgstr "Zobrazit grafiku pomocí jasné palety hry"
-#: engines/sci/detection.cpp:373
+#: engines/gob/inter_playtoons.cpp:256 engines/gob/inter_v2.cpp:1470
+#: engines/tinsel/saveload.cpp:532
+msgid "Failed to load game state from file."
+msgstr "Nelze naèíst stav hry ze souboru."
+
+#: engines/gob/inter_v2.cpp:1540 engines/tinsel/saveload.cpp:545
+msgid "Failed to save game state to file."
+msgstr "Nelze ulo¾it stav hry do souboru."
+
+#: engines/gob/inter_v5.cpp:107
+msgid "Failed to delete file."
+msgstr "Nelze smazat soubor."
+
+#: engines/groovie/detection.cpp:312
+msgid "Fast movie speed"
+msgstr "Zvý¹ená rychlost videa"
+
+#: engines/groovie/detection.cpp:313
+msgid "Play movies at an increased speed"
+msgstr "Pøehrát videa se zvý¹enou rychlostí"
+
+#: engines/groovie/script.cpp:399
+msgid "Failed to save game"
+msgstr "Nelze ulo¾it hru."
+
+#. I18N: Studio audience adds an applause and cheering sounds whenever
+#. Malcolm makes a joke.
+#: engines/kyra/detection.cpp:62
+msgid "Studio audience"
+msgstr "Publikum ve studiu"
+
+#: engines/kyra/detection.cpp:63
+msgid "Enable studio audience"
+msgstr "Povolit publikum ve studiu"
+
+#. I18N: This option allows the user to skip text and cutscenes.
+#: engines/kyra/detection.cpp:73
+msgid "Skip support"
+msgstr "Podpora pøeskoèení"
+
+#: engines/kyra/detection.cpp:74
+msgid "Allow text and cutscenes to be skipped"
+msgstr "Umo¾nit, aby text a videa mohly být pøeskoèeny"
+
+#. I18N: Helium mode makes people sound like they've inhaled Helium.
+#: engines/kyra/detection.cpp:84
+msgid "Helium mode"
+msgstr "Héliový re¾im"
+
+#: engines/kyra/detection.cpp:85
+msgid "Enable helium mode"
+msgstr "Zapnout héliový re¾im"
+
+#. I18N: When enabled, this option makes scrolling smoother when
+#. changing from one screen to another.
+#: engines/kyra/detection.cpp:99
+msgid "Smooth scrolling"
+msgstr "Plynulé posunování"
+
+#: engines/kyra/detection.cpp:100
+msgid "Enable smooth scrolling when walking"
+msgstr "Povolit plynulé posunování pøi chùzi"
+
+#. I18N: When enabled, this option changes the cursor when it floats to the
+#. edge of the screen to a directional arrow. The player can then click to
+#. walk towards that direction.
+#: engines/kyra/detection.cpp:112
+msgid "Floating cursors"
+msgstr "Plovoucí kurzory"
+
+#: engines/kyra/detection.cpp:113
+msgid "Enable floating cursors"
+msgstr "Povolit plovoucí kurzory"
+
+#. I18N: HP stands for Hit Points
+#: engines/kyra/detection.cpp:127
+msgid "HP bar graphs"
+msgstr "Sloupcový indikátor zdraví"
+
+#: engines/kyra/detection.cpp:128
+msgid "Enable hit point bar graphs"
+msgstr "Povolit sloupcový indikátor zdraví"
+
+#: engines/kyra/lol.cpp:478
+msgid "Attack 1"
+msgstr "Útok 1"
+
+#: engines/kyra/lol.cpp:479
+msgid "Attack 2"
+msgstr "Útok 2"
+
+#: engines/kyra/lol.cpp:480
+msgid "Attack 3"
+msgstr "Útok 3"
+
+#: engines/kyra/lol.cpp:481
+msgid "Move Forward"
+msgstr "Vpøed"
+
+#: engines/kyra/lol.cpp:482
+msgid "Move Back"
+msgstr "Vzad"
+
+#: engines/kyra/lol.cpp:483
+msgid "Slide Left"
+msgstr "Pøesunout se Doleva"
+
+#: engines/kyra/lol.cpp:484
+msgid "Slide Right"
+msgstr "Pøesunout se Doprava"
+
+#: engines/kyra/lol.cpp:485 engines/pegasus/pegasus.cpp:2509
+msgid "Turn Left"
+msgstr "Otoèit se doleva"
+
+#: engines/kyra/lol.cpp:486 engines/pegasus/pegasus.cpp:2510
+msgid "Turn Right"
+msgstr "Otoèit se doprava"
+
+#: engines/kyra/lol.cpp:487
+msgid "Rest"
+msgstr "Odpoèinout si"
+
+#: engines/kyra/lol.cpp:488
+msgid "Options"
+msgstr "Volby"
+
+#: engines/kyra/lol.cpp:489
+msgid "Choose Spell"
+msgstr "Zvolit Kouzlo"
+
+#: engines/kyra/sound_midi.cpp:477
+msgid ""
+"You appear to be using a General MIDI device,\n"
+"but your game only supports Roland MT32 MIDI.\n"
+"We try to map the Roland MT32 instruments to\n"
+"General MIDI ones. It is still possible that\n"
+"some tracks sound incorrect."
+msgstr ""
+"Zdá se, ¾e pou¾íváte zaøízení General MIDI,\n"
+"ale va¹e hra podporuje pouze Roland MT32 MIDI.\n"
+"Sna¾íme se mapovat nástroje Roland MT32 na\n"
+"ty od General MIDI. Je stále mo¾né, ¾e\n"
+"nìkteré stopy nebudou znít správnì."
+
+#. I18N: Option for fast scene switching
+#: engines/mohawk/dialogs.cpp:92 engines/mohawk/dialogs.cpp:167
+msgid "~Z~ip Mode Activated"
+msgstr "~R~e¾im Svi¹tìní Aktivován"
+
+#: engines/mohawk/dialogs.cpp:93
+msgid "~T~ransitions Enabled"
+msgstr "~P~øechody zapnuty"
+
+#. I18N: Drop book page
+#: engines/mohawk/dialogs.cpp:95
+msgid "~D~rop Page"
+msgstr "~Z~ahodit Stránku"
+
+#: engines/mohawk/dialogs.cpp:99
+msgid "~S~how Map"
+msgstr "~Z~obrazit Mapu"
+
+#: engines/mohawk/dialogs.cpp:105
+msgid "~M~ain Menu"
+msgstr "~H~lavní Menu"
+
+#: engines/mohawk/dialogs.cpp:168
+msgid "~W~ater Effect Enabled"
+msgstr "~E~fekt Vody Zapnut"
+
+#: engines/neverhood/detection.cpp:167
+msgid "Skip the Hall of Records storyboard scenes"
+msgstr "Pøeskoèit scény v Síni záznamù"
+
+#: engines/neverhood/detection.cpp:168
+msgid "Allows the player to skip past the Hall of Records storyboard scenes"
+msgstr "Umo¾òuje hráèi pøeskoèit scény v Síni záznamù"
+
+#: engines/neverhood/detection.cpp:174
+msgid "Scale the making of videos to full screen"
+msgstr "Zvìt¹it filmy o výrobì na celou obrazovku"
+
+#: engines/neverhood/detection.cpp:175
+msgid "Scale the making of videos, so that they use the whole screen"
+msgstr "Zvìt¹it filmy o výrobì tak, aby vyu¾ivaly celou obrazovku"
+
+#: engines/parallaction/saveload.cpp:133
+#, c-format
+msgid ""
+"Can't save game in slot %i\n"
+"\n"
+msgstr ""
+"Nelze ulo¾it hru do pozice %i\n"
+"\n"
+
+#: engines/parallaction/saveload.cpp:204
+msgid "Loading game..."
+msgstr "Nahrávání hry..."
+
+#: engines/parallaction/saveload.cpp:219
+msgid "Saving game..."
+msgstr "Ukládání hry..."
+
+#: engines/parallaction/saveload.cpp:272
+msgid ""
+"ScummVM found that you have old savefiles for Nippon Safes that should be "
+"renamed.\n"
+"The old names are 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 next time.\n"
+msgstr ""
+"ScummVM zjistil, ¾e máte staré ulo¾ené pozice pro Nippon Safes, které by "
+"mìly být pøejmenovány.\n"
+"Staré názvy ji¾ nejsou podporovány, tak¾e pokud je nepøevedete, nebudete "
+"moci va¹e hry naèíst.\n"
+"\n"
+"Stisknìte OK, abyste je pøevedli teï, jinak budete po¾ádáni pøí¹tì.\n"
+
+#: engines/parallaction/saveload.cpp:319
+msgid "ScummVM successfully converted all your savefiles."
+msgstr "ScummVM úspì¹nì pøevedl v¹echny va¹e ulo¾ené pozice. "
+
+#: engines/parallaction/saveload.cpp:321
+msgid ""
+"ScummVM printed some warnings in your console window and can't guarantee all "
+"your files have been converted.\n"
+"\n"
+"Please report to the team."
+msgstr ""
+"ScummVM vytiskl nìkterá varování ve va¹em oknì konzole a nemù¾e zaruèit, ¾e "
+"v¹echny va¹e soubory byly pøevedeny.\n"
+"\n"
+"Prosím nahlaste to týmu"
+
+#: engines/pegasus/pegasus.cpp:714
+msgid "Invalid save file name"
+msgstr "Neplatný název souboru"
+
+#: engines/pegasus/pegasus.cpp:2507
+msgid "Up/Zoom In/Move Forward/Open Doors"
+msgstr "Nahoru/Pøiblí¾it/Pohyb dopøedu/Otevøít dveøe"
+
+#: engines/pegasus/pegasus.cpp:2508
+msgid "Down/Zoom Out"
+msgstr "Dolù/Oddálení"
+
+#: engines/pegasus/pegasus.cpp:2511
+msgid "Display/Hide Inventory Tray"
+msgstr "Zobrazit/Skrýt podnos inventáøe"
+
+#: engines/pegasus/pegasus.cpp:2512
+msgid "Display/Hide Biochip Tray"
+msgstr "Zobrazit/Skrýt podnos bioèipu"
+
+#: engines/pegasus/pegasus.cpp:2513
+msgid "Action/Select"
+msgstr "Èinnost/Vybrat"
+
+#: engines/pegasus/pegasus.cpp:2514
+msgid "Toggle Center Data Display"
+msgstr "Pøepnout centrální datovou obrazovku"
+
+#: engines/pegasus/pegasus.cpp:2515
+msgid "Display/Hide Info Screen"
+msgstr "Zobrazit/Skrýto obrazovku informací"
+
+#: engines/pegasus/pegasus.cpp:2516
+msgid "Display/Hide Pause Menu"
+msgstr "Zobrazit/Skrýt "
+
+#: engines/pegasus/pegasus.cpp:2517
+msgid "???"
+msgstr "???"
+
+#: engines/sci/detection.cpp:374
msgid "EGA undithering"
msgstr "Nerozkládání EGA"
-#: engines/sci/detection.cpp:374
+#: engines/sci/detection.cpp:375
msgid "Enable undithering in EGA games"
msgstr "Povolit nerozkládání v EGA hrách"
-#: engines/sci/detection.cpp:383
+#: engines/sci/detection.cpp:384
msgid "Prefer digital sound effects"
msgstr "Upøednostòovat digitální zvukové efekty"
-#: engines/sci/detection.cpp:384
+#: engines/sci/detection.cpp:385
msgid "Prefer digital sound effects instead of synthesized ones"
msgstr "Upøednostòovat digitální zvukové efekty pøed syntetizovanými"
-#: engines/sci/detection.cpp:403
+#: engines/sci/detection.cpp:404
msgid "Use IMF/Yamaha FB-01 for MIDI output"
msgstr "Pou¾ít IMF/Yamaha FB-01 pro výstup MIDI"
-#: engines/sci/detection.cpp:404
+#: engines/sci/detection.cpp:405
msgid ""
"Use an IBM Music Feature card or a Yamaha FB-01 FM synth module for MIDI "
"output"
@@ -1463,163 +2468,145 @@ msgstr ""
"Pou¾ít kartu IBM Music Feature nebo modul syntetizátoru Yamaha FB-01 FM pro "
"výstup MIDI"
-#: engines/sci/detection.cpp:414
+#: engines/sci/detection.cpp:415
msgid "Use CD audio"
msgstr "Pou¾ít zvuky na CD"
-#: engines/sci/detection.cpp:415
+#: engines/sci/detection.cpp:416
msgid "Use CD audio instead of in-game audio, if available"
msgstr "Pou¾ít zvuky na CD místo ve høe, pokud je dostupné"
-#: engines/sci/detection.cpp:425
+#: engines/sci/detection.cpp:426
msgid "Use Windows cursors"
msgstr "Pou¾ít kurzory Windows"
-#: engines/sci/detection.cpp:426
+#: engines/sci/detection.cpp:427
msgid ""
"Use the Windows cursors (smaller and monochrome) instead of the DOS ones"
msgstr "Pou¾ít kurzory Windows (men¹í a èernobílé) místo kurzorù z DOS"
-#: engines/sci/detection.cpp:436
+#: engines/sci/detection.cpp:437
msgid "Use silver cursors"
msgstr "Pou¾ít støíbrné kurzory"
-#: engines/sci/detection.cpp:437
+#: engines/sci/detection.cpp:438
msgid ""
"Use the alternate set of silver cursors, instead of the normal golden ones"
msgstr "Pou¾ít alternativní sadu støíbrných kurzorù místo standardních zlatých"
-#: engines/scumm/dialogs.cpp:175
+#: engines/scumm/dialogs.cpp:176
#, c-format
msgid "Insert Disk %c and Press Button to Continue."
msgstr "Vlo¾te Disk %c a Stisknìte Tlaèítko Pro Pokraèování."
-#: engines/scumm/dialogs.cpp:176
+#: engines/scumm/dialogs.cpp:177
#, c-format
msgid "Unable to Find %s, (%c%d) Press Button."
msgstr "Nelze Najít %s, (%c%d) Stisknìte Tlaèítko."
-#: engines/scumm/dialogs.cpp:177
+#: engines/scumm/dialogs.cpp:178
#, 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
+#: engines/scumm/dialogs.cpp:179
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
+#: engines/scumm/dialogs.cpp:183
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
+#: engines/scumm/dialogs.cpp:185
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
+#: engines/scumm/dialogs.cpp:190
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:215
-msgid "Quit"
-msgstr "Ukonèit"
-
-#: engines/scumm/dialogs.cpp:193
+#: engines/scumm/dialogs.cpp:194
msgid "Insert save/load game disk"
msgstr "Vlo¾te herní disk pro ulo¾ení/naètení"
-#: engines/scumm/dialogs.cpp:194
+#: engines/scumm/dialogs.cpp:195
msgid "You must enter a name"
msgstr "Musíte zadat jméno"
-#: engines/scumm/dialogs.cpp:195
+#: engines/scumm/dialogs.cpp:196
msgid "The game was NOT saved (disk full?)"
msgstr "Hra NEBYLA ulo¾ena (plný disk?)"
-#: engines/scumm/dialogs.cpp:196
+#: engines/scumm/dialogs.cpp:197
msgid "The game was NOT loaded"
msgstr "Hra NEBYLA naètena"
-#: engines/scumm/dialogs.cpp:197
+#: engines/scumm/dialogs.cpp:198
#, c-format
msgid "Saving '%s'"
msgstr "Ukládám '%s'"
-#: engines/scumm/dialogs.cpp:198
+#: engines/scumm/dialogs.cpp:199
#, c-format
msgid "Loading '%s'"
msgstr "Naèítám '%s'"
-#: engines/scumm/dialogs.cpp:199
+#: engines/scumm/dialogs.cpp:200
msgid "Name your SAVE game"
msgstr "Pojmenujte svoji ULO®ENOU hru"
-#: engines/scumm/dialogs.cpp:200
+#: engines/scumm/dialogs.cpp:201
msgid "Select a game to LOAD"
msgstr "Vyberte hru k NAÈTENÍ"
-#: engines/scumm/dialogs.cpp:201
+#: engines/scumm/dialogs.cpp:202
msgid "Game title)"
msgstr "Název hry"
#. I18N: Previous page button
-#: engines/scumm/dialogs.cpp:287
+#: engines/scumm/dialogs.cpp:288
msgid "~P~revious"
msgstr "~P~øedchozí"
#. I18N: Next page button
-#: engines/scumm/dialogs.cpp:289
+#: engines/scumm/dialogs.cpp:290
msgid "~N~ext"
msgstr "~D~al¹í"
-#: 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
+#: engines/scumm/dialogs.cpp:598
msgid "Speech Only"
msgstr "Pouze Øeè"
-#: engines/scumm/dialogs.cpp:598
+#: engines/scumm/dialogs.cpp:599
msgid "Speech and Subtitles"
msgstr "Øeè a Titulky"
-#: engines/scumm/dialogs.cpp:599
+#: engines/scumm/dialogs.cpp:600
msgid "Subtitles Only"
msgstr "Pouze Titulky"
-#: engines/scumm/dialogs.cpp:607
+#: engines/scumm/dialogs.cpp:608
msgctxt "lowres"
msgid "Speech & Subs"
msgstr "Øeè a Titulky"
-#: engines/scumm/dialogs.cpp:653
+#: engines/scumm/dialogs.cpp:654
msgid "Select a Proficiency Level."
msgstr "Vyberte úroveò odbornosti."
-#: engines/scumm/dialogs.cpp:655
+#: engines/scumm/dialogs.cpp:656
msgid "Refer to your Loom(TM) manual for help."
msgstr "Pro nápovìdu si pøeètìte manuál Loom(TM)."
-#: engines/scumm/dialogs.cpp:658
-msgid "Standard"
-msgstr "Standardní"
-
-#: engines/scumm/dialogs.cpp:659
+#: engines/scumm/dialogs.cpp:660
msgid "Practice"
msgstr "Cvièení"
-#: engines/scumm/dialogs.cpp:660
+#: engines/scumm/dialogs.cpp:661
msgid "Expert"
msgstr "Pokroèilý"
@@ -2136,7 +3123,7 @@ msgstr "Letìt doprava"
msgid "Fly to lower right"
msgstr "Letìt doprava dolù"
-#: engines/scumm/scumm.cpp:1776
+#: engines/scumm/scumm.cpp:1777
#, c-format
msgid ""
"Native MIDI support requires the Roland Upgrade from LucasArts,\n"
@@ -2145,40 +3132,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:2303 engines/agos/saveload.cpp:220
-#, c-format
-msgid ""
-"Failed to save game state to file:\n"
-"\n"
-"%s"
-msgstr ""
-"Ulo¾ení stavu hry selhalo do souboru:\n"
-"\n"
-"%s"
-
-#: engines/scumm/scumm.cpp:2310 engines/agos/saveload.cpp:185
-#, c-format
-msgid ""
-"Failed to load game state from file:\n"
-"\n"
-"%s"
-msgstr ""
-"Nahrání stavu hry selhalo ze souboru:\n"
-"\n"
-"%s"
-
-#: engines/scumm/scumm.cpp:2322 engines/agos/saveload.cpp:228
-#, c-format
-msgid ""
-"Successfully saved game state in file:\n"
-"\n"
-"%s"
-msgstr ""
-"Stav hry úspì¹nì ulo¾en do:\n"
-"\n"
-"%s"
-
-#: engines/scumm/scumm.cpp:2537
+#: engines/scumm/scumm.cpp:2547
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' "
@@ -2188,190 +3142,6 @@ 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."
-#. I18N: Option for fast scene switching
-#: engines/mohawk/dialogs.cpp:92 engines/mohawk/dialogs.cpp:167
-msgid "~Z~ip Mode Activated"
-msgstr "~R~e¾im Svi¹tìní Aktivován"
-
-#: engines/mohawk/dialogs.cpp:93
-msgid "~T~ransitions Enabled"
-msgstr "~P~øechody zapnuty"
-
-#. I18N: Drop book page
-#: engines/mohawk/dialogs.cpp:95
-msgid "~D~rop Page"
-msgstr "~Z~ahodit Stránku"
-
-#: engines/mohawk/dialogs.cpp:99
-msgid "~S~how Map"
-msgstr "~Z~obrazit Mapu"
-
-#: engines/mohawk/dialogs.cpp:105
-msgid "~M~ain Menu"
-msgstr "~H~lavní Menu"
-
-#: engines/mohawk/dialogs.cpp:168
-msgid "~W~ater Effect Enabled"
-msgstr "~E~fekt Vody Zapnut"
-
-#: engines/agos/animation.cpp:557
-#, c-format
-msgid "Cutscene file '%s' not found!"
-msgstr "Soubor videa '%s' nenalezen'"
-
-#: engines/gob/inter_playtoons.cpp:256 engines/gob/inter_v2.cpp:1287
-#: engines/tinsel/saveload.cpp:532
-msgid "Failed to load game state from file."
-msgstr "Nelze naèíst stav hry ze souboru."
-
-#: engines/gob/inter_v2.cpp:1357 engines/tinsel/saveload.cpp:545
-msgid "Failed to save game state to file."
-msgstr "Nelze ulo¾it stav hry do souboru."
-
-#: engines/gob/inter_v5.cpp:107
-msgid "Failed to delete file."
-msgstr "Nelze smazat soubor."
-
-#: engines/groovie/detection.cpp:312
-msgid "Fast movie speed"
-msgstr "Zvý¹ená rychlost videa"
-
-#: engines/groovie/detection.cpp:313
-msgid "Play movies at an increased speed"
-msgstr "Pøehrát videa se zvý¹enou rychlostí"
-
-#: engines/groovie/script.cpp:420
-msgid "Failed to save game"
-msgstr "Nelze ulo¾it hru."
-
-#. I18N: Studio audience adds an applause and cheering sounds whenever
-#. Malcolm makes a joke.
-#: engines/kyra/detection.cpp:62
-msgid "Studio audience"
-msgstr "Publikum ve studiu"
-
-#: engines/kyra/detection.cpp:63
-msgid "Enable studio audience"
-msgstr "Povolit publikum ve studiu"
-
-#. I18N: This option allows the user to skip text and cutscenes.
-#: engines/kyra/detection.cpp:73
-msgid "Skip support"
-msgstr "Podpora pøeskoèení"
-
-#: engines/kyra/detection.cpp:74
-msgid "Allow text and cutscenes to be skipped"
-msgstr "Umo¾nit, aby text a videa mohly být pøeskoèeny"
-
-#. I18N: Helium mode makes people sound like they've inhaled Helium.
-#: engines/kyra/detection.cpp:84
-msgid "Helium mode"
-msgstr "Héliový re¾im"
-
-#: engines/kyra/detection.cpp:85
-msgid "Enable helium mode"
-msgstr "Zapnout héliový re¾im"
-
-#. I18N: When enabled, this option makes scrolling smoother when
-#. changing from one screen to another.
-#: engines/kyra/detection.cpp:99
-msgid "Smooth scrolling"
-msgstr "Plynulé posunování"
-
-#: engines/kyra/detection.cpp:100
-msgid "Enable smooth scrolling when walking"
-msgstr "Povolit plynulé posunování pøi chùzi"
-
-#. I18N: When enabled, this option changes the cursor when it floats to the
-#. edge of the screen to a directional arrow. The player can then click to
-#. walk towards that direction.
-#: engines/kyra/detection.cpp:112
-msgid "Floating cursors"
-msgstr "Plovoucí kurzory"
-
-#: engines/kyra/detection.cpp:113
-msgid "Enable floating cursors"
-msgstr "Povolit plovoucí kurzory"
-
-#. I18N: HP stands for Hit Points
-#: engines/kyra/detection.cpp:127
-msgid "HP bar graphs"
-msgstr "Sloupcový indikátor zdraví"
-
-#: engines/kyra/detection.cpp:128
-msgid "Enable hit point bar graphs"
-msgstr "Povolit sloupcový indikátor zdraví"
-
-#: engines/kyra/lol.cpp:478
-msgid "Attack 1"
-msgstr "Útok 1"
-
-#: engines/kyra/lol.cpp:479
-msgid "Attack 2"
-msgstr "Útok 2"
-
-#: engines/kyra/lol.cpp:480
-msgid "Attack 3"
-msgstr "Útok 3"
-
-#: engines/kyra/lol.cpp:481
-msgid "Move Forward"
-msgstr "Vpøed"
-
-#: engines/kyra/lol.cpp:482
-msgid "Move Back"
-msgstr "Vzad"
-
-#: engines/kyra/lol.cpp:483
-msgid "Slide Left"
-msgstr "Pøesunout se Doleva"
-
-#: engines/kyra/lol.cpp:484
-msgid "Slide Right"
-msgstr "Pøesunout se Doprava"
-
-#: engines/kyra/lol.cpp:485 engines/pegasus/pegasus.cpp:2447
-msgid "Turn Left"
-msgstr "Otoèit se doleva"
-
-#: engines/kyra/lol.cpp:486 engines/pegasus/pegasus.cpp:2448
-msgid "Turn Right"
-msgstr "Otoèit se doprava"
-
-#: engines/kyra/lol.cpp:487
-msgid "Rest"
-msgstr "Odpoèinout si"
-
-#: engines/kyra/lol.cpp:488
-msgid "Options"
-msgstr "Volby"
-
-#: engines/kyra/lol.cpp:489
-msgid "Choose Spell"
-msgstr "Zvolit Kouzlo"
-
-#: engines/kyra/sound_midi.cpp:477
-msgid ""
-"You appear to be using a General MIDI device,\n"
-"but your game only supports Roland MT32 MIDI.\n"
-"We try to map the Roland MT32 instruments to\n"
-"General MIDI ones. It is still possible that\n"
-"some tracks sound incorrect."
-msgstr ""
-"Zdá se, ¾e pou¾íváte zaøízení General MIDI,\n"
-"ale va¹e hra podporuje pouze Roland MT32 MIDI.\n"
-"Sna¾íme se mapovat nástroje Roland MT32 na\n"
-"ty od General MIDI. Je stále mo¾né, ¾e\n"
-"nìkteré stopy nebudou znít správnì."
-
-#: engines/queen/queen.cpp:59
-msgid "Alternative intro"
-msgstr "Alternativní úvod"
-
-#: engines/queen/queen.cpp:60
-msgid "Use an alternative game intro (CD version only)"
-msgstr "Pou¾ít jinou verzi úvodu (Pouze verze CD)"
-
#: engines/sky/compact.cpp:130
msgid ""
"Unable to find \"sky.cpt\" file!\n"
@@ -2396,20 +3166,20 @@ msgstr "Úvod z diskety"
msgid "Use the floppy version's intro (CD version only)"
msgstr "Pou¾ít verzi úvodu z diskety (Pouze verze CD)"
-#: engines/sword1/animation.cpp:519
+#: engines/sword1/animation.cpp:524
#, c-format
msgid "PSX stream cutscene '%s' cannot be played in paletted mode"
msgstr "Proud videa PSX '%s' nemù¾e být pøehrán v re¾imu palety"
-#: engines/sword1/animation.cpp:540 engines/sword2/animation.cpp:439
+#: engines/sword1/animation.cpp:545 engines/sword2/animation.cpp:445
msgid "DXA cutscenes found but ScummVM has been built without zlib support"
msgstr "Videa DXA nalezena, ale ScummVM byl sestaven bez podpory zlib"
-#: engines/sword1/animation.cpp:550 engines/sword2/animation.cpp:449
-msgid "MPEG2 cutscenes are no longer supported"
-msgstr "Videa MPGE2 ji¾ nejsou podporována"
+#: engines/sword1/animation.cpp:561
+msgid "MPEG-2 cutscenes found but ScummVM has been built without MPEG-2"
+msgstr "Videa MPEG-2 nalezena, ale ScummVM byl sestaven bez MPEG-2"
-#: engines/sword1/animation.cpp:556 engines/sword2/animation.cpp:457
+#: engines/sword1/animation.cpp:568 engines/sword2/animation.cpp:470
#, c-format
msgid "Cutscene '%s' not found"
msgstr "Video '%s' nenalezeno"
@@ -2453,11 +3223,16 @@ msgstr "Ponechat novou"
msgid "This is the end of the Broken Sword 1 Demo"
msgstr "Toto je konec Dema Broken Sword 1"
-#: engines/sword2/animation.cpp:419
+#: engines/sword2/animation.cpp:425
msgid ""
"PSX cutscenes found but ScummVM has been built without RGB color support"
msgstr "Videa PSX nalezena, ale ScummVM byl sestaven bez podpory barev RGB"
+#: engines/sword2/animation.cpp:461
+msgid ""
+"MPEG-2 cutscenes found but ScummVM has been built without MPEG-2 support"
+msgstr "Videa MPEG-2 nalezena, ale ScummVM byl sestaven bez podpory MPEG-2"
+
#: engines/sword2/sword2.cpp:79
msgid "Show object labels"
msgstr "Zobrazit jmenovky objektù"
@@ -2466,12 +3241,12 @@ msgstr "Zobrazit jmenovky objektù"
msgid "Show labels for objects on mouse hover"
msgstr "Zobrazit jmenovky objektù pøi najetí my¹i"
-#: engines/teenagent/resources.cpp:94
+#: engines/teenagent/resources.cpp:95
msgid ""
"You're missing the 'teenagent.dat' file. Get it from the ScummVM website"
msgstr "Chybí vám soubor 'teenagent.dat'. Mù¾ete ho získat ze stránky ScummVM."
-#: engines/teenagent/resources.cpp:115
+#: engines/teenagent/resources.cpp:116
msgid ""
"The teenagent.dat file is compressed and zlib hasn't been included in this "
"executable. Please decompress it"
@@ -2479,791 +3254,50 @@ msgstr ""
"Soubor teenagent.dat je komprimován a zlib není souèástí spustitelného "
"souboru. Prosím dekomprimujte ho"
-#: engines/parallaction/saveload.cpp:133
-#, c-format
-msgid ""
-"Can't save game in slot %i\n"
-"\n"
-msgstr ""
-"Nelze ulo¾it hru do pozice %i\n"
-"\n"
-
-#: engines/parallaction/saveload.cpp:204
-msgid "Loading game..."
-msgstr "Nahrávání hry..."
-
-#: engines/parallaction/saveload.cpp:219
-msgid "Saving game..."
-msgstr "Ukládání hry..."
-
-#: engines/parallaction/saveload.cpp:272
-msgid ""
-"ScummVM found that you have old savefiles for Nippon Safes that should be "
-"renamed.\n"
-"The old names are 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 next time.\n"
-msgstr ""
-"ScummVM zjistil, ¾e máte staré ulo¾ené pozice pro Nippon Safes, které by "
-"mìly být pøejmenovány.\n"
-"Staré názvy ji¾ nejsou podporovány, tak¾e pokud je nepøevedete, nebudete "
-"moci va¹e hry naèíst.\n"
-"\n"
-"Stisknìte OK, abyste je pøevedli teï, jinak budete po¾ádáni pøí¹tì.\n"
-
-#: engines/parallaction/saveload.cpp:319
-msgid "ScummVM successfully converted all your savefiles."
-msgstr "ScummVM úspì¹nì pøevedl v¹echny va¹e ulo¾ené pozice. "
-
-#: engines/parallaction/saveload.cpp:321
-msgid ""
-"ScummVM printed some warnings in your console window and can't guarantee all "
-"your files have been converted.\n"
-"\n"
-"Please report to the team."
-msgstr ""
-"ScummVM vytiskl nìkterá varování ve va¹em oknì konzole a nemù¾e zaruèit, ¾e "
-"v¹echny va¹e soubory byly pøevedeny.\n"
-"\n"
-"Prosím nahlaste to týmu"
-
-#: engines/pegasus/pegasus.cpp:679
-msgid "Invalid save file name"
-msgstr "Neplatný název souboru"
-
-#: engines/pegasus/pegasus.cpp:2445
-msgid "Up/Zoom In/Move Forward/Open Doors"
-msgstr "Nahoru/Pøiblí¾it/Pohyb dopøedu/Otevøít dveøe"
-
-#: engines/pegasus/pegasus.cpp:2446
-msgid "Down/Zoom Out"
-msgstr "Dolù/Oddálení"
-
-#: engines/pegasus/pegasus.cpp:2449
-msgid "Display/Hide Inventory Tray"
-msgstr "Zobrazit/Skrýt podnos inventáøe"
-
-#: engines/pegasus/pegasus.cpp:2450
-msgid "Display/Hide Biochip Tray"
-msgstr "Zobrazit/Skrýt podnos bioèipu"
-
-#: engines/pegasus/pegasus.cpp:2451
-msgid "Action/Select"
-msgstr "Èinnost/Vybrat"
-
-#: engines/pegasus/pegasus.cpp:2452
-msgid "Toggle Center Data Display"
-msgstr "Pøepnout centrální datovou obrazovku"
-
-#: engines/pegasus/pegasus.cpp:2453
-msgid "Display/Hide Info Screen"
-msgstr "Zobrazit/Skrýto obrazovku informací"
-
-#: engines/pegasus/pegasus.cpp:2454
-msgid "Display/Hide Pause Menu"
-msgstr "Zobrazit/Skrýt "
-
-#: engines/pegasus/pegasus.cpp:2455
-msgid "???"
-msgstr "???"
-
-#: audio/fmopl.cpp:49
-msgid "MAME OPL emulator"
-msgstr "MAME OPL Emulátor"
-
-#: audio/fmopl.cpp:51
-msgid "DOSBox OPL emulator"
-msgstr "DOSBox OPL Emulátor"
-
-#: audio/mididrv.cpp:209
-#, c-format
-msgid ""
-"The selected audio device '%s' was not found (e.g. might be turned off or "
-"disconnected)."
-msgstr ""
-"Zvolené zvukové zaøízení '%s' nebylo nalezeno (napø. mù¾e být vypnuto nebo "
-"odpojeno)."
-
-#: audio/mididrv.cpp:209 audio/mididrv.cpp:221 audio/mididrv.cpp:257
-#: audio/mididrv.cpp:272
-msgid "Attempting to fall back to the next available device..."
-msgstr "Pokus o navrácení na nejbli¾¹í dostupné zaøízení..."
-
-#: audio/mididrv.cpp:221
-#, c-format
-msgid ""
-"The selected audio device '%s' cannot be used. See log file for more "
-"information."
-msgstr ""
-"Zvolené zvukové zaøízení '%s' nelze pou¾ít. Podívejte se na záznam pro více "
-"informací."
-
-#: audio/mididrv.cpp:257
-#, c-format
-msgid ""
-"The preferred audio device '%s' was not found (e.g. might be turned off or "
-"disconnected)."
-msgstr ""
-"Upøednostòované zvukové zaøízení '%s' nebylo nalezeno (napø. mù¾e být "
-"vypnuto nebo odpojeno)."
-
-#: audio/mididrv.cpp:272
-#, c-format
-msgid ""
-"The preferred audio device '%s' cannot be used. See log file for more "
-"information."
-msgstr ""
-"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"
-msgstr "Bez hudby"
-
-#: audio/mods/paula.cpp:189
-msgid "Amiga Audio Emulator"
-msgstr "Emulátor zvuku Amiga"
-
-#: audio/softsynth/adlib.cpp:2284
-msgid "AdLib Emulator"
-msgstr "AdLib Emulátor"
-
-#: audio/softsynth/appleiigs.cpp:33
-msgid "Apple II GS Emulator (NOT IMPLEMENTED)"
-msgstr "Apple II GS Emulátor (NENÍ ZAVEDEN)"
-
-#: audio/softsynth/sid.cpp:1430
-msgid "C64 Audio Emulator"
-msgstr "Emulátor zvuku C64"
-
-#: audio/softsynth/mt32.cpp:205
-msgid "Initializing MT-32 Emulator"
-msgstr "Zavádím MT-32 Emulátor"
-
-#: audio/softsynth/mt32.cpp:431
-msgid "MT-32 Emulator"
-msgstr "MT-32 Emulátor"
-
-#: audio/softsynth/pcspk.cpp:139
-msgid "PC Speaker Emulator"
-msgstr "PC Speaker Emulátor"
-
-#: audio/softsynth/pcspk.cpp:158
-msgid "IBM PCjr Emulator"
-msgstr "IBM PCjr Emulátor"
-
-#: backends/keymapper/remap-dialog.cpp:47
-msgid "Keymap:"
-msgstr "Mapa Kláves:"
-
-#: backends/keymapper/remap-dialog.cpp:66
-msgid " (Effective)"
-msgstr " (Aktivní)"
-
-#: backends/keymapper/remap-dialog.cpp:106
-msgid " (Active)"
-msgstr "(Aktivní)"
-
-#: backends/keymapper/remap-dialog.cpp:106
-msgid " (Blocked)"
-msgstr " (Blokováno)"
-
-#: backends/keymapper/remap-dialog.cpp:119
-msgid " (Global)"
-msgstr "(Globální)"
-
-#: backends/keymapper/remap-dialog.cpp:127
-msgid " (Game)"
-msgstr "(Hra)"
-
-#: backends/midi/windows.cpp:164
-msgid "Windows MIDI"
-msgstr "Windows MIDI"
-
-#: backends/platform/ds/arm9/source/dsoptions.cpp:57
-msgid "ScummVM Main Menu"
-msgstr "Hlavní Menu ScummVM"
-
-#: backends/platform/ds/arm9/source/dsoptions.cpp:63
-msgid "~L~eft handed mode"
-msgstr "~R~e¾im pro leváky"
-
-#: backends/platform/ds/arm9/source/dsoptions.cpp:64
-msgid "~I~ndy fight controls"
-msgstr "~O~vládání Indyho boje"
-
-#: backends/platform/ds/arm9/source/dsoptions.cpp:65
-msgid "Show mouse cursor"
-msgstr "Zobrazit kurzor my¹i"
-
-#: backends/platform/ds/arm9/source/dsoptions.cpp:66
-msgid "Snap to edges"
-msgstr "Pøichytit k okrajùm"
-
-#: backends/platform/ds/arm9/source/dsoptions.cpp:68
-msgid "Touch X Offset"
-msgstr "Dotykové vyrovnáni na ose X"
-
-#: backends/platform/ds/arm9/source/dsoptions.cpp:75
-msgid "Touch Y Offset"
-msgstr "Dotykové vyrovnáni na ose Y"
-
-#: backends/platform/ds/arm9/source/dsoptions.cpp:87
-msgid "Use laptop trackpad-style cursor control"
-msgstr "Pou¾ít styl kontroly kurzoru jako u ovládací podu¹ky laptopu"
-
-#: backends/platform/ds/arm9/source/dsoptions.cpp:88
-msgid "Tap for left click, double tap right click"
-msgstr "«uknìte pro levé kliknutí, dvakrát pro pravé kliknutí"
-
-#: backends/platform/ds/arm9/source/dsoptions.cpp:90
-msgid "Sensitivity"
-msgstr "Citlivost"
-
-#: backends/platform/ds/arm9/source/dsoptions.cpp:99
-msgid "Initial top screen scale:"
-msgstr "Poèáteèní zmìna velikosti horní obrazovky:"
-
-#: backends/platform/ds/arm9/source/dsoptions.cpp:105
-msgid "Main screen scaling:"
-msgstr "Zmìna velikosti hlavní obrazovky:"
-
-#: backends/platform/ds/arm9/source/dsoptions.cpp:107
-msgid "Hardware scale (fast, but low quality)"
-msgstr "Hardwarová zmìna velikosti (rychlé, ale nízká kvalita)"
-
-#: backends/platform/ds/arm9/source/dsoptions.cpp:108
-msgid "Software scale (good quality, but slower)"
-msgstr "Softwarová zmìna velikosti (dobrá kvalita, ale pomalej¹í)"
-
-#: backends/platform/ds/arm9/source/dsoptions.cpp:109
-msgid "Unscaled (you must scroll left and right)"
-msgstr "Beze zmìny velikosti (musíte posunovat doleva a doprava)"
-
-#: backends/platform/ds/arm9/source/dsoptions.cpp:111
-msgid "Brightness:"
-msgstr "Jas:"
-
-#: backends/platform/ds/arm9/source/dsoptions.cpp:121
-msgid "High quality audio (slower) (reboot)"
-msgstr "Vysoká kvalita zvuku (pomalej¹í) (restart) "
-
-#: backends/platform/ds/arm9/source/dsoptions.cpp:122
-msgid "Disable power off"
-msgstr "Zakázat vypnutí"
-
-#: backends/platform/iphone/osys_events.cpp:300
-msgid "Mouse-click-and-drag mode enabled."
-msgstr "Re¾im pøetáhnutí my¹i zapnut."
-
-#: backends/platform/iphone/osys_events.cpp:302
-msgid "Mouse-click-and-drag mode disabled."
-msgstr "Re¾im pøetáhnutí my¹i vypnut."
-
-#: backends/platform/iphone/osys_events.cpp:313
-msgid "Touchpad mode enabled."
-msgstr "Touchpad re¾im zapnut"
-
-#: backends/platform/iphone/osys_events.cpp:315
-msgid "Touchpad mode disabled."
-msgstr "Touchpad re¾im vypnut"
-
-#: backends/platform/maemo/maemo.cpp:209
-msgid "Click Mode"
-msgstr "Re¾im kliknutí"
-
-#: backends/platform/maemo/maemo.cpp:215
-#: 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/maemo/maemo.cpp:218
-msgid "Middle Click"
-msgstr "Kliknutí prostøedním tlaèítkem"
-
-#: backends/platform/maemo/maemo.cpp:221
-#: 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í"
-
-#: backends/platform/sdl/macosx/appmenu_osx.mm:77
-msgid "Hide ScummVM"
-msgstr "Skrýt ScummVM"
-
-#: backends/platform/sdl/macosx/appmenu_osx.mm:82
-msgid "Hide Others"
-msgstr "Skrýt Ostatní"
-
-#: backends/platform/sdl/macosx/appmenu_osx.mm:87
-msgid "Show All"
-msgstr "Zobrazit V¹e"
-
-#: backends/platform/sdl/macosx/appmenu_osx.mm:109
-#: backends/platform/sdl/macosx/appmenu_osx.mm:120
-msgid "Window"
-msgstr "Okno"
-
-#: backends/platform/sdl/macosx/appmenu_osx.mm:114
-msgid "Minimize"
-msgstr "Minimalizovat"
-
-#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:45
-msgid "Normal (no scaling)"
-msgstr "Normální (bez zmìny velikosti)"
-
-#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:64
-msgctxt "lowres"
-msgid "Normal (no scaling)"
-msgstr "Normální (bez zmìny velikosti)"
-
-#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2135
-#: backends/graphics/openglsdl/openglsdl-graphics.cpp:537
-msgid "Enabled aspect ratio correction"
-msgstr "Povolena korekce pomìru stran"
-
-#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2141
-#: 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:2196
-msgid "Active graphics filter:"
-msgstr "Aktivní grafický filtr:"
-
-#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2238
-#: backends/graphics/openglsdl/openglsdl-graphics.cpp:481
-msgid "Windowed mode"
-msgstr "Re¾im do okna"
-
-#: backends/graphics/opengl/opengl-graphics.cpp:135
-msgid "OpenGL Normal"
-msgstr "OpenGL Normální"
-
-#: backends/graphics/opengl/opengl-graphics.cpp:136
-msgid "OpenGL Conserve"
-msgstr "OpenGL Zachovávající"
-
-#: backends/graphics/opengl/opengl-graphics.cpp:137
-msgid "OpenGL Original"
-msgstr "OpenGL Pùvodní"
-
-#: backends/graphics/openglsdl/openglsdl-graphics.cpp:415
-msgid "Current display mode"
-msgstr "Souèasný re¾im obrazu"
-
-#: backends/graphics/openglsdl/openglsdl-graphics.cpp:428
-msgid "Current scale"
-msgstr "Souèasná velikost"
-
-#: 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:564
-msgid "Active filter mode: Nearest"
-msgstr "Aktivní re¾im filtru: Nejbli¾¹í"
-
-#: backends/platform/symbian/src/SymbianActions.cpp:38
-#: backends/platform/wince/CEActionsSmartphone.cpp:39
-msgid "Up"
-msgstr "Nahoru"
-
-#: backends/platform/symbian/src/SymbianActions.cpp:39
-#: backends/platform/wince/CEActionsSmartphone.cpp:40
-msgid "Down"
-msgstr "Dolù"
-
-#: backends/platform/symbian/src/SymbianActions.cpp:40
-#: backends/platform/wince/CEActionsSmartphone.cpp:41
-msgid "Left"
-msgstr "Doleva"
-
-#: backends/platform/symbian/src/SymbianActions.cpp:41
-#: backends/platform/wince/CEActionsSmartphone.cpp:42
-msgid "Right"
-msgstr "Doprava"
-
-#: backends/platform/symbian/src/SymbianActions.cpp:46
-#: backends/platform/wince/CEActionsSmartphone.cpp:47
-msgid "Zone"
-msgstr "Oblast"
-
-#: backends/platform/symbian/src/SymbianActions.cpp:47
-#: backends/platform/wince/CEActionsPocket.cpp:54
-#: backends/platform/wince/CEActionsSmartphone.cpp:48
-msgid "Multi Function"
-msgstr "Multi Funkce"
-
-#: backends/platform/symbian/src/SymbianActions.cpp:48
-msgid "Swap character"
-msgstr "Zamìnit znaky"
-
-#: backends/platform/symbian/src/SymbianActions.cpp:49
-msgid "Skip text"
-msgstr "Pøeskoèit text"
-
-#: backends/platform/symbian/src/SymbianActions.cpp:51
-msgid "Fast mode"
-msgstr "Rychlý re¾im"
-
-#: backends/platform/symbian/src/SymbianActions.cpp:53
-msgid "Debugger"
-msgstr "Ladící program"
-
-#: backends/platform/symbian/src/SymbianActions.cpp:54
-msgid "Global menu"
-msgstr "Globální menu"
-
-#: backends/platform/symbian/src/SymbianActions.cpp:55
-msgid "Virtual keyboard"
-msgstr "Virtuální klávesnice"
-
-#: backends/platform/symbian/src/SymbianActions.cpp:56
-msgid "Key mapper"
-msgstr "Mapovaè kláves"
-
-#: backends/events/symbiansdl/symbiansdl-events.cpp:184
-msgid "Do you want to quit ?"
-msgstr "Chcete ukonèit ?"
-
-#: backends/platform/wii/options.cpp:51
-msgid "Video"
-msgstr "Video"
-
-#: backends/platform/wii/options.cpp:54
-msgid "Current video mode:"
-msgstr "Souèasný re¾im obrazu:"
-
-#: backends/platform/wii/options.cpp:56
-msgid "Double-strike"
-msgstr "Dvojité pøe¹krtnutí"
-
-#: backends/platform/wii/options.cpp:60
-msgid "Horizontal underscan:"
-msgstr "Horizontální zmen¹ení"
-
-#: backends/platform/wii/options.cpp:66
-msgid "Vertical underscan:"
-msgstr "Vertikální zmen¹ení"
-
-#: backends/platform/wii/options.cpp:71
-msgid "Input"
-msgstr "Vstup"
-
-#: backends/platform/wii/options.cpp:74
-msgid "GC Pad sensitivity:"
-msgstr "Citlivost GC Padu"
-
-#: backends/platform/wii/options.cpp:80
-msgid "GC Pad acceleration:"
-msgstr "Zrychlení GC Padu"
-
-#: backends/platform/wii/options.cpp:86
-msgid "DVD"
-msgstr "DVD"
-
-#: backends/platform/wii/options.cpp:89 backends/platform/wii/options.cpp:101
-msgid "Status:"
-msgstr "Stav:"
-
-#: backends/platform/wii/options.cpp:90 backends/platform/wii/options.cpp:102
-msgid "Unknown"
-msgstr "Neznámé"
-
-#: backends/platform/wii/options.cpp:93
-msgid "Mount DVD"
-msgstr "Pøipojit DVD"
-
-#: backends/platform/wii/options.cpp:94
-msgid "Unmount DVD"
-msgstr "Odpojit DVD"
-
-#: backends/platform/wii/options.cpp:98
-msgid "SMB"
-msgstr "SMB"
-
-#: backends/platform/wii/options.cpp:106
-msgid "Server:"
-msgstr "Server:"
-
-#: backends/platform/wii/options.cpp:110
-msgid "Share:"
-msgstr "Sdílení:"
-
-#: backends/platform/wii/options.cpp:114
-msgid "Username:"
-msgstr "U¾ivatelské jméno"
-
-#: backends/platform/wii/options.cpp:118
-msgid "Password:"
-msgstr "Heslo"
-
-#: backends/platform/wii/options.cpp:121
-msgid "Init network"
-msgstr "Spustit sí»"
-
-#: backends/platform/wii/options.cpp:123
-msgid "Mount SMB"
-msgstr "Pøipojit SMB"
-
-#: backends/platform/wii/options.cpp:124
-msgid "Unmount SMB"
-msgstr "Odpojit SMB"
-
-#: backends/platform/wii/options.cpp:143
-msgid "DVD Mounted successfully"
-msgstr "DVD úspì¹nì pøipojeno"
-
-#: backends/platform/wii/options.cpp:146
-msgid "Error while mounting the DVD"
-msgstr "Chyba pøi pøipojování DVD"
-
-#: backends/platform/wii/options.cpp:148
-msgid "DVD not mounted"
-msgstr "DVD nepøipojeno"
-
-#: backends/platform/wii/options.cpp:161
-msgid "Network up, share mounted"
-msgstr "Sí» je zapnuta, sdílení pøipojeno"
-
-#: backends/platform/wii/options.cpp:163
-msgid "Network up"
-msgstr "Sí» je zapnuta"
-
-#: backends/platform/wii/options.cpp:166
-msgid ", error while mounting the share"
-msgstr ", chyba pøi pøipojování sdílení"
-
-#: backends/platform/wii/options.cpp:168
-msgid ", share not mounted"
-msgstr ", sdílení není pøipojeno"
-
-#: backends/platform/wii/options.cpp:174
-msgid "Network down"
-msgstr "Sí» je nedostupná"
-
-#: backends/platform/wii/options.cpp:178
-msgid "Initializing network"
-msgstr "Zavádím sí»"
-
-#: backends/platform/wii/options.cpp:182
-msgid "Timeout while initializing network"
-msgstr "Pøi zavádìní sítì vypr¹el limit"
-
-#: backends/platform/wii/options.cpp:186
-#, c-format
-msgid "Network not initialized (%d)"
-msgstr "Sí» není zavedena (%d)"
-
-#: backends/platform/wince/CEActionsPocket.cpp:46
-msgid "Hide Toolbar"
-msgstr "Skrýt Panel nástrojù"
-
-#: backends/platform/wince/CEActionsPocket.cpp:47
-msgid "Show Keyboard"
-msgstr "Zobrazit klávesnici"
-
-#: backends/platform/wince/CEActionsPocket.cpp:48
-msgid "Sound on/off"
-msgstr "Zvuk zapnout/vypnout"
-
-#: backends/platform/wince/CEActionsPocket.cpp:49
-msgid "Right click"
-msgstr "Pravé kliknutí"
-
-#: backends/platform/wince/CEActionsPocket.cpp:50
-msgid "Show/Hide Cursor"
-msgstr "Ukázat/Skrýt Kurzor"
-
-#: backends/platform/wince/CEActionsPocket.cpp:51
-msgid "Free look"
-msgstr "Rozhlí¾ení pomocí my¹i"
-
-#: backends/platform/wince/CEActionsPocket.cpp:52
-msgid "Zoom up"
-msgstr "Pøiblí¾ení nahoru"
-
-#: backends/platform/wince/CEActionsPocket.cpp:53
-msgid "Zoom down"
-msgstr "Pøiblí¾ení dolù"
-
-#: backends/platform/wince/CEActionsPocket.cpp:55
-#: backends/platform/wince/CEActionsSmartphone.cpp:49
-msgid "Bind Keys"
-msgstr "Pøiøadit klávesy"
-
-#: backends/platform/wince/CEActionsPocket.cpp:56
-msgid "Cursor Up"
-msgstr "©ipka Nahoru"
-
-#: backends/platform/wince/CEActionsPocket.cpp:57
-msgid "Cursor Down"
-msgstr "©ipka Dolù"
-
-#: backends/platform/wince/CEActionsPocket.cpp:58
-msgid "Cursor Left"
-msgstr "©ipka Doleva"
-
-#: backends/platform/wince/CEActionsPocket.cpp:59
-msgid "Cursor Right"
-msgstr "©ipka Doprava"
-
-#: 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:326
-#: backends/platform/wince/CEActionsSmartphone.cpp:287
-msgid " Are you sure you want to quit ? "
-msgstr " Jste si jisti, ¾e chcete odejít ? "
-
-#: backends/platform/wince/CEActionsSmartphone.cpp:50
-msgid "Keyboard"
-msgstr "Klávesnice"
-
-#: backends/platform/wince/CEActionsSmartphone.cpp:51
-msgid "Rotate"
-msgstr "Otáèet"
-
-#: backends/platform/wince/CELauncherDialog.cpp:56
-msgid "Using SDL driver "
-msgstr "Pou¾ívá ovladaè SDL"
-
-#: backends/platform/wince/CELauncherDialog.cpp:60
-msgid "Display "
-msgstr "Displej"
-
-#: 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:515
-msgid "Map right click action"
-msgstr "Mapovat èinnost pravé kliknutí"
-
-#: 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:528
-msgid "Map hide toolbar action"
-msgstr "Mapovat èinnost skrýt panel nástrojù"
-
-#: 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:541
-msgid "Map Zoom Up action (optional)"
-msgstr "Namapovat èinnost Pøiblí¾it Nahoru (nepovinné)"
-
-#: 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:552
-msgid ""
-"Don't forget to map a key to 'Hide Toolbar' action to see the whole inventory"
-msgstr ""
-"Nezapomeòte namapovat klávesu k èinnosti 'Skrýt Panel Nástrojù, abyste "
-"vidìli celý inventáø"
-
-#: backends/events/default/default-events.cpp:193
-msgid "Do you really want to return to the Launcher?"
-msgstr "Opravdu se chcete vrátit tuto do Spou¹tìèe?"
-
-#: backends/events/default/default-events.cpp:193
-msgid "Launcher"
-msgstr "Spou¹tìè"
-
-#: backends/events/default/default-events.cpp:215
-msgid "Do you really want to quit?"
-msgstr "Opravdu chcete skonèit?"
-
-#: backends/events/gph/gph-events.cpp:386
-#: backends/events/gph/gph-events.cpp:429
-#: backends/events/openpandora/op-events.cpp:168
-msgid "Touchscreen 'Tap Mode' - Left Click"
-msgstr "'Re¾im «uknutí' Dotykové Obrazovky - Levé Kliknutí"
-
-#: backends/events/gph/gph-events.cpp:388
-#: backends/events/gph/gph-events.cpp:431
-#: backends/events/openpandora/op-events.cpp:170
-msgid "Touchscreen 'Tap Mode' - Right Click"
-msgstr "'Re¾im «uknutí' Dotykové Obrazovky - Pravé Kliknutí"
-
-#: backends/events/gph/gph-events.cpp:390
-#: backends/events/gph/gph-events.cpp:433
-#: backends/events/openpandora/op-events.cpp:172
-msgid "Touchscreen 'Tap Mode' - Hover (No Click)"
-msgstr "'Re¾im «uknutí' Dotykové Obrazovky - Najetí (Bez Kliknutí)"
-
-#: backends/events/gph/gph-events.cpp:410
-msgid "Maximum Volume"
-msgstr "Maximální Hlasitost"
+#~ msgctxt "lowres"
+#~ msgid "Mass Add..."
+#~ msgstr "Hromadné Pøidání..."
-#: backends/events/gph/gph-events.cpp:412
-msgid "Increasing Volume"
-msgstr "Zvy¹uji Hlasitost"
+#~ msgid "Mass Add..."
+#~ msgstr "Hromadné Pøidání..."
-#: backends/events/gph/gph-events.cpp:418
-msgid "Minimal Volume"
-msgstr "Minimální Hlasitost"
+#~ msgid ""
+#~ "Turns off General MIDI mapping for games with Roland MT-32 soundtrack"
+#~ msgstr ""
+#~ "Vypne mapování General MIDI pro hry s Roland MT-32 zvukovým doprovodem"
-#: backends/events/gph/gph-events.cpp:420
-msgid "Decreasing Volume"
-msgstr "Sni¾uji Hlasitost"
+#~ msgid "Standard (16bpp)"
+#~ msgstr "Standardní (16bpp)"
-#: backends/events/openpandora/op-events.cpp:174
-msgid "Touchscreen 'Tap Mode' - Hover (DPad Clicks)"
-msgstr "'Re¾im «uknutí' Dotykové Obrazovky - Najetí (Dpad kliká)"
+#~ msgid "Alternative intro"
+#~ msgstr "Alternativní úvod"
-#: backends/updates/macosx/macosx-updates.mm:67
-msgid "Check for Updates..."
-msgstr "Zkontrolovat Aktualizace..."
+#~ msgid "Use an alternative game intro (CD version only)"
+#~ msgstr "Pou¾ít jinou verzi úvodu (Pouze verze CD)"
-#: backends/platform/bada/form.cpp:269
-msgid "Right Click Once"
-msgstr "Pravé kliknutí jednou"
+#~ msgid "MPEG2 cutscenes are no longer supported"
+#~ msgstr "Videa MPGE2 ji¾ nejsou podporována"
-#: backends/platform/bada/form.cpp:277
-msgid "Move Only"
-msgstr "Pouze Pohyb"
+#~ msgid "OpenGL Normal"
+#~ msgstr "OpenGL Normální"
-#: backends/platform/bada/form.cpp:291
-msgid "Escape Key"
-msgstr "Klávesa Escape"
+#~ msgid "OpenGL Conserve"
+#~ msgstr "OpenGL Zachovávající"
-#: backends/platform/bada/form.cpp:296
-msgid "Game Menu"
-msgstr "Menu Hry"
+#~ msgid "OpenGL Original"
+#~ msgstr "OpenGL Pùvodní"
-#: backends/platform/bada/form.cpp:301
-msgid "Show Keypad"
-msgstr "Zobrazit Klávesnici"
+#~ msgid "Current display mode"
+#~ msgstr "Souèasný re¾im obrazu"
-#: backends/platform/bada/form.cpp:309
-msgid "Control Mouse"
-msgstr "Ovládání My¹i"
+#~ msgid "Current scale"
+#~ msgstr "Souèasná velikost"
-#: backends/events/maemosdl/maemosdl-events.cpp:192
-msgid "Clicking Enabled"
-msgstr "Kliknutí Povoleno"
+#~ msgid "Active filter mode: Linear"
+#~ msgstr "Aktivní re¾im filtru: Lineární"
-#: backends/events/maemosdl/maemosdl-events.cpp:192
-msgid "Clicking Disabled"
-msgstr "Kliknutí Zakázáno"
+#~ msgid "Active filter mode: Nearest"
+#~ msgstr "Aktivní re¾im filtru: Nejbli¾¹í"
#~ msgid "Enable Roland GS Mode"
#~ msgstr "Zapnout re¾im Roland GS"
diff --git a/po/da_DA.po b/po/da_DA.po
index bb7ed32c83..8b26ebe238 100644
--- a/po/da_DA.po
+++ b/po/da_DA.po
@@ -1,5 +1,5 @@
# Dansk translation for ScummVM
-# Copyright (C) 2010-2013 ScummVM Team
+# Copyright (C) 2010-2014 ScummVM Team
# This file is distributed under the same license as the ScummVM package.
# Steffen Nyeland <steffen@nyeland.dk>, 2010.
#
@@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: ScummVM 1.3.0svn\n"
"Report-Msgid-Bugs-To: scummvm-devel@lists.sf.net\n"
-"POT-Creation-Date: 2013-04-24 13:35+0100\n"
+"POT-Creation-Date: 2014-06-07 23:06+0100\n"
"PO-Revision-Date: 2013-05-17 14:24+0100\n"
"Last-Translator: Steffen Nyeland <steffen@nyeland.dk>\n"
"Language-Team: Steffen Nyeland <steffen@nyeland.dk>\n"
@@ -18,77 +18,77 @@ msgstr ""
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
"X-Generator: Poedit 1.5.5\n"
-#: gui/about.cpp:93
+#: gui/about.cpp:94
#, c-format
msgid "(built on %s)"
msgstr "(bygget den %s)"
-#: gui/about.cpp:100
+#: gui/about.cpp:101
msgid "Features compiled in:"
msgstr "Funktioner kompileret ind:"
-#: gui/about.cpp:109
+#: gui/about.cpp:110
msgid "Available engines:"
msgstr "Tilgængelige \"motorer\":"
-#: gui/browser.cpp:67
+#: gui/browser.cpp:68
msgid "Show hidden files"
msgstr "Vis skjulte filer"
-#: gui/browser.cpp:67
+#: gui/browser.cpp:68
msgid "Show files marked with the hidden attribute"
msgstr "Vis filer markeret med skjult attribut"
-#: gui/browser.cpp:71
+#: gui/browser.cpp:72
msgid "Go up"
msgstr "Gå op"
-#: gui/browser.cpp:71 gui/browser.cpp:73
+#: gui/browser.cpp:72 gui/browser.cpp:74
msgid "Go to previous directory level"
msgstr "Gå til forrige biblioteks niveau"
-#: gui/browser.cpp:73
+#: gui/browser.cpp:74
msgctxt "lowres"
msgid "Go up"
msgstr "Gå op"
-#: gui/browser.cpp:74 gui/chooser.cpp:45 gui/KeysDialog.cpp:43
-#: gui/launcher.cpp:345 gui/massadd.cpp:94 gui/options.cpp:1238
-#: gui/saveload-dialog.cpp:215 gui/saveload-dialog.cpp:275
-#: gui/saveload-dialog.cpp:545 gui/saveload-dialog.cpp:919
-#: gui/themebrowser.cpp:54 gui/fluidsynth-dialog.cpp:151
-#: engines/engine.cpp:447 engines/drascula/saveload.cpp:51
-#: engines/scumm/dialogs.cpp:190 engines/sword1/control.cpp:865
-#: engines/parallaction/saveload.cpp:274 backends/platform/wii/options.cpp:48
-#: backends/events/default/default-events.cpp:193
-#: backends/events/default/default-events.cpp:215
+#: gui/browser.cpp:75 gui/chooser.cpp:46 gui/KeysDialog.cpp:43
+#: gui/launcher.cpp:351 gui/massadd.cpp:95 gui/options.cpp:1239
+#: gui/saveload-dialog.cpp:216 gui/saveload-dialog.cpp:276
+#: gui/saveload-dialog.cpp:547 gui/saveload-dialog.cpp:922
+#: gui/themebrowser.cpp:55 gui/fluidsynth-dialog.cpp:152
+#: engines/engine.cpp:452 backends/platform/wii/options.cpp:48
+#: backends/events/default/default-events.cpp:196
+#: backends/events/default/default-events.cpp:218
+#: engines/drascula/saveload.cpp:49 engines/parallaction/saveload.cpp:274
+#: engines/scumm/dialogs.cpp:191 engines/sword1/control.cpp:865
msgid "Cancel"
msgstr "Fortryd"
-#: gui/browser.cpp:75 gui/chooser.cpp:46 gui/themebrowser.cpp:55
+#: gui/browser.cpp:76 gui/chooser.cpp:47 gui/themebrowser.cpp:56
msgid "Choose"
msgstr "Vælg"
-#: gui/gui-manager.cpp:115 engines/scumm/help.cpp:125
-#: engines/scumm/help.cpp:140 engines/scumm/help.cpp:165
-#: engines/scumm/help.cpp:191 engines/scumm/help.cpp:209
-#: backends/keymapper/remap-dialog.cpp:52
+#: gui/gui-manager.cpp:117 backends/keymapper/remap-dialog.cpp:53
+#: engines/scumm/help.cpp:125 engines/scumm/help.cpp:140
+#: engines/scumm/help.cpp:165 engines/scumm/help.cpp:191
+#: engines/scumm/help.cpp:209
msgid "Close"
msgstr "Luk"
-#: gui/gui-manager.cpp:118
+#: gui/gui-manager.cpp:120
msgid "Mouse click"
msgstr "Muse klik"
-#: gui/gui-manager.cpp:122 base/main.cpp:301
+#: gui/gui-manager.cpp:124 base/main.cpp:319
msgid "Display keyboard"
msgstr "Vis tastatur"
-#: gui/gui-manager.cpp:126 base/main.cpp:305
+#: gui/gui-manager.cpp:128 base/main.cpp:323
msgid "Remap keys"
msgstr "Kortlæg taster"
-#: gui/gui-manager.cpp:129 base/main.cpp:308
+#: gui/gui-manager.cpp:131 base/main.cpp:326
msgid "Toggle FullScreen"
msgstr "Skift fuldskærm"
@@ -100,21 +100,21 @@ msgstr "Vælg en handling at kortlægge"
msgid "Map"
msgstr "Kortlæg"
-#: gui/KeysDialog.cpp:42 gui/launcher.cpp:346 gui/launcher.cpp:1001
-#: gui/launcher.cpp:1005 gui/massadd.cpp:91 gui/options.cpp:1239
-#: gui/saveload-dialog.cpp:920 gui/fluidsynth-dialog.cpp:152
-#: engines/engine.cpp:366 engines/engine.cpp:377
-#: engines/drascula/saveload.cpp:51 engines/scumm/dialogs.cpp:192
-#: engines/scumm/scumm.cpp:1778 engines/agos/animation.cpp:558
-#: engines/groovie/script.cpp:420 engines/sky/compact.cpp:131
-#: engines/sky/compact.cpp:141 engines/sword1/animation.cpp:519
-#: engines/sword1/animation.cpp:540 engines/sword1/animation.cpp:550
-#: engines/sword1/animation.cpp:557 engines/sword1/control.cpp:865
-#: engines/sword1/logic.cpp:1633 engines/sword2/animation.cpp:419
-#: engines/sword2/animation.cpp:439 engines/sword2/animation.cpp:449
-#: engines/sword2/animation.cpp:458 engines/parallaction/saveload.cpp:274
+#: gui/KeysDialog.cpp:42 gui/launcher.cpp:352 gui/launcher.cpp:1048
+#: gui/launcher.cpp:1052 gui/massadd.cpp:92 gui/options.cpp:1240
+#: gui/saveload-dialog.cpp:923 gui/fluidsynth-dialog.cpp:153
+#: engines/engine.cpp:371 engines/engine.cpp:382
#: backends/platform/wii/options.cpp:47
#: backends/platform/wince/CELauncherDialog.cpp:54
+#: engines/agos/animation.cpp:558 engines/drascula/saveload.cpp:49
+#: engines/groovie/script.cpp:399 engines/parallaction/saveload.cpp:274
+#: engines/scumm/dialogs.cpp:193 engines/scumm/scumm.cpp:1779
+#: engines/sky/compact.cpp:131 engines/sky/compact.cpp:141
+#: engines/sword1/animation.cpp:524 engines/sword1/animation.cpp:545
+#: engines/sword1/animation.cpp:561 engines/sword1/animation.cpp:569
+#: engines/sword1/control.cpp:865 engines/sword1/logic.cpp:1633
+#: engines/sword2/animation.cpp:425 engines/sword2/animation.cpp:445
+#: engines/sword2/animation.cpp:461 engines/sword2/animation.cpp:471
msgid "OK"
msgstr "OK"
@@ -140,15 +140,15 @@ msgstr "Vælg venligst en handling"
msgid "Press the key to associate"
msgstr "Tryk tasten for at tilknytte"
-#: gui/launcher.cpp:187
+#: gui/launcher.cpp:193
msgid "Game"
msgstr "Spil"
-#: gui/launcher.cpp:191
+#: gui/launcher.cpp:197
msgid "ID:"
msgstr "ID:"
-#: gui/launcher.cpp:191 gui/launcher.cpp:193 gui/launcher.cpp:194
+#: gui/launcher.cpp:197 gui/launcher.cpp:199 gui/launcher.cpp:200
msgid ""
"Short game identifier used for referring to savegames and running the game "
"from the command line"
@@ -156,29 +156,29 @@ msgstr ""
"Kort spil identifikator til brug for gemmer, og for at køre spillet fra "
"kommandolinien"
-#: gui/launcher.cpp:193
+#: gui/launcher.cpp:199
msgctxt "lowres"
msgid "ID:"
msgstr "ID:"
-#: gui/launcher.cpp:198
+#: gui/launcher.cpp:204
msgid "Name:"
msgstr "Navn:"
-#: gui/launcher.cpp:198 gui/launcher.cpp:200 gui/launcher.cpp:201
+#: gui/launcher.cpp:204 gui/launcher.cpp:206 gui/launcher.cpp:207
msgid "Full title of the game"
msgstr "Fuld titel på spillet"
-#: gui/launcher.cpp:200
+#: gui/launcher.cpp:206
msgctxt "lowres"
msgid "Name:"
msgstr "Navn:"
-#: gui/launcher.cpp:204
+#: gui/launcher.cpp:210
msgid "Language:"
msgstr "Sprog:"
-#: gui/launcher.cpp:204 gui/launcher.cpp:205
+#: gui/launcher.cpp:210 gui/launcher.cpp:211
msgid ""
"Language of the game. This will not turn your Spanish game version into "
"English"
@@ -186,286 +186,287 @@ msgstr ""
"Spillets sprog. Dette vil ikke ændre din spanske version af spillet til "
"engelsk"
-#: gui/launcher.cpp:206 gui/launcher.cpp:220 gui/options.cpp:86
-#: gui/options.cpp:736 gui/options.cpp:749 gui/options.cpp:1209
-#: audio/null.cpp:40
+#: gui/launcher.cpp:212 gui/launcher.cpp:226 gui/options.cpp:87
+#: gui/options.cpp:737 gui/options.cpp:750 gui/options.cpp:1210
+#: audio/null.cpp:41
msgid "<default>"
msgstr "<standard>"
-#: gui/launcher.cpp:216
+#: gui/launcher.cpp:222
msgid "Platform:"
msgstr "Platform:"
-#: gui/launcher.cpp:216 gui/launcher.cpp:218 gui/launcher.cpp:219
+#: gui/launcher.cpp:222 gui/launcher.cpp:224 gui/launcher.cpp:225
msgid "Platform the game was originally designed for"
msgstr "Platform som spillet oprindeligt var designet til"
-#: gui/launcher.cpp:218
+#: gui/launcher.cpp:224
msgctxt "lowres"
msgid "Platform:"
msgstr "Platform:"
-#: gui/launcher.cpp:231
+#: gui/launcher.cpp:237
msgid "Engine"
msgstr "Motor"
-#: gui/launcher.cpp:239 gui/options.cpp:1072 gui/options.cpp:1089
+#: gui/launcher.cpp:245 gui/options.cpp:1073 gui/options.cpp:1090
msgid "Graphics"
msgstr "Grafik"
-#: gui/launcher.cpp:239 gui/options.cpp:1072 gui/options.cpp:1089
+#: gui/launcher.cpp:245 gui/options.cpp:1073 gui/options.cpp:1090
msgid "GFX"
msgstr "GFX"
-#: gui/launcher.cpp:242
+#: gui/launcher.cpp:248
msgid "Override global graphic settings"
msgstr "Overstyr globale grafik indstillinger"
-#: gui/launcher.cpp:244
+#: gui/launcher.cpp:250
msgctxt "lowres"
msgid "Override global graphic settings"
msgstr "Overstyr globale grafik indstillinger"
-#: gui/launcher.cpp:251 gui/options.cpp:1095
+#: gui/launcher.cpp:257 gui/options.cpp:1096
msgid "Audio"
msgstr "Lyd"
-#: gui/launcher.cpp:254
+#: gui/launcher.cpp:260
msgid "Override global audio settings"
msgstr "Overstyr globale lyd indstillinger"
-#: gui/launcher.cpp:256
+#: gui/launcher.cpp:262
msgctxt "lowres"
msgid "Override global audio settings"
msgstr "Overstyr globale lyd indstillinger"
-#: gui/launcher.cpp:265 gui/options.cpp:1100
+#: gui/launcher.cpp:271 gui/options.cpp:1101
msgid "Volume"
msgstr "Lydstyrke"
-#: gui/launcher.cpp:267 gui/options.cpp:1102
+#: gui/launcher.cpp:273 gui/options.cpp:1103
msgctxt "lowres"
msgid "Volume"
msgstr "Lydstyrke"
-#: gui/launcher.cpp:270
+#: gui/launcher.cpp:276
msgid "Override global volume settings"
msgstr "Overstyr globale lydstyrke indstillinger"
-#: gui/launcher.cpp:272
+#: gui/launcher.cpp:278
msgctxt "lowres"
msgid "Override global volume settings"
msgstr "Overstyr globale lydstyrke indstillinger"
-#: gui/launcher.cpp:280 gui/options.cpp:1110
+#: gui/launcher.cpp:286 gui/options.cpp:1111
msgid "MIDI"
msgstr "MIDI"
-#: gui/launcher.cpp:283
+#: gui/launcher.cpp:289
msgid "Override global MIDI settings"
msgstr "Overstyr globale MIDI indstillinger"
-#: gui/launcher.cpp:285
+#: gui/launcher.cpp:291
msgctxt "lowres"
msgid "Override global MIDI settings"
msgstr "Overstyr globale MIDI indstillinger"
-#: gui/launcher.cpp:294 gui/options.cpp:1116
+#: gui/launcher.cpp:300 gui/options.cpp:1117
msgid "MT-32"
msgstr "MT-32"
-#: gui/launcher.cpp:297
+#: gui/launcher.cpp:303
msgid "Override global MT-32 settings"
msgstr "Overstyr globale MT-32 indstillinger"
-#: gui/launcher.cpp:299
+#: gui/launcher.cpp:305
msgctxt "lowres"
msgid "Override global MT-32 settings"
msgstr "Overstyr globale MT-32 indstillinger"
-#: gui/launcher.cpp:308 gui/options.cpp:1123
+#: gui/launcher.cpp:314 gui/options.cpp:1124
msgid "Paths"
msgstr "Stier"
-#: gui/launcher.cpp:310 gui/options.cpp:1125
+#: gui/launcher.cpp:316 gui/options.cpp:1126
msgctxt "lowres"
msgid "Paths"
msgstr "Stier"
-#: gui/launcher.cpp:317
+#: gui/launcher.cpp:323
msgid "Game Path:"
msgstr "Spil sti:"
-#: gui/launcher.cpp:319
+#: gui/launcher.cpp:325
msgctxt "lowres"
msgid "Game Path:"
msgstr "Spil sti:"
-#: gui/launcher.cpp:324 gui/options.cpp:1149
+#: gui/launcher.cpp:330 gui/options.cpp:1150
msgid "Extra Path:"
msgstr "Ekstra sti:"
-#: gui/launcher.cpp:324 gui/launcher.cpp:326 gui/launcher.cpp:327
+#: gui/launcher.cpp:330 gui/launcher.cpp:332 gui/launcher.cpp:333
msgid "Specifies path to additional data used the game"
msgstr "Angiver sti til ekstra data der bruges i spillet"
-#: gui/launcher.cpp:326 gui/options.cpp:1151
+#: gui/launcher.cpp:332 gui/options.cpp:1152
msgctxt "lowres"
msgid "Extra Path:"
msgstr "Ekstra sti:"
-#: gui/launcher.cpp:333 gui/options.cpp:1133
+#: gui/launcher.cpp:339 gui/options.cpp:1134
msgid "Save Path:"
msgstr "Gemme sti:"
-#: gui/launcher.cpp:333 gui/launcher.cpp:335 gui/launcher.cpp:336
-#: gui/options.cpp:1133 gui/options.cpp:1135 gui/options.cpp:1136
+#: gui/launcher.cpp:339 gui/launcher.cpp:341 gui/launcher.cpp:342
+#: gui/options.cpp:1134 gui/options.cpp:1136 gui/options.cpp:1137
msgid "Specifies where your savegames are put"
msgstr "Angiver hvor dine gemmer bliver lagt"
-#: gui/launcher.cpp:335 gui/options.cpp:1135
+#: gui/launcher.cpp:341 gui/options.cpp:1136
msgctxt "lowres"
msgid "Save Path:"
msgstr "Gemme sti:"
-#: gui/launcher.cpp:354 gui/launcher.cpp:453 gui/launcher.cpp:511
-#: gui/launcher.cpp:565 gui/options.cpp:1144 gui/options.cpp:1152
-#: gui/options.cpp:1161 gui/options.cpp:1276 gui/options.cpp:1282
-#: gui/options.cpp:1290 gui/options.cpp:1320 gui/options.cpp:1326
-#: gui/options.cpp:1333 gui/options.cpp:1426 gui/options.cpp:1429
-#: gui/options.cpp:1441
+#: gui/launcher.cpp:360 gui/launcher.cpp:459 gui/launcher.cpp:517
+#: gui/launcher.cpp:571 gui/options.cpp:1145 gui/options.cpp:1153
+#: gui/options.cpp:1162 gui/options.cpp:1277 gui/options.cpp:1283
+#: gui/options.cpp:1291 gui/options.cpp:1321 gui/options.cpp:1327
+#: gui/options.cpp:1334 gui/options.cpp:1427 gui/options.cpp:1430
+#: gui/options.cpp:1442
msgctxt "path"
msgid "None"
msgstr "Ingen"
-#: gui/launcher.cpp:359 gui/launcher.cpp:459 gui/launcher.cpp:569
-#: gui/options.cpp:1270 gui/options.cpp:1314 gui/options.cpp:1432
+#: gui/launcher.cpp:365 gui/launcher.cpp:465 gui/launcher.cpp:575
+#: gui/options.cpp:1271 gui/options.cpp:1315 gui/options.cpp:1433
#: backends/platform/wii/options.cpp:56
msgid "Default"
msgstr "Standard"
-#: gui/launcher.cpp:504 gui/options.cpp:1435
+#: gui/launcher.cpp:510 gui/options.cpp:1436
msgid "Select SoundFont"
msgstr "Vælg SoundFont"
-#: gui/launcher.cpp:523 gui/launcher.cpp:677
+#: gui/launcher.cpp:529 gui/launcher.cpp:682
msgid "Select directory with game data"
msgstr "Vælg bibliotek med spil data"
-#: gui/launcher.cpp:541
+#: gui/launcher.cpp:547
msgid "Select additional game directory"
msgstr "Vælg ekstra spil bibliotek"
-#: gui/launcher.cpp:553
+#: gui/launcher.cpp:559
msgid "Select directory for saved games"
msgstr "Vælg bibliotek til spil gemmer"
-#: gui/launcher.cpp:580
+#: gui/launcher.cpp:586
msgid "This game ID is already taken. Please choose another one."
msgstr "Dette spil ID er allerede i brug. Vælg venligst et andet."
-#: gui/launcher.cpp:621 engines/dialogs.cpp:110
+#: gui/launcher.cpp:626 engines/dialogs.cpp:111
msgid "~Q~uit"
msgstr "~A~fslut"
-#: gui/launcher.cpp:621 backends/platform/sdl/macosx/appmenu_osx.mm:95
+#: gui/launcher.cpp:626 backends/platform/sdl/macosx/appmenu_osx.mm:95
msgid "Quit ScummVM"
msgstr "Slut ScummVM"
-#: gui/launcher.cpp:622
+#: gui/launcher.cpp:627
msgid "A~b~out..."
msgstr "~O~m..."
-#: gui/launcher.cpp:622 backends/platform/sdl/macosx/appmenu_osx.mm:69
+#: gui/launcher.cpp:627 backends/platform/sdl/macosx/appmenu_osx.mm:69
msgid "About ScummVM"
msgstr "Om ScummVM"
-#: gui/launcher.cpp:623
+#: gui/launcher.cpp:628
msgid "~O~ptions..."
msgstr "~I~ndstillinger..."
-#: gui/launcher.cpp:623
+#: gui/launcher.cpp:628
msgid "Change global ScummVM options"
msgstr "Ændre globale ScummVM indstillinger"
-#: gui/launcher.cpp:625
+#: gui/launcher.cpp:630
msgid "~S~tart"
msgstr "~S~tart"
-#: gui/launcher.cpp:625
+#: gui/launcher.cpp:630
msgid "Start selected game"
msgstr "Start det valgte spil"
-#: gui/launcher.cpp:628
+#: gui/launcher.cpp:633
msgid "~L~oad..."
msgstr "Ind~l~æs..."
-#: gui/launcher.cpp:628
+#: gui/launcher.cpp:633
msgid "Load savegame for selected game"
msgstr "Indlæs gemmer for det valgte spil"
-#: gui/launcher.cpp:633 gui/launcher.cpp:1120
+#: gui/launcher.cpp:638
msgid "~A~dd Game..."
msgstr "~T~ilføj spil..."
-#: gui/launcher.cpp:633 gui/launcher.cpp:640
+#: gui/launcher.cpp:638 gui/launcher.cpp:645
msgid "Hold Shift for Mass Add"
msgstr "Hold Skift for at tilføje flere"
-#: gui/launcher.cpp:635
+#: gui/launcher.cpp:640
msgid "~E~dit Game..."
msgstr "~R~ediger spil..."
-#: gui/launcher.cpp:635 gui/launcher.cpp:642
+#: gui/launcher.cpp:640 gui/launcher.cpp:647
msgid "Change game options"
msgstr "Ændre spil indstillinger"
-#: gui/launcher.cpp:637
+#: gui/launcher.cpp:642
msgid "~R~emove Game"
msgstr "~F~jern spil"
-#: gui/launcher.cpp:637 gui/launcher.cpp:644
+#: gui/launcher.cpp:642 gui/launcher.cpp:649
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:640 gui/launcher.cpp:1120
+#: gui/launcher.cpp:645
msgctxt "lowres"
msgid "~A~dd Game..."
msgstr "~T~ilføj spil..."
-#: gui/launcher.cpp:642
+#: gui/launcher.cpp:647
msgctxt "lowres"
msgid "~E~dit Game..."
msgstr "~R~ediger spil..."
-#: gui/launcher.cpp:644
+#: gui/launcher.cpp:649
msgctxt "lowres"
msgid "~R~emove Game"
msgstr "~F~jern spil"
-#: gui/launcher.cpp:652
+#: gui/launcher.cpp:657
msgid "Search in game list"
msgstr "Søg i spil liste"
-#: gui/launcher.cpp:656 gui/launcher.cpp:1167
+#: gui/launcher.cpp:661 gui/launcher.cpp:1222
msgid "Search:"
msgstr "Søg:"
-#: gui/launcher.cpp:680 engines/dialogs.cpp:114 engines/mohawk/myst.cpp:245
-#: engines/mohawk/riven.cpp:716 engines/cruise/menu.cpp:214
-#: engines/pegasus/pegasus.cpp:349
+#: gui/launcher.cpp:685 engines/dialogs.cpp:115 engines/cruise/menu.cpp:214
+#: engines/mohawk/myst.cpp:245 engines/mohawk/riven.cpp:718
+#: engines/pegasus/pegasus.cpp:353
msgid "Load game:"
msgstr "Indlæs spil:"
-#: gui/launcher.cpp:680 engines/dialogs.cpp:114 engines/scumm/dialogs.cpp:188
-#: engines/mohawk/myst.cpp:245 engines/mohawk/riven.cpp:716
-#: engines/cruise/menu.cpp:214 engines/pegasus/pegasus.cpp:349
+#: gui/launcher.cpp:685 engines/dialogs.cpp:115
#: backends/platform/wince/CEActionsPocket.cpp:267
#: backends/platform/wince/CEActionsSmartphone.cpp:231
+#: engines/cruise/menu.cpp:214 engines/mohawk/myst.cpp:245
+#: engines/mohawk/riven.cpp:718 engines/pegasus/pegasus.cpp:353
+#: engines/scumm/dialogs.cpp:189
msgid "Load"
msgstr "Indlæs"
-#: gui/launcher.cpp:788
+#: gui/launcher.cpp:792
msgid ""
"Do you really want to run the mass game detector? This could potentially add "
"a huge number of games."
@@ -473,7 +474,8 @@ msgstr ""
"Vil du virkelig køre fler spils detektoren? Dette kunne potentielt tilføje "
"et stort antal spil."
-#: gui/launcher.cpp:789 gui/launcher.cpp:937 gui/fluidsynth-dialog.cpp:216
+#: gui/launcher.cpp:793 gui/launcher.cpp:941 gui/launcher.cpp:1000
+#: gui/fluidsynth-dialog.cpp:217
#: backends/events/symbiansdl/symbiansdl-events.cpp:184
#: backends/platform/wince/CEActionsPocket.cpp:326
#: backends/platform/wince/CEActionsSmartphone.cpp:287
@@ -481,7 +483,8 @@ msgstr ""
msgid "Yes"
msgstr "Ja"
-#: gui/launcher.cpp:789 gui/launcher.cpp:937 gui/fluidsynth-dialog.cpp:216
+#: gui/launcher.cpp:793 gui/launcher.cpp:941 gui/launcher.cpp:1000
+#: gui/fluidsynth-dialog.cpp:217
#: backends/events/symbiansdl/symbiansdl-events.cpp:184
#: backends/platform/wince/CEActionsPocket.cpp:326
#: backends/platform/wince/CEActionsSmartphone.cpp:287
@@ -489,190 +492,185 @@ msgstr "Ja"
msgid "No"
msgstr "Nej"
-#: gui/launcher.cpp:837
+#: gui/launcher.cpp:841
msgid "ScummVM couldn't open the specified directory!"
msgstr "ScummVM kunne ikke åbne det angivne bibliotek!"
-#: gui/launcher.cpp:849
+#: gui/launcher.cpp:853
msgid "ScummVM could not find any game in the specified directory!"
msgstr "ScummVM kunne ikke finde noget spil i det angivne bibliotek!"
-#: gui/launcher.cpp:863
+#: gui/launcher.cpp:867
msgid "Pick the game:"
msgstr "Vælg spillet:"
-#: gui/launcher.cpp:937
+#: gui/launcher.cpp:941
msgid "Do you really want to remove this game configuration?"
msgstr "Vil du virkelig fjerne denne spil konfiguration?"
-#: gui/launcher.cpp:1001
+#: gui/launcher.cpp:999
+#, fuzzy
+msgid "Do you want to load savegame?"
+msgstr "Vil du indlæse eller gemme spillet?"
+
+#: gui/launcher.cpp:1048
msgid "This game does not support loading games from the launcher."
msgstr "Dette spil understøtter ikke indlæsning af spil fra spiloversigten."
-#: gui/launcher.cpp:1005
+#: gui/launcher.cpp:1052
msgid "ScummVM could not find any engine capable of running the selected game!"
msgstr ""
"ScummVM kunne ikke finde en motor, istand til at afvikle det valgte spil!"
-#: gui/launcher.cpp:1119
-msgctxt "lowres"
-msgid "Mass Add..."
-msgstr "Tilføj flere..."
-
-#: gui/launcher.cpp:1119
-msgid "Mass Add..."
-msgstr "Tilføj flere..."
-
-#: gui/massadd.cpp:78 gui/massadd.cpp:81
+#: gui/massadd.cpp:79 gui/massadd.cpp:82
msgid "... progress ..."
msgstr "... fremskridt ..."
-#: gui/massadd.cpp:258
+#: gui/massadd.cpp:259
msgid "Scan complete!"
msgstr "Skan gennemført!"
-#: gui/massadd.cpp:261
+#: gui/massadd.cpp:262
#, c-format
msgid "Discovered %d new games, ignored %d previously added games."
msgstr "Opdaget %d nye spil, ignorerede %d tidligere tilføjede spil."
-#: gui/massadd.cpp:265
+#: gui/massadd.cpp:266
#, c-format
msgid "Scanned %d directories ..."
msgstr "Gennemset %d biblioteker ..."
-#: gui/massadd.cpp:268
+#: gui/massadd.cpp:269
#, c-format
msgid "Discovered %d new games, ignored %d previously added games ..."
msgstr "Fundet %d nye spil, ignorer %d tidligere tilføjede spil ..."
-#: gui/options.cpp:84
+#: gui/options.cpp:85
msgid "Never"
msgstr "Aldrig"
-#: gui/options.cpp:84
+#: gui/options.cpp:85
msgid "every 5 mins"
msgstr "hvert 5. minut"
-#: gui/options.cpp:84
+#: gui/options.cpp:85
msgid "every 10 mins"
msgstr "hvert 10. minut"
-#: gui/options.cpp:84
+#: gui/options.cpp:85
msgid "every 15 mins"
msgstr "hvert 15. minut"
-#: gui/options.cpp:84
+#: gui/options.cpp:85
msgid "every 30 mins"
msgstr "hvert 30. minut"
-#: gui/options.cpp:86
+#: gui/options.cpp:87
msgid "8 kHz"
msgstr "8 kHz"
-#: gui/options.cpp:86
+#: gui/options.cpp:87
msgid "11kHz"
msgstr "11 kHz"
-#: gui/options.cpp:86
+#: gui/options.cpp:87
msgid "22 kHz"
msgstr "22 kHz"
-#: gui/options.cpp:86
+#: gui/options.cpp:87
msgid "44 kHz"
msgstr "44 kHz"
-#: gui/options.cpp:86
+#: gui/options.cpp:87
msgid "48 kHz"
msgstr "48 kHz"
-#: gui/options.cpp:254 gui/options.cpp:480 gui/options.cpp:581
-#: gui/options.cpp:650 gui/options.cpp:858
+#: gui/options.cpp:255 gui/options.cpp:481 gui/options.cpp:582
+#: gui/options.cpp:651 gui/options.cpp:859
msgctxt "soundfont"
msgid "None"
msgstr "Ingen"
-#: gui/options.cpp:388
+#: gui/options.cpp:389
msgid "Failed to apply some of the graphic options changes:"
msgstr "Anvendelse af ændringer for grafiske indstillinger fejlede:"
-#: gui/options.cpp:400
+#: gui/options.cpp:401
msgid "the video mode could not be changed."
msgstr "videotilstanden kunne ikke ændres."
-#: gui/options.cpp:406
+#: gui/options.cpp:407
msgid "the fullscreen setting could not be changed"
msgstr "fuld skærm indstillingen kunne ikke ændres"
-#: gui/options.cpp:412
+#: gui/options.cpp:413
msgid "the aspect ratio setting could not be changed"
msgstr "billedformat indstillingen ikke kunne ændres"
-#: gui/options.cpp:733
+#: gui/options.cpp:734
msgid "Graphics mode:"
msgstr "Grafik tilstand:"
-#: gui/options.cpp:747
+#: gui/options.cpp:748
msgid "Render mode:"
msgstr "Rendere tilstand:"
-#: gui/options.cpp:747 gui/options.cpp:748
+#: gui/options.cpp:748 gui/options.cpp:749
msgid "Special dithering modes supported by some games"
msgstr "Speciel farvereduceringstilstand understøttet a nogle spil"
-#: gui/options.cpp:759
-#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2236
-#: backends/graphics/openglsdl/openglsdl-graphics.cpp:476
+#: gui/options.cpp:760
+#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2249
msgid "Fullscreen mode"
msgstr "Fuldskærms tilstand"
-#: gui/options.cpp:762
+#: gui/options.cpp:763
msgid "Aspect ratio correction"
msgstr "Billedformat korrektion"
-#: gui/options.cpp:762
+#: gui/options.cpp:763
msgid "Correct aspect ratio for 320x200 games"
msgstr "Korrekt billedformat til 320x200 spil"
-#: gui/options.cpp:770
+#: gui/options.cpp:771
msgid "Preferred Device:"
msgstr "Foretruk. enhed:"
-#: gui/options.cpp:770
+#: gui/options.cpp:771
msgid "Music Device:"
msgstr "Musik enhed:"
-#: gui/options.cpp:770 gui/options.cpp:772
+#: gui/options.cpp:771 gui/options.cpp:773
msgid "Specifies preferred sound device or sound card emulator"
msgstr "Angiver foretukket lyd enhed eller lydkort emulator"
-#: gui/options.cpp:770 gui/options.cpp:772 gui/options.cpp:773
+#: gui/options.cpp:771 gui/options.cpp:773 gui/options.cpp:774
msgid "Specifies output sound device or sound card emulator"
msgstr "Angiver lyd udgangsenhed eller lydkorts emulator"
-#: gui/options.cpp:772
+#: gui/options.cpp:773
msgctxt "lowres"
msgid "Preferred Dev.:"
msgstr "Foretruk. enh.:"
-#: gui/options.cpp:772
+#: gui/options.cpp:773
msgctxt "lowres"
msgid "Music Device:"
msgstr "Musik enhed:"
-#: gui/options.cpp:799
+#: gui/options.cpp:800
msgid "AdLib emulator:"
msgstr "AdLib emulator:"
-#: gui/options.cpp:799 gui/options.cpp:800
+#: gui/options.cpp:800 gui/options.cpp:801
msgid "AdLib is used for music in many games"
msgstr "AdLib bliver brugt til musik i mange spil"
-#: gui/options.cpp:810
+#: gui/options.cpp:811
msgid "Output rate:"
msgstr "Udgangsfrekvens:"
-#: gui/options.cpp:810 gui/options.cpp:811
+#: gui/options.cpp:811 gui/options.cpp:812
msgid ""
"Higher value specifies better sound quality but may be not supported by your "
"soundcard"
@@ -680,64 +678,64 @@ msgstr ""
"Højere værdi angiver bedre lyd kvalitet, men understøttes måske ikke af dit "
"lydkort"
-#: gui/options.cpp:821
+#: gui/options.cpp:822
msgid "GM Device:"
msgstr "GM enhed:"
-#: gui/options.cpp:821
+#: gui/options.cpp:822
msgid "Specifies default sound device for General MIDI output"
msgstr "Angiver standard lyd enhed for Generel MIDI-udgang"
-#: gui/options.cpp:832
+#: gui/options.cpp:833
msgid "Don't use General MIDI music"
msgstr "Brug ikke Generel MIDI musik"
-#: gui/options.cpp:843 gui/options.cpp:909
+#: gui/options.cpp:844 gui/options.cpp:910
msgid "Use first available device"
msgstr "Brug første tilgængelig enhed"
-#: gui/options.cpp:855
+#: gui/options.cpp:856
msgid "SoundFont:"
msgstr "SoundFont:"
-#: gui/options.cpp:855 gui/options.cpp:857 gui/options.cpp:858
+#: gui/options.cpp:856 gui/options.cpp:858 gui/options.cpp:859
msgid "SoundFont is supported by some audio cards, Fluidsynth and Timidity"
msgstr "SoundFont er understøttet af nogle lydkort, Fluidsynth og Timidity"
-#: gui/options.cpp:857
+#: gui/options.cpp:858
msgctxt "lowres"
msgid "SoundFont:"
msgstr "SoundFont:"
-#: gui/options.cpp:863
+#: gui/options.cpp:864
msgid "Mixed AdLib/MIDI mode"
msgstr "Blandet AdLib/MIDI tilstand"
-#: gui/options.cpp:863
+#: gui/options.cpp:864
msgid "Use both MIDI and AdLib sound generation"
msgstr "Brug både MIDI og AdLib lyd generering"
-#: gui/options.cpp:866
+#: gui/options.cpp:867
msgid "MIDI gain:"
msgstr "MIDI lydstyrke:"
-#: gui/options.cpp:873
+#: gui/options.cpp:874
msgid "FluidSynth Settings"
msgstr "FluidSynth indstillinger"
-#: gui/options.cpp:880
+#: gui/options.cpp:881
msgid "MT-32 Device:"
msgstr "MT-32 enhed:"
-#: gui/options.cpp:880
+#: gui/options.cpp:881
msgid "Specifies default sound device for Roland MT-32/LAPC1/CM32l/CM64 output"
msgstr "Angiver standard lyd enhed for Roland MT-32/LAPC1/CM32I/CM64 udgang"
-#: gui/options.cpp:885
+#: gui/options.cpp:886
msgid "True Roland MT-32 (disable GM emulation)"
msgstr "Ægte Roland MT-32 (undlad GM emulering)"
-#: gui/options.cpp:885 gui/options.cpp:887
+#: gui/options.cpp:886 gui/options.cpp:888
msgid ""
"Check if you want to use your real hardware Roland-compatible sound device "
"connected to your computer"
@@ -745,190 +743,193 @@ msgstr ""
"Kontroller om du vil bruge din rigtige hardware Roland-kompatible lyd enhed "
"tilsluttet til din computer"
-#: gui/options.cpp:887
+#: gui/options.cpp:888
msgctxt "lowres"
msgid "True Roland MT-32 (no GM emulation)"
msgstr "Ægte Roland MT-32 (ingen GM emulering)"
-#: gui/options.cpp:890
-msgid "Roland GS Mode (disable GM mapping)"
+#: gui/options.cpp:891
+#, fuzzy
+msgid "Roland GS Device (enable MT-32 mappings)"
msgstr "Roland GS tilstand (undlad GM emulering)"
-#: gui/options.cpp:890
-msgid "Turns off General MIDI mapping for games with Roland MT-32 soundtrack"
-msgstr "Sluk for Generel MIDI kortlægning for spil med Roland MT-32 lydspor"
+#: gui/options.cpp:891
+msgid ""
+"Check if you want to enable patch mappings to emulate an MT-32 on a Roland "
+"GS device"
+msgstr ""
-#: gui/options.cpp:899
+#: gui/options.cpp:900
msgid "Don't use Roland MT-32 music"
msgstr "Brug ikke Roland MT-32 musik"
-#: gui/options.cpp:926
+#: gui/options.cpp:927
msgid "Text and Speech:"
msgstr "Tekst og tale:"
-#: gui/options.cpp:930 gui/options.cpp:940
+#: gui/options.cpp:931 gui/options.cpp:941
msgid "Speech"
msgstr "Tale"
-#: gui/options.cpp:931 gui/options.cpp:941
+#: gui/options.cpp:932 gui/options.cpp:942
msgid "Subtitles"
msgstr "Undertekster"
-#: gui/options.cpp:932
+#: gui/options.cpp:933
msgid "Both"
msgstr "Begge"
-#: gui/options.cpp:934
+#: gui/options.cpp:935
msgid "Subtitle speed:"
msgstr "Tekst hastighed:"
-#: gui/options.cpp:936
+#: gui/options.cpp:937
msgctxt "lowres"
msgid "Text and Speech:"
msgstr "Tekst og tale:"
-#: gui/options.cpp:940
+#: gui/options.cpp:941
msgid "Spch"
msgstr "Tale"
-#: gui/options.cpp:941
+#: gui/options.cpp:942
msgid "Subs"
msgstr "Tekst"
-#: gui/options.cpp:942
+#: gui/options.cpp:943
msgctxt "lowres"
msgid "Both"
msgstr "Begge"
-#: gui/options.cpp:942
+#: gui/options.cpp:943
msgid "Show subtitles and play speech"
msgstr "Vis undertekster og afspil tale"
-#: gui/options.cpp:944
+#: gui/options.cpp:945
msgctxt "lowres"
msgid "Subtitle speed:"
msgstr "Tekst hastighed:"
-#: gui/options.cpp:960
+#: gui/options.cpp:961
msgid "Music volume:"
msgstr "Musik lydstyrke:"
-#: gui/options.cpp:962
+#: gui/options.cpp:963
msgctxt "lowres"
msgid "Music volume:"
msgstr "Musik lydstyrke:"
-#: gui/options.cpp:969
+#: gui/options.cpp:970
msgid "Mute All"
msgstr "Mute alle"
-#: gui/options.cpp:972
+#: gui/options.cpp:973
msgid "SFX volume:"
msgstr "SFX lydstyrke:"
-#: gui/options.cpp:972 gui/options.cpp:974 gui/options.cpp:975
+#: gui/options.cpp:973 gui/options.cpp:975 gui/options.cpp:976
msgid "Special sound effects volume"
msgstr "Lydstyrke for specielle lydeffekter"
-#: gui/options.cpp:974
+#: gui/options.cpp:975
msgctxt "lowres"
msgid "SFX volume:"
msgstr "SFX lydstyrke:"
-#: gui/options.cpp:982
+#: gui/options.cpp:983
msgid "Speech volume:"
msgstr "Tale lydstyrke:"
-#: gui/options.cpp:984
+#: gui/options.cpp:985
msgctxt "lowres"
msgid "Speech volume:"
msgstr "Tale lydstyrke:"
-#: gui/options.cpp:1141
+#: gui/options.cpp:1142
msgid "Theme Path:"
msgstr "Tema sti:"
-#: gui/options.cpp:1143
+#: gui/options.cpp:1144
msgctxt "lowres"
msgid "Theme Path:"
msgstr "Tema sti:"
-#: gui/options.cpp:1149 gui/options.cpp:1151 gui/options.cpp:1152
+#: gui/options.cpp:1150 gui/options.cpp:1152 gui/options.cpp:1153
msgid "Specifies path to additional data used by all games or ScummVM"
msgstr "Angiver sti til ekstra data brugt af alle spil eller ScummVM"
-#: gui/options.cpp:1158
+#: gui/options.cpp:1159
msgid "Plugins Path:"
msgstr "Plugin sti:"
-#: gui/options.cpp:1160
+#: gui/options.cpp:1161
msgctxt "lowres"
msgid "Plugins Path:"
msgstr "Plugin sti:"
-#: gui/options.cpp:1169 gui/fluidsynth-dialog.cpp:137
+#: gui/options.cpp:1170 gui/fluidsynth-dialog.cpp:138
msgid "Misc"
msgstr "Andet"
-#: gui/options.cpp:1171
+#: gui/options.cpp:1172
msgctxt "lowres"
msgid "Misc"
msgstr "Andet"
-#: gui/options.cpp:1173
+#: gui/options.cpp:1174
msgid "Theme:"
msgstr "Tema:"
-#: gui/options.cpp:1177
+#: gui/options.cpp:1178
msgid "GUI Renderer:"
msgstr "GUI renderer:"
-#: gui/options.cpp:1189
+#: gui/options.cpp:1190
msgid "Autosave:"
msgstr "Auto gemme:"
-#: gui/options.cpp:1191
+#: gui/options.cpp:1192
msgctxt "lowres"
msgid "Autosave:"
msgstr "Auto gemme:"
-#: gui/options.cpp:1199
+#: gui/options.cpp:1200
msgid "Keys"
msgstr "Taster"
-#: gui/options.cpp:1206
+#: gui/options.cpp:1207
msgid "GUI Language:"
msgstr "Sprog:"
-#: gui/options.cpp:1206
+#: gui/options.cpp:1207
msgid "Language of ScummVM GUI"
msgstr "Sprog for brugerfladen i ScummVM"
-#: gui/options.cpp:1365
+#: gui/options.cpp:1366
msgid "You have to restart ScummVM before your changes will take effect."
msgstr "Du skal genstarte ScummVM før dine ændringer har effekt."
-#: gui/options.cpp:1378
+#: gui/options.cpp:1379
msgid "Select directory for savegames"
msgstr "Vælg bibliotek til gemmer"
-#: gui/options.cpp:1385
+#: gui/options.cpp:1386
msgid "The chosen directory cannot be written to. Please select another one."
msgstr "Der kan ikke skrives til det valgte bibliotek. Vælg venligst et andet."
-#: gui/options.cpp:1394
+#: gui/options.cpp:1395
msgid "Select directory for GUI themes"
msgstr "Vælg bibliotek for GUI temaer"
-#: gui/options.cpp:1404
+#: gui/options.cpp:1405
msgid "Select directory for extra files"
msgstr "Vælg bibliotek for ekstra filer"
-#: gui/options.cpp:1415
+#: gui/options.cpp:1416
msgid "Select directory for plugins"
msgstr "Vælg bibliotek for plugins"
-#: gui/options.cpp:1468
+#: gui/options.cpp:1469
msgid ""
"The theme you selected does not support your current language. If you want "
"to use this theme you need to switch to another language first."
@@ -936,224 +937,227 @@ msgstr ""
"Temaet du valgte understøtter ikke dit aktuelle sprog. Hvis du ønsker at "
"bruge dette tema, skal du skifte til et andet sprog først."
-#: gui/saveload-dialog.cpp:166
+#: gui/saveload-dialog.cpp:167
msgid "List view"
msgstr "Liste visning"
-#: gui/saveload-dialog.cpp:167
+#: gui/saveload-dialog.cpp:168
msgid "Grid view"
msgstr "Gitter visning"
-#: gui/saveload-dialog.cpp:210 gui/saveload-dialog.cpp:358
+#: gui/saveload-dialog.cpp:211 gui/saveload-dialog.cpp:360
msgid "No date saved"
msgstr "Ingen dato gemt"
-#: gui/saveload-dialog.cpp:211 gui/saveload-dialog.cpp:359
+#: gui/saveload-dialog.cpp:212 gui/saveload-dialog.cpp:361
msgid "No time saved"
msgstr "Intet tidspunkt gemt"
-#: gui/saveload-dialog.cpp:212 gui/saveload-dialog.cpp:360
+#: gui/saveload-dialog.cpp:213 gui/saveload-dialog.cpp:362
msgid "No playtime saved"
msgstr "Ingen spilletid gemt"
-#: gui/saveload-dialog.cpp:219 gui/saveload-dialog.cpp:275
+#: gui/saveload-dialog.cpp:220 gui/saveload-dialog.cpp:276
msgid "Delete"
msgstr "Slet"
-#: gui/saveload-dialog.cpp:274
+#: gui/saveload-dialog.cpp:275
msgid "Do you really want to delete this savegame?"
msgstr "Vil du virkelig slette denne gemmer?"
-#: gui/saveload-dialog.cpp:383 gui/saveload-dialog.cpp:872
+#: gui/saveload-dialog.cpp:385 gui/saveload-dialog.cpp:875
msgid "Date: "
msgstr "Dato:"
-#: gui/saveload-dialog.cpp:387 gui/saveload-dialog.cpp:878
+#: gui/saveload-dialog.cpp:389 gui/saveload-dialog.cpp:881
msgid "Time: "
msgstr "Tid:"
-#: gui/saveload-dialog.cpp:393 gui/saveload-dialog.cpp:886
+#: gui/saveload-dialog.cpp:395 gui/saveload-dialog.cpp:889
msgid "Playtime: "
msgstr "Spilletid:"
-#: gui/saveload-dialog.cpp:406 gui/saveload-dialog.cpp:494
+#: gui/saveload-dialog.cpp:408 gui/saveload-dialog.cpp:496
msgid "Untitled savestate"
msgstr "Unavngivet gemmetilstand"
-#: gui/saveload-dialog.cpp:546
+#: gui/saveload-dialog.cpp:548
msgid "Next"
msgstr "Næste"
-#: gui/saveload-dialog.cpp:549
+#: gui/saveload-dialog.cpp:551
msgid "Prev"
msgstr "Forrige"
-#: gui/saveload-dialog.cpp:736
+#: gui/saveload-dialog.cpp:739
msgid "New Save"
msgstr "Ny Gemmer"
-#: gui/saveload-dialog.cpp:736
+#: gui/saveload-dialog.cpp:739
msgid "Create a new save game"
msgstr "Opret en ny gemmer"
-#: gui/saveload-dialog.cpp:865
+#: gui/saveload-dialog.cpp:868
msgid "Name: "
msgstr "Navn:"
-#: gui/saveload-dialog.cpp:937
+#: gui/saveload-dialog.cpp:940
#, c-format
msgid "Enter a description for slot %d:"
msgstr "Indtast en beskrivelse af plads %d:"
-#: gui/themebrowser.cpp:44
+#: gui/themebrowser.cpp:45
msgid "Select a Theme"
msgstr "Vælg et tema"
-#: gui/ThemeEngine.cpp:337
+#: gui/ThemeEngine.cpp:347
msgid "Disabled GFX"
msgstr "Deaktiveret GFX"
-#: gui/ThemeEngine.cpp:337
+#: gui/ThemeEngine.cpp:347
msgctxt "lowres"
msgid "Disabled GFX"
msgstr "Deaktiveret GFX"
-#: gui/ThemeEngine.cpp:338
-msgid "Standard Renderer (16bpp)"
+#: gui/ThemeEngine.cpp:348
+#, fuzzy
+msgid "Standard Renderer"
msgstr "Standard renderer (16bpp)"
-#: gui/ThemeEngine.cpp:338
-msgid "Standard (16bpp)"
-msgstr "Standard (16bpp)"
+#: gui/ThemeEngine.cpp:348 engines/scumm/dialogs.cpp:659
+msgid "Standard"
+msgstr "Standard"
-#: gui/ThemeEngine.cpp:340
-msgid "Antialiased Renderer (16bpp)"
+#: gui/ThemeEngine.cpp:350
+#, fuzzy
+msgid "Antialiased Renderer"
msgstr "Antialias renderer (16bpp)"
-#: gui/ThemeEngine.cpp:340
-msgid "Antialiased (16bpp)"
+#: gui/ThemeEngine.cpp:350
+#, fuzzy
+msgid "Antialiased"
msgstr "Antialias (16bpp)"
-#: gui/widget.cpp:322 gui/widget.cpp:324 gui/widget.cpp:330 gui/widget.cpp:332
+#: gui/widget.cpp:323 gui/widget.cpp:325 gui/widget.cpp:331 gui/widget.cpp:333
msgid "Clear value"
msgstr "Slet værdi"
-#: gui/fluidsynth-dialog.cpp:67
+#: gui/fluidsynth-dialog.cpp:68
msgid "Reverb"
msgstr "Rumklang"
-#: gui/fluidsynth-dialog.cpp:69 gui/fluidsynth-dialog.cpp:101
+#: gui/fluidsynth-dialog.cpp:70 gui/fluidsynth-dialog.cpp:102
msgid "Active"
msgstr "Aktiv"
-#: gui/fluidsynth-dialog.cpp:71
+#: gui/fluidsynth-dialog.cpp:72
msgid "Room:"
msgstr "Rum:"
-#: gui/fluidsynth-dialog.cpp:78
+#: gui/fluidsynth-dialog.cpp:79
msgid "Damp:"
msgstr "Dæmp:"
-#: gui/fluidsynth-dialog.cpp:85
+#: gui/fluidsynth-dialog.cpp:86
msgid "Width:"
msgstr "Bredde:"
-#: gui/fluidsynth-dialog.cpp:92 gui/fluidsynth-dialog.cpp:110
+#: gui/fluidsynth-dialog.cpp:93 gui/fluidsynth-dialog.cpp:111
msgid "Level:"
msgstr "Styrke:"
-#: gui/fluidsynth-dialog.cpp:99
+#: gui/fluidsynth-dialog.cpp:100
msgid "Chorus"
msgstr "Kor"
-#: gui/fluidsynth-dialog.cpp:103
+#: gui/fluidsynth-dialog.cpp:104
msgid "N:"
msgstr "N:"
-#: gui/fluidsynth-dialog.cpp:117
+#: gui/fluidsynth-dialog.cpp:118
msgid "Speed:"
msgstr "Hastighed:"
-#: gui/fluidsynth-dialog.cpp:124
+#: gui/fluidsynth-dialog.cpp:125
msgid "Depth:"
msgstr "Dybde:"
-#: gui/fluidsynth-dialog.cpp:131
+#: gui/fluidsynth-dialog.cpp:132
msgid "Type:"
msgstr "Type:"
-#: gui/fluidsynth-dialog.cpp:134
+#: gui/fluidsynth-dialog.cpp:135
msgid "Sine"
msgstr "Sinus"
-#: gui/fluidsynth-dialog.cpp:135
+#: gui/fluidsynth-dialog.cpp:136
msgid "Triangle"
msgstr "Triangulær"
-#: gui/fluidsynth-dialog.cpp:139
+#: gui/fluidsynth-dialog.cpp:140
msgid "Interpolation:"
msgstr "Interpolation:"
-#: gui/fluidsynth-dialog.cpp:142
+#: gui/fluidsynth-dialog.cpp:143
msgid "None (fastest)"
msgstr "Ingen (hurtigst)"
-#: gui/fluidsynth-dialog.cpp:143
+#: gui/fluidsynth-dialog.cpp:144
msgid "Linear"
msgstr "Lineær"
-#: gui/fluidsynth-dialog.cpp:144
+#: gui/fluidsynth-dialog.cpp:145
msgid "Fourth-order"
msgstr "Fjerde-orden"
-#: gui/fluidsynth-dialog.cpp:145
+#: gui/fluidsynth-dialog.cpp:146
msgid "Seventh-order"
msgstr "Syvende-orden"
-#: gui/fluidsynth-dialog.cpp:149
+#: gui/fluidsynth-dialog.cpp:150
msgid "Reset"
msgstr "Nulstil"
-#: gui/fluidsynth-dialog.cpp:149
+#: gui/fluidsynth-dialog.cpp:150
msgid "Reset all FluidSynth settings to their default values."
msgstr "Nulstil alle FluidSynth indstillinger til deres standard værdier."
-#: gui/fluidsynth-dialog.cpp:216
+#: gui/fluidsynth-dialog.cpp:217
msgid ""
"Do you really want to reset all FluidSynth settings to their default values?"
msgstr ""
"Vil du virkelig nulstille alle FluidSynth indstillinger til deres standard "
"værdier?"
-#: base/main.cpp:210
+#: base/main.cpp:228
#, c-format
msgid "Engine does not support debug level '%s'"
msgstr "Motor understøtter ikke fejlfindingsniveau '%s'"
-#: base/main.cpp:288
+#: base/main.cpp:306
msgid "Menu"
msgstr "Menu"
-#: base/main.cpp:291 backends/platform/symbian/src/SymbianActions.cpp:45
+#: base/main.cpp:309 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:294 backends/platform/symbian/src/SymbianActions.cpp:50
+#: base/main.cpp:312 backends/platform/symbian/src/SymbianActions.cpp:50
#: backends/platform/wince/CEActionsPocket.cpp:42
msgid "Pause"
msgstr "Pause"
-#: base/main.cpp:297
+#: base/main.cpp:315
msgid "Skip line"
msgstr "Spring linje over"
-#: base/main.cpp:468
+#: base/main.cpp:507
msgid "Error running game:"
msgstr "Fejl ved kørsel af spil:"
-#: base/main.cpp:492
+#: base/main.cpp:536
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"
@@ -1221,73 +1225,73 @@ msgstr "Bruger annullerede"
msgid "Unknown error"
msgstr "Ukendt fejl"
-#: engines/advancedDetector.cpp:316
+#: engines/advancedDetector.cpp:317
#, c-format
msgid "The game in '%s' seems to be unknown."
msgstr "Spillet i '%s' ser ud til at være ukendt."
-#: engines/advancedDetector.cpp:317
+#: engines/advancedDetector.cpp:318
msgid "Please, report the following data to the ScummVM team along with name"
msgstr ""
"Venligst, rapportere følgende data til ScummVM holdet sammen med navnet"
-#: engines/advancedDetector.cpp:319
+#: engines/advancedDetector.cpp:320
msgid "of the game you tried to add and its version/language/etc.:"
msgstr "på det spil, du forsøgte at tilføje og dets version/sprog/ etc.:"
-#: engines/dialogs.cpp:84
+#: engines/dialogs.cpp:85
msgid "~R~esume"
msgstr "Gen~o~ptag"
-#: engines/dialogs.cpp:86
+#: engines/dialogs.cpp:87
msgid "~L~oad"
msgstr "~H~ent"
-#: engines/dialogs.cpp:90
+#: engines/dialogs.cpp:91
msgid "~S~ave"
msgstr "~G~em"
-#: engines/dialogs.cpp:94
+#: engines/dialogs.cpp:95
msgid "~O~ptions"
msgstr "~I~ndstillinger"
-#: engines/dialogs.cpp:99
+#: engines/dialogs.cpp:100
msgid "~H~elp"
msgstr "H~j~ælp"
-#: engines/dialogs.cpp:101
+#: engines/dialogs.cpp:102
msgid "~A~bout"
msgstr "~O~m"
-#: engines/dialogs.cpp:104 engines/dialogs.cpp:180
+#: engines/dialogs.cpp:105 engines/dialogs.cpp:181
msgid "~R~eturn to Launcher"
msgstr "~R~etur til spiloversigt"
-#: engines/dialogs.cpp:106 engines/dialogs.cpp:182
+#: engines/dialogs.cpp:107 engines/dialogs.cpp:183
msgctxt "lowres"
msgid "~R~eturn to Launcher"
msgstr "~R~etur til oversigt"
-#: engines/dialogs.cpp:115 engines/agi/saveload.cpp:803
-#: engines/drascula/saveload.cpp:338 engines/cruise/menu.cpp:212
-#: engines/sci/engine/kfile.cpp:742 engines/toltecs/menu.cpp:284
-#: engines/pegasus/pegasus.cpp:373
+#: engines/dialogs.cpp:116 engines/agi/saveload.cpp:803
+#: engines/cruise/menu.cpp:212 engines/drascula/saveload.cpp:336
+#: engines/neverhood/menumodule.cpp:873 engines/pegasus/pegasus.cpp:377
+#: engines/sci/engine/kfile.cpp:758 engines/toltecs/menu.cpp:281
msgid "Save game:"
msgstr "Gemmer:"
-#: engines/dialogs.cpp:115 engines/agi/saveload.cpp:803
-#: engines/drascula/saveload.cpp:338 engines/scumm/dialogs.cpp:187
-#: engines/cruise/menu.cpp:212 engines/sci/engine/kfile.cpp:742
-#: engines/toltecs/menu.cpp:284 engines/pegasus/pegasus.cpp:373
-#: backends/platform/symbian/src/SymbianActions.cpp:44
+#: engines/dialogs.cpp:116 backends/platform/symbian/src/SymbianActions.cpp:44
#: backends/platform/wince/CEActionsPocket.cpp:43
#: backends/platform/wince/CEActionsPocket.cpp:267
#: backends/platform/wince/CEActionsSmartphone.cpp:45
#: backends/platform/wince/CEActionsSmartphone.cpp:231
+#: engines/agi/saveload.cpp:803 engines/cruise/menu.cpp:212
+#: engines/drascula/saveload.cpp:336 engines/neverhood/menumodule.cpp:873
+#: engines/pegasus/pegasus.cpp:377 engines/sci/engine/kfile.cpp:758
+#: engines/scumm/dialogs.cpp:188 engines/toltecs/menu.cpp:281
msgid "Save"
msgstr "Gem"
-#: engines/dialogs.cpp:144
+#: engines/dialogs.cpp:145
msgid ""
"Sorry, this engine does not currently provide in-game help. Please consult "
"the README for basic information, and for instructions on how to obtain "
@@ -1297,7 +1301,7 @@ msgstr ""
"README for grundlæggende oplysninger, og for at få instruktioner om, hvordan "
"man får yderligere hjælp."
-#: engines/dialogs.cpp:228
+#: engines/dialogs.cpp:234 engines/pegasus/pegasus.cpp:393
#, c-format
msgid ""
"Gamestate save failed (%s)! Please consult the README for basic information, "
@@ -1306,37 +1310,37 @@ msgstr ""
"Gem af spiltilstand fejlede (%s)! Se venligst README for grundlæggende "
"oplysninger, og for at få instruktioner om, hvordan man får yderligere hjælp."
-#: engines/dialogs.cpp:301 engines/mohawk/dialogs.cpp:109
+#: engines/dialogs.cpp:307 engines/mohawk/dialogs.cpp:109
#: engines/mohawk/dialogs.cpp:170
msgid "~O~K"
msgstr "~O~K"
-#: engines/dialogs.cpp:302 engines/mohawk/dialogs.cpp:110
+#: engines/dialogs.cpp:308 engines/mohawk/dialogs.cpp:110
#: engines/mohawk/dialogs.cpp:171
msgid "~C~ancel"
msgstr "~F~ortryd"
-#: engines/dialogs.cpp:305
+#: engines/dialogs.cpp:311
msgid "~K~eys"
msgstr "~T~aster"
-#: engines/engine.cpp:240
+#: engines/engine.cpp:245
msgid "Could not initialize color format."
msgstr "Kunne ikke initialisere farveformat."
-#: engines/engine.cpp:248
+#: engines/engine.cpp:253
msgid "Could not switch to video mode: '"
msgstr "Kunne ikke skifte til videotilstand: '"
-#: engines/engine.cpp:257
+#: engines/engine.cpp:262
msgid "Could not apply aspect ratio setting."
msgstr "Kunne ikke anvende billedformat korrektion indstilling."
-#: engines/engine.cpp:262
+#: engines/engine.cpp:267
msgid "Could not apply fullscreen setting."
msgstr "Kunne ikke anvende fuldskærm indstilling."
-#: engines/engine.cpp:362
+#: engines/engine.cpp:367
msgid ""
"You appear to be playing this game directly\n"
"from the CD. This is known to cause problems,\n"
@@ -1350,7 +1354,7 @@ msgstr ""
"datafiler til din harddisk i stedet.\n"
"Se README fil for detaljer."
-#: engines/engine.cpp:373
+#: engines/engine.cpp:378
msgid ""
"This game has audio tracks in its disk. These\n"
"tracks need to be ripped from the disk using\n"
@@ -1364,7 +1368,7 @@ msgstr ""
"for at lytte til spillets musik.\n"
"Se README fil for detaljer."
-#: engines/engine.cpp:431
+#: engines/engine.cpp:436
#, c-format
msgid ""
"Gamestate load failed (%s)! Please consult the README for basic information, "
@@ -1374,7 +1378,7 @@ msgstr ""
"grundlæggende oplysninger, og for at få instruktioner om, hvordan man får "
"yderligere hjælp."
-#: engines/engine.cpp:444
+#: engines/engine.cpp:449
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 "
@@ -1384,33 +1388,760 @@ msgstr ""
"ScummVM. Således, er det sandsynligt, at det er ustabilt, og alle gemmer du "
"foretager fungerer muligvis ikke i fremtidige versioner af ScummVM."
-#: engines/engine.cpp:447
+#: engines/engine.cpp:452
msgid "Start anyway"
msgstr "Start alligevel"
-#: engines/agi/detection.cpp:142 engines/drascula/detection.cpp:270
-#: engines/dreamweb/detection.cpp:47 engines/sci/detection.cpp:393
-#: engines/toltecs/detection.cpp:173
+#: audio/fmopl.cpp:50
+msgid "MAME OPL emulator"
+msgstr "MAME OPL emulator"
+
+#: audio/fmopl.cpp:52
+msgid "DOSBox OPL emulator"
+msgstr "DOSBox OPL emulator"
+
+#: audio/mididrv.cpp:209
+#, c-format
+msgid ""
+"The selected audio device '%s' was not found (e.g. might be turned off or "
+"disconnected)."
+msgstr ""
+"Den valgte lydenhed '%s' blev ikke fundet (kan f.eks være slukket eller "
+"afbrudt)."
+
+#: audio/mididrv.cpp:209 audio/mididrv.cpp:221 audio/mididrv.cpp:257
+#: audio/mididrv.cpp:272
+msgid "Attempting to fall back to the next available device..."
+msgstr "Forsøger at falde tilbage til den næste tilgængelig enhed..."
+
+#: audio/mididrv.cpp:221
+#, c-format
+msgid ""
+"The selected audio device '%s' cannot be used. See log file for more "
+"information."
+msgstr ""
+"Den valgte lydenhed '%s' kan ikke bruges. Se log filen for mere information."
+
+#: audio/mididrv.cpp:257
+#, c-format
+msgid ""
+"The preferred audio device '%s' was not found (e.g. might be turned off or "
+"disconnected)."
+msgstr ""
+"Den foretrukne lydenhed '%s' blev ikke fundet (kan f.eks være slukket eller "
+"afbrudt)."
+
+#: audio/mididrv.cpp:272
+#, c-format
+msgid ""
+"The preferred audio device '%s' cannot be used. See log file for more "
+"information."
+msgstr ""
+"Den foretrukne lydenhed '%s' kan ikke bruges. Se log filen for mere "
+"information."
+
+#: audio/null.h:44
+msgid "No music"
+msgstr "Ingen musik"
+
+#: audio/mods/paula.cpp:196
+msgid "Amiga Audio Emulator"
+msgstr "Amiga lyd emulator"
+
+#: audio/softsynth/adlib.cpp:2285
+msgid "AdLib Emulator"
+msgstr "AdLib emulator"
+
+#: audio/softsynth/appleiigs.cpp:33
+msgid "Apple II GS Emulator (NOT IMPLEMENTED)"
+msgstr "Apple II GS emulator (IKKE IMPLEMENTERET)"
+
+#: audio/softsynth/sid.cpp:1430
+msgid "C64 Audio Emulator"
+msgstr "C64 lyd emulator"
+
+#: audio/softsynth/mt32.cpp:200
+msgid "Initializing MT-32 Emulator"
+msgstr "Initialisere MT-32 emulator"
+
+#: audio/softsynth/mt32.cpp:426
+msgid "MT-32 Emulator"
+msgstr "MT-32 emulator"
+
+#: audio/softsynth/pcspk.cpp:139
+msgid "PC Speaker Emulator"
+msgstr "PC Speaker emulator"
+
+#: audio/softsynth/pcspk.cpp:158
+msgid "IBM PCjr Emulator"
+msgstr "IBM PCjr emulator"
+
+#: backends/keymapper/remap-dialog.cpp:48
+msgid "Keymap:"
+msgstr "Tasteoversigt:"
+
+#: backends/keymapper/remap-dialog.cpp:67
+msgid " (Effective)"
+msgstr " (Aktiv)"
+
+#: backends/keymapper/remap-dialog.cpp:107
+msgid " (Active)"
+msgstr " (Aktiv)"
+
+#: backends/keymapper/remap-dialog.cpp:107
+msgid " (Blocked)"
+msgstr "(Blokeret)"
+
+#: backends/keymapper/remap-dialog.cpp:120
+msgid " (Global)"
+msgstr " (Global)"
+
+#: backends/keymapper/remap-dialog.cpp:128
+msgid " (Game)"
+msgstr " (Spil)"
+
+#: backends/midi/windows.cpp:165
+msgid "Windows MIDI"
+msgstr "Windows MIDI"
+
+#: backends/platform/ds/arm9/source/dsoptions.cpp:56
+#: engines/scumm/dialogs.cpp:291
+msgid "~C~lose"
+msgstr "~L~uk"
+
+#: backends/platform/ds/arm9/source/dsoptions.cpp:57
+msgid "ScummVM Main Menu"
+msgstr "ScummVM Hovedmenu"
+
+#: backends/platform/ds/arm9/source/dsoptions.cpp:63
+msgid "~L~eft handed mode"
+msgstr "~V~enstrehåndstilstand "
+
+#: backends/platform/ds/arm9/source/dsoptions.cpp:64
+msgid "~I~ndy fight controls"
+msgstr "~I~ndy kamp styring"
+
+#: backends/platform/ds/arm9/source/dsoptions.cpp:65
+msgid "Show mouse cursor"
+msgstr "Vis muse markør"
+
+#: backends/platform/ds/arm9/source/dsoptions.cpp:66
+msgid "Snap to edges"
+msgstr "Hæft til hjørner"
+
+#: backends/platform/ds/arm9/source/dsoptions.cpp:68
+msgid "Touch X Offset"
+msgstr "Touch X forskydning"
+
+#: backends/platform/ds/arm9/source/dsoptions.cpp:75
+msgid "Touch Y Offset"
+msgstr "Touch Y forskydning"
+
+#: backends/platform/ds/arm9/source/dsoptions.cpp:87
+msgid "Use laptop trackpad-style cursor control"
+msgstr "Brug bærbar museplade-agtig markør kontrol"
+
+#: backends/platform/ds/arm9/source/dsoptions.cpp:88
+msgid "Tap for left click, double tap right click"
+msgstr "Tryk for venstre klik, dobbelt tryk for højre klik"
+
+#: backends/platform/ds/arm9/source/dsoptions.cpp:90
+msgid "Sensitivity"
+msgstr "Følsomhed"
+
+#: backends/platform/ds/arm9/source/dsoptions.cpp:99
+msgid "Initial top screen scale:"
+msgstr "Skalering af øverste skærm ved opstart:"
+
+#: backends/platform/ds/arm9/source/dsoptions.cpp:105
+msgid "Main screen scaling:"
+msgstr "Hovedskærm skalering"
+
+#: backends/platform/ds/arm9/source/dsoptions.cpp:107
+msgid "Hardware scale (fast, but low quality)"
+msgstr "Hardware skalering (hurtig, men lav kvalitet)"
+
+#: backends/platform/ds/arm9/source/dsoptions.cpp:108
+msgid "Software scale (good quality, but slower)"
+msgstr "Software skalering (god kvalitet, men langsommere)"
+
+#: backends/platform/ds/arm9/source/dsoptions.cpp:109
+msgid "Unscaled (you must scroll left and right)"
+msgstr "Ikke skaleret (du skal rulle til venstre og højre)"
+
+#: backends/platform/ds/arm9/source/dsoptions.cpp:111
+msgid "Brightness:"
+msgstr "Lysstyrke:"
+
+#: backends/platform/ds/arm9/source/dsoptions.cpp:121
+msgid "High quality audio (slower) (reboot)"
+msgstr "Høj lydkvalitet (langsommere) (genstart)"
+
+#: backends/platform/ds/arm9/source/dsoptions.cpp:122
+msgid "Disable power off"
+msgstr "Deaktiver slukning"
+
+#: backends/platform/iphone/osys_events.cpp:300
+msgid "Mouse-click-and-drag mode enabled."
+msgstr "Muse-klik-og-træk tilstand aktiveret."
+
+#: backends/platform/iphone/osys_events.cpp:302
+msgid "Mouse-click-and-drag mode disabled."
+msgstr "Muse-klik-og-træk tilstand deaktiveret."
+
+#: backends/platform/iphone/osys_events.cpp:313
+msgid "Touchpad mode enabled."
+msgstr "Pegeplade tilstand aktiveret."
+
+#: backends/platform/iphone/osys_events.cpp:315
+msgid "Touchpad mode disabled."
+msgstr "Pegeplade tilstand deaktiveret."
+
+#: backends/platform/maemo/maemo.cpp:209
+msgid "Click Mode"
+msgstr "Klik tilstand"
+
+#: backends/platform/maemo/maemo.cpp:215
+#: backends/platform/symbian/src/SymbianActions.cpp:42
+#: backends/platform/wince/CEActionsPocket.cpp:60
+#: backends/platform/wince/CEActionsSmartphone.cpp:43
+#: backends/platform/tizen/form.cpp:275
+msgid "Left Click"
+msgstr "Venstre klik"
+
+#: backends/platform/maemo/maemo.cpp:218
+msgid "Middle Click"
+msgstr "Miderste klik"
+
+#: backends/platform/maemo/maemo.cpp:221
+#: backends/platform/symbian/src/SymbianActions.cpp:43
+#: backends/platform/wince/CEActionsSmartphone.cpp:44
+#: backends/platform/tizen/form.cpp:267
+msgid "Right Click"
+msgstr "Højre klik"
+
+#: backends/platform/sdl/macosx/appmenu_osx.mm:77
+msgid "Hide ScummVM"
+msgstr "Skjul ScummVM"
+
+#: backends/platform/sdl/macosx/appmenu_osx.mm:82
+msgid "Hide Others"
+msgstr "Skjul andre"
+
+#: backends/platform/sdl/macosx/appmenu_osx.mm:87
+msgid "Show All"
+msgstr "Vis alle"
+
+#: backends/platform/sdl/macosx/appmenu_osx.mm:109
+#: backends/platform/sdl/macosx/appmenu_osx.mm:120
+msgid "Window"
+msgstr "Vindue"
+
+#: backends/platform/sdl/macosx/appmenu_osx.mm:114
+msgid "Minimize"
+msgstr "Minimer"
+
+#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:46
+msgid "Normal (no scaling)"
+msgstr "Normal (ingen skalering)"
+
+#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:65
+msgctxt "lowres"
+msgid "Normal (no scaling)"
+msgstr "Normal (ingen skalering)"
+
+#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2148
+msgid "Enabled aspect ratio correction"
+msgstr "Aktivér billedformat korrektion"
+
+#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2154
+msgid "Disabled aspect ratio correction"
+msgstr "Deaktivér billedformat korrektion"
+
+#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2209
+msgid "Active graphics filter:"
+msgstr "Aktive grafik filtre:"
+
+#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2251
+msgid "Windowed mode"
+msgstr "Vindue tilstand"
+
+#: backends/graphics/opengl/opengl-graphics.cpp:118
+#, fuzzy
+msgid "OpenGL"
+msgstr "Åbn"
+
+#: backends/graphics/opengl/opengl-graphics.cpp:119
+msgid "OpenGL (No filtering)"
+msgstr ""
+
+#: backends/platform/symbian/src/SymbianActions.cpp:38
+#: backends/platform/wince/CEActionsSmartphone.cpp:39
+msgid "Up"
+msgstr "Op"
+
+#: backends/platform/symbian/src/SymbianActions.cpp:39
+#: backends/platform/wince/CEActionsSmartphone.cpp:40
+msgid "Down"
+msgstr "Ned"
+
+#: backends/platform/symbian/src/SymbianActions.cpp:40
+#: backends/platform/wince/CEActionsSmartphone.cpp:41
+msgid "Left"
+msgstr "Venstre"
+
+#: backends/platform/symbian/src/SymbianActions.cpp:41
+#: backends/platform/wince/CEActionsSmartphone.cpp:42
+msgid "Right"
+msgstr "Højre"
+
+#: backends/platform/symbian/src/SymbianActions.cpp:46
+#: backends/platform/wince/CEActionsSmartphone.cpp:47
+msgid "Zone"
+msgstr "Zone"
+
+#: backends/platform/symbian/src/SymbianActions.cpp:47
+#: backends/platform/wince/CEActionsPocket.cpp:54
+#: backends/platform/wince/CEActionsSmartphone.cpp:48
+msgid "Multi Function"
+msgstr "Multi funktion"
+
+#: backends/platform/symbian/src/SymbianActions.cpp:48
+msgid "Swap character"
+msgstr "Skift person"
+
+#: backends/platform/symbian/src/SymbianActions.cpp:49
+msgid "Skip text"
+msgstr "Spring tekst over"
+
+#: backends/platform/symbian/src/SymbianActions.cpp:51
+msgid "Fast mode"
+msgstr "Hurtig tilstand"
+
+#: 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:218
+#: engines/scumm/dialogs.cpp:192 engines/scumm/help.cpp:82
+#: engines/scumm/help.cpp:84
+msgid "Quit"
+msgstr "Afslut"
+
+#: backends/platform/symbian/src/SymbianActions.cpp:53
+msgid "Debugger"
+msgstr "Fejlsøger"
+
+#: backends/platform/symbian/src/SymbianActions.cpp:54
+msgid "Global menu"
+msgstr "Global menu"
+
+#: backends/platform/symbian/src/SymbianActions.cpp:55
+msgid "Virtual keyboard"
+msgstr "Virtuelt tastatur"
+
+#: backends/platform/symbian/src/SymbianActions.cpp:56
+msgid "Key mapper"
+msgstr "Tastetildeling"
+
+#: backends/events/symbiansdl/symbiansdl-events.cpp:184
+msgid "Do you want to quit ?"
+msgstr "Vil du afslutte?"
+
+#: backends/platform/wii/options.cpp:51
+msgid "Video"
+msgstr "Video"
+
+#: backends/platform/wii/options.cpp:54
+msgid "Current video mode:"
+msgstr "Aktuel videotilstand:"
+
+#: backends/platform/wii/options.cpp:56
+msgid "Double-strike"
+msgstr "Double-strike (ikke-interlaced)"
+
+#: backends/platform/wii/options.cpp:60
+msgid "Horizontal underscan:"
+msgstr "Vandret underskan:"
+
+#: backends/platform/wii/options.cpp:66
+msgid "Vertical underscan:"
+msgstr "Lodret underskan:"
+
+#: backends/platform/wii/options.cpp:71
+msgid "Input"
+msgstr "Input"
+
+#: backends/platform/wii/options.cpp:74
+msgid "GC Pad sensitivity:"
+msgstr "GC Pad følsomhed:"
+
+#: backends/platform/wii/options.cpp:80
+msgid "GC Pad acceleration:"
+msgstr "GC Pad acceleration:"
+
+#: backends/platform/wii/options.cpp:86
+msgid "DVD"
+msgstr "DVD"
+
+#: backends/platform/wii/options.cpp:89 backends/platform/wii/options.cpp:101
+msgid "Status:"
+msgstr "Status:"
+
+#: backends/platform/wii/options.cpp:90 backends/platform/wii/options.cpp:102
+msgid "Unknown"
+msgstr "Ukendt"
+
+#: backends/platform/wii/options.cpp:93
+msgid "Mount DVD"
+msgstr "Montere DVD"
+
+#: backends/platform/wii/options.cpp:94
+msgid "Unmount DVD"
+msgstr "Afmontere DVD"
+
+#: backends/platform/wii/options.cpp:98
+msgid "SMB"
+msgstr "SMB"
+
+#: backends/platform/wii/options.cpp:106
+msgid "Server:"
+msgstr "Server:"
+
+#: backends/platform/wii/options.cpp:110
+msgid "Share:"
+msgstr "Mappe:"
+
+#: backends/platform/wii/options.cpp:114
+msgid "Username:"
+msgstr "Bruger:"
+
+#: backends/platform/wii/options.cpp:118
+msgid "Password:"
+msgstr "Kodeord:"
+
+#: backends/platform/wii/options.cpp:121
+msgid "Init network"
+msgstr "Init netværk"
+
+#: backends/platform/wii/options.cpp:123
+msgid "Mount SMB"
+msgstr "Montere SMB"
+
+#: backends/platform/wii/options.cpp:124
+msgid "Unmount SMB"
+msgstr "Afmonterer SMB"
+
+#: backends/platform/wii/options.cpp:143
+msgid "DVD Mounted successfully"
+msgstr "DVD montering lykkedes"
+
+#: backends/platform/wii/options.cpp:146
+msgid "Error while mounting the DVD"
+msgstr "Fejl ved montering af DVD"
+
+#: backends/platform/wii/options.cpp:148
+msgid "DVD not mounted"
+msgstr "DVD ikke monteret"
+
+#: backends/platform/wii/options.cpp:161
+msgid "Network up, share mounted"
+msgstr "Netværk oppe, delt mappe monteret"
+
+#: backends/platform/wii/options.cpp:163
+msgid "Network up"
+msgstr "Netværk oppe"
+
+#: backends/platform/wii/options.cpp:166
+msgid ", error while mounting the share"
+msgstr ", fejl imens montering af delt mappe"
+
+#: backends/platform/wii/options.cpp:168
+msgid ", share not mounted"
+msgstr ", delt mappe ikke monteret"
+
+#: backends/platform/wii/options.cpp:174
+msgid "Network down"
+msgstr "Netværk nede"
+
+#: backends/platform/wii/options.cpp:178
+msgid "Initializing network"
+msgstr "Initialisere netværk"
+
+#: backends/platform/wii/options.cpp:182
+msgid "Timeout while initializing network"
+msgstr "Tidsgrænse nået ved initialisering af netværk"
+
+#: backends/platform/wii/options.cpp:186
+#, c-format
+msgid "Network not initialized (%d)"
+msgstr "Netværk ikke initialiseret (%d)"
+
+#: backends/platform/wince/CEActionsPocket.cpp:46
+msgid "Hide Toolbar"
+msgstr "Skjul værktøjslinje"
+
+#: backends/platform/wince/CEActionsPocket.cpp:47
+msgid "Show Keyboard"
+msgstr "Vis tastatur"
+
+#: backends/platform/wince/CEActionsPocket.cpp:48
+msgid "Sound on/off"
+msgstr "Lyd til/fra"
+
+#: backends/platform/wince/CEActionsPocket.cpp:49
+msgid "Right click"
+msgstr "Højre klik"
+
+#: backends/platform/wince/CEActionsPocket.cpp:50
+msgid "Show/Hide Cursor"
+msgstr "Vis/skjul markør"
+
+#: backends/platform/wince/CEActionsPocket.cpp:51
+msgid "Free look"
+msgstr "Fri udsigt"
+
+#: backends/platform/wince/CEActionsPocket.cpp:52
+msgid "Zoom up"
+msgstr "Formindsk"
+
+#: backends/platform/wince/CEActionsPocket.cpp:53
+msgid "Zoom down"
+msgstr "Forstør"
+
+#: backends/platform/wince/CEActionsPocket.cpp:55
+#: backends/platform/wince/CEActionsSmartphone.cpp:49
+msgid "Bind Keys"
+msgstr "Tildel taster"
+
+#: backends/platform/wince/CEActionsPocket.cpp:56
+msgid "Cursor Up"
+msgstr "Pil op"
+
+#: backends/platform/wince/CEActionsPocket.cpp:57
+msgid "Cursor Down"
+msgstr "Pil ned"
+
+#: backends/platform/wince/CEActionsPocket.cpp:58
+msgid "Cursor Left"
+msgstr "Pil til venstre"
+
+#: backends/platform/wince/CEActionsPocket.cpp:59
+msgid "Cursor Right"
+msgstr "Pil til højre"
+
+#: 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 indlæse eller gemme spillet?"
+
+#: 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? "
+
+#: backends/platform/wince/CEActionsSmartphone.cpp:50
+msgid "Keyboard"
+msgstr "Tastatur"
+
+#: backends/platform/wince/CEActionsSmartphone.cpp:51
+msgid "Rotate"
+msgstr "Drej"
+
+#: backends/platform/wince/CELauncherDialog.cpp:56
+msgid "Using SDL driver "
+msgstr "Brug SDL driver"
+
+#: backends/platform/wince/CELauncherDialog.cpp:60
+msgid "Display "
+msgstr "Vis"
+
+#: 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:516
+msgid "Map right click action"
+msgstr "Tildel højreklikshandling"
+
+#: backends/platform/wince/wince-sdl.cpp:520
+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:529
+msgid "Map hide toolbar action"
+msgstr "Tildel \"skjul værktøjslinje\" handling"
+
+#: backends/platform/wince/wince-sdl.cpp:533
+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:542
+msgid "Map Zoom Up action (optional)"
+msgstr "Tildel Formindsk handling (valgfri)"
+
+#: backends/platform/wince/wince-sdl.cpp:545
+msgid "Map Zoom Down action (optional)"
+msgstr "Tildel Forstør handling (valgfri)"
+
+#: backends/platform/wince/wince-sdl.cpp:553
+msgid ""
+"Don't forget to map a key to 'Hide Toolbar' action to see the whole inventory"
+msgstr ""
+"Glem ikke at tildele en tast til 'Skjul værktøjslinje' handling for at se "
+"hele oversigten"
+
+#: backends/events/default/default-events.cpp:196
+msgid "Do you really want to return to the Launcher?"
+msgstr "Vil du virkelig gå tilbage til oversigten?"
+
+#: backends/events/default/default-events.cpp:196
+msgid "Launcher"
+msgstr "Oversigt"
+
+#: backends/events/default/default-events.cpp:218
+msgid "Do you really want to quit?"
+msgstr "Vil du virkelig afslutte?"
+
+#: backends/events/gph/gph-events.cpp:386
+#: backends/events/gph/gph-events.cpp:429
+#: backends/events/openpandora/op-events.cpp:168
+msgid "Touchscreen 'Tap Mode' - Left Click"
+msgstr "Touchscreen 'Tap Mode' - Venstre Klik"
+
+#: backends/events/gph/gph-events.cpp:388
+#: backends/events/gph/gph-events.cpp:431
+#: backends/events/openpandora/op-events.cpp:170
+msgid "Touchscreen 'Tap Mode' - Right Click"
+msgstr "Touchscreen 'Tap Mode' - Højre Klik"
+
+#: backends/events/gph/gph-events.cpp:390
+#: backends/events/gph/gph-events.cpp:433
+#: backends/events/openpandora/op-events.cpp:172
+msgid "Touchscreen 'Tap Mode' - Hover (No Click)"
+msgstr "Touchscreen 'Tap Mode' - Henover (Ingen Klik)"
+
+#: backends/events/gph/gph-events.cpp:410
+msgid "Maximum Volume"
+msgstr "Maximal lydstyrke"
+
+#: backends/events/gph/gph-events.cpp:412
+msgid "Increasing Volume"
+msgstr "Hæver lydstyrke"
+
+#: backends/events/gph/gph-events.cpp:418
+msgid "Minimal Volume"
+msgstr "Minimal lydstyrke"
+
+#: backends/events/gph/gph-events.cpp:420
+msgid "Decreasing Volume"
+msgstr "Sænker lydstyrke"
+
+#: backends/events/openpandora/op-events.cpp:174
+msgid "Touchscreen 'Tap Mode' - Hover (DPad Clicks)"
+msgstr "Touchscreen 'Tap Mode' - Henover (DPad Klik)"
+
+#: backends/updates/macosx/macosx-updates.mm:67
+msgid "Check for Updates..."
+msgstr "Søg efter opdateringer..."
+
+#: backends/platform/tizen/form.cpp:263
+msgid "Right Click Once"
+msgstr "Enkelt højre klik"
+
+#: backends/platform/tizen/form.cpp:271
+msgid "Move Only"
+msgstr "Flyt kun"
+
+#: backends/platform/tizen/form.cpp:294
+msgid "Escape Key"
+msgstr "Escape tast"
+
+#: backends/platform/tizen/form.cpp:299
+msgid "Game Menu"
+msgstr "Spil menu"
+
+#: backends/platform/tizen/form.cpp:304
+msgid "Show Keypad"
+msgstr "Vis tastatur"
+
+#: backends/platform/tizen/form.cpp:309
+msgid "Control Mouse"
+msgstr "Kontrollér mus"
+
+#: backends/events/maemosdl/maemosdl-events.cpp:192
+msgid "Clicking Enabled"
+msgstr "Klik aktiveret"
+
+#: backends/events/maemosdl/maemosdl-events.cpp:192
+msgid "Clicking Disabled"
+msgstr "Klik deaktiveret"
+
+#: engines/agi/detection.cpp:142 engines/drascula/detection.cpp:302
+#: engines/dreamweb/detection.cpp:47 engines/neverhood/detection.cpp:160
+#: engines/sci/detection.cpp:394 engines/toltecs/detection.cpp:186
msgid "Use original save/load screens"
msgstr "Brug original gem/indlæs skærme"
-#: engines/agi/detection.cpp:143 engines/drascula/detection.cpp:271
-#: engines/dreamweb/detection.cpp:48 engines/sci/detection.cpp:394
-#: engines/toltecs/detection.cpp:174
+#: engines/agi/detection.cpp:143 engines/drascula/detection.cpp:303
+#: engines/dreamweb/detection.cpp:48 engines/neverhood/detection.cpp:161
+#: engines/sci/detection.cpp:395 engines/toltecs/detection.cpp:187
msgid "Use the original save/load screens, instead of the ScummVM ones"
msgstr "Brug de originale gem/indlæs skærme, istedet for dem fra ScummVM"
-#: engines/agi/saveload.cpp:816 engines/drascula/saveload.cpp:351
-#: engines/sci/engine/kfile.cpp:841 engines/toltecs/menu.cpp:259
+#: engines/agi/saveload.cpp:816 engines/drascula/saveload.cpp:349
+#: engines/neverhood/menumodule.cpp:886 engines/sci/engine/kfile.cpp:857
+#: engines/toltecs/menu.cpp:256
msgid "Restore game:"
msgstr "Gendan spil:"
-#: engines/agi/saveload.cpp:816 engines/drascula/saveload.cpp:351
-#: engines/sci/engine/kfile.cpp:841 engines/toltecs/menu.cpp:259
+#: engines/agi/saveload.cpp:816 engines/drascula/saveload.cpp:349
+#: engines/neverhood/menumodule.cpp:886 engines/sci/engine/kfile.cpp:857
+#: engines/toltecs/menu.cpp:256
msgid "Restore"
msgstr "Gendan"
-#: engines/drascula/saveload.cpp:49
+#: engines/agos/saveload.cpp:160 engines/scumm/scumm.cpp:2321
+#, c-format
+msgid ""
+"Failed to load game state from file:\n"
+"\n"
+"%s"
+msgstr ""
+"Mislykkedes at indlæse spil tilstand fra fil:\n"
+"\n"
+"%s"
+
+#: engines/agos/saveload.cpp:195 engines/scumm/scumm.cpp:2314
+#, c-format
+msgid ""
+"Failed to save game state to file:\n"
+"\n"
+"%s"
+msgstr ""
+"Mislykkedes at gemme spil tilstand til fil:\n"
+"\n"
+"%s"
+
+#: engines/agos/saveload.cpp:203 engines/scumm/scumm.cpp:2332
+#, c-format
+msgid ""
+"Successfully saved game state in file:\n"
+"\n"
+"%s"
+msgstr ""
+"Gemt spil tilstand problemfrit i fil:\n"
+"\n"
+"%s"
+
+#: engines/agos/animation.cpp:557
+#, c-format
+msgid "Cutscene file '%s' not found!"
+msgstr "Filmsekvens fil '%s' ikke fundet!"
+
+#: engines/drascula/saveload.cpp:47
msgid ""
"ScummVM found that you have old savefiles for Drascula that should be "
"converted.\n"
@@ -1436,27 +2167,303 @@ msgstr "Brug lys palet tilstand"
msgid "Display graphics using the game's bright palette"
msgstr "Vis grafik ved hjælp af spillets lyse palette"
-#: engines/sci/detection.cpp:373
+#: engines/gob/inter_playtoons.cpp:256 engines/gob/inter_v2.cpp:1470
+#: engines/tinsel/saveload.cpp:532
+msgid "Failed to load game state from file."
+msgstr "Mislykkedes at indlæse spil tilstand fra fil."
+
+#: engines/gob/inter_v2.cpp:1540 engines/tinsel/saveload.cpp:545
+msgid "Failed to save game state to file."
+msgstr "Mislykkedes at gemme spil tilstand til fil."
+
+#: engines/gob/inter_v5.cpp:107
+msgid "Failed to delete file."
+msgstr "Mislykkedes at slette fil."
+
+#: engines/groovie/detection.cpp:312
+msgid "Fast movie speed"
+msgstr "Hurtig film hastighed"
+
+#: engines/groovie/detection.cpp:313
+msgid "Play movies at an increased speed"
+msgstr "Afspil film med forhøjet hastighed"
+
+#: engines/groovie/script.cpp:399
+msgid "Failed to save game"
+msgstr "Mislykkedes at gemme spil"
+
+#. I18N: Studio audience adds an applause and cheering sounds whenever
+#. Malcolm makes a joke.
+#: engines/kyra/detection.cpp:62
+msgid "Studio audience"
+msgstr "Studio publikum"
+
+#: engines/kyra/detection.cpp:63
+msgid "Enable studio audience"
+msgstr "Aktivér studio publikum"
+
+#. I18N: This option allows the user to skip text and cutscenes.
+#: engines/kyra/detection.cpp:73
+msgid "Skip support"
+msgstr "Spring over støtte"
+
+#: engines/kyra/detection.cpp:74
+msgid "Allow text and cutscenes to be skipped"
+msgstr "Tillad at tekst og filmsekvenser kan springes over"
+
+#. I18N: Helium mode makes people sound like they've inhaled Helium.
+#: engines/kyra/detection.cpp:84
+msgid "Helium mode"
+msgstr "Helium tilstand"
+
+#: engines/kyra/detection.cpp:85
+msgid "Enable helium mode"
+msgstr "Aktivér helium tilstand"
+
+#. I18N: When enabled, this option makes scrolling smoother when
+#. changing from one screen to another.
+#: engines/kyra/detection.cpp:99
+msgid "Smooth scrolling"
+msgstr "Jævn bevægelse"
+
+#: engines/kyra/detection.cpp:100
+msgid "Enable smooth scrolling when walking"
+msgstr "Aktivér jævn bevægelse når du går"
+
+#. I18N: When enabled, this option changes the cursor when it floats to the
+#. edge of the screen to a directional arrow. The player can then click to
+#. walk towards that direction.
+#: engines/kyra/detection.cpp:112
+msgid "Floating cursors"
+msgstr "Flydende markør"
+
+#: engines/kyra/detection.cpp:113
+msgid "Enable floating cursors"
+msgstr "Aktivér flydende markør"
+
+#. I18N: HP stands for Hit Points
+#: engines/kyra/detection.cpp:127
+msgid "HP bar graphs"
+msgstr "HP søjlegrafer"
+
+#: engines/kyra/detection.cpp:128
+msgid "Enable hit point bar graphs"
+msgstr "Aktivér træfpoint (HP) søjlediagrammer"
+
+#: engines/kyra/lol.cpp:478
+msgid "Attack 1"
+msgstr "Angreb 1"
+
+#: engines/kyra/lol.cpp:479
+msgid "Attack 2"
+msgstr "Angreb 2"
+
+#: engines/kyra/lol.cpp:480
+msgid "Attack 3"
+msgstr "Angreb 3"
+
+#: engines/kyra/lol.cpp:481
+msgid "Move Forward"
+msgstr "Flyt fremad"
+
+#: engines/kyra/lol.cpp:482
+msgid "Move Back"
+msgstr "Flyt bagud"
+
+#: engines/kyra/lol.cpp:483
+msgid "Slide Left"
+msgstr "Flyt til venstre"
+
+#: engines/kyra/lol.cpp:484
+msgid "Slide Right"
+msgstr "Flyt til højre"
+
+#: engines/kyra/lol.cpp:485 engines/pegasus/pegasus.cpp:2509
+msgid "Turn Left"
+msgstr "Drej til venstre"
+
+#: engines/kyra/lol.cpp:486 engines/pegasus/pegasus.cpp:2510
+msgid "Turn Right"
+msgstr "Drej til højre"
+
+#: engines/kyra/lol.cpp:487
+msgid "Rest"
+msgstr "Hvil"
+
+#: engines/kyra/lol.cpp:488
+msgid "Options"
+msgstr "Indstillinger"
+
+#: engines/kyra/lol.cpp:489
+msgid "Choose Spell"
+msgstr "Vælg magi"
+
+#: engines/kyra/sound_midi.cpp:477
+msgid ""
+"You appear to be using a General MIDI device,\n"
+"but your game only supports Roland MT32 MIDI.\n"
+"We try to map the Roland MT32 instruments to\n"
+"General MIDI ones. It is still possible that\n"
+"some tracks sound incorrect."
+msgstr ""
+"Det lader til at du bruger en Generel MIDI-enhed,\n"
+"men dit spil kun understøtter Roland MT32 MIDI.\n"
+"Vi forsøger at kortlægge Roland MT32 instrumenterne til\n"
+"dem i Generel MIDI. Trods det kan det ske\n"
+"at nogle stykker ikke lyder korrekt."
+
+#. I18N: Option for fast scene switching
+#: engines/mohawk/dialogs.cpp:92 engines/mohawk/dialogs.cpp:167
+msgid "~Z~ip Mode Activated"
+msgstr "~Z~ip tilstand aktiveret"
+
+#: engines/mohawk/dialogs.cpp:93
+msgid "~T~ransitions Enabled"
+msgstr "~O~vergange aktiveret"
+
+#. I18N: Drop book page
+#: engines/mohawk/dialogs.cpp:95
+msgid "~D~rop Page"
+msgstr "Smi~d~ side"
+
+#: engines/mohawk/dialogs.cpp:99
+msgid "~S~how Map"
+msgstr "Vi~s~ kort"
+
+#: engines/mohawk/dialogs.cpp:105
+msgid "~M~ain Menu"
+msgstr "Hoved~m~enu"
+
+#: engines/mohawk/dialogs.cpp:168
+msgid "~W~ater Effect Enabled"
+msgstr "~V~andeffekter aktiveret"
+
+#: engines/neverhood/detection.cpp:167
+msgid "Skip the Hall of Records storyboard scenes"
+msgstr ""
+
+#: engines/neverhood/detection.cpp:168
+msgid "Allows the player to skip past the Hall of Records storyboard scenes"
+msgstr ""
+
+#: engines/neverhood/detection.cpp:174
+msgid "Scale the making of videos to full screen"
+msgstr ""
+
+#: engines/neverhood/detection.cpp:175
+msgid "Scale the making of videos, so that they use the whole screen"
+msgstr ""
+
+#: engines/parallaction/saveload.cpp:133
+#, c-format
+msgid ""
+"Can't save game in slot %i\n"
+"\n"
+msgstr ""
+"Kan ikke gemme spil på plads %i\n"
+"\n"
+
+#: engines/parallaction/saveload.cpp:204
+msgid "Loading game..."
+msgstr "Indlæser spil..."
+
+#: engines/parallaction/saveload.cpp:219
+msgid "Saving game..."
+msgstr "Gemmer spil..."
+
+#: engines/parallaction/saveload.cpp:272
+msgid ""
+"ScummVM found that you have old savefiles for Nippon Safes that should be "
+"renamed.\n"
+"The old names are 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 next time.\n"
+msgstr ""
+"ScummVM har konstateret, at du har gamle gemmer for Nippon Safes, der skal "
+"omdøbes.\n"
+"De gamle navne er ikke længere understøttet, så du vil ikke være i stand til "
+"at indlæse dine spil, hvis du ikke konvertere dem.\n"
+"\n"
+"Tryk på OK for at konvertere dem nu, ellers vil du blive spurgt næste gang.\n"
+
+#: engines/parallaction/saveload.cpp:319
+msgid "ScummVM successfully converted all your savefiles."
+msgstr "ScummVM konverterede med succes alle dine gemmer."
+
+#: engines/parallaction/saveload.cpp:321
+msgid ""
+"ScummVM printed some warnings in your console window and can't guarantee all "
+"your files have been converted.\n"
+"\n"
+"Please report to the team."
+msgstr ""
+"ScummVM udskrev nogle advarsler i dit konsol vindue, og kan ikke garantere "
+"at alle dine filer er blevet konverteret.\n"
+"\n"
+"Venligst rapportér til holdet."
+
+#: engines/pegasus/pegasus.cpp:714
+msgid "Invalid save file name"
+msgstr "Ugyldigt navn for gemmer"
+
+#: engines/pegasus/pegasus.cpp:2507
+msgid "Up/Zoom In/Move Forward/Open Doors"
+msgstr "Op/Forstør/Flyt frem/Åben døre"
+
+#: engines/pegasus/pegasus.cpp:2508
+msgid "Down/Zoom Out"
+msgstr "Ned/Forminsk"
+
+#: engines/pegasus/pegasus.cpp:2511
+msgid "Display/Hide Inventory Tray"
+msgstr "Vis/Skjul Oversigtsbakke"
+
+#: engines/pegasus/pegasus.cpp:2512
+msgid "Display/Hide Biochip Tray"
+msgstr "Vis/Skjul Biochip bakke"
+
+#: engines/pegasus/pegasus.cpp:2513
+msgid "Action/Select"
+msgstr "Handling/Vælg"
+
+#: engines/pegasus/pegasus.cpp:2514
+msgid "Toggle Center Data Display"
+msgstr "Skift Center Data Display"
+
+#: engines/pegasus/pegasus.cpp:2515
+msgid "Display/Hide Info Screen"
+msgstr "Vis/Skjul Info skærm"
+
+#: engines/pegasus/pegasus.cpp:2516
+msgid "Display/Hide Pause Menu"
+msgstr "Vis/Skjul Pause menu"
+
+#: engines/pegasus/pegasus.cpp:2517
+msgid "???"
+msgstr "???"
+
+#: engines/sci/detection.cpp:374
msgid "EGA undithering"
msgstr "EGA farveforøgelse"
-#: engines/sci/detection.cpp:374
+#: engines/sci/detection.cpp:375
msgid "Enable undithering in EGA games"
msgstr "Aktiver farveforøgelse i EGA spil"
-#: engines/sci/detection.cpp:383
+#: engines/sci/detection.cpp:384
msgid "Prefer digital sound effects"
msgstr "Foretræk digitale lydeffekter"
-#: engines/sci/detection.cpp:384
+#: engines/sci/detection.cpp:385
msgid "Prefer digital sound effects instead of synthesized ones"
msgstr "Foretræk digitale lydeffekter i stedet for syntetiserede"
-#: engines/sci/detection.cpp:403
+#: engines/sci/detection.cpp:404
msgid "Use IMF/Yamaha FB-01 for MIDI output"
msgstr "Brug IMF/Yamaha FB-01 til MIDI-udgang"
-#: engines/sci/detection.cpp:404
+#: engines/sci/detection.cpp:405
msgid ""
"Use an IBM Music Feature card or a Yamaha FB-01 FM synth module for MIDI "
"output"
@@ -1464,164 +2471,146 @@ msgstr ""
"Bruge et IBM Musik Feature-kort eller et Yamaha FB-01 FM synth modul til "
"MIDI-udgang"
-#: engines/sci/detection.cpp:414
+#: engines/sci/detection.cpp:415
msgid "Use CD audio"
msgstr "Brug CD lyd"
-#: engines/sci/detection.cpp:415
+#: engines/sci/detection.cpp:416
msgid "Use CD audio instead of in-game audio, if available"
msgstr "Brug cd-lyd i stedet for lyd fra spillet, hvis tilgængelige"
-#: engines/sci/detection.cpp:425
+#: engines/sci/detection.cpp:426
msgid "Use Windows cursors"
msgstr "Brug Windows markør"
-#: engines/sci/detection.cpp:426
+#: engines/sci/detection.cpp:427
msgid ""
"Use the Windows cursors (smaller and monochrome) instead of the DOS ones"
msgstr "Brug Windows-markører (mindre og monokrome) i stedet for dem fra DOS"
-#: engines/sci/detection.cpp:436
+#: engines/sci/detection.cpp:437
msgid "Use silver cursors"
msgstr "Brug sølv markør"
-#: engines/sci/detection.cpp:437
+#: engines/sci/detection.cpp:438
msgid ""
"Use the alternate set of silver cursors, instead of the normal golden ones"
msgstr ""
"Brug det alternative sæt af sølv markører, i stedet for de normale gyldne"
-#: engines/scumm/dialogs.cpp:175
+#: engines/scumm/dialogs.cpp:176
#, c-format
msgid "Insert Disk %c and Press Button to Continue."
msgstr "Indsæt Disk %c og Tryk på knappen for at fortsætte."
-#: engines/scumm/dialogs.cpp:176
+#: engines/scumm/dialogs.cpp:177
#, c-format
msgid "Unable to Find %s, (%c%d) Press Button."
msgstr "Kunne ikke finde %s, (%c%d) Tryk på knappen."
-#: engines/scumm/dialogs.cpp:177
+#: engines/scumm/dialogs.cpp:178
#, c-format
msgid "Error reading disk %c, (%c%d) Press Button."
msgstr "Fejl ved læsning af disk %c, (%c%d) Tryk på knappen."
-#: engines/scumm/dialogs.cpp:178
+#: engines/scumm/dialogs.cpp:179
msgid "Game Paused. Press SPACE to Continue."
msgstr "Spil sat på pause. Tryk MELLEMRUM for at fortsætte."
#. 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
+#: engines/scumm/dialogs.cpp:183
msgid "Are you sure you want to restart? (Y/N)"
msgstr "Er du sikker på at du vil genstarte? (J/N) "
#. I18N: you may specify 'Yes' symbol at the end of the line. See previous comment
-#: engines/scumm/dialogs.cpp:184
+#: engines/scumm/dialogs.cpp:185
msgid "Are you sure you want to quit? (Y/N)"
msgstr "Er du sikker på at du vil afslutte? (J/N) "
-#: engines/scumm/dialogs.cpp:189
+#: engines/scumm/dialogs.cpp:190
msgid "Play"
msgstr "Spil"
-#: 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:215
-msgid "Quit"
-msgstr "Afslut"
-
-#: engines/scumm/dialogs.cpp:193
+#: engines/scumm/dialogs.cpp:194
msgid "Insert save/load game disk"
msgstr "Indsæt gem/indlæs spil disk"
-#: engines/scumm/dialogs.cpp:194
+#: engines/scumm/dialogs.cpp:195
msgid "You must enter a name"
msgstr "Du skal indtaste et name"
-#: engines/scumm/dialogs.cpp:195
+#: engines/scumm/dialogs.cpp:196
msgid "The game was NOT saved (disk full?)"
msgstr "Spillet blev ikke gemt (disk fuld?)"
-#: engines/scumm/dialogs.cpp:196
+#: engines/scumm/dialogs.cpp:197
msgid "The game was NOT loaded"
msgstr "Spillet blev IKKE indlæst"
-#: engines/scumm/dialogs.cpp:197
+#: engines/scumm/dialogs.cpp:198
#, c-format
msgid "Saving '%s'"
msgstr "Gemmer '%s'"
-#: engines/scumm/dialogs.cpp:198
+#: engines/scumm/dialogs.cpp:199
#, c-format
msgid "Loading '%s'"
msgstr "Indlæser '%s'"
-#: engines/scumm/dialogs.cpp:199
+#: engines/scumm/dialogs.cpp:200
msgid "Name your SAVE game"
msgstr "Navngiv din GEMMER"
-#: engines/scumm/dialogs.cpp:200
+#: engines/scumm/dialogs.cpp:201
msgid "Select a game to LOAD"
msgstr "Vælg et spil at indlæse"
-#: engines/scumm/dialogs.cpp:201
+#: engines/scumm/dialogs.cpp:202
msgid "Game title)"
msgstr "Spil titel)"
#. I18N: Previous page button
-#: engines/scumm/dialogs.cpp:287
+#: engines/scumm/dialogs.cpp:288
msgid "~P~revious"
msgstr "Fo~r~rige"
#. I18N: Next page button
-#: engines/scumm/dialogs.cpp:289
+#: engines/scumm/dialogs.cpp:290
msgid "~N~ext"
msgstr "~N~æste"
-#: engines/scumm/dialogs.cpp:290
-#: backends/platform/ds/arm9/source/dsoptions.cpp:56
-msgid "~C~lose"
-msgstr "~L~uk"
-
-#: engines/scumm/dialogs.cpp:597
+#: engines/scumm/dialogs.cpp:598
msgid "Speech Only"
msgstr "Kun tale"
-#: engines/scumm/dialogs.cpp:598
+#: engines/scumm/dialogs.cpp:599
msgid "Speech and Subtitles"
msgstr "Tale og Undertekster"
-#: engines/scumm/dialogs.cpp:599
+#: engines/scumm/dialogs.cpp:600
msgid "Subtitles Only"
msgstr "Kun undertekster"
-#: engines/scumm/dialogs.cpp:607
+#: engines/scumm/dialogs.cpp:608
msgctxt "lowres"
msgid "Speech & Subs"
msgstr "Tale & Tekst"
-#: engines/scumm/dialogs.cpp:653
+#: engines/scumm/dialogs.cpp:654
msgid "Select a Proficiency Level."
msgstr "Vælg et Færdighedsniveau."
-#: engines/scumm/dialogs.cpp:655
+#: engines/scumm/dialogs.cpp:656
msgid "Refer to your Loom(TM) manual for help."
msgstr "Se din Loom(TM) manual for hjælp."
-#: engines/scumm/dialogs.cpp:658
-msgid "Standard"
-msgstr "Standard"
-
-#: engines/scumm/dialogs.cpp:659
+#: engines/scumm/dialogs.cpp:660
msgid "Practice"
msgstr "Træning"
-#: engines/scumm/dialogs.cpp:660
+#: engines/scumm/dialogs.cpp:661
msgid "Expert"
msgstr "Ekspert"
@@ -2138,7 +3127,7 @@ msgstr "Flyv til højre"
msgid "Fly to lower right"
msgstr "Flyv nederst til højre"
-#: engines/scumm/scumm.cpp:1776
+#: engines/scumm/scumm.cpp:1777
#, c-format
msgid ""
"Native MIDI support requires the Roland Upgrade from LucasArts,\n"
@@ -2147,40 +3136,7 @@ msgstr ""
"Indbygget MIDI understøttelse kræver Roland opgradering fra LucasArts,\n"
"men %s mangler. Bruger AdLib i stedet."
-#: engines/scumm/scumm.cpp:2303 engines/agos/saveload.cpp:220
-#, c-format
-msgid ""
-"Failed to save game state to file:\n"
-"\n"
-"%s"
-msgstr ""
-"Mislykkedes at gemme spil tilstand til fil:\n"
-"\n"
-"%s"
-
-#: engines/scumm/scumm.cpp:2310 engines/agos/saveload.cpp:185
-#, c-format
-msgid ""
-"Failed to load game state from file:\n"
-"\n"
-"%s"
-msgstr ""
-"Mislykkedes at indlæse spil tilstand fra fil:\n"
-"\n"
-"%s"
-
-#: engines/scumm/scumm.cpp:2322 engines/agos/saveload.cpp:228
-#, c-format
-msgid ""
-"Successfully saved game state in file:\n"
-"\n"
-"%s"
-msgstr ""
-"Gemt spil tilstand problemfrit i fil:\n"
-"\n"
-"%s"
-
-#: engines/scumm/scumm.cpp:2537
+#: engines/scumm/scumm.cpp:2547
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' "
@@ -2190,190 +3146,6 @@ msgstr ""
"endnu. For at spille det, gå til 'Tilføj spil' i ScummVM start-menuen og "
"vælg 'Maniac' mappen inde i Tentacle spillets mappe."
-#. I18N: Option for fast scene switching
-#: engines/mohawk/dialogs.cpp:92 engines/mohawk/dialogs.cpp:167
-msgid "~Z~ip Mode Activated"
-msgstr "~Z~ip tilstand aktiveret"
-
-#: engines/mohawk/dialogs.cpp:93
-msgid "~T~ransitions Enabled"
-msgstr "~O~vergange aktiveret"
-
-#. I18N: Drop book page
-#: engines/mohawk/dialogs.cpp:95
-msgid "~D~rop Page"
-msgstr "Smi~d~ side"
-
-#: engines/mohawk/dialogs.cpp:99
-msgid "~S~how Map"
-msgstr "Vi~s~ kort"
-
-#: engines/mohawk/dialogs.cpp:105
-msgid "~M~ain Menu"
-msgstr "Hoved~m~enu"
-
-#: engines/mohawk/dialogs.cpp:168
-msgid "~W~ater Effect Enabled"
-msgstr "~V~andeffekter aktiveret"
-
-#: engines/agos/animation.cpp:557
-#, c-format
-msgid "Cutscene file '%s' not found!"
-msgstr "Filmsekvens fil '%s' ikke fundet!"
-
-#: engines/gob/inter_playtoons.cpp:256 engines/gob/inter_v2.cpp:1287
-#: engines/tinsel/saveload.cpp:532
-msgid "Failed to load game state from file."
-msgstr "Mislykkedes at indlæse spil tilstand fra fil."
-
-#: engines/gob/inter_v2.cpp:1357 engines/tinsel/saveload.cpp:545
-msgid "Failed to save game state to file."
-msgstr "Mislykkedes at gemme spil tilstand til fil."
-
-#: engines/gob/inter_v5.cpp:107
-msgid "Failed to delete file."
-msgstr "Mislykkedes at slette fil."
-
-#: engines/groovie/detection.cpp:312
-msgid "Fast movie speed"
-msgstr "Hurtig film hastighed"
-
-#: engines/groovie/detection.cpp:313
-msgid "Play movies at an increased speed"
-msgstr "Afspil film med forhøjet hastighed"
-
-#: engines/groovie/script.cpp:420
-msgid "Failed to save game"
-msgstr "Mislykkedes at gemme spil"
-
-#. I18N: Studio audience adds an applause and cheering sounds whenever
-#. Malcolm makes a joke.
-#: engines/kyra/detection.cpp:62
-msgid "Studio audience"
-msgstr "Studio publikum"
-
-#: engines/kyra/detection.cpp:63
-msgid "Enable studio audience"
-msgstr "Aktivér studio publikum"
-
-#. I18N: This option allows the user to skip text and cutscenes.
-#: engines/kyra/detection.cpp:73
-msgid "Skip support"
-msgstr "Spring over støtte"
-
-#: engines/kyra/detection.cpp:74
-msgid "Allow text and cutscenes to be skipped"
-msgstr "Tillad at tekst og filmsekvenser kan springes over"
-
-#. I18N: Helium mode makes people sound like they've inhaled Helium.
-#: engines/kyra/detection.cpp:84
-msgid "Helium mode"
-msgstr "Helium tilstand"
-
-#: engines/kyra/detection.cpp:85
-msgid "Enable helium mode"
-msgstr "Aktivér helium tilstand"
-
-#. I18N: When enabled, this option makes scrolling smoother when
-#. changing from one screen to another.
-#: engines/kyra/detection.cpp:99
-msgid "Smooth scrolling"
-msgstr "Jævn bevægelse"
-
-#: engines/kyra/detection.cpp:100
-msgid "Enable smooth scrolling when walking"
-msgstr "Aktivér jævn bevægelse når du går"
-
-#. I18N: When enabled, this option changes the cursor when it floats to the
-#. edge of the screen to a directional arrow. The player can then click to
-#. walk towards that direction.
-#: engines/kyra/detection.cpp:112
-msgid "Floating cursors"
-msgstr "Flydende markør"
-
-#: engines/kyra/detection.cpp:113
-msgid "Enable floating cursors"
-msgstr "Aktivér flydende markør"
-
-#. I18N: HP stands for Hit Points
-#: engines/kyra/detection.cpp:127
-msgid "HP bar graphs"
-msgstr "HP søjlegrafer"
-
-#: engines/kyra/detection.cpp:128
-msgid "Enable hit point bar graphs"
-msgstr "Aktivér træfpoint (HP) søjlediagrammer"
-
-#: engines/kyra/lol.cpp:478
-msgid "Attack 1"
-msgstr "Angreb 1"
-
-#: engines/kyra/lol.cpp:479
-msgid "Attack 2"
-msgstr "Angreb 2"
-
-#: engines/kyra/lol.cpp:480
-msgid "Attack 3"
-msgstr "Angreb 3"
-
-#: engines/kyra/lol.cpp:481
-msgid "Move Forward"
-msgstr "Flyt fremad"
-
-#: engines/kyra/lol.cpp:482
-msgid "Move Back"
-msgstr "Flyt bagud"
-
-#: engines/kyra/lol.cpp:483
-msgid "Slide Left"
-msgstr "Flyt til venstre"
-
-#: engines/kyra/lol.cpp:484
-msgid "Slide Right"
-msgstr "Flyt til højre"
-
-#: engines/kyra/lol.cpp:485 engines/pegasus/pegasus.cpp:2447
-msgid "Turn Left"
-msgstr "Drej til venstre"
-
-#: engines/kyra/lol.cpp:486 engines/pegasus/pegasus.cpp:2448
-msgid "Turn Right"
-msgstr "Drej til højre"
-
-#: engines/kyra/lol.cpp:487
-msgid "Rest"
-msgstr "Hvil"
-
-#: engines/kyra/lol.cpp:488
-msgid "Options"
-msgstr "Indstillinger"
-
-#: engines/kyra/lol.cpp:489
-msgid "Choose Spell"
-msgstr "Vælg magi"
-
-#: engines/kyra/sound_midi.cpp:477
-msgid ""
-"You appear to be using a General MIDI device,\n"
-"but your game only supports Roland MT32 MIDI.\n"
-"We try to map the Roland MT32 instruments to\n"
-"General MIDI ones. It is still possible that\n"
-"some tracks sound incorrect."
-msgstr ""
-"Det lader til at du bruger en Generel MIDI-enhed,\n"
-"men dit spil kun understøtter Roland MT32 MIDI.\n"
-"Vi forsøger at kortlægge Roland MT32 instrumenterne til\n"
-"dem i Generel MIDI. Trods det kan det ske\n"
-"at nogle stykker ikke lyder korrekt."
-
-#: engines/queen/queen.cpp:59
-msgid "Alternative intro"
-msgstr "Alternativ intro"
-
-#: engines/queen/queen.cpp:60
-msgid "Use an alternative game intro (CD version only)"
-msgstr "Brug en alternativ spil intro (kun CD version)"
-
#: engines/sky/compact.cpp:130
msgid ""
"Unable to find \"sky.cpt\" file!\n"
@@ -2398,21 +3170,23 @@ msgstr "Diskette intro"
msgid "Use the floppy version's intro (CD version only)"
msgstr "Brug diskette versionens intro (kun CD version)"
-#: engines/sword1/animation.cpp:519
+#: engines/sword1/animation.cpp:524
#, c-format
msgid "PSX stream cutscene '%s' cannot be played in paletted mode"
msgstr "PSX stream filmsekvens '%s' kan ikke afspilles i palette tilstand"
-#: engines/sword1/animation.cpp:540 engines/sword2/animation.cpp:439
+#: engines/sword1/animation.cpp:545 engines/sword2/animation.cpp:445
msgid "DXA cutscenes found but ScummVM has been built without zlib support"
msgstr ""
"DXA filmsekvenser fundet, men ScummVM er bygget uden zlib understøttelse"
-#: engines/sword1/animation.cpp:550 engines/sword2/animation.cpp:449
-msgid "MPEG2 cutscenes are no longer supported"
-msgstr "MPEG2 filmsekvenser understøttes ikke længere"
+#: engines/sword1/animation.cpp:561
+#, fuzzy
+msgid "MPEG-2 cutscenes found but ScummVM has been built without MPEG-2"
+msgstr ""
+"PSX filmsekvenser fundet, men ScummVM er bygget uden RGB farve understøttelse"
-#: engines/sword1/animation.cpp:556 engines/sword2/animation.cpp:457
+#: engines/sword1/animation.cpp:568 engines/sword2/animation.cpp:470
#, c-format
msgid "Cutscene '%s' not found"
msgstr "Filmsekvens '%s' ikke fundet"
@@ -2456,12 +3230,19 @@ msgstr "Behold den nye"
msgid "This is the end of the Broken Sword 1 Demo"
msgstr "Dette er slutningen af Broken Sword 1 demoen"
-#: engines/sword2/animation.cpp:419
+#: engines/sword2/animation.cpp:425
msgid ""
"PSX cutscenes found but ScummVM has been built without RGB color support"
msgstr ""
"PSX filmsekvenser fundet, men ScummVM er bygget uden RGB farve understøttelse"
+#: engines/sword2/animation.cpp:461
+#, fuzzy
+msgid ""
+"MPEG-2 cutscenes found but ScummVM has been built without MPEG-2 support"
+msgstr ""
+"DXA filmsekvenser fundet, men ScummVM er bygget uden zlib understøttelse"
+
#: engines/sword2/sword2.cpp:79
msgid "Show object labels"
msgstr "Vis labels på genstande"
@@ -2470,12 +3251,12 @@ msgstr "Vis labels på genstande"
msgid "Show labels for objects on mouse hover"
msgstr "Vis labels for genstande musen er henover"
-#: engines/teenagent/resources.cpp:94
+#: engines/teenagent/resources.cpp:95
msgid ""
"You're missing the 'teenagent.dat' file. Get it from the ScummVM website"
msgstr "Du mangler filen 'teenagent.dat'. Hent den på ScummVM hjemmesiden"
-#: engines/teenagent/resources.cpp:115
+#: engines/teenagent/resources.cpp:116
msgid ""
"The teenagent.dat file is compressed and zlib hasn't been included in this "
"executable. Please decompress it"
@@ -2483,789 +3264,49 @@ msgstr ""
"Teenagent.dat filen er komprimeret og zlib er ikke blevet inkluderet i dette "
"program. Udpak den venligst"
-#: engines/parallaction/saveload.cpp:133
-#, c-format
-msgid ""
-"Can't save game in slot %i\n"
-"\n"
-msgstr ""
-"Kan ikke gemme spil på plads %i\n"
-"\n"
-
-#: engines/parallaction/saveload.cpp:204
-msgid "Loading game..."
-msgstr "Indlæser spil..."
-
-#: engines/parallaction/saveload.cpp:219
-msgid "Saving game..."
-msgstr "Gemmer spil..."
-
-#: engines/parallaction/saveload.cpp:272
-msgid ""
-"ScummVM found that you have old savefiles for Nippon Safes that should be "
-"renamed.\n"
-"The old names are 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 next time.\n"
-msgstr ""
-"ScummVM har konstateret, at du har gamle gemmer for Nippon Safes, der skal "
-"omdøbes.\n"
-"De gamle navne er ikke længere understøttet, så du vil ikke være i stand til "
-"at indlæse dine spil, hvis du ikke konvertere dem.\n"
-"\n"
-"Tryk på OK for at konvertere dem nu, ellers vil du blive spurgt næste gang.\n"
-
-#: engines/parallaction/saveload.cpp:319
-msgid "ScummVM successfully converted all your savefiles."
-msgstr "ScummVM konverterede med succes alle dine gemmer."
-
-#: engines/parallaction/saveload.cpp:321
-msgid ""
-"ScummVM printed some warnings in your console window and can't guarantee all "
-"your files have been converted.\n"
-"\n"
-"Please report to the team."
-msgstr ""
-"ScummVM udskrev nogle advarsler i dit konsol vindue, og kan ikke garantere "
-"at alle dine filer er blevet konverteret.\n"
-"\n"
-"Venligst rapportér til holdet."
-
-#: engines/pegasus/pegasus.cpp:679
-msgid "Invalid save file name"
-msgstr "Ugyldigt navn for gemmer"
-
-#: engines/pegasus/pegasus.cpp:2445
-msgid "Up/Zoom In/Move Forward/Open Doors"
-msgstr "Op/Forstør/Flyt frem/Åben døre"
-
-#: engines/pegasus/pegasus.cpp:2446
-msgid "Down/Zoom Out"
-msgstr "Ned/Forminsk"
-
-#: engines/pegasus/pegasus.cpp:2449
-msgid "Display/Hide Inventory Tray"
-msgstr "Vis/Skjul Oversigtsbakke"
-
-#: engines/pegasus/pegasus.cpp:2450
-msgid "Display/Hide Biochip Tray"
-msgstr "Vis/Skjul Biochip bakke"
-
-#: engines/pegasus/pegasus.cpp:2451
-msgid "Action/Select"
-msgstr "Handling/Vælg"
-
-#: engines/pegasus/pegasus.cpp:2452
-msgid "Toggle Center Data Display"
-msgstr "Skift Center Data Display"
-
-#: engines/pegasus/pegasus.cpp:2453
-msgid "Display/Hide Info Screen"
-msgstr "Vis/Skjul Info skærm"
-
-#: engines/pegasus/pegasus.cpp:2454
-msgid "Display/Hide Pause Menu"
-msgstr "Vis/Skjul Pause menu"
-
-#: engines/pegasus/pegasus.cpp:2455
-msgid "???"
-msgstr "???"
-
-#: audio/fmopl.cpp:49
-msgid "MAME OPL emulator"
-msgstr "MAME OPL emulator"
-
-#: audio/fmopl.cpp:51
-msgid "DOSBox OPL emulator"
-msgstr "DOSBox OPL emulator"
-
-#: audio/mididrv.cpp:209
-#, c-format
-msgid ""
-"The selected audio device '%s' was not found (e.g. might be turned off or "
-"disconnected)."
-msgstr ""
-"Den valgte lydenhed '%s' blev ikke fundet (kan f.eks være slukket eller "
-"afbrudt)."
-
-#: audio/mididrv.cpp:209 audio/mididrv.cpp:221 audio/mididrv.cpp:257
-#: audio/mididrv.cpp:272
-msgid "Attempting to fall back to the next available device..."
-msgstr "Forsøger at falde tilbage til den næste tilgængelig enhed..."
-
-#: audio/mididrv.cpp:221
-#, c-format
-msgid ""
-"The selected audio device '%s' cannot be used. See log file for more "
-"information."
-msgstr ""
-"Den valgte lydenhed '%s' kan ikke bruges. Se log filen for mere information."
-
-#: audio/mididrv.cpp:257
-#, c-format
-msgid ""
-"The preferred audio device '%s' was not found (e.g. might be turned off or "
-"disconnected)."
-msgstr ""
-"Den foretrukne lydenhed '%s' blev ikke fundet (kan f.eks være slukket eller "
-"afbrudt)."
-
-#: audio/mididrv.cpp:272
-#, c-format
-msgid ""
-"The preferred audio device '%s' cannot be used. See log file for more "
-"information."
-msgstr ""
-"Den foretrukne lydenhed '%s' kan ikke bruges. Se log filen for mere "
-"information."
-
-#: audio/null.h:43
-msgid "No music"
-msgstr "Ingen musik"
-
-#: audio/mods/paula.cpp:189
-msgid "Amiga Audio Emulator"
-msgstr "Amiga lyd emulator"
-
-#: audio/softsynth/adlib.cpp:2284
-msgid "AdLib Emulator"
-msgstr "AdLib emulator"
-
-#: audio/softsynth/appleiigs.cpp:33
-msgid "Apple II GS Emulator (NOT IMPLEMENTED)"
-msgstr "Apple II GS emulator (IKKE IMPLEMENTERET)"
-
-#: audio/softsynth/sid.cpp:1430
-msgid "C64 Audio Emulator"
-msgstr "C64 lyd emulator"
-
-#: audio/softsynth/mt32.cpp:205
-msgid "Initializing MT-32 Emulator"
-msgstr "Initialisere MT-32 emulator"
-
-#: audio/softsynth/mt32.cpp:431
-msgid "MT-32 Emulator"
-msgstr "MT-32 emulator"
-
-#: audio/softsynth/pcspk.cpp:139
-msgid "PC Speaker Emulator"
-msgstr "PC Speaker emulator"
-
-#: audio/softsynth/pcspk.cpp:158
-msgid "IBM PCjr Emulator"
-msgstr "IBM PCjr emulator"
-
-#: backends/keymapper/remap-dialog.cpp:47
-msgid "Keymap:"
-msgstr "Tasteoversigt:"
-
-#: backends/keymapper/remap-dialog.cpp:66
-msgid " (Effective)"
-msgstr " (Aktiv)"
-
-#: backends/keymapper/remap-dialog.cpp:106
-msgid " (Active)"
-msgstr " (Aktiv)"
-
-#: backends/keymapper/remap-dialog.cpp:106
-msgid " (Blocked)"
-msgstr "(Blokeret)"
-
-#: backends/keymapper/remap-dialog.cpp:119
-msgid " (Global)"
-msgstr " (Global)"
-
-#: backends/keymapper/remap-dialog.cpp:127
-msgid " (Game)"
-msgstr " (Spil)"
-
-#: backends/midi/windows.cpp:164
-msgid "Windows MIDI"
-msgstr "Windows MIDI"
-
-#: backends/platform/ds/arm9/source/dsoptions.cpp:57
-msgid "ScummVM Main Menu"
-msgstr "ScummVM Hovedmenu"
-
-#: backends/platform/ds/arm9/source/dsoptions.cpp:63
-msgid "~L~eft handed mode"
-msgstr "~V~enstrehåndstilstand "
-
-#: backends/platform/ds/arm9/source/dsoptions.cpp:64
-msgid "~I~ndy fight controls"
-msgstr "~I~ndy kamp styring"
-
-#: backends/platform/ds/arm9/source/dsoptions.cpp:65
-msgid "Show mouse cursor"
-msgstr "Vis muse markør"
-
-#: backends/platform/ds/arm9/source/dsoptions.cpp:66
-msgid "Snap to edges"
-msgstr "Hæft til hjørner"
-
-#: backends/platform/ds/arm9/source/dsoptions.cpp:68
-msgid "Touch X Offset"
-msgstr "Touch X forskydning"
-
-#: backends/platform/ds/arm9/source/dsoptions.cpp:75
-msgid "Touch Y Offset"
-msgstr "Touch Y forskydning"
-
-#: backends/platform/ds/arm9/source/dsoptions.cpp:87
-msgid "Use laptop trackpad-style cursor control"
-msgstr "Brug bærbar museplade-agtig markør kontrol"
-
-#: backends/platform/ds/arm9/source/dsoptions.cpp:88
-msgid "Tap for left click, double tap right click"
-msgstr "Tryk for venstre klik, dobbelt tryk for højre klik"
-
-#: backends/platform/ds/arm9/source/dsoptions.cpp:90
-msgid "Sensitivity"
-msgstr "Følsomhed"
-
-#: backends/platform/ds/arm9/source/dsoptions.cpp:99
-msgid "Initial top screen scale:"
-msgstr "Skalering af øverste skærm ved opstart:"
-
-#: backends/platform/ds/arm9/source/dsoptions.cpp:105
-msgid "Main screen scaling:"
-msgstr "Hovedskærm skalering"
-
-#: backends/platform/ds/arm9/source/dsoptions.cpp:107
-msgid "Hardware scale (fast, but low quality)"
-msgstr "Hardware skalering (hurtig, men lav kvalitet)"
-
-#: backends/platform/ds/arm9/source/dsoptions.cpp:108
-msgid "Software scale (good quality, but slower)"
-msgstr "Software skalering (god kvalitet, men langsommere)"
-
-#: backends/platform/ds/arm9/source/dsoptions.cpp:109
-msgid "Unscaled (you must scroll left and right)"
-msgstr "Ikke skaleret (du skal rulle til venstre og højre)"
-
-#: backends/platform/ds/arm9/source/dsoptions.cpp:111
-msgid "Brightness:"
-msgstr "Lysstyrke:"
-
-#: backends/platform/ds/arm9/source/dsoptions.cpp:121
-msgid "High quality audio (slower) (reboot)"
-msgstr "Høj lydkvalitet (langsommere) (genstart)"
-
-#: backends/platform/ds/arm9/source/dsoptions.cpp:122
-msgid "Disable power off"
-msgstr "Deaktiver slukning"
-
-#: backends/platform/iphone/osys_events.cpp:300
-msgid "Mouse-click-and-drag mode enabled."
-msgstr "Muse-klik-og-træk tilstand aktiveret."
-
-#: backends/platform/iphone/osys_events.cpp:302
-msgid "Mouse-click-and-drag mode disabled."
-msgstr "Muse-klik-og-træk tilstand deaktiveret."
-
-#: backends/platform/iphone/osys_events.cpp:313
-msgid "Touchpad mode enabled."
-msgstr "Pegeplade tilstand aktiveret."
-
-#: backends/platform/iphone/osys_events.cpp:315
-msgid "Touchpad mode disabled."
-msgstr "Pegeplade tilstand deaktiveret."
-
-#: backends/platform/maemo/maemo.cpp:209
-msgid "Click Mode"
-msgstr "Klik tilstand"
-
-#: backends/platform/maemo/maemo.cpp:215
-#: 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/maemo/maemo.cpp:218
-msgid "Middle Click"
-msgstr "Miderste klik"
-
-#: backends/platform/maemo/maemo.cpp:221
-#: 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"
-
-#: backends/platform/sdl/macosx/appmenu_osx.mm:77
-msgid "Hide ScummVM"
-msgstr "Skjul ScummVM"
-
-#: backends/platform/sdl/macosx/appmenu_osx.mm:82
-msgid "Hide Others"
-msgstr "Skjul andre"
-
-#: backends/platform/sdl/macosx/appmenu_osx.mm:87
-msgid "Show All"
-msgstr "Vis alle"
-
-#: backends/platform/sdl/macosx/appmenu_osx.mm:109
-#: backends/platform/sdl/macosx/appmenu_osx.mm:120
-msgid "Window"
-msgstr "Vindue"
-
-#: backends/platform/sdl/macosx/appmenu_osx.mm:114
-msgid "Minimize"
-msgstr "Minimer"
-
-#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:45
-msgid "Normal (no scaling)"
-msgstr "Normal (ingen skalering)"
-
-#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:64
-msgctxt "lowres"
-msgid "Normal (no scaling)"
-msgstr "Normal (ingen skalering)"
-
-#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2135
-#: backends/graphics/openglsdl/openglsdl-graphics.cpp:537
-msgid "Enabled aspect ratio correction"
-msgstr "Aktivér billedformat korrektion"
-
-#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2141
-#: backends/graphics/openglsdl/openglsdl-graphics.cpp:542
-msgid "Disabled aspect ratio correction"
-msgstr "Deaktivér billedformat korrektion"
-
-#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2196
-msgid "Active graphics filter:"
-msgstr "Aktive grafik filtre:"
-
-#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2238
-#: backends/graphics/openglsdl/openglsdl-graphics.cpp:481
-msgid "Windowed mode"
-msgstr "Vindue tilstand"
-
-#: backends/graphics/opengl/opengl-graphics.cpp:135
-msgid "OpenGL Normal"
-msgstr "OpenGL Normal"
-
-#: backends/graphics/opengl/opengl-graphics.cpp:136
-msgid "OpenGL Conserve"
-msgstr "OpenGL Bevar"
-
-#: backends/graphics/opengl/opengl-graphics.cpp:137
-msgid "OpenGL Original"
-msgstr "OpenGL Original"
-
-#: backends/graphics/openglsdl/openglsdl-graphics.cpp:415
-msgid "Current display mode"
-msgstr "Aktuel videotilstand"
-
-#: backends/graphics/openglsdl/openglsdl-graphics.cpp:428
-msgid "Current scale"
-msgstr "Aktuel skalering"
-
-#: backends/graphics/openglsdl/openglsdl-graphics.cpp:562
-msgid "Active filter mode: Linear"
-msgstr "Aktiv filter tilstand: Linær"
-
-#: backends/graphics/openglsdl/openglsdl-graphics.cpp:564
-msgid "Active filter mode: Nearest"
-msgstr "Aktiv filter tilstand: Nærmest"
-
-#: backends/platform/symbian/src/SymbianActions.cpp:38
-#: backends/platform/wince/CEActionsSmartphone.cpp:39
-msgid "Up"
-msgstr "Op"
-
-#: backends/platform/symbian/src/SymbianActions.cpp:39
-#: backends/platform/wince/CEActionsSmartphone.cpp:40
-msgid "Down"
-msgstr "Ned"
-
-#: backends/platform/symbian/src/SymbianActions.cpp:40
-#: backends/platform/wince/CEActionsSmartphone.cpp:41
-msgid "Left"
-msgstr "Venstre"
-
-#: backends/platform/symbian/src/SymbianActions.cpp:41
-#: backends/platform/wince/CEActionsSmartphone.cpp:42
-msgid "Right"
-msgstr "Højre"
-
-#: backends/platform/symbian/src/SymbianActions.cpp:46
-#: backends/platform/wince/CEActionsSmartphone.cpp:47
-msgid "Zone"
-msgstr "Zone"
-
-#: backends/platform/symbian/src/SymbianActions.cpp:47
-#: backends/platform/wince/CEActionsPocket.cpp:54
-#: backends/platform/wince/CEActionsSmartphone.cpp:48
-msgid "Multi Function"
-msgstr "Multi funktion"
-
-#: backends/platform/symbian/src/SymbianActions.cpp:48
-msgid "Swap character"
-msgstr "Skift person"
-
-#: backends/platform/symbian/src/SymbianActions.cpp:49
-msgid "Skip text"
-msgstr "Spring tekst over"
-
-#: backends/platform/symbian/src/SymbianActions.cpp:51
-msgid "Fast mode"
-msgstr "Hurtig tilstand"
-
-#: backends/platform/symbian/src/SymbianActions.cpp:53
-msgid "Debugger"
-msgstr "Fejlsøger"
-
-#: backends/platform/symbian/src/SymbianActions.cpp:54
-msgid "Global menu"
-msgstr "Global menu"
-
-#: backends/platform/symbian/src/SymbianActions.cpp:55
-msgid "Virtual keyboard"
-msgstr "Virtuelt tastatur"
-
-#: backends/platform/symbian/src/SymbianActions.cpp:56
-msgid "Key mapper"
-msgstr "Tastetildeling"
-
-#: backends/events/symbiansdl/symbiansdl-events.cpp:184
-msgid "Do you want to quit ?"
-msgstr "Vil du afslutte?"
-
-#: backends/platform/wii/options.cpp:51
-msgid "Video"
-msgstr "Video"
-
-#: backends/platform/wii/options.cpp:54
-msgid "Current video mode:"
-msgstr "Aktuel videotilstand:"
-
-#: backends/platform/wii/options.cpp:56
-msgid "Double-strike"
-msgstr "Double-strike (ikke-interlaced)"
-
-#: backends/platform/wii/options.cpp:60
-msgid "Horizontal underscan:"
-msgstr "Vandret underskan:"
-
-#: backends/platform/wii/options.cpp:66
-msgid "Vertical underscan:"
-msgstr "Lodret underskan:"
-
-#: backends/platform/wii/options.cpp:71
-msgid "Input"
-msgstr "Input"
-
-#: backends/platform/wii/options.cpp:74
-msgid "GC Pad sensitivity:"
-msgstr "GC Pad følsomhed:"
-
-#: backends/platform/wii/options.cpp:80
-msgid "GC Pad acceleration:"
-msgstr "GC Pad acceleration:"
-
-#: backends/platform/wii/options.cpp:86
-msgid "DVD"
-msgstr "DVD"
-
-#: backends/platform/wii/options.cpp:89 backends/platform/wii/options.cpp:101
-msgid "Status:"
-msgstr "Status:"
-
-#: backends/platform/wii/options.cpp:90 backends/platform/wii/options.cpp:102
-msgid "Unknown"
-msgstr "Ukendt"
-
-#: backends/platform/wii/options.cpp:93
-msgid "Mount DVD"
-msgstr "Montere DVD"
-
-#: backends/platform/wii/options.cpp:94
-msgid "Unmount DVD"
-msgstr "Afmontere DVD"
-
-#: backends/platform/wii/options.cpp:98
-msgid "SMB"
-msgstr "SMB"
-
-#: backends/platform/wii/options.cpp:106
-msgid "Server:"
-msgstr "Server:"
-
-#: backends/platform/wii/options.cpp:110
-msgid "Share:"
-msgstr "Mappe:"
-
-#: backends/platform/wii/options.cpp:114
-msgid "Username:"
-msgstr "Bruger:"
-
-#: backends/platform/wii/options.cpp:118
-msgid "Password:"
-msgstr "Kodeord:"
-
-#: backends/platform/wii/options.cpp:121
-msgid "Init network"
-msgstr "Init netværk"
-
-#: backends/platform/wii/options.cpp:123
-msgid "Mount SMB"
-msgstr "Montere SMB"
-
-#: backends/platform/wii/options.cpp:124
-msgid "Unmount SMB"
-msgstr "Afmonterer SMB"
-
-#: backends/platform/wii/options.cpp:143
-msgid "DVD Mounted successfully"
-msgstr "DVD montering lykkedes"
-
-#: backends/platform/wii/options.cpp:146
-msgid "Error while mounting the DVD"
-msgstr "Fejl ved montering af DVD"
-
-#: backends/platform/wii/options.cpp:148
-msgid "DVD not mounted"
-msgstr "DVD ikke monteret"
-
-#: backends/platform/wii/options.cpp:161
-msgid "Network up, share mounted"
-msgstr "Netværk oppe, delt mappe monteret"
-
-#: backends/platform/wii/options.cpp:163
-msgid "Network up"
-msgstr "Netværk oppe"
-
-#: backends/platform/wii/options.cpp:166
-msgid ", error while mounting the share"
-msgstr ", fejl imens montering af delt mappe"
-
-#: backends/platform/wii/options.cpp:168
-msgid ", share not mounted"
-msgstr ", delt mappe ikke monteret"
-
-#: backends/platform/wii/options.cpp:174
-msgid "Network down"
-msgstr "Netværk nede"
-
-#: backends/platform/wii/options.cpp:178
-msgid "Initializing network"
-msgstr "Initialisere netværk"
-
-#: backends/platform/wii/options.cpp:182
-msgid "Timeout while initializing network"
-msgstr "Tidsgrænse nået ved initialisering af netværk"
-
-#: backends/platform/wii/options.cpp:186
-#, c-format
-msgid "Network not initialized (%d)"
-msgstr "Netværk ikke initialiseret (%d)"
-
-#: backends/platform/wince/CEActionsPocket.cpp:46
-msgid "Hide Toolbar"
-msgstr "Skjul værktøjslinje"
-
-#: backends/platform/wince/CEActionsPocket.cpp:47
-msgid "Show Keyboard"
-msgstr "Vis tastatur"
-
-#: backends/platform/wince/CEActionsPocket.cpp:48
-msgid "Sound on/off"
-msgstr "Lyd til/fra"
-
-#: backends/platform/wince/CEActionsPocket.cpp:49
-msgid "Right click"
-msgstr "Højre klik"
-
-#: backends/platform/wince/CEActionsPocket.cpp:50
-msgid "Show/Hide Cursor"
-msgstr "Vis/skjul markør"
-
-#: backends/platform/wince/CEActionsPocket.cpp:51
-msgid "Free look"
-msgstr "Fri udsigt"
-
-#: backends/platform/wince/CEActionsPocket.cpp:52
-msgid "Zoom up"
-msgstr "Formindsk"
-
-#: backends/platform/wince/CEActionsPocket.cpp:53
-msgid "Zoom down"
-msgstr "Forstør"
-
-#: backends/platform/wince/CEActionsPocket.cpp:55
-#: backends/platform/wince/CEActionsSmartphone.cpp:49
-msgid "Bind Keys"
-msgstr "Tildel taster"
-
-#: backends/platform/wince/CEActionsPocket.cpp:56
-msgid "Cursor Up"
-msgstr "Pil op"
-
-#: backends/platform/wince/CEActionsPocket.cpp:57
-msgid "Cursor Down"
-msgstr "Pil ned"
-
-#: backends/platform/wince/CEActionsPocket.cpp:58
-msgid "Cursor Left"
-msgstr "Pil til venstre"
-
-#: backends/platform/wince/CEActionsPocket.cpp:59
-msgid "Cursor Right"
-msgstr "Pil til højre"
-
-#: 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 indlæse eller gemme spillet?"
-
-#: 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? "
-
-#: backends/platform/wince/CEActionsSmartphone.cpp:50
-msgid "Keyboard"
-msgstr "Tastatur"
-
-#: backends/platform/wince/CEActionsSmartphone.cpp:51
-msgid "Rotate"
-msgstr "Drej"
-
-#: backends/platform/wince/CELauncherDialog.cpp:56
-msgid "Using SDL driver "
-msgstr "Brug SDL driver"
-
-#: backends/platform/wince/CELauncherDialog.cpp:60
-msgid "Display "
-msgstr "Vis"
-
-#: 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:515
-msgid "Map right click action"
-msgstr "Tildel højreklikshandling"
-
-#: 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:528
-msgid "Map hide toolbar action"
-msgstr "Tildel \"skjul værktøjslinje\" handling"
-
-#: 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:541
-msgid "Map Zoom Up action (optional)"
-msgstr "Tildel Formindsk handling (valgfri)"
-
-#: 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:552
-msgid ""
-"Don't forget to map a key to 'Hide Toolbar' action to see the whole inventory"
-msgstr ""
-"Glem ikke at tildele en tast til 'Skjul værktøjslinje' handling for at se "
-"hele oversigten"
-
-#: backends/events/default/default-events.cpp:193
-msgid "Do you really want to return to the Launcher?"
-msgstr "Vil du virkelig gå tilbage til oversigten?"
-
-#: backends/events/default/default-events.cpp:193
-msgid "Launcher"
-msgstr "Oversigt"
-
-#: backends/events/default/default-events.cpp:215
-msgid "Do you really want to quit?"
-msgstr "Vil du virkelig afslutte?"
-
-#: backends/events/gph/gph-events.cpp:386
-#: backends/events/gph/gph-events.cpp:429
-#: backends/events/openpandora/op-events.cpp:168
-msgid "Touchscreen 'Tap Mode' - Left Click"
-msgstr "Touchscreen 'Tap Mode' - Venstre Klik"
-
-#: backends/events/gph/gph-events.cpp:388
-#: backends/events/gph/gph-events.cpp:431
-#: backends/events/openpandora/op-events.cpp:170
-msgid "Touchscreen 'Tap Mode' - Right Click"
-msgstr "Touchscreen 'Tap Mode' - Højre Klik"
-
-#: backends/events/gph/gph-events.cpp:390
-#: backends/events/gph/gph-events.cpp:433
-#: backends/events/openpandora/op-events.cpp:172
-msgid "Touchscreen 'Tap Mode' - Hover (No Click)"
-msgstr "Touchscreen 'Tap Mode' - Henover (Ingen Klik)"
-
-#: backends/events/gph/gph-events.cpp:410
-msgid "Maximum Volume"
-msgstr "Maximal lydstyrke"
+#~ msgctxt "lowres"
+#~ msgid "Mass Add..."
+#~ msgstr "Tilføj flere..."
-#: backends/events/gph/gph-events.cpp:412
-msgid "Increasing Volume"
-msgstr "Hæver lydstyrke"
+#~ msgid "Mass Add..."
+#~ msgstr "Tilføj flere..."
-#: backends/events/gph/gph-events.cpp:418
-msgid "Minimal Volume"
-msgstr "Minimal lydstyrke"
+#~ msgid ""
+#~ "Turns off General MIDI mapping for games with Roland MT-32 soundtrack"
+#~ msgstr "Sluk for Generel MIDI kortlægning for spil med Roland MT-32 lydspor"
-#: backends/events/gph/gph-events.cpp:420
-msgid "Decreasing Volume"
-msgstr "Sænker lydstyrke"
+#~ msgid "Standard (16bpp)"
+#~ msgstr "Standard (16bpp)"
-#: backends/events/openpandora/op-events.cpp:174
-msgid "Touchscreen 'Tap Mode' - Hover (DPad Clicks)"
-msgstr "Touchscreen 'Tap Mode' - Henover (DPad Klik)"
+#~ msgid "Alternative intro"
+#~ msgstr "Alternativ intro"
-#: backends/updates/macosx/macosx-updates.mm:67
-msgid "Check for Updates..."
-msgstr "Søg efter opdateringer..."
+#~ msgid "Use an alternative game intro (CD version only)"
+#~ msgstr "Brug en alternativ spil intro (kun CD version)"
-#: backends/platform/bada/form.cpp:269
-msgid "Right Click Once"
-msgstr "Enkelt højre klik"
+#~ msgid "MPEG2 cutscenes are no longer supported"
+#~ msgstr "MPEG2 filmsekvenser understøttes ikke længere"
-#: backends/platform/bada/form.cpp:277
-msgid "Move Only"
-msgstr "Flyt kun"
+#~ msgid "OpenGL Normal"
+#~ msgstr "OpenGL Normal"
-#: backends/platform/bada/form.cpp:291
-msgid "Escape Key"
-msgstr "Escape tast"
+#~ msgid "OpenGL Conserve"
+#~ msgstr "OpenGL Bevar"
-#: backends/platform/bada/form.cpp:296
-msgid "Game Menu"
-msgstr "Spil menu"
+#~ msgid "OpenGL Original"
+#~ msgstr "OpenGL Original"
-#: backends/platform/bada/form.cpp:301
-msgid "Show Keypad"
-msgstr "Vis tastatur"
+#~ msgid "Current display mode"
+#~ msgstr "Aktuel videotilstand"
-#: backends/platform/bada/form.cpp:309
-msgid "Control Mouse"
-msgstr "Kontrollér mus"
+#~ msgid "Current scale"
+#~ msgstr "Aktuel skalering"
-#: backends/events/maemosdl/maemosdl-events.cpp:192
-msgid "Clicking Enabled"
-msgstr "Klik aktiveret"
+#~ msgid "Active filter mode: Linear"
+#~ msgstr "Aktiv filter tilstand: Linær"
-#: backends/events/maemosdl/maemosdl-events.cpp:192
-msgid "Clicking Disabled"
-msgstr "Klik deaktiveret"
+#~ msgid "Active filter mode: Nearest"
+#~ msgstr "Aktiv filter tilstand: Nærmest"
#~ msgid "Enable Roland GS Mode"
#~ msgstr "Aktivér Roland GS tilstand"
diff --git a/po/de_DE.po b/po/de_DE.po
index fac3c1f103..44bd5fc382 100644
--- a/po/de_DE.po
+++ b/po/de_DE.po
@@ -1,5 +1,5 @@
# German translation for ScummVM.
-# Copyright (C) 2010-2013 ScummVM Team
+# Copyright (C) 2010-2014 ScummVM Team
# This file is distributed under the same license as the ScummVM package.
# Simon Sawatzki <SimSaw@gmx.de>, Lothar Serra Mari, 2013.
#
@@ -7,88 +7,87 @@ msgid ""
msgstr ""
"Project-Id-Version: ScummVM 1.5.0git\n"
"Report-Msgid-Bugs-To: scummvm-devel@lists.sf.net\n"
-"POT-Creation-Date: 2013-04-24 13:35+0100\n"
+"POT-Creation-Date: 2014-06-07 23:06+0100\n"
"PO-Revision-Date: 2013-04-24 22:01+0100\n"
"Last-Translator: Simon Sawatzki <SimSaw@gmx.de>\n"
-"Language-Team: Simon Sawatzki <SimSaw@gmx.de>, Lothar Serra Mari "
-"(retired)\n"
+"Language-Team: Simon Sawatzki <SimSaw@gmx.de>, Lothar Serra Mari (retired)\n"
"Language: Deutsch\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=iso-8859-1\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=n != 1;\n"
-#: gui/about.cpp:93
+#: gui/about.cpp:94
#, c-format
msgid "(built on %s)"
msgstr "(erstellt am %s)"
-#: gui/about.cpp:100
+#: gui/about.cpp:101
msgid "Features compiled in:"
msgstr "Verwendete Funktionen:"
-#: gui/about.cpp:109
+#: gui/about.cpp:110
msgid "Available engines:"
msgstr "Verfügbare Spiele-Engines:"
-#: gui/browser.cpp:67
+#: gui/browser.cpp:68
msgid "Show hidden files"
msgstr "Versteckte Dateien anzeigen"
-#: gui/browser.cpp:67
+#: gui/browser.cpp:68
msgid "Show files marked with the hidden attribute"
msgstr "Dateien mit Versteckt-Attribut anzeigen"
-#: gui/browser.cpp:71
+#: gui/browser.cpp:72
msgid "Go up"
msgstr "Pfad hoch"
-#: gui/browser.cpp:71 gui/browser.cpp:73
+#: gui/browser.cpp:72 gui/browser.cpp:74
msgid "Go to previous directory level"
msgstr "Zu höherer Pfadebene wechseln"
-#: gui/browser.cpp:73
+#: gui/browser.cpp:74
msgctxt "lowres"
msgid "Go up"
msgstr "Pfad hoch"
-#: gui/browser.cpp:74 gui/chooser.cpp:45 gui/KeysDialog.cpp:43
-#: gui/launcher.cpp:345 gui/massadd.cpp:94 gui/options.cpp:1238
-#: gui/saveload-dialog.cpp:215 gui/saveload-dialog.cpp:275
-#: gui/saveload-dialog.cpp:545 gui/saveload-dialog.cpp:919
-#: gui/themebrowser.cpp:54 gui/fluidsynth-dialog.cpp:151
-#: engines/engine.cpp:447 engines/drascula/saveload.cpp:51
-#: engines/scumm/dialogs.cpp:190 engines/sword1/control.cpp:865
-#: engines/parallaction/saveload.cpp:274 backends/platform/wii/options.cpp:48
-#: backends/events/default/default-events.cpp:193
-#: backends/events/default/default-events.cpp:215
+#: gui/browser.cpp:75 gui/chooser.cpp:46 gui/KeysDialog.cpp:43
+#: gui/launcher.cpp:351 gui/massadd.cpp:95 gui/options.cpp:1239
+#: gui/saveload-dialog.cpp:216 gui/saveload-dialog.cpp:276
+#: gui/saveload-dialog.cpp:547 gui/saveload-dialog.cpp:922
+#: gui/themebrowser.cpp:55 gui/fluidsynth-dialog.cpp:152
+#: engines/engine.cpp:452 backends/platform/wii/options.cpp:48
+#: backends/events/default/default-events.cpp:196
+#: backends/events/default/default-events.cpp:218
+#: engines/drascula/saveload.cpp:49 engines/parallaction/saveload.cpp:274
+#: engines/scumm/dialogs.cpp:191 engines/sword1/control.cpp:865
msgid "Cancel"
msgstr "Abbrechen"
-#: gui/browser.cpp:75 gui/chooser.cpp:46 gui/themebrowser.cpp:55
+#: gui/browser.cpp:76 gui/chooser.cpp:47 gui/themebrowser.cpp:56
msgid "Choose"
msgstr "Auswählen"
-#: gui/gui-manager.cpp:115 engines/scumm/help.cpp:125
-#: engines/scumm/help.cpp:140 engines/scumm/help.cpp:165
-#: engines/scumm/help.cpp:191 engines/scumm/help.cpp:209
-#: backends/keymapper/remap-dialog.cpp:52
+#: gui/gui-manager.cpp:117 backends/keymapper/remap-dialog.cpp:53
+#: engines/scumm/help.cpp:125 engines/scumm/help.cpp:140
+#: engines/scumm/help.cpp:165 engines/scumm/help.cpp:191
+#: engines/scumm/help.cpp:209
msgid "Close"
msgstr "Schließen"
-#: gui/gui-manager.cpp:118
+#: gui/gui-manager.cpp:120
msgid "Mouse click"
msgstr "Mausklick"
-#: gui/gui-manager.cpp:122 base/main.cpp:301
+#: gui/gui-manager.cpp:124 base/main.cpp:319
msgid "Display keyboard"
msgstr "Tastatur anzeigen"
-#: gui/gui-manager.cpp:126 base/main.cpp:305
+#: gui/gui-manager.cpp:128 base/main.cpp:323
msgid "Remap keys"
msgstr "Tasten neu zuweisen"
-#: gui/gui-manager.cpp:129 base/main.cpp:308
+#: gui/gui-manager.cpp:131 base/main.cpp:326
msgid "Toggle FullScreen"
msgstr "Vollbild EIN/AUS"
@@ -100,21 +99,21 @@ msgstr "Eine Aktion zum Zuweisen auswählen"
msgid "Map"
msgstr "Zuweisen"
-#: gui/KeysDialog.cpp:42 gui/launcher.cpp:346 gui/launcher.cpp:1001
-#: gui/launcher.cpp:1005 gui/massadd.cpp:91 gui/options.cpp:1239
-#: gui/saveload-dialog.cpp:920 gui/fluidsynth-dialog.cpp:152
-#: engines/engine.cpp:366 engines/engine.cpp:377
-#: engines/drascula/saveload.cpp:51 engines/scumm/dialogs.cpp:192
-#: engines/scumm/scumm.cpp:1778 engines/agos/animation.cpp:558
-#: engines/groovie/script.cpp:420 engines/sky/compact.cpp:131
-#: engines/sky/compact.cpp:141 engines/sword1/animation.cpp:519
-#: engines/sword1/animation.cpp:540 engines/sword1/animation.cpp:550
-#: engines/sword1/animation.cpp:557 engines/sword1/control.cpp:865
-#: engines/sword1/logic.cpp:1633 engines/sword2/animation.cpp:419
-#: engines/sword2/animation.cpp:439 engines/sword2/animation.cpp:449
-#: engines/sword2/animation.cpp:458 engines/parallaction/saveload.cpp:274
+#: gui/KeysDialog.cpp:42 gui/launcher.cpp:352 gui/launcher.cpp:1048
+#: gui/launcher.cpp:1052 gui/massadd.cpp:92 gui/options.cpp:1240
+#: gui/saveload-dialog.cpp:923 gui/fluidsynth-dialog.cpp:153
+#: engines/engine.cpp:371 engines/engine.cpp:382
#: backends/platform/wii/options.cpp:47
#: backends/platform/wince/CELauncherDialog.cpp:54
+#: engines/agos/animation.cpp:558 engines/drascula/saveload.cpp:49
+#: engines/groovie/script.cpp:399 engines/parallaction/saveload.cpp:274
+#: engines/scumm/dialogs.cpp:193 engines/scumm/scumm.cpp:1779
+#: engines/sky/compact.cpp:131 engines/sky/compact.cpp:141
+#: engines/sword1/animation.cpp:524 engines/sword1/animation.cpp:545
+#: engines/sword1/animation.cpp:561 engines/sword1/animation.cpp:569
+#: engines/sword1/control.cpp:865 engines/sword1/logic.cpp:1633
+#: engines/sword2/animation.cpp:425 engines/sword2/animation.cpp:445
+#: engines/sword2/animation.cpp:461 engines/sword2/animation.cpp:471
msgid "OK"
msgstr "OK"
@@ -140,15 +139,15 @@ msgstr "Bitte eine Aktion auswählen"
msgid "Press the key to associate"
msgstr "Taste drücken, um sie zuzuweisen"
-#: gui/launcher.cpp:187
+#: gui/launcher.cpp:193
msgid "Game"
msgstr "Spiel"
-#: gui/launcher.cpp:191
+#: gui/launcher.cpp:197
msgid "ID:"
msgstr "Kennung:"
-#: gui/launcher.cpp:191 gui/launcher.cpp:193 gui/launcher.cpp:194
+#: gui/launcher.cpp:197 gui/launcher.cpp:199 gui/launcher.cpp:200
msgid ""
"Short game identifier used for referring to savegames and running the game "
"from the command line"
@@ -156,29 +155,29 @@ msgstr ""
"Kurzer Spielname, um die Spielstände zuzuordnen und das Spiel von der "
"Kommandozeile aus starten zu können"
-#: gui/launcher.cpp:193
+#: gui/launcher.cpp:199
msgctxt "lowres"
msgid "ID:"
msgstr "ID:"
-#: gui/launcher.cpp:198
+#: gui/launcher.cpp:204
msgid "Name:"
msgstr "Name:"
-#: gui/launcher.cpp:198 gui/launcher.cpp:200 gui/launcher.cpp:201
+#: gui/launcher.cpp:204 gui/launcher.cpp:206 gui/launcher.cpp:207
msgid "Full title of the game"
msgstr "Voller Name des Spiels"
-#: gui/launcher.cpp:200
+#: gui/launcher.cpp:206
msgctxt "lowres"
msgid "Name:"
msgstr "Name:"
-#: gui/launcher.cpp:204
+#: gui/launcher.cpp:210
msgid "Language:"
msgstr "Sprache:"
-#: gui/launcher.cpp:204 gui/launcher.cpp:205
+#: gui/launcher.cpp:210 gui/launcher.cpp:211
msgid ""
"Language of the game. This will not turn your Spanish game version into "
"English"
@@ -186,288 +185,289 @@ msgstr ""
"Sprache des Spiels. Diese Funktion wird nicht eine spanische Version des "
"Spiels in eine deutsche verwandeln."
-#: gui/launcher.cpp:206 gui/launcher.cpp:220 gui/options.cpp:86
-#: gui/options.cpp:736 gui/options.cpp:749 gui/options.cpp:1209
-#: audio/null.cpp:40
+#: gui/launcher.cpp:212 gui/launcher.cpp:226 gui/options.cpp:87
+#: gui/options.cpp:737 gui/options.cpp:750 gui/options.cpp:1210
+#: audio/null.cpp:41
msgid "<default>"
msgstr "<Standard>"
-#: gui/launcher.cpp:216
+#: gui/launcher.cpp:222
msgid "Platform:"
msgstr "Plattform:"
-#: gui/launcher.cpp:216 gui/launcher.cpp:218 gui/launcher.cpp:219
+#: gui/launcher.cpp:222 gui/launcher.cpp:224 gui/launcher.cpp:225
msgid "Platform the game was originally designed for"
msgstr "Plattform, für die das Spiel ursprünglich erstellt wurde"
-#: gui/launcher.cpp:218
+#: gui/launcher.cpp:224
msgctxt "lowres"
msgid "Platform:"
msgstr "Plattform:"
-#: gui/launcher.cpp:231
+#: gui/launcher.cpp:237
msgid "Engine"
msgstr "Engine"
-#: gui/launcher.cpp:239 gui/options.cpp:1072 gui/options.cpp:1089
+#: gui/launcher.cpp:245 gui/options.cpp:1073 gui/options.cpp:1090
msgid "Graphics"
msgstr "Grafik"
-#: gui/launcher.cpp:239 gui/options.cpp:1072 gui/options.cpp:1089
+#: gui/launcher.cpp:245 gui/options.cpp:1073 gui/options.cpp:1090
msgid "GFX"
msgstr "GFX"
-#: gui/launcher.cpp:242
+#: gui/launcher.cpp:248
msgid "Override global graphic settings"
msgstr "Globale Grafikeinstellungen übergehen"
-#: gui/launcher.cpp:244
+#: gui/launcher.cpp:250
msgctxt "lowres"
msgid "Override global graphic settings"
msgstr "Globale Grafikeinstellungen übergehen"
-#: gui/launcher.cpp:251 gui/options.cpp:1095
+#: gui/launcher.cpp:257 gui/options.cpp:1096
msgid "Audio"
msgstr "Audio"
-#: gui/launcher.cpp:254
+#: gui/launcher.cpp:260
msgid "Override global audio settings"
msgstr "Globale Audioeinstellungen übergehen"
-#: gui/launcher.cpp:256
+#: gui/launcher.cpp:262
msgctxt "lowres"
msgid "Override global audio settings"
msgstr "Globale Audioeinstellungen übergehen"
-#: gui/launcher.cpp:265 gui/options.cpp:1100
+#: gui/launcher.cpp:271 gui/options.cpp:1101
msgid "Volume"
msgstr "Lautstärke"
-#: gui/launcher.cpp:267 gui/options.cpp:1102
+#: gui/launcher.cpp:273 gui/options.cpp:1103
msgctxt "lowres"
msgid "Volume"
msgstr "Lautst."
-#: gui/launcher.cpp:270
+#: gui/launcher.cpp:276
msgid "Override global volume settings"
msgstr "Globale Lautstärke-Einstellungen übergehen"
-#: gui/launcher.cpp:272
+#: gui/launcher.cpp:278
msgctxt "lowres"
msgid "Override global volume settings"
msgstr "Globale Lautstärkeeinstellungen übergehen"
-#: gui/launcher.cpp:280 gui/options.cpp:1110
+#: gui/launcher.cpp:286 gui/options.cpp:1111
msgid "MIDI"
msgstr "MIDI"
-#: gui/launcher.cpp:283
+#: gui/launcher.cpp:289
msgid "Override global MIDI settings"
msgstr "Globale MIDI-Einstellungen übergehen"
-#: gui/launcher.cpp:285
+#: gui/launcher.cpp:291
msgctxt "lowres"
msgid "Override global MIDI settings"
msgstr "Globale MIDI-Einstellungen übergehen"
-#: gui/launcher.cpp:294 gui/options.cpp:1116
+#: gui/launcher.cpp:300 gui/options.cpp:1117
msgid "MT-32"
msgstr "MT-32"
-#: gui/launcher.cpp:297
+#: gui/launcher.cpp:303
msgid "Override global MT-32 settings"
msgstr "Globale MT-32-Einstellungen übergehen"
-#: gui/launcher.cpp:299
+#: gui/launcher.cpp:305
msgctxt "lowres"
msgid "Override global MT-32 settings"
msgstr "Globale MT-32-Einstellungen übergehen"
-#: gui/launcher.cpp:308 gui/options.cpp:1123
+#: gui/launcher.cpp:314 gui/options.cpp:1124
msgid "Paths"
msgstr "Pfade"
-#: gui/launcher.cpp:310 gui/options.cpp:1125
+#: gui/launcher.cpp:316 gui/options.cpp:1126
msgctxt "lowres"
msgid "Paths"
msgstr "Pfade"
-#: gui/launcher.cpp:317
+#: gui/launcher.cpp:323
msgid "Game Path:"
msgstr "Spielpfad:"
-#: gui/launcher.cpp:319
+#: gui/launcher.cpp:325
msgctxt "lowres"
msgid "Game Path:"
msgstr "Spielpfad:"
-#: gui/launcher.cpp:324 gui/options.cpp:1149
+#: gui/launcher.cpp:330 gui/options.cpp:1150
msgid "Extra Path:"
msgstr "Extrapfad:"
-#: gui/launcher.cpp:324 gui/launcher.cpp:326 gui/launcher.cpp:327
+#: gui/launcher.cpp:330 gui/launcher.cpp:332 gui/launcher.cpp:333
msgid "Specifies path to additional data used the game"
msgstr "Legt das Verzeichnis für zusätzliche Spieldateien fest."
-#: gui/launcher.cpp:326 gui/options.cpp:1151
+#: gui/launcher.cpp:332 gui/options.cpp:1152
msgctxt "lowres"
msgid "Extra Path:"
msgstr "Extrapfad:"
-#: gui/launcher.cpp:333 gui/options.cpp:1133
+#: gui/launcher.cpp:339 gui/options.cpp:1134
msgid "Save Path:"
msgstr "Spielstände:"
-#: gui/launcher.cpp:333 gui/launcher.cpp:335 gui/launcher.cpp:336
-#: gui/options.cpp:1133 gui/options.cpp:1135 gui/options.cpp:1136
+#: gui/launcher.cpp:339 gui/launcher.cpp:341 gui/launcher.cpp:342
+#: gui/options.cpp:1134 gui/options.cpp:1136 gui/options.cpp:1137
msgid "Specifies where your savegames are put"
msgstr "Legt fest, wo die Spielstände abgelegt werden."
-#: gui/launcher.cpp:335 gui/options.cpp:1135
+#: gui/launcher.cpp:341 gui/options.cpp:1136
msgctxt "lowres"
msgid "Save Path:"
msgstr "Speichern:"
-#: gui/launcher.cpp:354 gui/launcher.cpp:453 gui/launcher.cpp:511
-#: gui/launcher.cpp:565 gui/options.cpp:1144 gui/options.cpp:1152
-#: gui/options.cpp:1161 gui/options.cpp:1276 gui/options.cpp:1282
-#: gui/options.cpp:1290 gui/options.cpp:1320 gui/options.cpp:1326
-#: gui/options.cpp:1333 gui/options.cpp:1426 gui/options.cpp:1429
-#: gui/options.cpp:1441
+#: gui/launcher.cpp:360 gui/launcher.cpp:459 gui/launcher.cpp:517
+#: gui/launcher.cpp:571 gui/options.cpp:1145 gui/options.cpp:1153
+#: gui/options.cpp:1162 gui/options.cpp:1277 gui/options.cpp:1283
+#: gui/options.cpp:1291 gui/options.cpp:1321 gui/options.cpp:1327
+#: gui/options.cpp:1334 gui/options.cpp:1427 gui/options.cpp:1430
+#: gui/options.cpp:1442
msgctxt "path"
msgid "None"
msgstr "Keiner"
-#: gui/launcher.cpp:359 gui/launcher.cpp:459 gui/launcher.cpp:569
-#: gui/options.cpp:1270 gui/options.cpp:1314 gui/options.cpp:1432
+#: gui/launcher.cpp:365 gui/launcher.cpp:465 gui/launcher.cpp:575
+#: gui/options.cpp:1271 gui/options.cpp:1315 gui/options.cpp:1433
#: backends/platform/wii/options.cpp:56
msgid "Default"
msgstr "Standard"
-#: gui/launcher.cpp:504 gui/options.cpp:1435
+#: gui/launcher.cpp:510 gui/options.cpp:1436
msgid "Select SoundFont"
msgstr "SoundFont auswählen"
-#: gui/launcher.cpp:523 gui/launcher.cpp:677
+#: gui/launcher.cpp:529 gui/launcher.cpp:682
msgid "Select directory with game data"
msgstr "Verzeichnis mit Spieldateien auswählen"
-#: gui/launcher.cpp:541
+#: gui/launcher.cpp:547
msgid "Select additional game directory"
msgstr "Verzeichnis mit zusätzlichen Dateien auswählen"
-#: gui/launcher.cpp:553
+#: gui/launcher.cpp:559
msgid "Select directory for saved games"
msgstr "Verzeichnis für Spielstände auswählen"
-#: gui/launcher.cpp:580
+#: gui/launcher.cpp:586
msgid "This game ID is already taken. Please choose another one."
msgstr "Diese Spielkennung ist schon vergeben. Bitte eine andere wählen."
-#: gui/launcher.cpp:621 engines/dialogs.cpp:110
+#: gui/launcher.cpp:626 engines/dialogs.cpp:111
msgid "~Q~uit"
msgstr "~B~eenden"
-#: gui/launcher.cpp:621 backends/platform/sdl/macosx/appmenu_osx.mm:95
+#: gui/launcher.cpp:626 backends/platform/sdl/macosx/appmenu_osx.mm:95
msgid "Quit ScummVM"
msgstr "ScummVM beenden"
-#: gui/launcher.cpp:622
+#: gui/launcher.cpp:627
msgid "A~b~out..."
msgstr "Übe~r~"
-#: gui/launcher.cpp:622 backends/platform/sdl/macosx/appmenu_osx.mm:69
+#: gui/launcher.cpp:627 backends/platform/sdl/macosx/appmenu_osx.mm:69
msgid "About ScummVM"
msgstr "Über ScummVM"
-#: gui/launcher.cpp:623
+#: gui/launcher.cpp:628
msgid "~O~ptions..."
msgstr "~O~ptionen"
-#: gui/launcher.cpp:623
+#: gui/launcher.cpp:628
msgid "Change global ScummVM options"
msgstr "Globale ScummVM-Einstellungen bearbeiten"
-#: gui/launcher.cpp:625
+#: gui/launcher.cpp:630
msgid "~S~tart"
msgstr "~S~tarten"
-#: gui/launcher.cpp:625
+#: gui/launcher.cpp:630
msgid "Start selected game"
msgstr "Ausgewähltes Spiel starten"
-#: gui/launcher.cpp:628
+#: gui/launcher.cpp:633
msgid "~L~oad..."
msgstr "~L~aden..."
-#: gui/launcher.cpp:628
+#: gui/launcher.cpp:633
msgid "Load savegame for selected game"
msgstr "Spielstand für ausgewähltes Spiel laden"
-#: gui/launcher.cpp:633 gui/launcher.cpp:1120
+#: gui/launcher.cpp:638
msgid "~A~dd Game..."
msgstr "Spiel ~h~inzufügen"
-#: gui/launcher.cpp:633 gui/launcher.cpp:640
+#: gui/launcher.cpp:638 gui/launcher.cpp:645
msgid "Hold Shift for Mass Add"
msgstr ""
"Umschalttaste (Shift) gedrückt halten, um Verzeichnisse nach Spielen zu "
"durchsuchen"
-#: gui/launcher.cpp:635
+#: gui/launcher.cpp:640
msgid "~E~dit Game..."
msgstr "Spielo~p~tionen"
-#: gui/launcher.cpp:635 gui/launcher.cpp:642
+#: gui/launcher.cpp:640 gui/launcher.cpp:647
msgid "Change game options"
msgstr "Spieloptionen ändern"
-#: gui/launcher.cpp:637
+#: gui/launcher.cpp:642
msgid "~R~emove Game"
msgstr "Spiel ~e~ntfernen"
-#: gui/launcher.cpp:637 gui/launcher.cpp:644
+#: gui/launcher.cpp:642 gui/launcher.cpp:649
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:640 gui/launcher.cpp:1120
+#: gui/launcher.cpp:645
msgctxt "lowres"
msgid "~A~dd Game..."
msgstr "~H~inzufügen"
-#: gui/launcher.cpp:642
+#: gui/launcher.cpp:647
msgctxt "lowres"
msgid "~E~dit Game..."
msgstr "Spielo~p~tion"
-#: gui/launcher.cpp:644
+#: gui/launcher.cpp:649
msgctxt "lowres"
msgid "~R~emove Game"
msgstr "~E~ntfernen"
-#: gui/launcher.cpp:652
+#: gui/launcher.cpp:657
msgid "Search in game list"
msgstr "In Spieleliste suchen"
-#: gui/launcher.cpp:656 gui/launcher.cpp:1167
+#: gui/launcher.cpp:661 gui/launcher.cpp:1222
msgid "Search:"
msgstr "Suchen:"
-#: gui/launcher.cpp:680 engines/dialogs.cpp:114 engines/mohawk/myst.cpp:245
-#: engines/mohawk/riven.cpp:716 engines/cruise/menu.cpp:214
-#: engines/pegasus/pegasus.cpp:349
+#: gui/launcher.cpp:685 engines/dialogs.cpp:115 engines/cruise/menu.cpp:214
+#: engines/mohawk/myst.cpp:245 engines/mohawk/riven.cpp:718
+#: engines/pegasus/pegasus.cpp:353
msgid "Load game:"
msgstr "Spiel laden:"
-#: gui/launcher.cpp:680 engines/dialogs.cpp:114 engines/scumm/dialogs.cpp:188
-#: engines/mohawk/myst.cpp:245 engines/mohawk/riven.cpp:716
-#: engines/cruise/menu.cpp:214 engines/pegasus/pegasus.cpp:349
+#: gui/launcher.cpp:685 engines/dialogs.cpp:115
#: backends/platform/wince/CEActionsPocket.cpp:267
#: backends/platform/wince/CEActionsSmartphone.cpp:231
+#: engines/cruise/menu.cpp:214 engines/mohawk/myst.cpp:245
+#: engines/mohawk/riven.cpp:718 engines/pegasus/pegasus.cpp:353
+#: engines/scumm/dialogs.cpp:189
msgid "Load"
msgstr "Laden"
-#: gui/launcher.cpp:788
+#: gui/launcher.cpp:792
msgid ""
"Do you really want to run the mass game detector? This could potentially add "
"a huge number of games."
@@ -475,7 +475,8 @@ msgstr ""
"Möchten Sie wirklich den PC nach Spielen durchsuchen? Möglicherweise wird "
"dabei eine größere Menge an Spielen hinzugefügt."
-#: gui/launcher.cpp:789 gui/launcher.cpp:937 gui/fluidsynth-dialog.cpp:216
+#: gui/launcher.cpp:793 gui/launcher.cpp:941 gui/launcher.cpp:1000
+#: gui/fluidsynth-dialog.cpp:217
#: backends/events/symbiansdl/symbiansdl-events.cpp:184
#: backends/platform/wince/CEActionsPocket.cpp:326
#: backends/platform/wince/CEActionsSmartphone.cpp:287
@@ -483,7 +484,8 @@ msgstr ""
msgid "Yes"
msgstr "Ja"
-#: gui/launcher.cpp:789 gui/launcher.cpp:937 gui/fluidsynth-dialog.cpp:216
+#: gui/launcher.cpp:793 gui/launcher.cpp:941 gui/launcher.cpp:1000
+#: gui/fluidsynth-dialog.cpp:217
#: backends/events/symbiansdl/symbiansdl-events.cpp:184
#: backends/platform/wince/CEActionsPocket.cpp:326
#: backends/platform/wince/CEActionsSmartphone.cpp:287
@@ -491,193 +493,188 @@ msgstr "Ja"
msgid "No"
msgstr "Nein"
-#: gui/launcher.cpp:837
+#: gui/launcher.cpp:841
msgid "ScummVM couldn't open the specified directory!"
msgstr "ScummVM konnte das gewählte Verzeichnis nicht öffnen!"
-#: gui/launcher.cpp:849
+#: gui/launcher.cpp:853
msgid "ScummVM could not find any game in the specified directory!"
msgstr "ScummVM konnte im gewählten Verzeichnis kein Spiel finden!"
-#: gui/launcher.cpp:863
+#: gui/launcher.cpp:867
msgid "Pick the game:"
msgstr "Spiel auswählen:"
-#: gui/launcher.cpp:937
+#: gui/launcher.cpp:941
msgid "Do you really want to remove this game configuration?"
msgstr "Möchten Sie wirklich diese Spielkonfiguration entfernen?"
-#: gui/launcher.cpp:1001
+#: gui/launcher.cpp:999
+#, fuzzy
+msgid "Do you want to load savegame?"
+msgstr "Möchten Sie ein Spiel laden oder speichern?"
+
+#: gui/launcher.cpp:1048
msgid "This game does not support loading games from the launcher."
msgstr ""
"Für dieses Spiel wird das Laden aus der Spieleliste heraus nicht unterstützt."
-#: gui/launcher.cpp:1005
+#: gui/launcher.cpp:1052
msgid "ScummVM could not find any engine capable of running the selected game!"
msgstr "ScummVM konnte keine Engine finden, um das Spiel zu starten!"
-#: gui/launcher.cpp:1119
-msgctxt "lowres"
-msgid "Mass Add..."
-msgstr "Durchsuchen"
-
-#: gui/launcher.cpp:1119
-msgid "Mass Add..."
-msgstr "Durchsuchen"
-
-#: gui/massadd.cpp:78 gui/massadd.cpp:81
+#: gui/massadd.cpp:79 gui/massadd.cpp:82
msgid "... progress ..."
msgstr "... läuft..."
-#: gui/massadd.cpp:258
+#: gui/massadd.cpp:259
msgid "Scan complete!"
msgstr "Suchlauf abgeschlossen!"
-#: gui/massadd.cpp:261
+#: gui/massadd.cpp:262
#, 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:265
+#: gui/massadd.cpp:266
#, c-format
msgid "Scanned %d directories ..."
msgstr "%d Ordner durchsucht..."
-#: gui/massadd.cpp:268
+#: gui/massadd.cpp:269
#, c-format
msgid "Discovered %d new games, ignored %d previously added games ..."
msgstr "%d neue Spiele gefunden, %d bereits hinzugefügte Spiele ignoriert..."
-#: gui/options.cpp:84
+#: gui/options.cpp:85
msgid "Never"
msgstr "Niemals"
-#: gui/options.cpp:84
+#: gui/options.cpp:85
msgid "every 5 mins"
msgstr "alle 5 Minuten"
-#: gui/options.cpp:84
+#: gui/options.cpp:85
msgid "every 10 mins"
msgstr "alle 10 Minuten"
-#: gui/options.cpp:84
+#: gui/options.cpp:85
msgid "every 15 mins"
msgstr "alle 15 Minuten"
-#: gui/options.cpp:84
+#: gui/options.cpp:85
msgid "every 30 mins"
msgstr "alle 30 Minuten"
-#: gui/options.cpp:86
+#: gui/options.cpp:87
msgid "8 kHz"
msgstr "8 kHz"
-#: gui/options.cpp:86
+#: gui/options.cpp:87
msgid "11kHz"
msgstr "11 kHz"
-#: gui/options.cpp:86
+#: gui/options.cpp:87
msgid "22 kHz"
msgstr "22 kHz"
-#: gui/options.cpp:86
+#: gui/options.cpp:87
msgid "44 kHz"
msgstr "44 kHz"
-#: gui/options.cpp:86
+#: gui/options.cpp:87
msgid "48 kHz"
msgstr "48 kHz"
-#: gui/options.cpp:254 gui/options.cpp:480 gui/options.cpp:581
-#: gui/options.cpp:650 gui/options.cpp:858
+#: gui/options.cpp:255 gui/options.cpp:481 gui/options.cpp:582
+#: gui/options.cpp:651 gui/options.cpp:859
msgctxt "soundfont"
msgid "None"
msgstr "-"
-#: gui/options.cpp:388
+#: gui/options.cpp:389
msgid "Failed to apply some of the graphic options changes:"
msgstr "Fehler bei einigen Änderungen in Grafikoptionen:"
-#: gui/options.cpp:400
+#: gui/options.cpp:401
msgid "the video mode could not be changed."
msgstr "Grafikmodus konnte nicht geändert werden."
-#: gui/options.cpp:406
+#: gui/options.cpp:407
msgid "the fullscreen setting could not be changed"
msgstr "Vollbildeinstellung konnte nicht geändert werden."
-#: gui/options.cpp:412
+#: gui/options.cpp:413
msgid "the aspect ratio setting could not be changed"
msgstr ""
"Einstellung für Seitenverhältniskorrektur konnte nicht geändert werden."
-#: gui/options.cpp:733
+#: gui/options.cpp:734
msgid "Graphics mode:"
msgstr "Grafikmodus:"
-#: gui/options.cpp:747
+#: gui/options.cpp:748
msgid "Render mode:"
msgstr "Render-Modus:"
-#: gui/options.cpp:747 gui/options.cpp:748
+#: gui/options.cpp:748 gui/options.cpp:749
msgid "Special dithering modes supported by some games"
msgstr ""
"Spezielle Farbmischungsmethoden werden von manchen Spielen unterstützt."
-#: gui/options.cpp:759
-#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2236
-#: backends/graphics/openglsdl/openglsdl-graphics.cpp:476
+#: gui/options.cpp:760
+#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2249
msgid "Fullscreen mode"
msgstr "Vollbildmodus"
-#: gui/options.cpp:762
+#: gui/options.cpp:763
msgid "Aspect ratio correction"
msgstr "Seitenverhältnis korrigieren"
-#: gui/options.cpp:762
+#: gui/options.cpp:763
msgid "Correct aspect ratio for 320x200 games"
msgstr "Seitenverhältnis für Spiele mit der Auflösung 320x200 korrigieren"
-#: gui/options.cpp:770
+#: gui/options.cpp:771
msgid "Preferred Device:"
msgstr "Standard-Gerät:"
-#: gui/options.cpp:770
+#: gui/options.cpp:771
msgid "Music Device:"
msgstr "Musikgerät:"
-#: gui/options.cpp:770 gui/options.cpp:772
+#: gui/options.cpp:771 gui/options.cpp:773
msgid "Specifies preferred sound device or sound card emulator"
msgstr ""
"Legt das bevorzugte Tonwiedergabe-Gerät oder den Soundkarten-Emulator fest."
-#: gui/options.cpp:770 gui/options.cpp:772 gui/options.cpp:773
+#: gui/options.cpp:771 gui/options.cpp:773 gui/options.cpp:774
msgid "Specifies output sound device or sound card emulator"
msgstr "Legt das Musikwiedergabe-Gerät oder den Soundkarten-Emulator fest."
-#: gui/options.cpp:772
+#: gui/options.cpp:773
msgctxt "lowres"
msgid "Preferred Dev.:"
msgstr "Standard-Gerät:"
-#: gui/options.cpp:772
+#: gui/options.cpp:773
msgctxt "lowres"
msgid "Music Device:"
msgstr "Musikgerät:"
-#: gui/options.cpp:799
+#: gui/options.cpp:800
msgid "AdLib emulator:"
msgstr "AdLib-Emulator"
-#: gui/options.cpp:799 gui/options.cpp:800
+#: gui/options.cpp:800 gui/options.cpp:801
msgid "AdLib is used for music in many games"
msgstr "AdLib wird für die Musik in vielen Spielen verwendet."
-#: gui/options.cpp:810
+#: gui/options.cpp:811
msgid "Output rate:"
msgstr "Ausgabefrequenz:"
-#: gui/options.cpp:810 gui/options.cpp:811
+#: gui/options.cpp:811 gui/options.cpp:812
msgid ""
"Higher value specifies better sound quality but may be not supported by your "
"soundcard"
@@ -685,68 +682,68 @@ msgstr ""
"Höhere Werte bewirken eine bessere Soundqualität, werden aber möglicherweise "
"nicht von jeder Soundkarte unterstützt."
-#: gui/options.cpp:821
+#: gui/options.cpp:822
msgid "GM Device:"
msgstr "GM-Gerät:"
-#: gui/options.cpp:821
+#: gui/options.cpp:822
msgid "Specifies default sound device for General MIDI output"
msgstr ""
"Legt das standardmäßige Musikwiedergabe-Gerät für General-MIDI-Ausgabe fest."
-#: gui/options.cpp:832
+#: gui/options.cpp:833
msgid "Don't use General MIDI music"
msgstr "Keine General-MIDI-Musik"
-#: gui/options.cpp:843 gui/options.cpp:909
+#: gui/options.cpp:844 gui/options.cpp:910
msgid "Use first available device"
msgstr "Erstes verfügbares Gerät"
-#: gui/options.cpp:855
+#: gui/options.cpp:856
msgid "SoundFont:"
msgstr "SoundFont:"
-#: gui/options.cpp:855 gui/options.cpp:857 gui/options.cpp:858
+#: gui/options.cpp:856 gui/options.cpp:858 gui/options.cpp:859
msgid "SoundFont is supported by some audio cards, Fluidsynth and Timidity"
msgstr ""
"SoundFont wird von einigen Soundkarten, Fluidsynth und Timidity unterstützt."
-#: gui/options.cpp:857
+#: gui/options.cpp:858
msgctxt "lowres"
msgid "SoundFont:"
msgstr "SoundFont:"
-#: gui/options.cpp:863
+#: gui/options.cpp:864
msgid "Mixed AdLib/MIDI mode"
msgstr "AdLib-/MIDI-Modus"
-#: gui/options.cpp:863
+#: gui/options.cpp:864
msgid "Use both MIDI and AdLib sound generation"
msgstr "Benutzt MIDI und AdLib zur Sounderzeugung."
-#: gui/options.cpp:866
+#: gui/options.cpp:867
msgid "MIDI gain:"
msgstr "MIDI-Lautstärke:"
-#: gui/options.cpp:873
+#: gui/options.cpp:874
msgid "FluidSynth Settings"
msgstr "FluidSynth-Einstellungen"
-#: gui/options.cpp:880
+#: gui/options.cpp:881
msgid "MT-32 Device:"
msgstr "MT-32-Gerät:"
-#: gui/options.cpp:880
+#: gui/options.cpp:881
msgid "Specifies default sound device for Roland MT-32/LAPC1/CM32l/CM64 output"
msgstr ""
"Legt das standardmäßige Tonwiedergabe-Gerät für die Ausgabe von Roland MT-32/"
"LAPC1/CM32l/CM64 fest."
-#: gui/options.cpp:885
+#: gui/options.cpp:886
msgid "True Roland MT-32 (disable GM emulation)"
msgstr "Echte Roland-MT-32-Emulation (GM-Emulation deaktiviert)"
-#: gui/options.cpp:885 gui/options.cpp:887
+#: gui/options.cpp:886 gui/options.cpp:888
msgid ""
"Check if you want to use your real hardware Roland-compatible sound device "
"connected to your computer"
@@ -754,197 +751,198 @@ msgstr ""
"Wählen Sie dies aus, wenn Sie Ihre echte Hardware, die mit einer Roland-"
"kompatiblen Soundkarte verbunden ist, verwenden möchten."
-#: gui/options.cpp:887
+#: gui/options.cpp:888
msgctxt "lowres"
msgid "True Roland MT-32 (no GM emulation)"
msgstr "Echte Roland-MT-32-Emulation (kein GM)"
-#: gui/options.cpp:890
-msgid "Roland GS Mode (disable GM mapping)"
+#: gui/options.cpp:891
+#, fuzzy
+msgid "Roland GS Device (enable MT-32 mappings)"
msgstr "Roland-GS-Modus (GM-Zuweisung deaktiviert)"
-#: gui/options.cpp:890
-msgid "Turns off General MIDI mapping for games with Roland MT-32 soundtrack"
+#: gui/options.cpp:891
+msgid ""
+"Check if you want to enable patch mappings to emulate an MT-32 on a Roland "
+"GS device"
msgstr ""
-"Schaltet die General-MIDI-Zuweisung für Spiele mit Roland-MT-32-Audiospur "
-"aus."
-#: gui/options.cpp:899
+#: gui/options.cpp:900
msgid "Don't use Roland MT-32 music"
msgstr "Keine Roland-MT-32-Musik"
-#: gui/options.cpp:926
+#: gui/options.cpp:927
msgid "Text and Speech:"
msgstr "Sprache und Text:"
-#: gui/options.cpp:930 gui/options.cpp:940
+#: gui/options.cpp:931 gui/options.cpp:941
msgid "Speech"
msgstr "Sprache"
-#: gui/options.cpp:931 gui/options.cpp:941
+#: gui/options.cpp:932 gui/options.cpp:942
msgid "Subtitles"
msgstr "Untertitel"
-#: gui/options.cpp:932
+#: gui/options.cpp:933
msgid "Both"
msgstr "Beides"
-#: gui/options.cpp:934
+#: gui/options.cpp:935
msgid "Subtitle speed:"
msgstr "Untertitel-Tempo:"
-#: gui/options.cpp:936
+#: gui/options.cpp:937
msgctxt "lowres"
msgid "Text and Speech:"
msgstr "Sprache + Text:"
-#: gui/options.cpp:940
+#: gui/options.cpp:941
msgid "Spch"
msgstr "Spr."
-#: gui/options.cpp:941
+#: gui/options.cpp:942
msgid "Subs"
msgstr "Text"
-#: gui/options.cpp:942
+#: gui/options.cpp:943
msgctxt "lowres"
msgid "Both"
msgstr "S+T"
-#: gui/options.cpp:942
+#: gui/options.cpp:943
msgid "Show subtitles and play speech"
msgstr "Untertitel anzeigen und Sprachausgabe aktivieren"
-#: gui/options.cpp:944
+#: gui/options.cpp:945
msgctxt "lowres"
msgid "Subtitle speed:"
msgstr "Text-Tempo:"
-#: gui/options.cpp:960
+#: gui/options.cpp:961
msgid "Music volume:"
msgstr "Musiklautstärke:"
-#: gui/options.cpp:962
+#: gui/options.cpp:963
msgctxt "lowres"
msgid "Music volume:"
msgstr "Musiklautstärke:"
-#: gui/options.cpp:969
+#: gui/options.cpp:970
msgid "Mute All"
msgstr "Alles aus"
-#: gui/options.cpp:972
+#: gui/options.cpp:973
msgid "SFX volume:"
msgstr "Effektlautstärke:"
-#: gui/options.cpp:972 gui/options.cpp:974 gui/options.cpp:975
+#: gui/options.cpp:973 gui/options.cpp:975 gui/options.cpp:976
msgid "Special sound effects volume"
msgstr "Lautstärke spezieller Soundeffekte"
-#: gui/options.cpp:974
+#: gui/options.cpp:975
msgctxt "lowres"
msgid "SFX volume:"
msgstr "Effektlautst.:"
-#: gui/options.cpp:982
+#: gui/options.cpp:983
msgid "Speech volume:"
msgstr "Sprachlautstärke:"
-#: gui/options.cpp:984
+#: gui/options.cpp:985
msgctxt "lowres"
msgid "Speech volume:"
msgstr "Sprachlautst.:"
-#: gui/options.cpp:1141
+#: gui/options.cpp:1142
msgid "Theme Path:"
msgstr "Themenpfad:"
-#: gui/options.cpp:1143
+#: gui/options.cpp:1144
msgctxt "lowres"
msgid "Theme Path:"
msgstr "Themenpfad:"
-#: gui/options.cpp:1149 gui/options.cpp:1151 gui/options.cpp:1152
+#: gui/options.cpp:1150 gui/options.cpp:1152 gui/options.cpp:1153
msgid "Specifies path to additional data used by all games or ScummVM"
msgstr ""
"Legt das Verzeichnis für zusätzliche Spieldateien für alle Spiele in ScummVM "
"fest."
-#: gui/options.cpp:1158
+#: gui/options.cpp:1159
msgid "Plugins Path:"
msgstr "Plugin-Pfad:"
-#: gui/options.cpp:1160
+#: gui/options.cpp:1161
msgctxt "lowres"
msgid "Plugins Path:"
msgstr "Plugin-Pfad:"
-#: gui/options.cpp:1169 gui/fluidsynth-dialog.cpp:137
+#: gui/options.cpp:1170 gui/fluidsynth-dialog.cpp:138
msgid "Misc"
msgstr "Sonstiges"
-#: gui/options.cpp:1171
+#: gui/options.cpp:1172
msgctxt "lowres"
msgid "Misc"
msgstr "Andere"
-#: gui/options.cpp:1173
+#: gui/options.cpp:1174
msgid "Theme:"
msgstr "Thema:"
-#: gui/options.cpp:1177
+#: gui/options.cpp:1178
msgid "GUI Renderer:"
msgstr "GUI-Renderer:"
-#: gui/options.cpp:1189
+#: gui/options.cpp:1190
msgid "Autosave:"
msgstr "Autom. Speichern:"
-#: gui/options.cpp:1191
+#: gui/options.cpp:1192
msgctxt "lowres"
msgid "Autosave:"
msgstr "Speich.(auto)"
-#: gui/options.cpp:1199
+#: gui/options.cpp:1200
msgid "Keys"
msgstr "Tasten"
-#: gui/options.cpp:1206
+#: gui/options.cpp:1207
msgid "GUI Language:"
msgstr "Sprache:"
-#: gui/options.cpp:1206
+#: gui/options.cpp:1207
msgid "Language of ScummVM GUI"
msgstr "Sprache der ScummVM-Oberfläche"
-#: gui/options.cpp:1365
+#: gui/options.cpp:1366
msgid "You have to restart ScummVM before your changes will take effect."
msgstr "Sie müssen ScummVM neu starten, damit die Änderungen wirksam werden."
-#: gui/options.cpp:1378
+#: gui/options.cpp:1379
msgid "Select directory for savegames"
msgstr "Verzeichnis für Spielstände auswählen"
-#: gui/options.cpp:1385
+#: gui/options.cpp:1386
msgid "The chosen directory cannot be written to. Please select another one."
msgstr ""
"In das gewählte Verzeichnis kann nicht geschrieben werden. Bitte ein anderes "
"auswählen."
-#: gui/options.cpp:1394
+#: gui/options.cpp:1395
msgid "Select directory for GUI themes"
msgstr "Verzeichnis für Oberflächen-Themen"
-#: gui/options.cpp:1404
+#: gui/options.cpp:1405
msgid "Select directory for extra files"
msgstr "Verzeichnis für zusätzliche Dateien auswählen"
-#: gui/options.cpp:1415
+#: gui/options.cpp:1416
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.
-#: gui/options.cpp:1468
+#: gui/options.cpp:1469
msgid ""
"The theme you selected does not support your current language. If you want "
"to use this theme you need to switch to another language first."
@@ -953,222 +951,227 @@ msgstr ""
"dieses Thema benutzen wollen, müssen Sie erst zu einer anderen Sprache "
"wechseln."
-#: gui/saveload-dialog.cpp:166
+#: gui/saveload-dialog.cpp:167
msgid "List view"
msgstr "Listenansicht"
-#: gui/saveload-dialog.cpp:167
+#: gui/saveload-dialog.cpp:168
msgid "Grid view"
msgstr "Rasteransicht"
-#: gui/saveload-dialog.cpp:210 gui/saveload-dialog.cpp:358
+#: gui/saveload-dialog.cpp:211 gui/saveload-dialog.cpp:360
msgid "No date saved"
msgstr "Kein Datum gespeichert"
-#: gui/saveload-dialog.cpp:211 gui/saveload-dialog.cpp:359
+#: gui/saveload-dialog.cpp:212 gui/saveload-dialog.cpp:361
msgid "No time saved"
msgstr "Keine Zeit gespeichert"
-#: gui/saveload-dialog.cpp:212 gui/saveload-dialog.cpp:360
+#: gui/saveload-dialog.cpp:213 gui/saveload-dialog.cpp:362
msgid "No playtime saved"
msgstr "Keine Spielzeit gespeichert"
-#: gui/saveload-dialog.cpp:219 gui/saveload-dialog.cpp:275
+#: gui/saveload-dialog.cpp:220 gui/saveload-dialog.cpp:276
msgid "Delete"
msgstr "Löschen"
-#: gui/saveload-dialog.cpp:274
+#: gui/saveload-dialog.cpp:275
msgid "Do you really want to delete this savegame?"
msgstr "Diesen Spielstand wirklich löschen?"
-#: gui/saveload-dialog.cpp:383 gui/saveload-dialog.cpp:872
+#: gui/saveload-dialog.cpp:385 gui/saveload-dialog.cpp:875
msgid "Date: "
msgstr "Datum: "
-#: gui/saveload-dialog.cpp:387 gui/saveload-dialog.cpp:878
+#: gui/saveload-dialog.cpp:389 gui/saveload-dialog.cpp:881
msgid "Time: "
msgstr "Zeit: "
-#: gui/saveload-dialog.cpp:393 gui/saveload-dialog.cpp:886
+#: gui/saveload-dialog.cpp:395 gui/saveload-dialog.cpp:889
msgid "Playtime: "
msgstr "Spieldauer: "
-#: gui/saveload-dialog.cpp:406 gui/saveload-dialog.cpp:494
+#: gui/saveload-dialog.cpp:408 gui/saveload-dialog.cpp:496
msgid "Untitled savestate"
msgstr "Unbenannt"
-#: gui/saveload-dialog.cpp:546
+#: gui/saveload-dialog.cpp:548
msgid "Next"
msgstr "Vor"
-#: gui/saveload-dialog.cpp:549
+#: gui/saveload-dialog.cpp:551
msgid "Prev"
msgstr "Zurück"
-#: gui/saveload-dialog.cpp:736
+#: gui/saveload-dialog.cpp:739
msgid "New Save"
msgstr "Neuer Spielstand"
-#: gui/saveload-dialog.cpp:736
+#: gui/saveload-dialog.cpp:739
msgid "Create a new save game"
msgstr "Erstellt einen neuen Spielstand."
-#: gui/saveload-dialog.cpp:865
+#: gui/saveload-dialog.cpp:868
msgid "Name: "
msgstr "Name: "
-#: gui/saveload-dialog.cpp:937
+#: gui/saveload-dialog.cpp:940
#, c-format
msgid "Enter a description for slot %d:"
msgstr "Geben Sie eine Beschreibung für Speicherplatz %d ein:"
-#: gui/themebrowser.cpp:44
+#: gui/themebrowser.cpp:45
msgid "Select a Theme"
msgstr "Thema auswählen"
-#: gui/ThemeEngine.cpp:337
+#: gui/ThemeEngine.cpp:347
msgid "Disabled GFX"
msgstr "GFX ausgeschaltet"
-#: gui/ThemeEngine.cpp:337
+#: gui/ThemeEngine.cpp:347
msgctxt "lowres"
msgid "Disabled GFX"
msgstr "GFX ausgeschaltet"
-#: gui/ThemeEngine.cpp:338
-msgid "Standard Renderer (16bpp)"
+#: gui/ThemeEngine.cpp:348
+#, fuzzy
+msgid "Standard Renderer"
msgstr "Standard-Renderer (16bpp)"
-#: gui/ThemeEngine.cpp:338
-msgid "Standard (16bpp)"
-msgstr "Standard (16bpp)"
+#: gui/ThemeEngine.cpp:348 engines/scumm/dialogs.cpp:659
+msgid "Standard"
+msgstr "Standard"
-#: gui/ThemeEngine.cpp:340
-msgid "Antialiased Renderer (16bpp)"
+#: gui/ThemeEngine.cpp:350
+#, fuzzy
+msgid "Antialiased Renderer"
msgstr "Kantenglättung (16bpp)"
-#: gui/ThemeEngine.cpp:340
-msgid "Antialiased (16bpp)"
+#: gui/ThemeEngine.cpp:350
+#, fuzzy
+msgid "Antialiased"
msgstr "Kantenglättung (16bpp)"
-#: gui/widget.cpp:322 gui/widget.cpp:324 gui/widget.cpp:330 gui/widget.cpp:332
+#: gui/widget.cpp:323 gui/widget.cpp:325 gui/widget.cpp:331 gui/widget.cpp:333
msgid "Clear value"
msgstr "Wert löschen"
-#: gui/fluidsynth-dialog.cpp:67
+#: gui/fluidsynth-dialog.cpp:68
msgid "Reverb"
msgstr "Hall"
-#: gui/fluidsynth-dialog.cpp:69 gui/fluidsynth-dialog.cpp:101
+#: gui/fluidsynth-dialog.cpp:70 gui/fluidsynth-dialog.cpp:102
msgid "Active"
msgstr "Aktiv"
-#: gui/fluidsynth-dialog.cpp:71
+#: gui/fluidsynth-dialog.cpp:72
msgid "Room:"
msgstr "Raum:"
-#: gui/fluidsynth-dialog.cpp:78
+#: gui/fluidsynth-dialog.cpp:79
msgid "Damp:"
msgstr "Dämpfung:"
-#: gui/fluidsynth-dialog.cpp:85
+#: gui/fluidsynth-dialog.cpp:86
msgid "Width:"
msgstr "Radius:"
-#: gui/fluidsynth-dialog.cpp:92 gui/fluidsynth-dialog.cpp:110
+#: gui/fluidsynth-dialog.cpp:93 gui/fluidsynth-dialog.cpp:111
msgid "Level:"
msgstr "Intensität:"
-#: gui/fluidsynth-dialog.cpp:99
+#: gui/fluidsynth-dialog.cpp:100
msgid "Chorus"
msgstr "Chor"
-#: gui/fluidsynth-dialog.cpp:103
+#: gui/fluidsynth-dialog.cpp:104
msgid "N:"
msgstr "Stimmen:"
-#: gui/fluidsynth-dialog.cpp:117
+#: gui/fluidsynth-dialog.cpp:118
msgid "Speed:"
msgstr "Rate:"
-#: gui/fluidsynth-dialog.cpp:124
+#: gui/fluidsynth-dialog.cpp:125
msgid "Depth:"
msgstr "Trennzeit:"
-#: gui/fluidsynth-dialog.cpp:131
+#: gui/fluidsynth-dialog.cpp:132
msgid "Type:"
msgstr "Typ:"
-#: gui/fluidsynth-dialog.cpp:134
+#: gui/fluidsynth-dialog.cpp:135
msgid "Sine"
msgstr "Sinus"
-#: gui/fluidsynth-dialog.cpp:135
+#: gui/fluidsynth-dialog.cpp:136
msgid "Triangle"
msgstr "Dreieck"
-#: gui/fluidsynth-dialog.cpp:139
+#: gui/fluidsynth-dialog.cpp:140
msgid "Interpolation:"
msgstr "Interpolation:"
-#: gui/fluidsynth-dialog.cpp:142
+#: gui/fluidsynth-dialog.cpp:143
msgid "None (fastest)"
msgstr "Keine (am schnellsten)"
-#: gui/fluidsynth-dialog.cpp:143
+#: gui/fluidsynth-dialog.cpp:144
msgid "Linear"
msgstr "Linear"
-#: gui/fluidsynth-dialog.cpp:144
+#: gui/fluidsynth-dialog.cpp:145
msgid "Fourth-order"
msgstr "Vierstufig"
-#: gui/fluidsynth-dialog.cpp:145
+#: gui/fluidsynth-dialog.cpp:146
msgid "Seventh-order"
msgstr "Siebenstufig"
-#: gui/fluidsynth-dialog.cpp:149
+#: gui/fluidsynth-dialog.cpp:150
msgid "Reset"
msgstr "Rücksetzen"
-#: gui/fluidsynth-dialog.cpp:149
+#: gui/fluidsynth-dialog.cpp:150
msgid "Reset all FluidSynth settings to their default values."
msgstr "Setzt alle FluidSynth-Einstellungen auf ihre Standard-Werte zurück."
-#: gui/fluidsynth-dialog.cpp:216
+#: gui/fluidsynth-dialog.cpp:217
msgid ""
"Do you really want to reset all FluidSynth settings to their default values?"
-msgstr "Möchten Sie wirklich alle FluidSynth-Einstellungen auf ihre Standard-Werte zurücksetzen?"
+msgstr ""
+"Möchten Sie wirklich alle FluidSynth-Einstellungen auf ihre Standard-Werte "
+"zurücksetzen?"
-#: base/main.cpp:210
+#: base/main.cpp:228
#, c-format
msgid "Engine does not support debug level '%s'"
msgstr "Engine unterstützt den Debug-Level \"%s\" nicht."
-#: base/main.cpp:288
+#: base/main.cpp:306
msgid "Menu"
msgstr "Menü"
-#: base/main.cpp:291 backends/platform/symbian/src/SymbianActions.cpp:45
+#: base/main.cpp:309 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:294 backends/platform/symbian/src/SymbianActions.cpp:50
+#: base/main.cpp:312 backends/platform/symbian/src/SymbianActions.cpp:50
#: backends/platform/wince/CEActionsPocket.cpp:42
msgid "Pause"
msgstr "Pause"
-#: base/main.cpp:297
+#: base/main.cpp:315
msgid "Skip line"
msgstr "Zeile überspringen"
-#: base/main.cpp:468
+#: base/main.cpp:507
msgid "Error running game:"
msgstr "Fehler beim Ausführen des Spiels:"
-#: base/main.cpp:492
+#: base/main.cpp:536
msgid "Could not find any engine capable of running the selected game"
msgstr "Konnte keine Spiel-Engine finden, die dieses Spiel starten kann."
@@ -1236,76 +1239,76 @@ msgstr "Abbruch durch Benutzer"
msgid "Unknown error"
msgstr "Unbekannter Fehler"
-#: engines/advancedDetector.cpp:316
+#: engines/advancedDetector.cpp:317
#, c-format
msgid "The game in '%s' seems to be unknown."
msgstr "Das Spiel im Verzeichnis \"%s\" scheint nicht bekannt zu sein."
-#: engines/advancedDetector.cpp:317
+#: engines/advancedDetector.cpp:318
msgid "Please, report the following data to the ScummVM team along with name"
msgstr ""
"Bitte geben Sie die folgenden Daten auf Englisch an das ScummVM-Team weiter "
"sowie"
-#: engines/advancedDetector.cpp:319
+#: engines/advancedDetector.cpp:320
msgid "of the game you tried to add and its version/language/etc.:"
msgstr ""
"den Namen des Spiels, das Sie hinzufügen wollten, als auch die Version/"
"Sprache/usw.:"
-#: engines/dialogs.cpp:84
+#: engines/dialogs.cpp:85
msgid "~R~esume"
msgstr "~F~ortsetzen"
-#: engines/dialogs.cpp:86
+#: engines/dialogs.cpp:87
msgid "~L~oad"
msgstr "~L~aden"
-#: engines/dialogs.cpp:90
+#: engines/dialogs.cpp:91
msgid "~S~ave"
msgstr "~S~peichern"
-#: engines/dialogs.cpp:94
+#: engines/dialogs.cpp:95
msgid "~O~ptions"
msgstr "~O~ptionen"
-#: engines/dialogs.cpp:99
+#: engines/dialogs.cpp:100
msgid "~H~elp"
msgstr "~H~ilfe"
-#: engines/dialogs.cpp:101
+#: engines/dialogs.cpp:102
msgid "~A~bout"
msgstr "Übe~r~"
-#: engines/dialogs.cpp:104 engines/dialogs.cpp:180
+#: engines/dialogs.cpp:105 engines/dialogs.cpp:181
msgid "~R~eturn to Launcher"
msgstr "Zur Spiele~l~iste zurück"
-#: engines/dialogs.cpp:106 engines/dialogs.cpp:182
+#: engines/dialogs.cpp:107 engines/dialogs.cpp:183
msgctxt "lowres"
msgid "~R~eturn to Launcher"
msgstr "Zur Spiele~l~iste"
-#: engines/dialogs.cpp:115 engines/agi/saveload.cpp:803
-#: engines/drascula/saveload.cpp:338 engines/cruise/menu.cpp:212
-#: engines/sci/engine/kfile.cpp:742 engines/toltecs/menu.cpp:284
-#: engines/pegasus/pegasus.cpp:373
+#: engines/dialogs.cpp:116 engines/agi/saveload.cpp:803
+#: engines/cruise/menu.cpp:212 engines/drascula/saveload.cpp:336
+#: engines/neverhood/menumodule.cpp:873 engines/pegasus/pegasus.cpp:377
+#: engines/sci/engine/kfile.cpp:758 engines/toltecs/menu.cpp:281
msgid "Save game:"
msgstr "Speichern:"
-#: engines/dialogs.cpp:115 engines/agi/saveload.cpp:803
-#: engines/drascula/saveload.cpp:338 engines/scumm/dialogs.cpp:187
-#: engines/cruise/menu.cpp:212 engines/sci/engine/kfile.cpp:742
-#: engines/toltecs/menu.cpp:284 engines/pegasus/pegasus.cpp:373
-#: backends/platform/symbian/src/SymbianActions.cpp:44
+#: engines/dialogs.cpp:116 backends/platform/symbian/src/SymbianActions.cpp:44
#: backends/platform/wince/CEActionsPocket.cpp:43
#: backends/platform/wince/CEActionsPocket.cpp:267
#: backends/platform/wince/CEActionsSmartphone.cpp:45
#: backends/platform/wince/CEActionsSmartphone.cpp:231
+#: engines/agi/saveload.cpp:803 engines/cruise/menu.cpp:212
+#: engines/drascula/saveload.cpp:336 engines/neverhood/menumodule.cpp:873
+#: engines/pegasus/pegasus.cpp:377 engines/sci/engine/kfile.cpp:758
+#: engines/scumm/dialogs.cpp:188 engines/toltecs/menu.cpp:281
msgid "Save"
msgstr "Speichern"
-#: engines/dialogs.cpp:144
+#: engines/dialogs.cpp:145
msgid ""
"Sorry, this engine does not currently provide in-game help. Please consult "
"the README for basic information, and for instructions on how to obtain "
@@ -1314,7 +1317,7 @@ msgstr ""
"Leider bietet diese Engine keine Spielhilfe. Bitte lesen Sie die Liesmich-"
"Datei für grundlegende Informationen und Anweisungen zu weiterer Hilfe."
-#: engines/dialogs.cpp:228
+#: engines/dialogs.cpp:234 engines/pegasus/pegasus.cpp:393
#, c-format
msgid ""
"Gamestate save failed (%s)! Please consult the README for basic information, "
@@ -1323,37 +1326,37 @@ msgstr ""
"Speichern des Spielstands %s fehlgeschlagen! Bitte lesen Sie die Liesmich-"
"Datei für grundlegende Informationen und Anweisungen zu weiterer Hilfe."
-#: engines/dialogs.cpp:301 engines/mohawk/dialogs.cpp:109
+#: engines/dialogs.cpp:307 engines/mohawk/dialogs.cpp:109
#: engines/mohawk/dialogs.cpp:170
msgid "~O~K"
msgstr "~O~K"
-#: engines/dialogs.cpp:302 engines/mohawk/dialogs.cpp:110
+#: engines/dialogs.cpp:308 engines/mohawk/dialogs.cpp:110
#: engines/mohawk/dialogs.cpp:171
msgid "~C~ancel"
msgstr "~A~bbrechen"
-#: engines/dialogs.cpp:305
+#: engines/dialogs.cpp:311
msgid "~K~eys"
msgstr "~T~asten"
-#: engines/engine.cpp:240
+#: engines/engine.cpp:245
msgid "Could not initialize color format."
msgstr "Konnte Farbenformat nicht initialisieren."
-#: engines/engine.cpp:248
+#: engines/engine.cpp:253
msgid "Could not switch to video mode: '"
msgstr "Konnte nicht zu Grafikmodus wechseln: '"
-#: engines/engine.cpp:257
+#: engines/engine.cpp:262
msgid "Could not apply aspect ratio setting."
msgstr "Konnte Einstellung für Seitenverhältniskorrektur nicht anwenden."
-#: engines/engine.cpp:262
+#: engines/engine.cpp:267
msgid "Could not apply fullscreen setting."
msgstr "Konnte Einstellung für Vollbildmodus nicht anwenden."
-#: engines/engine.cpp:362
+#: engines/engine.cpp:367
msgid ""
"You appear to be playing this game directly\n"
"from the CD. This is known to cause problems,\n"
@@ -1369,7 +1372,7 @@ msgstr ""
"Lesen Sie die Liesmich-Datei für\n"
"weitere Informationen."
-#: engines/engine.cpp:373
+#: engines/engine.cpp:378
msgid ""
"This game has audio tracks in its disk. These\n"
"tracks need to be ripped from the disk using\n"
@@ -1384,7 +1387,7 @@ msgstr ""
"Spiel hören zu können. Lesen Sie die\n"
"Liesmich-Datei für weitere Informationen."
-#: engines/engine.cpp:431
+#: engines/engine.cpp:436
#, c-format
msgid ""
"Gamestate load failed (%s)! Please consult the README for basic information, "
@@ -1393,7 +1396,7 @@ msgstr ""
"Laden des Spielstands %s fehlgeschlagen! Bitte lesen Sie die Liesmich-Datei "
"für grundlegende Informationen und Anweisungen zu weiterer Hilfe."
-#: engines/engine.cpp:444
+#: engines/engine.cpp:449
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 "
@@ -1404,34 +1407,763 @@ msgstr ""
"und jegliche Spielstände, die Sie erstellen, könnten in zukünftigen "
"Versionen von ScummVM nicht mehr funktionieren."
-#: engines/engine.cpp:447
+#: engines/engine.cpp:452
msgid "Start anyway"
msgstr "Trotzdem starten"
-#: engines/agi/detection.cpp:142 engines/drascula/detection.cpp:270
-#: engines/dreamweb/detection.cpp:47 engines/sci/detection.cpp:393
-#: engines/toltecs/detection.cpp:173
+#: audio/fmopl.cpp:50
+msgid "MAME OPL emulator"
+msgstr "MAME-OPL-Emulator"
+
+#: audio/fmopl.cpp:52
+msgid "DOSBox OPL emulator"
+msgstr "DOSBox-OPL-Emulator"
+
+#: audio/mididrv.cpp:209
+#, c-format
+msgid ""
+"The selected audio device '%s' was not found (e.g. might be turned off or "
+"disconnected)."
+msgstr ""
+"Das ausgewählte Audiogerät \"%s\" wurde nicht gefunden (könnte "
+"beispielsweise ausgeschaltet oder nicht angeschlossen sein)."
+
+#: audio/mididrv.cpp:209 audio/mididrv.cpp:221 audio/mididrv.cpp:257
+#: audio/mididrv.cpp:272
+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:221
+#, c-format
+msgid ""
+"The selected audio device '%s' cannot be used. See log file for more "
+"information."
+msgstr ""
+"Das ausgewählte Audiogerät \"%s\" kann nicht verwendet werden. Schauen Sie "
+"für weitere Informationen in der Log-Datei nach."
+
+#: audio/mididrv.cpp:257
+#, c-format
+msgid ""
+"The preferred audio device '%s' was not found (e.g. might be turned off or "
+"disconnected)."
+msgstr ""
+"Das bevorzugte Audiogerät \"%s\" wurde nicht gefunden (könnte beispielsweise "
+"ausgeschaltet oder nicht angeschlossen sein)."
+
+#: audio/mididrv.cpp:272
+#, c-format
+msgid ""
+"The preferred audio device '%s' cannot be used. See log file for more "
+"information."
+msgstr ""
+"Das bevorzugte Audiogerät \"%s\" kann nicht verwendet werden. Schauen Sie "
+"für weitere Informationen in der Log-Datei nach."
+
+#: audio/null.h:44
+msgid "No music"
+msgstr "Keine Musik"
+
+#: audio/mods/paula.cpp:196
+msgid "Amiga Audio Emulator"
+msgstr "Amiga-Audio-Emulator"
+
+#: audio/softsynth/adlib.cpp:2285
+msgid "AdLib Emulator"
+msgstr "AdLib-Emulator"
+
+#: audio/softsynth/appleiigs.cpp:33
+msgid "Apple II GS Emulator (NOT IMPLEMENTED)"
+msgstr "Apple-II-GS-Emulator (NICHT INTEGRIERT)"
+
+#: audio/softsynth/sid.cpp:1430
+msgid "C64 Audio Emulator"
+msgstr "C64-Audio-Emulator"
+
+#: audio/softsynth/mt32.cpp:200
+msgid "Initializing MT-32 Emulator"
+msgstr "MT-32-Emulator wird gestartet"
+
+#: audio/softsynth/mt32.cpp:426
+msgid "MT-32 Emulator"
+msgstr "MT-32-Emulation"
+
+#: audio/softsynth/pcspk.cpp:139
+msgid "PC Speaker Emulator"
+msgstr "PC-Lautsprecher-Emulator"
+
+#: audio/softsynth/pcspk.cpp:158
+msgid "IBM PCjr Emulator"
+msgstr "IBM-PCjr-Emulator"
+
+#: backends/keymapper/remap-dialog.cpp:48
+msgid "Keymap:"
+msgstr "Tasten-Layout:"
+
+#: backends/keymapper/remap-dialog.cpp:67
+msgid " (Effective)"
+msgstr " (Aktuell)"
+
+#: backends/keymapper/remap-dialog.cpp:107
+msgid " (Active)"
+msgstr " (Aktiv)"
+
+#: backends/keymapper/remap-dialog.cpp:107
+msgid " (Blocked)"
+msgstr " (Blockiert)"
+
+#: backends/keymapper/remap-dialog.cpp:120
+msgid " (Global)"
+msgstr " (Global)"
+
+#: backends/keymapper/remap-dialog.cpp:128
+msgid " (Game)"
+msgstr " (Spiel)"
+
+#: backends/midi/windows.cpp:165
+msgid "Windows MIDI"
+msgstr "Windows MIDI"
+
+#: backends/platform/ds/arm9/source/dsoptions.cpp:56
+#: engines/scumm/dialogs.cpp:291
+msgid "~C~lose"
+msgstr "~S~chließen"
+
+#: backends/platform/ds/arm9/source/dsoptions.cpp:57
+msgid "ScummVM Main Menu"
+msgstr "ScummVM-Hauptmenü"
+
+#: backends/platform/ds/arm9/source/dsoptions.cpp:63
+msgid "~L~eft handed mode"
+msgstr "~L~inke-Hand-Modus"
+
+#: backends/platform/ds/arm9/source/dsoptions.cpp:64
+msgid "~I~ndy fight controls"
+msgstr "~K~ampfsteuerung für Indiana Jones"
+
+#: backends/platform/ds/arm9/source/dsoptions.cpp:65
+msgid "Show mouse cursor"
+msgstr "Mauszeiger anzeigen"
+
+#: backends/platform/ds/arm9/source/dsoptions.cpp:66
+msgid "Snap to edges"
+msgstr "An Ecken anheften"
+
+#: backends/platform/ds/arm9/source/dsoptions.cpp:68
+msgid "Touch X Offset"
+msgstr "Zu X-Position gehen"
+
+#: backends/platform/ds/arm9/source/dsoptions.cpp:75
+msgid "Touch Y Offset"
+msgstr "Zu Y-Position gehen"
+
+#: backends/platform/ds/arm9/source/dsoptions.cpp:87
+msgid "Use laptop trackpad-style cursor control"
+msgstr "Den Trackpad-Style für Maussteuerung benutzen"
+
+#: backends/platform/ds/arm9/source/dsoptions.cpp:88
+msgid "Tap for left click, double tap right click"
+msgstr "Tippen für Linksklick, Doppeltippen für Rechtsklick"
+
+#: backends/platform/ds/arm9/source/dsoptions.cpp:90
+msgid "Sensitivity"
+msgstr "Empfindlichkeit"
+
+#: backends/platform/ds/arm9/source/dsoptions.cpp:99
+msgid "Initial top screen scale:"
+msgstr "Vergößerung des oberen Bildschirms:"
+
+#: backends/platform/ds/arm9/source/dsoptions.cpp:105
+msgid "Main screen scaling:"
+msgstr "Hauptbildschirm-Skalierung:"
+
+#: backends/platform/ds/arm9/source/dsoptions.cpp:107
+msgid "Hardware scale (fast, but low quality)"
+msgstr "Hardware-Skalierung (schnell, aber schlechte Qualität)"
+
+#: backends/platform/ds/arm9/source/dsoptions.cpp:108
+msgid "Software scale (good quality, but slower)"
+msgstr "Software-Skalierung (gute Qualität, aber langsamer)"
+
+#: backends/platform/ds/arm9/source/dsoptions.cpp:109
+msgid "Unscaled (you must scroll left and right)"
+msgstr "Nicht skalieren (Sie müssen nach links und nach rechts scrollen)"
+
+#: backends/platform/ds/arm9/source/dsoptions.cpp:111
+msgid "Brightness:"
+msgstr "Helligkeit:"
+
+#: backends/platform/ds/arm9/source/dsoptions.cpp:121
+msgid "High quality audio (slower) (reboot)"
+msgstr "Hohe Audioqualität (lansamer) (erfordert Neustart)"
+
+#: backends/platform/ds/arm9/source/dsoptions.cpp:122
+msgid "Disable power off"
+msgstr "Stromsparmodus abschalten"
+
+#: backends/platform/iphone/osys_events.cpp:300
+msgid "Mouse-click-and-drag mode enabled."
+msgstr "Maus-klick-und-zieh-Modus aktiviert."
+
+#: backends/platform/iphone/osys_events.cpp:302
+msgid "Mouse-click-and-drag mode disabled."
+msgstr "Maus-klick-und-zieh-Modus ausgeschaltet."
+
+#: backends/platform/iphone/osys_events.cpp:313
+msgid "Touchpad mode enabled."
+msgstr "Touchpad-Modus aktiviert."
+
+#: backends/platform/iphone/osys_events.cpp:315
+msgid "Touchpad mode disabled."
+msgstr "Touchpad-Modus ausgeschaltet."
+
+#: backends/platform/maemo/maemo.cpp:209
+msgid "Click Mode"
+msgstr "Klickmodus"
+
+#: backends/platform/maemo/maemo.cpp:215
+#: backends/platform/symbian/src/SymbianActions.cpp:42
+#: backends/platform/wince/CEActionsPocket.cpp:60
+#: backends/platform/wince/CEActionsSmartphone.cpp:43
+#: backends/platform/tizen/form.cpp:275
+msgid "Left Click"
+msgstr "Linksklick"
+
+#: backends/platform/maemo/maemo.cpp:218
+msgid "Middle Click"
+msgstr "Mittelklick"
+
+#: backends/platform/maemo/maemo.cpp:221
+#: backends/platform/symbian/src/SymbianActions.cpp:43
+#: backends/platform/wince/CEActionsSmartphone.cpp:44
+#: backends/platform/tizen/form.cpp:267
+msgid "Right Click"
+msgstr "Rechtsklick"
+
+#: backends/platform/sdl/macosx/appmenu_osx.mm:77
+msgid "Hide ScummVM"
+msgstr "ScummVM ausblenden"
+
+#: backends/platform/sdl/macosx/appmenu_osx.mm:82
+msgid "Hide Others"
+msgstr "Andere ausblenden"
+
+#: backends/platform/sdl/macosx/appmenu_osx.mm:87
+msgid "Show All"
+msgstr "Alle einblenden"
+
+#: backends/platform/sdl/macosx/appmenu_osx.mm:109
+#: backends/platform/sdl/macosx/appmenu_osx.mm:120
+msgid "Window"
+msgstr "Fenster"
+
+#: backends/platform/sdl/macosx/appmenu_osx.mm:114
+msgid "Minimize"
+msgstr "Im Dock ablegen"
+
+#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:46
+msgid "Normal (no scaling)"
+msgstr "Normal (keine Skalierung)"
+
+#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:65
+msgctxt "lowres"
+msgid "Normal (no scaling)"
+msgstr "Normal ohn.Skalieren"
+
+#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2148
+msgid "Enabled aspect ratio correction"
+msgstr "Seitenverhältniskorrektur an"
+
+#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2154
+msgid "Disabled aspect ratio correction"
+msgstr "Seitenverhältniskorrektur aus"
+
+#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2209
+msgid "Active graphics filter:"
+msgstr "Aktiver Grafikfilter:"
+
+#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2251
+msgid "Windowed mode"
+msgstr "Fenstermodus"
+
+#: backends/graphics/opengl/opengl-graphics.cpp:118
+#, fuzzy
+msgid "OpenGL"
+msgstr "Öffne"
+
+#: backends/graphics/opengl/opengl-graphics.cpp:119
+msgid "OpenGL (No filtering)"
+msgstr ""
+
+#: backends/platform/symbian/src/SymbianActions.cpp:38
+#: backends/platform/wince/CEActionsSmartphone.cpp:39
+msgid "Up"
+msgstr "Hoch"
+
+#: backends/platform/symbian/src/SymbianActions.cpp:39
+#: backends/platform/wince/CEActionsSmartphone.cpp:40
+msgid "Down"
+msgstr "Runter"
+
+#: backends/platform/symbian/src/SymbianActions.cpp:40
+#: backends/platform/wince/CEActionsSmartphone.cpp:41
+msgid "Left"
+msgstr "Links"
+
+#: backends/platform/symbian/src/SymbianActions.cpp:41
+#: backends/platform/wince/CEActionsSmartphone.cpp:42
+msgid "Right"
+msgstr "Rechts"
+
+#: backends/platform/symbian/src/SymbianActions.cpp:46
+#: backends/platform/wince/CEActionsSmartphone.cpp:47
+msgid "Zone"
+msgstr "Zone"
+
+#: backends/platform/symbian/src/SymbianActions.cpp:47
+#: backends/platform/wince/CEActionsPocket.cpp:54
+#: backends/platform/wince/CEActionsSmartphone.cpp:48
+msgid "Multi Function"
+msgstr "Multifunktion"
+
+#: backends/platform/symbian/src/SymbianActions.cpp:48
+msgid "Swap character"
+msgstr "Figur wechseln"
+
+#: backends/platform/symbian/src/SymbianActions.cpp:49
+msgid "Skip text"
+msgstr "Text überspringen"
+
+#: backends/platform/symbian/src/SymbianActions.cpp:51
+msgid "Fast mode"
+msgstr "Schneller Modus"
+
+#: 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:218
+#: engines/scumm/dialogs.cpp:192 engines/scumm/help.cpp:82
+#: engines/scumm/help.cpp:84
+msgid "Quit"
+msgstr "Beenden"
+
+#: backends/platform/symbian/src/SymbianActions.cpp:53
+msgid "Debugger"
+msgstr "Debugger"
+
+#: backends/platform/symbian/src/SymbianActions.cpp:54
+msgid "Global menu"
+msgstr "Hauptmenü"
+
+#: backends/platform/symbian/src/SymbianActions.cpp:55
+msgid "Virtual keyboard"
+msgstr "Virtuelle Tastatur"
+
+#: backends/platform/symbian/src/SymbianActions.cpp:56
+msgid "Key mapper"
+msgstr "Tasten zuordnen"
+
+#: backends/events/symbiansdl/symbiansdl-events.cpp:184
+msgid "Do you want to quit ?"
+msgstr "Möchten Sie beenden?"
+
+#: backends/platform/wii/options.cpp:51
+msgid "Video"
+msgstr "Video"
+
+#: backends/platform/wii/options.cpp:54
+msgid "Current video mode:"
+msgstr "Aktueller Grafikmodus:"
+
+#: backends/platform/wii/options.cpp:56
+msgid "Double-strike"
+msgstr "Doppelzeilen (kein Zeilensprungverfahren)"
+
+#: backends/platform/wii/options.cpp:60
+msgid "Horizontal underscan:"
+msgstr "Horizontale Bildverkleinerung:"
+
+#: backends/platform/wii/options.cpp:66
+msgid "Vertical underscan:"
+msgstr "Vertikale Bildverkleinerung:"
+
+#: backends/platform/wii/options.cpp:71
+msgid "Input"
+msgstr "Eingabe"
+
+#: backends/platform/wii/options.cpp:74
+msgid "GC Pad sensitivity:"
+msgstr "GC-Pad-Empfindlichkeit:"
+
+#: backends/platform/wii/options.cpp:80
+msgid "GC Pad acceleration:"
+msgstr "GC-Pad-Beschleunigung:"
+
+#: backends/platform/wii/options.cpp:86
+msgid "DVD"
+msgstr "DVD"
+
+#: backends/platform/wii/options.cpp:89 backends/platform/wii/options.cpp:101
+msgid "Status:"
+msgstr "Status:"
+
+#: backends/platform/wii/options.cpp:90 backends/platform/wii/options.cpp:102
+msgid "Unknown"
+msgstr "Unbekannt"
+
+#: backends/platform/wii/options.cpp:93
+msgid "Mount DVD"
+msgstr "DVD einbinden"
+
+#: backends/platform/wii/options.cpp:94
+msgid "Unmount DVD"
+msgstr "DVD aushängen"
+
+#: backends/platform/wii/options.cpp:98
+msgid "SMB"
+msgstr "SMB"
+
+#: backends/platform/wii/options.cpp:106
+msgid "Server:"
+msgstr "Server:"
+
+#: backends/platform/wii/options.cpp:110
+msgid "Share:"
+msgstr "Öffentliches Verzeichnis:"
+
+#: backends/platform/wii/options.cpp:114
+msgid "Username:"
+msgstr "Benutzername:"
+
+#: backends/platform/wii/options.cpp:118
+msgid "Password:"
+msgstr "Passwort:"
+
+#: backends/platform/wii/options.cpp:121
+msgid "Init network"
+msgstr "Netzwerk starten"
+
+#: backends/platform/wii/options.cpp:123
+msgid "Mount SMB"
+msgstr "SMB einbinden"
+
+#: backends/platform/wii/options.cpp:124
+msgid "Unmount SMB"
+msgstr "SMB aushängen"
+
+#: backends/platform/wii/options.cpp:143
+msgid "DVD Mounted successfully"
+msgstr "DVD erfolgreich eingebunden"
+
+#: backends/platform/wii/options.cpp:146
+msgid "Error while mounting the DVD"
+msgstr "Fehler beim Einbinden der DVD"
+
+#: backends/platform/wii/options.cpp:148
+msgid "DVD not mounted"
+msgstr "DVD nicht eingebunden"
+
+#: backends/platform/wii/options.cpp:161
+msgid "Network up, share mounted"
+msgstr "Netzwerk gestartet, öffentliches Verzeichnis eingebunden"
+
+#: backends/platform/wii/options.cpp:163
+msgid "Network up"
+msgstr "Netzwerk gestartet"
+
+#: backends/platform/wii/options.cpp:166
+msgid ", error while mounting the share"
+msgstr ", Fehler beim Einbinden des öffentlichen Verzeichnisses"
+
+#: backends/platform/wii/options.cpp:168
+msgid ", share not mounted"
+msgstr ", öffentliches Verzeichnis nicht eingebunden"
+
+#: backends/platform/wii/options.cpp:174
+msgid "Network down"
+msgstr "Netzwerk ist aus."
+
+#: backends/platform/wii/options.cpp:178
+msgid "Initializing network"
+msgstr "Netzwerk wird gestartet"
+
+#: backends/platform/wii/options.cpp:182
+msgid "Timeout while initializing network"
+msgstr "Zeitüberschreitung beim Starten des Netzwerks"
+
+#: backends/platform/wii/options.cpp:186
+#, c-format
+msgid "Network not initialized (%d)"
+msgstr "Netzwerk nicht gestartet (%d)"
+
+#: backends/platform/wince/CEActionsPocket.cpp:46
+msgid "Hide Toolbar"
+msgstr "Werkzeugleiste verbergen"
+
+#: backends/platform/wince/CEActionsPocket.cpp:47
+msgid "Show Keyboard"
+msgstr "Tastatur zeigen"
+
+#: backends/platform/wince/CEActionsPocket.cpp:48
+msgid "Sound on/off"
+msgstr "Ton ein/aus"
+
+#: backends/platform/wince/CEActionsPocket.cpp:49
+msgid "Right click"
+msgstr "Rechtsklick"
+
+#: backends/platform/wince/CEActionsPocket.cpp:50
+msgid "Show/Hide Cursor"
+msgstr "Cursor zeigen/verbergen"
+
+#: backends/platform/wince/CEActionsPocket.cpp:51
+msgid "Free look"
+msgstr "Freie Ansicht"
+
+#: backends/platform/wince/CEActionsPocket.cpp:52
+msgid "Zoom up"
+msgstr "Herauszoomen"
+
+#: backends/platform/wince/CEActionsPocket.cpp:53
+msgid "Zoom down"
+msgstr "Hineinzoomen"
+
+#: backends/platform/wince/CEActionsPocket.cpp:55
+#: backends/platform/wince/CEActionsSmartphone.cpp:49
+msgid "Bind Keys"
+msgstr "Tasten zuweisen"
+
+#: backends/platform/wince/CEActionsPocket.cpp:56
+msgid "Cursor Up"
+msgstr "Zeiger hoch"
+
+#: backends/platform/wince/CEActionsPocket.cpp:57
+msgid "Cursor Down"
+msgstr "Zeiger runter"
+
+#: backends/platform/wince/CEActionsPocket.cpp:58
+msgid "Cursor Left"
+msgstr "Zeiger nach links"
+
+#: backends/platform/wince/CEActionsPocket.cpp:59
+msgid "Cursor Right"
+msgstr "Zeiger nach rechts"
+
+#: 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:326
+#: backends/platform/wince/CEActionsSmartphone.cpp:287
+msgid " Are you sure you want to quit ? "
+msgstr " Möchten Sie wirklich beenden? "
+
+#: backends/platform/wince/CEActionsSmartphone.cpp:50
+msgid "Keyboard"
+msgstr "Tastatur"
+
+#: backends/platform/wince/CEActionsSmartphone.cpp:51
+msgid "Rotate"
+msgstr "Drehen"
+
+#: backends/platform/wince/CELauncherDialog.cpp:56
+msgid "Using SDL driver "
+msgstr "Verwende SDL-Treiber "
+
+#: backends/platform/wince/CELauncherDialog.cpp:60
+msgid "Display "
+msgstr "Anzeige "
+
+#: 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:516
+msgid "Map right click action"
+msgstr "Aktion \"Rechtsklick\" zuweisen"
+
+#: backends/platform/wince/wince-sdl.cpp:520
+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:529
+msgid "Map hide toolbar action"
+msgstr "Aktion \"Werkzeugleiste verbergen\" zuweisen"
+
+#: backends/platform/wince/wince-sdl.cpp:533
+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:542
+msgid "Map Zoom Up action (optional)"
+msgstr "Aktion \"Herauszoomen\" zuweisen (optional)"
+
+#: backends/platform/wince/wince-sdl.cpp:545
+msgid "Map Zoom Down action (optional)"
+msgstr "Aktion \"Hineinzoomen\" zuweisen (optional)"
+
+#: backends/platform/wince/wince-sdl.cpp:553
+msgid ""
+"Don't forget to map a key to 'Hide Toolbar' action to see the whole inventory"
+msgstr ""
+"Vergessen Sie nicht, der Aktion \"Werkzeugleiste verbergen\" eine Taste "
+"zuzuweisen, um das ganze Inventar sehen zu können."
+
+#: backends/events/default/default-events.cpp:196
+msgid "Do you really want to return to the Launcher?"
+msgstr "Möchten Sie wirklich zur Spieleliste zurückkehren?"
+
+#: backends/events/default/default-events.cpp:196
+msgid "Launcher"
+msgstr "Spieleliste"
+
+#: backends/events/default/default-events.cpp:218
+msgid "Do you really want to quit?"
+msgstr "Möchten Sie wirklich beenden?"
+
+#: backends/events/gph/gph-events.cpp:386
+#: backends/events/gph/gph-events.cpp:429
+#: backends/events/openpandora/op-events.cpp:168
+msgid "Touchscreen 'Tap Mode' - Left Click"
+msgstr "Berührungsbildschirm-Tipp-Modus - Linksklick"
+
+#: backends/events/gph/gph-events.cpp:388
+#: backends/events/gph/gph-events.cpp:431
+#: backends/events/openpandora/op-events.cpp:170
+msgid "Touchscreen 'Tap Mode' - Right Click"
+msgstr "Berührungsbildschirm-Tipp-Modus - Rechtsklick"
+
+#: backends/events/gph/gph-events.cpp:390
+#: backends/events/gph/gph-events.cpp:433
+#: backends/events/openpandora/op-events.cpp:172
+msgid "Touchscreen 'Tap Mode' - Hover (No Click)"
+msgstr "Berührungsbildschirm-Tipp-Modus - schweben (kein Klick)"
+
+#: backends/events/gph/gph-events.cpp:410
+msgid "Maximum Volume"
+msgstr "Höchste Lautstärke"
+
+#: backends/events/gph/gph-events.cpp:412
+msgid "Increasing Volume"
+msgstr "Lautstärke höher"
+
+#: backends/events/gph/gph-events.cpp:418
+msgid "Minimal Volume"
+msgstr "Niedrigste Lautstärke"
+
+#: backends/events/gph/gph-events.cpp:420
+msgid "Decreasing Volume"
+msgstr "Lautstärke niedriger"
+
+#: backends/events/openpandora/op-events.cpp:174
+msgid "Touchscreen 'Tap Mode' - Hover (DPad Clicks)"
+msgstr "Berührungsbildschirm-Tipp-Modus - schweben (DPad-Klicks)"
+
+#: backends/updates/macosx/macosx-updates.mm:67
+msgid "Check for Updates..."
+msgstr "Suche nach Aktualisierungen..."
+
+#: backends/platform/tizen/form.cpp:263
+msgid "Right Click Once"
+msgstr "Einmal Rechtsklick"
+
+#: backends/platform/tizen/form.cpp:271
+msgid "Move Only"
+msgstr "Nur bewegen"
+
+#: backends/platform/tizen/form.cpp:294
+msgid "Escape Key"
+msgstr "Escape-Taste"
+
+#: backends/platform/tizen/form.cpp:299
+msgid "Game Menu"
+msgstr "Spielmenü"
+
+#: backends/platform/tizen/form.cpp:304
+msgid "Show Keypad"
+msgstr "Ziffernblock zeigen"
+
+#: backends/platform/tizen/form.cpp:309
+msgid "Control Mouse"
+msgstr "Maus steuern"
+
+#: backends/events/maemosdl/maemosdl-events.cpp:192
+msgid "Clicking Enabled"
+msgstr "Klicken aktiviert"
+
+#: backends/events/maemosdl/maemosdl-events.cpp:192
+msgid "Clicking Disabled"
+msgstr "Klicken deaktiviert"
+
+#: engines/agi/detection.cpp:142 engines/drascula/detection.cpp:302
+#: engines/dreamweb/detection.cpp:47 engines/neverhood/detection.cpp:160
+#: engines/sci/detection.cpp:394 engines/toltecs/detection.cpp:186
msgid "Use original save/load screens"
msgstr "Originale Spielstand-Menüs"
-#: engines/agi/detection.cpp:143 engines/drascula/detection.cpp:271
-#: engines/dreamweb/detection.cpp:48 engines/sci/detection.cpp:394
-#: engines/toltecs/detection.cpp:174
+#: engines/agi/detection.cpp:143 engines/drascula/detection.cpp:303
+#: engines/dreamweb/detection.cpp:48 engines/neverhood/detection.cpp:161
+#: engines/sci/detection.cpp:395 engines/toltecs/detection.cpp:187
msgid "Use the original save/load screens, instead of the ScummVM ones"
msgstr ""
"Verwendet die originalen Menüs zum Speichern und Laden statt der von ScummVM."
-#: engines/agi/saveload.cpp:816 engines/drascula/saveload.cpp:351
-#: engines/sci/engine/kfile.cpp:841 engines/toltecs/menu.cpp:259
+#: engines/agi/saveload.cpp:816 engines/drascula/saveload.cpp:349
+#: engines/neverhood/menumodule.cpp:886 engines/sci/engine/kfile.cpp:857
+#: engines/toltecs/menu.cpp:256
msgid "Restore game:"
msgstr "Spiel laden:"
-#: engines/agi/saveload.cpp:816 engines/drascula/saveload.cpp:351
-#: engines/sci/engine/kfile.cpp:841 engines/toltecs/menu.cpp:259
+#: engines/agi/saveload.cpp:816 engines/drascula/saveload.cpp:349
+#: engines/neverhood/menumodule.cpp:886 engines/sci/engine/kfile.cpp:857
+#: engines/toltecs/menu.cpp:256
msgid "Restore"
msgstr "Laden"
-#: engines/drascula/saveload.cpp:49
+#: engines/agos/saveload.cpp:160 engines/scumm/scumm.cpp:2321
+#, c-format
+msgid ""
+"Failed to load game state from file:\n"
+"\n"
+"%s"
+msgstr ""
+"Konnte Spielstand nicht aus folgender Datei laden:\n"
+"\n"
+"%s"
+
+#: engines/agos/saveload.cpp:195 engines/scumm/scumm.cpp:2314
+#, c-format
+msgid ""
+"Failed to save game state to file:\n"
+"\n"
+"%s"
+msgstr ""
+"Konnte Spielstand nicht in folgender Datei speichern:\n"
+"\n"
+"%s"
+
+#: engines/agos/saveload.cpp:203 engines/scumm/scumm.cpp:2332
+#, c-format
+msgid ""
+"Successfully saved game state in file:\n"
+"\n"
+"%s"
+msgstr ""
+"Spielstand erfolgreich in folgender Datei gespeichert:\n"
+"\n"
+"%s"
+
+#: engines/agos/animation.cpp:557
+#, c-format
+msgid "Cutscene file '%s' not found!"
+msgstr "Zwischensequenz \"%s\" nicht gefunden!"
+
+#: engines/drascula/saveload.cpp:47
msgid ""
"ScummVM found that you have old savefiles for Drascula that should be "
"converted.\n"
@@ -1441,8 +2173,8 @@ msgid ""
"Press OK to convert them now, otherwise you will be asked again the next "
"time you start the game.\n"
msgstr ""
-"ScummVM hat erkannt, dass Sie alte Spielstände von Drascula haben, "
-"die umgewandelt werden sollten.\n"
+"ScummVM hat erkannt, dass Sie alte Spielstände von Drascula haben, die "
+"umgewandelt werden sollten.\n"
"Das alte Speicherformat wird nicht mehr unterstützt, also können Sie diese "
"Spielstände unkonvertiert nicht laden.\n"
"\n"
@@ -1457,27 +2189,306 @@ msgstr "Modus für helle Palette verwenden"
msgid "Display graphics using the game's bright palette"
msgstr "Zeigt Grafiken über helle Spielpalette an."
-#: engines/sci/detection.cpp:373
+#: engines/gob/inter_playtoons.cpp:256 engines/gob/inter_v2.cpp:1470
+#: engines/tinsel/saveload.cpp:532
+msgid "Failed to load game state from file."
+msgstr "Konnte Spielstand aus Datei nicht laden."
+
+#: engines/gob/inter_v2.cpp:1540 engines/tinsel/saveload.cpp:545
+msgid "Failed to save game state to file."
+msgstr "Konnte Spielstand nicht in Datei speichern."
+
+#: engines/gob/inter_v5.cpp:107
+msgid "Failed to delete file."
+msgstr "Konnte Datei nicht löschen."
+
+#: engines/groovie/detection.cpp:312
+msgid "Fast movie speed"
+msgstr "Schnelles Film-Tempo"
+
+#: engines/groovie/detection.cpp:313
+msgid "Play movies at an increased speed"
+msgstr "Spielt Filme mit erhöhter Geschwindigkeit ab."
+
+#: engines/groovie/script.cpp:399
+msgid "Failed to save game"
+msgstr "Konnte Spielstand nicht speichern."
+
+#. I18N: Studio audience adds an applause and cheering sounds whenever
+#. Malcolm makes a joke.
+#: engines/kyra/detection.cpp:62
+msgid "Studio audience"
+msgstr "Studio-Publikum"
+
+#: engines/kyra/detection.cpp:63
+msgid "Enable studio audience"
+msgstr "Aktiviert Studio-Publikum."
+
+#. I18N: This option allows the user to skip text and cutscenes.
+#: engines/kyra/detection.cpp:73
+msgid "Skip support"
+msgstr "Überspring-Unterstützung"
+
+#: engines/kyra/detection.cpp:74
+msgid "Allow text and cutscenes to be skipped"
+msgstr "Erlaubt das Überspringen von Textteilen und Zwischensequenzen."
+
+#. I18N: Helium mode makes people sound like they've inhaled Helium.
+#: engines/kyra/detection.cpp:84
+msgid "Helium mode"
+msgstr "Helium-Modus"
+
+#: engines/kyra/detection.cpp:85
+msgid "Enable helium mode"
+msgstr "Aktiviert Helium-Modus."
+
+#. I18N: When enabled, this option makes scrolling smoother when
+#. changing from one screen to another.
+#: engines/kyra/detection.cpp:99
+msgid "Smooth scrolling"
+msgstr "Gleichmäßiges Scrollen"
+
+#: engines/kyra/detection.cpp:100
+msgid "Enable smooth scrolling when walking"
+msgstr "Aktiviert gleichmäßiges Scrollen beim Gehen."
+
+#. I18N: When enabled, this option changes the cursor when it floats to the
+#. edge of the screen to a directional arrow. The player can then click to
+#. walk towards that direction.
+#: engines/kyra/detection.cpp:112
+msgid "Floating cursors"
+msgstr "Richtungspfeil-Mauszeiger"
+
+#: engines/kyra/detection.cpp:113
+msgid "Enable floating cursors"
+msgstr "Aktiviert Richtungspfeil-Mauszeiger."
+
+#. I18N: HP stands for Hit Points
+#: engines/kyra/detection.cpp:127
+msgid "HP bar graphs"
+msgstr "Trefferpunkte-Balken"
+
+#: engines/kyra/detection.cpp:128
+msgid "Enable hit point bar graphs"
+msgstr "Aktiviert grafische Trefferpunkte-Balken."
+
+#: engines/kyra/lol.cpp:478
+msgid "Attack 1"
+msgstr "Attacke 1"
+
+#: engines/kyra/lol.cpp:479
+msgid "Attack 2"
+msgstr "Attacke 2"
+
+#: engines/kyra/lol.cpp:480
+msgid "Attack 3"
+msgstr "Attacke 3"
+
+#: engines/kyra/lol.cpp:481
+msgid "Move Forward"
+msgstr "Nach vorn bewegen"
+
+#: engines/kyra/lol.cpp:482
+msgid "Move Back"
+msgstr "Nach hinten bewegen"
+
+#: engines/kyra/lol.cpp:483
+msgid "Slide Left"
+msgstr "Nach links rutschen"
+
+#: engines/kyra/lol.cpp:484
+msgid "Slide Right"
+msgstr "Nach rechts rutschen"
+
+#: engines/kyra/lol.cpp:485 engines/pegasus/pegasus.cpp:2509
+msgid "Turn Left"
+msgstr "Nach links drehen"
+
+#: engines/kyra/lol.cpp:486 engines/pegasus/pegasus.cpp:2510
+msgid "Turn Right"
+msgstr "Nach rechts drehen"
+
+#: engines/kyra/lol.cpp:487
+msgid "Rest"
+msgstr "Ausruhen"
+
+#: engines/kyra/lol.cpp:488
+msgid "Options"
+msgstr "Optionen"
+
+#: engines/kyra/lol.cpp:489
+msgid "Choose Spell"
+msgstr "Zauberspruch auswählen"
+
+#: engines/kyra/sound_midi.cpp:477
+msgid ""
+"You appear to be using a General MIDI device,\n"
+"but your game only supports Roland MT32 MIDI.\n"
+"We try to map the Roland MT32 instruments to\n"
+"General MIDI ones. It is still possible that\n"
+"some tracks sound incorrect."
+msgstr ""
+"Sie scheinen ein General-MIDI-Gerät zu\n"
+"verwenden, aber das Spiel unterstützt nur\n"
+"Roland MT32 MIDI. Es wird versucht, die\n"
+"Roland-MT32-Instrumente denen von\n"
+"General MIDI zuzuordnen. Es ist dennoch\n"
+"möglich, dass ein paar Musikstücke nicht\n"
+"richtig abgespielt werden."
+
+#. I18N: Option for fast scene switching
+#: engines/mohawk/dialogs.cpp:92 engines/mohawk/dialogs.cpp:167
+msgid "~Z~ip Mode Activated"
+msgstr "Schneller ~R~aumwechsel aktiviert"
+
+#: engines/mohawk/dialogs.cpp:93
+msgid "~T~ransitions Enabled"
+msgstr "Über~g~änge aktiviert"
+
+#. I18N: Drop book page
+#: engines/mohawk/dialogs.cpp:95
+msgid "~D~rop Page"
+msgstr "Seite ~w~egwerfen"
+
+#: engines/mohawk/dialogs.cpp:99
+msgid "~S~how Map"
+msgstr "~K~arte anzeigen"
+
+#: engines/mohawk/dialogs.cpp:105
+msgid "~M~ain Menu"
+msgstr "Haupt~m~enü"
+
+#: engines/mohawk/dialogs.cpp:168
+msgid "~W~ater Effect Enabled"
+msgstr "~W~assereffekt aktiviert"
+
+#: engines/neverhood/detection.cpp:167
+msgid "Skip the Hall of Records storyboard scenes"
+msgstr ""
+
+#: engines/neverhood/detection.cpp:168
+msgid "Allows the player to skip past the Hall of Records storyboard scenes"
+msgstr ""
+
+#: engines/neverhood/detection.cpp:174
+msgid "Scale the making of videos to full screen"
+msgstr ""
+
+#: engines/neverhood/detection.cpp:175
+msgid "Scale the making of videos, so that they use the whole screen"
+msgstr ""
+
+#: engines/parallaction/saveload.cpp:133
+#, c-format
+msgid ""
+"Can't save game in slot %i\n"
+"\n"
+msgstr ""
+"Kann Spiel nicht speichern auf Speicherplatz %i\n"
+"\n"
+
+#: engines/parallaction/saveload.cpp:204
+msgid "Loading game..."
+msgstr "Spiel wird geladen..."
+
+#: engines/parallaction/saveload.cpp:219
+msgid "Saving game..."
+msgstr "Spiel wird gespeichert..."
+
+#: engines/parallaction/saveload.cpp:272
+msgid ""
+"ScummVM found that you have old savefiles for Nippon Safes that should be "
+"renamed.\n"
+"The old names are 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 next time.\n"
+msgstr ""
+"ScummVM hat erkannt, dass Sie alte Spielstände von Nippon Safes haben, die "
+"umbenannt werden sollten.\n"
+"Die alten Dateinamen werden nicht mehr unterstützt, also können Sie diese "
+"Spielstände unkonvertiert nicht laden.\n"
+"\n"
+"Klicken Sie auf OK, um diese jetzt umzuwandeln, sonst werden Sie erneut "
+"gefragt, wenn Sie nächstes Mal dieses Spiel starten.\n"
+
+#: engines/parallaction/saveload.cpp:319
+msgid "ScummVM successfully converted all your savefiles."
+msgstr "ScummVM hat alle Speicherstände erfolgreich umgewandelt."
+
+#: engines/parallaction/saveload.cpp:321
+msgid ""
+"ScummVM printed some warnings in your console window and can't guarantee all "
+"your files have been converted.\n"
+"\n"
+"Please report to the team."
+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."
+
+#: engines/pegasus/pegasus.cpp:714
+msgid "Invalid save file name"
+msgstr "Ungültiger Spielstandname"
+
+#: engines/pegasus/pegasus.cpp:2507
+msgid "Up/Zoom In/Move Forward/Open Doors"
+msgstr "Hoch/Hineinzoomen/Nach vorn/Türen öffnen"
+
+#: engines/pegasus/pegasus.cpp:2508
+msgid "Down/Zoom Out"
+msgstr "Runter/Hinauszoomen"
+
+#: engines/pegasus/pegasus.cpp:2511
+msgid "Display/Hide Inventory Tray"
+msgstr "Inventarleiste anzeigen/verbergen"
+
+#: engines/pegasus/pegasus.cpp:2512
+msgid "Display/Hide Biochip Tray"
+msgstr "Biochip-Leiste anzeigen/verbergen"
+
+#: engines/pegasus/pegasus.cpp:2513
+msgid "Action/Select"
+msgstr "Aktion/Auswählen"
+
+#: engines/pegasus/pegasus.cpp:2514
+msgid "Toggle Center Data Display"
+msgstr "Mittige Datenanzeige wechseln"
+
+#: engines/pegasus/pegasus.cpp:2515
+msgid "Display/Hide Info Screen"
+msgstr "Info-Bildschirm anzeigen/verbergen"
+
+#: engines/pegasus/pegasus.cpp:2516
+msgid "Display/Hide Pause Menu"
+msgstr "Pause-Menü anzeigen/verbergen"
+
+#: engines/pegasus/pegasus.cpp:2517
+msgid "???"
+msgstr "???"
+
+#: engines/sci/detection.cpp:374
msgid "EGA undithering"
msgstr "Antifehlerdiffusion für EGA"
-#: engines/sci/detection.cpp:374
+#: engines/sci/detection.cpp:375
msgid "Enable undithering in EGA games"
msgstr "Aktiviert die Aufhebung der Fehlerdiffusion in EGA-Spielen."
-#: engines/sci/detection.cpp:383
+#: engines/sci/detection.cpp:384
msgid "Prefer digital sound effects"
msgstr "Digitale Sound-Effekte bevorzugen"
-#: engines/sci/detection.cpp:384
+#: engines/sci/detection.cpp:385
msgid "Prefer digital sound effects instead of synthesized ones"
msgstr "Bevorzugt digitale Sound-Effekte statt synthethisierter."
-#: engines/sci/detection.cpp:403
+#: engines/sci/detection.cpp:404
msgid "Use IMF/Yamaha FB-01 for MIDI output"
msgstr "IMF/Yamaha FB-01 für MIDI-Ausgabe verwenden"
-#: engines/sci/detection.cpp:404
+#: engines/sci/detection.cpp:405
msgid ""
"Use an IBM Music Feature card or a Yamaha FB-01 FM synth module for MIDI "
"output"
@@ -1485,167 +2496,149 @@ msgstr ""
"Verwendet eine Music-Feature-Karte von IBM oder ein Yamaha-FB-01-FM-"
"Synthetisierungsmodul für die MIDI-Ausgabe."
-#: engines/sci/detection.cpp:414
+#: engines/sci/detection.cpp:415
msgid "Use CD audio"
msgstr "CD-Ton verwenden"
-#: engines/sci/detection.cpp:415
+#: engines/sci/detection.cpp:416
msgid "Use CD audio instead of in-game audio, if available"
msgstr "Verwendet CD-Ton anstatt des Tons im Spiel, sofern verfügbar."
-#: engines/sci/detection.cpp:425
+#: engines/sci/detection.cpp:426
msgid "Use Windows cursors"
msgstr "Windows-Mauszeiger verwenden"
-#: engines/sci/detection.cpp:426
+#: engines/sci/detection.cpp:427
msgid ""
"Use the Windows cursors (smaller and monochrome) instead of the DOS ones"
msgstr ""
"Verwendet die Windows-Mauszeiger (kleiner und schwarz-weiß) anstatt der von "
"DOS."
-#: engines/sci/detection.cpp:436
+#: engines/sci/detection.cpp:437
msgid "Use silver cursors"
msgstr "Silberne Mauszeiger verwenden"
-#: engines/sci/detection.cpp:437
+#: engines/sci/detection.cpp:438
msgid ""
"Use the alternate set of silver cursors, instead of the normal golden ones"
msgstr ""
"Verwendet alternativen Satz silberner Mauszeiger anstatt der normalen "
"goldenen."
-#: engines/scumm/dialogs.cpp:175
+#: engines/scumm/dialogs.cpp:176
#, 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
+#: engines/scumm/dialogs.cpp:177
#, 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
+#: engines/scumm/dialogs.cpp:178
#, 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
+#: engines/scumm/dialogs.cpp:179
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
+#: engines/scumm/dialogs.cpp:183
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
+#: engines/scumm/dialogs.cpp:185
msgid "Are you sure you want to quit? (Y/N)"
msgstr "Möchten Sie wirklich beenden? (J/N)J"
-#: engines/scumm/dialogs.cpp:189
+#: engines/scumm/dialogs.cpp:190
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:215
-msgid "Quit"
-msgstr "Beenden"
-
-#: engines/scumm/dialogs.cpp:193
+#: engines/scumm/dialogs.cpp:194
msgid "Insert save/load game disk"
msgstr "Legen Sie eine Spielstand-Disk ein."
-#: engines/scumm/dialogs.cpp:194
+#: engines/scumm/dialogs.cpp:195
msgid "You must enter a name"
msgstr "Sie müssen eine Bezeichnung eingeben."
-#: engines/scumm/dialogs.cpp:195
+#: engines/scumm/dialogs.cpp:196
msgid "The game was NOT saved (disk full?)"
msgstr "Spiel wurde NICHT gespeichert. (Datenträger voll?)"
-#: engines/scumm/dialogs.cpp:196
+#: engines/scumm/dialogs.cpp:197
msgid "The game was NOT loaded"
msgstr "Spiel wurde NICHT geladen."
-#: engines/scumm/dialogs.cpp:197
+#: engines/scumm/dialogs.cpp:198
#, c-format
msgid "Saving '%s'"
msgstr "Speichere \"%s\""
-#: engines/scumm/dialogs.cpp:198
+#: engines/scumm/dialogs.cpp:199
#, c-format
msgid "Loading '%s'"
msgstr "Lade \"%s\""
-#: engines/scumm/dialogs.cpp:199
+#: engines/scumm/dialogs.cpp:200
msgid "Name your SAVE game"
msgstr "Name für Spielstand eingeben"
-#: engines/scumm/dialogs.cpp:200
+#: engines/scumm/dialogs.cpp:201
msgid "Select a game to LOAD"
msgstr "Spielstand zum LADEN auswählen"
-#: engines/scumm/dialogs.cpp:201
+#: engines/scumm/dialogs.cpp:202
msgid "Game title)"
msgstr "Spieltitel)"
#. I18N: Previous page button
-#: engines/scumm/dialogs.cpp:287
+#: engines/scumm/dialogs.cpp:288
msgid "~P~revious"
msgstr "~Z~urück"
#. I18N: Next page button
-#: engines/scumm/dialogs.cpp:289
+#: engines/scumm/dialogs.cpp:290
msgid "~N~ext"
msgstr "~W~eiter"
-#: 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
+#: engines/scumm/dialogs.cpp:598
msgid "Speech Only"
msgstr "Nur Sprachausgabe"
-#: engines/scumm/dialogs.cpp:598
+#: engines/scumm/dialogs.cpp:599
msgid "Speech and Subtitles"
msgstr "Sprachausgabe und Untertitel"
-#: engines/scumm/dialogs.cpp:599
+#: engines/scumm/dialogs.cpp:600
msgid "Subtitles Only"
msgstr "Nur Untertitel"
-#: engines/scumm/dialogs.cpp:607
+#: engines/scumm/dialogs.cpp:608
msgctxt "lowres"
msgid "Speech & Subs"
msgstr "Sprache & Text"
-#: engines/scumm/dialogs.cpp:653
+#: engines/scumm/dialogs.cpp:654
msgid "Select a Proficiency Level."
msgstr "Wähle einen Schwierigkeitsgrad."
-#: engines/scumm/dialogs.cpp:655
+#: engines/scumm/dialogs.cpp:656
msgid "Refer to your Loom(TM) manual for help."
msgstr "Für Hilfe schaue ins Loom-Handbuch."
-#: engines/scumm/dialogs.cpp:658
-msgid "Standard"
-msgstr "Standard"
-
-#: engines/scumm/dialogs.cpp:659
+#: engines/scumm/dialogs.cpp:660
msgid "Practice"
msgstr "Anfänger"
-#: engines/scumm/dialogs.cpp:660
+#: engines/scumm/dialogs.cpp:661
msgid "Expert"
msgstr "Experte"
@@ -2162,7 +3155,7 @@ msgstr "Nach rechts fliegen"
msgid "Fly to lower right"
msgstr "Nach unten rechts fliegen"
-#: engines/scumm/scumm.cpp:1776
+#: engines/scumm/scumm.cpp:1777
#, c-format
msgid ""
"Native MIDI support requires the Roland Upgrade from LucasArts,\n"
@@ -2172,40 +3165,7 @@ msgstr ""
"Roland-Upgrade von LucasArts, aber %s\n"
"fehlt. Stattdessen wird AdLib verwendet."
-#: engines/scumm/scumm.cpp:2303 engines/agos/saveload.cpp:220
-#, c-format
-msgid ""
-"Failed to save game state to file:\n"
-"\n"
-"%s"
-msgstr ""
-"Konnte Spielstand nicht in folgender Datei speichern:\n"
-"\n"
-"%s"
-
-#: engines/scumm/scumm.cpp:2310 engines/agos/saveload.cpp:185
-#, c-format
-msgid ""
-"Failed to load game state from file:\n"
-"\n"
-"%s"
-msgstr ""
-"Konnte Spielstand nicht aus folgender Datei laden:\n"
-"\n"
-"%s"
-
-#: engines/scumm/scumm.cpp:2322 engines/agos/saveload.cpp:228
-#, c-format
-msgid ""
-"Successfully saved game state in file:\n"
-"\n"
-"%s"
-msgstr ""
-"Spielstand erfolgreich in folgender Datei gespeichert:\n"
-"\n"
-"%s"
-
-#: engines/scumm/scumm.cpp:2537
+#: engines/scumm/scumm.cpp:2547
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' "
@@ -2216,192 +3176,6 @@ msgstr ""
"im Startmenü von ScummVM und wählen das Verzeichnis \"Maniac\" im "
"Verzeichnis dieses Spiels aus."
-#. I18N: Option for fast scene switching
-#: engines/mohawk/dialogs.cpp:92 engines/mohawk/dialogs.cpp:167
-msgid "~Z~ip Mode Activated"
-msgstr "Schneller ~R~aumwechsel aktiviert"
-
-#: engines/mohawk/dialogs.cpp:93
-msgid "~T~ransitions Enabled"
-msgstr "Über~g~änge aktiviert"
-
-#. I18N: Drop book page
-#: engines/mohawk/dialogs.cpp:95
-msgid "~D~rop Page"
-msgstr "Seite ~w~egwerfen"
-
-#: engines/mohawk/dialogs.cpp:99
-msgid "~S~how Map"
-msgstr "~K~arte anzeigen"
-
-#: engines/mohawk/dialogs.cpp:105
-msgid "~M~ain Menu"
-msgstr "Haupt~m~enü"
-
-#: engines/mohawk/dialogs.cpp:168
-msgid "~W~ater Effect Enabled"
-msgstr "~W~assereffekt aktiviert"
-
-#: engines/agos/animation.cpp:557
-#, c-format
-msgid "Cutscene file '%s' not found!"
-msgstr "Zwischensequenz \"%s\" nicht gefunden!"
-
-#: engines/gob/inter_playtoons.cpp:256 engines/gob/inter_v2.cpp:1287
-#: engines/tinsel/saveload.cpp:532
-msgid "Failed to load game state from file."
-msgstr "Konnte Spielstand aus Datei nicht laden."
-
-#: engines/gob/inter_v2.cpp:1357 engines/tinsel/saveload.cpp:545
-msgid "Failed to save game state to file."
-msgstr "Konnte Spielstand nicht in Datei speichern."
-
-#: engines/gob/inter_v5.cpp:107
-msgid "Failed to delete file."
-msgstr "Konnte Datei nicht löschen."
-
-#: engines/groovie/detection.cpp:312
-msgid "Fast movie speed"
-msgstr "Schnelles Film-Tempo"
-
-#: engines/groovie/detection.cpp:313
-msgid "Play movies at an increased speed"
-msgstr "Spielt Filme mit erhöhter Geschwindigkeit ab."
-
-#: engines/groovie/script.cpp:420
-msgid "Failed to save game"
-msgstr "Konnte Spielstand nicht speichern."
-
-#. I18N: Studio audience adds an applause and cheering sounds whenever
-#. Malcolm makes a joke.
-#: engines/kyra/detection.cpp:62
-msgid "Studio audience"
-msgstr "Studio-Publikum"
-
-#: engines/kyra/detection.cpp:63
-msgid "Enable studio audience"
-msgstr "Aktiviert Studio-Publikum."
-
-#. I18N: This option allows the user to skip text and cutscenes.
-#: engines/kyra/detection.cpp:73
-msgid "Skip support"
-msgstr "Überspring-Unterstützung"
-
-#: engines/kyra/detection.cpp:74
-msgid "Allow text and cutscenes to be skipped"
-msgstr "Erlaubt das Überspringen von Textteilen und Zwischensequenzen."
-
-#. I18N: Helium mode makes people sound like they've inhaled Helium.
-#: engines/kyra/detection.cpp:84
-msgid "Helium mode"
-msgstr "Helium-Modus"
-
-#: engines/kyra/detection.cpp:85
-msgid "Enable helium mode"
-msgstr "Aktiviert Helium-Modus."
-
-#. I18N: When enabled, this option makes scrolling smoother when
-#. changing from one screen to another.
-#: engines/kyra/detection.cpp:99
-msgid "Smooth scrolling"
-msgstr "Gleichmäßiges Scrollen"
-
-#: engines/kyra/detection.cpp:100
-msgid "Enable smooth scrolling when walking"
-msgstr "Aktiviert gleichmäßiges Scrollen beim Gehen."
-
-#. I18N: When enabled, this option changes the cursor when it floats to the
-#. edge of the screen to a directional arrow. The player can then click to
-#. walk towards that direction.
-#: engines/kyra/detection.cpp:112
-msgid "Floating cursors"
-msgstr "Richtungspfeil-Mauszeiger"
-
-#: engines/kyra/detection.cpp:113
-msgid "Enable floating cursors"
-msgstr "Aktiviert Richtungspfeil-Mauszeiger."
-
-#. I18N: HP stands for Hit Points
-#: engines/kyra/detection.cpp:127
-msgid "HP bar graphs"
-msgstr "Trefferpunkte-Balken"
-
-#: engines/kyra/detection.cpp:128
-msgid "Enable hit point bar graphs"
-msgstr "Aktiviert grafische Trefferpunkte-Balken."
-
-#: engines/kyra/lol.cpp:478
-msgid "Attack 1"
-msgstr "Attacke 1"
-
-#: engines/kyra/lol.cpp:479
-msgid "Attack 2"
-msgstr "Attacke 2"
-
-#: engines/kyra/lol.cpp:480
-msgid "Attack 3"
-msgstr "Attacke 3"
-
-#: engines/kyra/lol.cpp:481
-msgid "Move Forward"
-msgstr "Nach vorn bewegen"
-
-#: engines/kyra/lol.cpp:482
-msgid "Move Back"
-msgstr "Nach hinten bewegen"
-
-#: engines/kyra/lol.cpp:483
-msgid "Slide Left"
-msgstr "Nach links rutschen"
-
-#: engines/kyra/lol.cpp:484
-msgid "Slide Right"
-msgstr "Nach rechts rutschen"
-
-#: engines/kyra/lol.cpp:485 engines/pegasus/pegasus.cpp:2447
-msgid "Turn Left"
-msgstr "Nach links drehen"
-
-#: engines/kyra/lol.cpp:486 engines/pegasus/pegasus.cpp:2448
-msgid "Turn Right"
-msgstr "Nach rechts drehen"
-
-#: engines/kyra/lol.cpp:487
-msgid "Rest"
-msgstr "Ausruhen"
-
-#: engines/kyra/lol.cpp:488
-msgid "Options"
-msgstr "Optionen"
-
-#: engines/kyra/lol.cpp:489
-msgid "Choose Spell"
-msgstr "Zauberspruch auswählen"
-
-#: engines/kyra/sound_midi.cpp:477
-msgid ""
-"You appear to be using a General MIDI device,\n"
-"but your game only supports Roland MT32 MIDI.\n"
-"We try to map the Roland MT32 instruments to\n"
-"General MIDI ones. It is still possible that\n"
-"some tracks sound incorrect."
-msgstr ""
-"Sie scheinen ein General-MIDI-Gerät zu\n"
-"verwenden, aber das Spiel unterstützt nur\n"
-"Roland MT32 MIDI. Es wird versucht, die\n"
-"Roland-MT32-Instrumente denen von\n"
-"General MIDI zuzuordnen. Es ist dennoch\n"
-"möglich, dass ein paar Musikstücke nicht\n"
-"richtig abgespielt werden."
-
-#: engines/queen/queen.cpp:59
-msgid "Alternative intro"
-msgstr "Alternativer Vorspann"
-
-#: engines/queen/queen.cpp:60
-msgid "Use an alternative game intro (CD version only)"
-msgstr "Verwendet einen alternativen Vorspann (nur bei CD-Version)."
-
#: engines/sky/compact.cpp:130
msgid ""
"Unable to find \"sky.cpt\" file!\n"
@@ -2428,23 +3202,26 @@ msgstr "Disketten-Vorspann"
msgid "Use the floppy version's intro (CD version only)"
msgstr "Verwendet den Vorspann der Diskettenversion (nur bei CD-Version)."
-#: engines/sword1/animation.cpp:519
+#: engines/sword1/animation.cpp:524
#, c-format
msgid "PSX stream cutscene '%s' cannot be played in paletted mode"
msgstr ""
"PSX-Zwischensequenz \"%s\" kann in Palettenmodus nicht wiedergegeben werden."
-#: engines/sword1/animation.cpp:540 engines/sword2/animation.cpp:439
+#: engines/sword1/animation.cpp:545 engines/sword2/animation.cpp:445
msgid "DXA cutscenes found but ScummVM has been built without zlib support"
msgstr ""
"DXA-Zwischensequenzen gefunden, aber ScummVM wurde ohne Zlib-Unterstützung "
"erstellt."
-#: engines/sword1/animation.cpp:550 engines/sword2/animation.cpp:449
-msgid "MPEG2 cutscenes are no longer supported"
-msgstr "MPEG2-Zwischensequenzen werden nicht mehr unterstützt."
+#: engines/sword1/animation.cpp:561
+#, fuzzy
+msgid "MPEG-2 cutscenes found but ScummVM has been built without MPEG-2"
+msgstr ""
+"PSX-Zwischensequenzen gefunden, aber ScummVM wurde ohne Unterstützung für "
+"RGB-Farben erstellt."
-#: engines/sword1/animation.cpp:556 engines/sword2/animation.cpp:457
+#: engines/sword1/animation.cpp:568 engines/sword2/animation.cpp:470
#, c-format
msgid "Cutscene '%s' not found"
msgstr "Zwischensequenz \"%s\" gefunden"
@@ -2488,13 +3265,21 @@ msgstr "Den neuen behalten"
msgid "This is the end of the Broken Sword 1 Demo"
msgstr "Das ist das Ende der Demo von Broken Sword 1 (Baphomets Fluch 1)."
-#: engines/sword2/animation.cpp:419
+#: engines/sword2/animation.cpp:425
msgid ""
"PSX cutscenes found but ScummVM has been built without RGB color support"
msgstr ""
"PSX-Zwischensequenzen gefunden, aber ScummVM wurde ohne Unterstützung für "
"RGB-Farben erstellt."
+#: engines/sword2/animation.cpp:461
+#, fuzzy
+msgid ""
+"MPEG-2 cutscenes found but ScummVM has been built without MPEG-2 support"
+msgstr ""
+"DXA-Zwischensequenzen gefunden, aber ScummVM wurde ohne Zlib-Unterstützung "
+"erstellt."
+
#: engines/sword2/sword2.cpp:79
msgid "Show object labels"
msgstr "Objektnamen zeigen"
@@ -2503,14 +3288,14 @@ msgstr "Objektnamen zeigen"
msgid "Show labels for objects on mouse hover"
msgstr "Zeigt Objektbeschriftungen bei Mausberührung an."
-#: engines/teenagent/resources.cpp:94
+#: engines/teenagent/resources.cpp:95
msgid ""
"You're missing the 'teenagent.dat' file. Get it from the ScummVM website"
msgstr ""
-"Ihnen fehlt die Datei teenagent.dat. Laden Sie sich diese von der "
-"ScummVM-Website unter http://www.scummvm.org herunter."
+"Ihnen fehlt die Datei teenagent.dat. Laden Sie sich diese von der ScummVM-"
+"Website unter http://www.scummvm.org herunter."
-#: engines/teenagent/resources.cpp:115
+#: engines/teenagent/resources.cpp:116
msgid ""
"The teenagent.dat file is compressed and zlib hasn't been included in this "
"executable. Please decompress it"
@@ -2518,792 +3303,51 @@ msgstr ""
"Die Datei teenagent.dat ist gepackt und zlib zum Entpacken wurde in dieser "
"ausführbaren Datei nicht miteingebunden. Bitte entpacken Sie die Datei."
-#: engines/parallaction/saveload.cpp:133
-#, c-format
-msgid ""
-"Can't save game in slot %i\n"
-"\n"
-msgstr ""
-"Kann Spiel nicht speichern auf Speicherplatz %i\n"
-"\n"
-
-#: engines/parallaction/saveload.cpp:204
-msgid "Loading game..."
-msgstr "Spiel wird geladen..."
-
-#: engines/parallaction/saveload.cpp:219
-msgid "Saving game..."
-msgstr "Spiel wird gespeichert..."
-
-#: engines/parallaction/saveload.cpp:272
-msgid ""
-"ScummVM found that you have old savefiles for Nippon Safes that should be "
-"renamed.\n"
-"The old names are 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 next time.\n"
-msgstr ""
-"ScummVM hat erkannt, dass Sie alte Spielstände von Nippon Safes haben, die "
-"umbenannt werden sollten.\n"
-"Die alten Dateinamen werden nicht mehr unterstützt, also können Sie diese "
-"Spielstände unkonvertiert nicht laden.\n"
-"\n"
-"Klicken Sie auf OK, um diese jetzt umzuwandeln, sonst werden Sie erneut "
-"gefragt, wenn Sie nächstes Mal dieses Spiel starten.\n"
-
-#: engines/parallaction/saveload.cpp:319
-msgid "ScummVM successfully converted all your savefiles."
-msgstr "ScummVM hat alle Speicherstände erfolgreich umgewandelt."
-
-#: engines/parallaction/saveload.cpp:321
-msgid ""
-"ScummVM printed some warnings in your console window and can't guarantee all "
-"your files have been converted.\n"
-"\n"
-"Please report to the team."
-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."
-
-#: engines/pegasus/pegasus.cpp:679
-msgid "Invalid save file name"
-msgstr "Ungültiger Spielstandname"
-
-#: engines/pegasus/pegasus.cpp:2445
-msgid "Up/Zoom In/Move Forward/Open Doors"
-msgstr "Hoch/Hineinzoomen/Nach vorn/Türen öffnen"
-
-#: engines/pegasus/pegasus.cpp:2446
-msgid "Down/Zoom Out"
-msgstr "Runter/Hinauszoomen"
-
-#: engines/pegasus/pegasus.cpp:2449
-msgid "Display/Hide Inventory Tray"
-msgstr "Inventarleiste anzeigen/verbergen"
-
-#: engines/pegasus/pegasus.cpp:2450
-msgid "Display/Hide Biochip Tray"
-msgstr "Biochip-Leiste anzeigen/verbergen"
-
-#: engines/pegasus/pegasus.cpp:2451
-msgid "Action/Select"
-msgstr "Aktion/Auswählen"
-
-#: engines/pegasus/pegasus.cpp:2452
-msgid "Toggle Center Data Display"
-msgstr "Mittige Datenanzeige wechseln"
-
-#: engines/pegasus/pegasus.cpp:2453
-msgid "Display/Hide Info Screen"
-msgstr "Info-Bildschirm anzeigen/verbergen"
-
-#: engines/pegasus/pegasus.cpp:2454
-msgid "Display/Hide Pause Menu"
-msgstr "Pause-Menü anzeigen/verbergen"
-
-#: engines/pegasus/pegasus.cpp:2455
-msgid "???"
-msgstr "???"
-
-#: audio/fmopl.cpp:49
-msgid "MAME OPL emulator"
-msgstr "MAME-OPL-Emulator"
-
-#: audio/fmopl.cpp:51
-msgid "DOSBox OPL emulator"
-msgstr "DOSBox-OPL-Emulator"
-
-#: audio/mididrv.cpp:209
-#, c-format
-msgid ""
-"The selected audio device '%s' was not found (e.g. might be turned off or "
-"disconnected)."
-msgstr ""
-"Das ausgewählte Audiogerät \"%s\" wurde nicht gefunden (könnte "
-"beispielsweise ausgeschaltet oder nicht angeschlossen sein)."
-
-#: audio/mididrv.cpp:209 audio/mididrv.cpp:221 audio/mididrv.cpp:257
-#: audio/mididrv.cpp:272
-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:221
-#, c-format
-msgid ""
-"The selected audio device '%s' cannot be used. See log file for more "
-"information."
-msgstr ""
-"Das ausgewählte Audiogerät \"%s\" kann nicht verwendet werden. Schauen Sie "
-"für weitere Informationen in der Log-Datei nach."
-
-#: audio/mididrv.cpp:257
-#, c-format
-msgid ""
-"The preferred audio device '%s' was not found (e.g. might be turned off or "
-"disconnected)."
-msgstr ""
-"Das bevorzugte Audiogerät \"%s\" wurde nicht gefunden (könnte beispielsweise "
-"ausgeschaltet oder nicht angeschlossen sein)."
-
-#: audio/mididrv.cpp:272
-#, c-format
-msgid ""
-"The preferred audio device '%s' cannot be used. See log file for more "
-"information."
-msgstr ""
-"Das bevorzugte Audiogerät \"%s\" kann nicht verwendet werden. Schauen Sie "
-"für weitere Informationen in der Log-Datei nach."
-
-#: audio/null.h:43
-msgid "No music"
-msgstr "Keine Musik"
-
-#: audio/mods/paula.cpp:189
-msgid "Amiga Audio Emulator"
-msgstr "Amiga-Audio-Emulator"
-
-#: audio/softsynth/adlib.cpp:2284
-msgid "AdLib Emulator"
-msgstr "AdLib-Emulator"
-
-#: audio/softsynth/appleiigs.cpp:33
-msgid "Apple II GS Emulator (NOT IMPLEMENTED)"
-msgstr "Apple-II-GS-Emulator (NICHT INTEGRIERT)"
-
-#: audio/softsynth/sid.cpp:1430
-msgid "C64 Audio Emulator"
-msgstr "C64-Audio-Emulator"
-
-#: audio/softsynth/mt32.cpp:205
-msgid "Initializing MT-32 Emulator"
-msgstr "MT-32-Emulator wird gestartet"
-
-#: audio/softsynth/mt32.cpp:431
-msgid "MT-32 Emulator"
-msgstr "MT-32-Emulation"
-
-#: audio/softsynth/pcspk.cpp:139
-msgid "PC Speaker Emulator"
-msgstr "PC-Lautsprecher-Emulator"
-
-#: audio/softsynth/pcspk.cpp:158
-msgid "IBM PCjr Emulator"
-msgstr "IBM-PCjr-Emulator"
-
-#: backends/keymapper/remap-dialog.cpp:47
-msgid "Keymap:"
-msgstr "Tasten-Layout:"
-
-#: backends/keymapper/remap-dialog.cpp:66
-msgid " (Effective)"
-msgstr " (Aktuell)"
-
-#: backends/keymapper/remap-dialog.cpp:106
-msgid " (Active)"
-msgstr " (Aktiv)"
-
-#: backends/keymapper/remap-dialog.cpp:106
-msgid " (Blocked)"
-msgstr " (Blockiert)"
-
-#: backends/keymapper/remap-dialog.cpp:119
-msgid " (Global)"
-msgstr " (Global)"
-
-#: backends/keymapper/remap-dialog.cpp:127
-msgid " (Game)"
-msgstr " (Spiel)"
-
-#: backends/midi/windows.cpp:164
-msgid "Windows MIDI"
-msgstr "Windows MIDI"
-
-#: backends/platform/ds/arm9/source/dsoptions.cpp:57
-msgid "ScummVM Main Menu"
-msgstr "ScummVM-Hauptmenü"
-
-#: backends/platform/ds/arm9/source/dsoptions.cpp:63
-msgid "~L~eft handed mode"
-msgstr "~L~inke-Hand-Modus"
-
-#: backends/platform/ds/arm9/source/dsoptions.cpp:64
-msgid "~I~ndy fight controls"
-msgstr "~K~ampfsteuerung für Indiana Jones"
-
-#: backends/platform/ds/arm9/source/dsoptions.cpp:65
-msgid "Show mouse cursor"
-msgstr "Mauszeiger anzeigen"
-
-#: backends/platform/ds/arm9/source/dsoptions.cpp:66
-msgid "Snap to edges"
-msgstr "An Ecken anheften"
-
-#: backends/platform/ds/arm9/source/dsoptions.cpp:68
-msgid "Touch X Offset"
-msgstr "Zu X-Position gehen"
-
-#: backends/platform/ds/arm9/source/dsoptions.cpp:75
-msgid "Touch Y Offset"
-msgstr "Zu Y-Position gehen"
-
-#: backends/platform/ds/arm9/source/dsoptions.cpp:87
-msgid "Use laptop trackpad-style cursor control"
-msgstr "Den Trackpad-Style für Maussteuerung benutzen"
-
-#: backends/platform/ds/arm9/source/dsoptions.cpp:88
-msgid "Tap for left click, double tap right click"
-msgstr "Tippen für Linksklick, Doppeltippen für Rechtsklick"
-
-#: backends/platform/ds/arm9/source/dsoptions.cpp:90
-msgid "Sensitivity"
-msgstr "Empfindlichkeit"
-
-#: backends/platform/ds/arm9/source/dsoptions.cpp:99
-msgid "Initial top screen scale:"
-msgstr "Vergößerung des oberen Bildschirms:"
-
-#: backends/platform/ds/arm9/source/dsoptions.cpp:105
-msgid "Main screen scaling:"
-msgstr "Hauptbildschirm-Skalierung:"
-
-#: backends/platform/ds/arm9/source/dsoptions.cpp:107
-msgid "Hardware scale (fast, but low quality)"
-msgstr "Hardware-Skalierung (schnell, aber schlechte Qualität)"
-
-#: backends/platform/ds/arm9/source/dsoptions.cpp:108
-msgid "Software scale (good quality, but slower)"
-msgstr "Software-Skalierung (gute Qualität, aber langsamer)"
-
-#: backends/platform/ds/arm9/source/dsoptions.cpp:109
-msgid "Unscaled (you must scroll left and right)"
-msgstr "Nicht skalieren (Sie müssen nach links und nach rechts scrollen)"
-
-#: backends/platform/ds/arm9/source/dsoptions.cpp:111
-msgid "Brightness:"
-msgstr "Helligkeit:"
-
-#: backends/platform/ds/arm9/source/dsoptions.cpp:121
-msgid "High quality audio (slower) (reboot)"
-msgstr "Hohe Audioqualität (lansamer) (erfordert Neustart)"
-
-#: backends/platform/ds/arm9/source/dsoptions.cpp:122
-msgid "Disable power off"
-msgstr "Stromsparmodus abschalten"
-
-#: backends/platform/iphone/osys_events.cpp:300
-msgid "Mouse-click-and-drag mode enabled."
-msgstr "Maus-klick-und-zieh-Modus aktiviert."
-
-#: backends/platform/iphone/osys_events.cpp:302
-msgid "Mouse-click-and-drag mode disabled."
-msgstr "Maus-klick-und-zieh-Modus ausgeschaltet."
-
-#: backends/platform/iphone/osys_events.cpp:313
-msgid "Touchpad mode enabled."
-msgstr "Touchpad-Modus aktiviert."
-
-#: backends/platform/iphone/osys_events.cpp:315
-msgid "Touchpad mode disabled."
-msgstr "Touchpad-Modus ausgeschaltet."
-
-#: backends/platform/maemo/maemo.cpp:209
-msgid "Click Mode"
-msgstr "Klickmodus"
-
-#: backends/platform/maemo/maemo.cpp:215
-#: 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/maemo/maemo.cpp:218
-msgid "Middle Click"
-msgstr "Mittelklick"
-
-#: backends/platform/maemo/maemo.cpp:221
-#: backends/platform/symbian/src/SymbianActions.cpp:43
-#: backends/platform/wince/CEActionsSmartphone.cpp:44
-#: backends/platform/bada/form.cpp:273
-msgid "Right Click"
-msgstr "Rechtsklick"
-
-#: backends/platform/sdl/macosx/appmenu_osx.mm:77
-msgid "Hide ScummVM"
-msgstr "ScummVM ausblenden"
-
-#: backends/platform/sdl/macosx/appmenu_osx.mm:82
-msgid "Hide Others"
-msgstr "Andere ausblenden"
-
-#: backends/platform/sdl/macosx/appmenu_osx.mm:87
-msgid "Show All"
-msgstr "Alle einblenden"
-
-#: backends/platform/sdl/macosx/appmenu_osx.mm:109
-#: backends/platform/sdl/macosx/appmenu_osx.mm:120
-msgid "Window"
-msgstr "Fenster"
-
-#: backends/platform/sdl/macosx/appmenu_osx.mm:114
-msgid "Minimize"
-msgstr "Im Dock ablegen"
-
-#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:45
-msgid "Normal (no scaling)"
-msgstr "Normal (keine Skalierung)"
-
-#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:64
-msgctxt "lowres"
-msgid "Normal (no scaling)"
-msgstr "Normal ohn.Skalieren"
-
-#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2135
-#: backends/graphics/openglsdl/openglsdl-graphics.cpp:537
-msgid "Enabled aspect ratio correction"
-msgstr "Seitenverhältniskorrektur an"
-
-#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2141
-#: backends/graphics/openglsdl/openglsdl-graphics.cpp:542
-msgid "Disabled aspect ratio correction"
-msgstr "Seitenverhältniskorrektur aus"
-
-#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2196
-msgid "Active graphics filter:"
-msgstr "Aktiver Grafikfilter:"
-
-#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2238
-#: backends/graphics/openglsdl/openglsdl-graphics.cpp:481
-msgid "Windowed mode"
-msgstr "Fenstermodus"
-
-#: backends/graphics/opengl/opengl-graphics.cpp:135
-msgid "OpenGL Normal"
-msgstr "OpenGL: normal"
-
-#: backends/graphics/opengl/opengl-graphics.cpp:136
-msgid "OpenGL Conserve"
-msgstr "OpenGL: beibehalten"
-
-#: backends/graphics/opengl/opengl-graphics.cpp:137
-msgid "OpenGL Original"
-msgstr "OpenGL: original"
-
-#: backends/graphics/openglsdl/openglsdl-graphics.cpp:415
-msgid "Current display mode"
-msgstr "Aktueller Grafikmodus"
-
-#: backends/graphics/openglsdl/openglsdl-graphics.cpp:428
-msgid "Current scale"
-msgstr "Aktueller Vergrößerungsfaktor"
-
-#: backends/graphics/openglsdl/openglsdl-graphics.cpp:562
-msgid "Active filter mode: Linear"
-msgstr "Aktiver Filtermodus: linear"
-
-#: backends/graphics/openglsdl/openglsdl-graphics.cpp:564
-msgid "Active filter mode: Nearest"
-msgstr "Aktiver Filtermodus: nächste Nachbarn"
-
-#: backends/platform/symbian/src/SymbianActions.cpp:38
-#: backends/platform/wince/CEActionsSmartphone.cpp:39
-msgid "Up"
-msgstr "Hoch"
-
-#: backends/platform/symbian/src/SymbianActions.cpp:39
-#: backends/platform/wince/CEActionsSmartphone.cpp:40
-msgid "Down"
-msgstr "Runter"
-
-#: backends/platform/symbian/src/SymbianActions.cpp:40
-#: backends/platform/wince/CEActionsSmartphone.cpp:41
-msgid "Left"
-msgstr "Links"
-
-#: backends/platform/symbian/src/SymbianActions.cpp:41
-#: backends/platform/wince/CEActionsSmartphone.cpp:42
-msgid "Right"
-msgstr "Rechts"
-
-#: backends/platform/symbian/src/SymbianActions.cpp:46
-#: backends/platform/wince/CEActionsSmartphone.cpp:47
-msgid "Zone"
-msgstr "Zone"
-
-#: backends/platform/symbian/src/SymbianActions.cpp:47
-#: backends/platform/wince/CEActionsPocket.cpp:54
-#: backends/platform/wince/CEActionsSmartphone.cpp:48
-msgid "Multi Function"
-msgstr "Multifunktion"
-
-#: backends/platform/symbian/src/SymbianActions.cpp:48
-msgid "Swap character"
-msgstr "Figur wechseln"
-
-#: backends/platform/symbian/src/SymbianActions.cpp:49
-msgid "Skip text"
-msgstr "Text überspringen"
-
-#: backends/platform/symbian/src/SymbianActions.cpp:51
-msgid "Fast mode"
-msgstr "Schneller Modus"
-
-#: backends/platform/symbian/src/SymbianActions.cpp:53
-msgid "Debugger"
-msgstr "Debugger"
-
-#: backends/platform/symbian/src/SymbianActions.cpp:54
-msgid "Global menu"
-msgstr "Hauptmenü"
-
-#: backends/platform/symbian/src/SymbianActions.cpp:55
-msgid "Virtual keyboard"
-msgstr "Virtuelle Tastatur"
-
-#: backends/platform/symbian/src/SymbianActions.cpp:56
-msgid "Key mapper"
-msgstr "Tasten zuordnen"
-
-#: backends/events/symbiansdl/symbiansdl-events.cpp:184
-msgid "Do you want to quit ?"
-msgstr "Möchten Sie beenden?"
-
-#: backends/platform/wii/options.cpp:51
-msgid "Video"
-msgstr "Video"
-
-#: backends/platform/wii/options.cpp:54
-msgid "Current video mode:"
-msgstr "Aktueller Grafikmodus:"
-
-#: backends/platform/wii/options.cpp:56
-msgid "Double-strike"
-msgstr "Doppelzeilen (kein Zeilensprungverfahren)"
-
-#: backends/platform/wii/options.cpp:60
-msgid "Horizontal underscan:"
-msgstr "Horizontale Bildverkleinerung:"
+#~ msgctxt "lowres"
+#~ msgid "Mass Add..."
+#~ msgstr "Durchsuchen"
-#: backends/platform/wii/options.cpp:66
-msgid "Vertical underscan:"
-msgstr "Vertikale Bildverkleinerung:"
-
-#: backends/platform/wii/options.cpp:71
-msgid "Input"
-msgstr "Eingabe"
-
-#: backends/platform/wii/options.cpp:74
-msgid "GC Pad sensitivity:"
-msgstr "GC-Pad-Empfindlichkeit:"
-
-#: backends/platform/wii/options.cpp:80
-msgid "GC Pad acceleration:"
-msgstr "GC-Pad-Beschleunigung:"
-
-#: backends/platform/wii/options.cpp:86
-msgid "DVD"
-msgstr "DVD"
-
-#: backends/platform/wii/options.cpp:89 backends/platform/wii/options.cpp:101
-msgid "Status:"
-msgstr "Status:"
-
-#: backends/platform/wii/options.cpp:90 backends/platform/wii/options.cpp:102
-msgid "Unknown"
-msgstr "Unbekannt"
-
-#: backends/platform/wii/options.cpp:93
-msgid "Mount DVD"
-msgstr "DVD einbinden"
-
-#: backends/platform/wii/options.cpp:94
-msgid "Unmount DVD"
-msgstr "DVD aushängen"
-
-#: backends/platform/wii/options.cpp:98
-msgid "SMB"
-msgstr "SMB"
-
-#: backends/platform/wii/options.cpp:106
-msgid "Server:"
-msgstr "Server:"
-
-#: backends/platform/wii/options.cpp:110
-msgid "Share:"
-msgstr "Öffentliches Verzeichnis:"
+#~ msgid "Mass Add..."
+#~ msgstr "Durchsuchen"
-#: backends/platform/wii/options.cpp:114
-msgid "Username:"
-msgstr "Benutzername:"
-
-#: backends/platform/wii/options.cpp:118
-msgid "Password:"
-msgstr "Passwort:"
-
-#: backends/platform/wii/options.cpp:121
-msgid "Init network"
-msgstr "Netzwerk starten"
-
-#: backends/platform/wii/options.cpp:123
-msgid "Mount SMB"
-msgstr "SMB einbinden"
-
-#: backends/platform/wii/options.cpp:124
-msgid "Unmount SMB"
-msgstr "SMB aushängen"
-
-#: backends/platform/wii/options.cpp:143
-msgid "DVD Mounted successfully"
-msgstr "DVD erfolgreich eingebunden"
-
-#: backends/platform/wii/options.cpp:146
-msgid "Error while mounting the DVD"
-msgstr "Fehler beim Einbinden der DVD"
-
-#: backends/platform/wii/options.cpp:148
-msgid "DVD not mounted"
-msgstr "DVD nicht eingebunden"
-
-#: backends/platform/wii/options.cpp:161
-msgid "Network up, share mounted"
-msgstr "Netzwerk gestartet, öffentliches Verzeichnis eingebunden"
-
-#: backends/platform/wii/options.cpp:163
-msgid "Network up"
-msgstr "Netzwerk gestartet"
-
-#: backends/platform/wii/options.cpp:166
-msgid ", error while mounting the share"
-msgstr ", Fehler beim Einbinden des öffentlichen Verzeichnisses"
-
-#: backends/platform/wii/options.cpp:168
-msgid ", share not mounted"
-msgstr ", öffentliches Verzeichnis nicht eingebunden"
-
-#: backends/platform/wii/options.cpp:174
-msgid "Network down"
-msgstr "Netzwerk ist aus."
-
-#: backends/platform/wii/options.cpp:178
-msgid "Initializing network"
-msgstr "Netzwerk wird gestartet"
-
-#: backends/platform/wii/options.cpp:182
-msgid "Timeout while initializing network"
-msgstr "Zeitüberschreitung beim Starten des Netzwerks"
-
-#: backends/platform/wii/options.cpp:186
-#, c-format
-msgid "Network not initialized (%d)"
-msgstr "Netzwerk nicht gestartet (%d)"
-
-#: backends/platform/wince/CEActionsPocket.cpp:46
-msgid "Hide Toolbar"
-msgstr "Werkzeugleiste verbergen"
-
-#: backends/platform/wince/CEActionsPocket.cpp:47
-msgid "Show Keyboard"
-msgstr "Tastatur zeigen"
-
-#: backends/platform/wince/CEActionsPocket.cpp:48
-msgid "Sound on/off"
-msgstr "Ton ein/aus"
-
-#: backends/platform/wince/CEActionsPocket.cpp:49
-msgid "Right click"
-msgstr "Rechtsklick"
-
-#: backends/platform/wince/CEActionsPocket.cpp:50
-msgid "Show/Hide Cursor"
-msgstr "Cursor zeigen/verbergen"
-
-#: backends/platform/wince/CEActionsPocket.cpp:51
-msgid "Free look"
-msgstr "Freie Ansicht"
-
-#: backends/platform/wince/CEActionsPocket.cpp:52
-msgid "Zoom up"
-msgstr "Herauszoomen"
-
-#: backends/platform/wince/CEActionsPocket.cpp:53
-msgid "Zoom down"
-msgstr "Hineinzoomen"
-
-#: backends/platform/wince/CEActionsPocket.cpp:55
-#: backends/platform/wince/CEActionsSmartphone.cpp:49
-msgid "Bind Keys"
-msgstr "Tasten zuweisen"
-
-#: backends/platform/wince/CEActionsPocket.cpp:56
-msgid "Cursor Up"
-msgstr "Zeiger hoch"
-
-#: backends/platform/wince/CEActionsPocket.cpp:57
-msgid "Cursor Down"
-msgstr "Zeiger runter"
-
-#: backends/platform/wince/CEActionsPocket.cpp:58
-msgid "Cursor Left"
-msgstr "Zeiger nach links"
-
-#: backends/platform/wince/CEActionsPocket.cpp:59
-msgid "Cursor Right"
-msgstr "Zeiger nach rechts"
-
-#: 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:326
-#: backends/platform/wince/CEActionsSmartphone.cpp:287
-msgid " Are you sure you want to quit ? "
-msgstr " Möchten Sie wirklich beenden? "
-
-#: backends/platform/wince/CEActionsSmartphone.cpp:50
-msgid "Keyboard"
-msgstr "Tastatur"
-
-#: backends/platform/wince/CEActionsSmartphone.cpp:51
-msgid "Rotate"
-msgstr "Drehen"
-
-#: backends/platform/wince/CELauncherDialog.cpp:56
-msgid "Using SDL driver "
-msgstr "Verwende SDL-Treiber "
-
-#: backends/platform/wince/CELauncherDialog.cpp:60
-msgid "Display "
-msgstr "Anzeige "
-
-#: 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:515
-msgid "Map right click action"
-msgstr "Aktion \"Rechtsklick\" zuweisen"
-
-#: 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:528
-msgid "Map hide toolbar action"
-msgstr "Aktion \"Werkzeugleiste verbergen\" zuweisen"
-
-#: 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:541
-msgid "Map Zoom Up action (optional)"
-msgstr "Aktion \"Herauszoomen\" zuweisen (optional)"
-
-#: backends/platform/wince/wince-sdl.cpp:544
-msgid "Map Zoom Down action (optional)"
-msgstr "Aktion \"Hineinzoomen\" zuweisen (optional)"
-
-#: 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 ""
-"Vergessen Sie nicht, der Aktion \"Werkzeugleiste verbergen\" eine Taste "
-"zuzuweisen, um das ganze Inventar sehen zu können."
-
-#: backends/events/default/default-events.cpp:193
-msgid "Do you really want to return to the Launcher?"
-msgstr "Möchten Sie wirklich zur Spieleliste zurückkehren?"
-
-#: backends/events/default/default-events.cpp:193
-msgid "Launcher"
-msgstr "Spieleliste"
-
-#: backends/events/default/default-events.cpp:215
-msgid "Do you really want to quit?"
-msgstr "Möchten Sie wirklich beenden?"
-
-#: backends/events/gph/gph-events.cpp:386
-#: backends/events/gph/gph-events.cpp:429
-#: backends/events/openpandora/op-events.cpp:168
-msgid "Touchscreen 'Tap Mode' - Left Click"
-msgstr "Berührungsbildschirm-Tipp-Modus - Linksklick"
-
-#: backends/events/gph/gph-events.cpp:388
-#: backends/events/gph/gph-events.cpp:431
-#: backends/events/openpandora/op-events.cpp:170
-msgid "Touchscreen 'Tap Mode' - Right Click"
-msgstr "Berührungsbildschirm-Tipp-Modus - Rechtsklick"
-
-#: backends/events/gph/gph-events.cpp:390
-#: backends/events/gph/gph-events.cpp:433
-#: backends/events/openpandora/op-events.cpp:172
-msgid "Touchscreen 'Tap Mode' - Hover (No Click)"
-msgstr "Berührungsbildschirm-Tipp-Modus - schweben (kein Klick)"
-
-#: backends/events/gph/gph-events.cpp:410
-msgid "Maximum Volume"
-msgstr "Höchste Lautstärke"
-
-#: backends/events/gph/gph-events.cpp:412
-msgid "Increasing Volume"
-msgstr "Lautstärke höher"
-
-#: backends/events/gph/gph-events.cpp:418
-msgid "Minimal Volume"
-msgstr "Niedrigste Lautstärke"
+#~ msgid ""
+#~ "Turns off General MIDI mapping for games with Roland MT-32 soundtrack"
+#~ msgstr ""
+#~ "Schaltet die General-MIDI-Zuweisung für Spiele mit Roland-MT-32-Audiospur "
+#~ "aus."
-#: backends/events/gph/gph-events.cpp:420
-msgid "Decreasing Volume"
-msgstr "Lautstärke niedriger"
+#~ msgid "Standard (16bpp)"
+#~ msgstr "Standard (16bpp)"
-#: backends/events/openpandora/op-events.cpp:174
-msgid "Touchscreen 'Tap Mode' - Hover (DPad Clicks)"
-msgstr "Berührungsbildschirm-Tipp-Modus - schweben (DPad-Klicks)"
+#~ msgid "Alternative intro"
+#~ msgstr "Alternativer Vorspann"
-#: backends/updates/macosx/macosx-updates.mm:67
-msgid "Check for Updates..."
-msgstr "Suche nach Aktualisierungen..."
+#~ msgid "Use an alternative game intro (CD version only)"
+#~ msgstr "Verwendet einen alternativen Vorspann (nur bei CD-Version)."
-#: backends/platform/bada/form.cpp:269
-msgid "Right Click Once"
-msgstr "Einmal Rechtsklick"
+#~ msgid "MPEG2 cutscenes are no longer supported"
+#~ msgstr "MPEG2-Zwischensequenzen werden nicht mehr unterstützt."
-#: backends/platform/bada/form.cpp:277
-msgid "Move Only"
-msgstr "Nur bewegen"
+#~ msgid "OpenGL Normal"
+#~ msgstr "OpenGL: normal"
-#: backends/platform/bada/form.cpp:291
-msgid "Escape Key"
-msgstr "Escape-Taste"
+#~ msgid "OpenGL Conserve"
+#~ msgstr "OpenGL: beibehalten"
-#: backends/platform/bada/form.cpp:296
-msgid "Game Menu"
-msgstr "Spielmenü"
+#~ msgid "OpenGL Original"
+#~ msgstr "OpenGL: original"
-#: backends/platform/bada/form.cpp:301
-msgid "Show Keypad"
-msgstr "Ziffernblock zeigen"
+#~ msgid "Current display mode"
+#~ msgstr "Aktueller Grafikmodus"
-#: backends/platform/bada/form.cpp:309
-msgid "Control Mouse"
-msgstr "Maus steuern"
+#~ msgid "Current scale"
+#~ msgstr "Aktueller Vergrößerungsfaktor"
-#: backends/events/maemosdl/maemosdl-events.cpp:192
-msgid "Clicking Enabled"
-msgstr "Klicken aktiviert"
+#~ msgid "Active filter mode: Linear"
+#~ msgstr "Aktiver Filtermodus: linear"
-#: backends/events/maemosdl/maemosdl-events.cpp:192
-msgid "Clicking Disabled"
-msgstr "Klicken deaktiviert"
+#~ msgid "Active filter mode: Nearest"
+#~ msgstr "Aktiver Filtermodus: nächste Nachbarn"
#~ msgid "Enable Roland GS Mode"
#~ msgstr "Roland-GS-Modus"
diff --git a/po/es_ES.po b/po/es_ES.po
index 6bc001682d..b22254d196 100644
--- a/po/es_ES.po
+++ b/po/es_ES.po
@@ -1,5 +1,5 @@
# Spanish translation for ScummVM.
-# Copyright (C) 2010-2013 ScummVM Team
+# Copyright (C) 2010-2014 ScummVM Team
# This file is distributed under the same license as the ScummVM package.
# Tomás Maidagan, 2011.
#
@@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: ScummVM 1.4.0svn\n"
"Report-Msgid-Bugs-To: scummvm-devel@lists.sf.net\n"
-"POT-Creation-Date: 2013-04-24 13:35+0100\n"
+"POT-Creation-Date: 2014-06-07 23:06+0100\n"
"PO-Revision-Date: 2013-04-28 16:31+0100\n"
"Last-Translator: Tomás Maidagan\n"
"Language-Team: \n"
@@ -17,77 +17,77 @@ msgstr ""
"Content-Transfer-Encoding: 8bit\n"
"X-Generator: Poedit 1.5.5\n"
-#: gui/about.cpp:93
+#: gui/about.cpp:94
#, c-format
msgid "(built on %s)"
msgstr "(compilado el %s)"
-#: gui/about.cpp:100
+#: gui/about.cpp:101
msgid "Features compiled in:"
msgstr "Características incluidas:"
-#: gui/about.cpp:109
+#: gui/about.cpp:110
msgid "Available engines:"
msgstr "Motores disponibles:"
-#: gui/browser.cpp:67
+#: gui/browser.cpp:68
msgid "Show hidden files"
msgstr "Mostrar archivos ocultos"
-#: gui/browser.cpp:67
+#: gui/browser.cpp:68
msgid "Show files marked with the hidden attribute"
msgstr "Muestra los archivos marcados como ocultos"
-#: gui/browser.cpp:71
+#: gui/browser.cpp:72
msgid "Go up"
msgstr "Arriba"
-#: gui/browser.cpp:71 gui/browser.cpp:73
+#: gui/browser.cpp:72 gui/browser.cpp:74
msgid "Go to previous directory level"
msgstr "Ir al directorio anterior"
-#: gui/browser.cpp:73
+#: gui/browser.cpp:74
msgctxt "lowres"
msgid "Go up"
msgstr "Arriba"
-#: gui/browser.cpp:74 gui/chooser.cpp:45 gui/KeysDialog.cpp:43
-#: gui/launcher.cpp:345 gui/massadd.cpp:94 gui/options.cpp:1238
-#: gui/saveload-dialog.cpp:215 gui/saveload-dialog.cpp:275
-#: gui/saveload-dialog.cpp:545 gui/saveload-dialog.cpp:919
-#: gui/themebrowser.cpp:54 gui/fluidsynth-dialog.cpp:151
-#: engines/engine.cpp:447 engines/drascula/saveload.cpp:51
-#: engines/scumm/dialogs.cpp:190 engines/sword1/control.cpp:865
-#: engines/parallaction/saveload.cpp:274 backends/platform/wii/options.cpp:48
-#: backends/events/default/default-events.cpp:193
-#: backends/events/default/default-events.cpp:215
+#: gui/browser.cpp:75 gui/chooser.cpp:46 gui/KeysDialog.cpp:43
+#: gui/launcher.cpp:351 gui/massadd.cpp:95 gui/options.cpp:1239
+#: gui/saveload-dialog.cpp:216 gui/saveload-dialog.cpp:276
+#: gui/saveload-dialog.cpp:547 gui/saveload-dialog.cpp:922
+#: gui/themebrowser.cpp:55 gui/fluidsynth-dialog.cpp:152
+#: engines/engine.cpp:452 backends/platform/wii/options.cpp:48
+#: backends/events/default/default-events.cpp:196
+#: backends/events/default/default-events.cpp:218
+#: engines/drascula/saveload.cpp:49 engines/parallaction/saveload.cpp:274
+#: engines/scumm/dialogs.cpp:191 engines/sword1/control.cpp:865
msgid "Cancel"
msgstr "Cancelar"
-#: gui/browser.cpp:75 gui/chooser.cpp:46 gui/themebrowser.cpp:55
+#: gui/browser.cpp:76 gui/chooser.cpp:47 gui/themebrowser.cpp:56
msgid "Choose"
msgstr "Aceptar"
-#: gui/gui-manager.cpp:115 engines/scumm/help.cpp:125
-#: engines/scumm/help.cpp:140 engines/scumm/help.cpp:165
-#: engines/scumm/help.cpp:191 engines/scumm/help.cpp:209
-#: backends/keymapper/remap-dialog.cpp:52
+#: gui/gui-manager.cpp:117 backends/keymapper/remap-dialog.cpp:53
+#: engines/scumm/help.cpp:125 engines/scumm/help.cpp:140
+#: engines/scumm/help.cpp:165 engines/scumm/help.cpp:191
+#: engines/scumm/help.cpp:209
msgid "Close"
msgstr "Cerrar"
-#: gui/gui-manager.cpp:118
+#: gui/gui-manager.cpp:120
msgid "Mouse click"
msgstr "Clic de ratón"
-#: gui/gui-manager.cpp:122 base/main.cpp:301
+#: gui/gui-manager.cpp:124 base/main.cpp:319
msgid "Display keyboard"
msgstr "Mostrar el teclado"
-#: gui/gui-manager.cpp:126 base/main.cpp:305
+#: gui/gui-manager.cpp:128 base/main.cpp:323
msgid "Remap keys"
msgstr "Asignar teclas"
-#: gui/gui-manager.cpp:129 base/main.cpp:308
+#: gui/gui-manager.cpp:131 base/main.cpp:326
msgid "Toggle FullScreen"
msgstr "Activar/Desactivar pantalla completa"
@@ -99,21 +99,21 @@ msgstr "Elige la acción a asociar"
msgid "Map"
msgstr "Asignar"
-#: gui/KeysDialog.cpp:42 gui/launcher.cpp:346 gui/launcher.cpp:1001
-#: gui/launcher.cpp:1005 gui/massadd.cpp:91 gui/options.cpp:1239
-#: gui/saveload-dialog.cpp:920 gui/fluidsynth-dialog.cpp:152
-#: engines/engine.cpp:366 engines/engine.cpp:377
-#: engines/drascula/saveload.cpp:51 engines/scumm/dialogs.cpp:192
-#: engines/scumm/scumm.cpp:1778 engines/agos/animation.cpp:558
-#: engines/groovie/script.cpp:420 engines/sky/compact.cpp:131
-#: engines/sky/compact.cpp:141 engines/sword1/animation.cpp:519
-#: engines/sword1/animation.cpp:540 engines/sword1/animation.cpp:550
-#: engines/sword1/animation.cpp:557 engines/sword1/control.cpp:865
-#: engines/sword1/logic.cpp:1633 engines/sword2/animation.cpp:419
-#: engines/sword2/animation.cpp:439 engines/sword2/animation.cpp:449
-#: engines/sword2/animation.cpp:458 engines/parallaction/saveload.cpp:274
+#: gui/KeysDialog.cpp:42 gui/launcher.cpp:352 gui/launcher.cpp:1048
+#: gui/launcher.cpp:1052 gui/massadd.cpp:92 gui/options.cpp:1240
+#: gui/saveload-dialog.cpp:923 gui/fluidsynth-dialog.cpp:153
+#: engines/engine.cpp:371 engines/engine.cpp:382
#: backends/platform/wii/options.cpp:47
#: backends/platform/wince/CELauncherDialog.cpp:54
+#: engines/agos/animation.cpp:558 engines/drascula/saveload.cpp:49
+#: engines/groovie/script.cpp:399 engines/parallaction/saveload.cpp:274
+#: engines/scumm/dialogs.cpp:193 engines/scumm/scumm.cpp:1779
+#: engines/sky/compact.cpp:131 engines/sky/compact.cpp:141
+#: engines/sword1/animation.cpp:524 engines/sword1/animation.cpp:545
+#: engines/sword1/animation.cpp:561 engines/sword1/animation.cpp:569
+#: engines/sword1/control.cpp:865 engines/sword1/logic.cpp:1633
+#: engines/sword2/animation.cpp:425 engines/sword2/animation.cpp:445
+#: engines/sword2/animation.cpp:461 engines/sword2/animation.cpp:471
msgid "OK"
msgstr "Aceptar"
@@ -139,15 +139,15 @@ msgstr "Por favor, selecciona una acción"
msgid "Press the key to associate"
msgstr "Pulsa la tecla a asignar"
-#: gui/launcher.cpp:187
+#: gui/launcher.cpp:193
msgid "Game"
msgstr "Juego"
-#: gui/launcher.cpp:191
+#: gui/launcher.cpp:197
msgid "ID:"
msgstr "ID:"
-#: gui/launcher.cpp:191 gui/launcher.cpp:193 gui/launcher.cpp:194
+#: gui/launcher.cpp:197 gui/launcher.cpp:199 gui/launcher.cpp:200
msgid ""
"Short game identifier used for referring to savegames and running the game "
"from the command line"
@@ -155,29 +155,29 @@ msgstr ""
"Identificador usado para las partidas guardadas y para ejecutar el juego "
"desde la línea de comando"
-#: gui/launcher.cpp:193
+#: gui/launcher.cpp:199
msgctxt "lowres"
msgid "ID:"
msgstr "ID:"
-#: gui/launcher.cpp:198
+#: gui/launcher.cpp:204
msgid "Name:"
msgstr "Nombre:"
-#: gui/launcher.cpp:198 gui/launcher.cpp:200 gui/launcher.cpp:201
+#: gui/launcher.cpp:204 gui/launcher.cpp:206 gui/launcher.cpp:207
msgid "Full title of the game"
msgstr "Título completo del juego"
-#: gui/launcher.cpp:200
+#: gui/launcher.cpp:206
msgctxt "lowres"
msgid "Name:"
msgstr "Nom.:"
-#: gui/launcher.cpp:204
+#: gui/launcher.cpp:210
msgid "Language:"
msgstr "Idioma:"
-#: gui/launcher.cpp:204 gui/launcher.cpp:205
+#: gui/launcher.cpp:210 gui/launcher.cpp:211
msgid ""
"Language of the game. This will not turn your Spanish game version into "
"English"
@@ -185,286 +185,287 @@ msgstr ""
"Idioma del juego. No sirve para pasar al inglés la versión española de un "
"juego"
-#: gui/launcher.cpp:206 gui/launcher.cpp:220 gui/options.cpp:86
-#: gui/options.cpp:736 gui/options.cpp:749 gui/options.cpp:1209
-#: audio/null.cpp:40
+#: gui/launcher.cpp:212 gui/launcher.cpp:226 gui/options.cpp:87
+#: gui/options.cpp:737 gui/options.cpp:750 gui/options.cpp:1210
+#: audio/null.cpp:41
msgid "<default>"
msgstr "<por defecto>"
-#: gui/launcher.cpp:216
+#: gui/launcher.cpp:222
msgid "Platform:"
msgstr "Plataforma:"
-#: gui/launcher.cpp:216 gui/launcher.cpp:218 gui/launcher.cpp:219
+#: gui/launcher.cpp:222 gui/launcher.cpp:224 gui/launcher.cpp:225
msgid "Platform the game was originally designed for"
msgstr "Plataforma para la que se diseñó el juego"
-#: gui/launcher.cpp:218
+#: gui/launcher.cpp:224
msgctxt "lowres"
msgid "Platform:"
msgstr "Plat.:"
-#: gui/launcher.cpp:231
+#: gui/launcher.cpp:237
msgid "Engine"
msgstr "Motor"
-#: gui/launcher.cpp:239 gui/options.cpp:1072 gui/options.cpp:1089
+#: gui/launcher.cpp:245 gui/options.cpp:1073 gui/options.cpp:1090
msgid "Graphics"
msgstr "Gráficos"
-#: gui/launcher.cpp:239 gui/options.cpp:1072 gui/options.cpp:1089
+#: gui/launcher.cpp:245 gui/options.cpp:1073 gui/options.cpp:1090
msgid "GFX"
msgstr "GFX"
-#: gui/launcher.cpp:242
+#: gui/launcher.cpp:248
msgid "Override global graphic settings"
msgstr "Ignorar opciones gráficas generales"
-#: gui/launcher.cpp:244
+#: gui/launcher.cpp:250
msgctxt "lowres"
msgid "Override global graphic settings"
msgstr "Opciones gráficas específicas"
-#: gui/launcher.cpp:251 gui/options.cpp:1095
+#: gui/launcher.cpp:257 gui/options.cpp:1096
msgid "Audio"
msgstr "Sonido"
-#: gui/launcher.cpp:254
+#: gui/launcher.cpp:260
msgid "Override global audio settings"
msgstr "Ignorar opciones de sonido generales"
-#: gui/launcher.cpp:256
+#: gui/launcher.cpp:262
msgctxt "lowres"
msgid "Override global audio settings"
msgstr "Opciones de sonido específicas"
-#: gui/launcher.cpp:265 gui/options.cpp:1100
+#: gui/launcher.cpp:271 gui/options.cpp:1101
msgid "Volume"
msgstr "Volumen"
-#: gui/launcher.cpp:267 gui/options.cpp:1102
+#: gui/launcher.cpp:273 gui/options.cpp:1103
msgctxt "lowres"
msgid "Volume"
msgstr "Volumen"
-#: gui/launcher.cpp:270
+#: gui/launcher.cpp:276
msgid "Override global volume settings"
msgstr "Ignorar opciones de volumen generales"
-#: gui/launcher.cpp:272
+#: gui/launcher.cpp:278
msgctxt "lowres"
msgid "Override global volume settings"
msgstr "Opciones de volumen específicas"
-#: gui/launcher.cpp:280 gui/options.cpp:1110
+#: gui/launcher.cpp:286 gui/options.cpp:1111
msgid "MIDI"
msgstr "MIDI"
-#: gui/launcher.cpp:283
+#: gui/launcher.cpp:289
msgid "Override global MIDI settings"
msgstr "Ignorar opciones de MIDI generales"
-#: gui/launcher.cpp:285
+#: gui/launcher.cpp:291
msgctxt "lowres"
msgid "Override global MIDI settings"
msgstr "Opciones de MIDI específicas"
-#: gui/launcher.cpp:294 gui/options.cpp:1116
+#: gui/launcher.cpp:300 gui/options.cpp:1117
msgid "MT-32"
msgstr "MT-32"
-#: gui/launcher.cpp:297
+#: gui/launcher.cpp:303
msgid "Override global MT-32 settings"
msgstr "Ignorar opciones de MT-32 generales"
-#: gui/launcher.cpp:299
+#: gui/launcher.cpp:305
msgctxt "lowres"
msgid "Override global MT-32 settings"
msgstr "Opciones de MT-32 específicas"
-#: gui/launcher.cpp:308 gui/options.cpp:1123
+#: gui/launcher.cpp:314 gui/options.cpp:1124
msgid "Paths"
msgstr "Rutas"
-#: gui/launcher.cpp:310 gui/options.cpp:1125
+#: gui/launcher.cpp:316 gui/options.cpp:1126
msgctxt "lowres"
msgid "Paths"
msgstr "Rutas"
-#: gui/launcher.cpp:317
+#: gui/launcher.cpp:323
msgid "Game Path:"
msgstr "Juego:"
-#: gui/launcher.cpp:319
+#: gui/launcher.cpp:325
msgctxt "lowres"
msgid "Game Path:"
msgstr "Juego:"
-#: gui/launcher.cpp:324 gui/options.cpp:1149
+#: gui/launcher.cpp:330 gui/options.cpp:1150
msgid "Extra Path:"
msgstr "Adicional:"
-#: gui/launcher.cpp:324 gui/launcher.cpp:326 gui/launcher.cpp:327
+#: gui/launcher.cpp:330 gui/launcher.cpp:332 gui/launcher.cpp:333
msgid "Specifies path to additional data used the game"
msgstr "Especifica un directorio para datos adicionales del juego"
-#: gui/launcher.cpp:326 gui/options.cpp:1151
+#: gui/launcher.cpp:332 gui/options.cpp:1152
msgctxt "lowres"
msgid "Extra Path:"
msgstr "Adicional:"
-#: gui/launcher.cpp:333 gui/options.cpp:1133
+#: gui/launcher.cpp:339 gui/options.cpp:1134
msgid "Save Path:"
msgstr "Partidas:"
-#: gui/launcher.cpp:333 gui/launcher.cpp:335 gui/launcher.cpp:336
-#: gui/options.cpp:1133 gui/options.cpp:1135 gui/options.cpp:1136
+#: gui/launcher.cpp:339 gui/launcher.cpp:341 gui/launcher.cpp:342
+#: gui/options.cpp:1134 gui/options.cpp:1136 gui/options.cpp:1137
msgid "Specifies where your savegames are put"
msgstr "Especifica dónde guardar tus partidas"
-#: gui/launcher.cpp:335 gui/options.cpp:1135
+#: gui/launcher.cpp:341 gui/options.cpp:1136
msgctxt "lowres"
msgid "Save Path:"
msgstr "Partidas:"
-#: gui/launcher.cpp:354 gui/launcher.cpp:453 gui/launcher.cpp:511
-#: gui/launcher.cpp:565 gui/options.cpp:1144 gui/options.cpp:1152
-#: gui/options.cpp:1161 gui/options.cpp:1276 gui/options.cpp:1282
-#: gui/options.cpp:1290 gui/options.cpp:1320 gui/options.cpp:1326
-#: gui/options.cpp:1333 gui/options.cpp:1426 gui/options.cpp:1429
-#: gui/options.cpp:1441
+#: gui/launcher.cpp:360 gui/launcher.cpp:459 gui/launcher.cpp:517
+#: gui/launcher.cpp:571 gui/options.cpp:1145 gui/options.cpp:1153
+#: gui/options.cpp:1162 gui/options.cpp:1277 gui/options.cpp:1283
+#: gui/options.cpp:1291 gui/options.cpp:1321 gui/options.cpp:1327
+#: gui/options.cpp:1334 gui/options.cpp:1427 gui/options.cpp:1430
+#: gui/options.cpp:1442
msgctxt "path"
msgid "None"
msgstr "Ninguna"
-#: gui/launcher.cpp:359 gui/launcher.cpp:459 gui/launcher.cpp:569
-#: gui/options.cpp:1270 gui/options.cpp:1314 gui/options.cpp:1432
+#: gui/launcher.cpp:365 gui/launcher.cpp:465 gui/launcher.cpp:575
+#: gui/options.cpp:1271 gui/options.cpp:1315 gui/options.cpp:1433
#: backends/platform/wii/options.cpp:56
msgid "Default"
msgstr "Por defecto"
-#: gui/launcher.cpp:504 gui/options.cpp:1435
+#: gui/launcher.cpp:510 gui/options.cpp:1436
msgid "Select SoundFont"
msgstr "Selecciona un SoundFont"
-#: gui/launcher.cpp:523 gui/launcher.cpp:677
+#: gui/launcher.cpp:529 gui/launcher.cpp:682
msgid "Select directory with game data"
msgstr "Selecciona el directorio del juego"
-#: gui/launcher.cpp:541
+#: gui/launcher.cpp:547
msgid "Select additional game directory"
msgstr "Selecciona el directorio adicional"
-#: gui/launcher.cpp:553
+#: gui/launcher.cpp:559
msgid "Select directory for saved games"
msgstr "Selecciona el directorio para partidas guardadas"
-#: gui/launcher.cpp:580
+#: gui/launcher.cpp:586
msgid "This game ID is already taken. Please choose another one."
msgstr "Esta ID ya está siendo usada. Por favor, elige otra."
-#: gui/launcher.cpp:621 engines/dialogs.cpp:110
+#: gui/launcher.cpp:626 engines/dialogs.cpp:111
msgid "~Q~uit"
msgstr "~S~alir"
-#: gui/launcher.cpp:621 backends/platform/sdl/macosx/appmenu_osx.mm:95
+#: gui/launcher.cpp:626 backends/platform/sdl/macosx/appmenu_osx.mm:95
msgid "Quit ScummVM"
msgstr "Salir de ScummVM"
-#: gui/launcher.cpp:622
+#: gui/launcher.cpp:627
msgid "A~b~out..."
msgstr "Acerca ~d~e"
-#: gui/launcher.cpp:622 backends/platform/sdl/macosx/appmenu_osx.mm:69
+#: gui/launcher.cpp:627 backends/platform/sdl/macosx/appmenu_osx.mm:69
msgid "About ScummVM"
msgstr "Acerca de ScummVM"
-#: gui/launcher.cpp:623
+#: gui/launcher.cpp:628
msgid "~O~ptions..."
msgstr "~O~pciones..."
-#: gui/launcher.cpp:623
+#: gui/launcher.cpp:628
msgid "Change global ScummVM options"
msgstr "Cambiar opciones generales de ScummVM"
-#: gui/launcher.cpp:625
+#: gui/launcher.cpp:630
msgid "~S~tart"
msgstr "~J~ugar"
-#: gui/launcher.cpp:625
+#: gui/launcher.cpp:630
msgid "Start selected game"
msgstr "Jugar al juego seleccionado"
-#: gui/launcher.cpp:628
+#: gui/launcher.cpp:633
msgid "~L~oad..."
msgstr "~C~argar..."
-#: gui/launcher.cpp:628
+#: gui/launcher.cpp:633
msgid "Load savegame for selected game"
msgstr "Cargar partida del juego seleccionado"
-#: gui/launcher.cpp:633 gui/launcher.cpp:1120
+#: gui/launcher.cpp:638
msgid "~A~dd Game..."
msgstr "~A~ñadir juego..."
-#: gui/launcher.cpp:633 gui/launcher.cpp:640
+#: gui/launcher.cpp:638 gui/launcher.cpp:645
msgid "Hold Shift for Mass Add"
msgstr "Mantener pulsado Mayús para añadir varios juegos"
-#: gui/launcher.cpp:635
+#: gui/launcher.cpp:640
msgid "~E~dit Game..."
msgstr "~E~ditar juego..."
-#: gui/launcher.cpp:635 gui/launcher.cpp:642
+#: gui/launcher.cpp:640 gui/launcher.cpp:647
msgid "Change game options"
msgstr "Cambiar opciones de juego"
-#: gui/launcher.cpp:637
+#: gui/launcher.cpp:642
msgid "~R~emove Game"
msgstr "E~l~iminar juego"
-#: gui/launcher.cpp:637 gui/launcher.cpp:644
+#: gui/launcher.cpp:642 gui/launcher.cpp:649
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:640 gui/launcher.cpp:1120
+#: gui/launcher.cpp:645
msgctxt "lowres"
msgid "~A~dd Game..."
msgstr "~A~ñadir..."
-#: gui/launcher.cpp:642
+#: gui/launcher.cpp:647
msgctxt "lowres"
msgid "~E~dit Game..."
msgstr "~E~ditar..."
-#: gui/launcher.cpp:644
+#: gui/launcher.cpp:649
msgctxt "lowres"
msgid "~R~emove Game"
msgstr "E~l~iminar"
-#: gui/launcher.cpp:652
+#: gui/launcher.cpp:657
msgid "Search in game list"
msgstr "Buscar en la lista de juegos"
-#: gui/launcher.cpp:656 gui/launcher.cpp:1167
+#: gui/launcher.cpp:661 gui/launcher.cpp:1222
msgid "Search:"
msgstr "Buscar:"
-#: gui/launcher.cpp:680 engines/dialogs.cpp:114 engines/mohawk/myst.cpp:245
-#: engines/mohawk/riven.cpp:716 engines/cruise/menu.cpp:214
-#: engines/pegasus/pegasus.cpp:349
+#: gui/launcher.cpp:685 engines/dialogs.cpp:115 engines/cruise/menu.cpp:214
+#: engines/mohawk/myst.cpp:245 engines/mohawk/riven.cpp:718
+#: engines/pegasus/pegasus.cpp:353
msgid "Load game:"
msgstr "Cargar juego:"
-#: gui/launcher.cpp:680 engines/dialogs.cpp:114 engines/scumm/dialogs.cpp:188
-#: engines/mohawk/myst.cpp:245 engines/mohawk/riven.cpp:716
-#: engines/cruise/menu.cpp:214 engines/pegasus/pegasus.cpp:349
+#: gui/launcher.cpp:685 engines/dialogs.cpp:115
#: backends/platform/wince/CEActionsPocket.cpp:267
#: backends/platform/wince/CEActionsSmartphone.cpp:231
+#: engines/cruise/menu.cpp:214 engines/mohawk/myst.cpp:245
+#: engines/mohawk/riven.cpp:718 engines/pegasus/pegasus.cpp:353
+#: engines/scumm/dialogs.cpp:189
msgid "Load"
msgstr "Cargar"
-#: gui/launcher.cpp:788
+#: gui/launcher.cpp:792
msgid ""
"Do you really want to run the mass game detector? This could potentially add "
"a huge number of games."
@@ -472,7 +473,8 @@ msgstr ""
"¿Seguro que quieres ejecutar la detección masiva? Puede que se añada un gran "
"número de juegos."
-#: gui/launcher.cpp:789 gui/launcher.cpp:937 gui/fluidsynth-dialog.cpp:216
+#: gui/launcher.cpp:793 gui/launcher.cpp:941 gui/launcher.cpp:1000
+#: gui/fluidsynth-dialog.cpp:217
#: backends/events/symbiansdl/symbiansdl-events.cpp:184
#: backends/platform/wince/CEActionsPocket.cpp:326
#: backends/platform/wince/CEActionsSmartphone.cpp:287
@@ -480,7 +482,8 @@ msgstr ""
msgid "Yes"
msgstr "Sí"
-#: gui/launcher.cpp:789 gui/launcher.cpp:937 gui/fluidsynth-dialog.cpp:216
+#: gui/launcher.cpp:793 gui/launcher.cpp:941 gui/launcher.cpp:1000
+#: gui/fluidsynth-dialog.cpp:217
#: backends/events/symbiansdl/symbiansdl-events.cpp:184
#: backends/platform/wince/CEActionsPocket.cpp:326
#: backends/platform/wince/CEActionsSmartphone.cpp:287
@@ -488,193 +491,188 @@ msgstr "Sí"
msgid "No"
msgstr "No"
-#: gui/launcher.cpp:837
+#: gui/launcher.cpp:841
msgid "ScummVM couldn't open the specified directory!"
msgstr "¡ScummVM no ha podido abrir el directorio!"
-#: gui/launcher.cpp:849
+#: gui/launcher.cpp:853
msgid "ScummVM could not find any game in the specified directory!"
msgstr "¡ScummVM no ha encontrado ningún juego en el directorio!"
-#: gui/launcher.cpp:863
+#: gui/launcher.cpp:867
msgid "Pick the game:"
msgstr "Elige el juego:"
-#: gui/launcher.cpp:937
+#: gui/launcher.cpp:941
msgid "Do you really want to remove this game configuration?"
msgstr "¿Seguro que quieres eliminar la configuración de este juego?"
-#: gui/launcher.cpp:1001
+#: gui/launcher.cpp:999
+#, fuzzy
+msgid "Do you want to load savegame?"
+msgstr "¿Quieres cargar o guardar el juego?"
+
+#: gui/launcher.cpp:1048
msgid "This game does not support loading games from the launcher."
msgstr "Este juego no permite cargar partidas desde el lanzador."
-#: gui/launcher.cpp:1005
+#: gui/launcher.cpp:1052
msgid "ScummVM could not find any engine capable of running the selected game!"
msgstr ""
"¡ScummVM no ha podido encontrar ningún motor capaz de ejecutar el juego!"
-#: gui/launcher.cpp:1119
-msgctxt "lowres"
-msgid "Mass Add..."
-msgstr "Añad. varios"
-
-#: gui/launcher.cpp:1119
-msgid "Mass Add..."
-msgstr "Añadir varios..."
-
-#: gui/massadd.cpp:78 gui/massadd.cpp:81
+#: gui/massadd.cpp:79 gui/massadd.cpp:82
msgid "... progress ..."
msgstr "... progreso..."
-#: gui/massadd.cpp:258
+#: gui/massadd.cpp:259
msgid "Scan complete!"
msgstr "¡Búsqueda completada!"
-#: gui/massadd.cpp:261
+#: gui/massadd.cpp:262
#, c-format
msgid "Discovered %d new games, ignored %d previously added games."
msgstr "%d juegos nuevos encontrados. %d juegos ignorados (ya añadidos)."
-#: gui/massadd.cpp:265
+#: gui/massadd.cpp:266
#, c-format
msgid "Scanned %d directories ..."
msgstr "Se ha buscado en %d directorios..."
-#: gui/massadd.cpp:268
+#: gui/massadd.cpp:269
#, c-format
msgid "Discovered %d new games, ignored %d previously added games ..."
msgstr "%d juegos nuevos encontrados. %d juegos ignorados (ya añadidos)..."
-#: gui/options.cpp:84
+#: gui/options.cpp:85
msgid "Never"
msgstr "Nunca"
-#: gui/options.cpp:84
+#: gui/options.cpp:85
msgid "every 5 mins"
msgstr "cada 5 minutos"
-#: gui/options.cpp:84
+#: gui/options.cpp:85
msgid "every 10 mins"
msgstr "cada 10 minutos"
-#: gui/options.cpp:84
+#: gui/options.cpp:85
msgid "every 15 mins"
msgstr "cada 15 minutos"
-#: gui/options.cpp:84
+#: gui/options.cpp:85
msgid "every 30 mins"
msgstr "cada 30 minutos"
-#: gui/options.cpp:86
+#: gui/options.cpp:87
msgid "8 kHz"
msgstr "8 kHz"
-#: gui/options.cpp:86
+#: gui/options.cpp:87
msgid "11kHz"
msgstr "11kHz"
-#: gui/options.cpp:86
+#: gui/options.cpp:87
msgid "22 kHz"
msgstr "22 kHz"
-#: gui/options.cpp:86
+#: gui/options.cpp:87
msgid "44 kHz"
msgstr "44 kHz"
-#: gui/options.cpp:86
+#: gui/options.cpp:87
msgid "48 kHz"
msgstr "48 kHz"
-#: gui/options.cpp:254 gui/options.cpp:480 gui/options.cpp:581
-#: gui/options.cpp:650 gui/options.cpp:858
+#: gui/options.cpp:255 gui/options.cpp:481 gui/options.cpp:582
+#: gui/options.cpp:651 gui/options.cpp:859
msgctxt "soundfont"
msgid "None"
msgstr "Ninguno"
-#: gui/options.cpp:388
+#: gui/options.cpp:389
msgid "Failed to apply some of the graphic options changes:"
msgstr "Fallo al aplicar algunos cambios en las opciones gráficas:"
-#: gui/options.cpp:400
+#: gui/options.cpp:401
msgid "the video mode could not be changed."
msgstr "no se ha podido cambiar el modo de vídeo."
-#: gui/options.cpp:406
+#: gui/options.cpp:407
msgid "the fullscreen setting could not be changed"
msgstr "no se ha podido cambiar el ajuste de pantalla completa"
-#: gui/options.cpp:412
+#: gui/options.cpp:413
msgid "the aspect ratio setting could not be changed"
msgstr "no se ha podido cambiar el ajuste de corrección de aspecto"
-#: gui/options.cpp:733
+#: gui/options.cpp:734
msgid "Graphics mode:"
msgstr "Modo gráfico:"
-#: gui/options.cpp:747
+#: gui/options.cpp:748
msgid "Render mode:"
msgstr "Renderizado:"
-#: gui/options.cpp:747 gui/options.cpp:748
+#: gui/options.cpp:748 gui/options.cpp:749
msgid "Special dithering modes supported by some games"
msgstr "Modos especiales de expansión compatibles con algunos juegos"
-#: gui/options.cpp:759
-#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2236
-#: backends/graphics/openglsdl/openglsdl-graphics.cpp:476
+#: gui/options.cpp:760
+#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2249
msgid "Fullscreen mode"
msgstr "Pantalla completa"
-#: gui/options.cpp:762
+#: gui/options.cpp:763
msgid "Aspect ratio correction"
msgstr "Corrección de aspecto"
-#: gui/options.cpp:762
+#: gui/options.cpp:763
msgid "Correct aspect ratio for 320x200 games"
msgstr "Corregir relación de aspecto en juegos 320x200"
-#: gui/options.cpp:770
+#: gui/options.cpp:771
msgid "Preferred Device:"
msgstr "Disp. preferido:"
-#: gui/options.cpp:770
+#: gui/options.cpp:771
msgid "Music Device:"
msgstr "Disp. de música:"
-#: gui/options.cpp:770 gui/options.cpp:772
+#: gui/options.cpp:771 gui/options.cpp:773
msgid "Specifies preferred sound device or sound card emulator"
msgstr ""
"Especifica qué dispositivo de sonido o emulador de tarjeta de sonido "
"prefieres"
-#: gui/options.cpp:770 gui/options.cpp:772 gui/options.cpp:773
+#: gui/options.cpp:771 gui/options.cpp:773 gui/options.cpp:774
msgid "Specifies output sound device or sound card emulator"
msgstr ""
"Especifica el dispositivo de sonido o emulador de tarjeta de sonido de salida"
-#: gui/options.cpp:772
+#: gui/options.cpp:773
msgctxt "lowres"
msgid "Preferred Dev.:"
msgstr "Disp. preferido:"
-#: gui/options.cpp:772
+#: gui/options.cpp:773
msgctxt "lowres"
msgid "Music Device:"
msgstr "Disp. de música:"
-#: gui/options.cpp:799
+#: gui/options.cpp:800
msgid "AdLib emulator:"
msgstr "Emul. de AdLib:"
-#: gui/options.cpp:799 gui/options.cpp:800
+#: gui/options.cpp:800 gui/options.cpp:801
msgid "AdLib is used for music in many games"
msgstr "AdLib se usa para la música en muchos juegos"
-#: gui/options.cpp:810
+#: gui/options.cpp:811
msgid "Output rate:"
msgstr "Frec. de salida:"
-#: gui/options.cpp:810 gui/options.cpp:811
+#: gui/options.cpp:811 gui/options.cpp:812
msgid ""
"Higher value specifies better sound quality but may be not supported by your "
"soundcard"
@@ -682,68 +680,68 @@ msgstr ""
"Los valores más altos ofrecen mayor calidad, pero puede que tu tarjeta de "
"sonido no sea compatible"
-#: gui/options.cpp:821
+#: gui/options.cpp:822
msgid "GM Device:"
msgstr "Dispositivo GM:"
-#: gui/options.cpp:821
+#: gui/options.cpp:822
msgid "Specifies default sound device for General MIDI output"
msgstr "Especifica el dispositivo de salida General MIDI por defecto"
-#: gui/options.cpp:832
+#: gui/options.cpp:833
msgid "Don't use General MIDI music"
msgstr "No usar música General MIDI"
-#: gui/options.cpp:843 gui/options.cpp:909
+#: gui/options.cpp:844 gui/options.cpp:910
msgid "Use first available device"
msgstr "Utilizar el primer dispositivo disponible"
-#: gui/options.cpp:855
+#: gui/options.cpp:856
msgid "SoundFont:"
msgstr "SoundFont:"
-#: gui/options.cpp:855 gui/options.cpp:857 gui/options.cpp:858
+#: gui/options.cpp:856 gui/options.cpp:858 gui/options.cpp:859
msgid "SoundFont is supported by some audio cards, Fluidsynth and Timidity"
msgstr ""
"SoundFont es compatible con algunas tarjetas de sonido, con Fluidsynth y con "
"Timidity"
-#: gui/options.cpp:857
+#: gui/options.cpp:858
msgctxt "lowres"
msgid "SoundFont:"
msgstr "SoundFont:"
-#: gui/options.cpp:863
+#: gui/options.cpp:864
msgid "Mixed AdLib/MIDI mode"
msgstr "Modo AdLib/MIDI"
-#: gui/options.cpp:863
+#: gui/options.cpp:864
msgid "Use both MIDI and AdLib sound generation"
msgstr "Usar tanto MIDI como AdLib en la generación de sonido"
-#: gui/options.cpp:866
+#: gui/options.cpp:867
msgid "MIDI gain:"
msgstr "Ganancia MIDI:"
-#: gui/options.cpp:873
+#: gui/options.cpp:874
msgid "FluidSynth Settings"
msgstr "Opciones de FluidSynth"
-#: gui/options.cpp:880
+#: gui/options.cpp:881
msgid "MT-32 Device:"
msgstr "Disp. MT-32:"
-#: gui/options.cpp:880
+#: gui/options.cpp:881
msgid "Specifies default sound device for Roland MT-32/LAPC1/CM32l/CM64 output"
msgstr ""
"Especifica el dispositivo de sonido para la salida Roland MT-32/LAPC1/CM32l/"
"CM64 por defecto"
-#: gui/options.cpp:885
+#: gui/options.cpp:886
msgid "True Roland MT-32 (disable GM emulation)"
msgstr "Roland MT-32 auténtica (desactivar emulación GM)"
-#: gui/options.cpp:885 gui/options.cpp:887
+#: gui/options.cpp:886 gui/options.cpp:888
msgid ""
"Check if you want to use your real hardware Roland-compatible sound device "
"connected to your computer"
@@ -751,191 +749,194 @@ msgstr ""
"Marcar si se quiere usar un dispositivo de sonido real conectado al "
"ordenador y compatible con Roland"
-#: gui/options.cpp:887
+#: gui/options.cpp:888
msgctxt "lowres"
msgid "True Roland MT-32 (no GM emulation)"
msgstr "Roland MT-32 real (sin emulación GM)"
-#: gui/options.cpp:890
-msgid "Roland GS Mode (disable GM mapping)"
+#: gui/options.cpp:891
+#, fuzzy
+msgid "Roland GS Device (enable MT-32 mappings)"
msgstr "Modo Roland GS (desactivar conversión GM)"
-#: gui/options.cpp:890
-msgid "Turns off General MIDI mapping for games with Roland MT-32 soundtrack"
-msgstr "Desactiva la conversión General MIDI en juegos con sonido Roland MT-32"
+#: gui/options.cpp:891
+msgid ""
+"Check if you want to enable patch mappings to emulate an MT-32 on a Roland "
+"GS device"
+msgstr ""
-#: gui/options.cpp:899
+#: gui/options.cpp:900
msgid "Don't use Roland MT-32 music"
msgstr "No usar música Roland MT-32"
-#: gui/options.cpp:926
+#: gui/options.cpp:927
msgid "Text and Speech:"
msgstr "Texto y voces:"
-#: gui/options.cpp:930 gui/options.cpp:940
+#: gui/options.cpp:931 gui/options.cpp:941
msgid "Speech"
msgstr "Voces"
-#: gui/options.cpp:931 gui/options.cpp:941
+#: gui/options.cpp:932 gui/options.cpp:942
msgid "Subtitles"
msgstr "Subtítulos"
-#: gui/options.cpp:932
+#: gui/options.cpp:933
msgid "Both"
msgstr "Ambos"
-#: gui/options.cpp:934
+#: gui/options.cpp:935
msgid "Subtitle speed:"
msgstr "Vel. de subtítulos:"
-#: gui/options.cpp:936
+#: gui/options.cpp:937
msgctxt "lowres"
msgid "Text and Speech:"
msgstr "Texto y voces:"
-#: gui/options.cpp:940
+#: gui/options.cpp:941
msgid "Spch"
msgstr "Voz"
-#: gui/options.cpp:941
+#: gui/options.cpp:942
msgid "Subs"
msgstr "Subt"
-#: gui/options.cpp:942
+#: gui/options.cpp:943
msgctxt "lowres"
msgid "Both"
msgstr "V&S"
-#: gui/options.cpp:942
+#: gui/options.cpp:943
msgid "Show subtitles and play speech"
msgstr "Reproducir voces y subtítulos"
-#: gui/options.cpp:944
+#: gui/options.cpp:945
msgctxt "lowres"
msgid "Subtitle speed:"
msgstr "Vel. de subt.:"
-#: gui/options.cpp:960
+#: gui/options.cpp:961
msgid "Music volume:"
msgstr "Música:"
-#: gui/options.cpp:962
+#: gui/options.cpp:963
msgctxt "lowres"
msgid "Music volume:"
msgstr "Música:"
-#: gui/options.cpp:969
+#: gui/options.cpp:970
msgid "Mute All"
msgstr "Silenciar"
-#: gui/options.cpp:972
+#: gui/options.cpp:973
msgid "SFX volume:"
msgstr "Efectos:"
-#: gui/options.cpp:972 gui/options.cpp:974 gui/options.cpp:975
+#: gui/options.cpp:973 gui/options.cpp:975 gui/options.cpp:976
msgid "Special sound effects volume"
msgstr "Volumen de los efectos de sonido"
-#: gui/options.cpp:974
+#: gui/options.cpp:975
msgctxt "lowres"
msgid "SFX volume:"
msgstr "Efectos:"
-#: gui/options.cpp:982
+#: gui/options.cpp:983
msgid "Speech volume:"
msgstr "Voces:"
-#: gui/options.cpp:984
+#: gui/options.cpp:985
msgctxt "lowres"
msgid "Speech volume:"
msgstr "Voces:"
-#: gui/options.cpp:1141
+#: gui/options.cpp:1142
msgid "Theme Path:"
msgstr "Temas:"
-#: gui/options.cpp:1143
+#: gui/options.cpp:1144
msgctxt "lowres"
msgid "Theme Path:"
msgstr "Temas:"
-#: gui/options.cpp:1149 gui/options.cpp:1151 gui/options.cpp:1152
+#: gui/options.cpp:1150 gui/options.cpp:1152 gui/options.cpp:1153
msgid "Specifies path to additional data used by all games or ScummVM"
msgstr "Especifica el directorio adicional usado por los juegos y ScummVM"
-#: gui/options.cpp:1158
+#: gui/options.cpp:1159
msgid "Plugins Path:"
msgstr "Plugins:"
-#: gui/options.cpp:1160
+#: gui/options.cpp:1161
msgctxt "lowres"
msgid "Plugins Path:"
msgstr "Plugins:"
-#: gui/options.cpp:1169 gui/fluidsynth-dialog.cpp:137
+#: gui/options.cpp:1170 gui/fluidsynth-dialog.cpp:138
msgid "Misc"
msgstr "Otras"
-#: gui/options.cpp:1171
+#: gui/options.cpp:1172
msgctxt "lowres"
msgid "Misc"
msgstr "Otras"
-#: gui/options.cpp:1173
+#: gui/options.cpp:1174
msgid "Theme:"
msgstr "Tema:"
-#: gui/options.cpp:1177
+#: gui/options.cpp:1178
msgid "GUI Renderer:"
msgstr "Interfaz:"
-#: gui/options.cpp:1189
+#: gui/options.cpp:1190
msgid "Autosave:"
msgstr "Autoguardado:"
-#: gui/options.cpp:1191
+#: gui/options.cpp:1192
msgctxt "lowres"
msgid "Autosave:"
msgstr "Autoguardado:"
-#: gui/options.cpp:1199
+#: gui/options.cpp:1200
msgid "Keys"
msgstr "Teclas"
-#: gui/options.cpp:1206
+#: gui/options.cpp:1207
msgid "GUI Language:"
msgstr "Idioma:"
-#: gui/options.cpp:1206
+#: gui/options.cpp:1207
msgid "Language of ScummVM GUI"
msgstr "Idioma de la interfaz de ScummVM"
-#: gui/options.cpp:1365
+#: gui/options.cpp:1366
msgid "You have to restart ScummVM before your changes will take effect."
msgstr "Tienes que reiniciar ScummVM para aplicar los cambios."
-#: gui/options.cpp:1378
+#: gui/options.cpp:1379
msgid "Select directory for savegames"
msgstr "Selecciona el directorio de guardado"
-#: gui/options.cpp:1385
+#: gui/options.cpp:1386
msgid "The chosen directory cannot be written to. Please select another one."
msgstr ""
"No se puede escribir en el directorio elegido. Por favor, selecciona otro."
-#: gui/options.cpp:1394
+#: gui/options.cpp:1395
msgid "Select directory for GUI themes"
msgstr "Selecciona el directorio de temas"
-#: gui/options.cpp:1404
+#: gui/options.cpp:1405
msgid "Select directory for extra files"
msgstr "Selecciona el directorio adicional"
-#: gui/options.cpp:1415
+#: gui/options.cpp:1416
msgid "Select directory for plugins"
msgstr "Selecciona el directorio de plugins"
-#: gui/options.cpp:1468
+#: gui/options.cpp:1469
msgid ""
"The theme you selected does not support your current language. If you want "
"to use this theme you need to switch to another language first."
@@ -943,224 +944,227 @@ msgstr ""
"El tema seleccionado no es compatible con el idioma actual. Si quieres usar "
"este tema debes cambiar a otro idioma primero."
-#: gui/saveload-dialog.cpp:166
+#: gui/saveload-dialog.cpp:167
msgid "List view"
msgstr "Modo lista"
-#: gui/saveload-dialog.cpp:167
+#: gui/saveload-dialog.cpp:168
msgid "Grid view"
msgstr "Modo mosaico"
-#: gui/saveload-dialog.cpp:210 gui/saveload-dialog.cpp:358
+#: gui/saveload-dialog.cpp:211 gui/saveload-dialog.cpp:360
msgid "No date saved"
msgstr "No hay fecha guardada"
-#: gui/saveload-dialog.cpp:211 gui/saveload-dialog.cpp:359
+#: gui/saveload-dialog.cpp:212 gui/saveload-dialog.cpp:361
msgid "No time saved"
msgstr "No hay hora guardada"
-#: gui/saveload-dialog.cpp:212 gui/saveload-dialog.cpp:360
+#: gui/saveload-dialog.cpp:213 gui/saveload-dialog.cpp:362
msgid "No playtime saved"
msgstr "No hay tiempo guardado"
-#: gui/saveload-dialog.cpp:219 gui/saveload-dialog.cpp:275
+#: gui/saveload-dialog.cpp:220 gui/saveload-dialog.cpp:276
msgid "Delete"
msgstr "Borrar"
-#: gui/saveload-dialog.cpp:274
+#: gui/saveload-dialog.cpp:275
msgid "Do you really want to delete this savegame?"
msgstr "¿Seguro que quieres borrar esta partida?"
-#: gui/saveload-dialog.cpp:383 gui/saveload-dialog.cpp:872
+#: gui/saveload-dialog.cpp:385 gui/saveload-dialog.cpp:875
msgid "Date: "
msgstr "Fecha: "
-#: gui/saveload-dialog.cpp:387 gui/saveload-dialog.cpp:878
+#: gui/saveload-dialog.cpp:389 gui/saveload-dialog.cpp:881
msgid "Time: "
msgstr "Hora: "
-#: gui/saveload-dialog.cpp:393 gui/saveload-dialog.cpp:886
+#: gui/saveload-dialog.cpp:395 gui/saveload-dialog.cpp:889
msgid "Playtime: "
msgstr "Tiempo: "
-#: gui/saveload-dialog.cpp:406 gui/saveload-dialog.cpp:494
+#: gui/saveload-dialog.cpp:408 gui/saveload-dialog.cpp:496
msgid "Untitled savestate"
msgstr "Partida sin nombre"
-#: gui/saveload-dialog.cpp:546
+#: gui/saveload-dialog.cpp:548
msgid "Next"
msgstr "Siguiente"
-#: gui/saveload-dialog.cpp:549
+#: gui/saveload-dialog.cpp:551
msgid "Prev"
msgstr "Anterior"
-#: gui/saveload-dialog.cpp:736
+#: gui/saveload-dialog.cpp:739
msgid "New Save"
msgstr "Guardar"
-#: gui/saveload-dialog.cpp:736
+#: gui/saveload-dialog.cpp:739
msgid "Create a new save game"
msgstr "Guarda una nueva partida"
-#: gui/saveload-dialog.cpp:865
+#: gui/saveload-dialog.cpp:868
msgid "Name: "
msgstr "Nombre:"
-#: gui/saveload-dialog.cpp:937
+#: gui/saveload-dialog.cpp:940
#, c-format
msgid "Enter a description for slot %d:"
msgstr "Introduce una descripción para la ranura %d:"
-#: gui/themebrowser.cpp:44
+#: gui/themebrowser.cpp:45
msgid "Select a Theme"
msgstr "Selecciona un tema"
-#: gui/ThemeEngine.cpp:337
+#: gui/ThemeEngine.cpp:347
msgid "Disabled GFX"
msgstr "GFX desactivados"
-#: gui/ThemeEngine.cpp:337
+#: gui/ThemeEngine.cpp:347
msgctxt "lowres"
msgid "Disabled GFX"
msgstr "GFX desactivados"
-#: gui/ThemeEngine.cpp:338
-msgid "Standard Renderer (16bpp)"
+#: gui/ThemeEngine.cpp:348
+#, fuzzy
+msgid "Standard Renderer"
msgstr "Estándar (16bpp)"
-#: gui/ThemeEngine.cpp:338
-msgid "Standard (16bpp)"
-msgstr "Estándar (16bpp)"
+#: gui/ThemeEngine.cpp:348 engines/scumm/dialogs.cpp:659
+msgid "Standard"
+msgstr "Estándar"
-#: gui/ThemeEngine.cpp:340
-msgid "Antialiased Renderer (16bpp)"
+#: gui/ThemeEngine.cpp:350
+#, fuzzy
+msgid "Antialiased Renderer"
msgstr "Suavizado (16bpp)"
-#: gui/ThemeEngine.cpp:340
-msgid "Antialiased (16bpp)"
+#: gui/ThemeEngine.cpp:350
+#, fuzzy
+msgid "Antialiased"
msgstr "Suavizado (16bpp)"
-#: gui/widget.cpp:322 gui/widget.cpp:324 gui/widget.cpp:330 gui/widget.cpp:332
+#: gui/widget.cpp:323 gui/widget.cpp:325 gui/widget.cpp:331 gui/widget.cpp:333
msgid "Clear value"
msgstr "Eliminar valor"
-#: gui/fluidsynth-dialog.cpp:67
+#: gui/fluidsynth-dialog.cpp:68
msgid "Reverb"
msgstr "Reverberación"
-#: gui/fluidsynth-dialog.cpp:69 gui/fluidsynth-dialog.cpp:101
+#: gui/fluidsynth-dialog.cpp:70 gui/fluidsynth-dialog.cpp:102
msgid "Active"
msgstr "Activa"
-#: gui/fluidsynth-dialog.cpp:71
+#: gui/fluidsynth-dialog.cpp:72
msgid "Room:"
msgstr "Sala:"
-#: gui/fluidsynth-dialog.cpp:78
+#: gui/fluidsynth-dialog.cpp:79
msgid "Damp:"
msgstr "Atenuación:"
-#: gui/fluidsynth-dialog.cpp:85
+#: gui/fluidsynth-dialog.cpp:86
msgid "Width:"
msgstr "Amplitud"
-#: gui/fluidsynth-dialog.cpp:92 gui/fluidsynth-dialog.cpp:110
+#: gui/fluidsynth-dialog.cpp:93 gui/fluidsynth-dialog.cpp:111
msgid "Level:"
msgstr "Nivel:"
-#: gui/fluidsynth-dialog.cpp:99
+#: gui/fluidsynth-dialog.cpp:100
msgid "Chorus"
msgstr "Coro"
-#: gui/fluidsynth-dialog.cpp:103
+#: gui/fluidsynth-dialog.cpp:104
msgid "N:"
msgstr "N:"
-#: gui/fluidsynth-dialog.cpp:117
+#: gui/fluidsynth-dialog.cpp:118
msgid "Speed:"
msgstr "Velocidad:"
-#: gui/fluidsynth-dialog.cpp:124
+#: gui/fluidsynth-dialog.cpp:125
msgid "Depth:"
msgstr "Profundidad:"
-#: gui/fluidsynth-dialog.cpp:131
+#: gui/fluidsynth-dialog.cpp:132
msgid "Type:"
msgstr "Tipo"
-#: gui/fluidsynth-dialog.cpp:134
+#: gui/fluidsynth-dialog.cpp:135
msgid "Sine"
msgstr "Seno"
-#: gui/fluidsynth-dialog.cpp:135
+#: gui/fluidsynth-dialog.cpp:136
msgid "Triangle"
msgstr "Triángulo"
-#: gui/fluidsynth-dialog.cpp:139
+#: gui/fluidsynth-dialog.cpp:140
msgid "Interpolation:"
msgstr "Interpolación:"
-#: gui/fluidsynth-dialog.cpp:142
+#: gui/fluidsynth-dialog.cpp:143
msgid "None (fastest)"
msgstr "Ninguna (la más rápida)"
-#: gui/fluidsynth-dialog.cpp:143
+#: gui/fluidsynth-dialog.cpp:144
msgid "Linear"
msgstr "Lineal"
-#: gui/fluidsynth-dialog.cpp:144
+#: gui/fluidsynth-dialog.cpp:145
msgid "Fourth-order"
msgstr "Cuarto grado"
-#: gui/fluidsynth-dialog.cpp:145
+#: gui/fluidsynth-dialog.cpp:146
msgid "Seventh-order"
msgstr "Séptimo grado"
-#: gui/fluidsynth-dialog.cpp:149
+#: gui/fluidsynth-dialog.cpp:150
msgid "Reset"
msgstr "Reiniciar"
-#: gui/fluidsynth-dialog.cpp:149
+#: gui/fluidsynth-dialog.cpp:150
msgid "Reset all FluidSynth settings to their default values."
msgstr "Vuelve a los valores por defecto de las opciones de FluidSynth"
-#: gui/fluidsynth-dialog.cpp:216
+#: gui/fluidsynth-dialog.cpp:217
msgid ""
"Do you really want to reset all FluidSynth settings to their default values?"
msgstr ""
"¿Seguro que quieres volver a los valores por defecto de las opciones de "
"FluidSynth?"
-#: base/main.cpp:210
+#: base/main.cpp:228
#, c-format
msgid "Engine does not support debug level '%s'"
msgstr "El motor no es compatible con el nivel de debug '%s'"
-#: base/main.cpp:288
+#: base/main.cpp:306
msgid "Menu"
msgstr "Menú"
-#: base/main.cpp:291 backends/platform/symbian/src/SymbianActions.cpp:45
+#: base/main.cpp:309 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:294 backends/platform/symbian/src/SymbianActions.cpp:50
+#: base/main.cpp:312 backends/platform/symbian/src/SymbianActions.cpp:50
#: backends/platform/wince/CEActionsPocket.cpp:42
msgid "Pause"
msgstr "Pausar"
-#: base/main.cpp:297
+#: base/main.cpp:315
msgid "Skip line"
msgstr "Saltar frase"
-#: base/main.cpp:468
+#: base/main.cpp:507
msgid "Error running game:"
msgstr "Error al ejecutar el juego:"
-#: base/main.cpp:492
+#: base/main.cpp:536
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"
@@ -1228,72 +1232,72 @@ msgstr "Cancel·lat per l'usuari"
msgid "Unknown error"
msgstr "Error desconocido"
-#: engines/advancedDetector.cpp:316
+#: engines/advancedDetector.cpp:317
#, c-format
msgid "The game in '%s' seems to be unknown."
msgstr "El juego en '%s' parece ser desconocido."
-#: engines/advancedDetector.cpp:317
+#: engines/advancedDetector.cpp:318
msgid "Please, report the following data to the ScummVM team along with name"
msgstr "Por favor, envía al equipo de ScummVM esta información junto al nombre"
-#: engines/advancedDetector.cpp:319
+#: engines/advancedDetector.cpp:320
msgid "of the game you tried to add and its version/language/etc.:"
msgstr "del juego que has intentado añadir y su versión/idioma/etc.:"
-#: engines/dialogs.cpp:84
+#: engines/dialogs.cpp:85
msgid "~R~esume"
msgstr "~R~eanudar"
-#: engines/dialogs.cpp:86
+#: engines/dialogs.cpp:87
msgid "~L~oad"
msgstr "~C~argar"
-#: engines/dialogs.cpp:90
+#: engines/dialogs.cpp:91
msgid "~S~ave"
msgstr "~G~uardar"
-#: engines/dialogs.cpp:94
+#: engines/dialogs.cpp:95
msgid "~O~ptions"
msgstr "~O~pciones"
-#: engines/dialogs.cpp:99
+#: engines/dialogs.cpp:100
msgid "~H~elp"
msgstr "~A~yuda"
-#: engines/dialogs.cpp:101
+#: engines/dialogs.cpp:102
msgid "~A~bout"
msgstr "Acerca ~d~e"
-#: engines/dialogs.cpp:104 engines/dialogs.cpp:180
+#: engines/dialogs.cpp:105 engines/dialogs.cpp:181
msgid "~R~eturn to Launcher"
msgstr "~V~olver al lanzador"
-#: engines/dialogs.cpp:106 engines/dialogs.cpp:182
+#: engines/dialogs.cpp:107 engines/dialogs.cpp:183
msgctxt "lowres"
msgid "~R~eturn to Launcher"
msgstr "~V~olver al lanzador"
-#: engines/dialogs.cpp:115 engines/agi/saveload.cpp:803
-#: engines/drascula/saveload.cpp:338 engines/cruise/menu.cpp:212
-#: engines/sci/engine/kfile.cpp:742 engines/toltecs/menu.cpp:284
-#: engines/pegasus/pegasus.cpp:373
+#: engines/dialogs.cpp:116 engines/agi/saveload.cpp:803
+#: engines/cruise/menu.cpp:212 engines/drascula/saveload.cpp:336
+#: engines/neverhood/menumodule.cpp:873 engines/pegasus/pegasus.cpp:377
+#: engines/sci/engine/kfile.cpp:758 engines/toltecs/menu.cpp:281
msgid "Save game:"
msgstr "Guardar partida"
-#: engines/dialogs.cpp:115 engines/agi/saveload.cpp:803
-#: engines/drascula/saveload.cpp:338 engines/scumm/dialogs.cpp:187
-#: engines/cruise/menu.cpp:212 engines/sci/engine/kfile.cpp:742
-#: engines/toltecs/menu.cpp:284 engines/pegasus/pegasus.cpp:373
-#: backends/platform/symbian/src/SymbianActions.cpp:44
+#: engines/dialogs.cpp:116 backends/platform/symbian/src/SymbianActions.cpp:44
#: backends/platform/wince/CEActionsPocket.cpp:43
#: backends/platform/wince/CEActionsPocket.cpp:267
#: backends/platform/wince/CEActionsSmartphone.cpp:45
#: backends/platform/wince/CEActionsSmartphone.cpp:231
+#: engines/agi/saveload.cpp:803 engines/cruise/menu.cpp:212
+#: engines/drascula/saveload.cpp:336 engines/neverhood/menumodule.cpp:873
+#: engines/pegasus/pegasus.cpp:377 engines/sci/engine/kfile.cpp:758
+#: engines/scumm/dialogs.cpp:188 engines/toltecs/menu.cpp:281
msgid "Save"
msgstr "Guardar"
-#: engines/dialogs.cpp:144
+#: engines/dialogs.cpp:145
msgid ""
"Sorry, this engine does not currently provide in-game help. Please consult "
"the README for basic information, and for instructions on how to obtain "
@@ -1303,7 +1307,7 @@ msgstr ""
"consulta el archivo README para encontrar información básica e instrucciones "
"para obtener más ayuda."
-#: engines/dialogs.cpp:228
+#: engines/dialogs.cpp:234 engines/pegasus/pegasus.cpp:393
#, c-format
msgid ""
"Gamestate save failed (%s)! Please consult the README for basic information, "
@@ -1313,37 +1317,37 @@ msgstr ""
"archivo README para encontrar información básica e instrucciones sobre cómo "
"obtener más ayuda."
-#: engines/dialogs.cpp:301 engines/mohawk/dialogs.cpp:109
+#: engines/dialogs.cpp:307 engines/mohawk/dialogs.cpp:109
#: engines/mohawk/dialogs.cpp:170
msgid "~O~K"
msgstr "~S~í"
-#: engines/dialogs.cpp:302 engines/mohawk/dialogs.cpp:110
+#: engines/dialogs.cpp:308 engines/mohawk/dialogs.cpp:110
#: engines/mohawk/dialogs.cpp:171
msgid "~C~ancel"
msgstr "~C~ancelar"
-#: engines/dialogs.cpp:305
+#: engines/dialogs.cpp:311
msgid "~K~eys"
msgstr "~T~eclas"
-#: engines/engine.cpp:240
+#: engines/engine.cpp:245
msgid "Could not initialize color format."
msgstr "No se ha podido iniciar el formato de color."
-#: engines/engine.cpp:248
+#: engines/engine.cpp:253
msgid "Could not switch to video mode: '"
msgstr "No se ha podido cambiar al modo de video: '"
-#: engines/engine.cpp:257
+#: engines/engine.cpp:262
msgid "Could not apply aspect ratio setting."
msgstr "No se ha podido aplicar el ajuste de corrección de aspecto"
-#: engines/engine.cpp:262
+#: engines/engine.cpp:267
msgid "Could not apply fullscreen setting."
msgstr "No se ha podido aplicar el ajuste de pantalla completa."
-#: engines/engine.cpp:362
+#: engines/engine.cpp:367
msgid ""
"You appear to be playing this game directly\n"
"from the CD. This is known to cause problems,\n"
@@ -1357,7 +1361,7 @@ msgstr ""
"copiar los archivos del juego al disco duro.\n"
"Consulta el archivo README para más detalles."
-#: engines/engine.cpp:373
+#: engines/engine.cpp:378
msgid ""
"This game has audio tracks in its disk. These\n"
"tracks need to be ripped from the disk using\n"
@@ -1371,7 +1375,7 @@ msgstr ""
"poder escuchar la música del juego.\n"
"Consulta el archivo README para más detalles."
-#: engines/engine.cpp:431
+#: engines/engine.cpp:436
#, c-format
msgid ""
"Gamestate load failed (%s)! Please consult the README for basic information, "
@@ -1381,7 +1385,7 @@ msgstr ""
"README para encontrar información básica e instrucciones sobre cómo obtener "
"más ayuda."
-#: engines/engine.cpp:444
+#: engines/engine.cpp:449
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 "
@@ -1391,34 +1395,762 @@ msgstr ""
"ScummVM. Por lo tanto, puede que sea inestable, y que las partidas que "
"guardes no funcionen en versiones futuras de ScummVM."
-#: engines/engine.cpp:447
+#: engines/engine.cpp:452
msgid "Start anyway"
msgstr "Jugar aun así"
-#: engines/agi/detection.cpp:142 engines/drascula/detection.cpp:270
-#: engines/dreamweb/detection.cpp:47 engines/sci/detection.cpp:393
-#: engines/toltecs/detection.cpp:173
+#: audio/fmopl.cpp:50
+msgid "MAME OPL emulator"
+msgstr "Emulador OPL de MAME"
+
+#: audio/fmopl.cpp:52
+msgid "DOSBox OPL emulator"
+msgstr "Emulador OPL de DOSBox"
+
+#: audio/mididrv.cpp:209
+#, c-format
+msgid ""
+"The selected audio device '%s' was not found (e.g. might be turned off or "
+"disconnected)."
+msgstr ""
+"El dispositivo de sonido seleccionado, '%s', no se ha podido encontrar "
+"(puede estar apagado o desconectado)."
+
+#: audio/mididrv.cpp:209 audio/mididrv.cpp:221 audio/mididrv.cpp:257
+#: audio/mididrv.cpp:272
+msgid "Attempting to fall back to the next available device..."
+msgstr "Recorriendo al siguiente dispositivo disponible..."
+
+#: audio/mididrv.cpp:221
+#, c-format
+msgid ""
+"The selected audio device '%s' cannot be used. See log file for more "
+"information."
+msgstr ""
+"El dispositivo de sonido seleccionado, '%s', no se puede utilizar. Consulta "
+"el registro para más información."
+
+#: audio/mididrv.cpp:257
+#, c-format
+msgid ""
+"The preferred audio device '%s' was not found (e.g. might be turned off or "
+"disconnected)."
+msgstr ""
+"El dispositivo de sonido preferido, '%s', no se ha podido encontrar (puede "
+"estar apagado o desconectado)."
+
+#: audio/mididrv.cpp:272
+#, c-format
+msgid ""
+"The preferred audio device '%s' cannot be used. See log file for more "
+"information."
+msgstr ""
+"El dispositivo de sonido preferido, '%s', no se puede utilizar. Consulta el "
+"registro para más información."
+
+#: audio/null.h:44
+msgid "No music"
+msgstr "Sin música"
+
+#: audio/mods/paula.cpp:196
+msgid "Amiga Audio Emulator"
+msgstr "Emulador de Amiga Audio"
+
+#: audio/softsynth/adlib.cpp:2285
+msgid "AdLib Emulator"
+msgstr "Emulador de AdLib"
+
+#: audio/softsynth/appleiigs.cpp:33
+msgid "Apple II GS Emulator (NOT IMPLEMENTED)"
+msgstr "Emulador de Apple II GS (NO IMPLEMENTADO)"
+
+#: audio/softsynth/sid.cpp:1430
+msgid "C64 Audio Emulator"
+msgstr "Emulador de C64 Audio"
+
+#: audio/softsynth/mt32.cpp:200
+msgid "Initializing MT-32 Emulator"
+msgstr "Iniciando el emulador de MT-32"
+
+#: audio/softsynth/mt32.cpp:426
+msgid "MT-32 Emulator"
+msgstr "Emulador de MT-32"
+
+#: audio/softsynth/pcspk.cpp:139
+msgid "PC Speaker Emulator"
+msgstr "Emulador del altavoz de PC"
+
+#: audio/softsynth/pcspk.cpp:158
+msgid "IBM PCjr Emulator"
+msgstr "Emulador de IBM PCjr"
+
+#: backends/keymapper/remap-dialog.cpp:48
+msgid "Keymap:"
+msgstr "Asignación de teclas:"
+
+#: backends/keymapper/remap-dialog.cpp:67
+msgid " (Effective)"
+msgstr "(Activa)"
+
+#: backends/keymapper/remap-dialog.cpp:107
+msgid " (Active)"
+msgstr "(Activa)"
+
+#: backends/keymapper/remap-dialog.cpp:107
+msgid " (Blocked)"
+msgstr "(Bloqueado)"
+
+#: backends/keymapper/remap-dialog.cpp:120
+msgid " (Global)"
+msgstr "(General)"
+
+#: backends/keymapper/remap-dialog.cpp:128
+msgid " (Game)"
+msgstr "(Juego)"
+
+#: backends/midi/windows.cpp:165
+msgid "Windows MIDI"
+msgstr "Windows MIDI"
+
+#: backends/platform/ds/arm9/source/dsoptions.cpp:56
+#: engines/scumm/dialogs.cpp:291
+msgid "~C~lose"
+msgstr "Cerra~r~"
+
+#: backends/platform/ds/arm9/source/dsoptions.cpp:57
+msgid "ScummVM Main Menu"
+msgstr "Menú principal de ScummVM"
+
+#: backends/platform/ds/arm9/source/dsoptions.cpp:63
+msgid "~L~eft handed mode"
+msgstr "Modo para ~z~urdos"
+
+#: backends/platform/ds/arm9/source/dsoptions.cpp:64
+msgid "~I~ndy fight controls"
+msgstr "Controles para pelear de ~I~ndy"
+
+#: backends/platform/ds/arm9/source/dsoptions.cpp:65
+msgid "Show mouse cursor"
+msgstr "Mostrar el cursor"
+
+#: backends/platform/ds/arm9/source/dsoptions.cpp:66
+msgid "Snap to edges"
+msgstr "Pegar a los bordes"
+
+#: backends/platform/ds/arm9/source/dsoptions.cpp:68
+msgid "Touch X Offset"
+msgstr "Compensación X del toque"
+
+#: backends/platform/ds/arm9/source/dsoptions.cpp:75
+msgid "Touch Y Offset"
+msgstr "Compensación Y del toque"
+
+#: backends/platform/ds/arm9/source/dsoptions.cpp:87
+msgid "Use laptop trackpad-style cursor control"
+msgstr "Activar el sistema de control tipo trackpad de los portátiles"
+
+#: backends/platform/ds/arm9/source/dsoptions.cpp:88
+msgid "Tap for left click, double tap right click"
+msgstr "Un toque para clic izquierdo, dos para clic derecho"
+
+#: backends/platform/ds/arm9/source/dsoptions.cpp:90
+msgid "Sensitivity"
+msgstr "Sensibilidad"
+
+#: backends/platform/ds/arm9/source/dsoptions.cpp:99
+msgid "Initial top screen scale:"
+msgstr "Escalado inicial de la pantalla superior:"
+
+#: backends/platform/ds/arm9/source/dsoptions.cpp:105
+msgid "Main screen scaling:"
+msgstr "Escalado de la pantalla principal:"
+
+#: backends/platform/ds/arm9/source/dsoptions.cpp:107
+msgid "Hardware scale (fast, but low quality)"
+msgstr "Escalado por hardware (rápido, pero de baja calidad)"
+
+#: backends/platform/ds/arm9/source/dsoptions.cpp:108
+msgid "Software scale (good quality, but slower)"
+msgstr "Escalado por software (buena calidad, pero más lento)"
+
+#: backends/platform/ds/arm9/source/dsoptions.cpp:109
+msgid "Unscaled (you must scroll left and right)"
+msgstr "Sin escalado (debes desplazar la pantalla a los lados)"
+
+#: backends/platform/ds/arm9/source/dsoptions.cpp:111
+msgid "Brightness:"
+msgstr "Brillo:"
+
+#: backends/platform/ds/arm9/source/dsoptions.cpp:121
+msgid "High quality audio (slower) (reboot)"
+msgstr "Sonido de alta calidad (más lento) (reinicio)"
+
+#: backends/platform/ds/arm9/source/dsoptions.cpp:122
+msgid "Disable power off"
+msgstr "Desactivar apagado"
+
+#: backends/platform/iphone/osys_events.cpp:300
+msgid "Mouse-click-and-drag mode enabled."
+msgstr "Modo clic-de-ratón-y-arrastrar activado."
+
+#: backends/platform/iphone/osys_events.cpp:302
+msgid "Mouse-click-and-drag mode disabled."
+msgstr "Modo clic-de-ratón-y-arrastrar desactivado."
+
+#: backends/platform/iphone/osys_events.cpp:313
+msgid "Touchpad mode enabled."
+msgstr "Modo Touchpad activado."
+
+#: backends/platform/iphone/osys_events.cpp:315
+msgid "Touchpad mode disabled."
+msgstr "Modo Touchpad desactivado."
+
+#: backends/platform/maemo/maemo.cpp:209
+msgid "Click Mode"
+msgstr "Modo clic"
+
+#: backends/platform/maemo/maemo.cpp:215
+#: backends/platform/symbian/src/SymbianActions.cpp:42
+#: backends/platform/wince/CEActionsPocket.cpp:60
+#: backends/platform/wince/CEActionsSmartphone.cpp:43
+#: backends/platform/tizen/form.cpp:275
+msgid "Left Click"
+msgstr "Clic izquierdo"
+
+#: backends/platform/maemo/maemo.cpp:218
+msgid "Middle Click"
+msgstr "Clic central"
+
+#: backends/platform/maemo/maemo.cpp:221
+#: backends/platform/symbian/src/SymbianActions.cpp:43
+#: backends/platform/wince/CEActionsSmartphone.cpp:44
+#: backends/platform/tizen/form.cpp:267
+msgid "Right Click"
+msgstr "Clic derecho"
+
+#: backends/platform/sdl/macosx/appmenu_osx.mm:77
+msgid "Hide ScummVM"
+msgstr "Ocultar ScummVM"
+
+#: backends/platform/sdl/macosx/appmenu_osx.mm:82
+msgid "Hide Others"
+msgstr "Ocultar otros"
+
+#: backends/platform/sdl/macosx/appmenu_osx.mm:87
+msgid "Show All"
+msgstr "Mostrar todo"
+
+#: backends/platform/sdl/macosx/appmenu_osx.mm:109
+#: backends/platform/sdl/macosx/appmenu_osx.mm:120
+msgid "Window"
+msgstr "Ventana"
+
+#: backends/platform/sdl/macosx/appmenu_osx.mm:114
+msgid "Minimize"
+msgstr "Minimizar"
+
+#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:46
+msgid "Normal (no scaling)"
+msgstr "Normal (sin reescalado)"
+
+#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:65
+msgctxt "lowres"
+msgid "Normal (no scaling)"
+msgstr "Normal"
+
+#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2148
+msgid "Enabled aspect ratio correction"
+msgstr "Activar la corrección de aspecto"
+
+#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2154
+msgid "Disabled aspect ratio correction"
+msgstr "Desactivar la corrección de aspecto"
+
+#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2209
+msgid "Active graphics filter:"
+msgstr "Filtro de gráficos activo:"
+
+#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2251
+msgid "Windowed mode"
+msgstr "Modo ventana"
+
+#: backends/graphics/opengl/opengl-graphics.cpp:118
+#, fuzzy
+msgid "OpenGL"
+msgstr "Abrir"
+
+#: backends/graphics/opengl/opengl-graphics.cpp:119
+msgid "OpenGL (No filtering)"
+msgstr ""
+
+#: backends/platform/symbian/src/SymbianActions.cpp:38
+#: backends/platform/wince/CEActionsSmartphone.cpp:39
+msgid "Up"
+msgstr "Arriba"
+
+#: backends/platform/symbian/src/SymbianActions.cpp:39
+#: backends/platform/wince/CEActionsSmartphone.cpp:40
+msgid "Down"
+msgstr "Abajo"
+
+#: backends/platform/symbian/src/SymbianActions.cpp:40
+#: backends/platform/wince/CEActionsSmartphone.cpp:41
+msgid "Left"
+msgstr "Izquierda"
+
+#: backends/platform/symbian/src/SymbianActions.cpp:41
+#: backends/platform/wince/CEActionsSmartphone.cpp:42
+msgid "Right"
+msgstr "Derecha"
+
+#: backends/platform/symbian/src/SymbianActions.cpp:46
+#: backends/platform/wince/CEActionsSmartphone.cpp:47
+msgid "Zone"
+msgstr "Zona"
+
+#: backends/platform/symbian/src/SymbianActions.cpp:47
+#: backends/platform/wince/CEActionsPocket.cpp:54
+#: backends/platform/wince/CEActionsSmartphone.cpp:48
+msgid "Multi Function"
+msgstr "Multifunción"
+
+#: backends/platform/symbian/src/SymbianActions.cpp:48
+msgid "Swap character"
+msgstr "Cambiar personaje"
+
+#: backends/platform/symbian/src/SymbianActions.cpp:49
+msgid "Skip text"
+msgstr "Saltar texto"
+
+#: backends/platform/symbian/src/SymbianActions.cpp:51
+msgid "Fast mode"
+msgstr "Modo rápido"
+
+#: 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:218
+#: engines/scumm/dialogs.cpp:192 engines/scumm/help.cpp:82
+#: engines/scumm/help.cpp:84
+msgid "Quit"
+msgstr "Salir"
+
+#: backends/platform/symbian/src/SymbianActions.cpp:53
+msgid "Debugger"
+msgstr "Debugger"
+
+#: backends/platform/symbian/src/SymbianActions.cpp:54
+msgid "Global menu"
+msgstr "Menú general"
+
+#: backends/platform/symbian/src/SymbianActions.cpp:55
+msgid "Virtual keyboard"
+msgstr "Teclado virtual"
+
+#: backends/platform/symbian/src/SymbianActions.cpp:56
+msgid "Key mapper"
+msgstr "Asignación de teclas"
+
+#: backends/events/symbiansdl/symbiansdl-events.cpp:184
+msgid "Do you want to quit ?"
+msgstr "¿Quieres salir?"
+
+#: backends/platform/wii/options.cpp:51
+msgid "Video"
+msgstr "Vídeo"
+
+#: backends/platform/wii/options.cpp:54
+msgid "Current video mode:"
+msgstr "Modo de vídeo actual:"
+
+#: backends/platform/wii/options.cpp:56
+msgid "Double-strike"
+msgstr "Doble golpe"
+
+#: backends/platform/wii/options.cpp:60
+msgid "Horizontal underscan:"
+msgstr "Underscan horizontal:"
+
+#: backends/platform/wii/options.cpp:66
+msgid "Vertical underscan:"
+msgstr "Underscan vertical:"
+
+#: backends/platform/wii/options.cpp:71
+msgid "Input"
+msgstr "Entrada"
+
+#: backends/platform/wii/options.cpp:74
+msgid "GC Pad sensitivity:"
+msgstr "Sensibilidad del pad GC:"
+
+#: backends/platform/wii/options.cpp:80
+msgid "GC Pad acceleration:"
+msgstr "Aceleración del pad GC:"
+
+#: backends/platform/wii/options.cpp:86
+msgid "DVD"
+msgstr "DVD"
+
+#: backends/platform/wii/options.cpp:89 backends/platform/wii/options.cpp:101
+msgid "Status:"
+msgstr "Estado:"
+
+#: backends/platform/wii/options.cpp:90 backends/platform/wii/options.cpp:102
+msgid "Unknown"
+msgstr "Desconocido"
+
+#: backends/platform/wii/options.cpp:93
+msgid "Mount DVD"
+msgstr "Montar DVD"
+
+#: backends/platform/wii/options.cpp:94
+msgid "Unmount DVD"
+msgstr "Desmontar DVD"
+
+#: backends/platform/wii/options.cpp:98
+msgid "SMB"
+msgstr "SMB"
+
+#: backends/platform/wii/options.cpp:106
+msgid "Server:"
+msgstr "Servidor:"
+
+#: backends/platform/wii/options.cpp:110
+msgid "Share:"
+msgstr "Disco compartido:"
+
+#: backends/platform/wii/options.cpp:114
+msgid "Username:"
+msgstr "Usuario:"
+
+#: backends/platform/wii/options.cpp:118
+msgid "Password:"
+msgstr "Contraseña:"
+
+#: backends/platform/wii/options.cpp:121
+msgid "Init network"
+msgstr "Iniciar red"
+
+#: backends/platform/wii/options.cpp:123
+msgid "Mount SMB"
+msgstr "Montar SMB"
+
+#: backends/platform/wii/options.cpp:124
+msgid "Unmount SMB"
+msgstr "Desmontar SMB"
+
+#: backends/platform/wii/options.cpp:143
+msgid "DVD Mounted successfully"
+msgstr "DVD montado con éxito"
+
+#: backends/platform/wii/options.cpp:146
+msgid "Error while mounting the DVD"
+msgstr "Error al montar el DVD"
+
+#: backends/platform/wii/options.cpp:148
+msgid "DVD not mounted"
+msgstr "DVD no montado"
+
+#: backends/platform/wii/options.cpp:161
+msgid "Network up, share mounted"
+msgstr "Red conectada, disco compartido montado"
+
+#: backends/platform/wii/options.cpp:163
+msgid "Network up"
+msgstr "Red conectada"
+
+#: backends/platform/wii/options.cpp:166
+msgid ", error while mounting the share"
+msgstr ", error al montar el disco compartido"
+
+#: backends/platform/wii/options.cpp:168
+msgid ", share not mounted"
+msgstr ", disco compartido no montado"
+
+#: backends/platform/wii/options.cpp:174
+msgid "Network down"
+msgstr "Red desconectada"
+
+#: backends/platform/wii/options.cpp:178
+msgid "Initializing network"
+msgstr "Iniciando la red"
+
+#: backends/platform/wii/options.cpp:182
+msgid "Timeout while initializing network"
+msgstr "Se ha excedido el tiempo de iniciación de red"
+
+#: backends/platform/wii/options.cpp:186
+#, c-format
+msgid "Network not initialized (%d)"
+msgstr "Red no iniciada (%d)"
+
+#: backends/platform/wince/CEActionsPocket.cpp:46
+msgid "Hide Toolbar"
+msgstr "Ocultar barra de tareas"
+
+#: backends/platform/wince/CEActionsPocket.cpp:47
+msgid "Show Keyboard"
+msgstr "Mostrar teclado"
+
+#: backends/platform/wince/CEActionsPocket.cpp:48
+msgid "Sound on/off"
+msgstr "Sonido activado/desactivado"
+
+#: backends/platform/wince/CEActionsPocket.cpp:49
+msgid "Right click"
+msgstr "Clic derecho"
+
+#: backends/platform/wince/CEActionsPocket.cpp:50
+msgid "Show/Hide Cursor"
+msgstr "Mostrar/Ocultar cursor"
+
+#: backends/platform/wince/CEActionsPocket.cpp:51
+msgid "Free look"
+msgstr "Vista libre"
+
+#: backends/platform/wince/CEActionsPocket.cpp:52
+msgid "Zoom up"
+msgstr "Aumentar zoom"
+
+#: backends/platform/wince/CEActionsPocket.cpp:53
+msgid "Zoom down"
+msgstr "Disminuir zoom"
+
+#: backends/platform/wince/CEActionsPocket.cpp:55
+#: backends/platform/wince/CEActionsSmartphone.cpp:49
+msgid "Bind Keys"
+msgstr "Asignar teclas"
+
+#: backends/platform/wince/CEActionsPocket.cpp:56
+msgid "Cursor Up"
+msgstr "Arriba"
+
+#: backends/platform/wince/CEActionsPocket.cpp:57
+msgid "Cursor Down"
+msgstr "Abajo"
+
+#: backends/platform/wince/CEActionsPocket.cpp:58
+msgid "Cursor Left"
+msgstr "Izquierda"
+
+#: backends/platform/wince/CEActionsPocket.cpp:59
+msgid "Cursor Right"
+msgstr "Derecha"
+
+#: 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:326
+#: backends/platform/wince/CEActionsSmartphone.cpp:287
+msgid " Are you sure you want to quit ? "
+msgstr "¿Seguro que quieres salir?"
+
+#: backends/platform/wince/CEActionsSmartphone.cpp:50
+msgid "Keyboard"
+msgstr "Teclado"
+
+#: backends/platform/wince/CEActionsSmartphone.cpp:51
+msgid "Rotate"
+msgstr "Rotar"
+
+#: backends/platform/wince/CELauncherDialog.cpp:56
+msgid "Using SDL driver "
+msgstr "Usando el controlador SDL"
+
+#: backends/platform/wince/CELauncherDialog.cpp:60
+msgid "Display "
+msgstr "Pantalla"
+
+#: 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:516
+msgid "Map right click action"
+msgstr "Asignar acción 'Clic derecho'"
+
+#: backends/platform/wince/wince-sdl.cpp:520
+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:529
+msgid "Map hide toolbar action"
+msgstr "Asignar acción 'Ocultar barra de tareas'"
+
+#: backends/platform/wince/wince-sdl.cpp:533
+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:542
+msgid "Map Zoom Up action (optional)"
+msgstr "Asignar acción 'Zoom' (opcional)"
+
+#: backends/platform/wince/wince-sdl.cpp:545
+msgid "Map Zoom Down action (optional)"
+msgstr "Asignar acción 'Disminuir zoom' (opcional)"
+
+#: backends/platform/wince/wince-sdl.cpp:553
+msgid ""
+"Don't forget to map a key to 'Hide Toolbar' action to see the whole inventory"
+msgstr ""
+"No olvides asignar una tecla a la acción 'Ocultar barra de tareas' para ver "
+"todo el inventario"
+
+#: backends/events/default/default-events.cpp:196
+msgid "Do you really want to return to the Launcher?"
+msgstr "¿Seguro que quieres volver al Lanzador?"
+
+#: backends/events/default/default-events.cpp:196
+msgid "Launcher"
+msgstr "Lanzador"
+
+#: backends/events/default/default-events.cpp:218
+msgid "Do you really want to quit?"
+msgstr "¿Realmente quieres salir?"
+
+#: backends/events/gph/gph-events.cpp:386
+#: backends/events/gph/gph-events.cpp:429
+#: backends/events/openpandora/op-events.cpp:168
+msgid "Touchscreen 'Tap Mode' - Left Click"
+msgstr "'Modo toque' de pantalla táctil - Clic izquierdo"
+
+#: backends/events/gph/gph-events.cpp:388
+#: backends/events/gph/gph-events.cpp:431
+#: backends/events/openpandora/op-events.cpp:170
+msgid "Touchscreen 'Tap Mode' - Right Click"
+msgstr "'Modo toque' de pantalla táctil - Clic derecho"
+
+#: backends/events/gph/gph-events.cpp:390
+#: backends/events/gph/gph-events.cpp:433
+#: backends/events/openpandora/op-events.cpp:172
+msgid "Touchscreen 'Tap Mode' - Hover (No Click)"
+msgstr "'Modo toque' de pantalla táctil - Flotante (sin clic)"
+
+#: backends/events/gph/gph-events.cpp:410
+msgid "Maximum Volume"
+msgstr "Volumen máximo"
+
+#: backends/events/gph/gph-events.cpp:412
+msgid "Increasing Volume"
+msgstr "Aumentando el volumen"
+
+#: backends/events/gph/gph-events.cpp:418
+msgid "Minimal Volume"
+msgstr "Volumen mínimo"
+
+#: backends/events/gph/gph-events.cpp:420
+msgid "Decreasing Volume"
+msgstr "Bajando el volumen"
+
+#: backends/events/openpandora/op-events.cpp:174
+msgid "Touchscreen 'Tap Mode' - Hover (DPad Clicks)"
+msgstr "'Modo toque' de pantalla táctil - Flotante (clic de cruceta)"
+
+#: backends/updates/macosx/macosx-updates.mm:67
+msgid "Check for Updates..."
+msgstr "Buscar actualizaciones..."
+
+#: backends/platform/tizen/form.cpp:263
+msgid "Right Click Once"
+msgstr "Un clic derecho"
+
+#: backends/platform/tizen/form.cpp:271
+msgid "Move Only"
+msgstr "Solo mover"
+
+#: backends/platform/tizen/form.cpp:294
+msgid "Escape Key"
+msgstr "Tecla Escape"
+
+#: backends/platform/tizen/form.cpp:299
+msgid "Game Menu"
+msgstr "Menú del juego"
+
+#: backends/platform/tizen/form.cpp:304
+msgid "Show Keypad"
+msgstr "Mostrar el teclado numérico"
+
+#: backends/platform/tizen/form.cpp:309
+msgid "Control Mouse"
+msgstr "Control del ratón"
+
+#: backends/events/maemosdl/maemosdl-events.cpp:192
+msgid "Clicking Enabled"
+msgstr "Clic activado"
+
+#: backends/events/maemosdl/maemosdl-events.cpp:192
+msgid "Clicking Disabled"
+msgstr "Clic desactivado"
+
+#: engines/agi/detection.cpp:142 engines/drascula/detection.cpp:302
+#: engines/dreamweb/detection.cpp:47 engines/neverhood/detection.cpp:160
+#: engines/sci/detection.cpp:394 engines/toltecs/detection.cpp:186
msgid "Use original save/load screens"
msgstr "Usar pantallas de guardar/cargar originales"
-#: engines/agi/detection.cpp:143 engines/drascula/detection.cpp:271
-#: engines/dreamweb/detection.cpp:48 engines/sci/detection.cpp:394
-#: engines/toltecs/detection.cpp:174
+#: engines/agi/detection.cpp:143 engines/drascula/detection.cpp:303
+#: engines/dreamweb/detection.cpp:48 engines/neverhood/detection.cpp:161
+#: engines/sci/detection.cpp:395 engines/toltecs/detection.cpp:187
msgid "Use the original save/load screens, instead of the ScummVM ones"
msgstr ""
"Utilizar las pantallas de guardar/cargar originales, en vez de las de ScummVM"
-#: engines/agi/saveload.cpp:816 engines/drascula/saveload.cpp:351
-#: engines/sci/engine/kfile.cpp:841 engines/toltecs/menu.cpp:259
+#: engines/agi/saveload.cpp:816 engines/drascula/saveload.cpp:349
+#: engines/neverhood/menumodule.cpp:886 engines/sci/engine/kfile.cpp:857
+#: engines/toltecs/menu.cpp:256
msgid "Restore game:"
msgstr "Cargar partida:"
-#: engines/agi/saveload.cpp:816 engines/drascula/saveload.cpp:351
-#: engines/sci/engine/kfile.cpp:841 engines/toltecs/menu.cpp:259
+#: engines/agi/saveload.cpp:816 engines/drascula/saveload.cpp:349
+#: engines/neverhood/menumodule.cpp:886 engines/sci/engine/kfile.cpp:857
+#: engines/toltecs/menu.cpp:256
msgid "Restore"
msgstr "Cargar"
-#: engines/drascula/saveload.cpp:49
+#: engines/agos/saveload.cpp:160 engines/scumm/scumm.cpp:2321
+#, c-format
+msgid ""
+"Failed to load game state from file:\n"
+"\n"
+"%s"
+msgstr ""
+"Fallo al cargar desde el archivo:\n"
+"\n"
+"%s"
+
+#: engines/agos/saveload.cpp:195 engines/scumm/scumm.cpp:2314
+#, c-format
+msgid ""
+"Failed to save game state to file:\n"
+"\n"
+"%s"
+msgstr ""
+"Fallo al guardar en el archivo:\n"
+"\n"
+"%s"
+
+#: engines/agos/saveload.cpp:203 engines/scumm/scumm.cpp:2332
+#, c-format
+msgid ""
+"Successfully saved game state in file:\n"
+"\n"
+"%s"
+msgstr ""
+"Partida guardada en el archivo:\n"
+"\n"
+"%s"
+
+#: engines/agos/animation.cpp:557
+#, c-format
+msgid "Cutscene file '%s' not found!"
+msgstr "No se ha encontrado el vídeo '%s'"
+
+#: engines/drascula/saveload.cpp:47
msgid ""
"ScummVM found that you have old savefiles for Drascula that should be "
"converted.\n"
@@ -1444,27 +2176,304 @@ msgstr "Usar paleta original"
msgid "Display graphics using the game's bright palette"
msgstr "Utilizar los niveles de brillo originales del juego"
-#: engines/sci/detection.cpp:373
+#: engines/gob/inter_playtoons.cpp:256 engines/gob/inter_v2.cpp:1470
+#: engines/tinsel/saveload.cpp:532
+msgid "Failed to load game state from file."
+msgstr "Fallo al cargar el estado del juego desde el archivo."
+
+#: engines/gob/inter_v2.cpp:1540 engines/tinsel/saveload.cpp:545
+msgid "Failed to save game state to file."
+msgstr "Fallo al guardar el estado del juego en el archivo."
+
+#: engines/gob/inter_v5.cpp:107
+msgid "Failed to delete file."
+msgstr "Fallo al borrar el archivo."
+
+#: engines/groovie/detection.cpp:312
+msgid "Fast movie speed"
+msgstr "Velocidad rápida de vídeos"
+
+#: engines/groovie/detection.cpp:313
+msgid "Play movies at an increased speed"
+msgstr "Reproducir vídeos a mayor velocidad"
+
+#: engines/groovie/script.cpp:399
+msgid "Failed to save game"
+msgstr "Fallo al guardar la partida"
+
+#. I18N: Studio audience adds an applause and cheering sounds whenever
+#. Malcolm makes a joke.
+#: engines/kyra/detection.cpp:62
+msgid "Studio audience"
+msgstr "Risas del público"
+
+#: engines/kyra/detection.cpp:63
+msgid "Enable studio audience"
+msgstr "Activa las risas del público"
+
+#. I18N: This option allows the user to skip text and cutscenes.
+#: engines/kyra/detection.cpp:73
+msgid "Skip support"
+msgstr "Permitir omisiones"
+
+#: engines/kyra/detection.cpp:74
+msgid "Allow text and cutscenes to be skipped"
+msgstr "Permite saltarse frases y vídeos"
+
+#. I18N: Helium mode makes people sound like they've inhaled Helium.
+#: engines/kyra/detection.cpp:84
+msgid "Helium mode"
+msgstr "Modo helio"
+
+#: engines/kyra/detection.cpp:85
+msgid "Enable helium mode"
+msgstr "Activa el modo helio"
+
+#. I18N: When enabled, this option makes scrolling smoother when
+#. changing from one screen to another.
+#: engines/kyra/detection.cpp:99
+msgid "Smooth scrolling"
+msgstr "Desplazamiento suave"
+
+#: engines/kyra/detection.cpp:100
+msgid "Enable smooth scrolling when walking"
+msgstr "Activa el desplazamiento de pantalla suave al caminar"
+
+#. I18N: When enabled, this option changes the cursor when it floats to the
+#. edge of the screen to a directional arrow. The player can then click to
+#. walk towards that direction.
+#: engines/kyra/detection.cpp:112
+msgid "Floating cursors"
+msgstr "Cursores flotantes"
+
+#: engines/kyra/detection.cpp:113
+msgid "Enable floating cursors"
+msgstr "Activar cursores flotantes"
+
+#. I18N: HP stands for Hit Points
+#: engines/kyra/detection.cpp:127
+msgid "HP bar graphs"
+msgstr "Barras de energía"
+
+#: engines/kyra/detection.cpp:128
+msgid "Enable hit point bar graphs"
+msgstr "Activa las barras de energía"
+
+#: engines/kyra/lol.cpp:478
+msgid "Attack 1"
+msgstr "Ataque 1"
+
+#: engines/kyra/lol.cpp:479
+msgid "Attack 2"
+msgstr "Ataque 2"
+
+#: engines/kyra/lol.cpp:480
+msgid "Attack 3"
+msgstr "Ataque 3"
+
+#: engines/kyra/lol.cpp:481
+msgid "Move Forward"
+msgstr "Avanzar"
+
+#: engines/kyra/lol.cpp:482
+msgid "Move Back"
+msgstr "Retroceder"
+
+#: engines/kyra/lol.cpp:483
+msgid "Slide Left"
+msgstr "Deslizarse a la izquierda"
+
+#: engines/kyra/lol.cpp:484
+msgid "Slide Right"
+msgstr "Deslizarse a la derecha"
+
+#: engines/kyra/lol.cpp:485 engines/pegasus/pegasus.cpp:2509
+msgid "Turn Left"
+msgstr "Girar a la izquierda"
+
+#: engines/kyra/lol.cpp:486 engines/pegasus/pegasus.cpp:2510
+msgid "Turn Right"
+msgstr "Girar a la derecha"
+
+#: engines/kyra/lol.cpp:487
+msgid "Rest"
+msgstr "Descansar"
+
+#: engines/kyra/lol.cpp:488
+msgid "Options"
+msgstr "Opciones"
+
+#: engines/kyra/lol.cpp:489
+msgid "Choose Spell"
+msgstr "Elegir hechizo"
+
+#: engines/kyra/sound_midi.cpp:477
+msgid ""
+"You appear to be using a General MIDI device,\n"
+"but your game only supports Roland MT32 MIDI.\n"
+"We try to map the Roland MT32 instruments to\n"
+"General MIDI ones. It is still possible that\n"
+"some tracks sound incorrect."
+msgstr ""
+"Estás usando un dispositivo General MIDI, pero el\n"
+"juego solo es compatible con 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 suenen correctamente."
+
+#. I18N: Option for fast scene switching
+#: engines/mohawk/dialogs.cpp:92 engines/mohawk/dialogs.cpp:167
+msgid "~Z~ip Mode Activated"
+msgstr "Modo ~Z~ip activado"
+
+#: engines/mohawk/dialogs.cpp:93
+msgid "~T~ransitions Enabled"
+msgstr "Tra~n~siciones activadas"
+
+#. I18N: Drop book page
+#: engines/mohawk/dialogs.cpp:95
+msgid "~D~rop Page"
+msgstr "~T~irar página"
+
+#: engines/mohawk/dialogs.cpp:99
+msgid "~S~how Map"
+msgstr "~M~ostrar el mapa"
+
+#: engines/mohawk/dialogs.cpp:105
+msgid "~M~ain Menu"
+msgstr "~M~enú principal"
+
+#: engines/mohawk/dialogs.cpp:168
+msgid "~W~ater Effect Enabled"
+msgstr "Efecto ag~u~a activado"
+
+#: engines/neverhood/detection.cpp:167
+msgid "Skip the Hall of Records storyboard scenes"
+msgstr ""
+
+#: engines/neverhood/detection.cpp:168
+msgid "Allows the player to skip past the Hall of Records storyboard scenes"
+msgstr ""
+
+#: engines/neverhood/detection.cpp:174
+msgid "Scale the making of videos to full screen"
+msgstr ""
+
+#: engines/neverhood/detection.cpp:175
+msgid "Scale the making of videos, so that they use the whole screen"
+msgstr ""
+
+#: engines/parallaction/saveload.cpp:133
+#, c-format
+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:204
+msgid "Loading game..."
+msgstr "Cargando partida..."
+
+#: engines/parallaction/saveload.cpp:219
+msgid "Saving game..."
+msgstr "Guardando partida..."
+
+#: engines/parallaction/saveload.cpp:272
+msgid ""
+"ScummVM found that you have old savefiles for Nippon Safes that should be "
+"renamed.\n"
+"The old names are 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 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:319
+msgid "ScummVM successfully converted all your savefiles."
+msgstr "ScummVM ha convertido todas las partidas guardadas correctamente."
+
+#: engines/parallaction/saveload.cpp:321
+msgid ""
+"ScummVM printed some warnings in your console window and can't guarantee all "
+"your files have been converted.\n"
+"\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."
+
+#: engines/pegasus/pegasus.cpp:714
+msgid "Invalid save file name"
+msgstr "Nombre no válido para la partida"
+
+#: engines/pegasus/pegasus.cpp:2507
+msgid "Up/Zoom In/Move Forward/Open Doors"
+msgstr "Arriba/Zoom/Avanzar/Abrir puertas"
+
+#: engines/pegasus/pegasus.cpp:2508
+msgid "Down/Zoom Out"
+msgstr "Abajo/Reducir zoom"
+
+#: engines/pegasus/pegasus.cpp:2511
+msgid "Display/Hide Inventory Tray"
+msgstr "Mostrar/Ocultar inventario"
+
+#: engines/pegasus/pegasus.cpp:2512
+msgid "Display/Hide Biochip Tray"
+msgstr "Mostrar/Ocultar biochip"
+
+#: engines/pegasus/pegasus.cpp:2513
+msgid "Action/Select"
+msgstr "Acción/Seleccionar"
+
+#: engines/pegasus/pegasus.cpp:2514
+msgid "Toggle Center Data Display"
+msgstr "Activar/Desactivar pantalla de datos"
+
+#: engines/pegasus/pegasus.cpp:2515
+msgid "Display/Hide Info Screen"
+msgstr "Mostrar/Ocultar pantalla de información"
+
+#: engines/pegasus/pegasus.cpp:2516
+msgid "Display/Hide Pause Menu"
+msgstr "Mostrar/Ocultar menú de pausa"
+
+#: engines/pegasus/pegasus.cpp:2517
+msgid "???"
+msgstr "???"
+
+#: engines/sci/detection.cpp:374
msgid "EGA undithering"
msgstr "Difuminado EGA"
-#: engines/sci/detection.cpp:374
+#: engines/sci/detection.cpp:375
msgid "Enable undithering in EGA games"
msgstr "Activar difuminado en los juegos EGA"
-#: engines/sci/detection.cpp:383
+#: engines/sci/detection.cpp:384
msgid "Prefer digital sound effects"
msgstr "Preferir efectos de sonido digitales"
-#: engines/sci/detection.cpp:384
+#: engines/sci/detection.cpp:385
msgid "Prefer digital sound effects instead of synthesized ones"
msgstr "Preferir efectos de sonido digitales en vez de los sintetizados"
-#: engines/sci/detection.cpp:403
+#: engines/sci/detection.cpp:404
msgid "Use IMF/Yamaha FB-01 for MIDI output"
msgstr "Usar IMF/Yamaha FB-01 para la salida MIDI"
-#: engines/sci/detection.cpp:404
+#: engines/sci/detection.cpp:405
msgid ""
"Use an IBM Music Feature card or a Yamaha FB-01 FM synth module for MIDI "
"output"
@@ -1472,165 +2481,147 @@ msgstr ""
"Usa una tarjeta IBM Music o un módulo sintetizador Yamaha FB-01 FM para la "
"salida MIDI"
-#: engines/sci/detection.cpp:414
+#: engines/sci/detection.cpp:415
msgid "Use CD audio"
msgstr "Usar CD audio"
-#: engines/sci/detection.cpp:415
+#: engines/sci/detection.cpp:416
msgid "Use CD audio instead of in-game audio, if available"
msgstr "Usa CD audio en vez del sonido interno del juego, si está disponible"
-#: engines/sci/detection.cpp:425
+#: engines/sci/detection.cpp:426
msgid "Use Windows cursors"
msgstr "Usar cursores de Windows"
-#: engines/sci/detection.cpp:426
+#: engines/sci/detection.cpp:427
msgid ""
"Use the Windows cursors (smaller and monochrome) instead of the DOS ones"
msgstr ""
"Usar los cursores de Windows (más pequeños y monocromos) en vez de los de DOS"
-#: engines/sci/detection.cpp:436
+#: engines/sci/detection.cpp:437
msgid "Use silver cursors"
msgstr "Usar cursores plateados"
-#: engines/sci/detection.cpp:437
+#: engines/sci/detection.cpp:438
msgid ""
"Use the alternate set of silver cursors, instead of the normal golden ones"
msgstr ""
"Usar los cursores plateados alternativos, en vez de los dorados normales"
-#: engines/scumm/dialogs.cpp:175
+#: engines/scumm/dialogs.cpp:176
#, 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
+#: engines/scumm/dialogs.cpp:177
#, 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
+#: engines/scumm/dialogs.cpp:178
#, 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
+#: engines/scumm/dialogs.cpp:179
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
+#: engines/scumm/dialogs.cpp:183
msgid "Are you sure you want to restart? (Y/N)"
msgstr "¿Seguro que quieres reiniciar? (S/N)S"
#. I18N: you may specify 'Yes' symbol at the end of the line. See previous comment
-#: engines/scumm/dialogs.cpp:184
+#: engines/scumm/dialogs.cpp:185
msgid "Are you sure you want to quit? (Y/N)"
msgstr "¿Seguro que quieres salir? (S/N)S"
-#: engines/scumm/dialogs.cpp:189
+#: engines/scumm/dialogs.cpp:190
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:215
-msgid "Quit"
-msgstr "Salir"
-
-#: engines/scumm/dialogs.cpp:193
+#: engines/scumm/dialogs.cpp:194
msgid "Insert save/load game disk"
msgstr "Inserta el disco de las partidas guardadas"
-#: engines/scumm/dialogs.cpp:194
+#: engines/scumm/dialogs.cpp:195
msgid "You must enter a name"
msgstr "Tienes que introducir un nombre"
-#: engines/scumm/dialogs.cpp:195
+#: engines/scumm/dialogs.cpp:196
msgid "The game was NOT saved (disk full?)"
msgstr "La partida no se ha guardado (¿disco lleno?)"
-#: engines/scumm/dialogs.cpp:196
+#: engines/scumm/dialogs.cpp:197
msgid "The game was NOT loaded"
msgstr "La partida no se ha cargado"
-#: engines/scumm/dialogs.cpp:197
+#: engines/scumm/dialogs.cpp:198
#, c-format
msgid "Saving '%s'"
msgstr "Guardando '%s'"
-#: engines/scumm/dialogs.cpp:198
+#: engines/scumm/dialogs.cpp:199
#, c-format
msgid "Loading '%s'"
msgstr "Cargando '%s'"
-#: engines/scumm/dialogs.cpp:199
+#: engines/scumm/dialogs.cpp:200
msgid "Name your SAVE game"
msgstr "Pon nombre a tu partida"
-#: engines/scumm/dialogs.cpp:200
+#: engines/scumm/dialogs.cpp:201
msgid "Select a game to LOAD"
msgstr "Selecciona un juego para cargar"
-#: engines/scumm/dialogs.cpp:201
+#: engines/scumm/dialogs.cpp:202
msgid "Game title)"
msgstr "Título del juego)"
#. I18N: Previous page button
-#: engines/scumm/dialogs.cpp:287
+#: engines/scumm/dialogs.cpp:288
msgid "~P~revious"
msgstr "~A~nterior"
#. I18N: Next page button
-#: engines/scumm/dialogs.cpp:289
+#: engines/scumm/dialogs.cpp:290
msgid "~N~ext"
msgstr "Si~g~uiente"
-#: engines/scumm/dialogs.cpp:290
-#: backends/platform/ds/arm9/source/dsoptions.cpp:56
-msgid "~C~lose"
-msgstr "Cerra~r~"
-
-#: engines/scumm/dialogs.cpp:597
+#: engines/scumm/dialogs.cpp:598
msgid "Speech Only"
msgstr "Solo voces"
-#: engines/scumm/dialogs.cpp:598
+#: engines/scumm/dialogs.cpp:599
msgid "Speech and Subtitles"
msgstr "Voces y subtítulos"
-#: engines/scumm/dialogs.cpp:599
+#: engines/scumm/dialogs.cpp:600
msgid "Subtitles Only"
msgstr "Solo subtítulos"
-#: engines/scumm/dialogs.cpp:607
+#: engines/scumm/dialogs.cpp:608
msgctxt "lowres"
msgid "Speech & Subs"
msgstr "Voces y sub."
-#: engines/scumm/dialogs.cpp:653
+#: engines/scumm/dialogs.cpp:654
msgid "Select a Proficiency Level."
msgstr "Selecciona un nivel de dificultad."
-#: engines/scumm/dialogs.cpp:655
+#: engines/scumm/dialogs.cpp:656
msgid "Refer to your Loom(TM) manual for help."
msgstr "Consulta el manual para obtener más información."
-#: engines/scumm/dialogs.cpp:658
-msgid "Standard"
-msgstr "Estándar"
-
-#: engines/scumm/dialogs.cpp:659
+#: engines/scumm/dialogs.cpp:660
msgid "Practice"
msgstr "Práctica"
-#: engines/scumm/dialogs.cpp:660
+#: engines/scumm/dialogs.cpp:661
msgid "Expert"
msgstr "Experto"
@@ -2147,7 +3138,7 @@ msgstr "Volar a la derecha"
msgid "Fly to lower right"
msgstr "Volar abajo y a la derecha"
-#: engines/scumm/scumm.cpp:1776
+#: engines/scumm/scumm.cpp:1777
#, c-format
msgid ""
"Native MIDI support requires the Roland Upgrade from LucasArts,\n"
@@ -2156,40 +3147,7 @@ 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:2303 engines/agos/saveload.cpp:220
-#, c-format
-msgid ""
-"Failed to save game state to file:\n"
-"\n"
-"%s"
-msgstr ""
-"Fallo al guardar en el archivo:\n"
-"\n"
-"%s"
-
-#: engines/scumm/scumm.cpp:2310 engines/agos/saveload.cpp:185
-#, c-format
-msgid ""
-"Failed to load game state from file:\n"
-"\n"
-"%s"
-msgstr ""
-"Fallo al cargar desde el archivo:\n"
-"\n"
-"%s"
-
-#: engines/scumm/scumm.cpp:2322 engines/agos/saveload.cpp:228
-#, c-format
-msgid ""
-"Successfully saved game state in file:\n"
-"\n"
-"%s"
-msgstr ""
-"Partida guardada en el archivo:\n"
-"\n"
-"%s"
-
-#: engines/scumm/scumm.cpp:2537
+#: engines/scumm/scumm.cpp:2547
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' "
@@ -2199,191 +3157,6 @@ 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."
-#. I18N: Option for fast scene switching
-#: engines/mohawk/dialogs.cpp:92 engines/mohawk/dialogs.cpp:167
-msgid "~Z~ip Mode Activated"
-msgstr "Modo ~Z~ip activado"
-
-#: engines/mohawk/dialogs.cpp:93
-msgid "~T~ransitions Enabled"
-msgstr "Tra~n~siciones activadas"
-
-#. I18N: Drop book page
-#: engines/mohawk/dialogs.cpp:95
-msgid "~D~rop Page"
-msgstr "~T~irar página"
-
-#: engines/mohawk/dialogs.cpp:99
-msgid "~S~how Map"
-msgstr "~M~ostrar el mapa"
-
-#: engines/mohawk/dialogs.cpp:105
-msgid "~M~ain Menu"
-msgstr "~M~enú principal"
-
-#: engines/mohawk/dialogs.cpp:168
-msgid "~W~ater Effect Enabled"
-msgstr "Efecto ag~u~a activado"
-
-#: engines/agos/animation.cpp:557
-#, c-format
-msgid "Cutscene file '%s' not found!"
-msgstr "No se ha encontrado el vídeo '%s'"
-
-#: engines/gob/inter_playtoons.cpp:256 engines/gob/inter_v2.cpp:1287
-#: engines/tinsel/saveload.cpp:532
-msgid "Failed to load game state from file."
-msgstr "Fallo al cargar el estado del juego desde el archivo."
-
-#: engines/gob/inter_v2.cpp:1357 engines/tinsel/saveload.cpp:545
-msgid "Failed to save game state to file."
-msgstr "Fallo al guardar el estado del juego en el archivo."
-
-#: engines/gob/inter_v5.cpp:107
-msgid "Failed to delete file."
-msgstr "Fallo al borrar el archivo."
-
-#: engines/groovie/detection.cpp:312
-msgid "Fast movie speed"
-msgstr "Velocidad rápida de vídeos"
-
-#: engines/groovie/detection.cpp:313
-msgid "Play movies at an increased speed"
-msgstr "Reproducir vídeos a mayor velocidad"
-
-#: engines/groovie/script.cpp:420
-msgid "Failed to save game"
-msgstr "Fallo al guardar la partida"
-
-#. I18N: Studio audience adds an applause and cheering sounds whenever
-#. Malcolm makes a joke.
-#: engines/kyra/detection.cpp:62
-msgid "Studio audience"
-msgstr "Risas del público"
-
-#: engines/kyra/detection.cpp:63
-msgid "Enable studio audience"
-msgstr "Activa las risas del público"
-
-#. I18N: This option allows the user to skip text and cutscenes.
-#: engines/kyra/detection.cpp:73
-msgid "Skip support"
-msgstr "Permitir omisiones"
-
-#: engines/kyra/detection.cpp:74
-msgid "Allow text and cutscenes to be skipped"
-msgstr "Permite saltarse frases y vídeos"
-
-#. I18N: Helium mode makes people sound like they've inhaled Helium.
-#: engines/kyra/detection.cpp:84
-msgid "Helium mode"
-msgstr "Modo helio"
-
-#: engines/kyra/detection.cpp:85
-msgid "Enable helium mode"
-msgstr "Activa el modo helio"
-
-#. I18N: When enabled, this option makes scrolling smoother when
-#. changing from one screen to another.
-#: engines/kyra/detection.cpp:99
-msgid "Smooth scrolling"
-msgstr "Desplazamiento suave"
-
-#: engines/kyra/detection.cpp:100
-msgid "Enable smooth scrolling when walking"
-msgstr "Activa el desplazamiento de pantalla suave al caminar"
-
-#. I18N: When enabled, this option changes the cursor when it floats to the
-#. edge of the screen to a directional arrow. The player can then click to
-#. walk towards that direction.
-#: engines/kyra/detection.cpp:112
-msgid "Floating cursors"
-msgstr "Cursores flotantes"
-
-#: engines/kyra/detection.cpp:113
-msgid "Enable floating cursors"
-msgstr "Activar cursores flotantes"
-
-#. I18N: HP stands for Hit Points
-#: engines/kyra/detection.cpp:127
-msgid "HP bar graphs"
-msgstr "Barras de energía"
-
-#: engines/kyra/detection.cpp:128
-msgid "Enable hit point bar graphs"
-msgstr "Activa las barras de energía"
-
-#: engines/kyra/lol.cpp:478
-msgid "Attack 1"
-msgstr "Ataque 1"
-
-#: engines/kyra/lol.cpp:479
-msgid "Attack 2"
-msgstr "Ataque 2"
-
-#: engines/kyra/lol.cpp:480
-msgid "Attack 3"
-msgstr "Ataque 3"
-
-#: engines/kyra/lol.cpp:481
-msgid "Move Forward"
-msgstr "Avanzar"
-
-#: engines/kyra/lol.cpp:482
-msgid "Move Back"
-msgstr "Retroceder"
-
-#: engines/kyra/lol.cpp:483
-msgid "Slide Left"
-msgstr "Deslizarse a la izquierda"
-
-#: engines/kyra/lol.cpp:484
-msgid "Slide Right"
-msgstr "Deslizarse a la derecha"
-
-#: engines/kyra/lol.cpp:485 engines/pegasus/pegasus.cpp:2447
-msgid "Turn Left"
-msgstr "Girar a la izquierda"
-
-#: engines/kyra/lol.cpp:486 engines/pegasus/pegasus.cpp:2448
-msgid "Turn Right"
-msgstr "Girar a la derecha"
-
-#: engines/kyra/lol.cpp:487
-msgid "Rest"
-msgstr "Descansar"
-
-#: engines/kyra/lol.cpp:488
-msgid "Options"
-msgstr "Opciones"
-
-#: engines/kyra/lol.cpp:489
-msgid "Choose Spell"
-msgstr "Elegir hechizo"
-
-#: engines/kyra/sound_midi.cpp:477
-msgid ""
-"You appear to be using a General MIDI device,\n"
-"but your game only supports Roland MT32 MIDI.\n"
-"We try to map the Roland MT32 instruments to\n"
-"General MIDI ones. It is still possible that\n"
-"some tracks sound incorrect."
-msgstr ""
-"Estás usando un dispositivo General MIDI, pero el\n"
-"juego solo es compatible con 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 suenen correctamente."
-
-#: engines/queen/queen.cpp:59
-msgid "Alternative intro"
-msgstr "Introducción alternativa"
-
-#: engines/queen/queen.cpp:60
-msgid "Use an alternative game intro (CD version only)"
-msgstr ""
-"Usa una introducción alternativa para el juego (solo para la versión CD)"
-
#: engines/sky/compact.cpp:130
msgid ""
"Unable to find \"sky.cpt\" file!\n"
@@ -2409,21 +3182,24 @@ msgid "Use the floppy version's intro (CD version only)"
msgstr ""
"Usa la introducción de la versión en disquete (solo para la versión CD)"
-#: engines/sword1/animation.cpp:519
+#: engines/sword1/animation.cpp:524
#, c-format
msgid "PSX stream cutscene '%s' cannot be played in paletted mode"
msgstr "El vídeo de PSX '%s' no se puede reproducir en modo paleta"
-#: engines/sword1/animation.cpp:540 engines/sword2/animation.cpp:439
+#: engines/sword1/animation.cpp:545 engines/sword2/animation.cpp:445
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:550 engines/sword2/animation.cpp:449
-msgid "MPEG2 cutscenes are no longer supported"
-msgstr "Los vídeos MPEG2 ya no son compatibles"
+#: engines/sword1/animation.cpp:561
+#, fuzzy
+msgid "MPEG-2 cutscenes found but ScummVM has been built without MPEG-2"
+msgstr ""
+"Se han encontrado vídeos PSX, pero se ha compilado ScummVM sin soporte de "
+"color RGB"
-#: engines/sword1/animation.cpp:556 engines/sword2/animation.cpp:457
+#: engines/sword1/animation.cpp:568 engines/sword2/animation.cpp:470
#, c-format
msgid "Cutscene '%s' not found"
msgstr "No se ha encontrado el vídeo '%s'"
@@ -2467,13 +3243,20 @@ msgstr "Conservar la nueva"
msgid "This is the end of the Broken Sword 1 Demo"
msgstr "Este es el final de la demo de Broken Sword 1"
-#: engines/sword2/animation.cpp:419
+#: engines/sword2/animation.cpp:425
msgid ""
"PSX cutscenes found but ScummVM has been built without RGB color support"
msgstr ""
"Se han encontrado vídeos PSX, pero se ha compilado ScummVM sin soporte de "
"color RGB"
+#: engines/sword2/animation.cpp:461
+#, fuzzy
+msgid ""
+"MPEG-2 cutscenes found but ScummVM has been built without MPEG-2 support"
+msgstr ""
+"Se han encontrado vídeos DXA, pero se ha compilado ScummVM sin soporte zlib"
+
#: engines/sword2/sword2.cpp:79
msgid "Show object labels"
msgstr "Mostrar etiquetas de objetos"
@@ -2482,14 +3265,14 @@ msgstr "Mostrar etiquetas de objetos"
msgid "Show labels for objects on mouse hover"
msgstr "Muestra las etiquetas de los objetos al pasar el ratón"
-#: engines/teenagent/resources.cpp:94
+#: engines/teenagent/resources.cpp:95
msgid ""
"You're missing the 'teenagent.dat' file. Get it from the ScummVM website"
msgstr ""
"No se encuentra el archivo 'teenagent.dat'. Descárgalo de la página de "
"ScummVM"
-#: engines/teenagent/resources.cpp:115
+#: engines/teenagent/resources.cpp:116
msgid ""
"The teenagent.dat file is compressed and zlib hasn't been included in this "
"executable. Please decompress it"
@@ -2497,791 +3280,51 @@ msgstr ""
"El archivo teenagent.dat está comprimido y este ejecutable no incluye zlib. "
"Por favor, descomprímelo"
-#: engines/parallaction/saveload.cpp:133
-#, c-format
-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:204
-msgid "Loading game..."
-msgstr "Cargando partida..."
-
-#: engines/parallaction/saveload.cpp:219
-msgid "Saving game..."
-msgstr "Guardando partida..."
-
-#: engines/parallaction/saveload.cpp:272
-msgid ""
-"ScummVM found that you have old savefiles for Nippon Safes that should be "
-"renamed.\n"
-"The old names are 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 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:319
-msgid "ScummVM successfully converted all your savefiles."
-msgstr "ScummVM ha convertido todas las partidas guardadas correctamente."
-
-#: engines/parallaction/saveload.cpp:321
-msgid ""
-"ScummVM printed some warnings in your console window and can't guarantee all "
-"your files have been converted.\n"
-"\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."
-
-#: engines/pegasus/pegasus.cpp:679
-msgid "Invalid save file name"
-msgstr "Nombre no válido para la partida"
-
-#: engines/pegasus/pegasus.cpp:2445
-msgid "Up/Zoom In/Move Forward/Open Doors"
-msgstr "Arriba/Zoom/Avanzar/Abrir puertas"
-
-#: engines/pegasus/pegasus.cpp:2446
-msgid "Down/Zoom Out"
-msgstr "Abajo/Reducir zoom"
-
-#: engines/pegasus/pegasus.cpp:2449
-msgid "Display/Hide Inventory Tray"
-msgstr "Mostrar/Ocultar inventario"
-
-#: engines/pegasus/pegasus.cpp:2450
-msgid "Display/Hide Biochip Tray"
-msgstr "Mostrar/Ocultar biochip"
-
-#: engines/pegasus/pegasus.cpp:2451
-msgid "Action/Select"
-msgstr "Acción/Seleccionar"
-
-#: engines/pegasus/pegasus.cpp:2452
-msgid "Toggle Center Data Display"
-msgstr "Activar/Desactivar pantalla de datos"
-
-#: engines/pegasus/pegasus.cpp:2453
-msgid "Display/Hide Info Screen"
-msgstr "Mostrar/Ocultar pantalla de información"
-
-#: engines/pegasus/pegasus.cpp:2454
-msgid "Display/Hide Pause Menu"
-msgstr "Mostrar/Ocultar menú de pausa"
-
-#: engines/pegasus/pegasus.cpp:2455
-msgid "???"
-msgstr "???"
-
-#: audio/fmopl.cpp:49
-msgid "MAME OPL emulator"
-msgstr "Emulador OPL de MAME"
-
-#: audio/fmopl.cpp:51
-msgid "DOSBox OPL emulator"
-msgstr "Emulador OPL de DOSBox"
-
-#: audio/mididrv.cpp:209
-#, c-format
-msgid ""
-"The selected audio device '%s' was not found (e.g. might be turned off or "
-"disconnected)."
-msgstr ""
-"El dispositivo de sonido seleccionado, '%s', no se ha podido encontrar "
-"(puede estar apagado o desconectado)."
-
-#: audio/mididrv.cpp:209 audio/mididrv.cpp:221 audio/mididrv.cpp:257
-#: audio/mididrv.cpp:272
-msgid "Attempting to fall back to the next available device..."
-msgstr "Recorriendo al siguiente dispositivo disponible..."
-
-#: audio/mididrv.cpp:221
-#, c-format
-msgid ""
-"The selected audio device '%s' cannot be used. See log file for more "
-"information."
-msgstr ""
-"El dispositivo de sonido seleccionado, '%s', no se puede utilizar. Consulta "
-"el registro para más información."
-
-#: audio/mididrv.cpp:257
-#, c-format
-msgid ""
-"The preferred audio device '%s' was not found (e.g. might be turned off or "
-"disconnected)."
-msgstr ""
-"El dispositivo de sonido preferido, '%s', no se ha podido encontrar (puede "
-"estar apagado o desconectado)."
-
-#: audio/mididrv.cpp:272
-#, c-format
-msgid ""
-"The preferred audio device '%s' cannot be used. See log file for more "
-"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"
-msgstr "Sin música"
-
-#: audio/mods/paula.cpp:189
-msgid "Amiga Audio Emulator"
-msgstr "Emulador de Amiga Audio"
-
-#: audio/softsynth/adlib.cpp:2284
-msgid "AdLib Emulator"
-msgstr "Emulador de AdLib"
-
-#: audio/softsynth/appleiigs.cpp:33
-msgid "Apple II GS Emulator (NOT IMPLEMENTED)"
-msgstr "Emulador de Apple II GS (NO IMPLEMENTADO)"
-
-#: audio/softsynth/sid.cpp:1430
-msgid "C64 Audio Emulator"
-msgstr "Emulador de C64 Audio"
-
-#: audio/softsynth/mt32.cpp:205
-msgid "Initializing MT-32 Emulator"
-msgstr "Iniciando el emulador de MT-32"
-
-#: audio/softsynth/mt32.cpp:431
-msgid "MT-32 Emulator"
-msgstr "Emulador de MT-32"
-
-#: audio/softsynth/pcspk.cpp:139
-msgid "PC Speaker Emulator"
-msgstr "Emulador del altavoz de PC"
-
-#: audio/softsynth/pcspk.cpp:158
-msgid "IBM PCjr Emulator"
-msgstr "Emulador de IBM PCjr"
-
-#: backends/keymapper/remap-dialog.cpp:47
-msgid "Keymap:"
-msgstr "Asignación de teclas:"
-
-#: backends/keymapper/remap-dialog.cpp:66
-msgid " (Effective)"
-msgstr "(Activa)"
-
-#: backends/keymapper/remap-dialog.cpp:106
-msgid " (Active)"
-msgstr "(Activa)"
-
-#: backends/keymapper/remap-dialog.cpp:106
-msgid " (Blocked)"
-msgstr "(Bloqueado)"
-
-#: backends/keymapper/remap-dialog.cpp:119
-msgid " (Global)"
-msgstr "(General)"
-
-#: backends/keymapper/remap-dialog.cpp:127
-msgid " (Game)"
-msgstr "(Juego)"
-
-#: backends/midi/windows.cpp:164
-msgid "Windows MIDI"
-msgstr "Windows MIDI"
-
-#: backends/platform/ds/arm9/source/dsoptions.cpp:57
-msgid "ScummVM Main Menu"
-msgstr "Menú principal de ScummVM"
-
-#: backends/platform/ds/arm9/source/dsoptions.cpp:63
-msgid "~L~eft handed mode"
-msgstr "Modo para ~z~urdos"
-
-#: backends/platform/ds/arm9/source/dsoptions.cpp:64
-msgid "~I~ndy fight controls"
-msgstr "Controles para pelear de ~I~ndy"
-
-#: backends/platform/ds/arm9/source/dsoptions.cpp:65
-msgid "Show mouse cursor"
-msgstr "Mostrar el cursor"
-
-#: backends/platform/ds/arm9/source/dsoptions.cpp:66
-msgid "Snap to edges"
-msgstr "Pegar a los bordes"
-
-#: backends/platform/ds/arm9/source/dsoptions.cpp:68
-msgid "Touch X Offset"
-msgstr "Compensación X del toque"
-
-#: backends/platform/ds/arm9/source/dsoptions.cpp:75
-msgid "Touch Y Offset"
-msgstr "Compensación Y del toque"
-
-#: backends/platform/ds/arm9/source/dsoptions.cpp:87
-msgid "Use laptop trackpad-style cursor control"
-msgstr "Activar el sistema de control tipo trackpad de los portátiles"
-
-#: backends/platform/ds/arm9/source/dsoptions.cpp:88
-msgid "Tap for left click, double tap right click"
-msgstr "Un toque para clic izquierdo, dos para clic derecho"
-
-#: backends/platform/ds/arm9/source/dsoptions.cpp:90
-msgid "Sensitivity"
-msgstr "Sensibilidad"
-
-#: backends/platform/ds/arm9/source/dsoptions.cpp:99
-msgid "Initial top screen scale:"
-msgstr "Escalado inicial de la pantalla superior:"
-
-#: backends/platform/ds/arm9/source/dsoptions.cpp:105
-msgid "Main screen scaling:"
-msgstr "Escalado de la pantalla principal:"
-
-#: backends/platform/ds/arm9/source/dsoptions.cpp:107
-msgid "Hardware scale (fast, but low quality)"
-msgstr "Escalado por hardware (rápido, pero de baja calidad)"
-
-#: backends/platform/ds/arm9/source/dsoptions.cpp:108
-msgid "Software scale (good quality, but slower)"
-msgstr "Escalado por software (buena calidad, pero más lento)"
-
-#: backends/platform/ds/arm9/source/dsoptions.cpp:109
-msgid "Unscaled (you must scroll left and right)"
-msgstr "Sin escalado (debes desplazar la pantalla a los lados)"
-
-#: backends/platform/ds/arm9/source/dsoptions.cpp:111
-msgid "Brightness:"
-msgstr "Brillo:"
-
-#: backends/platform/ds/arm9/source/dsoptions.cpp:121
-msgid "High quality audio (slower) (reboot)"
-msgstr "Sonido de alta calidad (más lento) (reinicio)"
-
-#: backends/platform/ds/arm9/source/dsoptions.cpp:122
-msgid "Disable power off"
-msgstr "Desactivar apagado"
-
-#: backends/platform/iphone/osys_events.cpp:300
-msgid "Mouse-click-and-drag mode enabled."
-msgstr "Modo clic-de-ratón-y-arrastrar activado."
-
-#: backends/platform/iphone/osys_events.cpp:302
-msgid "Mouse-click-and-drag mode disabled."
-msgstr "Modo clic-de-ratón-y-arrastrar desactivado."
-
-#: backends/platform/iphone/osys_events.cpp:313
-msgid "Touchpad mode enabled."
-msgstr "Modo Touchpad activado."
-
-#: backends/platform/iphone/osys_events.cpp:315
-msgid "Touchpad mode disabled."
-msgstr "Modo Touchpad desactivado."
-
-#: backends/platform/maemo/maemo.cpp:209
-msgid "Click Mode"
-msgstr "Modo clic"
-
-#: backends/platform/maemo/maemo.cpp:215
-#: 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/maemo/maemo.cpp:218
-msgid "Middle Click"
-msgstr "Clic central"
-
-#: backends/platform/maemo/maemo.cpp:221
-#: 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"
-
-#: backends/platform/sdl/macosx/appmenu_osx.mm:77
-msgid "Hide ScummVM"
-msgstr "Ocultar ScummVM"
-
-#: backends/platform/sdl/macosx/appmenu_osx.mm:82
-msgid "Hide Others"
-msgstr "Ocultar otros"
-
-#: backends/platform/sdl/macosx/appmenu_osx.mm:87
-msgid "Show All"
-msgstr "Mostrar todo"
-
-#: backends/platform/sdl/macosx/appmenu_osx.mm:109
-#: backends/platform/sdl/macosx/appmenu_osx.mm:120
-msgid "Window"
-msgstr "Ventana"
-
-#: backends/platform/sdl/macosx/appmenu_osx.mm:114
-msgid "Minimize"
-msgstr "Minimizar"
-
-#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:45
-msgid "Normal (no scaling)"
-msgstr "Normal (sin reescalado)"
-
-#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:64
-msgctxt "lowres"
-msgid "Normal (no scaling)"
-msgstr "Normal"
-
-#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2135
-#: backends/graphics/openglsdl/openglsdl-graphics.cpp:537
-msgid "Enabled aspect ratio correction"
-msgstr "Activar la corrección de aspecto"
-
-#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2141
-#: backends/graphics/openglsdl/openglsdl-graphics.cpp:542
-msgid "Disabled aspect ratio correction"
-msgstr "Desactivar la corrección de aspecto"
-
-#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2196
-msgid "Active graphics filter:"
-msgstr "Filtro de gráficos activo:"
-
-#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2238
-#: backends/graphics/openglsdl/openglsdl-graphics.cpp:481
-msgid "Windowed mode"
-msgstr "Modo ventana"
-
-#: backends/graphics/opengl/opengl-graphics.cpp:135
-msgid "OpenGL Normal"
-msgstr "OpenGL Normal"
-
-#: backends/graphics/opengl/opengl-graphics.cpp:136
-msgid "OpenGL Conserve"
-msgstr "OpenGL Conservar"
-
-#: backends/graphics/opengl/opengl-graphics.cpp:137
-msgid "OpenGL Original"
-msgstr "OpenGL Original"
-
-#: backends/graphics/openglsdl/openglsdl-graphics.cpp:415
-msgid "Current display mode"
-msgstr "Modo de vídeo actual"
-
-#: backends/graphics/openglsdl/openglsdl-graphics.cpp:428
-msgid "Current scale"
-msgstr "Escala actual"
-
-#: backends/graphics/openglsdl/openglsdl-graphics.cpp:562
-msgid "Active filter mode: Linear"
-msgstr "Modo de filtro activo: lineal"
-
-#: backends/graphics/openglsdl/openglsdl-graphics.cpp:564
-msgid "Active filter mode: Nearest"
-msgstr "Modo de filtro activo: más cercano"
-
-#: backends/platform/symbian/src/SymbianActions.cpp:38
-#: backends/platform/wince/CEActionsSmartphone.cpp:39
-msgid "Up"
-msgstr "Arriba"
-
-#: backends/platform/symbian/src/SymbianActions.cpp:39
-#: backends/platform/wince/CEActionsSmartphone.cpp:40
-msgid "Down"
-msgstr "Abajo"
-
-#: backends/platform/symbian/src/SymbianActions.cpp:40
-#: backends/platform/wince/CEActionsSmartphone.cpp:41
-msgid "Left"
-msgstr "Izquierda"
-
-#: backends/platform/symbian/src/SymbianActions.cpp:41
-#: backends/platform/wince/CEActionsSmartphone.cpp:42
-msgid "Right"
-msgstr "Derecha"
-
-#: backends/platform/symbian/src/SymbianActions.cpp:46
-#: backends/platform/wince/CEActionsSmartphone.cpp:47
-msgid "Zone"
-msgstr "Zona"
-
-#: backends/platform/symbian/src/SymbianActions.cpp:47
-#: backends/platform/wince/CEActionsPocket.cpp:54
-#: backends/platform/wince/CEActionsSmartphone.cpp:48
-msgid "Multi Function"
-msgstr "Multifunción"
-
-#: backends/platform/symbian/src/SymbianActions.cpp:48
-msgid "Swap character"
-msgstr "Cambiar personaje"
-
-#: backends/platform/symbian/src/SymbianActions.cpp:49
-msgid "Skip text"
-msgstr "Saltar texto"
-
-#: backends/platform/symbian/src/SymbianActions.cpp:51
-msgid "Fast mode"
-msgstr "Modo rápido"
-
-#: backends/platform/symbian/src/SymbianActions.cpp:53
-msgid "Debugger"
-msgstr "Debugger"
-
-#: backends/platform/symbian/src/SymbianActions.cpp:54
-msgid "Global menu"
-msgstr "Menú general"
-
-#: backends/platform/symbian/src/SymbianActions.cpp:55
-msgid "Virtual keyboard"
-msgstr "Teclado virtual"
-
-#: backends/platform/symbian/src/SymbianActions.cpp:56
-msgid "Key mapper"
-msgstr "Asignación de teclas"
-
-#: backends/events/symbiansdl/symbiansdl-events.cpp:184
-msgid "Do you want to quit ?"
-msgstr "¿Quieres salir?"
-
-#: backends/platform/wii/options.cpp:51
-msgid "Video"
-msgstr "Vídeo"
-
-#: backends/platform/wii/options.cpp:54
-msgid "Current video mode:"
-msgstr "Modo de vídeo actual:"
-
-#: backends/platform/wii/options.cpp:56
-msgid "Double-strike"
-msgstr "Doble golpe"
-
-#: backends/platform/wii/options.cpp:60
-msgid "Horizontal underscan:"
-msgstr "Underscan horizontal:"
-
-#: backends/platform/wii/options.cpp:66
-msgid "Vertical underscan:"
-msgstr "Underscan vertical:"
-
-#: backends/platform/wii/options.cpp:71
-msgid "Input"
-msgstr "Entrada"
-
-#: backends/platform/wii/options.cpp:74
-msgid "GC Pad sensitivity:"
-msgstr "Sensibilidad del pad GC:"
-
-#: backends/platform/wii/options.cpp:80
-msgid "GC Pad acceleration:"
-msgstr "Aceleración del pad GC:"
-
-#: backends/platform/wii/options.cpp:86
-msgid "DVD"
-msgstr "DVD"
-
-#: backends/platform/wii/options.cpp:89 backends/platform/wii/options.cpp:101
-msgid "Status:"
-msgstr "Estado:"
-
-#: backends/platform/wii/options.cpp:90 backends/platform/wii/options.cpp:102
-msgid "Unknown"
-msgstr "Desconocido"
-
-#: backends/platform/wii/options.cpp:93
-msgid "Mount DVD"
-msgstr "Montar DVD"
-
-#: backends/platform/wii/options.cpp:94
-msgid "Unmount DVD"
-msgstr "Desmontar DVD"
-
-#: backends/platform/wii/options.cpp:98
-msgid "SMB"
-msgstr "SMB"
-
-#: backends/platform/wii/options.cpp:106
-msgid "Server:"
-msgstr "Servidor:"
-
-#: backends/platform/wii/options.cpp:110
-msgid "Share:"
-msgstr "Disco compartido:"
-
-#: backends/platform/wii/options.cpp:114
-msgid "Username:"
-msgstr "Usuario:"
-
-#: backends/platform/wii/options.cpp:118
-msgid "Password:"
-msgstr "Contraseña:"
-
-#: backends/platform/wii/options.cpp:121
-msgid "Init network"
-msgstr "Iniciar red"
-
-#: backends/platform/wii/options.cpp:123
-msgid "Mount SMB"
-msgstr "Montar SMB"
-
-#: backends/platform/wii/options.cpp:124
-msgid "Unmount SMB"
-msgstr "Desmontar SMB"
-
-#: backends/platform/wii/options.cpp:143
-msgid "DVD Mounted successfully"
-msgstr "DVD montado con éxito"
-
-#: backends/platform/wii/options.cpp:146
-msgid "Error while mounting the DVD"
-msgstr "Error al montar el DVD"
-
-#: backends/platform/wii/options.cpp:148
-msgid "DVD not mounted"
-msgstr "DVD no montado"
-
-#: backends/platform/wii/options.cpp:161
-msgid "Network up, share mounted"
-msgstr "Red conectada, disco compartido montado"
-
-#: backends/platform/wii/options.cpp:163
-msgid "Network up"
-msgstr "Red conectada"
-
-#: backends/platform/wii/options.cpp:166
-msgid ", error while mounting the share"
-msgstr ", error al montar el disco compartido"
-
-#: backends/platform/wii/options.cpp:168
-msgid ", share not mounted"
-msgstr ", disco compartido no montado"
-
-#: backends/platform/wii/options.cpp:174
-msgid "Network down"
-msgstr "Red desconectada"
-
-#: backends/platform/wii/options.cpp:178
-msgid "Initializing network"
-msgstr "Iniciando la red"
-
-#: backends/platform/wii/options.cpp:182
-msgid "Timeout while initializing network"
-msgstr "Se ha excedido el tiempo de iniciación de red"
-
-#: backends/platform/wii/options.cpp:186
-#, c-format
-msgid "Network not initialized (%d)"
-msgstr "Red no iniciada (%d)"
-
-#: backends/platform/wince/CEActionsPocket.cpp:46
-msgid "Hide Toolbar"
-msgstr "Ocultar barra de tareas"
-
-#: backends/platform/wince/CEActionsPocket.cpp:47
-msgid "Show Keyboard"
-msgstr "Mostrar teclado"
-
-#: backends/platform/wince/CEActionsPocket.cpp:48
-msgid "Sound on/off"
-msgstr "Sonido activado/desactivado"
-
-#: backends/platform/wince/CEActionsPocket.cpp:49
-msgid "Right click"
-msgstr "Clic derecho"
-
-#: backends/platform/wince/CEActionsPocket.cpp:50
-msgid "Show/Hide Cursor"
-msgstr "Mostrar/Ocultar cursor"
-
-#: backends/platform/wince/CEActionsPocket.cpp:51
-msgid "Free look"
-msgstr "Vista libre"
-
-#: backends/platform/wince/CEActionsPocket.cpp:52
-msgid "Zoom up"
-msgstr "Aumentar zoom"
-
-#: backends/platform/wince/CEActionsPocket.cpp:53
-msgid "Zoom down"
-msgstr "Disminuir zoom"
-
-#: backends/platform/wince/CEActionsPocket.cpp:55
-#: backends/platform/wince/CEActionsSmartphone.cpp:49
-msgid "Bind Keys"
-msgstr "Asignar teclas"
-
-#: backends/platform/wince/CEActionsPocket.cpp:56
-msgid "Cursor Up"
-msgstr "Arriba"
-
-#: backends/platform/wince/CEActionsPocket.cpp:57
-msgid "Cursor Down"
-msgstr "Abajo"
-
-#: backends/platform/wince/CEActionsPocket.cpp:58
-msgid "Cursor Left"
-msgstr "Izquierda"
-
-#: backends/platform/wince/CEActionsPocket.cpp:59
-msgid "Cursor Right"
-msgstr "Derecha"
-
-#: 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:326
-#: backends/platform/wince/CEActionsSmartphone.cpp:287
-msgid " Are you sure you want to quit ? "
-msgstr "¿Seguro que quieres salir?"
-
-#: backends/platform/wince/CEActionsSmartphone.cpp:50
-msgid "Keyboard"
-msgstr "Teclado"
-
-#: backends/platform/wince/CEActionsSmartphone.cpp:51
-msgid "Rotate"
-msgstr "Rotar"
-
-#: backends/platform/wince/CELauncherDialog.cpp:56
-msgid "Using SDL driver "
-msgstr "Usando el controlador SDL"
-
-#: backends/platform/wince/CELauncherDialog.cpp:60
-msgid "Display "
-msgstr "Pantalla"
-
-#: 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:515
-msgid "Map right click action"
-msgstr "Asignar acción 'Clic derecho'"
-
-#: 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:528
-msgid "Map hide toolbar action"
-msgstr "Asignar acción 'Ocultar barra de tareas'"
-
-#: 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:541
-msgid "Map Zoom Up action (optional)"
-msgstr "Asignar acción 'Zoom' (opcional)"
-
-#: 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:552
-msgid ""
-"Don't forget to map a key to 'Hide Toolbar' action to see the whole inventory"
-msgstr ""
-"No olvides asignar una tecla a la acción 'Ocultar barra de tareas' para ver "
-"todo el inventario"
-
-#: backends/events/default/default-events.cpp:193
-msgid "Do you really want to return to the Launcher?"
-msgstr "¿Seguro que quieres volver al Lanzador?"
-
-#: backends/events/default/default-events.cpp:193
-msgid "Launcher"
-msgstr "Lanzador"
-
-#: backends/events/default/default-events.cpp:215
-msgid "Do you really want to quit?"
-msgstr "¿Realmente quieres salir?"
-
-#: backends/events/gph/gph-events.cpp:386
-#: backends/events/gph/gph-events.cpp:429
-#: backends/events/openpandora/op-events.cpp:168
-msgid "Touchscreen 'Tap Mode' - Left Click"
-msgstr "'Modo toque' de pantalla táctil - Clic izquierdo"
-
-#: backends/events/gph/gph-events.cpp:388
-#: backends/events/gph/gph-events.cpp:431
-#: backends/events/openpandora/op-events.cpp:170
-msgid "Touchscreen 'Tap Mode' - Right Click"
-msgstr "'Modo toque' de pantalla táctil - Clic derecho"
-
-#: backends/events/gph/gph-events.cpp:390
-#: backends/events/gph/gph-events.cpp:433
-#: backends/events/openpandora/op-events.cpp:172
-msgid "Touchscreen 'Tap Mode' - Hover (No Click)"
-msgstr "'Modo toque' de pantalla táctil - Flotante (sin clic)"
-
-#: backends/events/gph/gph-events.cpp:410
-msgid "Maximum Volume"
-msgstr "Volumen máximo"
+#~ msgctxt "lowres"
+#~ msgid "Mass Add..."
+#~ msgstr "Añad. varios"
-#: backends/events/gph/gph-events.cpp:412
-msgid "Increasing Volume"
-msgstr "Aumentando el volumen"
+#~ msgid "Mass Add..."
+#~ msgstr "Añadir varios..."
-#: backends/events/gph/gph-events.cpp:418
-msgid "Minimal Volume"
-msgstr "Volumen mínimo"
+#~ msgid ""
+#~ "Turns off General MIDI mapping for games with Roland MT-32 soundtrack"
+#~ msgstr ""
+#~ "Desactiva la conversión General MIDI en juegos con sonido Roland MT-32"
-#: backends/events/gph/gph-events.cpp:420
-msgid "Decreasing Volume"
-msgstr "Bajando el volumen"
+#~ msgid "Standard (16bpp)"
+#~ msgstr "Estándar (16bpp)"
-#: backends/events/openpandora/op-events.cpp:174
-msgid "Touchscreen 'Tap Mode' - Hover (DPad Clicks)"
-msgstr "'Modo toque' de pantalla táctil - Flotante (clic de cruceta)"
+#~ msgid "Alternative intro"
+#~ msgstr "Introducción alternativa"
-#: backends/updates/macosx/macosx-updates.mm:67
-msgid "Check for Updates..."
-msgstr "Buscar actualizaciones..."
+#~ msgid "Use an alternative game intro (CD version only)"
+#~ msgstr ""
+#~ "Usa una introducción alternativa para el juego (solo para la versión CD)"
-#: backends/platform/bada/form.cpp:269
-msgid "Right Click Once"
-msgstr "Un clic derecho"
+#~ msgid "MPEG2 cutscenes are no longer supported"
+#~ msgstr "Los vídeos MPEG2 ya no son compatibles"
-#: backends/platform/bada/form.cpp:277
-msgid "Move Only"
-msgstr "Solo mover"
+#~ msgid "OpenGL Normal"
+#~ msgstr "OpenGL Normal"
-#: backends/platform/bada/form.cpp:291
-msgid "Escape Key"
-msgstr "Tecla Escape"
+#~ msgid "OpenGL Conserve"
+#~ msgstr "OpenGL Conservar"
-#: backends/platform/bada/form.cpp:296
-msgid "Game Menu"
-msgstr "Menú del juego"
+#~ msgid "OpenGL Original"
+#~ msgstr "OpenGL Original"
-#: backends/platform/bada/form.cpp:301
-msgid "Show Keypad"
-msgstr "Mostrar el teclado numérico"
+#~ msgid "Current display mode"
+#~ msgstr "Modo de vídeo actual"
-#: backends/platform/bada/form.cpp:309
-msgid "Control Mouse"
-msgstr "Control del ratón"
+#~ msgid "Current scale"
+#~ msgstr "Escala actual"
-#: backends/events/maemosdl/maemosdl-events.cpp:192
-msgid "Clicking Enabled"
-msgstr "Clic activado"
+#~ msgid "Active filter mode: Linear"
+#~ msgstr "Modo de filtro activo: lineal"
-#: backends/events/maemosdl/maemosdl-events.cpp:192
-msgid "Clicking Disabled"
-msgstr "Clic desactivado"
+#~ msgid "Active filter mode: Nearest"
+#~ msgstr "Modo de filtro activo: más cercano"
#~ msgid "Enable Roland GS Mode"
#~ msgstr "Activar modo Roland GS"
diff --git a/po/eu.po b/po/eu.po
index 87a78ed044..be771d14d3 100644
--- a/po/eu.po
+++ b/po/eu.po
@@ -1,5 +1,5 @@
# Basque translation for ScummVM.
-# Copyright (C) 2012-2013 ScummVM Team
+# Copyright (C) 2012-2014 ScummVM Team
# This file is distributed under the same license as the ScummVM package.
# Mikel Iturbe Urretxa <mikel@hamahiru.org>, 2012.
#
@@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: ScummVM 1.5.0git\n"
"Report-Msgid-Bugs-To: scummvm-devel@lists.sf.net\n"
-"POT-Creation-Date: 2013-04-24 13:35+0100\n"
+"POT-Creation-Date: 2014-06-07 23:06+0100\n"
"PO-Revision-Date: 2011-12-15 14:53+0100\n"
"Last-Translator: Mikel Iturbe Urretxa <mikel@hamahiru.org>\n"
"Language-Team: Librezale <librezale@librezale.org>\n"
@@ -16,78 +16,78 @@ msgstr ""
"Content-Type: text/plain; charset=iso-8859-1\n"
"Content-Transfer-Encoding: 8bit\n"
-#: gui/about.cpp:93
+#: gui/about.cpp:94
#, c-format
msgid "(built on %s)"
msgstr "(%s-(e)an konpilatua)"
-#: gui/about.cpp:100
+#: gui/about.cpp:101
msgid "Features compiled in:"
msgstr "Ezaugarri erantsiak:"
-#: gui/about.cpp:109
+#: gui/about.cpp:110
msgid "Available engines:"
msgstr "Motore erabilgarriak:"
-#: gui/browser.cpp:67
+#: gui/browser.cpp:68
#, fuzzy
msgid "Show hidden files"
msgstr "Kontsola erakutsi / ezkutatu"
-#: gui/browser.cpp:67
+#: gui/browser.cpp:68
msgid "Show files marked with the hidden attribute"
msgstr ""
-#: gui/browser.cpp:71
+#: gui/browser.cpp:72
msgid "Go up"
msgstr "Joan gora"
-#: gui/browser.cpp:71 gui/browser.cpp:73
+#: gui/browser.cpp:72 gui/browser.cpp:74
msgid "Go to previous directory level"
msgstr "Igo aurreko direktorio-mailara"
-#: gui/browser.cpp:73
+#: gui/browser.cpp:74
msgctxt "lowres"
msgid "Go up"
msgstr "Joan gora"
-#: gui/browser.cpp:74 gui/chooser.cpp:45 gui/KeysDialog.cpp:43
-#: gui/launcher.cpp:345 gui/massadd.cpp:94 gui/options.cpp:1238
-#: gui/saveload-dialog.cpp:215 gui/saveload-dialog.cpp:275
-#: gui/saveload-dialog.cpp:545 gui/saveload-dialog.cpp:919
-#: gui/themebrowser.cpp:54 gui/fluidsynth-dialog.cpp:151
-#: engines/engine.cpp:447 engines/drascula/saveload.cpp:51
-#: engines/scumm/dialogs.cpp:190 engines/sword1/control.cpp:865
-#: engines/parallaction/saveload.cpp:274 backends/platform/wii/options.cpp:48
-#: backends/events/default/default-events.cpp:193
-#: backends/events/default/default-events.cpp:215
+#: gui/browser.cpp:75 gui/chooser.cpp:46 gui/KeysDialog.cpp:43
+#: gui/launcher.cpp:351 gui/massadd.cpp:95 gui/options.cpp:1239
+#: gui/saveload-dialog.cpp:216 gui/saveload-dialog.cpp:276
+#: gui/saveload-dialog.cpp:547 gui/saveload-dialog.cpp:922
+#: gui/themebrowser.cpp:55 gui/fluidsynth-dialog.cpp:152
+#: engines/engine.cpp:452 backends/platform/wii/options.cpp:48
+#: backends/events/default/default-events.cpp:196
+#: backends/events/default/default-events.cpp:218
+#: engines/drascula/saveload.cpp:49 engines/parallaction/saveload.cpp:274
+#: engines/scumm/dialogs.cpp:191 engines/sword1/control.cpp:865
msgid "Cancel"
msgstr "Utzi"
-#: gui/browser.cpp:75 gui/chooser.cpp:46 gui/themebrowser.cpp:55
+#: gui/browser.cpp:76 gui/chooser.cpp:47 gui/themebrowser.cpp:56
msgid "Choose"
msgstr "Aukeratu"
-#: gui/gui-manager.cpp:115 engines/scumm/help.cpp:125
-#: engines/scumm/help.cpp:140 engines/scumm/help.cpp:165
-#: engines/scumm/help.cpp:191 engines/scumm/help.cpp:209
-#: backends/keymapper/remap-dialog.cpp:52
+#: gui/gui-manager.cpp:117 backends/keymapper/remap-dialog.cpp:53
+#: engines/scumm/help.cpp:125 engines/scumm/help.cpp:140
+#: engines/scumm/help.cpp:165 engines/scumm/help.cpp:191
+#: engines/scumm/help.cpp:209
msgid "Close"
msgstr "Itxi"
-#: gui/gui-manager.cpp:118
+#: gui/gui-manager.cpp:120
msgid "Mouse click"
msgstr "Sagu-klika"
-#: gui/gui-manager.cpp:122 base/main.cpp:301
+#: gui/gui-manager.cpp:124 base/main.cpp:319
msgid "Display keyboard"
msgstr "Teklatua erakutsi"
-#: gui/gui-manager.cpp:126 base/main.cpp:305
+#: gui/gui-manager.cpp:128 base/main.cpp:323
msgid "Remap keys"
msgstr "Teklak esleitu"
-#: gui/gui-manager.cpp:129 base/main.cpp:308
+#: gui/gui-manager.cpp:131 base/main.cpp:326
msgid "Toggle FullScreen"
msgstr "Txandakatu pantaila osoa"
@@ -99,21 +99,21 @@ msgstr "Aukeratu esleituko den ekintza"
msgid "Map"
msgstr "Esleitu"
-#: gui/KeysDialog.cpp:42 gui/launcher.cpp:346 gui/launcher.cpp:1001
-#: gui/launcher.cpp:1005 gui/massadd.cpp:91 gui/options.cpp:1239
-#: gui/saveload-dialog.cpp:920 gui/fluidsynth-dialog.cpp:152
-#: engines/engine.cpp:366 engines/engine.cpp:377
-#: engines/drascula/saveload.cpp:51 engines/scumm/dialogs.cpp:192
-#: engines/scumm/scumm.cpp:1778 engines/agos/animation.cpp:558
-#: engines/groovie/script.cpp:420 engines/sky/compact.cpp:131
-#: engines/sky/compact.cpp:141 engines/sword1/animation.cpp:519
-#: engines/sword1/animation.cpp:540 engines/sword1/animation.cpp:550
-#: engines/sword1/animation.cpp:557 engines/sword1/control.cpp:865
-#: engines/sword1/logic.cpp:1633 engines/sword2/animation.cpp:419
-#: engines/sword2/animation.cpp:439 engines/sword2/animation.cpp:449
-#: engines/sword2/animation.cpp:458 engines/parallaction/saveload.cpp:274
+#: gui/KeysDialog.cpp:42 gui/launcher.cpp:352 gui/launcher.cpp:1048
+#: gui/launcher.cpp:1052 gui/massadd.cpp:92 gui/options.cpp:1240
+#: gui/saveload-dialog.cpp:923 gui/fluidsynth-dialog.cpp:153
+#: engines/engine.cpp:371 engines/engine.cpp:382
#: backends/platform/wii/options.cpp:47
#: backends/platform/wince/CELauncherDialog.cpp:54
+#: engines/agos/animation.cpp:558 engines/drascula/saveload.cpp:49
+#: engines/groovie/script.cpp:399 engines/parallaction/saveload.cpp:274
+#: engines/scumm/dialogs.cpp:193 engines/scumm/scumm.cpp:1779
+#: engines/sky/compact.cpp:131 engines/sky/compact.cpp:141
+#: engines/sword1/animation.cpp:524 engines/sword1/animation.cpp:545
+#: engines/sword1/animation.cpp:561 engines/sword1/animation.cpp:569
+#: engines/sword1/control.cpp:865 engines/sword1/logic.cpp:1633
+#: engines/sword2/animation.cpp:425 engines/sword2/animation.cpp:445
+#: engines/sword2/animation.cpp:461 engines/sword2/animation.cpp:471
msgid "OK"
msgstr "Ados"
@@ -139,15 +139,15 @@ msgstr "Mesedez, aukeratu ekintza bat"
msgid "Press the key to associate"
msgstr "Sakatu esleituko den tekla"
-#: gui/launcher.cpp:187
+#: gui/launcher.cpp:193
msgid "Game"
msgstr "Jokoa"
-#: gui/launcher.cpp:191
+#: gui/launcher.cpp:197
msgid "ID:"
msgstr "ID:"
-#: gui/launcher.cpp:191 gui/launcher.cpp:193 gui/launcher.cpp:194
+#: gui/launcher.cpp:197 gui/launcher.cpp:199 gui/launcher.cpp:200
msgid ""
"Short game identifier used for referring to savegames and running the game "
"from the command line"
@@ -155,316 +155,317 @@ msgstr ""
"Partida gordeak identifikatzeko eta jokoa komando lerrotik abiarazteko "
"erabiltzen den identifikatzailea"
-#: gui/launcher.cpp:193
+#: gui/launcher.cpp:199
msgctxt "lowres"
msgid "ID:"
msgstr "ID:"
-#: gui/launcher.cpp:198
+#: gui/launcher.cpp:204
msgid "Name:"
msgstr "Izena:"
-#: gui/launcher.cpp:198 gui/launcher.cpp:200 gui/launcher.cpp:201
+#: gui/launcher.cpp:204 gui/launcher.cpp:206 gui/launcher.cpp:207
msgid "Full title of the game"
msgstr "Jokoaren izen osoa"
-#: gui/launcher.cpp:200
+#: gui/launcher.cpp:206
msgctxt "lowres"
msgid "Name:"
msgstr "Izena:"
-#: gui/launcher.cpp:204
+#: gui/launcher.cpp:210
msgid "Language:"
msgstr "Hizkuntza:"
-#: gui/launcher.cpp:204 gui/launcher.cpp:205
+#: gui/launcher.cpp:210 gui/launcher.cpp:211
msgid ""
"Language of the game. This will not turn your Spanish game version into "
"English"
msgstr ""
"Jokoaren hizkuntza. Honek ez du zure ingelesezko bertsioa frantsesera pasako"
-#: gui/launcher.cpp:206 gui/launcher.cpp:220 gui/options.cpp:86
-#: gui/options.cpp:736 gui/options.cpp:749 gui/options.cpp:1209
-#: audio/null.cpp:40
+#: gui/launcher.cpp:212 gui/launcher.cpp:226 gui/options.cpp:87
+#: gui/options.cpp:737 gui/options.cpp:750 gui/options.cpp:1210
+#: audio/null.cpp:41
msgid "<default>"
msgstr "<lehenetsia>"
-#: gui/launcher.cpp:216
+#: gui/launcher.cpp:222
msgid "Platform:"
msgstr "Plataforma:"
-#: gui/launcher.cpp:216 gui/launcher.cpp:218 gui/launcher.cpp:219
+#: gui/launcher.cpp:222 gui/launcher.cpp:224 gui/launcher.cpp:225
msgid "Platform the game was originally designed for"
msgstr "Jatorriz, jokoa diseinatua izan zen plataforma"
-#: gui/launcher.cpp:218
+#: gui/launcher.cpp:224
msgctxt "lowres"
msgid "Platform:"
msgstr "Plataforma:"
-#: gui/launcher.cpp:231
+#: gui/launcher.cpp:237
#, fuzzy
msgid "Engine"
msgstr "Aztertu"
-#: gui/launcher.cpp:239 gui/options.cpp:1072 gui/options.cpp:1089
+#: gui/launcher.cpp:245 gui/options.cpp:1073 gui/options.cpp:1090
msgid "Graphics"
msgstr "Grafikoak"
-#: gui/launcher.cpp:239 gui/options.cpp:1072 gui/options.cpp:1089
+#: gui/launcher.cpp:245 gui/options.cpp:1073 gui/options.cpp:1090
msgid "GFX"
msgstr "GFX"
-#: gui/launcher.cpp:242
+#: gui/launcher.cpp:248
msgid "Override global graphic settings"
msgstr "Ezarpen grafiko globalak baliogabetu"
-#: gui/launcher.cpp:244
+#: gui/launcher.cpp:250
msgctxt "lowres"
msgid "Override global graphic settings"
msgstr "Ezarpen grafiko globalak baliogabetu"
-#: gui/launcher.cpp:251 gui/options.cpp:1095
+#: gui/launcher.cpp:257 gui/options.cpp:1096
msgid "Audio"
msgstr "Soinua"
-#: gui/launcher.cpp:254
+#: gui/launcher.cpp:260
msgid "Override global audio settings"
msgstr "Soinu ezarpen globalak baliogabetu"
-#: gui/launcher.cpp:256
+#: gui/launcher.cpp:262
msgctxt "lowres"
msgid "Override global audio settings"
msgstr "Soinu ezarpen globalak baliogabetu"
-#: gui/launcher.cpp:265 gui/options.cpp:1100
+#: gui/launcher.cpp:271 gui/options.cpp:1101
msgid "Volume"
msgstr "Bolumena"
-#: gui/launcher.cpp:267 gui/options.cpp:1102
+#: gui/launcher.cpp:273 gui/options.cpp:1103
msgctxt "lowres"
msgid "Volume"
msgstr "Bolumena"
-#: gui/launcher.cpp:270
+#: gui/launcher.cpp:276
msgid "Override global volume settings"
msgstr "Bolumen ezarpen globalak baliogabetu"
-#: gui/launcher.cpp:272
+#: gui/launcher.cpp:278
msgctxt "lowres"
msgid "Override global volume settings"
msgstr "Bolumen ezarpen globalak baliogabetu"
-#: gui/launcher.cpp:280 gui/options.cpp:1110
+#: gui/launcher.cpp:286 gui/options.cpp:1111
msgid "MIDI"
msgstr "MIDI"
-#: gui/launcher.cpp:283
+#: gui/launcher.cpp:289
msgid "Override global MIDI settings"
msgstr "MIDI ezarpen globalak baliogabetu"
-#: gui/launcher.cpp:285
+#: gui/launcher.cpp:291
msgctxt "lowres"
msgid "Override global MIDI settings"
msgstr "MIDI ezarpen globalak baliogabetu"
-#: gui/launcher.cpp:294 gui/options.cpp:1116
+#: gui/launcher.cpp:300 gui/options.cpp:1117
msgid "MT-32"
msgstr "MT-32"
-#: gui/launcher.cpp:297
+#: gui/launcher.cpp:303
msgid "Override global MT-32 settings"
msgstr "MT-32 ezarpen globalak baliogabetu"
-#: gui/launcher.cpp:299
+#: gui/launcher.cpp:305
msgctxt "lowres"
msgid "Override global MT-32 settings"
msgstr "MT-32 ezarpen globalak baliogabetu"
-#: gui/launcher.cpp:308 gui/options.cpp:1123
+#: gui/launcher.cpp:314 gui/options.cpp:1124
msgid "Paths"
msgstr "Bide-izenak"
-#: gui/launcher.cpp:310 gui/options.cpp:1125
+#: gui/launcher.cpp:316 gui/options.cpp:1126
msgctxt "lowres"
msgid "Paths"
msgstr "Bideak"
-#: gui/launcher.cpp:317
+#: gui/launcher.cpp:323
msgid "Game Path:"
msgstr "Jokoa:"
-#: gui/launcher.cpp:319
+#: gui/launcher.cpp:325
msgctxt "lowres"
msgid "Game Path:"
msgstr "Jokoa:"
-#: gui/launcher.cpp:324 gui/options.cpp:1149
+#: gui/launcher.cpp:330 gui/options.cpp:1150
msgid "Extra Path:"
msgstr "Gehigarriak:"
-#: gui/launcher.cpp:324 gui/launcher.cpp:326 gui/launcher.cpp:327
+#: gui/launcher.cpp:330 gui/launcher.cpp:332 gui/launcher.cpp:333
msgid "Specifies path to additional data used the game"
msgstr "Jokoak erabiltzen duen datu gehigarrien bide-izena"
-#: gui/launcher.cpp:326 gui/options.cpp:1151
+#: gui/launcher.cpp:332 gui/options.cpp:1152
msgctxt "lowres"
msgid "Extra Path:"
msgstr "Gehigarria:"
-#: gui/launcher.cpp:333 gui/options.cpp:1133
+#: gui/launcher.cpp:339 gui/options.cpp:1134
msgid "Save Path:"
msgstr "Partida gordeak:"
-#: gui/launcher.cpp:333 gui/launcher.cpp:335 gui/launcher.cpp:336
-#: gui/options.cpp:1133 gui/options.cpp:1135 gui/options.cpp:1136
+#: gui/launcher.cpp:339 gui/launcher.cpp:341 gui/launcher.cpp:342
+#: gui/options.cpp:1134 gui/options.cpp:1136 gui/options.cpp:1137
msgid "Specifies where your savegames are put"
msgstr "Zure gordetako partidak non gordeko diren zehazten du"
-#: gui/launcher.cpp:335 gui/options.cpp:1135
+#: gui/launcher.cpp:341 gui/options.cpp:1136
msgctxt "lowres"
msgid "Save Path:"
msgstr "Partida gordeak:"
-#: gui/launcher.cpp:354 gui/launcher.cpp:453 gui/launcher.cpp:511
-#: gui/launcher.cpp:565 gui/options.cpp:1144 gui/options.cpp:1152
-#: gui/options.cpp:1161 gui/options.cpp:1276 gui/options.cpp:1282
-#: gui/options.cpp:1290 gui/options.cpp:1320 gui/options.cpp:1326
-#: gui/options.cpp:1333 gui/options.cpp:1426 gui/options.cpp:1429
-#: gui/options.cpp:1441
+#: gui/launcher.cpp:360 gui/launcher.cpp:459 gui/launcher.cpp:517
+#: gui/launcher.cpp:571 gui/options.cpp:1145 gui/options.cpp:1153
+#: gui/options.cpp:1162 gui/options.cpp:1277 gui/options.cpp:1283
+#: gui/options.cpp:1291 gui/options.cpp:1321 gui/options.cpp:1327
+#: gui/options.cpp:1334 gui/options.cpp:1427 gui/options.cpp:1430
+#: gui/options.cpp:1442
msgctxt "path"
msgid "None"
msgstr "Bat ere ez"
-#: gui/launcher.cpp:359 gui/launcher.cpp:459 gui/launcher.cpp:569
-#: gui/options.cpp:1270 gui/options.cpp:1314 gui/options.cpp:1432
+#: gui/launcher.cpp:365 gui/launcher.cpp:465 gui/launcher.cpp:575
+#: gui/options.cpp:1271 gui/options.cpp:1315 gui/options.cpp:1433
#: backends/platform/wii/options.cpp:56
msgid "Default"
msgstr "Lehenetsia"
-#: gui/launcher.cpp:504 gui/options.cpp:1435
+#: gui/launcher.cpp:510 gui/options.cpp:1436
msgid "Select SoundFont"
msgstr "SoundFont-a aukeratu"
-#: gui/launcher.cpp:523 gui/launcher.cpp:677
+#: gui/launcher.cpp:529 gui/launcher.cpp:682
msgid "Select directory with game data"
msgstr "Jokoaren direktorioa aukeratu"
-#: gui/launcher.cpp:541
+#: gui/launcher.cpp:547
msgid "Select additional game directory"
msgstr "Direktorio gehigarria aukeratu"
-#: gui/launcher.cpp:553
+#: gui/launcher.cpp:559
msgid "Select directory for saved games"
msgstr "Partida gordeen direktorioa aukeratu"
-#: gui/launcher.cpp:580
+#: gui/launcher.cpp:586
msgid "This game ID is already taken. Please choose another one."
msgstr "ID hau jada erabilia izaten ari da. Mesedez, aukeratu beste bat."
-#: gui/launcher.cpp:621 engines/dialogs.cpp:110
+#: gui/launcher.cpp:626 engines/dialogs.cpp:111
msgid "~Q~uit"
msgstr "~I~rten"
-#: gui/launcher.cpp:621 backends/platform/sdl/macosx/appmenu_osx.mm:95
+#: gui/launcher.cpp:626 backends/platform/sdl/macosx/appmenu_osx.mm:95
msgid "Quit ScummVM"
msgstr "Irten ScummVM-tik"
-#: gui/launcher.cpp:622
+#: gui/launcher.cpp:627
msgid "A~b~out..."
msgstr "Ho~n~i buruz..."
-#: gui/launcher.cpp:622 backends/platform/sdl/macosx/appmenu_osx.mm:69
+#: gui/launcher.cpp:627 backends/platform/sdl/macosx/appmenu_osx.mm:69
msgid "About ScummVM"
msgstr "ScummVM-i buruz"
-#: gui/launcher.cpp:623
+#: gui/launcher.cpp:628
msgid "~O~ptions..."
msgstr "~A~ukerak"
-#: gui/launcher.cpp:623
+#: gui/launcher.cpp:628
msgid "Change global ScummVM options"
msgstr "ScummVM-ren aukera globalak aldatu"
-#: gui/launcher.cpp:625
+#: gui/launcher.cpp:630
msgid "~S~tart"
msgstr "~H~asi"
-#: gui/launcher.cpp:625
+#: gui/launcher.cpp:630
msgid "Start selected game"
msgstr "Aukeraturiko jokora jolastu"
-#: gui/launcher.cpp:628
+#: gui/launcher.cpp:633
msgid "~L~oad..."
msgstr "~K~argatu"
-#: gui/launcher.cpp:628
+#: gui/launcher.cpp:633
msgid "Load savegame for selected game"
msgstr "Aukeraturiko jokorako partida gordea kargatu"
-#: gui/launcher.cpp:633 gui/launcher.cpp:1120
+#: gui/launcher.cpp:638
msgid "~A~dd Game..."
msgstr "~G~ehitu..."
-#: gui/launcher.cpp:633 gui/launcher.cpp:640
+#: gui/launcher.cpp:638 gui/launcher.cpp:645
msgid "Hold Shift for Mass Add"
msgstr "Shift mantendu sakaturik hainbat joko gehitzeko"
-#: gui/launcher.cpp:635
+#: gui/launcher.cpp:640
msgid "~E~dit Game..."
msgstr "~E~ditatu..."
-#: gui/launcher.cpp:635 gui/launcher.cpp:642
+#: gui/launcher.cpp:640 gui/launcher.cpp:647
msgid "Change game options"
msgstr "Aldatu jokoaren aukerak"
-#: gui/launcher.cpp:637
+#: gui/launcher.cpp:642
msgid "~R~emove Game"
msgstr "~K~endu jokoa"
-#: gui/launcher.cpp:637 gui/launcher.cpp:644
+#: gui/launcher.cpp:642 gui/launcher.cpp:649
msgid "Remove game from the list. The game data files stay intact"
msgstr "Jokoa zerrendatik kendu. Jokoaren fitxategiak ez dira ezabatzen"
-#: gui/launcher.cpp:640 gui/launcher.cpp:1120
+#: gui/launcher.cpp:645
msgctxt "lowres"
msgid "~A~dd Game..."
msgstr "~G~ehitu..."
-#: gui/launcher.cpp:642
+#: gui/launcher.cpp:647
msgctxt "lowres"
msgid "~E~dit Game..."
msgstr "~E~ditatu..."
-#: gui/launcher.cpp:644
+#: gui/launcher.cpp:649
msgctxt "lowres"
msgid "~R~emove Game"
msgstr "~K~endu"
-#: gui/launcher.cpp:652
+#: gui/launcher.cpp:657
msgid "Search in game list"
msgstr "Bilatu joko-zerrendan"
-#: gui/launcher.cpp:656 gui/launcher.cpp:1167
+#: gui/launcher.cpp:661 gui/launcher.cpp:1222
msgid "Search:"
msgstr "Bilatu:"
-#: gui/launcher.cpp:680 engines/dialogs.cpp:114 engines/mohawk/myst.cpp:245
-#: engines/mohawk/riven.cpp:716 engines/cruise/menu.cpp:214
-#: engines/pegasus/pegasus.cpp:349
+#: gui/launcher.cpp:685 engines/dialogs.cpp:115 engines/cruise/menu.cpp:214
+#: engines/mohawk/myst.cpp:245 engines/mohawk/riven.cpp:718
+#: engines/pegasus/pegasus.cpp:353
msgid "Load game:"
msgstr "Jokoa kargatu:"
-#: gui/launcher.cpp:680 engines/dialogs.cpp:114 engines/scumm/dialogs.cpp:188
-#: engines/mohawk/myst.cpp:245 engines/mohawk/riven.cpp:716
-#: engines/cruise/menu.cpp:214 engines/pegasus/pegasus.cpp:349
+#: gui/launcher.cpp:685 engines/dialogs.cpp:115
#: backends/platform/wince/CEActionsPocket.cpp:267
#: backends/platform/wince/CEActionsSmartphone.cpp:231
+#: engines/cruise/menu.cpp:214 engines/mohawk/myst.cpp:245
+#: engines/mohawk/riven.cpp:718 engines/pegasus/pegasus.cpp:353
+#: engines/scumm/dialogs.cpp:189
msgid "Load"
msgstr "Kargatu"
-#: gui/launcher.cpp:788
+#: gui/launcher.cpp:792
msgid ""
"Do you really want to run the mass game detector? This could potentially add "
"a huge number of games."
@@ -472,7 +473,8 @@ msgstr ""
"Joko detektatzaile masiboa exekutatu nahi al duzu? Honek joko kantitate "
"handia gehitu dezake."
-#: gui/launcher.cpp:789 gui/launcher.cpp:937 gui/fluidsynth-dialog.cpp:216
+#: gui/launcher.cpp:793 gui/launcher.cpp:941 gui/launcher.cpp:1000
+#: gui/fluidsynth-dialog.cpp:217
#: backends/events/symbiansdl/symbiansdl-events.cpp:184
#: backends/platform/wince/CEActionsPocket.cpp:326
#: backends/platform/wince/CEActionsSmartphone.cpp:287
@@ -480,7 +482,8 @@ msgstr ""
msgid "Yes"
msgstr "Bai"
-#: gui/launcher.cpp:789 gui/launcher.cpp:937 gui/fluidsynth-dialog.cpp:216
+#: gui/launcher.cpp:793 gui/launcher.cpp:941 gui/launcher.cpp:1000
+#: gui/fluidsynth-dialog.cpp:217
#: backends/events/symbiansdl/symbiansdl-events.cpp:184
#: backends/platform/wince/CEActionsPocket.cpp:326
#: backends/platform/wince/CEActionsSmartphone.cpp:287
@@ -488,193 +491,188 @@ msgstr "Bai"
msgid "No"
msgstr "Ez"
-#: gui/launcher.cpp:837
+#: gui/launcher.cpp:841
msgid "ScummVM couldn't open the specified directory!"
msgstr "ScummVM-k ezin izan du zehazturiko direktorioa ireki!"
-#: gui/launcher.cpp:849
+#: gui/launcher.cpp:853
msgid "ScummVM could not find any game in the specified directory!"
msgstr "ScummVM-k ezin izan du jokorik aurkitu zehazturiko direktorioan!"
-#: gui/launcher.cpp:863
+#: gui/launcher.cpp:867
msgid "Pick the game:"
msgstr "Jokoa aukeratu:"
-#: gui/launcher.cpp:937
+#: gui/launcher.cpp:941
msgid "Do you really want to remove this game configuration?"
msgstr "Benetan ezabatu nahi duzu joko-konfigurazio hau?"
-#: gui/launcher.cpp:1001
+#: gui/launcher.cpp:999
+#, fuzzy
+msgid "Do you want to load savegame?"
+msgstr "Jokoa kargatu edo gorde nahi duzu?"
+
+#: gui/launcher.cpp:1048
msgid "This game does not support loading games from the launcher."
msgstr "Joko honek ez du uzten partidak abiarazletik kargatzen."
-#: gui/launcher.cpp:1005
+#: gui/launcher.cpp:1052
msgid "ScummVM could not find any engine capable of running the selected game!"
msgstr ""
"ScummVM-k ezin izan du aukeraturiko jokoa exekutatzeko gai den motorerik "
"aurkitu!"
-#: gui/launcher.cpp:1119
-msgctxt "lowres"
-msgid "Mass Add..."
-msgstr "Hainbat gehitu..."
-
-#: gui/launcher.cpp:1119
-msgid "Mass Add..."
-msgstr "Hainbat gehitu..."
-
-#: gui/massadd.cpp:78 gui/massadd.cpp:81
+#: gui/massadd.cpp:79 gui/massadd.cpp:82
msgid "... progress ..."
msgstr "... aurrerapena ..."
-#: gui/massadd.cpp:258
+#: gui/massadd.cpp:259
msgid "Scan complete!"
msgstr "Bilaketa amaitua!"
-#: gui/massadd.cpp:261
+#: gui/massadd.cpp:262
#, c-format
msgid "Discovered %d new games, ignored %d previously added games."
msgstr ""
"%d joko berri aurkitu dira, aurretik gehituriko %d ez dira kontuan hartu"
-#: gui/massadd.cpp:265
+#: gui/massadd.cpp:266
#, c-format
msgid "Scanned %d directories ..."
msgstr "%d direktorio eskaneatu dira ..."
-#: gui/massadd.cpp:268
+#: gui/massadd.cpp:269
#, c-format
msgid "Discovered %d new games, ignored %d previously added games ..."
msgstr ""
"%d joko berri aurkitu dira, aurretik gehituriko %d ez dira kontuan hartu"
-#: gui/options.cpp:84
+#: gui/options.cpp:85
msgid "Never"
msgstr "Inoiz ez"
-#: gui/options.cpp:84
+#: gui/options.cpp:85
msgid "every 5 mins"
msgstr "5 minuturo"
-#: gui/options.cpp:84
+#: gui/options.cpp:85
msgid "every 10 mins"
msgstr "10 minuturo"
-#: gui/options.cpp:84
+#: gui/options.cpp:85
msgid "every 15 mins"
msgstr "15 minuturo"
-#: gui/options.cpp:84
+#: gui/options.cpp:85
msgid "every 30 mins"
msgstr "30 minuturo"
-#: gui/options.cpp:86
+#: gui/options.cpp:87
msgid "8 kHz"
msgstr "8 kHz"
-#: gui/options.cpp:86
+#: gui/options.cpp:87
msgid "11kHz"
msgstr "11kHz"
-#: gui/options.cpp:86
+#: gui/options.cpp:87
msgid "22 kHz"
msgstr "22 kHz"
-#: gui/options.cpp:86
+#: gui/options.cpp:87
msgid "44 kHz"
msgstr "44 kHz"
-#: gui/options.cpp:86
+#: gui/options.cpp:87
msgid "48 kHz"
msgstr "48 kHz"
-#: gui/options.cpp:254 gui/options.cpp:480 gui/options.cpp:581
-#: gui/options.cpp:650 gui/options.cpp:858
+#: gui/options.cpp:255 gui/options.cpp:481 gui/options.cpp:582
+#: gui/options.cpp:651 gui/options.cpp:859
msgctxt "soundfont"
msgid "None"
msgstr "Bat ere ez"
-#: gui/options.cpp:388
+#: gui/options.cpp:389
msgid "Failed to apply some of the graphic options changes:"
msgstr "Ezin izan da grafikoen aukeretako batzuk aplikatu:"
-#: gui/options.cpp:400
+#: gui/options.cpp:401
msgid "the video mode could not be changed."
msgstr "ezin izan da bideo-modua aldatu."
-#: gui/options.cpp:406
+#: gui/options.cpp:407
msgid "the fullscreen setting could not be changed"
msgstr "ezin izan da pantaila-osoaren ezarpena aldatu"
-#: gui/options.cpp:412
+#: gui/options.cpp:413
msgid "the aspect ratio setting could not be changed"
msgstr "formatu-ratioaren ezarpena ezin izan da aldatu"
-#: gui/options.cpp:733
+#: gui/options.cpp:734
msgid "Graphics mode:"
msgstr "Modu grafikoa:"
-#: gui/options.cpp:747
+#: gui/options.cpp:748
msgid "Render mode:"
msgstr "Renderizazioa:"
-#: gui/options.cpp:747 gui/options.cpp:748
+#: gui/options.cpp:748 gui/options.cpp:749
msgid "Special dithering modes supported by some games"
msgstr "Joko batzuk onarturiko lausotze-modu bereziak"
-#: gui/options.cpp:759
-#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2236
-#: backends/graphics/openglsdl/openglsdl-graphics.cpp:476
+#: gui/options.cpp:760
+#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2249
msgid "Fullscreen mode"
msgstr "Pantaila osoa"
-#: gui/options.cpp:762
+#: gui/options.cpp:763
msgid "Aspect ratio correction"
msgstr "Formatu-ratioaren zuzenketa"
-#: gui/options.cpp:762
+#: gui/options.cpp:763
msgid "Correct aspect ratio for 320x200 games"
msgstr "320x200 jokoentzako formatu-ratioa zuzendu"
-#: gui/options.cpp:770
+#: gui/options.cpp:771
msgid "Preferred Device:"
msgstr "Gogoko gailua:"
-#: gui/options.cpp:770
+#: gui/options.cpp:771
msgid "Music Device:"
msgstr "Musika gailua:"
-#: gui/options.cpp:770 gui/options.cpp:772
+#: gui/options.cpp:771 gui/options.cpp:773
msgid "Specifies preferred sound device or sound card emulator"
msgstr "Gogoko soinu txartel edo emuladorea zein den ezartzen du"
-#: gui/options.cpp:770 gui/options.cpp:772 gui/options.cpp:773
+#: gui/options.cpp:771 gui/options.cpp:773 gui/options.cpp:774
msgid "Specifies output sound device or sound card emulator"
msgstr "Irteerako soinu txartel edo emuladorea ezartzen du"
-#: gui/options.cpp:772
+#: gui/options.cpp:773
msgctxt "lowres"
msgid "Preferred Dev.:"
msgstr "Gail. gogokoa:"
-#: gui/options.cpp:772
+#: gui/options.cpp:773
msgctxt "lowres"
msgid "Music Device:"
msgstr "Musika gailua:"
-#: gui/options.cpp:799
+#: gui/options.cpp:800
msgid "AdLib emulator:"
msgstr "AdLib emuladorea:"
-#: gui/options.cpp:799 gui/options.cpp:800
+#: gui/options.cpp:800 gui/options.cpp:801
msgid "AdLib is used for music in many games"
msgstr "AdLib musikarako hainbat jokotan erabiltzen da"
-#: gui/options.cpp:810
+#: gui/options.cpp:811
msgid "Output rate:"
msgstr "Irteera maizt.:"
-#: gui/options.cpp:810 gui/options.cpp:811
+#: gui/options.cpp:811 gui/options.cpp:812
msgid ""
"Higher value specifies better sound quality but may be not supported by your "
"soundcard"
@@ -682,68 +680,68 @@ msgstr ""
"Balio altuagoek soinu kalitate hobea ezartzen dute, baina baliteke zure "
"soinu-txartela bateragarria ez izatea"
-#: gui/options.cpp:821
+#: gui/options.cpp:822
msgid "GM Device:"
msgstr "GM gailua:"
-#: gui/options.cpp:821
+#: gui/options.cpp:822
msgid "Specifies default sound device for General MIDI output"
msgstr "Defektuzko soinu txartela ezartzen du General MIDI irteerarako"
-#: gui/options.cpp:832
+#: gui/options.cpp:833
msgid "Don't use General MIDI music"
msgstr "Ez erabili General MIDI musika"
-#: gui/options.cpp:843 gui/options.cpp:909
+#: gui/options.cpp:844 gui/options.cpp:910
msgid "Use first available device"
msgstr "Erabilgarri dagoen lehen gailua erabili"
-#: gui/options.cpp:855
+#: gui/options.cpp:856
msgid "SoundFont:"
msgstr "SoundFont:"
-#: gui/options.cpp:855 gui/options.cpp:857 gui/options.cpp:858
+#: gui/options.cpp:856 gui/options.cpp:858 gui/options.cpp:859
msgid "SoundFont is supported by some audio cards, Fluidsynth and Timidity"
msgstr ""
"Zenbait soinu txartel bateragarriak dira SoundFont-ekin, Fluidsynth eta "
"Timidity besteak beste"
-#: gui/options.cpp:857
+#: gui/options.cpp:858
msgctxt "lowres"
msgid "SoundFont:"
msgstr "SoundFont:"
-#: gui/options.cpp:863
+#: gui/options.cpp:864
msgid "Mixed AdLib/MIDI mode"
msgstr "AdLib/MIDI modua"
-#: gui/options.cpp:863
+#: gui/options.cpp:864
msgid "Use both MIDI and AdLib sound generation"
msgstr "Soinua sortzerakoan MIDI eta AdLib erabili"
-#: gui/options.cpp:866
+#: gui/options.cpp:867
msgid "MIDI gain:"
msgstr "MIDI irabazia:"
-#: gui/options.cpp:873
+#: gui/options.cpp:874
msgid "FluidSynth Settings"
msgstr ""
-#: gui/options.cpp:880
+#: gui/options.cpp:881
msgid "MT-32 Device:"
msgstr "MT-32 gailua:"
-#: gui/options.cpp:880
+#: gui/options.cpp:881
msgid "Specifies default sound device for Roland MT-32/LAPC1/CM32l/CM64 output"
msgstr ""
"Roland MT-32/LAPC1/CM32l/CM64 irteerarako defektuzko soinu txartela ezartzen "
"du"
-#: gui/options.cpp:885
+#: gui/options.cpp:886
msgid "True Roland MT-32 (disable GM emulation)"
msgstr "Benetako Roland MT-32 (GM emulazio gabe)"
-#: gui/options.cpp:885 gui/options.cpp:887
+#: gui/options.cpp:886 gui/options.cpp:888
msgid ""
"Check if you want to use your real hardware Roland-compatible sound device "
"connected to your computer"
@@ -751,193 +749,194 @@ msgstr ""
"Markatu ordenagailura konektaturiko Roland-ekin bateragarria den soinu-"
"gailua erabiltzeko"
-#: gui/options.cpp:887
+#: gui/options.cpp:888
msgctxt "lowres"
msgid "True Roland MT-32 (no GM emulation)"
msgstr "Benetako Roland MT-32 (GM emulazio gabe)"
-#: gui/options.cpp:890
+#: gui/options.cpp:891
#, fuzzy
-msgid "Roland GS Mode (disable GM mapping)"
+msgid "Roland GS Device (enable MT-32 mappings)"
msgstr "Benetako Roland MT-32 (GM emulazio gabe)"
-#: gui/options.cpp:890
-msgid "Turns off General MIDI mapping for games with Roland MT-32 soundtrack"
+#: gui/options.cpp:891
+msgid ""
+"Check if you want to enable patch mappings to emulate an MT-32 on a Roland "
+"GS device"
msgstr ""
-"Roland MT-32 soinua duten jokoetan General MIDI bihurtzea desgaitzen du"
-#: gui/options.cpp:899
+#: gui/options.cpp:900
msgid "Don't use Roland MT-32 music"
msgstr "Ez erabili Roland MT-32 musika"
-#: gui/options.cpp:926
+#: gui/options.cpp:927
msgid "Text and Speech:"
msgstr "Testu eta ahotsa:"
-#: gui/options.cpp:930 gui/options.cpp:940
+#: gui/options.cpp:931 gui/options.cpp:941
msgid "Speech"
msgstr "Ahotsa"
-#: gui/options.cpp:931 gui/options.cpp:941
+#: gui/options.cpp:932 gui/options.cpp:942
msgid "Subtitles"
msgstr "Azpitituluak"
-#: gui/options.cpp:932
+#: gui/options.cpp:933
msgid "Both"
msgstr "Biak"
-#: gui/options.cpp:934
+#: gui/options.cpp:935
msgid "Subtitle speed:"
msgstr "Azpitit. abiadura:"
-#: gui/options.cpp:936
+#: gui/options.cpp:937
msgctxt "lowres"
msgid "Text and Speech:"
msgstr "Testu eta ahotsa:"
-#: gui/options.cpp:940
+#: gui/options.cpp:941
msgid "Spch"
msgstr "Ahots."
-#: gui/options.cpp:941
+#: gui/options.cpp:942
msgid "Subs"
msgstr "Azp."
-#: gui/options.cpp:942
+#: gui/options.cpp:943
msgctxt "lowres"
msgid "Both"
msgstr "Biak"
-#: gui/options.cpp:942
+#: gui/options.cpp:943
msgid "Show subtitles and play speech"
msgstr "Ahotsak erreproduzitu eta azpitituluak erakutsi"
-#: gui/options.cpp:944
+#: gui/options.cpp:945
msgctxt "lowres"
msgid "Subtitle speed:"
msgstr "Azpit. abiadura:"
-#: gui/options.cpp:960
+#: gui/options.cpp:961
msgid "Music volume:"
msgstr "Musika:"
-#: gui/options.cpp:962
+#: gui/options.cpp:963
msgctxt "lowres"
msgid "Music volume:"
msgstr "Musika:"
-#: gui/options.cpp:969
+#: gui/options.cpp:970
msgid "Mute All"
msgstr "Mututu dena"
-#: gui/options.cpp:972
+#: gui/options.cpp:973
msgid "SFX volume:"
msgstr "Efektuak:"
-#: gui/options.cpp:972 gui/options.cpp:974 gui/options.cpp:975
+#: gui/options.cpp:973 gui/options.cpp:975 gui/options.cpp:976
msgid "Special sound effects volume"
msgstr "Soinu efektu berezien bolumena"
-#: gui/options.cpp:974
+#: gui/options.cpp:975
msgctxt "lowres"
msgid "SFX volume:"
msgstr "Efektuak:"
-#: gui/options.cpp:982
+#: gui/options.cpp:983
msgid "Speech volume:"
msgstr "Ahotsak:"
-#: gui/options.cpp:984
+#: gui/options.cpp:985
msgctxt "lowres"
msgid "Speech volume:"
msgstr "Ahotsak:"
-#: gui/options.cpp:1141
+#: gui/options.cpp:1142
msgid "Theme Path:"
msgstr "Gaiak:"
-#: gui/options.cpp:1143
+#: gui/options.cpp:1144
msgctxt "lowres"
msgid "Theme Path:"
msgstr "Gaiak:"
-#: gui/options.cpp:1149 gui/options.cpp:1151 gui/options.cpp:1152
+#: gui/options.cpp:1150 gui/options.cpp:1152 gui/options.cpp:1153
msgid "Specifies path to additional data used by all games or ScummVM"
msgstr ""
"Joko guztiek edo ScummVM-k darabilten datu gehigarrien bide-izena ezartzen du"
-#: gui/options.cpp:1158
+#: gui/options.cpp:1159
msgid "Plugins Path:"
msgstr "Pluginak:"
-#: gui/options.cpp:1160
+#: gui/options.cpp:1161
msgctxt "lowres"
msgid "Plugins Path:"
msgstr "Pluginak:"
-#: gui/options.cpp:1169 gui/fluidsynth-dialog.cpp:137
+#: gui/options.cpp:1170 gui/fluidsynth-dialog.cpp:138
msgid "Misc"
msgstr "Beste"
-#: gui/options.cpp:1171
+#: gui/options.cpp:1172
msgctxt "lowres"
msgid "Misc"
msgstr "Beste"
-#: gui/options.cpp:1173
+#: gui/options.cpp:1174
msgid "Theme:"
msgstr "Gaia:"
-#: gui/options.cpp:1177
+#: gui/options.cpp:1178
msgid "GUI Renderer:"
msgstr "Interfazea:"
-#: gui/options.cpp:1189
+#: gui/options.cpp:1190
msgid "Autosave:"
msgstr "Autogordetzea:"
-#: gui/options.cpp:1191
+#: gui/options.cpp:1192
msgctxt "lowres"
msgid "Autosave:"
msgstr "Autogordetzea:"
-#: gui/options.cpp:1199
+#: gui/options.cpp:1200
msgid "Keys"
msgstr "Teklak"
-#: gui/options.cpp:1206
+#: gui/options.cpp:1207
msgid "GUI Language:"
msgstr "Hizkuntza"
-#: gui/options.cpp:1206
+#: gui/options.cpp:1207
msgid "Language of ScummVM GUI"
msgstr "ScummVM interfazearen hizkuntza"
-#: gui/options.cpp:1365
+#: gui/options.cpp:1366
msgid "You have to restart ScummVM before your changes will take effect."
msgstr "ScummVM berrabiarazi behar duzu aldaketak indarrean jartzeko"
-#: gui/options.cpp:1378
+#: gui/options.cpp:1379
msgid "Select directory for savegames"
msgstr "Gordetako partiden direktorioa aukeratu"
-#: gui/options.cpp:1385
+#: gui/options.cpp:1386
msgid "The chosen directory cannot be written to. Please select another one."
msgstr "Aukeraturiko direktorioan ezin da idatzi. Mesedez, aukeratu beste bat."
-#: gui/options.cpp:1394
+#: gui/options.cpp:1395
msgid "Select directory for GUI themes"
msgstr "Gaien direktorioa aukeratu"
-#: gui/options.cpp:1404
+#: gui/options.cpp:1405
msgid "Select directory for extra files"
msgstr "Fitxategi gehigarrien direktorioa aukeratu"
-#: gui/options.cpp:1415
+#: gui/options.cpp:1416
msgid "Select directory for plugins"
msgstr "Pluginen direktorioa aukeratu"
-#: gui/options.cpp:1468
+#: gui/options.cpp:1469
msgid ""
"The theme you selected does not support your current language. If you want "
"to use this theme you need to switch to another language first."
@@ -945,229 +944,232 @@ msgstr ""
"Aukeraturiko gaia ez da zure hizkuntzarekin bateragarria. Gai hau erabili "
"nahi baduzu, aurretik beste hizkuntza batera pasa behar duzu."
-#: gui/saveload-dialog.cpp:166
+#: gui/saveload-dialog.cpp:167
msgid "List view"
msgstr ""
-#: gui/saveload-dialog.cpp:167
+#: gui/saveload-dialog.cpp:168
msgid "Grid view"
msgstr ""
-#: gui/saveload-dialog.cpp:210 gui/saveload-dialog.cpp:358
+#: gui/saveload-dialog.cpp:211 gui/saveload-dialog.cpp:360
msgid "No date saved"
msgstr "Ez dago datarik gordeta"
-#: gui/saveload-dialog.cpp:211 gui/saveload-dialog.cpp:359
+#: gui/saveload-dialog.cpp:212 gui/saveload-dialog.cpp:361
msgid "No time saved"
msgstr "Ez dago ordurik gordeta"
-#: gui/saveload-dialog.cpp:212 gui/saveload-dialog.cpp:360
+#: gui/saveload-dialog.cpp:213 gui/saveload-dialog.cpp:362
msgid "No playtime saved"
msgstr "Ez dago denborarik gordeta"
-#: gui/saveload-dialog.cpp:219 gui/saveload-dialog.cpp:275
+#: gui/saveload-dialog.cpp:220 gui/saveload-dialog.cpp:276
msgid "Delete"
msgstr "Ezabatu"
-#: gui/saveload-dialog.cpp:274
+#: gui/saveload-dialog.cpp:275
msgid "Do you really want to delete this savegame?"
msgstr "Ezabatu partida gorde hau?"
-#: gui/saveload-dialog.cpp:383 gui/saveload-dialog.cpp:872
+#: gui/saveload-dialog.cpp:385 gui/saveload-dialog.cpp:875
msgid "Date: "
msgstr "Data:"
-#: gui/saveload-dialog.cpp:387 gui/saveload-dialog.cpp:878
+#: gui/saveload-dialog.cpp:389 gui/saveload-dialog.cpp:881
msgid "Time: "
msgstr "Ordua"
-#: gui/saveload-dialog.cpp:393 gui/saveload-dialog.cpp:886
+#: gui/saveload-dialog.cpp:395 gui/saveload-dialog.cpp:889
msgid "Playtime: "
msgstr "Denbora:"
-#: gui/saveload-dialog.cpp:406 gui/saveload-dialog.cpp:494
+#: gui/saveload-dialog.cpp:408 gui/saveload-dialog.cpp:496
msgid "Untitled savestate"
msgstr "Titulurik gabeko partida"
-#: gui/saveload-dialog.cpp:546
+#: gui/saveload-dialog.cpp:548
msgid "Next"
msgstr ""
-#: gui/saveload-dialog.cpp:549
+#: gui/saveload-dialog.cpp:551
msgid "Prev"
msgstr ""
-#: gui/saveload-dialog.cpp:736
+#: gui/saveload-dialog.cpp:739
#, fuzzy
msgid "New Save"
msgstr "Gorde"
-#: gui/saveload-dialog.cpp:736
+#: gui/saveload-dialog.cpp:739
#, fuzzy
msgid "Create a new save game"
msgstr "Ezin izan da jokoa gorde"
-#: gui/saveload-dialog.cpp:865
+#: gui/saveload-dialog.cpp:868
#, fuzzy
msgid "Name: "
msgstr "Izena:"
-#: gui/saveload-dialog.cpp:937
+#: gui/saveload-dialog.cpp:940
#, c-format
msgid "Enter a description for slot %d:"
msgstr ""
-#: gui/themebrowser.cpp:44
+#: gui/themebrowser.cpp:45
msgid "Select a Theme"
msgstr "Gaia aukeratu"
-#: gui/ThemeEngine.cpp:337
+#: gui/ThemeEngine.cpp:347
msgid "Disabled GFX"
msgstr "GFX desgaituta"
-#: gui/ThemeEngine.cpp:337
+#: gui/ThemeEngine.cpp:347
msgctxt "lowres"
msgid "Disabled GFX"
msgstr "GFX desgaituta"
-#: gui/ThemeEngine.cpp:338
-msgid "Standard Renderer (16bpp)"
+#: gui/ThemeEngine.cpp:348
+#, fuzzy
+msgid "Standard Renderer"
msgstr "Estandarra (16bpp)"
-#: gui/ThemeEngine.cpp:338
-msgid "Standard (16bpp)"
-msgstr "Estandarra (16bpp)"
+#: gui/ThemeEngine.cpp:348 engines/scumm/dialogs.cpp:659
+msgid "Standard"
+msgstr "Estandarra"
-#: gui/ThemeEngine.cpp:340
-msgid "Antialiased Renderer (16bpp)"
+#: gui/ThemeEngine.cpp:350
+#, fuzzy
+msgid "Antialiased Renderer"
msgstr "Lausotua (16bpp)"
-#: gui/ThemeEngine.cpp:340
-msgid "Antialiased (16bpp)"
+#: gui/ThemeEngine.cpp:350
+#, fuzzy
+msgid "Antialiased"
msgstr "Lausotua (16bpp)"
-#: gui/widget.cpp:322 gui/widget.cpp:324 gui/widget.cpp:330 gui/widget.cpp:332
+#: gui/widget.cpp:323 gui/widget.cpp:325 gui/widget.cpp:331 gui/widget.cpp:333
msgid "Clear value"
msgstr "Balioa kendu:"
-#: gui/fluidsynth-dialog.cpp:67
+#: gui/fluidsynth-dialog.cpp:68
#, fuzzy
msgid "Reverb"
msgstr "Inoiz ez"
-#: gui/fluidsynth-dialog.cpp:69 gui/fluidsynth-dialog.cpp:101
+#: gui/fluidsynth-dialog.cpp:70 gui/fluidsynth-dialog.cpp:102
#, fuzzy
msgid "Active"
msgstr "(Aktiboa)"
-#: gui/fluidsynth-dialog.cpp:71
+#: gui/fluidsynth-dialog.cpp:72
msgid "Room:"
msgstr ""
-#: gui/fluidsynth-dialog.cpp:78
+#: gui/fluidsynth-dialog.cpp:79
msgid "Damp:"
msgstr ""
-#: gui/fluidsynth-dialog.cpp:85
+#: gui/fluidsynth-dialog.cpp:86
msgid "Width:"
msgstr ""
-#: gui/fluidsynth-dialog.cpp:92 gui/fluidsynth-dialog.cpp:110
+#: gui/fluidsynth-dialog.cpp:93 gui/fluidsynth-dialog.cpp:111
msgid "Level:"
msgstr ""
-#: gui/fluidsynth-dialog.cpp:99
+#: gui/fluidsynth-dialog.cpp:100
msgid "Chorus"
msgstr ""
-#: gui/fluidsynth-dialog.cpp:103
+#: gui/fluidsynth-dialog.cpp:104
msgid "N:"
msgstr ""
-#: gui/fluidsynth-dialog.cpp:117
+#: gui/fluidsynth-dialog.cpp:118
#, fuzzy
msgid "Speed:"
msgstr "Ahotsa"
-#: gui/fluidsynth-dialog.cpp:124
+#: gui/fluidsynth-dialog.cpp:125
msgid "Depth:"
msgstr ""
-#: gui/fluidsynth-dialog.cpp:131
+#: gui/fluidsynth-dialog.cpp:132
msgid "Type:"
msgstr ""
-#: gui/fluidsynth-dialog.cpp:134
+#: gui/fluidsynth-dialog.cpp:135
msgid "Sine"
msgstr ""
-#: gui/fluidsynth-dialog.cpp:135
+#: gui/fluidsynth-dialog.cpp:136
msgid "Triangle"
msgstr ""
-#: gui/fluidsynth-dialog.cpp:139
+#: gui/fluidsynth-dialog.cpp:140
msgid "Interpolation:"
msgstr ""
-#: gui/fluidsynth-dialog.cpp:142
+#: gui/fluidsynth-dialog.cpp:143
msgid "None (fastest)"
msgstr ""
-#: gui/fluidsynth-dialog.cpp:143
+#: gui/fluidsynth-dialog.cpp:144
msgid "Linear"
msgstr ""
-#: gui/fluidsynth-dialog.cpp:144
+#: gui/fluidsynth-dialog.cpp:145
msgid "Fourth-order"
msgstr ""
-#: gui/fluidsynth-dialog.cpp:145
+#: gui/fluidsynth-dialog.cpp:146
msgid "Seventh-order"
msgstr ""
-#: gui/fluidsynth-dialog.cpp:149
+#: gui/fluidsynth-dialog.cpp:150
msgid "Reset"
msgstr ""
-#: gui/fluidsynth-dialog.cpp:149
+#: gui/fluidsynth-dialog.cpp:150
msgid "Reset all FluidSynth settings to their default values."
msgstr ""
-#: gui/fluidsynth-dialog.cpp:216
+#: gui/fluidsynth-dialog.cpp:217
#, fuzzy
msgid ""
"Do you really want to reset all FluidSynth settings to their default values?"
msgstr "Ziur zaude abiarazlera itzuli nahi duzula?"
-#: base/main.cpp:210
+#: base/main.cpp:228
#, c-format
msgid "Engine does not support debug level '%s'"
msgstr "Motoreak ez da '%s' debug mailarekin bateragarria"
-#: base/main.cpp:288
+#: base/main.cpp:306
msgid "Menu"
msgstr "Menua"
-#: base/main.cpp:291 backends/platform/symbian/src/SymbianActions.cpp:45
+#: base/main.cpp:309 backends/platform/symbian/src/SymbianActions.cpp:45
#: backends/platform/wince/CEActionsPocket.cpp:45
#: backends/platform/wince/CEActionsSmartphone.cpp:46
msgid "Skip"
msgstr "Saltatu"
-#: base/main.cpp:294 backends/platform/symbian/src/SymbianActions.cpp:50
+#: base/main.cpp:312 backends/platform/symbian/src/SymbianActions.cpp:50
#: backends/platform/wince/CEActionsPocket.cpp:42
msgid "Pause"
msgstr "Gelditu"
-#: base/main.cpp:297
+#: base/main.cpp:315
msgid "Skip line"
msgstr "Lerroa saltatu"
-#: base/main.cpp:468
+#: base/main.cpp:507
msgid "Error running game:"
msgstr "Jokoa exekutatzean errorea:"
-#: base/main.cpp:492
+#: base/main.cpp:536
msgid "Could not find any engine capable of running the selected game"
msgstr "Ezin izan da aukeraturiko jokoa exekutatzeko gai den motorerik aurkitu"
@@ -1235,72 +1237,72 @@ msgstr "Erabiltzaileak utzia"
msgid "Unknown error"
msgstr "Errore ezezaguna"
-#: engines/advancedDetector.cpp:316
+#: engines/advancedDetector.cpp:317
#, c-format
msgid "The game in '%s' seems to be unknown."
msgstr "'%s'-(e)ko jokoa ezezaguna dela dirudi"
-#: engines/advancedDetector.cpp:317
+#: engines/advancedDetector.cpp:318
msgid "Please, report the following data to the ScummVM team along with name"
msgstr "Mesedez, bidali hurrengo datuak ScummVM taldeari gehitzen saiatu zaren"
-#: engines/advancedDetector.cpp:319
+#: engines/advancedDetector.cpp:320
msgid "of the game you tried to add and its version/language/etc.:"
msgstr "jokoaren izen, bertsio/hizkuntza/e.a.-ekin batera:"
-#: engines/dialogs.cpp:84
+#: engines/dialogs.cpp:85
msgid "~R~esume"
msgstr "~J~arraitu"
-#: engines/dialogs.cpp:86
+#: engines/dialogs.cpp:87
msgid "~L~oad"
msgstr "Ka~r~gatu"
-#: engines/dialogs.cpp:90
+#: engines/dialogs.cpp:91
msgid "~S~ave"
msgstr "~G~orde"
-#: engines/dialogs.cpp:94
+#: engines/dialogs.cpp:95
msgid "~O~ptions"
msgstr "~A~ukerak"
-#: engines/dialogs.cpp:99
+#: engines/dialogs.cpp:100
msgid "~H~elp"
msgstr "~L~aguntza"
-#: engines/dialogs.cpp:101
+#: engines/dialogs.cpp:102
msgid "~A~bout"
msgstr "Ho~n~i buruz"
-#: engines/dialogs.cpp:104 engines/dialogs.cpp:180
+#: engines/dialogs.cpp:105 engines/dialogs.cpp:181
msgid "~R~eturn to Launcher"
msgstr "It~z~uli abiarazlera"
-#: engines/dialogs.cpp:106 engines/dialogs.cpp:182
+#: engines/dialogs.cpp:107 engines/dialogs.cpp:183
msgctxt "lowres"
msgid "~R~eturn to Launcher"
msgstr "It~z~uli abiarazlera"
-#: engines/dialogs.cpp:115 engines/agi/saveload.cpp:803
-#: engines/drascula/saveload.cpp:338 engines/cruise/menu.cpp:212
-#: engines/sci/engine/kfile.cpp:742 engines/toltecs/menu.cpp:284
-#: engines/pegasus/pegasus.cpp:373
+#: engines/dialogs.cpp:116 engines/agi/saveload.cpp:803
+#: engines/cruise/menu.cpp:212 engines/drascula/saveload.cpp:336
+#: engines/neverhood/menumodule.cpp:873 engines/pegasus/pegasus.cpp:377
+#: engines/sci/engine/kfile.cpp:758 engines/toltecs/menu.cpp:281
msgid "Save game:"
msgstr "Gorde jokoa:"
-#: engines/dialogs.cpp:115 engines/agi/saveload.cpp:803
-#: engines/drascula/saveload.cpp:338 engines/scumm/dialogs.cpp:187
-#: engines/cruise/menu.cpp:212 engines/sci/engine/kfile.cpp:742
-#: engines/toltecs/menu.cpp:284 engines/pegasus/pegasus.cpp:373
-#: backends/platform/symbian/src/SymbianActions.cpp:44
+#: engines/dialogs.cpp:116 backends/platform/symbian/src/SymbianActions.cpp:44
#: backends/platform/wince/CEActionsPocket.cpp:43
#: backends/platform/wince/CEActionsPocket.cpp:267
#: backends/platform/wince/CEActionsSmartphone.cpp:45
#: backends/platform/wince/CEActionsSmartphone.cpp:231
+#: engines/agi/saveload.cpp:803 engines/cruise/menu.cpp:212
+#: engines/drascula/saveload.cpp:336 engines/neverhood/menumodule.cpp:873
+#: engines/pegasus/pegasus.cpp:377 engines/sci/engine/kfile.cpp:758
+#: engines/scumm/dialogs.cpp:188 engines/toltecs/menu.cpp:281
msgid "Save"
msgstr "Gorde"
-#: engines/dialogs.cpp:144
+#: engines/dialogs.cpp:145
msgid ""
"Sorry, this engine does not currently provide in-game help. Please consult "
"the README for basic information, and for instructions on how to obtain "
@@ -1309,7 +1311,7 @@ msgstr ""
"Barkatu, motore honek ez du joko barruan laguntzarik eskaintzen. Jo ezazu "
"README-ra oinarrizko informaziorako eta laguntza gehiago nola jaso jakiteko."
-#: engines/dialogs.cpp:228
+#: engines/dialogs.cpp:234 engines/pegasus/pegasus.cpp:393
#, c-format
msgid ""
"Gamestate save failed (%s)! Please consult the README for basic information, "
@@ -1318,37 +1320,37 @@ msgstr ""
"Jokoaren egoera gordetzeak huts egin du (%s)! Jo ezazu README-ra oinarrizko "
"informaziorako eta laguntza gehiago nola jaso jakiteko."
-#: engines/dialogs.cpp:301 engines/mohawk/dialogs.cpp:109
+#: engines/dialogs.cpp:307 engines/mohawk/dialogs.cpp:109
#: engines/mohawk/dialogs.cpp:170
msgid "~O~K"
msgstr "~A~dos"
-#: engines/dialogs.cpp:302 engines/mohawk/dialogs.cpp:110
+#: engines/dialogs.cpp:308 engines/mohawk/dialogs.cpp:110
#: engines/mohawk/dialogs.cpp:171
msgid "~C~ancel"
msgstr "~U~tzi"
-#: engines/dialogs.cpp:305
+#: engines/dialogs.cpp:311
msgid "~K~eys"
msgstr "~T~eklak"
-#: engines/engine.cpp:240
+#: engines/engine.cpp:245
msgid "Could not initialize color format."
msgstr "Kolore formatua ezin izan da hasieratu."
-#: engines/engine.cpp:248
+#: engines/engine.cpp:253
msgid "Could not switch to video mode: '"
msgstr "Ezin izan da aldatu bideo modura : '"
-#: engines/engine.cpp:257
+#: engines/engine.cpp:262
msgid "Could not apply aspect ratio setting."
msgstr "Ezin izan da formatu-ratio ezarpena aplikatu."
-#: engines/engine.cpp:262
+#: engines/engine.cpp:267
msgid "Could not apply fullscreen setting."
msgstr "Ezin izan da pantaila-osoa ezarpena aplikatu."
-#: engines/engine.cpp:362
+#: engines/engine.cpp:367
msgid ""
"You appear to be playing this game directly\n"
"from the CD. This is known to cause problems,\n"
@@ -1362,7 +1364,7 @@ msgstr ""
"fitxategiak disko gogorrera kopiatzea.\n"
"Jo README fitxategira xehetasunetarako."
-#: engines/engine.cpp:373
+#: engines/engine.cpp:378
msgid ""
"This game has audio tracks in its disk. These\n"
"tracks need to be ripped from the disk using\n"
@@ -1376,7 +1378,7 @@ msgstr ""
"izateko. Jo README fitxategira\n"
"xehetasunetarako."
-#: engines/engine.cpp:431
+#: engines/engine.cpp:436
#, c-format
msgid ""
"Gamestate load failed (%s)! Please consult the README for basic information, "
@@ -1385,7 +1387,7 @@ msgstr ""
"Jokoaren egoera kargatzeak huts egin du (%s)! Jo ezazu README-ra oinarrizko "
"informaziorako eta laguntza gehiago nola jaso jakiteko."
-#: engines/engine.cpp:444
+#: engines/engine.cpp:449
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 "
@@ -1395,33 +1397,762 @@ msgstr ""
"Hori dela eta, ezegonkorra izan daiteke eta gerta daiteke gordeta izan "
"ditzakezun partidan ez ibiltzea ScummVM-ren etorkizuneko bertsioetan."
-#: engines/engine.cpp:447
+#: engines/engine.cpp:452
msgid "Start anyway"
msgstr "Jolastu berdin-berdin"
-#: engines/agi/detection.cpp:142 engines/drascula/detection.cpp:270
-#: engines/dreamweb/detection.cpp:47 engines/sci/detection.cpp:393
-#: engines/toltecs/detection.cpp:173
+#: audio/fmopl.cpp:50
+msgid "MAME OPL emulator"
+msgstr "MAME OPL emuladorea"
+
+#: audio/fmopl.cpp:52
+msgid "DOSBox OPL emulator"
+msgstr "DOSBox OPL emuladorea"
+
+#: audio/mididrv.cpp:209
+#, c-format
+msgid ""
+"The selected audio device '%s' was not found (e.g. might be turned off or "
+"disconnected)."
+msgstr ""
+"Aukeraturiko '%s' soinu gailua ez da aurkitu (baliteke itzalita edo "
+"konektatu gabe egotea)"
+
+#: audio/mididrv.cpp:209 audio/mididrv.cpp:221 audio/mididrv.cpp:257
+#: audio/mididrv.cpp:272
+msgid "Attempting to fall back to the next available device..."
+msgstr "Eskuragarri dagoen hurrengo soinu gailura joaten..."
+
+#: audio/mididrv.cpp:221
+#, c-format
+msgid ""
+"The selected audio device '%s' cannot be used. See log file for more "
+"information."
+msgstr ""
+"Aukeraturiko '%s' soinu gailua ezin da erabili. Ikusi log fitxategia "
+"informazio gehiagorako."
+
+#: audio/mididrv.cpp:257
+#, c-format
+msgid ""
+"The preferred audio device '%s' was not found (e.g. might be turned off or "
+"disconnected)."
+msgstr ""
+"'%s' gogoko soinu gailua ez da aurkitu (baliteke itzalita edo konektatu gabe "
+"egotea)"
+
+#: audio/mididrv.cpp:272
+#, c-format
+msgid ""
+"The preferred audio device '%s' cannot be used. See log file for more "
+"information."
+msgstr ""
+"'%s' gogoko soinu gailua ezin da erabili. Ikusi log fitxategia informazio "
+"gehiagorako."
+
+#: audio/null.h:44
+msgid "No music"
+msgstr "Musikarik ez"
+
+#: audio/mods/paula.cpp:196
+msgid "Amiga Audio Emulator"
+msgstr "Amiga Audio emuladorea"
+
+#: audio/softsynth/adlib.cpp:2285
+msgid "AdLib Emulator"
+msgstr "AdLib emuladorea"
+
+#: audio/softsynth/appleiigs.cpp:33
+msgid "Apple II GS Emulator (NOT IMPLEMENTED)"
+msgstr "Apple II GS emuladorea (INPLEMENTATU GABE)"
+
+#: audio/softsynth/sid.cpp:1430
+msgid "C64 Audio Emulator"
+msgstr "C64 Audio emuladorea"
+
+#: audio/softsynth/mt32.cpp:200
+msgid "Initializing MT-32 Emulator"
+msgstr "MT-32 emuladorea hasieratzen"
+
+#: audio/softsynth/mt32.cpp:426
+msgid "MT-32 Emulator"
+msgstr "MT-32 emuladorea"
+
+#: audio/softsynth/pcspk.cpp:139
+msgid "PC Speaker Emulator"
+msgstr "PC bozgoragailuaren emuladorea"
+
+#: audio/softsynth/pcspk.cpp:158
+msgid "IBM PCjr Emulator"
+msgstr "IBM PCjr emuladorea"
+
+#: backends/keymapper/remap-dialog.cpp:48
+msgid "Keymap:"
+msgstr "Teklen esleipena:"
+
+#: backends/keymapper/remap-dialog.cpp:67
+msgid " (Effective)"
+msgstr "(Egiazkoa)"
+
+#: backends/keymapper/remap-dialog.cpp:107
+msgid " (Active)"
+msgstr "(Aktiboa)"
+
+#: backends/keymapper/remap-dialog.cpp:107
+msgid " (Blocked)"
+msgstr "(Blokeaturik)"
+
+#: backends/keymapper/remap-dialog.cpp:120
+msgid " (Global)"
+msgstr "(Orokorra)"
+
+#: backends/keymapper/remap-dialog.cpp:128
+msgid " (Game)"
+msgstr "(Jokoa)"
+
+#: backends/midi/windows.cpp:165
+msgid "Windows MIDI"
+msgstr "Windows MIDI"
+
+#: backends/platform/ds/arm9/source/dsoptions.cpp:56
+#: engines/scumm/dialogs.cpp:291
+msgid "~C~lose"
+msgstr "~I~txi"
+
+#: backends/platform/ds/arm9/source/dsoptions.cpp:57
+msgid "ScummVM Main Menu"
+msgstr "ScummVM menu orokorra"
+
+#: backends/platform/ds/arm9/source/dsoptions.cpp:63
+msgid "~L~eft handed mode"
+msgstr "~E~zkertientzako modua"
+
+#: backends/platform/ds/arm9/source/dsoptions.cpp:64
+msgid "~I~ndy fight controls"
+msgstr "~I~ndy-ren borrokarako kontrolak"
+
+#: backends/platform/ds/arm9/source/dsoptions.cpp:65
+msgid "Show mouse cursor"
+msgstr "Saguaren kurtsorea erakutsi"
+
+#: backends/platform/ds/arm9/source/dsoptions.cpp:66
+msgid "Snap to edges"
+msgstr "Ertzetara itsatsi"
+
+#: backends/platform/ds/arm9/source/dsoptions.cpp:68
+msgid "Touch X Offset"
+msgstr "Ukimenaren X oreka"
+
+#: backends/platform/ds/arm9/source/dsoptions.cpp:75
+msgid "Touch Y Offset"
+msgstr "Ukimenaren Y oreka"
+
+#: backends/platform/ds/arm9/source/dsoptions.cpp:87
+msgid "Use laptop trackpad-style cursor control"
+msgstr "Eramangarrietako trackpad estiloko kurtsore-kontrola erabili"
+
+#: backends/platform/ds/arm9/source/dsoptions.cpp:88
+msgid "Tap for left click, double tap right click"
+msgstr "Toke bat ezker-klikerako, toke bikoitza eskuin klikerako"
+
+#: backends/platform/ds/arm9/source/dsoptions.cpp:90
+msgid "Sensitivity"
+msgstr "Sentikortasuna"
+
+#: backends/platform/ds/arm9/source/dsoptions.cpp:99
+msgid "Initial top screen scale:"
+msgstr "Goiko pantailaren hasierako eskala:"
+
+#: backends/platform/ds/arm9/source/dsoptions.cpp:105
+msgid "Main screen scaling:"
+msgstr "Pantaila nagusiaren eskala:"
+
+#: backends/platform/ds/arm9/source/dsoptions.cpp:107
+msgid "Hardware scale (fast, but low quality)"
+msgstr "Hardware bidezko eskala (arina, baina kalitate baxukoa)"
+
+#: backends/platform/ds/arm9/source/dsoptions.cpp:108
+msgid "Software scale (good quality, but slower)"
+msgstr "Software bidezko eskala (kalitate ona, baina geldoagoa)"
+
+#: backends/platform/ds/arm9/source/dsoptions.cpp:109
+msgid "Unscaled (you must scroll left and right)"
+msgstr "Eskalatu gabe (ezker-eskuin mugitu behar duzu pantaila)"
+
+#: backends/platform/ds/arm9/source/dsoptions.cpp:111
+msgid "Brightness:"
+msgstr "Distira:"
+
+#: backends/platform/ds/arm9/source/dsoptions.cpp:121
+msgid "High quality audio (slower) (reboot)"
+msgstr "Kalitate altuko soinua (geldoagoa) (berrabiarazi)"
+
+#: backends/platform/ds/arm9/source/dsoptions.cpp:122
+msgid "Disable power off"
+msgstr "Itzaltzea desgaitu"
+
+#: backends/platform/iphone/osys_events.cpp:300
+msgid "Mouse-click-and-drag mode enabled."
+msgstr "Saguko klik-eta-arrastratu modua gaituta."
+
+#: backends/platform/iphone/osys_events.cpp:302
+msgid "Mouse-click-and-drag mode disabled."
+msgstr "Saguko klik-eta-arrastratu modua desgaituta."
+
+#: backends/platform/iphone/osys_events.cpp:313
+msgid "Touchpad mode enabled."
+msgstr "Touchpad modua gaituta."
+
+#: backends/platform/iphone/osys_events.cpp:315
+msgid "Touchpad mode disabled."
+msgstr "Touchpad modua desgaituta."
+
+#: backends/platform/maemo/maemo.cpp:209
+msgid "Click Mode"
+msgstr "Klikatzeko modua"
+
+#: backends/platform/maemo/maemo.cpp:215
+#: backends/platform/symbian/src/SymbianActions.cpp:42
+#: backends/platform/wince/CEActionsPocket.cpp:60
+#: backends/platform/wince/CEActionsSmartphone.cpp:43
+#: backends/platform/tizen/form.cpp:275
+msgid "Left Click"
+msgstr "Ezker-klika"
+
+#: backends/platform/maemo/maemo.cpp:218
+msgid "Middle Click"
+msgstr "Erdiko klika"
+
+#: backends/platform/maemo/maemo.cpp:221
+#: backends/platform/symbian/src/SymbianActions.cpp:43
+#: backends/platform/wince/CEActionsSmartphone.cpp:44
+#: backends/platform/tizen/form.cpp:267
+msgid "Right Click"
+msgstr "Eskuin-klika"
+
+#: backends/platform/sdl/macosx/appmenu_osx.mm:77
+msgid "Hide ScummVM"
+msgstr "ScummVM ezkutatu"
+
+#: backends/platform/sdl/macosx/appmenu_osx.mm:82
+msgid "Hide Others"
+msgstr "Besteak ezkutatu"
+
+#: backends/platform/sdl/macosx/appmenu_osx.mm:87
+msgid "Show All"
+msgstr "Denak erakutsi"
+
+#: backends/platform/sdl/macosx/appmenu_osx.mm:109
+#: backends/platform/sdl/macosx/appmenu_osx.mm:120
+msgid "Window"
+msgstr "Leihoa"
+
+#: backends/platform/sdl/macosx/appmenu_osx.mm:114
+msgid "Minimize"
+msgstr "Minimizatu"
+
+#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:46
+msgid "Normal (no scaling)"
+msgstr "Normala (eskalatu gabe)"
+
+#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:65
+msgctxt "lowres"
+msgid "Normal (no scaling)"
+msgstr "Normala"
+
+#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2148
+msgid "Enabled aspect ratio correction"
+msgstr "Formatu-ratio zuzenketa gaituta"
+
+#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2154
+msgid "Disabled aspect ratio correction"
+msgstr "Formatu-ratio zuzenketa desgaituta"
+
+#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2209
+msgid "Active graphics filter:"
+msgstr "Filtro grafiko aktiboa:"
+
+#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2251
+msgid "Windowed mode"
+msgstr "Leiho modua"
+
+#: backends/graphics/opengl/opengl-graphics.cpp:118
+#, fuzzy
+msgid "OpenGL"
+msgstr "Ireki"
+
+#: backends/graphics/opengl/opengl-graphics.cpp:119
+msgid "OpenGL (No filtering)"
+msgstr ""
+
+#: backends/platform/symbian/src/SymbianActions.cpp:38
+#: backends/platform/wince/CEActionsSmartphone.cpp:39
+msgid "Up"
+msgstr "Gora"
+
+#: backends/platform/symbian/src/SymbianActions.cpp:39
+#: backends/platform/wince/CEActionsSmartphone.cpp:40
+msgid "Down"
+msgstr "Behera"
+
+#: backends/platform/symbian/src/SymbianActions.cpp:40
+#: backends/platform/wince/CEActionsSmartphone.cpp:41
+msgid "Left"
+msgstr "Ezker"
+
+#: backends/platform/symbian/src/SymbianActions.cpp:41
+#: backends/platform/wince/CEActionsSmartphone.cpp:42
+msgid "Right"
+msgstr "Eskuin"
+
+#: backends/platform/symbian/src/SymbianActions.cpp:46
+#: backends/platform/wince/CEActionsSmartphone.cpp:47
+msgid "Zone"
+msgstr "Zonaldea"
+
+#: backends/platform/symbian/src/SymbianActions.cpp:47
+#: backends/platform/wince/CEActionsPocket.cpp:54
+#: backends/platform/wince/CEActionsSmartphone.cpp:48
+msgid "Multi Function"
+msgstr "Multifuntzioa"
+
+#: backends/platform/symbian/src/SymbianActions.cpp:48
+msgid "Swap character"
+msgstr "Pertsonaia aldatu"
+
+#: backends/platform/symbian/src/SymbianActions.cpp:49
+msgid "Skip text"
+msgstr "Testua saltatu"
+
+#: backends/platform/symbian/src/SymbianActions.cpp:51
+msgid "Fast mode"
+msgstr "Modu bizkorra"
+
+#: 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:218
+#: engines/scumm/dialogs.cpp:192 engines/scumm/help.cpp:82
+#: engines/scumm/help.cpp:84
+msgid "Quit"
+msgstr "Irten"
+
+#: backends/platform/symbian/src/SymbianActions.cpp:53
+msgid "Debugger"
+msgstr "Araztailea"
+
+#: backends/platform/symbian/src/SymbianActions.cpp:54
+msgid "Global menu"
+msgstr "Menu orokorra"
+
+#: backends/platform/symbian/src/SymbianActions.cpp:55
+msgid "Virtual keyboard"
+msgstr "Teklatu birtuala"
+
+#: backends/platform/symbian/src/SymbianActions.cpp:56
+msgid "Key mapper"
+msgstr "Teklen esleipena"
+
+#: backends/events/symbiansdl/symbiansdl-events.cpp:184
+msgid "Do you want to quit ?"
+msgstr "Irten nahi al duzu?"
+
+#: backends/platform/wii/options.cpp:51
+msgid "Video"
+msgstr "Bideo"
+
+#: backends/platform/wii/options.cpp:54
+msgid "Current video mode:"
+msgstr "Oraingo bideo modua:"
+
+#: backends/platform/wii/options.cpp:56
+msgid "Double-strike"
+msgstr "Kolpe bikoitza"
+
+#: backends/platform/wii/options.cpp:60
+msgid "Horizontal underscan:"
+msgstr "Underscan horizontala"
+
+#: backends/platform/wii/options.cpp:66
+msgid "Vertical underscan:"
+msgstr "Underscan bertikala:"
+
+#: backends/platform/wii/options.cpp:71
+msgid "Input"
+msgstr "Sarrrera"
+
+#: backends/platform/wii/options.cpp:74
+msgid "GC Pad sensitivity:"
+msgstr "GC Pad-aren sentikortasuna"
+
+#: backends/platform/wii/options.cpp:80
+msgid "GC Pad acceleration:"
+msgstr "GC Pad-aren azelerazioa:"
+
+#: backends/platform/wii/options.cpp:86
+msgid "DVD"
+msgstr "DVD:"
+
+#: backends/platform/wii/options.cpp:89 backends/platform/wii/options.cpp:101
+msgid "Status:"
+msgstr "Egoera:"
+
+#: backends/platform/wii/options.cpp:90 backends/platform/wii/options.cpp:102
+msgid "Unknown"
+msgstr "Ezezaguna"
+
+#: backends/platform/wii/options.cpp:93
+msgid "Mount DVD"
+msgstr "DVD-a muntatu"
+
+#: backends/platform/wii/options.cpp:94
+msgid "Unmount DVD"
+msgstr "DVD-a desmuntatu"
+
+#: backends/platform/wii/options.cpp:98
+msgid "SMB"
+msgstr "SMB"
+
+#: backends/platform/wii/options.cpp:106
+msgid "Server:"
+msgstr "Zerbitzaria:"
+
+#: backends/platform/wii/options.cpp:110
+msgid "Share:"
+msgstr "Konpartituriko direktorioa:"
+
+#: backends/platform/wii/options.cpp:114
+msgid "Username:"
+msgstr "Erabiltzaile-izena:"
+
+#: backends/platform/wii/options.cpp:118
+msgid "Password:"
+msgstr "Pasahitza:"
+
+#: backends/platform/wii/options.cpp:121
+msgid "Init network"
+msgstr "Sarea hasi"
+
+#: backends/platform/wii/options.cpp:123
+msgid "Mount SMB"
+msgstr "SMB-a muntatu"
+
+#: backends/platform/wii/options.cpp:124
+msgid "Unmount SMB"
+msgstr "SMB-a desmuntatu"
+
+#: backends/platform/wii/options.cpp:143
+msgid "DVD Mounted successfully"
+msgstr "DVD-a ondo muntatu da"
+
+#: backends/platform/wii/options.cpp:146
+msgid "Error while mounting the DVD"
+msgstr "Errorea DVD-a muntatzean"
+
+#: backends/platform/wii/options.cpp:148
+msgid "DVD not mounted"
+msgstr "DVD ez muntatua"
+
+#: backends/platform/wii/options.cpp:161
+msgid "Network up, share mounted"
+msgstr "Sarea konektaturik, konpartituriko direktorioa muntaturik"
+
+#: backends/platform/wii/options.cpp:163
+msgid "Network up"
+msgstr "Sarea konektaturik"
+
+#: backends/platform/wii/options.cpp:166
+msgid ", error while mounting the share"
+msgstr ", konpartituriko direktorioa muntatzerakoan errorea"
+
+#: backends/platform/wii/options.cpp:168
+msgid ", share not mounted"
+msgstr ", konpartituriko direktorioa ez muntatua"
+
+#: backends/platform/wii/options.cpp:174
+msgid "Network down"
+msgstr "Sarea konektatu gabe"
+
+#: backends/platform/wii/options.cpp:178
+msgid "Initializing network"
+msgstr "Sarea hasieratzen"
+
+#: backends/platform/wii/options.cpp:182
+msgid "Timeout while initializing network"
+msgstr "Sarearen hasieratze denbora agortu da"
+
+#: backends/platform/wii/options.cpp:186
+#, c-format
+msgid "Network not initialized (%d)"
+msgstr "Sarea ez da hasieratu (%d)"
+
+#: backends/platform/wince/CEActionsPocket.cpp:46
+msgid "Hide Toolbar"
+msgstr "Tresna-barra ezkutatu"
+
+#: backends/platform/wince/CEActionsPocket.cpp:47
+msgid "Show Keyboard"
+msgstr "Teklatua erakutsi"
+
+#: backends/platform/wince/CEActionsPocket.cpp:48
+msgid "Sound on/off"
+msgstr "Soinua aktibatuta/desaktibatuta"
+
+#: backends/platform/wince/CEActionsPocket.cpp:49
+msgid "Right click"
+msgstr "Eskuin klik-a"
+
+#: backends/platform/wince/CEActionsPocket.cpp:50
+msgid "Show/Hide Cursor"
+msgstr "Kurtsorea erakutsi/ezkutatu"
+
+#: backends/platform/wince/CEActionsPocket.cpp:51
+msgid "Free look"
+msgstr "Bista librea"
+
+#: backends/platform/wince/CEActionsPocket.cpp:52
+msgid "Zoom up"
+msgstr "Zoom-a hurbildu"
+
+#: backends/platform/wince/CEActionsPocket.cpp:53
+msgid "Zoom down"
+msgstr "Zoom-a urrundu"
+
+#: backends/platform/wince/CEActionsPocket.cpp:55
+#: backends/platform/wince/CEActionsSmartphone.cpp:49
+msgid "Bind Keys"
+msgstr "Teklak esleitu"
+
+#: backends/platform/wince/CEActionsPocket.cpp:56
+msgid "Cursor Up"
+msgstr "Gora"
+
+#: backends/platform/wince/CEActionsPocket.cpp:57
+msgid "Cursor Down"
+msgstr "Behera"
+
+#: backends/platform/wince/CEActionsPocket.cpp:58
+msgid "Cursor Left"
+msgstr "Ezker"
+
+#: backends/platform/wince/CEActionsPocket.cpp:59
+msgid "Cursor Right"
+msgstr "Eskuin"
+
+#: backends/platform/wince/CEActionsPocket.cpp:267
+#: backends/platform/wince/CEActionsSmartphone.cpp:231
+msgid "Do you want to load or save the game?"
+msgstr "Jokoa kargatu edo gorde nahi duzu?"
+
+#: backends/platform/wince/CEActionsPocket.cpp:326
+#: backends/platform/wince/CEActionsSmartphone.cpp:287
+msgid " Are you sure you want to quit ? "
+msgstr " Ziur irten nahi duzula?"
+
+#: backends/platform/wince/CEActionsSmartphone.cpp:50
+msgid "Keyboard"
+msgstr "Teklatua"
+
+#: backends/platform/wince/CEActionsSmartphone.cpp:51
+msgid "Rotate"
+msgstr "Biratu"
+
+#: backends/platform/wince/CELauncherDialog.cpp:56
+msgid "Using SDL driver "
+msgstr "SDL kontrolatzailea erabiltzen"
+
+#: backends/platform/wince/CELauncherDialog.cpp:60
+msgid "Display "
+msgstr "Pantaila"
+
+#: backends/platform/wince/CELauncherDialog.cpp:83
+msgid "Do you want to perform an automatic scan ?"
+msgstr "Bilaketa automatikoa erabili nahi duzu?"
+
+#: backends/platform/wince/wince-sdl.cpp:516
+msgid "Map right click action"
+msgstr "'Eskuin klika' ekintza esleitu"
+
+#: backends/platform/wince/wince-sdl.cpp:520
+msgid "You must map a key to the 'Right Click' action to play this game"
+msgstr ""
+"'Eskuin klika' ekintza esleitu behar diozu tekla bati joko honetara jolasteko"
+
+#: backends/platform/wince/wince-sdl.cpp:529
+msgid "Map hide toolbar action"
+msgstr "'Tresna-barra ezkutatu' ekintza esleitu"
+
+#: backends/platform/wince/wince-sdl.cpp:533
+msgid "You must map a key to the 'Hide toolbar' action to play this game"
+msgstr ""
+"'Tresna-barra ezkutatu' ekintza tekla bati esleitu behar diozu joko honetara "
+"jolasteko"
+
+#: backends/platform/wince/wince-sdl.cpp:542
+msgid "Map Zoom Up action (optional)"
+msgstr "'Zoom-a urrundu' ekintza esleitu (hautazkoa)"
+
+#: backends/platform/wince/wince-sdl.cpp:545
+msgid "Map Zoom Down action (optional)"
+msgstr "'Zoom-a hurbildu' ekintza esleitu (hautazkkoa)"
+
+#: backends/platform/wince/wince-sdl.cpp:553
+msgid ""
+"Don't forget to map a key to 'Hide Toolbar' action to see the whole inventory"
+msgstr ""
+"Ez ahaztu 'tresna-barra ezkutatu' ekintza tekla bati esleitzea inbentario "
+"osoa ikusteko"
+
+#: backends/events/default/default-events.cpp:196
+msgid "Do you really want to return to the Launcher?"
+msgstr "Ziur zaude abiarazlera itzuli nahi duzula?"
+
+#: backends/events/default/default-events.cpp:196
+msgid "Launcher"
+msgstr "Abiarazlea"
+
+#: backends/events/default/default-events.cpp:218
+msgid "Do you really want to quit?"
+msgstr "Benetan irten?"
+
+#: backends/events/gph/gph-events.cpp:386
+#: backends/events/gph/gph-events.cpp:429
+#: backends/events/openpandora/op-events.cpp:168
+msgid "Touchscreen 'Tap Mode' - Left Click"
+msgstr "Ukimen-pantailako 'kolpetxo modua' - Ezker klika"
+
+#: backends/events/gph/gph-events.cpp:388
+#: backends/events/gph/gph-events.cpp:431
+#: backends/events/openpandora/op-events.cpp:170
+msgid "Touchscreen 'Tap Mode' - Right Click"
+msgstr "Ukimen-pantailako 'kolpetxo modua' - Eskuin klika"
+
+#: backends/events/gph/gph-events.cpp:390
+#: backends/events/gph/gph-events.cpp:433
+#: backends/events/openpandora/op-events.cpp:172
+msgid "Touchscreen 'Tap Mode' - Hover (No Click)"
+msgstr "Ukimen-pantailako 'kolpetxo modua' - Flotatu (klikik ez)"
+
+#: backends/events/gph/gph-events.cpp:410
+msgid "Maximum Volume"
+msgstr "Bolumen maximoa"
+
+#: backends/events/gph/gph-events.cpp:412
+msgid "Increasing Volume"
+msgstr "Bolumena igotzen"
+
+#: backends/events/gph/gph-events.cpp:418
+msgid "Minimal Volume"
+msgstr "Bolumen minimoa"
+
+#: backends/events/gph/gph-events.cpp:420
+msgid "Decreasing Volume"
+msgstr "Bolumena jaisten"
+
+#: backends/events/openpandora/op-events.cpp:174
+#, fuzzy
+msgid "Touchscreen 'Tap Mode' - Hover (DPad Clicks)"
+msgstr "Ukimen-pantailako 'kolpetxo modua' - Flotatu (klikik ez)"
+
+#: backends/updates/macosx/macosx-updates.mm:67
+msgid "Check for Updates..."
+msgstr "Eguneraketak bilatzen..."
+
+#: backends/platform/tizen/form.cpp:263
+msgid "Right Click Once"
+msgstr "Eskuin-klika behin"
+
+#: backends/platform/tizen/form.cpp:271
+msgid "Move Only"
+msgstr "Mugitu bakarrik"
+
+#: backends/platform/tizen/form.cpp:294
+msgid "Escape Key"
+msgstr "Ihes tekla"
+
+#: backends/platform/tizen/form.cpp:299
+msgid "Game Menu"
+msgstr "Jokoaren menua"
+
+#: backends/platform/tizen/form.cpp:304
+msgid "Show Keypad"
+msgstr "Teklatu numerikoa erakutsi"
+
+#: backends/platform/tizen/form.cpp:309
+msgid "Control Mouse"
+msgstr "Saguaren kontrola"
+
+#: backends/events/maemosdl/maemosdl-events.cpp:192
+msgid "Clicking Enabled"
+msgstr "Klikatzea gaituta"
+
+#: backends/events/maemosdl/maemosdl-events.cpp:192
+msgid "Clicking Disabled"
+msgstr "Klikatzea desgaituta"
+
+#: engines/agi/detection.cpp:142 engines/drascula/detection.cpp:302
+#: engines/dreamweb/detection.cpp:47 engines/neverhood/detection.cpp:160
+#: engines/sci/detection.cpp:394 engines/toltecs/detection.cpp:186
msgid "Use original save/load screens"
msgstr ""
-#: engines/agi/detection.cpp:143 engines/drascula/detection.cpp:271
-#: engines/dreamweb/detection.cpp:48 engines/sci/detection.cpp:394
-#: engines/toltecs/detection.cpp:174
+#: engines/agi/detection.cpp:143 engines/drascula/detection.cpp:303
+#: engines/dreamweb/detection.cpp:48 engines/neverhood/detection.cpp:161
+#: engines/sci/detection.cpp:395 engines/toltecs/detection.cpp:187
msgid "Use the original save/load screens, instead of the ScummVM ones"
msgstr ""
-#: engines/agi/saveload.cpp:816 engines/drascula/saveload.cpp:351
-#: engines/sci/engine/kfile.cpp:841 engines/toltecs/menu.cpp:259
+#: engines/agi/saveload.cpp:816 engines/drascula/saveload.cpp:349
+#: engines/neverhood/menumodule.cpp:886 engines/sci/engine/kfile.cpp:857
+#: engines/toltecs/menu.cpp:256
msgid "Restore game:"
msgstr "Jokoa kargatu:"
-#: engines/agi/saveload.cpp:816 engines/drascula/saveload.cpp:351
-#: engines/sci/engine/kfile.cpp:841 engines/toltecs/menu.cpp:259
+#: engines/agi/saveload.cpp:816 engines/drascula/saveload.cpp:349
+#: engines/neverhood/menumodule.cpp:886 engines/sci/engine/kfile.cpp:857
+#: engines/toltecs/menu.cpp:256
msgid "Restore"
msgstr "Kargatu"
-#: engines/drascula/saveload.cpp:49
+#: engines/agos/saveload.cpp:160 engines/scumm/scumm.cpp:2321
+#, c-format
+msgid ""
+"Failed to load game state from file:\n"
+"\n"
+"%s"
+msgstr ""
+"Errorea fitxategitik kargatzean:\n"
+"\n"
+"%s"
+
+#: engines/agos/saveload.cpp:195 engines/scumm/scumm.cpp:2314
+#, c-format
+msgid ""
+"Failed to save game state to file:\n"
+"\n"
+"%s"
+msgstr ""
+"Errorea fitxategian gordetzean:\n"
+"\n"
+"%s"
+
+#: engines/agos/saveload.cpp:203 engines/scumm/scumm.cpp:2332
+#, c-format
+msgid ""
+"Successfully saved game state in file:\n"
+"\n"
+"%s"
+msgstr ""
+"Partida ondo gorde da hurrengo fitxategian:\n"
+"\n"
+"%s"
+
+#: engines/agos/animation.cpp:557
+#, c-format
+msgid "Cutscene file '%s' not found!"
+msgstr "'%s' bideo fitxategia ez da aurkitu!"
+
+#: engines/drascula/saveload.cpp:47
#, fuzzy
msgid ""
"ScummVM found that you have old savefiles for Drascula that should be "
@@ -1449,192 +2180,456 @@ msgstr "Goiko eskuineko objektua"
msgid "Display graphics using the game's bright palette"
msgstr ""
-#: engines/sci/detection.cpp:373
+#: engines/gob/inter_playtoons.cpp:256 engines/gob/inter_v2.cpp:1470
+#: engines/tinsel/saveload.cpp:532
+msgid "Failed to load game state from file."
+msgstr "Ezin izan da fitxategitik jokoa kargatu."
+
+#: engines/gob/inter_v2.cpp:1540 engines/tinsel/saveload.cpp:545
+msgid "Failed to save game state to file."
+msgstr "Ezin izan da jokoa fitxategira gorde."
+
+#: engines/gob/inter_v5.cpp:107
+msgid "Failed to delete file."
+msgstr "Ezin izan da fitxategia ezabatu"
+
+#: engines/groovie/detection.cpp:312
+#, fuzzy
+msgid "Fast movie speed"
+msgstr "Modu bizkorra"
+
+#: engines/groovie/detection.cpp:313
+msgid "Play movies at an increased speed"
+msgstr ""
+
+#: engines/groovie/script.cpp:399
+msgid "Failed to save game"
+msgstr "Ezin izan da jokoa gorde"
+
+#. I18N: Studio audience adds an applause and cheering sounds whenever
+#. Malcolm makes a joke.
+#: engines/kyra/detection.cpp:62
+msgid "Studio audience"
+msgstr ""
+
+#: engines/kyra/detection.cpp:63
+msgid "Enable studio audience"
+msgstr ""
+
+#. I18N: This option allows the user to skip text and cutscenes.
+#: engines/kyra/detection.cpp:73
+msgid "Skip support"
+msgstr ""
+
+#: engines/kyra/detection.cpp:74
+msgid "Allow text and cutscenes to be skipped"
+msgstr ""
+
+#. I18N: Helium mode makes people sound like they've inhaled Helium.
+#: engines/kyra/detection.cpp:84
+msgid "Helium mode"
+msgstr ""
+
+#: engines/kyra/detection.cpp:85
+#, fuzzy
+msgid "Enable helium mode"
+msgstr "Roland GS modua gaitu"
+
+#. I18N: When enabled, this option makes scrolling smoother when
+#. changing from one screen to another.
+#: engines/kyra/detection.cpp:99
+msgid "Smooth scrolling"
+msgstr ""
+
+#: engines/kyra/detection.cpp:100
+msgid "Enable smooth scrolling when walking"
+msgstr ""
+
+#. I18N: When enabled, this option changes the cursor when it floats to the
+#. edge of the screen to a directional arrow. The player can then click to
+#. walk towards that direction.
+#: engines/kyra/detection.cpp:112
+#, fuzzy
+msgid "Floating cursors"
+msgstr "Kurtsore normala"
+
+#: engines/kyra/detection.cpp:113
+msgid "Enable floating cursors"
+msgstr ""
+
+#. I18N: HP stands for Hit Points
+#: engines/kyra/detection.cpp:127
+msgid "HP bar graphs"
+msgstr ""
+
+#: engines/kyra/detection.cpp:128
+msgid "Enable hit point bar graphs"
+msgstr ""
+
+#: engines/kyra/lol.cpp:478
+msgid "Attack 1"
+msgstr "1 erasoa"
+
+#: engines/kyra/lol.cpp:479
+msgid "Attack 2"
+msgstr "2 erasoa"
+
+#: engines/kyra/lol.cpp:480
+msgid "Attack 3"
+msgstr "3 erasoa"
+
+#: engines/kyra/lol.cpp:481
+msgid "Move Forward"
+msgstr "Aurrera mugitu"
+
+#: engines/kyra/lol.cpp:482
+msgid "Move Back"
+msgstr "Atzera mugitu"
+
+#: engines/kyra/lol.cpp:483
+msgid "Slide Left"
+msgstr "Ezkerrera irristatu"
+
+#: engines/kyra/lol.cpp:484
+msgid "Slide Right"
+msgstr "Eskuinera irristatu"
+
+#: engines/kyra/lol.cpp:485 engines/pegasus/pegasus.cpp:2509
+msgid "Turn Left"
+msgstr "Ezkerrera biratu"
+
+#: engines/kyra/lol.cpp:486 engines/pegasus/pegasus.cpp:2510
+msgid "Turn Right"
+msgstr "Eskuinera biratu"
+
+#: engines/kyra/lol.cpp:487
+msgid "Rest"
+msgstr "Kargatu"
+
+#: engines/kyra/lol.cpp:488
+msgid "Options"
+msgstr "Aukerak"
+
+#: engines/kyra/lol.cpp:489
+msgid "Choose Spell"
+msgstr "Sorginkeria aukeratu"
+
+#: engines/kyra/sound_midi.cpp:477
+#, fuzzy
+msgid ""
+"You appear to be using a General MIDI device,\n"
+"but your game only supports Roland MT32 MIDI.\n"
+"We try to map the Roland MT32 instruments to\n"
+"General MIDI ones. It is still possible that\n"
+"some tracks sound incorrect."
+msgstr ""
+"General MIDI gailua erabiltzen zaudela dirudi,\n"
+"baina zure jokoak Roland MT32 MIDI bakarrik\n"
+"erabili dezake. Roland MT32 instrumentuak\n"
+"General MIDIkoetara egokitzen saiatuko gara,\n"
+"baina posible da pista batzuk egoki ez entzutea."
+
+#. I18N: Option for fast scene switching
+#: engines/mohawk/dialogs.cpp:92 engines/mohawk/dialogs.cpp:167
+msgid "~Z~ip Mode Activated"
+msgstr "~Z~ip modua aktibaturik"
+
+#: engines/mohawk/dialogs.cpp:93
+msgid "~T~ransitions Enabled"
+msgstr "~T~rantsizioak gaituta"
+
+#. I18N: Drop book page
+#: engines/mohawk/dialogs.cpp:95
+msgid "~D~rop Page"
+msgstr "Orria ~b~ota"
+
+#: engines/mohawk/dialogs.cpp:99
+msgid "~S~how Map"
+msgstr "~M~apa erakutsi"
+
+#: engines/mohawk/dialogs.cpp:105
+msgid "~M~ain Menu"
+msgstr "Menu ~n~agusia"
+
+#: engines/mohawk/dialogs.cpp:168
+msgid "~W~ater Effect Enabled"
+msgstr "~U~r-efektua gaituta"
+
+#: engines/neverhood/detection.cpp:167
+msgid "Skip the Hall of Records storyboard scenes"
+msgstr ""
+
+#: engines/neverhood/detection.cpp:168
+msgid "Allows the player to skip past the Hall of Records storyboard scenes"
+msgstr ""
+
+#: engines/neverhood/detection.cpp:174
+msgid "Scale the making of videos to full screen"
+msgstr ""
+
+#: engines/neverhood/detection.cpp:175
+msgid "Scale the making of videos, so that they use the whole screen"
+msgstr ""
+
+#: engines/parallaction/saveload.cpp:133
+#, c-format
+msgid ""
+"Can't save game in slot %i\n"
+"\n"
+msgstr ""
+"Ezin da partida gorde %i zirrikituan\n"
+"\n"
+
+#: engines/parallaction/saveload.cpp:204
+msgid "Loading game..."
+msgstr "Jokoa kargatzen..."
+
+#: engines/parallaction/saveload.cpp:219
+msgid "Saving game..."
+msgstr "Jokoa gordetzen..."
+
+#: engines/parallaction/saveload.cpp:272
+msgid ""
+"ScummVM found that you have old savefiles for Nippon Safes that should be "
+"renamed.\n"
+"The old names are 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 next time.\n"
+msgstr ""
+"ScummVM-k aurkitu du berrizendatu beharko liratekeen Nippon Safes-eko "
+"partida gorde zaharrak dituzula.\n"
+"Partida gordeen izen zaharra ez da bateragarria jada, eta beraz ezingo "
+"dituzu zure partidak kargatu ez badituzu formatu berrira pasatzen.\n"
+"\n"
+"Sakatu Ados orain konbertitzeko, bestela berriz galdetuko dizut jokoa berriz "
+"martxan jartzen duzunean.\n"
+
+#: engines/parallaction/saveload.cpp:319
+msgid "ScummVM successfully converted all your savefiles."
+msgstr "ScummVM-k ondo konbertitu ditu zure gordetako partida guztiak."
+
+#: engines/parallaction/saveload.cpp:321
+msgid ""
+"ScummVM printed some warnings in your console window and can't guarantee all "
+"your files have been converted.\n"
+"\n"
+"Please report to the team."
+msgstr ""
+"ScummVM-k zenbait abisu inprimatu ditu zure kontsola leihoan eta ezin du "
+"ziurtatu zure fitxategi guztiak ondo konbertitu diren.\n"
+"\n"
+"Mesedez, eman abisua taldeari."
+
+#: engines/pegasus/pegasus.cpp:714
+msgid "Invalid save file name"
+msgstr ""
+
+#: engines/pegasus/pegasus.cpp:2507
+msgid "Up/Zoom In/Move Forward/Open Doors"
+msgstr ""
+
+#: engines/pegasus/pegasus.cpp:2508
+#, fuzzy
+msgid "Down/Zoom Out"
+msgstr "Zoom-a hurbildu"
+
+#: engines/pegasus/pegasus.cpp:2511
+msgid "Display/Hide Inventory Tray"
+msgstr ""
+
+#: engines/pegasus/pegasus.cpp:2512
+msgid "Display/Hide Biochip Tray"
+msgstr ""
+
+#: engines/pegasus/pegasus.cpp:2513
+msgid "Action/Select"
+msgstr ""
+
+#: engines/pegasus/pegasus.cpp:2514
+msgid "Toggle Center Data Display"
+msgstr ""
+
+#: engines/pegasus/pegasus.cpp:2515
+msgid "Display/Hide Info Screen"
+msgstr ""
+
+#: engines/pegasus/pegasus.cpp:2516
+msgid "Display/Hide Pause Menu"
+msgstr ""
+
+#: engines/pegasus/pegasus.cpp:2517
+msgid "???"
+msgstr ""
+
+#: engines/sci/detection.cpp:374
msgid "EGA undithering"
msgstr "EGA lausotzea"
-#: engines/sci/detection.cpp:374
+#: engines/sci/detection.cpp:375
#, fuzzy
msgid "Enable undithering in EGA games"
msgstr "EGA lausotzea gaitu joko bateragarrietan"
-#: engines/sci/detection.cpp:383
+#: engines/sci/detection.cpp:384
#, fuzzy
msgid "Prefer digital sound effects"
msgstr "Soinu efektu berezien bolumena"
-#: engines/sci/detection.cpp:384
+#: engines/sci/detection.cpp:385
msgid "Prefer digital sound effects instead of synthesized ones"
msgstr ""
-#: engines/sci/detection.cpp:403
+#: engines/sci/detection.cpp:404
msgid "Use IMF/Yamaha FB-01 for MIDI output"
msgstr ""
-#: engines/sci/detection.cpp:404
+#: engines/sci/detection.cpp:405
msgid ""
"Use an IBM Music Feature card or a Yamaha FB-01 FM synth module for MIDI "
"output"
msgstr ""
-#: engines/sci/detection.cpp:414
+#: engines/sci/detection.cpp:415
msgid "Use CD audio"
msgstr ""
-#: engines/sci/detection.cpp:415
+#: engines/sci/detection.cpp:416
msgid "Use CD audio instead of in-game audio, if available"
msgstr ""
-#: engines/sci/detection.cpp:425
+#: engines/sci/detection.cpp:426
msgid "Use Windows cursors"
msgstr ""
-#: engines/sci/detection.cpp:426
+#: engines/sci/detection.cpp:427
msgid ""
"Use the Windows cursors (smaller and monochrome) instead of the DOS ones"
msgstr ""
-#: engines/sci/detection.cpp:436
+#: engines/sci/detection.cpp:437
#, fuzzy
msgid "Use silver cursors"
msgstr "Kurtsore normala"
-#: engines/sci/detection.cpp:437
+#: engines/sci/detection.cpp:438
msgid ""
"Use the alternate set of silver cursors, instead of the normal golden ones"
msgstr ""
-#: engines/scumm/dialogs.cpp:175
+#: engines/scumm/dialogs.cpp:176
#, c-format
msgid "Insert Disk %c and Press Button to Continue."
msgstr "%c diskoa sartu eta sakatu botoi bat jarraitzeko."
-#: engines/scumm/dialogs.cpp:176
+#: engines/scumm/dialogs.cpp:177
#, c-format
msgid "Unable to Find %s, (%c%d) Press Button."
msgstr "Ezin izan da %s, (%c%d) aurkitu. Sakatu botoi bat"
-#: engines/scumm/dialogs.cpp:177
+#: engines/scumm/dialogs.cpp:178
#, c-format
msgid "Error reading disk %c, (%c%d) Press Button."
msgstr "%c, (%c%d) diskoa irakurtzean errorea. Sakatu botoia."
-#: engines/scumm/dialogs.cpp:178
+#: engines/scumm/dialogs.cpp:179
msgid "Game Paused. Press SPACE to Continue."
msgstr "Joko pausatua. Sakatu ZURIUNEA jarraitzeko."
#. 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
+#: engines/scumm/dialogs.cpp:183
msgid "Are you sure you want to restart? (Y/N)"
msgstr "Ziur zaude berrabiarazi nahi duzula (B/E)B"
#. I18N: you may specify 'Yes' symbol at the end of the line. See previous comment
-#: engines/scumm/dialogs.cpp:184
+#: engines/scumm/dialogs.cpp:185
msgid "Are you sure you want to quit? (Y/N)"
msgstr "Ziur zaude irten nahi duzula? (B/E)B"
-#: engines/scumm/dialogs.cpp:189
+#: engines/scumm/dialogs.cpp:190
msgid "Play"
msgstr "Jolastu"
-#: 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:215
-msgid "Quit"
-msgstr "Irten"
-
-#: engines/scumm/dialogs.cpp:193
+#: engines/scumm/dialogs.cpp:194
msgid "Insert save/load game disk"
msgstr "Sartu partida gordeak dituen diskoa"
-#: engines/scumm/dialogs.cpp:194
+#: engines/scumm/dialogs.cpp:195
msgid "You must enter a name"
msgstr "Izen bat sartu behar duzu"
-#: engines/scumm/dialogs.cpp:195
+#: engines/scumm/dialogs.cpp:196
msgid "The game was NOT saved (disk full?)"
msgstr "Jokoa EZ da gorde (diskoa beteta?)"
-#: engines/scumm/dialogs.cpp:196
+#: engines/scumm/dialogs.cpp:197
msgid "The game was NOT loaded"
msgstr "Jokoa EZ da kargatu"
-#: engines/scumm/dialogs.cpp:197
+#: engines/scumm/dialogs.cpp:198
#, c-format
msgid "Saving '%s'"
msgstr "'%s' gordetzen"
-#: engines/scumm/dialogs.cpp:198
+#: engines/scumm/dialogs.cpp:199
#, c-format
msgid "Loading '%s'"
msgstr "'%s' kargatzen"
-#: engines/scumm/dialogs.cpp:199
+#: engines/scumm/dialogs.cpp:200
msgid "Name your SAVE game"
msgstr "Izendatu zure partida"
-#: engines/scumm/dialogs.cpp:200
+#: engines/scumm/dialogs.cpp:201
msgid "Select a game to LOAD"
msgstr "Aukeratu kargatzeko partida"
-#: engines/scumm/dialogs.cpp:201
+#: engines/scumm/dialogs.cpp:202
msgid "Game title)"
msgstr "Jokoaren izena)"
#. I18N: Previous page button
-#: engines/scumm/dialogs.cpp:287
+#: engines/scumm/dialogs.cpp:288
msgid "~P~revious"
msgstr "~A~urrekoa"
#. I18N: Next page button
-#: engines/scumm/dialogs.cpp:289
+#: engines/scumm/dialogs.cpp:290
msgid "~N~ext"
msgstr "~H~urrengoa"
-#: engines/scumm/dialogs.cpp:290
-#: backends/platform/ds/arm9/source/dsoptions.cpp:56
-msgid "~C~lose"
-msgstr "~I~txi"
-
-#: engines/scumm/dialogs.cpp:597
+#: engines/scumm/dialogs.cpp:598
msgid "Speech Only"
msgstr "Ahotsak bakarrik"
-#: engines/scumm/dialogs.cpp:598
+#: engines/scumm/dialogs.cpp:599
msgid "Speech and Subtitles"
msgstr "Ahotsak eta azpitituluak"
-#: engines/scumm/dialogs.cpp:599
+#: engines/scumm/dialogs.cpp:600
msgid "Subtitles Only"
msgstr "Azpitituluak bakarrik"
-#: engines/scumm/dialogs.cpp:607
+#: engines/scumm/dialogs.cpp:608
msgctxt "lowres"
msgid "Speech & Subs"
msgstr "Ahotsak & azpit."
-#: engines/scumm/dialogs.cpp:653
+#: engines/scumm/dialogs.cpp:654
msgid "Select a Proficiency Level."
msgstr "Zailtasuna aukeratu."
-#: engines/scumm/dialogs.cpp:655
+#: engines/scumm/dialogs.cpp:656
msgid "Refer to your Loom(TM) manual for help."
msgstr "Loom(TM)-ko eskuliburura jo ezazu laguntza lortzeko."
-#: engines/scumm/dialogs.cpp:658
-msgid "Standard"
-msgstr "Estandarra"
-
-#: engines/scumm/dialogs.cpp:659
+#: engines/scumm/dialogs.cpp:660
msgid "Practice"
msgstr "Entrenamendua"
-#: engines/scumm/dialogs.cpp:660
+#: engines/scumm/dialogs.cpp:661
msgid "Expert"
msgstr "Aditua"
@@ -2151,7 +3146,7 @@ msgstr "Eskuinera hegan egin"
msgid "Fly to lower right"
msgstr "Behera eta eskuinera hegan egin"
-#: engines/scumm/scumm.cpp:1776
+#: engines/scumm/scumm.cpp:1777
#, c-format
msgid ""
"Native MIDI support requires the Roland Upgrade from LucasArts,\n"
@@ -2160,40 +3155,7 @@ msgstr ""
"MIDI euskarri natiboak LucasArts-en Roland eguneraketa behar du,\n"
"baina %s ez dago eskuragarri. AdLib erabiliko da."
-#: engines/scumm/scumm.cpp:2303 engines/agos/saveload.cpp:220
-#, c-format
-msgid ""
-"Failed to save game state to file:\n"
-"\n"
-"%s"
-msgstr ""
-"Errorea fitxategian gordetzean:\n"
-"\n"
-"%s"
-
-#: engines/scumm/scumm.cpp:2310 engines/agos/saveload.cpp:185
-#, c-format
-msgid ""
-"Failed to load game state from file:\n"
-"\n"
-"%s"
-msgstr ""
-"Errorea fitxategitik kargatzean:\n"
-"\n"
-"%s"
-
-#: engines/scumm/scumm.cpp:2322 engines/agos/saveload.cpp:228
-#, c-format
-msgid ""
-"Successfully saved game state in file:\n"
-"\n"
-"%s"
-msgstr ""
-"Partida ondo gorde da hurrengo fitxategian:\n"
-"\n"
-"%s"
-
-#: engines/scumm/scumm.cpp:2537
+#: engines/scumm/scumm.cpp:2547
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' "
@@ -2203,194 +3165,6 @@ msgstr ""
"baimentzen oraindik. Jolasteko , joan 'Jokoa gehitu' hasierako menura eta "
"aukeratu 'Maniac' direktorioa Tentacle-ren joko-direktorioaren barruan."
-#. I18N: Option for fast scene switching
-#: engines/mohawk/dialogs.cpp:92 engines/mohawk/dialogs.cpp:167
-msgid "~Z~ip Mode Activated"
-msgstr "~Z~ip modua aktibaturik"
-
-#: engines/mohawk/dialogs.cpp:93
-msgid "~T~ransitions Enabled"
-msgstr "~T~rantsizioak gaituta"
-
-#. I18N: Drop book page
-#: engines/mohawk/dialogs.cpp:95
-msgid "~D~rop Page"
-msgstr "Orria ~b~ota"
-
-#: engines/mohawk/dialogs.cpp:99
-msgid "~S~how Map"
-msgstr "~M~apa erakutsi"
-
-#: engines/mohawk/dialogs.cpp:105
-msgid "~M~ain Menu"
-msgstr "Menu ~n~agusia"
-
-#: engines/mohawk/dialogs.cpp:168
-msgid "~W~ater Effect Enabled"
-msgstr "~U~r-efektua gaituta"
-
-#: engines/agos/animation.cpp:557
-#, c-format
-msgid "Cutscene file '%s' not found!"
-msgstr "'%s' bideo fitxategia ez da aurkitu!"
-
-#: engines/gob/inter_playtoons.cpp:256 engines/gob/inter_v2.cpp:1287
-#: engines/tinsel/saveload.cpp:532
-msgid "Failed to load game state from file."
-msgstr "Ezin izan da fitxategitik jokoa kargatu."
-
-#: engines/gob/inter_v2.cpp:1357 engines/tinsel/saveload.cpp:545
-msgid "Failed to save game state to file."
-msgstr "Ezin izan da jokoa fitxategira gorde."
-
-#: engines/gob/inter_v5.cpp:107
-msgid "Failed to delete file."
-msgstr "Ezin izan da fitxategia ezabatu"
-
-#: engines/groovie/detection.cpp:312
-#, fuzzy
-msgid "Fast movie speed"
-msgstr "Modu bizkorra"
-
-#: engines/groovie/detection.cpp:313
-msgid "Play movies at an increased speed"
-msgstr ""
-
-#: engines/groovie/script.cpp:420
-msgid "Failed to save game"
-msgstr "Ezin izan da jokoa gorde"
-
-#. I18N: Studio audience adds an applause and cheering sounds whenever
-#. Malcolm makes a joke.
-#: engines/kyra/detection.cpp:62
-msgid "Studio audience"
-msgstr ""
-
-#: engines/kyra/detection.cpp:63
-msgid "Enable studio audience"
-msgstr ""
-
-#. I18N: This option allows the user to skip text and cutscenes.
-#: engines/kyra/detection.cpp:73
-msgid "Skip support"
-msgstr ""
-
-#: engines/kyra/detection.cpp:74
-msgid "Allow text and cutscenes to be skipped"
-msgstr ""
-
-#. I18N: Helium mode makes people sound like they've inhaled Helium.
-#: engines/kyra/detection.cpp:84
-msgid "Helium mode"
-msgstr ""
-
-#: engines/kyra/detection.cpp:85
-#, fuzzy
-msgid "Enable helium mode"
-msgstr "Roland GS modua gaitu"
-
-#. I18N: When enabled, this option makes scrolling smoother when
-#. changing from one screen to another.
-#: engines/kyra/detection.cpp:99
-msgid "Smooth scrolling"
-msgstr ""
-
-#: engines/kyra/detection.cpp:100
-msgid "Enable smooth scrolling when walking"
-msgstr ""
-
-#. I18N: When enabled, this option changes the cursor when it floats to the
-#. edge of the screen to a directional arrow. The player can then click to
-#. walk towards that direction.
-#: engines/kyra/detection.cpp:112
-#, fuzzy
-msgid "Floating cursors"
-msgstr "Kurtsore normala"
-
-#: engines/kyra/detection.cpp:113
-msgid "Enable floating cursors"
-msgstr ""
-
-#. I18N: HP stands for Hit Points
-#: engines/kyra/detection.cpp:127
-msgid "HP bar graphs"
-msgstr ""
-
-#: engines/kyra/detection.cpp:128
-msgid "Enable hit point bar graphs"
-msgstr ""
-
-#: engines/kyra/lol.cpp:478
-msgid "Attack 1"
-msgstr "1 erasoa"
-
-#: engines/kyra/lol.cpp:479
-msgid "Attack 2"
-msgstr "2 erasoa"
-
-#: engines/kyra/lol.cpp:480
-msgid "Attack 3"
-msgstr "3 erasoa"
-
-#: engines/kyra/lol.cpp:481
-msgid "Move Forward"
-msgstr "Aurrera mugitu"
-
-#: engines/kyra/lol.cpp:482
-msgid "Move Back"
-msgstr "Atzera mugitu"
-
-#: engines/kyra/lol.cpp:483
-msgid "Slide Left"
-msgstr "Ezkerrera irristatu"
-
-#: engines/kyra/lol.cpp:484
-msgid "Slide Right"
-msgstr "Eskuinera irristatu"
-
-#: engines/kyra/lol.cpp:485 engines/pegasus/pegasus.cpp:2447
-msgid "Turn Left"
-msgstr "Ezkerrera biratu"
-
-#: engines/kyra/lol.cpp:486 engines/pegasus/pegasus.cpp:2448
-msgid "Turn Right"
-msgstr "Eskuinera biratu"
-
-#: engines/kyra/lol.cpp:487
-msgid "Rest"
-msgstr "Kargatu"
-
-#: engines/kyra/lol.cpp:488
-msgid "Options"
-msgstr "Aukerak"
-
-#: engines/kyra/lol.cpp:489
-msgid "Choose Spell"
-msgstr "Sorginkeria aukeratu"
-
-#: engines/kyra/sound_midi.cpp:477
-#, fuzzy
-msgid ""
-"You appear to be using a General MIDI device,\n"
-"but your game only supports Roland MT32 MIDI.\n"
-"We try to map the Roland MT32 instruments to\n"
-"General MIDI ones. It is still possible that\n"
-"some tracks sound incorrect."
-msgstr ""
-"General MIDI gailua erabiltzen zaudela dirudi,\n"
-"baina zure jokoak Roland MT32 MIDI bakarrik\n"
-"erabili dezake. Roland MT32 instrumentuak\n"
-"General MIDIkoetara egokitzen saiatuko gara,\n"
-"baina posible da pista batzuk egoki ez entzutea."
-
-#: engines/queen/queen.cpp:59
-msgid "Alternative intro"
-msgstr ""
-
-#: engines/queen/queen.cpp:60
-msgid "Use an alternative game intro (CD version only)"
-msgstr ""
-
#: engines/sky/compact.cpp:130
msgid ""
"Unable to find \"sky.cpt\" file!\n"
@@ -2415,21 +3189,24 @@ msgstr ""
msgid "Use the floppy version's intro (CD version only)"
msgstr ""
-#: engines/sword1/animation.cpp:519
+#: engines/sword1/animation.cpp:524
#, c-format
msgid "PSX stream cutscene '%s' cannot be played in paletted mode"
msgstr ""
-#: engines/sword1/animation.cpp:540 engines/sword2/animation.cpp:439
+#: engines/sword1/animation.cpp:545 engines/sword2/animation.cpp:445
msgid "DXA cutscenes found but ScummVM has been built without zlib support"
msgstr ""
"DXA bideoak aurkitu dira, baina ScummVM zlib euskarri gabe konpilatu da"
-#: engines/sword1/animation.cpp:550 engines/sword2/animation.cpp:449
-msgid "MPEG2 cutscenes are no longer supported"
-msgstr "MPEG2 bideoak ez dira bateragarriak jada"
+#: engines/sword1/animation.cpp:561
+#, fuzzy
+msgid "MPEG-2 cutscenes found but ScummVM has been built without MPEG-2"
+msgstr ""
+"PSX eszenak aurkitu dira, baina ScummVM RGB kolorearen euskarri gabe "
+"konpilatu da"
-#: engines/sword1/animation.cpp:556 engines/sword2/animation.cpp:457
+#: engines/sword1/animation.cpp:568 engines/sword2/animation.cpp:470
#, c-format
msgid "Cutscene '%s' not found"
msgstr "Ez da '%s' bideoa aurkitu"
@@ -2473,13 +3250,20 @@ msgstr "Berria mantendu"
msgid "This is the end of the Broken Sword 1 Demo"
msgstr "Hau Broken Sword 1 Demoaren amaiera da"
-#: engines/sword2/animation.cpp:419
+#: engines/sword2/animation.cpp:425
msgid ""
"PSX cutscenes found but ScummVM has been built without RGB color support"
msgstr ""
"PSX eszenak aurkitu dira, baina ScummVM RGB kolorearen euskarri gabe "
"konpilatu da"
+#: engines/sword2/animation.cpp:461
+#, fuzzy
+msgid ""
+"MPEG-2 cutscenes found but ScummVM has been built without MPEG-2 support"
+msgstr ""
+"DXA bideoak aurkitu dira, baina ScummVM zlib euskarri gabe konpilatu da"
+
#: engines/sword2/sword2.cpp:79
msgid "Show object labels"
msgstr ""
@@ -2488,804 +3272,55 @@ msgstr ""
msgid "Show labels for objects on mouse hover"
msgstr ""
-#: engines/teenagent/resources.cpp:94
+#: engines/teenagent/resources.cpp:95
msgid ""
"You're missing the 'teenagent.dat' file. Get it from the ScummVM website"
msgstr ""
-#: engines/teenagent/resources.cpp:115
+#: engines/teenagent/resources.cpp:116
msgid ""
"The teenagent.dat file is compressed and zlib hasn't been included in this "
"executable. Please decompress it"
msgstr ""
-#: engines/parallaction/saveload.cpp:133
-#, c-format
-msgid ""
-"Can't save game in slot %i\n"
-"\n"
-msgstr ""
-"Ezin da partida gorde %i zirrikituan\n"
-"\n"
-
-#: engines/parallaction/saveload.cpp:204
-msgid "Loading game..."
-msgstr "Jokoa kargatzen..."
-
-#: engines/parallaction/saveload.cpp:219
-msgid "Saving game..."
-msgstr "Jokoa gordetzen..."
-
-#: engines/parallaction/saveload.cpp:272
-msgid ""
-"ScummVM found that you have old savefiles for Nippon Safes that should be "
-"renamed.\n"
-"The old names are 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 next time.\n"
-msgstr ""
-"ScummVM-k aurkitu du berrizendatu beharko liratekeen Nippon Safes-eko "
-"partida gorde zaharrak dituzula.\n"
-"Partida gordeen izen zaharra ez da bateragarria jada, eta beraz ezingo "
-"dituzu zure partidak kargatu ez badituzu formatu berrira pasatzen.\n"
-"\n"
-"Sakatu Ados orain konbertitzeko, bestela berriz galdetuko dizut jokoa berriz "
-"martxan jartzen duzunean.\n"
-
-#: engines/parallaction/saveload.cpp:319
-msgid "ScummVM successfully converted all your savefiles."
-msgstr "ScummVM-k ondo konbertitu ditu zure gordetako partida guztiak."
-
-#: engines/parallaction/saveload.cpp:321
-msgid ""
-"ScummVM printed some warnings in your console window and can't guarantee all "
-"your files have been converted.\n"
-"\n"
-"Please report to the team."
-msgstr ""
-"ScummVM-k zenbait abisu inprimatu ditu zure kontsola leihoan eta ezin du "
-"ziurtatu zure fitxategi guztiak ondo konbertitu diren.\n"
-"\n"
-"Mesedez, eman abisua taldeari."
-
-#: engines/pegasus/pegasus.cpp:679
-msgid "Invalid save file name"
-msgstr ""
-
-#: engines/pegasus/pegasus.cpp:2445
-msgid "Up/Zoom In/Move Forward/Open Doors"
-msgstr ""
-
-#: engines/pegasus/pegasus.cpp:2446
-#, fuzzy
-msgid "Down/Zoom Out"
-msgstr "Zoom-a hurbildu"
-
-#: engines/pegasus/pegasus.cpp:2449
-msgid "Display/Hide Inventory Tray"
-msgstr ""
-
-#: engines/pegasus/pegasus.cpp:2450
-msgid "Display/Hide Biochip Tray"
-msgstr ""
-
-#: engines/pegasus/pegasus.cpp:2451
-msgid "Action/Select"
-msgstr ""
-
-#: engines/pegasus/pegasus.cpp:2452
-msgid "Toggle Center Data Display"
-msgstr ""
-
-#: engines/pegasus/pegasus.cpp:2453
-msgid "Display/Hide Info Screen"
-msgstr ""
-
-#: engines/pegasus/pegasus.cpp:2454
-msgid "Display/Hide Pause Menu"
-msgstr ""
-
-#: engines/pegasus/pegasus.cpp:2455
-msgid "???"
-msgstr ""
-
-#: audio/fmopl.cpp:49
-msgid "MAME OPL emulator"
-msgstr "MAME OPL emuladorea"
-
-#: audio/fmopl.cpp:51
-msgid "DOSBox OPL emulator"
-msgstr "DOSBox OPL emuladorea"
-
-#: audio/mididrv.cpp:209
-#, c-format
-msgid ""
-"The selected audio device '%s' was not found (e.g. might be turned off or "
-"disconnected)."
-msgstr ""
-"Aukeraturiko '%s' soinu gailua ez da aurkitu (baliteke itzalita edo "
-"konektatu gabe egotea)"
-
-#: audio/mididrv.cpp:209 audio/mididrv.cpp:221 audio/mididrv.cpp:257
-#: audio/mididrv.cpp:272
-msgid "Attempting to fall back to the next available device..."
-msgstr "Eskuragarri dagoen hurrengo soinu gailura joaten..."
-
-#: audio/mididrv.cpp:221
-#, c-format
-msgid ""
-"The selected audio device '%s' cannot be used. See log file for more "
-"information."
-msgstr ""
-"Aukeraturiko '%s' soinu gailua ezin da erabili. Ikusi log fitxategia "
-"informazio gehiagorako."
-
-#: audio/mididrv.cpp:257
-#, c-format
-msgid ""
-"The preferred audio device '%s' was not found (e.g. might be turned off or "
-"disconnected)."
-msgstr ""
-"'%s' gogoko soinu gailua ez da aurkitu (baliteke itzalita edo konektatu gabe "
-"egotea)"
-
-#: audio/mididrv.cpp:272
-#, c-format
-msgid ""
-"The preferred audio device '%s' cannot be used. See log file for more "
-"information."
-msgstr ""
-"'%s' gogoko soinu gailua ezin da erabili. Ikusi log fitxategia informazio "
-"gehiagorako."
-
-#: audio/null.h:43
-msgid "No music"
-msgstr "Musikarik ez"
-
-#: audio/mods/paula.cpp:189
-msgid "Amiga Audio Emulator"
-msgstr "Amiga Audio emuladorea"
-
-#: audio/softsynth/adlib.cpp:2284
-msgid "AdLib Emulator"
-msgstr "AdLib emuladorea"
-
-#: audio/softsynth/appleiigs.cpp:33
-msgid "Apple II GS Emulator (NOT IMPLEMENTED)"
-msgstr "Apple II GS emuladorea (INPLEMENTATU GABE)"
-
-#: audio/softsynth/sid.cpp:1430
-msgid "C64 Audio Emulator"
-msgstr "C64 Audio emuladorea"
-
-#: audio/softsynth/mt32.cpp:205
-msgid "Initializing MT-32 Emulator"
-msgstr "MT-32 emuladorea hasieratzen"
-
-#: audio/softsynth/mt32.cpp:431
-msgid "MT-32 Emulator"
-msgstr "MT-32 emuladorea"
-
-#: audio/softsynth/pcspk.cpp:139
-msgid "PC Speaker Emulator"
-msgstr "PC bozgoragailuaren emuladorea"
-
-#: audio/softsynth/pcspk.cpp:158
-msgid "IBM PCjr Emulator"
-msgstr "IBM PCjr emuladorea"
-
-#: backends/keymapper/remap-dialog.cpp:47
-msgid "Keymap:"
-msgstr "Teklen esleipena:"
-
-#: backends/keymapper/remap-dialog.cpp:66
-msgid " (Effective)"
-msgstr "(Egiazkoa)"
-
-#: backends/keymapper/remap-dialog.cpp:106
-msgid " (Active)"
-msgstr "(Aktiboa)"
-
-#: backends/keymapper/remap-dialog.cpp:106
-msgid " (Blocked)"
-msgstr "(Blokeaturik)"
-
-#: backends/keymapper/remap-dialog.cpp:119
-msgid " (Global)"
-msgstr "(Orokorra)"
-
-#: backends/keymapper/remap-dialog.cpp:127
-msgid " (Game)"
-msgstr "(Jokoa)"
-
-#: backends/midi/windows.cpp:164
-msgid "Windows MIDI"
-msgstr "Windows MIDI"
-
-#: backends/platform/ds/arm9/source/dsoptions.cpp:57
-msgid "ScummVM Main Menu"
-msgstr "ScummVM menu orokorra"
-
-#: backends/platform/ds/arm9/source/dsoptions.cpp:63
-msgid "~L~eft handed mode"
-msgstr "~E~zkertientzako modua"
-
-#: backends/platform/ds/arm9/source/dsoptions.cpp:64
-msgid "~I~ndy fight controls"
-msgstr "~I~ndy-ren borrokarako kontrolak"
-
-#: backends/platform/ds/arm9/source/dsoptions.cpp:65
-msgid "Show mouse cursor"
-msgstr "Saguaren kurtsorea erakutsi"
-
-#: backends/platform/ds/arm9/source/dsoptions.cpp:66
-msgid "Snap to edges"
-msgstr "Ertzetara itsatsi"
-
-#: backends/platform/ds/arm9/source/dsoptions.cpp:68
-msgid "Touch X Offset"
-msgstr "Ukimenaren X oreka"
-
-#: backends/platform/ds/arm9/source/dsoptions.cpp:75
-msgid "Touch Y Offset"
-msgstr "Ukimenaren Y oreka"
-
-#: backends/platform/ds/arm9/source/dsoptions.cpp:87
-msgid "Use laptop trackpad-style cursor control"
-msgstr "Eramangarrietako trackpad estiloko kurtsore-kontrola erabili"
-
-#: backends/platform/ds/arm9/source/dsoptions.cpp:88
-msgid "Tap for left click, double tap right click"
-msgstr "Toke bat ezker-klikerako, toke bikoitza eskuin klikerako"
-
-#: backends/platform/ds/arm9/source/dsoptions.cpp:90
-msgid "Sensitivity"
-msgstr "Sentikortasuna"
-
-#: backends/platform/ds/arm9/source/dsoptions.cpp:99
-msgid "Initial top screen scale:"
-msgstr "Goiko pantailaren hasierako eskala:"
-
-#: backends/platform/ds/arm9/source/dsoptions.cpp:105
-msgid "Main screen scaling:"
-msgstr "Pantaila nagusiaren eskala:"
-
-#: backends/platform/ds/arm9/source/dsoptions.cpp:107
-msgid "Hardware scale (fast, but low quality)"
-msgstr "Hardware bidezko eskala (arina, baina kalitate baxukoa)"
-
-#: backends/platform/ds/arm9/source/dsoptions.cpp:108
-msgid "Software scale (good quality, but slower)"
-msgstr "Software bidezko eskala (kalitate ona, baina geldoagoa)"
-
-#: backends/platform/ds/arm9/source/dsoptions.cpp:109
-msgid "Unscaled (you must scroll left and right)"
-msgstr "Eskalatu gabe (ezker-eskuin mugitu behar duzu pantaila)"
-
-#: backends/platform/ds/arm9/source/dsoptions.cpp:111
-msgid "Brightness:"
-msgstr "Distira:"
-
-#: backends/platform/ds/arm9/source/dsoptions.cpp:121
-msgid "High quality audio (slower) (reboot)"
-msgstr "Kalitate altuko soinua (geldoagoa) (berrabiarazi)"
-
-#: backends/platform/ds/arm9/source/dsoptions.cpp:122
-msgid "Disable power off"
-msgstr "Itzaltzea desgaitu"
-
-#: backends/platform/iphone/osys_events.cpp:300
-msgid "Mouse-click-and-drag mode enabled."
-msgstr "Saguko klik-eta-arrastratu modua gaituta."
-
-#: backends/platform/iphone/osys_events.cpp:302
-msgid "Mouse-click-and-drag mode disabled."
-msgstr "Saguko klik-eta-arrastratu modua desgaituta."
-
-#: backends/platform/iphone/osys_events.cpp:313
-msgid "Touchpad mode enabled."
-msgstr "Touchpad modua gaituta."
-
-#: backends/platform/iphone/osys_events.cpp:315
-msgid "Touchpad mode disabled."
-msgstr "Touchpad modua desgaituta."
-
-#: backends/platform/maemo/maemo.cpp:209
-msgid "Click Mode"
-msgstr "Klikatzeko modua"
-
-#: backends/platform/maemo/maemo.cpp:215
-#: 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 "Ezker-klika"
-
-#: backends/platform/maemo/maemo.cpp:218
-msgid "Middle Click"
-msgstr "Erdiko klika"
-
-#: backends/platform/maemo/maemo.cpp:221
-#: backends/platform/symbian/src/SymbianActions.cpp:43
-#: backends/platform/wince/CEActionsSmartphone.cpp:44
-#: backends/platform/bada/form.cpp:273
-msgid "Right Click"
-msgstr "Eskuin-klika"
-
-#: backends/platform/sdl/macosx/appmenu_osx.mm:77
-msgid "Hide ScummVM"
-msgstr "ScummVM ezkutatu"
-
-#: backends/platform/sdl/macosx/appmenu_osx.mm:82
-msgid "Hide Others"
-msgstr "Besteak ezkutatu"
-
-#: backends/platform/sdl/macosx/appmenu_osx.mm:87
-msgid "Show All"
-msgstr "Denak erakutsi"
-
-#: backends/platform/sdl/macosx/appmenu_osx.mm:109
-#: backends/platform/sdl/macosx/appmenu_osx.mm:120
-msgid "Window"
-msgstr "Leihoa"
-
-#: backends/platform/sdl/macosx/appmenu_osx.mm:114
-msgid "Minimize"
-msgstr "Minimizatu"
-
-#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:45
-msgid "Normal (no scaling)"
-msgstr "Normala (eskalatu gabe)"
-
-#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:64
-msgctxt "lowres"
-msgid "Normal (no scaling)"
-msgstr "Normala"
-
-#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2135
-#: backends/graphics/openglsdl/openglsdl-graphics.cpp:537
-msgid "Enabled aspect ratio correction"
-msgstr "Formatu-ratio zuzenketa gaituta"
-
-#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2141
-#: backends/graphics/openglsdl/openglsdl-graphics.cpp:542
-msgid "Disabled aspect ratio correction"
-msgstr "Formatu-ratio zuzenketa desgaituta"
-
-#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2196
-msgid "Active graphics filter:"
-msgstr "Filtro grafiko aktiboa:"
-
-#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2238
-#: backends/graphics/openglsdl/openglsdl-graphics.cpp:481
-msgid "Windowed mode"
-msgstr "Leiho modua"
-
-#: backends/graphics/opengl/opengl-graphics.cpp:135
-msgid "OpenGL Normal"
-msgstr "OpenGL normala"
-
-#: backends/graphics/opengl/opengl-graphics.cpp:136
-msgid "OpenGL Conserve"
-msgstr "OpenGL aurreztu"
-
-#: backends/graphics/opengl/opengl-graphics.cpp:137
-msgid "OpenGL Original"
-msgstr "OpenGL jatorrizkoa"
-
-#: backends/graphics/openglsdl/openglsdl-graphics.cpp:415
-msgid "Current display mode"
-msgstr "Oraingo bideo-modua"
-
-#: backends/graphics/openglsdl/openglsdl-graphics.cpp:428
-msgid "Current scale"
-msgstr "Oraingo eskala"
-
-#: backends/graphics/openglsdl/openglsdl-graphics.cpp:562
-msgid "Active filter mode: Linear"
-msgstr "Filtro aktibo modua: lineala"
-
-#: backends/graphics/openglsdl/openglsdl-graphics.cpp:564
-msgid "Active filter mode: Nearest"
-msgstr "Filtro aktibo modua: hurbilena"
-
-#: backends/platform/symbian/src/SymbianActions.cpp:38
-#: backends/platform/wince/CEActionsSmartphone.cpp:39
-msgid "Up"
-msgstr "Gora"
-
-#: backends/platform/symbian/src/SymbianActions.cpp:39
-#: backends/platform/wince/CEActionsSmartphone.cpp:40
-msgid "Down"
-msgstr "Behera"
-
-#: backends/platform/symbian/src/SymbianActions.cpp:40
-#: backends/platform/wince/CEActionsSmartphone.cpp:41
-msgid "Left"
-msgstr "Ezker"
-
-#: backends/platform/symbian/src/SymbianActions.cpp:41
-#: backends/platform/wince/CEActionsSmartphone.cpp:42
-msgid "Right"
-msgstr "Eskuin"
-
-#: backends/platform/symbian/src/SymbianActions.cpp:46
-#: backends/platform/wince/CEActionsSmartphone.cpp:47
-msgid "Zone"
-msgstr "Zonaldea"
-
-#: backends/platform/symbian/src/SymbianActions.cpp:47
-#: backends/platform/wince/CEActionsPocket.cpp:54
-#: backends/platform/wince/CEActionsSmartphone.cpp:48
-msgid "Multi Function"
-msgstr "Multifuntzioa"
-
-#: backends/platform/symbian/src/SymbianActions.cpp:48
-msgid "Swap character"
-msgstr "Pertsonaia aldatu"
-
-#: backends/platform/symbian/src/SymbianActions.cpp:49
-msgid "Skip text"
-msgstr "Testua saltatu"
-
-#: backends/platform/symbian/src/SymbianActions.cpp:51
-msgid "Fast mode"
-msgstr "Modu bizkorra"
-
-#: backends/platform/symbian/src/SymbianActions.cpp:53
-msgid "Debugger"
-msgstr "Araztailea"
-
-#: backends/platform/symbian/src/SymbianActions.cpp:54
-msgid "Global menu"
-msgstr "Menu orokorra"
-
-#: backends/platform/symbian/src/SymbianActions.cpp:55
-msgid "Virtual keyboard"
-msgstr "Teklatu birtuala"
-
-#: backends/platform/symbian/src/SymbianActions.cpp:56
-msgid "Key mapper"
-msgstr "Teklen esleipena"
-
-#: backends/events/symbiansdl/symbiansdl-events.cpp:184
-msgid "Do you want to quit ?"
-msgstr "Irten nahi al duzu?"
-
-#: backends/platform/wii/options.cpp:51
-msgid "Video"
-msgstr "Bideo"
-
-#: backends/platform/wii/options.cpp:54
-msgid "Current video mode:"
-msgstr "Oraingo bideo modua:"
-
-#: backends/platform/wii/options.cpp:56
-msgid "Double-strike"
-msgstr "Kolpe bikoitza"
-
-#: backends/platform/wii/options.cpp:60
-msgid "Horizontal underscan:"
-msgstr "Underscan horizontala"
-
-#: backends/platform/wii/options.cpp:66
-msgid "Vertical underscan:"
-msgstr "Underscan bertikala:"
-
-#: backends/platform/wii/options.cpp:71
-msgid "Input"
-msgstr "Sarrrera"
-
-#: backends/platform/wii/options.cpp:74
-msgid "GC Pad sensitivity:"
-msgstr "GC Pad-aren sentikortasuna"
-
-#: backends/platform/wii/options.cpp:80
-msgid "GC Pad acceleration:"
-msgstr "GC Pad-aren azelerazioa:"
-
-#: backends/platform/wii/options.cpp:86
-msgid "DVD"
-msgstr "DVD:"
-
-#: backends/platform/wii/options.cpp:89 backends/platform/wii/options.cpp:101
-msgid "Status:"
-msgstr "Egoera:"
-
-#: backends/platform/wii/options.cpp:90 backends/platform/wii/options.cpp:102
-msgid "Unknown"
-msgstr "Ezezaguna"
-
-#: backends/platform/wii/options.cpp:93
-msgid "Mount DVD"
-msgstr "DVD-a muntatu"
-
-#: backends/platform/wii/options.cpp:94
-msgid "Unmount DVD"
-msgstr "DVD-a desmuntatu"
-
-#: backends/platform/wii/options.cpp:98
-msgid "SMB"
-msgstr "SMB"
-
-#: backends/platform/wii/options.cpp:106
-msgid "Server:"
-msgstr "Zerbitzaria:"
-
-#: backends/platform/wii/options.cpp:110
-msgid "Share:"
-msgstr "Konpartituriko direktorioa:"
-
-#: backends/platform/wii/options.cpp:114
-msgid "Username:"
-msgstr "Erabiltzaile-izena:"
-
-#: backends/platform/wii/options.cpp:118
-msgid "Password:"
-msgstr "Pasahitza:"
-
-#: backends/platform/wii/options.cpp:121
-msgid "Init network"
-msgstr "Sarea hasi"
-
-#: backends/platform/wii/options.cpp:123
-msgid "Mount SMB"
-msgstr "SMB-a muntatu"
-
-#: backends/platform/wii/options.cpp:124
-msgid "Unmount SMB"
-msgstr "SMB-a desmuntatu"
-
-#: backends/platform/wii/options.cpp:143
-msgid "DVD Mounted successfully"
-msgstr "DVD-a ondo muntatu da"
-
-#: backends/platform/wii/options.cpp:146
-msgid "Error while mounting the DVD"
-msgstr "Errorea DVD-a muntatzean"
-
-#: backends/platform/wii/options.cpp:148
-msgid "DVD not mounted"
-msgstr "DVD ez muntatua"
-
-#: backends/platform/wii/options.cpp:161
-msgid "Network up, share mounted"
-msgstr "Sarea konektaturik, konpartituriko direktorioa muntaturik"
-
-#: backends/platform/wii/options.cpp:163
-msgid "Network up"
-msgstr "Sarea konektaturik"
-
-#: backends/platform/wii/options.cpp:166
-msgid ", error while mounting the share"
-msgstr ", konpartituriko direktorioa muntatzerakoan errorea"
-
-#: backends/platform/wii/options.cpp:168
-msgid ", share not mounted"
-msgstr ", konpartituriko direktorioa ez muntatua"
-
-#: backends/platform/wii/options.cpp:174
-msgid "Network down"
-msgstr "Sarea konektatu gabe"
-
-#: backends/platform/wii/options.cpp:178
-msgid "Initializing network"
-msgstr "Sarea hasieratzen"
-
-#: backends/platform/wii/options.cpp:182
-msgid "Timeout while initializing network"
-msgstr "Sarearen hasieratze denbora agortu da"
-
-#: backends/platform/wii/options.cpp:186
-#, c-format
-msgid "Network not initialized (%d)"
-msgstr "Sarea ez da hasieratu (%d)"
-
-#: backends/platform/wince/CEActionsPocket.cpp:46
-msgid "Hide Toolbar"
-msgstr "Tresna-barra ezkutatu"
-
-#: backends/platform/wince/CEActionsPocket.cpp:47
-msgid "Show Keyboard"
-msgstr "Teklatua erakutsi"
-
-#: backends/platform/wince/CEActionsPocket.cpp:48
-msgid "Sound on/off"
-msgstr "Soinua aktibatuta/desaktibatuta"
-
-#: backends/platform/wince/CEActionsPocket.cpp:49
-msgid "Right click"
-msgstr "Eskuin klik-a"
-
-#: backends/platform/wince/CEActionsPocket.cpp:50
-msgid "Show/Hide Cursor"
-msgstr "Kurtsorea erakutsi/ezkutatu"
-
-#: backends/platform/wince/CEActionsPocket.cpp:51
-msgid "Free look"
-msgstr "Bista librea"
-
-#: backends/platform/wince/CEActionsPocket.cpp:52
-msgid "Zoom up"
-msgstr "Zoom-a hurbildu"
-
-#: backends/platform/wince/CEActionsPocket.cpp:53
-msgid "Zoom down"
-msgstr "Zoom-a urrundu"
-
-#: backends/platform/wince/CEActionsPocket.cpp:55
-#: backends/platform/wince/CEActionsSmartphone.cpp:49
-msgid "Bind Keys"
-msgstr "Teklak esleitu"
-
-#: backends/platform/wince/CEActionsPocket.cpp:56
-msgid "Cursor Up"
-msgstr "Gora"
-
-#: backends/platform/wince/CEActionsPocket.cpp:57
-msgid "Cursor Down"
-msgstr "Behera"
-
-#: backends/platform/wince/CEActionsPocket.cpp:58
-msgid "Cursor Left"
-msgstr "Ezker"
-
-#: backends/platform/wince/CEActionsPocket.cpp:59
-msgid "Cursor Right"
-msgstr "Eskuin"
-
-#: backends/platform/wince/CEActionsPocket.cpp:267
-#: backends/platform/wince/CEActionsSmartphone.cpp:231
-msgid "Do you want to load or save the game?"
-msgstr "Jokoa kargatu edo gorde nahi duzu?"
-
-#: backends/platform/wince/CEActionsPocket.cpp:326
-#: backends/platform/wince/CEActionsSmartphone.cpp:287
-msgid " Are you sure you want to quit ? "
-msgstr " Ziur irten nahi duzula?"
-
-#: backends/platform/wince/CEActionsSmartphone.cpp:50
-msgid "Keyboard"
-msgstr "Teklatua"
-
-#: backends/platform/wince/CEActionsSmartphone.cpp:51
-msgid "Rotate"
-msgstr "Biratu"
-
-#: backends/platform/wince/CELauncherDialog.cpp:56
-msgid "Using SDL driver "
-msgstr "SDL kontrolatzailea erabiltzen"
-
-#: backends/platform/wince/CELauncherDialog.cpp:60
-msgid "Display "
-msgstr "Pantaila"
-
-#: backends/platform/wince/CELauncherDialog.cpp:83
-msgid "Do you want to perform an automatic scan ?"
-msgstr "Bilaketa automatikoa erabili nahi duzu?"
-
-#: backends/platform/wince/wince-sdl.cpp:515
-msgid "Map right click action"
-msgstr "'Eskuin klika' ekintza esleitu"
-
-#: backends/platform/wince/wince-sdl.cpp:519
-msgid "You must map a key to the 'Right Click' action to play this game"
-msgstr ""
-"'Eskuin klika' ekintza esleitu behar diozu tekla bati joko honetara jolasteko"
-
-#: backends/platform/wince/wince-sdl.cpp:528
-msgid "Map hide toolbar action"
-msgstr "'Tresna-barra ezkutatu' ekintza esleitu"
-
-#: backends/platform/wince/wince-sdl.cpp:532
-msgid "You must map a key to the 'Hide toolbar' action to play this game"
-msgstr ""
-"'Tresna-barra ezkutatu' ekintza tekla bati esleitu behar diozu joko honetara "
-"jolasteko"
-
-#: backends/platform/wince/wince-sdl.cpp:541
-msgid "Map Zoom Up action (optional)"
-msgstr "'Zoom-a urrundu' ekintza esleitu (hautazkoa)"
-
-#: backends/platform/wince/wince-sdl.cpp:544
-msgid "Map Zoom Down action (optional)"
-msgstr "'Zoom-a hurbildu' ekintza esleitu (hautazkkoa)"
-
-#: 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 ""
-"Ez ahaztu 'tresna-barra ezkutatu' ekintza tekla bati esleitzea inbentario "
-"osoa ikusteko"
-
-#: backends/events/default/default-events.cpp:193
-msgid "Do you really want to return to the Launcher?"
-msgstr "Ziur zaude abiarazlera itzuli nahi duzula?"
-
-#: backends/events/default/default-events.cpp:193
-msgid "Launcher"
-msgstr "Abiarazlea"
-
-#: backends/events/default/default-events.cpp:215
-msgid "Do you really want to quit?"
-msgstr "Benetan irten?"
-
-#: backends/events/gph/gph-events.cpp:386
-#: backends/events/gph/gph-events.cpp:429
-#: backends/events/openpandora/op-events.cpp:168
-msgid "Touchscreen 'Tap Mode' - Left Click"
-msgstr "Ukimen-pantailako 'kolpetxo modua' - Ezker klika"
-
-#: backends/events/gph/gph-events.cpp:388
-#: backends/events/gph/gph-events.cpp:431
-#: backends/events/openpandora/op-events.cpp:170
-msgid "Touchscreen 'Tap Mode' - Right Click"
-msgstr "Ukimen-pantailako 'kolpetxo modua' - Eskuin klika"
-
-#: backends/events/gph/gph-events.cpp:390
-#: backends/events/gph/gph-events.cpp:433
-#: backends/events/openpandora/op-events.cpp:172
-msgid "Touchscreen 'Tap Mode' - Hover (No Click)"
-msgstr "Ukimen-pantailako 'kolpetxo modua' - Flotatu (klikik ez)"
-
-#: backends/events/gph/gph-events.cpp:410
-msgid "Maximum Volume"
-msgstr "Bolumen maximoa"
-
-#: backends/events/gph/gph-events.cpp:412
-msgid "Increasing Volume"
-msgstr "Bolumena igotzen"
-
-#: backends/events/gph/gph-events.cpp:418
-msgid "Minimal Volume"
-msgstr "Bolumen minimoa"
+#~ msgctxt "lowres"
+#~ msgid "Mass Add..."
+#~ msgstr "Hainbat gehitu..."
-#: backends/events/gph/gph-events.cpp:420
-msgid "Decreasing Volume"
-msgstr "Bolumena jaisten"
+#~ msgid "Mass Add..."
+#~ msgstr "Hainbat gehitu..."
-#: backends/events/openpandora/op-events.cpp:174
-#, fuzzy
-msgid "Touchscreen 'Tap Mode' - Hover (DPad Clicks)"
-msgstr "Ukimen-pantailako 'kolpetxo modua' - Flotatu (klikik ez)"
+#~ msgid ""
+#~ "Turns off General MIDI mapping for games with Roland MT-32 soundtrack"
+#~ msgstr ""
+#~ "Roland MT-32 soinua duten jokoetan General MIDI bihurtzea desgaitzen du"
-#: backends/updates/macosx/macosx-updates.mm:67
-msgid "Check for Updates..."
-msgstr "Eguneraketak bilatzen..."
+#~ msgid "Standard (16bpp)"
+#~ msgstr "Estandarra (16bpp)"
-#: backends/platform/bada/form.cpp:269
-msgid "Right Click Once"
-msgstr "Eskuin-klika behin"
+#~ msgid "MPEG2 cutscenes are no longer supported"
+#~ msgstr "MPEG2 bideoak ez dira bateragarriak jada"
-#: backends/platform/bada/form.cpp:277
-msgid "Move Only"
-msgstr "Mugitu bakarrik"
+#~ msgid "OpenGL Normal"
+#~ msgstr "OpenGL normala"
-#: backends/platform/bada/form.cpp:291
-msgid "Escape Key"
-msgstr "Ihes tekla"
+#~ msgid "OpenGL Conserve"
+#~ msgstr "OpenGL aurreztu"
-#: backends/platform/bada/form.cpp:296
-msgid "Game Menu"
-msgstr "Jokoaren menua"
+#~ msgid "OpenGL Original"
+#~ msgstr "OpenGL jatorrizkoa"
-#: backends/platform/bada/form.cpp:301
-msgid "Show Keypad"
-msgstr "Teklatu numerikoa erakutsi"
+#~ msgid "Current display mode"
+#~ msgstr "Oraingo bideo-modua"
-#: backends/platform/bada/form.cpp:309
-msgid "Control Mouse"
-msgstr "Saguaren kontrola"
+#~ msgid "Current scale"
+#~ msgstr "Oraingo eskala"
-#: backends/events/maemosdl/maemosdl-events.cpp:192
-msgid "Clicking Enabled"
-msgstr "Klikatzea gaituta"
+#~ msgid "Active filter mode: Linear"
+#~ msgstr "Filtro aktibo modua: lineala"
-#: backends/events/maemosdl/maemosdl-events.cpp:192
-msgid "Clicking Disabled"
-msgstr "Klikatzea desgaituta"
+#~ msgid "Active filter mode: Nearest"
+#~ msgstr "Filtro aktibo modua: hurbilena"
#~ msgid "Enable Roland GS Mode"
#~ msgstr "Roland GS modua gaitu"
diff --git a/po/fi_FI.po b/po/fi_FI.po
index 5471e5db58..d5308177ad 100644
--- a/po/fi_FI.po
+++ b/po/fi_FI.po
@@ -1,5 +1,5 @@
# Finnish translation for ScummVM.
-# Copyright (c) 2012-2013 ScummVM Team
+# Copyright (c) 2012-2014 ScummVM Team
# This file is distributed under the same license as the ScummVM package.
# Toni Saarela <saarela@gmail.com>, 2012.
#
@@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: ScummVM 1.6.0git\n"
"Report-Msgid-Bugs-To: scummvm-devel@lists.sf.net\n"
-"POT-Creation-Date: 2013-04-24 13:35+0100\n"
+"POT-Creation-Date: 2014-06-07 23:06+0100\n"
"PO-Revision-Date: 2012-12-01 19:37+0200\n"
"Last-Translator: Toni Saarela <saarela@gmail.com>\n"
"Language-Team: Finnish\n"
@@ -17,78 +17,78 @@ msgstr ""
"Content-Transfer-Encoding: 8bit\n"
"X-Generator: Poedit 1.5.4\n"
-#: gui/about.cpp:93
+#: gui/about.cpp:94
#, c-format
msgid "(built on %s)"
msgstr "(käännöksen päiväys: %s)"
-#: gui/about.cpp:100
+#: gui/about.cpp:101
msgid "Features compiled in:"
msgstr "Tähän versioon käännetyt ominaisuudet:"
-#: gui/about.cpp:109
+#: gui/about.cpp:110
msgid "Available engines:"
msgstr "Tuetut pelimoottorit:"
-#: gui/browser.cpp:67
+#: gui/browser.cpp:68
#, fuzzy
msgid "Show hidden files"
msgstr "Näytä / piilota konsoli"
-#: gui/browser.cpp:67
+#: gui/browser.cpp:68
msgid "Show files marked with the hidden attribute"
msgstr ""
-#: gui/browser.cpp:71
+#: gui/browser.cpp:72
msgid "Go up"
msgstr "Siirry ylös"
-#: gui/browser.cpp:71 gui/browser.cpp:73
+#: gui/browser.cpp:72 gui/browser.cpp:74
msgid "Go to previous directory level"
msgstr "Palaa edelliselle hakemistotasolle"
-#: gui/browser.cpp:73
+#: gui/browser.cpp:74
msgctxt "lowres"
msgid "Go up"
msgstr "Siirry ylös"
-#: gui/browser.cpp:74 gui/chooser.cpp:45 gui/KeysDialog.cpp:43
-#: gui/launcher.cpp:345 gui/massadd.cpp:94 gui/options.cpp:1238
-#: gui/saveload-dialog.cpp:215 gui/saveload-dialog.cpp:275
-#: gui/saveload-dialog.cpp:545 gui/saveload-dialog.cpp:919
-#: gui/themebrowser.cpp:54 gui/fluidsynth-dialog.cpp:151
-#: engines/engine.cpp:447 engines/drascula/saveload.cpp:51
-#: engines/scumm/dialogs.cpp:190 engines/sword1/control.cpp:865
-#: engines/parallaction/saveload.cpp:274 backends/platform/wii/options.cpp:48
-#: backends/events/default/default-events.cpp:193
-#: backends/events/default/default-events.cpp:215
+#: gui/browser.cpp:75 gui/chooser.cpp:46 gui/KeysDialog.cpp:43
+#: gui/launcher.cpp:351 gui/massadd.cpp:95 gui/options.cpp:1239
+#: gui/saveload-dialog.cpp:216 gui/saveload-dialog.cpp:276
+#: gui/saveload-dialog.cpp:547 gui/saveload-dialog.cpp:922
+#: gui/themebrowser.cpp:55 gui/fluidsynth-dialog.cpp:152
+#: engines/engine.cpp:452 backends/platform/wii/options.cpp:48
+#: backends/events/default/default-events.cpp:196
+#: backends/events/default/default-events.cpp:218
+#: engines/drascula/saveload.cpp:49 engines/parallaction/saveload.cpp:274
+#: engines/scumm/dialogs.cpp:191 engines/sword1/control.cpp:865
msgid "Cancel"
msgstr "Peruuta"
-#: gui/browser.cpp:75 gui/chooser.cpp:46 gui/themebrowser.cpp:55
+#: gui/browser.cpp:76 gui/chooser.cpp:47 gui/themebrowser.cpp:56
msgid "Choose"
msgstr "Valitse"
-#: gui/gui-manager.cpp:115 engines/scumm/help.cpp:125
-#: engines/scumm/help.cpp:140 engines/scumm/help.cpp:165
-#: engines/scumm/help.cpp:191 engines/scumm/help.cpp:209
-#: backends/keymapper/remap-dialog.cpp:52
+#: gui/gui-manager.cpp:117 backends/keymapper/remap-dialog.cpp:53
+#: engines/scumm/help.cpp:125 engines/scumm/help.cpp:140
+#: engines/scumm/help.cpp:165 engines/scumm/help.cpp:191
+#: engines/scumm/help.cpp:209
msgid "Close"
msgstr "Sulje"
-#: gui/gui-manager.cpp:118
+#: gui/gui-manager.cpp:120
msgid "Mouse click"
msgstr "Hiiren klikkaus"
-#: gui/gui-manager.cpp:122 base/main.cpp:301
+#: gui/gui-manager.cpp:124 base/main.cpp:319
msgid "Display keyboard"
msgstr "Näytä näppäimistö"
-#: gui/gui-manager.cpp:126 base/main.cpp:305
+#: gui/gui-manager.cpp:128 base/main.cpp:323
msgid "Remap keys"
msgstr "Määritä näppäimet uudelleen"
-#: gui/gui-manager.cpp:129 base/main.cpp:308
+#: gui/gui-manager.cpp:131 base/main.cpp:326
msgid "Toggle FullScreen"
msgstr "Kokoruututilan vaihto"
@@ -100,21 +100,21 @@ msgstr "Valitse toiminto"
msgid "Map"
msgstr "Näppäinkartta"
-#: gui/KeysDialog.cpp:42 gui/launcher.cpp:346 gui/launcher.cpp:1001
-#: gui/launcher.cpp:1005 gui/massadd.cpp:91 gui/options.cpp:1239
-#: gui/saveload-dialog.cpp:920 gui/fluidsynth-dialog.cpp:152
-#: engines/engine.cpp:366 engines/engine.cpp:377
-#: engines/drascula/saveload.cpp:51 engines/scumm/dialogs.cpp:192
-#: engines/scumm/scumm.cpp:1778 engines/agos/animation.cpp:558
-#: engines/groovie/script.cpp:420 engines/sky/compact.cpp:131
-#: engines/sky/compact.cpp:141 engines/sword1/animation.cpp:519
-#: engines/sword1/animation.cpp:540 engines/sword1/animation.cpp:550
-#: engines/sword1/animation.cpp:557 engines/sword1/control.cpp:865
-#: engines/sword1/logic.cpp:1633 engines/sword2/animation.cpp:419
-#: engines/sword2/animation.cpp:439 engines/sword2/animation.cpp:449
-#: engines/sword2/animation.cpp:458 engines/parallaction/saveload.cpp:274
+#: gui/KeysDialog.cpp:42 gui/launcher.cpp:352 gui/launcher.cpp:1048
+#: gui/launcher.cpp:1052 gui/massadd.cpp:92 gui/options.cpp:1240
+#: gui/saveload-dialog.cpp:923 gui/fluidsynth-dialog.cpp:153
+#: engines/engine.cpp:371 engines/engine.cpp:382
#: backends/platform/wii/options.cpp:47
#: backends/platform/wince/CELauncherDialog.cpp:54
+#: engines/agos/animation.cpp:558 engines/drascula/saveload.cpp:49
+#: engines/groovie/script.cpp:399 engines/parallaction/saveload.cpp:274
+#: engines/scumm/dialogs.cpp:193 engines/scumm/scumm.cpp:1779
+#: engines/sky/compact.cpp:131 engines/sky/compact.cpp:141
+#: engines/sword1/animation.cpp:524 engines/sword1/animation.cpp:545
+#: engines/sword1/animation.cpp:561 engines/sword1/animation.cpp:569
+#: engines/sword1/control.cpp:865 engines/sword1/logic.cpp:1633
+#: engines/sword2/animation.cpp:425 engines/sword2/animation.cpp:445
+#: engines/sword2/animation.cpp:461 engines/sword2/animation.cpp:471
msgid "OK"
msgstr "Tallenna"
@@ -140,15 +140,15 @@ msgstr "Valitse toiminto"
msgid "Press the key to associate"
msgstr "Paina haluamaasi nappia"
-#: gui/launcher.cpp:187
+#: gui/launcher.cpp:193
msgid "Game"
msgstr "Peli"
-#: gui/launcher.cpp:191
+#: gui/launcher.cpp:197
msgid "ID:"
msgstr "Tunniste:"
-#: gui/launcher.cpp:191 gui/launcher.cpp:193 gui/launcher.cpp:194
+#: gui/launcher.cpp:197 gui/launcher.cpp:199 gui/launcher.cpp:200
msgid ""
"Short game identifier used for referring to savegames and running the game "
"from the command line"
@@ -156,29 +156,29 @@ msgstr ""
"Lyhyt pelitunniste, jota käytetään kun viitataan pelitallennuksiin ja kun "
"peli käynnistetään komentoriviltä"
-#: gui/launcher.cpp:193
+#: gui/launcher.cpp:199
msgctxt "lowres"
msgid "ID:"
msgstr "Tunniste:"
-#: gui/launcher.cpp:198
+#: gui/launcher.cpp:204
msgid "Name:"
msgstr "Nimi:"
-#: gui/launcher.cpp:198 gui/launcher.cpp:200 gui/launcher.cpp:201
+#: gui/launcher.cpp:204 gui/launcher.cpp:206 gui/launcher.cpp:207
msgid "Full title of the game"
msgstr "Pelin koko nimi"
-#: gui/launcher.cpp:200
+#: gui/launcher.cpp:206
msgctxt "lowres"
msgid "Name:"
msgstr "Nimi:"
-#: gui/launcher.cpp:204
+#: gui/launcher.cpp:210
msgid "Language:"
msgstr "Kieli:"
-#: gui/launcher.cpp:204 gui/launcher.cpp:205
+#: gui/launcher.cpp:210 gui/launcher.cpp:211
msgid ""
"Language of the game. This will not turn your Spanish game version into "
"English"
@@ -186,286 +186,287 @@ msgstr ""
"Pelin kieli. Tämä ei muuta esimerkiksi espanjankielistä versiota pelistä "
"englanninkieliseksi."
-#: gui/launcher.cpp:206 gui/launcher.cpp:220 gui/options.cpp:86
-#: gui/options.cpp:736 gui/options.cpp:749 gui/options.cpp:1209
-#: audio/null.cpp:40
+#: gui/launcher.cpp:212 gui/launcher.cpp:226 gui/options.cpp:87
+#: gui/options.cpp:737 gui/options.cpp:750 gui/options.cpp:1210
+#: audio/null.cpp:41
msgid "<default>"
msgstr "<oletus>"
-#: gui/launcher.cpp:216
+#: gui/launcher.cpp:222
msgid "Platform:"
msgstr "Alusta:"
-#: gui/launcher.cpp:216 gui/launcher.cpp:218 gui/launcher.cpp:219
+#: gui/launcher.cpp:222 gui/launcher.cpp:224 gui/launcher.cpp:225
msgid "Platform the game was originally designed for"
msgstr "Alusta jolle peli alunperin suunniteltiin"
-#: gui/launcher.cpp:218
+#: gui/launcher.cpp:224
msgctxt "lowres"
msgid "Platform:"
msgstr "Alusta:"
-#: gui/launcher.cpp:231
+#: gui/launcher.cpp:237
msgid "Engine"
msgstr "Moottori"
-#: gui/launcher.cpp:239 gui/options.cpp:1072 gui/options.cpp:1089
+#: gui/launcher.cpp:245 gui/options.cpp:1073 gui/options.cpp:1090
msgid "Graphics"
msgstr "Grafiikka"
-#: gui/launcher.cpp:239 gui/options.cpp:1072 gui/options.cpp:1089
+#: gui/launcher.cpp:245 gui/options.cpp:1073 gui/options.cpp:1090
msgid "GFX"
msgstr "GFX"
-#: gui/launcher.cpp:242
+#: gui/launcher.cpp:248
msgid "Override global graphic settings"
msgstr "Ohita globaalit grafiikka-asetukset"
-#: gui/launcher.cpp:244
+#: gui/launcher.cpp:250
msgctxt "lowres"
msgid "Override global graphic settings"
msgstr "Ohita globaalit grafiikka-asetukset"
-#: gui/launcher.cpp:251 gui/options.cpp:1095
+#: gui/launcher.cpp:257 gui/options.cpp:1096
msgid "Audio"
msgstr "Ääni"
-#: gui/launcher.cpp:254
+#: gui/launcher.cpp:260
msgid "Override global audio settings"
msgstr "Ohita globaalit ääniasetukset"
-#: gui/launcher.cpp:256
+#: gui/launcher.cpp:262
msgctxt "lowres"
msgid "Override global audio settings"
msgstr "Ohita globaalit ääniasetukset"
-#: gui/launcher.cpp:265 gui/options.cpp:1100
+#: gui/launcher.cpp:271 gui/options.cpp:1101
msgid "Volume"
msgstr "Voimakkuus"
-#: gui/launcher.cpp:267 gui/options.cpp:1102
+#: gui/launcher.cpp:273 gui/options.cpp:1103
msgctxt "lowres"
msgid "Volume"
msgstr "Voimakkuus"
-#: gui/launcher.cpp:270
+#: gui/launcher.cpp:276
msgid "Override global volume settings"
msgstr "Ohita globaalit äänenvoimakkuusasetukset"
-#: gui/launcher.cpp:272
+#: gui/launcher.cpp:278
msgctxt "lowres"
msgid "Override global volume settings"
msgstr "Ohita globaalit äänenvoimakkuusasetukset"
-#: gui/launcher.cpp:280 gui/options.cpp:1110
+#: gui/launcher.cpp:286 gui/options.cpp:1111
msgid "MIDI"
msgstr "MIDI"
-#: gui/launcher.cpp:283
+#: gui/launcher.cpp:289
msgid "Override global MIDI settings"
msgstr "Ohita globaalit MIDI-asetukset"
-#: gui/launcher.cpp:285
+#: gui/launcher.cpp:291
msgctxt "lowres"
msgid "Override global MIDI settings"
msgstr "Ohita globaalit MIDI-asetukset"
-#: gui/launcher.cpp:294 gui/options.cpp:1116
+#: gui/launcher.cpp:300 gui/options.cpp:1117
msgid "MT-32"
msgstr "MT-32"
-#: gui/launcher.cpp:297
+#: gui/launcher.cpp:303
msgid "Override global MT-32 settings"
msgstr "Ohita globaalit MT-32 asetukset"
-#: gui/launcher.cpp:299
+#: gui/launcher.cpp:305
msgctxt "lowres"
msgid "Override global MT-32 settings"
msgstr "Ohita globaalit MT-32 asetukset"
-#: gui/launcher.cpp:308 gui/options.cpp:1123
+#: gui/launcher.cpp:314 gui/options.cpp:1124
msgid "Paths"
msgstr "Polut"
-#: gui/launcher.cpp:310 gui/options.cpp:1125
+#: gui/launcher.cpp:316 gui/options.cpp:1126
msgctxt "lowres"
msgid "Paths"
msgstr "Polut"
-#: gui/launcher.cpp:317
+#: gui/launcher.cpp:323
msgid "Game Path:"
msgstr "Pelin polku:"
-#: gui/launcher.cpp:319
+#: gui/launcher.cpp:325
msgctxt "lowres"
msgid "Game Path:"
msgstr "Pelin polku:"
-#: gui/launcher.cpp:324 gui/options.cpp:1149
+#: gui/launcher.cpp:330 gui/options.cpp:1150
msgid "Extra Path:"
msgstr "Lisäkansio:"
-#: gui/launcher.cpp:324 gui/launcher.cpp:326 gui/launcher.cpp:327
+#: gui/launcher.cpp:330 gui/launcher.cpp:332 gui/launcher.cpp:333
msgid "Specifies path to additional data used the game"
msgstr "Määrittää polun lisätiedostoihin joita peli mahdollisesti käyttää"
-#: gui/launcher.cpp:326 gui/options.cpp:1151
+#: gui/launcher.cpp:332 gui/options.cpp:1152
msgctxt "lowres"
msgid "Extra Path:"
msgstr "Lisäkansio:"
-#: gui/launcher.cpp:333 gui/options.cpp:1133
+#: gui/launcher.cpp:339 gui/options.cpp:1134
msgid "Save Path:"
msgstr "Tallennuskansio:"
-#: gui/launcher.cpp:333 gui/launcher.cpp:335 gui/launcher.cpp:336
-#: gui/options.cpp:1133 gui/options.cpp:1135 gui/options.cpp:1136
+#: gui/launcher.cpp:339 gui/launcher.cpp:341 gui/launcher.cpp:342
+#: gui/options.cpp:1134 gui/options.cpp:1136 gui/options.cpp:1137
msgid "Specifies where your savegames are put"
msgstr "Määrittää polun pelitallennuksille"
-#: gui/launcher.cpp:335 gui/options.cpp:1135
+#: gui/launcher.cpp:341 gui/options.cpp:1136
msgctxt "lowres"
msgid "Save Path:"
msgstr "Tallennuskansio:"
-#: gui/launcher.cpp:354 gui/launcher.cpp:453 gui/launcher.cpp:511
-#: gui/launcher.cpp:565 gui/options.cpp:1144 gui/options.cpp:1152
-#: gui/options.cpp:1161 gui/options.cpp:1276 gui/options.cpp:1282
-#: gui/options.cpp:1290 gui/options.cpp:1320 gui/options.cpp:1326
-#: gui/options.cpp:1333 gui/options.cpp:1426 gui/options.cpp:1429
-#: gui/options.cpp:1441
+#: gui/launcher.cpp:360 gui/launcher.cpp:459 gui/launcher.cpp:517
+#: gui/launcher.cpp:571 gui/options.cpp:1145 gui/options.cpp:1153
+#: gui/options.cpp:1162 gui/options.cpp:1277 gui/options.cpp:1283
+#: gui/options.cpp:1291 gui/options.cpp:1321 gui/options.cpp:1327
+#: gui/options.cpp:1334 gui/options.cpp:1427 gui/options.cpp:1430
+#: gui/options.cpp:1442
msgctxt "path"
msgid "None"
msgstr "Ei määritelty"
-#: gui/launcher.cpp:359 gui/launcher.cpp:459 gui/launcher.cpp:569
-#: gui/options.cpp:1270 gui/options.cpp:1314 gui/options.cpp:1432
+#: gui/launcher.cpp:365 gui/launcher.cpp:465 gui/launcher.cpp:575
+#: gui/options.cpp:1271 gui/options.cpp:1315 gui/options.cpp:1433
#: backends/platform/wii/options.cpp:56
msgid "Default"
msgstr "Oletus"
-#: gui/launcher.cpp:504 gui/options.cpp:1435
+#: gui/launcher.cpp:510 gui/options.cpp:1436
msgid "Select SoundFont"
msgstr "Valitse äänifontti"
-#: gui/launcher.cpp:523 gui/launcher.cpp:677
+#: gui/launcher.cpp:529 gui/launcher.cpp:682
msgid "Select directory with game data"
msgstr "Valitse pelin kansio"
-#: gui/launcher.cpp:541
+#: gui/launcher.cpp:547
msgid "Select additional game directory"
msgstr "Valitse lisäkansio pelille"
-#: gui/launcher.cpp:553
+#: gui/launcher.cpp:559
msgid "Select directory for saved games"
msgstr "Valitse kansio pelitallennuksille"
-#: gui/launcher.cpp:580
+#: gui/launcher.cpp:586
msgid "This game ID is already taken. Please choose another one."
msgstr "Pelin tunnus on jo käytössä. Valitse jokin muu."
-#: gui/launcher.cpp:621 engines/dialogs.cpp:110
+#: gui/launcher.cpp:626 engines/dialogs.cpp:111
msgid "~Q~uit"
msgstr "~L~opeta"
-#: gui/launcher.cpp:621 backends/platform/sdl/macosx/appmenu_osx.mm:95
+#: gui/launcher.cpp:626 backends/platform/sdl/macosx/appmenu_osx.mm:95
msgid "Quit ScummVM"
msgstr "Lopeta ScummVM"
-#: gui/launcher.cpp:622
+#: gui/launcher.cpp:627
msgid "A~b~out..."
msgstr "Tietoa..."
-#: gui/launcher.cpp:622 backends/platform/sdl/macosx/appmenu_osx.mm:69
+#: gui/launcher.cpp:627 backends/platform/sdl/macosx/appmenu_osx.mm:69
msgid "About ScummVM"
msgstr "Tietoa ScummVM:stä"
-#: gui/launcher.cpp:623
+#: gui/launcher.cpp:628
msgid "~O~ptions..."
msgstr "~A~setukset"
-#: gui/launcher.cpp:623
+#: gui/launcher.cpp:628
msgid "Change global ScummVM options"
msgstr "Muuta globaaleja ScummVM:n asetuksia"
-#: gui/launcher.cpp:625
+#: gui/launcher.cpp:630
msgid "~S~tart"
msgstr "~P~elaa"
-#: gui/launcher.cpp:625
+#: gui/launcher.cpp:630
msgid "Start selected game"
msgstr "Pelaa valittua peliä"
-#: gui/launcher.cpp:628
+#: gui/launcher.cpp:633
msgid "~L~oad..."
msgstr "~L~ataa..."
-#: gui/launcher.cpp:628
+#: gui/launcher.cpp:633
msgid "Load savegame for selected game"
msgstr "Lataa pelitallennus valitulle pelille"
-#: gui/launcher.cpp:633 gui/launcher.cpp:1120
+#: gui/launcher.cpp:638
msgid "~A~dd Game..."
msgstr "~L~isää peli..."
-#: gui/launcher.cpp:633 gui/launcher.cpp:640
+#: gui/launcher.cpp:638 gui/launcher.cpp:645
msgid "Hold Shift for Mass Add"
msgstr "Pidä Shift-näppäintä pohjassa lisätäksesi useita pelejä kerralla"
-#: gui/launcher.cpp:635
+#: gui/launcher.cpp:640
msgid "~E~dit Game..."
msgstr "Muokkaa peliä..."
-#: gui/launcher.cpp:635 gui/launcher.cpp:642
+#: gui/launcher.cpp:640 gui/launcher.cpp:647
msgid "Change game options"
msgstr "Muuta pelin asetuksia"
-#: gui/launcher.cpp:637
+#: gui/launcher.cpp:642
msgid "~R~emove Game"
msgstr "Poista peli"
-#: gui/launcher.cpp:637 gui/launcher.cpp:644
+#: gui/launcher.cpp:642 gui/launcher.cpp:649
msgid "Remove game from the list. The game data files stay intact"
msgstr "Poista peli listasta. Pelin tiedostoja ei poisteta levyltä"
-#: gui/launcher.cpp:640 gui/launcher.cpp:1120
+#: gui/launcher.cpp:645
msgctxt "lowres"
msgid "~A~dd Game..."
msgstr "Lisää peli..."
-#: gui/launcher.cpp:642
+#: gui/launcher.cpp:647
msgctxt "lowres"
msgid "~E~dit Game..."
msgstr "Muokkaa peliä..."
-#: gui/launcher.cpp:644
+#: gui/launcher.cpp:649
msgctxt "lowres"
msgid "~R~emove Game"
msgstr "Poista peli..."
-#: gui/launcher.cpp:652
+#: gui/launcher.cpp:657
msgid "Search in game list"
msgstr "Etsi peliä listasta"
-#: gui/launcher.cpp:656 gui/launcher.cpp:1167
+#: gui/launcher.cpp:661 gui/launcher.cpp:1222
msgid "Search:"
msgstr "Etsi:"
-#: gui/launcher.cpp:680 engines/dialogs.cpp:114 engines/mohawk/myst.cpp:245
-#: engines/mohawk/riven.cpp:716 engines/cruise/menu.cpp:214
-#: engines/pegasus/pegasus.cpp:349
+#: gui/launcher.cpp:685 engines/dialogs.cpp:115 engines/cruise/menu.cpp:214
+#: engines/mohawk/myst.cpp:245 engines/mohawk/riven.cpp:718
+#: engines/pegasus/pegasus.cpp:353
msgid "Load game:"
msgstr "Lataa peli:"
-#: gui/launcher.cpp:680 engines/dialogs.cpp:114 engines/scumm/dialogs.cpp:188
-#: engines/mohawk/myst.cpp:245 engines/mohawk/riven.cpp:716
-#: engines/cruise/menu.cpp:214 engines/pegasus/pegasus.cpp:349
+#: gui/launcher.cpp:685 engines/dialogs.cpp:115
#: backends/platform/wince/CEActionsPocket.cpp:267
#: backends/platform/wince/CEActionsSmartphone.cpp:231
+#: engines/cruise/menu.cpp:214 engines/mohawk/myst.cpp:245
+#: engines/mohawk/riven.cpp:718 engines/pegasus/pegasus.cpp:353
+#: engines/scumm/dialogs.cpp:189
msgid "Load"
msgstr "Lataa"
-#: gui/launcher.cpp:788
+#: gui/launcher.cpp:792
msgid ""
"Do you really want to run the mass game detector? This could potentially add "
"a huge number of games."
@@ -473,7 +474,8 @@ msgstr ""
"Haluatko varmasti lisätä pelejä alihakemistoineen? Tämä voi lisätä suuren "
"määrän pelejä."
-#: gui/launcher.cpp:789 gui/launcher.cpp:937 gui/fluidsynth-dialog.cpp:216
+#: gui/launcher.cpp:793 gui/launcher.cpp:941 gui/launcher.cpp:1000
+#: gui/fluidsynth-dialog.cpp:217
#: backends/events/symbiansdl/symbiansdl-events.cpp:184
#: backends/platform/wince/CEActionsPocket.cpp:326
#: backends/platform/wince/CEActionsSmartphone.cpp:287
@@ -481,7 +483,8 @@ msgstr ""
msgid "Yes"
msgstr "Kyllä"
-#: gui/launcher.cpp:789 gui/launcher.cpp:937 gui/fluidsynth-dialog.cpp:216
+#: gui/launcher.cpp:793 gui/launcher.cpp:941 gui/launcher.cpp:1000
+#: gui/fluidsynth-dialog.cpp:217
#: backends/events/symbiansdl/symbiansdl-events.cpp:184
#: backends/platform/wince/CEActionsPocket.cpp:326
#: backends/platform/wince/CEActionsSmartphone.cpp:287
@@ -489,195 +492,190 @@ msgstr "Kyllä"
msgid "No"
msgstr "Ei"
-#: gui/launcher.cpp:837
+#: gui/launcher.cpp:841
msgid "ScummVM couldn't open the specified directory!"
msgstr "ScummVM ei voi avata kyseistä hakemistoa!"
-#: gui/launcher.cpp:849
+#: gui/launcher.cpp:853
msgid "ScummVM could not find any game in the specified directory!"
msgstr "ScummVM ei löytänyt yhtään peliä kyseisestä hakemistosta!"
-#: gui/launcher.cpp:863
+#: gui/launcher.cpp:867
msgid "Pick the game:"
msgstr "Valitse peli:"
-#: gui/launcher.cpp:937
+#: gui/launcher.cpp:941
msgid "Do you really want to remove this game configuration?"
msgstr "Haluatko varmasti poistaa pelin asetuksineen listalta?"
-#: gui/launcher.cpp:1001
+#: gui/launcher.cpp:999
+#, fuzzy
+msgid "Do you want to load savegame?"
+msgstr "Haluatko tallentaa vai ladata pelin?"
+
+#: gui/launcher.cpp:1048
msgid "This game does not support loading games from the launcher."
msgstr "Tämä peli ei tue pelitallennuksien lataamista pelin ulkopuolelta."
-#: gui/launcher.cpp:1005
+#: gui/launcher.cpp:1052
msgid "ScummVM could not find any engine capable of running the selected game!"
msgstr "ScummVM ei löytänyt pelimoottoria joka tukee valittua peliä!"
-#: gui/launcher.cpp:1119
-msgctxt "lowres"
-msgid "Mass Add..."
-msgstr "Lisää monta..."
-
-#: gui/launcher.cpp:1119
-msgid "Mass Add..."
-msgstr "Lisää monta..."
-
-#: gui/massadd.cpp:78 gui/massadd.cpp:81
+#: gui/massadd.cpp:79 gui/massadd.cpp:82
msgid "... progress ..."
msgstr "... skannaa ..."
-#: gui/massadd.cpp:258
+#: gui/massadd.cpp:259
msgid "Scan complete!"
msgstr "Skannaus on valmis!"
-#: gui/massadd.cpp:261
+#: gui/massadd.cpp:262
#, c-format
msgid "Discovered %d new games, ignored %d previously added games."
msgstr ""
"%d uutta peliä löytyi, jätettiin %d peliä huomiotta, koska ne oli jo lisätty "
"aiemmin."
-#: gui/massadd.cpp:265
+#: gui/massadd.cpp:266
#, c-format
msgid "Scanned %d directories ..."
msgstr "Skannattiin %d hakemistoa ..."
-#: gui/massadd.cpp:268
+#: gui/massadd.cpp:269
#, c-format
msgid "Discovered %d new games, ignored %d previously added games ..."
msgstr ""
"%d uutta peliä löytyi, jätettiin %d peliä huomiotta, koska ne oli jo lisätty "
"aiemmin."
-#: gui/options.cpp:84
+#: gui/options.cpp:85
msgid "Never"
msgstr "Ei koskaan"
-#: gui/options.cpp:84
+#: gui/options.cpp:85
msgid "every 5 mins"
msgstr "5 minuutin välein"
-#: gui/options.cpp:84
+#: gui/options.cpp:85
msgid "every 10 mins"
msgstr "10 minuutin välein"
-#: gui/options.cpp:84
+#: gui/options.cpp:85
msgid "every 15 mins"
msgstr "15 minuutin välein"
-#: gui/options.cpp:84
+#: gui/options.cpp:85
msgid "every 30 mins"
msgstr "30 minuutin välein"
-#: gui/options.cpp:86
+#: gui/options.cpp:87
msgid "8 kHz"
msgstr "8 kHz"
-#: gui/options.cpp:86
+#: gui/options.cpp:87
msgid "11kHz"
msgstr "11 kHz"
-#: gui/options.cpp:86
+#: gui/options.cpp:87
msgid "22 kHz"
msgstr "22 kHz"
-#: gui/options.cpp:86
+#: gui/options.cpp:87
msgid "44 kHz"
msgstr "44 kHz"
-#: gui/options.cpp:86
+#: gui/options.cpp:87
msgid "48 kHz"
msgstr "48 kHz"
-#: gui/options.cpp:254 gui/options.cpp:480 gui/options.cpp:581
-#: gui/options.cpp:650 gui/options.cpp:858
+#: gui/options.cpp:255 gui/options.cpp:481 gui/options.cpp:582
+#: gui/options.cpp:651 gui/options.cpp:859
msgctxt "soundfont"
msgid "None"
msgstr "Ei käytössä"
-#: gui/options.cpp:388
+#: gui/options.cpp:389
msgid "Failed to apply some of the graphic options changes:"
msgstr "Joitain grafiikka-asetuksia ei saatu asetettua:"
-#: gui/options.cpp:400
+#: gui/options.cpp:401
msgid "the video mode could not be changed."
msgstr "videotilaa ei voitu vaihtaa."
-#: gui/options.cpp:406
+#: gui/options.cpp:407
msgid "the fullscreen setting could not be changed"
msgstr "kokoruututilaa ei voitu muuttaa"
-#: gui/options.cpp:412
+#: gui/options.cpp:413
msgid "the aspect ratio setting could not be changed"
msgstr "kuvasuhdekorjausasetusta ei voitu muuttaa"
-#: gui/options.cpp:733
+#: gui/options.cpp:734
msgid "Graphics mode:"
msgstr "Grafiikkatila:"
-#: gui/options.cpp:747
+#: gui/options.cpp:748
msgid "Render mode:"
msgstr "Renderöintitila:"
-#: gui/options.cpp:747 gui/options.cpp:748
+#: gui/options.cpp:748 gui/options.cpp:749
msgid "Special dithering modes supported by some games"
msgstr "Erityiset dithering asetukset joita jotkut pelit tukevat"
-#: gui/options.cpp:759
-#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2236
-#: backends/graphics/openglsdl/openglsdl-graphics.cpp:476
+#: gui/options.cpp:760
+#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2249
msgid "Fullscreen mode"
msgstr "Kokoruututila"
-#: gui/options.cpp:762
+#: gui/options.cpp:763
msgid "Aspect ratio correction"
msgstr "Kuvasuhteen korjaus"
-#: gui/options.cpp:762
+#: gui/options.cpp:763
msgid "Correct aspect ratio for 320x200 games"
msgstr "Oikea kuvasuhde 320x200 peleille"
-#: gui/options.cpp:770
+#: gui/options.cpp:771
msgid "Preferred Device:"
msgstr "Ensisijainen laite:"
-#: gui/options.cpp:770
+#: gui/options.cpp:771
msgid "Music Device:"
msgstr "Musiikkilaite:"
-#: gui/options.cpp:770 gui/options.cpp:772
+#: gui/options.cpp:771 gui/options.cpp:773
msgid "Specifies preferred sound device or sound card emulator"
msgstr ""
"Määrittää äänilaitteen tai äänikorttiemulaattorin jota ensisijaisesti tulisi "
"käyttää"
-#: gui/options.cpp:770 gui/options.cpp:772 gui/options.cpp:773
+#: gui/options.cpp:771 gui/options.cpp:773 gui/options.cpp:774
msgid "Specifies output sound device or sound card emulator"
msgstr "Määrittää äänikortin tai äänikorttia emuloivan ohjelmiston"
-#: gui/options.cpp:772
+#: gui/options.cpp:773
msgctxt "lowres"
msgid "Preferred Dev.:"
msgstr "Ensisijainen:"
-#: gui/options.cpp:772
+#: gui/options.cpp:773
msgctxt "lowres"
msgid "Music Device:"
msgstr "Musiikkilaite:"
-#: gui/options.cpp:799
+#: gui/options.cpp:800
msgid "AdLib emulator:"
msgstr "AdLib emulaattori:"
-#: gui/options.cpp:799 gui/options.cpp:800
+#: gui/options.cpp:800 gui/options.cpp:801
msgid "AdLib is used for music in many games"
msgstr "AdLibiä käytetään monien pelien musiikeissa"
-#: gui/options.cpp:810
+#: gui/options.cpp:811
msgid "Output rate:"
msgstr "Taajuus:"
-#: gui/options.cpp:810 gui/options.cpp:811
+#: gui/options.cpp:811 gui/options.cpp:812
msgid ""
"Higher value specifies better sound quality but may be not supported by your "
"soundcard"
@@ -685,65 +683,65 @@ msgstr ""
"Isommat taajuudet merkitsevät parempaa äänenlaatua, mutta äänikorttisi ei "
"ehkä tue niitä."
-#: gui/options.cpp:821
+#: gui/options.cpp:822
msgid "GM Device:"
msgstr "GM laite:"
-#: gui/options.cpp:821
+#: gui/options.cpp:822
msgid "Specifies default sound device for General MIDI output"
msgstr "Määrittää oletuksena käytettävän äänilaitteen General MIDIlle"
-#: gui/options.cpp:832
+#: gui/options.cpp:833
msgid "Don't use General MIDI music"
msgstr "Älä käytä General MIDIä musiikissa"
-#: gui/options.cpp:843 gui/options.cpp:909
+#: gui/options.cpp:844 gui/options.cpp:910
msgid "Use first available device"
msgstr "Käytä ensimmäistä laitetta"
-#: gui/options.cpp:855
+#: gui/options.cpp:856
msgid "SoundFont:"
msgstr "Äänifontti:"
-#: gui/options.cpp:855 gui/options.cpp:857 gui/options.cpp:858
+#: gui/options.cpp:856 gui/options.cpp:858 gui/options.cpp:859
msgid "SoundFont is supported by some audio cards, Fluidsynth and Timidity"
msgstr ""
"Jotkut äänikortit tukevat äänifonttia (SoundFont), FluidSynth ja Timidity"
-#: gui/options.cpp:857
+#: gui/options.cpp:858
msgctxt "lowres"
msgid "SoundFont:"
msgstr "Äänifontti:"
-#: gui/options.cpp:863
+#: gui/options.cpp:864
msgid "Mixed AdLib/MIDI mode"
msgstr "Yhdistetty AdLib/MIDI tila"
-#: gui/options.cpp:863
+#: gui/options.cpp:864
msgid "Use both MIDI and AdLib sound generation"
msgstr "Käytä sekä MIDIä että Adlibiä äänentuotantoon"
-#: gui/options.cpp:866
+#: gui/options.cpp:867
msgid "MIDI gain:"
msgstr "MIDIn äänilisäys:"
-#: gui/options.cpp:873
+#: gui/options.cpp:874
msgid "FluidSynth Settings"
msgstr ""
-#: gui/options.cpp:880
+#: gui/options.cpp:881
msgid "MT-32 Device:"
msgstr "MT-32 laite:"
-#: gui/options.cpp:880
+#: gui/options.cpp:881
msgid "Specifies default sound device for Roland MT-32/LAPC1/CM32l/CM64 output"
msgstr "Määrittää oletusäänilaitteen Roland MT-32/LAPC1/CM32l/CM64:n käyttöön"
-#: gui/options.cpp:885
+#: gui/options.cpp:886
msgid "True Roland MT-32 (disable GM emulation)"
msgstr "Aito Roland MT-32 (ei GM emulointia)"
-#: gui/options.cpp:885 gui/options.cpp:887
+#: gui/options.cpp:886 gui/options.cpp:888
msgid ""
"Check if you want to use your real hardware Roland-compatible sound device "
"connected to your computer"
@@ -751,193 +749,195 @@ msgstr ""
"Valitse jos haluat käyttää aitoa Roland-yhteensopivaa laittetta joka on "
"kytketty tietokoneeseesi"
-#: gui/options.cpp:887
+#: gui/options.cpp:888
msgctxt "lowres"
msgid "True Roland MT-32 (no GM emulation)"
msgstr "Aito Roland MT-32 (ei GM emulointia)"
-#: gui/options.cpp:890
+#: gui/options.cpp:891
#, fuzzy
-msgid "Roland GS Mode (disable GM mapping)"
+msgid "Roland GS Device (enable MT-32 mappings)"
msgstr "Aito Roland MT-32 (ei GM emulointia)"
-#: gui/options.cpp:890
-msgid "Turns off General MIDI mapping for games with Roland MT-32 soundtrack"
-msgstr "Poistaa General MIDIn peleistä joissa on Roland MT-32 ääniraita"
+#: gui/options.cpp:891
+msgid ""
+"Check if you want to enable patch mappings to emulate an MT-32 on a Roland "
+"GS device"
+msgstr ""
-#: gui/options.cpp:899
+#: gui/options.cpp:900
msgid "Don't use Roland MT-32 music"
msgstr "Älä käytä Roland MT-32 musiikkia"
-#: gui/options.cpp:926
+#: gui/options.cpp:927
msgid "Text and Speech:"
msgstr "Tekstitys ja puhe:"
-#: gui/options.cpp:930 gui/options.cpp:940
+#: gui/options.cpp:931 gui/options.cpp:941
msgid "Speech"
msgstr "Puhe"
-#: gui/options.cpp:931 gui/options.cpp:941
+#: gui/options.cpp:932 gui/options.cpp:942
msgid "Subtitles"
msgstr "Tekstitys"
-#: gui/options.cpp:932
+#: gui/options.cpp:933
msgid "Both"
msgstr "Molemmat"
-#: gui/options.cpp:934
+#: gui/options.cpp:935
msgid "Subtitle speed:"
msgstr "Tekstin nopeus:"
-#: gui/options.cpp:936
+#: gui/options.cpp:937
msgctxt "lowres"
msgid "Text and Speech:"
msgstr "Tekstitys ja puhe:"
-#: gui/options.cpp:940
+#: gui/options.cpp:941
msgid "Spch"
msgstr "Puhe"
-#: gui/options.cpp:941
+#: gui/options.cpp:942
msgid "Subs"
msgstr "Tekstit"
-#: gui/options.cpp:942
+#: gui/options.cpp:943
msgctxt "lowres"
msgid "Both"
msgstr "Molemmat"
-#: gui/options.cpp:942
+#: gui/options.cpp:943
msgid "Show subtitles and play speech"
msgstr "Näytä tekstitys ja käytä puhetta"
-#: gui/options.cpp:944
+#: gui/options.cpp:945
msgctxt "lowres"
msgid "Subtitle speed:"
msgstr "Tekstin nopeus:"
-#: gui/options.cpp:960
+#: gui/options.cpp:961
msgid "Music volume:"
msgstr "Musiikki:"
-#: gui/options.cpp:962
+#: gui/options.cpp:963
msgctxt "lowres"
msgid "Music volume:"
msgstr "Musiikki:"
-#: gui/options.cpp:969
+#: gui/options.cpp:970
msgid "Mute All"
msgstr "Vaimenna"
-#: gui/options.cpp:972
+#: gui/options.cpp:973
msgid "SFX volume:"
msgstr "Ääniefektit:"
-#: gui/options.cpp:972 gui/options.cpp:974 gui/options.cpp:975
+#: gui/options.cpp:973 gui/options.cpp:975 gui/options.cpp:976
msgid "Special sound effects volume"
msgstr "Erikoisefektit"
-#: gui/options.cpp:974
+#: gui/options.cpp:975
msgctxt "lowres"
msgid "SFX volume:"
msgstr "Ääniefektit:"
-#: gui/options.cpp:982
+#: gui/options.cpp:983
msgid "Speech volume:"
msgstr "Puhe:"
-#: gui/options.cpp:984
+#: gui/options.cpp:985
msgctxt "lowres"
msgid "Speech volume:"
msgstr "Puhe:"
-#: gui/options.cpp:1141
+#: gui/options.cpp:1142
msgid "Theme Path:"
msgstr "Teemojen polku:"
-#: gui/options.cpp:1143
+#: gui/options.cpp:1144
msgctxt "lowres"
msgid "Theme Path:"
msgstr "Teemojen polku:"
-#: gui/options.cpp:1149 gui/options.cpp:1151 gui/options.cpp:1152
+#: gui/options.cpp:1150 gui/options.cpp:1152 gui/options.cpp:1153
msgid "Specifies path to additional data used by all games or ScummVM"
msgstr ""
"Määrittää polun, jossa on lisätiedostoja joita ScummVM tai kaikki pelit "
"käyttävät"
-#: gui/options.cpp:1158
+#: gui/options.cpp:1159
msgid "Plugins Path:"
msgstr "Pluginien sijainti:"
-#: gui/options.cpp:1160
+#: gui/options.cpp:1161
msgctxt "lowres"
msgid "Plugins Path:"
msgstr "Pluginien sijainti:"
-#: gui/options.cpp:1169 gui/fluidsynth-dialog.cpp:137
+#: gui/options.cpp:1170 gui/fluidsynth-dialog.cpp:138
msgid "Misc"
msgstr "Muut"
-#: gui/options.cpp:1171
+#: gui/options.cpp:1172
msgctxt "lowres"
msgid "Misc"
msgstr "Muut"
-#: gui/options.cpp:1173
+#: gui/options.cpp:1174
msgid "Theme:"
msgstr "Teema"
-#: gui/options.cpp:1177
+#: gui/options.cpp:1178
msgid "GUI Renderer:"
msgstr "GUI renderöijä:"
-#: gui/options.cpp:1189
+#: gui/options.cpp:1190
msgid "Autosave:"
msgstr "Autom. tallennus:"
-#: gui/options.cpp:1191
+#: gui/options.cpp:1192
msgctxt "lowres"
msgid "Autosave:"
msgstr "Autom. tallennus:"
-#: gui/options.cpp:1199
+#: gui/options.cpp:1200
msgid "Keys"
msgstr "Näppäimet"
-#: gui/options.cpp:1206
+#: gui/options.cpp:1207
msgid "GUI Language:"
msgstr "ScummVM:n kieli:"
-#: gui/options.cpp:1206
+#: gui/options.cpp:1207
msgid "Language of ScummVM GUI"
msgstr "ScummVM käyttöliittymän kieli"
-#: gui/options.cpp:1365
+#: gui/options.cpp:1366
msgid "You have to restart ScummVM before your changes will take effect."
msgstr "ScummVM pitää käynnistää uudelleen jotta muutokset tulevat voimaan."
-#: gui/options.cpp:1378
+#: gui/options.cpp:1379
msgid "Select directory for savegames"
msgstr "Valitse hakemisto pelitallennuksille."
-#: gui/options.cpp:1385
+#: gui/options.cpp:1386
msgid "The chosen directory cannot be written to. Please select another one."
msgstr "Valittuun hakemistoon ei voi kirjoittaa. Valitse toinen hakemisto."
-#: gui/options.cpp:1394
+#: gui/options.cpp:1395
msgid "Select directory for GUI themes"
msgstr "Valitse hakemisto käyttöliittymän teemoille"
-#: gui/options.cpp:1404
+#: gui/options.cpp:1405
msgid "Select directory for extra files"
msgstr "Valitse hakemisto lisätiedostoille"
-#: gui/options.cpp:1415
+#: gui/options.cpp:1416
msgid "Select directory for plugins"
msgstr "Valitse hakemisto plugineille"
-#: gui/options.cpp:1468
+#: gui/options.cpp:1469
msgid ""
"The theme you selected does not support your current language. If you want "
"to use this theme you need to switch to another language first."
@@ -945,226 +945,229 @@ msgstr ""
"Valitsemasi teema ei tue nykyistä valitsemaasi kieltä. Vaihda kieli ensin, "
"ja yritä sitten uudelleen."
-#: gui/saveload-dialog.cpp:166
+#: gui/saveload-dialog.cpp:167
msgid "List view"
msgstr "Listanäkymä"
-#: gui/saveload-dialog.cpp:167
+#: gui/saveload-dialog.cpp:168
msgid "Grid view"
msgstr "Ruudukkonäkymä"
-#: gui/saveload-dialog.cpp:210 gui/saveload-dialog.cpp:358
+#: gui/saveload-dialog.cpp:211 gui/saveload-dialog.cpp:360
msgid "No date saved"
msgstr "Päiväystä ei ole tallennettu"
-#: gui/saveload-dialog.cpp:211 gui/saveload-dialog.cpp:359
+#: gui/saveload-dialog.cpp:212 gui/saveload-dialog.cpp:361
msgid "No time saved"
msgstr "Aikaa ei ole tallennettu"
-#: gui/saveload-dialog.cpp:212 gui/saveload-dialog.cpp:360
+#: gui/saveload-dialog.cpp:213 gui/saveload-dialog.cpp:362
msgid "No playtime saved"
msgstr "Peliaikaa ei ole tallennettu"
-#: gui/saveload-dialog.cpp:219 gui/saveload-dialog.cpp:275
+#: gui/saveload-dialog.cpp:220 gui/saveload-dialog.cpp:276
msgid "Delete"
msgstr "Poista"
-#: gui/saveload-dialog.cpp:274
+#: gui/saveload-dialog.cpp:275
msgid "Do you really want to delete this savegame?"
msgstr "Haluatko varmasti poistaa tämän pelitallennuksen?"
-#: gui/saveload-dialog.cpp:383 gui/saveload-dialog.cpp:872
+#: gui/saveload-dialog.cpp:385 gui/saveload-dialog.cpp:875
msgid "Date: "
msgstr "Päiväys: "
-#: gui/saveload-dialog.cpp:387 gui/saveload-dialog.cpp:878
+#: gui/saveload-dialog.cpp:389 gui/saveload-dialog.cpp:881
msgid "Time: "
msgstr "Aika: "
-#: gui/saveload-dialog.cpp:393 gui/saveload-dialog.cpp:886
+#: gui/saveload-dialog.cpp:395 gui/saveload-dialog.cpp:889
msgid "Playtime: "
msgstr "Peliaika: "
-#: gui/saveload-dialog.cpp:406 gui/saveload-dialog.cpp:494
+#: gui/saveload-dialog.cpp:408 gui/saveload-dialog.cpp:496
msgid "Untitled savestate"
msgstr "Nimetön pelitallennus"
-#: gui/saveload-dialog.cpp:546
+#: gui/saveload-dialog.cpp:548
msgid "Next"
msgstr "Seuraava"
-#: gui/saveload-dialog.cpp:549
+#: gui/saveload-dialog.cpp:551
msgid "Prev"
msgstr "Edellinen"
-#: gui/saveload-dialog.cpp:736
+#: gui/saveload-dialog.cpp:739
msgid "New Save"
msgstr "Uusi pelitallennus"
-#: gui/saveload-dialog.cpp:736
+#: gui/saveload-dialog.cpp:739
msgid "Create a new save game"
msgstr "Luo uusi pelitallennus"
-#: gui/saveload-dialog.cpp:865
+#: gui/saveload-dialog.cpp:868
msgid "Name: "
msgstr "Nimi: "
-#: gui/saveload-dialog.cpp:937
+#: gui/saveload-dialog.cpp:940
#, c-format
msgid "Enter a description for slot %d:"
msgstr "Anna kuvaus tallennukselle numero %d:"
-#: gui/themebrowser.cpp:44
+#: gui/themebrowser.cpp:45
msgid "Select a Theme"
msgstr "Valitse teema"
-#: gui/ThemeEngine.cpp:337
+#: gui/ThemeEngine.cpp:347
msgid "Disabled GFX"
msgstr "Disabloitu GFX"
-#: gui/ThemeEngine.cpp:337
+#: gui/ThemeEngine.cpp:347
msgctxt "lowres"
msgid "Disabled GFX"
msgstr "Disabloitu GFX"
-#: gui/ThemeEngine.cpp:338
-msgid "Standard Renderer (16bpp)"
+#: gui/ThemeEngine.cpp:348
+#, fuzzy
+msgid "Standard Renderer"
msgstr "Standardirenderöijä (16 bpp)"
-#: gui/ThemeEngine.cpp:338
-msgid "Standard (16bpp)"
-msgstr "Standardi (16 bpp)"
+#: gui/ThemeEngine.cpp:348 engines/scumm/dialogs.cpp:659
+msgid "Standard"
+msgstr "Standardi"
-#: gui/ThemeEngine.cpp:340
-msgid "Antialiased Renderer (16bpp)"
+#: gui/ThemeEngine.cpp:350
+#, fuzzy
+msgid "Antialiased Renderer"
msgstr "Antialiasoitu renderöijä (16 bpp)"
-#: gui/ThemeEngine.cpp:340
-msgid "Antialiased (16bpp)"
+#: gui/ThemeEngine.cpp:350
+#, fuzzy
+msgid "Antialiased"
msgstr "Antialiasoitu (16 bpp)"
-#: gui/widget.cpp:322 gui/widget.cpp:324 gui/widget.cpp:330 gui/widget.cpp:332
+#: gui/widget.cpp:323 gui/widget.cpp:325 gui/widget.cpp:331 gui/widget.cpp:333
msgid "Clear value"
msgstr "Tyhjennä arvo"
-#: gui/fluidsynth-dialog.cpp:67
+#: gui/fluidsynth-dialog.cpp:68
#, fuzzy
msgid "Reverb"
msgstr "Ei koskaan"
-#: gui/fluidsynth-dialog.cpp:69 gui/fluidsynth-dialog.cpp:101
+#: gui/fluidsynth-dialog.cpp:70 gui/fluidsynth-dialog.cpp:102
#, fuzzy
msgid "Active"
msgstr " (Aktiivinen)"
-#: gui/fluidsynth-dialog.cpp:71
+#: gui/fluidsynth-dialog.cpp:72
msgid "Room:"
msgstr ""
-#: gui/fluidsynth-dialog.cpp:78
+#: gui/fluidsynth-dialog.cpp:79
msgid "Damp:"
msgstr ""
-#: gui/fluidsynth-dialog.cpp:85
+#: gui/fluidsynth-dialog.cpp:86
msgid "Width:"
msgstr ""
-#: gui/fluidsynth-dialog.cpp:92 gui/fluidsynth-dialog.cpp:110
+#: gui/fluidsynth-dialog.cpp:93 gui/fluidsynth-dialog.cpp:111
msgid "Level:"
msgstr ""
-#: gui/fluidsynth-dialog.cpp:99
+#: gui/fluidsynth-dialog.cpp:100
msgid "Chorus"
msgstr ""
-#: gui/fluidsynth-dialog.cpp:103
+#: gui/fluidsynth-dialog.cpp:104
msgid "N:"
msgstr ""
-#: gui/fluidsynth-dialog.cpp:117
+#: gui/fluidsynth-dialog.cpp:118
#, fuzzy
msgid "Speed:"
msgstr "Puhe"
-#: gui/fluidsynth-dialog.cpp:124
+#: gui/fluidsynth-dialog.cpp:125
msgid "Depth:"
msgstr ""
-#: gui/fluidsynth-dialog.cpp:131
+#: gui/fluidsynth-dialog.cpp:132
msgid "Type:"
msgstr ""
-#: gui/fluidsynth-dialog.cpp:134
+#: gui/fluidsynth-dialog.cpp:135
msgid "Sine"
msgstr ""
-#: gui/fluidsynth-dialog.cpp:135
+#: gui/fluidsynth-dialog.cpp:136
msgid "Triangle"
msgstr ""
-#: gui/fluidsynth-dialog.cpp:139
+#: gui/fluidsynth-dialog.cpp:140
msgid "Interpolation:"
msgstr ""
-#: gui/fluidsynth-dialog.cpp:142
+#: gui/fluidsynth-dialog.cpp:143
msgid "None (fastest)"
msgstr ""
-#: gui/fluidsynth-dialog.cpp:143
+#: gui/fluidsynth-dialog.cpp:144
msgid "Linear"
msgstr ""
-#: gui/fluidsynth-dialog.cpp:144
+#: gui/fluidsynth-dialog.cpp:145
msgid "Fourth-order"
msgstr ""
-#: gui/fluidsynth-dialog.cpp:145
+#: gui/fluidsynth-dialog.cpp:146
msgid "Seventh-order"
msgstr ""
-#: gui/fluidsynth-dialog.cpp:149
+#: gui/fluidsynth-dialog.cpp:150
msgid "Reset"
msgstr ""
-#: gui/fluidsynth-dialog.cpp:149
+#: gui/fluidsynth-dialog.cpp:150
msgid "Reset all FluidSynth settings to their default values."
msgstr ""
-#: gui/fluidsynth-dialog.cpp:216
+#: gui/fluidsynth-dialog.cpp:217
#, fuzzy
msgid ""
"Do you really want to reset all FluidSynth settings to their default values?"
msgstr "Haluatko varmasti palata pelivalitsimeen?"
-#: base/main.cpp:210
+#: base/main.cpp:228
#, c-format
msgid "Engine does not support debug level '%s'"
msgstr "Pelimoottori ei tue debug tasoa '%s'"
-#: base/main.cpp:288
+#: base/main.cpp:306
msgid "Menu"
msgstr "Valikko"
-#: base/main.cpp:291 backends/platform/symbian/src/SymbianActions.cpp:45
+#: base/main.cpp:309 backends/platform/symbian/src/SymbianActions.cpp:45
#: backends/platform/wince/CEActionsPocket.cpp:45
#: backends/platform/wince/CEActionsSmartphone.cpp:46
msgid "Skip"
msgstr "Ohita"
-#: base/main.cpp:294 backends/platform/symbian/src/SymbianActions.cpp:50
+#: base/main.cpp:312 backends/platform/symbian/src/SymbianActions.cpp:50
#: backends/platform/wince/CEActionsPocket.cpp:42
msgid "Pause"
msgstr "Tauko"
-#: base/main.cpp:297
+#: base/main.cpp:315
msgid "Skip line"
msgstr "Ohita rivi"
-#: base/main.cpp:468
+#: base/main.cpp:507
msgid "Error running game:"
msgstr "Virhe ajettaessa peliä:"
-#: base/main.cpp:492
+#: base/main.cpp:536
msgid "Could not find any engine capable of running the selected game"
msgstr "Pelimoottoria joka tukisi valittua peliä ei löytynyt"
@@ -1232,74 +1235,74 @@ msgstr "Käyttäjä peruutti"
msgid "Unknown error"
msgstr "Tuntematon virhe"
-#: engines/advancedDetector.cpp:316
+#: engines/advancedDetector.cpp:317
#, c-format
msgid "The game in '%s' seems to be unknown."
msgstr "Peli hakemistossa '%s' näyttäisi olevan tuntematon."
-#: engines/advancedDetector.cpp:317
+#: engines/advancedDetector.cpp:318
msgid "Please, report the following data to the ScummVM team along with name"
msgstr ""
"Ole hyvä ja ilmoita ScummVM:n kehittäjille seuraavat tiedot, lisäksi kerro"
-#: engines/advancedDetector.cpp:319
+#: engines/advancedDetector.cpp:320
msgid "of the game you tried to add and its version/language/etc.:"
msgstr ""
"mikä peli oli kyseessä, ja sen versio, kieli, ja muut vastaavat tiedot."
-#: engines/dialogs.cpp:84
+#: engines/dialogs.cpp:85
msgid "~R~esume"
msgstr "~J~atka"
-#: engines/dialogs.cpp:86
+#: engines/dialogs.cpp:87
msgid "~L~oad"
msgstr "~L~ataa"
-#: engines/dialogs.cpp:90
+#: engines/dialogs.cpp:91
msgid "~S~ave"
msgstr "~T~allenna"
-#: engines/dialogs.cpp:94
+#: engines/dialogs.cpp:95
msgid "~O~ptions"
msgstr "~A~setukset"
-#: engines/dialogs.cpp:99
+#: engines/dialogs.cpp:100
msgid "~H~elp"
msgstr "~O~hje"
-#: engines/dialogs.cpp:101
+#: engines/dialogs.cpp:102
msgid "~A~bout"
msgstr "~T~ietoa"
-#: engines/dialogs.cpp:104 engines/dialogs.cpp:180
+#: engines/dialogs.cpp:105 engines/dialogs.cpp:181
msgid "~R~eturn to Launcher"
msgstr "Palaa p~e~livalitsimeen"
-#: engines/dialogs.cpp:106 engines/dialogs.cpp:182
+#: engines/dialogs.cpp:107 engines/dialogs.cpp:183
msgctxt "lowres"
msgid "~R~eturn to Launcher"
msgstr "Palaa p~e~livalitsimeen"
-#: engines/dialogs.cpp:115 engines/agi/saveload.cpp:803
-#: engines/drascula/saveload.cpp:338 engines/cruise/menu.cpp:212
-#: engines/sci/engine/kfile.cpp:742 engines/toltecs/menu.cpp:284
-#: engines/pegasus/pegasus.cpp:373
+#: engines/dialogs.cpp:116 engines/agi/saveload.cpp:803
+#: engines/cruise/menu.cpp:212 engines/drascula/saveload.cpp:336
+#: engines/neverhood/menumodule.cpp:873 engines/pegasus/pegasus.cpp:377
+#: engines/sci/engine/kfile.cpp:758 engines/toltecs/menu.cpp:281
msgid "Save game:"
msgstr "Tallenna peli:"
-#: engines/dialogs.cpp:115 engines/agi/saveload.cpp:803
-#: engines/drascula/saveload.cpp:338 engines/scumm/dialogs.cpp:187
-#: engines/cruise/menu.cpp:212 engines/sci/engine/kfile.cpp:742
-#: engines/toltecs/menu.cpp:284 engines/pegasus/pegasus.cpp:373
-#: backends/platform/symbian/src/SymbianActions.cpp:44
+#: engines/dialogs.cpp:116 backends/platform/symbian/src/SymbianActions.cpp:44
#: backends/platform/wince/CEActionsPocket.cpp:43
#: backends/platform/wince/CEActionsPocket.cpp:267
#: backends/platform/wince/CEActionsSmartphone.cpp:45
#: backends/platform/wince/CEActionsSmartphone.cpp:231
+#: engines/agi/saveload.cpp:803 engines/cruise/menu.cpp:212
+#: engines/drascula/saveload.cpp:336 engines/neverhood/menumodule.cpp:873
+#: engines/pegasus/pegasus.cpp:377 engines/sci/engine/kfile.cpp:758
+#: engines/scumm/dialogs.cpp:188 engines/toltecs/menu.cpp:281
msgid "Save"
msgstr "Tallenna"
-#: engines/dialogs.cpp:144
+#: engines/dialogs.cpp:145
msgid ""
"Sorry, this engine does not currently provide in-game help. Please consult "
"the README for basic information, and for instructions on how to obtain "
@@ -1308,7 +1311,7 @@ msgstr ""
"Tämä pelimoottori ei toistaiseksi tue pelin sisäistä ohjetta. Avaa LUEMINUT "
"tiedosto saadaksesi lisätietoa."
-#: engines/dialogs.cpp:228
+#: engines/dialogs.cpp:234 engines/pegasus/pegasus.cpp:393
#, c-format
msgid ""
"Gamestate save failed (%s)! Please consult the README for basic information, "
@@ -1317,37 +1320,37 @@ msgstr ""
"Pelitilan tallennus epäonnistui (%s)! Avaa LUEMINUT tiedosto saadaksesi "
"lisätietoa."
-#: engines/dialogs.cpp:301 engines/mohawk/dialogs.cpp:109
+#: engines/dialogs.cpp:307 engines/mohawk/dialogs.cpp:109
#: engines/mohawk/dialogs.cpp:170
msgid "~O~K"
msgstr "~H~yväksy"
-#: engines/dialogs.cpp:302 engines/mohawk/dialogs.cpp:110
+#: engines/dialogs.cpp:308 engines/mohawk/dialogs.cpp:110
#: engines/mohawk/dialogs.cpp:171
msgid "~C~ancel"
msgstr "~P~eruuta"
-#: engines/dialogs.cpp:305
+#: engines/dialogs.cpp:311
msgid "~K~eys"
msgstr "~N~äppäimet"
-#: engines/engine.cpp:240
+#: engines/engine.cpp:245
msgid "Could not initialize color format."
msgstr "Väriformaattia ei voitu alustaa"
-#: engines/engine.cpp:248
+#: engines/engine.cpp:253
msgid "Could not switch to video mode: '"
msgstr "Videotilan vaihto ei onnistunut:'"
-#: engines/engine.cpp:257
+#: engines/engine.cpp:262
msgid "Could not apply aspect ratio setting."
msgstr "Kuvasuhdeasetusta ei voitu asettaa."
-#: engines/engine.cpp:262
+#: engines/engine.cpp:267
msgid "Could not apply fullscreen setting."
msgstr "Kokoruututila-asetusta ei voi asettaa."
-#: engines/engine.cpp:362
+#: engines/engine.cpp:367
msgid ""
"You appear to be playing this game directly\n"
"from the CD. This is known to cause problems,\n"
@@ -1360,7 +1363,7 @@ msgstr ""
"pelin tiedostot kovalevyllesi. Avaa LUEMINUT\n"
"tiedosto ohjeita varten."
-#: engines/engine.cpp:373
+#: engines/engine.cpp:378
msgid ""
"This game has audio tracks in its disk. These\n"
"tracks need to be ripped from the disk using\n"
@@ -1373,7 +1376,7 @@ msgstr ""
"ohjelmistoa käyttäen, jotta musiikit\n"
"kuuluvat. Lue ohjeet LUEMINUT tiedostosta."
-#: engines/engine.cpp:431
+#: engines/engine.cpp:436
#, c-format
msgid ""
"Gamestate load failed (%s)! Please consult the README for basic information, "
@@ -1382,7 +1385,7 @@ msgstr ""
"Pelitilan lataus epäonnistui (%s)! Avaa LUEMINUT tiedosto saadaksesi "
"lisätietoa."
-#: engines/engine.cpp:444
+#: engines/engine.cpp:449
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 "
@@ -1392,33 +1395,765 @@ msgstr ""
"epävakaa, eivätkä pelitallennukset välttämättä toimi tulevissa ScummVM:n "
"versioissa."
-#: engines/engine.cpp:447
+#: engines/engine.cpp:452
msgid "Start anyway"
msgstr "Pelaa silti"
-#: engines/agi/detection.cpp:142 engines/drascula/detection.cpp:270
-#: engines/dreamweb/detection.cpp:47 engines/sci/detection.cpp:393
-#: engines/toltecs/detection.cpp:173
+#: audio/fmopl.cpp:50
+msgid "MAME OPL emulator"
+msgstr "MAME OPL emulaattori"
+
+#: audio/fmopl.cpp:52
+msgid "DOSBox OPL emulator"
+msgstr "DOSBox OPL emulaattori"
+
+#: audio/mididrv.cpp:209
+#, c-format
+msgid ""
+"The selected audio device '%s' was not found (e.g. might be turned off or "
+"disconnected)."
+msgstr ""
+"Valittua äänilaitetta '%s' ei löytynyt. Se saattaa olla kytketty pois päältä "
+"tai irrotettuna tietokoneesta."
+
+#: audio/mididrv.cpp:209 audio/mididrv.cpp:221 audio/mididrv.cpp:257
+#: audio/mididrv.cpp:272
+msgid "Attempting to fall back to the next available device..."
+msgstr "Yritetään käyttää seuraavaa saatavilla olevaa laitetta..."
+
+#: audio/mididrv.cpp:221
+#, c-format
+msgid ""
+"The selected audio device '%s' cannot be used. See log file for more "
+"information."
+msgstr ""
+"Valitsemaasi äänilaitetta '%s' ei voida käyttää. Avaa lokitiedosto "
+"saadaksesi lisätietoja."
+
+#: audio/mididrv.cpp:257
+#, c-format
+msgid ""
+"The preferred audio device '%s' was not found (e.g. might be turned off or "
+"disconnected)."
+msgstr ""
+"Ensisijaista äänilaitetta '%s' ei löytynyt. Se saattaa olla kytketty pois "
+"päältä tai irrotettuna tietokoneesta."
+
+#: audio/mididrv.cpp:272
+#, c-format
+msgid ""
+"The preferred audio device '%s' cannot be used. See log file for more "
+"information."
+msgstr ""
+"Ensisijaista äänilaitetta '%s' ei voida käyttää. Avaa lokitiedosto "
+"saadaksesi lisätietoja."
+
+#: audio/null.h:44
+msgid "No music"
+msgstr "Ei musiikkia"
+
+#: audio/mods/paula.cpp:196
+msgid "Amiga Audio Emulator"
+msgstr "Amiga Audio emulaattori"
+
+#: audio/softsynth/adlib.cpp:2285
+msgid "AdLib Emulator"
+msgstr "AdLib emulaattori"
+
+#: audio/softsynth/appleiigs.cpp:33
+msgid "Apple II GS Emulator (NOT IMPLEMENTED)"
+msgstr "Apple II GS emulaattori (EI TOTEUTETTU)"
+
+#: audio/softsynth/sid.cpp:1430
+msgid "C64 Audio Emulator"
+msgstr "C64 Audio emulaattori"
+
+#: audio/softsynth/mt32.cpp:200
+msgid "Initializing MT-32 Emulator"
+msgstr "Alustetaan MT-32 emulaattoria"
+
+#: audio/softsynth/mt32.cpp:426
+msgid "MT-32 Emulator"
+msgstr "MT-32 emulaattori"
+
+#: audio/softsynth/pcspk.cpp:139
+msgid "PC Speaker Emulator"
+msgstr "PC kaiuttimen emulaattori"
+
+#: audio/softsynth/pcspk.cpp:158
+msgid "IBM PCjr Emulator"
+msgstr "IBM PCjr emulaattori"
+
+#: backends/keymapper/remap-dialog.cpp:48
+msgid "Keymap:"
+msgstr "Näppäinkartta:"
+
+#: backends/keymapper/remap-dialog.cpp:67
+msgid " (Effective)"
+msgstr ""
+
+#: backends/keymapper/remap-dialog.cpp:107
+msgid " (Active)"
+msgstr " (Aktiivinen)"
+
+#: backends/keymapper/remap-dialog.cpp:107
+msgid " (Blocked)"
+msgstr " (Estetty)"
+
+#: backends/keymapper/remap-dialog.cpp:120
+msgid " (Global)"
+msgstr " (Globaali)"
+
+#: backends/keymapper/remap-dialog.cpp:128
+msgid " (Game)"
+msgstr " (Peli)"
+
+#: backends/midi/windows.cpp:165
+msgid "Windows MIDI"
+msgstr "Windows MIDI"
+
+#: backends/platform/ds/arm9/source/dsoptions.cpp:56
+#: engines/scumm/dialogs.cpp:291
+msgid "~C~lose"
+msgstr "~S~ulje"
+
+#: backends/platform/ds/arm9/source/dsoptions.cpp:57
+msgid "ScummVM Main Menu"
+msgstr "ScummVM päävalikko"
+
+#: backends/platform/ds/arm9/source/dsoptions.cpp:63
+msgid "~L~eft handed mode"
+msgstr "~V~asenkätinen tila"
+
+#: backends/platform/ds/arm9/source/dsoptions.cpp:64
+msgid "~I~ndy fight controls"
+msgstr "~I~ndyn tappelukontrollit"
+
+#: backends/platform/ds/arm9/source/dsoptions.cpp:65
+msgid "Show mouse cursor"
+msgstr "Näytä hiiren kursori"
+
+#: backends/platform/ds/arm9/source/dsoptions.cpp:66
+msgid "Snap to edges"
+msgstr "Tartu reunoihin"
+
+#: backends/platform/ds/arm9/source/dsoptions.cpp:68
+msgid "Touch X Offset"
+msgstr "Kosketuksen X siirros"
+
+#: backends/platform/ds/arm9/source/dsoptions.cpp:75
+msgid "Touch Y Offset"
+msgstr "Kosketuksen Y siirto"
+
+#: backends/platform/ds/arm9/source/dsoptions.cpp:87
+msgid "Use laptop trackpad-style cursor control"
+msgstr "Käytä kannettavan trackpad-tyylistä kursorinhallintaa"
+
+#: backends/platform/ds/arm9/source/dsoptions.cpp:88
+msgid "Tap for left click, double tap right click"
+msgstr ""
+"Napauta kerran vasen klikkausta varten, napauta kahdesti oikeaa klikkausta "
+"varten"
+
+#: backends/platform/ds/arm9/source/dsoptions.cpp:90
+msgid "Sensitivity"
+msgstr "Herkkyys"
+
+#: backends/platform/ds/arm9/source/dsoptions.cpp:99
+msgid "Initial top screen scale:"
+msgstr ""
+
+#: backends/platform/ds/arm9/source/dsoptions.cpp:105
+msgid "Main screen scaling:"
+msgstr "Pääruudun skaalaus"
+
+#: backends/platform/ds/arm9/source/dsoptions.cpp:107
+msgid "Hardware scale (fast, but low quality)"
+msgstr "Laitteistoskaalaus (nopea, mutta huono laatu)"
+
+#: backends/platform/ds/arm9/source/dsoptions.cpp:108
+msgid "Software scale (good quality, but slower)"
+msgstr "Ohjelmistoskaalaus (hyvä laatu, mutta hitaampi)"
+
+#: backends/platform/ds/arm9/source/dsoptions.cpp:109
+msgid "Unscaled (you must scroll left and right)"
+msgstr "Ei skaalattu (vierittä vasemmalle ja oikealle itse)"
+
+#: backends/platform/ds/arm9/source/dsoptions.cpp:111
+msgid "Brightness:"
+msgstr "Kirkkaus:"
+
+#: backends/platform/ds/arm9/source/dsoptions.cpp:121
+msgid "High quality audio (slower) (reboot)"
+msgstr "Korkealuokkainen ääni (hidas) (buuttaus)"
+
+#: backends/platform/ds/arm9/source/dsoptions.cpp:122
+msgid "Disable power off"
+msgstr ""
+
+#: backends/platform/iphone/osys_events.cpp:300
+msgid "Mouse-click-and-drag mode enabled."
+msgstr "Hiiren vedä-ja-pudota tila käytössä."
+
+#: backends/platform/iphone/osys_events.cpp:302
+msgid "Mouse-click-and-drag mode disabled."
+msgstr "Hiiren vedä-ja-pudota tila pois käytöstä."
+
+#: backends/platform/iphone/osys_events.cpp:313
+msgid "Touchpad mode enabled."
+msgstr "Touchad tila päällä"
+
+#: backends/platform/iphone/osys_events.cpp:315
+msgid "Touchpad mode disabled."
+msgstr "Touchpad tila pois päältä"
+
+#: backends/platform/maemo/maemo.cpp:209
+msgid "Click Mode"
+msgstr "Klikkaus moodi"
+
+#: backends/platform/maemo/maemo.cpp:215
+#: backends/platform/symbian/src/SymbianActions.cpp:42
+#: backends/platform/wince/CEActionsPocket.cpp:60
+#: backends/platform/wince/CEActionsSmartphone.cpp:43
+#: backends/platform/tizen/form.cpp:275
+msgid "Left Click"
+msgstr "Vasen klikkaus"
+
+#: backends/platform/maemo/maemo.cpp:218
+msgid "Middle Click"
+msgstr "Keskiklikkaus"
+
+#: backends/platform/maemo/maemo.cpp:221
+#: backends/platform/symbian/src/SymbianActions.cpp:43
+#: backends/platform/wince/CEActionsSmartphone.cpp:44
+#: backends/platform/tizen/form.cpp:267
+msgid "Right Click"
+msgstr "Oikea klikkaus"
+
+#: backends/platform/sdl/macosx/appmenu_osx.mm:77
+msgid "Hide ScummVM"
+msgstr "Piilota ScummVM"
+
+#: backends/platform/sdl/macosx/appmenu_osx.mm:82
+msgid "Hide Others"
+msgstr "Piilota muut"
+
+#: backends/platform/sdl/macosx/appmenu_osx.mm:87
+msgid "Show All"
+msgstr "Näytä kaikki"
+
+#: backends/platform/sdl/macosx/appmenu_osx.mm:109
+#: backends/platform/sdl/macosx/appmenu_osx.mm:120
+msgid "Window"
+msgstr "Ikkuna"
+
+#: backends/platform/sdl/macosx/appmenu_osx.mm:114
+msgid "Minimize"
+msgstr "Minimoi"
+
+#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:46
+msgid "Normal (no scaling)"
+msgstr "Normaali (ei skaalausta)"
+
+#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:65
+msgctxt "lowres"
+msgid "Normal (no scaling)"
+msgstr "Normaali (ei skaalausta)"
+
+#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2148
+msgid "Enabled aspect ratio correction"
+msgstr "Kuvasuhteen korjaus päällä"
+
+#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2154
+msgid "Disabled aspect ratio correction"
+msgstr "Kuvasuhteen korjaus pois päältä"
+
+#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2209
+msgid "Active graphics filter:"
+msgstr "Valittu grafiikkafiltteri:"
+
+#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2251
+msgid "Windowed mode"
+msgstr "Ikkunoitu tila"
+
+#: backends/graphics/opengl/opengl-graphics.cpp:118
+#, fuzzy
+msgid "OpenGL"
+msgstr "Avaa"
+
+#: backends/graphics/opengl/opengl-graphics.cpp:119
+msgid "OpenGL (No filtering)"
+msgstr ""
+
+#: backends/platform/symbian/src/SymbianActions.cpp:38
+#: backends/platform/wince/CEActionsSmartphone.cpp:39
+msgid "Up"
+msgstr "Ylös"
+
+#: backends/platform/symbian/src/SymbianActions.cpp:39
+#: backends/platform/wince/CEActionsSmartphone.cpp:40
+msgid "Down"
+msgstr "Alas"
+
+#: backends/platform/symbian/src/SymbianActions.cpp:40
+#: backends/platform/wince/CEActionsSmartphone.cpp:41
+msgid "Left"
+msgstr "Vasen"
+
+#: backends/platform/symbian/src/SymbianActions.cpp:41
+#: backends/platform/wince/CEActionsSmartphone.cpp:42
+msgid "Right"
+msgstr "Oikea"
+
+#: backends/platform/symbian/src/SymbianActions.cpp:46
+#: backends/platform/wince/CEActionsSmartphone.cpp:47
+msgid "Zone"
+msgstr ""
+
+#: backends/platform/symbian/src/SymbianActions.cpp:47
+#: backends/platform/wince/CEActionsPocket.cpp:54
+#: backends/platform/wince/CEActionsSmartphone.cpp:48
+msgid "Multi Function"
+msgstr ""
+
+#: backends/platform/symbian/src/SymbianActions.cpp:48
+msgid "Swap character"
+msgstr "Vaihda hahmoa"
+
+#: backends/platform/symbian/src/SymbianActions.cpp:49
+msgid "Skip text"
+msgstr "Ohita teksti"
+
+#: backends/platform/symbian/src/SymbianActions.cpp:51
+msgid "Fast mode"
+msgstr "Nopea moodi"
+
+#: 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:218
+#: engines/scumm/dialogs.cpp:192 engines/scumm/help.cpp:82
+#: engines/scumm/help.cpp:84
+msgid "Quit"
+msgstr "Lopeta"
+
+#: backends/platform/symbian/src/SymbianActions.cpp:53
+msgid "Debugger"
+msgstr "Debuggeri"
+
+#: backends/platform/symbian/src/SymbianActions.cpp:54
+msgid "Global menu"
+msgstr "Päävalikko"
+
+#: backends/platform/symbian/src/SymbianActions.cpp:55
+msgid "Virtual keyboard"
+msgstr "Virtuaalinen näppäimistö"
+
+#: backends/platform/symbian/src/SymbianActions.cpp:56
+msgid "Key mapper"
+msgstr "Näppäinmäärittelijä"
+
+#: backends/events/symbiansdl/symbiansdl-events.cpp:184
+msgid "Do you want to quit ?"
+msgstr "Haluatko lopettaa?"
+
+#: backends/platform/wii/options.cpp:51
+msgid "Video"
+msgstr "Video"
+
+#: backends/platform/wii/options.cpp:54
+msgid "Current video mode:"
+msgstr "Nykyinen videotila:"
+
+#: backends/platform/wii/options.cpp:56
+msgid "Double-strike"
+msgstr ""
+
+#: backends/platform/wii/options.cpp:60
+msgid "Horizontal underscan:"
+msgstr "Horisontaalinenunderscan"
+
+#: backends/platform/wii/options.cpp:66
+msgid "Vertical underscan:"
+msgstr "Vertikaalinen underscan"
+
+#: backends/platform/wii/options.cpp:71
+msgid "Input"
+msgstr "Syöte"
+
+#: backends/platform/wii/options.cpp:74
+msgid "GC Pad sensitivity:"
+msgstr "GC Padin herkkyys"
+
+#: backends/platform/wii/options.cpp:80
+msgid "GC Pad acceleration:"
+msgstr "GC PAdin kiihtyvyys"
+
+#: backends/platform/wii/options.cpp:86
+msgid "DVD"
+msgstr "DVD"
+
+#: backends/platform/wii/options.cpp:89 backends/platform/wii/options.cpp:101
+msgid "Status:"
+msgstr "Tila:"
+
+#: backends/platform/wii/options.cpp:90 backends/platform/wii/options.cpp:102
+msgid "Unknown"
+msgstr "Tuntematon"
+
+#: backends/platform/wii/options.cpp:93
+msgid "Mount DVD"
+msgstr "Liitä DVD"
+
+#: backends/platform/wii/options.cpp:94
+msgid "Unmount DVD"
+msgstr "Vapauta DVD"
+
+#: backends/platform/wii/options.cpp:98
+msgid "SMB"
+msgstr "SMB"
+
+#: backends/platform/wii/options.cpp:106
+msgid "Server:"
+msgstr "Palvelin:"
+
+#: backends/platform/wii/options.cpp:110
+msgid "Share:"
+msgstr "Jako:"
+
+#: backends/platform/wii/options.cpp:114
+msgid "Username:"
+msgstr "Käyttäjänimi:"
+
+#: backends/platform/wii/options.cpp:118
+msgid "Password:"
+msgstr "Salasana:"
+
+#: backends/platform/wii/options.cpp:121
+msgid "Init network"
+msgstr "Alusta verkko"
+
+#: backends/platform/wii/options.cpp:123
+msgid "Mount SMB"
+msgstr "Mounttaa SMB"
+
+#: backends/platform/wii/options.cpp:124
+msgid "Unmount SMB"
+msgstr "Vapauta SMB"
+
+#: backends/platform/wii/options.cpp:143
+msgid "DVD Mounted successfully"
+msgstr "DVD mountattu onnistuneesti"
+
+#: backends/platform/wii/options.cpp:146
+msgid "Error while mounting the DVD"
+msgstr "Virhe liitettäessä DVD:tä"
+
+#: backends/platform/wii/options.cpp:148
+msgid "DVD not mounted"
+msgstr "DVD ei ole liitetty"
+
+#: backends/platform/wii/options.cpp:161
+msgid "Network up, share mounted"
+msgstr "Verkko ylhäällä, jako liitetty"
+
+#: backends/platform/wii/options.cpp:163
+msgid "Network up"
+msgstr "Verkko ylhäällä"
+
+#: backends/platform/wii/options.cpp:166
+msgid ", error while mounting the share"
+msgstr ", virhe liitettäessä jakoa"
+
+#: backends/platform/wii/options.cpp:168
+msgid ", share not mounted"
+msgstr ", jakoa ei liitetty"
+
+#: backends/platform/wii/options.cpp:174
+msgid "Network down"
+msgstr "Verkko alhaalla"
+
+#: backends/platform/wii/options.cpp:178
+msgid "Initializing network"
+msgstr "Alustetaan verkkoa"
+
+#: backends/platform/wii/options.cpp:182
+msgid "Timeout while initializing network"
+msgstr "Aikakatkaisu kun verkkoa alustettiin"
+
+#: backends/platform/wii/options.cpp:186
+#, c-format
+msgid "Network not initialized (%d)"
+msgstr "Verkko ei ole alustettu (%d)"
+
+#: backends/platform/wince/CEActionsPocket.cpp:46
+msgid "Hide Toolbar"
+msgstr "Piilota työkalupalkki"
+
+#: backends/platform/wince/CEActionsPocket.cpp:47
+msgid "Show Keyboard"
+msgstr "Näytä näppäimistö"
+
+#: backends/platform/wince/CEActionsPocket.cpp:48
+msgid "Sound on/off"
+msgstr "Äänet päällä/pois"
+
+#: backends/platform/wince/CEActionsPocket.cpp:49
+msgid "Right click"
+msgstr "Oikea klikkaus"
+
+#: backends/platform/wince/CEActionsPocket.cpp:50
+msgid "Show/Hide Cursor"
+msgstr "Näytä/Piilota kursori"
+
+#: backends/platform/wince/CEActionsPocket.cpp:51
+msgid "Free look"
+msgstr "Vapaa katselu"
+
+#: backends/platform/wince/CEActionsPocket.cpp:52
+msgid "Zoom up"
+msgstr "Zoomaa ylös"
+
+#: backends/platform/wince/CEActionsPocket.cpp:53
+msgid "Zoom down"
+msgstr "Zoomaa alas"
+
+#: backends/platform/wince/CEActionsPocket.cpp:55
+#: backends/platform/wince/CEActionsSmartphone.cpp:49
+msgid "Bind Keys"
+msgstr "Määritä näppäimet"
+
+#: backends/platform/wince/CEActionsPocket.cpp:56
+msgid "Cursor Up"
+msgstr "Nuoli ylös"
+
+#: backends/platform/wince/CEActionsPocket.cpp:57
+msgid "Cursor Down"
+msgstr "Nuoli alas"
+
+#: backends/platform/wince/CEActionsPocket.cpp:58
+msgid "Cursor Left"
+msgstr "Nuoli vasemmalle"
+
+#: backends/platform/wince/CEActionsPocket.cpp:59
+msgid "Cursor Right"
+msgstr "Nuoli oikealle"
+
+#: backends/platform/wince/CEActionsPocket.cpp:267
+#: backends/platform/wince/CEActionsSmartphone.cpp:231
+msgid "Do you want to load or save the game?"
+msgstr "Haluatko tallentaa vai ladata pelin?"
+
+#: backends/platform/wince/CEActionsPocket.cpp:326
+#: backends/platform/wince/CEActionsSmartphone.cpp:287
+msgid " Are you sure you want to quit ? "
+msgstr " Haluatko varmasti lopettaa?"
+
+#: backends/platform/wince/CEActionsSmartphone.cpp:50
+msgid "Keyboard"
+msgstr "Näppäimistö"
+
+#: backends/platform/wince/CEActionsSmartphone.cpp:51
+msgid "Rotate"
+msgstr "Käännä"
+
+#: backends/platform/wince/CELauncherDialog.cpp:56
+msgid "Using SDL driver "
+msgstr "Käytetään SDL:n ajuria"
+
+#: backends/platform/wince/CELauncherDialog.cpp:60
+msgid "Display "
+msgstr "Näyttö"
+
+#: backends/platform/wince/CELauncherDialog.cpp:83
+msgid "Do you want to perform an automatic scan ?"
+msgstr "Haluatko suorittaa automaattisen skannauksen?"
+
+#: backends/platform/wince/wince-sdl.cpp:516
+msgid "Map right click action"
+msgstr "Määritä oikeaklikkauksen toiminto"
+
+#: backends/platform/wince/wince-sdl.cpp:520
+msgid "You must map a key to the 'Right Click' action to play this game"
+msgstr ""
+"Hiiren oikealle klikkaukselle on määriteltävä näppäin, ennen kuin tätä peliä "
+"voi pelata"
+
+#: backends/platform/wince/wince-sdl.cpp:529
+msgid "Map hide toolbar action"
+msgstr "Määritä näppäin työkalupalkin piilottamiselle"
+
+#: backends/platform/wince/wince-sdl.cpp:533
+msgid "You must map a key to the 'Hide toolbar' action to play this game"
+msgstr ""
+"Työkalupalkin piilottamiselle on määriteltävä näppäin, ennen kuin tätä peliä "
+"voi pelata"
+
+#: backends/platform/wince/wince-sdl.cpp:542
+msgid "Map Zoom Up action (optional)"
+msgstr "Zoomaa karttaa ylös (valinnainen)"
+
+#: backends/platform/wince/wince-sdl.cpp:545
+msgid "Map Zoom Down action (optional)"
+msgstr "Zoomaa karttaa alas (valinnainen)"
+
+#: backends/platform/wince/wince-sdl.cpp:553
+msgid ""
+"Don't forget to map a key to 'Hide Toolbar' action to see the whole inventory"
+msgstr ""
+"Muista määritellä näppäin työkalupalkin piilottamiselle, jotta voit nähdä "
+"koko tavaraluettelon"
+
+#: backends/events/default/default-events.cpp:196
+msgid "Do you really want to return to the Launcher?"
+msgstr "Haluatko varmasti palata pelivalitsimeen?"
+
+#: backends/events/default/default-events.cpp:196
+msgid "Launcher"
+msgstr "Pelivalitsin"
+
+#: backends/events/default/default-events.cpp:218
+msgid "Do you really want to quit?"
+msgstr "Haluatko varmasti lopettaa?"
+
+#: backends/events/gph/gph-events.cpp:386
+#: backends/events/gph/gph-events.cpp:429
+#: backends/events/openpandora/op-events.cpp:168
+msgid "Touchscreen 'Tap Mode' - Left Click"
+msgstr "Kosketusnäytön 'Tap moodi' - vasen klikkaus"
+
+#: backends/events/gph/gph-events.cpp:388
+#: backends/events/gph/gph-events.cpp:431
+#: backends/events/openpandora/op-events.cpp:170
+msgid "Touchscreen 'Tap Mode' - Right Click"
+msgstr "Kosketusnäytön 'Tap moodi' - oikea klikkaus"
+
+#: backends/events/gph/gph-events.cpp:390
+#: backends/events/gph/gph-events.cpp:433
+#: backends/events/openpandora/op-events.cpp:172
+msgid "Touchscreen 'Tap Mode' - Hover (No Click)"
+msgstr "Kosketusnäytön 'Tap moodi' - ei klikkausta"
+
+#: backends/events/gph/gph-events.cpp:410
+msgid "Maximum Volume"
+msgstr "Maksimi äänenvoimakkuus"
+
+#: backends/events/gph/gph-events.cpp:412
+msgid "Increasing Volume"
+msgstr "Nostetaan äänenvoimakkuutta"
+
+#: backends/events/gph/gph-events.cpp:418
+msgid "Minimal Volume"
+msgstr "Minimi äänenvoimakkuus"
+
+#: backends/events/gph/gph-events.cpp:420
+msgid "Decreasing Volume"
+msgstr "Lasketaan äänenvoimakkuutta"
+
+#: backends/events/openpandora/op-events.cpp:174
+#, fuzzy
+msgid "Touchscreen 'Tap Mode' - Hover (DPad Clicks)"
+msgstr "Kosketusnäytön 'Tap moodi' - ei klikkausta"
+
+#: backends/updates/macosx/macosx-updates.mm:67
+msgid "Check for Updates..."
+msgstr "Tarkista päivitykset..."
+
+#: backends/platform/tizen/form.cpp:263
+msgid "Right Click Once"
+msgstr "Klikkaa oikealla kerran"
+
+#: backends/platform/tizen/form.cpp:271
+msgid "Move Only"
+msgstr ""
+
+#: backends/platform/tizen/form.cpp:294
+msgid "Escape Key"
+msgstr "Esc näppäin"
+
+#: backends/platform/tizen/form.cpp:299
+msgid "Game Menu"
+msgstr "Pelivalikko"
+
+#: backends/platform/tizen/form.cpp:304
+msgid "Show Keypad"
+msgstr "Näytä keypad"
+
+#: backends/platform/tizen/form.cpp:309
+msgid "Control Mouse"
+msgstr "Ohjaa hiirtä"
+
+#: backends/events/maemosdl/maemosdl-events.cpp:192
+msgid "Clicking Enabled"
+msgstr "Klikkaus päällä"
+
+#: backends/events/maemosdl/maemosdl-events.cpp:192
+msgid "Clicking Disabled"
+msgstr "Klikkaus pois päältä"
+
+#: engines/agi/detection.cpp:142 engines/drascula/detection.cpp:302
+#: engines/dreamweb/detection.cpp:47 engines/neverhood/detection.cpp:160
+#: engines/sci/detection.cpp:394 engines/toltecs/detection.cpp:186
msgid "Use original save/load screens"
msgstr "Käytä alkuperäisiä tallenna/lataa valikkoja"
-#: engines/agi/detection.cpp:143 engines/drascula/detection.cpp:271
-#: engines/dreamweb/detection.cpp:48 engines/sci/detection.cpp:394
-#: engines/toltecs/detection.cpp:174
+#: engines/agi/detection.cpp:143 engines/drascula/detection.cpp:303
+#: engines/dreamweb/detection.cpp:48 engines/neverhood/detection.cpp:161
+#: engines/sci/detection.cpp:395 engines/toltecs/detection.cpp:187
msgid "Use the original save/load screens, instead of the ScummVM ones"
msgstr "Käytä alkuperäisiä tallenna/lataa valikkoja, ScummVM valikoiden sijaan"
-#: engines/agi/saveload.cpp:816 engines/drascula/saveload.cpp:351
-#: engines/sci/engine/kfile.cpp:841 engines/toltecs/menu.cpp:259
+#: engines/agi/saveload.cpp:816 engines/drascula/saveload.cpp:349
+#: engines/neverhood/menumodule.cpp:886 engines/sci/engine/kfile.cpp:857
+#: engines/toltecs/menu.cpp:256
msgid "Restore game:"
msgstr "Lataa pelitallenne:"
-#: engines/agi/saveload.cpp:816 engines/drascula/saveload.cpp:351
-#: engines/sci/engine/kfile.cpp:841 engines/toltecs/menu.cpp:259
+#: engines/agi/saveload.cpp:816 engines/drascula/saveload.cpp:349
+#: engines/neverhood/menumodule.cpp:886 engines/sci/engine/kfile.cpp:857
+#: engines/toltecs/menu.cpp:256
msgid "Restore"
msgstr "Lataa tallenne"
-#: engines/drascula/saveload.cpp:49
+#: engines/agos/saveload.cpp:160 engines/scumm/scumm.cpp:2321
+#, c-format
+msgid ""
+"Failed to load game state from file:\n"
+"\n"
+"%s"
+msgstr ""
+"Pelitilan lataus ei onnistunut tiedostosta:\n"
+"\n"
+"%s"
+
+#: engines/agos/saveload.cpp:195 engines/scumm/scumm.cpp:2314
+#, c-format
+msgid ""
+"Failed to save game state to file:\n"
+"\n"
+"%s"
+msgstr ""
+"Pelitilan tallennus ei onnistunut tiedostoon:\n"
+"\n"
+"%s"
+
+#: engines/agos/saveload.cpp:203 engines/scumm/scumm.cpp:2332
+#, c-format
+msgid ""
+"Successfully saved game state in file:\n"
+"\n"
+"%s"
+msgstr ""
+"Pelitilan tallennus onnistui tiedostoon:\n"
+"\n"
+"%s"
+
+#: engines/agos/animation.cpp:557
+#, c-format
+msgid "Cutscene file '%s' not found!"
+msgstr "Videotiedostoa '%s' ei löytynyt!"
+
+#: engines/drascula/saveload.cpp:47
#, fuzzy
msgid ""
"ScummVM found that you have old savefiles for Drascula that should be "
@@ -1443,192 +2178,449 @@ msgstr "Käytä kirkaspalettitilaa"
msgid "Display graphics using the game's bright palette"
msgstr "Näytä grafiikat käyttäen pelin kirkasta palettia"
-#: engines/sci/detection.cpp:373
+#: engines/gob/inter_playtoons.cpp:256 engines/gob/inter_v2.cpp:1470
+#: engines/tinsel/saveload.cpp:532
+msgid "Failed to load game state from file."
+msgstr "Pelitallenteen lataaminen tiedostosta epäonnistui."
+
+#: engines/gob/inter_v2.cpp:1540 engines/tinsel/saveload.cpp:545
+msgid "Failed to save game state to file."
+msgstr "Pelin tallentaminen tiedostoon epäonnistui."
+
+#: engines/gob/inter_v5.cpp:107
+msgid "Failed to delete file."
+msgstr "Tiedoston tuhoaminen ei onnistunut."
+
+#: engines/groovie/detection.cpp:312
+#, fuzzy
+msgid "Fast movie speed"
+msgstr "Nopea moodi"
+
+#: engines/groovie/detection.cpp:313
+msgid "Play movies at an increased speed"
+msgstr ""
+
+#: engines/groovie/script.cpp:399
+msgid "Failed to save game"
+msgstr "Pelin tallentaminen epäonnistui."
+
+#. I18N: Studio audience adds an applause and cheering sounds whenever
+#. Malcolm makes a joke.
+#: engines/kyra/detection.cpp:62
+msgid "Studio audience"
+msgstr "Studioyleisö"
+
+#: engines/kyra/detection.cpp:63
+msgid "Enable studio audience"
+msgstr "Studioyleisö päälle"
+
+#. I18N: This option allows the user to skip text and cutscenes.
+#: engines/kyra/detection.cpp:73
+msgid "Skip support"
+msgstr "Ohita tuki"
+
+#: engines/kyra/detection.cpp:74
+msgid "Allow text and cutscenes to be skipped"
+msgstr "Salli tekstin ja videoiden ohittaminen"
+
+#. I18N: Helium mode makes people sound like they've inhaled Helium.
+#: engines/kyra/detection.cpp:84
+msgid "Helium mode"
+msgstr "Helium moodi"
+
+#: engines/kyra/detection.cpp:85
+msgid "Enable helium mode"
+msgstr "Käytä helium moodia"
+
+#. I18N: When enabled, this option makes scrolling smoother when
+#. changing from one screen to another.
+#: engines/kyra/detection.cpp:99
+msgid "Smooth scrolling"
+msgstr "Pehmeä vieritys"
+
+#: engines/kyra/detection.cpp:100
+msgid "Enable smooth scrolling when walking"
+msgstr "Käytä pehmeää vieritystä kävellessä"
+
+#. I18N: When enabled, this option changes the cursor when it floats to the
+#. edge of the screen to a directional arrow. The player can then click to
+#. walk towards that direction.
+#: engines/kyra/detection.cpp:112
+msgid "Floating cursors"
+msgstr "Leijuva kursori"
+
+#: engines/kyra/detection.cpp:113
+msgid "Enable floating cursors"
+msgstr "Käytä leijuvia kursoreita"
+
+#. I18N: HP stands for Hit Points
+#: engines/kyra/detection.cpp:127
+msgid "HP bar graphs"
+msgstr "Kestopisteet (HP) graafisina palkkeina"
+
+#: engines/kyra/detection.cpp:128
+msgid "Enable hit point bar graphs"
+msgstr "Käytä kestopisteissä värillisiä grafiikkapalkkeja numeroiden sijaan"
+
+#: engines/kyra/lol.cpp:478
+msgid "Attack 1"
+msgstr "Hyökkäys 1"
+
+#: engines/kyra/lol.cpp:479
+msgid "Attack 2"
+msgstr "Hyökkäys 2"
+
+#: engines/kyra/lol.cpp:480
+msgid "Attack 3"
+msgstr "Hyökkäys 3"
+
+#: engines/kyra/lol.cpp:481
+msgid "Move Forward"
+msgstr "Liiku eteenpäin"
+
+#: engines/kyra/lol.cpp:482
+msgid "Move Back"
+msgstr "Liiku taaksepäin"
+
+#: engines/kyra/lol.cpp:483
+msgid "Slide Left"
+msgstr "Liiku vasemmalle"
+
+#: engines/kyra/lol.cpp:484
+msgid "Slide Right"
+msgstr "Liiku oikealle"
+
+#: engines/kyra/lol.cpp:485 engines/pegasus/pegasus.cpp:2509
+msgid "Turn Left"
+msgstr "Käänny vasemmalle"
+
+#: engines/kyra/lol.cpp:486 engines/pegasus/pegasus.cpp:2510
+msgid "Turn Right"
+msgstr "Käänny oikealle"
+
+#: engines/kyra/lol.cpp:487
+msgid "Rest"
+msgstr "Lepää"
+
+#: engines/kyra/lol.cpp:488
+msgid "Options"
+msgstr "Asetukset"
+
+#: engines/kyra/lol.cpp:489
+msgid "Choose Spell"
+msgstr "Valitse loitsu"
+
+#: engines/kyra/sound_midi.cpp:477
+msgid ""
+"You appear to be using a General MIDI device,\n"
+"but your game only supports Roland MT32 MIDI.\n"
+"We try to map the Roland MT32 instruments to\n"
+"General MIDI ones. It is still possible that\n"
+"some tracks sound incorrect."
+msgstr ""
+"Käytät General MIDI-äänilaitetta, mutta peli\n"
+"tukee vain Roland MT-32:sta. Jotkut ääniraidat\n"
+"eivät ehkä kuulosta siltä miltä niiden pitäisi."
+
+#. I18N: Option for fast scene switching
+#: engines/mohawk/dialogs.cpp:92 engines/mohawk/dialogs.cpp:167
+msgid "~Z~ip Mode Activated"
+msgstr "~Z~ip moodi valittu"
+
+#: engines/mohawk/dialogs.cpp:93
+msgid "~T~ransitions Enabled"
+msgstr "Siirtymät päällä"
+
+#. I18N: Drop book page
+#: engines/mohawk/dialogs.cpp:95
+msgid "~D~rop Page"
+msgstr "Pudota sivu"
+
+#: engines/mohawk/dialogs.cpp:99
+msgid "~S~how Map"
+msgstr "Näytä kartta"
+
+#: engines/mohawk/dialogs.cpp:105
+msgid "~M~ain Menu"
+msgstr "Päävalikko"
+
+#: engines/mohawk/dialogs.cpp:168
+msgid "~W~ater Effect Enabled"
+msgstr "Vesiefekti päällä"
+
+#: engines/neverhood/detection.cpp:167
+msgid "Skip the Hall of Records storyboard scenes"
+msgstr ""
+
+#: engines/neverhood/detection.cpp:168
+msgid "Allows the player to skip past the Hall of Records storyboard scenes"
+msgstr ""
+
+#: engines/neverhood/detection.cpp:174
+msgid "Scale the making of videos to full screen"
+msgstr ""
+
+#: engines/neverhood/detection.cpp:175
+msgid "Scale the making of videos, so that they use the whole screen"
+msgstr ""
+
+#: engines/parallaction/saveload.cpp:133
+#, c-format
+msgid ""
+"Can't save game in slot %i\n"
+"\n"
+msgstr ""
+"Pelin tallennus kohtaan ei onnistunut kohtaan %i\n"
+"\n"
+
+#: engines/parallaction/saveload.cpp:204
+msgid "Loading game..."
+msgstr "Ladataan peliä..."
+
+#: engines/parallaction/saveload.cpp:219
+msgid "Saving game..."
+msgstr "Tallennetaan peliä..."
+
+#: engines/parallaction/saveload.cpp:272
+msgid ""
+"ScummVM found that you have old savefiles for Nippon Safes that should be "
+"renamed.\n"
+"The old names are 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 next time.\n"
+msgstr ""
+"Pelin Nippon Safes tallennukset ovat vanhassa muodossa, joita ei enää tueta. "
+"Tallennukset\n"
+"tulee nimetä uudelleen ennen kuin ScummVM voi käyttää niitä. Paina 'Hyväksy' "
+"muuntaaksesi tallennukset.\n"
+"Jos et tee muunnosta nyt, ScummVM kysyy sinulta uudelleen seuraavalla "
+"kerralla kun käynnistät pelin.\n"
+
+#: engines/parallaction/saveload.cpp:319
+msgid "ScummVM successfully converted all your savefiles."
+msgstr "ScummVM muunsi kaikki pelitallenteet onnistuneesti"
+
+#: engines/parallaction/saveload.cpp:321
+msgid ""
+"ScummVM printed some warnings in your console window and can't guarantee all "
+"your files have been converted.\n"
+"\n"
+"Please report to the team."
+msgstr ""
+"Osa tiedostoista ei ehkä muuntunut oikein. Varoitukset tulostettiin konsoli-"
+"ikkunaan. Pyydämme että ilmoittaisit\n"
+"niistä ScummVM:n kehittäjille."
+
+#: engines/pegasus/pegasus.cpp:714
+msgid "Invalid save file name"
+msgstr ""
+
+#: engines/pegasus/pegasus.cpp:2507
+msgid "Up/Zoom In/Move Forward/Open Doors"
+msgstr ""
+
+#: engines/pegasus/pegasus.cpp:2508
+#, fuzzy
+msgid "Down/Zoom Out"
+msgstr "Zoomaa ylös"
+
+#: engines/pegasus/pegasus.cpp:2511
+msgid "Display/Hide Inventory Tray"
+msgstr ""
+
+#: engines/pegasus/pegasus.cpp:2512
+msgid "Display/Hide Biochip Tray"
+msgstr ""
+
+#: engines/pegasus/pegasus.cpp:2513
+msgid "Action/Select"
+msgstr ""
+
+#: engines/pegasus/pegasus.cpp:2514
+msgid "Toggle Center Data Display"
+msgstr ""
+
+#: engines/pegasus/pegasus.cpp:2515
+msgid "Display/Hide Info Screen"
+msgstr ""
+
+#: engines/pegasus/pegasus.cpp:2516
+msgid "Display/Hide Pause Menu"
+msgstr ""
+
+#: engines/pegasus/pegasus.cpp:2517
+msgid "???"
+msgstr ""
+
+#: engines/sci/detection.cpp:374
msgid "EGA undithering"
msgstr "EGA unditteröinti"
-#: engines/sci/detection.cpp:374
+#: engines/sci/detection.cpp:375
msgid "Enable undithering in EGA games"
msgstr "Käytä unditteröintiä EGA peleissä"
-#: engines/sci/detection.cpp:383
+#: engines/sci/detection.cpp:384
msgid "Prefer digital sound effects"
msgstr "Käytä mieluiten digitaalisia äänitehosteita."
-#: engines/sci/detection.cpp:384
+#: engines/sci/detection.cpp:385
msgid "Prefer digital sound effects instead of synthesized ones"
msgstr ""
"Käytä mieluiten digitaalisia äänitehosteita synteettisten tehosteiden sijaan."
-#: engines/sci/detection.cpp:403
+#: engines/sci/detection.cpp:404
msgid "Use IMF/Yamaha FB-01 for MIDI output"
msgstr "Käytä IMF/Yamaha FB-01:stä MIDI-musiikille"
-#: engines/sci/detection.cpp:404
+#: engines/sci/detection.cpp:405
msgid ""
"Use an IBM Music Feature card or a Yamaha FB-01 FM synth module for MIDI "
"output"
msgstr ""
"Käytä IBM:n Music Feature korttia, tai Yamaha FB-01 FM moduulia MIDIlle"
-#: engines/sci/detection.cpp:414
+#: engines/sci/detection.cpp:415
msgid "Use CD audio"
msgstr "Käytä CD:n ääntä"
-#: engines/sci/detection.cpp:415
+#: engines/sci/detection.cpp:416
msgid "Use CD audio instead of in-game audio, if available"
msgstr "Käytä CD:n audiota pelin audion sijaan, jos mahdollista."
-#: engines/sci/detection.cpp:425
+#: engines/sci/detection.cpp:426
msgid "Use Windows cursors"
msgstr "Käytä Windowsin kursoreita"
-#: engines/sci/detection.cpp:426
+#: engines/sci/detection.cpp:427
msgid ""
"Use the Windows cursors (smaller and monochrome) instead of the DOS ones"
msgstr ""
"Käytä Windowsin kursoreita (pienempiä ja harmaasävyisiä) DOS kursorien sijaan"
-#: engines/sci/detection.cpp:436
+#: engines/sci/detection.cpp:437
msgid "Use silver cursors"
msgstr "Käytä hopeisia kursoreita"
-#: engines/sci/detection.cpp:437
+#: engines/sci/detection.cpp:438
msgid ""
"Use the alternate set of silver cursors, instead of the normal golden ones"
msgstr "Käytä vaihtoehtoisia hopeisia kursoreita normaalien kultaisten sijaan"
-#: engines/scumm/dialogs.cpp:175
+#: engines/scumm/dialogs.cpp:176
#, c-format
msgid "Insert Disk %c and Press Button to Continue."
msgstr "Lisää levyke %c ja paina jotain nappia jatkaaksesi."
-#: engines/scumm/dialogs.cpp:176
+#: engines/scumm/dialogs.cpp:177
#, c-format
msgid "Unable to Find %s, (%c%d) Press Button."
msgstr "Tiedosto %s, (%c%d) ei löydy. Paina nappia."
-#: engines/scumm/dialogs.cpp:177
+#: engines/scumm/dialogs.cpp:178
#, c-format
msgid "Error reading disk %c, (%c%d) Press Button."
msgstr "Virhe luettaessa levyä %c, (%c%d) Paina jotain nappia."
-#: engines/scumm/dialogs.cpp:178
+#: engines/scumm/dialogs.cpp:179
msgid "Game Paused. Press SPACE to Continue."
msgstr "Pause. Paina välilyöntiä jatkaaksesi."
#. 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
+#: engines/scumm/dialogs.cpp:183
msgid "Are you sure you want to restart? (Y/N)"
msgstr "Haluatko varmasti aloittaa pelin alusta? (K/E)K"
#. I18N: you may specify 'Yes' symbol at the end of the line. See previous comment
-#: engines/scumm/dialogs.cpp:184
+#: engines/scumm/dialogs.cpp:185
msgid "Are you sure you want to quit? (Y/N)"
msgstr "Haluatko varmati lopettaa?"
-#: engines/scumm/dialogs.cpp:189
+#: engines/scumm/dialogs.cpp:190
msgid "Play"
msgstr "Pelaa"
-#: 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:215
-msgid "Quit"
-msgstr "Lopeta"
-
-#: engines/scumm/dialogs.cpp:193
+#: engines/scumm/dialogs.cpp:194
msgid "Insert save/load game disk"
msgstr "Laita tallennus/lataus levy asemaan"
-#: engines/scumm/dialogs.cpp:194
+#: engines/scumm/dialogs.cpp:195
msgid "You must enter a name"
msgstr "Nimi on pakko antaa"
-#: engines/scumm/dialogs.cpp:195
+#: engines/scumm/dialogs.cpp:196
msgid "The game was NOT saved (disk full?)"
msgstr "Peliä EI tallennettu (onko levy täysi?)"
-#: engines/scumm/dialogs.cpp:196
+#: engines/scumm/dialogs.cpp:197
msgid "The game was NOT loaded"
msgstr "Peliä EI ladattu"
-#: engines/scumm/dialogs.cpp:197
+#: engines/scumm/dialogs.cpp:198
#, c-format
msgid "Saving '%s'"
msgstr "Tallennetaan '%s'"
-#: engines/scumm/dialogs.cpp:198
+#: engines/scumm/dialogs.cpp:199
#, c-format
msgid "Loading '%s'"
msgstr "Ladataan '%s'"
-#: engines/scumm/dialogs.cpp:199
+#: engines/scumm/dialogs.cpp:200
msgid "Name your SAVE game"
msgstr "Nimeä pelitallenteesi"
-#: engines/scumm/dialogs.cpp:200
+#: engines/scumm/dialogs.cpp:201
msgid "Select a game to LOAD"
msgstr "Valitse ladattava peli"
-#: engines/scumm/dialogs.cpp:201
+#: engines/scumm/dialogs.cpp:202
msgid "Game title)"
msgstr "Pelin nimi"
#. I18N: Previous page button
-#: engines/scumm/dialogs.cpp:287
+#: engines/scumm/dialogs.cpp:288
msgid "~P~revious"
msgstr "E~d~ellinen"
#. I18N: Next page button
-#: engines/scumm/dialogs.cpp:289
+#: engines/scumm/dialogs.cpp:290
msgid "~N~ext"
msgstr "Se~u~raava"
-#: engines/scumm/dialogs.cpp:290
-#: backends/platform/ds/arm9/source/dsoptions.cpp:56
-msgid "~C~lose"
-msgstr "~S~ulje"
-
-#: engines/scumm/dialogs.cpp:597
+#: engines/scumm/dialogs.cpp:598
msgid "Speech Only"
msgstr "Vain puhe"
-#: engines/scumm/dialogs.cpp:598
+#: engines/scumm/dialogs.cpp:599
msgid "Speech and Subtitles"
msgstr "Puhe ja Tekstitys"
-#: engines/scumm/dialogs.cpp:599
+#: engines/scumm/dialogs.cpp:600
msgid "Subtitles Only"
msgstr "Vain tekstitys"
-#: engines/scumm/dialogs.cpp:607
+#: engines/scumm/dialogs.cpp:608
msgctxt "lowres"
msgid "Speech & Subs"
msgstr "Puhe & teksti"
-#: engines/scumm/dialogs.cpp:653
+#: engines/scumm/dialogs.cpp:654
msgid "Select a Proficiency Level."
msgstr "Valitse taitotasosi."
-#: engines/scumm/dialogs.cpp:655
+#: engines/scumm/dialogs.cpp:656
msgid "Refer to your Loom(TM) manual for help."
msgstr "Lue Loom(TM) ohjekirjaa saadaksesi ohjeita."
-#: engines/scumm/dialogs.cpp:658
-msgid "Standard"
-msgstr "Standardi"
-
-#: engines/scumm/dialogs.cpp:659
+#: engines/scumm/dialogs.cpp:660
msgid "Practice"
msgstr "Harjoitus"
-#: engines/scumm/dialogs.cpp:660
+#: engines/scumm/dialogs.cpp:661
msgid "Expert"
msgstr "Ekspertti"
@@ -2145,7 +3137,7 @@ msgstr "Lennä oikealle"
msgid "Fly to lower right"
msgstr "Lennä alas oikealle"
-#: engines/scumm/scumm.cpp:1776
+#: engines/scumm/scumm.cpp:1777
#, c-format
msgid ""
"Native MIDI support requires the Roland Upgrade from LucasArts,\n"
@@ -2154,40 +3146,7 @@ msgstr ""
"Suora MIDI tuki vaatii Roland päivityksen LucasArtsilta, mutta\n"
"%s puuttuu. Käytetään AdLibia sen sijaan."
-#: engines/scumm/scumm.cpp:2303 engines/agos/saveload.cpp:220
-#, c-format
-msgid ""
-"Failed to save game state to file:\n"
-"\n"
-"%s"
-msgstr ""
-"Pelitilan tallennus ei onnistunut tiedostoon:\n"
-"\n"
-"%s"
-
-#: engines/scumm/scumm.cpp:2310 engines/agos/saveload.cpp:185
-#, c-format
-msgid ""
-"Failed to load game state from file:\n"
-"\n"
-"%s"
-msgstr ""
-"Pelitilan lataus ei onnistunut tiedostosta:\n"
-"\n"
-"%s"
-
-#: engines/scumm/scumm.cpp:2322 engines/agos/saveload.cpp:228
-#, c-format
-msgid ""
-"Successfully saved game state in file:\n"
-"\n"
-"%s"
-msgstr ""
-"Pelitilan tallennus onnistui tiedostoon:\n"
-"\n"
-"%s"
-
-#: engines/scumm/scumm.cpp:2537
+#: engines/scumm/scumm.cpp:2547
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' "
@@ -2197,189 +3156,6 @@ msgstr ""
"Pelataksesi Maniac Mansionia, mene ScummVM:n päävalikkoon ja paina 'Lisää "
"peli'. Valitse 'Maniac' hakemisto Tentacle hakemiston sisältä."
-#. I18N: Option for fast scene switching
-#: engines/mohawk/dialogs.cpp:92 engines/mohawk/dialogs.cpp:167
-msgid "~Z~ip Mode Activated"
-msgstr "~Z~ip moodi valittu"
-
-#: engines/mohawk/dialogs.cpp:93
-msgid "~T~ransitions Enabled"
-msgstr "Siirtymät päällä"
-
-#. I18N: Drop book page
-#: engines/mohawk/dialogs.cpp:95
-msgid "~D~rop Page"
-msgstr "Pudota sivu"
-
-#: engines/mohawk/dialogs.cpp:99
-msgid "~S~how Map"
-msgstr "Näytä kartta"
-
-#: engines/mohawk/dialogs.cpp:105
-msgid "~M~ain Menu"
-msgstr "Päävalikko"
-
-#: engines/mohawk/dialogs.cpp:168
-msgid "~W~ater Effect Enabled"
-msgstr "Vesiefekti päällä"
-
-#: engines/agos/animation.cpp:557
-#, c-format
-msgid "Cutscene file '%s' not found!"
-msgstr "Videotiedostoa '%s' ei löytynyt!"
-
-#: engines/gob/inter_playtoons.cpp:256 engines/gob/inter_v2.cpp:1287
-#: engines/tinsel/saveload.cpp:532
-msgid "Failed to load game state from file."
-msgstr "Pelitallenteen lataaminen tiedostosta epäonnistui."
-
-#: engines/gob/inter_v2.cpp:1357 engines/tinsel/saveload.cpp:545
-msgid "Failed to save game state to file."
-msgstr "Pelin tallentaminen tiedostoon epäonnistui."
-
-#: engines/gob/inter_v5.cpp:107
-msgid "Failed to delete file."
-msgstr "Tiedoston tuhoaminen ei onnistunut."
-
-#: engines/groovie/detection.cpp:312
-#, fuzzy
-msgid "Fast movie speed"
-msgstr "Nopea moodi"
-
-#: engines/groovie/detection.cpp:313
-msgid "Play movies at an increased speed"
-msgstr ""
-
-#: engines/groovie/script.cpp:420
-msgid "Failed to save game"
-msgstr "Pelin tallentaminen epäonnistui."
-
-#. I18N: Studio audience adds an applause and cheering sounds whenever
-#. Malcolm makes a joke.
-#: engines/kyra/detection.cpp:62
-msgid "Studio audience"
-msgstr "Studioyleisö"
-
-#: engines/kyra/detection.cpp:63
-msgid "Enable studio audience"
-msgstr "Studioyleisö päälle"
-
-#. I18N: This option allows the user to skip text and cutscenes.
-#: engines/kyra/detection.cpp:73
-msgid "Skip support"
-msgstr "Ohita tuki"
-
-#: engines/kyra/detection.cpp:74
-msgid "Allow text and cutscenes to be skipped"
-msgstr "Salli tekstin ja videoiden ohittaminen"
-
-#. I18N: Helium mode makes people sound like they've inhaled Helium.
-#: engines/kyra/detection.cpp:84
-msgid "Helium mode"
-msgstr "Helium moodi"
-
-#: engines/kyra/detection.cpp:85
-msgid "Enable helium mode"
-msgstr "Käytä helium moodia"
-
-#. I18N: When enabled, this option makes scrolling smoother when
-#. changing from one screen to another.
-#: engines/kyra/detection.cpp:99
-msgid "Smooth scrolling"
-msgstr "Pehmeä vieritys"
-
-#: engines/kyra/detection.cpp:100
-msgid "Enable smooth scrolling when walking"
-msgstr "Käytä pehmeää vieritystä kävellessä"
-
-#. I18N: When enabled, this option changes the cursor when it floats to the
-#. edge of the screen to a directional arrow. The player can then click to
-#. walk towards that direction.
-#: engines/kyra/detection.cpp:112
-msgid "Floating cursors"
-msgstr "Leijuva kursori"
-
-#: engines/kyra/detection.cpp:113
-msgid "Enable floating cursors"
-msgstr "Käytä leijuvia kursoreita"
-
-#. I18N: HP stands for Hit Points
-#: engines/kyra/detection.cpp:127
-msgid "HP bar graphs"
-msgstr "Kestopisteet (HP) graafisina palkkeina"
-
-#: engines/kyra/detection.cpp:128
-msgid "Enable hit point bar graphs"
-msgstr "Käytä kestopisteissä värillisiä grafiikkapalkkeja numeroiden sijaan"
-
-#: engines/kyra/lol.cpp:478
-msgid "Attack 1"
-msgstr "Hyökkäys 1"
-
-#: engines/kyra/lol.cpp:479
-msgid "Attack 2"
-msgstr "Hyökkäys 2"
-
-#: engines/kyra/lol.cpp:480
-msgid "Attack 3"
-msgstr "Hyökkäys 3"
-
-#: engines/kyra/lol.cpp:481
-msgid "Move Forward"
-msgstr "Liiku eteenpäin"
-
-#: engines/kyra/lol.cpp:482
-msgid "Move Back"
-msgstr "Liiku taaksepäin"
-
-#: engines/kyra/lol.cpp:483
-msgid "Slide Left"
-msgstr "Liiku vasemmalle"
-
-#: engines/kyra/lol.cpp:484
-msgid "Slide Right"
-msgstr "Liiku oikealle"
-
-#: engines/kyra/lol.cpp:485 engines/pegasus/pegasus.cpp:2447
-msgid "Turn Left"
-msgstr "Käänny vasemmalle"
-
-#: engines/kyra/lol.cpp:486 engines/pegasus/pegasus.cpp:2448
-msgid "Turn Right"
-msgstr "Käänny oikealle"
-
-#: engines/kyra/lol.cpp:487
-msgid "Rest"
-msgstr "Lepää"
-
-#: engines/kyra/lol.cpp:488
-msgid "Options"
-msgstr "Asetukset"
-
-#: engines/kyra/lol.cpp:489
-msgid "Choose Spell"
-msgstr "Valitse loitsu"
-
-#: engines/kyra/sound_midi.cpp:477
-msgid ""
-"You appear to be using a General MIDI device,\n"
-"but your game only supports Roland MT32 MIDI.\n"
-"We try to map the Roland MT32 instruments to\n"
-"General MIDI ones. It is still possible that\n"
-"some tracks sound incorrect."
-msgstr ""
-"Käytät General MIDI-äänilaitetta, mutta peli\n"
-"tukee vain Roland MT-32:sta. Jotkut ääniraidat\n"
-"eivät ehkä kuulosta siltä miltä niiden pitäisi."
-
-#: engines/queen/queen.cpp:59
-msgid "Alternative intro"
-msgstr "Vaihtoehtoinen intro"
-
-#: engines/queen/queen.cpp:60
-msgid "Use an alternative game intro (CD version only)"
-msgstr "Käytä vaihtoehtoista pelin introa (vain CD versiossa)"
-
#: engines/sky/compact.cpp:130
msgid ""
"Unable to find \"sky.cpt\" file!\n"
@@ -2404,21 +3180,22 @@ msgstr "Levykeversion intro"
msgid "Use the floppy version's intro (CD version only)"
msgstr "Käytä levykeversion introa (vain CD versiossa)"
-#: engines/sword1/animation.cpp:519
+#: engines/sword1/animation.cpp:524
#, c-format
msgid "PSX stream cutscene '%s' cannot be played in paletted mode"
msgstr "PSX stream videota '%s' ei voi näyttää paletisoidussa tilassa"
-#: engines/sword1/animation.cpp:540 engines/sword2/animation.cpp:439
+#: engines/sword1/animation.cpp:545 engines/sword2/animation.cpp:445
msgid "DXA cutscenes found but ScummVM has been built without zlib support"
msgstr ""
"DXA videotiedostoja löydettiin mutta ScummVM on käännetty ilman zlib-tukea"
-#: engines/sword1/animation.cpp:550 engines/sword2/animation.cpp:449
-msgid "MPEG2 cutscenes are no longer supported"
-msgstr "MPEG2 videotiedostoja ei enää tueta"
+#: engines/sword1/animation.cpp:561
+#, fuzzy
+msgid "MPEG-2 cutscenes found but ScummVM has been built without MPEG-2"
+msgstr "PSX videoita löydetty, mutta ScummVM on käännetty ilman RGB tukea"
-#: engines/sword1/animation.cpp:556 engines/sword2/animation.cpp:457
+#: engines/sword1/animation.cpp:568 engines/sword2/animation.cpp:470
#, c-format
msgid "Cutscene '%s' not found"
msgstr "Videotiedosto '%s' ei löytynyt"
@@ -2460,11 +3237,18 @@ msgstr "Säilytä uusi tallennus"
msgid "This is the end of the Broken Sword 1 Demo"
msgstr "Broken Sword 1:n demo päättyy tähän"
-#: engines/sword2/animation.cpp:419
+#: engines/sword2/animation.cpp:425
msgid ""
"PSX cutscenes found but ScummVM has been built without RGB color support"
msgstr "PSX videoita löydetty, mutta ScummVM on käännetty ilman RGB tukea"
+#: engines/sword2/animation.cpp:461
+#, fuzzy
+msgid ""
+"MPEG-2 cutscenes found but ScummVM has been built without MPEG-2 support"
+msgstr ""
+"DXA videotiedostoja löydettiin mutta ScummVM on käännetty ilman zlib-tukea"
+
#: engines/sword2/sword2.cpp:79
msgid "Show object labels"
msgstr "Näytä esineiden tiedot"
@@ -2473,14 +3257,14 @@ msgstr "Näytä esineiden tiedot"
msgid "Show labels for objects on mouse hover"
msgstr "Näytä esineiden kuvaus kohdistaessasi kursorin esineen ylle"
-#: engines/teenagent/resources.cpp:94
+#: engines/teenagent/resources.cpp:95
msgid ""
"You're missing the 'teenagent.dat' file. Get it from the ScummVM website"
msgstr ""
"Asennuksestasi puuttuu 'teenagent.dat' tiedosto. Hae se ScummVM:n "
"nettisivuilta"
-#: engines/teenagent/resources.cpp:115
+#: engines/teenagent/resources.cpp:116
msgid ""
"The teenagent.dat file is compressed and zlib hasn't been included in this "
"executable. Please decompress it"
@@ -2488,794 +3272,49 @@ msgstr ""
"Tiedosto teenagent.dat on pakattu, mutta zlib-kirjastoa ei ole käännetty "
"ScummVM:ään. Pura teenagent.dat."
-#: engines/parallaction/saveload.cpp:133
-#, c-format
-msgid ""
-"Can't save game in slot %i\n"
-"\n"
-msgstr ""
-"Pelin tallennus kohtaan ei onnistunut kohtaan %i\n"
-"\n"
-
-#: engines/parallaction/saveload.cpp:204
-msgid "Loading game..."
-msgstr "Ladataan peliä..."
-
-#: engines/parallaction/saveload.cpp:219
-msgid "Saving game..."
-msgstr "Tallennetaan peliä..."
-
-#: engines/parallaction/saveload.cpp:272
-msgid ""
-"ScummVM found that you have old savefiles for Nippon Safes that should be "
-"renamed.\n"
-"The old names are 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 next time.\n"
-msgstr ""
-"Pelin Nippon Safes tallennukset ovat vanhassa muodossa, joita ei enää tueta. "
-"Tallennukset\n"
-"tulee nimetä uudelleen ennen kuin ScummVM voi käyttää niitä. Paina 'Hyväksy' "
-"muuntaaksesi tallennukset.\n"
-"Jos et tee muunnosta nyt, ScummVM kysyy sinulta uudelleen seuraavalla "
-"kerralla kun käynnistät pelin.\n"
-
-#: engines/parallaction/saveload.cpp:319
-msgid "ScummVM successfully converted all your savefiles."
-msgstr "ScummVM muunsi kaikki pelitallenteet onnistuneesti"
-
-#: engines/parallaction/saveload.cpp:321
-msgid ""
-"ScummVM printed some warnings in your console window and can't guarantee all "
-"your files have been converted.\n"
-"\n"
-"Please report to the team."
-msgstr ""
-"Osa tiedostoista ei ehkä muuntunut oikein. Varoitukset tulostettiin konsoli-"
-"ikkunaan. Pyydämme että ilmoittaisit\n"
-"niistä ScummVM:n kehittäjille."
-
-#: engines/pegasus/pegasus.cpp:679
-msgid "Invalid save file name"
-msgstr ""
-
-#: engines/pegasus/pegasus.cpp:2445
-msgid "Up/Zoom In/Move Forward/Open Doors"
-msgstr ""
-
-#: engines/pegasus/pegasus.cpp:2446
-#, fuzzy
-msgid "Down/Zoom Out"
-msgstr "Zoomaa ylös"
-
-#: engines/pegasus/pegasus.cpp:2449
-msgid "Display/Hide Inventory Tray"
-msgstr ""
-
-#: engines/pegasus/pegasus.cpp:2450
-msgid "Display/Hide Biochip Tray"
-msgstr ""
-
-#: engines/pegasus/pegasus.cpp:2451
-msgid "Action/Select"
-msgstr ""
-
-#: engines/pegasus/pegasus.cpp:2452
-msgid "Toggle Center Data Display"
-msgstr ""
-
-#: engines/pegasus/pegasus.cpp:2453
-msgid "Display/Hide Info Screen"
-msgstr ""
-
-#: engines/pegasus/pegasus.cpp:2454
-msgid "Display/Hide Pause Menu"
-msgstr ""
-
-#: engines/pegasus/pegasus.cpp:2455
-msgid "???"
-msgstr ""
-
-#: audio/fmopl.cpp:49
-msgid "MAME OPL emulator"
-msgstr "MAME OPL emulaattori"
-
-#: audio/fmopl.cpp:51
-msgid "DOSBox OPL emulator"
-msgstr "DOSBox OPL emulaattori"
-
-#: audio/mididrv.cpp:209
-#, c-format
-msgid ""
-"The selected audio device '%s' was not found (e.g. might be turned off or "
-"disconnected)."
-msgstr ""
-"Valittua äänilaitetta '%s' ei löytynyt. Se saattaa olla kytketty pois päältä "
-"tai irrotettuna tietokoneesta."
-
-#: audio/mididrv.cpp:209 audio/mididrv.cpp:221 audio/mididrv.cpp:257
-#: audio/mididrv.cpp:272
-msgid "Attempting to fall back to the next available device..."
-msgstr "Yritetään käyttää seuraavaa saatavilla olevaa laitetta..."
-
-#: audio/mididrv.cpp:221
-#, c-format
-msgid ""
-"The selected audio device '%s' cannot be used. See log file for more "
-"information."
-msgstr ""
-"Valitsemaasi äänilaitetta '%s' ei voida käyttää. Avaa lokitiedosto "
-"saadaksesi lisätietoja."
-
-#: audio/mididrv.cpp:257
-#, c-format
-msgid ""
-"The preferred audio device '%s' was not found (e.g. might be turned off or "
-"disconnected)."
-msgstr ""
-"Ensisijaista äänilaitetta '%s' ei löytynyt. Se saattaa olla kytketty pois "
-"päältä tai irrotettuna tietokoneesta."
-
-#: audio/mididrv.cpp:272
-#, c-format
-msgid ""
-"The preferred audio device '%s' cannot be used. See log file for more "
-"information."
-msgstr ""
-"Ensisijaista äänilaitetta '%s' ei voida käyttää. Avaa lokitiedosto "
-"saadaksesi lisätietoja."
-
-#: audio/null.h:43
-msgid "No music"
-msgstr "Ei musiikkia"
-
-#: audio/mods/paula.cpp:189
-msgid "Amiga Audio Emulator"
-msgstr "Amiga Audio emulaattori"
-
-#: audio/softsynth/adlib.cpp:2284
-msgid "AdLib Emulator"
-msgstr "AdLib emulaattori"
-
-#: audio/softsynth/appleiigs.cpp:33
-msgid "Apple II GS Emulator (NOT IMPLEMENTED)"
-msgstr "Apple II GS emulaattori (EI TOTEUTETTU)"
-
-#: audio/softsynth/sid.cpp:1430
-msgid "C64 Audio Emulator"
-msgstr "C64 Audio emulaattori"
-
-#: audio/softsynth/mt32.cpp:205
-msgid "Initializing MT-32 Emulator"
-msgstr "Alustetaan MT-32 emulaattoria"
-
-#: audio/softsynth/mt32.cpp:431
-msgid "MT-32 Emulator"
-msgstr "MT-32 emulaattori"
-
-#: audio/softsynth/pcspk.cpp:139
-msgid "PC Speaker Emulator"
-msgstr "PC kaiuttimen emulaattori"
-
-#: audio/softsynth/pcspk.cpp:158
-msgid "IBM PCjr Emulator"
-msgstr "IBM PCjr emulaattori"
-
-#: backends/keymapper/remap-dialog.cpp:47
-msgid "Keymap:"
-msgstr "Näppäinkartta:"
-
-#: backends/keymapper/remap-dialog.cpp:66
-msgid " (Effective)"
-msgstr ""
-
-#: backends/keymapper/remap-dialog.cpp:106
-msgid " (Active)"
-msgstr " (Aktiivinen)"
-
-#: backends/keymapper/remap-dialog.cpp:106
-msgid " (Blocked)"
-msgstr " (Estetty)"
-
-#: backends/keymapper/remap-dialog.cpp:119
-msgid " (Global)"
-msgstr " (Globaali)"
-
-#: backends/keymapper/remap-dialog.cpp:127
-msgid " (Game)"
-msgstr " (Peli)"
-
-#: backends/midi/windows.cpp:164
-msgid "Windows MIDI"
-msgstr "Windows MIDI"
-
-#: backends/platform/ds/arm9/source/dsoptions.cpp:57
-msgid "ScummVM Main Menu"
-msgstr "ScummVM päävalikko"
-
-#: backends/platform/ds/arm9/source/dsoptions.cpp:63
-msgid "~L~eft handed mode"
-msgstr "~V~asenkätinen tila"
-
-#: backends/platform/ds/arm9/source/dsoptions.cpp:64
-msgid "~I~ndy fight controls"
-msgstr "~I~ndyn tappelukontrollit"
-
-#: backends/platform/ds/arm9/source/dsoptions.cpp:65
-msgid "Show mouse cursor"
-msgstr "Näytä hiiren kursori"
-
-#: backends/platform/ds/arm9/source/dsoptions.cpp:66
-msgid "Snap to edges"
-msgstr "Tartu reunoihin"
-
-#: backends/platform/ds/arm9/source/dsoptions.cpp:68
-msgid "Touch X Offset"
-msgstr "Kosketuksen X siirros"
-
-#: backends/platform/ds/arm9/source/dsoptions.cpp:75
-msgid "Touch Y Offset"
-msgstr "Kosketuksen Y siirto"
-
-#: backends/platform/ds/arm9/source/dsoptions.cpp:87
-msgid "Use laptop trackpad-style cursor control"
-msgstr "Käytä kannettavan trackpad-tyylistä kursorinhallintaa"
-
-#: backends/platform/ds/arm9/source/dsoptions.cpp:88
-msgid "Tap for left click, double tap right click"
-msgstr ""
-"Napauta kerran vasen klikkausta varten, napauta kahdesti oikeaa klikkausta "
-"varten"
-
-#: backends/platform/ds/arm9/source/dsoptions.cpp:90
-msgid "Sensitivity"
-msgstr "Herkkyys"
-
-#: backends/platform/ds/arm9/source/dsoptions.cpp:99
-msgid "Initial top screen scale:"
-msgstr ""
-
-#: backends/platform/ds/arm9/source/dsoptions.cpp:105
-msgid "Main screen scaling:"
-msgstr "Pääruudun skaalaus"
-
-#: backends/platform/ds/arm9/source/dsoptions.cpp:107
-msgid "Hardware scale (fast, but low quality)"
-msgstr "Laitteistoskaalaus (nopea, mutta huono laatu)"
-
-#: backends/platform/ds/arm9/source/dsoptions.cpp:108
-msgid "Software scale (good quality, but slower)"
-msgstr "Ohjelmistoskaalaus (hyvä laatu, mutta hitaampi)"
-
-#: backends/platform/ds/arm9/source/dsoptions.cpp:109
-msgid "Unscaled (you must scroll left and right)"
-msgstr "Ei skaalattu (vierittä vasemmalle ja oikealle itse)"
-
-#: backends/platform/ds/arm9/source/dsoptions.cpp:111
-msgid "Brightness:"
-msgstr "Kirkkaus:"
-
-#: backends/platform/ds/arm9/source/dsoptions.cpp:121
-msgid "High quality audio (slower) (reboot)"
-msgstr "Korkealuokkainen ääni (hidas) (buuttaus)"
-
-#: backends/platform/ds/arm9/source/dsoptions.cpp:122
-msgid "Disable power off"
-msgstr ""
-
-#: backends/platform/iphone/osys_events.cpp:300
-msgid "Mouse-click-and-drag mode enabled."
-msgstr "Hiiren vedä-ja-pudota tila käytössä."
-
-#: backends/platform/iphone/osys_events.cpp:302
-msgid "Mouse-click-and-drag mode disabled."
-msgstr "Hiiren vedä-ja-pudota tila pois käytöstä."
-
-#: backends/platform/iphone/osys_events.cpp:313
-msgid "Touchpad mode enabled."
-msgstr "Touchad tila päällä"
-
-#: backends/platform/iphone/osys_events.cpp:315
-msgid "Touchpad mode disabled."
-msgstr "Touchpad tila pois päältä"
-
-#: backends/platform/maemo/maemo.cpp:209
-msgid "Click Mode"
-msgstr "Klikkaus moodi"
-
-#: backends/platform/maemo/maemo.cpp:215
-#: 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 "Vasen klikkaus"
-
-#: backends/platform/maemo/maemo.cpp:218
-msgid "Middle Click"
-msgstr "Keskiklikkaus"
-
-#: backends/platform/maemo/maemo.cpp:221
-#: backends/platform/symbian/src/SymbianActions.cpp:43
-#: backends/platform/wince/CEActionsSmartphone.cpp:44
-#: backends/platform/bada/form.cpp:273
-msgid "Right Click"
-msgstr "Oikea klikkaus"
-
-#: backends/platform/sdl/macosx/appmenu_osx.mm:77
-msgid "Hide ScummVM"
-msgstr "Piilota ScummVM"
-
-#: backends/platform/sdl/macosx/appmenu_osx.mm:82
-msgid "Hide Others"
-msgstr "Piilota muut"
-
-#: backends/platform/sdl/macosx/appmenu_osx.mm:87
-msgid "Show All"
-msgstr "Näytä kaikki"
-
-#: backends/platform/sdl/macosx/appmenu_osx.mm:109
-#: backends/platform/sdl/macosx/appmenu_osx.mm:120
-msgid "Window"
-msgstr "Ikkuna"
-
-#: backends/platform/sdl/macosx/appmenu_osx.mm:114
-msgid "Minimize"
-msgstr "Minimoi"
-
-#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:45
-msgid "Normal (no scaling)"
-msgstr "Normaali (ei skaalausta)"
-
-#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:64
-msgctxt "lowres"
-msgid "Normal (no scaling)"
-msgstr "Normaali (ei skaalausta)"
-
-#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2135
-#: backends/graphics/openglsdl/openglsdl-graphics.cpp:537
-msgid "Enabled aspect ratio correction"
-msgstr "Kuvasuhteen korjaus päällä"
-
-#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2141
-#: backends/graphics/openglsdl/openglsdl-graphics.cpp:542
-msgid "Disabled aspect ratio correction"
-msgstr "Kuvasuhteen korjaus pois päältä"
-
-#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2196
-msgid "Active graphics filter:"
-msgstr "Valittu grafiikkafiltteri:"
-
-#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2238
-#: backends/graphics/openglsdl/openglsdl-graphics.cpp:481
-msgid "Windowed mode"
-msgstr "Ikkunoitu tila"
-
-#: backends/graphics/opengl/opengl-graphics.cpp:135
-msgid "OpenGL Normal"
-msgstr "OpenGL Normal"
-
-#: backends/graphics/opengl/opengl-graphics.cpp:136
-msgid "OpenGL Conserve"
-msgstr "OpenGL Conserve"
-
-#: backends/graphics/opengl/opengl-graphics.cpp:137
-msgid "OpenGL Original"
-msgstr "OpenGL Original"
-
-#: backends/graphics/openglsdl/openglsdl-graphics.cpp:415
-msgid "Current display mode"
-msgstr "Nykyinen näyttötila"
-
-#: backends/graphics/openglsdl/openglsdl-graphics.cpp:428
-msgid "Current scale"
-msgstr "Nykyinen skaalaus"
-
-#: backends/graphics/openglsdl/openglsdl-graphics.cpp:562
-msgid "Active filter mode: Linear"
-msgstr "Valittu filtteritila: Linear"
-
-#: backends/graphics/openglsdl/openglsdl-graphics.cpp:564
-msgid "Active filter mode: Nearest"
-msgstr "Valittu filtteritila: Nearest"
-
-#: backends/platform/symbian/src/SymbianActions.cpp:38
-#: backends/platform/wince/CEActionsSmartphone.cpp:39
-msgid "Up"
-msgstr "Ylös"
-
-#: backends/platform/symbian/src/SymbianActions.cpp:39
-#: backends/platform/wince/CEActionsSmartphone.cpp:40
-msgid "Down"
-msgstr "Alas"
-
-#: backends/platform/symbian/src/SymbianActions.cpp:40
-#: backends/platform/wince/CEActionsSmartphone.cpp:41
-msgid "Left"
-msgstr "Vasen"
-
-#: backends/platform/symbian/src/SymbianActions.cpp:41
-#: backends/platform/wince/CEActionsSmartphone.cpp:42
-msgid "Right"
-msgstr "Oikea"
-
-#: backends/platform/symbian/src/SymbianActions.cpp:46
-#: backends/platform/wince/CEActionsSmartphone.cpp:47
-msgid "Zone"
-msgstr ""
-
-#: backends/platform/symbian/src/SymbianActions.cpp:47
-#: backends/platform/wince/CEActionsPocket.cpp:54
-#: backends/platform/wince/CEActionsSmartphone.cpp:48
-msgid "Multi Function"
-msgstr ""
-
-#: backends/platform/symbian/src/SymbianActions.cpp:48
-msgid "Swap character"
-msgstr "Vaihda hahmoa"
-
-#: backends/platform/symbian/src/SymbianActions.cpp:49
-msgid "Skip text"
-msgstr "Ohita teksti"
-
-#: backends/platform/symbian/src/SymbianActions.cpp:51
-msgid "Fast mode"
-msgstr "Nopea moodi"
-
-#: backends/platform/symbian/src/SymbianActions.cpp:53
-msgid "Debugger"
-msgstr "Debuggeri"
-
-#: backends/platform/symbian/src/SymbianActions.cpp:54
-msgid "Global menu"
-msgstr "Päävalikko"
-
-#: backends/platform/symbian/src/SymbianActions.cpp:55
-msgid "Virtual keyboard"
-msgstr "Virtuaalinen näppäimistö"
-
-#: backends/platform/symbian/src/SymbianActions.cpp:56
-msgid "Key mapper"
-msgstr "Näppäinmäärittelijä"
-
-#: backends/events/symbiansdl/symbiansdl-events.cpp:184
-msgid "Do you want to quit ?"
-msgstr "Haluatko lopettaa?"
-
-#: backends/platform/wii/options.cpp:51
-msgid "Video"
-msgstr "Video"
+#~ msgctxt "lowres"
+#~ msgid "Mass Add..."
+#~ msgstr "Lisää monta..."
-#: backends/platform/wii/options.cpp:54
-msgid "Current video mode:"
-msgstr "Nykyinen videotila:"
+#~ msgid "Mass Add..."
+#~ msgstr "Lisää monta..."
-#: backends/platform/wii/options.cpp:56
-msgid "Double-strike"
-msgstr ""
+#~ msgid ""
+#~ "Turns off General MIDI mapping for games with Roland MT-32 soundtrack"
+#~ msgstr "Poistaa General MIDIn peleistä joissa on Roland MT-32 ääniraita"
-#: backends/platform/wii/options.cpp:60
-msgid "Horizontal underscan:"
-msgstr "Horisontaalinenunderscan"
+#~ msgid "Standard (16bpp)"
+#~ msgstr "Standardi (16 bpp)"
-#: backends/platform/wii/options.cpp:66
-msgid "Vertical underscan:"
-msgstr "Vertikaalinen underscan"
+#~ msgid "Alternative intro"
+#~ msgstr "Vaihtoehtoinen intro"
-#: backends/platform/wii/options.cpp:71
-msgid "Input"
-msgstr "Syöte"
+#~ msgid "Use an alternative game intro (CD version only)"
+#~ msgstr "Käytä vaihtoehtoista pelin introa (vain CD versiossa)"
-#: backends/platform/wii/options.cpp:74
-msgid "GC Pad sensitivity:"
-msgstr "GC Padin herkkyys"
+#~ msgid "MPEG2 cutscenes are no longer supported"
+#~ msgstr "MPEG2 videotiedostoja ei enää tueta"
-#: backends/platform/wii/options.cpp:80
-msgid "GC Pad acceleration:"
-msgstr "GC PAdin kiihtyvyys"
+#~ msgid "OpenGL Normal"
+#~ msgstr "OpenGL Normal"
-#: backends/platform/wii/options.cpp:86
-msgid "DVD"
-msgstr "DVD"
+#~ msgid "OpenGL Conserve"
+#~ msgstr "OpenGL Conserve"
-#: backends/platform/wii/options.cpp:89 backends/platform/wii/options.cpp:101
-msgid "Status:"
-msgstr "Tila:"
+#~ msgid "OpenGL Original"
+#~ msgstr "OpenGL Original"
-#: backends/platform/wii/options.cpp:90 backends/platform/wii/options.cpp:102
-msgid "Unknown"
-msgstr "Tuntematon"
-
-#: backends/platform/wii/options.cpp:93
-msgid "Mount DVD"
-msgstr "Liitä DVD"
-
-#: backends/platform/wii/options.cpp:94
-msgid "Unmount DVD"
-msgstr "Vapauta DVD"
-
-#: backends/platform/wii/options.cpp:98
-msgid "SMB"
-msgstr "SMB"
-
-#: backends/platform/wii/options.cpp:106
-msgid "Server:"
-msgstr "Palvelin:"
+#~ msgid "Current display mode"
+#~ msgstr "Nykyinen näyttötila"
-#: backends/platform/wii/options.cpp:110
-msgid "Share:"
-msgstr "Jako:"
+#~ msgid "Current scale"
+#~ msgstr "Nykyinen skaalaus"
-#: backends/platform/wii/options.cpp:114
-msgid "Username:"
-msgstr "Käyttäjänimi:"
+#~ msgid "Active filter mode: Linear"
+#~ msgstr "Valittu filtteritila: Linear"
-#: backends/platform/wii/options.cpp:118
-msgid "Password:"
-msgstr "Salasana:"
-
-#: backends/platform/wii/options.cpp:121
-msgid "Init network"
-msgstr "Alusta verkko"
-
-#: backends/platform/wii/options.cpp:123
-msgid "Mount SMB"
-msgstr "Mounttaa SMB"
-
-#: backends/platform/wii/options.cpp:124
-msgid "Unmount SMB"
-msgstr "Vapauta SMB"
-
-#: backends/platform/wii/options.cpp:143
-msgid "DVD Mounted successfully"
-msgstr "DVD mountattu onnistuneesti"
-
-#: backends/platform/wii/options.cpp:146
-msgid "Error while mounting the DVD"
-msgstr "Virhe liitettäessä DVD:tä"
-
-#: backends/platform/wii/options.cpp:148
-msgid "DVD not mounted"
-msgstr "DVD ei ole liitetty"
-
-#: backends/platform/wii/options.cpp:161
-msgid "Network up, share mounted"
-msgstr "Verkko ylhäällä, jako liitetty"
-
-#: backends/platform/wii/options.cpp:163
-msgid "Network up"
-msgstr "Verkko ylhäällä"
-
-#: backends/platform/wii/options.cpp:166
-msgid ", error while mounting the share"
-msgstr ", virhe liitettäessä jakoa"
-
-#: backends/platform/wii/options.cpp:168
-msgid ", share not mounted"
-msgstr ", jakoa ei liitetty"
-
-#: backends/platform/wii/options.cpp:174
-msgid "Network down"
-msgstr "Verkko alhaalla"
-
-#: backends/platform/wii/options.cpp:178
-msgid "Initializing network"
-msgstr "Alustetaan verkkoa"
-
-#: backends/platform/wii/options.cpp:182
-msgid "Timeout while initializing network"
-msgstr "Aikakatkaisu kun verkkoa alustettiin"
-
-#: backends/platform/wii/options.cpp:186
-#, c-format
-msgid "Network not initialized (%d)"
-msgstr "Verkko ei ole alustettu (%d)"
-
-#: backends/platform/wince/CEActionsPocket.cpp:46
-msgid "Hide Toolbar"
-msgstr "Piilota työkalupalkki"
-
-#: backends/platform/wince/CEActionsPocket.cpp:47
-msgid "Show Keyboard"
-msgstr "Näytä näppäimistö"
-
-#: backends/platform/wince/CEActionsPocket.cpp:48
-msgid "Sound on/off"
-msgstr "Äänet päällä/pois"
-
-#: backends/platform/wince/CEActionsPocket.cpp:49
-msgid "Right click"
-msgstr "Oikea klikkaus"
-
-#: backends/platform/wince/CEActionsPocket.cpp:50
-msgid "Show/Hide Cursor"
-msgstr "Näytä/Piilota kursori"
-
-#: backends/platform/wince/CEActionsPocket.cpp:51
-msgid "Free look"
-msgstr "Vapaa katselu"
-
-#: backends/platform/wince/CEActionsPocket.cpp:52
-msgid "Zoom up"
-msgstr "Zoomaa ylös"
-
-#: backends/platform/wince/CEActionsPocket.cpp:53
-msgid "Zoom down"
-msgstr "Zoomaa alas"
-
-#: backends/platform/wince/CEActionsPocket.cpp:55
-#: backends/platform/wince/CEActionsSmartphone.cpp:49
-msgid "Bind Keys"
-msgstr "Määritä näppäimet"
-
-#: backends/platform/wince/CEActionsPocket.cpp:56
-msgid "Cursor Up"
-msgstr "Nuoli ylös"
-
-#: backends/platform/wince/CEActionsPocket.cpp:57
-msgid "Cursor Down"
-msgstr "Nuoli alas"
-
-#: backends/platform/wince/CEActionsPocket.cpp:58
-msgid "Cursor Left"
-msgstr "Nuoli vasemmalle"
-
-#: backends/platform/wince/CEActionsPocket.cpp:59
-msgid "Cursor Right"
-msgstr "Nuoli oikealle"
-
-#: backends/platform/wince/CEActionsPocket.cpp:267
-#: backends/platform/wince/CEActionsSmartphone.cpp:231
-msgid "Do you want to load or save the game?"
-msgstr "Haluatko tallentaa vai ladata pelin?"
-
-#: backends/platform/wince/CEActionsPocket.cpp:326
-#: backends/platform/wince/CEActionsSmartphone.cpp:287
-msgid " Are you sure you want to quit ? "
-msgstr " Haluatko varmasti lopettaa?"
-
-#: backends/platform/wince/CEActionsSmartphone.cpp:50
-msgid "Keyboard"
-msgstr "Näppäimistö"
-
-#: backends/platform/wince/CEActionsSmartphone.cpp:51
-msgid "Rotate"
-msgstr "Käännä"
-
-#: backends/platform/wince/CELauncherDialog.cpp:56
-msgid "Using SDL driver "
-msgstr "Käytetään SDL:n ajuria"
-
-#: backends/platform/wince/CELauncherDialog.cpp:60
-msgid "Display "
-msgstr "Näyttö"
-
-#: backends/platform/wince/CELauncherDialog.cpp:83
-msgid "Do you want to perform an automatic scan ?"
-msgstr "Haluatko suorittaa automaattisen skannauksen?"
-
-#: backends/platform/wince/wince-sdl.cpp:515
-msgid "Map right click action"
-msgstr "Määritä oikeaklikkauksen toiminto"
-
-#: backends/platform/wince/wince-sdl.cpp:519
-msgid "You must map a key to the 'Right Click' action to play this game"
-msgstr ""
-"Hiiren oikealle klikkaukselle on määriteltävä näppäin, ennen kuin tätä peliä "
-"voi pelata"
-
-#: backends/platform/wince/wince-sdl.cpp:528
-msgid "Map hide toolbar action"
-msgstr "Määritä näppäin työkalupalkin piilottamiselle"
-
-#: backends/platform/wince/wince-sdl.cpp:532
-msgid "You must map a key to the 'Hide toolbar' action to play this game"
-msgstr ""
-"Työkalupalkin piilottamiselle on määriteltävä näppäin, ennen kuin tätä peliä "
-"voi pelata"
-
-#: backends/platform/wince/wince-sdl.cpp:541
-msgid "Map Zoom Up action (optional)"
-msgstr "Zoomaa karttaa ylös (valinnainen)"
-
-#: backends/platform/wince/wince-sdl.cpp:544
-msgid "Map Zoom Down action (optional)"
-msgstr "Zoomaa karttaa alas (valinnainen)"
-
-#: 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 ""
-"Muista määritellä näppäin työkalupalkin piilottamiselle, jotta voit nähdä "
-"koko tavaraluettelon"
-
-#: backends/events/default/default-events.cpp:193
-msgid "Do you really want to return to the Launcher?"
-msgstr "Haluatko varmasti palata pelivalitsimeen?"
-
-#: backends/events/default/default-events.cpp:193
-msgid "Launcher"
-msgstr "Pelivalitsin"
-
-#: backends/events/default/default-events.cpp:215
-msgid "Do you really want to quit?"
-msgstr "Haluatko varmasti lopettaa?"
-
-#: backends/events/gph/gph-events.cpp:386
-#: backends/events/gph/gph-events.cpp:429
-#: backends/events/openpandora/op-events.cpp:168
-msgid "Touchscreen 'Tap Mode' - Left Click"
-msgstr "Kosketusnäytön 'Tap moodi' - vasen klikkaus"
-
-#: backends/events/gph/gph-events.cpp:388
-#: backends/events/gph/gph-events.cpp:431
-#: backends/events/openpandora/op-events.cpp:170
-msgid "Touchscreen 'Tap Mode' - Right Click"
-msgstr "Kosketusnäytön 'Tap moodi' - oikea klikkaus"
-
-#: backends/events/gph/gph-events.cpp:390
-#: backends/events/gph/gph-events.cpp:433
-#: backends/events/openpandora/op-events.cpp:172
-msgid "Touchscreen 'Tap Mode' - Hover (No Click)"
-msgstr "Kosketusnäytön 'Tap moodi' - ei klikkausta"
-
-#: backends/events/gph/gph-events.cpp:410
-msgid "Maximum Volume"
-msgstr "Maksimi äänenvoimakkuus"
-
-#: backends/events/gph/gph-events.cpp:412
-msgid "Increasing Volume"
-msgstr "Nostetaan äänenvoimakkuutta"
-
-#: backends/events/gph/gph-events.cpp:418
-msgid "Minimal Volume"
-msgstr "Minimi äänenvoimakkuus"
-
-#: backends/events/gph/gph-events.cpp:420
-msgid "Decreasing Volume"
-msgstr "Lasketaan äänenvoimakkuutta"
-
-#: backends/events/openpandora/op-events.cpp:174
-#, fuzzy
-msgid "Touchscreen 'Tap Mode' - Hover (DPad Clicks)"
-msgstr "Kosketusnäytön 'Tap moodi' - ei klikkausta"
-
-#: backends/updates/macosx/macosx-updates.mm:67
-msgid "Check for Updates..."
-msgstr "Tarkista päivitykset..."
-
-#: backends/platform/bada/form.cpp:269
-msgid "Right Click Once"
-msgstr "Klikkaa oikealla kerran"
-
-#: backends/platform/bada/form.cpp:277
-msgid "Move Only"
-msgstr ""
-
-#: backends/platform/bada/form.cpp:291
-msgid "Escape Key"
-msgstr "Esc näppäin"
-
-#: backends/platform/bada/form.cpp:296
-msgid "Game Menu"
-msgstr "Pelivalikko"
-
-#: backends/platform/bada/form.cpp:301
-msgid "Show Keypad"
-msgstr "Näytä keypad"
-
-#: backends/platform/bada/form.cpp:309
-msgid "Control Mouse"
-msgstr "Ohjaa hiirtä"
-
-#: backends/events/maemosdl/maemosdl-events.cpp:192
-msgid "Clicking Enabled"
-msgstr "Klikkaus päällä"
-
-#: backends/events/maemosdl/maemosdl-events.cpp:192
-msgid "Clicking Disabled"
-msgstr "Klikkaus pois päältä"
+#~ msgid "Active filter mode: Nearest"
+#~ msgstr "Valittu filtteritila: Nearest"
#~ msgid "Enable Roland GS Mode"
#~ msgstr "Käytä Roland GS moodia"
diff --git a/po/fr_FR.po b/po/fr_FR.po
index a853d190aa..71406e472c 100644
--- a/po/fr_FR.po
+++ b/po/fr_FR.po
@@ -1,5 +1,5 @@
# French translation for ScummVM.
-# Copyright (C) 2010-2013 ScummVM Team
+# Copyright (C) 2010-2014 ScummVM Team
# This file is distributed under the same license as the ScummVM package.
# Thierry Crozat <criezy@scummvm.org>, 2011.
#
@@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: ScummVM 1.3.0svn\n"
"Report-Msgid-Bugs-To: scummvm-devel@lists.sf.net\n"
-"POT-Creation-Date: 2013-04-24 13:35+0100\n"
+"POT-Creation-Date: 2014-06-07 23:06+0100\n"
"PO-Revision-Date: 2013-04-26 12:24+0100\n"
"Last-Translator: Thierry Crozat <criezy@scummvm.org>\n"
"Language-Team: French <scummvm-devel@lists.sf.net>\n"
@@ -17,77 +17,77 @@ msgstr ""
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=n>1;\n"
-#: gui/about.cpp:93
+#: gui/about.cpp:94
#, c-format
msgid "(built on %s)"
msgstr "(compilé sur %s)"
-#: gui/about.cpp:100
+#: gui/about.cpp:101
msgid "Features compiled in:"
msgstr "Options incluses:"
-#: gui/about.cpp:109
+#: gui/about.cpp:110
msgid "Available engines:"
msgstr "Moteurs disponibles:"
-#: gui/browser.cpp:67
+#: gui/browser.cpp:68
msgid "Show hidden files"
msgstr "Afficher les fichiers cachés"
-#: gui/browser.cpp:67
+#: gui/browser.cpp:68
msgid "Show files marked with the hidden attribute"
msgstr "Affiche les fichiers marqués avec l'attribut invisible"
-#: gui/browser.cpp:71
+#: gui/browser.cpp:72
msgid "Go up"
msgstr "Remonter"
-#: gui/browser.cpp:71 gui/browser.cpp:73
+#: gui/browser.cpp:72 gui/browser.cpp:74
msgid "Go to previous directory level"
msgstr "Remonte d'un niveau dans la hiérarchie de répertoire"
-#: gui/browser.cpp:73
+#: gui/browser.cpp:74
msgctxt "lowres"
msgid "Go up"
msgstr "Remonter"
-#: gui/browser.cpp:74 gui/chooser.cpp:45 gui/KeysDialog.cpp:43
-#: gui/launcher.cpp:345 gui/massadd.cpp:94 gui/options.cpp:1238
-#: gui/saveload-dialog.cpp:215 gui/saveload-dialog.cpp:275
-#: gui/saveload-dialog.cpp:545 gui/saveload-dialog.cpp:919
-#: gui/themebrowser.cpp:54 gui/fluidsynth-dialog.cpp:151
-#: engines/engine.cpp:447 engines/drascula/saveload.cpp:51
-#: engines/scumm/dialogs.cpp:190 engines/sword1/control.cpp:865
-#: engines/parallaction/saveload.cpp:274 backends/platform/wii/options.cpp:48
-#: backends/events/default/default-events.cpp:193
-#: backends/events/default/default-events.cpp:215
+#: gui/browser.cpp:75 gui/chooser.cpp:46 gui/KeysDialog.cpp:43
+#: gui/launcher.cpp:351 gui/massadd.cpp:95 gui/options.cpp:1239
+#: gui/saveload-dialog.cpp:216 gui/saveload-dialog.cpp:276
+#: gui/saveload-dialog.cpp:547 gui/saveload-dialog.cpp:922
+#: gui/themebrowser.cpp:55 gui/fluidsynth-dialog.cpp:152
+#: engines/engine.cpp:452 backends/platform/wii/options.cpp:48
+#: backends/events/default/default-events.cpp:196
+#: backends/events/default/default-events.cpp:218
+#: engines/drascula/saveload.cpp:49 engines/parallaction/saveload.cpp:274
+#: engines/scumm/dialogs.cpp:191 engines/sword1/control.cpp:865
msgid "Cancel"
msgstr "Annuler"
-#: gui/browser.cpp:75 gui/chooser.cpp:46 gui/themebrowser.cpp:55
+#: gui/browser.cpp:76 gui/chooser.cpp:47 gui/themebrowser.cpp:56
msgid "Choose"
msgstr "Choisir"
-#: gui/gui-manager.cpp:115 engines/scumm/help.cpp:125
-#: engines/scumm/help.cpp:140 engines/scumm/help.cpp:165
-#: engines/scumm/help.cpp:191 engines/scumm/help.cpp:209
-#: backends/keymapper/remap-dialog.cpp:52
+#: gui/gui-manager.cpp:117 backends/keymapper/remap-dialog.cpp:53
+#: engines/scumm/help.cpp:125 engines/scumm/help.cpp:140
+#: engines/scumm/help.cpp:165 engines/scumm/help.cpp:191
+#: engines/scumm/help.cpp:209
msgid "Close"
msgstr "Fermer"
-#: gui/gui-manager.cpp:118
+#: gui/gui-manager.cpp:120
msgid "Mouse click"
msgstr "Clic de souris"
-#: gui/gui-manager.cpp:122 base/main.cpp:301
+#: gui/gui-manager.cpp:124 base/main.cpp:319
msgid "Display keyboard"
msgstr "Afficher le clavier"
-#: gui/gui-manager.cpp:126 base/main.cpp:305
+#: gui/gui-manager.cpp:128 base/main.cpp:323
msgid "Remap keys"
msgstr "Changer l'affectation des touches"
-#: gui/gui-manager.cpp:129 base/main.cpp:308
+#: gui/gui-manager.cpp:131 base/main.cpp:326
msgid "Toggle FullScreen"
msgstr "Basculer en plein écran"
@@ -99,21 +99,21 @@ msgstr "Sélectionnez une action à affecter"
msgid "Map"
msgstr "Affecter"
-#: gui/KeysDialog.cpp:42 gui/launcher.cpp:346 gui/launcher.cpp:1001
-#: gui/launcher.cpp:1005 gui/massadd.cpp:91 gui/options.cpp:1239
-#: gui/saveload-dialog.cpp:920 gui/fluidsynth-dialog.cpp:152
-#: engines/engine.cpp:366 engines/engine.cpp:377
-#: engines/drascula/saveload.cpp:51 engines/scumm/dialogs.cpp:192
-#: engines/scumm/scumm.cpp:1778 engines/agos/animation.cpp:558
-#: engines/groovie/script.cpp:420 engines/sky/compact.cpp:131
-#: engines/sky/compact.cpp:141 engines/sword1/animation.cpp:519
-#: engines/sword1/animation.cpp:540 engines/sword1/animation.cpp:550
-#: engines/sword1/animation.cpp:557 engines/sword1/control.cpp:865
-#: engines/sword1/logic.cpp:1633 engines/sword2/animation.cpp:419
-#: engines/sword2/animation.cpp:439 engines/sword2/animation.cpp:449
-#: engines/sword2/animation.cpp:458 engines/parallaction/saveload.cpp:274
+#: gui/KeysDialog.cpp:42 gui/launcher.cpp:352 gui/launcher.cpp:1048
+#: gui/launcher.cpp:1052 gui/massadd.cpp:92 gui/options.cpp:1240
+#: gui/saveload-dialog.cpp:923 gui/fluidsynth-dialog.cpp:153
+#: engines/engine.cpp:371 engines/engine.cpp:382
#: backends/platform/wii/options.cpp:47
#: backends/platform/wince/CELauncherDialog.cpp:54
+#: engines/agos/animation.cpp:558 engines/drascula/saveload.cpp:49
+#: engines/groovie/script.cpp:399 engines/parallaction/saveload.cpp:274
+#: engines/scumm/dialogs.cpp:193 engines/scumm/scumm.cpp:1779
+#: engines/sky/compact.cpp:131 engines/sky/compact.cpp:141
+#: engines/sword1/animation.cpp:524 engines/sword1/animation.cpp:545
+#: engines/sword1/animation.cpp:561 engines/sword1/animation.cpp:569
+#: engines/sword1/control.cpp:865 engines/sword1/logic.cpp:1633
+#: engines/sword2/animation.cpp:425 engines/sword2/animation.cpp:445
+#: engines/sword2/animation.cpp:461 engines/sword2/animation.cpp:471
msgid "OK"
msgstr "OK"
@@ -139,15 +139,15 @@ msgstr "Selectionnez une action"
msgid "Press the key to associate"
msgstr "Appuyez sur la touche à associer"
-#: gui/launcher.cpp:187
+#: gui/launcher.cpp:193
msgid "Game"
msgstr "Jeu"
-#: gui/launcher.cpp:191
+#: gui/launcher.cpp:197
msgid "ID:"
msgstr "ID:"
-#: gui/launcher.cpp:191 gui/launcher.cpp:193 gui/launcher.cpp:194
+#: gui/launcher.cpp:197 gui/launcher.cpp:199 gui/launcher.cpp:200
msgid ""
"Short game identifier used for referring to savegames and running the game "
"from the command line"
@@ -155,29 +155,29 @@ msgstr ""
"ID compact du jeu utilisée pour identifier les sauvegardes et démarrer le "
"jeu depuis la ligne de commande"
-#: gui/launcher.cpp:193
+#: gui/launcher.cpp:199
msgctxt "lowres"
msgid "ID:"
msgstr "ID:"
-#: gui/launcher.cpp:198
+#: gui/launcher.cpp:204
msgid "Name:"
msgstr "Nom:"
-#: gui/launcher.cpp:198 gui/launcher.cpp:200 gui/launcher.cpp:201
+#: gui/launcher.cpp:204 gui/launcher.cpp:206 gui/launcher.cpp:207
msgid "Full title of the game"
msgstr "Nom complet du jeu"
-#: gui/launcher.cpp:200
+#: gui/launcher.cpp:206
msgctxt "lowres"
msgid "Name:"
msgstr "Nom:"
-#: gui/launcher.cpp:204
+#: gui/launcher.cpp:210
msgid "Language:"
msgstr "Langue:"
-#: gui/launcher.cpp:204 gui/launcher.cpp:205
+#: gui/launcher.cpp:210 gui/launcher.cpp:211
msgid ""
"Language of the game. This will not turn your Spanish game version into "
"English"
@@ -185,287 +185,288 @@ msgstr ""
"Langue du jeu. Cela ne traduira pas en anglais par magie votre version "
"espagnole du jeu."
-#: gui/launcher.cpp:206 gui/launcher.cpp:220 gui/options.cpp:86
-#: gui/options.cpp:736 gui/options.cpp:749 gui/options.cpp:1209
-#: audio/null.cpp:40
+#: gui/launcher.cpp:212 gui/launcher.cpp:226 gui/options.cpp:87
+#: gui/options.cpp:737 gui/options.cpp:750 gui/options.cpp:1210
+#: audio/null.cpp:41
msgid "<default>"
msgstr "<defaut>"
-#: gui/launcher.cpp:216
+#: gui/launcher.cpp:222
msgid "Platform:"
msgstr "Plateforme:"
-#: gui/launcher.cpp:216 gui/launcher.cpp:218 gui/launcher.cpp:219
+#: gui/launcher.cpp:222 gui/launcher.cpp:224 gui/launcher.cpp:225
msgid "Platform the game was originally designed for"
msgstr "Plateforme pour laquelle votre jeu a été conçu"
-#: gui/launcher.cpp:218
+#: gui/launcher.cpp:224
msgctxt "lowres"
msgid "Platform:"
msgstr "Système:"
-#: gui/launcher.cpp:231
+#: gui/launcher.cpp:237
msgid "Engine"
msgstr "Moteur"
-#: gui/launcher.cpp:239 gui/options.cpp:1072 gui/options.cpp:1089
+#: gui/launcher.cpp:245 gui/options.cpp:1073 gui/options.cpp:1090
msgid "Graphics"
msgstr "Graphique"
-#: gui/launcher.cpp:239 gui/options.cpp:1072 gui/options.cpp:1089
+#: gui/launcher.cpp:245 gui/options.cpp:1073 gui/options.cpp:1090
msgid "GFX"
msgstr "GFX"
-#: gui/launcher.cpp:242
+#: gui/launcher.cpp:248
msgid "Override global graphic settings"
msgstr "Utiliser des réglages graphiques spécifiques à ce jeux"
-#: gui/launcher.cpp:244
+#: gui/launcher.cpp:250
msgctxt "lowres"
msgid "Override global graphic settings"
msgstr "Réglages spécifiques à ce jeux"
-#: gui/launcher.cpp:251 gui/options.cpp:1095
+#: gui/launcher.cpp:257 gui/options.cpp:1096
msgid "Audio"
msgstr "Audio"
-#: gui/launcher.cpp:254
+#: gui/launcher.cpp:260
msgid "Override global audio settings"
msgstr "Utiliser des réglages audio spécifiques à ce jeux"
-#: gui/launcher.cpp:256
+#: gui/launcher.cpp:262
msgctxt "lowres"
msgid "Override global audio settings"
msgstr "Réglages spécifiques à ce jeux"
-#: gui/launcher.cpp:265 gui/options.cpp:1100
+#: gui/launcher.cpp:271 gui/options.cpp:1101
msgid "Volume"
msgstr "Volume"
-#: gui/launcher.cpp:267 gui/options.cpp:1102
+#: gui/launcher.cpp:273 gui/options.cpp:1103
msgctxt "lowres"
msgid "Volume"
msgstr "Volume"
-#: gui/launcher.cpp:270
+#: gui/launcher.cpp:276
msgid "Override global volume settings"
msgstr "Utiliser des réglages de volume sonore spécifiques à ce jeux"
-#: gui/launcher.cpp:272
+#: gui/launcher.cpp:278
msgctxt "lowres"
msgid "Override global volume settings"
msgstr "Réglages spécifiques à ce jeux"
-#: gui/launcher.cpp:280 gui/options.cpp:1110
+#: gui/launcher.cpp:286 gui/options.cpp:1111
msgid "MIDI"
msgstr "MIDI"
-#: gui/launcher.cpp:283
+#: gui/launcher.cpp:289
msgid "Override global MIDI settings"
msgstr "Utiliser des réglages MIDI spécifiques à ce jeux"
-#: gui/launcher.cpp:285
+#: gui/launcher.cpp:291
msgctxt "lowres"
msgid "Override global MIDI settings"
msgstr "Réglages spécifiques à ce jeux"
-#: gui/launcher.cpp:294 gui/options.cpp:1116
+#: gui/launcher.cpp:300 gui/options.cpp:1117
msgid "MT-32"
msgstr "MT-32"
-#: gui/launcher.cpp:297
+#: gui/launcher.cpp:303
msgid "Override global MT-32 settings"
msgstr "Utiliser des réglages MT-32 spécifiques à ce jeux"
-#: gui/launcher.cpp:299
+#: gui/launcher.cpp:305
msgctxt "lowres"
msgid "Override global MT-32 settings"
msgstr "Réglages spécifiques à ce jeux"
-#: gui/launcher.cpp:308 gui/options.cpp:1123
+#: gui/launcher.cpp:314 gui/options.cpp:1124
msgid "Paths"
msgstr "Chemins"
-#: gui/launcher.cpp:310 gui/options.cpp:1125
+#: gui/launcher.cpp:316 gui/options.cpp:1126
msgctxt "lowres"
msgid "Paths"
msgstr "Chemins"
-#: gui/launcher.cpp:317
+#: gui/launcher.cpp:323
msgid "Game Path:"
msgstr "Chemin du Jeu:"
-#: gui/launcher.cpp:319
+#: gui/launcher.cpp:325
msgctxt "lowres"
msgid "Game Path:"
msgstr "Chemin du Jeu:"
-#: gui/launcher.cpp:324 gui/options.cpp:1149
+#: gui/launcher.cpp:330 gui/options.cpp:1150
msgid "Extra Path:"
msgstr "Extra:"
-#: gui/launcher.cpp:324 gui/launcher.cpp:326 gui/launcher.cpp:327
+#: gui/launcher.cpp:330 gui/launcher.cpp:332 gui/launcher.cpp:333
msgid "Specifies path to additional data used the game"
msgstr "Définie un chemin vers des données suplémentaires utilisées par le jeu"
-#: gui/launcher.cpp:326 gui/options.cpp:1151
+#: gui/launcher.cpp:332 gui/options.cpp:1152
msgctxt "lowres"
msgid "Extra Path:"
msgstr "Extra:"
-#: gui/launcher.cpp:333 gui/options.cpp:1133
+#: gui/launcher.cpp:339 gui/options.cpp:1134
msgid "Save Path:"
msgstr "Sauvegardes:"
-#: gui/launcher.cpp:333 gui/launcher.cpp:335 gui/launcher.cpp:336
-#: gui/options.cpp:1133 gui/options.cpp:1135 gui/options.cpp:1136
+#: gui/launcher.cpp:339 gui/launcher.cpp:341 gui/launcher.cpp:342
+#: gui/options.cpp:1134 gui/options.cpp:1136 gui/options.cpp:1137
msgid "Specifies where your savegames are put"
msgstr "Définie l'emplacement où les fichiers de sauvegarde sont créés"
-#: gui/launcher.cpp:335 gui/options.cpp:1135
+#: gui/launcher.cpp:341 gui/options.cpp:1136
msgctxt "lowres"
msgid "Save Path:"
msgstr "Sauvegardes:"
-#: gui/launcher.cpp:354 gui/launcher.cpp:453 gui/launcher.cpp:511
-#: gui/launcher.cpp:565 gui/options.cpp:1144 gui/options.cpp:1152
-#: gui/options.cpp:1161 gui/options.cpp:1276 gui/options.cpp:1282
-#: gui/options.cpp:1290 gui/options.cpp:1320 gui/options.cpp:1326
-#: gui/options.cpp:1333 gui/options.cpp:1426 gui/options.cpp:1429
-#: gui/options.cpp:1441
+#: gui/launcher.cpp:360 gui/launcher.cpp:459 gui/launcher.cpp:517
+#: gui/launcher.cpp:571 gui/options.cpp:1145 gui/options.cpp:1153
+#: gui/options.cpp:1162 gui/options.cpp:1277 gui/options.cpp:1283
+#: gui/options.cpp:1291 gui/options.cpp:1321 gui/options.cpp:1327
+#: gui/options.cpp:1334 gui/options.cpp:1427 gui/options.cpp:1430
+#: gui/options.cpp:1442
msgctxt "path"
msgid "None"
msgstr "Aucun"
-#: gui/launcher.cpp:359 gui/launcher.cpp:459 gui/launcher.cpp:569
-#: gui/options.cpp:1270 gui/options.cpp:1314 gui/options.cpp:1432
+#: gui/launcher.cpp:365 gui/launcher.cpp:465 gui/launcher.cpp:575
+#: gui/options.cpp:1271 gui/options.cpp:1315 gui/options.cpp:1433
#: backends/platform/wii/options.cpp:56
msgid "Default"
msgstr "Défaut"
-#: gui/launcher.cpp:504 gui/options.cpp:1435
+#: gui/launcher.cpp:510 gui/options.cpp:1436
msgid "Select SoundFont"
msgstr "Choisir une banque de sons"
-#: gui/launcher.cpp:523 gui/launcher.cpp:677
+#: gui/launcher.cpp:529 gui/launcher.cpp:682
msgid "Select directory with game data"
msgstr "Sélectionner le répertoire contenant les données du jeu"
-#: gui/launcher.cpp:541
+#: gui/launcher.cpp:547
msgid "Select additional game directory"
msgstr "Sélectionner un répertoire supplémentaire"
-#: gui/launcher.cpp:553
+#: gui/launcher.cpp:559
msgid "Select directory for saved games"
msgstr "Sélectionner le répertoire pour les sauvegardes"
-#: gui/launcher.cpp:580
+#: gui/launcher.cpp:586
msgid "This game ID is already taken. Please choose another one."
msgstr "Cet ID est déjà utilisé par un autre jeu. Choisissez en un autre svp."
-#: gui/launcher.cpp:621 engines/dialogs.cpp:110
+#: gui/launcher.cpp:626 engines/dialogs.cpp:111
msgid "~Q~uit"
msgstr "~Q~uitter"
-#: gui/launcher.cpp:621 backends/platform/sdl/macosx/appmenu_osx.mm:95
+#: gui/launcher.cpp:626 backends/platform/sdl/macosx/appmenu_osx.mm:95
msgid "Quit ScummVM"
msgstr "Quitter ScummVM"
-#: gui/launcher.cpp:622
+#: gui/launcher.cpp:627
msgid "A~b~out..."
msgstr "À ~P~ropos..."
-#: gui/launcher.cpp:622 backends/platform/sdl/macosx/appmenu_osx.mm:69
+#: gui/launcher.cpp:627 backends/platform/sdl/macosx/appmenu_osx.mm:69
msgid "About ScummVM"
msgstr "À propos de ScummVM"
-#: gui/launcher.cpp:623
+#: gui/launcher.cpp:628
msgid "~O~ptions..."
msgstr "~O~ptions..."
-#: gui/launcher.cpp:623
+#: gui/launcher.cpp:628
msgid "Change global ScummVM options"
msgstr "Change les options globales de ScummVM"
-#: gui/launcher.cpp:625
+#: gui/launcher.cpp:630
msgid "~S~tart"
msgstr "~D~émarrer"
-#: gui/launcher.cpp:625
+#: gui/launcher.cpp:630
msgid "Start selected game"
msgstr "Démarre le jeu sélectionné"
-#: gui/launcher.cpp:628
+#: gui/launcher.cpp:633
msgid "~L~oad..."
msgstr "~C~harger"
-#: gui/launcher.cpp:628
+#: gui/launcher.cpp:633
msgid "Load savegame for selected game"
msgstr "Charge une sauvegarde pour le jeu sélectionné"
-#: gui/launcher.cpp:633 gui/launcher.cpp:1120
+#: gui/launcher.cpp:638
msgid "~A~dd Game..."
msgstr "~A~jouter..."
-#: gui/launcher.cpp:633 gui/launcher.cpp:640
+#: gui/launcher.cpp:638 gui/launcher.cpp:645
msgid "Hold Shift for Mass Add"
msgstr ""
"Ajoute un jeu à la Liste. Maintenez Shift enfoncée pour un Ajout Massif"
-#: gui/launcher.cpp:635
+#: gui/launcher.cpp:640
msgid "~E~dit Game..."
msgstr "~E~diter..."
-#: gui/launcher.cpp:635 gui/launcher.cpp:642
+#: gui/launcher.cpp:640 gui/launcher.cpp:647
msgid "Change game options"
msgstr "Change les options du jeu"
-#: gui/launcher.cpp:637
+#: gui/launcher.cpp:642
msgid "~R~emove Game"
msgstr "~S~upprimer"
-#: gui/launcher.cpp:637 gui/launcher.cpp:644
+#: gui/launcher.cpp:642 gui/launcher.cpp:649
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:640 gui/launcher.cpp:1120
+#: gui/launcher.cpp:645
msgctxt "lowres"
msgid "~A~dd Game..."
msgstr "~A~jouter..."
-#: gui/launcher.cpp:642
+#: gui/launcher.cpp:647
msgctxt "lowres"
msgid "~E~dit Game..."
msgstr "~E~diter..."
-#: gui/launcher.cpp:644
+#: gui/launcher.cpp:649
msgctxt "lowres"
msgid "~R~emove Game"
msgstr "~S~upprimer"
-#: gui/launcher.cpp:652
+#: gui/launcher.cpp:657
msgid "Search in game list"
msgstr "Recherche dans la liste de jeux"
-#: gui/launcher.cpp:656 gui/launcher.cpp:1167
+#: gui/launcher.cpp:661 gui/launcher.cpp:1222
msgid "Search:"
msgstr "Filtre:"
-#: gui/launcher.cpp:680 engines/dialogs.cpp:114 engines/mohawk/myst.cpp:245
-#: engines/mohawk/riven.cpp:716 engines/cruise/menu.cpp:214
-#: engines/pegasus/pegasus.cpp:349
+#: gui/launcher.cpp:685 engines/dialogs.cpp:115 engines/cruise/menu.cpp:214
+#: engines/mohawk/myst.cpp:245 engines/mohawk/riven.cpp:718
+#: engines/pegasus/pegasus.cpp:353
msgid "Load game:"
msgstr "Charger le jeu:"
-#: gui/launcher.cpp:680 engines/dialogs.cpp:114 engines/scumm/dialogs.cpp:188
-#: engines/mohawk/myst.cpp:245 engines/mohawk/riven.cpp:716
-#: engines/cruise/menu.cpp:214 engines/pegasus/pegasus.cpp:349
+#: gui/launcher.cpp:685 engines/dialogs.cpp:115
#: backends/platform/wince/CEActionsPocket.cpp:267
#: backends/platform/wince/CEActionsSmartphone.cpp:231
+#: engines/cruise/menu.cpp:214 engines/mohawk/myst.cpp:245
+#: engines/mohawk/riven.cpp:718 engines/pegasus/pegasus.cpp:353
+#: engines/scumm/dialogs.cpp:189
msgid "Load"
msgstr "Charger"
-#: gui/launcher.cpp:788
+#: gui/launcher.cpp:792
msgid ""
"Do you really want to run the mass game detector? This could potentially add "
"a huge number of games."
@@ -473,7 +474,8 @@ msgstr ""
"Voulez-vous vraiment lancer la détection automatique des jeux ? Cela peut "
"potentiellement ajouter un grand nombre de jeux."
-#: gui/launcher.cpp:789 gui/launcher.cpp:937 gui/fluidsynth-dialog.cpp:216
+#: gui/launcher.cpp:793 gui/launcher.cpp:941 gui/launcher.cpp:1000
+#: gui/fluidsynth-dialog.cpp:217
#: backends/events/symbiansdl/symbiansdl-events.cpp:184
#: backends/platform/wince/CEActionsPocket.cpp:326
#: backends/platform/wince/CEActionsSmartphone.cpp:287
@@ -481,7 +483,8 @@ msgstr ""
msgid "Yes"
msgstr "Oui"
-#: gui/launcher.cpp:789 gui/launcher.cpp:937 gui/fluidsynth-dialog.cpp:216
+#: gui/launcher.cpp:793 gui/launcher.cpp:941 gui/launcher.cpp:1000
+#: gui/fluidsynth-dialog.cpp:217
#: backends/events/symbiansdl/symbiansdl-events.cpp:184
#: backends/platform/wince/CEActionsPocket.cpp:326
#: backends/platform/wince/CEActionsSmartphone.cpp:287
@@ -489,193 +492,188 @@ msgstr "Oui"
msgid "No"
msgstr "Non"
-#: gui/launcher.cpp:837
+#: gui/launcher.cpp:841
msgid "ScummVM couldn't open the specified directory!"
msgstr "ScummVM n'a pas pu ouvrir le répertoire sélectionné."
-#: gui/launcher.cpp:849
+#: gui/launcher.cpp:853
msgid "ScummVM could not find any game in the specified directory!"
msgstr "ScummVM n'a pas trouvé de jeux dans le répertoire sélectionné."
-#: gui/launcher.cpp:863
+#: gui/launcher.cpp:867
msgid "Pick the game:"
msgstr "Choisissez le jeu:"
-#: gui/launcher.cpp:937
+#: gui/launcher.cpp:941
msgid "Do you really want to remove this game configuration?"
msgstr "Voulez-vous vraiment supprimer ce jeu ?"
-#: gui/launcher.cpp:1001
+#: gui/launcher.cpp:999
+#, fuzzy
+msgid "Do you want to load savegame?"
+msgstr "Voulez-vous charger ou enregistrer le jeu ?"
+
+#: gui/launcher.cpp:1048
msgid "This game does not support loading games from the launcher."
msgstr ""
"Le chargement de sauvegarde depuis le lanceur n'est pas supporté pour ce jeu."
-#: gui/launcher.cpp:1005
+#: gui/launcher.cpp:1052
msgid "ScummVM could not find any engine capable of running the selected game!"
msgstr "ScummVM n'a pas pu trouvé de moteur pour lancer le jeu sélectionné."
-#: gui/launcher.cpp:1119
-msgctxt "lowres"
-msgid "Mass Add..."
-msgstr "Ajout Massif..."
-
-#: gui/launcher.cpp:1119
-msgid "Mass Add..."
-msgstr "Ajout Massif..."
-
-#: gui/massadd.cpp:78 gui/massadd.cpp:81
+#: gui/massadd.cpp:79 gui/massadd.cpp:82
msgid "... progress ..."
msgstr "... en cours ..."
-#: gui/massadd.cpp:258
+#: gui/massadd.cpp:259
msgid "Scan complete!"
msgstr "Examen terminé!"
-#: gui/massadd.cpp:261
+#: gui/massadd.cpp:262
#, c-format
msgid "Discovered %d new games, ignored %d previously added games."
msgstr "%d nouveaux jeux trouvés, %d jeux ignorés (déjà ajoutés précédemment)."
-#: gui/massadd.cpp:265
+#: gui/massadd.cpp:266
#, c-format
msgid "Scanned %d directories ..."
msgstr "%d répertoires examinés ..."
-#: gui/massadd.cpp:268
+#: gui/massadd.cpp:269
#, c-format
msgid "Discovered %d new games, ignored %d previously added games ..."
msgstr ""
"%d nouveaux jeux trouvés, %d jeux ignorés (déjà ajouté précédemment) ..."
-#: gui/options.cpp:84
+#: gui/options.cpp:85
msgid "Never"
msgstr "Jamais"
-#: gui/options.cpp:84
+#: gui/options.cpp:85
msgid "every 5 mins"
msgstr "Toutes les 5 mins"
-#: gui/options.cpp:84
+#: gui/options.cpp:85
msgid "every 10 mins"
msgstr "Toutes les 10 mins"
-#: gui/options.cpp:84
+#: gui/options.cpp:85
msgid "every 15 mins"
msgstr "Toutes les 15 mins"
-#: gui/options.cpp:84
+#: gui/options.cpp:85
msgid "every 30 mins"
msgstr "Toutes les 30 mins"
-#: gui/options.cpp:86
+#: gui/options.cpp:87
msgid "8 kHz"
msgstr "8 kHz"
-#: gui/options.cpp:86
+#: gui/options.cpp:87
msgid "11kHz"
msgstr "11 kHz"
-#: gui/options.cpp:86
+#: gui/options.cpp:87
msgid "22 kHz"
msgstr "22 kHz"
-#: gui/options.cpp:86
+#: gui/options.cpp:87
msgid "44 kHz"
msgstr "44 kHz"
-#: gui/options.cpp:86
+#: gui/options.cpp:87
msgid "48 kHz"
msgstr "48 kHz"
-#: gui/options.cpp:254 gui/options.cpp:480 gui/options.cpp:581
-#: gui/options.cpp:650 gui/options.cpp:858
+#: gui/options.cpp:255 gui/options.cpp:481 gui/options.cpp:582
+#: gui/options.cpp:651 gui/options.cpp:859
msgctxt "soundfont"
msgid "None"
msgstr "Aucune"
-#: gui/options.cpp:388
+#: gui/options.cpp:389
msgid "Failed to apply some of the graphic options changes:"
msgstr "Certaines options graphiques n'ont pu être changées:"
-#: gui/options.cpp:400
+#: gui/options.cpp:401
msgid "the video mode could not be changed."
msgstr "le mode vidéo n'a pu être changé."
-#: gui/options.cpp:406
+#: gui/options.cpp:407
msgid "the fullscreen setting could not be changed"
msgstr "le mode plein écran n'a pu être changé."
-#: gui/options.cpp:412
+#: gui/options.cpp:413
msgid "the aspect ratio setting could not be changed"
msgstr "la correction de rapport d'aspect n'a pu être changée."
-#: gui/options.cpp:733
+#: gui/options.cpp:734
msgid "Graphics mode:"
msgstr "Mode graphique:"
-#: gui/options.cpp:747
+#: gui/options.cpp:748
msgid "Render mode:"
msgstr "Mode de rendu:"
-#: gui/options.cpp:747 gui/options.cpp:748
+#: gui/options.cpp:748 gui/options.cpp:749
msgid "Special dithering modes supported by some games"
msgstr "Mode spécial de tramage supporté par certains jeux"
-#: gui/options.cpp:759
-#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2236
-#: backends/graphics/openglsdl/openglsdl-graphics.cpp:476
+#: gui/options.cpp:760
+#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2249
msgid "Fullscreen mode"
msgstr "Plein écran"
-#: gui/options.cpp:762
+#: gui/options.cpp:763
msgid "Aspect ratio correction"
msgstr "Correction du rapport d'aspect"
-#: gui/options.cpp:762
+#: gui/options.cpp:763
msgid "Correct aspect ratio for 320x200 games"
msgstr "Corrige le rapport d'aspect pour les jeu 320x200"
-#: gui/options.cpp:770
+#: gui/options.cpp:771
msgid "Preferred Device:"
msgstr "Sortie Préféré:"
-#: gui/options.cpp:770
+#: gui/options.cpp:771
msgid "Music Device:"
msgstr "Sortie Audio:"
-#: gui/options.cpp:770 gui/options.cpp:772
+#: gui/options.cpp:771 gui/options.cpp:773
msgid "Specifies preferred sound device or sound card emulator"
msgstr ""
"Spécifie le périphérique de sortie audio ou l'émulateur de carte audio "
"préféré"
-#: gui/options.cpp:770 gui/options.cpp:772 gui/options.cpp:773
+#: gui/options.cpp:771 gui/options.cpp:773 gui/options.cpp:774
msgid "Specifies output sound device or sound card emulator"
msgstr "Spécifie le périphérique de sortie audio ou l'émulateur de carte audio"
-#: gui/options.cpp:772
+#: gui/options.cpp:773
msgctxt "lowres"
msgid "Preferred Dev.:"
msgstr "Sortie Préféré:"
-#: gui/options.cpp:772
+#: gui/options.cpp:773
msgctxt "lowres"
msgid "Music Device:"
msgstr "Sortie Audio:"
-#: gui/options.cpp:799
+#: gui/options.cpp:800
msgid "AdLib emulator:"
msgstr "Émulateur AdLib:"
-#: gui/options.cpp:799 gui/options.cpp:800
+#: gui/options.cpp:800 gui/options.cpp:801
msgid "AdLib is used for music in many games"
msgstr "AdLib est utilisé pour la musique dans de nombreux jeux"
-#: gui/options.cpp:810
+#: gui/options.cpp:811
msgid "Output rate:"
msgstr "Fréquence:"
-#: gui/options.cpp:810 gui/options.cpp:811
+#: gui/options.cpp:811 gui/options.cpp:812
msgid ""
"Higher value specifies better sound quality but may be not supported by your "
"soundcard"
@@ -683,68 +681,68 @@ msgstr ""
"Une valeur plus élevée donne une meilleure qualité audio mais peut ne pas "
"être supporté par votre carte son"
-#: gui/options.cpp:821
+#: gui/options.cpp:822
msgid "GM Device:"
msgstr "Sortie GM:"
-#: gui/options.cpp:821
+#: gui/options.cpp:822
msgid "Specifies default sound device for General MIDI output"
msgstr "Spécifie le périphérique audio par défaut pour la sortie General MIDI"
-#: gui/options.cpp:832
+#: gui/options.cpp:833
msgid "Don't use General MIDI music"
msgstr "Ne pas utiliser la musique General MIDI"
-#: gui/options.cpp:843 gui/options.cpp:909
+#: gui/options.cpp:844 gui/options.cpp:910
msgid "Use first available device"
msgstr "Utiliser le premier périphérique disponible"
-#: gui/options.cpp:855
+#: gui/options.cpp:856
msgid "SoundFont:"
msgstr "Banque de sons:"
-#: gui/options.cpp:855 gui/options.cpp:857 gui/options.cpp:858
+#: gui/options.cpp:856 gui/options.cpp:858 gui/options.cpp:859
msgid "SoundFont is supported by some audio cards, Fluidsynth and Timidity"
msgstr ""
"La banque de sons (SoundFont) est utilisée par certaines cartes audio, "
"Fluidsynth et Timidity"
-#: gui/options.cpp:857
+#: gui/options.cpp:858
msgctxt "lowres"
msgid "SoundFont:"
msgstr "SoundFont:"
-#: gui/options.cpp:863
+#: gui/options.cpp:864
msgid "Mixed AdLib/MIDI mode"
msgstr "Mode mixe AdLib/MIDI"
-#: gui/options.cpp:863
+#: gui/options.cpp:864
msgid "Use both MIDI and AdLib sound generation"
msgstr "Utiliser à la fois MIDI et AdLib"
-#: gui/options.cpp:866
+#: gui/options.cpp:867
msgid "MIDI gain:"
msgstr "Gain MIDI:"
-#: gui/options.cpp:873
+#: gui/options.cpp:874
msgid "FluidSynth Settings"
msgstr "Paramètres FluidSynth"
-#: gui/options.cpp:880
+#: gui/options.cpp:881
msgid "MT-32 Device:"
msgstr "Sortie MT-32:"
-#: gui/options.cpp:880
+#: gui/options.cpp:881
msgid "Specifies default sound device for Roland MT-32/LAPC1/CM32l/CM64 output"
msgstr ""
"Spécifie le périphérique audio par défaut pour la sortie Roland MT-32/LAPC1/"
"CM32l/CM64"
-#: gui/options.cpp:885
+#: gui/options.cpp:886
msgid "True Roland MT-32 (disable GM emulation)"
msgstr "Roland MT-32 exacte (désactive l'émulation GM)"
-#: gui/options.cpp:885 gui/options.cpp:887
+#: gui/options.cpp:886 gui/options.cpp:888
msgid ""
"Check if you want to use your real hardware Roland-compatible sound device "
"connected to your computer"
@@ -752,195 +750,198 @@ msgstr ""
"Vérifie si vous voulez utiliser un périphérique audio compatible Roland "
"connecté à l'ordinateur"
-#: gui/options.cpp:887
+#: gui/options.cpp:888
msgctxt "lowres"
msgid "True Roland MT-32 (no GM emulation)"
msgstr "Roland MT-32 exacte (pas d'ému GM)"
-#: gui/options.cpp:890
-msgid "Roland GS Mode (disable GM mapping)"
+#: gui/options.cpp:891
+#, fuzzy
+msgid "Roland GS Device (enable MT-32 mappings)"
msgstr "Roland GS (désactive le mappage GM)"
-#: gui/options.cpp:890
-msgid "Turns off General MIDI mapping for games with Roland MT-32 soundtrack"
-msgstr "Désactiver la conversion des pistes MT-32 en General MIDI"
+#: gui/options.cpp:891
+msgid ""
+"Check if you want to enable patch mappings to emulate an MT-32 on a Roland "
+"GS device"
+msgstr ""
-#: gui/options.cpp:899
+#: gui/options.cpp:900
msgid "Don't use Roland MT-32 music"
msgstr "Ne pas utiliser la musique Roland MT-32"
-#: gui/options.cpp:926
+#: gui/options.cpp:927
msgid "Text and Speech:"
msgstr "Dialogue:"
-#: gui/options.cpp:930 gui/options.cpp:940
+#: gui/options.cpp:931 gui/options.cpp:941
msgid "Speech"
msgstr "Voix"
-#: gui/options.cpp:931 gui/options.cpp:941
+#: gui/options.cpp:932 gui/options.cpp:942
msgid "Subtitles"
msgstr "Sous-titres"
-#: gui/options.cpp:932
+#: gui/options.cpp:933
msgid "Both"
msgstr "Les deux"
-#: gui/options.cpp:934
+#: gui/options.cpp:935
msgid "Subtitle speed:"
msgstr "Vitesse des ST:"
-#: gui/options.cpp:936
+#: gui/options.cpp:937
msgctxt "lowres"
msgid "Text and Speech:"
msgstr "Dialogue:"
-#: gui/options.cpp:940
+#: gui/options.cpp:941
msgid "Spch"
msgstr "Voix"
-#: gui/options.cpp:941
+#: gui/options.cpp:942
msgid "Subs"
msgstr "Subs"
-#: gui/options.cpp:942
+#: gui/options.cpp:943
msgctxt "lowres"
msgid "Both"
msgstr "V&S"
-#: gui/options.cpp:942
+#: gui/options.cpp:943
msgid "Show subtitles and play speech"
msgstr "Affiche les sous-titres et joue les dialogues audio"
-#: gui/options.cpp:944
+#: gui/options.cpp:945
msgctxt "lowres"
msgid "Subtitle speed:"
msgstr "Vitesse des ST:"
-#: gui/options.cpp:960
+#: gui/options.cpp:961
msgid "Music volume:"
msgstr "Volume Musique:"
-#: gui/options.cpp:962
+#: gui/options.cpp:963
msgctxt "lowres"
msgid "Music volume:"
msgstr "Musique:"
-#: gui/options.cpp:969
+#: gui/options.cpp:970
msgid "Mute All"
msgstr "Silence"
-#: gui/options.cpp:972
+#: gui/options.cpp:973
msgid "SFX volume:"
msgstr "Volume Bruitage:"
-#: gui/options.cpp:972 gui/options.cpp:974 gui/options.cpp:975
+#: gui/options.cpp:973 gui/options.cpp:975 gui/options.cpp:976
msgid "Special sound effects volume"
msgstr "Volume des effets spéciaux sonores"
-#: gui/options.cpp:974
+#: gui/options.cpp:975
msgctxt "lowres"
msgid "SFX volume:"
msgstr "Bruitage:"
-#: gui/options.cpp:982
+#: gui/options.cpp:983
msgid "Speech volume:"
msgstr "Volume Dialogues:"
-#: gui/options.cpp:984
+#: gui/options.cpp:985
msgctxt "lowres"
msgid "Speech volume:"
msgstr "Dialogues:"
-#: gui/options.cpp:1141
+#: gui/options.cpp:1142
msgid "Theme Path:"
msgstr "Thèmes:"
-#: gui/options.cpp:1143
+#: gui/options.cpp:1144
msgctxt "lowres"
msgid "Theme Path:"
msgstr "Thèmes:"
-#: gui/options.cpp:1149 gui/options.cpp:1151 gui/options.cpp:1152
+#: gui/options.cpp:1150 gui/options.cpp:1152 gui/options.cpp:1153
msgid "Specifies path to additional data used by all games or ScummVM"
msgstr ""
"Spécifie un chemin vers des données supplémentaires utilisées par tous les "
"jeux ou ScummVM"
-#: gui/options.cpp:1158
+#: gui/options.cpp:1159
msgid "Plugins Path:"
msgstr "Plugins:"
-#: gui/options.cpp:1160
+#: gui/options.cpp:1161
msgctxt "lowres"
msgid "Plugins Path:"
msgstr "Plugins:"
-#: gui/options.cpp:1169 gui/fluidsynth-dialog.cpp:137
+#: gui/options.cpp:1170 gui/fluidsynth-dialog.cpp:138
msgid "Misc"
msgstr "Divers"
-#: gui/options.cpp:1171
+#: gui/options.cpp:1172
msgctxt "lowres"
msgid "Misc"
msgstr "Divers"
-#: gui/options.cpp:1173
+#: gui/options.cpp:1174
msgid "Theme:"
msgstr "Thème:"
-#: gui/options.cpp:1177
+#: gui/options.cpp:1178
msgid "GUI Renderer:"
msgstr "Interface:"
-#: gui/options.cpp:1189
+#: gui/options.cpp:1190
msgid "Autosave:"
msgstr "Sauvegarde auto:"
-#: gui/options.cpp:1191
+#: gui/options.cpp:1192
msgctxt "lowres"
msgid "Autosave:"
msgstr "Sauvegarde:"
-#: gui/options.cpp:1199
+#: gui/options.cpp:1200
msgid "Keys"
msgstr "Touches"
-#: gui/options.cpp:1206
+#: gui/options.cpp:1207
msgid "GUI Language:"
msgstr "Langue:"
-#: gui/options.cpp:1206
+#: gui/options.cpp:1207
msgid "Language of ScummVM GUI"
msgstr "Langue de l'interface graphique de ScummVM"
-#: gui/options.cpp:1365
+#: gui/options.cpp:1366
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."
-#: gui/options.cpp:1378
+#: gui/options.cpp:1379
msgid "Select directory for savegames"
msgstr "Sélectionner le répertoire pour les sauvegardes"
-#: gui/options.cpp:1385
+#: gui/options.cpp:1386
msgid "The chosen directory cannot be written to. Please select another one."
msgstr ""
"Le répertoire sélectionné est vérouillé en écriture. Sélectionnez un autre "
"répertoire."
-#: gui/options.cpp:1394
+#: gui/options.cpp:1395
msgid "Select directory for GUI themes"
msgstr "Sélectionner le répertoire des thèmes d'interface"
-#: gui/options.cpp:1404
+#: gui/options.cpp:1405
msgid "Select directory for extra files"
msgstr "Sélectionner le répertoire pour les fichiers suplémentaires"
-#: gui/options.cpp:1415
+#: gui/options.cpp:1416
msgid "Select directory for plugins"
msgstr "Sélectionner le répertoire des plugins"
-#: gui/options.cpp:1468
+#: gui/options.cpp:1469
msgid ""
"The theme you selected does not support your current language. If you want "
"to use this theme you need to switch to another language first."
@@ -948,222 +949,226 @@ msgstr ""
"Le thème que vous avez sélectioné ne support pas la langue française. Si "
"vous voulez l'utiliser vous devez d'abord changer de langue."
-#: gui/saveload-dialog.cpp:166
+#: gui/saveload-dialog.cpp:167
msgid "List view"
msgstr "Vue en liste"
-#: gui/saveload-dialog.cpp:167
+#: gui/saveload-dialog.cpp:168
msgid "Grid view"
msgstr "Vue en grille"
-#: gui/saveload-dialog.cpp:210 gui/saveload-dialog.cpp:358
+#: gui/saveload-dialog.cpp:211 gui/saveload-dialog.cpp:360
msgid "No date saved"
msgstr "Date inconnue"
-#: gui/saveload-dialog.cpp:211 gui/saveload-dialog.cpp:359
+#: gui/saveload-dialog.cpp:212 gui/saveload-dialog.cpp:361
msgid "No time saved"
msgstr "Heure inconnue"
-#: gui/saveload-dialog.cpp:212 gui/saveload-dialog.cpp:360
+#: gui/saveload-dialog.cpp:213 gui/saveload-dialog.cpp:362
msgid "No playtime saved"
msgstr "Durée de jeu inconnue"
-#: gui/saveload-dialog.cpp:219 gui/saveload-dialog.cpp:275
+#: gui/saveload-dialog.cpp:220 gui/saveload-dialog.cpp:276
msgid "Delete"
msgstr "Supprimer"
-#: gui/saveload-dialog.cpp:274
+#: gui/saveload-dialog.cpp:275
msgid "Do you really want to delete this savegame?"
msgstr "Voulez-vous vraiment supprimer cette sauvegarde ?"
-#: gui/saveload-dialog.cpp:383 gui/saveload-dialog.cpp:872
+#: gui/saveload-dialog.cpp:385 gui/saveload-dialog.cpp:875
msgid "Date: "
msgstr "Date: "
-#: gui/saveload-dialog.cpp:387 gui/saveload-dialog.cpp:878
+#: gui/saveload-dialog.cpp:389 gui/saveload-dialog.cpp:881
msgid "Time: "
msgstr "Heure: "
-#: gui/saveload-dialog.cpp:393 gui/saveload-dialog.cpp:886
+#: gui/saveload-dialog.cpp:395 gui/saveload-dialog.cpp:889
msgid "Playtime: "
msgstr "Durée de jeu: "
-#: gui/saveload-dialog.cpp:406 gui/saveload-dialog.cpp:494
+#: gui/saveload-dialog.cpp:408 gui/saveload-dialog.cpp:496
msgid "Untitled savestate"
msgstr "Sauvegarde sans nom"
-#: gui/saveload-dialog.cpp:546
+#: gui/saveload-dialog.cpp:548
msgid "Next"
msgstr "Suivant"
-#: gui/saveload-dialog.cpp:549
+#: gui/saveload-dialog.cpp:551
msgid "Prev"
msgstr "Précédent"
-#: gui/saveload-dialog.cpp:736
+#: gui/saveload-dialog.cpp:739
msgid "New Save"
msgstr "Nouvelle Sauvegarde"
-#: gui/saveload-dialog.cpp:736
+#: gui/saveload-dialog.cpp:739
msgid "Create a new save game"
msgstr "Crée une nouvelle sauvegarde."
-#: gui/saveload-dialog.cpp:865
+#: gui/saveload-dialog.cpp:868
msgid "Name: "
msgstr "Nom: "
-#: gui/saveload-dialog.cpp:937
+#: gui/saveload-dialog.cpp:940
#, c-format
msgid "Enter a description for slot %d:"
msgstr "Entrez une description pour l'emplacement %d:"
-#: gui/themebrowser.cpp:44
+#: gui/themebrowser.cpp:45
msgid "Select a Theme"
msgstr "Sélectionnez un Thème"
-#: gui/ThemeEngine.cpp:337
+#: gui/ThemeEngine.cpp:347
msgid "Disabled GFX"
msgstr "GFX désactivé"
-#: gui/ThemeEngine.cpp:337
+#: gui/ThemeEngine.cpp:347
msgctxt "lowres"
msgid "Disabled GFX"
msgstr "GFX désactivé"
-#: gui/ThemeEngine.cpp:338
-msgid "Standard Renderer (16bpp)"
+#: gui/ThemeEngine.cpp:348
+#, fuzzy
+msgid "Standard Renderer"
msgstr "Rendu Standard (16bpp)"
-#: gui/ThemeEngine.cpp:338
-msgid "Standard (16bpp)"
-msgstr "Standard (16bpp)"
+#: gui/ThemeEngine.cpp:348 engines/scumm/dialogs.cpp:659
+msgid "Standard"
+msgstr "Normal"
-#: gui/ThemeEngine.cpp:340
-msgid "Antialiased Renderer (16bpp)"
+#: gui/ThemeEngine.cpp:350
+#, fuzzy
+msgid "Antialiased Renderer"
msgstr "Rendu Anti-crénelé (16 bpp)"
-#: gui/ThemeEngine.cpp:340
-msgid "Antialiased (16bpp)"
+#: gui/ThemeEngine.cpp:350
+#, fuzzy
+msgid "Antialiased"
msgstr "Anti-crénelé (16 bpp)"
-#: gui/widget.cpp:322 gui/widget.cpp:324 gui/widget.cpp:330 gui/widget.cpp:332
+#: gui/widget.cpp:323 gui/widget.cpp:325 gui/widget.cpp:331 gui/widget.cpp:333
msgid "Clear value"
msgstr "Effacer la valeur"
-#: gui/fluidsynth-dialog.cpp:67
+#: gui/fluidsynth-dialog.cpp:68
msgid "Reverb"
msgstr "Réverb"
-#: gui/fluidsynth-dialog.cpp:69 gui/fluidsynth-dialog.cpp:101
+#: gui/fluidsynth-dialog.cpp:70 gui/fluidsynth-dialog.cpp:102
msgid "Active"
msgstr "Actif"
-#: gui/fluidsynth-dialog.cpp:71
+#: gui/fluidsynth-dialog.cpp:72
msgid "Room:"
msgstr "Pièce:"
-#: gui/fluidsynth-dialog.cpp:78
+#: gui/fluidsynth-dialog.cpp:79
msgid "Damp:"
msgstr "Atténuation:"
-#: gui/fluidsynth-dialog.cpp:85
+#: gui/fluidsynth-dialog.cpp:86
msgid "Width:"
msgstr "Largeur:"
-#: gui/fluidsynth-dialog.cpp:92 gui/fluidsynth-dialog.cpp:110
+#: gui/fluidsynth-dialog.cpp:93 gui/fluidsynth-dialog.cpp:111
msgid "Level:"
msgstr "Niveau:"
-#: gui/fluidsynth-dialog.cpp:99
+#: gui/fluidsynth-dialog.cpp:100
msgid "Chorus"
msgstr "Chorus"
-#: gui/fluidsynth-dialog.cpp:103
+#: gui/fluidsynth-dialog.cpp:104
msgid "N:"
msgstr "N:"
-#: gui/fluidsynth-dialog.cpp:117
+#: gui/fluidsynth-dialog.cpp:118
msgid "Speed:"
msgstr "Vitesse:"
-#: gui/fluidsynth-dialog.cpp:124
+#: gui/fluidsynth-dialog.cpp:125
msgid "Depth:"
msgstr "Profondeur:"
-#: gui/fluidsynth-dialog.cpp:131
+#: gui/fluidsynth-dialog.cpp:132
msgid "Type:"
msgstr "Type:"
-#: gui/fluidsynth-dialog.cpp:134
+#: gui/fluidsynth-dialog.cpp:135
msgid "Sine"
msgstr "Sinus"
-#: gui/fluidsynth-dialog.cpp:135
+#: gui/fluidsynth-dialog.cpp:136
msgid "Triangle"
msgstr "Triangle"
-#: gui/fluidsynth-dialog.cpp:139
+#: gui/fluidsynth-dialog.cpp:140
msgid "Interpolation:"
msgstr "Interpolation:"
-#: gui/fluidsynth-dialog.cpp:142
+#: gui/fluidsynth-dialog.cpp:143
msgid "None (fastest)"
msgstr "Aucune (plus rapide)"
-#: gui/fluidsynth-dialog.cpp:143
+#: gui/fluidsynth-dialog.cpp:144
msgid "Linear"
msgstr "Linéaire"
-#: gui/fluidsynth-dialog.cpp:144
+#: gui/fluidsynth-dialog.cpp:145
msgid "Fourth-order"
msgstr "Quatrième degré"
-#: gui/fluidsynth-dialog.cpp:145
+#: gui/fluidsynth-dialog.cpp:146
msgid "Seventh-order"
msgstr "Septième degré"
-#: gui/fluidsynth-dialog.cpp:149
+#: gui/fluidsynth-dialog.cpp:150
msgid "Reset"
msgstr "Réinitialiser"
-#: gui/fluidsynth-dialog.cpp:149
+#: gui/fluidsynth-dialog.cpp:150
msgid "Reset all FluidSynth settings to their default values."
msgstr "Remet tous les réglages à leurs valeurs par défaut."
-#: gui/fluidsynth-dialog.cpp:216
+#: gui/fluidsynth-dialog.cpp:217
msgid ""
"Do you really want to reset all FluidSynth settings to their default values?"
-msgstr "Voulez-vous vraiment remettre tous les réglages à leurs valeurs par défaut ?"
+msgstr ""
+"Voulez-vous vraiment remettre tous les réglages à leurs valeurs par défaut ?"
-#: base/main.cpp:210
+#: base/main.cpp:228
#, 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:288
+#: base/main.cpp:306
msgid "Menu"
msgstr "Menu"
-#: base/main.cpp:291 backends/platform/symbian/src/SymbianActions.cpp:45
+#: base/main.cpp:309 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:294 backends/platform/symbian/src/SymbianActions.cpp:50
+#: base/main.cpp:312 backends/platform/symbian/src/SymbianActions.cpp:50
#: backends/platform/wince/CEActionsPocket.cpp:42
msgid "Pause"
msgstr "Mettre en pause"
-#: base/main.cpp:297
+#: base/main.cpp:315
msgid "Skip line"
msgstr "Passer la phrase"
-#: base/main.cpp:468
+#: base/main.cpp:507
msgid "Error running game:"
msgstr "Erreur lors de l'éxécution du jeu:"
-#: base/main.cpp:492
+#: base/main.cpp:536
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é"
@@ -1231,74 +1236,74 @@ msgstr "Annuler par l'utilisateur"
msgid "Unknown error"
msgstr "Erreur inconnue"
-#: engines/advancedDetector.cpp:316
+#: engines/advancedDetector.cpp:317
#, c-format
msgid "The game in '%s' seems to be unknown."
msgstr "Le jeu dans '%s' n'est pas reconnu."
-#: engines/advancedDetector.cpp:317
+#: engines/advancedDetector.cpp:318
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:319
+#: engines/advancedDetector.cpp:320
msgid "of the game you tried to add and its version/language/etc.:"
msgstr "du jeu que vous avez essayé d'ajouter, sa version, le langage, etc..."
-#: engines/dialogs.cpp:84
+#: engines/dialogs.cpp:85
msgid "~R~esume"
msgstr "~R~eprendre"
-#: engines/dialogs.cpp:86
+#: engines/dialogs.cpp:87
msgid "~L~oad"
msgstr "~C~harger"
-#: engines/dialogs.cpp:90
+#: engines/dialogs.cpp:91
msgid "~S~ave"
msgstr "~S~auver"
-#: engines/dialogs.cpp:94
+#: engines/dialogs.cpp:95
msgid "~O~ptions"
msgstr "~O~ptions"
-#: engines/dialogs.cpp:99
+#: engines/dialogs.cpp:100
msgid "~H~elp"
msgstr "~A~ide"
-#: engines/dialogs.cpp:101
+#: engines/dialogs.cpp:102
msgid "~A~bout"
msgstr "À ~P~ropos"
-#: engines/dialogs.cpp:104 engines/dialogs.cpp:180
+#: engines/dialogs.cpp:105 engines/dialogs.cpp:181
msgid "~R~eturn to Launcher"
msgstr "Retour au ~L~anceur"
-#: engines/dialogs.cpp:106 engines/dialogs.cpp:182
+#: engines/dialogs.cpp:107 engines/dialogs.cpp:183
msgctxt "lowres"
msgid "~R~eturn to Launcher"
msgstr "Retour au ~L~anceur"
-#: engines/dialogs.cpp:115 engines/agi/saveload.cpp:803
-#: engines/drascula/saveload.cpp:338 engines/cruise/menu.cpp:212
-#: engines/sci/engine/kfile.cpp:742 engines/toltecs/menu.cpp:284
-#: engines/pegasus/pegasus.cpp:373
+#: engines/dialogs.cpp:116 engines/agi/saveload.cpp:803
+#: engines/cruise/menu.cpp:212 engines/drascula/saveload.cpp:336
+#: engines/neverhood/menumodule.cpp:873 engines/pegasus/pegasus.cpp:377
+#: engines/sci/engine/kfile.cpp:758 engines/toltecs/menu.cpp:281
msgid "Save game:"
msgstr "Sauvegarde:"
-#: engines/dialogs.cpp:115 engines/agi/saveload.cpp:803
-#: engines/drascula/saveload.cpp:338 engines/scumm/dialogs.cpp:187
-#: engines/cruise/menu.cpp:212 engines/sci/engine/kfile.cpp:742
-#: engines/toltecs/menu.cpp:284 engines/pegasus/pegasus.cpp:373
-#: backends/platform/symbian/src/SymbianActions.cpp:44
+#: engines/dialogs.cpp:116 backends/platform/symbian/src/SymbianActions.cpp:44
#: backends/platform/wince/CEActionsPocket.cpp:43
#: backends/platform/wince/CEActionsPocket.cpp:267
#: backends/platform/wince/CEActionsSmartphone.cpp:45
#: backends/platform/wince/CEActionsSmartphone.cpp:231
+#: engines/agi/saveload.cpp:803 engines/cruise/menu.cpp:212
+#: engines/drascula/saveload.cpp:336 engines/neverhood/menumodule.cpp:873
+#: engines/pegasus/pegasus.cpp:377 engines/sci/engine/kfile.cpp:758
+#: engines/scumm/dialogs.cpp:188 engines/toltecs/menu.cpp:281
msgid "Save"
msgstr "Sauver"
-#: engines/dialogs.cpp:144
+#: engines/dialogs.cpp:145
msgid ""
"Sorry, this engine does not currently provide in-game help. Please consult "
"the README for basic information, and for instructions on how to obtain "
@@ -1308,7 +1313,7 @@ msgstr ""
"fichier README pour les informations de base et les instructions pour "
"obtenir de l'aide supplémentaire."
-#: engines/dialogs.cpp:228
+#: engines/dialogs.cpp:234 engines/pegasus/pegasus.cpp:393
#, c-format
msgid ""
"Gamestate save failed (%s)! Please consult the README for basic information, "
@@ -1317,37 +1322,37 @@ msgstr ""
"Echec de la sauvegarde (%s)! Lisez le fichier README pour les informations "
"de base et les instructions pour obtenir de l'aide supplémentaire."
-#: engines/dialogs.cpp:301 engines/mohawk/dialogs.cpp:109
+#: engines/dialogs.cpp:307 engines/mohawk/dialogs.cpp:109
#: engines/mohawk/dialogs.cpp:170
msgid "~O~K"
msgstr "~O~K"
-#: engines/dialogs.cpp:302 engines/mohawk/dialogs.cpp:110
+#: engines/dialogs.cpp:308 engines/mohawk/dialogs.cpp:110
#: engines/mohawk/dialogs.cpp:171
msgid "~C~ancel"
msgstr "~A~nnuler"
-#: engines/dialogs.cpp:305
+#: engines/dialogs.cpp:311
msgid "~K~eys"
msgstr "~T~ouches"
-#: engines/engine.cpp:240
+#: engines/engine.cpp:245
msgid "Could not initialize color format."
msgstr "Impossible d'initialiser le format des couleurs."
-#: engines/engine.cpp:248
+#: engines/engine.cpp:253
msgid "Could not switch to video mode: '"
msgstr "Impossible de changer le mode vidéo à: '"
-#: engines/engine.cpp:257
+#: engines/engine.cpp:262
msgid "Could not apply aspect ratio setting."
msgstr "Impossible d'appliquer la correction du rapport d'aspect."
-#: engines/engine.cpp:262
+#: engines/engine.cpp:267
msgid "Could not apply fullscreen setting."
msgstr "Impossible d'appliquer l'option plein écran."
-#: engines/engine.cpp:362
+#: engines/engine.cpp:367
msgid ""
"You appear to be playing this game directly\n"
"from the CD. This is known to cause problems,\n"
@@ -1361,7 +1366,7 @@ msgstr ""
"données du jeu sur votre disque dur.\n"
"Lisez le fichier README pour plus de détails."
-#: engines/engine.cpp:373
+#: engines/engine.cpp:378
msgid ""
"This game has audio tracks in its disk. These\n"
"tracks need to be ripped from the disk using\n"
@@ -1375,7 +1380,7 @@ msgstr ""
"logiciel approprié.\n"
"Lisez le fichier README pour plus de détails."
-#: engines/engine.cpp:431
+#: engines/engine.cpp:436
#, c-format
msgid ""
"Gamestate load failed (%s)! Please consult the README for basic information, "
@@ -1384,7 +1389,7 @@ msgstr ""
"Echec du chargement (%s)! . Lisez le fichier README pour les informations de "
"base et les instructions pour obtenir de l'aide supplémentaire."
-#: engines/engine.cpp:444
+#: engines/engine.cpp:449
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 "
@@ -1394,35 +1399,764 @@ msgstr ""
"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:447
+#: engines/engine.cpp:452
msgid "Start anyway"
msgstr "Jouer quand même"
-#: engines/agi/detection.cpp:142 engines/drascula/detection.cpp:270
-#: engines/dreamweb/detection.cpp:47 engines/sci/detection.cpp:393
-#: engines/toltecs/detection.cpp:173
+#: audio/fmopl.cpp:50
+msgid "MAME OPL emulator"
+msgstr "Émulateur MAME OPL"
+
+#: audio/fmopl.cpp:52
+msgid "DOSBox OPL emulator"
+msgstr "Émulateur DOSBox OPL"
+
+#: audio/mididrv.cpp:209
+#, c-format
+msgid ""
+"The selected audio device '%s' was not found (e.g. might be turned off or "
+"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:209 audio/mididrv.cpp:221 audio/mididrv.cpp:257
+#: audio/mididrv.cpp:272
+msgid "Attempting to fall back to the next available device..."
+msgstr "Essaye d'utiliser le prochain périphérique disponible..."
+
+#: audio/mididrv.cpp:221
+#, c-format
+msgid ""
+"The selected audio device '%s' cannot be used. See log file for more "
+"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:257
+#, c-format
+msgid ""
+"The preferred audio device '%s' was not found (e.g. might be turned off or "
+"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:272
+#, c-format
+msgid ""
+"The preferred audio device '%s' cannot be used. See log file for more "
+"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:44
+msgid "No music"
+msgstr "Pas de musique"
+
+#: audio/mods/paula.cpp:196
+msgid "Amiga Audio Emulator"
+msgstr "Émulateur Amiga Audio"
+
+#: audio/softsynth/adlib.cpp:2285
+msgid "AdLib Emulator"
+msgstr "Émulateur AdLib"
+
+#: audio/softsynth/appleiigs.cpp:33
+msgid "Apple II GS Emulator (NOT IMPLEMENTED)"
+msgstr "Émulateur Apple II GS (PAS IMPLÉMENTÉ)"
+
+#: audio/softsynth/sid.cpp:1430
+msgid "C64 Audio Emulator"
+msgstr "Émulateur C64 Audio"
+
+#: audio/softsynth/mt32.cpp:200
+msgid "Initializing MT-32 Emulator"
+msgstr "Initialisation de l'Émulateur MT-32"
+
+#: audio/softsynth/mt32.cpp:426
+msgid "MT-32 Emulator"
+msgstr "Émulateur MT-32"
+
+#: audio/softsynth/pcspk.cpp:139
+msgid "PC Speaker Emulator"
+msgstr "Émulateur Haut Parleur PC"
+
+#: audio/softsynth/pcspk.cpp:158
+msgid "IBM PCjr Emulator"
+msgstr "Émulateur IBM PCjr"
+
+#: backends/keymapper/remap-dialog.cpp:48
+msgid "Keymap:"
+msgstr "Affectation des touches:"
+
+#: backends/keymapper/remap-dialog.cpp:67
+msgid " (Effective)"
+msgstr "(Effectif)"
+
+#: backends/keymapper/remap-dialog.cpp:107
+msgid " (Active)"
+msgstr "(Actif)"
+
+#: backends/keymapper/remap-dialog.cpp:107
+msgid " (Blocked)"
+msgstr "(Bloqué)"
+
+#: backends/keymapper/remap-dialog.cpp:120
+msgid " (Global)"
+msgstr "(Global)"
+
+#: backends/keymapper/remap-dialog.cpp:128
+msgid " (Game)"
+msgstr "(Jeu)"
+
+#: backends/midi/windows.cpp:165
+msgid "Windows MIDI"
+msgstr "MIDI Windows"
+
+#: backends/platform/ds/arm9/source/dsoptions.cpp:56
+#: engines/scumm/dialogs.cpp:291
+msgid "~C~lose"
+msgstr "~F~ermer"
+
+#: backends/platform/ds/arm9/source/dsoptions.cpp:57
+msgid "ScummVM Main Menu"
+msgstr "Menu Principal ScummVM"
+
+#: backends/platform/ds/arm9/source/dsoptions.cpp:63
+msgid "~L~eft handed mode"
+msgstr "Mode ~G~aucher"
+
+#: backends/platform/ds/arm9/source/dsoptions.cpp:64
+msgid "~I~ndy fight controls"
+msgstr "Contrôle des combats d'~I~ndy"
+
+#: backends/platform/ds/arm9/source/dsoptions.cpp:65
+msgid "Show mouse cursor"
+msgstr "Afficher le curseur de la souris"
+
+#: backends/platform/ds/arm9/source/dsoptions.cpp:66
+msgid "Snap to edges"
+msgstr "Aligner sur les bords"
+
+#: backends/platform/ds/arm9/source/dsoptions.cpp:68
+msgid "Touch X Offset"
+msgstr "Décalage X du toucher"
+
+#: backends/platform/ds/arm9/source/dsoptions.cpp:75
+msgid "Touch Y Offset"
+msgstr "Décallage Y du toucher"
+
+#: backends/platform/ds/arm9/source/dsoptions.cpp:87
+msgid "Use laptop trackpad-style cursor control"
+msgstr "Activer le contrôle du curseur de type trackpad"
+
+#: backends/platform/ds/arm9/source/dsoptions.cpp:88
+msgid "Tap for left click, double tap right click"
+msgstr "Toucher pour un clic gauche, toucher deux fois pour un clic droit"
+
+#: backends/platform/ds/arm9/source/dsoptions.cpp:90
+msgid "Sensitivity"
+msgstr "Sensibilité"
+
+#: backends/platform/ds/arm9/source/dsoptions.cpp:99
+msgid "Initial top screen scale:"
+msgstr "Échelle initiale de l'écran du haut"
+
+#: backends/platform/ds/arm9/source/dsoptions.cpp:105
+msgid "Main screen scaling:"
+msgstr "Échelle de l'écran principal"
+
+#: backends/platform/ds/arm9/source/dsoptions.cpp:107
+msgid "Hardware scale (fast, but low quality)"
+msgstr "Mise à l'echelle matérielle (rapide mais qualité faible)"
+
+#: backends/platform/ds/arm9/source/dsoptions.cpp:108
+msgid "Software scale (good quality, but slower)"
+msgstr "Mise à l'échelle logicielle (bonne qualité mais plus lent)"
+
+#: backends/platform/ds/arm9/source/dsoptions.cpp:109
+msgid "Unscaled (you must scroll left and right)"
+msgstr "Sans changement d'échelle (vous devez faire défiler l'écran)"
+
+#: backends/platform/ds/arm9/source/dsoptions.cpp:111
+msgid "Brightness:"
+msgstr "Luminosité:"
+
+#: backends/platform/ds/arm9/source/dsoptions.cpp:121
+msgid "High quality audio (slower) (reboot)"
+msgstr "Audio haute qualité (plus lent) (redémarrer)"
+
+#: backends/platform/ds/arm9/source/dsoptions.cpp:122
+msgid "Disable power off"
+msgstr "Désactivé l'extinction"
+
+#: backends/platform/iphone/osys_events.cpp:300
+msgid "Mouse-click-and-drag mode enabled."
+msgstr "Mode souris-cliquer-et-déplacer activé"
+
+#: backends/platform/iphone/osys_events.cpp:302
+msgid "Mouse-click-and-drag mode disabled."
+msgstr "Mode souris-cliquer-et-déplacer désactivé"
+
+#: backends/platform/iphone/osys_events.cpp:313
+msgid "Touchpad mode enabled."
+msgstr "Mode touchpad activé"
+
+#: backends/platform/iphone/osys_events.cpp:315
+msgid "Touchpad mode disabled."
+msgstr "Mode touchpad désactivé"
+
+#: backends/platform/maemo/maemo.cpp:209
+msgid "Click Mode"
+msgstr "Mode Clic"
+
+#: backends/platform/maemo/maemo.cpp:215
+#: backends/platform/symbian/src/SymbianActions.cpp:42
+#: backends/platform/wince/CEActionsPocket.cpp:60
+#: backends/platform/wince/CEActionsSmartphone.cpp:43
+#: backends/platform/tizen/form.cpp:275
+msgid "Left Click"
+msgstr "Clic Gauche"
+
+#: backends/platform/maemo/maemo.cpp:218
+msgid "Middle Click"
+msgstr "Clic Milieu"
+
+#: backends/platform/maemo/maemo.cpp:221
+#: backends/platform/symbian/src/SymbianActions.cpp:43
+#: backends/platform/wince/CEActionsSmartphone.cpp:44
+#: backends/platform/tizen/form.cpp:267
+msgid "Right Click"
+msgstr "Clic Droit"
+
+#: backends/platform/sdl/macosx/appmenu_osx.mm:77
+msgid "Hide ScummVM"
+msgstr "Masquer ScummVM"
+
+#: backends/platform/sdl/macosx/appmenu_osx.mm:82
+msgid "Hide Others"
+msgstr "Masquer les autres"
+
+#: backends/platform/sdl/macosx/appmenu_osx.mm:87
+msgid "Show All"
+msgstr "Tout afficher"
+
+#: backends/platform/sdl/macosx/appmenu_osx.mm:109
+#: backends/platform/sdl/macosx/appmenu_osx.mm:120
+msgid "Window"
+msgstr "Fenêtre"
+
+#: backends/platform/sdl/macosx/appmenu_osx.mm:114
+msgid "Minimize"
+msgstr "Placer dans le Dock"
+
+#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:46
+msgid "Normal (no scaling)"
+msgstr "Normal (échelle d'origine)"
+
+#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:65
+msgctxt "lowres"
+msgid "Normal (no scaling)"
+msgstr "Normal"
+
+#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2148
+msgid "Enabled aspect ratio correction"
+msgstr "Activer la correction du rapport d'aspect"
+
+#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2154
+msgid "Disabled aspect ratio correction"
+msgstr "Désactiver la correction du rapport d'aspect"
+
+#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2209
+msgid "Active graphics filter:"
+msgstr "Mode graphique actif:"
+
+#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2251
+msgid "Windowed mode"
+msgstr "Mode Fenêtre"
+
+#: backends/graphics/opengl/opengl-graphics.cpp:118
+#, fuzzy
+msgid "OpenGL"
+msgstr "Ouvrir"
+
+#: backends/graphics/opengl/opengl-graphics.cpp:119
+msgid "OpenGL (No filtering)"
+msgstr ""
+
+#: backends/platform/symbian/src/SymbianActions.cpp:38
+#: backends/platform/wince/CEActionsSmartphone.cpp:39
+msgid "Up"
+msgstr "Haut"
+
+#: backends/platform/symbian/src/SymbianActions.cpp:39
+#: backends/platform/wince/CEActionsSmartphone.cpp:40
+msgid "Down"
+msgstr "Bas"
+
+#: backends/platform/symbian/src/SymbianActions.cpp:40
+#: backends/platform/wince/CEActionsSmartphone.cpp:41
+msgid "Left"
+msgstr "Gauche"
+
+#: backends/platform/symbian/src/SymbianActions.cpp:41
+#: backends/platform/wince/CEActionsSmartphone.cpp:42
+msgid "Right"
+msgstr "Droite"
+
+#: backends/platform/symbian/src/SymbianActions.cpp:46
+#: backends/platform/wince/CEActionsSmartphone.cpp:47
+msgid "Zone"
+msgstr "Zone"
+
+#: backends/platform/symbian/src/SymbianActions.cpp:47
+#: backends/platform/wince/CEActionsPocket.cpp:54
+#: backends/platform/wince/CEActionsSmartphone.cpp:48
+msgid "Multi Function"
+msgstr "Fonction Multiple"
+
+#: backends/platform/symbian/src/SymbianActions.cpp:48
+msgid "Swap character"
+msgstr "Changement de personnage"
+
+#: backends/platform/symbian/src/SymbianActions.cpp:49
+msgid "Skip text"
+msgstr "Sauter le texte"
+
+#: backends/platform/symbian/src/SymbianActions.cpp:51
+msgid "Fast mode"
+msgstr "Mode rapide"
+
+#: 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:218
+#: engines/scumm/dialogs.cpp:192 engines/scumm/help.cpp:82
+#: engines/scumm/help.cpp:84
+msgid "Quit"
+msgstr "Quitter"
+
+#: backends/platform/symbian/src/SymbianActions.cpp:53
+msgid "Debugger"
+msgstr "Debugger"
+
+#: backends/platform/symbian/src/SymbianActions.cpp:54
+msgid "Global menu"
+msgstr "Menu global"
+
+#: backends/platform/symbian/src/SymbianActions.cpp:55
+msgid "Virtual keyboard"
+msgstr "Clavier virtuel"
+
+#: backends/platform/symbian/src/SymbianActions.cpp:56
+msgid "Key mapper"
+msgstr "Affectation des touches"
+
+#: backends/events/symbiansdl/symbiansdl-events.cpp:184
+msgid "Do you want to quit ?"
+msgstr "Voulez-vous quitter ?"
+
+#: backends/platform/wii/options.cpp:51
+msgid "Video"
+msgstr "Vidéo"
+
+#: backends/platform/wii/options.cpp:54
+msgid "Current video mode:"
+msgstr "Mode vidéo actuel"
+
+#: backends/platform/wii/options.cpp:56
+msgid "Double-strike"
+msgstr "Coup double"
+
+#: backends/platform/wii/options.cpp:60
+msgid "Horizontal underscan:"
+msgstr "Underscan horizontal:"
+
+#: backends/platform/wii/options.cpp:66
+msgid "Vertical underscan:"
+msgstr "Underscan vertical:"
+
+#: backends/platform/wii/options.cpp:71
+msgid "Input"
+msgstr "Entrée"
+
+#: backends/platform/wii/options.cpp:74
+msgid "GC Pad sensitivity:"
+msgstr "Sensibilité du pad GC:"
+
+#: backends/platform/wii/options.cpp:80
+msgid "GC Pad acceleration:"
+msgstr "Acceleration du pad GC:"
+
+#: backends/platform/wii/options.cpp:86
+msgid "DVD"
+msgstr "DVD"
+
+#: backends/platform/wii/options.cpp:89 backends/platform/wii/options.cpp:101
+msgid "Status:"
+msgstr "Status:"
+
+#: backends/platform/wii/options.cpp:90 backends/platform/wii/options.cpp:102
+msgid "Unknown"
+msgstr "Inconue"
+
+#: backends/platform/wii/options.cpp:93
+msgid "Mount DVD"
+msgstr "Monter le DVD"
+
+#: backends/platform/wii/options.cpp:94
+msgid "Unmount DVD"
+msgstr "Démonter le DVD"
+
+#: backends/platform/wii/options.cpp:98
+msgid "SMB"
+msgstr "SMB"
+
+#: backends/platform/wii/options.cpp:106
+msgid "Server:"
+msgstr "Serveur:"
+
+#: backends/platform/wii/options.cpp:110
+msgid "Share:"
+msgstr "Disque partagé:"
+
+#: backends/platform/wii/options.cpp:114
+msgid "Username:"
+msgstr "Nom d'utilisateur:"
+
+#: backends/platform/wii/options.cpp:118
+msgid "Password:"
+msgstr "Mot de passe:"
+
+#: backends/platform/wii/options.cpp:121
+msgid "Init network"
+msgstr "Initialiser le réseau"
+
+#: backends/platform/wii/options.cpp:123
+msgid "Mount SMB"
+msgstr "Monter SMB"
+
+#: backends/platform/wii/options.cpp:124
+msgid "Unmount SMB"
+msgstr "Démonter SMB"
+
+#: backends/platform/wii/options.cpp:143
+msgid "DVD Mounted successfully"
+msgstr "DVD monté avec succès"
+
+#: backends/platform/wii/options.cpp:146
+msgid "Error while mounting the DVD"
+msgstr "Échec du montage du DVD"
+
+#: backends/platform/wii/options.cpp:148
+msgid "DVD not mounted"
+msgstr "DVD non monté"
+
+#: backends/platform/wii/options.cpp:161
+msgid "Network up, share mounted"
+msgstr "Réseau connecté, disque partagé monté"
+
+#: backends/platform/wii/options.cpp:163
+msgid "Network up"
+msgstr "Réseau connecté"
+
+#: backends/platform/wii/options.cpp:166
+msgid ", error while mounting the share"
+msgstr ", échec du montage du disque partagé"
+
+#: backends/platform/wii/options.cpp:168
+msgid ", share not mounted"
+msgstr ", disque partagé non monté"
+
+#: backends/platform/wii/options.cpp:174
+msgid "Network down"
+msgstr "Réseau déconnecté"
+
+#: backends/platform/wii/options.cpp:178
+msgid "Initializing network"
+msgstr "Initialisation du réseau"
+
+#: backends/platform/wii/options.cpp:182
+msgid "Timeout while initializing network"
+msgstr "Dépassement du délai lors de l'initialisation du réseau"
+
+#: backends/platform/wii/options.cpp:186
+#, c-format
+msgid "Network not initialized (%d)"
+msgstr "Réseau non initialisé (%d)"
+
+#: backends/platform/wince/CEActionsPocket.cpp:46
+msgid "Hide Toolbar"
+msgstr "Caché la barre d'outils"
+
+#: backends/platform/wince/CEActionsPocket.cpp:47
+msgid "Show Keyboard"
+msgstr "Afficher le clavier"
+
+#: backends/platform/wince/CEActionsPocket.cpp:48
+msgid "Sound on/off"
+msgstr "Audio marche/arrêt"
+
+#: backends/platform/wince/CEActionsPocket.cpp:49
+msgid "Right click"
+msgstr "Clic droit"
+
+#: backends/platform/wince/CEActionsPocket.cpp:50
+msgid "Show/Hide Cursor"
+msgstr "Afficher/Cacher le curseur"
+
+#: backends/platform/wince/CEActionsPocket.cpp:51
+msgid "Free look"
+msgstr "Regarder autour"
+
+#: backends/platform/wince/CEActionsPocket.cpp:52
+msgid "Zoom up"
+msgstr "Dézoomer"
+
+#: backends/platform/wince/CEActionsPocket.cpp:53
+msgid "Zoom down"
+msgstr "Zoomer"
+
+#: backends/platform/wince/CEActionsPocket.cpp:55
+#: backends/platform/wince/CEActionsSmartphone.cpp:49
+msgid "Bind Keys"
+msgstr "Affecter les touches"
+
+#: backends/platform/wince/CEActionsPocket.cpp:56
+msgid "Cursor Up"
+msgstr "Haut"
+
+#: backends/platform/wince/CEActionsPocket.cpp:57
+msgid "Cursor Down"
+msgstr "Bas"
+
+#: backends/platform/wince/CEActionsPocket.cpp:58
+msgid "Cursor Left"
+msgstr "Gauche"
+
+#: backends/platform/wince/CEActionsPocket.cpp:59
+msgid "Cursor Right"
+msgstr "Droit"
+
+#: 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:326
+#: backends/platform/wince/CEActionsSmartphone.cpp:287
+msgid " Are you sure you want to quit ? "
+msgstr "Voulez-vous vraiment quitter ?"
+
+#: backends/platform/wince/CEActionsSmartphone.cpp:50
+msgid "Keyboard"
+msgstr "Clavier"
+
+#: backends/platform/wince/CEActionsSmartphone.cpp:51
+msgid "Rotate"
+msgstr "Pivoter"
+
+#: backends/platform/wince/CELauncherDialog.cpp:56
+msgid "Using SDL driver "
+msgstr "Utilise le pilote SDL"
+
+#: backends/platform/wince/CELauncherDialog.cpp:60
+msgid "Display "
+msgstr "Affichage"
+
+#: 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:516
+msgid "Map right click action"
+msgstr "Affecter l'action 'Clic Droit'"
+
+#: backends/platform/wince/wince-sdl.cpp:520
+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:529
+msgid "Map hide toolbar action"
+msgstr "Affecter l'action 'Cacher Bar d'Outils'"
+
+#: backends/platform/wince/wince-sdl.cpp:533
+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:542
+msgid "Map Zoom Up action (optional)"
+msgstr "Affecter l'action 'Dézoomer' (optionnelle)"
+
+#: backends/platform/wince/wince-sdl.cpp:545
+msgid "Map Zoom Down action (optional)"
+msgstr "Affecter l'action 'Zoomer' (optionnelle)"
+
+#: backends/platform/wince/wince-sdl.cpp:553
+msgid ""
+"Don't forget to map a key to 'Hide Toolbar' action to see the whole inventory"
+msgstr ""
+"Noubliez pas d'affecter une touche à l'action 'Cacher Bar d'Outils' pour "
+"pouvoir voir entièrement l'inventaire"
+
+#: backends/events/default/default-events.cpp:196
+msgid "Do you really want to return to the Launcher?"
+msgstr "Voulez-vous vraiment retourner au Lanceur ?"
+
+#: backends/events/default/default-events.cpp:196
+msgid "Launcher"
+msgstr "Lanceur"
+
+#: backends/events/default/default-events.cpp:218
+msgid "Do you really want to quit?"
+msgstr "Voulez-vous vraiment quitter ?"
+
+#: backends/events/gph/gph-events.cpp:386
+#: backends/events/gph/gph-events.cpp:429
+#: backends/events/openpandora/op-events.cpp:168
+msgid "Touchscreen 'Tap Mode' - Left Click"
+msgstr "Touchscreen 'Tap Mode' - Clic Gauche"
+
+#: backends/events/gph/gph-events.cpp:388
+#: backends/events/gph/gph-events.cpp:431
+#: backends/events/openpandora/op-events.cpp:170
+msgid "Touchscreen 'Tap Mode' - Right Click"
+msgstr "Touchscreen 'Tap Mode' - Clic Droit"
+
+#: backends/events/gph/gph-events.cpp:390
+#: backends/events/gph/gph-events.cpp:433
+#: backends/events/openpandora/op-events.cpp:172
+msgid "Touchscreen 'Tap Mode' - Hover (No Click)"
+msgstr "Touchscreen 'Tap Mode' - Déplacer sans cliquer"
+
+#: backends/events/gph/gph-events.cpp:410
+msgid "Maximum Volume"
+msgstr "Volume Maximum"
+
+#: backends/events/gph/gph-events.cpp:412
+msgid "Increasing Volume"
+msgstr "Augmentation Volume"
+
+#: backends/events/gph/gph-events.cpp:418
+msgid "Minimal Volume"
+msgstr "Volume Minimum"
+
+#: backends/events/gph/gph-events.cpp:420
+msgid "Decreasing Volume"
+msgstr "Diminution Volume"
+
+#: backends/events/openpandora/op-events.cpp:174
+msgid "Touchscreen 'Tap Mode' - Hover (DPad Clicks)"
+msgstr "Touchscreen 'Tap Mode' - Déplacer sans cliquer"
+
+#: backends/updates/macosx/macosx-updates.mm:67
+msgid "Check for Updates..."
+msgstr "Recherche des mises à jour..."
+
+#: backends/platform/tizen/form.cpp:263
+msgid "Right Click Once"
+msgstr "Simple Clic Droit"
+
+#: backends/platform/tizen/form.cpp:271
+msgid "Move Only"
+msgstr "Déplacer Uniquement"
+
+#: backends/platform/tizen/form.cpp:294
+msgid "Escape Key"
+msgstr "Touche d'échappement"
+
+#: backends/platform/tizen/form.cpp:299
+msgid "Game Menu"
+msgstr "Menu du Jeu"
+
+#: backends/platform/tizen/form.cpp:304
+msgid "Show Keypad"
+msgstr "Afficher le clavier"
+
+#: backends/platform/tizen/form.cpp:309
+msgid "Control Mouse"
+msgstr "Contrôles la Souris"
+
+#: backends/events/maemosdl/maemosdl-events.cpp:192
+msgid "Clicking Enabled"
+msgstr "Clic Activé"
+
+#: backends/events/maemosdl/maemosdl-events.cpp:192
+msgid "Clicking Disabled"
+msgstr "Clic Désactivé"
+
+#: engines/agi/detection.cpp:142 engines/drascula/detection.cpp:302
+#: engines/dreamweb/detection.cpp:47 engines/neverhood/detection.cpp:160
+#: engines/sci/detection.cpp:394 engines/toltecs/detection.cpp:186
msgid "Use original save/load screens"
msgstr "Dialogues sauvegarde/chargement d'origine"
-#: engines/agi/detection.cpp:143 engines/drascula/detection.cpp:271
-#: engines/dreamweb/detection.cpp:48 engines/sci/detection.cpp:394
-#: engines/toltecs/detection.cpp:174
+#: engines/agi/detection.cpp:143 engines/drascula/detection.cpp:303
+#: engines/dreamweb/detection.cpp:48 engines/neverhood/detection.cpp:161
+#: engines/sci/detection.cpp:395 engines/toltecs/detection.cpp:187
msgid "Use the original save/load screens, instead of the ScummVM ones"
msgstr ""
"Utiliser les dialogues sauvegarde/chargement d'origine plutôt que ceux de "
"ScummVM"
-#: engines/agi/saveload.cpp:816 engines/drascula/saveload.cpp:351
-#: engines/sci/engine/kfile.cpp:841 engines/toltecs/menu.cpp:259
+#: engines/agi/saveload.cpp:816 engines/drascula/saveload.cpp:349
+#: engines/neverhood/menumodule.cpp:886 engines/sci/engine/kfile.cpp:857
+#: engines/toltecs/menu.cpp:256
msgid "Restore game:"
msgstr "Charger le jeu:"
-#: engines/agi/saveload.cpp:816 engines/drascula/saveload.cpp:351
-#: engines/sci/engine/kfile.cpp:841 engines/toltecs/menu.cpp:259
+#: engines/agi/saveload.cpp:816 engines/drascula/saveload.cpp:349
+#: engines/neverhood/menumodule.cpp:886 engines/sci/engine/kfile.cpp:857
+#: engines/toltecs/menu.cpp:256
msgid "Restore"
msgstr "Charger"
-#: engines/drascula/saveload.cpp:49
+#: engines/agos/saveload.cpp:160 engines/scumm/scumm.cpp:2321
+#, c-format
+msgid ""
+"Failed to load game state from file:\n"
+"\n"
+"%s"
+msgstr ""
+"Échec du chargement de l'état du jeu depuis le fichier:\n"
+"\n"
+"%s"
+
+#: engines/agos/saveload.cpp:195 engines/scumm/scumm.cpp:2314
+#, c-format
+msgid ""
+"Failed to save game state to file:\n"
+"\n"
+"%s"
+msgstr ""
+"Échec de l'enregistrement de l'état du jeu dans le fichier:\n"
+"\n"
+"%s"
+
+#: engines/agos/saveload.cpp:203 engines/scumm/scumm.cpp:2332
+#, c-format
+msgid ""
+"Successfully saved game state in file:\n"
+"\n"
+"%s"
+msgstr ""
+"État du jeu enregistré avec succès dans le fichier:\n"
+"\n"
+"%s"
+
+#: engines/agos/animation.cpp:557
+#, c-format
+msgid "Cutscene file '%s' not found!"
+msgstr "Fichier de séquence '%s' non trouvé!"
+
+#: engines/drascula/saveload.cpp:47
msgid ""
"ScummVM found that you have old savefiles for Drascula that should be "
"converted.\n"
@@ -1432,8 +2166,8 @@ 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 Drascula qui "
-"ont besoin d'être convertis.\n"
+"ScummVM a trouvé des anciens fichiers de sauvegarde pour Drascula 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"
@@ -1448,27 +2182,302 @@ msgstr "Utiliser le mode palette lumineuse"
msgid "Display graphics using the game's bright palette"
msgstr "Utiliser la palette lumineuse du jeu pour l'affichage"
-#: engines/sci/detection.cpp:373
+#: engines/gob/inter_playtoons.cpp:256 engines/gob/inter_v2.cpp:1470
+#: engines/tinsel/saveload.cpp:532
+msgid "Failed to load game state from file."
+msgstr "Échec du chargement de l'état du jeu depuis le disque."
+
+#: engines/gob/inter_v2.cpp:1540 engines/tinsel/saveload.cpp:545
+msgid "Failed to save game state to file."
+msgstr "Échec de l'enregistrement de l'état du jeu sur le disque."
+
+#: engines/gob/inter_v5.cpp:107
+msgid "Failed to delete file."
+msgstr "Échec de la suppression du fichier."
+
+#: engines/groovie/detection.cpp:312
+msgid "Fast movie speed"
+msgstr "Vidéo rapide"
+
+#: engines/groovie/detection.cpp:313
+msgid "Play movies at an increased speed"
+msgstr "Joue les vidéos plus rapidement"
+
+#: engines/groovie/script.cpp:399
+msgid "Failed to save game"
+msgstr "Échec de la sauvegarde."
+
+#. I18N: Studio audience adds an applause and cheering sounds whenever
+#. Malcolm makes a joke.
+#: engines/kyra/detection.cpp:62
+msgid "Studio audience"
+msgstr "Public en studio"
+
+#: engines/kyra/detection.cpp:63
+msgid "Enable studio audience"
+msgstr "Activer le public en studio"
+
+#. I18N: This option allows the user to skip text and cutscenes.
+#: engines/kyra/detection.cpp:73
+msgid "Skip support"
+msgstr "Support des interruptions"
+
+#: engines/kyra/detection.cpp:74
+msgid "Allow text and cutscenes to be skipped"
+msgstr "Permet de sauter les textes et scènes cinématiques"
+
+#. I18N: Helium mode makes people sound like they've inhaled Helium.
+#: engines/kyra/detection.cpp:84
+msgid "Helium mode"
+msgstr "Mode Helium"
+
+#: engines/kyra/detection.cpp:85
+msgid "Enable helium mode"
+msgstr "Activer le mode helium"
+
+#. I18N: When enabled, this option makes scrolling smoother when
+#. changing from one screen to another.
+#: engines/kyra/detection.cpp:99
+msgid "Smooth scrolling"
+msgstr "Défilement régulier"
+
+#: engines/kyra/detection.cpp:100
+msgid "Enable smooth scrolling when walking"
+msgstr "Activer le défilement régulier en marchant"
+
+#. I18N: When enabled, this option changes the cursor when it floats to the
+#. edge of the screen to a directional arrow. The player can then click to
+#. walk towards that direction.
+#: engines/kyra/detection.cpp:112
+msgid "Floating cursors"
+msgstr "Curseurs flotants"
+
+#: engines/kyra/detection.cpp:113
+msgid "Enable floating cursors"
+msgstr "Activer les curseurs flotants"
+
+#. I18N: HP stands for Hit Points
+#: engines/kyra/detection.cpp:127
+msgid "HP bar graphs"
+msgstr "Bar HP"
+
+#: engines/kyra/detection.cpp:128
+msgid "Enable hit point bar graphs"
+msgstr "Activer les bars de santé (Hit Point)"
+
+#: engines/kyra/lol.cpp:478
+msgid "Attack 1"
+msgstr "Attaque 1"
+
+#: engines/kyra/lol.cpp:479
+msgid "Attack 2"
+msgstr "Attaque 2"
+
+#: engines/kyra/lol.cpp:480
+msgid "Attack 3"
+msgstr "Attaque 3"
+
+#: engines/kyra/lol.cpp:481
+msgid "Move Forward"
+msgstr "Avancer"
+
+#: engines/kyra/lol.cpp:482
+msgid "Move Back"
+msgstr "Reculer"
+
+#: engines/kyra/lol.cpp:483
+msgid "Slide Left"
+msgstr "Faire un pas vers la Gauche"
+
+#: engines/kyra/lol.cpp:484
+msgid "Slide Right"
+msgstr "Faire un pas vers la Droite"
+
+#: engines/kyra/lol.cpp:485 engines/pegasus/pegasus.cpp:2509
+msgid "Turn Left"
+msgstr "Tourner vers la Gauche"
+
+#: engines/kyra/lol.cpp:486 engines/pegasus/pegasus.cpp:2510
+msgid "Turn Right"
+msgstr "Tourner vers la Droite"
+
+#: engines/kyra/lol.cpp:487
+msgid "Rest"
+msgstr "Se Reposer"
+
+#: engines/kyra/lol.cpp:488
+msgid "Options"
+msgstr "Options"
+
+#: engines/kyra/lol.cpp:489
+msgid "Choose Spell"
+msgstr "Choisir un Sort"
+
+#: engines/kyra/sound_midi.cpp:477
+msgid ""
+"You appear to be using a General MIDI device,\n"
+"but your game only supports Roland MT32 MIDI.\n"
+"We try to map the Roland MT32 instruments to\n"
+"General MIDI ones. It is still possible that\n"
+"some tracks sound incorrect."
+msgstr ""
+"Il semble que vous utilisiez un périphérique General MIDI,\n"
+"mais ce jeu ne support que le MIDI Roland MT32. Nous essayons\n"
+"d'associer les instruments Roland MT32 aux instruments General\n"
+"MIDI. Cependant il est possible que quelques pistes ne soient\n"
+" pas jouées correctement."
+
+#. I18N: Option for fast scene switching
+#: engines/mohawk/dialogs.cpp:92 engines/mohawk/dialogs.cpp:167
+msgid "~Z~ip Mode Activated"
+msgstr "Mode ~Z~ip Activé"
+
+#: engines/mohawk/dialogs.cpp:93
+msgid "~T~ransitions Enabled"
+msgstr "T~r~ansitions activées"
+
+#. I18N: Drop book page
+#: engines/mohawk/dialogs.cpp:95
+msgid "~D~rop Page"
+msgstr "~L~acher la Page"
+
+#: engines/mohawk/dialogs.cpp:99
+msgid "~S~how Map"
+msgstr "Afficher la Carte"
+
+#: engines/mohawk/dialogs.cpp:105
+msgid "~M~ain Menu"
+msgstr "~M~enu Principal"
+
+#: engines/mohawk/dialogs.cpp:168
+msgid "~W~ater Effect Enabled"
+msgstr "~E~ffets de l'Eau Activés"
+
+#: engines/neverhood/detection.cpp:167
+msgid "Skip the Hall of Records storyboard scenes"
+msgstr ""
+
+#: engines/neverhood/detection.cpp:168
+msgid "Allows the player to skip past the Hall of Records storyboard scenes"
+msgstr ""
+
+#: engines/neverhood/detection.cpp:174
+msgid "Scale the making of videos to full screen"
+msgstr ""
+
+#: engines/neverhood/detection.cpp:175
+msgid "Scale the making of videos, so that they use the whole screen"
+msgstr ""
+
+#: engines/parallaction/saveload.cpp:133
+#, c-format
+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:204
+msgid "Loading game..."
+msgstr "Chargement en cours..."
+
+#: engines/parallaction/saveload.cpp:219
+msgid "Saving game..."
+msgstr "Sauvegarde en cours..."
+
+#: engines/parallaction/saveload.cpp:272
+msgid ""
+"ScummVM found that you have old savefiles for Nippon Safes that should be "
+"renamed.\n"
+"The old names are 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 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:319
+msgid "ScummVM successfully converted all your savefiles."
+msgstr "ScummVM a converti avec succès vos anciennes sauvegardes."
+
+#: engines/parallaction/saveload.cpp:321
+msgid ""
+"ScummVM printed some warnings in your console window and can't guarantee all "
+"your files have been converted.\n"
+"\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."
+
+#: engines/pegasus/pegasus.cpp:714
+msgid "Invalid save file name"
+msgstr "Nom de sauvegarde invalide"
+
+#: engines/pegasus/pegasus.cpp:2507
+msgid "Up/Zoom In/Move Forward/Open Doors"
+msgstr "Haut/Zoom/Avancer/Ouvrir Portes"
+
+#: engines/pegasus/pegasus.cpp:2508
+msgid "Down/Zoom Out"
+msgstr "Bas/Dézoom"
+
+#: engines/pegasus/pegasus.cpp:2511
+msgid "Display/Hide Inventory Tray"
+msgstr "Montrer/Cacher l'Inventaire"
+
+#: engines/pegasus/pegasus.cpp:2512
+msgid "Display/Hide Biochip Tray"
+msgstr "Montrer/Cacher le Biochip"
+
+#: engines/pegasus/pegasus.cpp:2513
+msgid "Action/Select"
+msgstr "Action/Sélection"
+
+#: engines/pegasus/pegasus.cpp:2514
+msgid "Toggle Center Data Display"
+msgstr "Basculer l'Affichage Central"
+
+#: engines/pegasus/pegasus.cpp:2515
+msgid "Display/Hide Info Screen"
+msgstr "Montrer/Cacher l'Écran d'Info"
+
+#: engines/pegasus/pegasus.cpp:2516
+msgid "Display/Hide Pause Menu"
+msgstr "Montrer/Cacher le Menu de Pause"
+
+#: engines/pegasus/pegasus.cpp:2517
+msgid "???"
+msgstr "???"
+
+#: engines/sci/detection.cpp:374
msgid "EGA undithering"
msgstr "Détramage EGA"
-#: engines/sci/detection.cpp:374
+#: engines/sci/detection.cpp:375
msgid "Enable undithering in EGA games"
msgstr "Activer le détramage dans les jeux EGA"
-#: engines/sci/detection.cpp:383
+#: engines/sci/detection.cpp:384
msgid "Prefer digital sound effects"
msgstr "Préférer les effets sonors digitals"
-#: engines/sci/detection.cpp:384
+#: engines/sci/detection.cpp:385
msgid "Prefer digital sound effects instead of synthesized ones"
msgstr "Préférer les effets sonores digitaux plutôt que ceux synthétisés"
-#: engines/sci/detection.cpp:403
+#: engines/sci/detection.cpp:404
msgid "Use IMF/Yamaha FB-01 for MIDI output"
msgstr "Utiliser IMF/Yamaha FB-01 pour la sortie MIDI"
-#: engines/sci/detection.cpp:404
+#: engines/sci/detection.cpp:405
msgid ""
"Use an IBM Music Feature card or a Yamaha FB-01 FM synth module for MIDI "
"output"
@@ -1476,167 +2485,149 @@ msgstr ""
"Utiliser une carte IBM Music Feature ou un module Yamaha FB-01 FM pour la "
"sortie MIDI"
-#: engines/sci/detection.cpp:414
+#: engines/sci/detection.cpp:415
msgid "Use CD audio"
msgstr "Utiliser la musique du CD"
-#: engines/sci/detection.cpp:415
+#: engines/sci/detection.cpp:416
msgid "Use CD audio instead of in-game audio, if available"
msgstr ""
"Utiliser la musique du CD quand elle est disponible au lieu de la musique du "
"jeu"
-#: engines/sci/detection.cpp:425
+#: engines/sci/detection.cpp:426
msgid "Use Windows cursors"
msgstr "Utiliser les curseurs Windows"
-#: engines/sci/detection.cpp:426
+#: engines/sci/detection.cpp:427
msgid ""
"Use the Windows cursors (smaller and monochrome) instead of the DOS ones"
msgstr ""
"Utiliser les curseurs Windows (plus petits et monochromes) au lieu des "
"curseurs DOS"
-#: engines/sci/detection.cpp:436
+#: engines/sci/detection.cpp:437
msgid "Use silver cursors"
msgstr "Utiliser les curseurs argentés"
-#: engines/sci/detection.cpp:437
+#: engines/sci/detection.cpp:438
msgid ""
"Use the alternate set of silver cursors, instead of the normal golden ones"
msgstr "Utiliser les curseurs argentés au lieu des curseurs normaux dorés"
-#: engines/scumm/dialogs.cpp:175
+#: engines/scumm/dialogs.cpp:176
#, 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
+#: engines/scumm/dialogs.cpp:177
#, 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
+#: engines/scumm/dialogs.cpp:178
#, 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
+#: engines/scumm/dialogs.cpp:179
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
+#: engines/scumm/dialogs.cpp:183
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
+#: engines/scumm/dialogs.cpp:185
msgid "Are you sure you want to quit? (Y/N)"
msgstr "Voulez-vous vraiment quitter ? (O/N)O"
-#: engines/scumm/dialogs.cpp:189
+#: engines/scumm/dialogs.cpp:190
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:215
-msgid "Quit"
-msgstr "Quitter"
-
-#: engines/scumm/dialogs.cpp:193
+#: engines/scumm/dialogs.cpp:194
msgid "Insert save/load game disk"
msgstr "Insérer le disque de sauvegarde/chargement"
-#: engines/scumm/dialogs.cpp:194
+#: engines/scumm/dialogs.cpp:195
msgid "You must enter a name"
msgstr "Vous devez entrer un nom"
-#: engines/scumm/dialogs.cpp:195
+#: engines/scumm/dialogs.cpp:196
msgid "The game was NOT saved (disk full?)"
msgstr "Le jeu n'a pu être sauvé (disque plein ?)"
-#: engines/scumm/dialogs.cpp:196
+#: engines/scumm/dialogs.cpp:197
msgid "The game was NOT loaded"
msgstr "Le jeu n'a pu être chargé"
-#: engines/scumm/dialogs.cpp:197
+#: engines/scumm/dialogs.cpp:198
#, c-format
msgid "Saving '%s'"
msgstr "Sauvegarde de '%s'"
-#: engines/scumm/dialogs.cpp:198
+#: engines/scumm/dialogs.cpp:199
#, c-format
msgid "Loading '%s'"
msgstr "Chargement de '%s'"
-#: engines/scumm/dialogs.cpp:199
+#: engines/scumm/dialogs.cpp:200
msgid "Name your SAVE game"
msgstr "Donnez un nom à votre sauvegarde"
-#: engines/scumm/dialogs.cpp:200
+#: engines/scumm/dialogs.cpp:201
msgid "Select a game to LOAD"
msgstr "Sélectionnez un jeu à charger"
-#: engines/scumm/dialogs.cpp:201
+#: engines/scumm/dialogs.cpp:202
msgid "Game title)"
msgstr "Nom du jeu)"
#. I18N: Previous page button
-#: engines/scumm/dialogs.cpp:287
+#: engines/scumm/dialogs.cpp:288
msgid "~P~revious"
msgstr "~P~récédent"
#. I18N: Next page button
-#: engines/scumm/dialogs.cpp:289
+#: engines/scumm/dialogs.cpp:290
msgid "~N~ext"
msgstr "~S~uivant"
-#: engines/scumm/dialogs.cpp:290
-#: backends/platform/ds/arm9/source/dsoptions.cpp:56
-msgid "~C~lose"
-msgstr "~F~ermer"
-
-#: engines/scumm/dialogs.cpp:597
+#: engines/scumm/dialogs.cpp:598
msgid "Speech Only"
msgstr "Voix"
-#: engines/scumm/dialogs.cpp:598
+#: engines/scumm/dialogs.cpp:599
msgid "Speech and Subtitles"
msgstr "Voix et Sous-titres"
-#: engines/scumm/dialogs.cpp:599
+#: engines/scumm/dialogs.cpp:600
msgid "Subtitles Only"
msgstr "Sous-titres"
-#: engines/scumm/dialogs.cpp:607
+#: engines/scumm/dialogs.cpp:608
msgctxt "lowres"
msgid "Speech & Subs"
msgstr "Voix & ST"
-#: engines/scumm/dialogs.cpp:653
+#: engines/scumm/dialogs.cpp:654
msgid "Select a Proficiency Level."
msgstr "Sélectionnez un niveau de compétence."
-#: engines/scumm/dialogs.cpp:655
+#: engines/scumm/dialogs.cpp:656
msgid "Refer to your Loom(TM) manual for help."
msgstr "Reportez-vous à votre manuel d'instruction."
-#: engines/scumm/dialogs.cpp:658
-msgid "Standard"
-msgstr "Normal"
-
-#: engines/scumm/dialogs.cpp:659
+#: engines/scumm/dialogs.cpp:660
msgid "Practice"
msgstr "Essai"
-#: engines/scumm/dialogs.cpp:660
+#: engines/scumm/dialogs.cpp:661
msgid "Expert"
msgstr "Expert"
@@ -2153,7 +3144,7 @@ msgstr "Voler vers la droite"
msgid "Fly to lower right"
msgstr "Voler vers la bas à droite"
-#: engines/scumm/scumm.cpp:1776
+#: engines/scumm/scumm.cpp:1777
#, c-format
msgid ""
"Native MIDI support requires the Roland Upgrade from LucasArts,\n"
@@ -2162,40 +3153,7 @@ msgstr ""
"Support MIDI natif requière la mise à jour Roland de LucasArt,\n"
"mais %s manque. Utilise AdLib à la place."
-#: engines/scumm/scumm.cpp:2303 engines/agos/saveload.cpp:220
-#, c-format
-msgid ""
-"Failed to save game state to file:\n"
-"\n"
-"%s"
-msgstr ""
-"Échec de l'enregistrement de l'état du jeu dans le fichier:\n"
-"\n"
-"%s"
-
-#: engines/scumm/scumm.cpp:2310 engines/agos/saveload.cpp:185
-#, c-format
-msgid ""
-"Failed to load game state from file:\n"
-"\n"
-"%s"
-msgstr ""
-"Échec du chargement de l'état du jeu depuis le fichier:\n"
-"\n"
-"%s"
-
-#: engines/scumm/scumm.cpp:2322 engines/agos/saveload.cpp:228
-#, c-format
-msgid ""
-"Successfully saved game state in file:\n"
-"\n"
-"%s"
-msgstr ""
-"État du jeu enregistré avec succès dans le fichier:\n"
-"\n"
-"%s"
-
-#: engines/scumm/scumm.cpp:2537
+#: engines/scumm/scumm.cpp:2547
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' "
@@ -2206,190 +3164,6 @@ 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."
-#. I18N: Option for fast scene switching
-#: engines/mohawk/dialogs.cpp:92 engines/mohawk/dialogs.cpp:167
-msgid "~Z~ip Mode Activated"
-msgstr "Mode ~Z~ip Activé"
-
-#: engines/mohawk/dialogs.cpp:93
-msgid "~T~ransitions Enabled"
-msgstr "T~r~ansitions activées"
-
-#. I18N: Drop book page
-#: engines/mohawk/dialogs.cpp:95
-msgid "~D~rop Page"
-msgstr "~L~acher la Page"
-
-#: engines/mohawk/dialogs.cpp:99
-msgid "~S~how Map"
-msgstr "Afficher la Carte"
-
-#: engines/mohawk/dialogs.cpp:105
-msgid "~M~ain Menu"
-msgstr "~M~enu Principal"
-
-#: engines/mohawk/dialogs.cpp:168
-msgid "~W~ater Effect Enabled"
-msgstr "~E~ffets de l'Eau Activés"
-
-#: engines/agos/animation.cpp:557
-#, c-format
-msgid "Cutscene file '%s' not found!"
-msgstr "Fichier de séquence '%s' non trouvé!"
-
-#: engines/gob/inter_playtoons.cpp:256 engines/gob/inter_v2.cpp:1287
-#: engines/tinsel/saveload.cpp:532
-msgid "Failed to load game state from file."
-msgstr "Échec du chargement de l'état du jeu depuis le disque."
-
-#: engines/gob/inter_v2.cpp:1357 engines/tinsel/saveload.cpp:545
-msgid "Failed to save game state to file."
-msgstr "Échec de l'enregistrement de l'état du jeu sur le disque."
-
-#: engines/gob/inter_v5.cpp:107
-msgid "Failed to delete file."
-msgstr "Échec de la suppression du fichier."
-
-#: engines/groovie/detection.cpp:312
-msgid "Fast movie speed"
-msgstr "Vidéo rapide"
-
-#: engines/groovie/detection.cpp:313
-msgid "Play movies at an increased speed"
-msgstr "Joue les vidéos plus rapidement"
-
-#: engines/groovie/script.cpp:420
-msgid "Failed to save game"
-msgstr "Échec de la sauvegarde."
-
-#. I18N: Studio audience adds an applause and cheering sounds whenever
-#. Malcolm makes a joke.
-#: engines/kyra/detection.cpp:62
-msgid "Studio audience"
-msgstr "Public en studio"
-
-#: engines/kyra/detection.cpp:63
-msgid "Enable studio audience"
-msgstr "Activer le public en studio"
-
-#. I18N: This option allows the user to skip text and cutscenes.
-#: engines/kyra/detection.cpp:73
-msgid "Skip support"
-msgstr "Support des interruptions"
-
-#: engines/kyra/detection.cpp:74
-msgid "Allow text and cutscenes to be skipped"
-msgstr "Permet de sauter les textes et scènes cinématiques"
-
-#. I18N: Helium mode makes people sound like they've inhaled Helium.
-#: engines/kyra/detection.cpp:84
-msgid "Helium mode"
-msgstr "Mode Helium"
-
-#: engines/kyra/detection.cpp:85
-msgid "Enable helium mode"
-msgstr "Activer le mode helium"
-
-#. I18N: When enabled, this option makes scrolling smoother when
-#. changing from one screen to another.
-#: engines/kyra/detection.cpp:99
-msgid "Smooth scrolling"
-msgstr "Défilement régulier"
-
-#: engines/kyra/detection.cpp:100
-msgid "Enable smooth scrolling when walking"
-msgstr "Activer le défilement régulier en marchant"
-
-#. I18N: When enabled, this option changes the cursor when it floats to the
-#. edge of the screen to a directional arrow. The player can then click to
-#. walk towards that direction.
-#: engines/kyra/detection.cpp:112
-msgid "Floating cursors"
-msgstr "Curseurs flotants"
-
-#: engines/kyra/detection.cpp:113
-msgid "Enable floating cursors"
-msgstr "Activer les curseurs flotants"
-
-#. I18N: HP stands for Hit Points
-#: engines/kyra/detection.cpp:127
-msgid "HP bar graphs"
-msgstr "Bar HP"
-
-#: engines/kyra/detection.cpp:128
-msgid "Enable hit point bar graphs"
-msgstr "Activer les bars de santé (Hit Point)"
-
-#: engines/kyra/lol.cpp:478
-msgid "Attack 1"
-msgstr "Attaque 1"
-
-#: engines/kyra/lol.cpp:479
-msgid "Attack 2"
-msgstr "Attaque 2"
-
-#: engines/kyra/lol.cpp:480
-msgid "Attack 3"
-msgstr "Attaque 3"
-
-#: engines/kyra/lol.cpp:481
-msgid "Move Forward"
-msgstr "Avancer"
-
-#: engines/kyra/lol.cpp:482
-msgid "Move Back"
-msgstr "Reculer"
-
-#: engines/kyra/lol.cpp:483
-msgid "Slide Left"
-msgstr "Faire un pas vers la Gauche"
-
-#: engines/kyra/lol.cpp:484
-msgid "Slide Right"
-msgstr "Faire un pas vers la Droite"
-
-#: engines/kyra/lol.cpp:485 engines/pegasus/pegasus.cpp:2447
-msgid "Turn Left"
-msgstr "Tourner vers la Gauche"
-
-#: engines/kyra/lol.cpp:486 engines/pegasus/pegasus.cpp:2448
-msgid "Turn Right"
-msgstr "Tourner vers la Droite"
-
-#: engines/kyra/lol.cpp:487
-msgid "Rest"
-msgstr "Se Reposer"
-
-#: engines/kyra/lol.cpp:488
-msgid "Options"
-msgstr "Options"
-
-#: engines/kyra/lol.cpp:489
-msgid "Choose Spell"
-msgstr "Choisir un Sort"
-
-#: engines/kyra/sound_midi.cpp:477
-msgid ""
-"You appear to be using a General MIDI device,\n"
-"but your game only supports Roland MT32 MIDI.\n"
-"We try to map the Roland MT32 instruments to\n"
-"General MIDI ones. It is still possible that\n"
-"some tracks sound incorrect."
-msgstr ""
-"Il semble que vous utilisiez un périphérique General MIDI,\n"
-"mais ce jeu ne support que le MIDI Roland MT32. Nous essayons\n"
-"d'associer les instruments Roland MT32 aux instruments General\n"
-"MIDI. Cependant il est possible que quelques pistes ne soient\n"
-" pas jouées correctement."
-
-#: engines/queen/queen.cpp:59
-msgid "Alternative intro"
-msgstr "Intro alternative"
-
-#: engines/queen/queen.cpp:60
-msgid "Use an alternative game intro (CD version only)"
-msgstr "Utiliser une intro alternative (version CD uniquement)"
-
#: engines/sky/compact.cpp:130
msgid ""
"Unable to find \"sky.cpt\" file!\n"
@@ -2414,23 +3188,26 @@ msgstr "Intro disquette"
msgid "Use the floppy version's intro (CD version only)"
msgstr "Utiliser l'intro de la version disquette (version CD uniquement)"
-#: engines/sword1/animation.cpp:519
+#: engines/sword1/animation.cpp:524
#, c-format
msgid "PSX stream cutscene '%s' cannot be played in paletted mode"
msgstr ""
"La scène cinématique PSX '%s' ne peut pas être lu avec 256 couleurs ou moins"
-#: engines/sword1/animation.cpp:540 engines/sword2/animation.cpp:439
+#: engines/sword1/animation.cpp:545 engines/sword2/animation.cpp:445
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:550 engines/sword2/animation.cpp:449
-msgid "MPEG2 cutscenes are no longer supported"
-msgstr "Les séquences MPEG2 ne sont plus supportées"
+#: engines/sword1/animation.cpp:561
+#, fuzzy
+msgid "MPEG-2 cutscenes found but ScummVM has been built without MPEG-2"
+msgstr ""
+"Scènes cinématique PSX détectées mais ScummVM a été compilé sans le support "
+"des couleurs RGB"
-#: engines/sword1/animation.cpp:556 engines/sword2/animation.cpp:457
+#: engines/sword1/animation.cpp:568 engines/sword2/animation.cpp:470
#, c-format
msgid "Cutscene '%s' not found"
msgstr "Séquence '%s' non trouvé"
@@ -2474,13 +3251,21 @@ msgstr "Garder la nouvelle"
msgid "This is the end of the Broken Sword 1 Demo"
msgstr "C'est la fin de la démo des Chevaliers de Baphomet"
-#: engines/sword2/animation.cpp:419
+#: engines/sword2/animation.cpp:425
msgid ""
"PSX cutscenes found but ScummVM has been built without RGB color support"
msgstr ""
"Scènes cinématique PSX détectées mais ScummVM a été compilé sans le support "
"des couleurs RGB"
+#: engines/sword2/animation.cpp:461
+#, fuzzy
+msgid ""
+"MPEG-2 cutscenes found but ScummVM has been built without MPEG-2 support"
+msgstr ""
+"Les séquences DXA sont présente mais ScummVM a été compilé sans le support "
+"zlib."
+
#: engines/sword2/sword2.cpp:79
msgid "Show object labels"
msgstr "Afficher la description des objets"
@@ -2489,803 +3274,64 @@ msgstr "Afficher la description des objets"
msgid "Show labels for objects on mouse hover"
msgstr "Afficher la description des objets lors de passage du pointeur"
-#: engines/teenagent/resources.cpp:94
+#: engines/teenagent/resources.cpp:95
msgid ""
"You're missing the 'teenagent.dat' file. Get it from the ScummVM website"
-msgstr "Il vous manque le fichier 'teenagent.dat'. Téléchargez le depuis le "
-"site web de ScummVM."
+msgstr ""
+"Il vous manque le fichier 'teenagent.dat'. Téléchargez le depuis le site web "
+"de ScummVM."
-#: engines/teenagent/resources.cpp:115
+#: engines/teenagent/resources.cpp:116
msgid ""
"The teenagent.dat file is compressed and zlib hasn't been included in this "
"executable. Please decompress it"
-msgstr "Le fichier teenagent.dat est compressé et cet exécutable n'inclus "
-"pas zlib. Veuillez le décompresser."
-
-#: engines/parallaction/saveload.cpp:133
-#, c-format
-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:204
-msgid "Loading game..."
-msgstr "Chargement en cours..."
-
-#: engines/parallaction/saveload.cpp:219
-msgid "Saving game..."
-msgstr "Sauvegarde en cours..."
-
-#: engines/parallaction/saveload.cpp:272
-msgid ""
-"ScummVM found that you have old savefiles for Nippon Safes that should be "
-"renamed.\n"
-"The old names are 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 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:319
-msgid "ScummVM successfully converted all your savefiles."
-msgstr "ScummVM a converti avec succès vos anciennes sauvegardes."
-
-#: engines/parallaction/saveload.cpp:321
-msgid ""
-"ScummVM printed some warnings in your console window and can't guarantee all "
-"your files have been converted.\n"
-"\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."
+"Le fichier teenagent.dat est compressé et cet exécutable n'inclus pas zlib. "
+"Veuillez le décompresser."
-#: engines/pegasus/pegasus.cpp:679
-msgid "Invalid save file name"
-msgstr "Nom de sauvegarde invalide"
-
-#: engines/pegasus/pegasus.cpp:2445
-msgid "Up/Zoom In/Move Forward/Open Doors"
-msgstr "Haut/Zoom/Avancer/Ouvrir Portes"
-
-#: engines/pegasus/pegasus.cpp:2446
-msgid "Down/Zoom Out"
-msgstr "Bas/Dézoom"
-
-#: engines/pegasus/pegasus.cpp:2449
-msgid "Display/Hide Inventory Tray"
-msgstr "Montrer/Cacher l'Inventaire"
-
-#: engines/pegasus/pegasus.cpp:2450
-msgid "Display/Hide Biochip Tray"
-msgstr "Montrer/Cacher le Biochip"
-
-#: engines/pegasus/pegasus.cpp:2451
-msgid "Action/Select"
-msgstr "Action/Sélection"
-
-#: engines/pegasus/pegasus.cpp:2452
-msgid "Toggle Center Data Display"
-msgstr "Basculer l'Affichage Central"
-
-#: engines/pegasus/pegasus.cpp:2453
-msgid "Display/Hide Info Screen"
-msgstr "Montrer/Cacher l'Écran d'Info"
-
-#: engines/pegasus/pegasus.cpp:2454
-msgid "Display/Hide Pause Menu"
-msgstr "Montrer/Cacher le Menu de Pause"
-
-#: engines/pegasus/pegasus.cpp:2455
-msgid "???"
-msgstr "???"
-
-#: audio/fmopl.cpp:49
-msgid "MAME OPL emulator"
-msgstr "Émulateur MAME OPL"
-
-#: audio/fmopl.cpp:51
-msgid "DOSBox OPL emulator"
-msgstr "Émulateur DOSBox OPL"
-
-#: audio/mididrv.cpp:209
-#, c-format
-msgid ""
-"The selected audio device '%s' was not found (e.g. might be turned off or "
-"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:209 audio/mididrv.cpp:221 audio/mididrv.cpp:257
-#: audio/mididrv.cpp:272
-msgid "Attempting to fall back to the next available device..."
-msgstr "Essaye d'utiliser le prochain périphérique disponible..."
-
-#: audio/mididrv.cpp:221
-#, c-format
-msgid ""
-"The selected audio device '%s' cannot be used. See log file for more "
-"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:257
-#, c-format
-msgid ""
-"The preferred audio device '%s' was not found (e.g. might be turned off or "
-"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:272
-#, c-format
-msgid ""
-"The preferred audio device '%s' cannot be used. See log file for more "
-"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"
-msgstr "Pas de musique"
-
-#: audio/mods/paula.cpp:189
-msgid "Amiga Audio Emulator"
-msgstr "Émulateur Amiga Audio"
-
-#: audio/softsynth/adlib.cpp:2284
-msgid "AdLib Emulator"
-msgstr "Émulateur AdLib"
-
-#: audio/softsynth/appleiigs.cpp:33
-msgid "Apple II GS Emulator (NOT IMPLEMENTED)"
-msgstr "Émulateur Apple II GS (PAS IMPLÉMENTÉ)"
-
-#: audio/softsynth/sid.cpp:1430
-msgid "C64 Audio Emulator"
-msgstr "Émulateur C64 Audio"
-
-#: audio/softsynth/mt32.cpp:205
-msgid "Initializing MT-32 Emulator"
-msgstr "Initialisation de l'Émulateur MT-32"
-
-#: audio/softsynth/mt32.cpp:431
-msgid "MT-32 Emulator"
-msgstr "Émulateur MT-32"
-
-#: audio/softsynth/pcspk.cpp:139
-msgid "PC Speaker Emulator"
-msgstr "Émulateur Haut Parleur PC"
-
-#: audio/softsynth/pcspk.cpp:158
-msgid "IBM PCjr Emulator"
-msgstr "Émulateur IBM PCjr"
-
-#: backends/keymapper/remap-dialog.cpp:47
-msgid "Keymap:"
-msgstr "Affectation des touches:"
-
-#: backends/keymapper/remap-dialog.cpp:66
-msgid " (Effective)"
-msgstr "(Effectif)"
-
-#: backends/keymapper/remap-dialog.cpp:106
-msgid " (Active)"
-msgstr "(Actif)"
-
-#: backends/keymapper/remap-dialog.cpp:106
-msgid " (Blocked)"
-msgstr "(Bloqué)"
-
-#: backends/keymapper/remap-dialog.cpp:119
-msgid " (Global)"
-msgstr "(Global)"
-
-#: backends/keymapper/remap-dialog.cpp:127
-msgid " (Game)"
-msgstr "(Jeu)"
-
-#: backends/midi/windows.cpp:164
-msgid "Windows MIDI"
-msgstr "MIDI Windows"
-
-#: backends/platform/ds/arm9/source/dsoptions.cpp:57
-msgid "ScummVM Main Menu"
-msgstr "Menu Principal ScummVM"
-
-#: backends/platform/ds/arm9/source/dsoptions.cpp:63
-msgid "~L~eft handed mode"
-msgstr "Mode ~G~aucher"
-
-#: backends/platform/ds/arm9/source/dsoptions.cpp:64
-msgid "~I~ndy fight controls"
-msgstr "Contrôle des combats d'~I~ndy"
-
-#: backends/platform/ds/arm9/source/dsoptions.cpp:65
-msgid "Show mouse cursor"
-msgstr "Afficher le curseur de la souris"
-
-#: backends/platform/ds/arm9/source/dsoptions.cpp:66
-msgid "Snap to edges"
-msgstr "Aligner sur les bords"
-
-#: backends/platform/ds/arm9/source/dsoptions.cpp:68
-msgid "Touch X Offset"
-msgstr "Décalage X du toucher"
-
-#: backends/platform/ds/arm9/source/dsoptions.cpp:75
-msgid "Touch Y Offset"
-msgstr "Décallage Y du toucher"
-
-#: backends/platform/ds/arm9/source/dsoptions.cpp:87
-msgid "Use laptop trackpad-style cursor control"
-msgstr "Activer le contrôle du curseur de type trackpad"
-
-#: backends/platform/ds/arm9/source/dsoptions.cpp:88
-msgid "Tap for left click, double tap right click"
-msgstr "Toucher pour un clic gauche, toucher deux fois pour un clic droit"
-
-#: backends/platform/ds/arm9/source/dsoptions.cpp:90
-msgid "Sensitivity"
-msgstr "Sensibilité"
-
-#: backends/platform/ds/arm9/source/dsoptions.cpp:99
-msgid "Initial top screen scale:"
-msgstr "Échelle initiale de l'écran du haut"
-
-#: backends/platform/ds/arm9/source/dsoptions.cpp:105
-msgid "Main screen scaling:"
-msgstr "Échelle de l'écran principal"
-
-#: backends/platform/ds/arm9/source/dsoptions.cpp:107
-msgid "Hardware scale (fast, but low quality)"
-msgstr "Mise à l'echelle matérielle (rapide mais qualité faible)"
-
-#: backends/platform/ds/arm9/source/dsoptions.cpp:108
-msgid "Software scale (good quality, but slower)"
-msgstr "Mise à l'échelle logicielle (bonne qualité mais plus lent)"
-
-#: backends/platform/ds/arm9/source/dsoptions.cpp:109
-msgid "Unscaled (you must scroll left and right)"
-msgstr "Sans changement d'échelle (vous devez faire défiler l'écran)"
-
-#: backends/platform/ds/arm9/source/dsoptions.cpp:111
-msgid "Brightness:"
-msgstr "Luminosité:"
-
-#: backends/platform/ds/arm9/source/dsoptions.cpp:121
-msgid "High quality audio (slower) (reboot)"
-msgstr "Audio haute qualité (plus lent) (redémarrer)"
-
-#: backends/platform/ds/arm9/source/dsoptions.cpp:122
-msgid "Disable power off"
-msgstr "Désactivé l'extinction"
-
-#: backends/platform/iphone/osys_events.cpp:300
-msgid "Mouse-click-and-drag mode enabled."
-msgstr "Mode souris-cliquer-et-déplacer activé"
-
-#: backends/platform/iphone/osys_events.cpp:302
-msgid "Mouse-click-and-drag mode disabled."
-msgstr "Mode souris-cliquer-et-déplacer désactivé"
-
-#: backends/platform/iphone/osys_events.cpp:313
-msgid "Touchpad mode enabled."
-msgstr "Mode touchpad activé"
-
-#: backends/platform/iphone/osys_events.cpp:315
-msgid "Touchpad mode disabled."
-msgstr "Mode touchpad désactivé"
-
-#: backends/platform/maemo/maemo.cpp:209
-msgid "Click Mode"
-msgstr "Mode Clic"
-
-#: backends/platform/maemo/maemo.cpp:215
-#: 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/maemo/maemo.cpp:218
-msgid "Middle Click"
-msgstr "Clic Milieu"
-
-#: backends/platform/maemo/maemo.cpp:221
-#: 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"
-
-#: backends/platform/sdl/macosx/appmenu_osx.mm:77
-msgid "Hide ScummVM"
-msgstr "Masquer ScummVM"
-
-#: backends/platform/sdl/macosx/appmenu_osx.mm:82
-msgid "Hide Others"
-msgstr "Masquer les autres"
-
-#: backends/platform/sdl/macosx/appmenu_osx.mm:87
-msgid "Show All"
-msgstr "Tout afficher"
-
-#: backends/platform/sdl/macosx/appmenu_osx.mm:109
-#: backends/platform/sdl/macosx/appmenu_osx.mm:120
-msgid "Window"
-msgstr "Fenêtre"
-
-#: backends/platform/sdl/macosx/appmenu_osx.mm:114
-msgid "Minimize"
-msgstr "Placer dans le Dock"
-
-#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:45
-msgid "Normal (no scaling)"
-msgstr "Normal (échelle d'origine)"
-
-#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:64
-msgctxt "lowres"
-msgid "Normal (no scaling)"
-msgstr "Normal"
-
-#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2135
-#: backends/graphics/openglsdl/openglsdl-graphics.cpp:537
-msgid "Enabled aspect ratio correction"
-msgstr "Activer la correction du rapport d'aspect"
-
-#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2141
-#: backends/graphics/openglsdl/openglsdl-graphics.cpp:542
-msgid "Disabled aspect ratio correction"
-msgstr "Désactiver la correction du rapport d'aspect"
-
-#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2196
-msgid "Active graphics filter:"
-msgstr "Mode graphique actif:"
-
-#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2238
-#: backends/graphics/openglsdl/openglsdl-graphics.cpp:481
-msgid "Windowed mode"
-msgstr "Mode Fenêtre"
-
-#: backends/graphics/opengl/opengl-graphics.cpp:135
-msgid "OpenGL Normal"
-msgstr "OpenGL Normal"
-
-#: backends/graphics/opengl/opengl-graphics.cpp:136
-msgid "OpenGL Conserve"
-msgstr "OpenGL Préserve"
-
-#: backends/graphics/opengl/opengl-graphics.cpp:137
-msgid "OpenGL Original"
-msgstr "OpenGL Originel"
-
-#: backends/graphics/openglsdl/openglsdl-graphics.cpp:415
-msgid "Current display mode"
-msgstr "Mode vidéo actuel"
-
-#: backends/graphics/openglsdl/openglsdl-graphics.cpp:428
-msgid "Current scale"
-msgstr "Échelle actuelle"
-
-#: backends/graphics/openglsdl/openglsdl-graphics.cpp:562
-msgid "Active filter mode: Linear"
-msgstr "Filtre actif: Linéaire"
-
-#: backends/graphics/openglsdl/openglsdl-graphics.cpp:564
-msgid "Active filter mode: Nearest"
-msgstr "Filtre actif: Plus proche"
-
-#: backends/platform/symbian/src/SymbianActions.cpp:38
-#: backends/platform/wince/CEActionsSmartphone.cpp:39
-msgid "Up"
-msgstr "Haut"
-
-#: backends/platform/symbian/src/SymbianActions.cpp:39
-#: backends/platform/wince/CEActionsSmartphone.cpp:40
-msgid "Down"
-msgstr "Bas"
-
-#: backends/platform/symbian/src/SymbianActions.cpp:40
-#: backends/platform/wince/CEActionsSmartphone.cpp:41
-msgid "Left"
-msgstr "Gauche"
-
-#: backends/platform/symbian/src/SymbianActions.cpp:41
-#: backends/platform/wince/CEActionsSmartphone.cpp:42
-msgid "Right"
-msgstr "Droite"
-
-#: backends/platform/symbian/src/SymbianActions.cpp:46
-#: backends/platform/wince/CEActionsSmartphone.cpp:47
-msgid "Zone"
-msgstr "Zone"
-
-#: backends/platform/symbian/src/SymbianActions.cpp:47
-#: backends/platform/wince/CEActionsPocket.cpp:54
-#: backends/platform/wince/CEActionsSmartphone.cpp:48
-msgid "Multi Function"
-msgstr "Fonction Multiple"
-
-#: backends/platform/symbian/src/SymbianActions.cpp:48
-msgid "Swap character"
-msgstr "Changement de personnage"
-
-#: backends/platform/symbian/src/SymbianActions.cpp:49
-msgid "Skip text"
-msgstr "Sauter le texte"
-
-#: backends/platform/symbian/src/SymbianActions.cpp:51
-msgid "Fast mode"
-msgstr "Mode rapide"
-
-#: backends/platform/symbian/src/SymbianActions.cpp:53
-msgid "Debugger"
-msgstr "Debugger"
-
-#: backends/platform/symbian/src/SymbianActions.cpp:54
-msgid "Global menu"
-msgstr "Menu global"
-
-#: backends/platform/symbian/src/SymbianActions.cpp:55
-msgid "Virtual keyboard"
-msgstr "Clavier virtuel"
-
-#: backends/platform/symbian/src/SymbianActions.cpp:56
-msgid "Key mapper"
-msgstr "Affectation des touches"
-
-#: backends/events/symbiansdl/symbiansdl-events.cpp:184
-msgid "Do you want to quit ?"
-msgstr "Voulez-vous quitter ?"
-
-#: backends/platform/wii/options.cpp:51
-msgid "Video"
-msgstr "Vidéo"
-
-#: backends/platform/wii/options.cpp:54
-msgid "Current video mode:"
-msgstr "Mode vidéo actuel"
-
-#: backends/platform/wii/options.cpp:56
-msgid "Double-strike"
-msgstr "Coup double"
-
-#: backends/platform/wii/options.cpp:60
-msgid "Horizontal underscan:"
-msgstr "Underscan horizontal:"
-
-#: backends/platform/wii/options.cpp:66
-msgid "Vertical underscan:"
-msgstr "Underscan vertical:"
-
-#: backends/platform/wii/options.cpp:71
-msgid "Input"
-msgstr "Entrée"
-
-#: backends/platform/wii/options.cpp:74
-msgid "GC Pad sensitivity:"
-msgstr "Sensibilité du pad GC:"
-
-#: backends/platform/wii/options.cpp:80
-msgid "GC Pad acceleration:"
-msgstr "Acceleration du pad GC:"
-
-#: backends/platform/wii/options.cpp:86
-msgid "DVD"
-msgstr "DVD"
-
-#: backends/platform/wii/options.cpp:89 backends/platform/wii/options.cpp:101
-msgid "Status:"
-msgstr "Status:"
-
-#: backends/platform/wii/options.cpp:90 backends/platform/wii/options.cpp:102
-msgid "Unknown"
-msgstr "Inconue"
-
-#: backends/platform/wii/options.cpp:93
-msgid "Mount DVD"
-msgstr "Monter le DVD"
-
-#: backends/platform/wii/options.cpp:94
-msgid "Unmount DVD"
-msgstr "Démonter le DVD"
-
-#: backends/platform/wii/options.cpp:98
-msgid "SMB"
-msgstr "SMB"
-
-#: backends/platform/wii/options.cpp:106
-msgid "Server:"
-msgstr "Serveur:"
-
-#: backends/platform/wii/options.cpp:110
-msgid "Share:"
-msgstr "Disque partagé:"
-
-#: backends/platform/wii/options.cpp:114
-msgid "Username:"
-msgstr "Nom d'utilisateur:"
-
-#: backends/platform/wii/options.cpp:118
-msgid "Password:"
-msgstr "Mot de passe:"
-
-#: backends/platform/wii/options.cpp:121
-msgid "Init network"
-msgstr "Initialiser le réseau"
-
-#: backends/platform/wii/options.cpp:123
-msgid "Mount SMB"
-msgstr "Monter SMB"
-
-#: backends/platform/wii/options.cpp:124
-msgid "Unmount SMB"
-msgstr "Démonter SMB"
-
-#: backends/platform/wii/options.cpp:143
-msgid "DVD Mounted successfully"
-msgstr "DVD monté avec succès"
-
-#: backends/platform/wii/options.cpp:146
-msgid "Error while mounting the DVD"
-msgstr "Échec du montage du DVD"
-
-#: backends/platform/wii/options.cpp:148
-msgid "DVD not mounted"
-msgstr "DVD non monté"
-
-#: backends/platform/wii/options.cpp:161
-msgid "Network up, share mounted"
-msgstr "Réseau connecté, disque partagé monté"
-
-#: backends/platform/wii/options.cpp:163
-msgid "Network up"
-msgstr "Réseau connecté"
-
-#: backends/platform/wii/options.cpp:166
-msgid ", error while mounting the share"
-msgstr ", échec du montage du disque partagé"
-
-#: backends/platform/wii/options.cpp:168
-msgid ", share not mounted"
-msgstr ", disque partagé non monté"
-
-#: backends/platform/wii/options.cpp:174
-msgid "Network down"
-msgstr "Réseau déconnecté"
-
-#: backends/platform/wii/options.cpp:178
-msgid "Initializing network"
-msgstr "Initialisation du réseau"
-
-#: backends/platform/wii/options.cpp:182
-msgid "Timeout while initializing network"
-msgstr "Dépassement du délai lors de l'initialisation du réseau"
-
-#: backends/platform/wii/options.cpp:186
-#, c-format
-msgid "Network not initialized (%d)"
-msgstr "Réseau non initialisé (%d)"
-
-#: backends/platform/wince/CEActionsPocket.cpp:46
-msgid "Hide Toolbar"
-msgstr "Caché la barre d'outils"
-
-#: backends/platform/wince/CEActionsPocket.cpp:47
-msgid "Show Keyboard"
-msgstr "Afficher le clavier"
-
-#: backends/platform/wince/CEActionsPocket.cpp:48
-msgid "Sound on/off"
-msgstr "Audio marche/arrêt"
-
-#: backends/platform/wince/CEActionsPocket.cpp:49
-msgid "Right click"
-msgstr "Clic droit"
-
-#: backends/platform/wince/CEActionsPocket.cpp:50
-msgid "Show/Hide Cursor"
-msgstr "Afficher/Cacher le curseur"
-
-#: backends/platform/wince/CEActionsPocket.cpp:51
-msgid "Free look"
-msgstr "Regarder autour"
-
-#: backends/platform/wince/CEActionsPocket.cpp:52
-msgid "Zoom up"
-msgstr "Dézoomer"
-
-#: backends/platform/wince/CEActionsPocket.cpp:53
-msgid "Zoom down"
-msgstr "Zoomer"
-
-#: backends/platform/wince/CEActionsPocket.cpp:55
-#: backends/platform/wince/CEActionsSmartphone.cpp:49
-msgid "Bind Keys"
-msgstr "Affecter les touches"
-
-#: backends/platform/wince/CEActionsPocket.cpp:56
-msgid "Cursor Up"
-msgstr "Haut"
-
-#: backends/platform/wince/CEActionsPocket.cpp:57
-msgid "Cursor Down"
-msgstr "Bas"
-
-#: backends/platform/wince/CEActionsPocket.cpp:58
-msgid "Cursor Left"
-msgstr "Gauche"
-
-#: backends/platform/wince/CEActionsPocket.cpp:59
-msgid "Cursor Right"
-msgstr "Droit"
-
-#: 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:326
-#: backends/platform/wince/CEActionsSmartphone.cpp:287
-msgid " Are you sure you want to quit ? "
-msgstr "Voulez-vous vraiment quitter ?"
-
-#: backends/platform/wince/CEActionsSmartphone.cpp:50
-msgid "Keyboard"
-msgstr "Clavier"
-
-#: backends/platform/wince/CEActionsSmartphone.cpp:51
-msgid "Rotate"
-msgstr "Pivoter"
-
-#: backends/platform/wince/CELauncherDialog.cpp:56
-msgid "Using SDL driver "
-msgstr "Utilise le pilote SDL"
-
-#: backends/platform/wince/CELauncherDialog.cpp:60
-msgid "Display "
-msgstr "Affichage"
-
-#: 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:515
-msgid "Map right click action"
-msgstr "Affecter l'action 'Clic Droit'"
-
-#: 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:528
-msgid "Map hide toolbar action"
-msgstr "Affecter l'action 'Cacher Bar d'Outils'"
-
-#: 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:541
-msgid "Map Zoom Up action (optional)"
-msgstr "Affecter l'action 'Dézoomer' (optionnelle)"
-
-#: 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:552
-msgid ""
-"Don't forget to map a key to 'Hide Toolbar' action to see the whole inventory"
-msgstr ""
-"Noubliez pas d'affecter une touche à l'action 'Cacher Bar d'Outils' pour "
-"pouvoir voir entièrement l'inventaire"
-
-#: backends/events/default/default-events.cpp:193
-msgid "Do you really want to return to the Launcher?"
-msgstr "Voulez-vous vraiment retourner au Lanceur ?"
-
-#: backends/events/default/default-events.cpp:193
-msgid "Launcher"
-msgstr "Lanceur"
-
-#: backends/events/default/default-events.cpp:215
-msgid "Do you really want to quit?"
-msgstr "Voulez-vous vraiment quitter ?"
-
-#: backends/events/gph/gph-events.cpp:386
-#: backends/events/gph/gph-events.cpp:429
-#: backends/events/openpandora/op-events.cpp:168
-msgid "Touchscreen 'Tap Mode' - Left Click"
-msgstr "Touchscreen 'Tap Mode' - Clic Gauche"
-
-#: backends/events/gph/gph-events.cpp:388
-#: backends/events/gph/gph-events.cpp:431
-#: backends/events/openpandora/op-events.cpp:170
-msgid "Touchscreen 'Tap Mode' - Right Click"
-msgstr "Touchscreen 'Tap Mode' - Clic Droit"
-
-#: backends/events/gph/gph-events.cpp:390
-#: backends/events/gph/gph-events.cpp:433
-#: backends/events/openpandora/op-events.cpp:172
-msgid "Touchscreen 'Tap Mode' - Hover (No Click)"
-msgstr "Touchscreen 'Tap Mode' - Déplacer sans cliquer"
-
-#: backends/events/gph/gph-events.cpp:410
-msgid "Maximum Volume"
-msgstr "Volume Maximum"
+#~ msgctxt "lowres"
+#~ msgid "Mass Add..."
+#~ msgstr "Ajout Massif..."
-#: backends/events/gph/gph-events.cpp:412
-msgid "Increasing Volume"
-msgstr "Augmentation Volume"
+#~ msgid "Mass Add..."
+#~ msgstr "Ajout Massif..."
-#: backends/events/gph/gph-events.cpp:418
-msgid "Minimal Volume"
-msgstr "Volume Minimum"
+#~ msgid ""
+#~ "Turns off General MIDI mapping for games with Roland MT-32 soundtrack"
+#~ msgstr "Désactiver la conversion des pistes MT-32 en General MIDI"
-#: backends/events/gph/gph-events.cpp:420
-msgid "Decreasing Volume"
-msgstr "Diminution Volume"
+#~ msgid "Standard (16bpp)"
+#~ msgstr "Standard (16bpp)"
-#: backends/events/openpandora/op-events.cpp:174
-msgid "Touchscreen 'Tap Mode' - Hover (DPad Clicks)"
-msgstr "Touchscreen 'Tap Mode' - Déplacer sans cliquer"
+#~ msgid "Alternative intro"
+#~ msgstr "Intro alternative"
-#: backends/updates/macosx/macosx-updates.mm:67
-msgid "Check for Updates..."
-msgstr "Recherche des mises à jour..."
+#~ msgid "Use an alternative game intro (CD version only)"
+#~ msgstr "Utiliser une intro alternative (version CD uniquement)"
-#: backends/platform/bada/form.cpp:269
-msgid "Right Click Once"
-msgstr "Simple Clic Droit"
+#~ msgid "MPEG2 cutscenes are no longer supported"
+#~ msgstr "Les séquences MPEG2 ne sont plus supportées"
-#: backends/platform/bada/form.cpp:277
-msgid "Move Only"
-msgstr "Déplacer Uniquement"
+#~ msgid "OpenGL Normal"
+#~ msgstr "OpenGL Normal"
-#: backends/platform/bada/form.cpp:291
-msgid "Escape Key"
-msgstr "Touche d'échappement"
+#~ msgid "OpenGL Conserve"
+#~ msgstr "OpenGL Préserve"
-#: backends/platform/bada/form.cpp:296
-msgid "Game Menu"
-msgstr "Menu du Jeu"
+#~ msgid "OpenGL Original"
+#~ msgstr "OpenGL Originel"
-#: backends/platform/bada/form.cpp:301
-msgid "Show Keypad"
-msgstr "Afficher le clavier"
+#~ msgid "Current display mode"
+#~ msgstr "Mode vidéo actuel"
-#: backends/platform/bada/form.cpp:309
-msgid "Control Mouse"
-msgstr "Contrôles la Souris"
+#~ msgid "Current scale"
+#~ msgstr "Échelle actuelle"
-#: backends/events/maemosdl/maemosdl-events.cpp:192
-msgid "Clicking Enabled"
-msgstr "Clic Activé"
+#~ msgid "Active filter mode: Linear"
+#~ msgstr "Filtre actif: Linéaire"
-#: backends/events/maemosdl/maemosdl-events.cpp:192
-msgid "Clicking Disabled"
-msgstr "Clic Désactivé"
+#~ msgid "Active filter mode: Nearest"
+#~ msgstr "Filtre actif: Plus proche"
#~ msgid "Enable Roland GS Mode"
#~ msgstr "Activer le mode Roland GS"
diff --git a/po/gl_ES.po b/po/gl_ES.po
index cce9a5dfa7..f6fb04b619 100644
--- a/po/gl_ES.po
+++ b/po/gl_ES.po
@@ -1,5 +1,5 @@
# Galician translation for ScummVM.
-# Copyright (C) 2010-2013 ScummVM Team
+# Copyright (C) 2010-2014 ScummVM Team
# This file is distributed under the same license as the ScummVM package.
# Santiago G. Sanz <s.sanz@uvigo.es>, 2013.
#
@@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: ScummVM 1.6.0git\n"
"Report-Msgid-Bugs-To: scummvm-devel@lists.sf.net\n"
-"POT-Creation-Date: 2013-04-24 13:35+0100\n"
+"POT-Creation-Date: 2014-06-07 23:06+0100\n"
"PO-Revision-Date: 2013-04-24 15:41+0100\n"
"Last-Translator: Santiago G. Sanz <s.sanz@uvigo.es>\n"
"Language-Team: Santiago G. Sanz <s.sanz@uvigo.es>\n"
@@ -16,77 +16,77 @@ msgstr ""
"Content-Type: text/plain; charset=iso-8859-1\n"
"Content-Transfer-Encoding: 8bit\n"
-#: gui/about.cpp:93
+#: gui/about.cpp:94
#, c-format
msgid "(built on %s)"
msgstr "(compilado o %s)"
-#: gui/about.cpp:100
+#: gui/about.cpp:101
msgid "Features compiled in:"
msgstr "Funcionalidades compiladas:"
-#: gui/about.cpp:109
+#: gui/about.cpp:110
msgid "Available engines:"
msgstr "Motores dispoñibles:"
-#: gui/browser.cpp:67
+#: gui/browser.cpp:68
msgid "Show hidden files"
msgstr "Mostrar ficheiros ocultos"
-#: gui/browser.cpp:67
+#: gui/browser.cpp:68
msgid "Show files marked with the hidden attribute"
msgstr "Mostra os ficheiros marcados co atributo Oculto."
-#: gui/browser.cpp:71
+#: gui/browser.cpp:72
msgid "Go up"
msgstr "Arriba"
-#: gui/browser.cpp:71 gui/browser.cpp:73
+#: gui/browser.cpp:72 gui/browser.cpp:74
msgid "Go to previous directory level"
msgstr "Ir ao directorio superior"
-#: gui/browser.cpp:73
+#: gui/browser.cpp:74
msgctxt "lowres"
msgid "Go up"
msgstr "Arriba"
-#: gui/browser.cpp:74 gui/chooser.cpp:45 gui/KeysDialog.cpp:43
-#: gui/launcher.cpp:345 gui/massadd.cpp:94 gui/options.cpp:1238
-#: gui/saveload-dialog.cpp:215 gui/saveload-dialog.cpp:275
-#: gui/saveload-dialog.cpp:545 gui/saveload-dialog.cpp:919
-#: gui/themebrowser.cpp:54 gui/fluidsynth-dialog.cpp:151
-#: engines/engine.cpp:447 engines/drascula/saveload.cpp:51
-#: engines/scumm/dialogs.cpp:190 engines/sword1/control.cpp:865
-#: engines/parallaction/saveload.cpp:274 backends/platform/wii/options.cpp:48
-#: backends/events/default/default-events.cpp:193
-#: backends/events/default/default-events.cpp:215
+#: gui/browser.cpp:75 gui/chooser.cpp:46 gui/KeysDialog.cpp:43
+#: gui/launcher.cpp:351 gui/massadd.cpp:95 gui/options.cpp:1239
+#: gui/saveload-dialog.cpp:216 gui/saveload-dialog.cpp:276
+#: gui/saveload-dialog.cpp:547 gui/saveload-dialog.cpp:922
+#: gui/themebrowser.cpp:55 gui/fluidsynth-dialog.cpp:152
+#: engines/engine.cpp:452 backends/platform/wii/options.cpp:48
+#: backends/events/default/default-events.cpp:196
+#: backends/events/default/default-events.cpp:218
+#: engines/drascula/saveload.cpp:49 engines/parallaction/saveload.cpp:274
+#: engines/scumm/dialogs.cpp:191 engines/sword1/control.cpp:865
msgid "Cancel"
msgstr "Cancelar"
-#: gui/browser.cpp:75 gui/chooser.cpp:46 gui/themebrowser.cpp:55
+#: gui/browser.cpp:76 gui/chooser.cpp:47 gui/themebrowser.cpp:56
msgid "Choose"
msgstr "Elexir"
-#: gui/gui-manager.cpp:115 engines/scumm/help.cpp:125
-#: engines/scumm/help.cpp:140 engines/scumm/help.cpp:165
-#: engines/scumm/help.cpp:191 engines/scumm/help.cpp:209
-#: backends/keymapper/remap-dialog.cpp:52
+#: gui/gui-manager.cpp:117 backends/keymapper/remap-dialog.cpp:53
+#: engines/scumm/help.cpp:125 engines/scumm/help.cpp:140
+#: engines/scumm/help.cpp:165 engines/scumm/help.cpp:191
+#: engines/scumm/help.cpp:209
msgid "Close"
msgstr "Pechar"
-#: gui/gui-manager.cpp:118
+#: gui/gui-manager.cpp:120
msgid "Mouse click"
msgstr "Premer co rato"
-#: gui/gui-manager.cpp:122 base/main.cpp:301
+#: gui/gui-manager.cpp:124 base/main.cpp:319
msgid "Display keyboard"
msgstr "Mostrar teclado"
-#: gui/gui-manager.cpp:126 base/main.cpp:305
+#: gui/gui-manager.cpp:128 base/main.cpp:323
msgid "Remap keys"
msgstr "Asignar teclas"
-#: gui/gui-manager.cpp:129 base/main.cpp:308
+#: gui/gui-manager.cpp:131 base/main.cpp:326
msgid "Toggle FullScreen"
msgstr "Activar/desactivar pantalla completa"
@@ -98,21 +98,21 @@ msgstr "Elixe unha acción para asignala"
msgid "Map"
msgstr "Asignar"
-#: gui/KeysDialog.cpp:42 gui/launcher.cpp:346 gui/launcher.cpp:1001
-#: gui/launcher.cpp:1005 gui/massadd.cpp:91 gui/options.cpp:1239
-#: gui/saveload-dialog.cpp:920 gui/fluidsynth-dialog.cpp:152
-#: engines/engine.cpp:366 engines/engine.cpp:377
-#: engines/drascula/saveload.cpp:51 engines/scumm/dialogs.cpp:192
-#: engines/scumm/scumm.cpp:1778 engines/agos/animation.cpp:558
-#: engines/groovie/script.cpp:420 engines/sky/compact.cpp:131
-#: engines/sky/compact.cpp:141 engines/sword1/animation.cpp:519
-#: engines/sword1/animation.cpp:540 engines/sword1/animation.cpp:550
-#: engines/sword1/animation.cpp:557 engines/sword1/control.cpp:865
-#: engines/sword1/logic.cpp:1633 engines/sword2/animation.cpp:419
-#: engines/sword2/animation.cpp:439 engines/sword2/animation.cpp:449
-#: engines/sword2/animation.cpp:458 engines/parallaction/saveload.cpp:274
+#: gui/KeysDialog.cpp:42 gui/launcher.cpp:352 gui/launcher.cpp:1048
+#: gui/launcher.cpp:1052 gui/massadd.cpp:92 gui/options.cpp:1240
+#: gui/saveload-dialog.cpp:923 gui/fluidsynth-dialog.cpp:153
+#: engines/engine.cpp:371 engines/engine.cpp:382
#: backends/platform/wii/options.cpp:47
#: backends/platform/wince/CELauncherDialog.cpp:54
+#: engines/agos/animation.cpp:558 engines/drascula/saveload.cpp:49
+#: engines/groovie/script.cpp:399 engines/parallaction/saveload.cpp:274
+#: engines/scumm/dialogs.cpp:193 engines/scumm/scumm.cpp:1779
+#: engines/sky/compact.cpp:131 engines/sky/compact.cpp:141
+#: engines/sword1/animation.cpp:524 engines/sword1/animation.cpp:545
+#: engines/sword1/animation.cpp:561 engines/sword1/animation.cpp:569
+#: engines/sword1/control.cpp:865 engines/sword1/logic.cpp:1633
+#: engines/sword2/animation.cpp:425 engines/sword2/animation.cpp:445
+#: engines/sword2/animation.cpp:461 engines/sword2/animation.cpp:471
msgid "OK"
msgstr "Aceptar"
@@ -138,15 +138,15 @@ msgstr "Selecciona unha acción"
msgid "Press the key to associate"
msgstr "Preme a tecla para asociala"
-#: gui/launcher.cpp:187
+#: gui/launcher.cpp:193
msgid "Game"
msgstr "Xogo"
-#: gui/launcher.cpp:191
+#: gui/launcher.cpp:197
msgid "ID:"
msgstr "ID:"
-#: gui/launcher.cpp:191 gui/launcher.cpp:193 gui/launcher.cpp:194
+#: gui/launcher.cpp:197 gui/launcher.cpp:199 gui/launcher.cpp:200
msgid ""
"Short game identifier used for referring to savegames and running the game "
"from the command line"
@@ -154,314 +154,315 @@ msgstr ""
"Identificador curto do xogo para os ficheiros de gardado e a execución do "
"xogo dende a liña de comandos"
-#: gui/launcher.cpp:193
+#: gui/launcher.cpp:199
msgctxt "lowres"
msgid "ID:"
msgstr "ID:"
-#: gui/launcher.cpp:198
+#: gui/launcher.cpp:204
msgid "Name:"
msgstr "Nome:"
-#: gui/launcher.cpp:198 gui/launcher.cpp:200 gui/launcher.cpp:201
+#: gui/launcher.cpp:204 gui/launcher.cpp:206 gui/launcher.cpp:207
msgid "Full title of the game"
msgstr "Título completo do xogo"
-#: gui/launcher.cpp:200
+#: gui/launcher.cpp:206
msgctxt "lowres"
msgid "Name:"
msgstr "Nome:"
-#: gui/launcher.cpp:204
+#: gui/launcher.cpp:210
msgid "Language:"
msgstr "Idioma:"
-#: gui/launcher.cpp:204 gui/launcher.cpp:205
+#: gui/launcher.cpp:210 gui/launcher.cpp:211
msgid ""
"Language of the game. This will not turn your Spanish game version into "
"English"
msgstr "Idioma do xogo. Non converterá a versión galega do xogo en inglesa"
-#: gui/launcher.cpp:206 gui/launcher.cpp:220 gui/options.cpp:86
-#: gui/options.cpp:736 gui/options.cpp:749 gui/options.cpp:1209
-#: audio/null.cpp:40
+#: gui/launcher.cpp:212 gui/launcher.cpp:226 gui/options.cpp:87
+#: gui/options.cpp:737 gui/options.cpp:750 gui/options.cpp:1210
+#: audio/null.cpp:41
msgid "<default>"
msgstr "<por defecto>"
-#: gui/launcher.cpp:216
+#: gui/launcher.cpp:222
msgid "Platform:"
msgstr "Plataforma:"
-#: gui/launcher.cpp:216 gui/launcher.cpp:218 gui/launcher.cpp:219
+#: gui/launcher.cpp:222 gui/launcher.cpp:224 gui/launcher.cpp:225
msgid "Platform the game was originally designed for"
msgstr "Plataforma para a que se desenvolvera o xogo inicialmente"
-#: gui/launcher.cpp:218
+#: gui/launcher.cpp:224
msgctxt "lowres"
msgid "Platform:"
msgstr "Plataforma:"
-#: gui/launcher.cpp:231
+#: gui/launcher.cpp:237
msgid "Engine"
msgstr "Motor"
-#: gui/launcher.cpp:239 gui/options.cpp:1072 gui/options.cpp:1089
+#: gui/launcher.cpp:245 gui/options.cpp:1073 gui/options.cpp:1090
msgid "Graphics"
msgstr "Gráficos"
-#: gui/launcher.cpp:239 gui/options.cpp:1072 gui/options.cpp:1089
+#: gui/launcher.cpp:245 gui/options.cpp:1073 gui/options.cpp:1090
msgid "GFX"
msgstr "Efectos gráficos"
-#: gui/launcher.cpp:242
+#: gui/launcher.cpp:248
msgid "Override global graphic settings"
msgstr "Anular a configuración dos gráficos"
-#: gui/launcher.cpp:244
+#: gui/launcher.cpp:250
msgctxt "lowres"
msgid "Override global graphic settings"
msgstr "Anular a configuración dos gráficos"
-#: gui/launcher.cpp:251 gui/options.cpp:1095
+#: gui/launcher.cpp:257 gui/options.cpp:1096
msgid "Audio"
msgstr "Son"
-#: gui/launcher.cpp:254
+#: gui/launcher.cpp:260
msgid "Override global audio settings"
msgstr "Anular a configuración do son"
-#: gui/launcher.cpp:256
+#: gui/launcher.cpp:262
msgctxt "lowres"
msgid "Override global audio settings"
msgstr "Anular a configuración do son"
-#: gui/launcher.cpp:265 gui/options.cpp:1100
+#: gui/launcher.cpp:271 gui/options.cpp:1101
msgid "Volume"
msgstr "Volume"
-#: gui/launcher.cpp:267 gui/options.cpp:1102
+#: gui/launcher.cpp:273 gui/options.cpp:1103
msgctxt "lowres"
msgid "Volume"
msgstr "Volume"
-#: gui/launcher.cpp:270
+#: gui/launcher.cpp:276
msgid "Override global volume settings"
msgstr "Anular a configuración do volume"
-#: gui/launcher.cpp:272
+#: gui/launcher.cpp:278
msgctxt "lowres"
msgid "Override global volume settings"
msgstr "Anular a configuración do volume"
-#: gui/launcher.cpp:280 gui/options.cpp:1110
+#: gui/launcher.cpp:286 gui/options.cpp:1111
msgid "MIDI"
msgstr "MIDI"
-#: gui/launcher.cpp:283
+#: gui/launcher.cpp:289
msgid "Override global MIDI settings"
msgstr "Anular a configuración de MIDI"
-#: gui/launcher.cpp:285
+#: gui/launcher.cpp:291
msgctxt "lowres"
msgid "Override global MIDI settings"
msgstr "Anular a configuración de MIDI"
-#: gui/launcher.cpp:294 gui/options.cpp:1116
+#: gui/launcher.cpp:300 gui/options.cpp:1117
msgid "MT-32"
msgstr "MT-32"
-#: gui/launcher.cpp:297
+#: gui/launcher.cpp:303
msgid "Override global MT-32 settings"
msgstr "Anular a configuración de MT-32"
-#: gui/launcher.cpp:299
+#: gui/launcher.cpp:305
msgctxt "lowres"
msgid "Override global MT-32 settings"
msgstr "Anular a configuración de MT-32"
-#: gui/launcher.cpp:308 gui/options.cpp:1123
+#: gui/launcher.cpp:314 gui/options.cpp:1124
msgid "Paths"
msgstr "Camiños"
-#: gui/launcher.cpp:310 gui/options.cpp:1125
+#: gui/launcher.cpp:316 gui/options.cpp:1126
msgctxt "lowres"
msgid "Paths"
msgstr "Camiños"
-#: gui/launcher.cpp:317
+#: gui/launcher.cpp:323
msgid "Game Path:"
msgstr "Camiño do xogo:"
-#: gui/launcher.cpp:319
+#: gui/launcher.cpp:325
msgctxt "lowres"
msgid "Game Path:"
msgstr "Camiño do xogo:"
-#: gui/launcher.cpp:324 gui/options.cpp:1149
+#: gui/launcher.cpp:330 gui/options.cpp:1150
msgid "Extra Path:"
msgstr "Camiño adicional:"
-#: gui/launcher.cpp:324 gui/launcher.cpp:326 gui/launcher.cpp:327
+#: gui/launcher.cpp:330 gui/launcher.cpp:332 gui/launcher.cpp:333
msgid "Specifies path to additional data used the game"
msgstr "Especifica o camiño dos datos adicionais usados no xogo"
-#: gui/launcher.cpp:326 gui/options.cpp:1151
+#: gui/launcher.cpp:332 gui/options.cpp:1152
msgctxt "lowres"
msgid "Extra Path:"
msgstr "Camiño adicional:"
-#: gui/launcher.cpp:333 gui/options.cpp:1133
+#: gui/launcher.cpp:339 gui/options.cpp:1134
msgid "Save Path:"
msgstr "Camiño de gardado:"
-#: gui/launcher.cpp:333 gui/launcher.cpp:335 gui/launcher.cpp:336
-#: gui/options.cpp:1133 gui/options.cpp:1135 gui/options.cpp:1136
+#: gui/launcher.cpp:339 gui/launcher.cpp:341 gui/launcher.cpp:342
+#: gui/options.cpp:1134 gui/options.cpp:1136 gui/options.cpp:1137
msgid "Specifies where your savegames are put"
msgstr "Especifica o lugar dos ficheiros de gardado"
-#: gui/launcher.cpp:335 gui/options.cpp:1135
+#: gui/launcher.cpp:341 gui/options.cpp:1136
msgctxt "lowres"
msgid "Save Path:"
msgstr "Camiño de gardado:"
-#: gui/launcher.cpp:354 gui/launcher.cpp:453 gui/launcher.cpp:511
-#: gui/launcher.cpp:565 gui/options.cpp:1144 gui/options.cpp:1152
-#: gui/options.cpp:1161 gui/options.cpp:1276 gui/options.cpp:1282
-#: gui/options.cpp:1290 gui/options.cpp:1320 gui/options.cpp:1326
-#: gui/options.cpp:1333 gui/options.cpp:1426 gui/options.cpp:1429
-#: gui/options.cpp:1441
+#: gui/launcher.cpp:360 gui/launcher.cpp:459 gui/launcher.cpp:517
+#: gui/launcher.cpp:571 gui/options.cpp:1145 gui/options.cpp:1153
+#: gui/options.cpp:1162 gui/options.cpp:1277 gui/options.cpp:1283
+#: gui/options.cpp:1291 gui/options.cpp:1321 gui/options.cpp:1327
+#: gui/options.cpp:1334 gui/options.cpp:1427 gui/options.cpp:1430
+#: gui/options.cpp:1442
msgctxt "path"
msgid "None"
msgstr "Ningún"
-#: gui/launcher.cpp:359 gui/launcher.cpp:459 gui/launcher.cpp:569
-#: gui/options.cpp:1270 gui/options.cpp:1314 gui/options.cpp:1432
+#: gui/launcher.cpp:365 gui/launcher.cpp:465 gui/launcher.cpp:575
+#: gui/options.cpp:1271 gui/options.cpp:1315 gui/options.cpp:1433
#: backends/platform/wii/options.cpp:56
msgid "Default"
msgstr "Predefinido"
-#: gui/launcher.cpp:504 gui/options.cpp:1435
+#: gui/launcher.cpp:510 gui/options.cpp:1436
msgid "Select SoundFont"
msgstr "Seleccionar SoundFont"
-#: gui/launcher.cpp:523 gui/launcher.cpp:677
+#: gui/launcher.cpp:529 gui/launcher.cpp:682
msgid "Select directory with game data"
msgstr "Selecciona un directorio con datos de xogo"
-#: gui/launcher.cpp:541
+#: gui/launcher.cpp:547
msgid "Select additional game directory"
msgstr "Selecciona un directorio con datos adicionais"
-#: gui/launcher.cpp:553
+#: gui/launcher.cpp:559
msgid "Select directory for saved games"
msgstr "Selecciona un directorio para ficheiros de gardado"
-#: gui/launcher.cpp:580
+#: gui/launcher.cpp:586
msgid "This game ID is already taken. Please choose another one."
msgstr "Este ID de xogo xa está en uso. Selecciona outro."
-#: gui/launcher.cpp:621 engines/dialogs.cpp:110
+#: gui/launcher.cpp:626 engines/dialogs.cpp:111
msgid "~Q~uit"
msgstr "~S~aír"
-#: gui/launcher.cpp:621 backends/platform/sdl/macosx/appmenu_osx.mm:95
+#: gui/launcher.cpp:626 backends/platform/sdl/macosx/appmenu_osx.mm:95
msgid "Quit ScummVM"
msgstr "Saír de ScummVM"
-#: gui/launcher.cpp:622
+#: gui/launcher.cpp:627
msgid "A~b~out..."
msgstr "Ace~r~ca de..."
-#: gui/launcher.cpp:622 backends/platform/sdl/macosx/appmenu_osx.mm:69
+#: gui/launcher.cpp:627 backends/platform/sdl/macosx/appmenu_osx.mm:69
msgid "About ScummVM"
msgstr "Acerca de ScummVM"
-#: gui/launcher.cpp:623
+#: gui/launcher.cpp:628
msgid "~O~ptions..."
msgstr "~O~pcións..."
-#: gui/launcher.cpp:623
+#: gui/launcher.cpp:628
msgid "Change global ScummVM options"
msgstr "Cambiar as opcións de ScummVM"
-#: gui/launcher.cpp:625
+#: gui/launcher.cpp:630
msgid "~S~tart"
msgstr "~I~niciar"
-#: gui/launcher.cpp:625
+#: gui/launcher.cpp:630
msgid "Start selected game"
msgstr "Iniciar o xogo seleccionado"
-#: gui/launcher.cpp:628
+#: gui/launcher.cpp:633
msgid "~L~oad..."
msgstr "~C~argar..."
-#: gui/launcher.cpp:628
+#: gui/launcher.cpp:633
msgid "Load savegame for selected game"
msgstr "Cargar partida do xogo seleccionado"
-#: gui/launcher.cpp:633 gui/launcher.cpp:1120
+#: gui/launcher.cpp:638
msgid "~A~dd Game..."
msgstr "Eng~a~dir xogo..."
-#: gui/launcher.cpp:633 gui/launcher.cpp:640
+#: gui/launcher.cpp:638 gui/launcher.cpp:645
msgid "Hold Shift for Mass Add"
msgstr "Manter premido MAIÚS para engadir en masa"
-#: gui/launcher.cpp:635
+#: gui/launcher.cpp:640
msgid "~E~dit Game..."
msgstr "~E~ditar xogo..."
-#: gui/launcher.cpp:635 gui/launcher.cpp:642
+#: gui/launcher.cpp:640 gui/launcher.cpp:647
msgid "Change game options"
msgstr "Cambiar as opcións do xogo"
-#: gui/launcher.cpp:637
+#: gui/launcher.cpp:642
msgid "~R~emove Game"
msgstr "Elimina~r~ xogo"
-#: gui/launcher.cpp:637 gui/launcher.cpp:644
+#: gui/launcher.cpp:642 gui/launcher.cpp:649
msgid "Remove game from the list. The game data files stay intact"
msgstr "Eliminar o xogo da lista. Os ficheiros de datos non se modifican"
-#: gui/launcher.cpp:640 gui/launcher.cpp:1120
+#: gui/launcher.cpp:645
msgctxt "lowres"
msgid "~A~dd Game..."
msgstr "Eng~a~dir xogo..."
-#: gui/launcher.cpp:642
+#: gui/launcher.cpp:647
msgctxt "lowres"
msgid "~E~dit Game..."
msgstr "~E~ditar xogo..."
-#: gui/launcher.cpp:644
+#: gui/launcher.cpp:649
msgctxt "lowres"
msgid "~R~emove Game"
msgstr "Elimina~r~ xogo"
-#: gui/launcher.cpp:652
+#: gui/launcher.cpp:657
msgid "Search in game list"
msgstr "Buscar na lista de xogos"
-#: gui/launcher.cpp:656 gui/launcher.cpp:1167
+#: gui/launcher.cpp:661 gui/launcher.cpp:1222
msgid "Search:"
msgstr "Buscar:"
-#: gui/launcher.cpp:680 engines/dialogs.cpp:114 engines/mohawk/myst.cpp:245
-#: engines/mohawk/riven.cpp:716 engines/cruise/menu.cpp:214
-#: engines/pegasus/pegasus.cpp:349
+#: gui/launcher.cpp:685 engines/dialogs.cpp:115 engines/cruise/menu.cpp:214
+#: engines/mohawk/myst.cpp:245 engines/mohawk/riven.cpp:718
+#: engines/pegasus/pegasus.cpp:353
msgid "Load game:"
msgstr "Cargar partida:"
-#: gui/launcher.cpp:680 engines/dialogs.cpp:114 engines/scumm/dialogs.cpp:188
-#: engines/mohawk/myst.cpp:245 engines/mohawk/riven.cpp:716
-#: engines/cruise/menu.cpp:214 engines/pegasus/pegasus.cpp:349
+#: gui/launcher.cpp:685 engines/dialogs.cpp:115
#: backends/platform/wince/CEActionsPocket.cpp:267
#: backends/platform/wince/CEActionsSmartphone.cpp:231
+#: engines/cruise/menu.cpp:214 engines/mohawk/myst.cpp:245
+#: engines/mohawk/riven.cpp:718 engines/pegasus/pegasus.cpp:353
+#: engines/scumm/dialogs.cpp:189
msgid "Load"
msgstr "Cargar"
-#: gui/launcher.cpp:788
+#: gui/launcher.cpp:792
msgid ""
"Do you really want to run the mass game detector? This could potentially add "
"a huge number of games."
@@ -469,7 +470,8 @@ msgstr ""
"Queres executar o detector de xogos en masa? É posible que se engada un gran "
"número de xogos."
-#: gui/launcher.cpp:789 gui/launcher.cpp:937 gui/fluidsynth-dialog.cpp:216
+#: gui/launcher.cpp:793 gui/launcher.cpp:941 gui/launcher.cpp:1000
+#: gui/fluidsynth-dialog.cpp:217
#: backends/events/symbiansdl/symbiansdl-events.cpp:184
#: backends/platform/wince/CEActionsPocket.cpp:326
#: backends/platform/wince/CEActionsSmartphone.cpp:287
@@ -477,7 +479,8 @@ msgstr ""
msgid "Yes"
msgstr "Si"
-#: gui/launcher.cpp:789 gui/launcher.cpp:937 gui/fluidsynth-dialog.cpp:216
+#: gui/launcher.cpp:793 gui/launcher.cpp:941 gui/launcher.cpp:1000
+#: gui/fluidsynth-dialog.cpp:217
#: backends/events/symbiansdl/symbiansdl-events.cpp:184
#: backends/platform/wince/CEActionsPocket.cpp:326
#: backends/platform/wince/CEActionsSmartphone.cpp:287
@@ -485,189 +488,184 @@ msgstr "Si"
msgid "No"
msgstr "Non"
-#: gui/launcher.cpp:837
+#: gui/launcher.cpp:841
msgid "ScummVM couldn't open the specified directory!"
msgstr "ScummVM non foi quen de abrir o directorio!"
-#: gui/launcher.cpp:849
+#: gui/launcher.cpp:853
msgid "ScummVM could not find any game in the specified directory!"
msgstr "ScummVM non foi quen de atopar xogos no directorio!"
-#: gui/launcher.cpp:863
+#: gui/launcher.cpp:867
msgid "Pick the game:"
msgstr "Elixe o xogo:"
-#: gui/launcher.cpp:937
+#: gui/launcher.cpp:941
msgid "Do you really want to remove this game configuration?"
msgstr "Seguro que queres eliminar esta configuración de xogo?"
-#: gui/launcher.cpp:1001
+#: gui/launcher.cpp:999
+#, fuzzy
+msgid "Do you want to load savegame?"
+msgstr "Queres cargar ou gardar a partida?"
+
+#: gui/launcher.cpp:1048
msgid "This game does not support loading games from the launcher."
msgstr "O xogo non permite cargar partidas dende o iniciador."
-#: gui/launcher.cpp:1005
+#: gui/launcher.cpp:1052
msgid "ScummVM could not find any engine capable of running the selected game!"
msgstr "ScummVM non foi quen de atopar un motor para executar o xogo!"
-#: gui/launcher.cpp:1119
-msgctxt "lowres"
-msgid "Mass Add..."
-msgstr "Engadir en masa..."
-
-#: gui/launcher.cpp:1119
-msgid "Mass Add..."
-msgstr "Engadir en masa..."
-
-#: gui/massadd.cpp:78 gui/massadd.cpp:81
+#: gui/massadd.cpp:79 gui/massadd.cpp:82
msgid "... progress ..."
msgstr "...progreso..."
-#: gui/massadd.cpp:258
+#: gui/massadd.cpp:259
msgid "Scan complete!"
msgstr "Análise finalizada!"
-#: gui/massadd.cpp:261
+#: gui/massadd.cpp:262
#, c-format
msgid "Discovered %d new games, ignored %d previously added games."
msgstr "%d xogos novos atopados; %d xogos xa engadidos ignorados."
-#: gui/massadd.cpp:265
+#: gui/massadd.cpp:266
#, c-format
msgid "Scanned %d directories ..."
msgstr "%d directorios analizados..."
-#: gui/massadd.cpp:268
+#: gui/massadd.cpp:269
#, c-format
msgid "Discovered %d new games, ignored %d previously added games ..."
msgstr "%d xogos novos atopados; %d xogos xa engadidos ignorados..."
-#: gui/options.cpp:84
+#: gui/options.cpp:85
msgid "Never"
msgstr "Nunca"
-#: gui/options.cpp:84
+#: gui/options.cpp:85
msgid "every 5 mins"
msgstr "cada 5 min"
-#: gui/options.cpp:84
+#: gui/options.cpp:85
msgid "every 10 mins"
msgstr "cada 10 min"
-#: gui/options.cpp:84
+#: gui/options.cpp:85
msgid "every 15 mins"
msgstr "cada 15 min"
-#: gui/options.cpp:84
+#: gui/options.cpp:85
msgid "every 30 mins"
msgstr "cada 30 min"
-#: gui/options.cpp:86
+#: gui/options.cpp:87
msgid "8 kHz"
msgstr "8 kHz"
-#: gui/options.cpp:86
+#: gui/options.cpp:87
msgid "11kHz"
msgstr "11 kHz"
-#: gui/options.cpp:86
+#: gui/options.cpp:87
msgid "22 kHz"
msgstr "22 kHz"
-#: gui/options.cpp:86
+#: gui/options.cpp:87
msgid "44 kHz"
msgstr "44 kHz"
-#: gui/options.cpp:86
+#: gui/options.cpp:87
msgid "48 kHz"
msgstr "48 kHz"
-#: gui/options.cpp:254 gui/options.cpp:480 gui/options.cpp:581
-#: gui/options.cpp:650 gui/options.cpp:858
+#: gui/options.cpp:255 gui/options.cpp:481 gui/options.cpp:582
+#: gui/options.cpp:651 gui/options.cpp:859
msgctxt "soundfont"
msgid "None"
msgstr "Ningunha"
-#: gui/options.cpp:388
+#: gui/options.cpp:389
msgid "Failed to apply some of the graphic options changes:"
msgstr "Erro ao aplicar os cambios na configuración dos gráficos:"
-#: gui/options.cpp:400
+#: gui/options.cpp:401
msgid "the video mode could not be changed."
msgstr "non se puido cambiar o modo de vídeo."
-#: gui/options.cpp:406
+#: gui/options.cpp:407
msgid "the fullscreen setting could not be changed"
msgstr "non se puido cambiar a configuración de pantalla completa."
-#: gui/options.cpp:412
+#: gui/options.cpp:413
msgid "the aspect ratio setting could not be changed"
msgstr "non se puido cambiar a proporción."
-#: gui/options.cpp:733
+#: gui/options.cpp:734
msgid "Graphics mode:"
msgstr "Modo de gráficos:"
-#: gui/options.cpp:747
+#: gui/options.cpp:748
msgid "Render mode:"
msgstr "Modo de procesamento:"
-#: gui/options.cpp:747 gui/options.cpp:748
+#: gui/options.cpp:748 gui/options.cpp:749
msgid "Special dithering modes supported by some games"
msgstr "Modos de interpolación de cores compatibles con algúns xogos"
-#: gui/options.cpp:759
-#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2236
-#: backends/graphics/openglsdl/openglsdl-graphics.cpp:476
+#: gui/options.cpp:760
+#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2249
msgid "Fullscreen mode"
msgstr "Pantalla completa"
-#: gui/options.cpp:762
+#: gui/options.cpp:763
msgid "Aspect ratio correction"
msgstr "Corrección de proporción"
-#: gui/options.cpp:762
+#: gui/options.cpp:763
msgid "Correct aspect ratio for 320x200 games"
msgstr "Corrixir a proporción para os xogos en 320x200"
-#: gui/options.cpp:770
+#: gui/options.cpp:771
msgid "Preferred Device:"
msgstr "Dispositivo preferido:"
-#: gui/options.cpp:770
+#: gui/options.cpp:771
msgid "Music Device:"
msgstr "Dispositivo de música:"
-#: gui/options.cpp:770 gui/options.cpp:772
+#: gui/options.cpp:771 gui/options.cpp:773
msgid "Specifies preferred sound device or sound card emulator"
msgstr "Especifica o dispositivo ou emulador de tarxeta de son preferido"
-#: gui/options.cpp:770 gui/options.cpp:772 gui/options.cpp:773
+#: gui/options.cpp:771 gui/options.cpp:773 gui/options.cpp:774
msgid "Specifies output sound device or sound card emulator"
msgstr "Especifica o dispositivo ou emulador de tarxeta de son de saída"
-#: gui/options.cpp:772
+#: gui/options.cpp:773
msgctxt "lowres"
msgid "Preferred Dev.:"
msgstr "Disp. preferido:"
-#: gui/options.cpp:772
+#: gui/options.cpp:773
msgctxt "lowres"
msgid "Music Device:"
msgstr "Disp. música:"
-#: gui/options.cpp:799
+#: gui/options.cpp:800
msgid "AdLib emulator:"
msgstr "Emulador de AdLib:"
-#: gui/options.cpp:799 gui/options.cpp:800
+#: gui/options.cpp:800 gui/options.cpp:801
msgid "AdLib is used for music in many games"
msgstr "Moitos xogos empregan AdLib para a música"
-#: gui/options.cpp:810
+#: gui/options.cpp:811
msgid "Output rate:"
msgstr "Taxa de saída:"
-#: gui/options.cpp:810 gui/options.cpp:811
+#: gui/options.cpp:811 gui/options.cpp:812
msgid ""
"Higher value specifies better sound quality but may be not supported by your "
"soundcard"
@@ -675,259 +673,262 @@ msgstr ""
"A maior valor, maior calidade do son, mais talvez non sexa compatible coa "
"tarxeta"
-#: gui/options.cpp:821
+#: gui/options.cpp:822
msgid "GM Device:"
msgstr "Dispositivo de GM:"
-#: gui/options.cpp:821
+#: gui/options.cpp:822
msgid "Specifies default sound device for General MIDI output"
msgstr ""
"Especifica o dispositivo de son por defecto para a saída de General MIDI"
-#: gui/options.cpp:832
+#: gui/options.cpp:833
msgid "Don't use General MIDI music"
msgstr "Non empregar música en General MIDI"
-#: gui/options.cpp:843 gui/options.cpp:909
+#: gui/options.cpp:844 gui/options.cpp:910
msgid "Use first available device"
msgstr "Empregar o primeiro dispositivo dispoñible"
-#: gui/options.cpp:855
+#: gui/options.cpp:856
msgid "SoundFont:"
msgstr "SoundFont:"
-#: gui/options.cpp:855 gui/options.cpp:857 gui/options.cpp:858
+#: gui/options.cpp:856 gui/options.cpp:858 gui/options.cpp:859
msgid "SoundFont is supported by some audio cards, Fluidsynth and Timidity"
msgstr ""
"SoundFont é compatible con algunhas tarxetas de son, Fluidsynth e Timidity"
-#: gui/options.cpp:857
+#: gui/options.cpp:858
msgctxt "lowres"
msgid "SoundFont:"
msgstr "SoundFont:"
-#: gui/options.cpp:863
+#: gui/options.cpp:864
msgid "Mixed AdLib/MIDI mode"
msgstr "Modo AdLib/MIDI mixto"
-#: gui/options.cpp:863
+#: gui/options.cpp:864
msgid "Use both MIDI and AdLib sound generation"
msgstr "Empregar xeración de son MIDI e máis AdLib"
-#: gui/options.cpp:866
+#: gui/options.cpp:867
msgid "MIDI gain:"
msgstr "Ganancia de MIDI:"
-#: gui/options.cpp:873
+#: gui/options.cpp:874
msgid "FluidSynth Settings"
msgstr "Configuración de FluidSynth"
-#: gui/options.cpp:880
+#: gui/options.cpp:881
msgid "MT-32 Device:"
msgstr "Dispositivo de MT-32:"
-#: gui/options.cpp:880
+#: gui/options.cpp:881
msgid "Specifies default sound device for Roland MT-32/LAPC1/CM32l/CM64 output"
msgstr ""
"Especifica o dispositivo por defecto para a saída de Roland MT-32/LAPC1/"
"CM32l/CM64"
-#: gui/options.cpp:885
+#: gui/options.cpp:886
msgid "True Roland MT-32 (disable GM emulation)"
msgstr "Roland MT-32 verdadeiro (sen emulación de GM)"
-#: gui/options.cpp:885 gui/options.cpp:887
+#: gui/options.cpp:886 gui/options.cpp:888
msgid ""
"Check if you want to use your real hardware Roland-compatible sound device "
"connected to your computer"
msgstr ""
"Marcar para empregar o hardware compatible con Roland conectado ao sistema"
-#: gui/options.cpp:887
+#: gui/options.cpp:888
msgctxt "lowres"
msgid "True Roland MT-32 (no GM emulation)"
msgstr "Roland MT-32 (sen emulación de GM)"
-#: gui/options.cpp:890
-msgid "Roland GS Mode (disable GM mapping)"
+#: gui/options.cpp:891
+#, fuzzy
+msgid "Roland GS Device (enable MT-32 mappings)"
msgstr "Modo Roland GS (desactivar mapeamento GM)"
-#: gui/options.cpp:890
-msgid "Turns off General MIDI mapping for games with Roland MT-32 soundtrack"
-msgstr "Desactiva o General MIDI para os xogos con música en Roland MT-32"
+#: gui/options.cpp:891
+msgid ""
+"Check if you want to enable patch mappings to emulate an MT-32 on a Roland "
+"GS device"
+msgstr ""
-#: gui/options.cpp:899
+#: gui/options.cpp:900
msgid "Don't use Roland MT-32 music"
msgstr "Non empregar música en Roland MT-32"
-#: gui/options.cpp:926
+#: gui/options.cpp:927
msgid "Text and Speech:"
msgstr "Texto e voz:"
-#: gui/options.cpp:930 gui/options.cpp:940
+#: gui/options.cpp:931 gui/options.cpp:941
msgid "Speech"
msgstr "Voz"
-#: gui/options.cpp:931 gui/options.cpp:941
+#: gui/options.cpp:932 gui/options.cpp:942
msgid "Subtitles"
msgstr "Subtítulos"
-#: gui/options.cpp:932
+#: gui/options.cpp:933
msgid "Both"
msgstr "Ambos"
-#: gui/options.cpp:934
+#: gui/options.cpp:935
msgid "Subtitle speed:"
msgstr "Velocidade dos subtítulos:"
-#: gui/options.cpp:936
+#: gui/options.cpp:937
msgctxt "lowres"
msgid "Text and Speech:"
msgstr "Texto e voz:"
-#: gui/options.cpp:940
+#: gui/options.cpp:941
msgid "Spch"
msgstr "Voz"
-#: gui/options.cpp:941
+#: gui/options.cpp:942
msgid "Subs"
msgstr "Subs"
-#: gui/options.cpp:942
+#: gui/options.cpp:943
msgctxt "lowres"
msgid "Both"
msgstr "Ambos"
-#: gui/options.cpp:942
+#: gui/options.cpp:943
msgid "Show subtitles and play speech"
msgstr "Mostrar os subtítulos e reproducir as voces"
-#: gui/options.cpp:944
+#: gui/options.cpp:945
msgctxt "lowres"
msgid "Subtitle speed:"
msgstr "Velocidade subs:"
-#: gui/options.cpp:960
+#: gui/options.cpp:961
msgid "Music volume:"
msgstr "Volume de música:"
-#: gui/options.cpp:962
+#: gui/options.cpp:963
msgctxt "lowres"
msgid "Music volume:"
msgstr "Volume música:"
-#: gui/options.cpp:969
+#: gui/options.cpp:970
msgid "Mute All"
msgstr "Silenciar todo"
-#: gui/options.cpp:972
+#: gui/options.cpp:973
msgid "SFX volume:"
msgstr "Volume de efectos:"
-#: gui/options.cpp:972 gui/options.cpp:974 gui/options.cpp:975
+#: gui/options.cpp:973 gui/options.cpp:975 gui/options.cpp:976
msgid "Special sound effects volume"
msgstr "Volume dos efectos de son"
-#: gui/options.cpp:974
+#: gui/options.cpp:975
msgctxt "lowres"
msgid "SFX volume:"
msgstr "Volume efectos:"
-#: gui/options.cpp:982
+#: gui/options.cpp:983
msgid "Speech volume:"
msgstr "Volume de voz:"
-#: gui/options.cpp:984
+#: gui/options.cpp:985
msgctxt "lowres"
msgid "Speech volume:"
msgstr "Volume voz:"
-#: gui/options.cpp:1141
+#: gui/options.cpp:1142
msgid "Theme Path:"
msgstr "Camiño do tema:"
-#: gui/options.cpp:1143
+#: gui/options.cpp:1144
msgctxt "lowres"
msgid "Theme Path:"
msgstr "Camiño tema:"
-#: gui/options.cpp:1149 gui/options.cpp:1151 gui/options.cpp:1152
+#: gui/options.cpp:1150 gui/options.cpp:1152 gui/options.cpp:1153
msgid "Specifies path to additional data used by all games or ScummVM"
msgstr ""
"Especificar o camiño dos datos adicionais de todos os xogos ou de ScummVM"
-#: gui/options.cpp:1158
+#: gui/options.cpp:1159
msgid "Plugins Path:"
msgstr "Camiño dos complementos:"
-#: gui/options.cpp:1160
+#: gui/options.cpp:1161
msgctxt "lowres"
msgid "Plugins Path:"
msgstr "Camiño complementos:"
-#: gui/options.cpp:1169 gui/fluidsynth-dialog.cpp:137
+#: gui/options.cpp:1170 gui/fluidsynth-dialog.cpp:138
msgid "Misc"
msgstr "Misc."
-#: gui/options.cpp:1171
+#: gui/options.cpp:1172
msgctxt "lowres"
msgid "Misc"
msgstr "Misc."
-#: gui/options.cpp:1173
+#: gui/options.cpp:1174
msgid "Theme:"
msgstr "Tema:"
-#: gui/options.cpp:1177
+#: gui/options.cpp:1178
msgid "GUI Renderer:"
msgstr "Procesamento da interfaz:"
-#: gui/options.cpp:1189
+#: gui/options.cpp:1190
msgid "Autosave:"
msgstr "Autogardado:"
-#: gui/options.cpp:1191
+#: gui/options.cpp:1192
msgctxt "lowres"
msgid "Autosave:"
msgstr "Autogardado:"
-#: gui/options.cpp:1199
+#: gui/options.cpp:1200
msgid "Keys"
msgstr "Teclas"
-#: gui/options.cpp:1206
+#: gui/options.cpp:1207
msgid "GUI Language:"
msgstr "Idioma de interfaz:"
-#: gui/options.cpp:1206
+#: gui/options.cpp:1207
msgid "Language of ScummVM GUI"
msgstr "Idioma da interfaz de ScummVM"
-#: gui/options.cpp:1365
+#: gui/options.cpp:1366
msgid "You have to restart ScummVM before your changes will take effect."
msgstr "Debes reiniciar ScummVM para que os cambios teñan efecto."
-#: gui/options.cpp:1378
+#: gui/options.cpp:1379
msgid "Select directory for savegames"
msgstr "Seleccionar directorio para ficheiros de gardado"
-#: gui/options.cpp:1385
+#: gui/options.cpp:1386
msgid "The chosen directory cannot be written to. Please select another one."
msgstr "Non é posible escribir no directorio elixido. Selecciona outro."
-#: gui/options.cpp:1394
+#: gui/options.cpp:1395
msgid "Select directory for GUI themes"
msgstr "Seleccionar directorio para temas de interfaz"
-#: gui/options.cpp:1404
+#: gui/options.cpp:1405
msgid "Select directory for extra files"
msgstr "Seleccionar directorio para ficheiros adicionais"
-#: gui/options.cpp:1415
+#: gui/options.cpp:1416
msgid "Select directory for plugins"
msgstr "Seleccionar directorio para complementos"
-#: gui/options.cpp:1468
+#: gui/options.cpp:1469
msgid ""
"The theme you selected does not support your current language. If you want "
"to use this theme you need to switch to another language first."
@@ -935,225 +936,228 @@ msgstr ""
"O tema seleccionado non é compatible co idioma actual. Para empregar o tema, "
"deberás cambiar antes o idioma da interfaz."
-#: gui/saveload-dialog.cpp:166
+#: gui/saveload-dialog.cpp:167
msgid "List view"
msgstr "Lista"
-#: gui/saveload-dialog.cpp:167
+#: gui/saveload-dialog.cpp:168
msgid "Grid view"
msgstr "Grade"
-#: gui/saveload-dialog.cpp:210 gui/saveload-dialog.cpp:358
+#: gui/saveload-dialog.cpp:211 gui/saveload-dialog.cpp:360
msgid "No date saved"
msgstr "Non hai data gardada"
-#: gui/saveload-dialog.cpp:211 gui/saveload-dialog.cpp:359
+#: gui/saveload-dialog.cpp:212 gui/saveload-dialog.cpp:361
msgid "No time saved"
msgstr "Non hai hora gardada"
-#: gui/saveload-dialog.cpp:212 gui/saveload-dialog.cpp:360
+#: gui/saveload-dialog.cpp:213 gui/saveload-dialog.cpp:362
msgid "No playtime saved"
msgstr "Non hai tempo de xogo gardado"
-#: gui/saveload-dialog.cpp:219 gui/saveload-dialog.cpp:275
+#: gui/saveload-dialog.cpp:220 gui/saveload-dialog.cpp:276
msgid "Delete"
msgstr "Eliminar"
-#: gui/saveload-dialog.cpp:274
+#: gui/saveload-dialog.cpp:275
msgid "Do you really want to delete this savegame?"
msgstr "Seguro que queres eliminar esta partida?"
-#: gui/saveload-dialog.cpp:383 gui/saveload-dialog.cpp:872
+#: gui/saveload-dialog.cpp:385 gui/saveload-dialog.cpp:875
msgid "Date: "
msgstr "Data:"
-#: gui/saveload-dialog.cpp:387 gui/saveload-dialog.cpp:878
+#: gui/saveload-dialog.cpp:389 gui/saveload-dialog.cpp:881
msgid "Time: "
msgstr "Hora:"
-#: gui/saveload-dialog.cpp:393 gui/saveload-dialog.cpp:886
+#: gui/saveload-dialog.cpp:395 gui/saveload-dialog.cpp:889
msgid "Playtime: "
msgstr "Tempo de xogo:"
-#: gui/saveload-dialog.cpp:406 gui/saveload-dialog.cpp:494
+#: gui/saveload-dialog.cpp:408 gui/saveload-dialog.cpp:496
msgid "Untitled savestate"
msgstr "Partida sen título"
-#: gui/saveload-dialog.cpp:546
+#: gui/saveload-dialog.cpp:548
msgid "Next"
msgstr "Seg."
-#: gui/saveload-dialog.cpp:549
+#: gui/saveload-dialog.cpp:551
msgid "Prev"
msgstr "Ant."
-#: gui/saveload-dialog.cpp:736
+#: gui/saveload-dialog.cpp:739
msgid "New Save"
msgstr "Novo ficheiro"
-#: gui/saveload-dialog.cpp:736
+#: gui/saveload-dialog.cpp:739
msgid "Create a new save game"
msgstr "Crea un novo ficheiro de gardado"
-#: gui/saveload-dialog.cpp:865
+#: gui/saveload-dialog.cpp:868
msgid "Name: "
msgstr "Nome:"
-#: gui/saveload-dialog.cpp:937
+#: gui/saveload-dialog.cpp:940
#, c-format
msgid "Enter a description for slot %d:"
msgstr "Introduce unha descrición para o espazo %d:"
-#: gui/themebrowser.cpp:44
+#: gui/themebrowser.cpp:45
msgid "Select a Theme"
msgstr "Seleccionar tema"
-#: gui/ThemeEngine.cpp:337
+#: gui/ThemeEngine.cpp:347
msgid "Disabled GFX"
msgstr "Efectos gráficos desactivados"
-#: gui/ThemeEngine.cpp:337
+#: gui/ThemeEngine.cpp:347
msgctxt "lowres"
msgid "Disabled GFX"
msgstr "Efectos desactivados"
-#: gui/ThemeEngine.cpp:338
-msgid "Standard Renderer (16bpp)"
+#: gui/ThemeEngine.cpp:348
+#, fuzzy
+msgid "Standard Renderer"
msgstr "Procesamento estándar (16 bpp)"
-#: gui/ThemeEngine.cpp:338
-msgid "Standard (16bpp)"
-msgstr "Estándar (16 bpp)"
+#: gui/ThemeEngine.cpp:348 engines/scumm/dialogs.cpp:659
+msgid "Standard"
+msgstr "Estándar"
-#: gui/ThemeEngine.cpp:340
-msgid "Antialiased Renderer (16bpp)"
+#: gui/ThemeEngine.cpp:350
+#, fuzzy
+msgid "Antialiased Renderer"
msgstr "Procesamento antidistorsión (16 bpp)"
-#: gui/ThemeEngine.cpp:340
-msgid "Antialiased (16bpp)"
+#: gui/ThemeEngine.cpp:350
+#, fuzzy
+msgid "Antialiased"
msgstr "Antidistorsión (16 bpp)"
-#: gui/widget.cpp:322 gui/widget.cpp:324 gui/widget.cpp:330 gui/widget.cpp:332
+#: gui/widget.cpp:323 gui/widget.cpp:325 gui/widget.cpp:331 gui/widget.cpp:333
msgid "Clear value"
msgstr "Limpar valor"
-#: gui/fluidsynth-dialog.cpp:67
+#: gui/fluidsynth-dialog.cpp:68
msgid "Reverb"
msgstr "Reverberación"
-#: gui/fluidsynth-dialog.cpp:69 gui/fluidsynth-dialog.cpp:101
+#: gui/fluidsynth-dialog.cpp:70 gui/fluidsynth-dialog.cpp:102
msgid "Active"
msgstr "Activa"
-#: gui/fluidsynth-dialog.cpp:71
+#: gui/fluidsynth-dialog.cpp:72
msgid "Room:"
msgstr "Sala:"
-#: gui/fluidsynth-dialog.cpp:78
+#: gui/fluidsynth-dialog.cpp:79
msgid "Damp:"
msgstr "Humidade:"
-#: gui/fluidsynth-dialog.cpp:85
+#: gui/fluidsynth-dialog.cpp:86
msgid "Width:"
msgstr "Largo:"
-#: gui/fluidsynth-dialog.cpp:92 gui/fluidsynth-dialog.cpp:110
+#: gui/fluidsynth-dialog.cpp:93 gui/fluidsynth-dialog.cpp:111
msgid "Level:"
msgstr "Nivel:"
-#: gui/fluidsynth-dialog.cpp:99
+#: gui/fluidsynth-dialog.cpp:100
msgid "Chorus"
msgstr "Refrán"
-#: gui/fluidsynth-dialog.cpp:103
+#: gui/fluidsynth-dialog.cpp:104
msgid "N:"
msgstr "N:"
-#: gui/fluidsynth-dialog.cpp:117
+#: gui/fluidsynth-dialog.cpp:118
msgid "Speed:"
msgstr "Velocidade:"
-#: gui/fluidsynth-dialog.cpp:124
+#: gui/fluidsynth-dialog.cpp:125
msgid "Depth:"
msgstr "Profundidade:"
-#: gui/fluidsynth-dialog.cpp:131
+#: gui/fluidsynth-dialog.cpp:132
msgid "Type:"
msgstr "Tipo:"
-#: gui/fluidsynth-dialog.cpp:134
+#: gui/fluidsynth-dialog.cpp:135
msgid "Sine"
msgstr "Seno"
-#: gui/fluidsynth-dialog.cpp:135
+#: gui/fluidsynth-dialog.cpp:136
msgid "Triangle"
msgstr "Triángulo"
-#: gui/fluidsynth-dialog.cpp:139
+#: gui/fluidsynth-dialog.cpp:140
msgid "Interpolation:"
msgstr "Interpolación:"
-#: gui/fluidsynth-dialog.cpp:142
+#: gui/fluidsynth-dialog.cpp:143
msgid "None (fastest)"
msgstr "Ningunha (máis rápido)"
-#: gui/fluidsynth-dialog.cpp:143
+#: gui/fluidsynth-dialog.cpp:144
msgid "Linear"
msgstr "Lineal"
-#: gui/fluidsynth-dialog.cpp:144
+#: gui/fluidsynth-dialog.cpp:145
msgid "Fourth-order"
msgstr "Cuarta orde"
-#: gui/fluidsynth-dialog.cpp:145
+#: gui/fluidsynth-dialog.cpp:146
msgid "Seventh-order"
msgstr "Séptima orde"
-#: gui/fluidsynth-dialog.cpp:149
+#: gui/fluidsynth-dialog.cpp:150
msgid "Reset"
msgstr "Restablecer"
-#: gui/fluidsynth-dialog.cpp:149
+#: gui/fluidsynth-dialog.cpp:150
msgid "Reset all FluidSynth settings to their default values."
msgstr ""
"Restablece a configuración de FluidSynth aos seus valores predefinidos."
-#: gui/fluidsynth-dialog.cpp:216
+#: gui/fluidsynth-dialog.cpp:217
msgid ""
"Do you really want to reset all FluidSynth settings to their default values?"
msgstr ""
"Seguro que queres restablecer a configuración de FluidSynth aos seus valores "
"predefinidos?"
-#: base/main.cpp:210
+#: base/main.cpp:228
#, c-format
msgid "Engine does not support debug level '%s'"
msgstr "O motor non é compatible co nivel de depuración %s"
-#: base/main.cpp:288
+#: base/main.cpp:306
msgid "Menu"
msgstr "Menú"
-#: base/main.cpp:291 backends/platform/symbian/src/SymbianActions.cpp:45
+#: base/main.cpp:309 backends/platform/symbian/src/SymbianActions.cpp:45
#: backends/platform/wince/CEActionsPocket.cpp:45
#: backends/platform/wince/CEActionsSmartphone.cpp:46
msgid "Skip"
msgstr "Omitir"
-#: base/main.cpp:294 backends/platform/symbian/src/SymbianActions.cpp:50
+#: base/main.cpp:312 backends/platform/symbian/src/SymbianActions.cpp:50
#: backends/platform/wince/CEActionsPocket.cpp:42
msgid "Pause"
msgstr "Pausa"
-#: base/main.cpp:297
+#: base/main.cpp:315
msgid "Skip line"
msgstr "Omitir liña"
-#: base/main.cpp:468
+#: base/main.cpp:507
msgid "Error running game:"
msgstr "Erro de execución do xogo:"
-#: base/main.cpp:492
+#: base/main.cpp:536
msgid "Could not find any engine capable of running the selected game"
msgstr "Non se puido atopar un motor para executar o xogo seleccionado"
@@ -1221,72 +1225,72 @@ msgstr "Usuario cancelado"
msgid "Unknown error"
msgstr "Erro descoñecido"
-#: engines/advancedDetector.cpp:316
+#: engines/advancedDetector.cpp:317
#, c-format
msgid "The game in '%s' seems to be unknown."
msgstr "O xogo de %s semella ser descoñecido."
-#: engines/advancedDetector.cpp:317
+#: engines/advancedDetector.cpp:318
msgid "Please, report the following data to the ScummVM team along with name"
msgstr "Facilita esta información ao equipo de ScummVM, xunto co nome"
-#: engines/advancedDetector.cpp:319
+#: engines/advancedDetector.cpp:320
msgid "of the game you tried to add and its version/language/etc.:"
msgstr "do xogo que tentaches engadir, xunto coa versión, lingua, etc.:"
-#: engines/dialogs.cpp:84
+#: engines/dialogs.cpp:85
msgid "~R~esume"
msgstr "~R~etomar"
-#: engines/dialogs.cpp:86
+#: engines/dialogs.cpp:87
msgid "~L~oad"
msgstr "~C~argar"
-#: engines/dialogs.cpp:90
+#: engines/dialogs.cpp:91
msgid "~S~ave"
msgstr "~G~ardar"
-#: engines/dialogs.cpp:94
+#: engines/dialogs.cpp:95
msgid "~O~ptions"
msgstr "~O~pcións"
-#: engines/dialogs.cpp:99
+#: engines/dialogs.cpp:100
msgid "~H~elp"
msgstr "~A~xuda"
-#: engines/dialogs.cpp:101
+#: engines/dialogs.cpp:102
msgid "~A~bout"
msgstr "Acerca ~d~e"
-#: engines/dialogs.cpp:104 engines/dialogs.cpp:180
+#: engines/dialogs.cpp:105 engines/dialogs.cpp:181
msgid "~R~eturn to Launcher"
msgstr "~V~olver ao Iniciador"
-#: engines/dialogs.cpp:106 engines/dialogs.cpp:182
+#: engines/dialogs.cpp:107 engines/dialogs.cpp:183
msgctxt "lowres"
msgid "~R~eturn to Launcher"
msgstr "~V~olver ao Iniciador"
-#: engines/dialogs.cpp:115 engines/agi/saveload.cpp:803
-#: engines/drascula/saveload.cpp:338 engines/cruise/menu.cpp:212
-#: engines/sci/engine/kfile.cpp:742 engines/toltecs/menu.cpp:284
-#: engines/pegasus/pegasus.cpp:373
+#: engines/dialogs.cpp:116 engines/agi/saveload.cpp:803
+#: engines/cruise/menu.cpp:212 engines/drascula/saveload.cpp:336
+#: engines/neverhood/menumodule.cpp:873 engines/pegasus/pegasus.cpp:377
+#: engines/sci/engine/kfile.cpp:758 engines/toltecs/menu.cpp:281
msgid "Save game:"
msgstr "Gardar partida:"
-#: engines/dialogs.cpp:115 engines/agi/saveload.cpp:803
-#: engines/drascula/saveload.cpp:338 engines/scumm/dialogs.cpp:187
-#: engines/cruise/menu.cpp:212 engines/sci/engine/kfile.cpp:742
-#: engines/toltecs/menu.cpp:284 engines/pegasus/pegasus.cpp:373
-#: backends/platform/symbian/src/SymbianActions.cpp:44
+#: engines/dialogs.cpp:116 backends/platform/symbian/src/SymbianActions.cpp:44
#: backends/platform/wince/CEActionsPocket.cpp:43
#: backends/platform/wince/CEActionsPocket.cpp:267
#: backends/platform/wince/CEActionsSmartphone.cpp:45
#: backends/platform/wince/CEActionsSmartphone.cpp:231
+#: engines/agi/saveload.cpp:803 engines/cruise/menu.cpp:212
+#: engines/drascula/saveload.cpp:336 engines/neverhood/menumodule.cpp:873
+#: engines/pegasus/pegasus.cpp:377 engines/sci/engine/kfile.cpp:758
+#: engines/scumm/dialogs.cpp:188 engines/toltecs/menu.cpp:281
msgid "Save"
msgstr "Gardar"
-#: engines/dialogs.cpp:144
+#: engines/dialogs.cpp:145
msgid ""
"Sorry, this engine does not currently provide in-game help. Please consult "
"the README for basic information, and for instructions on how to obtain "
@@ -1296,7 +1300,7 @@ msgstr ""
"para obter información básica e máis instrucións para acadar asistencia "
"adicional."
-#: engines/dialogs.cpp:228
+#: engines/dialogs.cpp:234 engines/pegasus/pegasus.cpp:393
#, c-format
msgid ""
"Gamestate save failed (%s)! Please consult the README for basic information, "
@@ -1305,37 +1309,37 @@ msgstr ""
"Erro ao gardar (%s)! Consulta o ficheiro README para obter información "
"básica e máis instrucións para acadar asistencia adicional."
-#: engines/dialogs.cpp:301 engines/mohawk/dialogs.cpp:109
+#: engines/dialogs.cpp:307 engines/mohawk/dialogs.cpp:109
#: engines/mohawk/dialogs.cpp:170
msgid "~O~K"
msgstr "~A~ceptar"
-#: engines/dialogs.cpp:302 engines/mohawk/dialogs.cpp:110
+#: engines/dialogs.cpp:308 engines/mohawk/dialogs.cpp:110
#: engines/mohawk/dialogs.cpp:171
msgid "~C~ancel"
msgstr "~C~ancelar"
-#: engines/dialogs.cpp:305
+#: engines/dialogs.cpp:311
msgid "~K~eys"
msgstr "~T~eclas"
-#: engines/engine.cpp:240
+#: engines/engine.cpp:245
msgid "Could not initialize color format."
msgstr "Non se puido iniciar o formato de cor."
-#: engines/engine.cpp:248
+#: engines/engine.cpp:253
msgid "Could not switch to video mode: '"
msgstr "Non se puido cambiar ao modo de vídeo: '"
-#: engines/engine.cpp:257
+#: engines/engine.cpp:262
msgid "Could not apply aspect ratio setting."
msgstr "Non se puido aplicar a configuración de proporción."
-#: engines/engine.cpp:262
+#: engines/engine.cpp:267
msgid "Could not apply fullscreen setting."
msgstr "Non se puido aplicar a configuración de pantalla completa."
-#: engines/engine.cpp:362
+#: engines/engine.cpp:367
msgid ""
"You appear to be playing this game directly\n"
"from the CD. This is known to cause problems,\n"
@@ -1349,7 +1353,7 @@ msgstr ""
"os ficheiros de datos ao disco duro. Consulta\n"
"o ficheiro README para obter máis información."
-#: engines/engine.cpp:373
+#: engines/engine.cpp:378
msgid ""
"This game has audio tracks in its disk. These\n"
"tracks need to be ripped from the disk using\n"
@@ -1363,7 +1367,7 @@ msgstr ""
"do xogo. Consulta o ficheiro README\n"
"para obter máis información."
-#: engines/engine.cpp:431
+#: engines/engine.cpp:436
#, c-format
msgid ""
"Gamestate load failed (%s)! Please consult the README for basic information, "
@@ -1372,7 +1376,7 @@ msgstr ""
"Erro ao cargar (%s)! Consulta o ficheiro README para obter información "
"básica e máis instrucións para acadar asistencia adicional."
-#: engines/engine.cpp:444
+#: engines/engine.cpp:449
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 "
@@ -1382,34 +1386,761 @@ msgstr ""
"Por iso, talvez sexa inestable e os ficheiros de gardado talvez non "
"funcionen en futuras versións de ScummVM."
-#: engines/engine.cpp:447
+#: engines/engine.cpp:452
msgid "Start anyway"
msgstr "Iniciar de todos os xeitos"
-#: engines/agi/detection.cpp:142 engines/drascula/detection.cpp:270
-#: engines/dreamweb/detection.cpp:47 engines/sci/detection.cpp:393
-#: engines/toltecs/detection.cpp:173
+#: audio/fmopl.cpp:50
+msgid "MAME OPL emulator"
+msgstr "Emulador de OPL de MAME"
+
+#: audio/fmopl.cpp:52
+msgid "DOSBox OPL emulator"
+msgstr "Emulador de OPL de DOSBox"
+
+#: audio/mididrv.cpp:209
+#, c-format
+msgid ""
+"The selected audio device '%s' was not found (e.g. might be turned off or "
+"disconnected)."
+msgstr ""
+"Non se atopou o dispositivo de son seleccionado (%s). Talvez estea apagado "
+"ou desconectado."
+
+#: audio/mididrv.cpp:209 audio/mididrv.cpp:221 audio/mididrv.cpp:257
+#: audio/mididrv.cpp:272
+msgid "Attempting to fall back to the next available device..."
+msgstr "Intentando pasar ao seguinte dispositivo dispoñible..."
+
+#: audio/mididrv.cpp:221
+#, c-format
+msgid ""
+"The selected audio device '%s' cannot be used. See log file for more "
+"information."
+msgstr ""
+"Non se pode empregar o dispositivo de son seleccionado (%s). Consulta o "
+"rexistro para obter máis información."
+
+#: audio/mididrv.cpp:257
+#, c-format
+msgid ""
+"The preferred audio device '%s' was not found (e.g. might be turned off or "
+"disconnected)."
+msgstr ""
+"Non se atopou o dispositivo de son preferido (%s). Talvez estea apagado ou "
+"desconectado."
+
+#: audio/mididrv.cpp:272
+#, c-format
+msgid ""
+"The preferred audio device '%s' cannot be used. See log file for more "
+"information."
+msgstr ""
+"Non se pode empregar o dispositivo de son preferido (%s). Consulta o "
+"rexistro para obter máis información."
+
+#: audio/null.h:44
+msgid "No music"
+msgstr "Sen música"
+
+#: audio/mods/paula.cpp:196
+msgid "Amiga Audio Emulator"
+msgstr "Emulador de Amiga Audio"
+
+#: audio/softsynth/adlib.cpp:2285
+msgid "AdLib Emulator"
+msgstr "Emulador de AdLib"
+
+#: audio/softsynth/appleiigs.cpp:33
+msgid "Apple II GS Emulator (NOT IMPLEMENTED)"
+msgstr "Emulador de Apple II GS (non implementado)"
+
+#: audio/softsynth/sid.cpp:1430
+msgid "C64 Audio Emulator"
+msgstr "Emulador de C64 Audio"
+
+#: audio/softsynth/mt32.cpp:200
+msgid "Initializing MT-32 Emulator"
+msgstr "Iniciando emulador de MT-32"
+
+#: audio/softsynth/mt32.cpp:426
+msgid "MT-32 Emulator"
+msgstr "Emulador de MT-32"
+
+#: audio/softsynth/pcspk.cpp:139
+msgid "PC Speaker Emulator"
+msgstr "Emulador de altofalante de PC"
+
+#: audio/softsynth/pcspk.cpp:158
+msgid "IBM PCjr Emulator"
+msgstr "Emulador de IBM PCjr"
+
+#: backends/keymapper/remap-dialog.cpp:48
+msgid "Keymap:"
+msgstr "Asignación de teclas:"
+
+#: backends/keymapper/remap-dialog.cpp:67
+msgid " (Effective)"
+msgstr " (Efectiva)"
+
+#: backends/keymapper/remap-dialog.cpp:107
+msgid " (Active)"
+msgstr " (Activa)"
+
+#: backends/keymapper/remap-dialog.cpp:107
+msgid " (Blocked)"
+msgstr " (Bloqueada)"
+
+#: backends/keymapper/remap-dialog.cpp:120
+msgid " (Global)"
+msgstr " (Global)"
+
+#: backends/keymapper/remap-dialog.cpp:128
+msgid " (Game)"
+msgstr " (Xogo)"
+
+#: backends/midi/windows.cpp:165
+msgid "Windows MIDI"
+msgstr "Windows MIDI"
+
+#: backends/platform/ds/arm9/source/dsoptions.cpp:56
+#: engines/scumm/dialogs.cpp:291
+msgid "~C~lose"
+msgstr "~P~echar"
+
+#: backends/platform/ds/arm9/source/dsoptions.cpp:57
+msgid "ScummVM Main Menu"
+msgstr "Menú principal de ScummVM"
+
+#: backends/platform/ds/arm9/source/dsoptions.cpp:63
+msgid "~L~eft handed mode"
+msgstr "Modo para ~z~urdos"
+
+#: backends/platform/ds/arm9/source/dsoptions.cpp:64
+msgid "~I~ndy fight controls"
+msgstr "Controis de combate de ~I~ndy"
+
+#: backends/platform/ds/arm9/source/dsoptions.cpp:65
+msgid "Show mouse cursor"
+msgstr "Mostrar cursor do rato"
+
+#: backends/platform/ds/arm9/source/dsoptions.cpp:66
+msgid "Snap to edges"
+msgstr "Axustar ás marxes"
+
+#: backends/platform/ds/arm9/source/dsoptions.cpp:68
+msgid "Touch X Offset"
+msgstr "Corrección táctil X"
+
+#: backends/platform/ds/arm9/source/dsoptions.cpp:75
+msgid "Touch Y Offset"
+msgstr "Corrección táctil Y"
+
+#: backends/platform/ds/arm9/source/dsoptions.cpp:87
+msgid "Use laptop trackpad-style cursor control"
+msgstr "Empregar control de cursor por trackpad"
+
+#: backends/platform/ds/arm9/source/dsoptions.cpp:88
+msgid "Tap for left click, double tap right click"
+msgstr "Tocar unha vez, premer co botón primario; dúas veces, botón secundario"
+
+#: backends/platform/ds/arm9/source/dsoptions.cpp:90
+msgid "Sensitivity"
+msgstr "Sensibilidade"
+
+#: backends/platform/ds/arm9/source/dsoptions.cpp:99
+msgid "Initial top screen scale:"
+msgstr "Escala da pantalla inicial:"
+
+#: backends/platform/ds/arm9/source/dsoptions.cpp:105
+msgid "Main screen scaling:"
+msgstr "Escala da pantalla principal:"
+
+#: backends/platform/ds/arm9/source/dsoptions.cpp:107
+msgid "Hardware scale (fast, but low quality)"
+msgstr "Escala por hardware (rápida, mais baixa calidade)"
+
+#: backends/platform/ds/arm9/source/dsoptions.cpp:108
+msgid "Software scale (good quality, but slower)"
+msgstr "Escala por software (boa calidade, mais lenta)"
+
+#: backends/platform/ds/arm9/source/dsoptions.cpp:109
+msgid "Unscaled (you must scroll left and right)"
+msgstr "Sen escala (deberás desprazar á esquerda e á dereita)"
+
+#: backends/platform/ds/arm9/source/dsoptions.cpp:111
+msgid "Brightness:"
+msgstr "Luminosidade:"
+
+#: backends/platform/ds/arm9/source/dsoptions.cpp:121
+msgid "High quality audio (slower) (reboot)"
+msgstr "Son de alta calidade (máis lento) (reiniciar)"
+
+#: backends/platform/ds/arm9/source/dsoptions.cpp:122
+msgid "Disable power off"
+msgstr "Desactivar apagado"
+
+#: backends/platform/iphone/osys_events.cpp:300
+msgid "Mouse-click-and-drag mode enabled."
+msgstr "Modo premer e arrastrar activado."
+
+#: backends/platform/iphone/osys_events.cpp:302
+msgid "Mouse-click-and-drag mode disabled."
+msgstr "Modo premer e arrastrar desactivado."
+
+#: backends/platform/iphone/osys_events.cpp:313
+msgid "Touchpad mode enabled."
+msgstr "Modo panel táctil activado."
+
+#: backends/platform/iphone/osys_events.cpp:315
+msgid "Touchpad mode disabled."
+msgstr "Modo panel táctil desactivado."
+
+#: backends/platform/maemo/maemo.cpp:209
+msgid "Click Mode"
+msgstr "Modo rato"
+
+#: backends/platform/maemo/maemo.cpp:215
+#: backends/platform/symbian/src/SymbianActions.cpp:42
+#: backends/platform/wince/CEActionsPocket.cpp:60
+#: backends/platform/wince/CEActionsSmartphone.cpp:43
+#: backends/platform/tizen/form.cpp:275
+msgid "Left Click"
+msgstr "Botón primario"
+
+#: backends/platform/maemo/maemo.cpp:218
+msgid "Middle Click"
+msgstr "Botón central"
+
+#: backends/platform/maemo/maemo.cpp:221
+#: backends/platform/symbian/src/SymbianActions.cpp:43
+#: backends/platform/wince/CEActionsSmartphone.cpp:44
+#: backends/platform/tizen/form.cpp:267
+msgid "Right Click"
+msgstr "Botón secundario"
+
+#: backends/platform/sdl/macosx/appmenu_osx.mm:77
+msgid "Hide ScummVM"
+msgstr "Ocultar ScummVM"
+
+#: backends/platform/sdl/macosx/appmenu_osx.mm:82
+msgid "Hide Others"
+msgstr "Ocultar outros"
+
+#: backends/platform/sdl/macosx/appmenu_osx.mm:87
+msgid "Show All"
+msgstr "Mostrar todo"
+
+#: backends/platform/sdl/macosx/appmenu_osx.mm:109
+#: backends/platform/sdl/macosx/appmenu_osx.mm:120
+msgid "Window"
+msgstr "Ventá"
+
+#: backends/platform/sdl/macosx/appmenu_osx.mm:114
+msgid "Minimize"
+msgstr "Minimizar"
+
+#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:46
+msgid "Normal (no scaling)"
+msgstr "Normal (sen escala)"
+
+#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:65
+msgctxt "lowres"
+msgid "Normal (no scaling)"
+msgstr "Normal (sen escala)"
+
+#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2148
+msgid "Enabled aspect ratio correction"
+msgstr "Corrección de proporción activada"
+
+#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2154
+msgid "Disabled aspect ratio correction"
+msgstr "Corrección de proporción desactivada"
+
+#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2209
+msgid "Active graphics filter:"
+msgstr "Filtro de gráficos activo:"
+
+#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2251
+msgid "Windowed mode"
+msgstr "Modo en ventá"
+
+#: backends/graphics/opengl/opengl-graphics.cpp:118
+#, fuzzy
+msgid "OpenGL"
+msgstr "Abrir"
+
+#: backends/graphics/opengl/opengl-graphics.cpp:119
+msgid "OpenGL (No filtering)"
+msgstr ""
+
+#: backends/platform/symbian/src/SymbianActions.cpp:38
+#: backends/platform/wince/CEActionsSmartphone.cpp:39
+msgid "Up"
+msgstr "Arriba"
+
+#: backends/platform/symbian/src/SymbianActions.cpp:39
+#: backends/platform/wince/CEActionsSmartphone.cpp:40
+msgid "Down"
+msgstr "Abaixo"
+
+#: backends/platform/symbian/src/SymbianActions.cpp:40
+#: backends/platform/wince/CEActionsSmartphone.cpp:41
+msgid "Left"
+msgstr "Esquerda"
+
+#: backends/platform/symbian/src/SymbianActions.cpp:41
+#: backends/platform/wince/CEActionsSmartphone.cpp:42
+msgid "Right"
+msgstr "Dereita"
+
+#: backends/platform/symbian/src/SymbianActions.cpp:46
+#: backends/platform/wince/CEActionsSmartphone.cpp:47
+msgid "Zone"
+msgstr "Zona"
+
+#: backends/platform/symbian/src/SymbianActions.cpp:47
+#: backends/platform/wince/CEActionsPocket.cpp:54
+#: backends/platform/wince/CEActionsSmartphone.cpp:48
+msgid "Multi Function"
+msgstr "Multifunción"
+
+#: backends/platform/symbian/src/SymbianActions.cpp:48
+msgid "Swap character"
+msgstr "Cambiar carácter"
+
+#: backends/platform/symbian/src/SymbianActions.cpp:49
+msgid "Skip text"
+msgstr "Omitir texto"
+
+#: backends/platform/symbian/src/SymbianActions.cpp:51
+msgid "Fast mode"
+msgstr "Modo rápido"
+
+#: 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:218
+#: engines/scumm/dialogs.cpp:192 engines/scumm/help.cpp:82
+#: engines/scumm/help.cpp:84
+msgid "Quit"
+msgstr "Saír"
+
+#: backends/platform/symbian/src/SymbianActions.cpp:53
+msgid "Debugger"
+msgstr "Depurador"
+
+#: backends/platform/symbian/src/SymbianActions.cpp:54
+msgid "Global menu"
+msgstr "Menú global"
+
+#: backends/platform/symbian/src/SymbianActions.cpp:55
+msgid "Virtual keyboard"
+msgstr "Teclado virtual"
+
+#: backends/platform/symbian/src/SymbianActions.cpp:56
+msgid "Key mapper"
+msgstr "Asignador de teclas"
+
+#: backends/events/symbiansdl/symbiansdl-events.cpp:184
+msgid "Do you want to quit ?"
+msgstr "Queres saír?"
+
+#: backends/platform/wii/options.cpp:51
+msgid "Video"
+msgstr "Vídeo"
+
+#: backends/platform/wii/options.cpp:54
+msgid "Current video mode:"
+msgstr "Modo de vídeo actual:"
+
+#: backends/platform/wii/options.cpp:56
+msgid "Double-strike"
+msgstr "Dobre"
+
+#: backends/platform/wii/options.cpp:60
+msgid "Horizontal underscan:"
+msgstr "Marxe horizontal:"
+
+#: backends/platform/wii/options.cpp:66
+msgid "Vertical underscan:"
+msgstr "Marxe vertical:"
+
+#: backends/platform/wii/options.cpp:71
+msgid "Input"
+msgstr "Entrada"
+
+#: backends/platform/wii/options.cpp:74
+msgid "GC Pad sensitivity:"
+msgstr "Sensibilidade do mando de GC:"
+
+#: backends/platform/wii/options.cpp:80
+msgid "GC Pad acceleration:"
+msgstr "Aceleración do mando de GC:"
+
+#: backends/platform/wii/options.cpp:86
+msgid "DVD"
+msgstr "DVD"
+
+#: backends/platform/wii/options.cpp:89 backends/platform/wii/options.cpp:101
+msgid "Status:"
+msgstr "Estado:"
+
+#: backends/platform/wii/options.cpp:90 backends/platform/wii/options.cpp:102
+msgid "Unknown"
+msgstr "Descoñecido"
+
+#: backends/platform/wii/options.cpp:93
+msgid "Mount DVD"
+msgstr "Montar DVD"
+
+#: backends/platform/wii/options.cpp:94
+msgid "Unmount DVD"
+msgstr "Desmontar DVD"
+
+#: backends/platform/wii/options.cpp:98
+msgid "SMB"
+msgstr "SMB"
+
+#: backends/platform/wii/options.cpp:106
+msgid "Server:"
+msgstr "Servidor:"
+
+#: backends/platform/wii/options.cpp:110
+msgid "Share:"
+msgstr "Disco compartido:"
+
+#: backends/platform/wii/options.cpp:114
+msgid "Username:"
+msgstr "Nome de usuario:"
+
+#: backends/platform/wii/options.cpp:118
+msgid "Password:"
+msgstr "Contrasinal:"
+
+#: backends/platform/wii/options.cpp:121
+msgid "Init network"
+msgstr "Conectar á rede"
+
+#: backends/platform/wii/options.cpp:123
+msgid "Mount SMB"
+msgstr "Montar SMB"
+
+#: backends/platform/wii/options.cpp:124
+msgid "Unmount SMB"
+msgstr "Desmontar SMB"
+
+#: backends/platform/wii/options.cpp:143
+msgid "DVD Mounted successfully"
+msgstr "DVD montado con éxito"
+
+#: backends/platform/wii/options.cpp:146
+msgid "Error while mounting the DVD"
+msgstr "Erro ao montar o DVD"
+
+#: backends/platform/wii/options.cpp:148
+msgid "DVD not mounted"
+msgstr "DVD non montado"
+
+#: backends/platform/wii/options.cpp:161
+msgid "Network up, share mounted"
+msgstr "Conexión á rede, disco montado"
+
+#: backends/platform/wii/options.cpp:163
+msgid "Network up"
+msgstr "Conexión á rede"
+
+#: backends/platform/wii/options.cpp:166
+msgid ", error while mounting the share"
+msgstr ", erro ao montar o disco"
+
+#: backends/platform/wii/options.cpp:168
+msgid ", share not mounted"
+msgstr ", disco non montado"
+
+#: backends/platform/wii/options.cpp:174
+msgid "Network down"
+msgstr "Non hai conexión á rede"
+
+#: backends/platform/wii/options.cpp:178
+msgid "Initializing network"
+msgstr "Conectando á rede"
+
+#: backends/platform/wii/options.cpp:182
+msgid "Timeout while initializing network"
+msgstr "Tempo de espera esgotado"
+
+#: backends/platform/wii/options.cpp:186
+#, c-format
+msgid "Network not initialized (%d)"
+msgstr "Erro de conexión á rede (%d)"
+
+#: backends/platform/wince/CEActionsPocket.cpp:46
+msgid "Hide Toolbar"
+msgstr "Ocultar barra de ferramentas"
+
+#: backends/platform/wince/CEActionsPocket.cpp:47
+msgid "Show Keyboard"
+msgstr "Mostrar teclado"
+
+#: backends/platform/wince/CEActionsPocket.cpp:48
+msgid "Sound on/off"
+msgstr "Son si/non"
+
+#: backends/platform/wince/CEActionsPocket.cpp:49
+msgid "Right click"
+msgstr "Botón secundario"
+
+#: backends/platform/wince/CEActionsPocket.cpp:50
+msgid "Show/Hide Cursor"
+msgstr "Mostrar/ocultar cursor"
+
+#: backends/platform/wince/CEActionsPocket.cpp:51
+msgid "Free look"
+msgstr "Vista libre"
+
+#: backends/platform/wince/CEActionsPocket.cpp:52
+msgid "Zoom up"
+msgstr "Ampliar"
+
+#: backends/platform/wince/CEActionsPocket.cpp:53
+msgid "Zoom down"
+msgstr "Reducir"
+
+#: backends/platform/wince/CEActionsPocket.cpp:55
+#: backends/platform/wince/CEActionsSmartphone.cpp:49
+msgid "Bind Keys"
+msgstr "Vincular teclas"
+
+#: backends/platform/wince/CEActionsPocket.cpp:56
+msgid "Cursor Up"
+msgstr "Arriba"
+
+#: backends/platform/wince/CEActionsPocket.cpp:57
+msgid "Cursor Down"
+msgstr "Abaixo"
+
+#: backends/platform/wince/CEActionsPocket.cpp:58
+msgid "Cursor Left"
+msgstr "Esquerda"
+
+#: backends/platform/wince/CEActionsPocket.cpp:59
+msgid "Cursor Right"
+msgstr "Dereita"
+
+#: backends/platform/wince/CEActionsPocket.cpp:267
+#: backends/platform/wince/CEActionsSmartphone.cpp:231
+msgid "Do you want to load or save the game?"
+msgstr "Queres cargar ou gardar a partida?"
+
+#: backends/platform/wince/CEActionsPocket.cpp:326
+#: backends/platform/wince/CEActionsSmartphone.cpp:287
+msgid " Are you sure you want to quit ? "
+msgstr " Seguro que queres saír?"
+
+#: backends/platform/wince/CEActionsSmartphone.cpp:50
+msgid "Keyboard"
+msgstr "Teclado"
+
+#: backends/platform/wince/CEActionsSmartphone.cpp:51
+msgid "Rotate"
+msgstr "Rotar"
+
+#: backends/platform/wince/CELauncherDialog.cpp:56
+msgid "Using SDL driver "
+msgstr "Empregando driver de SDL"
+
+#: backends/platform/wince/CELauncherDialog.cpp:60
+msgid "Display "
+msgstr "Pantalla"
+
+#: backends/platform/wince/CELauncherDialog.cpp:83
+msgid "Do you want to perform an automatic scan ?"
+msgstr "Queres realizar unha análise automática?"
+
+#: backends/platform/wince/wince-sdl.cpp:516
+msgid "Map right click action"
+msgstr "Asignar acción de botón secundario"
+
+#: backends/platform/wince/wince-sdl.cpp:520
+msgid "You must map a key to the 'Right Click' action to play this game"
+msgstr ""
+"Debes asignar unha tecla á acción do botón secundario do rato para xogar"
+
+#: backends/platform/wince/wince-sdl.cpp:529
+msgid "Map hide toolbar action"
+msgstr "Asignar acción Ocultar barra de ferramentas"
+
+#: backends/platform/wince/wince-sdl.cpp:533
+msgid "You must map a key to the 'Hide toolbar' action to play this game"
+msgstr ""
+"Debes asignar unha tecla á acción Ocultar barra de ferramentas para xogar"
+
+#: backends/platform/wince/wince-sdl.cpp:542
+msgid "Map Zoom Up action (optional)"
+msgstr "Asignar acción de Ampliar (opcional)"
+
+#: backends/platform/wince/wince-sdl.cpp:545
+msgid "Map Zoom Down action (optional)"
+msgstr "Asignar acción de Reducir (opcional)"
+
+#: backends/platform/wince/wince-sdl.cpp:553
+msgid ""
+"Don't forget to map a key to 'Hide Toolbar' action to see the whole inventory"
+msgstr ""
+"Non esquezas asignar unha tecla á acción Ocultar barra de ferramentas para "
+"ver o inventario completo"
+
+#: backends/events/default/default-events.cpp:196
+msgid "Do you really want to return to the Launcher?"
+msgstr "Seguro que queres volver ao Iniciador?"
+
+#: backends/events/default/default-events.cpp:196
+msgid "Launcher"
+msgstr "Iniciador"
+
+#: backends/events/default/default-events.cpp:218
+msgid "Do you really want to quit?"
+msgstr "Seguro que queres saír?"
+
+#: backends/events/gph/gph-events.cpp:386
+#: backends/events/gph/gph-events.cpp:429
+#: backends/events/openpandora/op-events.cpp:168
+msgid "Touchscreen 'Tap Mode' - Left Click"
+msgstr "Modo pantalla táctil: premer botón primario"
+
+#: backends/events/gph/gph-events.cpp:388
+#: backends/events/gph/gph-events.cpp:431
+#: backends/events/openpandora/op-events.cpp:170
+msgid "Touchscreen 'Tap Mode' - Right Click"
+msgstr "Modo pantalla táctil: premer botón secundario"
+
+#: backends/events/gph/gph-events.cpp:390
+#: backends/events/gph/gph-events.cpp:433
+#: backends/events/openpandora/op-events.cpp:172
+msgid "Touchscreen 'Tap Mode' - Hover (No Click)"
+msgstr "Modo pantalla táctil: apuntar co rato (sen premer)"
+
+#: backends/events/gph/gph-events.cpp:410
+msgid "Maximum Volume"
+msgstr "Volume máximo"
+
+#: backends/events/gph/gph-events.cpp:412
+msgid "Increasing Volume"
+msgstr "Subindo volume"
+
+#: backends/events/gph/gph-events.cpp:418
+msgid "Minimal Volume"
+msgstr "Volume mínimo"
+
+#: backends/events/gph/gph-events.cpp:420
+msgid "Decreasing Volume"
+msgstr "Baixando volume"
+
+#: backends/events/openpandora/op-events.cpp:174
+msgid "Touchscreen 'Tap Mode' - Hover (DPad Clicks)"
+msgstr "Modo pantalla táctil: apuntar co rato (premer na cruceta)"
+
+#: backends/updates/macosx/macosx-updates.mm:67
+msgid "Check for Updates..."
+msgstr "Buscar actualizacións..."
+
+#: backends/platform/tizen/form.cpp:263
+msgid "Right Click Once"
+msgstr "Botón secundario unha vez"
+
+#: backends/platform/tizen/form.cpp:271
+msgid "Move Only"
+msgstr "Mover unicamente"
+
+#: backends/platform/tizen/form.cpp:294
+msgid "Escape Key"
+msgstr "ESC"
+
+#: backends/platform/tizen/form.cpp:299
+msgid "Game Menu"
+msgstr "Menú do xogo"
+
+#: backends/platform/tizen/form.cpp:304
+msgid "Show Keypad"
+msgstr "Mostrar teclado numérico"
+
+#: backends/platform/tizen/form.cpp:309
+msgid "Control Mouse"
+msgstr "Rato"
+
+#: backends/events/maemosdl/maemosdl-events.cpp:192
+msgid "Clicking Enabled"
+msgstr "Premer activado"
+
+#: backends/events/maemosdl/maemosdl-events.cpp:192
+msgid "Clicking Disabled"
+msgstr "Premer desactivado"
+
+#: engines/agi/detection.cpp:142 engines/drascula/detection.cpp:302
+#: engines/dreamweb/detection.cpp:47 engines/neverhood/detection.cpp:160
+#: engines/sci/detection.cpp:394 engines/toltecs/detection.cpp:186
msgid "Use original save/load screens"
msgstr "Empregar pantallas orixinais de gardado e carga"
-#: engines/agi/detection.cpp:143 engines/drascula/detection.cpp:271
-#: engines/dreamweb/detection.cpp:48 engines/sci/detection.cpp:394
-#: engines/toltecs/detection.cpp:174
+#: engines/agi/detection.cpp:143 engines/drascula/detection.cpp:303
+#: engines/dreamweb/detection.cpp:48 engines/neverhood/detection.cpp:161
+#: engines/sci/detection.cpp:395 engines/toltecs/detection.cpp:187
msgid "Use the original save/load screens, instead of the ScummVM ones"
msgstr ""
"Empregar as pantallas orixinais de gardado e carga, no canto das de ScummVM"
-#: engines/agi/saveload.cpp:816 engines/drascula/saveload.cpp:351
-#: engines/sci/engine/kfile.cpp:841 engines/toltecs/menu.cpp:259
+#: engines/agi/saveload.cpp:816 engines/drascula/saveload.cpp:349
+#: engines/neverhood/menumodule.cpp:886 engines/sci/engine/kfile.cpp:857
+#: engines/toltecs/menu.cpp:256
msgid "Restore game:"
msgstr "Restaurar xogo:"
-#: engines/agi/saveload.cpp:816 engines/drascula/saveload.cpp:351
-#: engines/sci/engine/kfile.cpp:841 engines/toltecs/menu.cpp:259
+#: engines/agi/saveload.cpp:816 engines/drascula/saveload.cpp:349
+#: engines/neverhood/menumodule.cpp:886 engines/sci/engine/kfile.cpp:857
+#: engines/toltecs/menu.cpp:256
msgid "Restore"
msgstr "Restaurar"
-#: engines/drascula/saveload.cpp:49
+#: engines/agos/saveload.cpp:160 engines/scumm/scumm.cpp:2321
+#, c-format
+msgid ""
+"Failed to load game state from file:\n"
+"\n"
+"%s"
+msgstr ""
+"Erro ao cargar a partida do ficheiro:\n"
+"\n"
+"%s"
+
+#: engines/agos/saveload.cpp:195 engines/scumm/scumm.cpp:2314
+#, c-format
+msgid ""
+"Failed to save game state to file:\n"
+"\n"
+"%s"
+msgstr ""
+"Erro ao gardar a partida no ficheiro:\n"
+"\n"
+"%s"
+
+#: engines/agos/saveload.cpp:203 engines/scumm/scumm.cpp:2332
+#, c-format
+msgid ""
+"Successfully saved game state in file:\n"
+"\n"
+"%s"
+msgstr ""
+"Partida gardada con éxito no ficheiro:\n"
+"\n"
+"%s"
+
+#: engines/agos/animation.cpp:557
+#, c-format
+msgid "Cutscene file '%s' not found!"
+msgstr "Non se atopou o ficheiro de secuencia %s!"
+
+#: engines/drascula/saveload.cpp:47
msgid ""
"ScummVM found that you have old savefiles for Drascula that should be "
"converted.\n"
@@ -1435,27 +2166,304 @@ msgstr "Empregar modo de paleta intensa"
msgid "Display graphics using the game's bright palette"
msgstr "Mostrar os gráficos coa paletta intensa do xogo"
-#: engines/sci/detection.cpp:373
+#: engines/gob/inter_playtoons.cpp:256 engines/gob/inter_v2.cpp:1470
+#: engines/tinsel/saveload.cpp:532
+msgid "Failed to load game state from file."
+msgstr "Erro ao cargar a partida do ficheiro."
+
+#: engines/gob/inter_v2.cpp:1540 engines/tinsel/saveload.cpp:545
+msgid "Failed to save game state to file."
+msgstr "Erro ao gardar a partida no ficheiro."
+
+#: engines/gob/inter_v5.cpp:107
+msgid "Failed to delete file."
+msgstr "Erro ao eliminar o ficheiro."
+
+#: engines/groovie/detection.cpp:312
+msgid "Fast movie speed"
+msgstr "Velocidade de vídeo rápida"
+
+#: engines/groovie/detection.cpp:313
+msgid "Play movies at an increased speed"
+msgstr "Reproducir vídeos a máis velocidade"
+
+#: engines/groovie/script.cpp:399
+msgid "Failed to save game"
+msgstr "Erro ao gardar a partida"
+
+#. I18N: Studio audience adds an applause and cheering sounds whenever
+#. Malcolm makes a joke.
+#: engines/kyra/detection.cpp:62
+msgid "Studio audience"
+msgstr "Público do estudio"
+
+#: engines/kyra/detection.cpp:63
+msgid "Enable studio audience"
+msgstr "Activar o público do estudio"
+
+#. I18N: This option allows the user to skip text and cutscenes.
+#: engines/kyra/detection.cpp:73
+msgid "Skip support"
+msgstr "Omisións"
+
+#: engines/kyra/detection.cpp:74
+msgid "Allow text and cutscenes to be skipped"
+msgstr "Permitir a omisión do texto e das secuencias"
+
+#. I18N: Helium mode makes people sound like they've inhaled Helium.
+#: engines/kyra/detection.cpp:84
+msgid "Helium mode"
+msgstr "Modo helio"
+
+#: engines/kyra/detection.cpp:85
+msgid "Enable helium mode"
+msgstr "Activar o modo helio"
+
+#. I18N: When enabled, this option makes scrolling smoother when
+#. changing from one screen to another.
+#: engines/kyra/detection.cpp:99
+msgid "Smooth scrolling"
+msgstr "Desprazamento suave"
+
+#: engines/kyra/detection.cpp:100
+msgid "Enable smooth scrolling when walking"
+msgstr "Activar o desprazamento suave ao camiñar"
+
+#. I18N: When enabled, this option changes the cursor when it floats to the
+#. edge of the screen to a directional arrow. The player can then click to
+#. walk towards that direction.
+#: engines/kyra/detection.cpp:112
+msgid "Floating cursors"
+msgstr "Cursores flotantes"
+
+#: engines/kyra/detection.cpp:113
+msgid "Enable floating cursors"
+msgstr "Activar cursores flotantes"
+
+#. I18N: HP stands for Hit Points
+#: engines/kyra/detection.cpp:127
+msgid "HP bar graphs"
+msgstr "Barras de vida"
+
+#: engines/kyra/detection.cpp:128
+msgid "Enable hit point bar graphs"
+msgstr "Activar barras de vida"
+
+#: engines/kyra/lol.cpp:478
+msgid "Attack 1"
+msgstr "Ataque 1"
+
+#: engines/kyra/lol.cpp:479
+msgid "Attack 2"
+msgstr "Ataque 2"
+
+#: engines/kyra/lol.cpp:480
+msgid "Attack 3"
+msgstr "Ataque 3"
+
+#: engines/kyra/lol.cpp:481
+msgid "Move Forward"
+msgstr "Mover cara diante"
+
+#: engines/kyra/lol.cpp:482
+msgid "Move Back"
+msgstr "Mover cara atrás"
+
+#: engines/kyra/lol.cpp:483
+msgid "Slide Left"
+msgstr "Esvarar á esquerda"
+
+#: engines/kyra/lol.cpp:484
+msgid "Slide Right"
+msgstr "Esvarar á dereita"
+
+#: engines/kyra/lol.cpp:485 engines/pegasus/pegasus.cpp:2509
+msgid "Turn Left"
+msgstr "Xirar á esquerda"
+
+#: engines/kyra/lol.cpp:486 engines/pegasus/pegasus.cpp:2510
+msgid "Turn Right"
+msgstr "Xirar á dereita"
+
+#: engines/kyra/lol.cpp:487
+msgid "Rest"
+msgstr "Parar"
+
+#: engines/kyra/lol.cpp:488
+msgid "Options"
+msgstr "Opcións"
+
+#: engines/kyra/lol.cpp:489
+msgid "Choose Spell"
+msgstr "Elixir feitizo"
+
+#: engines/kyra/sound_midi.cpp:477
+msgid ""
+"You appear to be using a General MIDI device,\n"
+"but your game only supports Roland MT32 MIDI.\n"
+"We try to map the Roland MT32 instruments to\n"
+"General MIDI ones. It is still possible that\n"
+"some tracks sound incorrect."
+msgstr ""
+"Semella que estás a empregar un dispositivo,\n"
+"de General MIDI, maix o xogo só e compatible con\n"
+"Roland MT32 MIDI. Tentamos asignar os instrumentos\n"
+"aos de General MIDI. No entanto, existe a posibilidade\n"
+"de que algunhas pistas non soen correctamente."
+
+#. I18N: Option for fast scene switching
+#: engines/mohawk/dialogs.cpp:92 engines/mohawk/dialogs.cpp:167
+msgid "~Z~ip Mode Activated"
+msgstr "Modo ~c~omprimido activado"
+
+#: engines/mohawk/dialogs.cpp:93
+msgid "~T~ransitions Enabled"
+msgstr "~T~ransicións activadas"
+
+#. I18N: Drop book page
+#: engines/mohawk/dialogs.cpp:95
+msgid "~D~rop Page"
+msgstr "~D~eixar folla"
+
+#: engines/mohawk/dialogs.cpp:99
+msgid "~S~how Map"
+msgstr "Mo~s~trar mapa"
+
+#: engines/mohawk/dialogs.cpp:105
+msgid "~M~ain Menu"
+msgstr "~M~enú principal"
+
+#: engines/mohawk/dialogs.cpp:168
+msgid "~W~ater Effect Enabled"
+msgstr "Efecto de ~a~uga activado"
+
+#: engines/neverhood/detection.cpp:167
+msgid "Skip the Hall of Records storyboard scenes"
+msgstr ""
+
+#: engines/neverhood/detection.cpp:168
+msgid "Allows the player to skip past the Hall of Records storyboard scenes"
+msgstr ""
+
+#: engines/neverhood/detection.cpp:174
+msgid "Scale the making of videos to full screen"
+msgstr ""
+
+#: engines/neverhood/detection.cpp:175
+msgid "Scale the making of videos, so that they use the whole screen"
+msgstr ""
+
+#: engines/parallaction/saveload.cpp:133
+#, c-format
+msgid ""
+"Can't save game in slot %i\n"
+"\n"
+msgstr ""
+"Non se pode gardar a partida no espazo %i\n"
+"\n"
+
+#: engines/parallaction/saveload.cpp:204
+msgid "Loading game..."
+msgstr "Cargando..."
+
+#: engines/parallaction/saveload.cpp:219
+msgid "Saving game..."
+msgstr "Gardando..."
+
+#: engines/parallaction/saveload.cpp:272
+msgid ""
+"ScummVM found that you have old savefiles for Nippon Safes that should be "
+"renamed.\n"
+"The old names are 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 next time.\n"
+msgstr ""
+"ScummVM atopou ficheiros de gardado vellos de Nippon Safes que deberían ser "
+"renomeados.\n"
+"Os nomes vellos xa non son compatibles, de xeito que non poderás cargar as "
+"partidas se non os cambias.\n"
+"\n"
+"Preme Aceptar para cambialos. Se non, volverás ver esta mensaxe a próxima "
+"vez que inicies o xogo.\n"
+
+#: engines/parallaction/saveload.cpp:319
+msgid "ScummVM successfully converted all your savefiles."
+msgstr "ScummVM converteu correctamente todos os ficheiros de gardado."
+
+#: engines/parallaction/saveload.cpp:321
+msgid ""
+"ScummVM printed some warnings in your console window and can't guarantee all "
+"your files have been converted.\n"
+"\n"
+"Please report to the team."
+msgstr ""
+"ScummVM imprimiu avisos na ventá da consola. Non se pode garantir a "
+"conversión de todos os ficheiros.\n"
+"\n"
+"Contacta co equipo de ScummVM."
+
+#: engines/pegasus/pegasus.cpp:714
+msgid "Invalid save file name"
+msgstr "Nome de ficheiro non válido"
+
+#: engines/pegasus/pegasus.cpp:2507
+msgid "Up/Zoom In/Move Forward/Open Doors"
+msgstr "Arriba/Ampliar/Avanzar/Abrir portas"
+
+#: engines/pegasus/pegasus.cpp:2508
+msgid "Down/Zoom Out"
+msgstr "Abaixo/Reducir"
+
+#: engines/pegasus/pegasus.cpp:2511
+msgid "Display/Hide Inventory Tray"
+msgstr "Mostrar/Ocultar bandexa de inventario"
+
+#: engines/pegasus/pegasus.cpp:2512
+msgid "Display/Hide Biochip Tray"
+msgstr "Mostrar/Ocultar bandexa de biochip"
+
+#: engines/pegasus/pegasus.cpp:2513
+msgid "Action/Select"
+msgstr "Acción/Seleccionar"
+
+#: engines/pegasus/pegasus.cpp:2514
+msgid "Toggle Center Data Display"
+msgstr "Activar/Desactivar pantalla de datos"
+
+#: engines/pegasus/pegasus.cpp:2515
+msgid "Display/Hide Info Screen"
+msgstr "Mostrar/Ocultar pantalla de información"
+
+#: engines/pegasus/pegasus.cpp:2516
+msgid "Display/Hide Pause Menu"
+msgstr "Mostrar/Ocultar menú de pausa"
+
+#: engines/pegasus/pegasus.cpp:2517
+msgid "???"
+msgstr "???"
+
+#: engines/sci/detection.cpp:374
msgid "EGA undithering"
msgstr "Non interpolación EGA"
-#: engines/sci/detection.cpp:374
+#: engines/sci/detection.cpp:375
msgid "Enable undithering in EGA games"
msgstr "Activar a non interpolación nos xogos en EGA"
-#: engines/sci/detection.cpp:383
+#: engines/sci/detection.cpp:384
msgid "Prefer digital sound effects"
msgstr "Preferir efectos de son dixitais"
-#: engines/sci/detection.cpp:384
+#: engines/sci/detection.cpp:385
msgid "Prefer digital sound effects instead of synthesized ones"
msgstr "Dar preferencia aos efectos de son dixitais no canto dos sintéticos"
-#: engines/sci/detection.cpp:403
+#: engines/sci/detection.cpp:404
msgid "Use IMF/Yamaha FB-01 for MIDI output"
msgstr "Empregar IMF/Yamaha FB-01 para a saída de MIDI"
-#: engines/sci/detection.cpp:404
+#: engines/sci/detection.cpp:405
msgid ""
"Use an IBM Music Feature card or a Yamaha FB-01 FM synth module for MIDI "
"output"
@@ -1463,167 +2471,149 @@ msgstr ""
"Empregar unha tarxeta IBM Music Feature ou un módulo de sintetizador Yamaha "
"FB-01 FM para a saída de MIDI"
-#: engines/sci/detection.cpp:414
+#: engines/sci/detection.cpp:415
msgid "Use CD audio"
msgstr "Empregar son de CD"
-#: engines/sci/detection.cpp:415
+#: engines/sci/detection.cpp:416
msgid "Use CD audio instead of in-game audio, if available"
msgstr "Empregar son de CD no canto do do xogo, de ser o caso"
-#: engines/sci/detection.cpp:425
+#: engines/sci/detection.cpp:426
msgid "Use Windows cursors"
msgstr "Empregar cursores de Windows"
-#: engines/sci/detection.cpp:426
+#: engines/sci/detection.cpp:427
msgid ""
"Use the Windows cursors (smaller and monochrome) instead of the DOS ones"
msgstr ""
"Empregar os cursores de Windows (máis pequenos e monocromos) no canto dos de "
"DOS"
-#: engines/sci/detection.cpp:436
+#: engines/sci/detection.cpp:437
msgid "Use silver cursors"
msgstr "Empregar cursores prateados"
-#: engines/sci/detection.cpp:437
+#: engines/sci/detection.cpp:438
msgid ""
"Use the alternate set of silver cursors, instead of the normal golden ones"
msgstr ""
"Empregar o xogo de cursores prateados alternativo, no canto dos dourados "
"normais"
-#: engines/scumm/dialogs.cpp:175
+#: engines/scumm/dialogs.cpp:176
#, c-format
msgid "Insert Disk %c and Press Button to Continue."
msgstr "Insire o disco %c e preme o botón para continuar."
-#: engines/scumm/dialogs.cpp:176
+#: engines/scumm/dialogs.cpp:177
#, c-format
msgid "Unable to Find %s, (%c%d) Press Button."
msgstr "Non se puido atopar %s, (%c%d). Preme o botón."
-#: engines/scumm/dialogs.cpp:177
+#: engines/scumm/dialogs.cpp:178
#, c-format
msgid "Error reading disk %c, (%c%d) Press Button."
msgstr "Erro ao ler o disco %c, (%c%d). Preme o botón."
-#: engines/scumm/dialogs.cpp:178
+#: engines/scumm/dialogs.cpp:179
msgid "Game Paused. Press SPACE to Continue."
msgstr "Xogo en pausa. Pulsa a barra espazadora 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
+#: engines/scumm/dialogs.cpp:183
msgid "Are you sure you want to restart? (Y/N)"
msgstr "Seguro que queres reiniciar? (S/N)S"
#. I18N: you may specify 'Yes' symbol at the end of the line. See previous comment
-#: engines/scumm/dialogs.cpp:184
+#: engines/scumm/dialogs.cpp:185
msgid "Are you sure you want to quit? (Y/N)"
msgstr "Seguro que queres saír? (S/N)S"
-#: engines/scumm/dialogs.cpp:189
+#: engines/scumm/dialogs.cpp:190
msgid "Play"
msgstr "Xogar"
-#: 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:215
-msgid "Quit"
-msgstr "Saír"
-
-#: engines/scumm/dialogs.cpp:193
+#: engines/scumm/dialogs.cpp:194
msgid "Insert save/load game disk"
msgstr "Inserir disco de gardado/carga"
-#: engines/scumm/dialogs.cpp:194
+#: engines/scumm/dialogs.cpp:195
msgid "You must enter a name"
msgstr "Debes introducir un nome"
-#: engines/scumm/dialogs.cpp:195
+#: engines/scumm/dialogs.cpp:196
msgid "The game was NOT saved (disk full?)"
msgstr "Non se puido gardar a partida (disco cheo?)"
-#: engines/scumm/dialogs.cpp:196
+#: engines/scumm/dialogs.cpp:197
msgid "The game was NOT loaded"
msgstr "Non se puido cargar a partida"
-#: engines/scumm/dialogs.cpp:197
+#: engines/scumm/dialogs.cpp:198
#, c-format
msgid "Saving '%s'"
msgstr "Gardando %s"
-#: engines/scumm/dialogs.cpp:198
+#: engines/scumm/dialogs.cpp:199
#, c-format
msgid "Loading '%s'"
msgstr "Cargando %s"
-#: engines/scumm/dialogs.cpp:199
+#: engines/scumm/dialogs.cpp:200
msgid "Name your SAVE game"
msgstr "Introduce un nome para a partida gardada"
-#: engines/scumm/dialogs.cpp:200
+#: engines/scumm/dialogs.cpp:201
msgid "Select a game to LOAD"
msgstr "Selecciona unha partida para cargala"
-#: engines/scumm/dialogs.cpp:201
+#: engines/scumm/dialogs.cpp:202
msgid "Game title)"
msgstr "Título)"
#. I18N: Previous page button
-#: engines/scumm/dialogs.cpp:287
+#: engines/scumm/dialogs.cpp:288
msgid "~P~revious"
msgstr "~A~nterior"
#. I18N: Next page button
-#: engines/scumm/dialogs.cpp:289
+#: engines/scumm/dialogs.cpp:290
msgid "~N~ext"
msgstr "~S~eguinte"
-#: engines/scumm/dialogs.cpp:290
-#: backends/platform/ds/arm9/source/dsoptions.cpp:56
-msgid "~C~lose"
-msgstr "~P~echar"
-
-#: engines/scumm/dialogs.cpp:597
+#: engines/scumm/dialogs.cpp:598
msgid "Speech Only"
msgstr "Só voz"
-#: engines/scumm/dialogs.cpp:598
+#: engines/scumm/dialogs.cpp:599
msgid "Speech and Subtitles"
msgstr "Voz e subtítulos"
-#: engines/scumm/dialogs.cpp:599
+#: engines/scumm/dialogs.cpp:600
msgid "Subtitles Only"
msgstr "Só subtítulos"
-#: engines/scumm/dialogs.cpp:607
+#: engines/scumm/dialogs.cpp:608
msgctxt "lowres"
msgid "Speech & Subs"
msgstr "Voz e subs"
-#: engines/scumm/dialogs.cpp:653
+#: engines/scumm/dialogs.cpp:654
msgid "Select a Proficiency Level."
msgstr "Selecciona un nivel de habilidade."
-#: engines/scumm/dialogs.cpp:655
+#: engines/scumm/dialogs.cpp:656
msgid "Refer to your Loom(TM) manual for help."
msgstr "Consulta o manual de Loom(TM) para obter axuda."
-#: engines/scumm/dialogs.cpp:658
-msgid "Standard"
-msgstr "Estándar"
-
-#: engines/scumm/dialogs.cpp:659
+#: engines/scumm/dialogs.cpp:660
msgid "Practice"
msgstr "Práctica"
-#: engines/scumm/dialogs.cpp:660
+#: engines/scumm/dialogs.cpp:661
msgid "Expert"
msgstr "Experto"
@@ -2140,7 +3130,7 @@ msgstr "Voar á dereita"
msgid "Fly to lower right"
msgstr "Voar á dereita abaixo"
-#: engines/scumm/scumm.cpp:1776
+#: engines/scumm/scumm.cpp:1777
#, c-format
msgid ""
"Native MIDI support requires the Roland Upgrade from LucasArts,\n"
@@ -2149,40 +3139,7 @@ msgstr ""
"A compatibilidade nativa con MIDI precisa a actualización de Roland\n"
"de LucasArts, mais falla %s. Empregarase AdLib."
-#: engines/scumm/scumm.cpp:2303 engines/agos/saveload.cpp:220
-#, c-format
-msgid ""
-"Failed to save game state to file:\n"
-"\n"
-"%s"
-msgstr ""
-"Erro ao gardar a partida no ficheiro:\n"
-"\n"
-"%s"
-
-#: engines/scumm/scumm.cpp:2310 engines/agos/saveload.cpp:185
-#, c-format
-msgid ""
-"Failed to load game state from file:\n"
-"\n"
-"%s"
-msgstr ""
-"Erro ao cargar a partida do ficheiro:\n"
-"\n"
-"%s"
-
-#: engines/scumm/scumm.cpp:2322 engines/agos/saveload.cpp:228
-#, c-format
-msgid ""
-"Successfully saved game state in file:\n"
-"\n"
-"%s"
-msgstr ""
-"Partida gardada con éxito no ficheiro:\n"
-"\n"
-"%s"
-
-#: engines/scumm/scumm.cpp:2537
+#: engines/scumm/scumm.cpp:2547
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' "
@@ -2192,190 +3149,6 @@ msgstr ""
"facelo. Para xogar, vai a Engadir xogo no menú de inicio de ScummVM e "
"selecciona o directorio Maniac que está dentro do directorio Tentacle."
-#. I18N: Option for fast scene switching
-#: engines/mohawk/dialogs.cpp:92 engines/mohawk/dialogs.cpp:167
-msgid "~Z~ip Mode Activated"
-msgstr "Modo ~c~omprimido activado"
-
-#: engines/mohawk/dialogs.cpp:93
-msgid "~T~ransitions Enabled"
-msgstr "~T~ransicións activadas"
-
-#. I18N: Drop book page
-#: engines/mohawk/dialogs.cpp:95
-msgid "~D~rop Page"
-msgstr "~D~eixar folla"
-
-#: engines/mohawk/dialogs.cpp:99
-msgid "~S~how Map"
-msgstr "Mo~s~trar mapa"
-
-#: engines/mohawk/dialogs.cpp:105
-msgid "~M~ain Menu"
-msgstr "~M~enú principal"
-
-#: engines/mohawk/dialogs.cpp:168
-msgid "~W~ater Effect Enabled"
-msgstr "Efecto de ~a~uga activado"
-
-#: engines/agos/animation.cpp:557
-#, c-format
-msgid "Cutscene file '%s' not found!"
-msgstr "Non se atopou o ficheiro de secuencia %s!"
-
-#: engines/gob/inter_playtoons.cpp:256 engines/gob/inter_v2.cpp:1287
-#: engines/tinsel/saveload.cpp:532
-msgid "Failed to load game state from file."
-msgstr "Erro ao cargar a partida do ficheiro."
-
-#: engines/gob/inter_v2.cpp:1357 engines/tinsel/saveload.cpp:545
-msgid "Failed to save game state to file."
-msgstr "Erro ao gardar a partida no ficheiro."
-
-#: engines/gob/inter_v5.cpp:107
-msgid "Failed to delete file."
-msgstr "Erro ao eliminar o ficheiro."
-
-#: engines/groovie/detection.cpp:312
-msgid "Fast movie speed"
-msgstr "Velocidade de vídeo rápida"
-
-#: engines/groovie/detection.cpp:313
-msgid "Play movies at an increased speed"
-msgstr "Reproducir vídeos a máis velocidade"
-
-#: engines/groovie/script.cpp:420
-msgid "Failed to save game"
-msgstr "Erro ao gardar a partida"
-
-#. I18N: Studio audience adds an applause and cheering sounds whenever
-#. Malcolm makes a joke.
-#: engines/kyra/detection.cpp:62
-msgid "Studio audience"
-msgstr "Público do estudio"
-
-#: engines/kyra/detection.cpp:63
-msgid "Enable studio audience"
-msgstr "Activar o público do estudio"
-
-#. I18N: This option allows the user to skip text and cutscenes.
-#: engines/kyra/detection.cpp:73
-msgid "Skip support"
-msgstr "Omisións"
-
-#: engines/kyra/detection.cpp:74
-msgid "Allow text and cutscenes to be skipped"
-msgstr "Permitir a omisión do texto e das secuencias"
-
-#. I18N: Helium mode makes people sound like they've inhaled Helium.
-#: engines/kyra/detection.cpp:84
-msgid "Helium mode"
-msgstr "Modo helio"
-
-#: engines/kyra/detection.cpp:85
-msgid "Enable helium mode"
-msgstr "Activar o modo helio"
-
-#. I18N: When enabled, this option makes scrolling smoother when
-#. changing from one screen to another.
-#: engines/kyra/detection.cpp:99
-msgid "Smooth scrolling"
-msgstr "Desprazamento suave"
-
-#: engines/kyra/detection.cpp:100
-msgid "Enable smooth scrolling when walking"
-msgstr "Activar o desprazamento suave ao camiñar"
-
-#. I18N: When enabled, this option changes the cursor when it floats to the
-#. edge of the screen to a directional arrow. The player can then click to
-#. walk towards that direction.
-#: engines/kyra/detection.cpp:112
-msgid "Floating cursors"
-msgstr "Cursores flotantes"
-
-#: engines/kyra/detection.cpp:113
-msgid "Enable floating cursors"
-msgstr "Activar cursores flotantes"
-
-#. I18N: HP stands for Hit Points
-#: engines/kyra/detection.cpp:127
-msgid "HP bar graphs"
-msgstr "Barras de vida"
-
-#: engines/kyra/detection.cpp:128
-msgid "Enable hit point bar graphs"
-msgstr "Activar barras de vida"
-
-#: engines/kyra/lol.cpp:478
-msgid "Attack 1"
-msgstr "Ataque 1"
-
-#: engines/kyra/lol.cpp:479
-msgid "Attack 2"
-msgstr "Ataque 2"
-
-#: engines/kyra/lol.cpp:480
-msgid "Attack 3"
-msgstr "Ataque 3"
-
-#: engines/kyra/lol.cpp:481
-msgid "Move Forward"
-msgstr "Mover cara diante"
-
-#: engines/kyra/lol.cpp:482
-msgid "Move Back"
-msgstr "Mover cara atrás"
-
-#: engines/kyra/lol.cpp:483
-msgid "Slide Left"
-msgstr "Esvarar á esquerda"
-
-#: engines/kyra/lol.cpp:484
-msgid "Slide Right"
-msgstr "Esvarar á dereita"
-
-#: engines/kyra/lol.cpp:485 engines/pegasus/pegasus.cpp:2447
-msgid "Turn Left"
-msgstr "Xirar á esquerda"
-
-#: engines/kyra/lol.cpp:486 engines/pegasus/pegasus.cpp:2448
-msgid "Turn Right"
-msgstr "Xirar á dereita"
-
-#: engines/kyra/lol.cpp:487
-msgid "Rest"
-msgstr "Parar"
-
-#: engines/kyra/lol.cpp:488
-msgid "Options"
-msgstr "Opcións"
-
-#: engines/kyra/lol.cpp:489
-msgid "Choose Spell"
-msgstr "Elixir feitizo"
-
-#: engines/kyra/sound_midi.cpp:477
-msgid ""
-"You appear to be using a General MIDI device,\n"
-"but your game only supports Roland MT32 MIDI.\n"
-"We try to map the Roland MT32 instruments to\n"
-"General MIDI ones. It is still possible that\n"
-"some tracks sound incorrect."
-msgstr ""
-"Semella que estás a empregar un dispositivo,\n"
-"de General MIDI, maix o xogo só e compatible con\n"
-"Roland MT32 MIDI. Tentamos asignar os instrumentos\n"
-"aos de General MIDI. No entanto, existe a posibilidade\n"
-"de que algunhas pistas non soen correctamente."
-
-#: engines/queen/queen.cpp:59
-msgid "Alternative intro"
-msgstr "Intro alternativa"
-
-#: engines/queen/queen.cpp:60
-msgid "Use an alternative game intro (CD version only)"
-msgstr "Empregar unha introdución alternativa para o xogo (só versión en CD)"
-
#: engines/sky/compact.cpp:130
msgid ""
"Unable to find \"sky.cpt\" file!\n"
@@ -2400,22 +3173,25 @@ msgstr "Intro de disquete"
msgid "Use the floppy version's intro (CD version only)"
msgstr "Empregar a introdución da versión en disquete (só versión en CD)"
-#: engines/sword1/animation.cpp:519
+#: engines/sword1/animation.cpp:524
#, c-format
msgid "PSX stream cutscene '%s' cannot be played in paletted mode"
msgstr "Non se pode reproducir a secuencia %s de PSX neste modo gráfico"
-#: engines/sword1/animation.cpp:540 engines/sword2/animation.cpp:439
+#: engines/sword1/animation.cpp:545 engines/sword2/animation.cpp:445
msgid "DXA cutscenes found but ScummVM has been built without zlib support"
msgstr ""
"Atopáronse secuencias de DXA. No entanto, esta versión de ScummVM non é "
"compatible con zlib"
-#: engines/sword1/animation.cpp:550 engines/sword2/animation.cpp:449
-msgid "MPEG2 cutscenes are no longer supported"
-msgstr "Xa non hai compatibilidade coas secuencias en MPEG2"
+#: engines/sword1/animation.cpp:561
+#, fuzzy
+msgid "MPEG-2 cutscenes found but ScummVM has been built without MPEG-2"
+msgstr ""
+"Atopáronse secuencias de PSX. No entanto, a versión de ScummVM non é "
+"compatible con cores RGB"
-#: engines/sword1/animation.cpp:556 engines/sword2/animation.cpp:457
+#: engines/sword1/animation.cpp:568 engines/sword2/animation.cpp:470
#, c-format
msgid "Cutscene '%s' not found"
msgstr "Non se atopou a secuencia %s"
@@ -2459,13 +3235,21 @@ msgstr "Conservar a nova"
msgid "This is the end of the Broken Sword 1 Demo"
msgstr "Aquí remata a demo de Broken Sword 1"
-#: engines/sword2/animation.cpp:419
+#: engines/sword2/animation.cpp:425
msgid ""
"PSX cutscenes found but ScummVM has been built without RGB color support"
msgstr ""
"Atopáronse secuencias de PSX. No entanto, a versión de ScummVM non é "
"compatible con cores RGB"
+#: engines/sword2/animation.cpp:461
+#, fuzzy
+msgid ""
+"MPEG-2 cutscenes found but ScummVM has been built without MPEG-2 support"
+msgstr ""
+"Atopáronse secuencias de DXA. No entanto, esta versión de ScummVM non é "
+"compatible con zlib"
+
#: engines/sword2/sword2.cpp:79
msgid "Show object labels"
msgstr "Mostrar etiquetas"
@@ -2474,13 +3258,13 @@ msgstr "Mostrar etiquetas"
msgid "Show labels for objects on mouse hover"
msgstr "Mostrar as etiquetas dos obxectos ao apuntar co rato"
-#: engines/teenagent/resources.cpp:94
+#: engines/teenagent/resources.cpp:95
msgid ""
"You're missing the 'teenagent.dat' file. Get it from the ScummVM website"
msgstr ""
"Falta o ficheiro teenagent.dat. Descárgao dende o sitio web de ScummVM."
-#: engines/teenagent/resources.cpp:115
+#: engines/teenagent/resources.cpp:116
msgid ""
"The teenagent.dat file is compressed and zlib hasn't been included in this "
"executable. Please decompress it"
@@ -2488,790 +3272,50 @@ msgstr ""
"O ficheiro teenagent.dat está comprimido e zlib non foi incluído neste "
"executable. Descomprime o ficheiro"
-#: engines/parallaction/saveload.cpp:133
-#, c-format
-msgid ""
-"Can't save game in slot %i\n"
-"\n"
-msgstr ""
-"Non se pode gardar a partida no espazo %i\n"
-"\n"
-
-#: engines/parallaction/saveload.cpp:204
-msgid "Loading game..."
-msgstr "Cargando..."
-
-#: engines/parallaction/saveload.cpp:219
-msgid "Saving game..."
-msgstr "Gardando..."
-
-#: engines/parallaction/saveload.cpp:272
-msgid ""
-"ScummVM found that you have old savefiles for Nippon Safes that should be "
-"renamed.\n"
-"The old names are 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 next time.\n"
-msgstr ""
-"ScummVM atopou ficheiros de gardado vellos de Nippon Safes que deberían ser "
-"renomeados.\n"
-"Os nomes vellos xa non son compatibles, de xeito que non poderás cargar as "
-"partidas se non os cambias.\n"
-"\n"
-"Preme Aceptar para cambialos. Se non, volverás ver esta mensaxe a próxima "
-"vez que inicies o xogo.\n"
-
-#: engines/parallaction/saveload.cpp:319
-msgid "ScummVM successfully converted all your savefiles."
-msgstr "ScummVM converteu correctamente todos os ficheiros de gardado."
-
-#: engines/parallaction/saveload.cpp:321
-msgid ""
-"ScummVM printed some warnings in your console window and can't guarantee all "
-"your files have been converted.\n"
-"\n"
-"Please report to the team."
-msgstr ""
-"ScummVM imprimiu avisos na ventá da consola. Non se pode garantir a "
-"conversión de todos os ficheiros.\n"
-"\n"
-"Contacta co equipo de ScummVM."
-
-#: engines/pegasus/pegasus.cpp:679
-msgid "Invalid save file name"
-msgstr "Nome de ficheiro non válido"
-
-#: engines/pegasus/pegasus.cpp:2445
-msgid "Up/Zoom In/Move Forward/Open Doors"
-msgstr "Arriba/Ampliar/Avanzar/Abrir portas"
-
-#: engines/pegasus/pegasus.cpp:2446
-msgid "Down/Zoom Out"
-msgstr "Abaixo/Reducir"
-
-#: engines/pegasus/pegasus.cpp:2449
-msgid "Display/Hide Inventory Tray"
-msgstr "Mostrar/Ocultar bandexa de inventario"
-
-#: engines/pegasus/pegasus.cpp:2450
-msgid "Display/Hide Biochip Tray"
-msgstr "Mostrar/Ocultar bandexa de biochip"
-
-#: engines/pegasus/pegasus.cpp:2451
-msgid "Action/Select"
-msgstr "Acción/Seleccionar"
-
-#: engines/pegasus/pegasus.cpp:2452
-msgid "Toggle Center Data Display"
-msgstr "Activar/Desactivar pantalla de datos"
-
-#: engines/pegasus/pegasus.cpp:2453
-msgid "Display/Hide Info Screen"
-msgstr "Mostrar/Ocultar pantalla de información"
-
-#: engines/pegasus/pegasus.cpp:2454
-msgid "Display/Hide Pause Menu"
-msgstr "Mostrar/Ocultar menú de pausa"
-
-#: engines/pegasus/pegasus.cpp:2455
-msgid "???"
-msgstr "???"
-
-#: audio/fmopl.cpp:49
-msgid "MAME OPL emulator"
-msgstr "Emulador de OPL de MAME"
-
-#: audio/fmopl.cpp:51
-msgid "DOSBox OPL emulator"
-msgstr "Emulador de OPL de DOSBox"
-
-#: audio/mididrv.cpp:209
-#, c-format
-msgid ""
-"The selected audio device '%s' was not found (e.g. might be turned off or "
-"disconnected)."
-msgstr ""
-"Non se atopou o dispositivo de son seleccionado (%s). Talvez estea apagado "
-"ou desconectado."
-
-#: audio/mididrv.cpp:209 audio/mididrv.cpp:221 audio/mididrv.cpp:257
-#: audio/mididrv.cpp:272
-msgid "Attempting to fall back to the next available device..."
-msgstr "Intentando pasar ao seguinte dispositivo dispoñible..."
+#~ msgctxt "lowres"
+#~ msgid "Mass Add..."
+#~ msgstr "Engadir en masa..."
-#: audio/mididrv.cpp:221
-#, c-format
-msgid ""
-"The selected audio device '%s' cannot be used. See log file for more "
-"information."
-msgstr ""
-"Non se pode empregar o dispositivo de son seleccionado (%s). Consulta o "
-"rexistro para obter máis información."
+#~ msgid "Mass Add..."
+#~ msgstr "Engadir en masa..."
-#: audio/mididrv.cpp:257
-#, c-format
-msgid ""
-"The preferred audio device '%s' was not found (e.g. might be turned off or "
-"disconnected)."
-msgstr ""
-"Non se atopou o dispositivo de son preferido (%s). Talvez estea apagado ou "
-"desconectado."
+#~ msgid ""
+#~ "Turns off General MIDI mapping for games with Roland MT-32 soundtrack"
+#~ msgstr "Desactiva o General MIDI para os xogos con música en Roland MT-32"
-#: audio/mididrv.cpp:272
-#, c-format
-msgid ""
-"The preferred audio device '%s' cannot be used. See log file for more "
-"information."
-msgstr ""
-"Non se pode empregar o dispositivo de son preferido (%s). Consulta o "
-"rexistro para obter máis información."
+#~ msgid "Standard (16bpp)"
+#~ msgstr "Estándar (16 bpp)"
-#: audio/null.h:43
-msgid "No music"
-msgstr "Sen música"
+#~ msgid "Alternative intro"
+#~ msgstr "Intro alternativa"
-#: audio/mods/paula.cpp:189
-msgid "Amiga Audio Emulator"
-msgstr "Emulador de Amiga Audio"
-
-#: audio/softsynth/adlib.cpp:2284
-msgid "AdLib Emulator"
-msgstr "Emulador de AdLib"
+#~ msgid "Use an alternative game intro (CD version only)"
+#~ msgstr ""
+#~ "Empregar unha introdución alternativa para o xogo (só versión en CD)"
-#: audio/softsynth/appleiigs.cpp:33
-msgid "Apple II GS Emulator (NOT IMPLEMENTED)"
-msgstr "Emulador de Apple II GS (non implementado)"
-
-#: audio/softsynth/sid.cpp:1430
-msgid "C64 Audio Emulator"
-msgstr "Emulador de C64 Audio"
-
-#: audio/softsynth/mt32.cpp:205
-msgid "Initializing MT-32 Emulator"
-msgstr "Iniciando emulador de MT-32"
+#~ msgid "MPEG2 cutscenes are no longer supported"
+#~ msgstr "Xa non hai compatibilidade coas secuencias en MPEG2"
-#: audio/softsynth/mt32.cpp:431
-msgid "MT-32 Emulator"
-msgstr "Emulador de MT-32"
+#~ msgid "OpenGL Normal"
+#~ msgstr "OpenGL Normal"
-#: audio/softsynth/pcspk.cpp:139
-msgid "PC Speaker Emulator"
-msgstr "Emulador de altofalante de PC"
+#~ msgid "OpenGL Conserve"
+#~ msgstr "OpenGL Conserve"
-#: audio/softsynth/pcspk.cpp:158
-msgid "IBM PCjr Emulator"
-msgstr "Emulador de IBM PCjr"
+#~ msgid "OpenGL Original"
+#~ msgstr "OpenGL Original"
-#: backends/keymapper/remap-dialog.cpp:47
-msgid "Keymap:"
-msgstr "Asignación de teclas:"
+#~ msgid "Current display mode"
+#~ msgstr "Modo de visualización actual"
-#: backends/keymapper/remap-dialog.cpp:66
-msgid " (Effective)"
-msgstr " (Efectiva)"
+#~ msgid "Current scale"
+#~ msgstr "Escala actual"
-#: backends/keymapper/remap-dialog.cpp:106
-msgid " (Active)"
-msgstr " (Activa)"
+#~ msgid "Active filter mode: Linear"
+#~ msgstr "Modo de filtro activo: lineal"
-#: backends/keymapper/remap-dialog.cpp:106
-msgid " (Blocked)"
-msgstr " (Bloqueada)"
-
-#: backends/keymapper/remap-dialog.cpp:119
-msgid " (Global)"
-msgstr " (Global)"
-
-#: backends/keymapper/remap-dialog.cpp:127
-msgid " (Game)"
-msgstr " (Xogo)"
-
-#: backends/midi/windows.cpp:164
-msgid "Windows MIDI"
-msgstr "Windows MIDI"
-
-#: backends/platform/ds/arm9/source/dsoptions.cpp:57
-msgid "ScummVM Main Menu"
-msgstr "Menú principal de ScummVM"
-
-#: backends/platform/ds/arm9/source/dsoptions.cpp:63
-msgid "~L~eft handed mode"
-msgstr "Modo para ~z~urdos"
-
-#: backends/platform/ds/arm9/source/dsoptions.cpp:64
-msgid "~I~ndy fight controls"
-msgstr "Controis de combate de ~I~ndy"
-
-#: backends/platform/ds/arm9/source/dsoptions.cpp:65
-msgid "Show mouse cursor"
-msgstr "Mostrar cursor do rato"
-
-#: backends/platform/ds/arm9/source/dsoptions.cpp:66
-msgid "Snap to edges"
-msgstr "Axustar ás marxes"
-
-#: backends/platform/ds/arm9/source/dsoptions.cpp:68
-msgid "Touch X Offset"
-msgstr "Corrección táctil X"
-
-#: backends/platform/ds/arm9/source/dsoptions.cpp:75
-msgid "Touch Y Offset"
-msgstr "Corrección táctil Y"
-
-#: backends/platform/ds/arm9/source/dsoptions.cpp:87
-msgid "Use laptop trackpad-style cursor control"
-msgstr "Empregar control de cursor por trackpad"
-
-#: backends/platform/ds/arm9/source/dsoptions.cpp:88
-msgid "Tap for left click, double tap right click"
-msgstr "Tocar unha vez, premer co botón primario; dúas veces, botón secundario"
-
-#: backends/platform/ds/arm9/source/dsoptions.cpp:90
-msgid "Sensitivity"
-msgstr "Sensibilidade"
-
-#: backends/platform/ds/arm9/source/dsoptions.cpp:99
-msgid "Initial top screen scale:"
-msgstr "Escala da pantalla inicial:"
-
-#: backends/platform/ds/arm9/source/dsoptions.cpp:105
-msgid "Main screen scaling:"
-msgstr "Escala da pantalla principal:"
-
-#: backends/platform/ds/arm9/source/dsoptions.cpp:107
-msgid "Hardware scale (fast, but low quality)"
-msgstr "Escala por hardware (rápida, mais baixa calidade)"
-
-#: backends/platform/ds/arm9/source/dsoptions.cpp:108
-msgid "Software scale (good quality, but slower)"
-msgstr "Escala por software (boa calidade, mais lenta)"
-
-#: backends/platform/ds/arm9/source/dsoptions.cpp:109
-msgid "Unscaled (you must scroll left and right)"
-msgstr "Sen escala (deberás desprazar á esquerda e á dereita)"
-
-#: backends/platform/ds/arm9/source/dsoptions.cpp:111
-msgid "Brightness:"
-msgstr "Luminosidade:"
-
-#: backends/platform/ds/arm9/source/dsoptions.cpp:121
-msgid "High quality audio (slower) (reboot)"
-msgstr "Son de alta calidade (máis lento) (reiniciar)"
-
-#: backends/platform/ds/arm9/source/dsoptions.cpp:122
-msgid "Disable power off"
-msgstr "Desactivar apagado"
-
-#: backends/platform/iphone/osys_events.cpp:300
-msgid "Mouse-click-and-drag mode enabled."
-msgstr "Modo premer e arrastrar activado."
-
-#: backends/platform/iphone/osys_events.cpp:302
-msgid "Mouse-click-and-drag mode disabled."
-msgstr "Modo premer e arrastrar desactivado."
-
-#: backends/platform/iphone/osys_events.cpp:313
-msgid "Touchpad mode enabled."
-msgstr "Modo panel táctil activado."
-
-#: backends/platform/iphone/osys_events.cpp:315
-msgid "Touchpad mode disabled."
-msgstr "Modo panel táctil desactivado."
-
-#: backends/platform/maemo/maemo.cpp:209
-msgid "Click Mode"
-msgstr "Modo rato"
-
-#: backends/platform/maemo/maemo.cpp:215
-#: 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 "Botón primario"
-
-#: backends/platform/maemo/maemo.cpp:218
-msgid "Middle Click"
-msgstr "Botón central"
-
-#: backends/platform/maemo/maemo.cpp:221
-#: backends/platform/symbian/src/SymbianActions.cpp:43
-#: backends/platform/wince/CEActionsSmartphone.cpp:44
-#: backends/platform/bada/form.cpp:273
-msgid "Right Click"
-msgstr "Botón secundario"
-
-#: backends/platform/sdl/macosx/appmenu_osx.mm:77
-msgid "Hide ScummVM"
-msgstr "Ocultar ScummVM"
-
-#: backends/platform/sdl/macosx/appmenu_osx.mm:82
-msgid "Hide Others"
-msgstr "Ocultar outros"
-
-#: backends/platform/sdl/macosx/appmenu_osx.mm:87
-msgid "Show All"
-msgstr "Mostrar todo"
-
-#: backends/platform/sdl/macosx/appmenu_osx.mm:109
-#: backends/platform/sdl/macosx/appmenu_osx.mm:120
-msgid "Window"
-msgstr "Ventá"
-
-#: backends/platform/sdl/macosx/appmenu_osx.mm:114
-msgid "Minimize"
-msgstr "Minimizar"
-
-#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:45
-msgid "Normal (no scaling)"
-msgstr "Normal (sen escala)"
-
-#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:64
-msgctxt "lowres"
-msgid "Normal (no scaling)"
-msgstr "Normal (sen escala)"
-
-#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2135
-#: backends/graphics/openglsdl/openglsdl-graphics.cpp:537
-msgid "Enabled aspect ratio correction"
-msgstr "Corrección de proporción activada"
-
-#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2141
-#: backends/graphics/openglsdl/openglsdl-graphics.cpp:542
-msgid "Disabled aspect ratio correction"
-msgstr "Corrección de proporción desactivada"
-
-#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2196
-msgid "Active graphics filter:"
-msgstr "Filtro de gráficos activo:"
-
-#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2238
-#: backends/graphics/openglsdl/openglsdl-graphics.cpp:481
-msgid "Windowed mode"
-msgstr "Modo en ventá"
-
-#: backends/graphics/opengl/opengl-graphics.cpp:135
-msgid "OpenGL Normal"
-msgstr "OpenGL Normal"
-
-#: backends/graphics/opengl/opengl-graphics.cpp:136
-msgid "OpenGL Conserve"
-msgstr "OpenGL Conserve"
-
-#: backends/graphics/opengl/opengl-graphics.cpp:137
-msgid "OpenGL Original"
-msgstr "OpenGL Original"
-
-#: backends/graphics/openglsdl/openglsdl-graphics.cpp:415
-msgid "Current display mode"
-msgstr "Modo de visualización actual"
-
-#: backends/graphics/openglsdl/openglsdl-graphics.cpp:428
-msgid "Current scale"
-msgstr "Escala actual"
-
-#: backends/graphics/openglsdl/openglsdl-graphics.cpp:562
-msgid "Active filter mode: Linear"
-msgstr "Modo de filtro activo: lineal"
-
-#: backends/graphics/openglsdl/openglsdl-graphics.cpp:564
-msgid "Active filter mode: Nearest"
-msgstr "Modo de filtro activo: máis próximo"
-
-#: backends/platform/symbian/src/SymbianActions.cpp:38
-#: backends/platform/wince/CEActionsSmartphone.cpp:39
-msgid "Up"
-msgstr "Arriba"
-
-#: backends/platform/symbian/src/SymbianActions.cpp:39
-#: backends/platform/wince/CEActionsSmartphone.cpp:40
-msgid "Down"
-msgstr "Abaixo"
-
-#: backends/platform/symbian/src/SymbianActions.cpp:40
-#: backends/platform/wince/CEActionsSmartphone.cpp:41
-msgid "Left"
-msgstr "Esquerda"
-
-#: backends/platform/symbian/src/SymbianActions.cpp:41
-#: backends/platform/wince/CEActionsSmartphone.cpp:42
-msgid "Right"
-msgstr "Dereita"
-
-#: backends/platform/symbian/src/SymbianActions.cpp:46
-#: backends/platform/wince/CEActionsSmartphone.cpp:47
-msgid "Zone"
-msgstr "Zona"
-
-#: backends/platform/symbian/src/SymbianActions.cpp:47
-#: backends/platform/wince/CEActionsPocket.cpp:54
-#: backends/platform/wince/CEActionsSmartphone.cpp:48
-msgid "Multi Function"
-msgstr "Multifunción"
-
-#: backends/platform/symbian/src/SymbianActions.cpp:48
-msgid "Swap character"
-msgstr "Cambiar carácter"
-
-#: backends/platform/symbian/src/SymbianActions.cpp:49
-msgid "Skip text"
-msgstr "Omitir texto"
-
-#: backends/platform/symbian/src/SymbianActions.cpp:51
-msgid "Fast mode"
-msgstr "Modo rápido"
-
-#: backends/platform/symbian/src/SymbianActions.cpp:53
-msgid "Debugger"
-msgstr "Depurador"
-
-#: backends/platform/symbian/src/SymbianActions.cpp:54
-msgid "Global menu"
-msgstr "Menú global"
-
-#: backends/platform/symbian/src/SymbianActions.cpp:55
-msgid "Virtual keyboard"
-msgstr "Teclado virtual"
-
-#: backends/platform/symbian/src/SymbianActions.cpp:56
-msgid "Key mapper"
-msgstr "Asignador de teclas"
-
-#: backends/events/symbiansdl/symbiansdl-events.cpp:184
-msgid "Do you want to quit ?"
-msgstr "Queres saír?"
-
-#: backends/platform/wii/options.cpp:51
-msgid "Video"
-msgstr "Vídeo"
-
-#: backends/platform/wii/options.cpp:54
-msgid "Current video mode:"
-msgstr "Modo de vídeo actual:"
-
-#: backends/platform/wii/options.cpp:56
-msgid "Double-strike"
-msgstr "Dobre"
-
-#: backends/platform/wii/options.cpp:60
-msgid "Horizontal underscan:"
-msgstr "Marxe horizontal:"
-
-#: backends/platform/wii/options.cpp:66
-msgid "Vertical underscan:"
-msgstr "Marxe vertical:"
-
-#: backends/platform/wii/options.cpp:71
-msgid "Input"
-msgstr "Entrada"
-
-#: backends/platform/wii/options.cpp:74
-msgid "GC Pad sensitivity:"
-msgstr "Sensibilidade do mando de GC:"
-
-#: backends/platform/wii/options.cpp:80
-msgid "GC Pad acceleration:"
-msgstr "Aceleración do mando de GC:"
-
-#: backends/platform/wii/options.cpp:86
-msgid "DVD"
-msgstr "DVD"
-
-#: backends/platform/wii/options.cpp:89 backends/platform/wii/options.cpp:101
-msgid "Status:"
-msgstr "Estado:"
-
-#: backends/platform/wii/options.cpp:90 backends/platform/wii/options.cpp:102
-msgid "Unknown"
-msgstr "Descoñecido"
-
-#: backends/platform/wii/options.cpp:93
-msgid "Mount DVD"
-msgstr "Montar DVD"
-
-#: backends/platform/wii/options.cpp:94
-msgid "Unmount DVD"
-msgstr "Desmontar DVD"
-
-#: backends/platform/wii/options.cpp:98
-msgid "SMB"
-msgstr "SMB"
-
-#: backends/platform/wii/options.cpp:106
-msgid "Server:"
-msgstr "Servidor:"
-
-#: backends/platform/wii/options.cpp:110
-msgid "Share:"
-msgstr "Disco compartido:"
-
-#: backends/platform/wii/options.cpp:114
-msgid "Username:"
-msgstr "Nome de usuario:"
-
-#: backends/platform/wii/options.cpp:118
-msgid "Password:"
-msgstr "Contrasinal:"
-
-#: backends/platform/wii/options.cpp:121
-msgid "Init network"
-msgstr "Conectar á rede"
-
-#: backends/platform/wii/options.cpp:123
-msgid "Mount SMB"
-msgstr "Montar SMB"
-
-#: backends/platform/wii/options.cpp:124
-msgid "Unmount SMB"
-msgstr "Desmontar SMB"
-
-#: backends/platform/wii/options.cpp:143
-msgid "DVD Mounted successfully"
-msgstr "DVD montado con éxito"
-
-#: backends/platform/wii/options.cpp:146
-msgid "Error while mounting the DVD"
-msgstr "Erro ao montar o DVD"
-
-#: backends/platform/wii/options.cpp:148
-msgid "DVD not mounted"
-msgstr "DVD non montado"
-
-#: backends/platform/wii/options.cpp:161
-msgid "Network up, share mounted"
-msgstr "Conexión á rede, disco montado"
-
-#: backends/platform/wii/options.cpp:163
-msgid "Network up"
-msgstr "Conexión á rede"
-
-#: backends/platform/wii/options.cpp:166
-msgid ", error while mounting the share"
-msgstr ", erro ao montar o disco"
-
-#: backends/platform/wii/options.cpp:168
-msgid ", share not mounted"
-msgstr ", disco non montado"
-
-#: backends/platform/wii/options.cpp:174
-msgid "Network down"
-msgstr "Non hai conexión á rede"
-
-#: backends/platform/wii/options.cpp:178
-msgid "Initializing network"
-msgstr "Conectando á rede"
-
-#: backends/platform/wii/options.cpp:182
-msgid "Timeout while initializing network"
-msgstr "Tempo de espera esgotado"
-
-#: backends/platform/wii/options.cpp:186
-#, c-format
-msgid "Network not initialized (%d)"
-msgstr "Erro de conexión á rede (%d)"
-
-#: backends/platform/wince/CEActionsPocket.cpp:46
-msgid "Hide Toolbar"
-msgstr "Ocultar barra de ferramentas"
-
-#: backends/platform/wince/CEActionsPocket.cpp:47
-msgid "Show Keyboard"
-msgstr "Mostrar teclado"
-
-#: backends/platform/wince/CEActionsPocket.cpp:48
-msgid "Sound on/off"
-msgstr "Son si/non"
-
-#: backends/platform/wince/CEActionsPocket.cpp:49
-msgid "Right click"
-msgstr "Botón secundario"
-
-#: backends/platform/wince/CEActionsPocket.cpp:50
-msgid "Show/Hide Cursor"
-msgstr "Mostrar/ocultar cursor"
-
-#: backends/platform/wince/CEActionsPocket.cpp:51
-msgid "Free look"
-msgstr "Vista libre"
-
-#: backends/platform/wince/CEActionsPocket.cpp:52
-msgid "Zoom up"
-msgstr "Ampliar"
-
-#: backends/platform/wince/CEActionsPocket.cpp:53
-msgid "Zoom down"
-msgstr "Reducir"
-
-#: backends/platform/wince/CEActionsPocket.cpp:55
-#: backends/platform/wince/CEActionsSmartphone.cpp:49
-msgid "Bind Keys"
-msgstr "Vincular teclas"
-
-#: backends/platform/wince/CEActionsPocket.cpp:56
-msgid "Cursor Up"
-msgstr "Arriba"
-
-#: backends/platform/wince/CEActionsPocket.cpp:57
-msgid "Cursor Down"
-msgstr "Abaixo"
-
-#: backends/platform/wince/CEActionsPocket.cpp:58
-msgid "Cursor Left"
-msgstr "Esquerda"
-
-#: backends/platform/wince/CEActionsPocket.cpp:59
-msgid "Cursor Right"
-msgstr "Dereita"
-
-#: backends/platform/wince/CEActionsPocket.cpp:267
-#: backends/platform/wince/CEActionsSmartphone.cpp:231
-msgid "Do you want to load or save the game?"
-msgstr "Queres cargar ou gardar a partida?"
-
-#: backends/platform/wince/CEActionsPocket.cpp:326
-#: backends/platform/wince/CEActionsSmartphone.cpp:287
-msgid " Are you sure you want to quit ? "
-msgstr " Seguro que queres saír?"
-
-#: backends/platform/wince/CEActionsSmartphone.cpp:50
-msgid "Keyboard"
-msgstr "Teclado"
-
-#: backends/platform/wince/CEActionsSmartphone.cpp:51
-msgid "Rotate"
-msgstr "Rotar"
-
-#: backends/platform/wince/CELauncherDialog.cpp:56
-msgid "Using SDL driver "
-msgstr "Empregando driver de SDL"
-
-#: backends/platform/wince/CELauncherDialog.cpp:60
-msgid "Display "
-msgstr "Pantalla"
-
-#: backends/platform/wince/CELauncherDialog.cpp:83
-msgid "Do you want to perform an automatic scan ?"
-msgstr "Queres realizar unha análise automática?"
-
-#: backends/platform/wince/wince-sdl.cpp:515
-msgid "Map right click action"
-msgstr "Asignar acción de botón secundario"
-
-#: 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 unha tecla á acción do botón secundario do rato para xogar"
-
-#: backends/platform/wince/wince-sdl.cpp:528
-msgid "Map hide toolbar action"
-msgstr "Asignar acción Ocultar barra de ferramentas"
-
-#: 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 unha tecla á acción Ocultar barra de ferramentas para xogar"
-
-#: backends/platform/wince/wince-sdl.cpp:541
-msgid "Map Zoom Up action (optional)"
-msgstr "Asignar acción de Ampliar (opcional)"
-
-#: backends/platform/wince/wince-sdl.cpp:544
-msgid "Map Zoom Down action (optional)"
-msgstr "Asignar acción de Reducir (opcional)"
-
-#: 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 ""
-"Non esquezas asignar unha tecla á acción Ocultar barra de ferramentas para "
-"ver o inventario completo"
-
-#: backends/events/default/default-events.cpp:193
-msgid "Do you really want to return to the Launcher?"
-msgstr "Seguro que queres volver ao Iniciador?"
-
-#: backends/events/default/default-events.cpp:193
-msgid "Launcher"
-msgstr "Iniciador"
-
-#: backends/events/default/default-events.cpp:215
-msgid "Do you really want to quit?"
-msgstr "Seguro que queres saír?"
-
-#: backends/events/gph/gph-events.cpp:386
-#: backends/events/gph/gph-events.cpp:429
-#: backends/events/openpandora/op-events.cpp:168
-msgid "Touchscreen 'Tap Mode' - Left Click"
-msgstr "Modo pantalla táctil: premer botón primario"
-
-#: backends/events/gph/gph-events.cpp:388
-#: backends/events/gph/gph-events.cpp:431
-#: backends/events/openpandora/op-events.cpp:170
-msgid "Touchscreen 'Tap Mode' - Right Click"
-msgstr "Modo pantalla táctil: premer botón secundario"
-
-#: backends/events/gph/gph-events.cpp:390
-#: backends/events/gph/gph-events.cpp:433
-#: backends/events/openpandora/op-events.cpp:172
-msgid "Touchscreen 'Tap Mode' - Hover (No Click)"
-msgstr "Modo pantalla táctil: apuntar co rato (sen premer)"
-
-#: backends/events/gph/gph-events.cpp:410
-msgid "Maximum Volume"
-msgstr "Volume máximo"
-
-#: backends/events/gph/gph-events.cpp:412
-msgid "Increasing Volume"
-msgstr "Subindo volume"
-
-#: backends/events/gph/gph-events.cpp:418
-msgid "Minimal Volume"
-msgstr "Volume mínimo"
-
-#: backends/events/gph/gph-events.cpp:420
-msgid "Decreasing Volume"
-msgstr "Baixando volume"
-
-#: backends/events/openpandora/op-events.cpp:174
-msgid "Touchscreen 'Tap Mode' - Hover (DPad Clicks)"
-msgstr "Modo pantalla táctil: apuntar co rato (premer na cruceta)"
-
-#: backends/updates/macosx/macosx-updates.mm:67
-msgid "Check for Updates..."
-msgstr "Buscar actualizacións..."
-
-#: backends/platform/bada/form.cpp:269
-msgid "Right Click Once"
-msgstr "Botón secundario unha vez"
-
-#: backends/platform/bada/form.cpp:277
-msgid "Move Only"
-msgstr "Mover unicamente"
-
-#: backends/platform/bada/form.cpp:291
-msgid "Escape Key"
-msgstr "ESC"
-
-#: backends/platform/bada/form.cpp:296
-msgid "Game Menu"
-msgstr "Menú do xogo"
-
-#: backends/platform/bada/form.cpp:301
-msgid "Show Keypad"
-msgstr "Mostrar teclado numérico"
-
-#: backends/platform/bada/form.cpp:309
-msgid "Control Mouse"
-msgstr "Rato"
-
-#: backends/events/maemosdl/maemosdl-events.cpp:192
-msgid "Clicking Enabled"
-msgstr "Premer activado"
-
-#: backends/events/maemosdl/maemosdl-events.cpp:192
-msgid "Clicking Disabled"
-msgstr "Premer desactivado"
+#~ msgid "Active filter mode: Nearest"
+#~ msgstr "Modo de filtro activo: máis próximo"
#~ msgid "Enable Roland GS Mode"
#~ msgstr "Activar modo Roland GS"
diff --git a/po/hu_HU.po b/po/hu_HU.po
index 89bfa80d56..74f1a39ed5 100644
--- a/po/hu_HU.po
+++ b/po/hu_HU.po
@@ -1,5 +1,5 @@
# Hungarian translation for ScummVM.
-# Copyright (C) 2010-2013 ScummVM Team
+# Copyright (C) 2010-2014 ScummVM Team
# This file is distributed under the same license as the ScummVM package.
# George Kormendi <grubycza@hotmail.com>, 2010.
#
@@ -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: 2013-04-24 13:35+0100\n"
-"PO-Revision-Date: 2013-04-25 06:38+0100\n"
+"POT-Creation-Date: 2014-06-07 23:06+0100\n"
+"PO-Revision-Date: 2014-02-18 06:30+0100\n"
"Last-Translator: George Kormendi <grubycza@hotmail.com>\n"
"Language-Team: Hungarian\n"
"Language: Magyar\n"
@@ -17,79 +17,79 @@ msgstr ""
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
"X-Poedit-SourceCharset: iso-8859-1\n"
-"X-Generator: Poedit 1.5.5\n"
+"X-Generator: Poedit 1.6.4\n"
-#: gui/about.cpp:93
+#: gui/about.cpp:94
#, c-format
msgid "(built on %s)"
msgstr "(készült %s)"
-#: gui/about.cpp:100
+#: gui/about.cpp:101
msgid "Features compiled in:"
msgstr "Lefordított összetevõk:"
-#: gui/about.cpp:109
+#: gui/about.cpp:110
msgid "Available engines:"
msgstr "Támogatott játékmotorok:"
-#: gui/browser.cpp:67
+#: gui/browser.cpp:68
msgid "Show hidden files"
msgstr "Rejtett fájlok látszanak"
-#: gui/browser.cpp:67
+#: gui/browser.cpp:68
msgid "Show files marked with the hidden attribute"
msgstr "Rejtett attribútumu fájlok megjelenítése"
-#: gui/browser.cpp:71
+#: gui/browser.cpp:72
msgid "Go up"
msgstr "Feljebb"
-#: gui/browser.cpp:71 gui/browser.cpp:73
+#: gui/browser.cpp:72 gui/browser.cpp:74
msgid "Go to previous directory level"
msgstr "Vissza az elõzõ könyvtárszintre"
-#: gui/browser.cpp:73
+#: gui/browser.cpp:74
msgctxt "lowres"
msgid "Go up"
msgstr "Feljebb"
-#: gui/browser.cpp:74 gui/chooser.cpp:45 gui/KeysDialog.cpp:43
-#: gui/launcher.cpp:345 gui/massadd.cpp:94 gui/options.cpp:1238
-#: gui/saveload-dialog.cpp:215 gui/saveload-dialog.cpp:275
-#: gui/saveload-dialog.cpp:545 gui/saveload-dialog.cpp:919
-#: gui/themebrowser.cpp:54 gui/fluidsynth-dialog.cpp:151
-#: engines/engine.cpp:447 engines/drascula/saveload.cpp:51
-#: engines/scumm/dialogs.cpp:190 engines/sword1/control.cpp:865
-#: engines/parallaction/saveload.cpp:274 backends/platform/wii/options.cpp:48
-#: backends/events/default/default-events.cpp:193
-#: backends/events/default/default-events.cpp:215
+#: gui/browser.cpp:75 gui/chooser.cpp:46 gui/KeysDialog.cpp:43
+#: gui/launcher.cpp:351 gui/massadd.cpp:95 gui/options.cpp:1239
+#: gui/saveload-dialog.cpp:216 gui/saveload-dialog.cpp:276
+#: gui/saveload-dialog.cpp:547 gui/saveload-dialog.cpp:922
+#: gui/themebrowser.cpp:55 gui/fluidsynth-dialog.cpp:152
+#: engines/engine.cpp:452 backends/platform/wii/options.cpp:48
+#: backends/events/default/default-events.cpp:196
+#: backends/events/default/default-events.cpp:218
+#: engines/drascula/saveload.cpp:49 engines/parallaction/saveload.cpp:274
+#: engines/scumm/dialogs.cpp:191 engines/sword1/control.cpp:865
msgid "Cancel"
msgstr "Mégse"
-#: gui/browser.cpp:75 gui/chooser.cpp:46 gui/themebrowser.cpp:55
+#: gui/browser.cpp:76 gui/chooser.cpp:47 gui/themebrowser.cpp:56
msgid "Choose"
msgstr "Választ"
-#: gui/gui-manager.cpp:115 engines/scumm/help.cpp:125
-#: engines/scumm/help.cpp:140 engines/scumm/help.cpp:165
-#: engines/scumm/help.cpp:191 engines/scumm/help.cpp:209
-#: backends/keymapper/remap-dialog.cpp:52
+#: gui/gui-manager.cpp:117 backends/keymapper/remap-dialog.cpp:53
+#: engines/scumm/help.cpp:125 engines/scumm/help.cpp:140
+#: engines/scumm/help.cpp:165 engines/scumm/help.cpp:191
+#: engines/scumm/help.cpp:209
msgid "Close"
msgstr "Bezár"
-#: gui/gui-manager.cpp:118
+#: gui/gui-manager.cpp:120
msgid "Mouse click"
msgstr "Egérkattintás"
-#: gui/gui-manager.cpp:122 base/main.cpp:301
+#: gui/gui-manager.cpp:124 base/main.cpp:319
msgid "Display keyboard"
msgstr "Billentyûzet beállítások"
-#: gui/gui-manager.cpp:126 base/main.cpp:305
+#: gui/gui-manager.cpp:128 base/main.cpp:323
msgid "Remap keys"
msgstr "Billentyûk átállítása"
-#: gui/gui-manager.cpp:129 base/main.cpp:308
+#: gui/gui-manager.cpp:131 base/main.cpp:326
msgid "Toggle FullScreen"
msgstr "Teljesképernyõ kapcsoló"
@@ -101,21 +101,21 @@ msgstr "Válassz mûveletet a kiosztáshoz"
msgid "Map"
msgstr "Kiosztás"
-#: gui/KeysDialog.cpp:42 gui/launcher.cpp:346 gui/launcher.cpp:1001
-#: gui/launcher.cpp:1005 gui/massadd.cpp:91 gui/options.cpp:1239
-#: gui/saveload-dialog.cpp:920 gui/fluidsynth-dialog.cpp:152
-#: engines/engine.cpp:366 engines/engine.cpp:377
-#: engines/drascula/saveload.cpp:51 engines/scumm/dialogs.cpp:192
-#: engines/scumm/scumm.cpp:1778 engines/agos/animation.cpp:558
-#: engines/groovie/script.cpp:420 engines/sky/compact.cpp:131
-#: engines/sky/compact.cpp:141 engines/sword1/animation.cpp:519
-#: engines/sword1/animation.cpp:540 engines/sword1/animation.cpp:550
-#: engines/sword1/animation.cpp:557 engines/sword1/control.cpp:865
-#: engines/sword1/logic.cpp:1633 engines/sword2/animation.cpp:419
-#: engines/sword2/animation.cpp:439 engines/sword2/animation.cpp:449
-#: engines/sword2/animation.cpp:458 engines/parallaction/saveload.cpp:274
+#: gui/KeysDialog.cpp:42 gui/launcher.cpp:352 gui/launcher.cpp:1048
+#: gui/launcher.cpp:1052 gui/massadd.cpp:92 gui/options.cpp:1240
+#: gui/saveload-dialog.cpp:923 gui/fluidsynth-dialog.cpp:153
+#: engines/engine.cpp:371 engines/engine.cpp:382
#: backends/platform/wii/options.cpp:47
#: backends/platform/wince/CELauncherDialog.cpp:54
+#: engines/agos/animation.cpp:558 engines/drascula/saveload.cpp:49
+#: engines/groovie/script.cpp:399 engines/parallaction/saveload.cpp:274
+#: engines/scumm/dialogs.cpp:193 engines/scumm/scumm.cpp:1779
+#: engines/sky/compact.cpp:131 engines/sky/compact.cpp:141
+#: engines/sword1/animation.cpp:524 engines/sword1/animation.cpp:545
+#: engines/sword1/animation.cpp:561 engines/sword1/animation.cpp:569
+#: engines/sword1/control.cpp:865 engines/sword1/logic.cpp:1633
+#: engines/sword2/animation.cpp:425 engines/sword2/animation.cpp:445
+#: engines/sword2/animation.cpp:461 engines/sword2/animation.cpp:471
msgid "OK"
msgstr "OK"
@@ -141,330 +141,331 @@ msgstr "Válassz egy mûveletet"
msgid "Press the key to associate"
msgstr "Nyomj egy billentyût a társításhoz"
-#: gui/launcher.cpp:187
+#: gui/launcher.cpp:193
msgid "Game"
msgstr "Játék"
-#: gui/launcher.cpp:191
+#: gui/launcher.cpp:197
msgid "ID:"
msgstr "ID:"
-#: gui/launcher.cpp:191 gui/launcher.cpp:193 gui/launcher.cpp:194
+#: gui/launcher.cpp:197 gui/launcher.cpp:199 gui/launcher.cpp:200
msgid ""
"Short game identifier used for referring to savegames and running the game "
"from the command line"
msgstr ""
"Rövid játékazonosító a játékmentésekhez és a játék parancssori futtatásához"
-#: gui/launcher.cpp:193
+#: gui/launcher.cpp:199
msgctxt "lowres"
msgid "ID:"
msgstr "ID:"
-#: gui/launcher.cpp:198
+#: gui/launcher.cpp:204
msgid "Name:"
msgstr "Név:"
-#: gui/launcher.cpp:198 gui/launcher.cpp:200 gui/launcher.cpp:201
+#: gui/launcher.cpp:204 gui/launcher.cpp:206 gui/launcher.cpp:207
msgid "Full title of the game"
msgstr "A játék teljes neve"
-#: gui/launcher.cpp:200
+#: gui/launcher.cpp:206
msgctxt "lowres"
msgid "Name:"
msgstr "Név:"
-#: gui/launcher.cpp:204
+#: gui/launcher.cpp:210
msgid "Language:"
msgstr "Nyelv:"
-#: gui/launcher.cpp:204 gui/launcher.cpp:205
+#: gui/launcher.cpp:210 gui/launcher.cpp:211
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 Angol nyelvre"
-#: gui/launcher.cpp:206 gui/launcher.cpp:220 gui/options.cpp:86
-#: gui/options.cpp:736 gui/options.cpp:749 gui/options.cpp:1209
-#: audio/null.cpp:40
+#: gui/launcher.cpp:212 gui/launcher.cpp:226 gui/options.cpp:87
+#: gui/options.cpp:737 gui/options.cpp:750 gui/options.cpp:1210
+#: audio/null.cpp:41
msgid "<default>"
msgstr "<alapértelmezett>"
-#: gui/launcher.cpp:216
+#: gui/launcher.cpp:222
msgid "Platform:"
msgstr "Platform:"
-#: gui/launcher.cpp:216 gui/launcher.cpp:218 gui/launcher.cpp:219
+#: gui/launcher.cpp:222 gui/launcher.cpp:224 gui/launcher.cpp:225
msgid "Platform the game was originally designed for"
msgstr "Platform amire a játékot eredetileg készítették"
-#: gui/launcher.cpp:218
+#: gui/launcher.cpp:224
msgctxt "lowres"
msgid "Platform:"
msgstr "Platform:"
-#: gui/launcher.cpp:231
+#: gui/launcher.cpp:237
msgid "Engine"
msgstr "Motor"
-#: gui/launcher.cpp:239 gui/options.cpp:1072 gui/options.cpp:1089
+#: gui/launcher.cpp:245 gui/options.cpp:1073 gui/options.cpp:1090
msgid "Graphics"
msgstr "Grafika"
-#: gui/launcher.cpp:239 gui/options.cpp:1072 gui/options.cpp:1089
+#: gui/launcher.cpp:245 gui/options.cpp:1073 gui/options.cpp:1090
msgid "GFX"
msgstr "GFX"
-#: gui/launcher.cpp:242
+#: gui/launcher.cpp:248
msgid "Override global graphic settings"
msgstr "Globális grafikai beállítások felülbírálása"
-#: gui/launcher.cpp:244
+#: gui/launcher.cpp:250
msgctxt "lowres"
msgid "Override global graphic settings"
msgstr "Globális grafikai beállítások felülbírálása"
-#: gui/launcher.cpp:251 gui/options.cpp:1095
+#: gui/launcher.cpp:257 gui/options.cpp:1096
msgid "Audio"
msgstr "Audió"
-#: gui/launcher.cpp:254
+#: gui/launcher.cpp:260
msgid "Override global audio settings"
msgstr "Globális audió beállítások felülbírálása"
-#: gui/launcher.cpp:256
+#: gui/launcher.cpp:262
msgctxt "lowres"
msgid "Override global audio settings"
msgstr "Globális audió beállítások felülbírálása"
-#: gui/launcher.cpp:265 gui/options.cpp:1100
+#: gui/launcher.cpp:271 gui/options.cpp:1101
msgid "Volume"
msgstr "Hangerõ"
-#: gui/launcher.cpp:267 gui/options.cpp:1102
+#: gui/launcher.cpp:273 gui/options.cpp:1103
msgctxt "lowres"
msgid "Volume"
msgstr "Hangerõ"
-#: gui/launcher.cpp:270
+#: gui/launcher.cpp:276
msgid "Override global volume settings"
msgstr "Globális hangerõbeállítások felülbírálása"
-#: gui/launcher.cpp:272
+#: gui/launcher.cpp:278
msgctxt "lowres"
msgid "Override global volume settings"
msgstr "Globális hangerõbeállítások felülbírálása"
-#: gui/launcher.cpp:280 gui/options.cpp:1110
+#: gui/launcher.cpp:286 gui/options.cpp:1111
msgid "MIDI"
msgstr "MIDI"
-#: gui/launcher.cpp:283
+#: gui/launcher.cpp:289
msgid "Override global MIDI settings"
msgstr "Globális MIDI beállítások felülbírálása"
-#: gui/launcher.cpp:285
+#: gui/launcher.cpp:291
msgctxt "lowres"
msgid "Override global MIDI settings"
msgstr "Globális MIDI beállítások felülbírálása"
-#: gui/launcher.cpp:294 gui/options.cpp:1116
+#: gui/launcher.cpp:300 gui/options.cpp:1117
msgid "MT-32"
msgstr "MT-32"
-#: gui/launcher.cpp:297
+#: gui/launcher.cpp:303
msgid "Override global MT-32 settings"
msgstr "Globális MT-32 beállítások felülbírálása"
-#: gui/launcher.cpp:299
+#: gui/launcher.cpp:305
msgctxt "lowres"
msgid "Override global MT-32 settings"
msgstr "Globális MT-32 beállítások felülbírálása"
-#: gui/launcher.cpp:308 gui/options.cpp:1123
+#: gui/launcher.cpp:314 gui/options.cpp:1124
msgid "Paths"
msgstr "Mappák"
-#: gui/launcher.cpp:310 gui/options.cpp:1125
+#: gui/launcher.cpp:316 gui/options.cpp:1126
msgctxt "lowres"
msgid "Paths"
msgstr "Mappák"
-#: gui/launcher.cpp:317
+#: gui/launcher.cpp:323
msgid "Game Path:"
msgstr "Játék Mappa:"
-#: gui/launcher.cpp:319
+#: gui/launcher.cpp:325
msgctxt "lowres"
msgid "Game Path:"
msgstr "Játék Mappa:"
-#: gui/launcher.cpp:324 gui/options.cpp:1149
+#: gui/launcher.cpp:330 gui/options.cpp:1150
msgid "Extra Path:"
msgstr "Extra Mappa:"
-#: gui/launcher.cpp:324 gui/launcher.cpp:326 gui/launcher.cpp:327
+#: gui/launcher.cpp:330 gui/launcher.cpp:332 gui/launcher.cpp:333
msgid "Specifies path to additional data used the game"
msgstr "Mappa kiválasztás a játékok kiegészítõ fájljaihoz"
-#: gui/launcher.cpp:326 gui/options.cpp:1151
+#: gui/launcher.cpp:332 gui/options.cpp:1152
msgctxt "lowres"
msgid "Extra Path:"
msgstr "Extra Mappa:"
-#: gui/launcher.cpp:333 gui/options.cpp:1133
+#: gui/launcher.cpp:339 gui/options.cpp:1134
msgid "Save Path:"
msgstr "Mentés Mappa:"
-#: gui/launcher.cpp:333 gui/launcher.cpp:335 gui/launcher.cpp:336
-#: gui/options.cpp:1133 gui/options.cpp:1135 gui/options.cpp:1136
+#: gui/launcher.cpp:339 gui/launcher.cpp:341 gui/launcher.cpp:342
+#: gui/options.cpp:1134 gui/options.cpp:1136 gui/options.cpp:1137
msgid "Specifies where your savegames are put"
msgstr "Játékmentések helyének meghatározása"
-#: gui/launcher.cpp:335 gui/options.cpp:1135
+#: gui/launcher.cpp:341 gui/options.cpp:1136
msgctxt "lowres"
msgid "Save Path:"
msgstr "Mentés Mappa:"
-#: gui/launcher.cpp:354 gui/launcher.cpp:453 gui/launcher.cpp:511
-#: gui/launcher.cpp:565 gui/options.cpp:1144 gui/options.cpp:1152
-#: gui/options.cpp:1161 gui/options.cpp:1276 gui/options.cpp:1282
-#: gui/options.cpp:1290 gui/options.cpp:1320 gui/options.cpp:1326
-#: gui/options.cpp:1333 gui/options.cpp:1426 gui/options.cpp:1429
-#: gui/options.cpp:1441
+#: gui/launcher.cpp:360 gui/launcher.cpp:459 gui/launcher.cpp:517
+#: gui/launcher.cpp:571 gui/options.cpp:1145 gui/options.cpp:1153
+#: gui/options.cpp:1162 gui/options.cpp:1277 gui/options.cpp:1283
+#: gui/options.cpp:1291 gui/options.cpp:1321 gui/options.cpp:1327
+#: gui/options.cpp:1334 gui/options.cpp:1427 gui/options.cpp:1430
+#: gui/options.cpp:1442
msgctxt "path"
msgid "None"
msgstr "Nincs"
-#: gui/launcher.cpp:359 gui/launcher.cpp:459 gui/launcher.cpp:569
-#: gui/options.cpp:1270 gui/options.cpp:1314 gui/options.cpp:1432
+#: gui/launcher.cpp:365 gui/launcher.cpp:465 gui/launcher.cpp:575
+#: gui/options.cpp:1271 gui/options.cpp:1315 gui/options.cpp:1433
#: backends/platform/wii/options.cpp:56
msgid "Default"
msgstr "Alapértelmezett"
-#: gui/launcher.cpp:504 gui/options.cpp:1435
+#: gui/launcher.cpp:510 gui/options.cpp:1436
msgid "Select SoundFont"
msgstr "SoundFont kiválasztás"
-#: gui/launcher.cpp:523 gui/launcher.cpp:677
+#: gui/launcher.cpp:529 gui/launcher.cpp:682
msgid "Select directory with game data"
msgstr "Játékok helyének kiválasztása"
-#: gui/launcher.cpp:541
+#: gui/launcher.cpp:547
msgid "Select additional game directory"
msgstr "Válassz mappát a játék kiegészítõkhöz"
-#: gui/launcher.cpp:553
+#: gui/launcher.cpp:559
msgid "Select directory for saved games"
msgstr "Válaszz játékmentéseknek mappát"
-#: gui/launcher.cpp:580
+#: gui/launcher.cpp:586
msgid "This game ID is already taken. Please choose another one."
msgstr "Ez a játékazonosító ID már foglalt, Válassz egy másikat."
-#: gui/launcher.cpp:621 engines/dialogs.cpp:110
+#: gui/launcher.cpp:626 engines/dialogs.cpp:111
msgid "~Q~uit"
msgstr "Kilépés"
-#: gui/launcher.cpp:621 backends/platform/sdl/macosx/appmenu_osx.mm:95
+#: gui/launcher.cpp:626 backends/platform/sdl/macosx/appmenu_osx.mm:95
msgid "Quit ScummVM"
msgstr "ScummVM bezárása"
-#: gui/launcher.cpp:622
+#: gui/launcher.cpp:627
msgid "A~b~out..."
msgstr "Névjegy"
-#: gui/launcher.cpp:622 backends/platform/sdl/macosx/appmenu_osx.mm:69
+#: gui/launcher.cpp:627 backends/platform/sdl/macosx/appmenu_osx.mm:69
msgid "About ScummVM"
msgstr "ScummVM névjegy"
-#: gui/launcher.cpp:623
+#: gui/launcher.cpp:628
msgid "~O~ptions..."
msgstr "~O~pciók..."
-#: gui/launcher.cpp:623
+#: gui/launcher.cpp:628
msgid "Change global ScummVM options"
msgstr "Globális ScummVM opciók cseréje"
-#: gui/launcher.cpp:625
+#: gui/launcher.cpp:630
msgid "~S~tart"
msgstr "Indítás"
-#: gui/launcher.cpp:625
+#: gui/launcher.cpp:630
msgid "Start selected game"
msgstr "A választott játék indítása"
-#: gui/launcher.cpp:628
+#: gui/launcher.cpp:633
msgid "~L~oad..."
msgstr "Betöltés"
-#: gui/launcher.cpp:628
+#: gui/launcher.cpp:633
msgid "Load savegame for selected game"
msgstr "Kimentett játékállás betöltése"
-#: gui/launcher.cpp:633 gui/launcher.cpp:1120
+#: gui/launcher.cpp:638
msgid "~A~dd Game..."
msgstr "Játék hozzáadás"
-#: gui/launcher.cpp:633 gui/launcher.cpp:640
+#: gui/launcher.cpp:638 gui/launcher.cpp:645
msgid "Hold Shift for Mass Add"
msgstr "Tratsd lenyomva a Shift-et a Masszív módhoz"
-#: gui/launcher.cpp:635
+#: gui/launcher.cpp:640
msgid "~E~dit Game..."
msgstr "Játékopciók"
-#: gui/launcher.cpp:635 gui/launcher.cpp:642
+#: gui/launcher.cpp:640 gui/launcher.cpp:647
msgid "Change game options"
msgstr "Játék beállítások megváltoztatása"
-#: gui/launcher.cpp:637
+#: gui/launcher.cpp:642
msgid "~R~emove Game"
msgstr "Játék törlése"
-#: gui/launcher.cpp:637 gui/launcher.cpp:644
+#: gui/launcher.cpp:642 gui/launcher.cpp:649
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:640 gui/launcher.cpp:1120
+#: gui/launcher.cpp:645
msgctxt "lowres"
msgid "~A~dd Game..."
msgstr "Játék hozzáadás"
-#: gui/launcher.cpp:642
+#: gui/launcher.cpp:647
msgctxt "lowres"
msgid "~E~dit Game..."
msgstr "Játékopciók"
-#: gui/launcher.cpp:644
+#: gui/launcher.cpp:649
msgctxt "lowres"
msgid "~R~emove Game"
msgstr "Játék törlése"
-#: gui/launcher.cpp:652
+#: gui/launcher.cpp:657
msgid "Search in game list"
msgstr "Keresés a játéklistában"
-#: gui/launcher.cpp:656 gui/launcher.cpp:1167
+#: gui/launcher.cpp:661 gui/launcher.cpp:1222
msgid "Search:"
msgstr "Keresés:"
-#: gui/launcher.cpp:680 engines/dialogs.cpp:114 engines/mohawk/myst.cpp:245
-#: engines/mohawk/riven.cpp:716 engines/cruise/menu.cpp:214
-#: engines/pegasus/pegasus.cpp:349
+#: gui/launcher.cpp:685 engines/dialogs.cpp:115 engines/cruise/menu.cpp:214
+#: engines/mohawk/myst.cpp:245 engines/mohawk/riven.cpp:718
+#: engines/pegasus/pegasus.cpp:353
msgid "Load game:"
msgstr "Játék betöltése:"
-#: gui/launcher.cpp:680 engines/dialogs.cpp:114 engines/scumm/dialogs.cpp:188
-#: engines/mohawk/myst.cpp:245 engines/mohawk/riven.cpp:716
-#: engines/cruise/menu.cpp:214 engines/pegasus/pegasus.cpp:349
+#: gui/launcher.cpp:685 engines/dialogs.cpp:115
#: backends/platform/wince/CEActionsPocket.cpp:267
#: backends/platform/wince/CEActionsSmartphone.cpp:231
+#: engines/cruise/menu.cpp:214 engines/mohawk/myst.cpp:245
+#: engines/mohawk/riven.cpp:718 engines/pegasus/pegasus.cpp:353
+#: engines/scumm/dialogs.cpp:189
msgid "Load"
msgstr "Betöltés"
-#: gui/launcher.cpp:788
+#: gui/launcher.cpp:792
msgid ""
"Do you really want to run the mass game detector? This could potentially add "
"a huge number of games."
@@ -472,7 +473,8 @@ msgstr ""
"Biztos hogy futtatod a Masszív játékdetektort? Ez potenciálisan sok játékot "
"hozzáad a listához."
-#: gui/launcher.cpp:789 gui/launcher.cpp:937 gui/fluidsynth-dialog.cpp:216
+#: gui/launcher.cpp:793 gui/launcher.cpp:941 gui/launcher.cpp:1000
+#: gui/fluidsynth-dialog.cpp:217
#: backends/events/symbiansdl/symbiansdl-events.cpp:184
#: backends/platform/wince/CEActionsPocket.cpp:326
#: backends/platform/wince/CEActionsSmartphone.cpp:287
@@ -480,7 +482,8 @@ msgstr ""
msgid "Yes"
msgstr "Igen"
-#: gui/launcher.cpp:789 gui/launcher.cpp:937 gui/fluidsynth-dialog.cpp:216
+#: gui/launcher.cpp:793 gui/launcher.cpp:941 gui/launcher.cpp:1000
+#: gui/fluidsynth-dialog.cpp:217
#: backends/events/symbiansdl/symbiansdl-events.cpp:184
#: backends/platform/wince/CEActionsPocket.cpp:326
#: backends/platform/wince/CEActionsSmartphone.cpp:287
@@ -488,255 +491,249 @@ msgstr "Igen"
msgid "No"
msgstr "Nem"
-#: gui/launcher.cpp:837
+#: gui/launcher.cpp:841
msgid "ScummVM couldn't open the specified directory!"
msgstr "ScummVM nem tudja megnyitni a választott mappát!"
-#: gui/launcher.cpp:849
+#: gui/launcher.cpp:853
msgid "ScummVM could not find any game in the specified directory!"
msgstr "A ScummVM nem talált egy játékot sem a választott mappában!"
-#: gui/launcher.cpp:863
+#: gui/launcher.cpp:867
msgid "Pick the game:"
msgstr "Válassztott játék:"
-#: gui/launcher.cpp:937
+#: gui/launcher.cpp:941
msgid "Do you really want to remove this game configuration?"
msgstr "Biztosan törölni akarod ezt a játékkonfigurációt?"
-#: gui/launcher.cpp:1001
+#: gui/launcher.cpp:999
+msgid "Do you want to load savegame?"
+msgstr "Akarod hogy betöltésem a játékállást?"
+
+#: gui/launcher.cpp:1048
msgid "This game does not support loading games from the launcher."
msgstr "Ez a játék nem támogatja a játékállás betöltést az indítóból."
-#: gui/launcher.cpp:1005
+#: gui/launcher.cpp:1052
msgid "ScummVM could not find any engine capable of running the selected game!"
msgstr ""
"ScummVM nem talált olyan játékmotort ami a választott játékot támogatja!"
-#: gui/launcher.cpp:1119
-msgctxt "lowres"
-msgid "Mass Add..."
-msgstr "Masszív mód..."
-
-#: gui/launcher.cpp:1119
-msgid "Mass Add..."
-msgstr "Masszív mód..."
-
-#: gui/massadd.cpp:78 gui/massadd.cpp:81
+#: gui/massadd.cpp:79 gui/massadd.cpp:82
msgid "... progress ..."
msgstr "... folyamatban ..."
-#: gui/massadd.cpp:258
+#: gui/massadd.cpp:259
msgid "Scan complete!"
msgstr "Vizsgálat kész!"
-#: gui/massadd.cpp:261
+#: gui/massadd.cpp:262
#, 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:265
+#: gui/massadd.cpp:266
#, c-format
msgid "Scanned %d directories ..."
msgstr "%d Mappa átvizsgálva..."
-#: gui/massadd.cpp:268
+#: gui/massadd.cpp:269
#, 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/options.cpp:84
+#: gui/options.cpp:85
msgid "Never"
msgstr "Soha"
-#: gui/options.cpp:84
+#: gui/options.cpp:85
msgid "every 5 mins"
msgstr "5 percenként"
-#: gui/options.cpp:84
+#: gui/options.cpp:85
msgid "every 10 mins"
msgstr "10 percenként"
-#: gui/options.cpp:84
+#: gui/options.cpp:85
msgid "every 15 mins"
msgstr "15 percenként"
-#: gui/options.cpp:84
+#: gui/options.cpp:85
msgid "every 30 mins"
msgstr "30 percenként"
-#: gui/options.cpp:86
+#: gui/options.cpp:87
msgid "8 kHz"
msgstr "8 kHz"
-#: gui/options.cpp:86
+#: gui/options.cpp:87
msgid "11kHz"
msgstr "11kHz"
-#: gui/options.cpp:86
+#: gui/options.cpp:87
msgid "22 kHz"
msgstr "22 kHz"
-#: gui/options.cpp:86
+#: gui/options.cpp:87
msgid "44 kHz"
msgstr "44 kHz"
-#: gui/options.cpp:86
+#: gui/options.cpp:87
msgid "48 kHz"
msgstr "48 kHz"
-#: gui/options.cpp:254 gui/options.cpp:480 gui/options.cpp:581
-#: gui/options.cpp:650 gui/options.cpp:858
+#: gui/options.cpp:255 gui/options.cpp:481 gui/options.cpp:582
+#: gui/options.cpp:651 gui/options.cpp:859
msgctxt "soundfont"
msgid "None"
msgstr "Nincs"
-#: gui/options.cpp:388
+#: gui/options.cpp:389
msgid "Failed to apply some of the graphic options changes:"
msgstr "Néhány grafikus opció változtatása sikertelen:"
-#: gui/options.cpp:400
+#: gui/options.cpp:401
msgid "the video mode could not be changed."
msgstr "a videómód nem változott."
-#: gui/options.cpp:406
+#: gui/options.cpp:407
msgid "the fullscreen setting could not be changed"
msgstr "a teljesképernyõs beállítás nem változott"
-#: gui/options.cpp:412
+#: gui/options.cpp:413
msgid "the aspect ratio setting could not be changed"
msgstr "a képméretarány beállítások nem változtak"
-#: gui/options.cpp:733
+#: gui/options.cpp:734
msgid "Graphics mode:"
msgstr "Grafikus mód:"
-#: gui/options.cpp:747
+#: gui/options.cpp:748
msgid "Render mode:"
msgstr "Kirajzolás mód:"
-#: gui/options.cpp:747 gui/options.cpp:748
+#: gui/options.cpp:748 gui/options.cpp:749
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:759
-#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2236
-#: backends/graphics/openglsdl/openglsdl-graphics.cpp:476
+#: gui/options.cpp:760
+#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2249
msgid "Fullscreen mode"
msgstr "Teljesképernyõs mód:"
-#: gui/options.cpp:762
+#: gui/options.cpp:763
msgid "Aspect ratio correction"
msgstr "Képméretarány korrekció"
-#: gui/options.cpp:762
+#: gui/options.cpp:763
msgid "Correct aspect ratio for 320x200 games"
msgstr "Helyes oldalarány a 320x200 játékokhoz"
-#: gui/options.cpp:770
+#: gui/options.cpp:771
msgid "Preferred Device:"
msgstr "Elsõdleges eszköz:"
-#: gui/options.cpp:770
+#: gui/options.cpp:771
msgid "Music Device:"
msgstr "Zene eszköz:"
-#: gui/options.cpp:770 gui/options.cpp:772
+#: gui/options.cpp:771 gui/options.cpp:773
msgid "Specifies preferred sound device or sound card emulator"
msgstr "Elsõdleges hangeszköz vagy hang emulátor beállítások"
-#: gui/options.cpp:770 gui/options.cpp:772 gui/options.cpp:773
+#: gui/options.cpp:771 gui/options.cpp:773 gui/options.cpp:774
msgid "Specifies output sound device or sound card emulator"
msgstr "Hangeszköz vagy hangkártya emulátor beállítások"
-#: gui/options.cpp:772
+#: gui/options.cpp:773
msgctxt "lowres"
msgid "Preferred Dev.:"
msgstr "Elsõdleges eszk.:"
-#: gui/options.cpp:772
+#: gui/options.cpp:773
msgctxt "lowres"
msgid "Music Device:"
msgstr "Zene eszköz:"
-#: gui/options.cpp:799
+#: gui/options.cpp:800
msgid "AdLib emulator:"
msgstr "AdLib emulátor:"
-#: gui/options.cpp:799 gui/options.cpp:800
+#: gui/options.cpp:800 gui/options.cpp:801
msgid "AdLib is used for music in many games"
msgstr "AdLib meghajtót sok játék használja zenéhez"
-#: gui/options.cpp:810
+#: gui/options.cpp:811
msgid "Output rate:"
msgstr "Kimeneti ráta:"
-#: gui/options.cpp:810 gui/options.cpp:811
+#: gui/options.cpp:811 gui/options.cpp:812
msgid ""
"Higher value specifies better sound quality but may be not supported by your "
"soundcard"
msgstr ""
"Nagyobb értékek jobb hangminõséget adnak, de nem minden hangkártya támogatja"
-#: gui/options.cpp:821
+#: gui/options.cpp:822
msgid "GM Device:"
msgstr "GM Eszköz:"
-#: gui/options.cpp:821
+#: gui/options.cpp:822
msgid "Specifies default sound device for General MIDI output"
msgstr "Alapértelmezett hangeszköz General MIDI kimenethez"
-#: gui/options.cpp:832
+#: gui/options.cpp:833
msgid "Don't use General MIDI music"
msgstr "Ne használj General MIDI zenét"
-#: gui/options.cpp:843 gui/options.cpp:909
+#: gui/options.cpp:844 gui/options.cpp:910
msgid "Use first available device"
msgstr "Elsõ elérhetõ eszköz használata"
-#: gui/options.cpp:855
+#: gui/options.cpp:856
msgid "SoundFont:"
msgstr "SoundFont:"
-#: gui/options.cpp:855 gui/options.cpp:857 gui/options.cpp:858
+#: gui/options.cpp:856 gui/options.cpp:858 gui/options.cpp:859
msgid "SoundFont is supported by some audio cards, Fluidsynth and Timidity"
msgstr ""
"Néhány hangkárya, Fluidsynth és Timidyti támogatja a SoundFont betöltését"
-#: gui/options.cpp:857
+#: gui/options.cpp:858
msgctxt "lowres"
msgid "SoundFont:"
msgstr "SoundFont:"
-#: gui/options.cpp:863
+#: gui/options.cpp:864
msgid "Mixed AdLib/MIDI mode"
msgstr "Vegyes AdLib/MIDI mód"
-#: gui/options.cpp:863
+#: gui/options.cpp:864
msgid "Use both MIDI and AdLib sound generation"
msgstr "MIDI és AdLib hanggenerátorok használata"
-#: gui/options.cpp:866
+#: gui/options.cpp:867
msgid "MIDI gain:"
msgstr "MIDI erõsítés:"
-#: gui/options.cpp:873
+#: gui/options.cpp:874
msgid "FluidSynth Settings"
msgstr "FluidSynth Beállítása"
-#: gui/options.cpp:880
+#: gui/options.cpp:881
msgid "MT-32 Device:"
msgstr "MT-32 Eszköz:"
-#: gui/options.cpp:880
+#: gui/options.cpp:881
msgid "Specifies default sound device for Roland MT-32/LAPC1/CM32l/CM64 output"
msgstr "Roland MT-32/LAPC1/CM32l/CM64 alapértelmezett hangeszközök beállítása"
-#: gui/options.cpp:885
+#: gui/options.cpp:886
msgid "True Roland MT-32 (disable GM emulation)"
msgstr "Roland MT-32 Hardver (GM emuláció tiltva)"
-#: gui/options.cpp:885 gui/options.cpp:887
+#: gui/options.cpp:886 gui/options.cpp:888
msgid ""
"Check if you want to use your real hardware Roland-compatible sound device "
"connected to your computer"
@@ -744,190 +741,194 @@ msgstr ""
"Jelöld be, ha hardveres Roland-Kompatibilis hangeszköz van csatlakoztatva a "
"gépedhez és használni akarod"
-#: gui/options.cpp:887
+#: gui/options.cpp:888
msgctxt "lowres"
msgid "True Roland MT-32 (no GM emulation)"
msgstr "Roland MT-32 Hardver (GM emuláció nincs)"
-#: gui/options.cpp:890
-msgid "Roland GS Mode (disable GM mapping)"
-msgstr "Roland GS Mód (GM mapping tiltása)"
+#: gui/options.cpp:891
+msgid "Roland GS Device (enable MT-32 mappings)"
+msgstr "Roland GS eszköz (MT-32 mapping engedélyezés)"
-#: gui/options.cpp:890
-msgid "Turns off General MIDI mapping for games with Roland MT-32 soundtrack"
-msgstr "General MIDI leképezés Roland MT-32 zenés játékokhoz kikapcsolva"
+#: gui/options.cpp:891
+msgid ""
+"Check if you want to enable patch mappings to emulate an MT-32 on a Roland "
+"GS device"
+msgstr ""
+"Ellenõrzés ha engedélyezni akarod az emulált MT-32 Folt leképezést a Roland "
+"GS eszközön"
-#: gui/options.cpp:899
+#: gui/options.cpp:900
msgid "Don't use Roland MT-32 music"
msgstr "Ne használj Roland MT-32 zenét"
-#: gui/options.cpp:926
+#: gui/options.cpp:927
msgid "Text and Speech:"
msgstr "Szöveg és beszéd:"
-#: gui/options.cpp:930 gui/options.cpp:940
+#: gui/options.cpp:931 gui/options.cpp:941
msgid "Speech"
msgstr "Csak beszéd"
-#: gui/options.cpp:931 gui/options.cpp:941
+#: gui/options.cpp:932 gui/options.cpp:942
msgid "Subtitles"
msgstr "Csak felirat"
-#: gui/options.cpp:932
+#: gui/options.cpp:933
msgid "Both"
msgstr "Mind"
-#: gui/options.cpp:934
+#: gui/options.cpp:935
msgid "Subtitle speed:"
msgstr "Felirat sebesség:"
-#: gui/options.cpp:936
+#: gui/options.cpp:937
msgctxt "lowres"
msgid "Text and Speech:"
msgstr "Felirat és beszéd:"
-#: gui/options.cpp:940
+#: gui/options.cpp:941
msgid "Spch"
msgstr "Besz"
-#: gui/options.cpp:941
+#: gui/options.cpp:942
msgid "Subs"
msgstr "Text"
-#: gui/options.cpp:942
+#: gui/options.cpp:943
msgctxt "lowres"
msgid "Both"
msgstr "Mind"
-#: gui/options.cpp:942
+#: gui/options.cpp:943
msgid "Show subtitles and play speech"
msgstr "Hang és feliratok megjelenítése"
-#: gui/options.cpp:944
+#: gui/options.cpp:945
msgctxt "lowres"
msgid "Subtitle speed:"
msgstr "Felirat sebesség:"
-#: gui/options.cpp:960
+#: gui/options.cpp:961
msgid "Music volume:"
msgstr "Zene hangerõ:"
-#: gui/options.cpp:962
+#: gui/options.cpp:963
msgctxt "lowres"
msgid "Music volume:"
msgstr "Zene hangerõ:"
-#: gui/options.cpp:969
+#: gui/options.cpp:970
msgid "Mute All"
msgstr "Összes némítása"
-#: gui/options.cpp:972
+#: gui/options.cpp:973
msgid "SFX volume:"
msgstr "SFX hangerõ:"
-#: gui/options.cpp:972 gui/options.cpp:974 gui/options.cpp:975
+#: gui/options.cpp:973 gui/options.cpp:975 gui/options.cpp:976
msgid "Special sound effects volume"
msgstr "Speciális hangeffektusok hangereje"
-#: gui/options.cpp:974
+#: gui/options.cpp:975
msgctxt "lowres"
msgid "SFX volume:"
msgstr "SFX hangerõ:"
-#: gui/options.cpp:982
+#: gui/options.cpp:983
msgid "Speech volume:"
msgstr "Beszéd hangerõ:"
-#: gui/options.cpp:984
+#: gui/options.cpp:985
msgctxt "lowres"
msgid "Speech volume:"
msgstr "Beszéd hangerõ:"
-#: gui/options.cpp:1141
+#: gui/options.cpp:1142
msgid "Theme Path:"
msgstr "Téma Mappa:"
-#: gui/options.cpp:1143
+#: gui/options.cpp:1144
msgctxt "lowres"
msgid "Theme Path:"
msgstr "Téma Mappa:"
-#: gui/options.cpp:1149 gui/options.cpp:1151 gui/options.cpp:1152
+#: gui/options.cpp:1150 gui/options.cpp:1152 gui/options.cpp:1153
msgid "Specifies path to additional data used by all games or ScummVM"
msgstr "Minden jéték és ScummVM kiegészítõ fájljainak mappája:"
-#: gui/options.cpp:1158
+#: gui/options.cpp:1159
msgid "Plugins Path:"
msgstr "Plugin Mappa:"
-#: gui/options.cpp:1160
+#: gui/options.cpp:1161
msgctxt "lowres"
msgid "Plugins Path:"
msgstr "Plugin Mappa:"
-#: gui/options.cpp:1169 gui/fluidsynth-dialog.cpp:137
+#: gui/options.cpp:1170 gui/fluidsynth-dialog.cpp:138
msgid "Misc"
msgstr "Vegyes"
-#: gui/options.cpp:1171
+#: gui/options.cpp:1172
msgctxt "lowres"
msgid "Misc"
msgstr "Vegyes"
-#: gui/options.cpp:1173
+#: gui/options.cpp:1174
msgid "Theme:"
msgstr "Téma:"
-#: gui/options.cpp:1177
+#: gui/options.cpp:1178
msgid "GUI Renderer:"
msgstr "GUI Renderelõ:"
-#: gui/options.cpp:1189
+#: gui/options.cpp:1190
msgid "Autosave:"
msgstr "Automentés:"
-#: gui/options.cpp:1191
+#: gui/options.cpp:1192
msgctxt "lowres"
msgid "Autosave:"
msgstr "Automentés:"
-#: gui/options.cpp:1199
+#: gui/options.cpp:1200
msgid "Keys"
msgstr "Billentyûk"
-#: gui/options.cpp:1206
+#: gui/options.cpp:1207
msgid "GUI Language:"
msgstr "GUI nyelve:"
-#: gui/options.cpp:1206
+#: gui/options.cpp:1207
msgid "Language of ScummVM GUI"
msgstr "A ScummVM GUI nyelve"
-#: gui/options.cpp:1365
+#: gui/options.cpp:1366
msgid "You have to restart ScummVM before your changes will take effect."
msgstr "Indítsd újra a ScummVM-et a változások érvényesítéséhez."
-#: gui/options.cpp:1378
+#: gui/options.cpp:1379
msgid "Select directory for savegames"
msgstr "Válassz játékmentés mappát"
-#: gui/options.cpp:1385
+#: gui/options.cpp:1386
msgid "The chosen directory cannot be written to. Please select another one."
msgstr "A kiválasztott mappába nem lehet írni, válassz egy másikat"
-#: gui/options.cpp:1394
+#: gui/options.cpp:1395
msgid "Select directory for GUI themes"
msgstr "GUI téma mappa kiválasztása"
-#: gui/options.cpp:1404
+#: gui/options.cpp:1405
msgid "Select directory for extra files"
msgstr "Mappa választás az extra fájloknak"
-#: gui/options.cpp:1415
+#: gui/options.cpp:1416
msgid "Select directory for plugins"
msgstr "Plugin mappa kiválasztása"
-#: gui/options.cpp:1468
+#: gui/options.cpp:1469
msgid ""
"The theme you selected does not support your current language. If you want "
"to use this theme you need to switch to another language first."
@@ -935,223 +936,223 @@ msgstr ""
"A kiválasztott téma nem támogatja a nyelvedet. Ha használni akarod ezt a "
"témát, elõszõr válts át egy másik nyelvre."
-#: gui/saveload-dialog.cpp:166
+#: gui/saveload-dialog.cpp:167
msgid "List view"
msgstr "Lista nézet"
-#: gui/saveload-dialog.cpp:167
+#: gui/saveload-dialog.cpp:168
msgid "Grid view"
msgstr "Rács nézet"
-#: gui/saveload-dialog.cpp:210 gui/saveload-dialog.cpp:358
+#: gui/saveload-dialog.cpp:211 gui/saveload-dialog.cpp:360
msgid "No date saved"
msgstr "Dátum nincs mentve"
-#: gui/saveload-dialog.cpp:211 gui/saveload-dialog.cpp:359
+#: gui/saveload-dialog.cpp:212 gui/saveload-dialog.cpp:361
msgid "No time saved"
msgstr "Idõ nincs mentve"
-#: gui/saveload-dialog.cpp:212 gui/saveload-dialog.cpp:360
+#: gui/saveload-dialog.cpp:213 gui/saveload-dialog.cpp:362
msgid "No playtime saved"
msgstr "Játékidõ nincs mentve"
-#: gui/saveload-dialog.cpp:219 gui/saveload-dialog.cpp:275
+#: gui/saveload-dialog.cpp:220 gui/saveload-dialog.cpp:276
msgid "Delete"
msgstr "Töröl"
-#: gui/saveload-dialog.cpp:274
+#: gui/saveload-dialog.cpp:275
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-dialog.cpp:383 gui/saveload-dialog.cpp:872
+#: gui/saveload-dialog.cpp:385 gui/saveload-dialog.cpp:875
msgid "Date: "
msgstr "Dátum:"
-#: gui/saveload-dialog.cpp:387 gui/saveload-dialog.cpp:878
+#: gui/saveload-dialog.cpp:389 gui/saveload-dialog.cpp:881
msgid "Time: "
msgstr "Idõ:"
-#: gui/saveload-dialog.cpp:393 gui/saveload-dialog.cpp:886
+#: gui/saveload-dialog.cpp:395 gui/saveload-dialog.cpp:889
msgid "Playtime: "
msgstr "Játékidõ:"
-#: gui/saveload-dialog.cpp:406 gui/saveload-dialog.cpp:494
+#: gui/saveload-dialog.cpp:408 gui/saveload-dialog.cpp:496
msgid "Untitled savestate"
msgstr "Névtelen játékállás"
-#: gui/saveload-dialog.cpp:546
+#: gui/saveload-dialog.cpp:548
msgid "Next"
msgstr "Következõ"
-#: gui/saveload-dialog.cpp:549
+#: gui/saveload-dialog.cpp:551
msgid "Prev"
msgstr "Elõzõ"
-#: gui/saveload-dialog.cpp:736
+#: gui/saveload-dialog.cpp:739
msgid "New Save"
msgstr "Új Mentés"
-#: gui/saveload-dialog.cpp:736
+#: gui/saveload-dialog.cpp:739
msgid "Create a new save game"
msgstr "Új játékmentés készítése"
-#: gui/saveload-dialog.cpp:865
+#: gui/saveload-dialog.cpp:868
msgid "Name: "
msgstr "Név:"
-#: gui/saveload-dialog.cpp:937
+#: gui/saveload-dialog.cpp:940
#, c-format
msgid "Enter a description for slot %d:"
msgstr "Adj meg egy leírást a %d slothoz:"
-#: gui/themebrowser.cpp:44
+#: gui/themebrowser.cpp:45
msgid "Select a Theme"
msgstr "Válassz témát"
-#: gui/ThemeEngine.cpp:337
+#: gui/ThemeEngine.cpp:347
msgid "Disabled GFX"
msgstr "GFX letiltva"
-#: gui/ThemeEngine.cpp:337
+#: gui/ThemeEngine.cpp:347
msgctxt "lowres"
msgid "Disabled GFX"
msgstr "GFX letiltva"
-#: gui/ThemeEngine.cpp:338
-msgid "Standard Renderer (16bpp)"
-msgstr "Standard leképezõ (16bpp)"
+#: gui/ThemeEngine.cpp:348
+msgid "Standard Renderer"
+msgstr "Standard leképezõ"
-#: gui/ThemeEngine.cpp:338
-msgid "Standard (16bpp)"
-msgstr "Standard (16bpp)"
+#: gui/ThemeEngine.cpp:348 engines/scumm/dialogs.cpp:659
+msgid "Standard"
+msgstr "Átlagos"
-#: gui/ThemeEngine.cpp:340
-msgid "Antialiased Renderer (16bpp)"
-msgstr "Élsimításos leképezõ (16bpp)"
+#: gui/ThemeEngine.cpp:350
+msgid "Antialiased Renderer"
+msgstr "Élsimításos leképezõ"
-#: gui/ThemeEngine.cpp:340
-msgid "Antialiased (16bpp)"
-msgstr "Élsimított (16bpp)"
+#: gui/ThemeEngine.cpp:350
+msgid "Antialiased"
+msgstr "Élsimított"
-#: gui/widget.cpp:322 gui/widget.cpp:324 gui/widget.cpp:330 gui/widget.cpp:332
+#: gui/widget.cpp:323 gui/widget.cpp:325 gui/widget.cpp:331 gui/widget.cpp:333
msgid "Clear value"
msgstr "Érték törlése"
-#: gui/fluidsynth-dialog.cpp:67
+#: gui/fluidsynth-dialog.cpp:68
msgid "Reverb"
msgstr "Forgatás"
-#: gui/fluidsynth-dialog.cpp:69 gui/fluidsynth-dialog.cpp:101
+#: gui/fluidsynth-dialog.cpp:70 gui/fluidsynth-dialog.cpp:102
msgid "Active"
msgstr "Aktív"
-#: gui/fluidsynth-dialog.cpp:71
+#: gui/fluidsynth-dialog.cpp:72
msgid "Room:"
msgstr "Szoba:"
-#: gui/fluidsynth-dialog.cpp:78
+#: gui/fluidsynth-dialog.cpp:79
msgid "Damp:"
msgstr "Csillapítás:"
-#: gui/fluidsynth-dialog.cpp:85
+#: gui/fluidsynth-dialog.cpp:86
msgid "Width:"
msgstr "Szélesség:"
-#: gui/fluidsynth-dialog.cpp:92 gui/fluidsynth-dialog.cpp:110
+#: gui/fluidsynth-dialog.cpp:93 gui/fluidsynth-dialog.cpp:111
msgid "Level:"
msgstr "Szint:"
-#: gui/fluidsynth-dialog.cpp:99
+#: gui/fluidsynth-dialog.cpp:100
msgid "Chorus"
msgstr "Kórus"
-#: gui/fluidsynth-dialog.cpp:103
+#: gui/fluidsynth-dialog.cpp:104
msgid "N:"
msgstr "N:"
-#: gui/fluidsynth-dialog.cpp:117
+#: gui/fluidsynth-dialog.cpp:118
msgid "Speed:"
msgstr "Sebesség:"
-#: gui/fluidsynth-dialog.cpp:124
+#: gui/fluidsynth-dialog.cpp:125
msgid "Depth:"
msgstr "Mélység:"
-#: gui/fluidsynth-dialog.cpp:131
+#: gui/fluidsynth-dialog.cpp:132
msgid "Type:"
msgstr "Típus:"
-#: gui/fluidsynth-dialog.cpp:134
+#: gui/fluidsynth-dialog.cpp:135
msgid "Sine"
msgstr "Színusz"
-#: gui/fluidsynth-dialog.cpp:135
+#: gui/fluidsynth-dialog.cpp:136
msgid "Triangle"
msgstr "Háromszög"
-#: gui/fluidsynth-dialog.cpp:139
+#: gui/fluidsynth-dialog.cpp:140
msgid "Interpolation:"
msgstr "Interpoláció:"
-#: gui/fluidsynth-dialog.cpp:142
+#: gui/fluidsynth-dialog.cpp:143
msgid "None (fastest)"
msgstr "Nincs (gyorsabb)"
-#: gui/fluidsynth-dialog.cpp:143
+#: gui/fluidsynth-dialog.cpp:144
msgid "Linear"
msgstr "Lineáris"
-#: gui/fluidsynth-dialog.cpp:144
+#: gui/fluidsynth-dialog.cpp:145
msgid "Fourth-order"
msgstr "Negyedrangú"
-#: gui/fluidsynth-dialog.cpp:145
+#: gui/fluidsynth-dialog.cpp:146
msgid "Seventh-order"
msgstr "Hetedrangú"
-#: gui/fluidsynth-dialog.cpp:149
+#: gui/fluidsynth-dialog.cpp:150
msgid "Reset"
msgstr "Reset"
-#: gui/fluidsynth-dialog.cpp:149
+#: gui/fluidsynth-dialog.cpp:150
msgid "Reset all FluidSynth settings to their default values."
msgstr "Minden FluidSynth beállítás alapértelmezett értékre."
-#: gui/fluidsynth-dialog.cpp:216
+#: gui/fluidsynth-dialog.cpp:217
msgid ""
"Do you really want to reset all FluidSynth settings to their default values?"
msgstr ""
"Biztos visszaállítassz minden FluidSynth beállítást alapértelmezett értékre?"
-#: base/main.cpp:210
+#: base/main.cpp:228
#, c-format
msgid "Engine does not support debug level '%s'"
msgstr "A motor nem támogatja a '%s' debug szintet"
-#: base/main.cpp:288
+#: base/main.cpp:306
msgid "Menu"
msgstr "Menü"
-#: base/main.cpp:291 backends/platform/symbian/src/SymbianActions.cpp:45
+#: base/main.cpp:309 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:294 backends/platform/symbian/src/SymbianActions.cpp:50
+#: base/main.cpp:312 backends/platform/symbian/src/SymbianActions.cpp:50
#: backends/platform/wince/CEActionsPocket.cpp:42
msgid "Pause"
msgstr "Szünet"
-#: base/main.cpp:297
+#: base/main.cpp:315
msgid "Skip line"
msgstr "Sor átlépése"
-#: base/main.cpp:468
+#: base/main.cpp:507
msgid "Error running game:"
msgstr "Hiba a játék futtatásakor:"
-#: base/main.cpp:492
+#: base/main.cpp:536
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"
@@ -1219,72 +1220,72 @@ msgstr "Felhasználói megszakítás"
msgid "Unknown error"
msgstr "Ismeretlen hiba"
-#: engines/advancedDetector.cpp:316
+#: engines/advancedDetector.cpp:317
#, c-format
msgid "The game in '%s' seems to be unknown."
msgstr "A '%s' játék ismeretlennek tûnik."
-#: engines/advancedDetector.cpp:317
+#: engines/advancedDetector.cpp:318
msgid "Please, report the following data to the ScummVM team along with name"
msgstr "Kérlek jelezd a ScummVM csapatnak a következõ adatokat, együtt a játék"
-#: engines/advancedDetector.cpp:319
+#: engines/advancedDetector.cpp:320
msgid "of the game you tried to add and its version/language/etc.:"
msgstr "címével és megbízható adataival játékverzió/nyelv(ek)/stb.:"
-#: engines/dialogs.cpp:84
+#: engines/dialogs.cpp:85
msgid "~R~esume"
msgstr "Folytatás"
-#: engines/dialogs.cpp:86
+#: engines/dialogs.cpp:87
msgid "~L~oad"
msgstr "Betöltés"
-#: engines/dialogs.cpp:90
+#: engines/dialogs.cpp:91
msgid "~S~ave"
msgstr "Mentés"
-#: engines/dialogs.cpp:94
+#: engines/dialogs.cpp:95
msgid "~O~ptions"
msgstr "~O~pciók"
-#: engines/dialogs.cpp:99
+#: engines/dialogs.cpp:100
msgid "~H~elp"
msgstr "Súgó"
-#: engines/dialogs.cpp:101
+#: engines/dialogs.cpp:102
msgid "~A~bout"
msgstr "Névjegy"
-#: engines/dialogs.cpp:104 engines/dialogs.cpp:180
+#: engines/dialogs.cpp:105 engines/dialogs.cpp:181
msgid "~R~eturn to Launcher"
msgstr "Visszatérés az indítóba"
-#: engines/dialogs.cpp:106 engines/dialogs.cpp:182
+#: engines/dialogs.cpp:107 engines/dialogs.cpp:183
msgctxt "lowres"
msgid "~R~eturn to Launcher"
msgstr "Visszatérés az indítóba"
-#: engines/dialogs.cpp:115 engines/agi/saveload.cpp:803
-#: engines/drascula/saveload.cpp:338 engines/cruise/menu.cpp:212
-#: engines/sci/engine/kfile.cpp:742 engines/toltecs/menu.cpp:284
-#: engines/pegasus/pegasus.cpp:373
+#: engines/dialogs.cpp:116 engines/agi/saveload.cpp:803
+#: engines/cruise/menu.cpp:212 engines/drascula/saveload.cpp:336
+#: engines/neverhood/menumodule.cpp:873 engines/pegasus/pegasus.cpp:377
+#: engines/sci/engine/kfile.cpp:758 engines/toltecs/menu.cpp:281
msgid "Save game:"
msgstr "Játék mentése:"
-#: engines/dialogs.cpp:115 engines/agi/saveload.cpp:803
-#: engines/drascula/saveload.cpp:338 engines/scumm/dialogs.cpp:187
-#: engines/cruise/menu.cpp:212 engines/sci/engine/kfile.cpp:742
-#: engines/toltecs/menu.cpp:284 engines/pegasus/pegasus.cpp:373
-#: backends/platform/symbian/src/SymbianActions.cpp:44
+#: engines/dialogs.cpp:116 backends/platform/symbian/src/SymbianActions.cpp:44
#: backends/platform/wince/CEActionsPocket.cpp:43
#: backends/platform/wince/CEActionsPocket.cpp:267
#: backends/platform/wince/CEActionsSmartphone.cpp:45
#: backends/platform/wince/CEActionsSmartphone.cpp:231
+#: engines/agi/saveload.cpp:803 engines/cruise/menu.cpp:212
+#: engines/drascula/saveload.cpp:336 engines/neverhood/menumodule.cpp:873
+#: engines/pegasus/pegasus.cpp:377 engines/sci/engine/kfile.cpp:758
+#: engines/scumm/dialogs.cpp:188 engines/toltecs/menu.cpp:281
msgid "Save"
msgstr "Mentés"
-#: engines/dialogs.cpp:144
+#: engines/dialogs.cpp:145
msgid ""
"Sorry, this engine does not currently provide in-game help. Please consult "
"the README for basic information, and for instructions on how to obtain "
@@ -1293,7 +1294,7 @@ 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:228
+#: engines/dialogs.cpp:234 engines/pegasus/pegasus.cpp:393
#, c-format
msgid ""
"Gamestate save failed (%s)! Please consult the README for basic information, "
@@ -1302,37 +1303,37 @@ msgstr ""
"(%s) játékmentés nem sikerült!. Olvassd el a README-t az alap "
"információkról, és hogy hogyan segíthetsz a késõbbiekben."
-#: engines/dialogs.cpp:301 engines/mohawk/dialogs.cpp:109
+#: engines/dialogs.cpp:307 engines/mohawk/dialogs.cpp:109
#: engines/mohawk/dialogs.cpp:170
msgid "~O~K"
msgstr "~O~K"
-#: engines/dialogs.cpp:302 engines/mohawk/dialogs.cpp:110
+#: engines/dialogs.cpp:308 engines/mohawk/dialogs.cpp:110
#: engines/mohawk/dialogs.cpp:171
msgid "~C~ancel"
msgstr "Mégse"
-#: engines/dialogs.cpp:305
+#: engines/dialogs.cpp:311
msgid "~K~eys"
msgstr "Billentyük"
-#: engines/engine.cpp:240
+#: engines/engine.cpp:245
msgid "Could not initialize color format."
msgstr "Szín formátum nincs alkalmazva"
-#: engines/engine.cpp:248
+#: engines/engine.cpp:253
msgid "Could not switch to video mode: '"
msgstr "Videómód nincs átállítva: ' "
-#: engines/engine.cpp:257
+#: engines/engine.cpp:262
msgid "Could not apply aspect ratio setting."
msgstr "Méretarány korrekció nem változott."
-#: engines/engine.cpp:262
+#: engines/engine.cpp:267
msgid "Could not apply fullscreen setting."
msgstr "Teljesképernyõs beállítás nincs alkalmazva"
-#: engines/engine.cpp:362
+#: engines/engine.cpp:367
msgid ""
"You appear to be playing this game directly\n"
"from the CD. This is known to cause problems,\n"
@@ -1346,7 +1347,7 @@ msgstr ""
"adatfájljait a merevlemezedre.\n"
"Nézd meg a README fájlt a részletekért."
-#: engines/engine.cpp:373
+#: engines/engine.cpp:378
msgid ""
"This game has audio tracks in its disk. These\n"
"tracks need to be ripped from the disk using\n"
@@ -1360,7 +1361,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:431
+#: engines/engine.cpp:436
#, c-format
msgid ""
"Gamestate load failed (%s)! Please consult the README for basic information, "
@@ -1369,7 +1370,7 @@ msgstr ""
"(%s) játékállás betöltése nem sikerült!. Olvassd el a README-t az alap "
"információkról, és hogy hogyan segíthetsz a késõbbiekben."
-#: engines/engine.cpp:444
+#: engines/engine.cpp:449
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 "
@@ -1379,33 +1380,755 @@ 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:447
+#: engines/engine.cpp:452
msgid "Start anyway"
msgstr "Indítás így is"
-#: engines/agi/detection.cpp:142 engines/drascula/detection.cpp:270
-#: engines/dreamweb/detection.cpp:47 engines/sci/detection.cpp:393
-#: engines/toltecs/detection.cpp:173
+#: audio/fmopl.cpp:50
+msgid "MAME OPL emulator"
+msgstr "MAME OPL emulátor"
+
+#: audio/fmopl.cpp:52
+msgid "DOSBox OPL emulator"
+msgstr "DOSBox OPL emulátor"
+
+#: audio/mididrv.cpp:209
+#, c-format
+msgid ""
+"The selected audio device '%s' was not found (e.g. might be turned off or "
+"disconnected)."
+msgstr ""
+"A kiválasztott '%s' hangeszköz nem található (Lekapcsoltad, vagy kihúztad)."
+
+#: audio/mididrv.cpp:209 audio/mididrv.cpp:221 audio/mididrv.cpp:257
+#: audio/mididrv.cpp:272
+msgid "Attempting to fall back to the next available device..."
+msgstr "A következõ elérhetõ eszköz keresése..."
+
+#: audio/mididrv.cpp:221
+#, c-format
+msgid ""
+"The selected audio device '%s' cannot be used. See log file for more "
+"information."
+msgstr ""
+"A kiválasztott '%s' hangeszköz nem használható. Bõvebb információ a "
+"naplófájlban."
+
+#: audio/mididrv.cpp:257
+#, c-format
+msgid ""
+"The preferred audio device '%s' was not found (e.g. might be turned off or "
+"disconnected)."
+msgstr ""
+"Az elsõdleges '%s' hangeszköz nem található (Lekapcsoltad, vagy kihúztad)."
+
+#: audio/mididrv.cpp:272
+#, c-format
+msgid ""
+"The preferred audio device '%s' cannot be used. See log file for more "
+"information."
+msgstr ""
+"Az elsõdleges '%s' hangeszköz nem használható. Bõvebb információ a "
+"naplófájlban."
+
+#: audio/null.h:44
+msgid "No music"
+msgstr "Nincs zene"
+
+#: audio/mods/paula.cpp:196
+msgid "Amiga Audio Emulator"
+msgstr "Amiga Audió Emulátor"
+
+#: audio/softsynth/adlib.cpp:2285
+msgid "AdLib Emulator"
+msgstr "AdLib Emulátor"
+
+#: audio/softsynth/appleiigs.cpp:33
+msgid "Apple II GS Emulator (NOT IMPLEMENTED)"
+msgstr "Apple II GS Emulátor (NEM TÁMOGATOTT)"
+
+#: audio/softsynth/sid.cpp:1430
+msgid "C64 Audio Emulator"
+msgstr "C64 Audio Emulátor"
+
+#: audio/softsynth/mt32.cpp:200
+msgid "Initializing MT-32 Emulator"
+msgstr "MT-32 Emulátor inicializálása"
+
+#: audio/softsynth/mt32.cpp:426
+msgid "MT-32 Emulator"
+msgstr "MT-32 Emulátor"
+
+#: audio/softsynth/pcspk.cpp:139
+msgid "PC Speaker Emulator"
+msgstr "PC Speaker Emulátor"
+
+#: audio/softsynth/pcspk.cpp:158
+msgid "IBM PCjr Emulator"
+msgstr "IBM PCjr Emulátor"
+
+#: backends/keymapper/remap-dialog.cpp:48
+msgid "Keymap:"
+msgstr "Billentyûzet kiosztás:"
+
+#: backends/keymapper/remap-dialog.cpp:67
+msgid " (Effective)"
+msgstr " (Tényleges)"
+
+#: backends/keymapper/remap-dialog.cpp:107
+msgid " (Active)"
+msgstr " (Aktív)"
+
+#: backends/keymapper/remap-dialog.cpp:107
+msgid " (Blocked)"
+msgstr " (Blokkolt)"
+
+#: backends/keymapper/remap-dialog.cpp:120
+msgid " (Global)"
+msgstr " (Globális)"
+
+#: backends/keymapper/remap-dialog.cpp:128
+msgid " (Game)"
+msgstr " (Játék)"
+
+#: backends/midi/windows.cpp:165
+msgid "Windows MIDI"
+msgstr "Windows MIDI"
+
+#: backends/platform/ds/arm9/source/dsoptions.cpp:56
+#: engines/scumm/dialogs.cpp:291
+msgid "~C~lose"
+msgstr "Bezár"
+
+#: backends/platform/ds/arm9/source/dsoptions.cpp:57
+msgid "ScummVM Main Menu"
+msgstr "ScummVM Fõmenü"
+
+#: backends/platform/ds/arm9/source/dsoptions.cpp:63
+msgid "~L~eft handed mode"
+msgstr "Balkezes mód:"
+
+#: backends/platform/ds/arm9/source/dsoptions.cpp:64
+msgid "~I~ndy fight controls"
+msgstr "~I~ndy fight controls"
+
+#: backends/platform/ds/arm9/source/dsoptions.cpp:65
+msgid "Show mouse cursor"
+msgstr "Egérkurzor látszik"
+
+#: backends/platform/ds/arm9/source/dsoptions.cpp:66
+msgid "Snap to edges"
+msgstr "Élekre illesztés"
+
+#: backends/platform/ds/arm9/source/dsoptions.cpp:68
+msgid "Touch X Offset"
+msgstr "Touch X Eltolás"
+
+#: backends/platform/ds/arm9/source/dsoptions.cpp:75
+msgid "Touch Y Offset"
+msgstr "Touch Y Eltolás"
+
+#: backends/platform/ds/arm9/source/dsoptions.cpp:87
+msgid "Use laptop trackpad-style cursor control"
+msgstr "Laptop trackpad stílusu kurzor vezérlõ"
+
+#: backends/platform/ds/arm9/source/dsoptions.cpp:88
+msgid "Tap for left click, double tap right click"
+msgstr "Érintés balkatt, duplaérintés jobbkatt"
+
+#: backends/platform/ds/arm9/source/dsoptions.cpp:90
+msgid "Sensitivity"
+msgstr "Érzékenység"
+
+#: backends/platform/ds/arm9/source/dsoptions.cpp:99
+msgid "Initial top screen scale:"
+msgstr "Képernyõ felsõ kezdõpont:"
+
+#: backends/platform/ds/arm9/source/dsoptions.cpp:105
+msgid "Main screen scaling:"
+msgstr "Fõképernyõ átméretezés:"
+
+#: backends/platform/ds/arm9/source/dsoptions.cpp:107
+msgid "Hardware scale (fast, but low quality)"
+msgstr "Hardveres átméretezés (gyors, alacsony minõség)"
+
+#: backends/platform/ds/arm9/source/dsoptions.cpp:108
+msgid "Software scale (good quality, but slower)"
+msgstr "Szoftveres átméretezés (jó minõség, lassú)"
+
+#: backends/platform/ds/arm9/source/dsoptions.cpp:109
+msgid "Unscaled (you must scroll left and right)"
+msgstr "Eredeti (görgethetsz jobbra és balra)"
+
+#: backends/platform/ds/arm9/source/dsoptions.cpp:111
+msgid "Brightness:"
+msgstr "Fényerõ:"
+
+#: backends/platform/ds/arm9/source/dsoptions.cpp:121
+msgid "High quality audio (slower) (reboot)"
+msgstr "Jóminõségü audió (lassabb)(újraindítás)"
+
+#: backends/platform/ds/arm9/source/dsoptions.cpp:122
+msgid "Disable power off"
+msgstr "Leállítás tiltva"
+
+#: backends/platform/iphone/osys_events.cpp:300
+msgid "Mouse-click-and-drag mode enabled."
+msgstr "Egér kattint-és-húz mód engedélyezve."
+
+#: backends/platform/iphone/osys_events.cpp:302
+msgid "Mouse-click-and-drag mode disabled."
+msgstr "Egér kattint-és-húz mód letiltva."
+
+#: backends/platform/iphone/osys_events.cpp:313
+msgid "Touchpad mode enabled."
+msgstr "Touchpad mód engedélyezve."
+
+#: backends/platform/iphone/osys_events.cpp:315
+msgid "Touchpad mode disabled."
+msgstr "Touchpad mód letiltva."
+
+#: backends/platform/maemo/maemo.cpp:209
+msgid "Click Mode"
+msgstr "Kattintás Mód"
+
+#: backends/platform/maemo/maemo.cpp:215
+#: backends/platform/symbian/src/SymbianActions.cpp:42
+#: backends/platform/wince/CEActionsPocket.cpp:60
+#: backends/platform/wince/CEActionsSmartphone.cpp:43
+#: backends/platform/tizen/form.cpp:275
+msgid "Left Click"
+msgstr "Bal katt"
+
+#: backends/platform/maemo/maemo.cpp:218
+msgid "Middle Click"
+msgstr "Középsõ katt"
+
+#: backends/platform/maemo/maemo.cpp:221
+#: backends/platform/symbian/src/SymbianActions.cpp:43
+#: backends/platform/wince/CEActionsSmartphone.cpp:44
+#: backends/platform/tizen/form.cpp:267
+msgid "Right Click"
+msgstr "Jobb katt"
+
+#: backends/platform/sdl/macosx/appmenu_osx.mm:77
+msgid "Hide ScummVM"
+msgstr "ScummVM elrejtése"
+
+#: backends/platform/sdl/macosx/appmenu_osx.mm:82
+msgid "Hide Others"
+msgstr "Többi elrejtése"
+
+#: backends/platform/sdl/macosx/appmenu_osx.mm:87
+msgid "Show All"
+msgstr "Mutasd mind"
+
+#: backends/platform/sdl/macosx/appmenu_osx.mm:109
+#: backends/platform/sdl/macosx/appmenu_osx.mm:120
+msgid "Window"
+msgstr "Ablak"
+
+#: backends/platform/sdl/macosx/appmenu_osx.mm:114
+msgid "Minimize"
+msgstr "Kis méret"
+
+#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:46
+msgid "Normal (no scaling)"
+msgstr "Normál (nincs átméretezés)"
+
+#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:65
+msgctxt "lowres"
+msgid "Normal (no scaling)"
+msgstr "Normál (nincs átméretezés)"
+
+#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2148
+msgid "Enabled aspect ratio correction"
+msgstr "Méretarány korrekció engedélyezve"
+
+#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2154
+msgid "Disabled aspect ratio correction"
+msgstr "Méretarány korrekció letiltva"
+
+#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2209
+msgid "Active graphics filter:"
+msgstr "Aktív grafikus szûrõk:"
+
+#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2251
+msgid "Windowed mode"
+msgstr "Ablakos mód"
+
+#: backends/graphics/opengl/opengl-graphics.cpp:118
+msgid "OpenGL"
+msgstr "OpenGL"
+
+#: backends/graphics/opengl/opengl-graphics.cpp:119
+msgid "OpenGL (No filtering)"
+msgstr "OpenGL (Nincs szûrés)"
+
+#: backends/platform/symbian/src/SymbianActions.cpp:38
+#: backends/platform/wince/CEActionsSmartphone.cpp:39
+msgid "Up"
+msgstr "Fel"
+
+#: backends/platform/symbian/src/SymbianActions.cpp:39
+#: backends/platform/wince/CEActionsSmartphone.cpp:40
+msgid "Down"
+msgstr "Le"
+
+#: backends/platform/symbian/src/SymbianActions.cpp:40
+#: backends/platform/wince/CEActionsSmartphone.cpp:41
+msgid "Left"
+msgstr "Bal"
+
+#: backends/platform/symbian/src/SymbianActions.cpp:41
+#: backends/platform/wince/CEActionsSmartphone.cpp:42
+msgid "Right"
+msgstr "Jobb"
+
+#: backends/platform/symbian/src/SymbianActions.cpp:46
+#: backends/platform/wince/CEActionsSmartphone.cpp:47
+msgid "Zone"
+msgstr "Zóna"
+
+#: backends/platform/symbian/src/SymbianActions.cpp:47
+#: backends/platform/wince/CEActionsPocket.cpp:54
+#: backends/platform/wince/CEActionsSmartphone.cpp:48
+msgid "Multi Function"
+msgstr "Többfunkciós"
+
+#: backends/platform/symbian/src/SymbianActions.cpp:48
+msgid "Swap character"
+msgstr "Karakter csere"
+
+#: backends/platform/symbian/src/SymbianActions.cpp:49
+msgid "Skip text"
+msgstr "Szöveg átugrása"
+
+#: backends/platform/symbian/src/SymbianActions.cpp:51
+msgid "Fast mode"
+msgstr "Gyors mód"
+
+#: 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:218
+#: engines/scumm/dialogs.cpp:192 engines/scumm/help.cpp:82
+#: engines/scumm/help.cpp:84
+msgid "Quit"
+msgstr "Kilépés"
+
+#: backends/platform/symbian/src/SymbianActions.cpp:53
+msgid "Debugger"
+msgstr "Hibakeresõ"
+
+#: backends/platform/symbian/src/SymbianActions.cpp:54
+msgid "Global menu"
+msgstr "Globális menü"
+
+#: backends/platform/symbian/src/SymbianActions.cpp:55
+msgid "Virtual keyboard"
+msgstr "Virtuális billentyûzet"
+
+#: backends/platform/symbian/src/SymbianActions.cpp:56
+msgid "Key mapper"
+msgstr "Billentyû kiosztás"
+
+#: backends/events/symbiansdl/symbiansdl-events.cpp:184
+msgid "Do you want to quit ?"
+msgstr "Ki akarsz lépni ?"
+
+#: backends/platform/wii/options.cpp:51
+msgid "Video"
+msgstr "Videó"
+
+#: backends/platform/wii/options.cpp:54
+msgid "Current video mode:"
+msgstr "Jelenlegi videómód:"
+
+#: backends/platform/wii/options.cpp:56
+msgid "Double-strike"
+msgstr "Dupla érintés"
+
+#: backends/platform/wii/options.cpp:60
+msgid "Horizontal underscan:"
+msgstr "Vízszintes eltolás:"
+
+#: backends/platform/wii/options.cpp:66
+msgid "Vertical underscan:"
+msgstr "Függõleges eltolás:"
+
+#: backends/platform/wii/options.cpp:71
+msgid "Input"
+msgstr "Bemenet"
+
+#: backends/platform/wii/options.cpp:74
+msgid "GC Pad sensitivity:"
+msgstr "GC Pad érzékenység:"
+
+#: backends/platform/wii/options.cpp:80
+msgid "GC Pad acceleration:"
+msgstr "GC Pad felbontás:"
+
+#: backends/platform/wii/options.cpp:86
+msgid "DVD"
+msgstr "DVD"
+
+#: backends/platform/wii/options.cpp:89 backends/platform/wii/options.cpp:101
+msgid "Status:"
+msgstr "Státusz:"
+
+#: backends/platform/wii/options.cpp:90 backends/platform/wii/options.cpp:102
+msgid "Unknown"
+msgstr "Ismeretlen"
+
+#: backends/platform/wii/options.cpp:93
+msgid "Mount DVD"
+msgstr "DVD csatolás"
+
+#: backends/platform/wii/options.cpp:94
+msgid "Unmount DVD"
+msgstr "DVD kiadás"
+
+#: backends/platform/wii/options.cpp:98
+msgid "SMB"
+msgstr "SMB"
+
+#: backends/platform/wii/options.cpp:106
+msgid "Server:"
+msgstr "Szerver:"
+
+#: backends/platform/wii/options.cpp:110
+msgid "Share:"
+msgstr "Megoszt:"
+
+#: backends/platform/wii/options.cpp:114
+msgid "Username:"
+msgstr "Felhasználó:"
+
+#: backends/platform/wii/options.cpp:118
+msgid "Password:"
+msgstr "Jelszó:"
+
+#: backends/platform/wii/options.cpp:121
+msgid "Init network"
+msgstr "Hálózat inicializálás"
+
+#: backends/platform/wii/options.cpp:123
+msgid "Mount SMB"
+msgstr "SMB csatolás"
+
+#: backends/platform/wii/options.cpp:124
+msgid "Unmount SMB"
+msgstr "SMB kiadás"
+
+#: backends/platform/wii/options.cpp:143
+msgid "DVD Mounted successfully"
+msgstr "DVD csatlakoztatva"
+
+#: backends/platform/wii/options.cpp:146
+msgid "Error while mounting the DVD"
+msgstr "Hiba a DVD csatlakoztatásakor"
+
+#: backends/platform/wii/options.cpp:148
+msgid "DVD not mounted"
+msgstr "DVD nincs csatolva"
+
+#: backends/platform/wii/options.cpp:161
+msgid "Network up, share mounted"
+msgstr "Hálózat és megosztás csatlakozva"
+
+#: backends/platform/wii/options.cpp:163
+msgid "Network up"
+msgstr "Hálózat csatlakozva"
+
+#: backends/platform/wii/options.cpp:166
+msgid ", error while mounting the share"
+msgstr ", hiba a megosztás csatolásakor"
+
+#: backends/platform/wii/options.cpp:168
+msgid ", share not mounted"
+msgstr ", megosztás nincs csatolva"
+
+#: backends/platform/wii/options.cpp:174
+msgid "Network down"
+msgstr "Nincs hálózat"
+
+#: backends/platform/wii/options.cpp:178
+msgid "Initializing network"
+msgstr "Hálózat inicializálása"
+
+#: backends/platform/wii/options.cpp:182
+msgid "Timeout while initializing network"
+msgstr "Idõtúllépés a hálózat inicializálásakor"
+
+#: backends/platform/wii/options.cpp:186
+#, c-format
+msgid "Network not initialized (%d)"
+msgstr "(%d) Hálózat nincs inicializálva"
+
+#: backends/platform/wince/CEActionsPocket.cpp:46
+msgid "Hide Toolbar"
+msgstr "Eszköztár rejtés"
+
+#: backends/platform/wince/CEActionsPocket.cpp:47
+msgid "Show Keyboard"
+msgstr "Billentyûzet megjelenítés"
+
+#: backends/platform/wince/CEActionsPocket.cpp:48
+msgid "Sound on/off"
+msgstr "Hang be/ki"
+
+#: backends/platform/wince/CEActionsPocket.cpp:49
+msgid "Right click"
+msgstr "Jobb katt"
+
+#: backends/platform/wince/CEActionsPocket.cpp:50
+msgid "Show/Hide Cursor"
+msgstr "Kurzor be/ki"
+
+#: backends/platform/wince/CEActionsPocket.cpp:51
+msgid "Free look"
+msgstr "Szabad nézet"
+
+#: backends/platform/wince/CEActionsPocket.cpp:52
+msgid "Zoom up"
+msgstr "Nagyítás"
+
+#: backends/platform/wince/CEActionsPocket.cpp:53
+msgid "Zoom down"
+msgstr "Kicsinyítés"
+
+#: backends/platform/wince/CEActionsPocket.cpp:55
+#: backends/platform/wince/CEActionsSmartphone.cpp:49
+msgid "Bind Keys"
+msgstr "Kapcsolódás kulcsok"
+
+#: backends/platform/wince/CEActionsPocket.cpp:56
+msgid "Cursor Up"
+msgstr "Kurzor Fel"
+
+#: backends/platform/wince/CEActionsPocket.cpp:57
+msgid "Cursor Down"
+msgstr "Kurzor Le"
+
+#: backends/platform/wince/CEActionsPocket.cpp:58
+msgid "Cursor Left"
+msgstr "Kurzor Bal"
+
+#: backends/platform/wince/CEActionsPocket.cpp:59
+msgid "Cursor Right"
+msgstr "Kurzor Jobb"
+
+#: 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:326
+#: backends/platform/wince/CEActionsSmartphone.cpp:287
+msgid " Are you sure you want to quit ? "
+msgstr " Biztos hogy ki akarsz lépni ? "
+
+#: backends/platform/wince/CEActionsSmartphone.cpp:50
+msgid "Keyboard"
+msgstr "Billentyûzet"
+
+#: backends/platform/wince/CEActionsSmartphone.cpp:51
+msgid "Rotate"
+msgstr "Forgatás"
+
+#: backends/platform/wince/CELauncherDialog.cpp:56
+msgid "Using SDL driver "
+msgstr "SDL meghajtó használata"
+
+#: backends/platform/wince/CELauncherDialog.cpp:60
+msgid "Display "
+msgstr "Kijelzõ"
+
+#: 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:516
+msgid "Map right click action"
+msgstr "Jobbkatt mûvelet gomb"
+
+#: backends/platform/wince/wince-sdl.cpp:520
+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:529
+msgid "Map hide toolbar action"
+msgstr "Eszköztár rejtés gomb"
+
+#: backends/platform/wince/wince-sdl.cpp:533
+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:542
+msgid "Map Zoom Up action (optional)"
+msgstr "Nagyítás mûvelet (opcionális)"
+
+#: backends/platform/wince/wince-sdl.cpp:545
+msgid "Map Zoom Down action (optional)"
+msgstr "Kicsinyítés mûvelet (opcionális)"
+
+#: backends/platform/wince/wince-sdl.cpp:553
+msgid ""
+"Don't forget to map a key to 'Hide Toolbar' action to see the whole inventory"
+msgstr ""
+"Ne felejts billentyût társítani az 'Eszköztár rejtés' mûvelethez, hogy lásd "
+"a teljes listát"
+
+#: backends/events/default/default-events.cpp:196
+msgid "Do you really want to return to the Launcher?"
+msgstr "Biztos hogy visszatérsz az indítópulthoz?"
+
+#: backends/events/default/default-events.cpp:196
+msgid "Launcher"
+msgstr "Indítópult"
+
+#: backends/events/default/default-events.cpp:218
+msgid "Do you really want to quit?"
+msgstr "Biztos hogy ki akarsz lépni ?"
+
+#: backends/events/gph/gph-events.cpp:386
+#: backends/events/gph/gph-events.cpp:429
+#: backends/events/openpandora/op-events.cpp:168
+msgid "Touchscreen 'Tap Mode' - Left Click"
+msgstr "Érintõképernyõ 'Tap Mód' - Bal katt"
+
+#: backends/events/gph/gph-events.cpp:388
+#: backends/events/gph/gph-events.cpp:431
+#: backends/events/openpandora/op-events.cpp:170
+msgid "Touchscreen 'Tap Mode' - Right Click"
+msgstr "Érintõképernyõ 'Tap Mód' - Jobb katt"
+
+#: backends/events/gph/gph-events.cpp:390
+#: backends/events/gph/gph-events.cpp:433
+#: backends/events/openpandora/op-events.cpp:172
+msgid "Touchscreen 'Tap Mode' - Hover (No Click)"
+msgstr "Érintõképernyõ 'Tap Mód' - Lebegõ (Nincs katt)"
+
+#: backends/events/gph/gph-events.cpp:410
+msgid "Maximum Volume"
+msgstr "Maximum Hangerõ"
+
+#: backends/events/gph/gph-events.cpp:412
+msgid "Increasing Volume"
+msgstr "Hangerõ növelése"
+
+#: backends/events/gph/gph-events.cpp:418
+msgid "Minimal Volume"
+msgstr "Minimum Hangerõ"
+
+#: backends/events/gph/gph-events.cpp:420
+msgid "Decreasing Volume"
+msgstr "Hangerõ csökkentése"
+
+#: backends/events/openpandora/op-events.cpp:174
+msgid "Touchscreen 'Tap Mode' - Hover (DPad Clicks)"
+msgstr "Érintõképernyõ 'Érintésmód' - Lebegõ (DPad katt)"
+
+#: backends/updates/macosx/macosx-updates.mm:67
+msgid "Check for Updates..."
+msgstr "Frissítések keresése..."
+
+#: backends/platform/tizen/form.cpp:263
+msgid "Right Click Once"
+msgstr "Jobb katt egyszer"
+
+#: backends/platform/tizen/form.cpp:271
+msgid "Move Only"
+msgstr "Csak lépés"
+
+#: backends/platform/tizen/form.cpp:294
+msgid "Escape Key"
+msgstr "Escape gomb"
+
+#: backends/platform/tizen/form.cpp:299
+msgid "Game Menu"
+msgstr "Játék Menü"
+
+#: backends/platform/tizen/form.cpp:304
+msgid "Show Keypad"
+msgstr "Kézi billentyûzet"
+
+#: backends/platform/tizen/form.cpp:309
+msgid "Control Mouse"
+msgstr "Egér irányitás"
+
+#: backends/events/maemosdl/maemosdl-events.cpp:192
+msgid "Clicking Enabled"
+msgstr "Kattintás engedve"
+
+#: backends/events/maemosdl/maemosdl-events.cpp:192
+msgid "Clicking Disabled"
+msgstr "Kattintás tiltva"
+
+#: engines/agi/detection.cpp:142 engines/drascula/detection.cpp:302
+#: engines/dreamweb/detection.cpp:47 engines/neverhood/detection.cpp:160
+#: engines/sci/detection.cpp:394 engines/toltecs/detection.cpp:186
msgid "Use original save/load screens"
msgstr "Eredeti ment/tölt képernyõk használata"
-#: engines/agi/detection.cpp:143 engines/drascula/detection.cpp:271
-#: engines/dreamweb/detection.cpp:48 engines/sci/detection.cpp:394
-#: engines/toltecs/detection.cpp:174
+#: engines/agi/detection.cpp:143 engines/drascula/detection.cpp:303
+#: engines/dreamweb/detection.cpp:48 engines/neverhood/detection.cpp:161
+#: engines/sci/detection.cpp:395 engines/toltecs/detection.cpp:187
msgid "Use the original save/load screens, instead of the ScummVM ones"
msgstr "Az eredeti mentés/betöltés képernyõ használata a ScummVM képek helyett"
-#: engines/agi/saveload.cpp:816 engines/drascula/saveload.cpp:351
-#: engines/sci/engine/kfile.cpp:841 engines/toltecs/menu.cpp:259
+#: engines/agi/saveload.cpp:816 engines/drascula/saveload.cpp:349
+#: engines/neverhood/menumodule.cpp:886 engines/sci/engine/kfile.cpp:857
+#: engines/toltecs/menu.cpp:256
msgid "Restore game:"
msgstr "Játékmenet visszaállítása:"
-#: engines/agi/saveload.cpp:816 engines/drascula/saveload.cpp:351
-#: engines/sci/engine/kfile.cpp:841 engines/toltecs/menu.cpp:259
+#: engines/agi/saveload.cpp:816 engines/drascula/saveload.cpp:349
+#: engines/neverhood/menumodule.cpp:886 engines/sci/engine/kfile.cpp:857
+#: engines/toltecs/menu.cpp:256
msgid "Restore"
msgstr "Visszaállítás"
-#: engines/drascula/saveload.cpp:49
+#: engines/agos/saveload.cpp:160 engines/scumm/scumm.cpp:2321
+#, c-format
+msgid ""
+"Failed to load game state from file:\n"
+"\n"
+"%s"
+msgstr ""
+"Játékállás betöltése:\n"
+"\n"
+"%s fájlból nem sikerült"
+
+#: engines/agos/saveload.cpp:195 engines/scumm/scumm.cpp:2314
+#, c-format
+msgid ""
+"Failed to save game state to file:\n"
+"\n"
+"%s"
+msgstr ""
+"Játékállás mentése:\n"
+"\n"
+"%s fájlba nem sikerült"
+
+#: engines/agos/saveload.cpp:203 engines/scumm/scumm.cpp:2332
+#, c-format
+msgid ""
+"Successfully saved game state in file:\n"
+"\n"
+"%s"
+msgstr ""
+"Játékállás mentése:\n"
+"\n"
+"%s fájlba elkészült"
+
+#: engines/agos/animation.cpp:557
+#, c-format
+msgid "Cutscene file '%s' not found!"
+msgstr "'%s' átvezetõ fájl nem található"
+
+#: engines/drascula/saveload.cpp:47
msgid ""
"ScummVM found that you have old savefiles for Drascula that should be "
"converted.\n"
@@ -1430,27 +2153,304 @@ msgstr "Fényes paletta mód használata"
msgid "Display graphics using the game's bright palette"
msgstr "Grafikus megjelenítésre használja a játék fényes palettáját"
-#: engines/sci/detection.cpp:373
+#: engines/gob/inter_playtoons.cpp:256 engines/gob/inter_v2.cpp:1470
+#: engines/tinsel/saveload.cpp:532
+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:1540 engines/tinsel/saveload.cpp:545
+msgid "Failed to save game state to file."
+msgstr "Játékállás mentése fájlba nem sikerült."
+
+#: engines/gob/inter_v5.cpp:107
+msgid "Failed to delete file."
+msgstr "Fájl törlés sikertelen."
+
+#: engines/groovie/detection.cpp:312
+msgid "Fast movie speed"
+msgstr "Gyors filmsebesség"
+
+#: engines/groovie/detection.cpp:313
+msgid "Play movies at an increased speed"
+msgstr "Filmek lejátszása nagyobb sebességgel"
+
+#: engines/groovie/script.cpp:399
+msgid "Failed to save game"
+msgstr "Játék mentés nem sikerült"
+
+#. I18N: Studio audience adds an applause and cheering sounds whenever
+#. Malcolm makes a joke.
+#: engines/kyra/detection.cpp:62
+msgid "Studio audience"
+msgstr "Stúdió közönség"
+
+#: engines/kyra/detection.cpp:63
+msgid "Enable studio audience"
+msgstr "Stúdió közönség engedélyezése"
+
+#. I18N: This option allows the user to skip text and cutscenes.
+#: engines/kyra/detection.cpp:73
+msgid "Skip support"
+msgstr "Átugrás támogatás"
+
+#: engines/kyra/detection.cpp:74
+msgid "Allow text and cutscenes to be skipped"
+msgstr "Szöveg és átvezetõk átugrásának támogatása"
+
+#. I18N: Helium mode makes people sound like they've inhaled Helium.
+#: engines/kyra/detection.cpp:84
+msgid "Helium mode"
+msgstr "Helium mód"
+
+#: engines/kyra/detection.cpp:85
+msgid "Enable helium mode"
+msgstr "Helium mód engedélyezve"
+
+#. I18N: When enabled, this option makes scrolling smoother when
+#. changing from one screen to another.
+#: engines/kyra/detection.cpp:99
+msgid "Smooth scrolling"
+msgstr "Finom görgetés"
+
+#: engines/kyra/detection.cpp:100
+msgid "Enable smooth scrolling when walking"
+msgstr "Finom görgetés engedélyezése járás közben"
+
+#. I18N: When enabled, this option changes the cursor when it floats to the
+#. edge of the screen to a directional arrow. The player can then click to
+#. walk towards that direction.
+#: engines/kyra/detection.cpp:112
+msgid "Floating cursors"
+msgstr "Lebegõ kurzor"
+
+#: engines/kyra/detection.cpp:113
+msgid "Enable floating cursors"
+msgstr "Lebegõ kurzor engedélyezése"
+
+#. I18N: HP stands for Hit Points
+#: engines/kyra/detection.cpp:127
+msgid "HP bar graphs"
+msgstr "HP sáv grafika"
+
+#: engines/kyra/detection.cpp:128
+msgid "Enable hit point bar graphs"
+msgstr "Hit point sáv grafika engedélyezése"
+
+#: engines/kyra/lol.cpp:478
+msgid "Attack 1"
+msgstr "Támadás 1"
+
+#: engines/kyra/lol.cpp:479
+msgid "Attack 2"
+msgstr "Támadás 2"
+
+#: engines/kyra/lol.cpp:480
+msgid "Attack 3"
+msgstr "Támadás 3"
+
+#: engines/kyra/lol.cpp:481
+msgid "Move Forward"
+msgstr "Mozgás elõre"
+
+#: engines/kyra/lol.cpp:482
+msgid "Move Back"
+msgstr "Mozgás hátra"
+
+#: engines/kyra/lol.cpp:483
+msgid "Slide Left"
+msgstr "Siklás balra"
+
+#: engines/kyra/lol.cpp:484
+msgid "Slide Right"
+msgstr "Siklás jobbra"
+
+#: engines/kyra/lol.cpp:485 engines/pegasus/pegasus.cpp:2509
+msgid "Turn Left"
+msgstr "Balra fordul"
+
+#: engines/kyra/lol.cpp:486 engines/pegasus/pegasus.cpp:2510
+msgid "Turn Right"
+msgstr "Jobbra fordul"
+
+#: engines/kyra/lol.cpp:487
+msgid "Rest"
+msgstr "Pihenés"
+
+#: engines/kyra/lol.cpp:488
+msgid "Options"
+msgstr "Opciók"
+
+#: engines/kyra/lol.cpp:489
+msgid "Choose Spell"
+msgstr "Válassz varázslatot"
+
+#: engines/kyra/sound_midi.cpp:477
+msgid ""
+"You appear to be using a General MIDI device,\n"
+"but your game only supports Roland MT32 MIDI.\n"
+"We try to map the Roland MT32 instruments to\n"
+"General MIDI ones. It is still possible that\n"
+"some tracks sound incorrect."
+msgstr ""
+"Úgy tûnik, egy General MIDI eszközt használsz,\n"
+"de a játék csak Roland MT32 MIDI eszközt támogat.\n"
+"Megpróbáljuk lecserélni a Roland MT32 hangszereket\n"
+"General MIDIre. Továbbra is lehetséges hogy\n"
+"néhány hangsáv helytelenül hangzik."
+
+#. I18N: Option for fast scene switching
+#: engines/mohawk/dialogs.cpp:92 engines/mohawk/dialogs.cpp:167
+msgid "~Z~ip Mode Activated"
+msgstr "~Z~ip Mód aktiválva"
+
+#: engines/mohawk/dialogs.cpp:93
+msgid "~T~ransitions Enabled"
+msgstr "Átmenetek engedélyezve"
+
+#. I18N: Drop book page
+#: engines/mohawk/dialogs.cpp:95
+msgid "~D~rop Page"
+msgstr "Oldal~D~obás"
+
+#: engines/mohawk/dialogs.cpp:99
+msgid "~S~how Map"
+msgstr "~S~ Térkép"
+
+#: engines/mohawk/dialogs.cpp:105
+msgid "~M~ain Menu"
+msgstr "Fõ~M~enü"
+
+#: engines/mohawk/dialogs.cpp:168
+msgid "~W~ater Effect Enabled"
+msgstr "Vízeffektus engedélyezve"
+
+#: engines/neverhood/detection.cpp:167
+msgid "Skip the Hall of Records storyboard scenes"
+msgstr "Hall of Records storyboard átvezetõk átugrása"
+
+#: engines/neverhood/detection.cpp:168
+msgid "Allows the player to skip past the Hall of Records storyboard scenes"
+msgstr ""
+"Lehetõség, hogy a játékos átugorja a Hall of Records storyboard átvezetõket"
+
+#: engines/neverhood/detection.cpp:174
+msgid "Scale the making of videos to full screen"
+msgstr "Hogyan készült videók átméretezése teljesképernyõre"
+
+#: engines/neverhood/detection.cpp:175
+msgid "Scale the making of videos, so that they use the whole screen"
+msgstr "Hogyan készült videók átméretezése, hogy teljesképernyõt használjanak"
+
+#: engines/parallaction/saveload.cpp:133
+#, c-format
+msgid ""
+"Can't save game in slot %i\n"
+"\n"
+msgstr ""
+"Játékállás nem menthetõ %i slotba\n"
+"\n"
+
+#: engines/parallaction/saveload.cpp:204
+msgid "Loading game..."
+msgstr "Játék betöltés..."
+
+#: engines/parallaction/saveload.cpp:219
+msgid "Saving game..."
+msgstr "Játék mentés..."
+
+#: engines/parallaction/saveload.cpp:272
+msgid ""
+"ScummVM found that you have old savefiles for Nippon Safes that should be "
+"renamed.\n"
+"The old names are 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 next time.\n"
+msgstr ""
+"ScummVM régi játékmentést talált a Nippon Safes hez ezt át kell nevezni.\n"
+"A régi játékmentés nem támogatott, ezért a játék nem töltõdik be átnevezés "
+"nélkül..\n"
+"\n"
+"Nyomj OK-t az átalakításhoz, vagy rákérdezzek ha legközelebb elindítod a "
+"játékot.\n"
+
+#: engines/parallaction/saveload.cpp:319
+msgid "ScummVM successfully converted all your savefiles."
+msgstr "ScummVM konvertálta az összes játékállásodat."
+
+#: engines/parallaction/saveload.cpp:321
+msgid ""
+"ScummVM printed some warnings in your console window and can't guarantee all "
+"your files have been converted.\n"
+"\n"
+"Please report to the team."
+msgstr ""
+"ScummVM kiírt néhány figyelmeztetést a konzolablakba és nem biztos hogy az "
+"összes fájlod át lett alakítva.\n"
+"\n"
+"Légyszíves jelentsd a csapatnak."
+
+#: engines/pegasus/pegasus.cpp:714
+msgid "Invalid save file name"
+msgstr "Érvénytelen mentés fájlnév"
+
+#: engines/pegasus/pegasus.cpp:2507
+msgid "Up/Zoom In/Move Forward/Open Doors"
+msgstr "Fel/Nagyítás/Elõre mozgás/Ajtónyitás"
+
+#: engines/pegasus/pegasus.cpp:2508
+msgid "Down/Zoom Out"
+msgstr "Le/Zoom Ki"
+
+#: engines/pegasus/pegasus.cpp:2511
+msgid "Display/Hide Inventory Tray"
+msgstr "Tárgylista tálca Képre/Elrejt"
+
+#: engines/pegasus/pegasus.cpp:2512
+msgid "Display/Hide Biochip Tray"
+msgstr "Biochip tálca Képre/Elrejt"
+
+#: engines/pegasus/pegasus.cpp:2513
+msgid "Action/Select"
+msgstr "Akció/Választ"
+
+#: engines/pegasus/pegasus.cpp:2514
+msgid "Toggle Center Data Display"
+msgstr "Adatképernyõ kapcsoló"
+
+#: engines/pegasus/pegasus.cpp:2515
+msgid "Display/Hide Info Screen"
+msgstr "Infóképernyõ Képre/Elrejt"
+
+#: engines/pegasus/pegasus.cpp:2516
+msgid "Display/Hide Pause Menu"
+msgstr "Szünet menü Képre/Elrejt"
+
+#: engines/pegasus/pegasus.cpp:2517
+msgid "???"
+msgstr "???"
+
+#: engines/sci/detection.cpp:374
msgid "EGA undithering"
msgstr "EGA szinjavítás"
-#: engines/sci/detection.cpp:374
+#: engines/sci/detection.cpp:375
msgid "Enable undithering in EGA games"
msgstr "Undithering engedélyezése EGA játékokban"
-#: engines/sci/detection.cpp:383
+#: engines/sci/detection.cpp:384
msgid "Prefer digital sound effects"
msgstr "Digitális hangeffektusok elõnyben"
-#: engines/sci/detection.cpp:384
+#: engines/sci/detection.cpp:385
msgid "Prefer digital sound effects instead of synthesized ones"
msgstr "Digitális hanghatások elõnyben a szintetizáltakkal szemben"
-#: engines/sci/detection.cpp:403
+#: engines/sci/detection.cpp:404
msgid "Use IMF/Yamaha FB-01 for MIDI output"
msgstr "IMF/Yamaha FB-01 használata MIDI kimentre"
-#: engines/sci/detection.cpp:404
+#: engines/sci/detection.cpp:405
msgid ""
"Use an IBM Music Feature card or a Yamaha FB-01 FM synth module for MIDI "
"output"
@@ -1458,163 +2458,145 @@ msgstr ""
"IBM Music Feature kártya vagy Yamaha FB-01 FM szintetizátor modul használata "
"MIDI kimenetre"
-#: engines/sci/detection.cpp:414
+#: engines/sci/detection.cpp:415
msgid "Use CD audio"
msgstr "CD audió használata"
-#: engines/sci/detection.cpp:415
+#: engines/sci/detection.cpp:416
msgid "Use CD audio instead of in-game audio, if available"
msgstr "CD audió használata a játékban lévõvel szemben, ha elérhetõ"
-#: engines/sci/detection.cpp:425
+#: engines/sci/detection.cpp:426
msgid "Use Windows cursors"
msgstr "Windows kurzorok használata"
-#: engines/sci/detection.cpp:426
+#: engines/sci/detection.cpp:427
msgid ""
"Use the Windows cursors (smaller and monochrome) instead of the DOS ones"
msgstr "Windows kurzorok használata (kisebb és monokróm) a DOS-osok helyett "
-#: engines/sci/detection.cpp:436
+#: engines/sci/detection.cpp:437
msgid "Use silver cursors"
msgstr "Ezüst kurzor használata"
-#: engines/sci/detection.cpp:437
+#: engines/sci/detection.cpp:438
msgid ""
"Use the alternate set of silver cursors, instead of the normal golden ones"
msgstr "Alternatív ezüst kurzorszett használata, a normál arany helyett"
-#: engines/scumm/dialogs.cpp:175
+#: engines/scumm/dialogs.cpp:176
#, 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
+#: engines/scumm/dialogs.cpp:177
#, 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
+#: engines/scumm/dialogs.cpp:178
#, 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
+#: engines/scumm/dialogs.cpp:179
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
+#: engines/scumm/dialogs.cpp:183
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
+#: engines/scumm/dialogs.cpp:185
msgid "Are you sure you want to quit? (Y/N)"
msgstr "Biztos hogy ki akarsz lépni? (Y/N)"
-#: engines/scumm/dialogs.cpp:189
+#: engines/scumm/dialogs.cpp:190
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:215
-msgid "Quit"
-msgstr "Kilépés"
-
-#: engines/scumm/dialogs.cpp:193
+#: engines/scumm/dialogs.cpp:194
msgid "Insert save/load game disk"
msgstr "Helyezd be a játékmentés lemezt"
-#: engines/scumm/dialogs.cpp:194
+#: engines/scumm/dialogs.cpp:195
msgid "You must enter a name"
msgstr "Meg kell adnod egy nevet"
-#: engines/scumm/dialogs.cpp:195
+#: engines/scumm/dialogs.cpp:196
msgid "The game was NOT saved (disk full?)"
msgstr "A játék NINCS mentve (Megtelt a lemez?)"
-#: engines/scumm/dialogs.cpp:196
+#: engines/scumm/dialogs.cpp:197
msgid "The game was NOT loaded"
msgstr "A játék NINCS betöltve"
-#: engines/scumm/dialogs.cpp:197
+#: engines/scumm/dialogs.cpp:198
#, c-format
msgid "Saving '%s'"
msgstr "'%s' Mentése"
-#: engines/scumm/dialogs.cpp:198
+#: engines/scumm/dialogs.cpp:199
#, c-format
msgid "Loading '%s'"
msgstr "'%s' Betöltése"
-#: engines/scumm/dialogs.cpp:199
+#: engines/scumm/dialogs.cpp:200
msgid "Name your SAVE game"
msgstr "JátékMENTÉS neve"
-#: engines/scumm/dialogs.cpp:200
+#: engines/scumm/dialogs.cpp:201
msgid "Select a game to LOAD"
msgstr "Válassz egy játékot Betöltésre"
-#: engines/scumm/dialogs.cpp:201
+#: engines/scumm/dialogs.cpp:202
msgid "Game title)"
msgstr "Játék címe)"
#. I18N: Previous page button
-#: engines/scumm/dialogs.cpp:287
+#: engines/scumm/dialogs.cpp:288
msgid "~P~revious"
msgstr "Elõzõ"
#. I18N: Next page button
-#: engines/scumm/dialogs.cpp:289
+#: engines/scumm/dialogs.cpp:290
msgid "~N~ext"
msgstr "Következõ"
-#: engines/scumm/dialogs.cpp:290
-#: backends/platform/ds/arm9/source/dsoptions.cpp:56
-msgid "~C~lose"
-msgstr "Bezár"
-
-#: engines/scumm/dialogs.cpp:597
+#: engines/scumm/dialogs.cpp:598
msgid "Speech Only"
msgstr "Csak beszéd"
-#: engines/scumm/dialogs.cpp:598
+#: engines/scumm/dialogs.cpp:599
msgid "Speech and Subtitles"
msgstr "Beszéd és felirat"
-#: engines/scumm/dialogs.cpp:599
+#: engines/scumm/dialogs.cpp:600
msgid "Subtitles Only"
msgstr "Csak felirat"
-#: engines/scumm/dialogs.cpp:607
+#: engines/scumm/dialogs.cpp:608
msgctxt "lowres"
msgid "Speech & Subs"
msgstr "Beszéd & Felir"
-#: engines/scumm/dialogs.cpp:653
+#: engines/scumm/dialogs.cpp:654
msgid "Select a Proficiency Level."
msgstr "Válassz hozzáértés szintet."
-#: engines/scumm/dialogs.cpp:655
+#: engines/scumm/dialogs.cpp:656
msgid "Refer to your Loom(TM) manual for help."
msgstr "Segítségért nézd meg a Loom(TM) kézikönyvedet."
-#: engines/scumm/dialogs.cpp:658
-msgid "Standard"
-msgstr "Átlagos"
-
-#: engines/scumm/dialogs.cpp:659
+#: engines/scumm/dialogs.cpp:660
msgid "Practice"
msgstr "Gyakorlás"
-#: engines/scumm/dialogs.cpp:660
+#: engines/scumm/dialogs.cpp:661
msgid "Expert"
msgstr "Szakértõ"
@@ -2131,7 +3113,7 @@ msgstr "Jobbra repülés"
msgid "Fly to lower right"
msgstr "Jobbra le repülés"
-#: engines/scumm/scumm.cpp:1776
+#: engines/scumm/scumm.cpp:1777
#, c-format
msgid ""
"Native MIDI support requires the Roland Upgrade from LucasArts,\n"
@@ -2140,40 +3122,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:2303 engines/agos/saveload.cpp:220
-#, c-format
-msgid ""
-"Failed to save game state to file:\n"
-"\n"
-"%s"
-msgstr ""
-"Játékállás mentése:\n"
-"\n"
-"%s fájlba nem sikerült"
-
-#: engines/scumm/scumm.cpp:2310 engines/agos/saveload.cpp:185
-#, c-format
-msgid ""
-"Failed to load game state from file:\n"
-"\n"
-"%s"
-msgstr ""
-"Játékállás betöltése:\n"
-"\n"
-"%s fájlból nem sikerült"
-
-#: engines/scumm/scumm.cpp:2322 engines/agos/saveload.cpp:228
-#, c-format
-msgid ""
-"Successfully saved game state in file:\n"
-"\n"
-"%s"
-msgstr ""
-"Játékállás mentése:\n"
-"\n"
-"%s fájlba elkészült"
-
-#: engines/scumm/scumm.cpp:2537
+#: engines/scumm/scumm.cpp:2547
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' "
@@ -2183,190 +3132,6 @@ 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."
-#. I18N: Option for fast scene switching
-#: engines/mohawk/dialogs.cpp:92 engines/mohawk/dialogs.cpp:167
-msgid "~Z~ip Mode Activated"
-msgstr "~Z~ip Mód aktiválva"
-
-#: engines/mohawk/dialogs.cpp:93
-msgid "~T~ransitions Enabled"
-msgstr "Átmenetek engedélyezve"
-
-#. I18N: Drop book page
-#: engines/mohawk/dialogs.cpp:95
-msgid "~D~rop Page"
-msgstr "Oldal~D~obás"
-
-#: engines/mohawk/dialogs.cpp:99
-msgid "~S~how Map"
-msgstr "~S~ Térkép"
-
-#: engines/mohawk/dialogs.cpp:105
-msgid "~M~ain Menu"
-msgstr "Fõ~M~enü"
-
-#: engines/mohawk/dialogs.cpp:168
-msgid "~W~ater Effect Enabled"
-msgstr "Vízeffektus engedélyezve"
-
-#: engines/agos/animation.cpp:557
-#, 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:1287
-#: engines/tinsel/saveload.cpp:532
-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:1357 engines/tinsel/saveload.cpp:545
-msgid "Failed to save game state to file."
-msgstr "Játékállás mentése fájlba nem sikerült."
-
-#: engines/gob/inter_v5.cpp:107
-msgid "Failed to delete file."
-msgstr "Fájl törlés sikertelen."
-
-#: engines/groovie/detection.cpp:312
-msgid "Fast movie speed"
-msgstr "Gyors filmsebesség"
-
-#: engines/groovie/detection.cpp:313
-msgid "Play movies at an increased speed"
-msgstr "Filmek lejátszása nagyobb sebességgel"
-
-#: engines/groovie/script.cpp:420
-msgid "Failed to save game"
-msgstr "Játék mentés nem sikerült"
-
-#. I18N: Studio audience adds an applause and cheering sounds whenever
-#. Malcolm makes a joke.
-#: engines/kyra/detection.cpp:62
-msgid "Studio audience"
-msgstr "Stúdió közönség"
-
-#: engines/kyra/detection.cpp:63
-msgid "Enable studio audience"
-msgstr "Stúdió közönség engedélyezése"
-
-#. I18N: This option allows the user to skip text and cutscenes.
-#: engines/kyra/detection.cpp:73
-msgid "Skip support"
-msgstr "Átugrás támogatás"
-
-#: engines/kyra/detection.cpp:74
-msgid "Allow text and cutscenes to be skipped"
-msgstr "Szöveg és átvezetõk átugrásának támogatása"
-
-#. I18N: Helium mode makes people sound like they've inhaled Helium.
-#: engines/kyra/detection.cpp:84
-msgid "Helium mode"
-msgstr "Helium mód"
-
-#: engines/kyra/detection.cpp:85
-msgid "Enable helium mode"
-msgstr "Helium mód engedélyezve"
-
-#. I18N: When enabled, this option makes scrolling smoother when
-#. changing from one screen to another.
-#: engines/kyra/detection.cpp:99
-msgid "Smooth scrolling"
-msgstr "Finom görgetés"
-
-#: engines/kyra/detection.cpp:100
-msgid "Enable smooth scrolling when walking"
-msgstr "Finom görgetés engedélyezése járás közben"
-
-#. I18N: When enabled, this option changes the cursor when it floats to the
-#. edge of the screen to a directional arrow. The player can then click to
-#. walk towards that direction.
-#: engines/kyra/detection.cpp:112
-msgid "Floating cursors"
-msgstr "Lebegõ kurzor"
-
-#: engines/kyra/detection.cpp:113
-msgid "Enable floating cursors"
-msgstr "Lebegõ kurzor engedélyezése"
-
-#. I18N: HP stands for Hit Points
-#: engines/kyra/detection.cpp:127
-msgid "HP bar graphs"
-msgstr "HP sáv grafika"
-
-#: engines/kyra/detection.cpp:128
-msgid "Enable hit point bar graphs"
-msgstr "Hit point sáv grafika engedélyezése"
-
-#: engines/kyra/lol.cpp:478
-msgid "Attack 1"
-msgstr "Támadás 1"
-
-#: engines/kyra/lol.cpp:479
-msgid "Attack 2"
-msgstr "Támadás 2"
-
-#: engines/kyra/lol.cpp:480
-msgid "Attack 3"
-msgstr "Támadás 3"
-
-#: engines/kyra/lol.cpp:481
-msgid "Move Forward"
-msgstr "Mozgás elõre"
-
-#: engines/kyra/lol.cpp:482
-msgid "Move Back"
-msgstr "Mozgás hátra"
-
-#: engines/kyra/lol.cpp:483
-msgid "Slide Left"
-msgstr "Siklás balra"
-
-#: engines/kyra/lol.cpp:484
-msgid "Slide Right"
-msgstr "Siklás jobbra"
-
-#: engines/kyra/lol.cpp:485 engines/pegasus/pegasus.cpp:2447
-msgid "Turn Left"
-msgstr "Balra fordul"
-
-#: engines/kyra/lol.cpp:486 engines/pegasus/pegasus.cpp:2448
-msgid "Turn Right"
-msgstr "Jobbra fordul"
-
-#: engines/kyra/lol.cpp:487
-msgid "Rest"
-msgstr "Pihenés"
-
-#: engines/kyra/lol.cpp:488
-msgid "Options"
-msgstr "Opciók"
-
-#: engines/kyra/lol.cpp:489
-msgid "Choose Spell"
-msgstr "Válassz varázslatot"
-
-#: engines/kyra/sound_midi.cpp:477
-msgid ""
-"You appear to be using a General MIDI device,\n"
-"but your game only supports Roland MT32 MIDI.\n"
-"We try to map the Roland MT32 instruments to\n"
-"General MIDI ones. It is still possible that\n"
-"some tracks sound incorrect."
-msgstr ""
-"Úgy tûnik, egy General MIDI eszközt használsz,\n"
-"de a játék csak Roland MT32 MIDI eszközt támogat.\n"
-"Megpróbáljuk lecserélni a Roland MT32 hangszereket\n"
-"General MIDIre. Továbbra is lehetséges hogy\n"
-"néhány hangsáv helytelenül hangzik."
-
-#: engines/queen/queen.cpp:59
-msgid "Alternative intro"
-msgstr "Alternatív intro"
-
-#: engines/queen/queen.cpp:60
-msgid "Use an alternative game intro (CD version only)"
-msgstr "Alternatív játékintro használata (csak CD verziónál)"
-
#: engines/sky/compact.cpp:130
msgid ""
"Unable to find \"sky.cpt\" file!\n"
@@ -2391,20 +3156,21 @@ msgstr "Floppy intro"
msgid "Use the floppy version's intro (CD version only)"
msgstr "A floppy verzió intro használata (csak CD verziónál)"
-#: engines/sword1/animation.cpp:519
+#: engines/sword1/animation.cpp:524
#, c-format
msgid "PSX stream cutscene '%s' cannot be played in paletted mode"
msgstr "'%s' PSX stream átvezetõ nem játszható le paletta módban"
-#: engines/sword1/animation.cpp:540 engines/sword2/animation.cpp:439
+#: engines/sword1/animation.cpp:545 engines/sword2/animation.cpp:445
msgid "DXA cutscenes found but ScummVM has been built without zlib support"
msgstr "DXA átvezetõ elérhetõ, de a ScummVM zlib támogatás nincs lefordítva"
-#: engines/sword1/animation.cpp:550 engines/sword2/animation.cpp:449
-msgid "MPEG2 cutscenes are no longer supported"
-msgstr "MPEG2 átvezetõk már nem támogatottak"
+#: engines/sword1/animation.cpp:561
+msgid "MPEG-2 cutscenes found but ScummVM has been built without MPEG-2"
+msgstr ""
+"MPEG-2 átvezetõfilmet találtam, de a ScummVM MPEG-2 nélkül van lefordítva"
-#: engines/sword1/animation.cpp:556 engines/sword2/animation.cpp:457
+#: engines/sword1/animation.cpp:568 engines/sword2/animation.cpp:470
#, c-format
msgid "Cutscene '%s' not found"
msgstr "'%s' átvezetõ nem található"
@@ -2448,13 +3214,20 @@ msgstr "Az újat megtartom"
msgid "This is the end of the Broken Sword 1 Demo"
msgstr "Ez a Broken Sword 1 Demo vége"
-#: engines/sword2/animation.cpp:419
+#: engines/sword2/animation.cpp:425
msgid ""
"PSX cutscenes found but ScummVM has been built without RGB color support"
msgstr ""
"PSX átvezetõfilmet találtam, de ez a ScummVM RGB színtámogatás nélkül van "
"lefordítva"
+#: engines/sword2/animation.cpp:461
+msgid ""
+"MPEG-2 cutscenes found but ScummVM has been built without MPEG-2 support"
+msgstr ""
+"MPEG-2 átvezetõfilmet találtam, de a ScummVM MPEG-2 támogatás nélkül van "
+"lefordítva"
+
#: engines/sword2/sword2.cpp:79
msgid "Show object labels"
msgstr "Tárgycimke látható"
@@ -2463,12 +3236,12 @@ msgstr "Tárgycimke látható"
msgid "Show labels for objects on mouse hover"
msgstr "Tárgycimke látható ha az egér felette van"
-#: engines/teenagent/resources.cpp:94
+#: engines/teenagent/resources.cpp:95
msgid ""
"You're missing the 'teenagent.dat' file. Get it from the ScummVM website"
msgstr "Hiányzik a 'teenagent.dat' fájl. Szerezd be a ScummVM website-ról"
-#: engines/teenagent/resources.cpp:115
+#: engines/teenagent/resources.cpp:116
msgid ""
"The teenagent.dat file is compressed and zlib hasn't been included in this "
"executable. Please decompress it"
@@ -2476,785 +3249,49 @@ msgstr ""
"A teenagent.dat fájl tömörített és a zlib nem része ennek a futtatható "
"állománynak. Kérlek tömörítsd ki"
-#: engines/parallaction/saveload.cpp:133
-#, c-format
-msgid ""
-"Can't save game in slot %i\n"
-"\n"
-msgstr ""
-"Játékállás nem menthetõ %i slotba\n"
-"\n"
-
-#: engines/parallaction/saveload.cpp:204
-msgid "Loading game..."
-msgstr "Játék betöltés..."
-
-#: engines/parallaction/saveload.cpp:219
-msgid "Saving game..."
-msgstr "Játék mentés..."
-
-#: engines/parallaction/saveload.cpp:272
-msgid ""
-"ScummVM found that you have old savefiles for Nippon Safes that should be "
-"renamed.\n"
-"The old names are 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 next time.\n"
-msgstr ""
-"ScummVM régi játékmentést talált a Nippon Safes hez ezt át kell nevezni.\n"
-"A régi játékmentés nem támogatott, ezért a játék nem töltõdik be átnevezés "
-"nélkül..\n"
-"\n"
-"Nyomj OK-t az átalakításhoz, vagy rákérdezzek ha legközelebb elindítod a "
-"játékot.\n"
-
-#: engines/parallaction/saveload.cpp:319
-msgid "ScummVM successfully converted all your savefiles."
-msgstr "ScummVM konvertálta az összes játékállásodat."
-
-#: engines/parallaction/saveload.cpp:321
-msgid ""
-"ScummVM printed some warnings in your console window and can't guarantee all "
-"your files have been converted.\n"
-"\n"
-"Please report to the team."
-msgstr ""
-"ScummVM kiírt néhány figyelmeztetést a konzolablakba és nem biztos hogy az "
-"összes fájlod át lett alakítva.\n"
-"\n"
-"Légyszíves jelentsd a csapatnak."
-
-#: engines/pegasus/pegasus.cpp:679
-msgid "Invalid save file name"
-msgstr "Érvénytelen mentés fájlnév"
-
-#: engines/pegasus/pegasus.cpp:2445
-msgid "Up/Zoom In/Move Forward/Open Doors"
-msgstr "Fel/Nagyítás/Elõre mozgás/Ajtónyitás"
-
-#: engines/pegasus/pegasus.cpp:2446
-msgid "Down/Zoom Out"
-msgstr "Le/Zoom Ki"
-
-#: engines/pegasus/pegasus.cpp:2449
-msgid "Display/Hide Inventory Tray"
-msgstr "Tárgylista tálca Képre/Elrejt"
-
-#: engines/pegasus/pegasus.cpp:2450
-msgid "Display/Hide Biochip Tray"
-msgstr "Biochip tálca Képre/Elrejt"
-
-#: engines/pegasus/pegasus.cpp:2451
-msgid "Action/Select"
-msgstr "Akció/Választ"
-
-#: engines/pegasus/pegasus.cpp:2452
-msgid "Toggle Center Data Display"
-msgstr "Adatképernyõ kapcsoló"
-
-#: engines/pegasus/pegasus.cpp:2453
-msgid "Display/Hide Info Screen"
-msgstr "Infóképernyõ Képre/Elrejt"
-
-#: engines/pegasus/pegasus.cpp:2454
-msgid "Display/Hide Pause Menu"
-msgstr "Szünet menü Képre/Elrejt"
-
-#: engines/pegasus/pegasus.cpp:2455
-msgid "???"
-msgstr "???"
-
-#: audio/fmopl.cpp:49
-msgid "MAME OPL emulator"
-msgstr "MAME OPL emulátor"
-
-#: audio/fmopl.cpp:51
-msgid "DOSBox OPL emulator"
-msgstr "DOSBox OPL emulátor"
-
-#: audio/mididrv.cpp:209
-#, c-format
-msgid ""
-"The selected audio device '%s' was not found (e.g. might be turned off or "
-"disconnected)."
-msgstr ""
-"A kiválasztott '%s' hangeszköz nem található (Lekapcsoltad, vagy kihúztad)."
-
-#: audio/mididrv.cpp:209 audio/mididrv.cpp:221 audio/mididrv.cpp:257
-#: audio/mididrv.cpp:272
-msgid "Attempting to fall back to the next available device..."
-msgstr "A következõ elérhetõ eszköz keresése..."
-
-#: audio/mididrv.cpp:221
-#, c-format
-msgid ""
-"The selected audio device '%s' cannot be used. See log file for more "
-"information."
-msgstr ""
-"A kiválasztott '%s' hangeszköz nem használható. Bõvebb információ a "
-"naplófájlban."
-
-#: audio/mididrv.cpp:257
-#, c-format
-msgid ""
-"The preferred audio device '%s' was not found (e.g. might be turned off or "
-"disconnected)."
-msgstr ""
-"Az elsõdleges '%s' hangeszköz nem található (Lekapcsoltad, vagy kihúztad)."
-
-#: audio/mididrv.cpp:272
-#, c-format
-msgid ""
-"The preferred audio device '%s' cannot be used. See log file for more "
-"information."
-msgstr ""
-"Az elsõdleges '%s' hangeszköz nem használható. Bõvebb információ a "
-"naplófájlban."
-
-#: audio/null.h:43
-msgid "No music"
-msgstr "Nincs zene"
-
-#: audio/mods/paula.cpp:189
-msgid "Amiga Audio Emulator"
-msgstr "Amiga Audió Emulátor"
-
-#: audio/softsynth/adlib.cpp:2284
-msgid "AdLib Emulator"
-msgstr "AdLib Emulátor"
-
-#: audio/softsynth/appleiigs.cpp:33
-msgid "Apple II GS Emulator (NOT IMPLEMENTED)"
-msgstr "Apple II GS Emulátor (NEM TÁMOGATOTT)"
-
-#: audio/softsynth/sid.cpp:1430
-msgid "C64 Audio Emulator"
-msgstr "C64 Audio Emulátor"
-
-#: audio/softsynth/mt32.cpp:205
-msgid "Initializing MT-32 Emulator"
-msgstr "MT-32 Emulátor inicializálása"
-
-#: audio/softsynth/mt32.cpp:431
-msgid "MT-32 Emulator"
-msgstr "MT-32 Emulátor"
-
-#: audio/softsynth/pcspk.cpp:139
-msgid "PC Speaker Emulator"
-msgstr "PC Speaker Emulátor"
-
-#: audio/softsynth/pcspk.cpp:158
-msgid "IBM PCjr Emulator"
-msgstr "IBM PCjr Emulátor"
-
-#: backends/keymapper/remap-dialog.cpp:47
-msgid "Keymap:"
-msgstr "Billentyûzet kiosztás:"
-
-#: backends/keymapper/remap-dialog.cpp:66
-msgid " (Effective)"
-msgstr " (Tényleges)"
-
-#: backends/keymapper/remap-dialog.cpp:106
-msgid " (Active)"
-msgstr " (Aktív)"
-
-#: backends/keymapper/remap-dialog.cpp:106
-msgid " (Blocked)"
-msgstr " (Blokkolt)"
-
-#: backends/keymapper/remap-dialog.cpp:119
-msgid " (Global)"
-msgstr " (Globális)"
-
-#: backends/keymapper/remap-dialog.cpp:127
-msgid " (Game)"
-msgstr " (Játék)"
-
-#: backends/midi/windows.cpp:164
-msgid "Windows MIDI"
-msgstr "Windows MIDI"
-
-#: backends/platform/ds/arm9/source/dsoptions.cpp:57
-msgid "ScummVM Main Menu"
-msgstr "ScummVM Fõmenü"
-
-#: backends/platform/ds/arm9/source/dsoptions.cpp:63
-msgid "~L~eft handed mode"
-msgstr "Balkezes mód:"
-
-#: backends/platform/ds/arm9/source/dsoptions.cpp:64
-msgid "~I~ndy fight controls"
-msgstr "~I~ndy fight controls"
-
-#: backends/platform/ds/arm9/source/dsoptions.cpp:65
-msgid "Show mouse cursor"
-msgstr "Egérkurzor látszik"
-
-#: backends/platform/ds/arm9/source/dsoptions.cpp:66
-msgid "Snap to edges"
-msgstr "Élekre illesztés"
-
-#: backends/platform/ds/arm9/source/dsoptions.cpp:68
-msgid "Touch X Offset"
-msgstr "Touch X Eltolás"
-
-#: backends/platform/ds/arm9/source/dsoptions.cpp:75
-msgid "Touch Y Offset"
-msgstr "Touch Y Eltolás"
-
-#: backends/platform/ds/arm9/source/dsoptions.cpp:87
-msgid "Use laptop trackpad-style cursor control"
-msgstr "Laptop trackpad stílusu kurzor vezérlõ"
-
-#: backends/platform/ds/arm9/source/dsoptions.cpp:88
-msgid "Tap for left click, double tap right click"
-msgstr "Érintés balkatt, duplaérintés jobbkatt"
-
-#: backends/platform/ds/arm9/source/dsoptions.cpp:90
-msgid "Sensitivity"
-msgstr "Érzékenység"
-
-#: backends/platform/ds/arm9/source/dsoptions.cpp:99
-msgid "Initial top screen scale:"
-msgstr "Képernyõ felsõ kezdõpont:"
-
-#: backends/platform/ds/arm9/source/dsoptions.cpp:105
-msgid "Main screen scaling:"
-msgstr "Fõképernyõ átméretezés:"
-
-#: backends/platform/ds/arm9/source/dsoptions.cpp:107
-msgid "Hardware scale (fast, but low quality)"
-msgstr "Hardveres átméretezés (gyors, alacsony minõség)"
-
-#: backends/platform/ds/arm9/source/dsoptions.cpp:108
-msgid "Software scale (good quality, but slower)"
-msgstr "Szoftveres átméretezés (jó minõség, lassú)"
-
-#: backends/platform/ds/arm9/source/dsoptions.cpp:109
-msgid "Unscaled (you must scroll left and right)"
-msgstr "Eredeti (görgethetsz jobbra és balra)"
-
-#: backends/platform/ds/arm9/source/dsoptions.cpp:111
-msgid "Brightness:"
-msgstr "Fényerõ:"
-
-#: backends/platform/ds/arm9/source/dsoptions.cpp:121
-msgid "High quality audio (slower) (reboot)"
-msgstr "Jóminõségü audió (lassabb)(újraindítás)"
-
-#: backends/platform/ds/arm9/source/dsoptions.cpp:122
-msgid "Disable power off"
-msgstr "Leállítás tiltva"
-
-#: backends/platform/iphone/osys_events.cpp:300
-msgid "Mouse-click-and-drag mode enabled."
-msgstr "Egér kattint-és-húz mód engedélyezve."
-
-#: backends/platform/iphone/osys_events.cpp:302
-msgid "Mouse-click-and-drag mode disabled."
-msgstr "Egér kattint-és-húz mód letiltva."
-
-#: backends/platform/iphone/osys_events.cpp:313
-msgid "Touchpad mode enabled."
-msgstr "Touchpad mód engedélyezve."
-
-#: backends/platform/iphone/osys_events.cpp:315
-msgid "Touchpad mode disabled."
-msgstr "Touchpad mód letiltva."
-
-#: backends/platform/maemo/maemo.cpp:209
-msgid "Click Mode"
-msgstr "Kattintás Mód"
-
-#: backends/platform/maemo/maemo.cpp:215
-#: 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/maemo/maemo.cpp:218
-msgid "Middle Click"
-msgstr "Középsõ katt"
-
-#: backends/platform/maemo/maemo.cpp:221
-#: 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"
-
-#: backends/platform/sdl/macosx/appmenu_osx.mm:77
-msgid "Hide ScummVM"
-msgstr "ScummVM elrejtése"
-
-#: backends/platform/sdl/macosx/appmenu_osx.mm:82
-msgid "Hide Others"
-msgstr "Többi elrejtése"
-
-#: backends/platform/sdl/macosx/appmenu_osx.mm:87
-msgid "Show All"
-msgstr "Mutasd mind"
-
-#: backends/platform/sdl/macosx/appmenu_osx.mm:109
-#: backends/platform/sdl/macosx/appmenu_osx.mm:120
-msgid "Window"
-msgstr "Ablak"
-
-#: backends/platform/sdl/macosx/appmenu_osx.mm:114
-msgid "Minimize"
-msgstr "Kis méret"
-
-#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:45
-msgid "Normal (no scaling)"
-msgstr "Normál (nincs átméretezés)"
-
-#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:64
-msgctxt "lowres"
-msgid "Normal (no scaling)"
-msgstr "Normál (nincs átméretezés)"
-
-#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2135
-#: 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:2141
-#: backends/graphics/openglsdl/openglsdl-graphics.cpp:542
-msgid "Disabled aspect ratio correction"
-msgstr "Méretarány korrekció letiltva"
-
-#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2196
-msgid "Active graphics filter:"
-msgstr "Aktív grafikus szûrõk:"
-
-#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2238
-#: backends/graphics/openglsdl/openglsdl-graphics.cpp:481
-msgid "Windowed mode"
-msgstr "Ablakos mód"
-
-#: backends/graphics/opengl/opengl-graphics.cpp:135
-msgid "OpenGL Normal"
-msgstr "OpenGL Normál"
-
-#: backends/graphics/opengl/opengl-graphics.cpp:136
-msgid "OpenGL Conserve"
-msgstr "OpenGL Megtartott"
-
-#: backends/graphics/opengl/opengl-graphics.cpp:137
-msgid "OpenGL Original"
-msgstr "OpenGL Eredeti"
-
-#: backends/graphics/openglsdl/openglsdl-graphics.cpp:415
-msgid "Current display mode"
-msgstr "Jelenlegi videómód"
-
-#: backends/graphics/openglsdl/openglsdl-graphics.cpp:428
-msgid "Current scale"
-msgstr "Aktuális méretezés"
-
-#: 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:564
-msgid "Active filter mode: Nearest"
-msgstr "Aktív filter mód: Közelítõ"
-
-#: backends/platform/symbian/src/SymbianActions.cpp:38
-#: backends/platform/wince/CEActionsSmartphone.cpp:39
-msgid "Up"
-msgstr "Fel"
-
-#: backends/platform/symbian/src/SymbianActions.cpp:39
-#: backends/platform/wince/CEActionsSmartphone.cpp:40
-msgid "Down"
-msgstr "Le"
-
-#: backends/platform/symbian/src/SymbianActions.cpp:40
-#: backends/platform/wince/CEActionsSmartphone.cpp:41
-msgid "Left"
-msgstr "Bal"
-
-#: backends/platform/symbian/src/SymbianActions.cpp:41
-#: backends/platform/wince/CEActionsSmartphone.cpp:42
-msgid "Right"
-msgstr "Jobb"
-
-#: backends/platform/symbian/src/SymbianActions.cpp:46
-#: backends/platform/wince/CEActionsSmartphone.cpp:47
-msgid "Zone"
-msgstr "Zóna"
-
-#: backends/platform/symbian/src/SymbianActions.cpp:47
-#: backends/platform/wince/CEActionsPocket.cpp:54
-#: backends/platform/wince/CEActionsSmartphone.cpp:48
-msgid "Multi Function"
-msgstr "Többfunkciós"
-
-#: backends/platform/symbian/src/SymbianActions.cpp:48
-msgid "Swap character"
-msgstr "Karakter csere"
-
-#: backends/platform/symbian/src/SymbianActions.cpp:49
-msgid "Skip text"
-msgstr "Szöveg átugrása"
-
-#: backends/platform/symbian/src/SymbianActions.cpp:51
-msgid "Fast mode"
-msgstr "Gyors mód"
-
-#: backends/platform/symbian/src/SymbianActions.cpp:53
-msgid "Debugger"
-msgstr "Hibakeresõ"
-
-#: backends/platform/symbian/src/SymbianActions.cpp:54
-msgid "Global menu"
-msgstr "Globális menü"
-
-#: backends/platform/symbian/src/SymbianActions.cpp:55
-msgid "Virtual keyboard"
-msgstr "Virtuális billentyûzet"
-
-#: backends/platform/symbian/src/SymbianActions.cpp:56
-msgid "Key mapper"
-msgstr "Billentyû kiosztás"
-
-#: backends/events/symbiansdl/symbiansdl-events.cpp:184
-msgid "Do you want to quit ?"
-msgstr "Ki akarsz lépni ?"
-
-#: backends/platform/wii/options.cpp:51
-msgid "Video"
-msgstr "Videó"
-
-#: backends/platform/wii/options.cpp:54
-msgid "Current video mode:"
-msgstr "Jelenlegi videómód:"
-
-#: backends/platform/wii/options.cpp:56
-msgid "Double-strike"
-msgstr "Dupla érintés"
-
-#: backends/platform/wii/options.cpp:60
-msgid "Horizontal underscan:"
-msgstr "Vízszintes eltolás:"
-
-#: backends/platform/wii/options.cpp:66
-msgid "Vertical underscan:"
-msgstr "Függõleges eltolás:"
-
-#: backends/platform/wii/options.cpp:71
-msgid "Input"
-msgstr "Bemenet"
-
-#: backends/platform/wii/options.cpp:74
-msgid "GC Pad sensitivity:"
-msgstr "GC Pad érzékenység:"
-
-#: backends/platform/wii/options.cpp:80
-msgid "GC Pad acceleration:"
-msgstr "GC Pad felbontás:"
-
-#: backends/platform/wii/options.cpp:86
-msgid "DVD"
-msgstr "DVD"
-
-#: backends/platform/wii/options.cpp:89 backends/platform/wii/options.cpp:101
-msgid "Status:"
-msgstr "Státusz:"
-
-#: backends/platform/wii/options.cpp:90 backends/platform/wii/options.cpp:102
-msgid "Unknown"
-msgstr "Ismeretlen"
-
-#: backends/platform/wii/options.cpp:93
-msgid "Mount DVD"
-msgstr "DVD csatolás"
-
-#: backends/platform/wii/options.cpp:94
-msgid "Unmount DVD"
-msgstr "DVD kiadás"
-
-#: backends/platform/wii/options.cpp:98
-msgid "SMB"
-msgstr "SMB"
-
-#: backends/platform/wii/options.cpp:106
-msgid "Server:"
-msgstr "Szerver:"
-
-#: backends/platform/wii/options.cpp:110
-msgid "Share:"
-msgstr "Megoszt:"
-
-#: backends/platform/wii/options.cpp:114
-msgid "Username:"
-msgstr "Felhasználó:"
-
-#: backends/platform/wii/options.cpp:118
-msgid "Password:"
-msgstr "Jelszó:"
-
-#: backends/platform/wii/options.cpp:121
-msgid "Init network"
-msgstr "Hálózat inicializálás"
-
-#: backends/platform/wii/options.cpp:123
-msgid "Mount SMB"
-msgstr "SMB csatolás"
-
-#: backends/platform/wii/options.cpp:124
-msgid "Unmount SMB"
-msgstr "SMB kiadás"
-
-#: backends/platform/wii/options.cpp:143
-msgid "DVD Mounted successfully"
-msgstr "DVD csatlakoztatva"
-
-#: backends/platform/wii/options.cpp:146
-msgid "Error while mounting the DVD"
-msgstr "Hiba a DVD csatlakoztatásakor"
-
-#: backends/platform/wii/options.cpp:148
-msgid "DVD not mounted"
-msgstr "DVD nincs csatolva"
-
-#: backends/platform/wii/options.cpp:161
-msgid "Network up, share mounted"
-msgstr "Hálózat és megosztás csatlakozva"
-
-#: backends/platform/wii/options.cpp:163
-msgid "Network up"
-msgstr "Hálózat csatlakozva"
-
-#: backends/platform/wii/options.cpp:166
-msgid ", error while mounting the share"
-msgstr ", hiba a megosztás csatolásakor"
-
-#: backends/platform/wii/options.cpp:168
-msgid ", share not mounted"
-msgstr ", megosztás nincs csatolva"
-
-#: backends/platform/wii/options.cpp:174
-msgid "Network down"
-msgstr "Nincs hálózat"
-
-#: backends/platform/wii/options.cpp:178
-msgid "Initializing network"
-msgstr "Hálózat inicializálása"
-
-#: backends/platform/wii/options.cpp:182
-msgid "Timeout while initializing network"
-msgstr "Idõtúllépés a hálózat inicializálásakor"
-
-#: backends/platform/wii/options.cpp:186
-#, c-format
-msgid "Network not initialized (%d)"
-msgstr "(%d) Hálózat nincs inicializálva"
-
-#: backends/platform/wince/CEActionsPocket.cpp:46
-msgid "Hide Toolbar"
-msgstr "Eszköztár rejtés"
-
-#: backends/platform/wince/CEActionsPocket.cpp:47
-msgid "Show Keyboard"
-msgstr "Billentyûzet megjelenítés"
-
-#: backends/platform/wince/CEActionsPocket.cpp:48
-msgid "Sound on/off"
-msgstr "Hang be/ki"
-
-#: backends/platform/wince/CEActionsPocket.cpp:49
-msgid "Right click"
-msgstr "Jobb katt"
-
-#: backends/platform/wince/CEActionsPocket.cpp:50
-msgid "Show/Hide Cursor"
-msgstr "Kurzor be/ki"
-
-#: backends/platform/wince/CEActionsPocket.cpp:51
-msgid "Free look"
-msgstr "Szabad nézet"
-
-#: backends/platform/wince/CEActionsPocket.cpp:52
-msgid "Zoom up"
-msgstr "Nagyítás"
-
-#: backends/platform/wince/CEActionsPocket.cpp:53
-msgid "Zoom down"
-msgstr "Kicsinyítés"
-
-#: backends/platform/wince/CEActionsPocket.cpp:55
-#: backends/platform/wince/CEActionsSmartphone.cpp:49
-msgid "Bind Keys"
-msgstr "Kapcsolódás kulcsok"
-
-#: backends/platform/wince/CEActionsPocket.cpp:56
-msgid "Cursor Up"
-msgstr "Kurzor Fel"
-
-#: backends/platform/wince/CEActionsPocket.cpp:57
-msgid "Cursor Down"
-msgstr "Kurzor Le"
-
-#: backends/platform/wince/CEActionsPocket.cpp:58
-msgid "Cursor Left"
-msgstr "Kurzor Bal"
-
-#: backends/platform/wince/CEActionsPocket.cpp:59
-msgid "Cursor Right"
-msgstr "Kurzor Jobb"
-
-#: 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:326
-#: backends/platform/wince/CEActionsSmartphone.cpp:287
-msgid " Are you sure you want to quit ? "
-msgstr " Biztos hogy ki akarsz lépni ? "
-
-#: backends/platform/wince/CEActionsSmartphone.cpp:50
-msgid "Keyboard"
-msgstr "Billentyûzet"
-
-#: backends/platform/wince/CEActionsSmartphone.cpp:51
-msgid "Rotate"
-msgstr "Forgatás"
-
-#: backends/platform/wince/CELauncherDialog.cpp:56
-msgid "Using SDL driver "
-msgstr "SDL meghajtó használata"
-
-#: backends/platform/wince/CELauncherDialog.cpp:60
-msgid "Display "
-msgstr "Kijelzõ"
-
-#: 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:515
-msgid "Map right click action"
-msgstr "Jobbkatt mûvelet gomb"
-
-#: 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:528
-msgid "Map hide toolbar action"
-msgstr "Eszköztár rejtés gomb"
-
-#: 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:541
-msgid "Map Zoom Up action (optional)"
-msgstr "Nagyítás mûvelet (opcionális)"
-
-#: 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:552
-msgid ""
-"Don't forget to map a key to 'Hide Toolbar' action to see the whole inventory"
-msgstr ""
-"Ne felejts billentyût társítani az 'Eszköztár rejtés' mûvelethez, hogy lásd "
-"a teljes listát"
-
-#: backends/events/default/default-events.cpp:193
-msgid "Do you really want to return to the Launcher?"
-msgstr "Biztos hogy visszatérsz az indítópulthoz?"
-
-#: backends/events/default/default-events.cpp:193
-msgid "Launcher"
-msgstr "Indítópult"
-
-#: backends/events/default/default-events.cpp:215
-msgid "Do you really want to quit?"
-msgstr "Biztos hogy ki akarsz lépni ?"
-
-#: backends/events/gph/gph-events.cpp:386
-#: backends/events/gph/gph-events.cpp:429
-#: backends/events/openpandora/op-events.cpp:168
-msgid "Touchscreen 'Tap Mode' - Left Click"
-msgstr "Érintõképernyõ 'Tap Mód' - Bal katt"
-
-#: backends/events/gph/gph-events.cpp:388
-#: backends/events/gph/gph-events.cpp:431
-#: backends/events/openpandora/op-events.cpp:170
-msgid "Touchscreen 'Tap Mode' - Right Click"
-msgstr "Érintõképernyõ 'Tap Mód' - Jobb katt"
-
-#: backends/events/gph/gph-events.cpp:390
-#: backends/events/gph/gph-events.cpp:433
-#: backends/events/openpandora/op-events.cpp:172
-msgid "Touchscreen 'Tap Mode' - Hover (No Click)"
-msgstr "Érintõképernyõ 'Tap Mód' - Lebegõ (Nincs katt)"
-
-#: backends/events/gph/gph-events.cpp:410
-msgid "Maximum Volume"
-msgstr "Maximum Hangerõ"
+#~ msgctxt "lowres"
+#~ msgid "Mass Add..."
+#~ msgstr "Masszív mód..."
-#: backends/events/gph/gph-events.cpp:412
-msgid "Increasing Volume"
-msgstr "Hangerõ növelése"
+#~ msgid "Mass Add..."
+#~ msgstr "Masszív mód..."
-#: backends/events/gph/gph-events.cpp:418
-msgid "Minimal Volume"
-msgstr "Minimum Hangerõ"
+#~ msgid ""
+#~ "Turns off General MIDI mapping for games with Roland MT-32 soundtrack"
+#~ msgstr "General MIDI leképezés Roland MT-32 zenés játékokhoz kikapcsolva"
-#: backends/events/gph/gph-events.cpp:420
-msgid "Decreasing Volume"
-msgstr "Hangerõ csökkentése"
+#~ msgid "Standard (16bpp)"
+#~ msgstr "Standard (16bpp)"
-#: backends/events/openpandora/op-events.cpp:174
-msgid "Touchscreen 'Tap Mode' - Hover (DPad Clicks)"
-msgstr "Érintõképernyõ 'Érintésmód' - Lebegõ (DPad katt)"
+#~ msgid "Alternative intro"
+#~ msgstr "Alternatív intro"
-#: backends/updates/macosx/macosx-updates.mm:67
-msgid "Check for Updates..."
-msgstr "Frissítések keresése..."
+#~ msgid "Use an alternative game intro (CD version only)"
+#~ msgstr "Alternatív játékintro használata (csak CD verziónál)"
-#: backends/platform/bada/form.cpp:269
-msgid "Right Click Once"
-msgstr "Jobb katt egyszer"
+#~ msgid "MPEG2 cutscenes are no longer supported"
+#~ msgstr "MPEG2 átvezetõk már nem támogatottak"
-#: backends/platform/bada/form.cpp:277
-msgid "Move Only"
-msgstr "Csak lépés"
+#~ msgid "OpenGL Normal"
+#~ msgstr "OpenGL Normál"
-#: backends/platform/bada/form.cpp:291
-msgid "Escape Key"
-msgstr "Escape gomb"
+#~ msgid "OpenGL Conserve"
+#~ msgstr "OpenGL Megtartott"
-#: backends/platform/bada/form.cpp:296
-msgid "Game Menu"
-msgstr "Játék Menü"
+#~ msgid "OpenGL Original"
+#~ msgstr "OpenGL Eredeti"
-#: backends/platform/bada/form.cpp:301
-msgid "Show Keypad"
-msgstr "Kézi billentyûzet"
+#~ msgid "Current display mode"
+#~ msgstr "Jelenlegi videómód"
-#: backends/platform/bada/form.cpp:309
-msgid "Control Mouse"
-msgstr "Egér irányitás"
+#~ msgid "Current scale"
+#~ msgstr "Aktuális méretezés"
-#: backends/events/maemosdl/maemosdl-events.cpp:192
-msgid "Clicking Enabled"
-msgstr "Kattintás engedve"
+#~ msgid "Active filter mode: Linear"
+#~ msgstr "Aktív filter mód: Lineáris"
-#: backends/events/maemosdl/maemosdl-events.cpp:192
-msgid "Clicking Disabled"
-msgstr "Kattintás tiltva"
+#~ msgid "Active filter mode: Nearest"
+#~ msgstr "Aktív filter mód: Közelítõ"
#~ msgid "Enable Roland GS Mode"
#~ msgstr "Roland GS Mód engedélyezve"
diff --git a/po/it_IT.po b/po/it_IT.po
index cd449c269a..7f5e685222 100644
--- a/po/it_IT.po
+++ b/po/it_IT.po
@@ -1,5 +1,5 @@
# Italian translation for ScummVM.
-# Copyright (C) 2010-2013 ScummVM Team
+# Copyright (C) 2010-2014 ScummVM Team
# This file is distributed under the same license as the ScummVM package.
# Matteo 'Maff' Angelino <matteo.maff at gmail dot com>, 2010.
#
@@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: ScummVM 1.3.0svn\n"
"Report-Msgid-Bugs-To: scummvm-devel@lists.sf.net\n"
-"POT-Creation-Date: 2013-04-24 13:35+0100\n"
+"POT-Creation-Date: 2014-06-07 23:06+0100\n"
"PO-Revision-Date: 2013-04-27 11:41+0100\n"
"Last-Translator: Matteo 'Maff' Angelino <matteo.maff at gmail dot com>\n"
"Language-Team: Italian\n"
@@ -16,77 +16,77 @@ msgstr ""
"Content-Type: text/plain; charset=iso-8859-1\n"
"Content-Transfer-Encoding: 8bit\n"
-#: gui/about.cpp:93
+#: gui/about.cpp:94
#, c-format
msgid "(built on %s)"
msgstr "(build creata il %s)"
-#: gui/about.cpp:100
+#: gui/about.cpp:101
msgid "Features compiled in:"
msgstr "Funzionalità compilate in:"
-#: gui/about.cpp:109
+#: gui/about.cpp:110
msgid "Available engines:"
msgstr "Motori disponibili:"
-#: gui/browser.cpp:67
+#: gui/browser.cpp:68
msgid "Show hidden files"
msgstr "Mostra file nascosti"
-#: gui/browser.cpp:67
+#: gui/browser.cpp:68
msgid "Show files marked with the hidden attribute"
msgstr "Mostra file contrassegnati come nascosti"
-#: gui/browser.cpp:71
+#: gui/browser.cpp:72
msgid "Go up"
msgstr "Cartella superiore"
-#: gui/browser.cpp:71 gui/browser.cpp:73
+#: gui/browser.cpp:72 gui/browser.cpp:74
msgid "Go to previous directory level"
msgstr "Vai alla cartella superiore"
-#: gui/browser.cpp:73
+#: gui/browser.cpp:74
msgctxt "lowres"
msgid "Go up"
msgstr "Su"
-#: gui/browser.cpp:74 gui/chooser.cpp:45 gui/KeysDialog.cpp:43
-#: gui/launcher.cpp:345 gui/massadd.cpp:94 gui/options.cpp:1238
-#: gui/saveload-dialog.cpp:215 gui/saveload-dialog.cpp:275
-#: gui/saveload-dialog.cpp:545 gui/saveload-dialog.cpp:919
-#: gui/themebrowser.cpp:54 gui/fluidsynth-dialog.cpp:151
-#: engines/engine.cpp:447 engines/drascula/saveload.cpp:51
-#: engines/scumm/dialogs.cpp:190 engines/sword1/control.cpp:865
-#: engines/parallaction/saveload.cpp:274 backends/platform/wii/options.cpp:48
-#: backends/events/default/default-events.cpp:193
-#: backends/events/default/default-events.cpp:215
+#: gui/browser.cpp:75 gui/chooser.cpp:46 gui/KeysDialog.cpp:43
+#: gui/launcher.cpp:351 gui/massadd.cpp:95 gui/options.cpp:1239
+#: gui/saveload-dialog.cpp:216 gui/saveload-dialog.cpp:276
+#: gui/saveload-dialog.cpp:547 gui/saveload-dialog.cpp:922
+#: gui/themebrowser.cpp:55 gui/fluidsynth-dialog.cpp:152
+#: engines/engine.cpp:452 backends/platform/wii/options.cpp:48
+#: backends/events/default/default-events.cpp:196
+#: backends/events/default/default-events.cpp:218
+#: engines/drascula/saveload.cpp:49 engines/parallaction/saveload.cpp:274
+#: engines/scumm/dialogs.cpp:191 engines/sword1/control.cpp:865
msgid "Cancel"
msgstr "Annulla"
-#: gui/browser.cpp:75 gui/chooser.cpp:46 gui/themebrowser.cpp:55
+#: gui/browser.cpp:76 gui/chooser.cpp:47 gui/themebrowser.cpp:56
msgid "Choose"
msgstr "Scegli"
-#: gui/gui-manager.cpp:115 engines/scumm/help.cpp:125
-#: engines/scumm/help.cpp:140 engines/scumm/help.cpp:165
-#: engines/scumm/help.cpp:191 engines/scumm/help.cpp:209
-#: backends/keymapper/remap-dialog.cpp:52
+#: gui/gui-manager.cpp:117 backends/keymapper/remap-dialog.cpp:53
+#: engines/scumm/help.cpp:125 engines/scumm/help.cpp:140
+#: engines/scumm/help.cpp:165 engines/scumm/help.cpp:191
+#: engines/scumm/help.cpp:209
msgid "Close"
msgstr "Chiudi"
-#: gui/gui-manager.cpp:118
+#: gui/gui-manager.cpp:120
msgid "Mouse click"
msgstr "Clic del mouse"
-#: gui/gui-manager.cpp:122 base/main.cpp:301
+#: gui/gui-manager.cpp:124 base/main.cpp:319
msgid "Display keyboard"
msgstr "Mostra tastiera"
-#: gui/gui-manager.cpp:126 base/main.cpp:305
+#: gui/gui-manager.cpp:128 base/main.cpp:323
msgid "Remap keys"
msgstr "Riprogramma tasti"
-#: gui/gui-manager.cpp:129 base/main.cpp:308
+#: gui/gui-manager.cpp:131 base/main.cpp:326
msgid "Toggle FullScreen"
msgstr "Attiva / disattiva schermo intero"
@@ -98,21 +98,21 @@ msgstr "Scegli un'azione da mappare"
msgid "Map"
msgstr "Mappa"
-#: gui/KeysDialog.cpp:42 gui/launcher.cpp:346 gui/launcher.cpp:1001
-#: gui/launcher.cpp:1005 gui/massadd.cpp:91 gui/options.cpp:1239
-#: gui/saveload-dialog.cpp:920 gui/fluidsynth-dialog.cpp:152
-#: engines/engine.cpp:366 engines/engine.cpp:377
-#: engines/drascula/saveload.cpp:51 engines/scumm/dialogs.cpp:192
-#: engines/scumm/scumm.cpp:1778 engines/agos/animation.cpp:558
-#: engines/groovie/script.cpp:420 engines/sky/compact.cpp:131
-#: engines/sky/compact.cpp:141 engines/sword1/animation.cpp:519
-#: engines/sword1/animation.cpp:540 engines/sword1/animation.cpp:550
-#: engines/sword1/animation.cpp:557 engines/sword1/control.cpp:865
-#: engines/sword1/logic.cpp:1633 engines/sword2/animation.cpp:419
-#: engines/sword2/animation.cpp:439 engines/sword2/animation.cpp:449
-#: engines/sword2/animation.cpp:458 engines/parallaction/saveload.cpp:274
+#: gui/KeysDialog.cpp:42 gui/launcher.cpp:352 gui/launcher.cpp:1048
+#: gui/launcher.cpp:1052 gui/massadd.cpp:92 gui/options.cpp:1240
+#: gui/saveload-dialog.cpp:923 gui/fluidsynth-dialog.cpp:153
+#: engines/engine.cpp:371 engines/engine.cpp:382
#: backends/platform/wii/options.cpp:47
#: backends/platform/wince/CELauncherDialog.cpp:54
+#: engines/agos/animation.cpp:558 engines/drascula/saveload.cpp:49
+#: engines/groovie/script.cpp:399 engines/parallaction/saveload.cpp:274
+#: engines/scumm/dialogs.cpp:193 engines/scumm/scumm.cpp:1779
+#: engines/sky/compact.cpp:131 engines/sky/compact.cpp:141
+#: engines/sword1/animation.cpp:524 engines/sword1/animation.cpp:545
+#: engines/sword1/animation.cpp:561 engines/sword1/animation.cpp:569
+#: engines/sword1/control.cpp:865 engines/sword1/logic.cpp:1633
+#: engines/sword2/animation.cpp:425 engines/sword2/animation.cpp:445
+#: engines/sword2/animation.cpp:461 engines/sword2/animation.cpp:471
msgid "OK"
msgstr "OK"
@@ -138,15 +138,15 @@ msgstr "Seleziona un'azione"
msgid "Press the key to associate"
msgstr "Premi il tasto da associare"
-#: gui/launcher.cpp:187
+#: gui/launcher.cpp:193
msgid "Game"
msgstr "Gioco"
-#: gui/launcher.cpp:191
+#: gui/launcher.cpp:197
msgid "ID:"
msgstr "ID:"
-#: gui/launcher.cpp:191 gui/launcher.cpp:193 gui/launcher.cpp:194
+#: gui/launcher.cpp:197 gui/launcher.cpp:199 gui/launcher.cpp:200
msgid ""
"Short game identifier used for referring to savegames and running the game "
"from the command line"
@@ -154,315 +154,316 @@ msgstr ""
"Breve identificatore di gioco utilizzato per il riferimento a salvataggi e "
"per l'esecuzione del gioco dalla riga di comando"
-#: gui/launcher.cpp:193
+#: gui/launcher.cpp:199
msgctxt "lowres"
msgid "ID:"
msgstr "ID:"
-#: gui/launcher.cpp:198
+#: gui/launcher.cpp:204
msgid "Name:"
msgstr "Nome:"
-#: gui/launcher.cpp:198 gui/launcher.cpp:200 gui/launcher.cpp:201
+#: gui/launcher.cpp:204 gui/launcher.cpp:206 gui/launcher.cpp:207
msgid "Full title of the game"
msgstr "Titolo completo del gioco"
-#: gui/launcher.cpp:200
+#: gui/launcher.cpp:206
msgctxt "lowres"
msgid "Name:"
msgstr "Nome:"
-#: gui/launcher.cpp:204
+#: gui/launcher.cpp:210
msgid "Language:"
msgstr "Lingua:"
-#: gui/launcher.cpp:204 gui/launcher.cpp:205
+#: gui/launcher.cpp:210 gui/launcher.cpp:211
msgid ""
"Language of the game. This will not turn your Spanish game version into "
"English"
msgstr ""
"Lingua del gioco. Un gioco inglese non potrà risultare tradotto in italiano"
-#: gui/launcher.cpp:206 gui/launcher.cpp:220 gui/options.cpp:86
-#: gui/options.cpp:736 gui/options.cpp:749 gui/options.cpp:1209
-#: audio/null.cpp:40
+#: gui/launcher.cpp:212 gui/launcher.cpp:226 gui/options.cpp:87
+#: gui/options.cpp:737 gui/options.cpp:750 gui/options.cpp:1210
+#: audio/null.cpp:41
msgid "<default>"
msgstr "<predefinito>"
-#: gui/launcher.cpp:216
+#: gui/launcher.cpp:222
msgid "Platform:"
msgstr "Piattaforma:"
-#: gui/launcher.cpp:216 gui/launcher.cpp:218 gui/launcher.cpp:219
+#: gui/launcher.cpp:222 gui/launcher.cpp:224 gui/launcher.cpp:225
msgid "Platform the game was originally designed for"
msgstr "La piattaforma per la quale il gioco è stato concepito"
-#: gui/launcher.cpp:218
+#: gui/launcher.cpp:224
msgctxt "lowres"
msgid "Platform:"
msgstr "Piattaf.:"
-#: gui/launcher.cpp:231
+#: gui/launcher.cpp:237
msgid "Engine"
msgstr "Motore"
-#: gui/launcher.cpp:239 gui/options.cpp:1072 gui/options.cpp:1089
+#: gui/launcher.cpp:245 gui/options.cpp:1073 gui/options.cpp:1090
msgid "Graphics"
msgstr "Grafica"
-#: gui/launcher.cpp:239 gui/options.cpp:1072 gui/options.cpp:1089
+#: gui/launcher.cpp:245 gui/options.cpp:1073 gui/options.cpp:1090
msgid "GFX"
msgstr "Grafica"
-#: gui/launcher.cpp:242
+#: gui/launcher.cpp:248
msgid "Override global graphic settings"
msgstr "Ignora le impostazioni grafiche globali"
-#: gui/launcher.cpp:244
+#: gui/launcher.cpp:250
msgctxt "lowres"
msgid "Override global graphic settings"
msgstr "Ignora le impostazioni grafiche globali"
-#: gui/launcher.cpp:251 gui/options.cpp:1095
+#: gui/launcher.cpp:257 gui/options.cpp:1096
msgid "Audio"
msgstr "Audio"
-#: gui/launcher.cpp:254
+#: gui/launcher.cpp:260
msgid "Override global audio settings"
msgstr "Ignora le impostazioni audio globali"
-#: gui/launcher.cpp:256
+#: gui/launcher.cpp:262
msgctxt "lowres"
msgid "Override global audio settings"
msgstr "Ignora le impostazioni audio globali"
-#: gui/launcher.cpp:265 gui/options.cpp:1100
+#: gui/launcher.cpp:271 gui/options.cpp:1101
msgid "Volume"
msgstr "Volume"
-#: gui/launcher.cpp:267 gui/options.cpp:1102
+#: gui/launcher.cpp:273 gui/options.cpp:1103
msgctxt "lowres"
msgid "Volume"
msgstr "Volume"
-#: gui/launcher.cpp:270
+#: gui/launcher.cpp:276
msgid "Override global volume settings"
msgstr "Ignora le impostazioni globali di volume"
-#: gui/launcher.cpp:272
+#: gui/launcher.cpp:278
msgctxt "lowres"
msgid "Override global volume settings"
msgstr "Ignora le impostazioni globali di volume"
-#: gui/launcher.cpp:280 gui/options.cpp:1110
+#: gui/launcher.cpp:286 gui/options.cpp:1111
msgid "MIDI"
msgstr "MIDI"
-#: gui/launcher.cpp:283
+#: gui/launcher.cpp:289
msgid "Override global MIDI settings"
msgstr "Ignora le impostazioni MIDI globali"
-#: gui/launcher.cpp:285
+#: gui/launcher.cpp:291
msgctxt "lowres"
msgid "Override global MIDI settings"
msgstr "Ignora le impostazioni MIDI globali"
-#: gui/launcher.cpp:294 gui/options.cpp:1116
+#: gui/launcher.cpp:300 gui/options.cpp:1117
msgid "MT-32"
msgstr "MT-32"
-#: gui/launcher.cpp:297
+#: gui/launcher.cpp:303
msgid "Override global MT-32 settings"
msgstr "Ignora le impostazioni MT-32 globali"
-#: gui/launcher.cpp:299
+#: gui/launcher.cpp:305
msgctxt "lowres"
msgid "Override global MT-32 settings"
msgstr "Ignora le impostazioni MT-32 globali"
-#: gui/launcher.cpp:308 gui/options.cpp:1123
+#: gui/launcher.cpp:314 gui/options.cpp:1124
msgid "Paths"
msgstr "Percorsi"
-#: gui/launcher.cpp:310 gui/options.cpp:1125
+#: gui/launcher.cpp:316 gui/options.cpp:1126
msgctxt "lowres"
msgid "Paths"
msgstr "Perc."
-#: gui/launcher.cpp:317
+#: gui/launcher.cpp:323
msgid "Game Path:"
msgstr "Percorso gioco:"
-#: gui/launcher.cpp:319
+#: gui/launcher.cpp:325
msgctxt "lowres"
msgid "Game Path:"
msgstr "Perc. gioco:"
-#: gui/launcher.cpp:324 gui/options.cpp:1149
+#: gui/launcher.cpp:330 gui/options.cpp:1150
msgid "Extra Path:"
msgstr "Percorso extra:"
-#: gui/launcher.cpp:324 gui/launcher.cpp:326 gui/launcher.cpp:327
+#: gui/launcher.cpp:330 gui/launcher.cpp:332 gui/launcher.cpp:333
msgid "Specifies path to additional data used the game"
msgstr "Specifica il percorso di ulteriori dati usati dal gioco"
-#: gui/launcher.cpp:326 gui/options.cpp:1151
+#: gui/launcher.cpp:332 gui/options.cpp:1152
msgctxt "lowres"
msgid "Extra Path:"
msgstr "Perc. extra:"
-#: gui/launcher.cpp:333 gui/options.cpp:1133
+#: gui/launcher.cpp:339 gui/options.cpp:1134
msgid "Save Path:"
msgstr "Salvataggi:"
-#: gui/launcher.cpp:333 gui/launcher.cpp:335 gui/launcher.cpp:336
-#: gui/options.cpp:1133 gui/options.cpp:1135 gui/options.cpp:1136
+#: gui/launcher.cpp:339 gui/launcher.cpp:341 gui/launcher.cpp:342
+#: gui/options.cpp:1134 gui/options.cpp:1136 gui/options.cpp:1137
msgid "Specifies where your savegames are put"
msgstr "Specifica dove archiviare i salvataggi"
-#: gui/launcher.cpp:335 gui/options.cpp:1135
+#: gui/launcher.cpp:341 gui/options.cpp:1136
msgctxt "lowres"
msgid "Save Path:"
msgstr "Salvataggi:"
-#: gui/launcher.cpp:354 gui/launcher.cpp:453 gui/launcher.cpp:511
-#: gui/launcher.cpp:565 gui/options.cpp:1144 gui/options.cpp:1152
-#: gui/options.cpp:1161 gui/options.cpp:1276 gui/options.cpp:1282
-#: gui/options.cpp:1290 gui/options.cpp:1320 gui/options.cpp:1326
-#: gui/options.cpp:1333 gui/options.cpp:1426 gui/options.cpp:1429
-#: gui/options.cpp:1441
+#: gui/launcher.cpp:360 gui/launcher.cpp:459 gui/launcher.cpp:517
+#: gui/launcher.cpp:571 gui/options.cpp:1145 gui/options.cpp:1153
+#: gui/options.cpp:1162 gui/options.cpp:1277 gui/options.cpp:1283
+#: gui/options.cpp:1291 gui/options.cpp:1321 gui/options.cpp:1327
+#: gui/options.cpp:1334 gui/options.cpp:1427 gui/options.cpp:1430
+#: gui/options.cpp:1442
msgctxt "path"
msgid "None"
msgstr "Nessuno"
-#: gui/launcher.cpp:359 gui/launcher.cpp:459 gui/launcher.cpp:569
-#: gui/options.cpp:1270 gui/options.cpp:1314 gui/options.cpp:1432
+#: gui/launcher.cpp:365 gui/launcher.cpp:465 gui/launcher.cpp:575
+#: gui/options.cpp:1271 gui/options.cpp:1315 gui/options.cpp:1433
#: backends/platform/wii/options.cpp:56
msgid "Default"
msgstr "Predefinito"
-#: gui/launcher.cpp:504 gui/options.cpp:1435
+#: gui/launcher.cpp:510 gui/options.cpp:1436
msgid "Select SoundFont"
msgstr "Seleziona SoundFont"
-#: gui/launcher.cpp:523 gui/launcher.cpp:677
+#: gui/launcher.cpp:529 gui/launcher.cpp:682
msgid "Select directory with game data"
msgstr "Seleziona la cartella contenente i file di gioco"
-#: gui/launcher.cpp:541
+#: gui/launcher.cpp:547
msgid "Select additional game directory"
msgstr "Seleziona la cartella di gioco aggiuntiva"
-#: gui/launcher.cpp:553
+#: gui/launcher.cpp:559
msgid "Select directory for saved games"
msgstr "Seleziona la cartella dei salvataggi"
-#: gui/launcher.cpp:580
+#: gui/launcher.cpp:586
msgid "This game ID is already taken. Please choose another one."
msgstr "Questo ID di gioco è già in uso. Si prega di sceglierne un'altro."
-#: gui/launcher.cpp:621 engines/dialogs.cpp:110
+#: gui/launcher.cpp:626 engines/dialogs.cpp:111
msgid "~Q~uit"
msgstr "C~h~iudi"
-#: gui/launcher.cpp:621 backends/platform/sdl/macosx/appmenu_osx.mm:95
+#: gui/launcher.cpp:626 backends/platform/sdl/macosx/appmenu_osx.mm:95
msgid "Quit ScummVM"
msgstr "Esci da ScummVM"
-#: gui/launcher.cpp:622
+#: gui/launcher.cpp:627
msgid "A~b~out..."
msgstr "~I~nfo..."
-#: gui/launcher.cpp:622 backends/platform/sdl/macosx/appmenu_osx.mm:69
+#: gui/launcher.cpp:627 backends/platform/sdl/macosx/appmenu_osx.mm:69
msgid "About ScummVM"
msgstr "Informazioni su ScummVM"
-#: gui/launcher.cpp:623
+#: gui/launcher.cpp:628
msgid "~O~ptions..."
msgstr "~O~pzioni..."
-#: gui/launcher.cpp:623
+#: gui/launcher.cpp:628
msgid "Change global ScummVM options"
msgstr "Modifica le opzioni globali di ScummVM"
-#: gui/launcher.cpp:625
+#: gui/launcher.cpp:630
msgid "~S~tart"
msgstr "~G~ioca"
-#: gui/launcher.cpp:625
+#: gui/launcher.cpp:630
msgid "Start selected game"
msgstr "Esegue il gioco selezionato"
-#: gui/launcher.cpp:628
+#: gui/launcher.cpp:633
msgid "~L~oad..."
msgstr "~C~arica..."
-#: gui/launcher.cpp:628
+#: gui/launcher.cpp:633
msgid "Load savegame for selected game"
msgstr "Carica un salvataggio del gioco selezionato"
-#: gui/launcher.cpp:633 gui/launcher.cpp:1120
+#: gui/launcher.cpp:638
msgid "~A~dd Game..."
msgstr "~A~ggiungi gioco..."
-#: gui/launcher.cpp:633 gui/launcher.cpp:640
+#: gui/launcher.cpp:638 gui/launcher.cpp:645
msgid "Hold Shift for Mass Add"
msgstr "Tieni premuto Shift per l'aggiunta in massa"
-#: gui/launcher.cpp:635
+#: gui/launcher.cpp:640
msgid "~E~dit Game..."
msgstr "~M~odifica gioco..."
-#: gui/launcher.cpp:635 gui/launcher.cpp:642
+#: gui/launcher.cpp:640 gui/launcher.cpp:647
msgid "Change game options"
msgstr "Modifica le opzioni di gioco"
-#: gui/launcher.cpp:637
+#: gui/launcher.cpp:642
msgid "~R~emove Game"
msgstr "~R~imuovi gioco"
-#: gui/launcher.cpp:637 gui/launcher.cpp:644
+#: gui/launcher.cpp:642 gui/launcher.cpp:649
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:640 gui/launcher.cpp:1120
+#: gui/launcher.cpp:645
msgctxt "lowres"
msgid "~A~dd Game..."
msgstr "~A~gg. gioco..."
-#: gui/launcher.cpp:642
+#: gui/launcher.cpp:647
msgctxt "lowres"
msgid "~E~dit Game..."
msgstr "~M~odif. gioco..."
-#: gui/launcher.cpp:644
+#: gui/launcher.cpp:649
msgctxt "lowres"
msgid "~R~emove Game"
msgstr "~R~im. gioco"
-#: gui/launcher.cpp:652
+#: gui/launcher.cpp:657
msgid "Search in game list"
msgstr "Cerca nella lista dei giochi"
-#: gui/launcher.cpp:656 gui/launcher.cpp:1167
+#: gui/launcher.cpp:661 gui/launcher.cpp:1222
msgid "Search:"
msgstr "Cerca:"
-#: gui/launcher.cpp:680 engines/dialogs.cpp:114 engines/mohawk/myst.cpp:245
-#: engines/mohawk/riven.cpp:716 engines/cruise/menu.cpp:214
-#: engines/pegasus/pegasus.cpp:349
+#: gui/launcher.cpp:685 engines/dialogs.cpp:115 engines/cruise/menu.cpp:214
+#: engines/mohawk/myst.cpp:245 engines/mohawk/riven.cpp:718
+#: engines/pegasus/pegasus.cpp:353
msgid "Load game:"
msgstr "Carica gioco:"
-#: gui/launcher.cpp:680 engines/dialogs.cpp:114 engines/scumm/dialogs.cpp:188
-#: engines/mohawk/myst.cpp:245 engines/mohawk/riven.cpp:716
-#: engines/cruise/menu.cpp:214 engines/pegasus/pegasus.cpp:349
+#: gui/launcher.cpp:685 engines/dialogs.cpp:115
#: backends/platform/wince/CEActionsPocket.cpp:267
#: backends/platform/wince/CEActionsSmartphone.cpp:231
+#: engines/cruise/menu.cpp:214 engines/mohawk/myst.cpp:245
+#: engines/mohawk/riven.cpp:718 engines/pegasus/pegasus.cpp:353
+#: engines/scumm/dialogs.cpp:189
msgid "Load"
msgstr "Carica"
-#: gui/launcher.cpp:788
+#: gui/launcher.cpp:792
msgid ""
"Do you really want to run the mass game detector? This could potentially add "
"a huge number of games."
@@ -470,7 +471,8 @@ msgstr ""
"Vuoi davvero eseguire il rilevatore di giochi in massa? Potrebbe aggiungere "
"un numero enorme di giochi."
-#: gui/launcher.cpp:789 gui/launcher.cpp:937 gui/fluidsynth-dialog.cpp:216
+#: gui/launcher.cpp:793 gui/launcher.cpp:941 gui/launcher.cpp:1000
+#: gui/fluidsynth-dialog.cpp:217
#: backends/events/symbiansdl/symbiansdl-events.cpp:184
#: backends/platform/wince/CEActionsPocket.cpp:326
#: backends/platform/wince/CEActionsSmartphone.cpp:287
@@ -478,7 +480,8 @@ msgstr ""
msgid "Yes"
msgstr "Sì"
-#: gui/launcher.cpp:789 gui/launcher.cpp:937 gui/fluidsynth-dialog.cpp:216
+#: gui/launcher.cpp:793 gui/launcher.cpp:941 gui/launcher.cpp:1000
+#: gui/fluidsynth-dialog.cpp:217
#: backends/events/symbiansdl/symbiansdl-events.cpp:184
#: backends/platform/wince/CEActionsPocket.cpp:326
#: backends/platform/wince/CEActionsSmartphone.cpp:287
@@ -486,195 +489,190 @@ msgstr "Sì"
msgid "No"
msgstr "No"
-#: gui/launcher.cpp:837
+#: gui/launcher.cpp:841
msgid "ScummVM couldn't open the specified directory!"
msgstr "ScummVM non ha potuto aprire la cartella specificata!"
-#: gui/launcher.cpp:849
+#: gui/launcher.cpp:853
msgid "ScummVM could not find any game in the specified directory!"
msgstr "ScummVM non ha potuto trovare nessun gioco nella cartella specificata!"
-#: gui/launcher.cpp:863
+#: gui/launcher.cpp:867
msgid "Pick the game:"
msgstr "Scegli il gioco:"
-#: gui/launcher.cpp:937
+#: gui/launcher.cpp:941
msgid "Do you really want to remove this game configuration?"
msgstr "Sei sicuro di voler rimuovere questa configurazione di gioco?"
-#: gui/launcher.cpp:1001
+#: gui/launcher.cpp:999
+#, fuzzy
+msgid "Do you want to load savegame?"
+msgstr "Vuoi caricare o salvare il gioco?"
+
+#: gui/launcher.cpp:1048
msgid "This game does not support loading games from the launcher."
msgstr ""
"Questo gioco non supporta il caricamento di salvataggi dalla schermata di "
"avvio."
-#: gui/launcher.cpp:1005
+#: gui/launcher.cpp:1052
msgid "ScummVM could not find any engine capable of running the selected game!"
msgstr ""
"ScummVM non ha potuto trovare un motore in grado di eseguire il gioco "
"selezionato!"
-#: gui/launcher.cpp:1119
-msgctxt "lowres"
-msgid "Mass Add..."
-msgstr "Agg. massa..."
-
-#: gui/launcher.cpp:1119
-msgid "Mass Add..."
-msgstr "Agg. in massa..."
-
-#: gui/massadd.cpp:78 gui/massadd.cpp:81
+#: gui/massadd.cpp:79 gui/massadd.cpp:82
msgid "... progress ..."
msgstr "... progresso ..."
-#: gui/massadd.cpp:258
+#: gui/massadd.cpp:259
msgid "Scan complete!"
msgstr "Scansione completa!"
-#: gui/massadd.cpp:261
+#: gui/massadd.cpp:262
#, c-format
msgid "Discovered %d new games, ignored %d previously added games."
msgstr "Rilevati %d nuovi giochi, ignorati %d giochi aggiunti in precedenza."
-#: gui/massadd.cpp:265
+#: gui/massadd.cpp:266
#, c-format
msgid "Scanned %d directories ..."
msgstr "%d cartelle analizzate..."
-#: gui/massadd.cpp:268
+#: gui/massadd.cpp:269
#, c-format
msgid "Discovered %d new games, ignored %d previously added games ..."
msgstr "Rilevati %d nuovi giochi, ignorati %d giochi aggiunti in precedenza..."
-#: gui/options.cpp:84
+#: gui/options.cpp:85
msgid "Never"
msgstr "Mai"
-#: gui/options.cpp:84
+#: gui/options.cpp:85
msgid "every 5 mins"
msgstr "ogni 5 minuti"
-#: gui/options.cpp:84
+#: gui/options.cpp:85
msgid "every 10 mins"
msgstr "ogni 10 minuti"
-#: gui/options.cpp:84
+#: gui/options.cpp:85
msgid "every 15 mins"
msgstr "ogni 15 minuti"
-#: gui/options.cpp:84
+#: gui/options.cpp:85
msgid "every 30 mins"
msgstr "ogni 30 minuti"
-#: gui/options.cpp:86
+#: gui/options.cpp:87
msgid "8 kHz"
msgstr "8 kHz"
-#: gui/options.cpp:86
+#: gui/options.cpp:87
msgid "11kHz"
msgstr "11kHz"
-#: gui/options.cpp:86
+#: gui/options.cpp:87
msgid "22 kHz"
msgstr "22 kHz"
-#: gui/options.cpp:86
+#: gui/options.cpp:87
msgid "44 kHz"
msgstr "44 kHz"
-#: gui/options.cpp:86
+#: gui/options.cpp:87
msgid "48 kHz"
msgstr "48 kHz"
-#: gui/options.cpp:254 gui/options.cpp:480 gui/options.cpp:581
-#: gui/options.cpp:650 gui/options.cpp:858
+#: gui/options.cpp:255 gui/options.cpp:481 gui/options.cpp:582
+#: gui/options.cpp:651 gui/options.cpp:859
msgctxt "soundfont"
msgid "None"
msgstr "Nessuno"
-#: gui/options.cpp:388
+#: gui/options.cpp:389
msgid "Failed to apply some of the graphic options changes:"
msgstr "Impossibile applicare alcuni dei cambiamenti nelle opzioni grafiche."
-#: gui/options.cpp:400
+#: gui/options.cpp:401
msgid "the video mode could not be changed."
msgstr "impossibile modificare la modalità video."
-#: gui/options.cpp:406
+#: gui/options.cpp:407
msgid "the fullscreen setting could not be changed"
msgstr "impossibile modificare l'impostazione schermo intero"
-#: gui/options.cpp:412
+#: gui/options.cpp:413
msgid "the aspect ratio setting could not be changed"
msgstr "impossibile modificare l'impostazione proporzioni"
-#: gui/options.cpp:733
+#: gui/options.cpp:734
msgid "Graphics mode:"
msgstr "Modalità:"
-#: gui/options.cpp:747
+#: gui/options.cpp:748
msgid "Render mode:"
msgstr "Resa grafica:"
-#: gui/options.cpp:747 gui/options.cpp:748
+#: gui/options.cpp:748 gui/options.cpp:749
msgid "Special dithering modes supported by some games"
msgstr "Modalità di resa grafica speciali supportate da alcuni giochi"
-#: gui/options.cpp:759
-#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2236
-#: backends/graphics/openglsdl/openglsdl-graphics.cpp:476
+#: gui/options.cpp:760
+#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2249
msgid "Fullscreen mode"
msgstr "Modalità a schermo intero"
-#: gui/options.cpp:762
+#: gui/options.cpp:763
msgid "Aspect ratio correction"
msgstr "Correzione proporzioni"
-#: gui/options.cpp:762
+#: gui/options.cpp:763
msgid "Correct aspect ratio for 320x200 games"
msgstr "Corregge le proporzioni dei giochi 320x200"
-#: gui/options.cpp:770
+#: gui/options.cpp:771
msgid "Preferred Device:"
msgstr "Disp. preferito:"
-#: gui/options.cpp:770
+#: gui/options.cpp:771
msgid "Music Device:"
msgstr "Dispositivo audio:"
-#: gui/options.cpp:770 gui/options.cpp:772
+#: gui/options.cpp:771 gui/options.cpp:773
msgid "Specifies preferred sound device or sound card emulator"
msgstr ""
"Specifica il dispositivo audio o l'emulatore della scheda audio preferiti"
-#: gui/options.cpp:770 gui/options.cpp:772 gui/options.cpp:773
+#: gui/options.cpp:771 gui/options.cpp:773 gui/options.cpp:774
msgid "Specifies output sound device or sound card emulator"
msgstr ""
"Specifica il dispositivo di output audio o l'emulatore della scheda audio"
-#: gui/options.cpp:772
+#: gui/options.cpp:773
msgctxt "lowres"
msgid "Preferred Dev.:"
msgstr "Disp. preferito:"
-#: gui/options.cpp:772
+#: gui/options.cpp:773
msgctxt "lowres"
msgid "Music Device:"
msgstr "Disposit. audio:"
-#: gui/options.cpp:799
+#: gui/options.cpp:800
msgid "AdLib emulator:"
msgstr "Emulatore AdLib:"
-#: gui/options.cpp:799 gui/options.cpp:800
+#: gui/options.cpp:800 gui/options.cpp:801
msgid "AdLib is used for music in many games"
msgstr "AdLib è utilizzato per la musica in molti giochi"
-#: gui/options.cpp:810
+#: gui/options.cpp:811
msgid "Output rate:"
msgstr "Frequenza:"
-#: gui/options.cpp:810 gui/options.cpp:811
+#: gui/options.cpp:811 gui/options.cpp:812
msgid ""
"Higher value specifies better sound quality but may be not supported by your "
"soundcard"
@@ -682,66 +680,66 @@ msgstr ""
"Valori più alti restituiscono un suono di maggior qualità, ma potrebbero non "
"essere supportati dalla tua scheda audio"
-#: gui/options.cpp:821
+#: gui/options.cpp:822
msgid "GM Device:"
msgstr "Dispositivo GM:"
-#: gui/options.cpp:821
+#: gui/options.cpp:822
msgid "Specifies default sound device for General MIDI output"
msgstr "Specifica il dispositivo audio predefinito per l'output General MIDI"
-#: gui/options.cpp:832
+#: gui/options.cpp:833
msgid "Don't use General MIDI music"
msgstr "Non utilizzare la musica General MIDI"
-#: gui/options.cpp:843 gui/options.cpp:909
+#: gui/options.cpp:844 gui/options.cpp:910
msgid "Use first available device"
msgstr "Utilizza il primo dispositivo disponibile"
-#: gui/options.cpp:855
+#: gui/options.cpp:856
msgid "SoundFont:"
msgstr "SoundFont:"
-#: gui/options.cpp:855 gui/options.cpp:857 gui/options.cpp:858
+#: gui/options.cpp:856 gui/options.cpp:858 gui/options.cpp:859
msgid "SoundFont is supported by some audio cards, Fluidsynth and Timidity"
msgstr "SoundFont è supportato da alcune schede audio, Fluidsynth e Timidity"
-#: gui/options.cpp:857
+#: gui/options.cpp:858
msgctxt "lowres"
msgid "SoundFont:"
msgstr "SoundFont:"
-#: gui/options.cpp:863
+#: gui/options.cpp:864
msgid "Mixed AdLib/MIDI mode"
msgstr "Modalità mista AdLib/MIDI"
-#: gui/options.cpp:863
+#: gui/options.cpp:864
msgid "Use both MIDI and AdLib sound generation"
msgstr "Utilizza generazione di suono sia MIDI che AdLib"
-#: gui/options.cpp:866
+#: gui/options.cpp:867
msgid "MIDI gain:"
msgstr "Guadagno MIDI:"
-#: gui/options.cpp:873
+#: gui/options.cpp:874
msgid "FluidSynth Settings"
msgstr "Impostazioni FluidSynth"
-#: gui/options.cpp:880
+#: gui/options.cpp:881
msgid "MT-32 Device:"
msgstr "Disposit. MT-32:"
-#: gui/options.cpp:880
+#: gui/options.cpp:881
msgid "Specifies default sound device for Roland MT-32/LAPC1/CM32l/CM64 output"
msgstr ""
"Specifica il dispositivo audio predefinito per l'output Roland MT-32/LAPC1/"
"CM32l/CM64"
-#: gui/options.cpp:885
+#: gui/options.cpp:886
msgid "True Roland MT-32 (disable GM emulation)"
msgstr "Roland MT-32 effettivo (disattiva emulazione GM)"
-#: gui/options.cpp:885 gui/options.cpp:887
+#: gui/options.cpp:886 gui/options.cpp:888
msgid ""
"Check if you want to use your real hardware Roland-compatible sound device "
"connected to your computer"
@@ -749,192 +747,193 @@ msgstr ""
"Seleziona se vuoi usare il dispositivo hardware audio compatibile con Roland "
"che è connesso al tuo computer"
-#: gui/options.cpp:887
+#: gui/options.cpp:888
msgctxt "lowres"
msgid "True Roland MT-32 (no GM emulation)"
msgstr "Roland MT-32 effettivo (disat.emul.GM)"
-#: gui/options.cpp:890
-msgid "Roland GS Mode (disable GM mapping)"
+#: gui/options.cpp:891
+#, fuzzy
+msgid "Roland GS Device (enable MT-32 mappings)"
msgstr "Modalità Roland GS (disattiva mappatura GM)"
-#: gui/options.cpp:890
-msgid "Turns off General MIDI mapping for games with Roland MT-32 soundtrack"
+#: gui/options.cpp:891
+msgid ""
+"Check if you want to enable patch mappings to emulate an MT-32 on a Roland "
+"GS device"
msgstr ""
-"Disattiva la mappatura General MIDI per i giochi con colonna sonora Roland "
-"MT-32"
-#: gui/options.cpp:899
+#: gui/options.cpp:900
msgid "Don't use Roland MT-32 music"
msgstr "Non utilizzare la musica Roland MT-32"
-#: gui/options.cpp:926
+#: gui/options.cpp:927
msgid "Text and Speech:"
msgstr "Testo e voci:"
-#: gui/options.cpp:930 gui/options.cpp:940
+#: gui/options.cpp:931 gui/options.cpp:941
msgid "Speech"
msgstr "Voci"
-#: gui/options.cpp:931 gui/options.cpp:941
+#: gui/options.cpp:932 gui/options.cpp:942
msgid "Subtitles"
msgstr "Sottotitoli"
-#: gui/options.cpp:932
+#: gui/options.cpp:933
msgid "Both"
msgstr "Entrambi"
-#: gui/options.cpp:934
+#: gui/options.cpp:935
msgid "Subtitle speed:"
msgstr "Velocità testo:"
-#: gui/options.cpp:936
+#: gui/options.cpp:937
msgctxt "lowres"
msgid "Text and Speech:"
msgstr "Testo e voci:"
-#: gui/options.cpp:940
+#: gui/options.cpp:941
msgid "Spch"
msgstr "Voci"
-#: gui/options.cpp:941
+#: gui/options.cpp:942
msgid "Subs"
msgstr "Sub"
-#: gui/options.cpp:942
+#: gui/options.cpp:943
msgctxt "lowres"
msgid "Both"
msgstr "Entr."
-#: gui/options.cpp:942
+#: gui/options.cpp:943
msgid "Show subtitles and play speech"
msgstr "Mostra i sottotitoli e attiva le voci"
-#: gui/options.cpp:944
+#: gui/options.cpp:945
msgctxt "lowres"
msgid "Subtitle speed:"
msgstr "Velocità testo:"
-#: gui/options.cpp:960
+#: gui/options.cpp:961
msgid "Music volume:"
msgstr "Volume musica:"
-#: gui/options.cpp:962
+#: gui/options.cpp:963
msgctxt "lowres"
msgid "Music volume:"
msgstr "Volume musica:"
-#: gui/options.cpp:969
+#: gui/options.cpp:970
msgid "Mute All"
msgstr "Disattiva audio"
-#: gui/options.cpp:972
+#: gui/options.cpp:973
msgid "SFX volume:"
msgstr "Volume effetti:"
-#: gui/options.cpp:972 gui/options.cpp:974 gui/options.cpp:975
+#: gui/options.cpp:973 gui/options.cpp:975 gui/options.cpp:976
msgid "Special sound effects volume"
msgstr "Volume degli effetti sonori"
-#: gui/options.cpp:974
+#: gui/options.cpp:975
msgctxt "lowres"
msgid "SFX volume:"
msgstr "Volume effetti:"
-#: gui/options.cpp:982
+#: gui/options.cpp:983
msgid "Speech volume:"
msgstr "Volume voci:"
-#: gui/options.cpp:984
+#: gui/options.cpp:985
msgctxt "lowres"
msgid "Speech volume:"
msgstr "Volume voci:"
-#: gui/options.cpp:1141
+#: gui/options.cpp:1142
msgid "Theme Path:"
msgstr "Percorso tema:"
-#: gui/options.cpp:1143
+#: gui/options.cpp:1144
msgctxt "lowres"
msgid "Theme Path:"
msgstr "Perc. tema:"
-#: gui/options.cpp:1149 gui/options.cpp:1151 gui/options.cpp:1152
+#: gui/options.cpp:1150 gui/options.cpp:1152 gui/options.cpp:1153
msgid "Specifies path to additional data used by all games or ScummVM"
msgstr "Specifica il percorso di ulteriori dati usati dai giochi o da ScummVM"
-#: gui/options.cpp:1158
+#: gui/options.cpp:1159
msgid "Plugins Path:"
msgstr "Percorso plugin:"
-#: gui/options.cpp:1160
+#: gui/options.cpp:1161
msgctxt "lowres"
msgid "Plugins Path:"
msgstr "Perc. plugin:"
-#: gui/options.cpp:1169 gui/fluidsynth-dialog.cpp:137
+#: gui/options.cpp:1170 gui/fluidsynth-dialog.cpp:138
msgid "Misc"
msgstr "Varie"
-#: gui/options.cpp:1171
+#: gui/options.cpp:1172
msgctxt "lowres"
msgid "Misc"
msgstr "Varie"
-#: gui/options.cpp:1173
+#: gui/options.cpp:1174
msgid "Theme:"
msgstr "Tema:"
-#: gui/options.cpp:1177
+#: gui/options.cpp:1178
msgid "GUI Renderer:"
msgstr "Renderer GUI:"
-#: gui/options.cpp:1189
+#: gui/options.cpp:1190
msgid "Autosave:"
msgstr "Autosalva:"
-#: gui/options.cpp:1191
+#: gui/options.cpp:1192
msgctxt "lowres"
msgid "Autosave:"
msgstr "Autosalva:"
-#: gui/options.cpp:1199
+#: gui/options.cpp:1200
msgid "Keys"
msgstr "Tasti"
-#: gui/options.cpp:1206
+#: gui/options.cpp:1207
msgid "GUI Language:"
msgstr "Lingua GUI:"
-#: gui/options.cpp:1206
+#: gui/options.cpp:1207
msgid "Language of ScummVM GUI"
msgstr "Lingua dell'interfaccia grafica di ScummVM"
-#: gui/options.cpp:1365
+#: gui/options.cpp:1366
msgid "You have to restart ScummVM before your changes will take effect."
msgstr "Devi riavviare ScummVM affinché le modifiche abbiano effetto."
-#: gui/options.cpp:1378
+#: gui/options.cpp:1379
msgid "Select directory for savegames"
msgstr "Seleziona la cartella per i salvataggi"
-#: gui/options.cpp:1385
+#: gui/options.cpp:1386
msgid "The chosen directory cannot be written to. Please select another one."
msgstr "La cartella scelta è in sola lettura. Si prega di sceglierne un'altra."
-#: gui/options.cpp:1394
+#: gui/options.cpp:1395
msgid "Select directory for GUI themes"
msgstr "Seleziona la cartella dei temi dell'interfaccia"
-#: gui/options.cpp:1404
+#: gui/options.cpp:1405
msgid "Select directory for extra files"
msgstr "Seleziona la cartella dei file aggiuntivi"
-#: gui/options.cpp:1415
+#: gui/options.cpp:1416
msgid "Select directory for plugins"
msgstr "Seleziona la cartella dei plugin"
-#: gui/options.cpp:1468
+#: gui/options.cpp:1469
msgid ""
"The theme you selected does not support your current language. If you want "
"to use this theme you need to switch to another language first."
@@ -942,225 +941,228 @@ msgstr ""
"Il tema che hai selezionato non supporta la lingua attuale. Se vuoi "
"utilizzare questo tema devi prima cambiare la lingua."
-#: gui/saveload-dialog.cpp:166
+#: gui/saveload-dialog.cpp:167
msgid "List view"
msgstr "Elenco"
-#: gui/saveload-dialog.cpp:167
+#: gui/saveload-dialog.cpp:168
msgid "Grid view"
msgstr "Griglia"
-#: gui/saveload-dialog.cpp:210 gui/saveload-dialog.cpp:358
+#: gui/saveload-dialog.cpp:211 gui/saveload-dialog.cpp:360
msgid "No date saved"
msgstr "Nessuna data salvata"
-#: gui/saveload-dialog.cpp:211 gui/saveload-dialog.cpp:359
+#: gui/saveload-dialog.cpp:212 gui/saveload-dialog.cpp:361
msgid "No time saved"
msgstr "Nessun orario salvato"
-#: gui/saveload-dialog.cpp:212 gui/saveload-dialog.cpp:360
+#: gui/saveload-dialog.cpp:213 gui/saveload-dialog.cpp:362
msgid "No playtime saved"
msgstr "Nessun tempo salvato"
-#: gui/saveload-dialog.cpp:219 gui/saveload-dialog.cpp:275
+#: gui/saveload-dialog.cpp:220 gui/saveload-dialog.cpp:276
msgid "Delete"
msgstr "Elimina"
-#: gui/saveload-dialog.cpp:274
+#: gui/saveload-dialog.cpp:275
msgid "Do you really want to delete this savegame?"
msgstr "Sei sicuro di voler eliminare questo salvataggio?"
-#: gui/saveload-dialog.cpp:383 gui/saveload-dialog.cpp:872
+#: gui/saveload-dialog.cpp:385 gui/saveload-dialog.cpp:875
msgid "Date: "
msgstr "Data: "
-#: gui/saveload-dialog.cpp:387 gui/saveload-dialog.cpp:878
+#: gui/saveload-dialog.cpp:389 gui/saveload-dialog.cpp:881
msgid "Time: "
msgstr "Ora: "
-#: gui/saveload-dialog.cpp:393 gui/saveload-dialog.cpp:886
+#: gui/saveload-dialog.cpp:395 gui/saveload-dialog.cpp:889
msgid "Playtime: "
msgstr "Tempo di gioco: "
-#: gui/saveload-dialog.cpp:406 gui/saveload-dialog.cpp:494
+#: gui/saveload-dialog.cpp:408 gui/saveload-dialog.cpp:496
msgid "Untitled savestate"
msgstr "Salvataggio senza titolo"
-#: gui/saveload-dialog.cpp:546
+#: gui/saveload-dialog.cpp:548
msgid "Next"
msgstr "Succ."
-#: gui/saveload-dialog.cpp:549
+#: gui/saveload-dialog.cpp:551
msgid "Prev"
msgstr "Prec."
-#: gui/saveload-dialog.cpp:736
+#: gui/saveload-dialog.cpp:739
msgid "New Save"
msgstr "Nuovo salvataggio"
-#: gui/saveload-dialog.cpp:736
+#: gui/saveload-dialog.cpp:739
msgid "Create a new save game"
msgstr "Crea un nuovo salvataggio"
-#: gui/saveload-dialog.cpp:865
+#: gui/saveload-dialog.cpp:868
msgid "Name: "
msgstr "Nome: "
-#: gui/saveload-dialog.cpp:937
+#: gui/saveload-dialog.cpp:940
#, c-format
msgid "Enter a description for slot %d:"
msgstr "Inserisci una descrizione per la posizione %d:"
-#: gui/themebrowser.cpp:44
+#: gui/themebrowser.cpp:45
msgid "Select a Theme"
msgstr "Seleziona un tema"
-#: gui/ThemeEngine.cpp:337
+#: gui/ThemeEngine.cpp:347
msgid "Disabled GFX"
msgstr "Grafica disattivata"
-#: gui/ThemeEngine.cpp:337
+#: gui/ThemeEngine.cpp:347
msgctxt "lowres"
msgid "Disabled GFX"
msgstr "Grafica disattivata"
-#: gui/ThemeEngine.cpp:338
-msgid "Standard Renderer (16bpp)"
+#: gui/ThemeEngine.cpp:348
+#, fuzzy
+msgid "Standard Renderer"
msgstr "Renderer standard (16bpp)"
-#: gui/ThemeEngine.cpp:338
-msgid "Standard (16bpp)"
-msgstr "Standard (16bpp)"
+#: gui/ThemeEngine.cpp:348 engines/scumm/dialogs.cpp:659
+msgid "Standard"
+msgstr "Medio"
-#: gui/ThemeEngine.cpp:340
-msgid "Antialiased Renderer (16bpp)"
+#: gui/ThemeEngine.cpp:350
+#, fuzzy
+msgid "Antialiased Renderer"
msgstr "Renderer con antialiasing (16bpp)"
-#: gui/ThemeEngine.cpp:340
-msgid "Antialiased (16bpp)"
+#: gui/ThemeEngine.cpp:350
+#, fuzzy
+msgid "Antialiased"
msgstr "Con antialiasing (16bpp)"
-#: gui/widget.cpp:322 gui/widget.cpp:324 gui/widget.cpp:330 gui/widget.cpp:332
+#: gui/widget.cpp:323 gui/widget.cpp:325 gui/widget.cpp:331 gui/widget.cpp:333
msgid "Clear value"
msgstr "Cancella"
-#: gui/fluidsynth-dialog.cpp:67
+#: gui/fluidsynth-dialog.cpp:68
msgid "Reverb"
msgstr "Riverbero"
-#: gui/fluidsynth-dialog.cpp:69 gui/fluidsynth-dialog.cpp:101
+#: gui/fluidsynth-dialog.cpp:70 gui/fluidsynth-dialog.cpp:102
msgid "Active"
msgstr "Attivo"
-#: gui/fluidsynth-dialog.cpp:71
+#: gui/fluidsynth-dialog.cpp:72
msgid "Room:"
msgstr "Stanza:"
-#: gui/fluidsynth-dialog.cpp:78
+#: gui/fluidsynth-dialog.cpp:79
msgid "Damp:"
msgstr "Smorzamento:"
-#: gui/fluidsynth-dialog.cpp:85
+#: gui/fluidsynth-dialog.cpp:86
msgid "Width:"
msgstr "Larghezza:"
-#: gui/fluidsynth-dialog.cpp:92 gui/fluidsynth-dialog.cpp:110
+#: gui/fluidsynth-dialog.cpp:93 gui/fluidsynth-dialog.cpp:111
msgid "Level:"
msgstr "Livello:"
-#: gui/fluidsynth-dialog.cpp:99
+#: gui/fluidsynth-dialog.cpp:100
msgid "Chorus"
msgstr "Chorus"
-#: gui/fluidsynth-dialog.cpp:103
+#: gui/fluidsynth-dialog.cpp:104
msgid "N:"
msgstr "N:"
-#: gui/fluidsynth-dialog.cpp:117
+#: gui/fluidsynth-dialog.cpp:118
msgid "Speed:"
msgstr "Velocità:"
-#: gui/fluidsynth-dialog.cpp:124
+#: gui/fluidsynth-dialog.cpp:125
msgid "Depth:"
msgstr "Profondità:"
-#: gui/fluidsynth-dialog.cpp:131
+#: gui/fluidsynth-dialog.cpp:132
msgid "Type:"
msgstr "Tipo:"
-#: gui/fluidsynth-dialog.cpp:134
+#: gui/fluidsynth-dialog.cpp:135
msgid "Sine"
msgstr "Seno"
-#: gui/fluidsynth-dialog.cpp:135
+#: gui/fluidsynth-dialog.cpp:136
msgid "Triangle"
msgstr "Triangolo"
-#: gui/fluidsynth-dialog.cpp:139
+#: gui/fluidsynth-dialog.cpp:140
msgid "Interpolation:"
msgstr "Interpolazione:"
-#: gui/fluidsynth-dialog.cpp:142
+#: gui/fluidsynth-dialog.cpp:143
msgid "None (fastest)"
msgstr "Nessuna (più veloce)"
-#: gui/fluidsynth-dialog.cpp:143
+#: gui/fluidsynth-dialog.cpp:144
msgid "Linear"
msgstr "Lineare"
-#: gui/fluidsynth-dialog.cpp:144
+#: gui/fluidsynth-dialog.cpp:145
msgid "Fourth-order"
msgstr "Quarto ordine"
-#: gui/fluidsynth-dialog.cpp:145
+#: gui/fluidsynth-dialog.cpp:146
msgid "Seventh-order"
msgstr "Settimo ordine"
-#: gui/fluidsynth-dialog.cpp:149
+#: gui/fluidsynth-dialog.cpp:150
msgid "Reset"
msgstr "Ripristina"
-#: gui/fluidsynth-dialog.cpp:149
+#: gui/fluidsynth-dialog.cpp:150
msgid "Reset all FluidSynth settings to their default values."
msgstr ""
"Ripristina tutte le impostazioni di FluidSynth al loro valore predefinito."
-#: gui/fluidsynth-dialog.cpp:216
+#: gui/fluidsynth-dialog.cpp:217
msgid ""
"Do you really want to reset all FluidSynth settings to their default values?"
msgstr ""
"Sei sicuro di voler ripristinare tutte le impostazioni di FluidSynth al loro "
"valore predefinito?"
-#: base/main.cpp:210
+#: base/main.cpp:228
#, c-format
msgid "Engine does not support debug level '%s'"
msgstr "Il motore non supporta il livello di debug '%s'"
-#: base/main.cpp:288
+#: base/main.cpp:306
msgid "Menu"
msgstr "Menu"
-#: base/main.cpp:291 backends/platform/symbian/src/SymbianActions.cpp:45
+#: base/main.cpp:309 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:294 backends/platform/symbian/src/SymbianActions.cpp:50
+#: base/main.cpp:312 backends/platform/symbian/src/SymbianActions.cpp:50
#: backends/platform/wince/CEActionsPocket.cpp:42
msgid "Pause"
msgstr "Pausa"
-#: base/main.cpp:297
+#: base/main.cpp:315
msgid "Skip line"
msgstr "Salta battuta"
-#: base/main.cpp:468
+#: base/main.cpp:507
msgid "Error running game:"
msgstr "Errore nell'esecuzione del gioco:"
-#: base/main.cpp:492
+#: base/main.cpp:536
msgid "Could not find any engine capable of running the selected game"
msgstr ""
"Impossibile trovare un motore in grado di eseguire il gioco selezionato"
@@ -1229,72 +1231,72 @@ msgstr "Utente cancellato"
msgid "Unknown error"
msgstr "Errore sconosciuto"
-#: engines/advancedDetector.cpp:316
+#: engines/advancedDetector.cpp:317
#, c-format
msgid "The game in '%s' seems to be unknown."
msgstr "Il gioco in '%s' sembra essere sconosciuto."
-#: engines/advancedDetector.cpp:317
+#: engines/advancedDetector.cpp:318
msgid "Please, report the following data to the ScummVM team along with name"
msgstr "Per favore, riporta i seguenti dati al team di ScummVM con il nome"
-#: engines/advancedDetector.cpp:319
+#: engines/advancedDetector.cpp:320
msgid "of the game you tried to add and its version/language/etc.:"
msgstr "del gioco che hai provato ad aggiungere e la sua versione/lingua/ecc.:"
-#: engines/dialogs.cpp:84
+#: engines/dialogs.cpp:85
msgid "~R~esume"
msgstr "~R~ipristina"
-#: engines/dialogs.cpp:86
+#: engines/dialogs.cpp:87
msgid "~L~oad"
msgstr "~C~arica"
-#: engines/dialogs.cpp:90
+#: engines/dialogs.cpp:91
msgid "~S~ave"
msgstr "~S~alva"
-#: engines/dialogs.cpp:94
+#: engines/dialogs.cpp:95
msgid "~O~ptions"
msgstr "~O~pzioni"
-#: engines/dialogs.cpp:99
+#: engines/dialogs.cpp:100
msgid "~H~elp"
msgstr "~A~iuto"
-#: engines/dialogs.cpp:101
+#: engines/dialogs.cpp:102
msgid "~A~bout"
msgstr "~I~nfo"
-#: engines/dialogs.cpp:104 engines/dialogs.cpp:180
+#: engines/dialogs.cpp:105 engines/dialogs.cpp:181
msgid "~R~eturn to Launcher"
msgstr "~T~orna a elenco giochi"
-#: engines/dialogs.cpp:106 engines/dialogs.cpp:182
+#: engines/dialogs.cpp:107 engines/dialogs.cpp:183
msgctxt "lowres"
msgid "~R~eturn to Launcher"
msgstr "~V~ai a elenco giochi"
-#: engines/dialogs.cpp:115 engines/agi/saveload.cpp:803
-#: engines/drascula/saveload.cpp:338 engines/cruise/menu.cpp:212
-#: engines/sci/engine/kfile.cpp:742 engines/toltecs/menu.cpp:284
-#: engines/pegasus/pegasus.cpp:373
+#: engines/dialogs.cpp:116 engines/agi/saveload.cpp:803
+#: engines/cruise/menu.cpp:212 engines/drascula/saveload.cpp:336
+#: engines/neverhood/menumodule.cpp:873 engines/pegasus/pegasus.cpp:377
+#: engines/sci/engine/kfile.cpp:758 engines/toltecs/menu.cpp:281
msgid "Save game:"
msgstr "Salva gioco:"
-#: engines/dialogs.cpp:115 engines/agi/saveload.cpp:803
-#: engines/drascula/saveload.cpp:338 engines/scumm/dialogs.cpp:187
-#: engines/cruise/menu.cpp:212 engines/sci/engine/kfile.cpp:742
-#: engines/toltecs/menu.cpp:284 engines/pegasus/pegasus.cpp:373
-#: backends/platform/symbian/src/SymbianActions.cpp:44
+#: engines/dialogs.cpp:116 backends/platform/symbian/src/SymbianActions.cpp:44
#: backends/platform/wince/CEActionsPocket.cpp:43
#: backends/platform/wince/CEActionsPocket.cpp:267
#: backends/platform/wince/CEActionsSmartphone.cpp:45
#: backends/platform/wince/CEActionsSmartphone.cpp:231
+#: engines/agi/saveload.cpp:803 engines/cruise/menu.cpp:212
+#: engines/drascula/saveload.cpp:336 engines/neverhood/menumodule.cpp:873
+#: engines/pegasus/pegasus.cpp:377 engines/sci/engine/kfile.cpp:758
+#: engines/scumm/dialogs.cpp:188 engines/toltecs/menu.cpp:281
msgid "Save"
msgstr "Salva"
-#: engines/dialogs.cpp:144
+#: engines/dialogs.cpp:145
msgid ""
"Sorry, this engine does not currently provide in-game help. Please consult "
"the README for basic information, and for instructions on how to obtain "
@@ -1304,7 +1306,7 @@ msgstr ""
"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:228
+#: engines/dialogs.cpp:234 engines/pegasus/pegasus.cpp:393
#, c-format
msgid ""
"Gamestate save failed (%s)! Please consult the README for basic information, "
@@ -1314,37 +1316,37 @@ msgstr ""
"informazioni di base e per le istruzioni su come ottenere ulteriore "
"assistenza."
-#: engines/dialogs.cpp:301 engines/mohawk/dialogs.cpp:109
+#: engines/dialogs.cpp:307 engines/mohawk/dialogs.cpp:109
#: engines/mohawk/dialogs.cpp:170
msgid "~O~K"
msgstr "~O~K"
-#: engines/dialogs.cpp:302 engines/mohawk/dialogs.cpp:110
+#: engines/dialogs.cpp:308 engines/mohawk/dialogs.cpp:110
#: engines/mohawk/dialogs.cpp:171
msgid "~C~ancel"
msgstr "~A~nnulla"
-#: engines/dialogs.cpp:305
+#: engines/dialogs.cpp:311
msgid "~K~eys"
msgstr "~T~asti"
-#: engines/engine.cpp:240
+#: engines/engine.cpp:245
msgid "Could not initialize color format."
msgstr "Impossibile inizializzare il formato colore."
-#: engines/engine.cpp:248
+#: engines/engine.cpp:253
msgid "Could not switch to video mode: '"
msgstr "Impossibile cambiare la modalità video: '"
-#: engines/engine.cpp:257
+#: engines/engine.cpp:262
msgid "Could not apply aspect ratio setting."
msgstr "Impossibile applicare l'impostazione proporzioni"
-#: engines/engine.cpp:262
+#: engines/engine.cpp:267
msgid "Could not apply fullscreen setting."
msgstr "Impossibile applicare l'impostazione schermo intero."
-#: engines/engine.cpp:362
+#: engines/engine.cpp:367
msgid ""
"You appear to be playing this game directly\n"
"from the CD. This is known to cause problems,\n"
@@ -1358,7 +1360,7 @@ msgstr ""
"sull'hard disk.\n"
"Vedi il file README per i dettagli."
-#: engines/engine.cpp:373
+#: engines/engine.cpp:378
msgid ""
"This game has audio tracks in its disk. These\n"
"tracks need to be ripped from the disk using\n"
@@ -1372,7 +1374,7 @@ msgstr ""
"la musica del gioco.\n"
"Vedi il file README per i dettagli."
-#: engines/engine.cpp:431
+#: engines/engine.cpp:436
#, c-format
msgid ""
"Gamestate load failed (%s)! Please consult the README for basic information, "
@@ -1382,7 +1384,7 @@ msgstr ""
"per le informazioni di base e per le istruzioni su come ottenere ulteriore "
"assistenza."
-#: engines/engine.cpp:444
+#: engines/engine.cpp:449
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 "
@@ -1392,35 +1394,762 @@ msgstr ""
"ScummVM. È quindi possibile che sia instabile, e i salvataggi potrebbero non "
"funzionare con future versioni di ScummVM."
-#: engines/engine.cpp:447
+#: engines/engine.cpp:452
msgid "Start anyway"
msgstr "Avvia comunque"
-#: engines/agi/detection.cpp:142 engines/drascula/detection.cpp:270
-#: engines/dreamweb/detection.cpp:47 engines/sci/detection.cpp:393
-#: engines/toltecs/detection.cpp:173
+#: audio/fmopl.cpp:50
+msgid "MAME OPL emulator"
+msgstr "Emulatore OPL MAME"
+
+#: audio/fmopl.cpp:52
+msgid "DOSBox OPL emulator"
+msgstr "Emulatore OPL DOSBox"
+
+#: audio/mididrv.cpp:209
+#, c-format
+msgid ""
+"The selected audio device '%s' was not found (e.g. might be turned off or "
+"disconnected)."
+msgstr ""
+"Il dispositivo audio selezionato '%s' non è stato trovato (potrebbe essere "
+"spento o scollegato)."
+
+#: audio/mididrv.cpp:209 audio/mididrv.cpp:221 audio/mididrv.cpp:257
+#: audio/mididrv.cpp:272
+msgid "Attempting to fall back to the next available device..."
+msgstr "Tentativo di ripristinare il primo dispositivo disponibile..."
+
+#: audio/mididrv.cpp:221
+#, c-format
+msgid ""
+"The selected audio device '%s' cannot be used. See log file for more "
+"information."
+msgstr ""
+"Il dispositivo audio selezionato '%s' non può essere usato. Vedi il file log "
+"per maggiori informazioni."
+
+#: audio/mididrv.cpp:257
+#, c-format
+msgid ""
+"The preferred audio device '%s' was not found (e.g. might be turned off or "
+"disconnected)."
+msgstr ""
+"Il dispositivo audio preferito '%s' non è stato trovato (potrebbe essere "
+"spento o scollegato)."
+
+#: audio/mididrv.cpp:272
+#, c-format
+msgid ""
+"The preferred audio device '%s' cannot be used. See log file for more "
+"information."
+msgstr ""
+"Il dispositivo audio preferito '%s' non può essere usato. Vedi il file log "
+"per maggiori informazioni."
+
+#: audio/null.h:44
+msgid "No music"
+msgstr "Nessuna musica"
+
+#: audio/mods/paula.cpp:196
+msgid "Amiga Audio Emulator"
+msgstr "Emulatore audio Amiga"
+
+#: audio/softsynth/adlib.cpp:2285
+msgid "AdLib Emulator"
+msgstr "Emulatore AdLib"
+
+#: audio/softsynth/appleiigs.cpp:33
+msgid "Apple II GS Emulator (NOT IMPLEMENTED)"
+msgstr "Emulatore Apple II GS (NON IMPLEMENTATO)"
+
+#: audio/softsynth/sid.cpp:1430
+msgid "C64 Audio Emulator"
+msgstr "Emulatore audio C64"
+
+#: audio/softsynth/mt32.cpp:200
+msgid "Initializing MT-32 Emulator"
+msgstr "Avvio in corso dell'emulatore MT-32"
+
+#: audio/softsynth/mt32.cpp:426
+msgid "MT-32 Emulator"
+msgstr "Emulatore MT-32"
+
+#: audio/softsynth/pcspk.cpp:139
+msgid "PC Speaker Emulator"
+msgstr "Emulatore PC Speaker"
+
+#: audio/softsynth/pcspk.cpp:158
+msgid "IBM PCjr Emulator"
+msgstr "Emulatore IBM PCjr"
+
+#: backends/keymapper/remap-dialog.cpp:48
+msgid "Keymap:"
+msgstr "Mappa tasti:"
+
+#: backends/keymapper/remap-dialog.cpp:67
+msgid " (Effective)"
+msgstr " (Efficace)"
+
+#: backends/keymapper/remap-dialog.cpp:107
+msgid " (Active)"
+msgstr " (Attivo)"
+
+#: backends/keymapper/remap-dialog.cpp:107
+msgid " (Blocked)"
+msgstr " (Bloccato)"
+
+#: backends/keymapper/remap-dialog.cpp:120
+msgid " (Global)"
+msgstr " (Globale)"
+
+#: backends/keymapper/remap-dialog.cpp:128
+msgid " (Game)"
+msgstr " (Gioco)"
+
+#: backends/midi/windows.cpp:165
+msgid "Windows MIDI"
+msgstr "MIDI Windows"
+
+#: backends/platform/ds/arm9/source/dsoptions.cpp:56
+#: engines/scumm/dialogs.cpp:291
+msgid "~C~lose"
+msgstr "~C~hiudi"
+
+#: backends/platform/ds/arm9/source/dsoptions.cpp:57
+msgid "ScummVM Main Menu"
+msgstr "Menu principale di ScummVM"
+
+#: backends/platform/ds/arm9/source/dsoptions.cpp:63
+msgid "~L~eft handed mode"
+msgstr "~M~odalità mancini"
+
+#: backends/platform/ds/arm9/source/dsoptions.cpp:64
+msgid "~I~ndy fight controls"
+msgstr "Controlli combattimento di ~I~ndy"
+
+#: backends/platform/ds/arm9/source/dsoptions.cpp:65
+msgid "Show mouse cursor"
+msgstr "Mostra cursore del mouse"
+
+#: backends/platform/ds/arm9/source/dsoptions.cpp:66
+msgid "Snap to edges"
+msgstr "Aggancia ai bordi"
+
+#: backends/platform/ds/arm9/source/dsoptions.cpp:68
+msgid "Touch X Offset"
+msgstr "Compensa X del tocco"
+
+#: backends/platform/ds/arm9/source/dsoptions.cpp:75
+msgid "Touch Y Offset"
+msgstr "Compensa Y del tocco"
+
+#: backends/platform/ds/arm9/source/dsoptions.cpp:87
+msgid "Use laptop trackpad-style cursor control"
+msgstr "Utilizza il controllo del cursore stile trackpad del portatile"
+
+#: backends/platform/ds/arm9/source/dsoptions.cpp:88
+msgid "Tap for left click, double tap right click"
+msgstr "Un tocco per il clic sinistro, doppio tocco per il clic destro"
+
+#: backends/platform/ds/arm9/source/dsoptions.cpp:90
+msgid "Sensitivity"
+msgstr "Sensibilità"
+
+#: backends/platform/ds/arm9/source/dsoptions.cpp:99
+msgid "Initial top screen scale:"
+msgstr "Schermo in primo piano:"
+
+#: backends/platform/ds/arm9/source/dsoptions.cpp:105
+msgid "Main screen scaling:"
+msgstr "Schermo principale:"
+
+#: backends/platform/ds/arm9/source/dsoptions.cpp:107
+msgid "Hardware scale (fast, but low quality)"
+msgstr "Ridimensionamento hardware (veloce, ma di bassa qualità)"
+
+#: backends/platform/ds/arm9/source/dsoptions.cpp:108
+msgid "Software scale (good quality, but slower)"
+msgstr "Ridimensionamento software (di buona qualità, ma più lento)"
+
+#: backends/platform/ds/arm9/source/dsoptions.cpp:109
+msgid "Unscaled (you must scroll left and right)"
+msgstr "Non ridimensionato (devi scorrere a sinistra e a destra)"
+
+#: backends/platform/ds/arm9/source/dsoptions.cpp:111
+msgid "Brightness:"
+msgstr "Luminosità:"
+
+#: backends/platform/ds/arm9/source/dsoptions.cpp:121
+msgid "High quality audio (slower) (reboot)"
+msgstr "Audio ad alta qualità (più lento) (riavviare)"
+
+#: backends/platform/ds/arm9/source/dsoptions.cpp:122
+msgid "Disable power off"
+msgstr "Disattiva spegnimento in chiusura"
+
+#: backends/platform/iphone/osys_events.cpp:300
+msgid "Mouse-click-and-drag mode enabled."
+msgstr "Modalità mouse-clicca-e-trascina attivata."
+
+#: backends/platform/iphone/osys_events.cpp:302
+msgid "Mouse-click-and-drag mode disabled."
+msgstr "Modalità mouse-clicca-e-trascina disattivata."
+
+#: backends/platform/iphone/osys_events.cpp:313
+msgid "Touchpad mode enabled."
+msgstr "Modalità touchpad attivata."
+
+#: backends/platform/iphone/osys_events.cpp:315
+msgid "Touchpad mode disabled."
+msgstr "Modalità touchpad disattivata."
+
+#: backends/platform/maemo/maemo.cpp:209
+msgid "Click Mode"
+msgstr "Modalità clic"
+
+#: backends/platform/maemo/maemo.cpp:215
+#: backends/platform/symbian/src/SymbianActions.cpp:42
+#: backends/platform/wince/CEActionsPocket.cpp:60
+#: backends/platform/wince/CEActionsSmartphone.cpp:43
+#: backends/platform/tizen/form.cpp:275
+msgid "Left Click"
+msgstr "Clic sinistro"
+
+#: backends/platform/maemo/maemo.cpp:218
+msgid "Middle Click"
+msgstr "Clic centrale"
+
+#: backends/platform/maemo/maemo.cpp:221
+#: backends/platform/symbian/src/SymbianActions.cpp:43
+#: backends/platform/wince/CEActionsSmartphone.cpp:44
+#: backends/platform/tizen/form.cpp:267
+msgid "Right Click"
+msgstr "Clic destro"
+
+#: backends/platform/sdl/macosx/appmenu_osx.mm:77
+msgid "Hide ScummVM"
+msgstr "Nascondi ScummVM"
+
+#: backends/platform/sdl/macosx/appmenu_osx.mm:82
+msgid "Hide Others"
+msgstr "Nascondi altre"
+
+#: backends/platform/sdl/macosx/appmenu_osx.mm:87
+msgid "Show All"
+msgstr "Mostra tutte"
+
+#: backends/platform/sdl/macosx/appmenu_osx.mm:109
+#: backends/platform/sdl/macosx/appmenu_osx.mm:120
+msgid "Window"
+msgstr "Finestra"
+
+#: backends/platform/sdl/macosx/appmenu_osx.mm:114
+msgid "Minimize"
+msgstr "Contrai"
+
+#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:46
+msgid "Normal (no scaling)"
+msgstr "Normale (nessun ridimensionamento)"
+
+#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:65
+msgctxt "lowres"
+msgid "Normal (no scaling)"
+msgstr "Normale (no ridim.)"
+
+#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2148
+msgid "Enabled aspect ratio correction"
+msgstr "Correzione proporzioni attivata"
+
+#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2154
+msgid "Disabled aspect ratio correction"
+msgstr "Correzione proporzioni disattivata"
+
+#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2209
+msgid "Active graphics filter:"
+msgstr "Filtro grafico attivo:"
+
+#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2251
+msgid "Windowed mode"
+msgstr "Modalità finestra"
+
+#: backends/graphics/opengl/opengl-graphics.cpp:118
+#, fuzzy
+msgid "OpenGL"
+msgstr "Apri"
+
+#: backends/graphics/opengl/opengl-graphics.cpp:119
+msgid "OpenGL (No filtering)"
+msgstr ""
+
+#: backends/platform/symbian/src/SymbianActions.cpp:38
+#: backends/platform/wince/CEActionsSmartphone.cpp:39
+msgid "Up"
+msgstr "Su"
+
+#: backends/platform/symbian/src/SymbianActions.cpp:39
+#: backends/platform/wince/CEActionsSmartphone.cpp:40
+msgid "Down"
+msgstr "Giù"
+
+#: backends/platform/symbian/src/SymbianActions.cpp:40
+#: backends/platform/wince/CEActionsSmartphone.cpp:41
+msgid "Left"
+msgstr "Sinistra"
+
+#: backends/platform/symbian/src/SymbianActions.cpp:41
+#: backends/platform/wince/CEActionsSmartphone.cpp:42
+msgid "Right"
+msgstr "Destra"
+
+#: backends/platform/symbian/src/SymbianActions.cpp:46
+#: backends/platform/wince/CEActionsSmartphone.cpp:47
+msgid "Zone"
+msgstr "Zona"
+
+#: backends/platform/symbian/src/SymbianActions.cpp:47
+#: backends/platform/wince/CEActionsPocket.cpp:54
+#: backends/platform/wince/CEActionsSmartphone.cpp:48
+msgid "Multi Function"
+msgstr "Multifunzione"
+
+#: backends/platform/symbian/src/SymbianActions.cpp:48
+msgid "Swap character"
+msgstr "Cambia personaggio"
+
+#: backends/platform/symbian/src/SymbianActions.cpp:49
+msgid "Skip text"
+msgstr "Salta testo"
+
+#: backends/platform/symbian/src/SymbianActions.cpp:51
+msgid "Fast mode"
+msgstr "Modalità veloce"
+
+#: 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:218
+#: engines/scumm/dialogs.cpp:192 engines/scumm/help.cpp:82
+#: engines/scumm/help.cpp:84
+msgid "Quit"
+msgstr "Esci"
+
+#: backends/platform/symbian/src/SymbianActions.cpp:53
+msgid "Debugger"
+msgstr "Debugger"
+
+#: backends/platform/symbian/src/SymbianActions.cpp:54
+msgid "Global menu"
+msgstr "Menu globale"
+
+#: backends/platform/symbian/src/SymbianActions.cpp:55
+msgid "Virtual keyboard"
+msgstr "Tastiera virtuale"
+
+#: backends/platform/symbian/src/SymbianActions.cpp:56
+msgid "Key mapper"
+msgstr "Programmatore tasti"
+
+#: backends/events/symbiansdl/symbiansdl-events.cpp:184
+msgid "Do you want to quit ?"
+msgstr "Sei sicuro di voler uscire?"
+
+#: backends/platform/wii/options.cpp:51
+msgid "Video"
+msgstr "Video"
+
+#: backends/platform/wii/options.cpp:54
+msgid "Current video mode:"
+msgstr "Modalità video attuale:"
+
+#: backends/platform/wii/options.cpp:56
+msgid "Double-strike"
+msgstr "Double-strike"
+
+#: backends/platform/wii/options.cpp:60
+msgid "Horizontal underscan:"
+msgstr "Underscan orizzontale:"
+
+#: backends/platform/wii/options.cpp:66
+msgid "Vertical underscan:"
+msgstr "Underscan verticale:"
+
+#: backends/platform/wii/options.cpp:71
+msgid "Input"
+msgstr "Input"
+
+#: backends/platform/wii/options.cpp:74
+msgid "GC Pad sensitivity:"
+msgstr "Sensibilità pad GC:"
+
+#: backends/platform/wii/options.cpp:80
+msgid "GC Pad acceleration:"
+msgstr "Accelerazione pad GC:"
+
+#: backends/platform/wii/options.cpp:86
+msgid "DVD"
+msgstr "DVD"
+
+#: backends/platform/wii/options.cpp:89 backends/platform/wii/options.cpp:101
+msgid "Status:"
+msgstr "Stato:"
+
+#: backends/platform/wii/options.cpp:90 backends/platform/wii/options.cpp:102
+msgid "Unknown"
+msgstr "Sconosciuto"
+
+#: backends/platform/wii/options.cpp:93
+msgid "Mount DVD"
+msgstr "Monta DVD"
+
+#: backends/platform/wii/options.cpp:94
+msgid "Unmount DVD"
+msgstr "Smonta DVD"
+
+#: backends/platform/wii/options.cpp:98
+msgid "SMB"
+msgstr "SMB"
+
+#: backends/platform/wii/options.cpp:106
+msgid "Server:"
+msgstr "Server:"
+
+#: backends/platform/wii/options.cpp:110
+msgid "Share:"
+msgstr "Condivisione:"
+
+#: backends/platform/wii/options.cpp:114
+msgid "Username:"
+msgstr "Nome utente:"
+
+#: backends/platform/wii/options.cpp:118
+msgid "Password:"
+msgstr "Password:"
+
+#: backends/platform/wii/options.cpp:121
+msgid "Init network"
+msgstr "Avvia rete"
+
+#: backends/platform/wii/options.cpp:123
+msgid "Mount SMB"
+msgstr "Monta SMB"
+
+#: backends/platform/wii/options.cpp:124
+msgid "Unmount SMB"
+msgstr "Smonta SMB"
+
+#: backends/platform/wii/options.cpp:143
+msgid "DVD Mounted successfully"
+msgstr "DVD montato con successo"
+
+#: backends/platform/wii/options.cpp:146
+msgid "Error while mounting the DVD"
+msgstr "Errore nel montare il DVD"
+
+#: backends/platform/wii/options.cpp:148
+msgid "DVD not mounted"
+msgstr "DVD non montato"
+
+#: backends/platform/wii/options.cpp:161
+msgid "Network up, share mounted"
+msgstr "Rete attiva, condivisione montata"
+
+#: backends/platform/wii/options.cpp:163
+msgid "Network up"
+msgstr "Rete attiva"
+
+#: backends/platform/wii/options.cpp:166
+msgid ", error while mounting the share"
+msgstr ", errore nel montare la condivisione"
+
+#: backends/platform/wii/options.cpp:168
+msgid ", share not mounted"
+msgstr ", condivisione non montata"
+
+#: backends/platform/wii/options.cpp:174
+msgid "Network down"
+msgstr "Rete disattivata"
+
+#: backends/platform/wii/options.cpp:178
+msgid "Initializing network"
+msgstr "Avvio rete in corso"
+
+#: backends/platform/wii/options.cpp:182
+msgid "Timeout while initializing network"
+msgstr "Tempo scaduto per l'avvio della rete"
+
+#: backends/platform/wii/options.cpp:186
+#, c-format
+msgid "Network not initialized (%d)"
+msgstr "Rete non avviata (%d)"
+
+#: backends/platform/wince/CEActionsPocket.cpp:46
+msgid "Hide Toolbar"
+msgstr "Nascondi la barra degli strumenti"
+
+#: backends/platform/wince/CEActionsPocket.cpp:47
+msgid "Show Keyboard"
+msgstr "Mostra tastiera"
+
+#: backends/platform/wince/CEActionsPocket.cpp:48
+msgid "Sound on/off"
+msgstr "Suono on/off"
+
+#: backends/platform/wince/CEActionsPocket.cpp:49
+msgid "Right click"
+msgstr "Clic destro"
+
+#: backends/platform/wince/CEActionsPocket.cpp:50
+msgid "Show/Hide Cursor"
+msgstr "Mostra/nascondi cursore"
+
+#: backends/platform/wince/CEActionsPocket.cpp:51
+msgid "Free look"
+msgstr "Osservazione libera"
+
+#: backends/platform/wince/CEActionsPocket.cpp:52
+msgid "Zoom up"
+msgstr "Zoom avanti"
+
+#: backends/platform/wince/CEActionsPocket.cpp:53
+msgid "Zoom down"
+msgstr "Zoom indietro"
+
+#: backends/platform/wince/CEActionsPocket.cpp:55
+#: backends/platform/wince/CEActionsSmartphone.cpp:49
+msgid "Bind Keys"
+msgstr "Associa tasti"
+
+#: backends/platform/wince/CEActionsPocket.cpp:56
+msgid "Cursor Up"
+msgstr "Cursore su"
+
+#: backends/platform/wince/CEActionsPocket.cpp:57
+msgid "Cursor Down"
+msgstr "Cursore giù"
+
+#: backends/platform/wince/CEActionsPocket.cpp:58
+msgid "Cursor Left"
+msgstr "Cursore a sinistra"
+
+#: backends/platform/wince/CEActionsPocket.cpp:59
+msgid "Cursor Right"
+msgstr "Cursore a destra"
+
+#: 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:326
+#: backends/platform/wince/CEActionsSmartphone.cpp:287
+msgid " Are you sure you want to quit ? "
+msgstr " Sei sicuro di voler uscire? "
+
+#: backends/platform/wince/CEActionsSmartphone.cpp:50
+msgid "Keyboard"
+msgstr "Tastiera"
+
+#: backends/platform/wince/CEActionsSmartphone.cpp:51
+msgid "Rotate"
+msgstr "Rotazione"
+
+#: backends/platform/wince/CELauncherDialog.cpp:56
+msgid "Using SDL driver "
+msgstr "Utilizzo del driver SDL "
+
+#: backends/platform/wince/CELauncherDialog.cpp:60
+msgid "Display "
+msgstr "Visualizza "
+
+#: 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:516
+msgid "Map right click action"
+msgstr "Mappa l'azione del tasto destro"
+
+#: backends/platform/wince/wince-sdl.cpp:520
+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:529
+msgid "Map hide toolbar action"
+msgstr "Mappa l'azione nascondi barra degli strumenti"
+
+#: backends/platform/wince/wince-sdl.cpp:533
+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:542
+msgid "Map Zoom Up action (optional)"
+msgstr "Mappa l'azione Zoom Up (opzionale)"
+
+#: backends/platform/wince/wince-sdl.cpp:545
+msgid "Map Zoom Down action (optional)"
+msgstr "Mappa l'azione Zoom Down (opzionale)"
+
+#: backends/platform/wince/wince-sdl.cpp:553
+msgid ""
+"Don't forget to map a key to 'Hide Toolbar' action to see the whole inventory"
+msgstr ""
+"Non dimenticare di mappare un tasto per l'azione \"Nascondi barra degli "
+"strumenti\" per vedere l'intero inventario"
+
+#: backends/events/default/default-events.cpp:196
+msgid "Do you really want to return to the Launcher?"
+msgstr "Sei sicuro di voler tornare all'elenco giochi?"
+
+#: backends/events/default/default-events.cpp:196
+msgid "Launcher"
+msgstr "Elenco giochi"
+
+#: backends/events/default/default-events.cpp:218
+msgid "Do you really want to quit?"
+msgstr "Sei sicuro di voler uscire?"
+
+#: backends/events/gph/gph-events.cpp:386
+#: backends/events/gph/gph-events.cpp:429
+#: backends/events/openpandora/op-events.cpp:168
+msgid "Touchscreen 'Tap Mode' - Left Click"
+msgstr "Touchscreen 'Tap Mode' - Clic sinistro"
+
+#: backends/events/gph/gph-events.cpp:388
+#: backends/events/gph/gph-events.cpp:431
+#: backends/events/openpandora/op-events.cpp:170
+msgid "Touchscreen 'Tap Mode' - Right Click"
+msgstr "Touchscreen 'Tap Mode' - Clic destro"
+
+#: backends/events/gph/gph-events.cpp:390
+#: backends/events/gph/gph-events.cpp:433
+#: backends/events/openpandora/op-events.cpp:172
+msgid "Touchscreen 'Tap Mode' - Hover (No Click)"
+msgstr "Touchscreen 'Tap Mode' - Passaggio del cursore (nessun clic)"
+
+#: backends/events/gph/gph-events.cpp:410
+msgid "Maximum Volume"
+msgstr "Volume massimo"
+
+#: backends/events/gph/gph-events.cpp:412
+msgid "Increasing Volume"
+msgstr "Aumento volume"
+
+#: backends/events/gph/gph-events.cpp:418
+msgid "Minimal Volume"
+msgstr "Volume minimo"
+
+#: backends/events/gph/gph-events.cpp:420
+msgid "Decreasing Volume"
+msgstr "Diminuzione volume"
+
+#: backends/events/openpandora/op-events.cpp:174
+msgid "Touchscreen 'Tap Mode' - Hover (DPad Clicks)"
+msgstr "Touchscreen 'Tap Mode' - Passaggio del cursore (clic DPad)"
+
+#: backends/updates/macosx/macosx-updates.mm:67
+msgid "Check for Updates..."
+msgstr "Cerca aggiornamenti..."
+
+#: backends/platform/tizen/form.cpp:263
+msgid "Right Click Once"
+msgstr "Un clic destro"
+
+#: backends/platform/tizen/form.cpp:271
+msgid "Move Only"
+msgstr "Muovi soltanto"
+
+#: backends/platform/tizen/form.cpp:294
+msgid "Escape Key"
+msgstr "Tasto Esc"
+
+#: backends/platform/tizen/form.cpp:299
+msgid "Game Menu"
+msgstr "Menu di gioco"
+
+#: backends/platform/tizen/form.cpp:304
+msgid "Show Keypad"
+msgstr "Mostra tastierino numerico"
+
+#: backends/platform/tizen/form.cpp:309
+msgid "Control Mouse"
+msgstr "Controllo mouse"
+
+#: backends/events/maemosdl/maemosdl-events.cpp:192
+msgid "Clicking Enabled"
+msgstr "Clic attivato"
+
+#: backends/events/maemosdl/maemosdl-events.cpp:192
+msgid "Clicking Disabled"
+msgstr "Clic disattivato"
+
+#: engines/agi/detection.cpp:142 engines/drascula/detection.cpp:302
+#: engines/dreamweb/detection.cpp:47 engines/neverhood/detection.cpp:160
+#: engines/sci/detection.cpp:394 engines/toltecs/detection.cpp:186
msgid "Use original save/load screens"
msgstr "Usa schermate di salvataggio originali"
-#: engines/agi/detection.cpp:143 engines/drascula/detection.cpp:271
-#: engines/dreamweb/detection.cpp:48 engines/sci/detection.cpp:394
-#: engines/toltecs/detection.cpp:174
+#: engines/agi/detection.cpp:143 engines/drascula/detection.cpp:303
+#: engines/dreamweb/detection.cpp:48 engines/neverhood/detection.cpp:161
+#: engines/sci/detection.cpp:395 engines/toltecs/detection.cpp:187
msgid "Use the original save/load screens, instead of the ScummVM ones"
msgstr ""
"Usa le schermate originali di salvataggio e caricamento, al posto di quelle "
"di ScummVM"
-#: engines/agi/saveload.cpp:816 engines/drascula/saveload.cpp:351
-#: engines/sci/engine/kfile.cpp:841 engines/toltecs/menu.cpp:259
+#: engines/agi/saveload.cpp:816 engines/drascula/saveload.cpp:349
+#: engines/neverhood/menumodule.cpp:886 engines/sci/engine/kfile.cpp:857
+#: engines/toltecs/menu.cpp:256
msgid "Restore game:"
msgstr "Ripristina gioco:"
-#: engines/agi/saveload.cpp:816 engines/drascula/saveload.cpp:351
-#: engines/sci/engine/kfile.cpp:841 engines/toltecs/menu.cpp:259
+#: engines/agi/saveload.cpp:816 engines/drascula/saveload.cpp:349
+#: engines/neverhood/menumodule.cpp:886 engines/sci/engine/kfile.cpp:857
+#: engines/toltecs/menu.cpp:256
msgid "Restore"
msgstr "Ripristina"
-#: engines/drascula/saveload.cpp:49
+#: engines/agos/saveload.cpp:160 engines/scumm/scumm.cpp:2321
+#, c-format
+msgid ""
+"Failed to load game state from file:\n"
+"\n"
+"%s"
+msgstr ""
+"Impossibile caricare il gioco dal file:\n"
+"\n"
+"%s"
+
+#: engines/agos/saveload.cpp:195 engines/scumm/scumm.cpp:2314
+#, c-format
+msgid ""
+"Failed to save game state to file:\n"
+"\n"
+"%s"
+msgstr ""
+"Impossibile salvare il gioco nel file:\n"
+"\n"
+"%s"
+
+#: engines/agos/saveload.cpp:203 engines/scumm/scumm.cpp:2332
+#, c-format
+msgid ""
+"Successfully saved game state in file:\n"
+"\n"
+"%s"
+msgstr ""
+"Gioco salvato con successo nel file:\n"
+"\n"
+"%s"
+
+#: engines/agos/animation.cpp:557
+#, c-format
+msgid "Cutscene file '%s' not found!"
+msgstr "File della scena di intermezzo '%s' non trovato!"
+
+#: engines/drascula/saveload.cpp:47
msgid ""
"ScummVM found that you have old savefiles for Drascula that should be "
"converted.\n"
@@ -1446,27 +2175,304 @@ msgstr "Usa modalità colori brillanti"
msgid "Display graphics using the game's bright palette"
msgstr "Visualizza la grafica con i colori brillanti del gioco"
-#: engines/sci/detection.cpp:373
+#: engines/gob/inter_playtoons.cpp:256 engines/gob/inter_v2.cpp:1470
+#: engines/tinsel/saveload.cpp:532
+msgid "Failed to load game state from file."
+msgstr "Impossibile caricare il gioco dal file."
+
+#: engines/gob/inter_v2.cpp:1540 engines/tinsel/saveload.cpp:545
+msgid "Failed to save game state to file."
+msgstr "Impossibile salvare il gioco nel file."
+
+#: engines/gob/inter_v5.cpp:107
+msgid "Failed to delete file."
+msgstr "Impossibile eliminare il file."
+
+#: engines/groovie/detection.cpp:312
+msgid "Fast movie speed"
+msgstr "Alta velocità filmati"
+
+#: engines/groovie/detection.cpp:313
+msgid "Play movies at an increased speed"
+msgstr "Aumenta la velocità di riproduzione dei filmati"
+
+#: engines/groovie/script.cpp:399
+msgid "Failed to save game"
+msgstr "Impossibile salvare il gioco"
+
+#. I18N: Studio audience adds an applause and cheering sounds whenever
+#. Malcolm makes a joke.
+#: engines/kyra/detection.cpp:62
+msgid "Studio audience"
+msgstr "Reazioni del pubblico"
+
+#: engines/kyra/detection.cpp:63
+msgid "Enable studio audience"
+msgstr "Attiva le reazioni del pubblico"
+
+#. I18N: This option allows the user to skip text and cutscenes.
+#: engines/kyra/detection.cpp:73
+msgid "Skip support"
+msgstr "Interruzione del parlato"
+
+#: engines/kyra/detection.cpp:74
+msgid "Allow text and cutscenes to be skipped"
+msgstr "Permette di saltare i dialoghi e le scene di intermezzo"
+
+#. I18N: Helium mode makes people sound like they've inhaled Helium.
+#: engines/kyra/detection.cpp:84
+msgid "Helium mode"
+msgstr "Modalità elio"
+
+#: engines/kyra/detection.cpp:85
+msgid "Enable helium mode"
+msgstr "Attiva la modalità elio"
+
+#. I18N: When enabled, this option makes scrolling smoother when
+#. changing from one screen to another.
+#: engines/kyra/detection.cpp:99
+msgid "Smooth scrolling"
+msgstr "Scorrimento morbido"
+
+#: engines/kyra/detection.cpp:100
+msgid "Enable smooth scrolling when walking"
+msgstr "Attiva lo scorrimento morbido durante gli spostamenti"
+
+#. I18N: When enabled, this option changes the cursor when it floats to the
+#. edge of the screen to a directional arrow. The player can then click to
+#. walk towards that direction.
+#: engines/kyra/detection.cpp:112
+msgid "Floating cursors"
+msgstr "Cursori fluttuanti"
+
+#: engines/kyra/detection.cpp:113
+msgid "Enable floating cursors"
+msgstr "Attiva cursori fluttuanti"
+
+#. I18N: HP stands for Hit Points
+#: engines/kyra/detection.cpp:127
+msgid "HP bar graphs"
+msgstr "Barre HP"
+
+#: engines/kyra/detection.cpp:128
+msgid "Enable hit point bar graphs"
+msgstr "Attiva le barre di Hit Point"
+
+#: engines/kyra/lol.cpp:478
+msgid "Attack 1"
+msgstr "Attacco 1"
+
+#: engines/kyra/lol.cpp:479
+msgid "Attack 2"
+msgstr "Attacco 2"
+
+#: engines/kyra/lol.cpp:480
+msgid "Attack 3"
+msgstr "Attacco 3"
+
+#: engines/kyra/lol.cpp:481
+msgid "Move Forward"
+msgstr "Vai avanti"
+
+#: engines/kyra/lol.cpp:482
+msgid "Move Back"
+msgstr "Vai indietro"
+
+#: engines/kyra/lol.cpp:483
+msgid "Slide Left"
+msgstr "Scorri a sinistra"
+
+#: engines/kyra/lol.cpp:484
+msgid "Slide Right"
+msgstr "Scorri a destra"
+
+#: engines/kyra/lol.cpp:485 engines/pegasus/pegasus.cpp:2509
+msgid "Turn Left"
+msgstr "Gira a sinistra"
+
+#: engines/kyra/lol.cpp:486 engines/pegasus/pegasus.cpp:2510
+msgid "Turn Right"
+msgstr "Gira a destra"
+
+#: engines/kyra/lol.cpp:487
+msgid "Rest"
+msgstr "Riposa"
+
+#: engines/kyra/lol.cpp:488
+msgid "Options"
+msgstr "Opzioni"
+
+#: engines/kyra/lol.cpp:489
+msgid "Choose Spell"
+msgstr "Scegli incantesimo"
+
+#: engines/kyra/sound_midi.cpp:477
+msgid ""
+"You appear to be using a General MIDI device,\n"
+"but your game only supports Roland MT32 MIDI.\n"
+"We try to map the Roland MT32 instruments to\n"
+"General MIDI ones. It is still possible that\n"
+"some tracks sound incorrect."
+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 avere un suono non corretto."
+
+#. I18N: Option for fast scene switching
+#: engines/mohawk/dialogs.cpp:92 engines/mohawk/dialogs.cpp:167
+msgid "~Z~ip Mode Activated"
+msgstr "Modalità ~Z~ip attivata"
+
+#: engines/mohawk/dialogs.cpp:93
+msgid "~T~ransitions Enabled"
+msgstr "~T~ransizioni attive"
+
+#. I18N: Drop book page
+#: engines/mohawk/dialogs.cpp:95
+msgid "~D~rop Page"
+msgstr "~L~ascia pagina"
+
+#: engines/mohawk/dialogs.cpp:99
+msgid "~S~how Map"
+msgstr "~M~ostra mappa"
+
+#: engines/mohawk/dialogs.cpp:105
+msgid "~M~ain Menu"
+msgstr "~M~enu principale"
+
+#: engines/mohawk/dialogs.cpp:168
+msgid "~W~ater Effect Enabled"
+msgstr "~E~ffetto acqua attivo"
+
+#: engines/neverhood/detection.cpp:167
+msgid "Skip the Hall of Records storyboard scenes"
+msgstr ""
+
+#: engines/neverhood/detection.cpp:168
+msgid "Allows the player to skip past the Hall of Records storyboard scenes"
+msgstr ""
+
+#: engines/neverhood/detection.cpp:174
+msgid "Scale the making of videos to full screen"
+msgstr ""
+
+#: engines/neverhood/detection.cpp:175
+msgid "Scale the making of videos, so that they use the whole screen"
+msgstr ""
+
+#: engines/parallaction/saveload.cpp:133
+#, c-format
+msgid ""
+"Can't save game in slot %i\n"
+"\n"
+msgstr ""
+"Impossibile salvare nella posizione %i\n"
+"\n"
+
+#: engines/parallaction/saveload.cpp:204
+msgid "Loading game..."
+msgstr "Caricamento..."
+
+#: engines/parallaction/saveload.cpp:219
+msgid "Saving game..."
+msgstr "Salvataggio..."
+
+#: engines/parallaction/saveload.cpp:272
+msgid ""
+"ScummVM found that you have old savefiles for Nippon Safes that should be "
+"renamed.\n"
+"The old names are 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 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:319
+msgid "ScummVM successfully converted all your savefiles."
+msgstr "ScummVM ha convertito con successo tutti i tuoi salvataggi."
+
+#: engines/parallaction/saveload.cpp:321
+msgid ""
+"ScummVM printed some warnings in your console window and can't guarantee all "
+"your files have been converted.\n"
+"\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."
+
+#: engines/pegasus/pegasus.cpp:714
+msgid "Invalid save file name"
+msgstr "Nome salvataggio non valido"
+
+#: engines/pegasus/pegasus.cpp:2507
+msgid "Up/Zoom In/Move Forward/Open Doors"
+msgstr "Su / Zoom + / Avanza / Apri porte"
+
+#: engines/pegasus/pegasus.cpp:2508
+msgid "Down/Zoom Out"
+msgstr "Giù / Zoom -"
+
+#: engines/pegasus/pegasus.cpp:2511
+msgid "Display/Hide Inventory Tray"
+msgstr "Mostra/nascondi pannello inventario"
+
+#: engines/pegasus/pegasus.cpp:2512
+msgid "Display/Hide Biochip Tray"
+msgstr "Mostra/nascondi pannello Biochip"
+
+#: engines/pegasus/pegasus.cpp:2513
+msgid "Action/Select"
+msgstr "Azione/Seleziona"
+
+#: engines/pegasus/pegasus.cpp:2514
+msgid "Toggle Center Data Display"
+msgstr "Mostra/nascondi schermo centrale dati"
+
+#: engines/pegasus/pegasus.cpp:2515
+msgid "Display/Hide Info Screen"
+msgstr "Mostra/nascondi schermana info"
+
+#: engines/pegasus/pegasus.cpp:2516
+msgid "Display/Hide Pause Menu"
+msgstr "Mostra/nascondi menu pausa"
+
+#: engines/pegasus/pegasus.cpp:2517
+msgid "???"
+msgstr "???"
+
+#: engines/sci/detection.cpp:374
msgid "EGA undithering"
msgstr "Undithering EGA"
-#: engines/sci/detection.cpp:374
+#: engines/sci/detection.cpp:375
msgid "Enable undithering in EGA games"
msgstr "Attiva undithering nei giochi EGA"
-#: engines/sci/detection.cpp:383
+#: engines/sci/detection.cpp:384
msgid "Prefer digital sound effects"
msgstr "Scegli effetti sonori digitali"
-#: engines/sci/detection.cpp:384
+#: engines/sci/detection.cpp:385
msgid "Prefer digital sound effects instead of synthesized ones"
msgstr "Scegli gli effetti sonori digitali al posto di quelli sintetizzati"
-#: engines/sci/detection.cpp:403
+#: engines/sci/detection.cpp:404
msgid "Use IMF/Yamaha FB-01 for MIDI output"
msgstr "Usa IMF/Yamaha FB-01 per output MIDI"
-#: engines/sci/detection.cpp:404
+#: engines/sci/detection.cpp:405
msgid ""
"Use an IBM Music Feature card or a Yamaha FB-01 FM synth module for MIDI "
"output"
@@ -1474,166 +2480,148 @@ msgstr ""
"Usa una scheda IBM Music Feature o un modulo synth Yamaha FB-01 FM per "
"l'output MIDI"
-#: engines/sci/detection.cpp:414
+#: engines/sci/detection.cpp:415
msgid "Use CD audio"
msgstr "Usa audio da CD"
-#: engines/sci/detection.cpp:415
+#: engines/sci/detection.cpp:416
msgid "Use CD audio instead of in-game audio, if available"
msgstr ""
"Usa l'audio da CD al posto di quello incorporato nel gioco, se disponibile"
-#: engines/sci/detection.cpp:425
+#: engines/sci/detection.cpp:426
msgid "Use Windows cursors"
msgstr "Usa cursori di Windows"
-#: engines/sci/detection.cpp:426
+#: engines/sci/detection.cpp:427
msgid ""
"Use the Windows cursors (smaller and monochrome) instead of the DOS ones"
msgstr ""
"Usa i cursori di Windows (più piccoli e monocromatici) al posto di quelli DOS"
-#: engines/sci/detection.cpp:436
+#: engines/sci/detection.cpp:437
msgid "Use silver cursors"
msgstr "Usa cursori d'argento"
-#: engines/sci/detection.cpp:437
+#: engines/sci/detection.cpp:438
msgid ""
"Use the alternate set of silver cursors, instead of the normal golden ones"
msgstr ""
"Usa il set alternativo di cursori d'argento al posto di quelli normali d'oro"
-#: engines/scumm/dialogs.cpp:175
+#: engines/scumm/dialogs.cpp:176
#, 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
+#: engines/scumm/dialogs.cpp:177
#, 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
+#: engines/scumm/dialogs.cpp:178
#, 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
+#: engines/scumm/dialogs.cpp:179
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
+#: engines/scumm/dialogs.cpp:183
msgid "Are you sure you want to restart? (Y/N)"
msgstr "Sei sicuro di voler riavviare? (S/N)S"
#. I18N: you may specify 'Yes' symbol at the end of the line. See previous comment
-#: engines/scumm/dialogs.cpp:184
+#: engines/scumm/dialogs.cpp:185
msgid "Are you sure you want to quit? (Y/N)"
msgstr "Sei sicuro di voler uscire? (S/N)S"
-#: engines/scumm/dialogs.cpp:189
+#: engines/scumm/dialogs.cpp:190
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:215
-msgid "Quit"
-msgstr "Esci"
-
-#: engines/scumm/dialogs.cpp:193
+#: engines/scumm/dialogs.cpp:194
msgid "Insert save/load game disk"
msgstr "Inserire il disco dei salvataggi"
-#: engines/scumm/dialogs.cpp:194
+#: engines/scumm/dialogs.cpp:195
msgid "You must enter a name"
msgstr "Devi inserire un nome"
-#: engines/scumm/dialogs.cpp:195
+#: engines/scumm/dialogs.cpp:196
msgid "The game was NOT saved (disk full?)"
msgstr "Il gioco NON è stato salvato (disco pieno?)"
-#: engines/scumm/dialogs.cpp:196
+#: engines/scumm/dialogs.cpp:197
msgid "The game was NOT loaded"
msgstr "Il gioco NON è stato caricato"
-#: engines/scumm/dialogs.cpp:197
+#: engines/scumm/dialogs.cpp:198
#, c-format
msgid "Saving '%s'"
msgstr "Salvataggio di '%s' in corso"
-#: engines/scumm/dialogs.cpp:198
+#: engines/scumm/dialogs.cpp:199
#, c-format
msgid "Loading '%s'"
msgstr "Caricamento di '%s' in corso"
-#: engines/scumm/dialogs.cpp:199
+#: engines/scumm/dialogs.cpp:200
msgid "Name your SAVE game"
msgstr "Dai un nome al SALVATAGGIO"
-#: engines/scumm/dialogs.cpp:200
+#: engines/scumm/dialogs.cpp:201
msgid "Select a game to LOAD"
msgstr "Seleziona un gioco da caricare"
-#: engines/scumm/dialogs.cpp:201
+#: engines/scumm/dialogs.cpp:202
msgid "Game title)"
msgstr "titolo gioco)"
#. I18N: Previous page button
-#: engines/scumm/dialogs.cpp:287
+#: engines/scumm/dialogs.cpp:288
msgid "~P~revious"
msgstr "~P~recedenti"
#. I18N: Next page button
-#: engines/scumm/dialogs.cpp:289
+#: engines/scumm/dialogs.cpp:290
msgid "~N~ext"
msgstr "~S~uccessivi"
-#: engines/scumm/dialogs.cpp:290
-#: backends/platform/ds/arm9/source/dsoptions.cpp:56
-msgid "~C~lose"
-msgstr "~C~hiudi"
-
-#: engines/scumm/dialogs.cpp:597
+#: engines/scumm/dialogs.cpp:598
msgid "Speech Only"
msgstr "Solo voci"
-#: engines/scumm/dialogs.cpp:598
+#: engines/scumm/dialogs.cpp:599
msgid "Speech and Subtitles"
msgstr "Voci e testo"
-#: engines/scumm/dialogs.cpp:599
+#: engines/scumm/dialogs.cpp:600
msgid "Subtitles Only"
msgstr "Solo testo"
-#: engines/scumm/dialogs.cpp:607
+#: engines/scumm/dialogs.cpp:608
msgctxt "lowres"
msgid "Speech & Subs"
msgstr "Voci e testo"
-#: engines/scumm/dialogs.cpp:653
+#: engines/scumm/dialogs.cpp:654
msgid "Select a Proficiency Level."
msgstr "Selezionate un livello di difficoltà."
-#: engines/scumm/dialogs.cpp:655
+#: engines/scumm/dialogs.cpp:656
msgid "Refer to your Loom(TM) manual for help."
msgstr "Consultate il manuale delle istruzioni."
-#: engines/scumm/dialogs.cpp:658
-msgid "Standard"
-msgstr "Medio"
-
-#: engines/scumm/dialogs.cpp:659
+#: engines/scumm/dialogs.cpp:660
msgid "Practice"
msgstr "Base"
-#: engines/scumm/dialogs.cpp:660
+#: engines/scumm/dialogs.cpp:661
msgid "Expert"
msgstr "Expert"
@@ -2150,7 +3138,7 @@ msgstr "Vola a destra"
msgid "Fly to lower right"
msgstr "Vola in basso a destra"
-#: engines/scumm/scumm.cpp:1776
+#: engines/scumm/scumm.cpp:1777
#, c-format
msgid ""
"Native MIDI support requires the Roland Upgrade from LucasArts,\n"
@@ -2159,40 +3147,7 @@ msgstr ""
"Il supporto nativo MIDI richiede il Roland Upgrade della LucasArts,\n"
"ma %s non è presente. Verrà usato AdLib."
-#: engines/scumm/scumm.cpp:2303 engines/agos/saveload.cpp:220
-#, c-format
-msgid ""
-"Failed to save game state to file:\n"
-"\n"
-"%s"
-msgstr ""
-"Impossibile salvare il gioco nel file:\n"
-"\n"
-"%s"
-
-#: engines/scumm/scumm.cpp:2310 engines/agos/saveload.cpp:185
-#, c-format
-msgid ""
-"Failed to load game state from file:\n"
-"\n"
-"%s"
-msgstr ""
-"Impossibile caricare il gioco dal file:\n"
-"\n"
-"%s"
-
-#: engines/scumm/scumm.cpp:2322 engines/agos/saveload.cpp:228
-#, c-format
-msgid ""
-"Successfully saved game state in file:\n"
-"\n"
-"%s"
-msgstr ""
-"Gioco salvato con successo nel file:\n"
-"\n"
-"%s"
-
-#: engines/scumm/scumm.cpp:2537
+#: engines/scumm/scumm.cpp:2547
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' "
@@ -2203,190 +3158,6 @@ msgstr ""
"principale di ScummVM e seleziona la cartella \"Maniac\" all'interno della "
"cartella di Day Of The Tentacle."
-#. I18N: Option for fast scene switching
-#: engines/mohawk/dialogs.cpp:92 engines/mohawk/dialogs.cpp:167
-msgid "~Z~ip Mode Activated"
-msgstr "Modalità ~Z~ip attivata"
-
-#: engines/mohawk/dialogs.cpp:93
-msgid "~T~ransitions Enabled"
-msgstr "~T~ransizioni attive"
-
-#. I18N: Drop book page
-#: engines/mohawk/dialogs.cpp:95
-msgid "~D~rop Page"
-msgstr "~L~ascia pagina"
-
-#: engines/mohawk/dialogs.cpp:99
-msgid "~S~how Map"
-msgstr "~M~ostra mappa"
-
-#: engines/mohawk/dialogs.cpp:105
-msgid "~M~ain Menu"
-msgstr "~M~enu principale"
-
-#: engines/mohawk/dialogs.cpp:168
-msgid "~W~ater Effect Enabled"
-msgstr "~E~ffetto acqua attivo"
-
-#: engines/agos/animation.cpp:557
-#, c-format
-msgid "Cutscene file '%s' not found!"
-msgstr "File della scena di intermezzo '%s' non trovato!"
-
-#: engines/gob/inter_playtoons.cpp:256 engines/gob/inter_v2.cpp:1287
-#: engines/tinsel/saveload.cpp:532
-msgid "Failed to load game state from file."
-msgstr "Impossibile caricare il gioco dal file."
-
-#: engines/gob/inter_v2.cpp:1357 engines/tinsel/saveload.cpp:545
-msgid "Failed to save game state to file."
-msgstr "Impossibile salvare il gioco nel file."
-
-#: engines/gob/inter_v5.cpp:107
-msgid "Failed to delete file."
-msgstr "Impossibile eliminare il file."
-
-#: engines/groovie/detection.cpp:312
-msgid "Fast movie speed"
-msgstr "Alta velocità filmati"
-
-#: engines/groovie/detection.cpp:313
-msgid "Play movies at an increased speed"
-msgstr "Aumenta la velocità di riproduzione dei filmati"
-
-#: engines/groovie/script.cpp:420
-msgid "Failed to save game"
-msgstr "Impossibile salvare il gioco"
-
-#. I18N: Studio audience adds an applause and cheering sounds whenever
-#. Malcolm makes a joke.
-#: engines/kyra/detection.cpp:62
-msgid "Studio audience"
-msgstr "Reazioni del pubblico"
-
-#: engines/kyra/detection.cpp:63
-msgid "Enable studio audience"
-msgstr "Attiva le reazioni del pubblico"
-
-#. I18N: This option allows the user to skip text and cutscenes.
-#: engines/kyra/detection.cpp:73
-msgid "Skip support"
-msgstr "Interruzione del parlato"
-
-#: engines/kyra/detection.cpp:74
-msgid "Allow text and cutscenes to be skipped"
-msgstr "Permette di saltare i dialoghi e le scene di intermezzo"
-
-#. I18N: Helium mode makes people sound like they've inhaled Helium.
-#: engines/kyra/detection.cpp:84
-msgid "Helium mode"
-msgstr "Modalità elio"
-
-#: engines/kyra/detection.cpp:85
-msgid "Enable helium mode"
-msgstr "Attiva la modalità elio"
-
-#. I18N: When enabled, this option makes scrolling smoother when
-#. changing from one screen to another.
-#: engines/kyra/detection.cpp:99
-msgid "Smooth scrolling"
-msgstr "Scorrimento morbido"
-
-#: engines/kyra/detection.cpp:100
-msgid "Enable smooth scrolling when walking"
-msgstr "Attiva lo scorrimento morbido durante gli spostamenti"
-
-#. I18N: When enabled, this option changes the cursor when it floats to the
-#. edge of the screen to a directional arrow. The player can then click to
-#. walk towards that direction.
-#: engines/kyra/detection.cpp:112
-msgid "Floating cursors"
-msgstr "Cursori fluttuanti"
-
-#: engines/kyra/detection.cpp:113
-msgid "Enable floating cursors"
-msgstr "Attiva cursori fluttuanti"
-
-#. I18N: HP stands for Hit Points
-#: engines/kyra/detection.cpp:127
-msgid "HP bar graphs"
-msgstr "Barre HP"
-
-#: engines/kyra/detection.cpp:128
-msgid "Enable hit point bar graphs"
-msgstr "Attiva le barre di Hit Point"
-
-#: engines/kyra/lol.cpp:478
-msgid "Attack 1"
-msgstr "Attacco 1"
-
-#: engines/kyra/lol.cpp:479
-msgid "Attack 2"
-msgstr "Attacco 2"
-
-#: engines/kyra/lol.cpp:480
-msgid "Attack 3"
-msgstr "Attacco 3"
-
-#: engines/kyra/lol.cpp:481
-msgid "Move Forward"
-msgstr "Vai avanti"
-
-#: engines/kyra/lol.cpp:482
-msgid "Move Back"
-msgstr "Vai indietro"
-
-#: engines/kyra/lol.cpp:483
-msgid "Slide Left"
-msgstr "Scorri a sinistra"
-
-#: engines/kyra/lol.cpp:484
-msgid "Slide Right"
-msgstr "Scorri a destra"
-
-#: engines/kyra/lol.cpp:485 engines/pegasus/pegasus.cpp:2447
-msgid "Turn Left"
-msgstr "Gira a sinistra"
-
-#: engines/kyra/lol.cpp:486 engines/pegasus/pegasus.cpp:2448
-msgid "Turn Right"
-msgstr "Gira a destra"
-
-#: engines/kyra/lol.cpp:487
-msgid "Rest"
-msgstr "Riposa"
-
-#: engines/kyra/lol.cpp:488
-msgid "Options"
-msgstr "Opzioni"
-
-#: engines/kyra/lol.cpp:489
-msgid "Choose Spell"
-msgstr "Scegli incantesimo"
-
-#: engines/kyra/sound_midi.cpp:477
-msgid ""
-"You appear to be using a General MIDI device,\n"
-"but your game only supports Roland MT32 MIDI.\n"
-"We try to map the Roland MT32 instruments to\n"
-"General MIDI ones. It is still possible that\n"
-"some tracks sound incorrect."
-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 avere un suono non corretto."
-
-#: engines/queen/queen.cpp:59
-msgid "Alternative intro"
-msgstr "Intro alternativa"
-
-#: engines/queen/queen.cpp:60
-msgid "Use an alternative game intro (CD version only)"
-msgstr "Usa un'intro del gioco alternativa (solo versione CD)"
-
#: engines/sky/compact.cpp:130
msgid ""
"Unable to find \"sky.cpt\" file!\n"
@@ -2411,23 +3182,26 @@ msgstr "Intro floppy"
msgid "Use the floppy version's intro (CD version only)"
msgstr "Usa la versione floppy dell'intro (solo versione CD)"
-#: engines/sword1/animation.cpp:519
+#: engines/sword1/animation.cpp:524
#, c-format
msgid "PSX stream cutscene '%s' cannot be played in paletted mode"
msgstr ""
"La scena PSX di intermezzo '%s' non può essere eseguita in modalità tavolozza"
-#: engines/sword1/animation.cpp:540 engines/sword2/animation.cpp:439
+#: engines/sword1/animation.cpp:545 engines/sword2/animation.cpp:445
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:550 engines/sword2/animation.cpp:449
-msgid "MPEG2 cutscenes are no longer supported"
-msgstr "Le scene di intermezzo MPEG2 non sono più supportate"
+#: engines/sword1/animation.cpp:561
+#, fuzzy
+msgid "MPEG-2 cutscenes found but ScummVM has been built without MPEG-2"
+msgstr ""
+"Sono state trovare scene di intermezzo PSX ma ScummVM è stato compilato "
+"senza il supporto colori RGB"
-#: engines/sword1/animation.cpp:556 engines/sword2/animation.cpp:457
+#: engines/sword1/animation.cpp:568 engines/sword2/animation.cpp:470
#, c-format
msgid "Cutscene '%s' not found"
msgstr "Scena di intermezzo '%s' non trovata"
@@ -2471,13 +3245,21 @@ msgstr "Mantieni quello nuovo"
msgid "This is the end of the Broken Sword 1 Demo"
msgstr "Questa è la fine della demo di Broken Sword 1"
-#: engines/sword2/animation.cpp:419
+#: engines/sword2/animation.cpp:425
msgid ""
"PSX cutscenes found but ScummVM has been built without RGB color support"
msgstr ""
"Sono state trovare scene di intermezzo PSX ma ScummVM è stato compilato "
"senza il supporto colori RGB"
+#: engines/sword2/animation.cpp:461
+#, fuzzy
+msgid ""
+"MPEG-2 cutscenes found but ScummVM has been built without MPEG-2 support"
+msgstr ""
+"Sono state trovare scene di intermezzo DXA ma ScummVM è stato compilato "
+"senza il supporto zlib"
+
#: engines/sword2/sword2.cpp:79
msgid "Show object labels"
msgstr "Mostra etichette oggetti"
@@ -2486,12 +3268,12 @@ msgstr "Mostra etichette oggetti"
msgid "Show labels for objects on mouse hover"
msgstr "Mostra etichette per gli oggetti al passaggio del mouse"
-#: engines/teenagent/resources.cpp:94
+#: engines/teenagent/resources.cpp:95
msgid ""
"You're missing the 'teenagent.dat' file. Get it from the ScummVM website"
msgstr "Il file 'teenagent.dat' non è presente. Scaricarlo dal sito di ScummVM"
-#: engines/teenagent/resources.cpp:115
+#: engines/teenagent/resources.cpp:116
msgid ""
"The teenagent.dat file is compressed and zlib hasn't been included in this "
"executable. Please decompress it"
@@ -2499,790 +3281,51 @@ msgstr ""
"Il file teenagent.dat è compresso e zlib non è stata inclusa in questo "
"eseguibile. Si prega di decomprimerlo"
-#: engines/parallaction/saveload.cpp:133
-#, c-format
-msgid ""
-"Can't save game in slot %i\n"
-"\n"
-msgstr ""
-"Impossibile salvare nella posizione %i\n"
-"\n"
-
-#: engines/parallaction/saveload.cpp:204
-msgid "Loading game..."
-msgstr "Caricamento..."
-
-#: engines/parallaction/saveload.cpp:219
-msgid "Saving game..."
-msgstr "Salvataggio..."
-
-#: engines/parallaction/saveload.cpp:272
-msgid ""
-"ScummVM found that you have old savefiles for Nippon Safes that should be "
-"renamed.\n"
-"The old names are 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 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:319
-msgid "ScummVM successfully converted all your savefiles."
-msgstr "ScummVM ha convertito con successo tutti i tuoi salvataggi."
-
-#: engines/parallaction/saveload.cpp:321
-msgid ""
-"ScummVM printed some warnings in your console window and can't guarantee all "
-"your files have been converted.\n"
-"\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."
-
-#: engines/pegasus/pegasus.cpp:679
-msgid "Invalid save file name"
-msgstr "Nome salvataggio non valido"
-
-#: engines/pegasus/pegasus.cpp:2445
-msgid "Up/Zoom In/Move Forward/Open Doors"
-msgstr "Su / Zoom + / Avanza / Apri porte"
-
-#: engines/pegasus/pegasus.cpp:2446
-msgid "Down/Zoom Out"
-msgstr "Giù / Zoom -"
-
-#: engines/pegasus/pegasus.cpp:2449
-msgid "Display/Hide Inventory Tray"
-msgstr "Mostra/nascondi pannello inventario"
-
-#: engines/pegasus/pegasus.cpp:2450
-msgid "Display/Hide Biochip Tray"
-msgstr "Mostra/nascondi pannello Biochip"
-
-#: engines/pegasus/pegasus.cpp:2451
-msgid "Action/Select"
-msgstr "Azione/Seleziona"
-
-#: engines/pegasus/pegasus.cpp:2452
-msgid "Toggle Center Data Display"
-msgstr "Mostra/nascondi schermo centrale dati"
-
-#: engines/pegasus/pegasus.cpp:2453
-msgid "Display/Hide Info Screen"
-msgstr "Mostra/nascondi schermana info"
-
-#: engines/pegasus/pegasus.cpp:2454
-msgid "Display/Hide Pause Menu"
-msgstr "Mostra/nascondi menu pausa"
-
-#: engines/pegasus/pegasus.cpp:2455
-msgid "???"
-msgstr "???"
-
-#: audio/fmopl.cpp:49
-msgid "MAME OPL emulator"
-msgstr "Emulatore OPL MAME"
-
-#: audio/fmopl.cpp:51
-msgid "DOSBox OPL emulator"
-msgstr "Emulatore OPL DOSBox"
-
-#: audio/mididrv.cpp:209
-#, c-format
-msgid ""
-"The selected audio device '%s' was not found (e.g. might be turned off or "
-"disconnected)."
-msgstr ""
-"Il dispositivo audio selezionato '%s' non è stato trovato (potrebbe essere "
-"spento o scollegato)."
-
-#: audio/mididrv.cpp:209 audio/mididrv.cpp:221 audio/mididrv.cpp:257
-#: audio/mididrv.cpp:272
-msgid "Attempting to fall back to the next available device..."
-msgstr "Tentativo di ripristinare il primo dispositivo disponibile..."
-
-#: audio/mididrv.cpp:221
-#, c-format
-msgid ""
-"The selected audio device '%s' cannot be used. See log file for more "
-"information."
-msgstr ""
-"Il dispositivo audio selezionato '%s' non può essere usato. Vedi il file log "
-"per maggiori informazioni."
-
-#: audio/mididrv.cpp:257
-#, c-format
-msgid ""
-"The preferred audio device '%s' was not found (e.g. might be turned off or "
-"disconnected)."
-msgstr ""
-"Il dispositivo audio preferito '%s' non è stato trovato (potrebbe essere "
-"spento o scollegato)."
-
-#: audio/mididrv.cpp:272
-#, c-format
-msgid ""
-"The preferred audio device '%s' cannot be used. See log file for more "
-"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"
-msgstr "Nessuna musica"
-
-#: audio/mods/paula.cpp:189
-msgid "Amiga Audio Emulator"
-msgstr "Emulatore audio Amiga"
-
-#: audio/softsynth/adlib.cpp:2284
-msgid "AdLib Emulator"
-msgstr "Emulatore AdLib"
-
-#: audio/softsynth/appleiigs.cpp:33
-msgid "Apple II GS Emulator (NOT IMPLEMENTED)"
-msgstr "Emulatore Apple II GS (NON IMPLEMENTATO)"
-
-#: audio/softsynth/sid.cpp:1430
-msgid "C64 Audio Emulator"
-msgstr "Emulatore audio C64"
-
-#: audio/softsynth/mt32.cpp:205
-msgid "Initializing MT-32 Emulator"
-msgstr "Avvio in corso dell'emulatore MT-32"
-
-#: audio/softsynth/mt32.cpp:431
-msgid "MT-32 Emulator"
-msgstr "Emulatore MT-32"
-
-#: audio/softsynth/pcspk.cpp:139
-msgid "PC Speaker Emulator"
-msgstr "Emulatore PC Speaker"
-
-#: audio/softsynth/pcspk.cpp:158
-msgid "IBM PCjr Emulator"
-msgstr "Emulatore IBM PCjr"
-
-#: backends/keymapper/remap-dialog.cpp:47
-msgid "Keymap:"
-msgstr "Mappa tasti:"
-
-#: backends/keymapper/remap-dialog.cpp:66
-msgid " (Effective)"
-msgstr " (Efficace)"
-
-#: backends/keymapper/remap-dialog.cpp:106
-msgid " (Active)"
-msgstr " (Attivo)"
-
-#: backends/keymapper/remap-dialog.cpp:106
-msgid " (Blocked)"
-msgstr " (Bloccato)"
-
-#: backends/keymapper/remap-dialog.cpp:119
-msgid " (Global)"
-msgstr " (Globale)"
-
-#: backends/keymapper/remap-dialog.cpp:127
-msgid " (Game)"
-msgstr " (Gioco)"
-
-#: backends/midi/windows.cpp:164
-msgid "Windows MIDI"
-msgstr "MIDI Windows"
-
-#: backends/platform/ds/arm9/source/dsoptions.cpp:57
-msgid "ScummVM Main Menu"
-msgstr "Menu principale di ScummVM"
-
-#: backends/platform/ds/arm9/source/dsoptions.cpp:63
-msgid "~L~eft handed mode"
-msgstr "~M~odalità mancini"
-
-#: backends/platform/ds/arm9/source/dsoptions.cpp:64
-msgid "~I~ndy fight controls"
-msgstr "Controlli combattimento di ~I~ndy"
-
-#: backends/platform/ds/arm9/source/dsoptions.cpp:65
-msgid "Show mouse cursor"
-msgstr "Mostra cursore del mouse"
-
-#: backends/platform/ds/arm9/source/dsoptions.cpp:66
-msgid "Snap to edges"
-msgstr "Aggancia ai bordi"
-
-#: backends/platform/ds/arm9/source/dsoptions.cpp:68
-msgid "Touch X Offset"
-msgstr "Compensa X del tocco"
-
-#: backends/platform/ds/arm9/source/dsoptions.cpp:75
-msgid "Touch Y Offset"
-msgstr "Compensa Y del tocco"
-
-#: backends/platform/ds/arm9/source/dsoptions.cpp:87
-msgid "Use laptop trackpad-style cursor control"
-msgstr "Utilizza il controllo del cursore stile trackpad del portatile"
-
-#: backends/platform/ds/arm9/source/dsoptions.cpp:88
-msgid "Tap for left click, double tap right click"
-msgstr "Un tocco per il clic sinistro, doppio tocco per il clic destro"
-
-#: backends/platform/ds/arm9/source/dsoptions.cpp:90
-msgid "Sensitivity"
-msgstr "Sensibilità"
-
-#: backends/platform/ds/arm9/source/dsoptions.cpp:99
-msgid "Initial top screen scale:"
-msgstr "Schermo in primo piano:"
-
-#: backends/platform/ds/arm9/source/dsoptions.cpp:105
-msgid "Main screen scaling:"
-msgstr "Schermo principale:"
-
-#: backends/platform/ds/arm9/source/dsoptions.cpp:107
-msgid "Hardware scale (fast, but low quality)"
-msgstr "Ridimensionamento hardware (veloce, ma di bassa qualità)"
-
-#: backends/platform/ds/arm9/source/dsoptions.cpp:108
-msgid "Software scale (good quality, but slower)"
-msgstr "Ridimensionamento software (di buona qualità, ma più lento)"
-
-#: backends/platform/ds/arm9/source/dsoptions.cpp:109
-msgid "Unscaled (you must scroll left and right)"
-msgstr "Non ridimensionato (devi scorrere a sinistra e a destra)"
-
-#: backends/platform/ds/arm9/source/dsoptions.cpp:111
-msgid "Brightness:"
-msgstr "Luminosità:"
-
-#: backends/platform/ds/arm9/source/dsoptions.cpp:121
-msgid "High quality audio (slower) (reboot)"
-msgstr "Audio ad alta qualità (più lento) (riavviare)"
-
-#: backends/platform/ds/arm9/source/dsoptions.cpp:122
-msgid "Disable power off"
-msgstr "Disattiva spegnimento in chiusura"
-
-#: backends/platform/iphone/osys_events.cpp:300
-msgid "Mouse-click-and-drag mode enabled."
-msgstr "Modalità mouse-clicca-e-trascina attivata."
-
-#: backends/platform/iphone/osys_events.cpp:302
-msgid "Mouse-click-and-drag mode disabled."
-msgstr "Modalità mouse-clicca-e-trascina disattivata."
-
-#: backends/platform/iphone/osys_events.cpp:313
-msgid "Touchpad mode enabled."
-msgstr "Modalità touchpad attivata."
-
-#: backends/platform/iphone/osys_events.cpp:315
-msgid "Touchpad mode disabled."
-msgstr "Modalità touchpad disattivata."
-
-#: backends/platform/maemo/maemo.cpp:209
-msgid "Click Mode"
-msgstr "Modalità clic"
-
-#: backends/platform/maemo/maemo.cpp:215
-#: 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/maemo/maemo.cpp:218
-msgid "Middle Click"
-msgstr "Clic centrale"
-
-#: backends/platform/maemo/maemo.cpp:221
-#: 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"
-
-#: backends/platform/sdl/macosx/appmenu_osx.mm:77
-msgid "Hide ScummVM"
-msgstr "Nascondi ScummVM"
-
-#: backends/platform/sdl/macosx/appmenu_osx.mm:82
-msgid "Hide Others"
-msgstr "Nascondi altre"
-
-#: backends/platform/sdl/macosx/appmenu_osx.mm:87
-msgid "Show All"
-msgstr "Mostra tutte"
-
-#: backends/platform/sdl/macosx/appmenu_osx.mm:109
-#: backends/platform/sdl/macosx/appmenu_osx.mm:120
-msgid "Window"
-msgstr "Finestra"
-
-#: backends/platform/sdl/macosx/appmenu_osx.mm:114
-msgid "Minimize"
-msgstr "Contrai"
-
-#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:45
-msgid "Normal (no scaling)"
-msgstr "Normale (nessun ridimensionamento)"
-
-#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:64
-msgctxt "lowres"
-msgid "Normal (no scaling)"
-msgstr "Normale (no ridim.)"
-
-#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2135
-#: backends/graphics/openglsdl/openglsdl-graphics.cpp:537
-msgid "Enabled aspect ratio correction"
-msgstr "Correzione proporzioni attivata"
-
-#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2141
-#: backends/graphics/openglsdl/openglsdl-graphics.cpp:542
-msgid "Disabled aspect ratio correction"
-msgstr "Correzione proporzioni disattivata"
-
-#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2196
-msgid "Active graphics filter:"
-msgstr "Filtro grafico attivo:"
-
-#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2238
-#: backends/graphics/openglsdl/openglsdl-graphics.cpp:481
-msgid "Windowed mode"
-msgstr "Modalità finestra"
-
-#: backends/graphics/opengl/opengl-graphics.cpp:135
-msgid "OpenGL Normal"
-msgstr "OpenGL Normal"
-
-#: backends/graphics/opengl/opengl-graphics.cpp:136
-msgid "OpenGL Conserve"
-msgstr "OpenGL Conserve"
-
-#: backends/graphics/opengl/opengl-graphics.cpp:137
-msgid "OpenGL Original"
-msgstr "OpenGL Original"
-
-#: backends/graphics/openglsdl/openglsdl-graphics.cpp:415
-msgid "Current display mode"
-msgstr "Modalità visualizzazione attuale"
-
-#: backends/graphics/openglsdl/openglsdl-graphics.cpp:428
-msgid "Current scale"
-msgstr "Dimensioni attuali"
-
-#: backends/graphics/openglsdl/openglsdl-graphics.cpp:562
-msgid "Active filter mode: Linear"
-msgstr "Modalità filtro attiva: Lineare"
-
-#: backends/graphics/openglsdl/openglsdl-graphics.cpp:564
-msgid "Active filter mode: Nearest"
-msgstr "Modalità filtro attiva: Più vicino"
-
-#: backends/platform/symbian/src/SymbianActions.cpp:38
-#: backends/platform/wince/CEActionsSmartphone.cpp:39
-msgid "Up"
-msgstr "Su"
-
-#: backends/platform/symbian/src/SymbianActions.cpp:39
-#: backends/platform/wince/CEActionsSmartphone.cpp:40
-msgid "Down"
-msgstr "Giù"
-
-#: backends/platform/symbian/src/SymbianActions.cpp:40
-#: backends/platform/wince/CEActionsSmartphone.cpp:41
-msgid "Left"
-msgstr "Sinistra"
-
-#: backends/platform/symbian/src/SymbianActions.cpp:41
-#: backends/platform/wince/CEActionsSmartphone.cpp:42
-msgid "Right"
-msgstr "Destra"
-
-#: backends/platform/symbian/src/SymbianActions.cpp:46
-#: backends/platform/wince/CEActionsSmartphone.cpp:47
-msgid "Zone"
-msgstr "Zona"
-
-#: backends/platform/symbian/src/SymbianActions.cpp:47
-#: backends/platform/wince/CEActionsPocket.cpp:54
-#: backends/platform/wince/CEActionsSmartphone.cpp:48
-msgid "Multi Function"
-msgstr "Multifunzione"
-
-#: backends/platform/symbian/src/SymbianActions.cpp:48
-msgid "Swap character"
-msgstr "Cambia personaggio"
-
-#: backends/platform/symbian/src/SymbianActions.cpp:49
-msgid "Skip text"
-msgstr "Salta testo"
-
-#: backends/platform/symbian/src/SymbianActions.cpp:51
-msgid "Fast mode"
-msgstr "Modalità veloce"
-
-#: backends/platform/symbian/src/SymbianActions.cpp:53
-msgid "Debugger"
-msgstr "Debugger"
-
-#: backends/platform/symbian/src/SymbianActions.cpp:54
-msgid "Global menu"
-msgstr "Menu globale"
-
-#: backends/platform/symbian/src/SymbianActions.cpp:55
-msgid "Virtual keyboard"
-msgstr "Tastiera virtuale"
-
-#: backends/platform/symbian/src/SymbianActions.cpp:56
-msgid "Key mapper"
-msgstr "Programmatore tasti"
-
-#: backends/events/symbiansdl/symbiansdl-events.cpp:184
-msgid "Do you want to quit ?"
-msgstr "Sei sicuro di voler uscire?"
-
-#: backends/platform/wii/options.cpp:51
-msgid "Video"
-msgstr "Video"
-
-#: backends/platform/wii/options.cpp:54
-msgid "Current video mode:"
-msgstr "Modalità video attuale:"
-
-#: backends/platform/wii/options.cpp:56
-msgid "Double-strike"
-msgstr "Double-strike"
-
-#: backends/platform/wii/options.cpp:60
-msgid "Horizontal underscan:"
-msgstr "Underscan orizzontale:"
-
-#: backends/platform/wii/options.cpp:66
-msgid "Vertical underscan:"
-msgstr "Underscan verticale:"
-
-#: backends/platform/wii/options.cpp:71
-msgid "Input"
-msgstr "Input"
-
-#: backends/platform/wii/options.cpp:74
-msgid "GC Pad sensitivity:"
-msgstr "Sensibilità pad GC:"
-
-#: backends/platform/wii/options.cpp:80
-msgid "GC Pad acceleration:"
-msgstr "Accelerazione pad GC:"
-
-#: backends/platform/wii/options.cpp:86
-msgid "DVD"
-msgstr "DVD"
-
-#: backends/platform/wii/options.cpp:89 backends/platform/wii/options.cpp:101
-msgid "Status:"
-msgstr "Stato:"
-
-#: backends/platform/wii/options.cpp:90 backends/platform/wii/options.cpp:102
-msgid "Unknown"
-msgstr "Sconosciuto"
-
-#: backends/platform/wii/options.cpp:93
-msgid "Mount DVD"
-msgstr "Monta DVD"
-
-#: backends/platform/wii/options.cpp:94
-msgid "Unmount DVD"
-msgstr "Smonta DVD"
-
-#: backends/platform/wii/options.cpp:98
-msgid "SMB"
-msgstr "SMB"
-
-#: backends/platform/wii/options.cpp:106
-msgid "Server:"
-msgstr "Server:"
-
-#: backends/platform/wii/options.cpp:110
-msgid "Share:"
-msgstr "Condivisione:"
-
-#: backends/platform/wii/options.cpp:114
-msgid "Username:"
-msgstr "Nome utente:"
-
-#: backends/platform/wii/options.cpp:118
-msgid "Password:"
-msgstr "Password:"
-
-#: backends/platform/wii/options.cpp:121
-msgid "Init network"
-msgstr "Avvia rete"
-
-#: backends/platform/wii/options.cpp:123
-msgid "Mount SMB"
-msgstr "Monta SMB"
-
-#: backends/platform/wii/options.cpp:124
-msgid "Unmount SMB"
-msgstr "Smonta SMB"
-
-#: backends/platform/wii/options.cpp:143
-msgid "DVD Mounted successfully"
-msgstr "DVD montato con successo"
-
-#: backends/platform/wii/options.cpp:146
-msgid "Error while mounting the DVD"
-msgstr "Errore nel montare il DVD"
-
-#: backends/platform/wii/options.cpp:148
-msgid "DVD not mounted"
-msgstr "DVD non montato"
-
-#: backends/platform/wii/options.cpp:161
-msgid "Network up, share mounted"
-msgstr "Rete attiva, condivisione montata"
-
-#: backends/platform/wii/options.cpp:163
-msgid "Network up"
-msgstr "Rete attiva"
-
-#: backends/platform/wii/options.cpp:166
-msgid ", error while mounting the share"
-msgstr ", errore nel montare la condivisione"
-
-#: backends/platform/wii/options.cpp:168
-msgid ", share not mounted"
-msgstr ", condivisione non montata"
-
-#: backends/platform/wii/options.cpp:174
-msgid "Network down"
-msgstr "Rete disattivata"
-
-#: backends/platform/wii/options.cpp:178
-msgid "Initializing network"
-msgstr "Avvio rete in corso"
-
-#: backends/platform/wii/options.cpp:182
-msgid "Timeout while initializing network"
-msgstr "Tempo scaduto per l'avvio della rete"
-
-#: backends/platform/wii/options.cpp:186
-#, c-format
-msgid "Network not initialized (%d)"
-msgstr "Rete non avviata (%d)"
-
-#: backends/platform/wince/CEActionsPocket.cpp:46
-msgid "Hide Toolbar"
-msgstr "Nascondi la barra degli strumenti"
-
-#: backends/platform/wince/CEActionsPocket.cpp:47
-msgid "Show Keyboard"
-msgstr "Mostra tastiera"
-
-#: backends/platform/wince/CEActionsPocket.cpp:48
-msgid "Sound on/off"
-msgstr "Suono on/off"
-
-#: backends/platform/wince/CEActionsPocket.cpp:49
-msgid "Right click"
-msgstr "Clic destro"
-
-#: backends/platform/wince/CEActionsPocket.cpp:50
-msgid "Show/Hide Cursor"
-msgstr "Mostra/nascondi cursore"
-
-#: backends/platform/wince/CEActionsPocket.cpp:51
-msgid "Free look"
-msgstr "Osservazione libera"
-
-#: backends/platform/wince/CEActionsPocket.cpp:52
-msgid "Zoom up"
-msgstr "Zoom avanti"
-
-#: backends/platform/wince/CEActionsPocket.cpp:53
-msgid "Zoom down"
-msgstr "Zoom indietro"
-
-#: backends/platform/wince/CEActionsPocket.cpp:55
-#: backends/platform/wince/CEActionsSmartphone.cpp:49
-msgid "Bind Keys"
-msgstr "Associa tasti"
-
-#: backends/platform/wince/CEActionsPocket.cpp:56
-msgid "Cursor Up"
-msgstr "Cursore su"
-
-#: backends/platform/wince/CEActionsPocket.cpp:57
-msgid "Cursor Down"
-msgstr "Cursore giù"
-
-#: backends/platform/wince/CEActionsPocket.cpp:58
-msgid "Cursor Left"
-msgstr "Cursore a sinistra"
-
-#: backends/platform/wince/CEActionsPocket.cpp:59
-msgid "Cursor Right"
-msgstr "Cursore a destra"
-
-#: 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:326
-#: backends/platform/wince/CEActionsSmartphone.cpp:287
-msgid " Are you sure you want to quit ? "
-msgstr " Sei sicuro di voler uscire? "
-
-#: backends/platform/wince/CEActionsSmartphone.cpp:50
-msgid "Keyboard"
-msgstr "Tastiera"
-
-#: backends/platform/wince/CEActionsSmartphone.cpp:51
-msgid "Rotate"
-msgstr "Rotazione"
-
-#: backends/platform/wince/CELauncherDialog.cpp:56
-msgid "Using SDL driver "
-msgstr "Utilizzo del driver SDL "
-
-#: backends/platform/wince/CELauncherDialog.cpp:60
-msgid "Display "
-msgstr "Visualizza "
-
-#: 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:515
-msgid "Map right click action"
-msgstr "Mappa l'azione del tasto destro"
-
-#: 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:528
-msgid "Map hide toolbar action"
-msgstr "Mappa l'azione nascondi barra degli strumenti"
-
-#: 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:541
-msgid "Map Zoom Up action (optional)"
-msgstr "Mappa l'azione Zoom Up (opzionale)"
-
-#: 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:552
-msgid ""
-"Don't forget to map a key to 'Hide Toolbar' action to see the whole inventory"
-msgstr ""
-"Non dimenticare di mappare un tasto per l'azione \"Nascondi barra degli "
-"strumenti\" per vedere l'intero inventario"
-
-#: backends/events/default/default-events.cpp:193
-msgid "Do you really want to return to the Launcher?"
-msgstr "Sei sicuro di voler tornare all'elenco giochi?"
-
-#: backends/events/default/default-events.cpp:193
-msgid "Launcher"
-msgstr "Elenco giochi"
-
-#: backends/events/default/default-events.cpp:215
-msgid "Do you really want to quit?"
-msgstr "Sei sicuro di voler uscire?"
-
-#: backends/events/gph/gph-events.cpp:386
-#: backends/events/gph/gph-events.cpp:429
-#: backends/events/openpandora/op-events.cpp:168
-msgid "Touchscreen 'Tap Mode' - Left Click"
-msgstr "Touchscreen 'Tap Mode' - Clic sinistro"
-
-#: backends/events/gph/gph-events.cpp:388
-#: backends/events/gph/gph-events.cpp:431
-#: backends/events/openpandora/op-events.cpp:170
-msgid "Touchscreen 'Tap Mode' - Right Click"
-msgstr "Touchscreen 'Tap Mode' - Clic destro"
-
-#: backends/events/gph/gph-events.cpp:390
-#: backends/events/gph/gph-events.cpp:433
-#: backends/events/openpandora/op-events.cpp:172
-msgid "Touchscreen 'Tap Mode' - Hover (No Click)"
-msgstr "Touchscreen 'Tap Mode' - Passaggio del cursore (nessun clic)"
-
-#: backends/events/gph/gph-events.cpp:410
-msgid "Maximum Volume"
-msgstr "Volume massimo"
+#~ msgctxt "lowres"
+#~ msgid "Mass Add..."
+#~ msgstr "Agg. massa..."
-#: backends/events/gph/gph-events.cpp:412
-msgid "Increasing Volume"
-msgstr "Aumento volume"
+#~ msgid "Mass Add..."
+#~ msgstr "Agg. in massa..."
-#: backends/events/gph/gph-events.cpp:418
-msgid "Minimal Volume"
-msgstr "Volume minimo"
+#~ msgid ""
+#~ "Turns off General MIDI mapping for games with Roland MT-32 soundtrack"
+#~ msgstr ""
+#~ "Disattiva la mappatura General MIDI per i giochi con colonna sonora "
+#~ "Roland MT-32"
-#: backends/events/gph/gph-events.cpp:420
-msgid "Decreasing Volume"
-msgstr "Diminuzione volume"
+#~ msgid "Standard (16bpp)"
+#~ msgstr "Standard (16bpp)"
-#: backends/events/openpandora/op-events.cpp:174
-msgid "Touchscreen 'Tap Mode' - Hover (DPad Clicks)"
-msgstr "Touchscreen 'Tap Mode' - Passaggio del cursore (clic DPad)"
+#~ msgid "Alternative intro"
+#~ msgstr "Intro alternativa"
-#: backends/updates/macosx/macosx-updates.mm:67
-msgid "Check for Updates..."
-msgstr "Cerca aggiornamenti..."
+#~ msgid "Use an alternative game intro (CD version only)"
+#~ msgstr "Usa un'intro del gioco alternativa (solo versione CD)"
-#: backends/platform/bada/form.cpp:269
-msgid "Right Click Once"
-msgstr "Un clic destro"
+#~ msgid "MPEG2 cutscenes are no longer supported"
+#~ msgstr "Le scene di intermezzo MPEG2 non sono più supportate"
-#: backends/platform/bada/form.cpp:277
-msgid "Move Only"
-msgstr "Muovi soltanto"
+#~ msgid "OpenGL Normal"
+#~ msgstr "OpenGL Normal"
-#: backends/platform/bada/form.cpp:291
-msgid "Escape Key"
-msgstr "Tasto Esc"
+#~ msgid "OpenGL Conserve"
+#~ msgstr "OpenGL Conserve"
-#: backends/platform/bada/form.cpp:296
-msgid "Game Menu"
-msgstr "Menu di gioco"
+#~ msgid "OpenGL Original"
+#~ msgstr "OpenGL Original"
-#: backends/platform/bada/form.cpp:301
-msgid "Show Keypad"
-msgstr "Mostra tastierino numerico"
+#~ msgid "Current display mode"
+#~ msgstr "Modalità visualizzazione attuale"
-#: backends/platform/bada/form.cpp:309
-msgid "Control Mouse"
-msgstr "Controllo mouse"
+#~ msgid "Current scale"
+#~ msgstr "Dimensioni attuali"
-#: backends/events/maemosdl/maemosdl-events.cpp:192
-msgid "Clicking Enabled"
-msgstr "Clic attivato"
+#~ msgid "Active filter mode: Linear"
+#~ msgstr "Modalità filtro attiva: Lineare"
-#: backends/events/maemosdl/maemosdl-events.cpp:192
-msgid "Clicking Disabled"
-msgstr "Clic disattivato"
+#~ msgid "Active filter mode: Nearest"
+#~ msgstr "Modalità filtro attiva: Più vicino"
#~ msgid "Enable Roland GS Mode"
#~ msgstr "Attiva la modalità Roland GS"
diff --git a/po/nb_NO.po b/po/nb_NO.po
index f41e71f8ae..72b95cdb56 100644
--- a/po/nb_NO.po
+++ b/po/nb_NO.po
@@ -1,5 +1,5 @@
# Norwegian (Bokmaal) translation for ScummVM.
-# Copyright (C) 2010-2013 ScummVM Team
+# Copyright (C) 2010-2014 ScummVM Team
# This file is distributed under the same license as the ScummVM package.
# Einar Johan T. Sømåen <einarjohants@gmail.com>, 2010.
#
@@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: ScummVM 1.3.0svn\n"
"Report-Msgid-Bugs-To: scummvm-devel@lists.sf.net\n"
-"POT-Creation-Date: 2013-04-24 11:51+0100\n"
+"POT-Creation-Date: 2014-06-07 23:06+0100\n"
"PO-Revision-Date: 2013-04-24 14:05+0100\n"
"Last-Translator: Einar Johan Trøan Sømåen <einarjohants@gmail.com>\n"
"Language-Team: somaen <einarjohants@gmail.com>\n"
@@ -19,77 +19,77 @@ msgstr ""
"X-Poedit-SourceCharset: iso-8859-1\n"
"X-Generator: Poedit 1.5.5\n"
-#: gui/about.cpp:93
+#: gui/about.cpp:94
#, c-format
msgid "(built on %s)"
msgstr "(bygd den %s)"
-#: gui/about.cpp:100
+#: gui/about.cpp:101
msgid "Features compiled in:"
msgstr "Funksjoner innkompilert:"
-#: gui/about.cpp:109
+#: gui/about.cpp:110
msgid "Available engines:"
msgstr "Tilgjengelige motorer:"
-#: gui/browser.cpp:67
+#: gui/browser.cpp:68
msgid "Show hidden files"
msgstr "Vis skjulte filer"
-#: gui/browser.cpp:67
+#: gui/browser.cpp:68
msgid "Show files marked with the hidden attribute"
msgstr "Vis filer merket med «skjult»-attributten"
-#: gui/browser.cpp:71
+#: gui/browser.cpp:72
msgid "Go up"
msgstr "Gå tilbake"
-#: gui/browser.cpp:71 gui/browser.cpp:73
+#: gui/browser.cpp:72 gui/browser.cpp:74
msgid "Go to previous directory level"
msgstr "Gå til forrige mappenivå"
-#: gui/browser.cpp:73
+#: gui/browser.cpp:74
msgctxt "lowres"
msgid "Go up"
msgstr "Gå tilbake"
-#: gui/browser.cpp:74 gui/chooser.cpp:45 gui/KeysDialog.cpp:43
-#: gui/launcher.cpp:345 gui/massadd.cpp:94 gui/options.cpp:1238
-#: gui/saveload-dialog.cpp:215 gui/saveload-dialog.cpp:275
-#: gui/saveload-dialog.cpp:545 gui/saveload-dialog.cpp:919
-#: gui/themebrowser.cpp:54 gui/fluidsynth-dialog.cpp:151
-#: engines/engine.cpp:447 engines/drascula/saveload.cpp:51
-#: engines/scumm/dialogs.cpp:190 engines/sword1/control.cpp:865
-#: engines/parallaction/saveload.cpp:274 backends/platform/wii/options.cpp:48
-#: backends/events/default/default-events.cpp:193
-#: backends/events/default/default-events.cpp:215
+#: gui/browser.cpp:75 gui/chooser.cpp:46 gui/KeysDialog.cpp:43
+#: gui/launcher.cpp:351 gui/massadd.cpp:95 gui/options.cpp:1239
+#: gui/saveload-dialog.cpp:216 gui/saveload-dialog.cpp:276
+#: gui/saveload-dialog.cpp:547 gui/saveload-dialog.cpp:922
+#: gui/themebrowser.cpp:55 gui/fluidsynth-dialog.cpp:152
+#: engines/engine.cpp:452 backends/platform/wii/options.cpp:48
+#: backends/events/default/default-events.cpp:196
+#: backends/events/default/default-events.cpp:218
+#: engines/drascula/saveload.cpp:49 engines/parallaction/saveload.cpp:274
+#: engines/scumm/dialogs.cpp:191 engines/sword1/control.cpp:865
msgid "Cancel"
msgstr "Avbryt"
-#: gui/browser.cpp:75 gui/chooser.cpp:46 gui/themebrowser.cpp:55
+#: gui/browser.cpp:76 gui/chooser.cpp:47 gui/themebrowser.cpp:56
msgid "Choose"
msgstr "Velg"
-#: gui/gui-manager.cpp:115 engines/scumm/help.cpp:125
-#: engines/scumm/help.cpp:140 engines/scumm/help.cpp:165
-#: engines/scumm/help.cpp:191 engines/scumm/help.cpp:209
-#: backends/keymapper/remap-dialog.cpp:52
+#: gui/gui-manager.cpp:117 backends/keymapper/remap-dialog.cpp:53
+#: engines/scumm/help.cpp:125 engines/scumm/help.cpp:140
+#: engines/scumm/help.cpp:165 engines/scumm/help.cpp:191
+#: engines/scumm/help.cpp:209
msgid "Close"
msgstr "Lukk"
-#: gui/gui-manager.cpp:118
+#: gui/gui-manager.cpp:120
msgid "Mouse click"
msgstr "Musklikk"
-#: gui/gui-manager.cpp:122 base/main.cpp:301
+#: gui/gui-manager.cpp:124 base/main.cpp:319
msgid "Display keyboard"
msgstr "Vis tastatur"
-#: gui/gui-manager.cpp:126 base/main.cpp:305
+#: gui/gui-manager.cpp:128 base/main.cpp:323
msgid "Remap keys"
msgstr "Omkoble taster"
-#: gui/gui-manager.cpp:129 base/main.cpp:308
+#: gui/gui-manager.cpp:131 base/main.cpp:326
msgid "Toggle FullScreen"
msgstr "Veksle fullskjerm"
@@ -101,21 +101,21 @@ msgstr "Velg en handling for kobling"
msgid "Map"
msgstr "Koble"
-#: gui/KeysDialog.cpp:42 gui/launcher.cpp:346 gui/launcher.cpp:1001
-#: gui/launcher.cpp:1005 gui/massadd.cpp:91 gui/options.cpp:1239
-#: gui/saveload-dialog.cpp:920 gui/fluidsynth-dialog.cpp:152
-#: engines/engine.cpp:366 engines/engine.cpp:377
-#: engines/drascula/saveload.cpp:51 engines/scumm/dialogs.cpp:192
-#: engines/scumm/scumm.cpp:1778 engines/agos/animation.cpp:558
-#: engines/groovie/script.cpp:420 engines/sky/compact.cpp:131
-#: engines/sky/compact.cpp:141 engines/sword1/animation.cpp:519
-#: engines/sword1/animation.cpp:540 engines/sword1/animation.cpp:550
-#: engines/sword1/animation.cpp:557 engines/sword1/control.cpp:865
-#: engines/sword1/logic.cpp:1633 engines/sword2/animation.cpp:419
-#: engines/sword2/animation.cpp:439 engines/sword2/animation.cpp:449
-#: engines/sword2/animation.cpp:458 engines/parallaction/saveload.cpp:274
+#: gui/KeysDialog.cpp:42 gui/launcher.cpp:352 gui/launcher.cpp:1048
+#: gui/launcher.cpp:1052 gui/massadd.cpp:92 gui/options.cpp:1240
+#: gui/saveload-dialog.cpp:923 gui/fluidsynth-dialog.cpp:153
+#: engines/engine.cpp:371 engines/engine.cpp:382
#: backends/platform/wii/options.cpp:47
#: backends/platform/wince/CELauncherDialog.cpp:54
+#: engines/agos/animation.cpp:558 engines/drascula/saveload.cpp:49
+#: engines/groovie/script.cpp:399 engines/parallaction/saveload.cpp:274
+#: engines/scumm/dialogs.cpp:193 engines/scumm/scumm.cpp:1779
+#: engines/sky/compact.cpp:131 engines/sky/compact.cpp:141
+#: engines/sword1/animation.cpp:524 engines/sword1/animation.cpp:545
+#: engines/sword1/animation.cpp:561 engines/sword1/animation.cpp:569
+#: engines/sword1/control.cpp:865 engines/sword1/logic.cpp:1633
+#: engines/sword2/animation.cpp:425 engines/sword2/animation.cpp:445
+#: engines/sword2/animation.cpp:461 engines/sword2/animation.cpp:471
msgid "OK"
msgstr "OK"
@@ -141,15 +141,15 @@ msgstr "Vennligst velg en handling"
msgid "Press the key to associate"
msgstr "Trykk tasten som skal kobles"
-#: gui/launcher.cpp:187
+#: gui/launcher.cpp:193
msgid "Game"
msgstr "Spill"
-#: gui/launcher.cpp:191
+#: gui/launcher.cpp:197
msgid "ID:"
msgstr "ID:"
-#: gui/launcher.cpp:191 gui/launcher.cpp:193 gui/launcher.cpp:194
+#: gui/launcher.cpp:197 gui/launcher.cpp:199 gui/launcher.cpp:200
msgid ""
"Short game identifier used for referring to savegames and running the game "
"from the command line"
@@ -157,29 +157,29 @@ msgstr ""
"Kort spill-identifikator, brukt for å referere til lagrede spill, og å kjøre "
"spillet fra kommandolinjen"
-#: gui/launcher.cpp:193
+#: gui/launcher.cpp:199
msgctxt "lowres"
msgid "ID:"
msgstr "ID:"
-#: gui/launcher.cpp:198
+#: gui/launcher.cpp:204
msgid "Name:"
msgstr "Navn:"
-#: gui/launcher.cpp:198 gui/launcher.cpp:200 gui/launcher.cpp:201
+#: gui/launcher.cpp:204 gui/launcher.cpp:206 gui/launcher.cpp:207
msgid "Full title of the game"
msgstr "Full spilltittel"
-#: gui/launcher.cpp:200
+#: gui/launcher.cpp:206
msgctxt "lowres"
msgid "Name:"
msgstr "Navn:"
-#: gui/launcher.cpp:204
+#: gui/launcher.cpp:210
msgid "Language:"
msgstr "Språk:"
-#: gui/launcher.cpp:204 gui/launcher.cpp:205
+#: gui/launcher.cpp:210 gui/launcher.cpp:211
msgid ""
"Language of the game. This will not turn your Spanish game version into "
"English"
@@ -187,286 +187,287 @@ msgstr ""
"Spillets språk. Dette vil ikke gjøre din spanske spillversjon om til engelsk "
"versjon"
-#: gui/launcher.cpp:206 gui/launcher.cpp:220 gui/options.cpp:86
-#: gui/options.cpp:736 gui/options.cpp:749 gui/options.cpp:1209
-#: audio/null.cpp:40
+#: gui/launcher.cpp:212 gui/launcher.cpp:226 gui/options.cpp:87
+#: gui/options.cpp:737 gui/options.cpp:750 gui/options.cpp:1210
+#: audio/null.cpp:41
msgid "<default>"
msgstr "<standard>"
-#: gui/launcher.cpp:216
+#: gui/launcher.cpp:222
msgid "Platform:"
msgstr "Plattform:"
-#: gui/launcher.cpp:216 gui/launcher.cpp:218 gui/launcher.cpp:219
+#: gui/launcher.cpp:222 gui/launcher.cpp:224 gui/launcher.cpp:225
msgid "Platform the game was originally designed for"
msgstr "Plattform spillet opprinnelig ble designet for"
-#: gui/launcher.cpp:218
+#: gui/launcher.cpp:224
msgctxt "lowres"
msgid "Platform:"
msgstr "Plattform:"
-#: gui/launcher.cpp:231
+#: gui/launcher.cpp:237
msgid "Engine"
msgstr "Motor"
-#: gui/launcher.cpp:239 gui/options.cpp:1072 gui/options.cpp:1089
+#: gui/launcher.cpp:245 gui/options.cpp:1073 gui/options.cpp:1090
msgid "Graphics"
msgstr "Grafikk"
-#: gui/launcher.cpp:239 gui/options.cpp:1072 gui/options.cpp:1089
+#: gui/launcher.cpp:245 gui/options.cpp:1073 gui/options.cpp:1090
msgid "GFX"
msgstr "GFX"
-#: gui/launcher.cpp:242
+#: gui/launcher.cpp:248
msgid "Override global graphic settings"
msgstr "Overstyr globale grafikkinstillinger"
-#: gui/launcher.cpp:244
+#: gui/launcher.cpp:250
msgctxt "lowres"
msgid "Override global graphic settings"
msgstr "Overstyr globale grafikkinstillinger"
-#: gui/launcher.cpp:251 gui/options.cpp:1095
+#: gui/launcher.cpp:257 gui/options.cpp:1096
msgid "Audio"
msgstr "Lyd"
-#: gui/launcher.cpp:254
+#: gui/launcher.cpp:260
msgid "Override global audio settings"
msgstr "Overstyr globale lydinstillinger"
-#: gui/launcher.cpp:256
+#: gui/launcher.cpp:262
msgctxt "lowres"
msgid "Override global audio settings"
msgstr "Overstyr globale lydinstillinger"
-#: gui/launcher.cpp:265 gui/options.cpp:1100
+#: gui/launcher.cpp:271 gui/options.cpp:1101
msgid "Volume"
msgstr "Volum"
-#: gui/launcher.cpp:267 gui/options.cpp:1102
+#: gui/launcher.cpp:273 gui/options.cpp:1103
msgctxt "lowres"
msgid "Volume"
msgstr "Volum"
-#: gui/launcher.cpp:270
+#: gui/launcher.cpp:276
msgid "Override global volume settings"
msgstr "Overstyr globale voluminstillinger"
-#: gui/launcher.cpp:272
+#: gui/launcher.cpp:278
msgctxt "lowres"
msgid "Override global volume settings"
msgstr "Overstyr globale voluminstillinger"
-#: gui/launcher.cpp:280 gui/options.cpp:1110
+#: gui/launcher.cpp:286 gui/options.cpp:1111
msgid "MIDI"
msgstr "MIDI"
-#: gui/launcher.cpp:283
+#: gui/launcher.cpp:289
msgid "Override global MIDI settings"
msgstr "Overstyr globale MIDI-instillinger"
-#: gui/launcher.cpp:285
+#: gui/launcher.cpp:291
msgctxt "lowres"
msgid "Override global MIDI settings"
msgstr "Overstyr globale MIDI-instillinger"
-#: gui/launcher.cpp:294 gui/options.cpp:1116
+#: gui/launcher.cpp:300 gui/options.cpp:1117
msgid "MT-32"
msgstr "MT-32"
-#: gui/launcher.cpp:297
+#: gui/launcher.cpp:303
msgid "Override global MT-32 settings"
msgstr "Overstyr globale MT-32-instillinger"
-#: gui/launcher.cpp:299
+#: gui/launcher.cpp:305
msgctxt "lowres"
msgid "Override global MT-32 settings"
msgstr "Overstyr globale MT-32-instillinger"
-#: gui/launcher.cpp:308 gui/options.cpp:1123
+#: gui/launcher.cpp:314 gui/options.cpp:1124
msgid "Paths"
msgstr "Sti"
-#: gui/launcher.cpp:310 gui/options.cpp:1125
+#: gui/launcher.cpp:316 gui/options.cpp:1126
msgctxt "lowres"
msgid "Paths"
msgstr "Sti"
-#: gui/launcher.cpp:317
+#: gui/launcher.cpp:323
msgid "Game Path:"
msgstr "Spillsti:"
-#: gui/launcher.cpp:319
+#: gui/launcher.cpp:325
msgctxt "lowres"
msgid "Game Path:"
msgstr "Spillsti:"
-#: gui/launcher.cpp:324 gui/options.cpp:1149
+#: gui/launcher.cpp:330 gui/options.cpp:1150
msgid "Extra Path:"
msgstr "Ekstrasti:"
-#: gui/launcher.cpp:324 gui/launcher.cpp:326 gui/launcher.cpp:327
+#: gui/launcher.cpp:330 gui/launcher.cpp:332 gui/launcher.cpp:333
msgid "Specifies path to additional data used the game"
msgstr "Bestemmer sti til ytterligere data brukt av spillet"
-#: gui/launcher.cpp:326 gui/options.cpp:1151
+#: gui/launcher.cpp:332 gui/options.cpp:1152
msgctxt "lowres"
msgid "Extra Path:"
msgstr "Ekstrasti:"
-#: gui/launcher.cpp:333 gui/options.cpp:1133
+#: gui/launcher.cpp:339 gui/options.cpp:1134
msgid "Save Path:"
msgstr "Lagringssti:"
-#: gui/launcher.cpp:333 gui/launcher.cpp:335 gui/launcher.cpp:336
-#: gui/options.cpp:1133 gui/options.cpp:1135 gui/options.cpp:1136
+#: gui/launcher.cpp:339 gui/launcher.cpp:341 gui/launcher.cpp:342
+#: gui/options.cpp:1134 gui/options.cpp:1136 gui/options.cpp:1137
msgid "Specifies where your savegames are put"
msgstr "Bestemmer sti til lagrede spill"
-#: gui/launcher.cpp:335 gui/options.cpp:1135
+#: gui/launcher.cpp:341 gui/options.cpp:1136
msgctxt "lowres"
msgid "Save Path:"
msgstr "Lagringssti:"
-#: gui/launcher.cpp:354 gui/launcher.cpp:453 gui/launcher.cpp:511
-#: gui/launcher.cpp:565 gui/options.cpp:1144 gui/options.cpp:1152
-#: gui/options.cpp:1161 gui/options.cpp:1276 gui/options.cpp:1282
-#: gui/options.cpp:1290 gui/options.cpp:1320 gui/options.cpp:1326
-#: gui/options.cpp:1333 gui/options.cpp:1426 gui/options.cpp:1429
-#: gui/options.cpp:1441
+#: gui/launcher.cpp:360 gui/launcher.cpp:459 gui/launcher.cpp:517
+#: gui/launcher.cpp:571 gui/options.cpp:1145 gui/options.cpp:1153
+#: gui/options.cpp:1162 gui/options.cpp:1277 gui/options.cpp:1283
+#: gui/options.cpp:1291 gui/options.cpp:1321 gui/options.cpp:1327
+#: gui/options.cpp:1334 gui/options.cpp:1427 gui/options.cpp:1430
+#: gui/options.cpp:1442
msgctxt "path"
msgid "None"
msgstr "Ingen"
-#: gui/launcher.cpp:359 gui/launcher.cpp:459 gui/launcher.cpp:569
-#: gui/options.cpp:1270 gui/options.cpp:1314 gui/options.cpp:1432
+#: gui/launcher.cpp:365 gui/launcher.cpp:465 gui/launcher.cpp:575
+#: gui/options.cpp:1271 gui/options.cpp:1315 gui/options.cpp:1433
#: backends/platform/wii/options.cpp:56
msgid "Default"
msgstr "Standard"
-#: gui/launcher.cpp:504 gui/options.cpp:1435
+#: gui/launcher.cpp:510 gui/options.cpp:1436
msgid "Select SoundFont"
msgstr "Velg SoundFont"
-#: gui/launcher.cpp:523 gui/launcher.cpp:677
+#: gui/launcher.cpp:529 gui/launcher.cpp:682
msgid "Select directory with game data"
msgstr "Velg mappe med spilldata"
-#: gui/launcher.cpp:541
+#: gui/launcher.cpp:547
msgid "Select additional game directory"
msgstr "Velg mappe med ytterligere data"
-#: gui/launcher.cpp:553
+#: gui/launcher.cpp:559
msgid "Select directory for saved games"
msgstr "Velg mappe for lagrede spill"
-#: gui/launcher.cpp:580
+#: gui/launcher.cpp:586
msgid "This game ID is already taken. Please choose another one."
msgstr "Denne spill-IDen er allerede i bruk. Vennligst velg en annen."
-#: gui/launcher.cpp:621 engines/dialogs.cpp:110
+#: gui/launcher.cpp:626 engines/dialogs.cpp:111
msgid "~Q~uit"
msgstr "~A~vslutt"
-#: gui/launcher.cpp:621 backends/platform/sdl/macosx/appmenu_osx.mm:95
+#: gui/launcher.cpp:626 backends/platform/sdl/macosx/appmenu_osx.mm:95
msgid "Quit ScummVM"
msgstr "Avslutt ScummVM"
-#: gui/launcher.cpp:622
+#: gui/launcher.cpp:627
msgid "A~b~out..."
msgstr "~O~m..."
-#: gui/launcher.cpp:622 backends/platform/sdl/macosx/appmenu_osx.mm:69
+#: gui/launcher.cpp:627 backends/platform/sdl/macosx/appmenu_osx.mm:69
msgid "About ScummVM"
msgstr "Om ScummVM"
-#: gui/launcher.cpp:623
+#: gui/launcher.cpp:628
msgid "~O~ptions..."
msgstr "~V~alg..."
-#: gui/launcher.cpp:623
+#: gui/launcher.cpp:628
msgid "Change global ScummVM options"
msgstr "Endre globale ScummVM-innstillinger"
-#: gui/launcher.cpp:625
+#: gui/launcher.cpp:630
msgid "~S~tart"
msgstr "~S~tart"
-#: gui/launcher.cpp:625
+#: gui/launcher.cpp:630
msgid "Start selected game"
msgstr "Start valgt spill"
-#: gui/launcher.cpp:628
+#: gui/launcher.cpp:633
msgid "~L~oad..."
msgstr "~Å~pne..."
-#: gui/launcher.cpp:628
+#: gui/launcher.cpp:633
msgid "Load savegame for selected game"
msgstr "Åpne lagret spill for det valgte spillet"
-#: gui/launcher.cpp:633 gui/launcher.cpp:1120
+#: gui/launcher.cpp:638
msgid "~A~dd Game..."
msgstr "~L~egg til spill..."
-#: gui/launcher.cpp:633 gui/launcher.cpp:640
+#: gui/launcher.cpp:638 gui/launcher.cpp:645
msgid "Hold Shift for Mass Add"
msgstr "Hold Shift for å legge til flere"
-#: gui/launcher.cpp:635
+#: gui/launcher.cpp:640
msgid "~E~dit Game..."
msgstr "~R~ediger spill..."
-#: gui/launcher.cpp:635 gui/launcher.cpp:642
+#: gui/launcher.cpp:640 gui/launcher.cpp:647
msgid "Change game options"
msgstr "Endre spillinstillinger"
-#: gui/launcher.cpp:637
+#: gui/launcher.cpp:642
msgid "~R~emove Game"
msgstr "~F~jern spill"
-#: gui/launcher.cpp:637 gui/launcher.cpp:644
+#: gui/launcher.cpp:642 gui/launcher.cpp:649
msgid "Remove game from the list. The game data files stay intact"
msgstr "Fjern spill fra listen. Spilldataene forblir intakte"
-#: gui/launcher.cpp:640 gui/launcher.cpp:1120
+#: gui/launcher.cpp:645
msgctxt "lowres"
msgid "~A~dd Game..."
msgstr "~L~egg til spill..."
-#: gui/launcher.cpp:642
+#: gui/launcher.cpp:647
msgctxt "lowres"
msgid "~E~dit Game..."
msgstr "~R~ediger spill..."
-#: gui/launcher.cpp:644
+#: gui/launcher.cpp:649
msgctxt "lowres"
msgid "~R~emove Game"
msgstr "~F~jern spill"
-#: gui/launcher.cpp:652
+#: gui/launcher.cpp:657
msgid "Search in game list"
msgstr "Søk i spilliste"
-#: gui/launcher.cpp:656 gui/launcher.cpp:1167
+#: gui/launcher.cpp:661 gui/launcher.cpp:1222
msgid "Search:"
msgstr "Søk:"
-#: gui/launcher.cpp:680 engines/dialogs.cpp:114 engines/mohawk/myst.cpp:245
-#: engines/mohawk/riven.cpp:716 engines/cruise/menu.cpp:214
-#: engines/pegasus/pegasus.cpp:349
+#: gui/launcher.cpp:685 engines/dialogs.cpp:115 engines/cruise/menu.cpp:214
+#: engines/mohawk/myst.cpp:245 engines/mohawk/riven.cpp:718
+#: engines/pegasus/pegasus.cpp:353
msgid "Load game:"
msgstr "Åpne spill:"
-#: gui/launcher.cpp:680 engines/dialogs.cpp:114 engines/scumm/dialogs.cpp:188
-#: engines/mohawk/myst.cpp:245 engines/mohawk/riven.cpp:716
-#: engines/cruise/menu.cpp:214 engines/pegasus/pegasus.cpp:349
+#: gui/launcher.cpp:685 engines/dialogs.cpp:115
#: backends/platform/wince/CEActionsPocket.cpp:267
#: backends/platform/wince/CEActionsSmartphone.cpp:231
+#: engines/cruise/menu.cpp:214 engines/mohawk/myst.cpp:245
+#: engines/mohawk/riven.cpp:718 engines/pegasus/pegasus.cpp:353
+#: engines/scumm/dialogs.cpp:189
msgid "Load"
msgstr "Åpne"
-#: gui/launcher.cpp:788
+#: gui/launcher.cpp:792
msgid ""
"Do you really want to run the mass game detector? This could potentially add "
"a huge number of games."
@@ -474,7 +475,8 @@ msgstr ""
"Vil du virkelig kjøre flerspill-finneren? Dette kan potensielt legge til et "
"stort antall spill."
-#: gui/launcher.cpp:789 gui/launcher.cpp:937 gui/fluidsynth-dialog.cpp:216
+#: gui/launcher.cpp:793 gui/launcher.cpp:941 gui/launcher.cpp:1000
+#: gui/fluidsynth-dialog.cpp:217
#: backends/events/symbiansdl/symbiansdl-events.cpp:184
#: backends/platform/wince/CEActionsPocket.cpp:326
#: backends/platform/wince/CEActionsSmartphone.cpp:287
@@ -482,7 +484,8 @@ msgstr ""
msgid "Yes"
msgstr "Ja"
-#: gui/launcher.cpp:789 gui/launcher.cpp:937 gui/fluidsynth-dialog.cpp:216
+#: gui/launcher.cpp:793 gui/launcher.cpp:941 gui/launcher.cpp:1000
+#: gui/fluidsynth-dialog.cpp:217
#: backends/events/symbiansdl/symbiansdl-events.cpp:184
#: backends/platform/wince/CEActionsPocket.cpp:326
#: backends/platform/wince/CEActionsSmartphone.cpp:287
@@ -490,192 +493,187 @@ msgstr "Ja"
msgid "No"
msgstr "Nei"
-#: gui/launcher.cpp:837
+#: gui/launcher.cpp:841
msgid "ScummVM couldn't open the specified directory!"
msgstr "ScummVM kunne ikke åpne den valgte mappen!"
-#: gui/launcher.cpp:849
+#: gui/launcher.cpp:853
msgid "ScummVM could not find any game in the specified directory!"
msgstr "ScummVM kunne ikke finne noe spill i den valgte mappen!"
-#: gui/launcher.cpp:863
+#: gui/launcher.cpp:867
msgid "Pick the game:"
msgstr "Velg spill:"
-#: gui/launcher.cpp:937
+#: gui/launcher.cpp:941
msgid "Do you really want to remove this game configuration?"
msgstr "Vil du virkelig fjerne denne spillkonfigurasjonen?"
-#: gui/launcher.cpp:1001
+#: gui/launcher.cpp:999
+#, fuzzy
+msgid "Do you want to load savegame?"
+msgstr "Vil du åpne eller lagre spillet?"
+
+#: gui/launcher.cpp:1048
msgid "This game does not support loading games from the launcher."
msgstr "Dette spillet støtter ikke lasting av spill fra oppstarteren."
-#: gui/launcher.cpp:1005
+#: gui/launcher.cpp:1052
msgid "ScummVM could not find any engine capable of running the selected game!"
msgstr ""
"ScummVM kunne ikke finne noen motor som kunne kjøre det valgte spillet!"
-#: gui/launcher.cpp:1119
-msgctxt "lowres"
-msgid "Mass Add..."
-msgstr "Legg til flere..."
-
-#: gui/launcher.cpp:1119
-msgid "Mass Add..."
-msgstr "Legg til flere..."
-
-#: gui/massadd.cpp:78 gui/massadd.cpp:81
+#: gui/massadd.cpp:79 gui/massadd.cpp:82
msgid "... progress ..."
msgstr "... fremdrift ..."
-#: gui/massadd.cpp:258
+#: gui/massadd.cpp:259
msgid "Scan complete!"
msgstr "Søk fullført!"
-#: gui/massadd.cpp:261
+#: gui/massadd.cpp:262
#, c-format
msgid "Discovered %d new games, ignored %d previously added games."
msgstr ""
"Fant %d nye spill, ignorerte %d spill som har blitt lagt til tidligere."
-#: gui/massadd.cpp:265
+#: gui/massadd.cpp:266
#, c-format
msgid "Scanned %d directories ..."
msgstr "Sjekket %d mapper ..."
-#: gui/massadd.cpp:268
+#: gui/massadd.cpp:269
#, c-format
msgid "Discovered %d new games, ignored %d previously added games ..."
msgstr ""
"Fant %d nye spill, ignorerte %d spill som har blitt lagt til tidligere..."
-#: gui/options.cpp:84
+#: gui/options.cpp:85
msgid "Never"
msgstr "Aldri"
-#: gui/options.cpp:84
+#: gui/options.cpp:85
msgid "every 5 mins"
msgstr "hvert 5. min"
-#: gui/options.cpp:84
+#: gui/options.cpp:85
msgid "every 10 mins"
msgstr "hvert 10. min"
-#: gui/options.cpp:84
+#: gui/options.cpp:85
msgid "every 15 mins"
msgstr "hvert 15. min"
-#: gui/options.cpp:84
+#: gui/options.cpp:85
msgid "every 30 mins"
msgstr "hvert 30. min"
-#: gui/options.cpp:86
+#: gui/options.cpp:87
msgid "8 kHz"
msgstr "8 kHz"
-#: gui/options.cpp:86
+#: gui/options.cpp:87
msgid "11kHz"
msgstr "11kHz"
-#: gui/options.cpp:86
+#: gui/options.cpp:87
msgid "22 kHz"
msgstr "22 kHz"
-#: gui/options.cpp:86
+#: gui/options.cpp:87
msgid "44 kHz"
msgstr "44 kHz"
-#: gui/options.cpp:86
+#: gui/options.cpp:87
msgid "48 kHz"
msgstr "48 kHz"
-#: gui/options.cpp:254 gui/options.cpp:480 gui/options.cpp:581
-#: gui/options.cpp:650 gui/options.cpp:858
+#: gui/options.cpp:255 gui/options.cpp:481 gui/options.cpp:582
+#: gui/options.cpp:651 gui/options.cpp:859
msgctxt "soundfont"
msgid "None"
msgstr "Ingen"
-#: gui/options.cpp:388
+#: gui/options.cpp:389
msgid "Failed to apply some of the graphic options changes:"
msgstr "Klarte ikke å aktivere enkelte av endringene i grafikkinstillinger:"
-#: gui/options.cpp:400
+#: gui/options.cpp:401
msgid "the video mode could not be changed."
msgstr "videomodusen kunne ikke endres."
-#: gui/options.cpp:406
+#: gui/options.cpp:407
msgid "the fullscreen setting could not be changed"
msgstr "fullskjermsinnstillingen kunne ikke endres"
-#: gui/options.cpp:412
+#: gui/options.cpp:413
msgid "the aspect ratio setting could not be changed"
msgstr "aspektrate-innstillingen kunne ikke endres"
-#: gui/options.cpp:733
+#: gui/options.cpp:734
msgid "Graphics mode:"
msgstr "Grafikkmodus:"
-#: gui/options.cpp:747
+#: gui/options.cpp:748
msgid "Render mode:"
msgstr "Tegnemodus:"
-#: gui/options.cpp:747 gui/options.cpp:748
+#: gui/options.cpp:748 gui/options.cpp:749
msgid "Special dithering modes supported by some games"
msgstr "Spesiel dithering-modus støttet av enkelte spill"
-#: gui/options.cpp:759
-#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2236
-#: backends/graphics/openglsdl/openglsdl-graphics.cpp:476
+#: gui/options.cpp:760
+#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2249
msgid "Fullscreen mode"
msgstr "Fullskjermsmodus"
-#: gui/options.cpp:762
+#: gui/options.cpp:763
msgid "Aspect ratio correction"
msgstr "Aspekt-rate korrigering"
-#: gui/options.cpp:762
+#: gui/options.cpp:763
msgid "Correct aspect ratio for 320x200 games"
msgstr "Korriger aspekt-rate for 320x200-spill"
-#: gui/options.cpp:770
+#: gui/options.cpp:771
msgid "Preferred Device:"
msgstr "Foretrukket enhet:"
-#: gui/options.cpp:770
+#: gui/options.cpp:771
msgid "Music Device:"
msgstr "Musikkenhet:"
-#: gui/options.cpp:770 gui/options.cpp:772
+#: gui/options.cpp:771 gui/options.cpp:773
msgid "Specifies preferred sound device or sound card emulator"
msgstr "Velger foretrukket lydenhet eller lydkort-emulator"
-#: gui/options.cpp:770 gui/options.cpp:772 gui/options.cpp:773
+#: gui/options.cpp:771 gui/options.cpp:773 gui/options.cpp:774
msgid "Specifies output sound device or sound card emulator"
msgstr "Velger ut-lydenhet eller lydkortemulator"
-#: gui/options.cpp:772
+#: gui/options.cpp:773
msgctxt "lowres"
msgid "Preferred Dev.:"
msgstr "Foretrukket enh.:"
-#: gui/options.cpp:772
+#: gui/options.cpp:773
msgctxt "lowres"
msgid "Music Device:"
msgstr "Musikkenhet:"
-#: gui/options.cpp:799
+#: gui/options.cpp:800
msgid "AdLib emulator:"
msgstr "AdLib-emulator:"
-#: gui/options.cpp:799 gui/options.cpp:800
+#: gui/options.cpp:800 gui/options.cpp:801
msgid "AdLib is used for music in many games"
msgstr "AdLib brukes til musikk i mange spill"
-#: gui/options.cpp:810
+#: gui/options.cpp:811
msgid "Output rate:"
msgstr "Utrate:"
-#: gui/options.cpp:810 gui/options.cpp:811
+#: gui/options.cpp:811 gui/options.cpp:812
msgid ""
"Higher value specifies better sound quality but may be not supported by your "
"soundcard"
@@ -683,64 +681,64 @@ msgstr ""
"Høyere verdier gir bedre lydkvalitet, men støttes kanskje ikke av ditt "
"lydkort "
-#: gui/options.cpp:821
+#: gui/options.cpp:822
msgid "GM Device:"
msgstr "GM-enhet:"
-#: gui/options.cpp:821
+#: gui/options.cpp:822
msgid "Specifies default sound device for General MIDI output"
msgstr "Velger standard lydenhet for General MIDI-utdata"
-#: gui/options.cpp:832
+#: gui/options.cpp:833
msgid "Don't use General MIDI music"
msgstr "Ikke bruk General MIDI-musikk"
-#: gui/options.cpp:843 gui/options.cpp:909
+#: gui/options.cpp:844 gui/options.cpp:910
msgid "Use first available device"
msgstr "Bruk første tilgjengelige enhet"
-#: gui/options.cpp:855
+#: gui/options.cpp:856
msgid "SoundFont:"
msgstr "SoundFont:"
-#: gui/options.cpp:855 gui/options.cpp:857 gui/options.cpp:858
+#: gui/options.cpp:856 gui/options.cpp:858 gui/options.cpp:859
msgid "SoundFont is supported by some audio cards, Fluidsynth and Timidity"
msgstr "SoundFont støttes ikke av enkelte lydkort, FluidSynth og Timidity"
-#: gui/options.cpp:857
+#: gui/options.cpp:858
msgctxt "lowres"
msgid "SoundFont:"
msgstr "SoundFont:"
-#: gui/options.cpp:863
+#: gui/options.cpp:864
msgid "Mixed AdLib/MIDI mode"
msgstr "Mikset AdLib/MIDI-modus"
-#: gui/options.cpp:863
+#: gui/options.cpp:864
msgid "Use both MIDI and AdLib sound generation"
msgstr "Bruk både MIDI- og AdLib- lydgenerering"
-#: gui/options.cpp:866
+#: gui/options.cpp:867
msgid "MIDI gain:"
msgstr "MIDI gain:"
-#: gui/options.cpp:873
+#: gui/options.cpp:874
msgid "FluidSynth Settings"
msgstr "FluidSynth-instillinger"
-#: gui/options.cpp:880
+#: gui/options.cpp:881
msgid "MT-32 Device:"
msgstr "MT-32 Enhet:"
-#: gui/options.cpp:880
+#: gui/options.cpp:881
msgid "Specifies default sound device for Roland MT-32/LAPC1/CM32l/CM64 output"
msgstr "Velger standard lydenhet for Roland MT-32/LAPC1/CM32I/CM64-avspilling"
-#: gui/options.cpp:885
+#: gui/options.cpp:886
msgid "True Roland MT-32 (disable GM emulation)"
msgstr "Ekte Roland MT-32 (deaktiver GM-emulering)"
-#: gui/options.cpp:885 gui/options.cpp:887
+#: gui/options.cpp:886 gui/options.cpp:888
msgid ""
"Check if you want to use your real hardware Roland-compatible sound device "
"connected to your computer"
@@ -748,190 +746,193 @@ msgstr ""
"Velg hvis du har et ekte Roland-kompatible lydkort tilkoblet maskinen, og "
"vil bruke dette."
-#: gui/options.cpp:887
+#: gui/options.cpp:888
msgctxt "lowres"
msgid "True Roland MT-32 (no GM emulation)"
msgstr "Ekte Roland MT-32 (deaktiver GM-emulering)"
-#: gui/options.cpp:890
-msgid "Roland GS Mode (disable GM mapping)"
+#: gui/options.cpp:891
+#, fuzzy
+msgid "Roland GS Device (enable MT-32 mappings)"
msgstr "Roland GS Modus (deaktiver GM-mapping)"
-#: gui/options.cpp:890
-msgid "Turns off General MIDI mapping for games with Roland MT-32 soundtrack"
-msgstr "Slå av General MIDI-kobling for spill som har Roland MT-32-lydspor"
+#: gui/options.cpp:891
+msgid ""
+"Check if you want to enable patch mappings to emulate an MT-32 on a Roland "
+"GS device"
+msgstr ""
-#: gui/options.cpp:899
+#: gui/options.cpp:900
msgid "Don't use Roland MT-32 music"
msgstr "Ikke bruk Roland MT-32-musikk"
-#: gui/options.cpp:926
+#: gui/options.cpp:927
msgid "Text and Speech:"
msgstr "Tekst og Tale:"
-#: gui/options.cpp:930 gui/options.cpp:940
+#: gui/options.cpp:931 gui/options.cpp:941
msgid "Speech"
msgstr "Tale"
-#: gui/options.cpp:931 gui/options.cpp:941
+#: gui/options.cpp:932 gui/options.cpp:942
msgid "Subtitles"
msgstr "Undertekster"
-#: gui/options.cpp:932
+#: gui/options.cpp:933
msgid "Both"
msgstr "Begge"
-#: gui/options.cpp:934
+#: gui/options.cpp:935
msgid "Subtitle speed:"
msgstr "Teksthastighet:"
-#: gui/options.cpp:936
+#: gui/options.cpp:937
msgctxt "lowres"
msgid "Text and Speech:"
msgstr "Tekst og Tale:"
-#: gui/options.cpp:940
+#: gui/options.cpp:941
msgid "Spch"
msgstr "Tale"
-#: gui/options.cpp:941
+#: gui/options.cpp:942
msgid "Subs"
msgstr "Tekst"
-#: gui/options.cpp:942
+#: gui/options.cpp:943
msgctxt "lowres"
msgid "Both"
msgstr "Begge"
-#: gui/options.cpp:942
+#: gui/options.cpp:943
msgid "Show subtitles and play speech"
msgstr "Vis undertekster, og spill av tale"
-#: gui/options.cpp:944
+#: gui/options.cpp:945
msgctxt "lowres"
msgid "Subtitle speed:"
msgstr "Underteksthastighet:"
-#: gui/options.cpp:960
+#: gui/options.cpp:961
msgid "Music volume:"
msgstr "Musikkvolum:"
-#: gui/options.cpp:962
+#: gui/options.cpp:963
msgctxt "lowres"
msgid "Music volume:"
msgstr "Musikkvolum:"
-#: gui/options.cpp:969
+#: gui/options.cpp:970
msgid "Mute All"
msgstr "Demp alle"
-#: gui/options.cpp:972
+#: gui/options.cpp:973
msgid "SFX volume:"
msgstr "Lydeffektvolum:"
-#: gui/options.cpp:972 gui/options.cpp:974 gui/options.cpp:975
+#: gui/options.cpp:973 gui/options.cpp:975 gui/options.cpp:976
msgid "Special sound effects volume"
msgstr "Volum for spesielle lydeffekter"
-#: gui/options.cpp:974
+#: gui/options.cpp:975
msgctxt "lowres"
msgid "SFX volume:"
msgstr "Lydeffektvolum:"
-#: gui/options.cpp:982
+#: gui/options.cpp:983
msgid "Speech volume:"
msgstr "Talevolum:"
-#: gui/options.cpp:984
+#: gui/options.cpp:985
msgctxt "lowres"
msgid "Speech volume:"
msgstr "Talevolum:"
-#: gui/options.cpp:1141
+#: gui/options.cpp:1142
msgid "Theme Path:"
msgstr "Temasti:"
-#: gui/options.cpp:1143
+#: gui/options.cpp:1144
msgctxt "lowres"
msgid "Theme Path:"
msgstr "Temasti:"
-#: gui/options.cpp:1149 gui/options.cpp:1151 gui/options.cpp:1152
+#: gui/options.cpp:1150 gui/options.cpp:1152 gui/options.cpp:1153
msgid "Specifies path to additional data used by all games or ScummVM"
msgstr "Velger sti for ytterligere data brukt av alle spill eller ScummVM"
-#: gui/options.cpp:1158
+#: gui/options.cpp:1159
msgid "Plugins Path:"
msgstr "Pluginsti:"
-#: gui/options.cpp:1160
+#: gui/options.cpp:1161
msgctxt "lowres"
msgid "Plugins Path:"
msgstr "Pluginsti:"
-#: gui/options.cpp:1169 gui/fluidsynth-dialog.cpp:137
+#: gui/options.cpp:1170 gui/fluidsynth-dialog.cpp:138
msgid "Misc"
msgstr "Div"
-#: gui/options.cpp:1171
+#: gui/options.cpp:1172
msgctxt "lowres"
msgid "Misc"
msgstr "Div"
-#: gui/options.cpp:1173
+#: gui/options.cpp:1174
msgid "Theme:"
msgstr "Tema:"
-#: gui/options.cpp:1177
+#: gui/options.cpp:1178
msgid "GUI Renderer:"
msgstr "GUI-tegner:"
-#: gui/options.cpp:1189
+#: gui/options.cpp:1190
msgid "Autosave:"
msgstr "Autolagre:"
-#: gui/options.cpp:1191
+#: gui/options.cpp:1192
msgctxt "lowres"
msgid "Autosave:"
msgstr "Autolagre:"
-#: gui/options.cpp:1199
+#: gui/options.cpp:1200
msgid "Keys"
msgstr "Taster"
-#: gui/options.cpp:1206
+#: gui/options.cpp:1207
msgid "GUI Language:"
msgstr "GUI-språk:"
-#: gui/options.cpp:1206
+#: gui/options.cpp:1207
msgid "Language of ScummVM GUI"
msgstr "Språk i ScummVM-GUIet"
-#: gui/options.cpp:1365
+#: gui/options.cpp:1366
msgid "You have to restart ScummVM before your changes will take effect."
msgstr "Du må starte ScummVM på nytt for at endringene skal tre i kraft. "
-#: gui/options.cpp:1378
+#: gui/options.cpp:1379
msgid "Select directory for savegames"
msgstr "Velg mappe for lagrede spill"
-#: gui/options.cpp:1385
+#: gui/options.cpp:1386
msgid "The chosen directory cannot be written to. Please select another one."
msgstr "Den valgte mappen kan ikke skrives til. Vennligst velg en annen."
-#: gui/options.cpp:1394
+#: gui/options.cpp:1395
msgid "Select directory for GUI themes"
msgstr "Velg mappe for GUI-temaer"
-#: gui/options.cpp:1404
+#: gui/options.cpp:1405
msgid "Select directory for extra files"
msgstr "Velg mappe for ytterligere filer"
-#: gui/options.cpp:1415
+#: gui/options.cpp:1416
msgid "Select directory for plugins"
msgstr "Velg mappe for plugins"
-#: gui/options.cpp:1468
+#: gui/options.cpp:1469
msgid ""
"The theme you selected does not support your current language. If you want "
"to use this theme you need to switch to another language first."
@@ -939,226 +940,229 @@ msgstr ""
"Temaet du valgte støtter ikke det aktive språket. Hvis du vil bruke dette "
"temaet, må du bytte til et annet språk først."
-#: gui/saveload-dialog.cpp:166
+#: gui/saveload-dialog.cpp:167
msgid "List view"
msgstr "Listevisning"
-#: gui/saveload-dialog.cpp:167
+#: gui/saveload-dialog.cpp:168
msgid "Grid view"
msgstr "Nettvisning"
-#: gui/saveload-dialog.cpp:210 gui/saveload-dialog.cpp:358
+#: gui/saveload-dialog.cpp:211 gui/saveload-dialog.cpp:360
msgid "No date saved"
msgstr "Ingen dato lagret"
-#: gui/saveload-dialog.cpp:211 gui/saveload-dialog.cpp:359
+#: gui/saveload-dialog.cpp:212 gui/saveload-dialog.cpp:361
msgid "No time saved"
msgstr "Ingen tid lagret"
-#: gui/saveload-dialog.cpp:212 gui/saveload-dialog.cpp:360
+#: gui/saveload-dialog.cpp:213 gui/saveload-dialog.cpp:362
msgid "No playtime saved"
msgstr "Ingen spilltid lagret"
-#: gui/saveload-dialog.cpp:219 gui/saveload-dialog.cpp:275
+#: gui/saveload-dialog.cpp:220 gui/saveload-dialog.cpp:276
msgid "Delete"
msgstr "Slett"
-#: gui/saveload-dialog.cpp:274
+#: gui/saveload-dialog.cpp:275
msgid "Do you really want to delete this savegame?"
msgstr "Vil du virkelig slette dette lagrede spillet?"
-#: gui/saveload-dialog.cpp:383 gui/saveload-dialog.cpp:872
+#: gui/saveload-dialog.cpp:385 gui/saveload-dialog.cpp:875
msgid "Date: "
msgstr "Dato: "
-#: gui/saveload-dialog.cpp:387 gui/saveload-dialog.cpp:878
+#: gui/saveload-dialog.cpp:389 gui/saveload-dialog.cpp:881
msgid "Time: "
msgstr "Tid: "
-#: gui/saveload-dialog.cpp:393 gui/saveload-dialog.cpp:886
+#: gui/saveload-dialog.cpp:395 gui/saveload-dialog.cpp:889
msgid "Playtime: "
msgstr "Spilltid: "
-#: gui/saveload-dialog.cpp:406 gui/saveload-dialog.cpp:494
+#: gui/saveload-dialog.cpp:408 gui/saveload-dialog.cpp:496
msgid "Untitled savestate"
msgstr "Ikke navngitt spilltilstand"
-#: gui/saveload-dialog.cpp:546
+#: gui/saveload-dialog.cpp:548
msgid "Next"
msgstr "Neste"
-#: gui/saveload-dialog.cpp:549
+#: gui/saveload-dialog.cpp:551
msgid "Prev"
msgstr "Forrige"
-#: gui/saveload-dialog.cpp:736
+#: gui/saveload-dialog.cpp:739
msgid "New Save"
msgstr "Nytt lagret spill"
-#: gui/saveload-dialog.cpp:736
+#: gui/saveload-dialog.cpp:739
msgid "Create a new save game"
msgstr "Opprett ett nytt lagret spill."
-#: gui/saveload-dialog.cpp:865
+#: gui/saveload-dialog.cpp:868
msgid "Name: "
msgstr "Navn:"
-#: gui/saveload-dialog.cpp:937
+#: gui/saveload-dialog.cpp:940
#, c-format
msgid "Enter a description for slot %d:"
msgstr "Gi en beskrivelse for posisjon %d:"
-#: gui/themebrowser.cpp:44
+#: gui/themebrowser.cpp:45
msgid "Select a Theme"
msgstr "Velg et tema"
-#: gui/ThemeEngine.cpp:337
+#: gui/ThemeEngine.cpp:347
msgid "Disabled GFX"
msgstr "Deaktivert GFX"
-#: gui/ThemeEngine.cpp:337
+#: gui/ThemeEngine.cpp:347
msgctxt "lowres"
msgid "Disabled GFX"
msgstr "Deaktivert GFX"
-#: gui/ThemeEngine.cpp:338
-msgid "Standard Renderer (16bpp)"
+#: gui/ThemeEngine.cpp:348
+#, fuzzy
+msgid "Standard Renderer"
msgstr "Standard Tegner (16bpp)"
-#: gui/ThemeEngine.cpp:338
-msgid "Standard (16bpp)"
-msgstr "Standard (16bpp)"
+#: gui/ThemeEngine.cpp:348 engines/scumm/dialogs.cpp:659
+msgid "Standard"
+msgstr "Standard"
-#: gui/ThemeEngine.cpp:340
-msgid "Antialiased Renderer (16bpp)"
+#: gui/ThemeEngine.cpp:350
+#, fuzzy
+msgid "Antialiased Renderer"
msgstr "Antialiased Tegner (16bpp)"
-#: gui/ThemeEngine.cpp:340
-msgid "Antialiased (16bpp)"
+#: gui/ThemeEngine.cpp:350
+#, fuzzy
+msgid "Antialiased"
msgstr "Antialiased (16bpp)"
-#: gui/widget.cpp:322 gui/widget.cpp:324 gui/widget.cpp:330 gui/widget.cpp:332
+#: gui/widget.cpp:323 gui/widget.cpp:325 gui/widget.cpp:331 gui/widget.cpp:333
msgid "Clear value"
msgstr "Tøm verdi"
-#: gui/fluidsynth-dialog.cpp:67
+#: gui/fluidsynth-dialog.cpp:68
#, fuzzy
msgid "Reverb"
msgstr "Aldri"
-#: gui/fluidsynth-dialog.cpp:69 gui/fluidsynth-dialog.cpp:101
+#: gui/fluidsynth-dialog.cpp:70 gui/fluidsynth-dialog.cpp:102
#, fuzzy
msgid "Active"
msgstr " (Aktiv)"
-#: gui/fluidsynth-dialog.cpp:71
+#: gui/fluidsynth-dialog.cpp:72
msgid "Room:"
msgstr ""
-#: gui/fluidsynth-dialog.cpp:78
+#: gui/fluidsynth-dialog.cpp:79
msgid "Damp:"
msgstr ""
-#: gui/fluidsynth-dialog.cpp:85
+#: gui/fluidsynth-dialog.cpp:86
msgid "Width:"
msgstr ""
-#: gui/fluidsynth-dialog.cpp:92 gui/fluidsynth-dialog.cpp:110
+#: gui/fluidsynth-dialog.cpp:93 gui/fluidsynth-dialog.cpp:111
msgid "Level:"
msgstr ""
-#: gui/fluidsynth-dialog.cpp:99
+#: gui/fluidsynth-dialog.cpp:100
msgid "Chorus"
msgstr ""
-#: gui/fluidsynth-dialog.cpp:103
+#: gui/fluidsynth-dialog.cpp:104
msgid "N:"
msgstr ""
-#: gui/fluidsynth-dialog.cpp:117
+#: gui/fluidsynth-dialog.cpp:118
#, fuzzy
msgid "Speed:"
msgstr "Tale"
-#: gui/fluidsynth-dialog.cpp:124
+#: gui/fluidsynth-dialog.cpp:125
msgid "Depth:"
msgstr ""
-#: gui/fluidsynth-dialog.cpp:131
+#: gui/fluidsynth-dialog.cpp:132
msgid "Type:"
msgstr ""
-#: gui/fluidsynth-dialog.cpp:134
+#: gui/fluidsynth-dialog.cpp:135
msgid "Sine"
msgstr ""
-#: gui/fluidsynth-dialog.cpp:135
+#: gui/fluidsynth-dialog.cpp:136
msgid "Triangle"
msgstr ""
-#: gui/fluidsynth-dialog.cpp:139
+#: gui/fluidsynth-dialog.cpp:140
msgid "Interpolation:"
msgstr ""
-#: gui/fluidsynth-dialog.cpp:142
+#: gui/fluidsynth-dialog.cpp:143
msgid "None (fastest)"
msgstr ""
-#: gui/fluidsynth-dialog.cpp:143
+#: gui/fluidsynth-dialog.cpp:144
msgid "Linear"
msgstr ""
-#: gui/fluidsynth-dialog.cpp:144
+#: gui/fluidsynth-dialog.cpp:145
msgid "Fourth-order"
msgstr ""
-#: gui/fluidsynth-dialog.cpp:145
+#: gui/fluidsynth-dialog.cpp:146
msgid "Seventh-order"
msgstr ""
-#: gui/fluidsynth-dialog.cpp:149
+#: gui/fluidsynth-dialog.cpp:150
msgid "Reset"
msgstr ""
-#: gui/fluidsynth-dialog.cpp:149
+#: gui/fluidsynth-dialog.cpp:150
msgid "Reset all FluidSynth settings to their default values."
msgstr ""
-#: gui/fluidsynth-dialog.cpp:216
+#: gui/fluidsynth-dialog.cpp:217
#, fuzzy
msgid ""
"Do you really want to reset all FluidSynth settings to their default values?"
msgstr "Vil du virkelig returnere til oppstarteren?"
-#: base/main.cpp:210
+#: base/main.cpp:228
#, c-format
msgid "Engine does not support debug level '%s'"
msgstr "Motoren støtter ikke debug-nivå '%s'"
-#: base/main.cpp:288
+#: base/main.cpp:306
msgid "Menu"
msgstr "Meny"
-#: base/main.cpp:291 backends/platform/symbian/src/SymbianActions.cpp:45
+#: base/main.cpp:309 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:294 backends/platform/symbian/src/SymbianActions.cpp:50
+#: base/main.cpp:312 backends/platform/symbian/src/SymbianActions.cpp:50
#: backends/platform/wince/CEActionsPocket.cpp:42
msgid "Pause"
msgstr "Pause"
-#: base/main.cpp:297
+#: base/main.cpp:315
msgid "Skip line"
msgstr "Hopp over linje"
-#: base/main.cpp:468
+#: base/main.cpp:507
msgid "Error running game:"
msgstr "Problem ved kjøring av spill:"
-#: base/main.cpp:492
+#: base/main.cpp:536
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"
@@ -1226,73 +1230,73 @@ msgstr "Brukeren avbrøt"
msgid "Unknown error"
msgstr "Ukjent feil"
-#: engines/advancedDetector.cpp:316
+#: engines/advancedDetector.cpp:317
#, c-format
msgid "The game in '%s' seems to be unknown."
msgstr "Spillet i '%s' ser ut til å være ukjent."
-#: engines/advancedDetector.cpp:317
+#: engines/advancedDetector.cpp:318
msgid "Please, report the following data to the ScummVM team along with name"
msgstr ""
"Vennligst rapporter de følgende dataene til ScummVM-teamet sammen med navnet"
-#: engines/advancedDetector.cpp:319
+#: engines/advancedDetector.cpp:320
msgid "of the game you tried to add and its version/language/etc.:"
msgstr "på spillet du forsøkte å legge til, og dets versjon/språk/etc.:"
-#: engines/dialogs.cpp:84
+#: engines/dialogs.cpp:85
msgid "~R~esume"
msgstr "~F~ortsett"
-#: engines/dialogs.cpp:86
+#: engines/dialogs.cpp:87
msgid "~L~oad"
msgstr "~Å~pne"
-#: engines/dialogs.cpp:90
+#: engines/dialogs.cpp:91
msgid "~S~ave"
msgstr "~L~agre"
-#: engines/dialogs.cpp:94
+#: engines/dialogs.cpp:95
msgid "~O~ptions"
msgstr "~V~alg"
-#: engines/dialogs.cpp:99
+#: engines/dialogs.cpp:100
msgid "~H~elp"
msgstr "~H~jelp"
-#: engines/dialogs.cpp:101
+#: engines/dialogs.cpp:102
msgid "~A~bout"
msgstr "~O~m"
-#: engines/dialogs.cpp:104 engines/dialogs.cpp:180
+#: engines/dialogs.cpp:105 engines/dialogs.cpp:181
msgid "~R~eturn to Launcher"
msgstr "~T~ilbake til oppstarter"
-#: engines/dialogs.cpp:106 engines/dialogs.cpp:182
+#: engines/dialogs.cpp:107 engines/dialogs.cpp:183
msgctxt "lowres"
msgid "~R~eturn to Launcher"
msgstr "~T~ilbake til oppstarter"
-#: engines/dialogs.cpp:115 engines/agi/saveload.cpp:803
-#: engines/drascula/saveload.cpp:338 engines/cruise/menu.cpp:212
-#: engines/sci/engine/kfile.cpp:742 engines/toltecs/menu.cpp:284
-#: engines/pegasus/pegasus.cpp:373
+#: engines/dialogs.cpp:116 engines/agi/saveload.cpp:803
+#: engines/cruise/menu.cpp:212 engines/drascula/saveload.cpp:336
+#: engines/neverhood/menumodule.cpp:873 engines/pegasus/pegasus.cpp:377
+#: engines/sci/engine/kfile.cpp:758 engines/toltecs/menu.cpp:281
msgid "Save game:"
msgstr "Lagret spill:"
-#: engines/dialogs.cpp:115 engines/agi/saveload.cpp:803
-#: engines/drascula/saveload.cpp:338 engines/scumm/dialogs.cpp:187
-#: engines/cruise/menu.cpp:212 engines/sci/engine/kfile.cpp:742
-#: engines/toltecs/menu.cpp:284 engines/pegasus/pegasus.cpp:373
-#: backends/platform/symbian/src/SymbianActions.cpp:44
+#: engines/dialogs.cpp:116 backends/platform/symbian/src/SymbianActions.cpp:44
#: backends/platform/wince/CEActionsPocket.cpp:43
#: backends/platform/wince/CEActionsPocket.cpp:267
#: backends/platform/wince/CEActionsSmartphone.cpp:45
#: backends/platform/wince/CEActionsSmartphone.cpp:231
+#: engines/agi/saveload.cpp:803 engines/cruise/menu.cpp:212
+#: engines/drascula/saveload.cpp:336 engines/neverhood/menumodule.cpp:873
+#: engines/pegasus/pegasus.cpp:377 engines/sci/engine/kfile.cpp:758
+#: engines/scumm/dialogs.cpp:188 engines/toltecs/menu.cpp:281
msgid "Save"
msgstr "Lagre"
-#: engines/dialogs.cpp:144
+#: engines/dialogs.cpp:145
msgid ""
"Sorry, this engine does not currently provide in-game help. Please consult "
"the README for basic information, and for instructions on how to obtain "
@@ -1302,7 +1306,7 @@ msgstr ""
"Vennligst se i README-filen for grunnleggende informasjon, og for "
"instruksjoner om hvordan du kan få ytterligere hjelp."
-#: engines/dialogs.cpp:228
+#: engines/dialogs.cpp:234 engines/pegasus/pegasus.cpp:393
#, c-format
msgid ""
"Gamestate save failed (%s)! Please consult the README for basic information, "
@@ -1311,37 +1315,37 @@ msgstr ""
"Lagring av spilltilstand feilet (%s)! Vennligst konsulter README-filen for "
"grunnleggende informasjon og instruksjon om hvordan du får ytterligere hjelp."
-#: engines/dialogs.cpp:301 engines/mohawk/dialogs.cpp:109
+#: engines/dialogs.cpp:307 engines/mohawk/dialogs.cpp:109
#: engines/mohawk/dialogs.cpp:170
msgid "~O~K"
msgstr "~O~K"
-#: engines/dialogs.cpp:302 engines/mohawk/dialogs.cpp:110
+#: engines/dialogs.cpp:308 engines/mohawk/dialogs.cpp:110
#: engines/mohawk/dialogs.cpp:171
msgid "~C~ancel"
msgstr "~A~vbryt"
-#: engines/dialogs.cpp:305
+#: engines/dialogs.cpp:311
msgid "~K~eys"
msgstr "~T~aster"
-#: engines/engine.cpp:240
+#: engines/engine.cpp:245
msgid "Could not initialize color format."
msgstr "Kunne ikke initalisere fargeformat."
-#: engines/engine.cpp:248
+#: engines/engine.cpp:253
msgid "Could not switch to video mode: '"
msgstr "Kunne ikke veksle til videomodus: '"
-#: engines/engine.cpp:257
+#: engines/engine.cpp:262
msgid "Could not apply aspect ratio setting."
msgstr "Kunne ikke aktivere aspektrate-innstilling."
-#: engines/engine.cpp:262
+#: engines/engine.cpp:267
msgid "Could not apply fullscreen setting."
msgstr "Kunne ikke aktivere fullskjermsinnstilling."
-#: engines/engine.cpp:362
+#: engines/engine.cpp:367
msgid ""
"You appear to be playing this game directly\n"
"from the CD. This is known to cause problems,\n"
@@ -1355,7 +1359,7 @@ msgstr ""
"datafilene til harddisken din istedet.\n"
"Se README-filen for detaljer."
-#: engines/engine.cpp:373
+#: engines/engine.cpp:378
msgid ""
"This game has audio tracks in its disk. These\n"
"tracks need to be ripped from the disk using\n"
@@ -1369,7 +1373,7 @@ msgstr ""
"kunne høre på spillets musikk.\n"
"Se README-filen for detaljer."
-#: engines/engine.cpp:431
+#: engines/engine.cpp:436
#, c-format
msgid ""
"Gamestate load failed (%s)! Please consult the README for basic information, "
@@ -1378,7 +1382,7 @@ msgstr ""
"Klarte ikke laste spill (%s)! Vennligst se i README-fila for grunnleggende "
"informasjon og instruksjoner om hvordan du kan få mer hjelp."
-#: engines/engine.cpp:444
+#: engines/engine.cpp:449
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 "
@@ -1388,33 +1392,761 @@ msgstr ""
"Derfor er det sannsynlig at det vil være ustabilt, og det er ikke sikkert at "
"lagrede spill vil fortsette å fungere i fremtidige versjoner av ScummVM."
-#: engines/engine.cpp:447
+#: engines/engine.cpp:452
msgid "Start anyway"
msgstr "Start allikevel"
-#: engines/agi/detection.cpp:142 engines/drascula/detection.cpp:270
-#: engines/dreamweb/detection.cpp:47 engines/sci/detection.cpp:393
-#: engines/toltecs/detection.cpp:173
+#: audio/fmopl.cpp:50
+msgid "MAME OPL emulator"
+msgstr "MAME OPL emulator"
+
+#: audio/fmopl.cpp:52
+msgid "DOSBox OPL emulator"
+msgstr "DOSBox OPL emulator"
+
+#: audio/mididrv.cpp:209
+#, c-format
+msgid ""
+"The selected audio device '%s' was not found (e.g. might be turned off or "
+"disconnected)."
+msgstr ""
+"Den valgte lydenheten '%s' ble ikke funnet (den kan f.eks. være avslått "
+"eller frakoblet)."
+
+#: audio/mididrv.cpp:209 audio/mididrv.cpp:221 audio/mididrv.cpp:257
+#: audio/mididrv.cpp:272
+msgid "Attempting to fall back to the next available device..."
+msgstr "Forsøker å falle tilbake på den neste tilgjengelige enheten..."
+
+#: audio/mididrv.cpp:221
+#, c-format
+msgid ""
+"The selected audio device '%s' cannot be used. See log file for more "
+"information."
+msgstr ""
+"Den valgte lydenheten '%s' kan ikke brukes. Se logg-filen for mer "
+"informasjon."
+
+#: audio/mididrv.cpp:257
+#, c-format
+msgid ""
+"The preferred audio device '%s' was not found (e.g. might be turned off or "
+"disconnected)."
+msgstr ""
+"Den foretrukne lydenheten '%s' ble ikke funnet (den kan f.eks. være avslått "
+"eller frakoblet)."
+
+#: audio/mididrv.cpp:272
+#, c-format
+msgid ""
+"The preferred audio device '%s' cannot be used. See log file for more "
+"information."
+msgstr ""
+"Den foretrukne lydenheten '%s' kan ikke brukes. Se i logg-filen for mer "
+"informasjon."
+
+#: audio/null.h:44
+msgid "No music"
+msgstr "Ingen musikk"
+
+#: audio/mods/paula.cpp:196
+msgid "Amiga Audio Emulator"
+msgstr "Amiga Lydemulator"
+
+#: audio/softsynth/adlib.cpp:2285
+msgid "AdLib Emulator"
+msgstr "AdLib Emulator"
+
+#: audio/softsynth/appleiigs.cpp:33
+msgid "Apple II GS Emulator (NOT IMPLEMENTED)"
+msgstr "Apple II GS Emulator (IKKE IMPLEMENTERT)"
+
+#: audio/softsynth/sid.cpp:1430
+msgid "C64 Audio Emulator"
+msgstr "C64 Lydemulator"
+
+#: audio/softsynth/mt32.cpp:200
+msgid "Initializing MT-32 Emulator"
+msgstr "Initialiserer MT-32-Emulator"
+
+#: audio/softsynth/mt32.cpp:426
+msgid "MT-32 Emulator"
+msgstr "MT-32 Emulator"
+
+#: audio/softsynth/pcspk.cpp:139
+msgid "PC Speaker Emulator"
+msgstr "PC Speaker Emulator"
+
+#: audio/softsynth/pcspk.cpp:158
+msgid "IBM PCjr Emulator"
+msgstr "IBM PCjr Emulator"
+
+#: backends/keymapper/remap-dialog.cpp:48
+msgid "Keymap:"
+msgstr "Tastkobling:"
+
+#: backends/keymapper/remap-dialog.cpp:67
+msgid " (Effective)"
+msgstr " (Aktiv)"
+
+#: backends/keymapper/remap-dialog.cpp:107
+msgid " (Active)"
+msgstr " (Aktiv)"
+
+#: backends/keymapper/remap-dialog.cpp:107
+msgid " (Blocked)"
+msgstr " (Blokkert)"
+
+#: backends/keymapper/remap-dialog.cpp:120
+msgid " (Global)"
+msgstr " (Global)"
+
+#: backends/keymapper/remap-dialog.cpp:128
+msgid " (Game)"
+msgstr " (Spill)"
+
+#: backends/midi/windows.cpp:165
+msgid "Windows MIDI"
+msgstr "Windows MIDI"
+
+#: backends/platform/ds/arm9/source/dsoptions.cpp:56
+#: engines/scumm/dialogs.cpp:291
+msgid "~C~lose"
+msgstr "~L~ukk"
+
+#: backends/platform/ds/arm9/source/dsoptions.cpp:57
+msgid "ScummVM Main Menu"
+msgstr "ScummVM Hovedmeny"
+
+#: backends/platform/ds/arm9/source/dsoptions.cpp:63
+msgid "~L~eft handed mode"
+msgstr "~V~enstrehendt modus"
+
+#: backends/platform/ds/arm9/source/dsoptions.cpp:64
+msgid "~I~ndy fight controls"
+msgstr "~I~ndy kampkontroller"
+
+#: backends/platform/ds/arm9/source/dsoptions.cpp:65
+msgid "Show mouse cursor"
+msgstr "Vis muspeker"
+
+#: backends/platform/ds/arm9/source/dsoptions.cpp:66
+msgid "Snap to edges"
+msgstr "Hopp til kanter"
+
+#: backends/platform/ds/arm9/source/dsoptions.cpp:68
+msgid "Touch X Offset"
+msgstr "Gå til X-posisjon"
+
+#: backends/platform/ds/arm9/source/dsoptions.cpp:75
+msgid "Touch Y Offset"
+msgstr "Gå til Y-posisjon"
+
+#: backends/platform/ds/arm9/source/dsoptions.cpp:87
+msgid "Use laptop trackpad-style cursor control"
+msgstr "Bruk bærbar trackpad-stil muspekerkontroll"
+
+#: backends/platform/ds/arm9/source/dsoptions.cpp:88
+msgid "Tap for left click, double tap right click"
+msgstr "Tap for venstreklikk, dobbelt-tap for høyreklikk"
+
+#: backends/platform/ds/arm9/source/dsoptions.cpp:90
+msgid "Sensitivity"
+msgstr "Følsomhet"
+
+#: backends/platform/ds/arm9/source/dsoptions.cpp:99
+msgid "Initial top screen scale:"
+msgstr "Skalering for øvre skjerm:"
+
+#: backends/platform/ds/arm9/source/dsoptions.cpp:105
+msgid "Main screen scaling:"
+msgstr "Hovedskjermsskalering:"
+
+#: backends/platform/ds/arm9/source/dsoptions.cpp:107
+msgid "Hardware scale (fast, but low quality)"
+msgstr "Maskinvareskalering (rask, men lav kvalitet)"
+
+#: backends/platform/ds/arm9/source/dsoptions.cpp:108
+msgid "Software scale (good quality, but slower)"
+msgstr "Programvareskalering (god kvalitet, men tregere)"
+
+#: backends/platform/ds/arm9/source/dsoptions.cpp:109
+msgid "Unscaled (you must scroll left and right)"
+msgstr "Uskalert (du må scrolle til venstre og høyre)"
+
+#: backends/platform/ds/arm9/source/dsoptions.cpp:111
+msgid "Brightness:"
+msgstr "Lysstyrke:"
+
+#: backends/platform/ds/arm9/source/dsoptions.cpp:121
+msgid "High quality audio (slower) (reboot)"
+msgstr "Høy lydkvalitet (tregere) (omstart)"
+
+#: backends/platform/ds/arm9/source/dsoptions.cpp:122
+msgid "Disable power off"
+msgstr "Deaktiver strømsparing"
+
+#: backends/platform/iphone/osys_events.cpp:300
+msgid "Mouse-click-and-drag mode enabled."
+msgstr "Mus-klikk-og-dra-modus aktivert."
+
+#: backends/platform/iphone/osys_events.cpp:302
+msgid "Mouse-click-and-drag mode disabled."
+msgstr "Mus-klikk-og-dra-modus-deaktivert."
+
+#: backends/platform/iphone/osys_events.cpp:313
+msgid "Touchpad mode enabled."
+msgstr "Touchpad-modus aktivert."
+
+#: backends/platform/iphone/osys_events.cpp:315
+msgid "Touchpad mode disabled."
+msgstr "Touchpad-modus deaktivert."
+
+#: backends/platform/maemo/maemo.cpp:209
+msgid "Click Mode"
+msgstr "Klikkmodus"
+
+#: backends/platform/maemo/maemo.cpp:215
+#: backends/platform/symbian/src/SymbianActions.cpp:42
+#: backends/platform/wince/CEActionsPocket.cpp:60
+#: backends/platform/wince/CEActionsSmartphone.cpp:43
+#: backends/platform/tizen/form.cpp:275
+msgid "Left Click"
+msgstr "Venstreklikk"
+
+#: backends/platform/maemo/maemo.cpp:218
+msgid "Middle Click"
+msgstr "Midtklikk"
+
+#: backends/platform/maemo/maemo.cpp:221
+#: backends/platform/symbian/src/SymbianActions.cpp:43
+#: backends/platform/wince/CEActionsSmartphone.cpp:44
+#: backends/platform/tizen/form.cpp:267
+msgid "Right Click"
+msgstr "Høyreklikk"
+
+#: backends/platform/sdl/macosx/appmenu_osx.mm:77
+msgid "Hide ScummVM"
+msgstr "Skjul ScummVM"
+
+#: backends/platform/sdl/macosx/appmenu_osx.mm:82
+msgid "Hide Others"
+msgstr "Skjul andre"
+
+#: backends/platform/sdl/macosx/appmenu_osx.mm:87
+msgid "Show All"
+msgstr "Vis alle"
+
+#: backends/platform/sdl/macosx/appmenu_osx.mm:109
+#: backends/platform/sdl/macosx/appmenu_osx.mm:120
+msgid "Window"
+msgstr "Vindu"
+
+#: backends/platform/sdl/macosx/appmenu_osx.mm:114
+msgid "Minimize"
+msgstr "Minimer"
+
+#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:46
+msgid "Normal (no scaling)"
+msgstr "Normal (ingen skalering)"
+
+#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:65
+msgctxt "lowres"
+msgid "Normal (no scaling)"
+msgstr "Normal (ingen skalering)"
+
+#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2148
+msgid "Enabled aspect ratio correction"
+msgstr "Aspekt-rate korrigering aktivert"
+
+#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2154
+msgid "Disabled aspect ratio correction"
+msgstr "Aspekt-rate korrigering deaktivert"
+
+#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2209
+msgid "Active graphics filter:"
+msgstr "Aktivt grafikkfilter:"
+
+#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2251
+msgid "Windowed mode"
+msgstr "Vindusmodus"
+
+#: backends/graphics/opengl/opengl-graphics.cpp:118
+#, fuzzy
+msgid "OpenGL"
+msgstr "Åpne"
+
+#: backends/graphics/opengl/opengl-graphics.cpp:119
+msgid "OpenGL (No filtering)"
+msgstr ""
+
+#: backends/platform/symbian/src/SymbianActions.cpp:38
+#: backends/platform/wince/CEActionsSmartphone.cpp:39
+msgid "Up"
+msgstr "Opp"
+
+#: backends/platform/symbian/src/SymbianActions.cpp:39
+#: backends/platform/wince/CEActionsSmartphone.cpp:40
+msgid "Down"
+msgstr "Ned"
+
+#: backends/platform/symbian/src/SymbianActions.cpp:40
+#: backends/platform/wince/CEActionsSmartphone.cpp:41
+msgid "Left"
+msgstr "Venstre"
+
+#: backends/platform/symbian/src/SymbianActions.cpp:41
+#: backends/platform/wince/CEActionsSmartphone.cpp:42
+msgid "Right"
+msgstr "Høyre"
+
+#: backends/platform/symbian/src/SymbianActions.cpp:46
+#: backends/platform/wince/CEActionsSmartphone.cpp:47
+msgid "Zone"
+msgstr "Sone"
+
+#: backends/platform/symbian/src/SymbianActions.cpp:47
+#: backends/platform/wince/CEActionsPocket.cpp:54
+#: backends/platform/wince/CEActionsSmartphone.cpp:48
+msgid "Multi Function"
+msgstr "Multifunksjon"
+
+#: backends/platform/symbian/src/SymbianActions.cpp:48
+msgid "Swap character"
+msgstr "Bytt karakter"
+
+#: backends/platform/symbian/src/SymbianActions.cpp:49
+msgid "Skip text"
+msgstr "Hopp over tekst"
+
+#: backends/platform/symbian/src/SymbianActions.cpp:51
+msgid "Fast mode"
+msgstr "Rask modus"
+
+#: 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:218
+#: engines/scumm/dialogs.cpp:192 engines/scumm/help.cpp:82
+#: engines/scumm/help.cpp:84
+msgid "Quit"
+msgstr "Avslutt"
+
+#: backends/platform/symbian/src/SymbianActions.cpp:53
+msgid "Debugger"
+msgstr "Debugger"
+
+#: backends/platform/symbian/src/SymbianActions.cpp:54
+msgid "Global menu"
+msgstr "Global meny"
+
+#: backends/platform/symbian/src/SymbianActions.cpp:55
+msgid "Virtual keyboard"
+msgstr "Virtuelt tastatur"
+
+#: backends/platform/symbian/src/SymbianActions.cpp:56
+msgid "Key mapper"
+msgstr "Tastkobler"
+
+#: backends/events/symbiansdl/symbiansdl-events.cpp:184
+msgid "Do you want to quit ?"
+msgstr "Vil du avslutte?"
+
+#: backends/platform/wii/options.cpp:51
+msgid "Video"
+msgstr "Video"
+
+#: backends/platform/wii/options.cpp:54
+msgid "Current video mode:"
+msgstr "Nåværende videomodus:"
+
+#: backends/platform/wii/options.cpp:56
+msgid "Double-strike"
+msgstr "Doble linjer"
+
+#: backends/platform/wii/options.cpp:60
+msgid "Horizontal underscan:"
+msgstr "Horisontal underscan:"
+
+#: backends/platform/wii/options.cpp:66
+msgid "Vertical underscan:"
+msgstr "Vertikal underscan:"
+
+#: backends/platform/wii/options.cpp:71
+msgid "Input"
+msgstr "Input"
+
+#: backends/platform/wii/options.cpp:74
+msgid "GC Pad sensitivity:"
+msgstr "GC Pad-følsomhet:"
+
+#: backends/platform/wii/options.cpp:80
+msgid "GC Pad acceleration:"
+msgstr "GC Pad-aksellerasjon:"
+
+#: backends/platform/wii/options.cpp:86
+msgid "DVD"
+msgstr "DVD"
+
+#: backends/platform/wii/options.cpp:89 backends/platform/wii/options.cpp:101
+msgid "Status:"
+msgstr "Status:"
+
+#: backends/platform/wii/options.cpp:90 backends/platform/wii/options.cpp:102
+msgid "Unknown"
+msgstr "Ukjent"
+
+#: backends/platform/wii/options.cpp:93
+msgid "Mount DVD"
+msgstr "Monter DVD"
+
+#: backends/platform/wii/options.cpp:94
+msgid "Unmount DVD"
+msgstr "Løs ut DVD"
+
+#: backends/platform/wii/options.cpp:98
+msgid "SMB"
+msgstr "SMB"
+
+#: backends/platform/wii/options.cpp:106
+msgid "Server:"
+msgstr "Server:"
+
+#: backends/platform/wii/options.cpp:110
+msgid "Share:"
+msgstr "Delt Ressurs:"
+
+#: backends/platform/wii/options.cpp:114
+msgid "Username:"
+msgstr "Brukernavn:"
+
+#: backends/platform/wii/options.cpp:118
+msgid "Password:"
+msgstr "Passord:"
+
+#: backends/platform/wii/options.cpp:121
+msgid "Init network"
+msgstr "Init nettverk"
+
+#: backends/platform/wii/options.cpp:123
+msgid "Mount SMB"
+msgstr "Monter SMB"
+
+#: backends/platform/wii/options.cpp:124
+msgid "Unmount SMB"
+msgstr "Løs ut SMB"
+
+#: backends/platform/wii/options.cpp:143
+msgid "DVD Mounted successfully"
+msgstr "DVD montering fullført"
+
+#: backends/platform/wii/options.cpp:146
+msgid "Error while mounting the DVD"
+msgstr "Feil under montering av DVD"
+
+#: backends/platform/wii/options.cpp:148
+msgid "DVD not mounted"
+msgstr "DVD ikke montert"
+
+#: backends/platform/wii/options.cpp:161
+msgid "Network up, share mounted"
+msgstr "Nettverket er oppe, delt ressurs montert"
+
+#: backends/platform/wii/options.cpp:163
+msgid "Network up"
+msgstr "Nettverket er oppe"
+
+#: backends/platform/wii/options.cpp:166
+msgid ", error while mounting the share"
+msgstr ", feil under montering av den delte ressursen"
+
+#: backends/platform/wii/options.cpp:168
+msgid ", share not mounted"
+msgstr ", delt ressurs ikke montert"
+
+#: backends/platform/wii/options.cpp:174
+msgid "Network down"
+msgstr "Nettverket er nede"
+
+#: backends/platform/wii/options.cpp:178
+msgid "Initializing network"
+msgstr "Initialiserer nettverk"
+
+#: backends/platform/wii/options.cpp:182
+msgid "Timeout while initializing network"
+msgstr "Timeout under initialisering av nettverk"
+
+#: backends/platform/wii/options.cpp:186
+#, c-format
+msgid "Network not initialized (%d)"
+msgstr "Nettverk ikke initialisert (%d)"
+
+#: backends/platform/wince/CEActionsPocket.cpp:46
+msgid "Hide Toolbar"
+msgstr "Skjul verktøylinje"
+
+#: backends/platform/wince/CEActionsPocket.cpp:47
+msgid "Show Keyboard"
+msgstr "Vis tastatur"
+
+#: backends/platform/wince/CEActionsPocket.cpp:48
+msgid "Sound on/off"
+msgstr "Lyd av/på"
+
+#: backends/platform/wince/CEActionsPocket.cpp:49
+msgid "Right click"
+msgstr "Høyreklikk"
+
+#: backends/platform/wince/CEActionsPocket.cpp:50
+msgid "Show/Hide Cursor"
+msgstr "Vis/Skjul muspeker"
+
+#: backends/platform/wince/CEActionsPocket.cpp:51
+msgid "Free look"
+msgstr "Frikikking"
+
+#: backends/platform/wince/CEActionsPocket.cpp:52
+msgid "Zoom up"
+msgstr "Zoom opp"
+
+#: backends/platform/wince/CEActionsPocket.cpp:53
+msgid "Zoom down"
+msgstr "Zoom ned"
+
+#: backends/platform/wince/CEActionsPocket.cpp:55
+#: backends/platform/wince/CEActionsSmartphone.cpp:49
+msgid "Bind Keys"
+msgstr "Koble taster"
+
+#: backends/platform/wince/CEActionsPocket.cpp:56
+msgid "Cursor Up"
+msgstr "Peker opp"
+
+#: backends/platform/wince/CEActionsPocket.cpp:57
+msgid "Cursor Down"
+msgstr "Peker ned"
+
+#: backends/platform/wince/CEActionsPocket.cpp:58
+msgid "Cursor Left"
+msgstr "Peker venstre"
+
+#: backends/platform/wince/CEActionsPocket.cpp:59
+msgid "Cursor Right"
+msgstr "Peker høyre"
+
+#: 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:326
+#: backends/platform/wince/CEActionsSmartphone.cpp:287
+msgid " Are you sure you want to quit ? "
+msgstr " Er du sikker på at du vil avslutte ?"
+
+#: backends/platform/wince/CEActionsSmartphone.cpp:50
+msgid "Keyboard"
+msgstr "Tastatur"
+
+#: backends/platform/wince/CEActionsSmartphone.cpp:51
+msgid "Rotate"
+msgstr "Roter"
+
+#: backends/platform/wince/CELauncherDialog.cpp:56
+msgid "Using SDL driver "
+msgstr "Bruk SDL-driver"
+
+#: backends/platform/wince/CELauncherDialog.cpp:60
+msgid "Display "
+msgstr "Skjerm"
+
+#: 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:516
+msgid "Map right click action"
+msgstr "Koble handling til høyreklikk"
+
+#: backends/platform/wince/wince-sdl.cpp:520
+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:529
+msgid "Map hide toolbar action"
+msgstr "Koble skjul-verktøylinje-handlingen"
+
+#: backends/platform/wince/wince-sdl.cpp:533
+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:542
+msgid "Map Zoom Up action (optional)"
+msgstr "Koble handlingen Zoom Opp (valgfritt)"
+
+#: backends/platform/wince/wince-sdl.cpp:545
+msgid "Map Zoom Down action (optional)"
+msgstr "Koble handlingen Zoom Ned (valgfritt)"
+
+#: backends/platform/wince/wince-sdl.cpp:553
+msgid ""
+"Don't forget to map a key to 'Hide Toolbar' action to see the whole inventory"
+msgstr ""
+"Ikke glem å koble en tast til handlingen 'Skjul verktøylinje' for å se hele "
+"inventaret"
+
+#: backends/events/default/default-events.cpp:196
+msgid "Do you really want to return to the Launcher?"
+msgstr "Vil du virkelig returnere til oppstarteren?"
+
+#: backends/events/default/default-events.cpp:196
+msgid "Launcher"
+msgstr "Oppstarter"
+
+#: backends/events/default/default-events.cpp:218
+msgid "Do you really want to quit?"
+msgstr "Vil du virkelig avslutte?"
+
+#: backends/events/gph/gph-events.cpp:386
+#: backends/events/gph/gph-events.cpp:429
+#: backends/events/openpandora/op-events.cpp:168
+msgid "Touchscreen 'Tap Mode' - Left Click"
+msgstr "Touchskjerm 'Tapmodus' - Venstreklikk"
+
+#: backends/events/gph/gph-events.cpp:388
+#: backends/events/gph/gph-events.cpp:431
+#: backends/events/openpandora/op-events.cpp:170
+msgid "Touchscreen 'Tap Mode' - Right Click"
+msgstr "Touchskjerm 'Tapmodus' - Høyreklikk"
+
+#: backends/events/gph/gph-events.cpp:390
+#: backends/events/gph/gph-events.cpp:433
+#: backends/events/openpandora/op-events.cpp:172
+msgid "Touchscreen 'Tap Mode' - Hover (No Click)"
+msgstr "Touchskjerm 'Tapmodus' - Sveve (Ingen Klikk)"
+
+#: backends/events/gph/gph-events.cpp:410
+msgid "Maximum Volume"
+msgstr "Maksimalt Volum"
+
+#: backends/events/gph/gph-events.cpp:412
+msgid "Increasing Volume"
+msgstr "Øker volum"
+
+#: backends/events/gph/gph-events.cpp:418
+msgid "Minimal Volume"
+msgstr "Minimalt Volum"
+
+#: backends/events/gph/gph-events.cpp:420
+msgid "Decreasing Volume"
+msgstr "Senker volum"
+
+#: backends/events/openpandora/op-events.cpp:174
+msgid "Touchscreen 'Tap Mode' - Hover (DPad Clicks)"
+msgstr "Touchskjerm 'Tapmodus' - Sveve (DPad Klikk)"
+
+#: backends/updates/macosx/macosx-updates.mm:67
+msgid "Check for Updates..."
+msgstr "Sjekk for oppdateringer..."
+
+#: backends/platform/tizen/form.cpp:263
+msgid "Right Click Once"
+msgstr "Høyreklikk én gang"
+
+#: backends/platform/tizen/form.cpp:271
+msgid "Move Only"
+msgstr "Kun Beveg"
+
+#: backends/platform/tizen/form.cpp:294
+msgid "Escape Key"
+msgstr "ESC-tast"
+
+#: backends/platform/tizen/form.cpp:299
+msgid "Game Menu"
+msgstr "Spillmeny"
+
+#: backends/platform/tizen/form.cpp:304
+msgid "Show Keypad"
+msgstr "Vis talltastatur"
+
+#: backends/platform/tizen/form.cpp:309
+msgid "Control Mouse"
+msgstr "Styr Mus"
+
+#: backends/events/maemosdl/maemosdl-events.cpp:192
+msgid "Clicking Enabled"
+msgstr "Klikking aktivert"
+
+#: backends/events/maemosdl/maemosdl-events.cpp:192
+msgid "Clicking Disabled"
+msgstr "Klikking deaktivert"
+
+#: engines/agi/detection.cpp:142 engines/drascula/detection.cpp:302
+#: engines/dreamweb/detection.cpp:47 engines/neverhood/detection.cpp:160
+#: engines/sci/detection.cpp:394 engines/toltecs/detection.cpp:186
msgid "Use original save/load screens"
msgstr "Bruk originale lagre/laste-skjermer"
-#: engines/agi/detection.cpp:143 engines/drascula/detection.cpp:271
-#: engines/dreamweb/detection.cpp:48 engines/sci/detection.cpp:394
-#: engines/toltecs/detection.cpp:174
+#: engines/agi/detection.cpp:143 engines/drascula/detection.cpp:303
+#: engines/dreamweb/detection.cpp:48 engines/neverhood/detection.cpp:161
+#: engines/sci/detection.cpp:395 engines/toltecs/detection.cpp:187
msgid "Use the original save/load screens, instead of the ScummVM ones"
msgstr "Bruk de originale lagre/laste-skjermene, istedenfor ScummVM-variantene"
-#: engines/agi/saveload.cpp:816 engines/drascula/saveload.cpp:351
-#: engines/sci/engine/kfile.cpp:841 engines/toltecs/menu.cpp:259
+#: engines/agi/saveload.cpp:816 engines/drascula/saveload.cpp:349
+#: engines/neverhood/menumodule.cpp:886 engines/sci/engine/kfile.cpp:857
+#: engines/toltecs/menu.cpp:256
msgid "Restore game:"
msgstr "Gjennopprett spill:"
-#: engines/agi/saveload.cpp:816 engines/drascula/saveload.cpp:351
-#: engines/sci/engine/kfile.cpp:841 engines/toltecs/menu.cpp:259
+#: engines/agi/saveload.cpp:816 engines/drascula/saveload.cpp:349
+#: engines/neverhood/menumodule.cpp:886 engines/sci/engine/kfile.cpp:857
+#: engines/toltecs/menu.cpp:256
msgid "Restore"
msgstr "Gjenopprett"
-#: engines/drascula/saveload.cpp:49
+#: engines/agos/saveload.cpp:160 engines/scumm/scumm.cpp:2321
+#, c-format
+msgid ""
+"Failed to load game state from file:\n"
+"\n"
+"%s"
+msgstr ""
+"Klarte ikke åpne spilltilstand fra fil:\n"
+"\n"
+"%s"
+
+#: engines/agos/saveload.cpp:195 engines/scumm/scumm.cpp:2314
+#, c-format
+msgid ""
+"Failed to save game state to file:\n"
+"\n"
+"%s"
+msgstr ""
+"Klarte ikke lagre spilltilstand til fil:\n"
+"\n"
+"%s"
+
+#: engines/agos/saveload.cpp:203 engines/scumm/scumm.cpp:2332
+#, c-format
+msgid ""
+"Successfully saved game state in file:\n"
+"\n"
+"%s"
+msgstr ""
+"Fullførte lagring av spilltilstand til fil:\n"
+"\n"
+"%s"
+
+#: engines/agos/animation.cpp:557
+#, c-format
+msgid "Cutscene file '%s' not found!"
+msgstr "Fant ikke cutscenefil '%s'!"
+
+#: engines/drascula/saveload.cpp:47
msgid ""
"ScummVM found that you have old savefiles for Drascula that should be "
"converted.\n"
@@ -1440,27 +2172,304 @@ msgstr "Bruk lys palettmodus"
msgid "Display graphics using the game's bright palette"
msgstr "Vis grafikk med spillets lyse palett"
-#: engines/sci/detection.cpp:373
+#: engines/gob/inter_playtoons.cpp:256 engines/gob/inter_v2.cpp:1470
+#: engines/tinsel/saveload.cpp:532
+msgid "Failed to load game state from file."
+msgstr "Klarte ikke åpne spilltilstand fra fil."
+
+#: engines/gob/inter_v2.cpp:1540 engines/tinsel/saveload.cpp:545
+msgid "Failed to save game state to file."
+msgstr "Klarte ikke lagre spilltilstand fra fil."
+
+#: engines/gob/inter_v5.cpp:107
+msgid "Failed to delete file."
+msgstr "Klarte ikke å slette fil."
+
+#: engines/groovie/detection.cpp:312
+msgid "Fast movie speed"
+msgstr "Rask filmhastighet"
+
+#: engines/groovie/detection.cpp:313
+msgid "Play movies at an increased speed"
+msgstr "Spill filmer med økt hastighet"
+
+#: engines/groovie/script.cpp:399
+msgid "Failed to save game"
+msgstr "Klarte ikke å lagre spill."
+
+#. I18N: Studio audience adds an applause and cheering sounds whenever
+#. Malcolm makes a joke.
+#: engines/kyra/detection.cpp:62
+msgid "Studio audience"
+msgstr "Studiopublikum"
+
+#: engines/kyra/detection.cpp:63
+msgid "Enable studio audience"
+msgstr "Aktiver studiopublikum"
+
+#. I18N: This option allows the user to skip text and cutscenes.
+#: engines/kyra/detection.cpp:73
+msgid "Skip support"
+msgstr ""
+
+#: engines/kyra/detection.cpp:74
+msgid "Allow text and cutscenes to be skipped"
+msgstr "Tillat å hoppe over tekst og kutt-scener"
+
+#. I18N: Helium mode makes people sound like they've inhaled Helium.
+#: engines/kyra/detection.cpp:84
+msgid "Helium mode"
+msgstr "Helium-modus"
+
+#: engines/kyra/detection.cpp:85
+msgid "Enable helium mode"
+msgstr "Aktiver helium-modus"
+
+#. I18N: When enabled, this option makes scrolling smoother when
+#. changing from one screen to another.
+#: engines/kyra/detection.cpp:99
+msgid "Smooth scrolling"
+msgstr "Myk scrolling"
+
+#: engines/kyra/detection.cpp:100
+msgid "Enable smooth scrolling when walking"
+msgstr "Aktiver myk scrolling når man går"
+
+#. I18N: When enabled, this option changes the cursor when it floats to the
+#. edge of the screen to a directional arrow. The player can then click to
+#. walk towards that direction.
+#: engines/kyra/detection.cpp:112
+msgid "Floating cursors"
+msgstr "Flytende muspekere"
+
+#: engines/kyra/detection.cpp:113
+msgid "Enable floating cursors"
+msgstr "Aktiver flytende muspekere"
+
+#. I18N: HP stands for Hit Points
+#: engines/kyra/detection.cpp:127
+msgid "HP bar graphs"
+msgstr "HP bar grafer"
+
+#: engines/kyra/detection.cpp:128
+msgid "Enable hit point bar graphs"
+msgstr "Aktiver hit point-bar grafer"
+
+#: engines/kyra/lol.cpp:478
+msgid "Attack 1"
+msgstr "Angrep 1"
+
+#: engines/kyra/lol.cpp:479
+msgid "Attack 2"
+msgstr "Angrep 2"
+
+#: engines/kyra/lol.cpp:480
+msgid "Attack 3"
+msgstr "Angrep 3"
+
+#: engines/kyra/lol.cpp:481
+msgid "Move Forward"
+msgstr "Beveg Fremover"
+
+#: engines/kyra/lol.cpp:482
+msgid "Move Back"
+msgstr "Beveg Bakover"
+
+#: engines/kyra/lol.cpp:483
+msgid "Slide Left"
+msgstr "Skli mot Venstre"
+
+#: engines/kyra/lol.cpp:484
+msgid "Slide Right"
+msgstr "Skli mot Høyre"
+
+#: engines/kyra/lol.cpp:485 engines/pegasus/pegasus.cpp:2509
+msgid "Turn Left"
+msgstr "Svin til Venstre"
+
+#: engines/kyra/lol.cpp:486 engines/pegasus/pegasus.cpp:2510
+msgid "Turn Right"
+msgstr "Sving til Høyre"
+
+#: engines/kyra/lol.cpp:487
+msgid "Rest"
+msgstr "Hvil"
+
+#: engines/kyra/lol.cpp:488
+msgid "Options"
+msgstr "Valg"
+
+#: engines/kyra/lol.cpp:489
+msgid "Choose Spell"
+msgstr "Velg Trolldom"
+
+#: engines/kyra/sound_midi.cpp:477
+msgid ""
+"You appear to be using a General MIDI device,\n"
+"but your game only supports Roland MT32 MIDI.\n"
+"We try to map the Roland MT32 instruments to\n"
+"General MIDI ones. It is still possible that\n"
+"some tracks sound incorrect."
+msgstr ""
+"Du ser ut til å bruke en General MIDI-enhet,\n"
+"men spillet ditt støtter bare Roland MT32-MIDI.\n"
+"Vi forsøker å koble Roland MT32-instrumentene til\n"
+"General MIDI-instrumentene. Allikevel, kan det\n"
+"skje at enkelte spor ikke vil spilles riktig."
+
+#. I18N: Option for fast scene switching
+#: engines/mohawk/dialogs.cpp:92 engines/mohawk/dialogs.cpp:167
+msgid "~Z~ip Mode Activated"
+msgstr "~Z~ipmodus aktivert"
+
+#: engines/mohawk/dialogs.cpp:93
+msgid "~T~ransitions Enabled"
+msgstr "~O~verganger aktivert"
+
+#. I18N: Drop book page
+#: engines/mohawk/dialogs.cpp:95
+msgid "~D~rop Page"
+msgstr "~D~ropp Side"
+
+#: engines/mohawk/dialogs.cpp:99
+msgid "~S~how Map"
+msgstr "Vi~s~ Kart"
+
+#: engines/mohawk/dialogs.cpp:105
+msgid "~M~ain Menu"
+msgstr "Hoved~m~eny"
+
+#: engines/mohawk/dialogs.cpp:168
+msgid "~W~ater Effect Enabled"
+msgstr "~V~anneffekt aktivert"
+
+#: engines/neverhood/detection.cpp:167
+msgid "Skip the Hall of Records storyboard scenes"
+msgstr ""
+
+#: engines/neverhood/detection.cpp:168
+msgid "Allows the player to skip past the Hall of Records storyboard scenes"
+msgstr ""
+
+#: engines/neverhood/detection.cpp:174
+msgid "Scale the making of videos to full screen"
+msgstr ""
+
+#: engines/neverhood/detection.cpp:175
+msgid "Scale the making of videos, so that they use the whole screen"
+msgstr ""
+
+#: engines/parallaction/saveload.cpp:133
+#, c-format
+msgid ""
+"Can't save game in slot %i\n"
+"\n"
+msgstr ""
+"Kan ikke lagre spilltilstand i posisjon %i\n"
+"\n"
+
+#: engines/parallaction/saveload.cpp:204
+msgid "Loading game..."
+msgstr "Laster spill..."
+
+#: engines/parallaction/saveload.cpp:219
+msgid "Saving game..."
+msgstr "Lagrer spill..."
+
+#: engines/parallaction/saveload.cpp:272
+msgid ""
+"ScummVM found that you have old savefiles for Nippon Safes that should be "
+"renamed.\n"
+"The old names are 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 next time.\n"
+msgstr ""
+"ScummVM oppdaget at du har gamle lagrede spill for Nippon Safes som bør "
+"omdøpes.\n"
+"De gamle navnene støttes ikke lengre, så du vil ikke være i stand til å "
+"laste de lagrede spillene,\n"
+"med mindre du konverterer dem.\n"
+"Trykk OK for å konvertere dem nå, ellers vil du bli spurt igjen neste gang "
+"du starter spillet.\n"
+
+#: engines/parallaction/saveload.cpp:319
+msgid "ScummVM successfully converted all your savefiles."
+msgstr "ScummVM konverterte alle de lagrede spillene dine uten problemer."
+
+#: engines/parallaction/saveload.cpp:321
+msgid ""
+"ScummVM printed some warnings in your console window and can't guarantee all "
+"your files have been converted.\n"
+"\n"
+"Please report to the team."
+msgstr ""
+"ScummVM skrev ut noen advarsler i konsollvinduet ditt og kan ikke garantere "
+"at alle filene dine har blitt konvertert.\n"
+"\n"
+"Vennligst rapporter dette til teamet."
+
+#: engines/pegasus/pegasus.cpp:714
+msgid "Invalid save file name"
+msgstr "Ugyldig navn for lagret spill"
+
+#: engines/pegasus/pegasus.cpp:2507
+msgid "Up/Zoom In/Move Forward/Open Doors"
+msgstr "Opp/Zoom Inn/Beveg Forover/Åpne Dører"
+
+#: engines/pegasus/pegasus.cpp:2508
+msgid "Down/Zoom Out"
+msgstr "Ned/Zoom Ut"
+
+#: engines/pegasus/pegasus.cpp:2511
+msgid "Display/Hide Inventory Tray"
+msgstr "VIs/Skjul Inventoryskuff"
+
+#: engines/pegasus/pegasus.cpp:2512
+msgid "Display/Hide Biochip Tray"
+msgstr "Vis/Skjul Biochipskuff"
+
+#: engines/pegasus/pegasus.cpp:2513
+msgid "Action/Select"
+msgstr "Handling/Velg"
+
+#: engines/pegasus/pegasus.cpp:2514
+msgid "Toggle Center Data Display"
+msgstr ""
+
+#: engines/pegasus/pegasus.cpp:2515
+msgid "Display/Hide Info Screen"
+msgstr "Vis/Skjul Infoskjerm"
+
+#: engines/pegasus/pegasus.cpp:2516
+msgid "Display/Hide Pause Menu"
+msgstr "Vis/Skjul Pausemeny"
+
+#: engines/pegasus/pegasus.cpp:2517
+msgid "???"
+msgstr "???"
+
+#: engines/sci/detection.cpp:374
msgid "EGA undithering"
msgstr "EGA av-dithering"
-#: engines/sci/detection.cpp:374
+#: engines/sci/detection.cpp:375
msgid "Enable undithering in EGA games"
msgstr "Aktiver av-dithering i EGA-spill"
-#: engines/sci/detection.cpp:383
+#: engines/sci/detection.cpp:384
msgid "Prefer digital sound effects"
msgstr "Foretrekk digitale lydeffekter"
-#: engines/sci/detection.cpp:384
+#: engines/sci/detection.cpp:385
msgid "Prefer digital sound effects instead of synthesized ones"
msgstr "Foretrekk digitale lydeffekter fremfor syntetiske"
-#: engines/sci/detection.cpp:403
+#: engines/sci/detection.cpp:404
msgid "Use IMF/Yamaha FB-01 for MIDI output"
msgstr "Bruk IMF/Yamaha-FB-01 for MIDI-output"
-#: engines/sci/detection.cpp:404
+#: engines/sci/detection.cpp:405
msgid ""
"Use an IBM Music Feature card or a Yamaha FB-01 FM synth module for MIDI "
"output"
@@ -1468,164 +2477,146 @@ msgstr ""
"Bruk et IBM Music Feature-kort eller en Yamaha FB-01 FM-synthmodul til MIDI "
"output"
-#: engines/sci/detection.cpp:414
+#: engines/sci/detection.cpp:415
msgid "Use CD audio"
msgstr "Bruk CD-lyd"
-#: engines/sci/detection.cpp:415
+#: engines/sci/detection.cpp:416
msgid "Use CD audio instead of in-game audio, if available"
msgstr "Bruk CD-lyd istedenfor spillets lyd, hvis tilgjengelig"
-#: engines/sci/detection.cpp:425
+#: engines/sci/detection.cpp:426
msgid "Use Windows cursors"
msgstr "Bruk Windows-muspekere"
-#: engines/sci/detection.cpp:426
+#: engines/sci/detection.cpp:427
msgid ""
"Use the Windows cursors (smaller and monochrome) instead of the DOS ones"
msgstr "Bruk Windows-muspekerene (mindre, og monokrome) isteden"
-#: engines/sci/detection.cpp:436
+#: engines/sci/detection.cpp:437
msgid "Use silver cursors"
msgstr "Bruk sølvmuspekere"
-#: engines/sci/detection.cpp:437
+#: engines/sci/detection.cpp:438
msgid ""
"Use the alternate set of silver cursors, instead of the normal golden ones"
msgstr ""
"Bruk det alternative settet med sølvmuspekere, istedenfor de normale gylne."
-#: engines/scumm/dialogs.cpp:175
+#: engines/scumm/dialogs.cpp:176
#, c-format
msgid "Insert Disk %c and Press Button to Continue."
msgstr "Sett inn disk %c, og trykk Tast for å fortsette."
-#: engines/scumm/dialogs.cpp:176
+#: engines/scumm/dialogs.cpp:177
#, c-format
msgid "Unable to Find %s, (%c%d) Press Button."
msgstr "Fant ikke %s, (%c%d) Trykk Knapp."
-#: engines/scumm/dialogs.cpp:177
+#: engines/scumm/dialogs.cpp:178
#, c-format
msgid "Error reading disk %c, (%c%d) Press Button."
msgstr "Feil ved lesing av disk %c, (%c%d) Trykk Knapp."
-#: engines/scumm/dialogs.cpp:178
+#: engines/scumm/dialogs.cpp:179
msgid "Game Paused. Press SPACE to Continue."
msgstr "Spill pauset. Trykk på MELLOMROMstasten for å fortsette."
#. 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
+#: engines/scumm/dialogs.cpp:183
msgid "Are you sure you want to restart? (Y/N)"
msgstr "Er du sikker på at du vil avslutte? (Y/N)"
#. I18N: you may specify 'Yes' symbol at the end of the line. See previous comment
-#: engines/scumm/dialogs.cpp:184
+#: engines/scumm/dialogs.cpp:185
msgid "Are you sure you want to quit? (Y/N)"
msgstr "Er du sikker på at du vil avslutte? (Y/N)"
-#: engines/scumm/dialogs.cpp:189
+#: engines/scumm/dialogs.cpp:190
msgid "Play"
msgstr "Spill"
-#: 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:215
-msgid "Quit"
-msgstr "Avslutt"
-
-#: engines/scumm/dialogs.cpp:193
+#: engines/scumm/dialogs.cpp:194
msgid "Insert save/load game disk"
msgstr "Sett inn disk for lagrede spill"
-#: engines/scumm/dialogs.cpp:194
+#: engines/scumm/dialogs.cpp:195
msgid "You must enter a name"
msgstr "Du må skrive inn et navn"
-#: engines/scumm/dialogs.cpp:195
+#: engines/scumm/dialogs.cpp:196
msgid "The game was NOT saved (disk full?)"
msgstr "Spillet ble IKKE lagret (full disk?)"
-#: engines/scumm/dialogs.cpp:196
+#: engines/scumm/dialogs.cpp:197
msgid "The game was NOT loaded"
msgstr "Spillet ble IKKE lastet"
-#: engines/scumm/dialogs.cpp:197
+#: engines/scumm/dialogs.cpp:198
#, c-format
msgid "Saving '%s'"
msgstr "Lagrer '%s'"
-#: engines/scumm/dialogs.cpp:198
+#: engines/scumm/dialogs.cpp:199
#, c-format
msgid "Loading '%s'"
msgstr "Laster '%s'"
-#: engines/scumm/dialogs.cpp:199
+#: engines/scumm/dialogs.cpp:200
msgid "Name your SAVE game"
msgstr "Gi det LAGREDE spillet ditt et navn"
-#: engines/scumm/dialogs.cpp:200
+#: engines/scumm/dialogs.cpp:201
msgid "Select a game to LOAD"
msgstr "Velg et spill for LASTING"
-#: engines/scumm/dialogs.cpp:201
+#: engines/scumm/dialogs.cpp:202
msgid "Game title)"
msgstr "Spilltittel)"
#. I18N: Previous page button
-#: engines/scumm/dialogs.cpp:287
+#: engines/scumm/dialogs.cpp:288
msgid "~P~revious"
msgstr "~F~orrige"
#. I18N: Next page button
-#: engines/scumm/dialogs.cpp:289
+#: engines/scumm/dialogs.cpp:290
msgid "~N~ext"
msgstr "~N~este"
-#: engines/scumm/dialogs.cpp:290
-#: backends/platform/ds/arm9/source/dsoptions.cpp:56
-msgid "~C~lose"
-msgstr "~L~ukk"
-
-#: engines/scumm/dialogs.cpp:597
+#: engines/scumm/dialogs.cpp:598
msgid "Speech Only"
msgstr "Kun tale"
-#: engines/scumm/dialogs.cpp:598
+#: engines/scumm/dialogs.cpp:599
msgid "Speech and Subtitles"
msgstr "Tale og undertekster"
-#: engines/scumm/dialogs.cpp:599
+#: engines/scumm/dialogs.cpp:600
msgid "Subtitles Only"
msgstr "Kun undertekster"
-#: engines/scumm/dialogs.cpp:607
+#: engines/scumm/dialogs.cpp:608
msgctxt "lowres"
msgid "Speech & Subs"
msgstr "Tekst & Tale"
-#: engines/scumm/dialogs.cpp:653
+#: engines/scumm/dialogs.cpp:654
msgid "Select a Proficiency Level."
msgstr "Velg ferdighetsnivå"
-#: engines/scumm/dialogs.cpp:655
+#: engines/scumm/dialogs.cpp:656
msgid "Refer to your Loom(TM) manual for help."
msgstr "Referer til Loom(TM)-håndboka di for hjelp."
-#: engines/scumm/dialogs.cpp:658
-msgid "Standard"
-msgstr "Standard"
-
-#: engines/scumm/dialogs.cpp:659
+#: engines/scumm/dialogs.cpp:660
msgid "Practice"
msgstr "Trening"
-#: engines/scumm/dialogs.cpp:660
+#: engines/scumm/dialogs.cpp:661
msgid "Expert"
msgstr "Ekspert"
@@ -2142,7 +3133,7 @@ msgstr "Fly til høyre"
msgid "Fly to lower right"
msgstr "Fly til nedre høyre"
-#: engines/scumm/scumm.cpp:1776
+#: engines/scumm/scumm.cpp:1777
#, c-format
msgid ""
"Native MIDI support requires the Roland Upgrade from LucasArts,\n"
@@ -2151,40 +3142,7 @@ msgstr ""
"Ekte MIDI-støtte krever «Roland Upgrade» fra LucasArts,\n"
"men %s mangler. Bruker AdLib istedet."
-#: engines/scumm/scumm.cpp:2303 engines/agos/saveload.cpp:220
-#, c-format
-msgid ""
-"Failed to save game state to file:\n"
-"\n"
-"%s"
-msgstr ""
-"Klarte ikke lagre spilltilstand til fil:\n"
-"\n"
-"%s"
-
-#: engines/scumm/scumm.cpp:2310 engines/agos/saveload.cpp:185
-#, c-format
-msgid ""
-"Failed to load game state from file:\n"
-"\n"
-"%s"
-msgstr ""
-"Klarte ikke åpne spilltilstand fra fil:\n"
-"\n"
-"%s"
-
-#: engines/scumm/scumm.cpp:2322 engines/agos/saveload.cpp:228
-#, c-format
-msgid ""
-"Successfully saved game state in file:\n"
-"\n"
-"%s"
-msgstr ""
-"Fullførte lagring av spilltilstand til fil:\n"
-"\n"
-"%s"
-
-#: engines/scumm/scumm.cpp:2537
+#: engines/scumm/scumm.cpp:2547
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' "
@@ -2194,190 +3152,6 @@ msgstr ""
"ennå. Så, for å spille Maniac Mansion, gå til 'Legg til spill' i ScummVM-"
"hovedmenyen og velg 'Maniac'-undermappa i Tentacle-mappa."
-#. I18N: Option for fast scene switching
-#: engines/mohawk/dialogs.cpp:92 engines/mohawk/dialogs.cpp:167
-msgid "~Z~ip Mode Activated"
-msgstr "~Z~ipmodus aktivert"
-
-#: engines/mohawk/dialogs.cpp:93
-msgid "~T~ransitions Enabled"
-msgstr "~O~verganger aktivert"
-
-#. I18N: Drop book page
-#: engines/mohawk/dialogs.cpp:95
-msgid "~D~rop Page"
-msgstr "~D~ropp Side"
-
-#: engines/mohawk/dialogs.cpp:99
-msgid "~S~how Map"
-msgstr "Vi~s~ Kart"
-
-#: engines/mohawk/dialogs.cpp:105
-msgid "~M~ain Menu"
-msgstr "Hoved~m~eny"
-
-#: engines/mohawk/dialogs.cpp:168
-msgid "~W~ater Effect Enabled"
-msgstr "~V~anneffekt aktivert"
-
-#: engines/agos/animation.cpp:557
-#, c-format
-msgid "Cutscene file '%s' not found!"
-msgstr "Fant ikke cutscenefil '%s'!"
-
-#: engines/gob/inter_playtoons.cpp:256 engines/gob/inter_v2.cpp:1287
-#: engines/tinsel/saveload.cpp:532
-msgid "Failed to load game state from file."
-msgstr "Klarte ikke åpne spilltilstand fra fil."
-
-#: engines/gob/inter_v2.cpp:1357 engines/tinsel/saveload.cpp:545
-msgid "Failed to save game state to file."
-msgstr "Klarte ikke lagre spilltilstand fra fil."
-
-#: engines/gob/inter_v5.cpp:107
-msgid "Failed to delete file."
-msgstr "Klarte ikke å slette fil."
-
-#: engines/groovie/detection.cpp:312
-msgid "Fast movie speed"
-msgstr "Rask filmhastighet"
-
-#: engines/groovie/detection.cpp:313
-msgid "Play movies at an increased speed"
-msgstr "Spill filmer med økt hastighet"
-
-#: engines/groovie/script.cpp:420
-msgid "Failed to save game"
-msgstr "Klarte ikke å lagre spill."
-
-#. I18N: Studio audience adds an applause and cheering sounds whenever
-#. Malcolm makes a joke.
-#: engines/kyra/detection.cpp:62
-msgid "Studio audience"
-msgstr "Studiopublikum"
-
-#: engines/kyra/detection.cpp:63
-msgid "Enable studio audience"
-msgstr "Aktiver studiopublikum"
-
-#. I18N: This option allows the user to skip text and cutscenes.
-#: engines/kyra/detection.cpp:73
-msgid "Skip support"
-msgstr ""
-
-#: engines/kyra/detection.cpp:74
-msgid "Allow text and cutscenes to be skipped"
-msgstr "Tillat å hoppe over tekst og kutt-scener"
-
-#. I18N: Helium mode makes people sound like they've inhaled Helium.
-#: engines/kyra/detection.cpp:84
-msgid "Helium mode"
-msgstr "Helium-modus"
-
-#: engines/kyra/detection.cpp:85
-msgid "Enable helium mode"
-msgstr "Aktiver helium-modus"
-
-#. I18N: When enabled, this option makes scrolling smoother when
-#. changing from one screen to another.
-#: engines/kyra/detection.cpp:99
-msgid "Smooth scrolling"
-msgstr "Myk scrolling"
-
-#: engines/kyra/detection.cpp:100
-msgid "Enable smooth scrolling when walking"
-msgstr "Aktiver myk scrolling når man går"
-
-#. I18N: When enabled, this option changes the cursor when it floats to the
-#. edge of the screen to a directional arrow. The player can then click to
-#. walk towards that direction.
-#: engines/kyra/detection.cpp:112
-msgid "Floating cursors"
-msgstr "Flytende muspekere"
-
-#: engines/kyra/detection.cpp:113
-msgid "Enable floating cursors"
-msgstr "Aktiver flytende muspekere"
-
-#. I18N: HP stands for Hit Points
-#: engines/kyra/detection.cpp:127
-msgid "HP bar graphs"
-msgstr "HP bar grafer"
-
-#: engines/kyra/detection.cpp:128
-msgid "Enable hit point bar graphs"
-msgstr "Aktiver hit point-bar grafer"
-
-#: engines/kyra/lol.cpp:478
-msgid "Attack 1"
-msgstr "Angrep 1"
-
-#: engines/kyra/lol.cpp:479
-msgid "Attack 2"
-msgstr "Angrep 2"
-
-#: engines/kyra/lol.cpp:480
-msgid "Attack 3"
-msgstr "Angrep 3"
-
-#: engines/kyra/lol.cpp:481
-msgid "Move Forward"
-msgstr "Beveg Fremover"
-
-#: engines/kyra/lol.cpp:482
-msgid "Move Back"
-msgstr "Beveg Bakover"
-
-#: engines/kyra/lol.cpp:483
-msgid "Slide Left"
-msgstr "Skli mot Venstre"
-
-#: engines/kyra/lol.cpp:484
-msgid "Slide Right"
-msgstr "Skli mot Høyre"
-
-#: engines/kyra/lol.cpp:485 engines/pegasus/pegasus.cpp:2447
-msgid "Turn Left"
-msgstr "Svin til Venstre"
-
-#: engines/kyra/lol.cpp:486 engines/pegasus/pegasus.cpp:2448
-msgid "Turn Right"
-msgstr "Sving til Høyre"
-
-#: engines/kyra/lol.cpp:487
-msgid "Rest"
-msgstr "Hvil"
-
-#: engines/kyra/lol.cpp:488
-msgid "Options"
-msgstr "Valg"
-
-#: engines/kyra/lol.cpp:489
-msgid "Choose Spell"
-msgstr "Velg Trolldom"
-
-#: engines/kyra/sound_midi.cpp:477
-msgid ""
-"You appear to be using a General MIDI device,\n"
-"but your game only supports Roland MT32 MIDI.\n"
-"We try to map the Roland MT32 instruments to\n"
-"General MIDI ones. It is still possible that\n"
-"some tracks sound incorrect."
-msgstr ""
-"Du ser ut til å bruke en General MIDI-enhet,\n"
-"men spillet ditt støtter bare Roland MT32-MIDI.\n"
-"Vi forsøker å koble Roland MT32-instrumentene til\n"
-"General MIDI-instrumentene. Allikevel, kan det\n"
-"skje at enkelte spor ikke vil spilles riktig."
-
-#: engines/queen/queen.cpp:59
-msgid "Alternative intro"
-msgstr "Alternativ intro"
-
-#: engines/queen/queen.cpp:60
-msgid "Use an alternative game intro (CD version only)"
-msgstr "Bruk en alternativ intro (Kun for CD-versjon)"
-
#: engines/sky/compact.cpp:130
msgid ""
"Unable to find \"sky.cpt\" file!\n"
@@ -2402,20 +3176,21 @@ msgstr "Diskett-intro"
msgid "Use the floppy version's intro (CD version only)"
msgstr "Bruk diskettversjonens intro (Kun for CD-versjon)"
-#: engines/sword1/animation.cpp:519
+#: engines/sword1/animation.cpp:524
#, c-format
msgid "PSX stream cutscene '%s' cannot be played in paletted mode"
msgstr "PSX-strøm cutscene '%s' kan ikke spilles i pallettmodus"
-#: engines/sword1/animation.cpp:540 engines/sword2/animation.cpp:439
+#: engines/sword1/animation.cpp:545 engines/sword2/animation.cpp:445
msgid "DXA cutscenes found but ScummVM has been built without zlib support"
msgstr "DXA-cutscener funnet men ScummVM er bygd uten zlib-støtte"
-#: engines/sword1/animation.cpp:550 engines/sword2/animation.cpp:449
-msgid "MPEG2 cutscenes are no longer supported"
-msgstr "MPEG2-cutscener støttes ikke lengre"
+#: engines/sword1/animation.cpp:561
+#, fuzzy
+msgid "MPEG-2 cutscenes found but ScummVM has been built without MPEG-2"
+msgstr "PSX-cutscener funnet, men ScummVM har blitt bygd uten RGB-fargestøtte"
-#: engines/sword1/animation.cpp:556 engines/sword2/animation.cpp:457
+#: engines/sword1/animation.cpp:568 engines/sword2/animation.cpp:470
#, c-format
msgid "Cutscene '%s' not found"
msgstr "Fant ikke cutscene '%s'"
@@ -2459,11 +3234,17 @@ msgstr "Behold den nye"
msgid "This is the end of the Broken Sword 1 Demo"
msgstr "Dette er slutten på Broken Sword 1-demoen"
-#: engines/sword2/animation.cpp:419
+#: engines/sword2/animation.cpp:425
msgid ""
"PSX cutscenes found but ScummVM has been built without RGB color support"
msgstr "PSX-cutscener funnet, men ScummVM har blitt bygd uten RGB-fargestøtte"
+#: engines/sword2/animation.cpp:461
+#, fuzzy
+msgid ""
+"MPEG-2 cutscenes found but ScummVM has been built without MPEG-2 support"
+msgstr "DXA-cutscener funnet men ScummVM er bygd uten zlib-støtte"
+
#: engines/sword2/sword2.cpp:79
msgid "Show object labels"
msgstr "Vis objektmerkelapper"
@@ -2472,12 +3253,12 @@ msgstr "Vis objektmerkelapper"
msgid "Show labels for objects on mouse hover"
msgstr "Vis merkelapper for objekter når musa står over dem"
-#: engines/teenagent/resources.cpp:94
+#: engines/teenagent/resources.cpp:95
msgid ""
"You're missing the 'teenagent.dat' file. Get it from the ScummVM website"
msgstr "Du mangler 'teenagent.dat'-fila. Hent den ned fra ScummVM-hjemmesiden"
-#: engines/teenagent/resources.cpp:115
+#: engines/teenagent/resources.cpp:116
msgid ""
"The teenagent.dat file is compressed and zlib hasn't been included in this "
"executable. Please decompress it"
@@ -2485,791 +3266,49 @@ msgstr ""
"teenagent.dat-fila er komprimert og zlib har ikke blitt inkludert i denne "
"programfilen. Vennligst pakk den ut"
-#: engines/parallaction/saveload.cpp:133
-#, c-format
-msgid ""
-"Can't save game in slot %i\n"
-"\n"
-msgstr ""
-"Kan ikke lagre spilltilstand i posisjon %i\n"
-"\n"
-
-#: engines/parallaction/saveload.cpp:204
-msgid "Loading game..."
-msgstr "Laster spill..."
-
-#: engines/parallaction/saveload.cpp:219
-msgid "Saving game..."
-msgstr "Lagrer spill..."
-
-#: engines/parallaction/saveload.cpp:272
-msgid ""
-"ScummVM found that you have old savefiles for Nippon Safes that should be "
-"renamed.\n"
-"The old names are 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 next time.\n"
-msgstr ""
-"ScummVM oppdaget at du har gamle lagrede spill for Nippon Safes som bør "
-"omdøpes.\n"
-"De gamle navnene støttes ikke lengre, så du vil ikke være i stand til å "
-"laste de lagrede spillene,\n"
-"med mindre du konverterer dem.\n"
-"Trykk OK for å konvertere dem nå, ellers vil du bli spurt igjen neste gang "
-"du starter spillet.\n"
-
-#: engines/parallaction/saveload.cpp:319
-msgid "ScummVM successfully converted all your savefiles."
-msgstr "ScummVM konverterte alle de lagrede spillene dine uten problemer."
-
-#: engines/parallaction/saveload.cpp:321
-msgid ""
-"ScummVM printed some warnings in your console window and can't guarantee all "
-"your files have been converted.\n"
-"\n"
-"Please report to the team."
-msgstr ""
-"ScummVM skrev ut noen advarsler i konsollvinduet ditt og kan ikke garantere "
-"at alle filene dine har blitt konvertert.\n"
-"\n"
-"Vennligst rapporter dette til teamet."
-
-#: engines/pegasus/pegasus.cpp:679
-msgid "Invalid save file name"
-msgstr "Ugyldig navn for lagret spill"
-
-#: engines/pegasus/pegasus.cpp:2445
-msgid "Up/Zoom In/Move Forward/Open Doors"
-msgstr "Opp/Zoom Inn/Beveg Forover/Åpne Dører"
-
-#: engines/pegasus/pegasus.cpp:2446
-msgid "Down/Zoom Out"
-msgstr "Ned/Zoom Ut"
-
-#: engines/pegasus/pegasus.cpp:2449
-msgid "Display/Hide Inventory Tray"
-msgstr "VIs/Skjul Inventoryskuff"
-
-#: engines/pegasus/pegasus.cpp:2450
-msgid "Display/Hide Biochip Tray"
-msgstr "Vis/Skjul Biochipskuff"
-
-#: engines/pegasus/pegasus.cpp:2451
-msgid "Action/Select"
-msgstr "Handling/Velg"
-
-#: engines/pegasus/pegasus.cpp:2452
-msgid "Toggle Center Data Display"
-msgstr ""
-
-#: engines/pegasus/pegasus.cpp:2453
-msgid "Display/Hide Info Screen"
-msgstr "Vis/Skjul Infoskjerm"
-
-#: engines/pegasus/pegasus.cpp:2454
-msgid "Display/Hide Pause Menu"
-msgstr "Vis/Skjul Pausemeny"
-
-#: engines/pegasus/pegasus.cpp:2455
-msgid "???"
-msgstr "???"
-
-#: audio/fmopl.cpp:49
-msgid "MAME OPL emulator"
-msgstr "MAME OPL emulator"
-
-#: audio/fmopl.cpp:51
-msgid "DOSBox OPL emulator"
-msgstr "DOSBox OPL emulator"
-
-#: audio/mididrv.cpp:209
-#, c-format
-msgid ""
-"The selected audio device '%s' was not found (e.g. might be turned off or "
-"disconnected)."
-msgstr ""
-"Den valgte lydenheten '%s' ble ikke funnet (den kan f.eks. være avslått "
-"eller frakoblet)."
-
-#: audio/mididrv.cpp:209 audio/mididrv.cpp:221 audio/mididrv.cpp:257
-#: audio/mididrv.cpp:272
-msgid "Attempting to fall back to the next available device..."
-msgstr "Forsøker å falle tilbake på den neste tilgjengelige enheten..."
-
-#: audio/mididrv.cpp:221
-#, c-format
-msgid ""
-"The selected audio device '%s' cannot be used. See log file for more "
-"information."
-msgstr ""
-"Den valgte lydenheten '%s' kan ikke brukes. Se logg-filen for mer "
-"informasjon."
-
-#: audio/mididrv.cpp:257
-#, c-format
-msgid ""
-"The preferred audio device '%s' was not found (e.g. might be turned off or "
-"disconnected)."
-msgstr ""
-"Den foretrukne lydenheten '%s' ble ikke funnet (den kan f.eks. være avslått "
-"eller frakoblet)."
-
-#: audio/mididrv.cpp:272
-#, c-format
-msgid ""
-"The preferred audio device '%s' cannot be used. See log file for more "
-"information."
-msgstr ""
-"Den foretrukne lydenheten '%s' kan ikke brukes. Se i logg-filen for mer "
-"informasjon."
-
-#: audio/null.h:43
-msgid "No music"
-msgstr "Ingen musikk"
-
-#: audio/mods/paula.cpp:189
-msgid "Amiga Audio Emulator"
-msgstr "Amiga Lydemulator"
-
-#: audio/softsynth/adlib.cpp:2284
-msgid "AdLib Emulator"
-msgstr "AdLib Emulator"
-
-#: audio/softsynth/appleiigs.cpp:33
-msgid "Apple II GS Emulator (NOT IMPLEMENTED)"
-msgstr "Apple II GS Emulator (IKKE IMPLEMENTERT)"
-
-#: audio/softsynth/sid.cpp:1430
-msgid "C64 Audio Emulator"
-msgstr "C64 Lydemulator"
-
-#: audio/softsynth/mt32.cpp:205
-msgid "Initializing MT-32 Emulator"
-msgstr "Initialiserer MT-32-Emulator"
-
-#: audio/softsynth/mt32.cpp:431
-msgid "MT-32 Emulator"
-msgstr "MT-32 Emulator"
-
-#: audio/softsynth/pcspk.cpp:139
-msgid "PC Speaker Emulator"
-msgstr "PC Speaker Emulator"
-
-#: audio/softsynth/pcspk.cpp:158
-msgid "IBM PCjr Emulator"
-msgstr "IBM PCjr Emulator"
-
-#: backends/keymapper/remap-dialog.cpp:47
-msgid "Keymap:"
-msgstr "Tastkobling:"
-
-#: backends/keymapper/remap-dialog.cpp:66
-msgid " (Effective)"
-msgstr " (Aktiv)"
-
-#: backends/keymapper/remap-dialog.cpp:106
-msgid " (Active)"
-msgstr " (Aktiv)"
-
-#: backends/keymapper/remap-dialog.cpp:106
-msgid " (Blocked)"
-msgstr " (Blokkert)"
-
-#: backends/keymapper/remap-dialog.cpp:119
-msgid " (Global)"
-msgstr " (Global)"
-
-#: backends/keymapper/remap-dialog.cpp:127
-msgid " (Game)"
-msgstr " (Spill)"
-
-#: backends/midi/windows.cpp:164
-msgid "Windows MIDI"
-msgstr "Windows MIDI"
-
-#: backends/platform/ds/arm9/source/dsoptions.cpp:57
-msgid "ScummVM Main Menu"
-msgstr "ScummVM Hovedmeny"
-
-#: backends/platform/ds/arm9/source/dsoptions.cpp:63
-msgid "~L~eft handed mode"
-msgstr "~V~enstrehendt modus"
-
-#: backends/platform/ds/arm9/source/dsoptions.cpp:64
-msgid "~I~ndy fight controls"
-msgstr "~I~ndy kampkontroller"
-
-#: backends/platform/ds/arm9/source/dsoptions.cpp:65
-msgid "Show mouse cursor"
-msgstr "Vis muspeker"
-
-#: backends/platform/ds/arm9/source/dsoptions.cpp:66
-msgid "Snap to edges"
-msgstr "Hopp til kanter"
-
-#: backends/platform/ds/arm9/source/dsoptions.cpp:68
-msgid "Touch X Offset"
-msgstr "Gå til X-posisjon"
-
-#: backends/platform/ds/arm9/source/dsoptions.cpp:75
-msgid "Touch Y Offset"
-msgstr "Gå til Y-posisjon"
-
-#: backends/platform/ds/arm9/source/dsoptions.cpp:87
-msgid "Use laptop trackpad-style cursor control"
-msgstr "Bruk bærbar trackpad-stil muspekerkontroll"
-
-#: backends/platform/ds/arm9/source/dsoptions.cpp:88
-msgid "Tap for left click, double tap right click"
-msgstr "Tap for venstreklikk, dobbelt-tap for høyreklikk"
-
-#: backends/platform/ds/arm9/source/dsoptions.cpp:90
-msgid "Sensitivity"
-msgstr "Følsomhet"
-
-#: backends/platform/ds/arm9/source/dsoptions.cpp:99
-msgid "Initial top screen scale:"
-msgstr "Skalering for øvre skjerm:"
-
-#: backends/platform/ds/arm9/source/dsoptions.cpp:105
-msgid "Main screen scaling:"
-msgstr "Hovedskjermsskalering:"
-
-#: backends/platform/ds/arm9/source/dsoptions.cpp:107
-msgid "Hardware scale (fast, but low quality)"
-msgstr "Maskinvareskalering (rask, men lav kvalitet)"
-
-#: backends/platform/ds/arm9/source/dsoptions.cpp:108
-msgid "Software scale (good quality, but slower)"
-msgstr "Programvareskalering (god kvalitet, men tregere)"
-
-#: backends/platform/ds/arm9/source/dsoptions.cpp:109
-msgid "Unscaled (you must scroll left and right)"
-msgstr "Uskalert (du må scrolle til venstre og høyre)"
-
-#: backends/platform/ds/arm9/source/dsoptions.cpp:111
-msgid "Brightness:"
-msgstr "Lysstyrke:"
-
-#: backends/platform/ds/arm9/source/dsoptions.cpp:121
-msgid "High quality audio (slower) (reboot)"
-msgstr "Høy lydkvalitet (tregere) (omstart)"
-
-#: backends/platform/ds/arm9/source/dsoptions.cpp:122
-msgid "Disable power off"
-msgstr "Deaktiver strømsparing"
-
-#: backends/platform/iphone/osys_events.cpp:300
-msgid "Mouse-click-and-drag mode enabled."
-msgstr "Mus-klikk-og-dra-modus aktivert."
-
-#: backends/platform/iphone/osys_events.cpp:302
-msgid "Mouse-click-and-drag mode disabled."
-msgstr "Mus-klikk-og-dra-modus-deaktivert."
-
-#: backends/platform/iphone/osys_events.cpp:313
-msgid "Touchpad mode enabled."
-msgstr "Touchpad-modus aktivert."
-
-#: backends/platform/iphone/osys_events.cpp:315
-msgid "Touchpad mode disabled."
-msgstr "Touchpad-modus deaktivert."
-
-#: backends/platform/maemo/maemo.cpp:209
-msgid "Click Mode"
-msgstr "Klikkmodus"
-
-#: backends/platform/maemo/maemo.cpp:215
-#: 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/maemo/maemo.cpp:218
-msgid "Middle Click"
-msgstr "Midtklikk"
-
-#: backends/platform/maemo/maemo.cpp:221
-#: 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"
-
-#: backends/platform/sdl/macosx/appmenu_osx.mm:77
-msgid "Hide ScummVM"
-msgstr "Skjul ScummVM"
-
-#: backends/platform/sdl/macosx/appmenu_osx.mm:82
-msgid "Hide Others"
-msgstr "Skjul andre"
-
-#: backends/platform/sdl/macosx/appmenu_osx.mm:87
-msgid "Show All"
-msgstr "Vis alle"
-
-#: backends/platform/sdl/macosx/appmenu_osx.mm:109
-#: backends/platform/sdl/macosx/appmenu_osx.mm:120
-msgid "Window"
-msgstr "Vindu"
-
-#: backends/platform/sdl/macosx/appmenu_osx.mm:114
-msgid "Minimize"
-msgstr "Minimer"
-
-#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:45
-msgid "Normal (no scaling)"
-msgstr "Normal (ingen skalering)"
-
-#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:64
-msgctxt "lowres"
-msgid "Normal (no scaling)"
-msgstr "Normal (ingen skalering)"
-
-#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2135
-#: backends/graphics/openglsdl/openglsdl-graphics.cpp:537
-msgid "Enabled aspect ratio correction"
-msgstr "Aspekt-rate korrigering aktivert"
-
-#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2141
-#: backends/graphics/openglsdl/openglsdl-graphics.cpp:542
-msgid "Disabled aspect ratio correction"
-msgstr "Aspekt-rate korrigering deaktivert"
-
-#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2196
-msgid "Active graphics filter:"
-msgstr "Aktivt grafikkfilter:"
-
-#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2238
-#: backends/graphics/openglsdl/openglsdl-graphics.cpp:481
-msgid "Windowed mode"
-msgstr "Vindusmodus"
-
-#: backends/graphics/opengl/opengl-graphics.cpp:135
-msgid "OpenGL Normal"
-msgstr "OpenGL Normal"
-
-#: backends/graphics/opengl/opengl-graphics.cpp:136
-msgid "OpenGL Conserve"
-msgstr "OpenGL Bevar"
-
-#: backends/graphics/opengl/opengl-graphics.cpp:137
-msgid "OpenGL Original"
-msgstr "OpenGL Original"
-
-#: backends/graphics/openglsdl/openglsdl-graphics.cpp:415
-msgid "Current display mode"
-msgstr "Nåværende videomodus"
-
-#: backends/graphics/openglsdl/openglsdl-graphics.cpp:428
-msgid "Current scale"
-msgstr "Nåværende skala"
-
-#: backends/graphics/openglsdl/openglsdl-graphics.cpp:562
-msgid "Active filter mode: Linear"
-msgstr "Aktiv filtermodus: Linjær"
-
-#: backends/graphics/openglsdl/openglsdl-graphics.cpp:564
-msgid "Active filter mode: Nearest"
-msgstr "Aktiv filtermodus: Nærmeste"
-
-#: backends/platform/symbian/src/SymbianActions.cpp:38
-#: backends/platform/wince/CEActionsSmartphone.cpp:39
-msgid "Up"
-msgstr "Opp"
-
-#: backends/platform/symbian/src/SymbianActions.cpp:39
-#: backends/platform/wince/CEActionsSmartphone.cpp:40
-msgid "Down"
-msgstr "Ned"
-
-#: backends/platform/symbian/src/SymbianActions.cpp:40
-#: backends/platform/wince/CEActionsSmartphone.cpp:41
-msgid "Left"
-msgstr "Venstre"
-
-#: backends/platform/symbian/src/SymbianActions.cpp:41
-#: backends/platform/wince/CEActionsSmartphone.cpp:42
-msgid "Right"
-msgstr "Høyre"
-
-#: backends/platform/symbian/src/SymbianActions.cpp:46
-#: backends/platform/wince/CEActionsSmartphone.cpp:47
-msgid "Zone"
-msgstr "Sone"
-
-#: backends/platform/symbian/src/SymbianActions.cpp:47
-#: backends/platform/wince/CEActionsPocket.cpp:54
-#: backends/platform/wince/CEActionsSmartphone.cpp:48
-msgid "Multi Function"
-msgstr "Multifunksjon"
-
-#: backends/platform/symbian/src/SymbianActions.cpp:48
-msgid "Swap character"
-msgstr "Bytt karakter"
-
-#: backends/platform/symbian/src/SymbianActions.cpp:49
-msgid "Skip text"
-msgstr "Hopp over tekst"
-
-#: backends/platform/symbian/src/SymbianActions.cpp:51
-msgid "Fast mode"
-msgstr "Rask modus"
-
-#: backends/platform/symbian/src/SymbianActions.cpp:53
-msgid "Debugger"
-msgstr "Debugger"
-
-#: backends/platform/symbian/src/SymbianActions.cpp:54
-msgid "Global menu"
-msgstr "Global meny"
-
-#: backends/platform/symbian/src/SymbianActions.cpp:55
-msgid "Virtual keyboard"
-msgstr "Virtuelt tastatur"
-
-#: backends/platform/symbian/src/SymbianActions.cpp:56
-msgid "Key mapper"
-msgstr "Tastkobler"
-
-#: backends/events/symbiansdl/symbiansdl-events.cpp:184
-msgid "Do you want to quit ?"
-msgstr "Vil du avslutte?"
-
-#: backends/platform/wii/options.cpp:51
-msgid "Video"
-msgstr "Video"
-
-#: backends/platform/wii/options.cpp:54
-msgid "Current video mode:"
-msgstr "Nåværende videomodus:"
-
-#: backends/platform/wii/options.cpp:56
-msgid "Double-strike"
-msgstr "Doble linjer"
-
-#: backends/platform/wii/options.cpp:60
-msgid "Horizontal underscan:"
-msgstr "Horisontal underscan:"
-
-#: backends/platform/wii/options.cpp:66
-msgid "Vertical underscan:"
-msgstr "Vertikal underscan:"
-
-#: backends/platform/wii/options.cpp:71
-msgid "Input"
-msgstr "Input"
-
-#: backends/platform/wii/options.cpp:74
-msgid "GC Pad sensitivity:"
-msgstr "GC Pad-følsomhet:"
-
-#: backends/platform/wii/options.cpp:80
-msgid "GC Pad acceleration:"
-msgstr "GC Pad-aksellerasjon:"
-
-#: backends/platform/wii/options.cpp:86
-msgid "DVD"
-msgstr "DVD"
-
-#: backends/platform/wii/options.cpp:89 backends/platform/wii/options.cpp:101
-msgid "Status:"
-msgstr "Status:"
-
-#: backends/platform/wii/options.cpp:90 backends/platform/wii/options.cpp:102
-msgid "Unknown"
-msgstr "Ukjent"
-
-#: backends/platform/wii/options.cpp:93
-msgid "Mount DVD"
-msgstr "Monter DVD"
-
-#: backends/platform/wii/options.cpp:94
-msgid "Unmount DVD"
-msgstr "Løs ut DVD"
-
-#: backends/platform/wii/options.cpp:98
-msgid "SMB"
-msgstr "SMB"
-
-#: backends/platform/wii/options.cpp:106
-msgid "Server:"
-msgstr "Server:"
-
-#: backends/platform/wii/options.cpp:110
-msgid "Share:"
-msgstr "Delt Ressurs:"
-
-#: backends/platform/wii/options.cpp:114
-msgid "Username:"
-msgstr "Brukernavn:"
-
-#: backends/platform/wii/options.cpp:118
-msgid "Password:"
-msgstr "Passord:"
-
-#: backends/platform/wii/options.cpp:121
-msgid "Init network"
-msgstr "Init nettverk"
-
-#: backends/platform/wii/options.cpp:123
-msgid "Mount SMB"
-msgstr "Monter SMB"
-
-#: backends/platform/wii/options.cpp:124
-msgid "Unmount SMB"
-msgstr "Løs ut SMB"
-
-#: backends/platform/wii/options.cpp:143
-msgid "DVD Mounted successfully"
-msgstr "DVD montering fullført"
-
-#: backends/platform/wii/options.cpp:146
-msgid "Error while mounting the DVD"
-msgstr "Feil under montering av DVD"
-
-#: backends/platform/wii/options.cpp:148
-msgid "DVD not mounted"
-msgstr "DVD ikke montert"
-
-#: backends/platform/wii/options.cpp:161
-msgid "Network up, share mounted"
-msgstr "Nettverket er oppe, delt ressurs montert"
-
-#: backends/platform/wii/options.cpp:163
-msgid "Network up"
-msgstr "Nettverket er oppe"
-
-#: backends/platform/wii/options.cpp:166
-msgid ", error while mounting the share"
-msgstr ", feil under montering av den delte ressursen"
-
-#: backends/platform/wii/options.cpp:168
-msgid ", share not mounted"
-msgstr ", delt ressurs ikke montert"
-
-#: backends/platform/wii/options.cpp:174
-msgid "Network down"
-msgstr "Nettverket er nede"
-
-#: backends/platform/wii/options.cpp:178
-msgid "Initializing network"
-msgstr "Initialiserer nettverk"
-
-#: backends/platform/wii/options.cpp:182
-msgid "Timeout while initializing network"
-msgstr "Timeout under initialisering av nettverk"
-
-#: backends/platform/wii/options.cpp:186
-#, c-format
-msgid "Network not initialized (%d)"
-msgstr "Nettverk ikke initialisert (%d)"
-
-#: backends/platform/wince/CEActionsPocket.cpp:46
-msgid "Hide Toolbar"
-msgstr "Skjul verktøylinje"
-
-#: backends/platform/wince/CEActionsPocket.cpp:47
-msgid "Show Keyboard"
-msgstr "Vis tastatur"
-
-#: backends/platform/wince/CEActionsPocket.cpp:48
-msgid "Sound on/off"
-msgstr "Lyd av/på"
-
-#: backends/platform/wince/CEActionsPocket.cpp:49
-msgid "Right click"
-msgstr "Høyreklikk"
-
-#: backends/platform/wince/CEActionsPocket.cpp:50
-msgid "Show/Hide Cursor"
-msgstr "Vis/Skjul muspeker"
-
-#: backends/platform/wince/CEActionsPocket.cpp:51
-msgid "Free look"
-msgstr "Frikikking"
-
-#: backends/platform/wince/CEActionsPocket.cpp:52
-msgid "Zoom up"
-msgstr "Zoom opp"
-
-#: backends/platform/wince/CEActionsPocket.cpp:53
-msgid "Zoom down"
-msgstr "Zoom ned"
-
-#: backends/platform/wince/CEActionsPocket.cpp:55
-#: backends/platform/wince/CEActionsSmartphone.cpp:49
-msgid "Bind Keys"
-msgstr "Koble taster"
-
-#: backends/platform/wince/CEActionsPocket.cpp:56
-msgid "Cursor Up"
-msgstr "Peker opp"
-
-#: backends/platform/wince/CEActionsPocket.cpp:57
-msgid "Cursor Down"
-msgstr "Peker ned"
-
-#: backends/platform/wince/CEActionsPocket.cpp:58
-msgid "Cursor Left"
-msgstr "Peker venstre"
-
-#: backends/platform/wince/CEActionsPocket.cpp:59
-msgid "Cursor Right"
-msgstr "Peker høyre"
-
-#: 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:326
-#: backends/platform/wince/CEActionsSmartphone.cpp:287
-msgid " Are you sure you want to quit ? "
-msgstr " Er du sikker på at du vil avslutte ?"
-
-#: backends/platform/wince/CEActionsSmartphone.cpp:50
-msgid "Keyboard"
-msgstr "Tastatur"
-
-#: backends/platform/wince/CEActionsSmartphone.cpp:51
-msgid "Rotate"
-msgstr "Roter"
-
-#: backends/platform/wince/CELauncherDialog.cpp:56
-msgid "Using SDL driver "
-msgstr "Bruk SDL-driver"
-
-#: backends/platform/wince/CELauncherDialog.cpp:60
-msgid "Display "
-msgstr "Skjerm"
-
-#: 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:515
-msgid "Map right click action"
-msgstr "Koble handling til høyreklikk"
-
-#: 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:528
-msgid "Map hide toolbar action"
-msgstr "Koble skjul-verktøylinje-handlingen"
-
-#: 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:541
-msgid "Map Zoom Up action (optional)"
-msgstr "Koble handlingen Zoom Opp (valgfritt)"
-
-#: 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:552
-msgid ""
-"Don't forget to map a key to 'Hide Toolbar' action to see the whole inventory"
-msgstr ""
-"Ikke glem å koble en tast til handlingen 'Skjul verktøylinje' for å se hele "
-"inventaret"
-
-#: backends/events/default/default-events.cpp:193
-msgid "Do you really want to return to the Launcher?"
-msgstr "Vil du virkelig returnere til oppstarteren?"
-
-#: backends/events/default/default-events.cpp:193
-msgid "Launcher"
-msgstr "Oppstarter"
-
-#: backends/events/default/default-events.cpp:215
-msgid "Do you really want to quit?"
-msgstr "Vil du virkelig avslutte?"
-
-#: backends/events/gph/gph-events.cpp:386
-#: backends/events/gph/gph-events.cpp:429
-#: backends/events/openpandora/op-events.cpp:168
-msgid "Touchscreen 'Tap Mode' - Left Click"
-msgstr "Touchskjerm 'Tapmodus' - Venstreklikk"
-
-#: backends/events/gph/gph-events.cpp:388
-#: backends/events/gph/gph-events.cpp:431
-#: backends/events/openpandora/op-events.cpp:170
-msgid "Touchscreen 'Tap Mode' - Right Click"
-msgstr "Touchskjerm 'Tapmodus' - Høyreklikk"
-
-#: backends/events/gph/gph-events.cpp:390
-#: backends/events/gph/gph-events.cpp:433
-#: backends/events/openpandora/op-events.cpp:172
-msgid "Touchscreen 'Tap Mode' - Hover (No Click)"
-msgstr "Touchskjerm 'Tapmodus' - Sveve (Ingen Klikk)"
-
-#: backends/events/gph/gph-events.cpp:410
-msgid "Maximum Volume"
-msgstr "Maksimalt Volum"
+#~ msgctxt "lowres"
+#~ msgid "Mass Add..."
+#~ msgstr "Legg til flere..."
-#: backends/events/gph/gph-events.cpp:412
-msgid "Increasing Volume"
-msgstr "Øker volum"
+#~ msgid "Mass Add..."
+#~ msgstr "Legg til flere..."
-#: backends/events/gph/gph-events.cpp:418
-msgid "Minimal Volume"
-msgstr "Minimalt Volum"
+#~ msgid ""
+#~ "Turns off General MIDI mapping for games with Roland MT-32 soundtrack"
+#~ msgstr "Slå av General MIDI-kobling for spill som har Roland MT-32-lydspor"
-#: backends/events/gph/gph-events.cpp:420
-msgid "Decreasing Volume"
-msgstr "Senker volum"
+#~ msgid "Standard (16bpp)"
+#~ msgstr "Standard (16bpp)"
-#: backends/events/openpandora/op-events.cpp:174
-msgid "Touchscreen 'Tap Mode' - Hover (DPad Clicks)"
-msgstr "Touchskjerm 'Tapmodus' - Sveve (DPad Klikk)"
+#~ msgid "Alternative intro"
+#~ msgstr "Alternativ intro"
-#: backends/updates/macosx/macosx-updates.mm:67
-msgid "Check for Updates..."
-msgstr "Sjekk for oppdateringer..."
+#~ msgid "Use an alternative game intro (CD version only)"
+#~ msgstr "Bruk en alternativ intro (Kun for CD-versjon)"
-#: backends/platform/bada/form.cpp:269
-msgid "Right Click Once"
-msgstr "Høyreklikk én gang"
+#~ msgid "MPEG2 cutscenes are no longer supported"
+#~ msgstr "MPEG2-cutscener støttes ikke lengre"
-#: backends/platform/bada/form.cpp:277
-msgid "Move Only"
-msgstr "Kun Beveg"
+#~ msgid "OpenGL Normal"
+#~ msgstr "OpenGL Normal"
-#: backends/platform/bada/form.cpp:291
-msgid "Escape Key"
-msgstr "ESC-tast"
+#~ msgid "OpenGL Conserve"
+#~ msgstr "OpenGL Bevar"
-#: backends/platform/bada/form.cpp:296
-msgid "Game Menu"
-msgstr "Spillmeny"
+#~ msgid "OpenGL Original"
+#~ msgstr "OpenGL Original"
-#: backends/platform/bada/form.cpp:301
-msgid "Show Keypad"
-msgstr "Vis talltastatur"
+#~ msgid "Current display mode"
+#~ msgstr "Nåværende videomodus"
-#: backends/platform/bada/form.cpp:309
-msgid "Control Mouse"
-msgstr "Styr Mus"
+#~ msgid "Current scale"
+#~ msgstr "Nåværende skala"
-#: backends/events/maemosdl/maemosdl-events.cpp:192
-msgid "Clicking Enabled"
-msgstr "Klikking aktivert"
+#~ msgid "Active filter mode: Linear"
+#~ msgstr "Aktiv filtermodus: Linjær"
-#: backends/events/maemosdl/maemosdl-events.cpp:192
-msgid "Clicking Disabled"
-msgstr "Klikking deaktivert"
+#~ msgid "Active filter mode: Nearest"
+#~ msgstr "Aktiv filtermodus: Nærmeste"
#~ msgid "Enable Roland GS Mode"
#~ msgstr "Aktiver Roland GS-modus"
diff --git a/po/nn_NO.po b/po/nn_NO.po
index 2c09192d5c..ff5b51a093 100644
--- a/po/nn_NO.po
+++ b/po/nn_NO.po
@@ -1,5 +1,5 @@
# Norwegian (Nynorsk) translation for ScummVM.
-# Copyright (C) 2010-2013 ScummVM Team
+# Copyright (C) 2010-2014 ScummVM Team
# This file is distributed under the same license as the ScummVM package.
# Einar Johan T. Sømåen <einarjohants@gmail.com>, 2010.
#
@@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: ScummVM 1.3.0svn\n"
"Report-Msgid-Bugs-To: scummvm-devel@lists.sf.net\n"
-"POT-Creation-Date: 2013-04-24 13:35+0100\n"
+"POT-Creation-Date: 2014-06-07 23:06+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"
@@ -20,78 +20,78 @@ msgstr ""
"Plural-Forms: nplurals=2; plural=(n != 1)\n"
"X-Poedit-Country: NORWAY\n"
-#: gui/about.cpp:93
+#: gui/about.cpp:94
#, c-format
msgid "(built on %s)"
msgstr "(bygd den %s)"
-#: gui/about.cpp:100
+#: gui/about.cpp:101
msgid "Features compiled in:"
msgstr "Funksjonar innkompilert:"
-#: gui/about.cpp:109
+#: gui/about.cpp:110
msgid "Available engines:"
msgstr "Tilgjengelege motorar:"
-#: gui/browser.cpp:67
+#: gui/browser.cpp:68
#, fuzzy
msgid "Show hidden files"
msgstr "Vis / Skjul konsoll"
-#: gui/browser.cpp:67
+#: gui/browser.cpp:68
msgid "Show files marked with the hidden attribute"
msgstr ""
-#: gui/browser.cpp:71
+#: gui/browser.cpp:72
msgid "Go up"
msgstr "Gå tilbake"
-#: gui/browser.cpp:71 gui/browser.cpp:73
+#: gui/browser.cpp:72 gui/browser.cpp:74
msgid "Go to previous directory level"
msgstr "Gå til forrige mappenivå"
-#: gui/browser.cpp:73
+#: gui/browser.cpp:74
msgctxt "lowres"
msgid "Go up"
msgstr "Gå tilbake"
-#: gui/browser.cpp:74 gui/chooser.cpp:45 gui/KeysDialog.cpp:43
-#: gui/launcher.cpp:345 gui/massadd.cpp:94 gui/options.cpp:1238
-#: gui/saveload-dialog.cpp:215 gui/saveload-dialog.cpp:275
-#: gui/saveload-dialog.cpp:545 gui/saveload-dialog.cpp:919
-#: gui/themebrowser.cpp:54 gui/fluidsynth-dialog.cpp:151
-#: engines/engine.cpp:447 engines/drascula/saveload.cpp:51
-#: engines/scumm/dialogs.cpp:190 engines/sword1/control.cpp:865
-#: engines/parallaction/saveload.cpp:274 backends/platform/wii/options.cpp:48
-#: backends/events/default/default-events.cpp:193
-#: backends/events/default/default-events.cpp:215
+#: gui/browser.cpp:75 gui/chooser.cpp:46 gui/KeysDialog.cpp:43
+#: gui/launcher.cpp:351 gui/massadd.cpp:95 gui/options.cpp:1239
+#: gui/saveload-dialog.cpp:216 gui/saveload-dialog.cpp:276
+#: gui/saveload-dialog.cpp:547 gui/saveload-dialog.cpp:922
+#: gui/themebrowser.cpp:55 gui/fluidsynth-dialog.cpp:152
+#: engines/engine.cpp:452 backends/platform/wii/options.cpp:48
+#: backends/events/default/default-events.cpp:196
+#: backends/events/default/default-events.cpp:218
+#: engines/drascula/saveload.cpp:49 engines/parallaction/saveload.cpp:274
+#: engines/scumm/dialogs.cpp:191 engines/sword1/control.cpp:865
msgid "Cancel"
msgstr "Avbryt"
-#: gui/browser.cpp:75 gui/chooser.cpp:46 gui/themebrowser.cpp:55
+#: gui/browser.cpp:76 gui/chooser.cpp:47 gui/themebrowser.cpp:56
msgid "Choose"
msgstr "Vel"
-#: gui/gui-manager.cpp:115 engines/scumm/help.cpp:125
-#: engines/scumm/help.cpp:140 engines/scumm/help.cpp:165
-#: engines/scumm/help.cpp:191 engines/scumm/help.cpp:209
-#: backends/keymapper/remap-dialog.cpp:52
+#: gui/gui-manager.cpp:117 backends/keymapper/remap-dialog.cpp:53
+#: engines/scumm/help.cpp:125 engines/scumm/help.cpp:140
+#: engines/scumm/help.cpp:165 engines/scumm/help.cpp:191
+#: engines/scumm/help.cpp:209
msgid "Close"
msgstr "Steng"
-#: gui/gui-manager.cpp:118
+#: gui/gui-manager.cpp:120
msgid "Mouse click"
msgstr "Musklikk"
-#: gui/gui-manager.cpp:122 base/main.cpp:301
+#: gui/gui-manager.cpp:124 base/main.cpp:319
msgid "Display keyboard"
msgstr "Syn Tastatur"
-#: gui/gui-manager.cpp:126 base/main.cpp:305
+#: gui/gui-manager.cpp:128 base/main.cpp:323
msgid "Remap keys"
msgstr "Omkople tastar"
-#: gui/gui-manager.cpp:129 base/main.cpp:308
+#: gui/gui-manager.cpp:131 base/main.cpp:326
#, fuzzy
msgid "Toggle FullScreen"
msgstr "Veksle fullskjerm"
@@ -104,21 +104,21 @@ msgstr "Vel ei handling for kopling:"
msgid "Map"
msgstr "Kople"
-#: gui/KeysDialog.cpp:42 gui/launcher.cpp:346 gui/launcher.cpp:1001
-#: gui/launcher.cpp:1005 gui/massadd.cpp:91 gui/options.cpp:1239
-#: gui/saveload-dialog.cpp:920 gui/fluidsynth-dialog.cpp:152
-#: engines/engine.cpp:366 engines/engine.cpp:377
-#: engines/drascula/saveload.cpp:51 engines/scumm/dialogs.cpp:192
-#: engines/scumm/scumm.cpp:1778 engines/agos/animation.cpp:558
-#: engines/groovie/script.cpp:420 engines/sky/compact.cpp:131
-#: engines/sky/compact.cpp:141 engines/sword1/animation.cpp:519
-#: engines/sword1/animation.cpp:540 engines/sword1/animation.cpp:550
-#: engines/sword1/animation.cpp:557 engines/sword1/control.cpp:865
-#: engines/sword1/logic.cpp:1633 engines/sword2/animation.cpp:419
-#: engines/sword2/animation.cpp:439 engines/sword2/animation.cpp:449
-#: engines/sword2/animation.cpp:458 engines/parallaction/saveload.cpp:274
+#: gui/KeysDialog.cpp:42 gui/launcher.cpp:352 gui/launcher.cpp:1048
+#: gui/launcher.cpp:1052 gui/massadd.cpp:92 gui/options.cpp:1240
+#: gui/saveload-dialog.cpp:923 gui/fluidsynth-dialog.cpp:153
+#: engines/engine.cpp:371 engines/engine.cpp:382
#: backends/platform/wii/options.cpp:47
#: backends/platform/wince/CELauncherDialog.cpp:54
+#: engines/agos/animation.cpp:558 engines/drascula/saveload.cpp:49
+#: engines/groovie/script.cpp:399 engines/parallaction/saveload.cpp:274
+#: engines/scumm/dialogs.cpp:193 engines/scumm/scumm.cpp:1779
+#: engines/sky/compact.cpp:131 engines/sky/compact.cpp:141
+#: engines/sword1/animation.cpp:524 engines/sword1/animation.cpp:545
+#: engines/sword1/animation.cpp:561 engines/sword1/animation.cpp:569
+#: engines/sword1/control.cpp:865 engines/sword1/logic.cpp:1633
+#: engines/sword2/animation.cpp:425 engines/sword2/animation.cpp:445
+#: engines/sword2/animation.cpp:461 engines/sword2/animation.cpp:471
msgid "OK"
msgstr "OK"
@@ -144,15 +144,15 @@ msgstr "Vel ei handling"
msgid "Press the key to associate"
msgstr "Trykk tasten du vil kople"
-#: gui/launcher.cpp:187
+#: gui/launcher.cpp:193
msgid "Game"
msgstr "Spel"
-#: gui/launcher.cpp:191
+#: gui/launcher.cpp:197
msgid "ID:"
msgstr "ID:"
-#: gui/launcher.cpp:191 gui/launcher.cpp:193 gui/launcher.cpp:194
+#: gui/launcher.cpp:197 gui/launcher.cpp:199 gui/launcher.cpp:200
msgid ""
"Short game identifier used for referring to savegames and running the game "
"from the command line"
@@ -160,29 +160,29 @@ msgstr ""
"Kort spelidentifikator nytta for å referere til lagra spel, og å køyre "
"spelet frå kommandolinja"
-#: gui/launcher.cpp:193
+#: gui/launcher.cpp:199
msgctxt "lowres"
msgid "ID:"
msgstr "ID:"
-#: gui/launcher.cpp:198
+#: gui/launcher.cpp:204
msgid "Name:"
msgstr "Namn:"
-#: gui/launcher.cpp:198 gui/launcher.cpp:200 gui/launcher.cpp:201
+#: gui/launcher.cpp:204 gui/launcher.cpp:206 gui/launcher.cpp:207
msgid "Full title of the game"
msgstr "Full speltittel:"
-#: gui/launcher.cpp:200
+#: gui/launcher.cpp:206
msgctxt "lowres"
msgid "Name:"
msgstr "Namn:"
-#: gui/launcher.cpp:204
+#: gui/launcher.cpp:210
msgid "Language:"
msgstr "Språk:"
-#: gui/launcher.cpp:204 gui/launcher.cpp:205
+#: gui/launcher.cpp:210 gui/launcher.cpp:211
msgid ""
"Language of the game. This will not turn your Spanish game version into "
"English"
@@ -190,293 +190,295 @@ msgstr ""
"Spelets språk. Dette vil ikkje gjere den spanske versjonen av spelet til ein "
"engelsk versjon"
-#: gui/launcher.cpp:206 gui/launcher.cpp:220 gui/options.cpp:86
-#: gui/options.cpp:736 gui/options.cpp:749 gui/options.cpp:1209
-#: audio/null.cpp:40
+#: gui/launcher.cpp:212 gui/launcher.cpp:226 gui/options.cpp:87
+#: gui/options.cpp:737 gui/options.cpp:750 gui/options.cpp:1210
+#: audio/null.cpp:41
msgid "<default>"
msgstr "<standard>"
-#: gui/launcher.cpp:216
+#: gui/launcher.cpp:222
msgid "Platform:"
msgstr "Plattform:"
-#: gui/launcher.cpp:216 gui/launcher.cpp:218 gui/launcher.cpp:219
+#: gui/launcher.cpp:222 gui/launcher.cpp:224 gui/launcher.cpp:225
msgid "Platform the game was originally designed for"
msgstr "Plattform spelet opprineleg vart designa for"
-#: gui/launcher.cpp:218
+#: gui/launcher.cpp:224
msgctxt "lowres"
msgid "Platform:"
msgstr "Plattform:"
-#: gui/launcher.cpp:231
+#: gui/launcher.cpp:237
#, fuzzy
msgid "Engine"
msgstr "Undersøk"
-#: gui/launcher.cpp:239 gui/options.cpp:1072 gui/options.cpp:1089
+#: gui/launcher.cpp:245 gui/options.cpp:1073 gui/options.cpp:1090
msgid "Graphics"
msgstr "Grafikk"
-#: gui/launcher.cpp:239 gui/options.cpp:1072 gui/options.cpp:1089
+#: gui/launcher.cpp:245 gui/options.cpp:1073 gui/options.cpp:1090
msgid "GFX"
msgstr "GFX"
-#: gui/launcher.cpp:242
+#: gui/launcher.cpp:248
msgid "Override global graphic settings"
msgstr "Overstyr globale grafikkinstillingar"
-#: gui/launcher.cpp:244
+#: gui/launcher.cpp:250
msgctxt "lowres"
msgid "Override global graphic settings"
msgstr "Overstyr globale grafikkinstillingar"
-#: gui/launcher.cpp:251 gui/options.cpp:1095
+#: gui/launcher.cpp:257 gui/options.cpp:1096
msgid "Audio"
msgstr "Lyd"
-#: gui/launcher.cpp:254
+#: gui/launcher.cpp:260
msgid "Override global audio settings"
msgstr "Overstyr globale lydinstillingar"
-#: gui/launcher.cpp:256
+#: gui/launcher.cpp:262
msgctxt "lowres"
msgid "Override global audio settings"
msgstr "Overstyr globale lydinstillingar"
-#: gui/launcher.cpp:265 gui/options.cpp:1100
+#: gui/launcher.cpp:271 gui/options.cpp:1101
msgid "Volume"
msgstr "Volum"
-#: gui/launcher.cpp:267 gui/options.cpp:1102
+#: gui/launcher.cpp:273 gui/options.cpp:1103
msgctxt "lowres"
msgid "Volume"
msgstr "Volum"
-#: gui/launcher.cpp:270
+#: gui/launcher.cpp:276
msgid "Override global volume settings"
msgstr "Overstyr globale voluminstillingar"
-#: gui/launcher.cpp:272
+#: gui/launcher.cpp:278
msgctxt "lowres"
msgid "Override global volume settings"
msgstr "Overstyr globale voluminstillingar"
-#: gui/launcher.cpp:280 gui/options.cpp:1110
+#: gui/launcher.cpp:286 gui/options.cpp:1111
msgid "MIDI"
msgstr "MIDI"
-#: gui/launcher.cpp:283
+#: gui/launcher.cpp:289
msgid "Override global MIDI settings"
msgstr "Overstyr globale MIDI-instillingar"
-#: gui/launcher.cpp:285
+#: gui/launcher.cpp:291
msgctxt "lowres"
msgid "Override global MIDI settings"
msgstr "Overstyr globale MIDI-instillingar"
-#: gui/launcher.cpp:294 gui/options.cpp:1116
+#: gui/launcher.cpp:300 gui/options.cpp:1117
msgid "MT-32"
msgstr "MT-32"
-#: gui/launcher.cpp:297
+#: gui/launcher.cpp:303
msgid "Override global MT-32 settings"
msgstr "Overstyr globale MT-32-instillingar"
-#: gui/launcher.cpp:299
+#: gui/launcher.cpp:305
msgctxt "lowres"
msgid "Override global MT-32 settings"
msgstr "Overstyr globale MT-32-instillingar"
-#: gui/launcher.cpp:308 gui/options.cpp:1123
+#: gui/launcher.cpp:314 gui/options.cpp:1124
msgid "Paths"
msgstr "Stiar"
-#: gui/launcher.cpp:310 gui/options.cpp:1125
+#: gui/launcher.cpp:316 gui/options.cpp:1126
msgctxt "lowres"
msgid "Paths"
msgstr "Stiar"
-#: gui/launcher.cpp:317
+#: gui/launcher.cpp:323
msgid "Game Path:"
msgstr "Spelsti:"
-#: gui/launcher.cpp:319
+#: gui/launcher.cpp:325
msgctxt "lowres"
msgid "Game Path:"
msgstr "Spelsti:"
-#: gui/launcher.cpp:324 gui/options.cpp:1149
+#: gui/launcher.cpp:330 gui/options.cpp:1150
msgid "Extra Path:"
msgstr "Ekstrasti:"
-#: gui/launcher.cpp:324 gui/launcher.cpp:326 gui/launcher.cpp:327
+#: gui/launcher.cpp:330 gui/launcher.cpp:332 gui/launcher.cpp:333
msgid "Specifies path to additional data used the game"
msgstr ""
-#: gui/launcher.cpp:326 gui/options.cpp:1151
+#: gui/launcher.cpp:332 gui/options.cpp:1152
msgctxt "lowres"
msgid "Extra Path:"
msgstr "Ekstrasti:"
-#: gui/launcher.cpp:333 gui/options.cpp:1133
+#: gui/launcher.cpp:339 gui/options.cpp:1134
msgid "Save Path:"
msgstr "Lagringssti:"
-#: gui/launcher.cpp:333 gui/launcher.cpp:335 gui/launcher.cpp:336
-#: gui/options.cpp:1133 gui/options.cpp:1135 gui/options.cpp:1136
+#: gui/launcher.cpp:339 gui/launcher.cpp:341 gui/launcher.cpp:342
+#: gui/options.cpp:1134 gui/options.cpp:1136 gui/options.cpp:1137
msgid "Specifies where your savegames are put"
msgstr ""
-#: gui/launcher.cpp:335 gui/options.cpp:1135
+#: gui/launcher.cpp:341 gui/options.cpp:1136
msgctxt "lowres"
msgid "Save Path:"
msgstr "Lagringssti:"
-#: gui/launcher.cpp:354 gui/launcher.cpp:453 gui/launcher.cpp:511
-#: gui/launcher.cpp:565 gui/options.cpp:1144 gui/options.cpp:1152
-#: gui/options.cpp:1161 gui/options.cpp:1276 gui/options.cpp:1282
-#: gui/options.cpp:1290 gui/options.cpp:1320 gui/options.cpp:1326
-#: gui/options.cpp:1333 gui/options.cpp:1426 gui/options.cpp:1429
-#: gui/options.cpp:1441
+#: gui/launcher.cpp:360 gui/launcher.cpp:459 gui/launcher.cpp:517
+#: gui/launcher.cpp:571 gui/options.cpp:1145 gui/options.cpp:1153
+#: gui/options.cpp:1162 gui/options.cpp:1277 gui/options.cpp:1283
+#: gui/options.cpp:1291 gui/options.cpp:1321 gui/options.cpp:1327
+#: gui/options.cpp:1334 gui/options.cpp:1427 gui/options.cpp:1430
+#: gui/options.cpp:1442
msgctxt "path"
msgid "None"
msgstr "Ingen"
-#: gui/launcher.cpp:359 gui/launcher.cpp:459 gui/launcher.cpp:569
-#: gui/options.cpp:1270 gui/options.cpp:1314 gui/options.cpp:1432
+#: gui/launcher.cpp:365 gui/launcher.cpp:465 gui/launcher.cpp:575
+#: gui/options.cpp:1271 gui/options.cpp:1315 gui/options.cpp:1433
#: backends/platform/wii/options.cpp:56
msgid "Default"
msgstr "Standard"
-#: gui/launcher.cpp:504 gui/options.cpp:1435
+#: gui/launcher.cpp:510 gui/options.cpp:1436
msgid "Select SoundFont"
msgstr "Vel SoundFont"
-#: gui/launcher.cpp:523 gui/launcher.cpp:677
+#: gui/launcher.cpp:529 gui/launcher.cpp:682
msgid "Select directory with game data"
msgstr "Vel mappe med speldata"
-#: gui/launcher.cpp:541
+#: gui/launcher.cpp:547
msgid "Select additional game directory"
msgstr ""
-#: gui/launcher.cpp:553
+#: gui/launcher.cpp:559
msgid "Select directory for saved games"
msgstr "Vel mappe for lagra spel"
-#: gui/launcher.cpp:580
+#: gui/launcher.cpp:586
msgid "This game ID is already taken. Please choose another one."
msgstr ""
-#: gui/launcher.cpp:621 engines/dialogs.cpp:110
+#: gui/launcher.cpp:626 engines/dialogs.cpp:111
msgid "~Q~uit"
msgstr "~A~vslutt"
-#: gui/launcher.cpp:621 backends/platform/sdl/macosx/appmenu_osx.mm:95
+#: gui/launcher.cpp:626 backends/platform/sdl/macosx/appmenu_osx.mm:95
msgid "Quit ScummVM"
msgstr "Avslutt ScummVM"
-#: gui/launcher.cpp:622
+#: gui/launcher.cpp:627
msgid "A~b~out..."
msgstr "~O~m..."
-#: gui/launcher.cpp:622 backends/platform/sdl/macosx/appmenu_osx.mm:69
+#: gui/launcher.cpp:627 backends/platform/sdl/macosx/appmenu_osx.mm:69
msgid "About ScummVM"
msgstr "Om ScummVM"
-#: gui/launcher.cpp:623
+#: gui/launcher.cpp:628
msgid "~O~ptions..."
msgstr "~V~al..."
-#: gui/launcher.cpp:623
+#: gui/launcher.cpp:628
msgid "Change global ScummVM options"
msgstr "Endre globale ScummVM-instillingar"
-#: gui/launcher.cpp:625
+#: gui/launcher.cpp:630
msgid "~S~tart"
msgstr "~S~tart"
-#: gui/launcher.cpp:625
+#: gui/launcher.cpp:630
msgid "Start selected game"
msgstr "Start det velde spelet"
-#: gui/launcher.cpp:628
+#: gui/launcher.cpp:633
msgid "~L~oad..."
msgstr "~Å~pne..."
-#: gui/launcher.cpp:628
+#: gui/launcher.cpp:633
msgid "Load savegame for selected game"
msgstr "Åpne eit lagra spel for the velde spelet"
-#: gui/launcher.cpp:633 gui/launcher.cpp:1120
+#: gui/launcher.cpp:638
msgid "~A~dd Game..."
msgstr "~L~egg til spel..."
-#: gui/launcher.cpp:633 gui/launcher.cpp:640
+#: gui/launcher.cpp:638 gui/launcher.cpp:645
msgid "Hold Shift for Mass Add"
msgstr "Hold Shift nede for å legge til fleire"
-#: gui/launcher.cpp:635
+#: gui/launcher.cpp:640
msgid "~E~dit Game..."
msgstr "~R~ediger spel..."
-#: gui/launcher.cpp:635 gui/launcher.cpp:642
+#: gui/launcher.cpp:640 gui/launcher.cpp:647
msgid "Change game options"
msgstr "Endre spelinstillingar"
-#: gui/launcher.cpp:637
+#: gui/launcher.cpp:642
msgid "~R~emove Game"
msgstr "~F~jern spel"
-#: gui/launcher.cpp:637 gui/launcher.cpp:644
+#: gui/launcher.cpp:642 gui/launcher.cpp:649
msgid "Remove game from the list. The game data files stay intact"
msgstr ""
-#: gui/launcher.cpp:640 gui/launcher.cpp:1120
+#: gui/launcher.cpp:645
msgctxt "lowres"
msgid "~A~dd Game..."
msgstr "~L~egg til spel..."
-#: gui/launcher.cpp:642
+#: gui/launcher.cpp:647
msgctxt "lowres"
msgid "~E~dit Game..."
msgstr "~R~ediger spel..."
-#: gui/launcher.cpp:644
+#: gui/launcher.cpp:649
msgctxt "lowres"
msgid "~R~emove Game"
msgstr "~F~jern spel"
-#: gui/launcher.cpp:652
+#: gui/launcher.cpp:657
msgid "Search in game list"
msgstr "Søk i spelliste"
-#: gui/launcher.cpp:656 gui/launcher.cpp:1167
+#: gui/launcher.cpp:661 gui/launcher.cpp:1222
msgid "Search:"
msgstr "Søk:"
-#: gui/launcher.cpp:680 engines/dialogs.cpp:114 engines/mohawk/myst.cpp:245
-#: engines/mohawk/riven.cpp:716 engines/cruise/menu.cpp:214
-#: engines/pegasus/pegasus.cpp:349
+#: gui/launcher.cpp:685 engines/dialogs.cpp:115 engines/cruise/menu.cpp:214
+#: engines/mohawk/myst.cpp:245 engines/mohawk/riven.cpp:718
+#: engines/pegasus/pegasus.cpp:353
msgid "Load game:"
msgstr "Åpne spel:"
-#: gui/launcher.cpp:680 engines/dialogs.cpp:114 engines/scumm/dialogs.cpp:188
-#: engines/mohawk/myst.cpp:245 engines/mohawk/riven.cpp:716
-#: engines/cruise/menu.cpp:214 engines/pegasus/pegasus.cpp:349
+#: gui/launcher.cpp:685 engines/dialogs.cpp:115
#: backends/platform/wince/CEActionsPocket.cpp:267
#: backends/platform/wince/CEActionsSmartphone.cpp:231
+#: engines/cruise/menu.cpp:214 engines/mohawk/myst.cpp:245
+#: engines/mohawk/riven.cpp:718 engines/pegasus/pegasus.cpp:353
+#: engines/scumm/dialogs.cpp:189
msgid "Load"
msgstr "Åpne"
-#: gui/launcher.cpp:788
+#: gui/launcher.cpp:792
msgid ""
"Do you really want to run the mass game detector? This could potentially add "
"a huge number of games."
msgstr ""
-#: gui/launcher.cpp:789 gui/launcher.cpp:937 gui/fluidsynth-dialog.cpp:216
+#: gui/launcher.cpp:793 gui/launcher.cpp:941 gui/launcher.cpp:1000
+#: gui/fluidsynth-dialog.cpp:217
#: backends/events/symbiansdl/symbiansdl-events.cpp:184
#: backends/platform/wince/CEActionsPocket.cpp:326
#: backends/platform/wince/CEActionsSmartphone.cpp:287
@@ -484,7 +486,8 @@ msgstr ""
msgid "Yes"
msgstr "Ja"
-#: gui/launcher.cpp:789 gui/launcher.cpp:937 gui/fluidsynth-dialog.cpp:216
+#: gui/launcher.cpp:793 gui/launcher.cpp:941 gui/launcher.cpp:1000
+#: gui/fluidsynth-dialog.cpp:217
#: backends/events/symbiansdl/symbiansdl-events.cpp:184
#: backends/platform/wince/CEActionsPocket.cpp:326
#: backends/platform/wince/CEActionsSmartphone.cpp:287
@@ -492,191 +495,186 @@ msgstr "Ja"
msgid "No"
msgstr "Nei"
-#: gui/launcher.cpp:837
+#: gui/launcher.cpp:841
msgid "ScummVM couldn't open the specified directory!"
msgstr "ScummVM kunne ikkje åpne den velde mappa!"
-#: gui/launcher.cpp:849
+#: gui/launcher.cpp:853
msgid "ScummVM could not find any game in the specified directory!"
msgstr "ScummVM kunne ikkje finne noko spel i den velde mappa!"
-#: gui/launcher.cpp:863
+#: gui/launcher.cpp:867
msgid "Pick the game:"
msgstr "Vel spelet:"
-#: gui/launcher.cpp:937
+#: gui/launcher.cpp:941
msgid "Do you really want to remove this game configuration?"
msgstr "Vil du verkeleg fjerne denne spelkonfigurasjonen?"
-#: gui/launcher.cpp:1001
+#: gui/launcher.cpp:999
+#, fuzzy
+msgid "Do you want to load savegame?"
+msgstr "Vil du åpne eller lagre spelet?"
+
+#: gui/launcher.cpp:1048
msgid "This game does not support loading games from the launcher."
msgstr "Dette spelet støttar ikkje åpning av lagra spel frå oppstartaren."
-#: gui/launcher.cpp:1005
+#: gui/launcher.cpp:1052
msgid "ScummVM could not find any engine capable of running the selected game!"
msgstr ""
"ScummVM kunne ikkje finne nokon motor som var i stand til å køyre det velde "
"spelet!"
-#: gui/launcher.cpp:1119
-msgctxt "lowres"
-msgid "Mass Add..."
-msgstr "Legg til fleire..."
-
-#: gui/launcher.cpp:1119
-msgid "Mass Add..."
-msgstr "Legg til fleire..."
-
-#: gui/massadd.cpp:78 gui/massadd.cpp:81
+#: gui/massadd.cpp:79 gui/massadd.cpp:82
msgid "... progress ..."
msgstr "... fremdrift ..."
-#: gui/massadd.cpp:258
+#: gui/massadd.cpp:259
msgid "Scan complete!"
msgstr "Søk fullført!"
-#: gui/massadd.cpp:261
+#: gui/massadd.cpp:262
#, c-format
msgid "Discovered %d new games, ignored %d previously added games."
msgstr ""
-#: gui/massadd.cpp:265
+#: gui/massadd.cpp:266
#, c-format
msgid "Scanned %d directories ..."
msgstr "Søkt i %d mappar ..."
-#: gui/massadd.cpp:268
+#: gui/massadd.cpp:269
#, fuzzy, c-format
msgid "Discovered %d new games, ignored %d previously added games ..."
msgstr "Oppdaga %d nye spel ..."
-#: gui/options.cpp:84
+#: gui/options.cpp:85
msgid "Never"
msgstr "Aldri"
-#: gui/options.cpp:84
+#: gui/options.cpp:85
msgid "every 5 mins"
msgstr "kvart 5. min"
-#: gui/options.cpp:84
+#: gui/options.cpp:85
msgid "every 10 mins"
msgstr "kvart 10. min"
-#: gui/options.cpp:84
+#: gui/options.cpp:85
msgid "every 15 mins"
msgstr "kvart 15. min"
-#: gui/options.cpp:84
+#: gui/options.cpp:85
msgid "every 30 mins"
msgstr "kvart 30. min"
-#: gui/options.cpp:86
+#: gui/options.cpp:87
msgid "8 kHz"
msgstr "8 kHz"
-#: gui/options.cpp:86
+#: gui/options.cpp:87
msgid "11kHz"
msgstr "11kHz"
-#: gui/options.cpp:86
+#: gui/options.cpp:87
msgid "22 kHz"
msgstr "22 kHz"
-#: gui/options.cpp:86
+#: gui/options.cpp:87
msgid "44 kHz"
msgstr "44 kHz"
-#: gui/options.cpp:86
+#: gui/options.cpp:87
msgid "48 kHz"
msgstr "48 kHz"
-#: gui/options.cpp:254 gui/options.cpp:480 gui/options.cpp:581
-#: gui/options.cpp:650 gui/options.cpp:858
+#: gui/options.cpp:255 gui/options.cpp:481 gui/options.cpp:582
+#: gui/options.cpp:651 gui/options.cpp:859
msgctxt "soundfont"
msgid "None"
msgstr "Ingen"
-#: gui/options.cpp:388
+#: gui/options.cpp:389
msgid "Failed to apply some of the graphic options changes:"
msgstr ""
-#: gui/options.cpp:400
+#: gui/options.cpp:401
msgid "the video mode could not be changed."
msgstr ""
-#: gui/options.cpp:406
+#: gui/options.cpp:407
msgid "the fullscreen setting could not be changed"
msgstr ""
-#: gui/options.cpp:412
+#: gui/options.cpp:413
msgid "the aspect ratio setting could not be changed"
msgstr ""
-#: gui/options.cpp:733
+#: gui/options.cpp:734
msgid "Graphics mode:"
msgstr "Grafikkmodus:"
-#: gui/options.cpp:747
+#: gui/options.cpp:748
msgid "Render mode:"
msgstr "Teiknemodus:"
-#: gui/options.cpp:747 gui/options.cpp:748
+#: gui/options.cpp:748 gui/options.cpp:749
msgid "Special dithering modes supported by some games"
msgstr "Spesielle dithering-modus som støttast av nokre spel"
-#: gui/options.cpp:759
-#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2236
-#: backends/graphics/openglsdl/openglsdl-graphics.cpp:476
+#: gui/options.cpp:760
+#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2249
msgid "Fullscreen mode"
msgstr "Fullskjermsmodus"
-#: gui/options.cpp:762
+#: gui/options.cpp:763
msgid "Aspect ratio correction"
msgstr "Aspekt-korrigering"
-#: gui/options.cpp:762
+#: gui/options.cpp:763
msgid "Correct aspect ratio for 320x200 games"
msgstr "Rett opp aspekt for 320x200 spel"
-#: gui/options.cpp:770
+#: gui/options.cpp:771
msgid "Preferred Device:"
msgstr "Føretrukken eining:"
-#: gui/options.cpp:770
+#: gui/options.cpp:771
msgid "Music Device:"
msgstr ""
-#: gui/options.cpp:770 gui/options.cpp:772
+#: gui/options.cpp:771 gui/options.cpp:773
msgid "Specifies preferred sound device or sound card emulator"
msgstr ""
-#: gui/options.cpp:770 gui/options.cpp:772 gui/options.cpp:773
+#: gui/options.cpp:771 gui/options.cpp:773 gui/options.cpp:774
msgid "Specifies output sound device or sound card emulator"
msgstr ""
-#: gui/options.cpp:772
+#: gui/options.cpp:773
msgctxt "lowres"
msgid "Preferred Dev.:"
msgstr ""
-#: gui/options.cpp:772
+#: gui/options.cpp:773
msgctxt "lowres"
msgid "Music Device:"
msgstr ""
-#: gui/options.cpp:799
+#: gui/options.cpp:800
msgid "AdLib emulator:"
msgstr "AdLib emulator:"
-#: gui/options.cpp:799 gui/options.cpp:800
+#: gui/options.cpp:800 gui/options.cpp:801
msgid "AdLib is used for music in many games"
msgstr "AdLib nyttast til musikk i mange spel"
-#: gui/options.cpp:810
+#: gui/options.cpp:811
msgid "Output rate:"
msgstr ""
-#: gui/options.cpp:810 gui/options.cpp:811
+#: gui/options.cpp:811 gui/options.cpp:812
msgid ""
"Higher value specifies better sound quality but may be not supported by your "
"soundcard"
@@ -684,255 +682,257 @@ msgstr ""
"Høgare verdier gir betre lydkvalitet, men støttast kanskje ikkje av "
"lydkortet ditt"
-#: gui/options.cpp:821
+#: gui/options.cpp:822
msgid "GM Device:"
msgstr ""
-#: gui/options.cpp:821
+#: gui/options.cpp:822
msgid "Specifies default sound device for General MIDI output"
msgstr ""
-#: gui/options.cpp:832
+#: gui/options.cpp:833
msgid "Don't use General MIDI music"
msgstr "Ikkje nytt General MIDI musikk"
-#: gui/options.cpp:843 gui/options.cpp:909
+#: gui/options.cpp:844 gui/options.cpp:910
msgid "Use first available device"
msgstr ""
-#: gui/options.cpp:855
+#: gui/options.cpp:856
msgid "SoundFont:"
msgstr "SoundFont:"
-#: gui/options.cpp:855 gui/options.cpp:857 gui/options.cpp:858
+#: gui/options.cpp:856 gui/options.cpp:858 gui/options.cpp:859
msgid "SoundFont is supported by some audio cards, Fluidsynth and Timidity"
msgstr "SoundFont støttast av enkelte lydkort, Fluidsynth og Timidity"
-#: gui/options.cpp:857
+#: gui/options.cpp:858
msgctxt "lowres"
msgid "SoundFont:"
msgstr "SoundFont:"
-#: gui/options.cpp:863
+#: gui/options.cpp:864
msgid "Mixed AdLib/MIDI mode"
msgstr "Blanda AdLib/MIDI-modus"
-#: gui/options.cpp:863
+#: gui/options.cpp:864
msgid "Use both MIDI and AdLib sound generation"
msgstr "Nytt båe MIDI og AdLib lydskaping"
-#: gui/options.cpp:866
+#: gui/options.cpp:867
msgid "MIDI gain:"
msgstr "MIDI gain:"
-#: gui/options.cpp:873
+#: gui/options.cpp:874
msgid "FluidSynth Settings"
msgstr ""
-#: gui/options.cpp:880
+#: gui/options.cpp:881
msgid "MT-32 Device:"
msgstr ""
-#: gui/options.cpp:880
+#: gui/options.cpp:881
msgid "Specifies default sound device for Roland MT-32/LAPC1/CM32l/CM64 output"
msgstr ""
-#: gui/options.cpp:885
+#: gui/options.cpp:886
msgid "True Roland MT-32 (disable GM emulation)"
msgstr "Ekte Roland MT-32 (deaktiver GM-emulering)"
-#: gui/options.cpp:885 gui/options.cpp:887
+#: gui/options.cpp:886 gui/options.cpp:888
msgid ""
"Check if you want to use your real hardware Roland-compatible sound device "
"connected to your computer"
msgstr ""
-#: gui/options.cpp:887
+#: gui/options.cpp:888
msgctxt "lowres"
msgid "True Roland MT-32 (no GM emulation)"
msgstr "Ekte Roland MT-32 (ingen GS-emulering)"
-#: gui/options.cpp:890
+#: gui/options.cpp:891
#, fuzzy
-msgid "Roland GS Mode (disable GM mapping)"
+msgid "Roland GS Device (enable MT-32 mappings)"
msgstr "Ekte Roland MT-32 (deaktiver GM-emulering)"
-#: gui/options.cpp:890
-msgid "Turns off General MIDI mapping for games with Roland MT-32 soundtrack"
-msgstr "Slår av General MIDI-kopling for spel med Roland MT-32 lydspor"
+#: gui/options.cpp:891
+msgid ""
+"Check if you want to enable patch mappings to emulate an MT-32 on a Roland "
+"GS device"
+msgstr ""
-#: gui/options.cpp:899
+#: gui/options.cpp:900
msgid "Don't use Roland MT-32 music"
msgstr "Ikkje nytt Roland MT-32 musikk"
-#: gui/options.cpp:926
+#: gui/options.cpp:927
msgid "Text and Speech:"
msgstr "Tekst og Tale:"
-#: gui/options.cpp:930 gui/options.cpp:940
+#: gui/options.cpp:931 gui/options.cpp:941
msgid "Speech"
msgstr "Tale"
-#: gui/options.cpp:931 gui/options.cpp:941
+#: gui/options.cpp:932 gui/options.cpp:942
msgid "Subtitles"
msgstr "Teksting"
-#: gui/options.cpp:932
+#: gui/options.cpp:933
msgid "Both"
msgstr "Begge"
-#: gui/options.cpp:934
+#: gui/options.cpp:935
msgid "Subtitle speed:"
msgstr "Undertekstfart:"
-#: gui/options.cpp:936
+#: gui/options.cpp:937
msgctxt "lowres"
msgid "Text and Speech:"
msgstr "Tekst og Tale:"
-#: gui/options.cpp:940
+#: gui/options.cpp:941
msgid "Spch"
msgstr "Tale"
-#: gui/options.cpp:941
+#: gui/options.cpp:942
msgid "Subs"
msgstr "Tekst"
-#: gui/options.cpp:942
+#: gui/options.cpp:943
msgctxt "lowres"
msgid "Both"
msgstr "Båe"
-#: gui/options.cpp:942
+#: gui/options.cpp:943
msgid "Show subtitles and play speech"
msgstr "Vis teksting og spel av tale"
-#: gui/options.cpp:944
+#: gui/options.cpp:945
msgctxt "lowres"
msgid "Subtitle speed:"
msgstr "Undertekstfart:"
-#: gui/options.cpp:960
+#: gui/options.cpp:961
msgid "Music volume:"
msgstr "Musikkvolum:"
-#: gui/options.cpp:962
+#: gui/options.cpp:963
msgctxt "lowres"
msgid "Music volume:"
msgstr "Musikkvolum:"
-#: gui/options.cpp:969
+#: gui/options.cpp:970
msgid "Mute All"
msgstr "Demp alle"
-#: gui/options.cpp:972
+#: gui/options.cpp:973
msgid "SFX volume:"
msgstr "Lydeffektvolum:"
-#: gui/options.cpp:972 gui/options.cpp:974 gui/options.cpp:975
+#: gui/options.cpp:973 gui/options.cpp:975 gui/options.cpp:976
msgid "Special sound effects volume"
msgstr ""
-#: gui/options.cpp:974
+#: gui/options.cpp:975
msgctxt "lowres"
msgid "SFX volume:"
msgstr "Lydeffektvolum:"
-#: gui/options.cpp:982
+#: gui/options.cpp:983
msgid "Speech volume:"
msgstr "Talevolum:"
-#: gui/options.cpp:984
+#: gui/options.cpp:985
msgctxt "lowres"
msgid "Speech volume:"
msgstr "Talevolum:"
-#: gui/options.cpp:1141
+#: gui/options.cpp:1142
msgid "Theme Path:"
msgstr "Temasti:"
-#: gui/options.cpp:1143
+#: gui/options.cpp:1144
msgctxt "lowres"
msgid "Theme Path:"
msgstr "Temasti:"
-#: gui/options.cpp:1149 gui/options.cpp:1151 gui/options.cpp:1152
+#: gui/options.cpp:1150 gui/options.cpp:1152 gui/options.cpp:1153
msgid "Specifies path to additional data used by all games or ScummVM"
msgstr ""
-#: gui/options.cpp:1158
+#: gui/options.cpp:1159
msgid "Plugins Path:"
msgstr "Pluginsti:"
-#: gui/options.cpp:1160
+#: gui/options.cpp:1161
msgctxt "lowres"
msgid "Plugins Path:"
msgstr "Pluginsti:"
-#: gui/options.cpp:1169 gui/fluidsynth-dialog.cpp:137
+#: gui/options.cpp:1170 gui/fluidsynth-dialog.cpp:138
msgid "Misc"
msgstr "Div"
-#: gui/options.cpp:1171
+#: gui/options.cpp:1172
msgctxt "lowres"
msgid "Misc"
msgstr "Div"
-#: gui/options.cpp:1173
+#: gui/options.cpp:1174
msgid "Theme:"
msgstr "Tema:"
-#: gui/options.cpp:1177
+#: gui/options.cpp:1178
msgid "GUI Renderer:"
msgstr "GUI-teiknar:"
-#: gui/options.cpp:1189
+#: gui/options.cpp:1190
msgid "Autosave:"
msgstr "Autolagre:"
-#: gui/options.cpp:1191
+#: gui/options.cpp:1192
msgctxt "lowres"
msgid "Autosave:"
msgstr "Autolagre:"
-#: gui/options.cpp:1199
+#: gui/options.cpp:1200
msgid "Keys"
msgstr "Tastar"
-#: gui/options.cpp:1206
+#: gui/options.cpp:1207
msgid "GUI Language:"
msgstr "GUI-språk:"
-#: gui/options.cpp:1206
+#: gui/options.cpp:1207
msgid "Language of ScummVM GUI"
msgstr "Språk i ScummVM-GUIet"
-#: gui/options.cpp:1365
+#: gui/options.cpp:1366
#, fuzzy
msgid "You have to restart ScummVM before your changes will take effect."
msgstr "Du må omstarte ScummVM for at endringane skal skje."
-#: gui/options.cpp:1378
+#: gui/options.cpp:1379
msgid "Select directory for savegames"
msgstr "Vel mappe for lagra spel"
-#: gui/options.cpp:1385
+#: gui/options.cpp:1386
msgid "The chosen directory cannot be written to. Please select another one."
msgstr "Den velde mappa kan ikkje skrivast til. Vennlegst vel ein annan."
-#: gui/options.cpp:1394
+#: gui/options.cpp:1395
msgid "Select directory for GUI themes"
msgstr "Vel ei mappe for GUI-tema:"
-#: gui/options.cpp:1404
+#: gui/options.cpp:1405
msgid "Select directory for extra files"
msgstr "Vel ei mappe for ekstra filer"
-#: gui/options.cpp:1415
+#: gui/options.cpp:1416
msgid "Select directory for plugins"
msgstr "Vel ei mappe for plugins"
-#: gui/options.cpp:1468
+#: gui/options.cpp:1469
msgid ""
"The theme you selected does not support your current language. If you want "
"to use this theme you need to switch to another language first."
@@ -940,229 +940,233 @@ msgstr ""
"Temaet du har valt støttar ikkje det aktive språket. Om du vil nytte dette "
"temaet må du bytte til eit anna språk først."
-#: gui/saveload-dialog.cpp:166
+#: gui/saveload-dialog.cpp:167
msgid "List view"
msgstr ""
-#: gui/saveload-dialog.cpp:167
+#: gui/saveload-dialog.cpp:168
msgid "Grid view"
msgstr ""
-#: gui/saveload-dialog.cpp:210 gui/saveload-dialog.cpp:358
+#: gui/saveload-dialog.cpp:211 gui/saveload-dialog.cpp:360
msgid "No date saved"
msgstr "Ingen dato lagra"
-#: gui/saveload-dialog.cpp:211 gui/saveload-dialog.cpp:359
+#: gui/saveload-dialog.cpp:212 gui/saveload-dialog.cpp:361
msgid "No time saved"
msgstr "Inga tid lagra"
-#: gui/saveload-dialog.cpp:212 gui/saveload-dialog.cpp:360
+#: gui/saveload-dialog.cpp:213 gui/saveload-dialog.cpp:362
msgid "No playtime saved"
msgstr "Inga speletid lagra"
-#: gui/saveload-dialog.cpp:219 gui/saveload-dialog.cpp:275
+#: gui/saveload-dialog.cpp:220 gui/saveload-dialog.cpp:276
msgid "Delete"
msgstr "Slett"
-#: gui/saveload-dialog.cpp:274
+#: gui/saveload-dialog.cpp:275
msgid "Do you really want to delete this savegame?"
msgstr "Vil du verkeleg slette det lagra spelet?"
-#: gui/saveload-dialog.cpp:383 gui/saveload-dialog.cpp:872
+#: gui/saveload-dialog.cpp:385 gui/saveload-dialog.cpp:875
msgid "Date: "
msgstr "Dato: "
-#: gui/saveload-dialog.cpp:387 gui/saveload-dialog.cpp:878
+#: gui/saveload-dialog.cpp:389 gui/saveload-dialog.cpp:881
msgid "Time: "
msgstr "Tid: "
-#: gui/saveload-dialog.cpp:393 gui/saveload-dialog.cpp:886
+#: gui/saveload-dialog.cpp:395 gui/saveload-dialog.cpp:889
msgid "Playtime: "
msgstr "Speletid: "
-#: gui/saveload-dialog.cpp:406 gui/saveload-dialog.cpp:494
+#: gui/saveload-dialog.cpp:408 gui/saveload-dialog.cpp:496
msgid "Untitled savestate"
msgstr "Ikkje navngjeven speltilstand"
-#: gui/saveload-dialog.cpp:546
+#: gui/saveload-dialog.cpp:548
msgid "Next"
msgstr ""
-#: gui/saveload-dialog.cpp:549
+#: gui/saveload-dialog.cpp:551
msgid "Prev"
msgstr ""
-#: gui/saveload-dialog.cpp:736
+#: gui/saveload-dialog.cpp:739
#, fuzzy
msgid "New Save"
msgstr "Lagre"
-#: gui/saveload-dialog.cpp:736
+#: gui/saveload-dialog.cpp:739
#, fuzzy
msgid "Create a new save game"
msgstr "Full speltittel:"
-#: gui/saveload-dialog.cpp:865
+#: gui/saveload-dialog.cpp:868
#, fuzzy
msgid "Name: "
msgstr "Namn:"
-#: gui/saveload-dialog.cpp:937
+#: gui/saveload-dialog.cpp:940
#, c-format
msgid "Enter a description for slot %d:"
msgstr ""
-#: gui/themebrowser.cpp:44
+#: gui/themebrowser.cpp:45
msgid "Select a Theme"
msgstr "Vel eit tema"
-#: gui/ThemeEngine.cpp:337
+#: gui/ThemeEngine.cpp:347
msgid "Disabled GFX"
msgstr "Deaktivert GFX"
-#: gui/ThemeEngine.cpp:337
+#: gui/ThemeEngine.cpp:347
msgctxt "lowres"
msgid "Disabled GFX"
msgstr "Deaktivert GFX"
-#: gui/ThemeEngine.cpp:338
-msgid "Standard Renderer (16bpp)"
+#: gui/ThemeEngine.cpp:348
+#, fuzzy
+msgid "Standard Renderer"
msgstr "Standard Teiknar (16bpp)"
-#: gui/ThemeEngine.cpp:338
-msgid "Standard (16bpp)"
+#: gui/ThemeEngine.cpp:348 engines/scumm/dialogs.cpp:659
+#, fuzzy
+msgid "Standard"
msgstr "Standard (16bpp)"
-#: gui/ThemeEngine.cpp:340
-msgid "Antialiased Renderer (16bpp)"
+#: gui/ThemeEngine.cpp:350
+#, fuzzy
+msgid "Antialiased Renderer"
msgstr "Antialiased Teiknar (16bpp)"
-#: gui/ThemeEngine.cpp:340
-msgid "Antialiased (16bpp)"
+#: gui/ThemeEngine.cpp:350
+#, fuzzy
+msgid "Antialiased"
msgstr "Antialiased (16bpp)"
-#: gui/widget.cpp:322 gui/widget.cpp:324 gui/widget.cpp:330 gui/widget.cpp:332
+#: gui/widget.cpp:323 gui/widget.cpp:325 gui/widget.cpp:331 gui/widget.cpp:333
msgid "Clear value"
msgstr "Tøm verdi"
-#: gui/fluidsynth-dialog.cpp:67
+#: gui/fluidsynth-dialog.cpp:68
#, fuzzy
msgid "Reverb"
msgstr "Aldri"
-#: gui/fluidsynth-dialog.cpp:69 gui/fluidsynth-dialog.cpp:101
+#: gui/fluidsynth-dialog.cpp:70 gui/fluidsynth-dialog.cpp:102
#, fuzzy
msgid "Active"
msgstr " (Aktivt)"
-#: gui/fluidsynth-dialog.cpp:71
+#: gui/fluidsynth-dialog.cpp:72
msgid "Room:"
msgstr ""
-#: gui/fluidsynth-dialog.cpp:78
+#: gui/fluidsynth-dialog.cpp:79
msgid "Damp:"
msgstr ""
-#: gui/fluidsynth-dialog.cpp:85
+#: gui/fluidsynth-dialog.cpp:86
msgid "Width:"
msgstr ""
-#: gui/fluidsynth-dialog.cpp:92 gui/fluidsynth-dialog.cpp:110
+#: gui/fluidsynth-dialog.cpp:93 gui/fluidsynth-dialog.cpp:111
msgid "Level:"
msgstr ""
-#: gui/fluidsynth-dialog.cpp:99
+#: gui/fluidsynth-dialog.cpp:100
msgid "Chorus"
msgstr ""
-#: gui/fluidsynth-dialog.cpp:103
+#: gui/fluidsynth-dialog.cpp:104
msgid "N:"
msgstr ""
-#: gui/fluidsynth-dialog.cpp:117
+#: gui/fluidsynth-dialog.cpp:118
#, fuzzy
msgid "Speed:"
msgstr "Tale"
-#: gui/fluidsynth-dialog.cpp:124
+#: gui/fluidsynth-dialog.cpp:125
msgid "Depth:"
msgstr ""
-#: gui/fluidsynth-dialog.cpp:131
+#: gui/fluidsynth-dialog.cpp:132
msgid "Type:"
msgstr ""
-#: gui/fluidsynth-dialog.cpp:134
+#: gui/fluidsynth-dialog.cpp:135
msgid "Sine"
msgstr ""
-#: gui/fluidsynth-dialog.cpp:135
+#: gui/fluidsynth-dialog.cpp:136
msgid "Triangle"
msgstr ""
-#: gui/fluidsynth-dialog.cpp:139
+#: gui/fluidsynth-dialog.cpp:140
msgid "Interpolation:"
msgstr ""
-#: gui/fluidsynth-dialog.cpp:142
+#: gui/fluidsynth-dialog.cpp:143
msgid "None (fastest)"
msgstr ""
-#: gui/fluidsynth-dialog.cpp:143
+#: gui/fluidsynth-dialog.cpp:144
msgid "Linear"
msgstr ""
-#: gui/fluidsynth-dialog.cpp:144
+#: gui/fluidsynth-dialog.cpp:145
msgid "Fourth-order"
msgstr ""
-#: gui/fluidsynth-dialog.cpp:145
+#: gui/fluidsynth-dialog.cpp:146
msgid "Seventh-order"
msgstr ""
-#: gui/fluidsynth-dialog.cpp:149
+#: gui/fluidsynth-dialog.cpp:150
msgid "Reset"
msgstr ""
-#: gui/fluidsynth-dialog.cpp:149
+#: gui/fluidsynth-dialog.cpp:150
msgid "Reset all FluidSynth settings to their default values."
msgstr ""
-#: gui/fluidsynth-dialog.cpp:216
+#: gui/fluidsynth-dialog.cpp:217
#, fuzzy
msgid ""
"Do you really want to reset all FluidSynth settings to their default values?"
msgstr "Vil du verkeleg slette det lagra spelet?"
-#: base/main.cpp:210
+#: base/main.cpp:228
#, c-format
msgid "Engine does not support debug level '%s'"
msgstr "Motoren støttar ikkje debug-nivå '%s'"
-#: base/main.cpp:288
+#: base/main.cpp:306
msgid "Menu"
msgstr "Meny"
-#: base/main.cpp:291 backends/platform/symbian/src/SymbianActions.cpp:45
+#: base/main.cpp:309 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:294 backends/platform/symbian/src/SymbianActions.cpp:50
+#: base/main.cpp:312 backends/platform/symbian/src/SymbianActions.cpp:50
#: backends/platform/wince/CEActionsPocket.cpp:42
msgid "Pause"
msgstr "Pause"
-#: base/main.cpp:297
+#: base/main.cpp:315
msgid "Skip line"
msgstr "Hopp over linje"
-#: base/main.cpp:468
+#: base/main.cpp:507
msgid "Error running game:"
msgstr "Feil under køyring av spel:"
-#: base/main.cpp:492
+#: base/main.cpp:536
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."
@@ -1231,120 +1235,120 @@ msgstr ""
msgid "Unknown error"
msgstr "Ukjend feil"
-#: engines/advancedDetector.cpp:316
+#: engines/advancedDetector.cpp:317
#, c-format
msgid "The game in '%s' seems to be unknown."
msgstr ""
-#: engines/advancedDetector.cpp:317
+#: engines/advancedDetector.cpp:318
msgid "Please, report the following data to the ScummVM team along with name"
msgstr ""
-#: engines/advancedDetector.cpp:319
+#: engines/advancedDetector.cpp:320
msgid "of the game you tried to add and its version/language/etc.:"
msgstr ""
-#: engines/dialogs.cpp:84
+#: engines/dialogs.cpp:85
msgid "~R~esume"
msgstr "~F~ortsett"
-#: engines/dialogs.cpp:86
+#: engines/dialogs.cpp:87
msgid "~L~oad"
msgstr "~Å~pne"
-#: engines/dialogs.cpp:90
+#: engines/dialogs.cpp:91
msgid "~S~ave"
msgstr "~L~agre"
-#: engines/dialogs.cpp:94
+#: engines/dialogs.cpp:95
msgid "~O~ptions"
msgstr "~V~al"
-#: engines/dialogs.cpp:99
+#: engines/dialogs.cpp:100
msgid "~H~elp"
msgstr "~H~jelp"
-#: engines/dialogs.cpp:101
+#: engines/dialogs.cpp:102
msgid "~A~bout"
msgstr "~O~m"
-#: engines/dialogs.cpp:104 engines/dialogs.cpp:180
+#: engines/dialogs.cpp:105 engines/dialogs.cpp:181
#, fuzzy
msgid "~R~eturn to Launcher"
msgstr "~T~ilbake til oppstarter"
-#: engines/dialogs.cpp:106 engines/dialogs.cpp:182
+#: engines/dialogs.cpp:107 engines/dialogs.cpp:183
#, fuzzy
msgctxt "lowres"
msgid "~R~eturn to Launcher"
msgstr "~T~ilbake til oppstarter"
-#: engines/dialogs.cpp:115 engines/agi/saveload.cpp:803
-#: engines/drascula/saveload.cpp:338 engines/cruise/menu.cpp:212
-#: engines/sci/engine/kfile.cpp:742 engines/toltecs/menu.cpp:284
-#: engines/pegasus/pegasus.cpp:373
+#: engines/dialogs.cpp:116 engines/agi/saveload.cpp:803
+#: engines/cruise/menu.cpp:212 engines/drascula/saveload.cpp:336
+#: engines/neverhood/menumodule.cpp:873 engines/pegasus/pegasus.cpp:377
+#: engines/sci/engine/kfile.cpp:758 engines/toltecs/menu.cpp:281
msgid "Save game:"
msgstr "Lagra spel:"
-#: engines/dialogs.cpp:115 engines/agi/saveload.cpp:803
-#: engines/drascula/saveload.cpp:338 engines/scumm/dialogs.cpp:187
-#: engines/cruise/menu.cpp:212 engines/sci/engine/kfile.cpp:742
-#: engines/toltecs/menu.cpp:284 engines/pegasus/pegasus.cpp:373
-#: backends/platform/symbian/src/SymbianActions.cpp:44
+#: engines/dialogs.cpp:116 backends/platform/symbian/src/SymbianActions.cpp:44
#: backends/platform/wince/CEActionsPocket.cpp:43
#: backends/platform/wince/CEActionsPocket.cpp:267
#: backends/platform/wince/CEActionsSmartphone.cpp:45
#: backends/platform/wince/CEActionsSmartphone.cpp:231
+#: engines/agi/saveload.cpp:803 engines/cruise/menu.cpp:212
+#: engines/drascula/saveload.cpp:336 engines/neverhood/menumodule.cpp:873
+#: engines/pegasus/pegasus.cpp:377 engines/sci/engine/kfile.cpp:758
+#: engines/scumm/dialogs.cpp:188 engines/toltecs/menu.cpp:281
msgid "Save"
msgstr "Lagre"
-#: engines/dialogs.cpp:144
+#: engines/dialogs.cpp:145
msgid ""
"Sorry, this engine does not currently provide in-game help. Please consult "
"the README for basic information, and for instructions on how to obtain "
"further assistance."
msgstr ""
-#: engines/dialogs.cpp:228
+#: engines/dialogs.cpp:234 engines/pegasus/pegasus.cpp:393
#, c-format
msgid ""
"Gamestate save failed (%s)! Please consult the README for basic information, "
"and for instructions on how to obtain further assistance."
msgstr ""
-#: engines/dialogs.cpp:301 engines/mohawk/dialogs.cpp:109
+#: engines/dialogs.cpp:307 engines/mohawk/dialogs.cpp:109
#: engines/mohawk/dialogs.cpp:170
msgid "~O~K"
msgstr "~O~K"
-#: engines/dialogs.cpp:302 engines/mohawk/dialogs.cpp:110
+#: engines/dialogs.cpp:308 engines/mohawk/dialogs.cpp:110
#: engines/mohawk/dialogs.cpp:171
msgid "~C~ancel"
msgstr "~A~vbryt"
-#: engines/dialogs.cpp:305
+#: engines/dialogs.cpp:311
msgid "~K~eys"
msgstr "~T~astar"
-#: engines/engine.cpp:240
+#: engines/engine.cpp:245
msgid "Could not initialize color format."
msgstr ""
-#: engines/engine.cpp:248
+#: engines/engine.cpp:253
#, fuzzy
msgid "Could not switch to video mode: '"
msgstr "Gjeldende videomodus:"
-#: engines/engine.cpp:257
+#: engines/engine.cpp:262
#, fuzzy
msgid "Could not apply aspect ratio setting."
msgstr "Veksle aspekt-korrigering"
-#: engines/engine.cpp:262
+#: engines/engine.cpp:267
msgid "Could not apply fullscreen setting."
msgstr ""
-#: engines/engine.cpp:362
+#: engines/engine.cpp:367
msgid ""
"You appear to be playing this game directly\n"
"from the CD. This is known to cause problems,\n"
@@ -1353,7 +1357,7 @@ msgid ""
"See the README file for details."
msgstr ""
-#: engines/engine.cpp:373
+#: engines/engine.cpp:378
msgid ""
"This game has audio tracks in its disk. These\n"
"tracks need to be ripped from the disk using\n"
@@ -1362,47 +1366,775 @@ msgid ""
"See the README file for details."
msgstr ""
-#: engines/engine.cpp:431
+#: engines/engine.cpp:436
#, c-format
msgid ""
"Gamestate load failed (%s)! Please consult the README for basic information, "
"and for instructions on how to obtain further assistance."
msgstr ""
-#: engines/engine.cpp:444
+#: engines/engine.cpp:449
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:447
+#: engines/engine.cpp:452
msgid "Start anyway"
msgstr ""
-#: engines/agi/detection.cpp:142 engines/drascula/detection.cpp:270
-#: engines/dreamweb/detection.cpp:47 engines/sci/detection.cpp:393
-#: engines/toltecs/detection.cpp:173
+#: audio/fmopl.cpp:50
+msgid "MAME OPL emulator"
+msgstr "MAME OPL emulator"
+
+#: audio/fmopl.cpp:52
+msgid "DOSBox OPL emulator"
+msgstr "DOSBox OPL emulator"
+
+#: audio/mididrv.cpp:209
+#, c-format
+msgid ""
+"The selected audio device '%s' was not found (e.g. might be turned off or "
+"disconnected)."
+msgstr ""
+
+#: audio/mididrv.cpp:209 audio/mididrv.cpp:221 audio/mididrv.cpp:257
+#: audio/mididrv.cpp:272
+msgid "Attempting to fall back to the next available device..."
+msgstr ""
+
+#: audio/mididrv.cpp:221
+#, c-format
+msgid ""
+"The selected audio device '%s' cannot be used. See log file for more "
+"information."
+msgstr ""
+
+#: audio/mididrv.cpp:257
+#, c-format
+msgid ""
+"The preferred audio device '%s' was not found (e.g. might be turned off or "
+"disconnected)."
+msgstr ""
+
+#: audio/mididrv.cpp:272
+#, c-format
+msgid ""
+"The preferred audio device '%s' cannot be used. See log file for more "
+"information."
+msgstr ""
+
+#: audio/null.h:44
+msgid "No music"
+msgstr "Ingen musikk"
+
+#: audio/mods/paula.cpp:196
+msgid "Amiga Audio Emulator"
+msgstr "Amiga Lydemulator"
+
+#: audio/softsynth/adlib.cpp:2285
+msgid "AdLib Emulator"
+msgstr "AdLib Emulator"
+
+#: audio/softsynth/appleiigs.cpp:33
+msgid "Apple II GS Emulator (NOT IMPLEMENTED)"
+msgstr "Apple II GS Emulator (IKKJE IMPLEMENTERT)"
+
+#: audio/softsynth/sid.cpp:1430
+msgid "C64 Audio Emulator"
+msgstr "C64 Lydemulator"
+
+#: audio/softsynth/mt32.cpp:200
+#, fuzzy
+msgid "Initializing MT-32 Emulator"
+msgstr "Initialiserar MT-32-emulator"
+
+#: audio/softsynth/mt32.cpp:426
+msgid "MT-32 Emulator"
+msgstr "MT-32 Emulator"
+
+#: audio/softsynth/pcspk.cpp:139
+msgid "PC Speaker Emulator"
+msgstr "PC Speaker Emulator"
+
+#: audio/softsynth/pcspk.cpp:158
+msgid "IBM PCjr Emulator"
+msgstr "IBM PCjr Emulator"
+
+#: backends/keymapper/remap-dialog.cpp:48
+msgid "Keymap:"
+msgstr "Tastkopling:"
+
+#: backends/keymapper/remap-dialog.cpp:67
+#, fuzzy
+msgid " (Effective)"
+msgstr " (Aktivt)"
+
+#: backends/keymapper/remap-dialog.cpp:107
+msgid " (Active)"
+msgstr " (Aktivt)"
+
+#: backends/keymapper/remap-dialog.cpp:107
+msgid " (Blocked)"
+msgstr ""
+
+#: backends/keymapper/remap-dialog.cpp:120
+msgid " (Global)"
+msgstr " (Global)"
+
+#: backends/keymapper/remap-dialog.cpp:128
+msgid " (Game)"
+msgstr " (Spel)"
+
+#: backends/midi/windows.cpp:165
+msgid "Windows MIDI"
+msgstr "Windows MIDI"
+
+#: backends/platform/ds/arm9/source/dsoptions.cpp:56
+#: engines/scumm/dialogs.cpp:291
+msgid "~C~lose"
+msgstr "~L~ukk"
+
+#: backends/platform/ds/arm9/source/dsoptions.cpp:57
+msgid "ScummVM Main Menu"
+msgstr "ScummVM Hovudmeny"
+
+#: backends/platform/ds/arm9/source/dsoptions.cpp:63
+msgid "~L~eft handed mode"
+msgstr "~V~enstrehendt modus"
+
+#: backends/platform/ds/arm9/source/dsoptions.cpp:64
+msgid "~I~ndy fight controls"
+msgstr "~I~ndy-kampkontrollar"
+
+#: backends/platform/ds/arm9/source/dsoptions.cpp:65
+msgid "Show mouse cursor"
+msgstr "Vis muspeikar"
+
+#: backends/platform/ds/arm9/source/dsoptions.cpp:66
+msgid "Snap to edges"
+msgstr "Hopp til kantar"
+
+#: backends/platform/ds/arm9/source/dsoptions.cpp:68
+msgid "Touch X Offset"
+msgstr "Gå til X-posisjon"
+
+#: backends/platform/ds/arm9/source/dsoptions.cpp:75
+msgid "Touch Y Offset"
+msgstr "Gå til Y-posisjon"
+
+#: backends/platform/ds/arm9/source/dsoptions.cpp:87
+msgid "Use laptop trackpad-style cursor control"
+msgstr ""
+
+#: backends/platform/ds/arm9/source/dsoptions.cpp:88
+msgid "Tap for left click, double tap right click"
+msgstr "Tap for venstre-klikk, dobbelt-tap for høgre-klikk"
+
+#: backends/platform/ds/arm9/source/dsoptions.cpp:90
+msgid "Sensitivity"
+msgstr "Sensitivitet"
+
+#: backends/platform/ds/arm9/source/dsoptions.cpp:99
+msgid "Initial top screen scale:"
+msgstr ""
+
+#: backends/platform/ds/arm9/source/dsoptions.cpp:105
+msgid "Main screen scaling:"
+msgstr "Hovudskjermsskalering:"
+
+#: backends/platform/ds/arm9/source/dsoptions.cpp:107
+msgid "Hardware scale (fast, but low quality)"
+msgstr ""
+
+#: backends/platform/ds/arm9/source/dsoptions.cpp:108
+msgid "Software scale (good quality, but slower)"
+msgstr ""
+
+#: backends/platform/ds/arm9/source/dsoptions.cpp:109
+msgid "Unscaled (you must scroll left and right)"
+msgstr "Uskalert (du må scrolle til venstre og høgre)"
+
+#: backends/platform/ds/arm9/source/dsoptions.cpp:111
+msgid "Brightness:"
+msgstr "Lysstyrke:"
+
+#: backends/platform/ds/arm9/source/dsoptions.cpp:121
+msgid "High quality audio (slower) (reboot)"
+msgstr ""
+
+#: backends/platform/ds/arm9/source/dsoptions.cpp:122
+msgid "Disable power off"
+msgstr "Deaktiver strømsparing"
+
+#: backends/platform/iphone/osys_events.cpp:300
+msgid "Mouse-click-and-drag mode enabled."
+msgstr ""
+
+#: backends/platform/iphone/osys_events.cpp:302
+msgid "Mouse-click-and-drag mode disabled."
+msgstr ""
+
+#: backends/platform/iphone/osys_events.cpp:313
+msgid "Touchpad mode enabled."
+msgstr ""
+
+#: backends/platform/iphone/osys_events.cpp:315
+msgid "Touchpad mode disabled."
+msgstr ""
+
+#: backends/platform/maemo/maemo.cpp:209
+msgid "Click Mode"
+msgstr ""
+
+#: backends/platform/maemo/maemo.cpp:215
+#: backends/platform/symbian/src/SymbianActions.cpp:42
+#: backends/platform/wince/CEActionsPocket.cpp:60
+#: backends/platform/wince/CEActionsSmartphone.cpp:43
+#: backends/platform/tizen/form.cpp:275
+msgid "Left Click"
+msgstr "Venstreklikk"
+
+#: backends/platform/maemo/maemo.cpp:218
+#, fuzzy
+msgid "Middle Click"
+msgstr "Midtre venstre gjenstand"
+
+#: backends/platform/maemo/maemo.cpp:221
+#: backends/platform/symbian/src/SymbianActions.cpp:43
+#: backends/platform/wince/CEActionsSmartphone.cpp:44
+#: backends/platform/tizen/form.cpp:267
+msgid "Right Click"
+msgstr "Høgreklikk"
+
+#: backends/platform/sdl/macosx/appmenu_osx.mm:77
+#, fuzzy
+msgid "Hide ScummVM"
+msgstr "Avslutt ScummVM"
+
+#: backends/platform/sdl/macosx/appmenu_osx.mm:82
+msgid "Hide Others"
+msgstr ""
+
+#: backends/platform/sdl/macosx/appmenu_osx.mm:87
+msgid "Show All"
+msgstr ""
+
+#: backends/platform/sdl/macosx/appmenu_osx.mm:109
+#: backends/platform/sdl/macosx/appmenu_osx.mm:120
+msgid "Window"
+msgstr ""
+
+#: backends/platform/sdl/macosx/appmenu_osx.mm:114
+msgid "Minimize"
+msgstr ""
+
+#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:46
+msgid "Normal (no scaling)"
+msgstr "Normal (inga skalering)"
+
+#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:65
+msgctxt "lowres"
+msgid "Normal (no scaling)"
+msgstr "Normal (inga skalering)"
+
+#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2148
+#, fuzzy
+msgid "Enabled aspect ratio correction"
+msgstr "Veksle aspekt-korrigering"
+
+#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2154
+#, fuzzy
+msgid "Disabled aspect ratio correction"
+msgstr "Veksle aspekt-korrigering"
+
+#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2209
+#, fuzzy
+msgid "Active graphics filter:"
+msgstr "Veksle grafikkfiltre"
+
+#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2251
+#, fuzzy
+msgid "Windowed mode"
+msgstr "Teiknemodus:"
+
+#: backends/graphics/opengl/opengl-graphics.cpp:118
+#, fuzzy
+msgid "OpenGL"
+msgstr "Åpne"
+
+#: backends/graphics/opengl/opengl-graphics.cpp:119
+msgid "OpenGL (No filtering)"
+msgstr ""
+
+#: backends/platform/symbian/src/SymbianActions.cpp:38
+#: backends/platform/wince/CEActionsSmartphone.cpp:39
+msgid "Up"
+msgstr "Opp"
+
+#: backends/platform/symbian/src/SymbianActions.cpp:39
+#: backends/platform/wince/CEActionsSmartphone.cpp:40
+msgid "Down"
+msgstr "Ned"
+
+#: backends/platform/symbian/src/SymbianActions.cpp:40
+#: backends/platform/wince/CEActionsSmartphone.cpp:41
+msgid "Left"
+msgstr "Venstre"
+
+#: backends/platform/symbian/src/SymbianActions.cpp:41
+#: backends/platform/wince/CEActionsSmartphone.cpp:42
+msgid "Right"
+msgstr "Høgre"
+
+#: backends/platform/symbian/src/SymbianActions.cpp:46
+#: backends/platform/wince/CEActionsSmartphone.cpp:47
+msgid "Zone"
+msgstr "Sone"
+
+#: backends/platform/symbian/src/SymbianActions.cpp:47
+#: backends/platform/wince/CEActionsPocket.cpp:54
+#: backends/platform/wince/CEActionsSmartphone.cpp:48
+msgid "Multi Function"
+msgstr ""
+
+#: backends/platform/symbian/src/SymbianActions.cpp:48
+msgid "Swap character"
+msgstr ""
+
+#: backends/platform/symbian/src/SymbianActions.cpp:49
+msgid "Skip text"
+msgstr ""
+
+#: backends/platform/symbian/src/SymbianActions.cpp:51
+msgid "Fast mode"
+msgstr "Rask modus"
+
+#: 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:218
+#: engines/scumm/dialogs.cpp:192 engines/scumm/help.cpp:82
+#: engines/scumm/help.cpp:84
+msgid "Quit"
+msgstr "Avslutt"
+
+#: backends/platform/symbian/src/SymbianActions.cpp:53
+msgid "Debugger"
+msgstr "Debugger"
+
+#: backends/platform/symbian/src/SymbianActions.cpp:54
+msgid "Global menu"
+msgstr "Globalmeny"
+
+#: backends/platform/symbian/src/SymbianActions.cpp:55
+msgid "Virtual keyboard"
+msgstr ""
+
+#: backends/platform/symbian/src/SymbianActions.cpp:56
+msgid "Key mapper"
+msgstr "Tastkopler"
+
+#: backends/events/symbiansdl/symbiansdl-events.cpp:184
+msgid "Do you want to quit ?"
+msgstr "Vil du avslutte?"
+
+#: backends/platform/wii/options.cpp:51
+msgid "Video"
+msgstr "Video"
+
+#: backends/platform/wii/options.cpp:54
+msgid "Current video mode:"
+msgstr "Gjeldende videomodus:"
+
+#: backends/platform/wii/options.cpp:56
+msgid "Double-strike"
+msgstr ""
+
+#: backends/platform/wii/options.cpp:60
+msgid "Horizontal underscan:"
+msgstr "Horisontal underscan:"
+
+#: backends/platform/wii/options.cpp:66
+msgid "Vertical underscan:"
+msgstr "Vertikal underscan:"
+
+#: backends/platform/wii/options.cpp:71
+msgid "Input"
+msgstr "Input"
+
+#: backends/platform/wii/options.cpp:74
+msgid "GC Pad sensitivity:"
+msgstr ""
+
+#: backends/platform/wii/options.cpp:80
+msgid "GC Pad acceleration:"
+msgstr ""
+
+#: backends/platform/wii/options.cpp:86
+msgid "DVD"
+msgstr "DVD"
+
+#: backends/platform/wii/options.cpp:89 backends/platform/wii/options.cpp:101
+msgid "Status:"
+msgstr "Status:"
+
+#: backends/platform/wii/options.cpp:90 backends/platform/wii/options.cpp:102
+msgid "Unknown"
+msgstr "Ukjend"
+
+#: backends/platform/wii/options.cpp:93
+msgid "Mount DVD"
+msgstr "Monter DVD"
+
+#: backends/platform/wii/options.cpp:94
+msgid "Unmount DVD"
+msgstr "Løs ut DVD"
+
+#: backends/platform/wii/options.cpp:98
+msgid "SMB"
+msgstr "SMB"
+
+#: backends/platform/wii/options.cpp:106
+msgid "Server:"
+msgstr "Teinar:"
+
+#: backends/platform/wii/options.cpp:110
+msgid "Share:"
+msgstr ""
+
+#: backends/platform/wii/options.cpp:114
+msgid "Username:"
+msgstr "Brukarnamn:"
+
+#: backends/platform/wii/options.cpp:118
+msgid "Password:"
+msgstr "Passord:"
+
+#: backends/platform/wii/options.cpp:121
+msgid "Init network"
+msgstr "Init nettverk"
+
+#: backends/platform/wii/options.cpp:123
+msgid "Mount SMB"
+msgstr "Monter SMB"
+
+#: backends/platform/wii/options.cpp:124
+msgid "Unmount SMB"
+msgstr "Avmonter SMB"
+
+#: backends/platform/wii/options.cpp:143
+msgid "DVD Mounted successfully"
+msgstr "DVD-montering fullført"
+
+#: backends/platform/wii/options.cpp:146
+msgid "Error while mounting the DVD"
+msgstr "Feil under montering av DVD"
+
+#: backends/platform/wii/options.cpp:148
+msgid "DVD not mounted"
+msgstr "DVD ikkje montert"
+
+#: backends/platform/wii/options.cpp:161
+msgid "Network up, share mounted"
+msgstr "Nettverket er oppe, delt ressurs montert"
+
+#: backends/platform/wii/options.cpp:163
+msgid "Network up"
+msgstr "Nettverket er oppe"
+
+#: backends/platform/wii/options.cpp:166
+msgid ", error while mounting the share"
+msgstr ""
+
+#: backends/platform/wii/options.cpp:168
+msgid ", share not mounted"
+msgstr ", delt ressurs ikkje montert"
+
+#: backends/platform/wii/options.cpp:174
+msgid "Network down"
+msgstr "Nettverket er nede"
+
+#: backends/platform/wii/options.cpp:178
+#, fuzzy
+msgid "Initializing network"
+msgstr "Initialiserer nettverk"
+
+#: backends/platform/wii/options.cpp:182
+#, fuzzy
+msgid "Timeout while initializing network"
+msgstr "Initialiserer nettverk"
+
+#: backends/platform/wii/options.cpp:186
+#, fuzzy, c-format
+msgid "Network not initialized (%d)"
+msgstr "Nettverk ikkje initialisert (%d)"
+
+#: backends/platform/wince/CEActionsPocket.cpp:46
+msgid "Hide Toolbar"
+msgstr "Skjul verktøylinje"
+
+#: backends/platform/wince/CEActionsPocket.cpp:47
+msgid "Show Keyboard"
+msgstr "Syn tastatur"
+
+#: backends/platform/wince/CEActionsPocket.cpp:48
+msgid "Sound on/off"
+msgstr "Lyd av/på"
+
+#: backends/platform/wince/CEActionsPocket.cpp:49
+msgid "Right click"
+msgstr "Høgreklikk"
+
+#: backends/platform/wince/CEActionsPocket.cpp:50
+msgid "Show/Hide Cursor"
+msgstr "Vis/Skjul Peikar"
+
+#: backends/platform/wince/CEActionsPocket.cpp:51
+msgid "Free look"
+msgstr "Frikikking"
+
+#: backends/platform/wince/CEActionsPocket.cpp:52
+msgid "Zoom up"
+msgstr "Zoom opp"
+
+#: backends/platform/wince/CEActionsPocket.cpp:53
+msgid "Zoom down"
+msgstr "Zoom ned"
+
+#: backends/platform/wince/CEActionsPocket.cpp:55
+#: backends/platform/wince/CEActionsSmartphone.cpp:49
+msgid "Bind Keys"
+msgstr "Kople tastar"
+
+#: backends/platform/wince/CEActionsPocket.cpp:56
+msgid "Cursor Up"
+msgstr "Peikar opp"
+
+#: backends/platform/wince/CEActionsPocket.cpp:57
+msgid "Cursor Down"
+msgstr "Peikar ned"
+
+#: backends/platform/wince/CEActionsPocket.cpp:58
+msgid "Cursor Left"
+msgstr "Peikar venstre"
+
+#: backends/platform/wince/CEActionsPocket.cpp:59
+msgid "Cursor Right"
+msgstr "Peikar høgre"
+
+#: 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:326
+#: backends/platform/wince/CEActionsSmartphone.cpp:287
+msgid " Are you sure you want to quit ? "
+msgstr "Er du sikker på at du vil avslutte?"
+
+#: backends/platform/wince/CEActionsSmartphone.cpp:50
+msgid "Keyboard"
+msgstr "Tastatur"
+
+#: backends/platform/wince/CEActionsSmartphone.cpp:51
+msgid "Rotate"
+msgstr "Roter"
+
+#: backends/platform/wince/CELauncherDialog.cpp:56
+msgid "Using SDL driver "
+msgstr "Nyttar SDL-drivar"
+
+#: backends/platform/wince/CELauncherDialog.cpp:60
+msgid "Display "
+msgstr "Skjerm"
+
+#: 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:516
+msgid "Map right click action"
+msgstr "Kople høgreklikkshandling"
+
+#: backends/platform/wince/wince-sdl.cpp:520
+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:529
+msgid "Map hide toolbar action"
+msgstr "Kople skjul-verktøylinje-handlinga"
+
+#: backends/platform/wince/wince-sdl.cpp:533
+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:542
+msgid "Map Zoom Up action (optional)"
+msgstr "Kople Zoom Opp-handling (valfri)"
+
+#: backends/platform/wince/wince-sdl.cpp:545
+msgid "Map Zoom Down action (optional)"
+msgstr "Kople Zoom Ned-handling (valfri)"
+
+#: backends/platform/wince/wince-sdl.cpp:553
+msgid ""
+"Don't forget to map a key to 'Hide Toolbar' action to see the whole inventory"
+msgstr ""
+"Ikkje gløym å kople ein tast til 'Skjul verktøylinje' for å se heile "
+"inventaret"
+
+#: backends/events/default/default-events.cpp:196
+#, fuzzy
+msgid "Do you really want to return to the Launcher?"
+msgstr "Vil du verkeleg slette det lagra spelet?"
+
+#: backends/events/default/default-events.cpp:196
+#, fuzzy
+msgid "Launcher"
+msgstr "Slå"
+
+#: backends/events/default/default-events.cpp:218
+#, fuzzy
+msgid "Do you really want to quit?"
+msgstr "Vil du avslutte?"
+
+#: backends/events/gph/gph-events.cpp:386
+#: backends/events/gph/gph-events.cpp:429
+#: backends/events/openpandora/op-events.cpp:168
+msgid "Touchscreen 'Tap Mode' - Left Click"
+msgstr ""
+
+#: backends/events/gph/gph-events.cpp:388
+#: backends/events/gph/gph-events.cpp:431
+#: backends/events/openpandora/op-events.cpp:170
+msgid "Touchscreen 'Tap Mode' - Right Click"
+msgstr ""
+
+#: backends/events/gph/gph-events.cpp:390
+#: backends/events/gph/gph-events.cpp:433
+#: backends/events/openpandora/op-events.cpp:172
+msgid "Touchscreen 'Tap Mode' - Hover (No Click)"
+msgstr ""
+
+#: backends/events/gph/gph-events.cpp:410
+#, fuzzy
+msgid "Maximum Volume"
+msgstr "Volum"
+
+#: backends/events/gph/gph-events.cpp:412
+msgid "Increasing Volume"
+msgstr ""
+
+#: backends/events/gph/gph-events.cpp:418
+#, fuzzy
+msgid "Minimal Volume"
+msgstr "Volum"
+
+#: backends/events/gph/gph-events.cpp:420
+msgid "Decreasing Volume"
+msgstr ""
+
+#: backends/events/openpandora/op-events.cpp:174
+msgid "Touchscreen 'Tap Mode' - Hover (DPad Clicks)"
+msgstr ""
+
+#: backends/updates/macosx/macosx-updates.mm:67
+msgid "Check for Updates..."
+msgstr ""
+
+#: backends/platform/tizen/form.cpp:263
+#, fuzzy
+msgid "Right Click Once"
+msgstr "Høgreklikk"
+
+#: backends/platform/tizen/form.cpp:271
+#, fuzzy
+msgid "Move Only"
+msgstr "Tale"
+
+#: backends/platform/tizen/form.cpp:294
+msgid "Escape Key"
+msgstr ""
+
+#: backends/platform/tizen/form.cpp:299
+#, fuzzy
+msgid "Game Menu"
+msgstr "Spel"
+
+#: backends/platform/tizen/form.cpp:304
+#, fuzzy
+msgid "Show Keypad"
+msgstr "Syn tastatur"
+
+#: backends/platform/tizen/form.cpp:309
+msgid "Control Mouse"
+msgstr ""
+
+#: backends/events/maemosdl/maemosdl-events.cpp:192
+msgid "Clicking Enabled"
+msgstr ""
+
+#: backends/events/maemosdl/maemosdl-events.cpp:192
+msgid "Clicking Disabled"
+msgstr ""
+
+#: engines/agi/detection.cpp:142 engines/drascula/detection.cpp:302
+#: engines/dreamweb/detection.cpp:47 engines/neverhood/detection.cpp:160
+#: engines/sci/detection.cpp:394 engines/toltecs/detection.cpp:186
msgid "Use original save/load screens"
msgstr ""
-#: engines/agi/detection.cpp:143 engines/drascula/detection.cpp:271
-#: engines/dreamweb/detection.cpp:48 engines/sci/detection.cpp:394
-#: engines/toltecs/detection.cpp:174
+#: engines/agi/detection.cpp:143 engines/drascula/detection.cpp:303
+#: engines/dreamweb/detection.cpp:48 engines/neverhood/detection.cpp:161
+#: engines/sci/detection.cpp:395 engines/toltecs/detection.cpp:187
msgid "Use the original save/load screens, instead of the ScummVM ones"
msgstr ""
-#: engines/agi/saveload.cpp:816 engines/drascula/saveload.cpp:351
-#: engines/sci/engine/kfile.cpp:841 engines/toltecs/menu.cpp:259
+#: engines/agi/saveload.cpp:816 engines/drascula/saveload.cpp:349
+#: engines/neverhood/menumodule.cpp:886 engines/sci/engine/kfile.cpp:857
+#: engines/toltecs/menu.cpp:256
msgid "Restore game:"
msgstr "Gjenopprett spel:"
-#: engines/agi/saveload.cpp:816 engines/drascula/saveload.cpp:351
-#: engines/sci/engine/kfile.cpp:841 engines/toltecs/menu.cpp:259
+#: engines/agi/saveload.cpp:816 engines/drascula/saveload.cpp:349
+#: engines/neverhood/menumodule.cpp:886 engines/sci/engine/kfile.cpp:857
+#: engines/toltecs/menu.cpp:256
msgid "Restore"
msgstr "Gjenopprett"
-#: engines/drascula/saveload.cpp:49
+#: engines/agos/saveload.cpp:160 engines/scumm/scumm.cpp:2321
+#, c-format
+msgid ""
+"Failed to load game state from file:\n"
+"\n"
+"%s"
+msgstr ""
+
+#: engines/agos/saveload.cpp:195 engines/scumm/scumm.cpp:2314
+#, c-format
+msgid ""
+"Failed to save game state to file:\n"
+"\n"
+"%s"
+msgstr ""
+
+#: engines/agos/saveload.cpp:203 engines/scumm/scumm.cpp:2332
+#, c-format
+msgid ""
+"Successfully saved game state in file:\n"
+"\n"
+"%s"
+msgstr ""
+
+#: engines/agos/animation.cpp:557
+#, c-format
+msgid "Cutscene file '%s' not found!"
+msgstr ""
+
+#: engines/drascula/saveload.cpp:47
msgid ""
"ScummVM found that you have old savefiles for Drascula that should be "
"converted.\n"
@@ -1422,198 +2154,452 @@ msgstr "Øvre høgre gjenstand"
msgid "Display graphics using the game's bright palette"
msgstr ""
-#: engines/sci/detection.cpp:373
-msgid "EGA undithering"
+#: engines/gob/inter_playtoons.cpp:256 engines/gob/inter_v2.cpp:1470
+#: engines/tinsel/saveload.cpp:532
+msgid "Failed to load game state from file."
+msgstr ""
+
+#: engines/gob/inter_v2.cpp:1540 engines/tinsel/saveload.cpp:545
+msgid "Failed to save game state to file."
+msgstr ""
+
+#: engines/gob/inter_v5.cpp:107
+msgid "Failed to delete file."
+msgstr ""
+
+#: engines/groovie/detection.cpp:312
+#, fuzzy
+msgid "Fast movie speed"
+msgstr "Rask modus"
+
+#: engines/groovie/detection.cpp:313
+msgid "Play movies at an increased speed"
+msgstr ""
+
+#: engines/groovie/script.cpp:399
+#, fuzzy
+msgid "Failed to save game"
+msgstr "Full speltittel:"
+
+#. I18N: Studio audience adds an applause and cheering sounds whenever
+#. Malcolm makes a joke.
+#: engines/kyra/detection.cpp:62
+msgid "Studio audience"
+msgstr ""
+
+#: engines/kyra/detection.cpp:63
+msgid "Enable studio audience"
+msgstr ""
+
+#. I18N: This option allows the user to skip text and cutscenes.
+#: engines/kyra/detection.cpp:73
+msgid "Skip support"
+msgstr ""
+
+#: engines/kyra/detection.cpp:74
+msgid "Allow text and cutscenes to be skipped"
+msgstr ""
+
+#. I18N: Helium mode makes people sound like they've inhaled Helium.
+#: engines/kyra/detection.cpp:84
+msgid "Helium mode"
+msgstr ""
+
+#: engines/kyra/detection.cpp:85
+#, fuzzy
+msgid "Enable helium mode"
+msgstr "Aktiver Roland GS-modus"
+
+#. I18N: When enabled, this option makes scrolling smoother when
+#. changing from one screen to another.
+#: engines/kyra/detection.cpp:99
+msgid "Smooth scrolling"
+msgstr ""
+
+#: engines/kyra/detection.cpp:100
+msgid "Enable smooth scrolling when walking"
+msgstr ""
+
+#. I18N: When enabled, this option changes the cursor when it floats to the
+#. edge of the screen to a directional arrow. The player can then click to
+#. walk towards that direction.
+#: engines/kyra/detection.cpp:112
+#, fuzzy
+msgid "Floating cursors"
+msgstr "Vanleg peikar"
+
+#: engines/kyra/detection.cpp:113
+msgid "Enable floating cursors"
+msgstr ""
+
+#. I18N: HP stands for Hit Points
+#: engines/kyra/detection.cpp:127
+msgid "HP bar graphs"
+msgstr ""
+
+#: engines/kyra/detection.cpp:128
+msgid "Enable hit point bar graphs"
+msgstr ""
+
+#: engines/kyra/lol.cpp:478
+msgid "Attack 1"
+msgstr ""
+
+#: engines/kyra/lol.cpp:479
+msgid "Attack 2"
+msgstr ""
+
+#: engines/kyra/lol.cpp:480
+msgid "Attack 3"
+msgstr ""
+
+#: engines/kyra/lol.cpp:481
+msgid "Move Forward"
+msgstr ""
+
+#: engines/kyra/lol.cpp:482
+msgid "Move Back"
+msgstr ""
+
+#: engines/kyra/lol.cpp:483
+msgid "Slide Left"
+msgstr ""
+
+#: engines/kyra/lol.cpp:484
+#, fuzzy
+msgid "Slide Right"
+msgstr "Høgre"
+
+#: engines/kyra/lol.cpp:485 engines/pegasus/pegasus.cpp:2509
+#, fuzzy
+msgid "Turn Left"
+msgstr "Slå av"
+
+#: engines/kyra/lol.cpp:486 engines/pegasus/pegasus.cpp:2510
+#, fuzzy
+msgid "Turn Right"
+msgstr "Peikar høgre"
+
+#: engines/kyra/lol.cpp:487
+#, fuzzy
+msgid "Rest"
+msgstr "Gjenopprett"
+
+#: engines/kyra/lol.cpp:488
+#, fuzzy
+msgid "Options"
+msgstr "~V~al"
+
+#: engines/kyra/lol.cpp:489
+#, fuzzy
+msgid "Choose Spell"
+msgstr "Vel"
+
+#: engines/kyra/sound_midi.cpp:477
+msgid ""
+"You appear to be using a General MIDI device,\n"
+"but your game only supports Roland MT32 MIDI.\n"
+"We try to map the Roland MT32 instruments to\n"
+"General MIDI ones. It is still possible that\n"
+"some tracks sound incorrect."
+msgstr ""
+
+#. I18N: Option for fast scene switching
+#: engines/mohawk/dialogs.cpp:92 engines/mohawk/dialogs.cpp:167
+msgid "~Z~ip Mode Activated"
+msgstr "~Z~ipmodus aktivert"
+
+#: engines/mohawk/dialogs.cpp:93
+msgid "~T~ransitions Enabled"
+msgstr "~O~vergangar aktivert"
+
+#. I18N: Drop book page
+#: engines/mohawk/dialogs.cpp:95
+msgid "~D~rop Page"
+msgstr ""
+
+#: engines/mohawk/dialogs.cpp:99
+msgid "~S~how Map"
+msgstr ""
+
+#: engines/mohawk/dialogs.cpp:105
+#, fuzzy
+msgid "~M~ain Menu"
+msgstr "ScummVM Hovudmeny"
+
+#: engines/mohawk/dialogs.cpp:168
+msgid "~W~ater Effect Enabled"
+msgstr "~V~anneffekt aktivert"
+
+#: engines/neverhood/detection.cpp:167
+msgid "Skip the Hall of Records storyboard scenes"
+msgstr ""
+
+#: engines/neverhood/detection.cpp:168
+msgid "Allows the player to skip past the Hall of Records storyboard scenes"
+msgstr ""
+
+#: engines/neverhood/detection.cpp:174
+msgid "Scale the making of videos to full screen"
+msgstr ""
+
+#: engines/neverhood/detection.cpp:175
+msgid "Scale the making of videos, so that they use the whole screen"
+msgstr ""
+
+#: engines/parallaction/saveload.cpp:133
+#, c-format
+msgid ""
+"Can't save game in slot %i\n"
+"\n"
+msgstr ""
+
+#: engines/parallaction/saveload.cpp:204
+#, fuzzy
+msgid "Loading game..."
+msgstr "Åpne spel:"
+
+#: engines/parallaction/saveload.cpp:219
+#, fuzzy
+msgid "Saving game..."
+msgstr "Lagra spel:"
+
+#: engines/parallaction/saveload.cpp:272
+msgid ""
+"ScummVM found that you have old savefiles for Nippon Safes that should be "
+"renamed.\n"
+"The old names are 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 next time.\n"
+msgstr ""
+
+#: engines/parallaction/saveload.cpp:319
+msgid "ScummVM successfully converted all your savefiles."
+msgstr ""
+
+#: engines/parallaction/saveload.cpp:321
+msgid ""
+"ScummVM printed some warnings in your console window and can't guarantee all "
+"your files have been converted.\n"
+"\n"
+"Please report to the team."
+msgstr ""
+
+#: engines/pegasus/pegasus.cpp:714
+msgid "Invalid save file name"
+msgstr ""
+
+#: engines/pegasus/pegasus.cpp:2507
+msgid "Up/Zoom In/Move Forward/Open Doors"
+msgstr ""
+
+#: engines/pegasus/pegasus.cpp:2508
+#, fuzzy
+msgid "Down/Zoom Out"
+msgstr "Zoom opp"
+
+#: engines/pegasus/pegasus.cpp:2511
+msgid "Display/Hide Inventory Tray"
+msgstr ""
+
+#: engines/pegasus/pegasus.cpp:2512
+msgid "Display/Hide Biochip Tray"
+msgstr ""
+
+#: engines/pegasus/pegasus.cpp:2513
+msgid "Action/Select"
+msgstr ""
+
+#: engines/pegasus/pegasus.cpp:2514
+msgid "Toggle Center Data Display"
+msgstr ""
+
+#: engines/pegasus/pegasus.cpp:2515
+msgid "Display/Hide Info Screen"
+msgstr ""
+
+#: engines/pegasus/pegasus.cpp:2516
+msgid "Display/Hide Pause Menu"
+msgstr ""
+
+#: engines/pegasus/pegasus.cpp:2517
+msgid "???"
msgstr ""
#: engines/sci/detection.cpp:374
+msgid "EGA undithering"
+msgstr ""
+
+#: engines/sci/detection.cpp:375
msgid "Enable undithering in EGA games"
msgstr ""
-#: engines/sci/detection.cpp:383
+#: engines/sci/detection.cpp:384
msgid "Prefer digital sound effects"
msgstr ""
-#: engines/sci/detection.cpp:384
+#: engines/sci/detection.cpp:385
msgid "Prefer digital sound effects instead of synthesized ones"
msgstr ""
-#: engines/sci/detection.cpp:403
+#: engines/sci/detection.cpp:404
msgid "Use IMF/Yamaha FB-01 for MIDI output"
msgstr ""
-#: engines/sci/detection.cpp:404
+#: engines/sci/detection.cpp:405
msgid ""
"Use an IBM Music Feature card or a Yamaha FB-01 FM synth module for MIDI "
"output"
msgstr ""
-#: engines/sci/detection.cpp:414
+#: engines/sci/detection.cpp:415
msgid "Use CD audio"
msgstr ""
-#: engines/sci/detection.cpp:415
+#: engines/sci/detection.cpp:416
msgid "Use CD audio instead of in-game audio, if available"
msgstr ""
-#: engines/sci/detection.cpp:425
+#: engines/sci/detection.cpp:426
msgid "Use Windows cursors"
msgstr ""
-#: engines/sci/detection.cpp:426
+#: engines/sci/detection.cpp:427
msgid ""
"Use the Windows cursors (smaller and monochrome) instead of the DOS ones"
msgstr ""
-#: engines/sci/detection.cpp:436
+#: engines/sci/detection.cpp:437
#, fuzzy
msgid "Use silver cursors"
msgstr "Vanleg peikar"
-#: engines/sci/detection.cpp:437
+#: engines/sci/detection.cpp:438
msgid ""
"Use the alternate set of silver cursors, instead of the normal golden ones"
msgstr ""
-#: engines/scumm/dialogs.cpp:175
+#: engines/scumm/dialogs.cpp:176
#, c-format
msgid "Insert Disk %c and Press Button to Continue."
msgstr ""
-#: engines/scumm/dialogs.cpp:176
+#: engines/scumm/dialogs.cpp:177
#, c-format
msgid "Unable to Find %s, (%c%d) Press Button."
msgstr ""
-#: engines/scumm/dialogs.cpp:177
+#: engines/scumm/dialogs.cpp:178
#, c-format
msgid "Error reading disk %c, (%c%d) Press Button."
msgstr ""
-#: engines/scumm/dialogs.cpp:178
+#: engines/scumm/dialogs.cpp:179
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
+#: engines/scumm/dialogs.cpp:183
#, 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
+#: engines/scumm/dialogs.cpp:185
#, 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
+#: engines/scumm/dialogs.cpp:190
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:215
-msgid "Quit"
-msgstr "Avslutt"
-
-#: engines/scumm/dialogs.cpp:193
+#: engines/scumm/dialogs.cpp:194
msgid "Insert save/load game disk"
msgstr ""
-#: engines/scumm/dialogs.cpp:194
+#: engines/scumm/dialogs.cpp:195
msgid "You must enter a name"
msgstr ""
-#: engines/scumm/dialogs.cpp:195
+#: engines/scumm/dialogs.cpp:196
msgid "The game was NOT saved (disk full?)"
msgstr ""
-#: engines/scumm/dialogs.cpp:196
+#: engines/scumm/dialogs.cpp:197
msgid "The game was NOT loaded"
msgstr ""
-#: engines/scumm/dialogs.cpp:197
+#: engines/scumm/dialogs.cpp:198
#, c-format
msgid "Saving '%s'"
msgstr ""
-#: engines/scumm/dialogs.cpp:198
+#: engines/scumm/dialogs.cpp:199
#, c-format
msgid "Loading '%s'"
msgstr ""
-#: engines/scumm/dialogs.cpp:199
+#: engines/scumm/dialogs.cpp:200
msgid "Name your SAVE game"
msgstr ""
-#: engines/scumm/dialogs.cpp:200
+#: engines/scumm/dialogs.cpp:201
#, fuzzy
msgid "Select a game to LOAD"
msgstr "Vel eit tema"
-#: engines/scumm/dialogs.cpp:201
+#: engines/scumm/dialogs.cpp:202
msgid "Game title)"
msgstr ""
#. I18N: Previous page button
-#: engines/scumm/dialogs.cpp:287
+#: engines/scumm/dialogs.cpp:288
msgid "~P~revious"
msgstr "~F~orrige"
#. I18N: Next page button
-#: engines/scumm/dialogs.cpp:289
+#: engines/scumm/dialogs.cpp:290
msgid "~N~ext"
msgstr "~N~este"
-#: engines/scumm/dialogs.cpp:290
-#: backends/platform/ds/arm9/source/dsoptions.cpp:56
-msgid "~C~lose"
-msgstr "~L~ukk"
-
-#: engines/scumm/dialogs.cpp:597
+#: engines/scumm/dialogs.cpp:598
#, fuzzy
msgid "Speech Only"
msgstr "Tale"
-#: engines/scumm/dialogs.cpp:598
+#: engines/scumm/dialogs.cpp:599
#, fuzzy
msgid "Speech and Subtitles"
msgstr "Teksting"
-#: engines/scumm/dialogs.cpp:599
+#: engines/scumm/dialogs.cpp:600
#, fuzzy
msgid "Subtitles Only"
msgstr "Teksting"
-#: engines/scumm/dialogs.cpp:607
+#: engines/scumm/dialogs.cpp:608
#, fuzzy
msgctxt "lowres"
msgid "Speech & Subs"
msgstr "Tale"
-#: engines/scumm/dialogs.cpp:653
+#: engines/scumm/dialogs.cpp:654
msgid "Select a Proficiency Level."
msgstr ""
-#: engines/scumm/dialogs.cpp:655
+#: engines/scumm/dialogs.cpp:656
msgid "Refer to your Loom(TM) manual for help."
msgstr ""
-#: engines/scumm/dialogs.cpp:658
-#, fuzzy
-msgid "Standard"
-msgstr "Standard (16bpp)"
-
-#: engines/scumm/dialogs.cpp:659
+#: engines/scumm/dialogs.cpp:660
msgid "Practice"
msgstr ""
-#: engines/scumm/dialogs.cpp:660
+#: engines/scumm/dialogs.cpp:661
msgid "Expert"
msgstr ""
@@ -2131,38 +3117,14 @@ msgstr "Fly til høgre"
msgid "Fly to lower right"
msgstr "Fly til nedre høgre"
-#: engines/scumm/scumm.cpp:1776
+#: engines/scumm/scumm.cpp:1777
#, 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:2303 engines/agos/saveload.cpp:220
-#, c-format
-msgid ""
-"Failed to save game state to file:\n"
-"\n"
-"%s"
-msgstr ""
-
-#: engines/scumm/scumm.cpp:2310 engines/agos/saveload.cpp:185
-#, c-format
-msgid ""
-"Failed to load game state from file:\n"
-"\n"
-"%s"
-msgstr ""
-
-#: engines/scumm/scumm.cpp:2322 engines/agos/saveload.cpp:228
-#, c-format
-msgid ""
-"Successfully saved game state in file:\n"
-"\n"
-"%s"
-msgstr ""
-
-#: engines/scumm/scumm.cpp:2537
+#: engines/scumm/scumm.cpp:2547
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' "
@@ -2172,196 +3134,6 @@ msgstr ""
"det enno. For å spele Maniac Mansion, gå til 'Legg til spel' i ScummVM-"
"menyen og vel 'Maniac'-undermappa i 'Tentacle'-mappa."
-#. I18N: Option for fast scene switching
-#: engines/mohawk/dialogs.cpp:92 engines/mohawk/dialogs.cpp:167
-msgid "~Z~ip Mode Activated"
-msgstr "~Z~ipmodus aktivert"
-
-#: engines/mohawk/dialogs.cpp:93
-msgid "~T~ransitions Enabled"
-msgstr "~O~vergangar aktivert"
-
-#. I18N: Drop book page
-#: engines/mohawk/dialogs.cpp:95
-msgid "~D~rop Page"
-msgstr ""
-
-#: engines/mohawk/dialogs.cpp:99
-msgid "~S~how Map"
-msgstr ""
-
-#: engines/mohawk/dialogs.cpp:105
-#, fuzzy
-msgid "~M~ain Menu"
-msgstr "ScummVM Hovudmeny"
-
-#: engines/mohawk/dialogs.cpp:168
-msgid "~W~ater Effect Enabled"
-msgstr "~V~anneffekt aktivert"
-
-#: engines/agos/animation.cpp:557
-#, c-format
-msgid "Cutscene file '%s' not found!"
-msgstr ""
-
-#: engines/gob/inter_playtoons.cpp:256 engines/gob/inter_v2.cpp:1287
-#: engines/tinsel/saveload.cpp:532
-msgid "Failed to load game state from file."
-msgstr ""
-
-#: engines/gob/inter_v2.cpp:1357 engines/tinsel/saveload.cpp:545
-msgid "Failed to save game state to file."
-msgstr ""
-
-#: engines/gob/inter_v5.cpp:107
-msgid "Failed to delete file."
-msgstr ""
-
-#: engines/groovie/detection.cpp:312
-#, fuzzy
-msgid "Fast movie speed"
-msgstr "Rask modus"
-
-#: engines/groovie/detection.cpp:313
-msgid "Play movies at an increased speed"
-msgstr ""
-
-#: engines/groovie/script.cpp:420
-#, fuzzy
-msgid "Failed to save game"
-msgstr "Full speltittel:"
-
-#. I18N: Studio audience adds an applause and cheering sounds whenever
-#. Malcolm makes a joke.
-#: engines/kyra/detection.cpp:62
-msgid "Studio audience"
-msgstr ""
-
-#: engines/kyra/detection.cpp:63
-msgid "Enable studio audience"
-msgstr ""
-
-#. I18N: This option allows the user to skip text and cutscenes.
-#: engines/kyra/detection.cpp:73
-msgid "Skip support"
-msgstr ""
-
-#: engines/kyra/detection.cpp:74
-msgid "Allow text and cutscenes to be skipped"
-msgstr ""
-
-#. I18N: Helium mode makes people sound like they've inhaled Helium.
-#: engines/kyra/detection.cpp:84
-msgid "Helium mode"
-msgstr ""
-
-#: engines/kyra/detection.cpp:85
-#, fuzzy
-msgid "Enable helium mode"
-msgstr "Aktiver Roland GS-modus"
-
-#. I18N: When enabled, this option makes scrolling smoother when
-#. changing from one screen to another.
-#: engines/kyra/detection.cpp:99
-msgid "Smooth scrolling"
-msgstr ""
-
-#: engines/kyra/detection.cpp:100
-msgid "Enable smooth scrolling when walking"
-msgstr ""
-
-#. I18N: When enabled, this option changes the cursor when it floats to the
-#. edge of the screen to a directional arrow. The player can then click to
-#. walk towards that direction.
-#: engines/kyra/detection.cpp:112
-#, fuzzy
-msgid "Floating cursors"
-msgstr "Vanleg peikar"
-
-#: engines/kyra/detection.cpp:113
-msgid "Enable floating cursors"
-msgstr ""
-
-#. I18N: HP stands for Hit Points
-#: engines/kyra/detection.cpp:127
-msgid "HP bar graphs"
-msgstr ""
-
-#: engines/kyra/detection.cpp:128
-msgid "Enable hit point bar graphs"
-msgstr ""
-
-#: engines/kyra/lol.cpp:478
-msgid "Attack 1"
-msgstr ""
-
-#: engines/kyra/lol.cpp:479
-msgid "Attack 2"
-msgstr ""
-
-#: engines/kyra/lol.cpp:480
-msgid "Attack 3"
-msgstr ""
-
-#: engines/kyra/lol.cpp:481
-msgid "Move Forward"
-msgstr ""
-
-#: engines/kyra/lol.cpp:482
-msgid "Move Back"
-msgstr ""
-
-#: engines/kyra/lol.cpp:483
-msgid "Slide Left"
-msgstr ""
-
-#: engines/kyra/lol.cpp:484
-#, fuzzy
-msgid "Slide Right"
-msgstr "Høgre"
-
-#: engines/kyra/lol.cpp:485 engines/pegasus/pegasus.cpp:2447
-#, fuzzy
-msgid "Turn Left"
-msgstr "Slå av"
-
-#: engines/kyra/lol.cpp:486 engines/pegasus/pegasus.cpp:2448
-#, fuzzy
-msgid "Turn Right"
-msgstr "Peikar høgre"
-
-#: engines/kyra/lol.cpp:487
-#, fuzzy
-msgid "Rest"
-msgstr "Gjenopprett"
-
-#: engines/kyra/lol.cpp:488
-#, fuzzy
-msgid "Options"
-msgstr "~V~al"
-
-#: engines/kyra/lol.cpp:489
-#, fuzzy
-msgid "Choose Spell"
-msgstr "Vel"
-
-#: engines/kyra/sound_midi.cpp:477
-msgid ""
-"You appear to be using a General MIDI device,\n"
-"but your game only supports Roland MT32 MIDI.\n"
-"We try to map the Roland MT32 instruments to\n"
-"General MIDI ones. It is still possible that\n"
-"some tracks sound incorrect."
-msgstr ""
-
-#: engines/queen/queen.cpp:59
-msgid "Alternative intro"
-msgstr ""
-
-#: engines/queen/queen.cpp:60
-msgid "Use an alternative game intro (CD version only)"
-msgstr ""
-
#: engines/sky/compact.cpp:130
msgid ""
"Unable to find \"sky.cpt\" file!\n"
@@ -2382,20 +3154,20 @@ msgstr ""
msgid "Use the floppy version's intro (CD version only)"
msgstr ""
-#: engines/sword1/animation.cpp:519
+#: engines/sword1/animation.cpp:524
#, c-format
msgid "PSX stream cutscene '%s' cannot be played in paletted mode"
msgstr ""
-#: engines/sword1/animation.cpp:540 engines/sword2/animation.cpp:439
+#: engines/sword1/animation.cpp:545 engines/sword2/animation.cpp:445
msgid "DXA cutscenes found but ScummVM has been built without zlib support"
msgstr ""
-#: engines/sword1/animation.cpp:550 engines/sword2/animation.cpp:449
-msgid "MPEG2 cutscenes are no longer supported"
+#: engines/sword1/animation.cpp:561
+msgid "MPEG-2 cutscenes found but ScummVM has been built without MPEG-2"
msgstr ""
-#: engines/sword1/animation.cpp:556 engines/sword2/animation.cpp:457
+#: engines/sword1/animation.cpp:568 engines/sword2/animation.cpp:470
#, c-format
msgid "Cutscene '%s' not found"
msgstr ""
@@ -2430,11 +3202,16 @@ msgstr ""
msgid "This is the end of the Broken Sword 1 Demo"
msgstr ""
-#: engines/sword2/animation.cpp:419
+#: engines/sword2/animation.cpp:425
msgid ""
"PSX cutscenes found but ScummVM has been built without RGB color support"
msgstr ""
+#: engines/sword2/animation.cpp:461
+msgid ""
+"MPEG-2 cutscenes found but ScummVM has been built without MPEG-2 support"
+msgstr ""
+
#: engines/sword2/sword2.cpp:79
msgid "Show object labels"
msgstr ""
@@ -2443,802 +3220,43 @@ msgstr ""
msgid "Show labels for objects on mouse hover"
msgstr ""
-#: engines/teenagent/resources.cpp:94
+#: engines/teenagent/resources.cpp:95
msgid ""
"You're missing the 'teenagent.dat' file. Get it from the ScummVM website"
msgstr ""
-#: engines/teenagent/resources.cpp:115
+#: engines/teenagent/resources.cpp:116
msgid ""
"The teenagent.dat file is compressed and zlib hasn't been included in this "
"executable. Please decompress it"
msgstr ""
-#: engines/parallaction/saveload.cpp:133
-#, c-format
-msgid ""
-"Can't save game in slot %i\n"
-"\n"
-msgstr ""
-
-#: engines/parallaction/saveload.cpp:204
-#, fuzzy
-msgid "Loading game..."
-msgstr "Åpne spel:"
-
-#: engines/parallaction/saveload.cpp:219
-#, fuzzy
-msgid "Saving game..."
-msgstr "Lagra spel:"
-
-#: engines/parallaction/saveload.cpp:272
-msgid ""
-"ScummVM found that you have old savefiles for Nippon Safes that should be "
-"renamed.\n"
-"The old names are 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 next time.\n"
-msgstr ""
-
-#: engines/parallaction/saveload.cpp:319
-msgid "ScummVM successfully converted all your savefiles."
-msgstr ""
-
-#: engines/parallaction/saveload.cpp:321
-msgid ""
-"ScummVM printed some warnings in your console window and can't guarantee all "
-"your files have been converted.\n"
-"\n"
-"Please report to the team."
-msgstr ""
-
-#: engines/pegasus/pegasus.cpp:679
-msgid "Invalid save file name"
-msgstr ""
-
-#: engines/pegasus/pegasus.cpp:2445
-msgid "Up/Zoom In/Move Forward/Open Doors"
-msgstr ""
-
-#: engines/pegasus/pegasus.cpp:2446
-#, fuzzy
-msgid "Down/Zoom Out"
-msgstr "Zoom opp"
-
-#: engines/pegasus/pegasus.cpp:2449
-msgid "Display/Hide Inventory Tray"
-msgstr ""
-
-#: engines/pegasus/pegasus.cpp:2450
-msgid "Display/Hide Biochip Tray"
-msgstr ""
-
-#: engines/pegasus/pegasus.cpp:2451
-msgid "Action/Select"
-msgstr ""
-
-#: engines/pegasus/pegasus.cpp:2452
-msgid "Toggle Center Data Display"
-msgstr ""
-
-#: engines/pegasus/pegasus.cpp:2453
-msgid "Display/Hide Info Screen"
-msgstr ""
-
-#: engines/pegasus/pegasus.cpp:2454
-msgid "Display/Hide Pause Menu"
-msgstr ""
-
-#: engines/pegasus/pegasus.cpp:2455
-msgid "???"
-msgstr ""
-
-#: audio/fmopl.cpp:49
-msgid "MAME OPL emulator"
-msgstr "MAME OPL emulator"
-
-#: audio/fmopl.cpp:51
-msgid "DOSBox OPL emulator"
-msgstr "DOSBox OPL emulator"
-
-#: audio/mididrv.cpp:209
-#, c-format
-msgid ""
-"The selected audio device '%s' was not found (e.g. might be turned off or "
-"disconnected)."
-msgstr ""
-
-#: audio/mididrv.cpp:209 audio/mididrv.cpp:221 audio/mididrv.cpp:257
-#: audio/mididrv.cpp:272
-msgid "Attempting to fall back to the next available device..."
-msgstr ""
-
-#: audio/mididrv.cpp:221
-#, c-format
-msgid ""
-"The selected audio device '%s' cannot be used. See log file for more "
-"information."
-msgstr ""
-
-#: audio/mididrv.cpp:257
-#, c-format
-msgid ""
-"The preferred audio device '%s' was not found (e.g. might be turned off or "
-"disconnected)."
-msgstr ""
-
-#: audio/mididrv.cpp:272
-#, c-format
-msgid ""
-"The preferred audio device '%s' cannot be used. See log file for more "
-"information."
-msgstr ""
-
-#: audio/null.h:43
-msgid "No music"
-msgstr "Ingen musikk"
-
-#: audio/mods/paula.cpp:189
-msgid "Amiga Audio Emulator"
-msgstr "Amiga Lydemulator"
-
-#: audio/softsynth/adlib.cpp:2284
-msgid "AdLib Emulator"
-msgstr "AdLib Emulator"
-
-#: audio/softsynth/appleiigs.cpp:33
-msgid "Apple II GS Emulator (NOT IMPLEMENTED)"
-msgstr "Apple II GS Emulator (IKKJE IMPLEMENTERT)"
-
-#: audio/softsynth/sid.cpp:1430
-msgid "C64 Audio Emulator"
-msgstr "C64 Lydemulator"
-
-#: audio/softsynth/mt32.cpp:205
-#, fuzzy
-msgid "Initializing MT-32 Emulator"
-msgstr "Initialiserar MT-32-emulator"
-
-#: audio/softsynth/mt32.cpp:431
-msgid "MT-32 Emulator"
-msgstr "MT-32 Emulator"
-
-#: audio/softsynth/pcspk.cpp:139
-msgid "PC Speaker Emulator"
-msgstr "PC Speaker Emulator"
-
-#: audio/softsynth/pcspk.cpp:158
-msgid "IBM PCjr Emulator"
-msgstr "IBM PCjr Emulator"
-
-#: backends/keymapper/remap-dialog.cpp:47
-msgid "Keymap:"
-msgstr "Tastkopling:"
-
-#: backends/keymapper/remap-dialog.cpp:66
-#, fuzzy
-msgid " (Effective)"
-msgstr " (Aktivt)"
-
-#: backends/keymapper/remap-dialog.cpp:106
-msgid " (Active)"
-msgstr " (Aktivt)"
-
-#: backends/keymapper/remap-dialog.cpp:106
-msgid " (Blocked)"
-msgstr ""
-
-#: backends/keymapper/remap-dialog.cpp:119
-msgid " (Global)"
-msgstr " (Global)"
-
-#: backends/keymapper/remap-dialog.cpp:127
-msgid " (Game)"
-msgstr " (Spel)"
-
-#: backends/midi/windows.cpp:164
-msgid "Windows MIDI"
-msgstr "Windows MIDI"
-
-#: backends/platform/ds/arm9/source/dsoptions.cpp:57
-msgid "ScummVM Main Menu"
-msgstr "ScummVM Hovudmeny"
-
-#: backends/platform/ds/arm9/source/dsoptions.cpp:63
-msgid "~L~eft handed mode"
-msgstr "~V~enstrehendt modus"
-
-#: backends/platform/ds/arm9/source/dsoptions.cpp:64
-msgid "~I~ndy fight controls"
-msgstr "~I~ndy-kampkontrollar"
-
-#: backends/platform/ds/arm9/source/dsoptions.cpp:65
-msgid "Show mouse cursor"
-msgstr "Vis muspeikar"
-
-#: backends/platform/ds/arm9/source/dsoptions.cpp:66
-msgid "Snap to edges"
-msgstr "Hopp til kantar"
-
-#: backends/platform/ds/arm9/source/dsoptions.cpp:68
-msgid "Touch X Offset"
-msgstr "Gå til X-posisjon"
-
-#: backends/platform/ds/arm9/source/dsoptions.cpp:75
-msgid "Touch Y Offset"
-msgstr "Gå til Y-posisjon"
-
-#: backends/platform/ds/arm9/source/dsoptions.cpp:87
-msgid "Use laptop trackpad-style cursor control"
-msgstr ""
-
-#: backends/platform/ds/arm9/source/dsoptions.cpp:88
-msgid "Tap for left click, double tap right click"
-msgstr "Tap for venstre-klikk, dobbelt-tap for høgre-klikk"
-
-#: backends/platform/ds/arm9/source/dsoptions.cpp:90
-msgid "Sensitivity"
-msgstr "Sensitivitet"
-
-#: backends/platform/ds/arm9/source/dsoptions.cpp:99
-msgid "Initial top screen scale:"
-msgstr ""
-
-#: backends/platform/ds/arm9/source/dsoptions.cpp:105
-msgid "Main screen scaling:"
-msgstr "Hovudskjermsskalering:"
-
-#: backends/platform/ds/arm9/source/dsoptions.cpp:107
-msgid "Hardware scale (fast, but low quality)"
-msgstr ""
-
-#: backends/platform/ds/arm9/source/dsoptions.cpp:108
-msgid "Software scale (good quality, but slower)"
-msgstr ""
-
-#: backends/platform/ds/arm9/source/dsoptions.cpp:109
-msgid "Unscaled (you must scroll left and right)"
-msgstr "Uskalert (du må scrolle til venstre og høgre)"
-
-#: backends/platform/ds/arm9/source/dsoptions.cpp:111
-msgid "Brightness:"
-msgstr "Lysstyrke:"
-
-#: backends/platform/ds/arm9/source/dsoptions.cpp:121
-msgid "High quality audio (slower) (reboot)"
-msgstr ""
-
-#: backends/platform/ds/arm9/source/dsoptions.cpp:122
-msgid "Disable power off"
-msgstr "Deaktiver strømsparing"
-
-#: backends/platform/iphone/osys_events.cpp:300
-msgid "Mouse-click-and-drag mode enabled."
-msgstr ""
-
-#: backends/platform/iphone/osys_events.cpp:302
-msgid "Mouse-click-and-drag mode disabled."
-msgstr ""
-
-#: backends/platform/iphone/osys_events.cpp:313
-msgid "Touchpad mode enabled."
-msgstr ""
-
-#: backends/platform/iphone/osys_events.cpp:315
-msgid "Touchpad mode disabled."
-msgstr ""
-
-#: backends/platform/maemo/maemo.cpp:209
-msgid "Click Mode"
-msgstr ""
-
-#: backends/platform/maemo/maemo.cpp:215
-#: 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/maemo/maemo.cpp:218
-#, fuzzy
-msgid "Middle Click"
-msgstr "Midtre venstre gjenstand"
-
-#: backends/platform/maemo/maemo.cpp:221
-#: 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"
-
-#: backends/platform/sdl/macosx/appmenu_osx.mm:77
-#, fuzzy
-msgid "Hide ScummVM"
-msgstr "Avslutt ScummVM"
-
-#: backends/platform/sdl/macosx/appmenu_osx.mm:82
-msgid "Hide Others"
-msgstr ""
-
-#: backends/platform/sdl/macosx/appmenu_osx.mm:87
-msgid "Show All"
-msgstr ""
-
-#: backends/platform/sdl/macosx/appmenu_osx.mm:109
-#: backends/platform/sdl/macosx/appmenu_osx.mm:120
-msgid "Window"
-msgstr ""
-
-#: backends/platform/sdl/macosx/appmenu_osx.mm:114
-msgid "Minimize"
-msgstr ""
-
-#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:45
-msgid "Normal (no scaling)"
-msgstr "Normal (inga skalering)"
-
-#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:64
-msgctxt "lowres"
-msgid "Normal (no scaling)"
-msgstr "Normal (inga skalering)"
-
-#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2135
-#: backends/graphics/openglsdl/openglsdl-graphics.cpp:537
-#, fuzzy
-msgid "Enabled aspect ratio correction"
-msgstr "Veksle aspekt-korrigering"
-
-#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2141
-#: backends/graphics/openglsdl/openglsdl-graphics.cpp:542
-#, fuzzy
-msgid "Disabled aspect ratio correction"
-msgstr "Veksle aspekt-korrigering"
-
-#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2196
-#, fuzzy
-msgid "Active graphics filter:"
-msgstr "Veksle grafikkfiltre"
-
-#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2238
-#: backends/graphics/openglsdl/openglsdl-graphics.cpp:481
-#, fuzzy
-msgid "Windowed mode"
-msgstr "Teiknemodus:"
-
-#: backends/graphics/opengl/opengl-graphics.cpp:135
-msgid "OpenGL Normal"
-msgstr "OpenGL Normal"
-
-#: backends/graphics/opengl/opengl-graphics.cpp:136
-msgid "OpenGL Conserve"
-msgstr "OpenGL Bevar"
-
-#: backends/graphics/opengl/opengl-graphics.cpp:137
-msgid "OpenGL Original"
-msgstr "OpenGL Original"
-
-#: backends/graphics/openglsdl/openglsdl-graphics.cpp:415
-#, fuzzy
-msgid "Current display mode"
-msgstr "Gjeldende videomodus:"
-
-#: backends/graphics/openglsdl/openglsdl-graphics.cpp:428
-msgid "Current scale"
-msgstr ""
-
-#: backends/graphics/openglsdl/openglsdl-graphics.cpp:562
-msgid "Active filter mode: Linear"
-msgstr ""
-
-#: backends/graphics/openglsdl/openglsdl-graphics.cpp:564
-msgid "Active filter mode: Nearest"
-msgstr ""
-
-#: backends/platform/symbian/src/SymbianActions.cpp:38
-#: backends/platform/wince/CEActionsSmartphone.cpp:39
-msgid "Up"
-msgstr "Opp"
-
-#: backends/platform/symbian/src/SymbianActions.cpp:39
-#: backends/platform/wince/CEActionsSmartphone.cpp:40
-msgid "Down"
-msgstr "Ned"
-
-#: backends/platform/symbian/src/SymbianActions.cpp:40
-#: backends/platform/wince/CEActionsSmartphone.cpp:41
-msgid "Left"
-msgstr "Venstre"
-
-#: backends/platform/symbian/src/SymbianActions.cpp:41
-#: backends/platform/wince/CEActionsSmartphone.cpp:42
-msgid "Right"
-msgstr "Høgre"
-
-#: backends/platform/symbian/src/SymbianActions.cpp:46
-#: backends/platform/wince/CEActionsSmartphone.cpp:47
-msgid "Zone"
-msgstr "Sone"
-
-#: backends/platform/symbian/src/SymbianActions.cpp:47
-#: backends/platform/wince/CEActionsPocket.cpp:54
-#: backends/platform/wince/CEActionsSmartphone.cpp:48
-msgid "Multi Function"
-msgstr ""
-
-#: backends/platform/symbian/src/SymbianActions.cpp:48
-msgid "Swap character"
-msgstr ""
-
-#: backends/platform/symbian/src/SymbianActions.cpp:49
-msgid "Skip text"
-msgstr ""
-
-#: backends/platform/symbian/src/SymbianActions.cpp:51
-msgid "Fast mode"
-msgstr "Rask modus"
-
-#: backends/platform/symbian/src/SymbianActions.cpp:53
-msgid "Debugger"
-msgstr "Debugger"
-
-#: backends/platform/symbian/src/SymbianActions.cpp:54
-msgid "Global menu"
-msgstr "Globalmeny"
-
-#: backends/platform/symbian/src/SymbianActions.cpp:55
-msgid "Virtual keyboard"
-msgstr ""
-
-#: backends/platform/symbian/src/SymbianActions.cpp:56
-msgid "Key mapper"
-msgstr "Tastkopler"
-
-#: backends/events/symbiansdl/symbiansdl-events.cpp:184
-msgid "Do you want to quit ?"
-msgstr "Vil du avslutte?"
-
-#: backends/platform/wii/options.cpp:51
-msgid "Video"
-msgstr "Video"
-
-#: backends/platform/wii/options.cpp:54
-msgid "Current video mode:"
-msgstr "Gjeldende videomodus:"
-
-#: backends/platform/wii/options.cpp:56
-msgid "Double-strike"
-msgstr ""
-
-#: backends/platform/wii/options.cpp:60
-msgid "Horizontal underscan:"
-msgstr "Horisontal underscan:"
-
-#: backends/platform/wii/options.cpp:66
-msgid "Vertical underscan:"
-msgstr "Vertikal underscan:"
-
-#: backends/platform/wii/options.cpp:71
-msgid "Input"
-msgstr "Input"
-
-#: backends/platform/wii/options.cpp:74
-msgid "GC Pad sensitivity:"
-msgstr ""
-
-#: backends/platform/wii/options.cpp:80
-msgid "GC Pad acceleration:"
-msgstr ""
-
-#: backends/platform/wii/options.cpp:86
-msgid "DVD"
-msgstr "DVD"
-
-#: backends/platform/wii/options.cpp:89 backends/platform/wii/options.cpp:101
-msgid "Status:"
-msgstr "Status:"
-
-#: backends/platform/wii/options.cpp:90 backends/platform/wii/options.cpp:102
-msgid "Unknown"
-msgstr "Ukjend"
-
-#: backends/platform/wii/options.cpp:93
-msgid "Mount DVD"
-msgstr "Monter DVD"
-
-#: backends/platform/wii/options.cpp:94
-msgid "Unmount DVD"
-msgstr "Løs ut DVD"
-
-#: backends/platform/wii/options.cpp:98
-msgid "SMB"
-msgstr "SMB"
-
-#: backends/platform/wii/options.cpp:106
-msgid "Server:"
-msgstr "Teinar:"
-
-#: backends/platform/wii/options.cpp:110
-msgid "Share:"
-msgstr ""
-
-#: backends/platform/wii/options.cpp:114
-msgid "Username:"
-msgstr "Brukarnamn:"
-
-#: backends/platform/wii/options.cpp:118
-msgid "Password:"
-msgstr "Passord:"
-
-#: backends/platform/wii/options.cpp:121
-msgid "Init network"
-msgstr "Init nettverk"
-
-#: backends/platform/wii/options.cpp:123
-msgid "Mount SMB"
-msgstr "Monter SMB"
-
-#: backends/platform/wii/options.cpp:124
-msgid "Unmount SMB"
-msgstr "Avmonter SMB"
-
-#: backends/platform/wii/options.cpp:143
-msgid "DVD Mounted successfully"
-msgstr "DVD-montering fullført"
-
-#: backends/platform/wii/options.cpp:146
-msgid "Error while mounting the DVD"
-msgstr "Feil under montering av DVD"
-
-#: backends/platform/wii/options.cpp:148
-msgid "DVD not mounted"
-msgstr "DVD ikkje montert"
-
-#: backends/platform/wii/options.cpp:161
-msgid "Network up, share mounted"
-msgstr "Nettverket er oppe, delt ressurs montert"
-
-#: backends/platform/wii/options.cpp:163
-msgid "Network up"
-msgstr "Nettverket er oppe"
-
-#: backends/platform/wii/options.cpp:166
-msgid ", error while mounting the share"
-msgstr ""
-
-#: backends/platform/wii/options.cpp:168
-msgid ", share not mounted"
-msgstr ", delt ressurs ikkje montert"
-
-#: backends/platform/wii/options.cpp:174
-msgid "Network down"
-msgstr "Nettverket er nede"
-
-#: backends/platform/wii/options.cpp:178
-#, fuzzy
-msgid "Initializing network"
-msgstr "Initialiserer nettverk"
-
-#: backends/platform/wii/options.cpp:182
-#, fuzzy
-msgid "Timeout while initializing network"
-msgstr "Initialiserer nettverk"
-
-#: backends/platform/wii/options.cpp:186
-#, fuzzy, c-format
-msgid "Network not initialized (%d)"
-msgstr "Nettverk ikkje initialisert (%d)"
-
-#: backends/platform/wince/CEActionsPocket.cpp:46
-msgid "Hide Toolbar"
-msgstr "Skjul verktøylinje"
-
-#: backends/platform/wince/CEActionsPocket.cpp:47
-msgid "Show Keyboard"
-msgstr "Syn tastatur"
-
-#: backends/platform/wince/CEActionsPocket.cpp:48
-msgid "Sound on/off"
-msgstr "Lyd av/på"
-
-#: backends/platform/wince/CEActionsPocket.cpp:49
-msgid "Right click"
-msgstr "Høgreklikk"
-
-#: backends/platform/wince/CEActionsPocket.cpp:50
-msgid "Show/Hide Cursor"
-msgstr "Vis/Skjul Peikar"
-
-#: backends/platform/wince/CEActionsPocket.cpp:51
-msgid "Free look"
-msgstr "Frikikking"
-
-#: backends/platform/wince/CEActionsPocket.cpp:52
-msgid "Zoom up"
-msgstr "Zoom opp"
-
-#: backends/platform/wince/CEActionsPocket.cpp:53
-msgid "Zoom down"
-msgstr "Zoom ned"
-
-#: backends/platform/wince/CEActionsPocket.cpp:55
-#: backends/platform/wince/CEActionsSmartphone.cpp:49
-msgid "Bind Keys"
-msgstr "Kople tastar"
-
-#: backends/platform/wince/CEActionsPocket.cpp:56
-msgid "Cursor Up"
-msgstr "Peikar opp"
-
-#: backends/platform/wince/CEActionsPocket.cpp:57
-msgid "Cursor Down"
-msgstr "Peikar ned"
-
-#: backends/platform/wince/CEActionsPocket.cpp:58
-msgid "Cursor Left"
-msgstr "Peikar venstre"
-
-#: backends/platform/wince/CEActionsPocket.cpp:59
-msgid "Cursor Right"
-msgstr "Peikar høgre"
-
-#: 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:326
-#: backends/platform/wince/CEActionsSmartphone.cpp:287
-msgid " Are you sure you want to quit ? "
-msgstr "Er du sikker på at du vil avslutte?"
-
-#: backends/platform/wince/CEActionsSmartphone.cpp:50
-msgid "Keyboard"
-msgstr "Tastatur"
-
-#: backends/platform/wince/CEActionsSmartphone.cpp:51
-msgid "Rotate"
-msgstr "Roter"
-
-#: backends/platform/wince/CELauncherDialog.cpp:56
-msgid "Using SDL driver "
-msgstr "Nyttar SDL-drivar"
-
-#: backends/platform/wince/CELauncherDialog.cpp:60
-msgid "Display "
-msgstr "Skjerm"
-
-#: 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:515
-msgid "Map right click action"
-msgstr "Kople høgreklikkshandling"
-
-#: 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:528
-msgid "Map hide toolbar action"
-msgstr "Kople skjul-verktøylinje-handlinga"
-
-#: 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:541
-msgid "Map Zoom Up action (optional)"
-msgstr "Kople Zoom Opp-handling (valfri)"
-
-#: 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:552
-msgid ""
-"Don't forget to map a key to 'Hide Toolbar' action to see the whole inventory"
-msgstr ""
-"Ikkje gløym å kople ein tast til 'Skjul verktøylinje' for å se heile "
-"inventaret"
-
-#: backends/events/default/default-events.cpp:193
-#, fuzzy
-msgid "Do you really want to return to the Launcher?"
-msgstr "Vil du verkeleg slette det lagra spelet?"
-
-#: backends/events/default/default-events.cpp:193
-#, fuzzy
-msgid "Launcher"
-msgstr "Slå"
-
-#: backends/events/default/default-events.cpp:215
-#, fuzzy
-msgid "Do you really want to quit?"
-msgstr "Vil du avslutte?"
-
-#: backends/events/gph/gph-events.cpp:386
-#: backends/events/gph/gph-events.cpp:429
-#: backends/events/openpandora/op-events.cpp:168
-msgid "Touchscreen 'Tap Mode' - Left Click"
-msgstr ""
-
-#: backends/events/gph/gph-events.cpp:388
-#: backends/events/gph/gph-events.cpp:431
-#: backends/events/openpandora/op-events.cpp:170
-msgid "Touchscreen 'Tap Mode' - Right Click"
-msgstr ""
-
-#: backends/events/gph/gph-events.cpp:390
-#: backends/events/gph/gph-events.cpp:433
-#: backends/events/openpandora/op-events.cpp:172
-msgid "Touchscreen 'Tap Mode' - Hover (No Click)"
-msgstr ""
-
-#: backends/events/gph/gph-events.cpp:410
-#, fuzzy
-msgid "Maximum Volume"
-msgstr "Volum"
-
-#: backends/events/gph/gph-events.cpp:412
-msgid "Increasing Volume"
-msgstr ""
-
-#: backends/events/gph/gph-events.cpp:418
-#, fuzzy
-msgid "Minimal Volume"
-msgstr "Volum"
-
-#: backends/events/gph/gph-events.cpp:420
-msgid "Decreasing Volume"
-msgstr ""
+#~ msgctxt "lowres"
+#~ msgid "Mass Add..."
+#~ msgstr "Legg til fleire..."
-#: backends/events/openpandora/op-events.cpp:174
-msgid "Touchscreen 'Tap Mode' - Hover (DPad Clicks)"
-msgstr ""
+#~ msgid "Mass Add..."
+#~ msgstr "Legg til fleire..."
-#: backends/updates/macosx/macosx-updates.mm:67
-msgid "Check for Updates..."
-msgstr ""
+#~ msgid ""
+#~ "Turns off General MIDI mapping for games with Roland MT-32 soundtrack"
+#~ msgstr "Slår av General MIDI-kopling for spel med Roland MT-32 lydspor"
-#: backends/platform/bada/form.cpp:269
-#, fuzzy
-msgid "Right Click Once"
-msgstr "Høgreklikk"
+#~ msgid "Standard (16bpp)"
+#~ msgstr "Standard (16bpp)"
-#: backends/platform/bada/form.cpp:277
-#, fuzzy
-msgid "Move Only"
-msgstr "Tale"
+#~ msgid "OpenGL Normal"
+#~ msgstr "OpenGL Normal"
-#: backends/platform/bada/form.cpp:291
-msgid "Escape Key"
-msgstr ""
+#~ msgid "OpenGL Conserve"
+#~ msgstr "OpenGL Bevar"
-#: backends/platform/bada/form.cpp:296
-#, fuzzy
-msgid "Game Menu"
-msgstr "Spel"
+#~ msgid "OpenGL Original"
+#~ msgstr "OpenGL Original"
-#: 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:192
-msgid "Clicking Enabled"
-msgstr ""
-
-#: backends/events/maemosdl/maemosdl-events.cpp:192
-msgid "Clicking Disabled"
-msgstr ""
+#~ msgid "Current display mode"
+#~ msgstr "Gjeldende videomodus:"
#~ msgid "Enable Roland GS Mode"
#~ msgstr "Aktiver Roland GS-modus"
diff --git a/po/pl_PL.po b/po/pl_PL.po
index 38cedb55d7..e42a0a8356 100644
--- a/po/pl_PL.po
+++ b/po/pl_PL.po
@@ -1,5 +1,5 @@
# Polish translation for ScummVM.
-# Copyright (C) 2010-2013 ScummVM Team
+# Copyright (C) 2010-2014 ScummVM Team
# This file is distributed under the same license as the ScummVM package.
# Grajpopolsku.pl <grajpopolsku@gmail.com>, 2011-2013.
#
@@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: ScummVM 1.3.0\n"
"Report-Msgid-Bugs-To: scummvm-devel@lists.sf.net\n"
-"POT-Creation-Date: 2013-04-24 13:35+0100\n"
+"POT-Creation-Date: 2014-06-07 23:06+0100\n"
"PO-Revision-Date: 2013-05-22 14:26+0100\n"
"Last-Translator: Micha³ Zi±bkowski <mziab@o2.pl>\n"
"Language-Team: Grajpopolsku.pl <grajpopolsku@gmail.com>\n"
@@ -20,77 +20,77 @@ msgstr ""
"X-Poedit-Language: Polish\n"
"X-Poedit-Country: POLAND\n"
-#: gui/about.cpp:93
+#: gui/about.cpp:94
#, c-format
msgid "(built on %s)"
msgstr "(skompilowany %s)"
-#: gui/about.cpp:100
+#: gui/about.cpp:101
msgid "Features compiled in:"
msgstr "Wkompilowane funkcje:"
-#: gui/about.cpp:109
+#: gui/about.cpp:110
msgid "Available engines:"
msgstr "Dostêpne silniki:"
-#: gui/browser.cpp:67
+#: gui/browser.cpp:68
msgid "Show hidden files"
msgstr "Poka¿ ukryte pliki"
-#: gui/browser.cpp:67
+#: gui/browser.cpp:68
msgid "Show files marked with the hidden attribute"
msgstr "Poka¿ pliki oznaczone atrybutem ukryty"
-#: gui/browser.cpp:71
+#: gui/browser.cpp:72
msgid "Go up"
msgstr "W górê"
-#: gui/browser.cpp:71 gui/browser.cpp:73
+#: gui/browser.cpp:72 gui/browser.cpp:74
msgid "Go to previous directory level"
msgstr "Przejd¼ do poprzedniego katalogu"
-#: gui/browser.cpp:73
+#: gui/browser.cpp:74
msgctxt "lowres"
msgid "Go up"
msgstr "W górê"
-#: gui/browser.cpp:74 gui/chooser.cpp:45 gui/KeysDialog.cpp:43
-#: gui/launcher.cpp:345 gui/massadd.cpp:94 gui/options.cpp:1238
-#: gui/saveload-dialog.cpp:215 gui/saveload-dialog.cpp:275
-#: gui/saveload-dialog.cpp:545 gui/saveload-dialog.cpp:919
-#: gui/themebrowser.cpp:54 gui/fluidsynth-dialog.cpp:151
-#: engines/engine.cpp:447 engines/drascula/saveload.cpp:51
-#: engines/scumm/dialogs.cpp:190 engines/sword1/control.cpp:865
-#: engines/parallaction/saveload.cpp:274 backends/platform/wii/options.cpp:48
-#: backends/events/default/default-events.cpp:193
-#: backends/events/default/default-events.cpp:215
+#: gui/browser.cpp:75 gui/chooser.cpp:46 gui/KeysDialog.cpp:43
+#: gui/launcher.cpp:351 gui/massadd.cpp:95 gui/options.cpp:1239
+#: gui/saveload-dialog.cpp:216 gui/saveload-dialog.cpp:276
+#: gui/saveload-dialog.cpp:547 gui/saveload-dialog.cpp:922
+#: gui/themebrowser.cpp:55 gui/fluidsynth-dialog.cpp:152
+#: engines/engine.cpp:452 backends/platform/wii/options.cpp:48
+#: backends/events/default/default-events.cpp:196
+#: backends/events/default/default-events.cpp:218
+#: engines/drascula/saveload.cpp:49 engines/parallaction/saveload.cpp:274
+#: engines/scumm/dialogs.cpp:191 engines/sword1/control.cpp:865
msgid "Cancel"
msgstr "Anuluj"
-#: gui/browser.cpp:75 gui/chooser.cpp:46 gui/themebrowser.cpp:55
+#: gui/browser.cpp:76 gui/chooser.cpp:47 gui/themebrowser.cpp:56
msgid "Choose"
msgstr "Wybierz"
-#: gui/gui-manager.cpp:115 engines/scumm/help.cpp:125
-#: engines/scumm/help.cpp:140 engines/scumm/help.cpp:165
-#: engines/scumm/help.cpp:191 engines/scumm/help.cpp:209
-#: backends/keymapper/remap-dialog.cpp:52
+#: gui/gui-manager.cpp:117 backends/keymapper/remap-dialog.cpp:53
+#: engines/scumm/help.cpp:125 engines/scumm/help.cpp:140
+#: engines/scumm/help.cpp:165 engines/scumm/help.cpp:191
+#: engines/scumm/help.cpp:209
msgid "Close"
msgstr "Zamknij"
-#: gui/gui-manager.cpp:118
+#: gui/gui-manager.cpp:120
msgid "Mouse click"
msgstr "Klikniêcie"
-#: gui/gui-manager.cpp:122 base/main.cpp:301
+#: gui/gui-manager.cpp:124 base/main.cpp:319
msgid "Display keyboard"
msgstr "Wy¶wietl klawiaturê"
-#: gui/gui-manager.cpp:126 base/main.cpp:305
+#: gui/gui-manager.cpp:128 base/main.cpp:323
msgid "Remap keys"
msgstr "Dostosuj klawisze"
-#: gui/gui-manager.cpp:129 base/main.cpp:308
+#: gui/gui-manager.cpp:131 base/main.cpp:326
msgid "Toggle FullScreen"
msgstr "W³±cz/wy³±cz pe³ny ekran"
@@ -102,21 +102,21 @@ msgstr "Wybierz akcjê do przypisania"
msgid "Map"
msgstr "Przypisz"
-#: gui/KeysDialog.cpp:42 gui/launcher.cpp:346 gui/launcher.cpp:1001
-#: gui/launcher.cpp:1005 gui/massadd.cpp:91 gui/options.cpp:1239
-#: gui/saveload-dialog.cpp:920 gui/fluidsynth-dialog.cpp:152
-#: engines/engine.cpp:366 engines/engine.cpp:377
-#: engines/drascula/saveload.cpp:51 engines/scumm/dialogs.cpp:192
-#: engines/scumm/scumm.cpp:1778 engines/agos/animation.cpp:558
-#: engines/groovie/script.cpp:420 engines/sky/compact.cpp:131
-#: engines/sky/compact.cpp:141 engines/sword1/animation.cpp:519
-#: engines/sword1/animation.cpp:540 engines/sword1/animation.cpp:550
-#: engines/sword1/animation.cpp:557 engines/sword1/control.cpp:865
-#: engines/sword1/logic.cpp:1633 engines/sword2/animation.cpp:419
-#: engines/sword2/animation.cpp:439 engines/sword2/animation.cpp:449
-#: engines/sword2/animation.cpp:458 engines/parallaction/saveload.cpp:274
+#: gui/KeysDialog.cpp:42 gui/launcher.cpp:352 gui/launcher.cpp:1048
+#: gui/launcher.cpp:1052 gui/massadd.cpp:92 gui/options.cpp:1240
+#: gui/saveload-dialog.cpp:923 gui/fluidsynth-dialog.cpp:153
+#: engines/engine.cpp:371 engines/engine.cpp:382
#: backends/platform/wii/options.cpp:47
#: backends/platform/wince/CELauncherDialog.cpp:54
+#: engines/agos/animation.cpp:558 engines/drascula/saveload.cpp:49
+#: engines/groovie/script.cpp:399 engines/parallaction/saveload.cpp:274
+#: engines/scumm/dialogs.cpp:193 engines/scumm/scumm.cpp:1779
+#: engines/sky/compact.cpp:131 engines/sky/compact.cpp:141
+#: engines/sword1/animation.cpp:524 engines/sword1/animation.cpp:545
+#: engines/sword1/animation.cpp:561 engines/sword1/animation.cpp:569
+#: engines/sword1/control.cpp:865 engines/sword1/logic.cpp:1633
+#: engines/sword2/animation.cpp:425 engines/sword2/animation.cpp:445
+#: engines/sword2/animation.cpp:461 engines/sword2/animation.cpp:471
msgid "OK"
msgstr "OK"
@@ -142,15 +142,15 @@ msgstr "Wybierz akcjê"
msgid "Press the key to associate"
msgstr "Wci¶nij klawisz do przypisania"
-#: gui/launcher.cpp:187
+#: gui/launcher.cpp:193
msgid "Game"
msgstr "Gra"
-#: gui/launcher.cpp:191
+#: gui/launcher.cpp:197
msgid "ID:"
msgstr "ID:"
-#: gui/launcher.cpp:191 gui/launcher.cpp:193 gui/launcher.cpp:194
+#: gui/launcher.cpp:197 gui/launcher.cpp:199 gui/launcher.cpp:200
msgid ""
"Short game identifier used for referring to savegames and running the game "
"from the command line"
@@ -158,321 +158,323 @@ msgstr ""
"Krótki identyfikator gry u¿ywany do rozpoznawania zapisów i uruchamiania gry "
"z linii komend"
-#: gui/launcher.cpp:193
+#: gui/launcher.cpp:199
msgctxt "lowres"
msgid "ID:"
msgstr "ID:"
-#: gui/launcher.cpp:198
+#: gui/launcher.cpp:204
msgid "Name:"
msgstr "Nazwa:"
-#: gui/launcher.cpp:198 gui/launcher.cpp:200 gui/launcher.cpp:201
+#: gui/launcher.cpp:204 gui/launcher.cpp:206 gui/launcher.cpp:207
msgid "Full title of the game"
msgstr "Pe³ny tytu³ gry:"
-#: gui/launcher.cpp:200
+#: gui/launcher.cpp:206
msgctxt "lowres"
msgid "Name:"
msgstr "Nazwa:"
-#: gui/launcher.cpp:204
+#: gui/launcher.cpp:210
msgid "Language:"
msgstr "Jêzyk:"
-#: gui/launcher.cpp:204 gui/launcher.cpp:205
+#: gui/launcher.cpp:210 gui/launcher.cpp:211
msgid ""
"Language of the game. This will not turn your Spanish game version into "
"English"
msgstr "Jêzyk gry. Nie zmieni to hiszpañskiej wersji gry w angielsk±."
-#: gui/launcher.cpp:206 gui/launcher.cpp:220 gui/options.cpp:86
-#: gui/options.cpp:736 gui/options.cpp:749 gui/options.cpp:1209
-#: audio/null.cpp:40
+#: gui/launcher.cpp:212 gui/launcher.cpp:226 gui/options.cpp:87
+#: gui/options.cpp:737 gui/options.cpp:750 gui/options.cpp:1210
+#: audio/null.cpp:41
msgid "<default>"
msgstr "<domy¶lne>"
-#: gui/launcher.cpp:216
+#: gui/launcher.cpp:222
msgid "Platform:"
msgstr "Platforma:"
-#: gui/launcher.cpp:216 gui/launcher.cpp:218 gui/launcher.cpp:219
+#: gui/launcher.cpp:222 gui/launcher.cpp:224 gui/launcher.cpp:225
msgid "Platform the game was originally designed for"
msgstr "Platforma, na któr± stworzono grê"
-#: gui/launcher.cpp:218
+#: gui/launcher.cpp:224
msgctxt "lowres"
msgid "Platform:"
msgstr "Platforma:"
-#: gui/launcher.cpp:231
+#: gui/launcher.cpp:237
msgid "Engine"
msgstr "Silnik"
-#: gui/launcher.cpp:239 gui/options.cpp:1072 gui/options.cpp:1089
+#: gui/launcher.cpp:245 gui/options.cpp:1073 gui/options.cpp:1090
msgid "Graphics"
msgstr "Grafika"
-#: gui/launcher.cpp:239 gui/options.cpp:1072 gui/options.cpp:1089
+#: gui/launcher.cpp:245 gui/options.cpp:1073 gui/options.cpp:1090
msgid "GFX"
msgstr "Grafika"
-#: gui/launcher.cpp:242
+#: gui/launcher.cpp:248
msgid "Override global graphic settings"
msgstr "U¿yj w³asnych ustawieñ grafiki"
-#: gui/launcher.cpp:244
+#: gui/launcher.cpp:250
msgctxt "lowres"
msgid "Override global graphic settings"
msgstr "U¿yj w³asnych ustawieñ grafiki"
-#: gui/launcher.cpp:251 gui/options.cpp:1095
+#: gui/launcher.cpp:257 gui/options.cpp:1096
msgid "Audio"
msgstr "D¼wiêk"
-#: gui/launcher.cpp:254
+#: gui/launcher.cpp:260
msgid "Override global audio settings"
msgstr "U¿yj w³asnych ustawieñ d¼wiêku"
-#: gui/launcher.cpp:256
+#: gui/launcher.cpp:262
msgctxt "lowres"
msgid "Override global audio settings"
msgstr "U¿yj w³asnych ustawieñ d¼wiêku"
-#: gui/launcher.cpp:265 gui/options.cpp:1100
+#: gui/launcher.cpp:271 gui/options.cpp:1101
msgid "Volume"
msgstr "G³o¶no¶æ"
-#: gui/launcher.cpp:267 gui/options.cpp:1102
+#: gui/launcher.cpp:273 gui/options.cpp:1103
msgctxt "lowres"
msgid "Volume"
msgstr "G³o¶no¶æ"
-#: gui/launcher.cpp:270
+#: gui/launcher.cpp:276
msgid "Override global volume settings"
msgstr "U¿yj w³asnych ustawieñ g³o¶no¶ci"
-#: gui/launcher.cpp:272
+#: gui/launcher.cpp:278
msgctxt "lowres"
msgid "Override global volume settings"
msgstr "U¿yj w³asnych ustawieñ g³o¶no¶ci"
-#: gui/launcher.cpp:280 gui/options.cpp:1110
+#: gui/launcher.cpp:286 gui/options.cpp:1111
msgid "MIDI"
msgstr "MIDI"
-#: gui/launcher.cpp:283
+#: gui/launcher.cpp:289
msgid "Override global MIDI settings"
msgstr "U¿yj w³asnych ustawieñ MIDI"
-#: gui/launcher.cpp:285
+#: gui/launcher.cpp:291
msgctxt "lowres"
msgid "Override global MIDI settings"
msgstr "U¿yj w³asnych ustawieñ MIDI"
-#: gui/launcher.cpp:294 gui/options.cpp:1116
+#: gui/launcher.cpp:300 gui/options.cpp:1117
msgid "MT-32"
msgstr "MT-32"
-#: gui/launcher.cpp:297
+#: gui/launcher.cpp:303
msgid "Override global MT-32 settings"
msgstr "U¿yj w³asnych ustawieñ MT-32"
-#: gui/launcher.cpp:299
+#: gui/launcher.cpp:305
msgctxt "lowres"
msgid "Override global MT-32 settings"
msgstr "U¿yj w³asnych ustawieñ MT-32"
-#: gui/launcher.cpp:308 gui/options.cpp:1123
+#: gui/launcher.cpp:314 gui/options.cpp:1124
msgid "Paths"
msgstr "¦cie¿ki"
-#: gui/launcher.cpp:310 gui/options.cpp:1125
+#: gui/launcher.cpp:316 gui/options.cpp:1126
msgctxt "lowres"
msgid "Paths"
msgstr "¦cie¿ki"
-#: gui/launcher.cpp:317
+#: gui/launcher.cpp:323
msgid "Game Path:"
msgstr "¦cie¿ka gry:"
-#: gui/launcher.cpp:319
+#: gui/launcher.cpp:325
msgctxt "lowres"
msgid "Game Path:"
msgstr "¦cie¿ka gry:"
-#: gui/launcher.cpp:324 gui/options.cpp:1149
+#: gui/launcher.cpp:330 gui/options.cpp:1150
msgid "Extra Path:"
msgstr "¦c. dodatków:"
-#: gui/launcher.cpp:324 gui/launcher.cpp:326 gui/launcher.cpp:327
+#: gui/launcher.cpp:330 gui/launcher.cpp:332 gui/launcher.cpp:333
msgid "Specifies path to additional data used the game"
msgstr "Okre¶la ¶cie¿kê dodatkowych danych gry"
-#: gui/launcher.cpp:326 gui/options.cpp:1151
+#: gui/launcher.cpp:332 gui/options.cpp:1152
msgctxt "lowres"
msgid "Extra Path:"
msgstr "¦c. dodatków:"
-#: gui/launcher.cpp:333 gui/options.cpp:1133
+#: gui/launcher.cpp:339 gui/options.cpp:1134
msgid "Save Path:"
msgstr "¦cie¿ka zapisów:"
-#: gui/launcher.cpp:333 gui/launcher.cpp:335 gui/launcher.cpp:336
-#: gui/options.cpp:1133 gui/options.cpp:1135 gui/options.cpp:1136
+#: gui/launcher.cpp:339 gui/launcher.cpp:341 gui/launcher.cpp:342
+#: gui/options.cpp:1134 gui/options.cpp:1136 gui/options.cpp:1137
msgid "Specifies where your savegames are put"
msgstr "Okre¶la gdzie zapisywaæ stan gry"
-#: gui/launcher.cpp:335 gui/options.cpp:1135
+#: gui/launcher.cpp:341 gui/options.cpp:1136
msgctxt "lowres"
msgid "Save Path:"
msgstr "¦cie¿ka zapisów:"
-#: gui/launcher.cpp:354 gui/launcher.cpp:453 gui/launcher.cpp:511
-#: gui/launcher.cpp:565 gui/options.cpp:1144 gui/options.cpp:1152
-#: gui/options.cpp:1161 gui/options.cpp:1276 gui/options.cpp:1282
-#: gui/options.cpp:1290 gui/options.cpp:1320 gui/options.cpp:1326
-#: gui/options.cpp:1333 gui/options.cpp:1426 gui/options.cpp:1429
-#: gui/options.cpp:1441
+#: gui/launcher.cpp:360 gui/launcher.cpp:459 gui/launcher.cpp:517
+#: gui/launcher.cpp:571 gui/options.cpp:1145 gui/options.cpp:1153
+#: gui/options.cpp:1162 gui/options.cpp:1277 gui/options.cpp:1283
+#: gui/options.cpp:1291 gui/options.cpp:1321 gui/options.cpp:1327
+#: gui/options.cpp:1334 gui/options.cpp:1427 gui/options.cpp:1430
+#: gui/options.cpp:1442
msgctxt "path"
msgid "None"
msgstr "Brak"
-#: gui/launcher.cpp:359 gui/launcher.cpp:459 gui/launcher.cpp:569
-#: gui/options.cpp:1270 gui/options.cpp:1314 gui/options.cpp:1432
+#: gui/launcher.cpp:365 gui/launcher.cpp:465 gui/launcher.cpp:575
+#: gui/options.cpp:1271 gui/options.cpp:1315 gui/options.cpp:1433
#: backends/platform/wii/options.cpp:56
msgid "Default"
msgstr "Domy¶lnie"
-#: gui/launcher.cpp:504 gui/options.cpp:1435
+#: gui/launcher.cpp:510 gui/options.cpp:1436
msgid "Select SoundFont"
msgstr "Wybierz SoundFont"
-#: gui/launcher.cpp:523 gui/launcher.cpp:677
+#: gui/launcher.cpp:529 gui/launcher.cpp:682
msgid "Select directory with game data"
msgstr "Wybierz katalog z plikami gry"
-#: gui/launcher.cpp:541
+#: gui/launcher.cpp:547
msgid "Select additional game directory"
msgstr "Wybierz dodatkowy katalog gry"
-#: gui/launcher.cpp:553
+#: gui/launcher.cpp:559
msgid "Select directory for saved games"
msgstr "Wybierz katalog dla zapisów"
-#: gui/launcher.cpp:580
+#: gui/launcher.cpp:586
msgid "This game ID is already taken. Please choose another one."
msgstr "Identyfikator jest ju¿ zajêty. Wybierz inny."
-#: gui/launcher.cpp:621 engines/dialogs.cpp:110
+#: gui/launcher.cpp:626 engines/dialogs.cpp:111
msgid "~Q~uit"
msgstr "~Z~akoñcz"
-#: gui/launcher.cpp:621 backends/platform/sdl/macosx/appmenu_osx.mm:95
+#: gui/launcher.cpp:626 backends/platform/sdl/macosx/appmenu_osx.mm:95
msgid "Quit ScummVM"
msgstr "Zakoñcz ScummVM"
-#: gui/launcher.cpp:622
+#: gui/launcher.cpp:627
msgid "A~b~out..."
msgstr "I~n~formacje..."
-#: gui/launcher.cpp:622 backends/platform/sdl/macosx/appmenu_osx.mm:69
+#: gui/launcher.cpp:627 backends/platform/sdl/macosx/appmenu_osx.mm:69
msgid "About ScummVM"
msgstr "Ksi±¿ka ScummVM"
-#: gui/launcher.cpp:623
+#: gui/launcher.cpp:628
msgid "~O~ptions..."
msgstr "~O~pcje..."
-#: gui/launcher.cpp:623
+#: gui/launcher.cpp:628
msgid "Change global ScummVM options"
msgstr "Zmieñ ustawienia ScummVM"
-#: gui/launcher.cpp:625
+#: gui/launcher.cpp:630
msgid "~S~tart"
msgstr "~S~tart"
-#: gui/launcher.cpp:625
+#: gui/launcher.cpp:630
msgid "Start selected game"
msgstr "Rozpocznij wybran± grê"
-#: gui/launcher.cpp:628
+#: gui/launcher.cpp:633
msgid "~L~oad..."
msgstr "~W~czytaj..."
-#: gui/launcher.cpp:628
+#: gui/launcher.cpp:633
msgid "Load savegame for selected game"
msgstr "Wczytaj zapis wybranej gry"
-#: gui/launcher.cpp:633 gui/launcher.cpp:1120
+#: gui/launcher.cpp:638
msgid "~A~dd Game..."
msgstr "~D~odaj grê..."
-#: gui/launcher.cpp:633 gui/launcher.cpp:640
+#: gui/launcher.cpp:638 gui/launcher.cpp:645
msgid "Hold Shift for Mass Add"
msgstr "Przytrzymaj Shift, by dodawaæ zbiorowo"
-#: gui/launcher.cpp:635
+#: gui/launcher.cpp:640
msgid "~E~dit Game..."
msgstr "~E~dytuj grê..."
-#: gui/launcher.cpp:635 gui/launcher.cpp:642
+#: gui/launcher.cpp:640 gui/launcher.cpp:647
msgid "Change game options"
msgstr "Zmieñ opcje gry"
-#: gui/launcher.cpp:637
+#: gui/launcher.cpp:642
msgid "~R~emove Game"
msgstr "~U~suñ grê"
-#: gui/launcher.cpp:637 gui/launcher.cpp:644
+#: gui/launcher.cpp:642 gui/launcher.cpp:649
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:640 gui/launcher.cpp:1120
+#: gui/launcher.cpp:645
msgctxt "lowres"
msgid "~A~dd Game..."
msgstr "~D~odaj grê..."
-#: gui/launcher.cpp:642
+#: gui/launcher.cpp:647
msgctxt "lowres"
msgid "~E~dit Game..."
msgstr "~E~dytuj grê..."
-#: gui/launcher.cpp:644
+#: gui/launcher.cpp:649
msgctxt "lowres"
msgid "~R~emove Game"
msgstr "~U~suñ grê"
-#: gui/launcher.cpp:652
+#: gui/launcher.cpp:657
msgid "Search in game list"
msgstr "Wyszukaj grê na li¶cie"
-#: gui/launcher.cpp:656 gui/launcher.cpp:1167
+#: gui/launcher.cpp:661 gui/launcher.cpp:1222
msgid "Search:"
msgstr "Szukaj"
-#: gui/launcher.cpp:680 engines/dialogs.cpp:114 engines/mohawk/myst.cpp:245
-#: engines/mohawk/riven.cpp:716 engines/cruise/menu.cpp:214
-#: engines/pegasus/pegasus.cpp:349
+#: gui/launcher.cpp:685 engines/dialogs.cpp:115 engines/cruise/menu.cpp:214
+#: engines/mohawk/myst.cpp:245 engines/mohawk/riven.cpp:718
+#: engines/pegasus/pegasus.cpp:353
msgid "Load game:"
msgstr "Wczytaj grê:"
-#: gui/launcher.cpp:680 engines/dialogs.cpp:114 engines/scumm/dialogs.cpp:188
-#: engines/mohawk/myst.cpp:245 engines/mohawk/riven.cpp:716
-#: engines/cruise/menu.cpp:214 engines/pegasus/pegasus.cpp:349
+#: gui/launcher.cpp:685 engines/dialogs.cpp:115
#: backends/platform/wince/CEActionsPocket.cpp:267
#: backends/platform/wince/CEActionsSmartphone.cpp:231
+#: engines/cruise/menu.cpp:214 engines/mohawk/myst.cpp:245
+#: engines/mohawk/riven.cpp:718 engines/pegasus/pegasus.cpp:353
+#: engines/scumm/dialogs.cpp:189
msgid "Load"
msgstr "Wczytaj"
-#: gui/launcher.cpp:788
+#: gui/launcher.cpp:792
msgid ""
"Do you really want to run the mass game detector? This could potentially add "
"a huge number of games."
msgstr ""
"Chcesz uruchomiæ masowy detektor gier? Mo¿e dodaæ wiele tytu³ów do listy"
-#: gui/launcher.cpp:789 gui/launcher.cpp:937 gui/fluidsynth-dialog.cpp:216
+#: gui/launcher.cpp:793 gui/launcher.cpp:941 gui/launcher.cpp:1000
+#: gui/fluidsynth-dialog.cpp:217
#: backends/events/symbiansdl/symbiansdl-events.cpp:184
#: backends/platform/wince/CEActionsPocket.cpp:326
#: backends/platform/wince/CEActionsSmartphone.cpp:287
@@ -480,7 +482,8 @@ msgstr ""
msgid "Yes"
msgstr "Tak"
-#: gui/launcher.cpp:789 gui/launcher.cpp:937 gui/fluidsynth-dialog.cpp:216
+#: gui/launcher.cpp:793 gui/launcher.cpp:941 gui/launcher.cpp:1000
+#: gui/fluidsynth-dialog.cpp:217
#: backends/events/symbiansdl/symbiansdl-events.cpp:184
#: backends/platform/wince/CEActionsPocket.cpp:326
#: backends/platform/wince/CEActionsSmartphone.cpp:287
@@ -488,189 +491,184 @@ msgstr "Tak"
msgid "No"
msgstr "Nie"
-#: gui/launcher.cpp:837
+#: gui/launcher.cpp:841
msgid "ScummVM couldn't open the specified directory!"
msgstr "ScummVM nie mo¿e otworzyæ katalogu!"
-#: gui/launcher.cpp:849
+#: gui/launcher.cpp:853
msgid "ScummVM could not find any game in the specified directory!"
msgstr "ScummVM nie znalaz³ ¿adnej gry w tym katalogu!"
-#: gui/launcher.cpp:863
+#: gui/launcher.cpp:867
msgid "Pick the game:"
msgstr "Wybierz grê:"
-#: gui/launcher.cpp:937
+#: gui/launcher.cpp:941
msgid "Do you really want to remove this game configuration?"
msgstr "Na pewno chcesz usun±æ tê grê z konfiguracji?"
-#: gui/launcher.cpp:1001
+#: gui/launcher.cpp:999
+#, fuzzy
+msgid "Do you want to load savegame?"
+msgstr "Chcesz wczytaæ b±d¼ zapisaæ grê?"
+
+#: gui/launcher.cpp:1048
msgid "This game does not support loading games from the launcher."
msgstr "Ta gra nie wspiera wczytywania z launchera."
-#: gui/launcher.cpp:1005
+#: gui/launcher.cpp:1052
msgid "ScummVM could not find any engine capable of running the selected game!"
msgstr "ScummVM nie znalaz³ silnika zdolnego uruchomiæ wybran± grê!"
-#: gui/launcher.cpp:1119
-msgctxt "lowres"
-msgid "Mass Add..."
-msgstr "Masowe dodawanie..."
-
-#: gui/launcher.cpp:1119
-msgid "Mass Add..."
-msgstr "Masowe dodawanie..."
-
-#: gui/massadd.cpp:78 gui/massadd.cpp:81
+#: gui/massadd.cpp:79 gui/massadd.cpp:82
msgid "... progress ..."
msgstr "... postêp ..."
-#: gui/massadd.cpp:258
+#: gui/massadd.cpp:259
msgid "Scan complete!"
msgstr "Skanowanie zakoñczone!"
-#: gui/massadd.cpp:261
+#: gui/massadd.cpp:262
#, c-format
msgid "Discovered %d new games, ignored %d previously added games."
msgstr "Wykryto %d nowych gier, zignorowano %d poprzednio dodanych."
-#: gui/massadd.cpp:265
+#: gui/massadd.cpp:266
#, c-format
msgid "Scanned %d directories ..."
msgstr "Przeskanowano %d katalogów ..."
-#: gui/massadd.cpp:268
+#: gui/massadd.cpp:269
#, c-format
msgid "Discovered %d new games, ignored %d previously added games ..."
msgstr "Wykryto %d nowych gier, zignorowano %d poprzednio dodanych..."
-#: gui/options.cpp:84
+#: gui/options.cpp:85
msgid "Never"
msgstr "Nigdy"
-#: gui/options.cpp:84
+#: gui/options.cpp:85
msgid "every 5 mins"
msgstr "co 5 min"
-#: gui/options.cpp:84
+#: gui/options.cpp:85
msgid "every 10 mins"
msgstr "co 10 min"
-#: gui/options.cpp:84
+#: gui/options.cpp:85
msgid "every 15 mins"
msgstr "co 15 min"
-#: gui/options.cpp:84
+#: gui/options.cpp:85
msgid "every 30 mins"
msgstr "co 30 min"
-#: gui/options.cpp:86
+#: gui/options.cpp:87
msgid "8 kHz"
msgstr "8 kHz"
-#: gui/options.cpp:86
+#: gui/options.cpp:87
msgid "11kHz"
msgstr "11 kHz"
-#: gui/options.cpp:86
+#: gui/options.cpp:87
msgid "22 kHz"
msgstr "22 kHz"
-#: gui/options.cpp:86
+#: gui/options.cpp:87
msgid "44 kHz"
msgstr "44 kHz"
-#: gui/options.cpp:86
+#: gui/options.cpp:87
msgid "48 kHz"
msgstr "48 kHz"
-#: gui/options.cpp:254 gui/options.cpp:480 gui/options.cpp:581
-#: gui/options.cpp:650 gui/options.cpp:858
+#: gui/options.cpp:255 gui/options.cpp:481 gui/options.cpp:582
+#: gui/options.cpp:651 gui/options.cpp:859
msgctxt "soundfont"
msgid "None"
msgstr "Brak"
-#: gui/options.cpp:388
+#: gui/options.cpp:389
msgid "Failed to apply some of the graphic options changes:"
msgstr "Nie uda³o siê zastosowaæ czê¶ci zmian opcji grafiki:"
-#: gui/options.cpp:400
+#: gui/options.cpp:401
msgid "the video mode could not be changed."
msgstr "nie uda³o siê zmieniæ trybu wideo."
-#: gui/options.cpp:406
+#: gui/options.cpp:407
msgid "the fullscreen setting could not be changed"
msgstr "nie uda³o siê zmieniæ trybu pe³noekranowego"
-#: gui/options.cpp:412
+#: gui/options.cpp:413
msgid "the aspect ratio setting could not be changed"
msgstr "nie uda³o siê zmieniæ formatu obrazu"
-#: gui/options.cpp:733
+#: gui/options.cpp:734
msgid "Graphics mode:"
msgstr "Tryb grafiki:"
-#: gui/options.cpp:747
+#: gui/options.cpp:748
msgid "Render mode:"
msgstr "Renderer:"
-#: gui/options.cpp:747 gui/options.cpp:748
+#: gui/options.cpp:748 gui/options.cpp:749
msgid "Special dithering modes supported by some games"
msgstr "Specjalne tryby ditheringu wspierane przez niektóre gry"
-#: gui/options.cpp:759
-#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2236
-#: backends/graphics/openglsdl/openglsdl-graphics.cpp:476
+#: gui/options.cpp:760
+#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2249
msgid "Fullscreen mode"
msgstr "Pe³ny ekran"
-#: gui/options.cpp:762
+#: gui/options.cpp:763
msgid "Aspect ratio correction"
msgstr "Korekcja formatu obrazu"
-#: gui/options.cpp:762
+#: gui/options.cpp:763
msgid "Correct aspect ratio for 320x200 games"
msgstr "Korekcja formatu obrazu dla gier 320x200"
-#: gui/options.cpp:770
+#: gui/options.cpp:771
msgid "Preferred Device:"
msgstr "Pref. urz±dzenie:"
-#: gui/options.cpp:770
+#: gui/options.cpp:771
msgid "Music Device:"
msgstr "Urz. muzyczne:"
-#: gui/options.cpp:770 gui/options.cpp:772
+#: gui/options.cpp:771 gui/options.cpp:773
msgid "Specifies preferred sound device or sound card emulator"
msgstr "Okre¶la preferowane urz±dzenie d¼wiêkowe lub emulator karty d¼wiêkowej"
-#: gui/options.cpp:770 gui/options.cpp:772 gui/options.cpp:773
+#: gui/options.cpp:771 gui/options.cpp:773 gui/options.cpp:774
msgid "Specifies output sound device or sound card emulator"
msgstr "Okre¶la wyj¶ciowe urz±dzenie d¼wiêkowe lub emulator karty d¼wiêkowej"
-#: gui/options.cpp:772
+#: gui/options.cpp:773
msgctxt "lowres"
msgid "Preferred Dev.:"
msgstr "Pref. urz±dzenie:"
-#: gui/options.cpp:772
+#: gui/options.cpp:773
msgctxt "lowres"
msgid "Music Device:"
msgstr "Urz. muzyczne:"
-#: gui/options.cpp:799
+#: gui/options.cpp:800
msgid "AdLib emulator:"
msgstr "Emulator AdLib:"
-#: gui/options.cpp:799 gui/options.cpp:800
+#: gui/options.cpp:800 gui/options.cpp:801
msgid "AdLib is used for music in many games"
msgstr "AdLib jest u¿ywany do muzyki w wielu grach"
-#: gui/options.cpp:810
+#: gui/options.cpp:811
msgid "Output rate:"
msgstr "Czêst. wyj.:"
-#: gui/options.cpp:810 gui/options.cpp:811
+#: gui/options.cpp:811 gui/options.cpp:812
msgid ""
"Higher value specifies better sound quality but may be not supported by your "
"soundcard"
@@ -678,67 +676,67 @@ msgstr ""
"Wy¿sze warto¶ci daj± lepsz± jako¶æ d¼wiêku, ale mog± byæ nieobs³ugiwane "
"przez twoj± kartê d¼wiêkow±"
-#: gui/options.cpp:821
+#: gui/options.cpp:822
msgid "GM Device:"
msgstr "Urz±dzenie GM:"
-#: gui/options.cpp:821
+#: gui/options.cpp:822
msgid "Specifies default sound device for General MIDI output"
msgstr "Okre¶la domy¶lne urz±dzenie d¼wiêkowe dla wyj¶cia General MIDI"
-#: gui/options.cpp:832
+#: gui/options.cpp:833
msgid "Don't use General MIDI music"
msgstr "Nie u¿ywaj muzyki General MIDI"
-#: gui/options.cpp:843 gui/options.cpp:909
+#: gui/options.cpp:844 gui/options.cpp:910
msgid "Use first available device"
msgstr "U¿yj pierwszego dostêpnego urz±dzenia"
-#: gui/options.cpp:855
+#: gui/options.cpp:856
msgid "SoundFont:"
msgstr "SoundFont:"
-#: gui/options.cpp:855 gui/options.cpp:857 gui/options.cpp:858
+#: gui/options.cpp:856 gui/options.cpp:858 gui/options.cpp:859
msgid "SoundFont is supported by some audio cards, Fluidsynth and Timidity"
msgstr ""
"SoundFont jest wspierany przez niektóre karty d¼wiêkowe, Fluidsynth i "
"Timidity"
-#: gui/options.cpp:857
+#: gui/options.cpp:858
msgctxt "lowres"
msgid "SoundFont:"
msgstr "SoundFont:"
-#: gui/options.cpp:863
+#: gui/options.cpp:864
msgid "Mixed AdLib/MIDI mode"
msgstr "Tryb miksowanego AdLib/MIDI"
-#: gui/options.cpp:863
+#: gui/options.cpp:864
msgid "Use both MIDI and AdLib sound generation"
msgstr "U¿ywaj obu generatorów d¼wiêku, MIDI i AdLib, jednocze¶nie"
-#: gui/options.cpp:866
+#: gui/options.cpp:867
msgid "MIDI gain:"
msgstr "Wzm. MIDI:"
-#: gui/options.cpp:873
+#: gui/options.cpp:874
msgid "FluidSynth Settings"
msgstr "Ustawienia FluidSynth"
-#: gui/options.cpp:880
+#: gui/options.cpp:881
msgid "MT-32 Device:"
msgstr "Urz±dzenie MT-32:"
-#: gui/options.cpp:880
+#: gui/options.cpp:881
msgid "Specifies default sound device for Roland MT-32/LAPC1/CM32l/CM64 output"
msgstr ""
"Okre¶la domy¶lne urz±dzenie d¼wiêku dla wyj¶cia Roland MT-32/LAPC1/CM32l/CM64"
-#: gui/options.cpp:885
+#: gui/options.cpp:886
msgid "True Roland MT-32 (disable GM emulation)"
msgstr "Prawdziwy Roland MT-32 (wy³±cz emulacjê GM)"
-#: gui/options.cpp:885 gui/options.cpp:887
+#: gui/options.cpp:886 gui/options.cpp:888
msgid ""
"Check if you want to use your real hardware Roland-compatible sound device "
"connected to your computer"
@@ -746,191 +744,193 @@ msgstr ""
"Zaznacz, je¶li chcesz u¿ywaæ swojej prawdziwej karty kompatybilnej z Roland "
"pod³±czonej do twojego komputera"
-#: gui/options.cpp:887
+#: gui/options.cpp:888
msgctxt "lowres"
msgid "True Roland MT-32 (no GM emulation)"
msgstr "Prawdziwy Roland MT-32 (brak emulacji GM)"
-#: gui/options.cpp:890
-msgid "Roland GS Mode (disable GM mapping)"
+#: gui/options.cpp:891
+#, fuzzy
+msgid "Roland GS Device (enable MT-32 mappings)"
msgstr "Roland w trybie GS (wy³±cz mapowanie GM)"
-#: gui/options.cpp:890
-msgid "Turns off General MIDI mapping for games with Roland MT-32 soundtrack"
+#: gui/options.cpp:891
+msgid ""
+"Check if you want to enable patch mappings to emulate an MT-32 on a Roland "
+"GS device"
msgstr ""
-"Wy³±cza mapowanie General MIDI dla gier ze ¶cie¿k± d¼wiêkow± Roland MT-32"
-#: gui/options.cpp:899
+#: gui/options.cpp:900
msgid "Don't use Roland MT-32 music"
msgstr "Nie u¿ywaj muzyki Roland MT-32"
-#: gui/options.cpp:926
+#: gui/options.cpp:927
msgid "Text and Speech:"
msgstr "Tekst i mowa:"
-#: gui/options.cpp:930 gui/options.cpp:940
+#: gui/options.cpp:931 gui/options.cpp:941
msgid "Speech"
msgstr "Mowa"
-#: gui/options.cpp:931 gui/options.cpp:941
+#: gui/options.cpp:932 gui/options.cpp:942
msgid "Subtitles"
msgstr "Napisy"
-#: gui/options.cpp:932
+#: gui/options.cpp:933
msgid "Both"
msgstr "Oba"
-#: gui/options.cpp:934
+#: gui/options.cpp:935
msgid "Subtitle speed:"
msgstr "Prêd. napisów:"
-#: gui/options.cpp:936
+#: gui/options.cpp:937
msgctxt "lowres"
msgid "Text and Speech:"
msgstr "Tekst i mowa:"
-#: gui/options.cpp:940
+#: gui/options.cpp:941
msgid "Spch"
msgstr "Mowa"
-#: gui/options.cpp:941
+#: gui/options.cpp:942
msgid "Subs"
msgstr "Napisy"
-#: gui/options.cpp:942
+#: gui/options.cpp:943
msgctxt "lowres"
msgid "Both"
msgstr "Oba"
-#: gui/options.cpp:942
+#: gui/options.cpp:943
msgid "Show subtitles and play speech"
msgstr "Wy¶wietlaj napisy i odtwarzaj mowê"
-#: gui/options.cpp:944
+#: gui/options.cpp:945
msgctxt "lowres"
msgid "Subtitle speed:"
msgstr "Prêd. napisów:"
-#: gui/options.cpp:960
+#: gui/options.cpp:961
msgid "Music volume:"
msgstr "G³o¶no¶æ muzyki:"
-#: gui/options.cpp:962
+#: gui/options.cpp:963
msgctxt "lowres"
msgid "Music volume:"
msgstr "G³o¶no¶æ muzyki:"
-#: gui/options.cpp:969
+#: gui/options.cpp:970
msgid "Mute All"
msgstr "Wycisz"
-#: gui/options.cpp:972
+#: gui/options.cpp:973
msgid "SFX volume:"
msgstr "G³. efekt. d¼w.:"
-#: gui/options.cpp:972 gui/options.cpp:974 gui/options.cpp:975
+#: gui/options.cpp:973 gui/options.cpp:975 gui/options.cpp:976
msgid "Special sound effects volume"
msgstr "G³o¶no¶æ efektów d¼w."
-#: gui/options.cpp:974
+#: gui/options.cpp:975
msgctxt "lowres"
msgid "SFX volume:"
msgstr "G³. efekt. d¼w.:"
-#: gui/options.cpp:982
+#: gui/options.cpp:983
msgid "Speech volume:"
msgstr "G³o¶no¶æ mowy:"
-#: gui/options.cpp:984
+#: gui/options.cpp:985
msgctxt "lowres"
msgid "Speech volume:"
msgstr "G³o¶no¶æ mowy:"
-#: gui/options.cpp:1141
+#: gui/options.cpp:1142
msgid "Theme Path:"
msgstr "¦cie¿ka stylu:"
-#: gui/options.cpp:1143
+#: gui/options.cpp:1144
msgctxt "lowres"
msgid "Theme Path:"
msgstr "¦cie¿ka stylu:"
-#: gui/options.cpp:1149 gui/options.cpp:1151 gui/options.cpp:1152
+#: gui/options.cpp:1150 gui/options.cpp:1152 gui/options.cpp:1153
msgid "Specifies path to additional data used by all games or ScummVM"
msgstr "Okre¶la ¶cie¿kê dla dodatkowych danych dla wszystkich gier lub ScummVM"
-#: gui/options.cpp:1158
+#: gui/options.cpp:1159
msgid "Plugins Path:"
msgstr "¦cie¿ka wtyczek:"
-#: gui/options.cpp:1160
+#: gui/options.cpp:1161
msgctxt "lowres"
msgid "Plugins Path:"
msgstr "¦cie¿ka wtyczek:"
-#: gui/options.cpp:1169 gui/fluidsynth-dialog.cpp:137
+#: gui/options.cpp:1170 gui/fluidsynth-dialog.cpp:138
msgid "Misc"
msgstr "Ró¿ne"
-#: gui/options.cpp:1171
+#: gui/options.cpp:1172
msgctxt "lowres"
msgid "Misc"
msgstr "Ró¿ne"
-#: gui/options.cpp:1173
+#: gui/options.cpp:1174
msgid "Theme:"
msgstr "Styl:"
-#: gui/options.cpp:1177
+#: gui/options.cpp:1178
msgid "GUI Renderer:"
msgstr "Renderer interf.:"
-#: gui/options.cpp:1189
+#: gui/options.cpp:1190
msgid "Autosave:"
msgstr "Autozapis:"
-#: gui/options.cpp:1191
+#: gui/options.cpp:1192
msgctxt "lowres"
msgid "Autosave:"
msgstr "Autozapis:"
-#: gui/options.cpp:1199
+#: gui/options.cpp:1200
msgid "Keys"
msgstr "Klawisze"
-#: gui/options.cpp:1206
+#: gui/options.cpp:1207
msgid "GUI Language:"
msgstr "Jêzyk interfejsu:"
-#: gui/options.cpp:1206
+#: gui/options.cpp:1207
msgid "Language of ScummVM GUI"
msgstr "Jêzyk interfejsu ScummVM"
-#: gui/options.cpp:1365
+#: gui/options.cpp:1366
msgid "You have to restart ScummVM before your changes will take effect."
msgstr "Musisz zrestartowaæ ScummVM, by zmiany zosta³y uwzglêdnione."
-#: gui/options.cpp:1378
+#: gui/options.cpp:1379
msgid "Select directory for savegames"
msgstr "Wybierz katalog zapisów"
-#: gui/options.cpp:1385
+#: gui/options.cpp:1386
msgid "The chosen directory cannot be written to. Please select another one."
msgstr "Ten katalog jest zabezpieczony przed zapisem. Wybierz inny."
-#: gui/options.cpp:1394
+#: gui/options.cpp:1395
msgid "Select directory for GUI themes"
msgstr "Wybierz katalog dla stylów GUI."
-#: gui/options.cpp:1404
+#: gui/options.cpp:1405
msgid "Select directory for extra files"
msgstr "Wybierz katalog dla dodatkowych plików"
-#: gui/options.cpp:1415
+#: gui/options.cpp:1416
msgid "Select directory for plugins"
msgstr "Wybierz katalog dla wtyczek"
-#: gui/options.cpp:1468
+#: gui/options.cpp:1469
msgid ""
"The theme you selected does not support your current language. If you want "
"to use this theme you need to switch to another language first."
@@ -938,223 +938,226 @@ msgstr ""
"Wybrany styl nie obs³uguje obecnego jêzyka. Je¶li chcesz go u¿ywaæ, zmieñ "
"najpierw swój jêzyk."
-#: gui/saveload-dialog.cpp:166
+#: gui/saveload-dialog.cpp:167
msgid "List view"
msgstr "Widok listy"
-#: gui/saveload-dialog.cpp:167
+#: gui/saveload-dialog.cpp:168
msgid "Grid view"
msgstr "Widok siatki"
-#: gui/saveload-dialog.cpp:210 gui/saveload-dialog.cpp:358
+#: gui/saveload-dialog.cpp:211 gui/saveload-dialog.cpp:360
msgid "No date saved"
msgstr "Brak daty"
-#: gui/saveload-dialog.cpp:211 gui/saveload-dialog.cpp:359
+#: gui/saveload-dialog.cpp:212 gui/saveload-dialog.cpp:361
msgid "No time saved"
msgstr "Brak godziny"
-#: gui/saveload-dialog.cpp:212 gui/saveload-dialog.cpp:360
+#: gui/saveload-dialog.cpp:213 gui/saveload-dialog.cpp:362
msgid "No playtime saved"
msgstr "Brak czasu gry"
-#: gui/saveload-dialog.cpp:219 gui/saveload-dialog.cpp:275
+#: gui/saveload-dialog.cpp:220 gui/saveload-dialog.cpp:276
msgid "Delete"
msgstr "Skasuj"
-#: gui/saveload-dialog.cpp:274
+#: gui/saveload-dialog.cpp:275
msgid "Do you really want to delete this savegame?"
msgstr "Na pewno chcesz skasowaæ ten zapis?"
-#: gui/saveload-dialog.cpp:383 gui/saveload-dialog.cpp:872
+#: gui/saveload-dialog.cpp:385 gui/saveload-dialog.cpp:875
msgid "Date: "
msgstr "Data: "
-#: gui/saveload-dialog.cpp:387 gui/saveload-dialog.cpp:878
+#: gui/saveload-dialog.cpp:389 gui/saveload-dialog.cpp:881
msgid "Time: "
msgstr "Czas: "
-#: gui/saveload-dialog.cpp:393 gui/saveload-dialog.cpp:886
+#: gui/saveload-dialog.cpp:395 gui/saveload-dialog.cpp:889
msgid "Playtime: "
msgstr "Czas gry: "
-#: gui/saveload-dialog.cpp:406 gui/saveload-dialog.cpp:494
+#: gui/saveload-dialog.cpp:408 gui/saveload-dialog.cpp:496
msgid "Untitled savestate"
msgstr "Zapis bez nazwy"
-#: gui/saveload-dialog.cpp:546
+#: gui/saveload-dialog.cpp:548
msgid "Next"
msgstr "Nastêpny"
-#: gui/saveload-dialog.cpp:549
+#: gui/saveload-dialog.cpp:551
msgid "Prev"
msgstr "Poprzedni"
-#: gui/saveload-dialog.cpp:736
+#: gui/saveload-dialog.cpp:739
msgid "New Save"
msgstr "Nowy zapis"
-#: gui/saveload-dialog.cpp:736
+#: gui/saveload-dialog.cpp:739
msgid "Create a new save game"
msgstr "Stwórz nowy zapis"
-#: gui/saveload-dialog.cpp:865
+#: gui/saveload-dialog.cpp:868
msgid "Name: "
msgstr "Nazwa: "
-#: gui/saveload-dialog.cpp:937
+#: gui/saveload-dialog.cpp:940
#, c-format
msgid "Enter a description for slot %d:"
msgstr "Podaj opis dla slotu %d:"
-#: gui/themebrowser.cpp:44
+#: gui/themebrowser.cpp:45
msgid "Select a Theme"
msgstr "Wybierz styl"
-#: gui/ThemeEngine.cpp:337
+#: gui/ThemeEngine.cpp:347
msgid "Disabled GFX"
msgstr "Wy³±czona grafika"
-#: gui/ThemeEngine.cpp:337
+#: gui/ThemeEngine.cpp:347
msgctxt "lowres"
msgid "Disabled GFX"
msgstr "Wy³±czona grafika"
-#: gui/ThemeEngine.cpp:338
-msgid "Standard Renderer (16bpp)"
+#: gui/ThemeEngine.cpp:348
+#, fuzzy
+msgid "Standard Renderer"
msgstr "Standardowy renderer (16bpp)"
-#: gui/ThemeEngine.cpp:338
-msgid "Standard (16bpp)"
-msgstr "Standardowy (16bpp)"
+#: gui/ThemeEngine.cpp:348 engines/scumm/dialogs.cpp:659
+msgid "Standard"
+msgstr "Standardowy"
-#: gui/ThemeEngine.cpp:340
-msgid "Antialiased Renderer (16bpp)"
+#: gui/ThemeEngine.cpp:350
+#, fuzzy
+msgid "Antialiased Renderer"
msgstr "Wyg³adzany renderer (16bpp)"
-#: gui/ThemeEngine.cpp:340
-msgid "Antialiased (16bpp)"
+#: gui/ThemeEngine.cpp:350
+#, fuzzy
+msgid "Antialiased"
msgstr "Wyg³adzany (16bpp)"
-#: gui/widget.cpp:322 gui/widget.cpp:324 gui/widget.cpp:330 gui/widget.cpp:332
+#: gui/widget.cpp:323 gui/widget.cpp:325 gui/widget.cpp:331 gui/widget.cpp:333
msgid "Clear value"
msgstr "Wyczy¶æ"
-#: gui/fluidsynth-dialog.cpp:67
+#: gui/fluidsynth-dialog.cpp:68
msgid "Reverb"
msgstr "Pog³os"
-#: gui/fluidsynth-dialog.cpp:69 gui/fluidsynth-dialog.cpp:101
+#: gui/fluidsynth-dialog.cpp:70 gui/fluidsynth-dialog.cpp:102
msgid "Active"
msgstr "Aktywny"
-#: gui/fluidsynth-dialog.cpp:71
+#: gui/fluidsynth-dialog.cpp:72
msgid "Room:"
msgstr "Przestrzeñ:"
-#: gui/fluidsynth-dialog.cpp:78
+#: gui/fluidsynth-dialog.cpp:79
msgid "Damp:"
msgstr "T³umienie:"
-#: gui/fluidsynth-dialog.cpp:85
+#: gui/fluidsynth-dialog.cpp:86
msgid "Width:"
msgstr "Szeroko¶æ:"
-#: gui/fluidsynth-dialog.cpp:92 gui/fluidsynth-dialog.cpp:110
+#: gui/fluidsynth-dialog.cpp:93 gui/fluidsynth-dialog.cpp:111
msgid "Level:"
msgstr "Poziom:"
-#: gui/fluidsynth-dialog.cpp:99
+#: gui/fluidsynth-dialog.cpp:100
msgid "Chorus"
msgstr "Chorus"
-#: gui/fluidsynth-dialog.cpp:103
+#: gui/fluidsynth-dialog.cpp:104
msgid "N:"
msgstr "N:"
-#: gui/fluidsynth-dialog.cpp:117
+#: gui/fluidsynth-dialog.cpp:118
msgid "Speed:"
msgstr "Szybko¶æ:"
-#: gui/fluidsynth-dialog.cpp:124
+#: gui/fluidsynth-dialog.cpp:125
msgid "Depth:"
msgstr "G³êbia:"
-#: gui/fluidsynth-dialog.cpp:131
+#: gui/fluidsynth-dialog.cpp:132
msgid "Type:"
msgstr "Typ:"
-#: gui/fluidsynth-dialog.cpp:134
+#: gui/fluidsynth-dialog.cpp:135
msgid "Sine"
msgstr "Sinus"
-#: gui/fluidsynth-dialog.cpp:135
+#: gui/fluidsynth-dialog.cpp:136
msgid "Triangle"
msgstr "Trójk±t"
-#: gui/fluidsynth-dialog.cpp:139
+#: gui/fluidsynth-dialog.cpp:140
msgid "Interpolation:"
msgstr "Interpolacja:"
-#: gui/fluidsynth-dialog.cpp:142
+#: gui/fluidsynth-dialog.cpp:143
msgid "None (fastest)"
msgstr "Brak (najszybsze)"
-#: gui/fluidsynth-dialog.cpp:143
+#: gui/fluidsynth-dialog.cpp:144
msgid "Linear"
msgstr "Liniowa"
-#: gui/fluidsynth-dialog.cpp:144
+#: gui/fluidsynth-dialog.cpp:145
msgid "Fourth-order"
msgstr "Czterostopniowa"
-#: gui/fluidsynth-dialog.cpp:145
+#: gui/fluidsynth-dialog.cpp:146
msgid "Seventh-order"
msgstr "Siedmiostopniowa"
-#: gui/fluidsynth-dialog.cpp:149
+#: gui/fluidsynth-dialog.cpp:150
msgid "Reset"
msgstr "Reset"
-#: gui/fluidsynth-dialog.cpp:149
+#: gui/fluidsynth-dialog.cpp:150
msgid "Reset all FluidSynth settings to their default values."
msgstr "Przywróæ domy¶lne warto¶ci wszystkich ustawieñ FluidSynth."
-#: gui/fluidsynth-dialog.cpp:216
+#: gui/fluidsynth-dialog.cpp:217
msgid ""
"Do you really want to reset all FluidSynth settings to their default values?"
msgstr ""
"Na pewno chcesz przywróciæ domy¶lne warto¶ci wszystkich ustawieñ FluidSynth?"
-#: base/main.cpp:210
+#: base/main.cpp:228
#, c-format
msgid "Engine does not support debug level '%s'"
msgstr "Silnik nie wspiera poziomu debugowania '%s'"
-#: base/main.cpp:288
+#: base/main.cpp:306
msgid "Menu"
msgstr "Menu"
-#: base/main.cpp:291 backends/platform/symbian/src/SymbianActions.cpp:45
+#: base/main.cpp:309 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:294 backends/platform/symbian/src/SymbianActions.cpp:50
+#: base/main.cpp:312 backends/platform/symbian/src/SymbianActions.cpp:50
#: backends/platform/wince/CEActionsPocket.cpp:42
msgid "Pause"
msgstr "Wstrzymaj"
-#: base/main.cpp:297
+#: base/main.cpp:315
msgid "Skip line"
msgstr "Pomiñ liniê"
-#: base/main.cpp:468
+#: base/main.cpp:507
msgid "Error running game:"
msgstr "B³±d podczas uruchamiania gry:"
-#: base/main.cpp:492
+#: base/main.cpp:536
msgid "Could not find any engine capable of running the selected game"
msgstr "Nie uda³o siê znale¼æ silnika zdolnego do uruchomienia zaznaczonej gry"
@@ -1222,72 +1225,72 @@ msgstr "Przerwane przez u¿ytkownika"
msgid "Unknown error"
msgstr "Nieznany b³±d"
-#: engines/advancedDetector.cpp:316
+#: engines/advancedDetector.cpp:317
#, c-format
msgid "The game in '%s' seems to be unknown."
msgstr "Gra w '%s' wygl±da na nieznan±."
-#: engines/advancedDetector.cpp:317
+#: engines/advancedDetector.cpp:318
msgid "Please, report the following data to the ScummVM team along with name"
msgstr "Przeka¿ poni¿sze dane zespo³owi ScummVM razem z nazw±"
-#: engines/advancedDetector.cpp:319
+#: engines/advancedDetector.cpp:320
msgid "of the game you tried to add and its version/language/etc.:"
msgstr "gry, któr± próbowa³e¶ dodaæ oraz jej wersj±, jêzykiem itd.:"
-#: engines/dialogs.cpp:84
+#: engines/dialogs.cpp:85
msgid "~R~esume"
msgstr "~W~znów"
-#: engines/dialogs.cpp:86
+#: engines/dialogs.cpp:87
msgid "~L~oad"
msgstr "~W~czytaj"
-#: engines/dialogs.cpp:90
+#: engines/dialogs.cpp:91
msgid "~S~ave"
msgstr "~Z~apisz"
-#: engines/dialogs.cpp:94
+#: engines/dialogs.cpp:95
msgid "~O~ptions"
msgstr "~O~pcje"
-#: engines/dialogs.cpp:99
+#: engines/dialogs.cpp:100
msgid "~H~elp"
msgstr "~P~omoc"
-#: engines/dialogs.cpp:101
+#: engines/dialogs.cpp:102
msgid "~A~bout"
msgstr "~I~nformacje"
-#: engines/dialogs.cpp:104 engines/dialogs.cpp:180
+#: engines/dialogs.cpp:105 engines/dialogs.cpp:181
msgid "~R~eturn to Launcher"
msgstr "~P~owrót do launchera"
-#: engines/dialogs.cpp:106 engines/dialogs.cpp:182
+#: engines/dialogs.cpp:107 engines/dialogs.cpp:183
msgctxt "lowres"
msgid "~R~eturn to Launcher"
msgstr "~P~owrót do launchera"
-#: engines/dialogs.cpp:115 engines/agi/saveload.cpp:803
-#: engines/drascula/saveload.cpp:338 engines/cruise/menu.cpp:212
-#: engines/sci/engine/kfile.cpp:742 engines/toltecs/menu.cpp:284
-#: engines/pegasus/pegasus.cpp:373
+#: engines/dialogs.cpp:116 engines/agi/saveload.cpp:803
+#: engines/cruise/menu.cpp:212 engines/drascula/saveload.cpp:336
+#: engines/neverhood/menumodule.cpp:873 engines/pegasus/pegasus.cpp:377
+#: engines/sci/engine/kfile.cpp:758 engines/toltecs/menu.cpp:281
msgid "Save game:"
msgstr "Zapis:"
-#: engines/dialogs.cpp:115 engines/agi/saveload.cpp:803
-#: engines/drascula/saveload.cpp:338 engines/scumm/dialogs.cpp:187
-#: engines/cruise/menu.cpp:212 engines/sci/engine/kfile.cpp:742
-#: engines/toltecs/menu.cpp:284 engines/pegasus/pegasus.cpp:373
-#: backends/platform/symbian/src/SymbianActions.cpp:44
+#: engines/dialogs.cpp:116 backends/platform/symbian/src/SymbianActions.cpp:44
#: backends/platform/wince/CEActionsPocket.cpp:43
#: backends/platform/wince/CEActionsPocket.cpp:267
#: backends/platform/wince/CEActionsSmartphone.cpp:45
#: backends/platform/wince/CEActionsSmartphone.cpp:231
+#: engines/agi/saveload.cpp:803 engines/cruise/menu.cpp:212
+#: engines/drascula/saveload.cpp:336 engines/neverhood/menumodule.cpp:873
+#: engines/pegasus/pegasus.cpp:377 engines/sci/engine/kfile.cpp:758
+#: engines/scumm/dialogs.cpp:188 engines/toltecs/menu.cpp:281
msgid "Save"
msgstr "Zapisz"
-#: engines/dialogs.cpp:144
+#: engines/dialogs.cpp:145
msgid ""
"Sorry, this engine does not currently provide in-game help. Please consult "
"the README for basic information, and for instructions on how to obtain "
@@ -1297,7 +1300,7 @@ msgstr ""
"uzyskaæ podstawowe informacje oraz dowiedzieæ jak szukaæ dalszej pomocy, "
"sprawd¼ plik README."
-#: engines/dialogs.cpp:228
+#: engines/dialogs.cpp:234 engines/pegasus/pegasus.cpp:393
#, c-format
msgid ""
"Gamestate save failed (%s)! Please consult the README for basic information, "
@@ -1306,37 +1309,37 @@ msgstr ""
"Zapis stanu gry nie powiód³ siê (%s)! Aby uzyskaæ podstawowe informacje oraz "
"dowiedzieæ jak szukaæ dalszej pomocy, sprawd¼ plik README."
-#: engines/dialogs.cpp:301 engines/mohawk/dialogs.cpp:109
+#: engines/dialogs.cpp:307 engines/mohawk/dialogs.cpp:109
#: engines/mohawk/dialogs.cpp:170
msgid "~O~K"
msgstr "~O~K"
-#: engines/dialogs.cpp:302 engines/mohawk/dialogs.cpp:110
+#: engines/dialogs.cpp:308 engines/mohawk/dialogs.cpp:110
#: engines/mohawk/dialogs.cpp:171
msgid "~C~ancel"
msgstr "~A~nuluj"
-#: engines/dialogs.cpp:305
+#: engines/dialogs.cpp:311
msgid "~K~eys"
msgstr "~K~lawisze"
-#: engines/engine.cpp:240
+#: engines/engine.cpp:245
msgid "Could not initialize color format."
msgstr "Nie uda³o siê zainicjalizowaæ formatu kolorów."
-#: engines/engine.cpp:248
+#: engines/engine.cpp:253
msgid "Could not switch to video mode: '"
msgstr "Nie uda³o siê prze³±czyæ w tryb wideo: '"
-#: engines/engine.cpp:257
+#: engines/engine.cpp:262
msgid "Could not apply aspect ratio setting."
msgstr "Nie uda³o siê zastosowaæ ustawienia formatu obrazu."
-#: engines/engine.cpp:262
+#: engines/engine.cpp:267
msgid "Could not apply fullscreen setting."
msgstr "Nie uda³o siê zastosowaæ ustawienia pe³nego ekranu."
-#: engines/engine.cpp:362
+#: engines/engine.cpp:367
msgid ""
"You appear to be playing this game directly\n"
"from the CD. This is known to cause problems,\n"
@@ -1348,7 +1351,7 @@ msgstr ""
"znane problemów. St±d zalecane jest skopiowanie plików gry na twardy dysk.\n"
"Dalsze informacje s± dostêpne w pliku README."
-#: engines/engine.cpp:373
+#: engines/engine.cpp:378
msgid ""
"This game has audio tracks in its disk. These\n"
"tracks need to be ripped from the disk using\n"
@@ -1360,7 +1363,7 @@ msgstr ""
"skopiowaæ na dysk za pomoc± odpowiedniego rippera CD audio.\n"
"Dalsze informacje s± dostêpne w pliku README."
-#: engines/engine.cpp:431
+#: engines/engine.cpp:436
#, c-format
msgid ""
"Gamestate load failed (%s)! Please consult the README for basic information, "
@@ -1369,7 +1372,7 @@ msgstr ""
"Odczyt stanu gry nie powiód³ siê (%s)! Aby uzyskaæ podstawowe informacje "
"oraz dowiedzieæ jak szukaæ dalszej pomocy, sprawd¼ plik README."
-#: engines/engine.cpp:444
+#: engines/engine.cpp:449
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 "
@@ -1379,33 +1382,758 @@ msgstr ""
"ScummVM. W zwi±zku z tym mo¿e byæ ona niestabilna, a wszelkie zapisy, "
"których dokonasz, mog± byæ nieobs³ugiwane w przysz³ych wersjach ScummVM."
-#: engines/engine.cpp:447
+#: engines/engine.cpp:452
msgid "Start anyway"
msgstr "W³±cz mimo tego"
-#: engines/agi/detection.cpp:142 engines/drascula/detection.cpp:270
-#: engines/dreamweb/detection.cpp:47 engines/sci/detection.cpp:393
-#: engines/toltecs/detection.cpp:173
+#: audio/fmopl.cpp:50
+msgid "MAME OPL emulator"
+msgstr "Emulator OPL MAME"
+
+#: audio/fmopl.cpp:52
+msgid "DOSBox OPL emulator"
+msgstr "Emulator OPL DOSBox"
+
+#: audio/mididrv.cpp:209
+#, c-format
+msgid ""
+"The selected audio device '%s' was not found (e.g. might be turned off or "
+"disconnected)."
+msgstr ""
+"Nie znaleziono wybranego urz±dzenia audio '%s' (mo¿e byæ wy³±czone albo "
+"niepod³±czone)."
+
+#: audio/mididrv.cpp:209 audio/mididrv.cpp:221 audio/mididrv.cpp:257
+#: audio/mididrv.cpp:272
+msgid "Attempting to fall back to the next available device..."
+msgstr "Próbujê u¿yæ nastêpnego dostêpnego urz±dzenia..."
+
+#: audio/mididrv.cpp:221
+#, c-format
+msgid ""
+"The selected audio device '%s' cannot be used. See log file for more "
+"information."
+msgstr ""
+"Nie mo¿na u¿yæ wybranego urz±dzenia audio '%s'. Dalsze szczegó³y s± dostêpne "
+"w pliku dziennika."
+
+#: audio/mididrv.cpp:257
+#, c-format
+msgid ""
+"The preferred audio device '%s' was not found (e.g. might be turned off or "
+"disconnected)."
+msgstr ""
+"Nie znaleziono preferowanego urz±dzenia audio '%s' (mo¿e byæ wy³±czone albo "
+"niepod³±czone)."
+
+#: audio/mididrv.cpp:272
+#, c-format
+msgid ""
+"The preferred audio device '%s' cannot be used. See log file for more "
+"information."
+msgstr ""
+"Nie mo¿na u¿yæ preferowanego urz±dzenia audio '%s'. Dalsze szczegó³y s± "
+"dostêpne w pliku dziennika."
+
+#: audio/null.h:44
+msgid "No music"
+msgstr "Brak muzyki"
+
+#: audio/mods/paula.cpp:196
+msgid "Amiga Audio Emulator"
+msgstr "Emulator d¼wiêku Amigi"
+
+#: audio/softsynth/adlib.cpp:2285
+msgid "AdLib Emulator"
+msgstr "Emulator AdLib"
+
+#: audio/softsynth/appleiigs.cpp:33
+msgid "Apple II GS Emulator (NOT IMPLEMENTED)"
+msgstr "Emulator Apple II GS (NIE ZAIMPLEMENTOWANY)"
+
+#: audio/softsynth/sid.cpp:1430
+msgid "C64 Audio Emulator"
+msgstr "Emulator d¼wiêku C64"
+
+#: audio/softsynth/mt32.cpp:200
+msgid "Initializing MT-32 Emulator"
+msgstr "Inicjalizacja emulatora MT-32"
+
+#: audio/softsynth/mt32.cpp:426
+msgid "MT-32 Emulator"
+msgstr "Emulator MT-32"
+
+#: audio/softsynth/pcspk.cpp:139
+msgid "PC Speaker Emulator"
+msgstr "Emulator brzêczyka"
+
+#: audio/softsynth/pcspk.cpp:158
+msgid "IBM PCjr Emulator"
+msgstr "Emulator IBM PCjr"
+
+#: backends/keymapper/remap-dialog.cpp:48
+msgid "Keymap:"
+msgstr "Klawisze:"
+
+#: backends/keymapper/remap-dialog.cpp:67
+msgid " (Effective)"
+msgstr " (Dzia³a)"
+
+#: backends/keymapper/remap-dialog.cpp:107
+msgid " (Active)"
+msgstr " (Aktywny)"
+
+#: backends/keymapper/remap-dialog.cpp:107
+msgid " (Blocked)"
+msgstr " (Zablokowany)"
+
+#: backends/keymapper/remap-dialog.cpp:120
+msgid " (Global)"
+msgstr " (Globalny)"
+
+#: backends/keymapper/remap-dialog.cpp:128
+msgid " (Game)"
+msgstr " (Gra)"
+
+#: backends/midi/windows.cpp:165
+msgid "Windows MIDI"
+msgstr "Windows MIDI"
+
+#: backends/platform/ds/arm9/source/dsoptions.cpp:56
+#: engines/scumm/dialogs.cpp:291
+msgid "~C~lose"
+msgstr "~Z~amknij"
+
+#: backends/platform/ds/arm9/source/dsoptions.cpp:57
+msgid "ScummVM Main Menu"
+msgstr "G³ówne menu ScummVM"
+
+#: backends/platform/ds/arm9/source/dsoptions.cpp:63
+msgid "~L~eft handed mode"
+msgstr "~T~ryb dla leworêcznych"
+
+#: backends/platform/ds/arm9/source/dsoptions.cpp:64
+msgid "~I~ndy fight controls"
+msgstr "~S~terowanie walcz±cym Indym"
+
+#: backends/platform/ds/arm9/source/dsoptions.cpp:65
+msgid "Show mouse cursor"
+msgstr "Wy¶wietl kursor myszy"
+
+#: backends/platform/ds/arm9/source/dsoptions.cpp:66
+msgid "Snap to edges"
+msgstr "Przyci±ganie do krawêdzi"
+
+#: backends/platform/ds/arm9/source/dsoptions.cpp:68
+msgid "Touch X Offset"
+msgstr "Przesuniêcie X ekranu do dotykania"
+
+#: backends/platform/ds/arm9/source/dsoptions.cpp:75
+msgid "Touch Y Offset"
+msgstr "Przesuniêcie Y ekranu do dotykania"
+
+#: backends/platform/ds/arm9/source/dsoptions.cpp:87
+msgid "Use laptop trackpad-style cursor control"
+msgstr "U¿yj kursora w stylu trackpada z laptopa do sterowania"
+
+#: backends/platform/ds/arm9/source/dsoptions.cpp:88
+msgid "Tap for left click, double tap right click"
+msgstr "Puknij raz, aby klikn±æ LPM; dwa razy, aby klikn±æ PPM"
+
+#: backends/platform/ds/arm9/source/dsoptions.cpp:90
+msgid "Sensitivity"
+msgstr "Czu³o¶æ"
+
+#: backends/platform/ds/arm9/source/dsoptions.cpp:99
+msgid "Initial top screen scale:"
+msgstr "Wstêpna skala górnego ekranu:"
+
+#: backends/platform/ds/arm9/source/dsoptions.cpp:105
+msgid "Main screen scaling:"
+msgstr "Skalowanie g³ównego ekranu:"
+
+#: backends/platform/ds/arm9/source/dsoptions.cpp:107
+msgid "Hardware scale (fast, but low quality)"
+msgstr "Skalowanie sprzêtowe (szybsze, ale ni¿szej jako¶ci)"
+
+#: backends/platform/ds/arm9/source/dsoptions.cpp:108
+msgid "Software scale (good quality, but slower)"
+msgstr "Skalowanie programowe (wy¿szej jako¶ci, ale wolniejsze)"
+
+#: backends/platform/ds/arm9/source/dsoptions.cpp:109
+msgid "Unscaled (you must scroll left and right)"
+msgstr "Nieskalowany (musisz przewijaæ w lewo i prawo)"
+
+#: backends/platform/ds/arm9/source/dsoptions.cpp:111
+msgid "Brightness:"
+msgstr "Jasno¶æ:"
+
+#: backends/platform/ds/arm9/source/dsoptions.cpp:121
+msgid "High quality audio (slower) (reboot)"
+msgstr "D¼wiêk wysokiej jako¶ci (wolniejszy) (restart)"
+
+#: backends/platform/ds/arm9/source/dsoptions.cpp:122
+msgid "Disable power off"
+msgstr "Nie wy³±czaj zasilania"
+
+#: backends/platform/iphone/osys_events.cpp:300
+msgid "Mouse-click-and-drag mode enabled."
+msgstr "W³±czono tryb kliknij i przeci±gaj."
+
+#: backends/platform/iphone/osys_events.cpp:302
+msgid "Mouse-click-and-drag mode disabled."
+msgstr "Wy³±czono tryb kliknij i przeci±gaj."
+
+#: backends/platform/iphone/osys_events.cpp:313
+msgid "Touchpad mode enabled."
+msgstr "Tryb touchpada w³±czony."
+
+#: backends/platform/iphone/osys_events.cpp:315
+msgid "Touchpad mode disabled."
+msgstr "Tryb touchpada wy³±czony."
+
+#: backends/platform/maemo/maemo.cpp:209
+msgid "Click Mode"
+msgstr "Tryb klikania"
+
+#: backends/platform/maemo/maemo.cpp:215
+#: backends/platform/symbian/src/SymbianActions.cpp:42
+#: backends/platform/wince/CEActionsPocket.cpp:60
+#: backends/platform/wince/CEActionsSmartphone.cpp:43
+#: backends/platform/tizen/form.cpp:275
+msgid "Left Click"
+msgstr "Klikniêcie LPM"
+
+#: backends/platform/maemo/maemo.cpp:218
+msgid "Middle Click"
+msgstr "¦rodkowy przycisk"
+
+#: backends/platform/maemo/maemo.cpp:221
+#: backends/platform/symbian/src/SymbianActions.cpp:43
+#: backends/platform/wince/CEActionsSmartphone.cpp:44
+#: backends/platform/tizen/form.cpp:267
+msgid "Right Click"
+msgstr "Klikniêcie PPM"
+
+#: backends/platform/sdl/macosx/appmenu_osx.mm:77
+msgid "Hide ScummVM"
+msgstr "Ukryj ScummVM"
+
+#: backends/platform/sdl/macosx/appmenu_osx.mm:82
+msgid "Hide Others"
+msgstr "Ukryj pozosta³e"
+
+#: backends/platform/sdl/macosx/appmenu_osx.mm:87
+msgid "Show All"
+msgstr "Poka¿ wszystkie"
+
+#: backends/platform/sdl/macosx/appmenu_osx.mm:109
+#: backends/platform/sdl/macosx/appmenu_osx.mm:120
+msgid "Window"
+msgstr "Okno"
+
+#: backends/platform/sdl/macosx/appmenu_osx.mm:114
+msgid "Minimize"
+msgstr "Miniaturka"
+
+#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:46
+msgid "Normal (no scaling)"
+msgstr "Zwyk³y (bez skalowania)"
+
+#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:65
+msgctxt "lowres"
+msgid "Normal (no scaling)"
+msgstr "Zwyk³y (bez skalowania)"
+
+#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2148
+msgid "Enabled aspect ratio correction"
+msgstr "W³±czono korekcjê formatu obrazu"
+
+#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2154
+msgid "Disabled aspect ratio correction"
+msgstr "Wy³±czono korekcjê formatu obrazu"
+
+#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2209
+msgid "Active graphics filter:"
+msgstr "Aktywny filtr graficzny:"
+
+#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2251
+msgid "Windowed mode"
+msgstr "Okno"
+
+#: backends/graphics/opengl/opengl-graphics.cpp:118
+#, fuzzy
+msgid "OpenGL"
+msgstr "Otwórz"
+
+#: backends/graphics/opengl/opengl-graphics.cpp:119
+msgid "OpenGL (No filtering)"
+msgstr ""
+
+#: backends/platform/symbian/src/SymbianActions.cpp:38
+#: backends/platform/wince/CEActionsSmartphone.cpp:39
+msgid "Up"
+msgstr "Do góry"
+
+#: backends/platform/symbian/src/SymbianActions.cpp:39
+#: backends/platform/wince/CEActionsSmartphone.cpp:40
+msgid "Down"
+msgstr "W dó³"
+
+#: backends/platform/symbian/src/SymbianActions.cpp:40
+#: backends/platform/wince/CEActionsSmartphone.cpp:41
+msgid "Left"
+msgstr "W lewo"
+
+#: backends/platform/symbian/src/SymbianActions.cpp:41
+#: backends/platform/wince/CEActionsSmartphone.cpp:42
+msgid "Right"
+msgstr "W prawo"
+
+#: backends/platform/symbian/src/SymbianActions.cpp:46
+#: backends/platform/wince/CEActionsSmartphone.cpp:47
+msgid "Zone"
+msgstr "Strefa"
+
+#: backends/platform/symbian/src/SymbianActions.cpp:47
+#: backends/platform/wince/CEActionsPocket.cpp:54
+#: backends/platform/wince/CEActionsSmartphone.cpp:48
+msgid "Multi Function"
+msgstr "Wielozadaniowy"
+
+#: backends/platform/symbian/src/SymbianActions.cpp:48
+msgid "Swap character"
+msgstr "Zmieñ postaæ"
+
+#: backends/platform/symbian/src/SymbianActions.cpp:49
+msgid "Skip text"
+msgstr "Pomiñ tekst"
+
+#: backends/platform/symbian/src/SymbianActions.cpp:51
+msgid "Fast mode"
+msgstr "Tryb szybki"
+
+#: 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:218
+#: engines/scumm/dialogs.cpp:192 engines/scumm/help.cpp:82
+#: engines/scumm/help.cpp:84
+msgid "Quit"
+msgstr "Zakoñcz"
+
+#: backends/platform/symbian/src/SymbianActions.cpp:53
+msgid "Debugger"
+msgstr "Debugger"
+
+#: backends/platform/symbian/src/SymbianActions.cpp:54
+msgid "Global menu"
+msgstr "Menu globalne"
+
+#: backends/platform/symbian/src/SymbianActions.cpp:55
+msgid "Virtual keyboard"
+msgstr "Wirtualna klawiatura"
+
+#: backends/platform/symbian/src/SymbianActions.cpp:56
+msgid "Key mapper"
+msgstr "Mapper klawiszy"
+
+#: backends/events/symbiansdl/symbiansdl-events.cpp:184
+msgid "Do you want to quit ?"
+msgstr "Chcesz wyj¶æ?"
+
+#: backends/platform/wii/options.cpp:51
+msgid "Video"
+msgstr "Wideo"
+
+#: backends/platform/wii/options.cpp:54
+msgid "Current video mode:"
+msgstr "Obecny tryb wideo:"
+
+#: backends/platform/wii/options.cpp:56
+msgid "Double-strike"
+msgstr "Podwójny atak"
+
+#: backends/platform/wii/options.cpp:60
+msgid "Horizontal underscan:"
+msgstr "Pionowy underscan:"
+
+#: backends/platform/wii/options.cpp:66
+msgid "Vertical underscan:"
+msgstr "Poziomy underscan:"
+
+#: backends/platform/wii/options.cpp:71
+msgid "Input"
+msgstr "Wej¶cie"
+
+#: backends/platform/wii/options.cpp:74
+msgid "GC Pad sensitivity:"
+msgstr "Czu³o¶æ pada GC:"
+
+#: backends/platform/wii/options.cpp:80
+msgid "GC Pad acceleration:"
+msgstr "Przy¶pieszenie pada GC:"
+
+#: backends/platform/wii/options.cpp:86
+msgid "DVD"
+msgstr "DVD"
+
+#: backends/platform/wii/options.cpp:89 backends/platform/wii/options.cpp:101
+msgid "Status:"
+msgstr "Stan:"
+
+#: backends/platform/wii/options.cpp:90 backends/platform/wii/options.cpp:102
+msgid "Unknown"
+msgstr "Nieznany"
+
+#: backends/platform/wii/options.cpp:93
+msgid "Mount DVD"
+msgstr "Zamontuj DVD"
+
+#: backends/platform/wii/options.cpp:94
+msgid "Unmount DVD"
+msgstr "Odmontuj DVD"
+
+#: backends/platform/wii/options.cpp:98
+msgid "SMB"
+msgstr "SMB"
+
+#: backends/platform/wii/options.cpp:106
+msgid "Server:"
+msgstr "Serwer:"
+
+#: backends/platform/wii/options.cpp:110
+msgid "Share:"
+msgstr "Udzia³:"
+
+#: backends/platform/wii/options.cpp:114
+msgid "Username:"
+msgstr "Nazwa u¿ytkownika:"
+
+#: backends/platform/wii/options.cpp:118
+msgid "Password:"
+msgstr "Has³o:"
+
+#: backends/platform/wii/options.cpp:121
+msgid "Init network"
+msgstr "Inicjalizacja sieci"
+
+#: backends/platform/wii/options.cpp:123
+msgid "Mount SMB"
+msgstr "Zamontuj SMB"
+
+#: backends/platform/wii/options.cpp:124
+msgid "Unmount SMB"
+msgstr "Odmontuj SMB"
+
+#: backends/platform/wii/options.cpp:143
+msgid "DVD Mounted successfully"
+msgstr "DVD zamontowane pomy¶lnie"
+
+#: backends/platform/wii/options.cpp:146
+msgid "Error while mounting the DVD"
+msgstr "B³±d przy montowaniu DVD"
+
+#: backends/platform/wii/options.cpp:148
+msgid "DVD not mounted"
+msgstr "DVD nie zamontowane"
+
+#: backends/platform/wii/options.cpp:161
+msgid "Network up, share mounted"
+msgstr "Sieæ dzia³a, udzia³ zamontowany"
+
+#: backends/platform/wii/options.cpp:163
+msgid "Network up"
+msgstr "Sieæ dzia³a"
+
+#: backends/platform/wii/options.cpp:166
+msgid ", error while mounting the share"
+msgstr ", b³±d podczas montowania udzia³u"
+
+#: backends/platform/wii/options.cpp:168
+msgid ", share not mounted"
+msgstr ", udzia³ nie zosta³ zamontowany"
+
+#: backends/platform/wii/options.cpp:174
+msgid "Network down"
+msgstr "Sieæ nie dzia³a"
+
+#: backends/platform/wii/options.cpp:178
+msgid "Initializing network"
+msgstr "Inicjalizacja sieci"
+
+#: backends/platform/wii/options.cpp:182
+msgid "Timeout while initializing network"
+msgstr "Przekroczono limit czasu inicjalizacji sieci"
+
+#: backends/platform/wii/options.cpp:186
+#, c-format
+msgid "Network not initialized (%d)"
+msgstr "Sieæ nie zosta³a zainicjalizowana (%d)"
+
+#: backends/platform/wince/CEActionsPocket.cpp:46
+msgid "Hide Toolbar"
+msgstr "Schowaj pasek narzêdzi"
+
+#: backends/platform/wince/CEActionsPocket.cpp:47
+msgid "Show Keyboard"
+msgstr "Poka¿ klawiaturê"
+
+#: backends/platform/wince/CEActionsPocket.cpp:48
+msgid "Sound on/off"
+msgstr "W³±cz/wy³±cz d¼wiêk"
+
+#: backends/platform/wince/CEActionsPocket.cpp:49
+msgid "Right click"
+msgstr "Klikniêcie PPM"
+
+#: backends/platform/wince/CEActionsPocket.cpp:50
+msgid "Show/Hide Cursor"
+msgstr "Poka¿/ukryj kursor"
+
+#: backends/platform/wince/CEActionsPocket.cpp:51
+msgid "Free look"
+msgstr "Swobodne rozgl±danie siê"
+
+#: backends/platform/wince/CEActionsPocket.cpp:52
+msgid "Zoom up"
+msgstr "Przybli¿"
+
+#: backends/platform/wince/CEActionsPocket.cpp:53
+msgid "Zoom down"
+msgstr "Oddal"
+
+#: backends/platform/wince/CEActionsPocket.cpp:55
+#: backends/platform/wince/CEActionsSmartphone.cpp:49
+msgid "Bind Keys"
+msgstr "Przypisz klawisze"
+
+#: backends/platform/wince/CEActionsPocket.cpp:56
+msgid "Cursor Up"
+msgstr "Kursor do góry"
+
+#: backends/platform/wince/CEActionsPocket.cpp:57
+msgid "Cursor Down"
+msgstr "Kursor w dó³"
+
+#: backends/platform/wince/CEActionsPocket.cpp:58
+msgid "Cursor Left"
+msgstr "Kursor w lewo"
+
+#: backends/platform/wince/CEActionsPocket.cpp:59
+msgid "Cursor Right"
+msgstr "Kursor w prawo"
+
+#: 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:326
+#: backends/platform/wince/CEActionsSmartphone.cpp:287
+msgid " Are you sure you want to quit ? "
+msgstr " Na pewno chcesz wyj¶æ? "
+
+#: backends/platform/wince/CEActionsSmartphone.cpp:50
+msgid "Keyboard"
+msgstr "Klawiatura"
+
+#: backends/platform/wince/CEActionsSmartphone.cpp:51
+msgid "Rotate"
+msgstr "Obrót"
+
+#: backends/platform/wince/CELauncherDialog.cpp:56
+msgid "Using SDL driver "
+msgstr "U¿yj sterownika SDL "
+
+#: backends/platform/wince/CELauncherDialog.cpp:60
+msgid "Display "
+msgstr "Obraz "
+
+#: 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:516
+msgid "Map right click action"
+msgstr "Przypisz dzia³anie PPM"
+
+#: backends/platform/wince/wince-sdl.cpp:520
+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:529
+msgid "Map hide toolbar action"
+msgstr "Przypisz chowanie paska narzêdzi"
+
+#: backends/platform/wince/wince-sdl.cpp:533
+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:542
+msgid "Map Zoom Up action (optional)"
+msgstr "Przypisz Przybli¿anie (opcjonalne)"
+
+#: backends/platform/wince/wince-sdl.cpp:545
+msgid "Map Zoom Down action (optional)"
+msgstr "Przypisz Oddalenie (opcjonalne)"
+
+#: backends/platform/wince/wince-sdl.cpp:553
+msgid ""
+"Don't forget to map a key to 'Hide Toolbar' action to see the whole inventory"
+msgstr ""
+"Nie zapomnij przypisaæ klawisza 'Ukryj pasek narzêdzi', by widzieæ ca³y "
+"ekwipunek"
+
+#: backends/events/default/default-events.cpp:196
+msgid "Do you really want to return to the Launcher?"
+msgstr "Na pewno chcesz powróciæ do launchera?"
+
+#: backends/events/default/default-events.cpp:196
+msgid "Launcher"
+msgstr "Launcher"
+
+#: backends/events/default/default-events.cpp:218
+msgid "Do you really want to quit?"
+msgstr "Na pewno chcesz wyj¶æ?"
+
+#: backends/events/gph/gph-events.cpp:386
+#: backends/events/gph/gph-events.cpp:429
+#: backends/events/openpandora/op-events.cpp:168
+msgid "Touchscreen 'Tap Mode' - Left Click"
+msgstr "Dotkniêcie ekranu - klikniêcie LPM"
+
+#: backends/events/gph/gph-events.cpp:388
+#: backends/events/gph/gph-events.cpp:431
+#: backends/events/openpandora/op-events.cpp:170
+msgid "Touchscreen 'Tap Mode' - Right Click"
+msgstr "Dotkniêcie ekranu - klikniêcie PPM"
+
+#: backends/events/gph/gph-events.cpp:390
+#: backends/events/gph/gph-events.cpp:433
+#: backends/events/openpandora/op-events.cpp:172
+msgid "Touchscreen 'Tap Mode' - Hover (No Click)"
+msgstr "Dotkniêcie ekranu - przytrzymanie (brak klikniêcia)"
+
+#: backends/events/gph/gph-events.cpp:410
+msgid "Maximum Volume"
+msgstr "Maksymalna g³o¶no¶æ"
+
+#: backends/events/gph/gph-events.cpp:412
+msgid "Increasing Volume"
+msgstr "Zwiêkszenie g³o¶no¶ci"
+
+#: backends/events/gph/gph-events.cpp:418
+msgid "Minimal Volume"
+msgstr "Minimalna g³o¶no¶æ"
+
+#: backends/events/gph/gph-events.cpp:420
+msgid "Decreasing Volume"
+msgstr "Zmniejszenie g³o¶no¶ci"
+
+#: backends/events/openpandora/op-events.cpp:174
+msgid "Touchscreen 'Tap Mode' - Hover (DPad Clicks)"
+msgstr "Dotkniêcie ekranu - przytrzymanie (krzy¿ak klika)"
+
+#: backends/updates/macosx/macosx-updates.mm:67
+msgid "Check for Updates..."
+msgstr "Sprawd¼ aktualizacjê..."
+
+#: backends/platform/tizen/form.cpp:263
+msgid "Right Click Once"
+msgstr "Pojedyncze klikniêcie PPM"
+
+#: backends/platform/tizen/form.cpp:271
+msgid "Move Only"
+msgstr "Tylko ruch"
+
+#: backends/platform/tizen/form.cpp:294
+msgid "Escape Key"
+msgstr "Przycisk wyj¶cia"
+
+#: backends/platform/tizen/form.cpp:299
+msgid "Game Menu"
+msgstr "Menu gry"
+
+#: backends/platform/tizen/form.cpp:304
+msgid "Show Keypad"
+msgstr "Poka¿ klawiaturê"
+
+#: backends/platform/tizen/form.cpp:309
+msgid "Control Mouse"
+msgstr "Steruj myszk±"
+
+#: backends/events/maemosdl/maemosdl-events.cpp:192
+msgid "Clicking Enabled"
+msgstr "Klikanie w³±czone"
+
+#: backends/events/maemosdl/maemosdl-events.cpp:192
+msgid "Clicking Disabled"
+msgstr "Klikanie wy³±czone"
+
+#: engines/agi/detection.cpp:142 engines/drascula/detection.cpp:302
+#: engines/dreamweb/detection.cpp:47 engines/neverhood/detection.cpp:160
+#: engines/sci/detection.cpp:394 engines/toltecs/detection.cpp:186
msgid "Use original save/load screens"
msgstr "U¿yj oryginalnych ekranów odczytu/zapisu"
-#: engines/agi/detection.cpp:143 engines/drascula/detection.cpp:271
-#: engines/dreamweb/detection.cpp:48 engines/sci/detection.cpp:394
-#: engines/toltecs/detection.cpp:174
+#: engines/agi/detection.cpp:143 engines/drascula/detection.cpp:303
+#: engines/dreamweb/detection.cpp:48 engines/neverhood/detection.cpp:161
+#: engines/sci/detection.cpp:395 engines/toltecs/detection.cpp:187
msgid "Use the original save/load screens, instead of the ScummVM ones"
msgstr "U¿yj oryginalnych ekranów odczytu/zapisu zamiast tych ze ScummVM"
-#: engines/agi/saveload.cpp:816 engines/drascula/saveload.cpp:351
-#: engines/sci/engine/kfile.cpp:841 engines/toltecs/menu.cpp:259
+#: engines/agi/saveload.cpp:816 engines/drascula/saveload.cpp:349
+#: engines/neverhood/menumodule.cpp:886 engines/sci/engine/kfile.cpp:857
+#: engines/toltecs/menu.cpp:256
msgid "Restore game:"
msgstr "Wznów grê:"
-#: engines/agi/saveload.cpp:816 engines/drascula/saveload.cpp:351
-#: engines/sci/engine/kfile.cpp:841 engines/toltecs/menu.cpp:259
+#: engines/agi/saveload.cpp:816 engines/drascula/saveload.cpp:349
+#: engines/neverhood/menumodule.cpp:886 engines/sci/engine/kfile.cpp:857
+#: engines/toltecs/menu.cpp:256
msgid "Restore"
msgstr "Wznów"
-#: engines/drascula/saveload.cpp:49
+#: engines/agos/saveload.cpp:160 engines/scumm/scumm.cpp:2321
+#, c-format
+msgid ""
+"Failed to load game state from file:\n"
+"\n"
+"%s"
+msgstr ""
+"Nie uda³o siê wczytaæ stanu gry z pliku:\n"
+"\n"
+"%s"
+
+#: engines/agos/saveload.cpp:195 engines/scumm/scumm.cpp:2314
+#, c-format
+msgid ""
+"Failed to save game state to file:\n"
+"\n"
+"%s"
+msgstr ""
+"Nie uda³o siê zapisaæ stanu gry do pliku:\n"
+"\n"
+"%s"
+
+#: engines/agos/saveload.cpp:203 engines/scumm/scumm.cpp:2332
+#, c-format
+msgid ""
+"Successfully saved game state in file:\n"
+"\n"
+"%s"
+msgstr ""
+"Pomy¶lnie zapisano stan w pliku:\n"
+"\n"
+"%s"
+
+#: engines/agos/animation.cpp:557
+#, c-format
+msgid "Cutscene file '%s' not found!"
+msgstr "Nie znaleziono pliku przerywnika '%s'!"
+
+#: engines/drascula/saveload.cpp:47
msgid ""
"ScummVM found that you have old savefiles for Drascula that should be "
"converted.\n"
@@ -1430,27 +2158,302 @@ msgstr "U¿yj trybu jasnej palety"
msgid "Display graphics using the game's bright palette"
msgstr "Wy¶wietlaj grafikê za pomoc± jasnej palety gry"
-#: engines/sci/detection.cpp:373
+#: engines/gob/inter_playtoons.cpp:256 engines/gob/inter_v2.cpp:1470
+#: engines/tinsel/saveload.cpp:532
+msgid "Failed to load game state from file."
+msgstr "Nie uda³o siê wczytaæ stanu gry z pliku."
+
+#: engines/gob/inter_v2.cpp:1540 engines/tinsel/saveload.cpp:545
+msgid "Failed to save game state to file."
+msgstr "Nie uda³o siê zapisaæ stanu gry do pliku."
+
+#: engines/gob/inter_v5.cpp:107
+msgid "Failed to delete file."
+msgstr "Nie uda³o siê usun±æ pliku."
+
+#: engines/groovie/detection.cpp:312
+msgid "Fast movie speed"
+msgstr "Przy¶pieszone filmy"
+
+#: engines/groovie/detection.cpp:313
+msgid "Play movies at an increased speed"
+msgstr "Odtwarzaj filmy ze zwiêkszon± prêdko¶ci±"
+
+#: engines/groovie/script.cpp:399
+msgid "Failed to save game"
+msgstr "Nie uda³o siê zapisaæ stanu gry"
+
+#. I18N: Studio audience adds an applause and cheering sounds whenever
+#. Malcolm makes a joke.
+#: engines/kyra/detection.cpp:62
+msgid "Studio audience"
+msgstr "Publiczno¶æ studyjna"
+
+#: engines/kyra/detection.cpp:63
+msgid "Enable studio audience"
+msgstr "W³±cz publiczno¶æ studyjn±"
+
+#. I18N: This option allows the user to skip text and cutscenes.
+#: engines/kyra/detection.cpp:73
+msgid "Skip support"
+msgstr "Obs³uga pomijania"
+
+#: engines/kyra/detection.cpp:74
+msgid "Allow text and cutscenes to be skipped"
+msgstr "Pozwól pomijaæ tekst i przerywniki"
+
+#. I18N: Helium mode makes people sound like they've inhaled Helium.
+#: engines/kyra/detection.cpp:84
+msgid "Helium mode"
+msgstr "Tryb helowy"
+
+#: engines/kyra/detection.cpp:85
+msgid "Enable helium mode"
+msgstr "W³±cz tryb helowy"
+
+#. I18N: When enabled, this option makes scrolling smoother when
+#. changing from one screen to another.
+#: engines/kyra/detection.cpp:99
+msgid "Smooth scrolling"
+msgstr "P³ynne przewijanie"
+
+#: engines/kyra/detection.cpp:100
+msgid "Enable smooth scrolling when walking"
+msgstr "W³±cz p³ynne przewijanie przy chodzeniu"
+
+#. I18N: When enabled, this option changes the cursor when it floats to the
+#. edge of the screen to a directional arrow. The player can then click to
+#. walk towards that direction.
+#: engines/kyra/detection.cpp:112
+msgid "Floating cursors"
+msgstr "P³ywaj±ce kursory"
+
+#: engines/kyra/detection.cpp:113
+msgid "Enable floating cursors"
+msgstr "W³±cz p³ywaj±ce kursory"
+
+#. I18N: HP stands for Hit Points
+#: engines/kyra/detection.cpp:127
+msgid "HP bar graphs"
+msgstr "Histogramy HP"
+
+#: engines/kyra/detection.cpp:128
+msgid "Enable hit point bar graphs"
+msgstr "W³±cz histogramy punktów ¿ycia"
+
+#: engines/kyra/lol.cpp:478
+msgid "Attack 1"
+msgstr "Atak 1"
+
+#: engines/kyra/lol.cpp:479
+msgid "Attack 2"
+msgstr "Atak 2"
+
+#: engines/kyra/lol.cpp:480
+msgid "Attack 3"
+msgstr "Atak 3"
+
+#: engines/kyra/lol.cpp:481
+msgid "Move Forward"
+msgstr "Ruch naprzód"
+
+#: engines/kyra/lol.cpp:482
+msgid "Move Back"
+msgstr "Ruch wstecz"
+
+#: engines/kyra/lol.cpp:483
+msgid "Slide Left"
+msgstr "¦lizg w lewo"
+
+#: engines/kyra/lol.cpp:484
+msgid "Slide Right"
+msgstr "¦lizg w prawo"
+
+#: engines/kyra/lol.cpp:485 engines/pegasus/pegasus.cpp:2509
+msgid "Turn Left"
+msgstr "Obrót w lewo"
+
+#: engines/kyra/lol.cpp:486 engines/pegasus/pegasus.cpp:2510
+msgid "Turn Right"
+msgstr "Obrót w prawo"
+
+#: engines/kyra/lol.cpp:487
+msgid "Rest"
+msgstr "Odpoczynek"
+
+#: engines/kyra/lol.cpp:488
+msgid "Options"
+msgstr "Opcje"
+
+#: engines/kyra/lol.cpp:489
+msgid "Choose Spell"
+msgstr "Wybierz zaklêcie"
+
+#: engines/kyra/sound_midi.cpp:477
+msgid ""
+"You appear to be using a General MIDI device,\n"
+"but your game only supports Roland MT32 MIDI.\n"
+"We try to map the Roland MT32 instruments to\n"
+"General MIDI ones. It is still possible that\n"
+"some tracks sound incorrect."
+msgstr ""
+"Wygl±da na to, ¿e u¿ywasz urz±dzenia General MIDI, ale gra obs³uguje tylko "
+"MIDI Roland MT32.\n"
+"Próbujemy przypisaæ instrumenty Rolanda MT32 do instrumentów General MIDI. "
+"Niektóre utwory mog± byæ ¼le odtwarzane."
+
+#. I18N: Option for fast scene switching
+#: engines/mohawk/dialogs.cpp:92 engines/mohawk/dialogs.cpp:167
+msgid "~Z~ip Mode Activated"
+msgstr "~T~ryb turbo aktywny"
+
+#: engines/mohawk/dialogs.cpp:93
+msgid "~T~ransitions Enabled"
+msgstr "~P~rzej¶cia w³±czone"
+
+#. I18N: Drop book page
+#: engines/mohawk/dialogs.cpp:95
+msgid "~D~rop Page"
+msgstr "~O~pu¶æ stronê"
+
+#: engines/mohawk/dialogs.cpp:99
+msgid "~S~how Map"
+msgstr "~P~oka¿ mapê"
+
+#: engines/mohawk/dialogs.cpp:105
+msgid "~M~ain Menu"
+msgstr "~M~enu g³ówne"
+
+#: engines/mohawk/dialogs.cpp:168
+msgid "~W~ater Effect Enabled"
+msgstr "~E~fekty wody w³±czone"
+
+#: engines/neverhood/detection.cpp:167
+msgid "Skip the Hall of Records storyboard scenes"
+msgstr ""
+
+#: engines/neverhood/detection.cpp:168
+msgid "Allows the player to skip past the Hall of Records storyboard scenes"
+msgstr ""
+
+#: engines/neverhood/detection.cpp:174
+msgid "Scale the making of videos to full screen"
+msgstr ""
+
+#: engines/neverhood/detection.cpp:175
+msgid "Scale the making of videos, so that they use the whole screen"
+msgstr ""
+
+#: engines/parallaction/saveload.cpp:133
+#, c-format
+msgid ""
+"Can't save game in slot %i\n"
+"\n"
+msgstr ""
+"Nie mo¿na zapisaæ w slocie %i\n"
+"\n"
+
+#: engines/parallaction/saveload.cpp:204
+msgid "Loading game..."
+msgstr "Wczytywanie stanu gry..."
+
+#: engines/parallaction/saveload.cpp:219
+msgid "Saving game..."
+msgstr "Zapisywanie stanu gry..."
+
+#: engines/parallaction/saveload.cpp:272
+msgid ""
+"ScummVM found that you have old savefiles for Nippon Safes that should be "
+"renamed.\n"
+"The old names are 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 next time.\n"
+msgstr ""
+"ScummVM znalaz³ stare zapisy z Nippon Safes, które nale¿y przekonwertowaæ.\n"
+"Stary format zapisu nie jest ju¿ obs³ugiwany. Nie bêdziesz móg³ wczytaæ "
+"zapisów, je¶li ich nie przekonwertujesz.\n"
+"\n"
+"Naci¶nij OK, ¿eby je teraz przekonwertowaæ. W przeciwnym wypadku zostaniesz "
+"zapytany ponownie przy nastêpnym w³±czeniu gry.\n"
+
+#: engines/parallaction/saveload.cpp:319
+msgid "ScummVM successfully converted all your savefiles."
+msgstr "ScummVM pomy¶lnie przekonwertowa³ wszystkie twoje zapisy."
+
+#: engines/parallaction/saveload.cpp:321
+msgid ""
+"ScummVM printed some warnings in your console window and can't guarantee all "
+"your files have been converted.\n"
+"\n"
+"Please report to the team."
+msgstr ""
+"ScummVM wy¶wietli³ ostrze¿enia w oknie konsoli i nie mo¿e zagwarantowaæ, ¿e "
+"wszystkie twoje pliki zosta³y przekonwertowane.\n"
+"\n"
+"Prosimy o zg³oszenie tego zespo³owi."
+
+#: engines/pegasus/pegasus.cpp:714
+msgid "Invalid save file name"
+msgstr "Nieprawid³owa nazwa pliku zapisu"
+
+#: engines/pegasus/pegasus.cpp:2507
+msgid "Up/Zoom In/Move Forward/Open Doors"
+msgstr "Góra/Przybli¿/Ruch naprzód/Otwórz drzwi"
+
+#: engines/pegasus/pegasus.cpp:2508
+msgid "Down/Zoom Out"
+msgstr "Dó³/Oddal"
+
+#: engines/pegasus/pegasus.cpp:2511
+msgid "Display/Hide Inventory Tray"
+msgstr "Poka¿/schowaj przedmioty"
+
+#: engines/pegasus/pegasus.cpp:2512
+msgid "Display/Hide Biochip Tray"
+msgstr "Poka¿/schowaj biochipy"
+
+#: engines/pegasus/pegasus.cpp:2513
+msgid "Action/Select"
+msgstr "Akcja/Wybór"
+
+#: engines/pegasus/pegasus.cpp:2514
+msgid "Toggle Center Data Display"
+msgstr "W³±cz/wy³±cz widok danych"
+
+#: engines/pegasus/pegasus.cpp:2515
+msgid "Display/Hide Info Screen"
+msgstr "Poka¿/schowaj ekran informacji"
+
+#: engines/pegasus/pegasus.cpp:2516
+msgid "Display/Hide Pause Menu"
+msgstr "Poka¿/schowaj menu pauzy"
+
+#: engines/pegasus/pegasus.cpp:2517
+msgid "???"
+msgstr "???"
+
+#: engines/sci/detection.cpp:374
msgid "EGA undithering"
msgstr "Anty-dithering EGA"
-#: engines/sci/detection.cpp:374
+#: engines/sci/detection.cpp:375
msgid "Enable undithering in EGA games"
msgstr "W³±cz anty-dithering we wspieranych grach EGA"
-#: engines/sci/detection.cpp:383
+#: engines/sci/detection.cpp:384
msgid "Prefer digital sound effects"
msgstr "Preferuj cyfrowe efekty d¼wiêkowe"
-#: engines/sci/detection.cpp:384
+#: engines/sci/detection.cpp:385
msgid "Prefer digital sound effects instead of synthesized ones"
msgstr "Preferuj cyfrowe efekty d¼wiêkowe zamiast syntezowanych"
-#: engines/sci/detection.cpp:403
+#: engines/sci/detection.cpp:404
msgid "Use IMF/Yamaha FB-01 for MIDI output"
msgstr "U¿yj IMF/Yamaha FB-01 dla wyj¶cia MIDI"
-#: engines/sci/detection.cpp:404
+#: engines/sci/detection.cpp:405
msgid ""
"Use an IBM Music Feature card or a Yamaha FB-01 FM synth module for MIDI "
"output"
@@ -1458,165 +2461,147 @@ msgstr ""
"U¿yj karty IBM Music Feature lub modu³u syntezy FM Yamaha FB-01 dla wyj¶cia "
"MIDI"
-#: engines/sci/detection.cpp:414
+#: engines/sci/detection.cpp:415
msgid "Use CD audio"
msgstr "U¿yj CD audio"
-#: engines/sci/detection.cpp:415
+#: engines/sci/detection.cpp:416
msgid "Use CD audio instead of in-game audio, if available"
msgstr "U¿yj CD audio zamiast muzyki w grze, je¶li jest dostêpne"
-#: engines/sci/detection.cpp:425
+#: engines/sci/detection.cpp:426
msgid "Use Windows cursors"
msgstr "U¿yj windowsowych kursorów"
-#: engines/sci/detection.cpp:426
+#: engines/sci/detection.cpp:427
msgid ""
"Use the Windows cursors (smaller and monochrome) instead of the DOS ones"
msgstr ""
"U¿yj windowsowych kursorów (mniejsze i monochromatyczne) zamiast DOS-owych"
-#: engines/sci/detection.cpp:436
+#: engines/sci/detection.cpp:437
msgid "Use silver cursors"
msgstr "U¿yj srebrnych kursorów"
-#: engines/sci/detection.cpp:437
+#: engines/sci/detection.cpp:438
msgid ""
"Use the alternate set of silver cursors, instead of the normal golden ones"
msgstr ""
"U¿yj alternatywnego zestawu srebrnych kursorów zamiast zwyk³ych z³otych"
-#: engines/scumm/dialogs.cpp:175
+#: engines/scumm/dialogs.cpp:176
#, c-format
msgid "Insert Disk %c and Press Button to Continue."
msgstr "W³ó¿ dysk %c i naci¶nij przycisk, aby kontynuowaæ."
-#: engines/scumm/dialogs.cpp:176
+#: engines/scumm/dialogs.cpp:177
#, c-format
msgid "Unable to Find %s, (%c%d) Press Button."
msgstr "Nie znaleziono %s, (%c%d). Naci¶nij przycisk."
-#: engines/scumm/dialogs.cpp:177
+#: engines/scumm/dialogs.cpp:178
#, c-format
msgid "Error reading disk %c, (%c%d) Press Button."
msgstr "B³±d podczas odczytu dysku %c, (%c%d). Naci¶nij przycisk."
-#: engines/scumm/dialogs.cpp:178
+#: engines/scumm/dialogs.cpp:179
msgid "Game Paused. Press SPACE to Continue."
msgstr "Gra wstrzymana. Naci¶nij spacjê, aby wznowiæ."
#. 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
+#: engines/scumm/dialogs.cpp:183
msgid "Are you sure you want to restart? (Y/N)"
msgstr "Na pewno chcesz zrestartowaæ grê? (T/N)T"
#. I18N: you may specify 'Yes' symbol at the end of the line. See previous comment
-#: engines/scumm/dialogs.cpp:184
+#: engines/scumm/dialogs.cpp:185
msgid "Are you sure you want to quit? (Y/N)"
msgstr "Na pewno chcesz wyj¶æ? (T/N)T"
-#: engines/scumm/dialogs.cpp:189
+#: engines/scumm/dialogs.cpp:190
msgid "Play"
msgstr "Uruchom"
-#: 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:215
-msgid "Quit"
-msgstr "Zakoñcz"
-
-#: engines/scumm/dialogs.cpp:193
+#: engines/scumm/dialogs.cpp:194
msgid "Insert save/load game disk"
msgstr "W³ó¿ dysk zapisu"
-#: engines/scumm/dialogs.cpp:194
+#: engines/scumm/dialogs.cpp:195
msgid "You must enter a name"
msgstr "Musisz podaæ nazwê"
-#: engines/scumm/dialogs.cpp:195
+#: engines/scumm/dialogs.cpp:196
msgid "The game was NOT saved (disk full?)"
msgstr "NIE zapisano stanu gry (brak miejsca?)"
-#: engines/scumm/dialogs.cpp:196
+#: engines/scumm/dialogs.cpp:197
msgid "The game was NOT loaded"
msgstr "NIE wczytano gry"
-#: engines/scumm/dialogs.cpp:197
+#: engines/scumm/dialogs.cpp:198
#, c-format
msgid "Saving '%s'"
msgstr "Zapisywanie '%s'"
-#: engines/scumm/dialogs.cpp:198
+#: engines/scumm/dialogs.cpp:199
#, c-format
msgid "Loading '%s'"
msgstr "Wczytywanie '%s'"
-#: engines/scumm/dialogs.cpp:199
+#: engines/scumm/dialogs.cpp:200
msgid "Name your SAVE game"
msgstr "Podaj nazwê zapisu"
-#: engines/scumm/dialogs.cpp:200
+#: engines/scumm/dialogs.cpp:201
msgid "Select a game to LOAD"
msgstr "Wybierz zapis do wczytania"
-#: engines/scumm/dialogs.cpp:201
+#: engines/scumm/dialogs.cpp:202
msgid "Game title)"
msgstr "Tytu³ gry)"
#. I18N: Previous page button
-#: engines/scumm/dialogs.cpp:287
+#: engines/scumm/dialogs.cpp:288
msgid "~P~revious"
msgstr "~P~oprzednia"
#. I18N: Next page button
-#: engines/scumm/dialogs.cpp:289
+#: engines/scumm/dialogs.cpp:290
msgid "~N~ext"
msgstr "~N~astêpna"
-#: engines/scumm/dialogs.cpp:290
-#: backends/platform/ds/arm9/source/dsoptions.cpp:56
-msgid "~C~lose"
-msgstr "~Z~amknij"
-
-#: engines/scumm/dialogs.cpp:597
+#: engines/scumm/dialogs.cpp:598
msgid "Speech Only"
msgstr "Tylko mowa"
-#: engines/scumm/dialogs.cpp:598
+#: engines/scumm/dialogs.cpp:599
msgid "Speech and Subtitles"
msgstr "Mowa i napisy"
-#: engines/scumm/dialogs.cpp:599
+#: engines/scumm/dialogs.cpp:600
msgid "Subtitles Only"
msgstr "Tylko napisy"
-#: engines/scumm/dialogs.cpp:607
+#: engines/scumm/dialogs.cpp:608
msgctxt "lowres"
msgid "Speech & Subs"
msgstr "Mowa i napisy"
-#: engines/scumm/dialogs.cpp:653
+#: engines/scumm/dialogs.cpp:654
msgid "Select a Proficiency Level."
msgstr "Wybierz poziom umiejêtno¶ci."
-#: engines/scumm/dialogs.cpp:655
+#: engines/scumm/dialogs.cpp:656
msgid "Refer to your Loom(TM) manual for help."
msgstr "Pomocy szukaj w instrukcji do³±czonej do Loom(TM)."
-#: engines/scumm/dialogs.cpp:658
-msgid "Standard"
-msgstr "Standardowy"
-
-#: engines/scumm/dialogs.cpp:659
+#: engines/scumm/dialogs.cpp:660
msgid "Practice"
msgstr "Trening"
-#: engines/scumm/dialogs.cpp:660
+#: engines/scumm/dialogs.cpp:661
msgid "Expert"
msgstr "Ekspert"
@@ -2133,7 +3118,7 @@ msgstr "Leæ w prawo"
msgid "Fly to lower right"
msgstr "Leæ w dó³, w prawo"
-#: engines/scumm/scumm.cpp:1776
+#: engines/scumm/scumm.cpp:1777
#, c-format
msgid ""
"Native MIDI support requires the Roland Upgrade from LucasArts,\n"
@@ -2142,40 +3127,7 @@ msgstr ""
"Natywne wsparcie MIDI wymaga aktualizacji Rolanda od LucasArts,\n"
"ale brakuje %s. Prze³±czam na tryb AdLib."
-#: engines/scumm/scumm.cpp:2303 engines/agos/saveload.cpp:220
-#, c-format
-msgid ""
-"Failed to save game state to file:\n"
-"\n"
-"%s"
-msgstr ""
-"Nie uda³o siê zapisaæ stanu gry do pliku:\n"
-"\n"
-"%s"
-
-#: engines/scumm/scumm.cpp:2310 engines/agos/saveload.cpp:185
-#, c-format
-msgid ""
-"Failed to load game state from file:\n"
-"\n"
-"%s"
-msgstr ""
-"Nie uda³o siê wczytaæ stanu gry z pliku:\n"
-"\n"
-"%s"
-
-#: engines/scumm/scumm.cpp:2322 engines/agos/saveload.cpp:228
-#, c-format
-msgid ""
-"Successfully saved game state in file:\n"
-"\n"
-"%s"
-msgstr ""
-"Pomy¶lnie zapisano stan w pliku:\n"
-"\n"
-"%s"
-
-#: engines/scumm/scumm.cpp:2537
+#: engines/scumm/scumm.cpp:2547
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' "
@@ -2185,189 +3137,6 @@ msgstr ""
"tego nie obs³uguje. Aby zagraæ, u¿yj \"Dodaj grê...\" z menu startowego "
"ScummVM i wybierz podkatalog \"Maniac\" z katalogu gry Tentacle."
-#. I18N: Option for fast scene switching
-#: engines/mohawk/dialogs.cpp:92 engines/mohawk/dialogs.cpp:167
-msgid "~Z~ip Mode Activated"
-msgstr "~T~ryb turbo aktywny"
-
-#: engines/mohawk/dialogs.cpp:93
-msgid "~T~ransitions Enabled"
-msgstr "~P~rzej¶cia w³±czone"
-
-#. I18N: Drop book page
-#: engines/mohawk/dialogs.cpp:95
-msgid "~D~rop Page"
-msgstr "~O~pu¶æ stronê"
-
-#: engines/mohawk/dialogs.cpp:99
-msgid "~S~how Map"
-msgstr "~P~oka¿ mapê"
-
-#: engines/mohawk/dialogs.cpp:105
-msgid "~M~ain Menu"
-msgstr "~M~enu g³ówne"
-
-#: engines/mohawk/dialogs.cpp:168
-msgid "~W~ater Effect Enabled"
-msgstr "~E~fekty wody w³±czone"
-
-#: engines/agos/animation.cpp:557
-#, c-format
-msgid "Cutscene file '%s' not found!"
-msgstr "Nie znaleziono pliku przerywnika '%s'!"
-
-#: engines/gob/inter_playtoons.cpp:256 engines/gob/inter_v2.cpp:1287
-#: engines/tinsel/saveload.cpp:532
-msgid "Failed to load game state from file."
-msgstr "Nie uda³o siê wczytaæ stanu gry z pliku."
-
-#: engines/gob/inter_v2.cpp:1357 engines/tinsel/saveload.cpp:545
-msgid "Failed to save game state to file."
-msgstr "Nie uda³o siê zapisaæ stanu gry do pliku."
-
-#: engines/gob/inter_v5.cpp:107
-msgid "Failed to delete file."
-msgstr "Nie uda³o siê usun±æ pliku."
-
-#: engines/groovie/detection.cpp:312
-msgid "Fast movie speed"
-msgstr "Przy¶pieszone filmy"
-
-#: engines/groovie/detection.cpp:313
-msgid "Play movies at an increased speed"
-msgstr "Odtwarzaj filmy ze zwiêkszon± prêdko¶ci±"
-
-#: engines/groovie/script.cpp:420
-msgid "Failed to save game"
-msgstr "Nie uda³o siê zapisaæ stanu gry"
-
-#. I18N: Studio audience adds an applause and cheering sounds whenever
-#. Malcolm makes a joke.
-#: engines/kyra/detection.cpp:62
-msgid "Studio audience"
-msgstr "Publiczno¶æ studyjna"
-
-#: engines/kyra/detection.cpp:63
-msgid "Enable studio audience"
-msgstr "W³±cz publiczno¶æ studyjn±"
-
-#. I18N: This option allows the user to skip text and cutscenes.
-#: engines/kyra/detection.cpp:73
-msgid "Skip support"
-msgstr "Obs³uga pomijania"
-
-#: engines/kyra/detection.cpp:74
-msgid "Allow text and cutscenes to be skipped"
-msgstr "Pozwól pomijaæ tekst i przerywniki"
-
-#. I18N: Helium mode makes people sound like they've inhaled Helium.
-#: engines/kyra/detection.cpp:84
-msgid "Helium mode"
-msgstr "Tryb helowy"
-
-#: engines/kyra/detection.cpp:85
-msgid "Enable helium mode"
-msgstr "W³±cz tryb helowy"
-
-#. I18N: When enabled, this option makes scrolling smoother when
-#. changing from one screen to another.
-#: engines/kyra/detection.cpp:99
-msgid "Smooth scrolling"
-msgstr "P³ynne przewijanie"
-
-#: engines/kyra/detection.cpp:100
-msgid "Enable smooth scrolling when walking"
-msgstr "W³±cz p³ynne przewijanie przy chodzeniu"
-
-#. I18N: When enabled, this option changes the cursor when it floats to the
-#. edge of the screen to a directional arrow. The player can then click to
-#. walk towards that direction.
-#: engines/kyra/detection.cpp:112
-msgid "Floating cursors"
-msgstr "P³ywaj±ce kursory"
-
-#: engines/kyra/detection.cpp:113
-msgid "Enable floating cursors"
-msgstr "W³±cz p³ywaj±ce kursory"
-
-#. I18N: HP stands for Hit Points
-#: engines/kyra/detection.cpp:127
-msgid "HP bar graphs"
-msgstr "Histogramy HP"
-
-#: engines/kyra/detection.cpp:128
-msgid "Enable hit point bar graphs"
-msgstr "W³±cz histogramy punktów ¿ycia"
-
-#: engines/kyra/lol.cpp:478
-msgid "Attack 1"
-msgstr "Atak 1"
-
-#: engines/kyra/lol.cpp:479
-msgid "Attack 2"
-msgstr "Atak 2"
-
-#: engines/kyra/lol.cpp:480
-msgid "Attack 3"
-msgstr "Atak 3"
-
-#: engines/kyra/lol.cpp:481
-msgid "Move Forward"
-msgstr "Ruch naprzód"
-
-#: engines/kyra/lol.cpp:482
-msgid "Move Back"
-msgstr "Ruch wstecz"
-
-#: engines/kyra/lol.cpp:483
-msgid "Slide Left"
-msgstr "¦lizg w lewo"
-
-#: engines/kyra/lol.cpp:484
-msgid "Slide Right"
-msgstr "¦lizg w prawo"
-
-#: engines/kyra/lol.cpp:485 engines/pegasus/pegasus.cpp:2447
-msgid "Turn Left"
-msgstr "Obrót w lewo"
-
-#: engines/kyra/lol.cpp:486 engines/pegasus/pegasus.cpp:2448
-msgid "Turn Right"
-msgstr "Obrót w prawo"
-
-#: engines/kyra/lol.cpp:487
-msgid "Rest"
-msgstr "Odpoczynek"
-
-#: engines/kyra/lol.cpp:488
-msgid "Options"
-msgstr "Opcje"
-
-#: engines/kyra/lol.cpp:489
-msgid "Choose Spell"
-msgstr "Wybierz zaklêcie"
-
-#: engines/kyra/sound_midi.cpp:477
-msgid ""
-"You appear to be using a General MIDI device,\n"
-"but your game only supports Roland MT32 MIDI.\n"
-"We try to map the Roland MT32 instruments to\n"
-"General MIDI ones. It is still possible that\n"
-"some tracks sound incorrect."
-msgstr ""
-"Wygl±da na to, ¿e u¿ywasz urz±dzenia General MIDI, ale gra obs³uguje tylko "
-"MIDI Roland MT32.\n"
-"Próbujemy przypisaæ instrumenty Rolanda MT32 do instrumentów General MIDI. "
-"Niektóre utwory mog± byæ ¼le odtwarzane."
-
-#: engines/queen/queen.cpp:59
-msgid "Alternative intro"
-msgstr "Alternatywne intro"
-
-#: engines/queen/queen.cpp:60
-msgid "Use an alternative game intro (CD version only)"
-msgstr "U¿yj alternatywnego intra (tylko dla wersji CD)"
-
#: engines/sky/compact.cpp:130
msgid ""
"Unable to find \"sky.cpt\" file!\n"
@@ -2392,24 +3161,27 @@ msgstr "Intro z wersji dyskietkowej"
msgid "Use the floppy version's intro (CD version only)"
msgstr "U¿yj intra z wersji dyskietkowej (tylko dla wersji CD)"
-#: engines/sword1/animation.cpp:519
+#: engines/sword1/animation.cpp:524
#, c-format
msgid "PSX stream cutscene '%s' cannot be played in paletted mode"
msgstr ""
"Przerywnik w formacie strumieniowym PSX '%s' nie mo¿e zostaæ odtworzony w "
"trybie indeksowanym"
-#: engines/sword1/animation.cpp:540 engines/sword2/animation.cpp:439
+#: engines/sword1/animation.cpp:545 engines/sword2/animation.cpp:445
msgid "DXA cutscenes found but ScummVM has been built without zlib support"
msgstr ""
"Znaleziono przerywniki w formacie DXA, ale ScummVM jest skompilowany bez "
"obs³ugi zlib"
-#: engines/sword1/animation.cpp:550 engines/sword2/animation.cpp:449
-msgid "MPEG2 cutscenes are no longer supported"
-msgstr "Przerywniki w formacie MPEG2 nie s± ju¿ obs³ugiwane"
+#: engines/sword1/animation.cpp:561
+#, fuzzy
+msgid "MPEG-2 cutscenes found but ScummVM has been built without MPEG-2"
+msgstr ""
+"Znaleziono przerywniki PSX, ale ScummVM jest skompilowany bez obs³ugi trybu "
+"RGB"
-#: engines/sword1/animation.cpp:556 engines/sword2/animation.cpp:457
+#: engines/sword1/animation.cpp:568 engines/sword2/animation.cpp:470
#, c-format
msgid "Cutscene '%s' not found"
msgstr "Nie znaleziono przerywnika '%s'"
@@ -2453,13 +3225,21 @@ msgstr "Zachowaj nowy"
msgid "This is the end of the Broken Sword 1 Demo"
msgstr "To koniec dema Broken Sword 1"
-#: engines/sword2/animation.cpp:419
+#: engines/sword2/animation.cpp:425
msgid ""
"PSX cutscenes found but ScummVM has been built without RGB color support"
msgstr ""
"Znaleziono przerywniki PSX, ale ScummVM jest skompilowany bez obs³ugi trybu "
"RGB"
+#: engines/sword2/animation.cpp:461
+#, fuzzy
+msgid ""
+"MPEG-2 cutscenes found but ScummVM has been built without MPEG-2 support"
+msgstr ""
+"Znaleziono przerywniki w formacie DXA, ale ScummVM jest skompilowany bez "
+"obs³ugi zlib"
+
#: engines/sword2/sword2.cpp:79
msgid "Show object labels"
msgstr "Poka¿ etykiety obiektów"
@@ -2468,12 +3248,12 @@ msgstr "Poka¿ etykiety obiektów"
msgid "Show labels for objects on mouse hover"
msgstr "Poka¿ etykiety obiektów przy najechaniu myszk±"
-#: engines/teenagent/resources.cpp:94
+#: engines/teenagent/resources.cpp:95
msgid ""
"You're missing the 'teenagent.dat' file. Get it from the ScummVM website"
msgstr "Nie masz pliku 'teenagent.dat'. Pobierz go ze strony ScummVM"
-#: engines/teenagent/resources.cpp:115
+#: engines/teenagent/resources.cpp:116
msgid ""
"The teenagent.dat file is compressed and zlib hasn't been included in this "
"executable. Please decompress it"
@@ -2481,787 +3261,50 @@ msgstr ""
"Plik teenagent.dat jest skompresowany, a ScummVM nie zawiera obs³ugi zlib. "
"Rozpakuj plik."
-#: engines/parallaction/saveload.cpp:133
-#, c-format
-msgid ""
-"Can't save game in slot %i\n"
-"\n"
-msgstr ""
-"Nie mo¿na zapisaæ w slocie %i\n"
-"\n"
-
-#: engines/parallaction/saveload.cpp:204
-msgid "Loading game..."
-msgstr "Wczytywanie stanu gry..."
-
-#: engines/parallaction/saveload.cpp:219
-msgid "Saving game..."
-msgstr "Zapisywanie stanu gry..."
-
-#: engines/parallaction/saveload.cpp:272
-msgid ""
-"ScummVM found that you have old savefiles for Nippon Safes that should be "
-"renamed.\n"
-"The old names are 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 next time.\n"
-msgstr ""
-"ScummVM znalaz³ stare zapisy z Nippon Safes, które nale¿y przekonwertowaæ.\n"
-"Stary format zapisu nie jest ju¿ obs³ugiwany. Nie bêdziesz móg³ wczytaæ "
-"zapisów, je¶li ich nie przekonwertujesz.\n"
-"\n"
-"Naci¶nij OK, ¿eby je teraz przekonwertowaæ. W przeciwnym wypadku zostaniesz "
-"zapytany ponownie przy nastêpnym w³±czeniu gry.\n"
-
-#: engines/parallaction/saveload.cpp:319
-msgid "ScummVM successfully converted all your savefiles."
-msgstr "ScummVM pomy¶lnie przekonwertowa³ wszystkie twoje zapisy."
-
-#: engines/parallaction/saveload.cpp:321
-msgid ""
-"ScummVM printed some warnings in your console window and can't guarantee all "
-"your files have been converted.\n"
-"\n"
-"Please report to the team."
-msgstr ""
-"ScummVM wy¶wietli³ ostrze¿enia w oknie konsoli i nie mo¿e zagwarantowaæ, ¿e "
-"wszystkie twoje pliki zosta³y przekonwertowane.\n"
-"\n"
-"Prosimy o zg³oszenie tego zespo³owi."
-
-#: engines/pegasus/pegasus.cpp:679
-msgid "Invalid save file name"
-msgstr "Nieprawid³owa nazwa pliku zapisu"
-
-#: engines/pegasus/pegasus.cpp:2445
-msgid "Up/Zoom In/Move Forward/Open Doors"
-msgstr "Góra/Przybli¿/Ruch naprzód/Otwórz drzwi"
-
-#: engines/pegasus/pegasus.cpp:2446
-msgid "Down/Zoom Out"
-msgstr "Dó³/Oddal"
-
-#: engines/pegasus/pegasus.cpp:2449
-msgid "Display/Hide Inventory Tray"
-msgstr "Poka¿/schowaj przedmioty"
-
-#: engines/pegasus/pegasus.cpp:2450
-msgid "Display/Hide Biochip Tray"
-msgstr "Poka¿/schowaj biochipy"
-
-#: engines/pegasus/pegasus.cpp:2451
-msgid "Action/Select"
-msgstr "Akcja/Wybór"
-
-#: engines/pegasus/pegasus.cpp:2452
-msgid "Toggle Center Data Display"
-msgstr "W³±cz/wy³±cz widok danych"
-
-#: engines/pegasus/pegasus.cpp:2453
-msgid "Display/Hide Info Screen"
-msgstr "Poka¿/schowaj ekran informacji"
-
-#: engines/pegasus/pegasus.cpp:2454
-msgid "Display/Hide Pause Menu"
-msgstr "Poka¿/schowaj menu pauzy"
-
-#: engines/pegasus/pegasus.cpp:2455
-msgid "???"
-msgstr "???"
-
-#: audio/fmopl.cpp:49
-msgid "MAME OPL emulator"
-msgstr "Emulator OPL MAME"
-
-#: audio/fmopl.cpp:51
-msgid "DOSBox OPL emulator"
-msgstr "Emulator OPL DOSBox"
-
-#: audio/mididrv.cpp:209
-#, c-format
-msgid ""
-"The selected audio device '%s' was not found (e.g. might be turned off or "
-"disconnected)."
-msgstr ""
-"Nie znaleziono wybranego urz±dzenia audio '%s' (mo¿e byæ wy³±czone albo "
-"niepod³±czone)."
-
-#: audio/mididrv.cpp:209 audio/mididrv.cpp:221 audio/mididrv.cpp:257
-#: audio/mididrv.cpp:272
-msgid "Attempting to fall back to the next available device..."
-msgstr "Próbujê u¿yæ nastêpnego dostêpnego urz±dzenia..."
-
-#: audio/mididrv.cpp:221
-#, c-format
-msgid ""
-"The selected audio device '%s' cannot be used. See log file for more "
-"information."
-msgstr ""
-"Nie mo¿na u¿yæ wybranego urz±dzenia audio '%s'. Dalsze szczegó³y s± dostêpne "
-"w pliku dziennika."
-
-#: audio/mididrv.cpp:257
-#, c-format
-msgid ""
-"The preferred audio device '%s' was not found (e.g. might be turned off or "
-"disconnected)."
-msgstr ""
-"Nie znaleziono preferowanego urz±dzenia audio '%s' (mo¿e byæ wy³±czone albo "
-"niepod³±czone)."
-
-#: audio/mididrv.cpp:272
-#, c-format
-msgid ""
-"The preferred audio device '%s' cannot be used. See log file for more "
-"information."
-msgstr ""
-"Nie mo¿na u¿yæ preferowanego urz±dzenia audio '%s'. Dalsze szczegó³y s± "
-"dostêpne w pliku dziennika."
-
-#: audio/null.h:43
-msgid "No music"
-msgstr "Brak muzyki"
-
-#: audio/mods/paula.cpp:189
-msgid "Amiga Audio Emulator"
-msgstr "Emulator d¼wiêku Amigi"
-
-#: audio/softsynth/adlib.cpp:2284
-msgid "AdLib Emulator"
-msgstr "Emulator AdLib"
-
-#: audio/softsynth/appleiigs.cpp:33
-msgid "Apple II GS Emulator (NOT IMPLEMENTED)"
-msgstr "Emulator Apple II GS (NIE ZAIMPLEMENTOWANY)"
-
-#: audio/softsynth/sid.cpp:1430
-msgid "C64 Audio Emulator"
-msgstr "Emulator d¼wiêku C64"
-
-#: audio/softsynth/mt32.cpp:205
-msgid "Initializing MT-32 Emulator"
-msgstr "Inicjalizacja emulatora MT-32"
-
-#: audio/softsynth/mt32.cpp:431
-msgid "MT-32 Emulator"
-msgstr "Emulator MT-32"
-
-#: audio/softsynth/pcspk.cpp:139
-msgid "PC Speaker Emulator"
-msgstr "Emulator brzêczyka"
-
-#: audio/softsynth/pcspk.cpp:158
-msgid "IBM PCjr Emulator"
-msgstr "Emulator IBM PCjr"
-
-#: backends/keymapper/remap-dialog.cpp:47
-msgid "Keymap:"
-msgstr "Klawisze:"
-
-#: backends/keymapper/remap-dialog.cpp:66
-msgid " (Effective)"
-msgstr " (Dzia³a)"
-
-#: backends/keymapper/remap-dialog.cpp:106
-msgid " (Active)"
-msgstr " (Aktywny)"
-
-#: backends/keymapper/remap-dialog.cpp:106
-msgid " (Blocked)"
-msgstr " (Zablokowany)"
-
-#: backends/keymapper/remap-dialog.cpp:119
-msgid " (Global)"
-msgstr " (Globalny)"
-
-#: backends/keymapper/remap-dialog.cpp:127
-msgid " (Game)"
-msgstr " (Gra)"
-
-#: backends/midi/windows.cpp:164
-msgid "Windows MIDI"
-msgstr "Windows MIDI"
-
-#: backends/platform/ds/arm9/source/dsoptions.cpp:57
-msgid "ScummVM Main Menu"
-msgstr "G³ówne menu ScummVM"
-
-#: backends/platform/ds/arm9/source/dsoptions.cpp:63
-msgid "~L~eft handed mode"
-msgstr "~T~ryb dla leworêcznych"
-
-#: backends/platform/ds/arm9/source/dsoptions.cpp:64
-msgid "~I~ndy fight controls"
-msgstr "~S~terowanie walcz±cym Indym"
-
-#: backends/platform/ds/arm9/source/dsoptions.cpp:65
-msgid "Show mouse cursor"
-msgstr "Wy¶wietl kursor myszy"
-
-#: backends/platform/ds/arm9/source/dsoptions.cpp:66
-msgid "Snap to edges"
-msgstr "Przyci±ganie do krawêdzi"
-
-#: backends/platform/ds/arm9/source/dsoptions.cpp:68
-msgid "Touch X Offset"
-msgstr "Przesuniêcie X ekranu do dotykania"
-
-#: backends/platform/ds/arm9/source/dsoptions.cpp:75
-msgid "Touch Y Offset"
-msgstr "Przesuniêcie Y ekranu do dotykania"
-
-#: backends/platform/ds/arm9/source/dsoptions.cpp:87
-msgid "Use laptop trackpad-style cursor control"
-msgstr "U¿yj kursora w stylu trackpada z laptopa do sterowania"
-
-#: backends/platform/ds/arm9/source/dsoptions.cpp:88
-msgid "Tap for left click, double tap right click"
-msgstr "Puknij raz, aby klikn±æ LPM; dwa razy, aby klikn±æ PPM"
-
-#: backends/platform/ds/arm9/source/dsoptions.cpp:90
-msgid "Sensitivity"
-msgstr "Czu³o¶æ"
-
-#: backends/platform/ds/arm9/source/dsoptions.cpp:99
-msgid "Initial top screen scale:"
-msgstr "Wstêpna skala górnego ekranu:"
-
-#: backends/platform/ds/arm9/source/dsoptions.cpp:105
-msgid "Main screen scaling:"
-msgstr "Skalowanie g³ównego ekranu:"
-
-#: backends/platform/ds/arm9/source/dsoptions.cpp:107
-msgid "Hardware scale (fast, but low quality)"
-msgstr "Skalowanie sprzêtowe (szybsze, ale ni¿szej jako¶ci)"
-
-#: backends/platform/ds/arm9/source/dsoptions.cpp:108
-msgid "Software scale (good quality, but slower)"
-msgstr "Skalowanie programowe (wy¿szej jako¶ci, ale wolniejsze)"
-
-#: backends/platform/ds/arm9/source/dsoptions.cpp:109
-msgid "Unscaled (you must scroll left and right)"
-msgstr "Nieskalowany (musisz przewijaæ w lewo i prawo)"
-
-#: backends/platform/ds/arm9/source/dsoptions.cpp:111
-msgid "Brightness:"
-msgstr "Jasno¶æ:"
-
-#: backends/platform/ds/arm9/source/dsoptions.cpp:121
-msgid "High quality audio (slower) (reboot)"
-msgstr "D¼wiêk wysokiej jako¶ci (wolniejszy) (restart)"
-
-#: backends/platform/ds/arm9/source/dsoptions.cpp:122
-msgid "Disable power off"
-msgstr "Nie wy³±czaj zasilania"
-
-#: backends/platform/iphone/osys_events.cpp:300
-msgid "Mouse-click-and-drag mode enabled."
-msgstr "W³±czono tryb kliknij i przeci±gaj."
-
-#: backends/platform/iphone/osys_events.cpp:302
-msgid "Mouse-click-and-drag mode disabled."
-msgstr "Wy³±czono tryb kliknij i przeci±gaj."
-
-#: backends/platform/iphone/osys_events.cpp:313
-msgid "Touchpad mode enabled."
-msgstr "Tryb touchpada w³±czony."
-
-#: backends/platform/iphone/osys_events.cpp:315
-msgid "Touchpad mode disabled."
-msgstr "Tryb touchpada wy³±czony."
-
-#: backends/platform/maemo/maemo.cpp:209
-msgid "Click Mode"
-msgstr "Tryb klikania"
-
-#: backends/platform/maemo/maemo.cpp:215
-#: 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/maemo/maemo.cpp:218
-msgid "Middle Click"
-msgstr "¦rodkowy przycisk"
-
-#: backends/platform/maemo/maemo.cpp:221
-#: 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"
-
-#: backends/platform/sdl/macosx/appmenu_osx.mm:77
-msgid "Hide ScummVM"
-msgstr "Ukryj ScummVM"
-
-#: backends/platform/sdl/macosx/appmenu_osx.mm:82
-msgid "Hide Others"
-msgstr "Ukryj pozosta³e"
-
-#: backends/platform/sdl/macosx/appmenu_osx.mm:87
-msgid "Show All"
-msgstr "Poka¿ wszystkie"
-
-#: backends/platform/sdl/macosx/appmenu_osx.mm:109
-#: backends/platform/sdl/macosx/appmenu_osx.mm:120
-msgid "Window"
-msgstr "Okno"
-
-#: backends/platform/sdl/macosx/appmenu_osx.mm:114
-msgid "Minimize"
-msgstr "Miniaturka"
-
-#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:45
-msgid "Normal (no scaling)"
-msgstr "Zwyk³y (bez skalowania)"
-
-#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:64
-msgctxt "lowres"
-msgid "Normal (no scaling)"
-msgstr "Zwyk³y (bez skalowania)"
-
-#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2135
-#: backends/graphics/openglsdl/openglsdl-graphics.cpp:537
-msgid "Enabled aspect ratio correction"
-msgstr "W³±czono korekcjê formatu obrazu"
-
-#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2141
-#: backends/graphics/openglsdl/openglsdl-graphics.cpp:542
-msgid "Disabled aspect ratio correction"
-msgstr "Wy³±czono korekcjê formatu obrazu"
-
-#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2196
-msgid "Active graphics filter:"
-msgstr "Aktywny filtr graficzny:"
-
-#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2238
-#: backends/graphics/openglsdl/openglsdl-graphics.cpp:481
-msgid "Windowed mode"
-msgstr "Okno"
-
-#: backends/graphics/opengl/opengl-graphics.cpp:135
-msgid "OpenGL Normal"
-msgstr "OpenGL (normalny)"
-
-#: backends/graphics/opengl/opengl-graphics.cpp:136
-msgid "OpenGL Conserve"
-msgstr "OpenGL (zachowanie proporcji)"
-
-#: backends/graphics/opengl/opengl-graphics.cpp:137
-msgid "OpenGL Original"
-msgstr "OpenGL (oryginalny rozmiar)"
-
-#: backends/graphics/openglsdl/openglsdl-graphics.cpp:415
-msgid "Current display mode"
-msgstr "Obecny tryb wideo"
-
-#: backends/graphics/openglsdl/openglsdl-graphics.cpp:428
-msgid "Current scale"
-msgstr "Aktualne powiêkszenie"
-
-#: backends/graphics/openglsdl/openglsdl-graphics.cpp:562
-msgid "Active filter mode: Linear"
-msgstr "Aktywny tryb filtru: dwuliniowy"
-
-#: backends/graphics/openglsdl/openglsdl-graphics.cpp:564
-msgid "Active filter mode: Nearest"
-msgstr "Aktywny tryb filtru: najbli¿szy s±siad"
-
-#: backends/platform/symbian/src/SymbianActions.cpp:38
-#: backends/platform/wince/CEActionsSmartphone.cpp:39
-msgid "Up"
-msgstr "Do góry"
-
-#: backends/platform/symbian/src/SymbianActions.cpp:39
-#: backends/platform/wince/CEActionsSmartphone.cpp:40
-msgid "Down"
-msgstr "W dó³"
-
-#: backends/platform/symbian/src/SymbianActions.cpp:40
-#: backends/platform/wince/CEActionsSmartphone.cpp:41
-msgid "Left"
-msgstr "W lewo"
-
-#: backends/platform/symbian/src/SymbianActions.cpp:41
-#: backends/platform/wince/CEActionsSmartphone.cpp:42
-msgid "Right"
-msgstr "W prawo"
-
-#: backends/platform/symbian/src/SymbianActions.cpp:46
-#: backends/platform/wince/CEActionsSmartphone.cpp:47
-msgid "Zone"
-msgstr "Strefa"
-
-#: backends/platform/symbian/src/SymbianActions.cpp:47
-#: backends/platform/wince/CEActionsPocket.cpp:54
-#: backends/platform/wince/CEActionsSmartphone.cpp:48
-msgid "Multi Function"
-msgstr "Wielozadaniowy"
-
-#: backends/platform/symbian/src/SymbianActions.cpp:48
-msgid "Swap character"
-msgstr "Zmieñ postaæ"
-
-#: backends/platform/symbian/src/SymbianActions.cpp:49
-msgid "Skip text"
-msgstr "Pomiñ tekst"
-
-#: backends/platform/symbian/src/SymbianActions.cpp:51
-msgid "Fast mode"
-msgstr "Tryb szybki"
-
-#: backends/platform/symbian/src/SymbianActions.cpp:53
-msgid "Debugger"
-msgstr "Debugger"
-
-#: backends/platform/symbian/src/SymbianActions.cpp:54
-msgid "Global menu"
-msgstr "Menu globalne"
-
-#: backends/platform/symbian/src/SymbianActions.cpp:55
-msgid "Virtual keyboard"
-msgstr "Wirtualna klawiatura"
-
-#: backends/platform/symbian/src/SymbianActions.cpp:56
-msgid "Key mapper"
-msgstr "Mapper klawiszy"
-
-#: backends/events/symbiansdl/symbiansdl-events.cpp:184
-msgid "Do you want to quit ?"
-msgstr "Chcesz wyj¶æ?"
-
-#: backends/platform/wii/options.cpp:51
-msgid "Video"
-msgstr "Wideo"
-
-#: backends/platform/wii/options.cpp:54
-msgid "Current video mode:"
-msgstr "Obecny tryb wideo:"
-
-#: backends/platform/wii/options.cpp:56
-msgid "Double-strike"
-msgstr "Podwójny atak"
-
-#: backends/platform/wii/options.cpp:60
-msgid "Horizontal underscan:"
-msgstr "Pionowy underscan:"
-
-#: backends/platform/wii/options.cpp:66
-msgid "Vertical underscan:"
-msgstr "Poziomy underscan:"
-
-#: backends/platform/wii/options.cpp:71
-msgid "Input"
-msgstr "Wej¶cie"
-
-#: backends/platform/wii/options.cpp:74
-msgid "GC Pad sensitivity:"
-msgstr "Czu³o¶æ pada GC:"
-
-#: backends/platform/wii/options.cpp:80
-msgid "GC Pad acceleration:"
-msgstr "Przy¶pieszenie pada GC:"
-
-#: backends/platform/wii/options.cpp:86
-msgid "DVD"
-msgstr "DVD"
-
-#: backends/platform/wii/options.cpp:89 backends/platform/wii/options.cpp:101
-msgid "Status:"
-msgstr "Stan:"
-
-#: backends/platform/wii/options.cpp:90 backends/platform/wii/options.cpp:102
-msgid "Unknown"
-msgstr "Nieznany"
-
-#: backends/platform/wii/options.cpp:93
-msgid "Mount DVD"
-msgstr "Zamontuj DVD"
-
-#: backends/platform/wii/options.cpp:94
-msgid "Unmount DVD"
-msgstr "Odmontuj DVD"
-
-#: backends/platform/wii/options.cpp:98
-msgid "SMB"
-msgstr "SMB"
-
-#: backends/platform/wii/options.cpp:106
-msgid "Server:"
-msgstr "Serwer:"
-
-#: backends/platform/wii/options.cpp:110
-msgid "Share:"
-msgstr "Udzia³:"
-
-#: backends/platform/wii/options.cpp:114
-msgid "Username:"
-msgstr "Nazwa u¿ytkownika:"
-
-#: backends/platform/wii/options.cpp:118
-msgid "Password:"
-msgstr "Has³o:"
-
-#: backends/platform/wii/options.cpp:121
-msgid "Init network"
-msgstr "Inicjalizacja sieci"
-
-#: backends/platform/wii/options.cpp:123
-msgid "Mount SMB"
-msgstr "Zamontuj SMB"
-
-#: backends/platform/wii/options.cpp:124
-msgid "Unmount SMB"
-msgstr "Odmontuj SMB"
-
-#: backends/platform/wii/options.cpp:143
-msgid "DVD Mounted successfully"
-msgstr "DVD zamontowane pomy¶lnie"
-
-#: backends/platform/wii/options.cpp:146
-msgid "Error while mounting the DVD"
-msgstr "B³±d przy montowaniu DVD"
-
-#: backends/platform/wii/options.cpp:148
-msgid "DVD not mounted"
-msgstr "DVD nie zamontowane"
-
-#: backends/platform/wii/options.cpp:161
-msgid "Network up, share mounted"
-msgstr "Sieæ dzia³a, udzia³ zamontowany"
-
-#: backends/platform/wii/options.cpp:163
-msgid "Network up"
-msgstr "Sieæ dzia³a"
-
-#: backends/platform/wii/options.cpp:166
-msgid ", error while mounting the share"
-msgstr ", b³±d podczas montowania udzia³u"
-
-#: backends/platform/wii/options.cpp:168
-msgid ", share not mounted"
-msgstr ", udzia³ nie zosta³ zamontowany"
-
-#: backends/platform/wii/options.cpp:174
-msgid "Network down"
-msgstr "Sieæ nie dzia³a"
-
-#: backends/platform/wii/options.cpp:178
-msgid "Initializing network"
-msgstr "Inicjalizacja sieci"
-
-#: backends/platform/wii/options.cpp:182
-msgid "Timeout while initializing network"
-msgstr "Przekroczono limit czasu inicjalizacji sieci"
-
-#: backends/platform/wii/options.cpp:186
-#, c-format
-msgid "Network not initialized (%d)"
-msgstr "Sieæ nie zosta³a zainicjalizowana (%d)"
-
-#: backends/platform/wince/CEActionsPocket.cpp:46
-msgid "Hide Toolbar"
-msgstr "Schowaj pasek narzêdzi"
-
-#: backends/platform/wince/CEActionsPocket.cpp:47
-msgid "Show Keyboard"
-msgstr "Poka¿ klawiaturê"
-
-#: backends/platform/wince/CEActionsPocket.cpp:48
-msgid "Sound on/off"
-msgstr "W³±cz/wy³±cz d¼wiêk"
-
-#: backends/platform/wince/CEActionsPocket.cpp:49
-msgid "Right click"
-msgstr "Klikniêcie PPM"
-
-#: backends/platform/wince/CEActionsPocket.cpp:50
-msgid "Show/Hide Cursor"
-msgstr "Poka¿/ukryj kursor"
-
-#: backends/platform/wince/CEActionsPocket.cpp:51
-msgid "Free look"
-msgstr "Swobodne rozgl±danie siê"
-
-#: backends/platform/wince/CEActionsPocket.cpp:52
-msgid "Zoom up"
-msgstr "Przybli¿"
-
-#: backends/platform/wince/CEActionsPocket.cpp:53
-msgid "Zoom down"
-msgstr "Oddal"
-
-#: backends/platform/wince/CEActionsPocket.cpp:55
-#: backends/platform/wince/CEActionsSmartphone.cpp:49
-msgid "Bind Keys"
-msgstr "Przypisz klawisze"
-
-#: backends/platform/wince/CEActionsPocket.cpp:56
-msgid "Cursor Up"
-msgstr "Kursor do góry"
-
-#: backends/platform/wince/CEActionsPocket.cpp:57
-msgid "Cursor Down"
-msgstr "Kursor w dó³"
-
-#: backends/platform/wince/CEActionsPocket.cpp:58
-msgid "Cursor Left"
-msgstr "Kursor w lewo"
-
-#: backends/platform/wince/CEActionsPocket.cpp:59
-msgid "Cursor Right"
-msgstr "Kursor w prawo"
-
-#: 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:326
-#: backends/platform/wince/CEActionsSmartphone.cpp:287
-msgid " Are you sure you want to quit ? "
-msgstr " Na pewno chcesz wyj¶æ? "
-
-#: backends/platform/wince/CEActionsSmartphone.cpp:50
-msgid "Keyboard"
-msgstr "Klawiatura"
-
-#: backends/platform/wince/CEActionsSmartphone.cpp:51
-msgid "Rotate"
-msgstr "Obrót"
-
-#: backends/platform/wince/CELauncherDialog.cpp:56
-msgid "Using SDL driver "
-msgstr "U¿yj sterownika SDL "
-
-#: backends/platform/wince/CELauncherDialog.cpp:60
-msgid "Display "
-msgstr "Obraz "
-
-#: 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:515
-msgid "Map right click action"
-msgstr "Przypisz dzia³anie PPM"
-
-#: 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:528
-msgid "Map hide toolbar action"
-msgstr "Przypisz chowanie paska narzêdzi"
-
-#: 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:541
-msgid "Map Zoom Up action (optional)"
-msgstr "Przypisz Przybli¿anie (opcjonalne)"
-
-#: backends/platform/wince/wince-sdl.cpp:544
-msgid "Map Zoom Down action (optional)"
-msgstr "Przypisz Oddalenie (opcjonalne)"
-
-#: 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 ""
-"Nie zapomnij przypisaæ klawisza 'Ukryj pasek narzêdzi', by widzieæ ca³y "
-"ekwipunek"
-
-#: backends/events/default/default-events.cpp:193
-msgid "Do you really want to return to the Launcher?"
-msgstr "Na pewno chcesz powróciæ do launchera?"
-
-#: backends/events/default/default-events.cpp:193
-msgid "Launcher"
-msgstr "Launcher"
-
-#: backends/events/default/default-events.cpp:215
-msgid "Do you really want to quit?"
-msgstr "Na pewno chcesz wyj¶æ?"
-
-#: backends/events/gph/gph-events.cpp:386
-#: backends/events/gph/gph-events.cpp:429
-#: backends/events/openpandora/op-events.cpp:168
-msgid "Touchscreen 'Tap Mode' - Left Click"
-msgstr "Dotkniêcie ekranu - klikniêcie LPM"
-
-#: backends/events/gph/gph-events.cpp:388
-#: backends/events/gph/gph-events.cpp:431
-#: backends/events/openpandora/op-events.cpp:170
-msgid "Touchscreen 'Tap Mode' - Right Click"
-msgstr "Dotkniêcie ekranu - klikniêcie PPM"
-
-#: backends/events/gph/gph-events.cpp:390
-#: backends/events/gph/gph-events.cpp:433
-#: backends/events/openpandora/op-events.cpp:172
-msgid "Touchscreen 'Tap Mode' - Hover (No Click)"
-msgstr "Dotkniêcie ekranu - przytrzymanie (brak klikniêcia)"
-
-#: backends/events/gph/gph-events.cpp:410
-msgid "Maximum Volume"
-msgstr "Maksymalna g³o¶no¶æ"
+#~ msgctxt "lowres"
+#~ msgid "Mass Add..."
+#~ msgstr "Masowe dodawanie..."
-#: backends/events/gph/gph-events.cpp:412
-msgid "Increasing Volume"
-msgstr "Zwiêkszenie g³o¶no¶ci"
+#~ msgid "Mass Add..."
+#~ msgstr "Masowe dodawanie..."
-#: backends/events/gph/gph-events.cpp:418
-msgid "Minimal Volume"
-msgstr "Minimalna g³o¶no¶æ"
+#~ msgid ""
+#~ "Turns off General MIDI mapping for games with Roland MT-32 soundtrack"
+#~ msgstr ""
+#~ "Wy³±cza mapowanie General MIDI dla gier ze ¶cie¿k± d¼wiêkow± Roland MT-32"
-#: backends/events/gph/gph-events.cpp:420
-msgid "Decreasing Volume"
-msgstr "Zmniejszenie g³o¶no¶ci"
+#~ msgid "Standard (16bpp)"
+#~ msgstr "Standardowy (16bpp)"
-#: backends/events/openpandora/op-events.cpp:174
-msgid "Touchscreen 'Tap Mode' - Hover (DPad Clicks)"
-msgstr "Dotkniêcie ekranu - przytrzymanie (krzy¿ak klika)"
+#~ msgid "Alternative intro"
+#~ msgstr "Alternatywne intro"
-#: backends/updates/macosx/macosx-updates.mm:67
-msgid "Check for Updates..."
-msgstr "Sprawd¼ aktualizacjê..."
+#~ msgid "Use an alternative game intro (CD version only)"
+#~ msgstr "U¿yj alternatywnego intra (tylko dla wersji CD)"
-#: backends/platform/bada/form.cpp:269
-msgid "Right Click Once"
-msgstr "Pojedyncze klikniêcie PPM"
+#~ msgid "MPEG2 cutscenes are no longer supported"
+#~ msgstr "Przerywniki w formacie MPEG2 nie s± ju¿ obs³ugiwane"
-#: backends/platform/bada/form.cpp:277
-msgid "Move Only"
-msgstr "Tylko ruch"
+#~ msgid "OpenGL Normal"
+#~ msgstr "OpenGL (normalny)"
-#: backends/platform/bada/form.cpp:291
-msgid "Escape Key"
-msgstr "Przycisk wyj¶cia"
+#~ msgid "OpenGL Conserve"
+#~ msgstr "OpenGL (zachowanie proporcji)"
-#: backends/platform/bada/form.cpp:296
-msgid "Game Menu"
-msgstr "Menu gry"
+#~ msgid "OpenGL Original"
+#~ msgstr "OpenGL (oryginalny rozmiar)"
-#: backends/platform/bada/form.cpp:301
-msgid "Show Keypad"
-msgstr "Poka¿ klawiaturê"
+#~ msgid "Current display mode"
+#~ msgstr "Obecny tryb wideo"
-#: backends/platform/bada/form.cpp:309
-msgid "Control Mouse"
-msgstr "Steruj myszk±"
+#~ msgid "Current scale"
+#~ msgstr "Aktualne powiêkszenie"
-#: backends/events/maemosdl/maemosdl-events.cpp:192
-msgid "Clicking Enabled"
-msgstr "Klikanie w³±czone"
+#~ msgid "Active filter mode: Linear"
+#~ msgstr "Aktywny tryb filtru: dwuliniowy"
-#: backends/events/maemosdl/maemosdl-events.cpp:192
-msgid "Clicking Disabled"
-msgstr "Klikanie wy³±czone"
+#~ msgid "Active filter mode: Nearest"
+#~ msgstr "Aktywny tryb filtru: najbli¿szy s±siad"
#~ msgid "Enable Roland GS Mode"
#~ msgstr "W³±cz tryb Roland GS"
diff --git a/po/pt_BR.po b/po/pt_BR.po
index a3a5c3935c..a99fa4a4aa 100644
--- a/po/pt_BR.po
+++ b/po/pt_BR.po
@@ -1,5 +1,5 @@
# Portuguese (Brazilian) translation for ScummVM.
-# Copyright (C) 2010-2013 ScummVM Team
+# Copyright (C) 2010-2014 ScummVM Team
# This file is distributed under the same license as the ScummVM package.
# Saulo Benigno <saulobenigno@gmail.com>, 2010.
#
@@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: ScummVM 1.3.0svn\n"
"Report-Msgid-Bugs-To: scummvm-devel@lists.sf.net\n"
-"POT-Creation-Date: 2013-04-24 13:35+0100\n"
+"POT-Creation-Date: 2014-06-07 23:06+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"
@@ -20,78 +20,78 @@ msgstr ""
"X-Poedit-Country: BRAZIL\n"
"X-Poedit-SourceCharset: iso-8859-1\n"
-#: gui/about.cpp:93
+#: gui/about.cpp:94
#, c-format
msgid "(built on %s)"
msgstr "(desenvolvido em %s)"
-#: gui/about.cpp:100
+#: gui/about.cpp:101
msgid "Features compiled in:"
msgstr "Funções compiladas em:"
-#: gui/about.cpp:109
+#: gui/about.cpp:110
msgid "Available engines:"
msgstr "Programas disponíveis:"
-#: gui/browser.cpp:67
+#: gui/browser.cpp:68
#, fuzzy
msgid "Show hidden files"
msgstr "Mostrar / Ocultar console"
-#: gui/browser.cpp:67
+#: gui/browser.cpp:68
msgid "Show files marked with the hidden attribute"
msgstr ""
-#: gui/browser.cpp:71
+#: gui/browser.cpp:72
msgid "Go up"
msgstr "Acima"
-#: gui/browser.cpp:71 gui/browser.cpp:73
+#: gui/browser.cpp:72 gui/browser.cpp:74
msgid "Go to previous directory level"
msgstr "Ir para o diretório anterior"
-#: gui/browser.cpp:73
+#: gui/browser.cpp:74
msgctxt "lowres"
msgid "Go up"
msgstr "Acima"
-#: gui/browser.cpp:74 gui/chooser.cpp:45 gui/KeysDialog.cpp:43
-#: gui/launcher.cpp:345 gui/massadd.cpp:94 gui/options.cpp:1238
-#: gui/saveload-dialog.cpp:215 gui/saveload-dialog.cpp:275
-#: gui/saveload-dialog.cpp:545 gui/saveload-dialog.cpp:919
-#: gui/themebrowser.cpp:54 gui/fluidsynth-dialog.cpp:151
-#: engines/engine.cpp:447 engines/drascula/saveload.cpp:51
-#: engines/scumm/dialogs.cpp:190 engines/sword1/control.cpp:865
-#: engines/parallaction/saveload.cpp:274 backends/platform/wii/options.cpp:48
-#: backends/events/default/default-events.cpp:193
-#: backends/events/default/default-events.cpp:215
+#: gui/browser.cpp:75 gui/chooser.cpp:46 gui/KeysDialog.cpp:43
+#: gui/launcher.cpp:351 gui/massadd.cpp:95 gui/options.cpp:1239
+#: gui/saveload-dialog.cpp:216 gui/saveload-dialog.cpp:276
+#: gui/saveload-dialog.cpp:547 gui/saveload-dialog.cpp:922
+#: gui/themebrowser.cpp:55 gui/fluidsynth-dialog.cpp:152
+#: engines/engine.cpp:452 backends/platform/wii/options.cpp:48
+#: backends/events/default/default-events.cpp:196
+#: backends/events/default/default-events.cpp:218
+#: engines/drascula/saveload.cpp:49 engines/parallaction/saveload.cpp:274
+#: engines/scumm/dialogs.cpp:191 engines/sword1/control.cpp:865
msgid "Cancel"
msgstr "Cancelar"
-#: gui/browser.cpp:75 gui/chooser.cpp:46 gui/themebrowser.cpp:55
+#: gui/browser.cpp:76 gui/chooser.cpp:47 gui/themebrowser.cpp:56
msgid "Choose"
msgstr "Escolher"
-#: gui/gui-manager.cpp:115 engines/scumm/help.cpp:125
-#: engines/scumm/help.cpp:140 engines/scumm/help.cpp:165
-#: engines/scumm/help.cpp:191 engines/scumm/help.cpp:209
-#: backends/keymapper/remap-dialog.cpp:52
+#: gui/gui-manager.cpp:117 backends/keymapper/remap-dialog.cpp:53
+#: engines/scumm/help.cpp:125 engines/scumm/help.cpp:140
+#: engines/scumm/help.cpp:165 engines/scumm/help.cpp:191
+#: engines/scumm/help.cpp:209
msgid "Close"
msgstr "Fechar"
-#: gui/gui-manager.cpp:118
+#: gui/gui-manager.cpp:120
msgid "Mouse click"
msgstr "Clique do mouse"
-#: gui/gui-manager.cpp:122 base/main.cpp:301
+#: gui/gui-manager.cpp:124 base/main.cpp:319
msgid "Display keyboard"
msgstr "Mostrar teclado"
-#: gui/gui-manager.cpp:126 base/main.cpp:305
+#: gui/gui-manager.cpp:128 base/main.cpp:323
msgid "Remap keys"
msgstr "Remapear teclas"
-#: gui/gui-manager.cpp:129 base/main.cpp:308
+#: gui/gui-manager.cpp:131 base/main.cpp:326
#, fuzzy
msgid "Toggle FullScreen"
msgstr "Habilita Tela Cheia"
@@ -104,21 +104,21 @@ msgstr "Selecione uma ação para mapear"
msgid "Map"
msgstr "Mapear"
-#: gui/KeysDialog.cpp:42 gui/launcher.cpp:346 gui/launcher.cpp:1001
-#: gui/launcher.cpp:1005 gui/massadd.cpp:91 gui/options.cpp:1239
-#: gui/saveload-dialog.cpp:920 gui/fluidsynth-dialog.cpp:152
-#: engines/engine.cpp:366 engines/engine.cpp:377
-#: engines/drascula/saveload.cpp:51 engines/scumm/dialogs.cpp:192
-#: engines/scumm/scumm.cpp:1778 engines/agos/animation.cpp:558
-#: engines/groovie/script.cpp:420 engines/sky/compact.cpp:131
-#: engines/sky/compact.cpp:141 engines/sword1/animation.cpp:519
-#: engines/sword1/animation.cpp:540 engines/sword1/animation.cpp:550
-#: engines/sword1/animation.cpp:557 engines/sword1/control.cpp:865
-#: engines/sword1/logic.cpp:1633 engines/sword2/animation.cpp:419
-#: engines/sword2/animation.cpp:439 engines/sword2/animation.cpp:449
-#: engines/sword2/animation.cpp:458 engines/parallaction/saveload.cpp:274
+#: gui/KeysDialog.cpp:42 gui/launcher.cpp:352 gui/launcher.cpp:1048
+#: gui/launcher.cpp:1052 gui/massadd.cpp:92 gui/options.cpp:1240
+#: gui/saveload-dialog.cpp:923 gui/fluidsynth-dialog.cpp:153
+#: engines/engine.cpp:371 engines/engine.cpp:382
#: backends/platform/wii/options.cpp:47
#: backends/platform/wince/CELauncherDialog.cpp:54
+#: engines/agos/animation.cpp:558 engines/drascula/saveload.cpp:49
+#: engines/groovie/script.cpp:399 engines/parallaction/saveload.cpp:274
+#: engines/scumm/dialogs.cpp:193 engines/scumm/scumm.cpp:1779
+#: engines/sky/compact.cpp:131 engines/sky/compact.cpp:141
+#: engines/sword1/animation.cpp:524 engines/sword1/animation.cpp:545
+#: engines/sword1/animation.cpp:561 engines/sword1/animation.cpp:569
+#: engines/sword1/control.cpp:865 engines/sword1/logic.cpp:1633
+#: engines/sword2/animation.cpp:425 engines/sword2/animation.cpp:445
+#: engines/sword2/animation.cpp:461 engines/sword2/animation.cpp:471
msgid "OK"
msgstr "OK"
@@ -144,15 +144,15 @@ msgstr "Por favor selecione uma ação"
msgid "Press the key to associate"
msgstr "Pressione a tecla para associar"
-#: gui/launcher.cpp:187
+#: gui/launcher.cpp:193
msgid "Game"
msgstr "Jogo"
-#: gui/launcher.cpp:191
+#: gui/launcher.cpp:197
msgid "ID:"
msgstr "Código:"
-#: gui/launcher.cpp:191 gui/launcher.cpp:193 gui/launcher.cpp:194
+#: gui/launcher.cpp:197 gui/launcher.cpp:199 gui/launcher.cpp:200
msgid ""
"Short game identifier used for referring to savegames and running the game "
"from the command line"
@@ -160,316 +160,317 @@ msgstr ""
"Código identificador usado para se referir a jogos salvos e execução do jogo "
"a partir da linha de comando"
-#: gui/launcher.cpp:193
+#: gui/launcher.cpp:199
msgctxt "lowres"
msgid "ID:"
msgstr "Código:"
-#: gui/launcher.cpp:198
+#: gui/launcher.cpp:204
msgid "Name:"
msgstr "Nome:"
-#: gui/launcher.cpp:198 gui/launcher.cpp:200 gui/launcher.cpp:201
+#: gui/launcher.cpp:204 gui/launcher.cpp:206 gui/launcher.cpp:207
msgid "Full title of the game"
msgstr "Título completo do jogo"
-#: gui/launcher.cpp:200
+#: gui/launcher.cpp:206
msgctxt "lowres"
msgid "Name:"
msgstr "Nome:"
-#: gui/launcher.cpp:204
+#: gui/launcher.cpp:210
msgid "Language:"
msgstr "Idioma:"
-#: gui/launcher.cpp:204 gui/launcher.cpp:205
+#: gui/launcher.cpp:210 gui/launcher.cpp:211
msgid ""
"Language of the game. This will not turn your Spanish game version into "
"English"
msgstr "Idioma do jogo. Isto não irá passar seu jogo Inglês para Português"
-#: gui/launcher.cpp:206 gui/launcher.cpp:220 gui/options.cpp:86
-#: gui/options.cpp:736 gui/options.cpp:749 gui/options.cpp:1209
-#: audio/null.cpp:40
+#: gui/launcher.cpp:212 gui/launcher.cpp:226 gui/options.cpp:87
+#: gui/options.cpp:737 gui/options.cpp:750 gui/options.cpp:1210
+#: audio/null.cpp:41
msgid "<default>"
msgstr "<padrão>"
-#: gui/launcher.cpp:216
+#: gui/launcher.cpp:222
msgid "Platform:"
msgstr "Sistema:"
-#: gui/launcher.cpp:216 gui/launcher.cpp:218 gui/launcher.cpp:219
+#: gui/launcher.cpp:222 gui/launcher.cpp:224 gui/launcher.cpp:225
msgid "Platform the game was originally designed for"
msgstr "Sistema que o jogo foi desenvolvido originalmente"
-#: gui/launcher.cpp:218
+#: gui/launcher.cpp:224
msgctxt "lowres"
msgid "Platform:"
msgstr "Sistema:"
-#: gui/launcher.cpp:231
+#: gui/launcher.cpp:237
#, fuzzy
msgid "Engine"
msgstr "Examinar"
-#: gui/launcher.cpp:239 gui/options.cpp:1072 gui/options.cpp:1089
+#: gui/launcher.cpp:245 gui/options.cpp:1073 gui/options.cpp:1090
msgid "Graphics"
msgstr "Gráficos"
-#: gui/launcher.cpp:239 gui/options.cpp:1072 gui/options.cpp:1089
+#: gui/launcher.cpp:245 gui/options.cpp:1073 gui/options.cpp:1090
msgid "GFX"
msgstr "GFX"
-#: gui/launcher.cpp:242
+#: gui/launcher.cpp:248
msgid "Override global graphic settings"
msgstr "Sobrepor configuração global de gráficos"
-#: gui/launcher.cpp:244
+#: gui/launcher.cpp:250
msgctxt "lowres"
msgid "Override global graphic settings"
msgstr "Sobrepor configuração global de gráficos"
-#: gui/launcher.cpp:251 gui/options.cpp:1095
+#: gui/launcher.cpp:257 gui/options.cpp:1096
msgid "Audio"
msgstr "Áudio"
-#: gui/launcher.cpp:254
+#: gui/launcher.cpp:260
msgid "Override global audio settings"
msgstr "Sobrepor configuração global de áudio"
-#: gui/launcher.cpp:256
+#: gui/launcher.cpp:262
msgctxt "lowres"
msgid "Override global audio settings"
msgstr "Sobrepor configuração global de áudio"
-#: gui/launcher.cpp:265 gui/options.cpp:1100
+#: gui/launcher.cpp:271 gui/options.cpp:1101
msgid "Volume"
msgstr "Volume"
-#: gui/launcher.cpp:267 gui/options.cpp:1102
+#: gui/launcher.cpp:273 gui/options.cpp:1103
msgctxt "lowres"
msgid "Volume"
msgstr "Volume"
-#: gui/launcher.cpp:270
+#: gui/launcher.cpp:276
msgid "Override global volume settings"
msgstr "Sobrepor configuração global de volume"
-#: gui/launcher.cpp:272
+#: gui/launcher.cpp:278
msgctxt "lowres"
msgid "Override global volume settings"
msgstr "Sobrepor configuração global de volume"
-#: gui/launcher.cpp:280 gui/options.cpp:1110
+#: gui/launcher.cpp:286 gui/options.cpp:1111
msgid "MIDI"
msgstr "MIDI"
-#: gui/launcher.cpp:283
+#: gui/launcher.cpp:289
msgid "Override global MIDI settings"
msgstr "Sobrepor configuração global de MIDI"
-#: gui/launcher.cpp:285
+#: gui/launcher.cpp:291
msgctxt "lowres"
msgid "Override global MIDI settings"
msgstr "Sobrepor configuração global de MIDI"
-#: gui/launcher.cpp:294 gui/options.cpp:1116
+#: gui/launcher.cpp:300 gui/options.cpp:1117
msgid "MT-32"
msgstr "MT-32"
-#: gui/launcher.cpp:297
+#: gui/launcher.cpp:303
msgid "Override global MT-32 settings"
msgstr "Sobrepor configuração global de MT-32"
-#: gui/launcher.cpp:299
+#: gui/launcher.cpp:305
msgctxt "lowres"
msgid "Override global MT-32 settings"
msgstr "Sobrepor configuração global de MT-32"
-#: gui/launcher.cpp:308 gui/options.cpp:1123
+#: gui/launcher.cpp:314 gui/options.cpp:1124
msgid "Paths"
msgstr "Pastas"
-#: gui/launcher.cpp:310 gui/options.cpp:1125
+#: gui/launcher.cpp:316 gui/options.cpp:1126
msgctxt "lowres"
msgid "Paths"
msgstr "Pastas"
-#: gui/launcher.cpp:317
+#: gui/launcher.cpp:323
msgid "Game Path:"
msgstr "Pasta do Jogo:"
-#: gui/launcher.cpp:319
+#: gui/launcher.cpp:325
msgctxt "lowres"
msgid "Game Path:"
msgstr "Pasta do Jogo:"
-#: gui/launcher.cpp:324 gui/options.cpp:1149
+#: gui/launcher.cpp:330 gui/options.cpp:1150
msgid "Extra Path:"
msgstr "Pasta de Extras"
-#: gui/launcher.cpp:324 gui/launcher.cpp:326 gui/launcher.cpp:327
+#: gui/launcher.cpp:330 gui/launcher.cpp:332 gui/launcher.cpp:333
msgid "Specifies path to additional data used the game"
msgstr "Especifique a pasta para dados utilizados no jogo"
-#: gui/launcher.cpp:326 gui/options.cpp:1151
+#: gui/launcher.cpp:332 gui/options.cpp:1152
msgctxt "lowres"
msgid "Extra Path:"
msgstr "Pasta de Extras"
-#: gui/launcher.cpp:333 gui/options.cpp:1133
+#: gui/launcher.cpp:339 gui/options.cpp:1134
msgid "Save Path:"
msgstr "Pasta para Salvar"
-#: gui/launcher.cpp:333 gui/launcher.cpp:335 gui/launcher.cpp:336
-#: gui/options.cpp:1133 gui/options.cpp:1135 gui/options.cpp:1136
+#: gui/launcher.cpp:339 gui/launcher.cpp:341 gui/launcher.cpp:342
+#: gui/options.cpp:1134 gui/options.cpp:1136 gui/options.cpp:1137
msgid "Specifies where your savegames are put"
msgstr "Especifique onde guardar seus jogos salvos"
-#: gui/launcher.cpp:335 gui/options.cpp:1135
+#: gui/launcher.cpp:341 gui/options.cpp:1136
msgctxt "lowres"
msgid "Save Path:"
msgstr "Pasta para Salvar"
-#: gui/launcher.cpp:354 gui/launcher.cpp:453 gui/launcher.cpp:511
-#: gui/launcher.cpp:565 gui/options.cpp:1144 gui/options.cpp:1152
-#: gui/options.cpp:1161 gui/options.cpp:1276 gui/options.cpp:1282
-#: gui/options.cpp:1290 gui/options.cpp:1320 gui/options.cpp:1326
-#: gui/options.cpp:1333 gui/options.cpp:1426 gui/options.cpp:1429
-#: gui/options.cpp:1441
+#: gui/launcher.cpp:360 gui/launcher.cpp:459 gui/launcher.cpp:517
+#: gui/launcher.cpp:571 gui/options.cpp:1145 gui/options.cpp:1153
+#: gui/options.cpp:1162 gui/options.cpp:1277 gui/options.cpp:1283
+#: gui/options.cpp:1291 gui/options.cpp:1321 gui/options.cpp:1327
+#: gui/options.cpp:1334 gui/options.cpp:1427 gui/options.cpp:1430
+#: gui/options.cpp:1442
msgctxt "path"
msgid "None"
msgstr "Nenhum(a)"
-#: gui/launcher.cpp:359 gui/launcher.cpp:459 gui/launcher.cpp:569
-#: gui/options.cpp:1270 gui/options.cpp:1314 gui/options.cpp:1432
+#: gui/launcher.cpp:365 gui/launcher.cpp:465 gui/launcher.cpp:575
+#: gui/options.cpp:1271 gui/options.cpp:1315 gui/options.cpp:1433
#: backends/platform/wii/options.cpp:56
msgid "Default"
msgstr "Padrão"
-#: gui/launcher.cpp:504 gui/options.cpp:1435
+#: gui/launcher.cpp:510 gui/options.cpp:1436
msgid "Select SoundFont"
msgstr "Selecione o SoundFont"
-#: gui/launcher.cpp:523 gui/launcher.cpp:677
+#: gui/launcher.cpp:529 gui/launcher.cpp:682
msgid "Select directory with game data"
msgstr "Selecione a pasta com os arquivos do jogo"
-#: gui/launcher.cpp:541
+#: gui/launcher.cpp:547
msgid "Select additional game directory"
msgstr "Selecione a pasta adicional do jogo"
-#: gui/launcher.cpp:553
+#: gui/launcher.cpp:559
msgid "Select directory for saved games"
msgstr "Selecione a pasta para os jogos salvos"
-#: gui/launcher.cpp:580
+#: gui/launcher.cpp:586
msgid "This game ID is already taken. Please choose another one."
msgstr "Este código já esta sendo utilizado. Por favor, escolha outro."
-#: gui/launcher.cpp:621 engines/dialogs.cpp:110
+#: gui/launcher.cpp:626 engines/dialogs.cpp:111
msgid "~Q~uit"
msgstr "~S~air"
-#: gui/launcher.cpp:621 backends/platform/sdl/macosx/appmenu_osx.mm:95
+#: gui/launcher.cpp:626 backends/platform/sdl/macosx/appmenu_osx.mm:95
msgid "Quit ScummVM"
msgstr "Sair do ScummVM"
-#: gui/launcher.cpp:622
+#: gui/launcher.cpp:627
msgid "A~b~out..."
msgstr "So~b~re..."
-#: gui/launcher.cpp:622 backends/platform/sdl/macosx/appmenu_osx.mm:69
+#: gui/launcher.cpp:627 backends/platform/sdl/macosx/appmenu_osx.mm:69
msgid "About ScummVM"
msgstr "Sobre o ScumnmVM"
-#: gui/launcher.cpp:623
+#: gui/launcher.cpp:628
msgid "~O~ptions..."
msgstr "~O~pções"
-#: gui/launcher.cpp:623
+#: gui/launcher.cpp:628
msgid "Change global ScummVM options"
msgstr "Alterar opções globais do ScummVM"
-#: gui/launcher.cpp:625
+#: gui/launcher.cpp:630
msgid "~S~tart"
msgstr "~I~niciar"
-#: gui/launcher.cpp:625
+#: gui/launcher.cpp:630
msgid "Start selected game"
msgstr "Iniciar jogo selecionado"
-#: gui/launcher.cpp:628
+#: gui/launcher.cpp:633
msgid "~L~oad..."
msgstr "~C~arregar"
-#: gui/launcher.cpp:628
+#: gui/launcher.cpp:633
msgid "Load savegame for selected game"
msgstr "Carregar jogo salvo do jogo selecionado"
-#: gui/launcher.cpp:633 gui/launcher.cpp:1120
+#: gui/launcher.cpp:638
msgid "~A~dd Game..."
msgstr "~A~dicionar Jogo..."
-#: gui/launcher.cpp:633 gui/launcher.cpp:640
+#: gui/launcher.cpp:638 gui/launcher.cpp:645
msgid "Hold Shift for Mass Add"
msgstr "Segure Shift para Multi-Adição"
-#: gui/launcher.cpp:635
+#: gui/launcher.cpp:640
msgid "~E~dit Game..."
msgstr "~E~ditar Jogo..."
-#: gui/launcher.cpp:635 gui/launcher.cpp:642
+#: gui/launcher.cpp:640 gui/launcher.cpp:647
msgid "Change game options"
msgstr "Alterar opções do jogo"
-#: gui/launcher.cpp:637
+#: gui/launcher.cpp:642
msgid "~R~emove Game"
msgstr "~R~emover Jogo"
-#: gui/launcher.cpp:637 gui/launcher.cpp:644
+#: gui/launcher.cpp:642 gui/launcher.cpp:649
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:640 gui/launcher.cpp:1120
+#: gui/launcher.cpp:645
msgctxt "lowres"
msgid "~A~dd Game..."
msgstr "~A~dicionar Jogo..."
-#: gui/launcher.cpp:642
+#: gui/launcher.cpp:647
msgctxt "lowres"
msgid "~E~dit Game..."
msgstr "~E~ditar Jogo..."
-#: gui/launcher.cpp:644
+#: gui/launcher.cpp:649
msgctxt "lowres"
msgid "~R~emove Game"
msgstr "~R~emover Jogo"
-#: gui/launcher.cpp:652
+#: gui/launcher.cpp:657
msgid "Search in game list"
msgstr "Pesquisar na lista de jogos"
-#: gui/launcher.cpp:656 gui/launcher.cpp:1167
+#: gui/launcher.cpp:661 gui/launcher.cpp:1222
msgid "Search:"
msgstr "Pesquisar:"
-#: gui/launcher.cpp:680 engines/dialogs.cpp:114 engines/mohawk/myst.cpp:245
-#: engines/mohawk/riven.cpp:716 engines/cruise/menu.cpp:214
-#: engines/pegasus/pegasus.cpp:349
+#: gui/launcher.cpp:685 engines/dialogs.cpp:115 engines/cruise/menu.cpp:214
+#: engines/mohawk/myst.cpp:245 engines/mohawk/riven.cpp:718
+#: engines/pegasus/pegasus.cpp:353
msgid "Load game:"
msgstr "Carregar jogo:"
-#: gui/launcher.cpp:680 engines/dialogs.cpp:114 engines/scumm/dialogs.cpp:188
-#: engines/mohawk/myst.cpp:245 engines/mohawk/riven.cpp:716
-#: engines/cruise/menu.cpp:214 engines/pegasus/pegasus.cpp:349
+#: gui/launcher.cpp:685 engines/dialogs.cpp:115
#: backends/platform/wince/CEActionsPocket.cpp:267
#: backends/platform/wince/CEActionsSmartphone.cpp:231
+#: engines/cruise/menu.cpp:214 engines/mohawk/myst.cpp:245
+#: engines/mohawk/riven.cpp:718 engines/pegasus/pegasus.cpp:353
+#: engines/scumm/dialogs.cpp:189
msgid "Load"
msgstr "Carregar"
-#: gui/launcher.cpp:788
+#: gui/launcher.cpp:792
msgid ""
"Do you really want to run the mass game detector? This could potentially add "
"a huge number of games."
@@ -477,7 +478,8 @@ msgstr ""
"Você realmente deseja adicionar vários jogos ao mesmo tempo? Isso poderá "
"resultar em uma adição gigantesca de jogos."
-#: gui/launcher.cpp:789 gui/launcher.cpp:937 gui/fluidsynth-dialog.cpp:216
+#: gui/launcher.cpp:793 gui/launcher.cpp:941 gui/launcher.cpp:1000
+#: gui/fluidsynth-dialog.cpp:217
#: backends/events/symbiansdl/symbiansdl-events.cpp:184
#: backends/platform/wince/CEActionsPocket.cpp:326
#: backends/platform/wince/CEActionsSmartphone.cpp:287
@@ -485,7 +487,8 @@ msgstr ""
msgid "Yes"
msgstr "Sim"
-#: gui/launcher.cpp:789 gui/launcher.cpp:937 gui/fluidsynth-dialog.cpp:216
+#: gui/launcher.cpp:793 gui/launcher.cpp:941 gui/launcher.cpp:1000
+#: gui/fluidsynth-dialog.cpp:217
#: backends/events/symbiansdl/symbiansdl-events.cpp:184
#: backends/platform/wince/CEActionsPocket.cpp:326
#: backends/platform/wince/CEActionsSmartphone.cpp:287
@@ -493,195 +496,190 @@ msgstr "Sim"
msgid "No"
msgstr "Não"
-#: gui/launcher.cpp:837
+#: gui/launcher.cpp:841
msgid "ScummVM couldn't open the specified directory!"
msgstr "ScummVM não conseguiu abrir a pasta especificada!"
-#: gui/launcher.cpp:849
+#: gui/launcher.cpp:853
msgid "ScummVM could not find any game in the specified directory!"
msgstr "ScummVM não encontrou nenhum jogo na pasta especificada!"
-#: gui/launcher.cpp:863
+#: gui/launcher.cpp:867
msgid "Pick the game:"
msgstr "Escolha o jogo:"
-#: gui/launcher.cpp:937
+#: gui/launcher.cpp:941
msgid "Do you really want to remove this game configuration?"
msgstr "Você deseja realmente remover a configuração deste jogo?"
-#: gui/launcher.cpp:1001
+#: gui/launcher.cpp:999
+#, fuzzy
+msgid "Do you want to load savegame?"
+msgstr "Você deseja carregar ou salvar o jogo?"
+
+#: gui/launcher.cpp:1048
msgid "This game does not support loading games from the launcher."
msgstr "Este jogo não suporta abrir jogos a partir do menu principal."
-#: gui/launcher.cpp:1005
+#: gui/launcher.cpp:1052
msgid "ScummVM could not find any engine capable of running the selected game!"
msgstr ""
"ScummVM não conseguiu encontrar qualquer programa capaz de rodar o jogo "
"selecionado!"
-#: gui/launcher.cpp:1119
-msgctxt "lowres"
-msgid "Mass Add..."
-msgstr "Multi-Adição..."
-
-#: gui/launcher.cpp:1119
-msgid "Mass Add..."
-msgstr "Multi-Adição..."
-
-#: gui/massadd.cpp:78 gui/massadd.cpp:81
+#: gui/massadd.cpp:79 gui/massadd.cpp:82
msgid "... progress ..."
msgstr "... progresso ..."
-#: gui/massadd.cpp:258
+#: gui/massadd.cpp:259
msgid "Scan complete!"
msgstr "Busca completa!"
-#: gui/massadd.cpp:261
+#: gui/massadd.cpp:262
#, 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:265
+#: gui/massadd.cpp:266
#, c-format
msgid "Scanned %d directories ..."
msgstr "%d pasta(s) pesquisada(s)"
-#: gui/massadd.cpp:268
+#: gui/massadd.cpp:269
#, 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/options.cpp:84
+#: gui/options.cpp:85
msgid "Never"
msgstr "Nunca"
-#: gui/options.cpp:84
+#: gui/options.cpp:85
msgid "every 5 mins"
msgstr "a cada 5 mins"
-#: gui/options.cpp:84
+#: gui/options.cpp:85
msgid "every 10 mins"
msgstr "a cada 10 mins"
-#: gui/options.cpp:84
+#: gui/options.cpp:85
msgid "every 15 mins"
msgstr "a cada 15 mins"
-#: gui/options.cpp:84
+#: gui/options.cpp:85
msgid "every 30 mins"
msgstr "a cada 30 mins"
-#: gui/options.cpp:86
+#: gui/options.cpp:87
msgid "8 kHz"
msgstr "8 kHz"
-#: gui/options.cpp:86
+#: gui/options.cpp:87
msgid "11kHz"
msgstr "11 kHz"
-#: gui/options.cpp:86
+#: gui/options.cpp:87
msgid "22 kHz"
msgstr "22 kHz"
-#: gui/options.cpp:86
+#: gui/options.cpp:87
msgid "44 kHz"
msgstr "44 kHz"
-#: gui/options.cpp:86
+#: gui/options.cpp:87
msgid "48 kHz"
msgstr "48 kHz"
-#: gui/options.cpp:254 gui/options.cpp:480 gui/options.cpp:581
-#: gui/options.cpp:650 gui/options.cpp:858
+#: gui/options.cpp:255 gui/options.cpp:481 gui/options.cpp:582
+#: gui/options.cpp:651 gui/options.cpp:859
msgctxt "soundfont"
msgid "None"
msgstr "Nenhum(a)"
-#: gui/options.cpp:388
+#: gui/options.cpp:389
msgid "Failed to apply some of the graphic options changes:"
msgstr "Falha ao aplicar algumas mudanças nas opções de gráfico:"
-#: gui/options.cpp:400
+#: gui/options.cpp:401
msgid "the video mode could not be changed."
msgstr "o modo de vídeo não pôde ser alterado."
-#: gui/options.cpp:406
+#: gui/options.cpp:407
msgid "the fullscreen setting could not be changed"
msgstr "a configuração de tela cheia não pôde ser mudada"
-#: gui/options.cpp:412
+#: gui/options.cpp:413
msgid "the aspect ratio setting could not be changed"
msgstr "a configuração de proporção não pôde ser mudada"
-#: gui/options.cpp:733
+#: gui/options.cpp:734
msgid "Graphics mode:"
msgstr "Modo gráfico:"
-#: gui/options.cpp:747
+#: gui/options.cpp:748
msgid "Render mode:"
msgstr "Renderização"
-#: gui/options.cpp:747 gui/options.cpp:748
+#: gui/options.cpp:748 gui/options.cpp:749
msgid "Special dithering modes supported by some games"
msgstr "Modos especiais de dithering suportados por alguns jogos"
-#: gui/options.cpp:759
-#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2236
-#: backends/graphics/openglsdl/openglsdl-graphics.cpp:476
+#: gui/options.cpp:760
+#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2249
msgid "Fullscreen mode"
msgstr "Modo Tela Cheia"
-#: gui/options.cpp:762
+#: gui/options.cpp:763
msgid "Aspect ratio correction"
msgstr "Correção de proporção"
-#: gui/options.cpp:762
+#: gui/options.cpp:763
msgid "Correct aspect ratio for 320x200 games"
msgstr "Correção de proporção para jogos 320x200"
-#: gui/options.cpp:770
+#: gui/options.cpp:771
msgid "Preferred Device:"
msgstr "Dispositivo pref.:"
-#: gui/options.cpp:770
+#: gui/options.cpp:771
msgid "Music Device:"
msgstr "Disp. de música:"
-#: gui/options.cpp:770 gui/options.cpp:772
+#: gui/options.cpp:771 gui/options.cpp:773
msgid "Specifies preferred sound device or sound card emulator"
msgstr "Especifica o dispositivo de som preferido ou emulador de placa de som"
-#: gui/options.cpp:770 gui/options.cpp:772 gui/options.cpp:773
+#: gui/options.cpp:771 gui/options.cpp:773 gui/options.cpp:774
msgid "Specifies output sound device or sound card emulator"
msgstr "Especifica o dispositivo de saída de som ou emulador de placa de som"
-#: gui/options.cpp:772
+#: gui/options.cpp:773
msgctxt "lowres"
msgid "Preferred Dev.:"
msgstr "Dispositivo pref.:"
-#: gui/options.cpp:772
+#: gui/options.cpp:773
msgctxt "lowres"
msgid "Music Device:"
msgstr "Dispositivo de música:"
-#: gui/options.cpp:799
+#: gui/options.cpp:800
msgid "AdLib emulator:"
msgstr "Emulador AdLib:"
-#: gui/options.cpp:799 gui/options.cpp:800
+#: gui/options.cpp:800 gui/options.cpp:801
msgid "AdLib is used for music in many games"
msgstr "AdLib é utilizado para música em vários jogos"
-#: gui/options.cpp:810
+#: gui/options.cpp:811
msgid "Output rate:"
msgstr "Taxa de saída:"
-#: gui/options.cpp:810 gui/options.cpp:811
+#: gui/options.cpp:811 gui/options.cpp:812
msgid ""
"Higher value specifies better sound quality but may be not supported by your "
"soundcard"
@@ -689,66 +687,66 @@ msgstr ""
"Maior valor especifica melhor qualidade de som, mas pode não ser suportado "
"por sua placa de som"
-#: gui/options.cpp:821
+#: gui/options.cpp:822
msgid "GM Device:"
msgstr "Dispositivo GM:"
-#: gui/options.cpp:821
+#: gui/options.cpp:822
msgid "Specifies default sound device for General MIDI output"
msgstr "Especifique o dispositivo de som padrão para a saída General MIDI"
-#: gui/options.cpp:832
+#: gui/options.cpp:833
msgid "Don't use General MIDI music"
msgstr "Não usar música General MIDI"
-#: gui/options.cpp:843 gui/options.cpp:909
+#: gui/options.cpp:844 gui/options.cpp:910
msgid "Use first available device"
msgstr "Usar o primeiro dispositivo disponível"
-#: gui/options.cpp:855
+#: gui/options.cpp:856
msgid "SoundFont:"
msgstr "SoundFont:"
-#: gui/options.cpp:855 gui/options.cpp:857 gui/options.cpp:858
+#: gui/options.cpp:856 gui/options.cpp:858 gui/options.cpp:859
msgid "SoundFont is supported by some audio cards, Fluidsynth and Timidity"
msgstr "SoundFont é suportado por algumas placas de som, Fluidsynth e Timidity"
-#: gui/options.cpp:857
+#: gui/options.cpp:858
msgctxt "lowres"
msgid "SoundFont:"
msgstr "SoundFont:"
-#: gui/options.cpp:863
+#: gui/options.cpp:864
msgid "Mixed AdLib/MIDI mode"
msgstr "Mixar AdLib/MIDI"
-#: gui/options.cpp:863
+#: gui/options.cpp:864
msgid "Use both MIDI and AdLib sound generation"
msgstr "Usar MIDI e AdLib juntos na geração de som"
-#: gui/options.cpp:866
+#: gui/options.cpp:867
msgid "MIDI gain:"
msgstr "Ganho MIDI:"
-#: gui/options.cpp:873
+#: gui/options.cpp:874
msgid "FluidSynth Settings"
msgstr ""
-#: gui/options.cpp:880
+#: gui/options.cpp:881
msgid "MT-32 Device:"
msgstr "Dispositivo MT-32:"
-#: gui/options.cpp:880
+#: gui/options.cpp:881
msgid "Specifies default sound device for Roland MT-32/LAPC1/CM32l/CM64 output"
msgstr ""
"Especifique o dispositivo de som padrão para a saída Roland MT-32/LAPC1/"
"CM32l/CM64"
-#: gui/options.cpp:885
+#: gui/options.cpp:886
msgid "True Roland MT-32 (disable GM emulation)"
msgstr "Roland MT-32 real (desligar emulação GM)"
-#: gui/options.cpp:885 gui/options.cpp:887
+#: gui/options.cpp:886 gui/options.cpp:888
msgid ""
"Check if you want to use your real hardware Roland-compatible sound device "
"connected to your computer"
@@ -756,194 +754,195 @@ msgstr ""
"Verifique se você quer usar o seu dispositivo de hardware de som compatível "
"com Roland"
-#: gui/options.cpp:887
+#: gui/options.cpp:888
msgctxt "lowres"
msgid "True Roland MT-32 (no GM emulation)"
msgstr "Roland MT-32 real (sem emulação GM)"
-#: gui/options.cpp:890
+#: gui/options.cpp:891
#, fuzzy
-msgid "Roland GS Mode (disable GM mapping)"
+msgid "Roland GS Device (enable MT-32 mappings)"
msgstr "Roland MT-32 real (desligar emulação GM)"
-#: gui/options.cpp:890
-msgid "Turns off General MIDI mapping for games with Roland MT-32 soundtrack"
+#: gui/options.cpp:891
+msgid ""
+"Check if you want to enable patch mappings to emulate an MT-32 on a Roland "
+"GS device"
msgstr ""
-"Desliga o mapeamento General MIDI para jogos com trilha sonora Roland MT-32"
-#: gui/options.cpp:899
+#: gui/options.cpp:900
msgid "Don't use Roland MT-32 music"
msgstr "Não usar música Roland MT-32"
-#: gui/options.cpp:926
+#: gui/options.cpp:927
msgid "Text and Speech:"
msgstr "Texto e Voz:"
-#: gui/options.cpp:930 gui/options.cpp:940
+#: gui/options.cpp:931 gui/options.cpp:941
msgid "Speech"
msgstr "Voz"
-#: gui/options.cpp:931 gui/options.cpp:941
+#: gui/options.cpp:932 gui/options.cpp:942
msgid "Subtitles"
msgstr "Legendas"
-#: gui/options.cpp:932
+#: gui/options.cpp:933
msgid "Both"
msgstr "Ambos"
-#: gui/options.cpp:934
+#: gui/options.cpp:935
msgid "Subtitle speed:"
msgstr "Rapidez legendas:"
-#: gui/options.cpp:936
+#: gui/options.cpp:937
msgctxt "lowres"
msgid "Text and Speech:"
msgstr "Texto e Voz:"
-#: gui/options.cpp:940
+#: gui/options.cpp:941
msgid "Spch"
msgstr "Voz"
-#: gui/options.cpp:941
+#: gui/options.cpp:942
msgid "Subs"
msgstr "Legs"
-#: gui/options.cpp:942
+#: gui/options.cpp:943
msgctxt "lowres"
msgid "Both"
msgstr "Ambos"
-#: gui/options.cpp:942
+#: gui/options.cpp:943
msgid "Show subtitles and play speech"
msgstr "Mostrar legenda e vozes (dublagem)"
-#: gui/options.cpp:944
+#: gui/options.cpp:945
msgctxt "lowres"
msgid "Subtitle speed:"
msgstr "Velocidade das legendas:"
-#: gui/options.cpp:960
+#: gui/options.cpp:961
msgid "Music volume:"
msgstr "Volume da Música:"
-#: gui/options.cpp:962
+#: gui/options.cpp:963
msgctxt "lowres"
msgid "Music volume:"
msgstr "Volume da Música:"
-#: gui/options.cpp:969
+#: gui/options.cpp:970
msgid "Mute All"
msgstr "Mudo"
-#: gui/options.cpp:972
+#: gui/options.cpp:973
msgid "SFX volume:"
msgstr "Volume dos Sons:"
-#: gui/options.cpp:972 gui/options.cpp:974 gui/options.cpp:975
+#: gui/options.cpp:973 gui/options.cpp:975 gui/options.cpp:976
msgid "Special sound effects volume"
msgstr "Volume dos efeitos sonoros especiais"
-#: gui/options.cpp:974
+#: gui/options.cpp:975
msgctxt "lowres"
msgid "SFX volume:"
msgstr "Volume dos Sons:"
-#: gui/options.cpp:982
+#: gui/options.cpp:983
msgid "Speech volume:"
msgstr "Volume da Voz:"
-#: gui/options.cpp:984
+#: gui/options.cpp:985
msgctxt "lowres"
msgid "Speech volume:"
msgstr "Volume da Voz:"
-#: gui/options.cpp:1141
+#: gui/options.cpp:1142
msgid "Theme Path:"
msgstr "Pasta do Tema"
-#: gui/options.cpp:1143
+#: gui/options.cpp:1144
msgctxt "lowres"
msgid "Theme Path:"
msgstr "Pasta do Tema"
-#: gui/options.cpp:1149 gui/options.cpp:1151 gui/options.cpp:1152
+#: gui/options.cpp:1150 gui/options.cpp:1152 gui/options.cpp:1153
msgid "Specifies path to additional data used by all games or ScummVM"
msgstr ""
"Especifica a pasta para os dados adicionais usados por todos os jogos ou "
"ScummVM"
-#: gui/options.cpp:1158
+#: gui/options.cpp:1159
msgid "Plugins Path:"
msgstr "Pasta de Plugins:"
-#: gui/options.cpp:1160
+#: gui/options.cpp:1161
msgctxt "lowres"
msgid "Plugins Path:"
msgstr "Pasta de Plugins:"
-#: gui/options.cpp:1169 gui/fluidsynth-dialog.cpp:137
+#: gui/options.cpp:1170 gui/fluidsynth-dialog.cpp:138
msgid "Misc"
msgstr "Outros"
-#: gui/options.cpp:1171
+#: gui/options.cpp:1172
msgctxt "lowres"
msgid "Misc"
msgstr "Outros"
-#: gui/options.cpp:1173
+#: gui/options.cpp:1174
msgid "Theme:"
msgstr "Tema:"
-#: gui/options.cpp:1177
+#: gui/options.cpp:1178
msgid "GUI Renderer:"
msgstr "Renderizador GUI:"
-#: gui/options.cpp:1189
+#: gui/options.cpp:1190
msgid "Autosave:"
msgstr "Auto-Salvar:"
-#: gui/options.cpp:1191
+#: gui/options.cpp:1192
msgctxt "lowres"
msgid "Autosave:"
msgstr "Auto-Salvar:"
-#: gui/options.cpp:1199
+#: gui/options.cpp:1200
msgid "Keys"
msgstr "Teclas"
-#: gui/options.cpp:1206
+#: gui/options.cpp:1207
msgid "GUI Language:"
msgstr "Idioma do GUI:"
-#: gui/options.cpp:1206
+#: gui/options.cpp:1207
msgid "Language of ScummVM GUI"
msgstr "Linguagem do ScummVM GUI"
-#: gui/options.cpp:1365
+#: gui/options.cpp:1366
msgid "You have to restart ScummVM before your changes will take effect."
msgstr "Você tem que reiniciar o ScummVM para funcionar."
-#: gui/options.cpp:1378
+#: gui/options.cpp:1379
msgid "Select directory for savegames"
msgstr "Selecione a pasta para o jogos salvos"
-#: gui/options.cpp:1385
+#: gui/options.cpp:1386
msgid "The chosen directory cannot be written to. Please select another one."
msgstr "O diretório escolhido não pode ser usado. Por favor, selecione outro."
-#: gui/options.cpp:1394
+#: gui/options.cpp:1395
msgid "Select directory for GUI themes"
msgstr "Selecione a pasta para os temas da Interface de Uso Gráfico"
-#: gui/options.cpp:1404
+#: gui/options.cpp:1405
msgid "Select directory for extra files"
msgstr "Selecione a pasta para os arquivos extras"
-#: gui/options.cpp:1415
+#: gui/options.cpp:1416
msgid "Select directory for plugins"
msgstr "Selecione a pasta para os plugins"
-#: gui/options.cpp:1468
+#: gui/options.cpp:1469
msgid ""
"The theme you selected does not support your current language. If you want "
"to use this theme you need to switch to another language first."
@@ -951,229 +950,233 @@ msgstr ""
"O tema que você selecionou não suporta seu idioma atual. Se você quiser usar "
"este tema você precisa mudar para outro idioma."
-#: gui/saveload-dialog.cpp:166
+#: gui/saveload-dialog.cpp:167
msgid "List view"
msgstr ""
-#: gui/saveload-dialog.cpp:167
+#: gui/saveload-dialog.cpp:168
msgid "Grid view"
msgstr ""
-#: gui/saveload-dialog.cpp:210 gui/saveload-dialog.cpp:358
+#: gui/saveload-dialog.cpp:211 gui/saveload-dialog.cpp:360
msgid "No date saved"
msgstr "Sem data salva"
-#: gui/saveload-dialog.cpp:211 gui/saveload-dialog.cpp:359
+#: gui/saveload-dialog.cpp:212 gui/saveload-dialog.cpp:361
msgid "No time saved"
msgstr "Sem hora salva"
-#: gui/saveload-dialog.cpp:212 gui/saveload-dialog.cpp:360
+#: gui/saveload-dialog.cpp:213 gui/saveload-dialog.cpp:362
msgid "No playtime saved"
msgstr "Sem tempo de jogo salvo"
-#: gui/saveload-dialog.cpp:219 gui/saveload-dialog.cpp:275
+#: gui/saveload-dialog.cpp:220 gui/saveload-dialog.cpp:276
msgid "Delete"
msgstr "Excluir"
-#: gui/saveload-dialog.cpp:274
+#: gui/saveload-dialog.cpp:275
msgid "Do you really want to delete this savegame?"
msgstr "Você realmente quer excluir este jogo salvo?"
-#: gui/saveload-dialog.cpp:383 gui/saveload-dialog.cpp:872
+#: gui/saveload-dialog.cpp:385 gui/saveload-dialog.cpp:875
msgid "Date: "
msgstr "Data:"
-#: gui/saveload-dialog.cpp:387 gui/saveload-dialog.cpp:878
+#: gui/saveload-dialog.cpp:389 gui/saveload-dialog.cpp:881
msgid "Time: "
msgstr "Hora:"
-#: gui/saveload-dialog.cpp:393 gui/saveload-dialog.cpp:886
+#: gui/saveload-dialog.cpp:395 gui/saveload-dialog.cpp:889
msgid "Playtime: "
msgstr "Tempo de jogo:"
-#: gui/saveload-dialog.cpp:406 gui/saveload-dialog.cpp:494
+#: gui/saveload-dialog.cpp:408 gui/saveload-dialog.cpp:496
msgid "Untitled savestate"
msgstr "Não-titulado arquivo de save"
-#: gui/saveload-dialog.cpp:546
+#: gui/saveload-dialog.cpp:548
msgid "Next"
msgstr ""
-#: gui/saveload-dialog.cpp:549
+#: gui/saveload-dialog.cpp:551
msgid "Prev"
msgstr ""
-#: gui/saveload-dialog.cpp:736
+#: gui/saveload-dialog.cpp:739
#, fuzzy
msgid "New Save"
msgstr "Salvar"
-#: gui/saveload-dialog.cpp:736
+#: gui/saveload-dialog.cpp:739
#, fuzzy
msgid "Create a new save game"
msgstr "Falha ao salvar o jogo"
-#: gui/saveload-dialog.cpp:865
+#: gui/saveload-dialog.cpp:868
#, fuzzy
msgid "Name: "
msgstr "Nome:"
-#: gui/saveload-dialog.cpp:937
+#: gui/saveload-dialog.cpp:940
#, c-format
msgid "Enter a description for slot %d:"
msgstr ""
-#: gui/themebrowser.cpp:44
+#: gui/themebrowser.cpp:45
msgid "Select a Theme"
msgstr "Selecione um Tema"
-#: gui/ThemeEngine.cpp:337
+#: gui/ThemeEngine.cpp:347
msgid "Disabled GFX"
msgstr "GFX desabilitado"
-#: gui/ThemeEngine.cpp:337
+#: gui/ThemeEngine.cpp:347
msgctxt "lowres"
msgid "Disabled GFX"
msgstr "GFX desabilitado"
-#: gui/ThemeEngine.cpp:338
-msgid "Standard Renderer (16bpp)"
+#: gui/ThemeEngine.cpp:348
+#, fuzzy
+msgid "Standard Renderer"
msgstr "Renderizador padrão (16bpp)"
-#: gui/ThemeEngine.cpp:338
-msgid "Standard (16bpp)"
+#: gui/ThemeEngine.cpp:348 engines/scumm/dialogs.cpp:659
+#, fuzzy
+msgid "Standard"
msgstr "Padrão (16bpp)"
-#: gui/ThemeEngine.cpp:340
-msgid "Antialiased Renderer (16bpp)"
+#: gui/ThemeEngine.cpp:350
+#, fuzzy
+msgid "Antialiased Renderer"
msgstr "Renderizador Anti-Serrilhamento (16bpp)"
-#: gui/ThemeEngine.cpp:340
-msgid "Antialiased (16bpp)"
+#: gui/ThemeEngine.cpp:350
+#, fuzzy
+msgid "Antialiased"
msgstr "Anti-Serrilhamento (16bpp)"
-#: gui/widget.cpp:322 gui/widget.cpp:324 gui/widget.cpp:330 gui/widget.cpp:332
+#: gui/widget.cpp:323 gui/widget.cpp:325 gui/widget.cpp:331 gui/widget.cpp:333
msgid "Clear value"
msgstr "Limpar valor"
-#: gui/fluidsynth-dialog.cpp:67
+#: gui/fluidsynth-dialog.cpp:68
#, fuzzy
msgid "Reverb"
msgstr "Nunca"
-#: gui/fluidsynth-dialog.cpp:69 gui/fluidsynth-dialog.cpp:101
+#: gui/fluidsynth-dialog.cpp:70 gui/fluidsynth-dialog.cpp:102
#, fuzzy
msgid "Active"
msgstr "(Ativo)"
-#: gui/fluidsynth-dialog.cpp:71
+#: gui/fluidsynth-dialog.cpp:72
msgid "Room:"
msgstr ""
-#: gui/fluidsynth-dialog.cpp:78
+#: gui/fluidsynth-dialog.cpp:79
msgid "Damp:"
msgstr ""
-#: gui/fluidsynth-dialog.cpp:85
+#: gui/fluidsynth-dialog.cpp:86
msgid "Width:"
msgstr ""
-#: gui/fluidsynth-dialog.cpp:92 gui/fluidsynth-dialog.cpp:110
+#: gui/fluidsynth-dialog.cpp:93 gui/fluidsynth-dialog.cpp:111
msgid "Level:"
msgstr ""
-#: gui/fluidsynth-dialog.cpp:99
+#: gui/fluidsynth-dialog.cpp:100
msgid "Chorus"
msgstr ""
-#: gui/fluidsynth-dialog.cpp:103
+#: gui/fluidsynth-dialog.cpp:104
msgid "N:"
msgstr ""
-#: gui/fluidsynth-dialog.cpp:117
+#: gui/fluidsynth-dialog.cpp:118
#, fuzzy
msgid "Speed:"
msgstr "Voz"
-#: gui/fluidsynth-dialog.cpp:124
+#: gui/fluidsynth-dialog.cpp:125
msgid "Depth:"
msgstr ""
-#: gui/fluidsynth-dialog.cpp:131
+#: gui/fluidsynth-dialog.cpp:132
msgid "Type:"
msgstr ""
-#: gui/fluidsynth-dialog.cpp:134
+#: gui/fluidsynth-dialog.cpp:135
msgid "Sine"
msgstr ""
-#: gui/fluidsynth-dialog.cpp:135
+#: gui/fluidsynth-dialog.cpp:136
msgid "Triangle"
msgstr ""
-#: gui/fluidsynth-dialog.cpp:139
+#: gui/fluidsynth-dialog.cpp:140
msgid "Interpolation:"
msgstr ""
-#: gui/fluidsynth-dialog.cpp:142
+#: gui/fluidsynth-dialog.cpp:143
msgid "None (fastest)"
msgstr ""
-#: gui/fluidsynth-dialog.cpp:143
+#: gui/fluidsynth-dialog.cpp:144
msgid "Linear"
msgstr ""
-#: gui/fluidsynth-dialog.cpp:144
+#: gui/fluidsynth-dialog.cpp:145
msgid "Fourth-order"
msgstr ""
-#: gui/fluidsynth-dialog.cpp:145
+#: gui/fluidsynth-dialog.cpp:146
msgid "Seventh-order"
msgstr ""
-#: gui/fluidsynth-dialog.cpp:149
+#: gui/fluidsynth-dialog.cpp:150
msgid "Reset"
msgstr ""
-#: gui/fluidsynth-dialog.cpp:149
+#: gui/fluidsynth-dialog.cpp:150
msgid "Reset all FluidSynth settings to their default values."
msgstr ""
-#: gui/fluidsynth-dialog.cpp:216
+#: gui/fluidsynth-dialog.cpp:217
#, fuzzy
msgid ""
"Do you really want to reset all FluidSynth settings to their default values?"
msgstr "Você realmente deseja voltar para o menu principal?"
-#: base/main.cpp:210
+#: base/main.cpp:228
#, c-format
msgid "Engine does not support debug level '%s'"
msgstr "Esse programa não suporta o nível de debug '%s'"
-#: base/main.cpp:288
+#: base/main.cpp:306
msgid "Menu"
msgstr "Menu"
-#: base/main.cpp:291 backends/platform/symbian/src/SymbianActions.cpp:45
+#: base/main.cpp:309 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:294 backends/platform/symbian/src/SymbianActions.cpp:50
+#: base/main.cpp:312 backends/platform/symbian/src/SymbianActions.cpp:50
#: backends/platform/wince/CEActionsPocket.cpp:42
msgid "Pause"
msgstr "Pausar"
-#: base/main.cpp:297
+#: base/main.cpp:315
msgid "Skip line"
msgstr "Pula linha"
-#: base/main.cpp:468
+#: base/main.cpp:507
msgid "Error running game:"
msgstr "Erro ao executar o jogo:"
-#: base/main.cpp:492
+#: base/main.cpp:536
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 "
@@ -1243,73 +1246,73 @@ msgstr "Usuário cancelou"
msgid "Unknown error"
msgstr "Erro desconhecido"
-#: engines/advancedDetector.cpp:316
+#: engines/advancedDetector.cpp:317
#, c-format
msgid "The game in '%s' seems to be unknown."
msgstr "O jogo em '% s' parece ser desconhecido."
-#: engines/advancedDetector.cpp:317
+#: engines/advancedDetector.cpp:318
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:319
+#: engines/advancedDetector.cpp:320
msgid "of the game you tried to add and its version/language/etc.:"
msgstr "do jogo que você tentou adicionar e sua versão/idioma/etc.:"
-#: engines/dialogs.cpp:84
+#: engines/dialogs.cpp:85
msgid "~R~esume"
msgstr "~V~oltar ao jogo"
-#: engines/dialogs.cpp:86
+#: engines/dialogs.cpp:87
msgid "~L~oad"
msgstr "~C~arregar"
-#: engines/dialogs.cpp:90
+#: engines/dialogs.cpp:91
msgid "~S~ave"
msgstr "~S~alvar"
-#: engines/dialogs.cpp:94
+#: engines/dialogs.cpp:95
msgid "~O~ptions"
msgstr "~O~pções"
-#: engines/dialogs.cpp:99
+#: engines/dialogs.cpp:100
msgid "~H~elp"
msgstr "~A~juda"
-#: engines/dialogs.cpp:101
+#: engines/dialogs.cpp:102
msgid "~A~bout"
msgstr "So~b~re"
-#: engines/dialogs.cpp:104 engines/dialogs.cpp:180
+#: engines/dialogs.cpp:105 engines/dialogs.cpp:181
msgid "~R~eturn to Launcher"
msgstr "~V~oltar ao menu"
-#: engines/dialogs.cpp:106 engines/dialogs.cpp:182
+#: engines/dialogs.cpp:107 engines/dialogs.cpp:183
msgctxt "lowres"
msgid "~R~eturn to Launcher"
msgstr "~V~oltar ao menu"
-#: engines/dialogs.cpp:115 engines/agi/saveload.cpp:803
-#: engines/drascula/saveload.cpp:338 engines/cruise/menu.cpp:212
-#: engines/sci/engine/kfile.cpp:742 engines/toltecs/menu.cpp:284
-#: engines/pegasus/pegasus.cpp:373
+#: engines/dialogs.cpp:116 engines/agi/saveload.cpp:803
+#: engines/cruise/menu.cpp:212 engines/drascula/saveload.cpp:336
+#: engines/neverhood/menumodule.cpp:873 engines/pegasus/pegasus.cpp:377
+#: engines/sci/engine/kfile.cpp:758 engines/toltecs/menu.cpp:281
msgid "Save game:"
msgstr "Salvar jogo:"
-#: engines/dialogs.cpp:115 engines/agi/saveload.cpp:803
-#: engines/drascula/saveload.cpp:338 engines/scumm/dialogs.cpp:187
-#: engines/cruise/menu.cpp:212 engines/sci/engine/kfile.cpp:742
-#: engines/toltecs/menu.cpp:284 engines/pegasus/pegasus.cpp:373
-#: backends/platform/symbian/src/SymbianActions.cpp:44
+#: engines/dialogs.cpp:116 backends/platform/symbian/src/SymbianActions.cpp:44
#: backends/platform/wince/CEActionsPocket.cpp:43
#: backends/platform/wince/CEActionsPocket.cpp:267
#: backends/platform/wince/CEActionsSmartphone.cpp:45
#: backends/platform/wince/CEActionsSmartphone.cpp:231
+#: engines/agi/saveload.cpp:803 engines/cruise/menu.cpp:212
+#: engines/drascula/saveload.cpp:336 engines/neverhood/menumodule.cpp:873
+#: engines/pegasus/pegasus.cpp:377 engines/sci/engine/kfile.cpp:758
+#: engines/scumm/dialogs.cpp:188 engines/toltecs/menu.cpp:281
msgid "Save"
msgstr "Salvar"
-#: engines/dialogs.cpp:144
+#: engines/dialogs.cpp:145
msgid ""
"Sorry, this engine does not currently provide in-game help. Please consult "
"the README for basic information, and for instructions on how to obtain "
@@ -1319,7 +1322,7 @@ msgstr ""
"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:228
+#: engines/dialogs.cpp:234 engines/pegasus/pegasus.cpp:393
#, fuzzy, c-format
msgid ""
"Gamestate save failed (%s)! Please consult the README for basic information, "
@@ -1329,37 +1332,37 @@ msgstr ""
"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:301 engines/mohawk/dialogs.cpp:109
+#: engines/dialogs.cpp:307 engines/mohawk/dialogs.cpp:109
#: engines/mohawk/dialogs.cpp:170
msgid "~O~K"
msgstr "~O~K"
-#: engines/dialogs.cpp:302 engines/mohawk/dialogs.cpp:110
+#: engines/dialogs.cpp:308 engines/mohawk/dialogs.cpp:110
#: engines/mohawk/dialogs.cpp:171
msgid "~C~ancel"
msgstr "~C~ancelar"
-#: engines/dialogs.cpp:305
+#: engines/dialogs.cpp:311
msgid "~K~eys"
msgstr "~T~eclas"
-#: engines/engine.cpp:240
+#: engines/engine.cpp:245
msgid "Could not initialize color format."
msgstr "Não foi possível inicializar o formato de cor."
-#: engines/engine.cpp:248
+#: engines/engine.cpp:253
msgid "Could not switch to video mode: '"
msgstr "Não foi possível alternar o modo de vídeo atual:"
-#: engines/engine.cpp:257
+#: engines/engine.cpp:262
msgid "Could not apply aspect ratio setting."
msgstr "Não foi possível aplicar a correção de proporção"
-#: engines/engine.cpp:262
+#: engines/engine.cpp:267
msgid "Could not apply fullscreen setting."
msgstr "Não foi possível aplicar a configuração de tela cheia."
-#: engines/engine.cpp:362
+#: engines/engine.cpp:367
msgid ""
"You appear to be playing this game directly\n"
"from the CD. This is known to cause problems,\n"
@@ -1373,7 +1376,7 @@ msgstr ""
"os arquivos de dados para o disco rígido.\n"
"Consulte o arquivo README para mais detalhes."
-#: engines/engine.cpp:373
+#: engines/engine.cpp:378
msgid ""
"This game has audio tracks in its disk. These\n"
"tracks need to be ripped from the disk using\n"
@@ -1387,7 +1390,7 @@ msgstr ""
"para ouvir a música do jogo.\n"
"Consulte o arquivo README para mais detalhes."
-#: engines/engine.cpp:431
+#: engines/engine.cpp:436
#, fuzzy, c-format
msgid ""
"Gamestate load failed (%s)! Please consult the README for basic information, "
@@ -1397,7 +1400,7 @@ msgstr ""
"Por favor, consulte o README para obter informações básicas, e para obter "
"instruções sobre como obter assistência adicional."
-#: engines/engine.cpp:444
+#: engines/engine.cpp:449
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 "
@@ -1407,33 +1410,764 @@ msgstr ""
"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:447
+#: engines/engine.cpp:452
msgid "Start anyway"
msgstr "Iniciar de qualquer maneira"
-#: engines/agi/detection.cpp:142 engines/drascula/detection.cpp:270
-#: engines/dreamweb/detection.cpp:47 engines/sci/detection.cpp:393
-#: engines/toltecs/detection.cpp:173
+#: audio/fmopl.cpp:50
+msgid "MAME OPL emulator"
+msgstr "Emulador MAME OPL"
+
+#: audio/fmopl.cpp:52
+msgid "DOSBox OPL emulator"
+msgstr "Emulador DOSBox OPL"
+
+#: audio/mididrv.cpp:209
+#, c-format
+msgid ""
+"The selected audio device '%s' was not found (e.g. might be turned off or "
+"disconnected)."
+msgstr ""
+"O dispositivo de áudio selecionado '%s' não foi encontrado (ex: pode estar "
+"desligado ou desconectado)."
+
+#: audio/mididrv.cpp:209 audio/mididrv.cpp:221 audio/mididrv.cpp:257
+#: audio/mididrv.cpp:272
+msgid "Attempting to fall back to the next available device..."
+msgstr "Tentando retornar para o próximo dispositivo disponível..."
+
+#: audio/mididrv.cpp:221
+#, c-format
+msgid ""
+"The selected audio device '%s' cannot be used. See log file for more "
+"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:257
+#, c-format
+msgid ""
+"The preferred audio device '%s' was not found (e.g. might be turned off or "
+"disconnected)."
+msgstr ""
+"O dispositivo de áudio preferido '%s' não foi encontrado (ex: pode estar "
+"desligado ou desconectado)."
+
+#: audio/mididrv.cpp:272
+#, c-format
+msgid ""
+"The preferred audio device '%s' cannot be used. See log file for more "
+"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:44
+msgid "No music"
+msgstr "Sem música"
+
+#: audio/mods/paula.cpp:196
+msgid "Amiga Audio Emulator"
+msgstr "Emulador Som Amiga"
+
+#: audio/softsynth/adlib.cpp:2285
+msgid "AdLib Emulator"
+msgstr "Emulador AdLib"
+
+#: audio/softsynth/appleiigs.cpp:33
+msgid "Apple II GS Emulator (NOT IMPLEMENTED)"
+msgstr "Emulador Apple II GS (NÃO IMPLEMENTADO)"
+
+#: audio/softsynth/sid.cpp:1430
+msgid "C64 Audio Emulator"
+msgstr "Emulador Som C64"
+
+#: audio/softsynth/mt32.cpp:200
+msgid "Initializing MT-32 Emulator"
+msgstr "Inicializando Emulador MT-32"
+
+#: audio/softsynth/mt32.cpp:426
+msgid "MT-32 Emulator"
+msgstr "Emulador MT-32"
+
+#: audio/softsynth/pcspk.cpp:139
+msgid "PC Speaker Emulator"
+msgstr "Emulador PC Speaker"
+
+#: audio/softsynth/pcspk.cpp:158
+msgid "IBM PCjr Emulator"
+msgstr "Emulador IBM PCjr"
+
+#: backends/keymapper/remap-dialog.cpp:48
+msgid "Keymap:"
+msgstr "Mapa de Teclas:"
+
+#: backends/keymapper/remap-dialog.cpp:67
+#, fuzzy
+msgid " (Effective)"
+msgstr "(Ativo)"
+
+#: backends/keymapper/remap-dialog.cpp:107
+msgid " (Active)"
+msgstr "(Ativo)"
+
+#: backends/keymapper/remap-dialog.cpp:107
+msgid " (Blocked)"
+msgstr ""
+
+#: backends/keymapper/remap-dialog.cpp:120
+msgid " (Global)"
+msgstr "(Global)"
+
+#: backends/keymapper/remap-dialog.cpp:128
+msgid " (Game)"
+msgstr "(Jogo)"
+
+#: backends/midi/windows.cpp:165
+msgid "Windows MIDI"
+msgstr "MIDI Windows"
+
+#: backends/platform/ds/arm9/source/dsoptions.cpp:56
+#: engines/scumm/dialogs.cpp:291
+msgid "~C~lose"
+msgstr "~F~echar"
+
+#: backends/platform/ds/arm9/source/dsoptions.cpp:57
+msgid "ScummVM Main Menu"
+msgstr "Menu Principal ScummVM"
+
+#: backends/platform/ds/arm9/source/dsoptions.cpp:63
+msgid "~L~eft handed mode"
+msgstr "Modo ~M~ão esquerda"
+
+#: backends/platform/ds/arm9/source/dsoptions.cpp:64
+msgid "~I~ndy fight controls"
+msgstr "Controles de luta ~I~ndy"
+
+#: backends/platform/ds/arm9/source/dsoptions.cpp:65
+msgid "Show mouse cursor"
+msgstr "Mostrar o cursor do mouse"
+
+#: backends/platform/ds/arm9/source/dsoptions.cpp:66
+msgid "Snap to edges"
+msgstr "Ajustar às extremidades"
+
+#: backends/platform/ds/arm9/source/dsoptions.cpp:68
+msgid "Touch X Offset"
+msgstr "Equivalência do Toque X"
+
+#: backends/platform/ds/arm9/source/dsoptions.cpp:75
+msgid "Touch Y Offset"
+msgstr "Equivalência do Toque Y"
+
+#: backends/platform/ds/arm9/source/dsoptions.cpp:87
+msgid "Use laptop trackpad-style cursor control"
+msgstr "Usar controle de curso do touchpad"
+
+#: backends/platform/ds/arm9/source/dsoptions.cpp:88
+msgid "Tap for left click, double tap right click"
+msgstr "Um toque para o clique esquerdo, e toque duplo para o clique direito"
+
+#: backends/platform/ds/arm9/source/dsoptions.cpp:90
+msgid "Sensitivity"
+msgstr "Sensibilidade"
+
+#: backends/platform/ds/arm9/source/dsoptions.cpp:99
+msgid "Initial top screen scale:"
+msgstr "Topo inicial para a escala de tela:"
+
+#: backends/platform/ds/arm9/source/dsoptions.cpp:105
+msgid "Main screen scaling:"
+msgstr "Escala de tela principal:"
+
+#: backends/platform/ds/arm9/source/dsoptions.cpp:107
+msgid "Hardware scale (fast, but low quality)"
+msgstr "Escala pelo Hardware (rápido, mas com baixa qualidade)"
+
+#: backends/platform/ds/arm9/source/dsoptions.cpp:108
+msgid "Software scale (good quality, but slower)"
+msgstr "Escala pelo Software (qualidade boa, mas com lentidão)"
+
+#: backends/platform/ds/arm9/source/dsoptions.cpp:109
+msgid "Unscaled (you must scroll left and right)"
+msgstr "Sem escala (você precisa rolar para a esquerda e para a direita)"
+
+#: backends/platform/ds/arm9/source/dsoptions.cpp:111
+msgid "Brightness:"
+msgstr "Brilho:"
+
+#: backends/platform/ds/arm9/source/dsoptions.cpp:121
+msgid "High quality audio (slower) (reboot)"
+msgstr "Som de alta qualidade (mais lento) (reiniciar)"
+
+#: backends/platform/ds/arm9/source/dsoptions.cpp:122
+msgid "Disable power off"
+msgstr "Desativar desligamento"
+
+#: backends/platform/iphone/osys_events.cpp:300
+msgid "Mouse-click-and-drag mode enabled."
+msgstr "Modo clique-e-arraste do mouse ligado."
+
+#: backends/platform/iphone/osys_events.cpp:302
+msgid "Mouse-click-and-drag mode disabled."
+msgstr "Modo clique-e-arraste do mouse desligado."
+
+#: backends/platform/iphone/osys_events.cpp:313
+msgid "Touchpad mode enabled."
+msgstr "Modo Touchpad ligado."
+
+#: backends/platform/iphone/osys_events.cpp:315
+msgid "Touchpad mode disabled."
+msgstr "Modo Touchpad desligado."
+
+#: backends/platform/maemo/maemo.cpp:209
+msgid "Click Mode"
+msgstr ""
+
+#: backends/platform/maemo/maemo.cpp:215
+#: backends/platform/symbian/src/SymbianActions.cpp:42
+#: backends/platform/wince/CEActionsPocket.cpp:60
+#: backends/platform/wince/CEActionsSmartphone.cpp:43
+#: backends/platform/tizen/form.cpp:275
+msgid "Left Click"
+msgstr "Clique com o botão esquerdo"
+
+#: backends/platform/maemo/maemo.cpp:218
+#, fuzzy
+msgid "Middle Click"
+msgstr "Item do meio na esquerda"
+
+#: backends/platform/maemo/maemo.cpp:221
+#: backends/platform/symbian/src/SymbianActions.cpp:43
+#: backends/platform/wince/CEActionsSmartphone.cpp:44
+#: backends/platform/tizen/form.cpp:267
+msgid "Right Click"
+msgstr "Clique com o botão direito"
+
+#: backends/platform/sdl/macosx/appmenu_osx.mm:77
+msgid "Hide ScummVM"
+msgstr "Ocultar ScummVM"
+
+#: backends/platform/sdl/macosx/appmenu_osx.mm:82
+msgid "Hide Others"
+msgstr "Ocultar Outros"
+
+#: backends/platform/sdl/macosx/appmenu_osx.mm:87
+msgid "Show All"
+msgstr "Mostrar Tudo"
+
+#: backends/platform/sdl/macosx/appmenu_osx.mm:109
+#: backends/platform/sdl/macosx/appmenu_osx.mm:120
+msgid "Window"
+msgstr "Janela"
+
+#: backends/platform/sdl/macosx/appmenu_osx.mm:114
+msgid "Minimize"
+msgstr "Minimizar"
+
+#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:46
+msgid "Normal (no scaling)"
+msgstr "Normal (sem escala)"
+
+#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:65
+msgctxt "lowres"
+msgid "Normal (no scaling)"
+msgstr "Normal (sem escala)"
+
+#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2148
+msgid "Enabled aspect ratio correction"
+msgstr "Correção de proporção habilitada"
+
+#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2154
+msgid "Disabled aspect ratio correction"
+msgstr "Correção de proporção desabilitada"
+
+#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2209
+msgid "Active graphics filter:"
+msgstr "Ativa os filtros gráficos"
+
+#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2251
+msgid "Windowed mode"
+msgstr "Modo janela"
+
+#: backends/graphics/opengl/opengl-graphics.cpp:118
+#, fuzzy
+msgid "OpenGL"
+msgstr "Abrir"
+
+#: backends/graphics/opengl/opengl-graphics.cpp:119
+msgid "OpenGL (No filtering)"
+msgstr ""
+
+#: backends/platform/symbian/src/SymbianActions.cpp:38
+#: backends/platform/wince/CEActionsSmartphone.cpp:39
+msgid "Up"
+msgstr "Cima"
+
+#: backends/platform/symbian/src/SymbianActions.cpp:39
+#: backends/platform/wince/CEActionsSmartphone.cpp:40
+msgid "Down"
+msgstr "Baixo"
+
+#: backends/platform/symbian/src/SymbianActions.cpp:40
+#: backends/platform/wince/CEActionsSmartphone.cpp:41
+msgid "Left"
+msgstr "Esquerda"
+
+#: backends/platform/symbian/src/SymbianActions.cpp:41
+#: backends/platform/wince/CEActionsSmartphone.cpp:42
+msgid "Right"
+msgstr "Direita"
+
+#: backends/platform/symbian/src/SymbianActions.cpp:46
+#: backends/platform/wince/CEActionsSmartphone.cpp:47
+msgid "Zone"
+msgstr "Zona"
+
+#: backends/platform/symbian/src/SymbianActions.cpp:47
+#: backends/platform/wince/CEActionsPocket.cpp:54
+#: backends/platform/wince/CEActionsSmartphone.cpp:48
+msgid "Multi Function"
+msgstr "Multi-função"
+
+#: backends/platform/symbian/src/SymbianActions.cpp:48
+msgid "Swap character"
+msgstr "Trocador de caracteres"
+
+#: backends/platform/symbian/src/SymbianActions.cpp:49
+msgid "Skip text"
+msgstr "Pular texto"
+
+#: backends/platform/symbian/src/SymbianActions.cpp:51
+msgid "Fast mode"
+msgstr "Modo rápido"
+
+#: 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:218
+#: engines/scumm/dialogs.cpp:192 engines/scumm/help.cpp:82
+#: engines/scumm/help.cpp:84
+msgid "Quit"
+msgstr "Sair"
+
+#: backends/platform/symbian/src/SymbianActions.cpp:53
+msgid "Debugger"
+msgstr "Depurador"
+
+#: backends/platform/symbian/src/SymbianActions.cpp:54
+msgid "Global menu"
+msgstr "Menu global"
+
+#: backends/platform/symbian/src/SymbianActions.cpp:55
+msgid "Virtual keyboard"
+msgstr "Teclado virtual"
+
+#: backends/platform/symbian/src/SymbianActions.cpp:56
+msgid "Key mapper"
+msgstr "Mapeador de Teclas"
+
+#: backends/events/symbiansdl/symbiansdl-events.cpp:184
+msgid "Do you want to quit ?"
+msgstr "Você deseja sair ?"
+
+#: backends/platform/wii/options.cpp:51
+msgid "Video"
+msgstr "Vídeo"
+
+#: backends/platform/wii/options.cpp:54
+msgid "Current video mode:"
+msgstr "Modo de vídeo atual:"
+
+#: backends/platform/wii/options.cpp:56
+msgid "Double-strike"
+msgstr "Ataque-duplo"
+
+#: backends/platform/wii/options.cpp:60
+msgid "Horizontal underscan:"
+msgstr "Sub-escaneamento horizontal:"
+
+#: backends/platform/wii/options.cpp:66
+msgid "Vertical underscan:"
+msgstr "Sub-escaneamento vertical:"
+
+#: backends/platform/wii/options.cpp:71
+msgid "Input"
+msgstr "Entrada"
+
+#: backends/platform/wii/options.cpp:74
+msgid "GC Pad sensitivity:"
+msgstr "Sensibilidade do CG Pad:"
+
+#: backends/platform/wii/options.cpp:80
+msgid "GC Pad acceleration:"
+msgstr "Aceleração do CG Pad:"
+
+#: backends/platform/wii/options.cpp:86
+msgid "DVD"
+msgstr "DVD"
+
+#: backends/platform/wii/options.cpp:89 backends/platform/wii/options.cpp:101
+msgid "Status:"
+msgstr "Status:"
+
+#: backends/platform/wii/options.cpp:90 backends/platform/wii/options.cpp:102
+msgid "Unknown"
+msgstr "Desconhecido"
+
+#: backends/platform/wii/options.cpp:93
+msgid "Mount DVD"
+msgstr "Montar DVD"
+
+#: backends/platform/wii/options.cpp:94
+msgid "Unmount DVD"
+msgstr "Desmontar DVD"
+
+#: backends/platform/wii/options.cpp:98
+msgid "SMB"
+msgstr "SMB"
+
+#: backends/platform/wii/options.cpp:106
+msgid "Server:"
+msgstr "Servidor:"
+
+#: backends/platform/wii/options.cpp:110
+msgid "Share:"
+msgstr "Compartilhamento:"
+
+#: backends/platform/wii/options.cpp:114
+msgid "Username:"
+msgstr "Nome de usuário:"
+
+#: backends/platform/wii/options.cpp:118
+msgid "Password:"
+msgstr "Senha:"
+
+#: backends/platform/wii/options.cpp:121
+msgid "Init network"
+msgstr "Iniciar rede"
+
+#: backends/platform/wii/options.cpp:123
+msgid "Mount SMB"
+msgstr "Montar SMB"
+
+#: backends/platform/wii/options.cpp:124
+msgid "Unmount SMB"
+msgstr "Desmontar SMB"
+
+#: backends/platform/wii/options.cpp:143
+msgid "DVD Mounted successfully"
+msgstr "DVD montado com sucesso"
+
+#: backends/platform/wii/options.cpp:146
+msgid "Error while mounting the DVD"
+msgstr "Erro ao montar o DVD"
+
+#: backends/platform/wii/options.cpp:148
+msgid "DVD not mounted"
+msgstr "DVD não montado"
+
+#: backends/platform/wii/options.cpp:161
+msgid "Network up, share mounted"
+msgstr "Conexão ativa, compartilhamento ativado"
+
+#: backends/platform/wii/options.cpp:163
+msgid "Network up"
+msgstr "Conexão ativa"
+
+#: backends/platform/wii/options.cpp:166
+msgid ", error while mounting the share"
+msgstr ", erro ao montar o compartilhamento"
+
+#: backends/platform/wii/options.cpp:168
+msgid ", share not mounted"
+msgstr ", compartilhamento não montado"
+
+#: backends/platform/wii/options.cpp:174
+msgid "Network down"
+msgstr "Conexão caiu"
+
+#: backends/platform/wii/options.cpp:178
+msgid "Initializing network"
+msgstr "Inicialização de rede"
+
+#: backends/platform/wii/options.cpp:182
+msgid "Timeout while initializing network"
+msgstr "Tempo limite para iniciar a conexão de rede"
+
+#: backends/platform/wii/options.cpp:186
+#, c-format
+msgid "Network not initialized (%d)"
+msgstr "Rede não inicializada (%d)"
+
+#: backends/platform/wince/CEActionsPocket.cpp:46
+msgid "Hide Toolbar"
+msgstr "Ocultar a barra de ferramentas"
+
+#: backends/platform/wince/CEActionsPocket.cpp:47
+msgid "Show Keyboard"
+msgstr "Mostrar Teclado"
+
+#: backends/platform/wince/CEActionsPocket.cpp:48
+msgid "Sound on/off"
+msgstr "Som on/off"
+
+#: backends/platform/wince/CEActionsPocket.cpp:49
+msgid "Right click"
+msgstr "Clique com o botão direito"
+
+#: backends/platform/wince/CEActionsPocket.cpp:50
+msgid "Show/Hide Cursor"
+msgstr "Mostrar/Ocultar seu cursor"
+
+#: backends/platform/wince/CEActionsPocket.cpp:51
+msgid "Free look"
+msgstr "Olhar livre"
+
+#: backends/platform/wince/CEActionsPocket.cpp:52
+msgid "Zoom up"
+msgstr "Zoom para cima"
+
+#: backends/platform/wince/CEActionsPocket.cpp:53
+msgid "Zoom down"
+msgstr "Zoom para baixo"
+
+#: backends/platform/wince/CEActionsPocket.cpp:55
+#: backends/platform/wince/CEActionsSmartphone.cpp:49
+msgid "Bind Keys"
+msgstr "Botão de ligadura"
+
+#: backends/platform/wince/CEActionsPocket.cpp:56
+msgid "Cursor Up"
+msgstr "Cursor para cima"
+
+#: backends/platform/wince/CEActionsPocket.cpp:57
+msgid "Cursor Down"
+msgstr "Cursor para baixo"
+
+#: backends/platform/wince/CEActionsPocket.cpp:58
+msgid "Cursor Left"
+msgstr "Cursor para a esquerda"
+
+#: backends/platform/wince/CEActionsPocket.cpp:59
+msgid "Cursor Right"
+msgstr "Cursor para a direita"
+
+#: 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:326
+#: backends/platform/wince/CEActionsSmartphone.cpp:287
+msgid " Are you sure you want to quit ? "
+msgstr " Tem certeza de que deseja sair? "
+
+#: backends/platform/wince/CEActionsSmartphone.cpp:50
+msgid "Keyboard"
+msgstr "Teclado"
+
+#: backends/platform/wince/CEActionsSmartphone.cpp:51
+msgid "Rotate"
+msgstr "Rotacionar"
+
+#: backends/platform/wince/CELauncherDialog.cpp:56
+msgid "Using SDL driver "
+msgstr "Usando driver SDL"
+
+#: backends/platform/wince/CELauncherDialog.cpp:60
+msgid "Display "
+msgstr "Tela"
+
+#: 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:516
+msgid "Map right click action"
+msgstr "Mapear ação \"Clique da Direita\""
+
+#: backends/platform/wince/wince-sdl.cpp:520
+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:529
+msgid "Map hide toolbar action"
+msgstr "Mapear \"Ocultar barra de ferramentas\""
+
+#: backends/platform/wince/wince-sdl.cpp:533
+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:542
+msgid "Map Zoom Up action (optional)"
+msgstr "Mapear Zoom para Cima (opcional)"
+
+#: backends/platform/wince/wince-sdl.cpp:545
+msgid "Map Zoom Down action (optional)"
+msgstr "Mapear Zoom para Baixo (opcional)"
+
+#: backends/platform/wince/wince-sdl.cpp:553
+msgid ""
+"Don't forget to map a key to 'Hide Toolbar' action to see the whole inventory"
+msgstr ""
+"Não se esqueça de mapear uma tecla para \"Ocultar a barra de ferramentas\" "
+"para ver todo o seu inventário"
+
+#: backends/events/default/default-events.cpp:196
+msgid "Do you really want to return to the Launcher?"
+msgstr "Você realmente deseja voltar para o menu principal?"
+
+#: backends/events/default/default-events.cpp:196
+msgid "Launcher"
+msgstr "Menu principal"
+
+#: backends/events/default/default-events.cpp:218
+msgid "Do you really want to quit?"
+msgstr "Você realmente deseja sair?"
+
+#: backends/events/gph/gph-events.cpp:386
+#: backends/events/gph/gph-events.cpp:429
+#: backends/events/openpandora/op-events.cpp:168
+msgid "Touchscreen 'Tap Mode' - Left Click"
+msgstr "Touchscreen 'Modo Toque' - Clique Esquerdo"
+
+#: backends/events/gph/gph-events.cpp:388
+#: backends/events/gph/gph-events.cpp:431
+#: backends/events/openpandora/op-events.cpp:170
+msgid "Touchscreen 'Tap Mode' - Right Click"
+msgstr "Touchscreen 'Modo Toque' - Clique Direito"
+
+#: backends/events/gph/gph-events.cpp:390
+#: backends/events/gph/gph-events.cpp:433
+#: backends/events/openpandora/op-events.cpp:172
+msgid "Touchscreen 'Tap Mode' - Hover (No Click)"
+msgstr "Touchscreen 'Modo Toque' - Acima (Sem Clicar)"
+
+#: backends/events/gph/gph-events.cpp:410
+msgid "Maximum Volume"
+msgstr "Volume máximo"
+
+#: backends/events/gph/gph-events.cpp:412
+msgid "Increasing Volume"
+msgstr "Aumentando Volume"
+
+#: backends/events/gph/gph-events.cpp:418
+msgid "Minimal Volume"
+msgstr "Volume mínimo"
+
+#: backends/events/gph/gph-events.cpp:420
+msgid "Decreasing Volume"
+msgstr "Diminuindo Volume"
+
+#: backends/events/openpandora/op-events.cpp:174
+#, fuzzy
+msgid "Touchscreen 'Tap Mode' - Hover (DPad Clicks)"
+msgstr "Touchscreen 'Modo Toque' - Acima (Sem Clicar)"
+
+#: backends/updates/macosx/macosx-updates.mm:67
+msgid "Check for Updates..."
+msgstr "Procurar por Atualizações..."
+
+#: backends/platform/tizen/form.cpp:263
+msgid "Right Click Once"
+msgstr "Clique com o botão direito apenas uma vez"
+
+#: backends/platform/tizen/form.cpp:271
+msgid "Move Only"
+msgstr "Apenas mover"
+
+#: backends/platform/tizen/form.cpp:294
+msgid "Escape Key"
+msgstr "Tecla Escape"
+
+#: backends/platform/tizen/form.cpp:299
+msgid "Game Menu"
+msgstr "Menu do jogo"
+
+#: backends/platform/tizen/form.cpp:304
+msgid "Show Keypad"
+msgstr "Mostrar teclado"
+
+#: backends/platform/tizen/form.cpp:309
+msgid "Control Mouse"
+msgstr "Controle do Mouse"
+
+#: backends/events/maemosdl/maemosdl-events.cpp:192
+msgid "Clicking Enabled"
+msgstr "Clicando Habilitado"
+
+#: backends/events/maemosdl/maemosdl-events.cpp:192
+msgid "Clicking Disabled"
+msgstr "Clicando Desabilitado"
+
+#: engines/agi/detection.cpp:142 engines/drascula/detection.cpp:302
+#: engines/dreamweb/detection.cpp:47 engines/neverhood/detection.cpp:160
+#: engines/sci/detection.cpp:394 engines/toltecs/detection.cpp:186
msgid "Use original save/load screens"
msgstr ""
-#: engines/agi/detection.cpp:143 engines/drascula/detection.cpp:271
-#: engines/dreamweb/detection.cpp:48 engines/sci/detection.cpp:394
-#: engines/toltecs/detection.cpp:174
+#: engines/agi/detection.cpp:143 engines/drascula/detection.cpp:303
+#: engines/dreamweb/detection.cpp:48 engines/neverhood/detection.cpp:161
+#: engines/sci/detection.cpp:395 engines/toltecs/detection.cpp:187
msgid "Use the original save/load screens, instead of the ScummVM ones"
msgstr ""
-#: engines/agi/saveload.cpp:816 engines/drascula/saveload.cpp:351
-#: engines/sci/engine/kfile.cpp:841 engines/toltecs/menu.cpp:259
+#: engines/agi/saveload.cpp:816 engines/drascula/saveload.cpp:349
+#: engines/neverhood/menumodule.cpp:886 engines/sci/engine/kfile.cpp:857
+#: engines/toltecs/menu.cpp:256
msgid "Restore game:"
msgstr "Restaurar jogo:"
-#: engines/agi/saveload.cpp:816 engines/drascula/saveload.cpp:351
-#: engines/sci/engine/kfile.cpp:841 engines/toltecs/menu.cpp:259
+#: engines/agi/saveload.cpp:816 engines/drascula/saveload.cpp:349
+#: engines/neverhood/menumodule.cpp:886 engines/sci/engine/kfile.cpp:857
+#: engines/toltecs/menu.cpp:256
msgid "Restore"
msgstr "Restaurar"
-#: engines/drascula/saveload.cpp:49
+#: engines/agos/saveload.cpp:160 engines/scumm/scumm.cpp:2321
+#, c-format
+msgid ""
+"Failed to load game state from file:\n"
+"\n"
+"%s"
+msgstr ""
+"Falha ao carregar o estado do jogo a partir do arquivo:\n"
+"\n"
+"%s"
+
+#: engines/agos/saveload.cpp:195 engines/scumm/scumm.cpp:2314
+#, c-format
+msgid ""
+"Failed to save game state to file:\n"
+"\n"
+"%s"
+msgstr ""
+"Falha ao salvar o estado do jogo para o arquivo:\n"
+"\n"
+"%s"
+
+#: engines/agos/saveload.cpp:203 engines/scumm/scumm.cpp:2332
+#, c-format
+msgid ""
+"Successfully saved game state in file:\n"
+"\n"
+"%s"
+msgstr ""
+"Jogo salvo com sucesso no arquivo:\n"
+"\n"
+"%s"
+
+#: engines/agos/animation.cpp:557
+#, c-format
+msgid "Cutscene file '%s' not found!"
+msgstr "Arquivo de vídeo '%s' não encontrado!"
+
+#: engines/drascula/saveload.cpp:47
#, fuzzy
msgid ""
"ScummVM found that you have old savefiles for Drascula that should be "
@@ -1461,193 +2195,468 @@ msgstr "Item da direita superior"
msgid "Display graphics using the game's bright palette"
msgstr ""
-#: engines/sci/detection.cpp:373
+#: engines/gob/inter_playtoons.cpp:256 engines/gob/inter_v2.cpp:1470
+#: engines/tinsel/saveload.cpp:532
+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:1540 engines/tinsel/saveload.cpp:545
+msgid "Failed to save game state to file."
+msgstr ""
+"Falha ao salvar o estado do jogo para o arquivo:\n"
+"\n"
+"%s"
+
+#: engines/gob/inter_v5.cpp:107
+msgid "Failed to delete file."
+msgstr "Falha ao excluir arquivo."
+
+#: engines/groovie/detection.cpp:312
+#, fuzzy
+msgid "Fast movie speed"
+msgstr "Modo rápido"
+
+#: engines/groovie/detection.cpp:313
+msgid "Play movies at an increased speed"
+msgstr ""
+
+#: engines/groovie/script.cpp:399
+msgid "Failed to save game"
+msgstr "Falha ao salvar o jogo"
+
+#. I18N: Studio audience adds an applause and cheering sounds whenever
+#. Malcolm makes a joke.
+#: engines/kyra/detection.cpp:62
+msgid "Studio audience"
+msgstr ""
+
+#: engines/kyra/detection.cpp:63
+msgid "Enable studio audience"
+msgstr ""
+
+#. I18N: This option allows the user to skip text and cutscenes.
+#: engines/kyra/detection.cpp:73
+msgid "Skip support"
+msgstr ""
+
+#: engines/kyra/detection.cpp:74
+msgid "Allow text and cutscenes to be skipped"
+msgstr ""
+
+#. I18N: Helium mode makes people sound like they've inhaled Helium.
+#: engines/kyra/detection.cpp:84
+msgid "Helium mode"
+msgstr ""
+
+#: engines/kyra/detection.cpp:85
+#, fuzzy
+msgid "Enable helium mode"
+msgstr "Ligar modo Roland GS"
+
+#. I18N: When enabled, this option makes scrolling smoother when
+#. changing from one screen to another.
+#: engines/kyra/detection.cpp:99
+msgid "Smooth scrolling"
+msgstr ""
+
+#: engines/kyra/detection.cpp:100
+msgid "Enable smooth scrolling when walking"
+msgstr ""
+
+#. I18N: When enabled, this option changes the cursor when it floats to the
+#. edge of the screen to a directional arrow. The player can then click to
+#. walk towards that direction.
+#: engines/kyra/detection.cpp:112
+#, fuzzy
+msgid "Floating cursors"
+msgstr "Cursor normal"
+
+#: engines/kyra/detection.cpp:113
+msgid "Enable floating cursors"
+msgstr ""
+
+#. I18N: HP stands for Hit Points
+#: engines/kyra/detection.cpp:127
+msgid "HP bar graphs"
+msgstr ""
+
+#: engines/kyra/detection.cpp:128
+msgid "Enable hit point bar graphs"
+msgstr ""
+
+#: engines/kyra/lol.cpp:478
+msgid "Attack 1"
+msgstr ""
+
+#: engines/kyra/lol.cpp:479
+msgid "Attack 2"
+msgstr ""
+
+#: engines/kyra/lol.cpp:480
+msgid "Attack 3"
+msgstr ""
+
+#: engines/kyra/lol.cpp:481
+msgid "Move Forward"
+msgstr ""
+
+#: engines/kyra/lol.cpp:482
+msgid "Move Back"
+msgstr ""
+
+#: engines/kyra/lol.cpp:483
+msgid "Slide Left"
+msgstr ""
+
+#: engines/kyra/lol.cpp:484
+#, fuzzy
+msgid "Slide Right"
+msgstr "Direita"
+
+#: engines/kyra/lol.cpp:485 engines/pegasus/pegasus.cpp:2509
+#, fuzzy
+msgid "Turn Left"
+msgstr "Desligar"
+
+#: engines/kyra/lol.cpp:486 engines/pegasus/pegasus.cpp:2510
+#, fuzzy
+msgid "Turn Right"
+msgstr "Cursor para a direita"
+
+#: engines/kyra/lol.cpp:487
+#, fuzzy
+msgid "Rest"
+msgstr "Restaurar"
+
+#: engines/kyra/lol.cpp:488
+#, fuzzy
+msgid "Options"
+msgstr "~O~pções"
+
+#: engines/kyra/lol.cpp:489
+#, fuzzy
+msgid "Choose Spell"
+msgstr "Escolher"
+
+#: engines/kyra/sound_midi.cpp:477
+#, fuzzy
+msgid ""
+"You appear to be using a General MIDI device,\n"
+"but your game only supports Roland MT32 MIDI.\n"
+"We try to map the Roland MT32 instruments to\n"
+"General MIDI ones. It is still possible that\n"
+"some tracks sound incorrect."
+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."
+
+#. I18N: Option for fast scene switching
+#: engines/mohawk/dialogs.cpp:92 engines/mohawk/dialogs.cpp:167
+msgid "~Z~ip Mode Activated"
+msgstr "Modo ~Z~ip ativado"
+
+#: engines/mohawk/dialogs.cpp:93
+msgid "~T~ransitions Enabled"
+msgstr "Modo ~T~ransições ativado"
+
+#. I18N: Drop book page
+#: engines/mohawk/dialogs.cpp:95
+msgid "~D~rop Page"
+msgstr "~S~oltar Página"
+
+#: engines/mohawk/dialogs.cpp:99
+msgid "~S~how Map"
+msgstr "~E~xibir Mapa"
+
+#: engines/mohawk/dialogs.cpp:105
+msgid "~M~ain Menu"
+msgstr "~M~enu Principal ScummVM"
+
+#: engines/mohawk/dialogs.cpp:168
+msgid "~W~ater Effect Enabled"
+msgstr "Modo ~E~feitos de água ativado"
+
+#: engines/neverhood/detection.cpp:167
+msgid "Skip the Hall of Records storyboard scenes"
+msgstr ""
+
+#: engines/neverhood/detection.cpp:168
+msgid "Allows the player to skip past the Hall of Records storyboard scenes"
+msgstr ""
+
+#: engines/neverhood/detection.cpp:174
+msgid "Scale the making of videos to full screen"
+msgstr ""
+
+#: engines/neverhood/detection.cpp:175
+msgid "Scale the making of videos, so that they use the whole screen"
+msgstr ""
+
+#: engines/parallaction/saveload.cpp:133
+#, c-format
+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:204
+msgid "Loading game..."
+msgstr "Carregando jogo..."
+
+#: engines/parallaction/saveload.cpp:219
+msgid "Saving game..."
+msgstr "Salvando jogo..."
+
+#: engines/parallaction/saveload.cpp:272
+msgid ""
+"ScummVM found that you have old savefiles for Nippon Safes that should be "
+"renamed.\n"
+"The old names are 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 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:319
+msgid "ScummVM successfully converted all your savefiles."
+msgstr "ScummVM converteu com êxito todos os seus jogos salvos."
+
+#: engines/parallaction/saveload.cpp:321
+msgid ""
+"ScummVM printed some warnings in your console window and can't guarantee all "
+"your files have been converted.\n"
+"\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."
+
+#: engines/pegasus/pegasus.cpp:714
+msgid "Invalid save file name"
+msgstr ""
+
+#: engines/pegasus/pegasus.cpp:2507
+msgid "Up/Zoom In/Move Forward/Open Doors"
+msgstr ""
+
+#: engines/pegasus/pegasus.cpp:2508
+#, fuzzy
+msgid "Down/Zoom Out"
+msgstr "Zoom para cima"
+
+#: engines/pegasus/pegasus.cpp:2511
+msgid "Display/Hide Inventory Tray"
+msgstr ""
+
+#: engines/pegasus/pegasus.cpp:2512
+msgid "Display/Hide Biochip Tray"
+msgstr ""
+
+#: engines/pegasus/pegasus.cpp:2513
+msgid "Action/Select"
+msgstr ""
+
+#: engines/pegasus/pegasus.cpp:2514
+msgid "Toggle Center Data Display"
+msgstr ""
+
+#: engines/pegasus/pegasus.cpp:2515
+msgid "Display/Hide Info Screen"
+msgstr ""
+
+#: engines/pegasus/pegasus.cpp:2516
+msgid "Display/Hide Pause Menu"
+msgstr ""
+
+#: engines/pegasus/pegasus.cpp:2517
+msgid "???"
+msgstr ""
+
+#: engines/sci/detection.cpp:374
msgid "EGA undithering"
msgstr "EGA sem dithering"
-#: engines/sci/detection.cpp:374
+#: engines/sci/detection.cpp:375
#, fuzzy
msgid "Enable undithering in EGA games"
msgstr "Habilita EGA sem dithering em jogos com suporte"
-#: engines/sci/detection.cpp:383
+#: engines/sci/detection.cpp:384
#, fuzzy
msgid "Prefer digital sound effects"
msgstr "Volume dos efeitos sonoros especiais"
-#: engines/sci/detection.cpp:384
+#: engines/sci/detection.cpp:385
msgid "Prefer digital sound effects instead of synthesized ones"
msgstr ""
-#: engines/sci/detection.cpp:403
+#: engines/sci/detection.cpp:404
msgid "Use IMF/Yamaha FB-01 for MIDI output"
msgstr ""
-#: engines/sci/detection.cpp:404
+#: engines/sci/detection.cpp:405
msgid ""
"Use an IBM Music Feature card or a Yamaha FB-01 FM synth module for MIDI "
"output"
msgstr ""
-#: engines/sci/detection.cpp:414
+#: engines/sci/detection.cpp:415
msgid "Use CD audio"
msgstr ""
-#: engines/sci/detection.cpp:415
+#: engines/sci/detection.cpp:416
msgid "Use CD audio instead of in-game audio, if available"
msgstr ""
-#: engines/sci/detection.cpp:425
+#: engines/sci/detection.cpp:426
msgid "Use Windows cursors"
msgstr ""
-#: engines/sci/detection.cpp:426
+#: engines/sci/detection.cpp:427
msgid ""
"Use the Windows cursors (smaller and monochrome) instead of the DOS ones"
msgstr ""
-#: engines/sci/detection.cpp:436
+#: engines/sci/detection.cpp:437
#, fuzzy
msgid "Use silver cursors"
msgstr "Cursor normal"
-#: engines/sci/detection.cpp:437
+#: engines/sci/detection.cpp:438
msgid ""
"Use the alternate set of silver cursors, instead of the normal golden ones"
msgstr ""
-#: engines/scumm/dialogs.cpp:175
+#: engines/scumm/dialogs.cpp:176
#, 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
+#: engines/scumm/dialogs.cpp:177
#, 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
+#: engines/scumm/dialogs.cpp:178
#, 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
+#: engines/scumm/dialogs.cpp:179
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
+#: engines/scumm/dialogs.cpp:183
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
+#: engines/scumm/dialogs.cpp:185
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
+#: engines/scumm/dialogs.cpp:190
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:215
-msgid "Quit"
-msgstr "Sair"
-
-#: engines/scumm/dialogs.cpp:193
+#: engines/scumm/dialogs.cpp:194
msgid "Insert save/load game disk"
msgstr "Insira o disco para salvar/carregar o jogo"
-#: engines/scumm/dialogs.cpp:194
+#: engines/scumm/dialogs.cpp:195
msgid "You must enter a name"
msgstr "Você deve digitar um nome"
-#: engines/scumm/dialogs.cpp:195
+#: engines/scumm/dialogs.cpp:196
msgid "The game was NOT saved (disk full?)"
msgstr "O jogo NÃO foi salvo (disco cheio?)"
-#: engines/scumm/dialogs.cpp:196
+#: engines/scumm/dialogs.cpp:197
msgid "The game was NOT loaded"
msgstr "O jogo NÃO foi carregado"
-#: engines/scumm/dialogs.cpp:197
+#: engines/scumm/dialogs.cpp:198
#, c-format
msgid "Saving '%s'"
msgstr "Salvando '%s'"
-#: engines/scumm/dialogs.cpp:198
+#: engines/scumm/dialogs.cpp:199
#, c-format
msgid "Loading '%s'"
msgstr "Carregando '%s'"
-#: engines/scumm/dialogs.cpp:199
+#: engines/scumm/dialogs.cpp:200
msgid "Name your SAVE game"
msgstr "Dê um nome ao seu SAVE"
-#: engines/scumm/dialogs.cpp:200
+#: engines/scumm/dialogs.cpp:201
msgid "Select a game to LOAD"
msgstr "Selecione um jogo para CARREGAR"
-#: engines/scumm/dialogs.cpp:201
+#: engines/scumm/dialogs.cpp:202
msgid "Game title)"
msgstr "Título do jogo)"
#. I18N: Previous page button
-#: engines/scumm/dialogs.cpp:287
+#: engines/scumm/dialogs.cpp:288
msgid "~P~revious"
msgstr "~A~nterior"
#. I18N: Next page button
-#: engines/scumm/dialogs.cpp:289
+#: engines/scumm/dialogs.cpp:290
msgid "~N~ext"
msgstr "~P~róximo"
-#: engines/scumm/dialogs.cpp:290
-#: backends/platform/ds/arm9/source/dsoptions.cpp:56
-msgid "~C~lose"
-msgstr "~F~echar"
-
-#: engines/scumm/dialogs.cpp:597
+#: engines/scumm/dialogs.cpp:598
msgid "Speech Only"
msgstr "Somente Voz"
-#: engines/scumm/dialogs.cpp:598
+#: engines/scumm/dialogs.cpp:599
msgid "Speech and Subtitles"
msgstr "Voz e Legendas"
-#: engines/scumm/dialogs.cpp:599
+#: engines/scumm/dialogs.cpp:600
msgid "Subtitles Only"
msgstr "Somente Legendas"
-#: engines/scumm/dialogs.cpp:607
+#: engines/scumm/dialogs.cpp:608
msgctxt "lowres"
msgid "Speech & Subs"
msgstr "Voz e Legendas"
-#: engines/scumm/dialogs.cpp:653
+#: engines/scumm/dialogs.cpp:654
msgid "Select a Proficiency Level."
msgstr ""
-#: engines/scumm/dialogs.cpp:655
+#: engines/scumm/dialogs.cpp:656
msgid "Refer to your Loom(TM) manual for help."
msgstr ""
-#: engines/scumm/dialogs.cpp:658
-#, fuzzy
-msgid "Standard"
-msgstr "Padrão (16bpp)"
-
-#: engines/scumm/dialogs.cpp:659
+#: engines/scumm/dialogs.cpp:660
msgid "Practice"
msgstr ""
-#: engines/scumm/dialogs.cpp:660
+#: engines/scumm/dialogs.cpp:661
msgid "Expert"
msgstr ""
@@ -2164,7 +3173,7 @@ msgstr "Voar para direita"
msgid "Fly to lower right"
msgstr "Voar para direita inferior"
-#: engines/scumm/scumm.cpp:1776
+#: engines/scumm/scumm.cpp:1777
#, c-format
msgid ""
"Native MIDI support requires the Roland Upgrade from LucasArts,\n"
@@ -2174,40 +3183,7 @@ msgstr ""
"LucasArts,\n"
"mas %s está faltando. Utilizando AdLib ao invés."
-#: engines/scumm/scumm.cpp:2303 engines/agos/saveload.cpp:220
-#, c-format
-msgid ""
-"Failed to save game state to file:\n"
-"\n"
-"%s"
-msgstr ""
-"Falha ao salvar o estado do jogo para o arquivo:\n"
-"\n"
-"%s"
-
-#: engines/scumm/scumm.cpp:2310 engines/agos/saveload.cpp:185
-#, c-format
-msgid ""
-"Failed to load game state from file:\n"
-"\n"
-"%s"
-msgstr ""
-"Falha ao carregar o estado do jogo a partir do arquivo:\n"
-"\n"
-"%s"
-
-#: engines/scumm/scumm.cpp:2322 engines/agos/saveload.cpp:228
-#, c-format
-msgid ""
-"Successfully saved game state in file:\n"
-"\n"
-"%s"
-msgstr ""
-"Jogo salvo com sucesso no arquivo:\n"
-"\n"
-"%s"
-
-#: engines/scumm/scumm.cpp:2537
+#: engines/scumm/scumm.cpp:2547
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' "
@@ -2218,206 +3194,6 @@ msgstr ""
"adicione o jogo normalmente no ScummVM. Ele se encontra em um diretório "
"dentro da pasta do jogo Day of the Tentacle."
-#. I18N: Option for fast scene switching
-#: engines/mohawk/dialogs.cpp:92 engines/mohawk/dialogs.cpp:167
-msgid "~Z~ip Mode Activated"
-msgstr "Modo ~Z~ip ativado"
-
-#: engines/mohawk/dialogs.cpp:93
-msgid "~T~ransitions Enabled"
-msgstr "Modo ~T~ransições ativado"
-
-#. I18N: Drop book page
-#: engines/mohawk/dialogs.cpp:95
-msgid "~D~rop Page"
-msgstr "~S~oltar Página"
-
-#: engines/mohawk/dialogs.cpp:99
-msgid "~S~how Map"
-msgstr "~E~xibir Mapa"
-
-#: engines/mohawk/dialogs.cpp:105
-msgid "~M~ain Menu"
-msgstr "~M~enu Principal ScummVM"
-
-#: engines/mohawk/dialogs.cpp:168
-msgid "~W~ater Effect Enabled"
-msgstr "Modo ~E~feitos de água ativado"
-
-#: engines/agos/animation.cpp:557
-#, c-format
-msgid "Cutscene file '%s' not found!"
-msgstr "Arquivo de vídeo '%s' não encontrado!"
-
-#: engines/gob/inter_playtoons.cpp:256 engines/gob/inter_v2.cpp:1287
-#: engines/tinsel/saveload.cpp:532
-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:1357 engines/tinsel/saveload.cpp:545
-msgid "Failed to save game state to file."
-msgstr ""
-"Falha ao salvar o estado do jogo para o arquivo:\n"
-"\n"
-"%s"
-
-#: engines/gob/inter_v5.cpp:107
-msgid "Failed to delete file."
-msgstr "Falha ao excluir arquivo."
-
-#: engines/groovie/detection.cpp:312
-#, fuzzy
-msgid "Fast movie speed"
-msgstr "Modo rápido"
-
-#: engines/groovie/detection.cpp:313
-msgid "Play movies at an increased speed"
-msgstr ""
-
-#: engines/groovie/script.cpp:420
-msgid "Failed to save game"
-msgstr "Falha ao salvar o jogo"
-
-#. I18N: Studio audience adds an applause and cheering sounds whenever
-#. Malcolm makes a joke.
-#: engines/kyra/detection.cpp:62
-msgid "Studio audience"
-msgstr ""
-
-#: engines/kyra/detection.cpp:63
-msgid "Enable studio audience"
-msgstr ""
-
-#. I18N: This option allows the user to skip text and cutscenes.
-#: engines/kyra/detection.cpp:73
-msgid "Skip support"
-msgstr ""
-
-#: engines/kyra/detection.cpp:74
-msgid "Allow text and cutscenes to be skipped"
-msgstr ""
-
-#. I18N: Helium mode makes people sound like they've inhaled Helium.
-#: engines/kyra/detection.cpp:84
-msgid "Helium mode"
-msgstr ""
-
-#: engines/kyra/detection.cpp:85
-#, fuzzy
-msgid "Enable helium mode"
-msgstr "Ligar modo Roland GS"
-
-#. I18N: When enabled, this option makes scrolling smoother when
-#. changing from one screen to another.
-#: engines/kyra/detection.cpp:99
-msgid "Smooth scrolling"
-msgstr ""
-
-#: engines/kyra/detection.cpp:100
-msgid "Enable smooth scrolling when walking"
-msgstr ""
-
-#. I18N: When enabled, this option changes the cursor when it floats to the
-#. edge of the screen to a directional arrow. The player can then click to
-#. walk towards that direction.
-#: engines/kyra/detection.cpp:112
-#, fuzzy
-msgid "Floating cursors"
-msgstr "Cursor normal"
-
-#: engines/kyra/detection.cpp:113
-msgid "Enable floating cursors"
-msgstr ""
-
-#. I18N: HP stands for Hit Points
-#: engines/kyra/detection.cpp:127
-msgid "HP bar graphs"
-msgstr ""
-
-#: engines/kyra/detection.cpp:128
-msgid "Enable hit point bar graphs"
-msgstr ""
-
-#: engines/kyra/lol.cpp:478
-msgid "Attack 1"
-msgstr ""
-
-#: engines/kyra/lol.cpp:479
-msgid "Attack 2"
-msgstr ""
-
-#: engines/kyra/lol.cpp:480
-msgid "Attack 3"
-msgstr ""
-
-#: engines/kyra/lol.cpp:481
-msgid "Move Forward"
-msgstr ""
-
-#: engines/kyra/lol.cpp:482
-msgid "Move Back"
-msgstr ""
-
-#: engines/kyra/lol.cpp:483
-msgid "Slide Left"
-msgstr ""
-
-#: engines/kyra/lol.cpp:484
-#, fuzzy
-msgid "Slide Right"
-msgstr "Direita"
-
-#: engines/kyra/lol.cpp:485 engines/pegasus/pegasus.cpp:2447
-#, fuzzy
-msgid "Turn Left"
-msgstr "Desligar"
-
-#: engines/kyra/lol.cpp:486 engines/pegasus/pegasus.cpp:2448
-#, fuzzy
-msgid "Turn Right"
-msgstr "Cursor para a direita"
-
-#: engines/kyra/lol.cpp:487
-#, fuzzy
-msgid "Rest"
-msgstr "Restaurar"
-
-#: engines/kyra/lol.cpp:488
-#, fuzzy
-msgid "Options"
-msgstr "~O~pções"
-
-#: engines/kyra/lol.cpp:489
-#, fuzzy
-msgid "Choose Spell"
-msgstr "Escolher"
-
-#: engines/kyra/sound_midi.cpp:477
-#, fuzzy
-msgid ""
-"You appear to be using a General MIDI device,\n"
-"but your game only supports Roland MT32 MIDI.\n"
-"We try to map the Roland MT32 instruments to\n"
-"General MIDI ones. It is still possible that\n"
-"some tracks sound incorrect."
-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/queen/queen.cpp:59
-msgid "Alternative intro"
-msgstr ""
-
-#: engines/queen/queen.cpp:60
-msgid "Use an alternative game intro (CD version only)"
-msgstr ""
-
#: engines/sky/compact.cpp:130
msgid ""
"Unable to find \"sky.cpt\" file!\n"
@@ -2442,22 +3218,25 @@ msgstr ""
msgid "Use the floppy version's intro (CD version only)"
msgstr ""
-#: engines/sword1/animation.cpp:519
+#: engines/sword1/animation.cpp:524
#, c-format
msgid "PSX stream cutscene '%s' cannot be played in paletted mode"
msgstr ""
-#: engines/sword1/animation.cpp:540 engines/sword2/animation.cpp:439
+#: engines/sword1/animation.cpp:545 engines/sword2/animation.cpp:445
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:550 engines/sword2/animation.cpp:449
-msgid "MPEG2 cutscenes are no longer supported"
-msgstr "Vídeos em MPEG2 não são mais suportados"
+#: engines/sword1/animation.cpp:561
+#, fuzzy
+msgid "MPEG-2 cutscenes found but ScummVM has been built without MPEG-2"
+msgstr ""
+"Vídeos no formato DXA foram encontrados, mas o ScummVM foi compilado sem "
+"suporte a zlib"
-#: engines/sword1/animation.cpp:556 engines/sword2/animation.cpp:457
+#: engines/sword1/animation.cpp:568 engines/sword2/animation.cpp:470
#, c-format
msgid "Cutscene '%s' not found"
msgstr "Vídeo '%s' não encontrado"
@@ -2501,7 +3280,7 @@ msgstr "Mantenha o novo"
msgid "This is the end of the Broken Sword 1 Demo"
msgstr "Este é o fim do demo de Broken Sword 1"
-#: engines/sword2/animation.cpp:419
+#: engines/sword2/animation.cpp:425
#, fuzzy
msgid ""
"PSX cutscenes found but ScummVM has been built without RGB color support"
@@ -2509,6 +3288,14 @@ msgstr ""
"Vídeos no formato DXA foram encontrados, mas o ScummVM foi compilado sem "
"suporte a zlib"
+#: engines/sword2/animation.cpp:461
+#, fuzzy
+msgid ""
+"MPEG-2 cutscenes found but ScummVM has been built without MPEG-2 support"
+msgstr ""
+"Vídeos no formato DXA foram encontrados, mas o ScummVM foi compilado sem "
+"suporte a zlib"
+
#: engines/sword2/sword2.cpp:79
msgid "Show object labels"
msgstr ""
@@ -2517,806 +3304,56 @@ msgstr ""
msgid "Show labels for objects on mouse hover"
msgstr ""
-#: engines/teenagent/resources.cpp:94
+#: engines/teenagent/resources.cpp:95
msgid ""
"You're missing the 'teenagent.dat' file. Get it from the ScummVM website"
msgstr ""
-#: engines/teenagent/resources.cpp:115
+#: engines/teenagent/resources.cpp:116
msgid ""
"The teenagent.dat file is compressed and zlib hasn't been included in this "
"executable. Please decompress it"
msgstr ""
-#: engines/parallaction/saveload.cpp:133
-#, c-format
-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:204
-msgid "Loading game..."
-msgstr "Carregando jogo..."
-
-#: engines/parallaction/saveload.cpp:219
-msgid "Saving game..."
-msgstr "Salvando jogo..."
-
-#: engines/parallaction/saveload.cpp:272
-msgid ""
-"ScummVM found that you have old savefiles for Nippon Safes that should be "
-"renamed.\n"
-"The old names are 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 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:319
-msgid "ScummVM successfully converted all your savefiles."
-msgstr "ScummVM converteu com êxito todos os seus jogos salvos."
-
-#: engines/parallaction/saveload.cpp:321
-msgid ""
-"ScummVM printed some warnings in your console window and can't guarantee all "
-"your files have been converted.\n"
-"\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."
-
-#: engines/pegasus/pegasus.cpp:679
-msgid "Invalid save file name"
-msgstr ""
-
-#: engines/pegasus/pegasus.cpp:2445
-msgid "Up/Zoom In/Move Forward/Open Doors"
-msgstr ""
-
-#: engines/pegasus/pegasus.cpp:2446
-#, fuzzy
-msgid "Down/Zoom Out"
-msgstr "Zoom para cima"
-
-#: engines/pegasus/pegasus.cpp:2449
-msgid "Display/Hide Inventory Tray"
-msgstr ""
-
-#: engines/pegasus/pegasus.cpp:2450
-msgid "Display/Hide Biochip Tray"
-msgstr ""
-
-#: engines/pegasus/pegasus.cpp:2451
-msgid "Action/Select"
-msgstr ""
-
-#: engines/pegasus/pegasus.cpp:2452
-msgid "Toggle Center Data Display"
-msgstr ""
-
-#: engines/pegasus/pegasus.cpp:2453
-msgid "Display/Hide Info Screen"
-msgstr ""
-
-#: engines/pegasus/pegasus.cpp:2454
-msgid "Display/Hide Pause Menu"
-msgstr ""
-
-#: engines/pegasus/pegasus.cpp:2455
-msgid "???"
-msgstr ""
-
-#: audio/fmopl.cpp:49
-msgid "MAME OPL emulator"
-msgstr "Emulador MAME OPL"
-
-#: audio/fmopl.cpp:51
-msgid "DOSBox OPL emulator"
-msgstr "Emulador DOSBox OPL"
-
-#: audio/mididrv.cpp:209
-#, c-format
-msgid ""
-"The selected audio device '%s' was not found (e.g. might be turned off or "
-"disconnected)."
-msgstr ""
-"O dispositivo de áudio selecionado '%s' não foi encontrado (ex: pode estar "
-"desligado ou desconectado)."
-
-#: audio/mididrv.cpp:209 audio/mididrv.cpp:221 audio/mididrv.cpp:257
-#: audio/mididrv.cpp:272
-msgid "Attempting to fall back to the next available device..."
-msgstr "Tentando retornar para o próximo dispositivo disponível..."
-
-#: audio/mididrv.cpp:221
-#, c-format
-msgid ""
-"The selected audio device '%s' cannot be used. See log file for more "
-"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:257
-#, c-format
-msgid ""
-"The preferred audio device '%s' was not found (e.g. might be turned off or "
-"disconnected)."
-msgstr ""
-"O dispositivo de áudio preferido '%s' não foi encontrado (ex: pode estar "
-"desligado ou desconectado)."
-
-#: audio/mididrv.cpp:272
-#, c-format
-msgid ""
-"The preferred audio device '%s' cannot be used. See log file for more "
-"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"
-msgstr "Sem música"
-
-#: audio/mods/paula.cpp:189
-msgid "Amiga Audio Emulator"
-msgstr "Emulador Som Amiga"
-
-#: audio/softsynth/adlib.cpp:2284
-msgid "AdLib Emulator"
-msgstr "Emulador AdLib"
-
-#: audio/softsynth/appleiigs.cpp:33
-msgid "Apple II GS Emulator (NOT IMPLEMENTED)"
-msgstr "Emulador Apple II GS (NÃO IMPLEMENTADO)"
-
-#: audio/softsynth/sid.cpp:1430
-msgid "C64 Audio Emulator"
-msgstr "Emulador Som C64"
-
-#: audio/softsynth/mt32.cpp:205
-msgid "Initializing MT-32 Emulator"
-msgstr "Inicializando Emulador MT-32"
-
-#: audio/softsynth/mt32.cpp:431
-msgid "MT-32 Emulator"
-msgstr "Emulador MT-32"
-
-#: audio/softsynth/pcspk.cpp:139
-msgid "PC Speaker Emulator"
-msgstr "Emulador PC Speaker"
-
-#: audio/softsynth/pcspk.cpp:158
-msgid "IBM PCjr Emulator"
-msgstr "Emulador IBM PCjr"
-
-#: backends/keymapper/remap-dialog.cpp:47
-msgid "Keymap:"
-msgstr "Mapa de Teclas:"
-
-#: backends/keymapper/remap-dialog.cpp:66
-#, fuzzy
-msgid " (Effective)"
-msgstr "(Ativo)"
-
-#: backends/keymapper/remap-dialog.cpp:106
-msgid " (Active)"
-msgstr "(Ativo)"
-
-#: backends/keymapper/remap-dialog.cpp:106
-msgid " (Blocked)"
-msgstr ""
-
-#: backends/keymapper/remap-dialog.cpp:119
-msgid " (Global)"
-msgstr "(Global)"
-
-#: backends/keymapper/remap-dialog.cpp:127
-msgid " (Game)"
-msgstr "(Jogo)"
-
-#: backends/midi/windows.cpp:164
-msgid "Windows MIDI"
-msgstr "MIDI Windows"
-
-#: backends/platform/ds/arm9/source/dsoptions.cpp:57
-msgid "ScummVM Main Menu"
-msgstr "Menu Principal ScummVM"
-
-#: backends/platform/ds/arm9/source/dsoptions.cpp:63
-msgid "~L~eft handed mode"
-msgstr "Modo ~M~ão esquerda"
-
-#: backends/platform/ds/arm9/source/dsoptions.cpp:64
-msgid "~I~ndy fight controls"
-msgstr "Controles de luta ~I~ndy"
-
-#: backends/platform/ds/arm9/source/dsoptions.cpp:65
-msgid "Show mouse cursor"
-msgstr "Mostrar o cursor do mouse"
-
-#: backends/platform/ds/arm9/source/dsoptions.cpp:66
-msgid "Snap to edges"
-msgstr "Ajustar às extremidades"
-
-#: backends/platform/ds/arm9/source/dsoptions.cpp:68
-msgid "Touch X Offset"
-msgstr "Equivalência do Toque X"
-
-#: backends/platform/ds/arm9/source/dsoptions.cpp:75
-msgid "Touch Y Offset"
-msgstr "Equivalência do Toque Y"
-
-#: backends/platform/ds/arm9/source/dsoptions.cpp:87
-msgid "Use laptop trackpad-style cursor control"
-msgstr "Usar controle de curso do touchpad"
-
-#: backends/platform/ds/arm9/source/dsoptions.cpp:88
-msgid "Tap for left click, double tap right click"
-msgstr "Um toque para o clique esquerdo, e toque duplo para o clique direito"
-
-#: backends/platform/ds/arm9/source/dsoptions.cpp:90
-msgid "Sensitivity"
-msgstr "Sensibilidade"
-
-#: backends/platform/ds/arm9/source/dsoptions.cpp:99
-msgid "Initial top screen scale:"
-msgstr "Topo inicial para a escala de tela:"
-
-#: backends/platform/ds/arm9/source/dsoptions.cpp:105
-msgid "Main screen scaling:"
-msgstr "Escala de tela principal:"
-
-#: backends/platform/ds/arm9/source/dsoptions.cpp:107
-msgid "Hardware scale (fast, but low quality)"
-msgstr "Escala pelo Hardware (rápido, mas com baixa qualidade)"
-
-#: backends/platform/ds/arm9/source/dsoptions.cpp:108
-msgid "Software scale (good quality, but slower)"
-msgstr "Escala pelo Software (qualidade boa, mas com lentidão)"
-
-#: backends/platform/ds/arm9/source/dsoptions.cpp:109
-msgid "Unscaled (you must scroll left and right)"
-msgstr "Sem escala (você precisa rolar para a esquerda e para a direita)"
-
-#: backends/platform/ds/arm9/source/dsoptions.cpp:111
-msgid "Brightness:"
-msgstr "Brilho:"
-
-#: backends/platform/ds/arm9/source/dsoptions.cpp:121
-msgid "High quality audio (slower) (reboot)"
-msgstr "Som de alta qualidade (mais lento) (reiniciar)"
-
-#: backends/platform/ds/arm9/source/dsoptions.cpp:122
-msgid "Disable power off"
-msgstr "Desativar desligamento"
-
-#: backends/platform/iphone/osys_events.cpp:300
-msgid "Mouse-click-and-drag mode enabled."
-msgstr "Modo clique-e-arraste do mouse ligado."
-
-#: backends/platform/iphone/osys_events.cpp:302
-msgid "Mouse-click-and-drag mode disabled."
-msgstr "Modo clique-e-arraste do mouse desligado."
-
-#: backends/platform/iphone/osys_events.cpp:313
-msgid "Touchpad mode enabled."
-msgstr "Modo Touchpad ligado."
-
-#: backends/platform/iphone/osys_events.cpp:315
-msgid "Touchpad mode disabled."
-msgstr "Modo Touchpad desligado."
-
-#: backends/platform/maemo/maemo.cpp:209
-msgid "Click Mode"
-msgstr ""
-
-#: backends/platform/maemo/maemo.cpp:215
-#: 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/maemo/maemo.cpp:218
-#, fuzzy
-msgid "Middle Click"
-msgstr "Item do meio na esquerda"
-
-#: backends/platform/maemo/maemo.cpp:221
-#: 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"
-
-#: backends/platform/sdl/macosx/appmenu_osx.mm:77
-msgid "Hide ScummVM"
-msgstr "Ocultar ScummVM"
-
-#: backends/platform/sdl/macosx/appmenu_osx.mm:82
-msgid "Hide Others"
-msgstr "Ocultar Outros"
-
-#: backends/platform/sdl/macosx/appmenu_osx.mm:87
-msgid "Show All"
-msgstr "Mostrar Tudo"
-
-#: backends/platform/sdl/macosx/appmenu_osx.mm:109
-#: backends/platform/sdl/macosx/appmenu_osx.mm:120
-msgid "Window"
-msgstr "Janela"
-
-#: backends/platform/sdl/macosx/appmenu_osx.mm:114
-msgid "Minimize"
-msgstr "Minimizar"
-
-#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:45
-msgid "Normal (no scaling)"
-msgstr "Normal (sem escala)"
-
-#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:64
-msgctxt "lowres"
-msgid "Normal (no scaling)"
-msgstr "Normal (sem escala)"
-
-#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2135
-#: backends/graphics/openglsdl/openglsdl-graphics.cpp:537
-msgid "Enabled aspect ratio correction"
-msgstr "Correção de proporção habilitada"
-
-#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2141
-#: backends/graphics/openglsdl/openglsdl-graphics.cpp:542
-msgid "Disabled aspect ratio correction"
-msgstr "Correção de proporção desabilitada"
-
-#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2196
-msgid "Active graphics filter:"
-msgstr "Ativa os filtros gráficos"
-
-#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2238
-#: backends/graphics/openglsdl/openglsdl-graphics.cpp:481
-msgid "Windowed mode"
-msgstr "Modo janela"
-
-#: backends/graphics/opengl/opengl-graphics.cpp:135
-msgid "OpenGL Normal"
-msgstr "OpenGL Normal"
-
-#: backends/graphics/opengl/opengl-graphics.cpp:136
-msgid "OpenGL Conserve"
-msgstr "OpenGL Conserve"
-
-#: backends/graphics/opengl/opengl-graphics.cpp:137
-msgid "OpenGL Original"
-msgstr "OpenGL Original"
-
-#: backends/graphics/openglsdl/openglsdl-graphics.cpp:415
-msgid "Current display mode"
-msgstr "Modo de vídeo atual"
-
-#: backends/graphics/openglsdl/openglsdl-graphics.cpp:428
-msgid "Current scale"
-msgstr "Escala atual"
-
-#: backends/graphics/openglsdl/openglsdl-graphics.cpp:562
-msgid "Active filter mode: Linear"
-msgstr "Filtro de imagem ativo: Linear"
-
-#: backends/graphics/openglsdl/openglsdl-graphics.cpp:564
-msgid "Active filter mode: Nearest"
-msgstr "Filtro de imagem ativo: Nearest"
-
-#: backends/platform/symbian/src/SymbianActions.cpp:38
-#: backends/platform/wince/CEActionsSmartphone.cpp:39
-msgid "Up"
-msgstr "Cima"
-
-#: backends/platform/symbian/src/SymbianActions.cpp:39
-#: backends/platform/wince/CEActionsSmartphone.cpp:40
-msgid "Down"
-msgstr "Baixo"
-
-#: backends/platform/symbian/src/SymbianActions.cpp:40
-#: backends/platform/wince/CEActionsSmartphone.cpp:41
-msgid "Left"
-msgstr "Esquerda"
-
-#: backends/platform/symbian/src/SymbianActions.cpp:41
-#: backends/platform/wince/CEActionsSmartphone.cpp:42
-msgid "Right"
-msgstr "Direita"
-
-#: backends/platform/symbian/src/SymbianActions.cpp:46
-#: backends/platform/wince/CEActionsSmartphone.cpp:47
-msgid "Zone"
-msgstr "Zona"
-
-#: backends/platform/symbian/src/SymbianActions.cpp:47
-#: backends/platform/wince/CEActionsPocket.cpp:54
-#: backends/platform/wince/CEActionsSmartphone.cpp:48
-msgid "Multi Function"
-msgstr "Multi-função"
-
-#: backends/platform/symbian/src/SymbianActions.cpp:48
-msgid "Swap character"
-msgstr "Trocador de caracteres"
-
-#: backends/platform/symbian/src/SymbianActions.cpp:49
-msgid "Skip text"
-msgstr "Pular texto"
-
-#: backends/platform/symbian/src/SymbianActions.cpp:51
-msgid "Fast mode"
-msgstr "Modo rápido"
-
-#: backends/platform/symbian/src/SymbianActions.cpp:53
-msgid "Debugger"
-msgstr "Depurador"
-
-#: backends/platform/symbian/src/SymbianActions.cpp:54
-msgid "Global menu"
-msgstr "Menu global"
-
-#: backends/platform/symbian/src/SymbianActions.cpp:55
-msgid "Virtual keyboard"
-msgstr "Teclado virtual"
-
-#: backends/platform/symbian/src/SymbianActions.cpp:56
-msgid "Key mapper"
-msgstr "Mapeador de Teclas"
-
-#: backends/events/symbiansdl/symbiansdl-events.cpp:184
-msgid "Do you want to quit ?"
-msgstr "Você deseja sair ?"
-
-#: backends/platform/wii/options.cpp:51
-msgid "Video"
-msgstr "Vídeo"
-
-#: backends/platform/wii/options.cpp:54
-msgid "Current video mode:"
-msgstr "Modo de vídeo atual:"
-
-#: backends/platform/wii/options.cpp:56
-msgid "Double-strike"
-msgstr "Ataque-duplo"
-
-#: backends/platform/wii/options.cpp:60
-msgid "Horizontal underscan:"
-msgstr "Sub-escaneamento horizontal:"
-
-#: backends/platform/wii/options.cpp:66
-msgid "Vertical underscan:"
-msgstr "Sub-escaneamento vertical:"
-
-#: backends/platform/wii/options.cpp:71
-msgid "Input"
-msgstr "Entrada"
-
-#: backends/platform/wii/options.cpp:74
-msgid "GC Pad sensitivity:"
-msgstr "Sensibilidade do CG Pad:"
-
-#: backends/platform/wii/options.cpp:80
-msgid "GC Pad acceleration:"
-msgstr "Aceleração do CG Pad:"
-
-#: backends/platform/wii/options.cpp:86
-msgid "DVD"
-msgstr "DVD"
-
-#: backends/platform/wii/options.cpp:89 backends/platform/wii/options.cpp:101
-msgid "Status:"
-msgstr "Status:"
-
-#: backends/platform/wii/options.cpp:90 backends/platform/wii/options.cpp:102
-msgid "Unknown"
-msgstr "Desconhecido"
-
-#: backends/platform/wii/options.cpp:93
-msgid "Mount DVD"
-msgstr "Montar DVD"
-
-#: backends/platform/wii/options.cpp:94
-msgid "Unmount DVD"
-msgstr "Desmontar DVD"
-
-#: backends/platform/wii/options.cpp:98
-msgid "SMB"
-msgstr "SMB"
-
-#: backends/platform/wii/options.cpp:106
-msgid "Server:"
-msgstr "Servidor:"
-
-#: backends/platform/wii/options.cpp:110
-msgid "Share:"
-msgstr "Compartilhamento:"
-
-#: backends/platform/wii/options.cpp:114
-msgid "Username:"
-msgstr "Nome de usuário:"
-
-#: backends/platform/wii/options.cpp:118
-msgid "Password:"
-msgstr "Senha:"
-
-#: backends/platform/wii/options.cpp:121
-msgid "Init network"
-msgstr "Iniciar rede"
-
-#: backends/platform/wii/options.cpp:123
-msgid "Mount SMB"
-msgstr "Montar SMB"
-
-#: backends/platform/wii/options.cpp:124
-msgid "Unmount SMB"
-msgstr "Desmontar SMB"
-
-#: backends/platform/wii/options.cpp:143
-msgid "DVD Mounted successfully"
-msgstr "DVD montado com sucesso"
-
-#: backends/platform/wii/options.cpp:146
-msgid "Error while mounting the DVD"
-msgstr "Erro ao montar o DVD"
-
-#: backends/platform/wii/options.cpp:148
-msgid "DVD not mounted"
-msgstr "DVD não montado"
-
-#: backends/platform/wii/options.cpp:161
-msgid "Network up, share mounted"
-msgstr "Conexão ativa, compartilhamento ativado"
-
-#: backends/platform/wii/options.cpp:163
-msgid "Network up"
-msgstr "Conexão ativa"
-
-#: backends/platform/wii/options.cpp:166
-msgid ", error while mounting the share"
-msgstr ", erro ao montar o compartilhamento"
-
-#: backends/platform/wii/options.cpp:168
-msgid ", share not mounted"
-msgstr ", compartilhamento não montado"
-
-#: backends/platform/wii/options.cpp:174
-msgid "Network down"
-msgstr "Conexão caiu"
-
-#: backends/platform/wii/options.cpp:178
-msgid "Initializing network"
-msgstr "Inicialização de rede"
-
-#: backends/platform/wii/options.cpp:182
-msgid "Timeout while initializing network"
-msgstr "Tempo limite para iniciar a conexão de rede"
-
-#: backends/platform/wii/options.cpp:186
-#, c-format
-msgid "Network not initialized (%d)"
-msgstr "Rede não inicializada (%d)"
-
-#: backends/platform/wince/CEActionsPocket.cpp:46
-msgid "Hide Toolbar"
-msgstr "Ocultar a barra de ferramentas"
-
-#: backends/platform/wince/CEActionsPocket.cpp:47
-msgid "Show Keyboard"
-msgstr "Mostrar Teclado"
-
-#: backends/platform/wince/CEActionsPocket.cpp:48
-msgid "Sound on/off"
-msgstr "Som on/off"
-
-#: backends/platform/wince/CEActionsPocket.cpp:49
-msgid "Right click"
-msgstr "Clique com o botão direito"
-
-#: backends/platform/wince/CEActionsPocket.cpp:50
-msgid "Show/Hide Cursor"
-msgstr "Mostrar/Ocultar seu cursor"
-
-#: backends/platform/wince/CEActionsPocket.cpp:51
-msgid "Free look"
-msgstr "Olhar livre"
-
-#: backends/platform/wince/CEActionsPocket.cpp:52
-msgid "Zoom up"
-msgstr "Zoom para cima"
-
-#: backends/platform/wince/CEActionsPocket.cpp:53
-msgid "Zoom down"
-msgstr "Zoom para baixo"
-
-#: backends/platform/wince/CEActionsPocket.cpp:55
-#: backends/platform/wince/CEActionsSmartphone.cpp:49
-msgid "Bind Keys"
-msgstr "Botão de ligadura"
-
-#: backends/platform/wince/CEActionsPocket.cpp:56
-msgid "Cursor Up"
-msgstr "Cursor para cima"
-
-#: backends/platform/wince/CEActionsPocket.cpp:57
-msgid "Cursor Down"
-msgstr "Cursor para baixo"
-
-#: backends/platform/wince/CEActionsPocket.cpp:58
-msgid "Cursor Left"
-msgstr "Cursor para a esquerda"
-
-#: backends/platform/wince/CEActionsPocket.cpp:59
-msgid "Cursor Right"
-msgstr "Cursor para a direita"
-
-#: 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:326
-#: backends/platform/wince/CEActionsSmartphone.cpp:287
-msgid " Are you sure you want to quit ? "
-msgstr " Tem certeza de que deseja sair? "
-
-#: backends/platform/wince/CEActionsSmartphone.cpp:50
-msgid "Keyboard"
-msgstr "Teclado"
-
-#: backends/platform/wince/CEActionsSmartphone.cpp:51
-msgid "Rotate"
-msgstr "Rotacionar"
-
-#: backends/platform/wince/CELauncherDialog.cpp:56
-msgid "Using SDL driver "
-msgstr "Usando driver SDL"
-
-#: backends/platform/wince/CELauncherDialog.cpp:60
-msgid "Display "
-msgstr "Tela"
-
-#: 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:515
-msgid "Map right click action"
-msgstr "Mapear ação \"Clique da Direita\""
-
-#: 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:528
-msgid "Map hide toolbar action"
-msgstr "Mapear \"Ocultar barra de ferramentas\""
-
-#: 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:541
-msgid "Map Zoom Up action (optional)"
-msgstr "Mapear Zoom para Cima (opcional)"
-
-#: 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:552
-msgid ""
-"Don't forget to map a key to 'Hide Toolbar' action to see the whole inventory"
-msgstr ""
-"Não se esqueça de mapear uma tecla para \"Ocultar a barra de ferramentas\" "
-"para ver todo o seu inventário"
-
-#: backends/events/default/default-events.cpp:193
-msgid "Do you really want to return to the Launcher?"
-msgstr "Você realmente deseja voltar para o menu principal?"
-
-#: backends/events/default/default-events.cpp:193
-msgid "Launcher"
-msgstr "Menu principal"
-
-#: backends/events/default/default-events.cpp:215
-msgid "Do you really want to quit?"
-msgstr "Você realmente deseja sair?"
-
-#: backends/events/gph/gph-events.cpp:386
-#: backends/events/gph/gph-events.cpp:429
-#: backends/events/openpandora/op-events.cpp:168
-msgid "Touchscreen 'Tap Mode' - Left Click"
-msgstr "Touchscreen 'Modo Toque' - Clique Esquerdo"
-
-#: backends/events/gph/gph-events.cpp:388
-#: backends/events/gph/gph-events.cpp:431
-#: backends/events/openpandora/op-events.cpp:170
-msgid "Touchscreen 'Tap Mode' - Right Click"
-msgstr "Touchscreen 'Modo Toque' - Clique Direito"
-
-#: backends/events/gph/gph-events.cpp:390
-#: backends/events/gph/gph-events.cpp:433
-#: backends/events/openpandora/op-events.cpp:172
-msgid "Touchscreen 'Tap Mode' - Hover (No Click)"
-msgstr "Touchscreen 'Modo Toque' - Acima (Sem Clicar)"
-
-#: backends/events/gph/gph-events.cpp:410
-msgid "Maximum Volume"
-msgstr "Volume máximo"
-
-#: backends/events/gph/gph-events.cpp:412
-msgid "Increasing Volume"
-msgstr "Aumentando Volume"
-
-#: backends/events/gph/gph-events.cpp:418
-msgid "Minimal Volume"
-msgstr "Volume mínimo"
+#~ msgctxt "lowres"
+#~ msgid "Mass Add..."
+#~ msgstr "Multi-Adição..."
-#: backends/events/gph/gph-events.cpp:420
-msgid "Decreasing Volume"
-msgstr "Diminuindo Volume"
+#~ msgid "Mass Add..."
+#~ msgstr "Multi-Adição..."
-#: backends/events/openpandora/op-events.cpp:174
-#, fuzzy
-msgid "Touchscreen 'Tap Mode' - Hover (DPad Clicks)"
-msgstr "Touchscreen 'Modo Toque' - Acima (Sem Clicar)"
+#~ msgid ""
+#~ "Turns off General MIDI mapping for games with Roland MT-32 soundtrack"
+#~ msgstr ""
+#~ "Desliga o mapeamento General MIDI para jogos com trilha sonora Roland "
+#~ "MT-32"
-#: backends/updates/macosx/macosx-updates.mm:67
-msgid "Check for Updates..."
-msgstr "Procurar por Atualizações..."
+#~ msgid "Standard (16bpp)"
+#~ msgstr "Padrão (16bpp)"
-#: backends/platform/bada/form.cpp:269
-msgid "Right Click Once"
-msgstr "Clique com o botão direito apenas uma vez"
+#~ msgid "MPEG2 cutscenes are no longer supported"
+#~ msgstr "Vídeos em MPEG2 não são mais suportados"
-#: backends/platform/bada/form.cpp:277
-msgid "Move Only"
-msgstr "Apenas mover"
+#~ msgid "OpenGL Normal"
+#~ msgstr "OpenGL Normal"
-#: backends/platform/bada/form.cpp:291
-msgid "Escape Key"
-msgstr "Tecla Escape"
+#~ msgid "OpenGL Conserve"
+#~ msgstr "OpenGL Conserve"
-#: backends/platform/bada/form.cpp:296
-msgid "Game Menu"
-msgstr "Menu do jogo"
+#~ msgid "OpenGL Original"
+#~ msgstr "OpenGL Original"
-#: backends/platform/bada/form.cpp:301
-msgid "Show Keypad"
-msgstr "Mostrar teclado"
+#~ msgid "Current display mode"
+#~ msgstr "Modo de vídeo atual"
-#: backends/platform/bada/form.cpp:309
-msgid "Control Mouse"
-msgstr "Controle do Mouse"
+#~ msgid "Current scale"
+#~ msgstr "Escala atual"
-#: backends/events/maemosdl/maemosdl-events.cpp:192
-msgid "Clicking Enabled"
-msgstr "Clicando Habilitado"
+#~ msgid "Active filter mode: Linear"
+#~ msgstr "Filtro de imagem ativo: Linear"
-#: backends/events/maemosdl/maemosdl-events.cpp:192
-msgid "Clicking Disabled"
-msgstr "Clicando Desabilitado"
+#~ msgid "Active filter mode: Nearest"
+#~ msgstr "Filtro de imagem ativo: Nearest"
#~ msgid "Enable Roland GS Mode"
#~ msgstr "Ligar modo Roland GS"
diff --git a/po/ru_RU.po b/po/ru_RU.po
index 8e52f3f342..4bade1e5e8 100644
--- a/po/ru_RU.po
+++ b/po/ru_RU.po
@@ -1,5 +1,5 @@
# Russian translation for ScummVM.
-# Copyright (C) 2010-2013 ScummVM Team
+# Copyright (C) 2010-2014 ScummVM Team
# This file is distributed under the same license as the ScummVM package.
# Eugene Sandulenko <sev@scummvm.org>, 2010`
#
@@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: ScummVM 1.3.0svn\n"
"Report-Msgid-Bugs-To: scummvm-devel@lists.sf.net\n"
-"POT-Creation-Date: 2013-04-24 13:35+0100\n"
+"POT-Creation-Date: 2014-06-07 23:06+0100\n"
"PO-Revision-Date: 2013-05-08 22:24+0300\n"
"Last-Translator: Eugene Sandulenko <sev@scummvm.org>\n"
"Language-Team: Russian\n"
@@ -19,77 +19,77 @@ msgstr ""
"%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n"
"X-Generator: Poedit 1.5.5\n"
-#: gui/about.cpp:93
+#: gui/about.cpp:94
#, c-format
msgid "(built on %s)"
msgstr "(áÞÑàÐÝ %s)"
-#: gui/about.cpp:100
+#: gui/about.cpp:101
msgid "Features compiled in:"
msgstr "²ÚÛîçñÝÝëÕ Ò ÑØÛÔ ÞßæØØ:"
-#: gui/about.cpp:109
+#: gui/about.cpp:110
msgid "Available engines:"
msgstr "´ÞáâãßÝëÕ ÔÒØÖÚØ:"
-#: gui/browser.cpp:67
+#: gui/browser.cpp:68
msgid "Show hidden files"
msgstr "¿ÞÚÐ×Ðâì áÚàëâëÕ äÐÙÛë"
-#: gui/browser.cpp:67
+#: gui/browser.cpp:68
msgid "Show files marked with the hidden attribute"
msgstr "¿ÞÚÐ×Ðâì äÐÙÛë á ÐâàØÑãâÞÜ \"áÚàëâì\""
-#: gui/browser.cpp:71
+#: gui/browser.cpp:72
msgid "Go up"
msgstr "²ÒÕàå"
-#: gui/browser.cpp:71 gui/browser.cpp:73
+#: gui/browser.cpp:72 gui/browser.cpp:74
msgid "Go to previous directory level"
msgstr "¿ÕàÕÙâØ ÝÐ ÔØàÕÚâÞàØî ãàÞÒÝÕÜ ÒëèÕ"
-#: gui/browser.cpp:73
+#: gui/browser.cpp:74
msgctxt "lowres"
msgid "Go up"
msgstr "²ÒÕàå"
-#: gui/browser.cpp:74 gui/chooser.cpp:45 gui/KeysDialog.cpp:43
-#: gui/launcher.cpp:345 gui/massadd.cpp:94 gui/options.cpp:1238
-#: gui/saveload-dialog.cpp:215 gui/saveload-dialog.cpp:275
-#: gui/saveload-dialog.cpp:545 gui/saveload-dialog.cpp:919
-#: gui/themebrowser.cpp:54 gui/fluidsynth-dialog.cpp:151
-#: engines/engine.cpp:447 engines/drascula/saveload.cpp:51
-#: engines/scumm/dialogs.cpp:190 engines/sword1/control.cpp:865
-#: engines/parallaction/saveload.cpp:274 backends/platform/wii/options.cpp:48
-#: backends/events/default/default-events.cpp:193
-#: backends/events/default/default-events.cpp:215
+#: gui/browser.cpp:75 gui/chooser.cpp:46 gui/KeysDialog.cpp:43
+#: gui/launcher.cpp:351 gui/massadd.cpp:95 gui/options.cpp:1239
+#: gui/saveload-dialog.cpp:216 gui/saveload-dialog.cpp:276
+#: gui/saveload-dialog.cpp:547 gui/saveload-dialog.cpp:922
+#: gui/themebrowser.cpp:55 gui/fluidsynth-dialog.cpp:152
+#: engines/engine.cpp:452 backends/platform/wii/options.cpp:48
+#: backends/events/default/default-events.cpp:196
+#: backends/events/default/default-events.cpp:218
+#: engines/drascula/saveload.cpp:49 engines/parallaction/saveload.cpp:274
+#: engines/scumm/dialogs.cpp:191 engines/sword1/control.cpp:865
msgid "Cancel"
msgstr "¾âÜÕÝÐ"
-#: gui/browser.cpp:75 gui/chooser.cpp:46 gui/themebrowser.cpp:55
+#: gui/browser.cpp:76 gui/chooser.cpp:47 gui/themebrowser.cpp:56
msgid "Choose"
msgstr "²ëÑàÐâì"
-#: gui/gui-manager.cpp:115 engines/scumm/help.cpp:125
-#: engines/scumm/help.cpp:140 engines/scumm/help.cpp:165
-#: engines/scumm/help.cpp:191 engines/scumm/help.cpp:209
-#: backends/keymapper/remap-dialog.cpp:52
+#: gui/gui-manager.cpp:117 backends/keymapper/remap-dialog.cpp:53
+#: engines/scumm/help.cpp:125 engines/scumm/help.cpp:140
+#: engines/scumm/help.cpp:165 engines/scumm/help.cpp:191
+#: engines/scumm/help.cpp:209
msgid "Close"
msgstr "·ÐÚàëâì"
-#: gui/gui-manager.cpp:118
+#: gui/gui-manager.cpp:120
msgid "Mouse click"
msgstr "ºÛØÚ Üëèìî"
-#: gui/gui-manager.cpp:122 base/main.cpp:301
+#: gui/gui-manager.cpp:124 base/main.cpp:319
msgid "Display keyboard"
msgstr "¿ÞÚÐ×Ðâì ÚÛÐÒØÐâãàã"
-#: gui/gui-manager.cpp:126 base/main.cpp:305
+#: gui/gui-manager.cpp:128 base/main.cpp:323
msgid "Remap keys"
msgstr "¿ÕàÕÝÐ×ÝÐçØâì ÚÛÐÒØèØ"
-#: gui/gui-manager.cpp:129 base/main.cpp:308
+#: gui/gui-manager.cpp:131 base/main.cpp:326
msgid "Toggle FullScreen"
msgstr "¿ÕàÕÚÛîçÕÝØÕ ÝÐ ÒÕáì íÚàÐÝ"
@@ -101,21 +101,21 @@ msgstr "²ëÑÕàØâÕ ÔÕÙáâÒØÕ ÔÛï ÝÐ×ÝÐçÕÝØï"
msgid "Map"
msgstr "½Ð×ÝÐçØâì"
-#: gui/KeysDialog.cpp:42 gui/launcher.cpp:346 gui/launcher.cpp:1001
-#: gui/launcher.cpp:1005 gui/massadd.cpp:91 gui/options.cpp:1239
-#: gui/saveload-dialog.cpp:920 gui/fluidsynth-dialog.cpp:152
-#: engines/engine.cpp:366 engines/engine.cpp:377
-#: engines/drascula/saveload.cpp:51 engines/scumm/dialogs.cpp:192
-#: engines/scumm/scumm.cpp:1778 engines/agos/animation.cpp:558
-#: engines/groovie/script.cpp:420 engines/sky/compact.cpp:131
-#: engines/sky/compact.cpp:141 engines/sword1/animation.cpp:519
-#: engines/sword1/animation.cpp:540 engines/sword1/animation.cpp:550
-#: engines/sword1/animation.cpp:557 engines/sword1/control.cpp:865
-#: engines/sword1/logic.cpp:1633 engines/sword2/animation.cpp:419
-#: engines/sword2/animation.cpp:439 engines/sword2/animation.cpp:449
-#: engines/sword2/animation.cpp:458 engines/parallaction/saveload.cpp:274
+#: gui/KeysDialog.cpp:42 gui/launcher.cpp:352 gui/launcher.cpp:1048
+#: gui/launcher.cpp:1052 gui/massadd.cpp:92 gui/options.cpp:1240
+#: gui/saveload-dialog.cpp:923 gui/fluidsynth-dialog.cpp:153
+#: engines/engine.cpp:371 engines/engine.cpp:382
#: backends/platform/wii/options.cpp:47
#: backends/platform/wince/CELauncherDialog.cpp:54
+#: engines/agos/animation.cpp:558 engines/drascula/saveload.cpp:49
+#: engines/groovie/script.cpp:399 engines/parallaction/saveload.cpp:274
+#: engines/scumm/dialogs.cpp:193 engines/scumm/scumm.cpp:1779
+#: engines/sky/compact.cpp:131 engines/sky/compact.cpp:141
+#: engines/sword1/animation.cpp:524 engines/sword1/animation.cpp:545
+#: engines/sword1/animation.cpp:561 engines/sword1/animation.cpp:569
+#: engines/sword1/control.cpp:865 engines/sword1/logic.cpp:1633
+#: engines/sword2/animation.cpp:425 engines/sword2/animation.cpp:445
+#: engines/sword2/animation.cpp:461 engines/sword2/animation.cpp:471
msgid "OK"
msgstr "OK"
@@ -141,15 +141,15 @@ msgstr "¿ÞÖÐÛãÙáâÐ, ÒëÑÕàØâÕ ÔÕÙáâÒØÕ"
msgid "Press the key to associate"
msgstr "½ÐÖÜØâÕ ÚÛÐÒØèã ÔÛï ÝÐ×ÝÐçÕÝØï"
-#: gui/launcher.cpp:187
+#: gui/launcher.cpp:193
msgid "Game"
msgstr "¸ÓàÐ"
-#: gui/launcher.cpp:191
+#: gui/launcher.cpp:197
msgid "ID:"
msgstr "ID:"
-#: gui/launcher.cpp:191 gui/launcher.cpp:193 gui/launcher.cpp:194
+#: gui/launcher.cpp:197 gui/launcher.cpp:199 gui/launcher.cpp:200
msgid ""
"Short game identifier used for referring to savegames and running the game "
"from the command line"
@@ -157,315 +157,316 @@ msgstr ""
"ºÞàÞâÚØÙ ØÔÕÝâØäØÚÐâÞà, ØáßÞÛì×ãÕÜëÙ ÔÛï ØÜñÝ áÞåàÐÝÕÝØÙ ØÓà Ø ÔÛï ×ÐßãáÚÐ "
"Ø× ÚÞÜÐÝÔÝÞÙ áâàÞÚØ"
-#: gui/launcher.cpp:193
+#: gui/launcher.cpp:199
msgctxt "lowres"
msgid "ID:"
msgstr "ID:"
-#: gui/launcher.cpp:198
+#: gui/launcher.cpp:204
msgid "Name:"
msgstr "½Ð×ÒÐÝØÕ:"
-#: gui/launcher.cpp:198 gui/launcher.cpp:200 gui/launcher.cpp:201
+#: gui/launcher.cpp:204 gui/launcher.cpp:206 gui/launcher.cpp:207
msgid "Full title of the game"
msgstr "¿ÞÛÝÞÕ ÝÐ×ÒÐÝØÕ ØÓàë"
-#: gui/launcher.cpp:200
+#: gui/launcher.cpp:206
msgctxt "lowres"
msgid "Name:"
msgstr "½Ð×Ò:"
-#: gui/launcher.cpp:204
+#: gui/launcher.cpp:210
msgid "Language:"
msgstr "Ï×ëÚ:"
-#: gui/launcher.cpp:204 gui/launcher.cpp:205
+#: gui/launcher.cpp:210 gui/launcher.cpp:211
msgid ""
"Language of the game. This will not turn your Spanish game version into "
"English"
msgstr ""
"Ï×ëÚ ØÓàë. ¸×ÜÕÝÕÝØÕ íâÞÙ ÝÐáâàÞÙÚØ ÝÕ ßàÕÒàÐâØâ ØÓàã ÝÐ ÐÝÓÛØÙáÚÞÜ Ò àãááÚãî"
-#: gui/launcher.cpp:206 gui/launcher.cpp:220 gui/options.cpp:86
-#: gui/options.cpp:736 gui/options.cpp:749 gui/options.cpp:1209
-#: audio/null.cpp:40
+#: gui/launcher.cpp:212 gui/launcher.cpp:226 gui/options.cpp:87
+#: gui/options.cpp:737 gui/options.cpp:750 gui/options.cpp:1210
+#: audio/null.cpp:41
msgid "<default>"
msgstr "<ßÞ ãÜÞÛçÐÝØî>"
-#: gui/launcher.cpp:216
+#: gui/launcher.cpp:222
msgid "Platform:"
msgstr "¿ÛÐâäÞàÜÐ:"
-#: gui/launcher.cpp:216 gui/launcher.cpp:218 gui/launcher.cpp:219
+#: gui/launcher.cpp:222 gui/launcher.cpp:224 gui/launcher.cpp:225
msgid "Platform the game was originally designed for"
msgstr "¿ÛÐâäÞàÜÐ, ÔÛï ÚÞâÞàÞÙ ØÓàÐ ÑëÛÐ Ø×ÝÐçÐÛìÝÞ àÐ×àÐÑÞâÐÝÐ"
-#: gui/launcher.cpp:218
+#: gui/launcher.cpp:224
msgctxt "lowres"
msgid "Platform:"
msgstr "¿ÛÐâäÞàÜÐ:"
-#: gui/launcher.cpp:231
+#: gui/launcher.cpp:237
msgid "Engine"
msgstr "´ÒØÖÞÚ"
-#: gui/launcher.cpp:239 gui/options.cpp:1072 gui/options.cpp:1089
+#: gui/launcher.cpp:245 gui/options.cpp:1073 gui/options.cpp:1090
msgid "Graphics"
msgstr "³àÐäØÚÐ"
-#: gui/launcher.cpp:239 gui/options.cpp:1072 gui/options.cpp:1089
+#: gui/launcher.cpp:245 gui/options.cpp:1073 gui/options.cpp:1090
msgid "GFX"
msgstr "³àä"
-#: gui/launcher.cpp:242
+#: gui/launcher.cpp:248
msgid "Override global graphic settings"
msgstr "¿ÕàÕÚàëâì ÓÛÞÑÐÛìÝëÕ ãáâÐÝÞÒÚØ ÓàÐäØÚØ"
-#: gui/launcher.cpp:244
+#: gui/launcher.cpp:250
msgctxt "lowres"
msgid "Override global graphic settings"
msgstr "¿ÕàÕÚàëâì ÓÛÞÑÐÛìÝëÕ ãáâÐÝÞÒÚØ ÓàÐäØÚØ"
-#: gui/launcher.cpp:251 gui/options.cpp:1095
+#: gui/launcher.cpp:257 gui/options.cpp:1096
msgid "Audio"
msgstr "°ãÔØÞ"
-#: gui/launcher.cpp:254
+#: gui/launcher.cpp:260
msgid "Override global audio settings"
msgstr "¿ÕàÕÚàëâì ÓÛÞÑÐÛìÝëÕ ãáâÐÝÞÒÚØ ÐãÔØÞ"
-#: gui/launcher.cpp:256
+#: gui/launcher.cpp:262
msgctxt "lowres"
msgid "Override global audio settings"
msgstr "¿ÕàÕÚàëâì ÓÛÞÑÐÛìÝëÕ ãáâÐÝÞÒÚØ ÐãÔØÞ"
-#: gui/launcher.cpp:265 gui/options.cpp:1100
+#: gui/launcher.cpp:271 gui/options.cpp:1101
msgid "Volume"
msgstr "³àÞÜÚÞáâì"
-#: gui/launcher.cpp:267 gui/options.cpp:1102
+#: gui/launcher.cpp:273 gui/options.cpp:1103
msgctxt "lowres"
msgid "Volume"
msgstr "³àÞÜÚ"
-#: gui/launcher.cpp:270
+#: gui/launcher.cpp:276
msgid "Override global volume settings"
msgstr "¿ÕàÕÚàëâì ÓÛÞÑÐÛìÝëÕ ãáâÐÝÞÒÚØ ÓàÞÜÚÞáâØ"
-#: gui/launcher.cpp:272
+#: gui/launcher.cpp:278
msgctxt "lowres"
msgid "Override global volume settings"
msgstr "¿ÕàÕÚàëâì ÓÛÞÑÐÛìÝëÕ ãáâÐÝÞÒÚØ ÓàÞÜÚÞáâØ"
-#: gui/launcher.cpp:280 gui/options.cpp:1110
+#: gui/launcher.cpp:286 gui/options.cpp:1111
msgid "MIDI"
msgstr "MIDI"
-#: gui/launcher.cpp:283
+#: gui/launcher.cpp:289
msgid "Override global MIDI settings"
msgstr "¿ÕàÕÚàëâì ÓÛÞÑÐÛìÝëÕ ãáâÐÝÞÒÚØ MIDI"
-#: gui/launcher.cpp:285
+#: gui/launcher.cpp:291
msgctxt "lowres"
msgid "Override global MIDI settings"
msgstr "¿ÕàÕÚàëâì ÓÛÞÑÐÛìÝëÕ ãáâÐÝÞÒÚØ MIDI"
-#: gui/launcher.cpp:294 gui/options.cpp:1116
+#: gui/launcher.cpp:300 gui/options.cpp:1117
msgid "MT-32"
msgstr "MT-32"
-#: gui/launcher.cpp:297
+#: gui/launcher.cpp:303
msgid "Override global MT-32 settings"
msgstr "¿ÕàÕÚàëâì ÓÛÞÑÐÛìÝëÕ ãáâÐÝÞÒÚØ MT-32"
-#: gui/launcher.cpp:299
+#: gui/launcher.cpp:305
msgctxt "lowres"
msgid "Override global MT-32 settings"
msgstr "¿ÕàÕÚàëâì ÓÛÞÑÐÛìÝëÕ ãáâÐÝÞÒÚØ MT-32"
-#: gui/launcher.cpp:308 gui/options.cpp:1123
+#: gui/launcher.cpp:314 gui/options.cpp:1124
msgid "Paths"
msgstr "¿ãâØ"
-#: gui/launcher.cpp:310 gui/options.cpp:1125
+#: gui/launcher.cpp:316 gui/options.cpp:1126
msgctxt "lowres"
msgid "Paths"
msgstr "¿ãâØ"
-#: gui/launcher.cpp:317
+#: gui/launcher.cpp:323
msgid "Game Path:"
msgstr "¿ãâì Ú ØÓàÕ:"
-#: gui/launcher.cpp:319
+#: gui/launcher.cpp:325
msgctxt "lowres"
msgid "Game Path:"
msgstr "³ÔÕ ØÓàÐ:"
-#: gui/launcher.cpp:324 gui/options.cpp:1149
+#: gui/launcher.cpp:330 gui/options.cpp:1150
msgid "Extra Path:"
msgstr "´Þß. ßãâì:"
-#: gui/launcher.cpp:324 gui/launcher.cpp:326 gui/launcher.cpp:327
+#: gui/launcher.cpp:330 gui/launcher.cpp:332 gui/launcher.cpp:333
msgid "Specifies path to additional data used the game"
msgstr "ÃÚÐ×ëÒÐÕâ ßãâì Ú ÔÞßÞÛÝØâÕÛìÝëÜ äÐÙÛÐÜ ÔÐÝÝëå ÔÛï ØÓàë"
-#: gui/launcher.cpp:326 gui/options.cpp:1151
+#: gui/launcher.cpp:332 gui/options.cpp:1152
msgctxt "lowres"
msgid "Extra Path:"
msgstr "´Þß. ßãâì:"
-#: gui/launcher.cpp:333 gui/options.cpp:1133
+#: gui/launcher.cpp:339 gui/options.cpp:1134
msgid "Save Path:"
msgstr "ÁÞåàÐÝÕÝØï ØÓà:"
-#: gui/launcher.cpp:333 gui/launcher.cpp:335 gui/launcher.cpp:336
-#: gui/options.cpp:1133 gui/options.cpp:1135 gui/options.cpp:1136
+#: gui/launcher.cpp:339 gui/launcher.cpp:341 gui/launcher.cpp:342
+#: gui/options.cpp:1134 gui/options.cpp:1136 gui/options.cpp:1137
msgid "Specifies where your savegames are put"
msgstr "ÃÚÐ×ëÒÐÕâ ßãâì Ú áÞåàÐÝÕÝØïÜ ØÓàë"
-#: gui/launcher.cpp:335 gui/options.cpp:1135
+#: gui/launcher.cpp:341 gui/options.cpp:1136
msgctxt "lowres"
msgid "Save Path:"
msgstr "¿ãâì áÞåà:"
-#: gui/launcher.cpp:354 gui/launcher.cpp:453 gui/launcher.cpp:511
-#: gui/launcher.cpp:565 gui/options.cpp:1144 gui/options.cpp:1152
-#: gui/options.cpp:1161 gui/options.cpp:1276 gui/options.cpp:1282
-#: gui/options.cpp:1290 gui/options.cpp:1320 gui/options.cpp:1326
-#: gui/options.cpp:1333 gui/options.cpp:1426 gui/options.cpp:1429
-#: gui/options.cpp:1441
+#: gui/launcher.cpp:360 gui/launcher.cpp:459 gui/launcher.cpp:517
+#: gui/launcher.cpp:571 gui/options.cpp:1145 gui/options.cpp:1153
+#: gui/options.cpp:1162 gui/options.cpp:1277 gui/options.cpp:1283
+#: gui/options.cpp:1291 gui/options.cpp:1321 gui/options.cpp:1327
+#: gui/options.cpp:1334 gui/options.cpp:1427 gui/options.cpp:1430
+#: gui/options.cpp:1442
msgctxt "path"
msgid "None"
msgstr "½Õ ×ÐÔÐÝ"
-#: gui/launcher.cpp:359 gui/launcher.cpp:459 gui/launcher.cpp:569
-#: gui/options.cpp:1270 gui/options.cpp:1314 gui/options.cpp:1432
+#: gui/launcher.cpp:365 gui/launcher.cpp:465 gui/launcher.cpp:575
+#: gui/options.cpp:1271 gui/options.cpp:1315 gui/options.cpp:1433
#: backends/platform/wii/options.cpp:56
msgid "Default"
msgstr "¿Þ ãÜÞÛçÐÝØî"
-#: gui/launcher.cpp:504 gui/options.cpp:1435
+#: gui/launcher.cpp:510 gui/options.cpp:1436
msgid "Select SoundFont"
msgstr "²ëÑÕàØâÕ SoundFont"
-#: gui/launcher.cpp:523 gui/launcher.cpp:677
+#: gui/launcher.cpp:529 gui/launcher.cpp:682
msgid "Select directory with game data"
msgstr "²ëÑÕàØâÕ ÔØàÕÚâÞàØî á äÐÙÛÐÜØ ØÓàë"
-#: gui/launcher.cpp:541
+#: gui/launcher.cpp:547
msgid "Select additional game directory"
msgstr "²ëÑÕàØâÕ ÔÞßÞÛÝØâÕÛìÝãî ÔØàÕÚâÞàØî ØÓàë"
-#: gui/launcher.cpp:553
+#: gui/launcher.cpp:559
msgid "Select directory for saved games"
msgstr "²ëÑÕàØâÕ ÔØàÕÚâÞàØî ÔÛï áÞåàÐÝÕÝØÙ"
-#: gui/launcher.cpp:580
+#: gui/launcher.cpp:586
msgid "This game ID is already taken. Please choose another one."
msgstr "ÍâÞâ ID ØÓàë ãÖÕ ØáßÞÛì×ãÕâáï. ¿ÞÖÐÛãÙáâÐ, ÒëÑÕàØâÕ ÔàãÓÞÙ."
-#: gui/launcher.cpp:621 engines/dialogs.cpp:110
+#: gui/launcher.cpp:626 engines/dialogs.cpp:111
msgid "~Q~uit"
msgstr "~²~ëåÞÔ"
-#: gui/launcher.cpp:621 backends/platform/sdl/macosx/appmenu_osx.mm:95
+#: gui/launcher.cpp:626 backends/platform/sdl/macosx/appmenu_osx.mm:95
msgid "Quit ScummVM"
msgstr "·ÐÒÕàèØâì ScummVM"
-#: gui/launcher.cpp:622
+#: gui/launcher.cpp:627
msgid "A~b~out..."
msgstr "¾ ß~à~ÞÓàÐÜÜÕ..."
-#: gui/launcher.cpp:622 backends/platform/sdl/macosx/appmenu_osx.mm:69
+#: gui/launcher.cpp:627 backends/platform/sdl/macosx/appmenu_osx.mm:69
msgid "About ScummVM"
msgstr "¾ ßàÞÓàÐÜÜÕ ScummVM"
-#: gui/launcher.cpp:623
+#: gui/launcher.cpp:628
msgid "~O~ptions..."
msgstr "~½~ÐáâàÞÙÚØ..."
-#: gui/launcher.cpp:623
+#: gui/launcher.cpp:628
msgid "Change global ScummVM options"
msgstr "¸×ÜÕÝØâì ÓÛÞÑÐÛìÝëÕ ÝÐáâàÞÙÚØ ScummVM"
-#: gui/launcher.cpp:625
+#: gui/launcher.cpp:630
msgid "~S~tart"
msgstr "¿~ã~áÚ"
-#: gui/launcher.cpp:625
+#: gui/launcher.cpp:630
msgid "Start selected game"
msgstr "·ÐßãáâØâì ÒëÑàÐÝÝãî ØÓàã"
-#: gui/launcher.cpp:628
+#: gui/launcher.cpp:633
msgid "~L~oad..."
msgstr "~·~ÐÓàãרâì..."
-#: gui/launcher.cpp:628
+#: gui/launcher.cpp:633
msgid "Load savegame for selected game"
msgstr "·ÐÓàãרâì áÞåàÝÕÝØÕ ÔÛï ÒëÑàÐÝÝÞÙ ØÓàë"
-#: gui/launcher.cpp:633 gui/launcher.cpp:1120
+#: gui/launcher.cpp:638
msgid "~A~dd Game..."
msgstr "~´~ÞÑÐÒØâì ØÓàã..."
-#: gui/launcher.cpp:633 gui/launcher.cpp:640
+#: gui/launcher.cpp:638 gui/launcher.cpp:645
msgid "Hold Shift for Mass Add"
msgstr "ÃÔÕàÖØÒÐÙâÕ ÚÛÐÒØèã Shift ÔÛï âÞÓÞ, çâÞÑë ÔÞÑÐÒØâì ÝÕáÚÞÛìÚÞ ØÓà"
-#: gui/launcher.cpp:635
+#: gui/launcher.cpp:640
msgid "~E~dit Game..."
msgstr "½~Ð~áâàÞÙÚØ ØÓàë..."
-#: gui/launcher.cpp:635 gui/launcher.cpp:642
+#: gui/launcher.cpp:640 gui/launcher.cpp:647
msgid "Change game options"
msgstr "¸×ÜÕÝØâì ÝÐáâàÞÙÚØ ØÓàë"
-#: gui/launcher.cpp:637
+#: gui/launcher.cpp:642
msgid "~R~emove Game"
msgstr "~Ã~ÔÐÛØâì ØÓàã"
-#: gui/launcher.cpp:637 gui/launcher.cpp:644
+#: gui/launcher.cpp:642 gui/launcher.cpp:649
msgid "Remove game from the list. The game data files stay intact"
msgstr "ÃÔÐÛØâì ØÓàã Ø× áߨáÚÐ. ½Õ ãÔÐÛïÕâ ØÓàã á ÖÕáâÚÞÓÞ ÔØáÚÐ"
-#: gui/launcher.cpp:640 gui/launcher.cpp:1120
+#: gui/launcher.cpp:645
msgctxt "lowres"
msgid "~A~dd Game..."
msgstr "~´~ÞÑ. ØÓàã..."
-#: gui/launcher.cpp:642
+#: gui/launcher.cpp:647
msgctxt "lowres"
msgid "~E~dit Game..."
msgstr "½~Ð~á. ØÓàë..."
-#: gui/launcher.cpp:644
+#: gui/launcher.cpp:649
msgctxt "lowres"
msgid "~R~emove Game"
msgstr "~Ã~ÔÐÛØâì ØÓàã"
-#: gui/launcher.cpp:652
+#: gui/launcher.cpp:657
msgid "Search in game list"
msgstr "¿ÞØáÚ Ò áߨáÚÕ ØÓà"
-#: gui/launcher.cpp:656 gui/launcher.cpp:1167
+#: gui/launcher.cpp:661 gui/launcher.cpp:1222
msgid "Search:"
msgstr "¿ÞØáÚ:"
-#: gui/launcher.cpp:680 engines/dialogs.cpp:114 engines/mohawk/myst.cpp:245
-#: engines/mohawk/riven.cpp:716 engines/cruise/menu.cpp:214
-#: engines/pegasus/pegasus.cpp:349
+#: gui/launcher.cpp:685 engines/dialogs.cpp:115 engines/cruise/menu.cpp:214
+#: engines/mohawk/myst.cpp:245 engines/mohawk/riven.cpp:718
+#: engines/pegasus/pegasus.cpp:353
msgid "Load game:"
msgstr "·ÐÓàãרâì ØÓàã:"
-#: gui/launcher.cpp:680 engines/dialogs.cpp:114 engines/scumm/dialogs.cpp:188
-#: engines/mohawk/myst.cpp:245 engines/mohawk/riven.cpp:716
-#: engines/cruise/menu.cpp:214 engines/pegasus/pegasus.cpp:349
+#: gui/launcher.cpp:685 engines/dialogs.cpp:115
#: backends/platform/wince/CEActionsPocket.cpp:267
#: backends/platform/wince/CEActionsSmartphone.cpp:231
+#: engines/cruise/menu.cpp:214 engines/mohawk/myst.cpp:245
+#: engines/mohawk/riven.cpp:718 engines/pegasus/pegasus.cpp:353
+#: engines/scumm/dialogs.cpp:189
msgid "Load"
msgstr "·ÐÓàãרâì"
-#: gui/launcher.cpp:788
+#: gui/launcher.cpp:792
msgid ""
"Do you really want to run the mass game detector? This could potentially add "
"a huge number of games."
@@ -473,7 +474,8 @@ msgstr ""
"²ë ÔÕÙáâÒØâÕÛìÝÞ åÞâØâÕ ×ÐßãáâØâì ÔÕâÕÚâÞà ÒáÕå ØÓà? ÍâÞ ßÞâÕÝæØÐÛìÝÞ ÜÞÖÕâ "
"ÔÞÑÐÒØâì ÑÞÛìèÞÕ ÚÞÛØçÕáâÒÞ ØÓà."
-#: gui/launcher.cpp:789 gui/launcher.cpp:937 gui/fluidsynth-dialog.cpp:216
+#: gui/launcher.cpp:793 gui/launcher.cpp:941 gui/launcher.cpp:1000
+#: gui/fluidsynth-dialog.cpp:217
#: backends/events/symbiansdl/symbiansdl-events.cpp:184
#: backends/platform/wince/CEActionsPocket.cpp:326
#: backends/platform/wince/CEActionsSmartphone.cpp:287
@@ -481,7 +483,8 @@ msgstr ""
msgid "Yes"
msgstr "´Ð"
-#: gui/launcher.cpp:789 gui/launcher.cpp:937 gui/fluidsynth-dialog.cpp:216
+#: gui/launcher.cpp:793 gui/launcher.cpp:941 gui/launcher.cpp:1000
+#: gui/fluidsynth-dialog.cpp:217
#: backends/events/symbiansdl/symbiansdl-events.cpp:184
#: backends/platform/wince/CEActionsPocket.cpp:326
#: backends/platform/wince/CEActionsSmartphone.cpp:287
@@ -489,190 +492,185 @@ msgstr "´Ð"
msgid "No"
msgstr "½Õâ"
-#: gui/launcher.cpp:837
+#: gui/launcher.cpp:841
msgid "ScummVM couldn't open the specified directory!"
msgstr "ScummVM ÝÕ ÜÞÖÕâ ÞâÚàëâì ãÚÐ×ÐÝÝãî ÔØàÕÚâÞàØî!"
-#: gui/launcher.cpp:849
+#: gui/launcher.cpp:853
msgid "ScummVM could not find any game in the specified directory!"
msgstr "ScummVM ÝÕ ÜÞÖÕâ ÝÐÙâØ ØÓàã Ò ãÚÐ×ÐÝÝÞÙ ÔØàÕÚâÞàØØ!"
-#: gui/launcher.cpp:863
+#: gui/launcher.cpp:867
msgid "Pick the game:"
msgstr "²ëÑÕàØâÕ ØÓàã:"
-#: gui/launcher.cpp:937
+#: gui/launcher.cpp:941
msgid "Do you really want to remove this game configuration?"
msgstr "²ë ÔÕÙáâÒØâÕÛìÝÞ åÞâØâÕ ãÔÐÛØâì ÝÐáâàÞÙÚØ ÔÛï íâÞÙ ØÓàë?"
-#: gui/launcher.cpp:1001
+#: gui/launcher.cpp:999
+#, fuzzy
+msgid "Do you want to load savegame?"
+msgstr "²ë åÞâØâÕ ×ÐÓàãרâì ÛØÑÞ áÞåàÐÝØâì ØÓàã?"
+
+#: gui/launcher.cpp:1048
msgid "This game does not support loading games from the launcher."
msgstr "ÍâÐ ØÓàÐ ÝÕ ßÞÔÔÕàÖØÒÐÕâ ×ÐÓàã×Úã áÞåàÐÝÕÝØÙ çÕàÕ× ÓÛÐÒÝÞÕ ÜÕÝî."
-#: gui/launcher.cpp:1005
+#: gui/launcher.cpp:1052
msgid "ScummVM could not find any engine capable of running the selected game!"
msgstr "ScummVM ÝÕ áÜÞÓ ÝÐÙâØ ÔÒØÖÞÚ ÔÛï ×ÐßãáÚÐ ÒëÑàÐÝÝÞÙ ØÓàë!"
-#: gui/launcher.cpp:1119
-msgctxt "lowres"
-msgid "Mass Add..."
-msgstr "¼ÝÞÓÞ ØÓà..."
-
-#: gui/launcher.cpp:1119
-msgid "Mass Add..."
-msgstr "¼ÝÞÓÞ ØÓà..."
-
-#: gui/massadd.cpp:78 gui/massadd.cpp:81
+#: gui/massadd.cpp:79 gui/massadd.cpp:82
msgid "... progress ..."
msgstr "... Øéã ..."
-#: gui/massadd.cpp:258
+#: gui/massadd.cpp:259
msgid "Scan complete!"
msgstr "¿ÞØáÚ ×ÐÚÞÝçÕÝ!"
-#: gui/massadd.cpp:261
+#: gui/massadd.cpp:262
#, c-format
msgid "Discovered %d new games, ignored %d previously added games."
msgstr "½ÐÙÔÕÝÞ %d ÝÞÒëå ØÓà, ßàÞßãéÕÝÞ %d àÐÝÕÕ ÔÞÑÐÒÛÕÝÝëå ØÓà."
-#: gui/massadd.cpp:265
+#: gui/massadd.cpp:266
#, c-format
msgid "Scanned %d directories ..."
msgstr "¿àÞáÜÞâàÕÝÞ %d ÔØàÕÚâÞàØÙ ..."
-#: gui/massadd.cpp:268
+#: gui/massadd.cpp:269
#, c-format
msgid "Discovered %d new games, ignored %d previously added games ..."
msgstr "½ÐÙÔÕÝÞ %d ÝÞÒëå ØÓà, ßàÞßãéÕÝÞ %d àÐÝÕÕ ÔÞÑÐÒÛÕÝÝëå ØÓà ..."
-#: gui/options.cpp:84
+#: gui/options.cpp:85
msgid "Never"
msgstr "½ØÚÞÓÔÐ"
-#: gui/options.cpp:84
+#: gui/options.cpp:85
msgid "every 5 mins"
msgstr "ÚÐÖÔëÕ 5 ÜØÝãâ"
-#: gui/options.cpp:84
+#: gui/options.cpp:85
msgid "every 10 mins"
msgstr "ÚÐÖÔëÕ 10 ÜØÝãâ"
-#: gui/options.cpp:84
+#: gui/options.cpp:85
msgid "every 15 mins"
msgstr "ÚÐÖÔëÕ 15 ÜØÝãâ"
-#: gui/options.cpp:84
+#: gui/options.cpp:85
msgid "every 30 mins"
msgstr "ÚÐÖÔëÕ 30 ÜØÝãâ"
-#: gui/options.cpp:86
+#: gui/options.cpp:87
msgid "8 kHz"
msgstr "8 Ú³æ"
-#: gui/options.cpp:86
+#: gui/options.cpp:87
msgid "11kHz"
msgstr "11 Ú³æ"
-#: gui/options.cpp:86
+#: gui/options.cpp:87
msgid "22 kHz"
msgstr "22 Ú³æ"
-#: gui/options.cpp:86
+#: gui/options.cpp:87
msgid "44 kHz"
msgstr "44 Ú³æ"
-#: gui/options.cpp:86
+#: gui/options.cpp:87
msgid "48 kHz"
msgstr "48 Ú³æ"
-#: gui/options.cpp:254 gui/options.cpp:480 gui/options.cpp:581
-#: gui/options.cpp:650 gui/options.cpp:858
+#: gui/options.cpp:255 gui/options.cpp:481 gui/options.cpp:582
+#: gui/options.cpp:651 gui/options.cpp:859
msgctxt "soundfont"
msgid "None"
msgstr "½Õ ×ÐÔÐÝ"
-#: gui/options.cpp:388
+#: gui/options.cpp:389
msgid "Failed to apply some of the graphic options changes:"
msgstr "½Õ ãÔÐÛÞáì ßàØÜÕÝØâì Ø×ÜÕÝÕÝØï ÝÕÚâÞàëå ÓàÐäØçÕáÚØå ÝÐáâàÞÕÚ:"
-#: gui/options.cpp:400
+#: gui/options.cpp:401
msgid "the video mode could not be changed."
msgstr "ÒØÔÕÞàÕÖØÜ ÝÕ ÜÞÖÕâ Ñëâì Ø×ÜÕÝñÝ."
-#: gui/options.cpp:406
+#: gui/options.cpp:407
msgid "the fullscreen setting could not be changed"
msgstr "ßÞÛÝÞíÚàÐÝÝëÙ àÕÖØÜ ÝÕ ÜÞÖÕâ Ñëâì Ø×ÜÕÝñÝ"
-#: gui/options.cpp:412
+#: gui/options.cpp:413
msgid "the aspect ratio setting could not be changed"
msgstr "àÕÖØÜ ÚÞààÕÚâØàÞÒÚØ áÞÞâÝÞèÕÝØï áâÞàÞÝ ÝÕ ÜÞÖÕâ Ñëâì Ø×ÜÕÝñÝ"
-#: gui/options.cpp:733
+#: gui/options.cpp:734
msgid "Graphics mode:"
msgstr "³àÐä. àÕÖØÜ:"
-#: gui/options.cpp:747
+#: gui/options.cpp:748
msgid "Render mode:"
msgstr "ÀÕÖØÜ àÐáâàÐ:"
-#: gui/options.cpp:747 gui/options.cpp:748
+#: gui/options.cpp:748 gui/options.cpp:749
msgid "Special dithering modes supported by some games"
msgstr "ÁßÕæØÐÛìÝëÕ àÕÖØÜë àÕÝÔÕàØÝÓÐ, ßÞÔÔÕàÖØÒÐÕÜëÕ ÝÕÚÞâÞàëÜØ ØÓàÐÜØ"
-#: gui/options.cpp:759
-#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2236
-#: backends/graphics/openglsdl/openglsdl-graphics.cpp:476
+#: gui/options.cpp:760
+#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2249
msgid "Fullscreen mode"
msgstr "¿ÞÛÝÞíÚàÐÝÝëÙ àÕÖØÜ"
-#: gui/options.cpp:762
+#: gui/options.cpp:763
msgid "Aspect ratio correction"
msgstr "ºÞààÕÚæØï áÞÞâÝÞèÕÝØï áâÞàÞÝ"
-#: gui/options.cpp:762
+#: gui/options.cpp:763
msgid "Correct aspect ratio for 320x200 games"
msgstr "ºÞààÕÚâØàÞÒÐâì áÞÞâÝÞèÕÝØÕ áâÞàÞÝ ÔÛï ØÓà á àÐ×àÕèÕÝØÕÜ 320x200"
-#: gui/options.cpp:770
+#: gui/options.cpp:771
msgid "Preferred Device:"
msgstr "¿àÕÔßÞçØâÐÕÜÞÕ:"
-#: gui/options.cpp:770
+#: gui/options.cpp:771
msgid "Music Device:"
msgstr "·ÒãÚÞÒÞÕ ãáâ-ÒÞ:"
-#: gui/options.cpp:770 gui/options.cpp:772
+#: gui/options.cpp:771 gui/options.cpp:773
msgid "Specifies preferred sound device or sound card emulator"
msgstr ""
"ÃÚÐ×ëÒÐÕâ ßàÕÔßÞçØâÐÕÜÞÕ ×ÒãÚÞÒÞÕ ãáâàÞÙáâÒÞ ØÛØ íÜãÛïâÞà ×ÒãÚÞÒÞÙ ÚÐàâë"
-#: gui/options.cpp:770 gui/options.cpp:772 gui/options.cpp:773
+#: gui/options.cpp:771 gui/options.cpp:773 gui/options.cpp:774
msgid "Specifies output sound device or sound card emulator"
msgstr "ÃÚÐ×ëÒÐÕâ ÒëåÞÔÝÞÕ ×ÒãÚÞÒÞÕ ãáâàÞÙáâÒÞ ØÛØ íÜãÛïâÞà ×ÒãÚÞÒÞÙ ÚÐàâë"
-#: gui/options.cpp:772
+#: gui/options.cpp:773
msgctxt "lowres"
msgid "Preferred Dev.:"
msgstr "¿àÕÔßÞçØâÐÕÜÞÕ:"
-#: gui/options.cpp:772
+#: gui/options.cpp:773
msgctxt "lowres"
msgid "Music Device:"
msgstr "·ÒãÚÞÒÞÕ ãáâ-ÒÞ:"
-#: gui/options.cpp:799
+#: gui/options.cpp:800
msgid "AdLib emulator:"
msgstr "ÍÜãÛïâÞà AdLib:"
-#: gui/options.cpp:799 gui/options.cpp:800
+#: gui/options.cpp:800 gui/options.cpp:801
msgid "AdLib is used for music in many games"
msgstr "·ÒãÚÞÒÐï ÚÐàâÐ AdLib ØáßÞÛì×ãÕâáï ÜÝÞÓØÜØ ØÓàÐÜØ"
-#: gui/options.cpp:810
+#: gui/options.cpp:811
msgid "Output rate:"
msgstr "ÇÐáâÞâÐ ×ÒãÚÐ:"
-#: gui/options.cpp:810 gui/options.cpp:811
+#: gui/options.cpp:811 gui/options.cpp:812
msgid ""
"Higher value specifies better sound quality but may be not supported by your "
"soundcard"
@@ -680,67 +678,67 @@ msgstr ""
"±¾ÛìèØÕ ×ÝÐçÕÝØï ×ÐÔÐîâ ÛãçèÕÕ ÚÐçÕáâÒÞ ×ÒãÚÐ, ÞÔÝÐÚÞ ÞÝØ ÜÞÓãâ ÝÕ "
"ßÞÔÔÕàÖØÒÐâìáï ÒÐèÕÙ ×ÒãÚÞÒÞÙ ÚÐàâÞÙ"
-#: gui/options.cpp:821
+#: gui/options.cpp:822
msgid "GM Device:"
msgstr "ÃáâàÞÙáâÒÞ GM:"
-#: gui/options.cpp:821
+#: gui/options.cpp:822
msgid "Specifies default sound device for General MIDI output"
msgstr "ÃÚÐ×ëÒÐÕâ ÒëåÞÔÝÞÕ ×ÒãÚÞÒÞÕ ãáâàÞÙáâÒÞ ÔÛï MIDI"
-#: gui/options.cpp:832
+#: gui/options.cpp:833
msgid "Don't use General MIDI music"
msgstr "½Õ ØáßÞÛì×ÞÒÐâì Üã×ëÚã ÔÛï General MIDI"
-#: gui/options.cpp:843 gui/options.cpp:909
+#: gui/options.cpp:844 gui/options.cpp:910
msgid "Use first available device"
msgstr "¸áßÞÛì×ÞÒÐâì ßÕàÒÞÕ ÔÞáâãßÝÞÕ ãáâàÞÙáâÒÞ"
-#: gui/options.cpp:855
+#: gui/options.cpp:856
msgid "SoundFont:"
msgstr "SoundFont:"
-#: gui/options.cpp:855 gui/options.cpp:857 gui/options.cpp:858
+#: gui/options.cpp:856 gui/options.cpp:858 gui/options.cpp:859
msgid "SoundFont is supported by some audio cards, Fluidsynth and Timidity"
msgstr ""
"SoundFontë ßÞÔÔÕàÖØÒÐîâáï ÝÕÚÞâÞàëÜØ ×ÒãÚÞÒëÜØ ÚÐàâÐÜØ, Fluidsynth Ø Timidity"
-#: gui/options.cpp:857
+#: gui/options.cpp:858
msgctxt "lowres"
msgid "SoundFont:"
msgstr "SoundFont:"
-#: gui/options.cpp:863
+#: gui/options.cpp:864
msgid "Mixed AdLib/MIDI mode"
msgstr "ÁÜÕèÐÝÝëÙ àÕÖØÜ AdLib/MIDI"
-#: gui/options.cpp:863
+#: gui/options.cpp:864
msgid "Use both MIDI and AdLib sound generation"
msgstr "¸áßÞÛì×ÞÒÐâì Ø MIDI Ø AdLib ÔÛï ÓÕÝÕàÐæØØ ×ÒãÚÐ"
-#: gui/options.cpp:866
+#: gui/options.cpp:867
msgid "MIDI gain:"
msgstr "ÃáØÛÕÝØÕ MIDI:"
-#: gui/options.cpp:873
+#: gui/options.cpp:874
msgid "FluidSynth Settings"
msgstr "½ÐáâàÞÙÚØ FluidSynth"
-#: gui/options.cpp:880
+#: gui/options.cpp:881
msgid "MT-32 Device:"
msgstr "Ãáâà. MT-32:"
-#: gui/options.cpp:880
+#: gui/options.cpp:881
msgid "Specifies default sound device for Roland MT-32/LAPC1/CM32l/CM64 output"
msgstr ""
"ÃÚÐ×ëÒÐÕâ ×ÒãÚÞÒÞÕ ãáâàÞÙáâÒÞ ßÞ ãÜÞÛçÐÝØî ÔÛï ÒëÒÞÔÐ ÝÐ Roland MT-32/LAPC1/"
"CM32l/CM64"
-#: gui/options.cpp:885
+#: gui/options.cpp:886
msgid "True Roland MT-32 (disable GM emulation)"
msgstr "½ÐáâÞïéØÙ Roland MT-32 (×ÐßàÕâØâì íÜãÛïæØî GM)"
-#: gui/options.cpp:885 gui/options.cpp:887
+#: gui/options.cpp:886 gui/options.cpp:888
msgid ""
"Check if you want to use your real hardware Roland-compatible sound device "
"connected to your computer"
@@ -748,194 +746,195 @@ msgstr ""
"¾âÜÕâìâÕ, ÕáÛØ ã ÒÐá ßÞÔÚÛîçÕÝÞ Roland-áÞÒÜÕáâØÜÞÕ ×ÒãÚÞÒÞÕ ãáâàÞÙáâÒÞ Ø Òë "
"åÞâØâÕ ÕÓÞ ØáßÞÛì×ÞÒÐâì"
-#: gui/options.cpp:887
+#: gui/options.cpp:888
msgctxt "lowres"
msgid "True Roland MT-32 (no GM emulation)"
msgstr "½ÐáâÞïéØÙ Roland MT-32 (ÑÕ× íÜãÛïæØØ GM)"
-#: gui/options.cpp:890
-msgid "Roland GS Mode (disable GM mapping)"
+#: gui/options.cpp:891
+#, fuzzy
+msgid "Roland GS Device (enable MT-32 mappings)"
msgstr "ÀÕÖØÜ Roland GS (×ÐßàÕâØâì ÜÐßߨÝÓ GM)"
-#: gui/options.cpp:890
-msgid "Turns off General MIDI mapping for games with Roland MT-32 soundtrack"
+#: gui/options.cpp:891
+msgid ""
+"Check if you want to enable patch mappings to emulate an MT-32 on a Roland "
+"GS device"
msgstr ""
-"²ëÚÛîçÐÕâ áÞßÞáâÐÒÛÕÝØÕ General MIDI ÔÛï ØÓà á ×ÒãÚÞÒÞÙ ÔÞàÞÖÚÞÙ ÔÛï Roland "
-"MT-32"
-#: gui/options.cpp:899
+#: gui/options.cpp:900
msgid "Don't use Roland MT-32 music"
msgstr "½Õ ØáßÞÛì×ÞÒÐâì Üã×ëÚã ÔÛï MT-32"
-#: gui/options.cpp:926
+#: gui/options.cpp:927
msgid "Text and Speech:"
msgstr "ÂÕÚáâ Ø Þ×ÒãçÚÐ:"
-#: gui/options.cpp:930 gui/options.cpp:940
+#: gui/options.cpp:931 gui/options.cpp:941
msgid "Speech"
msgstr "¾×ÒãçÚÐ"
-#: gui/options.cpp:931 gui/options.cpp:941
+#: gui/options.cpp:932 gui/options.cpp:942
msgid "Subtitles"
msgstr "ÁãÑâØâàë"
-#: gui/options.cpp:932
+#: gui/options.cpp:933
msgid "Both"
msgstr "¾ÑÐ"
-#: gui/options.cpp:934
+#: gui/options.cpp:935
msgid "Subtitle speed:"
msgstr "ÁÚÞàÞáâì âØâàÞÒ:"
-#: gui/options.cpp:936
+#: gui/options.cpp:937
msgctxt "lowres"
msgid "Text and Speech:"
msgstr "ÂÕÚáâ Ø Þ×ÒãçÚÐ:"
-#: gui/options.cpp:940
+#: gui/options.cpp:941
msgid "Spch"
msgstr "¾×Ò"
-#: gui/options.cpp:941
+#: gui/options.cpp:942
msgid "Subs"
msgstr "狄"
-#: gui/options.cpp:942
+#: gui/options.cpp:943
msgctxt "lowres"
msgid "Both"
msgstr "¾ÑÐ"
-#: gui/options.cpp:942
+#: gui/options.cpp:943
msgid "Show subtitles and play speech"
msgstr "¿ÞÚÐ×ëÒÐâì áãÑâØâàë Ø ÒÞáßàÞØ×ÒÞÔØâì àÕçì"
-#: gui/options.cpp:944
+#: gui/options.cpp:945
msgctxt "lowres"
msgid "Subtitle speed:"
msgstr "ÁÚÞàÞáâì âØâàÞÒ:"
-#: gui/options.cpp:960
+#: gui/options.cpp:961
msgid "Music volume:"
msgstr "³àÞÜÚ. Üã×ëÚØ:"
-#: gui/options.cpp:962
+#: gui/options.cpp:963
msgctxt "lowres"
msgid "Music volume:"
msgstr "³àÞÜÚ. Üã×ëÚØ:"
-#: gui/options.cpp:969
+#: gui/options.cpp:970
msgid "Mute All"
msgstr "²ëÚÛ. Òáñ"
-#: gui/options.cpp:972
+#: gui/options.cpp:973
msgid "SFX volume:"
msgstr "³àÞÜÚÞáâì SFX:"
-#: gui/options.cpp:972 gui/options.cpp:974 gui/options.cpp:975
+#: gui/options.cpp:973 gui/options.cpp:975 gui/options.cpp:976
msgid "Special sound effects volume"
msgstr "³àÞÜÚÞáâì áßÕæØÐÛìÝëå ×ÒãÚÞÒëå íääÕÚâÞÒ"
-#: gui/options.cpp:974
+#: gui/options.cpp:975
msgctxt "lowres"
msgid "SFX volume:"
msgstr "³àÞÜÚ. SFX:"
-#: gui/options.cpp:982
+#: gui/options.cpp:983
msgid "Speech volume:"
msgstr "³àÞÜÚ. Þ×ÒãçÚØ:"
-#: gui/options.cpp:984
+#: gui/options.cpp:985
msgctxt "lowres"
msgid "Speech volume:"
msgstr "³àÞÜÚ. Þ×ÒãçÚØ:"
-#: gui/options.cpp:1141
+#: gui/options.cpp:1142
msgid "Theme Path:"
msgstr "¿ãâì Ú âÕÜÐÜ:"
-#: gui/options.cpp:1143
+#: gui/options.cpp:1144
msgctxt "lowres"
msgid "Theme Path:"
msgstr "³ÔÕ âÕÜë:"
-#: gui/options.cpp:1149 gui/options.cpp:1151 gui/options.cpp:1152
+#: gui/options.cpp:1150 gui/options.cpp:1152 gui/options.cpp:1153
msgid "Specifies path to additional data used by all games or ScummVM"
msgstr ""
"ÃÚÐ×ëÒÐÕâ ßãâì Ú ÔÞßÞÛÝØâÕÛìÝëÜ äÐÙÛÐÜ ÔÐÝÝëå, ØáßÞÛì×ãÕÜëå ÒáÕÜØ ØÓàÐÜØ, "
"ÛØÑÞ ScummVM"
-#: gui/options.cpp:1158
+#: gui/options.cpp:1159
msgid "Plugins Path:"
msgstr "¿ãâì Ú ßÛÐÓØÝÐÜ:"
-#: gui/options.cpp:1160
+#: gui/options.cpp:1161
msgctxt "lowres"
msgid "Plugins Path:"
msgstr "¿ãâì Ú ßÛÐÓØÝÐÜ:"
-#: gui/options.cpp:1169 gui/fluidsynth-dialog.cpp:137
+#: gui/options.cpp:1170 gui/fluidsynth-dialog.cpp:138
msgid "Misc"
msgstr "ÀÐ×ÝÞÕ"
-#: gui/options.cpp:1171
+#: gui/options.cpp:1172
msgctxt "lowres"
msgid "Misc"
msgstr "ÀÐ×ÝÞÕ"
-#: gui/options.cpp:1173
+#: gui/options.cpp:1174
msgid "Theme:"
msgstr "ÂÕÜÐ:"
-#: gui/options.cpp:1177
+#: gui/options.cpp:1178
msgid "GUI Renderer:"
msgstr "ÀØáÞÒÐÛÚÐ GUI:"
-#: gui/options.cpp:1189
+#: gui/options.cpp:1190
msgid "Autosave:"
msgstr "°ÒâÞáÞåàÐÝÕÝØÕ:"
-#: gui/options.cpp:1191
+#: gui/options.cpp:1192
msgctxt "lowres"
msgid "Autosave:"
msgstr "°ÒâÞáÞåà.:"
-#: gui/options.cpp:1199
+#: gui/options.cpp:1200
msgid "Keys"
msgstr "ºÛÐÒØèØ"
-#: gui/options.cpp:1206
+#: gui/options.cpp:1207
msgid "GUI Language:"
msgstr "Ï×ëÚ GUI:"
-#: gui/options.cpp:1206
+#: gui/options.cpp:1207
msgid "Language of ScummVM GUI"
msgstr "Ï×ëÚ ÓàÐäØçÕáÚÞÓÞ ØÝâÕàäÕÙáÐ ScummVM"
-#: gui/options.cpp:1365
+#: gui/options.cpp:1366
msgid "You have to restart ScummVM before your changes will take effect."
msgstr "²ë ÔÞÛÖÝë ßÕàÕ×ÐßãáâØâì ScummVM, çâÞÑë ßàØÜÕÝØâì Ø×ÜÕÝÕÝØï."
-#: gui/options.cpp:1378
+#: gui/options.cpp:1379
msgid "Select directory for savegames"
msgstr "²ëÑÕàØâÕ ÔØàÕÚâÞàØî ÔÛï áÞåàÐÝÕÝØÙ"
-#: gui/options.cpp:1385
+#: gui/options.cpp:1386
msgid "The chosen directory cannot be written to. Please select another one."
msgstr "½Õ ÜÞÓã ߨáÐâì Ò ÒëÑàÐÝÝãî ÔØàÕÚâÞàØî. ¿ÞÖÐÛãÙáâÐ, ãÚÐÖØâÕ ÔàãÓãî."
-#: gui/options.cpp:1394
+#: gui/options.cpp:1395
msgid "Select directory for GUI themes"
msgstr "²ëÑÕàØâÕ ÔØàÕÚâÞàØî ÔÛï âÕÜ GUI"
-#: gui/options.cpp:1404
+#: gui/options.cpp:1405
msgid "Select directory for extra files"
msgstr "²ëÑÕàØâÕ ÔØàÕÚâÞàØî á ÔÞßÞÛÝØâÕÛìÝëÜØ äÐÙÛÐÜØ"
-#: gui/options.cpp:1415
+#: gui/options.cpp:1416
msgid "Select directory for plugins"
msgstr "²ëÑÕàØâÕ ÔØàÕÚâÞàØî á ßÛÐÓØÝÐÜØ"
-#: gui/options.cpp:1468
+#: gui/options.cpp:1469
msgid ""
"The theme you selected does not support your current language. If you want "
"to use this theme you need to switch to another language first."
@@ -943,225 +942,228 @@ msgstr ""
"ÂÕÜÐ, ÒëÑàÐÝÝÐï ÒÐÜØ, ÝÕ ßÞÔÔÕàÖØÒÐÕâ âÕÚãéØÙ ï×ëÚ. µáÛØ Òë åÞâØâÕ "
"ØáßÞÛì×ÞÒÐâì íâã âÕÜã, ÒÐÜ ÝÕÞÑåÞÔØÜÞ áÝÐçÐÛÐ ßÕàÕÚÛîçØâìáï ÝÐ ÔàãÓÞÙ ï×ëÚ."
-#: gui/saveload-dialog.cpp:166
+#: gui/saveload-dialog.cpp:167
msgid "List view"
msgstr "²ØÔ áߨáÚÐ"
-#: gui/saveload-dialog.cpp:167
+#: gui/saveload-dialog.cpp:168
msgid "Grid view"
msgstr "²ØÔ áÕâÚØ"
-#: gui/saveload-dialog.cpp:210 gui/saveload-dialog.cpp:358
+#: gui/saveload-dialog.cpp:211 gui/saveload-dialog.cpp:360
msgid "No date saved"
msgstr "´ÐâÐ ÝÕ ×ÐߨáÐÝÐ"
-#: gui/saveload-dialog.cpp:211 gui/saveload-dialog.cpp:359
+#: gui/saveload-dialog.cpp:212 gui/saveload-dialog.cpp:361
msgid "No time saved"
msgstr "²àÕÜï ÝÕ ×ÐߨáÐÝÞ"
-#: gui/saveload-dialog.cpp:212 gui/saveload-dialog.cpp:360
+#: gui/saveload-dialog.cpp:213 gui/saveload-dialog.cpp:362
msgid "No playtime saved"
msgstr "²àÕÜï ØÓàë ÝÕ ×ÐߨáÐÝÞ"
-#: gui/saveload-dialog.cpp:219 gui/saveload-dialog.cpp:275
+#: gui/saveload-dialog.cpp:220 gui/saveload-dialog.cpp:276
msgid "Delete"
msgstr "ÃÔÐÛØâì"
-#: gui/saveload-dialog.cpp:274
+#: gui/saveload-dialog.cpp:275
msgid "Do you really want to delete this savegame?"
msgstr "²ë ÔÕÙáâÒØâÕÛìÝÞ åÞâØâÕ ãÔÐÛØâì íâÞ áÞåàÐÝÕÝØÕ?"
-#: gui/saveload-dialog.cpp:383 gui/saveload-dialog.cpp:872
+#: gui/saveload-dialog.cpp:385 gui/saveload-dialog.cpp:875
msgid "Date: "
msgstr "´ÐâÐ: "
-#: gui/saveload-dialog.cpp:387 gui/saveload-dialog.cpp:878
+#: gui/saveload-dialog.cpp:389 gui/saveload-dialog.cpp:881
msgid "Time: "
msgstr "²àÕÜï: "
-#: gui/saveload-dialog.cpp:393 gui/saveload-dialog.cpp:886
+#: gui/saveload-dialog.cpp:395 gui/saveload-dialog.cpp:889
msgid "Playtime: "
msgstr "²àÕÜï ØÓàë: "
-#: gui/saveload-dialog.cpp:406 gui/saveload-dialog.cpp:494
+#: gui/saveload-dialog.cpp:408 gui/saveload-dialog.cpp:496
msgid "Untitled savestate"
msgstr "ÁÞåàÐÝÕÝØÕ ÑÕ× ØÜÕÝØ"
-#: gui/saveload-dialog.cpp:546
+#: gui/saveload-dialog.cpp:548
msgid "Next"
msgstr "ÁÛÕÔãîéØÙ"
-#: gui/saveload-dialog.cpp:549
+#: gui/saveload-dialog.cpp:551
msgid "Prev"
msgstr "¿àÕÔëÔãéØÙ"
-#: gui/saveload-dialog.cpp:736
+#: gui/saveload-dialog.cpp:739
msgid "New Save"
msgstr "½ÞÒÞÕ áÞåàÐÝÕÝØÕ"
-#: gui/saveload-dialog.cpp:736
+#: gui/saveload-dialog.cpp:739
msgid "Create a new save game"
msgstr "ÁÞ×ÔÐâì ÝÞÒãî ×Ðߨáì ØÓàë"
-#: gui/saveload-dialog.cpp:865
+#: gui/saveload-dialog.cpp:868
msgid "Name: "
msgstr "½Ð×ÒÐÝØÕ: "
-#: gui/saveload-dialog.cpp:937
+#: gui/saveload-dialog.cpp:940
#, c-format
msgid "Enter a description for slot %d:"
msgstr "²ÒÕÔØâÕ ÞߨáÐÝØÕ áÛÞâÐ %d:"
-#: gui/themebrowser.cpp:44
+#: gui/themebrowser.cpp:45
msgid "Select a Theme"
msgstr "²ëÑÕàØâÕ âÕÜã"
-#: gui/ThemeEngine.cpp:337
+#: gui/ThemeEngine.cpp:347
msgid "Disabled GFX"
msgstr "±Õ× ÓàÐäØÚØ"
-#: gui/ThemeEngine.cpp:337
+#: gui/ThemeEngine.cpp:347
msgctxt "lowres"
msgid "Disabled GFX"
msgstr "±Õ× ÓàÐäØÚØ"
-#: gui/ThemeEngine.cpp:338
-msgid "Standard Renderer (16bpp)"
+#: gui/ThemeEngine.cpp:348
+#, fuzzy
+msgid "Standard Renderer"
msgstr "ÁâÐÝÔÐàâÝëÙ àÐáâÕàØ×ÐâÞà (16bpp)"
-#: gui/ThemeEngine.cpp:338
-msgid "Standard (16bpp)"
-msgstr "ÁâÐÝÔÐàâÝëÙ àÐáâÕàØ×ÐâÞà (16bpp)"
+#: gui/ThemeEngine.cpp:348 engines/scumm/dialogs.cpp:659
+msgid "Standard"
+msgstr "ÁâÐÝÔÐàâÝëÙ"
-#: gui/ThemeEngine.cpp:340
-msgid "Antialiased Renderer (16bpp)"
+#: gui/ThemeEngine.cpp:350
+#, fuzzy
+msgid "Antialiased Renderer"
msgstr "ÀÐáâÕàØ×ÐâÞà áÞ áÓÛÐÖØÒÐÝØÕÜ (16bpp)"
-#: gui/ThemeEngine.cpp:340
-msgid "Antialiased (16bpp)"
+#: gui/ThemeEngine.cpp:350
+#, fuzzy
+msgid "Antialiased"
msgstr "ÀÐáâÕàØ×ÐâÞà áÞ áÓÛÐÖØÒÐÝØÕÜ (16bpp)"
-#: gui/widget.cpp:322 gui/widget.cpp:324 gui/widget.cpp:330 gui/widget.cpp:332
+#: gui/widget.cpp:323 gui/widget.cpp:325 gui/widget.cpp:331 gui/widget.cpp:333
msgid "Clear value"
msgstr "¾çØáâØâì ×ÝÐçÕÝØÕ"
-#: gui/fluidsynth-dialog.cpp:67
+#: gui/fluidsynth-dialog.cpp:68
msgid "Reverb"
msgstr "ÀÕÒÕàÑÕàÐæØï"
-#: gui/fluidsynth-dialog.cpp:69 gui/fluidsynth-dialog.cpp:101
+#: gui/fluidsynth-dialog.cpp:70 gui/fluidsynth-dialog.cpp:102
#, fuzzy
msgid "Active"
msgstr "°ÚâØÒÝÞ"
-#: gui/fluidsynth-dialog.cpp:71
+#: gui/fluidsynth-dialog.cpp:72
msgid "Room:"
msgstr "ºÞÜÝÐâÐ:"
-#: gui/fluidsynth-dialog.cpp:78
+#: gui/fluidsynth-dialog.cpp:79
msgid "Damp:"
msgstr "²ÛÐÖÝÞáâì:"
-#: gui/fluidsynth-dialog.cpp:85
+#: gui/fluidsynth-dialog.cpp:86
msgid "Width:"
msgstr "ÈØàØÝÐ:"
-#: gui/fluidsynth-dialog.cpp:92 gui/fluidsynth-dialog.cpp:110
+#: gui/fluidsynth-dialog.cpp:93 gui/fluidsynth-dialog.cpp:111
msgid "Level:"
msgstr "ÃàÞÒÕÝì:"
-#: gui/fluidsynth-dialog.cpp:99
+#: gui/fluidsynth-dialog.cpp:100
msgid "Chorus"
msgstr "ÅÞà"
-#: gui/fluidsynth-dialog.cpp:103
+#: gui/fluidsynth-dialog.cpp:104
msgid "N:"
msgstr "N:"
-#: gui/fluidsynth-dialog.cpp:117
+#: gui/fluidsynth-dialog.cpp:118
msgid "Speed:"
msgstr "¾×ÒãçÚÐ"
-#: gui/fluidsynth-dialog.cpp:124
+#: gui/fluidsynth-dialog.cpp:125
msgid "Depth:"
msgstr "³ÛãÑØÝÐ:"
-#: gui/fluidsynth-dialog.cpp:131
+#: gui/fluidsynth-dialog.cpp:132
msgid "Type:"
msgstr "ÂØß:"
-#: gui/fluidsynth-dialog.cpp:134
+#: gui/fluidsynth-dialog.cpp:135
msgid "Sine"
msgstr "ÁØÝãáÞØÔÐ"
-#: gui/fluidsynth-dialog.cpp:135
+#: gui/fluidsynth-dialog.cpp:136
msgid "Triangle"
msgstr "ÂàÕãÓÞÛìÝÐï"
-#: gui/fluidsynth-dialog.cpp:139
+#: gui/fluidsynth-dialog.cpp:140
msgid "Interpolation:"
msgstr "¸ÝâÕàßÞÛïæØï:"
-#: gui/fluidsynth-dialog.cpp:142
+#: gui/fluidsynth-dialog.cpp:143
msgid "None (fastest)"
msgstr "½Õâ (ÑëáâàëÙ)"
-#: gui/fluidsynth-dialog.cpp:143
+#: gui/fluidsynth-dialog.cpp:144
msgid "Linear"
msgstr "»ØÝÕÙÝÐï"
-#: gui/fluidsynth-dialog.cpp:144
+#: gui/fluidsynth-dialog.cpp:145
msgid "Fourth-order"
msgstr "ÇÕâÒÕàâÞÓÞ ßÞàïÔÚÐ"
-#: gui/fluidsynth-dialog.cpp:145
+#: gui/fluidsynth-dialog.cpp:146
msgid "Seventh-order"
msgstr "ÁÕÔìÜÞÓÞ ßÞàïÔÚÐ"
-#: gui/fluidsynth-dialog.cpp:149
+#: gui/fluidsynth-dialog.cpp:150
msgid "Reset"
msgstr "ÁÑàÞá"
-#: gui/fluidsynth-dialog.cpp:149
+#: gui/fluidsynth-dialog.cpp:150
msgid "Reset all FluidSynth settings to their default values."
msgstr "ÁÑàÞáØâì ÒáÕ ãáâÐÝÞÒÚØ FluidSynth Ò ×ÝÐçÕÝØï ßÞ ãÜÞÛçÐÝØî"
-#: gui/fluidsynth-dialog.cpp:216
+#: gui/fluidsynth-dialog.cpp:217
msgid ""
"Do you really want to reset all FluidSynth settings to their default values?"
msgstr ""
"²ë ÔÕÙáâÒØâÕÛìÝÞ åÞâØâÕ áÑàÞáØâì ÒáÕ ãáâÐÝÞÒÚØ FluidSynth Ò ×ÝÐçÕÝØï ßÞ "
"ãÜÞÛçÐÝØî?"
-#: base/main.cpp:210
+#: base/main.cpp:228
#, c-format
msgid "Engine does not support debug level '%s'"
msgstr "´ÒØÖÞÚ ÝÕ ßÞÔÔÕàÖØÒÐÕâ ãàÞÒÕÝì ÞâÛÐÔÚØ '%s'"
-#: base/main.cpp:288
+#: base/main.cpp:306
msgid "Menu"
msgstr "¼ÕÝî"
-#: base/main.cpp:291 backends/platform/symbian/src/SymbianActions.cpp:45
+#: base/main.cpp:309 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:294 backends/platform/symbian/src/SymbianActions.cpp:50
+#: base/main.cpp:312 backends/platform/symbian/src/SymbianActions.cpp:50
#: backends/platform/wince/CEActionsPocket.cpp:42
msgid "Pause"
msgstr "¿Ðã×Ð"
-#: base/main.cpp:297
+#: base/main.cpp:315
msgid "Skip line"
msgstr "¿àÞßãáâØâì áâàÞÚã"
-#: base/main.cpp:468
+#: base/main.cpp:507
msgid "Error running game:"
msgstr "¾èØÑÚÐ ×ÐßãáÚÐ ØÓàë:"
-#: base/main.cpp:492
+#: base/main.cpp:536
msgid "Could not find any engine capable of running the selected game"
msgstr "½Õ ÜÞÓã ÝÐÙâØ ÔÒØÖÞÚ ÔÛï ×ÐßãáÚÐ ÒëÑàÐÝÝÞÙ ØÓàë"
@@ -1229,73 +1231,73 @@ msgstr "¿àÕàÒÐÝÞ ßÞÛì×ÞÒÐâÕÛÕÜ"
msgid "Unknown error"
msgstr "½ÕØ×ÒÕáâÝÐï ÞèØÑÚÐ"
-#: engines/advancedDetector.cpp:316
+#: engines/advancedDetector.cpp:317
#, c-format
msgid "The game in '%s' seems to be unknown."
msgstr "ºÐÖÕâáï, çâÞ ØÓàÐ '%s' Õéñ ÝÕØ×ÒÕáâÝÐ."
-#: engines/advancedDetector.cpp:317
+#: engines/advancedDetector.cpp:318
msgid "Please, report the following data to the ScummVM team along with name"
msgstr ""
"¿ÞÖÐÛãÙáâÐ, ßÕàÕÔÐÙâÕ áÛÕÔãîéØÕ ÔÐÝÝëÕ ÚÞÜÐÝÔÕ ScummVM ÒÜÕáâÕ á ÝÐ×ÒÐÝØÕÜ"
-#: engines/advancedDetector.cpp:319
+#: engines/advancedDetector.cpp:320
msgid "of the game you tried to add and its version/language/etc.:"
msgstr "ØÓàë, ÚÞâÞàãî Òë ßëâÐÕâÕáì ÔÞÑÐÒØâì, Ø ãÚÐÖØâÕ Õñ ÒÕàáØî, ï×ëÚ Ø â.Ô."
-#: engines/dialogs.cpp:84
+#: engines/dialogs.cpp:85
msgid "~R~esume"
msgstr "¿àÞÔÞÛ~Ö~Øâì"
-#: engines/dialogs.cpp:86
+#: engines/dialogs.cpp:87
msgid "~L~oad"
msgstr "~·~ÐÓàãרâì"
-#: engines/dialogs.cpp:90
+#: engines/dialogs.cpp:91
msgid "~S~ave"
msgstr "~·~ÐߨáÐâì"
-#: engines/dialogs.cpp:94
+#: engines/dialogs.cpp:95
msgid "~O~ptions"
msgstr "~¾~ßæØØ"
-#: engines/dialogs.cpp:99
+#: engines/dialogs.cpp:100
msgid "~H~elp"
msgstr "~¿~ÞÜÞéì"
-#: engines/dialogs.cpp:101
+#: engines/dialogs.cpp:102
msgid "~A~bout"
msgstr "¾ ßàÞ~Ó~àÐÜÜÕ"
-#: engines/dialogs.cpp:104 engines/dialogs.cpp:180
+#: engines/dialogs.cpp:105 engines/dialogs.cpp:181
msgid "~R~eturn to Launcher"
msgstr "~²~ëÙâØ Ò ÓÛÐÒÝÞÕ ÜÕÝî"
-#: engines/dialogs.cpp:106 engines/dialogs.cpp:182
+#: engines/dialogs.cpp:107 engines/dialogs.cpp:183
msgctxt "lowres"
msgid "~R~eturn to Launcher"
msgstr "~²~ ÓÛÐÒÝÞÕ ÜÕÝî"
-#: engines/dialogs.cpp:115 engines/agi/saveload.cpp:803
-#: engines/drascula/saveload.cpp:338 engines/cruise/menu.cpp:212
-#: engines/sci/engine/kfile.cpp:742 engines/toltecs/menu.cpp:284
-#: engines/pegasus/pegasus.cpp:373
+#: engines/dialogs.cpp:116 engines/agi/saveload.cpp:803
+#: engines/cruise/menu.cpp:212 engines/drascula/saveload.cpp:336
+#: engines/neverhood/menumodule.cpp:873 engines/pegasus/pegasus.cpp:377
+#: engines/sci/engine/kfile.cpp:758 engines/toltecs/menu.cpp:281
msgid "Save game:"
msgstr "ÁÞåàÐÝØâì ØÓàã:"
-#: engines/dialogs.cpp:115 engines/agi/saveload.cpp:803
-#: engines/drascula/saveload.cpp:338 engines/scumm/dialogs.cpp:187
-#: engines/cruise/menu.cpp:212 engines/sci/engine/kfile.cpp:742
-#: engines/toltecs/menu.cpp:284 engines/pegasus/pegasus.cpp:373
-#: backends/platform/symbian/src/SymbianActions.cpp:44
+#: engines/dialogs.cpp:116 backends/platform/symbian/src/SymbianActions.cpp:44
#: backends/platform/wince/CEActionsPocket.cpp:43
#: backends/platform/wince/CEActionsPocket.cpp:267
#: backends/platform/wince/CEActionsSmartphone.cpp:45
#: backends/platform/wince/CEActionsSmartphone.cpp:231
+#: engines/agi/saveload.cpp:803 engines/cruise/menu.cpp:212
+#: engines/drascula/saveload.cpp:336 engines/neverhood/menumodule.cpp:873
+#: engines/pegasus/pegasus.cpp:377 engines/sci/engine/kfile.cpp:758
+#: engines/scumm/dialogs.cpp:188 engines/toltecs/menu.cpp:281
msgid "Save"
msgstr "ÁÞåàÐÝØâì"
-#: engines/dialogs.cpp:144
+#: engines/dialogs.cpp:145
msgid ""
"Sorry, this engine does not currently provide in-game help. Please consult "
"the README for basic information, and for instructions on how to obtain "
@@ -1305,7 +1307,7 @@ msgstr ""
"¿ÞÖÐÛãÙáâÐ, ÞÑàÐâØâÕáì Ò äÐÙÛ README ×Ð ÑÐ×ÞÒÞÙ ØÝäÞàÜÐæØÕÙ, Ð âÐÚÖÕ "
"ØÝáâàãÚæØïÜØ Þ âÞÜ, ÚÐÚ ßÞÛãçØâì ÔÐÛìÝÕÙèãî ßÞÜÞéì."
-#: engines/dialogs.cpp:228
+#: engines/dialogs.cpp:234 engines/pegasus/pegasus.cpp:393
#, c-format
msgid ""
"Gamestate save failed (%s)! Please consult the README for basic information, "
@@ -1315,37 +1317,37 @@ msgstr ""
"ÑÐ×ÞÒÞÙ ØÝäÞàÜÐæØÕÙ, Ð âÐÚÖÕ ØÝáâàãÚæØïÜØ Þ âÞÜ, ÚÐÚ ßÞÛãçØâì ÔÐÛìÝÕÙèãî "
"ßÞÜÞéì."
-#: engines/dialogs.cpp:301 engines/mohawk/dialogs.cpp:109
+#: engines/dialogs.cpp:307 engines/mohawk/dialogs.cpp:109
#: engines/mohawk/dialogs.cpp:170
msgid "~O~K"
msgstr "~O~K"
-#: engines/dialogs.cpp:302 engines/mohawk/dialogs.cpp:110
+#: engines/dialogs.cpp:308 engines/mohawk/dialogs.cpp:110
#: engines/mohawk/dialogs.cpp:171
msgid "~C~ancel"
msgstr "¾~â~ÜÕÝÐ"
-#: engines/dialogs.cpp:305
+#: engines/dialogs.cpp:311
msgid "~K~eys"
msgstr "~º~ÛÐÒØèØ"
-#: engines/engine.cpp:240
+#: engines/engine.cpp:245
msgid "Could not initialize color format."
msgstr "½Õ ÜÞÓã ØÝØæØÐÛØ×ØàÞÒÐâì äÞàÜÐâ æÒÕâÐ."
-#: engines/engine.cpp:248
+#: engines/engine.cpp:253
msgid "Could not switch to video mode: '"
msgstr "½Õ ãÔÐÛÞáì ßÕàÕÚÛîçØâì ÒØÔÕÞàÕÖØÜ: '"
-#: engines/engine.cpp:257
+#: engines/engine.cpp:262
msgid "Could not apply aspect ratio setting."
msgstr "½Õ ãÔÐÛÞáì ØáßÞÛì×ÞÒÐâì ÚÞààÕÚæØî áÞÞâÝÞèÕÝØï áâÞàÞÝ."
-#: engines/engine.cpp:262
+#: engines/engine.cpp:267
msgid "Could not apply fullscreen setting."
msgstr "½Õ ÜÞÓã ßàØÜÕÝØâì ßÞÛÝÞíÚàÐÝÝëÙ àÕÖØÜ."
-#: engines/engine.cpp:362
+#: engines/engine.cpp:367
msgid ""
"You appear to be playing this game directly\n"
"from the CD. This is known to cause problems,\n"
@@ -1359,7 +1361,7 @@ msgstr ""
"ÝÐ ÖñáâÚØÙ ÔØáÚ. ¿ÞÔàÞÑÝÞáâØ ÜÞÖÝÞ ÝÐÙâØ Ò\n"
"äÐÙÛÕ README."
-#: engines/engine.cpp:373
+#: engines/engine.cpp:378
msgid ""
"This game has audio tracks in its disk. These\n"
"tracks need to be ripped from the disk using\n"
@@ -1374,7 +1376,7 @@ msgstr ""
"ßÞïÒØâáï Üã×ëÚÐ. ¿ÞÔàÞÑÝÞáâØ ÜÞÖÝÞ ÝÐÙâØ Ò\n"
"äÐÙÛÕ README."
-#: engines/engine.cpp:431
+#: engines/engine.cpp:436
#, c-format
msgid ""
"Gamestate load failed (%s)! Please consult the README for basic information, "
@@ -1384,7 +1386,7 @@ msgstr ""
"README ×Ð ÑÐ×ÞÒÞÙ ØÝäÞàÜÐæØÕÙ, Ð âÐÚÖÕ ØÝáâàãÚæØïÜØ Þ âÞÜ, ÚÐÚ ßÞÛãçØâì "
"ÔÐÛìÝÕÙèãî ßÞÜÞéì."
-#: engines/engine.cpp:444
+#: engines/engine.cpp:449
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 "
@@ -1394,35 +1396,760 @@ msgstr ""
"ßÞÔÔÕàÖØÒÐÕâáï ScummVM ßÞÛÝÞáâìî. ¾ÝÐ, áÚÞàÕÕ ÒáÕÓÞ, ÝÕ ÑãÔÕâ àÐÑÞâÐâì "
"áâÐÑØÛìÝÞ, Ø áÞåàÐÝÕÝØï ØÓà ÜÞÓãâ ÝÕ àÐÑÞâÐâì Ò ÑãÔãéØå ÒÕàáØïå ScummVM."
-#: engines/engine.cpp:447
+#: engines/engine.cpp:452
msgid "Start anyway"
msgstr "²áñ àÐÒÝÞ ×ÐßãáâØâì"
-#: engines/agi/detection.cpp:142 engines/drascula/detection.cpp:270
-#: engines/dreamweb/detection.cpp:47 engines/sci/detection.cpp:393
-#: engines/toltecs/detection.cpp:173
+#: audio/fmopl.cpp:50
+msgid "MAME OPL emulator"
+msgstr "ÍÜãÛïâÞà MAME OPL"
+
+#: audio/fmopl.cpp:52
+msgid "DOSBox OPL emulator"
+msgstr "ÍÜãÛïâÞà DOSBox OPL"
+
+#: audio/mididrv.cpp:209
+#, c-format
+msgid ""
+"The selected audio device '%s' was not found (e.g. might be turned off or "
+"disconnected)."
+msgstr ""
+"²ëÑàÐÝÝÞÕ ×ÒãÚÞÒÞÕ ãáâàÞÙáâÒÞ '%s' ÝÕ ÑëÛÞ ÝÐÙÔÕÝÞ (ÒÞ×ÜÞÖÝÞ, ÞÝÞ ÒëÚÛîçÕÝÞ "
+"ØÛØ ÝÕ ßÞÔÚÛîçÕÝÞ)."
+
+#: audio/mididrv.cpp:209 audio/mididrv.cpp:221 audio/mididrv.cpp:257
+#: audio/mididrv.cpp:272
+msgid "Attempting to fall back to the next available device..."
+msgstr "¿ëâÐîáì ØáßÞÛì×ÞÒÐâì ÔàãÓÞÕ ÔÞáâãßÝÞÕ ãáâàÞÙáâÒÞ..."
+
+#: audio/mididrv.cpp:221
+#, c-format
+msgid ""
+"The selected audio device '%s' cannot be used. See log file for more "
+"information."
+msgstr ""
+"²ëÑàÐÝÝÞÕ ×ÒãÚÞÒÞÕ ãáâàÞÙáâÒÞ '%s' ÝÕ ÜÞÖÕâ Ñëâì ØáßÞÛì×ÞÒÐÝÞ. ÁÜÞâàØâÕ äÐÙÛ "
+"ßàÞâÞÚÞÛÐ ÔÛï ÑÞÛÕÕ ßÞÔàÞÑÝÞÙ ØÝäÞàÜÐæØØ."
+
+#: audio/mididrv.cpp:257
+#, c-format
+msgid ""
+"The preferred audio device '%s' was not found (e.g. might be turned off or "
+"disconnected)."
+msgstr ""
+"¿àÕÔßÞçâØâÕÛìÝÞÕ ×ÒãÚÞÒÞÕ ãáâàÞÙáâÒÞ '%s' ÝÕ ÑëÛÞ ÝÐÙÔÕÝÞ (ÒÞ×ÜÞÖÝÞ, ÞÝÞ "
+"ÒëÚÛîçÕÝÞ ØÛØ ÝÕ ßÞÔÚÛîçÕÝÞ)."
+
+#: audio/mididrv.cpp:272
+#, c-format
+msgid ""
+"The preferred audio device '%s' cannot be used. See log file for more "
+"information."
+msgstr ""
+"¿àÕÔßÞçâØâÕÛìÝÞÕ ×ÒãÚÞÒÞÕ ãáâàÞÙáâÒÞ '%s' ÝÕ ÜÞÖÕâ Ñëâì ØáßÞÛì×ÞÒÐÝÞ. "
+"ÁÜÞâàØâÕ äÐÙÛ ßàÞâÞÚÞÛÐ ÔÛï ÑÞÛÕÕ ßÞÔàÞÑÝÞÙ ØÝäÞàÜÐæØØ."
+
+#: audio/null.h:44
+msgid "No music"
+msgstr "±Õ× Üã×ëÚØ"
+
+#: audio/mods/paula.cpp:196
+msgid "Amiga Audio Emulator"
+msgstr "ÍÜãÛïâÞà ×ÒãÚÐ Amiga"
+
+#: audio/softsynth/adlib.cpp:2285
+msgid "AdLib Emulator"
+msgstr "ÍÜãÛïâÞà AdLib"
+
+#: audio/softsynth/appleiigs.cpp:33
+msgid "Apple II GS Emulator (NOT IMPLEMENTED)"
+msgstr "ÍÜãÛïâÞà Apple II GS (ÞâáãâáâÒãÕâ)"
+
+#: audio/softsynth/sid.cpp:1430
+msgid "C64 Audio Emulator"
+msgstr "ÍÜãÛïâÞà ×ÒãÚÐ C64"
+
+#: audio/softsynth/mt32.cpp:200
+msgid "Initializing MT-32 Emulator"
+msgstr "½ÐáâàÐØÒÐî íÜãÛïâÞà MT-32"
+
+#: audio/softsynth/mt32.cpp:426
+msgid "MT-32 Emulator"
+msgstr "ÍÜãÛïâÞà MT-32"
+
+#: audio/softsynth/pcspk.cpp:139
+msgid "PC Speaker Emulator"
+msgstr "ÍÜãÛïâÞà PC áߨÚÕàÐ"
+
+#: audio/softsynth/pcspk.cpp:158
+msgid "IBM PCjr Emulator"
+msgstr "ÍÜãÛïâÞà IBM PCjr"
+
+#: backends/keymapper/remap-dialog.cpp:48
+msgid "Keymap:"
+msgstr "ÂÐÑÛØæÐ ÚÛÐÒØè:"
+
+#: backends/keymapper/remap-dialog.cpp:67
+msgid " (Effective)"
+msgstr " (´ÕÙáâÒãîéÐï)"
+
+#: backends/keymapper/remap-dialog.cpp:107
+msgid " (Active)"
+msgstr " (°ÚâØÒÝÐï)"
+
+#: backends/keymapper/remap-dialog.cpp:107
+msgid " (Blocked)"
+msgstr " (·ÐÑÛÞÚØàÞÒÐÝÐ)"
+
+#: backends/keymapper/remap-dialog.cpp:120
+msgid " (Global)"
+msgstr " (³ÛÞÑÐÛìÝÐï)"
+
+#: backends/keymapper/remap-dialog.cpp:128
+msgid " (Game)"
+msgstr " (¸Óàë)"
+
+#: backends/midi/windows.cpp:165
+msgid "Windows MIDI"
+msgstr "Windows MIDI"
+
+#: backends/platform/ds/arm9/source/dsoptions.cpp:56
+#: engines/scumm/dialogs.cpp:291
+msgid "~C~lose"
+msgstr "~·~ÐÚàëâì"
+
+#: backends/platform/ds/arm9/source/dsoptions.cpp:57
+msgid "ScummVM Main Menu"
+msgstr "³ÛÐÒÝÞÕ ÜÕÝî ScummVM"
+
+#: backends/platform/ds/arm9/source/dsoptions.cpp:63
+msgid "~L~eft handed mode"
+msgstr "»ÕÒÞàãÚØÙ àÕÖØÜ"
+
+#: backends/platform/ds/arm9/source/dsoptions.cpp:64
+msgid "~I~ndy fight controls"
+msgstr "ÃßàÐÒÛÕÝØÕ ÑÞïÜØ Ò Indy"
+
+#: backends/platform/ds/arm9/source/dsoptions.cpp:65
+msgid "Show mouse cursor"
+msgstr "¿ÞÚÐ×ëÒÐâì ÚãàáÞà ÜëèØ"
+
+#: backends/platform/ds/arm9/source/dsoptions.cpp:66
+msgid "Snap to edges"
+msgstr "¿àØÚàÕߨâì Ú ÓàÐÝØæÐÜ"
+
+#: backends/platform/ds/arm9/source/dsoptions.cpp:68
+msgid "Touch X Offset"
+msgstr "ÁÜÕéÕÝØÕ ÚÐáÐÝØÙ ßÞ ÞáØ X"
+
+#: backends/platform/ds/arm9/source/dsoptions.cpp:75
+msgid "Touch Y Offset"
+msgstr "ÁÜÕéÕÝØÕ ÚÐáÐÝØÙ ßÞ ÞáØ Y"
+
+#: backends/platform/ds/arm9/source/dsoptions.cpp:87
+msgid "Use laptop trackpad-style cursor control"
+msgstr "¸áßÞÛì×ÞÒÐâì ãßàÐÒÛÕÝØÕ ÚãàáÞàÞÜ ÚÐÚ ÝÐ âàÕÚßÐÔÕ ÛÕßâÞßÞÒ"
+
+#: backends/platform/ds/arm9/source/dsoptions.cpp:88
+msgid "Tap for left click, double tap right click"
+msgstr "ÂÐß ÔÛï ÛÕÒÞÓÞ éÕÛçÚÐ, ÔÒÞÙÝÞÙ âÐß ÔÛï ßàÐÒÞÓÞ éÕÛçÚÐ"
+
+#: backends/platform/ds/arm9/source/dsoptions.cpp:90
+msgid "Sensitivity"
+msgstr "ÇãÒáâÒØâÕÛìÝÞáâì"
+
+#: backends/platform/ds/arm9/source/dsoptions.cpp:99
+msgid "Initial top screen scale:"
+msgstr "½ÐçÐÛìÝëÙ ÜÐáèâÐÑ ÒÕàåÝÕÓÞ íÚàÐÝÐ:"
+
+#: backends/platform/ds/arm9/source/dsoptions.cpp:105
+msgid "Main screen scaling:"
+msgstr "¼ÐáèâÐÑ ÓÛÐÒÝÞÓÞ íÚàÐÝÐ:"
+
+#: backends/platform/ds/arm9/source/dsoptions.cpp:107
+msgid "Hardware scale (fast, but low quality)"
+msgstr "ÅÐàÔÒÐàÝÞÕ ÜÐáèâÐÑØàÞÒÐÝØÕ (ÑëáâàÞ, ÝÞ ÝØ×ÚÞÓÞ ÚÐçÕáâÒÐ)"
+
+#: backends/platform/ds/arm9/source/dsoptions.cpp:108
+msgid "Software scale (good quality, but slower)"
+msgstr "¿àÞÓàÐÜÜÝÞÕ ÜÐáèâÐÑØàÞÒÐÝØÕ (åÞàÞèÕÕ ÚÐçÕáâÒÞ, ÝÞ ÜÕÔÛÕÝÝÕÕ)"
+
+#: backends/platform/ds/arm9/source/dsoptions.cpp:109
+msgid "Unscaled (you must scroll left and right)"
+msgstr "±Õ× ÜÐáèâÐÑØàÞÒÐÝØï (ÝãÖÝÞ ÑãÔÕâ ßàÞÚàãçØÒÐâì ÒÛÕÒÞ Ø ÒßàÐÒÞ)"
+
+#: backends/platform/ds/arm9/source/dsoptions.cpp:111
+msgid "Brightness:"
+msgstr "ÏàÚÞáâì:"
+
+#: backends/platform/ds/arm9/source/dsoptions.cpp:121
+msgid "High quality audio (slower) (reboot)"
+msgstr "²ëáÞÚÞÕ ÚÐçÕáâÒÞ ×ÒãÚÐ (ÜÕÔÛÕÝÝÕÕ) (àÕÑãâ)"
+
+#: backends/platform/ds/arm9/source/dsoptions.cpp:122
+msgid "Disable power off"
+msgstr "·ÐßàÕâØâì ÒëÚÛîçÕÝØÕ"
+
+#: backends/platform/iphone/osys_events.cpp:300
+msgid "Mouse-click-and-drag mode enabled."
+msgstr "ÀÕÖØÜ ÜëèØ ÝÐÖÐâì-Ø-âïÝãâì ÒÚÛîçñÝ."
+
+#: backends/platform/iphone/osys_events.cpp:302
+msgid "Mouse-click-and-drag mode disabled."
+msgstr "ÀÕÖØÜ ÜëèØ ÝÐÖÐâì-Ø-âïÝãâì ÒëÚÛîçÕÝ."
+
+#: backends/platform/iphone/osys_events.cpp:313
+msgid "Touchpad mode enabled."
+msgstr "ÀÕÖØÜ âÐçßÐÔÐ ÒÚÛîçñÝ."
+
+#: backends/platform/iphone/osys_events.cpp:315
+msgid "Touchpad mode disabled."
+msgstr "ÀÕÖØÜ âÐçßÐÔÐ ÒëÚÛîçÕÝ."
+
+#: backends/platform/maemo/maemo.cpp:209
+msgid "Click Mode"
+msgstr "ÀÕÖØÜ éÕÛçÚÐ"
+
+#: backends/platform/maemo/maemo.cpp:215
+#: backends/platform/symbian/src/SymbianActions.cpp:42
+#: backends/platform/wince/CEActionsPocket.cpp:60
+#: backends/platform/wince/CEActionsSmartphone.cpp:43
+#: backends/platform/tizen/form.cpp:275
+msgid "Left Click"
+msgstr "»ÕÒëÙ éÕÛçÞÚ"
+
+#: backends/platform/maemo/maemo.cpp:218
+msgid "Middle Click"
+msgstr "ÁàÕÔÝØÙ éÕÛçÞÚ"
+
+#: backends/platform/maemo/maemo.cpp:221
+#: backends/platform/symbian/src/SymbianActions.cpp:43
+#: backends/platform/wince/CEActionsSmartphone.cpp:44
+#: backends/platform/tizen/form.cpp:267
+msgid "Right Click"
+msgstr "¿àÐÒëÙ éÕÛçÞÚ"
+
+#: backends/platform/sdl/macosx/appmenu_osx.mm:77
+msgid "Hide ScummVM"
+msgstr "ÁÚàëâì ScummVM"
+
+#: backends/platform/sdl/macosx/appmenu_osx.mm:82
+msgid "Hide Others"
+msgstr "ÁÚàëâì ÞáâÐÛìÝëÕ"
+
+#: backends/platform/sdl/macosx/appmenu_osx.mm:87
+msgid "Show All"
+msgstr "¿ÞÚÐ×Ðâì ÒáÕ"
+
+#: backends/platform/sdl/macosx/appmenu_osx.mm:109
+#: backends/platform/sdl/macosx/appmenu_osx.mm:120
+msgid "Window"
+msgstr "¾ÚÝÞ"
+
+#: backends/platform/sdl/macosx/appmenu_osx.mm:114
+msgid "Minimize"
+msgstr "ÃÑàÐâì Ò Dock"
+
+#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:46
+msgid "Normal (no scaling)"
+msgstr "±Õ× ãÒÕÛØçÕÝØï"
+
+#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:65
+msgctxt "lowres"
+msgid "Normal (no scaling)"
+msgstr "±Õ× ãÒÕÛØçÕÝØï"
+
+#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2148
+msgid "Enabled aspect ratio correction"
+msgstr "ºÞààÕÚæØï áÞÞâÝÞèÕÝØï áâÞàÞÝ ÒÚÛîçÕÝÐ"
+
+#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2154
+msgid "Disabled aspect ratio correction"
+msgstr "ºÞààÕÚæØï áÞÞâÝÞèÕÝØï áâÞàÞÝ ÒëÚÛîçÕÝÐ"
+
+#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2209
+msgid "Active graphics filter:"
+msgstr "°ÚâØÒÝëÙ ÓàÐäØçÕáÚØÙ äØÛìâà:"
+
+#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2251
+msgid "Windowed mode"
+msgstr "¾ÚÞÝÝëÙ àÕÖØÜ"
+
+#: backends/graphics/opengl/opengl-graphics.cpp:118
+#, fuzzy
+msgid "OpenGL"
+msgstr "¾âÚàëâì"
+
+#: backends/graphics/opengl/opengl-graphics.cpp:119
+msgid "OpenGL (No filtering)"
+msgstr ""
+
+#: backends/platform/symbian/src/SymbianActions.cpp:38
+#: backends/platform/wince/CEActionsSmartphone.cpp:39
+msgid "Up"
+msgstr "²ÒÕàå"
+
+#: backends/platform/symbian/src/SymbianActions.cpp:39
+#: backends/platform/wince/CEActionsSmartphone.cpp:40
+msgid "Down"
+msgstr "²ÝØ×"
+
+#: backends/platform/symbian/src/SymbianActions.cpp:40
+#: backends/platform/wince/CEActionsSmartphone.cpp:41
+msgid "Left"
+msgstr "²ÛÕÒÞ"
+
+#: backends/platform/symbian/src/SymbianActions.cpp:41
+#: backends/platform/wince/CEActionsSmartphone.cpp:42
+msgid "Right"
+msgstr "²ßàÐÒÞ"
+
+#: backends/platform/symbian/src/SymbianActions.cpp:46
+#: backends/platform/wince/CEActionsSmartphone.cpp:47
+msgid "Zone"
+msgstr "·ÞÝÐ"
+
+#: backends/platform/symbian/src/SymbianActions.cpp:47
+#: backends/platform/wince/CEActionsPocket.cpp:54
+#: backends/platform/wince/CEActionsSmartphone.cpp:48
+msgid "Multi Function"
+msgstr "¼ãÛìâØäãÝÚæØï"
+
+#: backends/platform/symbian/src/SymbianActions.cpp:48
+msgid "Swap character"
+msgstr "ÁÜÕÝØâì ÓÕàÞï"
+
+#: backends/platform/symbian/src/SymbianActions.cpp:49
+msgid "Skip text"
+msgstr "¿àÞßãáâØâì âÕÚáâ"
+
+#: backends/platform/symbian/src/SymbianActions.cpp:51
+msgid "Fast mode"
+msgstr "±ëáâàëÙ àÕÖØÜ"
+
+#: 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:218
+#: engines/scumm/dialogs.cpp:192 engines/scumm/help.cpp:82
+#: engines/scumm/help.cpp:84
+msgid "Quit"
+msgstr "²ëåÞÔ"
+
+#: backends/platform/symbian/src/SymbianActions.cpp:53
+msgid "Debugger"
+msgstr "¾âÛÐÔçØÚ"
+
+#: backends/platform/symbian/src/SymbianActions.cpp:54
+msgid "Global menu"
+msgstr "³ÛÞÑÐÛìÝÞÕ ÜÕÝî"
+
+#: backends/platform/symbian/src/SymbianActions.cpp:55
+msgid "Virtual keyboard"
+msgstr "²ØàâãÐÛìÝÐï ÚÛÐÒØÐâãàÐ"
+
+#: backends/platform/symbian/src/SymbianActions.cpp:56
+msgid "Key mapper"
+msgstr "½Ð×ÝÐçÕÝØÕ ÚÛÐÒØè"
+
+#: backends/events/symbiansdl/symbiansdl-events.cpp:184
+msgid "Do you want to quit ?"
+msgstr "²ë ÔÕÙáâÒØâÕÛìÝÞ åÞâØâÕ ÒëÙâØ?"
+
+#: backends/platform/wii/options.cpp:51
+msgid "Video"
+msgstr "²ØÔÕÞ"
+
+#: backends/platform/wii/options.cpp:54
+msgid "Current video mode:"
+msgstr "ÂÕÚãéØÙ ÒØÔÕÞàÕÖØÜ:"
+
+#: backends/platform/wii/options.cpp:56
+msgid "Double-strike"
+msgstr "´ÒÞÙÝÞÙ ãÔÐà"
+
+#: backends/platform/wii/options.cpp:60
+msgid "Horizontal underscan:"
+msgstr "³ÞàØ×ÞÝâÐÛìÝëÙ underscan:"
+
+#: backends/platform/wii/options.cpp:66
+msgid "Vertical underscan:"
+msgstr "²ÕàâØÚÐÛìÝëÙ underscan:"
+
+#: backends/platform/wii/options.cpp:71
+msgid "Input"
+msgstr "²ÒÞÔ"
+
+#: backends/platform/wii/options.cpp:74
+msgid "GC Pad sensitivity:"
+msgstr "ÇãÒáâÒØâÕÛìÝÞáâì GC ßÐÔÐ:"
+
+#: backends/platform/wii/options.cpp:80
+msgid "GC Pad acceleration:"
+msgstr "ÃáÚÞàÕÝØÕ GC ßÐÔÐ:"
+
+#: backends/platform/wii/options.cpp:86
+msgid "DVD"
+msgstr "DVD"
+
+#: backends/platform/wii/options.cpp:89 backends/platform/wii/options.cpp:101
+msgid "Status:"
+msgstr "ÁÞáâÞïÝØÕ:"
+
+#: backends/platform/wii/options.cpp:90 backends/platform/wii/options.cpp:102
+msgid "Unknown"
+msgstr "½ÕØ×ÒÕáâÝÞ"
+
+#: backends/platform/wii/options.cpp:93
+msgid "Mount DVD"
+msgstr "¿ÞÔÚÛîçØâì DVD"
+
+#: backends/platform/wii/options.cpp:94
+msgid "Unmount DVD"
+msgstr "¾âÚÛîçØâì DVD"
+
+#: backends/platform/wii/options.cpp:98
+msgid "SMB"
+msgstr "SMB"
+
+#: backends/platform/wii/options.cpp:106
+msgid "Server:"
+msgstr "ÁÕàÒÕà:"
+
+#: backends/platform/wii/options.cpp:110
+msgid "Share:"
+msgstr "ÁÕâÕÒÐï ßÐßÚÐ:"
+
+#: backends/platform/wii/options.cpp:114
+msgid "Username:"
+msgstr "¿ÞÛì×ÞÒÐâÕÛì:"
+
+#: backends/platform/wii/options.cpp:118
+msgid "Password:"
+msgstr "¿ÐàÞÛì:"
+
+#: backends/platform/wii/options.cpp:121
+msgid "Init network"
+msgstr "¸ÝØæØÐÛØ×ÐæØï áÕâØ"
+
+#: backends/platform/wii/options.cpp:123
+msgid "Mount SMB"
+msgstr "¿ÞÔÚÛîçØâì SMB"
+
+#: backends/platform/wii/options.cpp:124
+msgid "Unmount SMB"
+msgstr "¾âÚÛîçâì SMB"
+
+#: backends/platform/wii/options.cpp:143
+msgid "DVD Mounted successfully"
+msgstr "DVD ßÞÔÚÛîçÕÝ ãáßÕèÝÞ"
+
+#: backends/platform/wii/options.cpp:146
+msgid "Error while mounting the DVD"
+msgstr "¾èØÑÚÐ ÒÞ ÒàÕÜï ßÞÔÚÛîçÕÝØï DVD"
+
+#: backends/platform/wii/options.cpp:148
+msgid "DVD not mounted"
+msgstr "DVD ÝÕ ßÞÔÚÛîçÕÝ"
+
+#: backends/platform/wii/options.cpp:161
+msgid "Network up, share mounted"
+msgstr "ÁÕâì àÐÑÞâÐÕâ, ßÐßÚÐ ßÞÔÚÛîçÕÝÐ"
+
+#: backends/platform/wii/options.cpp:163
+msgid "Network up"
+msgstr "ÁÕâì àÐÑÞâÐÕâ"
+
+#: backends/platform/wii/options.cpp:166
+msgid ", error while mounting the share"
+msgstr ", ÞèØÑÚÐ ÒÞ ÒàÕÜï ßÞÔÚÛîçÕÝØï ßÐßÚØ"
+
+#: backends/platform/wii/options.cpp:168
+msgid ", share not mounted"
+msgstr ", ßÐßÚÐ ÝÕ ßÞÔÚÛîçÕÝÐ"
+
+#: backends/platform/wii/options.cpp:174
+msgid "Network down"
+msgstr "ÁÕâì ÒëÚÛîçÕÝÐ"
+
+#: backends/platform/wii/options.cpp:178
+msgid "Initializing network"
+msgstr "½ÐáâàÐØÒÐî áÕâì"
+
+#: backends/platform/wii/options.cpp:182
+msgid "Timeout while initializing network"
+msgstr "²àÕÜï ßÞÔÚÛîçÕÝØï Ú áÕâØ ØáâÕÚÛÞ"
+
+#: backends/platform/wii/options.cpp:186
+#, c-format
+msgid "Network not initialized (%d)"
+msgstr "ÁÕâì ÝÕ ÝÐáâàÞØÛÐáì (%d)"
+
+#: backends/platform/wince/CEActionsPocket.cpp:46
+msgid "Hide Toolbar"
+msgstr "ÁßàïâÐâì ßÐÝÕÛì ØÝáâàãÜÕÝâÞÒ"
+
+#: backends/platform/wince/CEActionsPocket.cpp:47
+msgid "Show Keyboard"
+msgstr "¿ÞÚÐ×Ðâì ÚÛÐÒØÐâãàã"
+
+#: backends/platform/wince/CEActionsPocket.cpp:48
+msgid "Sound on/off"
+msgstr "·ÒãÚ ÒÚÛ/ÒëÚÛ"
+
+#: backends/platform/wince/CEActionsPocket.cpp:49
+msgid "Right click"
+msgstr "¿àÐÒëÙ éÕÛçÞÚ"
+
+#: backends/platform/wince/CEActionsPocket.cpp:50
+msgid "Show/Hide Cursor"
+msgstr "¿ÞÚÐ×Ðâì/ÃÑàÐâì ÚãàáÞà"
+
+#: backends/platform/wince/CEActionsPocket.cpp:51
+msgid "Free look"
+msgstr "ÁÒÞÑÞÔÝëÙ ÞÑ×Þà"
+
+#: backends/platform/wince/CEActionsPocket.cpp:52
+msgid "Zoom up"
+msgstr "ÃÒÕÛ. ÜÐáèâÐÑ"
+
+#: backends/platform/wince/CEActionsPocket.cpp:53
+msgid "Zoom down"
+msgstr "ÃÜÕÝìè. ÜÐáèâÐÑ"
+
+#: backends/platform/wince/CEActionsPocket.cpp:55
+#: backends/platform/wince/CEActionsSmartphone.cpp:49
+msgid "Bind Keys"
+msgstr "½Ð×ÝÐçØâì ÚÛÐÒØèØ"
+
+#: backends/platform/wince/CEActionsPocket.cpp:56
+msgid "Cursor Up"
+msgstr "ºãàáÞà ÒÒÕàå"
+
+#: backends/platform/wince/CEActionsPocket.cpp:57
+msgid "Cursor Down"
+msgstr "ºãàáÞà ÒÝØ×"
+
+#: backends/platform/wince/CEActionsPocket.cpp:58
+msgid "Cursor Left"
+msgstr "ºãàáÞà ÒÛÕÒÞ"
+
+#: backends/platform/wince/CEActionsPocket.cpp:59
+msgid "Cursor Right"
+msgstr "ºãàáÞà ÒßàÐÒÞ"
+
+#: 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:326
+#: backends/platform/wince/CEActionsSmartphone.cpp:287
+msgid " Are you sure you want to quit ? "
+msgstr " ²ë ãÒÕàÕÝë, çâÞ åÞâØâÕ ÒëÙâØ? "
+
+#: backends/platform/wince/CEActionsSmartphone.cpp:50
+msgid "Keyboard"
+msgstr "ºÛÐÒØÐâãàÐ"
+
+#: backends/platform/wince/CEActionsSmartphone.cpp:51
+msgid "Rotate"
+msgstr "¿ÞÒÕàÝãâì"
+
+#: backends/platform/wince/CELauncherDialog.cpp:56
+msgid "Using SDL driver "
+msgstr "¸áßÞÛì×ãî ÔàÐÙÒÕà SDL "
+
+#: backends/platform/wince/CELauncherDialog.cpp:60
+msgid "Display "
+msgstr "¿ÞÚÐ×Ðâì "
+
+#: backends/platform/wince/CELauncherDialog.cpp:83
+msgid "Do you want to perform an automatic scan ?"
+msgstr "²ë åÞâØâÕ ßàÞØ×ÒÕáâØ ÐÒâÞÜÐâØçÕáÚØÙ ßÞØáÚ?"
+
+#: backends/platform/wince/wince-sdl.cpp:516
+msgid "Map right click action"
+msgstr "½Ð×ÝÐçØâì ÔÕÙáâÒØÕ ßÞ ßàÐÒÞÜã éÕÛçÚã"
+
+#: backends/platform/wince/wince-sdl.cpp:520
+msgid "You must map a key to the 'Right Click' action to play this game"
+msgstr "²ë ÔÞÛÖÝë ÝÐ×ÝÐçØâì ÚÛÐÒØèã ÝÐ ÔÕÙáâÒØÕ 'Right Click' ÔÛï íâÞÙ ØÓàë"
+
+#: backends/platform/wince/wince-sdl.cpp:529
+msgid "Map hide toolbar action"
+msgstr "½Ð×ÝÐçØâì ÔÕÙáâÒØÕ 'áßàïâÐâì ßÐÝÕÛì ØÝáâàãÜÕÝâÞÒ'"
+
+#: backends/platform/wince/wince-sdl.cpp:533
+msgid "You must map a key to the 'Hide toolbar' action to play this game"
+msgstr "²ë ÔÞÛÖÝë ÝÐ×ÝÐçØâì ÚÛÐÒØèã ÝÐ ÔÕÙâáâÒØÕ 'Hide toolbar' ÔÛï íâÞÙ ØÓàë"
+
+#: backends/platform/wince/wince-sdl.cpp:542
+msgid "Map Zoom Up action (optional)"
+msgstr "½Ð×ÝÐçØâì ÔÕÙáâÒØÕ ÃÒÕÛØçØâì ¼ÐáèâÐÑ (ÝÕÞÑï×ÐâÕÛìÝÞ)"
+
+#: backends/platform/wince/wince-sdl.cpp:545
+msgid "Map Zoom Down action (optional)"
+msgstr "½Ð×ÝÐçØâì ÔÕÙáâÒØÕ ÃÜÕÝìèØâì ¼ÐáèâÐÑ (ÝÕÞÑï×ÐâÕÛìÝÞ)"
+
+#: backends/platform/wince/wince-sdl.cpp:553
+msgid ""
+"Don't forget to map a key to 'Hide Toolbar' action to see the whole inventory"
+msgstr ""
+"½Õ ×ÐÑãÔìâÕ ÝÐ×ÝÐçØâì ÚÛÐÒØèã ÔÛï ÔÕÙáâÒØï 'Hide Toolbar', çâÞÑë ãÒØÔÕâì "
+"ÒÕáì ØÝÒÕÝâÐàì Ò ØÓàÕ"
+
+#: backends/events/default/default-events.cpp:196
+msgid "Do you really want to return to the Launcher?"
+msgstr "²ë ÔÕÙáâÒØâÕÛìÝÞ åÞâØâÕ ÒÕàÝãâìáï Ò ÓÛÐÒÝÞÕ ÜÕÝî?"
+
+#: backends/events/default/default-events.cpp:196
+msgid "Launcher"
+msgstr "³ÛÐÒÝÞÕ ÜÕÝî"
+
+#: backends/events/default/default-events.cpp:218
+msgid "Do you really want to quit?"
+msgstr "²ë ÔÕÙáâÒØâÕÛìÝÞ åÞâØâÕ ÒëÙâØ?"
+
+#: backends/events/gph/gph-events.cpp:386
+#: backends/events/gph/gph-events.cpp:429
+#: backends/events/openpandora/op-events.cpp:168
+msgid "Touchscreen 'Tap Mode' - Left Click"
+msgstr "ÀÕÖØÜ 'ÚÐáÐÝØÙ' âÐçáÚàØÝÐ - »ÕÒëÙ ÚÛØÚ"
+
+#: backends/events/gph/gph-events.cpp:388
+#: backends/events/gph/gph-events.cpp:431
+#: backends/events/openpandora/op-events.cpp:170
+msgid "Touchscreen 'Tap Mode' - Right Click"
+msgstr "ÀÕÖØÜ 'ÚÐáÐÝØÙ' âÐçáÚàØÝÐ - ¿àÐÒëÙ ÚÛØÚ"
+
+#: backends/events/gph/gph-events.cpp:390
+#: backends/events/gph/gph-events.cpp:433
+#: backends/events/openpandora/op-events.cpp:172
+msgid "Touchscreen 'Tap Mode' - Hover (No Click)"
+msgstr "ÀÕÖØÜ 'ÚÐáÐÝØÙ' âÐçáÚàØÝÐ - ¿àÞÛñâ (ÑÕ× ÚÛØÚÐ)"
+
+#: backends/events/gph/gph-events.cpp:410
+msgid "Maximum Volume"
+msgstr "¼ÐÚáØÜÐÛìÝÐï ÓàÞÜÚÞáâì"
+
+#: backends/events/gph/gph-events.cpp:412
+msgid "Increasing Volume"
+msgstr "ÃÒÕÛØçÕÝØÕ ÓàÞÜÚÞáâØ"
+
+#: backends/events/gph/gph-events.cpp:418
+msgid "Minimal Volume"
+msgstr "¼ØÝØÜÐÛìÝÐï ÓàÞÜÚÞáâì"
+
+#: backends/events/gph/gph-events.cpp:420
+msgid "Decreasing Volume"
+msgstr "ÃÜÕÝìèÕÝØÕ ÓàÞÜÚÞáâØ"
+
+#: backends/events/openpandora/op-events.cpp:174
+msgid "Touchscreen 'Tap Mode' - Hover (DPad Clicks)"
+msgstr "ÀÕÖØÜ 'ÚÐáÐÝØÙ' âÐçáÚàØÝÐ - ¿àÞÛñâ (ÚÛØÚØ DPad)"
+
+#: backends/updates/macosx/macosx-updates.mm:67
+msgid "Check for Updates..."
+msgstr "¿àÞÒÕàïî ÞÑÝÞÒÛÕÝØï..."
+
+#: backends/platform/tizen/form.cpp:263
+msgid "Right Click Once"
+msgstr "¾ÔØÝ ßàÐÒëÙ éÕÛçÞÚ"
+
+#: backends/platform/tizen/form.cpp:271
+msgid "Move Only"
+msgstr "ÂÞÛìÚÞ ßÕàÕÜÕáâØâì"
+
+#: backends/platform/tizen/form.cpp:294
+msgid "Escape Key"
+msgstr "ºÛÐÒØèÐ ESC"
+
+#: backends/platform/tizen/form.cpp:299
+msgid "Game Menu"
+msgstr "¼ÕÝî ØÓàë"
+
+#: backends/platform/tizen/form.cpp:304
+msgid "Show Keypad"
+msgstr "¿ÞÚÐ×Ðâì ÚÛÐÒØÐâãàã"
+
+#: backends/platform/tizen/form.cpp:309
+msgid "Control Mouse"
+msgstr "ÃßàÐÒÛÕÝØÕ Üëèìî"
+
+#: backends/events/maemosdl/maemosdl-events.cpp:192
+msgid "Clicking Enabled"
+msgstr "ÉÕÛçÚØ ÒÚÛîçÕÝë"
+
+#: backends/events/maemosdl/maemosdl-events.cpp:192
+msgid "Clicking Disabled"
+msgstr "ÉÕÛçÚØ ÒëÚÛîçÕÝë"
+
+#: engines/agi/detection.cpp:142 engines/drascula/detection.cpp:302
+#: engines/dreamweb/detection.cpp:47 engines/neverhood/detection.cpp:160
+#: engines/sci/detection.cpp:394 engines/toltecs/detection.cpp:186
msgid "Use original save/load screens"
msgstr "¸áßÞÛì×ÞÒÐâì ÞàØÓØÝÐÛìÝëÕ íÚàÐÝë ×ÐߨáØ/çâÕÝØï ØÓàë"
-#: engines/agi/detection.cpp:143 engines/drascula/detection.cpp:271
-#: engines/dreamweb/detection.cpp:48 engines/sci/detection.cpp:394
-#: engines/toltecs/detection.cpp:174
+#: engines/agi/detection.cpp:143 engines/drascula/detection.cpp:303
+#: engines/dreamweb/detection.cpp:48 engines/neverhood/detection.cpp:161
+#: engines/sci/detection.cpp:395 engines/toltecs/detection.cpp:187
msgid "Use the original save/load screens, instead of the ScummVM ones"
msgstr ""
"¸áßÞÛì×ÞÒÐâì ÞàØÓØÝÐÛìÝëÕ íÚàÐÝë ×ÐßØáØ Ø áÞåàÐÝÕÝØï ØÓàë ÒÜÕáâÞ áÔÕÛÐÝÝëå Ò "
"ScummVM"
-#: engines/agi/saveload.cpp:816 engines/drascula/saveload.cpp:351
-#: engines/sci/engine/kfile.cpp:841 engines/toltecs/menu.cpp:259
+#: engines/agi/saveload.cpp:816 engines/drascula/saveload.cpp:349
+#: engines/neverhood/menumodule.cpp:886 engines/sci/engine/kfile.cpp:857
+#: engines/toltecs/menu.cpp:256
msgid "Restore game:"
msgstr "²ÞááâÐÝÞÒØâì ØÓàã:"
-#: engines/agi/saveload.cpp:816 engines/drascula/saveload.cpp:351
-#: engines/sci/engine/kfile.cpp:841 engines/toltecs/menu.cpp:259
+#: engines/agi/saveload.cpp:816 engines/drascula/saveload.cpp:349
+#: engines/neverhood/menumodule.cpp:886 engines/sci/engine/kfile.cpp:857
+#: engines/toltecs/menu.cpp:256
msgid "Restore"
msgstr "²ÞááâÐÝÞÒØâì"
-#: engines/drascula/saveload.cpp:49
+#: engines/agos/saveload.cpp:160 engines/scumm/scumm.cpp:2321
+#, c-format
+msgid ""
+"Failed to load game state from file:\n"
+"\n"
+"%s"
+msgstr ""
+"½Õ ãÔÐÛÞáì ×ÐÓàãרâì ØÓàã Ø× äÐÙÛÐ:\n"
+"\n"
+"%s"
+
+#: engines/agos/saveload.cpp:195 engines/scumm/scumm.cpp:2314
+#, c-format
+msgid ""
+"Failed to save game state to file:\n"
+"\n"
+"%s"
+msgstr ""
+"½Õ ãÔÐÛÞáì ×ÐߨáÐâì ØÓàã Ò äÐÙÛ:\n"
+"\n"
+"%s"
+
+#: engines/agos/saveload.cpp:203 engines/scumm/scumm.cpp:2332
+#, c-format
+msgid ""
+"Successfully saved game state in file:\n"
+"\n"
+"%s"
+msgstr ""
+"¸ÓàÐ ãáßÕèÝÞ áÞåàÐÝÕÝÐ Ò äÐÙÛ:\n"
+"\n"
+"%s"
+
+#: engines/agos/animation.cpp:557
+#, c-format
+msgid "Cutscene file '%s' not found!"
+msgstr "ÄÐÙÛ ×ÐáâÐÒÚØ '%s' ÝÕ ÝÐÙÔÕÝ!"
+
+#: engines/drascula/saveload.cpp:47
#, fuzzy
msgid ""
"ScummVM found that you have old savefiles for Drascula that should be "
@@ -1448,28 +2175,305 @@ msgstr "¸áßÞÛì×ÞÒÐâì àÕÖØÜ ïàÚÞÙ ßÐÛØâàë"
msgid "Display graphics using the game's bright palette"
msgstr "ÀØáãÕâ ÓàÐäØÚã á ØáßÞÛì×ÞÒÐÝØÕÜ ïàÚÞÙ ßÐÛØâàë ØÓàë"
-#: engines/sci/detection.cpp:373
+#: engines/gob/inter_playtoons.cpp:256 engines/gob/inter_v2.cpp:1470
+#: engines/tinsel/saveload.cpp:532
+msgid "Failed to load game state from file."
+msgstr "½Õ ãÔÐÛÞáì ×ÐÓàãרâì áÞåàÐÝñÝÝãî ØÓàã Ø× äÐÙÛÐ."
+
+#: engines/gob/inter_v2.cpp:1540 engines/tinsel/saveload.cpp:545
+msgid "Failed to save game state to file."
+msgstr "½Õ ãÔÐÛÞáì áÞåàÐÝØâì ØÓàã Ò äÐÙÛ."
+
+#: engines/gob/inter_v5.cpp:107
+msgid "Failed to delete file."
+msgstr "½Õ ãÔÐÛÞáì ãÔÐÛØâì äÐÙÛ."
+
+#: engines/groovie/detection.cpp:312
+msgid "Fast movie speed"
+msgstr "ÀÕÖØÜ ãáÚÞàÕÝÝÞÓÞ ÒØÔÕÞ"
+
+#: engines/groovie/detection.cpp:313
+msgid "Play movies at an increased speed"
+msgstr "²ÞáßàÞØ×ÒÞÔØâ ÒØÔÕÞàÞÛØÚØ á ãÒÕÛØçÕÝÝÞÙ áÚÞàÞáâìî"
+
+#: engines/groovie/script.cpp:399
+msgid "Failed to save game"
+msgstr "½Õ ãÔÐÛÞáì áÞåàÐÝØâì ØÓàã"
+
+#. I18N: Studio audience adds an applause and cheering sounds whenever
+#. Malcolm makes a joke.
+#: engines/kyra/detection.cpp:62
+msgid "Studio audience"
+msgstr "ÁâãÔØÙÝÐï ÐãÔØâÞàØï"
+
+#: engines/kyra/detection.cpp:63
+msgid "Enable studio audience"
+msgstr "²ÚÛîçØâì ×ÒãÚØ ÐãÔØâÞàØØ Ò áâãÔØØ"
+
+#. I18N: This option allows the user to skip text and cutscenes.
+#: engines/kyra/detection.cpp:73
+msgid "Skip support"
+msgstr "¿ÞÔÔÕàÖÚÐ ßàÞßãáÚÞÒ"
+
+#: engines/kyra/detection.cpp:74
+msgid "Allow text and cutscenes to be skipped"
+msgstr "²ÚÛîçÐÕâ ÒÞ×ÜÞÖÝÞáâì ßàÞßãáÚÐâì âÕÚáâë Ø ×ÐáâÐÒÚØ"
+
+#. I18N: Helium mode makes people sound like they've inhaled Helium.
+#: engines/kyra/detection.cpp:84
+msgid "Helium mode"
+msgstr "ÀÕÖØÜ ÓÕÛØï"
+
+#: engines/kyra/detection.cpp:85
+msgid "Enable helium mode"
+msgstr "²ÚÛîçØâì àÕÖØÜ ÓÕÛØï"
+
+#. I18N: When enabled, this option makes scrolling smoother when
+#. changing from one screen to another.
+#: engines/kyra/detection.cpp:99
+msgid "Smooth scrolling"
+msgstr "¿ÛÐÒÝÐï ßàÞÚàãâÚÐ"
+
+#: engines/kyra/detection.cpp:100
+msgid "Enable smooth scrolling when walking"
+msgstr "²ÚÛîçØâì ßÛÐÒÝãî ßàÞÚàãâÚã ÒÞ ÒàÕÜï åÞÔìÑë"
+
+#. I18N: When enabled, this option changes the cursor when it floats to the
+#. edge of the screen to a directional arrow. The player can then click to
+#. walk towards that direction.
+#: engines/kyra/detection.cpp:112
+msgid "Floating cursors"
+msgstr "¿ÛÐÒÐîéØÕ ÚãàáÞàë"
+
+#: engines/kyra/detection.cpp:113
+msgid "Enable floating cursors"
+msgstr "²ÚÛîçØâì ßÛÐÒÐîéØÕ ÚãàáÞàë"
+
+#. I18N: HP stands for Hit Points
+#: engines/kyra/detection.cpp:127
+msgid "HP bar graphs"
+msgstr "¿ÞÛÞáÚØ ×ÔÞàÞÒìï"
+
+#: engines/kyra/detection.cpp:128
+msgid "Enable hit point bar graphs"
+msgstr "²ÚÛîçØâì ÞâÞÑàÐÖÕÝØÕ ßÞÛÞáÞÚ ×ÔÞàÞÒìï"
+
+#: engines/kyra/lol.cpp:478
+msgid "Attack 1"
+msgstr "°âÐÚÐ 1"
+
+#: engines/kyra/lol.cpp:479
+msgid "Attack 2"
+msgstr "°âÐÚÐ 2"
+
+#: engines/kyra/lol.cpp:480
+msgid "Attack 3"
+msgstr "°âÐÚÐ 3"
+
+#: engines/kyra/lol.cpp:481
+msgid "Move Forward"
+msgstr "¸ÔâØ ÒßÕàñÔ"
+
+#: engines/kyra/lol.cpp:482
+msgid "Move Back"
+msgstr "¸ÔâØ ÝÐ×ÐÔ"
+
+#: engines/kyra/lol.cpp:483
+msgid "Slide Left"
+msgstr "ÁÚÞÛìרâì ÒÛÕÒÞ"
+
+#: engines/kyra/lol.cpp:484
+msgid "Slide Right"
+msgstr "ÁÚÞÛìרâì ÒßàÐÒÞ"
+
+#: engines/kyra/lol.cpp:485 engines/pegasus/pegasus.cpp:2509
+msgid "Turn Left"
+msgstr "¿ÞÒÞàÞâ ÝÐÛÕÒÞ"
+
+#: engines/kyra/lol.cpp:486 engines/pegasus/pegasus.cpp:2510
+msgid "Turn Right"
+msgstr "¿ÞÒÞàÞâ ÝÐßàÐÒÞ"
+
+#: engines/kyra/lol.cpp:487
+msgid "Rest"
+msgstr "¾âÔÞåÝãâì"
+
+#: engines/kyra/lol.cpp:488
+msgid "Options"
+msgstr "¾ßæØØ"
+
+#: engines/kyra/lol.cpp:489
+msgid "Choose Spell"
+msgstr "²ëÑàÐâì ×ÐÚÛØÝÐÝØÕ"
+
+#: engines/kyra/sound_midi.cpp:477
+msgid ""
+"You appear to be using a General MIDI device,\n"
+"but your game only supports Roland MT32 MIDI.\n"
+"We try to map the Roland MT32 instruments to\n"
+"General MIDI ones. It is still possible that\n"
+"some tracks sound incorrect."
+msgstr ""
+"ºÐÖÕâáï, Òë ßëâÐÕâÕáì ØáßÞÛì×ÞÒÐâì ãáâàÞÙáâÒÞ\n"
+"General MIDI, ÝÞ íâÐ ØÓàÐ ßÞÔÔÕàÖØÒÐÕâ âÞÛìÚÞ\n"
+"Roland MT32 MIDI. ¼ë ßÞßàÞÑãÕÜ ßÞÔÞÑàÐâì General\n"
+"MIDI ØÝáâàãÜÕÝâë, ßÞåÞÖØÕ ÝÐ Roland MT32, ÝÞ\n"
+"ÜÞÖÕâ âÐÚ ßÞÛãçØâìáï, çâÞ ÝÕÚÞâÞàëÕ âàÕÚØ ÑãÔãâ\n"
+"áëÓàÐÝë ÝÕÒÕàÝÞ."
+
+#. I18N: Option for fast scene switching
+#: engines/mohawk/dialogs.cpp:92 engines/mohawk/dialogs.cpp:167
+msgid "~Z~ip Mode Activated"
+msgstr "ÀÕÖØÜ ÑëáâàÞÓÞ ßÕàÕåÞÔÐ ÐÚâØÒØàÞÒÐÝ"
+
+#: engines/mohawk/dialogs.cpp:93
+msgid "~T~ransitions Enabled"
+msgstr "¿ÕàÕåÞÔë ÐÚâØÒØàÞÒÐÝë"
+
+#. I18N: Drop book page
+#: engines/mohawk/dialogs.cpp:95
+msgid "~D~rop Page"
+msgstr "²ëÑàÞáØâì áâàÐÝØæã"
+
+#: engines/mohawk/dialogs.cpp:99
+msgid "~S~how Map"
+msgstr "¿ÞÚÐ×Ðâì ÚÐàâã"
+
+#: engines/mohawk/dialogs.cpp:105
+msgid "~M~ain Menu"
+msgstr "³ÛÐÒÝÞÕ ÜÕÝî"
+
+#: engines/mohawk/dialogs.cpp:168
+msgid "~W~ater Effect Enabled"
+msgstr "ÍääÕÚâë ÒÞÔë ÒÚÛîçÕÝë"
+
+#: engines/neverhood/detection.cpp:167
+msgid "Skip the Hall of Records storyboard scenes"
+msgstr ""
+
+#: engines/neverhood/detection.cpp:168
+msgid "Allows the player to skip past the Hall of Records storyboard scenes"
+msgstr ""
+
+#: engines/neverhood/detection.cpp:174
+msgid "Scale the making of videos to full screen"
+msgstr ""
+
+#: engines/neverhood/detection.cpp:175
+msgid "Scale the making of videos, so that they use the whole screen"
+msgstr ""
+
+#: engines/parallaction/saveload.cpp:133
+#, c-format
+msgid ""
+"Can't save game in slot %i\n"
+"\n"
+msgstr ""
+"½Õ ÜÞÓã áÞåàÐÝØâì ØÓàã Ò ßÞרæØî %i\n"
+"\n"
+
+#: engines/parallaction/saveload.cpp:204
+msgid "Loading game..."
+msgstr "·ÐÓàãÖÐî ØÓàã..."
+
+#: engines/parallaction/saveload.cpp:219
+msgid "Saving game..."
+msgstr "ÁÞåàÐÝïî ØÓàã..."
+
+#: engines/parallaction/saveload.cpp:272
+msgid ""
+"ScummVM found that you have old savefiles for Nippon Safes that should be "
+"renamed.\n"
+"The old names are 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 next time.\n"
+msgstr ""
+"ScummVM ÞÑÝÐàãÖØÛ ã ÒÐá áâÐàëÕ áÞåàÐÝÕÝØï ØÓàë Nippon Safes, ÚÞâÞàëÕ "
+"ÝÕÞÑåÞÔØÜÞ ßÕàÕØÜÕÝÞÒÐâì. ÁâÐàëÕ ÝÐ×ÒÐÝØï ÑÞÛìèÕ ÝÕ ßÞÔÔÕàÖØÒÐîâáï, Ø "
+"ßÞíâÞÜã Òë ÝÕ áÜÞÖÕâÕ ×ÐÓàãרâì áÞåàÐÝÕÝØï, ÕáÛØ ÝÕ ßÕàÕØÜÕÝãÕâÕ Øå.\n"
+"\n"
+"½ÐÖÜØâÕ ¾º, çâÞÑë ßÕàÕØÜÕÝÞÒÐâì Øå áÕÙçÐá, Ò ßàÞâØÒÝÞÜ áÛãçÐÕ íâÞ ÖÕ "
+"áÞÞÑéÕÝØÕ ßÞïÒØâáï ßàØ áÛÕÔãîéÕÜ ×ÐßãáÚÕ ØÓàë.\n"
+
+#: engines/parallaction/saveload.cpp:319
+msgid "ScummVM successfully converted all your savefiles."
+msgstr "ScummVM ãáßÕèÝÞ ßàÕÞÑàÐ×ÞÒÐÛ ÒáÕ ÒÐèØ áÞåàÐÝÕÝØï ØÓà."
+
+#: engines/parallaction/saveload.cpp:321
+msgid ""
+"ScummVM printed some warnings in your console window and can't guarantee all "
+"your files have been converted.\n"
+"\n"
+"Please report to the team."
+msgstr ""
+"ScummVM ÝÐߨáÐÛ ÝÕáÚÞÛìÚÞ ßàÕÔãßàÕÖÔÕÝØÙ Ò ÞÚÝÞ ÚÞÝáÞÛØ Ø ÝÕ áÜÞÓ "
+"ßàÕÞÑàÐ×ÞÒÐâì ÒáÕ äÐÙÛë.\n"
+"\n"
+"¿ÞÖÐÛãÙáâÐ, áÞÞÑéØâÕ ÞÑ íâÞÜ ÚÞÜÐÝÔÕ ScummVM."
+
+#: engines/pegasus/pegasus.cpp:714
+msgid "Invalid save file name"
+msgstr "½ÕÒÕàÝÞÕ ØÜï äÐÙÛÐ áÞåàÐÝÕÝØï"
+
+#: engines/pegasus/pegasus.cpp:2507
+msgid "Up/Zoom In/Move Forward/Open Doors"
+msgstr "²ÒÕàå/ÃÜÕÝìèØâì ÜÐáèâÐÑ/²ßÕàñÔ/¾âàëâì ÔÒÕàØ"
+
+#: engines/pegasus/pegasus.cpp:2508
+msgid "Down/Zoom Out"
+msgstr "²ÝØ×/ÃÒÕÛ. ÜÐáèâÐÑ"
+
+#: engines/pegasus/pegasus.cpp:2511
+msgid "Display/Hide Inventory Tray"
+msgstr "¿ÞÚÐ×Ðâì/ÁßàïâÐâì ØÝÒÕÝâÐàì"
+
+#: engines/pegasus/pegasus.cpp:2512
+msgid "Display/Hide Biochip Tray"
+msgstr "¿ÞÚÐ×Ðâì/ÁßàïâÐâì ÑØÞçØß"
+
+#: engines/pegasus/pegasus.cpp:2513
+msgid "Action/Select"
+msgstr "´ÕÙáâÒØÕ/²ëÑÞà"
+
+#: engines/pegasus/pegasus.cpp:2514
+msgid "Toggle Center Data Display"
+msgstr "²ÚÛîçØâì ßÞÚÐ× ÔÐÝÝëå Ò æÕÝâàÕ íÚàÐÝÐ"
+
+#: engines/pegasus/pegasus.cpp:2515
+msgid "Display/Hide Info Screen"
+msgstr "¿ÞÚÐ×Ðâì/ÁßàïâÐâì ØÝäÞíÚàÐÝ"
+
+#: engines/pegasus/pegasus.cpp:2516
+msgid "Display/Hide Pause Menu"
+msgstr "¿ÞÚÐ×Ðâì/ÁßàïâÐâì ÜÕÝî ßÐã×ë"
+
+#: engines/pegasus/pegasus.cpp:2517
+msgid "???"
+msgstr "???"
+
+#: engines/sci/detection.cpp:374
msgid "EGA undithering"
msgstr "EGA ÑÕ× àÐáâàÐ"
-#: engines/sci/detection.cpp:374
+#: engines/sci/detection.cpp:375
msgid "Enable undithering in EGA games"
msgstr "²ÚÛîçÐÕâ àÕÖØÜ ÑÕ× àÐáâàØàÞÒÐÝØï Ò EGA ØÓàÐå"
-#: engines/sci/detection.cpp:383
+#: engines/sci/detection.cpp:384
msgid "Prefer digital sound effects"
msgstr "¿àÕÔßÞçØâÐâì æØäàÞÒëÕ ×ÒãÚÞÒëÕ íääÕÚâë"
-#: engines/sci/detection.cpp:384
+#: engines/sci/detection.cpp:385
msgid "Prefer digital sound effects instead of synthesized ones"
msgstr ""
"¾âÔÐÒÐâì ßàÕÔßÞçâÕÝØÕ æØäàÞÒëÜ ×ÒãÚÞÒëÜ íääÕÚâÐÜ ÒÜÕáâÞ áØÝâÕרàÞÒÐÝÝëå"
-#: engines/sci/detection.cpp:403
+#: engines/sci/detection.cpp:404
msgid "Use IMF/Yamaha FB-01 for MIDI output"
msgstr "¸áßÞÛì×ÞÒÐâì IMF/Yamaha FB-01 ÔÛï ÒëÒÞÔÐ MIDI"
-#: engines/sci/detection.cpp:404
+#: engines/sci/detection.cpp:405
msgid ""
"Use an IBM Music Feature card or a Yamaha FB-01 FM synth module for MIDI "
"output"
@@ -1477,168 +2481,150 @@ msgstr ""
"¸áßÞÛì×ÞÒÐâì ×ÒãÚÞÒãî ÚÐàâã IBM Music Feature ØÛØ ÜÞÔãÛì áØÝâÕ×Ð Yamaha "
"FB-01 FM ÔÛï MIDI"
-#: engines/sci/detection.cpp:414
+#: engines/sci/detection.cpp:415
msgid "Use CD audio"
msgstr "¸áßÞÛì×ÞÒÐâì CD ÐãÔØÞ"
-#: engines/sci/detection.cpp:415
+#: engines/sci/detection.cpp:416
msgid "Use CD audio instead of in-game audio, if available"
msgstr ""
"¸áßÞÛì×ÞÒÐâì ×ÒãÚÞÒëÕ ÔÞàÞÖÚØ á CD ÒÜÕáâÞ Üã×ëÚØ Ø× äÐÙÛÞÒ ØÓàë (ÕáÛØ "
"ÔÞáâãßÝÞ)"
-#: engines/sci/detection.cpp:425
+#: engines/sci/detection.cpp:426
msgid "Use Windows cursors"
msgstr "¸áßÞÛì×ÞÒÐâì ÚãàáÞàë Windows"
-#: engines/sci/detection.cpp:426
+#: engines/sci/detection.cpp:427
msgid ""
"Use the Windows cursors (smaller and monochrome) instead of the DOS ones"
msgstr ""
"¸áßÞÛì×ÞÒÐâì ÚãàáÞàë Windows (ÜÕÝìèØÕ ßÞ àÐ×ÜÕàã Ø ÞÔÝÞæÒÕâÝëÕ) ÒÜÕáâÞ "
"ÚãàáÞàÞÒ DOS"
-#: engines/sci/detection.cpp:436
+#: engines/sci/detection.cpp:437
msgid "Use silver cursors"
msgstr "¸áßÞÛì×ÞÒÐâì áÕàÕÑàïÝëÕ ÚãàáÞàë"
-#: engines/sci/detection.cpp:437
+#: engines/sci/detection.cpp:438
msgid ""
"Use the alternate set of silver cursors, instead of the normal golden ones"
msgstr ""
"¸áßÞÛì×ÞÒÐâì ÐÛìâÕàÝÐâØÒÝëÙ ÝÐÑÞà áÕàÕÑàïÝëå ÚãàáÞàÞÒ ÒÜÕáâÞ ÞÑëçÝëå ×ÞÛÞâëå"
-#: engines/scumm/dialogs.cpp:175
+#: engines/scumm/dialogs.cpp:176
#, c-format
msgid "Insert Disk %c and Press Button to Continue."
msgstr "²áâÐÒìâÕ ÔØáÚ %c Ø ÝÐÖÜØâÕ ÚÛÐÒØèã, çâÞÑë ßàÞÔÞÛÖØâì."
-#: engines/scumm/dialogs.cpp:176
+#: engines/scumm/dialogs.cpp:177
#, c-format
msgid "Unable to Find %s, (%c%d) Press Button."
msgstr "½Õ ãÔÐÛÞáì ÝÐÙâØ %s, (%c%d) ½ÐÖÜØâÕ ÚÛÐÒØèã."
-#: engines/scumm/dialogs.cpp:177
+#: engines/scumm/dialogs.cpp:178
#, c-format
msgid "Error reading disk %c, (%c%d) Press Button."
msgstr "¾èØÑÚÐ çâÕÝØï ÔØáÚÐ %c, (%c%d) ½ÐÖÜØâÕ ÚÛÐÒØèã."
-#: engines/scumm/dialogs.cpp:178
+#: engines/scumm/dialogs.cpp:179
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
+#: engines/scumm/dialogs.cpp:183
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
+#: engines/scumm/dialogs.cpp:185
msgid "Are you sure you want to quit? (Y/N)"
msgstr "²ë ãÒÕàÕÝë, çâÞ åÞâØâÕ ÒëÙâØ? (Y/N)"
-#: engines/scumm/dialogs.cpp:189
+#: engines/scumm/dialogs.cpp:190
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:215
-msgid "Quit"
-msgstr "²ëåÞÔ"
-
-#: engines/scumm/dialogs.cpp:193
+#: engines/scumm/dialogs.cpp:194
msgid "Insert save/load game disk"
msgstr "²áâÐÒìâÕ ÔØáÚ á áÞåàÐÝÕÝØïÜØ"
-#: engines/scumm/dialogs.cpp:194
+#: engines/scumm/dialogs.cpp:195
msgid "You must enter a name"
msgstr "²ë ÔÞÛÖÝë ÒÒÕáâØ ØÜï"
-#: engines/scumm/dialogs.cpp:195
+#: engines/scumm/dialogs.cpp:196
msgid "The game was NOT saved (disk full?)"
msgstr "¸ÓàÐ ½µ ±Ë»° ×ÐߨáÐÝÐ (ÔØáÚ ßÞÛÞÝ?)"
-#: engines/scumm/dialogs.cpp:196
+#: engines/scumm/dialogs.cpp:197
msgid "The game was NOT loaded"
msgstr "¸ÓàÐ ½µ ±Ë»° ×ÐÓàãÖÕÝÐ"
-#: engines/scumm/dialogs.cpp:197
+#: engines/scumm/dialogs.cpp:198
#, c-format
msgid "Saving '%s'"
msgstr "ÁÞåàÐÝïî '%s'"
-#: engines/scumm/dialogs.cpp:198
+#: engines/scumm/dialogs.cpp:199
#, c-format
msgid "Loading '%s'"
msgstr "·ÐÓàãÖÐî '%s'"
-#: engines/scumm/dialogs.cpp:199
+#: engines/scumm/dialogs.cpp:200
msgid "Name your SAVE game"
msgstr "½Ð×ÞÒØâÕ áÞåàÐÝÕÝØÕ ØÓàë"
-#: engines/scumm/dialogs.cpp:200
+#: engines/scumm/dialogs.cpp:201
msgid "Select a game to LOAD"
msgstr "²ëÑÕàØâÕ ØÓàã ÔÛï ×ÐÓàã×ÚØ"
-#: engines/scumm/dialogs.cpp:201
+#: engines/scumm/dialogs.cpp:202
msgid "Game title)"
msgstr "½Ð×ÒÐÝØÕ ØÓàë)"
#. I18N: Previous page button
-#: engines/scumm/dialogs.cpp:287
+#: engines/scumm/dialogs.cpp:288
msgid "~P~revious"
msgstr "~¿~àÕÔ"
#. I18N: Next page button
-#: engines/scumm/dialogs.cpp:289
+#: engines/scumm/dialogs.cpp:290
msgid "~N~ext"
msgstr "~Á~ÛÕÔ"
-#: engines/scumm/dialogs.cpp:290
-#: backends/platform/ds/arm9/source/dsoptions.cpp:56
-msgid "~C~lose"
-msgstr "~·~ÐÚàëâì"
-
-#: engines/scumm/dialogs.cpp:597
+#: engines/scumm/dialogs.cpp:598
msgid "Speech Only"
msgstr "ÂÞÛìÚÞ Þ×ÒãçÚÐ"
-#: engines/scumm/dialogs.cpp:598
+#: engines/scumm/dialogs.cpp:599
msgid "Speech and Subtitles"
msgstr "¾×ÒãçÚÐ Ø áãÑâØâàë"
-#: engines/scumm/dialogs.cpp:599
+#: engines/scumm/dialogs.cpp:600
msgid "Subtitles Only"
msgstr "ÂÞÛìÚÞ áãÑâØâàë"
-#: engines/scumm/dialogs.cpp:607
+#: engines/scumm/dialogs.cpp:608
msgctxt "lowres"
msgid "Speech & Subs"
msgstr "¾×ÒãçÚÐ Ø âÕÚáâ"
-#: engines/scumm/dialogs.cpp:653
+#: engines/scumm/dialogs.cpp:654
msgid "Select a Proficiency Level."
msgstr "²ëÑÕàØâÕ ãàÞÒÕÝì áÛÞÖÝÞáâØ."
-#: engines/scumm/dialogs.cpp:655
+#: engines/scumm/dialogs.cpp:656
msgid "Refer to your Loom(TM) manual for help."
msgstr "·Ð ßÞÜÞéìî ÞÑàÐâØâÕáì Ú ØÝáâã򾯯 Loom(TM)"
-#: engines/scumm/dialogs.cpp:658
-msgid "Standard"
-msgstr "ÁâÐÝÔÐàâÝëÙ"
-
-#: engines/scumm/dialogs.cpp:659
+#: engines/scumm/dialogs.cpp:660
msgid "Practice"
msgstr "¿àÐÚâØÚÐÝâ"
-#: engines/scumm/dialogs.cpp:660
+#: engines/scumm/dialogs.cpp:661
msgid "Expert"
msgstr "ÍÚáßÕàâ"
@@ -2155,7 +3141,7 @@ msgstr "»ÕâÕâì ÒßàÐÒÞ"
msgid "Fly to lower right"
msgstr "»ÕâÕâì ÒßàÐÒÞ-ÒÝØ×"
-#: engines/scumm/scumm.cpp:1776
+#: engines/scumm/scumm.cpp:1777
#, c-format
msgid ""
"Native MIDI support requires the Roland Upgrade from LucasArts,\n"
@@ -2164,40 +3150,7 @@ msgstr ""
"ÀÕÖØÜ \"àÞÔÝÞÓÞ\" MIDI âàÕÑãÕâ ÞÑÝÞÒÛÕÝØÕ Roland Upgrade Þâ\n"
"LucasArts, ÝÞ ÝÕ åÒÐâÐÕâ %s. ¿ÕàÕÚÛîçÐîáì ÝÐ AdLib."
-#: engines/scumm/scumm.cpp:2303 engines/agos/saveload.cpp:220
-#, c-format
-msgid ""
-"Failed to save game state to file:\n"
-"\n"
-"%s"
-msgstr ""
-"½Õ ãÔÐÛÞáì ×ÐߨáÐâì ØÓàã Ò äÐÙÛ:\n"
-"\n"
-"%s"
-
-#: engines/scumm/scumm.cpp:2310 engines/agos/saveload.cpp:185
-#, c-format
-msgid ""
-"Failed to load game state from file:\n"
-"\n"
-"%s"
-msgstr ""
-"½Õ ãÔÐÛÞáì ×ÐÓàãרâì ØÓàã Ø× äÐÙÛÐ:\n"
-"\n"
-"%s"
-
-#: engines/scumm/scumm.cpp:2322 engines/agos/saveload.cpp:228
-#, c-format
-msgid ""
-"Successfully saved game state in file:\n"
-"\n"
-"%s"
-msgstr ""
-"¸ÓàÐ ãáßÕèÝÞ áÞåàÐÝÕÝÐ Ò äÐÙÛ:\n"
-"\n"
-"%s"
-
-#: engines/scumm/scumm.cpp:2537
+#: engines/scumm/scumm.cpp:2547
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' "
@@ -2207,191 +3160,6 @@ msgstr ""
"ãÜÕÕâ. ÇâÞÑë áëÓàÐâì, ÝÐÖÜØâÕ '½ÞÒÐï ØÓàÐ' Ò áâÐàâÞÒÞÜ ÜÕÝî ScummVM, Ð ×ÐâÕÜ "
"ÒëÑÕàØâÕ ÔØàÕÚâÞàØî Maniac ÒÝãâàØ ÔØàÕÚâÞàØØ á ØÓàÞÙ Tentacle."
-#. I18N: Option for fast scene switching
-#: engines/mohawk/dialogs.cpp:92 engines/mohawk/dialogs.cpp:167
-msgid "~Z~ip Mode Activated"
-msgstr "ÀÕÖØÜ ÑëáâàÞÓÞ ßÕàÕåÞÔÐ ÐÚâØÒØàÞÒÐÝ"
-
-#: engines/mohawk/dialogs.cpp:93
-msgid "~T~ransitions Enabled"
-msgstr "¿ÕàÕåÞÔë ÐÚâØÒØàÞÒÐÝë"
-
-#. I18N: Drop book page
-#: engines/mohawk/dialogs.cpp:95
-msgid "~D~rop Page"
-msgstr "²ëÑàÞáØâì áâàÐÝØæã"
-
-#: engines/mohawk/dialogs.cpp:99
-msgid "~S~how Map"
-msgstr "¿ÞÚÐ×Ðâì ÚÐàâã"
-
-#: engines/mohawk/dialogs.cpp:105
-msgid "~M~ain Menu"
-msgstr "³ÛÐÒÝÞÕ ÜÕÝî"
-
-#: engines/mohawk/dialogs.cpp:168
-msgid "~W~ater Effect Enabled"
-msgstr "ÍääÕÚâë ÒÞÔë ÒÚÛîçÕÝë"
-
-#: engines/agos/animation.cpp:557
-#, c-format
-msgid "Cutscene file '%s' not found!"
-msgstr "ÄÐÙÛ ×ÐáâÐÒÚØ '%s' ÝÕ ÝÐÙÔÕÝ!"
-
-#: engines/gob/inter_playtoons.cpp:256 engines/gob/inter_v2.cpp:1287
-#: engines/tinsel/saveload.cpp:532
-msgid "Failed to load game state from file."
-msgstr "½Õ ãÔÐÛÞáì ×ÐÓàãרâì áÞåàÐÝñÝÝãî ØÓàã Ø× äÐÙÛÐ."
-
-#: engines/gob/inter_v2.cpp:1357 engines/tinsel/saveload.cpp:545
-msgid "Failed to save game state to file."
-msgstr "½Õ ãÔÐÛÞáì áÞåàÐÝØâì ØÓàã Ò äÐÙÛ."
-
-#: engines/gob/inter_v5.cpp:107
-msgid "Failed to delete file."
-msgstr "½Õ ãÔÐÛÞáì ãÔÐÛØâì äÐÙÛ."
-
-#: engines/groovie/detection.cpp:312
-msgid "Fast movie speed"
-msgstr "ÀÕÖØÜ ãáÚÞàÕÝÝÞÓÞ ÒØÔÕÞ"
-
-#: engines/groovie/detection.cpp:313
-msgid "Play movies at an increased speed"
-msgstr "²ÞáßàÞØ×ÒÞÔØâ ÒØÔÕÞàÞÛØÚØ á ãÒÕÛØçÕÝÝÞÙ áÚÞàÞáâìî"
-
-#: engines/groovie/script.cpp:420
-msgid "Failed to save game"
-msgstr "½Õ ãÔÐÛÞáì áÞåàÐÝØâì ØÓàã"
-
-#. I18N: Studio audience adds an applause and cheering sounds whenever
-#. Malcolm makes a joke.
-#: engines/kyra/detection.cpp:62
-msgid "Studio audience"
-msgstr "ÁâãÔØÙÝÐï ÐãÔØâÞàØï"
-
-#: engines/kyra/detection.cpp:63
-msgid "Enable studio audience"
-msgstr "²ÚÛîçØâì ×ÒãÚØ ÐãÔØâÞàØØ Ò áâãÔØØ"
-
-#. I18N: This option allows the user to skip text and cutscenes.
-#: engines/kyra/detection.cpp:73
-msgid "Skip support"
-msgstr "¿ÞÔÔÕàÖÚÐ ßàÞßãáÚÞÒ"
-
-#: engines/kyra/detection.cpp:74
-msgid "Allow text and cutscenes to be skipped"
-msgstr "²ÚÛîçÐÕâ ÒÞ×ÜÞÖÝÞáâì ßàÞßãáÚÐâì âÕÚáâë Ø ×ÐáâÐÒÚØ"
-
-#. I18N: Helium mode makes people sound like they've inhaled Helium.
-#: engines/kyra/detection.cpp:84
-msgid "Helium mode"
-msgstr "ÀÕÖØÜ ÓÕÛØï"
-
-#: engines/kyra/detection.cpp:85
-msgid "Enable helium mode"
-msgstr "²ÚÛîçØâì àÕÖØÜ ÓÕÛØï"
-
-#. I18N: When enabled, this option makes scrolling smoother when
-#. changing from one screen to another.
-#: engines/kyra/detection.cpp:99
-msgid "Smooth scrolling"
-msgstr "¿ÛÐÒÝÐï ßàÞÚàãâÚÐ"
-
-#: engines/kyra/detection.cpp:100
-msgid "Enable smooth scrolling when walking"
-msgstr "²ÚÛîçØâì ßÛÐÒÝãî ßàÞÚàãâÚã ÒÞ ÒàÕÜï åÞÔìÑë"
-
-#. I18N: When enabled, this option changes the cursor when it floats to the
-#. edge of the screen to a directional arrow. The player can then click to
-#. walk towards that direction.
-#: engines/kyra/detection.cpp:112
-msgid "Floating cursors"
-msgstr "¿ÛÐÒÐîéØÕ ÚãàáÞàë"
-
-#: engines/kyra/detection.cpp:113
-msgid "Enable floating cursors"
-msgstr "²ÚÛîçØâì ßÛÐÒÐîéØÕ ÚãàáÞàë"
-
-#. I18N: HP stands for Hit Points
-#: engines/kyra/detection.cpp:127
-msgid "HP bar graphs"
-msgstr "¿ÞÛÞáÚØ ×ÔÞàÞÒìï"
-
-#: engines/kyra/detection.cpp:128
-msgid "Enable hit point bar graphs"
-msgstr "²ÚÛîçØâì ÞâÞÑàÐÖÕÝØÕ ßÞÛÞáÞÚ ×ÔÞàÞÒìï"
-
-#: engines/kyra/lol.cpp:478
-msgid "Attack 1"
-msgstr "°âÐÚÐ 1"
-
-#: engines/kyra/lol.cpp:479
-msgid "Attack 2"
-msgstr "°âÐÚÐ 2"
-
-#: engines/kyra/lol.cpp:480
-msgid "Attack 3"
-msgstr "°âÐÚÐ 3"
-
-#: engines/kyra/lol.cpp:481
-msgid "Move Forward"
-msgstr "¸ÔâØ ÒßÕàñÔ"
-
-#: engines/kyra/lol.cpp:482
-msgid "Move Back"
-msgstr "¸ÔâØ ÝÐ×ÐÔ"
-
-#: engines/kyra/lol.cpp:483
-msgid "Slide Left"
-msgstr "ÁÚÞÛìרâì ÒÛÕÒÞ"
-
-#: engines/kyra/lol.cpp:484
-msgid "Slide Right"
-msgstr "ÁÚÞÛìרâì ÒßàÐÒÞ"
-
-#: engines/kyra/lol.cpp:485 engines/pegasus/pegasus.cpp:2447
-msgid "Turn Left"
-msgstr "¿ÞÒÞàÞâ ÝÐÛÕÒÞ"
-
-#: engines/kyra/lol.cpp:486 engines/pegasus/pegasus.cpp:2448
-msgid "Turn Right"
-msgstr "¿ÞÒÞàÞâ ÝÐßàÐÒÞ"
-
-#: engines/kyra/lol.cpp:487
-msgid "Rest"
-msgstr "¾âÔÞåÝãâì"
-
-#: engines/kyra/lol.cpp:488
-msgid "Options"
-msgstr "¾ßæØØ"
-
-#: engines/kyra/lol.cpp:489
-msgid "Choose Spell"
-msgstr "²ëÑàÐâì ×ÐÚÛØÝÐÝØÕ"
-
-#: engines/kyra/sound_midi.cpp:477
-msgid ""
-"You appear to be using a General MIDI device,\n"
-"but your game only supports Roland MT32 MIDI.\n"
-"We try to map the Roland MT32 instruments to\n"
-"General MIDI ones. It is still possible that\n"
-"some tracks sound incorrect."
-msgstr ""
-"ºÐÖÕâáï, Òë ßëâÐÕâÕáì ØáßÞÛì×ÞÒÐâì ãáâàÞÙáâÒÞ\n"
-"General MIDI, ÝÞ íâÐ ØÓàÐ ßÞÔÔÕàÖØÒÐÕâ âÞÛìÚÞ\n"
-"Roland MT32 MIDI. ¼ë ßÞßàÞÑãÕÜ ßÞÔÞÑàÐâì General\n"
-"MIDI ØÝáâàãÜÕÝâë, ßÞåÞÖØÕ ÝÐ Roland MT32, ÝÞ\n"
-"ÜÞÖÕâ âÐÚ ßÞÛãçØâìáï, çâÞ ÝÕÚÞâÞàëÕ âàÕÚØ ÑãÔãâ\n"
-"áëÓàÐÝë ÝÕÒÕàÝÞ."
-
-#: engines/queen/queen.cpp:59
-msgid "Alternative intro"
-msgstr "°ÛìâÕàÝÐâØÒÝÞÕ ÒáâãßÛÕÝØÕ"
-
-#: engines/queen/queen.cpp:60
-msgid "Use an alternative game intro (CD version only)"
-msgstr "¸áßÞÛì×ÞÒÐâì ÐÛìâÕàÝÐâØÒÝÞÕ ÒáâãßÛÕÝØÕ (âÞÛìÚÞ ÔÛï CD ÒÕàáØØ ØÓàë)"
-
#: engines/sky/compact.cpp:130
msgid ""
"Unable to find \"sky.cpt\" file!\n"
@@ -2416,21 +3184,24 @@ msgstr "²áâãßÛÕÝØÕ á äÛÞßߨÚÞÒ"
msgid "Use the floppy version's intro (CD version only)"
msgstr "¸áßÞÛì×ÞÒÐâì ÒáâãßÛÕÝØÕ á ÓØÑÚØå ÔØáÚÞÒ (âÞÛìÚÞ ÔÛï CD ÒÕàáØØ ØÓàë)"
-#: engines/sword1/animation.cpp:519
+#: engines/sword1/animation.cpp:524
#, c-format
msgid "PSX stream cutscene '%s' cannot be played in paletted mode"
msgstr "·ÐáâÐÒÚÐ PSX '%s' ÝÕ ÜÞÖÕâ Ñëâì ßàÞØÓàÐÝÐ Ò àÕÖØÜÕ á ßÐÛØâàÞÙ"
-#: engines/sword1/animation.cpp:540 engines/sword2/animation.cpp:439
+#: engines/sword1/animation.cpp:545 engines/sword2/animation.cpp:445
msgid "DXA cutscenes found but ScummVM has been built without zlib support"
msgstr ""
"½ÐÙÔÕÝë ×ÐáâÐÒÚØ Ò äÞàÜÐâÕ DXA, ÝÞ ScummVM ÑëÛ áÞÑàÐÝ ÑÕ× ßÞÔÔÕàÖÚØ zlib"
-#: engines/sword1/animation.cpp:550 engines/sword2/animation.cpp:449
-msgid "MPEG2 cutscenes are no longer supported"
-msgstr "·ÐáâÐÒÚØ Ò äÞàÜÐâÕ MPEG2 ÑÞÛìèÕ ÝÕ ßÞÔÔÕàÖØÒÐîâáï"
+#: engines/sword1/animation.cpp:561
+#, fuzzy
+msgid "MPEG-2 cutscenes found but ScummVM has been built without MPEG-2"
+msgstr ""
+"½ÐÙÔÕÝë ×ÐáâÐÒÚØ Ò äÞàÜÐâÕ PSX, ÝÞ ScummVM ÑëÛ áÞÑàÐÝ ÑÕ× ßÞÔÔÕàÖÚØ RGB "
+"æÒÕâÞÒ"
-#: engines/sword1/animation.cpp:556 engines/sword2/animation.cpp:457
+#: engines/sword1/animation.cpp:568 engines/sword2/animation.cpp:470
#, c-format
msgid "Cutscene '%s' not found"
msgstr "·ÐáâÐÒÚÐ '%s' ÝÕ ÝÐÙÔÕÝÐ"
@@ -2473,13 +3244,20 @@ msgstr "ÁÔÕÛÐâì ÝÞÒÞÕ"
msgid "This is the end of the Broken Sword 1 Demo"
msgstr "ÍâÞ ×ÐÒÕàèÕÝØÕ ÔÕÜÞ ÁÛÞÜÐÝÝÞÓÞ ¼ÕçÐ 1"
-#: engines/sword2/animation.cpp:419
+#: engines/sword2/animation.cpp:425
msgid ""
"PSX cutscenes found but ScummVM has been built without RGB color support"
msgstr ""
"½ÐÙÔÕÝë ×ÐáâÐÒÚØ Ò äÞàÜÐâÕ PSX, ÝÞ ScummVM ÑëÛ áÞÑàÐÝ ÑÕ× ßÞÔÔÕàÖÚØ RGB "
"æÒÕâÞÒ"
+#: engines/sword2/animation.cpp:461
+#, fuzzy
+msgid ""
+"MPEG-2 cutscenes found but ScummVM has been built without MPEG-2 support"
+msgstr ""
+"½ÐÙÔÕÝë ×ÐáâÐÒÚØ Ò äÞàÜÐâÕ DXA, ÝÞ ScummVM ÑëÛ áÞÑàÐÝ ÑÕ× ßÞÔÔÕàÖÚØ zlib"
+
#: engines/sword2/sword2.cpp:79
msgid "Show object labels"
msgstr "¿ÞÚÐ×ëÒÐâì ÝÐ×ÒÐÝØï ÞÑêÕÚâÞÒ"
@@ -2488,13 +3266,13 @@ msgstr "¿ÞÚÐ×ëÒÐâì ÝÐ×ÒÐÝØï ÞÑêÕÚâÞÒ"
msgid "Show labels for objects on mouse hover"
msgstr "¿ÞÚÐ×ëÒÐÕâ ÝÐ×ÒÐÝØï ÞÑêÕÚâÞÒ ßàØ ÝÐÒÕÔÕÝØØ ÚãàáÞàÐ ÜëèØ"
-#: engines/teenagent/resources.cpp:94
+#: engines/teenagent/resources.cpp:95
msgid ""
"You're missing the 'teenagent.dat' file. Get it from the ScummVM website"
msgstr ""
"à ÒÐá ÞâáãâáâÒãÕâ äÐÙÛ 'teenagent.dat'. ÁÚÐçÐÙâÕ ÕÓÞ á ÒÕÑ-áÐÙâÐ ScummVM"
-#: engines/teenagent/resources.cpp:115
+#: engines/teenagent/resources.cpp:116
msgid ""
"The teenagent.dat file is compressed and zlib hasn't been included in this "
"executable. Please decompress it"
@@ -2502,787 +3280,51 @@ msgstr ""
"ÄÐÙÛ teenagent.dat áÖÐâ, ÝÞ zlib ÝÕ ÒÚÛîçÕÝÞ Ò íâã ßàÞÓàÐÜÜã. ¿ÞÖÐÛãÙáâÐ, "
"àÐáßÐÚãÙâÕ ÕÓÞ"
-#: engines/parallaction/saveload.cpp:133
-#, c-format
-msgid ""
-"Can't save game in slot %i\n"
-"\n"
-msgstr ""
-"½Õ ÜÞÓã áÞåàÐÝØâì ØÓàã Ò ßÞרæØî %i\n"
-"\n"
-
-#: engines/parallaction/saveload.cpp:204
-msgid "Loading game..."
-msgstr "·ÐÓàãÖÐî ØÓàã..."
-
-#: engines/parallaction/saveload.cpp:219
-msgid "Saving game..."
-msgstr "ÁÞåàÐÝïî ØÓàã..."
-
-#: engines/parallaction/saveload.cpp:272
-msgid ""
-"ScummVM found that you have old savefiles for Nippon Safes that should be "
-"renamed.\n"
-"The old names are 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 next time.\n"
-msgstr ""
-"ScummVM ÞÑÝÐàãÖØÛ ã ÒÐá áâÐàëÕ áÞåàÐÝÕÝØï ØÓàë Nippon Safes, ÚÞâÞàëÕ "
-"ÝÕÞÑåÞÔØÜÞ ßÕàÕØÜÕÝÞÒÐâì. ÁâÐàëÕ ÝÐ×ÒÐÝØï ÑÞÛìèÕ ÝÕ ßÞÔÔÕàÖØÒÐîâáï, Ø "
-"ßÞíâÞÜã Òë ÝÕ áÜÞÖÕâÕ ×ÐÓàãרâì áÞåàÐÝÕÝØï, ÕáÛØ ÝÕ ßÕàÕØÜÕÝãÕâÕ Øå.\n"
-"\n"
-"½ÐÖÜØâÕ ¾º, çâÞÑë ßÕàÕØÜÕÝÞÒÐâì Øå áÕÙçÐá, Ò ßàÞâØÒÝÞÜ áÛãçÐÕ íâÞ ÖÕ "
-"áÞÞÑéÕÝØÕ ßÞïÒØâáï ßàØ áÛÕÔãîéÕÜ ×ÐßãáÚÕ ØÓàë.\n"
-
-#: engines/parallaction/saveload.cpp:319
-msgid "ScummVM successfully converted all your savefiles."
-msgstr "ScummVM ãáßÕèÝÞ ßàÕÞÑàÐ×ÞÒÐÛ ÒáÕ ÒÐèØ áÞåàÐÝÕÝØï ØÓà."
-
-#: engines/parallaction/saveload.cpp:321
-msgid ""
-"ScummVM printed some warnings in your console window and can't guarantee all "
-"your files have been converted.\n"
-"\n"
-"Please report to the team."
-msgstr ""
-"ScummVM ÝÐߨáÐÛ ÝÕáÚÞÛìÚÞ ßàÕÔãßàÕÖÔÕÝØÙ Ò ÞÚÝÞ ÚÞÝáÞÛØ Ø ÝÕ áÜÞÓ "
-"ßàÕÞÑàÐ×ÞÒÐâì ÒáÕ äÐÙÛë.\n"
-"\n"
-"¿ÞÖÐÛãÙáâÐ, áÞÞÑéØâÕ ÞÑ íâÞÜ ÚÞÜÐÝÔÕ ScummVM."
-
-#: engines/pegasus/pegasus.cpp:679
-msgid "Invalid save file name"
-msgstr "½ÕÒÕàÝÞÕ ØÜï äÐÙÛÐ áÞåàÐÝÕÝØï"
-
-#: engines/pegasus/pegasus.cpp:2445
-msgid "Up/Zoom In/Move Forward/Open Doors"
-msgstr "²ÒÕàå/ÃÜÕÝìèØâì ÜÐáèâÐÑ/²ßÕàñÔ/¾âàëâì ÔÒÕàØ"
-
-#: engines/pegasus/pegasus.cpp:2446
-msgid "Down/Zoom Out"
-msgstr "²ÝØ×/ÃÒÕÛ. ÜÐáèâÐÑ"
-
-#: engines/pegasus/pegasus.cpp:2449
-msgid "Display/Hide Inventory Tray"
-msgstr "¿ÞÚÐ×Ðâì/ÁßàïâÐâì ØÝÒÕÝâÐàì"
-
-#: engines/pegasus/pegasus.cpp:2450
-msgid "Display/Hide Biochip Tray"
-msgstr "¿ÞÚÐ×Ðâì/ÁßàïâÐâì ÑØÞçØß"
-
-#: engines/pegasus/pegasus.cpp:2451
-msgid "Action/Select"
-msgstr "´ÕÙáâÒØÕ/²ëÑÞà"
-
-#: engines/pegasus/pegasus.cpp:2452
-msgid "Toggle Center Data Display"
-msgstr "²ÚÛîçØâì ßÞÚÐ× ÔÐÝÝëå Ò æÕÝâàÕ íÚàÐÝÐ"
-
-#: engines/pegasus/pegasus.cpp:2453
-msgid "Display/Hide Info Screen"
-msgstr "¿ÞÚÐ×Ðâì/ÁßàïâÐâì ØÝäÞíÚàÐÝ"
-
-#: engines/pegasus/pegasus.cpp:2454
-msgid "Display/Hide Pause Menu"
-msgstr "¿ÞÚÐ×Ðâì/ÁßàïâÐâì ÜÕÝî ßÐã×ë"
-
-#: engines/pegasus/pegasus.cpp:2455
-msgid "???"
-msgstr "???"
-
-#: audio/fmopl.cpp:49
-msgid "MAME OPL emulator"
-msgstr "ÍÜãÛïâÞà MAME OPL"
-
-#: audio/fmopl.cpp:51
-msgid "DOSBox OPL emulator"
-msgstr "ÍÜãÛïâÞà DOSBox OPL"
-
-#: audio/mididrv.cpp:209
-#, c-format
-msgid ""
-"The selected audio device '%s' was not found (e.g. might be turned off or "
-"disconnected)."
-msgstr ""
-"²ëÑàÐÝÝÞÕ ×ÒãÚÞÒÞÕ ãáâàÞÙáâÒÞ '%s' ÝÕ ÑëÛÞ ÝÐÙÔÕÝÞ (ÒÞ×ÜÞÖÝÞ, ÞÝÞ ÒëÚÛîçÕÝÞ "
-"ØÛØ ÝÕ ßÞÔÚÛîçÕÝÞ)."
-
-#: audio/mididrv.cpp:209 audio/mididrv.cpp:221 audio/mididrv.cpp:257
-#: audio/mididrv.cpp:272
-msgid "Attempting to fall back to the next available device..."
-msgstr "¿ëâÐîáì ØáßÞÛì×ÞÒÐâì ÔàãÓÞÕ ÔÞáâãßÝÞÕ ãáâàÞÙáâÒÞ..."
-
-#: audio/mididrv.cpp:221
-#, c-format
-msgid ""
-"The selected audio device '%s' cannot be used. See log file for more "
-"information."
-msgstr ""
-"²ëÑàÐÝÝÞÕ ×ÒãÚÞÒÞÕ ãáâàÞÙáâÒÞ '%s' ÝÕ ÜÞÖÕâ Ñëâì ØáßÞÛì×ÞÒÐÝÞ. ÁÜÞâàØâÕ äÐÙÛ "
-"ßàÞâÞÚÞÛÐ ÔÛï ÑÞÛÕÕ ßÞÔàÞÑÝÞÙ ØÝäÞàÜÐæØØ."
-
-#: audio/mididrv.cpp:257
-#, c-format
-msgid ""
-"The preferred audio device '%s' was not found (e.g. might be turned off or "
-"disconnected)."
-msgstr ""
-"¿àÕÔßÞçâØâÕÛìÝÞÕ ×ÒãÚÞÒÞÕ ãáâàÞÙáâÒÞ '%s' ÝÕ ÑëÛÞ ÝÐÙÔÕÝÞ (ÒÞ×ÜÞÖÝÞ, ÞÝÞ "
-"ÒëÚÛîçÕÝÞ ØÛØ ÝÕ ßÞÔÚÛîçÕÝÞ)."
-
-#: audio/mididrv.cpp:272
-#, c-format
-msgid ""
-"The preferred audio device '%s' cannot be used. See log file for more "
-"information."
-msgstr ""
-"¿àÕÔßÞçâØâÕÛìÝÞÕ ×ÒãÚÞÒÞÕ ãáâàÞÙáâÒÞ '%s' ÝÕ ÜÞÖÕâ Ñëâì ØáßÞÛì×ÞÒÐÝÞ. "
-"ÁÜÞâàØâÕ äÐÙÛ ßàÞâÞÚÞÛÐ ÔÛï ÑÞÛÕÕ ßÞÔàÞÑÝÞÙ ØÝäÞàÜÐæØØ."
-
-#: audio/null.h:43
-msgid "No music"
-msgstr "±Õ× Üã×ëÚØ"
-
-#: audio/mods/paula.cpp:189
-msgid "Amiga Audio Emulator"
-msgstr "ÍÜãÛïâÞà ×ÒãÚÐ Amiga"
-
-#: audio/softsynth/adlib.cpp:2284
-msgid "AdLib Emulator"
-msgstr "ÍÜãÛïâÞà AdLib"
-
-#: audio/softsynth/appleiigs.cpp:33
-msgid "Apple II GS Emulator (NOT IMPLEMENTED)"
-msgstr "ÍÜãÛïâÞà Apple II GS (ÞâáãâáâÒãÕâ)"
-
-#: audio/softsynth/sid.cpp:1430
-msgid "C64 Audio Emulator"
-msgstr "ÍÜãÛïâÞà ×ÒãÚÐ C64"
-
-#: audio/softsynth/mt32.cpp:205
-msgid "Initializing MT-32 Emulator"
-msgstr "½ÐáâàÐØÒÐî íÜãÛïâÞà MT-32"
-
-#: audio/softsynth/mt32.cpp:431
-msgid "MT-32 Emulator"
-msgstr "ÍÜãÛïâÞà MT-32"
-
-#: audio/softsynth/pcspk.cpp:139
-msgid "PC Speaker Emulator"
-msgstr "ÍÜãÛïâÞà PC áߨÚÕàÐ"
-
-#: audio/softsynth/pcspk.cpp:158
-msgid "IBM PCjr Emulator"
-msgstr "ÍÜãÛïâÞà IBM PCjr"
-
-#: backends/keymapper/remap-dialog.cpp:47
-msgid "Keymap:"
-msgstr "ÂÐÑÛØæÐ ÚÛÐÒØè:"
-
-#: backends/keymapper/remap-dialog.cpp:66
-msgid " (Effective)"
-msgstr " (´ÕÙáâÒãîéÐï)"
-
-#: backends/keymapper/remap-dialog.cpp:106
-msgid " (Active)"
-msgstr " (°ÚâØÒÝÐï)"
-
-#: backends/keymapper/remap-dialog.cpp:106
-msgid " (Blocked)"
-msgstr " (·ÐÑÛÞÚØàÞÒÐÝÐ)"
-
-#: backends/keymapper/remap-dialog.cpp:119
-msgid " (Global)"
-msgstr " (³ÛÞÑÐÛìÝÐï)"
-
-#: backends/keymapper/remap-dialog.cpp:127
-msgid " (Game)"
-msgstr " (¸Óàë)"
-
-#: backends/midi/windows.cpp:164
-msgid "Windows MIDI"
-msgstr "Windows MIDI"
-
-#: backends/platform/ds/arm9/source/dsoptions.cpp:57
-msgid "ScummVM Main Menu"
-msgstr "³ÛÐÒÝÞÕ ÜÕÝî ScummVM"
-
-#: backends/platform/ds/arm9/source/dsoptions.cpp:63
-msgid "~L~eft handed mode"
-msgstr "»ÕÒÞàãÚØÙ àÕÖØÜ"
-
-#: backends/platform/ds/arm9/source/dsoptions.cpp:64
-msgid "~I~ndy fight controls"
-msgstr "ÃßàÐÒÛÕÝØÕ ÑÞïÜØ Ò Indy"
-
-#: backends/platform/ds/arm9/source/dsoptions.cpp:65
-msgid "Show mouse cursor"
-msgstr "¿ÞÚÐ×ëÒÐâì ÚãàáÞà ÜëèØ"
-
-#: backends/platform/ds/arm9/source/dsoptions.cpp:66
-msgid "Snap to edges"
-msgstr "¿àØÚàÕߨâì Ú ÓàÐÝØæÐÜ"
-
-#: backends/platform/ds/arm9/source/dsoptions.cpp:68
-msgid "Touch X Offset"
-msgstr "ÁÜÕéÕÝØÕ ÚÐáÐÝØÙ ßÞ ÞáØ X"
-
-#: backends/platform/ds/arm9/source/dsoptions.cpp:75
-msgid "Touch Y Offset"
-msgstr "ÁÜÕéÕÝØÕ ÚÐáÐÝØÙ ßÞ ÞáØ Y"
-
-#: backends/platform/ds/arm9/source/dsoptions.cpp:87
-msgid "Use laptop trackpad-style cursor control"
-msgstr "¸áßÞÛì×ÞÒÐâì ãßàÐÒÛÕÝØÕ ÚãàáÞàÞÜ ÚÐÚ ÝÐ âàÕÚßÐÔÕ ÛÕßâÞßÞÒ"
-
-#: backends/platform/ds/arm9/source/dsoptions.cpp:88
-msgid "Tap for left click, double tap right click"
-msgstr "ÂÐß ÔÛï ÛÕÒÞÓÞ éÕÛçÚÐ, ÔÒÞÙÝÞÙ âÐß ÔÛï ßàÐÒÞÓÞ éÕÛçÚÐ"
-
-#: backends/platform/ds/arm9/source/dsoptions.cpp:90
-msgid "Sensitivity"
-msgstr "ÇãÒáâÒØâÕÛìÝÞáâì"
-
-#: backends/platform/ds/arm9/source/dsoptions.cpp:99
-msgid "Initial top screen scale:"
-msgstr "½ÐçÐÛìÝëÙ ÜÐáèâÐÑ ÒÕàåÝÕÓÞ íÚàÐÝÐ:"
-
-#: backends/platform/ds/arm9/source/dsoptions.cpp:105
-msgid "Main screen scaling:"
-msgstr "¼ÐáèâÐÑ ÓÛÐÒÝÞÓÞ íÚàÐÝÐ:"
-
-#: backends/platform/ds/arm9/source/dsoptions.cpp:107
-msgid "Hardware scale (fast, but low quality)"
-msgstr "ÅÐàÔÒÐàÝÞÕ ÜÐáèâÐÑØàÞÒÐÝØÕ (ÑëáâàÞ, ÝÞ ÝØ×ÚÞÓÞ ÚÐçÕáâÒÐ)"
-
-#: backends/platform/ds/arm9/source/dsoptions.cpp:108
-msgid "Software scale (good quality, but slower)"
-msgstr "¿àÞÓàÐÜÜÝÞÕ ÜÐáèâÐÑØàÞÒÐÝØÕ (åÞàÞèÕÕ ÚÐçÕáâÒÞ, ÝÞ ÜÕÔÛÕÝÝÕÕ)"
-
-#: backends/platform/ds/arm9/source/dsoptions.cpp:109
-msgid "Unscaled (you must scroll left and right)"
-msgstr "±Õ× ÜÐáèâÐÑØàÞÒÐÝØï (ÝãÖÝÞ ÑãÔÕâ ßàÞÚàãçØÒÐâì ÒÛÕÒÞ Ø ÒßàÐÒÞ)"
-
-#: backends/platform/ds/arm9/source/dsoptions.cpp:111
-msgid "Brightness:"
-msgstr "ÏàÚÞáâì:"
-
-#: backends/platform/ds/arm9/source/dsoptions.cpp:121
-msgid "High quality audio (slower) (reboot)"
-msgstr "²ëáÞÚÞÕ ÚÐçÕáâÒÞ ×ÒãÚÐ (ÜÕÔÛÕÝÝÕÕ) (àÕÑãâ)"
-
-#: backends/platform/ds/arm9/source/dsoptions.cpp:122
-msgid "Disable power off"
-msgstr "·ÐßàÕâØâì ÒëÚÛîçÕÝØÕ"
-
-#: backends/platform/iphone/osys_events.cpp:300
-msgid "Mouse-click-and-drag mode enabled."
-msgstr "ÀÕÖØÜ ÜëèØ ÝÐÖÐâì-Ø-âïÝãâì ÒÚÛîçñÝ."
-
-#: backends/platform/iphone/osys_events.cpp:302
-msgid "Mouse-click-and-drag mode disabled."
-msgstr "ÀÕÖØÜ ÜëèØ ÝÐÖÐâì-Ø-âïÝãâì ÒëÚÛîçÕÝ."
-
-#: backends/platform/iphone/osys_events.cpp:313
-msgid "Touchpad mode enabled."
-msgstr "ÀÕÖØÜ âÐçßÐÔÐ ÒÚÛîçñÝ."
-
-#: backends/platform/iphone/osys_events.cpp:315
-msgid "Touchpad mode disabled."
-msgstr "ÀÕÖØÜ âÐçßÐÔÐ ÒëÚÛîçÕÝ."
-
-#: backends/platform/maemo/maemo.cpp:209
-msgid "Click Mode"
-msgstr "ÀÕÖØÜ éÕÛçÚÐ"
-
-#: backends/platform/maemo/maemo.cpp:215
-#: 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/maemo/maemo.cpp:218
-msgid "Middle Click"
-msgstr "ÁàÕÔÝØÙ éÕÛçÞÚ"
-
-#: backends/platform/maemo/maemo.cpp:221
-#: backends/platform/symbian/src/SymbianActions.cpp:43
-#: backends/platform/wince/CEActionsSmartphone.cpp:44
-#: backends/platform/bada/form.cpp:273
-msgid "Right Click"
-msgstr "¿àÐÒëÙ éÕÛçÞÚ"
-
-#: backends/platform/sdl/macosx/appmenu_osx.mm:77
-msgid "Hide ScummVM"
-msgstr "ÁÚàëâì ScummVM"
-
-#: backends/platform/sdl/macosx/appmenu_osx.mm:82
-msgid "Hide Others"
-msgstr "ÁÚàëâì ÞáâÐÛìÝëÕ"
-
-#: backends/platform/sdl/macosx/appmenu_osx.mm:87
-msgid "Show All"
-msgstr "¿ÞÚÐ×Ðâì ÒáÕ"
-
-#: backends/platform/sdl/macosx/appmenu_osx.mm:109
-#: backends/platform/sdl/macosx/appmenu_osx.mm:120
-msgid "Window"
-msgstr "¾ÚÝÞ"
-
-#: backends/platform/sdl/macosx/appmenu_osx.mm:114
-msgid "Minimize"
-msgstr "ÃÑàÐâì Ò Dock"
-
-#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:45
-msgid "Normal (no scaling)"
-msgstr "±Õ× ãÒÕÛØçÕÝØï"
-
-#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:64
-msgctxt "lowres"
-msgid "Normal (no scaling)"
-msgstr "±Õ× ãÒÕÛØçÕÝØï"
-
-#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2135
-#: backends/graphics/openglsdl/openglsdl-graphics.cpp:537
-msgid "Enabled aspect ratio correction"
-msgstr "ºÞààÕÚæØï áÞÞâÝÞèÕÝØï áâÞàÞÝ ÒÚÛîçÕÝÐ"
-
-#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2141
-#: backends/graphics/openglsdl/openglsdl-graphics.cpp:542
-msgid "Disabled aspect ratio correction"
-msgstr "ºÞààÕÚæØï áÞÞâÝÞèÕÝØï áâÞàÞÝ ÒëÚÛîçÕÝÐ"
-
-#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2196
-msgid "Active graphics filter:"
-msgstr "°ÚâØÒÝëÙ ÓàÐäØçÕáÚØÙ äØÛìâà:"
-
-#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2238
-#: backends/graphics/openglsdl/openglsdl-graphics.cpp:481
-msgid "Windowed mode"
-msgstr "¾ÚÞÝÝëÙ àÕÖØÜ"
-
-#: backends/graphics/opengl/opengl-graphics.cpp:135
-msgid "OpenGL Normal"
-msgstr "OpenGL ÑÕ× ãÒÕÛØçÕÝØï"
-
-#: backends/graphics/opengl/opengl-graphics.cpp:136
-msgid "OpenGL Conserve"
-msgstr "OpenGL á áÞåàÐÝÕÝØÕÜ"
-
-#: backends/graphics/opengl/opengl-graphics.cpp:137
-msgid "OpenGL Original"
-msgstr "OpenGL Ø×ÝÐçÐÛìÝëÙ"
-
-#: backends/graphics/openglsdl/openglsdl-graphics.cpp:415
-msgid "Current display mode"
-msgstr "ÂÕÚãéØÙ ÒØÔÕÞàÕÖØÜ"
-
-#: backends/graphics/openglsdl/openglsdl-graphics.cpp:428
-msgid "Current scale"
-msgstr "ÂÕÚãéØÙ ÜÐáèâÐÑ"
-
-#: backends/graphics/openglsdl/openglsdl-graphics.cpp:562
-msgid "Active filter mode: Linear"
-msgstr "°ÚâØÒÝëÙ àÕÖØÜ äØÛìâàÐ: »ØÝÕÙÝëÙ"
-
-#: backends/graphics/openglsdl/openglsdl-graphics.cpp:564
-msgid "Active filter mode: Nearest"
-msgstr "°ÚâØÒÝëÙ àÕÖØÜ äØÛìâàÐ: ±ÛØÖÐÙèØÙ"
-
-#: backends/platform/symbian/src/SymbianActions.cpp:38
-#: backends/platform/wince/CEActionsSmartphone.cpp:39
-msgid "Up"
-msgstr "²ÒÕàå"
-
-#: backends/platform/symbian/src/SymbianActions.cpp:39
-#: backends/platform/wince/CEActionsSmartphone.cpp:40
-msgid "Down"
-msgstr "²ÝØ×"
-
-#: backends/platform/symbian/src/SymbianActions.cpp:40
-#: backends/platform/wince/CEActionsSmartphone.cpp:41
-msgid "Left"
-msgstr "²ÛÕÒÞ"
-
-#: backends/platform/symbian/src/SymbianActions.cpp:41
-#: backends/platform/wince/CEActionsSmartphone.cpp:42
-msgid "Right"
-msgstr "²ßàÐÒÞ"
-
-#: backends/platform/symbian/src/SymbianActions.cpp:46
-#: backends/platform/wince/CEActionsSmartphone.cpp:47
-msgid "Zone"
-msgstr "·ÞÝÐ"
-
-#: backends/platform/symbian/src/SymbianActions.cpp:47
-#: backends/platform/wince/CEActionsPocket.cpp:54
-#: backends/platform/wince/CEActionsSmartphone.cpp:48
-msgid "Multi Function"
-msgstr "¼ãÛìâØäãÝÚæØï"
-
-#: backends/platform/symbian/src/SymbianActions.cpp:48
-msgid "Swap character"
-msgstr "ÁÜÕÝØâì ÓÕàÞï"
-
-#: backends/platform/symbian/src/SymbianActions.cpp:49
-msgid "Skip text"
-msgstr "¿àÞßãáâØâì âÕÚáâ"
-
-#: backends/platform/symbian/src/SymbianActions.cpp:51
-msgid "Fast mode"
-msgstr "±ëáâàëÙ àÕÖØÜ"
-
-#: backends/platform/symbian/src/SymbianActions.cpp:53
-msgid "Debugger"
-msgstr "¾âÛÐÔçØÚ"
-
-#: backends/platform/symbian/src/SymbianActions.cpp:54
-msgid "Global menu"
-msgstr "³ÛÞÑÐÛìÝÞÕ ÜÕÝî"
-
-#: backends/platform/symbian/src/SymbianActions.cpp:55
-msgid "Virtual keyboard"
-msgstr "²ØàâãÐÛìÝÐï ÚÛÐÒØÐâãàÐ"
-
-#: backends/platform/symbian/src/SymbianActions.cpp:56
-msgid "Key mapper"
-msgstr "½Ð×ÝÐçÕÝØÕ ÚÛÐÒØè"
-
-#: backends/events/symbiansdl/symbiansdl-events.cpp:184
-msgid "Do you want to quit ?"
-msgstr "²ë ÔÕÙáâÒØâÕÛìÝÞ åÞâØâÕ ÒëÙâØ?"
-
-#: backends/platform/wii/options.cpp:51
-msgid "Video"
-msgstr "²ØÔÕÞ"
-
-#: backends/platform/wii/options.cpp:54
-msgid "Current video mode:"
-msgstr "ÂÕÚãéØÙ ÒØÔÕÞàÕÖØÜ:"
-
-#: backends/platform/wii/options.cpp:56
-msgid "Double-strike"
-msgstr "´ÒÞÙÝÞÙ ãÔÐà"
-
-#: backends/platform/wii/options.cpp:60
-msgid "Horizontal underscan:"
-msgstr "³ÞàØ×ÞÝâÐÛìÝëÙ underscan:"
-
-#: backends/platform/wii/options.cpp:66
-msgid "Vertical underscan:"
-msgstr "²ÕàâØÚÐÛìÝëÙ underscan:"
-
-#: backends/platform/wii/options.cpp:71
-msgid "Input"
-msgstr "²ÒÞÔ"
-
-#: backends/platform/wii/options.cpp:74
-msgid "GC Pad sensitivity:"
-msgstr "ÇãÒáâÒØâÕÛìÝÞáâì GC ßÐÔÐ:"
-
-#: backends/platform/wii/options.cpp:80
-msgid "GC Pad acceleration:"
-msgstr "ÃáÚÞàÕÝØÕ GC ßÐÔÐ:"
-
-#: backends/platform/wii/options.cpp:86
-msgid "DVD"
-msgstr "DVD"
-
-#: backends/platform/wii/options.cpp:89 backends/platform/wii/options.cpp:101
-msgid "Status:"
-msgstr "ÁÞáâÞïÝØÕ:"
-
-#: backends/platform/wii/options.cpp:90 backends/platform/wii/options.cpp:102
-msgid "Unknown"
-msgstr "½ÕØ×ÒÕáâÝÞ"
-
-#: backends/platform/wii/options.cpp:93
-msgid "Mount DVD"
-msgstr "¿ÞÔÚÛîçØâì DVD"
-
-#: backends/platform/wii/options.cpp:94
-msgid "Unmount DVD"
-msgstr "¾âÚÛîçØâì DVD"
-
-#: backends/platform/wii/options.cpp:98
-msgid "SMB"
-msgstr "SMB"
-
-#: backends/platform/wii/options.cpp:106
-msgid "Server:"
-msgstr "ÁÕàÒÕà:"
-
-#: backends/platform/wii/options.cpp:110
-msgid "Share:"
-msgstr "ÁÕâÕÒÐï ßÐßÚÐ:"
-
-#: backends/platform/wii/options.cpp:114
-msgid "Username:"
-msgstr "¿ÞÛì×ÞÒÐâÕÛì:"
-
-#: backends/platform/wii/options.cpp:118
-msgid "Password:"
-msgstr "¿ÐàÞÛì:"
-
-#: backends/platform/wii/options.cpp:121
-msgid "Init network"
-msgstr "¸ÝØæØÐÛØ×ÐæØï áÕâØ"
-
-#: backends/platform/wii/options.cpp:123
-msgid "Mount SMB"
-msgstr "¿ÞÔÚÛîçØâì SMB"
-
-#: backends/platform/wii/options.cpp:124
-msgid "Unmount SMB"
-msgstr "¾âÚÛîçâì SMB"
-
-#: backends/platform/wii/options.cpp:143
-msgid "DVD Mounted successfully"
-msgstr "DVD ßÞÔÚÛîçÕÝ ãáßÕèÝÞ"
-
-#: backends/platform/wii/options.cpp:146
-msgid "Error while mounting the DVD"
-msgstr "¾èØÑÚÐ ÒÞ ÒàÕÜï ßÞÔÚÛîçÕÝØï DVD"
-
-#: backends/platform/wii/options.cpp:148
-msgid "DVD not mounted"
-msgstr "DVD ÝÕ ßÞÔÚÛîçÕÝ"
-
-#: backends/platform/wii/options.cpp:161
-msgid "Network up, share mounted"
-msgstr "ÁÕâì àÐÑÞâÐÕâ, ßÐßÚÐ ßÞÔÚÛîçÕÝÐ"
-
-#: backends/platform/wii/options.cpp:163
-msgid "Network up"
-msgstr "ÁÕâì àÐÑÞâÐÕâ"
-
-#: backends/platform/wii/options.cpp:166
-msgid ", error while mounting the share"
-msgstr ", ÞèØÑÚÐ ÒÞ ÒàÕÜï ßÞÔÚÛîçÕÝØï ßÐßÚØ"
-
-#: backends/platform/wii/options.cpp:168
-msgid ", share not mounted"
-msgstr ", ßÐßÚÐ ÝÕ ßÞÔÚÛîçÕÝÐ"
-
-#: backends/platform/wii/options.cpp:174
-msgid "Network down"
-msgstr "ÁÕâì ÒëÚÛîçÕÝÐ"
-
-#: backends/platform/wii/options.cpp:178
-msgid "Initializing network"
-msgstr "½ÐáâàÐØÒÐî áÕâì"
-
-#: backends/platform/wii/options.cpp:182
-msgid "Timeout while initializing network"
-msgstr "²àÕÜï ßÞÔÚÛîçÕÝØï Ú áÕâØ ØáâÕÚÛÞ"
-
-#: backends/platform/wii/options.cpp:186
-#, c-format
-msgid "Network not initialized (%d)"
-msgstr "ÁÕâì ÝÕ ÝÐáâàÞØÛÐáì (%d)"
-
-#: backends/platform/wince/CEActionsPocket.cpp:46
-msgid "Hide Toolbar"
-msgstr "ÁßàïâÐâì ßÐÝÕÛì ØÝáâàãÜÕÝâÞÒ"
-
-#: backends/platform/wince/CEActionsPocket.cpp:47
-msgid "Show Keyboard"
-msgstr "¿ÞÚÐ×Ðâì ÚÛÐÒØÐâãàã"
-
-#: backends/platform/wince/CEActionsPocket.cpp:48
-msgid "Sound on/off"
-msgstr "·ÒãÚ ÒÚÛ/ÒëÚÛ"
-
-#: backends/platform/wince/CEActionsPocket.cpp:49
-msgid "Right click"
-msgstr "¿àÐÒëÙ éÕÛçÞÚ"
-
-#: backends/platform/wince/CEActionsPocket.cpp:50
-msgid "Show/Hide Cursor"
-msgstr "¿ÞÚÐ×Ðâì/ÃÑàÐâì ÚãàáÞà"
-
-#: backends/platform/wince/CEActionsPocket.cpp:51
-msgid "Free look"
-msgstr "ÁÒÞÑÞÔÝëÙ ÞÑ×Þà"
-
-#: backends/platform/wince/CEActionsPocket.cpp:52
-msgid "Zoom up"
-msgstr "ÃÒÕÛ. ÜÐáèâÐÑ"
-
-#: backends/platform/wince/CEActionsPocket.cpp:53
-msgid "Zoom down"
-msgstr "ÃÜÕÝìè. ÜÐáèâÐÑ"
-
-#: backends/platform/wince/CEActionsPocket.cpp:55
-#: backends/platform/wince/CEActionsSmartphone.cpp:49
-msgid "Bind Keys"
-msgstr "½Ð×ÝÐçØâì ÚÛÐÒØèØ"
-
-#: backends/platform/wince/CEActionsPocket.cpp:56
-msgid "Cursor Up"
-msgstr "ºãàáÞà ÒÒÕàå"
-
-#: backends/platform/wince/CEActionsPocket.cpp:57
-msgid "Cursor Down"
-msgstr "ºãàáÞà ÒÝØ×"
-
-#: backends/platform/wince/CEActionsPocket.cpp:58
-msgid "Cursor Left"
-msgstr "ºãàáÞà ÒÛÕÒÞ"
-
-#: backends/platform/wince/CEActionsPocket.cpp:59
-msgid "Cursor Right"
-msgstr "ºãàáÞà ÒßàÐÒÞ"
-
-#: 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:326
-#: backends/platform/wince/CEActionsSmartphone.cpp:287
-msgid " Are you sure you want to quit ? "
-msgstr " ²ë ãÒÕàÕÝë, çâÞ åÞâØâÕ ÒëÙâØ? "
-
-#: backends/platform/wince/CEActionsSmartphone.cpp:50
-msgid "Keyboard"
-msgstr "ºÛÐÒØÐâãàÐ"
-
-#: backends/platform/wince/CEActionsSmartphone.cpp:51
-msgid "Rotate"
-msgstr "¿ÞÒÕàÝãâì"
-
-#: backends/platform/wince/CELauncherDialog.cpp:56
-msgid "Using SDL driver "
-msgstr "¸áßÞÛì×ãî ÔàÐÙÒÕà SDL "
-
-#: backends/platform/wince/CELauncherDialog.cpp:60
-msgid "Display "
-msgstr "¿ÞÚÐ×Ðâì "
-
-#: backends/platform/wince/CELauncherDialog.cpp:83
-msgid "Do you want to perform an automatic scan ?"
-msgstr "²ë åÞâØâÕ ßàÞØ×ÒÕáâØ ÐÒâÞÜÐâØçÕáÚØÙ ßÞØáÚ?"
-
-#: backends/platform/wince/wince-sdl.cpp:515
-msgid "Map right click action"
-msgstr "½Ð×ÝÐçØâì ÔÕÙáâÒØÕ ßÞ ßàÐÒÞÜã éÕÛçÚã"
-
-#: 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:528
-msgid "Map hide toolbar action"
-msgstr "½Ð×ÝÐçØâì ÔÕÙáâÒØÕ 'áßàïâÐâì ßÐÝÕÛì ØÝáâàãÜÕÝâÞÒ'"
-
-#: 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:541
-msgid "Map Zoom Up action (optional)"
-msgstr "½Ð×ÝÐçØâì ÔÕÙáâÒØÕ ÃÒÕÛØçØâì ¼ÐáèâÐÑ (ÝÕÞÑï×ÐâÕÛìÝÞ)"
-
-#: backends/platform/wince/wince-sdl.cpp:544
-msgid "Map Zoom Down action (optional)"
-msgstr "½Ð×ÝÐçØâì ÔÕÙáâÒØÕ ÃÜÕÝìèØâì ¼ÐáèâÐÑ (ÝÕÞÑï×ÐâÕÛìÝÞ)"
-
-#: 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 ""
-"½Õ ×ÐÑãÔìâÕ ÝÐ×ÝÐçØâì ÚÛÐÒØèã ÔÛï ÔÕÙáâÒØï 'Hide Toolbar', çâÞÑë ãÒØÔÕâì "
-"ÒÕáì ØÝÒÕÝâÐàì Ò ØÓàÕ"
-
-#: backends/events/default/default-events.cpp:193
-msgid "Do you really want to return to the Launcher?"
-msgstr "²ë ÔÕÙáâÒØâÕÛìÝÞ åÞâØâÕ ÒÕàÝãâìáï Ò ÓÛÐÒÝÞÕ ÜÕÝî?"
-
-#: backends/events/default/default-events.cpp:193
-msgid "Launcher"
-msgstr "³ÛÐÒÝÞÕ ÜÕÝî"
-
-#: backends/events/default/default-events.cpp:215
-msgid "Do you really want to quit?"
-msgstr "²ë ÔÕÙáâÒØâÕÛìÝÞ åÞâØâÕ ÒëÙâØ?"
-
-#: backends/events/gph/gph-events.cpp:386
-#: backends/events/gph/gph-events.cpp:429
-#: backends/events/openpandora/op-events.cpp:168
-msgid "Touchscreen 'Tap Mode' - Left Click"
-msgstr "ÀÕÖØÜ 'ÚÐáÐÝØÙ' âÐçáÚàØÝÐ - »ÕÒëÙ ÚÛØÚ"
-
-#: backends/events/gph/gph-events.cpp:388
-#: backends/events/gph/gph-events.cpp:431
-#: backends/events/openpandora/op-events.cpp:170
-msgid "Touchscreen 'Tap Mode' - Right Click"
-msgstr "ÀÕÖØÜ 'ÚÐáÐÝØÙ' âÐçáÚàØÝÐ - ¿àÐÒëÙ ÚÛØÚ"
-
-#: backends/events/gph/gph-events.cpp:390
-#: backends/events/gph/gph-events.cpp:433
-#: backends/events/openpandora/op-events.cpp:172
-msgid "Touchscreen 'Tap Mode' - Hover (No Click)"
-msgstr "ÀÕÖØÜ 'ÚÐáÐÝØÙ' âÐçáÚàØÝÐ - ¿àÞÛñâ (ÑÕ× ÚÛØÚÐ)"
-
-#: backends/events/gph/gph-events.cpp:410
-msgid "Maximum Volume"
-msgstr "¼ÐÚáØÜÐÛìÝÐï ÓàÞÜÚÞáâì"
+#~ msgctxt "lowres"
+#~ msgid "Mass Add..."
+#~ msgstr "¼ÝÞÓÞ ØÓà..."
-#: backends/events/gph/gph-events.cpp:412
-msgid "Increasing Volume"
-msgstr "ÃÒÕÛØçÕÝØÕ ÓàÞÜÚÞáâØ"
+#~ msgid "Mass Add..."
+#~ msgstr "¼ÝÞÓÞ ØÓà..."
-#: backends/events/gph/gph-events.cpp:418
-msgid "Minimal Volume"
-msgstr "¼ØÝØÜÐÛìÝÐï ÓàÞÜÚÞáâì"
+#~ msgid ""
+#~ "Turns off General MIDI mapping for games with Roland MT-32 soundtrack"
+#~ msgstr ""
+#~ "²ëÚÛîçÐÕâ áÞßÞáâÐÒÛÕÝØÕ General MIDI ÔÛï ØÓà á ×ÒãÚÞÒÞÙ ÔÞàÞÖÚÞÙ ÔÛï "
+#~ "Roland MT-32"
-#: backends/events/gph/gph-events.cpp:420
-msgid "Decreasing Volume"
-msgstr "ÃÜÕÝìèÕÝØÕ ÓàÞÜÚÞáâØ"
+#~ msgid "Standard (16bpp)"
+#~ msgstr "ÁâÐÝÔÐàâÝëÙ àÐáâÕàØ×ÐâÞà (16bpp)"
-#: backends/events/openpandora/op-events.cpp:174
-msgid "Touchscreen 'Tap Mode' - Hover (DPad Clicks)"
-msgstr "ÀÕÖØÜ 'ÚÐáÐÝØÙ' âÐçáÚàØÝÐ - ¿àÞÛñâ (ÚÛØÚØ DPad)"
+#~ msgid "Alternative intro"
+#~ msgstr "°ÛìâÕàÝÐâØÒÝÞÕ ÒáâãßÛÕÝØÕ"
-#: backends/updates/macosx/macosx-updates.mm:67
-msgid "Check for Updates..."
-msgstr "¿àÞÒÕàïî ÞÑÝÞÒÛÕÝØï..."
+#~ msgid "Use an alternative game intro (CD version only)"
+#~ msgstr "¸áßÞÛì×ÞÒÐâì ÐÛìâÕàÝÐâØÒÝÞÕ ÒáâãßÛÕÝØÕ (âÞÛìÚÞ ÔÛï CD ÒÕàáØØ ØÓàë)"
-#: backends/platform/bada/form.cpp:269
-msgid "Right Click Once"
-msgstr "¾ÔØÝ ßàÐÒëÙ éÕÛçÞÚ"
+#~ msgid "MPEG2 cutscenes are no longer supported"
+#~ msgstr "·ÐáâÐÒÚØ Ò äÞàÜÐâÕ MPEG2 ÑÞÛìèÕ ÝÕ ßÞÔÔÕàÖØÒÐîâáï"
-#: backends/platform/bada/form.cpp:277
-msgid "Move Only"
-msgstr "ÂÞÛìÚÞ ßÕàÕÜÕáâØâì"
+#~ msgid "OpenGL Normal"
+#~ msgstr "OpenGL ÑÕ× ãÒÕÛØçÕÝØï"
-#: backends/platform/bada/form.cpp:291
-msgid "Escape Key"
-msgstr "ºÛÐÒØèÐ ESC"
+#~ msgid "OpenGL Conserve"
+#~ msgstr "OpenGL á áÞåàÐÝÕÝØÕÜ"
-#: backends/platform/bada/form.cpp:296
-msgid "Game Menu"
-msgstr "¼ÕÝî ØÓàë"
+#~ msgid "OpenGL Original"
+#~ msgstr "OpenGL Ø×ÝÐçÐÛìÝëÙ"
-#: backends/platform/bada/form.cpp:301
-msgid "Show Keypad"
-msgstr "¿ÞÚÐ×Ðâì ÚÛÐÒØÐâãàã"
+#~ msgid "Current display mode"
+#~ msgstr "ÂÕÚãéØÙ ÒØÔÕÞàÕÖØÜ"
-#: backends/platform/bada/form.cpp:309
-msgid "Control Mouse"
-msgstr "ÃßàÐÒÛÕÝØÕ Üëèìî"
+#~ msgid "Current scale"
+#~ msgstr "ÂÕÚãéØÙ ÜÐáèâÐÑ"
-#: backends/events/maemosdl/maemosdl-events.cpp:192
-msgid "Clicking Enabled"
-msgstr "ÉÕÛçÚØ ÒÚÛîçÕÝë"
+#~ msgid "Active filter mode: Linear"
+#~ msgstr "°ÚâØÒÝëÙ àÕÖØÜ äØÛìâàÐ: »ØÝÕÙÝëÙ"
-#: backends/events/maemosdl/maemosdl-events.cpp:192
-msgid "Clicking Disabled"
-msgstr "ÉÕÛçÚØ ÒëÚÛîçÕÝë"
+#~ msgid "Active filter mode: Nearest"
+#~ msgstr "°ÚâØÒÝëÙ àÕÖØÜ äØÛìâàÐ: ±ÛØÖÐÙèØÙ"
#~ msgid "Enable Roland GS Mode"
#~ msgstr "²ÚÛîçØâì àÕÖØÜ Roland GS"
diff --git a/po/scummvm.pot b/po/scummvm.pot
index d5e41ba0e5..7217198637 100644
--- a/po/scummvm.pot
+++ b/po/scummvm.pot
@@ -6,9 +6,9 @@
#, fuzzy
msgid ""
msgstr ""
-"Project-Id-Version: ScummVM 1.6.0git\n"
+"Project-Id-Version: ScummVM 1.7.0git\n"
"Report-Msgid-Bugs-To: scummvm-devel@lists.sf.net\n"
-"POT-Creation-Date: 2013-04-24 13:35+0100\n"
+"POT-Creation-Date: 2014-06-07 23:06+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"
@@ -17,77 +17,77 @@ msgstr ""
"Content-Type: text/plain; charset=CHARSET\n"
"Content-Transfer-Encoding: 8bit\n"
-#: gui/about.cpp:93
+#: gui/about.cpp:94
#, c-format
msgid "(built on %s)"
msgstr ""
-#: gui/about.cpp:100
+#: gui/about.cpp:101
msgid "Features compiled in:"
msgstr ""
-#: gui/about.cpp:109
+#: gui/about.cpp:110
msgid "Available engines:"
msgstr ""
-#: gui/browser.cpp:67
+#: gui/browser.cpp:68
msgid "Show hidden files"
msgstr ""
-#: gui/browser.cpp:67
+#: gui/browser.cpp:68
msgid "Show files marked with the hidden attribute"
msgstr ""
-#: gui/browser.cpp:71
+#: gui/browser.cpp:72
msgid "Go up"
msgstr ""
-#: gui/browser.cpp:71 gui/browser.cpp:73
+#: gui/browser.cpp:72 gui/browser.cpp:74
msgid "Go to previous directory level"
msgstr ""
-#: gui/browser.cpp:73
+#: gui/browser.cpp:74
msgctxt "lowres"
msgid "Go up"
msgstr ""
-#: gui/browser.cpp:74 gui/chooser.cpp:45 gui/KeysDialog.cpp:43
-#: gui/launcher.cpp:345 gui/massadd.cpp:94 gui/options.cpp:1238
-#: gui/saveload-dialog.cpp:215 gui/saveload-dialog.cpp:275
-#: gui/saveload-dialog.cpp:545 gui/saveload-dialog.cpp:919
-#: gui/themebrowser.cpp:54 gui/fluidsynth-dialog.cpp:151
-#: engines/engine.cpp:447 engines/drascula/saveload.cpp:51
-#: engines/scumm/dialogs.cpp:190 engines/sword1/control.cpp:865
-#: engines/parallaction/saveload.cpp:274 backends/platform/wii/options.cpp:48
-#: backends/events/default/default-events.cpp:193
-#: backends/events/default/default-events.cpp:215
+#: gui/browser.cpp:75 gui/chooser.cpp:46 gui/KeysDialog.cpp:43
+#: gui/launcher.cpp:351 gui/massadd.cpp:95 gui/options.cpp:1239
+#: gui/saveload-dialog.cpp:216 gui/saveload-dialog.cpp:276
+#: gui/saveload-dialog.cpp:547 gui/saveload-dialog.cpp:922
+#: gui/themebrowser.cpp:55 gui/fluidsynth-dialog.cpp:152
+#: engines/engine.cpp:452 backends/platform/wii/options.cpp:48
+#: backends/events/default/default-events.cpp:196
+#: backends/events/default/default-events.cpp:218
+#: engines/drascula/saveload.cpp:49 engines/parallaction/saveload.cpp:274
+#: engines/scumm/dialogs.cpp:191 engines/sword1/control.cpp:865
msgid "Cancel"
msgstr ""
-#: gui/browser.cpp:75 gui/chooser.cpp:46 gui/themebrowser.cpp:55
+#: gui/browser.cpp:76 gui/chooser.cpp:47 gui/themebrowser.cpp:56
msgid "Choose"
msgstr ""
-#: gui/gui-manager.cpp:115 engines/scumm/help.cpp:125
-#: engines/scumm/help.cpp:140 engines/scumm/help.cpp:165
-#: engines/scumm/help.cpp:191 engines/scumm/help.cpp:209
-#: backends/keymapper/remap-dialog.cpp:52
+#: gui/gui-manager.cpp:117 backends/keymapper/remap-dialog.cpp:53
+#: engines/scumm/help.cpp:125 engines/scumm/help.cpp:140
+#: engines/scumm/help.cpp:165 engines/scumm/help.cpp:191
+#: engines/scumm/help.cpp:209
msgid "Close"
msgstr ""
-#: gui/gui-manager.cpp:118
+#: gui/gui-manager.cpp:120
msgid "Mouse click"
msgstr ""
-#: gui/gui-manager.cpp:122 base/main.cpp:301
+#: gui/gui-manager.cpp:124 base/main.cpp:319
msgid "Display keyboard"
msgstr ""
-#: gui/gui-manager.cpp:126 base/main.cpp:305
+#: gui/gui-manager.cpp:128 base/main.cpp:323
msgid "Remap keys"
msgstr ""
-#: gui/gui-manager.cpp:129 base/main.cpp:308
+#: gui/gui-manager.cpp:131 base/main.cpp:326
msgid "Toggle FullScreen"
msgstr ""
@@ -99,21 +99,21 @@ msgstr ""
msgid "Map"
msgstr ""
-#: gui/KeysDialog.cpp:42 gui/launcher.cpp:346 gui/launcher.cpp:1001
-#: gui/launcher.cpp:1005 gui/massadd.cpp:91 gui/options.cpp:1239
-#: gui/saveload-dialog.cpp:920 gui/fluidsynth-dialog.cpp:152
-#: engines/engine.cpp:366 engines/engine.cpp:377
-#: engines/drascula/saveload.cpp:51 engines/scumm/dialogs.cpp:192
-#: engines/scumm/scumm.cpp:1778 engines/agos/animation.cpp:558
-#: engines/groovie/script.cpp:420 engines/sky/compact.cpp:131
-#: engines/sky/compact.cpp:141 engines/sword1/animation.cpp:519
-#: engines/sword1/animation.cpp:540 engines/sword1/animation.cpp:550
-#: engines/sword1/animation.cpp:557 engines/sword1/control.cpp:865
-#: engines/sword1/logic.cpp:1633 engines/sword2/animation.cpp:419
-#: engines/sword2/animation.cpp:439 engines/sword2/animation.cpp:449
-#: engines/sword2/animation.cpp:458 engines/parallaction/saveload.cpp:274
+#: gui/KeysDialog.cpp:42 gui/launcher.cpp:352 gui/launcher.cpp:1048
+#: gui/launcher.cpp:1052 gui/massadd.cpp:92 gui/options.cpp:1240
+#: gui/saveload-dialog.cpp:923 gui/fluidsynth-dialog.cpp:153
+#: engines/engine.cpp:371 engines/engine.cpp:382
#: backends/platform/wii/options.cpp:47
#: backends/platform/wince/CELauncherDialog.cpp:54
+#: engines/agos/animation.cpp:558 engines/drascula/saveload.cpp:49
+#: engines/groovie/script.cpp:399 engines/parallaction/saveload.cpp:274
+#: engines/scumm/dialogs.cpp:193 engines/scumm/scumm.cpp:1779
+#: engines/sky/compact.cpp:131 engines/sky/compact.cpp:141
+#: engines/sword1/animation.cpp:524 engines/sword1/animation.cpp:545
+#: engines/sword1/animation.cpp:561 engines/sword1/animation.cpp:569
+#: engines/sword1/control.cpp:865 engines/sword1/logic.cpp:1633
+#: engines/sword2/animation.cpp:425 engines/sword2/animation.cpp:445
+#: engines/sword2/animation.cpp:461 engines/sword2/animation.cpp:471
msgid "OK"
msgstr ""
@@ -139,334 +139,336 @@ msgstr ""
msgid "Press the key to associate"
msgstr ""
-#: gui/launcher.cpp:187
+#: gui/launcher.cpp:193
msgid "Game"
msgstr ""
-#: gui/launcher.cpp:191
+#: gui/launcher.cpp:197
msgid "ID:"
msgstr ""
-#: gui/launcher.cpp:191 gui/launcher.cpp:193 gui/launcher.cpp:194
+#: gui/launcher.cpp:197 gui/launcher.cpp:199 gui/launcher.cpp:200
msgid ""
"Short game identifier used for referring to savegames and running the game "
"from the command line"
msgstr ""
-#: gui/launcher.cpp:193
+#: gui/launcher.cpp:199
msgctxt "lowres"
msgid "ID:"
msgstr ""
-#: gui/launcher.cpp:198
+#: gui/launcher.cpp:204
msgid "Name:"
msgstr ""
-#: gui/launcher.cpp:198 gui/launcher.cpp:200 gui/launcher.cpp:201
+#: gui/launcher.cpp:204 gui/launcher.cpp:206 gui/launcher.cpp:207
msgid "Full title of the game"
msgstr ""
-#: gui/launcher.cpp:200
+#: gui/launcher.cpp:206
msgctxt "lowres"
msgid "Name:"
msgstr ""
-#: gui/launcher.cpp:204
+#: gui/launcher.cpp:210
msgid "Language:"
msgstr ""
-#: gui/launcher.cpp:204 gui/launcher.cpp:205
+#: gui/launcher.cpp:210 gui/launcher.cpp:211
msgid ""
"Language of the game. This will not turn your Spanish game version into "
"English"
msgstr ""
-#: gui/launcher.cpp:206 gui/launcher.cpp:220 gui/options.cpp:86
-#: gui/options.cpp:736 gui/options.cpp:749 gui/options.cpp:1209
-#: audio/null.cpp:40
+#: gui/launcher.cpp:212 gui/launcher.cpp:226 gui/options.cpp:87
+#: gui/options.cpp:737 gui/options.cpp:750 gui/options.cpp:1210
+#: audio/null.cpp:41
msgid "<default>"
msgstr ""
-#: gui/launcher.cpp:216
+#: gui/launcher.cpp:222
msgid "Platform:"
msgstr ""
-#: gui/launcher.cpp:216 gui/launcher.cpp:218 gui/launcher.cpp:219
+#: gui/launcher.cpp:222 gui/launcher.cpp:224 gui/launcher.cpp:225
msgid "Platform the game was originally designed for"
msgstr ""
-#: gui/launcher.cpp:218
+#: gui/launcher.cpp:224
msgctxt "lowres"
msgid "Platform:"
msgstr ""
-#: gui/launcher.cpp:231
+#: gui/launcher.cpp:237
msgid "Engine"
msgstr ""
-#: gui/launcher.cpp:239 gui/options.cpp:1072 gui/options.cpp:1089
+#: gui/launcher.cpp:245 gui/options.cpp:1073 gui/options.cpp:1090
msgid "Graphics"
msgstr ""
-#: gui/launcher.cpp:239 gui/options.cpp:1072 gui/options.cpp:1089
+#: gui/launcher.cpp:245 gui/options.cpp:1073 gui/options.cpp:1090
msgid "GFX"
msgstr ""
-#: gui/launcher.cpp:242
+#: gui/launcher.cpp:248
msgid "Override global graphic settings"
msgstr ""
-#: gui/launcher.cpp:244
+#: gui/launcher.cpp:250
msgctxt "lowres"
msgid "Override global graphic settings"
msgstr ""
-#: gui/launcher.cpp:251 gui/options.cpp:1095
+#: gui/launcher.cpp:257 gui/options.cpp:1096
msgid "Audio"
msgstr ""
-#: gui/launcher.cpp:254
+#: gui/launcher.cpp:260
msgid "Override global audio settings"
msgstr ""
-#: gui/launcher.cpp:256
+#: gui/launcher.cpp:262
msgctxt "lowres"
msgid "Override global audio settings"
msgstr ""
-#: gui/launcher.cpp:265 gui/options.cpp:1100
+#: gui/launcher.cpp:271 gui/options.cpp:1101
msgid "Volume"
msgstr ""
-#: gui/launcher.cpp:267 gui/options.cpp:1102
+#: gui/launcher.cpp:273 gui/options.cpp:1103
msgctxt "lowres"
msgid "Volume"
msgstr ""
-#: gui/launcher.cpp:270
+#: gui/launcher.cpp:276
msgid "Override global volume settings"
msgstr ""
-#: gui/launcher.cpp:272
+#: gui/launcher.cpp:278
msgctxt "lowres"
msgid "Override global volume settings"
msgstr ""
-#: gui/launcher.cpp:280 gui/options.cpp:1110
+#: gui/launcher.cpp:286 gui/options.cpp:1111
msgid "MIDI"
msgstr ""
-#: gui/launcher.cpp:283
+#: gui/launcher.cpp:289
msgid "Override global MIDI settings"
msgstr ""
-#: gui/launcher.cpp:285
+#: gui/launcher.cpp:291
msgctxt "lowres"
msgid "Override global MIDI settings"
msgstr ""
-#: gui/launcher.cpp:294 gui/options.cpp:1116
+#: gui/launcher.cpp:300 gui/options.cpp:1117
msgid "MT-32"
msgstr ""
-#: gui/launcher.cpp:297
+#: gui/launcher.cpp:303
msgid "Override global MT-32 settings"
msgstr ""
-#: gui/launcher.cpp:299
+#: gui/launcher.cpp:305
msgctxt "lowres"
msgid "Override global MT-32 settings"
msgstr ""
-#: gui/launcher.cpp:308 gui/options.cpp:1123
+#: gui/launcher.cpp:314 gui/options.cpp:1124
msgid "Paths"
msgstr ""
-#: gui/launcher.cpp:310 gui/options.cpp:1125
+#: gui/launcher.cpp:316 gui/options.cpp:1126
msgctxt "lowres"
msgid "Paths"
msgstr ""
-#: gui/launcher.cpp:317
+#: gui/launcher.cpp:323
msgid "Game Path:"
msgstr ""
-#: gui/launcher.cpp:319
+#: gui/launcher.cpp:325
msgctxt "lowres"
msgid "Game Path:"
msgstr ""
-#: gui/launcher.cpp:324 gui/options.cpp:1149
+#: gui/launcher.cpp:330 gui/options.cpp:1150
msgid "Extra Path:"
msgstr ""
-#: gui/launcher.cpp:324 gui/launcher.cpp:326 gui/launcher.cpp:327
+#: gui/launcher.cpp:330 gui/launcher.cpp:332 gui/launcher.cpp:333
msgid "Specifies path to additional data used the game"
msgstr ""
-#: gui/launcher.cpp:326 gui/options.cpp:1151
+#: gui/launcher.cpp:332 gui/options.cpp:1152
msgctxt "lowres"
msgid "Extra Path:"
msgstr ""
-#: gui/launcher.cpp:333 gui/options.cpp:1133
+#: gui/launcher.cpp:339 gui/options.cpp:1134
msgid "Save Path:"
msgstr ""
-#: gui/launcher.cpp:333 gui/launcher.cpp:335 gui/launcher.cpp:336
-#: gui/options.cpp:1133 gui/options.cpp:1135 gui/options.cpp:1136
+#: gui/launcher.cpp:339 gui/launcher.cpp:341 gui/launcher.cpp:342
+#: gui/options.cpp:1134 gui/options.cpp:1136 gui/options.cpp:1137
msgid "Specifies where your savegames are put"
msgstr ""
-#: gui/launcher.cpp:335 gui/options.cpp:1135
+#: gui/launcher.cpp:341 gui/options.cpp:1136
msgctxt "lowres"
msgid "Save Path:"
msgstr ""
-#: gui/launcher.cpp:354 gui/launcher.cpp:453 gui/launcher.cpp:511
-#: gui/launcher.cpp:565 gui/options.cpp:1144 gui/options.cpp:1152
-#: gui/options.cpp:1161 gui/options.cpp:1276 gui/options.cpp:1282
-#: gui/options.cpp:1290 gui/options.cpp:1320 gui/options.cpp:1326
-#: gui/options.cpp:1333 gui/options.cpp:1426 gui/options.cpp:1429
-#: gui/options.cpp:1441
+#: gui/launcher.cpp:360 gui/launcher.cpp:459 gui/launcher.cpp:517
+#: gui/launcher.cpp:571 gui/options.cpp:1145 gui/options.cpp:1153
+#: gui/options.cpp:1162 gui/options.cpp:1277 gui/options.cpp:1283
+#: gui/options.cpp:1291 gui/options.cpp:1321 gui/options.cpp:1327
+#: gui/options.cpp:1334 gui/options.cpp:1427 gui/options.cpp:1430
+#: gui/options.cpp:1442
msgctxt "path"
msgid "None"
msgstr ""
-#: gui/launcher.cpp:359 gui/launcher.cpp:459 gui/launcher.cpp:569
-#: gui/options.cpp:1270 gui/options.cpp:1314 gui/options.cpp:1432
+#: gui/launcher.cpp:365 gui/launcher.cpp:465 gui/launcher.cpp:575
+#: gui/options.cpp:1271 gui/options.cpp:1315 gui/options.cpp:1433
#: backends/platform/wii/options.cpp:56
msgid "Default"
msgstr ""
-#: gui/launcher.cpp:504 gui/options.cpp:1435
+#: gui/launcher.cpp:510 gui/options.cpp:1436
msgid "Select SoundFont"
msgstr ""
-#: gui/launcher.cpp:523 gui/launcher.cpp:677
+#: gui/launcher.cpp:529 gui/launcher.cpp:682
msgid "Select directory with game data"
msgstr ""
-#: gui/launcher.cpp:541
+#: gui/launcher.cpp:547
msgid "Select additional game directory"
msgstr ""
-#: gui/launcher.cpp:553
+#: gui/launcher.cpp:559
msgid "Select directory for saved games"
msgstr ""
-#: gui/launcher.cpp:580
+#: gui/launcher.cpp:586
msgid "This game ID is already taken. Please choose another one."
msgstr ""
-#: gui/launcher.cpp:621 engines/dialogs.cpp:110
+#: gui/launcher.cpp:626 engines/dialogs.cpp:111
msgid "~Q~uit"
msgstr ""
-#: gui/launcher.cpp:621 backends/platform/sdl/macosx/appmenu_osx.mm:95
+#: gui/launcher.cpp:626 backends/platform/sdl/macosx/appmenu_osx.mm:95
msgid "Quit ScummVM"
msgstr ""
-#: gui/launcher.cpp:622
+#: gui/launcher.cpp:627
msgid "A~b~out..."
msgstr ""
-#: gui/launcher.cpp:622 backends/platform/sdl/macosx/appmenu_osx.mm:69
+#: gui/launcher.cpp:627 backends/platform/sdl/macosx/appmenu_osx.mm:69
msgid "About ScummVM"
msgstr ""
-#: gui/launcher.cpp:623
+#: gui/launcher.cpp:628
msgid "~O~ptions..."
msgstr ""
-#: gui/launcher.cpp:623
+#: gui/launcher.cpp:628
msgid "Change global ScummVM options"
msgstr ""
-#: gui/launcher.cpp:625
+#: gui/launcher.cpp:630
msgid "~S~tart"
msgstr ""
-#: gui/launcher.cpp:625
+#: gui/launcher.cpp:630
msgid "Start selected game"
msgstr ""
-#: gui/launcher.cpp:628
+#: gui/launcher.cpp:633
msgid "~L~oad..."
msgstr ""
-#: gui/launcher.cpp:628
+#: gui/launcher.cpp:633
msgid "Load savegame for selected game"
msgstr ""
-#: gui/launcher.cpp:633 gui/launcher.cpp:1120
+#: gui/launcher.cpp:638
msgid "~A~dd Game..."
msgstr ""
-#: gui/launcher.cpp:633 gui/launcher.cpp:640
+#: gui/launcher.cpp:638 gui/launcher.cpp:645
msgid "Hold Shift for Mass Add"
msgstr ""
-#: gui/launcher.cpp:635
+#: gui/launcher.cpp:640
msgid "~E~dit Game..."
msgstr ""
-#: gui/launcher.cpp:635 gui/launcher.cpp:642
+#: gui/launcher.cpp:640 gui/launcher.cpp:647
msgid "Change game options"
msgstr ""
-#: gui/launcher.cpp:637
+#: gui/launcher.cpp:642
msgid "~R~emove Game"
msgstr ""
-#: gui/launcher.cpp:637 gui/launcher.cpp:644
+#: gui/launcher.cpp:642 gui/launcher.cpp:649
msgid "Remove game from the list. The game data files stay intact"
msgstr ""
-#: gui/launcher.cpp:640 gui/launcher.cpp:1120
+#: gui/launcher.cpp:645
msgctxt "lowres"
msgid "~A~dd Game..."
msgstr ""
-#: gui/launcher.cpp:642
+#: gui/launcher.cpp:647
msgctxt "lowres"
msgid "~E~dit Game..."
msgstr ""
-#: gui/launcher.cpp:644
+#: gui/launcher.cpp:649
msgctxt "lowres"
msgid "~R~emove Game"
msgstr ""
-#: gui/launcher.cpp:652
+#: gui/launcher.cpp:657
msgid "Search in game list"
msgstr ""
-#: gui/launcher.cpp:656 gui/launcher.cpp:1167
+#: gui/launcher.cpp:661 gui/launcher.cpp:1222
msgid "Search:"
msgstr ""
-#: gui/launcher.cpp:680 engines/dialogs.cpp:114 engines/mohawk/myst.cpp:245
-#: engines/mohawk/riven.cpp:716 engines/cruise/menu.cpp:214
-#: engines/pegasus/pegasus.cpp:349
+#: gui/launcher.cpp:685 engines/dialogs.cpp:115 engines/cruise/menu.cpp:214
+#: engines/mohawk/myst.cpp:245 engines/mohawk/riven.cpp:718
+#: engines/pegasus/pegasus.cpp:353
msgid "Load game:"
msgstr ""
-#: gui/launcher.cpp:680 engines/dialogs.cpp:114 engines/scumm/dialogs.cpp:188
-#: engines/mohawk/myst.cpp:245 engines/mohawk/riven.cpp:716
-#: engines/cruise/menu.cpp:214 engines/pegasus/pegasus.cpp:349
+#: gui/launcher.cpp:685 engines/dialogs.cpp:115
#: backends/platform/wince/CEActionsPocket.cpp:267
#: backends/platform/wince/CEActionsSmartphone.cpp:231
+#: engines/cruise/menu.cpp:214 engines/mohawk/myst.cpp:245
+#: engines/mohawk/riven.cpp:718 engines/pegasus/pegasus.cpp:353
+#: engines/scumm/dialogs.cpp:189
msgid "Load"
msgstr ""
-#: gui/launcher.cpp:788
+#: gui/launcher.cpp:792
msgid ""
"Do you really want to run the mass game detector? This could potentially add "
"a huge number of games."
msgstr ""
-#: gui/launcher.cpp:789 gui/launcher.cpp:937 gui/fluidsynth-dialog.cpp:216
+#: gui/launcher.cpp:793 gui/launcher.cpp:941 gui/launcher.cpp:1000
+#: gui/fluidsynth-dialog.cpp:217
#: backends/events/symbiansdl/symbiansdl-events.cpp:184
#: backends/platform/wince/CEActionsPocket.cpp:326
#: backends/platform/wince/CEActionsSmartphone.cpp:287
@@ -474,7 +476,8 @@ msgstr ""
msgid "Yes"
msgstr ""
-#: gui/launcher.cpp:789 gui/launcher.cpp:937 gui/fluidsynth-dialog.cpp:216
+#: gui/launcher.cpp:793 gui/launcher.cpp:941 gui/launcher.cpp:1000
+#: gui/fluidsynth-dialog.cpp:217
#: backends/events/symbiansdl/symbiansdl-events.cpp:184
#: backends/platform/wince/CEActionsPocket.cpp:326
#: backends/platform/wince/CEActionsSmartphone.cpp:287
@@ -482,662 +485,658 @@ msgstr ""
msgid "No"
msgstr ""
-#: gui/launcher.cpp:837
+#: gui/launcher.cpp:841
msgid "ScummVM couldn't open the specified directory!"
msgstr ""
-#: gui/launcher.cpp:849
+#: gui/launcher.cpp:853
msgid "ScummVM could not find any game in the specified directory!"
msgstr ""
-#: gui/launcher.cpp:863
+#: gui/launcher.cpp:867
msgid "Pick the game:"
msgstr ""
-#: gui/launcher.cpp:937
+#: gui/launcher.cpp:941
msgid "Do you really want to remove this game configuration?"
msgstr ""
-#: gui/launcher.cpp:1001
-msgid "This game does not support loading games from the launcher."
-msgstr ""
-
-#: gui/launcher.cpp:1005
-msgid "ScummVM could not find any engine capable of running the selected game!"
+#: gui/launcher.cpp:999
+msgid "Do you want to load savegame?"
msgstr ""
-#: gui/launcher.cpp:1119
-msgctxt "lowres"
-msgid "Mass Add..."
+#: gui/launcher.cpp:1048
+msgid "This game does not support loading games from the launcher."
msgstr ""
-#: gui/launcher.cpp:1119
-msgid "Mass Add..."
+#: gui/launcher.cpp:1052
+msgid "ScummVM could not find any engine capable of running the selected game!"
msgstr ""
-#: gui/massadd.cpp:78 gui/massadd.cpp:81
+#: gui/massadd.cpp:79 gui/massadd.cpp:82
msgid "... progress ..."
msgstr ""
-#: gui/massadd.cpp:258
+#: gui/massadd.cpp:259
msgid "Scan complete!"
msgstr ""
-#: gui/massadd.cpp:261
+#: gui/massadd.cpp:262
#, c-format
msgid "Discovered %d new games, ignored %d previously added games."
msgstr ""
-#: gui/massadd.cpp:265
+#: gui/massadd.cpp:266
#, c-format
msgid "Scanned %d directories ..."
msgstr ""
-#: gui/massadd.cpp:268
+#: gui/massadd.cpp:269
#, c-format
msgid "Discovered %d new games, ignored %d previously added games ..."
msgstr ""
-#: gui/options.cpp:84
+#: gui/options.cpp:85
msgid "Never"
msgstr ""
-#: gui/options.cpp:84
+#: gui/options.cpp:85
msgid "every 5 mins"
msgstr ""
-#: gui/options.cpp:84
+#: gui/options.cpp:85
msgid "every 10 mins"
msgstr ""
-#: gui/options.cpp:84
+#: gui/options.cpp:85
msgid "every 15 mins"
msgstr ""
-#: gui/options.cpp:84
+#: gui/options.cpp:85
msgid "every 30 mins"
msgstr ""
-#: gui/options.cpp:86
+#: gui/options.cpp:87
msgid "8 kHz"
msgstr ""
-#: gui/options.cpp:86
+#: gui/options.cpp:87
msgid "11kHz"
msgstr ""
-#: gui/options.cpp:86
+#: gui/options.cpp:87
msgid "22 kHz"
msgstr ""
-#: gui/options.cpp:86
+#: gui/options.cpp:87
msgid "44 kHz"
msgstr ""
-#: gui/options.cpp:86
+#: gui/options.cpp:87
msgid "48 kHz"
msgstr ""
-#: gui/options.cpp:254 gui/options.cpp:480 gui/options.cpp:581
-#: gui/options.cpp:650 gui/options.cpp:858
+#: gui/options.cpp:255 gui/options.cpp:481 gui/options.cpp:582
+#: gui/options.cpp:651 gui/options.cpp:859
msgctxt "soundfont"
msgid "None"
msgstr ""
-#: gui/options.cpp:388
+#: gui/options.cpp:389
msgid "Failed to apply some of the graphic options changes:"
msgstr ""
-#: gui/options.cpp:400
+#: gui/options.cpp:401
msgid "the video mode could not be changed."
msgstr ""
-#: gui/options.cpp:406
+#: gui/options.cpp:407
msgid "the fullscreen setting could not be changed"
msgstr ""
-#: gui/options.cpp:412
+#: gui/options.cpp:413
msgid "the aspect ratio setting could not be changed"
msgstr ""
-#: gui/options.cpp:733
+#: gui/options.cpp:734
msgid "Graphics mode:"
msgstr ""
-#: gui/options.cpp:747
+#: gui/options.cpp:748
msgid "Render mode:"
msgstr ""
-#: gui/options.cpp:747 gui/options.cpp:748
+#: gui/options.cpp:748 gui/options.cpp:749
msgid "Special dithering modes supported by some games"
msgstr ""
-#: gui/options.cpp:759
-#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2236
-#: backends/graphics/openglsdl/openglsdl-graphics.cpp:476
+#: gui/options.cpp:760
+#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2249
msgid "Fullscreen mode"
msgstr ""
-#: gui/options.cpp:762
+#: gui/options.cpp:763
msgid "Aspect ratio correction"
msgstr ""
-#: gui/options.cpp:762
+#: gui/options.cpp:763
msgid "Correct aspect ratio for 320x200 games"
msgstr ""
-#: gui/options.cpp:770
+#: gui/options.cpp:771
msgid "Preferred Device:"
msgstr ""
-#: gui/options.cpp:770
+#: gui/options.cpp:771
msgid "Music Device:"
msgstr ""
-#: gui/options.cpp:770 gui/options.cpp:772
+#: gui/options.cpp:771 gui/options.cpp:773
msgid "Specifies preferred sound device or sound card emulator"
msgstr ""
-#: gui/options.cpp:770 gui/options.cpp:772 gui/options.cpp:773
+#: gui/options.cpp:771 gui/options.cpp:773 gui/options.cpp:774
msgid "Specifies output sound device or sound card emulator"
msgstr ""
-#: gui/options.cpp:772
+#: gui/options.cpp:773
msgctxt "lowres"
msgid "Preferred Dev.:"
msgstr ""
-#: gui/options.cpp:772
+#: gui/options.cpp:773
msgctxt "lowres"
msgid "Music Device:"
msgstr ""
-#: gui/options.cpp:799
+#: gui/options.cpp:800
msgid "AdLib emulator:"
msgstr ""
-#: gui/options.cpp:799 gui/options.cpp:800
+#: gui/options.cpp:800 gui/options.cpp:801
msgid "AdLib is used for music in many games"
msgstr ""
-#: gui/options.cpp:810
+#: gui/options.cpp:811
msgid "Output rate:"
msgstr ""
-#: gui/options.cpp:810 gui/options.cpp:811
+#: gui/options.cpp:811 gui/options.cpp:812
msgid ""
"Higher value specifies better sound quality but may be not supported by your "
"soundcard"
msgstr ""
-#: gui/options.cpp:821
+#: gui/options.cpp:822
msgid "GM Device:"
msgstr ""
-#: gui/options.cpp:821
+#: gui/options.cpp:822
msgid "Specifies default sound device for General MIDI output"
msgstr ""
-#: gui/options.cpp:832
+#: gui/options.cpp:833
msgid "Don't use General MIDI music"
msgstr ""
-#: gui/options.cpp:843 gui/options.cpp:909
+#: gui/options.cpp:844 gui/options.cpp:910
msgid "Use first available device"
msgstr ""
-#: gui/options.cpp:855
+#: gui/options.cpp:856
msgid "SoundFont:"
msgstr ""
-#: gui/options.cpp:855 gui/options.cpp:857 gui/options.cpp:858
+#: gui/options.cpp:856 gui/options.cpp:858 gui/options.cpp:859
msgid "SoundFont is supported by some audio cards, Fluidsynth and Timidity"
msgstr ""
-#: gui/options.cpp:857
+#: gui/options.cpp:858
msgctxt "lowres"
msgid "SoundFont:"
msgstr ""
-#: gui/options.cpp:863
+#: gui/options.cpp:864
msgid "Mixed AdLib/MIDI mode"
msgstr ""
-#: gui/options.cpp:863
+#: gui/options.cpp:864
msgid "Use both MIDI and AdLib sound generation"
msgstr ""
-#: gui/options.cpp:866
+#: gui/options.cpp:867
msgid "MIDI gain:"
msgstr ""
-#: gui/options.cpp:873
+#: gui/options.cpp:874
msgid "FluidSynth Settings"
msgstr ""
-#: gui/options.cpp:880
+#: gui/options.cpp:881
msgid "MT-32 Device:"
msgstr ""
-#: gui/options.cpp:880
+#: gui/options.cpp:881
msgid "Specifies default sound device for Roland MT-32/LAPC1/CM32l/CM64 output"
msgstr ""
-#: gui/options.cpp:885
+#: gui/options.cpp:886
msgid "True Roland MT-32 (disable GM emulation)"
msgstr ""
-#: gui/options.cpp:885 gui/options.cpp:887
+#: gui/options.cpp:886 gui/options.cpp:888
msgid ""
"Check if you want to use your real hardware Roland-compatible sound device "
"connected to your computer"
msgstr ""
-#: gui/options.cpp:887
+#: gui/options.cpp:888
msgctxt "lowres"
msgid "True Roland MT-32 (no GM emulation)"
msgstr ""
-#: gui/options.cpp:890
-msgid "Roland GS Mode (disable GM mapping)"
+#: gui/options.cpp:891
+msgid "Roland GS Device (enable MT-32 mappings)"
msgstr ""
-#: gui/options.cpp:890
-msgid "Turns off General MIDI mapping for games with Roland MT-32 soundtrack"
+#: gui/options.cpp:891
+msgid ""
+"Check if you want to enable patch mappings to emulate an MT-32 on a Roland "
+"GS device"
msgstr ""
-#: gui/options.cpp:899
+#: gui/options.cpp:900
msgid "Don't use Roland MT-32 music"
msgstr ""
-#: gui/options.cpp:926
+#: gui/options.cpp:927
msgid "Text and Speech:"
msgstr ""
-#: gui/options.cpp:930 gui/options.cpp:940
+#: gui/options.cpp:931 gui/options.cpp:941
msgid "Speech"
msgstr ""
-#: gui/options.cpp:931 gui/options.cpp:941
+#: gui/options.cpp:932 gui/options.cpp:942
msgid "Subtitles"
msgstr ""
-#: gui/options.cpp:932
+#: gui/options.cpp:933
msgid "Both"
msgstr ""
-#: gui/options.cpp:934
+#: gui/options.cpp:935
msgid "Subtitle speed:"
msgstr ""
-#: gui/options.cpp:936
+#: gui/options.cpp:937
msgctxt "lowres"
msgid "Text and Speech:"
msgstr ""
-#: gui/options.cpp:940
+#: gui/options.cpp:941
msgid "Spch"
msgstr ""
-#: gui/options.cpp:941
+#: gui/options.cpp:942
msgid "Subs"
msgstr ""
-#: gui/options.cpp:942
+#: gui/options.cpp:943
msgctxt "lowres"
msgid "Both"
msgstr ""
-#: gui/options.cpp:942
+#: gui/options.cpp:943
msgid "Show subtitles and play speech"
msgstr ""
-#: gui/options.cpp:944
+#: gui/options.cpp:945
msgctxt "lowres"
msgid "Subtitle speed:"
msgstr ""
-#: gui/options.cpp:960
+#: gui/options.cpp:961
msgid "Music volume:"
msgstr ""
-#: gui/options.cpp:962
+#: gui/options.cpp:963
msgctxt "lowres"
msgid "Music volume:"
msgstr ""
-#: gui/options.cpp:969
+#: gui/options.cpp:970
msgid "Mute All"
msgstr ""
-#: gui/options.cpp:972
+#: gui/options.cpp:973
msgid "SFX volume:"
msgstr ""
-#: gui/options.cpp:972 gui/options.cpp:974 gui/options.cpp:975
+#: gui/options.cpp:973 gui/options.cpp:975 gui/options.cpp:976
msgid "Special sound effects volume"
msgstr ""
-#: gui/options.cpp:974
+#: gui/options.cpp:975
msgctxt "lowres"
msgid "SFX volume:"
msgstr ""
-#: gui/options.cpp:982
+#: gui/options.cpp:983
msgid "Speech volume:"
msgstr ""
-#: gui/options.cpp:984
+#: gui/options.cpp:985
msgctxt "lowres"
msgid "Speech volume:"
msgstr ""
-#: gui/options.cpp:1141
+#: gui/options.cpp:1142
msgid "Theme Path:"
msgstr ""
-#: gui/options.cpp:1143
+#: gui/options.cpp:1144
msgctxt "lowres"
msgid "Theme Path:"
msgstr ""
-#: gui/options.cpp:1149 gui/options.cpp:1151 gui/options.cpp:1152
+#: gui/options.cpp:1150 gui/options.cpp:1152 gui/options.cpp:1153
msgid "Specifies path to additional data used by all games or ScummVM"
msgstr ""
-#: gui/options.cpp:1158
+#: gui/options.cpp:1159
msgid "Plugins Path:"
msgstr ""
-#: gui/options.cpp:1160
+#: gui/options.cpp:1161
msgctxt "lowres"
msgid "Plugins Path:"
msgstr ""
-#: gui/options.cpp:1169 gui/fluidsynth-dialog.cpp:137
+#: gui/options.cpp:1170 gui/fluidsynth-dialog.cpp:138
msgid "Misc"
msgstr ""
-#: gui/options.cpp:1171
+#: gui/options.cpp:1172
msgctxt "lowres"
msgid "Misc"
msgstr ""
-#: gui/options.cpp:1173
+#: gui/options.cpp:1174
msgid "Theme:"
msgstr ""
-#: gui/options.cpp:1177
+#: gui/options.cpp:1178
msgid "GUI Renderer:"
msgstr ""
-#: gui/options.cpp:1189
+#: gui/options.cpp:1190
msgid "Autosave:"
msgstr ""
-#: gui/options.cpp:1191
+#: gui/options.cpp:1192
msgctxt "lowres"
msgid "Autosave:"
msgstr ""
-#: gui/options.cpp:1199
+#: gui/options.cpp:1200
msgid "Keys"
msgstr ""
-#: gui/options.cpp:1206
+#: gui/options.cpp:1207
msgid "GUI Language:"
msgstr ""
-#: gui/options.cpp:1206
+#: gui/options.cpp:1207
msgid "Language of ScummVM GUI"
msgstr ""
-#: gui/options.cpp:1365
+#: gui/options.cpp:1366
msgid "You have to restart ScummVM before your changes will take effect."
msgstr ""
-#: gui/options.cpp:1378
+#: gui/options.cpp:1379
msgid "Select directory for savegames"
msgstr ""
-#: gui/options.cpp:1385
+#: gui/options.cpp:1386
msgid "The chosen directory cannot be written to. Please select another one."
msgstr ""
-#: gui/options.cpp:1394
+#: gui/options.cpp:1395
msgid "Select directory for GUI themes"
msgstr ""
-#: gui/options.cpp:1404
+#: gui/options.cpp:1405
msgid "Select directory for extra files"
msgstr ""
-#: gui/options.cpp:1415
+#: gui/options.cpp:1416
msgid "Select directory for plugins"
msgstr ""
-#: gui/options.cpp:1468
+#: gui/options.cpp:1469
msgid ""
"The theme you selected does not support your current language. If you want "
"to use this theme you need to switch to another language first."
msgstr ""
-#: gui/saveload-dialog.cpp:166
+#: gui/saveload-dialog.cpp:167
msgid "List view"
msgstr ""
-#: gui/saveload-dialog.cpp:167
+#: gui/saveload-dialog.cpp:168
msgid "Grid view"
msgstr ""
-#: gui/saveload-dialog.cpp:210 gui/saveload-dialog.cpp:358
+#: gui/saveload-dialog.cpp:211 gui/saveload-dialog.cpp:360
msgid "No date saved"
msgstr ""
-#: gui/saveload-dialog.cpp:211 gui/saveload-dialog.cpp:359
+#: gui/saveload-dialog.cpp:212 gui/saveload-dialog.cpp:361
msgid "No time saved"
msgstr ""
-#: gui/saveload-dialog.cpp:212 gui/saveload-dialog.cpp:360
+#: gui/saveload-dialog.cpp:213 gui/saveload-dialog.cpp:362
msgid "No playtime saved"
msgstr ""
-#: gui/saveload-dialog.cpp:219 gui/saveload-dialog.cpp:275
+#: gui/saveload-dialog.cpp:220 gui/saveload-dialog.cpp:276
msgid "Delete"
msgstr ""
-#: gui/saveload-dialog.cpp:274
+#: gui/saveload-dialog.cpp:275
msgid "Do you really want to delete this savegame?"
msgstr ""
-#: gui/saveload-dialog.cpp:383 gui/saveload-dialog.cpp:872
+#: gui/saveload-dialog.cpp:385 gui/saveload-dialog.cpp:875
msgid "Date: "
msgstr ""
-#: gui/saveload-dialog.cpp:387 gui/saveload-dialog.cpp:878
+#: gui/saveload-dialog.cpp:389 gui/saveload-dialog.cpp:881
msgid "Time: "
msgstr ""
-#: gui/saveload-dialog.cpp:393 gui/saveload-dialog.cpp:886
+#: gui/saveload-dialog.cpp:395 gui/saveload-dialog.cpp:889
msgid "Playtime: "
msgstr ""
-#: gui/saveload-dialog.cpp:406 gui/saveload-dialog.cpp:494
+#: gui/saveload-dialog.cpp:408 gui/saveload-dialog.cpp:496
msgid "Untitled savestate"
msgstr ""
-#: gui/saveload-dialog.cpp:546
+#: gui/saveload-dialog.cpp:548
msgid "Next"
msgstr ""
-#: gui/saveload-dialog.cpp:549
+#: gui/saveload-dialog.cpp:551
msgid "Prev"
msgstr ""
-#: gui/saveload-dialog.cpp:736
+#: gui/saveload-dialog.cpp:739
msgid "New Save"
msgstr ""
-#: gui/saveload-dialog.cpp:736
+#: gui/saveload-dialog.cpp:739
msgid "Create a new save game"
msgstr ""
-#: gui/saveload-dialog.cpp:865
+#: gui/saveload-dialog.cpp:868
msgid "Name: "
msgstr ""
-#: gui/saveload-dialog.cpp:937
+#: gui/saveload-dialog.cpp:940
#, c-format
msgid "Enter a description for slot %d:"
msgstr ""
-#: gui/themebrowser.cpp:44
+#: gui/themebrowser.cpp:45
msgid "Select a Theme"
msgstr ""
-#: gui/ThemeEngine.cpp:337
+#: gui/ThemeEngine.cpp:347
msgid "Disabled GFX"
msgstr ""
-#: gui/ThemeEngine.cpp:337
+#: gui/ThemeEngine.cpp:347
msgctxt "lowres"
msgid "Disabled GFX"
msgstr ""
-#: gui/ThemeEngine.cpp:338
-msgid "Standard Renderer (16bpp)"
+#: gui/ThemeEngine.cpp:348
+msgid "Standard Renderer"
msgstr ""
-#: gui/ThemeEngine.cpp:338
-msgid "Standard (16bpp)"
+#: gui/ThemeEngine.cpp:348 engines/scumm/dialogs.cpp:659
+msgid "Standard"
msgstr ""
-#: gui/ThemeEngine.cpp:340
-msgid "Antialiased Renderer (16bpp)"
+#: gui/ThemeEngine.cpp:350
+msgid "Antialiased Renderer"
msgstr ""
-#: gui/ThemeEngine.cpp:340
-msgid "Antialiased (16bpp)"
+#: gui/ThemeEngine.cpp:350
+msgid "Antialiased"
msgstr ""
-#: gui/widget.cpp:322 gui/widget.cpp:324 gui/widget.cpp:330 gui/widget.cpp:332
+#: gui/widget.cpp:323 gui/widget.cpp:325 gui/widget.cpp:331 gui/widget.cpp:333
msgid "Clear value"
msgstr ""
-#: gui/fluidsynth-dialog.cpp:67
+#: gui/fluidsynth-dialog.cpp:68
msgid "Reverb"
msgstr ""
-#: gui/fluidsynth-dialog.cpp:69 gui/fluidsynth-dialog.cpp:101
+#: gui/fluidsynth-dialog.cpp:70 gui/fluidsynth-dialog.cpp:102
msgid "Active"
msgstr ""
-#: gui/fluidsynth-dialog.cpp:71
+#: gui/fluidsynth-dialog.cpp:72
msgid "Room:"
msgstr ""
-#: gui/fluidsynth-dialog.cpp:78
+#: gui/fluidsynth-dialog.cpp:79
msgid "Damp:"
msgstr ""
-#: gui/fluidsynth-dialog.cpp:85
+#: gui/fluidsynth-dialog.cpp:86
msgid "Width:"
msgstr ""
-#: gui/fluidsynth-dialog.cpp:92 gui/fluidsynth-dialog.cpp:110
+#: gui/fluidsynth-dialog.cpp:93 gui/fluidsynth-dialog.cpp:111
msgid "Level:"
msgstr ""
-#: gui/fluidsynth-dialog.cpp:99
+#: gui/fluidsynth-dialog.cpp:100
msgid "Chorus"
msgstr ""
-#: gui/fluidsynth-dialog.cpp:103
+#: gui/fluidsynth-dialog.cpp:104
msgid "N:"
msgstr ""
-#: gui/fluidsynth-dialog.cpp:117
+#: gui/fluidsynth-dialog.cpp:118
msgid "Speed:"
msgstr ""
-#: gui/fluidsynth-dialog.cpp:124
+#: gui/fluidsynth-dialog.cpp:125
msgid "Depth:"
msgstr ""
-#: gui/fluidsynth-dialog.cpp:131
+#: gui/fluidsynth-dialog.cpp:132
msgid "Type:"
msgstr ""
-#: gui/fluidsynth-dialog.cpp:134
+#: gui/fluidsynth-dialog.cpp:135
msgid "Sine"
msgstr ""
-#: gui/fluidsynth-dialog.cpp:135
+#: gui/fluidsynth-dialog.cpp:136
msgid "Triangle"
msgstr ""
-#: gui/fluidsynth-dialog.cpp:139
+#: gui/fluidsynth-dialog.cpp:140
msgid "Interpolation:"
msgstr ""
-#: gui/fluidsynth-dialog.cpp:142
+#: gui/fluidsynth-dialog.cpp:143
msgid "None (fastest)"
msgstr ""
-#: gui/fluidsynth-dialog.cpp:143
+#: gui/fluidsynth-dialog.cpp:144
msgid "Linear"
msgstr ""
-#: gui/fluidsynth-dialog.cpp:144
+#: gui/fluidsynth-dialog.cpp:145
msgid "Fourth-order"
msgstr ""
-#: gui/fluidsynth-dialog.cpp:145
+#: gui/fluidsynth-dialog.cpp:146
msgid "Seventh-order"
msgstr ""
-#: gui/fluidsynth-dialog.cpp:149
+#: gui/fluidsynth-dialog.cpp:150
msgid "Reset"
msgstr ""
-#: gui/fluidsynth-dialog.cpp:149
+#: gui/fluidsynth-dialog.cpp:150
msgid "Reset all FluidSynth settings to their default values."
msgstr ""
-#: gui/fluidsynth-dialog.cpp:216
+#: gui/fluidsynth-dialog.cpp:217
msgid ""
"Do you really want to reset all FluidSynth settings to their default values?"
msgstr ""
-#: base/main.cpp:210
+#: base/main.cpp:228
#, c-format
msgid "Engine does not support debug level '%s'"
msgstr ""
-#: base/main.cpp:288
+#: base/main.cpp:306
msgid "Menu"
msgstr ""
-#: base/main.cpp:291 backends/platform/symbian/src/SymbianActions.cpp:45
+#: base/main.cpp:309 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:294 backends/platform/symbian/src/SymbianActions.cpp:50
+#: base/main.cpp:312 backends/platform/symbian/src/SymbianActions.cpp:50
#: backends/platform/wince/CEActionsPocket.cpp:42
msgid "Pause"
msgstr ""
-#: base/main.cpp:297
+#: base/main.cpp:315
msgid "Skip line"
msgstr ""
-#: base/main.cpp:468
+#: base/main.cpp:507
msgid "Error running game:"
msgstr ""
-#: base/main.cpp:492
+#: base/main.cpp:536
msgid "Could not find any engine capable of running the selected game"
msgstr ""
@@ -1205,116 +1204,116 @@ msgstr ""
msgid "Unknown error"
msgstr ""
-#: engines/advancedDetector.cpp:316
+#: engines/advancedDetector.cpp:317
#, c-format
msgid "The game in '%s' seems to be unknown."
msgstr ""
-#: engines/advancedDetector.cpp:317
+#: engines/advancedDetector.cpp:318
msgid "Please, report the following data to the ScummVM team along with name"
msgstr ""
-#: engines/advancedDetector.cpp:319
+#: engines/advancedDetector.cpp:320
msgid "of the game you tried to add and its version/language/etc.:"
msgstr ""
-#: engines/dialogs.cpp:84
+#: engines/dialogs.cpp:85
msgid "~R~esume"
msgstr ""
-#: engines/dialogs.cpp:86
+#: engines/dialogs.cpp:87
msgid "~L~oad"
msgstr ""
-#: engines/dialogs.cpp:90
+#: engines/dialogs.cpp:91
msgid "~S~ave"
msgstr ""
-#: engines/dialogs.cpp:94
+#: engines/dialogs.cpp:95
msgid "~O~ptions"
msgstr ""
-#: engines/dialogs.cpp:99
+#: engines/dialogs.cpp:100
msgid "~H~elp"
msgstr ""
-#: engines/dialogs.cpp:101
+#: engines/dialogs.cpp:102
msgid "~A~bout"
msgstr ""
-#: engines/dialogs.cpp:104 engines/dialogs.cpp:180
+#: engines/dialogs.cpp:105 engines/dialogs.cpp:181
msgid "~R~eturn to Launcher"
msgstr ""
-#: engines/dialogs.cpp:106 engines/dialogs.cpp:182
+#: engines/dialogs.cpp:107 engines/dialogs.cpp:183
msgctxt "lowres"
msgid "~R~eturn to Launcher"
msgstr ""
-#: engines/dialogs.cpp:115 engines/agi/saveload.cpp:803
-#: engines/drascula/saveload.cpp:338 engines/cruise/menu.cpp:212
-#: engines/sci/engine/kfile.cpp:742 engines/toltecs/menu.cpp:284
-#: engines/pegasus/pegasus.cpp:373
+#: engines/dialogs.cpp:116 engines/agi/saveload.cpp:803
+#: engines/cruise/menu.cpp:212 engines/drascula/saveload.cpp:336
+#: engines/neverhood/menumodule.cpp:873 engines/pegasus/pegasus.cpp:377
+#: engines/sci/engine/kfile.cpp:758 engines/toltecs/menu.cpp:281
msgid "Save game:"
msgstr ""
-#: engines/dialogs.cpp:115 engines/agi/saveload.cpp:803
-#: engines/drascula/saveload.cpp:338 engines/scumm/dialogs.cpp:187
-#: engines/cruise/menu.cpp:212 engines/sci/engine/kfile.cpp:742
-#: engines/toltecs/menu.cpp:284 engines/pegasus/pegasus.cpp:373
-#: backends/platform/symbian/src/SymbianActions.cpp:44
+#: engines/dialogs.cpp:116 backends/platform/symbian/src/SymbianActions.cpp:44
#: backends/platform/wince/CEActionsPocket.cpp:43
#: backends/platform/wince/CEActionsPocket.cpp:267
#: backends/platform/wince/CEActionsSmartphone.cpp:45
#: backends/platform/wince/CEActionsSmartphone.cpp:231
+#: engines/agi/saveload.cpp:803 engines/cruise/menu.cpp:212
+#: engines/drascula/saveload.cpp:336 engines/neverhood/menumodule.cpp:873
+#: engines/pegasus/pegasus.cpp:377 engines/sci/engine/kfile.cpp:758
+#: engines/scumm/dialogs.cpp:188 engines/toltecs/menu.cpp:281
msgid "Save"
msgstr ""
-#: engines/dialogs.cpp:144
+#: engines/dialogs.cpp:145
msgid ""
"Sorry, this engine does not currently provide in-game help. Please consult "
"the README for basic information, and for instructions on how to obtain "
"further assistance."
msgstr ""
-#: engines/dialogs.cpp:228
+#: engines/dialogs.cpp:234 engines/pegasus/pegasus.cpp:393
#, c-format
msgid ""
"Gamestate save failed (%s)! Please consult the README for basic information, "
"and for instructions on how to obtain further assistance."
msgstr ""
-#: engines/dialogs.cpp:301 engines/mohawk/dialogs.cpp:109
+#: engines/dialogs.cpp:307 engines/mohawk/dialogs.cpp:109
#: engines/mohawk/dialogs.cpp:170
msgid "~O~K"
msgstr ""
-#: engines/dialogs.cpp:302 engines/mohawk/dialogs.cpp:110
+#: engines/dialogs.cpp:308 engines/mohawk/dialogs.cpp:110
#: engines/mohawk/dialogs.cpp:171
msgid "~C~ancel"
msgstr ""
-#: engines/dialogs.cpp:305
+#: engines/dialogs.cpp:311
msgid "~K~eys"
msgstr ""
-#: engines/engine.cpp:240
+#: engines/engine.cpp:245
msgid "Could not initialize color format."
msgstr ""
-#: engines/engine.cpp:248
+#: engines/engine.cpp:253
msgid "Could not switch to video mode: '"
msgstr ""
-#: engines/engine.cpp:257
+#: engines/engine.cpp:262
msgid "Could not apply aspect ratio setting."
msgstr ""
-#: engines/engine.cpp:262
+#: engines/engine.cpp:267
msgid "Could not apply fullscreen setting."
msgstr ""
-#: engines/engine.cpp:362
+#: engines/engine.cpp:367
msgid ""
"You appear to be playing this game directly\n"
"from the CD. This is known to cause problems,\n"
@@ -1323,7 +1322,7 @@ msgid ""
"See the README file for details."
msgstr ""
-#: engines/engine.cpp:373
+#: engines/engine.cpp:378
msgid ""
"This game has audio tracks in its disk. These\n"
"tracks need to be ripped from the disk using\n"
@@ -1332,788 +1331,739 @@ msgid ""
"See the README file for details."
msgstr ""
-#: engines/engine.cpp:431
+#: engines/engine.cpp:436
#, c-format
msgid ""
"Gamestate load failed (%s)! Please consult the README for basic information, "
"and for instructions on how to obtain further assistance."
msgstr ""
-#: engines/engine.cpp:444
+#: engines/engine.cpp:449
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:447
+#: engines/engine.cpp:452
msgid "Start anyway"
msgstr ""
-#: engines/agi/detection.cpp:142 engines/drascula/detection.cpp:270
-#: engines/dreamweb/detection.cpp:47 engines/sci/detection.cpp:393
-#: engines/toltecs/detection.cpp:173
-msgid "Use original save/load screens"
-msgstr ""
-
-#: engines/agi/detection.cpp:143 engines/drascula/detection.cpp:271
-#: engines/dreamweb/detection.cpp:48 engines/sci/detection.cpp:394
-#: engines/toltecs/detection.cpp:174
-msgid "Use the original save/load screens, instead of the ScummVM ones"
-msgstr ""
-
-#: engines/agi/saveload.cpp:816 engines/drascula/saveload.cpp:351
-#: engines/sci/engine/kfile.cpp:841 engines/toltecs/menu.cpp:259
-msgid "Restore game:"
+#: audio/fmopl.cpp:50
+msgid "MAME OPL emulator"
msgstr ""
-#: engines/agi/saveload.cpp:816 engines/drascula/saveload.cpp:351
-#: engines/sci/engine/kfile.cpp:841 engines/toltecs/menu.cpp:259
-msgid "Restore"
+#: audio/fmopl.cpp:52
+msgid "DOSBox OPL emulator"
msgstr ""
-#: engines/drascula/saveload.cpp:49
+#: audio/mididrv.cpp:209
+#, c-format
msgid ""
-"ScummVM found that you have old savefiles for Drascula 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"
-msgstr ""
-
-#: engines/dreamweb/detection.cpp:57
-msgid "Use bright palette mode"
-msgstr ""
-
-#: engines/dreamweb/detection.cpp:58
-msgid "Display graphics using the game's bright palette"
-msgstr ""
-
-#: engines/sci/detection.cpp:373
-msgid "EGA undithering"
-msgstr ""
-
-#: engines/sci/detection.cpp:374
-msgid "Enable undithering in EGA games"
-msgstr ""
-
-#: engines/sci/detection.cpp:383
-msgid "Prefer digital sound effects"
-msgstr ""
-
-#: engines/sci/detection.cpp:384
-msgid "Prefer digital sound effects instead of synthesized ones"
+"The selected audio device '%s' was not found (e.g. might be turned off or "
+"disconnected)."
msgstr ""
-#: engines/sci/detection.cpp:403
-msgid "Use IMF/Yamaha FB-01 for MIDI output"
+#: audio/mididrv.cpp:209 audio/mididrv.cpp:221 audio/mididrv.cpp:257
+#: audio/mididrv.cpp:272
+msgid "Attempting to fall back to the next available device..."
msgstr ""
-#: engines/sci/detection.cpp:404
+#: audio/mididrv.cpp:221
+#, c-format
msgid ""
-"Use an IBM Music Feature card or a Yamaha FB-01 FM synth module for MIDI "
-"output"
-msgstr ""
-
-#: engines/sci/detection.cpp:414
-msgid "Use CD audio"
-msgstr ""
-
-#: engines/sci/detection.cpp:415
-msgid "Use CD audio instead of in-game audio, if available"
+"The selected audio device '%s' cannot be used. See log file for more "
+"information."
msgstr ""
-#: engines/sci/detection.cpp:425
-msgid "Use Windows cursors"
+#: audio/mididrv.cpp:257
+#, c-format
+msgid ""
+"The preferred audio device '%s' was not found (e.g. might be turned off or "
+"disconnected)."
msgstr ""
-#: engines/sci/detection.cpp:426
+#: audio/mididrv.cpp:272
+#, c-format
msgid ""
-"Use the Windows cursors (smaller and monochrome) instead of the DOS ones"
+"The preferred audio device '%s' cannot be used. See log file for more "
+"information."
msgstr ""
-#: engines/sci/detection.cpp:436
-msgid "Use silver cursors"
+#: audio/null.h:44
+msgid "No music"
msgstr ""
-#: engines/sci/detection.cpp:437
-msgid ""
-"Use the alternate set of silver cursors, instead of the normal golden ones"
+#: audio/mods/paula.cpp:196
+msgid "Amiga Audio Emulator"
msgstr ""
-#: engines/scumm/dialogs.cpp:175
-#, c-format
-msgid "Insert Disk %c and Press Button to Continue."
+#: audio/softsynth/adlib.cpp:2285
+msgid "AdLib Emulator"
msgstr ""
-#: engines/scumm/dialogs.cpp:176
-#, c-format
-msgid "Unable to Find %s, (%c%d) Press Button."
+#: audio/softsynth/appleiigs.cpp:33
+msgid "Apple II GS Emulator (NOT IMPLEMENTED)"
msgstr ""
-#: engines/scumm/dialogs.cpp:177
-#, c-format
-msgid "Error reading disk %c, (%c%d) Press Button."
+#: audio/softsynth/sid.cpp:1430
+msgid "C64 Audio Emulator"
msgstr ""
-#: engines/scumm/dialogs.cpp:178
-msgid "Game Paused. Press SPACE to Continue."
+#: audio/softsynth/mt32.cpp:200
+msgid "Initializing MT-32 Emulator"
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)"
+#: audio/softsynth/mt32.cpp:426
+msgid "MT-32 Emulator"
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)"
+#: audio/softsynth/pcspk.cpp:139
+msgid "PC Speaker Emulator"
msgstr ""
-#: engines/scumm/dialogs.cpp:189
-msgid "Play"
+#: audio/softsynth/pcspk.cpp:158
+msgid "IBM PCjr Emulator"
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:215
-msgid "Quit"
+#: backends/keymapper/remap-dialog.cpp:48
+msgid "Keymap:"
msgstr ""
-#: engines/scumm/dialogs.cpp:193
-msgid "Insert save/load game disk"
+#: backends/keymapper/remap-dialog.cpp:67
+msgid " (Effective)"
msgstr ""
-#: engines/scumm/dialogs.cpp:194
-msgid "You must enter a name"
+#: backends/keymapper/remap-dialog.cpp:107
+msgid " (Active)"
msgstr ""
-#: engines/scumm/dialogs.cpp:195
-msgid "The game was NOT saved (disk full?)"
+#: backends/keymapper/remap-dialog.cpp:107
+msgid " (Blocked)"
msgstr ""
-#: engines/scumm/dialogs.cpp:196
-msgid "The game was NOT loaded"
+#: backends/keymapper/remap-dialog.cpp:120
+msgid " (Global)"
msgstr ""
-#: engines/scumm/dialogs.cpp:197
-#, c-format
-msgid "Saving '%s'"
+#: backends/keymapper/remap-dialog.cpp:128
+msgid " (Game)"
msgstr ""
-#: engines/scumm/dialogs.cpp:198
-#, c-format
-msgid "Loading '%s'"
+#: backends/midi/windows.cpp:165
+msgid "Windows MIDI"
msgstr ""
-#: engines/scumm/dialogs.cpp:199
-msgid "Name your SAVE game"
+#: backends/platform/ds/arm9/source/dsoptions.cpp:56
+#: engines/scumm/dialogs.cpp:291
+msgid "~C~lose"
msgstr ""
-#: engines/scumm/dialogs.cpp:200
-msgid "Select a game to LOAD"
+#: backends/platform/ds/arm9/source/dsoptions.cpp:57
+msgid "ScummVM Main Menu"
msgstr ""
-#: engines/scumm/dialogs.cpp:201
-msgid "Game title)"
+#: backends/platform/ds/arm9/source/dsoptions.cpp:63
+msgid "~L~eft handed mode"
msgstr ""
-#. I18N: Previous page button
-#: engines/scumm/dialogs.cpp:287
-msgid "~P~revious"
+#: backends/platform/ds/arm9/source/dsoptions.cpp:64
+msgid "~I~ndy fight controls"
msgstr ""
-#. I18N: Next page button
-#: engines/scumm/dialogs.cpp:289
-msgid "~N~ext"
+#: backends/platform/ds/arm9/source/dsoptions.cpp:65
+msgid "Show mouse cursor"
msgstr ""
-#: engines/scumm/dialogs.cpp:290
-#: backends/platform/ds/arm9/source/dsoptions.cpp:56
-msgid "~C~lose"
+#: backends/platform/ds/arm9/source/dsoptions.cpp:66
+msgid "Snap to edges"
msgstr ""
-#: engines/scumm/dialogs.cpp:597
-msgid "Speech Only"
+#: backends/platform/ds/arm9/source/dsoptions.cpp:68
+msgid "Touch X Offset"
msgstr ""
-#: engines/scumm/dialogs.cpp:598
-msgid "Speech and Subtitles"
+#: backends/platform/ds/arm9/source/dsoptions.cpp:75
+msgid "Touch Y Offset"
msgstr ""
-#: engines/scumm/dialogs.cpp:599
-msgid "Subtitles Only"
+#: backends/platform/ds/arm9/source/dsoptions.cpp:87
+msgid "Use laptop trackpad-style cursor control"
msgstr ""
-#: engines/scumm/dialogs.cpp:607
-msgctxt "lowres"
-msgid "Speech & Subs"
+#: backends/platform/ds/arm9/source/dsoptions.cpp:88
+msgid "Tap for left click, double tap right click"
msgstr ""
-#: engines/scumm/dialogs.cpp:653
-msgid "Select a Proficiency Level."
+#: backends/platform/ds/arm9/source/dsoptions.cpp:90
+msgid "Sensitivity"
msgstr ""
-#: engines/scumm/dialogs.cpp:655
-msgid "Refer to your Loom(TM) manual for help."
+#: backends/platform/ds/arm9/source/dsoptions.cpp:99
+msgid "Initial top screen scale:"
msgstr ""
-#: engines/scumm/dialogs.cpp:658
-msgid "Standard"
+#: backends/platform/ds/arm9/source/dsoptions.cpp:105
+msgid "Main screen scaling:"
msgstr ""
-#: engines/scumm/dialogs.cpp:659
-msgid "Practice"
+#: backends/platform/ds/arm9/source/dsoptions.cpp:107
+msgid "Hardware scale (fast, but low quality)"
msgstr ""
-#: engines/scumm/dialogs.cpp:660
-msgid "Expert"
+#: backends/platform/ds/arm9/source/dsoptions.cpp:108
+msgid "Software scale (good quality, but slower)"
msgstr ""
-#: engines/scumm/help.cpp:73
-msgid "Common keyboard commands:"
+#: backends/platform/ds/arm9/source/dsoptions.cpp:109
+msgid "Unscaled (you must scroll left and right)"
msgstr ""
-#: engines/scumm/help.cpp:74
-msgid "Save / Load dialog"
+#: backends/platform/ds/arm9/source/dsoptions.cpp:111
+msgid "Brightness:"
msgstr ""
-#: engines/scumm/help.cpp:76
-msgid "Skip line of text"
+#: backends/platform/ds/arm9/source/dsoptions.cpp:121
+msgid "High quality audio (slower) (reboot)"
msgstr ""
-#: engines/scumm/help.cpp:77
-msgid "Esc"
+#: backends/platform/ds/arm9/source/dsoptions.cpp:122
+msgid "Disable power off"
msgstr ""
-#: engines/scumm/help.cpp:77
-msgid "Skip cutscene"
+#: backends/platform/iphone/osys_events.cpp:300
+msgid "Mouse-click-and-drag mode enabled."
msgstr ""
-#: engines/scumm/help.cpp:78
-msgid "Space"
+#: backends/platform/iphone/osys_events.cpp:302
+msgid "Mouse-click-and-drag mode disabled."
msgstr ""
-#: engines/scumm/help.cpp:78
-msgid "Pause game"
+#: backends/platform/iphone/osys_events.cpp:313
+msgid "Touchpad mode enabled."
msgstr ""
-#: engines/scumm/help.cpp:79 engines/scumm/help.cpp:84
-#: engines/scumm/help.cpp:95 engines/scumm/help.cpp:96
-#: engines/scumm/help.cpp:97 engines/scumm/help.cpp:98
-#: engines/scumm/help.cpp:99 engines/scumm/help.cpp:100
-#: engines/scumm/help.cpp:101 engines/scumm/help.cpp:102
-msgid "Ctrl"
+#: backends/platform/iphone/osys_events.cpp:315
+msgid "Touchpad mode disabled."
msgstr ""
-#: engines/scumm/help.cpp:79
-msgid "Load game state 1-10"
+#: backends/platform/maemo/maemo.cpp:209
+msgid "Click Mode"
msgstr ""
-#: 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"
+#: backends/platform/maemo/maemo.cpp:215
+#: backends/platform/symbian/src/SymbianActions.cpp:42
+#: backends/platform/wince/CEActionsPocket.cpp:60
+#: backends/platform/wince/CEActionsSmartphone.cpp:43
+#: backends/platform/tizen/form.cpp:275
+msgid "Left Click"
msgstr ""
-#: engines/scumm/help.cpp:80
-msgid "Save game state 1-10"
+#: backends/platform/maemo/maemo.cpp:218
+msgid "Middle Click"
msgstr ""
-#: engines/scumm/help.cpp:86 engines/scumm/help.cpp:89
-msgid "Enter"
+#: backends/platform/maemo/maemo.cpp:221
+#: backends/platform/symbian/src/SymbianActions.cpp:43
+#: backends/platform/wince/CEActionsSmartphone.cpp:44
+#: backends/platform/tizen/form.cpp:267
+msgid "Right Click"
msgstr ""
-#: engines/scumm/help.cpp:86
-msgid "Toggle fullscreen"
+#: backends/platform/sdl/macosx/appmenu_osx.mm:77
+msgid "Hide ScummVM"
msgstr ""
-#: engines/scumm/help.cpp:87
-msgid "Music volume up / down"
+#: backends/platform/sdl/macosx/appmenu_osx.mm:82
+msgid "Hide Others"
msgstr ""
-#: engines/scumm/help.cpp:88
-msgid "Text speed slower / faster"
+#: backends/platform/sdl/macosx/appmenu_osx.mm:87
+msgid "Show All"
msgstr ""
-#: engines/scumm/help.cpp:89
-msgid "Simulate left mouse button"
+#: backends/platform/sdl/macosx/appmenu_osx.mm:109
+#: backends/platform/sdl/macosx/appmenu_osx.mm:120
+msgid "Window"
msgstr ""
-#: engines/scumm/help.cpp:90
-msgid "Tab"
+#: backends/platform/sdl/macosx/appmenu_osx.mm:114
+msgid "Minimize"
msgstr ""
-#: engines/scumm/help.cpp:90
-msgid "Simulate right mouse button"
+#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:46
+msgid "Normal (no scaling)"
msgstr ""
-#: engines/scumm/help.cpp:93
-msgid "Special keyboard commands:"
+#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:65
+msgctxt "lowres"
+msgid "Normal (no scaling)"
msgstr ""
-#: engines/scumm/help.cpp:94
-msgid "Show / Hide console"
+#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2148
+msgid "Enabled aspect ratio correction"
msgstr ""
-#: engines/scumm/help.cpp:95
-msgid "Start the debugger"
+#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2154
+msgid "Disabled aspect ratio correction"
msgstr ""
-#: engines/scumm/help.cpp:96
-msgid "Show memory consumption"
+#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2209
+msgid "Active graphics filter:"
msgstr ""
-#: engines/scumm/help.cpp:97
-msgid "Run in fast mode (*)"
+#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2251
+msgid "Windowed mode"
msgstr ""
-#: engines/scumm/help.cpp:98
-msgid "Run in really fast mode (*)"
+#: backends/graphics/opengl/opengl-graphics.cpp:118
+msgid "OpenGL"
msgstr ""
-#: engines/scumm/help.cpp:99
-msgid "Toggle mouse capture"
+#: backends/graphics/opengl/opengl-graphics.cpp:119
+msgid "OpenGL (No filtering)"
msgstr ""
-#: engines/scumm/help.cpp:100
-msgid "Switch between graphics filters"
+#: backends/platform/symbian/src/SymbianActions.cpp:38
+#: backends/platform/wince/CEActionsSmartphone.cpp:39
+msgid "Up"
msgstr ""
-#: engines/scumm/help.cpp:101
-msgid "Increase / Decrease scale factor"
+#: backends/platform/symbian/src/SymbianActions.cpp:39
+#: backends/platform/wince/CEActionsSmartphone.cpp:40
+msgid "Down"
msgstr ""
-#: engines/scumm/help.cpp:102
-msgid "Toggle aspect-ratio correction"
+#: backends/platform/symbian/src/SymbianActions.cpp:40
+#: backends/platform/wince/CEActionsSmartphone.cpp:41
+msgid "Left"
msgstr ""
-#: engines/scumm/help.cpp:107
-msgid "* Note that using ctrl-f and"
+#: backends/platform/symbian/src/SymbianActions.cpp:41
+#: backends/platform/wince/CEActionsSmartphone.cpp:42
+msgid "Right"
msgstr ""
-#: engines/scumm/help.cpp:108
-msgid " ctrl-g are not recommended"
+#: backends/platform/symbian/src/SymbianActions.cpp:46
+#: backends/platform/wince/CEActionsSmartphone.cpp:47
+msgid "Zone"
msgstr ""
-#: engines/scumm/help.cpp:109
-msgid " since they may cause crashes"
+#: backends/platform/symbian/src/SymbianActions.cpp:47
+#: backends/platform/wince/CEActionsPocket.cpp:54
+#: backends/platform/wince/CEActionsSmartphone.cpp:48
+msgid "Multi Function"
msgstr ""
-#: engines/scumm/help.cpp:110
-msgid " or incorrect game behavior."
+#: backends/platform/symbian/src/SymbianActions.cpp:48
+msgid "Swap character"
msgstr ""
-#: engines/scumm/help.cpp:114
-msgid "Spinning drafts on the keyboard:"
+#: backends/platform/symbian/src/SymbianActions.cpp:49
+msgid "Skip text"
msgstr ""
-#: engines/scumm/help.cpp:116
-msgid "Main game controls:"
+#: backends/platform/symbian/src/SymbianActions.cpp:51
+msgid "Fast mode"
msgstr ""
-#: engines/scumm/help.cpp:121 engines/scumm/help.cpp:136
-#: engines/scumm/help.cpp:161
-msgid "Push"
+#: 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:218
+#: engines/scumm/dialogs.cpp:192 engines/scumm/help.cpp:82
+#: engines/scumm/help.cpp:84
+msgid "Quit"
msgstr ""
-#: engines/scumm/help.cpp:122 engines/scumm/help.cpp:137
-#: engines/scumm/help.cpp:162
-msgid "Pull"
+#: backends/platform/symbian/src/SymbianActions.cpp:53
+msgid "Debugger"
msgstr ""
-#: engines/scumm/help.cpp:123 engines/scumm/help.cpp:138
-#: engines/scumm/help.cpp:163 engines/scumm/help.cpp:197
-#: engines/scumm/help.cpp:207
-msgid "Give"
+#: backends/platform/symbian/src/SymbianActions.cpp:54
+msgid "Global menu"
msgstr ""
-#: engines/scumm/help.cpp:124 engines/scumm/help.cpp:139
-#: engines/scumm/help.cpp:164 engines/scumm/help.cpp:190
-#: engines/scumm/help.cpp:208
-msgid "Open"
+#: backends/platform/symbian/src/SymbianActions.cpp:55
+msgid "Virtual keyboard"
msgstr ""
-#: engines/scumm/help.cpp:126
-msgid "Go to"
+#: backends/platform/symbian/src/SymbianActions.cpp:56
+msgid "Key mapper"
msgstr ""
-#: engines/scumm/help.cpp:127
-msgid "Get"
+#: backends/events/symbiansdl/symbiansdl-events.cpp:184
+msgid "Do you want to quit ?"
msgstr ""
-#: engines/scumm/help.cpp:128 engines/scumm/help.cpp:152
-#: 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"
+#: backends/platform/wii/options.cpp:51
+msgid "Video"
msgstr ""
-#: engines/scumm/help.cpp:129 engines/scumm/help.cpp:141
-msgid "Read"
+#: backends/platform/wii/options.cpp:54
+msgid "Current video mode:"
msgstr ""
-#: engines/scumm/help.cpp:130 engines/scumm/help.cpp:147
-msgid "New kid"
+#: backends/platform/wii/options.cpp:56
+msgid "Double-strike"
msgstr ""
-#: engines/scumm/help.cpp:131 engines/scumm/help.cpp:153
-#: engines/scumm/help.cpp:171
-msgid "Turn on"
+#: backends/platform/wii/options.cpp:60
+msgid "Horizontal underscan:"
msgstr ""
-#: engines/scumm/help.cpp:132 engines/scumm/help.cpp:154
-#: engines/scumm/help.cpp:172
-msgid "Turn off"
+#: backends/platform/wii/options.cpp:66
+msgid "Vertical underscan:"
msgstr ""
-#: engines/scumm/help.cpp:142 engines/scumm/help.cpp:167
-#: engines/scumm/help.cpp:194
-msgid "Walk to"
+#: backends/platform/wii/options.cpp:71
+msgid "Input"
msgstr ""
-#: engines/scumm/help.cpp:143 engines/scumm/help.cpp:168
-#: engines/scumm/help.cpp:195 engines/scumm/help.cpp:210
-#: engines/scumm/help.cpp:227
-msgid "Pick up"
+#: backends/platform/wii/options.cpp:74
+msgid "GC Pad sensitivity:"
msgstr ""
-#: engines/scumm/help.cpp:144 engines/scumm/help.cpp:169
-msgid "What is"
+#: backends/platform/wii/options.cpp:80
+msgid "GC Pad acceleration:"
msgstr ""
-#: engines/scumm/help.cpp:146
-msgid "Unlock"
+#: backends/platform/wii/options.cpp:86
+msgid "DVD"
msgstr ""
-#: engines/scumm/help.cpp:149
-msgid "Put on"
+#: backends/platform/wii/options.cpp:89 backends/platform/wii/options.cpp:101
+msgid "Status:"
msgstr ""
-#: engines/scumm/help.cpp:150
-msgid "Take off"
+#: backends/platform/wii/options.cpp:90 backends/platform/wii/options.cpp:102
+msgid "Unknown"
msgstr ""
-#: engines/scumm/help.cpp:156
-msgid "Fix"
+#: backends/platform/wii/options.cpp:93
+msgid "Mount DVD"
msgstr ""
-#: engines/scumm/help.cpp:158
-msgid "Switch"
+#: backends/platform/wii/options.cpp:94
+msgid "Unmount DVD"
msgstr ""
-#: engines/scumm/help.cpp:166 engines/scumm/help.cpp:228
-msgid "Look"
+#: backends/platform/wii/options.cpp:98
+msgid "SMB"
msgstr ""
-#: engines/scumm/help.cpp:173 engines/scumm/help.cpp:223
-msgid "Talk"
+#: backends/platform/wii/options.cpp:106
+msgid "Server:"
msgstr ""
-#: engines/scumm/help.cpp:174
-msgid "Travel"
+#: backends/platform/wii/options.cpp:110
+msgid "Share:"
msgstr ""
-#: engines/scumm/help.cpp:175
-msgid "To Henry / To Indy"
+#: backends/platform/wii/options.cpp:114
+msgid "Username:"
msgstr ""
-#. I18N: These are different musical notes
-#: engines/scumm/help.cpp:179
-msgid "play C minor on distaff"
+#: backends/platform/wii/options.cpp:118
+msgid "Password:"
msgstr ""
-#: engines/scumm/help.cpp:180
-msgid "play D on distaff"
+#: backends/platform/wii/options.cpp:121
+msgid "Init network"
msgstr ""
-#: engines/scumm/help.cpp:181
-msgid "play E on distaff"
+#: backends/platform/wii/options.cpp:123
+msgid "Mount SMB"
msgstr ""
-#: engines/scumm/help.cpp:182
-msgid "play F on distaff"
+#: backends/platform/wii/options.cpp:124
+msgid "Unmount SMB"
msgstr ""
-#: engines/scumm/help.cpp:183
-msgid "play G on distaff"
+#: backends/platform/wii/options.cpp:143
+msgid "DVD Mounted successfully"
msgstr ""
-#: engines/scumm/help.cpp:184
-msgid "play A on distaff"
+#: backends/platform/wii/options.cpp:146
+msgid "Error while mounting the DVD"
msgstr ""
-#: engines/scumm/help.cpp:185
-msgid "play B on distaff"
+#: backends/platform/wii/options.cpp:148
+msgid "DVD not mounted"
msgstr ""
-#: engines/scumm/help.cpp:186
-msgid "play C major on distaff"
+#: backends/platform/wii/options.cpp:161
+msgid "Network up, share mounted"
msgstr ""
-#: engines/scumm/help.cpp:192 engines/scumm/help.cpp:214
-msgid "puSh"
+#: backends/platform/wii/options.cpp:163
+msgid "Network up"
msgstr ""
-#: engines/scumm/help.cpp:193 engines/scumm/help.cpp:215
-msgid "pull (Yank)"
+#: backends/platform/wii/options.cpp:166
+msgid ", error while mounting the share"
msgstr ""
-#: engines/scumm/help.cpp:196 engines/scumm/help.cpp:212
-#: engines/scumm/help.cpp:248
-msgid "Talk to"
+#: backends/platform/wii/options.cpp:168
+msgid ", share not mounted"
msgstr ""
-#: engines/scumm/help.cpp:199 engines/scumm/help.cpp:211
-msgid "Look at"
+#: backends/platform/wii/options.cpp:174
+msgid "Network down"
msgstr ""
-#: engines/scumm/help.cpp:200
-msgid "turn oN"
+#: backends/platform/wii/options.cpp:178
+msgid "Initializing network"
msgstr ""
-#: engines/scumm/help.cpp:201
-msgid "turn oFf"
+#: backends/platform/wii/options.cpp:182
+msgid "Timeout while initializing network"
msgstr ""
-#: engines/scumm/help.cpp:217
-msgid "KeyUp"
+#: backends/platform/wii/options.cpp:186
+#, c-format
+msgid "Network not initialized (%d)"
msgstr ""
-#: engines/scumm/help.cpp:217
-msgid "Highlight prev dialogue"
+#: backends/platform/wince/CEActionsPocket.cpp:46
+msgid "Hide Toolbar"
msgstr ""
-#: engines/scumm/help.cpp:218
-msgid "KeyDown"
+#: backends/platform/wince/CEActionsPocket.cpp:47
+msgid "Show Keyboard"
msgstr ""
-#: engines/scumm/help.cpp:218
-msgid "Highlight next dialogue"
+#: backends/platform/wince/CEActionsPocket.cpp:48
+msgid "Sound on/off"
msgstr ""
-#: engines/scumm/help.cpp:222
-msgid "Walk"
+#: backends/platform/wince/CEActionsPocket.cpp:49
+msgid "Right click"
msgstr ""
-#: engines/scumm/help.cpp:225 engines/scumm/help.cpp:234
-#: engines/scumm/help.cpp:241 engines/scumm/help.cpp:249
-msgid "Inventory"
+#: backends/platform/wince/CEActionsPocket.cpp:50
+msgid "Show/Hide Cursor"
msgstr ""
-#: engines/scumm/help.cpp:226
-msgid "Object"
+#: backends/platform/wince/CEActionsPocket.cpp:51
+msgid "Free look"
msgstr ""
-#: engines/scumm/help.cpp:229
-msgid "Black and White / Color"
+#: backends/platform/wince/CEActionsPocket.cpp:52
+msgid "Zoom up"
msgstr ""
-#: engines/scumm/help.cpp:232
-msgid "Eyes"
+#: backends/platform/wince/CEActionsPocket.cpp:53
+msgid "Zoom down"
msgstr ""
-#: engines/scumm/help.cpp:233
-msgid "Tongue"
+#: backends/platform/wince/CEActionsPocket.cpp:55
+#: backends/platform/wince/CEActionsSmartphone.cpp:49
+msgid "Bind Keys"
msgstr ""
-#: engines/scumm/help.cpp:235
-msgid "Punch"
+#: backends/platform/wince/CEActionsPocket.cpp:56
+msgid "Cursor Up"
msgstr ""
-#: engines/scumm/help.cpp:236
-msgid "Kick"
+#: backends/platform/wince/CEActionsPocket.cpp:57
+msgid "Cursor Down"
msgstr ""
-#: engines/scumm/help.cpp:239 engines/scumm/help.cpp:247
-msgid "Examine"
+#: backends/platform/wince/CEActionsPocket.cpp:58
+msgid "Cursor Left"
msgstr ""
-#: engines/scumm/help.cpp:240
-msgid "Regular cursor"
+#: backends/platform/wince/CEActionsPocket.cpp:59
+msgid "Cursor Right"
msgstr ""
-#. I18N: Comm is a communication device
-#: engines/scumm/help.cpp:243
-msgid "Comm"
+#: backends/platform/wince/CEActionsPocket.cpp:267
+#: backends/platform/wince/CEActionsSmartphone.cpp:231
+msgid "Do you want to load or save the game?"
msgstr ""
-#: engines/scumm/help.cpp:246
-msgid "Save / Load / Options"
+#: backends/platform/wince/CEActionsPocket.cpp:326
+#: backends/platform/wince/CEActionsSmartphone.cpp:287
+msgid " Are you sure you want to quit ? "
msgstr ""
-#: engines/scumm/help.cpp:255
-msgid "Other game controls:"
+#: backends/platform/wince/CEActionsSmartphone.cpp:50
+msgid "Keyboard"
msgstr ""
-#: engines/scumm/help.cpp:257 engines/scumm/help.cpp:267
-msgid "Inventory:"
+#: backends/platform/wince/CEActionsSmartphone.cpp:51
+msgid "Rotate"
msgstr ""
-#: engines/scumm/help.cpp:258 engines/scumm/help.cpp:274
-msgid "Scroll list up"
+#: backends/platform/wince/CELauncherDialog.cpp:56
+msgid "Using SDL driver "
msgstr ""
-#: engines/scumm/help.cpp:259 engines/scumm/help.cpp:275
-msgid "Scroll list down"
+#: backends/platform/wince/CELauncherDialog.cpp:60
+msgid "Display "
msgstr ""
-#: engines/scumm/help.cpp:260 engines/scumm/help.cpp:268
-msgid "Upper left item"
+#: backends/platform/wince/CELauncherDialog.cpp:83
+msgid "Do you want to perform an automatic scan ?"
msgstr ""
-#: engines/scumm/help.cpp:261 engines/scumm/help.cpp:270
-msgid "Lower left item"
+#: backends/platform/wince/wince-sdl.cpp:516
+msgid "Map right click action"
msgstr ""
-#: engines/scumm/help.cpp:262 engines/scumm/help.cpp:271
-msgid "Upper right item"
+#: backends/platform/wince/wince-sdl.cpp:520
+msgid "You must map a key to the 'Right Click' action to play this game"
msgstr ""
-#: engines/scumm/help.cpp:263 engines/scumm/help.cpp:273
-msgid "Lower right item"
+#: backends/platform/wince/wince-sdl.cpp:529
+msgid "Map hide toolbar action"
msgstr ""
-#: engines/scumm/help.cpp:269
-msgid "Middle left item"
+#: backends/platform/wince/wince-sdl.cpp:533
+msgid "You must map a key to the 'Hide toolbar' action to play this game"
msgstr ""
-#: engines/scumm/help.cpp:272
-msgid "Middle right item"
+#: backends/platform/wince/wince-sdl.cpp:542
+msgid "Map Zoom Up action (optional)"
msgstr ""
-#: engines/scumm/help.cpp:279 engines/scumm/help.cpp:284
-msgid "Switching characters:"
+#: backends/platform/wince/wince-sdl.cpp:545
+msgid "Map Zoom Down action (optional)"
msgstr ""
-#: engines/scumm/help.cpp:281
-msgid "Second kid"
+#: backends/platform/wince/wince-sdl.cpp:553
+msgid ""
+"Don't forget to map a key to 'Hide Toolbar' action to see the whole inventory"
msgstr ""
-#: engines/scumm/help.cpp:282
-msgid "Third kid"
+#: backends/events/default/default-events.cpp:196
+msgid "Do you really want to return to the Launcher?"
msgstr ""
-#: engines/scumm/help.cpp:294
-msgid "Fighting controls (numpad):"
+#: backends/events/default/default-events.cpp:196
+msgid "Launcher"
msgstr ""
-#: engines/scumm/help.cpp:295 engines/scumm/help.cpp:296
-#: engines/scumm/help.cpp:297
-msgid "Step back"
+#: backends/events/default/default-events.cpp:218
+msgid "Do you really want to quit?"
msgstr ""
-#: engines/scumm/help.cpp:298
-msgid "Block high"
+#: backends/events/gph/gph-events.cpp:386
+#: backends/events/gph/gph-events.cpp:429
+#: backends/events/openpandora/op-events.cpp:168
+msgid "Touchscreen 'Tap Mode' - Left Click"
msgstr ""
-#: engines/scumm/help.cpp:299
-msgid "Block middle"
+#: backends/events/gph/gph-events.cpp:388
+#: backends/events/gph/gph-events.cpp:431
+#: backends/events/openpandora/op-events.cpp:170
+msgid "Touchscreen 'Tap Mode' - Right Click"
msgstr ""
-#: engines/scumm/help.cpp:300
-msgid "Block low"
+#: backends/events/gph/gph-events.cpp:390
+#: backends/events/gph/gph-events.cpp:433
+#: backends/events/openpandora/op-events.cpp:172
+msgid "Touchscreen 'Tap Mode' - Hover (No Click)"
msgstr ""
-#: engines/scumm/help.cpp:301
-msgid "Punch high"
+#: backends/events/gph/gph-events.cpp:410
+msgid "Maximum Volume"
msgstr ""
-#: engines/scumm/help.cpp:302
-msgid "Punch middle"
+#: backends/events/gph/gph-events.cpp:412
+msgid "Increasing Volume"
msgstr ""
-#: engines/scumm/help.cpp:303
-msgid "Punch low"
+#: backends/events/gph/gph-events.cpp:418
+msgid "Minimal Volume"
msgstr ""
-#: engines/scumm/help.cpp:306
-msgid "These are for Indy on left."
+#: backends/events/gph/gph-events.cpp:420
+msgid "Decreasing Volume"
msgstr ""
-#: engines/scumm/help.cpp:307
-msgid "When Indy is on the right,"
+#: backends/events/openpandora/op-events.cpp:174
+msgid "Touchscreen 'Tap Mode' - Hover (DPad Clicks)"
msgstr ""
-#: engines/scumm/help.cpp:308
-msgid "7, 4, and 1 are switched with"
+#: backends/updates/macosx/macosx-updates.mm:67
+msgid "Check for Updates..."
msgstr ""
-#: engines/scumm/help.cpp:309
-msgid "9, 6, and 3, respectively."
+#: backends/platform/tizen/form.cpp:263
+msgid "Right Click Once"
msgstr ""
-#: engines/scumm/help.cpp:316
-msgid "Biplane controls (numpad):"
+#: backends/platform/tizen/form.cpp:271
+msgid "Move Only"
msgstr ""
-#: engines/scumm/help.cpp:317
-msgid "Fly to upper left"
+#: backends/platform/tizen/form.cpp:294
+msgid "Escape Key"
msgstr ""
-#: engines/scumm/help.cpp:318
-msgid "Fly to left"
+#: backends/platform/tizen/form.cpp:299
+msgid "Game Menu"
msgstr ""
-#: engines/scumm/help.cpp:319
-msgid "Fly to lower left"
+#: backends/platform/tizen/form.cpp:304
+msgid "Show Keypad"
msgstr ""
-#: engines/scumm/help.cpp:320
-msgid "Fly upwards"
+#: backends/platform/tizen/form.cpp:309
+msgid "Control Mouse"
msgstr ""
-#: engines/scumm/help.cpp:321
-msgid "Fly straight"
+#: backends/events/maemosdl/maemosdl-events.cpp:192
+msgid "Clicking Enabled"
msgstr ""
-#: engines/scumm/help.cpp:322
-msgid "Fly down"
+#: backends/events/maemosdl/maemosdl-events.cpp:192
+msgid "Clicking Disabled"
msgstr ""
-#: engines/scumm/help.cpp:323
-msgid "Fly to upper right"
+#: engines/agi/detection.cpp:142 engines/drascula/detection.cpp:302
+#: engines/dreamweb/detection.cpp:47 engines/neverhood/detection.cpp:160
+#: engines/sci/detection.cpp:394 engines/toltecs/detection.cpp:186
+msgid "Use original save/load screens"
msgstr ""
-#: engines/scumm/help.cpp:324
-msgid "Fly to right"
+#: engines/agi/detection.cpp:143 engines/drascula/detection.cpp:303
+#: engines/dreamweb/detection.cpp:48 engines/neverhood/detection.cpp:161
+#: engines/sci/detection.cpp:395 engines/toltecs/detection.cpp:187
+msgid "Use the original save/load screens, instead of the ScummVM ones"
msgstr ""
-#: engines/scumm/help.cpp:325
-msgid "Fly to lower right"
+#: engines/agi/saveload.cpp:816 engines/drascula/saveload.cpp:349
+#: engines/neverhood/menumodule.cpp:886 engines/sci/engine/kfile.cpp:857
+#: engines/toltecs/menu.cpp:256
+msgid "Restore game:"
msgstr ""
-#: engines/scumm/scumm.cpp:1776
-#, c-format
-msgid ""
-"Native MIDI support requires the Roland Upgrade from LucasArts,\n"
-"but %s is missing. Using AdLib instead."
+#: engines/agi/saveload.cpp:816 engines/drascula/saveload.cpp:349
+#: engines/neverhood/menumodule.cpp:886 engines/sci/engine/kfile.cpp:857
+#: engines/toltecs/menu.cpp:256
+msgid "Restore"
msgstr ""
-#: engines/scumm/scumm.cpp:2303 engines/agos/saveload.cpp:220
+#: engines/agos/saveload.cpp:160 engines/scumm/scumm.cpp:2321
#, c-format
msgid ""
-"Failed to save game state to file:\n"
+"Failed to load game state from file:\n"
"\n"
"%s"
msgstr ""
-#: engines/scumm/scumm.cpp:2310 engines/agos/saveload.cpp:185
+#: engines/agos/saveload.cpp:195 engines/scumm/scumm.cpp:2314
#, c-format
msgid ""
-"Failed to load game state from file:\n"
+"Failed to save game state to file:\n"
"\n"
"%s"
msgstr ""
-#: engines/scumm/scumm.cpp:2322 engines/agos/saveload.cpp:228
+#: engines/agos/saveload.cpp:203 engines/scumm/scumm.cpp:2332
#, c-format
msgid ""
"Successfully saved game state in file:\n"
@@ -2121,50 +2071,36 @@ msgid ""
"%s"
msgstr ""
-#: engines/scumm/scumm.cpp:2537
-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 ""
-
-#. I18N: Option for fast scene switching
-#: engines/mohawk/dialogs.cpp:92 engines/mohawk/dialogs.cpp:167
-msgid "~Z~ip Mode Activated"
-msgstr ""
-
-#: engines/mohawk/dialogs.cpp:93
-msgid "~T~ransitions Enabled"
-msgstr ""
-
-#. I18N: Drop book page
-#: engines/mohawk/dialogs.cpp:95
-msgid "~D~rop Page"
-msgstr ""
-
-#: engines/mohawk/dialogs.cpp:99
-msgid "~S~how Map"
+#: engines/agos/animation.cpp:557
+#, c-format
+msgid "Cutscene file '%s' not found!"
msgstr ""
-#: engines/mohawk/dialogs.cpp:105
-msgid "~M~ain Menu"
+#: engines/drascula/saveload.cpp:47
+msgid ""
+"ScummVM found that you have old savefiles for Drascula 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"
msgstr ""
-#: engines/mohawk/dialogs.cpp:168
-msgid "~W~ater Effect Enabled"
+#: engines/dreamweb/detection.cpp:57
+msgid "Use bright palette mode"
msgstr ""
-#: engines/agos/animation.cpp:557
-#, c-format
-msgid "Cutscene file '%s' not found!"
+#: engines/dreamweb/detection.cpp:58
+msgid "Display graphics using the game's bright palette"
msgstr ""
-#: engines/gob/inter_playtoons.cpp:256 engines/gob/inter_v2.cpp:1287
+#: engines/gob/inter_playtoons.cpp:256 engines/gob/inter_v2.cpp:1470
#: engines/tinsel/saveload.cpp:532
msgid "Failed to load game state from file."
msgstr ""
-#: engines/gob/inter_v2.cpp:1357 engines/tinsel/saveload.cpp:545
+#: engines/gob/inter_v2.cpp:1540 engines/tinsel/saveload.cpp:545
msgid "Failed to save game state to file."
msgstr ""
@@ -2180,7 +2116,7 @@ msgstr ""
msgid "Play movies at an increased speed"
msgstr ""
-#: engines/groovie/script.cpp:420
+#: engines/groovie/script.cpp:399
msgid "Failed to save game"
msgstr ""
@@ -2270,11 +2206,11 @@ msgstr ""
msgid "Slide Right"
msgstr ""
-#: engines/kyra/lol.cpp:485 engines/pegasus/pegasus.cpp:2447
+#: engines/kyra/lol.cpp:485 engines/pegasus/pegasus.cpp:2509
msgid "Turn Left"
msgstr ""
-#: engines/kyra/lol.cpp:486 engines/pegasus/pegasus.cpp:2448
+#: engines/kyra/lol.cpp:486 engines/pegasus/pegasus.cpp:2510
msgid "Turn Right"
msgstr ""
@@ -2299,104 +2235,46 @@ msgid ""
"some tracks sound incorrect."
msgstr ""
-#: engines/queen/queen.cpp:59
-msgid "Alternative intro"
-msgstr ""
-
-#: engines/queen/queen.cpp:60
-msgid "Use an alternative game intro (CD version only)"
-msgstr ""
-
-#: engines/sky/compact.cpp:130
-msgid ""
-"Unable to find \"sky.cpt\" file!\n"
-"Please download it from www.scummvm.org"
-msgstr ""
-
-#: engines/sky/compact.cpp:141
-msgid ""
-"The \"sky.cpt\" file has an incorrect size.\n"
-"Please (re)download it from www.scummvm.org"
-msgstr ""
-
-#: engines/sky/detection.cpp:44
-msgid "Floppy intro"
-msgstr ""
-
-#: engines/sky/detection.cpp:45
-msgid "Use the floppy version's intro (CD version only)"
-msgstr ""
-
-#: engines/sword1/animation.cpp:519
-#, c-format
-msgid "PSX stream cutscene '%s' cannot be played in paletted mode"
-msgstr ""
-
-#: engines/sword1/animation.cpp:540 engines/sword2/animation.cpp:439
-msgid "DXA cutscenes found but ScummVM has been built without zlib support"
-msgstr ""
-
-#: engines/sword1/animation.cpp:550 engines/sword2/animation.cpp:449
-msgid "MPEG2 cutscenes are no longer supported"
-msgstr ""
-
-#: engines/sword1/animation.cpp:556 engines/sword2/animation.cpp:457
-#, c-format
-msgid "Cutscene '%s' not found"
-msgstr ""
-
-#: engines/sword1/control.cpp:863
-msgid ""
-"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"
+#. I18N: Option for fast scene switching
+#: engines/mohawk/dialogs.cpp:92 engines/mohawk/dialogs.cpp:167
+msgid "~Z~ip Mode Activated"
msgstr ""
-#: engines/sword1/control.cpp:1232
-#, c-format
-msgid ""
-"Target new save game already exists!\n"
-"Would you like to keep the old save game (%s) or the new one (%s)?\n"
+#: engines/mohawk/dialogs.cpp:93
+msgid "~T~ransitions Enabled"
msgstr ""
-#: engines/sword1/control.cpp:1235
-msgid "Keep the old one"
+#. I18N: Drop book page
+#: engines/mohawk/dialogs.cpp:95
+msgid "~D~rop Page"
msgstr ""
-#: engines/sword1/control.cpp:1235
-msgid "Keep the new one"
+#: engines/mohawk/dialogs.cpp:99
+msgid "~S~how Map"
msgstr ""
-#: engines/sword1/logic.cpp:1633
-msgid "This is the end of the Broken Sword 1 Demo"
+#: engines/mohawk/dialogs.cpp:105
+msgid "~M~ain Menu"
msgstr ""
-#: engines/sword2/animation.cpp:419
-msgid ""
-"PSX cutscenes found but ScummVM has been built without RGB color support"
+#: engines/mohawk/dialogs.cpp:168
+msgid "~W~ater Effect Enabled"
msgstr ""
-#: engines/sword2/sword2.cpp:79
-msgid "Show object labels"
+#: engines/neverhood/detection.cpp:167
+msgid "Skip the Hall of Records storyboard scenes"
msgstr ""
-#: engines/sword2/sword2.cpp:80
-msgid "Show labels for objects on mouse hover"
+#: engines/neverhood/detection.cpp:168
+msgid "Allows the player to skip past the Hall of Records storyboard scenes"
msgstr ""
-#: engines/teenagent/resources.cpp:94
-msgid ""
-"You're missing the 'teenagent.dat' file. Get it from the ScummVM website"
+#: engines/neverhood/detection.cpp:174
+msgid "Scale the making of videos to full screen"
msgstr ""
-#: engines/teenagent/resources.cpp:115
-msgid ""
-"The teenagent.dat file is compressed and zlib hasn't been included in this "
-"executable. Please decompress it"
+#: engines/neverhood/detection.cpp:175
+msgid "Scale the making of videos, so that they use the whole screen"
msgstr ""
#: engines/parallaction/saveload.cpp:133
@@ -2436,725 +2314,834 @@ msgid ""
"Please report to the team."
msgstr ""
-#: engines/pegasus/pegasus.cpp:679
+#: engines/pegasus/pegasus.cpp:714
msgid "Invalid save file name"
msgstr ""
-#: engines/pegasus/pegasus.cpp:2445
+#: engines/pegasus/pegasus.cpp:2507
msgid "Up/Zoom In/Move Forward/Open Doors"
msgstr ""
-#: engines/pegasus/pegasus.cpp:2446
+#: engines/pegasus/pegasus.cpp:2508
msgid "Down/Zoom Out"
msgstr ""
-#: engines/pegasus/pegasus.cpp:2449
+#: engines/pegasus/pegasus.cpp:2511
msgid "Display/Hide Inventory Tray"
msgstr ""
-#: engines/pegasus/pegasus.cpp:2450
+#: engines/pegasus/pegasus.cpp:2512
msgid "Display/Hide Biochip Tray"
msgstr ""
-#: engines/pegasus/pegasus.cpp:2451
+#: engines/pegasus/pegasus.cpp:2513
msgid "Action/Select"
msgstr ""
-#: engines/pegasus/pegasus.cpp:2452
+#: engines/pegasus/pegasus.cpp:2514
msgid "Toggle Center Data Display"
msgstr ""
-#: engines/pegasus/pegasus.cpp:2453
+#: engines/pegasus/pegasus.cpp:2515
msgid "Display/Hide Info Screen"
msgstr ""
-#: engines/pegasus/pegasus.cpp:2454
+#: engines/pegasus/pegasus.cpp:2516
msgid "Display/Hide Pause Menu"
msgstr ""
-#: engines/pegasus/pegasus.cpp:2455
+#: engines/pegasus/pegasus.cpp:2517
msgid "???"
msgstr ""
-#: audio/fmopl.cpp:49
-msgid "MAME OPL emulator"
+#: engines/sci/detection.cpp:374
+msgid "EGA undithering"
msgstr ""
-#: audio/fmopl.cpp:51
-msgid "DOSBox OPL emulator"
+#: engines/sci/detection.cpp:375
+msgid "Enable undithering in EGA games"
msgstr ""
-#: audio/mididrv.cpp:209
-#, c-format
+#: engines/sci/detection.cpp:384
+msgid "Prefer digital sound effects"
+msgstr ""
+
+#: engines/sci/detection.cpp:385
+msgid "Prefer digital sound effects instead of synthesized ones"
+msgstr ""
+
+#: engines/sci/detection.cpp:404
+msgid "Use IMF/Yamaha FB-01 for MIDI output"
+msgstr ""
+
+#: engines/sci/detection.cpp:405
msgid ""
-"The selected audio device '%s' was not found (e.g. might be turned off or "
-"disconnected)."
+"Use an IBM Music Feature card or a Yamaha FB-01 FM synth module for MIDI "
+"output"
msgstr ""
-#: audio/mididrv.cpp:209 audio/mididrv.cpp:221 audio/mididrv.cpp:257
-#: audio/mididrv.cpp:272
-msgid "Attempting to fall back to the next available device..."
+#: engines/sci/detection.cpp:415
+msgid "Use CD audio"
msgstr ""
-#: audio/mididrv.cpp:221
-#, c-format
+#: engines/sci/detection.cpp:416
+msgid "Use CD audio instead of in-game audio, if available"
+msgstr ""
+
+#: engines/sci/detection.cpp:426
+msgid "Use Windows cursors"
+msgstr ""
+
+#: engines/sci/detection.cpp:427
msgid ""
-"The selected audio device '%s' cannot be used. See log file for more "
-"information."
+"Use the Windows cursors (smaller and monochrome) instead of the DOS ones"
msgstr ""
-#: audio/mididrv.cpp:257
-#, c-format
+#: engines/sci/detection.cpp:437
+msgid "Use silver cursors"
+msgstr ""
+
+#: engines/sci/detection.cpp:438
msgid ""
-"The preferred audio device '%s' was not found (e.g. might be turned off or "
-"disconnected)."
+"Use the alternate set of silver cursors, instead of the normal golden ones"
msgstr ""
-#: audio/mididrv.cpp:272
+#: engines/scumm/dialogs.cpp:176
#, c-format
-msgid ""
-"The preferred audio device '%s' cannot be used. See log file for more "
-"information."
+msgid "Insert Disk %c and Press Button to Continue."
msgstr ""
-#: audio/null.h:43
-msgid "No music"
+#: engines/scumm/dialogs.cpp:177
+#, c-format
+msgid "Unable to Find %s, (%c%d) Press Button."
msgstr ""
-#: audio/mods/paula.cpp:189
-msgid "Amiga Audio Emulator"
+#: engines/scumm/dialogs.cpp:178
+#, c-format
+msgid "Error reading disk %c, (%c%d) Press Button."
msgstr ""
-#: audio/softsynth/adlib.cpp:2284
-msgid "AdLib Emulator"
+#: engines/scumm/dialogs.cpp:179
+msgid "Game Paused. Press SPACE to Continue."
msgstr ""
-#: audio/softsynth/appleiigs.cpp:33
-msgid "Apple II GS Emulator (NOT IMPLEMENTED)"
+#. 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:183
+msgid "Are you sure you want to restart? (Y/N)"
msgstr ""
-#: audio/softsynth/sid.cpp:1430
-msgid "C64 Audio Emulator"
+#. I18N: you may specify 'Yes' symbol at the end of the line. See previous comment
+#: engines/scumm/dialogs.cpp:185
+msgid "Are you sure you want to quit? (Y/N)"
msgstr ""
-#: audio/softsynth/mt32.cpp:205
-msgid "Initializing MT-32 Emulator"
+#: engines/scumm/dialogs.cpp:190
+msgid "Play"
msgstr ""
-#: audio/softsynth/mt32.cpp:431
-msgid "MT-32 Emulator"
+#: engines/scumm/dialogs.cpp:194
+msgid "Insert save/load game disk"
msgstr ""
-#: audio/softsynth/pcspk.cpp:139
-msgid "PC Speaker Emulator"
+#: engines/scumm/dialogs.cpp:195
+msgid "You must enter a name"
msgstr ""
-#: audio/softsynth/pcspk.cpp:158
-msgid "IBM PCjr Emulator"
+#: engines/scumm/dialogs.cpp:196
+msgid "The game was NOT saved (disk full?)"
msgstr ""
-#: backends/keymapper/remap-dialog.cpp:47
-msgid "Keymap:"
+#: engines/scumm/dialogs.cpp:197
+msgid "The game was NOT loaded"
msgstr ""
-#: backends/keymapper/remap-dialog.cpp:66
-msgid " (Effective)"
+#: engines/scumm/dialogs.cpp:198
+#, c-format
+msgid "Saving '%s'"
msgstr ""
-#: backends/keymapper/remap-dialog.cpp:106
-msgid " (Active)"
+#: engines/scumm/dialogs.cpp:199
+#, c-format
+msgid "Loading '%s'"
msgstr ""
-#: backends/keymapper/remap-dialog.cpp:106
-msgid " (Blocked)"
+#: engines/scumm/dialogs.cpp:200
+msgid "Name your SAVE game"
msgstr ""
-#: backends/keymapper/remap-dialog.cpp:119
-msgid " (Global)"
+#: engines/scumm/dialogs.cpp:201
+msgid "Select a game to LOAD"
msgstr ""
-#: backends/keymapper/remap-dialog.cpp:127
-msgid " (Game)"
+#: engines/scumm/dialogs.cpp:202
+msgid "Game title)"
msgstr ""
-#: backends/midi/windows.cpp:164
-msgid "Windows MIDI"
+#. I18N: Previous page button
+#: engines/scumm/dialogs.cpp:288
+msgid "~P~revious"
msgstr ""
-#: backends/platform/ds/arm9/source/dsoptions.cpp:57
-msgid "ScummVM Main Menu"
+#. I18N: Next page button
+#: engines/scumm/dialogs.cpp:290
+msgid "~N~ext"
msgstr ""
-#: backends/platform/ds/arm9/source/dsoptions.cpp:63
-msgid "~L~eft handed mode"
+#: engines/scumm/dialogs.cpp:598
+msgid "Speech Only"
msgstr ""
-#: backends/platform/ds/arm9/source/dsoptions.cpp:64
-msgid "~I~ndy fight controls"
+#: engines/scumm/dialogs.cpp:599
+msgid "Speech and Subtitles"
msgstr ""
-#: backends/platform/ds/arm9/source/dsoptions.cpp:65
-msgid "Show mouse cursor"
+#: engines/scumm/dialogs.cpp:600
+msgid "Subtitles Only"
msgstr ""
-#: backends/platform/ds/arm9/source/dsoptions.cpp:66
-msgid "Snap to edges"
+#: engines/scumm/dialogs.cpp:608
+msgctxt "lowres"
+msgid "Speech & Subs"
msgstr ""
-#: backends/platform/ds/arm9/source/dsoptions.cpp:68
-msgid "Touch X Offset"
+#: engines/scumm/dialogs.cpp:654
+msgid "Select a Proficiency Level."
msgstr ""
-#: backends/platform/ds/arm9/source/dsoptions.cpp:75
-msgid "Touch Y Offset"
+#: engines/scumm/dialogs.cpp:656
+msgid "Refer to your Loom(TM) manual for help."
msgstr ""
-#: backends/platform/ds/arm9/source/dsoptions.cpp:87
-msgid "Use laptop trackpad-style cursor control"
+#: engines/scumm/dialogs.cpp:660
+msgid "Practice"
msgstr ""
-#: backends/platform/ds/arm9/source/dsoptions.cpp:88
-msgid "Tap for left click, double tap right click"
+#: engines/scumm/dialogs.cpp:661
+msgid "Expert"
msgstr ""
-#: backends/platform/ds/arm9/source/dsoptions.cpp:90
-msgid "Sensitivity"
+#: engines/scumm/help.cpp:73
+msgid "Common keyboard commands:"
msgstr ""
-#: backends/platform/ds/arm9/source/dsoptions.cpp:99
-msgid "Initial top screen scale:"
+#: engines/scumm/help.cpp:74
+msgid "Save / Load dialog"
msgstr ""
-#: backends/platform/ds/arm9/source/dsoptions.cpp:105
-msgid "Main screen scaling:"
+#: engines/scumm/help.cpp:76
+msgid "Skip line of text"
msgstr ""
-#: backends/platform/ds/arm9/source/dsoptions.cpp:107
-msgid "Hardware scale (fast, but low quality)"
+#: engines/scumm/help.cpp:77
+msgid "Esc"
msgstr ""
-#: backends/platform/ds/arm9/source/dsoptions.cpp:108
-msgid "Software scale (good quality, but slower)"
+#: engines/scumm/help.cpp:77
+msgid "Skip cutscene"
msgstr ""
-#: backends/platform/ds/arm9/source/dsoptions.cpp:109
-msgid "Unscaled (you must scroll left and right)"
+#: engines/scumm/help.cpp:78
+msgid "Space"
msgstr ""
-#: backends/platform/ds/arm9/source/dsoptions.cpp:111
-msgid "Brightness:"
+#: engines/scumm/help.cpp:78
+msgid "Pause game"
msgstr ""
-#: backends/platform/ds/arm9/source/dsoptions.cpp:121
-msgid "High quality audio (slower) (reboot)"
+#: engines/scumm/help.cpp:79 engines/scumm/help.cpp:84
+#: engines/scumm/help.cpp:95 engines/scumm/help.cpp:96
+#: engines/scumm/help.cpp:97 engines/scumm/help.cpp:98
+#: engines/scumm/help.cpp:99 engines/scumm/help.cpp:100
+#: engines/scumm/help.cpp:101 engines/scumm/help.cpp:102
+msgid "Ctrl"
msgstr ""
-#: backends/platform/ds/arm9/source/dsoptions.cpp:122
-msgid "Disable power off"
+#: engines/scumm/help.cpp:79
+msgid "Load game state 1-10"
msgstr ""
-#: backends/platform/iphone/osys_events.cpp:300
-msgid "Mouse-click-and-drag mode enabled."
+#: 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 ""
-#: backends/platform/iphone/osys_events.cpp:302
-msgid "Mouse-click-and-drag mode disabled."
+#: engines/scumm/help.cpp:80
+msgid "Save game state 1-10"
msgstr ""
-#: backends/platform/iphone/osys_events.cpp:313
-msgid "Touchpad mode enabled."
+#: engines/scumm/help.cpp:86 engines/scumm/help.cpp:89
+msgid "Enter"
msgstr ""
-#: backends/platform/iphone/osys_events.cpp:315
-msgid "Touchpad mode disabled."
+#: engines/scumm/help.cpp:86
+msgid "Toggle fullscreen"
msgstr ""
-#: backends/platform/maemo/maemo.cpp:209
-msgid "Click Mode"
+#: engines/scumm/help.cpp:87
+msgid "Music volume up / down"
msgstr ""
-#: backends/platform/maemo/maemo.cpp:215
-#: 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"
+#: engines/scumm/help.cpp:88
+msgid "Text speed slower / faster"
msgstr ""
-#: backends/platform/maemo/maemo.cpp:218
-msgid "Middle Click"
+#: engines/scumm/help.cpp:89
+msgid "Simulate left mouse button"
msgstr ""
-#: backends/platform/maemo/maemo.cpp:221
-#: backends/platform/symbian/src/SymbianActions.cpp:43
-#: backends/platform/wince/CEActionsSmartphone.cpp:44
-#: backends/platform/bada/form.cpp:273
-msgid "Right Click"
+#: engines/scumm/help.cpp:90
+msgid "Tab"
msgstr ""
-#: backends/platform/sdl/macosx/appmenu_osx.mm:77
-msgid "Hide ScummVM"
+#: engines/scumm/help.cpp:90
+msgid "Simulate right mouse button"
msgstr ""
-#: backends/platform/sdl/macosx/appmenu_osx.mm:82
-msgid "Hide Others"
+#: engines/scumm/help.cpp:93
+msgid "Special keyboard commands:"
msgstr ""
-#: backends/platform/sdl/macosx/appmenu_osx.mm:87
-msgid "Show All"
+#: engines/scumm/help.cpp:94
+msgid "Show / Hide console"
msgstr ""
-#: backends/platform/sdl/macosx/appmenu_osx.mm:109
-#: backends/platform/sdl/macosx/appmenu_osx.mm:120
-msgid "Window"
+#: engines/scumm/help.cpp:95
+msgid "Start the debugger"
msgstr ""
-#: backends/platform/sdl/macosx/appmenu_osx.mm:114
-msgid "Minimize"
+#: engines/scumm/help.cpp:96
+msgid "Show memory consumption"
msgstr ""
-#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:45
-msgid "Normal (no scaling)"
+#: engines/scumm/help.cpp:97
+msgid "Run in fast mode (*)"
msgstr ""
-#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:64
-msgctxt "lowres"
-msgid "Normal (no scaling)"
+#: engines/scumm/help.cpp:98
+msgid "Run in really fast mode (*)"
msgstr ""
-#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2135
-#: backends/graphics/openglsdl/openglsdl-graphics.cpp:537
-msgid "Enabled aspect ratio correction"
+#: engines/scumm/help.cpp:99
+msgid "Toggle mouse capture"
msgstr ""
-#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2141
-#: backends/graphics/openglsdl/openglsdl-graphics.cpp:542
-msgid "Disabled aspect ratio correction"
+#: engines/scumm/help.cpp:100
+msgid "Switch between graphics filters"
msgstr ""
-#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2196
-msgid "Active graphics filter:"
+#: engines/scumm/help.cpp:101
+msgid "Increase / Decrease scale factor"
msgstr ""
-#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2238
-#: backends/graphics/openglsdl/openglsdl-graphics.cpp:481
-msgid "Windowed mode"
+#: engines/scumm/help.cpp:102
+msgid "Toggle aspect-ratio correction"
msgstr ""
-#: backends/graphics/opengl/opengl-graphics.cpp:135
-msgid "OpenGL Normal"
+#: engines/scumm/help.cpp:107
+msgid "* Note that using ctrl-f and"
msgstr ""
-#: backends/graphics/opengl/opengl-graphics.cpp:136
-msgid "OpenGL Conserve"
+#: engines/scumm/help.cpp:108
+msgid " ctrl-g are not recommended"
msgstr ""
-#: backends/graphics/opengl/opengl-graphics.cpp:137
-msgid "OpenGL Original"
+#: engines/scumm/help.cpp:109
+msgid " since they may cause crashes"
msgstr ""
-#: backends/graphics/openglsdl/openglsdl-graphics.cpp:415
-msgid "Current display mode"
+#: engines/scumm/help.cpp:110
+msgid " or incorrect game behavior."
msgstr ""
-#: backends/graphics/openglsdl/openglsdl-graphics.cpp:428
-msgid "Current scale"
+#: engines/scumm/help.cpp:114
+msgid "Spinning drafts on the keyboard:"
msgstr ""
-#: backends/graphics/openglsdl/openglsdl-graphics.cpp:562
-msgid "Active filter mode: Linear"
+#: engines/scumm/help.cpp:116
+msgid "Main game controls:"
msgstr ""
-#: backends/graphics/openglsdl/openglsdl-graphics.cpp:564
-msgid "Active filter mode: Nearest"
+#: engines/scumm/help.cpp:121 engines/scumm/help.cpp:136
+#: engines/scumm/help.cpp:161
+msgid "Push"
msgstr ""
-#: backends/platform/symbian/src/SymbianActions.cpp:38
-#: backends/platform/wince/CEActionsSmartphone.cpp:39
-msgid "Up"
+#: engines/scumm/help.cpp:122 engines/scumm/help.cpp:137
+#: engines/scumm/help.cpp:162
+msgid "Pull"
msgstr ""
-#: backends/platform/symbian/src/SymbianActions.cpp:39
-#: backends/platform/wince/CEActionsSmartphone.cpp:40
-msgid "Down"
+#: engines/scumm/help.cpp:123 engines/scumm/help.cpp:138
+#: engines/scumm/help.cpp:163 engines/scumm/help.cpp:197
+#: engines/scumm/help.cpp:207
+msgid "Give"
msgstr ""
-#: backends/platform/symbian/src/SymbianActions.cpp:40
-#: backends/platform/wince/CEActionsSmartphone.cpp:41
-msgid "Left"
+#: engines/scumm/help.cpp:124 engines/scumm/help.cpp:139
+#: engines/scumm/help.cpp:164 engines/scumm/help.cpp:190
+#: engines/scumm/help.cpp:208
+msgid "Open"
msgstr ""
-#: backends/platform/symbian/src/SymbianActions.cpp:41
-#: backends/platform/wince/CEActionsSmartphone.cpp:42
-msgid "Right"
+#: engines/scumm/help.cpp:126
+msgid "Go to"
msgstr ""
-#: backends/platform/symbian/src/SymbianActions.cpp:46
-#: backends/platform/wince/CEActionsSmartphone.cpp:47
-msgid "Zone"
+#: engines/scumm/help.cpp:127
+msgid "Get"
msgstr ""
-#: backends/platform/symbian/src/SymbianActions.cpp:47
-#: backends/platform/wince/CEActionsPocket.cpp:54
-#: backends/platform/wince/CEActionsSmartphone.cpp:48
-msgid "Multi Function"
+#: engines/scumm/help.cpp:128 engines/scumm/help.cpp:152
+#: 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 ""
-#: backends/platform/symbian/src/SymbianActions.cpp:48
-msgid "Swap character"
+#: engines/scumm/help.cpp:129 engines/scumm/help.cpp:141
+msgid "Read"
msgstr ""
-#: backends/platform/symbian/src/SymbianActions.cpp:49
-msgid "Skip text"
+#: engines/scumm/help.cpp:130 engines/scumm/help.cpp:147
+msgid "New kid"
msgstr ""
-#: backends/platform/symbian/src/SymbianActions.cpp:51
-msgid "Fast mode"
+#: engines/scumm/help.cpp:131 engines/scumm/help.cpp:153
+#: engines/scumm/help.cpp:171
+msgid "Turn on"
msgstr ""
-#: backends/platform/symbian/src/SymbianActions.cpp:53
-msgid "Debugger"
+#: engines/scumm/help.cpp:132 engines/scumm/help.cpp:154
+#: engines/scumm/help.cpp:172
+msgid "Turn off"
msgstr ""
-#: backends/platform/symbian/src/SymbianActions.cpp:54
-msgid "Global menu"
+#: engines/scumm/help.cpp:142 engines/scumm/help.cpp:167
+#: engines/scumm/help.cpp:194
+msgid "Walk to"
msgstr ""
-#: backends/platform/symbian/src/SymbianActions.cpp:55
-msgid "Virtual keyboard"
+#: engines/scumm/help.cpp:143 engines/scumm/help.cpp:168
+#: engines/scumm/help.cpp:195 engines/scumm/help.cpp:210
+#: engines/scumm/help.cpp:227
+msgid "Pick up"
msgstr ""
-#: backends/platform/symbian/src/SymbianActions.cpp:56
-msgid "Key mapper"
+#: engines/scumm/help.cpp:144 engines/scumm/help.cpp:169
+msgid "What is"
msgstr ""
-#: backends/events/symbiansdl/symbiansdl-events.cpp:184
-msgid "Do you want to quit ?"
+#: engines/scumm/help.cpp:146
+msgid "Unlock"
msgstr ""
-#: backends/platform/wii/options.cpp:51
-msgid "Video"
+#: engines/scumm/help.cpp:149
+msgid "Put on"
msgstr ""
-#: backends/platform/wii/options.cpp:54
-msgid "Current video mode:"
+#: engines/scumm/help.cpp:150
+msgid "Take off"
msgstr ""
-#: backends/platform/wii/options.cpp:56
-msgid "Double-strike"
+#: engines/scumm/help.cpp:156
+msgid "Fix"
msgstr ""
-#: backends/platform/wii/options.cpp:60
-msgid "Horizontal underscan:"
+#: engines/scumm/help.cpp:158
+msgid "Switch"
msgstr ""
-#: backends/platform/wii/options.cpp:66
-msgid "Vertical underscan:"
+#: engines/scumm/help.cpp:166 engines/scumm/help.cpp:228
+msgid "Look"
msgstr ""
-#: backends/platform/wii/options.cpp:71
-msgid "Input"
+#: engines/scumm/help.cpp:173 engines/scumm/help.cpp:223
+msgid "Talk"
msgstr ""
-#: backends/platform/wii/options.cpp:74
-msgid "GC Pad sensitivity:"
+#: engines/scumm/help.cpp:174
+msgid "Travel"
msgstr ""
-#: backends/platform/wii/options.cpp:80
-msgid "GC Pad acceleration:"
+#: engines/scumm/help.cpp:175
+msgid "To Henry / To Indy"
msgstr ""
-#: backends/platform/wii/options.cpp:86
-msgid "DVD"
+#. I18N: These are different musical notes
+#: engines/scumm/help.cpp:179
+msgid "play C minor on distaff"
msgstr ""
-#: backends/platform/wii/options.cpp:89 backends/platform/wii/options.cpp:101
-msgid "Status:"
+#: engines/scumm/help.cpp:180
+msgid "play D on distaff"
msgstr ""
-#: backends/platform/wii/options.cpp:90 backends/platform/wii/options.cpp:102
-msgid "Unknown"
+#: engines/scumm/help.cpp:181
+msgid "play E on distaff"
msgstr ""
-#: backends/platform/wii/options.cpp:93
-msgid "Mount DVD"
+#: engines/scumm/help.cpp:182
+msgid "play F on distaff"
msgstr ""
-#: backends/platform/wii/options.cpp:94
-msgid "Unmount DVD"
+#: engines/scumm/help.cpp:183
+msgid "play G on distaff"
msgstr ""
-#: backends/platform/wii/options.cpp:98
-msgid "SMB"
+#: engines/scumm/help.cpp:184
+msgid "play A on distaff"
msgstr ""
-#: backends/platform/wii/options.cpp:106
-msgid "Server:"
+#: engines/scumm/help.cpp:185
+msgid "play B on distaff"
msgstr ""
-#: backends/platform/wii/options.cpp:110
-msgid "Share:"
+#: engines/scumm/help.cpp:186
+msgid "play C major on distaff"
msgstr ""
-#: backends/platform/wii/options.cpp:114
-msgid "Username:"
+#: engines/scumm/help.cpp:192 engines/scumm/help.cpp:214
+msgid "puSh"
msgstr ""
-#: backends/platform/wii/options.cpp:118
-msgid "Password:"
+#: engines/scumm/help.cpp:193 engines/scumm/help.cpp:215
+msgid "pull (Yank)"
msgstr ""
-#: backends/platform/wii/options.cpp:121
-msgid "Init network"
+#: engines/scumm/help.cpp:196 engines/scumm/help.cpp:212
+#: engines/scumm/help.cpp:248
+msgid "Talk to"
msgstr ""
-#: backends/platform/wii/options.cpp:123
-msgid "Mount SMB"
+#: engines/scumm/help.cpp:199 engines/scumm/help.cpp:211
+msgid "Look at"
msgstr ""
-#: backends/platform/wii/options.cpp:124
-msgid "Unmount SMB"
+#: engines/scumm/help.cpp:200
+msgid "turn oN"
msgstr ""
-#: backends/platform/wii/options.cpp:143
-msgid "DVD Mounted successfully"
+#: engines/scumm/help.cpp:201
+msgid "turn oFf"
msgstr ""
-#: backends/platform/wii/options.cpp:146
-msgid "Error while mounting the DVD"
+#: engines/scumm/help.cpp:217
+msgid "KeyUp"
msgstr ""
-#: backends/platform/wii/options.cpp:148
-msgid "DVD not mounted"
+#: engines/scumm/help.cpp:217
+msgid "Highlight prev dialogue"
msgstr ""
-#: backends/platform/wii/options.cpp:161
-msgid "Network up, share mounted"
+#: engines/scumm/help.cpp:218
+msgid "KeyDown"
msgstr ""
-#: backends/platform/wii/options.cpp:163
-msgid "Network up"
+#: engines/scumm/help.cpp:218
+msgid "Highlight next dialogue"
msgstr ""
-#: backends/platform/wii/options.cpp:166
-msgid ", error while mounting the share"
+#: engines/scumm/help.cpp:222
+msgid "Walk"
msgstr ""
-#: backends/platform/wii/options.cpp:168
-msgid ", share not mounted"
+#: engines/scumm/help.cpp:225 engines/scumm/help.cpp:234
+#: engines/scumm/help.cpp:241 engines/scumm/help.cpp:249
+msgid "Inventory"
msgstr ""
-#: backends/platform/wii/options.cpp:174
-msgid "Network down"
+#: engines/scumm/help.cpp:226
+msgid "Object"
msgstr ""
-#: backends/platform/wii/options.cpp:178
-msgid "Initializing network"
+#: engines/scumm/help.cpp:229
+msgid "Black and White / Color"
msgstr ""
-#: backends/platform/wii/options.cpp:182
-msgid "Timeout while initializing network"
+#: engines/scumm/help.cpp:232
+msgid "Eyes"
msgstr ""
-#: backends/platform/wii/options.cpp:186
-#, c-format
-msgid "Network not initialized (%d)"
+#: engines/scumm/help.cpp:233
+msgid "Tongue"
msgstr ""
-#: backends/platform/wince/CEActionsPocket.cpp:46
-msgid "Hide Toolbar"
+#: engines/scumm/help.cpp:235
+msgid "Punch"
msgstr ""
-#: backends/platform/wince/CEActionsPocket.cpp:47
-msgid "Show Keyboard"
+#: engines/scumm/help.cpp:236
+msgid "Kick"
msgstr ""
-#: backends/platform/wince/CEActionsPocket.cpp:48
-msgid "Sound on/off"
+#: engines/scumm/help.cpp:239 engines/scumm/help.cpp:247
+msgid "Examine"
msgstr ""
-#: backends/platform/wince/CEActionsPocket.cpp:49
-msgid "Right click"
+#: engines/scumm/help.cpp:240
+msgid "Regular cursor"
msgstr ""
-#: backends/platform/wince/CEActionsPocket.cpp:50
-msgid "Show/Hide Cursor"
+#. I18N: Comm is a communication device
+#: engines/scumm/help.cpp:243
+msgid "Comm"
msgstr ""
-#: backends/platform/wince/CEActionsPocket.cpp:51
-msgid "Free look"
+#: engines/scumm/help.cpp:246
+msgid "Save / Load / Options"
msgstr ""
-#: backends/platform/wince/CEActionsPocket.cpp:52
-msgid "Zoom up"
+#: engines/scumm/help.cpp:255
+msgid "Other game controls:"
msgstr ""
-#: backends/platform/wince/CEActionsPocket.cpp:53
-msgid "Zoom down"
+#: engines/scumm/help.cpp:257 engines/scumm/help.cpp:267
+msgid "Inventory:"
msgstr ""
-#: backends/platform/wince/CEActionsPocket.cpp:55
-#: backends/platform/wince/CEActionsSmartphone.cpp:49
-msgid "Bind Keys"
+#: engines/scumm/help.cpp:258 engines/scumm/help.cpp:274
+msgid "Scroll list up"
msgstr ""
-#: backends/platform/wince/CEActionsPocket.cpp:56
-msgid "Cursor Up"
+#: engines/scumm/help.cpp:259 engines/scumm/help.cpp:275
+msgid "Scroll list down"
msgstr ""
-#: backends/platform/wince/CEActionsPocket.cpp:57
-msgid "Cursor Down"
+#: engines/scumm/help.cpp:260 engines/scumm/help.cpp:268
+msgid "Upper left item"
msgstr ""
-#: backends/platform/wince/CEActionsPocket.cpp:58
-msgid "Cursor Left"
+#: engines/scumm/help.cpp:261 engines/scumm/help.cpp:270
+msgid "Lower left item"
msgstr ""
-#: backends/platform/wince/CEActionsPocket.cpp:59
-msgid "Cursor Right"
+#: engines/scumm/help.cpp:262 engines/scumm/help.cpp:271
+msgid "Upper right item"
msgstr ""
-#: backends/platform/wince/CEActionsPocket.cpp:267
-#: backends/platform/wince/CEActionsSmartphone.cpp:231
-msgid "Do you want to load or save the game?"
+#: engines/scumm/help.cpp:263 engines/scumm/help.cpp:273
+msgid "Lower right item"
msgstr ""
-#: backends/platform/wince/CEActionsPocket.cpp:326
-#: backends/platform/wince/CEActionsSmartphone.cpp:287
-msgid " Are you sure you want to quit ? "
+#: engines/scumm/help.cpp:269
+msgid "Middle left item"
msgstr ""
-#: backends/platform/wince/CEActionsSmartphone.cpp:50
-msgid "Keyboard"
+#: engines/scumm/help.cpp:272
+msgid "Middle right item"
msgstr ""
-#: backends/platform/wince/CEActionsSmartphone.cpp:51
-msgid "Rotate"
+#: engines/scumm/help.cpp:279 engines/scumm/help.cpp:284
+msgid "Switching characters:"
msgstr ""
-#: backends/platform/wince/CELauncherDialog.cpp:56
-msgid "Using SDL driver "
+#: engines/scumm/help.cpp:281
+msgid "Second kid"
msgstr ""
-#: backends/platform/wince/CELauncherDialog.cpp:60
-msgid "Display "
+#: engines/scumm/help.cpp:282
+msgid "Third kid"
msgstr ""
-#: backends/platform/wince/CELauncherDialog.cpp:83
-msgid "Do you want to perform an automatic scan ?"
+#: engines/scumm/help.cpp:294
+msgid "Fighting controls (numpad):"
msgstr ""
-#: backends/platform/wince/wince-sdl.cpp:515
-msgid "Map right click action"
+#: engines/scumm/help.cpp:295 engines/scumm/help.cpp:296
+#: engines/scumm/help.cpp:297
+msgid "Step back"
msgstr ""
-#: backends/platform/wince/wince-sdl.cpp:519
-msgid "You must map a key to the 'Right Click' action to play this game"
+#: engines/scumm/help.cpp:298
+msgid "Block high"
msgstr ""
-#: backends/platform/wince/wince-sdl.cpp:528
-msgid "Map hide toolbar action"
+#: engines/scumm/help.cpp:299
+msgid "Block middle"
msgstr ""
-#: backends/platform/wince/wince-sdl.cpp:532
-msgid "You must map a key to the 'Hide toolbar' action to play this game"
+#: engines/scumm/help.cpp:300
+msgid "Block low"
msgstr ""
-#: backends/platform/wince/wince-sdl.cpp:541
-msgid "Map Zoom Up action (optional)"
+#: engines/scumm/help.cpp:301
+msgid "Punch high"
msgstr ""
-#: backends/platform/wince/wince-sdl.cpp:544
-msgid "Map Zoom Down action (optional)"
+#: engines/scumm/help.cpp:302
+msgid "Punch middle"
+msgstr ""
+
+#: engines/scumm/help.cpp:303
+msgid "Punch low"
+msgstr ""
+
+#: engines/scumm/help.cpp:306
+msgid "These are for Indy on left."
+msgstr ""
+
+#: engines/scumm/help.cpp:307
+msgid "When Indy is on the right,"
+msgstr ""
+
+#: engines/scumm/help.cpp:308
+msgid "7, 4, and 1 are switched with"
+msgstr ""
+
+#: engines/scumm/help.cpp:309
+msgid "9, 6, and 3, respectively."
+msgstr ""
+
+#: engines/scumm/help.cpp:316
+msgid "Biplane controls (numpad):"
+msgstr ""
+
+#: engines/scumm/help.cpp:317
+msgid "Fly to upper left"
+msgstr ""
+
+#: engines/scumm/help.cpp:318
+msgid "Fly to left"
+msgstr ""
+
+#: engines/scumm/help.cpp:319
+msgid "Fly to lower left"
+msgstr ""
+
+#: engines/scumm/help.cpp:320
+msgid "Fly upwards"
+msgstr ""
+
+#: engines/scumm/help.cpp:321
+msgid "Fly straight"
+msgstr ""
+
+#: engines/scumm/help.cpp:322
+msgid "Fly down"
+msgstr ""
+
+#: engines/scumm/help.cpp:323
+msgid "Fly to upper right"
+msgstr ""
+
+#: engines/scumm/help.cpp:324
+msgid "Fly to right"
+msgstr ""
+
+#: engines/scumm/help.cpp:325
+msgid "Fly to lower right"
msgstr ""
-#: backends/platform/wince/wince-sdl.cpp:552
+#: engines/scumm/scumm.cpp:1777
+#, c-format
msgid ""
-"Don't forget to map a key to 'Hide Toolbar' action to see the whole inventory"
+"Native MIDI support requires the Roland Upgrade from LucasArts,\n"
+"but %s is missing. Using AdLib instead."
msgstr ""
-#: backends/events/default/default-events.cpp:193
-msgid "Do you really want to return to the Launcher?"
+#: engines/scumm/scumm.cpp:2547
+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 ""
-#: backends/events/default/default-events.cpp:193
-msgid "Launcher"
+#: engines/sky/compact.cpp:130
+msgid ""
+"Unable to find \"sky.cpt\" file!\n"
+"Please download it from www.scummvm.org"
msgstr ""
-#: backends/events/default/default-events.cpp:215
-msgid "Do you really want to quit?"
+#: engines/sky/compact.cpp:141
+msgid ""
+"The \"sky.cpt\" file has an incorrect size.\n"
+"Please (re)download it from www.scummvm.org"
msgstr ""
-#: backends/events/gph/gph-events.cpp:386
-#: backends/events/gph/gph-events.cpp:429
-#: backends/events/openpandora/op-events.cpp:168
-msgid "Touchscreen 'Tap Mode' - Left Click"
+#: engines/sky/detection.cpp:44
+msgid "Floppy intro"
msgstr ""
-#: backends/events/gph/gph-events.cpp:388
-#: backends/events/gph/gph-events.cpp:431
-#: backends/events/openpandora/op-events.cpp:170
-msgid "Touchscreen 'Tap Mode' - Right Click"
+#: engines/sky/detection.cpp:45
+msgid "Use the floppy version's intro (CD version only)"
msgstr ""
-#: backends/events/gph/gph-events.cpp:390
-#: backends/events/gph/gph-events.cpp:433
-#: backends/events/openpandora/op-events.cpp:172
-msgid "Touchscreen 'Tap Mode' - Hover (No Click)"
+#: engines/sword1/animation.cpp:524
+#, c-format
+msgid "PSX stream cutscene '%s' cannot be played in paletted mode"
msgstr ""
-#: backends/events/gph/gph-events.cpp:410
-msgid "Maximum Volume"
+#: engines/sword1/animation.cpp:545 engines/sword2/animation.cpp:445
+msgid "DXA cutscenes found but ScummVM has been built without zlib support"
msgstr ""
-#: backends/events/gph/gph-events.cpp:412
-msgid "Increasing Volume"
+#: engines/sword1/animation.cpp:561
+msgid "MPEG-2 cutscenes found but ScummVM has been built without MPEG-2"
msgstr ""
-#: backends/events/gph/gph-events.cpp:418
-msgid "Minimal Volume"
+#: engines/sword1/animation.cpp:568 engines/sword2/animation.cpp:470
+#, c-format
+msgid "Cutscene '%s' not found"
msgstr ""
-#: backends/events/gph/gph-events.cpp:420
-msgid "Decreasing Volume"
+#: engines/sword1/control.cpp:863
+msgid ""
+"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"
msgstr ""
-#: backends/events/openpandora/op-events.cpp:174
-msgid "Touchscreen 'Tap Mode' - Hover (DPad Clicks)"
+#: engines/sword1/control.cpp:1232
+#, c-format
+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 ""
-#: backends/updates/macosx/macosx-updates.mm:67
-msgid "Check for Updates..."
+#: engines/sword1/control.cpp:1235
+msgid "Keep the old one"
msgstr ""
-#: backends/platform/bada/form.cpp:269
-msgid "Right Click Once"
+#: engines/sword1/control.cpp:1235
+msgid "Keep the new one"
msgstr ""
-#: backends/platform/bada/form.cpp:277
-msgid "Move Only"
+#: engines/sword1/logic.cpp:1633
+msgid "This is the end of the Broken Sword 1 Demo"
msgstr ""
-#: backends/platform/bada/form.cpp:291
-msgid "Escape Key"
+#: engines/sword2/animation.cpp:425
+msgid ""
+"PSX cutscenes found but ScummVM has been built without RGB color support"
msgstr ""
-#: backends/platform/bada/form.cpp:296
-msgid "Game Menu"
+#: engines/sword2/animation.cpp:461
+msgid ""
+"MPEG-2 cutscenes found but ScummVM has been built without MPEG-2 support"
msgstr ""
-#: backends/platform/bada/form.cpp:301
-msgid "Show Keypad"
+#: engines/sword2/sword2.cpp:79
+msgid "Show object labels"
msgstr ""
-#: backends/platform/bada/form.cpp:309
-msgid "Control Mouse"
+#: engines/sword2/sword2.cpp:80
+msgid "Show labels for objects on mouse hover"
msgstr ""
-#: backends/events/maemosdl/maemosdl-events.cpp:192
-msgid "Clicking Enabled"
+#: engines/teenagent/resources.cpp:95
+msgid ""
+"You're missing the 'teenagent.dat' file. Get it from the ScummVM website"
msgstr ""
-#: backends/events/maemosdl/maemosdl-events.cpp:192
-msgid "Clicking Disabled"
+#: engines/teenagent/resources.cpp:116
+msgid ""
+"The teenagent.dat file is compressed and zlib hasn't been included in this "
+"executable. Please decompress it"
msgstr ""
diff --git a/po/se_SE.po b/po/se_SE.po
index 0031e2dc06..3af34732f8 100644
--- a/po/se_SE.po
+++ b/po/se_SE.po
@@ -1,5 +1,5 @@
# Swedish translation for ScummVM.
-# Copyright (C) 2011-2013 ScummVM Team
+# Copyright (C) 2011-2014 ScummVM Team
# This file is distributed under the same license as the ScummVM package.
# Hampus Flink <hampus.flink@gmail.com>, 2011.
#
@@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: ScummVM 1.5.0svn\n"
"Report-Msgid-Bugs-To: scummvm-devel@lists.sf.net\n"
-"POT-Creation-Date: 2013-04-24 13:35+0100\n"
+"POT-Creation-Date: 2014-06-07 23:06+0100\n"
"PO-Revision-Date: 2013-05-13 21:30+0100\n"
"Last-Translator: Hampus Flink <hampus.flink@gmail.com>\n"
"Language-Team: \n"
@@ -19,77 +19,77 @@ msgstr ""
"X-Poedit-SourceCharset: iso-8859-1\n"
"X-Generator: Poedit 1.5.5\n"
-#: gui/about.cpp:93
+#: gui/about.cpp:94
#, c-format
msgid "(built on %s)"
msgstr "(byggt %s)"
-#: gui/about.cpp:100
+#: gui/about.cpp:101
msgid "Features compiled in:"
msgstr "Funktioner kompilerade i:"
-#: gui/about.cpp:109
+#: gui/about.cpp:110
msgid "Available engines:"
msgstr "Tillgängliga motorer"
-#: gui/browser.cpp:67
+#: gui/browser.cpp:68
msgid "Show hidden files"
msgstr "Visa gömda filer"
-#: gui/browser.cpp:67
+#: gui/browser.cpp:68
msgid "Show files marked with the hidden attribute"
msgstr "Visa dolda filer"
-#: gui/browser.cpp:71
+#: gui/browser.cpp:72
msgid "Go up"
msgstr "Uppåt"
-#: gui/browser.cpp:71 gui/browser.cpp:73
+#: gui/browser.cpp:72 gui/browser.cpp:74
msgid "Go to previous directory level"
msgstr "Gå till föregående katalognivå"
-#: gui/browser.cpp:73
+#: gui/browser.cpp:74
msgctxt "lowres"
msgid "Go up"
msgstr "Uppåt"
-#: gui/browser.cpp:74 gui/chooser.cpp:45 gui/KeysDialog.cpp:43
-#: gui/launcher.cpp:345 gui/massadd.cpp:94 gui/options.cpp:1238
-#: gui/saveload-dialog.cpp:215 gui/saveload-dialog.cpp:275
-#: gui/saveload-dialog.cpp:545 gui/saveload-dialog.cpp:919
-#: gui/themebrowser.cpp:54 gui/fluidsynth-dialog.cpp:151
-#: engines/engine.cpp:447 engines/drascula/saveload.cpp:51
-#: engines/scumm/dialogs.cpp:190 engines/sword1/control.cpp:865
-#: engines/parallaction/saveload.cpp:274 backends/platform/wii/options.cpp:48
-#: backends/events/default/default-events.cpp:193
-#: backends/events/default/default-events.cpp:215
+#: gui/browser.cpp:75 gui/chooser.cpp:46 gui/KeysDialog.cpp:43
+#: gui/launcher.cpp:351 gui/massadd.cpp:95 gui/options.cpp:1239
+#: gui/saveload-dialog.cpp:216 gui/saveload-dialog.cpp:276
+#: gui/saveload-dialog.cpp:547 gui/saveload-dialog.cpp:922
+#: gui/themebrowser.cpp:55 gui/fluidsynth-dialog.cpp:152
+#: engines/engine.cpp:452 backends/platform/wii/options.cpp:48
+#: backends/events/default/default-events.cpp:196
+#: backends/events/default/default-events.cpp:218
+#: engines/drascula/saveload.cpp:49 engines/parallaction/saveload.cpp:274
+#: engines/scumm/dialogs.cpp:191 engines/sword1/control.cpp:865
msgid "Cancel"
msgstr "Avbryt"
-#: gui/browser.cpp:75 gui/chooser.cpp:46 gui/themebrowser.cpp:55
+#: gui/browser.cpp:76 gui/chooser.cpp:47 gui/themebrowser.cpp:56
msgid "Choose"
msgstr "Välj"
-#: gui/gui-manager.cpp:115 engines/scumm/help.cpp:125
-#: engines/scumm/help.cpp:140 engines/scumm/help.cpp:165
-#: engines/scumm/help.cpp:191 engines/scumm/help.cpp:209
-#: backends/keymapper/remap-dialog.cpp:52
+#: gui/gui-manager.cpp:117 backends/keymapper/remap-dialog.cpp:53
+#: engines/scumm/help.cpp:125 engines/scumm/help.cpp:140
+#: engines/scumm/help.cpp:165 engines/scumm/help.cpp:191
+#: engines/scumm/help.cpp:209
msgid "Close"
msgstr "Stäng"
-#: gui/gui-manager.cpp:118
+#: gui/gui-manager.cpp:120
msgid "Mouse click"
msgstr "Musklick"
-#: gui/gui-manager.cpp:122 base/main.cpp:301
+#: gui/gui-manager.cpp:124 base/main.cpp:319
msgid "Display keyboard"
msgstr "Visa tangentbord"
-#: gui/gui-manager.cpp:126 base/main.cpp:305
+#: gui/gui-manager.cpp:128 base/main.cpp:323
msgid "Remap keys"
msgstr "Ställ in tangenter"
-#: gui/gui-manager.cpp:129 base/main.cpp:308
+#: gui/gui-manager.cpp:131 base/main.cpp:326
msgid "Toggle FullScreen"
msgstr "Fullskärmsläge"
@@ -101,21 +101,21 @@ msgstr "Välj en handling att ställa in"
msgid "Map"
msgstr "Ställ in"
-#: gui/KeysDialog.cpp:42 gui/launcher.cpp:346 gui/launcher.cpp:1001
-#: gui/launcher.cpp:1005 gui/massadd.cpp:91 gui/options.cpp:1239
-#: gui/saveload-dialog.cpp:920 gui/fluidsynth-dialog.cpp:152
-#: engines/engine.cpp:366 engines/engine.cpp:377
-#: engines/drascula/saveload.cpp:51 engines/scumm/dialogs.cpp:192
-#: engines/scumm/scumm.cpp:1778 engines/agos/animation.cpp:558
-#: engines/groovie/script.cpp:420 engines/sky/compact.cpp:131
-#: engines/sky/compact.cpp:141 engines/sword1/animation.cpp:519
-#: engines/sword1/animation.cpp:540 engines/sword1/animation.cpp:550
-#: engines/sword1/animation.cpp:557 engines/sword1/control.cpp:865
-#: engines/sword1/logic.cpp:1633 engines/sword2/animation.cpp:419
-#: engines/sword2/animation.cpp:439 engines/sword2/animation.cpp:449
-#: engines/sword2/animation.cpp:458 engines/parallaction/saveload.cpp:274
+#: gui/KeysDialog.cpp:42 gui/launcher.cpp:352 gui/launcher.cpp:1048
+#: gui/launcher.cpp:1052 gui/massadd.cpp:92 gui/options.cpp:1240
+#: gui/saveload-dialog.cpp:923 gui/fluidsynth-dialog.cpp:153
+#: engines/engine.cpp:371 engines/engine.cpp:382
#: backends/platform/wii/options.cpp:47
#: backends/platform/wince/CELauncherDialog.cpp:54
+#: engines/agos/animation.cpp:558 engines/drascula/saveload.cpp:49
+#: engines/groovie/script.cpp:399 engines/parallaction/saveload.cpp:274
+#: engines/scumm/dialogs.cpp:193 engines/scumm/scumm.cpp:1779
+#: engines/sky/compact.cpp:131 engines/sky/compact.cpp:141
+#: engines/sword1/animation.cpp:524 engines/sword1/animation.cpp:545
+#: engines/sword1/animation.cpp:561 engines/sword1/animation.cpp:569
+#: engines/sword1/control.cpp:865 engines/sword1/logic.cpp:1633
+#: engines/sword2/animation.cpp:425 engines/sword2/animation.cpp:445
+#: engines/sword2/animation.cpp:461 engines/sword2/animation.cpp:471
msgid "OK"
msgstr "OK"
@@ -141,15 +141,15 @@ msgstr "Var god välj en handling"
msgid "Press the key to associate"
msgstr "Tryck på en tangent för att ställa in"
-#: gui/launcher.cpp:187
+#: gui/launcher.cpp:193
msgid "Game"
msgstr "Spel"
-#: gui/launcher.cpp:191
+#: gui/launcher.cpp:197
msgid "ID:"
msgstr "ID:"
-#: gui/launcher.cpp:191 gui/launcher.cpp:193 gui/launcher.cpp:194
+#: gui/launcher.cpp:197 gui/launcher.cpp:199 gui/launcher.cpp:200
msgid ""
"Short game identifier used for referring to savegames and running the game "
"from the command line"
@@ -157,29 +157,29 @@ msgstr ""
"Kortnamn för spel. Används för att hänvisa till spardata och att starta "
"spelet från kommandoraden"
-#: gui/launcher.cpp:193
+#: gui/launcher.cpp:199
msgctxt "lowres"
msgid "ID:"
msgstr "ID:"
-#: gui/launcher.cpp:198
+#: gui/launcher.cpp:204
msgid "Name:"
msgstr "Namn:"
-#: gui/launcher.cpp:198 gui/launcher.cpp:200 gui/launcher.cpp:201
+#: gui/launcher.cpp:204 gui/launcher.cpp:206 gui/launcher.cpp:207
msgid "Full title of the game"
msgstr "Spelets fullständiga titel"
-#: gui/launcher.cpp:200
+#: gui/launcher.cpp:206
msgctxt "lowres"
msgid "Name:"
msgstr "Namn:"
-#: gui/launcher.cpp:204
+#: gui/launcher.cpp:210
msgid "Language:"
msgstr "Språk:"
-#: gui/launcher.cpp:204 gui/launcher.cpp:205
+#: gui/launcher.cpp:210 gui/launcher.cpp:211
msgid ""
"Language of the game. This will not turn your Spanish game version into "
"English"
@@ -187,286 +187,287 @@ msgstr ""
"Spelets språk. Den här inställningen omvandlar inte din spanska spelversion "
"till en engelsk"
-#: gui/launcher.cpp:206 gui/launcher.cpp:220 gui/options.cpp:86
-#: gui/options.cpp:736 gui/options.cpp:749 gui/options.cpp:1209
-#: audio/null.cpp:40
+#: gui/launcher.cpp:212 gui/launcher.cpp:226 gui/options.cpp:87
+#: gui/options.cpp:737 gui/options.cpp:750 gui/options.cpp:1210
+#: audio/null.cpp:41
msgid "<default>"
msgstr "<standard>"
-#: gui/launcher.cpp:216
+#: gui/launcher.cpp:222
msgid "Platform:"
msgstr "Plattform:"
-#: gui/launcher.cpp:216 gui/launcher.cpp:218 gui/launcher.cpp:219
+#: gui/launcher.cpp:222 gui/launcher.cpp:224 gui/launcher.cpp:225
msgid "Platform the game was originally designed for"
msgstr "Plattformen spelet ursprungligen tillverkades för"
-#: gui/launcher.cpp:218
+#: gui/launcher.cpp:224
msgctxt "lowres"
msgid "Platform:"
msgstr "Plattform:"
-#: gui/launcher.cpp:231
+#: gui/launcher.cpp:237
msgid "Engine"
msgstr "Motor"
-#: gui/launcher.cpp:239 gui/options.cpp:1072 gui/options.cpp:1089
+#: gui/launcher.cpp:245 gui/options.cpp:1073 gui/options.cpp:1090
msgid "Graphics"
msgstr "Grafik"
-#: gui/launcher.cpp:239 gui/options.cpp:1072 gui/options.cpp:1089
+#: gui/launcher.cpp:245 gui/options.cpp:1073 gui/options.cpp:1090
msgid "GFX"
msgstr "GFX"
-#: gui/launcher.cpp:242
+#: gui/launcher.cpp:248
msgid "Override global graphic settings"
msgstr "Överskrid globala grafikinställningar"
-#: gui/launcher.cpp:244
+#: gui/launcher.cpp:250
msgctxt "lowres"
msgid "Override global graphic settings"
msgstr "Överskrid globala grafikinställningar"
-#: gui/launcher.cpp:251 gui/options.cpp:1095
+#: gui/launcher.cpp:257 gui/options.cpp:1096
msgid "Audio"
msgstr "Ljud"
-#: gui/launcher.cpp:254
+#: gui/launcher.cpp:260
msgid "Override global audio settings"
msgstr "Överskrid globala ljudinställningar"
-#: gui/launcher.cpp:256
+#: gui/launcher.cpp:262
msgctxt "lowres"
msgid "Override global audio settings"
msgstr "Överskrid globala ljudinställningar"
-#: gui/launcher.cpp:265 gui/options.cpp:1100
+#: gui/launcher.cpp:271 gui/options.cpp:1101
msgid "Volume"
msgstr "Volym"
-#: gui/launcher.cpp:267 gui/options.cpp:1102
+#: gui/launcher.cpp:273 gui/options.cpp:1103
msgctxt "lowres"
msgid "Volume"
msgstr "Volym"
-#: gui/launcher.cpp:270
+#: gui/launcher.cpp:276
msgid "Override global volume settings"
msgstr "Överskrid globala volyminställningar"
-#: gui/launcher.cpp:272
+#: gui/launcher.cpp:278
msgctxt "lowres"
msgid "Override global volume settings"
msgstr "Överskrid globala volyminställningar"
-#: gui/launcher.cpp:280 gui/options.cpp:1110
+#: gui/launcher.cpp:286 gui/options.cpp:1111
msgid "MIDI"
msgstr "MIDI"
-#: gui/launcher.cpp:283
+#: gui/launcher.cpp:289
msgid "Override global MIDI settings"
msgstr "Överskrid globala MIDI-inställningar"
-#: gui/launcher.cpp:285
+#: gui/launcher.cpp:291
msgctxt "lowres"
msgid "Override global MIDI settings"
msgstr "Överskrid globala MIDI-inställningar"
-#: gui/launcher.cpp:294 gui/options.cpp:1116
+#: gui/launcher.cpp:300 gui/options.cpp:1117
msgid "MT-32"
msgstr "MT-32"
-#: gui/launcher.cpp:297
+#: gui/launcher.cpp:303
msgid "Override global MT-32 settings"
msgstr "Överskrid globala MT-32 inställningar"
-#: gui/launcher.cpp:299
+#: gui/launcher.cpp:305
msgctxt "lowres"
msgid "Override global MT-32 settings"
msgstr "Överskrid globala MT-32 inställningar"
-#: gui/launcher.cpp:308 gui/options.cpp:1123
+#: gui/launcher.cpp:314 gui/options.cpp:1124
msgid "Paths"
msgstr "Sökvägar"
-#: gui/launcher.cpp:310 gui/options.cpp:1125
+#: gui/launcher.cpp:316 gui/options.cpp:1126
msgctxt "lowres"
msgid "Paths"
msgstr "Sökvägar"
-#: gui/launcher.cpp:317
+#: gui/launcher.cpp:323
msgid "Game Path:"
msgstr "Sökv. spel:"
-#: gui/launcher.cpp:319
+#: gui/launcher.cpp:325
msgctxt "lowres"
msgid "Game Path:"
msgstr "Sökv. spel:"
-#: gui/launcher.cpp:324 gui/options.cpp:1149
+#: gui/launcher.cpp:330 gui/options.cpp:1150
msgid "Extra Path:"
msgstr "Sökv. extra:"
-#: gui/launcher.cpp:324 gui/launcher.cpp:326 gui/launcher.cpp:327
+#: gui/launcher.cpp:330 gui/launcher.cpp:332 gui/launcher.cpp:333
msgid "Specifies path to additional data used the game"
msgstr "Bestämmer sökvägen till ytterligare data som spelet använder"
-#: gui/launcher.cpp:326 gui/options.cpp:1151
+#: gui/launcher.cpp:332 gui/options.cpp:1152
msgctxt "lowres"
msgid "Extra Path:"
msgstr "Sökv. extra:"
-#: gui/launcher.cpp:333 gui/options.cpp:1133
+#: gui/launcher.cpp:339 gui/options.cpp:1134
msgid "Save Path:"
msgstr "Sökv. sparat:"
-#: gui/launcher.cpp:333 gui/launcher.cpp:335 gui/launcher.cpp:336
-#: gui/options.cpp:1133 gui/options.cpp:1135 gui/options.cpp:1136
+#: gui/launcher.cpp:339 gui/launcher.cpp:341 gui/launcher.cpp:342
+#: gui/options.cpp:1134 gui/options.cpp:1136 gui/options.cpp:1137
msgid "Specifies where your savegames are put"
msgstr "Bestämmer var dina spardata lagras"
-#: gui/launcher.cpp:335 gui/options.cpp:1135
+#: gui/launcher.cpp:341 gui/options.cpp:1136
msgctxt "lowres"
msgid "Save Path:"
msgstr "Sökv. sparat:"
-#: gui/launcher.cpp:354 gui/launcher.cpp:453 gui/launcher.cpp:511
-#: gui/launcher.cpp:565 gui/options.cpp:1144 gui/options.cpp:1152
-#: gui/options.cpp:1161 gui/options.cpp:1276 gui/options.cpp:1282
-#: gui/options.cpp:1290 gui/options.cpp:1320 gui/options.cpp:1326
-#: gui/options.cpp:1333 gui/options.cpp:1426 gui/options.cpp:1429
-#: gui/options.cpp:1441
+#: gui/launcher.cpp:360 gui/launcher.cpp:459 gui/launcher.cpp:517
+#: gui/launcher.cpp:571 gui/options.cpp:1145 gui/options.cpp:1153
+#: gui/options.cpp:1162 gui/options.cpp:1277 gui/options.cpp:1283
+#: gui/options.cpp:1291 gui/options.cpp:1321 gui/options.cpp:1327
+#: gui/options.cpp:1334 gui/options.cpp:1427 gui/options.cpp:1430
+#: gui/options.cpp:1442
msgctxt "path"
msgid "None"
msgstr "Ingen"
-#: gui/launcher.cpp:359 gui/launcher.cpp:459 gui/launcher.cpp:569
-#: gui/options.cpp:1270 gui/options.cpp:1314 gui/options.cpp:1432
+#: gui/launcher.cpp:365 gui/launcher.cpp:465 gui/launcher.cpp:575
+#: gui/options.cpp:1271 gui/options.cpp:1315 gui/options.cpp:1433
#: backends/platform/wii/options.cpp:56
msgid "Default"
msgstr "Standard"
-#: gui/launcher.cpp:504 gui/options.cpp:1435
+#: gui/launcher.cpp:510 gui/options.cpp:1436
msgid "Select SoundFont"
msgstr "Välj SoundFont"
-#: gui/launcher.cpp:523 gui/launcher.cpp:677
+#: gui/launcher.cpp:529 gui/launcher.cpp:682
msgid "Select directory with game data"
msgstr "Välj katalog med speldata"
-#: gui/launcher.cpp:541
+#: gui/launcher.cpp:547
msgid "Select additional game directory"
msgstr "Välj en ytterligare spelkatalog"
-#: gui/launcher.cpp:553
+#: gui/launcher.cpp:559
msgid "Select directory for saved games"
msgstr "Välj katalog för spardata"
-#: gui/launcher.cpp:580
+#: gui/launcher.cpp:586
msgid "This game ID is already taken. Please choose another one."
msgstr "Detta ID-namn är upptaget. Var god välj ett annat."
-#: gui/launcher.cpp:621 engines/dialogs.cpp:110
+#: gui/launcher.cpp:626 engines/dialogs.cpp:111
msgid "~Q~uit"
msgstr "~A~vsluta"
-#: gui/launcher.cpp:621 backends/platform/sdl/macosx/appmenu_osx.mm:95
+#: gui/launcher.cpp:626 backends/platform/sdl/macosx/appmenu_osx.mm:95
msgid "Quit ScummVM"
msgstr "Avsluta ScummVM"
-#: gui/launcher.cpp:622
+#: gui/launcher.cpp:627
msgid "A~b~out..."
msgstr "O~m~..."
-#: gui/launcher.cpp:622 backends/platform/sdl/macosx/appmenu_osx.mm:69
+#: gui/launcher.cpp:627 backends/platform/sdl/macosx/appmenu_osx.mm:69
msgid "About ScummVM"
msgstr "Om ScummVM"
-#: gui/launcher.cpp:623
+#: gui/launcher.cpp:628
msgid "~O~ptions..."
msgstr "~I~nställningar..."
-#: gui/launcher.cpp:623
+#: gui/launcher.cpp:628
msgid "Change global ScummVM options"
msgstr "Redigera globala ScummVM-inställningar"
-#: gui/launcher.cpp:625
+#: gui/launcher.cpp:630
msgid "~S~tart"
msgstr "~S~tarta"
-#: gui/launcher.cpp:625
+#: gui/launcher.cpp:630
msgid "Start selected game"
msgstr "Starta det valda spelet"
-#: gui/launcher.cpp:628
+#: gui/launcher.cpp:633
msgid "~L~oad..."
msgstr "~L~adda..."
-#: gui/launcher.cpp:628
+#: gui/launcher.cpp:633
msgid "Load savegame for selected game"
msgstr "Ladda spardata för det valda spelet"
-#: gui/launcher.cpp:633 gui/launcher.cpp:1120
+#: gui/launcher.cpp:638
msgid "~A~dd Game..."
msgstr "Lä~g~g till spel..."
-#: gui/launcher.cpp:633 gui/launcher.cpp:640
+#: gui/launcher.cpp:638 gui/launcher.cpp:645
msgid "Hold Shift for Mass Add"
msgstr "Håll ned Skift för masstillägg"
-#: gui/launcher.cpp:635
+#: gui/launcher.cpp:640
msgid "~E~dit Game..."
msgstr "R~e~digera spel..."
-#: gui/launcher.cpp:635 gui/launcher.cpp:642
+#: gui/launcher.cpp:640 gui/launcher.cpp:647
msgid "Change game options"
msgstr "Redigera spelinställningarna"
-#: gui/launcher.cpp:637
+#: gui/launcher.cpp:642
msgid "~R~emove Game"
msgstr "~R~adera spel"
-#: gui/launcher.cpp:637 gui/launcher.cpp:644
+#: gui/launcher.cpp:642 gui/launcher.cpp:649
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:640 gui/launcher.cpp:1120
+#: gui/launcher.cpp:645
msgctxt "lowres"
msgid "~A~dd Game..."
msgstr "Lä~g~g till spel..."
-#: gui/launcher.cpp:642
+#: gui/launcher.cpp:647
msgctxt "lowres"
msgid "~E~dit Game..."
msgstr "R~e~digera spel..."
-#: gui/launcher.cpp:644
+#: gui/launcher.cpp:649
msgctxt "lowres"
msgid "~R~emove Game"
msgstr "~R~adera spel"
-#: gui/launcher.cpp:652
+#: gui/launcher.cpp:657
msgid "Search in game list"
msgstr "Sök i spellistan"
-#: gui/launcher.cpp:656 gui/launcher.cpp:1167
+#: gui/launcher.cpp:661 gui/launcher.cpp:1222
msgid "Search:"
msgstr "Sök:"
-#: gui/launcher.cpp:680 engines/dialogs.cpp:114 engines/mohawk/myst.cpp:245
-#: engines/mohawk/riven.cpp:716 engines/cruise/menu.cpp:214
-#: engines/pegasus/pegasus.cpp:349
+#: gui/launcher.cpp:685 engines/dialogs.cpp:115 engines/cruise/menu.cpp:214
+#: engines/mohawk/myst.cpp:245 engines/mohawk/riven.cpp:718
+#: engines/pegasus/pegasus.cpp:353
msgid "Load game:"
msgstr "Ladda spel:"
-#: gui/launcher.cpp:680 engines/dialogs.cpp:114 engines/scumm/dialogs.cpp:188
-#: engines/mohawk/myst.cpp:245 engines/mohawk/riven.cpp:716
-#: engines/cruise/menu.cpp:214 engines/pegasus/pegasus.cpp:349
+#: gui/launcher.cpp:685 engines/dialogs.cpp:115
#: backends/platform/wince/CEActionsPocket.cpp:267
#: backends/platform/wince/CEActionsSmartphone.cpp:231
+#: engines/cruise/menu.cpp:214 engines/mohawk/myst.cpp:245
+#: engines/mohawk/riven.cpp:718 engines/pegasus/pegasus.cpp:353
+#: engines/scumm/dialogs.cpp:189
msgid "Load"
msgstr "Ladda"
-#: gui/launcher.cpp:788
+#: gui/launcher.cpp:792
msgid ""
"Do you really want to run the mass game detector? This could potentially add "
"a huge number of games."
@@ -474,7 +475,8 @@ msgstr ""
"Vill du verkligen använda mass-speldetektorn? Processen kan potentiellt "
"lägga till ett enormt antal spel."
-#: gui/launcher.cpp:789 gui/launcher.cpp:937 gui/fluidsynth-dialog.cpp:216
+#: gui/launcher.cpp:793 gui/launcher.cpp:941 gui/launcher.cpp:1000
+#: gui/fluidsynth-dialog.cpp:217
#: backends/events/symbiansdl/symbiansdl-events.cpp:184
#: backends/platform/wince/CEActionsPocket.cpp:326
#: backends/platform/wince/CEActionsSmartphone.cpp:287
@@ -482,7 +484,8 @@ msgstr ""
msgid "Yes"
msgstr "Ja"
-#: gui/launcher.cpp:789 gui/launcher.cpp:937 gui/fluidsynth-dialog.cpp:216
+#: gui/launcher.cpp:793 gui/launcher.cpp:941 gui/launcher.cpp:1000
+#: gui/fluidsynth-dialog.cpp:217
#: backends/events/symbiansdl/symbiansdl-events.cpp:184
#: backends/platform/wince/CEActionsPocket.cpp:326
#: backends/platform/wince/CEActionsSmartphone.cpp:287
@@ -490,190 +493,185 @@ msgstr "Ja"
msgid "No"
msgstr "Nej"
-#: gui/launcher.cpp:837
+#: gui/launcher.cpp:841
msgid "ScummVM couldn't open the specified directory!"
msgstr "ScummVM kunde inte öppna den valda katalogen!"
-#: gui/launcher.cpp:849
+#: gui/launcher.cpp:853
msgid "ScummVM could not find any game in the specified directory!"
msgstr "ScummVM kunde inte hitta några spel i den valda katalogen!"
-#: gui/launcher.cpp:863
+#: gui/launcher.cpp:867
msgid "Pick the game:"
msgstr "Välj spel:"
-#: gui/launcher.cpp:937
+#: gui/launcher.cpp:941
msgid "Do you really want to remove this game configuration?"
msgstr "Vill du verkligen radera den här spelkonfigurationen?"
-#: gui/launcher.cpp:1001
+#: gui/launcher.cpp:999
+#, fuzzy
+msgid "Do you want to load savegame?"
+msgstr "Vill du ladda eller spara spelet?"
+
+#: gui/launcher.cpp:1048
msgid "This game does not support loading games from the launcher."
msgstr "Det här spelet stöder inte laddning av spardata från launchern."
-#: gui/launcher.cpp:1005
+#: gui/launcher.cpp:1052
msgid "ScummVM could not find any engine capable of running the selected game!"
msgstr ""
"ScummVM kunde inte hitta en motor kapabel till att köra det valda spelet!"
-#: gui/launcher.cpp:1119
-msgctxt "lowres"
-msgid "Mass Add..."
-msgstr "Masstillägg..."
-
-#: gui/launcher.cpp:1119
-msgid "Mass Add..."
-msgstr "Masstillägg..."
-
-#: gui/massadd.cpp:78 gui/massadd.cpp:81
+#: gui/massadd.cpp:79 gui/massadd.cpp:82
msgid "... progress ..."
msgstr "... progression ..."
-#: gui/massadd.cpp:258
+#: gui/massadd.cpp:259
msgid "Scan complete!"
msgstr "Scanning färdig!"
-#: gui/massadd.cpp:261
+#: gui/massadd.cpp:262
#, c-format
msgid "Discovered %d new games, ignored %d previously added games."
msgstr "Upptäckte %d nya spel. Ignorerade %d tidigare tillagda spel."
-#: gui/massadd.cpp:265
+#: gui/massadd.cpp:266
#, c-format
msgid "Scanned %d directories ..."
msgstr "Kataloger scannade: %d ..."
-#: gui/massadd.cpp:268
+#: gui/massadd.cpp:269
#, c-format
msgid "Discovered %d new games, ignored %d previously added games ..."
msgstr "Upptäckte %d nya spel, ignorerade %d tidigare tillagda spel ..."
-#: gui/options.cpp:84
+#: gui/options.cpp:85
msgid "Never"
msgstr "Aldrig"
-#: gui/options.cpp:84
+#: gui/options.cpp:85
msgid "every 5 mins"
msgstr "var 5:e minut"
-#: gui/options.cpp:84
+#: gui/options.cpp:85
msgid "every 10 mins"
msgstr "var 10:e minut"
-#: gui/options.cpp:84
+#: gui/options.cpp:85
msgid "every 15 mins"
msgstr "var 15:e minut"
-#: gui/options.cpp:84
+#: gui/options.cpp:85
msgid "every 30 mins"
msgstr "var 30:e minut"
-#: gui/options.cpp:86
+#: gui/options.cpp:87
msgid "8 kHz"
msgstr "8 kHz"
-#: gui/options.cpp:86
+#: gui/options.cpp:87
msgid "11kHz"
msgstr "11 kHz"
-#: gui/options.cpp:86
+#: gui/options.cpp:87
msgid "22 kHz"
msgstr "22 kHz"
-#: gui/options.cpp:86
+#: gui/options.cpp:87
msgid "44 kHz"
msgstr "44 kHz"
-#: gui/options.cpp:86
+#: gui/options.cpp:87
msgid "48 kHz"
msgstr "48 kHz"
-#: gui/options.cpp:254 gui/options.cpp:480 gui/options.cpp:581
-#: gui/options.cpp:650 gui/options.cpp:858
+#: gui/options.cpp:255 gui/options.cpp:481 gui/options.cpp:582
+#: gui/options.cpp:651 gui/options.cpp:859
msgctxt "soundfont"
msgid "None"
msgstr "Ingen"
-#: gui/options.cpp:388
+#: gui/options.cpp:389
msgid "Failed to apply some of the graphic options changes:"
msgstr "Kunde inte verkställa några av grafikinställningarna:"
-#: gui/options.cpp:400
+#: gui/options.cpp:401
msgid "the video mode could not be changed."
msgstr "videoläget kunde inte ändras."
-#: gui/options.cpp:406
+#: gui/options.cpp:407
msgid "the fullscreen setting could not be changed"
msgstr "fullskärmsinställningen kunde inte ändras."
-#: gui/options.cpp:412
+#: gui/options.cpp:413
msgid "the aspect ratio setting could not be changed"
msgstr "inställningen för bildförhållandet kunde inte ändras."
-#: gui/options.cpp:733
+#: gui/options.cpp:734
msgid "Graphics mode:"
msgstr "Grafikläge:"
-#: gui/options.cpp:747
+#: gui/options.cpp:748
msgid "Render mode:"
msgstr "Renderingsläge:"
-#: gui/options.cpp:747 gui/options.cpp:748
+#: gui/options.cpp:748 gui/options.cpp:749
msgid "Special dithering modes supported by some games"
msgstr "Speciella gitterlägen stödda av vissa spel"
-#: gui/options.cpp:759
-#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2236
-#: backends/graphics/openglsdl/openglsdl-graphics.cpp:476
+#: gui/options.cpp:760
+#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2249
msgid "Fullscreen mode"
msgstr "Fullskärmsläge"
-#: gui/options.cpp:762
+#: gui/options.cpp:763
msgid "Aspect ratio correction"
msgstr "Korrektion av bildförhållande"
-#: gui/options.cpp:762
+#: gui/options.cpp:763
msgid "Correct aspect ratio for 320x200 games"
msgstr "Korrigerar bildförhållanden för 320x200-spel"
-#: gui/options.cpp:770
+#: gui/options.cpp:771
msgid "Preferred Device:"
msgstr "Föredragen enhet:"
-#: gui/options.cpp:770
+#: gui/options.cpp:771
msgid "Music Device:"
msgstr "Musikenhet:"
-#: gui/options.cpp:770 gui/options.cpp:772
+#: gui/options.cpp:771 gui/options.cpp:773
msgid "Specifies preferred sound device or sound card emulator"
msgstr "Bestämmer din föredragna emulator för ljudenhet eller ljudkort"
-#: gui/options.cpp:770 gui/options.cpp:772 gui/options.cpp:773
+#: gui/options.cpp:771 gui/options.cpp:773 gui/options.cpp:774
msgid "Specifies output sound device or sound card emulator"
msgstr "Bestämmer emulator för ljudenhet eller ljudkort"
-#: gui/options.cpp:772
+#: gui/options.cpp:773
msgctxt "lowres"
msgid "Preferred Dev.:"
msgstr "Föredr. enhet:"
-#: gui/options.cpp:772
+#: gui/options.cpp:773
msgctxt "lowres"
msgid "Music Device:"
msgstr "Musikenhet:"
-#: gui/options.cpp:799
+#: gui/options.cpp:800
msgid "AdLib emulator:"
msgstr "AdLib-emulator:"
-#: gui/options.cpp:799 gui/options.cpp:800
+#: gui/options.cpp:800 gui/options.cpp:801
msgid "AdLib is used for music in many games"
msgstr "AdLib används för musik i många spel"
-#: gui/options.cpp:810
+#: gui/options.cpp:811
msgid "Output rate:"
msgstr "Ljudfrekvens:"
-#: gui/options.cpp:810 gui/options.cpp:811
+#: gui/options.cpp:811 gui/options.cpp:812
msgid ""
"Higher value specifies better sound quality but may be not supported by your "
"soundcard"
@@ -681,65 +679,65 @@ msgstr ""
"Ett högre värde betecknar bättre ljudkvalitet men stöds kanske inte av ditt "
"ljudkort"
-#: gui/options.cpp:821
+#: gui/options.cpp:822
msgid "GM Device:"
msgstr "GM-enhet:"
-#: gui/options.cpp:821
+#: gui/options.cpp:822
msgid "Specifies default sound device for General MIDI output"
msgstr "Bestämmer standardenheten för General MIDI-uppspelning"
-#: gui/options.cpp:832
+#: gui/options.cpp:833
msgid "Don't use General MIDI music"
msgstr "Använd inte General MIDI-musik"
-#: gui/options.cpp:843 gui/options.cpp:909
+#: gui/options.cpp:844 gui/options.cpp:910
msgid "Use first available device"
msgstr "Använd första tillgängliga enhet"
-#: gui/options.cpp:855
+#: gui/options.cpp:856
msgid "SoundFont:"
msgstr "SoundFont:"
-#: gui/options.cpp:855 gui/options.cpp:857 gui/options.cpp:858
+#: gui/options.cpp:856 gui/options.cpp:858 gui/options.cpp:859
msgid "SoundFont is supported by some audio cards, Fluidsynth and Timidity"
msgstr "SoundFont stöds endast av vissa ljudkort, Fluidsynth och Timidity"
-#: gui/options.cpp:857
+#: gui/options.cpp:858
msgctxt "lowres"
msgid "SoundFont:"
msgstr "SoundFont:"
-#: gui/options.cpp:863
+#: gui/options.cpp:864
msgid "Mixed AdLib/MIDI mode"
msgstr "Blandat AdLib/MIDI-läge"
-#: gui/options.cpp:863
+#: gui/options.cpp:864
msgid "Use both MIDI and AdLib sound generation"
msgstr "Använd både MIDI och AdLib för ljudgeneration"
-#: gui/options.cpp:866
+#: gui/options.cpp:867
msgid "MIDI gain:"
msgstr "MIDI gain:"
-#: gui/options.cpp:873
+#: gui/options.cpp:874
msgid "FluidSynth Settings"
msgstr "FluidSynth inställningar"
-#: gui/options.cpp:880
+#: gui/options.cpp:881
msgid "MT-32 Device:"
msgstr "MT-32 enhet:"
-#: gui/options.cpp:880
+#: gui/options.cpp:881
msgid "Specifies default sound device for Roland MT-32/LAPC1/CM32l/CM64 output"
msgstr ""
"Bestämmer standardenheten för Roland MT-32/LAPC1/CM32I/CM64-uppspelning"
-#: gui/options.cpp:885
+#: gui/options.cpp:886
msgid "True Roland MT-32 (disable GM emulation)"
msgstr "Äkta Roland MT-32 (inaktivera GM-emulation)"
-#: gui/options.cpp:885 gui/options.cpp:887
+#: gui/options.cpp:886 gui/options.cpp:888
msgid ""
"Check if you want to use your real hardware Roland-compatible sound device "
"connected to your computer"
@@ -747,193 +745,195 @@ msgstr ""
"Aktivera om du vill använda din verkliga Roland-kompatibla och dator-"
"anslutna ljudenhet"
-#: gui/options.cpp:887
+#: gui/options.cpp:888
msgctxt "lowres"
msgid "True Roland MT-32 (no GM emulation)"
msgstr "Äkta Roland MT-32 (ingen GM-emulation)"
-#: gui/options.cpp:890
-msgid "Roland GS Mode (disable GM mapping)"
+#: gui/options.cpp:891
+#, fuzzy
+msgid "Roland GS Device (enable MT-32 mappings)"
msgstr "Roland GS-läge (avaktivera GM-mapping)"
-#: gui/options.cpp:890
-msgid "Turns off General MIDI mapping for games with Roland MT-32 soundtrack"
+#: gui/options.cpp:891
+msgid ""
+"Check if you want to enable patch mappings to emulate an MT-32 on a Roland "
+"GS device"
msgstr ""
-"Stänger av General MIDI-kartläggning för spel med Roland MT-32 soundtrack"
-#: gui/options.cpp:899
+#: gui/options.cpp:900
msgid "Don't use Roland MT-32 music"
msgstr "Använd inte Roland MT-32 musik"
-#: gui/options.cpp:926
+#: gui/options.cpp:927
msgid "Text and Speech:"
msgstr "Undertext och tal:"
-#: gui/options.cpp:930 gui/options.cpp:940
+#: gui/options.cpp:931 gui/options.cpp:941
msgid "Speech"
msgstr "Tal"
-#: gui/options.cpp:931 gui/options.cpp:941
+#: gui/options.cpp:932 gui/options.cpp:942
msgid "Subtitles"
msgstr "Undertexter"
-#: gui/options.cpp:932
+#: gui/options.cpp:933
msgid "Both"
msgstr "Båda"
-#: gui/options.cpp:934
+#: gui/options.cpp:935
msgid "Subtitle speed:"
msgstr "Texthastighet:"
-#: gui/options.cpp:936
+#: gui/options.cpp:937
msgctxt "lowres"
msgid "Text and Speech:"
msgstr "Text och tal:"
-#: gui/options.cpp:940
+#: gui/options.cpp:941
msgid "Spch"
msgstr "Tal"
-#: gui/options.cpp:941
+#: gui/options.cpp:942
msgid "Subs"
msgstr "Text"
-#: gui/options.cpp:942
+#: gui/options.cpp:943
msgctxt "lowres"
msgid "Both"
msgstr "Båda"
-#: gui/options.cpp:942
+#: gui/options.cpp:943
msgid "Show subtitles and play speech"
msgstr "Visa undertexter och spela upp tal"
-#: gui/options.cpp:944
+#: gui/options.cpp:945
msgctxt "lowres"
msgid "Subtitle speed:"
msgstr "Texthastighet:"
-#: gui/options.cpp:960
+#: gui/options.cpp:961
msgid "Music volume:"
msgstr "Musikvolym:"
-#: gui/options.cpp:962
+#: gui/options.cpp:963
msgctxt "lowres"
msgid "Music volume:"
msgstr "Musikvolym:"
-#: gui/options.cpp:969
+#: gui/options.cpp:970
msgid "Mute All"
msgstr "Ljud av"
-#: gui/options.cpp:972
+#: gui/options.cpp:973
msgid "SFX volume:"
msgstr "SFX-volym:"
-#: gui/options.cpp:972 gui/options.cpp:974 gui/options.cpp:975
+#: gui/options.cpp:973 gui/options.cpp:975 gui/options.cpp:976
msgid "Special sound effects volume"
msgstr "Volym för specialeffekter"
-#: gui/options.cpp:974
+#: gui/options.cpp:975
msgctxt "lowres"
msgid "SFX volume:"
msgstr "SFX-volym:"
-#: gui/options.cpp:982
+#: gui/options.cpp:983
msgid "Speech volume:"
msgstr "Talvolym:"
-#: gui/options.cpp:984
+#: gui/options.cpp:985
msgctxt "lowres"
msgid "Speech volume:"
msgstr "Talvolym:"
-#: gui/options.cpp:1141
+#: gui/options.cpp:1142
msgid "Theme Path:"
msgstr "Sökv. tema:"
-#: gui/options.cpp:1143
+#: gui/options.cpp:1144
msgctxt "lowres"
msgid "Theme Path:"
msgstr "Sökv. tema:"
-#: gui/options.cpp:1149 gui/options.cpp:1151 gui/options.cpp:1152
+#: gui/options.cpp:1150 gui/options.cpp:1152 gui/options.cpp:1153
msgid "Specifies path to additional data used by all games or ScummVM"
msgstr ""
"Bestämmer sökväg till andra data som används av alla spel eller ScummVM"
-#: gui/options.cpp:1158
+#: gui/options.cpp:1159
msgid "Plugins Path:"
msgstr "Sökv. tillägg:"
-#: gui/options.cpp:1160
+#: gui/options.cpp:1161
msgctxt "lowres"
msgid "Plugins Path:"
msgstr "Sökv. tillägg:"
-#: gui/options.cpp:1169 gui/fluidsynth-dialog.cpp:137
+#: gui/options.cpp:1170 gui/fluidsynth-dialog.cpp:138
msgid "Misc"
msgstr "Diverse"
-#: gui/options.cpp:1171
+#: gui/options.cpp:1172
msgctxt "lowres"
msgid "Misc"
msgstr "Diverse"
-#: gui/options.cpp:1173
+#: gui/options.cpp:1174
msgid "Theme:"
msgstr "Tema:"
-#: gui/options.cpp:1177
+#: gui/options.cpp:1178
msgid "GUI Renderer:"
msgstr "GUI-rendering:"
-#: gui/options.cpp:1189
+#: gui/options.cpp:1190
msgid "Autosave:"
msgstr "Autospara:"
-#: gui/options.cpp:1191
+#: gui/options.cpp:1192
msgctxt "lowres"
msgid "Autosave:"
msgstr "Autospara:"
-#: gui/options.cpp:1199
+#: gui/options.cpp:1200
msgid "Keys"
msgstr "Tangenter"
-#: gui/options.cpp:1206
+#: gui/options.cpp:1207
msgid "GUI Language:"
msgstr "GUI-språk:"
-#: gui/options.cpp:1206
+#: gui/options.cpp:1207
msgid "Language of ScummVM GUI"
msgstr "Språk för ScummVM:s användargränssnitt"
-#: gui/options.cpp:1365
+#: gui/options.cpp:1366
msgid "You have to restart ScummVM before your changes will take effect."
msgstr "Du måste starta om ScummVM för att ändringarna ska få effekt."
-#: gui/options.cpp:1378
+#: gui/options.cpp:1379
msgid "Select directory for savegames"
msgstr "Välj katalog för spardata"
-#: gui/options.cpp:1385
+#: gui/options.cpp:1386
msgid "The chosen directory cannot be written to. Please select another one."
msgstr ""
"Det går inte att skriva till den valda katalogen. Var god välj en annan."
-#: gui/options.cpp:1394
+#: gui/options.cpp:1395
msgid "Select directory for GUI themes"
msgstr "Välj katalog för GUI-teman"
-#: gui/options.cpp:1404
+#: gui/options.cpp:1405
msgid "Select directory for extra files"
msgstr "Välj katalog för extra filer"
-#: gui/options.cpp:1415
+#: gui/options.cpp:1416
msgid "Select directory for plugins"
msgstr "Välj katalog för tillägg"
-#: gui/options.cpp:1468
+#: gui/options.cpp:1469
msgid ""
"The theme you selected does not support your current language. If you want "
"to use this theme you need to switch to another language first."
@@ -941,225 +941,228 @@ msgstr ""
"Temat du valde stöder inte ditt språk. Om du vill använda det här temat "
"måste först byta till ett annat språk."
-#: gui/saveload-dialog.cpp:166
+#: gui/saveload-dialog.cpp:167
msgid "List view"
msgstr "Visa som lista"
-#: gui/saveload-dialog.cpp:167
+#: gui/saveload-dialog.cpp:168
msgid "Grid view"
msgstr "Visa som rutnät"
-#: gui/saveload-dialog.cpp:210 gui/saveload-dialog.cpp:358
+#: gui/saveload-dialog.cpp:211 gui/saveload-dialog.cpp:360
msgid "No date saved"
msgstr "Inget datum sparat"
-#: gui/saveload-dialog.cpp:211 gui/saveload-dialog.cpp:359
+#: gui/saveload-dialog.cpp:212 gui/saveload-dialog.cpp:361
msgid "No time saved"
msgstr "Ingen tid sparad"
-#: gui/saveload-dialog.cpp:212 gui/saveload-dialog.cpp:360
+#: gui/saveload-dialog.cpp:213 gui/saveload-dialog.cpp:362
msgid "No playtime saved"
msgstr "Ingen speltid sparad"
-#: gui/saveload-dialog.cpp:219 gui/saveload-dialog.cpp:275
+#: gui/saveload-dialog.cpp:220 gui/saveload-dialog.cpp:276
msgid "Delete"
msgstr "Radera"
-#: gui/saveload-dialog.cpp:274
+#: gui/saveload-dialog.cpp:275
msgid "Do you really want to delete this savegame?"
msgstr "Vill du verkligen radera den här spardatan?"
-#: gui/saveload-dialog.cpp:383 gui/saveload-dialog.cpp:872
+#: gui/saveload-dialog.cpp:385 gui/saveload-dialog.cpp:875
msgid "Date: "
msgstr "Datum:"
-#: gui/saveload-dialog.cpp:387 gui/saveload-dialog.cpp:878
+#: gui/saveload-dialog.cpp:389 gui/saveload-dialog.cpp:881
msgid "Time: "
msgstr "Tid:"
-#: gui/saveload-dialog.cpp:393 gui/saveload-dialog.cpp:886
+#: gui/saveload-dialog.cpp:395 gui/saveload-dialog.cpp:889
msgid "Playtime: "
msgstr "Speltid:"
-#: gui/saveload-dialog.cpp:406 gui/saveload-dialog.cpp:494
+#: gui/saveload-dialog.cpp:408 gui/saveload-dialog.cpp:496
msgid "Untitled savestate"
msgstr "Namnlös spardata"
-#: gui/saveload-dialog.cpp:546
+#: gui/saveload-dialog.cpp:548
msgid "Next"
msgstr "Nästa"
-#: gui/saveload-dialog.cpp:549
+#: gui/saveload-dialog.cpp:551
msgid "Prev"
msgstr "Bakåt"
-#: gui/saveload-dialog.cpp:736
+#: gui/saveload-dialog.cpp:739
msgid "New Save"
msgstr "Ny sparning"
-#: gui/saveload-dialog.cpp:736
+#: gui/saveload-dialog.cpp:739
msgid "Create a new save game"
msgstr "Skapa ett nytt sparat spel"
-#: gui/saveload-dialog.cpp:865
+#: gui/saveload-dialog.cpp:868
msgid "Name: "
msgstr "Namn:"
-#: gui/saveload-dialog.cpp:937
+#: gui/saveload-dialog.cpp:940
#, c-format
msgid "Enter a description for slot %d:"
msgstr "Ange en beskrivning för position %d:"
-#: gui/themebrowser.cpp:44
+#: gui/themebrowser.cpp:45
msgid "Select a Theme"
msgstr "Välj ett tema"
-#: gui/ThemeEngine.cpp:337
+#: gui/ThemeEngine.cpp:347
msgid "Disabled GFX"
msgstr "Inaktiverad GFX"
-#: gui/ThemeEngine.cpp:337
+#: gui/ThemeEngine.cpp:347
msgctxt "lowres"
msgid "Disabled GFX"
msgstr "Inaktiverad GFX"
-#: gui/ThemeEngine.cpp:338
-msgid "Standard Renderer (16bpp)"
+#: gui/ThemeEngine.cpp:348
+#, fuzzy
+msgid "Standard Renderer"
msgstr "Standard rendering (16 bpp)"
-#: gui/ThemeEngine.cpp:338
-msgid "Standard (16bpp)"
-msgstr "Standard (16 bpp)"
+#: gui/ThemeEngine.cpp:348 engines/scumm/dialogs.cpp:659
+msgid "Standard"
+msgstr "Standard"
-#: gui/ThemeEngine.cpp:340
-msgid "Antialiased Renderer (16bpp)"
+#: gui/ThemeEngine.cpp:350
+#, fuzzy
+msgid "Antialiased Renderer"
msgstr "Antialiserad rendering (16 bpp)"
-#: gui/ThemeEngine.cpp:340
-msgid "Antialiased (16bpp)"
+#: gui/ThemeEngine.cpp:350
+#, fuzzy
+msgid "Antialiased"
msgstr "Antialiserad (16 bpp)"
-#: gui/widget.cpp:322 gui/widget.cpp:324 gui/widget.cpp:330 gui/widget.cpp:332
+#: gui/widget.cpp:323 gui/widget.cpp:325 gui/widget.cpp:331 gui/widget.cpp:333
msgid "Clear value"
msgstr "Töm sökfältet"
-#: gui/fluidsynth-dialog.cpp:67
+#: gui/fluidsynth-dialog.cpp:68
msgid "Reverb"
msgstr "Reverb"
-#: gui/fluidsynth-dialog.cpp:69 gui/fluidsynth-dialog.cpp:101
+#: gui/fluidsynth-dialog.cpp:70 gui/fluidsynth-dialog.cpp:102
msgid "Active"
msgstr "Aktiv"
-#: gui/fluidsynth-dialog.cpp:71
+#: gui/fluidsynth-dialog.cpp:72
msgid "Room:"
msgstr "Rum:"
-#: gui/fluidsynth-dialog.cpp:78
+#: gui/fluidsynth-dialog.cpp:79
msgid "Damp:"
msgstr "Dämpa:"
-#: gui/fluidsynth-dialog.cpp:85
+#: gui/fluidsynth-dialog.cpp:86
msgid "Width:"
msgstr "Bredd:"
-#: gui/fluidsynth-dialog.cpp:92 gui/fluidsynth-dialog.cpp:110
+#: gui/fluidsynth-dialog.cpp:93 gui/fluidsynth-dialog.cpp:111
msgid "Level:"
msgstr "Nivå:"
-#: gui/fluidsynth-dialog.cpp:99
+#: gui/fluidsynth-dialog.cpp:100
msgid "Chorus"
msgstr "Chorus"
-#: gui/fluidsynth-dialog.cpp:103
+#: gui/fluidsynth-dialog.cpp:104
msgid "N:"
msgstr "N:"
-#: gui/fluidsynth-dialog.cpp:117
+#: gui/fluidsynth-dialog.cpp:118
msgid "Speed:"
msgstr "Hastighet:"
-#: gui/fluidsynth-dialog.cpp:124
+#: gui/fluidsynth-dialog.cpp:125
msgid "Depth:"
msgstr "Djup:"
-#: gui/fluidsynth-dialog.cpp:131
+#: gui/fluidsynth-dialog.cpp:132
msgid "Type:"
msgstr "Typ:"
-#: gui/fluidsynth-dialog.cpp:134
+#: gui/fluidsynth-dialog.cpp:135
msgid "Sine"
msgstr "Sinus"
-#: gui/fluidsynth-dialog.cpp:135
+#: gui/fluidsynth-dialog.cpp:136
msgid "Triangle"
msgstr "Triangel"
-#: gui/fluidsynth-dialog.cpp:139
+#: gui/fluidsynth-dialog.cpp:140
msgid "Interpolation:"
msgstr "Interpolering:"
-#: gui/fluidsynth-dialog.cpp:142
+#: gui/fluidsynth-dialog.cpp:143
msgid "None (fastest)"
msgstr "Ingen (snabbast)"
-#: gui/fluidsynth-dialog.cpp:143
+#: gui/fluidsynth-dialog.cpp:144
msgid "Linear"
msgstr "Linjär"
-#: gui/fluidsynth-dialog.cpp:144
+#: gui/fluidsynth-dialog.cpp:145
msgid "Fourth-order"
msgstr "Fjärde ordningen"
-#: gui/fluidsynth-dialog.cpp:145
+#: gui/fluidsynth-dialog.cpp:146
msgid "Seventh-order"
msgstr "Sjunde ordningen"
-#: gui/fluidsynth-dialog.cpp:149
+#: gui/fluidsynth-dialog.cpp:150
msgid "Reset"
msgstr "Återställ"
-#: gui/fluidsynth-dialog.cpp:149
+#: gui/fluidsynth-dialog.cpp:150
msgid "Reset all FluidSynth settings to their default values."
msgstr ""
"Återställ alla FluidSynth-inställningar till deras ursprungliga värden."
-#: gui/fluidsynth-dialog.cpp:216
+#: gui/fluidsynth-dialog.cpp:217
msgid ""
"Do you really want to reset all FluidSynth settings to their default values?"
msgstr ""
"Vill du verkligen återställa alla FluidSynth-inställningar till deras "
"ursprungliga värden?"
-#: base/main.cpp:210
+#: base/main.cpp:228
#, c-format
msgid "Engine does not support debug level '%s'"
msgstr "Motorn stöder inte debug-nivå '%s'"
-#: base/main.cpp:288
+#: base/main.cpp:306
msgid "Menu"
msgstr "Meny"
-#: base/main.cpp:291 backends/platform/symbian/src/SymbianActions.cpp:45
+#: base/main.cpp:309 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:294 backends/platform/symbian/src/SymbianActions.cpp:50
+#: base/main.cpp:312 backends/platform/symbian/src/SymbianActions.cpp:50
#: backends/platform/wince/CEActionsPocket.cpp:42
msgid "Pause"
msgstr "Paus"
-#: base/main.cpp:297
+#: base/main.cpp:315
msgid "Skip line"
msgstr "Skippa rad"
-#: base/main.cpp:468
+#: base/main.cpp:507
msgid "Error running game:"
msgstr "Fel under körning av spel:"
-#: base/main.cpp:492
+#: base/main.cpp:536
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"
@@ -1227,73 +1230,73 @@ msgstr "Avbrutit av användaren"
msgid "Unknown error"
msgstr "Okänt fel"
-#: engines/advancedDetector.cpp:316
+#: engines/advancedDetector.cpp:317
#, c-format
msgid "The game in '%s' seems to be unknown."
msgstr "Spelet i '%s' verkar vara okänt."
-#: engines/advancedDetector.cpp:317
+#: engines/advancedDetector.cpp:318
msgid "Please, report the following data to the ScummVM team along with name"
msgstr ""
"Var god rapportera följande data till ScummVM-teamet tillsammans med namnet"
-#: engines/advancedDetector.cpp:319
+#: engines/advancedDetector.cpp:320
msgid "of the game you tried to add and its version/language/etc.:"
msgstr "på spelet du försökte lägga till och dess version/språk/etc.:"
-#: engines/dialogs.cpp:84
+#: engines/dialogs.cpp:85
msgid "~R~esume"
msgstr "~F~ortsätt"
-#: engines/dialogs.cpp:86
+#: engines/dialogs.cpp:87
msgid "~L~oad"
msgstr "~L~adda"
-#: engines/dialogs.cpp:90
+#: engines/dialogs.cpp:91
msgid "~S~ave"
msgstr "~S~para"
-#: engines/dialogs.cpp:94
+#: engines/dialogs.cpp:95
msgid "~O~ptions"
msgstr "~I~nställningar"
-#: engines/dialogs.cpp:99
+#: engines/dialogs.cpp:100
msgid "~H~elp"
msgstr "~H~jälp"
-#: engines/dialogs.cpp:101
+#: engines/dialogs.cpp:102
msgid "~A~bout"
msgstr "O~m~..."
-#: engines/dialogs.cpp:104 engines/dialogs.cpp:180
+#: engines/dialogs.cpp:105 engines/dialogs.cpp:181
msgid "~R~eturn to Launcher"
msgstr "Åte~r~vänd till launcher"
-#: engines/dialogs.cpp:106 engines/dialogs.cpp:182
+#: engines/dialogs.cpp:107 engines/dialogs.cpp:183
msgctxt "lowres"
msgid "~R~eturn to Launcher"
msgstr "Åte~r~vänd till launcher"
-#: engines/dialogs.cpp:115 engines/agi/saveload.cpp:803
-#: engines/drascula/saveload.cpp:338 engines/cruise/menu.cpp:212
-#: engines/sci/engine/kfile.cpp:742 engines/toltecs/menu.cpp:284
-#: engines/pegasus/pegasus.cpp:373
+#: engines/dialogs.cpp:116 engines/agi/saveload.cpp:803
+#: engines/cruise/menu.cpp:212 engines/drascula/saveload.cpp:336
+#: engines/neverhood/menumodule.cpp:873 engines/pegasus/pegasus.cpp:377
+#: engines/sci/engine/kfile.cpp:758 engines/toltecs/menu.cpp:281
msgid "Save game:"
msgstr "Spara spelet:"
-#: engines/dialogs.cpp:115 engines/agi/saveload.cpp:803
-#: engines/drascula/saveload.cpp:338 engines/scumm/dialogs.cpp:187
-#: engines/cruise/menu.cpp:212 engines/sci/engine/kfile.cpp:742
-#: engines/toltecs/menu.cpp:284 engines/pegasus/pegasus.cpp:373
-#: backends/platform/symbian/src/SymbianActions.cpp:44
+#: engines/dialogs.cpp:116 backends/platform/symbian/src/SymbianActions.cpp:44
#: backends/platform/wince/CEActionsPocket.cpp:43
#: backends/platform/wince/CEActionsPocket.cpp:267
#: backends/platform/wince/CEActionsSmartphone.cpp:45
#: backends/platform/wince/CEActionsSmartphone.cpp:231
+#: engines/agi/saveload.cpp:803 engines/cruise/menu.cpp:212
+#: engines/drascula/saveload.cpp:336 engines/neverhood/menumodule.cpp:873
+#: engines/pegasus/pegasus.cpp:377 engines/sci/engine/kfile.cpp:758
+#: engines/scumm/dialogs.cpp:188 engines/toltecs/menu.cpp:281
msgid "Save"
msgstr "Spara"
-#: engines/dialogs.cpp:144
+#: engines/dialogs.cpp:145
msgid ""
"Sorry, this engine does not currently provide in-game help. Please consult "
"the README for basic information, and for instructions on how to obtain "
@@ -1303,7 +1306,7 @@ msgstr ""
"hänvisa till README-filen för information och instruktioner för att få "
"ytterligare assistens."
-#: engines/dialogs.cpp:228
+#: engines/dialogs.cpp:234 engines/pegasus/pegasus.cpp:393
#, c-format
msgid ""
"Gamestate save failed (%s)! Please consult the README for basic information, "
@@ -1312,37 +1315,37 @@ msgstr ""
"Kunde inte spara data (%s)! Var god läs README-filen för grundläggande "
"information och instruktioner för hur du kan få mer hjälp."
-#: engines/dialogs.cpp:301 engines/mohawk/dialogs.cpp:109
+#: engines/dialogs.cpp:307 engines/mohawk/dialogs.cpp:109
#: engines/mohawk/dialogs.cpp:170
msgid "~O~K"
msgstr "~O~K"
-#: engines/dialogs.cpp:302 engines/mohawk/dialogs.cpp:110
+#: engines/dialogs.cpp:308 engines/mohawk/dialogs.cpp:110
#: engines/mohawk/dialogs.cpp:171
msgid "~C~ancel"
msgstr "A~v~bryt"
-#: engines/dialogs.cpp:305
+#: engines/dialogs.cpp:311
msgid "~K~eys"
msgstr "~T~angenter"
-#: engines/engine.cpp:240
+#: engines/engine.cpp:245
msgid "Could not initialize color format."
msgstr "Kunde inte initialisera färgformat."
-#: engines/engine.cpp:248
+#: engines/engine.cpp:253
msgid "Could not switch to video mode: '"
msgstr "Kunde inte byta till videoläget: '"
-#: engines/engine.cpp:257
+#: engines/engine.cpp:262
msgid "Could not apply aspect ratio setting."
msgstr "Kunde inte ändra inställningen för bildförhållanden."
-#: engines/engine.cpp:262
+#: engines/engine.cpp:267
msgid "Could not apply fullscreen setting."
msgstr "Kunde inte applicera fullskärmsinställning."
-#: engines/engine.cpp:362
+#: engines/engine.cpp:367
msgid ""
"You appear to be playing this game directly\n"
"from the CD. This is known to cause problems,\n"
@@ -1356,7 +1359,7 @@ msgstr ""
"datafilerna till din hårddisk istället.\n"
"Se README-filen för detaljer."
-#: engines/engine.cpp:373
+#: engines/engine.cpp:378
msgid ""
"This game has audio tracks in its disk. These\n"
"tracks need to be ripped from the disk using\n"
@@ -1370,7 +1373,7 @@ msgstr ""
"för att kunna lyssna på spelets musik.\n"
"Se README-filen för detaljer."
-#: engines/engine.cpp:431
+#: engines/engine.cpp:436
#, c-format
msgid ""
"Gamestate load failed (%s)! Please consult the README for basic information, "
@@ -1379,7 +1382,7 @@ msgstr ""
"Kunde inte ladda spardata (%s)! Hänvisa till README-filen för grundläggande "
"information och instruktioner för ytterligare assistans."
-#: engines/engine.cpp:444
+#: engines/engine.cpp:449
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 "
@@ -1389,33 +1392,761 @@ msgstr ""
"ScummVM. Därför är det troligtvis instabilt och om du skapar spardata kan de "
"möjligtvis vara inkompatibla med framtida versioner av ScummVM."
-#: engines/engine.cpp:447
+#: engines/engine.cpp:452
msgid "Start anyway"
msgstr "Starta ändå"
-#: engines/agi/detection.cpp:142 engines/drascula/detection.cpp:270
-#: engines/dreamweb/detection.cpp:47 engines/sci/detection.cpp:393
-#: engines/toltecs/detection.cpp:173
+#: audio/fmopl.cpp:50
+msgid "MAME OPL emulator"
+msgstr "MAME OPL-emulator"
+
+#: audio/fmopl.cpp:52
+msgid "DOSBox OPL emulator"
+msgstr "DOSBox OPL-emulator"
+
+#: audio/mididrv.cpp:209
+#, c-format
+msgid ""
+"The selected audio device '%s' was not found (e.g. might be turned off or "
+"disconnected)."
+msgstr ""
+"Den valda ljudenheten '%s' kunde inte hittas (möjligtvis avstängd eller "
+"frånkopplad)."
+
+#: audio/mididrv.cpp:209 audio/mididrv.cpp:221 audio/mididrv.cpp:257
+#: audio/mididrv.cpp:272
+msgid "Attempting to fall back to the next available device..."
+msgstr "Försöker använda nästa tillgängliga ljudenhet..."
+
+#: audio/mididrv.cpp:221
+#, c-format
+msgid ""
+"The selected audio device '%s' cannot be used. See log file for more "
+"information."
+msgstr ""
+"Den valda ljudenheten '%s' kan inte användas. Se loggfilen för mer "
+"information."
+
+#: audio/mididrv.cpp:257
+#, c-format
+msgid ""
+"The preferred audio device '%s' was not found (e.g. might be turned off or "
+"disconnected)."
+msgstr ""
+"Den föredragna ljudenheten '%s' kunde inte hittas (möjligtvis avstängd eller "
+"frånkopplad)."
+
+#: audio/mididrv.cpp:272
+#, c-format
+msgid ""
+"The preferred audio device '%s' cannot be used. See log file for more "
+"information."
+msgstr ""
+"Den föredragna ljudenheten '%s' kan inte användas. Se loggfilen för mer "
+"information."
+
+#: audio/null.h:44
+msgid "No music"
+msgstr "Ingen musik"
+
+#: audio/mods/paula.cpp:196
+msgid "Amiga Audio Emulator"
+msgstr "Amiga ljudemulator"
+
+#: audio/softsynth/adlib.cpp:2285
+msgid "AdLib Emulator"
+msgstr "AdLib-emulator"
+
+#: audio/softsynth/appleiigs.cpp:33
+msgid "Apple II GS Emulator (NOT IMPLEMENTED)"
+msgstr "Apple II GS-emulator (INTE IMPLEMENTERAD)"
+
+#: audio/softsynth/sid.cpp:1430
+msgid "C64 Audio Emulator"
+msgstr "C64 ljudemulator"
+
+#: audio/softsynth/mt32.cpp:200
+msgid "Initializing MT-32 Emulator"
+msgstr "Initialiserar MT-32 emulator"
+
+#: audio/softsynth/mt32.cpp:426
+msgid "MT-32 Emulator"
+msgstr "MT-32 emulator"
+
+#: audio/softsynth/pcspk.cpp:139
+msgid "PC Speaker Emulator"
+msgstr "PC Speaker-emulator"
+
+#: audio/softsynth/pcspk.cpp:158
+msgid "IBM PCjr Emulator"
+msgstr "IBM PCjr-emulator"
+
+#: backends/keymapper/remap-dialog.cpp:48
+msgid "Keymap:"
+msgstr "Tangenter:"
+
+#: backends/keymapper/remap-dialog.cpp:67
+msgid " (Effective)"
+msgstr "(Effektiv)"
+
+#: backends/keymapper/remap-dialog.cpp:107
+msgid " (Active)"
+msgstr "(Aktiv)"
+
+#: backends/keymapper/remap-dialog.cpp:107
+msgid " (Blocked)"
+msgstr "(Blockerad)"
+
+#: backends/keymapper/remap-dialog.cpp:120
+msgid " (Global)"
+msgstr "(Global)"
+
+#: backends/keymapper/remap-dialog.cpp:128
+msgid " (Game)"
+msgstr "(Spel)"
+
+#: backends/midi/windows.cpp:165
+msgid "Windows MIDI"
+msgstr "Windows MIDI"
+
+#: backends/platform/ds/arm9/source/dsoptions.cpp:56
+#: engines/scumm/dialogs.cpp:291
+msgid "~C~lose"
+msgstr "~S~täng"
+
+#: backends/platform/ds/arm9/source/dsoptions.cpp:57
+msgid "ScummVM Main Menu"
+msgstr "ScummVM huvudmeny"
+
+#: backends/platform/ds/arm9/source/dsoptions.cpp:63
+msgid "~L~eft handed mode"
+msgstr "~V~änsterhänt läge"
+
+#: backends/platform/ds/arm9/source/dsoptions.cpp:64
+msgid "~I~ndy fight controls"
+msgstr "~I~ndy slagsmålskontroller"
+
+#: backends/platform/ds/arm9/source/dsoptions.cpp:65
+msgid "Show mouse cursor"
+msgstr "Visa muspekare"
+
+#: backends/platform/ds/arm9/source/dsoptions.cpp:66
+msgid "Snap to edges"
+msgstr "Lägg till kant"
+
+#: backends/platform/ds/arm9/source/dsoptions.cpp:68
+msgid "Touch X Offset"
+msgstr "Gå till X-position"
+
+#: backends/platform/ds/arm9/source/dsoptions.cpp:75
+msgid "Touch Y Offset"
+msgstr "Gå till Y-position"
+
+#: backends/platform/ds/arm9/source/dsoptions.cpp:87
+msgid "Use laptop trackpad-style cursor control"
+msgstr "Använd bärbar trackpad-stil för pekarkontroll"
+
+#: backends/platform/ds/arm9/source/dsoptions.cpp:88
+msgid "Tap for left click, double tap right click"
+msgstr "Tappa för vänsterklick, dubbel-tappa för högerklick"
+
+#: backends/platform/ds/arm9/source/dsoptions.cpp:90
+msgid "Sensitivity"
+msgstr "Känslighet"
+
+#: backends/platform/ds/arm9/source/dsoptions.cpp:99
+msgid "Initial top screen scale:"
+msgstr "Standardskala för övre skärm:"
+
+#: backends/platform/ds/arm9/source/dsoptions.cpp:105
+msgid "Main screen scaling:"
+msgstr "Skalning huvudskärm:"
+
+#: backends/platform/ds/arm9/source/dsoptions.cpp:107
+msgid "Hardware scale (fast, but low quality)"
+msgstr "Hårdvaruskalning (snabbt, men låg kvalitet)"
+
+#: backends/platform/ds/arm9/source/dsoptions.cpp:108
+msgid "Software scale (good quality, but slower)"
+msgstr "Mjukvaruskalning (bra kvalitet, men långsamt)"
+
+#: backends/platform/ds/arm9/source/dsoptions.cpp:109
+msgid "Unscaled (you must scroll left and right)"
+msgstr "Oskalat (du måste bläddra till vänster och höger)"
+
+#: backends/platform/ds/arm9/source/dsoptions.cpp:111
+msgid "Brightness:"
+msgstr "Ljusstyrka:"
+
+#: backends/platform/ds/arm9/source/dsoptions.cpp:121
+msgid "High quality audio (slower) (reboot)"
+msgstr "Hög ljudkvalitet (långsammare) (omstart)"
+
+#: backends/platform/ds/arm9/source/dsoptions.cpp:122
+msgid "Disable power off"
+msgstr "Inaktivera strömsparning"
+
+#: backends/platform/iphone/osys_events.cpp:300
+msgid "Mouse-click-and-drag mode enabled."
+msgstr "Dra-och-släpp-läge med mus aktiverat."
+
+#: backends/platform/iphone/osys_events.cpp:302
+msgid "Mouse-click-and-drag mode disabled."
+msgstr "Dra-och-släpp-läge med mus deaktiverat."
+
+#: backends/platform/iphone/osys_events.cpp:313
+msgid "Touchpad mode enabled."
+msgstr "Touchpad-läge aktiverat."
+
+#: backends/platform/iphone/osys_events.cpp:315
+msgid "Touchpad mode disabled."
+msgstr "Touchpad-läge inaktiverat."
+
+#: backends/platform/maemo/maemo.cpp:209
+msgid "Click Mode"
+msgstr "Klickläge"
+
+#: backends/platform/maemo/maemo.cpp:215
+#: backends/platform/symbian/src/SymbianActions.cpp:42
+#: backends/platform/wince/CEActionsPocket.cpp:60
+#: backends/platform/wince/CEActionsSmartphone.cpp:43
+#: backends/platform/tizen/form.cpp:275
+msgid "Left Click"
+msgstr "Vänsterklick"
+
+#: backends/platform/maemo/maemo.cpp:218
+msgid "Middle Click"
+msgstr "Mittenklick"
+
+#: backends/platform/maemo/maemo.cpp:221
+#: backends/platform/symbian/src/SymbianActions.cpp:43
+#: backends/platform/wince/CEActionsSmartphone.cpp:44
+#: backends/platform/tizen/form.cpp:267
+msgid "Right Click"
+msgstr "Högerklick"
+
+#: backends/platform/sdl/macosx/appmenu_osx.mm:77
+msgid "Hide ScummVM"
+msgstr "Göm ScummVM"
+
+#: backends/platform/sdl/macosx/appmenu_osx.mm:82
+msgid "Hide Others"
+msgstr "Göm övriga"
+
+#: backends/platform/sdl/macosx/appmenu_osx.mm:87
+msgid "Show All"
+msgstr "Visa alla"
+
+#: backends/platform/sdl/macosx/appmenu_osx.mm:109
+#: backends/platform/sdl/macosx/appmenu_osx.mm:120
+msgid "Window"
+msgstr "Fönster"
+
+#: backends/platform/sdl/macosx/appmenu_osx.mm:114
+msgid "Minimize"
+msgstr "Minimera"
+
+#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:46
+msgid "Normal (no scaling)"
+msgstr "Normalt (ingen skalning)"
+
+#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:65
+msgctxt "lowres"
+msgid "Normal (no scaling)"
+msgstr "Normalt (ingen skalning)"
+
+#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2148
+msgid "Enabled aspect ratio correction"
+msgstr "Korrektion av bildförhållande på"
+
+#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2154
+msgid "Disabled aspect ratio correction"
+msgstr "Korrektion av bildförhållande av"
+
+#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2209
+msgid "Active graphics filter:"
+msgstr "Aktivt grafikfilter:"
+
+#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2251
+msgid "Windowed mode"
+msgstr "Fönsterläge"
+
+#: backends/graphics/opengl/opengl-graphics.cpp:118
+#, fuzzy
+msgid "OpenGL"
+msgstr "Öppna"
+
+#: backends/graphics/opengl/opengl-graphics.cpp:119
+msgid "OpenGL (No filtering)"
+msgstr ""
+
+#: backends/platform/symbian/src/SymbianActions.cpp:38
+#: backends/platform/wince/CEActionsSmartphone.cpp:39
+msgid "Up"
+msgstr "Upp"
+
+#: backends/platform/symbian/src/SymbianActions.cpp:39
+#: backends/platform/wince/CEActionsSmartphone.cpp:40
+msgid "Down"
+msgstr "Ned"
+
+#: backends/platform/symbian/src/SymbianActions.cpp:40
+#: backends/platform/wince/CEActionsSmartphone.cpp:41
+msgid "Left"
+msgstr "Vänster"
+
+#: backends/platform/symbian/src/SymbianActions.cpp:41
+#: backends/platform/wince/CEActionsSmartphone.cpp:42
+msgid "Right"
+msgstr "Höger"
+
+#: backends/platform/symbian/src/SymbianActions.cpp:46
+#: backends/platform/wince/CEActionsSmartphone.cpp:47
+msgid "Zone"
+msgstr "Zon"
+
+#: backends/platform/symbian/src/SymbianActions.cpp:47
+#: backends/platform/wince/CEActionsPocket.cpp:54
+#: backends/platform/wince/CEActionsSmartphone.cpp:48
+msgid "Multi Function"
+msgstr "Multifunktion"
+
+#: backends/platform/symbian/src/SymbianActions.cpp:48
+msgid "Swap character"
+msgstr "Byt karaktär"
+
+#: backends/platform/symbian/src/SymbianActions.cpp:49
+msgid "Skip text"
+msgstr "Skippa text"
+
+#: backends/platform/symbian/src/SymbianActions.cpp:51
+msgid "Fast mode"
+msgstr "Snabbläge"
+
+#: 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:218
+#: engines/scumm/dialogs.cpp:192 engines/scumm/help.cpp:82
+#: engines/scumm/help.cpp:84
+msgid "Quit"
+msgstr "Avsluta"
+
+#: backends/platform/symbian/src/SymbianActions.cpp:53
+msgid "Debugger"
+msgstr "Debug-konsol"
+
+#: backends/platform/symbian/src/SymbianActions.cpp:54
+msgid "Global menu"
+msgstr "Global meny"
+
+#: backends/platform/symbian/src/SymbianActions.cpp:55
+msgid "Virtual keyboard"
+msgstr "Virtuellt tangentbord"
+
+#: backends/platform/symbian/src/SymbianActions.cpp:56
+msgid "Key mapper"
+msgstr "Tangentinst."
+
+#: backends/events/symbiansdl/symbiansdl-events.cpp:184
+msgid "Do you want to quit ?"
+msgstr "Vill du avsluta?"
+
+#: backends/platform/wii/options.cpp:51
+msgid "Video"
+msgstr "Video"
+
+#: backends/platform/wii/options.cpp:54
+msgid "Current video mode:"
+msgstr "Aktivt videoläge:"
+
+#: backends/platform/wii/options.cpp:56
+msgid "Double-strike"
+msgstr "Ej sammanflätad"
+
+#: backends/platform/wii/options.cpp:60
+msgid "Horizontal underscan:"
+msgstr "Vågrät underskanning:"
+
+#: backends/platform/wii/options.cpp:66
+msgid "Vertical underscan:"
+msgstr "Lodrät underskanning:"
+
+#: backends/platform/wii/options.cpp:71
+msgid "Input"
+msgstr "Ingång"
+
+#: backends/platform/wii/options.cpp:74
+msgid "GC Pad sensitivity:"
+msgstr "GC Pad känslighet:"
+
+#: backends/platform/wii/options.cpp:80
+msgid "GC Pad acceleration:"
+msgstr "GC Pad acceleration:"
+
+#: backends/platform/wii/options.cpp:86
+msgid "DVD"
+msgstr "DVD"
+
+#: backends/platform/wii/options.cpp:89 backends/platform/wii/options.cpp:101
+msgid "Status:"
+msgstr "Status:"
+
+#: backends/platform/wii/options.cpp:90 backends/platform/wii/options.cpp:102
+msgid "Unknown"
+msgstr "Okänd"
+
+#: backends/platform/wii/options.cpp:93
+msgid "Mount DVD"
+msgstr "Montera DVD"
+
+#: backends/platform/wii/options.cpp:94
+msgid "Unmount DVD"
+msgstr "Mata ut DVD"
+
+#: backends/platform/wii/options.cpp:98
+msgid "SMB"
+msgstr "SMB"
+
+#: backends/platform/wii/options.cpp:106
+msgid "Server:"
+msgstr "Server:"
+
+#: backends/platform/wii/options.cpp:110
+msgid "Share:"
+msgstr "Delad:"
+
+#: backends/platform/wii/options.cpp:114
+msgid "Username:"
+msgstr "Anv. namn:"
+
+#: backends/platform/wii/options.cpp:118
+msgid "Password:"
+msgstr "Lösenord:"
+
+#: backends/platform/wii/options.cpp:121
+msgid "Init network"
+msgstr "Init. nätverk"
+
+#: backends/platform/wii/options.cpp:123
+msgid "Mount SMB"
+msgstr "Montera SMB"
+
+#: backends/platform/wii/options.cpp:124
+msgid "Unmount SMB"
+msgstr "Mata ut SMB"
+
+#: backends/platform/wii/options.cpp:143
+msgid "DVD Mounted successfully"
+msgstr "Montering av DVD lyckades"
+
+#: backends/platform/wii/options.cpp:146
+msgid "Error while mounting the DVD"
+msgstr "Fel vid montering av DVD"
+
+#: backends/platform/wii/options.cpp:148
+msgid "DVD not mounted"
+msgstr "DVD ej monterad"
+
+#: backends/platform/wii/options.cpp:161
+msgid "Network up, share mounted"
+msgstr "Nätverk aktivt, delade kataloger monterade"
+
+#: backends/platform/wii/options.cpp:163
+msgid "Network up"
+msgstr "Nätverk aktivt"
+
+#: backends/platform/wii/options.cpp:166
+msgid ", error while mounting the share"
+msgstr ", fel under montering av delade kataloger"
+
+#: backends/platform/wii/options.cpp:168
+msgid ", share not mounted"
+msgstr ", delade kataloger ej monterade"
+
+#: backends/platform/wii/options.cpp:174
+msgid "Network down"
+msgstr "Nätverk inaktivt"
+
+#: backends/platform/wii/options.cpp:178
+msgid "Initializing network"
+msgstr "Initialiserar nätverk"
+
+#: backends/platform/wii/options.cpp:182
+msgid "Timeout while initializing network"
+msgstr "Timeout under initialisering av nätverk"
+
+#: backends/platform/wii/options.cpp:186
+#, c-format
+msgid "Network not initialized (%d)"
+msgstr "Nätverk ej initialiserat (%d)"
+
+#: backends/platform/wince/CEActionsPocket.cpp:46
+msgid "Hide Toolbar"
+msgstr "Göm verktygsrad"
+
+#: backends/platform/wince/CEActionsPocket.cpp:47
+msgid "Show Keyboard"
+msgstr "Visa tangentbord"
+
+#: backends/platform/wince/CEActionsPocket.cpp:48
+msgid "Sound on/off"
+msgstr "Ljud av/på"
+
+#: backends/platform/wince/CEActionsPocket.cpp:49
+msgid "Right click"
+msgstr "Högerklick"
+
+#: backends/platform/wince/CEActionsPocket.cpp:50
+msgid "Show/Hide Cursor"
+msgstr "Göm/visa pekare"
+
+#: backends/platform/wince/CEActionsPocket.cpp:51
+msgid "Free look"
+msgstr "Frititt"
+
+#: backends/platform/wince/CEActionsPocket.cpp:52
+msgid "Zoom up"
+msgstr "Zooma upp"
+
+#: backends/platform/wince/CEActionsPocket.cpp:53
+msgid "Zoom down"
+msgstr "Zooma ned"
+
+#: backends/platform/wince/CEActionsPocket.cpp:55
+#: backends/platform/wince/CEActionsSmartphone.cpp:49
+msgid "Bind Keys"
+msgstr "Förbind tangenter"
+
+#: backends/platform/wince/CEActionsPocket.cpp:56
+msgid "Cursor Up"
+msgstr "Pekare upp"
+
+#: backends/platform/wince/CEActionsPocket.cpp:57
+msgid "Cursor Down"
+msgstr "Pekare ned"
+
+#: backends/platform/wince/CEActionsPocket.cpp:58
+msgid "Cursor Left"
+msgstr "Pekare vänster"
+
+#: backends/platform/wince/CEActionsPocket.cpp:59
+msgid "Cursor Right"
+msgstr "Pekare höger"
+
+#: 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: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?"
+
+#: backends/platform/wince/CEActionsSmartphone.cpp:50
+msgid "Keyboard"
+msgstr "Tangentbord"
+
+#: backends/platform/wince/CEActionsSmartphone.cpp:51
+msgid "Rotate"
+msgstr "Rotera"
+
+#: backends/platform/wince/CELauncherDialog.cpp:56
+msgid "Using SDL driver "
+msgstr "Använd SDL-driver"
+
+#: backends/platform/wince/CELauncherDialog.cpp:60
+msgid "Display "
+msgstr "Skärm"
+
+#: 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:516
+msgid "Map right click action"
+msgstr "Ställ in högerklick"
+
+#: backends/platform/wince/wince-sdl.cpp:520
+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:529
+msgid "Map hide toolbar action"
+msgstr "Ställ in göm verktygsrad"
+
+#: backends/platform/wince/wince-sdl.cpp:533
+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:542
+msgid "Map Zoom Up action (optional)"
+msgstr "Ställ in Zooma up (valfritt)"
+
+#: backends/platform/wince/wince-sdl.cpp:545
+msgid "Map Zoom Down action (optional)"
+msgstr "Ställ in Zooma ned (valfritt)"
+
+#: backends/platform/wince/wince-sdl.cpp:553
+msgid ""
+"Don't forget to map a key to 'Hide Toolbar' action to see the whole inventory"
+msgstr ""
+"Glöm inte att välja en tangent för \"Göm verktygsrad\" för att se hela "
+"inventariet"
+
+#: backends/events/default/default-events.cpp:196
+msgid "Do you really want to return to the Launcher?"
+msgstr "Vill du verkligen återgå till launchern?"
+
+#: backends/events/default/default-events.cpp:196
+msgid "Launcher"
+msgstr "Launcher"
+
+#: backends/events/default/default-events.cpp:218
+msgid "Do you really want to quit?"
+msgstr "Vill du verkligen avsluta?"
+
+#: backends/events/gph/gph-events.cpp:386
+#: backends/events/gph/gph-events.cpp:429
+#: backends/events/openpandora/op-events.cpp:168
+msgid "Touchscreen 'Tap Mode' - Left Click"
+msgstr "Touchscreen \"Tap-läge\" - Vänsterklick"
+
+#: backends/events/gph/gph-events.cpp:388
+#: backends/events/gph/gph-events.cpp:431
+#: backends/events/openpandora/op-events.cpp:170
+msgid "Touchscreen 'Tap Mode' - Right Click"
+msgstr "Touchscren \"Tap-läge\" - Högerklick"
+
+#: backends/events/gph/gph-events.cpp:390
+#: backends/events/gph/gph-events.cpp:433
+#: backends/events/openpandora/op-events.cpp:172
+msgid "Touchscreen 'Tap Mode' - Hover (No Click)"
+msgstr "Touchscreen \"Tap-läge\" - Hover (utan klick)"
+
+#: backends/events/gph/gph-events.cpp:410
+msgid "Maximum Volume"
+msgstr "Max. volym"
+
+#: backends/events/gph/gph-events.cpp:412
+msgid "Increasing Volume"
+msgstr "Höja volymen"
+
+#: backends/events/gph/gph-events.cpp:418
+msgid "Minimal Volume"
+msgstr "Min. volym"
+
+#: backends/events/gph/gph-events.cpp:420
+msgid "Decreasing Volume"
+msgstr "Sänka volymen"
+
+#: backends/events/openpandora/op-events.cpp:174
+msgid "Touchscreen 'Tap Mode' - Hover (DPad Clicks)"
+msgstr "Touchscreen 'Tap-läge' - Hover (DPad klick)"
+
+#: backends/updates/macosx/macosx-updates.mm:67
+msgid "Check for Updates..."
+msgstr "Sök efter uppdateringar..."
+
+#: backends/platform/tizen/form.cpp:263
+msgid "Right Click Once"
+msgstr "Ett högerklick"
+
+#: backends/platform/tizen/form.cpp:271
+msgid "Move Only"
+msgstr "Endast rörelse"
+
+#: backends/platform/tizen/form.cpp:294
+msgid "Escape Key"
+msgstr "Escape-tangenten"
+
+#: backends/platform/tizen/form.cpp:299
+msgid "Game Menu"
+msgstr "Spelmeny"
+
+#: backends/platform/tizen/form.cpp:304
+msgid "Show Keypad"
+msgstr "Visa tangentbord"
+
+#: backends/platform/tizen/form.cpp:309
+msgid "Control Mouse"
+msgstr "Kontrollera musen"
+
+#: backends/events/maemosdl/maemosdl-events.cpp:192
+msgid "Clicking Enabled"
+msgstr "Klickning aktiverad"
+
+#: backends/events/maemosdl/maemosdl-events.cpp:192
+msgid "Clicking Disabled"
+msgstr "Klickning deaktiverad"
+
+#: engines/agi/detection.cpp:142 engines/drascula/detection.cpp:302
+#: engines/dreamweb/detection.cpp:47 engines/neverhood/detection.cpp:160
+#: engines/sci/detection.cpp:394 engines/toltecs/detection.cpp:186
msgid "Use original save/load screens"
msgstr "Använd originalskärmar för spara/ladda"
-#: engines/agi/detection.cpp:143 engines/drascula/detection.cpp:271
-#: engines/dreamweb/detection.cpp:48 engines/sci/detection.cpp:394
-#: engines/toltecs/detection.cpp:174
+#: engines/agi/detection.cpp:143 engines/drascula/detection.cpp:303
+#: engines/dreamweb/detection.cpp:48 engines/neverhood/detection.cpp:161
+#: engines/sci/detection.cpp:395 engines/toltecs/detection.cpp:187
msgid "Use the original save/load screens, instead of the ScummVM ones"
msgstr "Använder originalskärmarna för spara/ladda istället för ScummVM:s"
-#: engines/agi/saveload.cpp:816 engines/drascula/saveload.cpp:351
-#: engines/sci/engine/kfile.cpp:841 engines/toltecs/menu.cpp:259
+#: engines/agi/saveload.cpp:816 engines/drascula/saveload.cpp:349
+#: engines/neverhood/menumodule.cpp:886 engines/sci/engine/kfile.cpp:857
+#: engines/toltecs/menu.cpp:256
msgid "Restore game:"
msgstr "Återställ spel:"
-#: engines/agi/saveload.cpp:816 engines/drascula/saveload.cpp:351
-#: engines/sci/engine/kfile.cpp:841 engines/toltecs/menu.cpp:259
+#: engines/agi/saveload.cpp:816 engines/drascula/saveload.cpp:349
+#: engines/neverhood/menumodule.cpp:886 engines/sci/engine/kfile.cpp:857
+#: engines/toltecs/menu.cpp:256
msgid "Restore"
msgstr "Återställ"
-#: engines/drascula/saveload.cpp:49
+#: engines/agos/saveload.cpp:160 engines/scumm/scumm.cpp:2321
+#, c-format
+msgid ""
+"Failed to load game state from file:\n"
+"\n"
+"%s"
+msgstr ""
+"Kunde inte läsa spardata från filen:\n"
+"\n"
+"%s"
+
+#: engines/agos/saveload.cpp:195 engines/scumm/scumm.cpp:2314
+#, c-format
+msgid ""
+"Failed to save game state to file:\n"
+"\n"
+"%s"
+msgstr ""
+"Kunde inte skriva spardata till filen:\n"
+"\n"
+"%s"
+
+#: engines/agos/saveload.cpp:203 engines/scumm/scumm.cpp:2332
+#, c-format
+msgid ""
+"Successfully saved game state in file:\n"
+"\n"
+"%s"
+msgstr ""
+"Sparade framgångsrikt spardata i filen:\n"
+"\n"
+"%s"
+
+#: engines/agos/animation.cpp:557
+#, c-format
+msgid "Cutscene file '%s' not found!"
+msgstr "Filmscensfilen '%s' hittades ej!"
+
+#: engines/drascula/saveload.cpp:47
msgid ""
"ScummVM found that you have old savefiles for Drascula that should be "
"converted.\n"
@@ -1441,27 +2172,304 @@ msgstr "Använd ljus palett-läge"
msgid "Display graphics using the game's bright palette"
msgstr "Visa grafik med spelets ljusa palett"
-#: engines/sci/detection.cpp:373
+#: engines/gob/inter_playtoons.cpp:256 engines/gob/inter_v2.cpp:1470
+#: engines/tinsel/saveload.cpp:532
+msgid "Failed to load game state from file."
+msgstr "Kunde inte läsa spardata från filen"
+
+#: engines/gob/inter_v2.cpp:1540 engines/tinsel/saveload.cpp:545
+msgid "Failed to save game state to file."
+msgstr "Kunde inte skriva spardata till filen."
+
+#: engines/gob/inter_v5.cpp:107
+msgid "Failed to delete file."
+msgstr "Kunde inte radera filen."
+
+#: engines/groovie/detection.cpp:312
+msgid "Fast movie speed"
+msgstr "Snabb filmhastighet"
+
+#: engines/groovie/detection.cpp:313
+msgid "Play movies at an increased speed"
+msgstr "Spela filmer i högre hastighet"
+
+#: engines/groovie/script.cpp:399
+msgid "Failed to save game"
+msgstr "Kunde inte spara spelet."
+
+#. I18N: Studio audience adds an applause and cheering sounds whenever
+#. Malcolm makes a joke.
+#: engines/kyra/detection.cpp:62
+msgid "Studio audience"
+msgstr "Studiopublik"
+
+#: engines/kyra/detection.cpp:63
+msgid "Enable studio audience"
+msgstr "Aktivera studiopublik"
+
+#. I18N: This option allows the user to skip text and cutscenes.
+#: engines/kyra/detection.cpp:73
+msgid "Skip support"
+msgstr "Skipp-stöd"
+
+#: engines/kyra/detection.cpp:74
+msgid "Allow text and cutscenes to be skipped"
+msgstr "Tillåter skippning av text och filmscener"
+
+#. I18N: Helium mode makes people sound like they've inhaled Helium.
+#: engines/kyra/detection.cpp:84
+msgid "Helium mode"
+msgstr "Helium-läge"
+
+#: engines/kyra/detection.cpp:85
+msgid "Enable helium mode"
+msgstr "Aktivera heliumläge"
+
+#. I18N: When enabled, this option makes scrolling smoother when
+#. changing from one screen to another.
+#: engines/kyra/detection.cpp:99
+msgid "Smooth scrolling"
+msgstr "Mjuk rullning"
+
+#: engines/kyra/detection.cpp:100
+msgid "Enable smooth scrolling when walking"
+msgstr "Aktivera mjuk skärmrullning vid gångfart"
+
+#. I18N: When enabled, this option changes the cursor when it floats to the
+#. edge of the screen to a directional arrow. The player can then click to
+#. walk towards that direction.
+#: engines/kyra/detection.cpp:112
+msgid "Floating cursors"
+msgstr "Flytande pekare"
+
+#: engines/kyra/detection.cpp:113
+msgid "Enable floating cursors"
+msgstr "Aktivera flytande pekare"
+
+#. I18N: HP stands for Hit Points
+#: engines/kyra/detection.cpp:127
+msgid "HP bar graphs"
+msgstr "Livmätare"
+
+#: engines/kyra/detection.cpp:128
+msgid "Enable hit point bar graphs"
+msgstr "Aktivera livmätare"
+
+#: engines/kyra/lol.cpp:478
+msgid "Attack 1"
+msgstr "Attack 1"
+
+#: engines/kyra/lol.cpp:479
+msgid "Attack 2"
+msgstr "Attack 2"
+
+#: engines/kyra/lol.cpp:480
+msgid "Attack 3"
+msgstr "Attack 3"
+
+#: engines/kyra/lol.cpp:481
+msgid "Move Forward"
+msgstr "Steg framåt"
+
+#: engines/kyra/lol.cpp:482
+msgid "Move Back"
+msgstr "Steg bakåt"
+
+#: engines/kyra/lol.cpp:483
+msgid "Slide Left"
+msgstr "Glid vänster"
+
+#: engines/kyra/lol.cpp:484
+msgid "Slide Right"
+msgstr "Glid höger"
+
+#: engines/kyra/lol.cpp:485 engines/pegasus/pegasus.cpp:2509
+msgid "Turn Left"
+msgstr "Sväng vänster"
+
+#: engines/kyra/lol.cpp:486 engines/pegasus/pegasus.cpp:2510
+msgid "Turn Right"
+msgstr "Sväng höger"
+
+#: engines/kyra/lol.cpp:487
+msgid "Rest"
+msgstr "Vila"
+
+#: engines/kyra/lol.cpp:488
+msgid "Options"
+msgstr "Inställningar"
+
+#: engines/kyra/lol.cpp:489
+msgid "Choose Spell"
+msgstr "Välj trollformel"
+
+#: engines/kyra/sound_midi.cpp:477
+msgid ""
+"You appear to be using a General MIDI device,\n"
+"but your game only supports Roland MT32 MIDI.\n"
+"We try to map the Roland MT32 instruments to\n"
+"General MIDI ones. It is still possible that\n"
+"some tracks sound incorrect."
+msgstr ""
+"Du verkar använda en General MIDI-enhet,\n"
+"men ditt spel stöder endast Roland MT32 MIDI.\n"
+"Vi försöker kartlägga Roland MT32-instrumenten till\n"
+"General MIDI-instrument. Det kan trots allt hända\n"
+"att ett fåtal ljudspår inte spelas korrekt."
+
+#. I18N: Option for fast scene switching
+#: engines/mohawk/dialogs.cpp:92 engines/mohawk/dialogs.cpp:167
+msgid "~Z~ip Mode Activated"
+msgstr "~Z~ipläge aktiverat"
+
+#: engines/mohawk/dialogs.cpp:93
+msgid "~T~ransitions Enabled"
+msgstr "Öv~e~rgångar aktiverade"
+
+#. I18N: Drop book page
+#: engines/mohawk/dialogs.cpp:95
+msgid "~D~rop Page"
+msgstr "Släpp si~d~a"
+
+#: engines/mohawk/dialogs.cpp:99
+msgid "~S~how Map"
+msgstr "~V~isa karta"
+
+#: engines/mohawk/dialogs.cpp:105
+msgid "~M~ain Menu"
+msgstr "Huvud~m~eny"
+
+#: engines/mohawk/dialogs.cpp:168
+msgid "~W~ater Effect Enabled"
+msgstr "~V~atteneffekt aktiverad"
+
+#: engines/neverhood/detection.cpp:167
+msgid "Skip the Hall of Records storyboard scenes"
+msgstr ""
+
+#: engines/neverhood/detection.cpp:168
+msgid "Allows the player to skip past the Hall of Records storyboard scenes"
+msgstr ""
+
+#: engines/neverhood/detection.cpp:174
+msgid "Scale the making of videos to full screen"
+msgstr ""
+
+#: engines/neverhood/detection.cpp:175
+msgid "Scale the making of videos, so that they use the whole screen"
+msgstr ""
+
+#: engines/parallaction/saveload.cpp:133
+#, c-format
+msgid ""
+"Can't save game in slot %i\n"
+"\n"
+msgstr ""
+"Kan inte spara data i position %i\n"
+"\n"
+
+#: engines/parallaction/saveload.cpp:204
+msgid "Loading game..."
+msgstr "Laddar speldata..."
+
+#: engines/parallaction/saveload.cpp:219
+msgid "Saving game..."
+msgstr "Sparar speldata..."
+
+#: engines/parallaction/saveload.cpp:272
+msgid ""
+"ScummVM found that you have old savefiles for Nippon Safes that should be "
+"renamed.\n"
+"The old names are 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 next time.\n"
+msgstr ""
+"ScummVM upptäckte att du har gamla spardata för Nippon Safes som borde byta "
+"namn.\n"
+"De gamla filnamnen stöds inte längre, så du kommer inte kunna ladda dina "
+"data om du inte konverterar dem.\n"
+"\n"
+"Tryck \"OK\" för att konvertera dem nu, annars kommer du tillfrågas igen "
+"nästa gång du startar spelet.\n"
+
+#: engines/parallaction/saveload.cpp:319
+msgid "ScummVM successfully converted all your savefiles."
+msgstr "ScummVM lyckades konvertera alla dina spardata."
+
+#: engines/parallaction/saveload.cpp:321
+msgid ""
+"ScummVM printed some warnings in your console window and can't guarantee all "
+"your files have been converted.\n"
+"\n"
+"Please report to the team."
+msgstr ""
+"ScummVM skrev ut några varningar i ditt konsolfönster och kan inte garantera "
+"att alla dina filer har konverterats.\n"
+"\n"
+"Var god rapportera till teamet."
+
+#: engines/pegasus/pegasus.cpp:714
+msgid "Invalid save file name"
+msgstr "Ogiltigt namn på sparfil"
+
+#: engines/pegasus/pegasus.cpp:2507
+msgid "Up/Zoom In/Move Forward/Open Doors"
+msgstr "Upp/Zooma in/Gå framåt/Öppna dörrar"
+
+#: engines/pegasus/pegasus.cpp:2508
+msgid "Down/Zoom Out"
+msgstr "Ned/Zooma ut"
+
+#: engines/pegasus/pegasus.cpp:2511
+msgid "Display/Hide Inventory Tray"
+msgstr "Visa/dölj inventarium"
+
+#: engines/pegasus/pegasus.cpp:2512
+msgid "Display/Hide Biochip Tray"
+msgstr "Visa/dölj biochip"
+
+#: engines/pegasus/pegasus.cpp:2513
+msgid "Action/Select"
+msgstr "Handling/Välj"
+
+#: engines/pegasus/pegasus.cpp:2514
+msgid "Toggle Center Data Display"
+msgstr "Aktivera centrerad dataskärm"
+
+#: engines/pegasus/pegasus.cpp:2515
+msgid "Display/Hide Info Screen"
+msgstr "Visa/dölj informationsskärm"
+
+#: engines/pegasus/pegasus.cpp:2516
+msgid "Display/Hide Pause Menu"
+msgstr "Visa/dölj pausmeny"
+
+#: engines/pegasus/pegasus.cpp:2517
+msgid "???"
+msgstr "???"
+
+#: engines/sci/detection.cpp:374
msgid "EGA undithering"
msgstr "EGA anti-gitter"
-#: engines/sci/detection.cpp:374
+#: engines/sci/detection.cpp:375
msgid "Enable undithering in EGA games"
msgstr "Aktivera anti-gitter i EGA-spel"
-#: engines/sci/detection.cpp:383
+#: engines/sci/detection.cpp:384
msgid "Prefer digital sound effects"
msgstr "Föredra digitala ljudeffekter"
-#: engines/sci/detection.cpp:384
+#: engines/sci/detection.cpp:385
msgid "Prefer digital sound effects instead of synthesized ones"
msgstr "Föredra digitala ljudeffekter istället för syntetiserade"
-#: engines/sci/detection.cpp:403
+#: engines/sci/detection.cpp:404
msgid "Use IMF/Yamaha FB-01 for MIDI output"
msgstr "Använd IMF/Yamaha FB-01 för MIDI-uppspelning"
-#: engines/sci/detection.cpp:404
+#: engines/sci/detection.cpp:405
msgid ""
"Use an IBM Music Feature card or a Yamaha FB-01 FM synth module for MIDI "
"output"
@@ -1469,165 +2477,147 @@ msgstr ""
"Använd ett IMB Music Feature-kort eller en Yamaha FB-01 FM synthmodul för "
"MIDI-uppspelning"
-#: engines/sci/detection.cpp:414
+#: engines/sci/detection.cpp:415
msgid "Use CD audio"
msgstr "Använd CD-ljud"
-#: engines/sci/detection.cpp:415
+#: engines/sci/detection.cpp:416
msgid "Use CD audio instead of in-game audio, if available"
msgstr "Använd CD-ljud istället för spelets ljud, om tillgängligt"
-#: engines/sci/detection.cpp:425
+#: engines/sci/detection.cpp:426
msgid "Use Windows cursors"
msgstr "Använd Windows muspekare"
-#: engines/sci/detection.cpp:426
+#: engines/sci/detection.cpp:427
msgid ""
"Use the Windows cursors (smaller and monochrome) instead of the DOS ones"
msgstr ""
"Använd Windows muspekare (mindre och svartvit) istället för DOS-pekaren"
-#: engines/sci/detection.cpp:436
+#: engines/sci/detection.cpp:437
msgid "Use silver cursors"
msgstr "Använd silverpekare"
-#: engines/sci/detection.cpp:437
+#: engines/sci/detection.cpp:438
msgid ""
"Use the alternate set of silver cursors, instead of the normal golden ones"
msgstr ""
"Använd de alternativa silverpekarna istället för de normala guldpekarna"
-#: engines/scumm/dialogs.cpp:175
+#: engines/scumm/dialogs.cpp:176
#, c-format
msgid "Insert Disk %c and Press Button to Continue."
msgstr "Mata in skivan %c och tryck på knappen för att fortsätta."
-#: engines/scumm/dialogs.cpp:176
+#: engines/scumm/dialogs.cpp:177
#, c-format
msgid "Unable to Find %s, (%c%d) Press Button."
msgstr "Kunde inte hitta %s, (%c%d) tryck på knappen."
-#: engines/scumm/dialogs.cpp:177
+#: engines/scumm/dialogs.cpp:178
#, c-format
msgid "Error reading disk %c, (%c%d) Press Button."
msgstr "Fel vid inläsning av skivan %c, (%c%d) tryck på knappen."
-#: engines/scumm/dialogs.cpp:178
+#: engines/scumm/dialogs.cpp:179
msgid "Game Paused. Press SPACE to Continue."
msgstr "Spelet pausat. Tryck MELLANSLAG för att fortsätta."
#. 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
+#: engines/scumm/dialogs.cpp:183
msgid "Are you sure you want to restart? (Y/N)"
msgstr "Är du säker på att du vill starta om? (J/N)J"
#. I18N: you may specify 'Yes' symbol at the end of the line. See previous comment
-#: engines/scumm/dialogs.cpp:184
+#: engines/scumm/dialogs.cpp:185
msgid "Are you sure you want to quit? (Y/N)"
msgstr "Är du säker på att du vill avsluta? (J/N)J"
-#: engines/scumm/dialogs.cpp:189
+#: engines/scumm/dialogs.cpp:190
msgid "Play"
msgstr "Spela"
-#: 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:215
-msgid "Quit"
-msgstr "Avsluta"
-
-#: engines/scumm/dialogs.cpp:193
+#: engines/scumm/dialogs.cpp:194
msgid "Insert save/load game disk"
msgstr "Mata in skiva för spardata"
-#: engines/scumm/dialogs.cpp:194
+#: engines/scumm/dialogs.cpp:195
msgid "You must enter a name"
msgstr "Du måste ange ett namn"
-#: engines/scumm/dialogs.cpp:195
+#: engines/scumm/dialogs.cpp:196
msgid "The game was NOT saved (disk full?)"
msgstr "Spelet sprades EJ (skivan full?)"
-#: engines/scumm/dialogs.cpp:196
+#: engines/scumm/dialogs.cpp:197
msgid "The game was NOT loaded"
msgstr "Spelet laddades EJ"
-#: engines/scumm/dialogs.cpp:197
+#: engines/scumm/dialogs.cpp:198
#, c-format
msgid "Saving '%s'"
msgstr "Sparar '%s'"
-#: engines/scumm/dialogs.cpp:198
+#: engines/scumm/dialogs.cpp:199
#, c-format
msgid "Loading '%s'"
msgstr "Laddar '%s'"
-#: engines/scumm/dialogs.cpp:199
+#: engines/scumm/dialogs.cpp:200
msgid "Name your SAVE game"
msgstr "Namnge ditt SPARADE spel"
-#: engines/scumm/dialogs.cpp:200
+#: engines/scumm/dialogs.cpp:201
msgid "Select a game to LOAD"
msgstr "Välj ett spel att LADDA"
-#: engines/scumm/dialogs.cpp:201
+#: engines/scumm/dialogs.cpp:202
msgid "Game title)"
msgstr "Speltitel)"
#. I18N: Previous page button
-#: engines/scumm/dialogs.cpp:287
+#: engines/scumm/dialogs.cpp:288
msgid "~P~revious"
msgstr "~F~öregående"
#. I18N: Next page button
-#: engines/scumm/dialogs.cpp:289
+#: engines/scumm/dialogs.cpp:290
msgid "~N~ext"
msgstr "~N~ästa"
-#: 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
+#: engines/scumm/dialogs.cpp:598
msgid "Speech Only"
msgstr "Endast tal"
-#: engines/scumm/dialogs.cpp:598
+#: engines/scumm/dialogs.cpp:599
msgid "Speech and Subtitles"
msgstr "Tal och undertexter"
-#: engines/scumm/dialogs.cpp:599
+#: engines/scumm/dialogs.cpp:600
msgid "Subtitles Only"
msgstr "Endast undertexter"
-#: engines/scumm/dialogs.cpp:607
+#: engines/scumm/dialogs.cpp:608
msgctxt "lowres"
msgid "Speech & Subs"
msgstr "Tal & text"
-#: engines/scumm/dialogs.cpp:653
+#: engines/scumm/dialogs.cpp:654
msgid "Select a Proficiency Level."
msgstr "Välj en skicklighetsnivå."
-#: engines/scumm/dialogs.cpp:655
+#: engines/scumm/dialogs.cpp:656
msgid "Refer to your Loom(TM) manual for help."
msgstr "Hänvisa till din Loom(TM)-manual för hjälp."
-#: engines/scumm/dialogs.cpp:658
-msgid "Standard"
-msgstr "Standard"
-
-#: engines/scumm/dialogs.cpp:659
+#: engines/scumm/dialogs.cpp:660
msgid "Practice"
msgstr "Övning"
-#: engines/scumm/dialogs.cpp:660
+#: engines/scumm/dialogs.cpp:661
msgid "Expert"
msgstr "Expert"
@@ -2144,7 +3134,7 @@ msgstr "Flyg åt höger"
msgid "Fly to lower right"
msgstr "Flyg åt nedre höger"
-#: engines/scumm/scumm.cpp:1776
+#: engines/scumm/scumm.cpp:1777
#, c-format
msgid ""
"Native MIDI support requires the Roland Upgrade from LucasArts,\n"
@@ -2153,40 +3143,7 @@ msgstr ""
"Stöd för Native MIDI kräver Roland-uppdateringen från LucasArts,\n"
"men %s saknas. Använder AdLib istället."
-#: engines/scumm/scumm.cpp:2303 engines/agos/saveload.cpp:220
-#, c-format
-msgid ""
-"Failed to save game state to file:\n"
-"\n"
-"%s"
-msgstr ""
-"Kunde inte skriva spardata till filen:\n"
-"\n"
-"%s"
-
-#: engines/scumm/scumm.cpp:2310 engines/agos/saveload.cpp:185
-#, c-format
-msgid ""
-"Failed to load game state from file:\n"
-"\n"
-"%s"
-msgstr ""
-"Kunde inte läsa spardata från filen:\n"
-"\n"
-"%s"
-
-#: engines/scumm/scumm.cpp:2322 engines/agos/saveload.cpp:228
-#, c-format
-msgid ""
-"Successfully saved game state in file:\n"
-"\n"
-"%s"
-msgstr ""
-"Sparade framgångsrikt spardata i filen:\n"
-"\n"
-"%s"
-
-#: engines/scumm/scumm.cpp:2537
+#: engines/scumm/scumm.cpp:2547
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' "
@@ -2196,190 +3153,6 @@ 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."
-#. I18N: Option for fast scene switching
-#: engines/mohawk/dialogs.cpp:92 engines/mohawk/dialogs.cpp:167
-msgid "~Z~ip Mode Activated"
-msgstr "~Z~ipläge aktiverat"
-
-#: engines/mohawk/dialogs.cpp:93
-msgid "~T~ransitions Enabled"
-msgstr "Öv~e~rgångar aktiverade"
-
-#. I18N: Drop book page
-#: engines/mohawk/dialogs.cpp:95
-msgid "~D~rop Page"
-msgstr "Släpp si~d~a"
-
-#: engines/mohawk/dialogs.cpp:99
-msgid "~S~how Map"
-msgstr "~V~isa karta"
-
-#: engines/mohawk/dialogs.cpp:105
-msgid "~M~ain Menu"
-msgstr "Huvud~m~eny"
-
-#: engines/mohawk/dialogs.cpp:168
-msgid "~W~ater Effect Enabled"
-msgstr "~V~atteneffekt aktiverad"
-
-#: engines/agos/animation.cpp:557
-#, c-format
-msgid "Cutscene file '%s' not found!"
-msgstr "Filmscensfilen '%s' hittades ej!"
-
-#: engines/gob/inter_playtoons.cpp:256 engines/gob/inter_v2.cpp:1287
-#: engines/tinsel/saveload.cpp:532
-msgid "Failed to load game state from file."
-msgstr "Kunde inte läsa spardata från filen"
-
-#: engines/gob/inter_v2.cpp:1357 engines/tinsel/saveload.cpp:545
-msgid "Failed to save game state to file."
-msgstr "Kunde inte skriva spardata till filen."
-
-#: engines/gob/inter_v5.cpp:107
-msgid "Failed to delete file."
-msgstr "Kunde inte radera filen."
-
-#: engines/groovie/detection.cpp:312
-msgid "Fast movie speed"
-msgstr "Snabb filmhastighet"
-
-#: engines/groovie/detection.cpp:313
-msgid "Play movies at an increased speed"
-msgstr "Spela filmer i högre hastighet"
-
-#: engines/groovie/script.cpp:420
-msgid "Failed to save game"
-msgstr "Kunde inte spara spelet."
-
-#. I18N: Studio audience adds an applause and cheering sounds whenever
-#. Malcolm makes a joke.
-#: engines/kyra/detection.cpp:62
-msgid "Studio audience"
-msgstr "Studiopublik"
-
-#: engines/kyra/detection.cpp:63
-msgid "Enable studio audience"
-msgstr "Aktivera studiopublik"
-
-#. I18N: This option allows the user to skip text and cutscenes.
-#: engines/kyra/detection.cpp:73
-msgid "Skip support"
-msgstr "Skipp-stöd"
-
-#: engines/kyra/detection.cpp:74
-msgid "Allow text and cutscenes to be skipped"
-msgstr "Tillåter skippning av text och filmscener"
-
-#. I18N: Helium mode makes people sound like they've inhaled Helium.
-#: engines/kyra/detection.cpp:84
-msgid "Helium mode"
-msgstr "Helium-läge"
-
-#: engines/kyra/detection.cpp:85
-msgid "Enable helium mode"
-msgstr "Aktivera heliumläge"
-
-#. I18N: When enabled, this option makes scrolling smoother when
-#. changing from one screen to another.
-#: engines/kyra/detection.cpp:99
-msgid "Smooth scrolling"
-msgstr "Mjuk rullning"
-
-#: engines/kyra/detection.cpp:100
-msgid "Enable smooth scrolling when walking"
-msgstr "Aktivera mjuk skärmrullning vid gångfart"
-
-#. I18N: When enabled, this option changes the cursor when it floats to the
-#. edge of the screen to a directional arrow. The player can then click to
-#. walk towards that direction.
-#: engines/kyra/detection.cpp:112
-msgid "Floating cursors"
-msgstr "Flytande pekare"
-
-#: engines/kyra/detection.cpp:113
-msgid "Enable floating cursors"
-msgstr "Aktivera flytande pekare"
-
-#. I18N: HP stands for Hit Points
-#: engines/kyra/detection.cpp:127
-msgid "HP bar graphs"
-msgstr "Livmätare"
-
-#: engines/kyra/detection.cpp:128
-msgid "Enable hit point bar graphs"
-msgstr "Aktivera livmätare"
-
-#: engines/kyra/lol.cpp:478
-msgid "Attack 1"
-msgstr "Attack 1"
-
-#: engines/kyra/lol.cpp:479
-msgid "Attack 2"
-msgstr "Attack 2"
-
-#: engines/kyra/lol.cpp:480
-msgid "Attack 3"
-msgstr "Attack 3"
-
-#: engines/kyra/lol.cpp:481
-msgid "Move Forward"
-msgstr "Steg framåt"
-
-#: engines/kyra/lol.cpp:482
-msgid "Move Back"
-msgstr "Steg bakåt"
-
-#: engines/kyra/lol.cpp:483
-msgid "Slide Left"
-msgstr "Glid vänster"
-
-#: engines/kyra/lol.cpp:484
-msgid "Slide Right"
-msgstr "Glid höger"
-
-#: engines/kyra/lol.cpp:485 engines/pegasus/pegasus.cpp:2447
-msgid "Turn Left"
-msgstr "Sväng vänster"
-
-#: engines/kyra/lol.cpp:486 engines/pegasus/pegasus.cpp:2448
-msgid "Turn Right"
-msgstr "Sväng höger"
-
-#: engines/kyra/lol.cpp:487
-msgid "Rest"
-msgstr "Vila"
-
-#: engines/kyra/lol.cpp:488
-msgid "Options"
-msgstr "Inställningar"
-
-#: engines/kyra/lol.cpp:489
-msgid "Choose Spell"
-msgstr "Välj trollformel"
-
-#: engines/kyra/sound_midi.cpp:477
-msgid ""
-"You appear to be using a General MIDI device,\n"
-"but your game only supports Roland MT32 MIDI.\n"
-"We try to map the Roland MT32 instruments to\n"
-"General MIDI ones. It is still possible that\n"
-"some tracks sound incorrect."
-msgstr ""
-"Du verkar använda en General MIDI-enhet,\n"
-"men ditt spel stöder endast Roland MT32 MIDI.\n"
-"Vi försöker kartlägga Roland MT32-instrumenten till\n"
-"General MIDI-instrument. Det kan trots allt hända\n"
-"att ett fåtal ljudspår inte spelas korrekt."
-
-#: engines/queen/queen.cpp:59
-msgid "Alternative intro"
-msgstr "Alternativt intro"
-
-#: engines/queen/queen.cpp:60
-msgid "Use an alternative game intro (CD version only)"
-msgstr "Använd alternativt spelintro (endast CD-version)"
-
#: engines/sky/compact.cpp:130
msgid ""
"Unable to find \"sky.cpt\" file!\n"
@@ -2404,20 +3177,21 @@ msgstr "Diskettintro"
msgid "Use the floppy version's intro (CD version only)"
msgstr "Använd diskettversionens intro (endast CD-version)"
-#: engines/sword1/animation.cpp:519
+#: engines/sword1/animation.cpp:524
#, c-format
msgid "PSX stream cutscene '%s' cannot be played in paletted mode"
msgstr "PSX-filmscenen '%s' kan inte visas i palettläget"
-#: engines/sword1/animation.cpp:540 engines/sword2/animation.cpp:439
+#: engines/sword1/animation.cpp:545 engines/sword2/animation.cpp:445
msgid "DXA cutscenes found but ScummVM has been built without zlib support"
msgstr "DXA filmscener hittades men ScummVM har byggts utan stöd för zlib"
-#: engines/sword1/animation.cpp:550 engines/sword2/animation.cpp:449
-msgid "MPEG2 cutscenes are no longer supported"
-msgstr "MPEG2 filmscener stöds inte längre"
+#: engines/sword1/animation.cpp:561
+#, fuzzy
+msgid "MPEG-2 cutscenes found but ScummVM has been built without MPEG-2"
+msgstr "PSX-filmscener hittades men ScummVM har byggts utan stöd för RGB-färg"
-#: engines/sword1/animation.cpp:556 engines/sword2/animation.cpp:457
+#: engines/sword1/animation.cpp:568 engines/sword2/animation.cpp:470
#, c-format
msgid "Cutscene '%s' not found"
msgstr "Filmscenen '%s' hittades ej"
@@ -2461,11 +3235,17 @@ msgstr "Behåll den nya"
msgid "This is the end of the Broken Sword 1 Demo"
msgstr "Här slutar Broken Sword 1 demon"
-#: engines/sword2/animation.cpp:419
+#: engines/sword2/animation.cpp:425
msgid ""
"PSX cutscenes found but ScummVM has been built without RGB color support"
msgstr "PSX-filmscener hittades men ScummVM har byggts utan stöd för RGB-färg"
+#: engines/sword2/animation.cpp:461
+#, fuzzy
+msgid ""
+"MPEG-2 cutscenes found but ScummVM has been built without MPEG-2 support"
+msgstr "DXA filmscener hittades men ScummVM har byggts utan stöd för zlib"
+
#: engines/sword2/sword2.cpp:79
msgid "Show object labels"
msgstr "Visa etiketter"
@@ -2474,12 +3254,12 @@ msgstr "Visa etiketter"
msgid "Show labels for objects on mouse hover"
msgstr "Visar etiketter för objekten som musen pekar på"
-#: engines/teenagent/resources.cpp:94
+#: engines/teenagent/resources.cpp:95
msgid ""
"You're missing the 'teenagent.dat' file. Get it from the ScummVM website"
msgstr "Du har inte 'teenagent.dat'-filen. Hämta den från ScummVM:s webbsida"
-#: engines/teenagent/resources.cpp:115
+#: engines/teenagent/resources.cpp:116
msgid ""
"The teenagent.dat file is compressed and zlib hasn't been included in this "
"executable. Please decompress it"
@@ -2487,791 +3267,50 @@ msgstr ""
"Teenagent.dat-filen är komprimerad och zlib har inte inkluderats i det här "
"programmet. Var god dekomprimera den"
-#: engines/parallaction/saveload.cpp:133
-#, c-format
-msgid ""
-"Can't save game in slot %i\n"
-"\n"
-msgstr ""
-"Kan inte spara data i position %i\n"
-"\n"
-
-#: engines/parallaction/saveload.cpp:204
-msgid "Loading game..."
-msgstr "Laddar speldata..."
-
-#: engines/parallaction/saveload.cpp:219
-msgid "Saving game..."
-msgstr "Sparar speldata..."
-
-#: engines/parallaction/saveload.cpp:272
-msgid ""
-"ScummVM found that you have old savefiles for Nippon Safes that should be "
-"renamed.\n"
-"The old names are 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 next time.\n"
-msgstr ""
-"ScummVM upptäckte att du har gamla spardata för Nippon Safes som borde byta "
-"namn.\n"
-"De gamla filnamnen stöds inte längre, så du kommer inte kunna ladda dina "
-"data om du inte konverterar dem.\n"
-"\n"
-"Tryck \"OK\" för att konvertera dem nu, annars kommer du tillfrågas igen "
-"nästa gång du startar spelet.\n"
-
-#: engines/parallaction/saveload.cpp:319
-msgid "ScummVM successfully converted all your savefiles."
-msgstr "ScummVM lyckades konvertera alla dina spardata."
-
-#: engines/parallaction/saveload.cpp:321
-msgid ""
-"ScummVM printed some warnings in your console window and can't guarantee all "
-"your files have been converted.\n"
-"\n"
-"Please report to the team."
-msgstr ""
-"ScummVM skrev ut några varningar i ditt konsolfönster och kan inte garantera "
-"att alla dina filer har konverterats.\n"
-"\n"
-"Var god rapportera till teamet."
-
-#: engines/pegasus/pegasus.cpp:679
-msgid "Invalid save file name"
-msgstr "Ogiltigt namn på sparfil"
-
-#: engines/pegasus/pegasus.cpp:2445
-msgid "Up/Zoom In/Move Forward/Open Doors"
-msgstr "Upp/Zooma in/Gå framåt/Öppna dörrar"
-
-#: engines/pegasus/pegasus.cpp:2446
-msgid "Down/Zoom Out"
-msgstr "Ned/Zooma ut"
-
-#: engines/pegasus/pegasus.cpp:2449
-msgid "Display/Hide Inventory Tray"
-msgstr "Visa/dölj inventarium"
-
-#: engines/pegasus/pegasus.cpp:2450
-msgid "Display/Hide Biochip Tray"
-msgstr "Visa/dölj biochip"
-
-#: engines/pegasus/pegasus.cpp:2451
-msgid "Action/Select"
-msgstr "Handling/Välj"
-
-#: engines/pegasus/pegasus.cpp:2452
-msgid "Toggle Center Data Display"
-msgstr "Aktivera centrerad dataskärm"
-
-#: engines/pegasus/pegasus.cpp:2453
-msgid "Display/Hide Info Screen"
-msgstr "Visa/dölj informationsskärm"
-
-#: engines/pegasus/pegasus.cpp:2454
-msgid "Display/Hide Pause Menu"
-msgstr "Visa/dölj pausmeny"
-
-#: engines/pegasus/pegasus.cpp:2455
-msgid "???"
-msgstr "???"
-
-#: audio/fmopl.cpp:49
-msgid "MAME OPL emulator"
-msgstr "MAME OPL-emulator"
-
-#: audio/fmopl.cpp:51
-msgid "DOSBox OPL emulator"
-msgstr "DOSBox OPL-emulator"
-
-#: audio/mididrv.cpp:209
-#, c-format
-msgid ""
-"The selected audio device '%s' was not found (e.g. might be turned off or "
-"disconnected)."
-msgstr ""
-"Den valda ljudenheten '%s' kunde inte hittas (möjligtvis avstängd eller "
-"frånkopplad)."
-
-#: audio/mididrv.cpp:209 audio/mididrv.cpp:221 audio/mididrv.cpp:257
-#: audio/mididrv.cpp:272
-msgid "Attempting to fall back to the next available device..."
-msgstr "Försöker använda nästa tillgängliga ljudenhet..."
-
-#: audio/mididrv.cpp:221
-#, c-format
-msgid ""
-"The selected audio device '%s' cannot be used. See log file for more "
-"information."
-msgstr ""
-"Den valda ljudenheten '%s' kan inte användas. Se loggfilen för mer "
-"information."
-
-#: audio/mididrv.cpp:257
-#, c-format
-msgid ""
-"The preferred audio device '%s' was not found (e.g. might be turned off or "
-"disconnected)."
-msgstr ""
-"Den föredragna ljudenheten '%s' kunde inte hittas (möjligtvis avstängd eller "
-"frånkopplad)."
-
-#: audio/mididrv.cpp:272
-#, c-format
-msgid ""
-"The preferred audio device '%s' cannot be used. See log file for more "
-"information."
-msgstr ""
-"Den föredragna ljudenheten '%s' kan inte användas. Se loggfilen för mer "
-"information."
-
-#: audio/null.h:43
-msgid "No music"
-msgstr "Ingen musik"
-
-#: audio/mods/paula.cpp:189
-msgid "Amiga Audio Emulator"
-msgstr "Amiga ljudemulator"
-
-#: audio/softsynth/adlib.cpp:2284
-msgid "AdLib Emulator"
-msgstr "AdLib-emulator"
-
-#: audio/softsynth/appleiigs.cpp:33
-msgid "Apple II GS Emulator (NOT IMPLEMENTED)"
-msgstr "Apple II GS-emulator (INTE IMPLEMENTERAD)"
-
-#: audio/softsynth/sid.cpp:1430
-msgid "C64 Audio Emulator"
-msgstr "C64 ljudemulator"
-
-#: audio/softsynth/mt32.cpp:205
-msgid "Initializing MT-32 Emulator"
-msgstr "Initialiserar MT-32 emulator"
-
-#: audio/softsynth/mt32.cpp:431
-msgid "MT-32 Emulator"
-msgstr "MT-32 emulator"
-
-#: audio/softsynth/pcspk.cpp:139
-msgid "PC Speaker Emulator"
-msgstr "PC Speaker-emulator"
-
-#: audio/softsynth/pcspk.cpp:158
-msgid "IBM PCjr Emulator"
-msgstr "IBM PCjr-emulator"
-
-#: backends/keymapper/remap-dialog.cpp:47
-msgid "Keymap:"
-msgstr "Tangenter:"
-
-#: backends/keymapper/remap-dialog.cpp:66
-msgid " (Effective)"
-msgstr "(Effektiv)"
-
-#: backends/keymapper/remap-dialog.cpp:106
-msgid " (Active)"
-msgstr "(Aktiv)"
-
-#: backends/keymapper/remap-dialog.cpp:106
-msgid " (Blocked)"
-msgstr "(Blockerad)"
-
-#: backends/keymapper/remap-dialog.cpp:119
-msgid " (Global)"
-msgstr "(Global)"
-
-#: backends/keymapper/remap-dialog.cpp:127
-msgid " (Game)"
-msgstr "(Spel)"
-
-#: backends/midi/windows.cpp:164
-msgid "Windows MIDI"
-msgstr "Windows MIDI"
-
-#: backends/platform/ds/arm9/source/dsoptions.cpp:57
-msgid "ScummVM Main Menu"
-msgstr "ScummVM huvudmeny"
-
-#: backends/platform/ds/arm9/source/dsoptions.cpp:63
-msgid "~L~eft handed mode"
-msgstr "~V~änsterhänt läge"
-
-#: backends/platform/ds/arm9/source/dsoptions.cpp:64
-msgid "~I~ndy fight controls"
-msgstr "~I~ndy slagsmålskontroller"
-
-#: backends/platform/ds/arm9/source/dsoptions.cpp:65
-msgid "Show mouse cursor"
-msgstr "Visa muspekare"
-
-#: backends/platform/ds/arm9/source/dsoptions.cpp:66
-msgid "Snap to edges"
-msgstr "Lägg till kant"
-
-#: backends/platform/ds/arm9/source/dsoptions.cpp:68
-msgid "Touch X Offset"
-msgstr "Gå till X-position"
-
-#: backends/platform/ds/arm9/source/dsoptions.cpp:75
-msgid "Touch Y Offset"
-msgstr "Gå till Y-position"
-
-#: backends/platform/ds/arm9/source/dsoptions.cpp:87
-msgid "Use laptop trackpad-style cursor control"
-msgstr "Använd bärbar trackpad-stil för pekarkontroll"
-
-#: backends/platform/ds/arm9/source/dsoptions.cpp:88
-msgid "Tap for left click, double tap right click"
-msgstr "Tappa för vänsterklick, dubbel-tappa för högerklick"
-
-#: backends/platform/ds/arm9/source/dsoptions.cpp:90
-msgid "Sensitivity"
-msgstr "Känslighet"
-
-#: backends/platform/ds/arm9/source/dsoptions.cpp:99
-msgid "Initial top screen scale:"
-msgstr "Standardskala för övre skärm:"
-
-#: backends/platform/ds/arm9/source/dsoptions.cpp:105
-msgid "Main screen scaling:"
-msgstr "Skalning huvudskärm:"
-
-#: backends/platform/ds/arm9/source/dsoptions.cpp:107
-msgid "Hardware scale (fast, but low quality)"
-msgstr "Hårdvaruskalning (snabbt, men låg kvalitet)"
-
-#: backends/platform/ds/arm9/source/dsoptions.cpp:108
-msgid "Software scale (good quality, but slower)"
-msgstr "Mjukvaruskalning (bra kvalitet, men långsamt)"
-
-#: backends/platform/ds/arm9/source/dsoptions.cpp:109
-msgid "Unscaled (you must scroll left and right)"
-msgstr "Oskalat (du måste bläddra till vänster och höger)"
-
-#: backends/platform/ds/arm9/source/dsoptions.cpp:111
-msgid "Brightness:"
-msgstr "Ljusstyrka:"
-
-#: backends/platform/ds/arm9/source/dsoptions.cpp:121
-msgid "High quality audio (slower) (reboot)"
-msgstr "Hög ljudkvalitet (långsammare) (omstart)"
-
-#: backends/platform/ds/arm9/source/dsoptions.cpp:122
-msgid "Disable power off"
-msgstr "Inaktivera strömsparning"
-
-#: backends/platform/iphone/osys_events.cpp:300
-msgid "Mouse-click-and-drag mode enabled."
-msgstr "Dra-och-släpp-läge med mus aktiverat."
-
-#: backends/platform/iphone/osys_events.cpp:302
-msgid "Mouse-click-and-drag mode disabled."
-msgstr "Dra-och-släpp-läge med mus deaktiverat."
-
-#: backends/platform/iphone/osys_events.cpp:313
-msgid "Touchpad mode enabled."
-msgstr "Touchpad-läge aktiverat."
-
-#: backends/platform/iphone/osys_events.cpp:315
-msgid "Touchpad mode disabled."
-msgstr "Touchpad-läge inaktiverat."
-
-#: backends/platform/maemo/maemo.cpp:209
-msgid "Click Mode"
-msgstr "Klickläge"
-
-#: backends/platform/maemo/maemo.cpp:215
-#: 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/maemo/maemo.cpp:218
-msgid "Middle Click"
-msgstr "Mittenklick"
-
-#: backends/platform/maemo/maemo.cpp:221
-#: 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"
-
-#: backends/platform/sdl/macosx/appmenu_osx.mm:77
-msgid "Hide ScummVM"
-msgstr "Göm ScummVM"
-
-#: backends/platform/sdl/macosx/appmenu_osx.mm:82
-msgid "Hide Others"
-msgstr "Göm övriga"
-
-#: backends/platform/sdl/macosx/appmenu_osx.mm:87
-msgid "Show All"
-msgstr "Visa alla"
-
-#: backends/platform/sdl/macosx/appmenu_osx.mm:109
-#: backends/platform/sdl/macosx/appmenu_osx.mm:120
-msgid "Window"
-msgstr "Fönster"
-
-#: backends/platform/sdl/macosx/appmenu_osx.mm:114
-msgid "Minimize"
-msgstr "Minimera"
-
-#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:45
-msgid "Normal (no scaling)"
-msgstr "Normalt (ingen skalning)"
-
-#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:64
-msgctxt "lowres"
-msgid "Normal (no scaling)"
-msgstr "Normalt (ingen skalning)"
-
-#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2135
-#: backends/graphics/openglsdl/openglsdl-graphics.cpp:537
-msgid "Enabled aspect ratio correction"
-msgstr "Korrektion av bildförhållande på"
-
-#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2141
-#: backends/graphics/openglsdl/openglsdl-graphics.cpp:542
-msgid "Disabled aspect ratio correction"
-msgstr "Korrektion av bildförhållande av"
-
-#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2196
-msgid "Active graphics filter:"
-msgstr "Aktivt grafikfilter:"
-
-#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2238
-#: backends/graphics/openglsdl/openglsdl-graphics.cpp:481
-msgid "Windowed mode"
-msgstr "Fönsterläge"
-
-#: backends/graphics/opengl/opengl-graphics.cpp:135
-msgid "OpenGL Normal"
-msgstr "OpenGL normal"
-
-#: backends/graphics/opengl/opengl-graphics.cpp:136
-msgid "OpenGL Conserve"
-msgstr "OpenGL konservation"
-
-#: backends/graphics/opengl/opengl-graphics.cpp:137
-msgid "OpenGL Original"
-msgstr "OpenGL original"
-
-#: backends/graphics/openglsdl/openglsdl-graphics.cpp:415
-msgid "Current display mode"
-msgstr "Nuvarande visningsläge"
-
-#: backends/graphics/openglsdl/openglsdl-graphics.cpp:428
-msgid "Current scale"
-msgstr "Nuvarande skala"
-
-#: backends/graphics/openglsdl/openglsdl-graphics.cpp:562
-msgid "Active filter mode: Linear"
-msgstr "Aktivt filterläge: Linjärt"
-
-#: backends/graphics/openglsdl/openglsdl-graphics.cpp:564
-msgid "Active filter mode: Nearest"
-msgstr "Aktivt filterläge: Närmast"
-
-#: backends/platform/symbian/src/SymbianActions.cpp:38
-#: backends/platform/wince/CEActionsSmartphone.cpp:39
-msgid "Up"
-msgstr "Upp"
-
-#: backends/platform/symbian/src/SymbianActions.cpp:39
-#: backends/platform/wince/CEActionsSmartphone.cpp:40
-msgid "Down"
-msgstr "Ned"
-
-#: backends/platform/symbian/src/SymbianActions.cpp:40
-#: backends/platform/wince/CEActionsSmartphone.cpp:41
-msgid "Left"
-msgstr "Vänster"
-
-#: backends/platform/symbian/src/SymbianActions.cpp:41
-#: backends/platform/wince/CEActionsSmartphone.cpp:42
-msgid "Right"
-msgstr "Höger"
-
-#: backends/platform/symbian/src/SymbianActions.cpp:46
-#: backends/platform/wince/CEActionsSmartphone.cpp:47
-msgid "Zone"
-msgstr "Zon"
-
-#: backends/platform/symbian/src/SymbianActions.cpp:47
-#: backends/platform/wince/CEActionsPocket.cpp:54
-#: backends/platform/wince/CEActionsSmartphone.cpp:48
-msgid "Multi Function"
-msgstr "Multifunktion"
-
-#: backends/platform/symbian/src/SymbianActions.cpp:48
-msgid "Swap character"
-msgstr "Byt karaktär"
-
-#: backends/platform/symbian/src/SymbianActions.cpp:49
-msgid "Skip text"
-msgstr "Skippa text"
-
-#: backends/platform/symbian/src/SymbianActions.cpp:51
-msgid "Fast mode"
-msgstr "Snabbläge"
-
-#: backends/platform/symbian/src/SymbianActions.cpp:53
-msgid "Debugger"
-msgstr "Debug-konsol"
-
-#: backends/platform/symbian/src/SymbianActions.cpp:54
-msgid "Global menu"
-msgstr "Global meny"
-
-#: backends/platform/symbian/src/SymbianActions.cpp:55
-msgid "Virtual keyboard"
-msgstr "Virtuellt tangentbord"
-
-#: backends/platform/symbian/src/SymbianActions.cpp:56
-msgid "Key mapper"
-msgstr "Tangentinst."
-
-#: backends/events/symbiansdl/symbiansdl-events.cpp:184
-msgid "Do you want to quit ?"
-msgstr "Vill du avsluta?"
-
-#: backends/platform/wii/options.cpp:51
-msgid "Video"
-msgstr "Video"
-
-#: backends/platform/wii/options.cpp:54
-msgid "Current video mode:"
-msgstr "Aktivt videoläge:"
-
-#: backends/platform/wii/options.cpp:56
-msgid "Double-strike"
-msgstr "Ej sammanflätad"
-
-#: backends/platform/wii/options.cpp:60
-msgid "Horizontal underscan:"
-msgstr "Vågrät underskanning:"
-
-#: backends/platform/wii/options.cpp:66
-msgid "Vertical underscan:"
-msgstr "Lodrät underskanning:"
-
-#: backends/platform/wii/options.cpp:71
-msgid "Input"
-msgstr "Ingång"
-
-#: backends/platform/wii/options.cpp:74
-msgid "GC Pad sensitivity:"
-msgstr "GC Pad känslighet:"
-
-#: backends/platform/wii/options.cpp:80
-msgid "GC Pad acceleration:"
-msgstr "GC Pad acceleration:"
-
-#: backends/platform/wii/options.cpp:86
-msgid "DVD"
-msgstr "DVD"
-
-#: backends/platform/wii/options.cpp:89 backends/platform/wii/options.cpp:101
-msgid "Status:"
-msgstr "Status:"
-
-#: backends/platform/wii/options.cpp:90 backends/platform/wii/options.cpp:102
-msgid "Unknown"
-msgstr "Okänd"
-
-#: backends/platform/wii/options.cpp:93
-msgid "Mount DVD"
-msgstr "Montera DVD"
-
-#: backends/platform/wii/options.cpp:94
-msgid "Unmount DVD"
-msgstr "Mata ut DVD"
-
-#: backends/platform/wii/options.cpp:98
-msgid "SMB"
-msgstr "SMB"
-
-#: backends/platform/wii/options.cpp:106
-msgid "Server:"
-msgstr "Server:"
-
-#: backends/platform/wii/options.cpp:110
-msgid "Share:"
-msgstr "Delad:"
-
-#: backends/platform/wii/options.cpp:114
-msgid "Username:"
-msgstr "Anv. namn:"
-
-#: backends/platform/wii/options.cpp:118
-msgid "Password:"
-msgstr "Lösenord:"
-
-#: backends/platform/wii/options.cpp:121
-msgid "Init network"
-msgstr "Init. nätverk"
-
-#: backends/platform/wii/options.cpp:123
-msgid "Mount SMB"
-msgstr "Montera SMB"
-
-#: backends/platform/wii/options.cpp:124
-msgid "Unmount SMB"
-msgstr "Mata ut SMB"
-
-#: backends/platform/wii/options.cpp:143
-msgid "DVD Mounted successfully"
-msgstr "Montering av DVD lyckades"
-
-#: backends/platform/wii/options.cpp:146
-msgid "Error while mounting the DVD"
-msgstr "Fel vid montering av DVD"
-
-#: backends/platform/wii/options.cpp:148
-msgid "DVD not mounted"
-msgstr "DVD ej monterad"
-
-#: backends/platform/wii/options.cpp:161
-msgid "Network up, share mounted"
-msgstr "Nätverk aktivt, delade kataloger monterade"
-
-#: backends/platform/wii/options.cpp:163
-msgid "Network up"
-msgstr "Nätverk aktivt"
-
-#: backends/platform/wii/options.cpp:166
-msgid ", error while mounting the share"
-msgstr ", fel under montering av delade kataloger"
-
-#: backends/platform/wii/options.cpp:168
-msgid ", share not mounted"
-msgstr ", delade kataloger ej monterade"
-
-#: backends/platform/wii/options.cpp:174
-msgid "Network down"
-msgstr "Nätverk inaktivt"
-
-#: backends/platform/wii/options.cpp:178
-msgid "Initializing network"
-msgstr "Initialiserar nätverk"
-
-#: backends/platform/wii/options.cpp:182
-msgid "Timeout while initializing network"
-msgstr "Timeout under initialisering av nätverk"
-
-#: backends/platform/wii/options.cpp:186
-#, c-format
-msgid "Network not initialized (%d)"
-msgstr "Nätverk ej initialiserat (%d)"
-
-#: backends/platform/wince/CEActionsPocket.cpp:46
-msgid "Hide Toolbar"
-msgstr "Göm verktygsrad"
-
-#: backends/platform/wince/CEActionsPocket.cpp:47
-msgid "Show Keyboard"
-msgstr "Visa tangentbord"
-
-#: backends/platform/wince/CEActionsPocket.cpp:48
-msgid "Sound on/off"
-msgstr "Ljud av/på"
-
-#: backends/platform/wince/CEActionsPocket.cpp:49
-msgid "Right click"
-msgstr "Högerklick"
-
-#: backends/platform/wince/CEActionsPocket.cpp:50
-msgid "Show/Hide Cursor"
-msgstr "Göm/visa pekare"
-
-#: backends/platform/wince/CEActionsPocket.cpp:51
-msgid "Free look"
-msgstr "Frititt"
-
-#: backends/platform/wince/CEActionsPocket.cpp:52
-msgid "Zoom up"
-msgstr "Zooma upp"
-
-#: backends/platform/wince/CEActionsPocket.cpp:53
-msgid "Zoom down"
-msgstr "Zooma ned"
-
-#: backends/platform/wince/CEActionsPocket.cpp:55
-#: backends/platform/wince/CEActionsSmartphone.cpp:49
-msgid "Bind Keys"
-msgstr "Förbind tangenter"
-
-#: backends/platform/wince/CEActionsPocket.cpp:56
-msgid "Cursor Up"
-msgstr "Pekare upp"
-
-#: backends/platform/wince/CEActionsPocket.cpp:57
-msgid "Cursor Down"
-msgstr "Pekare ned"
-
-#: backends/platform/wince/CEActionsPocket.cpp:58
-msgid "Cursor Left"
-msgstr "Pekare vänster"
-
-#: backends/platform/wince/CEActionsPocket.cpp:59
-msgid "Cursor Right"
-msgstr "Pekare höger"
-
-#: 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: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?"
-
-#: backends/platform/wince/CEActionsSmartphone.cpp:50
-msgid "Keyboard"
-msgstr "Tangentbord"
-
-#: backends/platform/wince/CEActionsSmartphone.cpp:51
-msgid "Rotate"
-msgstr "Rotera"
-
-#: backends/platform/wince/CELauncherDialog.cpp:56
-msgid "Using SDL driver "
-msgstr "Använd SDL-driver"
-
-#: backends/platform/wince/CELauncherDialog.cpp:60
-msgid "Display "
-msgstr "Skärm"
-
-#: 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:515
-msgid "Map right click action"
-msgstr "Ställ in högerklick"
-
-#: 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:528
-msgid "Map hide toolbar action"
-msgstr "Ställ in göm verktygsrad"
-
-#: 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:541
-msgid "Map Zoom Up action (optional)"
-msgstr "Ställ in Zooma up (valfritt)"
-
-#: 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:552
-msgid ""
-"Don't forget to map a key to 'Hide Toolbar' action to see the whole inventory"
-msgstr ""
-"Glöm inte att välja en tangent för \"Göm verktygsrad\" för att se hela "
-"inventariet"
-
-#: backends/events/default/default-events.cpp:193
-msgid "Do you really want to return to the Launcher?"
-msgstr "Vill du verkligen återgå till launchern?"
-
-#: backends/events/default/default-events.cpp:193
-msgid "Launcher"
-msgstr "Launcher"
-
-#: backends/events/default/default-events.cpp:215
-msgid "Do you really want to quit?"
-msgstr "Vill du verkligen avsluta?"
-
-#: backends/events/gph/gph-events.cpp:386
-#: backends/events/gph/gph-events.cpp:429
-#: backends/events/openpandora/op-events.cpp:168
-msgid "Touchscreen 'Tap Mode' - Left Click"
-msgstr "Touchscreen \"Tap-läge\" - Vänsterklick"
-
-#: backends/events/gph/gph-events.cpp:388
-#: backends/events/gph/gph-events.cpp:431
-#: backends/events/openpandora/op-events.cpp:170
-msgid "Touchscreen 'Tap Mode' - Right Click"
-msgstr "Touchscren \"Tap-läge\" - Högerklick"
-
-#: backends/events/gph/gph-events.cpp:390
-#: backends/events/gph/gph-events.cpp:433
-#: backends/events/openpandora/op-events.cpp:172
-msgid "Touchscreen 'Tap Mode' - Hover (No Click)"
-msgstr "Touchscreen \"Tap-läge\" - Hover (utan klick)"
-
-#: backends/events/gph/gph-events.cpp:410
-msgid "Maximum Volume"
-msgstr "Max. volym"
+#~ msgctxt "lowres"
+#~ msgid "Mass Add..."
+#~ msgstr "Masstillägg..."
-#: backends/events/gph/gph-events.cpp:412
-msgid "Increasing Volume"
-msgstr "Höja volymen"
+#~ msgid "Mass Add..."
+#~ msgstr "Masstillägg..."
-#: backends/events/gph/gph-events.cpp:418
-msgid "Minimal Volume"
-msgstr "Min. volym"
+#~ msgid ""
+#~ "Turns off General MIDI mapping for games with Roland MT-32 soundtrack"
+#~ msgstr ""
+#~ "Stänger av General MIDI-kartläggning för spel med Roland MT-32 soundtrack"
-#: backends/events/gph/gph-events.cpp:420
-msgid "Decreasing Volume"
-msgstr "Sänka volymen"
+#~ msgid "Standard (16bpp)"
+#~ msgstr "Standard (16 bpp)"
-#: backends/events/openpandora/op-events.cpp:174
-msgid "Touchscreen 'Tap Mode' - Hover (DPad Clicks)"
-msgstr "Touchscreen 'Tap-läge' - Hover (DPad klick)"
+#~ msgid "Alternative intro"
+#~ msgstr "Alternativt intro"
-#: backends/updates/macosx/macosx-updates.mm:67
-msgid "Check for Updates..."
-msgstr "Sök efter uppdateringar..."
+#~ msgid "Use an alternative game intro (CD version only)"
+#~ msgstr "Använd alternativt spelintro (endast CD-version)"
-#: backends/platform/bada/form.cpp:269
-msgid "Right Click Once"
-msgstr "Ett högerklick"
+#~ msgid "MPEG2 cutscenes are no longer supported"
+#~ msgstr "MPEG2 filmscener stöds inte längre"
-#: backends/platform/bada/form.cpp:277
-msgid "Move Only"
-msgstr "Endast rörelse"
+#~ msgid "OpenGL Normal"
+#~ msgstr "OpenGL normal"
-#: backends/platform/bada/form.cpp:291
-msgid "Escape Key"
-msgstr "Escape-tangenten"
+#~ msgid "OpenGL Conserve"
+#~ msgstr "OpenGL konservation"
-#: backends/platform/bada/form.cpp:296
-msgid "Game Menu"
-msgstr "Spelmeny"
+#~ msgid "OpenGL Original"
+#~ msgstr "OpenGL original"
-#: backends/platform/bada/form.cpp:301
-msgid "Show Keypad"
-msgstr "Visa tangentbord"
+#~ msgid "Current display mode"
+#~ msgstr "Nuvarande visningsläge"
-#: backends/platform/bada/form.cpp:309
-msgid "Control Mouse"
-msgstr "Kontrollera musen"
+#~ msgid "Current scale"
+#~ msgstr "Nuvarande skala"
-#: backends/events/maemosdl/maemosdl-events.cpp:192
-msgid "Clicking Enabled"
-msgstr "Klickning aktiverad"
+#~ msgid "Active filter mode: Linear"
+#~ msgstr "Aktivt filterläge: Linjärt"
-#: backends/events/maemosdl/maemosdl-events.cpp:192
-msgid "Clicking Disabled"
-msgstr "Klickning deaktiverad"
+#~ msgid "Active filter mode: Nearest"
+#~ msgstr "Aktivt filterläge: Närmast"
#~ msgid "Enable Roland GS Mode"
#~ msgstr "Aktivera Roland GS-läge"
diff --git a/po/uk_UA.po b/po/uk_UA.po
index 2a42ff47d9..913d2a3ca4 100644
--- a/po/uk_UA.po
+++ b/po/uk_UA.po
@@ -1,5 +1,5 @@
# Ukrainian translation for ScummVM.
-# Copyright (C) 2010-2013 ScummVM Team
+# Copyright (C) 2010-2014 ScummVM Team
# This file is distributed under the same license as the ScummVM package.
# Lubomyr Lisen, 2010.
#
@@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: ScummVM 1.3.0svn\n"
"Report-Msgid-Bugs-To: scummvm-devel@lists.sf.net\n"
-"POT-Creation-Date: 2013-04-24 13:35+0100\n"
+"POT-Creation-Date: 2014-06-07 23:06+0100\n"
"PO-Revision-Date: 2013-05-05 23:26+0200\n"
"Last-Translator: Eugene Sandulenko <sev@scummvm.org>\n"
"Language-Team: Ukrainian\n"
@@ -18,77 +18,77 @@ msgstr ""
"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:93
+#: gui/about.cpp:94
#, c-format
msgid "(built on %s)"
msgstr "(×öÑàÐÝØÙ %s)"
-#: gui/about.cpp:100
+#: gui/about.cpp:101
msgid "Features compiled in:"
msgstr "²ÚÛîçÕÝö Ò ÑöÛÔ Þßæö÷:"
-#: gui/about.cpp:109
+#: gui/about.cpp:110
msgid "Available engines:"
msgstr "´ÞáâãßÝö ÔÒØÖÚØ:"
-#: gui/browser.cpp:67
+#: gui/browser.cpp:68
msgid "Show hidden files"
msgstr "¿ÞÚÐ×ÐâØ cåÞÒÐÝö äÐÙÛö"
-#: gui/browser.cpp:67
+#: gui/browser.cpp:68
msgid "Show files marked with the hidden attribute"
msgstr "¿ÞÚÐ×ãô äÐÙÛØ ïÚö ßÞÜöçÕÝÞ ïÚ áåÞÒÐÝö"
-#: gui/browser.cpp:71
+#: gui/browser.cpp:72
msgid "Go up"
msgstr "²ÓÞàã"
-#: gui/browser.cpp:71 gui/browser.cpp:73
+#: gui/browser.cpp:72 gui/browser.cpp:74
msgid "Go to previous directory level"
msgstr "¿ÕàÕÙâØ ÝÐ ßÐßÚã àöÒÝÕÜ ÒØéÕ"
-#: gui/browser.cpp:73
+#: gui/browser.cpp:74
msgctxt "lowres"
msgid "Go up"
msgstr "²ÓÞàã"
-#: gui/browser.cpp:74 gui/chooser.cpp:45 gui/KeysDialog.cpp:43
-#: gui/launcher.cpp:345 gui/massadd.cpp:94 gui/options.cpp:1238
-#: gui/saveload-dialog.cpp:215 gui/saveload-dialog.cpp:275
-#: gui/saveload-dialog.cpp:545 gui/saveload-dialog.cpp:919
-#: gui/themebrowser.cpp:54 gui/fluidsynth-dialog.cpp:151
-#: engines/engine.cpp:447 engines/drascula/saveload.cpp:51
-#: engines/scumm/dialogs.cpp:190 engines/sword1/control.cpp:865
-#: engines/parallaction/saveload.cpp:274 backends/platform/wii/options.cpp:48
-#: backends/events/default/default-events.cpp:193
-#: backends/events/default/default-events.cpp:215
+#: gui/browser.cpp:75 gui/chooser.cpp:46 gui/KeysDialog.cpp:43
+#: gui/launcher.cpp:351 gui/massadd.cpp:95 gui/options.cpp:1239
+#: gui/saveload-dialog.cpp:216 gui/saveload-dialog.cpp:276
+#: gui/saveload-dialog.cpp:547 gui/saveload-dialog.cpp:922
+#: gui/themebrowser.cpp:55 gui/fluidsynth-dialog.cpp:152
+#: engines/engine.cpp:452 backends/platform/wii/options.cpp:48
+#: backends/events/default/default-events.cpp:196
+#: backends/events/default/default-events.cpp:218
+#: engines/drascula/saveload.cpp:49 engines/parallaction/saveload.cpp:274
+#: engines/scumm/dialogs.cpp:191 engines/sword1/control.cpp:865
msgid "Cancel"
msgstr "²öÔÜöÝÐ"
-#: gui/browser.cpp:75 gui/chooser.cpp:46 gui/themebrowser.cpp:55
+#: gui/browser.cpp:76 gui/chooser.cpp:47 gui/themebrowser.cpp:56
msgid "Choose"
msgstr "²ØÑàÐâØ"
-#: gui/gui-manager.cpp:115 engines/scumm/help.cpp:125
-#: engines/scumm/help.cpp:140 engines/scumm/help.cpp:165
-#: engines/scumm/help.cpp:191 engines/scumm/help.cpp:209
-#: backends/keymapper/remap-dialog.cpp:52
+#: gui/gui-manager.cpp:117 backends/keymapper/remap-dialog.cpp:53
+#: engines/scumm/help.cpp:125 engines/scumm/help.cpp:140
+#: engines/scumm/help.cpp:165 engines/scumm/help.cpp:191
+#: engines/scumm/help.cpp:209
msgid "Close"
msgstr "·ÐÚàØâØ"
-#: gui/gui-manager.cpp:118
+#: gui/gui-manager.cpp:120
msgid "Mouse click"
msgstr "ºÛöÚ ÜØèÚÞî"
-#: gui/gui-manager.cpp:122 base/main.cpp:301
+#: gui/gui-manager.cpp:124 base/main.cpp:319
msgid "Display keyboard"
msgstr "¿ÞÚÐ×ÐâØ ÚÛÐÒöÐâãàã"
-#: gui/gui-manager.cpp:126 base/main.cpp:305
+#: gui/gui-manager.cpp:128 base/main.cpp:323
msgid "Remap keys"
msgstr "¿ÕàÕßàØ×ÝÐçØâØ ÚÛÐÒöèö"
-#: gui/gui-manager.cpp:129 base/main.cpp:308
+#: gui/gui-manager.cpp:131 base/main.cpp:326
msgid "Toggle FullScreen"
msgstr "¿ÕàÕÜÚÝãâØ ßÞÒÝÞÕÚàÐÝÝØÙ àÕÖØÜ"
@@ -100,21 +100,21 @@ msgstr "²ØÑÕàöâì Ôöî ÔÛï ßàØ×ÝÐçÕÝÝï"
msgid "Map"
msgstr "¿àØ×ÝÐçØâØ"
-#: gui/KeysDialog.cpp:42 gui/launcher.cpp:346 gui/launcher.cpp:1001
-#: gui/launcher.cpp:1005 gui/massadd.cpp:91 gui/options.cpp:1239
-#: gui/saveload-dialog.cpp:920 gui/fluidsynth-dialog.cpp:152
-#: engines/engine.cpp:366 engines/engine.cpp:377
-#: engines/drascula/saveload.cpp:51 engines/scumm/dialogs.cpp:192
-#: engines/scumm/scumm.cpp:1778 engines/agos/animation.cpp:558
-#: engines/groovie/script.cpp:420 engines/sky/compact.cpp:131
-#: engines/sky/compact.cpp:141 engines/sword1/animation.cpp:519
-#: engines/sword1/animation.cpp:540 engines/sword1/animation.cpp:550
-#: engines/sword1/animation.cpp:557 engines/sword1/control.cpp:865
-#: engines/sword1/logic.cpp:1633 engines/sword2/animation.cpp:419
-#: engines/sword2/animation.cpp:439 engines/sword2/animation.cpp:449
-#: engines/sword2/animation.cpp:458 engines/parallaction/saveload.cpp:274
+#: gui/KeysDialog.cpp:42 gui/launcher.cpp:352 gui/launcher.cpp:1048
+#: gui/launcher.cpp:1052 gui/massadd.cpp:92 gui/options.cpp:1240
+#: gui/saveload-dialog.cpp:923 gui/fluidsynth-dialog.cpp:153
+#: engines/engine.cpp:371 engines/engine.cpp:382
#: backends/platform/wii/options.cpp:47
#: backends/platform/wince/CELauncherDialog.cpp:54
+#: engines/agos/animation.cpp:558 engines/drascula/saveload.cpp:49
+#: engines/groovie/script.cpp:399 engines/parallaction/saveload.cpp:274
+#: engines/scumm/dialogs.cpp:193 engines/scumm/scumm.cpp:1779
+#: engines/sky/compact.cpp:131 engines/sky/compact.cpp:141
+#: engines/sword1/animation.cpp:524 engines/sword1/animation.cpp:545
+#: engines/sword1/animation.cpp:561 engines/sword1/animation.cpp:569
+#: engines/sword1/control.cpp:865 engines/sword1/logic.cpp:1633
+#: engines/sword2/animation.cpp:425 engines/sword2/animation.cpp:445
+#: engines/sword2/animation.cpp:461 engines/sword2/animation.cpp:471
msgid "OK"
msgstr "OK"
@@ -140,15 +140,15 @@ msgstr "±ãÔì ÛÐáÚÐ, ÒØÑÕàöâì Ôöî"
msgid "Press the key to associate"
msgstr "½ÐâØáÝöâì ÚÛÐÒöèã ÔÛï ßàØ×ÝÐçÕÝÝï"
-#: gui/launcher.cpp:187
+#: gui/launcher.cpp:193
msgid "Game"
msgstr "³àÐ"
-#: gui/launcher.cpp:191
+#: gui/launcher.cpp:197
msgid "ID:"
msgstr "ID:"
-#: gui/launcher.cpp:191 gui/launcher.cpp:193 gui/launcher.cpp:194
+#: gui/launcher.cpp:197 gui/launcher.cpp:199 gui/launcher.cpp:200
msgid ""
"Short game identifier used for referring to savegames and running the game "
"from the command line"
@@ -156,29 +156,29 @@ msgstr ""
"ºÞàÞâÚØÙ öÔÕÝâØäöÚÐâÞà, ïÚØÙ ÒØÚÞàØáâÞÒãôâìáï ÔÛï ÝÐ×Ò ×ÑÕàÕÖÕÝØå öÓÞà ö ÔÛï "
"×ÐßãáÚã × ÚÞÜÐÝÔÝÞ÷ áâàöçÚØ"
-#: gui/launcher.cpp:193
+#: gui/launcher.cpp:199
msgctxt "lowres"
msgid "ID:"
msgstr "ID:"
-#: gui/launcher.cpp:198
+#: gui/launcher.cpp:204
msgid "Name:"
msgstr "½Ð×ÒÐ:"
-#: gui/launcher.cpp:198 gui/launcher.cpp:200 gui/launcher.cpp:201
+#: gui/launcher.cpp:204 gui/launcher.cpp:206 gui/launcher.cpp:207
msgid "Full title of the game"
msgstr "¿ÞÒÝÐ ÝÐ×ÒÐ ÓàØ"
-#: gui/launcher.cpp:200
+#: gui/launcher.cpp:206
msgctxt "lowres"
msgid "Name:"
msgstr "½Ð×ÒÐ:"
-#: gui/launcher.cpp:204
+#: gui/launcher.cpp:210
msgid "Language:"
msgstr "¼ÞÒÐ:"
-#: gui/launcher.cpp:204 gui/launcher.cpp:205
+#: gui/launcher.cpp:210 gui/launcher.cpp:211
msgid ""
"Language of the game. This will not turn your Spanish game version into "
"English"
@@ -186,286 +186,287 @@ msgstr ""
"¼ÞÒÐ ÓàØ. ·ÜöÝÐ æìÞÓÞ ÝÐÛÐèâãÒÐÝÝï ÝÕ ßÕàÕâÒÞàØâì Óàã ÐÝÓÛöÙáìÚÞî ÝÐ "
"ãÚàÐ÷ÝáìÚã"
-#: gui/launcher.cpp:206 gui/launcher.cpp:220 gui/options.cpp:86
-#: gui/options.cpp:736 gui/options.cpp:749 gui/options.cpp:1209
-#: audio/null.cpp:40
+#: gui/launcher.cpp:212 gui/launcher.cpp:226 gui/options.cpp:87
+#: gui/options.cpp:737 gui/options.cpp:750 gui/options.cpp:1210
+#: audio/null.cpp:41
msgid "<default>"
msgstr "<×Ð ãÜÞÒçÐÝÝïÜ>"
-#: gui/launcher.cpp:216
+#: gui/launcher.cpp:222
msgid "Platform:"
msgstr "¿ÛÐâäÞàÜÐ:"
-#: gui/launcher.cpp:216 gui/launcher.cpp:218 gui/launcher.cpp:219
+#: gui/launcher.cpp:222 gui/launcher.cpp:224 gui/launcher.cpp:225
msgid "Platform the game was originally designed for"
msgstr "¿ÛÐâäÞàÜÐ, ÔÛï ïÚÞ÷ Óàã ÑãÛÞ àÞ×àÞÑÛÕÝÞ ßÞçÐâÚÞÒÞ"
-#: gui/launcher.cpp:218
+#: gui/launcher.cpp:224
msgctxt "lowres"
msgid "Platform:"
msgstr "¿ÛÐâäÞàÜÐ:"
-#: gui/launcher.cpp:231
+#: gui/launcher.cpp:237
msgid "Engine"
msgstr "´ÒØÖÞÚ"
-#: gui/launcher.cpp:239 gui/options.cpp:1072 gui/options.cpp:1089
+#: gui/launcher.cpp:245 gui/options.cpp:1073 gui/options.cpp:1090
msgid "Graphics"
msgstr "³àÐäöÚÐ"
-#: gui/launcher.cpp:239 gui/options.cpp:1072 gui/options.cpp:1089
+#: gui/launcher.cpp:245 gui/options.cpp:1073 gui/options.cpp:1090
msgid "GFX"
msgstr "³àä"
-#: gui/launcher.cpp:242
+#: gui/launcher.cpp:248
msgid "Override global graphic settings"
msgstr "¿ÕàÕÚàØâØ ÓÛÞÑÐÛìÝö ãáâÐÝÞÒÚØ ÓàÐäöÚØ"
-#: gui/launcher.cpp:244
+#: gui/launcher.cpp:250
msgctxt "lowres"
msgid "Override global graphic settings"
msgstr "¿ÕàÕÚàØâØ ÓÛÞÑÐÛìÝö ãáâÐÝÞÒÚØ ÓàÐäöÚØ"
-#: gui/launcher.cpp:251 gui/options.cpp:1095
+#: gui/launcher.cpp:257 gui/options.cpp:1096
msgid "Audio"
msgstr "°ãÔöÞ"
-#: gui/launcher.cpp:254
+#: gui/launcher.cpp:260
msgid "Override global audio settings"
msgstr "¿ÕàÕÚàØâØ ÓÛÞÑÐÛìÝö ãáâÐÝÞÒÚØ ÐãÔöÞ"
-#: gui/launcher.cpp:256
+#: gui/launcher.cpp:262
msgctxt "lowres"
msgid "Override global audio settings"
msgstr "¿ÕàÕÚàØâØ ÓÛÞÑÐÛìÝö ãáâÐÝÞÒÚØ ÐãÔöÞ"
-#: gui/launcher.cpp:265 gui/options.cpp:1100
+#: gui/launcher.cpp:271 gui/options.cpp:1101
msgid "Volume"
msgstr "³ãçÝöáâì"
-#: gui/launcher.cpp:267 gui/options.cpp:1102
+#: gui/launcher.cpp:273 gui/options.cpp:1103
msgctxt "lowres"
msgid "Volume"
msgstr "³ãçÝ."
-#: gui/launcher.cpp:270
+#: gui/launcher.cpp:276
msgid "Override global volume settings"
msgstr "¿ÕàÕÚàØâØ ÓÛÞÑÐÛìÝö ãáâÐÝÞÒÚØ ÓãçÝÞáâö"
-#: gui/launcher.cpp:272
+#: gui/launcher.cpp:278
msgctxt "lowres"
msgid "Override global volume settings"
msgstr "¿ÕàÕÚàØâØ ÓÛÞÑÐÛìÝö ãáâÐÝÞÒÚØ ÓãçÝÞáâö"
-#: gui/launcher.cpp:280 gui/options.cpp:1110
+#: gui/launcher.cpp:286 gui/options.cpp:1111
msgid "MIDI"
msgstr "MIDI"
-#: gui/launcher.cpp:283
+#: gui/launcher.cpp:289
msgid "Override global MIDI settings"
msgstr "¿ÕàÕÚàØâØ ÓÛÞÑÐÛìÝö ãáâÐÝÞÒÚØ MIDI"
-#: gui/launcher.cpp:285
+#: gui/launcher.cpp:291
msgctxt "lowres"
msgid "Override global MIDI settings"
msgstr "¿ÕàÕÚàØâØ ÓÛÞÑÐÛìÝö ãáâÐÝÞÒÚØ MIDI"
-#: gui/launcher.cpp:294 gui/options.cpp:1116
+#: gui/launcher.cpp:300 gui/options.cpp:1117
msgid "MT-32"
msgstr "MT-32"
-#: gui/launcher.cpp:297
+#: gui/launcher.cpp:303
msgid "Override global MT-32 settings"
msgstr "¿ÕàÕÚàØâØ ÓÛÞÑÐÛìÝö ãáâÐÝÞÒÚØ MT-32"
-#: gui/launcher.cpp:299
+#: gui/launcher.cpp:305
msgctxt "lowres"
msgid "Override global MT-32 settings"
msgstr "¿ÕàÕÚàØâØ ÓÛÞÑÐÛìÝö ãáâÐÝÞÒÚØ MT-32"
-#: gui/launcher.cpp:308 gui/options.cpp:1123
+#: gui/launcher.cpp:314 gui/options.cpp:1124
msgid "Paths"
msgstr "ÈÛïåØ"
-#: gui/launcher.cpp:310 gui/options.cpp:1125
+#: gui/launcher.cpp:316 gui/options.cpp:1126
msgctxt "lowres"
msgid "Paths"
msgstr "ÈÛïåØ"
-#: gui/launcher.cpp:317
+#: gui/launcher.cpp:323
msgid "Game Path:"
msgstr "ÈÛïå ÔÞ ÓàØ:"
-#: gui/launcher.cpp:319
+#: gui/launcher.cpp:325
msgctxt "lowres"
msgid "Game Path:"
msgstr "ÈÛïå ÔÞ ÓàØ:"
-#: gui/launcher.cpp:324 gui/options.cpp:1149
+#: gui/launcher.cpp:330 gui/options.cpp:1150
msgid "Extra Path:"
msgstr "´ÞÔÐâÚ. èÛïå:"
-#: gui/launcher.cpp:324 gui/launcher.cpp:326 gui/launcher.cpp:327
+#: gui/launcher.cpp:330 gui/launcher.cpp:332 gui/launcher.cpp:333
msgid "Specifies path to additional data used the game"
msgstr "²ÚÐ×ãô èÛïå ÔÞ ÔÞÔÐâÚÞÒØå äÐÙÛöÒ ÔÐÝØå ÔÛï ÓàØ"
-#: gui/launcher.cpp:326 gui/options.cpp:1151
+#: gui/launcher.cpp:332 gui/options.cpp:1152
msgctxt "lowres"
msgid "Extra Path:"
msgstr "´ÞÔ. èÛïå:"
-#: gui/launcher.cpp:333 gui/options.cpp:1133
+#: gui/launcher.cpp:339 gui/options.cpp:1134
msgid "Save Path:"
msgstr "ÈÛïå ×ÑÕà.:"
-#: gui/launcher.cpp:333 gui/launcher.cpp:335 gui/launcher.cpp:336
-#: gui/options.cpp:1133 gui/options.cpp:1135 gui/options.cpp:1136
+#: gui/launcher.cpp:339 gui/launcher.cpp:341 gui/launcher.cpp:342
+#: gui/options.cpp:1134 gui/options.cpp:1136 gui/options.cpp:1137
msgid "Specifies where your savegames are put"
msgstr "²ÚÐ×ãô èÛïå ÔÞ ×ÑÕàÕÖÕÝì ÓàØ"
-#: gui/launcher.cpp:335 gui/options.cpp:1135
+#: gui/launcher.cpp:341 gui/options.cpp:1136
msgctxt "lowres"
msgid "Save Path:"
msgstr "ÈÛïå ×ÑÕà.:"
-#: gui/launcher.cpp:354 gui/launcher.cpp:453 gui/launcher.cpp:511
-#: gui/launcher.cpp:565 gui/options.cpp:1144 gui/options.cpp:1152
-#: gui/options.cpp:1161 gui/options.cpp:1276 gui/options.cpp:1282
-#: gui/options.cpp:1290 gui/options.cpp:1320 gui/options.cpp:1326
-#: gui/options.cpp:1333 gui/options.cpp:1426 gui/options.cpp:1429
-#: gui/options.cpp:1441
+#: gui/launcher.cpp:360 gui/launcher.cpp:459 gui/launcher.cpp:517
+#: gui/launcher.cpp:571 gui/options.cpp:1145 gui/options.cpp:1153
+#: gui/options.cpp:1162 gui/options.cpp:1277 gui/options.cpp:1283
+#: gui/options.cpp:1291 gui/options.cpp:1321 gui/options.cpp:1327
+#: gui/options.cpp:1334 gui/options.cpp:1427 gui/options.cpp:1430
+#: gui/options.cpp:1442
msgctxt "path"
msgid "None"
msgstr "½Õ ×ÐÒÔÐÝØÙ"
-#: gui/launcher.cpp:359 gui/launcher.cpp:459 gui/launcher.cpp:569
-#: gui/options.cpp:1270 gui/options.cpp:1314 gui/options.cpp:1432
+#: gui/launcher.cpp:365 gui/launcher.cpp:465 gui/launcher.cpp:575
+#: gui/options.cpp:1271 gui/options.cpp:1315 gui/options.cpp:1433
#: backends/platform/wii/options.cpp:56
msgid "Default"
msgstr "·Ð ãÜÞÒçÐÝÝïÜ"
-#: gui/launcher.cpp:504 gui/options.cpp:1435
+#: gui/launcher.cpp:510 gui/options.cpp:1436
msgid "Select SoundFont"
msgstr "²ØÑÕàöâì SoundFont"
-#: gui/launcher.cpp:523 gui/launcher.cpp:677
+#: gui/launcher.cpp:529 gui/launcher.cpp:682
msgid "Select directory with game data"
msgstr "²ØÑÕàöâì ßÐßÚã × äÐÙÛÐÜØ ÓàØ"
-#: gui/launcher.cpp:541
+#: gui/launcher.cpp:547
msgid "Select additional game directory"
msgstr "²ØÑÕàöâì ÔÞÔÐâÚÞÒã ßÐßÚã ÓàØ"
-#: gui/launcher.cpp:553
+#: gui/launcher.cpp:559
msgid "Select directory for saved games"
msgstr "²ØÑÕàöâì ßÐßÚã ÔÛï ×ÑÕàÕÖÕÝì"
-#: gui/launcher.cpp:580
+#: gui/launcher.cpp:586
msgid "This game ID is already taken. Please choose another one."
msgstr "ÆÕÙ ID ÓàØ ÒÖÕ ÒØÚÞàØáâÞÒãôâìáï. ±ãÔì ÛÐáÚÐ, ÒØÑÕàöâì öÝèØÙ."
-#: gui/launcher.cpp:621 engines/dialogs.cpp:110
+#: gui/launcher.cpp:626 engines/dialogs.cpp:111
msgid "~Q~uit"
msgstr "~²~ØåöÔ"
-#: gui/launcher.cpp:621 backends/platform/sdl/macosx/appmenu_osx.mm:95
+#: gui/launcher.cpp:626 backends/platform/sdl/macosx/appmenu_osx.mm:95
msgid "Quit ScummVM"
msgstr "²ØåöÔ ×ö ScummVM"
-#: gui/launcher.cpp:622
+#: gui/launcher.cpp:627
msgid "A~b~out..."
msgstr "¿àÞ ß~à~ÞÓàÐÜã..."
-#: gui/launcher.cpp:622 backends/platform/sdl/macosx/appmenu_osx.mm:69
+#: gui/launcher.cpp:627 backends/platform/sdl/macosx/appmenu_osx.mm:69
msgid "About ScummVM"
msgstr "¿àÞ ScummVM"
-#: gui/launcher.cpp:623
+#: gui/launcher.cpp:628
msgid "~O~ptions..."
msgstr "~½~ÐÛÐèâãÒÐÝÝï"
-#: gui/launcher.cpp:623
+#: gui/launcher.cpp:628
msgid "Change global ScummVM options"
msgstr "·ÜöÝØâØ ÓÛÞÑÐÛìÝö ÝÐÛÐèâãÒÐÝÝï ScummVM"
-#: gui/launcher.cpp:625
+#: gui/launcher.cpp:630
msgid "~S~tart"
msgstr "·~Ð~ßãáÚ"
-#: gui/launcher.cpp:625
+#: gui/launcher.cpp:630
msgid "Start selected game"
msgstr "·ÐßãáâØâØ ÒØÑàÐÝã Óàã"
-#: gui/launcher.cpp:628
+#: gui/launcher.cpp:633
msgid "~L~oad..."
msgstr "~·~ÐÒÐÝâÐÖØâØ..."
-#: gui/launcher.cpp:628
+#: gui/launcher.cpp:633
msgid "Load savegame for selected game"
msgstr "·ÐÒÐÝâÐÖØâØ ×ÑÕàÕÖÕÝÝï ÔÛï ÒØÑàÐÝÞ÷ ÓàØ"
-#: gui/launcher.cpp:633 gui/launcher.cpp:1120
+#: gui/launcher.cpp:638
msgid "~A~dd Game..."
msgstr "~´~ÞÔÐâØ Óàã..."
-#: gui/launcher.cpp:633 gui/launcher.cpp:640
+#: gui/launcher.cpp:638 gui/launcher.cpp:645
msgid "Hold Shift for Mass Add"
msgstr "ÃâàØÜãÙâÕ ÚÛÐÒöèã Shift ÔÛï âÞÓÞ, éÞÑ ÔÞÔÐâØ ÔÕÚöÛìÚÐ öÓÞà"
-#: gui/launcher.cpp:635
+#: gui/launcher.cpp:640
msgid "~E~dit Game..."
msgstr "ÀÕÔÐ~Ó~ãÒÐâØ Óàã"
-#: gui/launcher.cpp:635 gui/launcher.cpp:642
+#: gui/launcher.cpp:640 gui/launcher.cpp:647
msgid "Change game options"
msgstr "·ÜöÝØâØ ÝÐÛÐèâãÒÐÝÝï ÓàØ"
-#: gui/launcher.cpp:637
+#: gui/launcher.cpp:642
msgid "~R~emove Game"
msgstr "~²~ØÔÐ󯉯 Óàã"
-#: gui/launcher.cpp:637 gui/launcher.cpp:644
+#: gui/launcher.cpp:642 gui/launcher.cpp:649
msgid "Remove game from the list. The game data files stay intact"
msgstr "²ØÔÐ󯉯 Óàã ×ö áߨáÚã. ½Õ ÒØÔÐÛïô Óàã × ÖÞàáâÚÞÓÞ ÔØáÚã"
-#: gui/launcher.cpp:640 gui/launcher.cpp:1120
+#: gui/launcher.cpp:645
msgctxt "lowres"
msgid "~A~dd Game..."
msgstr "~´~ÞÔÐâØ Óàã..."
-#: gui/launcher.cpp:642
+#: gui/launcher.cpp:647
msgctxt "lowres"
msgid "~E~dit Game..."
msgstr "ÀÕÔÐ~Ó~. Óàã..."
-#: gui/launcher.cpp:644
+#: gui/launcher.cpp:649
msgctxt "lowres"
msgid "~R~emove Game"
msgstr "~²~ØÔÐ󯉯 Óàã"
-#: gui/launcher.cpp:652
+#: gui/launcher.cpp:657
msgid "Search in game list"
msgstr "¿ÞèãÚ ã áߨáÚã öÓÞà"
-#: gui/launcher.cpp:656 gui/launcher.cpp:1167
+#: gui/launcher.cpp:661 gui/launcher.cpp:1222
msgid "Search:"
msgstr "¿ÞèãÚ:"
-#: gui/launcher.cpp:680 engines/dialogs.cpp:114 engines/mohawk/myst.cpp:245
-#: engines/mohawk/riven.cpp:716 engines/cruise/menu.cpp:214
-#: engines/pegasus/pegasus.cpp:349
+#: gui/launcher.cpp:685 engines/dialogs.cpp:115 engines/cruise/menu.cpp:214
+#: engines/mohawk/myst.cpp:245 engines/mohawk/riven.cpp:718
+#: engines/pegasus/pegasus.cpp:353
msgid "Load game:"
msgstr "·ÐÒÐÝâÐÖØâØ Óàã:"
-#: gui/launcher.cpp:680 engines/dialogs.cpp:114 engines/scumm/dialogs.cpp:188
-#: engines/mohawk/myst.cpp:245 engines/mohawk/riven.cpp:716
-#: engines/cruise/menu.cpp:214 engines/pegasus/pegasus.cpp:349
+#: gui/launcher.cpp:685 engines/dialogs.cpp:115
#: backends/platform/wince/CEActionsPocket.cpp:267
#: backends/platform/wince/CEActionsSmartphone.cpp:231
+#: engines/cruise/menu.cpp:214 engines/mohawk/myst.cpp:245
+#: engines/mohawk/riven.cpp:718 engines/pegasus/pegasus.cpp:353
+#: engines/scumm/dialogs.cpp:189
msgid "Load"
msgstr "·ÐÒÐÝâÐÖØâØ"
-#: gui/launcher.cpp:788
+#: gui/launcher.cpp:792
msgid ""
"Do you really want to run the mass game detector? This could potentially add "
"a huge number of games."
@@ -473,7 +474,8 @@ msgstr ""
"ÇØ ÒØ ÔöÙáÝÞ åÞçÕâÕ ×ÐßãáâØâØ ßÞèãÚ ãáöå öÓÞà? ÆÕ ßÞâÕÝæöÙÝÞ ÜÞÖÕ ÔÞÔÐâØ "
"ÒÕÛØÚã ÚöÛìÚöáâì öÓÞà."
-#: gui/launcher.cpp:789 gui/launcher.cpp:937 gui/fluidsynth-dialog.cpp:216
+#: gui/launcher.cpp:793 gui/launcher.cpp:941 gui/launcher.cpp:1000
+#: gui/fluidsynth-dialog.cpp:217
#: backends/events/symbiansdl/symbiansdl-events.cpp:184
#: backends/platform/wince/CEActionsPocket.cpp:326
#: backends/platform/wince/CEActionsSmartphone.cpp:287
@@ -481,7 +483,8 @@ msgstr ""
msgid "Yes"
msgstr "ÂÐÚ"
-#: gui/launcher.cpp:789 gui/launcher.cpp:937 gui/fluidsynth-dialog.cpp:216
+#: gui/launcher.cpp:793 gui/launcher.cpp:941 gui/launcher.cpp:1000
+#: gui/fluidsynth-dialog.cpp:217
#: backends/events/symbiansdl/symbiansdl-events.cpp:184
#: backends/platform/wince/CEActionsPocket.cpp:326
#: backends/platform/wince/CEActionsSmartphone.cpp:287
@@ -489,189 +492,184 @@ msgstr "ÂÐÚ"
msgid "No"
msgstr "½ö"
-#: gui/launcher.cpp:837
+#: gui/launcher.cpp:841
msgid "ScummVM couldn't open the specified directory!"
msgstr "ScummVM ÝÕ ÜÞÖÕ ÒöÔÚàØâØ ÒÚÐ×ÐÝã ßÐßÚã!"
-#: gui/launcher.cpp:849
+#: gui/launcher.cpp:853
msgid "ScummVM could not find any game in the specified directory!"
msgstr "ScummVM ÝÕ ÜÞÖÕ ×ÝÐÙâØ Óàã ã ÒÚÐ×ÐÝöÙ ßÐßæö!"
-#: gui/launcher.cpp:863
+#: gui/launcher.cpp:867
msgid "Pick the game:"
msgstr "²ØÑÕàöâì Óàã:"
-#: gui/launcher.cpp:937
+#: gui/launcher.cpp:941
msgid "Do you really want to remove this game configuration?"
msgstr "²Ø ÔöÙáÝÞ åÞçÕâÕ ÒØÔÐ󯉯 ãáâÐÝÞÒÚØ ÔÛï æöô÷ ÓàØ?"
-#: gui/launcher.cpp:1001
+#: gui/launcher.cpp:999
+#, fuzzy
+msgid "Do you want to load savegame?"
+msgstr "²Ø åÞçÕâÕ ×ÐÒÐÝâÐÖØâØ ÐÑÞ ×ÑÕàÕÓâØ Óàã?"
+
+#: gui/launcher.cpp:1048
msgid "This game does not support loading games from the launcher."
msgstr "Æï ÓàÐ ÝÕ ßöÔâàØÜãô ×ÐÒÐÝâÐÖÕÝÝï ×ÑÕàÕÖÕÝì çÕàÕ× ÓÞÛÞÒÝÕ ÜÕÝî."
-#: gui/launcher.cpp:1005
+#: gui/launcher.cpp:1052
msgid "ScummVM could not find any engine capable of running the selected game!"
msgstr "ScummVM ÝÕ ×ÜöÓ ×ÝÐÙâØ ÔÒØÖÞÚ ÔÛï ×ÐßãáÚã ÒØÑàÐÝÞ÷ ÓàØ!"
-#: gui/launcher.cpp:1119
-msgctxt "lowres"
-msgid "Mass Add..."
-msgstr "´ÞÔ. ÑÐÓÐâÞ..."
-
-#: gui/launcher.cpp:1119
-msgid "Mass Add..."
-msgstr "´ÞÔ. ÑÐÓÐâÞ..."
-
-#: gui/massadd.cpp:78 gui/massadd.cpp:81
+#: gui/massadd.cpp:79 gui/massadd.cpp:82
msgid "... progress ..."
msgstr "... ßÞèãÚ ..."
-#: gui/massadd.cpp:258
+#: gui/massadd.cpp:259
msgid "Scan complete!"
msgstr "¿ÞèãÚ ×ÐÚöÝçÕÝÞ!"
-#: gui/massadd.cpp:261
+#: gui/massadd.cpp:262
#, c-format
msgid "Discovered %d new games, ignored %d previously added games."
msgstr "·ÝÐÙÔÕÝÞ %d ÝÞÒØå öÓÞà, ßàÞßãéÕÝÞ %d ßÞßÕàÕÔÝìÞ ÔÞÔÐÝØå öÓÞà."
-#: gui/massadd.cpp:265
+#: gui/massadd.cpp:266
#, c-format
msgid "Scanned %d directories ..."
msgstr "¿àÞÓÛïÝãâÞ %d ßÐßÞÚ ..."
-#: gui/massadd.cpp:268
+#: gui/massadd.cpp:269
#, c-format
msgid "Discovered %d new games, ignored %d previously added games ..."
msgstr "·ÝÐÙÔÕÝÞ %d ÝÞÒØå öÓÞà, ßàÞßãéÕÝÞ %d ßÞßÕàÕÔÝìÞ ÔÞÔÐÝØå öÓÞà ..."
-#: gui/options.cpp:84
+#: gui/options.cpp:85
msgid "Never"
msgstr "½öÚÞÛØ"
-#: gui/options.cpp:84
+#: gui/options.cpp:85
msgid "every 5 mins"
msgstr "ÚÞÖÝö 5 åÒ"
-#: gui/options.cpp:84
+#: gui/options.cpp:85
msgid "every 10 mins"
msgstr "ÚÞÖÝö 10 åÒ"
-#: gui/options.cpp:84
+#: gui/options.cpp:85
msgid "every 15 mins"
msgstr "ÚÞÖÝö 15 åÒ"
-#: gui/options.cpp:84
+#: gui/options.cpp:85
msgid "every 30 mins"
msgstr "ÚÞÖÝö 30 åÒ"
-#: gui/options.cpp:86
+#: gui/options.cpp:87
msgid "8 kHz"
msgstr "8 Ú³æ"
-#: gui/options.cpp:86
+#: gui/options.cpp:87
msgid "11kHz"
msgstr "11 Ú³æ"
-#: gui/options.cpp:86
+#: gui/options.cpp:87
msgid "22 kHz"
msgstr "22 Ú³æ"
-#: gui/options.cpp:86
+#: gui/options.cpp:87
msgid "44 kHz"
msgstr "44 Ú³æ"
-#: gui/options.cpp:86
+#: gui/options.cpp:87
msgid "48 kHz"
msgstr "48 Ú³æ"
-#: gui/options.cpp:254 gui/options.cpp:480 gui/options.cpp:581
-#: gui/options.cpp:650 gui/options.cpp:858
+#: gui/options.cpp:255 gui/options.cpp:481 gui/options.cpp:582
+#: gui/options.cpp:651 gui/options.cpp:859
msgctxt "soundfont"
msgid "None"
msgstr "½Õ ×ÐÔÐÝØÙ"
-#: gui/options.cpp:388
+#: gui/options.cpp:389
msgid "Failed to apply some of the graphic options changes:"
msgstr "½Õ ÒÔÐÛÞáï ×ÐáâÞáãÒÐâØ ÔÕïÚö ×ö ×ÜöÝ ÓàÐäöçÝØå ÝÐÛÐèâãÒÐÝì:"
-#: gui/options.cpp:400
+#: gui/options.cpp:401
msgid "the video mode could not be changed."
msgstr "ÝÕ ÒÔÐÛÞáï ×ÜöÝØâØ ÓàÐäöçÝØÙ àÕÖØÜ."
-#: gui/options.cpp:406
+#: gui/options.cpp:407
msgid "the fullscreen setting could not be changed"
msgstr "ÝÕ ÒÔÐÛÞáï ×ÜöÝØâØ àÕÖØÜ ßÞÒÝÞÓÞ ÕÚàÐÝã"
-#: gui/options.cpp:412
+#: gui/options.cpp:413
msgid "the aspect ratio setting could not be changed"
msgstr "ÝÕ ÒÔÐÛÞáï ×ÜöÝØâØ àÕÖØÜ ÚÞàÕÚæö÷ áßöÒÒöÔÝÞèÕÝÝï áâÞàöÝ"
-#: gui/options.cpp:733
+#: gui/options.cpp:734
msgid "Graphics mode:"
msgstr "³àÐäöçÝ. àÕÖØÜ:"
-#: gui/options.cpp:747
+#: gui/options.cpp:748
msgid "Render mode:"
msgstr "ÀÕÖØÜ àÐáâàãÒ.:"
-#: gui/options.cpp:747 gui/options.cpp:748
+#: gui/options.cpp:748 gui/options.cpp:749
msgid "Special dithering modes supported by some games"
msgstr "ÁßÕæöÐÛìÝö àÕÖØÜØ àÐáâàãÒÐÝÝï, ïÚö ßöÔâàØÜãîâì ÔÕïÚö öÓàØ"
-#: gui/options.cpp:759
-#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2236
-#: backends/graphics/openglsdl/openglsdl-graphics.cpp:476
+#: gui/options.cpp:760
+#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2249
msgid "Fullscreen mode"
msgstr "¿ÞÒÝÞÕÚàÐÝÝØÙ àÕÖØÜ"
-#: gui/options.cpp:762
+#: gui/options.cpp:763
msgid "Aspect ratio correction"
msgstr "ºÞàÕÚæöï áßöÒÒöÔÝÞèÕÝÝï áâÞàöÝ"
-#: gui/options.cpp:762
+#: gui/options.cpp:763
msgid "Correct aspect ratio for 320x200 games"
msgstr "ºÞàØÓãÒÐâØ áßöÒÒöÔÝÞèÕÝÝï áâÞàöÝ ÔÛï öÓÞà × ÓàÐäöÚÞî 320x200"
-#: gui/options.cpp:770
+#: gui/options.cpp:771
msgid "Preferred Device:"
msgstr "ÃßÞÔÞÑÐÝØÙ ßàØáâàöÙ:"
-#: gui/options.cpp:770
+#: gui/options.cpp:771
msgid "Music Device:"
msgstr "¼ãרç. ßàØáâàöÙ:"
-#: gui/options.cpp:770 gui/options.cpp:772
+#: gui/options.cpp:771 gui/options.cpp:773
msgid "Specifies preferred sound device or sound card emulator"
msgstr "²ÚÐ×ãô ãßÞÔÞÑÐÝØÙ ×ÒãÚÞÒØÙ ßàØáâàöÙ ÐÑÞ ÕÜãÛïâÞà ×ÒãÚÞÒÞ÷ ÚÐàâØ"
-#: gui/options.cpp:770 gui/options.cpp:772 gui/options.cpp:773
+#: gui/options.cpp:771 gui/options.cpp:773 gui/options.cpp:774
msgid "Specifies output sound device or sound card emulator"
msgstr "²ÚÐ×ãô ÒØåöÔÝØÙ ×ÒãÚÞÒØÙ ßàØáâàöÙ ÐÑÞ ÕÜãÛïâÞà ×ÒãÚÞÒÞ÷ ÚÐàâØ"
-#: gui/options.cpp:772
+#: gui/options.cpp:773
msgctxt "lowres"
msgid "Preferred Dev.:"
msgstr "ÃßÞÔÞÑ. ßàØáâàöÙ:"
-#: gui/options.cpp:772
+#: gui/options.cpp:773
msgctxt "lowres"
msgid "Music Device:"
msgstr "¼ãרçÝØÙ ßàØáâàöÙ:"
-#: gui/options.cpp:799
+#: gui/options.cpp:800
msgid "AdLib emulator:"
msgstr "µÜãÛïâÞà AdLib:"
-#: gui/options.cpp:799 gui/options.cpp:800
+#: gui/options.cpp:800 gui/options.cpp:801
msgid "AdLib is used for music in many games"
msgstr "·ÒãÚÞÒÐ ÚÐàâÐ AdLib ÒØÚÞàØáâÞÒãôâìáï ÑÐÓÐâìÜÐ öÓàÐÜØ"
-#: gui/options.cpp:810
+#: gui/options.cpp:811
msgid "Output rate:"
msgstr "²ØåöÔÝÐ çÐáâÞâÐ:"
-#: gui/options.cpp:810 gui/options.cpp:811
+#: gui/options.cpp:811 gui/options.cpp:812
msgid ""
"Higher value specifies better sound quality but may be not supported by your "
"soundcard"
@@ -679,67 +677,67 @@ msgstr ""
"²ÕÛØÚö ×ÝÐçÕÝÝï ×ÐÔÐîâì ÚàÐéã ïÚöáâì ×ÒãÚã, ßàÞâÕ ÒÞÝØ ÜÞÖãâì ÝÕ "
"ßöÔâàØÜãÒÐâØáï ÒÐèÞî ×ÒãÚÞÒÞî ÚÐàâÞî"
-#: gui/options.cpp:821
+#: gui/options.cpp:822
msgid "GM Device:"
msgstr "¿àØáâàöÙ GM:"
-#: gui/options.cpp:821
+#: gui/options.cpp:822
msgid "Specifies default sound device for General MIDI output"
msgstr "²ÚÐ×ãô ÒØåöÔÝØÙ ×ÒãÚÞÒØÙ ßàØáâàöÙ ÔÛï General MIDI"
-#: gui/options.cpp:832
+#: gui/options.cpp:833
msgid "Don't use General MIDI music"
msgstr "½Õ ÒØÚÞàØáâÞÒãÒÐâØ ÜãרÚã General MIDI"
-#: gui/options.cpp:843 gui/options.cpp:909
+#: gui/options.cpp:844 gui/options.cpp:910
msgid "Use first available device"
msgstr "²ØÚÞàØáâÞÒãÒÐâØ ßÕàèØÙ ÝÐïÒÝØÙ ßàØáâàöÙ"
-#: gui/options.cpp:855
+#: gui/options.cpp:856
msgid "SoundFont:"
msgstr "SoundFont:"
-#: gui/options.cpp:855 gui/options.cpp:857 gui/options.cpp:858
+#: gui/options.cpp:856 gui/options.cpp:858 gui/options.cpp:859
msgid "SoundFont is supported by some audio cards, Fluidsynth and Timidity"
msgstr ""
"SoundFont ßöÔâàØÜãôâìáï ÔÕïÚØÜØ ×ÒãÚÞÒØÜØ ÚÐàâÐÜØ, Fluidsynth âÐ Timidity"
-#: gui/options.cpp:857
+#: gui/options.cpp:858
msgctxt "lowres"
msgid "SoundFont:"
msgstr "SoundFont:"
-#: gui/options.cpp:863
+#: gui/options.cpp:864
msgid "Mixed AdLib/MIDI mode"
msgstr "·ÜöèÐÝØÙ àÕÖØÜ AdLib/MIDI"
-#: gui/options.cpp:863
+#: gui/options.cpp:864
msgid "Use both MIDI and AdLib sound generation"
msgstr "²ØÚÞàØáâÞÒãÒÐâØ ö MIDI ö AdLib ÔÛï ÓÕÝÕàÐæö÷ ×ÒãÚã"
-#: gui/options.cpp:866
+#: gui/options.cpp:867
msgid "MIDI gain:"
msgstr "¿ÞáØÛÕÝÝï MIDI:"
-#: gui/options.cpp:873
+#: gui/options.cpp:874
msgid "FluidSynth Settings"
msgstr "½ÐÛÐèâãÒÐÝÝï FluidSynth"
-#: gui/options.cpp:880
+#: gui/options.cpp:881
msgid "MT-32 Device:"
msgstr "¿àØáâàöÙ MT-32:"
-#: gui/options.cpp:880
+#: gui/options.cpp:881
msgid "Specifies default sound device for Roland MT-32/LAPC1/CM32l/CM64 output"
msgstr ""
"²ÚÐ×ãô ×ÒãÚÞÒØÙ ßàØáâàöÙ ×Ð ãÜÞÒçÐÝÝïÜ ÔÛï ÒØÒÞÔã ÝÐ Roland MT-32/LAPC1/"
"CM32l/CM64"
-#: gui/options.cpp:885
+#: gui/options.cpp:886
msgid "True Roland MT-32 (disable GM emulation)"
msgstr "ÁßàÐÒÖÝöÙ Roland MT-32 (ÒØÜÚÝãâØ ÕÜãÛïæØî GM)"
-#: gui/options.cpp:885 gui/options.cpp:887
+#: gui/options.cpp:886 gui/options.cpp:888
msgid ""
"Check if you want to use your real hardware Roland-compatible sound device "
"connected to your computer"
@@ -747,193 +745,195 @@ msgstr ""
"²öÔÜöâìâÕ, ïÚéÞ ã ÒÐá ßöÔÚÛîçÕÝÞ Roland-áãÜöáÝØÙ ×ÒãÚÞÒØÙ ßàØáâàöÙ ö ÒØ "
"åÞçÕâÕ ÙÞÓÞ ÒØÚÞàØáâÞÒãÒÐâØ"
-#: gui/options.cpp:887
+#: gui/options.cpp:888
msgctxt "lowres"
msgid "True Roland MT-32 (no GM emulation)"
msgstr "ÁßàÐÒÖÝöÙ Roland MT-32 (ÒØÜÚÝãâØ ÕÜãÛïæØî GM)"
-#: gui/options.cpp:890
-msgid "Roland GS Mode (disable GM mapping)"
+#: gui/options.cpp:891
+#, fuzzy
+msgid "Roland GS Device (enable MT-32 mappings)"
msgstr "ÀÕÖØÜ Roland GS (ÒØÜÚÝãâØ ÜÐßÛÕÝÝï GM)"
-#: gui/options.cpp:890
-msgid "Turns off General MIDI mapping for games with Roland MT-32 soundtrack"
+#: gui/options.cpp:891
+msgid ""
+"Check if you want to enable patch mappings to emulate an MT-32 on a Roland "
+"GS device"
msgstr ""
-"²ØÜØÚÐô ÜÐßöÝÓ General MIDI ÔÛï öÓÞà ×ö ×ÒãÚÞÒÞî ÔÞàöÖÚÞî ÔÛï Roland MT-32"
-#: gui/options.cpp:899
+#: gui/options.cpp:900
msgid "Don't use Roland MT-32 music"
msgstr "½Õ ÒØÚÞàØáâÞÒãÒÐâØ Roland MT-32"
-#: gui/options.cpp:926
+#: gui/options.cpp:927
msgid "Text and Speech:"
msgstr "ÂÕÚáâ ö Þ×ÒãçÚÐ:"
-#: gui/options.cpp:930 gui/options.cpp:940
+#: gui/options.cpp:931 gui/options.cpp:941
msgid "Speech"
msgstr "¾×ÒãçÚÐ"
-#: gui/options.cpp:931 gui/options.cpp:941
+#: gui/options.cpp:932 gui/options.cpp:942
msgid "Subtitles"
msgstr "ÁãÑâØâàØ"
-#: gui/options.cpp:932
+#: gui/options.cpp:933
msgid "Both"
msgstr "²áÕ"
-#: gui/options.cpp:934
+#: gui/options.cpp:935
msgid "Subtitle speed:"
msgstr "ÈÒØÔ. áãÑâØâàöÒ:"
-#: gui/options.cpp:936
+#: gui/options.cpp:937
msgctxt "lowres"
msgid "Text and Speech:"
msgstr "ÂÕÚáâ ö Þ×ÒãçÚÐ:"
-#: gui/options.cpp:940
+#: gui/options.cpp:941
msgid "Spch"
msgstr "¾×Ò"
-#: gui/options.cpp:941
+#: gui/options.cpp:942
msgid "Subs"
msgstr "狄"
-#: gui/options.cpp:942
+#: gui/options.cpp:943
msgctxt "lowres"
msgid "Both"
msgstr "²áÕ"
-#: gui/options.cpp:942
+#: gui/options.cpp:943
msgid "Show subtitles and play speech"
msgstr "¿ÞÚÐ×ãÒÐâØ áãÑâØâàØ ö ÒöÔâÒÞàîÒÐâØ ÜÞÒã"
-#: gui/options.cpp:944
+#: gui/options.cpp:945
msgctxt "lowres"
msgid "Subtitle speed:"
msgstr "ÈÒØÔ. áãÑâØâàöÒ:"
-#: gui/options.cpp:960
+#: gui/options.cpp:961
msgid "Music volume:"
msgstr "³ãçÝöáâì Üã×ØÚØ:"
-#: gui/options.cpp:962
+#: gui/options.cpp:963
msgctxt "lowres"
msgid "Music volume:"
msgstr "³ãçÝöáâì Üã×ØÚØ:"
-#: gui/options.cpp:969
+#: gui/options.cpp:970
msgid "Mute All"
msgstr "²ØÜÚÝãâØ ÒáÕ"
-#: gui/options.cpp:972
+#: gui/options.cpp:973
msgid "SFX volume:"
msgstr "³ãçÝöáâì ÕäÕÚâöÒ:"
-#: gui/options.cpp:972 gui/options.cpp:974 gui/options.cpp:975
+#: gui/options.cpp:973 gui/options.cpp:975 gui/options.cpp:976
msgid "Special sound effects volume"
msgstr "³ãçÝöáâì áßÕæöÐÛìÝØå ×ÒãÚÞÒØå ÕäÕÚâöÒ"
-#: gui/options.cpp:974
+#: gui/options.cpp:975
msgctxt "lowres"
msgid "SFX volume:"
msgstr "³ãçÝ. ÕäÕÚâöÒ:"
-#: gui/options.cpp:982
+#: gui/options.cpp:983
msgid "Speech volume:"
msgstr "³ãçÝöáâì Þ×ÒãçÚØ:"
-#: gui/options.cpp:984
+#: gui/options.cpp:985
msgctxt "lowres"
msgid "Speech volume:"
msgstr "³ãçÝ. Þ×ÒãçÚØ:"
-#: gui/options.cpp:1141
+#: gui/options.cpp:1142
msgid "Theme Path:"
msgstr "ÈÛïå ÔÞ âÕÜ:"
-#: gui/options.cpp:1143
+#: gui/options.cpp:1144
msgctxt "lowres"
msgid "Theme Path:"
msgstr "ÈÛïå ÔÞ âÕÜ:"
-#: gui/options.cpp:1149 gui/options.cpp:1151 gui/options.cpp:1152
+#: gui/options.cpp:1150 gui/options.cpp:1152 gui/options.cpp:1153
msgid "Specifies path to additional data used by all games or ScummVM"
msgstr ""
"²ÚÐ×ãô èÛïå ÔÞ ÔÞÔÐâÚÞÒØå äÐÙÛöÒ ÔÐÝØå, ïÚö ÒØÚÞàØáâÞÒãîâìáï ãáöÜÐ öÓàÐÜØ "
"ÐÑÞ ScummVM"
-#: gui/options.cpp:1158
+#: gui/options.cpp:1159
msgid "Plugins Path:"
msgstr "ÈÛïå ÔÞ ÒâãÛÚöÒ:"
-#: gui/options.cpp:1160
+#: gui/options.cpp:1161
msgctxt "lowres"
msgid "Plugins Path:"
msgstr "ÈÛïå ÔÞ ÒâãÛÚöÒ:"
-#: gui/options.cpp:1169 gui/fluidsynth-dialog.cpp:137
+#: gui/options.cpp:1170 gui/fluidsynth-dialog.cpp:138
msgid "Misc"
msgstr "Àö×ÝÕ"
-#: gui/options.cpp:1171
+#: gui/options.cpp:1172
msgctxt "lowres"
msgid "Misc"
msgstr "Àö×ÝÕ"
-#: gui/options.cpp:1173
+#: gui/options.cpp:1174
msgid "Theme:"
msgstr "ÂÕÜÐ:"
-#: gui/options.cpp:1177
+#: gui/options.cpp:1178
msgid "GUI Renderer:"
msgstr "ÀÐáâÕà. GUI:"
-#: gui/options.cpp:1189
+#: gui/options.cpp:1190
msgid "Autosave:"
msgstr "°ÒâÞ×ÑÕàÕÖÕÝÝï:"
-#: gui/options.cpp:1191
+#: gui/options.cpp:1192
msgctxt "lowres"
msgid "Autosave:"
msgstr "°ÒâÞ×ÑÕàÕÖ.:"
-#: gui/options.cpp:1199
+#: gui/options.cpp:1200
msgid "Keys"
msgstr "ºÛÐÒöèö"
-#: gui/options.cpp:1206
+#: gui/options.cpp:1207
msgid "GUI Language:"
msgstr "¼ÞÒÐ öÝâÕàä.:"
-#: gui/options.cpp:1206
+#: gui/options.cpp:1207
msgid "Language of ScummVM GUI"
msgstr "¼ÞÒÐ ÓàÐäöçÝÞÓÞ öÝâÕàäÕÙáã ScummVM"
-#: gui/options.cpp:1365
+#: gui/options.cpp:1366
msgid "You have to restart ScummVM before your changes will take effect."
msgstr "²Ø ßÞÒØÝÝö ßÕàÕ×ÐßãáâØâØ ScummVM éÞÑ ×ÐáâÞáãÒÐâØ ×ÜöÝØ."
-#: gui/options.cpp:1378
+#: gui/options.cpp:1379
msgid "Select directory for savegames"
msgstr "²ØÑÕàöâì ßÐßÚã ÔÛï ×ÑÕàÕÖÕÝì"
-#: gui/options.cpp:1385
+#: gui/options.cpp:1386
msgid "The chosen directory cannot be written to. Please select another one."
msgstr "½Õ ÜÞÖã ߨáÐâØ ã ÒØÑàÐÝã ßÐßÚã. ±ãÔì ÛÐáÚÐ, ÒÚÐÖöâì öÝèã."
-#: gui/options.cpp:1394
+#: gui/options.cpp:1395
msgid "Select directory for GUI themes"
msgstr "²ØÑÕàöâì ßÐßÚã ÔÛï âÕÜ GUI"
-#: gui/options.cpp:1404
+#: gui/options.cpp:1405
msgid "Select directory for extra files"
msgstr "²ØÑÕàöâì ßÐßÚã × ÔÞÔÐâÚÞÒØÜØ äÐÙÛÐÜØ"
-#: gui/options.cpp:1415
+#: gui/options.cpp:1416
msgid "Select directory for plugins"
msgstr "²ØÑÕàöâì ßÐßÚã ×ö ÒâãÛÚÐÜØ"
-#: gui/options.cpp:1468
+#: gui/options.cpp:1469
msgid ""
"The theme you selected does not support your current language. If you want "
"to use this theme you need to switch to another language first."
@@ -941,222 +941,227 @@ msgstr ""
"²ØÑàÐÝÐ âÕÜÐ ÝÕ ßöÔâàØÜãô ßÞâÞçÝã ÜÞÒã. ÏÚéÞ ÒØ åÞçÕâÕ ÒØÚÞàØáâÞÒãÒÐâØ æî "
"âÕÜã, ßÞâàöÑÝÞ Ò ßÕàèã çÕàÓã ×ÜöÝØâØ ÜÞÒã."
-#: gui/saveload-dialog.cpp:166
+#: gui/saveload-dialog.cpp:167
msgid "List view"
msgstr "²ØÓÛïÔ áߨáÚã"
-#: gui/saveload-dialog.cpp:167
+#: gui/saveload-dialog.cpp:168
msgid "Grid view"
msgstr "²ØÓÛïÔ áöâÚØ"
-#: gui/saveload-dialog.cpp:210 gui/saveload-dialog.cpp:358
+#: gui/saveload-dialog.cpp:211 gui/saveload-dialog.cpp:360
msgid "No date saved"
msgstr "´Ðâã ÝÕ ×ÐߨáÐÝÞ"
-#: gui/saveload-dialog.cpp:211 gui/saveload-dialog.cpp:359
+#: gui/saveload-dialog.cpp:212 gui/saveload-dialog.cpp:361
msgid "No time saved"
msgstr "ÇÐá ÝÕ ×ÐߨáÐÝÞ"
-#: gui/saveload-dialog.cpp:212 gui/saveload-dialog.cpp:360
+#: gui/saveload-dialog.cpp:213 gui/saveload-dialog.cpp:362
msgid "No playtime saved"
msgstr "ÇÐá ÓàØ ÝÕ ×ÐߨáÐÝÞ"
-#: gui/saveload-dialog.cpp:219 gui/saveload-dialog.cpp:275
+#: gui/saveload-dialog.cpp:220 gui/saveload-dialog.cpp:276
msgid "Delete"
msgstr "²ØÔÐÛØâØ"
-#: gui/saveload-dialog.cpp:274
+#: gui/saveload-dialog.cpp:275
msgid "Do you really want to delete this savegame?"
msgstr "²Ø ÔöÙáÝÞ åÞçÕâÕ ÒØÔÐ󯉯 æÕ ×ÑÕàÕÖÕÝÝï?"
-#: gui/saveload-dialog.cpp:383 gui/saveload-dialog.cpp:872
+#: gui/saveload-dialog.cpp:385 gui/saveload-dialog.cpp:875
msgid "Date: "
msgstr "´ÐâÐ: "
-#: gui/saveload-dialog.cpp:387 gui/saveload-dialog.cpp:878
+#: gui/saveload-dialog.cpp:389 gui/saveload-dialog.cpp:881
msgid "Time: "
msgstr "ÇÐá: "
-#: gui/saveload-dialog.cpp:393 gui/saveload-dialog.cpp:886
+#: gui/saveload-dialog.cpp:395 gui/saveload-dialog.cpp:889
msgid "Playtime: "
msgstr "ÇÐá ÓàØ: "
-#: gui/saveload-dialog.cpp:406 gui/saveload-dialog.cpp:494
+#: gui/saveload-dialog.cpp:408 gui/saveload-dialog.cpp:496
msgid "Untitled savestate"
msgstr "·ÑÕàÕÖÕÝÝï ÑÕ× öÜÕÝö"
-#: gui/saveload-dialog.cpp:546
+#: gui/saveload-dialog.cpp:548
msgid "Next"
msgstr "½ÐáãâßÝØÙ"
-#: gui/saveload-dialog.cpp:549
+#: gui/saveload-dialog.cpp:551
msgid "Prev"
msgstr "¿ÞßÕàÕÔÝöÙ"
-#: gui/saveload-dialog.cpp:736
+#: gui/saveload-dialog.cpp:739
msgid "New Save"
msgstr "½ÞÒÕ ×ÑÕàÕÖÕÝÝï"
-#: gui/saveload-dialog.cpp:736
+#: gui/saveload-dialog.cpp:739
msgid "Create a new save game"
msgstr "ÁâÒÞàØâØ ÝÞÒØÙ ×Ðߨá ÓàØ"
-#: gui/saveload-dialog.cpp:865
+#: gui/saveload-dialog.cpp:868
msgid "Name: "
msgstr "½Ð×ÒÐ: "
-#: gui/saveload-dialog.cpp:937
+#: gui/saveload-dialog.cpp:940
#, c-format
msgid "Enter a description for slot %d:"
msgstr "²ÒÕÔöâì Þߨá ÔÛï áÛÞâã %d:"
-#: gui/themebrowser.cpp:44
+#: gui/themebrowser.cpp:45
msgid "Select a Theme"
msgstr "²ØÑÕàöâì âÕÜã"
-#: gui/ThemeEngine.cpp:337
+#: gui/ThemeEngine.cpp:347
msgid "Disabled GFX"
msgstr "±Õ× ÓàÐäöÚØ"
-#: gui/ThemeEngine.cpp:337
+#: gui/ThemeEngine.cpp:347
msgctxt "lowres"
msgid "Disabled GFX"
msgstr "±Õ× ÓàÐäöÚØ"
-#: gui/ThemeEngine.cpp:338
-msgid "Standard Renderer (16bpp)"
+#: gui/ThemeEngine.cpp:348
+#, fuzzy
+msgid "Standard Renderer"
msgstr "ÁâÐÝÔÐàâÝØÙ àÐáâÕàØ×ÐâÞà (16bpp)"
-#: gui/ThemeEngine.cpp:338
-msgid "Standard (16bpp)"
-msgstr "ÁâÐÝÔÐàâÝØÙ àÐáâÕàØ×ÐâÞà (16bpp)"
+#: gui/ThemeEngine.cpp:348 engines/scumm/dialogs.cpp:659
+msgid "Standard"
+msgstr "ÁâÐÝÔÐàâÝØÙ"
-#: gui/ThemeEngine.cpp:340
-msgid "Antialiased Renderer (16bpp)"
+#: gui/ThemeEngine.cpp:350
+#, fuzzy
+msgid "Antialiased Renderer"
msgstr "ÀÐáâÕàØ×ÐâÞà ×ö ×ÓÛÐÔÖãÒÐÝÝïÜ (16bpp)"
-#: gui/ThemeEngine.cpp:340
-msgid "Antialiased (16bpp)"
+#: gui/ThemeEngine.cpp:350
+#, fuzzy
+msgid "Antialiased"
msgstr "ÀÐáâÕàØ×ÐâÞà ×ö ×ÓÛÐÔÖãÒÐÝÝïÜ (16bpp)"
-#: gui/widget.cpp:322 gui/widget.cpp:324 gui/widget.cpp:330 gui/widget.cpp:332
+#: gui/widget.cpp:323 gui/widget.cpp:325 gui/widget.cpp:331 gui/widget.cpp:333
msgid "Clear value"
msgstr "¾çØáâØâØ ×ÝÐçÕÝÝï"
-#: gui/fluidsynth-dialog.cpp:67
+#: gui/fluidsynth-dialog.cpp:68
msgid "Reverb"
msgstr "ÀÕÒÕàÑÕàÐæöï"
-#: gui/fluidsynth-dialog.cpp:69 gui/fluidsynth-dialog.cpp:101
+#: gui/fluidsynth-dialog.cpp:70 gui/fluidsynth-dialog.cpp:102
msgid "Active"
msgstr "°ÚâØÒÝÕ"
-#: gui/fluidsynth-dialog.cpp:71
+#: gui/fluidsynth-dialog.cpp:72
msgid "Room:"
msgstr "ºöÜÝÐâÐ:"
-#: gui/fluidsynth-dialog.cpp:78
+#: gui/fluidsynth-dialog.cpp:79
msgid "Damp:"
msgstr "²ÞÛÞÓöáâì:"
-#: gui/fluidsynth-dialog.cpp:85
+#: gui/fluidsynth-dialog.cpp:86
msgid "Width:"
msgstr "ÈØàØÝÐ:"
-#: gui/fluidsynth-dialog.cpp:92 gui/fluidsynth-dialog.cpp:110
+#: gui/fluidsynth-dialog.cpp:93 gui/fluidsynth-dialog.cpp:111
msgid "Level:"
msgstr "ÀöÒÕÝì:"
-#: gui/fluidsynth-dialog.cpp:99
+#: gui/fluidsynth-dialog.cpp:100
msgid "Chorus"
msgstr "ÅÞà"
-#: gui/fluidsynth-dialog.cpp:103
+#: gui/fluidsynth-dialog.cpp:104
msgid "N:"
msgstr "N:"
-#: gui/fluidsynth-dialog.cpp:117
+#: gui/fluidsynth-dialog.cpp:118
msgid "Speed:"
msgstr "ÈÒØÔÚöáâì:"
-#: gui/fluidsynth-dialog.cpp:124
+#: gui/fluidsynth-dialog.cpp:125
msgid "Depth:"
msgstr "³ÛØÑØÝÐ:"
-#: gui/fluidsynth-dialog.cpp:131
+#: gui/fluidsynth-dialog.cpp:132
msgid "Type:"
msgstr "ÂØß:"
-#: gui/fluidsynth-dialog.cpp:134
+#: gui/fluidsynth-dialog.cpp:135
msgid "Sine"
msgstr "ÁØÝãáÞ÷ÔÐ"
-#: gui/fluidsynth-dialog.cpp:135
+#: gui/fluidsynth-dialog.cpp:136
msgid "Triangle"
msgstr "ÂàØÚãâÝØÚ"
-#: gui/fluidsynth-dialog.cpp:139
+#: gui/fluidsynth-dialog.cpp:140
msgid "Interpolation:"
msgstr "¦ÝâÕàßÞÛïæöï:"
-#: gui/fluidsynth-dialog.cpp:142
+#: gui/fluidsynth-dialog.cpp:143
msgid "None (fastest)"
msgstr "½ÕÜÐ (ÝÐÙèÒØÔèÕ)"
-#: gui/fluidsynth-dialog.cpp:143
+#: gui/fluidsynth-dialog.cpp:144
msgid "Linear"
msgstr "»öÝöÙÝÐ"
-#: gui/fluidsynth-dialog.cpp:144
+#: gui/fluidsynth-dialog.cpp:145
msgid "Fourth-order"
msgstr "ÇÕâÒÕàâÞÓÞ ßÞàïÔÚã"
-#: gui/fluidsynth-dialog.cpp:145
+#: gui/fluidsynth-dialog.cpp:146
msgid "Seventh-order"
msgstr "ÁìÞÜÞÓÞ ßÞàïÔÚã"
-#: gui/fluidsynth-dialog.cpp:149
+#: gui/fluidsynth-dialog.cpp:150
msgid "Reset"
msgstr "ÁÚØÝãâØ"
-#: gui/fluidsynth-dialog.cpp:149
+#: gui/fluidsynth-dialog.cpp:150
msgid "Reset all FluidSynth settings to their default values."
msgstr "ÁÚØÝãâØ Òáö ÝÐÛÐèâãÒÐÝÝï FluidSynth ÔÞ ÷å ×ÝÐçÕÝì ×Ð ×ÐÜÞÒçÕÝÝïÜ"
-#: gui/fluidsynth-dialog.cpp:216
+#: gui/fluidsynth-dialog.cpp:217
msgid ""
"Do you really want to reset all FluidSynth settings to their default values?"
-msgstr "²Ø ÔöÙáÝÞ åÞçÕâÕ áÚØÝãâØ Òáö ÝÐÛÐèâãÒÐÝÝï FluidSynth ÔÞ ÷å ×ÝÐçÕÝì ×Ð ×ÐÜÞÒçÕÝÝïÜ?"
+msgstr ""
+"²Ø ÔöÙáÝÞ åÞçÕâÕ áÚØÝãâØ Òáö ÝÐÛÐèâãÒÐÝÝï FluidSynth ÔÞ ÷å ×ÝÐçÕÝì ×Ð "
+"×ÐÜÞÒçÕÝÝïÜ?"
-#: base/main.cpp:210
+#: base/main.cpp:228
#, c-format
msgid "Engine does not support debug level '%s'"
msgstr "´ÒØÖÞÚ ÝÕ ßöÔâàØÜãô àöÒÕÝì ÒöÔÛÐÔÚØ '%s'"
-#: base/main.cpp:288
+#: base/main.cpp:306
msgid "Menu"
msgstr "¼ÕÝî"
-#: base/main.cpp:291 backends/platform/symbian/src/SymbianActions.cpp:45
+#: base/main.cpp:309 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:294 backends/platform/symbian/src/SymbianActions.cpp:50
+#: base/main.cpp:312 backends/platform/symbian/src/SymbianActions.cpp:50
#: backends/platform/wince/CEActionsPocket.cpp:42
msgid "Pause"
msgstr "¿Ðã×Ð"
-#: base/main.cpp:297
+#: base/main.cpp:315
msgid "Skip line"
msgstr "¿àÞßãáâØâØ àïÔÞÚ"
-#: base/main.cpp:468
+#: base/main.cpp:507
msgid "Error running game:"
msgstr "¿ÞÜØÛÚÐ ×ÐßãáÚã ÓàØ:"
-#: base/main.cpp:492
+#: base/main.cpp:536
msgid "Could not find any engine capable of running the selected game"
msgstr "½Õ ÜÞÖã ×ÝÐÙâØ ÔÒØÖÞÚ ÔÛï ×ÐßãáÚã ÒØÑàÐÝÞ÷ ÓàØ"
@@ -1224,72 +1229,72 @@ msgstr "²öÔÜöÝÕÝÞ ÚÞàØáâãÒÐçÕÜ"
msgid "Unknown error"
msgstr "½ÕÒöÔÞÜÐ ßÞÜØÛÚÐ"
-#: engines/advancedDetector.cpp:316
+#: engines/advancedDetector.cpp:317
#, c-format
msgid "The game in '%s' seems to be unknown."
msgstr "³àÐ ã '%s' ÝÕÒöÔÞÜÐ."
-#: engines/advancedDetector.cpp:317
+#: engines/advancedDetector.cpp:318
msgid "Please, report the following data to the ScummVM team along with name"
msgstr "±ãÔì ÛÐáÚÐ, ßÕàÕÔÐÙâÕ ÝØÖçÕÝÐÒÕÔÕÝã öÝäÞàÜÐæöî ÚÞÜÐÝÔö ScummVM àÐ×ÞÜ ×"
-#: engines/advancedDetector.cpp:319
+#: engines/advancedDetector.cpp:320
msgid "of the game you tried to add and its version/language/etc.:"
msgstr "ÝÐ×ÒÞî ÓàØ, ïÚã ÒØ ÝÐÜÐÓÐôâÕáì ÔÞÔÐâØ, Ð âÐÚÞÖ ÷÷ ÒÕàáöî/ÜÞÒã/âÐ öÝèÕ:"
-#: engines/dialogs.cpp:84
+#: engines/dialogs.cpp:85
msgid "~R~esume"
msgstr "¿àÞÔÞÒ~Ö~ØâØ"
-#: engines/dialogs.cpp:86
+#: engines/dialogs.cpp:87
msgid "~L~oad"
msgstr "~·~ÐÒÐÝâÐÖØâØ"
-#: engines/dialogs.cpp:90
+#: engines/dialogs.cpp:91
msgid "~S~ave"
msgstr "~·~ÐߨáÐâØ"
-#: engines/dialogs.cpp:94
+#: engines/dialogs.cpp:95
msgid "~O~ptions"
msgstr "~½~ÐÛÐèâãÒÐÝÝï"
-#: engines/dialogs.cpp:99
+#: engines/dialogs.cpp:100
msgid "~H~elp"
msgstr "~´~ÞßÞÜÞÓÐ"
-#: engines/dialogs.cpp:101
+#: engines/dialogs.cpp:102
msgid "~A~bout"
msgstr "¿àÞ ßàÞ~Ó~àÐÜã"
-#: engines/dialogs.cpp:104 engines/dialogs.cpp:180
+#: engines/dialogs.cpp:105 engines/dialogs.cpp:181
msgid "~R~eturn to Launcher"
msgstr "~¿~ÞÒÕà. Ò ÓÞÛÞÒÝÕ ÜÕÝî"
-#: engines/dialogs.cpp:106 engines/dialogs.cpp:182
+#: engines/dialogs.cpp:107 engines/dialogs.cpp:183
msgctxt "lowres"
msgid "~R~eturn to Launcher"
msgstr "~¿~ÞÒÕà.Ò ÓÞÛÞÒÝÕ ÜÕÝî"
-#: engines/dialogs.cpp:115 engines/agi/saveload.cpp:803
-#: engines/drascula/saveload.cpp:338 engines/cruise/menu.cpp:212
-#: engines/sci/engine/kfile.cpp:742 engines/toltecs/menu.cpp:284
-#: engines/pegasus/pegasus.cpp:373
+#: engines/dialogs.cpp:116 engines/agi/saveload.cpp:803
+#: engines/cruise/menu.cpp:212 engines/drascula/saveload.cpp:336
+#: engines/neverhood/menumodule.cpp:873 engines/pegasus/pegasus.cpp:377
+#: engines/sci/engine/kfile.cpp:758 engines/toltecs/menu.cpp:281
msgid "Save game:"
msgstr "·ÑÕàÕÓâØ Óàã: "
-#: engines/dialogs.cpp:115 engines/agi/saveload.cpp:803
-#: engines/drascula/saveload.cpp:338 engines/scumm/dialogs.cpp:187
-#: engines/cruise/menu.cpp:212 engines/sci/engine/kfile.cpp:742
-#: engines/toltecs/menu.cpp:284 engines/pegasus/pegasus.cpp:373
-#: backends/platform/symbian/src/SymbianActions.cpp:44
+#: engines/dialogs.cpp:116 backends/platform/symbian/src/SymbianActions.cpp:44
#: backends/platform/wince/CEActionsPocket.cpp:43
#: backends/platform/wince/CEActionsPocket.cpp:267
#: backends/platform/wince/CEActionsSmartphone.cpp:45
#: backends/platform/wince/CEActionsSmartphone.cpp:231
+#: engines/agi/saveload.cpp:803 engines/cruise/menu.cpp:212
+#: engines/drascula/saveload.cpp:336 engines/neverhood/menumodule.cpp:873
+#: engines/pegasus/pegasus.cpp:377 engines/sci/engine/kfile.cpp:758
+#: engines/scumm/dialogs.cpp:188 engines/toltecs/menu.cpp:281
msgid "Save"
msgstr "·ÐߨáÐâØ"
-#: engines/dialogs.cpp:144
+#: engines/dialogs.cpp:145
msgid ""
"Sorry, this engine does not currently provide in-game help. Please consult "
"the README for basic information, and for instructions on how to obtain "
@@ -1299,7 +1304,7 @@ msgstr ""
"README ÔÛï ÞáÝÞÒÝÞ÷ öÝÞàÜÐæö÷, Ð âÐÚÞÖ öÝáâàãÚæöÙ, ïÚ ÞâàØÜÐâØ ßÞÔÐÛìèã "
"ÔÞßÞÜÞÓã."
-#: engines/dialogs.cpp:228
+#: engines/dialogs.cpp:234 engines/pegasus/pegasus.cpp:393
#, c-format
msgid ""
"Gamestate save failed (%s)! Please consult the README for basic information, "
@@ -1308,37 +1313,37 @@ msgstr ""
"·ÑÕàÕÖÕÝÝï áâÐÝã ÓàØ ÝÕ ÒÔÐÛÞáï (%s)!. ±ãÔì-ÛÐáÚÐ, ÔØÒöâìáï äÐÙÛ README ÔÛï "
"ÞáÝÞÒÝÞ÷ öÝÞàÜÐæö÷, Ð âÐÚÞÖ öÝáâàãÚæöÙ, ïÚ ÞâàØÜÐâØ ßÞÔÐÛìèã ÔÞßÞÜÞÓã."
-#: engines/dialogs.cpp:301 engines/mohawk/dialogs.cpp:109
+#: engines/dialogs.cpp:307 engines/mohawk/dialogs.cpp:109
#: engines/mohawk/dialogs.cpp:170
msgid "~O~K"
msgstr "~O~K"
-#: engines/dialogs.cpp:302 engines/mohawk/dialogs.cpp:110
+#: engines/dialogs.cpp:308 engines/mohawk/dialogs.cpp:110
#: engines/mohawk/dialogs.cpp:171
msgid "~C~ancel"
msgstr "²ö~Ô~ÜöÝÐ"
-#: engines/dialogs.cpp:305
+#: engines/dialogs.cpp:311
msgid "~K~eys"
msgstr "~º~ÛÐÒöèö"
-#: engines/engine.cpp:240
+#: engines/engine.cpp:245
msgid "Could not initialize color format."
msgstr "½Õ ÜÞÖã ÝÐÛÐèâãÒÐâØ äÞàÜÐâ ÚÞÛìÞàã."
-#: engines/engine.cpp:248
+#: engines/engine.cpp:253
msgid "Could not switch to video mode: '"
msgstr "½Õ ÒÔÐÛÞáï ßÕàÕÚÛîçØâØ ÒöÔÕÞàÕÖØÜ: '"
-#: engines/engine.cpp:257
+#: engines/engine.cpp:262
msgid "Could not apply aspect ratio setting."
msgstr "½Õ ÒÔÐÛÞáï ×ÐáâÞáãÒÐâØ ÚÞàÕÚæöî áßöÒÒöÔÝÞèÕÝÝï áâÞàöÝ."
-#: engines/engine.cpp:262
+#: engines/engine.cpp:267
msgid "Could not apply fullscreen setting."
msgstr "½Õ ÒÔÐÛÞáï ×ÐáâÞáãÒÐâØ ßÞÒÝÞÕÚàÐÝÝØÙ àÕÖØÜ."
-#: engines/engine.cpp:362
+#: engines/engine.cpp:367
msgid ""
"You appear to be playing this game directly\n"
"from the CD. This is known to cause problems,\n"
@@ -1352,7 +1357,7 @@ msgstr ""
"ÓàØ ÝÐ ÖÞàáâÚØÙ ÔØáÚ.\n"
"´ØÒöâìáï äÐÙÛ README ÔÛï ßÞÔÐÛìèØå öÝáâàãÚæöÙ."
-#: engines/engine.cpp:373
+#: engines/engine.cpp:378
msgid ""
"This game has audio tracks in its disk. These\n"
"tracks need to be ripped from the disk using\n"
@@ -1366,7 +1371,7 @@ msgstr ""
"âÞÓÞ, éÞÑ ÜÞÖÝÐ ÑãÛÞ áÛãåÐâØ ÜãרÚã ã Óàö.\n"
"´ØÒöâìáï äÐÙÛ README ÔÛï ßÞÔÐÛìèØå öÝáâàãÚæöÙ."
-#: engines/engine.cpp:431
+#: engines/engine.cpp:436
#, c-format
msgid ""
"Gamestate load failed (%s)! Please consult the README for basic information, "
@@ -1375,7 +1380,7 @@ msgstr ""
"·ÐÒÐÝâÐÖÕÝÝï áâÐÝã ÓàØ ÝÕ ÒÔÐÛÞáï (%s)! . ±ãÔì-ÛÐáÚÐ, ÔØÒöâìáï äÐÙÛ README "
"ÔÛï ÞáÝÞÒÝÞ÷ öÝÞàÜÐæö÷, Ð âÐÚÞÖ öÝáâàãÚæöÙ, ïÚ ÞâàØÜÐâØ ßÞÔÐÛìèã ÔÞßÞÜÞÓã."
-#: engines/engine.cpp:444
+#: engines/engine.cpp:449
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 "
@@ -1385,34 +1390,761 @@ msgstr ""
"ScummVM. ÁÚÞàèÕ ×Ð ÒáÕ ÒÞÝÐ ÝÕ ÑãÔÕ ßàÐæîÒÐâØ áâÐÑöÛìÝÞ, ö ×ÑÕàÕÖÕÝÝï öÓÞà, "
"ïÚö ÒØ ×àÞÑØâÕ, ÜÞÖãâì ÝÕ ßàÐæîÒÐâØ ã ßÞÔÐÛìèØå ÒÕàáöïå ScummVM."
-#: engines/engine.cpp:447
+#: engines/engine.cpp:452
msgid "Start anyway"
msgstr "²áÕ ÞÔÝÞ ×ÐßãáâØâØ"
-#: engines/agi/detection.cpp:142 engines/drascula/detection.cpp:270
-#: engines/dreamweb/detection.cpp:47 engines/sci/detection.cpp:393
-#: engines/toltecs/detection.cpp:173
+#: audio/fmopl.cpp:50
+msgid "MAME OPL emulator"
+msgstr "µÜãÛïâÞà MAME OPL"
+
+#: audio/fmopl.cpp:52
+msgid "DOSBox OPL emulator"
+msgstr "µÜãÛïâÞà DOSBox OPL"
+
+#: audio/mididrv.cpp:209
+#, c-format
+msgid ""
+"The selected audio device '%s' was not found (e.g. might be turned off or "
+"disconnected)."
+msgstr ""
+"²ØÑàÐÝØÙ ×ÒãÚÞÒØÙ ßàØáâàöÙ '%s' ÝÕ ÑãÛÞ ×ÝÐÙÔÕÝÞ (âÞÑâÞ, ÙÞÓÞ ÜÞÖÕ ÑãâØ "
+"ÒØÜÚÝÕÝÞ ÐÑÞ ÝÕ ßöÔÚÛîçÕÝÞ)."
+
+#: audio/mididrv.cpp:209 audio/mididrv.cpp:221 audio/mididrv.cpp:257
+#: audio/mididrv.cpp:272
+msgid "Attempting to fall back to the next available device..."
+msgstr "½ÐÜÐÓÐîáï ÒØÚÞàØáâÐâØ ÝÐáâãßÝØÙ ÔÞáâãßÝØÙ ßàØáâàöÙ..."
+
+#: audio/mididrv.cpp:221
+#, c-format
+msgid ""
+"The selected audio device '%s' cannot be used. See log file for more "
+"information."
+msgstr ""
+"²ØÑàÐÝØÙ ×ÒãÚÞÒØÙ ßàØáâàöÙ '%s' ÝÕ ÜÞÖÕ ÑãâØ ÒØÚÞàØáâÐÝØÙ. ´ØÒöâìáï äÐÙÛ "
+"ÛÞÓã ÔÛï ÔÞÔÐâÚÞÒÞ÷ öÝäÞàÜÐæö÷."
+
+#: audio/mididrv.cpp:257
+#, c-format
+msgid ""
+"The preferred audio device '%s' was not found (e.g. might be turned off or "
+"disconnected)."
+msgstr ""
+"ÃßÞÔÞÑÐÝØÙ ×ÒãÚÞÒØÙ ßàØáâàöÙ '%s' ÝÕ ÑãÛÞ ×ÝÐÙÔÕÝÞ (âÞÑâÞ, ÙÞÓÞ ÜÞÖÕ ÑãâØ "
+"ÒØÜÚÝÕÝÞ ÐÑÞ ÝÕ ßöÔÚÛîçÕÝÞ)."
+
+#: audio/mididrv.cpp:272
+#, c-format
+msgid ""
+"The preferred audio device '%s' cannot be used. See log file for more "
+"information."
+msgstr ""
+"ÃßÞÔÞÑÐÝØÙ ×ÒãÚÞÒØÙ ßàØáâàöÙ '%s' ÝÕ ÜÞÖÕ ÑãâØ ÒØÚÞàØáâÐÝØÙ. ´ØÒöâìáï äÐÙÛ "
+"ÛÞÓã ÔÛï ÔÞÔÐâÚÞÒÞ÷ öÝäÞàÜÐæö÷."
+
+#: audio/null.h:44
+msgid "No music"
+msgstr "±Õ× Üã×ØÚØ"
+
+#: audio/mods/paula.cpp:196
+msgid "Amiga Audio Emulator"
+msgstr "°ÜöÓÐ °ãÔöÞ µÜãÛïâÞà"
+
+#: audio/softsynth/adlib.cpp:2285
+msgid "AdLib Emulator"
+msgstr "µÜãÛïâÞà AdLib"
+
+#: audio/softsynth/appleiigs.cpp:33
+msgid "Apple II GS Emulator (NOT IMPLEMENTED)"
+msgstr "Apple II GS µÜãÛïâÞà (½µ Àµ°»¦·¾²°½¾)"
+
+#: audio/softsynth/sid.cpp:1430
+msgid "C64 Audio Emulator"
+msgstr "C64 °ãÔöÞ µÜãÛïâÞà"
+
+#: audio/softsynth/mt32.cpp:200
+msgid "Initializing MT-32 Emulator"
+msgstr "½ÐÛÐèâÞÒãî ÕÜãÛïâÞà MT-32"
+
+#: audio/softsynth/mt32.cpp:426
+msgid "MT-32 Emulator"
+msgstr "µÜãÛïâÞà MT-32"
+
+#: audio/softsynth/pcspk.cpp:139
+msgid "PC Speaker Emulator"
+msgstr "µÜãÛïâÞà PC áßöÚÕàÐ"
+
+#: audio/softsynth/pcspk.cpp:158
+msgid "IBM PCjr Emulator"
+msgstr "µÜãÛïâÞà IBM PCjr"
+
+#: backends/keymapper/remap-dialog.cpp:48
+msgid "Keymap:"
+msgstr "¼ÐßÐ ÚÛÐÒöè:"
+
+#: backends/keymapper/remap-dialog.cpp:67
+msgid " (Effective)"
+msgstr " (µäÕÚâØÒÝÐ)"
+
+#: backends/keymapper/remap-dialog.cpp:107
+msgid " (Active)"
+msgstr " (°ÚâØÒÝÐ)"
+
+#: backends/keymapper/remap-dialog.cpp:107
+msgid " (Blocked)"
+msgstr " (·ÐÑÛÞÚÞÒÐÝØÙ)"
+
+#: backends/keymapper/remap-dialog.cpp:120
+msgid " (Global)"
+msgstr " (³ÛÞÑÐÛìÝÐ)"
+
+#: backends/keymapper/remap-dialog.cpp:128
+msgid " (Game)"
+msgstr " (¦ÓàØ)"
+
+#: backends/midi/windows.cpp:165
+msgid "Windows MIDI"
+msgstr "Windows MIDI"
+
+#: backends/platform/ds/arm9/source/dsoptions.cpp:56
+#: engines/scumm/dialogs.cpp:291
+msgid "~C~lose"
+msgstr "~·~ÐÚàØâØ"
+
+#: backends/platform/ds/arm9/source/dsoptions.cpp:57
+msgid "ScummVM Main Menu"
+msgstr "³ÞÛÞÒÝÕ ÜÕÝî ScummVM"
+
+#: backends/platform/ds/arm9/source/dsoptions.cpp:63
+msgid "~L~eft handed mode"
+msgstr "»öÒÞàãÚØÙ àÕÖØÜ"
+
+#: backends/platform/ds/arm9/source/dsoptions.cpp:64
+msgid "~I~ndy fight controls"
+msgstr "ºÕàãÒÐÝÝï ÑÞïÜØ Ò Indy"
+
+#: backends/platform/ds/arm9/source/dsoptions.cpp:65
+msgid "Show mouse cursor"
+msgstr "¿ÞÚÐ×ãÒÐâØ ÚãàáÞà ÜØèö"
+
+#: backends/platform/ds/arm9/source/dsoptions.cpp:66
+msgid "Snap to edges"
+msgstr "¿àØÚàößØâØ ÔÞ ÚàÐ÷Ò"
+
+#: backends/platform/ds/arm9/source/dsoptions.cpp:68
+msgid "Touch X Offset"
+msgstr "·ÜöéÕÝÝï ÔÞâØÚöÒ ßÞ Þáö X"
+
+#: backends/platform/ds/arm9/source/dsoptions.cpp:75
+msgid "Touch Y Offset"
+msgstr "·ÜöéÕÝÝï ÔÞâØÚöÒ ßÞ Þáö Y"
+
+#: backends/platform/ds/arm9/source/dsoptions.cpp:87
+msgid "Use laptop trackpad-style cursor control"
+msgstr "²ØÚÞàØáâÞÒãÒÐâØ ãßàÐÒÛöÝÝï ÚãàáÞàÞÜ ïÚ ÝÐ âàÕÚßÐÔö ÛÐßâÞßöÒ"
+
+#: backends/platform/ds/arm9/source/dsoptions.cpp:88
+msgid "Tap for left click, double tap right click"
+msgstr "ÂÐß ÔÛï ÛöÒÞÓÞ ÚÛÐæÐÝÝï, ßÞÔÒöÙÝØÙ âÐß ÔÛï ßàÐÒÞÓÞ ÚÛÐæÐÝÝï"
+
+#: backends/platform/ds/arm9/source/dsoptions.cpp:90
+msgid "Sensitivity"
+msgstr "ÇãâÛØÒöáâì"
+
+#: backends/platform/ds/arm9/source/dsoptions.cpp:99
+msgid "Initial top screen scale:"
+msgstr "¿ÞçÐâÚÞÒØÙ ÜÐáèâÐÑ ÒÕàåÝìÞÓÞ ÕÚàÐÝã:"
+
+#: backends/platform/ds/arm9/source/dsoptions.cpp:105
+msgid "Main screen scaling:"
+msgstr "¼ÐáèâÐÑ ÓÞÛÞÒÝÞÓÞ ÕÚàÐÝã:"
+
+#: backends/platform/ds/arm9/source/dsoptions.cpp:107
+msgid "Hardware scale (fast, but low quality)"
+msgstr "ÅÐàÔÒÐàÝÕ ÜÐáèâÐÑãÒÐÝÝï (èÒØÔÚÞ, ÐÛÕ ÝØ×ìÚÞ÷ ïÚÞáâö)"
+
+#: backends/platform/ds/arm9/source/dsoptions.cpp:108
+msgid "Software scale (good quality, but slower)"
+msgstr "¿àÞÓàÐÜÝÕ ÜÐáèâÐÑãÒÐÝÝï (åÞàÞèÐ ïÚöáâì, ÐÛÕ ßÞÒöÛìÝöèÕ)"
+
+#: backends/platform/ds/arm9/source/dsoptions.cpp:109
+msgid "Unscaled (you must scroll left and right)"
+msgstr "±Õ× ÜÐáèâÐÑãÒÐÝÝï (âàÕÑÐ ÑãÔÕ ßàÞÚàãçãÒÐâØ ÝÐÛöÒÞ ö ÝÐßàÐÒÞ)"
+
+#: backends/platform/ds/arm9/source/dsoptions.cpp:111
+msgid "Brightness:"
+msgstr "ÏáÚàÐÒöáâì:"
+
+#: backends/platform/ds/arm9/source/dsoptions.cpp:121
+msgid "High quality audio (slower) (reboot)"
+msgstr "²ØáÞÚÐ ïÚöáâì ×ÒãÚã (ßÞÒöÛìÝöèÕ) (àÕÑãâ)"
+
+#: backends/platform/ds/arm9/source/dsoptions.cpp:122
+msgid "Disable power off"
+msgstr "·ÐÑÞàÞÝØâØ ÒØÜÚÝÕÝÝï"
+
+#: backends/platform/iphone/osys_events.cpp:300
+msgid "Mouse-click-and-drag mode enabled."
+msgstr "ÀÕÖØÜ ÜØèö ÚÛöÚÝãâØ-âÐ-âïÓÝãâØ ãÒöÜÚÝÕÝÞ."
+
+#: backends/platform/iphone/osys_events.cpp:302
+msgid "Mouse-click-and-drag mode disabled."
+msgstr "ÀÕÖØÜ ÜØèö ÚÛöÚÝãâØ-âÐ-âïÓÝãâØ ÒØÜÚÝÕÝÞ."
+
+#: backends/platform/iphone/osys_events.cpp:313
+msgid "Touchpad mode enabled."
+msgstr "ÀÕÖØÜ âÐçßÐÔã ãÒöÜÚÝÕÝÞ."
+
+#: backends/platform/iphone/osys_events.cpp:315
+msgid "Touchpad mode disabled."
+msgstr "ÀÕÖØÜ âÐçßÐÔã ÒØÜÚÝÕÝÞ."
+
+#: backends/platform/maemo/maemo.cpp:209
+msgid "Click Mode"
+msgstr "ÀÕÖØÜ ÚÛöÚöÒ"
+
+#: backends/platform/maemo/maemo.cpp:215
+#: backends/platform/symbian/src/SymbianActions.cpp:42
+#: backends/platform/wince/CEActionsPocket.cpp:60
+#: backends/platform/wince/CEActionsSmartphone.cpp:43
+#: backends/platform/tizen/form.cpp:275
+msgid "Left Click"
+msgstr "»öÒØÙ ÚÛöÚ"
+
+#: backends/platform/maemo/maemo.cpp:218
+msgid "Middle Click"
+msgstr "ÁÕàÕÔÝöÙ ÚÛöÚ"
+
+#: backends/platform/maemo/maemo.cpp:221
+#: backends/platform/symbian/src/SymbianActions.cpp:43
+#: backends/platform/wince/CEActionsSmartphone.cpp:44
+#: backends/platform/tizen/form.cpp:267
+msgid "Right Click"
+msgstr "¿àÐÒØÙ ÚÛöÚ"
+
+#: backends/platform/sdl/macosx/appmenu_osx.mm:77
+msgid "Hide ScummVM"
+msgstr "ÁåÞÒÐâØ ScummVM"
+
+#: backends/platform/sdl/macosx/appmenu_osx.mm:82
+msgid "Hide Others"
+msgstr "ÁåÞÒÐâØ ¦Ýèö"
+
+#: backends/platform/sdl/macosx/appmenu_osx.mm:87
+msgid "Show All"
+msgstr "¿ÞÚÐ×ÐâØ ²áÕ"
+
+#: backends/platform/sdl/macosx/appmenu_osx.mm:109
+#: backends/platform/sdl/macosx/appmenu_osx.mm:120
+msgid "Window"
+msgstr "²öÚÝÞ"
+
+#: backends/platform/sdl/macosx/appmenu_osx.mm:114
+msgid "Minimize"
+msgstr "¼öÝöÜö×ãÒÐâØ"
+
+#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:46
+msgid "Normal (no scaling)"
+msgstr "±Õ× ×ÑöÛìèÕÝÝï"
+
+#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:65
+msgctxt "lowres"
+msgid "Normal (no scaling)"
+msgstr "±Õ× ×ÑöÛìèÕÝÝï"
+
+#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2148
+msgid "Enabled aspect ratio correction"
+msgstr "ºÞàÕÚæöî áßöÒÒöÔÝÞèÕÝÝï áâÞàöÝ ãÒöÜÚÝÕÝÞ"
+
+#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2154
+msgid "Disabled aspect ratio correction"
+msgstr "ºÞàÕÚæöî áßöÒÒöÔÝÞèÕÝÝï áâÞàöÝ ÒØÜÚÝÕÝÞ"
+
+#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2209
+msgid "Active graphics filter:"
+msgstr "¿ÞâÞçÝØÙ ÓàÐäöçÝØÙ äöÛìâà:"
+
+#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2251
+msgid "Windowed mode"
+msgstr "²öÚÞÝÝØÙ àÕÖØÜ"
+
+#: backends/graphics/opengl/opengl-graphics.cpp:118
+#, fuzzy
+msgid "OpenGL"
+msgstr "²öÔÚàØâØ"
+
+#: backends/graphics/opengl/opengl-graphics.cpp:119
+msgid "OpenGL (No filtering)"
+msgstr ""
+
+#: backends/platform/symbian/src/SymbianActions.cpp:38
+#: backends/platform/wince/CEActionsSmartphone.cpp:39
+msgid "Up"
+msgstr "´ÞÓÞàØ"
+
+#: backends/platform/symbian/src/SymbianActions.cpp:39
+#: backends/platform/wince/CEActionsSmartphone.cpp:40
+msgid "Down"
+msgstr "´ÞÝØ×ã"
+
+#: backends/platform/symbian/src/SymbianActions.cpp:40
+#: backends/platform/wince/CEActionsSmartphone.cpp:41
+msgid "Left"
+msgstr "½ÐÛöÒÞ"
+
+#: backends/platform/symbian/src/SymbianActions.cpp:41
+#: backends/platform/wince/CEActionsSmartphone.cpp:42
+msgid "Right"
+msgstr "½ÐßàÐÒÞ"
+
+#: backends/platform/symbian/src/SymbianActions.cpp:46
+#: backends/platform/wince/CEActionsSmartphone.cpp:47
+msgid "Zone"
+msgstr "·ÞÝÐ"
+
+#: backends/platform/symbian/src/SymbianActions.cpp:47
+#: backends/platform/wince/CEActionsPocket.cpp:54
+#: backends/platform/wince/CEActionsSmartphone.cpp:48
+msgid "Multi Function"
+msgstr "¼ãÛìâØäãÝÚæöï"
+
+#: backends/platform/symbian/src/SymbianActions.cpp:48
+msgid "Swap character"
+msgstr "·ÜöÝØâØ ÓÕàÞï"
+
+#: backends/platform/symbian/src/SymbianActions.cpp:49
+msgid "Skip text"
+msgstr "¿àÞßãáâØâØ âÕÚáâ"
+
+#: backends/platform/symbian/src/SymbianActions.cpp:51
+msgid "Fast mode"
+msgstr "ÈÒØÔÚØÙ àÕÖØÜ"
+
+#: 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:218
+#: engines/scumm/dialogs.cpp:192 engines/scumm/help.cpp:82
+#: engines/scumm/help.cpp:84
+msgid "Quit"
+msgstr "²ØåöÔ"
+
+#: backends/platform/symbian/src/SymbianActions.cpp:53
+msgid "Debugger"
+msgstr "²öÔÛÐÔçØÚ"
+
+#: backends/platform/symbian/src/SymbianActions.cpp:54
+msgid "Global menu"
+msgstr "³ÛÞÑÐÛìÝÕ ÜÕÝî"
+
+#: backends/platform/symbian/src/SymbianActions.cpp:55
+msgid "Virtual keyboard"
+msgstr "²öàâãÐÛìÝÐ ÚÛÐÒöÐâãàÐ"
+
+#: backends/platform/symbian/src/SymbianActions.cpp:56
+msgid "Key mapper"
+msgstr "¿àØ×ÝÐçÕÝÝï ÚÛÐÒöè"
+
+#: backends/events/symbiansdl/symbiansdl-events.cpp:184
+msgid "Do you want to quit ?"
+msgstr "²Ø ÔöÙáÝÞ åÞçÕâÕ ÒØÙâØ?"
+
+#: backends/platform/wii/options.cpp:51
+msgid "Video"
+msgstr "²öÔÕÞ"
+
+#: backends/platform/wii/options.cpp:54
+msgid "Current video mode:"
+msgstr "¿ÞâÞçÝØÙ ÒöÔÕÞàÕÖØÜ:"
+
+#: backends/platform/wii/options.cpp:56
+msgid "Double-strike"
+msgstr "¿ÞÔÒöÙÝØÙ ãÔÐà"
+
+#: backends/platform/wii/options.cpp:60
+msgid "Horizontal underscan:"
+msgstr "³ÞàØ×ÞÝâÐÛìÝØÙ underscan:"
+
+#: backends/platform/wii/options.cpp:66
+msgid "Vertical underscan:"
+msgstr "²ÕàâØÚÐÛìÝØÙ underscan:"
+
+#: backends/platform/wii/options.cpp:71
+msgid "Input"
+msgstr "²ÒöÔ"
+
+#: backends/platform/wii/options.cpp:74
+msgid "GC Pad sensitivity:"
+msgstr "ÇãâÛØÒöáâì GC ßÐÔã:"
+
+#: backends/platform/wii/options.cpp:80
+msgid "GC Pad acceleration:"
+msgstr "¿àØáÚÞàÕÝÝï GC ßÐÔã:"
+
+#: backends/platform/wii/options.cpp:86
+msgid "DVD"
+msgstr "DVD"
+
+#: backends/platform/wii/options.cpp:89 backends/platform/wii/options.cpp:101
+msgid "Status:"
+msgstr "ÁâÐÝ:"
+
+#: backends/platform/wii/options.cpp:90 backends/platform/wii/options.cpp:102
+msgid "Unknown"
+msgstr "½ÕÒöÔÞÜÞ"
+
+#: backends/platform/wii/options.cpp:93
+msgid "Mount DVD"
+msgstr "¿öÔÚÛîçØâØ DVD"
+
+#: backends/platform/wii/options.cpp:94
+msgid "Unmount DVD"
+msgstr "²öÔÚÛîçØâØ DVD"
+
+#: backends/platform/wii/options.cpp:98
+msgid "SMB"
+msgstr "SMB"
+
+#: backends/platform/wii/options.cpp:106
+msgid "Server:"
+msgstr "ÁÕàÒÕà:"
+
+#: backends/platform/wii/options.cpp:110
+msgid "Share:"
+msgstr "¼ÕàÕÖÕÒÐ ßÐßÚÐ:"
+
+#: backends/platform/wii/options.cpp:114
+msgid "Username:"
+msgstr "ºÞàØáâãÒÐç:"
+
+#: backends/platform/wii/options.cpp:118
+msgid "Password:"
+msgstr "¿ÐàÞÛì:"
+
+#: backends/platform/wii/options.cpp:121
+msgid "Init network"
+msgstr "½ÐÛÐèâãÒÐÝÝï ÜÕàÕÖö"
+
+#: backends/platform/wii/options.cpp:123
+msgid "Mount SMB"
+msgstr "¿öÔÚÛîçØâØ SMB"
+
+#: backends/platform/wii/options.cpp:124
+msgid "Unmount SMB"
+msgstr "²öÔÚÛîçâØ SMB"
+
+#: backends/platform/wii/options.cpp:143
+msgid "DVD Mounted successfully"
+msgstr "DVD ßöÔÚÛîçÕÝÞ ãáßöèÝÞ"
+
+#: backends/platform/wii/options.cpp:146
+msgid "Error while mounting the DVD"
+msgstr "¿ÞÜØÛÚÐ ßöÔ çÐá ßöÔÚÛîçÕÝÝï DVD"
+
+#: backends/platform/wii/options.cpp:148
+msgid "DVD not mounted"
+msgstr "DVD ÝÕ ßöÔÚÛîçÕÝÞ"
+
+#: backends/platform/wii/options.cpp:161
+msgid "Network up, share mounted"
+msgstr "¼ÕàÕÖÐ ßàÐæîô, ßÐßÚã ßöÔÚÛîçÕÝÞ"
+
+#: backends/platform/wii/options.cpp:163
+msgid "Network up"
+msgstr "¼ÕàÕÖÐ ßàÐæîô"
+
+#: backends/platform/wii/options.cpp:166
+msgid ", error while mounting the share"
+msgstr ", ßÞÜØÛÚÐ ßöÔ çÐá ßöÔÚÛîçÕÝÝï ßÐßÚØ"
+
+#: backends/platform/wii/options.cpp:168
+msgid ", share not mounted"
+msgstr ", ßÐßÚã ÝÕ ßöÔÚÛîçÕÝÞ"
+
+#: backends/platform/wii/options.cpp:174
+msgid "Network down"
+msgstr "¼ÕàÕÖã ÒØÜÚÝÕÝÞ"
+
+#: backends/platform/wii/options.cpp:178
+msgid "Initializing network"
+msgstr "½ÐÛÐèâÞÒãî ÜÕàÕÖã"
+
+#: backends/platform/wii/options.cpp:182
+msgid "Timeout while initializing network"
+msgstr "ÇÐá ßöÔÚÛîçÕÝÝï ÔÞ ÜÕàÕÖö ÒØÙèÞÒ"
+
+#: backends/platform/wii/options.cpp:186
+#, c-format
+msgid "Network not initialized (%d)"
+msgstr "¼ÕàÕÖã ÝÕ ÝÐÛÐèâÞÒÐÝÞ (%d)"
+
+#: backends/platform/wince/CEActionsPocket.cpp:46
+msgid "Hide Toolbar"
+msgstr "·ÐåÞÒÐâØ ßÐÝÕÛì öÝáâàãÜÕÝâöÒ"
+
+#: backends/platform/wince/CEActionsPocket.cpp:47
+msgid "Show Keyboard"
+msgstr "¿ÞÚÐ×ÐâØ ÚÛÐÒöÐâãàã"
+
+#: backends/platform/wince/CEActionsPocket.cpp:48
+msgid "Sound on/off"
+msgstr "·ÒãÚ ãÒöÜ/ÒØÜÚ"
+
+#: backends/platform/wince/CEActionsPocket.cpp:49
+msgid "Right click"
+msgstr "¿àÐÒØÙ ÚÛöÚ"
+
+#: backends/platform/wince/CEActionsPocket.cpp:50
+msgid "Show/Hide Cursor"
+msgstr "¿ÞÚÐ×ÐâØ/áåÞÒÐâØ ÚãàáÞà"
+
+#: backends/platform/wince/CEActionsPocket.cpp:51
+msgid "Free look"
+msgstr "²öÛìÝØÙ ÞÓÛïÔ"
+
+#: backends/platform/wince/CEActionsPocket.cpp:52
+msgid "Zoom up"
+msgstr "·ÑöÛ. ÜÐáèâÐÑ"
+
+#: backends/platform/wince/CEActionsPocket.cpp:53
+msgid "Zoom down"
+msgstr "·ÜÝè. ÜÐáèâÐÑ"
+
+#: backends/platform/wince/CEActionsPocket.cpp:55
+#: backends/platform/wince/CEActionsSmartphone.cpp:49
+msgid "Bind Keys"
+msgstr "¿àØ×ÝÐçØâØ ÚÛÐÒöèö"
+
+#: backends/platform/wince/CEActionsPocket.cpp:56
+msgid "Cursor Up"
+msgstr "ºãàáÞà ÔÞÓÞàØ"
+
+#: backends/platform/wince/CEActionsPocket.cpp:57
+msgid "Cursor Down"
+msgstr "ºãàáÞà ÔÞÝØ×ã"
+
+#: backends/platform/wince/CEActionsPocket.cpp:58
+msgid "Cursor Left"
+msgstr "ºãàáÞà ÝÐÛöÒÞ"
+
+#: backends/platform/wince/CEActionsPocket.cpp:59
+msgid "Cursor Right"
+msgstr "ºãàáÞà ÝÐßàÐÒÞ"
+
+#: 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:326
+#: backends/platform/wince/CEActionsSmartphone.cpp:287
+msgid " Are you sure you want to quit ? "
+msgstr " ²Ø ãßÕÒÝÕÝö, éÞ åÞçÕâÕ ÒØÙâØ? "
+
+#: backends/platform/wince/CEActionsSmartphone.cpp:50
+msgid "Keyboard"
+msgstr "ºÛÐÒöÐâãàÐ"
+
+#: backends/platform/wince/CEActionsSmartphone.cpp:51
+msgid "Rotate"
+msgstr "¿ÞÒÕàÝãâØ"
+
+#: backends/platform/wince/CELauncherDialog.cpp:56
+msgid "Using SDL driver "
+msgstr "²ØÚÞàØáâÞÒãî ÔàÐÙÒÕà SDL "
+
+#: backends/platform/wince/CELauncherDialog.cpp:60
+msgid "Display "
+msgstr "¿ÞÚÐ×ÐâØ "
+
+#: backends/platform/wince/CELauncherDialog.cpp:83
+msgid "Do you want to perform an automatic scan ?"
+msgstr "²Ø åÞçÕâÕ ×ÔöÙáÝØâØ ÐÒâÞÜÐâØçÝØÙ ßÞèãÚ?"
+
+#: backends/platform/wince/wince-sdl.cpp:516
+msgid "Map right click action"
+msgstr "¿ÕàÕßàØ×ÝÐçÕÝÝï ßàÐÒÞÓÞ ÚÛöÚã"
+
+#: backends/platform/wince/wince-sdl.cpp:520
+msgid "You must map a key to the 'Right Click' action to play this game"
+msgstr "²Ø ßÞÒØÝÝö ßàØ×ÝÐçØâØ ÚÝÞßÚã ÔÞ Ôö÷ '¿àÐÒØÙ ÚÛöÚ', éÞÑ ÓàÐâØ ã æî Óàã"
+
+#: backends/platform/wince/wince-sdl.cpp:529
+msgid "Map hide toolbar action"
+msgstr "¿ÕàÕßàØ×ÝÐçØâØ Ôöî 'ÁåÞÒÐâØ ¿ÐÝÕÛì öÝáâà.'"
+
+#: backends/platform/wince/wince-sdl.cpp:533
+msgid "You must map a key to the 'Hide toolbar' action to play this game"
+msgstr ""
+"²Ø ßÞÒØÝÝö ßÕàÕßàØ×ÝÐçØâØ ÚÝÞßÚã ÔÛï Ôö÷ 'ÁåÞÒÐâØ ¿ÐÝÕÛì öÝáâà.', éÞÑ ÓàÐâØ "
+"ã æî Óàã"
+
+#: backends/platform/wince/wince-sdl.cpp:542
+msgid "Map Zoom Up action (optional)"
+msgstr "¿ÕàÕßàØ×ÝÐçØâØ Ôöî ·ÑöÛìèÕÝÝï (ÝÕÞÑÞÒ'ï×ÚÞÒÞ)"
+
+#: backends/platform/wince/wince-sdl.cpp:545
+msgid "Map Zoom Down action (optional)"
+msgstr "¿ÕàÕßàØ×ÝÐçØâØ Ôöî ·ÜÕÝèÕÝÝï (ÝÕÞÑÞÒ'ï×ÚÞÒÞ)"
+
+#: backends/platform/wince/wince-sdl.cpp:553
+msgid ""
+"Don't forget to map a key to 'Hide Toolbar' action to see the whole inventory"
+msgstr ""
+"½Õ ×ÐÑãÔìâÕ ßÕàÕßàØ×ÝÐçØâØ ÚÝÞßÚã ÔÛï Ôö÷ 'ÁåÞÒÐâØ ¿ÐÝÕÛì öÝáâà.' éÞÑ "
+"ßÞÑÐçØâØ ÒÕáì öÝÒÕÝâÐà"
+
+#: backends/events/default/default-events.cpp:196
+msgid "Do you really want to return to the Launcher?"
+msgstr "²Ø ÔöÙáÝÞ åÞçÕâÕ ßÞÒÕàÝãâØáï ÔÞ ÓÞÛÞÒÝÞÓÞ ÜÕÝî?"
+
+#: backends/events/default/default-events.cpp:196
+msgid "Launcher"
+msgstr "³ÞÛÞÒÝÕ ÜÕÝî"
+
+#: backends/events/default/default-events.cpp:218
+msgid "Do you really want to quit?"
+msgstr "²Ø ÔöÙáÝÞ åÞçÕâÕ ÒØÙâØ?"
+
+#: backends/events/gph/gph-events.cpp:386
+#: backends/events/gph/gph-events.cpp:429
+#: backends/events/openpandora/op-events.cpp:168
+msgid "Touchscreen 'Tap Mode' - Left Click"
+msgstr "ÀÕÖØÜ ÔÞâØÚã ã âÐçáÚàöÝö - »öÒØÙ ÚÛöÚ"
+
+#: backends/events/gph/gph-events.cpp:388
+#: backends/events/gph/gph-events.cpp:431
+#: backends/events/openpandora/op-events.cpp:170
+msgid "Touchscreen 'Tap Mode' - Right Click"
+msgstr "ÀÕÖØÜ ÔÞâØÚã ã âÐçáÚàöÝö - ¿àÐÒØÙ ÚÛöÚ"
+
+#: backends/events/gph/gph-events.cpp:390
+#: backends/events/gph/gph-events.cpp:433
+#: backends/events/openpandora/op-events.cpp:172
+msgid "Touchscreen 'Tap Mode' - Hover (No Click)"
+msgstr "ÀÕÖØÜ ÔÞâØÚã ã âÐçáÚàöÝö - ¿àÞÛöâ (ÑÕ× ÚÛöÚã)"
+
+#: backends/events/gph/gph-events.cpp:410
+msgid "Maximum Volume"
+msgstr "¼ÐÚáØÜÐÛìÝÐ ³ãçÝöáâì"
+
+#: backends/events/gph/gph-events.cpp:412
+msgid "Increasing Volume"
+msgstr "¿öÔÒØéÕÝÝï ÓãçÝÞáâö"
+
+#: backends/events/gph/gph-events.cpp:418
+msgid "Minimal Volume"
+msgstr "¼öÝöÜÐÛìÝÐ ³ãçÝöáâì"
+
+#: backends/events/gph/gph-events.cpp:420
+msgid "Decreasing Volume"
+msgstr "¿ÞÝØÖÕÝÝï ÓãçÝÞáâö"
+
+#: backends/events/openpandora/op-events.cpp:174
+msgid "Touchscreen 'Tap Mode' - Hover (DPad Clicks)"
+msgstr "ÀÕÖØÜ ÔÞâØÚã ã âÐçáÚàöÝö - ¿àÞÛöâ (ÚÛöÚ DPad)"
+
+#: backends/updates/macosx/macosx-updates.mm:67
+msgid "Check for Updates..."
+msgstr "¿ÕàÕÒöàïî ÞÝÞÒÛÕÝÝï..."
+
+#: backends/platform/tizen/form.cpp:263
+msgid "Right Click Once"
+msgstr "¾ÔØÝ ßàÐÒØÙ ÚÛöÚ"
+
+#: backends/platform/tizen/form.cpp:271
+msgid "Move Only"
+msgstr "ÂöÛìÚØ ßÕàÕÜöáâØâØ"
+
+#: backends/platform/tizen/form.cpp:294
+msgid "Escape Key"
+msgstr "ºÛÐÒöèÐ ESC"
+
+#: backends/platform/tizen/form.cpp:299
+msgid "Game Menu"
+msgstr "¼ÕÝî ÓàØ"
+
+#: backends/platform/tizen/form.cpp:304
+msgid "Show Keypad"
+msgstr "¿ÞÚÐ×ÐâØ ÚÛÐÒöÐâãàã"
+
+#: backends/platform/tizen/form.cpp:309
+msgid "Control Mouse"
+msgstr "ÃßàÐÒÛöÝÝï ÜØèÕî"
+
+#: backends/events/maemosdl/maemosdl-events.cpp:192
+msgid "Clicking Enabled"
+msgstr "ºÛöÚØ ãÒöÜÚÝÕÝÞ"
+
+#: backends/events/maemosdl/maemosdl-events.cpp:192
+msgid "Clicking Disabled"
+msgstr "ºÛöÚØ ÒØÜÚÝÕÝÞ"
+
+#: engines/agi/detection.cpp:142 engines/drascula/detection.cpp:302
+#: engines/dreamweb/detection.cpp:47 engines/neverhood/detection.cpp:160
+#: engines/sci/detection.cpp:394 engines/toltecs/detection.cpp:186
msgid "Use original save/load screens"
msgstr "²ØÚÞàØáâÞÒãÒÐâØ ÞàØÓ. ×ÑÕàÕÖÕÝÝï/×ÐÒÐÝâÐÖÕÝÝï ÕÚàÐÝØ"
-#: engines/agi/detection.cpp:143 engines/drascula/detection.cpp:271
-#: engines/dreamweb/detection.cpp:48 engines/sci/detection.cpp:394
-#: engines/toltecs/detection.cpp:174
+#: engines/agi/detection.cpp:143 engines/drascula/detection.cpp:303
+#: engines/dreamweb/detection.cpp:48 engines/neverhood/detection.cpp:161
+#: engines/sci/detection.cpp:395 engines/toltecs/detection.cpp:187
msgid "Use the original save/load screens, instead of the ScummVM ones"
msgstr ""
"²ØÚÞàØáâÞÒãÒÐâØ ÞàØÓöÝÐÛìÝö ×ÑÕàÕÖÕÝÝï/×ÐÒÐÝâÐÖÕÝÝï ÕÚàÐÝØ, ×ÐÜöáâì ScummVM"
-#: engines/agi/saveload.cpp:816 engines/drascula/saveload.cpp:351
-#: engines/sci/engine/kfile.cpp:841 engines/toltecs/menu.cpp:259
+#: engines/agi/saveload.cpp:816 engines/drascula/saveload.cpp:349
+#: engines/neverhood/menumodule.cpp:886 engines/sci/engine/kfile.cpp:857
+#: engines/toltecs/menu.cpp:256
msgid "Restore game:"
msgstr "²öÔÝÞ񯉯 Óàã:"
-#: engines/agi/saveload.cpp:816 engines/drascula/saveload.cpp:351
-#: engines/sci/engine/kfile.cpp:841 engines/toltecs/menu.cpp:259
+#: engines/agi/saveload.cpp:816 engines/drascula/saveload.cpp:349
+#: engines/neverhood/menumodule.cpp:886 engines/sci/engine/kfile.cpp:857
+#: engines/toltecs/menu.cpp:256
msgid "Restore"
msgstr "²öÔÝÞÒØâØ"
-#: engines/drascula/saveload.cpp:49
+#: engines/agos/saveload.cpp:160 engines/scumm/scumm.cpp:2321
+#, c-format
+msgid ""
+"Failed to load game state from file:\n"
+"\n"
+"%s"
+msgstr ""
+"½Õ ÒÔÐÛÞáï ×ÐÒÐÝâÐÖØâØ áâÐÝ ÓàØ × äÐÙÛã:\n"
+"\n"
+"%s"
+
+#: engines/agos/saveload.cpp:195 engines/scumm/scumm.cpp:2314
+#, c-format
+msgid ""
+"Failed to save game state to file:\n"
+"\n"
+"%s"
+msgstr ""
+"½Õ ÒÔÐÛÞáï ×ÑÕàÕÓâØ áâÐÝ ÓàØ ã äÐÙÛ:\n"
+"\n"
+"%s"
+
+#: engines/agos/saveload.cpp:203 engines/scumm/scumm.cpp:2332
+#, c-format
+msgid ""
+"Successfully saved game state in file:\n"
+"\n"
+"%s"
+msgstr ""
+"ÃáßöèÝÞ ×ÑÕàÖÕÝÞ áâÐÝ ÓàØ ã äÐÙÛö:\n"
+"\n"
+"%s"
+
+#: engines/agos/animation.cpp:557
+#, c-format
+msgid "Cutscene file '%s' not found!"
+msgstr "ÄÐÙÛ ×ÐáâÐÒÚØ '%s' ÝÕ ×ÝÐÙÔÕÝÞ!"
+
+#: engines/drascula/saveload.cpp:47
msgid ""
"ScummVM found that you have old savefiles for Drascula that should be "
"converted.\n"
@@ -1437,27 +2169,303 @@ msgstr "²ØÚÞàØáâÞÒãÒÐâØ ïáÚàÐÒØÙ àÕÖØÜ ßÐÛöâàØ"
msgid "Display graphics using the game's bright palette"
msgstr "²öÔÞÑàÐÖÕÝÝï ÓàÐäöÚØ × ÒØÚÞàØáâÐÝÝïÜ ïáÚàÐÒÞ÷ ßÐÛöâàØ öÓà"
-#: engines/sci/detection.cpp:373
+#: engines/gob/inter_playtoons.cpp:256 engines/gob/inter_v2.cpp:1470
+#: engines/tinsel/saveload.cpp:532
+msgid "Failed to load game state from file."
+msgstr "½Õ ÒÔÐÛÞáï ×ÐÒÐÝâÐÖØâØ áâÐÝ ÓàØ × äÐÙÛã."
+
+#: engines/gob/inter_v2.cpp:1540 engines/tinsel/saveload.cpp:545
+msgid "Failed to save game state to file."
+msgstr "½Õ ÒÔÐÛÞáï ×ÑÕàÕÓâØ áâÐÝ ÓàØ ã äÐÙÛ."
+
+#: engines/gob/inter_v5.cpp:107
+msgid "Failed to delete file."
+msgstr "½Õ ÒÔÐÛÞáï ÒØÔÐ󯉯 äÐÙÛ."
+
+#: engines/groovie/detection.cpp:312
+msgid "Fast movie speed"
+msgstr "ÀÕÖØÜ èÒØÔÚÞÓÞ ÒöÔÕÞ"
+
+#: engines/groovie/detection.cpp:313
+msgid "Play movies at an increased speed"
+msgstr "¿àÞÓàÐÒÐâØ ÒöÔÕÞ × ßöÔÒØéÕÝÝÞî èÒØÔÚöáâî"
+
+#: engines/groovie/script.cpp:399
+msgid "Failed to save game"
+msgstr "½Õ ÒÔÐÛÞáï ×ÐߨáÐâØ Óàã"
+
+#. I18N: Studio audience adds an applause and cheering sounds whenever
+#. Malcolm makes a joke.
+#: engines/kyra/detection.cpp:62
+msgid "Studio audience"
+msgstr "ÁâãÔöï ÐãÔØâÞàö÷"
+
+#: engines/kyra/detection.cpp:63
+msgid "Enable studio audience"
+msgstr "ÃÒöÜÚÝãâØ áâãÔöî ÐãÔØâÞàö÷"
+
+#. I18N: This option allows the user to skip text and cutscenes.
+#: engines/kyra/detection.cpp:73
+msgid "Skip support"
+msgstr "¿öÔâàØÜãÒÐâØ ¿àÞßãáâØâØ"
+
+#: engines/kyra/detection.cpp:74
+msgid "Allow text and cutscenes to be skipped"
+msgstr "´Þ×ÒÞ󯉯 ßàÞßãáÚÐâØ âÕÚáâ ö àÞÛØÚØ"
+
+#. I18N: Helium mode makes people sound like they've inhaled Helium.
+#: engines/kyra/detection.cpp:84
+msgid "Helium mode"
+msgstr "ÀÕÖØÜ ³ÕÛöãÜ"
+
+#: engines/kyra/detection.cpp:85
+msgid "Enable helium mode"
+msgstr "ÃÒöÜÚÝãâØ àÕÖØÜ ³ÕÛöãÜ"
+
+#. I18N: When enabled, this option makes scrolling smoother when
+#. changing from one screen to another.
+#: engines/kyra/detection.cpp:99
+msgid "Smooth scrolling"
+msgstr "¿ÛÐÒÝÐ ßàÞÚàãâÚÐ"
+
+#: engines/kyra/detection.cpp:100
+msgid "Enable smooth scrolling when walking"
+msgstr "ÃÒöÜÚÝãâØ ßÛÐÒÝã ßàÞÚàãâÚã ßàØ åÞÔìÑö"
+
+#. I18N: When enabled, this option changes the cursor when it floats to the
+#. edge of the screen to a directional arrow. The player can then click to
+#. walk towards that direction.
+#: engines/kyra/detection.cpp:112
+msgid "Floating cursors"
+msgstr "¿ÛÐÒÐîçö ÚãàáÞàØ"
+
+#: engines/kyra/detection.cpp:113
+msgid "Enable floating cursors"
+msgstr "ÃÒöÜÚÝãâØ ßÛÐÒÐîçö ÚãàáÞàØ"
+
+#. I18N: HP stands for Hit Points
+#: engines/kyra/detection.cpp:127
+msgid "HP bar graphs"
+msgstr "ÁâÞÒßçØÚØ ×ÔÞàÞÒ'ï"
+
+#: engines/kyra/detection.cpp:128
+msgid "Enable hit point bar graphs"
+msgstr "ÃØöÜÚÝãâØ ÓàÐäöçÝö áâÞÒߨçÚØ ×ÔÞàÞÒ'ï"
+
+#: engines/kyra/lol.cpp:478
+msgid "Attack 1"
+msgstr "°âÐÚÐ 1"
+
+#: engines/kyra/lol.cpp:479
+msgid "Attack 2"
+msgstr "°âÐÚÐ 2"
+
+#: engines/kyra/lol.cpp:480
+msgid "Attack 3"
+msgstr "°âÐÚÐ 3"
+
+#: engines/kyra/lol.cpp:481
+msgid "Move Forward"
+msgstr "ÀãåÐâØáì ãßÕàÕÔ"
+
+#: engines/kyra/lol.cpp:482
+msgid "Move Back"
+msgstr "ÀãåÐâØáì ÝÐ×ÐÔ"
+
+#: engines/kyra/lol.cpp:483
+msgid "Slide Left"
+msgstr "ºÞÒ×ÐâØ ÝÐÛöÒÞ"
+
+#: engines/kyra/lol.cpp:484
+msgid "Slide Right"
+msgstr "ºÞÒ×ÐâØ ÝÐßàÐÒÞ"
+
+#: engines/kyra/lol.cpp:485 engines/pegasus/pegasus.cpp:2509
+msgid "Turn Left"
+msgstr "¿ÞÒÕàÝãâØáï ÝÐÛöÒÞ"
+
+#: engines/kyra/lol.cpp:486 engines/pegasus/pegasus.cpp:2510
+msgid "Turn Right"
+msgstr "¿ÞÒÕàÝãâØáï ÝÐßàÐÒÞ"
+
+#: engines/kyra/lol.cpp:487
+msgid "Rest"
+msgstr "²öÔßÞçØâØ"
+
+#: engines/kyra/lol.cpp:488
+msgid "Options"
+msgstr "½ÐÛÐèâãÒÐÝÝï"
+
+#: engines/kyra/lol.cpp:489
+msgid "Choose Spell"
+msgstr "²ØÑàÐâØ ×ÐÚÛïââï"
+
+#: engines/kyra/sound_midi.cpp:477
+msgid ""
+"You appear to be using a General MIDI device,\n"
+"but your game only supports Roland MT32 MIDI.\n"
+"We try to map the Roland MT32 instruments to\n"
+"General MIDI ones. It is still possible that\n"
+"some tracks sound incorrect."
+msgstr ""
+"·ÔÐôâìáï, éÞ ²Ø ÒØÚÞàØáâÞÒãôâÕ ßàØáâàöÙ General\n"
+"MIDI, ÐÛÕ ²ÐèÐ ÓàÐ ßöÔâàØÜãô âöÛìÚØ Roland MT32\n"
+"MIDI. ¼Ø áßàÞÑãôÜÞ ×ÐÜÐßØâØ öÝáâàãÜÕÝâØ Roland\n"
+"MT32 ÝÐ General MIDI. °ÛÕ Ò àÕ×ãÛìâÐâö ÜÞÖÕ\n"
+"áâÐâØáï, éÞ ÔÕïÚö âàÕÚØ ÑãÔãâì ÓàÐâØ ÝÕßàÐÒØÛìÝÞ."
+
+#. I18N: Option for fast scene switching
+#: engines/mohawk/dialogs.cpp:92 engines/mohawk/dialogs.cpp:167
+msgid "~Z~ip Mode Activated"
+msgstr "ÀÕÖØÜ èÒØÔÚÞÓÞ ßÕàÕåÞÔã ÐÚâØÒÞÒÐÝÞ"
+
+#: engines/mohawk/dialogs.cpp:93
+msgid "~T~ransitions Enabled"
+msgstr "¿ÕàÕåÞÔØ ÐÚâØÒÞÒÐÝÞ"
+
+#. I18N: Drop book page
+#: engines/mohawk/dialogs.cpp:95
+msgid "~D~rop Page"
+msgstr "²ØÚØÝãâØ áâÞàöÝÚã"
+
+#: engines/mohawk/dialogs.cpp:99
+msgid "~S~how Map"
+msgstr "¿ÞÚÐ×ÐâØ ÜÐßã"
+
+#: engines/mohawk/dialogs.cpp:105
+msgid "~M~ain Menu"
+msgstr "³ÞÛÞÒÝÕ ÜÕÝî"
+
+#: engines/mohawk/dialogs.cpp:168
+msgid "~W~ater Effect Enabled"
+msgstr "µäÕÚâØ ÒÞÔØ ãÒöÜÚÝÕÝÞ"
+
+#: engines/neverhood/detection.cpp:167
+msgid "Skip the Hall of Records storyboard scenes"
+msgstr ""
+
+#: engines/neverhood/detection.cpp:168
+msgid "Allows the player to skip past the Hall of Records storyboard scenes"
+msgstr ""
+
+#: engines/neverhood/detection.cpp:174
+msgid "Scale the making of videos to full screen"
+msgstr ""
+
+#: engines/neverhood/detection.cpp:175
+msgid "Scale the making of videos, so that they use the whole screen"
+msgstr ""
+
+#: engines/parallaction/saveload.cpp:133
+#, c-format
+msgid ""
+"Can't save game in slot %i\n"
+"\n"
+msgstr ""
+"½Õ ÜÞÖã ×ÑÕàÕÓâØ Óàã ã áÛÞâ %i\n"
+"\n"
+
+#: engines/parallaction/saveload.cpp:204
+msgid "Loading game..."
+msgstr "·ÐÒÐÝâÐÖãî Óàã..."
+
+#: engines/parallaction/saveload.cpp:219
+msgid "Saving game..."
+msgstr "·ÑÕàÕÖãî Óàã..."
+
+#: engines/parallaction/saveload.cpp:272
+msgid ""
+"ScummVM found that you have old savefiles for Nippon Safes that should be "
+"renamed.\n"
+"The old names are 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 next time.\n"
+msgstr ""
+"ScummVM ×ÝÐÙèÞÒ, éÞ ²Ø ÜÐôâÕ áâÐàö ×ÑÕàÕÖÕÝÝï öÓÞà ÔÛï Nippon Safes.\n"
+"·ÑÕàÕÖÕÝÝï ã áâÐàÞÜã äÞàÜÐâö ÝÕ ßöÔâàØÜãîâìáï, ö ²Ø ÝÕ ×ÜÞÖÕâÕ ÷å "
+"×ÐÒÐÝâÐÖØâØ, ïÚéÞ ÝÕ ßÕàÕÒÕÔÕâÕ ã ÝÞÒØÙ äÞàÜÐâ.\n"
+"\n"
+"½ÐâØáÝöâì ¾º, éÞÑ ßÕàÕÒÕáâØ ÷å ×ÐàÐ×, öÝÐÚèÕ ãÕ ßÞÒöÔÞÜÛÕÝÝï ×'ïÒØâìáï ßàØ "
+"ÝÐáâãßÝÞÜã ×ÐßãáÚã ÓàØ.\n"
+
+#: engines/parallaction/saveload.cpp:319
+msgid "ScummVM successfully converted all your savefiles."
+msgstr "ScummVM ãáßöèÝÞ ßÕàÕÒöÒ ãáö ²Ðèö ×ÑÕàÕÖÕÝÝï."
+
+#: engines/parallaction/saveload.cpp:321
+msgid ""
+"ScummVM printed some warnings in your console window and can't guarantee all "
+"your files have been converted.\n"
+"\n"
+"Please report to the team."
+msgstr ""
+"ScummVM ÝÐÔàãÚãÒÐÒ ÔÕïÚö ßÞßÕàÕÔÖÕÝÝï ã ÒöÚÝö ÚÞÝáÞÛö, ö ÝÕÜÐô ÓÐàÐÝâö÷, éÞ "
+"ãáö ²Ðèö äÐÙÛØ ÑãÛÞ ßÕàÕÒÕÔÕÝÞ.\n"
+"\n"
+"±ãÔì ÛÐáÚÐ, ßÞÒöÔÞÜâÕ ßàÞ æÕ ÚÞÜÐÝÔö."
+
+#: engines/pegasus/pegasus.cpp:714
+msgid "Invalid save file name"
+msgstr "½ÕßàÐÒØÛìÝÐ ÝÐ×ÒÐ äÐÙÛã ×ÑÕàÕÖÕÝÝï"
+
+#: engines/pegasus/pegasus.cpp:2507
+msgid "Up/Zoom In/Move Forward/Open Doors"
+msgstr "´ÞÓÞàØ/·ÜÕÝèØâØ ÜÐáèâÐÑ/²ßÕàÕÔ/²öÔçØÝØâØ ÔÒÕàö"
+
+#: engines/pegasus/pegasus.cpp:2508
+msgid "Down/Zoom Out"
+msgstr "´ÞÝØ×ã/·ÑöÛ. ÜÐáèâÐÑ"
+
+#: engines/pegasus/pegasus.cpp:2511
+msgid "Display/Hide Inventory Tray"
+msgstr "¿ÞÚÐ×ÐâØ/ÁåÞÒÐâØ öÝÒÕÝâÐà"
+
+#: engines/pegasus/pegasus.cpp:2512
+msgid "Display/Hide Biochip Tray"
+msgstr "¿ÞÚÐ×ÐâØ/ÁåÞÒÐâØ ÑöÞçöß"
+
+#: engines/pegasus/pegasus.cpp:2513
+msgid "Action/Select"
+msgstr "´öï/²ØÑöà"
+
+#: engines/pegasus/pegasus.cpp:2514
+msgid "Toggle Center Data Display"
+msgstr "¿ÕàÕÜÚÝãâØ ßÞÚÐ×ãÒÐÝÝï Ò æÕÝâàö ÕÚàÐÝã"
+
+#: engines/pegasus/pegasus.cpp:2515
+msgid "Display/Hide Info Screen"
+msgstr "¿ÞÚÐ×ÐâØ/ÁåÞÒÐâØ öÝäÞÕÚàÐÝ"
+
+#: engines/pegasus/pegasus.cpp:2516
+msgid "Display/Hide Pause Menu"
+msgstr "¿ÞÚÐ×ãÒÐâØ/ÁåÞÒÐâØ ÜÕÝî ßÐãר"
+
+#: engines/pegasus/pegasus.cpp:2517
+msgid "???"
+msgstr "???"
+
+#: engines/sci/detection.cpp:374
msgid "EGA undithering"
msgstr "EGA ÑÕ× àÐáâàãÒÐÝÝï"
-#: engines/sci/detection.cpp:374
+#: engines/sci/detection.cpp:375
msgid "Enable undithering in EGA games"
msgstr "ÃÒöÜÚÝãâØ ÐÝâØ-×ÓÛÐÔÖãÒÐÝÝï Ò EGA öÓàÐå"
-#: engines/sci/detection.cpp:383
+#: engines/sci/detection.cpp:384
msgid "Prefer digital sound effects"
msgstr "½ÐÔÐÒÐâØ ßÕàÕÒÐÓã æØäàÞÒØÜ ×ÒãÚÞÒØÜ ÕäÕÚâÐÜ"
-#: engines/sci/detection.cpp:384
+#: engines/sci/detection.cpp:385
msgid "Prefer digital sound effects instead of synthesized ones"
msgstr "²öÔÔÐÒÐâØ ßÕàÕÒÐÓã æØäàÞÒØÜ ×ÒãÚÞÒØÜ ÕäÕÚâÐÜ, Ð ÝÕ áØÝâÕ×ÞÒÐÝØÜ"
-#: engines/sci/detection.cpp:403
+#: engines/sci/detection.cpp:404
msgid "Use IMF/Yamaha FB-01 for MIDI output"
msgstr "²ØÚÞàØáâÞÒãÒÐâØ IMF/Yahama FB-01 ÔÛï MIDI ÒØåÞÔã"
-#: engines/sci/detection.cpp:404
+#: engines/sci/detection.cpp:405
msgid ""
"Use an IBM Music Feature card or a Yamaha FB-01 FM synth module for MIDI "
"output"
@@ -1465,165 +2473,147 @@ msgstr ""
"²ØÚÞàØáâÞÒãÒÐâØ ÔÛïÒ ÒØÒÞÔã MIDI àÕÖØÜ ÚÐàâØ IBM Feature ÐÑÞ FM áöÝâÕ× "
"Yamaha FB-01"
-#: engines/sci/detection.cpp:414
+#: engines/sci/detection.cpp:415
msgid "Use CD audio"
msgstr "²ØÚÞàØáâÞÒãÒÐâØ CD ÐãÔöÞ"
-#: engines/sci/detection.cpp:415
+#: engines/sci/detection.cpp:416
msgid "Use CD audio instead of in-game audio, if available"
msgstr "²ØÚÞàØáâÞÒãÒÐâØ CD ÐãÔöÞ ×ÐÜöáâì ã-Óàö ÐãÔöÞ, ïÚéÞ âÐÚö ô"
-#: engines/sci/detection.cpp:425
+#: engines/sci/detection.cpp:426
msgid "Use Windows cursors"
msgstr "²ØÚÞàØáâÞÒãÒÐâØ Windows ÚãàáÞàØ"
-#: engines/sci/detection.cpp:426
+#: engines/sci/detection.cpp:427
msgid ""
"Use the Windows cursors (smaller and monochrome) instead of the DOS ones"
msgstr "²ØÚÞàØáâÞÒãÒÐâØ Windows ÚãàáÞàØ (ÜÕÝèØå ö ÜÞÝÞåàÞÜÝØå), ×ÐÜöáâì DOS"
-#: engines/sci/detection.cpp:436
+#: engines/sci/detection.cpp:437
msgid "Use silver cursors"
msgstr "²ØÚÞàØáâÞÒãÒÐâØ áàöÑÝö ÚãàáÞàØ"
-#: engines/sci/detection.cpp:437
+#: engines/sci/detection.cpp:438
msgid ""
"Use the alternate set of silver cursors, instead of the normal golden ones"
msgstr ""
"²ØÚÞàØáâÞÒãÒÐâØ ÐÛìâÕàÝÐâØÒÝØÙ ÝÐÑöà áàöÑÝØå ÚãàáÞàöÒ, ×ÐÜöáâì ×ÒØçÐÙÝØå "
"×ÞÛÞâØå"
-#: engines/scumm/dialogs.cpp:175
+#: engines/scumm/dialogs.cpp:176
#, c-format
msgid "Insert Disk %c and Press Button to Continue."
msgstr "²áâÐÒâÕ ÔØáÚ %c âÐ ÝÐâØáÝöâì ÚÛÐÒöèã ÔÛï ßàÞÔÞÒÖÕÝÝï."
-#: engines/scumm/dialogs.cpp:176
+#: engines/scumm/dialogs.cpp:177
#, c-format
msgid "Unable to Find %s, (%c%d) Press Button."
msgstr "½Õ ÒÔÐÛÞáï ×ÝÐÙâØ %s, (%c%d) ½ÐâØáÝöâì ÚÛÐÒöèã."
-#: engines/scumm/dialogs.cpp:177
+#: engines/scumm/dialogs.cpp:178
#, c-format
msgid "Error reading disk %c, (%c%d) Press Button."
msgstr "¿ÞÜØÛÚÐ çØâÐÝÝï ÔØáÚã %c, (%c%d) ½ÐâØáÝöâì ÚÛÐÒöèã."
-#: engines/scumm/dialogs.cpp:178
+#: engines/scumm/dialogs.cpp:179
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
+#: engines/scumm/dialogs.cpp:183
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
+#: engines/scumm/dialogs.cpp:185
msgid "Are you sure you want to quit? (Y/N)"
msgstr "²Ø ãßÕÒÝÕÝö, éÞ åÞçÕâÕ ÒØÙâØ? (Y/N)"
-#: engines/scumm/dialogs.cpp:189
+#: engines/scumm/dialogs.cpp:190
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:215
-msgid "Quit"
-msgstr "²ØåöÔ"
-
-#: engines/scumm/dialogs.cpp:193
+#: engines/scumm/dialogs.cpp:194
msgid "Insert save/load game disk"
msgstr "²áâÐÒâÕ ÔØáÚ ×ö ×ÑÕàÕÖÕÝÝïÜ öÓÞà"
-#: engines/scumm/dialogs.cpp:194
+#: engines/scumm/dialogs.cpp:195
msgid "You must enter a name"
msgstr "²Ø ÜãáØâÕ ÒÒÕáâØ öÜ'ï"
-#: engines/scumm/dialogs.cpp:195
+#: engines/scumm/dialogs.cpp:196
msgid "The game was NOT saved (disk full?)"
msgstr "³àã ½µ ±Ã»¾ ×ÐߨáÐÝÞ (ÔØáÚ ßÞÒÝØÙ?)"
-#: engines/scumm/dialogs.cpp:196
+#: engines/scumm/dialogs.cpp:197
msgid "The game was NOT loaded"
msgstr "³àã ½µ ±Ã»¾ ×ÐÒÐÝâÐÖÕÝÞ"
-#: engines/scumm/dialogs.cpp:197
+#: engines/scumm/dialogs.cpp:198
#, c-format
msgid "Saving '%s'"
msgstr "·Ðߨáãî '%s'"
-#: engines/scumm/dialogs.cpp:198
+#: engines/scumm/dialogs.cpp:199
#, c-format
msgid "Loading '%s'"
msgstr "·ÐÒÐÝâÐÖãî '%s'"
-#: engines/scumm/dialogs.cpp:199
+#: engines/scumm/dialogs.cpp:200
msgid "Name your SAVE game"
msgstr "½Ð×ÞÒöâì áÒÞô ×ÑÕàÕÖÕÝÝï öÓàØ"
-#: engines/scumm/dialogs.cpp:200
+#: engines/scumm/dialogs.cpp:201
msgid "Select a game to LOAD"
msgstr "²ØÑÕàöâì Óàã ÔÛï ×ÐÒÐÝâÐÖÕÝÝï"
-#: engines/scumm/dialogs.cpp:201
+#: engines/scumm/dialogs.cpp:202
msgid "Game title)"
msgstr "½Ð×ÒÐ ÓàØ)"
#. I18N: Previous page button
-#: engines/scumm/dialogs.cpp:287
+#: engines/scumm/dialogs.cpp:288
msgid "~P~revious"
msgstr "~¿~ÞßÕà"
#. I18N: Next page button
-#: engines/scumm/dialogs.cpp:289
+#: engines/scumm/dialogs.cpp:290
msgid "~N~ext"
msgstr "~½~Ðáâ"
-#: engines/scumm/dialogs.cpp:290
-#: backends/platform/ds/arm9/source/dsoptions.cpp:56
-msgid "~C~lose"
-msgstr "~·~ÐÚàØâØ"
-
-#: engines/scumm/dialogs.cpp:597
+#: engines/scumm/dialogs.cpp:598
msgid "Speech Only"
msgstr "ÂöÛìÚØ Þ×ÒãçÚÐ"
-#: engines/scumm/dialogs.cpp:598
+#: engines/scumm/dialogs.cpp:599
msgid "Speech and Subtitles"
msgstr "¾×ÒãçÚÐ âÐ áãÑâØâàØ"
-#: engines/scumm/dialogs.cpp:599
+#: engines/scumm/dialogs.cpp:600
msgid "Subtitles Only"
msgstr "ÂöÛìÚØ áãÑâØâàØ"
-#: engines/scumm/dialogs.cpp:607
+#: engines/scumm/dialogs.cpp:608
msgctxt "lowres"
msgid "Speech & Subs"
msgstr "¾×ÒãçÚÐ âÐ âÕÚáâ"
-#: engines/scumm/dialogs.cpp:653
+#: engines/scumm/dialogs.cpp:654
msgid "Select a Proficiency Level."
msgstr "¾ÑÕàöâì àÕÖØÜ áÚÛÐÔÝÞáâö."
-#: engines/scumm/dialogs.cpp:655
+#: engines/scumm/dialogs.cpp:656
msgid "Refer to your Loom(TM) manual for help."
msgstr "·Ð ÔÞßÞÜÞÓÞî ×ÒÕàâÐÙâÕáï ÔÞ öÝáâàãÚæö÷ Loom(TM)."
-#: engines/scumm/dialogs.cpp:658
-msgid "Standard"
-msgstr "ÁâÐÝÔÐàâÝØÙ"
-
-#: engines/scumm/dialogs.cpp:659
+#: engines/scumm/dialogs.cpp:660
msgid "Practice"
msgstr "¿àÐÚâØÚÐ"
-#: engines/scumm/dialogs.cpp:660
+#: engines/scumm/dialogs.cpp:661
msgid "Expert"
msgstr "µÚáßÕàâ"
@@ -2140,7 +3130,7 @@ msgstr "»ÕâöâØ ÝÐßàÐÒÞ"
msgid "Fly to lower right"
msgstr "»ÕâöâØ ÔÞÝØ×ã ÝÐßàÐÒÞ"
-#: engines/scumm/scumm.cpp:1776
+#: engines/scumm/scumm.cpp:1777
#, c-format
msgid ""
"Native MIDI support requires the Roland Upgrade from LucasArts,\n"
@@ -2149,40 +3139,7 @@ msgstr ""
"ÀÕÖØÜ \"àöÔÝÞÓÞ\" MIDI ßÞâàÕÑãô ßÞÝÞÒÛÕÝÝï Roland Upgrade ÒöÔ\n"
"LucasArts, ßàÞâÕ %s ÒöÔáãâÝöÙ. ¿ÕàÕÜØÚÐîáì ÝÐ AdLib."
-#: engines/scumm/scumm.cpp:2303 engines/agos/saveload.cpp:220
-#, c-format
-msgid ""
-"Failed to save game state to file:\n"
-"\n"
-"%s"
-msgstr ""
-"½Õ ÒÔÐÛÞáï ×ÑÕàÕÓâØ áâÐÝ ÓàØ ã äÐÙÛ:\n"
-"\n"
-"%s"
-
-#: engines/scumm/scumm.cpp:2310 engines/agos/saveload.cpp:185
-#, c-format
-msgid ""
-"Failed to load game state from file:\n"
-"\n"
-"%s"
-msgstr ""
-"½Õ ÒÔÐÛÞáï ×ÐÒÐÝâÐÖØâØ áâÐÝ ÓàØ × äÐÙÛã:\n"
-"\n"
-"%s"
-
-#: engines/scumm/scumm.cpp:2322 engines/agos/saveload.cpp:228
-#, c-format
-msgid ""
-"Successfully saved game state in file:\n"
-"\n"
-"%s"
-msgstr ""
-"ÃáßöèÝÞ ×ÑÕàÖÕÝÞ áâÐÝ ÓàØ ã äÐÙÛö:\n"
-"\n"
-"%s"
-
-#: engines/scumm/scumm.cpp:2537
+#: engines/scumm/scumm.cpp:2547
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' "
@@ -2192,190 +3149,6 @@ msgstr ""
"ÒÜöô. ÉÞÑ ÓàÐâØ ã ÝìÞÓÞ, ÞÑÕàöâì '´ÞÔÐâØ Óàã' ã ßÞçÐâÚÞÒÞÜã ÜÕÝî ScummVM, ö "
"ÒØÑÕàöâì ßÐßÚã Maniac ÒáÕàÕÔÕÝö ßÒßÚØ × ÓàÞî Tentacle."
-#. I18N: Option for fast scene switching
-#: engines/mohawk/dialogs.cpp:92 engines/mohawk/dialogs.cpp:167
-msgid "~Z~ip Mode Activated"
-msgstr "ÀÕÖØÜ èÒØÔÚÞÓÞ ßÕàÕåÞÔã ÐÚâØÒÞÒÐÝÞ"
-
-#: engines/mohawk/dialogs.cpp:93
-msgid "~T~ransitions Enabled"
-msgstr "¿ÕàÕåÞÔØ ÐÚâØÒÞÒÐÝÞ"
-
-#. I18N: Drop book page
-#: engines/mohawk/dialogs.cpp:95
-msgid "~D~rop Page"
-msgstr "²ØÚØÝãâØ áâÞàöÝÚã"
-
-#: engines/mohawk/dialogs.cpp:99
-msgid "~S~how Map"
-msgstr "¿ÞÚÐ×ÐâØ ÜÐßã"
-
-#: engines/mohawk/dialogs.cpp:105
-msgid "~M~ain Menu"
-msgstr "³ÞÛÞÒÝÕ ÜÕÝî"
-
-#: engines/mohawk/dialogs.cpp:168
-msgid "~W~ater Effect Enabled"
-msgstr "µäÕÚâØ ÒÞÔØ ãÒöÜÚÝÕÝÞ"
-
-#: engines/agos/animation.cpp:557
-#, c-format
-msgid "Cutscene file '%s' not found!"
-msgstr "ÄÐÙÛ ×ÐáâÐÒÚØ '%s' ÝÕ ×ÝÐÙÔÕÝÞ!"
-
-#: engines/gob/inter_playtoons.cpp:256 engines/gob/inter_v2.cpp:1287
-#: engines/tinsel/saveload.cpp:532
-msgid "Failed to load game state from file."
-msgstr "½Õ ÒÔÐÛÞáï ×ÐÒÐÝâÐÖØâØ áâÐÝ ÓàØ × äÐÙÛã."
-
-#: engines/gob/inter_v2.cpp:1357 engines/tinsel/saveload.cpp:545
-msgid "Failed to save game state to file."
-msgstr "½Õ ÒÔÐÛÞáï ×ÑÕàÕÓâØ áâÐÝ ÓàØ ã äÐÙÛ."
-
-#: engines/gob/inter_v5.cpp:107
-msgid "Failed to delete file."
-msgstr "½Õ ÒÔÐÛÞáï ÒØÔÐ󯉯 äÐÙÛ."
-
-#: engines/groovie/detection.cpp:312
-msgid "Fast movie speed"
-msgstr "ÀÕÖØÜ èÒØÔÚÞÓÞ ÒöÔÕÞ"
-
-#: engines/groovie/detection.cpp:313
-msgid "Play movies at an increased speed"
-msgstr "¿àÞÓàÐÒÐâØ ÒöÔÕÞ × ßöÔÒØéÕÝÝÞî èÒØÔÚöáâî"
-
-#: engines/groovie/script.cpp:420
-msgid "Failed to save game"
-msgstr "½Õ ÒÔÐÛÞáï ×ÐߨáÐâØ Óàã"
-
-#. I18N: Studio audience adds an applause and cheering sounds whenever
-#. Malcolm makes a joke.
-#: engines/kyra/detection.cpp:62
-msgid "Studio audience"
-msgstr "ÁâãÔöï ÐãÔØâÞàö÷"
-
-#: engines/kyra/detection.cpp:63
-msgid "Enable studio audience"
-msgstr "ÃÒöÜÚÝãâØ áâãÔöî ÐãÔØâÞàö÷"
-
-#. I18N: This option allows the user to skip text and cutscenes.
-#: engines/kyra/detection.cpp:73
-msgid "Skip support"
-msgstr "¿öÔâàØÜãÒÐâØ ¿àÞßãáâØâØ"
-
-#: engines/kyra/detection.cpp:74
-msgid "Allow text and cutscenes to be skipped"
-msgstr "´Þ×ÒÞ󯉯 ßàÞßãáÚÐâØ âÕÚáâ ö àÞÛØÚØ"
-
-#. I18N: Helium mode makes people sound like they've inhaled Helium.
-#: engines/kyra/detection.cpp:84
-msgid "Helium mode"
-msgstr "ÀÕÖØÜ ³ÕÛöãÜ"
-
-#: engines/kyra/detection.cpp:85
-msgid "Enable helium mode"
-msgstr "ÃÒöÜÚÝãâØ àÕÖØÜ ³ÕÛöãÜ"
-
-#. I18N: When enabled, this option makes scrolling smoother when
-#. changing from one screen to another.
-#: engines/kyra/detection.cpp:99
-msgid "Smooth scrolling"
-msgstr "¿ÛÐÒÝÐ ßàÞÚàãâÚÐ"
-
-#: engines/kyra/detection.cpp:100
-msgid "Enable smooth scrolling when walking"
-msgstr "ÃÒöÜÚÝãâØ ßÛÐÒÝã ßàÞÚàãâÚã ßàØ åÞÔìÑö"
-
-#. I18N: When enabled, this option changes the cursor when it floats to the
-#. edge of the screen to a directional arrow. The player can then click to
-#. walk towards that direction.
-#: engines/kyra/detection.cpp:112
-msgid "Floating cursors"
-msgstr "¿ÛÐÒÐîçö ÚãàáÞàØ"
-
-#: engines/kyra/detection.cpp:113
-msgid "Enable floating cursors"
-msgstr "ÃÒöÜÚÝãâØ ßÛÐÒÐîçö ÚãàáÞàØ"
-
-#. I18N: HP stands for Hit Points
-#: engines/kyra/detection.cpp:127
-msgid "HP bar graphs"
-msgstr "ÁâÞÒßçØÚØ ×ÔÞàÞÒ'ï"
-
-#: engines/kyra/detection.cpp:128
-msgid "Enable hit point bar graphs"
-msgstr "ÃØöÜÚÝãâØ ÓàÐäöçÝö áâÞÒߨçÚØ ×ÔÞàÞÒ'ï"
-
-#: engines/kyra/lol.cpp:478
-msgid "Attack 1"
-msgstr "°âÐÚÐ 1"
-
-#: engines/kyra/lol.cpp:479
-msgid "Attack 2"
-msgstr "°âÐÚÐ 2"
-
-#: engines/kyra/lol.cpp:480
-msgid "Attack 3"
-msgstr "°âÐÚÐ 3"
-
-#: engines/kyra/lol.cpp:481
-msgid "Move Forward"
-msgstr "ÀãåÐâØáì ãßÕàÕÔ"
-
-#: engines/kyra/lol.cpp:482
-msgid "Move Back"
-msgstr "ÀãåÐâØáì ÝÐ×ÐÔ"
-
-#: engines/kyra/lol.cpp:483
-msgid "Slide Left"
-msgstr "ºÞÒ×ÐâØ ÝÐÛöÒÞ"
-
-#: engines/kyra/lol.cpp:484
-msgid "Slide Right"
-msgstr "ºÞÒ×ÐâØ ÝÐßàÐÒÞ"
-
-#: engines/kyra/lol.cpp:485 engines/pegasus/pegasus.cpp:2447
-msgid "Turn Left"
-msgstr "¿ÞÒÕàÝãâØáï ÝÐÛöÒÞ"
-
-#: engines/kyra/lol.cpp:486 engines/pegasus/pegasus.cpp:2448
-msgid "Turn Right"
-msgstr "¿ÞÒÕàÝãâØáï ÝÐßàÐÒÞ"
-
-#: engines/kyra/lol.cpp:487
-msgid "Rest"
-msgstr "²öÔßÞçØâØ"
-
-#: engines/kyra/lol.cpp:488
-msgid "Options"
-msgstr "½ÐÛÐèâãÒÐÝÝï"
-
-#: engines/kyra/lol.cpp:489
-msgid "Choose Spell"
-msgstr "²ØÑàÐâØ ×ÐÚÛïââï"
-
-#: engines/kyra/sound_midi.cpp:477
-msgid ""
-"You appear to be using a General MIDI device,\n"
-"but your game only supports Roland MT32 MIDI.\n"
-"We try to map the Roland MT32 instruments to\n"
-"General MIDI ones. It is still possible that\n"
-"some tracks sound incorrect."
-msgstr ""
-"·ÔÐôâìáï, éÞ ²Ø ÒØÚÞàØáâÞÒãôâÕ ßàØáâàöÙ General\n"
-"MIDI, ÐÛÕ ²ÐèÐ ÓàÐ ßöÔâàØÜãô âöÛìÚØ Roland MT32\n"
-"MIDI. ¼Ø áßàÞÑãôÜÞ ×ÐÜÐßØâØ öÝáâàãÜÕÝâØ Roland\n"
-"MT32 ÝÐ General MIDI. °ÛÕ Ò àÕ×ãÛìâÐâö ÜÞÖÕ\n"
-"áâÐâØáï, éÞ ÔÕïÚö âàÕÚØ ÑãÔãâì ÓàÐâØ ÝÕßàÐÒØÛìÝÞ."
-
-#: engines/queen/queen.cpp:59
-msgid "Alternative intro"
-msgstr "°ÛâÕàÝÐâØÒÝØÙ Òáâãß"
-
-#: engines/queen/queen.cpp:60
-msgid "Use an alternative game intro (CD version only)"
-msgstr "²ØÚÞàØáâÞÒãÒÐâØ ÐÛìâÕàÝÐâØÒÝØÙ Òáâãß ÓàØ (âöÛìÚØ CD ÒÕàáöï)"
-
#: engines/sky/compact.cpp:130
msgid ""
"Unable to find \"sky.cpt\" file!\n"
@@ -2400,20 +3173,21 @@ msgstr "´ØáÚÕâÝÕ ÒÒÕÔÕÝÝï"
msgid "Use the floppy version's intro (CD version only)"
msgstr "²ØÚÞàØáâÞÒãÒÐâØ ÔØáÚÕâÝö ÒÕàáö÷ ÒÒÕÔÕÝÝï (âöÛìÚØ CD ÒÕàáöï)"
-#: engines/sword1/animation.cpp:519
+#: engines/sword1/animation.cpp:524
#, c-format
msgid "PSX stream cutscene '%s' cannot be played in paletted mode"
msgstr " àÞÛØÚ PSX ßÞâÞÚã '%s' ÝÕ ÜÞÖãâì ÑãâØ ÒöÔâÒÞàÕÝö ã àÕÖØÜö ßÐÛöâàØ"
-#: engines/sword1/animation.cpp:540 engines/sword2/animation.cpp:439
+#: engines/sword1/animation.cpp:545 engines/sword2/animation.cpp:445
msgid "DXA cutscenes found but ScummVM has been built without zlib support"
msgstr "·ÝÐÙÔÕÝÞ ×ÐáâÐÒÚØ DXA, ÐÛÕ ScummVM ÑãÒ ßÞÑãÔÞÒÐÝØÙ ÑÕ× ßöÔâàØÜÚØ zlib"
-#: engines/sword1/animation.cpp:550 engines/sword2/animation.cpp:449
-msgid "MPEG2 cutscenes are no longer supported"
-msgstr "·ÐáâÐÒÚØ MPEG2 ÑöÛìèÕ ÝÕ ßöÔâàØÜãîâìáï"
+#: engines/sword1/animation.cpp:561
+#, fuzzy
+msgid "MPEG-2 cutscenes found but ScummVM has been built without MPEG-2"
+msgstr "·ÝÐÙÔÕÝö PSX àÞÛØÚØ, ÐÛÕ ScummVM ÑãÒ ×öÑàÐÝØÙ ÑÕ× ßöÔâàØÜÚØ RGB ÚÞÛöàã"
-#: engines/sword1/animation.cpp:556 engines/sword2/animation.cpp:457
+#: engines/sword1/animation.cpp:568 engines/sword2/animation.cpp:470
#, c-format
msgid "Cutscene '%s' not found"
msgstr "·ÐáâÐÒÚã '%s' ÝÕ ×ÝÐÙÔÕÝÞ"
@@ -2456,11 +3230,17 @@ msgstr "²×ïâØ ÝÞÒÕ"
msgid "This is the end of the Broken Sword 1 Demo"
msgstr "½Ð æìÞÜã ×ÐÚöÝçãôâìáï ÔÕÜÞ Broken Sword 1"
-#: engines/sword2/animation.cpp:419
+#: engines/sword2/animation.cpp:425
msgid ""
"PSX cutscenes found but ScummVM has been built without RGB color support"
msgstr "·ÝÐÙÔÕÝö PSX àÞÛØÚØ, ÐÛÕ ScummVM ÑãÒ ×öÑàÐÝØÙ ÑÕ× ßöÔâàØÜÚØ RGB ÚÞÛöàã"
+#: engines/sword2/animation.cpp:461
+#, fuzzy
+msgid ""
+"MPEG-2 cutscenes found but ScummVM has been built without MPEG-2 support"
+msgstr "·ÝÐÙÔÕÝÞ ×ÐáâÐÒÚØ DXA, ÐÛÕ ScummVM ÑãÒ ßÞÑãÔÞÒÐÝØÙ ÑÕ× ßöÔâàØÜÚØ zlib"
+
#: engines/sword2/sword2.cpp:79
msgid "Show object labels"
msgstr "¿ÞÚÐ×ãÒÐâØ ÜöâÚØ ÞÑ'ôÚâöÒ"
@@ -2469,13 +3249,13 @@ msgstr "¿ÞÚÐ×ãÒÐâØ ÜöâÚØ ÞÑ'ôÚâöÒ"
msgid "Show labels for objects on mouse hover"
msgstr "¿ÞÚÐ×ãÒÐâØ ÜöâÚØ ÔÛï ÞÑ'ôÚâöÒ ßàØ ÝÐÒÕÔÕÝÝö ÜØèö"
-#: engines/teenagent/resources.cpp:94
+#: engines/teenagent/resources.cpp:95
msgid ""
"You're missing the 'teenagent.dat' file. Get it from the ScummVM website"
msgstr ""
"à ÒÐá ÒöÔáâãÝöÙ äÐÙÛ 'teenagent.dat'. ²ö×ìÜöâì ÙÞÓÞ ÝÐ ÒÕÑáÐÙâö ScummVM"
-#: engines/teenagent/resources.cpp:115
+#: engines/teenagent/resources.cpp:116
msgid ""
"The teenagent.dat file is compressed and zlib hasn't been included in this "
"executable. Please decompress it"
@@ -2483,789 +3263,50 @@ msgstr ""
"ÄÐÙÛ teenagent.dat ×ÐßÐÚÞÒÐÝÞ, ÐÛÕ zlib ÝÕ ÑãÛÞ ÒÚÛîçÕÝÞ Ò æî ßàÞÓàÐÜÜã.±ãÔì-"
"ÛÐáÚÐ àÞ×ßÐÚãÙâÕ ÙÞÓÞ"
-#: engines/parallaction/saveload.cpp:133
-#, c-format
-msgid ""
-"Can't save game in slot %i\n"
-"\n"
-msgstr ""
-"½Õ ÜÞÖã ×ÑÕàÕÓâØ Óàã ã áÛÞâ %i\n"
-"\n"
-
-#: engines/parallaction/saveload.cpp:204
-msgid "Loading game..."
-msgstr "·ÐÒÐÝâÐÖãî Óàã..."
-
-#: engines/parallaction/saveload.cpp:219
-msgid "Saving game..."
-msgstr "·ÑÕàÕÖãî Óàã..."
-
-#: engines/parallaction/saveload.cpp:272
-msgid ""
-"ScummVM found that you have old savefiles for Nippon Safes that should be "
-"renamed.\n"
-"The old names are 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 next time.\n"
-msgstr ""
-"ScummVM ×ÝÐÙèÞÒ, éÞ ²Ø ÜÐôâÕ áâÐàö ×ÑÕàÕÖÕÝÝï öÓÞà ÔÛï Nippon Safes.\n"
-"·ÑÕàÕÖÕÝÝï ã áâÐàÞÜã äÞàÜÐâö ÝÕ ßöÔâàØÜãîâìáï, ö ²Ø ÝÕ ×ÜÞÖÕâÕ ÷å "
-"×ÐÒÐÝâÐÖØâØ, ïÚéÞ ÝÕ ßÕàÕÒÕÔÕâÕ ã ÝÞÒØÙ äÞàÜÐâ.\n"
-"\n"
-"½ÐâØáÝöâì ¾º, éÞÑ ßÕàÕÒÕáâØ ÷å ×ÐàÐ×, öÝÐÚèÕ ãÕ ßÞÒöÔÞÜÛÕÝÝï ×'ïÒØâìáï ßàØ "
-"ÝÐáâãßÝÞÜã ×ÐßãáÚã ÓàØ.\n"
-
-#: engines/parallaction/saveload.cpp:319
-msgid "ScummVM successfully converted all your savefiles."
-msgstr "ScummVM ãáßöèÝÞ ßÕàÕÒöÒ ãáö ²Ðèö ×ÑÕàÕÖÕÝÝï."
-
-#: engines/parallaction/saveload.cpp:321
-msgid ""
-"ScummVM printed some warnings in your console window and can't guarantee all "
-"your files have been converted.\n"
-"\n"
-"Please report to the team."
-msgstr ""
-"ScummVM ÝÐÔàãÚãÒÐÒ ÔÕïÚö ßÞßÕàÕÔÖÕÝÝï ã ÒöÚÝö ÚÞÝáÞÛö, ö ÝÕÜÐô ÓÐàÐÝâö÷, éÞ "
-"ãáö ²Ðèö äÐÙÛØ ÑãÛÞ ßÕàÕÒÕÔÕÝÞ.\n"
-"\n"
-"±ãÔì ÛÐáÚÐ, ßÞÒöÔÞÜâÕ ßàÞ æÕ ÚÞÜÐÝÔö."
-
-#: engines/pegasus/pegasus.cpp:679
-msgid "Invalid save file name"
-msgstr "½ÕßàÐÒØÛìÝÐ ÝÐ×ÒÐ äÐÙÛã ×ÑÕàÕÖÕÝÝï"
-
-#: engines/pegasus/pegasus.cpp:2445
-msgid "Up/Zoom In/Move Forward/Open Doors"
-msgstr "´ÞÓÞàØ/·ÜÕÝèØâØ ÜÐáèâÐÑ/²ßÕàÕÔ/²öÔçØÝØâØ ÔÒÕàö"
-
-#: engines/pegasus/pegasus.cpp:2446
-msgid "Down/Zoom Out"
-msgstr "´ÞÝØ×ã/·ÑöÛ. ÜÐáèâÐÑ"
-
-#: engines/pegasus/pegasus.cpp:2449
-msgid "Display/Hide Inventory Tray"
-msgstr "¿ÞÚÐ×ÐâØ/ÁåÞÒÐâØ öÝÒÕÝâÐà"
-
-#: engines/pegasus/pegasus.cpp:2450
-msgid "Display/Hide Biochip Tray"
-msgstr "¿ÞÚÐ×ÐâØ/ÁåÞÒÐâØ ÑöÞçöß"
-
-#: engines/pegasus/pegasus.cpp:2451
-msgid "Action/Select"
-msgstr "´öï/²ØÑöà"
-
-#: engines/pegasus/pegasus.cpp:2452
-msgid "Toggle Center Data Display"
-msgstr "¿ÕàÕÜÚÝãâØ ßÞÚÐ×ãÒÐÝÝï Ò æÕÝâàö ÕÚàÐÝã"
-
-#: engines/pegasus/pegasus.cpp:2453
-msgid "Display/Hide Info Screen"
-msgstr "¿ÞÚÐ×ÐâØ/ÁåÞÒÐâØ öÝäÞÕÚàÐÝ"
-
-#: engines/pegasus/pegasus.cpp:2454
-msgid "Display/Hide Pause Menu"
-msgstr "¿ÞÚÐ×ãÒÐâØ/ÁåÞÒÐâØ ÜÕÝî ßÐãר"
-
-#: engines/pegasus/pegasus.cpp:2455
-msgid "???"
-msgstr "???"
-
-#: audio/fmopl.cpp:49
-msgid "MAME OPL emulator"
-msgstr "µÜãÛïâÞà MAME OPL"
-
-#: audio/fmopl.cpp:51
-msgid "DOSBox OPL emulator"
-msgstr "µÜãÛïâÞà DOSBox OPL"
-
-#: audio/mididrv.cpp:209
-#, c-format
-msgid ""
-"The selected audio device '%s' was not found (e.g. might be turned off or "
-"disconnected)."
-msgstr ""
-"²ØÑàÐÝØÙ ×ÒãÚÞÒØÙ ßàØáâàöÙ '%s' ÝÕ ÑãÛÞ ×ÝÐÙÔÕÝÞ (âÞÑâÞ, ÙÞÓÞ ÜÞÖÕ ÑãâØ "
-"ÒØÜÚÝÕÝÞ ÐÑÞ ÝÕ ßöÔÚÛîçÕÝÞ)."
-
-#: audio/mididrv.cpp:209 audio/mididrv.cpp:221 audio/mididrv.cpp:257
-#: audio/mididrv.cpp:272
-msgid "Attempting to fall back to the next available device..."
-msgstr "½ÐÜÐÓÐîáï ÒØÚÞàØáâÐâØ ÝÐáâãßÝØÙ ÔÞáâãßÝØÙ ßàØáâàöÙ..."
-
-#: audio/mididrv.cpp:221
-#, c-format
-msgid ""
-"The selected audio device '%s' cannot be used. See log file for more "
-"information."
-msgstr ""
-"²ØÑàÐÝØÙ ×ÒãÚÞÒØÙ ßàØáâàöÙ '%s' ÝÕ ÜÞÖÕ ÑãâØ ÒØÚÞàØáâÐÝØÙ. ´ØÒöâìáï äÐÙÛ "
-"ÛÞÓã ÔÛï ÔÞÔÐâÚÞÒÞ÷ öÝäÞàÜÐæö÷."
-
-#: audio/mididrv.cpp:257
-#, c-format
-msgid ""
-"The preferred audio device '%s' was not found (e.g. might be turned off or "
-"disconnected)."
-msgstr ""
-"ÃßÞÔÞÑÐÝØÙ ×ÒãÚÞÒØÙ ßàØáâàöÙ '%s' ÝÕ ÑãÛÞ ×ÝÐÙÔÕÝÞ (âÞÑâÞ, ÙÞÓÞ ÜÞÖÕ ÑãâØ "
-"ÒØÜÚÝÕÝÞ ÐÑÞ ÝÕ ßöÔÚÛîçÕÝÞ)."
-
-#: audio/mididrv.cpp:272
-#, c-format
-msgid ""
-"The preferred audio device '%s' cannot be used. See log file for more "
-"information."
-msgstr ""
-"ÃßÞÔÞÑÐÝØÙ ×ÒãÚÞÒØÙ ßàØáâàöÙ '%s' ÝÕ ÜÞÖÕ ÑãâØ ÒØÚÞàØáâÐÝØÙ. ´ØÒöâìáï äÐÙÛ "
-"ÛÞÓã ÔÛï ÔÞÔÐâÚÞÒÞ÷ öÝäÞàÜÐæö÷."
-
-#: audio/null.h:43
-msgid "No music"
-msgstr "±Õ× Üã×ØÚØ"
-
-#: audio/mods/paula.cpp:189
-msgid "Amiga Audio Emulator"
-msgstr "°ÜöÓÐ °ãÔöÞ µÜãÛïâÞà"
-
-#: audio/softsynth/adlib.cpp:2284
-msgid "AdLib Emulator"
-msgstr "µÜãÛïâÞà AdLib"
-
-#: audio/softsynth/appleiigs.cpp:33
-msgid "Apple II GS Emulator (NOT IMPLEMENTED)"
-msgstr "Apple II GS µÜãÛïâÞà (½µ Àµ°»¦·¾²°½¾)"
-
-#: audio/softsynth/sid.cpp:1430
-msgid "C64 Audio Emulator"
-msgstr "C64 °ãÔöÞ µÜãÛïâÞà"
-
-#: audio/softsynth/mt32.cpp:205
-msgid "Initializing MT-32 Emulator"
-msgstr "½ÐÛÐèâÞÒãî ÕÜãÛïâÞà MT-32"
-
-#: audio/softsynth/mt32.cpp:431
-msgid "MT-32 Emulator"
-msgstr "µÜãÛïâÞà MT-32"
-
-#: audio/softsynth/pcspk.cpp:139
-msgid "PC Speaker Emulator"
-msgstr "µÜãÛïâÞà PC áßöÚÕàÐ"
-
-#: audio/softsynth/pcspk.cpp:158
-msgid "IBM PCjr Emulator"
-msgstr "µÜãÛïâÞà IBM PCjr"
-
-#: backends/keymapper/remap-dialog.cpp:47
-msgid "Keymap:"
-msgstr "¼ÐßÐ ÚÛÐÒöè:"
-
-#: backends/keymapper/remap-dialog.cpp:66
-msgid " (Effective)"
-msgstr " (µäÕÚâØÒÝÐ)"
-
-#: backends/keymapper/remap-dialog.cpp:106
-msgid " (Active)"
-msgstr " (°ÚâØÒÝÐ)"
-
-#: backends/keymapper/remap-dialog.cpp:106
-msgid " (Blocked)"
-msgstr " (·ÐÑÛÞÚÞÒÐÝØÙ)"
-
-#: backends/keymapper/remap-dialog.cpp:119
-msgid " (Global)"
-msgstr " (³ÛÞÑÐÛìÝÐ)"
-
-#: backends/keymapper/remap-dialog.cpp:127
-msgid " (Game)"
-msgstr " (¦ÓàØ)"
-
-#: backends/midi/windows.cpp:164
-msgid "Windows MIDI"
-msgstr "Windows MIDI"
-
-#: backends/platform/ds/arm9/source/dsoptions.cpp:57
-msgid "ScummVM Main Menu"
-msgstr "³ÞÛÞÒÝÕ ÜÕÝî ScummVM"
-
-#: backends/platform/ds/arm9/source/dsoptions.cpp:63
-msgid "~L~eft handed mode"
-msgstr "»öÒÞàãÚØÙ àÕÖØÜ"
-
-#: backends/platform/ds/arm9/source/dsoptions.cpp:64
-msgid "~I~ndy fight controls"
-msgstr "ºÕàãÒÐÝÝï ÑÞïÜØ Ò Indy"
-
-#: backends/platform/ds/arm9/source/dsoptions.cpp:65
-msgid "Show mouse cursor"
-msgstr "¿ÞÚÐ×ãÒÐâØ ÚãàáÞà ÜØèö"
-
-#: backends/platform/ds/arm9/source/dsoptions.cpp:66
-msgid "Snap to edges"
-msgstr "¿àØÚàößØâØ ÔÞ ÚàÐ÷Ò"
-
-#: backends/platform/ds/arm9/source/dsoptions.cpp:68
-msgid "Touch X Offset"
-msgstr "·ÜöéÕÝÝï ÔÞâØÚöÒ ßÞ Þáö X"
-
-#: backends/platform/ds/arm9/source/dsoptions.cpp:75
-msgid "Touch Y Offset"
-msgstr "·ÜöéÕÝÝï ÔÞâØÚöÒ ßÞ Þáö Y"
-
-#: backends/platform/ds/arm9/source/dsoptions.cpp:87
-msgid "Use laptop trackpad-style cursor control"
-msgstr "²ØÚÞàØáâÞÒãÒÐâØ ãßàÐÒÛöÝÝï ÚãàáÞàÞÜ ïÚ ÝÐ âàÕÚßÐÔö ÛÐßâÞßöÒ"
-
-#: backends/platform/ds/arm9/source/dsoptions.cpp:88
-msgid "Tap for left click, double tap right click"
-msgstr "ÂÐß ÔÛï ÛöÒÞÓÞ ÚÛÐæÐÝÝï, ßÞÔÒöÙÝØÙ âÐß ÔÛï ßàÐÒÞÓÞ ÚÛÐæÐÝÝï"
-
-#: backends/platform/ds/arm9/source/dsoptions.cpp:90
-msgid "Sensitivity"
-msgstr "ÇãâÛØÒöáâì"
-
-#: backends/platform/ds/arm9/source/dsoptions.cpp:99
-msgid "Initial top screen scale:"
-msgstr "¿ÞçÐâÚÞÒØÙ ÜÐáèâÐÑ ÒÕàåÝìÞÓÞ ÕÚàÐÝã:"
-
-#: backends/platform/ds/arm9/source/dsoptions.cpp:105
-msgid "Main screen scaling:"
-msgstr "¼ÐáèâÐÑ ÓÞÛÞÒÝÞÓÞ ÕÚàÐÝã:"
-
-#: backends/platform/ds/arm9/source/dsoptions.cpp:107
-msgid "Hardware scale (fast, but low quality)"
-msgstr "ÅÐàÔÒÐàÝÕ ÜÐáèâÐÑãÒÐÝÝï (èÒØÔÚÞ, ÐÛÕ ÝØ×ìÚÞ÷ ïÚÞáâö)"
-
-#: backends/platform/ds/arm9/source/dsoptions.cpp:108
-msgid "Software scale (good quality, but slower)"
-msgstr "¿àÞÓàÐÜÝÕ ÜÐáèâÐÑãÒÐÝÝï (åÞàÞèÐ ïÚöáâì, ÐÛÕ ßÞÒöÛìÝöèÕ)"
-
-#: backends/platform/ds/arm9/source/dsoptions.cpp:109
-msgid "Unscaled (you must scroll left and right)"
-msgstr "±Õ× ÜÐáèâÐÑãÒÐÝÝï (âàÕÑÐ ÑãÔÕ ßàÞÚàãçãÒÐâØ ÝÐÛöÒÞ ö ÝÐßàÐÒÞ)"
-
-#: backends/platform/ds/arm9/source/dsoptions.cpp:111
-msgid "Brightness:"
-msgstr "ÏáÚàÐÒöáâì:"
-
-#: backends/platform/ds/arm9/source/dsoptions.cpp:121
-msgid "High quality audio (slower) (reboot)"
-msgstr "²ØáÞÚÐ ïÚöáâì ×ÒãÚã (ßÞÒöÛìÝöèÕ) (àÕÑãâ)"
-
-#: backends/platform/ds/arm9/source/dsoptions.cpp:122
-msgid "Disable power off"
-msgstr "·ÐÑÞàÞÝØâØ ÒØÜÚÝÕÝÝï"
-
-#: backends/platform/iphone/osys_events.cpp:300
-msgid "Mouse-click-and-drag mode enabled."
-msgstr "ÀÕÖØÜ ÜØèö ÚÛöÚÝãâØ-âÐ-âïÓÝãâØ ãÒöÜÚÝÕÝÞ."
-
-#: backends/platform/iphone/osys_events.cpp:302
-msgid "Mouse-click-and-drag mode disabled."
-msgstr "ÀÕÖØÜ ÜØèö ÚÛöÚÝãâØ-âÐ-âïÓÝãâØ ÒØÜÚÝÕÝÞ."
-
-#: backends/platform/iphone/osys_events.cpp:313
-msgid "Touchpad mode enabled."
-msgstr "ÀÕÖØÜ âÐçßÐÔã ãÒöÜÚÝÕÝÞ."
-
-#: backends/platform/iphone/osys_events.cpp:315
-msgid "Touchpad mode disabled."
-msgstr "ÀÕÖØÜ âÐçßÐÔã ÒØÜÚÝÕÝÞ."
-
-#: backends/platform/maemo/maemo.cpp:209
-msgid "Click Mode"
-msgstr "ÀÕÖØÜ ÚÛöÚöÒ"
-
-#: backends/platform/maemo/maemo.cpp:215
-#: 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/maemo/maemo.cpp:218
-msgid "Middle Click"
-msgstr "ÁÕàÕÔÝöÙ ÚÛöÚ"
-
-#: backends/platform/maemo/maemo.cpp:221
-#: backends/platform/symbian/src/SymbianActions.cpp:43
-#: backends/platform/wince/CEActionsSmartphone.cpp:44
-#: backends/platform/bada/form.cpp:273
-msgid "Right Click"
-msgstr "¿àÐÒØÙ ÚÛöÚ"
-
-#: backends/platform/sdl/macosx/appmenu_osx.mm:77
-msgid "Hide ScummVM"
-msgstr "ÁåÞÒÐâØ ScummVM"
-
-#: backends/platform/sdl/macosx/appmenu_osx.mm:82
-msgid "Hide Others"
-msgstr "ÁåÞÒÐâØ ¦Ýèö"
-
-#: backends/platform/sdl/macosx/appmenu_osx.mm:87
-msgid "Show All"
-msgstr "¿ÞÚÐ×ÐâØ ²áÕ"
-
-#: backends/platform/sdl/macosx/appmenu_osx.mm:109
-#: backends/platform/sdl/macosx/appmenu_osx.mm:120
-msgid "Window"
-msgstr "²öÚÝÞ"
-
-#: backends/platform/sdl/macosx/appmenu_osx.mm:114
-msgid "Minimize"
-msgstr "¼öÝöÜö×ãÒÐâØ"
-
-#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:45
-msgid "Normal (no scaling)"
-msgstr "±Õ× ×ÑöÛìèÕÝÝï"
-
-#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:64
-msgctxt "lowres"
-msgid "Normal (no scaling)"
-msgstr "±Õ× ×ÑöÛìèÕÝÝï"
-
-#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2135
-#: backends/graphics/openglsdl/openglsdl-graphics.cpp:537
-msgid "Enabled aspect ratio correction"
-msgstr "ºÞàÕÚæöî áßöÒÒöÔÝÞèÕÝÝï áâÞàöÝ ãÒöÜÚÝÕÝÞ"
-
-#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2141
-#: backends/graphics/openglsdl/openglsdl-graphics.cpp:542
-msgid "Disabled aspect ratio correction"
-msgstr "ºÞàÕÚæöî áßöÒÒöÔÝÞèÕÝÝï áâÞàöÝ ÒØÜÚÝÕÝÞ"
-
-#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2196
-msgid "Active graphics filter:"
-msgstr "¿ÞâÞçÝØÙ ÓàÐäöçÝØÙ äöÛìâà:"
-
-#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2238
-#: backends/graphics/openglsdl/openglsdl-graphics.cpp:481
-msgid "Windowed mode"
-msgstr "²öÚÞÝÝØÙ àÕÖØÜ"
-
-#: backends/graphics/opengl/opengl-graphics.cpp:135
-msgid "OpenGL Normal"
-msgstr "OpenGL ÝÞàÜÐÛìÝØÙ"
-
-#: backends/graphics/opengl/opengl-graphics.cpp:136
-msgid "OpenGL Conserve"
-msgstr "OpenGL ·ÑÕàÕÖÕÝØÙ"
-
-#: backends/graphics/opengl/opengl-graphics.cpp:137
-msgid "OpenGL Original"
-msgstr "OpenGL ¾àØÓöÝÐÛìÝØÙ"
-
-#: backends/graphics/openglsdl/openglsdl-graphics.cpp:415
-msgid "Current display mode"
-msgstr "¿ÞâÞçÝØÙ ÒöÔÕÞàÕÖØÜ"
-
-#: backends/graphics/openglsdl/openglsdl-graphics.cpp:428
-msgid "Current scale"
-msgstr "¿ÞâÞçÝØÙ ÜÐáèâÐÑ"
-
-#: backends/graphics/openglsdl/openglsdl-graphics.cpp:562
-msgid "Active filter mode: Linear"
-msgstr "°ÚâØÒÝØÙ àÕÖØÜ äöÛìâàÐæö÷: »öÝöÙÝØÙ"
-
-#: backends/graphics/openglsdl/openglsdl-graphics.cpp:564
-msgid "Active filter mode: Nearest"
-msgstr "°ÚâØÒÝØÙ àÕÖØÜ äöÛìâàÐæö÷: ½ÐÙÑÛØÖçÕ"
-
-#: backends/platform/symbian/src/SymbianActions.cpp:38
-#: backends/platform/wince/CEActionsSmartphone.cpp:39
-msgid "Up"
-msgstr "´ÞÓÞàØ"
-
-#: backends/platform/symbian/src/SymbianActions.cpp:39
-#: backends/platform/wince/CEActionsSmartphone.cpp:40
-msgid "Down"
-msgstr "´ÞÝØ×ã"
-
-#: backends/platform/symbian/src/SymbianActions.cpp:40
-#: backends/platform/wince/CEActionsSmartphone.cpp:41
-msgid "Left"
-msgstr "½ÐÛöÒÞ"
-
-#: backends/platform/symbian/src/SymbianActions.cpp:41
-#: backends/platform/wince/CEActionsSmartphone.cpp:42
-msgid "Right"
-msgstr "½ÐßàÐÒÞ"
-
-#: backends/platform/symbian/src/SymbianActions.cpp:46
-#: backends/platform/wince/CEActionsSmartphone.cpp:47
-msgid "Zone"
-msgstr "·ÞÝÐ"
-
-#: backends/platform/symbian/src/SymbianActions.cpp:47
-#: backends/platform/wince/CEActionsPocket.cpp:54
-#: backends/platform/wince/CEActionsSmartphone.cpp:48
-msgid "Multi Function"
-msgstr "¼ãÛìâØäãÝÚæöï"
-
-#: backends/platform/symbian/src/SymbianActions.cpp:48
-msgid "Swap character"
-msgstr "·ÜöÝØâØ ÓÕàÞï"
-
-#: backends/platform/symbian/src/SymbianActions.cpp:49
-msgid "Skip text"
-msgstr "¿àÞßãáâØâØ âÕÚáâ"
-
-#: backends/platform/symbian/src/SymbianActions.cpp:51
-msgid "Fast mode"
-msgstr "ÈÒØÔÚØÙ àÕÖØÜ"
-
-#: backends/platform/symbian/src/SymbianActions.cpp:53
-msgid "Debugger"
-msgstr "²öÔÛÐÔçØÚ"
-
-#: backends/platform/symbian/src/SymbianActions.cpp:54
-msgid "Global menu"
-msgstr "³ÛÞÑÐÛìÝÕ ÜÕÝî"
-
-#: backends/platform/symbian/src/SymbianActions.cpp:55
-msgid "Virtual keyboard"
-msgstr "²öàâãÐÛìÝÐ ÚÛÐÒöÐâãàÐ"
-
-#: backends/platform/symbian/src/SymbianActions.cpp:56
-msgid "Key mapper"
-msgstr "¿àØ×ÝÐçÕÝÝï ÚÛÐÒöè"
-
-#: backends/events/symbiansdl/symbiansdl-events.cpp:184
-msgid "Do you want to quit ?"
-msgstr "²Ø ÔöÙáÝÞ åÞçÕâÕ ÒØÙâØ?"
-
-#: backends/platform/wii/options.cpp:51
-msgid "Video"
-msgstr "²öÔÕÞ"
-
-#: backends/platform/wii/options.cpp:54
-msgid "Current video mode:"
-msgstr "¿ÞâÞçÝØÙ ÒöÔÕÞàÕÖØÜ:"
-
-#: backends/platform/wii/options.cpp:56
-msgid "Double-strike"
-msgstr "¿ÞÔÒöÙÝØÙ ãÔÐà"
-
-#: backends/platform/wii/options.cpp:60
-msgid "Horizontal underscan:"
-msgstr "³ÞàØ×ÞÝâÐÛìÝØÙ underscan:"
-
-#: backends/platform/wii/options.cpp:66
-msgid "Vertical underscan:"
-msgstr "²ÕàâØÚÐÛìÝØÙ underscan:"
-
-#: backends/platform/wii/options.cpp:71
-msgid "Input"
-msgstr "²ÒöÔ"
-
-#: backends/platform/wii/options.cpp:74
-msgid "GC Pad sensitivity:"
-msgstr "ÇãâÛØÒöáâì GC ßÐÔã:"
-
-#: backends/platform/wii/options.cpp:80
-msgid "GC Pad acceleration:"
-msgstr "¿àØáÚÞàÕÝÝï GC ßÐÔã:"
-
-#: backends/platform/wii/options.cpp:86
-msgid "DVD"
-msgstr "DVD"
-
-#: backends/platform/wii/options.cpp:89 backends/platform/wii/options.cpp:101
-msgid "Status:"
-msgstr "ÁâÐÝ:"
-
-#: backends/platform/wii/options.cpp:90 backends/platform/wii/options.cpp:102
-msgid "Unknown"
-msgstr "½ÕÒöÔÞÜÞ"
-
-#: backends/platform/wii/options.cpp:93
-msgid "Mount DVD"
-msgstr "¿öÔÚÛîçØâØ DVD"
-
-#: backends/platform/wii/options.cpp:94
-msgid "Unmount DVD"
-msgstr "²öÔÚÛîçØâØ DVD"
-
-#: backends/platform/wii/options.cpp:98
-msgid "SMB"
-msgstr "SMB"
-
-#: backends/platform/wii/options.cpp:106
-msgid "Server:"
-msgstr "ÁÕàÒÕà:"
-
-#: backends/platform/wii/options.cpp:110
-msgid "Share:"
-msgstr "¼ÕàÕÖÕÒÐ ßÐßÚÐ:"
-
-#: backends/platform/wii/options.cpp:114
-msgid "Username:"
-msgstr "ºÞàØáâãÒÐç:"
-
-#: backends/platform/wii/options.cpp:118
-msgid "Password:"
-msgstr "¿ÐàÞÛì:"
-
-#: backends/platform/wii/options.cpp:121
-msgid "Init network"
-msgstr "½ÐÛÐèâãÒÐÝÝï ÜÕàÕÖö"
-
-#: backends/platform/wii/options.cpp:123
-msgid "Mount SMB"
-msgstr "¿öÔÚÛîçØâØ SMB"
-
-#: backends/platform/wii/options.cpp:124
-msgid "Unmount SMB"
-msgstr "²öÔÚÛîçâØ SMB"
-
-#: backends/platform/wii/options.cpp:143
-msgid "DVD Mounted successfully"
-msgstr "DVD ßöÔÚÛîçÕÝÞ ãáßöèÝÞ"
-
-#: backends/platform/wii/options.cpp:146
-msgid "Error while mounting the DVD"
-msgstr "¿ÞÜØÛÚÐ ßöÔ çÐá ßöÔÚÛîçÕÝÝï DVD"
-
-#: backends/platform/wii/options.cpp:148
-msgid "DVD not mounted"
-msgstr "DVD ÝÕ ßöÔÚÛîçÕÝÞ"
-
-#: backends/platform/wii/options.cpp:161
-msgid "Network up, share mounted"
-msgstr "¼ÕàÕÖÐ ßàÐæîô, ßÐßÚã ßöÔÚÛîçÕÝÞ"
-
-#: backends/platform/wii/options.cpp:163
-msgid "Network up"
-msgstr "¼ÕàÕÖÐ ßàÐæîô"
-
-#: backends/platform/wii/options.cpp:166
-msgid ", error while mounting the share"
-msgstr ", ßÞÜØÛÚÐ ßöÔ çÐá ßöÔÚÛîçÕÝÝï ßÐßÚØ"
-
-#: backends/platform/wii/options.cpp:168
-msgid ", share not mounted"
-msgstr ", ßÐßÚã ÝÕ ßöÔÚÛîçÕÝÞ"
-
-#: backends/platform/wii/options.cpp:174
-msgid "Network down"
-msgstr "¼ÕàÕÖã ÒØÜÚÝÕÝÞ"
-
-#: backends/platform/wii/options.cpp:178
-msgid "Initializing network"
-msgstr "½ÐÛÐèâÞÒãî ÜÕàÕÖã"
-
-#: backends/platform/wii/options.cpp:182
-msgid "Timeout while initializing network"
-msgstr "ÇÐá ßöÔÚÛîçÕÝÝï ÔÞ ÜÕàÕÖö ÒØÙèÞÒ"
-
-#: backends/platform/wii/options.cpp:186
-#, c-format
-msgid "Network not initialized (%d)"
-msgstr "¼ÕàÕÖã ÝÕ ÝÐÛÐèâÞÒÐÝÞ (%d)"
-
-#: backends/platform/wince/CEActionsPocket.cpp:46
-msgid "Hide Toolbar"
-msgstr "·ÐåÞÒÐâØ ßÐÝÕÛì öÝáâàãÜÕÝâöÒ"
-
-#: backends/platform/wince/CEActionsPocket.cpp:47
-msgid "Show Keyboard"
-msgstr "¿ÞÚÐ×ÐâØ ÚÛÐÒöÐâãàã"
-
-#: backends/platform/wince/CEActionsPocket.cpp:48
-msgid "Sound on/off"
-msgstr "·ÒãÚ ãÒöÜ/ÒØÜÚ"
-
-#: backends/platform/wince/CEActionsPocket.cpp:49
-msgid "Right click"
-msgstr "¿àÐÒØÙ ÚÛöÚ"
-
-#: backends/platform/wince/CEActionsPocket.cpp:50
-msgid "Show/Hide Cursor"
-msgstr "¿ÞÚÐ×ÐâØ/áåÞÒÐâØ ÚãàáÞà"
-
-#: backends/platform/wince/CEActionsPocket.cpp:51
-msgid "Free look"
-msgstr "²öÛìÝØÙ ÞÓÛïÔ"
-
-#: backends/platform/wince/CEActionsPocket.cpp:52
-msgid "Zoom up"
-msgstr "·ÑöÛ. ÜÐáèâÐÑ"
-
-#: backends/platform/wince/CEActionsPocket.cpp:53
-msgid "Zoom down"
-msgstr "·ÜÝè. ÜÐáèâÐÑ"
-
-#: backends/platform/wince/CEActionsPocket.cpp:55
-#: backends/platform/wince/CEActionsSmartphone.cpp:49
-msgid "Bind Keys"
-msgstr "¿àØ×ÝÐçØâØ ÚÛÐÒöèö"
-
-#: backends/platform/wince/CEActionsPocket.cpp:56
-msgid "Cursor Up"
-msgstr "ºãàáÞà ÔÞÓÞàØ"
-
-#: backends/platform/wince/CEActionsPocket.cpp:57
-msgid "Cursor Down"
-msgstr "ºãàáÞà ÔÞÝØ×ã"
-
-#: backends/platform/wince/CEActionsPocket.cpp:58
-msgid "Cursor Left"
-msgstr "ºãàáÞà ÝÐÛöÒÞ"
-
-#: backends/platform/wince/CEActionsPocket.cpp:59
-msgid "Cursor Right"
-msgstr "ºãàáÞà ÝÐßàÐÒÞ"
-
-#: 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:326
-#: backends/platform/wince/CEActionsSmartphone.cpp:287
-msgid " Are you sure you want to quit ? "
-msgstr " ²Ø ãßÕÒÝÕÝö, éÞ åÞçÕâÕ ÒØÙâØ? "
-
-#: backends/platform/wince/CEActionsSmartphone.cpp:50
-msgid "Keyboard"
-msgstr "ºÛÐÒöÐâãàÐ"
-
-#: backends/platform/wince/CEActionsSmartphone.cpp:51
-msgid "Rotate"
-msgstr "¿ÞÒÕàÝãâØ"
-
-#: backends/platform/wince/CELauncherDialog.cpp:56
-msgid "Using SDL driver "
-msgstr "²ØÚÞàØáâÞÒãî ÔàÐÙÒÕà SDL "
-
-#: backends/platform/wince/CELauncherDialog.cpp:60
-msgid "Display "
-msgstr "¿ÞÚÐ×ÐâØ "
-
-#: backends/platform/wince/CELauncherDialog.cpp:83
-msgid "Do you want to perform an automatic scan ?"
-msgstr "²Ø åÞçÕâÕ ×ÔöÙáÝØâØ ÐÒâÞÜÐâØçÝØÙ ßÞèãÚ?"
-
-#: backends/platform/wince/wince-sdl.cpp:515
-msgid "Map right click action"
-msgstr "¿ÕàÕßàØ×ÝÐçÕÝÝï ßàÐÒÞÓÞ ÚÛöÚã"
-
-#: 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:528
-msgid "Map hide toolbar action"
-msgstr "¿ÕàÕßàØ×ÝÐçØâØ Ôöî 'ÁåÞÒÐâØ ¿ÐÝÕÛì öÝáâà.'"
-
-#: 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:541
-msgid "Map Zoom Up action (optional)"
-msgstr "¿ÕàÕßàØ×ÝÐçØâØ Ôöî ·ÑöÛìèÕÝÝï (ÝÕÞÑÞÒ'ï×ÚÞÒÞ)"
-
-#: backends/platform/wince/wince-sdl.cpp:544
-msgid "Map Zoom Down action (optional)"
-msgstr "¿ÕàÕßàØ×ÝÐçØâØ Ôöî ·ÜÕÝèÕÝÝï (ÝÕÞÑÞÒ'ï×ÚÞÒÞ)"
-
-#: 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 ""
-"½Õ ×ÐÑãÔìâÕ ßÕàÕßàØ×ÝÐçØâØ ÚÝÞßÚã ÔÛï Ôö÷ 'ÁåÞÒÐâØ ¿ÐÝÕÛì öÝáâà.' éÞÑ "
-"ßÞÑÐçØâØ ÒÕáì öÝÒÕÝâÐà"
-
-#: backends/events/default/default-events.cpp:193
-msgid "Do you really want to return to the Launcher?"
-msgstr "²Ø ÔöÙáÝÞ åÞçÕâÕ ßÞÒÕàÝãâØáï ÔÞ ÓÞÛÞÒÝÞÓÞ ÜÕÝî?"
-
-#: backends/events/default/default-events.cpp:193
-msgid "Launcher"
-msgstr "³ÞÛÞÒÝÕ ÜÕÝî"
-
-#: backends/events/default/default-events.cpp:215
-msgid "Do you really want to quit?"
-msgstr "²Ø ÔöÙáÝÞ åÞçÕâÕ ÒØÙâØ?"
-
-#: backends/events/gph/gph-events.cpp:386
-#: backends/events/gph/gph-events.cpp:429
-#: backends/events/openpandora/op-events.cpp:168
-msgid "Touchscreen 'Tap Mode' - Left Click"
-msgstr "ÀÕÖØÜ ÔÞâØÚã ã âÐçáÚàöÝö - »öÒØÙ ÚÛöÚ"
-
-#: backends/events/gph/gph-events.cpp:388
-#: backends/events/gph/gph-events.cpp:431
-#: backends/events/openpandora/op-events.cpp:170
-msgid "Touchscreen 'Tap Mode' - Right Click"
-msgstr "ÀÕÖØÜ ÔÞâØÚã ã âÐçáÚàöÝö - ¿àÐÒØÙ ÚÛöÚ"
-
-#: backends/events/gph/gph-events.cpp:390
-#: backends/events/gph/gph-events.cpp:433
-#: backends/events/openpandora/op-events.cpp:172
-msgid "Touchscreen 'Tap Mode' - Hover (No Click)"
-msgstr "ÀÕÖØÜ ÔÞâØÚã ã âÐçáÚàöÝö - ¿àÞÛöâ (ÑÕ× ÚÛöÚã)"
-
-#: backends/events/gph/gph-events.cpp:410
-msgid "Maximum Volume"
-msgstr "¼ÐÚáØÜÐÛìÝÐ ³ãçÝöáâì"
+#~ msgctxt "lowres"
+#~ msgid "Mass Add..."
+#~ msgstr "´ÞÔ. ÑÐÓÐâÞ..."
-#: backends/events/gph/gph-events.cpp:412
-msgid "Increasing Volume"
-msgstr "¿öÔÒØéÕÝÝï ÓãçÝÞáâö"
+#~ msgid "Mass Add..."
+#~ msgstr "´ÞÔ. ÑÐÓÐâÞ..."
-#: backends/events/gph/gph-events.cpp:418
-msgid "Minimal Volume"
-msgstr "¼öÝöÜÐÛìÝÐ ³ãçÝöáâì"
+#~ msgid ""
+#~ "Turns off General MIDI mapping for games with Roland MT-32 soundtrack"
+#~ msgstr ""
+#~ "²ØÜØÚÐô ÜÐßöÝÓ General MIDI ÔÛï öÓÞà ×ö ×ÒãÚÞÒÞî ÔÞàöÖÚÞî ÔÛï Roland MT-32"
-#: backends/events/gph/gph-events.cpp:420
-msgid "Decreasing Volume"
-msgstr "¿ÞÝØÖÕÝÝï ÓãçÝÞáâö"
+#~ msgid "Standard (16bpp)"
+#~ msgstr "ÁâÐÝÔÐàâÝØÙ àÐáâÕàØ×ÐâÞà (16bpp)"
-#: backends/events/openpandora/op-events.cpp:174
-msgid "Touchscreen 'Tap Mode' - Hover (DPad Clicks)"
-msgstr "ÀÕÖØÜ ÔÞâØÚã ã âÐçáÚàöÝö - ¿àÞÛöâ (ÚÛöÚ DPad)"
+#~ msgid "Alternative intro"
+#~ msgstr "°ÛâÕàÝÐâØÒÝØÙ Òáâãß"
-#: backends/updates/macosx/macosx-updates.mm:67
-msgid "Check for Updates..."
-msgstr "¿ÕàÕÒöàïî ÞÝÞÒÛÕÝÝï..."
+#~ msgid "Use an alternative game intro (CD version only)"
+#~ msgstr "²ØÚÞàØáâÞÒãÒÐâØ ÐÛìâÕàÝÐâØÒÝØÙ Òáâãß ÓàØ (âöÛìÚØ CD ÒÕàáöï)"
-#: backends/platform/bada/form.cpp:269
-msgid "Right Click Once"
-msgstr "¾ÔØÝ ßàÐÒØÙ ÚÛöÚ"
+#~ msgid "MPEG2 cutscenes are no longer supported"
+#~ msgstr "·ÐáâÐÒÚØ MPEG2 ÑöÛìèÕ ÝÕ ßöÔâàØÜãîâìáï"
-#: backends/platform/bada/form.cpp:277
-msgid "Move Only"
-msgstr "ÂöÛìÚØ ßÕàÕÜöáâØâØ"
+#~ msgid "OpenGL Normal"
+#~ msgstr "OpenGL ÝÞàÜÐÛìÝØÙ"
-#: backends/platform/bada/form.cpp:291
-msgid "Escape Key"
-msgstr "ºÛÐÒöèÐ ESC"
+#~ msgid "OpenGL Conserve"
+#~ msgstr "OpenGL ·ÑÕàÕÖÕÝØÙ"
-#: backends/platform/bada/form.cpp:296
-msgid "Game Menu"
-msgstr "¼ÕÝî ÓàØ"
+#~ msgid "OpenGL Original"
+#~ msgstr "OpenGL ¾àØÓöÝÐÛìÝØÙ"
-#: backends/platform/bada/form.cpp:301
-msgid "Show Keypad"
-msgstr "¿ÞÚÐ×ÐâØ ÚÛÐÒöÐâãàã"
+#~ msgid "Current display mode"
+#~ msgstr "¿ÞâÞçÝØÙ ÒöÔÕÞàÕÖØÜ"
-#: backends/platform/bada/form.cpp:309
-msgid "Control Mouse"
-msgstr "ÃßàÐÒÛöÝÝï ÜØèÕî"
+#~ msgid "Current scale"
+#~ msgstr "¿ÞâÞçÝØÙ ÜÐáèâÐÑ"
-#: backends/events/maemosdl/maemosdl-events.cpp:192
-msgid "Clicking Enabled"
-msgstr "ºÛöÚØ ãÒöÜÚÝÕÝÞ"
+#~ msgid "Active filter mode: Linear"
+#~ msgstr "°ÚâØÒÝØÙ àÕÖØÜ äöÛìâàÐæö÷: »öÝöÙÝØÙ"
-#: backends/events/maemosdl/maemosdl-events.cpp:192
-msgid "Clicking Disabled"
-msgstr "ºÛöÚØ ÒØÜÚÝÕÝÞ"
+#~ msgid "Active filter mode: Nearest"
+#~ msgstr "°ÚâØÒÝØÙ àÕÖØÜ äöÛìâàÐæö÷: ½ÐÙÑÛØÖçÕ"
#~ msgid "Enable Roland GS Mode"
#~ msgstr "ÃÒöÜÚÝãâØ àÕÖØÜ Roland GS"
diff --git a/ports.mk b/ports.mk
index f9d075707b..b7b19258aa 100644
--- a/ports.mk
+++ b/ports.mk
@@ -97,10 +97,11 @@ endif
ifneq ($(BACKEND), iphone)
# Static libaries, used for the scummvm-static and iphone targets
OSX_STATIC_LIBS := `$(STATICLIBPATH)/bin/sdl-config --static-libs`
+endif
+
ifdef USE_FREETYPE2
OSX_STATIC_LIBS += $(STATICLIBPATH)/lib/libfreetype.a $(STATICLIBPATH)/lib/libbz2.a
endif
-endif
ifdef USE_VORBIS
OSX_STATIC_LIBS += \
@@ -155,10 +156,6 @@ ifdef USE_SPARKLE
OSX_STATIC_LIBS += -framework Sparkle -F$(STATICLIBPATH)
endif
-ifdef USE_TERMCONV
-OSX_ICONV ?= -liconv
-endif
-
# Special target to create a static linked binary for Mac OS X.
# We use -force_cpusubtype_ALL to ensure the binary runs on every
# PowerPC machine.
@@ -166,17 +163,15 @@ scummvm-static: $(OBJS)
$(CXX) $(LDFLAGS) -force_cpusubtype_ALL -o scummvm-static $(OBJS) \
-framework CoreMIDI \
$(OSX_STATIC_LIBS) \
- $(OSX_ZLIB) \
- $(OSX_ICONV)
+ $(OSX_ZLIB)
# Special target to create a static linked binary for the iPhone
iphone: $(OBJS)
$(CXX) $(LDFLAGS) -o scummvm $(OBJS) \
$(OSX_STATIC_LIBS) \
-framework UIKit -framework CoreGraphics -framework OpenGLES \
- -framework GraphicsServices -framework CoreFoundation -framework QuartzCore \
- -framework Foundation -framework AudioToolbox -framework CoreAudio \
- -lobjc -lz
+ -framework CoreFoundation -framework QuartzCore -framework Foundation \
+ -framework AudioToolbox -framework CoreAudio -lobjc -lz
# Special target to create a snapshot disk image for Mac OS X
# TODO: Replace AUTHORS by Credits.rtf
@@ -318,15 +313,15 @@ else ifeq "$(CUR_BRANCH)" ""
$(error You must be on a release branch)
endif
@echo Creating Code::Blocks project files...
- @cd $(srcdir)/dists/codeblocks && ../../devtools/create_project/create_project ../.. --codeblocks >/dev/null && git add -f *.workspace *.cbp
+ @cd $(srcdir)/dists/codeblocks && ../../devtools/create_project/create_project ../.. --codeblocks >/dev/null && git add -f engines/plugins_table.h *.workspace *.cbp
@echo Creating MSVC8 project files...
- @cd $(srcdir)/dists/msvc8 && ../../devtools/create_project/create_project ../.. --msvc --msvc-version 8 >/dev/null && git add -f *.sln *.vcproj *.vsprops
+ @cd $(srcdir)/dists/msvc8 && ../../devtools/create_project/create_project ../.. --msvc --msvc-version 8 >/dev/null && git add -f engines/plugins_table.h *.sln *.vcproj *.vsprops
@echo Creating MSVC9 project files...
- @cd $(srcdir)/dists/msvc9 && ../../devtools/create_project/create_project ../.. --msvc --msvc-version 9 >/dev/null && git add -f *.sln *.vcproj *.vsprops
+ @cd $(srcdir)/dists/msvc9 && ../../devtools/create_project/create_project ../.. --msvc --msvc-version 9 >/dev/null && git add -f engines/plugins_table.h *.sln *.vcproj *.vsprops
@echo Creating MSVC10 project files...
- @cd $(srcdir)/dists/msvc10 && ../../devtools/create_project/create_project ../.. --msvc --msvc-version 10 >/dev/null && git add -f *.sln *.vcxproj *.vcxproj.filters *.props
+ @cd $(srcdir)/dists/msvc10 && ../../devtools/create_project/create_project ../.. --msvc --msvc-version 10 >/dev/null && git add -f engines/plugins_table.h *.sln *.vcxproj *.vcxproj.filters *.props
@echo Creating MSVC11 project files...
- @cd $(srcdir)/dists/msvc11 && ../../devtools/create_project/create_project ../.. --msvc --msvc-version 11 >/dev/null && git add -f *.sln *.vcxproj *.vcxproj.filters *.props
+ @cd $(srcdir)/dists/msvc11 && ../../devtools/create_project/create_project ../.. --msvc --msvc-version 11 >/dev/null && git add -f engines/plugins_table.h *.sln *.vcxproj *.vcxproj.filters *.props
@echo
@echo All is done.
@echo Now run
diff --git a/test/common/util.h b/test/common/util.h
index cd65307612..e195f13a84 100644
--- a/test/common/util.h
+++ b/test/common/util.h
@@ -115,7 +115,7 @@ class UtilTestSuite : public CxxTest::TestSuite {
TS_ASSERT_EQUALS(Common::isAlnum('Z'), 1);
TS_ASSERT_EQUALS(Common::isAlnum('1'), 1);
TS_ASSERT_EQUALS(Common::isAlnum('0'), 1);
- TS_ASSERT_EQUALS(Common::isAlnum('§'), 0);
+ TS_ASSERT_EQUALS(Common::isAlnum('\xA7'), 0);
TS_ASSERT_EQUALS(Common::isAlnum('$'), 0);
TS_ASSERT_EQUALS(Common::isAlnum(' '), 0);
TS_ASSERT_EQUALS(Common::isAlnum('\n'), 0);
@@ -136,7 +136,7 @@ class UtilTestSuite : public CxxTest::TestSuite {
TS_ASSERT_EQUALS(Common::isAlpha('Z'), 1);
TS_ASSERT_EQUALS(Common::isAlpha('1'), 0);
TS_ASSERT_EQUALS(Common::isAlpha('0'), 0);
- TS_ASSERT_EQUALS(Common::isAlpha('§'), 0);
+ TS_ASSERT_EQUALS(Common::isAlpha('\xA7'), 0);
TS_ASSERT_EQUALS(Common::isAlpha('$'), 0);
TS_ASSERT_EQUALS(Common::isAlpha(' '), 0);
TS_ASSERT_EQUALS(Common::isAlpha('\n'), 0);
@@ -157,7 +157,7 @@ class UtilTestSuite : public CxxTest::TestSuite {
TS_ASSERT_EQUALS(Common::isDigit('Z'), 0);
TS_ASSERT_EQUALS(Common::isDigit('1'), 1);
TS_ASSERT_EQUALS(Common::isDigit('0'), 1);
- TS_ASSERT_EQUALS(Common::isDigit('§'), 0);
+ TS_ASSERT_EQUALS(Common::isDigit('\xA7'), 0);
TS_ASSERT_EQUALS(Common::isDigit('$'), 0);
TS_ASSERT_EQUALS(Common::isDigit(' '), 0);
TS_ASSERT_EQUALS(Common::isDigit('\n'), 0);
@@ -178,7 +178,7 @@ class UtilTestSuite : public CxxTest::TestSuite {
TS_ASSERT_EQUALS(Common::isLower('Z'), 0);
TS_ASSERT_EQUALS(Common::isLower('1'), 0);
TS_ASSERT_EQUALS(Common::isLower('0'), 0);
- TS_ASSERT_EQUALS(Common::isLower('§'), 0);
+ TS_ASSERT_EQUALS(Common::isLower('\xA7'), 0);
TS_ASSERT_EQUALS(Common::isLower('$'), 0);
TS_ASSERT_EQUALS(Common::isLower(' '), 0);
TS_ASSERT_EQUALS(Common::isLower('\n'), 0);
@@ -200,7 +200,7 @@ class UtilTestSuite : public CxxTest::TestSuite {
TS_ASSERT_EQUALS(Common::isUpper('Z'), 1);
TS_ASSERT_EQUALS(Common::isUpper('1'), 0);
TS_ASSERT_EQUALS(Common::isUpper('0'), 0);
- TS_ASSERT_EQUALS(Common::isUpper('§'), 0);
+ TS_ASSERT_EQUALS(Common::isUpper('\xA7'), 0);
TS_ASSERT_EQUALS(Common::isUpper('$'), 0);
TS_ASSERT_EQUALS(Common::isUpper(' '), 0);
TS_ASSERT_EQUALS(Common::isUpper('\n'), 0);
diff --git a/test/cxxtest_mingw.h b/test/cxxtest_mingw.h
index f407105bfe..380f638640 100644
--- a/test/cxxtest_mingw.h
+++ b/test/cxxtest_mingw.h
@@ -8,4 +8,4 @@
#undef main
#endif // main
-#endif // CXXTEST_MINGW \ No newline at end of file
+#endif // CXXTEST_MINGW
diff --git a/video/avi_decoder.cpp b/video/avi_decoder.cpp
index aee2d88988..39deaea204 100644
--- a/video/avi_decoder.cpp
+++ b/video/avi_decoder.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -34,12 +34,7 @@
#include "audio/decoders/raw.h"
// Video Codecs
-#include "video/codecs/cinepak.h"
-#include "video/codecs/indeo3.h"
-#include "video/codecs/mpeg.h"
-#include "video/codecs/msvideo1.h"
-#include "video/codecs/msrle.h"
-#include "video/codecs/truemotion1.h"
+#include "image/codecs/codec.h"
namespace Video {
@@ -59,6 +54,8 @@ namespace Video {
#define ID_MIDS MKTAG('m','i','d','s')
#define ID_TXTS MKTAG('t','x','t','s')
#define ID_JUNK MKTAG('J','U','N','K')
+#define ID_JUNQ MKTAG('J','U','N','Q')
+#define ID_DMLH MKTAG('d','m','l','h')
#define ID_STRF MKTAG('s','t','r','f')
#define ID_MOVI MKTAG('m','o','v','i')
#define ID_REC MKTAG('r','e','c',' ')
@@ -69,21 +66,11 @@ namespace Video {
#define ID_ISFT MKTAG('I','S','F','T')
#define ID_DISP MKTAG('D','I','S','P')
#define ID_PRMI MKTAG('P','R','M','I')
-
-// Codec tags
-#define ID_RLE MKTAG('R','L','E',' ')
-#define ID_CRAM MKTAG('C','R','A','M')
-#define ID_MSVC MKTAG('m','s','v','c')
-#define ID_WHAM MKTAG('W','H','A','M')
-#define ID_CVID MKTAG('c','v','i','d')
-#define ID_IV32 MKTAG('i','v','3','2')
-#define ID_DUCK MKTAG('D','U','C','K')
-#define ID_MPG2 MKTAG('m','p','g','2')
+#define ID_STRN MKTAG('s','t','r','n')
// Stream Types
enum {
kStreamTypePaletteChange = MKTAG16('p', 'c'),
- kStreamTypeRawVideo = MKTAG16('d', 'b'),
kStreamTypeAudio = MKTAG16('w', 'b')
};
@@ -109,6 +96,7 @@ void AVIDecoder::initCommon() {
_decodedHeader = false;
_foundMovieList = false;
_movieListStart = 0;
+ _movieListEnd = 0;
_fileStream = 0;
memset(&_header, 0, sizeof(_header));
}
@@ -153,21 +141,15 @@ bool AVIDecoder::parseNextChunk() {
case ID_STRD: // Extra stream info, safe to ignore
case ID_VEDT: // Unknown, safe to ignore
case ID_JUNK: // Alignment bytes, should be ignored
+ case ID_JUNQ: // Same as JUNK, safe to ignore
case ID_ISFT: // Metadata, safe to ignore
case ID_DISP: // Metadata, should be safe to ignore
+ case ID_STRN: // Metadata, safe to ignore
+ case ID_DMLH: // OpenDML extension, contains an extra total frames field, safe to ignore
skipChunk(size);
break;
case ID_IDX1:
- debug(0, "%d Indices", size / 16);
- for (uint32 i = 0; i < size / 16; i++) {
- OldIndex indexEntry;
- indexEntry.id = _fileStream->readUint32BE();
- indexEntry.flags = _fileStream->readUint32LE();
- indexEntry.offset = _fileStream->readUint32LE() + _movieListStart - 4; // Adjust to absolute
- indexEntry.size = _fileStream->readUint32LE();
- _indexEntries.push_back(indexEntry);
- debug(0, "Index %d == Tag \'%s\', Offset = %d, Size = %d (Flags = %d)", i, tag2str(indexEntry.id), indexEntry.offset, indexEntry.size, indexEntry.flags);
- }
+ readOldIndex(size);
break;
default:
error("Unknown tag \'%s\' found", tag2str(tag));
@@ -193,6 +175,7 @@ void AVIDecoder::handleList(uint32 listSize) {
// We found the movie block
_foundMovieList = true;
_movieListStart = curPos;
+ _movieListEnd = _movieListStart + listSize + (listSize & 1);
_fileStream->skip(listSize);
return;
case ID_HDRL: // Header List
@@ -200,7 +183,7 @@ void AVIDecoder::handleList(uint32 listSize) {
_decodedHeader = true;
break;
case ID_INFO: // Metadata
- case ID_PRMI: // Unknown metadata, should be safe to ignore
+ case ID_PRMI: // Adobe Premiere metadata, safe to ignore
// Ignore metadata
_fileStream->skip(listSize);
return;
@@ -264,9 +247,6 @@ void AVIDecoder::handleStreamHeader(uint32 size) {
if (bmInfo.clrUsed == 0)
bmInfo.clrUsed = 256;
- if (sHeader.streamHandler == 0)
- sHeader.streamHandler = bmInfo.compression;
-
byte *initialPalette = 0;
if (bmInfo.bitCount == 8) {
@@ -342,6 +322,9 @@ bool AVIDecoder::loadStream(Common::SeekableReadStream *stream) {
// Seek back to the start of the MOVI list
_fileStream->seek(_movieListStart);
+ // Check if this is a special Duck Truemotion video
+ checkTruemotion1();
+
return true;
}
@@ -353,17 +336,27 @@ void AVIDecoder::close() {
_decodedHeader = false;
_foundMovieList = false;
_movieListStart = 0;
+ _movieListEnd = 0;
_indexEntries.clear();
memset(&_header, 0, sizeof(_header));
}
void AVIDecoder::readNextPacket() {
+ if ((uint32)_fileStream->pos() >= _movieListEnd) {
+ // Ugh, reached the end premature.
+ forceVideoEnd();
+ return;
+ }
+
uint32 nextTag = _fileStream->readUint32BE();
uint32 size = _fileStream->readUint32LE();
- if (_fileStream->eos())
+ if (_fileStream->eos()) {
+ // Also premature end.
+ forceVideoEnd();
return;
+ }
if (nextTag == ID_LIST) {
// A list of audio/video chunks
@@ -408,10 +401,6 @@ void AVIDecoder::readNextPacket() {
if (getStreamType(nextTag) == kStreamTypePaletteChange) {
// Palette Change
videoTrack->loadPaletteFromChunk(chunk);
- } else if (getStreamType(nextTag) == kStreamTypeRawVideo) {
- // TODO: Check if this really is uncompressed. Many videos
- // falsely put compressed data in here.
- error("Uncompressed AVI frame found");
} else {
// Otherwise, assume it's a compressed frame
videoTrack->decodeFrame(chunk);
@@ -432,12 +421,10 @@ bool AVIDecoder::seekIntern(const Audio::Timestamp &time) {
if (time > getDuration())
return false;
- // Track down our video track (optionally audio too).
- // We only support seeking with one track right now.
+ // Track down our video track.
+ // We only support seeking with one video track right now.
AVIVideoTrack *videoTrack = 0;
- AVIAudioTrack *audioTrack = 0;
int videoIndex = -1;
- int audioIndex = -1;
uint trackID = 0;
for (TrackListIterator it = getTrackListBegin(); it != getTrackListEnd(); it++, trackID++) {
@@ -450,15 +437,6 @@ bool AVIDecoder::seekIntern(const Audio::Timestamp &time) {
videoTrack = (AVIVideoTrack *)*it;
videoIndex = trackID;
- } else if ((*it)->getTrackType() == Track::kTrackTypeAudio) {
- if (audioTrack) {
- // Already have one
- // -> Not supported
- return false;
- }
-
- audioTrack = (AVIAudioTrack *)*it;
- audioIndex = trackID;
}
}
@@ -471,8 +449,9 @@ bool AVIDecoder::seekIntern(const Audio::Timestamp &time) {
if (time == getDuration()) {
videoTrack->setCurFrame(videoTrack->getFrameCount() - 1);
- if (audioTrack)
- audioTrack->resetStream();
+ for (TrackListIterator it = getTrackListBegin(); it != getTrackListEnd(); it++)
+ if ((*it)->getTrackType() == Track::kTrackTypeAudio)
+ ((AVIAudioTrack *)*it)->resetStream();
return true;
}
@@ -533,7 +512,15 @@ bool AVIDecoder::seekIntern(const Audio::Timestamp &time) {
if (frameIndex < 0) // This shouldn't happen.
return false;
- if (audioTrack) {
+ // Update all the audio tracks
+ uint audioIndex = 0;
+
+ for (TrackListIterator it = getTrackListBegin(); it != getTrackListEnd(); it++, audioIndex++) {
+ if ((*it)->getTrackType() != Track::kTrackTypeAudio)
+ continue;
+
+ AVIAudioTrack *audioTrack = (AVIAudioTrack *)*it;
+
// We need to find where the start of audio should be.
// Which is exactly 'initialFrames' audio chunks back from where
// our found frame is.
@@ -621,6 +608,111 @@ byte AVIDecoder::getStreamIndex(uint32 tag) const {
return strtol(string, 0, 16);
}
+void AVIDecoder::readOldIndex(uint32 size) {
+ uint32 entryCount = size / 16;
+
+ debug(0, "Old Index: %d entries", entryCount);
+
+ if (entryCount == 0)
+ return;
+
+ // Read the first index separately
+ OldIndex firstEntry;
+ firstEntry.id = _fileStream->readUint32BE();
+ firstEntry.flags = _fileStream->readUint32LE();
+ firstEntry.offset = _fileStream->readUint32LE();
+ firstEntry.size = _fileStream->readUint32LE();
+
+ // Check if the offset is already absolute
+ // If it's absolute, the offset will equal the start of the movie list
+ bool isAbsolute = firstEntry.offset == _movieListStart;
+
+ debug(1, "Old index is %s", isAbsolute ? "absolute" : "relative");
+
+ if (!isAbsolute)
+ firstEntry.offset += _movieListStart - 4;
+
+ debug(0, "Index 0: Tag '%s', Offset = %d, Size = %d (Flags = %d)", tag2str(firstEntry.id), firstEntry.offset, firstEntry.size, firstEntry.flags);
+ _indexEntries.push_back(firstEntry);
+
+ for (uint32 i = 1; i < entryCount; i++) {
+ OldIndex indexEntry;
+ indexEntry.id = _fileStream->readUint32BE();
+ indexEntry.flags = _fileStream->readUint32LE();
+ indexEntry.offset = _fileStream->readUint32LE();
+ indexEntry.size = _fileStream->readUint32LE();
+
+ // Adjust to absolute, if necessary
+ if (!isAbsolute)
+ indexEntry.offset += _movieListStart - 4;
+
+ _indexEntries.push_back(indexEntry);
+ debug(0, "Index %d: Tag '%s', Offset = %d, Size = %d (Flags = %d)", i, tag2str(indexEntry.id), indexEntry.offset, indexEntry.size, indexEntry.flags);
+ }
+}
+
+void AVIDecoder::forceVideoEnd() {
+ // Horrible AVI video has a premature end
+ // Force the frame to be the last frame
+ debug(0, "Forcing end of AVI video");
+
+ for (TrackListIterator it = getTrackListBegin(); it != getTrackListEnd(); it++)
+ if ((*it)->getTrackType() == Track::kTrackTypeVideo)
+ ((AVIVideoTrack *)*it)->forceTrackEnd();
+}
+
+void AVIDecoder::checkTruemotion1() {
+ AVIVideoTrack *track = 0;
+
+ for (TrackListIterator it = getTrackListBegin(); it != getTrackListEnd(); it++) {
+ if ((*it)->getTrackType() == Track::kTrackTypeVideo) {
+ if (track) {
+ // Multiple tracks; isn't going to be truemotion 1
+ return;
+ }
+
+ track = (AVIVideoTrack *)*it;
+ }
+ }
+
+ // No track found?
+ if (!track)
+ return;
+
+ // Ignore non-truemotion tracks
+ if (!track->isTruemotion1())
+ return;
+
+ // Search for a non-empty frame
+ const Graphics::Surface *frame = 0;
+ for (int i = 0; i < 10 && !frame; i++)
+ frame = decodeNextFrame();
+
+ if (!frame) {
+ // Probably shouldn't happen
+ rewind();
+ return;
+ }
+
+ // Fill in the width/height based on the frame's width/height
+ _header.width = frame->w;
+ _header.height = frame->h;
+ track->forceDimensions(frame->w, frame->h);
+
+ // Rewind us back to the beginning
+ rewind();
+}
+
+VideoDecoder::AudioTrack *AVIDecoder::getAudioTrack(int index) {
+ // AVI audio track indexes are relative to the first track
+ Track *track = getTrack(index);
+
+ if (!track || track->getTrackType() != Track::kTrackTypeAudio)
+ return 0;
+
+ return (AudioTrack *)track;
+}
+
AVIDecoder::AVIVideoTrack::AVIVideoTrack(int frameCount, const AVIStreamHeader &streamHeader, const BitmapInfoHeader &bitmapInfoHeader, byte *initialPalette)
: _frameCount(frameCount), _vidsHeader(streamHeader), _bmInfo(bitmapInfoHeader), _initialPalette(initialPalette) {
_videoCodec = createCodec();
@@ -638,7 +730,7 @@ AVIDecoder::AVIVideoTrack::~AVIVideoTrack() {
void AVIDecoder::AVIVideoTrack::decodeFrame(Common::SeekableReadStream *stream) {
if (stream) {
if (_videoCodec)
- _lastFrame = _videoCodec->decodeImage(stream);
+ _lastFrame = _videoCodec->decodeFrame(*stream);
} else {
// Empty frame
_lastFrame = 0;
@@ -685,6 +777,15 @@ void AVIDecoder::AVIVideoTrack::useInitialPalette() {
}
}
+bool AVIDecoder::AVIVideoTrack::isTruemotion1() const {
+ return _bmInfo.compression == MKTAG('D', 'U', 'C', 'K') || _bmInfo.compression == MKTAG('d', 'u', 'c', 'k');
+}
+
+void AVIDecoder::AVIVideoTrack::forceDimensions(uint16 width, uint16 height) {
+ _bmInfo.width = width;
+ _bmInfo.height = height;
+}
+
bool AVIDecoder::AVIVideoTrack::rewind() {
_curFrame = -1;
@@ -696,31 +797,12 @@ bool AVIDecoder::AVIVideoTrack::rewind() {
return true;
}
-Codec *AVIDecoder::AVIVideoTrack::createCodec() {
- switch (_vidsHeader.streamHandler) {
- case ID_CRAM:
- case ID_MSVC:
- case ID_WHAM:
- return new MSVideo1Decoder(_bmInfo.width, _bmInfo.height, _bmInfo.bitCount);
- case ID_RLE:
- return new MSRLEDecoder(_bmInfo.width, _bmInfo.height, _bmInfo.bitCount);
- case ID_CVID:
- return new CinepakDecoder(_bmInfo.bitCount);
- case ID_IV32:
- return new Indeo3Decoder(_bmInfo.width, _bmInfo.height);
-#ifdef VIDEO_CODECS_TRUEMOTION1_H
- case ID_DUCK:
- return new TrueMotion1Decoder(_bmInfo.width, _bmInfo.height);
-#endif
-#ifdef USE_MPEG2
- case ID_MPG2:
- return new MPEGDecoder();
-#endif
- default:
- warning("Unknown/Unhandled compression format \'%s\'", tag2str(_vidsHeader.streamHandler));
- }
+Image::Codec *AVIDecoder::AVIVideoTrack::createCodec() {
+ return Image::createBitmapCodec(_bmInfo.compression, _bmInfo.width, _bmInfo.height, _bmInfo.bitCount);
+}
- return 0;
+void AVIDecoder::AVIVideoTrack::forceTrackEnd() {
+ _curFrame = _frameCount - 1;
}
AVIDecoder::AVIAudioTrack::AVIAudioTrack(const AVIStreamHeader &streamHeader, const PCMWaveFormat &waveFormat, Audio::Mixer::SoundType soundType)
@@ -751,6 +833,8 @@ void AVIDecoder::AVIAudioTrack::queueSound(Common::SeekableReadStream *stream) {
_audStream->queueAudioStream(Audio::makeADPCMStream(stream, DisposeAfterUse::YES, stream->size(), Audio::kADPCMMSIma, _wvInfo.samplesPerSec, _wvInfo.channels, _wvInfo.blockAlign), DisposeAfterUse::YES);
} else if (_wvInfo.tag == kWaveFormatDK3) {
_audStream->queueAudioStream(Audio::makeADPCMStream(stream, DisposeAfterUse::YES, stream->size(), Audio::kADPCMDK3, _wvInfo.samplesPerSec, _wvInfo.channels, _wvInfo.blockAlign), DisposeAfterUse::YES);
+ } else if (_wvInfo.tag == kWaveFormatMP3) {
+ warning("AVI: MP3 audio stream is not supported");
}
} else {
delete stream;
@@ -787,7 +871,7 @@ Audio::AudioStream *AVIDecoder::AVIAudioTrack::getAudioStream() const {
}
Audio::QueuingAudioStream *AVIDecoder::AVIAudioTrack::createAudioStream() {
- if (_wvInfo.tag == kWaveFormatPCM || _wvInfo.tag == kWaveFormatMSADPCM || _wvInfo.tag == kWaveFormatMSIMAADPCM || _wvInfo.tag == kWaveFormatDK3)
+ if (_wvInfo.tag == kWaveFormatPCM || _wvInfo.tag == kWaveFormatMSADPCM || _wvInfo.tag == kWaveFormatMSIMAADPCM || _wvInfo.tag == kWaveFormatDK3 || _wvInfo.tag == kWaveFormatMP3)
return Audio::makeQueuingAudioStream(_wvInfo.samplesPerSec, _wvInfo.channels == 2);
else if (_wvInfo.tag != kWaveFormatNone) // No sound
warning("Unsupported AVI audio format %d", _wvInfo.tag);
diff --git a/video/avi_decoder.h b/video/avi_decoder.h
index 80c11b1e09..4461e537c5 100644
--- a/video/avi_decoder.h
+++ b/video/avi_decoder.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -43,9 +43,11 @@ namespace Graphics {
struct PixelFormat;
}
-namespace Video {
-
+namespace Image {
class Codec;
+}
+
+namespace Video {
/**
* Decoder for AVI videos.
@@ -54,6 +56,7 @@ class Codec;
* - sci
* - sword1
* - sword2
+ * - zvision
*/
class AVIDecoder : public VideoDecoder {
public:
@@ -71,8 +74,11 @@ public:
bool isSeekable() const;
protected:
- void readNextPacket();
- bool seekIntern(const Audio::Timestamp &time);
+ // VideoDecoder API
+ void readNextPacket();
+ bool seekIntern(const Audio::Timestamp &time);
+ bool supportsAudioTrackSwitching() const { return true; }
+ AudioTrack *getAudioTrack(int index);
struct BitmapInfoHeader {
uint32 size;
@@ -165,6 +171,7 @@ protected:
~AVIVideoTrack();
void decodeFrame(Common::SeekableReadStream *stream);
+ void forceTrackEnd();
uint16 getWidth() const { return _bmInfo.width; }
uint16 getHeight() const { return _bmInfo.height; }
@@ -178,6 +185,9 @@ protected:
void loadPaletteFromChunk(Common::SeekableReadStream *chunk);
void useInitialPalette();
+ bool isTruemotion1() const;
+ void forceDimensions(uint16 width, uint16 height);
+
bool isRewindable() const { return true; }
bool rewind();
@@ -192,9 +202,9 @@ protected:
mutable bool _dirtyPalette;
int _frameCount, _curFrame;
- Codec *_videoCodec;
+ Image::Codec *_videoCodec;
const Graphics::Surface *_lastFrame;
- Codec *createCodec();
+ Image::Codec *createCodec();
};
class AVIAudioTrack : public AudioTrack {
@@ -219,6 +229,7 @@ protected:
kWaveFormatPCM = 1,
kWaveFormatMSADPCM = 2,
kWaveFormatMSIMAADPCM = 17,
+ kWaveFormatMP3 = 85,
kWaveFormatDK3 = 98 // rogue format number
};
@@ -229,13 +240,15 @@ protected:
Audio::QueuingAudioStream *createAudioStream();
};
- Common::Array<OldIndex> _indexEntries;
AVIHeader _header;
+ void readOldIndex(uint32 size);
+ Common::Array<OldIndex> _indexEntries;
+
Common::SeekableReadStream *_fileStream;
bool _decodedHeader;
bool _foundMovieList;
- uint32 _movieListStart;
+ uint32 _movieListStart, _movieListEnd;
Audio::Mixer::SoundType _soundType;
Common::Rational _frameRateOverride;
@@ -247,6 +260,8 @@ protected:
void handleStreamHeader(uint32 size);
uint16 getStreamType(uint32 tag) const { return tag & 0xFFFF; }
byte getStreamIndex(uint32 tag) const;
+ void forceVideoEnd();
+ void checkTruemotion1();
public:
virtual AVIAudioTrack *createAudioTrack(AVIStreamHeader sHeader, PCMWaveFormat wvInfo);
diff --git a/video/bink_decoder.cpp b/video/bink_decoder.cpp
index 45dec0887b..be4dc549a4 100644
--- a/video/bink_decoder.cpp
+++ b/video/bink_decoder.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -214,6 +214,16 @@ void BinkDecoder::readNextPacket() {
frame.bits = 0;
}
+VideoDecoder::AudioTrack *BinkDecoder::getAudioTrack(int index) {
+ // Bink audio track indexes are relative to the first audio track
+ Track *track = getTrack(index + 1);
+
+ if (!track || track->getTrackType() != Track::kTrackTypeAudio)
+ return 0;
+
+ return (AudioTrack *)track;
+}
+
BinkDecoder::VideoFrame::VideoFrame() : bits(0) {
}
diff --git a/video/bink_decoder.h b/video/bink_decoder.h
index 08800c2223..f0f9ae2b29 100644
--- a/video/bink_decoder.h
+++ b/video/bink_decoder.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -74,6 +74,8 @@ public:
protected:
void readNextPacket();
+ bool supportsAudioTrackSwitching() const { return true; }
+ AudioTrack *getAudioTrack(int index);
private:
static const int kAudioChannelsMax = 2;
diff --git a/video/binkdata.h b/video/binkdata.h
index 02105a7493..dc72f7eacd 100644
--- a/video/binkdata.h
+++ b/video/binkdata.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/video/coktel_decoder.cpp b/video/coktel_decoder.cpp
index 024e479bf7..21dda15cd0 100644
--- a/video/coktel_decoder.cpp
+++ b/video/coktel_decoder.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -31,8 +31,7 @@
#include "video/coktel_decoder.h"
-#include "video/codecs/codec.h"
-#include "video/codecs/indeo3.h"
+#include "image/codecs/indeo3.h"
#ifdef VIDEO_COKTELDECODER_H
@@ -1692,7 +1691,7 @@ bool VMDDecoder::openExternalCodec() {
if (_videoCodec == kVideoCodecIndeo3) {
_isPaletted = false;
- _codec = new Indeo3Decoder(_width, _height);
+ _codec = new Image::Indeo3Decoder(_width, _height);
} else {
warning("VMDDecoder::openExternalCodec(): Unknown video codec FourCC \"%s\"",
@@ -2263,7 +2262,7 @@ bool VMDDecoder::renderFrame(Common::Rect &rect) {
return false;
Common::MemoryReadStream frameStream(_videoBuffer[0], _videoBufferLen[0]);
- const Graphics::Surface *codecSurf = _codec->decodeImage(&frameStream);
+ const Graphics::Surface *codecSurf = _codec->decodeFrame(frameStream);
if (!codecSurf)
return false;
diff --git a/video/coktel_decoder.h b/video/coktel_decoder.h
index 91d52b65e6..a72f76eb9d 100644
--- a/video/coktel_decoder.h
+++ b/video/coktel_decoder.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -53,9 +53,11 @@ namespace Graphics {
struct PixelFormat;
}
-namespace Video {
-
+namespace Image {
class Codec;
+}
+
+namespace Video {
/**
* Decoder for Coktel videos.
@@ -516,7 +518,7 @@ private:
Graphics::Surface _8bppSurface[3]; ///< Fake 8bpp surfaces over the video buffers.
bool _externalCodec;
- Codec *_codec;
+ Image::Codec *_codec;
int32 _subtitle;
diff --git a/video/dxa_decoder.cpp b/video/dxa_decoder.cpp
index 27b1664b07..b61f842341 100644
--- a/video/dxa_decoder.cpp
+++ b/video/dxa_decoder.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/video/dxa_decoder.h b/video/dxa_decoder.h
index b3f2eca5e2..eef4462aa7 100644
--- a/video/dxa_decoder.h
+++ b/video/dxa_decoder.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/video/flic_decoder.cpp b/video/flic_decoder.cpp
index 317dc14691..994f47cea8 100644
--- a/video/flic_decoder.cpp
+++ b/video/flic_decoder.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -176,7 +176,7 @@ const Graphics::Surface *FlicDecoder::FlicVideoTrack::decodeNextFrame() {
uint16 newWidth = _fileStream->readUint16LE();
uint16 newHeight = _fileStream->readUint16LE();
- if ((newWidth != 0) && (newHeight != 0)) {
+ if ((newWidth != 0) || (newHeight != 0)) {
if (newWidth == 0)
newWidth = _surface->w;
if (newHeight == 0)
diff --git a/video/flic_decoder.h b/video/flic_decoder.h
index c20a092a32..1769e1ed2e 100644
--- a/video/flic_decoder.h
+++ b/video/flic_decoder.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/video/module.mk b/video/module.mk
index a491947aaf..5754350e42 100644
--- a/video/module.mk
+++ b/video/module.mk
@@ -8,18 +8,7 @@ MODULE_OBJS := \
psx_decoder.o \
qt_decoder.o \
smk_decoder.o \
- video_decoder.o \
- codecs/cdtoons.o \
- codecs/cinepak.o \
- codecs/indeo3.o \
- codecs/mjpeg.o \
- codecs/msrle.o \
- codecs/msvideo1.o \
- codecs/qtrle.o \
- codecs/rpza.o \
- codecs/smc.o \
- codecs/svq1.o \
- codecs/truemotion1.o
+ video_decoder.o
ifdef USE_BINK
MODULE_OBJS += \
@@ -31,10 +20,5 @@ MODULE_OBJS += \
theora_decoder.o
endif
-ifdef USE_MPEG2
-MODULE_OBJS += \
- codecs/mpeg.o
-endif
-
# Include common rules
include $(srcdir)/rules.mk
diff --git a/video/psx_decoder.cpp b/video/psx_decoder.cpp
index fd45005770..91f8e1dafc 100644
--- a/video/psx_decoder.cpp
+++ b/video/psx_decoder.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/video/psx_decoder.h b/video/psx_decoder.h
index d1d5204e37..2d70123b71 100644
--- a/video/psx_decoder.h
+++ b/video/psx_decoder.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/video/qt_decoder.cpp b/video/qt_decoder.cpp
index 7539d4a1e2..0a29692948 100644
--- a/video/qt_decoder.cpp
+++ b/video/qt_decoder.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -39,13 +39,7 @@
#include "common/util.h"
// Video codecs
-#include "video/codecs/cinepak.h"
-#include "video/codecs/mjpeg.h"
-#include "video/codecs/qtrle.h"
-#include "video/codecs/rpza.h"
-#include "video/codecs/smc.h"
-#include "video/codecs/cdtoons.h"
-#include "video/codecs/svq1.h"
+#include "image/codecs/codec.h"
namespace Video {
@@ -270,42 +264,7 @@ QuickTimeDecoder::VideoSampleDesc::~VideoSampleDesc() {
}
void QuickTimeDecoder::VideoSampleDesc::initCodec() {
- switch (_codecTag) {
- case MKTAG('c','v','i','d'):
- // Cinepak: As used by most Myst and all Riven videos as well as some Myst ME videos. "The Chief" videos also use this.
- _videoCodec = new CinepakDecoder(_bitsPerSample & 0x1f);
- break;
- case MKTAG('r','p','z','a'):
- // Apple Video ("Road Pizza"): Used by some Myst videos.
- _videoCodec = new RPZADecoder(_parentTrack->width, _parentTrack->height);
- break;
- case MKTAG('r','l','e',' '):
- // QuickTime RLE: Used by some Myst ME videos.
- _videoCodec = new QTRLEDecoder(_parentTrack->width, _parentTrack->height, _bitsPerSample & 0x1f);
- break;
- case MKTAG('s','m','c',' '):
- // Apple SMC: Used by some Myst videos.
- _videoCodec = new SMCDecoder(_parentTrack->width, _parentTrack->height);
- break;
- case MKTAG('S','V','Q','1'):
- // Sorenson Video 1: Used by some Myst ME videos.
- _videoCodec = new SVQ1Decoder(_parentTrack->width, _parentTrack->height);
- break;
- case MKTAG('S','V','Q','3'):
- // Sorenson Video 3: Used by some Myst ME videos.
- warning("Sorenson Video 3 not yet supported");
- break;
- case MKTAG('j','p','e','g'):
- // Motion JPEG: Used by some Myst ME 10th Anniversary videos.
- _videoCodec = new JPEGDecoder();
- break;
- case MKTAG('Q','k','B','k'):
- // CDToons: Used by most of the Broderbund games.
- _videoCodec = new CDToonsDecoder(_parentTrack->width, _parentTrack->height);
- break;
- default:
- warning("Unsupported codec \'%s\'", tag2str(_codecTag));
- }
+ _videoCodec = Image::createQuickTimeCodec(_codecTag, _parentTrack->width, _parentTrack->height, _bitsPerSample & 0x1f);
}
QuickTimeDecoder::AudioTrackHandler::AudioTrackHandler(QuickTimeDecoder *decoder, QuickTimeAudioTrack *audioTrack)
@@ -725,7 +684,7 @@ const Graphics::Surface *QuickTimeDecoder::VideoTrackHandler::bufferNextFrame()
return 0;
}
- const Graphics::Surface *frame = entry->_videoCodec->decodeImage(frameData);
+ const Graphics::Surface *frame = entry->_videoCodec->decodeFrame(*frameData);
delete frameData;
// Update the palette
diff --git a/video/qt_decoder.h b/video/qt_decoder.h
index 28314f2e63..7e87d21ae7 100644
--- a/video/qt_decoder.h
+++ b/video/qt_decoder.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -44,9 +44,11 @@ namespace Graphics {
struct PixelFormat;
}
-namespace Video {
-
+namespace Image {
class Codec;
+}
+
+namespace Video {
/**
* Decoder for QuickTime videos.
@@ -95,7 +97,7 @@ private:
char _codecName[32];
uint16 _colorTableId;
byte *_palette;
- Codec *_videoCodec;
+ Image::Codec *_videoCodec;
};
// The AudioTrackHandler is currently just a wrapper around some
diff --git a/video/smk_decoder.cpp b/video/smk_decoder.cpp
index 3dbcebcde4..ee7a4ce689 100644
--- a/video/smk_decoder.cpp
+++ b/video/smk_decoder.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -369,8 +369,7 @@ bool SmackerDecoder::loadStream(Common::SeekableReadStream *stream) {
if (_header.audioInfo[i].compression == kCompressionRDFT || _header.audioInfo[i].compression == kCompressionDCT)
warning("Unhandled Smacker v2 audio compression");
- if (i == 0)
- addTrack(new SmackerAudioTrack(_header.audioInfo[i], _soundType));
+ addTrack(new SmackerAudioTrack(_header.audioInfo[i], _soundType));
}
}
@@ -477,7 +476,10 @@ void SmackerDecoder::readNextPacket() {
}
void SmackerDecoder::handleAudioTrack(byte track, uint32 chunkSize, uint32 unpackedSize) {
- if (_header.audioInfo[track].hasAudio && chunkSize > 0 && track == 0) {
+ if (chunkSize == 0)
+ return;
+
+ if (_header.audioInfo[track].hasAudio) {
// Get the audio track, which start at offset 1 (first track is video)
SmackerAudioTrack *audioTrack = (SmackerAudioTrack *)getTrack(track + 1);
@@ -501,14 +503,21 @@ void SmackerDecoder::handleAudioTrack(byte track, uint32 chunkSize, uint32 unpac
audioTrack->queuePCM(soundBuffer, chunkSize);
}
} else {
- // Ignore the rest of the audio tracks, if they exist
- // TODO: Are there any Smacker videos with more than one audio stream?
- // If yes, we should play the rest of the audio streams as well
- if (chunkSize > 0)
- _fileStream->skip(chunkSize);
+ // Ignore possibly unused data
+ _fileStream->skip(chunkSize);
}
}
+VideoDecoder::AudioTrack *SmackerDecoder::getAudioTrack(int index) {
+ // Smacker audio track indexes are relative to the first audio track
+ Track *track = getTrack(index + 1);
+
+ if (!track || track->getTrackType() != Track::kTrackTypeAudio)
+ return 0;
+
+ return (AudioTrack *)track;
+}
+
SmackerDecoder::SmackerVideoTrack::SmackerVideoTrack(uint32 width, uint32 height, uint32 frameCount, const Common::Rational &frameRate, uint32 flags, uint32 signature) {
_surface = new Graphics::Surface();
_surface->create(width, height * (flags ? 2 : 1), Graphics::PixelFormat::createFormatCLUT8());
@@ -726,16 +735,15 @@ void SmackerDecoder::SmackerVideoTrack::unpackPalette(Common::SeekableReadStream
} else { // top 2 bits are 00
sz++;
// get the lower 6 bits for each component (0x3f = 00111111)
- byte b = b0 & 0x3f;
+ byte r = b0 & 0x3f;
byte g = (*p++) & 0x3f;
- byte r = (*p++) & 0x3f;
-
- assert(g < 0xc0 && b < 0xc0);
+ byte b = (*p++) & 0x3f;
- // upscale to full 8-bit color values by multiplying by 4
- *pal++ = b * 4;
- *pal++ = g * 4;
- *pal++ = r * 4;
+ // upscale to full 8-bit color values. The Multimedia Wiki suggests
+ // a lookup table for this, but this should produce the same result.
+ *pal++ = (r * 4 + r / 16);
+ *pal++ = (g * 4 + g / 16);
+ *pal++ = (b * 4 + b / 16);
}
}
diff --git a/video/smk_decoder.h b/video/smk_decoder.h
index e4bc9bab42..e4f6a52310 100644
--- a/video/smk_decoder.h
+++ b/video/smk_decoder.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -69,6 +69,8 @@ public:
protected:
void readNextPacket();
+ bool supportsAudioTrackSwitching() const { return true; }
+ AudioTrack *getAudioTrack(int index);
virtual void handleAudioTrack(byte track, uint32 chunkSize, uint32 unpackedSize);
diff --git a/video/theora_decoder.cpp b/video/theora_decoder.cpp
index a0ee0a36b4..cb6289bd60 100644
--- a/video/theora_decoder.cpp
+++ b/video/theora_decoder.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/video/theora_decoder.h b/video/theora_decoder.h
index ac808cdfe6..b85388426b 100644
--- a/video/theora_decoder.h
+++ b/video/theora_decoder.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
diff --git a/video/video_decoder.cpp b/video/video_decoder.cpp
index 0ab1478727..c6171c4450 100644
--- a/video/video_decoder.cpp
+++ b/video/video_decoder.cpp
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -46,6 +46,7 @@ VideoDecoder::VideoDecoder() {
_endTime = 0;
_endTimeSet = false;
_nextVideoTrack = 0;
+ _mainAudioTrack = 0;
// Find the best format for output
_defaultHighColorFormat = g_system->getScreenFormat();
@@ -75,6 +76,7 @@ void VideoDecoder::close() {
_endTime = 0;
_endTimeSet = false;
_nextVideoTrack = 0;
+ _mainAudioTrack = 0;
}
bool VideoDecoder::loadFile(const Common::String &filename) {
@@ -553,6 +555,9 @@ Audio::Timestamp VideoDecoder::FixedRateVideoTrack::getDuration() const {
return getFrameTime(getFrameCount());
}
+VideoDecoder::AudioTrack::AudioTrack() : _volume(Audio::Mixer::kMaxChannelVolume), _balance(0), _muted(false) {
+}
+
bool VideoDecoder::AudioTrack::endOfTrack() const {
Audio::AudioStream *stream = getAudioStream();
return !stream || !g_system->getMixer()->isSoundHandleActive(_handle) || stream->endOfData();
@@ -562,7 +567,7 @@ void VideoDecoder::AudioTrack::setVolume(byte volume) {
_volume = volume;
if (g_system->getMixer()->isSoundHandleActive(_handle))
- g_system->getMixer()->setChannelVolume(_handle, _volume);
+ g_system->getMixer()->setChannelVolume(_handle, _muted ? 0 : _volume);
}
void VideoDecoder::AudioTrack::setBalance(int8 balance) {
@@ -578,7 +583,7 @@ void VideoDecoder::AudioTrack::start() {
Audio::AudioStream *stream = getAudioStream();
assert(stream);
- g_system->getMixer()->playStream(getSoundType(), &_handle, stream, -1, getVolume(), getBalance(), DisposeAfterUse::NO);
+ g_system->getMixer()->playStream(getSoundType(), &_handle, stream, -1, _muted ? 0 : getVolume(), getBalance(), DisposeAfterUse::NO);
// Pause the audio again if we're still paused
if (isPaused())
@@ -597,7 +602,7 @@ void VideoDecoder::AudioTrack::start(const Audio::Timestamp &limit) {
stream = Audio::makeLimitingAudioStream(stream, limit, DisposeAfterUse::NO);
- g_system->getMixer()->playStream(getSoundType(), &_handle, stream, -1, getVolume(), getBalance(), DisposeAfterUse::YES);
+ g_system->getMixer()->playStream(getSoundType(), &_handle, stream, -1, _muted ? 0 : getVolume(), getBalance(), DisposeAfterUse::YES);
// Pause the audio again if we're still paused
if (isPaused())
@@ -611,6 +616,16 @@ uint32 VideoDecoder::AudioTrack::getRunningTime() const {
return 0;
}
+void VideoDecoder::AudioTrack::setMute(bool mute) {
+ // Update the mute settings, if required
+ if (_muted != mute) {
+ _muted = mute;
+
+ if (g_system->getMixer()->isSoundHandleActive(_handle))
+ g_system->getMixer()->setChannelVolume(_handle, mute ? 0 : _volume);
+ }
+}
+
void VideoDecoder::AudioTrack::pauseIntern(bool shouldPause) {
if (g_system->getMixer()->isSoundHandleActive(_handle))
g_system->getMixer()->pauseHandle(_handle, shouldPause);
@@ -669,6 +684,17 @@ void VideoDecoder::addTrack(Track *track, bool isExternal) {
// Update volume settings if it's an audio track
((AudioTrack *)track)->setVolume(_audioVolume);
((AudioTrack *)track)->setBalance(_audioBalance);
+
+ if (!isExternal && supportsAudioTrackSwitching()) {
+ if (_mainAudioTrack) {
+ // The main audio track has already been found
+ ((AudioTrack *)track)->setMute(true);
+ } else {
+ // First audio track found -> now the main one
+ _mainAudioTrack = (AudioTrack *)track;
+ _mainAudioTrack->setMute(false);
+ }
+ }
} else if (track->getTrackType() == Track::kTrackTypeVideo) {
// If this track has a better time, update _nextVideoTrack
if (!_nextVideoTrack || ((VideoTrack *)track)->getNextFrameStartTime() < _nextVideoTrack->getNextFrameStartTime())
@@ -701,6 +727,34 @@ bool VideoDecoder::addStreamFileTrack(const Common::String &baseName) {
return result;
}
+bool VideoDecoder::setAudioTrack(int index) {
+ if (!supportsAudioTrackSwitching())
+ return false;
+
+ AudioTrack *audioTrack = getAudioTrack(index);
+
+ if (!audioTrack)
+ return false;
+
+ if (_mainAudioTrack == audioTrack)
+ return true;
+
+ _mainAudioTrack->setMute(true);
+ audioTrack->setMute(false);
+ _mainAudioTrack = audioTrack;
+ return true;
+}
+
+uint VideoDecoder::getAudioTrackCount() const {
+ uint count = 0;
+
+ for (TrackList::const_iterator it = _internalTracks.begin(); it != _internalTracks.end(); it++)
+ if ((*it)->getTrackType() == Track::kTrackTypeAudio)
+ count++;
+
+ return count;
+}
+
void VideoDecoder::setEndTime(const Audio::Timestamp &endTime) {
Audio::Timestamp startTime = 0;
diff --git a/video/video_decoder.h b/video/video_decoder.h
index ac6586d8dd..2faec0fb3e 100644
--- a/video/video_decoder.h
+++ b/video/video_decoder.h
@@ -8,12 +8,12 @@
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -407,6 +407,21 @@ public:
*/
bool addStreamFileTrack(const Common::String &baseName);
+ /**
+ * Set the internal audio track.
+ *
+ * Has no effect if the container does not support this.
+ * @see supportsAudioTrackSwitching()
+ *
+ * @param index The index of the track, whose meaning is dependent on the container
+ */
+ bool setAudioTrack(int index);
+
+ /**
+ * Get the number of internal audio tracks.
+ */
+ uint getAudioTrackCount() const;
+
protected:
/**
* An abstract representation of a track in a movie. Since tracks here are designed
@@ -612,7 +627,7 @@ protected:
*/
class AudioTrack : public Track {
public:
- AudioTrack() {}
+ AudioTrack();
virtual ~AudioTrack() {}
TrackType getTrackType() const { return kTrackTypeAudio; }
@@ -662,6 +677,11 @@ protected:
*/
virtual Audio::Mixer::SoundType getSoundType() const { return Audio::Mixer::kPlainSoundType; }
+ /**
+ * Mute the track
+ */
+ void setMute(bool mute);
+
protected:
void pauseIntern(bool shouldPause);
@@ -674,6 +694,7 @@ protected:
Audio::SoundHandle _handle;
byte _volume;
int8 _balance;
+ bool _muted;
};
/**
@@ -833,6 +854,25 @@ protected:
*/
virtual bool seekIntern(const Audio::Timestamp &time);
+ /**
+ * Does this video format support switching between audio tracks?
+ *
+ * Returning true implies this format supports multiple audio tracks,
+ * can switch tracks, and defaults to playing the first found audio
+ * track.
+ */
+ virtual bool supportsAudioTrackSwitching() const { return false; }
+
+ /**
+ * Get the audio track for the given index.
+ *
+ * This is used only if supportsAudioTrackSwitching() returns true.
+ *
+ * @param index The index of the track, whose meaning is dependent on the container
+ * @return The audio track for the index, or 0 if not found
+ */
+ virtual AudioTrack *getAudioTrack(int index) { return 0; }
+
private:
// Tracks owned by this VideoDecoder
TrackList _tracks;
@@ -865,6 +905,8 @@ private:
uint32 _pauseStartTime;
byte _audioVolume;
int8 _audioBalance;
+
+ AudioTrack *_mainAudioTrack;
};
} // End of namespace Video